ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI2YzMyLi4wMDAwMDAwCi0tLSBhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0qLWFsbAotKi1jbwotKi1kaXJzCi0qLWRvbmUKLSotaW5zdGFsbC1pbmZvCi0qLXNyYwotKi1zdGFtcC0qCi0qLXRhZ2dlZAotYmxvY2tpdAotY2ZnLXBhcGVyLmluZm8KLWNvbmZpZy5zdGF0dXMKLWNvbmZpZ3VyZS5hdXgKLWNvbmZpZ3VyZS5jcAotY29uZmlndXJlLmNwcwotY29uZmlndXJlLmR2aQotY29uZmlndXJlLmZuCi1jb25maWd1cmUuZm5zCi1jb25maWd1cmUua3kKLWNvbmZpZ3VyZS5reXMKLWNvbmZpZ3VyZS5sb2cKLWNvbmZpZ3VyZS5wZwotY29uZmlndXJlLnBncwotY29uZmlndXJlLnRvYwotY29uZmlndXJlLnRwCi1jb25maWd1cmUudHBzCi1jb25maWd1cmUudnIKLWNvbmZpZ3VyZS52cnMKLWRpci5pbmZvCi1NYWtlZmlsZQotbG9zdCtmb3VuZApkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL0NPUFlJTkcuTElCIGIvQ09QWUlORy5MSUIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWEzZDEuLjAwMDAwMDAKLS0tIGEvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgIE1BIDAyMTExLTEzMDcsIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhODEyMi4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw2NzEyICswLDAgQEAKLTIwMDAtMDMtMjkgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IC1saW51eC1nbnUqLCBub3QgLWxpbnV4LWdudS4KLQotMjAwMC0wMy0xMCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IEJhY2tlZCBvdXQgdGhlIGxhc3QgY2hhbmdlLgotCi0yMDAwLTAzLTEwICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogUnVuIGxkL2xkLW5ldyBpZiBuZWNlc3NhcnkuCi0KLUZyaSBNYXIgIDMgMTg6NDQ6MDggMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogU2V0IFBBQ0tBR0UgdG8gVE9PTCB3aGVuIG5vdCBkZWZpbmVkLgotCShkby10YXItYnoyKTogUmVwbGFjZSBUT09MIHdpdGggUEFDS0FHRS4KLQkoZ2RiLnRhci5iejIpOiBSZW1vdmUgR0RCVEsgZnJvbSBHREIgcGFja2FnZS4KLQkoZ2RiK2RlamFnbnUudGFyLmJ6MiwgaW5zaWdodC50YXIuYnoyLCBpbnNpZ2h0K2RlamFnbnUudGFyLmJ6MiwKLSAJZGVqYWdudS50YXIuYnoyKTogTmV3IHBhY2thZ2VzLgotCi0yMDAwLTAyLTI3ICBBbmRyZWFzIEphZWdlciAgPGFqQHN1c2UuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGVudHJ5IGZvciBtaXBzKi0qLWxpbnV4KiwgbW92ZSBjYXRjaCBhbGwKLQkqLSotKmxpbnV4KiBlbnRyeSBiZWxvdyB0aGlzIG9uZS4KLQotMjAwMC0wMi0yNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMy40LgotCi0yMDAwLTAyLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBTdXBwb3J0IGFuIE9TIG9mICJ3aW5jZSIuCi0KLVRodSBGZWIgMjQgMTY6MTU6NTYgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWI6IFVwZGF0ZWQgdG8gbWF0Y2ggY29uZmlnJ3MgMjAwMC0wMi0xNQotIAl2ZXJzaW9uLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBMaW51eC9JQk0gMzcwLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotMjAwMC0wMi0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbWlwcy1wZSwgc2gtcGUgYW5kIGFybS13aW5jZS1wZSB0YXJnZXRzLgotCi0yMDAwLTAyLTIwICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IEd1ZXNzICJjeWd3aW4iIHJhdGhlciB0aGFuICJjeWd3aW4zMiIuCi0KLTIwMDAtMDItMTYgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY29uZmlndXJlIChnY2NfdmVyc2lvbik6IFdoZW4gc2V0dGluZywgbmFycm93IHNlYXJjaCB0bwotCWxpbmVzIGNvbnRhaW5pbmcgYHZlcnNpb25fc3RyaW5nJy4KLQotMjAwMC0wMS0wNiAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtdC1haXg0MyB0byBoYW5kbGUgKl9UQVJHRVQgZGVmcywKLQlub3QgbWgtYWl4NDMuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIGZvciBwai4KLQotMTk5OS0wOC0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3IgY29uZmlndXJpbmcgZm9yIGZyMzAuCi0KLTE5OTktMDgtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gbm90IGNvbmZpZ3VyZSBvciBidWlsZCBsZCBmb3IgQUlYCi0JcGxhdGZvcm1zLiAgbGQgaXMga25vd24gdG8gYmUgYnJva2VuIG9uIHRoZXNlIHBsYXRmb3Jtcy4KLQotMTk5OS0wOC0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChMREZMQUdTKTogRGVmaW5lLgotCi0xOTk5LTA4LTA4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NTZdLSotbWluZ3czMiopOiBEb24ndCBwdXQgZ3Byb2YgaW4KLQlub2NvbmZpZ2RpcnMuCi0JKCotKi1jeWd3aW4qKTogTGlrZXdpc2UuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBta2RlcDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoR0FTX1NVUFBPUlRfRElSUyk6IEFkZCBta2RlcC4KLQkoQklOVVRJTFNfU1VQUE9SVF9ESVJTKTogQWRkIG1rZGVwLgotCi0JRnJvbSBFbGkgWmFyZXRza2lpIDxlbGl6QGlzLmVsdGEuY28uaWw+OgotCSogY29uZmlndXJlICh0bXBmaWxlKTogQ2hhbmdlIGNPTmYkJCB0byBjTmYkJCB0byBhdm9pZCBhbiBvdmVybHkKLQlsb25nIGZpbGUgbmFtZSB3aGVuIHVzaW5nIERKR1BQIG9uIE1TLURPUy4KLQotMTk5OS0wNy0zMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2stdGFyZ2V0LWxpYmlvKTogUmVtb3ZlIGFsbC10YXJnZXQtbGlic3RkYysrCi0JZGVwZW5kZW5jeSBhcyB0aGlzIGNhdXNlcyAibWFrZSBjaGVjayIgdG8gZ2xvYmFsbHkgIm1ha2UgYWxsIgotCi0xOTk5LTA3LTIyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJpbnV0aWxzLnRhci5iejIpOiBEb24ndCBwYXNzIG1ha2VhbGwuYmF0IGFuZAotCWNvbmZpZ3VyZS5iYXQgaW4gU1VQUE9SVF9GSUxFUy4KLQkoZ2FzK2JpbnV0aWxzLnRhci5iejIpOiBMaWtld2lzZS4KLQotCSogbWFrZWFsbC5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBNYXJrIEVsYnJlY2h0OgotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQWRkIC1XIC1XYWxsIHRvIHRoZSBkZWZhdWx0IENGTEFHUyB3aGVuIGNvbXBpbGluZyB3aXRoCi0JZ2NjLgotCi1UaHUgSnVsICA4IDEyOjMyOjIzIDE5OTkgIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsZCwgYmludXRpbHMgJiBnYXMgZm9yIGhwcGEqLSotbGludXgtZ251Ki4KLQotMTk5OS0wNi0zMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsZCBvbiBJUklYNi4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgZGlzdHJpYnV0aW9uIHRhcmdldHMgdG8gdXNlIGJ6aXAyIGluc3RlYWQgb2YKLQlnemlwLgotCShURVhJTkZPX1NVUFBPUlQpOiBTZXQgdG8ganVzdCB0ZXhpbmZvL3RleGluZm8udGV4LgotCSh0YXopOiBEb24ndCB1c2UgdGV4aW5mby9ncGwudGV4aW5mbyBvciB0ZXhpbmZvL2xncGwudGV4aW5mby4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIG1jb3JlIHRhcmdldC4KLQotU3VuIE1heSAzMCAxNjowMzoxNiAxOTk5ICBDb3J0IERvdWdhbiAgPGNvcnRAY3Mubm10LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzIChwcGMtKi1saW51eC1nbnUpOiBBbHNvIHVzZSBsZCBlbXVsIGVsZjMycHBjbGludXguCi0KLTE5OTktMDUtMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IEVHQ1MgdmVyc2lvbi4KLQotMTk5OS0wNC0zMCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IFttb2RlIGxpbmtdIEFsd2F5cyB1c2UgQ0MgZ2l2ZW4gYnkgbHRjb25maWcuCi0KLTE5OTktMDQtMjMgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yZi4KLQotMTk5OS0wNC0yMCAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBsaWJzdHViIGZvciBhcm0tZWxmIHRhcmdldHMuCi0JKG5vY29uZmlnZGlycyk6IERvbid0IGJ1aWxkIGFueSBic3Agc3R1ZmYgZm9yIGZvciBhcm0tb2FiaSB0YXJnZXRzLgotCUJhZCBtZXJnZSByZW1vdmVkIHRoZXNlIHR3byBjaGFuZ2VzLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGk/ODYtKi1iZW9zKik6IERvIGNvbmZpZyBncGVyZjsgZG9uJ3QgY29uZmlnCi0JZ2RiLCBuZXdsaWIsIG9yIGxpYmdsb3NzLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUgdGFyZ2V0cy4KLQotMTk5OS0wNC0wNyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qKTogVXNlIGNvbmZpZy9tdC1kMzB2IGFzIG1ha2VmaWxlIGZyYWdtZW50LAotCW5vdCBtdC1vc3BhY2UsIGluIG9yZGVyIHRvIHNodXQgdXAgYXNzZW1ibGVyIHdhcm5pbmcgYWJvdXQgdXNpbmcKLQlzeW1ib2xzIHRoYXQgYXJlIG5hbWVkIHRoZSBzYW1lIGFzIHJlZ2lzdGVycy4KLQotMTk5OS0wNC0wNyAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtY3lnbW9uKTogQWRkZWQgYWxsLXRhcmdldC1ic3AgdG8gdGhlCi0JZGVwZW5kZW5jeSBsaXN0IGZvciBhbGwtdGFyZ2V0LWN5Z21vbi4KLQotMTk5OS0wNC0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IENoZWNrICRob3N0LCBub3QgJHRhcmdldCwgZm9yIHNlbGVjdGl2ZSBtdWx0aWxpYnMuCi0JKGFybS0qLSopOiBBbGxvdyBkaXNhYmxpbmcgb2YgYmllbmRpYW4sIGgvdyBmcCwgMjYgYml0IGFwY3MsCi0JdGh1bWIgaW50ZXJ3b3JraW5nLCBhbmQgdW5kZXJzY29yZSBwcmVmaXggbXVsdGlsaWJzLgotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbWlzc2luZzogVXBkYXRlIHRvIHZlcnNpb24gZnJvbSBjdXJyZW50IGF1dG9tYWtlLgotCi1GcmkgQXByICAyIDE1OjExOjMyIDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBSZW1vdmVkLgotCi0JKiBjb25maWd1cmUuaW4gKGd4eF9pbmNsdWRlX2Rpcik6IEhhbmRsZSBpdC4KLQkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotMTk5OS0wMy0yOSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKG1pcHM2NHZyNDExMSxtaXBzNjR2cjQxMTFlbCkgQWRkLgotCi0xOTk5LTAzLTIxICBCZW4gRWxsaXN0b24gIDxiamVAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy5ndWVzczogQ29ycmVjdCB0eXBvIGZvciBkZXRlY3RpbmcgRUxGIG9uIEZyZWVCU0QuCi0KLVRodSBNYXIgMTggMDA6MTc6NTAgMTk5OSAgTWFyayBFbGJyZWNodCA8c25vd2JhbGwzQHVzYS5uZXQ+Ci0KLQkqIGNvbmZpZy9taC1nbzMyOiBEZWxldGUuCi0JKiBjb25maWcvbWgtZGpncHA6IE5ldy4gUmVuYW1lZCBmcm9tIG1oLWdvMzIuCi0JKiBjb25maWd1cmUuaW4gKHBjLW1zZG9zZGpncHApOiBTZXQgaG9zdF9tYWtlZmlsZV9mcmFnIHRvCi0JY29uZmlnL21oLWRqZ3BwLgotCi1UaHUgTWFyIDExIDE4OjM3OjIzIDE5OTkgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWJzcCk6IEFkZGVkIGFsbC1nY2MgYWxsLWJpbnV0aWxzIGFuZAotCWFsbC10YXJnZXQtbmV3bGliIHRvIGRlcGVuZGVuY3kgbGlzdCBmb3IgYWxsLXRhcmdldC1ic3AuCi0KLVRodSBNYXIgMTEgMDE6MTk6MzEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBpMzg2LXV3aW4gc3VwcG9ydC4KLQkqIGNvbmZpZy5ndWVzczogTGlrZXdpc2UuCi0KLVRodSBNYXIgMTEgMDE6MDc6NTUgMTk5OSAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogY2xlYW51cCwgYWRkIG1oLSpwaWMgaGFuZGxpbmcgZm9yIGFybSwgc3BlY2lhbAotCWNhc2UgcG93ZXJwYyotKi1haXgqCi0KLVdlZCBNYXIgMTAgMTg6MzU6MDcgMTk5OSAgSmVmZiBKb2huc3RvbiAgPGpqb2huc3RuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogUmVtb3ZlZCB0YXJnZXQtbGliZ2xvc3Mgc28gbGlibm9zeXMuYQotCWNhbiBiZSBidWlsdC4KLQotV2VkIE1hciAxMCAxNzozOTowOSAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGJzcCBzdXBwb3J0IHRvIGFybS0qLWNvZmYgYW5kIGFybS0qLWVsZgotIAl0YXJnZXRzLgotCi0xOTk5LTAzLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZW5hbWUgQ1lHTlVTIExPQ0FMIHRvIEVHQ1MgTE9DQUwKLQotU3VuIEZlYiAyOCAwMjoyMDowMCAxOTk5ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBDaGVjayBmb3IgImN5Z3dpbioiIHJhdGhlciB0aGFuICJjeWd3aW4zMioiCi0KLTE5OTktMDItMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEZpeCB0eXBvIGluIGFybSByZWNvZ25pdGlvbi4KLQotV2VkIEZlYiAyNCAxMzo1MTo0MCAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IENoYW5nZWQgdGFyZ2V0X2NvbmZpZ2RpcnMgdG8KLQlpbmNsdWRlIHRhcmdldC1ic3Agb25seSBmb3IgbTY4ay0qLWVsZiogYW5kIG02OGstKi1jb2ZmKgotCXJhdGhlciB0aGFuIG02OGstKi0qIHNpbmNlIGl0IGlzIG5vdCBrbm93biB0byB3b3JrIG9uCi0JbTY4ay1hb3V0LiBEaXR0byBmb3IgYXJtLSotKm9hYmkuCi0KLVdlZCBGZWIgMjQgMTI6NTI6MTcgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi13aW5kb3dzKik6IFJlbW92ZSwgbm8gbG9uZ2VyIHVzZWQuCi0JKiBjb25maWcvbWgtd2luZG93czogRGl0dG8uCi0KLTE5OTktMDItMTkgIEJlbiBFbGxpc3RvbiA8YmplQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogQXV0b21hdGljYWxseSByZWNvZ25pc2UgRUxGIG9uIEZyZWVCU0QuIEZyb20gTmlhbGwKLQlTbWFydCBhbmQgaW1wcm92ZWQgYnkgQW5kcmV3IENhZ25leS4KLQotVGh1IEZlYiAxOCAxOTo1NTowOSAxOTk5ICBNYXJjIEVzcGllIDxlc3BpZUBjdnMub3BlbmJzZC5vcmc+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG9wZW5ic2QtKi1ocHBhLgotCi1XZWQgRmViIDE3IDAxOjM4OjU5IDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogTWFrZWZpbGUuaW4gKFJFQUxMWV9TRVRfTElCX1BBVEgpOiBBcHBlbmQgJCQkKFJQQVRIX0VOVlZBUikKLQlvbmx5IGlmIGl0IGlzIG5vdCBlbXB0eS4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIGZyb206IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCQotCSogY29uZmlnLmd1ZXNzOiBNb2RpZmllZCB0byByZWNvZ25pemUgdW5hbWUncyBhcm12KiBzeW50YXguCi0KLQkqIGNvbmZpZy5zdWI6IE1vZGlmaWVkIHRvIHJlY29nbml6ZSB1bmFtZSdzIGFybXYqIHN5bnRheC4KLQotMTk5OS0wMi0xNyAgTWFyayBTYWx0ZXIgIDxtc2FsdGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgdGFyZ2V0LWJzcCBmb3Igc3BhcmNsaXRlLgotCi1Nb24gRmViICA4IDE0OjE3OjI0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBhbHBoYXBjYTVbNjddIGFuZCB1cCB0byBhbHBoYWV2OC4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3Igc3Ryb25nYXJtIHBvcnQuCi0JKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3Igc3Ryb25nYXJtIHRhcmdldC4KLQotU3VuIEZlYiAgNyAxODowMTo1NCAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQkKLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWN5Z3dpbjMyKik6IFVzZSBjb25maWcvbWgtY3lnd2luIGluc3RlYWQgb2YKLQl0aGUgb2xkIG5hbWUgY29uZmlnL21oLWN5Z3dpbjMyLgotCUVuYWJsZSB0ZXhpbmZvLgotCi1UaHUgRmViICA0IDIwOjQzOjI1IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEbyBidWlsZCBsZCBmb3IgaXg4NiBTb2xhcmlzLgotCi1UdWUgRmViICAyIDE5OjQ2OjQwIDE5OTkgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6ICBTZXQgQVIgdG8gJEFSIGluc3RlYWQgb2YKLQkkQVJfRk9SX1RBUkdFVC4gIExpa2V3aXNlIGZvciBSQU5MSUIuCi0KLVR1ZSBGZWIgIDIgMjA6MDU6MDUgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnLnN1YiAob2FiaSk6ICBSZWNvZ25pemUuCi0gICAgICAgICogY29uZmlndXJlLmluIChhcm0tKi1vYWJpKTogIEhhbmRsZS4KLQotU2F0IEphbiAzMCAwNjowOTowMCAxOTk5ICBSb2JlcnQgTGlwZSAgKHJvYmVydGxpcGVAdXNhLm5ldCkKLQotCSogY29uZmlnLmd1ZXNzOiBJbXByb3ZlIGRldGVjdGlvbiBvZiBpNjg2IG9uIFVuaXhXYXJlIDcuCi0KLVNhdCBKYW4gMzAgMDg6MDQ6MDAgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzczogQWRkIHN1cHBvcnQgZm9yIGkzODYtcGMtaW50ZXJpeC4KLQkqIGNvbmZpZy5zdWI6IExpa2V3aXNlLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9taC1pbnRlcml4OiBOZXcgZmlsZS4KLQotTW9uIEphbiAxOCAxMzo1OToyMCAxOTk5ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHVubmVlZGVkIGFsbC10YXJnZXQtbGliaW8gZnJvbQotCWZyb20gYWxsLXRhcmdldC13aW5zdXAgdGFyZ2V0IHNpbmNlIGl0IGlzIG5vdyB1bm5lZWRlZC4KLQlBZGQgYWxsLXRhcmdldC1saWJ0ZXJtY2FwIGluIGl0cyBwbGFjZSBzaW5jZSBpdCBpcyBub3cKLQluZWVkZWQuCi0KLVdlZCBEZWMgMzAgMjA6MzQ6NTIgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBtYWtlZmlsZSBzdHViIGZvciBjeWd3aW4gdGFyZ2V0IGlzIHByb2JhYmx5Ci0JdW5uZWNlc3NhcnkuICBSZW1vdmUgaXQgZm9yIG5vdy4KLQkqIGNvbmZpZy9tdC1jeWd3aW46IFJlbW92ZS4KLQotV2VkIERlYyAzMCAwMToxMzowMyAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGxpYnRlcm1jYXAuYSBzaG91bGQgYmUgYnVpbHQgd2hlbiBjeWd3aW4gaXMgdGhlCi0JdGFyZ2V0IGFzIHdlbGwgYXMgdGhlIGhvc3QuCi0JKiBjb25maWcuZ3Vlc3M6IEFsbG93IG1peGVkIGNhc2UgaW4gY3lnd2luIHVuYW1lIG91dHB1dC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgbGlidGVybWNhcCB0YXJnZXQuCi0JKiBjb25maWcvbXQtY3lnd2luOiBOZXcgZmlsZS4gIGxpYnRlcm1jYXAgdGFyZ2V0IGluZm8uCi0KLVR1ZSBEZWMgMTUgMTc6MDI6NTggMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGN5Z21vbiBmb3IgeDg2LWNvZmYgYW5kIHg4Ni1lbGYuIENvbmZpZ3VyZQotIAljeWdtb24gZm9yIGFsbCBzcGFyY2xpdGUgdGFyZ2V0cywgcmVnYXJkbGVzcyBvZiBvYmplY3QgZm9ybWF0LgotCi0xOTk4LTEyLTE1ICBNYXJrIFNhbHRlciAgPG1zYWx0ZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCB0YXJnZXQtYnNwIGZvciBzZXZlcmFsIHRhcmdldCBhcmNoaXRlY3R1cmVzLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgcnVsZXMgZm9yIGJzcC4KLQotV2VkIERlYyAyMyAwMDoyMDo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IENsZWFuIHVwIGhhbmRsaW5nIG9mIGhwcGEyLjAuCi0KLVR1ZSBEZWMgMjIgMjM6NTY6MzEgMTk5OCAgUm9kbmV5IEJyb3duICAocm9kbmV5YnJvd25AcG1zYy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogVXNlIEMgY29kZSB0byBpZGVudGlmeSBtb3JlIEhQIG1hY2hpbmVzLgotCi1UaHUgRGVjIDE3IDAxOjIyOjMwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogSGFuZGxlIGhwcGEyLjAuCi0KLUZyaSBEZWMgIDQgMDE6MzQ6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEltcHJvdmUgZGV0ZWN0aW9uIG9mIGhwcGEyLjAgcHJvY2Vzc29ycy4KLQotRnJpIERlYyAgNCAwMTozMzowNSAxOTk4ICBOaWFsbCBTbWFydCA8bmlhbGxzQGV1cmlzdGl4LmllPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBGcmVlQlNEIHVzaW5nIEVMRiBhdXRvbWF0aWNhbGx5LgotCi0xOTk4LTExLTI2ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAoc2tpcC10aGlzLWRpcik6IEFkZCBoYW5kbGluZyBmb3IgbmV3IHNoZWxsIHNjcmlwdCwgd2hpY2gKLQltaWdodCBiZSBjcmVhdGVkIGJ5IGEgc3ViLWRpcmVjdG9yeSdzIGNvbmZpZ3VyZSB0byBpbmRpY2F0ZSwgdGhpcyBwYXJ0aWN1bGFyCi0JZGlyZWN0b3J5IGlzICJ1bndhbnRlZCIuCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogTGlrZXdpc2UuCi0KLQotV2VkIE5vdiAxOCAxODoyODo0NSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZzogaW1wb3J0IGZyb20gbGlidG9vbCwgYWZ0ZXIgY2hhbmdpbmcgbGlidG9vbCB0bwotCWFjY291bnQgZm9yIHRoZSBjeWd3aW4gbmFtZSBjaGFuZ2UuCi0KLVdlZCBOb3YgMTggMTg6MDk6MTQgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IENDX0ZPUl9UQVJHRVQgYW5kIENYWF9GT1JfVEFSR0VUIHNob3VsZCBhbHNvCi0JaW5jbHVkZSBuZXdsaWIvbGliYy9zeXMvY3lnd2luIGFuZCBuZXdsaWIvbGliYy9zeXMvY3lnd2luMzIuCi0KLVdlZCBOb3YgMTggMjA6MTM6MjkgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbGlidGVybWNhcCB0byBsaXN0IG9mIGN5Z3dpbiBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBOb3YgMTcgMTY6NTc6NTEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmluOiBtb2RpZnkgQ0NfRk9SX1RBUkdFVCBhbmQgQ1hYX0ZPUl9UQVJHRVQgc28gdGhhdAotICAgICAgICB0aGV5IGluY2x1ZGUgd2luc3VwL2luY2x1ZGUgd2hlbiBpdCdzIGEgY3lnd2luIHRhcmdldC4KLQotMTk5OC0xMS0xMiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGRlZCB6aXAuCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC1saWJqYXZhKTogRGVwZW5kIG9uIGFsbC16aXAuCi0JKGFsbC16aXApOiBOZXcgdGFyZ2V0LgotCShBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC16aXAuCi0JKE5BVElWRV9DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2stemlwLgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLXppcC4KLQkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLXppcC4KLQotVGh1IE5vdiAxMiAxNzoyNzoyMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogbG9zZSAiMzIiIGZyb20gY29tbWVudCBhYm91dCBjeWd3aW4uCi0KLVRodSBOb3YgIDUgMTU6MDA6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgLU9zIHRvIGJ1aWxkIHRhcmdldCBsaWJyYXJpZXMgZm9yIHRoZSBmcjMwLgotCi1XZWQgTm92ICA0IDE4OjQ5OjQzIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIGZyMzAuCi0KLU1vbiBOb3YgIDIgMTU6MTk6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZHJvcCAiMzIiIGZyb20gY29uZmlnL21oLWN5Z3dpbjMyLiAgQ2hlY2sKLQljeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqLgotCSogY29uZmlnLnN1YjogQ2hlY2sgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KLQotMTk5OC0xMC0yMCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiBjb25maWd1cmUuaW46IEFkZCB0aGUgYWJpbGl0eSB0byB1c2UgdGNsOC4xIGFuZCB0azguMQotCWlmIGRlc2lyZWQuCi0KLVN1biBPY3QgMTggMTg6MzQ6NTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuaWYgKGN4eF9pbnRlcmZhY2UsIGxpYnN0ZGN4eF9pbnRlcmZhY2UpOiBEbyBub3QgdHJ5IHRvIHNldAotCXRoZXNlIGlmIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcmllcyBhbmQgZmlsZXMgdG8gbm90IGV4aXN0LgotCi1XZWQgT2N0IDE0IDEwOjI5OjA2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IEFkZCBjb25maWcuaWYuCi0KLVR1ZSBPY3QgMTMgMDk6MTc6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBCcmluZyBiYWNrIGxvc3Qgc3BhcmN2OS4KLQotV2VkIFNlcCAzMCAyMjoyMDo1MCAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBpWzM0NTY3XTg2LXBjLXVkay4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLVdlZCBTZXAgMzAgMTk6MjM6NDggMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBiemlwMiBwYWNrYWdlIGJ1aWxkaW5nIGJpdHMgZm9yIHVzZXIKLQl0b29scyBtb2R1bGUKLQkqIGNvbmZpZ3VyZS5pbjogZGl0dG8KLQotMTk5OC0wOS0zMCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JICogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogUmVtb3ZlIGR1cGxpY2F0ZSBsaW5lLgotCi1UdWUgU2VwIDI5IDIyOjQ1OjQxIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1hdXRvbWFrZSk6IGZpeCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBTZXAgMjggMDQ6MDQ6MjcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1pbm9yIGNsZWFudXBzIGZvciBidWlsZGluZyBpbiB0aGUgJCh0YXJnZXRfYWxpYXMpCi0Jc3ViZGlyLgotCi0xOTk4LTA5LTIyICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXApOiBTZXQgciBhbmQgcyBiZWZvcmUgbWFrZSBhbGwuICBVc2UKLQlCQVNFX0ZMQUdTX1RPX1BBU1MgaW4gbWFrZSBhbGwuCi0JKGNyb3NzKTogTGlrZXdpc2UuCi0KLTE5OTgtMDktMjAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXApOiBQYXNzIFRBUkdFVF9GTEFHU19UT19QQVNTIHRvIGBtYWtlIGFsbCcuCi0KLQotU3VuIFNlcCAyMCAwMDoxMzowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KLQotMTk5OC0wOS0xOSAgTWljaGFlbCBIYXllcyAgPG0uaGF5ZXNAZWxlYy5jYW50ZXJidXJ5LmFjLm56PgotCi0JKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgQzR4IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLTE5OTgtMDktMTMgIERhdmlkIFMuIE1pbGxlciAgPGRhdmVtQHBpZXJkb2wuY29iYWx0bWljcm8uY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgc3BhcmN2OSBqdXN0IGxpa2Ugc3BhcmM2NC4KLQotV2VkIFNlcCAgOSAxNTo0NDo1MiAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogTWF0Y2ggIlBlbnQgSUkiIG9yICJQZW50SUkiIGZvciBPcGVuU2VydmVyLgotCi1UdWUgU2VwICA4IDAxOjE4OjM5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBDb3JyZWN0bHkgaWRlbnRpZnkgUGVudGl1bSBJSSBzY28gYm94ZXMuCi0KLQkqIGNvbmZpZy5ndWVzczogRml4ICJ0ciIgY29kZS4gIEZyb20gV2Vpd2VuIExpdS4KLQotU2F0IFNlcCAgNSAxMzo1Njo1MiAxOTk4ICBKb2huIEh1Z2hlcyAgPGpvaG5AQ2FsdmEuQ09NPgotCi0JKiBjb25maWd1cmUuaW46IERvIG5vdCBhc3N1bWUgeDg2LXN2cjQgb3IgeDg2LXVuaXh3YXJlIGNhbiBoYW5kbGUKLQlzdGFicy4KLQotU2F0IFNlcCAgNSAwMjoxMjowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IEFkZCBsaWJjaGlsbC4KLQkoQUxMX1RBUkdFVF9NT0RVTEVTKTogQWRkIGFsbC10YXJnZXQtbGliY2hpbGwuCi0JKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUywgQ0hFQ0tfVEFSR0VUX01PRFVMRVMpOiBTaW1pbGFybHkuCi0JKElOU1RBTExfVEFSR0VUX01PRFVMRVMsIENMRUFOX1RBUkdFVF9NT0RVTEVTKTogU2ltaWxhcmx5LgotCShhbGwtdGFyZ2V0LWxpYmNoaWxsKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2xpYnMpOiBBZGQgbGliY2hpbGwuCi0KLVN1biBBdWcgMzAgMjI6Mjc6MDIgMTk5OCAgTHV0eiBXb2hscmFiIDxsdXR6LndvaGxyYWJAaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZT4KLQotCSogY29uZmlnLmd1ZXNzOiBBdm9pZCBhc3N1bXB0aW9ucyBhYm91dCAidHIiIGJlaGF2ZXMgd2hlbgotCUxBTkcgaXMgc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIEVuZ2xpc2guCi0KLVN1biBBdWcgMzAgMjI6MTQ6NDQgMTk5OCAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQotCi0JKiBjb25maWd1cmUgKGd4eF9pbmNsdWRlX2Rpcik6IENoYW5nZWQgdG8KLQknJHtwcmVmaXh9L2luY2x1ZGUvZysrJy0ke2xpYnN0ZGN4eF9pbnRlcmZhY2V9LgotCi0JKiBjb25maWcuaWY6IE5ldyB0byBkZXRlcm1pbmUgdGhlIGludGVyZmFjZXMuCi0KLVN1biBBdWcgMzAgMjE6MTU6MTkgMTk5OCAgTWFyayBLbGVpbiAobWtsZWluQGRpcy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogRGV0ZWN0IGFuZCBoYW5kbGUgTVBFL0lYLgotCSogY29uZmlnLnN1YjogRGVhbCB3aXRoIE1QRS9JWC4KLQotU2F0IEF1ZyAyOSAxNDozMjo1NSAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgbWgtYWl4NDMuCi0KLTE5OTgtMDctMjkgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlOiBGaXggLS13aXRob3V0Ly0tZGlzYWJsZSBjYXNlcyBmb3IgZ3h4LWluY2x1ZGUtZGlyLgotCi1GcmkgQXVnIDI4IDEyOjI4OjI2IDE5OTggIFBlciBCb3RobmVyICA8Ym90aG5lckBjeWdudXMuY29tPgotCi0JKiBtZGF0YS1zaDogIEltcG9ydGVkLiAgTmVlZGVkIGZvciBhdXRvbWFrZSBzdXBwb3J0LgotCi1UaHUgQXVnIDEzIDEyOjQ5OjI5IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFRyeSAiY2htb2QgLVIgb2c9dSAuIiBiZWZvcmUgCi0JImNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgIi4KLQotRnJpIEp1bCAzMSAwOTozODozMyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogQWRkIGFybS1lbGYgYW5kIHRodW1iLWVsZiBzdXBwb3J0LgotCi1Nb24gSnVsIDI3IDE2OjIzOjU4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVbmRvIHByZXZpb3VzIHBhdGNoLgotCi1GcmkgSnVsIDI0IDE5OjU1OjI0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVCk6IE1vdmUgRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTCi0JdG8gaGVyZSAuLi4KLQkoaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzKTogYW5kIGhlcmUKLQkoSU5TVEFMTF9NT0RVTEVTKTogLi4uIGZyb20gaGVyZS4KLQotRnJpIEp1bCAyNCAxNzowMTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgotCi0JKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggRlNGLgotCi1GcmkgSnVsIDI0IDA4OjQzOjM2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAoZXh0cmFjb25maWdkaXJzKTogTmV3IHZhcmlhYmxlLgotCShTVUJESVJTKTogQWRkIGV4dHJhY29uZmlnZGlycyBhbmQgcmVjdXJzZSBvbiB0aGVtIHRvby4KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBNb3ZlIGhpZ2hlciBpbiBmaWxlLgotCShFWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUyk6IE5ldyB2YXJpYWJsZS4KLQkoRVhUUkFfVEFSR0VUX0hPU1Rfe0lOU1RBTEwsQ0hFQ0t9X01PRFVMRVMpOiBOZXcgdmFyaWFibGVzLgotCShBTExfTU9EVUxFUyk6IEFkZCBFWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUy4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZCBFWFRSQV9UQVJHRVRfSE9TVF9DSEVDS19NT0RVTEVTLgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGQgRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTLgotCi0xOTk4LTA3LTIzICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC1saWJqYXZhKTogRGVwZW5kIG9uIGFsbC1nY2MgYW5kCi0JYWxsLXRhcmdldC1uZXdsaWIuCi0JKGNvbmZpZ3VyZS10YXJnZXQtbGliamF2YSk6IERlcGVuZCBvbiAkKEFMTF9HQ0MpLgotCi1TYXQgSnVsIDE4IDE0OjMyOjQzIENEVCAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogKCotcGMtc2NvMy4ydjUpIEFkZCBkZXRlY3Rpb24gZm9yIFBlbnRpdW0gSUkuCi0JKCotcGMtdW5peHdhcmU3KSBBZGQgZGV0ZWN0aW9uIGZvciBQZW50aXVtIElJLCBQZW50aXVtIFByby4KLQotRnJpIEp1bCAxNyAxMzozMDoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHlsd3JhcDogQ2hhbmdlIGFic29sdXRlIHBhdGggY2hlY2tzIHRvIGNoZWNrIGZvciBET1Mgc3R5bGUgcGF0aAotCW5hbWVzLgotCi0JKiB5bHdyYXA6IERvbid0IHVzZSBhIGZ1bGwgcGF0aCBuYW1lIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBpbiB0aGUKLQlzYW1lIGRpcmVjdG9yeS4gIEZyb20gaGpsQGx1Y29uLm9yZyAoSC5KLiBMdSkuCi0KLQkqIGNvbmZpZy1tbC5pbjogRGVmYXVsdCB0byBiZWluZyB2ZXJib3NlLCB0byBtYXRjaCBGZWIgMTggY2hhbmdlIHRvCi0JY29uZmlndXJlLgotCi1UaHUgSnVsIDE2IDEyOjI5OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJyb3VnaHQgb3ZlciBmcm9tIGVnY3M6Ci0KLQlTYXQgSnVuIDI3IDIyOjQ2OjMyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogU2V0IHRvICR7dGFyZ2V0X2FsaWFzfSBpbnN0ZWFkCi0Jb2YgImxpYnJhcmllcyIuCi0KLQlNb24gU2VwICAxIDE2OjQ1OjQ0IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogU2V0IHRvIGxpYnJhcmllcyBpZiBlbmFibGVfbXVsdGlsaWIuCi0KLVdlZCBKdWwgMTUgMDE6MDA6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogSWYgdGhlcmUgYXJlIGFueQotCW11bHRpbGlicywgZm9yY2UgcmVjb25maWd1cmF0aW9uIHRoZSBmaXJzdCB0aW1lIHdlIGNyZWF0ZQotCW11bHRpbGliLm91dCBpbiBhIHN1YmRpcmVjdG9yeSwgaW4gY2FzZSBUQVJHRVRfU1VCRElSIGlzIGAuJy4KLQotVHVlIEp1bCAxNCAyMzo0MTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3RyaXAgYW55IC0tbm8gb3B0aW9uIGZyb20gQ09ORklHX0FSR1VNRU5UUywgdG8KLQlhdm9pZCBjb25mdXNpb24gd2l0aCAtLW5vLXJlY3Vyc2lvbi4KLQotVHVlIEp1bCAxNCAxNTozNzo0MSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFdpbjMyIGhvc3RzIHNob3VsZG4ndCB1c2UgaW5zdGFsbCAteAotCSogaW5zdGFsbC1zaDogcmVtb3ZlIC14IG9wdGlvbiwgYW5kIHNwZWNpYWwgLmV4ZS1oYW5kbGluZwotCWhhY2suCi0KLVR1ZSBKdWwgMTQgMTU6Mjg6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgaTU4Ni1wYy1iZW9zLgotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBzb21lIGJpdHMgZm9yIGJlb3MuCi0KLVR1ZSBKdWwgMTQgMTM6MjI6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IElmIENDIGlzIHNldCBidXQgQ0ZMQUdTIGlzIG5vdCwgYW5kIENDIGlzIGdjYywgbWFrZQotCUNGTEFHUyBkZWZhdWx0IHRvIC1PMi4KLQotCSogbHRtYWluLnNoOiBBZGQgc29tZSBoYWNrcyB0byBtYWtlIFN1bk9TIC0tZW5hYmxlLXNoYXJlZCB3b3JrCi0Jd2hlbiB1c2luZyBHTlUgbGQuCi0KLUZyaSBKdWwgMTAgMTM6MTg6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IENvcnJlY3QgaW5zdGFsbCB3aGVuIHVzaW5nIGEgZGlmZmVyZW50IHNoZWxsLgotCi1UdWUgSnVsICA3IDE1OjI0OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yYi4KLQotVGh1IEp1bCAgMiAxMzo1NzozNiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgdG8gYnVpbGQgYmludXRpbHMvbWFrZWZpbGUudm1zLiAgQWRkIGluc3RhbGwKLQl0YXJnZXQuCi0KLVdlZCBKdWwgIDEgMTY6NDU6MjEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZzogVXBkYXRlIHRvIGNvcnJlY3QgQUlYIGhhbmRsaW5nLgotCi1TYXQgSnVuIDI3IDIyOjQ2OjMyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IEFkZCBUQVJHRVRfU1VCRElSLgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBTZXQgdG8gJHt0YXJnZXRfYWxpYXN9IGluc3RlYWQKLQlvZiAibGlicmFyaWVzIi4KLQotMTk5OC0wNi0yNiAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogQWRkIGdjY192ZXJzaW9uX3RyaWdnZXIuCi0JKE1ha2VmaWxlKTogRGVwZW5kIG9uICQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikuCi0KLQkqIGNvbmZpZ3VyZSAoZ2NjX3ZlcnNpb24pOiBDaGFuZ2UgZGVmYXVsdCBpbml0aWFsaXplciB0byBlbXB0eQotCXN0cmluZy4KLQkoZ2NjX3ZlcnNpb25fdHJpZ2dlcik6IE5ldyB2YXJpYWJsZTsgcGFzcyB0aGlzIHZhcmlhYmxlIGRvd24KLQl0byBzdWJkaXIgY29uZmlndXJlcyB0byBlbmFibGUgdGhlbSBjaGVja2luZyBnY2MncyB2ZXJzaW9uCi0JdGhlbXNlbHZlcy4gRW1pdCBtYWtlIG1hY3JvcyBmb3IgYm90aCBnY2NfdmVyc2lvbiB2YXJzLgotCSh0b3BzcmNkaXIpOiBJbml0aWFsaXplIHJlbGlhYmx5LgotCShyZWN1cnNpb24gbGluZSk6IFJlbW92ZSAtLXdpdGgtZ2NjLXZlcnNpb249JHtnY2NfdmVyc2lvbn0uCi0KLTE5OTgtMDYtMjQgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMpOiBJbXBsZW1lbnQgbmV3IGZsYWcKLQktLWVuYWJsZS12ZXJzaW9uLXNwZWNpZmljLXJ1bnRpbWUtbGlicyB3aGljaCBpbnN0YWxscyBDKysgcnVudGltZSBzdHVmZgotCWluICQobGlic3ViZGlyKTsgZW1pdCBkZWZpbml0aW9uIGluIGVhY2ggZ2VuZXJhdGVkIE1ha2VmaWxlLgotCShneHhfaW5jbHVkZV9kaXIpOiBJbml0aWFsaXplIGRlcGVuZGluZyBvbgotCSRlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMuCi0KLTE5OTgtMDYtMjQgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChnY2NfdmVyc2lvbik6IEluaXRpYWxpemUgcHJvcGVybHkgZGVwZW5kaW5nIG9uCi0JaG93IGFuZCB3aGVyZSBjb25maWd1cmUgaXMgc3RhcnRlZC4KLQkocmVjdXJzaW9uIGxpbmUpOiBQYXNzIGEgLS13aXRoLWdjYy12ZXJzaW9uPSR7Z2NjX3ZlcnNpb259Ci0JdG8gY29uZmlndXJlcyBpbiBzdWJkaXJzLgotCi1XZWQgSnVuIDI0IDE2OjAxOjU5IDE5OTggIEpvaG4gTWV0emxlciAgPGptZXR6bGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIGNvbmZpZ3VyZSBwYXR0ZXJuIGZvciBtaXBzIHR4MzkKLSAJY3lnbW9uCi0KLVR1ZSBKdW4gMjMgMjI6NDI6MzIgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjeWdtb24gYW5kIGxpYnN0dWIgc3VwcG9ydCBmb3IgbW4xMDIwMC4KLQotMTk5OC0wNi0xOSAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKGdjY192ZXJzaW9uKTogQWRkIG5ldyB2YXJpYWJsZSBkZXNjcmliaW5nIHRoZQotCXBhcnRpY3VsYXIgZ2NjIHZlcnNpb24gd2UncmUgYnVpbGRpbmcuCi0JKiBNYWtlZmlsZS5pbiAobGlic3ViZGlyKTogQWRkIG5ldyBtYWNybyBmb3IgdGhlIGRpcmVjdG9yeQotCWluIHdoaWNoIHRoZSBjb21waWxlciBmaW5kcyBleGVjdXRhYmxlcywgbGlicmFyaWVzLCBldGMuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBnY2NfdmVyc2lvbiwgdGFyZ2V0X2FsaWFzCi0JYW5kIGxpYnN1YmRpci4KLQotRnJpIEp1biAxOSAwMjozNjo1OSAxOTk4ICBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtY2xlYW4pOiByZW1vdmUgKi5sb2cKLQkod2FybmluZy5sb2cpOiBidWlsdCB3aXRoIHdhcm5fc3VtbWFyeSBmcm9tIGJ1aWxkLmxvZwotCShtYWlsLXJlcG9ydC5sb2cpOiBydW4gdGVzdF9zdW1tYXJ5Ci0JKG1haWwtcmVwb3J0LXdpdGgtd2FybmluZ3MubG9nKTogcnVuIHRlc3Rfc3VtbWFyeSBpbmNsdWRpbmcKLQl3YXJuaW5nLmxvZyBpbiB0aGUgcmVwb3J0Ci0KLVRodSBKdW4gMTggMTE6MjY6MDMgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IERldGVjdGlvbiBvZiBQZW50aXVtIElJIGZvciAqLXNjby0zLjJ2NSouCi0KLU1vbiBKdW4gMTUgMTQ6NTM6NTQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZ3JlcCk6IEdyZXAgbm8gbG9uZ2VyIGRlcGVuZHMgb24gbGliaWJlcnR5LgotCi1GcmkgSnVuIDEyIDE0OjAzOjM0IDE5OTggIFN5ZCBQb2xrICA8c3BvbGtAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGFsbC1zbmF2aWdhdG9yIG5lZWRzIGFsbC1saWJndWkuCi0KLVRodSBKdW4gMTEgMTk6NDM6NDcgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjeWdtb24gYW5kIGxpYnN0dWIgc3VwcG9ydCBmb3IgbW4xMDMwMC4KLQotV2VkIEp1biAxMCAxMToxOTo0NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pc3Npbmc6IFVwZGF0ZSB0byB2ZXJzaW9uIGZyb20gYXV0b21ha2UgMS4zLgotCi0JKiBsdG1haW4uc2g6IE9uIGluc3RhbGxhdGlvbiwgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGlmIHRoZSBzYW1lIG5hbWUKLQlhcHBlYXJzIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBsaXN0IG9mIGxpYnJhcnkgbmFtZXMuCi0KLVdlZCBKdW4gIDMgMTQ6NTE6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgbTY4MDYwIGFuZCBtNTIwMCBhcyBDUFUgbmFtZXMuCi0KLU1vbiBKdW4gIDEgMTc6MjU6MTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFVzZSAmJiByYXRoZXIgdGhhbiB1c2luZyAtYSBpbiB0ZXN0LCBiZWNhdXNlIG9kZAotCXN0cmluZ3MgY2FuIGNvbmZ1c2UgdGVzdC4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLVRodSBNYXkgMjggMTk6MzE6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBCcmluZyBpbiBWaXN1YWwgQysrIHN1cHBvcnQuCi0KLVNhdCBNYXkgMjMgMjM6NDQ6MTMgMTk5OCAgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3N0cmFwMi1sZWFuLCBib290c3RyYXAzLWxlYW4sCi0JYm9vdHN0cmFwNC1sZWFuKTogbmV3IHRhcmdldHMKLQotTW9uIE1heSAxMSAyMzoxMTozNCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIENPUFlJTkcuTElCOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLUZyaSBNYXkgIDggMDE6MzA6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgdG8gbGlidG9vbCAxLjJhLgotCi0JKiBNYWtlZmlsZS5pbiAoR0FTQl9TVVBQT1JUX0RJUlMpOiBSZW1vdmUgaW50bDsgYWxyZWFkeSBpbmNsdWRlZCB2aWEKLQlHQVNfU1VQUE9SVF9ESVJTLgotCi1UaHUgTWF5ICA3IDE3OjI3OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogQXZvaWQgcHJvZHVjaW5nIGEgdmVyc2lvbiBudW1iZXIgaWYKLQktdmVyc2lvbi1pbmZvIHdhcyBub3QgdXNlZC4KLQotVHVlIE1heSAgNSAxODowMjoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIC0td2l0aC1uZXdsaWIgdG8gQ09ORklHX0FSR1VNRU5UUyBpZiB3ZSBhcmUKLQlidWlsZGluZyB3aXRoIG5ld2xpYi4KLQotMTk5OC0wNC0zMCAgUGF1bCBFZ2dlcnQgIDxlZ2dlcnRAdHdpbnN1bi5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogUmVtb3ZlIGJhY2tzbGFzaCBhdCBlbmQ7Ci0gICAgICAgIFNvbGFyaXMgYG1ha2UnIGNhdXNlcyBpdCB0byBjb250aW51ZSB0byBuZXh0IGRlZmluaXRpb24uIAotCi1UdWUgQXByIDI4IDE2OjI0OjI0IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1nZGJ0ayk6IENhbGwgdGhpcyAnaW5zdGFsbC1nZGInIHNvIHRoYXQKLQl0aGUgcmlnaHQgR1VJIGxpYnJhcmllcyBhbmQgZmlsZXMgYXJlIGluc3RhbGxlZCBhbG9uZyB3aXRoIEdEQi4KLQotVHVlIEFwciAyOCAxODoxMToyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGFscGhhIHRvIGFscGhhKiBpbiBzZXZlcmFsIHBsYWNlcy4KLQotVHVlIEFwciAyOCAwNzo0MjowMCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBzcGFyYzg2eC4KLQotVHVlIEFwciAyOCAwNzozNTowMiAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLSAKLQkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlKTogUmVtb3ZlIGRlYnVnIGVjaG8uCi0KLVRodSBBcHIgMjMgMjE6MzE6MTYgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBDWFhGTEFHUyBmcm9tIENYWEZMQUdTLCBub3QgQ0ZMQUdTLgotCi1UaHUgQXByIDIzIDEyOjI2OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IFVwZGF0ZSBjeWd3aW4zMiBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiAoR0FTX1NVUFBPUlRfRElSUyk6IEFkZCBpbnRsLgotCShCSU5VVElMU19TVVBQT1JUX0RJUlMsIEdBU0JfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCi0JKEdEQl9TVVBQT1JUX0RJUlMpOiBMaWtld2lzZS4KLQotV2VkIEFwciAyMiAxMjozMDoxMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbWFrZWZpbGVfZnJhZyk6IElmIC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSwKLQl1c2UgLU9zIHRvIGNvbXBpbGUgdGFyZ2V0IGxpYnJhcmllcyByYXRoZXIgdGhhbiAtTzIuICBEZWZhdWx0IHRvCi0JdXNpbmcgLU9zIGZvciBkMTB2IGFuZCBtMzJyIGlmIC0te2VuYWJsZSxkaXNhYmxlfS10YXJnZXQtb3B0c3BhY2UgaXMKLQlub3QgdXNlZC4KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NmbGFncyk6IERpdHRvIGZvciBkMzB2LgotCi1UdWUgQXByIDIxIDIzOjA2OjU0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iZmQpOiBEZXBlbmQgb24gYWxsLWludGwuCi0JKGFsbC1iaW51dGlscyk6IExpa2V3aXNlLgotCShhbGwtZ2FzKTogTGlrZXdpc2UuCi0JKGFsbC1ncHJvZik6IExpa2V3aXNlLgotCShhbGwtbGQpOiBMaWtld2lzZS4KLQotCi0xOTk4LTA0LTE5ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBGaXggdHlwbywgbGJ0b29sIC0+IGxpYnRvb2wuCi0KLUZyaSBBcHIgMTcgMTY6MjA6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWJmZCk6IERlcGVuZCB1cG9uIGFsbC1saWJpYmVydHkuCi0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IEJyaW5nIGluIG5ld2VyIGN5Z3dpbjMyIHN1cHBvcnQuCi0KLUZyaSBBcHIgMTcgMTI6MjI6MjIgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgbGlic3R1Yi4KLQotCSogY29uZmlndXJlLmluOiBEaXR0by4gQnVpbGQgbGlic3R1YiBmb3IgdGFyZ2V0cyB0aGF0IGhhdmUgY3lnbW9uCi0Jc3VwcG9ydC4KLQotVHVlIEFwciAxNCAxODowMTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IFBJQ0ZMQUcgb24gaXg4Ni1jeWd3aW4zMi4KLQotVHVlIEFwciAxNCAxMjoyNDo0NSAxOTk4ICBKLiBLZWFuIEpvaG5zdG9uICA8amtqQHNjby5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXNlIGlbMzQ1Nl05Ni0qLXN5c3Y1KiBhcyBhIHZhbGlkIGhvc3QsIGFuZAotCXVzZSBtaC1zeXN2NSBpZiBzcGVjaWZpZWQuICBTdXBwb3J0IGdwcm9mIG9uIFNDTyBPcGVuIFNlcnZlci4KLQotVHVlIEFwciAxNCAxMTozMzo1MSAxOTk4ICBLcmlzdGVyIFdhbGZyaWRzc29uIDxjYXRvQGRmLmx0aC5zZT4KLQotCSogY29uZmlndXJlOiBEZWZpbmUgREVGQVVMVF9NNCBieSBzZWFyY2hpbmcgUEFUSC4KLQkqIE1ha2ZpbGUuaW46IFVzZSBERUZBVUxUX000LgotCi1Nb24gQXByIDEzIDE1OjM3OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IEFkZCBjeWd3aW4zMiBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBBZGQgbGlidG9vbCBhcyBhIG5hdGl2ZSBvbmx5IGRpcmVjdG9yeQotIAl0byBjb25maWd1cmUgYW5kIGJ1aWxkLgotCi1XZWQgQXByICA4IDEzOjE4OjU2IDE5OTggIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogWEZPTyBsaW5lcyBzaG9ydGVuZWQuCi0KLVRodSBBcHIgIDIgMTQ6NDg6NDQgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBhc2ggbWFrZSBydWxlcwotCSogY29uZmlndXJlLmluOiBhZGQgYXNoIHRvIG5hdGl2ZV9vbmx5IGFuZCBob3N0X3Rvb2xzIGxpc3RzCi0KLVRodSBNYXIgMjYgMTI6NTM6MjAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdldHRleHQsIGFsbC1pbnRsKTogTmV3IHRhcmdldHMuCi0JKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWdldHRleHQsIGFsbC1pbnRsLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2stZ2V0dGV4dCwgY2hlY2staW50bC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1nZXR0ZXh0LCBpbnN0YWxsLWludGwuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1nZXR0ZXh0LCBjbGVhbi1pbnRsLgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGRlZCBnZXR0ZXh0LgotCShuYXRpdmVfb25seSk6IExpa2V3aXNlLgotCShub2NvbmZpZ2RpcnMpIFt2YXJpb3VzIGNhc2VzXTogTGlrZXdpc2UuCi0JKGhvc3RfbGlicyk6IEFkZGVkIGludGwuCi0KLVRodSBNYXIgMjYgMTU6MDA6MTEgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAb25pb25zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRG8gbm90IGRpc2FibGUgYnVpbGRpbmcgZ2RidGsgZm9yIGN5Z3dpbjMyIGhvc3RzLgotCi1XZWQgTWFyIDI1IDExOjQ5OjEyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQkoYWxsLXRhcmdldC13aW5zdXApOiAgYWxsLXRhcmdldC1saWJyeCBzdGF5cyBvdXQgb2YgaGVyZS4KLQotVHVlIE1hciAyNCAxNjo1ODoyOSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTLCBBTExfVEFSR0VUX01PRFVMRVMsIAotCUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUywgQ0hFQ0tfVEFSR0VUX01PRFVMRVMsIAotCUlOU1RBTExfVEFSR0VUX01PRFVMRVMsIENMRUFOX1RBUkdFVF9NT0RVTEVTLCBhbGwtdGFyZ2V0LXdpbnN1cCk6IAotCVJlbW92ZSByZWZlcmVuY2VzIHRvIGxpYnJ4IGFuZCBsaWJnKysuCi0KLVR1ZSBNYXIgMjQgMTg6Mjg6MTIgMTk5OCAgRXJpYyBNdW1wb3dlciAgPG5vY3R1cm5lQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzICQobGlzcGRpcikgZG93biB0bwotCXJlY3Vyc2l2ZSBtYWtlcwotCi1UdWUgTWFyIDI0IDExOjM3OjQ1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBVc2UgJChUQVJHRVRfU1VCRElSKSB3aGVuIHBhc3NpbmcgLUIKLQlmb3IgbmV3bGliIGRpcmVjdG9yeS4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyMyAxMTozMDoyMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgYWZ0ZXIgbGlidG9vbC9sdGNvbmZpZy5pbiBjaGFuZ2UgZm9yCi0JaHB1eDExLgotCi1GcmkgTWFyIDIwIDE4OjUxOjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yLgotCi1GcmkgTWFyIDIwIDA5OjMyOjE0IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZ2NjKTogRG9uJ3Qgc3BlY2lmeSBMQU5HVUFHRVMgaGVyZS4KLQkoaW5zdGFsbC1nY2MtY3Jvc3MpOiBJbnN0ZWFkLCBvdmVycmlkZSBMQU5HVUFHRVMgaGVyZS4KLQotMTk5OC0wMy0xOCAgRGF2ZSBMb3ZlICA8ZC5sb3ZlQGRsLmFjLnVrPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogU2V0IENPTkZJR19TSVRFIHRvIGEKLQlub24tZXhpc3RlbnQgZmlsZSBzaW5jZSAvZGV2L251bGwgbG9zZXMgd2l0aCBiYXNoIDIuMC9hdXRvY29uZiAyLjEyLgotCi1XZWQgTWFyIDE4IDA5OjI0OjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIFRodW1iLXBlIHRhcmdldC4KLQotVHVlIE1hciAxNyAxNjo1OTowMCAxOTk4ICBTeWQgUG9sayA8c3BvbGtAY3lnbnVzLmNvbT4KLQkqIE1ha2VmaWxlLmluIC0gY2hhbmdlZCBzbiB0YXJnZXRzIHRvIHNuYXZpZ2F0b3IKLQkqIGNvbmZpZ3VyZS5pbiAtIGNoYW5nZWQgc24gdGFyZ2V0cyB0byBzbmF2aWdhdG9yCi0KLVR1ZSBNYXIgMTcgMTA6MzM6MjggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWctbWwuaW46IEFmdGVyIGJ1aWxkaW5nIHN5bWxpbmsgdHJlZSBjYWxsIG1ha2UgZGlzdGNsZWFuCi0JaWYgYSBNYWtlZmlsZSBnb3QgbGlua2VkIGludG8gJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgdGhpcyBoYXBwZW5zCi0JdG8gYmUgdGhlIGNhc2UgZm9yIGxpYmliZXJ0eS4KLQotVHVlIE1hciAxNyAxMDoyMjozNyAxOTk4ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWd1cmU6IFdoZW4gbWFraW5nIGxpbmssIGFsc28gY2hlY2sgdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnkuIFRoZSBjb25maWd1cmUgc2NyaXB0cyBtYXkgY3JlYXRlIG9uZS4KLQotRnJpIE1hciAgNiAwMTowMjowMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgYWxwaGFwY2E1NiBhbmQgYWxwaGFldjYgcHJvcGVybHkuCi0KLUZyaSBNYXIgIDYgMDA6MTQ6NTUgMTk5OCAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0IDMgSmFuIGNoYW5nZSBmb3IgcG93ZXJwYy1saW51eC1nbnVsaWJjMS4KLQotCi1Nb24gRmViIDIzIDE1OjA5OjE4IDE5OTggIEJydW5vIEhhaWJsZSA8YnJ1bm9AbGludWl4Lm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZQotCi0gICAgICAgICogY29uZmlnLnN1YiAoc2NvNSk6IEZpeCB0eXBvLgotCi1Nb24gRmViIDIzIDE0OjQ2OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTU9EVUxFUyk6IE1vdmUgaW5zdGFsbC10Y2wgYmVmb3JlCi0JaW5zdGFsbC1pdGNsLgotCShpbnN0YWxsLWl0Y2wpOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiBpbnN0YWxsLXRjbC4KLQotTW9uIEZlYiAyMyAwOTo1MzoyOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxpYmdsb3NzIGZyb20gbm9jb25maWdkaXJzIGZvciBNTjEwMzAwLgotCi1GcmkgRmViIDIwIDE2OjQ3OjI0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCBsZXQgYnVpbGRzIGJlIGRvbmUgaW4gc291cmNlIHRyZWUuCi0KLVRodSBGZWIgMTkgMTM6NDA6NDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGxpYmd1aSBmb3IgYSBjeWd3aW4zMiB0YXJnZXQgd2hlbiBub3Qgb24KLQlhIGN5Z3dpbjMyIGhvc3QuCi0KLVdlZCBGZWIgMTggMTI6Mjk6MDAgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAocmVkaXJlY3QpOiBTZXQgdG8gbnVsbCwgc28gZGVmYXVsdCBiZWhhdmlvciBvZgotCWNvbmZpZ3VyZSBpcyBub3cgLS12ZXJib3NlLgotCi0xOTk4LTAyLTE2ICBEYXZlIExvdmUgIDxkLmxvdmVAZGwuYWMudWs+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBSdW4gY29uZmlndXJlIHdpdGgKLQlDT05GSUdfU0lURT0vZGV2L251bGwgdG8gZm9yZXN0YWxsIGxvc3NhZ2Ugd2l0aCBzaXRlIGNvbmZpZ3VyYXRpb24uCi0KLU1vbiBGZWIgMTYgMTI6MjM6NTMgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxNYW5mcmVkLkhvbGxzdGVpbkBrcy5zZWwuYWxjYXRlbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUywgRVhUUkFfVEFSR0VUX0ZMQUdTKTogUmVhbGx5IGFkZAotCXRoaXMgY2hhbmdlIHRvIHN5bmMgTWFrZWZpbGUuaW4gd2l0aCBpdHMgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLVRodSBGZWIgMTIgMTU6MDM6MDggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsdG1haW4uc2ggKG1rZGlyKTogQ2hlY2sgdGhhdCB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QKLQliZWZvcmUgd2UgZXhpdCB3aXRoIGVycm9yLCBzbyB0aGF0IHdlIGRvbid0IGdldCByYWNlcyBkdXJpbmcKLQlwYXJhbGxlbCBidWlsZHMuCi0KLVNhdCBGZWIgIDcgMTU6MTk6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGkuCi0KLUZyaSBGZWIgIDYgMDE6MzM6NTIgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogRG9uJ3QgcGFzcyBQSUNGTEFHIGFuZAotCVBJQ0ZMQUdfRk9SX1RBUkdFVC4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRG9uJ3QgcGFzcyBQSUNGTEFHX0ZPUl9UQVJHRVQuCi0KLQkqIGNvbmZpZ3VyZTogRW1pdCBhIGRlZmluaXRpb24gZm9yIHRoZSBuZXcgbWFjcm8gZW5hYmxlX3NoYXJlZAotCWludG8gZWFjaCBNYWtlZmlsZS4KLQotCSogY29uZmlnL21oLXNwYXJjcGljIChQSUNGTEFHKTogRGVmaW5lIHRvIHByb3Blcmx5IGFjY29yZGluZwotCXRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQkqIGNvbmZpZy9tdC1zcGFyY3BpYyAoUElDRkxBR19GT1JfVEFSR0VUKTogRGVmaW5lIHRvIHByb3Blcmx5Ci0JYWNjb3JkaW5nIHRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQotVGh1IEZlYiAgNSAxNzowMToxMiAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzLCBuYXRpdmVfb25seSk6IEFkZCBsaWJ0b29sLgotCi1XZWQgRmViICA0IDE2OjUzOjU4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHRhcmdldC1ncGVyZiB0byBub2NvbmZpZ2RpcnMgZm9yIEN5Z3dpbjMyLgotCUZpeCB0eXBvIGluIG1pbmcgY29uZmlnIGNvbW1lbnQuCi0KLVdlZCBGZWIgIDQgMTg6NTY6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGguCi0KLU1vbiBGZWIgIDIgMTk6Mzg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgdGljMzAgY2FzZXMsIGFuZCBtYXAgYzMwIHRvIHRpYzMwLgotCi1GcmkgSmFuIDMwIDE3OjE4OjMyIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFJlbW92ZSBleHBlY3QgZnJvbSBub2NvbmZpZ2RpcnMgd2hlbiB0YXJnZXQKLSAgICAgICAgaXMgY3lnd2luMzIuICBPSyB0byBidWlsZCBleHBlY3QgYW5kIGRlamFnbnUgd2l0aCBDYW5hZGlhbgotICAgICAgICBDcm9zcy4KLQotV2VkIEphbiAyOCAxMjo1ODo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgZXhwZWN0LCBkZWphZ251LCBhbmQgY3Zzc3JjIGZvciBhIGN5Z3dpbjMyCi0JaG9zdC4KLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgJHtVTkFNRV9NQUNISU5FfSByYXRoZXIgdGhhbiBpMzg2IGZvciBjeWd3aW4zMgotCWFuZCBtaW5ndzMyLgotCi1XZWQgSmFuIDI4IDEwOjI2OjM3IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBwYXNzaW5nICQobG9jYWxfcHJlZml4KQotCWhlcmUgYXMgaXQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHRvcGxldmVsIE1ha2VmaWxlLgotCi1UdWUgSmFuIDI3IDIzOjI1OjA2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWcpOiBOZXcgdmFyaWFibGUsIHdoaWNoIG5hbWVzCi0JYSBmaWxlIHdpdGggZ2VuZXJpYyBydWxlcywgLi4uCi0JQ2hhbmdlIGNvbW1lbnQgdG8gbWVudGlvbiB3ZSBub3cgaGF2ZSBGSVZFIHBhcnRzLgotCSogY29uZmlndXJlOiBVbmRvIGxhc3QgY2hhbmdlLgotCi1UdWUgSmFuIDI3IDIzOjE1OjU1IDE5OTggIExhc3NpIEEuIFR1dXJhICA8bGF0QGlraS5maT4KLQotCSogY29uZmlnLmd1ZXNzOiBNb3JlIGFjY3VyYXRlIGRldGVybWluYXRpb24gb2YgSFAgcHJvY2Vzc29yIHR5cGVzLgotCSogY29uZmlnLnN1YjogTW9yZSBhY2N1cmF0ZSBkZXRlcm1pbmF0aW9uIG9mIEhQIHByb2Nlc3NvciB0eXBlcy4KLQotU2F0IEphbiAyNCAwMTo1OTo0NSAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAocGFja2FnZV9tYWtlZmlsZV9mcmFnKTogTW92ZSBpbnNlcnRpbmcgdGhlCi0JJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IHRvIHdoZXJlIGl0IHNob3VsZCBiZSBhY2NvcmRpbmcKLQl0byB0aGUgY29tbWVudC4KLQotRnJpIEphbiAyMyAwMDozMDoyMSAxOTk4ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgTGludXgvQVJNLgotCi1UaHUgSmFuIDIyIDE1OjE0OjAxIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiAuY3ZzaWdub3JlOiBSZW1vdmUgKi1pbmZvIGFuZCAqLWluc3RhbGwgc2luY2UgdGhleSBtYXRjaAotCXJlbGVhc2UtaW5mbyBhbmQgbXB3LWluc3RhbGwsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8ganVzdCBpZ25vcmUuCi0KLVRodSBKYW4gMjIgMDE6Mzg6MzMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXZlcnQgMyBKYW4gY2hhbmdlIGZvciBhbHBoYS1saW51eC1nbnVsaWJjMS4KLQotU2F0IEphbiAxNyAyMToyODowOCAxOTk4ICBQaWV0ZXIgTmFnZWwgPHBuYWdlbEBlcGl1c2UuY28uemE+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGdjY19pbmNsdWRlX2RpciBhbmQKLQlsb2NhbF9wcmVmaXggdG8gc3ViLW1ha2UgaW52b2NhdGlvbnMuCi0KLVNhdCBKYW4gMTcgMjE6MDQ6NTkgMTk5OCBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgbWFrZWZpbGUgZnJhZ21lbnRzIGluIHRoZSBzb3VyY2UKLQlkaXJlY3RvcnkuCi0KLUZyaSBKYW4gMTYgMDA6NDE6MzcgMTk5OCAgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KLQotCSogY29uZmlndXJlLmluOiBjaGVjayB3aGV0aGVyIGhvc3QgYW5kIHRhcmdldCBtYWtlZmlsZQotCWZyYWdtZW50cyBleGlzdCBiZWZvcmUgYWRkaW5nIHRoZW0gdG8gKl9tYWtlZmlsZV9mcmFnCi0KLVdlZCBKYW4gMTQgMjM6Mzk6MTAgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NvbmZpZ2RpcnMpOiBBZGQgY3lnbW9uIGZvciBzcGFyYzY0LWVsZi4KLQkKLVdlZCBKYW4gMTQgMTI6NDg6MDcgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgd2Ugb25seSByZXBsYWNlIFJQQVRIX0VOVlZBUiBvbgotCWxpbmVzIHdoaWNoIGJlZ2luIHdpdGggUlBBVEhfRU5WVkFSLCBpLmUuIGFkZCAiXiIgdG8gdGhlCi0JcmVnZXhwIHRvIHNlZC4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgUlJQQVRIX0VOVlZBUiBkb3duCi0JdG8gc3ViLW1ha2VzLgotCi0xOTk4LTAxLTEzICBMZWUgSXZlcnNvbiAgIChsZWVpQGFpLnNyaS5jb20pCi0KLQkqIGNvbmZpZy1tbC5pbiAobXVsdGktZG8pOiBMREZMQUdTIG11c3QgaW5jbHVkZSBtdWx0aWxpYgotCWRlc2lnbmF0b3IuCi0KLVR1ZSBKYW4gMTMgMDE6MTM6MjQgMTk5OCAgIFJvYmVydCBMaXBlIChyb2JlcnRsQGRnaWkuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpWzM0NTZdLWk1ODYtVW5peFdhcmU3LXN5c3Y1LgotCi1TdW4gSmFuICA0IDAxOjA2OjU1IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcuc3ViOiBBZGQgbWluZ3czMiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIG1oLW1pbmd3MzI6IE5ldyBmaWxlLgotCi1TYXQgSmFuICAzIDEyOjExOjA1IDE5OTggRnJhbnogU2lybCA8ZnJhbnouc2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRmluYWxpemUgc3VwcG9ydCBmb3Ige2FscGhhfHBvd2VycGN9Ki0qLWxpbnV4LWdudWxpYmMxCi0KLVN1biBEZWMgMjggMTE6Mjg6NTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9UQVJHRVQpOiBEbyBpbnN0YWxsLWdjYyBmaXJzdC4KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogUHJvdmlkZSBhIGRlZmluaXRpb24gZm9yIHN1YmRpcnMKLQl3aGljaCBkbyBub3QgdXNlIGF1dG9jb25mLgotCi1XZWQgRGVjIDI0IDIyOjQ2OjU1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBTeW5jIHdpdGggZWdjcy4gIFBpY2tzIHVwIG5ldyBhbHBoYSBzdXBwb3J0LAotCUJlT1MgJiBzb21lIGFkZGl0aW9uYWwgbGludXggc3VwcG9ydC4KLQotVHVlIERlYyAyMyAxMjo0NTo1MCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogSFAgOTAwMC84MDMgaXMgYSBQQTEuMSBtYWNoaW5lLgotCi0KLVN1biBEZWMgMjEgMTY6NTM6MTIgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnLCB0YXJnZXRfbWFrZWZpbGVfZnJhZyk6Ci0gICAgICAgIEhhbmRsZSBtdWx0aXBsZSBjb25maWcgZmlsZXMuCi0gICAgICAgIChhbHBoYS0qLWxpbnV4Kik6IFRyZWF0IGFscGhhLSotbGludXgqIGFzIGFscGhhLSotbGludXgqIGFuZAotICAgICAgICBhbHBoYS0qLSouCi0KLVRodSBEZWMgMTggMTM6MTM6MDMgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbWtkZXA6IE5ldyBmaWxlLgotCi1XZWQgRGVjIDE3IDA5OjUzOjAyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKi0qKTogQWxsb3cgY29uZmlndXJpbmcgb2YgbGliaWRlLCB2bWFrZSwgZXRjLgotCi1UdWUgRGVjIDE2IDE3OjM2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBsaWJndWkgZGlyZWN0b3J5LgotCShHREJfVEspOiBBZGQgYWxsLWxpYmd1aS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpYmd1aSBkaXJlY3RvcnkuCi0JKiBjb25maWd1cmU6IEFkZCBhbGwtbGliZ3VpIHRvIEdEQl9USy4KLQotTW9uIERlYyAxNSAxNjoxMjoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKG11bHRpZGlycyk6IEFkZCBtMzJyIHRvIG11bHRpbGliIGxpc3QuCi0KLUZyaSBEZWMgMTIgMTA6NDM6MzEgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWdwZXJmKTogQ2hhbmdlIGRlcGVuZGVuY3kgdG8KLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotVGh1IERlYyAxMSAyMzozMDo1MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgQmVPUyBzdXBwb3J0LgotCi1XZWQgRGVjIDEwIDE1OjEwOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNvdXJjZSBkaXJlY3RvcnkgY3ZzIHJlbmFtZWQgdG8gY3Zzc3JjOgotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQ2hhbmdlIGN2cyB0byBjdnNzcmMuCi0JKG5hdGl2ZV9vbmx5KTogTGlrZXdpc2UuCi0JKG5vY29uZmlnZGlycykgW3ZhcmlvdXMgY2FzZXNdOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IENoYW5nZSBhbGwtY3ZzIHRvIGFsbC1jdnNzcmMuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBDaGFuZ2UgY2hlY2stY3ZzIHRvIGNoZWNrLWN2c3NyYy4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQ2hhbmdlIGluc3RhbGwtY3ZzIHRvIGluc3RhbGwtY3Zzc3JjLgotCShDTEVBTl9NT0RVTEVTKTogQ2hhbmdlIGNsZWFuLWN2cyB0byBjbGVhbi1jdnNzcmMuCi0JKGFsbC1jdnNzcmMpOiBSZW5hbWUgdGFyZ2V0IGZyb20gYWxsLWN2cy4KLQotV2VkIERlYyAgMyAwNzo1NTo1OSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogRml4IHRoaW5rby4KLQotVHVlIERlYyAgMiAxMDo1NTozNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVF9DUk9TUyk6IERlZmluZS4KLQkoaW5zdGFsbC1jcm9zcywgaW5zdGFsbC1nY2MtY3Jvc3MpOiBOZXcgdGFyZ2V0cy4KLQotVHVlIERlYyAgMiAxMDowODozMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiB0YXJnZXQuCi0KLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotU3VuIE5vdiAzMCAxNjoxMjoyNyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlcyBmb3IgY3lnbW9uLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGN5Z21vbiBmb3Igc3BhcmMtZWxmIGFuZCBzcGFyY2xpdGUtYW91dC4KLQotVGh1IE5vdiAyNyAwMTozMTozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVCk6IERvIGluc3RhbGwtZ2NjIGZpcnN0LgotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBQcm92aWRlIGEgZGVmaW5pdGlvbiBmb3Igc3ViZGlycwotCXdoaWNoIGRvIG5vdCB1c2UgYXV0b2NvbmYuCi0KLVdlZCBOb3YgMjYgMTE6NTM6MzMgMTk5NyAgS2VpdGggU2VpdHogIDxrZWl0aHNAb25pb25zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwgQ2hhbmdlTG9nOiBtZXJnZSB3aXRoIGZvdW5kcnkncwotCTExLzE4Lzk3IGJ1aWxkIAotCi1XZWQgTm92IDI2IDE2OjA4OjUwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogRnJvbSBGcmFueiBTaXJsLgotCSogY29uZmlnLmd1ZXNzIChwb3dlcnBjKi0qLWxpbnV4KTogSGFuZGxlIGdsaWJjMiBiZXRhIHJlbGVhc2UKLQlmb3VuZCBvbiBSZWRIYXQgTGludXggc3lzdGVtcy4KLQotRnJpIE5vdiAyMSAwOTo1MTowMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoYWxwaGEgc3R1ZmYpOiBNZXJnZSB3aXRoIEZTRiB0byBhdm9pZCBpbmNvcnJlY3QKLQlndWVzc2VzLgotCi1UaHUgTm92IDEzIDExOjM4OjM3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtbmNyLXN5c3Y0LjMqKTogVHdlYWsuCi0KLU1vbiBOb3YgMTAgMTU6MjM6MjEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbHRtYWluLnNoOiBJZiBta2RpciBmYWlscywgY2hlY2sgd2hldGhlciB0aGUgZGlyZWN0b3J5IHdhcyBjcmVhdGVkCi0JYW55aG93IGJ5IHNvbWUgb3RoZXIgcHJvY2Vzcy4KLQotTW9uIE5vdiAxMCAxNDozODowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSBhbGwgZGlyZWN0b3JpZXMuCi0KLVN1biBOb3YgIDkgMTc6MzY6MjAgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgbmV3bGliLCBsaWJpYmVydHkgZGlyZWN0b3JpZXMKLQlmb3IgdGhlIEQzMFYuCi0KLVNhdCBOb3YgIDggMTQ6NDI6NTkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgdGFyZ2V0LWxpYmdsb3NzIG9uIHRoZSBEMzBWLgotCi1GcmkgTm92ICA3IDEwOjM0OjA5IDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGluY2x1ZGUvbGliaWJlcnR5Lmg6IEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3Jtcy4KLSAgICAgICAgKiBpbmNsdWRlL3JlbW90ZS1zaW0uaDogIEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3JhbXMuCi0KLVRodSBPY3QgMzAgMTE6MDk6MjkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgR0NDIG5vdy4KLQotTW9uIE9jdCAyNyAxMzoxNzoyNCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGEgInNlY29uZCBwYXNzIiBvZiB0d2Vha2luZyBub2NvbmZpZ2RpcnMsCi0JaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotTW9uIE9jdCAyNyAxMjowMzo1MyAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBjaGVjay10YXJnZXQtbGliaW8gZGVwZW5kcyBvbiBhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotU3VuIE9jdCAyNiAxMTo0ODoyNyAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgKG1hbmZyZWRAcy1kaXJla3RuZXQuZGUpCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAtbGVhbik6IENvbWJpbmVkIHdpdGggYG5vcm1hbCcgYm9vdHN0cmFwCi0JdGFyZ2V0cyB1c2luZyAiJEAiIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3Igc2ltaWxhciBidXQgbm90IGlkZW50aWNhbAotCXRhcmdldHMgd2l0aG91dCBoYXZpbmcgdG8gZHVwbGljYXRlIGNvZGUuCi0KLU1vbiBPY3QgMjAgMTU6Mjg6NDkgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRml4IHRvIHdvcmsgd2l0aCBERUMgQy4KLQotVHVlIE9jdCAgNyAyMzo1ODo1NyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIG1pcHMtdHgzOS1lbGYgdG8gbWFya2V0aW5nIG5hbWVzLgotCi1UdWUgT2N0ICA3IDE0OjI0OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRtYWluLnNoOiBIYW5kbGUgc3ltbGlua3MgaW4gZ2VuZXJhdGVkIHNjcmlwdC4KLQotV2VkIE9jdCAgMSAxMzoxMToyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIGF1dG9jb25mIHN0eWxlIGRpcmVjdG9yeSBvcHRpb25zOiAtLWJpbmRpciwKLQktLWRhdGFkaXIsIC0taW5jbHVkZWRpciwgLS1pbmZvZGlyLCAtLWxpYmRpciwgLS1saWJleGVjZGlyLAotCS0tbWFuZGlyLCAtLW9sZGluY2x1ZGVkaXIsIC0tc2JpbmRpciwgLS1zaGFyZWRzdGF0ZWRpciwKLQktLXN5c2NvbmZkaXIuCi0JKiBNYWtlZmlsZS5pbiAoc2JpbmRpciwgbGliZXhlY2Rpciwgc3lzY29uZmRpcik6IE5ldyB2YXJpYWJsZXMuCi0JKHNoYXJlZHN0YXRlZGlyLCBsb2NhbHN0YXRlZGlyLCBvbGRpbmNsdWRlZGlyKTogTmV3IHZhcmlhYmxlcy4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGJpbmRpciwgZGF0YWRpciwgaW5jbHVkZWRpciwKLQlpbmZvZGlyLCBsaWJkaXIsIGxpYmV4ZWNkaXIsIGxvY2Fsc3RhdGVkaXIsIG1hbmRpciwgb2xkaW5jbHVkZWRpciwKLQlzYmluZGlyLCBzaGFyZWRzdGF0ZWRpciwgYW5kIHN5c2NvbmZkaXIuCi0KLU1vbiBTZXAgMjkgMDA6Mzg6MDggMTk5NyBBYXJvbiBKYWNrc29uIDxqYWNrc29uQG5lZ3JpbC5tc3JjZS5ob3dhcmQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwLWxlYW4pOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDI0IDE4OjA2OjI3IDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYpOiAgUmVtb3ZlIHRjbCwgdGssIGV4cGVjdCwgZ2RiLCBpdGNsLCB0aXgsIGRiLAotIAlzbiwgYW5kIGdudXNlcnYgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVdlZCBTZXAgMjQgMTU6MTg6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IFR3ZWFrIHNoZWxsIHBhdHRlcm4gdG8gYXZvaWQgYnVnIGluIE5ldEJTRCAvYmluL3NoLgotCi1UaHUgU2VwIDE4IDIzOjU4OjI3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotKiBNYWtlZmlsZS5pbiAoY3Jvc3MpOiBOZXcgdGFyZ2V0LgotCi1UaHUgU2VwIDE4IDIxOjQzOjIzIDE5OTcgIEFsZXhhbmRyZSBPbGl2YSAgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCQkJICBKZWZmIExhdyAgICAgICAgIDxsYXdAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBOZXcgdGFyZ2V0cy4KLQkoYWxsLWJvb3RzdHJhcCk6IFJlbW92ZSBvdXRkYXRlZCBhbmQgY29uZnVzaW5nIHRhcmdldC4KLQkoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogRG9uJ3QgcGFzcyBCT09UX0NGTEFHUyBkb3duLgotCi1UaHUgU2VwIDE4IDE1OjM3OjQyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlICh0b29sZGlyKTogZW5hYmxlX2dkYnRrPVlFUyBmb3IgY3lnd2luMzIsIE5PIGZvcgotIAl3aW5kb3dzLiAgQ29uc2lzdGVudCB3aXRoIGdkYi9jb25maWd1cmUuCi0KLQotMTk5Ny0wOS0xNSAwMjozNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tdC1saW51eDogRGVmaW5lIENYWEZMQUdTIHRvIG1ha2Ugc3VyZSAtZnZ0YWJsZS10aHVua3MgaXMKLQl1c2VkLgotCSogY29uZmlndXJlLmluOiBOYW1lIExpbnV4IHRhcmdldCBmcmFnbWVudC4KLQotCSogY29uZmlndXJlOiBSZXdyaXRlIHNvIHRoYXQgcHJvamVjdCBNYWtlZmlsZSBmcmFnbWVudCBpcyBpbnNlcnRlZAotCWZpcnN0IGFuZCBhcHBlYXJzIGxhc3QgaW4gdGhlIHJlc3VsdGluZyBNYWtlZmlsZS4KLQotVHVlIFNlcCAxNiAwOTo1NTowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWl0Y2wpOiBJbnN0YWxsIHRjbCBmaXJzdC4KLQotU3VuIFNlcCAxNCAyMDo1Mzo0MiAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtY3lnd2luMzI6IG9rIHRvIGJ1aWxkIHNwbGl0IHRleGluZm8gZmlsZXMKLQotRnJpIFNlcCAxMiAxNjoxOToyMCAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCQotCSogY29uZmlndXJlLmluOiByZW1vdmUgYmlzb24gZnJvbSBub2NvbmZpZ2RpcnMgZm9yIEN5Z3dpbjMyIGhvc3QKLQotVGh1IFNlcCAxMSAxNjo0MDo0NiAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogQWxzbyByZW1vdmUgbWgtZnJhZyBtdC1mcmFnLgotCi0JKiBjb25maWd1cmUuaW4gKHNraXBkaXJzKTogQWRkIHRhcmdldC1saWJyeCBmb3IgTGludXguCi0JKGFscGhhLSotbGludXgqKTogVXNlIGNvbmZpZy9taC1lbGZhbHBoYXBpYyBhbmQgY29uZmlnL210LWVsZmFscGhhcGljLgotCi1XZWQgU2VwIDEwIDIxOjI5OjU0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCk6IE5ldyB0YXJnZXQuCi0KLVdlZCBTZXAgMTAgMTU6MTk6MjIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgJ2FtaWdhZG9zJyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eS4KLQotTW9uIFNlcCAgOCAyMDo0NjoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogTWVyZ2Ugd2l0aCBGU0YuCi0KLVN1biBTZXAgIDcgMTU6NTU6MjggMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCAibWFya2V0aW5nLW5hbWVzIiBwYXRjaC4KLQotRnJpIFNlcCAgNSAxNjoxMToyOCAxOTk3ICBKb2VsIFNoZXJyaWxsICAoam9lbEBPQVJjb3JwLmNvbSkKLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoKi0qLXJ0ZW1zKik6IERvIG5vdCBidWlsZCBsaWJnbG9zcyBmb3IgcnRlbXMuCi0KLUZyaSBTZXAgIDUgMTI6Mjc6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgdjg1MC1lbGYuCi0KLVdlZCBTZXAgIDMgMTI6MTU6MjQgMTk5NyAgQ2hyaXMgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZzogU2V0IENPTkZJR19TSEVMTCBpbiBsaWJ0b29sLgotCSogbHRtYWluLnNoOiBVc2UgQ09ORklHX1NIRUxMIGluc3RlYWQgb2YgL2Jpbi9zaAotCi1Nb24gU2VwICAxIDE2OjQ1OjQ0IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogU2V0IHRvIGxpYnJhcmllcyBpZiBlbmFibGVfbXVsdGlsaWIuCi0KLVdlZCBBdWcgMjcgMTY6MTU6MTEgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IFVwZGF0ZSBmcm9tIGdjYyBkaXJlY3RvcnkuCi0KLVR1ZSBBdWcgMjYgMTY6NDY6NDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXNpbSk6IERlcGVuZHMgb24gYWxsLXJlYWRsaW5lLgotCi1XZWQgQXVnIDIwIDE5OjU3OjM3IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OLCBZQUNDKTogVXNlICQkcy4KLQkoYWxsLWJpc29uKTogRGVwZW5kIG9uIGFsbC10ZXhpbmZvLgotCi1UdWUgQXVnIDE5IDAxOjQxOjMyIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogQWRkIC1MIGZsYWcuCi0JKFlBQ0MpOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAxOCAxMTozMDo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuIAotCQotCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi1Nb24gQXVnIDE4IDExOjMwOjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuIAotCQotCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAwOToyNDowNiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIG1pcHN0eDM5LiAgRGVsZXRlIHIzOTAwLgotCi1Nb24gQXVnIDE4IDE3OjIwOjEwIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtYXV0b2NvbmYpOiBEZXBlbmRzIG9uIGFsbC10ZXhpbmZvLgotCi1GcmkgQXVnIDE1IDIzOjA5OjI2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKHtwb3dlcnBjLHJzNjAwMH0qLSotKik6IFVwZGF0ZSB0byBjdXJyZW50IEFJWCBhbmQKLQllYWJpIHRhcmdldHMuCi0KLVRodSBBdWcgMTQgMTQ6NDI6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEdldCBDRkxBR1MgYW5kIENYWEZMQUdTIGZyb20gTWFrZWZpbGUsIGlmIHBvc3NpYmxlLgotCi0JKiBjb25maWd1cmU6IFdoZW4gaGFuZGxpbmcgYSBDYW5hZGlhbiBDcm9zcywgaGFuZGxlIFlBQ0MgYXMgd2VsbCBhcwotCUJJU09OLiAgSnVzdCBzZXQgQklTT04gdG8gYmlzb24uICBXaGVuIHNldHRpbmcgWUFDQywgcHJlZmVyIGJpc29uLgotICAgICAgICAqIE1ha2VmaWxlLmluIChhbGwtYmlzb24pOiBEZXBlbmQgdXBvbiBhbGwtdGV4aW5mby4KLQotVHVlIEF1ZyAxMiAyMDowOTo0OCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IGJpc29uLCBub3QgYnlhY2Mgb3IgYmlzb24gLXkuCi0JKFlBQ0MpOiBiaXNvbiAteSBvciBieWFjYyBvciB5YWNjLgotCSh2YXJpb3VzKTogQWRkICotYmlzb24gYXMgYXBwcm9wcmlhdGUuCi0JKHRheik6IE5vIG5lZWQgdG8gbWVzcyB3aXRoIEJJU09OIGFueW1vcmUuCi0KLVR1ZSBBdWcgMTIgMjI6MzM6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IElmIE9TVFlQRSBtYXRjaGVzICp3aW4zMiosIHRyeSB0byBmaW5kIGEgZ29vZCB2YWx1ZSBmb3IKLQlDT05GSUdfU0hFTEwuCi0KLVN1biBBdWcgMTAgMTQ6NDE6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIEFNX0lOSVRfQVVUT01BS0UgaW4KLQljb25maWd1cmUuaW4gaWYgaXQgaXMgcHJlc2VudC4KLQotU2F0IEF1ZyAgOSAwMDo1ODowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChMRF9GT1JfVEFSR0VUKTogQ2hhbmdlIGxkLm5ldyB0byBsZC1uZXcuCi0KLUZyaSBBdWcgIDggMTY6MzA6MTMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGBhcmMnIGNwdS4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0JKiBjb25maWctbWwuaW46IExpa2V3aXNlLgotCi1UaHUgQXVnICA3IDExOjAyOjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoSU5TVEFMTF9YMTFfTU9EVUxFUykpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4KLQotV2VkIEF1ZyAgNiAxNjoyNzoyOSAxOTk3ICBDaHJpcyBQcm92ZW56YW5vICA8cHJvdmVuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQ2hhbmdlZCBzZWQgZGVsaW1pdGVyIGZyb20gJzonIHRvICd8JyB3aGVuCi0JYXR0ZW1wdGluZyB0byBzdWJzdGl0dXRlICR7Y29uZmlnX3NoZWxsfSBmb3IgU0hFTEwuIE9uCi0JTlQgJHtjb25maWdfc2hlbGx9IG1heSBjb250YWluIGEgJzonIGluIGl0LgotCi1XZWQgQXVnICA2IDEyOjI5OjA1IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IEZpeCBmb3Igbm9uLWJhc2ggc2hlbGxzLgotCi1XZWQgQXVnICA2IDAwOjQyOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFTX0ZPUl9UQVJHRVQpOiBDaGFuZ2UgYXMubmV3IHRvIGFzLW5ldy4KLQotVHVlIEF1ZyAgNSAxNDowODo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChOTV9GT1JfVEFSR0VUKTogQ2hhbmdlIG5tLm5ldyB0byBubS1uZXcuCi0KLQkqIHlsd3JhcDogSWYgdGhlIHByb2dyYW0gaXMgYSByZWxhdGl2ZSBwYXRoLCBmb3JjZSBpdCB0byBiZQotCWFic29sdXRlLgotCi1UdWUgQXVnICA1IDEyOjEyOjQ0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlICh0b29sZGlyKTogU2V0IEJJU09OIHRvIGBiaXNvbiAteScgYW5kIG5vdCBqdXN0IGJpc29uLgotCi1Nb24gQXVnICA0IDIyOjU5OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBXaGVuIHdpbnN1cC9NYWtlZmlsZSBwcmVzZW50LAotIAljb3JyZWN0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGJ1aWxkIGRpcmVjdG9yeSAkKFRBUkdFVF9TVUJESVIpL3dpbnN1cAotIAlmb3IgbGlicmFyaWVzLgotCi1Nb24gQXVnICA0IDEyOjQwOjI0IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IEZpeCBoYW5kbGluZyBvZiBtYWNyb3Mgd2l0aCB2YWx1ZXMKLSAJc2VwYXJhdGVkIGJ5IHNwYWNlcy4KLQotVGh1IEp1bCAzMSAxOTo0OTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHlsd3JhcDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIHlsd3JhcC4KLQotCSogbHRtYWluLnNoOiBIYW5kbGUgL2Jpbi9zaCBhdCBzdGFydCBvZiBpbnN0YWxsIHByb2dyYW0uCi0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgbHRjb25maWcsIGx0bWFpbi5zaCwgYW5kIG1pc3NpbmcuCi0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IE5ldyBmaWxlcywgZnJvbSBsaWJ0b29sIDEuMC4KLQkqIG1pc3Npbmc6IE5ldyBmaWxlLCBmcm9tIGF1dG9tYWtlIDEuMi4KLQotVGh1IEp1bCAyNCAxMjo1Nzo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBUcmVhdCB0aXggbGlrZSB0aywgcHV0dGluZyBpdCBpbiBYMTFfTU9EVUxFUy4gIEFkZAotCWNoZWNrLXRrIHRvIENIRUNLX1gxMV9NT0RVTEVTLgotCi1XZWQgSnVsIDIzIDE3OjAzOjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBGU0YuCi0KLVR1ZSBKdWwgMjIgMTk6MDg6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggRlNGLgotCi1UdWUgSnVsIDIyIDE0OjUwOjQyIDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogY29uZmlndXJlOiBUcmVhdCBtc2Rvc2RqZ3BwIGxpa2UgZ28zMi4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuICBEb24ndCByZW1vdmUgZ3Byb2YgZm9yIGdvMzIuCi0KLQkqIGNvbmZpZ3VyZTogQ2hhbmdlIE1ha2VmaWxlLnRlbTIgdG8gTWFrZWZpbGUudG0yLgotCi1Nb24gSnVsIDIxIDEwOjMxOjI2IDE5OTcgIFN0ZXBoZW4gUGV0ZXJzICA8c3BldGVyc0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEZvciBhbHBoYS1kZWMtb3NmKiwgZG9uJ3QgaWdub3JlIGdyZXAuCi0KLVR1ZSBKdWwgMTUgMTQ6MzM6MDMgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLXNoIChjaG1vZGNtZCk6IFNldCB0byBudWxsIGlmIHRoZSBEU1QgZGlyZWN0b3J5IGFscmVhZHkKLQlleGlzdHMuICBTYW1lIGFzIE5vdiAxMXRoIGNoYW5nZS4KLQotTW9uIEp1bCAxNCAxMTowMToxNSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlIChHREJfVEspOiBOZWVkcyBpdGNsIGFuZCB0aXguIAotCi1Nb24gSnVsIDE0IDAwOjMyOjEwIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBVcGRhdGUgZnJvbSBGU0YuCi0KLUZyaSBKdWwgMTEgMTE6NTc6MTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChHREJfVEspOiBEZXBlbmQgb24gaXRjbCBhbmQgdGl4LgotCi1GcmkgSnVsICA0IDEzOjI1OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfUFJPR1JBTV9BUkdTKTogTmV3IHZhcmlhYmxlLgotCShJTlNUQUxMX1BST0dSQU0pOiBVc2UgJChJTlNUQUxMX1BST0dSQU1fQVJHUykuCi0JKElOU1RBTExfU0NSSVBUKTogTmV3IHZhcmlhYmxlLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gSU5TVEFMTF9TQ1JJUFQuCi0JKiBjb25maWd1cmUuaW46IElmIGhvc3QgaXMgKi0qLWN5Z3dpbjMyKiwgc2V0IElOU1RBTExfUFJPR1JBTV9BUkdTCi0JdG8gLXguCi0JKiBpbnN0YWxsLXNoOiBBZGQgc3VwcG9ydCBmb3IgLXggb3B0aW9uLgotCi1Nb24gSnVuIDMwIDE1OjUxOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogVHJlYXQgdGl4IGxpa2UgaXRjbC4KLQotVGh1IEp1biAyNiAxMzo1OToxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChXSU5EUkVTKTogTmV3IHZhcmlhYmxlLgotCShXSU5EUkVTX0ZPUl9UQVJHRVQpOiBOZXcgdmFyaWFibGUuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IEFkZCBXSU5EUkVTX0ZPUl9UQVJHRVQuCi0JKEVYVFJBX0hPU1RfRkxBR1MpOiBBZGQgV0lORFJFUy4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogQWRkIFdJTkRSRVMuCi0JKEVYVFJBX0dDQ19GTEFHUyk6IEFkZCBXSU5EUkVTLgotCSgkKERPX1gpKTogUGFzcyBkb3duIFdJTkRSRVMuCi0JKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IFNldCBXSU5EUkVTIHdoZW4gY29uZmlndXJpbmcuCi0JKiBjb25maWd1cmU6IFRyZWF0IFdJTkRSRVMgbGlrZSBETExUT09MLCBhbmQgV0lORFJFU19GT1JfVEFSR0VUIGxpa2UKLQlETExUT09MX0ZPUl9UQVJHRVQuCi0KLVdlZCBKdW4gMjUgMTU6MDE6MjYgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyZSBzaW0gYmVmb3JlIGdkYiBmb3Igd2luMzIteC1wcGMKLQotV2VkIEp1biAyNSAxMjoxODo1NCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQlNb3ZlIGdwZXJmIGludG8gdGhlIHRvcGxldmVsLCBmcm9tIGxpYmcrKy4KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3Rvb2xzKTogQWRkIHRhcmdldC1ncGVyZi4KLQkobmF0aXZlX29ubHkpOiBBZGQgdGFyZ2V0LWdwZXJmLgotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtZ3BlcmYpOiBOZXcgdGFyZ2V0LCBkZXBlbmQgb24KLQlhbGwtdGFyZ2V0LWxpYmcrKy4KLQkoY29uZmlndXJlLXRhcmdldC1ncGVyZik6IEVtcHR5IHJ1bGUuCi0JKEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBhbGwtdGFyZ2V0LWdwZXJmLgotCShDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBBZGQgY29uZmlndXJlLXRhcmdldC1ncGVyZi4KLQkoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpOiBBZGQgY2hlY2stdGFyZ2V0LWdwZXJmLgotCShJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKTogQWRkIGluc3RhbGwtdGFyZ2V0LWdwZXJmLgotCShDTEVBTl9UQVJHRVRfTU9EVUxFUyk6IEFkZCBjbGVhbi10YXJnZXQtZ3BlcmYuCi0KLU1vbiBKdW4gMjMgMTA6NTE6NTMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotIAotCSogY29uZmlnLnN1YiAobW4xMDIwMCk6IFJlY29nbml6ZSBuZXcgYmFzaWMgbWFjaGluZS4KLQotVGh1IEp1biAxOSAxNDoxNjo0MiAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IEVOQUJMRV9NVUxUSUxJQiwgc28gd2UnbGwgYmUgcGFzc2luZwotCS0tZW5hYmxlLW11bHRpbGliIGRvd24gdG8gc3ViZGlyczsgc2V0dGluZyBUQVJHRVRfU1VCRElSIHdhcyBlbm91Z2guCi0KLVR1ZSBKdW4gMTcgMTU6MzE6MjAgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIHdlJ3JlIGJ1aWxkaW5nIG1pcHMtc2dpLWlyaXg2KiBuYXRpdmUsIHR1cm4gb24KLQlFTkFCTEVfTVVMVElMSUIgYW5kIHNldCBUQVJHRVRfU1VCRElSLgotCi1UdWUgSnVuIDE3IDEyOjIwOjU5IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1zbik6IERlcGVuZCBvbiBhbGwtZ3JlcC4KLQotTW9uIEp1biAxNiAxMToxMToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG1oLXBwY3BpYyBhbmQgbXQtcHBjcGljIGZvciBwb3dlcnBjKi0qIHRhcmdldHMuCi0KLQkqIGNvbmZpZ3VyZTogU2V0IENGTEFHUyBhbmQgQ1hYRkxBR1MsIGFuZCBzdWJzdGl0dXRlIHRoZW0gaW50bwotCU1ha2VmaWxlLiAgRnJvbSBKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgotCSogTWFrZWZpbGUuaW46IEFkZCBjb21tZW50IGZvciBDRkxBR1MgYW5kIENYWEZMQUdTLgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEJJU09ORklMRVMpOiBSZW1vdmUuCi0JKHRheik6IERvbid0IGZ1dHogd2l0aCBESVNUQklTT05GSUxFUy4gIENoYW5nZSBCSVNPTiB0byB1c2UKLQkkKERFRkFVTFRfWUFDQykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgaXRsLCBkYiwgc24sIGV0Yy4sIHdoZW4gYnVpbGRpbmcgZm9yIG5hdGl2ZQotIAljeWd3aW4zMi4KLQotCSogTWFrZWZpbGUuaW4gKExEKTogTmV3IHZhcmlhYmxlLgotCShFWFRSQV9IT1NUX0ZMQUdTKTogUGFzcyBkb3duIExELgotCSgkKERPX1gpKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMTYgMTE6MTA6MzUgMTk5NyAgUGhpbGlwIEJsdW5kZWxsICA8UGhpbGlwLkJsdW5kZWxsQHBvYm94LmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgJChTSEVMTCkgd2hlbiBleGVjdXRpbmcgaW5zdGFsbC1zaC4KLQotRnJpIEp1biAxMyAxMDoyMjo1NiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IFN0cmlwIG91dCBhbnkgc3VwcGxpZWQgLS1idWlsZCBhcmd1bWVudAotIAliZWZvcmUgYWRkaW5nIG91ciBvd24uIEFsd2F5cyBhZGQgLS1idWlsZC4KLQotVGh1IEp1biAxMiAyMToxMjoyOCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IFBhc3MgLS1idWlsZCBpZiB3ZSdyZSBkb2luZwotCWEgY3Jvc3MtY29tcGlsZS4KLQotRnJpIEp1biAgNiAyMTozODo0MCAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFVzZSAnfCcgaW5zdGVhZCBvZiAiOiIgYXMgdGhlIHNlcGVyYXRvciBpbgotCXNlZC4gT3RoZXJ3aXNlIHNlZCBjaG9rZXMgb24gTlQgcGF0aCBuYW1lcyB3aXRoIGRyaXZlCi0JZGVzaWduYXRvcnMuIEFsc28gbG9vayBmb3IgIj86KiIgYXMgdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBpbiBhbgotCWFic29sdXRlIHBhdGhuYW1lLgotCi1Nb24gSnVuICAyIDEzOjA1OjIwIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBTdXBwb3J0IGZvciByMzkwMC4KLQotV2VkIE1heSAyMSAxNzozMzozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGluc3RhbGwtc2gsIG5vdCBpbnN0YWxsLnNoLgotCi1XZWQgTWF5IDE0IDE2OjA2OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEltcHJvdmUgY2hlY2sgZm9yIEJJU09OIHNvIGl0IGRvZXNuJ3QgdHJ5IHRvCi0JYXBwbHkgaXQgdHdpY2UuCi0KLUZyaSBNYXkgIDkgMTc6MjI6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9NT0RVTEVTKTogUHV0IGluc3RhbGwtb3Bjb2RlcyBiZWZvcmUKLQlpbnN0YWxsLWJpbnV0aWxzLgotCi1UaHUgTWF5ICA4IDE3OjI5OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBhdXRvbWFrZSB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkIGF1dG9tYWtlLgotCi1UdWUgTWF5ICA2IDE1OjQ5OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEZWZhdWx0IENYWCB0byBjKyssIG5vdCBnY2MuCi0JKiBNYWtlZmlsZS5pbiAoQ1hYKTogU2V0IHRvIGMrKywgbm90IGdjYy4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBXaGVuIGNyb3NzLCB0cmFuc2Zvcm0gYysrLCBub3QgZ2NjLgotCi1UaHUgTWF5ICAxIDEwOjExOjQzIDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGluc3RhbGwtc2g6IHRyeSBhcHBlbmRpbmcgYSAuZXhlIGlmIHNvdXJjZSBmaWxlIGRvZXNuJ3QKLQlleGlzdAotCi1XZWQgQXByIDMwIDEyOjA1OjM2IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBUdXJuIG9uIG11bHRpbGliIGJ5IGRlZmF1bHQuCi0JKGNyb3NzX29ubHkpOiBSZW1vdmUgdGFyZ2V0LWxpYmliZXJ0eS4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nY2MpOiBEb24ndCBkZXBlbmQgb24gbGliaWJlcnR5LgotCi1Nb24gQXByIDI4IDE4OjM5OjQ1IDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogaW1wcm92ZSBhbGdvcml0aG0gZm9yIHJlY29nbml6aW5nIEdudSBIdXJkIHg4Ni4KLQotVGh1IEFwciAyNCAxOTozMDowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgbXB3LWluc3RhbGwuCi0JKERJU1RCSVNPTkZJTEVTKTogQWRkIGxkL01ha2VmaWxlLmluCi0KLVR1ZSBBcHIgMjIgMTc6MTc6MjggMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBpZiB0YXJnZXQgaXMgY3lnd2luMzIgYnV0IGhvc3QgaXNuJ3QgY3lnd2luMzIsCi0JZG9uJ3QgY29uZmlndXJlIGdkYiB0Y2wgdGsgZXhwZWN0LCBub3QganVzdCBnZGIuCi0KLU1vbiBBcHIgMjEgMTM6MzM6MzkgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGdudXNlcnYgZXZlcnl3aGVyZSBzbiBhcHBlYXJzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtZ251c2Vydi4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLWdudXNlcnYuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtZ251c2Vydi4KLQkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLWdudXNlcnYuCi0JKGFsbC1nbnVzZXJ2KTogTmV3IHRhcmdldC4KLQotVGh1IEFwciAxNyAxMzo1NzowNiAxOTk3ICBQZXIgRm9nZWxzdHJvbSAgPHBlZm9Ab3BlbmJzZC5vcmc+Ci0KLQkqIGNvbmZpZy5ndWVzczogRml4ZXMgZm9yIE1JUFMgT3BlbkJTRCBzeXN0ZW1zLgotCi1UdWUgQXByIDE1IDEyOjIxOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfWEZPUk0pOiBSZW1vdmUuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBJTlNUQUxMX1hGT1JNLgotCi0JKiBta2luc3RhbGxkaXJzOiBOZXcgZmlsZSwgY29waWVkIGZyb20gYXV0b21ha2UuCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbGRpcnMpOiBSZW5hbWUgZnJvbSBpbnN0YWxsLWRpcnMuICBVc2UKLQlta2luc3RhbGxkaXJzLiAgQ2hhbmdlIGFsbCB1c2Vycy4KLQkoREVWT19TVVBQT1JUKTogQWRkIG1raW5zdGFsbGRpcnMuCi0KLU1vbiBBcHIgMTQgMTE6MjE6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLXNoOiBSZW5hbWUgZnJvbSBpbnN0YWxsLnNoLgotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgotCShERVZPX1NVUFBPUlQpOiBMaWtld2lzZS4KLQotCSogY29uZmlndXJlOiBVc2UgJHtjb25maWdfc2hlbGx9IHdpdGggJHttb3ZlaWZjaGFuZ2V9LiAgRnJvbSBUaG9tYXMKLQlHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT4uCi0KLUZyaSBBcHIgMTEgMTY6Mzc6MTAgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgT3BlbkJTRCBzeXN0ZW1zIGNvcnJlY3RseS4KLQotRnJpIEFwciAxMSAxNzowNzowNCAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBSRUFETUUsIE1ha2VmaWxlLmluIChFVENfU1VQUE9SVCk6IFJlbW92ZSByZWZlcmVuY2VzIHRvCi0JY2ZnLXBhcGVyKiwgY29uZmlndXJlLnt0ZXhpLG1hbixpbmZvKn0uXwotCi1TdW4gQXByICA2IDE4OjQ3OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLm5vcm1hbCk6IEVuc3VyZSB0aGF0IGdjYyBpcyBidWlsdCBhZnRlciBhbGwKLQl0aGUgeDExIC0gaWUgZ2RiIC0gdGFyZ2V0cy4KLQotVHVlIEFwciAgMSAxNjoyODo1MCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBEb24ndCBydW4gY29uZi1hLWdhcy4KLQotTW9uIE1hciAzMSAxNjoyNjo1NSAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaHBwYTEuMS0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgotCi1TdW4gTWFyIDMwIDEyOjM4OjI3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBub2NvbmZpZ2RpcnMgY2FzZSBzaW5jZSBnZGIgYWxzbwotCWNvbmZpZ3VyZXMgYW5kIGJ1aWxkcyBmb3IgdGljODAtY29mZi4KLQotRnJpIE1hciAyOCAxODoyODo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogU2V0IGNhY2hlX2ZpbGUgdG8gY29uZmlnLmNhY2hlLgotCSogTWFrZWZpbGUuaW4gKGxvY2FsLWRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUuCi0KLVdlZCBNYXIgMjYgMTg6NDk6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLVdlZCBNYXIgMjYgMTA6Mzg6MjUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGljODAtKi0qKTogUmVtb3ZlIEcrKyBsaWJyYXJpZXMgYW5kIGxpYmdsb3NzIGZyb20KLQlub2NvbmZpZ2RpcnMuCi0KLU1vbiBNYXIgMjQgMTU6MDI6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kaXJzKTogRG9uJ3QgY3Jhc2ggaWYgcHJlZml4LCBhbmQgaGVuY2UKLQlNQUtFRElSUywgaXMgZW1wdHkuCi0KLU1vbiBNYXIgMjQgMTI6NDA6NTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogVHdlYWsgbW4xMDMwMCBlbnRyeS4KLQotRnJpIE1hciAyMSAxNTozNToyNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogUHV0IHNpbSBiZWZvcmUgZ2RiLCBzbyBnZGIncwotCWNvbmZpZ3VyZS50Z3QgY2FuIGRldGVybWluZSBpZiB0aGUgc2ltdWxhdG9yIHdhcyBjb25maWd1cmVkLgotCi1TdW4gTWFyIDE2IDE2OjA3OjA4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNb3ZlIEJlT1MgJG9zIGNhc2UgdG8gYmUgd2l0aCBvdGhlciBDeWdudXMKLQlsb2NhbCBjYXNlcy4KLQotU3VuIE1hciAxNiAwMTozNDo1NSAxOTk3ICBNYXJ0aW4gSHVudCA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZW1vdmUgbWlzcGxhY2VkIGNvbW1lbnQgdGhhdCBicm9rZSBMaW51eC4KLQotU2F0IE1hciAxNSAyMjo1MDoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIEJlT1Mgc3VwcG9ydC4KLQotTW9uIE1hciAxMCAxMzozMDoxMSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDSEVDS19YMTFfTU9EVUxFUyk6IERvbid0IHJ1biBjaGVjay10ay4KLQotV2VkIE1hciAgNSAxMjowOToyOSAxOTk3ICBNYXJ0aW4gIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogUmVtb3ZlIHRjbCBhbmQgdGsgZnJvbQotCW5vY29uZmlnZGlycyBmb3IgY3lnd2luMzIgYnVpbGRzLgotCi1GcmkgRmViIDI4IDE4OjIwOjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IFJlbW92ZSBsZCBmcm9tIG5vY29uZmlnZGlycy4KLQotVGh1IEZlYiAyNyAxNDo1NzoyNiAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMsIEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IFJlbW92ZQotCW1ha2UtYWxsLmNvbSwgdXNlIG1ha2VmaWxlLnZtcyBpbnN0ZWFkLgotCi1UdWUgRmViIDI1IDE4OjQ2OjE0IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1sbmV3cyouCi0KLVR1ZSBGZWIgMjUgMTM6MTk6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgdGFyZ2V0LW5ld2xpYiwKLSAJdGFyZ2V0LWV4YW1wbGVzIGFuZCB0YXJnZXQtbGliaWJlcnR5IGZvciBkMzB2LgotCi1GcmkgRmViIDIxIDE3OjU2OjI1IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEVuYWJsZSBsZCBmb3IgZDMwdi4KLQotRnJpIEZlYiAyMSAyMDo1ODo1MSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBCdWlsZCBjb21waWxlci4KLQotU3VuIEZlYiAxNiAxNTo0MTowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qKTogUmVtb3ZlIHNpbSBkaXJlY3RvcnkgZnJvbSBsaXN0IG9mCi0gCXVuc3VwcG9ydGVkIGQzMHYgZGlyZWN0b3JpZXMKLQotVHVlIEZlYiAxOCAxNzozMjo0MiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBBZGQgZDMwdiB0YXJnZXQgY3B1LiAKLQkKLVRodSBGZWIgMTMgMjI6MDQ6NDQgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCi0JKiBtYWtlLWFsbC5jb206IFJlbW92ZS4KLQotV2VkIEZlYiAxMiAxMjo1NDoxOCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBBZGQgTElCR0NDMl9ERUJVR19DRkxBR1MuCi0KLVNhdCBGZWIgIDggMjA6MzY6NDkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtaXRjbCk6IFRoZSBydWxlIGlzIGFsbC1pdGNsLCBub3QgYWxsLXRjbC4KLQotVHVlIEZlYiAgNCAxMTozOToyOSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1kYi4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVjIGNoZWNrLWRiLgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWRiLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4tZGIuCi0KLU1vbiBGZWIgIDMgMTM6Mjk6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggbGF0ZXN0IEZTRiBzb3VyY2VzLgotCi1UdWUgSmFuIDI4IDA5OjIwOjM3IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWl0Y2wuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay1pdGNsLgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWl0Y2wuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1pdGNsLgotCi1UaHUgSmFuIDIzIDAxOjQ0OjI3IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYnVpbGQgZ2RiIGZvciBtbjEwMjAwCi0KLUZyaSBKYW4gMTcgMTU6MzI6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtd2luc3VwKTogRGVwZW5kIG9uIGFsbC10YXJnZXQtbGliaW8uCi0KLU1vbiBKYW4gMTMgMjI6NDY6NTQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IFR1cm4gb2ZmIG1vc3QgdGFyZ2V0cyByaWdodCBub3cuCi0KLUZyaSBKYW4gIDMgMTY6MDQ6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRUlORk8pOiBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgTWFrZWZpbGUsCi0JcmF0aGVyIHRoYW4gdGhlIG1ha2VpbmZvIHByb2dyYW0uCi0JKGRvLWluZm8pOiBEZXBlbmQgdXBvbiBhbGwtdGV4aW5mby4KLQotVHVlIERlYyAzMSAxNjowMDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIHVzZXMgb2YgY29uZmlnL21oLWxpbnV4LgotCi0JKiBjb25maWcuc3ViLCBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggbGF0ZXN0IEZTRiBzb3VyY2VzLgotCi1GcmkgRGVjIDI3IDIzOjA0OjMzIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViIChjYXNlICRiYXNpY19tYWNoaW5lKTogQWRkIHRpYzgwIGVudHJpZXMuCi0KLUZyaSBEZWMgMjcgMTI6MDc6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViLCBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggbGF0ZXN0IEZTRiBzb3VyY2VzLgotCi1XZWQgRGVjIDE4IDIyOjQ2OjM5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWJ1aWxkLmluOiBCdWlsZCBsZCBiZWZvcmUgZ2NjLCB1c2UgTmV3Rm9sZGVyUmVjdXJzaXZlLgotCSogbXB3LWNvbmZpZy5pbjogVGVzdCBmb3IgTmV3Rm9sZGVyUmVjdXJzaXZlLgotCSogbXB3LWluc3RhbGw6IFVzZSBzeW1ib2xpYyBuYW1lIGZvciBzdGFydHVwIGZpbGVuYW1lLgotCSogbXB3LVJFQURNRTogQWRkIHZhcmlvdXMgYWRkaXRpb25hbCBkZXRhaWxzLgotCi1XZWQgRGVjIDE4IDEzOjExOjQ2IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDYqKTogUmVtb3ZlIGJpbnV0aWxzIGZyb20gbm9jb25maWdkaXJzLgotCi1XZWQgRGVjIDE4IDEwOjI5OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEbyBidWlsZCBnY2MgYW5kIHRoZSB0YXJnZXQgbGlicmFyaWVzIGZvcgotCXRoZSBtbjEwMjAwLgotCi1XZWQgRGVjICA0IDE2OjUzOjA1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgYXZvaWQgYnVpbGRpbmcgZ2RiIGZvciBtbjEwMzAwIGFueSBtb3JlCi0JKiBNYWtlZmlsZS5pbjogZG91YmxlLXF1b3RlIEdDQ19GT1JfVEFSR0VUIGxpbmUgaW4gRVhUUkFfR0NDX0ZMQUdTCi0JaW5zdGVhZCBvZiBzaW5nbGUtcXVvdGluZyBpdC4KLQotVHVlIERlYyAgMyAyMzoyNjo1MCAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIC0td2l0aC1zdGFicyBvbiBJUklYIDYuCi0KLVR1ZSBEZWMgIDMgMDk6MDU6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtMzJyKTogQnVpbGQgZ2RiLCBsaWJnKysgbm93LgotCi1TdW4gRGVjICAxIDAwOjE4OjU5IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDYqKTogIFJlbW92ZSBnZGIgYW5kIHJlbGF0ZWQKLQlkaXJlY3RvcmllcyBmcm9tIG5vY29uZmlnZGlycy4KLQotVHVlIE5vdiAyNiAxMTo0NTozMyAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IGFkZGVkIG1pcHMxNiBjb25maWd1cmF0aW9uCi0KLVNhdCBOb3YgMjMgMTk6MjY6MjIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgZDEwdi11bmtub3duLgotCi1TYXQgTm92IDIzIDEwOjIzOjAxIDE5OTYgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgdjg1MC11bmtub3duLgotCi1UaHUgTm92IDIxIDE2OjE5OjQ0IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBhZGQgZmluZHV0aWxzCi0JKiBjb25maWd1cmUuaW46IGFkZCBmaW5kdXRpbHMgdG8gbGlzdCBvZiBob3N0X3Rvb2xzCi0KLVdlZCBOb3YgMjAgMTA6MDk6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgbW4xMDIwMCBhbmQgbW4xMDMwMC4KLQotVHVlIE5vdiAxOSAxNjozNToxNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qKTogRG8gbm90IGJ1aWxkIGxpYnJ4LgotCi1Nb24gTm92IDE4IDEzOjI4OjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtbjEwMzAwKTogQnVpbGQgZXZlcnl0aGluZyBleGNlcHQgZ2RiICYgbGliZ2xvc3MuCi0KLVdlZCBOb3YgMTMgMTQ6NTk6NDYgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogIFBhdGNoIGZvciBEYW5zayBEYXRhIEVsZWt0cm9uaWsgc2VydmVycywKLQlmcm9tIE5pZWxzIFNrb3UgT2xzZW4gPG5zb0BkZGUuZGs+LgotCi0JRm9yIG5jciwgdXNlIC9iaW4vdW5hbWUgcmF0aGVyIHRoYW4gdW5hbWUsIHNpbmNlIEdOVSB1bmFtZSBkb2VzIG5vdAotCXN1cHBvcnQgLXAuICBTdWdnZXN0ZWQgYnkgTWFyayBNaXRjaGVsbCA8bW1pdGNoZWxsQHVzYS5uZXQ+LgotCi0JUGF0Y2ggZm9yIE1JUFMgUjQwMDAgcnVubmluZyBTeXN0ZW0gViwKLQlmcm9tIEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPi4KLQotCUZpeCB0aGlua28gZm9yIG5leHRzdGVwLgotCi0JUGF0Y2ggZm9yIE9TRjEgaW4gaT84NiwgZnJvbSBEYW4gTXVycGh5IDxkbG1Ab3NmLm9yZz4gdmlhIEhhcmxhbiBTdGVubi4KLQotCVNhdCBKdW4gMjQgMTg6NTg6MTcgMTk5NSAgTW9ydGVuIFdlbGluZGVyICA8dGVycmErQGNzLmNtdS5lZHU+Ci0JKiBjb25maWcuZ3Vlc3M6IEd1ZXNzIG1pcHMtZGVjLW1hY2hfYnNkNC4zLgotCi0JVGh1IE9jdCAxMCAwNDowNzowNCAxOTk2ICBIYXJsYW4gU3Rlbm4gPGhhcmxhbkBwZmNzLmNvbT4KLQkqIGNvbmZpZy5ndWVzcyAoaT84Ni1uY3Itc3lzdiopOiAgRW1pdCBqdXN0IGVub3VnaCBvZiB0aGUgbWlub3IKLQlyZWxlYXNlIG51bWJlcnMuCi0JKiBjb25maWcuZ3Vlc3MgKG1pcHMtbWlwcy1yaXNjb3MqKTogIEVtaXQganVzdCBlbm91Z2ggb2YgdGhlCi0JcmVsZWFzZSBudW1iZXIuCi0KLQlUdWUgT2N0ICA4IDEwOjM3OjIyIDE5OTYgIEZyYW5rIFZhbmNlIDxmdmFuY2VAd2FpaS5jb20+Ci0JKiBjb25maWcuZ3Vlc3MgKHNwYXJjLWF1c3BleC1zdW5vcyopOiAgQWRkZWQuCi0JKGYzMDAtZnVqaXRzdS0qKTogQWRkZWQuCi0KLQlXZWQgU2VwIDI1IDIyOjAwOjM1IDE5OTYgIEplZmYgV29vbHNleSA8d29vbHNleUBqbHcuY29tPgotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIGEgVGFkcG9sZSBhcyBhIHNwYXJjLgotCi1XZWQgTm92IDEzIDAwOjUzOjA5IDE5OTYgIERhdmlkIEouIE1hY0tlbnppZSAgPGRqbUBjaHVyY2h5LmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3M6IERvbid0IGFzc3VtZSB0aGF0IE5leHRTdGVwIHZlcnNpb24gaXMgZWl0aGVyIDIgb3IKLQkzLiAgTmV4dFN0ZXAgNCAoYWthIE9wZW5TdGVwIDQpIGhhcyBjb21lIG91dCBub3cuCi0KLU1vbiBOb3YgMTEgMjM6NTI6MDMgMTk5NiAgRGF2aWQgSi4gTWFjS2VuemllICA8ZGptQGNodXJjaHkuZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzczogU3VwcG9ydCBDcmF5IFQ5MCB0aGF0IHJlcG9ydHMgaXRzZWxmIGFzICJDUkFZIFRTIi4KLQlGcm9tIFJpayBGYWl0aCA8ZmFpdGhAY3MudW5jLmVkdT4uCi0KLUZyaSBOb3YgIDggMTE6MzQ6NTggMTk5NiAgRGF2aWQgSi4gTWFjS2VuemllICA8ZGptQGdlZWNoLmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuc3ViOiBDb250cmlidXRpb25zIGZyb20gYnVnLWdudS11dGlscyB0bzoKLQlTdXBwb3J0IHBsYWluICJocHBhIiAobm8gdmVyc2lvbiBnaXZlbikgYXJjaGl0ZWN0dXJlLCByZXBvcnRlZCBieQotCU9wZW5TdGVwLgotCU9wZW5CU0QgbGlrZSBOZXRCU0QuCi0JTHlueE9zIGlzIG5vdCBhIGhhcmR3YXJlIHN1cHBsaWVyLgotCi0JKiBjb25maWcuZ3Vlc3M6IENvbnRyaWJ1dGlvbnMgZnJvbSBidWctZ251LXV0aWxzIHRvIGFkZCBzdXBwb3J0IGZvcjoKLSAJT3BlbkJTRCBsaWtlIE5ldEJTRC4KLQlTdHJhdHVzIHN5c3RlbXMuCi0JTW9yZSBQeXJhbWlkIHN5c3RlbXMuCi0JaVtuPjRdODYgSW50ZWwgY2hpcHMuCi0JTTY4MFtuPjRdMCBNb3Rvcm9sYSBjaGlwcy4KLQlVc2UgdW5rbm93biBpbnN0ZWFkIG9mIGx5bnggZm9yIGhhcmR3YXJlIG1hbnVmYWN0dXJlci4KLQotTW9uIE5vdiAxMSAxMDowOTowOCAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGluc3RhbGwuc2ggKGNobW9kY21kKTogU2V0IHRvIG51bGwgaWYgdGhlIERTVCBkaXJlY3RvcnkgYWxyZWFkeQotCWV4aXN0cy4KLQotTW9uIE5vdiAxMSAxMDo0Mzo0MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYyote2VhYmksZWxmLGxpbnV4LHJ0ZW0sc3lzdixzb2xhcmlzfSopOiBEbwotCW5vdCB1c2UgbXQtcHBjIHRhcmdldCBNYWtlZmlsZSBmcmFnbWVudCBhbnkgbW9yZS4KLQotU3VuIE5vdiAgMyAxOToxNzowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi13aW5kb3dzKTogIEV4Y2x1ZGUgZXZlcnl0aGluZyBidXQgdGhvc2UgZGlycwotCW5lZWRlZCB0byBidWlsZCB3aW5kb3dzLgotCi1UdWUgT2N0IDI5IDE2OjQxOjMxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LXdpbnN1cCk6IERlcGVuZCBvbiBhbGwtdGFyZ2V0LWxpYnJ4LgotCi1Nb24gT2N0IDI4IDE3OjMyOjQ2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEV4Y2x1ZGUgbW1hbGxvYyBmcm9tIGkzODYtd2luZG93cy4KLQkqIGNvbmZpZy9taC13aW5kb3dzOiAgQWRkIHJ1bGVzIGZvciBidWlsZGluZyBNU1ZDIG1ha2VmaWxlcy4KLQotVGh1IE9jdCAyNCAwOToyMjo0NiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBVbmRvIG15IHByZXZpb3VzIGNoYW5nZS4KLQotVGh1IE9jdCAyNCAxMjoxMjowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBQYXNzIGRvd24gR0NDX0ZPUl9UQVJHRVQKLQl1bmNvbmRpdGlvbmFsbHkuCi0JKE1BS0VPVkVSUklERVMpOiBEZWZpbmUgKHJldmVydCB0aGlzIHBhcnQgb2YgT2N0b2JlciAxOCBjaGFuZ2UpLgotCi1UaHUgT2N0IDI0IDA5OjAyOjA3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogIEFkZCAkKEhPU1RfRkxBR1MpIHRvIGFsbG93IHRoZQotCWhvc3QgdG8gYWRkIGl0J3Mgb3duIGZsYWdzLgotCSogY29uZmlnL21oLXdpbmRvd3MgKEhPU1RfRkxBR1MpOiAgU2V0IHNyY3Jvb3QsIHdoaWNoIGlzIG5lZWRlZAotCWZvciBNU1ZDIGJ1aWxkIHByb2NlZHVyZS4KLQotVHVlIE9jdCAyMiAxNToyMDoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIEdDQ19GT1JfVEFSR0VUIGxpa2UgQ0NfRk9SX1RBUkdFVC4KLQotRnJpIE9jdCAxOCAxMzozNzoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogQ2hlY2sgZm9yIHhnY2MsIG5vdCBNYWtlZmlsZS4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQkoR0NDX0ZPUl9UQVJHRVQpOiBEZWZpbmUuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBHQ0NfRk9SX1RBUkdFVC4KLQkoRVhUUkFfR0NDX0ZMQUdTKTogRGVmaW5lIEdDQ19GT1JfVEFSR0VUIGJhc2VkIG9uIHdoZXRoZXIKLQlDQ19GT1JfVEFSR0VUIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLQkoTUFLRU9WRVJSSURFUyk6IERvbid0IGRlZmluZS4KLQotVGh1IE9jdCAxNyAxMDoyNzo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG0zMnIpOiBGaXggc3BlbGxpbmcgb2YgbGliZysrIGxpYnMuCi0KLVRodSBPY3QgMTAgMTA6Mzc6MTcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViICgtYXBwbGUqKTogUmVtb3ZlLCBub3cgcmVkdW5kYW50LgotCi1UaHUgT2N0IDEwIDEyOjMwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgQ1BVLVZFTkRPUi1saW51eC1nbnUuCi0KLQkqIGNvbmZpZ3VyZTogUmV3b3JrIHllc3RlcmRheSdzIHNlZCBzY3JpcHQgcGF0Y2guCi0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgotCi1XZWQgT2N0ICA5IDE3OjI0OjU5IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSBmcm9tIEZTRi4KLQotCTE5OTYtMDktMTIgIFJpY2hhcmQgU3RhbGxtYW4gIDxybXNAZXRoYW5vbC5nbnUuYWkubWl0LmVkdT4KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IFVzZSBwYyBpbnN0ZWFkIG9mIHVua25vd24sIGZvciBwYyBjbG9uZSBzeXN0ZW1zLgotICAgICAgICBDaGFuZ2UgbGludXggdG8gbGludXgtZ251LgotCi0JTW9uIEp1bCAxNSAyMzo1MToxMSAxOTk2ICBLYXJsIEhldWVyICA8a3d6aEBnbnUuYWkubWl0LmVkdT4KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IEF2b2lkIG5vbi1wb3J0YWJsZSB0ciBzeW50YXguCi0KLVdlZCBPY3QgIDkgMDY6MDY6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rIChIT0xFUyk6IEFkZCAieGFyZ3MiIGZvciBnZGIuCi0KLQkqIGNvbmZpZ3VyZTogQXZvaWQgaHB1eDEwLjIwIHNlZCBidWcuCi0KLVR1ZSBPY3QgIDggMDg6MzI6NDggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIGNvbmZpZy9taC13aW5kb3dzOiAgQWRkIHN1cHBvcnQgZm9yIHdpbmRvd3MgaG9zdAotCSh0aGF0IGlzIGEgYnVpbGQgZG9uZSB1bmRlciB0aGUgTWljcm9zb2Z0IGJ1aWxkIGVudmlyb25tZW50KS4KLQotVHVlIE9jdCAgOCAxMDozOTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIGFsbCB1c2VzIG9mIHNyY3Jvb3Qgd2l0aCBzLCB0byBzaHJpbmsKLQljb21tYW5kIGxpbmUgbGVuZ3Rocy4KLQotCVBhdGNoZXMgZnJvbSBHZW9mZnJleSBOb2VyIDxub2VyQGN5Z251cy5jb20+OgotCSogY29uZmlndXJlLmluOiBJZiBjb25maWd1cmluZyBmb3IgbmV3bGliLCBwYXNzIC0td2l0aC1uZXdsaWIgdG8KLQlzdWJkaXJlY3Rvcmllcy4KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogSWYgd2luc3VwL01ha2VmaWxlIGV4aXN0cywgcGFzcyBhCi0JLUJuZXdsaWIvIGFuZCAtTHdpbnN1cCB0byBnY2MuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0KLU1vbiBPY3QgIDcgMTA6NTk6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVRDX1NVUFBPUlQpOiBBZGQgY29uZmlndXJlLgotCi1GcmkgT2N0ICA0IDEyOjIyOjU4IDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBjb25maWcvbWgtZGd1eDM4NiBmb3IgaVszNDVdODYtZGctZGd1eCAKLQlob3N0IGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotVGh1IE9jdCAgMyAwOToyODoyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gc2VwYXJhdGUKLQltbjEwMjAwIGFuZCBtbjEwMzAwIGNvbmZpZ3VyYXRpb25zLgotCSogY29uZmlnLnN1YjogTGlrZXdpc2UuCi0KLVdlZCBPY3QgIDIgMjI6Mjc6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBsb3RzIG9mIHN0dWZmIHRvIG5vY29uZmlnZGlycyBmb3IKLQl0aGUgbW4xMHgwMCB0YXJnZXRzLgotCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IEFkZCBtbjEweDAwIHN1cHBvcnQuCi0KLVdlZCBPY3QgIDIgMTU6NTI6MzYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2UtYWxsLmNvbTogQ2FsbCBjb25mLWEtZ2FzLCBub3QgY29uZmlnLWEtZ2FzLgotCi1UdWUgT2N0ICAxIDAxOjI4OjQxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBsaWJnbG9zcyBmb3IgYXJtLWNvZmYKLSAJdGFyZ2V0cy4KLQotTW9uIFNlcCAzMCAxNDoyNDowMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1SRUFETUU6IEFkZCBtdWNoIG1vcmUgZGV0YWlsIGZvciBuYXRpdmUgUG93ZXJNYWMuCi0JKiBtcHctaW5zdGFsbDogTmV3IGZpbGUuCi0JKiBtcHctY29uZmlndXJlOiBBZGQgLS1ub3JlY3Vyc2lvbiBhbmQgLS1oZWxwIG9wdGlvbnMuCi0JKiBtcHctY29uZmlnLmluOiBUcmFuc2xhdGUgcmVhZG1lIGFuZCBpbnN0YWxsIGZpbGVzIHdoZW4KLQljb3B5aW5nIHRvIG9iamRpci4KLQkqIG1wdy1idWlsZC5pbjogRG9uJ3QgYWx3YXlzIGRlcGVuZCBvbiBieWFjYyBhbmQgZmxleC4KLQkoaW5zdGFsbC1vbmx5LXRvcCk6IE5ldyBhY3Rpb24uCi0KLUZyaSBTZXAgMjcgMTc6Mzk6NDQgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgWW91IGNhbiBub3cgY29uZmlndXJlIEdEQiBmb3IgdGhlIHY4NTAuCi0KLVR1ZSBTZXAgMjQgMTk6MDU6MTIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERvbid0IGNvbmZpZ3VyZSBhbnkgQysrIGRpcnMKLQlpZiB0YXJnZXRpbmcgRDEwVi4KLQotVHVlIFNlcCAxNyAxMjoxNTozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBtaXBzNjR2cjUwMDAuCi0KLU1vbiBTZXAgMTYgMTc6MDA6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBhIHNpbmdsZSBsaW5lIGZvciBob3N0X3Rvb2xzIGFuZCBuYXRpdmVfb25seS4KLQotTW9uIFNlcCAgOSAxMjoyMTozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IEFkZCBlbnRyaWVzIGZvciBtMzJyLgotCi1UaHUgU2VwICA1IDEzOjUyOjQ3IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbmV0LWluc3RhbGwpOiBEb24ndCBydW4gaW5zdGFsbC1nemlwLgotCi1XZWQgU2VwICA0IDE3OjI2OjEzIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIERvbid0IGNvbmZpZyBsb3RzIG9mIHRoaW5ncyBmb3IgKi0qLXdpbmRvd3MqLgotCi1TYXQgQXVnIDMxIDExOjQ1OjU3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogVGVzdCBmb3IgbXB3LXRydWUsIHRydWUsIGFuZCBudWxsLWNvbW1hbmQgc2NyaXB0cy4KLQkoaG9zdF9saWJzLCBob3N0X3Rvb2xzKTogQ29weSBmcm9tIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1jb25maWd1cmU6IERvbid0IGNvbXBsYWluIGFib3V0IGRpcmVjdG9yaWVzIG5vdCBmb3VuZC4KLQotVGh1IEF1ZyAyOSAxNjo0NDo1OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYpOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0JKGlbMzQ1Nl04Ni0qLWRndXgqKTogVXNlIGNvbmZpZy9taC1zeXN2IGZvciB0aGUgaG9zdCBjb25maWd1cmF0aW9uCi0JZmlsZS4KLQotCSogY29uZmlnLmd1ZXNzIChpWzM0NV04Nik6IERpdHRvLgotCi1Nb24gQXVnIDI2IDE4OjM0OjQyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFJlbW92ZWQgZ2RiIGZvciBEMTBWLgotCi1UaHUgQXVnIDIyIDE3OjEzOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgbGQsIHRhcmdldC1saWJpbywgdGFyZ2V0LWxpYmcrKywgYW5kCi0JdGFyZ2V0LWxpYnN0ZGMrKyBmcm9tIG5vY29uZmlnZGlycy4KLQotV2VkIEF1ZyAyMSAxODo1NjozOCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBGaXggdGhyZWUgbG9jYXRpb25zIHdoZXJlIHNoZWxsIHNjcmlwdHMgd2VyZQotCWJlaW5nIHJ1biBkaXJlY3RseSByYXRoZXIgdGhhbiB3aXRoIGNvbmZpZ19zaGVsbC4KLQotVHVlIEF1ZyAyMCAxMzowODo0NyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh2ODUwLSotKik6IFNldCB1cCBpbml0aWFsICRub2NvbmZpZ2RpcnMuCi0JKiBjb25maWcuc3ViIChiYXNpY19tYWNoaW5lKTogUmVjb2duaXplIHY4NTAuCi0KLVRodSBBdWcgMTUgMTI6MTk6MzMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlOiBIYW5kbGUgbXVsdGlwbGUgZW5hYmxlL2Rpc2FibGUgb3B0aW9ucyBhbmQKLQlwYXNzIHRoZW0gZG93biByZWN1cnNpdmVseSwgaGFuZGxlIC1jIGFuZCAtcyBmbGFncyBhcHByb3ByaWF0ZWx5Ci0JZGVwZW5kaW5nIG9uIGNob2ljZSBvZiBjb21waWxlciwgYWRkIGVzY2FwZSBtZWNoYW5pc20gZm9yCi0JcXVvdGVkIGFyZ3VtZW50cyB0byBnQy4KLQotTW9uIEF1ZyAxMiAxMzoxNToxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYyotKi0qKTogRm9yIGVhYmksIHN5c3RlbSBWLjQsIExpbnV4LCBhbmQKLQlzb2xhcmlzIHRhcmdldHMsIHVzZSBjb25maWcvbXQtcHBjIHRvIHNldCBDeyxYWH1GTEFHU19GT1JfVEFSR0VUUwotCXNvIHRoYXQgLW1yZWxvY2F0YWJsZS1saWIgYW5kIC1tbm8tZWFiaSBhcmUgdXNlZC4KLQotCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IElmIHRhcmdldCBjb21waWxlciBkb2VzCi0Jbm90IHN1cHBvcnQgLS1wcmludC1tdWx0aS1saWIsIGRvbid0IGFib3J0LgotCi1TdW4gQXVnIDExIDIwOjUxOjUwIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1jeWd3aW4zMiAoQ0ZMQUdTKTogIERlZmluZSBfV0lOMzIgdG8gYmUgY29tcGF0aWJsZQotCXdpdGggbm9ybWFsIFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQuCi0KLVRodSBBdWcgIDggMTI6MTg6NTkgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2UtYWxsLmNvbTogUnVuIGNvbmZpZy1hLWdhcy4KLQkqIHNldHVwLmNvbTogRG9uJ3QgY29weSBzdWJkaXJlY3RvcnkgZmlsZXMgYXJvdW5kLgotCi1UdWUgSnVsIDMwIDE3OjQ5OjMxIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW9zZSk6IFJlbW92ZSBleGNsdXNpb24gb2YgbGliZ2xvc3MgZm9yIHRoaXMKLQl0YXJnZXQsIGl0IG5vdyBjb21waWxlcyBjb3JyZWN0bHkuCi0KLVNhdCBKdWwgMjcgMTU6MTA6NDMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBHZW5lcmF0ZSBNYWMgaW5jbHVkZSBmb3IgZWxmL2R3YXJmMi5oLgotCi1UdWUgSnVsIDIzIDEwOjQ3OjA0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogUmVtb3ZlIGxkIGZyb20gJG5vY29uZmlnZGlycy4gCi0KLU1vbiBKdWwgMjIgMTM6Mjg6NTEgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5hdGl2ZV9vbmx5KTogQWRkIHBybXMuCi0KLU1vbiBKdWwgMjIgMTI6Mjc6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoR0FTX1NVUFBPUlRfRElSUyk6IEFkZCBtYWtlLWFsbC5jb20gYW5kIHNldHVwLmNvbS4KLQkoQklOVVRJTFNfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCi0KLVRodSBKdWwgMTggMTI6NTU6NDAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogRG9uJ3QgY29uZmlndXJlIGxkIG9yIGdkYiB1bnRpbCB0aGUKLQlkMTB2IHN1cHBvcnQgaXMgYWRkZWQuCi0KLVdlZCBKdWwgMTcgMTQ6MzM6MDkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qLSopOiBOZXcgdGFyZ2V0LgotCi1Nb24gSnVsIDE1IDExOjUzOjAwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChIUCA5MDAwLzgxMSk6IFJlY29nbml6ZSB0aGlzIGFzIGEgUEExLjEKLQltYWNoaW5lLgotCi1GcmkgSnVsIDEyIDIzOjIxOjE3IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG8tdGFyLWd6KTogTmV3IHRhcmdldCwgc3BsaXQgb3V0IGZyb20gdGFpbCBlbmQgb2YKLQl0YXogdGFyZ2V0LiAgUnVuIGVhY2ggY29tbWFuZCBzZXBhcmF0ZWx5LCBkb24ndCB1c2UgcGlwZXMuCi0JKHRheik6IFVzZSBpdC4KLQotRnJpIEp1bCAxMiAxMjowODowNCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IExvb2sgZm9yIGctbXB3LW1ha2Uuc2VkIGluIGNvbmZpZy9tcHcuCi0JKiBtcHctYnVpbGQuaW46IE5vIGJ1aWxkcyBzaG91bGQgZGVwZW5kIG9uIGJ1aWxkaW5nIGJ5YWNjIG9yIGZsZXgsCi0JdGhleSBhcmUgYXNzdW1lZCB0byBiZSBpbnN0YWxsZWQgYWxyZWFkeS4KLQotRnJpIEp1bCAxMiAwOTo1Mjo1MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBTZXQgciBlbnZpcm9ubWVudAotCXZhcmlhYmxlIHRoYXQgQ0NfRk9SX1RBUkdFVCBuZWVkcy4KLQotVGh1IEp1bCAxMSAxMDowOTo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBEZXRlcm1pbmUgaWYgdGhlIG11bHRsaWIKLQlvcHRpb25zIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBzdWJkaXJlY3Rvcnkgd2FzCi0JY29uZmlndXJlZCwgYW5kIGlmIGl0IGhhcywgcmVjb25maWd1cmUuCi0JKENMRUFOX1RBUkdFVF9NT0RVTEVTKTogRGVsZXRlIG11bHRpbGliLm91dCBhbmQgdG1wbXVsdGkub3V0LCB3aGljaAotCUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyB1c2VzIHRvIHJlbWVtYmVyIHRoZSBvbGQgbXVsdGlsaWIgb3B0aW9ucy4KLQotV2VkIEp1bCAxMCAxODo1Njo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMsQ1JPU1NfQ0hFQ0tfTU9EVUxFUyxJTlNUQUxMX01PRFVMRVMsCi0JQ0xFQU5fTU9EVUxFUyk6IEFkZCBiYXNoLgotCShhbGwtYmFzaCk6IE5ldyB0YXJnZXQuCi0KLU1vbiBKdWwgIDggMTc6MzM6MTQgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXg2Kik6IFVzZSBtaC1pcml4NiBpbnN0ZWFkIG9mIG1oLWlyaXg1LgotCi1Nb24gSnVsICAxIDEzOjMxOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IFJlY29nbml6ZSBkMTB2IGFzIGEgdmFsaWQgcHJvY2Vzc29yLgotCi1GcmkgSnVuIDI4IDEyOjE0OjM1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogQWRkIHN1cHBvcnQgZm9yIC0tYmluZGlyLgotCSogbXB3LWJ1aWxkLmluOiBVc2UgYSBHQ0Mtc3BlY2lmaWMgYnVpbGQgc2NyaXB0IGZvciBHQ0MgYWN0aW9ucy4KLQotV2VkIEp1biAyNiAxNzoyMDoxMiAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBiYXNoLCB0aW1lLCBnYXdrIHRvIGxpc3Qgb2YgaG9zdHRvb2xzIGFuZCB0aGluZ3MKLQl0byBvbmx5IGJ1aWxkIGZvciBuYXRpdmUgdG9vbGNoYWlucwotCi1UdWUgSnVuIDI1IDIzOjA5OjAzIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkb2NkaXIpOiBSZW1vdmUuCi0KLVR1ZSBKdW4gMjUgMTk6MDA6MDggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBTZXQgdG8gJChwcmVmaXgpL3NoYXJlLgotCi1Nb24gSnVuIDI0IDIzOjI2OjA3IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYnVpbGQgZGlmZiBhbmQgcGF0Y2ggZm9yIGN5Z3dpbjMyLWhvc3RlZAotCXRvb2xjaGFpbnMuCi0KLU1vbiBKdW4gMjQgMTU6MDE6MTIgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAbWVybGluLmdjcy5yZWRzdG9uZS5hcm15Lm1pbD4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1ydGVtcyouCi0KLVN1biBKdW4gMjMgMjI6NDE6NTQgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZW5hYmxlIGRvc3JlbCBmb3IgY3lnd2luMzItaG9zdGVkIGJ1aWxkcywKLSAgICAgICAgICAgICAgICByZW1vdmUgZGlmZiBmcm9tIHRoZSBsaXN0IG9mIHRoaW5ncyBub3QgYnVpbGRhYmxlCi0gICAgICAgICAgICAgICAgdmlhIENhbmFkaWFuIENyb3NzCi0KLVNhdCBKdW4gMjIgMTE6Mzk6MDEgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVEFSR0VUX1NVQkRJUik6IE1vdmUgY29tbWVudCB0byBwcmV2aW91cyBsaW5lIHNvIHdlCi0gCWRvbid0IGdldCAiLiAiLgotCi1GcmkgSnVuIDIxIDE3OjI0OjQ4IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDYqKTogU2V0IG5vY29uZmlnZGlycyBhcHByb3ByaWF0ZWx5LgotCi1UaHUgSnVuIDIwIDE2OjU3OjQwIDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogSGFuZGxlIGNhc2Ugd2hlcmUgdGV4M3BhdGNoIGRpZG4ndCBldmVuIGdldAotCWNoZWNrZWQgb3V0LiAgQWxzbywgaWYgaXQgd2FzIGZvdW5kLCBwdXQgdGhlIHN5bWxpbmsgaW4gYSBuZXcgdXRpbAotCXN1YmRpcmVjdG9yeS4KLQotVGh1IEp1biAyMCAxMjoyMDozMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQyBMaW51eC4KLQotVHVlIEp1biAxOCAxNDoyNDoxMiAxOTk2ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIC1vcGVudm1zLgotCSogY29uZmlndXJlLmluIChhbHBoYSotKi0qdm1zKik6IFNldCBub2NvbmZpZ2RpcnMuCi0JKiBtYWtlLWFsbC5jb20sIHNldHVwLmNvbTogTmV3IGZpbGVzLgotCi1Nb24gSnVuIDE3IDE2OjM0OjQ2IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IHRleDNwYXRjaCBtb3ZlZCB0byB0ZXhpbmZvL3V0aWwuCi0KLVNhdCBKdW4gMTUgMTc6MTM6MjUgMTk5NiAgR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IGVuYWJsZV9nZGJ0az1ubyBmb3IgY3lnd2luMzItaG9zdGVkIHRvb2xjaGFpbnMKLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIG1ha2UgZnJvbSBkaXNhYmxlLWlmLUNhbi1Dcm9zcyBsaXN0Ci0JCWVuYWJsZSBnZGIgaWYgJHtob3N0fSBhbmQgJHt0YXJnZXR9IGFyZSBjeWd3aW4zMgotCi1GcmkgSnVuICA3IDE4OjE2OjUyIDE5OTYgIEhhcmxhbiBTdGVubiA8aGFybGFuQHBmY3MuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKGk/ODYtbmNyLXN5c3YqKTogIEVtaXQgbWlub3IgcmVsZWFzZSBudW1iZXJzLgotCVJlY29nbml6ZSB0aGUgTkNSIDQ4NTAgbWFjaGluZSBhbmQgTkNSIFBlbnRpdW0tYmFzZWQgcGxhdGZvcm1zLgotCi1XZWQgSnVuICA1IDAwOjA5OjE3IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckB3b21iYXQuZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzczogIENvbWJpbmUgbWlwcy1taXBzLXJpc2NvcyBjYXNlcywgYW5kIHVzZSBjcHAgdG8KLQlkaXN0aW5ndWlzaCBzeXN2L3N2cjQvYnNkIHZhcmlhbnRzLgotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBIYXJsYW4gU3Rlbm4gPGhhcmxhbkBwZmNzLmNvbT4uCi0KLUZyaSBKdW4gIDcgMTQ6MjQ6NDkgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBjb3B5cmlnaHQgbm90aWNlLgotCSogbW92ZS1pZi1jaGFuZ2U6IEFkZGVkIGNvcHlyaWdodCBub3RpY2UuCi0KLVRodSBKdW4gIDYgMTY6Mjc6MDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGNsZS0qLXNvbGFyaXMqKTogVW50aWwgd2UgZ2V0IHNoYXJlZAotCWxpYnJhcmllcyB3b3JraW5nLCBkb24ndCBidWlsZCBnZGIsIHNpbSwgbWFrZSwgdGNsLCB0aywgb3IKLQlleHBlY3QuCi0KLVR1ZSBKdW4gIDQgMjA6NDE6NDUgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIHdpdGggRlNGOgotCi0JTW9uIEp1biAgMyAwODo0OToxNCAxOTk2ICBLYXJsIEhldWVyICA8a3d6aEBnbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBBZGQgZ3Vlc3MgZm9yIHNwYXJjLXVua25vd24tbGludXguCi0KLQlGcmkgTWF5IDI0IDE4OjM0OjUzIDE5OTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGRlbGFzeWQuZ251LmFpLm1pdC5lZHU+Ci0JKiBjb25maWcuZ3Vlc3MgKEFWaWlPTjpkZ3V4Oio6Kik6IEZpeCB0eXBvIGluIHJlY29nbml6aW5nIG1jODgxMTAuCi0KLQlGcmkgQXByIDEyIDIwOjAzOjU5IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBzcGlmZi5nbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZy5ndWVzczogIENvbWJpbmUgdHdvIE9TRjEgcnVsZXMuCi0JQWxzbyByZWNvZ25pemUgZmllbGQgdGVzdCB2ZXJzaW9ucy4gIEZyb20gbWpyQHprMy5kZWMuY29tLgotCSogY29uZmlnLmd1ZXNzIChkZ3V4KTogIFVzZSAvdXNyL2Jpbi91bmFtZSByYXRoZXIgdGhhbiB1bmFtZSwKLQliZWNhdXNlIEdOVSB1bmFtZSBkb2VzIG5vdCBzdXBwb3J0IC1wLiAgRnJvbSBwbXJAcGFqYXRvLmNvbS4KLQotVHVlIEp1biAgNCAxMTowNzoyNSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNzazMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1BS0VESVJTKTogUmVtb3ZlZCAkKHRvb2xkaXIpLgotCi1UdWUgTWF5IDI4IDEyOjMwOjUwIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LVJFQURNRTogRG9jdW1lbnQgR0NDSW5jbHVkZXMuCi0KLVN1biBNYXkgMjYgMTU6MTY6MjcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1saW51eCopOiBTZXQgZW5hYmxlX3NoYXJlZCB0byB5ZXMuCi0KLVR1ZSBNYXkgMjEgMTU6NDE6MzkgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlOiBIYW5kbGUgLS1lbmFibGUtRk9PIGFuZCAtLWRpc2FibGUtRk9PLgotCi1Nb24gTWF5IDIwIDEwOjEyOjI5IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWN5Z3dpbjMyKTogQ29uZmlndXJlIG1ha2UuCi0KLVR1ZSBNYXkgIDcgMTQ6MTk6NDIgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBzbnVmZmxlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbmV0LWluc3RhbGwpOiBRdW90ZSB2YWx1ZSBvZiBJTlNUQUxMX01PRFVMRVMuCi0KLUZyaSBNYXkgIDMgMDg6NTc6MTcgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtaW5ldCk6IERlcGVuZCBvbiBhbGwtcGVybC4KLQotCSogTWFrZWZpbGUuaW4gKGluZXQtaW5zdGFsbCk6IE5ldyB0YXJnZXQuCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtaW5ldCk6IERlcGVuZCBvbiBhbGwtdGNsLgotCShhbGwtaW5ldCk6IERlcGVuZCBvbiBhbGwtc2VuZC1wci4KLQotVHVlIEFwciAzMCAxMzo1NTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlLSotc29sYXJpcyopOiBUdXJuIG9mZiB0ayBhbmQgdGNsCi0JdGVtcG9yYXJpbHkuCi0KLVRodSBBcHIgMjUgMTE6NDg6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxkIG9uIEFJWC4KLQotVGh1IEFwciAyNSAwNjozMzozNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGNsZS0qLXNvbGFyaXMqKTogVHVybiBvZmYgZ2RiIHRlbXBvcmFyaWx5LgotCi1UdWUgQXByIDIzIDA5OjA3OjM5IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1pbmV0LgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2staW5ldC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1pbmV0LgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4taW5ldC4KLQkoYWxsLWluZGVudCk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZGVkIGluZXQuCi0JKG5hdGl2ZV9vbmx5KTogQWRkZWQgaW5ldC4KLQkobm9jb25maWdkaXJzKTogQWRkZWQgaW5ldC4KLQotRnJpIEFwciAxOSAxNTozNToyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIGxpYmdsb3NzIGlmIHdlIGFyZSBub3QgY29uZmlndXJpbmcKLQluZXdsaWIuCi0KLVdlZCBBcHIgMTcgMTk6MzA6MDEgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGliZ2xvc3MgZm9yIHVuc3VwcG9ydGVkCi0JYXJjaGl0ZWN0dXJlcy4KLQotVHVlIEFwciAxNiAxMToxNzowNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDTEVBTl9NT0RVTEVTKTogQWRkIGNsZWFuLWFwYWNoZS4KLQotTW9uIEFwciAxNSAxNTowOTowNSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBJbmNsdWRlIGFsbC1hcGFjaGUuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBJbmNsdWRlIGNoZWNrLWFwYWNoZS4KLQkoSU5TVEFMTF9NT0RVTEVTKTogSW5jbHVkZSBpbnN0YWxsLWFwYWNoZS4KLQkoYWxsLWFwYWNoZSk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgYXBhY2hlIGV2ZXJ5d2hlcmUgcGVybCBpcyBzZWVuLgotCi1Nb24gQXByIDE1IDE0OjU5OjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBzdXBwb3J0IGZvciBjbGVhbi17bW9kdWxlfSBhbmQKLQljbGVhbi10YXJnZXQte21vZHVsZX0gcnVsZXMuCi0KLVdlZCBBcHIgMTAgMjE6Mzc6NDEgUERUIDE5OTYgIE1hcmlseW4gRS4gU2FuZGVyIDxtc2FuZGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW9zZSkgZG8gbm90IGJ1aWxkIGxpYmdsb3NzLgotCi1Nb24gQXByICA4IDE2OjE2OjIwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChwcmVwKjpTdW5PUzo1Lio6Kik6IFR1cm4gaW50bwotCXBvd2VycGVsZS11bmtub3duLXNvbGFyaXMyLgotCi1Nb24gQXByICA4IDE0OjQ1OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0KLUZyaSBBcHIgIDUgMDg6MTc6NTcgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09c29sYXJpcyk6IFBhc3Mgb25seSB0aGUgZmlyc3Qgd29yZCBvZiAkQ0MKLQl0byAvdXNyL2Jpbi93aGljaCB3aGVuIGNoZWNraW5nIGlmIHdlJ3JlIHVzaW5nIC91c3IvY2NzL2Jpbi9jYy4KLQotRnJpIEFwciAgNSAwMzoxNjoxMyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IHBhc3MgZG93biAkKE1BS0UpLgotCi1UaHUgTWFyIDI4IDE0OjExOjExIDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEluY2x1ZGUgYWxsLXBlcmwuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBJbmNsdWRlIGNoZWNrLXBlcmwuCi0JKElOU1RBTExfTU9EVUxFUyk6IEluY2x1ZGUgaW5zdGFsbC1wZXJsLgotCShBTExfWDExX01PRFVMRVMpOiBJbmNsdWRlIGFsbC1ndWlsZS4KLQkoQ0hFQ0tfWDExX01PRFVMRVMpOiBJbmNsdWRlIGNoZWNrLWd1aWxlLgotCShJTlNUQUxMX1gxMV9NT0RVTEVTKTogSW5jbHVkZSBpbnN0YWxsLWd1aWxlLgotCShhbGwtcGVybCk6IE5ldyB0YXJnZXQuCi0JKGFsbC1ndWlsZSk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEluY2x1ZGUgcGVybCBhbmQgZ3VpbGUuCi0JKG5hdGl2ZV9vbmx5KTogSW5jbHVkZSBwZXJsIGFuZCBndWlsZS4KLQkobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgZ3VpbGUgYW5kIHBlcmw7IG5vIHBvcnRzIGhhdmUgYmVlbgotCWRvbmUuCi0KLVR1ZSBNYXIgMjYgMjE6MTg6NTAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KLQotICAgICAgICAqIGNvbmZpZ3VyZSAoLS1lbmFibGUtKik6IEhhbmRsZSBxdW90ZWQgb3B0aW9uIGxpc3RzIHN1Y2ggYXMKLSAgICAgICAgLS1lbmFibGUtc2ltLWNmbGFncz0nLWcwIC1PJyBiZXR0ZXIuCi0KLVRodSBNYXIgMjEgMTE6NTM6MDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoeyxpbnN0fWFsbC10YXJnZXQpOiBOZXcgcnVsZSBzbyB3ZSBjYW4gbWFrZSBhbmQKLQlpbnN0YWxsIGFsbCBvZiB0aGUgdGFyZ2V0IGRpcmVjdG9yaWVzIGVhc2lseS4KLQotV2VkIE1hciAyMCAxODoxMDo1NyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbWlzc2luZyBnbG9iYWwgZmxhZyBpbiBzZWQgc3Vic3RpdHV0aW9uIHdoZW4KLQlkZWxldGluZyBgdGFyZ2V0LScgZnJvbSAke2NvbmZpZ2RpcnN9LgotCi1UaHUgTWFyIDE0IDE5OjE1OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERPX1gpOiBEb24ndCBnZXQgY29uZnVzZWQgaWYgQ0MgY29udGFpbnMgYD0nIGluIGFuCi0Jb3B0aW9uLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLW5lYy1zeXN2cjQqKTogVXNlIGEgaG9zdF9tYWtlZmlsZV9mcmFnIG9mCi0JY29uZmlnL21oLW5lY3Y0LgotCi0JKiBpbnN0YWxsLnNoOiBDb3JyZWN0IG1pc3NwZWxsaW5nIG9mIHRyYW5zZm9ybWJhc2VuYW1lLgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBtaXBzLSotc3lzdiouCi0KLU1vbiBNYXIgMTEgMTU6MzY6NDIgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgbW9uOTYwLgotCi1TdW4gTWFyIDEwIDEzOjE4OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZXN0b3JlIENhbmFkaWFuIENyb3NzIGhhbmRsaW5nIG9mIEJJU09OIGFuZCBMRVgsCi0JcmVtb3ZlZCBpbiBGZWIgMjAgY2hhbmdlLgotCi1GcmkgTWFyICA4IDIwOjA3OjA5IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBSRUFETUU6ICBTdWdnZXN0aW9ucyBmcm9tIFRvcmJqb3JuIEdyYW5sdW5kIDx0ZWdlQG1hdGVtYXRpay5zdS5zZT46Ci0JTWVudGlvbiBtYWtlIGluc3RhbGwuICBSZW1vdmUgdGhlIG9sZCBjb3B5cmlnaHQgZGF0ZSBhcyB3ZWxsIHRoZQotCWNsdW1zeSBhbmQgcmF0aGVyIHBvaW50bGVzcyBjb3B5cmlnaHQgb24gdGhlIFJFQURNRSBmaWxlLgotCi1GcmkgTWFyICA4IDE3OjUxOjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IElmIHRoZXJlIGlzIGEKLQlNYWtlZmlsZSBhZnRlciBydW5uaW5nIHN5bWxpbmstdHJlZSwgdGhlbiBydW4gYG1ha2UgZGlzdGNsZWFuJyB0bwotCWF2b2lkIGNsb2JiZXJpbmcgYW55IGdlbmVyYXRlZCBmaWxlcyBpbiBzcmNkaXIuCi0KLVR1ZSBNYXIgIDUgMDg6MjE6NDQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG02OGstKi1uZXRic2QqKTogQnVpbGQgZXZlcnl0aGluZyBub3cuCi0KLVdlZCBGZWIgMjggMTI6MjU6NDYgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogRml4IHF1b3RpbmcuCi0KLVR1ZSBGZWIgMjcgMTE6MzM6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsZXQtKi0qKTogQnVpbGQgZXZlcnl0aGluZyBub3cuCi0KLVR1ZSBGZWIgMjcgMTQ6MzE6NTEgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWxpbnV4Kik6IE5ldyBob3N0LgotCi1Nb24gRmViIDI2IDE0OjMyOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBDaGVjayBmb3IgYmlzb24gYmVmb3JlIGJ5YWNjLgotCi1UdWUgRmViIDIwIDIzOjEyOjM1IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIGNvbmZpZ3VyZTogIENoYW5nZSB0aGUgd2F5IExFWCBhbmQgQklTT04vWUFDQyBhcmUKLQlzZXQuICBjb25maWd1cmUgbm93IGRlZmluZXMgREVGQVVMVF9MRVggYW5kIERFRkFVTFRfWUFDQyBieQotCXNlYXJjaGluZyBQQVRILiAgVGhlc2UgYXJlIHVzZWQgYXMgZmFsbGJhY2tzIGJ5IE1ha2VmaWxlLmluIGlmCi0JZmxleC9iaXNvbi9ieWFjYyBhcmVuJ3QgaW4gb2JqZGlyLgotCi1Nb24gRmViIDE5IDExOjQ1OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IE1ha2UgZXZlcnl0aGluZyB3aGljaCBkZXBlbmRzIHVwb24gYWxsLWJmZCBhbHNvCi0JZGVwZW5kIHVwb24gYWxsLW9wY29kZXMsIGluIGNhc2UgLS13aXRoLWNvbW1vbmJmZGxpYiBpcyB1c2VkLgotCi1UaHUgRmViIDE1IDE5OjUwOjUwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChob3N0ICotKi1jeWd3aW4zMik6IERvbid0IGJ1aWxkIGdkYiBpZiB3ZSBhcmUKLQlidWlsZGluZyBOVCBuYXRpdmUgY29tcGlsZXJzIG9uIFVuaXguCi0KLVRodSBGZWIgMTUgMTc6NDI6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGdldCBDQyBmcm9tIHRoZSBob3N0IE1ha2VmaWxlIGZyYWdtZW50IGlmIHdlCi0JY2FuIGZpbmQgZ2NjIGluIFBBVEgsIG9yIGlmIHRoaXMgaXMgYSBDYW5hZGlhbiBDcm9zcy4gIE1vdmUgdGhlCi0JU29sYXJpcyB0ZXN0IGZvciAvdXNyL3VjYi9jYyB0byB0aGUgcG9zdCB0YXJnZXQgc2NyaXB0LCBqdXN0IGFmdGVyCi0JdGhlIGNvbXBpbGVyIHNhbml0eSB0ZXN0LgotCi1XZWQgRmViIDE0IDE2OjU3OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBGU0YuCi0KLVR1ZSBGZWIgMTMgMTQ6Mjc6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShSRUFMTFlfU0VUX0xJQl9QQVRIKTogVXNlIGl0LgotCSogY29uZmlndXJlLmluOiBPbiBIUC9VWCwgc2V0IFJQQVRIX0VOVlZBUiB0byBTSExJQl9QQVRILgotCi1Nb24gRmViIDEyIDE1OjI4OjQ5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IFJlY29nbml6ZSBzcGFyY2xldCBjcHUuCi0KLU1vbiBGZWIgMTIgMTU6MzM6NTkgMTk5NiAgQ2hyaXN0aWFuIEJhdWVybmZlaW5kIDxjaHJpc2JmZEB0aGVvcmllMy5waHlzaWsudW5pLWVybGFuZ2VuLmRlPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBTdXBwb3J0IG02OGstY2JtLXN5c3Y0LgotCi1TYXQgRmViIDEwIDEyOjA2OjQyIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogR3Vlc3MgbTY4ay11bmtub3duLWxpbnV4IGFuZAotCW02OGstdW5rbm93bi1saW51eGFvdXQgZnJvbSBsaW5rZXIgaGVscCBzdHJpbmcuICBQdXQgcXVvdGVzIGFyb3VuZAotCSRsZF9oZWxwX3N0cmluZy4KLQotVGh1IERlYyAgNyAwOTowMzoyNCAxOTk1ICBUb20gSG9yc2xleSAgPFRvbS5Ib3JzbGV5QG1haWwuaGNzYy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAocG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4KTogQWRkIGd1ZXNzIGZvciBwb3J0Ci0JdG8gbmV3IHRhcmdldC4KLQotVGh1IEZlYiAgOCAxNTozNzo1MiAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoVU5BTUVfVkVSU0lPTik6IFJlY29nbml6ZSBYNC54IGFzIGFuIE9TRiB2ZXJzaW9uLgotCi1Nb24gRmViICA1IDE2OjM2OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHVzZWQsIHNldCBTRVRfTElCX1BBVEggdG8KLQkkKFJFQUxMWV9TRVRfTElCX1BBVEgpIGluIE1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW4gKFNFVF9MSUJfUEFUSCk6IE5ldyB2YXJpYWJsZS4KLQkoUkVBTExZX1NFVF9MSUJfUEFUSCk6IE5ldyB2YXJpYWJsZS4KLQkoJChET19YKSk6IFVzZSAkKFNFVF9MSUJfUEFUSCkuCi0JKGluc3RhbGwuYWxsLCBnY2Mtbm8tZml4ZWRpbmNsdWRlcywgJChBTExfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoJChOQVRJVkVfQ0hFQ0tfTU9EVUxFUyksICQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoJChJTlNUQUxMX01PRFVMRVMpLCAkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoJChBTExfVEFSR0VUX01PRFVMRVMpLCAkKENIRUNLX1RBUkdFVF9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpLCAkKEFMTF9YMTFfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoJChDSEVDS19YMTFfTU9EVUxFUyksICQoSU5TVEFMTF9YMTFfTU9EVUxFUykpOiBMaWtld2lzZS4KLQkoYWxsLWdjYywgYWxsLWJvb3RzdHJhcCwgY2hlY2stZ2NjLCBpbnN0YWxsLWdjYyk6IExpa2V3aXNlLgotCShpbnN0YWxsLWRvc3JlbCk6IExpa2V3aXNlLgotCShhbGwtb3Bjb2Rlcyk6IERlcGVuZCB1cG9uIGFsbC1saWJpYmVydHkuCi0KLVN1biBGZWIgIDQgMTY6NTE6MTEgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzICgqOkNZR1dJTiopOiBOZXcKLQotU2F0IEZlYiAgMyAxMDo0MjozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LXdpbnN1cCk6IEFsbCBhbGwtdGFyZ2V0LWxpYmliZXJ0eS4KLQotRnJpIEZlYiAgMiAxNzo1ODo1NiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIG1pc3NpbmcgIyBpbiBmcm9udCBvZiBjb21tZW50LgotCi1UaHUgRmViICAxIDE0OjM4OjEzIDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHNlY29uZCBwYXNzIHRvIHRoaW5ncyBhZGRlZCB0byBub2NvbmZpZ2RpcnMKLQlzbyAqLWdtLW1hZ2ljIGNhbiBleGNsdWRlIGxpYmdsb3NzIHByb3Blcmx5LgotCi1UaHUgRmViICAxIDExOjEwOjE2IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZSAoZXh0cmFsaWJzX25hbWUsIHJlel9uYW1lKTogU2V0IGNvcnJlY3RseQotCWZvciBNV0M2OEsgY29tcGlsZXIuCi0KLQkqIG1wdy1SRUFETUU6IEFkZCBtb3JlIGluZm8gb24gdGhlIG5lY2Vzc2FyeSBidWlsZCB0b29scy4KLQotVGh1IEZlYiAgMSAxMDoyMjozOCAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBjeWd3aW4zMi4KLQotV2VkIEphbiAzMSAxNDoxNzoxMCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzLCBjb25maWcuc3ViOiBSZWNvZ25pemUgQS9VWC4KLQotV2VkIEphbiAzMSAxMzo1MjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggZ2NjL2NvbmZpZy5zdWIuCi0KLVRodSBKYW4gMjUgMTE6MDE6MTAgMTk5NiAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LWJ1aWxkLmluIChkby1iaW51dGlscyk6IEFkZCBidWlsZCBvZiBzdGFtcHMuCi0KLVRodSBKYW4gMjUgMTc6MDU6MjYgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcuc3ViOiBBZGQgcmVjb2duaXRpb24gZm9yIG1pcHM2NHZyNDEwMCotKiB0YXJnZXRzLgotCi1XZWQgSmFuIDI0IDEyOjQ3OjU1IDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogdGVzdC1idWlsZC5tazogQWRkIGNoZWNraW5nIG9mIGBocHV4OScgcmF0aGVyIHRoYW4ganVzdCBgaHB1eCcuCi0JQWRkIGNyZWF0aW9uIG9mIGdjb25maWdhcmdzIHdpdGggYC0tZW5hYmxlLXNoYXJlZCcgdHVybmVkIG9uLgotCSgkKGhvc3QpLXN0YW1wLXN0YWdlMi1jb25maWd1cmVkKTogUGFzcyAkKGdjb25maWdhcmdzKS4KLQkoJChob3N0KS1zdGFtcC1zdGFnZTMtY29uZmlndXJlZCk6IExpa2V3aXNlLgotCShIT0xFUyk6IEFkZCBjaGF0ciBhbmQgbGRkLgotCShpMzg2LW5jci1zeXN2NC4zKik6IEFkZCB1c2Ugb2YgL3Vzci9jY3MvYmluIGluIHRoZSBQQVRIIGFuZCBIT0xFX0RJUlMuCi0KLVdlZCBKYW4gMjQgMjA6MzI6MzAgMTk5NiAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQG5vaXN5Lm1hdGVtYXRpay5zdS5zZT4KLQotCSogY29uZmlndXJlOiBQYXNzIC0tbmZwIHRvIHJlY3Vyc2l2ZSBjb25maWd1cmVzLgotCi1Nb24gSmFuIDIyIDEwOjQxOjU2IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChETExUT09MKTogTmV3LgotCShETExUT09MX0ZPUl9UQVJHRVQpOiBOZXcuCi0JKEVYVFJBX0hPU1RfRkxBR1MpOiBQYXNzIGRvd24gRExMVE9PTC4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRGl0dG8uCi0JKEVYVFJBX0dDQ19GTEFHUyk6IERpdHRvLgotCShDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBEaXR0by4KLQkoRE9fWCk6IERpdHRvLgotCSogY29uZmlndXJlOiBBZGQgRExMVE9PTC4KLQotRnJpIEphbiAxOSAxMzozMDoxNSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlTQ08gT3BlblNlcnZlciA1IGNoYW5nZXMgZnJvbSBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT46Ci0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotc2NvMy4ydjUqKTogVXNlIG1oLXN5c3YgaW5zdGVhZCBvZgotCW1oLXNjbywgc2luY2Ugb2xkIHdvcmthcm91bmRzIG5vIGxvbmdlciBuZWVkZWQsIGFuZCBkb24ndAotCWJ1aWxkIGxkLCBzaW5jZSBsaWJyYXJpZXMgaGF2ZSB3ZWFrIHN5bWJvbHMgaW4gQ09GRi4KLQotU3VuIEphbiAxNCAyMzowMTozMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IEFkZCBtaXNzaW5nICc7Jy4KLQotRnJpIEphbiAxMiAxNToyNTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBzdXJlIHRoYXQgJHtDQ30gY2FuIGJlIHVzZWQgdG8gY29tcGlsZSBhbgotCWV4ZWN1dGFibGUuCi0KLVNhdCBKYW4gIDYgMDc6MjM6MzMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZGIpOiBEZXBlbmQgb24gJChHREJfVEspLgotCSogY29uZmlndXJlIChHREJfVEspOiBTZXQgR0RCX1RLIHRvIGVpdGhlciAiYWxsLXRjbCBhbGwtdGsiIG9yCi0Jbm90aGluZyBkZXBlbmRpbmcgb24gd2hldGhlciBnZGJ0ayBpcyBiZWluZyBidWlsdC4KLQotV2VkIEphbiAgMyAxNzo1NDo0MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobmV3bGliLnRhci5neik6IERlbGV0ZSBidWlsZGluZyBvZiBuZXdsaWIncyBpbmZvIGZpbGVzLgotCi1Nb24gSmFuICAxIDE5OjA5OjE0IDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFB1dCBsZCBvciBnYXMgaW4gdGhpcyBlYXJseSwgaWYgdGhlCi0JdXNlciBzcGVjaWZpY2FsbHkgdXNlZCAtLXdpdGgtZ251LWxkPW5vIG9yIC0td2l0aC1nbnUtYXM9bm8uCi0KLVNhdCBEZWMgMzAgMTY6MDg6NTcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBBZGQgc3VwcG9ydCBmb3IKLQktLWRpc2FibGUte3NvZnRmbG9hdCxtNjg4ODEsbTY4MDAwLG02ODAyMH0gb24gbTY4Ki0qLSouCi0JU2ltcGxpZnkgc2V0dGluZyBvZiBtdWx0aWRpcnMgZnJvbSAtLWRpc2FibGUtZm9vLgotCi1GcmkgRGVjIDI5IDA3OjU2OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IElmIGFueSBvZiB0aGUgbWFrZSB2YXJpYWJsZXMKLQlMQU5HVUFHRVMsIEJPT1RfQ0ZMQUdTLCBTVE1QX0ZJWFBST1RPLCBMSU1JVFNfSF9URVNULAotCUxJQkdDQzFfVEVTVCwgTElCR0NDMl9DRkxBR1MsIExJQkdDQzJfSU5DTFVERVMsIGFuZCBFTlFVSVJFIGFyZQotCW5vbi1lbXB0eSwgcGFzcyB0aGVtIG9uIHRvIHRoZSAJR0NDIG1ha2UuCi0JKGFsbC1ib290c3RyYXApOiBOZXcgcnVsZSB0aGF0IGlzIGxpa2UgYWxsLWdjYywgZXhjZXB0IGl0IGV4ZWN1dGVzCi0JdGhlIEdDQyBib290c3RyYXAgcnVsZSBpbnN0ZWFkIG9mIHRoZSBHQ0MgYWxsIHJ1bGUuCi0KLVdlZCBEZWMgMjcgMTU6NTE6NDggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluIChtbF9yZWFsc3JjZGlyKTogTmV3LCB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCi0KLVR1ZSBEZWMgMjYgMTE6NDU6MzEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKEFWaWlPTjpkZ3V4Oio6Kik6IFVwZGF0ZSBmcm9tIEZTRiB0byBhZGQgcGVudGl1bQotCURHL1VYIHN1cHBvcnQuCi0KLUZyaSBEZWMgMTUgMTA6MDE6MjcgMTk5NSAgU3RhbiBDb3ggIDxjb3hzQGRnLXJ0cC5kZy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGkqODYqKSBDaGFuZ2UgWzM0NV0gdG8gWzM0NTZdCi0KLVdlZCBEZWMgMjAgMTc6NDE6NDAgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBnYXMgb3IgbGQgaWYgLS13aXRoLWdudS1hcz1ubyBvcgotCS0td2l0aC1nbnUtbGQ9bm8uCi0KLVdlZCBEZWMgMjAgMTU6MTU6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKHJzNjAwMCosIHBvd2VycGMqKTogQWRkIHN3aXRjaGVzIHRvIGNvbnRyb2wgd2hpY2gKLQlBSVggbXVsdGlsaWJzIGdldCBidWlsdC4KLQotTW9uIERlYyAxOCAxNzo1NTo0NiAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LXdpbjMyKTogRG9uJ3QgYnVpbGQgZXhwZWN0IGlmIHdlJ3JlIG5vdAotCWJ1aWxkaW5nIHRoZSB0Y2wgc3ViZGlyLgotCi1Nb24gRGVjIDE4IDExOjQ3OjE5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IChjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzLCBhbGwtdGFyZ2V0LWV4YW1wbGVzKToKLQlOZXcgdGFyZ2V0cywgY29uZmlndXJlIGFuZCBidWlsZCBleGFtcGxlIHByb2dyYW1zLgotCi1GcmkgRGVjIDE1IDE2OjEzOjAzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogSWYgYW4gbXB3LWNvbmZpZy5pbiBnZW5lcmF0ZWQgYSBmaWxlIG1rLnNlZCwKLQl1c2UgaXQgYXMgaW5wdXQgdG8gc2VkaXQgdGhlIGdlbmVyYXRlZCBNUFcgbWFrZWZpbGUuCi0JKiBtcHctUkVBRE1FOiBBZGQgYSBzdWdnZXN0aW9uIGFib3V0IEdlc3RhbHQuaC4KLQotV2VkIERlYyAxMyAxNjo0Mzo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAqLSotaWVlZSouCi0KLVR1ZSBEZWMgMTIgMTE6NTI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogUmVtb3ZlICQoVEFSR0VUX1NVQkRJUikuICBGcm9tCi0JUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotTW9uIERlYyAxMSAxNTozMTo1OCAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1wb3dlcnBjLXBlKTogQWRkIG1hbnkgZGlyZWN0b3JpZXMgdG8gbm9jb25maWdkaXJzCi0JZm9yIHBvd2VycGMtcGUgbmF0aXZlLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgdGNsLCBtYWtlIHRvIG5vY29uZmlnZGlycyBpZiBjYW5hZGlhbiBjcm9zcy4KLQkodGFyZ2V0PT1wb3dlcnBjLXBlKTogZHVwbGljYXRlIGkzODYtd2luMzIgZW50cnkuCi0KLVNhdCBEZWMgIDkgMTQ6NTg6MjggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEV4Y2x1ZGUgdGFyZ2V0LW5ld2xpYiBmb3IgYWxsIHZlcnNpb25zCi0Jb2Ygdnh3b3Jrcywgbm90IGp1c3Qgdnh3b3JrczUuMS4KLQotTW9uIERlYyAgNCAxMjowNTo0MCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciBleGVjLXByZWZpeC4KLQotTW9uIERlYyAgNCAxMDoyMjo1MCAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSFAgbW9kZWwgODE2IG1hY2hpbmVzIGFzIGhhdmluZwotCWEgUEExLjEgcHJvY2Vzc29yLgotCi1Nb24gRGVjICA0IDEyOjM4OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZ25vcmUgbmV3IGF1dG9jb25mIGNvbmZpZ3VyZSBvcHRpb25zLgotCi1UaHUgTm92IDMwIDE0OjQ1OjI1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXY4MTAgKENDX0ZPUl9UQVJHRVQpOiBBZGQgLWFuc2kgZmxhZy4gIE5FQyBjb21waWxlcgotIAlkZWZhdWx0cyB0byBLJlIgbW9kZSwgYnV0IGRvZXNuJ3QgaGF2ZSB2YXJhcmdzLmgsIHNvIHdlIGhhdmUgdG8gCi0JY29tcGlsZSBpbiBBTlNJIG1vZGUuCi0KLVRodSBOb3YgMzAgMTY6NTc6MzMgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHdvbWJhdC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIFBlbnRpdW0gdW5kZXIgU0NPLgotCUZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotV2VkIE5vdiAyOSAxMzo0OTowOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSB0YXJnZXQtbGliaW8gb24gdjgxMC0qLSouCi0JKiBjb25maWcvbXQtdjgxMCAoQ0NfRk9SX1RBUkdFVCwgQVNfRk9SX1RBUkdFVCwgQVJfRk9SX1RBUkdFVCwKLQlSQU5MSUJfRk9SX1RBUkdFVCk6IFNldCBhcyBhcHByb3ByaWF0ZSBmb3IgTkVDIHY4MTAgdG9vbGNoYWluLgotCi1XZWQgTm92IDI5IDEyOjEyOjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgZ2FzIGZvciBhbHBoYS1kZWMtb3NmKi4KLQotVHVlIE5vdiAyOCAxNzoxNjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmYXVsdCB0byAtLXdpdGgtc3RhYnMgZm9yIHNvbWUgdGFyZ2V0cyBmb3Igd2hpY2gKLQlpdCBtYWtlcyBzZW5zZTogbWlwcyotKi0qLCBhbHBoYSotKi1vc2YqLCBpWzM0NV04NiotKi1zeXN2NCogYW5kCi0JaVszNDVdODYqLSotdW5peHdhcmUqLgotCi1Nb24gTm92IDI3IDEzOjQ0OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBHZXQgbGlzdCBvZiBtdWx0aWRpcnMgdXNpbmcgZ2NjIC0tcHJpbnQtbXVsdGktbGliCi0JcmF0aGVyIHRoYW4gYmFzaW5nIGl0IG9uIHRoZSB0YXJnZXQuICBTaW1wbGlmeSBoYW5kbGluZyBvZiBvcHRpb25zCi0JY29udHJvbGxpbmcgd2hpY2ggZGlyZWN0b3JpZXMgdG8gY29uZmlndXJlLiAgUmVtb3ZlIGV4dHJhbmVvdXMKLQlzbGFzaCBpbiBtdWx0aS1jbGVhbiB0YXJnZXQuCi0KLUZyaSBOb3YgMjQgMTc6Mjk6MjkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IFByZWZpeCBtb3JlIHZhcmlhYmxlcyB3aXRoIG1sXyBzbyB0aGV5IGRvbid0IGNvbGxpZGUKLQl3aXRoIGNvbmZpZ3VyZSdzLgotCi1XZWQgTm92IDIyIDExOjI3OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCB0dXJuIC12IGludG8gLS12LgotCi1UdWUgTm92IDIxIDE2OjQ4OjAyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IEZpeCB0eXBvLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIHN5bWxpbmstdHJlZS4KLQotVHVlIE5vdiAyMSAxNDowODoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3RyaXAgLS1ob3N0IGFuZCAtLXRhcmdldCBvcHRpb25zIGZyb20KLQlDT05GSUdfQVJHVU1FTlRTLCBhbmQgYWx3YXlzIGNvbmZpZ3VyZSBmb3IgLS1ob3N0IG9ubHkuICBBZGQKLQktLXdpdGgtY3Jvc3MtaG9zdCBvcHRpb24gd2hlbiBidWlsZGluZyB3aXRoIGEgY3Jvc3MtY29tcGlsZXIuCi0JKiBjb25maWd1cmU6IENhbm9uaWNhbGl6ZSB0aGUgYXJndW1lbnRzIHB1dCBpbnRvIGNvbmZpZy5zdGF0dXMgYnkKLQlhbHdheXMgdXNpbmcgYD0nIGZvciBhbiBvcHRpb24gd2l0aCBhbiBhcmd1bWVudC4gIFBhc3MgYSBwcmVzdW1lZAotCS0taG9zdCBvciAtLXRhcmdldCBleHBsaWNpdGx5LgotCi1GcmkgTm92IDE3IDE3OjUwOjMwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2UgLW1hY29zKiwgLW1hZ2ljKiwgLXBlKiwgYW5kIC13aW4zMiBjYXNlcwotCWludG8gZ2VuZXJhbCBPUyByZWNvZ25pdGlvbiBjYXNlLgotCi1GcmkgTm92IDE3IDE3OjQyOjI1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9jb25maWdkaXJzKTogYWRkIHRhcmdldC13aW5zdXAgb25seQotCWZvciB3aW4zMiB0YXJnZXQgc3lzdGVtcy4KLQotVGh1IE5vdiAxNiAxNDowNDo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmdsb3NzKTogRGVwZW5kIHVwb24KLQljb25maWd1cmUtdGFyZ2V0LW5ld2xpYiwgc2luY2Ugd2hlbiBsaWJnbG9zcyBpcyBidWlsdCBpdCBsb29rcyB0bwotCXNlZSBpZiB0aGUgbmV3bGliIGRpcmVjdG9yeSBleGlzdHMuCi0KLVdlZCBOb3YgMTUgMTQ6NDc6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBVc2UgY29uZmlnLW1sLmluIGluc3RlYWQgb2YKLQljZmctbWwtKi5pbi4KLQotV2VkIE5vdiAxNSAxMTo0NToyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIExEIGFuZCBMRF9GT1JfVEFSR0VUIHdoZW4gY29uZmlndXJpbmcgYQotCUNhbmFkaWFuIENyb3NzLgotCi1UdWUgTm92IDE0IDE1OjAzOjEyIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtaTM4NndpbjMyOiBhZGQgTERfRk9SX1RBUkdFVC4KLQotVHVlIE5vdiAxNCAxNDo1NjoxMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IGFkZCB0YXJnZXQtd2luc3VwLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgcGF0Y2ggZGlmZiBmbGV4IG1ha2UgdG8gJG5vY29uZmlnZGlycy4KLQkodGFyZ2V0PT1wcGNsZS1wZSk6IHJlbW92ZSBsZCBmcm9tICRub2NvbmZpZ2RpcnMuCi0KLVR1ZSBOb3YgMTQgMDE6MjU6NTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IFBhc3MgLS13aXRoLXRhcmdldC1zdWJkaXIuCi0JUHJlc2VydmUgcmVsYXRpdmUgcGF0aCBuYW1lcyBpbiAkc3JjZGlyLiAgQnVpbGQgc3ltbGluayB0cmVlIGlmCi0JY29uZmlndXJpbmcgY3Jvc3MgdGFyZ2V0IGRpciBhbmQgc3JjZGlyPS4gKD0gbm8gVlBBVEggc3VwcG9ydCkuCi0JKGNvbmZpZ3VyZS10YXJnZXQtbGliZysrKTogRGVwZW5kIG9uIGNvbmZpZ3VyZS10YXJnZXQtbGlicnguCi0JKiBjZmctbWwtY29tLmluLCBjZmctbWwtcG9zLmluOiBEZWxldGVkLgotCSogY29uZmlnLW1sLmluOiBOZXcgZmlsZS4KLQkqIHN5bWxpbmstdHJlZTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IEVuc3VyZSBzcmNkaXI9Ii4iIGlmIHRoYXQncyB3aGF0IGl0IGlzLgotCi1Nb24gTm92IDEzIDEyOjM0OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LVJFQURNRTogQ2xhcmlmeSBzb21lIHBocmFzaW5nLCBhZGQgbm90ZXMgYWJvdXQgQ29kZVdhcnJpb3IKLQlpbmNsdWRlcyBhbmQgRkxFWF9TS0VMRVRPTiBzZXR0aW5nLgotCSogbXB3LWNvbmZpZ3VyZSAoLS13aXRoLWdudS1sZCk6IE5ldyBvcHRpb24sIGNvbnRyb2xzIHdoZXRoZXIKLQl0byB1c2UgUFBDTGluayBvciBsZCB3aXRoIFBvd2VyTWFjIEdDQy4KLQkqIG1wdy1idWlsZC5pbiAoYWxsLWdyZXosIGRvLWdyZXosIGluc3RhbGwtZ3Jleik6IE5ldyB0YXJnZXRzLgotCSogbXB3LWNvbmZpZy5pbjogQ29uZmlndXJlIGdyZXogaWYgdGFyZ2V0aW5nIE1hYy4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IHBtYWMgYW5kIHBtYWMtbXB3IGFzIG5hbWVzIGZvciBQb3dlck1hY3MsCi0gCWFjY2VwdCBtcHcgYW5kIG1hYy1tcHcgYXMgbmFtZXMgZm9yIG02OGsgTWFjcywgY2hhbmdlIG1hY29zNyB0bwotIAlqdXN0IG1hY29zLgotCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgZ3JleiByZXNvdXJjZSBjb21waWxlciBpZiB0YXJnZXRpbmcgTWFjLgotCSogTWFrZWZpbGUuaW4gKGFsbC1ncmV6LCBpbnN0YWxsLWdyZXopOiBOZXcgdGFyZ2V0cy4KLQotV2VkIE5vdiAgOCAxNzozMzo1MSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQ1hYIGRlZmF1bHRzIHRvIGdjYywgbm90IGcrKy4gIElmIHdlIGZpbmQKLSAJZ2NjIGluIHRoZSBwYXRoLCBzZXQgQ0MgdG8gZ2NjIC1PMi4KLQotVHVlIE5vdiAgNyAxNTo0NToxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmYXVsdCAke2J1aWxkfSBjb3JyZWN0bHkuICBBdm9pZCBwaWNraW5nIHVwIGV4dHJhCi0Jc3BhY2VzIHdoZW4gcmVhZGluZyBDQyBhbmQgQ1hYIGZyb20gTWFrZWZpbGUuICBXaGVuIGRvaW5nIGEKLQlDYW5hZGlhbiBDcm9zcywgdXNlIHBsYXVzaWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgbnVtZXJvdXMKLQl2YXJpYWJsZXMuCi0JKiBjb25maWd1cmUuaW46IFdoZW4gZG9pbmcgYSBDYW5hZGlhbiBDcm9zcywgZG9uJ3QgdHJ5IHRvCi0JY29uZmlndXJlIHRvb2xzIHdob3NlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgaGFuZGxlIGl0LgotCi1Nb24gTm92ICA2IDE5OjMyOjE3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoc2gtKi0qKTogQWRkIG0yIGFuZCBtbC9tMiB0byBtdWx0aWRpcnMuCi0KLVN1biBOb3YgIDUgMDA6MTU6NDEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogIFJlbW92ZSBkdWJpb3VzIGJ1ZyByZXBvcnRpbmcgYWRkcmVzcy4KLQotRnJpIE5vdiAgMyAwODoxNzo1NCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6ICBJZiBzdWJkaXIgaGFzCi0JY29uZmlndXJlIHNjcmlwdCwgcnVuIHRoYXQgaW5zdGVhZCBvZiB0aGlzIGRpcmVjdG9yeSdzIGNvbmZpZ3VyZS4KLQlJbiBlaXRoZXIgY2FzZSwgcHJpbnQgYSBtZXNzYWdlIHRoYXQgd2UncmUgY29uZmlndXJpbmcgdGhlIHN1Yi1kaXIuCi0KLVRodSBOb3YgIDIgMjM6MjM6MzYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQmVmb3JlIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHZhcmlvdXMgZmlsZXMsCi0JdXNlIHNlZCB0byBmaWx0ZXIgb3V0ICJ0YXJnZXQtIi4KLQotVGh1IE5vdiAgMiAxMzoyNDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChET19YKTogU3BsaXQgcnVsZSB0byBkZWNyZWFzZSBjb21tYW5kIGxpbmUgbGVuZ3RoCi0JZm9yIHN5c3RlbXMgd2l0aCBzbWFsbCBBUkdfTUFYIHZhbHVlcy4gIEZyb20gcGhkbUBpbmZvLnVjbC5hYy5iZQotCShQaGlsaXBwZSBEZSBNdXl0ZXIpLgotCi1XZWQgTm92ICAxIDE1OjE4OjM1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXBhdGNoKTogZGVwZW5kIG9uIGFsbC1saWJpYmVydHkuCi0KLVdlZCBOb3YgIDEgMTI6MjM6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIHRoZSBvbmx5IGRpcmVjdG9yeSBpbiB0YXJnZXRfY29uZmlnZGlycyB3aGljaAotCWFjdHVhbGx5IGV4aXN0cyBpcyBsaWJpYmVydHksIHRoZW4gc2V0IHRhcmdldF9jb25maWdkaXJzIHRvIGVtcHR5LAotCXRvIGF2b2lkIHRyeWluZyB0byBidWlsZCBhIHRhcmdldCBsaWJpYmVydHkgaW4gYSBnYXMgb3IgZ2RiCi0JZGlzdHJpYnV0aW9uLgotCi1UdWUgT2N0IDMxIDE3OjUyOjM5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BzbGF2ZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6IFVzZSBtNjhrLXN1bi1zdW5vcyogaW5zdGVhZAotIAlvZiBtNjhrLXN1bi0qIHdoZW4gc2VsZWN0aW5nIG1oLXN1bjMgdG8gYXZvaWQgbWF0Y2hpbmcgTmV0QlNEL3N1bjMKLSAJc3lzdGVtcy4KLQotVHVlIE9jdCAzMSAxNjo1NzozMiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY29weV9kaXJzKTogVXNlIHN5cy1pbmNsdWRlIGluc3RlYWQgb2YgaW5jbHVkZQotCWZvciAtLXdpdGgtaGVhZGVycyBvcHRpb24uCi0KLVR1ZSBPY3QgMzEgMTA6Mjk6MzYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogTWFrZSB3aW5zdXAgYnVpbGRzIHdvcmsgd2l0aAotCW5ldyBzY2hlbWUuCi0KLU1vbiBPY3QgMzAgMTg6NTc6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIHRoZSBsaW5rZXIgb24gQUlYLgotCi1Nb24gT2N0IDMwIDEyOjI3OjE2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiAgQWRkICQoVEFSR0VUX1NVQkRJUikKLQl3aGVyZSBuZWVkZWQuCi0KLU1vbiBPY3QgMzAgMTI6NDU6MjUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IEZpeCB0eXBvLgotCi1TYXQgT2N0IDI4IDEwOjI3OjU5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDSEVDS19UQVJHRVRfTU9EVUxFUykpOiAgRml4IHR5cG8uCi0KLUZyaSBPY3QgMjcgMjM6MTQ6MTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlbmFtZSBsaWJGT08gdG8gdGFyZ2V0LWxpYkZPTywgYW5kIHhpYmVydHkKLQl0byB0YXJnZXQteGliZXJ0eSwgdG8gcHJvdmlkZSBtb3JlIGZsZXhpYmlsaXR5LgotCSh0YXJnZXRfc3ViZGlyKTogIERlZmluZS4gIENyZWF0ZSBpZiBjcm9zcy4KLQlTZXQgVEFSR0VUX1NVQkRJUiBpbiBNYWtlZmlsZSB0byAke3RhcmdldF9zdWJkaXJ9LgotCSogTWFrZWZpbGUuaW46ICBSZW5hbWUgYWxsLWxpYkZPTyAtPiBhbGwtdGFyZ2V0LWxpYkZPTywgYWxsLXhpYmVydHkKLQktPiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSwgY29uZmlndXJlLWxpYkZPTyAtPiBjb25maWd1cmUtdGFyZ2V0LWxpYkZPTywKLQljaGVjay1saWJGT08gLT4gY2hlY2stdGFyZ2V0LWxpYkZPTywgZXRjLgotCSgkKERPX1gpKTogIEl0ZXJhdGUgb3ZlciBUQVJHRVRfQ09ORklHRElSUyBhZnRlciBTVUJESVJTLgotCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyksICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpLAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSwgJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSk6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkoY29uZmlndXJlLXRhcmdldC1YWFgpOiAgRGVwZW5kIG9uICQoQUxMX0dDQyksIG5vdCBhbGwtZ2NjLCB0bwotCWFsbG93IEFMTF9HQ0M9IiIgdG8gb25seSBjb25maWd1cmUuCi0JKERFVk9fU1VQUE9SVCk6ICBBZGQgY2ZnLW1sLWNvbS5pbiBhbmQgY2ZnLW1sLXBvcy5pbi4KLQkoRVRDX1NVUFBPUlQsIEVUQ19TVVBQT1JUX1BGWCk6ICBNZXJnZTsgIHVwZGF0ZSAndGF6JyBhY2NvcmRpbmdseS4KLQkoTElCR1hYX1NVUFBPUlRfRElSUyk6ICBSZW1vdmUgeGliZXJ0eS4KLQotU2F0IE9jdCAyOCAwMTo1Mzo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEJ1aWxkICJpbmZvIiBpbiBldGMgZXhwbGljaXRseS4KLQotRnJpIE9jdCAyNyAwOTozMjozMCAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIHN1cmUgdGhhdCBDQyBpcyB1bmRlZmluZWQgKGFzIG9wcG9zZWQgdG8KLQludWxsKSBpZiB0b3BsZXZlbC9jb25maWcvbWgte2hvc3R9IGRvZXNuJ3QgZGVmaW5lIGl0LiAgRml4ZXMgYQotCXByb2JsZW0gd2l0aCBhdXRvY29uZiB0cnlpbmcgdG8gY29uZmlndXJlIG9uIGEgaG9zdCB3aXRob3V0IEdDQy4KLQotVGh1IE9jdCAyNiAyMjozNTowMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IFNldCBob3N0IGFsaWFzIGZyb20gY2hvaWNlIG9mIGhvc3QgY29tcGlsZXIsCi0Jb25seSB1c2UgZ2VuZXJpYyBNUFcgTWFrZWZpbGUgc2VkIGlmIHByZXNlbnQsIGVkaXQgYSBmaWxlCi0JbmFtZWQgImhhY2tlZF9NYWtlZmlsZS5pbiIgaW5zdGVhZCBvZiAiTWFrZWZpbGUuaW4iIGlmIHByZXNlbnQuCi0JKiBtcHctUkVBRE1FOiBBZGQgcHJvYmxlbSBub3RlcyBhYm91dCBDVzYgYW5kIENXNy4KLQotVGh1IE9jdCAyNiAwNTo0NToxMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFVzZSAiOyIgaW5zdGVhZCBvZiAiOzsiLgotCi1XZWQgT2N0IDI1IDE1OjE4OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIEdyZXAgZm9yICdeZGlzdHN0dWZmOicgb3IgJ15pbmZvOicgaW4KLQlzdWItZGlyZWN0b3J5IE1ha2VmaWxlcywgaW5zdGVhZCBvZiB1c2luZyBESVNUU1RVRkZESVJTIGFuZAotCURJU1RET0NESVJTLgotCShESVNUU1RVRkZESVJTLCBESVNURE9DRElSUyk6ICBSZW1vdmVkIC0gbm8gbG9uZ2VyIHVzZWQuCi0JKG5ld2xpYi50YXIuZ3opOiAgRG9uJ3QgcGFzcyBESVNURE9DRElSUyB0byByZWN1cnNpdmUgbWFrZS4KLQotV2VkIE9jdCAyNSAxNDo0Mzo1NSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogIFJlbW92ZSBsZCBncHJvZiBibnV0aWxzIGdhcyBsaWJnKysgZ2RiCi0JYW5kIGduYXRzLCBiZWNhdXNlIHRoZXkgYXJlIG5vdyBzdWJzdW1lZCBieSBESVNUU1RVRkZESVJTLgotCU1vdmUgYmZkIHRvIERJU1RTVFVGRkRJUlMuCi0KLVR1ZSBPY3QgMjQgMTg6MTk6MDkgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYMTFfTElCKTogUmVtb3ZlZC4KLQkoWDExX0ZMQUdTX1RPX1BBU1MpOiBwYXNzIG9ubHkgWDExX0VYVFJBX0NGTEFHUyBhbmQgWDExX0VYVFJBX0xJQlMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogbWgtYWl4ICYgbWgtc3VuIHJlbW92ZWQuCi0KLVN1biBPY3QgMjIgMTM6MDQ6NDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKik6IFNob3J0ZW4gc29tZSBvZiB0aGUgbXVsdGlsaWIgZGlyZWN0b3J5Ci0JbmFtZXMuCi0KLUZyaSBPY3QgMjAgMTg6MDI6MTAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi1lYWJpKik6IEFkZCBtY2FsbC1haXhkZXNjIHZhcmllbnRzLgotCi1UaHUgT2N0IDE5IDEwOjQwOjU3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi13aW4zMik6IEFsd2F5cyBidWlsZCBuZXdsaWIuCi0JRG9uJ3QgY29uZmlndXJlIGN2cywgYXV0b2NvbmYgb3IgdGV4aW5mby4KLQkqIE1ha2VmaWxlLmluIChMRF9GT1JfVEFSR0VUKTogTmV3LgotCShCQVNFX0ZMQUdTX1RPX1BBU1MsIEVYVFJBX1RBUkdFVF9GTEFHUywgQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKToKLQlQYXNzIGRvd24gTERfRk9SX1RBUkdFVC4KLQotV2VkIE9jdCAxOCAxNTo1Mzo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3aW5zdXA6IE5ldyBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgd2luc3VwLgotCSogY29uZmlndXJlLmluOiBXaW5zdXAgaXMgY29uZmlndXJlZCB3aGVuIHRhcmdldCBpcyB3aW4zMi4KLQlDYW4gb25seSBidWlsZCB3aW4zMiB0YXJnZXQgR0RCIHdoZW4gbmF0aXZlLgotCQotTW9uIE9jdCAxNiAwOTo0MjozMSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEhQIG1vZGVsIDgxOSBtYWNoaW5lcyBhcyBoYXZpbmcKLQlhIFBBIDEuMSBwcm9jZXNzb3IuCi0KLU1vbiBPY3QgMTYgMTA6NDk6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEZpeCBzZWQgbG9vcCB3aGljaCBzdWJzdGl0dXRlcyBmb3IgQ0MgYW5kIENYWCB0bwotCWF2b2lkIGJ1ZyBmb3VuZCBpbiB2YXJpb3VzIHNlZCBpbXBsZW1lbnRhdGlvbnMuCi0KLVdlZCBPY3QgMTEgMTY6MTY6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjLSotZWFiaXNpbSk6IERlbGV0ZSBzZXBhcmF0ZSBydWxlIGZvcgotCXNpbXVsYXRvci4gIFVzZSBzdGFuZGFyZCBwb3dlcnBjLSotZWFiaSouCi0KLU1vbiBPY3QgIDkgMTc6MjE6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN0b3AgcHV0dGluZyBnYXMgYW5kIGJpbnV0aWxzIGluIG5vY29uZmlnZGlycyBmb3IKLQlwb3dlcnBjLSotYWl4KiBhbmQgcnM2MDAwLSotKi4KLQotTW9uIE9jdCAgOSAxMjozODo0MCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZwotCS1tY2FsbC1haXhkZXNjIGxpYnJhcmllcy4KLQotRnJpIE9jdCAgNiAxNjoxNzo1NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy5zdWIgKGFybSB8IGFybWVsIHwgYXJtZWIpOiBGaXggc2hlbGwgc3ludGF4LgotCi1GcmkgT2N0ICA2IDE0OjQwOjI4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoe3Bvd2VycGMscnM2MDAwfS1pYm0tYWl4Kik6IEFkZCBtdWx0aWxpYnMgZm9yCi0JLW1zb2Z0LWZsb2F0IGFuZCAtbWNwdT1jb21tb24gc3VwcG9ydC4KLQkocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyAtbWNhbGwtYWl4Ci0JbGlicmFyaWVzLgotCi1UaHUgT2N0ICA1IDEzOjI2OjM3IDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBbGxvdyBjb25maWd1cmF0aW9uIGFuZCBidWlsZCBvZiBlbWFjczE5IGZvciB0aGUgYWxwaGEuCi0KLVdlZCBPY3QgIDQgMjI6MDU6MzYgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoQ0MpOiBHZXQgXkNDLCBub3QganVzdCBhbnkgb2xkIENDLCBmcm9tCi0JJHtob3N0X21ha2VmaWxlX2ZyYWd9LgotCi1XZWQgT2N0ICA0IDIxOjU1OjAwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKENDKTogVHJ5IHRvIGdldCBDQyBmcm9tIAotCSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30sIG5vdCAke2hvc3RfbWFrZWZpbGVfZnJhZ30uCi0KLVdlZCBPY3QgIDQgMjE6NDQ6MTIgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IGNvbmZpZ3VyZSB0YXJnZXRkaXJzCi0Jb25seSBpZiBpdCBleGlzdHMgaW4gJChzcmNkaXIpLgotCi1XZWQgT2N0ICA0IDExOjUyOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBDQyBhbmQgQ1hYIGFyZSBub3Qgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgc2V0Ci0JdGhlbSwgYmFzZWQgb24gZWl0aGVyIGFuIGV4aXN0aW5nIE1ha2VmaWxlIG9yIG9uIHNlYXJjaGluZyBmb3IgZ2NjCi0JaW4gUEFUSC4gIFN1YnN0aXR1dGUgZm9yIENDIGFuZCBDWFggaW4gTWFrZWZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBsaWJtIGZyb20gdGFyZ2V0X2xpYnMuICBTZXBhcmF0ZQotCXRhcmdldF9jb25maWdkaXJzIGZyb20gY29uZmlnZGlycy4gIElmIENDIGlzIG5vdCBzZXQgaW4KLQllbnZpcm9ubWVudCwgdHJ5IHRvIGdldCBpdCBmcm9tIGEgaG9zdCBNYWtlZmlsZSBmcmFnbWVudC4gIFJld3JpdGUKLQljaGFuZ2VzIG9mIGNvbmZpZ2RpcnMgdG8gdXNlIHNraXBkaXJzIGluc3RlYWQuICBBIGZldyBtaW5vcgotCXR3ZWFrcy4gIFRha2UgZGlyZWN0b3JpZXMgb3V0IG9mIHRhcmdldF9jb25maWdkaXJzIGFzIHRoZXkgYXJlCi0JdGFrZW4gb3V0IG9mIGNvbmZpZ2RpcnMuICBSZW1vdmUgZXhpc3RpbmcgTWFrZWZpbGUgZmlsZXMgZnJvbQotCXN1YmRpcmVjdG9yaWVzLiAgU3Vic3RpdHV0ZSBmb3IgVEFSR0VUX0NPTkZJR0RJUlMgYW5kCi0JQ09ORklHX0FSR1VNRU5UUyBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IE5ldyB2YXJpYWJsZSwgYXV0b21hdGljYWxseSBzZXQKLQlieSBjb25maWd1cmUuaW4uCi0JKENPTkZJR19BUkdVTUVOVFMpOiBMaWtld2lzZS4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogTmV3IHZhcmlhYmxlLgotCSgkKERPX1gpKTogTG9vcCBvdmVyIFRBUkdFVF9DT05GSUdESVJTIGFzIHdlbGwgYXMgU1VCRElSUy4KLQkoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogTmV3IHRhcmdldC4KLQkoY29uZmlndXJlLWxpYmcrKywgY29uZmlndXJlLWxpYmlvKTogTmV3IHRhcmdldHMuCi0JKGFsbC1saWJnKyspOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliZysrLgotCShhbGwtbGliaW8pOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliaW8uCi0JKGNvbmZpZ3VyZS1saWJnbG9zcywgYWxsLWxpYmdsb3NzKTogTmV3IHRhcmdldHMuCi0JKGNvbmZpZ3VyZS1saWJzdGRjKyspOiBOZXcgdGFyZ2V0LgotCShhbGwtbGlic3RkYysrKTogRGVwZW5kIHVwb24gY29uZmlndXJlLWxpYnN0ZGMrKy4KLQkoY29uZmlndXJlLWxpYnJ4LCBhbGwtbGlicngpOiBOZXcgdGFyZ2V0cy4KLQkoY29uZmlndXJlLW5ld2xpYik6IE5ldyB0YXJnZXQuCi0JKGFsbC1uZXdsaWIpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbmV3bGliCi0JKGNvbmZpZ3VyZS14aWJlcnR5KTogTmV3IHRhcmdldC4KLQkoYWxsLXhpYmVydHkpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUteGliZXJ0eS4KLQotU2F0IFNlcCAzMCAwNDozMjo1OSAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6ICBFeHBhbmQgdGhlCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1UaHUgU2VwIDI4IDIxOjE4OjQ5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogRml4IHNlZCBjb21tYW5kIGZpbGUgbmFtZS4KLQotVGh1IFNlcCAyOCAxNzozOTo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6IFJlZHVjZSB0aGUgCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1XZWQgU2VwIDI3IDEyOjI0OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGQgYW5kIGdkYiBmb3IgcG93ZXJwYyotKi13aW5udCoKLQlvciBwb3dlcnBjKi0qLXBlKiwgc2luY2UgdGhleSBhcmUgbm90IHlldCBzdXBwb3J0ZWQuCi0KLVR1ZSBTZXAgMjYgMTQ6MzA6MDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JQWRkIFBvd2VyTWFjIHN1cHBvcnQgYW5kIG1hbnkgb3RoZXIgZW5oYW5jZW1lbnRzLgotCSogbXB3LWNvbmZpZ3VyZTogTmV3IG9wdGlvbiAtLWNjIHRvIHNlbGVjdCBjb21waWxlciB0byB1c2UsCi0JcGFzdGUgb3B0aW9ucyBzZXQgYWNjb3JkaW5nIHRvIC0tY2MgaW50byB0aGUgZ2VuZXJhdGVkCi0JTWFrZWZpbGUsIGdlbmVyYXRlIHRoZSBNYWtlZmlsZSBieSBzZWQnaW5nIHRoZSBVbml4IE1ha2VmaWxlLmluCi0JaWYgbXB3LW1ha2Uuc2VkIGlzIHByZXNlbnQuCi0JKiBtcHctY29uZmlnLmluOiBEb24ndCB0ZXN0IGZvciBnQzEsIHRlc3QgZm9yIG1wdy10b3VjaCwKLQlhZGQgZm9yd2FyZCBpbmNsdWRlcyBmb3IgUG93ZXJQQyBpbmNsdWRlIGZpbGVzLgotCSogbXB3LWJ1aWxkLmluOiBCdWlsZCB1c2luZyBNYWtlZmlsZS5QUEMgaWYgcHJlc2VudC4KLQkoZG8tYnlhY2MsIGV0Yyk6IFJlbW92ZSBzZXBhcmF0ZSB2ZXJzaW9uIHJlc291cmNlIGJ1aWxkcy4KLQkoZG8tZ2FzKTogQnVpbGQgInN0YW1wcyIgYmVmb3JlICJhbGwiLgotCShkby1nY2MpOiBCdWlsZCAic3RhbXBzLWgiIGFuZCAic3RhbXBzLWMiIGJlZm9yZSAiYWxsIi4KLQkqIG1wdy1SRUFETUU6IFVwZGF0ZSB0byByZWZsZWN0IC0tY2Mgb3B0aW9uLCBQb3dlck1hYyBzdXBwb3J0LAotCWFuZCByZWNlbnRseS1yZXBvcnRlZCBjb21wYXRpYmlsaXR5IHByb2JsZW1zLgotCi1GcmkgU2VwIDIyIDEyOjE1OjQyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAobTY4Ki0qLSopOiBPbmx5IGJ1aWxkIG11bHRpbGlicyBmb3IKLQllbWJlZGRlZCBtNjhrIHN5c3RlbXMgKC1hb3V0LCAtY29mZiwgLWVsZiwgLXZ4d29ya3MpLgotCSgtLXdpdGgtbXVsdGlsaWItdG9wKTogUGFzcyB0byByZWN1cnNpdmUgaW52b2NhdGlvbnMuCi0KLVR1ZSBTZXAgMTkgMTM6NTE6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSBsaWJnKysgYW5kIGxpYnN0ZGMrKyBvbgotCXY4MTAtKi0qLgotCi1Nb24gU2VwIDE4IDIzOjA4OjI2IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIGJmZCwgYmludXRpbHMsIGdhcywgZ2NjLAotCWdkYiwgbGQgYW5kIG9wY29kZXMgb24gdjgxMC0qLSouCi0KLVNhdCBTZXAgMTYgMTg6MzE6MDggUERUIDE5OTUgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgPGFuZ2VsYUBjeWdudXMuY29tPgotCQotCSogY29uZmlnL21oLW5jcnN2cjQzOiBSZW1vdmVkIEFSX0ZMQUdTCi0KLVR1ZSBTZXAgMTIgMTg6MDM6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRE9fWCk6IENoYW5nZSBkby1yZWFsY2xlYW4gdG8gZG8tbWFpbnRhaW5lci1jbGVhbi4KLQkobG9jYWwtbWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0JKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCShyZWFsY2xlYW4pOiBKdXN0IGRlcGVuZCB1cG9uIG1haW50YWluZXItY2xlYW4uCi0KLUZyaSBTZXAgIDggMTc6MTE6MTQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgZ2RiIG9uIG02OGstKi1uZXRic2QqLgotCi1GcmkgU2VwICA4IDE2OjQ2OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsZCBpbiBtaXBzKi0qLWJzZCogY2FzZS4KLQotVGh1IFNlcCAgNyAyMDowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1saXRlcyogT1MuICBGcm9tIElhbiBEYWxsLgotCi1GcmkgU2VwICAxIDA4OjA2OjU4IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiByZWNvZ25pc2UgbWlwczY0dnI0MzAwIGFuZCBtaXBzNjR2cjQzMDBlbCBhcyB2YWxpZAotIAl0YXJnZXRzLgotCi1XZWQgQXVnIDMwIDIxOjA2OjUwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHRyZWF0IGkzODYtd2luMzIgY2FuYWRpYW4gY3Jvc3MgdGhlIHNhbWUgYXMKLQlpMzg2LWdvMzIgY2FuYWRpYW4gY3Jvc3MuCi0KLVRodSBBdWcgMjQgMTQ6NTM6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi0qLWVhYmlzaW0pOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQwotCXJ1bm5pbmcgdW5kZXIgdGhlIHNpbXVsYXRvciB0byBidWlsZCBhIHJlZHVjZWQgc2V0IG9mIGxpYnJhcmllcy4KLQkocG93ZXJwYy0qLWVhYmlhaXgpOiBBZGQgZmluZSBncmFpbmVkIG11bHRpbGliIHN1cHBvcnQgYWRkZWQgdG8KLQlvdGhlciBwb3dlcnBjIHRhcmdldHMgeWVzdGVyZGF5LgotCi1XZWQgQXVnIDIzIDA5OjQxOjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyopOiBBZGQgc3VwcG9ydCBmb3IgLWRpc2FibGUtYmllbmRpYW4sCi0JLWRpc2FibGUtc29mdGZsb2F0LCAtZGlzYWJsZS1yZWxvY2F0YWJsZSwgLWRpc2FibGUtYWl4LCBhbmQKLQktZGlzYWJsZS1zeXN2IHRvIGNvbnRyb2wgd2hpY2ggbXVsdGlsaWIgbGlicmFyaWVzIGdldCBidWlsdC4KLQotVGh1IEF1ZyAxNyAxNjowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQWRkIE1ha2VmaWxlLnRlbSB0byBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSBpbiB0cmFwCi0JaGFuZGxlci4KLQotTW9uIEF1ZyAxNCAxOToyNzo1NiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzICgqTGludXgqKTogIEFkZCBtaXNzaW5nICJleGl0InMuCi0JQWxzbywgbmVlZCBzcGVjaWZpYyBjaGVjayBmb3IgYWxwaGEtdW5rbm93bi1saW51eCAodXNlcyBDT0ZGKS4KLQotRnJpIEF1ZyAxMSAxNTozODoyMCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0Y6Ci0KLQlXZWQgSnVuIDI4IDE3OjU3OjI3IDE5OTUgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCSogY29uZmlnLmd1ZXNzIChBSVg0KTogTW9yZSByb2J1c3QgcmVsZWFzZSBudW1iZXJpbmcgZGlzY292ZXJ5LgotCi0JVGh1IEp1biAyMiAxOTowMToyNCAxOTk1ICBLZW5uZXRoIFN0YWlsZXkgIChrc3RhaWxleUBlYWdsZS5kb2wtZXNhLmdvdikKLQkqIGNvbmZpZy5ndWVzcyAoaTM4Ni1zZXF1ZW50LXB0eCk6IFByb3Blcmx5IGdldCB2ZXJzaW9uIG51bWJlci4KLQotCVRodSBKdW4gMjIgMTg6MzY6NDIgMTk5NSAgVXdlIFNlaW1ldCAgKHNlaW1ldEBpcmlzMS5jaGVtaWUudW5pLWtsLmRlKQotCSogY29uZmlnLmd1ZXNzIChtaXBzOio6NCo6VU1JUFMpOiBOZXcgY2FzZS4KLQotTW9uIEF1ZyAgNyAwOToyMTozNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtZ28zMiBob3N0KTogRml4IHR5cG8gKGRlamEtZ251IC0+IGRlamFnbnUpLgotCShpMzg2LXdpbjMyIGhvc3QpOiBMaWtld2lzZS4gIERvbid0IGJ1aWxkIHJlYWRsaW5lLgotCi1TYXQgQXVnICA1IDA5OjUxOjQ5IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEdEQlRLX1NVUFBPUlRfRElSUyk6ICBEZWZpbmUgYW5kIHBhc3MgYXMgcGFydCBvZgotCVNVUFBPUlRfRklMRVMgdG8gc3VibWFrZXMuCi0KLUZyaSBBdWcgIDQgMTM6MDQ6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChHREJfU1VQUE9SVF9ESVJTKTogQWRkIHV0aWxzLgotCShERVZPX1NVUFBPUlQpOiBBZGQgbXB3LVJFQURNRSwgbXB3LWJ1aWxkLmluLCBtcHctY29uZmlnLmggYW5kCi0JbXB3LWNvbmZpZ3VyZS4KLQotV2VkIEF1ZyAgMiAxNjozMjo0MCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhcHBkaXJzKTogVXNlID0sIG5vdCA9PSwgaW4gdGVzdCBleHByZXNzaW9uIHdoZW4KLQl0cnlpbmcgdG8gYnVpbGQgdGhlIHRleHQgdG8gcHJpbnQgaW4gdGhlIHdhcm5pbmcgbWVzc2FnZSBmb3IKLQlTb2xhcmlzIHVzZXJzLgotCi1Nb24gSnVsIDMxIDA5OjU2OjE4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW4gKHo4ay0qLWNvZmYpOiBBZGQgJ3N0ZCcgbXVsdGlsaWIgYnVpbGQuCi0KLUZyaSBKdWwgMjggMDA6MTY6MzEgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGx5bngtMi4zLgotCi1UaHUgSnVsIDI3IDE1OjQ3OjU5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKHo4a3NpbSk6IERlbGV0ZWQKLQkoejhrLSotY29mZik6IE5ldywgdGhpcyBpcyB0aGUgb25lIHRydWUgbmFtZSBvZiB0aGUgdGFyZ2V0LgotCi1UaHUgSnVsIDI3IDE0OjMzOjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1wb3MuaW4gKGRvdGRvdCk6IFdvcmsgYXJvdW5kIFN1bk9TIHNlZCBidWcuCi0KLVRodSBKdWwgMjcgMTM6MzE6MDUgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBGaXJzdCB0cnkgYXNraW5nIHRoZSBsaW5rZXIgd2hhdCB0aGUKLQlkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcyAoZWxmLCBhb3V0LCBvciBjb2ZmKS4gIFRoZW4gaWYgdGhpcwotCWZhaWxzLCB0cnkgcHJldmlvdXMgbWV0aG9kcy4KLQotVGh1IEp1bCAyNyAxMToyODoxNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciAqLSotdnh3b3JrczUuMS4KLQotVGh1IEp1bCAyNyAxMToxODo0NyAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciBhMjlrLSotdnh3b3JrczUuMS4KLQkqIHRlc3QtYnVpbGQubWs6IEFkZCBzZXR0aW5nIG9mIC0td2l0aC1oZWFkZXJzIGZvciBhMjlrLXZ4d29ya3M1LjEuCi0KLVR1ZSBKdWwgMjUgMjE6MjU6MzkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLXBvcy5pbiAoTVVMVElUT1ApOiBUcmltIGV4Y2VzcyB0cmFpbGluZyAiLy4iLgotCi1GcmkgSnVsIDIxIDEwOjQxOjEyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1jb20uaW46IE5ldyBmaWxlLgotCSogY2ZnLW1sLXBvcy5pbjogTmV3IGZpbGUuCi0KLVdlZCBKdWwgMTkgMDA6Mzc6MjcgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIENPUFlJTkcuTkVXTElCOiBBZGQgSFAgZnJlZSBjb3B5cmlnaHQgdG8gbGlzdC4KLQotVHVlIEp1bCAxOCAxMDo1ODo1MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSAtZWFiaSogZm9yIHRoZSBzeXN0ZW0sIG5vdCBqdXN0IC1lYWJpLgotCi1Nb24gSnVsICAzIDEzOjQ0OjUxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2ZpbGUuaW4gKERMTFRPT0xfRk9SX1RBUkdFVCk6IE5ldyBuYW1lLCBwYXNzIGl0IGRvd24uCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW4gKHdpbjMyKTogTmV3IHRhcmdldCBhbmQgaG9zdC4KLQotV2VkIEp1biAyOCAyMzo1NzowOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBpMzg2LXBlIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBKdW4gMjMgMTQ6Mjg6NDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctYnVpbGQuaW4gKGluc3RhbGwpOiBJbnN0YWxsIEdEQiBhZnRlciBMRC4KLQotVGh1IEp1biAyMiAxNzoxMDo1MyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW4gKGVsZi9taXBzLmgpOiBBbHdheXMgZm9yd2FyZC1pbmNsdWRlLCBuZWVkZWQKLQlmb3IgR0RCIHRvIGJ1aWxkLgotCi1XZWQgSnVuIDIxIDE1OjE3OjMwIDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotCSogdGVzdHN1aXRlOiBOZXcgZGlyZWN0b3J5IGZvciBjdXN0b21lciBhY2NlcHRhbmNlIGFuZCB3aG9sZSB0b29sCi0JY2hhaW4gdGVzdHMuCi0KLVdlZCBKdW4gMjEgMTY6NTA6MjkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBwZXItaG9zdCBsaW5lIGlzbid0IGZvdW5kLCBidXQgQUNfT1VUUFVUIGlzIGZvdW5kCi0JYW5kIGEgY29uZmlndXJlIHNjcmlwdCBleGlzdHMsIHJ1biBpdCBpbnN0ZWFkLgotCi1UaHUgSnVuIDE1IDIxOjA5OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YsIGZvciBhbHBoYS1kZWMtd2lubnQzLjUgYW5kICBDcmF5cy4KLQotVHVlIEp1biAxMyAyMTo0MzoyNyAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogU2V0IGJ1aWxkX3tjcHUsdmVuZG9yLG9zLGFsaWFzfSB0byBob3N0IHZhbHVlcyB3aGVuCi0JLS1idWlsZCBpc24ndCBzcGVjaWZpZWQuCi0KLU1vbiBKdW4gIDUgMTg6MjY6MzYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChQSUNGTEFHLCBQSUNGTEFHX0ZPUl9UQVJHRVQpOiBOZXcgbWFjcm9zLgotCShGTEFHU19UT19QQVNTKTogUGFzcyB0aGVtLgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KLQotCSogY29uZmlnL20/LSpwaWM6IERlZmluZSBQSUNGTEFHKiBpbnN0ZWFkIG9mIExJQipGTEFHUyouCi0KLVdlZCBNYXkgMzEgMjI6Mjc6NDIgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWxpYmcrKyk6IERlcGVuZCBvbiBhbGwtbGlic3RkYysrLgotCi1UaHUgTWF5IDI1IDIyOjQwOjU5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBFbmFibGUgYWxsIHBhY2thZ2VzIGZvcgotCSAgaTM4Ni11bmtub3duLW5ldGJzZC4KLQotU2F0IE1heSAyMCAxMzoyMjozMSAxOTk1ICBBbmdlbGEgTWFyaWUgVGhvbWFzICA8YW5nZWxhQGNpcmRhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERvbid0IGNvbmZpZ3VyZSB0ayBmb3IgaTM4Ni1nbzMyCi0JaG9zdGVkIGJ1aWxkcyAoRE9TIGJ1aWxkcykKLQotVGh1IE1heSAxOCAxODowODo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZvciBBUk0gYmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJpY2hhcmQgRWFybnNoYXc6Ci0JKiBjb25maWcuc3ViOiBIYW5kbGUgYXJtZWIgYW5kIGFybWVsLgotCSogY29uZmlndXJlLmluOiBPbWl0IGFybSBsaW5rZXIgb25seSBmb3IgcmlzY2l4LgotCi1UaHUgTWF5IDExIDE3OjIzOjI2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YuCi0KLVR1ZSBNYXkgIDkgMTU6NTI6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBwb3dlcnBjbGUgYXMgdGhlIGxpdHRsZSBlbmRpYW4gdmFyaWVudCBvZgotCXRoZSBQb3dlclBDLiAgUmVjZ29uaXplIHBwYyBhcyBhIFBvd2VyUEMgdmFyaWFudCwgYW5kIHBwY2xlIGFzIGEKLQlwb3dlcnBjbGUgdmFyaWFudC4gIENvbnZlcnQgcGVudGl1bSBpbnRvIGk1ODYsIG5vdCBpNDg2LiAgQWRkIHA1Ci0JYWxpYXMgZm9yIGk1ODYuICBNYXAgbmV3IHg4NiB2YXJpYW50cyBwNiwgazUsIG5leGdlbiBpbnRvIGk1ODYKLQl0ZW1wb3JhcmlseS4KLQotVHVlIE1heSAgMiAxNjoyOTo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLWxpdGVzKik6IFRyZWF0IGxpa2UgaHBwYSotKi0qZWxmKi4KLQotU3VuIEFwciAzMCAyMTozODowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1saXRlcyogYXMgYSBiYXNpYyBzeXN0ZW0gdHlwZS4KLQotVGh1IEFwciAyNyAxMTozMzoyOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzICgqOkxpbnV4Oio6Kik6IENoZWNrIGZvciB3aGV0aGVyIHRoZSBwcmUtQkZEIGxpbmtlciBpcwotCWluc3RhbGxlZCwgYW5kIGlmIHNvIHJldHVybiBsaW51eG9sZGxkIGFzIHRoZSBzeXN0ZW0gbmFtZS4KLQotV2VkIEFwciAyNiAxMDo1OTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgaHBwYTEuMS1ocC1saXRlcyBzdXBwb3J0LgotCi1UdWUgQXByIDI1IDExOjA4OjExIDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBuZXdsaWIgZm9yIG02OGstdnh3b3JrczUuMS4KLQotV2VkIEFwciAxOSAxNzowMjo0MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zZ2ktaXJpeDYpOiBVc2UgbWgtaXJpeDUuCi0KLUZyaSBBcHIgMTQgMTU6MjE6MTcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IERlcGVuZCBvbiBhbGwtbGQgKGZvciBsaWJnY2MxLXRlc3QpLgotCi1XZWQgQXByIDEyIDE2OjA2OjAxIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBFbmFibGUgYnVpbGRpbmcgb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBJUklYIDUgYW5kCi0gICAgICAgIE9TRi8xLiAgRml4IGNvbXBpbGVyIGZsYWdzLgotCSogYnVpbGQtYWxsLm1rOiBTdXBwb3J0IExpbnV4IGFuZCBPU0YvMSAzLjAuICBGaXggY29tcGlsZXIgZmxhZ3MuCi0KLVR1ZSBBcHIgMTEgMTg6NTU6NDAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgLS13aXRoLW5ld2xpYi4KLQkoc3BhcmMtKi1zdW5vczQqKTogQnVpbGQgc2ltLCBkZWphZ251LCBleHBlY3QsIHRjbCBpZiBjcm9zcyB0YXJnZXQuCi0KLU1vbiBBcHIgMTAgMTQ6Mzg6MjAgMTk5NSAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1vdmUge2FsbCxjaGVjayxpbnN0YWxsfS1nZGIgZnJvbSAqX01PRFVMRVMKLQl0byAqX1gxMV9NT0RVTEVTIGR1ZSB0byBnZGJ0ayBuZWVkaW5nIFggaW5jbHVkZSBmaWxlcyBldCBhbC4KLQotTW9uIEFwciAxMCAxMTo0MjoyMiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiBzdXBwb3J0IGZvciBNYWMgTVBXIGFzIGEgaG9zdC4KLQkoT2xkIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgZ2VuZXJpYyBpbmNsdWRlIGZvcndhcmRzIGZvciBjcHUtc3BlY2lmaWMKLQlpbmNsdWRlIGZpbGVzIGluIGFvdXQgYW5kIGVsZiBkaXJlY3Rvcmllcy4KLQotCSogbXB3LWNvbmZpZ3VyZTogQWRkZWQgY29weXJpZ2h0LgotCSogbXB3LWNvbmZpZy5pbjogQ2hlY2sgZm9yIHByZXNlbmNlIG9mIHJlcXVpcmVkIGJ1aWxkIHRvb2xzLgotCSh0YXJnZXRfbGlicyk6IEFkZCBuZXdsaWIuCi0JKHRhcmdldF90b29scyk6IEFkZCBleGFtcGxlcy4KLQkoUmVhZCBNZSk6IEdlbmVyYXRlIGFzICJSZWFkIE1lIGZvciBNUFciIGluc3RlYWQuCi0JKiBtcHctYnVpbGQuaW46IEJhc2Ugc3ViLWJ1aWxkcyBvbiBhbGwtZm9vIGluc3RlYWQgb2YgZG8tZm9vLgotCShhbGwtYnlhY2MsIGRvLWJ5YWNjLCBhbGwtZmxleCwgZG8tZmxleCwgZG8tbmV3bGliKTogTmV3IGFjdGlvbnMuCi0JKGRvLWdhcywgZG8tZ2NjLCBkby1nZGIsIGRvLWxkKTogQnVpbGQgVmVyc2lvbi5yIGZpcnN0LgotCi0JKiBtcHctY29uZmlndXJlOiBSZW1vdmUgc3ViZGlyLXNwZWNpZmljIG1ha2VmaWxlIGhhY2tlcnksCi0JZGVsZXRlIG1rLnRtcCBhZnRlciB1c2luZyBpdC4KLQotCSogbXB3LWJ1aWxkLmluIChhbGwpOiBEaXNwbGF5IHN0YXJ0IGFuZCBlbmQgdGltZXMuCi0KLQkqIG1wdy1jb25maWd1cmUgKGhvc3RfY2Fub25pY2FsKTogU2V0LgotCSh0YXJnZXRfY3B1KTogQWx3YXlzIGFkZCB0byBtYWtlZmlsZXMuCi0JKEFSQ0hERUZTLCBFTVVMKTogQWRkIHRvIG1ha2VmaWxlIG9ubHkgaWYgbm9uZW1wdHkuCi0JKFRNX0ZJTEUsIFhNX0ZJTEUsIE5NX0ZJTEUpOiBObyBsb25nZXIgYWRkIHRvIG1ha2VmaWxlLgotCShtcHctbWgtbXB3KTogTG9vayBmb3IgaW4gc3JjZGlyIGFuZCBzcmNyb290LgotCVVzZSBzZWQgaW5zdGVhZCBvZiBtcHctZWRpdC1wcmVmaXggdG8gZWRpdCBwcmVmaXggZGVmaW5pdGlvbnMuCi0KLQkqIG1wdy1idWlsZC5pbjogKGluc3RhbGwtb25seSk6IE5ldyB0YXJnZXQuCi0KLQkqIG1wdy1jb25maWd1cmUgKGhvc3RfYWxpYXMsIHRhcmdldF9hbGlhcyk6IFJlbmFtZSBmcm9tIGhvc3RhbGlhcwotCWFuZCB0YXJnZXRhbGlhcywgYWRkIGludG8gZ2VuZXJhdGVkIE1ha2VmaWxlLgotCShtay50bXApOiBJZiBwcmVzZW50LCBhZGQgaW50byBnZW5lcmF0ZWQgTWFrZWZpbGUuCi0JKiBtcHctYnVpbGQuaW4gKGFsbC1nYXMpOiBCdWlsZCBjb25maWcuaCBmaXJzdCBiZWZvcmUgZ2FzIHByb3Blci4KLQotCSogbXB3LWNvbmZpZ3VyZSAoY29uZmlnLnN0YXR1cyk6IFdyaXRlIG9ubHkgaWYgY2hhbmdlZC4KLQkqIG1wdy1jb25maWcuaW4gKHJlYWRsaW5lKTogQ29uZmlndXJlIGl0IChub3QgYnVpbHQsIGp1c3QgdXNlZCBmb3IKLQlkZWZpbml0aW9ucykuCi0KLQkqIG1wdy1jb25maWcuaW4gKGVsZi9taXBzLmgpOiBBZGQgYSBmb3J3YXJkIGluY2x1ZGUuCi0KLQkqIG1wdy1jb25maWcuaW46IEZvcndhcmQtaW5jbHVkZSBtb3N0IC5oIGZpbGVzIGluIGluY2x1ZGUgaW50bwotCWV4dHJhLWluY2x1ZGUuCi0JKHJlYWRsaW5lKTogRG9uJ3QgYnVpbGQuCi0JbXB3LWJ1aWxkLmluIChpbnN0YWxsKTogSW5zdGFsbCBHREIuCi0KLQkqIG1wdy1jb25maWd1cmUgKHByZWZpeCwgbXB3X3ByZWZpeCk6IEhhbmRsZSBpdC4KLQkqIG1wdy1jb25maWcuaW4gKG1tYWxsb2MsIHJlYWRsaW5lKTogRG9uJ3QgY29uZmlndXJlLgotCSogbXB3LWJ1aWxkLmluICh0aGlzc2NyaXB0KTogUmVuYW1lIHRvIFRoaXNTY3JpcHQuCi0JVXNlIG1wdy1idWlsZCBpbnN0ZWFkIG9mIEJ1aWxkUHJvZ3JhbSBldmVyeXdoZXJlLgotCShtbWFsbG9jLCByZWFkbGluZSk6IERvbid0IGJ1aWxkLgotCSogbXB3LVJFQURNRTogTmV3IGZpbGUsIGJhc2ljIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIE1QVyBwb3J0LgotCi0JKiBtcHctY29uZmlnLmluOiBVc2UgZm9yd2FyZC1pbmNsdWRlIHRvIGNyZWF0ZSBpbmNsdWRlIGZpbGVzLgotCi0JKiBtcHctY29uZmlndXJlOiBBZGQgbW9yZSB0aGluZ3MgdG8gdGhlIHRvcCBvZiBlYWNoIGNvbmZpZ3VyZWQKLQlNYWtlZmlsZSwgaW5jbHVkaW5nIGNvbnRlbnRzIG9mIGNvbmZpZy9tcHctbWgtbXB3LgotCSogbXB3LWNvbmZpZy5pbiAoZXh0cmEtaW5jbHVkZSk6IENyZWF0ZSB0aGlzIGRpcmVjdG9yeSBhbmQgZmlsbCBpdAotCXdpdGggUG9zaXgtbGlrZSBpbmNsdWRlIGZpbGVzIHdoZW4gY29uZmlndXJpbmcuCi0KLQkqIGNvbmZpZy5zdWIgKGFwcGxlLCBtYWMsIG1wdyk6IEFkZCB2YXJpb3VzIGFsaWFzZXMuCi0KLQkqIG1wdy1idWlsZC5pbjogTmV3IGZpbGUsIHRvcC1sZXZlbCBidWlsZCBzY3JpcHQgZnJhZ21lbnQgZm9yIE1QVy4KLQkqIG1wdy1jb25maWd1cmU6IE5ldyBmaWxlLCBjb25maWd1cmUgc2NyaXB0IGZvciBNUFcuCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgY29uZmlnIGZyYWdtZW50IGZvciBNUFcuCi0KLUZyaSBBcHIgIDcgMTk6MzM6MTYgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9saWJzKTogUmVtb3ZlIGdsb2IsIHNpbmNlIGl0IGlzIGdvbmUgZnJvbSB0aGUKLQlzb3VyY2VzLgotCi1GcmkgTWFyIDMxIDExOjM2OjE3IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIGVtcHR5IEdEQl9OTE1fREVQUyB2YXIuCi0KLQkqIGNvbmZpZ3VyZS5pbih0YXJnZXRfbWFrZWZpbGVfZnJhZyk6IHVzZSBjb25maWcvbXQtbmV0d2FyZQotCWZvciBuZXR3YXJlIHRhcmdldHMuCi0KLVRodSBNYXIgMzAgMTM6NTE6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSBpbiByZWNlbnQgRlNGIGNoYW5nZXMuICBSZW1vdmUgbGludXggc3BlY2lhbAotCWNhc2VzLgotCi1UdWUgTWFyIDI4IDE0OjQ3OjM0IDE5OTUgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQlidWlsZC1hbGwubWssY29uZmlnL21oLXNvbGFyaXM6ICByZXZlcnQgdGhlc2UgdHdvIGNoYW5nZXM6Ci0KLQlUdWUgTWFyIDMwIDEwOjAzOjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCQkqIGJ1aWxkLWFsbC5tazogVXNlIENDPWNjIC1YcyBvbiBTb2xhcmlzLgotCi0JTW9uIE1hciAyOSAxOTo1OToyNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkJKiBjb25maWcvbWgtc29sYXJpczogU3VuUFJPIEMgbmVlZHMgLVhzIHRvIGJlIGFibGUgdG8gZ2V0IGEKLQkJd29ya2luZyB4bWFrZWZpbGUgZm9yIEVtYWNzLgotCi1UdWUgTWFyIDIxIDEwOjQzOjMyIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBnbG9iLyo6IFJlbW92ZWQuICBTY2hhdWVyJ3MgMjQgRmViIDE5OTQgcmVhZGxpbmUgY2hhbmdlIG1hZGUgdXMKLQlzdG9wIHVzaW5nIGl0LgotCSogTWFrZWZpbGUuaW46IE51a2UgYWxsIHJlZmVyZW5jZXMgdG8gZ2xvYiBzdWJkaXJlY3RvcnkuCi0KLVRodSBNYXIgMTYgMTM6MzU6MzAgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IC0tZW5hYmxlLXNoYXJlZCBsb2dpYyBpbiBwZXItaG9zdC4KLQotTW9uIE1hciAxMyAxMjozMzoxNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi1ocC1ocHV4Wzc4XSopOiBVc2UgbWgtaHB1eDguCi0KLU1vbiBNYXIgIDYgMTA6MjE6NTggMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgZ2FzIG9uIEFJWCwgZm9yCi0JcG93ZXJwYyotKi1haXgqIGFzIHdlbGwgYXMgZm9yIHJzNjAwMCotKi1haXgqLgotCi1XZWQgTWFyICAxIDEyOjUxOjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBGaXggLS1jYWNoZS1maWxlIHRvIHdvcmsgaWYgdGhlIGZpbGUgYXJndW1lbnQgaXMgYQotCXJlbGF0aXZlIHBhdGguCi0KLVR1ZSBGZWIgMjggMTc6MzY6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IElmIHRoZSAtLWNhY2hlLWZpbGUgaXMgdXNlZCwgcGFzcyBpdCBkb3duIHRvCi0JY29uZmlndXJlIGluIHN1YmRpcmVjdG9yaWVzLgotCi1Nb24gRmViIDI3IDEyOjUyOjQ2IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IGFkZCB2eHdvcmtzMjlrIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBGZWIgMTAgMTY6MTI6MjYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IERvICJkaXN0c3R1ZmYiIHBhcnQgcXVpZXRseS4KLQotU3VuIEZlYiAgNSAxNDoxNjozNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNaW5pLW1lcmdlIHdpdGggZ2NjL2NvbmZpZy5zdWIuCi0KLVNhdCBGZWIgIDQgMTI6MTE6MzUgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKElSSVgpOiBTZWQgLSB0byBfLgotCi1GcmkgRmViICAzIDExOjU0OjQyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNvdXJjZS12YXVsdCwgYmluYXJ5LXZhdWx0KTogTmV3IHRhcmdldHMuCi0KLVRodSBKYW4gMjYgMTM6MDA6MTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSAtZWFiaSBhcyBhIGJhc2ljIHN5c3RlbSB0eXBlLgotCi1UaHUgSmFuIDEyIDEzOjEzOjIzIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGVuYWJsZV9zaGFyZWQgc3R1ZmYpOiBGaXggdHlwby4KLQotVGh1IEphbiAxMiAwMTozNjo1MSAxOTk1ICBkZWFubUBtZWR1bGxhLkxBQlMuVEVLLkNPTSAoRGVhbiBNZXNzaW5nKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogRml4IHR5cG8gaW4gcGFzc2luZyBMSUJDWFhGTEFHUyouCi0KLVdlZCBKYW4gMTEgMTY6Mjk6NTMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChMSUJDWFhGTEFHU19GT1JfVEFSR0VUKTogQWRkIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzLgotCi1Nb24gSmFuICA5IDEyOjQ4OjAxIDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBsaW90aC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwMC0qLSopOiBEb24ndCBidWlsZCBnYXMuCi0KLVdlZCBKYW4gIDQgMjM6NTM6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXNlIC94L3gvIGluc3RlYWQgb2YgL2Jyb2tlbnNlZC9icm9rZW5zZWQvLCB0bwotCXJlZHVjZSBjb21tYW5kIGxpbmUgbGVuZ3RoLgotCShBU19GT1JfVEFSR0VUKTogQ2hlY2sgZm9yIGFzLm5ldywgbm90IE1ha2VmaWxlLgotCShOTV9GT1JfVEFSR0VUKTogQ2hlY2sgZm9yIG5tLm5ldywgbm90IE1ha2VmaWxlLgotCi1XZWQgSmFuICA0IDEzOjAyOjM5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSBmcm9tIEZTRi4KLQotVGh1IERlYyAxNSAxNzoxMTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRG9uJ3QgdXNlICQgd2hlbiBoYW5kbGluZyBwcm9ncmFtX3N1ZmZpeC4KLQotTW9uIERlYyAxMiAxMjowOTozNyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBDb25maWd1cmUgdGsgZm9yIGhwcGEvaHB1eC4KLQotRnJpIERlYyAgMiAxNTo1NTozOCAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKExJQkdYWF9TVVBQT1JUX0RJUlMpOiAgQWRkIGxpYnN0ZGMrKy4KLQotVHVlIE5vdiAyOSAxOTozNzo1NiAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46ICBNb3ZlIC1mbm8taW1wbGljaXQtdGVtcGxhdGUgZnJvbSBDWFhGTEFHUwotCXRvIExJQkNYWEZMQUdTLiAgVGVzdHMgYXJlIGJldHRlciBydW4gd2l0aG91dCBpdC4KLQotV2VkIE5vdiAyMyAxMDoyOToyNSAxOTk0ICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtaXNwZWxsKTogRGVwZW5kIG9uIGFsbC1lbWFjczE5IGluc3RlYWQgb2YgYWxsLWVtYWNzLgotCi1Nb24gTm92IDIxIDExOjE0OjAxIDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotbmV0d2FyZSopOiBEb24ndCBjb25maWd1cmUgeGliZXJ0eS4KLQotTW9uIE5vdiAxNCAwODo0OToxNSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZW1vdmUgdGsgZnJvbSBuYXRpdmVfb25seSBsaXN0LgotCi1GcmkgTm92IDExIDE1OjMxOjI2IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiBBZGQgbWlwcy1uY2QtZWxmIHRhcmdldCB0byBzdW40IHRhcmdldHMKLQkgIGZvciBzcGVjaWFsIE5DRCBidWlsZC4KLQotTW9uIE5vdiAgNyAyMDo1ODoxNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogUmVtb3ZlIGNvbmZpZ3VyZS5iYXQgYW5kCi0JbWFrZWFsbC5iYXQsIHRoZXkncmUgb25seSB1c2VmdWwgZm9yIGJpbnV0aWxzIHNuYXBzaG90cy4KLQkoYmludXRpbHMudGFyLmd6LCBnYXMrYmludXRpbHMudGFyLmd6KTogQWRkIGNvbmZpZ3VyZS5iYXQgYW5kCi0JbWFrZWFsbC5iYXQgdG8gc3BlY2lmaWVkIFNVUFBPUlRfRklMRVMuCi0KLU1vbiBOb3YgIDcgMTc6MjU6MTggMTk5NCAgQmlsbCBDb3ggIChiaWxsQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IEFkZCBFcmljc3NvbiB0YXJnZXRzIHRvIHN1bjQgYW5kIHNvbGFyaXMKLQkgIGhvc3RzLiAgQWRkICBCTlIncyBzdW40IHRhcmdldCB0byBzb2xhcmlzIGhvc3QsIHNvIHRoZWlyCi0JICBidWlsZC1mcm9tLXNvdXJjZSB3aWxsIGJlIHRlc3RlZCBpbi1ob3VzZSBmaXJzdC4KLQotU2F0IE5vdiAgNSAxODo0MzozMCAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExJQkNGTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoQ0ZMQUdTX0ZPUl9UQVJHRVQpOiBEaXR0by4KLQkoTElCQ0ZMQUdTX0ZPUl9UQVJHRVQpOiBEaXR0by4KLQkoTElCQ1hYRkxBR1MpOiBEaXR0by4KLQkoQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgotCShMSUJDWFhGTEFHU19GT1JfVEFSR0VUKTogRGl0dG8uCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgdGhlbS4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRGl0dG8uCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21bdGhdLSpwaWM6IFN1cHBvcnQgLS1lbmFibGUtc2hhcmVkLgotCi1TYXQgTm92ICA1IDE1OjQ0OjAwIDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogIEluY2x1ZGUgbGlic3RkYysrIGFnYWluLgotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGIChmb3IgRnJlZUJTRCkuCi0KLVRodSBOb3YgIDMgMTY6MzI6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IEluY2x1ZGUgY29uZmlndXJlLmJhdCBhbmQKLQltYWtlYWxsLmJhdC4KLQkoRElTVERPQ0RJUlMpOiBBZGQgYGV0YycuCi0JKEVUQ19TVVBQT1JUX1BGWCk6IE5ldyB2YXJpYWJsZS4KLQkodGF6KTogSW5jbHVkZSBhbnl0aGluZyBmcm9tIGV0YyBzdGFydGluZyB3aXRoIGEgd29yZCBpbgotCUVUQ19TVVBQT1JUX1BGWC4KLQotV2VkIE9jdCAyNiAxNjoxOTozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFVwZGF0ZSBmb3IgcmVjZW50IEZTRiBjaGFuZ2VzLiAgUmVtb3ZlIG9ic29sZXRlCi0JaDgzMDBoZHMgZW50cnkuICBBZGQgLXdpbmRvd3MqIGFuZCAtb3N4IGFzIGJhc2ljIG9zLiAgTWlub3IKLQlzcGFjaW5nIGNoYW5nZXMuCi0KLVRodSBPY3QgMjAgMTg6NDE6NTYgMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2xpYnMpOiAgUmVtb3ZlIGxpYnN0ZGMrKyBmb3IgbGliZysrLTIuNi4xLgotCi0JKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSB3aXRoIEZTRi4KLQkqIGNvbmZpZ3VyZS5pbjogIE1hdGNoIG9uIGk/ODYtbmNyLXN5c3Y0LjMsIG5vdCBpPzg2LW5jci1zeXN2NDMuCi0KLVRodSBPY3QgMjAgMTk6MjY6NTYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBTaW5jZSB0aGUgInRyYXAgMCIgaGFuZGxlciB3aWxsIG92ZXJyaWRlIHRoZSBleGl0Ci0Jc3RhdHVzIG9uIG1hbnkgc3lzdGVtcywgb25seSB1c2UgaXQgZm9yICJleGl0IDEiLCBhbmQgbWFrZSBpdCBzZXQKLQlhIG5vbi16ZXJvIGV4aXQgc3RhdHVzOyByZXNldCBpdCBiZWZvcmUgImV4aXQgMCIuICBBbHNvLCBjaGVjawotCWV4aXQgc3RhdHVzIG9mIGNvbmZpZy5zdWIsIGFuZCBlcnJvciBvdXQgaWYgaXQgZmFpbGVkLgotCi1XZWQgT2N0IDE5IDE4OjQ5OjU1IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IChBTExfVEFSR0VUX01PRFVMRVMsSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykgQnVpbGQKLQlhbmQgaW5zdGFsbCBsaWJnbG9zcy4KLQotVHVlIE9jdCAxOCAxNToyNToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtYmludXRpbHMpOiBEZXBlbmQgdXBvbiBhbGwtYnlhY2MuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgZW1hY3Mgb24gSXJpeCA1LgotCi1Nb24gT2N0IDE3IDE2OjIyOjEyIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotbmV0d2FyZSopOiBBZGQgbGliaW8uCi0KLVRodSBPY3QgMTMgMTU6NTE6MjAgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfVEFSR0VUX01PRFVMRVMpOiBBZGQgbGlic3RkYysrLgotCShDSEVDS19UQVJHRVRfTU9EVUxFUyk6IERpdHRvLgotCShJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKTogRGl0dG8uCi0JKFRBUkdFVF9MSUJTKTogRGl0dG8uCi0JKGFsbC1saWJzdGRjKyspOiBOb3RlIGRlcGVuZGVuY2llcy4KLQotVGh1IE9jdCAxMyAwMTo0MzowOCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklOVVRJTFNfU1VQUE9SVF9ESVJTKTogQWRkIGdhcy4KLQotVHVlIE9jdCAxMSAxMjoxMjoyOSAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENYWEZMQUdTKTogVXNlIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzIGluc3RlYWQgb2YKLQktZmV4dGVybmFsLXRlbXBsYXRlcy4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IEFkZCBsaWJzdGRjKysuCi0JKG5vY29uZmlnZGlycyk6IEFkZCBsaWJzdGRjKysgYXMgYXBwcm9wcmlhdGUuCi0KLVRodSBPY3QgIDYgMTg6MDA6NTQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFVwZGF0ZSBmcm9tIEZTRi4KLQotVHVlIE9jdCAgNCAxMjowNTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgJHtjb25maWdzdWJ9LgotCi1Nb24gT2N0ICAzIDE0OjI4OjM0IDE5OTQgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE5vIGxvbmdlciByZWNvZ25pemUgaDgzMDBoLgotCi1Nb24gT2N0ICAzIDEyOjQwOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVtb3ZlIGV4dHJhbmVvdXMgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb25maWcuc3ViIGFuZAotCWdjYy9jb25maWcuc3ViLgotCi1TYXQgT2N0ICAxIDAwOjIzOjEyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkZESVJTKTogQWRkIGdhcy4KLQotVGh1IFNlcCAyMiAxOTowNDo1NSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBDT1BZSU5HLk5FV0xJQjogTmV3IGZpbGUuCi0KLU1vbiBTZXAgMTkgMTg6MjU6NDAgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoSFAtVVgpOiAgUGF0Y2ggZnJvbSBIYXJsYW4gU3Rlbm4KLQk8aGFybGFuQGxhbmRtYXJrLmNvbT4gdG8gYWxzbyBlbWl0IHJlbGVhc2UgbGV2ZWwuCi0KLVdlZCBTZXAgIDcgMTM6MTU6MjUgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKHN1bjQqOlN1bk9TOio6Kik6IENoYW5nZSAnLUpMJyB0byAnX0pMJy4KLQotVHVlIFNlcCAgNiAyMzoyMzoxOCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIE1lcmdlIG5leHRzdGVwIGNsZWFudXAgZnJvbSBGU0YuCi0KLU1vbiBTZXAgIDUgMDU6MDE6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotKik6IERvbid0IGNvbmZpZ3VyZSBsZCBmb3IgdGhpcyB0YXJnZXQuCi0KLVRodSBTZXAgIDEgMDk6MzU6MDAgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlKTogZG9uJ3QgY29uZmlndXJlIGxpYmcrKywgbGliaW8sCi0JICBsaWJyeCwgb3IgbmV3bGliLgotCi1XZWQgQXVnIDMxIDEzOjUyOjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhbHBoYS1kZWMtb3NmKik6IFVzZSBvc2YqLCBub3Qgb3NmMSouICBEb24ndAotCWNvbmZpZ3VyZSBsZC0taXQgd29ya3MsIGJ1dCBpdCBkb2Vzbid0IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4KLQotU3VuIEF1ZyAyOCAxODoxMzo0NSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzICgqLXVua25vd24tZnJlZWJzZCopOiAgR2V0IHJpZCBvZiBwb3NzaWJsZQotCXRyYWlsaW5nICIoUmVsZWFzZSkiIGluIHZlcnNpb24gc3RyaW5nLgotCVBhdGNoIGZyb20gUGF1bCBSaWNoYXJkcyA8cGF1bEBpc2wuY2YuYWMudWs+LgotCi1TYXQgQXVnIDI3IDE1OjAwOjQ5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBGaXggaTQ4Ni1uY3Itc3lzdjQzIC0+IGk0ODYtbmNyLXN5c3Y0LjMuCi0JRml4IHR5cGU6ICotbmV4dC1uZXN0c3RlcCAtPiAqLW5leHQtbmV4dHN0ZXAuCi0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIGZyb20gRlNGOgotCi0JRnJpIEF1ZyAyNiAxODo0NToyNSAxOTk0ICBQaGlsaXBwZSBEZSBNdXl0ZXIgKHBoZG1AaW5mby51Y2wuYWMuYmUpCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIHBvd2VycGMtaWJtLWFpeDMuMi41LgotCi0JV2VkIEFwciAyMCAwNjozNjozMiAxOTk0ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIChwaGRtQGluZm8udWNsLmFjLmJlKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBVbml4V2FyZSAxLjEgKFVOQU1FX1NZU1RFTSBpcyBTWVNURU1fVgotCWluc3RlYWQgb2YgVU5JWF9TViBmb3IgVW5peFdhcmUgMS4wKS4KLQotU2F0IEF1ZyAyNyAwMTo1NjozMCAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdkYik6ICBBZGQgZGVwZW5kZW5jaWVzIG9uIGFsbC1nY2MgYW5kIGFsbC1sZAotCXRvIG1ha2UgZ2RiL25sbS8qIGJ1aWxkIGFmdGVyIHRoZSBjb21waWxlciBhbmQgbGlua2VyLgotCi1GcmkgQXVnIDI2IDE0OjMwOjA1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKG5ldGJzZCwgZnJlZWJzZCwgbGludXgpOiAgQWNjZXB0IGFueSBtYWNoaW5lLAotCW5vdCBqdXN0IGlbMzRdODYuCi0JKG02OGstYXRhcmktc3lzdjQpOiAgUmVsb2NhdGUgdG8gbWF0Y2ggRlNGIHZlcnNpb24uCi0KLQkqIGNvbmZpZy5ndWVzczogIE1vcmUgbWVyZ2VzIGZyb20gdGhlIEZTRjoKLQotCUFkZCBhIHNwYWNlIGJlZm9yZSBmdW5jdGlvbiBjYWxsIG9yIG1hY3JvIGludm9jYXRpb24uCi0KLQlUdWUgTWF5IDEwIDE2OjUzOjU1IDE5OTQgIFJvbGFuZCBNY0dyYXRoIChyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgdHJhcCBjbWQgdG8gcmVtb3ZlIGR1bW15LmMgYW5kIGR1bW15IHdoZW4KLQlpbnRlcnJ1cHRlZC4KLQotCVdlZCBBcHIgMjAgMTg6MDc6MTMgMTk5NCAgUm9sYW5kIE1jR3JhdGggKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWcuZ3Vlc3MgKGR1bW15LmMpOiBSZWRpcmVjdCBzdGRlcnIgZm9yIGBob3N0aW5mbycgY29tbWFuZC4KLQkoZHVtbXkpOiBSZWRpcmVjdCBzdGRlcnIgZnJvbSBjb21waWxhdGlvbiBvZiBkdW1teS5jLgotCi0JU2F0IEFwciAgOSAxNDo1OToyOCAxOTk0ICBDaHJpc3RpYW4gS3JhbnogIChrcmFuekBzZW50NS51bmktZHVpc2J1cmcuZGUpCi0KLQkqIGNvbmZpZy5ndWVzczogRGlzdGluZ3Vpc2ggYmV0d2VlbiBOZVhUU3RlcCAyLjEgYW5kIDMueC4KLQotRnJpIEF1ZyAyNiAxMzo0MjoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWNjZXB0IGFuZCBpZ25vcmUgLS1jYWNoZSosIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLQluZXcgYXV0b2NvbmYuCi0KLUZyaSBBdWcgMjYgMTM6MDU6MjcgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIGZyb20gRlNGOgotCi0JVGh1IEF1ZyAyNSAyMDoyODo1MSAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICA8cm1zQG1vbGUuZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoUHlyYW1pZCo6T1N4KjoqOiopOiBOZXcgY2FzZS4KLSAgICAgICAgKFBBVEgpOiBBZGQgLy5hdHRiaW4gYXQgZW5kIGZvciBmaW5kaW5nIHVuYW1lLgotICAgICAgICAoZHVtbXkuYyk6IEhhbmRsZSBpODYwLWFsbGlhbnQtYnNkLiAgRm9sbG93IHdoaXRlc3BhY2UgY29udmVudGlvbnMuCi0KLQlXZWQgQXVnIDE3IDE4OjIxOjAyIDE5OTQgIFRvciBFZ2dlICAodGVnZ2VAcHZ2LnVuaXQubm8pCi0KLSAgICAgICAgKiBjb25maWcuZ3Vlc3MgKE04OCo6RG9scGhpbk9TOio6Kik6IE5ldyBjYXNlLgotCi0JVGh1IEF1ZyAxMSAxNzowMDoxMyAxOTk0ICBTdGFuIENveCAgKGNveHNAZGctcnRwLmRnLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy5ndWVzcyAoQVZpaU9OOmRndXg6KjoqKTogVXNlIFRBUkdFVF9CSU5BUllfSU5URVJGQUNFCi0gICAgICAgIHRvIHNlbGVjdCB3aGV0aGVyIHRvIHVzZSBFTEYgb3IgQ09GRi4KLQotCVN1biBKdWwgMjQgMTY6MjA6NTMgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgPHJtc0Btb2xlLmdudS5haS5taXQuZWR1PgotCi0gICAgICAgICogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgaTg2MC1zdGFyZGVudC1zeXN2IGFuZCBpODYwLXVua25vd24tc3lzdi4KLQotCVN1biBNYXkgIDEgMTA6MjM6MTAgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWcuZ3Vlc3M6IEd1ZXNzIHRoZSBPUyB2ZXJzaW9uIGZvciBIUFVYLgotCi0JVHVlIE1hciAgMSAyMTo1MzowMyAxOTk0ICBLYXJsIEhldWVyICAoa3d6aEBoYWwuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzcyAoVU5BTUVfVkVSU0lPTik6IFJlY29nbml6ZSBhaXgzLjIuNCBhbmQgYWl4My4yLjUuCi0KLUZyaSBBdWcgMjYgMTE6MTk6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSAtLXdpdGgtaGVhZGVycywgLS13aXRoLWxpYnMsIGFuZAotCS0td2l0aG91dC1uZXdsaWIuCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXhpYmVydHkpOiBEZXBlbmQgdXBvbiBhbGwtbGQuCi0KLVdlZCBBdWcgMjQgMTI6MzY6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCi1Nb24gQXVnIDIyIDEwOjU4OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh2ZXJzaW9uKTogQSBmZXcgbW9yZSB0d2Vha3MgdG8gaGVscCBtZXNzYWdlLgotCi1GcmkgQXVnIDE5IDEyOjQwOjI1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZSAoZm9yIG5vdykgbGlicnggYXMgYSBob3N0IGxpYnJhcnksCi0Jbm93IHRoYXQgd2UncmUgYnVpbGRpbmcgaXQgZm9yIHRhcmdldC4KLQotRnJpIEF1ZyAxOSAxMDo0OToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogRml4IHVwIGhlbHAgbWVzc2FnZTsgZnJvbSBrYXJsQG93bC5ocS5pbGVhZi5jb20KLQkoS2FybCBCZXJyeSkuCi0KLVR1ZSBBdWcgMTYgMTY6MTE6MDggMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFsc28gY29uZmlndXJlIGxpYnJ4LgotCi1Nb24gQXVnIDE1IDE2OjUxOjQ1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSB2YXJpb3VzIHJ1bGVzIHRvIHJlZmxlY3QgdGhhdCBsaWJyeAotCWlzIG5vdyBuZWVkZWQgZm9yIGxpYmcrKy4KLQotRnJpIEF1ZyAxMiAxODowNzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCBtaXBzNjRvcmlvbiBhbmQgbWlwczY0b3Jpb25lbCBhcyBhIENQVSBuYW1lLgotCi1Nb24gQXVnICA4IDExOjM2OjE3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4KLQotVGh1IEF1ZyAgNCAxNjoxMjozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU2ltcGxpZnkgSnVuIDIgMTk5NCBjaGFuZ2UuCi0KLVdlZCBBdWcgIDMgMDQ6NTg6MTYgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjaGFuZ2UgQ0MgdG8gL3Vzci9sYXRlc3QvYmluL2djYyBmb3IgbHlueCBob3N0IGJ1aWxkcywgc2luY2UKLQkvYmluL2djYyBpc24ndCBnb29kIGVub3VnaCB0byBidWlsZCBnY2MuCi0KLVdlZCBKdWwgMjcgMDk6MDc6MTQgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHREJfU1VQUE9SVF9GSUxFUyk6IFJlbW92ZQotCShzZXR1cC1kaXJzLWdkYiwgZ2RiLnRhci5neiwgbWFrZS1nZGIudGFyLmd6KTogIFJlbW92ZSBvbGQgcnVsZXMuCi0JKGdkYi50YXIuZ3opOiBBZGQgbmV3IHJ1bGUgdG8gdXNlIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBidWlsZGluZwotCW1lY2hhbmlzbS4KLQotTW9uIEp1bCAyNSAxMToxMDowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogV2FybiBhYm91dCB1c2Ugb2YgL3Vzci91Y2IvY2Mgb24gU29sYXJpcy4gIEZyb20KLQlCaWxsIENveCA8YmlsbEBjeWdudXMuY29tPi4KLQotU2F0IEp1bCAyMyAxMjoxOTo0NiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIElTQy4gIFBhdGNoIGZyb20ga3d6aEBnbnUuYWkubWl0LmVkdS4KLQotRnJpIEp1bCAyMiAxNzo1Mzo1OSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBTZWFyY2ggY3VycmVudCBkaXIgZmlyc3QgaW4gLmdkYmluaXQuCi0KLUZyaSBKdWwgMjIgMTE6Mjg6MzAgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBSZWNvZ25pemUgZnJlZWJzZCAobWVyZ2VkIGZyb20gZ2NjIGNvbmZpZy5zdWIpLgotCi1UaHUgSnVsIDIxIDE0OjEwOjUyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgUmVmZXIgdG8gTmVYVCdzIG9wZXJhdGluZyBzeXN0ZW0gYXMgbmV4dHN0ZXAuCi0KLQkqIGNvbmZpZy5zdWIgKGNhc2UgJGJhc2ljX21hY2hpbmUpOiAgUmUtb3JkZXIgdGhlIGNhc2VzLCB0byBtYXRjaAotCXRoZSBvcmRlciBpbiB0aGUgRlNGIHZlcnNpb24gKHdoaWNoIGlzIG1vc3RseSBhbHBoYWJldGhpY2FsKS4KLQlNZXJnZSBpbiBzb21lIGFkZGl0aW9ucyBhbmQgY2hhbmdlcyBmcm9tIHRoZSBGU0YuCi0KLVNhdCBKdWwgMTYgMTI6MDM6MDggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBtNjhrLWF0YXJpLXN5c3Y0IGFuZCBtODhrLWhhcnJpcy1jc3V4Ny4KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBjeHV4Ny4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG1oLWN4dXggZm9yIG04OGstaGFycmlzLWN4dXgqLgotCi1Nb24gSnVsIDExIDE0OjM3OjM5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgRml4IHR5cG8gcG93ZXJwYyAtPiBwb3dlcnBjLSouCi0KLVNhdCBKdWwgIDkgMTM6MDM6NDMgMTk5NCAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBibHVlcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYGFsbC1lbWFjczE5JyBkZXBlbmRzIG9uIGBhbGwtYnlhY2MnLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGFsbC1lbWFjczE5IGFuZCBpbnN0YWxsLWVtYWNzMTkgcnVsZXMgKGluCi0JcGFyYWxsZWwgd2l0aCBhbGwtZW1hY3MgYW5kIGluc3RhbGwtZW1hY3MpLiAgVG9wLWxldmVsIGNvbW1hbmQKLQlgbWFrZSBhbGwtZW1hY3MxOSBDQz1nY2MnIG5vdyBiZWhhdmVzIGFzIGBtYWtlIGFsbC1lbWFjcyBDQz1nY2MnLgotCi1UaHUgSnVuIDMwIDE2OjUzOjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tayAoJChob3N0KS1zdGFtcC1zdGFnZTItaW5zdGFsbGVkKTogUmVtb3ZlCi0JJChyZWxiaW5kaXIpL21ha2UgYmVmb3JlIGRvaW5nIGBgbWFrZSBpbnN0YWxsJycsIGFuZCB1c2UKLQkkKEdOVV9NQUtFKSB3aGlsZSBkb2luZyBpdC4gIEF2b2lkcyBwcm9ibGVtIG9uIFN1bk9TIHdpdGgKLQlpbnN0YWxsaW5nIG92ZXIgcnVubmluZyBtYWtlIGJpbmFyeS4KLQkoJChob3N0KS1zdGFtcC1zdGFnZTMtaW5zdGFsbGVkKTogTGlrZXdpc2UuCi0KLVR1ZSBKdW4gMjggMTM6NDM6MjUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIE1hY2guCi0KLU1vbiBKdW4gMjcgMTY6NDE6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IENoZWNrICR7ZXhlY19wcmVmaXhvcHRpb259LCBub3QgJHtleGVjX3ByZWZpeH0sIHRvCi0Jc2VlIHdoZXRoZXIgLS1leGVjLXByZWZpeCB3YXMgdXNlZC4KLQotU3VuIEp1biAyNiAyMToxNTo1NCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgRXhwbGljaXRseSBtZW50aW9uIGxpYmcrKy9SRUFETUUuICAoWm9vJ3MgaWRlYS4pCi0KLVR1ZSBKdW4gMjEgMTI6NDU6NTUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWxpYnJ4IHRhcmdldCBzaW1pbGFyIHRvIGFsbC1saWJwcm9jLgotCi1XZWQgSnVuICA4IDIzOjExOjU1IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlYXJyYW5nZSB0ZXN0cyBmb3IgQWxwaGEtT1NGMSB0byBwcm9wZXJseSBkZWFsCi0Jd2l0aCBwb3N0IDEuMiB1bmFtZSBib2dvc2l0eS4KLQotVGh1IEp1biAgOSAwMDoyNzo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogUmVtb3ZlIHRlbXBvcmFyeSBmaWxlcyBvbiByZWNlaXB0IG9mIGEgc2lnbmFsLgotCi1UdWUgSnVuICA3IDEyOjA2OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJZiB0aGVyZSBpcyBhIHBhY2thZ2VfbWFrZWZpbGVfZnJhZywgcmVtb3ZlCi0JJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSBhZnRlciBjb3B5aW5nIGl0IGluLgotCi1Nb24gSnVuICA2IDIxOjM1OjAyIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogYnVpbGRfYWxsLm1rOiBzdXBwb3J0IHJzNjAwMCBseW54IGlkZW50aWZpZXMgaXRzZWxmIGFzCi0JcnM2MDAwLWx5bngtbHlueG9zMi4yLjIuICBBbHNvLCB1c2UgL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvYmluL2djYwotCXNpbmNlIC9iaW4vZ2NjIGlzIHRvbyBmZWVibGUgdG8gY29tcGlsZSBhIG1vZGVybiBnY2MuCi0KLU1vbiBKdW4gIDYgMTY6MDY6MzQgMTk5NCAgS2FyZW4gQ2hyaXN0aWFuc2VuIChrYXJlbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogYnJvdWdodCBkZXZvL3Rlc3QtYnVpbGQubWsgdXBkYXRlLXRvLWRhdGUgd2l0aCBwcm9ncmVzc2l2ZS8KLQkgIHRlc3QtYnVpbGQubWsuIEFkZCBseW54IHRhcmdldHMgYW5kIGhwcGEgZmxhZyBpbmZvLgotCi1TYXQgSnVuICA0IDE3OjIzOjU0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBVc2UgbWgtbmNyc3ZyNDMuICBQYXRjaCBmcm9tCi0JVG9tIE1jQ29ubmVsbCA8dG1jY29ubmVAc2Vkb25hLmludGVsLmNvbT4uCi0KLUZyaSBKdW4gIDMgMTc6NDc6MjQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoaTM4Ni11bmtub3duLWJzZGkpOiAgTm8gbG9uZ2VyIG5lZWQgdG8KLQljaGVjayAjaWYgZGVmaW5lZChfX2JzZGlfXykgJiYgZGVmaW5lZChfX2kzODZfXykuCi0KLVRodSBKdW4gIDIgMTg6NTY6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFNldCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9uIGNvcnJlY3RseS4KLQotVGh1IEp1biAgMiAxMDo1NzowNiAxOTk0ICBLYXJlbiBDaHJpc3RpYW5zZW4gKGthcmVuQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBicm91Z2h0IGJ1aWxkLWFsbC5tayB1cGRhdGUtdG8tZGF0ZSB3aXRoIHByb2dyZXNzaXZlIGJ1aWxkLWFsbC5taywKLQkgIGFkZGVkIG5ldyB0YXJnZXRzIGFuZCBocHBhIGluZm8uCi0JCi1UaHUgSnVuICAyIDAwOjEyOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJZiBjb25maWcuZ3Vlc3MgcmVzdWx0IGlzIGEgcHJlZml4IG9mIHRoZSB1c2VyCi0Jc3BlY2lmaWVkIHRhcmdldCwgYXNzdW1lIGEgbmF0aXZlIGJ1aWxkIGFuZCB1c2UgdGhlIHVzZXIgc3BlY2lmaWVkCi0JdGFyZ2V0IGFzIHRoZSBob3N0IGFsaWFzLiAgUmVtb3ZlIFN1bk9TIHBhdGNoIHN1ZmZpeCByZW1vdmFsIGhhY2suCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBTdW5PUyBwYXRjaCBzdWZmaXggcmVtb3ZhbCBoYWNrLgotCi0JKiBNYWtlZmlsZS5pbiAoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IFJlbW92ZSBjaGVjay1mbGV4LCBzaW5jZSBpdCdzCi0JaW4gTkFUSVZFX0NIRUNLX01PRFVMRVMuCi0KLVdlZCBKdW4gIDEgMTA6NDk6NDEgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVuYW1lIEhPU1RfT05MWSB0byBOQVRJVkUuCi0JKiBjb25maWd1cmU6IERlbGV0ZSBTdW5PcyBwYXRjaCBzdWZmaXggZnJvbSBob3N0X2Nhbm9uaWNhbAotCSAgYW5kIGJ1aWxkX2Nhbm9uaWNhbCB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlcGVuZGVkIHRvIE1ha2VmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNvbW1lbnRzIGZvciBlYXNpZXIgbWFpbnRlbmFuY2UuCi0KLVR1ZSBNYXkgMzEgMTk6Mzk6NDcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWxpYnByb2MgdGFyZ2V0IHNpbWlsYXIgdG8gYWxsLWd1aS4KLQotVHVlIE1heSAzMSAxNzoxNjozMyAxOTk0ICBUb20gTG9yZCAgKGxvcmRAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENIRUNLX01PRFVMRVMpOiBzcGxpdCBpbnRvCi0JSE9TVF9PTkxZX0NIRUNLX01PRFVMRVMgYW5kIENST1NTX0NIRUNLX01PRFVMRVMuCi0KLVR1ZSBNYXkgMzEgMTY6MzY6MzYgMTk5NCAgUGF1bCBFZ2dlcnQgIChlZ2dlcnRAdHdpbnN1bi5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoaTM4Ni11bmtub3duLWJzZGkpOiBOZXcgc3lzdGVtIHRvIGd1ZXNzLgotCi1XZWQgTWF5IDI1IDE2OjQ3OjEwIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGFsbC1ndWkgdGFyZ2V0IChidXQgbm90IHlldCBidWlsZCBieSAiYWxsIikuCi0KLVRodSBNYXkgMjYgMDg6NTM6MTkgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBNb3ZlIGRlbGV0aW9uIG9mIHBhdGNoIHN1ZmZpeCBmcm9tIGhlcmUuLi4KLQkqIGNvbmZpZ3VyZS5pbjogVG8gaGVyZSwgYXQgSWFuJ3Mgc3VnZ2VzdGlvbi4gIFRoZSB0b3AtCi0JICBsZXZlbCBzY3JpcHRzIG1pZ2h0IG5lZWQgdG8ga25vdyBvZiBhIHBhdGNoIGxldmVsLgotCi1XZWQgTWF5IDI1IDA5OjE1OjU0IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogU3RyaXAgb2ZmIHBhdGNoIHN1ZmZpeCBzbyBydGwgaXMgcmVjb2duaXplZAotCSAgYXMgYSBzdW5vczQuMS4zIG1hY2hpbmUsIGV2ZW4gdGhvdWdoIGl0J3MgYmVlbiBwYXRjaGVkLgotCi1GcmkgTWF5IDIwIDA4OjI1OjQ5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX0xBU1QpOiBEZWxldGUuCi0JKElOU1RBTExfRE9TUkVMKTogTmV3LgotCi1UaHUgTWF5IDE5IDE3OjEyOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgbGQgZm9yIGlbMzRdODYtKi1zeXN2NCogYW5kIHNwYXJjLSotc29sYXJpczIqLgotCURvbid0IHNldCB1c2VfZ251X2xkIHRvIG5vIGZvciAqLSotc3lzdjQ7IHRoYXQgb25seSBjb250cm9scwotCXdoZXRoZXIgd2UgcGFzcyBkb3duIC0td2l0aC1nbnUtbGQgYW55aG93LgotCi1UaHUgTWF5IDE5IDA5OjI5OjEyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX0xBU1QpOiBDaGFuZ2Ugb3BlcmF0aW9uIHNvIGl0IHdvcmtzCi0Jb24gbW9yZSBmbGF2b3JzIG9mIG1ha2UuCi0JKiBjb25maWd1cmUuaW4gKGdvMzIpOiBEb24ndCBidWlsZCBsaWJnKysgb3IgbGliaW8uCi0KLUZyaSBNYXkgMTMgMTM6Mjg6MzQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1vdmUgSE9TVF9QUkVGSVhfMSBhbmQgZnJpZW5kcyB1cCBzbwotCXRoZXkgY2FuIGJlIG92ZXJyaWRlbiBieSB0ZW1wbGF0ZXMuCi0KLVNhdCBNYXkgIDcgMTY6NDY6NDQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXQ9PWdvMzIpOiBEb24ndCBidWlsZCBnZGIuCi0JKiBkb3NyZWw6IE5ldyBkaXJlY3RvcnkuCi0KLUZyaSBNYXkgIDYgMTQ6MTk6MjUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1nbzMyKTogQ29uZmlndXJlIGRvc3JlbCB0b28uCi0JKiBNYWtlZmlsZS5pbiAoSU5UQUxMX1RBUkdFVCk6IENhbGwgSU5TVEFMTF9MQVNUIGxhc3QuCi0JKEhPU1RfQ0MsIEhPU1RfUFJFRklYLCBIT1NUX1BSRUZJWF8xKTogVW5kZWZpbmUsIHRoZXkgc2hvdWxkCi0JYmUgc2V0IGJ5IGluY29taW5nIG5hbWVzIG9yIHRlbXBsYXRlcy4KLQkoSU5TVEFMTF9MQVNUKTogTmV3IHJ1bGUuCi0JKiBjb25maWcvbWgtZ28zMjogTmV3IGZyYWdtZW50LgotCi1UaHUgTWF5ICA1IDE3OjM1OjA1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoc3BhcmNsaXRlZnJ3LCBzcGFyY2xpdGVmcndjb21wYXQpOiBEb24ndCBzZXQgdGhlIG9zLgotCi1UaHUgTWF5ICA1IDIwOjA2OjQ1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1seW54cnM2azogUmVuYW1lZCBmcm9tIG1oLWx5bnhvc3JzNmssIHRvIG1ha2UgaXQKLQl1bmlxdWUgaW4gOC4zIG5hbWluZyBzY2hlbWVzLgotCSogY29uZmlndXJlLmluIChhcHBkaXJzKTogTmV3IHZhcmlhYmxlLiAgQ3VycmVudGx5IGVtcHR5LCBidXQgd2lsbAotCWJlIHVzZWQgaW4gZ2FzIGRpc3RyaWJ1dGlvbi4gIElmIG5vbmVtcHR5LCBsaXN0cyBhIHNldCBvZgotCWRpcmVjdG9yaWVzIGF0IGxlYXN0IG9uZSBvZiB3aGljaCBtdXN0IGdldCBjb25maWd1cmVkLCBvciB0b3AKLQlsZXZlbCBjb25maWd1cmF0aW9uIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBmYWlsZWQuCi0JKHJzNjAwMC0qLWx5bnhvcyopOiBVc2UgbmV3IGZpbGUgbmFtZS4KLQotVGh1IE1heSAgNSAxMzozODozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlFbGltaW5hdGUgWFRSQUZMQUdTLgotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBJZiBuZXdsaWIgZXhpc3RzLCByZWZlciB0byB0aGUKLQluZXdsaWIgaW5jbHVkZSBmaWxlcyB1c2luZyAtaWRpcmFmdGVyLCBhbmQgYWxzbyB1c2UgLW5vc3RkaW5jLgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCShYVFJBRkxBR1MpOiBSZW1vdmVkLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgWFRSQUZMQUdTX0ZPUl9UQVJHRVQuCi0JKEVYVFJBX0hPU1RfRkxBR1MpOiBSZW1vdmUgWFRSQUZMQUdTLgotCShFWFRSQV9UQVJHRVRfRkxBR1MsIEVYVFJBX0dDQ19GTEFHUyk6IExpa2V3aXNlLgotCSgkKERPX1gpKTogRG9uJ3QgcGFzcyBkb3duIFhUUkFGTEFHUy4KLQotVGh1IE1heSAgNSAwMDoxNjozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzKi1kZWMtYnNkKik6IE5ldyB0YXJnZXQ7IGRvIGJ1aWxkIGxpbmtlci4KLQkobWlwcyotKi1ic2QqKTogTmV3IHRhcmdldDsgZG9uJ3QgYnVpbGQgbGlua2VyLgotCi1XZWQgTWF5ICA0IDIwOjEwOjEwIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBzdXBwb3J0IHJzNjAwMC0qLWx5bnhvcyogY29uZmlndXJhdGlvbi4KLQlzdXBwb3J0IHN1bm9zNCBhcyBhIGNyb3NzIHRhcmdldC4KLQotCSogY29uZmlnLnN1YjogbG9vayBmb3IgbHlueCosIG5vdCBseW54IHNpbmNlIHRoZSBPUyB2ZXJzaW9uIG1heQotCWxlZ2l0aW1hdGVseSBiZSBwYXJ0IG9mIHRoZSBuYW1lLgotCi1UdWUgTWF5ICAzIDIxOjQ4OjExIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNjbyopOiBNb3ZlIHRvIGJlIHdpdGggb3RoZXIgaTM4NgotCXRhcmdldHMuCi0JKHJvbXAtKi0qKTogTmV3IHRhcmdldC4gIFNraXAgdmFyaW91cyBiaW5hcnkgdXRpbGl0aWVzLgotCSh2YXgtKi0qKTogTmV3IHRhcmdldC4gIERvbid0IGJ1aWxkIG5ld2xpYi4KLQkodmF4LSotdm1zKTogUmVuYW1lZCBmcm9tICotKi12bXMuICBEb24ndCBidWlsZCBvcGNvZGVzIG9yIG5ld2xpYi4KLQotVGh1IEFwciAyOCAxNTowMzowNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogT25seSBzZXQgaG9zdF9tYWtlZmlsZV9mcmFnIGlmIGNvbmZpZwotCWRpcmVjdG9yeSBleGlzdHMuCi0KLVdlZCBBcHIgMjcgMTI6MTQ6MzAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBJZiAkZHN0ZGlyIGV4aXN0cywgZG9uJ3QgY2hlY2sgd2hldGhlciBlYWNoCi0JY29tcG9uZW50IGRvZXMuCi0KLVR1ZSBBcHIgMjYgMTg6MTE6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rIChIT0xFUyk6IEFkZCBzbGVlcDsgdXNlZCBieSByY3Mvc3JjL2NvbmYuc2guCi0KLU1vbiBBcHIgMjUgMTU6MDY6MzQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0gCSogY29uZmlndXJlLmluICgqLSotbHlueG9zKik6IERvbid0IGNvbmZpZ3VyZSBuZXdsaWIgZm9yIGVpdGhlcgotIAluYXRpdmUgb3IgY3Jvc3MgTHlueC4KLQotU2F0IEFwciAxNiAxMTo1ODoxNiAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChzcGFyYzY0LWVsZik6IEZpeCBvcy4KLQkoejhrKTogUmVtb3ZlIGR1cGxpY2F0ZS4KLQotVGh1IEFwciAxNCAyMzozMzoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IFRvdWNoIGdjYy9pbmNsdWRlL2ZpeGVkLCBub3QKLQlnY2Mvc3RtcC1maXhwcm90bywgdG8gdHJ5IHRvIHByZXZlbnQgZml4cHJvdG8gZnJvbSBiZWluZyBydW4uCi0KLVdlZCBBcHIgMTMgMTU6MTQ6NTIgMTk5NCAgQmlsbCBDb3ggIChiaWxsQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogTWFrZSBmaWxlIGxpbmtzIGNsZWFubHkgZXZlbiBpZiBMeW54IGZhaWxzIG9uCi0gICAgICAgICAgYW4gTkZTIHN5bWxpbmsgKGF0IGxlYXN0IGZhaWwgY2xlYW5seSkuCi0KLU1vbiBBcHIgMTEgMTA6NTg6NTYgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rIChDQyk6IEZvciBtaXBzLXNnaS1pcml4NCwgY2hhbmdlIC1YTmgxNTAwIHRvCi0JLVhOaDIwMDAuCi0KLVNhdCBBcHIgIDkgMTU6MTA6NDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFVua25vd24gb3B0aW9ucyBhcmUgZmF0YWwgYWdhaW4uCi0KLUZyaSBBcHIgIDggMTI6MDE6NDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSWdub3JlIC0teC1pbmNsdWRlcyBhbmQgLS14LWxpYnJhcmllcywgZm9yIEF1dG9jb25mCi0JY29tcGF0aWJpbGl0eS4gCi0KLVRodSBBcHIgIDcgMTc6MzE6NDMgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiBBZGQgYGNsZWFuJyB0YXJnZXQuCi0KLVdlZCBBcHIgIDYgMjA6NDQ6NTYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBBZGQgU0lOSVggc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBtaXBzLSotc3lzdjQqIHN1cHBvcnQuCi0KLU1vbiBBcHIgIDQgMTc6NDE6NDQgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiBEb2N1bWVudCBhbGwgdXNlZnVsIHRhcmdldHMuCi0JSWYgY2Fub25ob3N0IGlzIHNwYXJjLXN1bi1zb2xhcmlzMi4zLCBjaGFuZ2UgaXQgdG8gc3BhcmMtc3VuLXNvbGFyaXMyLgotCUlmIGNhbm9uaG9zdCBpcyBtaXBzLXNnaS1pcml4NC4wLjVILCBjaGFuZ2UgaXQgdG8gbWlwcy1zZ2ktaXJpeDQuCi0KLVRodSBNYXIgMzEgMDQ6NTU6NTcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFN1cHBvcnQgLS1zaWxlbnQsIC0tcXVpZXQuCi0KLVdlZCBNYXIgMzAgMjE6Mzc6MzggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IFN1cHBvcnQgLS1kaXNhYmxlLUZFQVRVUkUuCi0KLVR1ZSBNYXIgMjkgMTk6MTU6MDUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIE5DUiBydW5uaW5nIFNWUjQuMy4KLQotTW9uIE1hciAyOCAxNDo1NToxNSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgTWFrZSBCU0RJIGdlbmVyYXRlIGkzODYtdW5rbm93bi1ic2QzODYuCi0JUGF0Y2ggZnJvbSBQYXVsIEVnZ2VydCA8ZWdnZXJ0QHR3aW5zdW4uY29tPi4KLQotTW9uIE1hciAyOCAxMjo1NDo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYy0qLWFpeCopOiBUcmVhdCBsaWtlIHJzNjAwMC0qLSouCi0KLVNhdCBNYXIgMjYgMTE6MjU6NDggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IE1ha2UgdW5yZWNvZ25pemVkIG9wdGlvbnMgZ2l2ZSBub25mYXRhbCB3YXJuaW5ncwotCWluc3RlYWQgb2YgZmF0YWwgZXJyb3JzLCBhbmQgcGFzcyB0aGVtIHRvIGFueSBzdWJkaXJlY3RvcnkKLQljb25maWd1cmVzIGluIGNhc2UgdGhleSByZWNvZ25pemUgdGhlbS4KLQlNYWtlIC0teCBlcXVpdmFsZW50IHRvIC0td2l0aC14LgotCi1GcmkgTWFyIDI1IDIxOjUyOjEwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBBZGQgLS1lbmFibGUtKiBvcHRpb25zLiAgQ2xlYW4gdXAgdXNhZ2UgbWVzc2FnZSBhbmQKLQlzb21lIGNvbW1lbnRzLgotCi1UaHUgTWFyIDI0IDA5OjEyOjUzIDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChOTV9GT1JfVEFSR0VUKTogQnVpbGQgdHJlZSB2ZXJzaW9uIGlzIG5vdyBubS5uZXcuCi0KLVN1biBNYXIgMjAgMTE6Mjg6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qKTogRW5hYmxlIGJpbnV0aWxzLgotCi1TYXQgTWFyIDE5IDExOjUwOjE2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgY2lzY28uCi0KLUZyaSBNYXIgMTggMTY6NDI6MzIgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDWFhGTEFHUyk6IEFkZCAtZmV4dGVybmFsLXRlbXBsYXRlcy4KLQotVHVlIE1hciAxNSAxMToyNTo1NSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBhYm91dCB0YXJnZXQgKi1oaXRhY2hpLWhpdXh3ZTIsIGRvbid0IHByaW50IG1vcmUKLQl0aGFuIG9uZSBjb25maWd1cmF0aW9uIG5hbWUuICBBZGQgY29tbWVudC4KLQotU3VuIE1hciAgNiAyMzoxMzozOCAxOTk0ICBIaXNhc2hpIE1JTkFNSU5PICAobWluYW1pbm9Ac3JhLmNvLmpwKQotCi0JKiBjb25maWcuZ3Vlc3M6IGFib3V0IHRhcmdldCAqLWhpdGFjaGktaGl1eHdlMiwgZml4ZWQKLQltYWNoaW5lIGd1ZXNzaW5nIG9yZGVyLiAgW0hpdGFjaGkncyBDUFVfSVNfSFBfTUM2OEsKLQltYWNybyBpcyBpbmNvcnJlY3QuXQotCi1TdW4gTWFyIDEzIDA5OjEwOjA4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEFHUyk6IEp1c3QgYnVpbGQgVEFHUyBpbiBlYWNoIHN1YmRpcmVjdG9yeSwgcmF0aGVyCi0JdGhhbiB0aGUgIm1ha2UgbHMiIHN0dWZmIHdoaWNoIHVzZWQgdG8gYmUgaGVyZS4KLQotRnJpIE1hciAxMSAxMjo1MjozOSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIGlbMzRdODYtdW5rbm93bi1mcmVlYnNkLgotCUZyb20gU2hhd24gTSBDYXJleSA8c21jYXJleUByb2Rhbi5zeXIuZWR1Pi4KLQotVGh1IE1hciAgMyAxNDoyNDoyMSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMgZm9yIGFscGhhKTogUmVtb3ZlIGxpYmcrKyBhbmQgbGliaW8uCi0KLVdlZCBNYXIgIDIgMTM6Mjg6NDggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQ2hlY2sgZm9yIHB0eC4KLQotTW9uIEZlYiAyOCAxNjo0Njo1MCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBZGQgb3M5ayBjaGVja2luZy4KLQotVGh1IEZlYiAyNCAwNzowOTowNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBIYW5kbGUgT1NGMSBydW5uaW5nIG9uIEhQUEEgcHJvY2Vzc29ycwotCi1GcmkgRmViIDE4IDE0OjE0OjAwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJZiBzdWJkaXIgY29uZmlndXJlIGZhaWxzLCBwcmludCBvdXQgYSBtZXNzYWdlIHdpdGgKLQlzdWJkaXJlY3RvcnkgbmFtZSwgaW4gY2FzZSBzdWJkaXIncyBjb25maWd1cmUgY29kZSBkaWRuJ3QgaWRlbnRpZnkKLQlpdHNlbGYuCi0KLUZyaSBGZWIgMTggMTI6NTA6MTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBlbWJlZGRlZCBuZXdsaW5lcyBmcm9tIGNvbmZpZ2RpcnMuCi0JQXZvaWQgbWlzbWF0Y2hlcyBvZiBzdWJzdHJpbmdzLiAgRml4IG1hdGNoaW5nIHN0cmluZ3MgYXQgZW5kCi0Jb2YgY29uZmlnZGlycy4KLQotRnJpIEZlYiAxMSAxNTozMzozMyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBBZGQgTHlueC9yczYwMDAgY29uZmlnIHN1cHBvcnQuCi0KLVR1ZSBGZWIgIDggMTM6NDE6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLWRlYy1vc2YxKiwgYWxwaGEqLSotKik6IEJ1aWxkIGdhcy4KLQotTW9uIEZlYiAgNyAxNTo0MjozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotb3NmKik6IFRyZWF0IHRoaXMganVzdCBsaWtlIG1vc3Qgb3RoZXIKLQlQQSBjb25maWd1cmF0aW9ucyAoZWcgbm8gYmludXRpbHMgb3IgbGQpLgotCShocHBhKi0qLSplbGYqKTogVGhlc2UgY29uZmlndXJhdGlvbnMgaGF2ZSBiaW51dGlscyBhbmQgbGQuCi0KLVN1biBGZWIgIDYgMTY6MzU6MDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5zdWIgKGhpdXgpOiBGaXggdHlwby4gIEZyb20gbS1rYXNhaHJAc3JhbWhjLnNyYS5jby5KUC4KLQotU2F0IEZlYiAgNSAwMTowMDozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwLSotKik6IEJ1aWxkIGdhcy4KLQotV2VkIEZlYiAgMiAxMzo1Nzo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotICAgICAgICAqIE1ha2VmaWxlLmluOiAgQXZvaWQgYnVnIGluIGxvc2luZyBocHV4IHNlZC4KLQotV2VkIEZlYiAgMiAxNDo1MzowNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIHRlc3QtYnVpbGQubWs6IFJlbW92ZSBNVU5DSF9OTTsgaXQgd2FzIG9ubHkgbmVlZGVkCi0JZm9yIEdEQiBhbmQgR0RCIGhhcyBiZWVuIGZpeGVkIHRvIG5vdCBuZWVkIGl0LgotCi1Nb24gSmFuIDMxIDE4OjQwOjU1IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1seW54b3NyczZrOiAgQWNjb3VudCBmb3IgbGFjayBvZiByYW5saWIhCi0KLVN1biBKYW4gMzAgMTc6NTg6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgdmF4IGhvc3RzLgotCi1GcmkgSmFuIDI4IDE1OjI5OjM4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAod2hpbGUgbG9vcCk6IERvbid0IHVzZSAiYnJlYWsgMiIgaW5zaWRlIGNhc2UKLQlzdGF0ZW1lbnQgLS0gdGhlIGNhc2Ugc3RhdGVtZW50IGlzbid0IGFuIGVuY2xvc2luZyBsb29wLgotCi1Nb24gSmFuIDI0IDE4OjQwOjA2IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBDbGVhbiB1cCBOZVhUIHN1cHBvcnQsIHRvIGFsbG93IG5leHRzdGVwCi0Jb24gSW50ZWwgbWFjaGluZXMuICBNYWtlIE9TIGJlIG5leHRzdGVwLgotCi1TdW4gSmFuIDIzIDE4OjQ3OjIyIDE5OTQgIFJpY2hhcmQgS2VubmVyICAoa2VubmVyQHZsc2kxLnVsdHJhLm55dS5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkIGFsdGVybmF0ZSBmb3JtcyBmb3IgQ29udmV4LgotCi1UaHUgSmFuIDIwIDE2OjEzOjQxIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIENvbXBsZXRlbHkgcmV3cml0ZSBvcHRpb24gcHJvY2Vzc2luZy4gIFRha2UKLQlhZHZhbnRhZ2Ugb2YgcGF0dGVybi1tYXRjaGluZyB0byBhdm9pZCBpbnZva2luZyB0ZXN0IGZyZXF1ZW50bHkuCi0JQWxzbyBjbGVhbiB1cCBob3N0IGFuZCB0YXJnZXQgZGVmYXVsdGluZyBsb2dpYy4KLQotTW9uIEphbiAxNyAxNTowNjo1NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVwbGFjZSBhbGwgb2NjdXJyYW5jZXMgb2YgInJvb3RtZSIgd2l0aCAiciIgYW5kCi0JIiQke3Jvb3RtZX0iIHdpdGggIiQkciIsIHRvIGluY3JlYXNlIHRoZSBsaWtlbGlob29kIHRoYXQgdGhlIGRvLSoKLQljb21tYW5kcyAocGx1cyB1c2VyIGVudmlyb25tZW50KSB3aWxsIGZpdCBTQ08gbGltaXRzLgotCi1UaHUgSmFuICA2IDExOjIwOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBpc3N1ZSB3YXJuaW5ncyBhYm91dCBkaXJlY3RvcmllcyB3aGljaCBhcmUKLQlub3QgYmVpbmcgY29uZmlndXJlZCBpZiAtbm9yZWN1cnNpb24gaXMgc2V0LiAgQ29ycmVjdCB0ZXN0IGZvcgotCS0td2l0aC1nbnUtYXMgYW5kIC0td2l0aC1nbnUtbGQgdG8gbm90IGdldCBjb25mdXNlZCBieSBzdWJzdHJpbmcKLQltYXRjaGVzLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGdhcyBmb3IgYWxwaGEtZGVjLW9zZjEqLgotCi1UdWUgSmFuICA0IDE3OjEwOjE5IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIEJhY2sgb3V0IFBlcidzIGNoYW5nZSBvZiAxMi8xOS8xOTkzLiAgSXQgY2hhbmdlcyB0aGUKLQliZWhhdmlvciBvZiBjb25maWd1cmUgaW4gdW5leHBlY3RlZCBhbmQgY29uZnVzaW5nIHdheXMuCi0KLQlBbHNvLCB1c2UgZGlmZmVyZW50IGRlbGltIGNoYXIgd2hlbiBjYWxjdWxhdGluZwotCXByb2dyYW1fdHJhbnNmb3JtX25hbWUgc28gdGhhdCB0aGUgbmFtZSBjYW4gY29udGFpbiBzbGFzaGVzLgotCi1TYXQgSmFuICAxIDEzOjQ1OjMxIDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgVlNUYSBtaWNyby1rZXJuZWwuCi0KLVNhdCBEZWMgMjUgMjA6MDA6NDcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogTnVrZSBoYWNrcyB3aGljaCB3ZXJlIHVzZWQgdG8gZ2V0IGEgc3BlY2lhbAotCXZlcnNpb24gb2YgR0FTIGZvciBIUFBBIGNvbmZpZ3VyYXRpb25zLgotCi1TdW4gRGVjIDE5IDIwOjQwOjQ0IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBJZiBvbmx5ICR7dGFyZ2V0X2FsaWFzfSBpcyBnaXZlbiwgdXNlIHRoYXQKLQlhcyB0aGUgZGVmYXVsdCBmb3IgJHtob3N0X2FsaWFzfS4KLQkqIGNvbmZpZ3VyZTogIEFkZCBtaXNzaW5nIGJhY2stc2xhc2hlcyBiZWZvcmUgbmVzdGVkIHF1b3Rlcy4KLQotV2VkIERlYyAxNSAxODowNzoxOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBhZGQgWUFDQz0kKEJJU09OKQotCi1UdWUgRGVjIDE0IDIxOjI1OjMzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgc29tZSBUZWt0cm9uaXggY29uZmlndXJhdGlvbnMuCi0JRnJvbSBLYXZlaCBSLiBHaGF6aSA8Z2hhemlAbm9jLnJ1dGdlcnMuZWR1Pi4KLQotU2F0IERlYyAxMSAxMToxODowMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogTWF0Y2ggYW55IGZsYXZvciBvZiBTSC4KLQotVGh1IERlYyAgMiAxNzoxNjo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHRyeSB0byBjb25maWd1cmUgbmV3bGliIGZvciBBbHBoYS4KLQotVGh1IERlYyAgMiAxNDozNTo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbGQgZm9yIElyaXggNS4gIERvbid0IGJ1aWxkIGdhcywKLQlsaWJnKysgb3IgbGliaW8gZm9yIGFueSBBbHBoYSB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg1Kik6IE5ldyB0YXJnZXQ7IHVzZSBtaC1pcml4NS4KLQkqIGNvbmZpZy9taC1pcml4NS4gTmV3IGZpbGUgZm9yIElyaXggNS4KLQotV2VkIERlYyAgMSAxNzowMDozMyAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEdaSVBQUk9HKTogUmVuYW1lZCBmcm9tIEdaSVAsIHdoaWNoIGd6aXAgdXNlcyBmb3IKLQlkZWZhdWx0IGFyZ3VtZW50cyAtLSBzbyBpdCB0cmllZCB0byBjb21wcmVzcyBpdHNlbGYuCi0KLVR1ZSBOb3YgMzAgMTM6NDU6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG5vdHN1cHApOiBlbnN1cmUgdGhhdCBhIHNwYWNlIGlzIGFsd2F5cyBhdCB0aGUgZW5kCi0JICBvZiB0aGUgY29uZmlnZGlycyBsaXN0LCBzaW5jZSB0aGUgZ3JlcCBjaGVja3MgZm9yIGFuIGV4cGxpY2l0IHNwYWNlCi0KLVR1ZSBOb3YgMTYgMTU6MDQ6MjcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldCBpMzg2LXN5c3Y0LjIpOiBkb24ndCBidWlsZCBsZCwgc2luY2Ugc3RhdGljCi0JICB2ZXJzaW9ucyBvZiBtYW55IGxpYnJhcmllcyBhcmUgbm90IGF2YWlsYWJsZS4KLQotVHVlIE5vdiAxNiAxNDoyODoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgQXBvbGxvcyAodXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzKS4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIGxkLCBiaW51dGlscywgb3IgZ3Byb2YgZm9yIEFwb2xsby4KLQotVGh1IE5vdiAxMSAxMjowMzo1MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgU29ueSBuZXdzIG1pcHMgcnVubmluZyBuZXdzb3MuCi0KLVdlZCBOb3YgMTAgMTY6NTc6MDAgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1jeWdudXMsIGJ1aWxkLWN5Z251cyk6ICJmaSBlbHNlIiBuZWVkcyB0byBiZQotCSJmaSA7IGVsc2UiIGZvciBiYXNoLgotCi1UdWUgTm92ICA5IDE1OjU0OjAxIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBwYXNzIFNIRUxMLgotCi1GcmkgTm92ICA1IDA4OjA3OjI3IDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAYmx1ZXMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogYWNjZXB0IHVuaXh3YXJlIGFzIGFuIGFsaWFzIGZvciBzdnI0LjIuCi0JRml4IHNvbWUgaW5jb25zaXN0YW5jaWVzIHdpdGggdGhlIGdjYyB2ZXJzaW9uLgotCi1GcmkgTm92ICA1IDE1OjE0OjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVERPQ0RJUlMpOiAgQWRkIGdkYi4KLQotRnJpIE5vdiAgNSAxMTo1OTo0MiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogIEFkZCBsaWJnKysgYW5kIGxpYmlvLgotCi1GcmkgTm92ICA1IDEwOjM1OjA1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogT25seSBidWlsZCAiaW5mbyIgaW4gRElTVERPQ0RJUlMuCi0JKERJU1RET0NESVJTKTogRG9uJ3QgYXNzdW1lIGxpYmcrKyBhbmQgZ2RiIGZvbGtzIG5lY2Vzc2FyaWx5IHdhbnQKLQl0aGlzIG5vdy4KLQotVGh1IE5vdiAgNCAxODo1ODoyMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IGhpdXgqIGFzIGFuIE9TIG5hbWUuCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgUlVOVEVTVF9GTEFHUyBiYWNrIHRvIFJVTlRFU1RGTEFHUyBwZXIKLQlldGMvbWFrZS1zdGRzLnRleGkuICBUaGUgdW5kZXJzY29yZSBjYW1lIGZyb20gZ2NjLCBhbmQgZGplIG5vdwotCWFncmVlcyB0aGF0IFJVTlRFU1RGTEFHUyBpcyB0aGUgY29ycmVjdCBuYW1lLgotCi1UaHUgTm92ICA0IDEwOjQ5OjAxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiAgUmVtb3ZlICdzZXQgLWUnLiAgSXQgbWFrZXMgYW55IGNvbmRpdGlvbmFscwotCWluIHRoZSBzY3JpcHQgdXNlbGVzcy4KLQotCSogY29uZmlnLmd1ZXNzOiBBdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBhcm0tYWNvcm4tcmlzY2l4Ci0JUGF0Y2ggZnJvbSBSaWNoYXJkIEVhcm5zaGF3IChyd2UxMUBjbC5jYW0uYWMudWspLgotCi1UaHUgTm92IDA0IDA4OjA4OjA0IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgUlVOVEVTVEZMQUdTIHRvIFJVTlRFU1RfRkxBR1MKLQotV2VkIE5vdiAgMyAyMjowOTo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNURE9DRElSUyk6IE5ldyB2YXJpYWJsZS4KLQkodGF6KTogRWRpdCBsb2NhbCBNYWtlZmlsZS5pbiBzb29uZXIsIGluc3RlYWQgb2YgcHJvdG8tdG9wbGV2Ci0JTWFrZWZpbGUuaW4gbGF0ZXIuICBCdWlsZCAiaW5mbyIgYW5kICJkdmkiIGluIERJU1RET0NESVJTLiAgCi0KLVdlZCBOb3YgIDMgMjE6MzE6NTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEgdGFyZ2V0KTogY2hlY2sgdGhlIHNvdXJjZSBkaXJlY3RvcnkgZm9yIHRoZQotCSAgcGFnYXMgc3ViLWRpcmVjdG9yeQotCi1XZWQgTm92ICAzIDExOjEyOjIyIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFsbG93IC1hb3V0KiBhbmQgLWVsZiouCi0KLVdlZCBOb3YgIDMgMTE6MDg6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGxkIG9uIGkzODYtc29sYXJpczIsIHNhbWUgYXMgZm9yCi0Jc3BhcmMtc29sYXJpczIuCi0KLVR1ZSBOb3YgIDIgMTQ6MjE6MjUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBBZGQgdGV4aW5mby9sZ3BsLnRleGluZm8gKGZvciBsaWJnKyspLgotCi1UdWUgTm92ICAyIDEzOjM4OjMwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluOiAgQ29uZmlndXJlIGdkYiBmb3IgYWxwaGEuCi0KLU1vbiBOb3YgIDEgMTA6NDI6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDWFhGTEFHUyk6IEFkZCAtTy4KLQotV2VkIE9jdCAyNyAxMDo0NTowNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogYWRkZWQgc3VwcG9ydCBmb3IgREcgQXZpaW9uCi0KLVR1ZSBPY3QgMjYgMTQ6Mzc6MzcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHN1YmRpcmVjdG9yaWVzIG5vdAotCWNvbmZpZ3VyYWJsZSBmb3IgdGhpcyBob3N0L3RhcmdldCBjb21iaW5hdGlvbi4gIERvbid0IHRyeSB0bwotCWNvbmZpZ3VyZSBnZGIgZm9yIHZtcy4KLQotTW9uIE9jdCAyNSAxMToyMjoxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFJlcGxhY2UgImJ5YWNjIiB3aXRoICJiaXNvbiAteSIgaW4gdGhlCi0JYXBwcm9wcmlhdGUgZmlsZXMgYmVmb3JlIG1ha2luZyAiZGlzdHN0dWZmIi4KLQkoRElTVEJJU09ORklMRVMpOiBOZXcgdmFyOiBsaXN0IG9mIGZpbGVzIHRvIGJlIGVkaXRlZC4KLQkoRElTVFNUVUZGRElSUyk6IEFkZCBiaW51dGlscy4KLQotRnJpIE9jdCAyMiAyMDozMjoxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGFsc28gaGFuZGxlIG1pcHNlbCBhbmQgbWlwczY0ZWwgKGZvciBsaXR0bGUgZW5kaWFuIG1pcHMpCi0KLUZyaSBPY3QgMjIgMDc6NTk6MjAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkICogdG8gZW5kIG9mIGFsbCBPUyBuYW1lcy4KLQotVGh1IE9jdCAyMSAxMTozODoyOCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbmV3bGliIGZvciBMeW54T1MgbmF0aXZlLgotCi1XZWQgT2N0IDIwIDA5OjU2OjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZCBzdXBwb3J0IGZvciBkZWx0YSA4OGsgcnVubmluZyBTVlIzLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50IGFib3V0IEhQIGNvbXBpbGVyIHZzLiBlbWFjcy4KLQotVHVlIE9jdCAxOSAxNjowMjoyMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgYnVpbGQgbGQgb24gc29sYXJpczIgKG5vdCBhIHZpYWJsZSBvcHRpb24KLQkgIGR1ZSB0byBidWdzIGluIGdldHB3bmFtICYgZ2V0cHd1aWQpCi0KLVR1ZSBPY3QgMTkgMTU6MTM6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBhbHBoYS1kZWMtb3NmMSosIG5vdCBqdXN0IC1vc2YxLCBzaW5jZQotCWNvbmZpZy5ndWVzcyB3aWxsIHByb2R1Y2UgYSBmdWxsIHZlcnNpb24gbnVtYmVyLgotCi1UdWUgT2N0IDE5IDE1OjU4OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsaW5rZXIgYW5kIGJpbnV0aWxzIGZvciBhbHBoYS1kZWMtb3NmMS4KLQotVHVlIE9jdCAxOSAxMTo0MTo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSAtTyBmcm9tIENYWEZMQUdTIGZvciBjb25zaXN0ZW5jeSB3aXRoIENGTEFHUywKLQlhbmQgZ2RiL3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbi4KLQotU2F0IE9jdCAgOSAxODozOTowNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG1pcHMqLSBpbnN0ZWFkIG9mIG1pcHMtCi0KLUZyaSBPY3QgIDggMTQ6MTU6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCBsaW51eCpjb2ZmIGFuZCBsaW51eCplbGYgYXMgb3BlcmF0aW5nCi0Jc3lzdGVtcy4KLQotVGh1IE9jdCAgNyAxMjo1NzoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBtaXBzNjQsIGFuZCBtaXBzMyBhcyBhbiBhbGlhcyBmb3IgaXQuCi0KLVdlZCBPY3QgIDYgMTM6NTQ6MjEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBhbHBoYS1kZWMtb3NmKiwgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBub3cgdGhhdAotCWdkYiBrbm93cyBob3cgdG8gaGFuZGxlIE9TRi8xIHNoYXJlZCBsaWJyYXJpZXMuCi0KLVR1ZSBPY3QgIDUgMTE6NTU6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGhwcGEqLSotaGl1eCogKGN1cnJlbnRseSBzeW5vbnltIGZvciBocHV4KS4KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEhpdGFjaGkncyBISVVYLgotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGgzMDUwciogYW5kIGhwcGFoaXRhY2hpLgotCVJlbW92ZSByZWR1bmRhbnQgY2FzZXMgZm9yIGhwOWtbMjNdKi4KLQotTW9uIE9jdCAgNCAxNjoxNTowOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZGVmYXVsdCB0byAnLS13aXRoLWdudS1hcycgYW5kICctLXdpdGgtZ251LWxkJwotCWlmIGdhcyBhbmQgbGQgYXJlIGluIHRoZSBzb3VyY2UgdHJlZSBhbmQgYXJlIGluICR7Y29uZmlnZGlyc30uCi0JSWYgJHt1c2VfZ251X2FzfSBvciAke3VzZV9nbnVfbGR9IGFyZSAnbm8nLCB0aGVuIGRvbid0IHNldCB0aGUKLQl0aGUgLS13aXRoIG9wdGlvbnMgKGJ1dCBzdGlsbCBwYXNzIHRoZW0gZG93biBvbiB0aGUgY29tbWFuZCBsaW5lLAotCWlmIHRoZXkgd2VyZSBleHBsaWNpdGx5IHNwZWNpZmllZCkuCi0KLUZyaSBTZXAgMjQgMTk6MTE6MTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHN1YnN0aXR1dGUgU0hFTEwgdmFsdWUgaW4gTWFrZWZpbGUuaW4gd2l0aAotCSR7Q09ORklHX1NIRUxMfQotCi1UaHUgU2VwIDIzIDE4OjA1OjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBnYXMsIGxkLCBhbmQgYmludXRpbHMgZm9yICotKi1zeXN2NCogYW5kCi0JKi0qLXNvbGFyaXMyKiB0YXJnZXRzLgotCi1TdW4gU2VwIDE5IDE3OjAxOjQxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBNNCwgYW5kIHBhc3MgaXQgZG93biB0byBzdWItbWFrZXM7Ci0JYWxsLWF1dG9jb25mIG5vdyBkZXBlbmRzIG9uIGFsbC1tNAotCi1TYXQgU2VwIDE4IDAwOjM4OjIzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHtBUixSQU5MSUJ9X0ZPUl9UQVJHRVQpOiBtYWtlIGNvbnRpbmdlbnQgb24KLQlwcmVzZW5jZSBvZiB7YXIscmFubGlifSBpbnN0ZWFkIG9mIGEgY29uZmlndXJlZCBkaXJlY3RvcnkKLQotV2VkIFNlcCAxNSAwODo0MTo0NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQWNjZXB0IDM0Pz8gYXMgd2VsbCBhcyAzMz8/IGZvciBOQ1IuCi0KLU1vbiBTZXAgMTMgMTI6Mjg6NDMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGdyYWIgbXQtaHBwYSBmb3IgSFBQQSB0YXJnZXRzOyB1c2UgJ2dhcyAnIGluc3RlYWQKLQlvZiAnZ2FzJyBpbiBzZWQgY29tbWFuZHMsIHNpbmNlICdnYXNoJyBpcyBub3cgaW4gdGhlIHRyZWUgYXMgd2VsbC4KLQotRnJpIFNlcCAxMCAxMToyMzo1MiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogZ3JhYiB2YWx1ZXMgZm9yICQoQ0MpIGFuZCAkKENYWCkgZnJvbSB0aGUKLQllbnZpcm9ubWVudCwgc28gdGhhdCBzb21lb25lIGNhbiBkbyAiQ0M9Z2NjIGNvbmZpZ3VyZTsgbWFrZSIgYW5kCi0JaGF2ZSBpdCB3b3JrIHJpZ2h0IChtYXRjaGluZyB0aGUgd2F5IHRoYXQgYXV0b2NvbmYgd29ya3Mgbm93KQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBhZGQgc3VwcG9ydCBmb3IgZ2FzaCwgdGhlIHRjbAotCWludGVyZmFjZSB0byBHYWxheHkKLQotCSogY29uZmlnLmd1ZXNzOiBhZGQgTmV0QlNEIHZhcmlhbnRzIChocDMwMCwgeDg2KQotCi1UaHUgU2VwICA5IDE2OjQ4OjUyIDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBTdXBwb3J0IC1kIG9wdGlvbiAoaW4gdGhlIG1hbm5lciBvZiBTdW5PUyA0IGluc3RhbGwsCi0JYXMgaXQgaXMgbW9yZSBkZXRlcm1pbmlzdGljIHRoYW4gdGhhdCBvZiBHTlUgaW5zdGFsbCkKLQkoY2htb2RjbWQpOiBTZXQgZmlsZSB0byBtb2RlIDc1NSBieSBkZWZhdWx0IChzaG91bGQgYWxzbyBkbyBkZWZhdWx0Ci0JY2hncnAgYW5kIGNob3duLCBidXQgSSBkb24ndCBmZWVsIGxpa2UgZGVhbGluZyB3aXRoIHRoYXQgbm93KQotCi1UdWUgU2VwICA3IDExOjU5OjM5IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlbW92ZSBoODMwMGhobXMgYWxpYXMuCi0KLVR1ZSBBdWcgMzEgMTE6MDA6MDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggKi0qLXNvbGFyaXMyKiBub3QgKi1zdW4tc29sYXJpczIqLgotCi1Nb24gQXVnIDMwIDE4OjI5OjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdjYy1uby1maXhlZGluY2x1ZGVzKTogdG91Y2ggc3RtcC1maXhwcm90byBhcyB3ZWxsCi0JYXMgc3RtcC1maXhpbmMKLQotV2VkIEF1ZyAyNSAxNjozNTo1OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IHJlY29nbml6ZSBtODgxMTAtYnVnLWNvZmYuCi0KLVR1ZSBBdWcgMjQgMTA6MjM6MjQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWxpYmlvKTogYWxsIGRlcGVuZGVuY2llcyBvbiB0aGUgdG9vbGNoYWluIHVzZWQKLQl0byBidWlsZCB0aGlzIChnY2MsIGdhcywgbGQsIGV0YykKLQotRnJpIEF1ZyAyMCAxNzoyNDoyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBEZWFsIHdpdGggT1NGLzEgMS4zIG9uIGFscGhhLgotCi1UaHUgQXVnIDE5IDExOjQzOjA0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDogYWRkIHNvbWUgJ2Vsc2UgdHJ1ZScgY2xhdXNlcyBmb3IgcG9ydGFiaWxpdHkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCBidWlsZCBsaWJpbyBmb3IgaDhbMzVdMDAtKi0qIHRhcmdldHMKLQotVHVlIEF1ZyAxNyAxOTowMjozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgc3VwcG9ydCBmb3IgbmV3IGxpYmlvLgotCi1TdW4gQXVnIDE1IDIwOjQ4OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBJZiBvbmUgY29tbWFuZCBmYWlscywgZG9uJ3QgdHJ5IHRoZSByZXN0LiAgRG9uJ3QgdHJ5Ci0JdG8gcmVtb3ZlICRkc3R0bXAgKHZpYSB0cmFwKSB1bmxlc3Mgd2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgaXQuCi0JSWYgJHNyYyBkb2Vzbid0IGV4aXN0LCBkZXRlY3QgaXQgYW5kIGV4aXQgd2l0aCBhbiBlcnJvci4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgQlNEIG9uIGhwMzAwLgotCi1XZWQgQXVnIDExIDE4OjM1OjEzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBNYXAgKDkwMDAvWzM0XT8/OkhQLVVYOio6KikgdG8gbTY4ay1ocC1ocHV4LgotCUJ1ZyByZXBvcnQgZnJvbSAiSGFtaXNoIChILkkuKSBNYWNkb25hbGQiIDxoYW1pc2hAYm5yLmNhPi4KLQotV2VkIEF1ZyAxMSAxNTozNzo1MSAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1zZW5kLXByKTogZGVwZW5kcyBvbiBhbGwtcHJtcwotCi1XZWQgQXVnIDExIDE2OjU2OjAzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEZpeCB0eXBvICg5MDAwLzg/Pzo0LjNic2QgLT4gOTAwMC83Pz86NC4zYnNkKS4KLQotRnJpIEF1ZyAgNiAxNDo0NTowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogRnJvbSBtaWNoYWVsQG1lcmN1cnkuY3MubXVuLmNhIChNaWNoYWVsIFJlbmRlbGwpOgotCUFkZGVkIHRlc3QgZm9yIG1pcHMtbWlwcy1yaXNjb3M1LgotCi1UaHUgQXVnICA1IDE1OjQ1OjA4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgbWgtaHAzMDAgZm9yIDY4ayBIUCBob3N0cwotCi1Nb24gQXVnICAyIDExOjU2OjUzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGQgc3VwcG9ydCBmb3IgQ09ORklHX1NIRUxMLCBzbyB0aGF0IHlvdSBjYW4gdXNlCi0Jc29tZSBhbHRlcm5hdGUgc2hlbGwgZm9yIGV2YWx1YXRpbmcgY29uZmlndXJlIHNjcmlwdHMKLQotU3VuIEF1ZyAgMSAxMTozNjoyNyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5neik6ICBTZWQgYnVnIHJlcG9ydGluZyBhZGRyZXNzCi0JaW4gY29uZmlndXJlIHNjcmlwdCB0byBidWctZ2RiQHByZXAuYWkubWl0LmVkdSB3aGVuIGJ1aWxkaW5nCi0JZGlzdHJpYnV0aW9uIGFyY2hpdmUuCi0JKiBNYWtlZmlsZS5pbiAoQ09NUFJFU1MpOiAgUmVtb3ZlIGRlZi4KLQkqIE1ha2VmaWxlLmluIChnZGIudGFyLmd6LCBtYWtlLWdkYi50YXIuZ3opOiAgUmVuYW1lZCBmcm9tCi0JZ2RiLnRhci5aIGFuZCBtYWtlLWdkYi50YXIuWiByZXNwZWN0aXZlbHkuCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLmd6KTogIE5vdyBvbmx5IGJ1aWxkIGd6aXAnZCBhcmNoaXZlLgotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5neik6ICBNaW5vciBjaGFuZ2VzIHRvIG1vdmUgY2xvc2VyCi0JdG8gY29udmVyZ2VuY2Ugd2l0aCAndGF6JyB0YXJnZXQgaW4gTWFrZWZpbGUuaW4uCi0KLUZyaSBKdWwgMzAgMTI6MzQ6NTcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoIChkc3R0bXApOiB1c2UgdHJhcCB0byBlbnN1cmUgdGhhdCB0bXAgZmlsZXMgZ28KLQlhd2F5IG9uIGVycm9yIGNvbmRpdGlvbnMKLQotV2VkIEp1bCAyOCAxMTo1NzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiByZW1vdmUgTE9BRExJQkVTCi0KLVR1ZSBKdWwgMjcgMTI6NDM6NDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWRpcnMpOiBEZWFsIHdpdGggYSBwcmVmaXggbGlrZSAvZ251OwotCWl0cyBwYXJlbnQgaXMgJy8nIG5vdCAnJy4KLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IEFkZCBjb21tZW50cyBhYm91dCBDaGFuZ2VMb2cuCi0KLUZyaSBKdWwgMjMgMDk6NTM6MzcgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQHdhaGluaS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGlmICR7bmV3c3JjZGlyfS9jb25maWd1cmUgZG9lc24ndCBleGlzdCwgZG9uJ3QgYXNzdW1lCi0JdGhhdCAke25ld3NyY2Rpcn0vY29uZmlndXJlLmluIGRvZXMuCi0KLVR1ZSBKdWwgMjAgMTE6Mjg6NTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBzdXBwb3J0IGZvciBDT05GSUdfU0hFTEwKLQotTW9uIEp1bCAxOSAyMTo1NDo0NiAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAobmV0d2FyZSk6ICBBZGQgYXMgYSBiYXNpYyBzeXN0ZW0gdHlwZS4KLQotV2VkIEp1bCAxNCAxMjowMzoxMSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IGRlcGVuZCBvbiBjb25maWd1cmUuaW4uICBBbHNvIGRyb3AgdGhlCi0JICAkKHNyY2RpcikvIGZyb20gdGhlIGRlcGVuZGVuY3kgb24gTWFrZWZpbGUuaW4uCi0KLVR1ZSBKdWwgMTMgMjA6MTA6NTggMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGg4MzAwaGhtcyBhcyBoODMwMGgtaGl0YWNoaS1obXMuCi0JKGg4MzAwaGhtcyBpcyB0ZW1wb3JhcnkgdW50aWwgbXVsdGktbGlicmFyaWVzIGFyZSBpbXBsZW1lbnRlZCkuCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBoODMwMGggdG9vLgotCi1TdW4gSnVsIDExIDE3OjM1OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBkcHgvMiBhcyBtNjhrLWJ1bGwtc3lzdjMuCi0KLVRodSBKdWwgIDggMTg6MjY6MTIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIFJlbW92ZSBleHRyYW5lb3VzIG91dHB1dCB3aGVuIGd1ZXNzaW5nIGhvc3QgdHlwZS4KLQkqIGNvbmZpZy5ndWVzczogIFJlbW92ZSBleHRyYW5lb3VzIG91dHB1dCB3aGVuIGd1ZXNzaW5nIHVzaW5nIEMKLQljb21waWxlciByYXRoZXIgdGhhbiB1bmFtZSwgb3Igd2hlbiBndWVzc2luZyBmYWlscy4KLQotV2VkIEp1bCAgNyAxNzo1ODoxNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgYWxsLmNyb3NzIGFuZCBpbnN0YWxsLmNyb3NzIHRhcmdldHMKLQotCSogY29uZmlndXJlOiByZW1vdmUgQ1JPU1M9LURDUk9TU19DT01QSUxFIGFuZCBBTEw9YWxsLmNyb3NzCi0JICBkZWZpbml0aW9ucwotCi1UdWUgSnVsICA2IDEwOjM5OjQ0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IHNoKTogQnVpbGQgZ3Byb2YuCi0KLVRodSBKdWwgIDEgMTY6NTI6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBjaGFuZ2UgLXNvbGFyaXMgdG8gLXNvbGFyaXMyCi0KLVRodSBKdWwgIDEgMTU6NDY6MTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGNvbmZpZy9taC1yaXNjb3MgZm9yIG1pcHMtKi1zeXN2Ki4KLQotV2VkIEp1biAzMCAwOTozMTo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQ29ycmVjdCBlcnJvciBtZXNzYWdlIGZvciBtaXNzaW5nIE1ha2VmaWxlLmluIHRvCi0JcHJpbnQgY29ycmVjdCBkaXJlY3RvcnkuCi0KLVR1ZSBKdW4gMjkgMTM6NTI6MTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBrbHVkZ2UgYXJvdW5kIDM4NkJTRCBzaGVsbCBidWcKLQotVHVlIEp1biAyOSAxMzowNjo0OSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBOZVhULgotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIGk0ODYtbmNyLXN5c3Y0LgotCSogTWFrZWZpbGUuaW4gKHRheik6ICBybSAkKFRPT0wpLSQkVkVSIGJlZm9yZSBsaW5raW5nLgotCi1UdWUgSnVuIDI5IDEyOjUwOjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1BS0VJTkZPRkxBR1MpOiBOZXcgdmFyaWFibGUuCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIE1BS0VJTkZPIGFzIE1BS0VJTkZPIE1BS0VJTkZPRkxBR1MuCi0JKiBidWlsZC1hbGwubWssIHRlc3QtYnVpbGQubWs6IFBhc3MgZG93biAtLW5vLXNwbGl0IGFzCi0JTUFLRUlORk9GTEFHUyB3aGVuIGhvc3RlZCBvbiBET1MuICBDb21waWxlIERPUyBob3N0ZWQgd2l0aG91dCAtZy4KLQotVGh1IEp1biAyNCAxMzozOToxMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiAgQWRkIENPUFlJTkcgQ09QWUlORy5MSUIgaW5zdGFsbC5zaC4KLQotV2VkIEp1biAyMyAxMjo1OToyMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsaWJnKysudGFyLnopOiAgTmV3IHJ1bGUuCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIFJlcGxhY2UgJ2NvbmZpZ3VyZSAtcm0nIGJ5ICdtYWtlIGRpc3RjbGVhbicuCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIE9ubHkgZG8gYSBzaW5nbGUgY2htb2QuCi0KLUZyaSBKdW4gMTggMTI6MDM6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IG1hamlwb29yLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IGRvbid0IHVzZSBkaXJuYW1lIGFueW1vcmUgKHJlcGxhY2VkIHdpdGggc2VkIHVzYWdlKQotCi1UaHUgSnVuIDE3IDE4OjQzOjQyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZSBleHRlbnNpb24gZm9yIGd6aXAnZCBmaWxlcyBmcm9tICcueicgdG8KLQknLmd6JyBwZXIgbmV3IEZTRiBzdGFuZGFyZCB1c2FnZS4KLQotVGh1IEp1biAxNyAxNjo1ODo1MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgbWFqaXBvb3IuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgZmluYWwgdmFsdWUgb2YgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotCi1UdWUgSnVuIDE1IDE2OjQ4OjUxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG5ldyBpbnN0YWxsLnNoIHN1cHBvcnQ7IHVwZGF0ZSBpbnN0YWxsLWluZm8gcnVsZXMKLQotV2VkIEp1biAgOSAxMjozMTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZGlmZiBmb3IgY3Jvc3NlcywgYnV0IG5vdCBmb3IgZ28zMiBob3N0LgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGdwcm9mIG9ubHkgZm9yIG5hdGl2ZSwgYW5kIGRvbid0IGJ1aWxkIGl0Ci0JZm9yIG1pcHMtKi0qLCByczYwMDAtKi0qLCBvciBpWzM0XTg2LSotc2NvKi4KLQotTW9uIEp1biAgNyAxMzoxMjoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCBidWlsZCBnYXMsbGQsYmludXRpbHMgb24gZm9yICotKi1zeXN2NAotCi1Nb24gSnVuICA3IDExOjQwOjExIDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkIHBybXMuCi0KLUZyaSBKdW4gIDQgMTM6MzA6NDIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCBnY2MsIGRvIGluc3RhbGxhdGlvbiBvZiAkKElOU1RBTExfTU9EVUxFUykKLQl3aXRoICQoRkxBR1NfVE9fUEFTUykgb24gdGhlIGNvbW1hbmQgbGluZQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgbHlueCBhbmQgbHlueG9zCi0KLUZyaSBKdW4gIDQgMTA6NTk6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgLWVjb2ZmKiwgbm90IGp1c3QgLWVjb2ZmLgotCi1UaHUgSnVuICAzIDE3OjM4OjU0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFVzZSAuZ3ogc3VmZml4IGluc3RlYWQgb2YgLnouCi0JKGJpbnV0aWxzLnRhci5neiwgZ2FzK2JpbnV0aWxzLnRhci5neiwgZ2FzLnRhci5neik6IEZpeGVkIHRhcmdldAotCW5hbWVzLgotCi1UaHUgSnVuICAzIDAwOjI3OjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHZhdWx0LWluc3RhbGwpOiBhZGQgYW4gJ2Vsc2UgdHJ1ZScgKGZvciBVbHRyaXgpCi0KLVdlZCBKdW4gIDIgMTg6MTk6MTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzKTogIGluc3RhbGwgZ2NjIGxhc3QsIHNvCi0JdGhhdCByZWJ1aWxkcyB0aGF0IG1pZ2h0IGhhcHBlbiBkdXJpbmcgJ21ha2UgaW5zdGFsbCcgZG9uJ3QgZ2V0Ci0JYm9ndXMgZ2NjIGluY2x1ZGUgZmlsZXMKLQotV2VkIEp1biAgMiAxNjoxNDoxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlDaGFuZ2UgZnJvbSBVdGFoIGZvciBIUFBBIHN1cHBvcnQ6Ci0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBocHBhMS54LWhwLWJzZC4KLQotV2VkIEp1biAgMiAxMTo1MzozMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEFkZCBzdXBwb3J0IGZvciBNb3Rvcm9sYSBEZWx0YSA2OGssIHVwIHRvIHIzdjcuCi0JUGF0Y2ggZnJvbSBwb3RAZmx5LmNudWNlLmNuci5pdCAoRnJhbmNlc2NvIFBvdG9ydGlgKS4KLQotVHVlIEp1biAgMSAxNzo0ODo0MiAxOTkzICBSb2IgU2F2b3llICAocm9iIGF0IGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciByb202OGsgYW5kIGJ1ZyBib290IG1vbml0b3JzLgotCi1Nb24gTWF5IDMxIDA5OjM2OjM3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSBhbGwtb3Bjb2RlcyBkZXBlbmQgb24gYWxsLWJmZC4KLQotVGh1IE1heSAyNyAwODowNTozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkZWQgc3BlY2lhbCBjaGVjayBmb3IgaVszNF04Ni11bml2ZWwtc3lzdjQqLgotCi1XZWQgTWF5IDI2IDE2OjMzOjQwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBGb3IgaVszNF04Ni11bmtub3duLXN5c3Y0IHVzZSBVTkFNRV9NQUNISU5FIGZvcgotCXRoZSBwcm9jZXNzb3IgcmF0aGVyIHRoYW4gYXNzdW1pbmcgaTQ4Ni4KLQotV2VkIE1heSAyNiAwOTo0MDoxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgU3VuT1M2IGFzIFNvbGFyaXMzLgotCi1UdWUgTWF5IDI1IDIzOjAzOjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBGaXggdHlwby4gIEF2b2lkICNlbGlmIChub3QgaW4gSyZSIDEpLgotCVJlY29nbml6ZSBTdW5PUyA1Liogb25seSAoYW5kIG5vdCBbNi05XS4qKSBhcyBiZWluZyBTb2xhcmlzMi4KLQotVHVlIE1heSAyNSAxMjo0NDoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tayAoYWxsLWNyb3NzKTogTmV3IHRhcmdldCBmb3IgQ2FuYWRpYW4gQ3Jvc3MuCi0JQWRkZWQgUTIgZ28zMiB0YXJnZXRzLgotCSogdGVzdC1idWlsZC5tazogQ29uZmlndXJlIGdvMzIgY3Jvc3Mgc3BhcmNsaXRlLWFvdXQgYW5kCi0JbWlwcy1pZHQtZWNvZmYgLXdpdGgtZ251LWxkLiAgTW92ZWQgYnVpbGQgYmluYXJ5IGRpcmVjdG9yeSBmcm9tCi0JUEFSVElBTF9IT0xFX0RJUlMgdG8gQlVJTERfSE9MRVNfRElSUy4KLQotTW9uIE1heSAyNCAxNTozMDowNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZml4IEFscGhhIEdEQiB0eXBvOyBhbHNvLCBkb24ndCBidWlsZCBEZWphR251IGZvcgotCUdPMzIgaG9zdGVkIHRvb2xjaGFpbnMKLQotTW9uIE1heSAyNCAxNDoxODo0MSAxOTkzICBSb2IgU2F2b3llICAocm9iIGF0IGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogY2hhbmdlICBzbyAiLWV4ZWMtcHJlZml4IiBnZXRzIHBhc3NlZCBkb3duIHJhdGhlcgotCXRoYW4gIi1leGVjX3ByZWZpeCIgc28gYXV0b2NvbmYgZ2VuZXJhdGVkIE1ha2VmaWxlcyBnZXQgdGhlCi0JZXhlY19wcmVmaXggc2V0IHJpZ2h0LgotCi1GcmkgTWF5IDIxIDEwOjQyOjI1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBnZXQgdGhlIFNvbGFyaXMyIG1pbm9yIHZlcnNpb24gbnVtYmVyCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgc3RhbmRhcmRzLnRleGkgYW5kIG1ha2Utc3Rkcy50ZXhpIHRvIEVUQ19TVVBQT1JUCi0KLUZyaSBNYXkgMjEgMDY6MjA6NTIgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBzb21lIFNlcXVlbnQgcGxhdGZvcm1zLgotCi1UaHUgTWF5IDIwIDE0OjMzOjQ4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRoZSB2YXVsdC1pbnN0YWxsIHRhcmdldAotCi0JKiBjb25maWd1cmUuaW46IGFjdHVhbGx5IHVzZSB0aGUgU3VuMyBtYWtlZmlsZSBmcmFnbWVudCB0aGF0J3MgaW4KLQljb25maWcsIGFsc28gYWRkZWQgdGhlIHJlbGVhc2UgZGlyIHRvIGNvbmZpZ2RpcnMKLQotVGh1IE1heSAyMCAxNDoxOToxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBGaXggbW9kZXMgb24gc3R1ZmYgaW4gJChUT09MKSBkaXIgYWxzby4KLQotVHVlIE1heSAxOCAyMDoyNjo0MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIHNvbWUgcHJvZ3JhbSBmcm9tIEFscGhhIHRhcmdldHRlZCB0b29sY2hhaW5zCi0KLVR1ZSBNYXkgMTggMTU6MjM6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkZESVJTKTogUmVuYW1lZCBmcm9tIFBST1RPRElSUy4gIEFkZCBsZCBhbmQKLQlncHJvZi4KLQkodGF6KTogUnVuICJtYWtlIGRpc3RzdHVmZiIgaW4gdGhvc2UgZGlyZWN0b3JpZXMgaW5zdGVhZCBvZiAibWFrZQotCXByb3RvLWRpciIuICBMb29rIGZvciAiVkVSU0lPTj0iIG9ubHkgYXQgc3RhcnQgb2YgbGluZSBpbiBzdWJkaXIKLQlNYWtlZmlsZS4gIFVzZSAiZ3ppcCAtOSIgZm9yIGNvbXByZXNzaW9uLgotCShURVhJTkZPX1NVUFBPUlQsIERJU1RfU1VQUE9SVCwgQklOVVRJTFNfU1VQUE9SVF9ESVJTKTogTmV3IHZhcnMuCi0JKGJpbnV0aWxzLnRhci56KTogTmV3IHRhcmdldC4KLQotTW9uIE1heSAxNyAxNzowMToxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEluY2x1ZGUgZ3BsLnRleGluZm8uCi0KLUZyaSBNYXkgMTQgMDY6NDg6MzggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzZXR1cC1kaXJzKTogTWVyZ2VkIGludG8gInRheiIgdGFyZ2V0LgotCSh0YXopOiBPbmx5IGRvIGBwcm90by1kaXInIHN0dWZmIGlmIGEgZGlyZWN0b3J5IGlzIGFjdHVhbGx5IG5lZWRlZAotCWZvciB0aGlzIHRhcmdldC4KLQotV2VkIE1heSAxMiAxMzowOTo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNVU5DSF9OTSk6IE5ldyB2YXJpYWJsZSwgZGVmaW5lZCB0byBiZSAkKE5NKS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBNVU5DSF9OTS4KLQkoSE9TVF9DQywgSE9TVF9QUkVGSVgsIEhPU1RfUFJFRklYXzEpOiBOZXcgdmFyaWFibGVzLgotCShFWFRSQV9HQ0NfRkxBR1MpOiBQYXNzIGRvd24gSE9TVF8qIHZhcmlhYmxlcy4KLQkoZ2NjLW5vLWZpeGVkaW5jbHVkZXMpOiBDb3JyZWN0IGZvciBjdXJyZW50IGdjYyBNYWtlZmlsZS4KLQotVHVlIE1heSAxMSAxMDoxNDoyNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIEFkZCBjb25maWd1cmUsIGNvbmZpZy5ndWVzcywKLQljb25maWcuc3ViLCBhbmQgbW92ZS1pZi1jaGFuZ2UgdG8gZ2RiIHRlc3RzdWl0ZSBkaXN0cmlidXRpb24KLQlhcmNoaXZlLCBzbyB0aGUgdGVzdHN1aXRlIGNhbiBiZSBleHRyYWN0ZWQsIGNvbmZpZ3VyZWQsIGFuZAotCXJ1biBzZXBhcmF0ZWx5IGZyb20gdGhlIGdkYiBkaXN0cmlidXRpb24uICBCbG93IGF3YXkgdGhlIENoaWxsCi0JdGVzdHMgdGhhdCByZXF1aXJlIGEgQ2hpbGwgY29tcGlsZWQgZXhlY3V0YWJsZSwgc2luY2UgR05VIENoaWxsCi0JaXMgbm90IHlldCBwdWJsaWNhbGx5IGF2YWlsYWJsZS4KLQotTW9uIE1heSAxMCAxNzoyMjoyNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gYSBzaW5nbGUgY29tbWFuZCwKLQlpbnN0ZWFkIG9mIGEgbGlzdCBvZiBhc3NpZ25tZW50cyBhbmQgZXhwb3J0cwotCi0JKiBjb25maWcuZ3Vlc3M6IHJlY29nbml6ZSBBbHBoYS9PU0YxIHN5c3RlbXMKLQotTW9uIE1heSAxMCAxNDo1NTo1MSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQ2hhbmdlIGhlbHAgbWVzc2FnZSB0byBwcmVmZXIgLS1vcHRpb25zIHJhdGhlciB0aGFuCi0JICAtb3B0aW9ucy4KLQotTW9uIE1heSAxMCAwNTo1ODozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQ29udmVyZ2VudCBUZWNoLiAibWluaWZyYW1lIiB1c2VzIG02ODAxMCwgc2V6Ci0JemlwcHlAZWNzdC5jc3VjaGljby5lZHUuCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBtaW5pZnJhbWUuCi0KLVN1biBNYXkgIDkgMTc6NDc6NTcgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYiBhdCBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0gICAgICAgKiBNYWtlZmlsZS5pbjogVXNlIHNyY3Jvb3QgdG8gZmluZCBydW50ZXN0IHJhdGhlciB0aGFuIHJvb3RtZS4KLSAgICAgICBQYXNzIFJVTlRFU1RGTEFHUyBhbmQgRVhQRUNUIGRvd24gaW4gQkFTRV9GTEFHU19UT19QQVNTLgotCi1GcmkgTWF5ICA3IDE0OjU1OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBzdXBwb3J0IGJ1aWxkaW5nIG9uIGEKLQltYWNoaW5lIG90aGVyIHRoYW4gdGhlIGhvc3QuCi0KLVdlZCBNYXkgIDUgMDg6MzU6MDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAodG9vbGRpcik6IEZpeCBmb3IgaTM4Ni1haXggYWdhaW4uCi0KLU1vbiBNYXkgIDMgMTk6MDA6MjcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46ICBDaGFuZ2UgZGVmaW5pdGlvbiBvZiAkKHRvb2xkaXIpCi0JdG8gbWF0Y2ggdGhlIEZTRi4KLQotRnJpIEFwciAzMCAxNTo1NToyMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIGlbMzRdODYvU1ZSNC4KLQotRnJpIEFwciAzMCAxNTo1Mjo0NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZGIpOiBnZGIgZGVwZW5kcyBvbiBzaW0uCi0KLVRodSBBcHIgMjkgMjM6MzA6NDggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnZGIudGFyLlopOiAgTWFrZSBwcm90b3R5cGUgZ2RiIHRlc3RzdWl0ZSBkaXJlY3RvcnkKLQlhdCB0aGUgc2FtZSB0aW1lIHdlIG1ha2UgdGhlIHByb3RvdHlwZSBnZGIgZGlyZWN0b3J5LgotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIE1ha2UgdGhlIHRlc3RzdWl0ZSBkaXN0cmlidXRpb24KLQlmaWxlcyBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBnZGIgYmFzZSByZWxlYXNlIGRpc3RyaWJ1dGlvbi4KLQotVGh1IEFwciAyOSAxMjo1MDozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFVzZSBpbmRpdmlkdWFsIGNoZWNrIHRhcmdldHMgcmF0aGVyIHRoYW4KLQlET19YIHJ1bGUuCi0JKGNoZWNrLWdjYyk6IEFkZGVkLgotCi1UaHUgQXByIDI5IDA5OjUwOjA3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBVc2Ugc3lzdjMuMiBub3Qgc3lzdjMyIGZvciBjYW5vbmljYWwgT1MKLQlmb3IgU3lzdGVtIFYgcmVsZWFzZSAzLjIuCi0KLVRodSBBcHIgMjkgMTA6MzM6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgaHBwYW9zZi4KLQkqIGNvbmZpZ3VyZS5pbjogRG8gY29uZmlndXJlIGxkL2JpbnV0aWxzL2dhcyBmb3IgaXQuCi0KLVR1ZSBBcHIgMjcgMDY6MjU6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAodG9vbGRpcik6IEFsdGVyIHN5bnRheCB1c2VkIHRvIHNldCB0aGlzLCBmb3Igc3lzdGVtcwotCXdoZXJlICJcJCIgaXNuJ3QgaGFuZGxlZCByaWdodCwgbGlrZSBpMzg2LWFpeC4KLQotVGh1IEFwciAyMiAwODoxNzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogUGFzcyBwcm9ncmFtLXRyYW5zZm9ybS1uYW1lLCBub3QKLQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLCB0byByZWN1cnNpdmUgY29uZmlndXJlcy4KLQotVGh1IEFwciAyMiAwMjo1ODoyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdhcytiaW51dGlscy50YXIueik6IE5ldyBydWxlIGZvciBidWlsZGluZyBzbmFwc2hvdHMKLQlvZiBnYXMrbGQrYmludXRpbHMuCi0KLU1vbiBBcHIgMTkgMTc6NDE6MzAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBBSVgzLjIgYXMgZGlzdGluY3QgZnJvbSAzLjEuCi0KLVNhdCBBcHIgMTcgMTc6MTk6NTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlbmFtZSBtODhrLW1vdG9yb2xhLW04OGtiY3MgdG8gbTg4ay1tb3Rvcm9sYS1zeXN2Ci0KLQkqIGNvbmZpZy9taC1kZWx0YTg4OiByZW1vdmUgZXh0cmFuZW91cyBHQ0MgcmVmZXJlbmNlcwotCi1UdWUgQXByIDEzIDE2OjUyOjE2IDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFBSTVMpOiBTZXQgYmFjayB0byBhbGwtcHJtcy4KLQotU2F0IEFwciAxMCAxMjowNDowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IFBhc3MgLXdpdGgtZ251LWFzIGZvciBrbm93biBNSVBTIG5hdGl2ZSBhbmQgTUlQUwotCXRhcmdldHMsIHJhdGhlciB0aGFuIGZvciBNSVBTIGhvc3RzLgotCi1GcmkgQXByICA5IDEzOjUxOjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgY29tbWVudCBmb3IgLS13aXRoLXggZGVmYXVsdCB2YWx1ZXMKLQotCSogY29uZmlnLmd1ZXNzOiBoYW5kbGUgTW90b3JvbGEgRGVsdGE4OCBib3ggZm9yIFNWUjMgYW5kIFNWUjQuCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgY2hlY2stKiB0YXJnZXRzIGZvciBlYWNoIG9mIHRoZSBkaXJlY3RvcmllcyBpbgotCXRoZSB0cmVlLiAgQWRkIGEgZGVmaW5pdGlvbiBvZiBSVU5URVNUIHRoYXQgd2lsbCB1c2UgdGhlIG9uZSB3ZQotCWp1c3QgYnVpbHQsIGlmIGl0IGV4aXN0cy4gIFBhc3MgdGhpcyBkb3duIHZpYSBGTEFHU19UT19QQVNTLgotCi1UaHUgQXByICA4IDA5OjIxOjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmVkIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gYmZkX3RhcmdldCBhbmQKLQl0YXJnZXRfbWFrZWZpbGVfZnJhZy4KLQotCSogYnVpbGQtYWxsLm1rOiBTZXQgYXNzb3J0ZWQgdGFyZ2V0cyBmb3IgUTIuCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgejhrLXNpbSBhbmQgaDgzMDAtaG1zLgotCSogdGVzdC1idWlsZC5tazogUmVhbGx5IGRvbid0IHBhc3MgaG9zdCB0byBjb25maWd1cmUuCi0JKEhPTEVTKTogQWRkZWQgdW5hbWUuCi0KLVdlZCBBcHIgIDcgMTU6NDg6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEhhbmRsZSBhbiBlbXB0eSBwcm9ncmFtLXByZWZpeCwgcHJvZ3JhbS1zdWZmaXggb3IKLQlwcm9ncmFtLXRyYW5zZm9ybS1uYW1lIGNvcnJlY3RseS4KLQotVHVlIEFwciAgNiAxMzo0ODo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tazogLUcgOCBubyBsb25nZXIgcmVxdWlyZWQgZm9yIE1JUFMgdGFyZ2V0cy4KLQkqIHRlc3QtYnVpbGQubWs6IERvbid0IHBhc3MgaG9zdCBhcmd1bWVudCB0byBjb25maWd1cmU7IG1ha2UgaXQKLQlndWVzcy4KLQotVHVlIEFwciAgNiAxMDozNjo1MyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuWik6ICBGaXggZm9yIGJ1aWxkaW5nIGd6aXAnZCBkaXN0cmlidXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoQ09NUFJFU1MpOiAgTmV3IG1hY3JvLCBsaWtlIEdaSVAuCi0KLUZyaSBBcHIgIDIgMDk6MDI6MzEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBVc2UgLXdpdGgtZ251LWFzIGZvciBtaXBzLXNnaS1pcml4NCBhcyB3ZWxsLgotCi0JKiBidWlsZC1hbGwubWs6IFNldCBHQ0MgdG8gZ2NjIC1PIC1HIDggZm9yIE1JUFMgdGFyZ2V0cywgc2luY2UgZ2NjCi0Jd2l0aCBnYXMgY3VycmVudGx5IGRlZmF1bHRzIHRvIC1HIDAuCi0KLVRodSBBcHIgIDEgMDg6MjU6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWZsZXgpOiBmbGV4IGRlcGVuZHMgb24gYnlhY2MuCi0KLQkqIGJ1aWxkLWFsbC5tazogSWYgaG9zdCBub3Qgc3BlY2lmaWVkLCB1c2UgY29uZmlnLmd1ZXNzLiAgUGFzcyBUQUcKLQl0byB0ZXN0LWJ1aWxkLm1rIGFzIFJFTEVBU0VfVEFHLgotCSogdGVzdC1idWlsZC5tayAoY29uZmlnYXJncyk6IE5ldyB2YXJpYWJsZSBjb250YWluaW5nIGFyZ3VtZW50cyB0bwotCXBhc3MgdG8gY29uZmlndXJlLiAgU2V0IHRvIC13aXRoLWdudS1hcyBvbiBtaXBzLWRlYy11bHRyaXguCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gUkVMRUFTRV9UQUcuCi0KLQkqIGNvbmZpZy5ndWVzczogVXNlIC9iaW4vdW5hbWUgd2hlbiBjaGVja2luZyAtWCBhcmd1bWVudCBvbiBTQ08sCi0JdG8gYXZvaWQgaW52b2tpbmcgR05VIHVuYW1lIHdoaWNoIGRvZXNuJ3QgdW5kZXJzdGFuZCAtWC4KLQotCSogdGVzdC1idWlsZC5tazogRG9uJ3QgdXNlIC91c3IvdW5zdXBwb3J0ZWQvYmluL2FzIG9uIEFJWC4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBnYXMgZm9yIG1pcHMtKi0qLgotCi1XZWQgTWFyIDMxIDIxOjIwOjU4IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC5ub3JtYWwpOiBpbnNlcnQgbWlzc2luZyBiYWNrc2xhc2guCi0KLVdlZCBNYXIgMzEgMTI6MzE6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWssIGNvbmZpZy9taC1pcml4NDogQnVtcCAtWE5oIHZhbHVlIHRvIDE1MDAgdG8gbWF0Y2gKLQlnY2MgcmVxdWlyZW1lbnRzLgotCi0JKiBNYWtlZmlsZS5pbjogQ29tcGxldGUgb3ZlcmhhdWwgdG8gbWVyZ2UgbWFueSBhbG1vc3QgaWRlbnRpY2FsCi0JdGFyZ2V0cy4KLQotVHVlIE1hciAzMCAyMDoxNzowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzZXR1cC1kaXJzLWdkYik6IFJlbmFtZWQgZnJvbSBzZXR1cC1kaXJzLgotCShnZGIudGFyLlopOiBBZGp1c3RlZC4KLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMsIHRheik6IE5ldyB0YXJnZXRzOyBzaG91bGQgYmUgZ2VuZXJhbAotCWVub3VnaCB0byBhZGFwdCBmb3IgZ2RiIHNvbWV0aW1lLiAgQnVpbGQgb25seSAueiBmaWxlLgotCShnYXMudGFyLnopOiBOZXcgdGFyZ2V0LgotCi1UdWUgTWFyIDMwIDEwOjAzOjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiBVc2UgQ0M9Y2MgLVhzIG9uIFNvbGFyaXMuCi0KLU1vbiBNYXIgMjkgMTk6NTk6MjYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3VuMzogY2MgbmVlZHMgLUogdG8gY29tcGlsZSBjcC1wYXJzZS5jIGNvcnJlY3RseQotCi0JKiBjb25maWcvbWgtc29sYXJpczogU3VuUFJPIEMgbmVlZHMgLVhzIHRvIGJlIGFibGUgdG8gZ2V0IGEKLQl3b3JraW5nIHhtYWtlZmlsZSBmb3IgRW1hY3MuCi0KLVRodSBNYXIgMjUgMTU6MTQ6MzAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgSW5jb3Jwb3JhdGUgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgd2lsc29uQGN5Z251cy5jb20KLQlmb3IgaGFuZGxpbmcgQklTT04gZm9yIEZTRiByZWxlYXNlcy4KLQotVGh1IE1hciAyNSAwNjoxOTo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBBY3R1YWxseSBpbXBsZW1lbnQgdGhlIGNoYW5nZSB6b28ganVzdCBkb2N1bWVudGVkLgotCi1XZWQgTWFyIDI0IDEzOjAyOjQ0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHdoZW4gdXNpbmcgY29uZmlnLmd1ZXNzLCBvbmx5IHNldCB0YXJnZXRfYWxpYXMgd2hlbgotCWl0J3Mgbm90IGFscmVhZHkgYmVlbiBzZXQgKGllLCBvbiB0aGUgY29tbWFuZCBsaW5lKQotCi1Nb24gTWFyIDIyIDIzOjA3OjM5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0LCBzZXQgUFJNUyB0byBpbnN0YWxsLXBybXMKLQotU3VuIE1hciAyMSAxNjo0NjoxMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkIHN1cHBvcnQgZm9yIHBhY2thZ2VfbWFrZWZpbGVfZnJhZ21lbnQsIGhhbmRsZSB0aGUKLQljYXNlIHdoZXJlIGEgZGlyZWN0b3J5IGhhcyBhIGNvbmZpZ3VyZS5pbiBmaWxlIGJ1dCBubyBNYWtlZmlsZS5pbgotCW1vcmUgZ3JhY2VmdWxseSAod2l0aCBhbiBhY3R1YWwgdW5kZXJzdGFuZGFibGUgZXJyb3IgbWVzc2FnZSwgZXZlbik7Ci0JYWRkIHN1cHBvcnQgZm9yIC0td2l0aG91dCAoYW5kIGFkZCB0aGlzIHRvIHRoZSB1c2FnZSBtZXNzYWdlKTsgYWxzbwotCWV4cGxpY2l0bHkgYWRkIGEgLS1ob3N0PSR7aG9zdF9hbGlhc30gdG8gdGhlIGNvbW1hbmQgbGluZSB3aGVuCi0JY29uZmlnLmd1ZXNzIGlzIHVzZWQKLQotU3VuIE1hciAyMSAxMjoxMTo1OCAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogTXVzdCB1c2UgYm90aCAtLWhvc3QgYW5kIC0tdGFyZ2V0IGluIHJlY3Vyc2l2ZSBjYWxscy4KLQotVGh1IE1hciAxOCAxMjozMTozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgZGVqYS1nbnUgdG8gZGVqYWdudS4KLQotTW9uIE1hciAxNSAxNTo0NDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaDgzMDAtKi0qLCBoODUwMC0qLSopOiBEb24ndCBidWlsZCBsaWJnKysuCi0KLUZyaSBNYXIgMTIgMTg6MzA6MTQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGNhbm9uaWNhbGl6ZSBhbGwgaW5zdGFuY2VzIHRvICotKi1zb2xhcmlzMiosCi0JYWxzbyBzdHJpcCBvdXQgYSBudW1iZXIgb2YgdG9vbHMgdG8gbm90IGJ1aWxkIGZvciBnbzMyIGhvc3QKLQotV2VkIE1hciAxMCAxMjowODoyNyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogYWRkIEdQTC4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwgY29uZmlndXJlOiBidW1wCi0JICBjb3B5cmlnaHRzIHRvIDkzLgotCi1XZWQgTWFyIDEwIDA3OjEyOjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRvLWluZm8pOiBSZW1vdmVkIG9ic29sZXRlIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YKLQlsb2NhbGVudiBmaWxlLgotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRU9WRVJSSURFUyk6IERlZmluZSB0byBiZSBlbXB0eS4KLQotV2VkIE1hciAxMCAwMzoxMTo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhIGNvdXBsZSBvZiAnZWxzZSB0cnVlJyBmb3IgZGVjc3RhdGlvbiwKLQlzdXBwb3J0IGZvciBUY2xYCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJlIHRjbFggdG9vOyBkb24ndCByZW1vdmUgVGsgb24gUlMvNjAwMCBhbnltb3JlCi0KLVR1ZSBNYXIgIDkgMTY6MDY6MTIgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzZXR1cC1kaXJzKTogY2hhbmdlIGludm9jYXRpb24gb2YgbWFrZSB0byAkKE1BS0UpLgotCi1Nb24gTWFyICA4IDE0OjUyOjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UpCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGkzODYtaWJtLWFpeCAoUFMvMikuCi0JKiBjb25maWd1cmUuaW46IFVzZSBjb25maWcvbWgtYWl4Mzg2IGZpbGUgZm9yIGl0LgotCi1Nb24gTWFyICA4IDExOjEyOjQzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEdDQ19GT1JfVEFSR0VUKTogRWxpbWluYXRlZCBkZWZpbml0aW9uOyB1c2UKLQlDQ19GT1JfVEFSR0VUIGluc3RlYWQuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgR0NDX0ZPUl9UQVJHRVQ9JChDQ19GT1JfVEFSR0VUKS4KLQotV2VkIE1hciAgMyAxNjowMDoyOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bvay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHNpbSB0byBsaXN0IG9mIGRpcmVjdG9yaWVzIHNlbnQgd2l0aCBnZGIKLQotV2VkIE1hciAgMyAxMTo0MjozOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBQdXQgYmFjayBtaXBzLWRlYy1ic2QqIGNhc2UuCi0KLVR1ZSBNYXIgIDIgMjE6MTU6NTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkoVWx0cml4IDIuMiBzdXBwb3J0IGZyb20gTWljaGFlbCBSZW5kZWxsIDxtaWNoYWVsQG1lcmN1cnkuY3MubXVuLmNhPikKLQkqIGNvbmZpZ3VyZS5pbiAodmF4LSotdWx0cml4MiopOiAgQWRkIFVsdHJpeCAyLjIgdHJpcGxldC4KLQkqIGNvbmZpZy5ndWVzczogIENoYW5nZSAnVkFYKjpVTFRSSVg6KjoqJyB0byAnVkFYKjpVTFRSSVgqOio6KicuCi0JKiBjb25maWcvbWgtdmF4dWx0MjogIE5ldyBmaWxlLgotCi1UdWUgTWFyICAyIDE4OjExOjAzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgbm8tb3AgbWlwcy1kZWMtYnNkKiBpbiAiY2FzZSAkdGFyZ2V0IgotCi0JKiBNYWtlZmlsZS5pbiAoZGlyLmluZm8pOiBvbmx5IHJ1biBnZW4taW5mby1kaXIgaWYgaXQgZXhpc3RzLAotCShpbnN0YWxsLWluZm8pOiBpbnN0YWxsIGRpci5pbmZvIG9ubHkgaWYgaXQgZXhpc3RzLAotCShhbGwtZXhwZWN0LCBpbnN0YWxsLWV4cGVjdCk6IHBhc3MgYWxvbmcgWDExX0ZMQUdTX1RPX1BBU1MKLQotVHVlIE1hciAgMiAwOTowMTozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBGb3Igdm1zIHRhcmdldCwgc2tpcCBiZmQsIGxkLCBiaW51dGlscy4gIERvIGJ1aWxkCi0JZ2FzIGZvciBtaXBzLWRlYy1ic2QuCi0KLVR1ZSBNYXIgIDIgMDg6MzU6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgKG1ha2VzcmNkaXIpOiBJZiAke3NyY2Rpcn0gaXMgcmVsYXRpdmUgYW5kIG5vdCAiLiIsCi0JYW5kICR7c3ViZGlyfSBpcyBub3QgIi4iLCBzZXQgbWFrZXNyY2RpciBiYXNlZCBvbiAke2ludnN1YmRpcn0uCi0KLVR1ZSBGZWIgMjMgMTQ6MTg6MjggMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGRlZCAiZGVqYWdudSIgdG8gaG9zdHRvb2xzIGxpc3QuCi0KLU1vbiBGZWIgMjIgMjM6Mjg6MzggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW4sIGNvbmZpZy5ndWVzczogIEFkZCBzdXBwb3J0Ci0JZm9yIEJvc3gsIGFuIEFJWCB2YXJpYW50IGZyb20gQnVsbC4KLQlQYXRjaGVzIGZyb20gRi5QaWVycmVzdGVndXlAZnJjbC5idWxsLmZyLgotCi1TdW4gRmViIDIxIDExOjE1OjIyIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGRldm8vZGVqYWdudTogSW5pdGlhbCBjcmVhdGlvbiBvZiBkZXZvL2RlamFnbnUuCi0JTWlncmF0ZWQgZGVqYWdudSB0ZXN0Y2FzZXMgYW5kIHN1cHBvcnQgZmlsZXMgZm9yIHRlc3Rpbmcgc29mdHdhcmUKLQl0b29scyB0byByZXNpZGUgYXMgc3ViZGlyZWN0b3JpZXMsIGN1cnJlbnRseSBjYWxsZWQgInRlc3RzdWl0ZSIsCi0Jd2l0aGluIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHNvZnR3YXJlIHRvb2wuICBNaWdyYXRlZCBhbGwgcHJvZ3JhbXMsCi0Jc3VwcG9ydCBsaWJyYXJpZXMsIGV0Yy4gYmVsb2dpbmcgdG8gZGVqYWdudSBwcm9wZXIgZnJvbQotCWRldm8vZGVqYS1nbnUgdG8gZGV2by9kZWphZ251LglUaGVzZSBmaWxlcyB3ZXJlIG1vdmVkICJhcyBpcyIKLQl3aXRoIG5vIG1vZGlmaWNhdGlvbnMuCVRoZSBjaGFuZ2VzIHRvIHRoZXNlIGZpbGVzIHdoaWNoIHdpbGwKLQlhbGxvdyB0aGVtIHRvIGNvbmZpZ3VyZSwgYnVpbGQsIGFuZCBleGVjdXRlIHByb3Blcmx5IHdpbGwgYmUgbWFkZQotCWluIGEgZnV0dXJlIHVwZGF0ZS4KLQotRnJpIEZlYiAxOSAyMDoxOTozOSAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2Ugc2VuZF9wciB0byBzZW5kLXByLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIHNlbmRfcHI6IFJlbmFtZWQgZGlyZWN0b3J5IHRvIHNlbmQtcHIuCi0KLUZyaSBGZWIgMTkgMTk6MDA6MTMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIHNvbWUgZXh0cmEgc2VtaS1jb2xvbnMgKG5lZWRlZCBpZiBTSEVMTD1iYXNoKS4KLQotRnJpIEZlYiAxOSAwMDo1OTozMyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgVXBkYXRlIGZvciBnZGItNC44IHJlbGVhc2UuCi0JKiBNYWtlZmlsZS5pbiAoZ2RiLnRhci5aKTogIEFkZCB0ZXhpbmZvL3RleDNwYXRjaC4gIEJ1aWxkCi0JZ2RiLXh4eC50YXIueiAoZ3ppcCdkKSBmaWxlIGFsc28uCi0KLVRodSBGZWIgMTggMDk6MTY6MTcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFrZSBhbGwtZGlmZiBkZXBlbmQgb24gYWxsLWxpYmliZXJ0eQotCi1UdWUgRmViIDE2IDE2OjA2OjMxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGFkZCB2YXgtdWx0cml4IGluIHRoZSBzcGlyaXQgb2YgbWlwcy11bHRyaXguCi0KLVR1ZSBGZWIgMTYgMDU6NTc6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBhZGQgaGVsbG8sIHRhciwgZ3ppcCwgcmVjb2RlLCBpbmRlbnQKLQotVHVlIEZlYiAxNiAwMDo1ODoyMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6ICBSZW1vdmUgZXRjIGRpcmVjdG9yeQotCShFVENfU1VQUE9SVCk6ICBPbmx5IGFkZCB0aGUgZmlsZXMgR0RCIHdhbnRzIGZyb20gZXRjLy4KLQkoZ2RiLnRhci5aKTogIFVzZSBFVENfU1VQUE9SVC4gIFVzZSBieWFjYyB3aGVuIGJ1aWxkaW5nIHRoZSBmaWxlLgotCi1UaHUgRmViIDExIDIwOjE0OjI4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBtYWtlaW5mbyBiaW5hcnkgaXMgaW4gYSBuZXcgbG9jYXRpb24KLQotVHVlIEZlYiAgOSAxMjo0MjoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtZWNvZmYgYXMgYW4gT1MuCi0KLQkqIE1ha2VmaWxlLmluOiBWYXJpb3VzIGNoYW5nZXMgdG8gZWxpbWluYXRlIGEgbGV2ZWwgb2YgbWFrZQotCXJlY3Vyc2lvbiBhbmQgcmVkdWNlIHRoZSByZXF1aXJlZCBjb21tYW5kIGxpbmUgbGVuZ3RoLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBOZXcgdmFyaWFibGUgaG9sZGluZyBmbGFncyBwYXNzZWQgdG8gYWxsCi0Jc3ViLW1ha2VzLgotCShFWFRSQV9IT1NUX0ZMQUdTLCBFWFRSQV9UQVJHRVRfRkxBR1MsIEVYVFJBX0dDQ19GTEFHUyk6IE5ldwotCXZhcmlhYmxlcyBob2xkaW5nIHNldHRpbmdzIGZvciBzcGVjaWZpYyBzdWItbWFrZXMuCi0JKEZMQUdTX1RPX1BBU1MsIFRBUkdFVF9GTEFHU19UT19QQVNTLCBHQ0NfRkxBR1NfVE9fUEFTUyk6IFJld3JvdGUKLQlpbiB0ZXJtcyBvZiBCQVNFX0ZMQUdTX1RPX1BBU1MuCi0JKFRBUkdFVF9MSUJTKTogTmV3IHZhcmlhYmxlIGxpc3RpbmcgZGlyZWN0b3JpZXMgd2hpY2ggdXNlCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCi0JKHN1YmRpcl9kbyk6IEVsaW1pbmF0ZWQuCi0JKGRvLSopOiBOZXcgc2V0IG9mIHRhcmdldHMgdG8gcmVwbGFjZSBzdWJkaXJfZG8uCi0JKHZhcmlvdXMpOiBBbGwgdGFyZ2V0cyB3aGljaCB1c2VkIHN1YmRpcl9kbyBub3cgZGVwZW5kIG9uIGRvLSouCi0JKGxvY2FsLWNsZWFuKTogUmVuYW1lZCBmcm9tIGRvX2NsZWFuLgotCShsb2NhbC1kaXN0Y2xlYW4pOiBOZXcgdGFyZ2V0LCBkZXBlbmRlbmN5IG9mIGRpc3RjbGVhbiBhbmQKLQlyZWFsY2xlYW4uCi0JKGluc3RhbGwtaW5mbyk6IERvbid0IGNyZWF0ZSBkaXJlY3Rvcmllcy4gIERlcGVuZCBvbiBkaXIuaW5mbwotCXJhdGhlciB0aGFuIGNhbGxpbmcgbWFrZSByZWN1cnNpdmVseS4KLQkoaW5zdGFsbC1kaXIuaW5mbyk6IEVsaW1pbmF0ZWQuCi0JKGluc3RhbGwtaW5mby1kaXJzKTogQ3JlYXRlIGFsbCBpbmZvIGRpcmVjdG9yaWVzIGhlcmUuCi0JKGRpci5pbmZvKTogRGVwZW5kIHVwb24gZG8taW5zdGFsbC1pbmZvLgotCi0JKiB0ZXN0LWJ1aWxkLm1rIChIT0xFUyk6IEFkZGVkIGZhbHNlLgotCi1TYXQgRmViICA2IDE0OjA1OjA5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIEJTREkgYW5kIEJTREogKEpvbGl0eiAzODZic2QpLgotCi1UaHUgRmViICA0IDIwOjQ5OjE4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluZm8pOiByZW1vdmUgZGVwZW5kZW5jeSBvbiBhbGwtdGV4aW5mby4gIFRoZQotCXByb2JsZW0gd2FzIHJlYWxseSBpbiB0ZXhpbmZvL0MsIG5vdCBhdCB0aGlzIGxldmVsLgotCi1UaHUgRmViICA0IDEzOjM4OjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluZm8pOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGFsbC10ZXhpbmZvIChQUiAyMTEyKS4KLQotVGh1IEZlYiAgNCAwMTo1MDo1MyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIENoYW5nZSBCSVNPTiB0byAnYmlzb24gLXknIGZvcgotCUdEQiByZWxlYXNlcy4KLQotV2VkIEZlYiAgMyAxNzoyMjoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSW5jbHVkZSBzcmNkaXIgaW4gbWVzc2FnZSBhYm91dCB0YXJnZXQgb2YgbGluayBub3QKLQliZWluZyBmb3VuZC4gIERvbid0IGNvbnZlcnQgYC0nIHRvIGBfJyBpbiBgd2l0aCcgb3B0aW9ucyBiZWluZwotCXBhc3NlZCB0byBzdWJkaXJzLgotCi1UdWUgRmViICAyIDE4OjU3OjU5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgdXVkZWNvZGUgdG8gaG9zdF90b29scwotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQge2FsbCxpbnN0YWxsfS11dWRlY29kZSB0YXJnZXRzLCBhZGRlZCB0aGVtIHRvCi0JdGhlIGFwcHJvcHJpYXRlIGxpc3RzCi0KLVR1ZSBGZWIgIDIgMTE6NDU6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gYWxsLWdhcy4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotKik6IEJ1aWxkIGxkIGFuZCBiaW51dGlscy4KLQotTW9uIEZlYiAgMSAxMjozNTo0MSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogY2hlY2sgcmV0dXJuIGNvZGUgZnJvbSBta2RpciwgcHJpbnQgZXJyb3IgbWVzc2FnZSBhbmQKLQkgIGV4aXQgb24gZmFpbHVyZS4KLQotU2F0IEphbiAzMCAxNjo0MDoyOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIE5ldyBsb2NhdGlvbiBmb3IgdGV4aW5mby50ZXguCi0KLVRodSBKYW4gMjggMTU6MDk6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rIChIT0xFUyk6IEFkZGVkIHRhciwgY3BpbyBhbmQgdXVkZWNvZGUuCi0KLVdlZCBKYW4gMjcgMTY6NTA6MzIgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChoODUwMCk6ICBSZWNvZ25pemUgdGhpcyBhcyBhIGNwdSB0eXBlLgotCi1TYXQgSmFuIDIzIDIwOjMyOjAxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBzb3VyY2UgZGlyZWN0b3J5IG1pc3NpbmcgaXMgbm8gbG9uZ2VyIGEgd2FybmluZwotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBpcml4WzM0XSogaW5zdGVhZCBvZiBpcml4WzM0XQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIGFuZCBwYXNzIGRvd24gWDExX0xJQgotCi0JKiBjb25maWcvbWgtc2NvOiBkZWZpbmUgWDExX0xJQiB0byB0aGUgbWVzcyB0aGF0IFNDTyBPRFQgcmVxdWlyZXMKLQotU2F0IEphbiAyMyAxMzo0OTo0MCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogZ3Vlc3Mtc3lzdHlwZTogUmVuYW1lZCB0byAuLi4KLQkqIGNvbmZpZy5ndWVzczogIC4uLiBieSBwb3B1bGFyIHJlcXVlc3QuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiAgVXBkYXRlIGFjY29yZGluZ2x5LgotCi1UaHUgSmFuIDIxIDEyOjIwOjU1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBndWVzcy1zeXN0eXBlOiAgUGF0Y2hlcyBmcm9tIEpvaG4gRWF0b24gPGp3ZUBjaGUudXRleGFzLmVkdT46Ci0JKyBBZGQgQ29udmV4LCBDcmF5L1VuaWNvcywgYW5kIEVuY29yZS9NdWx0aW1heCBzdXBwb3J0LgotCSsgRXhlY3V0ZSAuL2R1bW15IGluc3RlYWQgb2YgYXNzdW1pbmcgLiBpcyBpbiBQQVRILgotCi1UdWUgSmFuIDE5IDE3OjE4OjA2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBndWVzcy1zeXN0eXBlOiAgTmV3IHNoZWxsIHNjcmlwdC4gIEF0dGVtcHRzIHRvIGd1ZXNzIHRoZQotCWNhbm9uaWNhbCBob3N0IG5hbWUgb2YgdGhlIGV4ZWN1dGluZyBob3N0LgotCU9ubHkgYSBmZXcgaG9zdHMgYXJlIHN1cHBvcnRlZCBzbyBmYXIuCi0JKiBjb25maWd1cmU6ICBDYWxsIGd1ZXNzLXN5c3R5cGUgaWYgbm8gaG9zdCBpcyBzcGVjaWZpZWQuCi0KLVR1ZSBKYW4gMTkgMDg6MjY6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2NjLW5vLWZpeGVkaW5jbHVkZXMpOiBNYWRlIHRvIHdvcmsgd2l0aCBjdXJyZW50Ci0JZ2NjIE1ha2VmaWxlLgotCi0KLUZyaSBKYW4gMTUgMTA6Mjc6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR0NDX0ZMQUdTX1RPX1BBU1MpOiBOZXcgdmFyaWFibGUuCi0JKGFsbC1nY2MsIGluc3RhbGwtZ2NjLCBzdWJkaXJfZG8pOiBVc2UgaXQuCi0KLVdlZCBKYW4gMTMgMTc6MDY6NDUgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVuYW1lIHVuaW5zdGFsbGVkIGdjYyBkcml2ZXIgZnJvbSBnY2MgdG8geGdjYy4KLQotV2VkIEphbiAgNiAyMDoyOToxNiAxOTkzICBNaWtlIFdlcm5lciAgKG10d0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZWQgZXhwbGljaXQgc2V0dGluZyBvZiBTVUJESVJTLiBTVUJESVJTIGlzIG5vdwotCSAgc2V0IGV4Y2x1c2l2ZWx5IGJ5IGNvbmZpZ3VyZSwgdXNpbmcgY29uZmlndXJlLmluIC4KLQotV2VkIEphbiAgNiAxMzo0NDoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHNldCAkUEFUSCBmb3IgYWxsIGJ1aWxkcwotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBUQVJHRVRfRkxBR1NfVE9fUEFTUyBmb3IgeGliZXJ0eSBhbmQgbGlibQotCi1XZWQgSmFuICA2IDExOjAyOjEwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR0NDX0ZPUl9UQVJHRVQpOiAgU3VwcGx5IGEgZGVmYXVsdCB0aGF0IG1hdGNoZXMKLQl0aGUgb25lIHVzZWQgaW4gZ2NjL01ha2VmaWxlLmluLCBzbyB0aGF0IGEgbnVsbCBleHBhbnNpb24gZG9lc24ndAotCW92ZXJyaWRlIHRoZSBvbmUgbmVlZGVkIHRvIGJ1aWxkIGdjYyB3aXRoIGEgbmF0aXZlIGNjLgotCi0KLVR1ZSBKYW4gIDUgMDc6NTU6MTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFjY2VwdCAtd2l0aCBhcmd1bWVudHMuCi0KLVN1biBKYW4gIDMgMTU6MTU6MDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBoODMwMHNpbQotCi1UdWUgRGVjIDI5IDE1OjA2OjAwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXNjbzogRG9uJ3Qgb3ZlcnJpZGUgQklTT04gZGVmaW5pdGlvbi4KLQotCSogYnVpbGQtYWxsLm1rOiBJZiBjYW5vbmhvc3QgaXMgaTM4Ni11bmtub3duLXNjbzMuMnY0LCBjaGFuZ2UgaXQKLQl0byBpMzg2LXNjbzMuMnY0LiAgU2V0IFRBUkdFVFMgYW5kIENGTEFHUyBmb3IgaTM4Ni1zY28zLjJ2NC4KLQkoYWxsLWN5Z251cywgbmF0aXZlLCBidWlsZC1jeWdudXMpOiBNYWtlCi0JJChjYW5vbmhvc3QpLXN0YW1wLTNzdGFnZS1kb25lLCBub3QgJChob3N0KS4uLi4KLQkqIHRlc3QtYnVpbGQubWsgKHN0YW1wLTNzdGFnZS1jb21wYXJlZCk6IFVzZSB0YWlsICsxMGMgZm9yCi0JaTM4Ni1zY28zLjJ2NC4gIEFkZGVkIGVsc2UgdHJ1ZSB0byBpZiBjb21tYW5kLgotCi1Nb24gRGVjIDI4IDEyOjA4OjU2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAoZnJvbSBGU0YpIFNlcXVlbnQgdXNlcyBhIEJTRC1saWtlIE9TLgotCi1Nb24gRGVjIDI4IDA4OjMyOjA2IDE5OTIgIE1pbmggVHJhbi1MZSAgKG10cmFubGVAcGFyaXMuaW50ZWxsaWNvcnAuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1pc2MqKTogYWRkZWQ7IHVzZXMgbWgtc3lzdi4KLQotVGh1IERlYyAyNCAxNzoyNjoyNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgcmVtb3ZlIGJpbnV0aWxzIGZyb20gU29sYXJpcyBidWlsZHMKLQotVGh1IERlYyAyNCAxNDowODozOCAxOTkyIGRhdmlkIGRgem9vJyB6dWhuICAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBnZXQgcmlkIG9mIGVhcmxpZXIgZGVmaW5pdGlvbnMgZm9yICpjbGVhbiwKLQlhbHNvIGhhbmRsZSB0aGUgcmVjdXJzaXZlIGluZm8gcnVsZSBiZXR0ZXIKLQotVGh1IERlYyAyNCAxMjo0MDoyMSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbiwgZGlzdGNsZWFuLCByZWFsY2xlYW4pOiAgRml4IHRvCi0JZG8gbW9yZS1vci1sZXNzIHRoZSByaWdodCB0aGluZy4KLQotV2VkIERlYyAxNiAxMDoyNTozMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgbGluZXMgZGVmaW5pbmcgQ0MgYW5kIENYWCwgYW5kIHVzZSBDWFggcmF0aGVyCi0JdGhhbiBnY2MgaW4gZGVmaW5pdGlvbnMgb2YgQ1hYX0ZPUl9CVUlMRCBhbmQgQ1hYX0ZPUl9UQVJHRVQuCi0KLVR1ZSBEZWMgMTUgMDA6MzQ6MzIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlIGFsbCAkKGhvc3RfY3B1KS0kKGhvc3RfdmVuZG9yKS0kKGhvc3Rfb3MpIHRvCi0JJChob3N0X2Nhbm9uaWNhbCkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogc3BsaXQgdGhlIGNvbmZpZ2RpcnMgbGlzdCBpbnRvIDQgY2F0ZWdvcmllcyAobmF0aXZlCi0Jdi4gY3Jvc3MsIGxpYnJhcnkgdi4gdG9vbCkgYW5kIGhhbmRsZSB0aGUgY3Jvc3Mtb25seSBhbmQgbmF0aXZlLQotCW9ubHkgaW4gbW9yZSByZWFzb25hYmxlIChhbmQgY29ycmVjdCEpIHdheS4KLQotTW9uIERlYyAxNCAxNzowNDoyMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotKik6ICBEb24ndCByZW1vdmUgYmZkIGFuZCBnZGIgZnJvbQotCWNvbmZpZ2RpcnMgYW55bW9yZS4KLQotU3VuIERlYyAxMyAwMDozNzoyNiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBleHRlbnNpdmUgY2xlYW51cDo6ICByZW1vdmVkIGFsbCBvZiB0aGUgZXhwbGljaXQKLQljbGVhbi0qIHRhcmdldHMsIGNvbGxhcHNlZCBtYW55IHdyYXBwZXJzIGFyb3VuZCBzdWJkaXJfZG8gaW50bwotCW9uZSwgYWRkZWQgYWRkaXRpb25hbCB0YXJnZXRzIHRvIHNhdGlzZnkgc3RhbmRhcmRzLnRleGksIGRlbGV0ZWQKLQlzb21lIG9sZCB0YXJnZXRzLCBzb21lIGNoYW5nZXMgZm9yIGNvbnNpc3RlbmN5Ci0KLUZyaSBEZWMgMTEgMjA6MTg6MDIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSBzb21lIHByb2dyYW1zIGFzIGNyb3NzLW9ubHksIGFuZCBvdGhlcnMgYXMKLQluYXRpdmUgb25seQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBoYW5kbGUgcGFydGlhbCBob2xlcyBpbiBhIG1vcmUgZ2VuZXJpYyBtYW5uZXIKLQotCSogTWFrZWZpbGUuaW46IG00IGRlcGVuZHMgb24gbGliaWJlcnR5Ci0KLU1vbiBEZWMgIDcgMDY6NDM6MjcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc2NvOiBkb24ndCBkZWZhdWx0ICQoQ0MpIHRvIGdjYwotCi1UaHUgRGVjICAzIDIxOjUyOjExIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgbTQsIHRleHR1dGlscywgZmlsZXV0aWxzLCBzZWQsIHNoZWxsdXRpbHMsCi0JdGltZSwgd2RpZmYsIGFuZCBmaW5kIHRvIGNvbmZpZ2RpcnMKLQotCSogTWFrZWZpbGUuaW46IGFsbCwgY2xlYW4sIGFuZCBpbnN0YWxsIHJ1bGVzIGZvciB0aGUgbmV3IHByb2dyYW1zCi0JYWRkZWQgdG8gY29uZmlndXJlLmluCi0KLU1vbiBOb3YgMzAgMTQ6NTQ6MzQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBtaC1zdW4gZm9yIGFsbCAqLXN1bi0qIGhvc3RzCi0KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiByZXdvcmsgc3RhbmRhcmQgWCBsb2NhdGlvbiB0byB1c2UKLQkkT1BFTldJTkhPTUUsIGlmIGRlZmluZWQuCi0KLQkqIGNvbmZpZy9taC1zdW46IGhhbmRsZSBYMTEgaW5jbHVkZSBsb2NhdGlvbnMKLQotCSogY29uZmlnL21oLWRlY3N0YXRpb246IGRlZmluZSBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzIHRvIDAsIHRvCi0Jd29yayBhcm91bmQgZGFpbi1icmFtYWdlZCBERUN3aW5kb3dzIGluY2x1ZGUgZmlsZXMKLQotRnJpIE5vdiAyNyAxODozNTo1NCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgZmxhZ3MgZm9yIFgxMSBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJ5IGZpbGUKLQlsb2NhdGlvbnMsIHBhc3MgdGhlbSBkb3duIHRvIHRoZSBwcm9ncmFtcyB0aGF0IG5lZWQgdGhpcyBpbmZvCi0KLQkqIGJ1aWxkLWFsbC5tazogYWRkZWQgYSAnbmF0aXZlJyB0YXJnZXQsIHRvIDNzdGFnZSB0aGUgbmF0aXZlIHRvb2xjaGFpbgotCi0JKiBjb25maWcve21oLWhwdXgsbWgtc29sYXJpc306IGRlZmluZSB0aGUgInN0YW5kYXJkIiBsb2NhdGlvbnMgZm9yCi0JdGhlIHZlbmRvciBzdXBwbGllZCBYMTEgaGVhZGVycyBhbmQgbGlicmFyaWVzCi0KLVN1biBOb3YgMjIgMTg6NTk6MTMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHN0YXJ0IGJ1aWxkaW5nIGxpYmcrKyBmb3IgSFAtVVggdGFyZ2V0cwotCi1XZWQgTm92IDE4IDE5OjMzOjExIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBVcGRhdGUgcmVmZXJlbmNlcyB0byBmaWxlcyBtb3ZlZCBpbnRvIGV0Yy8uCi0KLVN1biBOb3YgMTUgMDk6MzY6MDggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKGkzODZzb2wyLCBpNDg2c29sMik6ICBpWzM0XTg2LXVua25vd24tc29sYXJpczIuCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zb2xhcmlzMiopOiAgVXNlIGNvbmZpZy9taC1zeXN2NC4KLQotVGh1IE5vdiAxMiAwODo1MDo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWNjZXB0IGRhc2ggYXMgd2VsbCBhcyB1bmRlcnNjb3JlIGluIGxvbmcgb3B0aW9uCi0JbmFtZXMgZm9yIEZTRiBjb21wYXRpYmlsaXR5LgotCi1XZWQgTm92IDExIDA4OjA0OjM3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogYWRkZWQgLXNjbzMuMnY0IHN1cHBvcnQgZnJvbSBGU0YuCi0KLVN1biBOb3YgIDggMjE6MTQ6MzAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGV4cGFuZCB0aGUgc2VjdGlvbiB0aGF0IGFkZHMgb3IgcmVtb3ZlcwotCWRpcmVjdG9yaWVzIGZyb20gdGhlIGxpc3Qgb2YgcHJvZ3JhbXMgdG8gYnVpbGQsIHRvIGhhbmRsZSBuYXRpdmUKLQl2cy4gY3Jvc3MgaW4gYWRkaXRpb24gdG8gaG9zdCB2LiBuYXRpdmUKLQotU2F0IE5vdiAgNyAxODo1MjoyNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVwbGFjZSBDKysgaW4gbWFjcm8gbmFtZXMgd2l0aCBDWFguCi0JVGhpcyBpcyBsZXNzIGxpa2VseSB0byBicmVhayAuLi4KLQotU2F0IE5vdiAgNyAxNToxNjo1OCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IGFkZCAtdyB0byBHTlVfTUFLRQotCi1GcmkgTm92ICA2IDIzOjEwOjM3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogcmVtb3ZlICdzcGFyYyctLT4nc3BhcmMtc3VuJyBkZWZhdWx0IHRyYW5zZm9ybWF0aW9uLAotCWFkZCAnc3BhcmMnIHRvIGxpc3Qgb2YgcmVjb2duaXplZCBjcHVzLiAgVGhpcyBuZWVkZWQgdG8gbWFrZQotCSdzcGFyYy1hb3V0JyBleHBhbmQgdG8gJ3NwYXJjLXVua25vd24tYW91dCcgaW5zdGVhZCBvZiAnc3BhcmMtc3VuLWFvdXQnLgotCURlbGV0ZSBzb21lIHJlZHVuZGFudCBvc2U2OCB2YXJpYW50cy4gIFJlY29nbml6ZSAtd3JzIGFzIGFuIG9zLAotCXRoZW4gY2hhbmdlcyB0aGF0IGludG8gJENQVS13cnMtdnh3b3Jrcy4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgbW9zdCByZWZlcmVuY2VzIHRvIGdkYnRlc3QsIHJlZ3VsYXJpemUKLQl0YXJnZXQgYmFzZWQgcHJvZ3JhbSByZW1vdmFsCi0KLQkqIHRlc3QtYnVpbGQubWs6IGltcG9ydCBmcm9tIHAzIHRyZWUgKG1hbnkgZml4ZXMgYW5kIGNoYW5nZXMpCi0KLUZyaSBOb3YgIDYgMjA6NTk6MDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBydWxlcyB0byBoYW5kbGUgdGNsLCB0aywgYW5kIGV4cGVjdAotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSB0aG9zZSBkaXJlY3RvcmllcyBpZiB0aGV5IGV4aXN0Ci0KLVRodSBOb3YgIDUgMTQ6MzU6NDEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiByZW1vdmVkIGJvZ3VzIGhwcGFic2QgYW5kIGhwcGFocHV4IG5hbWVzLCBzaW5jZQotCSJocHBhIiBpcyBub3QgYSB2YWxpZCBjcHUgKGhwcGExLjEgb3IgaHBwYTEuMCBhcmUsIHRob3VnaCkKLQotVGh1IE9jdCAyOSAwMDoxMjo0MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbGwtZ2NjIG5vdyBkZXBlbmRzIG9uIGFsbC1iaW51dGlscy4gIGFsbC1saWJnKysKLQlkZXBlbmRzIHVwb24gYWxsLXhpYmVydHkKLQotCSogTWFrZWZpbGUuaW46IGNoYW5nZXMgZnJvbSBwMywgaW5jbHVkaW5nOgotCi0JVGh1IE9jdCAgOCAxNTowMDoxNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYVFJBRkxBR1MpOiBpbmNsdWRlIG5ld2xpYiBkaXJlY3RvcmllcyBpZgotCW5ld2xpYi9NYWtlZmlsZSBleGlzdHMsIHJhdGhlciB0aGFuIGlmIGhvc3QgIT0gdGFyZ2V0LgotCi0JRnJpIFNlcCAyNSAxMzo0MTo1MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAtbm9zdGRpbmMgdG8gWFRSQUZMQUdTIGlmIHdlIGFyZSB1c2luZyBnY2MKLQlmcm9tIHRoZSBzYW1lIHNvdXJjZSB0cmVlIGFuZCBub3QgYnVpbGRpbmcgYSBjcm9zcy1jb21waWxlci4gIFRoaXMKLQltYXR0ZXJzIGZvciB0aGUgbGliZysrIGNvbmZpZ3VyYXRpb24gaWYgcmVjb25maWd1cmluZyBhIHRyZWUgdGhhdAotCWhhcyBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkLgotCi0JVGh1IFNlcCAxMCAxMDozNTo1MSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAtSSBmb3IgbmV3bGliL3RhcmctaW5jbHVkZSB0byBYVFJBRkxBR1MsIHRvCi0JcGljayB1cCB0aGUgbWFjaGluZSBhbmQgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIEFTX0ZPUl9UQVJHRVQsIHBhc3NlZCBkb3duIGluCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MuICBBZGRlZCBDQ19GT1JfQlVJTEQsIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlCi0JdGhlIEMgY29tcGlsZXIgdG8gdXNlIHRvIGNyZWF0ZSBwcm9ncmFtcyB3aGljaCBhcmUgcnVuIGluIHRoZQotCWJ1aWxkIGVudmlyb25tZW50LCBzZXQgaXQgdG8gZGVmYXVsdCB0byAkKENDKSwgYW5kIHBhc3NlZCBpdCBkb3duCi0JaW4gRkxBR1NfVE9fUEFTUyBhbmQgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCi0KLQlNb24gU2VwICA3IDIyOjM0OjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgJChob3N0KSA9ICQodGFyZ2V0KSB0ZXN0cyBiYWNrIHRvICpfRk9SX1RBUkdFVC4KLQlXZSBuZWVkIHRoZW0gZm9yIHVudXN1YWwgbmF0aXZlIGJ1aWxkcywgbGlrZSBzeXN0ZW1zIHdpdGhvdXQKLQlyYW5saWIuCi0KLQkqIGNvbmZpZ3VyZTogYWxzbyBkZWZpbmUgJChob3N0X2Nhbm9uaWNhbCkgYW5kCi0gICAgICAgICQodGFyZ2V0X2Nhbm9uaWNhbCksIHdoaWNoIGFyZSB0aGUgZnVsbCwgY2Fub25pY2FsIG5hbWVzIGZvciB0aGUKLSAgICAgICAgZ2l2ZW4gaG9zdCBhbmQgdGFyZ2V0Ci0KLVN1biBOb3YgIDEgMTY6Mzg6MTcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkZWQgc2VwYXJhdGUgZGVmaW5pdGlvbnMgZm9yIEMrKy4KLQotRnJpIE9jdCAzMCAxMTozNzo1MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogIEFkZCBkZWphLWdudS4KLQotRnJpIE9jdCAyMyAwMDozOToxOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgVXBkYXRlIGZvciBjb25maWd1cmUudGV4aSBhbmQgZ2RiLTQuNyByZWxlYXNlLgotCi1XZWQgT2N0IDIxIDIxOjU0OjI3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE1vdmUgImFsbCIgdGFyZ2V0IHRvIHRvcCBvZiBmaWxlLgotCVByZXZpb3VzbHksIGZpcnN0IHRhcmdldCB3YXMgIi5QSE9OWSIgd2hpY2ggY2F1c2VkIEJTRDQuNCBtYWtlCi0JdG8gYnVpbGQgLlBIT05ZIHdoZW4gbWFrZSB3YXMgcnVuIHdpdGhvdXQgYXJndW1lbnRzLgotCi1Nb24gT2N0IDE5IDAxOjE3OjU0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBDT1BZSU5HLkxJQiB0byBHREIgcmVsZWFzZXMsIG5vdyB0aGF0IHRoZXJlJ3MKLQlMaWJyYXJ5LWNvcHlsZWZ0ZWQgY29kZSBpbiBsaWJpYmVydHkuCi0KLVR1ZSBPY3QgMTMgMDE6MjI6MzIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBSZXBsYWNlIG02OGttb3RlIHdpdGggcGxhaW4gb2xkIG02OGsuCi0KLUZyaSBPY3QgIDkgMDM6MTQ6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHNwYWNlIGZyb20gYmxhbmsgbGluZSwgYXZvaWQgTWFrZSBjb21wbGFpbnRzLgotCi1UaHUgT2N0ICA4IDE4OjQxOjQ1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBDb21wbGFpbiBpZiBubyBhcmd1bWVudCBpcyBnaXZlbi4gIEFkZGVkIHN1cHBvcnQgZm9yCi0JMzg2YnNkIGFzIE9TIGFuZCB0YXJnZXQgYWxpYXMuCi0KLVRodSBPY3QgIDggMTU6MDc6MjIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoWFRSQUZMQUdTKTogaW5jbHVkZSBuZXdsaWIgZGlyZWN0b3JpZXMgaWYKLQluZXdsaWIvTWFrZWZpbGUgZXhpc3RzLCByYXRoZXIgdGhhbiBpZiBob3N0ICE9IHRhcmdldC4KLQotTW9uIE9jdCAgNSAwMzowMDowOSAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IHJlY29nbml6ZSBzcGFyY2xpdGUtd3JzLXZ4d29ya3MuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXhpYmVydHkpOiBhZGRlZCAqLXhpYmVydHkgbWFrZSBydWxlcyAoZnJvbQotCXAzLikgQWRkZWQgY2xlYW4teGliZXJ0eSB0byBjbGVhbi4KLQotVGh1IE9jdCAgMSAxNzo1OToxOSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlICotKi0qIGluc3RlYWQgb2YgbmVzdGVkIGNhc2VzIGZvciBob3N0IGFuZCB0YXJnZXQKLQotVHVlIFNlcCAyOSAxNDoxMToxOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAtbm9zdGRpbmMgdG8gWFRSQUZMQUdTIGlmIHdlIGFyZSB1c2luZyBnY2MKLQlmcm9tIHRoZSBzYW1lIHNvdXJjZSB0cmVlIGFuZCBub3QgYnVpbGRpbmcgYSBjcm9zcy1jb21waWxlci4gIFRoaXMKLQltYXR0ZXJzIGZvciB0aGUgbGliZysrIGNvbmZpZ3VyYXRpb24gaWYgcmVjb25maWd1cmluZyBhIHRyZWUgdGhhdAotCWhhcyBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkLgotCi1TZXAgMjAgMDg6NTM6MTAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKGk0ODZ2L2k0ODZ2NCk6ICBNZXJnZSBpbiBmcm9tIEZTRiB2ZXJzaW9uLgotCi1GcmkgU2VwIDE4IDAwOjMyOjAwIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogb25seSBzZXQgUFdEIGlmIGl0IGlzIGFscmVhZHkgc2V0LgotCi1UaHUgU2VwIDE3IDIzOjA1OjUzIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZToganVzdCBzZXQgUFdEPWBwd2RgIGF0IHRoZSB0b3AsIHNpbmNlIFVsdHJpeCBzaAotCWRvZXNuJ3QgaGF2ZSB1bnNldCBhbmQgYWxsIHN1Y2Nlc3MgcGF0aHMgKGFuZCBtb3N0IGVycm9yIHBhdGhzKQotCW91dCBzZXQgaXQgYW55d2F5LiAoTm90ZTogc2hvdWxkIGNoYW5nZSBhbGwgdXNlcyBvZiAke1BXRD1gcHdkYH0KLQl0byBqdXN0ICR7UFdEfSB0byBhdm9pZCBjb25mdXNpb24uKQotCi1UdWUgU2VwIDE1IDE2OjAwOjU0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhbHdheXMgc2V0ICQodG9vbGRpcikgdG8gJChsaWJkaXIpLyQodGFyZ2V0X2FsaWFzKSwKLQlldmVuIGZvciBhIG5hdGl2ZSBjb21waWxhdGlvbi4KLQotVHVlIFNlcCAxNSAwMjoyMjo1NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gbWFrZSB0aGUgZ2RiLnRhci5aIHJ1bGUgd29yayBiZXR0ZXIuCi0KLQkqIE1ha2VmaWxlLmluIChHREJfU1VQUE9SVF9ESVJTKTogIEFkZCBvcGNvZGVzLgotCShERVZPX1NVUFBPUlQpOiAgQWRkIGNvbmZpZ3VyZS50ZXhpLgotCShiZmQtaWxydC50YXIuWik6ICBSZW1vdmUgYW5jaWVudCBydWxlLgotCi1UaHUgU2VwIDEwIDEwOjQzOjE5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1JIGZvciBuZXdsaWIvdGFyZy1pbmNsdWRlIHRvIFhUUkFGTEFHUywgdG8KLQlwaWNrIHVwIHRoZSBtYWNoaW5lIGFuZCBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5zdWI6IGFkZGVkIG5ldyB0YXJnZXQgbTY4MDEwLWFkb2JlLXNjb3V0LAotCXdpdGggYWxpYXMgb2YgYWRvYmU2OGsuICBDaGFuZ2VkIGNvbmZpZ3VyZS5pbiB0byBjaGVjayBmb3IKLQktc2NvdXQgYmVmb3JlIC1zY28qIHRvIGF2b2lkIGEgZmFsc2UgbWF0Y2guCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBBU19GT1JfVEFSR0VULCBwYXNzZWQgZG93biBpbgotCVRBUkdFVF9GTEFHU19UT19QQVNTLiAgQWRkZWQgQ0NfRk9SX0JVSUxELCB3aGljaCBpcyBpbnRlbmRlZCB0byBiZQotCXRoZSBDIGNvbXBpbGVyIHRvIHVzZSB0byBjcmVhdGUgcHJvZ3JhbXMgd2hpY2ggYXJlIHJ1biBpbiB0aGUKLQlidWlsZCBlbnZpcm9ubWVudCwgc2V0IGl0IHRvIGRlZmF1bHQgdG8gJChDQyksIGFuZCBwYXNzZWQgaXQgZG93bgotCWluIEZMQUdTX1RPX1BBU1MgYW5kIFRBUkdFVF9GTEFHU19UT19QQVNTLgotCi1XZWQgU2VwICA5IDEyOjIxOjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIFRBUkdFVF9GTEFHU19UT19QQVNTLCBDQ19GT1JfVEFSR0VULAotCUFSX0ZPUl9UQVJHRVQsIFJBTkxJQl9GT1JfVEFSR0VULCBOTV9GT1JfVEFSR0VULiAgUGFzcwotCVRBUkdFVF9GTEFHU19UT19QQVNTLCB3aGljaCBkZWZpbmVzIENDLCBBUiwgUkFOTElCIGFuZCBOTSBhcyB0aGUKLQlGT1JfVEFSR0VUIHZhcmlhbnRzLCB0byBuZXdsaWIgYW5kIGxpYmcrKy4KLQotVHVlIFNlcCAgOCAxNzoyODozMCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2FzLCBhbGwtZ2RiKTogUmVxdWlyZSBhbGwtb3Bjb2RlcyB0byBiZSBidWlsdAotCWZpcnN0LgotCi1XZWQgU2VwICAyIDAyOjUwOjA1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWNjZXB0IGBlbGYnIGFzIGFuIGVudmlyb25tZW50LgotCi1UdWUgU2VwICAxIDE1OjQ4OjMwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLW9wY29kZXMpOiAgY2QgaW50byB0aGUgcmlnaHQgZGlyZWN0b3J5Ci0KLVN1biBBdWcgMzAgMjE6MTI6MTEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZGVkIC1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIG9wdGlvbiwgdXNlZCBhcwotCWFyZ3VtZW50IHRvIHNlZCB3aGVuIGluc3RhbGxpbmcgcHJvZ3JhbXMuCi0JY29uZmlndXJlLnRleGk6IGFkZGVkIGRvY3VtZW50YXRpb24gZm9yIC1wcm9ncmFtX3ByZWZpeCwKLQktcHJvZ3JhbV9zdWZmaXggYW5kIC1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lLgotCi1UaHUgQXVnIDI3IDIxOjU5OjQ0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWNjZXB0IGk0ODYgd2hlcmUgaTM4NiBvay4KLQotVGh1IEF1ZyAyNyAxMzowNDo0MiAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogYWNjZXB0IHdlMzJrCi0KLU1vbiBBdWcgMjQgMTQ6MDU6MTQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0gCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBhY2NlcHQgT1NFNjgwMDAgYW5kIE9TRTY4ay4KLQotCSogTWFrZWZpbGUuaW46IGRvbid0IGNyZWF0ZSBhbGwgZGlyZWN0b3JpZXMgZm9yIGBgbWFrZSBpbnN0YWxsJyc7Ci0JbGV0IHRoZSBzdWJkaXJlY3RvcmllcyBjcmVhdGUgdGhlIG9uZXMgdGhleSBuZWVkLgotCi1UdWUgQXVnIDExIDIzOjEzOjE3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotICAgICAgICAqIENPUFlJTkc6IG5ldyBmaWxlLCBHUEwgdjIKLQotVHVlIEF1ZyAgNCAwMToxMjo0MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgdGhlIG5ldyBnZW4taW5mby1kaXIsIHdoaWNoIG5lZWRzIGEgdGVtcGxhdGUKLQlhcmd1bWVudCAod2hpY2ggYWxzbyBsaXZlcyBpbiB0ZXhpbmZvKQotCi0JKiBjb25maWd1cmUudGV4aSwgc3RhbmRhcmRzLnRleGk6IGZpeCBJTkZPLURJUi1FTlRSWQotCi1Nb24gQXVnICAzIDE1OjQxOjI4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXNvbGFyaXM6IHJlbW92ZWQgdGhlIC14cyBmcm9tIENGTEFHUyAobGV0IHRoZSBwZW9wbGUKLQl3aXRoIFN1bidzIEMgY29tcGlsZXIgZGVhbCB3aXRoIGl0IHRoZW1zZWx2ZWQpCi0KLU1vbiBBdWcgIDMgMDA6MzQ6MTcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKG5jcjMwMDApOiAgQ2hhbmdlIGkzODYgdG8gaTQ4Ni4KLQotVGh1IEp1bCAyMyAwMDoxMjoxNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbC1yY3MsIGluc3RhbGwtZ3JlcCB0bwotCWluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcywgcmVtb3ZlZCBpbnN0YWxsLWJpc29uIGFuZCBpbnN0YWxsLWxpYmdjYwotCi1UdWUgSnVsIDIxIDAxOjAxOjUwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZ3JhYiB0aGUgSFBVWCBtYWtlZmlsZSBmcmFnbWVudCBpZiBvbiBIUFVYCi0KLU1vbiBKdWwgMjAgMTE6MDI6MDkgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZXJhZGljYXRlIGJpc29uIHNwb29yIChkaXR0byBsaWJnY2MpLgotCSBjb25maWd1cmUuaW46IHJlY29nbmlzZSBtNjh7aywwMDB9LWVyaWNzc29uLU9TRS4KLQkgZXMxODAwIGlzIGFsaWFzIGZvciBtNjhrLWVyaWNzc29uLU9TRQotCi1TdW4gSnVsIDE5IDE3OjQ5OjAyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWFycmFuZ2UgdGhlIHBhcnRzIHRoYXQgcmVtb3ZlIHByb2dyYW1zIGZyb20KLQljb25maWdkaXJzLCBiYXNlZCBub3cgb24gSE9TVD09VEFSR0VUIG9yIGJ5IGNhbm9uaWNhbCB0cmlwbGUuCi0KLUZyaSBKdWwgMTcgMjI6NTI6NDkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiByZWN1cnNlIGV4cGxpY2l0bHkgd2l0aCAtZiB0ZXN0LWJ1aWxkLm1rIHdoZW4KLQkgIGFwcHJvcHJpYXRlLiAgcHJlZGljYXRlIHN0YWdlMyBhbmQgY29tcGFyaXNvbiBvbiB0aGUgZXhpc3RlbmNlCi0JICBvZiBnY2MuICBUaGF0IGlzLCBpZiBnY2MgaXNuJ3QgYXJvdW5kLCB3ZSBhcmVuJ3QgdGhyZWUtc3RhZ2luZy4KLQkgIE9uIHZlcnkgY2xlYW4sIGFsc28gcmVtb3ZlIC4uLnN0YW1wLWNvLiAgQnVpbGQgaW4tcGxhY2UgYmVmb3JlCi0JICBkb2luZyBvdGhlciBidWlsZHMuCi0KLVRodSBKdWwgMTYgMTg6MzM6MDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IGFkZCB0Z2FzCi0KLVRodSBKdWwgMTYgMTY6MDU6MjggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYSBudW1iZXIgb2YgY2hhbmdlcyBtZXJnZWQgaW4gZnJvbSBwcm9ncmVzc2l2ZS4KLQotCSogY29uZmlndXJlLmluOiBhZGQgbGlibS4KLQotCSogLmN2c2lnbm9yZTogaWdub3JlIHNvbWUgc3R1ZmYgdGhhdCBjb21lcyBmcm9tIHRlc3QtYnVpbGQubWsuCi0KLVdlZCBKdWwgIDggMDA6MDE6MzAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXNvbGFyaXM6ICBVc2UgLXhzIHdoZW4gY29tcGlsaW5nIHNvIHRoYXQgU3VuLUMgcHV0cwotCWEgc3ltYm9sLXRhYmxlIGludG8gdGhlIGV4ZWN1dGFibGUuCi0KLVR1ZSBKdWwgIDcgMDA6MjQ6NTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgZXMxODAwIChtNjhrLWVyaWNzc29uLWVzMTgwMCkuCi0KLVR1ZSBKdW4gMzAgMjA6MjQ6NDEgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFkZCBwcm9ncmFtX3N1ZmZpeCAocGFyYWxsZWwgdG8gcHJvZ3JhbV9wcmVmaXgpCi0JKiBNYWtlZmlsZS5pbjogYWRqdXN0IGRpcmVjdG9yeS1jcmVhdGluZyBzY3JpcHQgZm9yIGxvc2luZyBkZWNzdGF0aW9uCi0KLU1vbiBKdW4gMjIgMjM6NDM6NDggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIE1pbm9yICRzdWJkaXItcmVsYXRlZCBmaXhlcy4KLQotTW9uIEp1biAyMiAxODozMDoyNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBmaXggdmFyaW91cyBwcm9ibGVtcyB3aXRoIHByb3BvZ2F0aW5nCi0JbWFrZWZpbGVfdGFyZ2V0X2ZyYWcgaW4gc3ViZGlycy4KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlnIGxpYmdjYyBpZiBpdHMgdGhlcmUKLQotRnJpIEp1biAxOSAxNToxOTo0MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgSFBQQSBtZXJnZS4KLQotTW9uIEp1biAxNSAxMjozMTo1MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDAgKElOU1RBTEwpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQgaXMgYnJva2VuIG9uIG5jciAzMDAwJ3MuCi0KLVN1biBKdW4gMTQgMTA6Mjk6MTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVwbGFjZSBhbGwtYmlzb24gd2l0aCBhbGwtYnlhY2MgaW4gYWxsCi0JZGVwZW5kZW5jeSBsaW5lcyBmb3Igb3RoZXIgdG9vbHMgKHdoaWNoIG5vdyB1c2UgYnlhY2MpLgotCi1GcmkgSnVuIDEyIDIyOjIxOjU3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWRkIHN1bjRzb2wyID0+IHNwYXJjLXN1bi1zb2xhcmlzMi4KLQotVHVlIEp1biAgOSAxNzoxODoxMSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3ttaC1uY3IzMDAwLCBtaC1zeXN2NH06ICBBZGQgSU5TVEFMTC4KLQotVGh1IEp1biAgNCAxMjowNzozMiAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFrZSBncHJvZiBydWxlcyBzaW1pbGFyIHRvIGJ5YWNjIHJ1bGVzIChpbnN0ZWFkIG9mCi0JdmVzdGlnYWwgJCh1bnN1YmRpcikgdGhhdCBkaWRuJ3Qgd29yay4uLikKLQotVGh1IEp1biAgNCAwMDozNzowNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgc3VwcG9ydCBmb3IgTGludXguCi0JKiBNYWtlZmlsZS5pbjogIFVzZSAkKEZMQUdTX1RPX1BBU1MpIG1vcmUgY29uc2lzdGVudGx5Ci0JKGF0IGxlYXN0IGZvciBsaWJnKyspLgotCi1UdWUgSnVuIDAyIDIwOjAzOjAwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBmaXggZG9jIGZvciB0aGUgLW5mcCBvcHRpb24gdG8gY29uZmlndXJlCi0KLVR1ZSBKdW4gIDIgMTc6MjA6NTIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWJpbnV0aWxzKTogYXIgbmVlZHMgZmxleCwgc28gZGVwZW5kIG9uIGFsbC1mbGV4LgotCi1TdW4gTWF5IDMxIDE1OjA0OjA4IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGNoYW5nZWQgW14tXSsgdG8gW14tXVteLV0qIHNvIHRoYXQgaXQgd29ya3MgdW5kZXIKLQlTdW4gc2VkLiAoQlNEIDQuMyBzZWQgZG9lc24ndCBoYW5kbGUgW14tXSsgZWl0aGVyLikKLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgc29sYXJpcyogaG9zdF9tYWtlZmlsZV9mcmFnIGhvb2suCi0KLVN1biBNYXkgMzEgMDE6MTA6MzQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBjaGFuZ2VkIHJlY29nbml0aW9uIG9mIG02ODAwMCBzbyB0aGF0IHZhcmlvdXMKLQltNjhrIHR5cGVzIGNhbiBiZSBzcGVjaWZpZWQgdmlhIG02ODBbMDEyMzRdMAotCi1TYXQgTWF5IDMwIDIxOjAxOjA2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IGZpeCBzZWQgc28gdGhhdCAnLWZvbycgaXNuJ3QKLQljb21wbGV0ZWx5IHN1YnN0aXR1dGVkIG91dCB3aGlsZSAuKyctZm9vJyBsb3NlcyB0aGUgJy1mb28nCi0KLVdlZCBNYXkgMjcgMjM6MTg6NTIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoJG9zKTogQWRkIC1hb3V0LgotCi1GcmkgTWF5IDIyIDE0OjAwOjAyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBJZiBob3N0X21ha2VmaWxlX2ZyYWcgaXMgYWJzb2x1dGUsIGRvbid0Ci0JcHJlZml4ICR7aW52c3ViZGlyfSAocmVsZXZhbnQgdG8gbGliZysrIGF1dG8tY29uZmlndXJlKS4KLQotVGh1IE1heSAyMSAxODowMDowOSAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodG9vbGRpcik6IERlZmluZSBpdC4KLQkoYWxsLWxkKTogRGVwZW5kIG9uIGFsbC1mbGV4LgotCi1TdW4gTWF5IDEwIDIxOjQ1OjU5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogIEZpeCBsaWJnKysgc3BlY2lhbCBjYXNlLgotCi1GcmkgTWF5ICA4IDA4OjMxOjQxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGRvIG5vdCBidXJ5IGBwd2RgIGludG8gY29uZmlnLnN0YXR1cywgdGh1cyBkbyBmZXdlcgotCSAgcHdkJ3MuCi0KLQkqIGNvbmZpZ3VyZTogcHJpbnQgdGhlICJCdWlsZGluZyBpbiIgbWVzc2FnZSBvbmx5IHdoZW4gYnVpbGRpbmcgaW4KLQkgIG90aGVyIHRoYW4gIi4iIEFORCB2ZXJib3NlLgotCi0JKiBjb25maWd1cmU6IHJlbW92ZSAtcywgcmV3b3JrIC12IHRvIGJldHRlciBhY2NvbW9kYXRlIGd1ZXN0ZWQKLQkgIGNvbmZpZ3VyZXMuCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiB1cGRhdGVkIHRvIDMgbWF5LCBmaXhlZCBsaWJyaWQgPC0+IGxpYmRpciB0eXBvLgotCi1GcmkgTWF5ICAxIDE4OjAwOjUwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFjcm9pemUgZmxhZ3MgcGFzc2VkIG9uIHJlY3Vyc2lvbi4gIHJlbW92ZQotCSAgZmlsZXV0aWxzLgotCi1UaHUgQXByIDMwIDA4OjU2OjIwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGdldCBtYWtlc3JjZGlyIHJpZ2h0IGZvciBzdWJkaXJzIGRlZXBlciB0aGFuIDEuCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIElOU1RBTEwsIElOU1RBTExfREFUQSwgSU5TVEFMTF9QUk9HUkFNIG9uCi0JICBpbnN0YWxsLgotCi1GcmkgQXByIDI0IDE1OjUxOjUxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZG9uJ3QgcHJpbnQgc3ViZGlyX2RvIG9yIHJlY3Vyc2lvbiBsaW5lcy4KLQotRnJpIEFwciAyNCAxNToyMjowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IGFkZGVkIG1lbnUgaXRlbS4KLQotCSogTWFrZWZpbGUuaW46IGJ1aWxkIGFuZCBpbnN0YWxsIHN0YW5kYXJkcy5pbmZvLgotCi0JKiBzdGFuZGFyZHMudGV4aTogbmV3IGZpbGUuCi0KLVdlZCBBcHIgMjIgMTg6MDY6NTUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHRlc3QgZm9yIGFuZCBtb3ZlIGNvbmZpZy5zdGF0dXMgcGllY2VzIGZyb20KLQkgICR7c3ViZGlyfS8uCi0KLVdlZCBBcHIgMjIgMTQ6Mzg6MzQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1kZWx0YTg4LCBjb25maWcvbWgtbmNyMzAwMDogIFJlcGxhY2UgTUlOVVNfRyB3aXRoCi0JQ0ZMQUdTIHBlciBuZXcgY29uZmlndXJhdGlvbiBzdHJhdGVneS4KLQkqIGNvbmZpZ3VyZTogIFRlc3QgZm9yIGV4aXN0YW5jZSBvZiBmaWxlcyBiZWZvcmUgdHJ5aW5nIHRvIG12Ci0JdGhlbSwgdG8gYXZvaWQgbnVtZXJvdXMgbm9uLWV4aXN0YW5jZSBtZXNzYWdlcy4KLQotVHVlIEFwciAyMSAxMjozMTozMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBjb3JyZWN0IGZpbmFsIGxpbmUgb2YgY29uZmlnLnN0YXR1cy4KLQotCSogY29uZmlndXJlOiBwYXRjaCBmcm9tIGVnZ2VydC4gIEF2b2lkcyBhIHByb3RlY3Rpb24gcHJvYmxlbSBpZgotCSAgdGhlIG9yaWdpbmFsIE1ha2VmaWxlLmluIGlzIHJlYWQgb25seS4KLQotCSogY29uZmlndXJlOiB1c2UgbW92ZS1pZi1jaGFuZ2UgZnJvbSBnY2MgdG8gY3JlYXRlIGNvbmZpZy5zdGF0dXMuCi0JICBTb21lIG1ha2VmaWxlcyBkZXBlbmQgb24gY29uZmlnLnN0YXR1cyB0byB0ZWxsIGlmIGEgZGlyZWN0b3J5Ci0JICBoYXMgYmVlbiByZWNvbmZpZ3VyZWQgZm9yIGEgZGlmZmVyZW50IGhvc3QuICBUaGlzIGNoYW5nZQotCSAgcHJldmVudHMgdGhvc2UgZGlyZWN0b3JpZXMgZnJvbSByZW1ha2luZyBldmVyeXRoaW5nIGluIHRoZSBjYXNlCi0JICB3aGVyZSB0aGUgcmVjb25maWcgd2FzIG9ubHkgaW50ZW5kZWQgdG8gcmVidWlsZCBhIE1ha2VmaWxlLgotCi0JKiBjb25maWd1cmU6IHRlc3QgZm9yIGNvbmZpZy5zdWIgd2l0aCAiY29uZmlnLnN1YiBzdW40IiByYXRoZXIKLQkgIHRoYW4gImNvbmZpZy5zdWIgJHtob3N0X2FsaWFzfSIuICBPdGhlcndpc2Ugd2UgY2FuJ3QgdGVsbCBhIGJhZAotCSAgaG9zdCBhbGlhcyBmcm9tIGEgbWlzc2luZyBjb25maWcuc3ViLgotCi1Nb24gQXByIDIwIDE4OjE2OjM2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGV4cGxpY2l0bHkgcGFzcyBDRkxBR1Mgb24gcmVjdXJzaW9uLiBubyBsb25nZXIgcGFzcwotCSAgTUlOVVNfRyAodGhpcyBjYW4gYmUgZG9uZSB3aXRoIENGTEFHUykuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotRnJpIEFwciAxNyAxODoyNzo1MSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBta2RpciAke3N1YmRpcn0gYXMgbmVlZGVkLgotCi1XZWQgQXByIDE1IDE3OjM3OjIyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbixjb25maWd1cmUuaW46IGFkZGVkIGF1dG9jb25mLgotCi1XZWQgQXByIDE1IDE3OjI3OjM0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG5vIGxvbmdlciBwYXNzIGFnYWluc3Qgb24gcmVjdXJzaW9uLgotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLk5PRVhQT1JUOiBzbyB0aGF0IHN0cmF5IG1ha2VmaWxlX2ZyYWcKLQkgIGRlZmluaXRpb25zIGFyZSBub3QgaW5oZXJpdGVkLgotCi0JKiBjb25maWd1cmU6IGNvcnJlY3QgbWFrZXNyY2RpciB3aGVuIHN1YmRpciBpcyAuCi0KLVR1ZSBBcHIgMTQgMTE6NTY6MDkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIEFkZCBzdXBwb3J0IGZvciAnc3ViZGlycycgdmFyaWFibGUsIHdoaWNoIGlzCi0JbGlrZSAnY29uZmlnZGlycycsIGV4Y2VwdCB0aGF0IGNvbmZpZ3VyZSBkb2Vzbid0IHJlLWludm9rZQotCWl0c2VsZiBmb3Igc3ViZGlycywgaXQganVzdCBjcmVhdGVzIGEgTWFrZWZpbGUgZm9yIGVhY2ggc3ViZGlyLgotCSogY29uZmlndXJlLnRleGk6ICBEb2N1bWVudCBzdWJkaXJzLgotCi1Nb24gQXByIDEzIDE4OjUwOjE2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGRlZCBmbGV4IHRvIGNvbmZpZ2RpcnMKLQotTW9uIEFwciAxMyAxODo0Mzo1NSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBjbGVhbi1zdGFtcHMgZnJvbSBjbGVhbi4KLQotU2F0IEFwciAxMSAwMzo1MjowMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIGdkYnRlc3QgdG8gY29uZmlnZGlycy4KLQotRnJpIEFwciAxMCAyMzoxMTo0OSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1JTlVTX0cpOiAgQWRkIG1hY3JvLCBkZWZhdWx0IHRvIC1nLCBwYXNzIG9uCi0JdG8gcmVjdXJzaXZlIG1ha2VzLgotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5ldyBuY3IzMDAwIGNvbmZpZy4KLQotV2VkIEFwciAgOCAyMzowODoxMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCByZWZlcmVuY2VzIHRvIGdkYm0uCi0KLVR1ZSBBcHIgIDcgMTY6NDg6MjAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBEb24ndCBjYW5vbmljYWxpemUgb3MgdmFsdWUKLQluZXdzb3MqIHRvIGJzZCAocmVhZGxpbmUgbmVlZHMgdG8gY2hlY2sgZm9yIG5ld3NvcykuCi0JKFRoaXMgZml4IHdhcyBlYXJsaWVyIG1hZGUgSmFuIDMxLCBidXQgZ290IHJlLWJyb2tlbi4pCi0KLU1vbiBBcHIgIDYgMTQ6MzQ6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgc2NvIGlzIGFuIG9zLCBub3QgYSB2ZW5kb3IhCi0KLQkqIGNvbmZpZ3VyZTogIFF1b3RlICQoIGJldHRlci4gIEtlZXAgdmFyaW91cyBzaGVsbHMgaGFwcHkuCi0KLVR1ZSBNYXIgMzEgMTY6MzI6NTcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBlbGltaW5hdGUgc3RhbXAtZmlsZXMuCi0KLU1vbiBNYXIgMzAgMjI6MjA6MjMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgc2VuZF9wci4gIHJlbW92ZSAiZm9yY2UiIGZyb20gLnN0bXAtZ3Byb2YgcnVsZS4KLQkgIFN1cHJlc3MgZWNob2luZyBvZiBhbGwgdGhlICJpZiBbIC1kIC4uLiAkKE1BS0UpIiBsaW5lcy4KLQotV2VkIE1hciAyNSAxNToyMDowNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgZml4IGlyaXMvaXJpczMuCi0KLVdlZCBNYXIgMjUgMTA6MzQ6MTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogcmUtYWRkIC1ybS4KLQotVHVlIE1hciAyNCAyMzo1MDoxNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFza2VmaWxlLmluOiBhZGQgLnN0bXAtcmNzIHRvIGFsbC4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgZ2FzIGZyb20gcnM2MDAwIGJ1aWxkLCB1c2UgYWl4IGhvc3QgZnJhZ21lbnQuCi0KLU1vbiBNYXIgMjMgMTk6NDM6MzUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogcGFzcyBkb3duIHNpdGVfb3B0aW9uIGR1cmluZyByZWN1cnNpb24uCi0KLVRodSBNYXIgMTkgMTY6NDk6MzYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC5jcm9zcyk6ICBBZGQgLnN0bXAtYmZkIC5zdG1wLXJlYWRsaW5lLgotCi1XZWQgTWFyIDE4IDE1OjI5OjMzIDE5OTIgIE1pa2UgU3R1bXAgIChtcnNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBDaGFuZ2UgZXhlY19wcmVmaXggc28gdGhhdCBpdCByZWFsbHkgZGVmYXVsdHMgdG8gcHJlZml4LgotCi1TYXQgTWFyIDE0IDE3OjIwOjM4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiAgQWRkIHN1cHBvcnQgZm9yIG1tYWxsb2MgbGlicmFyeS4KLQotRnJpIE1hciAxMyAxODo0NDoxOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBzdG1wIGRlcGVuZGVuY2llcyBmb3IgYSBmZXcgbW9yZSB0aGluZ3MuCi0KLVRodSBNYXIgMTIgMDQ6NTY6MjQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRqdXN0ZWQgZXJyb3IgbWVzc2FnZSBvbiBvYmpkaXIvc3JjZGlyIGNvbmZpZ3VyZQotCSAgY29sbGlzaW9uLCBwZXIgam9obidzIHN1Z2dlc3Rpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgbGliaWJlcnR5IHN0bXAgdG8gYWxsIGFuZCBhbGwuY3Jvc3MuCi0KLVdlZCBNYXIgMTEgMDI6MDc6NTIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgZm9yY2UgZGVwZW5kZW5jaWVzLCBhZGQgZ3JlcCB0byBhbGwuCi0KLVR1ZSBNYXIgMTAgMjE6NDk6MTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQG1hcnMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRyb3AgZmxleC4gIG1ha2Ugc3RhbXAgZmlsZXMgd29yay4KLQotCSogY29uZmlndXJlOiBhZGRlZCB0ZXN0IGZvciBjb25mbGljdGluZyBjb25maWd1cmF0aW9uIGluIHNyY2RpciwKLQkgIHJlbW92ZSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLiAgT3RoZXJ3aXNlIGVtYWNzIGdkYiBtb2RlCi0JICBnZXRzIGNyYW5reS4gIHVzZSByZWxhdGl2ZSBwYXRocyBmb3IgY29uZmlndXJlIGFuZCBzcmNkaXIKLQkgIHdoZW5ldmVyIHBvc3NpYmxlLiAgU2VuZCBzb21lIGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVyciB0aGF0IHdlcmUKLQkgIGdvaW5nIHRvIHN0ZG91dC4KLQotVHVlIE1hciAxMCAxODowMTo1NSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBGaXggbGliZysrIHJ1bGUgdG8gY2hlY2sgZm9yIGdjYyBkaXJlY3RvcnkKLQliZWZvcmUgdXNpbmcgZ2NjL2djYy4gIEFsc28gcGFzcyBYVFJBRkxBR1MuCi0KLVRodSBNYXIgIDUgMjE6NDU6MDcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN0bXAtZmlsZXMgc28gdGhhdCBkaXJlY3RvcmllcyBhcmVuJ3QgcG9sbGVkCi0JICB3aGVuIHRoZXkgYXJlIGFscmVhZHkgYnVpbHQuCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBmaXhlZCBhIG5vZGUgcG9pbnRlciBwcm9ibGVtLgotCi1UaHUgTWFyICA1IDEyOjA1OjU4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgY29uZmlndXJlLmluIGNvbmZpZy9taC1pcml4NCBnZGIvY29uZmlndXJlLmluCi0JZ2RiL21pcHMtdGRlcC5jIGdkYi9taXBzcmVhZC5jIGdkYi9wcm9jZnMuYyBnZGIvc2lnbmFtZS5oCi0JZ2RiL3RtLWlyaXgzLmggZ2RiL3RtLW1pcHMuaCBnZGIveG0taXJpeDQuaCBnZGIvY29uZmlnL210LWlyaXgzCi0JZ2RiL2NvbmZpZy9taC1pcml4NCB0ZXhpbmZvL2NvbmZpZ3VyZS5pbjogIFBvcnQgdG8gU0dJIElyaXgtNC54LgotCi1XZWQgTWFyICA0IDAyOjU3OjQ2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAtcmVjdXJyaW5nIGJlY29tZXMgLXNpbGVudC4gIGNvcnJlY3RlZCBoZWxwIG1lc3NhZ2UKLQkgIGZvciAtc2l0ZT0gb3B0aW9uLgotCi0JKiBNYWtlZmlsZS5pbjogbWtkaXIgJChleGVjX3ByZWZpeCkgYW5kICQodG9vbGRpcikuCi0KLVR1ZSBNYXIgIDMgMTQ6NTE6MjEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHdoZW4gYnVpbGRpbmcgTWFrZWZpbGUgZm9yIGNyb3NzZXMsIHJlcGxhY2UKLQkgIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LiAgZGVmYXVsdCBzcmNkaXIgZnJvbSBsb2NhdGlvbiBvZgotCSAgY29uZmlnLnN1Yi4gIHJlbW92ZSAiZm9yIGhvc3QgaW4gaG9zdHMiIGFuZCAiZm9yIHRhcmdldCBpbgotCSAgdGFyZ2V0cyIgbG9vcHMuCi0KLVdlZCBGZWIgMjYgMTk6NDg6MjUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRG8gbm90IHBhc3MgYmluZGlyIG9yIG1hbmRpciB0byBjdnMuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi0JKiBjb25maWd1cmUudGV4aTogcmVtb3ZlIG1vc3QgcmVmZXJlbmNlcyB0byBtdWx0aXBsZSBob3N0cywKLQkgIG11bHRpcGxlIHRhcmdldHMsIHN1YmRpcnMsIGV0Yy4KLQotCSogY29uZmlndXJlLm1hbjogcmVtb3ZlZCByY3NpZC4gcmVmZXJlbmNlIGNvbmZpZy5zdWIgbm90Ci0JICBjb25maWcuc3Vici4KLQotCSogTWFrZWZpbGUuaW46IG1rZGlyICQoaW5mb2Rpcikgb24gaW5zdGFsbC1pbmZvLgotCi1XZWQgRmViIDE5IDE1OjQxOjEzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUudGV4aTogIEV4cGxhaW4gYmV0dGVyIGFib3V0IC5nZGJpbml0IGFuZCBhYm91dAotCXRoZSBlbnZpcm9ubWVudCB0aGF0IGNvbmZpZ3VyZS5pbiBzZWN0aW9ucyBydW4gaW4uCi0KLUZyaSBGZWIgIDcgMDc6NTU6MDAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVsdHJpeCBpcyBvbmx5IGEgZGVjc3RhdGlvbiBpZiBpdCdzIGEgTUlQUy4KLQotRnJpIEphbiAzMSAyMTo1NDo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgRE9DLmNvbmZpZ3VyZSA9PiBjZmctcGFwZXIudGV4aS4KLQotRnJpIEphbiAzMSAyMTo0ODoxOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChuZWFyIGNhc2UgJG9zKTogIERvbid0IGNvbnZlcnQgbmV3c29zKiB0byBic2QhCi0KLUZyaSBKYW4gMzEgMDI6Mjc6MzIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVpbnN0YWxsIGNoYW5nZSBmcm9tIGdkYi00LjMgdGhhdCByZWR1Y2VzCi0JdGhlIG51bWJlciBvZiBjb3BpZXMgb2YgQ09QWUlORyB0aGF0IGdvIGludG8gdGhlIEdEQiB0YXIgZmlsZS4KLQotVGh1IEphbiAzMCAxNjoxNzozMCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQvY29uZmlndXJlLmluLCBjb25maWcvbWgtc2NvLCBnZGIvY29uZmlnL21oLWkzODZzY28sCi0JZ2RiL2NvbmZpZy9tdC1pMzg2djMyLCBnZGIvY29uZmlndXJlLmluLCByZWFkbGluZS9jb25maWd1cmUuaW46Ci0JRml4IFNDTyBjb25maWd1cmF0aW9uIHN0dWZmLgotCi1UdWUgSmFuIDI4IDIzOjUxOjA3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEZvciBsaWJnKyssIG1ha2Ugc3VyZSB0aGUgLUkgcG9pbnRpbmcKLQl0byB0aGUgZ2NjIGRpcmVjdG9yeSBnb2VzICphZnRlciogYWxsIHRoZSBsaWJnKystbG9jYWwgLUkgZmxhZ3MuCi0JQWxzbywgbW92ZSBqdXN0LWdjYyBkZXBlbmRlbmN5IGZyb20ganVzdC1saWJnKysgdG8gYWxsLWxpYmcrKy4KLQotVHVlIEphbiAyOCAxMjo1NjoyNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICBDaGFuZ2UgLXggdG8gLWYgdG8ga2VlcCBVbHRyaXggL2Jpbi90ZXN0IGhhcHB5LgotCi1TYXQgSmFuIDE4IDE3OjQ1OjExIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBSZW1vdmUgdGV4aW5mbyB0YXJnZXRzLgotCi1TYXQgSmFuIDE4IDE3OjAzOjIxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgQWRkIHN0cmF0dXMgY29uZmlndXJhdGlvbiBmcmFncy4gIEFsc28KLQlzdWJtaXR0ZWQgdG8gRlNGLgotCi1TYXQgSmFuIDE4IDE1OjM1OjI5IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChERVZfU1VQUE9SVCk6ICBhZGQgY29uZmlndXJlLm1hbi4KLQotCSogY29uZmlnLnN1YihEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljKTogIGFkZCAtbm9uZSouCi0KLUZyaSBKYW4gMTcgMTc6NTg6MDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICByZW1vdmUgZm9ybSBmZWVkcyB0byBtYWtlIFN1bidzIG1ha2UgaGFwcHkuCi0JKERFVk9fU1VQUE9SVCk6ICBET0MuY29uZmlndXJlID0+IGNmZy1wYXBlci50ZXhpLgotCi1TYXQgSmFuICA0IDE2OjExOjQ0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQVJfRkxBR1MpOiAgTWFrZSBxdWlldGVyLgotCi1UaHUgSmFuICAyIDIyOjU3OjEyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgbGliZysrLgotCSogY29uZmlndXJlOiAgV2hlbiB2ZXJib3NlLCBkb24ndCBvdXRwdXQgdGhlIGNvbW1hbmQgbGluZSBhdCBlYWNoCi0JbGV2ZWw7IGl0IHdpbGwgYmUgdW5yZW1hcmthYmx5IHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyB2ZXJzaW9uLAotCXdoaWNoIHdpbGwgYmUgdGhlIHNhbWUgYXMgd2hhdCB0aGUgdXNlciB0eXBlZC4KLQotRnJpIERlYyAyNyAxNjoyNjo0NyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogZml4IGNsZWFuLWluZm8sIGFkZCBmbGV4LiAgYWRkCi0JICBmaWxldXRpbHMuCi0KLQkqIGNvbmZpZ3VyZTogYmUgbGVzcyBzZW5zaXRpdmUgdG8gc3BhY2VzIGluIE1ha2VmaWxlLmluLiAgRG8gbm90Ci0JICBsb29rIGZvciBzb3VyY2VzIGluICIuLiIuICBEb2luZyBzbyBicmVha3Mgc3ViZGlyZWN0b3JpZXMgdGhhdAotCSAgbWlnaHQgaGF2ZSB0aGVpciBvd24gY29uZmlndXJlLiAgSWYgYSBzdWJkaXIgaGFzIGl0J3Mgb3duCi0JICBjb25maWd1cmUgc2NyaXB0LCB1c2UgaXQuCi0KLVRodSBEZWMgMjYgMTY6MzA6MjYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNmZy1wYXBlci50ZXhpOiBzb21lIGNoYW5nZXMgc3VnZ2VzdGVkIGJ5IHJtcy4KLQotVGh1IERlYyAyNiAxMDoxMzozNiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIE1lcmdlIGluIHNvbWUgc21hbGwgYWRkaXRpb25zIGZyb20gdGhlIEZTRiB2ZXJzaW9uLAotCXRha2VuIGZyb20gdGhlIGdjYyBkaXN0cmlidXRpb24sIHRvIGJyaW5nIHRoZSBDeWdudXMgYW5kIEZTRgotCXZlcnNpb25zIGludG8gY2xvc2VyIHN5bmMuCi0KLUZyaSBEZWMgMjAgMTE6MzQ6MTggMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZWQgc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LgotCi1UaHUgRGVjIDE5IDE1OjU0OjI5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZGVkIC1WIGZvciB2ZXJzaW9uIG51bWJlciBvcHRpb24uCi0KLVdlZCBEZWMgMTggMTU6Mzk6MzQgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIERPQy5jb25maWd1cmUsIGNmZy1wYXBlci50ZXhpOiByZXZpc2VkLCB1cGRhdGVkLCBhbmQgdGV4aW5mbydkLgotCSAgcmVuYW1lZCBmcm9tIERPQy5jb25maWd1cmUgdG8gY2ZnLXBhcGVyLnRleGkuCi0KLU1vbiBEZWMgMTYgMjM6MDU6MTkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUsIGNvbmZpZy5zdWJyLCBjb25maWcuc3ViOiBjb25maWcuc3ViciBpcyBub3cKLQkgIGNvbmZpZy5zdWIgYWdhaW4uCi0KLUZyaSBEZWMgMTMgMDE6MTc6MDYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBuZXcgZmlsZSwgaW4gcHJvZ3Jlc3MuCi0KLQkqIE1ha2VmaWxlLmluOiBidWlsZCBpbmZvIGZpbGUgYW5kIGluc3RhbGwgdGhlIG1hbiBwYWdlIGZvcgotCSAgY29uZmlndXJlLgotCi0JKiBjb25maWd1cmUubWFuOiBuZXcgZmlsZSwgZmlyc3QgY3V0LgotCi0JKiBjb25maWd1cmU6IGZpbmQgY29uZmlnLnN1YnIgYWdhaW4gbm93IHRoYXQgY29uZmlndXJhdGlvbiAibm9uZSIKLQkgIGhhcyBnb25lLiAgcmVtb3ZlZCBhbGwgdHJhY2VzIG9mIHRoZSAtYW5zaSBvcHRpb24uICByZW1vdmVkIGFsbAotCSAgdHJhY2VzIG9mIHRoZSAtbGFuZ3VhZ2VzIG9wdGlvbi4KLQotCSogY29uZmlnLnN1YnI6IHJlc3luYyBmcm9tIHJtcy4KLQotV2VkIERlYyAxMSAyMjoyNToyMCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLnN1YiwgY29uZmlnLnN1YnI6IG1lcmdlIGNvbmZpZy5zdWIgaW50bwotCSAgY29uZmlnLnN1YnIsIGNhbGwgdGhlIHJlc3VsdCBjb25maWcuc3ViciwgcmVtb3ZlIGNvbmZpZy5zdWIsIHVzZQotCSAgY29uZmlnLnN1YnIuCi0KLQkqIE1ha2VmaWxlLmluOiByZXZpc2VkIGluc3RhbGwgZm9yIGRpci5pbmZvLgotCi1UdWUgRGVjIDEwIDAwOjA0OjM1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgZGVjc3RhdGlvbiBob3N0IG1ha2VmaWxlIGZyYWcuCi0KLQkqIE1ha2VmaWxlLmluOiBCSVNPTiBub3cgYmlzb24gLXkgYWdhaW4uICBhbHNvIGluc3RhbGwtZ2NjIG9uCi0JICBpbnN0YWxsLiAgY2xlYW4tZ2RibSBvbiBjbGVhbi4gIGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCSAgTWFrZSBkaXJlY3RvcmllcyBmb3IgaW5mbyBpbnN0YWxsLiAgQnVpbGQgZGlyLmluZm8gaGVyZSB0aGVuCi0JICBpbnN0YWxsIGl0LgotCi1Nb24gRGVjICA5IDE2OjQ4OjMzIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCBmb3IgYmFkIGRpcmVjdG9yeSB0ZXN0cy4KLQotU2F0IERlYyAgNyAwMDoxNzowMSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogXHsxLDJcfSBhcHBlYXJzIHRvIGJlIGEgc3lzdidpc20uICBVc2UgYSBkaWZmZXJlbnQKLQkgIHJlZ2V4cC4gIC1zcmNkaXIgcmVsYXRpdmUgd2FzIGJlaW5nIGhhbmRsZWQgaW5jb3JyZWN0bHkuCi0KLQkqIE1ha2VmaWxlLmluOiB1bndyYXBwZWQgc29tZSBmb3IgbG9vcHMgc28gdGhhdCBwYXJhbGxlbCBtYWtlcwotCSAgd29yayBhZ2FpbiBhbmQgc28gb25lIGNhbiBmb2N1cyBvbmUncyBhdHRlbnRpb24gb24gYSBwYXJ0aWN1bGFyCi0JICBwYWNrYWdlLgotCi1GcmkgRGVjICA2IDAwOjIyOjA4IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGRlZCBQV0QgYXMgYSBzdGFuZCBpbiBmb3IgYHB3ZGAgKGZvciBzcGVlZCkuIHVzZQotCSAgZWxpZiB3aGVyZXZlciBwb3NzaWJsZS4gIG1ha2UgLXNyY2RpciB3b3JrIHdpdGhvdXQgLW9iamRpci4KLQkgIC1vYmpkaXI9IGNvbW1lbnRlZCBvdXQuCi0KLVRodSBEZWMgIDUgMjI6NDY6NTIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6ICtvcHRpb25zIGJlY29tZSAtLW9wdGlvbnMuICAtc3ViZGlycyBjb21tZW50ZWQgb3V0LgotCSAgYWRkZWQgLWhvc3QsIC1kYXRhZGlyLiAgUmVuYW1lZCAtZGVzdGRpciB0byAtcHJlZml4LiAgQ29tbWVudCBpbgotCSAgTWFrZWZpbGUgbm93IGF0IHRvcCBvZiBnZW5lcmF0ZWQgTWFrZWZpbGUuICBSZW1vdmVkIGN2cyBsb2cKLQkgIGVudHJpZXMuICBhZGRlZCAtc3JjZGlyLiAgY3JlYXRlIC5nZGJpbml0IG9ubHkgaWYgdGhlcmUgaXMgb25lCi0JICBpbiAke3NyY2Rpcn0uCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLUZyaSBOb3YgMjIgMDc6Mzg6MTEgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBGcmVzaGx5IGNyZWF0ZWQgQ2hhbmdlTG9nLgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc2Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWFiOGJlLi4wMDAwMDAwCi0tLSBhL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTg0OCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBkaXJlY3Rvcnkgd2l0aCBzdWJkaXJzIHRvIGJ1aWxkLgotIyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotCi1zcmNkaXIgPSAuCi0KLXByZWZpeCA9IC91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLWJpbmRpcj0ke2V4ZWNfcHJlZml4fS9iaW4KLXNiaW5kaXI9JHtleGVjX3ByZWZpeH0vc2JpbgotbGliZXhlY2Rpcj0ke2V4ZWNfcHJlZml4fS9saWJleGVjCi1kYXRhZGlyPSR7cHJlZml4fS9zaGFyZQotc3lzY29uZmRpcj0ke3ByZWZpeH0vZXRjCi1zaGFyZWRzdGF0ZWRpcj0ke3ByZWZpeH0vY29tCi1sb2NhbHN0YXRlZGlyPSR7cHJlZml4fS92YXIKLWxpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKLWluY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKLW9sZGluY2x1ZGVkaXI9L3Vzci9pbmNsdWRlCi1pbmZvZGlyPSR7cHJlZml4fS9pbmZvCi1tYW5kaXI9JHtwcmVmaXh9L21hbgotZ3h4X2luY2x1ZGVfZGlyPSR7aW5jbHVkZWRpcn0vZysrCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldCkKLQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9Ci0KLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotbWFuMmRpciA9ICQobWFuZGlyKS9tYW4yCi1tYW4zZGlyID0gJChtYW5kaXIpL21hbjMKLW1hbjRkaXIgPSAkKG1hbmRpcikvbWFuNAotbWFuNWRpciA9ICQobWFuZGlyKS9tYW41Ci1tYW42ZGlyID0gJChtYW5kaXIpL21hbjYKLW1hbjdkaXIgPSAkKG1hbmRpcikvbWFuNwotbWFuOGRpciA9ICQobWFuZGlyKS9tYW44Ci1tYW45ZGlyID0gJChtYW5kaXIpL21hbjkKLWluZm9kaXIgPSAkKHByZWZpeCkvaW5mbwotaW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCi0jIERpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIgZmluZHMgZXhlY3V0YWJsZXMsIGxpYnJhcmllcywgZXRjLgotbGlic3ViZGlyID0gJChsaWJkaXIpL2djYy1saWIvJCh0YXJnZXRfYWxpYXMpLyQoZ2NjX3ZlcnNpb24pCi1HREJfTkxNX0RFUFMgPSAKLQotU0hFTEwgPSAvYmluL3NoCi0KLSMgSU5TVEFMTF9QUk9HUkFNX0FSR1MgaXMgY2hhbmdlZCBieSBjb25maWd1cmUuaW4gdG8gdXNlIC14IGZvciBhCi0jIGN5Z3dpbiBob3N0LgotSU5TVEFMTF9QUk9HUkFNX0FSR1MgPQotCi1JTlNUQUxMID0gJChTSEVMTCkgJCRzL2luc3RhbGwtc2ggLWMKLUlOU1RBTExfUFJPR1JBTSA9ICQoSU5TVEFMTCkgJChJTlNUQUxMX1BST0dSQU1fQVJHUykKLUlOU1RBTExfU0NSSVBUID0gJChJTlNUQUxMKQotSU5TVEFMTF9EQVRBID0gJChJTlNUQUxMKSAtbSA2NDQKLQotSU5TVEFMTF9ET1NSRUwgPSBpbnN0YWxsLWRvc3JlbC1mYWtlCi0KLUFTID0gYXMKLUFSID0gYXIKLUFSX0ZMQUdTID0gcmMKLUNDID0gY2MKLQotIyBTcGVjaWFsIHZhcmlhYmxlcyBwYXNzZWQgZG93biBpbiBFWFRSQV9HQ0NfRkxBR1MuICBUaGV5IGFyZSBkZWZpbmVkCi0jIGhlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGJ5IE1ha2VmaWxlIGZyYWdtZW50cy4KLUhPU1RfQ0MgPSAkKENDX0ZPUl9CVUlMRCkKLUhPU1RfUFJFRklYID0gCi1IT1NUX1BSRUZJWF8xID0gbG9zZXItCi0KLSMgVGhlc2UgZmxhZyB2YWx1ZXMgYXJlIG5vcm1hbGx5IG92ZXJyaWRkZW4gYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCi1DRkxBR1MgPSAtZwotQ1hYRkxBR1MgPSAtZyAtTzIKLQotTERGTEFHUyA9IAotTElCQ0ZMQUdTID0gJChDRkxBR1MpCi1DRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ0ZMQUdTKQotTERGTEFHU19GT1JfVEFSR0VUID0gCi1MSUJDRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ0ZMQUdTX0ZPUl9UQVJHRVQpCi1QSUNGTEFHID0gCi1QSUNGTEFHX0ZPUl9UQVJHRVQgPSAKLQotQ0hJTExGTEFHUyA9ICQoQ0ZMQUdTKQotQ0hJTExfTElCID0gLWxjaGlsbAotQ1hYID0gYysrCi0KLSMgVXNlIC1PMiB0byBzdHJlc3MgdGVzdCB0aGUgY29tcGlsZXIuCi1MSUJDWFhGTEFHUyA9ICQoQ1hYRkxBR1MpIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzIC1mZXhjZXB0aW9ucwotQ1hYRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ1hYRkxBR1MpCi1MSUJDWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHU19GT1JfVEFSR0VUKSAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcyAtZmV4Y2VwdGlvbnMKLQotUkFOTElCID0gcmFubGliCi0KLURMTFRPT0wgPSBkbGx0b29sCi1XSU5EUkVTID0gd2luZHJlcwotCi1OTSA9IG5tCi0KLUxEID0gbGQKLQotQlpJUFBST0cgPSBiemlwMgotCi0jIFRoZXNlIHZhbHVlcyBhcmUgc3Vic3RpdHV0ZWQgYnkgY29uZmlndXJlLgotREVGQVVMVF9ZQUNDID0geWFjYwotREVGQVVMVF9MRVggPSBsZXgKLURFRkFVTFRfTTQgPSBtNAotCi1CSVNPTiA9IGBpZiBbIC1mICQkci9iaXNvbi9iaXNvbiBdIDsgdGhlbiBcCi0JICAgIGVjaG8gJCRyL2Jpc29uL2Jpc29uIC1MICQkcy9iaXNvbi8gOyBcCi0JIGVsc2UgXAotCSAgICBlY2hvIGJpc29uIDsgXAotCSBmaWAKLQotWUFDQyA9IGBpZiBbIC1mICQkci9iaXNvbi9iaXNvbiBdIDsgdGhlbiBcCi0JICAgIGVjaG8gJCRyL2Jpc29uL2Jpc29uIC15IC1MICQkcy9iaXNvbi8gOyBcCi0JZWxpZiBbIC1mICQkci9ieWFjYy9ieWFjYyBdIDsgdGhlbiBcCi0JICAgIGVjaG8gJCRyL2J5YWNjL2J5YWNjIDsgXAotCWVsc2UgXAotCSAgICBlY2hvICR7REVGQVVMVF9ZQUNDfSA7IFwKLQlmaWAKLQotTEVYID0gYGlmIFsgLWYgJCRyL2ZsZXgvZmxleCBdIDsgXAotCXRoZW4gZWNobyAkJHIvZmxleC9mbGV4IDsgXAotCWVsc2UgZWNobyAke0RFRkFVTFRfTEVYfSA7IGZpYAotCi1NNCA9IGBpZiBbIC1mICQkci9tNC9tNCBdIDsgXAotCXRoZW4gZWNobyAkJHIvbTQvbTQgOyBcCi0JZWxzZSBlY2hvICR7REVGQVVMVF9NNH0gOyBmaWAKLQotTUFLRUlORk8gPSBgaWYgWyAtZiAkJHIvdGV4aW5mby9tYWtlaW5mby9NYWtlZmlsZSBdIDsgXAotCXRoZW4gZWNobyAkJHIvdGV4aW5mby9tYWtlaW5mby9tYWtlaW5mbyA7IFwKLQllbHNlIGVjaG8gbWFrZWluZm8gOyBmaWAKLQotIyBUaGlzIGp1c3QgYmVjb21lcyBwYXJ0IG9mIHRoZSBNQUtFSU5GTyBkZWZpbml0aW9uIHBhc3NlZCBkb3duIHRvCi0jIHN1Yi1tYWtlcy4gIEl0IGxldHMgZmxhZ3MgYmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSB3aGlsZSBzdGlsbAotIyB1c2luZyB0aGUgbWFrZWluZm8gZnJvbSB0aGUgb2JqZWN0IHRyZWUuCi1NQUtFSU5GT0ZMQUdTID0KLQotRVhQRUNUID0gYGlmIFsgLWYgJCRyL2V4cGVjdC9leHBlY3QgXSA7IFwKLQl0aGVuIGVjaG8gJCRyL2V4cGVjdC9leHBlY3QgOyBcCi0JZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJCRzL2RlamFnbnUvcnVudGVzdCBdIDsgXAotCXRoZW4gZWNobyAkJHMvZGVqYWdudS9ydW50ZXN0IDsgXAotCWVsc2UgZWNobyBydW50ZXN0IDsgZmlgCi0KLQotIyBjb21waWxlcnMgdG8gdXNlIHRvIGNyZWF0ZSBwcm9ncmFtcyB3aGljaCBtdXN0IGJlIHJ1biBpbiB0aGUgYnVpbGQKLSMgZW52aXJvbm1lbnQuCi1DQ19GT1JfQlVJTEQgPSAkKENDKQotQ1hYX0ZPUl9CVUlMRCA9ICQoQ1hYKQotCi1TVUJESVJTID0gInRoaXMgaXMgc2V0IHZpYSBjb25maWd1cmUsIGRvbid0IGVkaXQgdGhpcyIKLU9USEVSUyA9IAotCi0jIFRoaXMgaXMgc2V0IGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHdoaWNoCi0jIHNob3VsZCBiZSBidWlsdCB1c2luZyB0aGUgdGFyZ2V0IHRvb2xzLgotCi0KLVRBUkdFVF9DT05GSUdESVJTID0gbGliaWJlcnR5IGxpYmdsb3NzICQoU1BFQ0lBTF9MSUJTKSBuZXdsaWIgbGliaW8gbGlicnggbGlic3RkYysrIGxpYmcrKyB3aW5zdXAgb3Bjb2RlcyBic3AgbGlic3R1YiBjeWdtb24KLQotIyBUYXJnZXQgbGlicmFyaWVzIGFyZSBwdXQgdW5kZXIgdGhpcyBkaXJlY3Rvcnk6Ci0jIENoYW5nZWQgYnkgY29uZmlndXJlIHRvICQodGFyZ2V0X2FsaWFzKSBpZiBjcm9zcy4KLVRBUkdFVF9TVUJESVIgPSAuCi0KLSMgVGhpcyBpcyBzZXQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gY29uZmlndXJlLgotQ09ORklHX0FSR1VNRU5UUyA9IAotCi0jIFRoaXMgaXMgc2V0IGJ5IGNvbmZpZ3VyZSB0byBSRUFMTFlfU0VUX0xJQl9QQVRIIGlmIC0tZW5hYmxlLXNoYXJlZAotIyB3YXMgdXNlZC4KLVNFVF9MSUJfUEFUSCA9Ci0KLSMgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdXNlZCBmb3IgdGhlIHBhdGggdG8KLSMgdGhlIGxpYnJhcmllcy4gIFRoaXMgbWF5IGJlIGNoYW5nZWQgYnkgY29uZmlndXJlLmluLgotUlBBVEhfRU5WVkFSID0gTERfTElCUkFSWV9QQVRICi0KLSMgY29uZmlndXJlLmluIHNldHMgU0VUX0xJQl9QQVRIIHRvIHRoaXMgaWYgLS1lbmFibGUtc2hhcmVkIHdhcyB1c2VkLgotUkVBTExZX1NFVF9MSUJfUEFUSCA9IFwKLSAgaWYgWyB4IiQkJChSUEFUSF9FTlZWQVIpIiAhPSB4IF07IHRoZW4gXAotICAgICQoUlBBVEhfRU5WVkFSKT0kJHIvYmZkOiQkci9vcGNvZGVzOiQkJChSUEFUSF9FTlZWQVIpOyBcCi0gIGVsc2UgXAotICAgICQoUlBBVEhfRU5WVkFSKT0kJHIvYmZkOiQkci9vcGNvZGVzOyBcCi0gIGZpOyBcCi0gIGV4cG9ydCAkKFJQQVRIX0VOVlZBUik7Ci0KLUFMTCA9IGFsbC5ub3JtYWwKLUlOU1RBTExfVEFSR0VUID0gaW5zdGFsbGRpcnMgXAotCWluc3RhbGwtZ2NjIFwKLQkkKElOU1RBTExfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9YMTFfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9ET1NSRUwpCi0KLUlOU1RBTExfVEFSR0VUX0NST1NTID0gaW5zdGFsbGRpcnMgXAotCWluc3RhbGwtZ2NjLWNyb3NzIFwKLQkkKElOU1RBTExfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9YMTFfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9ET1NSRUwpCi0KLUNDX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGNhc2UgIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIGluIFwKLSAgICAgICAgaVszNDU2XTg2LSotY3lnd2luKikgXAotICAgICAgICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLUIkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvIC1MJCRyLyQoVEFSR0VUX1NVQkRJUikvd2luc3VwIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy93aW5zdXAvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL3N5cy9jeWd3aW4gLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvc3lzL2N5Z3dpbjMyIC1ub3N0ZGluYzsgXAotICAgICAgICAgIDs7IFwKLSAgICAgICAgKikgXAotICAgICAgICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLWlkaXJhZnRlciAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0JICA7OyBcCi0gICAgICBlc2FjIFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZ2NjIHwgc2VkIC1lICdzL3gveC8nICQkdDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0jIElmIENDX0ZPUl9UQVJHRVQgaXMgbm90IG92ZXJyaWRlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGVuIHRoaXMKLSMgdmFyaWFibGUgaXMgcGFzc2VkIGRvd24gdG8gdGhlIGdjYyBNYWtlZmlsZSwgd2hlcmUgaXQgaXMgdXNlZCB0bwotIyBidWlsZCBsaWJnY2MyLmEuICBXZSBkZWZpbmUgaXQgaGVyZSBzbyB0aGF0IGl0IGNhbiBpdHNlbGYgYmUKLSMgb3ZlcnJpZGRlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgotR0NDX0ZPUl9UQVJHRVQgPSAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLwotCi1DSElMTF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1MJCRyL2djYy9jaC9ydW50aW1lLzsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZ2NjIHwgc2VkIC1lICdzL3gveC8nICQkdDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1DWFhfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgY2FzZSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgaW4gXAotICAgICAgICBpWzM0NTZdODYtKi1jeWd3aW4qKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtQiQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi8gLUwkJHIvJChUQVJHRVRfU1VCRElSKS93aW5zdXAgLWlkaXJhZnRlciAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL3dpbnN1cC9pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvc3lzL2N5Z3dpbiAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luMzIgLW5vc3RkaW5jOyBcCi0gICAgICAgICAgOzsgXAotICAgICAgICAqKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLQkgIDs7IFwKLSAgICAgIGVzYWMgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ1hYKTsgXAotICAgIGVsc2UgXAotICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gYysrIHwgc2VkIC1lICdzL3gveC8nICQkdDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1BU19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2dhcy9hcy1uZXcgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2dhcy9hcy1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQVMpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gYXMgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1MRF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2xkL2xkLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvbGQvbGQtbmV3IDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKExEKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGxkIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotRExMVE9PTF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL2RsbHRvb2wgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2JpbnV0aWxzL2RsbHRvb2wgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoRExMVE9PTCk7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBkbGx0b29sIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotV0lORFJFU19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL3dpbmRyZXMgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2JpbnV0aWxzL3dpbmRyZXMgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoV0lORFJFUyk7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyB3aW5kcmVzIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotQVJfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9iaW51dGlscy9hciBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvYXIgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQVIpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gYXIgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1SQU5MSUJfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9iaW51dGlscy9yYW5saWIgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2JpbnV0aWxzL3JhbmxpYiA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChSQU5MSUIpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gcmFubGliIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotTk1fRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9iaW51dGlscy9ubS1uZXcgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2JpbnV0aWxzL25tLW5ldyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChOTSk7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBubSB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLSMgVGhlIGZpcnN0IHJ1bGUgaW4gdGhlIGZpbGUgaGFkIGJldHRlciBiZSB0aGlzIG9uZS4gIERvbid0IHB1dCBhbnkgYWJvdmUgaXQuCi0jIFRoaXMgbGl2ZXMgaGVyZSB0byBhbGxvdyBtYWtlZmlsZSBmcmFnbWVudHMgdG8gY29udGFpbiBkZXBlbmRlbmNpZXMuCi1hbGw6IGFsbC5ub3JtYWwKLS5QSE9OWTogYWxsCi0KLSMgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gYnkgY29uZmlnL210LSouCi0jIFRoZSBfVEFSR0VUXyBpcyBiZWNhdXNlIHRoZXkncmUgc3BlY2lmaWVkIGluIG10LWZvby4KLSMgVGhlIF9IT1NUXyBpcyBiZWNhdXNlIHRoZXkncmUgcHJvZ3JhbXMgdGhhdCBydW4gb24gdGhlIGhvc3QuCi1FWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUyA9Ci1FWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVMgPQotRVhUUkFfVEFSR0VUX0hPU1RfQ0hFQ0tfTU9EVUxFUyA9Ci0KLSMjIyMgaG9zdCBhbmQgdGFyZ2V0IHNwZWNpZmljIG1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCi0jIyMKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gYWxsIHN1Yi1tYWtlcy4KLSMgUGxlYXNlIGtlZXAgdGhlc2UgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgotQkFTRV9GTEFHU19UT19QQVNTID0gXAotCSJBUl9GTEFHUz0kKEFSX0ZMQUdTKSIgXAotCSJBUl9GT1JfVEFSR0VUPSQoQVJfRk9SX1RBUkdFVCkiIFwKLQkiQVNfRk9SX1RBUkdFVD0kKEFTX0ZPUl9UQVJHRVQpIiBcCi0JIkJJU09OPSQoQklTT04pIiBcCi0JIkNDX0ZPUl9CVUlMRD0kKENDX0ZPUl9CVUlMRCkiIFwKLQkiQ0NfRk9SX1RBUkdFVD0kKENDX0ZPUl9UQVJHRVQpIiBcCi0JIkNGTEFHUz0kKENGTEFHUykiIFwKLQkiQ0ZMQUdTX0ZPUl9UQVJHRVQ9JChDRkxBR1NfRk9SX1RBUkdFVCkiIFwKLQkiQ0hJTExGTEFHUz0kKENISUxMRkxBR1MpIiBcCi0JIkNISUxMX0ZPUl9UQVJHRVQ9JChDSElMTF9GT1JfVEFSR0VUKSIgXAotCSJDSElMTF9MSUI9JChDSElMTF9MSUIpIiBcCi0JIkNYWF9GT1JfQlVJTEQ9JChDWFhfRk9SX0JVSUxEKSIgXAotCSJDWFhGTEFHUz0kKENYWEZMQUdTKSIgXAotCSJDWFhGTEFHU19GT1JfVEFSR0VUPSQoQ1hYRkxBR1NfRk9SX1RBUkdFVCkiIFwKLQkiQ1hYX0ZPUl9UQVJHRVQ9JChDWFhfRk9SX1RBUkdFVCkiIFwKLQkiRExMVE9PTF9GT1JfVEFSR0VUPSQoRExMVE9PTF9GT1JfVEFSR0VUKSIgXAotCSJJTlNUQUxMPSQoSU5TVEFMTCkiIFwKLQkiSU5TVEFMTF9EQVRBPSQoSU5TVEFMTF9EQVRBKSIgXAotCSJJTlNUQUxMX1BST0dSQU09JChJTlNUQUxMX1BST0dSQU0pIiBcCi0JIklOU1RBTExfU0NSSVBUPSQoSU5TVEFMTF9TQ1JJUFQpIiBcCi0JIkxERkxBR1M9JChMREZMQUdTKSIgXAotCSJMRVg9JChMRVgpIiBcCi0JIkxEX0ZPUl9UQVJHRVQ9JChMRF9GT1JfVEFSR0VUKSIgXAotCSJMSUJDRkxBR1M9JChMSUJDRkxBR1MpIiBcCi0JIkxJQkNGTEFHU19GT1JfVEFSR0VUPSQoTElCQ0ZMQUdTX0ZPUl9UQVJHRVQpIiBcCi0JIkxJQkNYWEZMQUdTPSQoTElCQ1hYRkxBR1MpIiBcCi0JIkxJQkNYWEZMQUdTX0ZPUl9UQVJHRVQ9JChMSUJDWFhGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJNND0kKE00KSIgXAotCSJNQUtFPSQoTUFLRSkiIFwKLQkiTUFLRUlORk89JChNQUtFSU5GTykgJChNQUtFSU5GT0ZMQUdTKSIgXAotCSJOTV9GT1JfVEFSR0VUPSQoTk1fRk9SX1RBUkdFVCkiIFwKLQkiUkFOTElCX0ZPUl9UQVJHRVQ9JChSQU5MSUJfRk9SX1RBUkdFVCkiIFwKLQkiUlBBVEhfRU5WVkFSPSQoUlBBVEhfRU5WVkFSKSIgXAotCSJTSEVMTD0kKFNIRUxMKSIgXAotCSJFWFBFQ1Q9JChFWFBFQ1QpIiBcCi0JIlJVTlRFU1Q9JChSVU5URVNUKSIgXAotCSJSVU5URVNURkxBR1M9JChSVU5URVNURkxBR1MpIiBcCi0JIlRBUkdFVF9TVUJESVI9JChUQVJHRVRfU1VCRElSKSIgXAotCSJXSU5EUkVTX0ZPUl9UQVJHRVQ9JChXSU5EUkVTX0ZPUl9UQVJHRVQpIiBcCi0JIllBQ0M9JChZQUNDKSIgXAotCSJiaW5kaXI9JChiaW5kaXIpIiBcCi0JImRhdGFkaXI9JChkYXRhZGlyKSIgXAotCSJleGVjX3ByZWZpeD0kKGV4ZWNfcHJlZml4KSIgXAotCSJpbmNsdWRlZGlyPSQoaW5jbHVkZWRpcikiIFwKLQkiaW5mb2Rpcj0kKGluZm9kaXIpIiBcCi0JImxpYmRpcj0kKGxpYmRpcikiIFwKLQkibGliZXhlY2Rpcj0kKGxpYmV4ZWNkaXIpIiBcCi0JImxpc3BkaXI9JChsaXNwZGlyKSIgXAotCSJsb2NhbHN0YXRlZGlyPSQobG9jYWxzdGF0ZWRpcikiIFwKLQkibWFuZGlyPSQobWFuZGlyKSIgXAotCSJvbGRpbmNsdWRlZGlyPSQob2xkaW5jbHVkZWRpcikiIFwKLQkicHJlZml4PSQocHJlZml4KSIgXAotCSJzYmluZGlyPSQoc2JpbmRpcikiIFwKLQkic2hhcmVkc3RhdGVkaXI9JChzaGFyZWRzdGF0ZWRpcikiIFwKLQkic3lzY29uZmRpcj0kKHN5c2NvbmZkaXIpIiBcCi0JInRvb2xkaXI9JCh0b29sZGlyKSIgXAotCSJneHhfaW5jbHVkZV9kaXI9JChneHhfaW5jbHVkZV9kaXIpIiBcCi0JImdjY192ZXJzaW9uPSQoZ2NjX3ZlcnNpb24pIiBcCi0JImdjY192ZXJzaW9uX3RyaWdnZXI9JChnY2NfdmVyc2lvbl90cmlnZ2VyKSIgXAotCSJ0YXJnZXRfYWxpYXM9JCh0YXJnZXRfYWxpYXMpIiBcCi0JImxpYnN1YmRpcj0kKGxpYnN1YmRpcikiCi0KLSMgRmxhZ3MgdG8gcGFzcyBkb3duIHRvIG1vc3Qgc3ViLW1ha2VzLCBpbiB3aGljaCB3ZSdyZSBidWlsZGluZyB3aXRoCi0jIHRoZSBob3N0IGVudmlyb25tZW50LgotIyBJZiBhbnkgdmFyaWFibGVzIGFyZSBhZGRlZCBoZXJlLCB0aGV5IG11c3QgYmUgYWRkZWQgdG8gZG8tKiwgYmVsb3cuCi1FWFRSQV9IT1NUX0ZMQUdTID0gXAotCSdBUj0kKEFSKScgXAotCSdBUz0kKEFTKScgXAotCSdDQz0kKENDKScgXAotCSdDWFg9JChDWFgpJyBcCi0JJ0RMTFRPT0w9JChETExUT09MKScgXAotCSdMRD0kKExEKScgXAotCSdOTT0kKE5NKScgXAotCSdSQU5MSUI9JChSQU5MSUIpJyBcCi0JJ1dJTkRSRVM9JChXSU5EUkVTKScKLQotRkxBR1NfVE9fUEFTUyA9ICQoQkFTRV9GTEFHU19UT19QQVNTKSAkKEVYVFJBX0hPU1RfRkxBR1MpCi0KLSMgRmxhZ3MgdGhhdCBhcmUgY29uY2VybmVkIHdpdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBYMTEgaW5jbHVkZSBmaWxlcwotIyBhbmQgbGlicmFyeSBmaWxlcwotIwotIyBOT1RFOiB1bnRpbCB0aGUgdG9wLWxldmVsIGlzIGdldHRpbmcgdGhlIHZhbHVlcyB2aWEgYXV0b2NvbmYsIGl0IG9ubHkKLSMgY2F1c2VzIHByb2JsZW1zIHRvIGhhdmUgdGhpcyB0b3AtbGV2ZWwgTWFrZWZpbGUgb3ZlcnJpZGluZyB0aGUgYXV0b2NvbmYtc2V0Ci0jIHZhbHVlcyBpbiBjaGlsZCBkaXJlY3Rvcmllcy4gIE9ubHkgdmFyaWFibGVzIHRoYXQgZG9uJ3QgY29uZmxpY3Qgd2l0aAotIyBhdXRvY29uZidlZCBvbmVzIHNob3VsZCBiZSBwYXNzZWQgYnkgWDExX0ZMQUdTX1RPX1BBU1MgZm9yIG5vdy4KLSMKLVgxMV9GTEFHU19UT19QQVNTID0gXAotCSdYMTFfRVhUUkFfQ0ZMQUdTPSQoWDExX0VYVFJBX0NGTEFHUyknIFwKLQknWDExX0VYVFJBX0xJQlM9JChYMTFfRVhUUkFfTElCUyknCi0KLSMgRmxhZ3MgdG8gcGFzcyBkb3duIHRvIG1ha2VzIHdoaWNoIGFyZSBidWlsdCB3aXRoIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQuCi0jIFRoZSBkb3VibGUgJCBkZWNyZWFzZXMgdGhlIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBsaW5lOyB0aGUgdmFyaWFibGVzCi0jIGFyZSBzZXQgaW4gQkFTRV9GTEFHU19UT19QQVNTLCBhbmQgdGhlIHN1Yi1tYWtlIHdpbGwgZXhwYW5kIHRoZW0uCi0jIElmIGFueSB2YXJpYWJsZXMgYXJlIGFkZGVkIGhlcmUsIHRoZXkgbXVzdCBiZSBhZGRlZCB0byBkby0qLCBiZWxvdy4KLUVYVFJBX1RBUkdFVF9GTEFHUyA9IFwKLQknQVI9JCQoQVJfRk9SX1RBUkdFVCknIFwKLQknQVM9JCQoQVNfRk9SX1RBUkdFVCknIFwKLQknQ0M9JCQoQ0NfRk9SX1RBUkdFVCknIFwKLQknQ0ZMQUdTPSQkKENGTEFHU19GT1JfVEFSR0VUKScgXAotCSdDWFg9JCQoQ1hYX0ZPUl9UQVJHRVQpJyBcCi0JJ0NYWEZMQUdTPSQkKENYWEZMQUdTX0ZPUl9UQVJHRVQpJyBcCi0JJ0RMTFRPT0w9JCQoRExMVE9PTF9GT1JfVEFSR0VUKScgXAotCSdMRD0kJChMRF9GT1JfVEFSR0VUKScgXAotCSdMSUJDRkxBR1M9JCQoTElCQ0ZMQUdTX0ZPUl9UQVJHRVQpJyBcCi0JJ0xJQkNYWEZMQUdTPSQkKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpJyBcCi0JJ05NPSQkKE5NX0ZPUl9UQVJHRVQpJyBcCi0JJ1JBTkxJQj0kJChSQU5MSUJfRk9SX1RBUkdFVCknIFwKLQknV0lORFJFUz0kJChXSU5EUkVTX0ZPUl9UQVJHRVQpJwotCi1UQVJHRVRfRkxBR1NfVE9fUEFTUyA9ICQoQkFTRV9GTEFHU19UT19QQVNTKSAkKEVYVFJBX1RBUkdFVF9GTEFHUykKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gZ2NjLiAgZ2NjIGJ1aWxkcyBhIGxpYnJhcnksIGxpYmdjYy5hLCBzbyBpdAotIyB1bmZvcnR1bmF0ZWx5IG5lZWRzIHRoZSBuYXRpdmUgY29tcGlsZXIgYW5kIHRoZSB0YXJnZXQgYXIgYW5kCi0jIHJhbmxpYi4KLSMgSWYgYW55IHZhcmlhYmxlcyBhcmUgYWRkZWQgaGVyZSwgdGhleSBtdXN0IGJlIGFkZGVkIHRvIGRvLSosIGJlbG93LgotIyBUaGUgSE9TVF8qIHZhcmlhYmxlcyBhcmUgYSBzcGVjaWFsIGNhc2UsIHdoaWNoIGFyZSB1c2VkIGZvciB0aGUgZ2NjCi0jIGNyb3NzLWJ1aWxkaW5nIHNjaGVtZS4KLUVYVFJBX0dDQ19GTEFHUyA9IFwKLQknQVI9JChBUiknIFwKLQknQVM9JChBUyknIFwKLQknQ0M9JChDQyknIFwKLQknQ1hYPSQoQ1hYKScgXAotCSdETExUT09MPSQkKERMTFRPT0xfRk9SX1RBUkdFVCknIFwKLQknSE9TVF9DQz0kKENDX0ZPUl9CVUlMRCknIFwKLQknSE9TVF9QUkVGSVg9JChIT1NUX1BSRUZJWCknIFwKLQknSE9TVF9QUkVGSVhfMT0kKEhPU1RfUFJFRklYXzEpJyBcCi0JJ05NPSQoTk0pJyBcCi0JJ1JBTkxJQj0kKFJBTkxJQiknIFwKLQknV0lORFJFUz0kJChXSU5EUkVTX0ZPUl9UQVJHRVQpJyBcCi0JIkdDQ19GT1JfVEFSR0VUPSQoR0NDX0ZPUl9UQVJHRVQpIiBcCi0JImBlY2hvICdMQU5HVUFHRVM9JChMQU5HVUFHRVMpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ1NUTVBfRklYUFJPVE89JChTVE1QX0ZJWFBST1RPKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdMSU1JVFNfSF9URVNUPSQoTElNSVRTX0hfVEVTVCknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnTElCR0NDMV9URVNUPSQoTElCR0NDMV9URVNUKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdMSUJHQ0MyX0NGTEFHUz0kKExJQkdDQzJfQ0ZMQUdTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdMSUJHQ0MyX0RFQlVHX0NGTEFHUz0kKExJQkdDQzJfREVCVUdfQ0ZMQUdTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdMSUJHQ0MyX0lOQ0xVREVTPSQoTElCR0NDMl9JTkNMVURFUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnRU5RVUlSRT0kKEVOUVVJUkUpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0JPT1RfQ0ZMQUdTPSQoQk9PVF9DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiCi0KLUdDQ19GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfR0NDX0ZMQUdTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGNvbXBpbGVkCi0jIHVzaW5nICQoRkxBR1NfVE9fUEFTUykuCi1BTExfTU9EVUxFUyA9IFwKLQlhbGwtYXBhY2hlIFwKLQlhbGwtYXNoIFwKLQlhbGwtYXV0b2NvbmYgXAotCWFsbC1hdXRvbWFrZSBcCi0JYWxsLWJhc2ggXAotCWFsbC1iZmQgXAotCWFsbC1iaW51dGlscyBcCi0JYWxsLWJpc29uIFwKLQlhbGwtYnlhY2MgXAotCWFsbC1iemlwMiBcCi0JYWxsLWN2c3NyYyBcCi0JYWxsLWRiIFwKLQlhbGwtZGVqYWdudSBcCi0JYWxsLWRpZmYgXAotCWFsbC1kb3N1dGlscyBcCi0JYWxsLWV0YyBcCi0JYWxsLWZpbGV1dGlscyBcCi0JYWxsLWZpbmR1dGlscyBcCi0JYWxsLWZpbmQgXAotCWFsbC1mbGV4IFwKLQlhbGwtZ2FzIFwKLQlhbGwtZ2F3ayBcCi0JYWxsLWdldHRleHQgXAotCWFsbC1nbnVzZXJ2IFwKLQlhbGwtZ3Byb2YgXAotCWFsbC1ncmVwIFwKLQlhbGwtZ3JleiBcCi0JYWxsLWd6aXAgXAotCWFsbC1oZWxsbyBcCi0JYWxsLWluZGVudCBcCi0JYWxsLWluZXQgXAotCWFsbC1pbnRsIFwKLQlhbGwtaXNwZWxsIFwKLQlhbGwtaXRjbCBcCi0JYWxsLWxkIFwKLQlhbGwtbGliZ3VpIFwKLQlhbGwtbGliaWJlcnR5IFwKLQlhbGwtbGlidG9vbCBcCi0JYWxsLW00IFwKLQlhbGwtbWFrZSBcCi0JYWxsLW1tYWxsb2MgXAotCWFsbC1vcGNvZGVzIFwKLQlhbGwtcGF0Y2ggXAotCWFsbC1wZXJsIFwKLQlhbGwtcHJtcyBcCi0JYWxsLXJjcyBcCi0JYWxsLXJlYWRsaW5lIFwKLQlhbGwtcmVsZWFzZSBcCi0JYWxsLXJlY29kZSBcCi0JYWxsLXNlZCBcCi0JYWxsLXNlbmQtcHIgXAotCWFsbC1zaGVsbHV0aWxzIFwKLQlhbGwtc2ltIFwKLQlhbGwtdGFyIFwKLQlhbGwtdGNsIFwKLQlhbGwtdGNsOC4xIFwKLQlhbGwtdGV4aW5mbyBcCi0JYWxsLXRleHR1dGlscyBcCi0JYWxsLXRnYXMgXAotCWFsbC10aW1lIFwKLQlhbGwtdXVkZWNvZGUgXAotCWFsbC13ZGlmZiBcCi0JYWxsLXppcCBcCi0JJChFWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUykKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY2hlY2sgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKEZMQUdTX1RPX1BBU1MpLgotIwotIyBUaGUgbGlzdCBpcyBpbiB0d28gcGFydHMuICBUaGUgZmlyc3QgbGlzdHMgdGhvc2UgdG9vbHMgd2hpY2gKLSMgYXJlIHRlc3RlZCBhcyBwYXJ0IG9mIHRoZSBob3N0J3MgbmF0aXZlIHRvb2wtY2hhaW4sIGFuZCBub3QKLSMgdGVzdGVkIGluIGEgY3Jvc3MgY29uZmlndXJhdGlvbi4KLU5BVElWRV9DSEVDS19NT0RVTEVTID0gXAotCWNoZWNrLWJpc29uIFwKLQljaGVjay1ieWFjYyBcCi0JY2hlY2stZmxleCBcCi0JY2hlY2stemlwCi0KLUNST1NTX0NIRUNLX01PRFVMRVMgPSBcCi0JY2hlY2stYXBhY2hlIFwKLQljaGVjay1hc2ggXAotCWNoZWNrLWF1dG9jb25mIFwKLQljaGVjay1hdXRvbWFrZSBcCi0JY2hlY2stYmFzaCBcCi0JY2hlY2stYmZkIFwKLQljaGVjay1iaW51dGlscyBcCi0JY2hlY2stYnppcDIgXAotCWNoZWNrLWN2c3NyYyBcCi0JY2hlY2stZGIgXAotCWNoZWNrLWRlamFnbnUgXAotCWNoZWNrLWRpZmYgXAotCWNoZWNrLWV0YyBcCi0JY2hlY2stZmlsZXV0aWxzIFwKLQljaGVjay1maW5kdXRpbHMgXAotCWNoZWNrLWZpbmQgXAotCWNoZWNrLWdhcyBcCi0JY2hlY2stZ2F3ayBcCi0JY2hlY2stZ2V0dGV4dCBcCi0JY2hlY2stZ251c2VydiBcCi0JY2hlY2stZ3Byb2YgXAotCWNoZWNrLWdyZXAgXAotCWNoZWNrLWd6aXAgXAotCWNoZWNrLWhlbGxvIFwKLQljaGVjay1pbmRlbnQgXAotCWNoZWNrLWluZXQgXAotCWNoZWNrLWludGwgXAotCWNoZWNrLWlzcGVsbCBcCi0JY2hlY2staXRjbCBcCi0JY2hlY2stbGQgXAotCWNoZWNrLWxpYmd1aSBcCi0JY2hlY2stbGliaWJlcnR5IFwKLQljaGVjay1saWJ0b29sIFwKLQljaGVjay1tNCBcCi0JY2hlY2stbWFrZSBcCi0JY2hlY2stbW1jaGVja29jIFwKLQljaGVjay1vcGNvZGVzIFwKLQljaGVjay1wYXRjaCBcCi0JY2hlY2stcGVybCBcCi0JY2hlY2stcHJtcyBcCi0JY2hlY2stcmNzIFwKLQljaGVjay1yZWFkbGluZSBcCi0JY2hlY2stcmVjb2RlIFwKLQljaGVjay1zZWQgXAotCWNoZWNrLXNlbmQtcHIgXAotCWNoZWNrLXNoZWxsdXRpbHMgXAotCWNoZWNrLXNpbSBcCi0JY2hlY2stdGFyIFwKLQljaGVjay10Y2wgXAotCWNoZWNrLXRleGluZm8gXAotCWNoZWNrLXRleHR1dGlscyBcCi0JY2hlY2stdGdhcyBcCi0JY2hlY2stdGltZSBcCi0JY2hlY2stdXVkZWNvZGUgXAotCWNoZWNrLXdkaWZmIFwKLQkkKEVYVFJBX1RBUkdFVF9IT1NUX0NIRUNLX01PRFVMRVMpCi0KLUNIRUNLX01PRFVMRVM9JChOQVRJVkVfQ0hFQ0tfTU9EVUxFUykgJChDUk9TU19DSEVDS19NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBpbnN0YWxsIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChGTEFHU19UT19QQVNTKS4KLSMgV2UgcHV0IGluc3RhbGwtb3Bjb2RlcyBiZWZvcmUgaW5zdGFsbC1iaW51dGlscyBiZWNhdXNlIHRoZSBpbnN0YWxsZWQKLSMgYmludXRpbHMgbWlnaHQgYmUgb24gUEFUSCwgYW5kIHRoZXkgbWlnaHQgbmVlZCB0aGUgc2hhcmVkIG9wY29kZXMKLSMgbGlicmFyeS4KLSMgV2UgcHV0IGluc3RhbGwtdGNsIGJlZm9yZSBpbnN0YWxsLWl0Y2wgYmVjYXVzZSBpdGNsIHdhbnRzIHRvIHJ1biBhCi0jIHByb2dyYW0gb24gaW5zdGFsbGF0aW9uIHdoaWNoIHVzZXMgdGhlIFRjbCBsaWJyYXJpZXMuCi1JTlNUQUxMX01PRFVMRVMgPSBcCi0JaW5zdGFsbC1hcGFjaGUgXAotCWluc3RhbGwtYXNoIFwKLQlpbnN0YWxsLWF1dG9jb25mIFwKLQlpbnN0YWxsLWF1dG9tYWtlIFwKLQlpbnN0YWxsLWJhc2ggXAotCWluc3RhbGwtYmZkIFwKLQlpbnN0YWxsLWJ6aXAyIFwKLQlpbnN0YWxsLW9wY29kZXMgXAotCWluc3RhbGwtYmludXRpbHMgXAotCWluc3RhbGwtYmlzb24gXAotCWluc3RhbGwtYnlhY2MgXAotCWluc3RhbGwtY3Zzc3JjIFwKLQlpbnN0YWxsLWRiIFwKLQlpbnN0YWxsLWRlamFnbnUgXAotCWluc3RhbGwtZGlmZiBcCi0JaW5zdGFsbC1kb3N1dGlscyBcCi0JaW5zdGFsbC1ldGMgXAotCWluc3RhbGwtZmlsZXV0aWxzIFwKLQlpbnN0YWxsLWZpbmR1dGlscyBcCi0JaW5zdGFsbC1maW5kIFwKLQlpbnN0YWxsLWZsZXggXAotCWluc3RhbGwtZ2FzIFwKLQlpbnN0YWxsLWdhd2sgXAotCWluc3RhbGwtZ2V0dGV4dCBcCi0JaW5zdGFsbC1nbnVzZXJ2IFwKLQlpbnN0YWxsLWdwcm9mIFwKLQlpbnN0YWxsLWdyZXAgXAotCWluc3RhbGwtZ3JleiBcCi0JaW5zdGFsbC1nemlwIFwKLQlpbnN0YWxsLWhlbGxvIFwKLQlpbnN0YWxsLWluZGVudCBcCi0JaW5zdGFsbC1pbmV0IFwKLQlpbnN0YWxsLWludGwgXAotCWluc3RhbGwtaXNwZWxsIFwKLQlpbnN0YWxsLXRjbCBcCi0JaW5zdGFsbC10Y2w4LjEgXAotCWluc3RhbGwtaXRjbCBcCi0JaW5zdGFsbC1sZCBcCi0JaW5zdGFsbC1saWJndWkgXAotCWluc3RhbGwtbGliaWJlcnR5IFwKLQlpbnN0YWxsLWxpYnRvb2wgXAotCWluc3RhbGwtbTQgXAotCWluc3RhbGwtbWFrZSBcCi0JaW5zdGFsbC1tbWFsbG9jIFwKLQlpbnN0YWxsLXBhdGNoIFwKLQlpbnN0YWxsLXBlcmwgXAotCWluc3RhbGwtcHJtcyBcCi0JaW5zdGFsbC1yY3MgXAotCWluc3RhbGwtcmVhZGxpbmUgXAotCWluc3RhbGwtcmVjb2RlIFwKLQlpbnN0YWxsLXNlZCBcCi0JaW5zdGFsbC1zZW5kLXByIFwKLQlpbnN0YWxsLXNoZWxsdXRpbHMgXAotCWluc3RhbGwtc2ltIFwKLQlpbnN0YWxsLXRhciBcCi0JaW5zdGFsbC10ZXhpbmZvIFwKLQlpbnN0YWxsLXRleHR1dGlscyBcCi0JaW5zdGFsbC10Z2FzIFwKLQlpbnN0YWxsLXRpbWUgXAotCWluc3RhbGwtdXVkZWNvZGUgXAotCWluc3RhbGwtd2RpZmYgXAotCWluc3RhbGwtemlwIFwKLQkkKEVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUykKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBjb21waWxlZAotIyB1c2luZyAkKFgxMV9GTEFHU19UT19QQVNTKS4KLUFMTF9YMTFfTU9EVUxFUyA9IFwKLQlhbGwtZW1hY3MgXAotCWFsbC1lbWFjczE5IFwKLQlhbGwtZ2RiIFwKLQlhbGwtZXhwZWN0IFwKLQlhbGwtZ2FzaCBcCi0JYWxsLWd1aWxlIFwKLQlhbGwtdGNsWCBcCi0JYWxsLXRrIFwKLQlhbGwtdGs4LjEgXAotCWFsbC10aXgKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY2hlY2sgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFgxMV9GTEFHU19UT19QQVNTKS4KLUNIRUNLX1gxMV9NT0RVTEVTID0gXAotCWNoZWNrLWVtYWNzIFwKLQljaGVjay1nZGIgXAotCWNoZWNrLWd1aWxlIFwKLQljaGVjay1leHBlY3QgXAotCWNoZWNrLWdhc2ggXAotCWNoZWNrLXRjbFggXAotCWNoZWNrLXRrIFwKLQljaGVjay10aXgKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgaW5zdGFsbCB0YXJnZXRzIGZvciBhbGwgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotSU5TVEFMTF9YMTFfTU9EVUxFUyA9IFwKLQlpbnN0YWxsLWVtYWNzIFwKLQlpbnN0YWxsLWVtYWNzMTkgXAotCWluc3RhbGwtZ2RiIFwKLQlpbnN0YWxsLWd1aWxlIFwKLQlpbnN0YWxsLWV4cGVjdCBcCi0JaW5zdGFsbC1nYXNoIFwKLQlpbnN0YWxsLXRjbFggXAotCWluc3RhbGwtdGsgXAotCWluc3RhbGwtdGs4LjEgXAotCWluc3RhbGwtdGl4Ci0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUgY29tcGlsZWQKLSMgdXNpbmcgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykuCi1BTExfVEFSR0VUX01PRFVMRVMgPSBcCi0JYWxsLXRhcmdldC1saWJpbyBcCi0JYWxsLXRhcmdldC1saWJzdGRjKysgXAotCWFsbC10YXJnZXQtbGlicnggXAotCWFsbC10YXJnZXQtbGliZysrIFwKLQlhbGwtdGFyZ2V0LW5ld2xpYiBcCi0JYWxsLXRhcmdldC1saWJ0ZXJtY2FwIFwKLQlhbGwtdGFyZ2V0LXdpbnN1cCBcCi0JYWxsLXRhcmdldC1saWJnbG9zcyBcCi0JYWxsLXRhcmdldC1saWJpYmVydHkgXAotCWFsbC10YXJnZXQtZ3BlcmYgXAotCWFsbC10YXJnZXQtZXhhbXBsZXMgXAotCWFsbC10YXJnZXQtbGlic3R1YiBcCi0JYWxsLXRhcmdldC1ic3AgXAotCWFsbC10YXJnZXQtY3lnbW9uCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGNvbmZpZ3VyZSB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2gKLSMgYXJlIGNvbXBpbGVkIHVzaW5nIHRoZSB0YXJnZXQgdG9vbHMuCi1DT05GSUdVUkVfVEFSR0VUX01PRFVMRVMgPSBcCi0JY29uZmlndXJlLXRhcmdldC1saWJpbyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJzdGRjKysgXAotCWNvbmZpZ3VyZS10YXJnZXQtbGlicnggXAotCWNvbmZpZ3VyZS10YXJnZXQtbGliZysrIFwKLQljb25maWd1cmUtdGFyZ2V0LW5ld2xpYiBcCi0JY29uZmlndXJlLXRhcmdldC1saWJ0ZXJtY2FwIFwKLQljb25maWd1cmUtdGFyZ2V0LXdpbnN1cCBcCi0JY29uZmlndXJlLXRhcmdldC1saWJnbG9zcyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJpYmVydHkgXAotCWNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYgXAotCWNvbmZpZ3VyZS10YXJnZXQtZXhhbXBsZXMgXAotCWNvbmZpZ3VyZS10YXJnZXQtbGlic3R1YiBcCi0JY29uZmlndXJlLXRhcmdldC1ic3AgXAotCWNvbmZpZ3VyZS10YXJnZXQtY3lnbW9uCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGNoZWNrIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykuCi1DSEVDS19UQVJHRVRfTU9EVUxFUyA9IFwKLQljaGVjay10YXJnZXQtbGliaW8gXAotCWNoZWNrLXRhcmdldC1saWJzdGRjKysgXAotCWNoZWNrLXRhcmdldC1saWJnKysgXAotCWNoZWNrLXRhcmdldC1uZXdsaWIgXAotCWNoZWNrLXRhcmdldC13aW5zdXAgXAotCWNoZWNrLXRhcmdldC1saWJpYmVydHkgXAotCWNoZWNrLXRhcmdldC1ncGVyZgotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBpbnN0YWxsIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykuCi1JTlNUQUxMX1RBUkdFVF9NT0RVTEVTID0gXAotCWluc3RhbGwtdGFyZ2V0LWxpYmlvIFwKLQlpbnN0YWxsLXRhcmdldC1saWJzdGRjKysgXAotCWluc3RhbGwtdGFyZ2V0LWxpYmcrKyBcCi0JaW5zdGFsbC10YXJnZXQtbmV3bGliIFwKLQlpbnN0YWxsLXRhcmdldC1saWJ0ZXJtY2FwIFwKLQlpbnN0YWxsLXRhcmdldC13aW5zdXAgXAotCWluc3RhbGwtdGFyZ2V0LWxpYmdsb3NzIFwKLQlpbnN0YWxsLXRhcmdldC1saWJpYmVydHkgXAotCWluc3RhbGwtdGFyZ2V0LWJzcCBcCi0JaW5zdGFsbC10YXJnZXQtZ3BlcmYKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgdGFyZ2V0cyBmb3Igd2hpY2ggd2UgY2FuIGRvIGEgY2xlYW4te3RhcmdldH0uCi1DTEVBTl9NT0RVTEVTID0gXAotCWNsZWFuLWFwYWNoZSBcCi0JY2xlYW4tYXNoIFwKLQljbGVhbi1hdXRvY29uZiBcCi0JY2xlYW4tYXV0b21ha2UgXAotCWNsZWFuLWJhc2ggXAotCWNsZWFuLWJmZCBcCi0JY2xlYW4tYmludXRpbHMgXAotCWNsZWFuLWJpc29uIFwKLQljbGVhbi1ieWFjYyBcCi0JY2xlYW4tYnppcDIgXAotCWNsZWFuLWN2c3NyYyBcCi0JY2xlYW4tZGIgXAotCWNsZWFuLWRlamFnbnUgXAotCWNsZWFuLWRpZmYgXAotCWNsZWFuLWRvc3V0aWxzIFwKLQljbGVhbi1ldGMgXAotCWNsZWFuLWZpbGV1dGlscyBcCi0JY2xlYW4tZmluZHV0aWxzIFwKLQljbGVhbi1maW5kIFwKLQljbGVhbi1mbGV4IFwKLQljbGVhbi1nYXMgXAotCWNsZWFuLWdhd2sgXAotCWNsZWFuLWdldHRleHQgXAotCWNsZWFuLWdudXNlcnYgXAotCWNsZWFuLWdwcm9mIFwKLQljbGVhbi1ncmVwIFwKLQljbGVhbi1ncmV6IFwKLQljbGVhbi1nemlwIFwKLQljbGVhbi1oZWxsbyBcCi0JY2xlYW4taW5kZW50IFwKLQljbGVhbi1pbmV0IFwKLQljbGVhbi1pbnRsIFwKLQljbGVhbi1pc3BlbGwgXAotCWNsZWFuLWl0Y2wgXAotCWNsZWFuLWxkIFwKLQljbGVhbi1saWJndWkgXAotCWNsZWFuLWxpYmliZXJ0eSBcCi0JY2xlYW4tbGlidG9vbCBcCi0JY2xlYW4tbTQgXAotCWNsZWFuLW1ha2UgXAotCWNsZWFuLW1tYWxsb2MgXAotCWNsZWFuLW9wY29kZXMgXAotCWNsZWFuLXBhdGNoIFwKLQljbGVhbi1wZXJsIFwKLQljbGVhbi1wcm1zIFwKLQljbGVhbi1yY3MgXAotCWNsZWFuLXJlYWRsaW5lIFwKLQljbGVhbi1yZWxlYXNlIFwKLQljbGVhbi1yZWNvZGUgXAotCWNsZWFuLXNlZCBcCi0JY2xlYW4tc2VuZC1wciBcCi0JY2xlYW4tc2hlbGx1dGlscyBcCi0JY2xlYW4tc2ltIFwKLQljbGVhbi10YXIgXAotCWNsZWFuLXRjbCBcCi0JY2xlYW4tdGV4aW5mbyBcCi0JY2xlYW4tdGV4dHV0aWxzIFwKLQljbGVhbi10Z2FzIFwKLQljbGVhbi10aW1lIFwKLQljbGVhbi11dWRlY29kZSBcCi0JY2xlYW4td2RpZmYgXAotCWNsZWFuLXppcAotCi0jIEFsbCBvZiB0aGUgdGFyZ2V0IG1vZHVsZXMgdGhhdCBjYW4gYmUgY2xlYW5lZAotQ0xFQU5fVEFSR0VUX01PRFVMRVMgPSBcCi0JY2xlYW4tdGFyZ2V0LWxpYmlvIFwKLQljbGVhbi10YXJnZXQtbGlic3RkYysrIFwKLQljbGVhbi10YXJnZXQtbGlicnggXAotCWNsZWFuLXRhcmdldC1saWJnKysgXAotCWNsZWFuLXRhcmdldC1uZXdsaWIgXAotCWNsZWFuLXRhcmdldC13aW5zdXAgXAotCWNsZWFuLXRhcmdldC1saWJnbG9zcyBcCi0JY2xlYW4tdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY2xlYW4tdGFyZ2V0LWdwZXJmIFwKLQljbGVhbi10YXJnZXQtZXhhbXBsZXMgXAotCWNsZWFuLXRhcmdldC1saWJzdHViIFwKLQljbGVhbi10YXJnZXQtYnNwIFwKLQljbGVhbi10YXJnZXQtY3lnbW9uCi0KLSMgQWxsIG9mIHRoZSB4MTEgbW9kdWxlcyB0aGF0IGNhbiBiZSBjbGVhbmVkCi1DTEVBTl9YMTFfTU9EVUxFUyA9IFwKLQljbGVhbi1lbWFjcyBcCi0JY2xlYW4tZW1hY3MxOSBcCi0JY2xlYW4tZ2RiIFwKLQljbGVhbi1leHBlY3QgXAotCWNsZWFuLWdhc2ggXAotCWNsZWFuLWd1aWxlIFwKLQljbGVhbi10Y2xYIFwKLQljbGVhbi10ayBcCi0JY2xlYW4tdGl4Ci0KLSMgVGhlIHRhcmdldCBidWlsdCBmb3IgYSBuYXRpdmUgYnVpbGQuCi0uUEhPTlk6IGFsbC5ub3JtYWwKLWFsbC5ub3JtYWw6IFwKLQkkKEFMTF9NT0RVTEVTKSBcCi0JJChBTExfWDExX01PRFVMRVMpIFwKLQkkKEFMTF9UQVJHRVRfTU9EVUxFUykgXAotCWFsbC1nY2MKLQotIyBEbyBhIHRhcmdldCBmb3IgYWxsIHRoZSBzdWJkaXJlY3Rvcmllcy4gIEEgYGBtYWtlIGRvLVgnJyB3aWxsIGRvIGEKLSMgYGBtYWtlIFgnJyBpbiBhbGwgc3ViZGlyZWN0b3JpZXMgKGJlY2F1c2UsIGluIGdlbmVyYWwsIHRoZXJlIGlzIGEKLSMgZGVwZW5kZW5jeSAoYmVsb3cpIG9mIFggdXBvbiBkby1YLCBhIGBgbWFrZSBYJycgd2lsbCBhbHNvIGRvIHRoaXMsCi0jIGJ1dCBpdCBtYXkgZG8gYWRkaXRpb25hbCB3b3JrIGFzIHdlbGwpLgotIyBUaGlzIHRhcmdldCBlbnN1cmVzIHRoYXQgJChCQVNFX0ZMQUdTX1RPX1BBU1MpIGFwcGVhcnMgb25seSBvbmNlLAotIyBiZWNhdXNlIGl0IGlzIHNvIGxhcmdlIHRoYXQgaXQgY2FuIGVhc2lseSBvdmVyZmxvdyB0aGUgY29tbWFuZCBsaW5lCi0jIGxlbmd0aCBsaW1pdCBvbiBzb21lIHN5c3RlbXMuCi1ET19YID0gXAotCWRvLWNsZWFuIFwKLQlkby1kaXN0Y2xlYW4gXAotCWRvLWR2aSBcCi0JZG8taW5mbyBcCi0JZG8taW5zdGFsbC1pbmZvIFwKLQlkby1pbnN0YWxsY2hlY2sgXAotCWRvLW1vc3RseWNsZWFuIFwKLQlkby1tYWludGFpbmVyLWNsZWFuIFwKLQlkby1UQUdTCi0uUEhPTlk6ICQoRE9fWCkKLSQoRE9fWCk6Ci0JQHRhcmdldD1gZWNobyAkQCB8IHNlZCAtZSAncy9eZG8tLy8nYDsgXAotCXI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZm9yIGkgaW4gJChTVUJESVJTKSAtZHVtbXktOyBkbyBcCi0JICBpZiBbIC1mIC4vJCRpL01ha2VmaWxlIF07IHRoZW4gXAotCSAgICBjYXNlICQkaSBpbiBcCi0JICAgIGdjYykgXAotCSAgICAgIGZvciBmbGFnIGluICQoRVhUUkFfR0NDX0ZMQUdTKTsgZG8gXAotCQlldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMid8ImA7IFwKLQkgICAgICBkb25lOyBcCi0JICAgICAgOzsgXAotCSAgICAqKSBcCi0JICAgICAgZm9yIGZsYWcgaW4gJChFWFRSQV9IT1NUX0ZMQUdTKTsgZG8gXAotCQlldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMid8ImA7IFwKLQkgICAgICBkb25lOyBcCi0JICAgICAgOzsgXAotCSAgICBlc2FjIDsgXAotCSAgICBleHBvcnQgQVIgQVMgQ0MgQ1hYIExEIE5NIFJBTkxJQiBETExUT09MIFdJTkRSRVM7IFwKLQkgICAgaWYgKGNkIC4vJCRpOyBcCi0JICAgICAgICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCi0JCQkiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKLQkJCSJSQU5MSUI9JCR7UkFOTElCfSIgXAotCQkJIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCi0JCQkkJHt0YXJnZXR9KTsgXAotCSAgICB0aGVuIHRydWU7IGVsc2UgZXhpdCAxOyBmaTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQlAdGFyZ2V0PWBlY2hvICRAIHwgc2VkIC1lICdzL15kby0vLydgOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQlmb3IgaSBpbiAkKFRBUkdFVF9DT05GSUdESVJTKSAtZHVtbXktOyBkbyBcCi0JICBpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCRpL01ha2VmaWxlIF07IHRoZW4gXAotCSAgICBmb3IgZmxhZyBpbiAkKEVYVFJBX1RBUkdFVF9GTEFHUyk7IGRvIFwKLQkJZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInfCJgOyBcCi0JICAgIGRvbmU7IFwKLQkgICAgZXhwb3J0IEFSIEFTIENDIENYWCBMRCBOTSBSQU5MSUIgRExMVE9PTCBXSU5EUkVTOyBcCi0JICAgIGlmIChjZCAkKFRBUkdFVF9TVUJESVIpLyQkaTsgXAotCSAgICAgICAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAotCQkJIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCi0JCQkiUkFOTElCPSQke1JBTkxJQn0iIFwKLQkJCSJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAotCQkJJCR7dGFyZ2V0fSk7IFwKLQkgICAgdGhlbiB0cnVlOyBlbHNlIGV4aXQgMTsgZmk7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0KLSMgSGVyZSBhcmUgdGhlIHRhcmdldHMgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgZG8tWCB0YXJnZXRzLgotCi0uUEhPTlk6IGluZm8gaW5zdGFsbGNoZWNrIGR2aSBpbnN0YWxsLWluZm8KLS5QSE9OWTogY2xlYW4gZGlzdGNsZWFuIG1vc3RseWNsZWFuIG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuCi0uUEhPTlk6IGxvY2FsLWNsZWFuIGxvY2FsLWRpc3RjbGVhbiBsb2NhbC1tYWludGFpbmVyLWNsZWFuCi1pbmZvOiBkby1pbmZvCi1pbnN0YWxsY2hlY2s6IGRvLWluc3RhbGxjaGVjawotZHZpOiBkby1kdmkKLQotIyBNYWtlIHN1cmUgbWFrZWluZm8gaXMgYnVpbHQgYmVmb3JlIHdlIGRvIGEgYG1ha2UgaW5mbycuCi1kby1pbmZvOiBhbGwtdGV4aW5mbwotCi1pbnN0YWxsLWluZm86IGRvLWluc3RhbGwtaW5mbyBkaXIuaW5mbwotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQlpZiBbIC1mIGRpci5pbmZvIF0gOyB0aGVuIFwKLQkgICQoSU5TVEFMTF9EQVRBKSBkaXIuaW5mbyAkKGluZm9kaXIpL2Rpci5pbmZvIDsgXAotCWVsc2UgdHJ1ZSA7IGZpCi0KLWxvY2FsLWNsZWFuOgotCS1ybSAtZiAqLmEgVEVNUCBlcnJzIGNvcmUgKi5vICp+IFwjKiBUQUdTICouRSAqLmxvZwotCi1sb2NhbC1kaXN0Y2xlYW46Ci0JLXJtIC1mIE1ha2VmaWxlIGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIG1oLWZyYWcgbXQtZnJhZwotCS1pZiBbICIkKFRBUkdFVF9TVUJESVIpIiAhPSAiLiIgXTsgdGhlbiBcCi0JICBybSAtcmYgJChUQVJHRVRfU1VCRElSKTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQotbG9jYWwtbWFpbnRhaW5lci1jbGVhbjoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotY2xlYW46IGRvLWNsZWFuIGxvY2FsLWNsZWFuCi1tb3N0bHljbGVhbjogZG8tbW9zdGx5Y2xlYW4gbG9jYWwtY2xlYW4KLWRpc3RjbGVhbjogZG8tZGlzdGNsZWFuIGxvY2FsLWNsZWFuIGxvY2FsLWRpc3RjbGVhbgotbWFpbnRhaW5lci1jbGVhbjogbG9jYWwtbWFpbnRhaW5lci1jbGVhbiBkby1tYWludGFpbmVyLWNsZWFuIGxvY2FsLWNsZWFuIAotbWFpbnRhaW5lci1jbGVhbjogbG9jYWwtZGlzdGNsZWFuCi1yZWFsY2xlYW46IG1haW50YWluZXItY2xlYW4KLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBjbGVhbiBzcGVjaWZpYyBtb2R1bGVzLgotLlBIT05ZOiAkKENMRUFOX01PRFVMRVMpICQoQ0xFQU5fWDExX01PRFVMRVMpIGNsZWFuLWdjYwotJChDTEVBTl9NT0RVTEVTKSAkKENMRUFOX1gxMV9NT0RVTEVTKSBjbGVhbi1nY2M6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jbGVhbi0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGNsZWFuKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogJChDTEVBTl9UQVJHRVRfTU9EVUxFUykKLSQoQ0xFQU5fVEFSR0VUX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2xlYW4tdGFyZ2V0LS8vJ2A7IFwKLQlybSAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQ7IFwKLQlpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07ICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgY2xlYW4pOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotY2xlYW4tdGFyZ2V0OiAkKENMRUFOX1RBUkdFVF9NT0RVTEVTKQotCi0jIENoZWNrIHRhcmdldC4KLQotLlBIT05ZOiBjaGVjawotY2hlY2s6ICQoQ0hFQ0tfTU9EVUxFUykgXAotCSQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpIFwKLQkkKENIRUNLX1gxMV9NT0RVTEVTKSBcCi0JY2hlY2stZ2NjCi0KLSMgQXV0b21hdGVkIHJlcG9ydGluZyBvZiB0ZXN0IHJlc3VsdHMuCi0KLXdhcm5pbmcubG9nOiBidWlsZC5sb2cKLQkkKHNyY2RpcikvY29udHJpYi93YXJuX3N1bW1hcnkgYnVpbGQubG9nID4gJEAKLQotbWFpbC1yZXBvcnQubG9nOgotCWlmIHRlc3QgeCckKEJPT1RfQ0ZMQUdTKScgIT0geCcnOyB0aGVuIFwKLQkgICAgQk9PVF9DRkxBR1M9JyQoQk9PVF9DRkxBR1MpJzsgZXhwb3J0IEJPT1RfQ0ZMQUdTOyBcCi0JZmk7IFwKLQkkKHNyY2RpcikvY29udHJpYi90ZXN0X3N1bW1hcnkgLXQgPiRACi0JY2htb2QgK3ggJEAKLQllY2hvIElmIHlvdSByZWFsbHkgd2FudCB0byBzZW5kIGUtbWFpbCwgcnVuIC4vJEAgbm93Ci0KLW1haWwtcmVwb3J0LXdpdGgtd2FybmluZ3MubG9nOiB3YXJuaW5nLmxvZwotCWlmIHRlc3QgeCckKEJPT1RfQ0ZMQUdTKScgIT0geCcnOyB0aGVuIFwKLQkgICAgQk9PVF9DRkxBR1M9JyQoQk9PVF9DRkxBR1MpJzsgZXhwb3J0IEJPT1RfQ0ZMQUdTOyBcCi0JZmk7IFwKLQkkKHNyY2RpcikvY29udHJpYi90ZXN0X3N1bW1hcnkgLXQgLWkgd2FybmluZy5sb2cgPiRACi0JY2htb2QgK3ggJEAKLQllY2hvIElmIHlvdSByZWFsbHkgd2FudCB0byBzZW5kIGUtbWFpbCwgcnVuIC4vJEAgbm93Ci0KLSMgSW5zdGFsbGF0aW9uIHRhcmdldHMuCi0KLS5QSE9OWTogaW5zdGFsbCBpbnN0YWxsLWNyb3NzIHVuaW5zdGFsbCBzb3VyY2UtdmF1bHQgYmluYXJ5LXZhdWx0IHZhdWx0LWluc3RhbGwKLWluc3RhbGw6ICQoSU5TVEFMTF9UQVJHRVQpIAotaW5zdGFsbC1jcm9zczogJChJTlNUQUxMX1RBUkdFVF9DUk9TUykgCi0KLXVuaW5zdGFsbDoKLQlAZWNobyAidGhlIHVuaW5zdGFsbCB0YXJnZXQgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHRyZWUiCi0KLXNvdXJjZS12YXVsdDoKLQkkKE1BS0UpIC1mIC4vcmVsZWFzZS9CdWlsZC1BLVJlbGVhc2UgXAotCQlob3N0PSQoaG9zdF9hbGlhcykgc291cmNlLXZhdWx0Ci0KLWJpbmFyeS12YXVsdDoKLQkkKE1BS0UpIC1mIC4vcmVsZWFzZS9CdWlsZC1BLVJlbGVhc2UgXAotCQlob3N0PSQoaG9zdF9hbGlhcykgdGFyZ2V0PSQodGFyZ2V0X2FsaWFzKQotCi12YXVsdC1pbnN0YWxsOgotCUBpZiBbIC1mIC4vcmVsZWFzZS92YXVsdC1pbnN0YWxsIF0gOyB0aGVuIFwKLQkgIC4vcmVsZWFzZS92YXVsdC1pbnN0YWxsICQoaG9zdF9hbGlhcykgJCh0YXJnZXRfYWxpYXMpIDsgXAotCWVsc2UgXAotCSAgdHJ1ZSA7IFwKLQlmaQotCi0uUEhPTlk6IGluc3RhbGwuYWxsCi1pbnN0YWxsLmFsbDogaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzCi0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAotCQlyPWBwd2RgIDsgZXhwb3J0IHIgOyBcCi0JCSQoU0VUX0xJQl9QQVRIKSBcCi0JCShjZCAuL2djYzsgXAotCQkkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgaW5zdGFsbC1oZWFkZXJzKSA7IFwKLQllbHNlIFwKLQkJdHJ1ZSA7IFwKLQlmaQotCi0jIGluZXQtaW5zdGFsbCBpcyB1c2VkIGJlY2F1c2UgdGhlIEkqTmV0IHdhbnRzIERlamFHTlUgaW5zdGFsbGVkIGJ1dAotIyBub3QgYnVpbHQuICBTaW1pbGFybHksIGd6aXAgaXMgYnVpbHQgYnV0IG5vdCBpbnN0YWxsZWQuCi1pbmV0LWluc3RhbGw6Ci0JJChNQUtFKSBJTlNUQUxMX01PRFVMRVM9ImBlY2hvICQoSU5TVEFMTF9NT0RVTEVTKSB8IHNlZCAtZSAncy9pbnN0YWxsLWRlamFnbnUvLycgLWUgJ3MvaW5zdGFsbC1nemlwLy8nYCIgaW5zdGFsbAotCi0jIGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcyBpcyB1c2VkIGJlY2F1c2UgQ3lnbnVzIGNhbiBub3QgZGlzdHJpYnV0ZQotIyB0aGUgZml4ZWQgaGVhZGVyIGZpbGVzLgotLlBIT05ZOiBpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMKLWluc3RhbGwtbm8tZml4ZWRpbmNsdWRlczogXAotCWluc3RhbGxkaXJzIFwKLQkkKElOU1RBTExfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykgXAotCSQoSU5TVEFMTF9YMTFfTU9EVUxFUykgXAotCWdjYy1uby1maXhlZGluY2x1ZGVzIAotCi0jIEluc3RhbGwgdGhlIGdjYyBoZWFkZXJzIGZpbGVzLCBidXQgbm90IHRoZSBmaXhlZCBpbmNsdWRlIGZpbGVzLAotIyB3aGljaCBDeWdudXMgaXMgbm90IGFsbG93ZWQgdG8gZGlzdHJpYnV0ZS4gIFRoaXMgcnVsZSBpcyB2ZXJ5Ci0jIGRlcGVuZGVudCBvbiB0aGUgd29ya2luZ3Mgb2YgdGhlIGdjYyBNYWtlZmlsZS5pbi4KLS5QSE9OWTogZ2NjLW5vLWZpeGVkaW5jbHVkZXMKLWdjYy1uby1maXhlZGluY2x1ZGVzOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF07IHRoZW4gXAotCSAgcm0gLXJmIGdjYy90bXAtaW5jbHVkZTsgXAotCSAgbXYgZ2NjL2luY2x1ZGUgZ2NjL3RtcC1pbmNsdWRlIDI+L2Rldi9udWxsOyBcCi0JICBta2RpciBnY2MvaW5jbHVkZTsgXAotCSAgY3AgJChzcmNkaXIpL2djYy9nc3lzbGltaXRzLmggZ2NjL2luY2x1ZGUvc3lzbGltaXRzLmg7IFwKLQkgIHRvdWNoIGdjYy9zdG1wLWZpeGluYyBnY2MvaW5jbHVkZS9maXhlZDsgXAotCSAgcm0gLWYgZ2NjL3N0bXAtaGVhZGVycyBnY2Mvc3RtcC1pbnQtaGRyczsgXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYCA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIC4vZ2NjOyBcCi0JICAgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCSAgcm0gLXJmIGdjYy9pbmNsdWRlOyBcCi0JICBtdiBnY2MvdG1wLWluY2x1ZGUgZ2NjL2luY2x1ZGUgMj4vZGV2L251bGw7IFwKLQllbHNlIHRydWU7IGZpCi0KLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBidWlsZCB0aGUgbW9kdWxlcyB3aGljaCB1c2UgRkxBR1NfVE9fUEFTUy4gIFRvCi0jIGJ1aWxkIGEgdGFyZ2V0IGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgYWxsLgotIwotIyBhbGwtZ3VpLCBhbmQgYWxsLWxpYnByb2MgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJlY2F1c2UKLSMgdGhleSBhcmUgc3RpbGwgZXhwZXJpbWVudGFsLCBhbmQgaWYgdGhleSBmYWlsIHRvIGJ1aWxkLCB0aGF0Ci0jIHNob3VsZG4ndCBzdG9wICJtYWtlIGFsbCIuCi0uUEhPTlk6ICQoQUxMX01PRFVMRVMpIGFsbC1ndWkgYWxsLWxpYnByb2MKLSQoQUxMX01PRFVMRVMpIGFsbC1ndWkgYWxsLWxpYnByb2M6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9hbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGVzZSBydWxlcyBhcmUgdXNlZCB0byBjaGVjayB0aGUgbW9kdWxlcyB3aGljaCB1c2UgRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgY2hlY2stWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGNoZWNrLiAgU29tZQotIyBtb2R1bGVzIGFyZSBvbmx5IHRlc3RlZCBpbiBhIG5hdGl2ZSB0b29sY2hhaW4uCi0KLS5QSE9OWTogJChDSEVDS19NT0RVTEVTKSAkKE5BVElWRV9DSEVDS19NT0RVTEVTKSAkKENST1NTX0NIRUNLX01PRFVMRVMpCi0kKE5BVElWRV9DSEVDS19NT0RVTEVTKToKLQlAaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLQkgIGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jaGVjay0vLydgOyBcCi0JICBpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICAgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICAgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICAgJChTRVRfTElCX1BBVEgpIFwKLQkgICAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBjaGVjayk7IFwKLQkgIGVsc2UgXAotCSAgICB0cnVlOyBcCi0JICBmaTsgXAotCWZpCi0KLSQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jaGVjay0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gaW5zdGFsbCB0aGUgbW9kdWxlcyB3aGljaCB1c2UgRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgaW5zdGFsbC4KLS5QSE9OWTogJChJTlNUQUxMX01PRFVMRVMpCi0kKElOU1RBTExfTU9EVUxFUyk6IGluc3RhbGxkaXJzCi0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9pbnN0YWxsLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbW9kdWxlcyB3aGljaCBhcmUgYnVpbHQgd2l0aCB0aGUKLSMgdGFyZ2V0IHRvb2xzLgotLlBIT05ZOiAkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykKLSQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NvbmZpZ3VyZS10YXJnZXQtLy8nYDsgXAotCWlmIFsgLWQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9IF07IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICQoQ0NfRk9SX1RBUkdFVCkgLS1wcmludC1tdWx0aS1saWIgPiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0IDI+IC9kZXYvbnVsbDsgXAotCSAgaWYgWyAtcyAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0IF07IHRoZW4gXAotCSAgICBpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQgXTsgdGhlbiBcCi0JICAgICAgaWYgY21wICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCA+IC9kZXYvbnVsbDsgdGhlbiBcCi0JCXJtIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQ7IFwKLQkgICAgICBlbHNlIFwKLQkJZWNobyAiTXVsdGlsaWJzIGNoYW5nZWQgZm9yICQke2Rpcn0sIHJlY29uZmlndXJpbmciOyBcCi0JCXJtIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlOyBcCi0JCW12ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dDsgXAotCSAgICAgIGZpOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIG12ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dDsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlmaTsgZXhpdCAwCSMgYnJlYWsgY29tbWFuZCBpbnRvIHR3byBwaWVjZXMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NvbmZpZ3VyZS10YXJnZXQtLy8nYDsgXAotCWlmIFsgISAtZCAkKFRBUkdFVF9TVUJESVIpIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsaWYgZWNobyAiICQoVEFSR0VUX0NPTkZJR0RJUlMpICIgfCBncmVwICIgJCR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpZiBbIC1kICQoc3JjZGlyKS8kJHtkaXJ9IF07IHRoZW4gXAotCSAgICBbIC1kICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfSBdIHx8IG1rZGlyICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTtcCi0JICAgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICAgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICAgJChTRVRfTElCX1BBVEgpIFwKLQkgICAgQVI9IiQoQVJfRk9SX1RBUkdFVCkiOyBleHBvcnQgQVI7IFwKLQkgICAgQVM9IiQoQVNfRk9SX1RBUkdFVCkiOyBleHBvcnQgQVM7IFwKLQkgICAgQ0M9IiQoQ0NfRk9SX1RBUkdFVCkiOyBleHBvcnQgQ0M7IFwKLQkgICAgQ0ZMQUdTPSIkKENGTEFHU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDRkxBR1M7IFwKLQkgICAgQ1hYPSIkKENYWF9GT1JfVEFSR0VUKSI7IGV4cG9ydCBDWFg7IFwKLQkgICAgQ1hYRkxBR1M9IiQoQ1hYRkxBR1NfRk9SX1RBUkdFVCkiOyBleHBvcnQgQ1hYRkxBR1M7IFwKLQkgICAgRExMVE9PTD0iJChETExUT09MX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IERMTFRPT0w7IFwKLQkgICAgTEQ9IiQoTERfRk9SX1RBUkdFVCkiOyBleHBvcnQgTEQ7IFwKLSAgICAgICAgICAgIExERkxBR1M9IiQoTERGTEFHU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBMREZMQUdTOyBcCi0JICAgIE5NPSIkKE5NX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IE5NOyBcCi0JICAgIFJBTkxJQj0iJChSQU5MSUJfRk9SX1RBUkdFVCkiOyBleHBvcnQgUkFOTElCOyBcCi0JICAgIFdJTkRSRVM9IiQoV0lORFJFU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBXSU5EUkVTOyBcCi0JICAgIGVjaG8gQ29uZmlndXJpbmcgaW4gJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgIGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgXAotCSAgICBjYXNlICQoc3JjZGlyKSBpbiBcCi0JICAgIC8qKSBcCi0JICAgICAgdG9wZGlyPSQoc3JjZGlyKSA7OyBcCi0JICAgICopIFwKLQkgICAgICBjYXNlICIkKFRBUkdFVF9TVUJESVIpIiBpbiBcCi0JICAgICAgLikgdG9wZGlyPSIuLi8kKHNyY2RpcikiIDs7IFwKLQkgICAgICAqKSB0b3BkaXI9Ii4uLy4uLyQoc3JjZGlyKSIgOzsgXAotCSAgICAgIGVzYWMgOzsgXAotCSAgICBlc2FjOyBcCi0JICAgIGlmIFsgIiQoc3JjZGlyKSIgPSAiLiIgXSA7IHRoZW4gXAotCSAgICAgIGlmIFsgIiQoVEFSR0VUX1NVQkRJUikiICE9ICIuIiBdIDsgdGhlbiBcCi0JCWlmICQoU0hFTEwpICQkcy9zeW1saW5rLXRyZWUgJCR7dG9wZGlyfS8kJHtkaXJ9ICJuby1zdWNoLWZpbGUiIDsgdGhlbiBcCi0JCSAgaWYgWyAtZiBNYWtlZmlsZSBdOyB0aGVuIFwKLQkJICAgIGlmICQoTUFLRSkgZGlzdGNsZWFuOyB0aGVuIFwKLQkJICAgICAgdHJ1ZTsgXAotCQkgICAgZWxzZSBcCi0JCSAgICAgIGV4aXQgMTsgXAotCQkgICAgZmk7IFwKLQkJICBlbHNlIFwKLQkJICAgIHRydWU7IFwKLQkJICBmaTsgXAotCQllbHNlIFwKLQkJICBleGl0IDE7IFwKLQkJZmk7IFwKLQkgICAgICBlbHNlIFwKLQkJdHJ1ZTsgXAotCSAgICAgIGZpOyBcCi0JICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0uIjsgXAotCSAgICAgIGxpYnNyY2Rpcj0iLiI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0kJHt0b3BkaXJ9LyQke2Rpcn0iOyBcCi0JICAgICAgbGlic3JjZGlyPSIkJHMvJCR7ZGlyfSI7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgWyAtZiAkJHtsaWJzcmNkaXJ9L2NvbmZpZ3VyZSBdIDsgdGhlbiBcCi0JICAgICAgcm0gLWYgbm8tc3VjaC1maWxlIHNraXAtdGhpcy1kaXI7IFwKLQkgICAgICBDT05GSUdfU0lURT1uby1zdWNoLWZpbGUgJChTSEVMTCkgJCR7bGlic3JjZGlyfS9jb25maWd1cmUgXAotCQkkKENPTkZJR19BUkdVTUVOVFMpICQke3NyY2Rpcm9wdGlvbn0gXAotCQktLXdpdGgtdGFyZ2V0LXN1YmRpcj0iJChUQVJHRVRfU1VCRElSKSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgcm0gLWYgbm8tc3VjaC1maWxlIHNraXAtdGhpcy1kaXI7IFwKLQkgICAgICBDT05GSUdfU0lURT1uby1zdWNoLWZpbGUgJChTSEVMTCkgJCRzL2NvbmZpZ3VyZSBcCi0JCSQoQ09ORklHX0FSR1VNRU5UUykgJCR7c3JjZGlyb3B0aW9ufSBcCi0JCS0td2l0aC10YXJnZXQtc3ViZGlyPSIkKFRBUkdFVF9TVUJESVIpIjsgXAotCSAgICBmaTsgXAotCSAgICBpZiBbIC1mIHNraXAtdGhpcy1kaXIgXSA7IHRoZW4gXAotCSAgICAgIHNoIHNraXAtdGhpcy1kaXI7IFwKLQkgICAgICBybSAtZiBza2lwLXRoaXMtZGlyOyBcCi0JICAgICAgY2QgLi47IHJtZGlyICQke2Rpcn0gfHwgdHJ1ZTsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIFwKLQkgICAgdHJ1ZTsgXAotCSAgZmk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0uUEhPTlk6ICQoQUxMX1RBUkdFVF9NT0RVTEVTKQotJChBTExfVEFSR0VUX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvYWxsLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyAkKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgaW5zdGFsbC4KLS5QSE9OWTogJChDSEVDS19UQVJHRVRfTU9EVUxFUykKLSQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stdGFyZ2V0LS8vJ2A7IFwKLQlpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07JChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBjaGVjayk7XAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gaW5zdGFsbCB0aGUgbW9kdWxlcyB3aGljaCB1c2UKLSMgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuICBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWAotIyBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpCi0kKElOU1RBTExfVEFSR0VUX01PRFVMRVMpOiBpbnN0YWxsZGlycwotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvaW5zdGFsbC10YXJnZXQtLy8nYDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgXAotCSAgICAkKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBidWlsZCB0aGUgbW9kdWxlcyB3aGljaCB1c2UgWDExX0ZMQUdTX1RPX1BBU1MuCi0jIFRvIGJ1aWxkIGEgdGFyZ2V0IGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgYWxsLgotLlBIT05ZOiAkKEFMTF9YMTFfTU9EVUxFUykKLSQoQUxMX1gxMV9NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2FsbC0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgXAotCSAgICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkKFgxMV9GTEFHU19UT19QQVNTKSBhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBjaGVjayB0aGUgbW9kdWxlcyB3aGljaCB1c2UgWDExX0ZMQUdTX1RPX1BBU1MuCi0jIFRvIGJ1aWxkIGEgdGFyZ2V0IGNoZWNrLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0uUEhPTlk6ICQoQ0hFQ0tfWDExX01PRFVMRVMpCi0kKENIRUNLX1gxMV9NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyBcCi0JICAgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoWDExX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gaW5zdGFsbCB0aGUgbW9kdWxlcyB3aGljaCB1c2UgWDExX0ZMQUdTX1RPX1BBU1MuCi0jIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGluc3RhbGwuCi0uUEhPTlk6ICQoSU5TVEFMTF9YMTFfTU9EVUxFUykKLSQoSU5TVEFMTF9YMTFfTU9EVUxFUyk6IGluc3RhbGxkaXJzCi0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9pbnN0YWxsLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyBcCi0JICAgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoWDExX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBnY2MgaXMgdGhlIG9ubHkgbW9kdWxlIHdoaWNoIHVzZXMgR0NDX0ZMQUdTX1RPX1BBU1MuCi0uUEhPTlk6IGFsbC1nY2MKLWFsbC1nY2M6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIEJ1aWxkaW5nIEdDQyB1c2VzIHNvbWUgdG9vbHMgZm9yIHJlYnVpbGRpbmcgInNvdXJjZSIgZmlsZXMKLSMgbGlrZSB0ZXhpbmZvLCBiaXNvbi9ieWFjYywgZXRjLiAgU28gd2UgbXVzdCBkZXBlbmQgb24gdGhvc2UuCi0jCi0jIFdoaWxlIGJ1aWxkaW5nIEdDQywgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBydW4gdmFyaW91cyB0YXJnZXQKLSMgcHJvZ3JhbXMgbGlrZSB0aGUgYXNzZW1ibGVyLCBsaW5rZXIsIGV0Yy4gIFNvIHdlIGRlcGVuZCBvbgotIyB0aG9zZSB0b28uCi0jCi0jIEluIHRoZW9yeSwgb24gYW4gU01QIGFsbCB0aG9zZSBkZXBlbmRlbmNpZXMgY2FuIGJlIHJlc29sdmVkCi0jIGluIHBhcmFsbGVsLgotIwotLlBIT05ZOiBib290c3RyYXAgYm9vdHN0cmFwLWxlYW4gYm9vdHN0cmFwMiBib290c3RyYXAyLWxlYW4gYm9vdHN0cmFwMyBib290c3RyYXAzLWxlYW4gYm9vdHN0cmFwNCBib290c3RyYXA0LWxlYW4KLWJvb3RzdHJhcCBib290c3RyYXAtbGVhbiBib290c3RyYXAyIGJvb3RzdHJhcDItbGVhbiBib290c3RyYXAzIGJvb3RzdHJhcDMtbGVhbiBib290c3RyYXA0IGJvb3RzdHJhcDQtbGVhbjogYWxsLXRleGluZm8gYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLQlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQllY2hvICJCb290c3RyYXBwaW5nIHRoZSBjb21waWxlciI7IFwKLQljZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgJEAKLQlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JY2FzZSAiJEAiIGluIFwKLQkgICpib290c3RyYXA0LWxlYW4gKSBcCi0JCQltc2c9IkNvbXBhcmluZyBzdGFnZTMgYW5kIHN0YWdlNCBvZiB0aGUgY29tcGlsZXIiOyBcCi0JICAJCWNvbXBhcmU9Y29tcGFyZTMtbGVhbiA7OyBcCi0JICAqYm9vdHN0cmFwNCApIG1zZz0iQ29tcGFyaW5nIHN0YWdlMyBhbmQgc3RhZ2U0IG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlMyA7OyBcCi0JICAqLWxlYW4gKQltc2c9IkNvbXBhcmluZyBzdGFnZTIgYW5kIHN0YWdlMyBvZiB0aGUgY29tcGlsZXIiOyBcCi0JICAJCWNvbXBhcmU9Y29tcGFyZS1sZWFuIDs7IFwKLQkgICogKQkJbXNnPSJDb21wYXJpbmcgc3RhZ2UyIGFuZCBzdGFnZTMgb2YgdGhlIGNvbXBpbGVyIjsgXAotCSAgCQljb21wYXJlPWNvbXBhcmUgOzsgXAotCWVzYWM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWVjaG8gIiQkbXNnIjsgXAotCWNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSAkJGNvbXBhcmUKLQlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGAgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgcnVudGltZSBsaWJyYXJpZXMiOyBcCi0JJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYWxsCi0KLS5QSE9OWTogY3Jvc3MKLWNyb3NzOiBhbGwtdGV4aW5mbyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWVjaG8gIkJ1aWxkaW5nIHRoZSBDIGFuZCBDKysgY29tcGlsZXIiOyBcCi0JY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIExBTkdVQUdFUz0iYyBjKysiCi0JQHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgIDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWVjaG8gIkJ1aWxkaW5nIHJ1bnRpbWUgbGlicmFyaWVzIjsgXAotCSQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpIGFsbCBMQU5HVUFHRVM9ImMgYysrIgotCi0uUEhPTlk6IGNoZWNrLWdjYwotY2hlY2stZ2NjOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBjaGVjayk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0uUEhPTlk6IGluc3RhbGwtZ2NjCi1pbnN0YWxsLWdjYzoKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0uUEhPTlk6IGluc3RhbGwtZ2NjLWNyb3NzCi1pbnN0YWxsLWdjYy1jcm9zczoKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgTEFOR1VBR0VTPSJjIGMrKyIgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotIyBFWFBFUklNRU5UQUwgU1RVRkYKLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gaW5zdGFsbCB0aGUgbW9kdWxlcyB3aGljaCB1c2UgRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgaW5zdGFsbC4KLS5QSE9OWTogaW5zdGFsbC1kb3NyZWwKLWluc3RhbGwtZG9zcmVsOiBpbnN0YWxsZGlycyBpbmZvCi0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9pbnN0YWxsLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi1pbnN0YWxsLWRvc3JlbC1mYWtlOgotCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgaW50ZXItZGVwZW5kZW5jaWVzIGFtb25nIG1vZHVsZXMuCi1hbGwtYXBhY2hlOgotYWxsLWFzaDoKLWFsbC1hdXRvY29uZjogYWxsLW00IGFsbC10ZXhpbmZvCi1hbGwtYXV0b21ha2U6IGFsbC1tNCBhbGwtdGV4aW5mbwotYWxsLWJhc2g6Ci1hbGwtYmZkOiBhbGwtbGliaWJlcnR5IGFsbC1pbnRsCi1hbGwtYmludXRpbHM6IGFsbC1saWJpYmVydHkgYWxsLW9wY29kZXMgYWxsLWJmZCBhbGwtZmxleCBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1pbnRsCi1hbGwtYmlzb246IGFsbC10ZXhpbmZvCi1jb25maWd1cmUtdGFyZ2V0LWJzcDogJChBTExfR0NDKQotYWxsLXRhcmdldC1ic3A6IGNvbmZpZ3VyZS10YXJnZXQtYnNwIGFsbC1nY2MgYWxsLWJpbnV0aWxzIGFsbC10YXJnZXQtbmV3bGliCi1hbGwtYnlhY2M6Ci1hbGwtYnppcDI6Ci1hbGwtY3Zzc3JjOgotY29uZmlndXJlLXRhcmdldC1jeWdtb246ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtY3lnbW9uOiBjb25maWd1cmUtdGFyZ2V0LWN5Z21vbiBhbGwtZ2FzIGFsbC1sZCBhbGwtZ2NjIGFsbC10YXJnZXQtbGliaWJlcnR5IGFsbC10YXJnZXQtbmV3bGliIGFsbC10YXJnZXQtbGliaW8gYWxsLXRhcmdldC1saWJzdHViIGFsbC10YXJnZXQtYnNwCi1hbGwtZGI6Ci1hbGwtZGVqYWdudTogYWxsLXRjbCBhbGwtZXhwZWN0IGFsbC10awotYWxsLWRpZmY6IGFsbC1saWJpYmVydHkKLWFsbC1lbWFjczoKLWFsbC1lbWFjczE5OiBhbGwtYmlzb24gYWxsLWJ5YWNjCi1hbGwtZXRjOgotY29uZmlndXJlLXRhcmdldC1leGFtcGxlczogJChBTExfR0NDKQotYWxsLXRhcmdldC1leGFtcGxlczogY29uZmlndXJlLXRhcmdldC1leGFtcGxlcwotYWxsLWV4cGVjdDogYWxsLXRjbCBhbGwtdGsKLWFsbC1maWxldXRpbHM6IGFsbC1saWJpYmVydHkKLWFsbC1maW5kdXRpbHM6Ci1hbGwtZmluZDoKLWFsbC1mbGV4OiBhbGwtbGliaWJlcnR5IGFsbC1iaXNvbiBhbGwtYnlhY2MKLWFsbC1nYXM6IGFsbC1saWJpYmVydHkgYWxsLW9wY29kZXMgYWxsLWJmZCBhbGwtaW50bAotYWxsLWdhc2g6IGFsbC10Y2wKLWFsbC1nYXdrOgotQUxMX0dDQyA9IGFsbC1nY2MKLWFsbC1nY2M6IGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWxkCi1hbGwtYm9vdHN0cmFwOiBhbGwtbGliaWJlcnR5IGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWxkCi1HREJfVEsgPSBhbGwtdGsgYWxsLXRjbCBhbGwtaXRjbCBhbGwtdGl4IGFsbC1saWJndWkKLWFsbC1nZGI6IGFsbC1saWJpYmVydHkgYWxsLW9wY29kZXMgYWxsLWJmZCBhbGwtbW1hbGxvYyBhbGwtcmVhZGxpbmUgYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtc2ltICQoZ2RibmxtcmVxdWlyZW1lbnRzKSAkKEdEQl9USykKLWFsbC1nZXR0ZXh0OgotYWxsLWdudXNlcnY6Ci1jb25maWd1cmUtdGFyZ2V0LWdwZXJmOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWdwZXJmOiBjb25maWd1cmUtdGFyZ2V0LWdwZXJmIGFsbC10YXJnZXQtbGliaWJlcnR5IGFsbC10YXJnZXQtbGlic3RkYysrCi1hbGwtZ3Byb2Y6IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcyBhbGwtaW50bAotYWxsLWdyZXo6IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcwotYWxsLWd1aTogYWxsLWdkYiBhbGwtbGlicHJvYyBhbGwtdGFyZ2V0LWxpYnJ4Ci1hbGwtZ3VpbGU6Ci1hbGwtZ3ppcDogYWxsLWxpYmliZXJ0eQotYWxsLWhlbGxvOiBhbGwtbGliaWJlcnR5Ci1hbGwtaW5kZW50OgotYWxsLWluZXQ6IGFsbC10Y2wgYWxsLXNlbmQtcHIgYWxsLXBlcmwKLWFsbC1pbnRsOgotYWxsLWlzcGVsbDogYWxsLWVtYWNzMTkKLWFsbC1pdGNsOiBhbGwtdGNsIGFsbC10ayBhbGwtdGNsOC4xIGFsbC10azguMQotYWxsLWxkOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMgYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtZmxleCBhbGwtaW50bAotY29uZmlndXJlLXRhcmdldC1saWJnKys6ICQoQUxMX0dDQykgY29uZmlndXJlLXRhcmdldC1saWJyeAotYWxsLXRhcmdldC1saWJnKys6IGNvbmZpZ3VyZS10YXJnZXQtbGliZysrIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbyBhbGwtdGFyZ2V0LWxpYnJ4IGFsbC10YXJnZXQtbGlic3RkYysrCi1jb25maWd1cmUtdGFyZ2V0LWxpYmdsb3NzOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWxpYmdsb3NzOiBjb25maWd1cmUtdGFyZ2V0LWxpYmdsb3NzIGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliCi1jb25maWd1cmUtdGFyZ2V0LWxpYmlvOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWxpYmlvOiBjb25maWd1cmUtdGFyZ2V0LWxpYmlvIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIKLWNoZWNrLXRhcmdldC1saWJpbzoKLWFsbC1saWJndWk6IGFsbC10Y2wgYWxsLXRrIGFsbC10Y2w4LjEgYWxsLXRrOC4xIGFsbC1pdGNsCi1hbGwtbGliaWJlcnR5OgotY29uZmlndXJlLXRhcmdldC1saWJyeDogJChBTExfR0NDKSBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYgotYWxsLXRhcmdldC1saWJyeDogY29uZmlndXJlLXRhcmdldC1saWJyeAotY29uZmlndXJlLXRhcmdldC1saWJzdGRjKys6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGlic3RkYysrOiBjb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKyBhbGwtZ2FzIGFsbC1sZCBhbGwtZ2NjIGFsbC10YXJnZXQtbGliaWJlcnR5IGFsbC10YXJnZXQtbmV3bGliIGFsbC10YXJnZXQtbGliaW8KLWNvbmZpZ3VyZS10YXJnZXQtbGlic3R1YjogJChBTExfR0NDKQotYWxsLXRhcmdldC1saWJzdHViOiBjb25maWd1cmUtdGFyZ2V0LWxpYnN0dWIKLWFsbC1saWJ0b29sOgotYWxsLW00OiBhbGwtbGliaWJlcnR5Ci1hbGwtbWFrZTogYWxsLWxpYmliZXJ0eQotYWxsLW1tYWxsb2M6Ci1jb25maWd1cmUtdGFyZ2V0LW5ld2xpYjogJChBTExfR0NDKQotY29uZmlndXJlLXRhcmdldC1saWJ0ZXJtY2FwOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LW5ld2xpYjogY29uZmlndXJlLXRhcmdldC1uZXdsaWIgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWdjYwotYWxsLXRhcmdldC1saWJ0ZXJtY2FwOiBjb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXAgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWdjYwotYWxsLW9wY29kZXM6IGFsbC1iZmQgYWxsLWxpYmliZXJ0eQotYWxsLXBhdGNoOiBhbGwtbGliaWJlcnR5Ci1hbGwtcGVybDoKLWFsbC1wcm1zOiBhbGwtbGliaWJlcnR5Ci1hbGwtcmNzOgotYWxsLXJlYWRsaW5lOgotYWxsLXJlY29kZTogYWxsLWxpYmliZXJ0eQotYWxsLXNlZDogYWxsLWxpYmliZXJ0eQotYWxsLXNlbmQtcHI6IGFsbC1wcm1zCi1hbGwtc2hlbGx1dGlsczoKLWFsbC1zaW06IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcyBhbGwtcmVhZGxpbmUKLWFsbC10YXI6IGFsbC1saWJpYmVydHkKLWFsbC10Y2w6Ci1hbGwtdGNsOC4xOgotYWxsLXRjbFg6IGFsbC10Y2wgYWxsLXRrCi1hbGwtdGs6IGFsbC10Y2wKLWFsbC10azguMTogYWxsLXRjbDguMQotYWxsLXRleGluZm86IGFsbC1saWJpYmVydHkKLWFsbC10ZXh0dXRpbHM6Ci1hbGwtdGdhczogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzCi1hbGwtdGltZToKLWFsbC10aXg6IGFsbC10Y2wgYWxsLXRrIGFsbC10Y2w4LjEgYWxsLXRrOC4xCi1hbGwtd2RpZmY6Ci1hbGwtdGFyZ2V0LXdpbnN1cDogYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1saWJ0ZXJtY2FwIGNvbmZpZ3VyZS10YXJnZXQtd2luc3VwCi1jb25maWd1cmUtdGFyZ2V0LXdpbnN1cDogY29uZmlndXJlLXRhcmdldC1uZXdsaWIKLWFsbC11dWRlY29kZTogYWxsLWxpYmliZXJ0eQotYWxsLXppcDoKLWNvbmZpZ3VyZS10YXJnZXQtbGliaWJlcnR5OiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWxpYmliZXJ0eTogY29uZmlndXJlLXRhcmdldC1saWJpYmVydHkgYWxsLWdjYyBhbGwtbGQgYWxsLXRhcmdldC1uZXdsaWIKLWFsbC10YXJnZXQ6ICQoQUxMX1RBUkdFVF9NT0RVTEVTKQotaW5zdGFsbC10YXJnZXQ6ICQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykKLWluc3RhbGwtZ2RiOiBpbnN0YWxsLXRjbCBpbnN0YWxsLXRrIGluc3RhbGwtaXRjbCBpbnN0YWxsLXRpeCBpbnN0YWxsLWxpYmd1aQotIyMjIG90aGVyIHN1cHBvcnRpbmcgdGFyZ2V0cwotCi1NQUtFRElSUz0gXAotCSQocHJlZml4KSBcCi0JJChleGVjX3ByZWZpeCkKLS5QSE9OWTogaW5zdGFsbGRpcnMKLWluc3RhbGxkaXJzOiBta2luc3RhbGxkaXJzCi0JJChTSEVMTCkgJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChNQUtFRElSUykKLQotZGlyLmluZm86IGRvLWluc3RhbGwtaW5mbwotCWlmIFsgLWYgJChzcmNkaXIpL3RleGluZm8vZ2VuLWluZm8tZGlyIF0gOyB0aGVuIFwKLQkgICQoc3JjZGlyKS90ZXhpbmZvL2dlbi1pbmZvLWRpciAkKGluZm9kaXIpICQoc3JjZGlyKS90ZXhpbmZvL2Rpci5pbmZvLXRlbXBsYXRlID4gZGlyLmluZm8ubmV3IDsgXAotCSAgbXYgLWYgZGlyLmluZm8ubmV3IGRpci5pbmZvIDsgXAotCWVsc2UgdHJ1ZSA7IFwKLQlmaQotCi1kaXN0OgotCUBlY2hvICJCdWlsZGluZyBhIGZ1bGwgZGlzdHJpYnV0aW9uIG9mIHRoaXMgdHJlZSBpc24ndCBkb25lIgotCUBlY2hvICJ2aWEgJ21ha2UgZGlzdCcuICBDaGVjayBvdXQgdGhlIGV0Yy8gc3ViZGlyZWN0b3J5IiAKLQotZXRhZ3MgdGFnczogVEFHUwotCi0jIFJpZ2h0IG5vdyB0aGlzIGp1c3QgYnVpbGRzIFRBR1MgaW4gZWFjaCBzdWJkaXJlY3RvcnkuICBlbWFjczE5IGhhcyB0aGUKLSMgYWJpbGl0eSB0byB1c2Ugc2V2ZXJhbCB0YWdzIGZpbGVzIGF0IG9uY2UsIHNvIHRoZXJlIGlzIHByb2JhYmx5IG5vIG5lZWQKLSMgdG8gY29tYmluZSB0aGVtIGludG8gb25lIGJpZyBUQUdTIGZpbGUgKGxpa2UgQ1ZTIDEuMyBkb2VzKS4gIFdlIGNvdWxkCi0jIChpZiB3ZSBmZWx0IGxpa2UgaXQpIGhhdmUgdGhpcyBNYWtlZmlsZSB3cml0ZSBhIHBpZWNlIG9mIGVsaXNwIHdoaWNoCi0jIHRoZSB1c2VyIGNvdWxkIGxvYWQgdG8gdGVsbCBlbWFjczE5IHdoZXJlIGFsbCB0aGUgVEFHUyBmaWxlcyB3ZSBqdXN0Ci0jIGJ1aWx0IGFyZS4KLVRBR1M6IGRvLVRBR1MKLQotIyB3aXRoIHRoZSBnbnUgbWFrZSwgdGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWd1cmUuaW4gJChob3N0X21ha2VmaWxlX2ZyYWcpICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpICQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIwotIyBTdXBwb3J0IGZvciBidWlsZGluZyBuZXQgcmVsZWFzZXMKLQotIyBGaWxlcyBpbiBkZXZvIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1ERVZPX1NVUFBPUlQ9IFJFQURNRSBNYWtlZmlsZS5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKLQljb25maWcuZ3Vlc3MgY29uZmlnLmlmIGNvbmZpZy5zdWIgY29uZmlnIG1vdmUtaWYtY2hhbmdlIFwKLQltcHctUkVBRE1FIG1wdy1idWlsZC5pbiBtcHctY29uZmlnLmluIG1wdy1jb25maWd1cmUgbXB3LWluc3RhbGwgXAotCUNPUFlJTkcgQ09QWUlORy5MSUIgaW5zdGFsbC1zaCBjb25maWctbWwuaW4gc3ltbGluay10cmVlIFwKLQlta2luc3RhbGxkaXJzIGx0Y29uZmlnIGx0bWFpbi5zaCBtaXNzaW5nIHlsd3JhcAotCi0jIEZpbGVzIGluIGRldm8vZXRjIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1FVENfU1VQUE9SVD0gTWFrZWZpbGUuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBzdGFuZGFyZHMudGV4aSBcCi0JbWFrZS1zdGRzLnRleGkgc3RhbmRhcmRzLmluZm8qCi0KLSMgV2hlbiB5b3UgdXNlIGBtYWtlIHNldHVwLWRpcnMnIG9yIGBtYWtlIHRheicgeW91IHNob3VsZCBhbHdheXMgcmVkZWZpbmUKLSMgdGhpcyBtYWNyby4KLVNVUFBPUlRfRklMRVMgPSBsaXN0LW9mLXN1cHBvcnQtZmlsZXMtZm9yLXRvb2wtaW4tcXVlc3Rpb24KLQotLlBIT05ZOiB0YXoKLQotdGF6OiAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSB0ZXhpbmZvL3RleGluZm8udGV4Ci0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gYSBmZXcgcGxhY2VzLgotCXNlZCAtZSAnL15hbGxcLm5vcm1hbDogL3MvXGFsbC10ZXhpbmZvIC8vJyBcCi0JICAgIC1lICcvXglpbnN0YWxsLXRleGluZm8gL2QnIFwKLQk8TWFrZWZpbGUuaW4gPnRtcAotCW12IC1mIHRtcCBNYWtlZmlsZS5pbgotCSMKLQkuL2NvbmZpZ3VyZSBzdW40Ci0JWyAteiAiJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIiBdIFwKLQkgIHx8ICQoTUFLRSkgJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIEFMTF9HQ0M9IiIgXAotCSAgICBDQ19GT1JfVEFSR0VUPSIkKENDKSIgQ1hYX0ZPUl9UQVJHRVQ9IiQoQ1hYKSIKLQkjIE1ha2UgbGlua3MsIGFuZCBydW4gIm1ha2UgZGlzdHN0dWZmIiBvciAibWFrZSBpbmZvIiB3aGVuIG5lZWRlZC4KLQlybSAtcmYgcHJvdG8tdG9wbGV2IDsgbWtkaXIgcHJvdG8tdG9wbGV2Ci0Jc2V0IC1lIDsgZGlycz0iJChUT09MKSAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSIgOyBcCi0JZm9yIGQgaW4gJCRkaXJzIDsgZG8gXAotCSAgaWYgWyAtZCAkJGQgXTsgdGhlbiBcCi0JICAgIGlmIFsgISAtZiAkJGQvTWFrZWZpbGUgXSA7IHRoZW4gdHJ1ZSA7IFwKLQkgICAgZWxpZiBncmVwICdeZGlzdHN0dWZmOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkJKGNkICQkZCA7ICQoTUFLRSkgZGlzdHN0dWZmICkgfHwgZXhpdCAxIDsgXAotCSAgICBlbGlmIGdyZXAgJ15pbmZvOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkgICAgICAgIChjZCAkJGQgOyAkKE1BS0UpIGluZm8gKSB8fCBleGl0IDEgOyBcCi0JICAgIGZpIDsgXAotCSAgICBpZiBbIC1kICQkZC9wcm90by0kJGQuZGlyIF07IHRoZW4gXAotCSAgICAgIGxuIC1zIC4uLyQkZC9wcm90by0kJGQuZGlyIHByb3RvLXRvcGxldi8kJGQgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGxuIC1zIC4uLyQkZCBwcm90by10b3BsZXYvJCRkIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgbG4gLXMgLi4vJCRkIHByb3RvLXRvcGxldi8kJGQgOyBmaSA7IFwKLQlkb25lCi0JY2QgZXRjIDsgJChNQUtFKSBpbmZvCi0JJChNQUtFKSBkaXN0Y2xlYW4KLQkjCi0JbWtkaXIgcHJvdG8tdG9wbGV2L2V0YwotCShjZCBwcm90by10b3BsZXYvZXRjOyBcCi0JIGZvciBpIGluICQoRVRDX1NVUFBPUlQpOyBkbyBcCi0JCWxuIC1zIC4uLy4uL2V0Yy8kJGkgLiA7IFwKLQkgZG9uZSkKLQkjCi0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gY29uZmlndXJhYmxlIGRpcnMKLQlybSBwcm90by10b3BsZXYvY29uZmlndXJlLmluCi0Jc2VkIC1lICcvXmhvc3RfdG9vbHM9L3MvdGV4aW5mbyAvLycgXAotCSAgICA8Y29uZmlndXJlLmluID5wcm90by10b3BsZXYvY29uZmlndXJlLmluCi0JIwotCW1rZGlyIHByb3RvLXRvcGxldi90ZXhpbmZvCi0JbG4gLXMgLi4vLi4vdGV4aW5mby90ZXhpbmZvLnRleAkJcHJvdG8tdG9wbGV2L3RleGluZm8vCi0JaWYgdGVzdCAtciB0ZXhpbmZvL3V0aWwvdGV4M3BhdGNoIDsgdGhlbiBcCi0JICBta2RpciBwcm90by10b3BsZXYvdGV4aW5mby91dGlsICYmIFwKLQkgIGxuIC1zIC4uLy4uLy4uL3RleGluZm8vdXRpbC90ZXgzcGF0Y2gJcHJvdG8tdG9wbGV2L3RleGluZm8vdXRpbCA7IFwKLQllbHNlIHRydWU7IGZpCi0JY2htb2QgLVIgb2c9dSAuIHx8IGNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgCi0JaWYgZ3JlcCBBTV9JTklUX0FVVE9NQUtFICQoVE9PTCkvY29uZmlndXJlLmluID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICB2ZXI9YHNlZCA8ICQoVE9PTCkvY29uZmlndXJlLmluIC1uICdzL0FNX0lOSVRfQVVUT01BS0VbXixdKiwgKlwoW14pXSpcKSkvXDEvcCdgOyBcCi0JZWxzZSBcCi0JICB2ZXI9YHNlZCA8JChUT09MKS9NYWtlZmlsZS5pbiAtbiAncy9eVkVSU0lPTiAqPSAqLy9wJ2A7IFwKLQlmaTsgXAotCWlmIHRlc3QgeCIkKFBBQ0tBR0UpIiA9IHg7IHRoZW4gXAotCSAgcGFja2FnZT0iJChUT09MKSI7IFwKLQllbHNlIFwKLQkgIHBhY2thZ2U9IiQoUEFDS0FHRSkiOyBcCi0JZmk7IFwKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIGRvLXRhci1iejIgVE9PTD0kKFRPT0wpIFZFUj0kJHZlciBQQUNLQUdFPSQkcGFja2FnZQotCi1kby10YXItYnoyOgotCWVjaG8gIj09PiBNYWtpbmcgJChQQUNLQUdFKS0kKFZFUikudGFyLmJ6MiIKLQktcm0gLWYgJChQQUNLQUdFKS0kKFZFUikKLQlsbiAtcyBwcm90by10b3BsZXYgJChQQUNLQUdFKS0kKFZFUikKLQl0YXIgY2ZoICQoUEFDS0FHRSktJChWRVIpLnRhciAkKFBBQ0tBR0UpLSQoVkVSKQotCSQoQlpJUFBST0cpIC12IC05ICQoUEFDS0FHRSktJChWRVIpLnRhcgotCi1URVhJTkZPX1NVUFBPUlQ9IHRleGluZm8vdGV4aW5mby50ZXgKLURJU1RfU1VQUE9SVD0gJChERVZPX1NVUFBPUlQpICQoVEVYSU5GT19TVVBQT1JUKQotCi0uUEhPTlk6IGdhcy50YXIuYnoyCi1HQVNfU1VQUE9SVF9ESVJTPSBiZmQgaW5jbHVkZSBsaWJpYmVydHkgb3Bjb2RlcyBpbnRsIHNldHVwLmNvbSBtYWtlZmlsZS52bXMgbWtkZXAKLWdhcy50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHQVNfU1VQUE9SVF9ESVJTKSBnYXMKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdhcyBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR0FTX1NVUFBPUlRfRElSUykiCi0KLSMgVGhlIEZTRiAiYmludXRpbHMiIHJlbGVhc2UgaW5jbHVkZXMgZ3Byb2YgYW5kIGxkLgotLlBIT05ZOiBiaW51dGlscy50YXIuYnoyCi1CSU5VVElMU19TVVBQT1JUX0RJUlM9IGJmZCBnYXMgaW5jbHVkZSBsaWJpYmVydHkgb3Bjb2RlcyBsZCBncHJvZiBpbnRsIHNldHVwLmNvbSBtYWtlZmlsZS52bXMgbWtkZXAKLWJpbnV0aWxzLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEJJTlVUSUxTX1NVUFBPUlRfRElSUykgYmludXRpbHMKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWJpbnV0aWxzIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChCSU5VVElMU19TVVBQT1JUX0RJUlMpIgotCi0uUEhPTlk6IGdhcytiaW51dGlscy50YXIuYnoyCi1HQVNCX1NVUFBPUlRfRElSUz0gJChHQVNfU1VQUE9SVF9ESVJTKSBiaW51dGlscyBsZCBncHJvZgotZ2FzK2JpbnV0aWxzLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdBU0JfU1VQUE9SVF9ESVJTKSBnYXMKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdhcyBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR0FTQl9TVVBQT1JUX0RJUlMpIgotCi0uUEhPTlk6IGxpYmcrKy50YXIuYnoyCi1MSUJHWFhfU1VQUE9SVF9ESVJTPWluY2x1ZGUgbGlic3RkYysrIGxpYmlvIGxpYnJ4IGxpYmliZXJ0eQotbGliZysrLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSBsaWJnKysKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWxpYmcrKyBcCi0JCVNVUFBPUlRfRklMRVM9IiQoTElCR1hYX1NVUFBPUlRfRElSUykiCi0KLUdOQVRTX1NVUFBPUlRfRElSUz1pbmNsdWRlIGxpYmliZXJ0eSBzZW5kLXByCi1nbmF0cy50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHTkFUU19TVVBQT1JUX0RJUlMpIGduYXRzCi0JJChNQUtFKSAtZiAgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z25hdHMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEdOQVRTX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogZ2RiLnRhci5iejIKLUdEQl9TVVBQT1JUX0RJUlM9IGJmZCBpbmNsdWRlIGxpYmliZXJ0eSBtbWFsbG9jIG9wY29kZXMgcmVhZGxpbmUgc2ltIHV0aWxzIGludGwKLWdkYi50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHREJfU1VQUE9SVF9ESVJTKSBnZGIKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdkYiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR0RCX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogZGVqYWdudS50YXIuYnoyCi1ERUpBR05VX1NVUFBPUlRfRElSUz0gIHRjbCBleHBlY3QgbGliaWJlcnR5Ci1kZWphZ251LnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKERFSkFHTlVfU1VQUE9SVF9ESVJTKSBkZWphZ251Ci0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1kZWphZ251IFwKLQkJU1VQUE9SVF9GSUxFUz0iJChERUpBR05VX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogZ2RiK2RlamFnbnUudGFyLmJ6MgotR0RCRF9TVVBQT1JUX0RJUlM9ICQoR0RCX1NVUFBPUlRfRElSUykgdGNsIGV4cGVjdCBkZWphZ251Ci1nZGIrZGVqYWdudS50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHREJEX1NVUFBPUlRfRElSUykgZ2RiCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1nZGIgUEFDS0FHRT1nZGIrZGVqYWdudSBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR0RCRF9TVVBQT1JUX0RJUlMpIgotCi0uUEhPTlk6IGluc2lnaHQudGFyLmJ6MgotSU5TSUdIVF9TVVBQT1JUX0RJUlM9ICQoR0RCX1NVUFBPUlRfRElSUykgdGNsIHRrIGl0Y2wgdGl4IGxpYmd1aQotaW5zaWdodC50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHREJfU1VQUE9SVF9ESVJTKSBnZGIKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdkYiBQQUNLQUdFPWluc2lnaHQgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKElOU0lHSFRfU1VQUE9SVF9ESVJTKSIKLQotLlBIT05ZOiBpbnNpZ2h0K2RlamFnbnUudGFyLmJ6MgotSU5TSUdIVERfU1VQUE9SVF9ESVJTPSAkKElOU0lHSFRfU1VQUE9SVF9ESVJTKSBleHBlY3QgZGVqYWdudQotaW5zaWdodCtkZWphZ251LnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKElOU0lHSFREX1NVUFBPUlRfRElSUykgZ2RiCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1nZGIgUEFDS0FHRT0iaW5zaWdodCtkZWphZ251IiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoSU5TSUdIVERfU1VQUE9SVF9ESVJTKSIKLQotLlBIT05ZOiBuZXdsaWIudGFyLmJ6MgotTkVXTElCX1NVUFBPUlRfRElSUz1saWJnbG9zcwotIyB0YXogY29uZmlndXJlcyBmb3IgdGhlIHN1bjQgdGFyZ2V0IHdoaWNoIHdvbid0IGNvbmZpZ3VyZSBuZXdsaWIuCi0jIFdlIG5lZWQgbmV3bGliIGNvbmZpZ3VyZWQgc28gdGhhdCB0aGUgLmluZm8gZmlsZXMgYXJlIG1hZGUuCi0jIFVuZm9ydHVuYXRlbHksIGl0IGlzIG5vdCBlbm91Z2ggdG8ganVzdCBjb25maWd1cmUgbmV3bGliIHNlcGFyYXRlbHk6Ci0jIHRheiB3aWxsIGJ1aWxkIHRoZSAuaW5mbyBmaWxlcyBidXQgc2luY2UgU1VCRElSUyB3b24ndCBjb250YWluIG5ld2xpYiwKLSMgZGlzdGNsZWFuIHdvbid0IGJlIHJ1biAobGVhdmluZyBNYWtlZmlsZSwgY29uZmlnLnN0YXR1cywgYW5kIHRoZSB0bXAgZmlsZXMKLSMgdXNlZCBpbiBidWlsZGluZyB0aGUgLmluZm8gZmlsZXMsIGVnOiAqLmRlZiwgKi5yZWYpLgotIyBUaGUgcHJvYmxlbSBpc24ndCBzb2x2YWJsZSBob3dldmVyIHdpdGhvdXQgYSBsb3Qgb2YgZXh0cmEgd29yayBiZWNhdXNlCi0jIHRhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIHN1YmRpciAkKHRhcmdldF9hbGlhcykgd2hpY2ggZ2V0cyBudWtlZCBkdXJpbmcKLSMgdGhlIG1ha2UgZGlzdGNsZWFuLiAgRm9yIG5vdyBwdW50IG9uIHRoZSBpc3N1ZSBvZiBzaGlwcGluZyBuZXdsaWIgaW5mbyBmaWxlcwotIyB3aXRoIG5ld2xpYiBuZXQgcmVsZWFzZXMgYW5kIHdhaXQgZm9yIGEgZGF5IHdoZW4gc29tZSBuYXRpdmUgdGFyZ2V0IChzdW40PykKLSMgc3VwcG9ydHMgbmV3bGliIChpZiBvbmx5IG1pbmltYWxseSkuCi1uZXdsaWIudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoTkVXTElCX1NVUFBPUlRfRElSUykgbmV3bGliCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1uZXdsaWIgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKE5FV0xJQl9TVVBQT1JUX0RJUlMpIiBcCi0JCURFVk9fU1VQUE9SVD0iJChERVZPX1NVUFBPUlQpIENPUFlJTkcuTkVXTElCIiBuZXdsaWIKLQotLk5PRVhQT1JUOgotTUFLRU9WRVJSSURFUz0KLQotIyBlbmQgb2YgTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwZTQzNi4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0JCSAgIFJFQURNRSBmb3IgR05VIGRldmVsb3BtZW50IHRvb2xzCi0KLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHZhcmlvdXMgR05VIGNvbXBpbGVycywgYXNzZW1ibGVycywgbGlua2VycywgCi1kZWJ1Z2dlcnMsIGV0Yy4sIHBsdXMgdGhlaXIgc3VwcG9ydCByb3V0aW5lcywgZGVmaW5pdGlvbnMsIGFuZCBkb2N1bWVudGF0aW9uLgotCi1JZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGFzIHBhcnQgb2YgYSBHREIgcmVsZWFzZSwgc2VlIHRoZSBmaWxlIGdkYi9SRUFETUUuCi1JZiB3aXRoIGEgYmludXRpbHMgcmVsZWFzZSwgc2VlIGJpbnV0aWxzL1JFQURNRTsgIGlmIHdpdGggYSBsaWJnKysgcmVsZWFzZSwKLXNlZSBsaWJnKysvUkVBRE1FLCBldGMuICBUaGF0J2xsIGdpdmUgeW91IGluZm8gYWJvdXQgdGhpcwotcGFja2FnZSAtLSBzdXBwb3J0ZWQgdGFyZ2V0cywgaG93IHRvIHVzZSBpdCwgaG93IHRvIHJlcG9ydCBidWdzLCBldGMuCi0KLUl0IGlzIG5vdyBwb3NzaWJsZSB0byBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBhbmQgYnVpbGQgYSB2YXJpZXR5IG9mCi10b29scyB3aXRoIG9uZSBjb21tYW5kLiAgVG8gYnVpbGQgYWxsIG9mIHRoZSB0b29scyBjb250YWluZWQgaGVyZWluLAotcnVuIHRoZSBgYGNvbmZpZ3VyZScnIHNjcmlwdCBoZXJlLCBlLmcuOgotCi0JLi9jb25maWd1cmUgCi0JbWFrZQotCi1UbyBpbnN0YWxsIHRoZW0gKGJ5IGRlZmF1bHQgaW4gL3Vzci9sb2NhbC9iaW4sIC91c3IvbG9jYWwvbGliLCBldGMpLAotdGhlbiBkbzoKLQltYWtlIGluc3RhbGwKLQotKElmIHRoZSBjb25maWd1cmUgc2NyaXB0IGNhbid0IGRldGVybWluZSB5b3VyIHR5cGUgb2YgY29tcHV0ZXIsIGdpdmUgaXQKLXRoZSBuYW1lIGFzIGFuIGFyZ3VtZW50LCBmb3IgaW5zdGFuY2UgYGAuL2NvbmZpZ3VyZSBzdW40JycuICBZb3UgY2FuCi11c2UgdGhlIHNjcmlwdCBgYGNvbmZpZy5zdWInJyB0byB0ZXN0IHdoZXRoZXIgYSBuYW1lIGlzIHJlY29nbml6ZWQ7IGlmCi1pdCBpcywgY29uZmlnLnN1YiB0cmFuc2xhdGVzIGl0IHRvIGEgdHJpcGxldCBzcGVjaWZ5aW5nIENQVSwgdmVuZG9yLAotYW5kIE9TLikKLQotSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb21waWxlciBvbiB5b3VyIHN5c3RlbSwgaXQgaXMgb2Z0ZW4gYmVzdCB0bwotZXhwbGljaXRseSBzZXQgQ0MgaW4gdGhlIGVudmlyb25tZW50IGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZSwgYW5kIHRvCi1hbHNvIHNldCBDQyB3aGVuIHJ1bm5pbmcgbWFrZS4gIEZvciBleGFtcGxlIChhc3N1bWluZyBzaC9iYXNoL2tzaCk6Ci0KLQlDQz1nY2MgLi9jb25maWd1cmUKLQltYWtlCi0KLUEgc2ltaWxhciBleGFtcGxlIHVzaW5nIGNzaDoKLQotCXNldGVudiBDQyBnY2MKLQkuL2NvbmZpZ3VyZQotCW1ha2UKLQotTXVjaCBvZiB0aGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBlbmNsb3NlZCBpcyBjb3B5cmlnaHQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIG9yCi1DT1BZSU5HLkxJQiBpbiB0aGUgdmFyaW91cyBkaXJlY3RvcmllcywgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0ZXJtcyB1bmRlciB3aGljaCB5b3UgY2FuIGNvcHkgdGhlIGZpbGVzLgotCi1SRVBPUlRJTkcgQlVHUzogQWdhaW4sIHNlZSBnZGIvUkVBRE1FLCBiaW51dGlscy9SRUFETUUsIGV0Yy4sIGZvciBpbmZvCi1vbiB3aGVyZSBhbmQgaG93IHRvIHJlcG9ydCBwcm9ibGVtcy4KZGlmZiAtLWdpdCBhL2JmZC9DT1BZSU5HIGIvYmZkL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvYmZkL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0MCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0MCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQwKLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQwKLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nIGIvYmZkL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmN2ViNS4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjMwMiArMCwwIEBACi0yMDAwLTAzLTMxICBUaG9tYXMgZGUgTGVsbGlzICA8dGRlbEB3cnMuY29tPgotCi0JKiBzcmVjLmMgOiBTZXQgQ0hVTksgc2l6ZSB0byAxNiBieXRlcyB0byBwcmV2ZW50IGRvd25sb2FkIGZhaWx1cmVzCi0Jb24gc29tZSB0YXJnZXRzLgotCSogaWhleC5jIDogRGl0dG8uCi0KLVdlZCBNYXIgMzAgMTU6Mjg6MDAgMjAwMCAgRG9uYWxkIExpbmRzYXkgIDxkbGluZHNheUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2dlbmVyaWNfcmVsb2MpOiBuZXcgZnVuY3Rpb24uICBBbGwKLQlIT1dUTyByZWZlcmVuY2VzIHRvIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgdGhhdCBoYXZlCi0JcGFydGlhbF9pbnBsYWNlID09IHRydWUsIG5vdyB1c2UgdGhlIG5ldyBmdW5jdGlvbi4gIFRoZSBmdW5jdGlvbgotCWlzIGJhc2VkIG9uIHRoZSByZWNlbnQgcmV3cml0ZSBvZiBtMzJyX2VsZl9sbzE2X3JlbG9jKCksIGFuZAotCWV4dGVuZHMgaXRzIGZpeGVzIHRvIHRoZSBSX00zMlJfezE2LDI0LDMyfSByZWxvY3MuCi0JVGhlIG5ldyBsb2dpYyBpbiBtMzJyX2VsZl9sbzE2X3JlbG9jKCkgaGFzIGJlZW4gcmVtb3ZlZCwgYW5kCi0JaXQgaW5zdGVhZCBjYWxscyB0aGUgbmV3IHJvdXRpbmUgdG8gb2J0YWluIHRoYXQgZnVuY3Rpb25hbGl0eS4KLQotMjAwMC0wMy0yNyAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbT4KLQotCSogZWxmMzItYXZyLmMgKGVsZjMyX2F2cl9nY19tYXJrX2hvb2ssIGVsZjMyX2F2cl9nY19zd2VlcF9ob29rLAotCWVsZjMyX2F2cl9jaGVja19yZWxvY3MsIGF2cl9maW5hbF9saW5rX3JlbG9jYXRlLAotCWVsZjMyX2F2cl9yZWxvY2F0ZV9zZWN0aW9uLCBiZmRfZWxmX2F2cl9maW5hbF93cml0ZV9wcm9jZXNzaW5nLAotCWVsZjMyX2F2cl9vYmplY3RfcCk6IEFkZCBwcm90b3R5cGVzLgotCShlbGYzMl9hdnJfZ2NfbWFya19ob29rKTogQWRkIGRlZmF1bHQgZm9yIGgtPnJvb3QudHlwZS4KLQkoYmZkX2VsZl9hdnJfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IE1ha2Ugc3RhdGljLgotCi0yMDAwLTAzLTI3ICBEZW5pcyBDaGVydHlrb3YgIDxkZW5pc2NAb3ZlcnRhLnJ1PgotCi0JKiBjcHUtYXZyLmM6IE5ldyBmaWxlLiAgQkZEIHN1cHBvcnQgcm91dGluZXMgZm9yIEFWUiBhcmNoaXRlY3R1cmUuCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIEFWUiBhcmNoaXRlY3R1cmUuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIHJlZmVyZW5jZSB0byBBVlIgYXJjaGl0ZWN0dXJlIGluZm8uCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX2F2ci4KLQkqIHJlbG9jLmM6IEFkZCB2YXJpb3VzIEFWUiByZWxvY2F0aW9uIGVudW1zLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfYXZyX3ZlYyk6IERlY2xhcmUgYW5kIGFkZCB0byB0YXJnZXQgdmVjdG9yCi0JbGlzdC4KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgQVZSIGVsZi4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0JKiBjb25maWcuYmZkOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlOiBUaGlzIHRvby4KLQkqIGJmZC1pbjIuaDogQW5kIHRoaXMuCi0JKiBsaWJiZmQuaDogQW5kIHRoaXMuCi0KLTIwMDAtMDMtMjQgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfbWVyZ2VfaW5kX3N5bWJvbHMpOiBBZGQgcHJvdG90eXBlLgotCShlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcyk6IExpa2V3aXNlLgotCi0yMDAwLTAzLTE3ICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JKiByZWxvYy5jIChiZmRfY2hlY2tfb3ZlcmZsb3cpOiBJbiBjYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWZsYWcgYW4gb3ZlcmZsb3cgaWYgdGhlIGJpdGZpZWxkIGlzIG91dHNpZGUgLTIqKm4gdG8gMioqbi0xLiAgVGhlCi0JYWxsb3dhYmxlIHJhbmdlIHVzZWQgdG8gYmUgLTIqKihuLTEpIHRvIDIqKm4tMS4KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBTYW1lIGhlcmUuICBBbHNvIHJlcGxhY2UKLQkiYm9vbGVhbiBvdmVyZmxvdyIgd2l0aCAiYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWciLgotCi0yMDAwLTAzLTE0ICBEb3VnIEV2YW5zICA8ZGplQGNhc2V5LnRyYW5zbWV0YS5jb20+Ci0gCi0gICAgICAgICogZWxmMzItbTMyci5jIChtMzJyX2VsZl9sbzE2X3JlbG9jKTogUmV3cml0ZS4KLSAKLTIwMDAtMDMtMTQgIEthenUgSGlyYXRhICA8a2F6dUBoeGkuY29tPgotCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IENvdW50IHRoZSB0b3RhbCBudW1iZXIKLQlvZiBzaHJpbmtzIHByb3Blcmx5LCBpbmNsdWRpbmcgdGhlIGxhc3QgcmVsb2MuCi0KLTIwMDAtMDMtMTMgIEthenUgSGlyYXRhICA8a2F6dUBoeGkuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBGaXggdGhlIHNhbml0eQotCWNoZWNrIGZvciBSX01PVkwyLgotCi0yMDAwLTAzLTExICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGllZWUuYyAoaWVlZV9hcmNoaXZlX3ApOiBSZXR1cm4gYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCBvbiAKLQlhIGZvcm1hdCBtaXNtYXRjaCByYXRoZXIgdGhhbiBhbiAiZXJyb3IiIGZyb20gYmZkX3JlYWQgc3VjaCBhcwotCWJmZF9lcnJvcl9maWxlX3RydW5jYXRlZC4KLQotMjAwMC0wMy0xMCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvIHByb3BlcgotCXNpZ24tZXh0ZW5zaW9uIGFuZCBiaWctZW5kaWFuIGNvbXBlbnNhdGlvbiBmb3IKLSAJUl9NSVBTXzY0IGV2ZW4gaW4gbGQgLXIuCi0KLTIwMDAtMDMtMTAgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9uZXh0X3JlbG9jYXRpb24pOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX25leHRfbG8xNl9yZWxvY2F0aW9uLCBhbmQgZ2VuZXJhbGl6ZSB0byBsb29rCi0JZm9yIGFueSByZWxvY2F0aW9uIHR5cGUuCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogTWFrZSBSX01JUFNfUEMxNiBwY3JlbF9vZmZzZXQuCi0JKGVsZl9taXBzX2dudV9yZWxfaGkxNik6IEhvd3RvIGZvciBSX01JUFNfR05VX1JFTF9ISTE2LgotCShlbGZfbWlwc19nbnVfcmVsX2xvMTYpOiBIb3d0byBmb3IgUl9NSVBTX0dOVV9SRUxfTE8xNi4KLQkoZWxmX21pcHNfZ251X3JlbDE2X3MyKTogSG93dG8gZm9yIFJfTUlQU19HTlVfUkVMMTZfUzIuCi0JKGVsZl9taXBzX2dudV9wY3JlbDY0KTogSG93dG8gZm9yIFJfTUlQU19QQzY0LgotCShlbGZfbWlwc19nbnVfcGNyZWwzMik6IEhvd3RvIGZvciBSX01JUFNfUEMzMi4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBuZXcgcmVsb2NzLgotCShtaXBzX3J0eXBlX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogSGFuZGxlIG5ldyByZWxvY3MuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJFTF9ISTE2L1JFTF9MTzE2IHJlbG9jcwotCWFyZSBwYWlyZWQuICBUaGUgYWRkZW5kIGZvciBSX01JUFNfR05VX1JFTDE2X1MyCi0JaXMgc2hpZnRlZCByaWdodCB0d28gYml0cy4KLQotMjAwMC0wMy0xMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogVW5kbyBlbWFjcyBmb3JtYXR0aW5nIG9mCi0JY29tbWVudCwgYW5kIGVuc3VyZSBpdCBkb2Vzbid0IGhhcHBlbiBhZ2Fpbi4KLQkoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IFNhbWUgaGVyZS4KLQkoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IERvbid0IGJvdGhlciBhc3NpZ25pbmcgdW51c2VkIHNpZ25tYXNrCi0Jc2hpZnQgcmVzdWx0LiAgRml4IHR5cG9zIGluIGNvbW1lbnRzLgotCVJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHRocm91Z2hvdXQgZmlsZS4KLQotMjAwMC0wMy0wNyAgRG91ZyBFdmFucyAgPGRqZUBjYXNleS50cmFuc21ldGEuY29tPgotCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b19zdHJ1Y3QpOiBGaXggcGFydGlhbF9pbnBsYWNlIGNvbW1lbnQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLTIwMDAtMDMtMDYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoc3RydWN0IHBlX0lMRl92YXJzKTogQWRkIHN5bV9wdHJfdGFibGUgYW5kCi0Jc3ltX3B0cl9wdHIgZmllbGRzLgotCShTSVpFT0ZfSUxGX1NZTV9QVFJfVEFCTEUpOiBEZWZpbmUuCi0JKFNJWkVPRl9JTEZfU1RSSU5HUyk6IFJlZGVmaW5lLgotCShwZV9JTEZfbWFrZV9hX3N5bWJvbC1yZWxvYyk6IE5ldyBmdW5jdGlvbi4gIENyZWF0ZXMgYSBzeW1ib2wKLQlyZWxhdGl2ZSByZWxvYywgYXMgb3Bwb3NlZCB0byBhIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2MuCi0JKHBlX0lMRl9tYWtlX2Ffc3ltYm9sKTogU2V0IHRoZSBjbGFzcyBvZiBsb2NhbCBzeW1ib2xzIHRvIENfU1RBVAotCW5vdCBDX0xBQkVMLgotCUFkZCBsZW5ndGggb2Ygc3ltYm9sJ3MgcHJlZml4IHRvIHN0cmluZyBwb2ludGVyLgotCVN0b3JlIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sIGluIHRoZSBzeW1ib2wgcG9pbnRlciB0YWJsZS4KLQkocGVfSUxGX2J1aWxkX2FfYmZkKTogRG8gbm90IGJ1aWxkIC5pZGF0YSQyIG9yIC5pZGF0YSQ3LgotCUluaXRpYWxpc2UgdGhlIHN5bWJvbCBwb2ludGVyIHRhYmxlLgotCVN0b3JlIHRoZSBoaW50IGluIHRoZSBIaW50L05hbWUgdGFibGUuCi0JTWFrZSB0aGUganVtcCByZWxvYyBiZSBzeW1ib2wgcmVhbHRpdmUsIG5vdCBzZWN0aW9uIHJlbGF0aXZlLgotCUNyZWF0ZSBhbiBpbXBvcnQgc3ltYm9sIGZvciBpbXBvcnRlZCBjb2RlLgotCi0yMDAwLTAzLTA2ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiAgQ2hlY2sgZm9yIG51bGwgdHlwZV9wdHIuCi0KLTIwMDAtMDMtMDEgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogUmVtb3ZlIHVudXNlZAotCWFuZCB1bnVzYWJsZSAiI2lmIENIT09TRV9SRUxPQ19TSVpFIi4KLQkqIHBjNTMyLW1hY2guYyAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERpdHRvLgotCSogbmV0YnNkLmggKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBEaXR0by4KLQkqIGhwMzAwaHB1eC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogRGl0dG8uCi0JKiBmcmVlYnNkLmggKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBEaXR0by4KLQkqIGFvdXQtdGljMzAuYyAodGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQotMjAwMC0wMi0yOSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBwZWljb2RlLmggKGp0YWIpOiBNYWtlIGl0IHN0YXRpYy4KLQotCSogY29mZi1zaC5jIChzaF9hbGlnbl9sb2FkX3NwYW4pOiBEZWNsYXJlZCBpZiBDT0ZGX1dJVEhfUEUgaXMKLQlkZWZpbmVkIGFuZCBDT0ZGX0lNQUdFX1dJVEhfUEUgaXMgbm90IGRlZmluZWQuCi0JKF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuKTogRGVmaW5lZCBhcyBzaF9hbGlnbl9sb2FkX3NwYW4gaWYKLQlDT0ZGX1dJVEhfUEUgaXMgZGVmaW5lZCBhbmQgQ09GRl9JTUFHRV9XSVRIX1BFIGlzIG5vdCBkZWZpbmVkLgotCi0yMDAwLTAzLTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBNYWtlCi0JJ3N5bW5keCcgc2lnbmVkIHRvIHByZXZlbnQgY29tcGlsZSB0aW1lIHdhcm5pbmcuCi0KLQkqIGNvZmYtbWNvcmUuYzogUmVtb3ZlIHVudXNlZCBwcm90b3R5cGUgZm9yIHBlX29iamVjdF9wLgotCi0JKiBjb2ZmLXNoLmM6IEFkZCAiI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUiIGFyb3VuZCBzdGF0aWMKLQlmdW5jdGlvbnMgdGhhdCBhcmUgbm90IHVzZWQgd2hlbiBDT0ZGX0lNQUdFX1dJVEhfUEUgaXMKLQlkZWZpbmVkLgotCShzdHJ1Y3Qgc2hfb3Bjb2RlKTogQ2hhbmdlIHR5cGUgb2YgJ2ZsYWdzJyBmaWVsZCB0byB1bnNpZ25lZAotCWxvbmcgc28gdGhhdCBpdCBjYW4gaG9sZCB0aGUgVVNFU0FTIGZsYWcuCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogSW5pdGlhbGlzZSAndGFyZ2V0X25hbWUnLgotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBJbml0aWFsaXNlCi0gICAgICAgICdzeW1fc2VjJy4KLQotCSogZWxmMzItaTM3MC5jOiBBZGQgQVRUUklCVVRFX1VOVVNFRCB0byB1bnVzZWQgZnVuY3Rpb24KLQlwYXJhbWV0ZXJzLgotCVJlbW92ZSB1bnVzdWVkIHZhcmlhYmxlcyBhbmQgY29kZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogRml4IHByb3RvdHlwZS4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19nY19zd2VlcF9ob29rKTogSW5pdGlhbGlzZSAnc2dvdCcgYW5kCi0JJ3NyZWxnb3QnLgotCi0JKiBlbGYzMi1tY29yZS5jIChtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluaXRpYWxpc2UKLQknb2xkaW5zdCcuIAotCi0JKiBlbGYzMi1taXBzLmM6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIHRvIHVudXNlZCBmdW5jdGlvbgotCXBhcmFtZXRlcnMuCi0JUmVtb3ZlIHVudXN1ZWQgdmFyaWFibGVzIGFuZCBjb2RlLgotCShlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2spOiBGaXggcHJvdG90eXBlLgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfc2V0X21hY2hfZnJvbV9mbGFncyk6IFVzZSAnZmxhZ3MnLgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IEFkZCBBVFRSSUJVVEVfVU5VU0VECi0JdG8gdW51c2VkIGZ1bmN0aW9uIHBhcmFtZXRlci4KLQkKLQkqIHBlLW1pcHMuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgdG8gdW51c2VkIGZ1bmN0aW9uCi0JcGFyYW1ldGVycy4KLQlVc2UgRU1QVFlfSE9XVE8gdG8gaW5pdGlhbGlzZSBlbXB0eSBob3d0byBzbG90cy4KLQlSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotCSogcGVpY29kZS5oIChwZV9JTEZfYnVpbGRfYV9iZmQpOiBJbml0aWFsaXNlIGlkNi4JCi0KLTIwMDAtMDMtMDEgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogUGFzcyAidHJ1ZSIgdG8KLQl0aGUgdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjay4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGdldF92YWx1ZSk6IExpa2V3aXNlLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW4pOgotCUxpa2V3aXNlLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtdGljODAuYyAoY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYtbTEwMjAwLmMgKG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItZDEwdi5jIChlbGYzMl9kMTB2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzNzAuYyAoaTM3MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tY29yZS5jIChtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKiBwZS1taXBzLmMgKGNvZmZfcGVfbWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVuKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IFBhc3MgImZhbHNlIiB0byB0aGUKLQl1bmRlZmluZWRfc3ltYm9sIGNhbGxiYWNrIHdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcnkgd2l0aAotCS1Cc3ltYm9saWMgYW5kIHVuZGVmaW5lZCBzeW1ib2xzIGFyZSBhbGxvd2VkLiBPdGhlcndpc2UsIHBhc3MKLQkidHJ1ZSIuCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnQpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotMjAwMC0wMi0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlcyB0byBidWlsZCBwZVtpXS17c2h8bWlwc30ubG8gb2JqZWN0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBtaXBzIGFuZCBzaCBwZSB2ZWN0b3JzLgotCSogY29uZmlndXJlOiByZWdlbmVyYXRlLgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgYXJtLXdpbmNlLCBtaXBzLXBlIGFuZCBzaC1wZQotCXRhcmdldHMuIAotCi0JKiB0YXJnZXRzLmM6IEFkZCBtaXBzIGFuZCBzaCBwZSB2ZWN0b3JzLgotCi0JKiBsaWJwZWkuaCAoY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBPbmx5IGRlZmluZSBpZiBub3QKLQlhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGNvZmZjb2RlLmg6IEFkZCBzdXBwb3J0IGZvciBXaW5DRSBtYWdpYyBudW1iZXJzLgotCi0JKiBwZWlnZW4uYyAocGVfcHJpbnRfcmVsb2MpOiBVcGRhdGUgY29tbWVudCBhbmQgcmVhcnJhbmdlCi0JYXBwZW5kaW5nIG9mIG5ld2xpbmUgY2hhcmFjdGVyLgotCi0JKiBwZWljb2RlLmg6IEFkZCBzdXBwb3J0IGZvciBJbWFnZSBMaWJyYXJ5IEZvcm1hdC4KLQkocGVfSUxGX3ZhcnMpOiBTdHJ1Y3R1cmUgY29udGFpbmluZyBkYXRhIHVzZWQgYnkgSUxGIGNvZGUuCi0JKHBlX0lMRl9tYWtlX2Ffc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4gIENyZWF0ZSBhIHNlY3Rpb24gYmFzZWQKLQlvbiBJTEYgZGF0YS4KLQkocGVfSUxGX21ha2VfYV9yZWxvYyk6IE5ldyBmdW5jdGlvbi4gIENyZWF0ZSBhIHJlbG9jIGJhc2VkIG9uCi0JSUxGIGRhdGEuCi0JKHBlX0lMRl9tYWtlX2Ffc3ltYm9sKTogTmV3IGZ1bmN0aW9uLiAgQ3JlYXRlIGEgc3ltYm9sIGJhc2VkCi0Jb24gSUxGIGRhdGEuCi0JKHBlX0lMRl9zYXZlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4gIFN0b3JlIHRoZSByZWxvY3MgY3JlYXRlZAotCWJ5IHBlX0lMRl9tYWtlX2FfcmVsb2MgaW4gYSBzZWN0aW9uLgotCShwZV9JTEZfYnVpbGRfYV9iZmQpOiBOZXcgZnVuY3Rpb24uICBDcmVhdGUgYSBCRkQgZGVzY3JpYmluZwotCWFuIElMRiBvYmplY3QuCi0JKHBlX0lMRl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbi4gIFJldHVybiBhIGJmZF90YXJnZXQgcG9pbnRlcgotCWZvciBhbiBJTEYgb2JqZWN0LgotCShwZV9iZmRfb2JqZWN0X3ApOiBJZiBhbiBJTEYgb2JqZWN0IGlzIGRldGVjdGVkIGNhbGwKLQlwZV9JTEZfb2JqZWN0X3Agb24gaXQuCi0KLQkqIGNvZmYtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBXaW5DRSByZWxvY3Mgd2hpY2ggYXJlIGRpZmZlcmVudAotCWZyb20gbm9ybWFsIEFSTSBDT0ZGIHJlbG9jcy4KLQkqIHBlLWFybS5jOiBVbnNldCBUQVJHRVRfVU5ERVJTQ09SRSBmb3IgYSBXaW5DRSB0YXJnZXQuCi0KLQkqIGNvZmYtc2guYzogQWRkIHN1cHBvcnQgZm9yIHNoLXBlIHRhcmdldC4KLQkqIHBlLXNoLmM6IE5ldyBmaWxlLiAgU3VwcG9ydCBjb2RlIGZvciBzaC1wZSB0YXJnZXQuCi0JKiBwZWktc2guYzogTmV3IGZpbGUuICBTdXBwb3J0IGNvZGUgZm9yIHNoLXBlIHRhcmdldC4KLQotCSogcGUtbWlwcy5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgY29kZSBmb3IgbWlwcy1wZSB0YXJnZXQuCi0JKiBwZWktbWlwcy5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgY29kZSBmb3IgbWlwcy1wZSB0YXJnZXQuCi0KLTIwMDAtMDItMjcgIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgYnVtcAotCWFyY2hpdGVjdHVyZSBpZiB0aGUgb2JqZWN0IGNhdXNpbmcgdGhlIGJ1bXAgaXMgZHluYW1pYy4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZSwKLQlhbmQgYWxzbyBkb24ndCBpdCBmb3IgbWVtb3J5IG9yZGVyaW5nLgotCShzcGFyYzY0X2VsZl93cml0ZV9yZWxvY3MpOiBUYWtlIHNyY19yZWxhIG91dCBvZiB0aGUgbG9vcC4KLQotMjAwMC0wMi0yNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGR3YXJmMi5jIChyZWFkX2FiYnJldnMpOiBVc2UgX3Jhd19zaXplIGRpcmVjdGx5IHJhdGhlciB0aGFuCi0JY2FsbGluZyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MuCi0JKGRlY29kZV9saW5lX2luZm8pOiBMaWtld2lzZS4KLQkoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBMaWtld2lzZS4KLQotMjAwMC0wMi0yNyAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogTWFrZWZpbGUuYW0gKHN0YW1wLWxpYik6IFVzZSAkKExJQlRPT0wpIC0tY29uZmlnIHRvIGdldCB0aGUKLQluYW1lIG9mIHRoZSBsaWJ0b29sIGRpcmVjdG9yeS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgRmViIDI1IDE4OjM5OjI2IDIwMDAgIFJvZG5leSBCcm93biAoUm9kbmV5QnJvd25AcG1zYy5jb20pCi0KLQkqIHNvbS5jIChTT01fSE9XVE8pOiBEZWZpbmUuCi0JKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogVXNlIGl0LgotCi0yMDAwLTAyLTI1ICBBbGV4YW5kcmUgT2xpdmEgIDxvbGl2YUBsc2QuaWMudW5pY2FtcC5icj4KLQotCSogY29uZmlnLmJmZDogRW5hYmxlIDY0IGJpdCBzdXBwb3J0IGZvciBHTlUvTGludXgvc3BhcmMuCi0KLQkqIGNvbmZpZy5iZmQ6IEVuYWJsZSA2NCBiaXQgc3VwcG9ydCBmb3IgU29sYXJpczcrL3NwYXJjLgotCi0yMDAwLTAyLTI0ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogc29tLmMgKHNvbV9taXNjX3N5bWJvbF9pbmZvKTogIEFkZCBmaWVsZAotCXNlY29uZGFyeV9kZWYuIAotCShzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogIEluaXRpYWxpemUKLQlzZWNvbmRhcnlfZGVmLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IEtlZXAgdHJhY2sKLQlvZiBzZWNvbmRhcnlfZGVmIGZpZWxkLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9XRUFLIHN5bWJvbCBmbGFnCi0JaWYgc2Vjb25kYXJ5X2RlZiBmaWVsZCBpcyBzZXQuCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogSW5pdGlhbGl6ZQotCXNlY29uZGFyeV9kZWYuCi0KLTIwMDAtMDItMjMgIFN0ZXBoYW5lIENhcnJleiAgPHN0Y2FycmV6QHdvcmxkbmV0LmZyPgotCi0JKiBkd2FyZjIuYyAocmVhZF9hZGRyZXNzKTogUmVhZCAxNi1iaXRzIGFkZHJlc3Nlcy4KLQkocGFyc2VfY29tcF91bml0KTogQWNjZXB0IGFkZHJfc2l6ZSA9PSAyLgotCQotMjAwMC0wMi0yMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBiZmQtaW4uaDogVXBkYXRlIGNvcHlyaWdodCBkYXRlLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIGNwdS1pMzcwLmM6IE5ldyBmaWxlLgotCSogZWxmMzItaTM3MC5jOiAgTmV3IGZpbGUuCi0JKiBhcmNodXJlcy5jIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgYmZkX2FyY2hfaTM3MC4KLQkoYmZkX2kzNzBfYXJjaCk6IE5ldy4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX2kzNzBfYXJjaC4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgYmZkX2FyY2hfaTM3MC4KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgSUJNIDM3MCBlbGYuCi0JKiBjb25maWcuYmZkOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0JKiBsaWJiZmQuaCAoYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lcyk6IExpa2V3aXNlLgotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IExpa2V3aXNlLgotCSogdGFyZ2V0cy5jOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLTIwMDAtMDItMjIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogR2l2ZSBhIHdhcm5pbmcgZm9yCi0JaW52YWxpZCByZWxvY2F0aW9uIHR5cGVzLCBhbmQgY2hhbmdlIHRoZW0gdG8gUl8zODZfTk9ORS4KLQotMjAwMC0wMi0yMiAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGEgdmVyc2lvbiBzeW1ib2wgaXMKLQlub3QgZGVmaW5lZCwgZG9uJ3QgYWRkIGEgc2Vjb25kIEVMRl9WRVJfQ0hSLgotCi0gICAgICAgICogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBDYWxsIG91dHB1dF9leHRzeW0gZm9yIGdsb2JhbAotCXN5bWJvbHMgY29udmVydGVkIHRvIGxvY2FsIHN5bWJvbHMgZXZlbiB3aGVuIHN0cmlwcGluZyBhbGwKLQlzeW1ib2xzLgotICAgICAgICAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFByb2Nlc3MgZ2xvYmFsIHN5bWJvbHMgY29udmVydGVkIHRvCi0JbG9jYWwgc3ltYm9scyBldmVuIGlmIHRoZXkgYXJlIGJlaW5nIHN0cmlwcGVkLgotCi0yMDAwLTAyLTIxICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9vY3RldHNfcGVyX2J5dGUpOiBSZXR1cm4gdW5zaWduZWQgaW50LgotCShiZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSk6IERpdHRvLgotCSogbGliYmZkLmMgKGJmZF9yZWFkLCBiZmRfc2Vlayk6IFF1ZWxsIHNpZ25lZCB2cy4gdW5zaWduZWQKLQljb21wYXJpc29uIHdhcm5pbmcuCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyk6IFF1ZWxsIHNpZ25lZAotCXZzLiB1bnNpZ25lZCBjb21wYXJpc29uIHdhcm5pbmcuCi0JKGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKTogU2FtZSBoZXJlLiAgRml4IHBhcmVudGhlc2VzIHRvby4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDb3JyZWN0IDIwMDAtMDEtMjcKLQljaGFuZ2UuICBXaGF0IHdhcyBJIHRoaW5raW5nPwotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9nY19zd2VlcCk6IFNraXAgbm9uLWVsZiBpbnB1dCBiZmRzLgotCShlbGZfZ2Nfc2VjdGlvbnMpOiBTYW1lIGhlcmUuCi0JKGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpOiBBbmQgaGVyZS4KLQotMjAwMC0wMi0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlFTEYgSFBQQSBkb2Vzbid0IHdvcmsgYXQgcHJlc2VudDsgcmVtb3ZlIGl0IHVudGlsIGl0IGRvZXMuCi0JKiBjb25maWcuYmZkOiBDb21tZW50IG91dCBzZXR0aW5nIHRhcmdfZGVmdmVjIHRvCi0JYmZkX2VsZjMyX2hwcGFfdmVjLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBlbGYzMi1ocHBhLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBSZW1vdmUgZWxmMzItaHBwYS5jLgotCShTT1VSQ0VfSEZJTEVTKTogUmVtb3ZlIGVsZjMyLWhwcGEuaCBhbmQgaHBwYV9zdHVicy5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQ29tbWVudCBvdXQgYmZkX2VsZjMyX2hwcGFfdmVjLgotCi0yMDAwLTAyLTE4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogVXNlIGZyZWUoKSwgYmVjYXVzZSB0aGVyZQotCWlzIG5vIGJmZF9mcmVlKCkuICBSZXZlcnQgYmZkX2ZyZWUgcGFydCBvZiBwcmV2aW91cyBjaGFuZ2UuCi0KLTIwMDAtMDItMTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBEb24ndCB1c2UgdmFyaWFibGUtc2l6ZQotCWFycmF5cy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBVc2UgYmZkX2ZyZWUgdG8gcGFpcgotCWJmZF9tYWxsb2MuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2hvd3RvX3RhYmxlXzE2KTogTmV3IHZhcmlhYmxlLgotCSh4Y29mZl9ydHlwZTJob3d0byk6IEhhbmRsZSAxNi1iaXQgdmFyaWFudHMgb2YgMzItYml0IHJlbG9jcy4KLQotMjAwMC0wMi0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcnM2MDAwLmMgKFhDT0ZGQVJNQUdCSUcpOiBOZXcgbWFjcm8uCi0JKHhjb2ZmX2FyX2ZpbGVfaGRyX2JpZyk6IE5ldyBzdHJ1Y3R1cmUuCi0JKFNJWkVPRl9BUl9GSUxFX0hEUl9CSUcpOiBOZXcgbWFjcm8uCi0JKHhjb2ZmX2FyX2hkcl9iaWcpOiBOZXcgc3RydWN0dXJlLgotCShTSVpFT0ZfQVJfSERSX0JJRyk6IE5ldyBtYWNyby4KLQkoeGNvZmZfYmlnX2Zvcm1hdF9wKTogTmV3IG1hY3JvLgotCSh4Y29mZl9hcmRhdGFfYmlnKTogTmV3IG1hY3JvLgotCShhcmNoX3hoZHJfYmlnKTogTmV3IG1hY3JvLgotCSh4Y29mZl9zbHVycF9hcm1hcCk6IEhhbmRsZSBsYXJnZSBhcmNoaXZlcy4KLQkoeGNvZmZfYXJjaGl2ZV9wKTogRGV0ZWN0IGxhcmdlIGFyY2hpdmVzLgotCSh4Y29mZl9yZWFkX2FyX2hkcik6IEhhbmRsZSBsYXJnZSBhcmNoaXZlcy4KLQkoeGNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKTogSGFuZGxlIGxhcmdlIGFyY2hpdmVzLgotCSh4Y29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBIYW5kbGUgbGFyZ2UgYXJjaGl2ZXMuCi0JKHhjb2ZmX3dyaXRlX2FybWFwX29sZCk6IFJlbmFtZSBmcm9tIHhjb2ZmX3dyaXRlX2FybWFwLgotCSh4Y29mZl93cml0ZV9hcm1hcF9iaWcpOiBOZXcgZnVuY3Rpb24uCi0JKHhjb2ZmX3dyaXRlX2FybWFwKTogTmV3IGZ1bmN0aW9uLCBkaXNwYXRjaCB0byBfb2xkIG9yIF9iaWcuCi0JKHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHNfb2xkKTogUmVuYW1lIGZyb20KLQl4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLgotCSh4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzX2JpZyk6IE5ldyBmdW5jdGlvbi4KLQkoeGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IE5ldyBmdW5jdGlvbiwgZGlzcGF0Y2ggdG8gX29sZCBvcgotCV9iaWcuCi0KLTIwMDAtMDItMTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBSZW1vdmUgY29weV9pbmRpcmVjdAotCWFuZCBoaWRlX3N5bWJvbCBtZW1iZXJzLgotCShlbGZfbGlua19oYXNoX2NvcHlfaW5kaXJlY3QpOiBSZW1vdmUuCi0JKGVsZl9saW5rX2hhc2hfaGlkZV9zeW1ib2wpOiBSZW1vdmUuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGVsZl9iYWNrZW5kX2NvcHlfaW5kaXJlY3Rfc3ltYm9sCi0JYW5kIGVsZl9iYWNrZW5kX2hpZGVfc3ltYm9sLgotCShfYmZkX2VsZl9saW5rX2hhc2hfY29weV9pbmRpcmVjdCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9oaWRlX3N5bWJvbCk6IERlY2xhcmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX2NvcHlfaW5kaXJlY3QpOiBSZW1vdmUgdGFibGUgYXJndW1lbnQuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9oaWRlX3N5bWJvbCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IERvbid0IGluaXQga2lsbGVkIG1lbWJlcnMuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSB0aGUgYmVkIGZ1bmN0aW9uCi0JcG9pbnRlcnMgbm90IGVsZl9saW5rX2hhc2hfe2NvcHlfaW5kaXJlY3QsaGlkZV9zeW1ib2x9LgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBMaWtld2lzZS4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF9jb3B5X2luZGlyZWN0X3N5bWJvbCk6IERlZmF1bHQuCi0JKGVsZl9iYWNrZW5kX2hpZGVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZk5OX2JlZCk6IFVwZGF0ZSBmb3IgbmV3IG1lbWJlcnMuCi0KLTIwMDAtMDItMTcgIEtldmluIEJ1ZXR0bmVyICA8a2V2aW5iQHJlZGhhdC5jb20+Ci0KLQkqIHJzNjAwMC1jb3JlLmMgKENPUkVfREFUQV9TSVpFX0ZJRUxELCBDT1JFX0NPTU1fRklFTEQsIFNBVkVfRklFTEQsCi0JU1RBQ0tfRU5EX0FERFIpOiBEZWZpbmUgZm9yIG5ldyBjb3JlIGZpbGUgZm9ybWF0LgotCShMT0FERVJfT0ZGU0VUX0ZJRUxELCBMT0FERVJfUkVHSU9OX1NJWkUsIENPUkVfRFVNUCk6IE5ldyBkZWZpbmVzCi0JZm9yIGhhbmRsaW5nIHRoZSB2YWdhcmllcyBvZiB0aGUgdmFyaW91cyBjb3JlIGZpbGUgc3RydWN0dXJlcyB1c2VkCi0JYnkgQUlYIG92ZXIgdGhlIHllYXJzLgotCShyczYwMDBjb2ZmX2NvcmVfcCwgcnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlLAotCVJzNmtDb3JEYXRhKTogVXNlIGFib3ZlIGRlZmluZXMgdG8gYWRhcHQgY29kZSB0byB1c2UgQUlYIDQuMydzCi0JY29yZV9kdW1weCBzdHJ1Y3R1cmUuCi0KLVRodSBGZWIgMTcgMDA6MDQ6NDggMjAwMCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zaDIsIGJmZF9tYWNoX3NoX2RzcCk6IE5ldyBtYWNyb3MuCi0JKGJmZF9tYWNoX3NoM19kc3ApOiBMaWtld2lzZS4KLQkoYmZkX21hY2hfc2g0KTogUmVpbnN0YXRlLgotCShiZmRfZGVmYXVsdF9zY2FuKTogUmVjb2duaXplIDc0MTAsIDc3MDgsIDc3MjkgYW5kIDc3NTAuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmLXNoLmMgKHN0cnVjdCBzaF9vcGNvZGUpOiBmbGFncyBpcyBubyBsb25nZXIgc2hvcnQuCi0JKFVTRVNBUywgVVNFU0FTX1JFRywgVVNFU1I4LCBTRVRTQVMsIFNFVFNBU19SRUcpOiBOZXcgbWFjcm9zLgotCShzaF9vcGNvZGU0MSwgc2hfb3Bjb2RlNDIpOiBJbnRlZ3JhdGUgYXMgc2hfb3Bjb2RlNDEuCi0JKHNoX29wY29kZTAxLCBzaF9vcGNvZGUwMiwgc2hfb3Bjb2RlNDApOiBBZGQgc2gtZHNwIG9wY29kZXMuCi0JKHNoX29wY29kZTQxLCBzaF9vcGNvZGU0LCBzaF9vcGNvZGU4MCk6IExpa2V3aXNlLgotCShzaF9vcGNvZGVzKTogTm8gbG9uZ2VyIGNvbnN0LgotCShzaF9kc3Bfb3Bjb2RlZjAsIHNoX2RzcF9vcGNvZGVmKTogTmV3IGFycmF5cy4KLQkoc2hfaW5zbl91c2VzX3JlZyk6IENoZWNrIGZvciBVU0VTQVMgYW5kIFVTRVNSOC4KLQkoc2hfaW5zbl9zZXRzX3JlZywgc2hfaW5zbnNfY29uZmxpY3QpOiBDaGVjayBmb3IgU0VUU0FTLgotCShfYmZkX3NoX2FsaWduX2xvYWRfc3Bhbik6IFJldHVybiBlYXJseSBmb3IgU0g0LgotCU1vZGlmeSBzaF9vcGNvZGVzIGxvb2t1cCB0YWJsZSBmb3Igc2gtZHNwIC8gc2gzLWRzcC4KLQlUYWtlIGludG8gYWNjb3VudCB0aGF0IGZpZWxkIGIgb2YgYSBwYXJhbGxlbCBwcm9jZXNzaW5nIGluc24KLQljb3VsZCBiZSBtaXN0YWtlbiBmb3IgYSBzZXBhcmF0ZSBpbnNuLgotCSogY3B1LXNoLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBOZXcgYXJyYXkgZWxlbWVudHMgZm9yCi0Jc2gyLCBzaC1kc3AgYW5kIHNoMy1kc3AuCi0JUmVpbnN0YXRlIGVsZW1lbnQgZm9yIHNoNC4KLQkoU0gyX05FWFQsIFNIX0RTUF9ORVhULCBTSDNfRFNQX05FWFQpOiBOZXcgbWFjcm9zLgotCShTSDRfTkVYVCk6IFJlaW5zdGF0ZS4KLQkoU0gzX05FWFQsIFNIM0VfTkVYVCk6IEFkanVzdC4KLQkqIGVsZi1iZmQuaCAoX3NoX2VsZl9zZXRfbWFjaF9mcm9tX2ZsYWdzKTogRGVjbGFyZS4KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldyBmdW5jdGlvbi4KLQkoc2hfZWxmX2NvcHlfcHJpdmF0ZV9kYXRhLCBzaF9lbGZfc2V0X21hY2hfZnJvbV9mbGFncyk6IExpa2V3aXNlLgotCShzaF9lbGZfbWVyZ2VfcHJpdmF0ZV9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCwgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9iZmRfZmxhZ3MpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGFuZ2UgdG8KLQlzaF9lbGZfbWVyZ2VfcHJpdmF0ZV9kYXRhLgotCi0yMDAwLTAyLTEzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGNvcHlfaW5kaXJlY3QgYW5kCi0JaGlkZV9zeW1ib2wgbWVtYmVycy4KLQkoZWxmX2xpbmtfaGFzaF9jb3B5X2luZGlyZWN0KTogTmV3LgotCShlbGZfbGlua19oYXNoX2hpZGVfc3ltYm9sKTogTmV3LgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBCcmVhayBvdXQgY29weSBmcm9tIAotCWluZGlyZWN0IG5ldyBuZXcgc3ltYm9sIHRvIGVsZi5jLgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBCcmVhayBvdXQgcHJpdmF0aXphdGlvbiBvZgotCW5vbi1leHBvcnRlZCBzeW1ib2wgdG8gZWxmLmMuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX2NvcHlfaW5kaXJlY3QpOiBOZXcuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9oaWRlX3N5bWJvbCk6IE5ldy4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0IGNvcHlfaW5kaXJlY3QgYW5kIGhpZGVfc3ltYm9sLgotCi0yMDAwLTAyLTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc2VjdGlvbi5jIChfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBBZGQgaW5mbyBwYXJhbWV0ZXIuCi0JSWYgaXQgcGFzc2VkIGFzIG5vbi1OVUxMLCB1c2UgaXQgdG8gY2hlY2sgd2hldGhlciBhbnkgaW5wdXQgQkZECi0JaGFzIGFuIGlucHV0IHNlY3Rpb24gd2hpY2ggdXNlcyB0aGlzIG91dHB1dCBzZWN0aW9uLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGJmZC1pbi5oOiBNb3ZlIGRlY2xhcmF0aW9ucyBvZiBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9nZXRfZWxmX3BoZHJzIGluIGZyb20gYmZkLWluMi5oLCBjb3JyZWN0aW5nIHBhdGNoIG9mCi0JMTk5OS0xMS0yOS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMjAwMC0wMi0xMCAgVGltb3RoeSBXYWxsICA8dHdhbGxAY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3N5bV9pbik6IEFkZCBob29rIFNXQVBfU1lNX0lOX1BPU1QgdG8KLQlhbGxvdyBmaW5hbCBtb2RpZmljYXRpb25zIG9mIHN3YXBwZWQtaW4gc3ltYm9sLgotCShjb2ZmX3N3YXBfc3ltX291dCk6IERpdHRvIHdpdGggU1dBUF9TWU1fT1VUX1BPU1QuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IFVzZSBtYWNybwotCVNFQ1RJT05fUkVMQVRJVkVfQUJTT0xVVEVfU1lNQk9MX1AgaWYgZGVmaW5lZCB0byBkZXRlcm1pbmUgd2hldGhlcgotCXN5bWJvbCBpbmRleCBzaG91bGQgYmUgc2V0IHRvIC0xLgotCi1UaHUgRmViIDEwIDIwOjA3OjUwIEdNVCAyMDAwICBUb3NoaXlhc3UgTW9yaXRhICh0b3NoaS5tb3JpdGFAc2VnYS5jb20pCi0KLQkqIGNvZmYtc2guYyAoVVNFUzFfUkVHLCBVU0VTMl9SRUcsIFNFVFMxX1JFRywgU0VUUzJfUkVHLAotCVVTRVNGMV9SRUcsIFVTRVNGMl9SRUcsIFNFVFNGMV9SRUcsIFNFVFNGMl9SRUcpOiBOZXcgbWFjcm9zLgotCSogKHNoX2luc25fc2V0c19yZWcsIHNoX2luc25fc2V0c19mcmVnKTogTmV3IHByb3RvdHlwZXMuCi0JKiAoc2hfaW5zbl9zZXRzX3JlZywgc2hfaW5zbl91c2VzX29yX3NldHNfcmVnLCBzaF9pbnNuc19zZXRzX2ZyZWcsCi0Jc2hfaW5zbnNfdXNlc19vcl9zZXRzX2ZyZWcpOiBOZXcgZnVuY3Rpb25zLgotCSogKHNoX2luc25fdXNlc19yZWcsIHNoX2luc25fdXNlc19mcmVnKTogVXNlIG5ldyBtYWNyb3MuCi0JKiAoc2hfaW5zbnNfY29uZmxpY3QpOiBVc2UgbmV3IGZ1bmN0aW9ucyBhbmQgbmV3IG1hY3JvcyB0byAKLQlkZXRlY3QgY29uZmxpY3RzIHdoZW4gdHdvIGluc3RydWN0aW9ucyBib3RoIHNldCBzYW1lIGludGVnZXIgcmVnaXN0ZXJzLAotCWJvdGggc2V0IHNhbWUgZnAgcmVnaXN0ZXIsIGFuZCBib3RoIHNldCBzcGVjaWFsIHJlZ2lzdGVyLgotCi0yMDAwLTAyLTA5ICBUaW1vdGh5IFdhbGwgIDx0d2FsbEBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBhcmNoL21hY2ggaW5mbyBwcmlvciB0bwotCXN3YXBwaW5nIGluIHNlY3Rpb25zLCBzbyB0aGF0IHRoZSBzd2FwcGluZyByb3V0aW5lcyBoYXZlIGFjY2VzcyB0bwotCXRoZSBhcmNoL21hY2ggaW5mby4KLQotMjAwMC0wMi0wOCBNYXJrIEVsYnJlY2h0IDxzbm93YmFsbDNAYmlnZm9vdC5jb20+Ci0JCi0JKiBjb2ZmLWdvMzIuYzogVXBkYXRlIGNvbW1lbnQuIFVwZGF0ZSBjb3B5cmlnaHQuCi0gCi0yMDAwLTAxLTI3ICBUaG9tYXMgZGUgTGVsbGlzICA8dGRlbEB3aW5kcml2ZXIuY29tPgotCi0gICAgICAgICogc3ltcy5jIChiZmRfZGVjb2RlX3N5bWNsYXNzKQotICAgICAgICBUd28gbmV3IGNsYXNzIGNoYXJhY3RlcnMgd2VyZSBhZGRlZCAtICdWJyBhbmQgJ3YnLiAgVGhlCi0gICAgICAgIG1lYW5pbmcgb2YgJ1cnIGlzIG5vdyByZXN0cmljdGVkIHRvIGp1c3Qgd2VhayBub24tb2JqZWN0Ci0gICAgICAgIHN5bWJvbHMuICBUaGlzIGFsbG93cyBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiwgZm9yIGV4YW1wbGUsCi0gICAgICAgIHdlYWsgZnVuY3Rpb25zIHZzIHdlYWsgb2JqZWN0cy4gIG5tIGZvciBleGFtcGxlIG5vdyBkdW1wczoKLSAgICAgICAgJ1cnID0gd2VhayBnbG9iYWwKLSAgICAgICAgJ3cnID0gd2VhayB1bnJlc29sdmVkCi0gICAgICAgICdWJyA9IHdlYWsgZ2xvYmFsIG9iamVjdAotICAgICAgICAndicgPSB3ZWFrIHVucmVzb2x2ZWQgb2JqZWN0Ci0KLQkoYmZkX2lzX3VuZGVmaW5lZF9zeW1jbGFzcyk6IE5ldyBmdW5jdGlvbi4gIFJldHVybiB0cnVlIGlmIHRoZQotCWdpdmVuIHN5bWJvbCBjbGFzcyByZXByZXNlbnRzIGFuZCB1bmRlZmluZWQvdW5yZXNvbHZlZCBzeW1ib2wuCi0JCi0gICAgICAgIChiZmRfc3ltYm9sX2luZm8pOiBVc2UgYmZkX2lzX3VuZGVmaW5lZF9zeW1jbGFzcyB0byBjaGVjayBmb3IKLQl1bnJlc29sdmVkIHN5bWJvbHMuCi0KLQkqIGJmZC1pbjIuaDogQWRkIHByb3RvdHlwZSBmb3IgYmZkX2lzX3VuZGVmaW5lZF9zeW1ib2woKS4KLQkKLSAgICAgICAgKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2dldF9zeW1ib2xfdHlwZSk6IElmIGEgc3ltYm9sIGhhcyB0aGUKLQlTVFRfQVJNXzE2QklUIGZsYWcgc2V0LCBidXQgaXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgZGF0YSBvYmplY3QKLQlyZXR1cm4gU1RUX0FSTV8xNkJJVCBzbyB0aGF0IGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBjb2RlIGJ5IHRoZQotCWRpc2Fzc2VtYmxlci4KLQotMjAwMC0wMS0yNyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb2ZmLWkzODYuYyAoaTNjb2ZmX29iamVjdF9wKTogUmVtb3ZlIHByb3RvdHlwZS4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogQWRkIGNvbnN0Ci0JdG8gbmFtZS4gIFVwZGF0ZSBjb3B5cmlnaHQuCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDYXN0IGNvcmVfcmVnc2VjCi0JYXNzaWdubWVudCB0byBhdm9pZCB3YXJuaW5nLiAgVXBkYXRlIGNvcHlyaWdodC4KLQotMjAwMC0wMS0yNCAgUm9iZXJ0IExpcGUgIChyb2JlcnRsQHNjby5jb20pCi0KLSAgICAgICAgKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEdldCBidWZmIHZpYSBiZmRfbWFsbG9jCi0JaW5zdGVhZCBvZiB1c2luZyBHTlUgQyBleHRlbnNpb24uCi0KLTIwMDAtMDEtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfcmVhZCk6IERvIG5vdCBhdHRlbXB0IHRvIGdldCBhIG5lZ2F0aXZseSBzaXplZAotCWFtb3VudCBmcm9tIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3R1cmUuCi0JKGJmZF9zZWVrKTogRG8gbm90IGFsbG93IHNlZWtzIHBhc3QgdGhlIGVuZCBvZiBhIGJmZF9pbl9tZW1vcnkKLQlzdHJ1Y3R1cmUuCi0KLTIwMDAtMDEtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBvb3BzIC0gZml4IGluY29ycmVjdGx5Ci0JYXBwbGllZCBwYXRjaCBmcm9tIFRpbSBXYWxsLgotCi0yMDAwLTAxLTEzICBUaW1vdGh5IFdhbGwgKHR3YWxsQHRpYWMubmV0PgotCi0JKiBjb2ZmY29kZS5oOiBVc2UgYmZkX2NvZmZfeHh4IGluc3RlYWQgb2YgdGhlIG1hY3JvIFhYWCAod2hlcmUgeHh4Ci0JPSBzY25oc3osIGZpbGhzeiwgcmVsc3osIGFvdXRzeiwgZXRjKQotCi0JICogY29mZnN3YXAuaDogRGl0dG8uCi0JCi0yMDAwLTAxLTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIpOiBGaXggb2Zmc2V0IGluIGJyYW5jaCB0bwotCWludGVyd29yayB0aHVtYiB0byBhcm0gc3R1Yi4KLQotMjAwMC0wMS0xMyAgVGltb3RoeSBXYWxsICh0d2FsbEB0aWFjLm5ldD4KLQotCSogYXJjaHVyZXMuYyAoYmZkX29jdGV0c19wZXJfYnl0ZSk6IE5ldyBmdW5jdGlvbjogUmV0dXJuCi0JdGFyZ2V0IGJ5dGUgc2l6ZS4KLQkoYmZkX2FyY2hfbWFjaF9vY3RldHNfcGVyX2J5dGUpOiBOZXcgZnVuY3Rpb246IFJldHVybiB0YXJnZXQKLQlieXRlIHNpemUuCi0KLQkqIHNlY3Rpb24uYzogRGlzdGluZ3Vpc2ggYmV0d2VlbiBvY3RldHMgYW5kIGJ5dGVzIGZvciB1c2FnZSBvZgotCV9jb29rZWRfc2l6ZSwgIF9yYXdfc2l6ZSwgYW5kIG91dHB1dF9vZmZzZXQuICBDbGFyaWZ5Ci0JZGVzY3JpcHRpb24gb2YgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzLgotCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGNvZmZnZW4uYzogSW5kaWNhdGUgdGhhdCB0aGUgb2Zmc2V0IHBhcmFtZXRlciBpcyBpbiBieXRlcywgbm90Ci0Jb2N0ZXRzLgotCQotCSogY29mZmxpbmsuYyAoYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBVc2UgYmZkX29jdGV0c19wZXJfYnl0ZQotCXdoZXJlIGFwcHJvcHJpYXRlIHRvIGdldCB0aGUgb2N0ZXQgb2Zmc2V0IHdoZW4gY2FsbGluZwotCWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cy4KLQkoYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcik6IERpdHRvLgotCQotCSogbGlua2VyLmMgKGJmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBEaXR0by4KLQkoX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIpOiBEaXR0by4KLQkKLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiAgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvY3RldHMKLQlhbmQgYnl0ZXMuICBVc2Ugb2N0ZXRzIHdoZW4gaW5kZXhpbmcgaW50byBvY3RldCBkYXRhOyB1c2UgYnl0ZXMKLQl3aGVuIGNhbGN1bGF0aW5nIHRhcmdldCBhZGRyZXNzZXMuCi0JKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBEaXR0by4KLQkKLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zZWN0aW9uKTogRGl0dG8uCi0JCi0yMDAwLTAxLTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmMgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik6IENoYW5nZSBmcm9tCi0JMyB0byAyLiAgVGhpcyBhbGxvd3MgNCBieXRlIHNpemVkIHNlY3Rpb25zLCB3aGljaCBpcyBuZWNlc3NhcnkgZm9yCi0JZGxsdG9vbCB0byBidWlsZCBmdW5jaXRvbmluZyBETExzLgotCi0yMDAwLTAxLTEwICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBmdXR1cmV0di5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGFybSotKi1saW51eC1nbnUqKTogTWF0Y2ggaW5zdGVhZCBvZiBhcm0qLSotbGludXgtZ251LgotCShhcm0qLSotY29uaXgqKTogTmV3IHRhcmdldC4KLQotMjAwMC0wMS0xMCAgRWdvciBEdWRhICA8ZGVvQGxvZ29zLW0ucnU+Ci0KLQkqIGNvbmZpZy5iZmQ6IEluY2x1ZGUgZWxmMzJfaTM4NiB2ZWN0b3IgdG8gdGFyZ2V0IGxpc3QgZm9yIGN5Z3dpbiAKLQlhbmQgbWluZ3cuCi0JCi0JKiBjb25maWcuaW46IFVuZGVmaW5lIEhBVkVfV0lOMzJfUFNUQVRVU19ULgotCSogY29uZmlndXJlLmluOiBUZXN0IGZvciBzdHJ1Y3R1cmUgd2luMzJfcHN0YXR1c190IGluCi0JPHN5cy9wcm9jZnMuaD4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkKLQkqIGVsZi5jIChlbGZjb3JlX2dyb2tfd2luMzJwc3RhdHVzKTogTmV3IGZ1bmN0aW9uOiBwcm9jZXNzCi0Jd2luMzJfcHN0YXR1c190IG5vdGVzIGluIGVsZiBjb3JlIGZpbGUuCi0JKGVsZmNvcmVfZ3Jva19ub3RlKTogRGV0ZWN0IHdpbjMyX3BzdGF0dXMgbm90ZXMuCi0KLTIwMDAtMDEtMDMgIE1hcnRpbiB2LiBMb2V3aXMgIDxsb2V3aXNAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+Ci0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBQcm9jZXNzIHN5bWJvbAotCXZpc2liaWxpdHkuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENvbWJpbmUgdmlzaWJpbGl0aWVzLgotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogSW50ZXJwcmV0IHN0X290aGVyIGFzIHZpc2liaWxpdHkuCi0KLTE5OTktMTItMjkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBleHBvcnQgYWxsCi0JaWYgbm8gZHluYW1pYyBzZWN0aW9ucyBjcmVhdGVkLgotCi0xOTk5LTEyLTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX2JmZF9vYmplY3RfcCk6IE9ubHkgZGVmaW5lIGZvciBQRSBmb3JtYXQKLQl0YXJnZXRzLiAKLQotMTk5OS0xMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGkzY29mZl9vYmplY3RfcCk6IERlbGV0ZS4KLQkoaTM4NmNvZmZfdmVjKTogUmVwbGFjZSByZWZlcmVuY2UgdG8gaTNjb2ZmX29iamVjdF9wIHdpdGggYQotCXJlZmVyZW5jZSB0byBjb2ZmX29iamVjdF9wLgotCi0JKiBjb2ZmLW1jb3JlLmMgKHBlX29iamVjdF9wKTogRGVsZXRlLgotCi0JKiBwZWljb2RlLmggKHBlX2JmZF9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbjogRGV0ZWN0IHRoZQotCXByZXNlbmNlIG9mIGEgUEUgZm9ybWF0IENPRkYgb2JqZWN0IGZpbGUuICBBbHNvIGRldGVjdCBhbmQKLQl3YXJuIGFib3V0IHRoZSBwcmVzZW5jZSBvZiBMSU5LNiBmb3JtYXQgSW1hZ2UgTGlicmFyeSBGb3JtYXQKLQlvYmplY3QgZmlsZXMuCi0JCi0xOTk5LTEyLTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChOVU1fRUxFTSk6IE5ldyBtYWNyby4KLQkoTlVNX1JFTE9DUyk6IE5ldyBtYWNybzogVGhlIG51bWJlciBvZiBrbm93biBBUk0gcmVsb2NzLgotCShSVFlQRTJIT1dUTyk6IFJldHVybiBOVUxMIGlmIHRoZSByZWxvYyB0eXBlIGlzIG91dCBvZiByYW5nZS4KLQkoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiAgUmV0dXJuIE5VTEwgaWYgdGhlIHJlbG9jIHR5cGUgaXMgb3V0Ci0Jb2YgcmFuZ2UuCi0JKGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IFByb2R1Y2UgYSB3YXJuaW5nIG1lc3NhZ2UgaWYKLQlhbiBvdXQgb2YgcmFuZ2Ugc3ltYm9sIGluZGV4IGlzIGVuY291bnRlcmVkLgotCi0xOTk5LTEyLTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGlzX2dsb2JhbF9zeW1ib2xfZGVmaW5pdGlvbik6IE5ldyBGdW5jdGlvbjogUmV0dXJuCi0JdHJ1ZSBpZmYgdGhlIHN5bWJvbCBpcyBiZWluZyBnaXZlbiBhIGdsb2JhbCBkZWZpbml0aW9uIGluIHRoaXMKLQliZmQuIAotCShlbGZfbGlua19pc19kZWZpbmVkX2FyY2hpdmVfc3ltYm9sKTogRG8gbm90IGJvdGhlciBwcm9jZXNzaW5nCi0Jc3ltYm9scyBmb3IgYW4gYXJjaGl2ZSBlbGVtZW50IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZAotCWluIHRoZSBsaW5rLgotCVVzZSBpc19nbG9iYWxfc3ltYm9sX2RlZmluaXRpb24oKS4KLQkKLTE5OTktMTItMDkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHNwYXJjLSotbmV0YnNkZWxmKiBhbmQKLQlzcGFyYy0qLW5ldGJzZGFvdXQqLgotCi0xOTk5LTEyLTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lzX2RlZmluZWRfYXJjaGl2ZV9zeW1ib2wpOiBDaGVjayB0byBzZWUKLQlpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSBjb21tb24gc2VjdGlvbi4KLQotMTk5OS0xMi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pc19kZWZpbmVkX2FyY2hpdmVfc3ltYm9sKTogTmV3Ci0JZnVuY3Rpb246IERlY2lkZSBpZiBhIHN5bWJvbCwgaW4gYW4gYXJjaGl2ZSBtYXAgaXMgdGhlcmUKLQliZWNhdXNlIGl0IGlzIGRlZmluZWQgaW4gdGhlIGFyY2hpdmUgZWxlbWVudCwgb3IgYmVjYXVzZSBpdCBpcwotCWp1c3QgYW5vdGhlciBjb21tb24gZGVjbGFyYXRpb24gb2YgaXQuCi0JKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBVc2UKLQllbGZfbGlua19pc19kZWZpbmVkX2FyY2hpdmVfc3ltYm9sIHRvIGRlY2lkZSBpZiBhbiBhcmNoaXZlCi0JZWxlbWVudCBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uIHN5bWJvbCBzaG91bGQgYmUKLQlsaW5rZWQgaW4gb3Igbm90LgotCi0xOTk5LTEyLTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmg6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIHRhcmdldHMuYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogbGliYmZkLWluMi5oOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBsaWJiZmQuaDogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogZWxmeHgtdGFyZ2V0Lmg6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGFyY2hpdmUuYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogYW91dC10YXJnZXQuaDogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogYW91dC10aWMzMC5oOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBiZmQuYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogY29mZi1hbHBoYS5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBjb2ZmLXJzNjAwMC5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBlbGY2NC1taXBzLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGllZWUuYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogbGliZWNvZmYuaDogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogb2FzeXMuYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogc29tLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIHZtcy5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0KLTE5OTktMTItMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IEFkZCBhbiBhcmNoaXZlCi0gICAgICAgIGVsZW1lbnQgZXZlbiBpZiBjb250YWlucyBhIHN5bWJvbCB3aGljaCBpcyBjdXJyZW50bHkgb25seQotICAgICAgICBjb25zaWRlcmVkIHRvIGJlIGEgY29tbW9uLgotCi0JKiB0YXJnZXRzLmMgKHN0cnVjdCBiZmRfdGFyZ2V0KTogQWRkIG5ldyBmaWVsZAotCV9iZmRfYWxsb3dfY29tbW9uc19pbl9hcm1hcC4KLQkqIGJmZC1pbjIuaDpSZWdlbmVyYXRlLgotCi0JKiBsaWJiZmQtaW4yLmggKF9iZmRfbm9hcmNoaXZlX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOgotCURlZmluZS4KLQkgKF9iZmRfYXJjaGl2ZV9ic2RfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZ4eC10YXJnZXQuaDogSWYgdXNpbmcgQ09GRiBhcmNoaXZlIG1hcCwgb3ZlcnJpZGUKLQlkZWZpbml0aW9uIG9mIGFsbG93X2NvbW1vbnNfaW5fYXJtYXAgYW5kIHJlcGxhY2Ugd2l0aAotCWJmZF9mYWxzZS4KLQotCSogYXJjaGl2ZS5jIChiZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBEbyBub3QgcGxhY2UgY29tbW9uCi0Jc3ltYm9scyBpbnRvIHRoZSBhcmNoaXZlIG1hcCB1bmxlc3MgX2JmZF9hbGxvd19jb21tb25zX2luX2FybWFwCi0JcmV0dXJucyB0cnVlLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogYW91dC10aWMzMC5oIChNWV9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogYmZkLmMgKGJmZF9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogY29mZi1hbHBoYS5oIChhbHBoYV9lY29mZl9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogY29mZi1yczYwMDAuaCAoeGNvZmZfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIGVsZjY0LW1pcHMuYyAoYmZkX2VsZjY0X2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBpZWVlLmMgKGllZWVfZWNvZmZfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiB2bXMuYyAodm1zX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0KLTE5OTktMTItMDcgIEppbSBCbGFuZHkgIDxqaW1iQGN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgU1NFIHJlZ2lzdGVycyBpbiBFTEYgY29yZSBmaWxlcy4KLQkqIGVsZi5jIChlbGZjb3JlX21ha2Vfbm90ZV9wc2V1ZG9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGZjb3JlX2dyb2tfcHJmcHJlZyk6IFVzZSBpdC4KLQkoZWxmY29yZV9ncm9rX3ByeGZwcmVnKTogTmV3IGZ1bmN0aW9uLgotCShlbGZjb3JlX2dyb2tfbm90ZSk6IFJlY29nbml6ZSBMaW51eCBOVF9QUlhGUFJFRyBub3Rlcy4KLQotMTk5OS0xMi0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBEaXZpZGUgUl9NSVBTX1BDMTYKLQl2YWx1ZSBieSA0IGJlZm9yZSBzdG9yaW5nIGl0IGJhY2sgaW4gdGhlIGZpZWxkLiAgRnJvbQotCUtvdW5kaW55YS4gSyA8a2tAZGRlb3JnLnNvZnQubmV0Pi4KLQotVHVlIE5vdiAzMCAyMjo0MToxNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2FtMzMpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjcHUtbTEwMzAwLmMgKGJmZF9hbTMzX2FyY2gpOiBBZGQgdG8gdGhlIG1uMTAzIGFyY2hpdGVjdHVyZSBsaXN0Ci0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBIYW5kbGUgYW0zMyBpbnN0cnVjdGlvbnMuCi0JKGNvbXB1dGVfZnVuY3Rpb25faW5mbyk6IEhhbmRsZSBhZGRpdGlvbmFsIHJlZ2lzdGVycyBzYXZlZCBieQotCW1vdm0gb24gdGhlIGFtMzMuCi0JKGVsZl9tbjEwMzAwX21hY2gpOiBIYW5kbGUgRV9NTjEwMzAwX01BQ0hfQU0zMy4KLQkoX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogSGFuZGxlIGJmZF9tYWNoX2FtMzMuCi0KLTE5OTktMTEtMjkgIEppbSBCbGFuZHkgIDxqaW1iQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfZ2V0X2VsZl9waGRycywgYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkqIGJmZC1pbjIuaCAoYmZkX2dldF9lbGZfcGhkcnMsIGJmZF9nZXRfZWxmX3BoZHJfdXBwZXJfYm91bmQpOiBOZXcKLQlkZWNsYXJhdGlvbnMuCi0KLTE5OTktMTEtMjcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMKTogTmV3IHJlbG9jYXRpb24gZm9yCi0JaW50ZXJuYWwgdXNlIHdpdGhpbiBnYXMgZm9yIGFscGhhIGV4cGxpY2l0IHJlbG9jYXRpb25zLgotCShCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRSk6IERpdHRvLgotCShCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGKTogRGl0dG8uCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1IpOiBEaXR0by4KLQkoQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BESVNQKTogRGl0dG8uCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSCk6IERpdHRvLgotCShCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVyk6IERpdHRvLgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY19tYXApOiBBZGQgbWFwcGluZ3MgZm9yCi0JQkZEX1JFTE9DX0FMUEhBX1VTRVJfKi4KLQotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMTEtMjYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoZWxmY29yZV9yZWFkX25vdGVzKTogQWRkIHByb3RvdHlwZSBmb3Igc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyKTogUmVuYW1lZCBmcm9tIGJmZF9zZWN0aW9uX2Zyb21fcGhkci4KLQkoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogUmVwbGFjZW1lbnQgZnVuY3Rpb24gdGhhdCBjYWxscwotCV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgZm9yIGdlbmVyaWMgc2VnbWVudCB0eXBlcyBhbmQKLQliYWNrZW5kIGZ1Y250aW9uIHBvaW50ZWQgdG8gYnkgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIgZm9yCi0JYmFja2VuZCBzcGVjaWZpYyBzZWdtZW50IHR5cGVzLgotCShfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIpOiBSZW1vdmUgY2FsbCB0byBlbGZjb3JlX3JlYWRfbm90ZXMsCi0Jbm93IGNhbGxlZCBieSBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyLiAgTm90ZSB0aGF0IHRoaXMgZnVuYwotCWlzIG5vdyBqdXN0IGEgc3R1YiBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIGJmZF9zZWN0aW9uX2Zyb21fcGhkci4KLQkKLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZ1bmN0aW9uIHBvaW50ZXIKLQllbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkci4KLQkoZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBBZGQgcHJvdG90eXBlLgotCQotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyKTogRGVmaW5lIGRlZmF1bHQuCi0JKGVsZk5OX2JlZCk6IEFkZCBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkci4KLQotMTk5OS0xMS0yNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiAgQWRkCi0JU0VDX0NPREUgYW5kIFNFQ19SRUFET05MWSBmbGFncyB0byBnbHVlIHNlY3Rpb25zLgotCi0JKiBlbGYzMi1hcm0uaCAoYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBBZGQKLQlTRUNfQ09ERSBhbmQgU0VDX1JFQURPTkxZIGZsYWdzIHRvIGdsdWUgc2VjdGlvbnMuCi0KLTE5OTktMTEtMjAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8gaW4gcHJldmlvdXMKLQlkZWx0YS4gCi0KLTE5OTktMTEtMTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9jcHUzMl9wbHQwX2VudHJ5KTogRml4IGVuY29kaW5nLgotCShlbGZfY3B1MzJfcGx0X2VudHJ5KTogTGlrZXdpc2UuCi0KLTE5OTktMTEtMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9ydHlwZV90b19ob3d0byk6IFNwZWNpYWwgY2FzZSBoYW5kbGluZwotCWZvciBSVkEgcmVsb2NzLgotCShjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXNlIGFkZGVuZCB0byAwLgotCVNwZWNpYWwgY2FzZSBwcm9jZXNzaW5nIG9mIFJWQSByZWxvYy4KLQotMTk5OS0xMS0xNyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlb3JkZXIgY29sbGVjdCBhbmQKLQl0eXBlX2NoYW5nZV9vazsgYWRkIHNpZ25fZXh0ZW5kX3ZtYS4KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX2JhY2tlbmRfc2lnbl9leHRlbmRfdm1hKTogRGVmaW5lLgotCSogZWxmY29kZS5oIChlbGZfc3dhcF9zeW1ib2xfaW4pOiBNaW5kIGJlLT5zaWduX2V4dGVuZF92bWEuCi0JKGVsZl9zd2FwX3NoZHJfaW4sIGVsZl9zd2FwX3BoZHJfaW4pOiBMaWtld2lzZS4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF9zaWduX2V4dGVuZF92bWEpOiBEZWZhdWx0LgotCShlbGZOTl9iZWQpOiBGb2xsb3cgc3RydXR1cmUgY2hhbmdlcy4KLQotMTk5OS0xMS0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfcmVhZCk6IENoZWNrIHJlc3VsdCBvZiByZWFkIGFnYWluc3QgZGVzaXJlZCByZXN1bHQKLQl1c2luZyAhPSwgbm90IDwuCi0JKF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldCBiZmRfZXJyb3IgaWYgdGhlIHNlZWsgaXMKLQlpbnZhbGlkIGNvbXBhcmVkIHRvIHRoZSBzZWN0aW9uIHNpemUuCi0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9kZWJ1Zyk6IEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBkZWJ1ZwotCWluZm9ybWF0aW9uIHJpZ2h0IGlmIHRoZXJlIGlzIG5vIGRhdGEgcGFydC4KLQotVHVlIE5vdiAgMiAwMTo0NDo0MSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fZml4dXBfZm9ybWF0cyk6IEltcHJvdmUgaGFuZGxpbmcgb2YgUl9BVVhfVU5XSU5ELAotCVJfTElORVRBQiwgUl9MSU5FVEFCX0VTQywgYW5kIFJfQ09NTUVOVC4KLQotMTk5OS0xMC0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogTWFrZSBsYXN0X2xvY2FsIHNpZ25lZC4KLQotMTk5OS0xMC0yNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHN0YWJzLmMgKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogTWFrZSBzdXJlIC5zdGFic3RyIHNlY3Rpb24KLQlzdGFydHMgd2l0aCBhIHplcm8uCi0KLVNhdCBPY3QgMjMgMTc6MzY6MTIgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jOiBBZGQgZGVmaW5pdGlvbnMgYmZkX21hY2hfZDEwdiwgYmZkX21hY2hfZDEwdl90czIgYW5kCi0gCWJmZF9tYWNoX2QxMHZfdHMzLgotCSogY3B1LWQxMHYuYyAoZDEwdl90czNfaW5mbywgZDEwdl90czJfaW5mbyk6IEFkZC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkKLTE5OTktMTAtMTUgIEFuZHJldyBIYWxleSAgPGFwaEBjeWdudXMuY29tPgotCi0JKiBkd2FyZjEuYyAocGFyc2VfZGllKTogRmFpbCB0byBwYXJzZSBhIGRpZSBpZiBpdHMgbGVuZ3RoIGlzIHplcm8uCi0KLVN1biBPY3QgMTcgMTc6MTk6MDAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKGJmZF9ocHBhX2luc24yZm10KTogQ2hhbmdlIHRvIHJldHVybiBhbiBpbnQuCi0KLTE5OTktMTAtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBXaGVuIG92ZXJyaWRpbmcgYSB3ZWFrIHN5bWJvbCB3aXRoCi0JYSBkZWZpbmVkIHN5bWJvbCBpbiBhIHNoYXJlZCBsaWJyYXJ5LCBjbGVhciB0aGUgREVGX0RZTkFNSUMgZmxhZwotCXRvby4KLQotRnJpIE9jdCAgOCAxMzowMzo0NSAxOTk5ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBSX01JUFNfTElURVJBTAotCXJlbG9jcyBhbHNvIG5lZWQgdGhlIEdQIHZhbHVlLgotCShfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgdW5wYWlyZWQgTE8xNiByZWxvY3MKLSAJcHJvcGVybHkuICBIYW5kbGUgc2lnbi1leHRlbnNpb24gZm9yIFJfTUlQU182NCBjb3JyZWN0bHkuICBDb3JyZWN0Ci0gCXRoZSBHUCB2YWx1ZSBmb3IgUl9NSVBTX0xJVEVSQUwgcmVsb2NzIHRvby4gIEhhbmRsZQotCVJfTUlQU182NCByZWxvY3MgcHJvcGVybHkgb24gYmlnLWVuZGlhbiBNSVBTLgotCShtaXBzX2VsZl9zaWduX2V4dGVuZCk6IEJlaGF2ZSBwcm9wZXJseSB3aXRoICdsb25nIGxvbmcnLgotCShtaXBzX2VsZl9oaWdoZXN0KTogQ29ycmVjdCB0eXBvLgotCi1Nb24gT2N0ICA0IDE3OjQ5OjQ1IDE5OTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1tMzJyLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBOZXcgc3RhdGljIGdsb2JhbC4KLQkoYmZkX20zMnJfYXJjaCk6IFJlZmVyIHRvIGl0LgotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9vYmplY3RfcCk6IFJlY29nbml6ZSBFX00zMlJYX0FSQ0guCi0JKG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEaXR0by4KLQkobTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IEhhbmRsZSBiZmRfbWFjaF9tMzJyeC4KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX20zMnJ4KTogRGVmaW5lIGl0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTI4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChjaXNjb19jb3JlX3ZlYyk6IFJlcGxhY2VkIHdpdGggdHdvIG5ldyB2ZWNzIC4uLgotCShjaXNjb19jb3JlX2JpZ192ZWMpOiBBZGQgbmV3IGJpZ2VuZGlhbiB2ZWMuCi0JKGNpc2NvX2NvcmVfbGl0dGxlX3ZlYyk6IEFkZCBuZXcgbGl0dGxlIGVuZGlhbiB2ZWMuCi0KLQkqIGNpc2NvLWNvcmUuYyAoQ1JBU0hfSU5GTyk6IEZpeGVkIG9mZnNldCByZXBsYWNlZCB3aXRoIC4uLgotCShjcmFzaF9pbmZvX2xvY3MpOiBBZGQgYXJyYXkgb2YgcG9zc2libGUgb2Zmc2V0cy4KLQkoTUFTS19BRERSKTogTWFzayB0byBhcHBseSB0byBjcmFzaCBpbmZvIG9mZnNldC4KLQkoY3Jhc2hpbmZvX2V4dGVybmFsKTogQWRkIHRleHRiYXNlLCBkYXRhYmFzZSwgYnNzYmFzZSBhbmQKLQl0dXJuIGludG8gYSB0eXBlZGVmLgotCShjaXNjb19jb3JlX2ZpbGVfdmFsaWRhdGUpOiBSZW5hbWVkIGZyb20gY2lzY29fY29yZV9maWxlX3AuCi0JTWFueSBzbWFsbCBjaGFuZ2VzIHRvIGFjY291bnQgZm9yIGFkZGl0aW9uYWwgaGFyZHdhcmUgdmVyc2lvbnMuCi0JUGljayBhIHJlYXNvbmFibGUgc2l6ZSBmb3IgIi5yZWciIHNlY3Rpb24uICBBZGQgYSAiLmNyYXNoIgotCXNlY3Rpb24gdG8gYWxsb3cgYWNjZXNzIHRvIGNyYXNoaW5mb19leHRlcm5hbCBzdHJ1Y3QuCi0JKGNpc2NvX2NvcmVfZmlsZV9wKTogTmV3IHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiB0aGF0Ci0JaXRlcmF0ZXMgb3ZlciBjcmFzaF9pbmZvX2xvY3MsIGNhbGxpbmcgY2lzY29fY29yZV9maWxlX3ZhbGlkYXRlLgotCShjaXNjb19jb3JlX3ZlYyk6IE9sZCBiaWcgZW5kaWFuIG9ubHkgdmVjIHJlcGxhY2VkIHdpdGggLi4uCi0JKGNpc2NvX2NvcmVfYmlnX3ZlYyk6IEFkZCBiaWcgZW5kaWFuIHZlcnNpb24uCi0JKGNpc2NvX2NvcmVfbGl0dGxlX3ZlYyk6IEFkZCBsaXR0bGUgZW5kaWFuIHZlcnNpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoY2lzY29fY29yZV92ZWMpOiBTcGxpdCB0byB0d28gbmV3IHZlY3RvcnMgLi4uCi0JKGNpc2NvX2NvcmVfYmlnX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShjaXNjb19jb3JlX2xpdHRsZV92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy5iZmQgKHRhcmcpOiBGb3IgbTY4Ki0qLWFvdXQqIHRhcmcsIGNoYW5nZSBjaXNjb19jb3JlX3ZlYwotCXRvIGNpc2NvX2NvcmVfYmlnX3ZlYyBpbiB0YXJnX3NlbHZlY3MuCi0KLTE5OTktMDktMjggIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9oaTE2KTogVW51c2VkLCBkZWxldGUuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX2dvdF9sb2NhbCk6IFVudXNlZCwgZGVsZXRlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9nbG9iYWxfZ290KTogVW51c2VkLCBkZWxldGUuCi0KLTE5OTktMDktMjQgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogQWRkIHR5cGVuYW1lIHZhcmlhYmxlLiAgVXNlIHBfdHlwZQotCXRvIGluaXRpYWxpemUgaXQgdG8gc29tZXRoaW5nIG1lYW5pbmdmdWwuICBUaGVuIHVzZSBpdCB0byBnZW5lcmF0ZQotCW1vcmUgdXNlZnVsIHNlZ21lbnQgbmFtZXMuCi0KLVN1biBTZXAgMTkgMTI6MTY6NDcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoTk9fUENSRUxfTU9ERVMpOiBEZWZpbmUgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBkZWZpbmUKLQlSX1NIT1JUX1BDUkVMX01PREUuCi0JKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIGJvdGggc2hvcnQgYW5kIGxvbmcgcGNyZWwgYnJhbmNoZXMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBFbGltaW5hdGUgcmVkdW5kYW50IHBjcmVsIG1vZGUgcmVsb2NzLiAgSGFuZGxlCi0JUl9MT05HX1BDUkVMX01PREUgYW5kIFJfU0hPUlRfUENSRUxfTU9ERQotCSogbGliaHBwYS5oIChkaXNfYXNzZW1ibGVfMjIpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9ocHBhX2luc24yZm10KTogSGFuZGxlIGxvbmcgYnJhbmNoLgotCi0JKiBsaWJocHBhLmggKGJmZF9ocHBhX2luc24yZm10KTogRGVjb2RlIGFuZCBoYW5kbGUgZm9ybWF0cyBmb3VuZAotCWluIFBBMi4wLgotCi0xOTk5LTA5LTE3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBTdXBwb3J0IEJGRF9SRUxPQ18xNiwKLQlCRkRfUkVMT0NfMTZfUENSRUwsIEJGRF9SRUxPQ184LCBCRkRfUkVMT0NfOF9QQ1JFTCByZWxvY3MuCi0JKHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGUpOiBUaWR5IGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlLgotCi0xOTk5LTA5LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBVbmRvCi0JcHJldmlvdXMgZGVsdGEuICBTZXQgc2VjLT5nY19tYXJrIGluc3RlYWQuCi0KLVRodSBTZXAgMTYgMTE6MjE6MTMgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX2NwdTMyX3BsdDBfZW50cnkpOiBVc2UgYTEgaW5zdGVhZCBvZiBhMC4KLQkoZWxmX2NwdTMyX3BsdF9lbnRyeSk6IExpa2V3aXNlLgotCi1UaHUgU2VwIDE2IDEwOjQ4OjE3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFR1cm4gb24gVFJBUE5JTC4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGluayk6IElmIHVuYWJsZSB0byBmaW5kIF9fZ3AgaW4gdGhlCi0Jc3ltYm9sIHRhYmxlLCB0aGVuIGp1c3QgY29tcHV0ZSBhIHN1aXRhYmxlIHZhbHVlIChidXQgZG8gbm90Ci0JY3JlYXRlIGEgX19ncCBzeW1ib2wpLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogQWxsb3cgdW5kZWZpbmVkCi0Jc3ltYm9scyB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIFBDUkVMCi0JcmVsb2NhdGlvbnMgYWdhaW5zdCB1bmRlZmluZWQgc3ltYm9scy4KLQotMTk5OS0wOS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKTogTWFyawotCWludGVyd29ya2luZyBzZWN0aW9ucyBhcyBsaW5rZXIgY3JlYXRlZCBzbyB0aGF0IHRoZXkgd2lsbCBub3QKLQliZSByZW1vdmVkIGJ5IGdhcmJhZ2UgY29sbGVjdGlvbi4KLQotV2VkIFNlcCAxNSAwMjozMTo1NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmspOiBSZXZhbXAgX19ncCBoYW5kbGluZy4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IENvbnNpc3RlbnRseSBjcmVhdGUgYW4gYWJzb2x1dGUKLQlhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4KLQotMTk5OS0wOS0xNCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQ2Fub25pY2FsaXphdGlvbiBvZiB0YXJnZXQgbmFtZXMpOiBSZW1vdmUgYWRkaW5nCi0JJHtDT05GSUdfU0hFTEx9IGluIGZyb250IG9mICRhY19jb25maWdfc3ViLCBzaW5jZSBhdXRvY29uZmlnIDIuMTQKLQlnZW5lcmF0ZXMgJGFjX2NvbmZpZ19zdWIgd2l0aCBhICR7Q09ORklHX1NIRUxMfSBhbHJlYWR5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTA5LTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKEVMRl9NQVhQQUdFU0laRSk6IENoYW5nZSB0byAweDEgKGF0IHJlcXVlc3Qgb2YKLQlNaXRzdWJpc2hpKS4gCi0KLU1vbiBTZXAgMTMgMjA6MDE6NDcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2hwcGFfZmluYWxfbGluayk6IEluaXRpYWxpemUgdGV4dF9zZWdtZW50X2Jhc2UgYW5kCi0JZGF0YV9zZWdtZW50X2Jhc2UuCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgU0VHUkVMIHJlbG9jYXRpb25zLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IExpa2V3aXNlLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogSW5pdGlhbGl6ZSBIT1dUTy4KLQotMTk5OS0wOS0xMyAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogRnVydGhlciByZWZpbmVtZW50IG9mIENPTURBVAotCWhhbmRsaW5nIHRvIHN1cHBvcnQgYm90aCBHTlUgYW5kIE1TIG9iamVjdHMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY2hlY2sgcmVsb2NfY291bnQKLQl3aGVuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gc2V0IEZfUkVMRkxHLgotCi0xOTk5LTA5LTEzICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogRG9uJ3QgcmFuZ2UtY2hlY2sKLQlQQzI0IHJlbG9jcyBpZiB0aGUgdGFyZ2V0IGlzIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQkoYXJtX2FkZF90b19yZWwpOiBGaXggY29tcGlsZXIgd2FybmluZy4KLQkoZWxmMzJfYXJtX3BsdDBfZW50cnkpOiBDb3JyZWN0IGNvbW1lbnRzLgotCQotMTk5OS0wOS0xMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IENoZWNrIGZvciB0aGVfYmZkIE5VTEwgd2hlbiBoYW5kbGluZwotCWFuIGFic29sdXRlIHN5bWJvbCBpbiBSRUwgcmVsb2NzLgotCi1TdW4gU2VwIDEyIDIzOjQ3OjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBTRUNSRUwzMi4KLQlTdHViIFNFR1JFTDMyLiAgUmV0dXJuIGFuIGVycm9yIGZvciBhbnkgcmVsb2NhdGlvbiBub3QgaGFuZGxlZC4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExvb2sgZm9yIHNwZWNpYWwgTVNWQyBzdHJpbmcKLQljb25zdGFudCBzeW1ib2xzLCBhbmQgYXZvaWQgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvcnMgb24gdGhlbS4KLQotMTk5OS0wOS0xMiAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfbG9nMik6IFJld3JpdGUgdG8gYXZvaWQgaW5maW5pdGUgbG9vcCBpZiBtb3N0Ci0Jc2lnbmlmaWNhbnQgYml0IGlzIHNldC4KLQotMTk5OS0wOS0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyk6IERlZmluZS4KLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBIYW5kbGUgYW4gYWJzb2x1dGUgc3ltYm9sIGluIFJFTAotCXJlbG9jcyBhcyB3ZSBkbyBmb3IgUkVMQSByZWxvY3MuCi0KLTE5OTktMDktMTEgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBsaWJwZWkuaCAoX2JmZF9wZWlfZmluYWxfbGlua19wb3N0c2NyaXB0KTogRGVjbGFyZS4KLQkoY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBEZWZpbmUuCi0JKiBwZWlnZW4uYyAoX2JmZF9wZWlfc3dhcF9hb3V0aGRyX291dCk6IERvbid0IHNldCB2YWx1ZSBmb3IgZGF0YQotCWRpcmVjdG9yeSBlbnRyaWVzIGhlcmUuCi0JKF9iZmRfcGVpX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IE5ldyBmdW5jdGlvbi4KLQotCSogcGVpZ2VuLmMgKF9iZmRfcGVpX3N3YXBfc2NuaGRyX291dCk6IFJlbW92ZSBjb2RlIHdoaWNoIHNldHMKLQlzZWN0aW9uIGZsYWdzIGJhc2VkIG9uIHRoZSBzZWN0aW9uIG5hbWUuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9pbik6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwgdGhlCi0JZ2V0IHRoZSBvdmVyZmxvdyBvZiB0aGUgc19ubG5ubyBmaWVsZCBmcm9tIHRoZSBzX25yZWxvYyBmaWVsZC4KLQkqIHBlaWdlbi5jIChfYmZkX3BlaV9zd2FwX3Njbmhkcl9vdXQpOiBJZiBkb2luZyBhIGZpbmFsIGxpbmssIHN3YXAKLQl0aGUgc19ubG5ubyBvdmVyZmxvdyBvZiB0aGUgLnRleHQgc2VjdGlvbiBpbnRvIHRoZSBzX25yZWxvYwotCWZpZWxkLgotCi0JKiBwZWlnZW4uYyAoYWRkX2RhdGFfZW50cnkpOiBEZWNsYXJlLgotCShwZWlfc3dhcF9hb3V0aGRyX291dCk6IEdldCBpbWFnZSBzaXplIHJpZ2h0LiAgU2V0IGxpbmtlciB2ZXJzaW9uCi0JbW9yZSBpbnR1aXRpdmVseS4KLQkocGVpX3N3YXBfc2NuaGRyX291dCk6IFRlc3QgZm9yIFVOSU5JVCBzZWN0aW9uLCBub3QgLmJzcy4KLQkocGVfcHJpbnRfaWRhdGEpOiBDb2RlIGNsZWFudXAsIHByaW50IG1vcmUgaW5mbywgZ2V0IHJpZCBvZiAobm93KQotCWV4dHJhbmVvdXMgSW1hZ2VCYXNlLgotCShwZV9wcmludF9lZGF0YSk6IExpa2V3aXNlLgotCShwZV9wcmludF9wZGF0YSk6IExpa2V3aXNlLiAgUHJpbnQgZXhjZXB0aW9uIGVudHJpZXMuCi0JKHBlX3ByaW50X3JlbG9jKTogTGlrZXdpc2UuICBQcmludCBNSVBTX0pNUEFERFIuCi0JKHRibCk6IE1ha2UgY29uc3QsIGFkZCAiVU5LTk9XTiIuCi0JKF9iZmRfcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24pOiBQcmludCB0aW1lc3RhbXAuCi0JKF9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24pOiBEb24ndCBjb3B5IGRlbGV0ZWQKLQlzZWN0aW9uIGRhdGEgZGlyZWN0b3J5LgotCShfYmZkX3BlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ29weSBwZV9mbGFncy4KLQotCSogbGlicGVpLmggKF9iZmRfcGVfYmZkX2dldF9zeW1ib2xfaW5mbyk6IERlY2xhcmUuCi0JKiBwZWlnZW4uYyAoX2JmZF9wZV9iZmRfZ2V0X3N5bWJvbF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCSogcGVpY29kZS5oIChjb2ZmX2dldF9zeW1ib2xfaW5mbyk6IERlZmluZS4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotaW50ZXJpeCopOiBTZXQgdGFyZ19jZmxhZ3MgdG8KLQktRFNUUklDVF9QRV9GT1JNQVQuCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IENoZWNrIFNUUklDVF9QRV9GT1JNQVQgcmF0aGVyCi0JdGhhbiBfX0lOVEVSSVguCi0JKGNvZmZfY2xhc3NpZnlfc3ltYm9sKTogUmUtcmV2ZXJ0IDE5OTktMDgtMDggcGF0Y2ggaWYKLQlTVFJJQ1RfUEVfRk9STUFULgotCi0JKiBsaWJwZWkuaDogTmV3IGZpbGUsIGJyb2tlbiBvdXQgb2YgcGVpY29kZS5oLgotCSogcGVpZ2VuLmM6IE5ldyBmaWxlLCBicm9rZW4gb3V0IG9mIHBlaWNvZGUuaC4KLQkqIHBlaWNvZGUuaDogQSBidW5jaCBvZiBjb2RlIG1vdmVkIG91dCB0byBsaWJwZWkuaCBhbmQgcGVpZ2VuLmMuCi0JKiBjb25maWd1cmUuaW46IEFkZCBwZWlnZW4ubG8gdG8gbGlzdCBvZiBmaWxlcyByZXF1aXJlZCBmb3IgZWFjaAotCVBFIHRhcmdldC4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgcGVpZ2VuLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgcGVpZ2VuLmMuCi0JKFNPVVJDRV9IRklMRVMpOiBBZGQgbGlicGVpLmguCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBEb24ndCBjaGVjayBmb3IgYSBzcGVjaWFsCi0Jc2VjdGlvbiBuYW1lIG9mIF9CU1M7IGNoZWNrIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBCi0JaW5zdGVhZC4gIERvbid0IGNsZWFyIHRoZSBzX3BhZGRyIGZpZWxkIGZvciBhbiB1bmluaXRpYWxpemVkIGRhdGEKLQlzZWN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBTZXQgdGltZXN0YW1wIGZpZWxkIGluCi0JY29mZl9kYXRhX3R5cGUgdG8gZl90aW1kYXQuCi0JKiBwZWljb2RlLmggKHBlX21rb2JqZWN0X2hvb2spOiBMaWtld2lzZS4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IENoZWNrIHRoZSBOVCBleGVjdXRhYmxlIG1hZ2ljCi0JbnVtYmVyIGlmIENPRkZfSU1BR0VfV0lUSF9QRS4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSWYgQ09GRl9XSVRIX1BFLCBzZXQgSEFTX0RFQlVHCi0JdG8gdGhlIHJldmVyc2Ugb2YgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCBpZgotCXRoZXJlIGlzIG5vIFNFQ19ERUJVR0dJTkcgc2VjdGlvbi4KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3RfaG9vayk6IFNldCBIQVNfREVCVUcgdG8gdGhlIHJldmVyc2Ugb2YKLQlJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVELgotCi0JKiBwZS1pMzg2LmMgKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmUuCi0JKENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyk6IERlZmluZS4KLQkqIHBlaS1pMzg2LmMgKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmUuCi0JKENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyk6IERlZmluZS4KLQotCSogY29mZnN3YXAuaCAoSU1BR0VfQkFTRSk6IERvbid0IGRlZmluZS4KLQkqIHBlaS1hcm0uYyAoSU1BR0VfQkFTRSk6IERvbid0IGRlZmluZS4KLQkqIHBlaS1pMzg2LmMgKElNQUdFX0JBU0UpOiBEb24ndCBkZWZpbmUuCi0JKiBwZWktbWNvcmUuYyAoSU1BR0VfQkFTRSk6IERvbid0IGRlZmluZS4KLQkqIHBlaS1wcGMuYyAoSU1BR0VfQkFTRSk6IERvbid0IGRlZmluZS4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogV2hlbiB3cml0aW5nIG91dCBhCi0Jc3ltYm9sLCBzd2l0Y2ggb24gdGhlIGNsYXNzIHdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byBtb2RpZnkgdGhlCi0JdmFsdWUuICBGb3IgUEUsIGRvbid0IG1vZGlmeSB0aGUgdmFsdWUgb2YgYSBDX0ZDTiBzeW1ib2wgbm90IG5hbWVkCi0JLmJmLgotCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9hYm9ydCk6IERlY2xhcmUuCi0JKGFib3J0KTogRGVmaW5lLgotCSogYmZkLmMgKF9iZmRfYWJvcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBEZWxldGUgUE9XRVJQQ19MRV9QRQotCXNwZWNpYWwgaGFuZGxpbmcuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IElmIGEgc3ltYm9sIGlzIHN0cmlwcGVkLAotCWRvbid0IHdyaXRlIG91dCB0aGUgYXNzb2NpYXRlZCBsaW5lIG51bWJlcnMuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltKTogSGFuZGxlIHNlY3Rpb24gc3ltYm9sCi0JYXV4IGVudHJpZXMuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERvbid0IHdhcm4gYWJvdXQgc3ltYm9sIHR5cGUKLQljaGFuZ2VzIHdoZW4gdGhlIGJhc2UgdHlwZSBpcyB1bmtub3duLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogRml4IHByaW50aW5nIG9mIGF1eCByZWNvcmQgZm9yCi0JZnVuY3Rpb24gc3ltYm9scy4KLQotCSogc3ltcy5jIChCU0ZfREVCVUdHSU5HX1JFTE9DKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBQRSwgc2V0IEJTRl9ERUJVR0dJTkcKLQlmb3IgQ19GQ04vQ19FRkNOIHN5bWJvbHMsIGFuZCBzZXQgQlNGX0RFQlVHR0lOR19SRUxPQyBmb3Igc3VjaAotCXN5bWJvbHMgbmFtZWQgLmJmLgotCSogY29mZmdlbi5jIChmaXh1cF9zeW1ib2xfdmFsdWUpOiBSZWxvY2F0ZSBhIHN5bWJvbCB3aGljaCBoYXMKLQlCU0ZfREVCVUdHSU5HX1JFTE9DIHNldC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wOS0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVjb2ZmLmMgKGJmZF9kZWJ1Z19zZWN0aW9uKTogVXBkYXRlIGluaXRpYWxpemF0aW9uIGZvciBuZXcKLQljb21kYXRfaW5mbyBmaWVsZC4KLQkoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IEFkZCBzZWN0aW9uIHBhcmFtZXRlci4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLTE5OTktMDktMTAgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIHRoZSBuZXcKLQlfYmZkX2ZpbG5tbGVuIGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLUZyaSBTZXAgMTAgMDA6MzU6MTQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogQ3JlYXRlIC5vcGQgZW50cmllcwotCWZvciBGUFRSIHJlbG9jcyBpbnZvbHZpbmcgbG9jYWwgc3ltYm9scy4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEdldCB0aGUgcmlnaHQKLQl2YWx1ZSBmb3IgdGhlIHN0dWIgYWRkcmVzcyBpbiBhIGNhbGwgdGhyb3VnaCBhIHN0dWIuCi0JSW5zdGFsbCB0aGUgdmFsdWUgZm9yIGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5IGludG8gdGhlIERMVAotCWluc3RlYWQgb2YgZ2VuZXJhdGluZyBhIHJlbG9jLiAgQ29ycmVjdGx5IGhhbmRsZSBGUFRSNjQgcmVsb2NzLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV91bm1hcmtfdXNlbGVzc19keW5hbWljX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9ocHBhX3JlbWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scyk6IFNpbWlsYXJseS4KLQkoZWxmX2hwcGFfZmluYWxfbGluayk6IENhbGwgdGhlbS4KLQotMTk5OS0wOS0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2ZpeF9zeW1ib2xfZmxhZ3MpOiBNb3ZlIHdlYWtkZWYgaGFuZGxpbmcgaGVyZS4uLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogLi4uZnJvbSBoZXJlLgotCi1XZWQgU2VwICA4IDE3OjU2OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfaG93dG9fdGFibGUpOyBUaGVyZSBpcyBubyBESVI2NFdSLCBESVI2NERSCi0JcmVsb2NhdGlvbiwgcmVtb3ZlIHRoZW0uICBTRUNSRUw2NC0+TFRPRkYxNldGLgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIExUT0ZGKiByZWxvY2F0aW9ucy4gIEhhbmRsZQotCURJUiogcmVsb2NhdGlvbnMuCi0JKGVsZl9ocHBhX3JlbG9jYXRlX2luc24pOiBTaW1pbGFybHkuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgUExUT0ZGKiByZWxvY3MuCi0JKGVsZl9ocHBhX3JlbG9jYXRlX2luc24pOiBTaW1pbGFybHkuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgRFBSRUwqIGFuZAotCUdQUkVMKiByZWxvY2F0aW9ucy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfbGlua19maW5hbF9yZWxvY2F0ZSk6IEZpeCB0eXBvcy4KLQlIYW5kbGUgTFRPRkZfVFAqIHJlbG9jcy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBQQ1JFTCogcmVsb2NzLgotCUNvbnNpc3RlbnRseSBkZWFsIHdpdGggYWRkZW5kcy4gIEhhbmRsZSBETFRJTkQxNEYgYW5kIERMVFJFTDE0Ri4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IEhhbmRsZSBQQ1JFTCogcmVsb2NzLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIExUX09GRl9GUFRSKiwKLQlESVIzMiwgRElSNjQgYW5kIEZQVFI2NCByZWxvY2F0aW9ucy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGluayk6IFNldCB0aGUgdmFsdWUgb2YgX19ncCB0byB0aGUgICAgICAgIAotCWFkZHJlc3Mgb2YgdGhlIC5QQVJJU0MuZ2xvYmFsIHNlY3Rpb24uCi0JKGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBMb29rdXAgYW5kIHBhc3MgdGhlIFBBNjQgaGFzaAotCXRhYmxlIGVudHJ5IGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUuICBEbyBub3QgZ2l2ZSBhIHdhcm5pbmcKLQlmb3IgYSByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCBpZiBpdCBoYXMgYSBQQTY0IGhhc2gKLQl0YWJsZSBlbnRyeS4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IFNpZ25pZmljYW50bHkgcmV3b3JrLiAgSGFuZGxlICAgCi0JRExUSU5EIHJlbG9jYXRpb25zLiAgQ29tcHV0ZSB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHJlbG9jYXRpb24KLQliZWZvcmUgcGFzc2luZyB0aGUgdmFsdWUgb2YgZWxmX2hwcGFfcmVsb2NhdGVfaW5zbi4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFJldmFtcCB0byBoYW5kbGUganVzdCBiaXQgdGl3aWRkbGluZwotCXJlbG9jYXRpb24gc3VwcG9ydC4gIEhhbmRsZSBETFRJTkQgcmVsb2NhdGlvbiByZXF1ZXN0cyBqdXN0IGxpa2UKLQlETFRSRUwgcmVsb2NhdGlvbiByZXF1ZXN0cy4gIFNpbXBsaWZ5IGJyYW5jaCBoYW5kbGluZy4KLQotMTk5OS0wOS0wOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBDYXRjaCBwcm9ibGVtcyB3aXRoCi0Jbm9uLWFsbG9jYXRlZCBzZWN0aW9uIGFzIGRvbmUgaW4gaTM4NiB2ZXJzaW9uLgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogVW5jb21tZW50IFJfUEFSSVNDXzE0RiBpbiBzd2l0Y2gKLQlzdGF0ZW1lbnQgc2luY2UgdGhpcyBpcyBubyBrbm93IHJlbG9jYXRpb24uCi0KLVR1ZSBTZXAgIDcgMTc6MjU6MTIgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIERMVFJFTDE0RgotCXJlbG9jcy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBETFRSRUwxNFdSIGFuZAotCURMVFJFTDE0V0QgcmVsb2NzLiAgCi0JKGVsZl9ocHBhX3JlbG9jYXRlX2luc24pOiBTaW1pbGFybHkuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgRExUUkVMMTRSIGFuZAotCURMVFJFTDIxTCByZWxvY3MuICBQYXNzIHRoZSBvdXRwdXQgYmZkIHRvIGVsZl9ocHBhX3JlbG9jYXRlX2luc24uCi0JUGFzcyB0aGUgcmVsb2NhdGUgdHlwZSByYXRoZXIgdGhhbiB0aGUgaW5zbiBmb3JtYXQgdG8KLQllbGZfaHBwYV9yZWxvY2F0ZV9pbnNuLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogTWFrZSBzd2l0Y2ggZGVwZW5kZW50IG9uIHJlbG9jYXRpb24gdHlwZQotCXJhdGhlciB0aGFuIHRoZSBvcGNvZGUuICBIYW5kbGUgRExUUkVMMjFMIGFuZCBETFRSRUwxNFIgcmVsb2NzLgotCi0xOTk5LTA5LTA3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIF9iZmRfZmlsbm1sZW4gZmllbGQuCi0JKGJmZF9jb2ZmX2ZpbG5tbGVuKTogRGVmaW5lLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZmdlbi5jIChjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IFVzZSBiZmRfY29mZl9maWxubWxlbiByYXRoZXIKLQl0aGFuIEZJTE5NTEVOLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBMaWtld2lzZS4KLQkqIGNvZmYtc2guYyAoYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTA2ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogY29mZmNvZGUuaCAoc29ydF9ieV9zZWNhZGRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBpZgotCUNPRkZfSU1BR0VfV0lUSF9QRS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsIHNvcnQKLQlzZWN0aW9ucyBieSBWTUEgd2hlbiBhc3NpZ25pbmcgdGFyZ2V0X2luZGV4IHZhbHVlcy4gIEFsd2F5cyBzZXQKLQl2aXJ0X3NpemUuCi0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKTogQWRkIHBlX2ZsYWdzIGZpZWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spIFtDT0ZGX1dJVEhfUEUgdmVyc2lvbl06IFNldAotCXBlX2ZsYWdzIGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQpOiBBZGQgY29uc3QgdG8KLQlkZWNsYXJhdGlvbiB0byBtYXRjaCBkZWZpbml0aW9uLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHNldCBGX0FSMzJXKFIpPyBpZgotCUNPRkZfV0lUSF9QRS4KLQotCSogY29mZi1pMzg2LmMgKGluX3JlbG9jX3ApOiBBZGQgZGVjbGFyYXRpb24uCi0JKGkzODZjb2ZmX3ZlYyk6IFNpbXBsaWZ5IGluaXRpYWxpemF0aW9uIG9mCi0JYXBwbGljYXRpb25fc2VjdGlvbl9mbGFncy4KLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBXcml0ZSBzZXBhcmF0ZSBDT0ZGX1dJVEhfUEUKLQl2ZXJzaW9uLiAgTW92ZSBDT0ZGX1dJVEhfUEUgc3BlY2lmaWMgY29kZSB0byBuZXcgdmVyc2lvbi4KLQkoc3R5cGVfdG9fc2VjX2ZsYWdzKTogTGlrZXdpc2UuICBBZGQgc2VjdGlvbiBwYXJhbWV0ZXIuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IFNldCB0YXJnZXRfaW5kZXggYmVmb3JlCi0JY2FsbGluZyBzdHlwX3RvX3NlY19mbGFncy4gIFBhc3Mgc2VjdGlvbiB0byBzdHlwX3RvX3NlY19mbGFncy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogc3ltcy5jIChzdHQpOiBBZGQgc29tZSBQRS9QRUkgc2VjdGlvbiBuYW1lcy4KLQkoYmZkX2RlY29kZV9zeW1jbGFzcyk6IFJldHVybiAndycsIG5vdCAnVScsIGZvciBhIHdlYWsgdW5kZWZpbmVkCi0Jc3ltYm9sLgotCShiZmRfc3ltYm9sX2luZm8pOiBDaGVjayBmb3IgJ3cnLgotCi0JKiBzZWN0aW9uLmMgKHN0cnVjdCBiZmRfY29tZGF0X2luZm8pOiBEZWZpbmUuCi0JKGFzZWN0aW9uKTogQWRkIGNvbWRhdCBmaWVsZC4KLQkoU1REX1NFQ1RJT04pOiBJbml0aWFsaXplIGNvbWRhdCBmaWVsZC4KLQkoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wOS0wNiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDb3B5IE5PTl9HT1RfUkVGIGZsYWcKLQl0byB2ZXJzaW9uIHN5bWJvbHMuCi0KLTE5OTktMDktMDYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3JlY29yZF92dGVudHJ5KTogVXNlIGJmZF96bWFsbG9jIGFuZAotCWJmZF9yZWFsbG9jIGluc3RlYWQgb2YgY2FsbG9jIGFuZCByZWFsbG9jLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIGNwdS1wai5jOiBOZXcgZmlsZS4KLQkqIGVsZjMyLXBqLmM6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZCAocGoqKTogTmV3IGNwdS4KLQkocGotKi0qLCBwamwtKi0qKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9wal92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkoYmZkX2VsZjMyX3BqbF92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLSAJKiBhcmNodXJlcy5jIChiZmRfYXJjaF9waik6IERlZmluZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgYmZkX2FyY2hfcGouCi0JKiByZWxvYy5jOiBEZWZpbmUgQkZEX1JFTE9DX1BKXyogcmVsb2NhdGlvbnMuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9wal92ZWMsIGJmZF9lbGYzMl9wamxfdmVjKTogRGVjbGFyZSBhbmQgYWRkCi0JdG8gdGFyZ2V0IHZlY3RvciBsaXN0LgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVMpOiBBZGQgY3B1LXBqLmxvLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS1wai5jLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1wai5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLXBqLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmLWJmZC5oIChFTEZfTElOS19OT05fR09UX1JFRik6IERlZmluZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENvcHkgUkVGX1JFR1VMQVJfTk9OV0VBSwotCWFuZCBOT05fR09UX1JFRiBmcm9tIHdlYWsgZGVmaW5lZCBzeW1ib2wgdG8gcmVhbCBzeW1ib2wuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IFNldCBOT05fR09UX1JFRi4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgTk9OX0dPVF9SRUYgaXMgbm90IHNldCwgZG9uJ3QKLQljcmVhdGUgYSBDT1BZIHJlbG9jLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogU2V0IE5PTl9HT1RfUkVGLgotCShlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBOT05fR09UX1JFRiBpcyBub3Qgc2V0LAotCWRvbid0IGNyZWF0ZSBhIENPUFkgcmVsb2MuCi0KLTE5OTktMDktMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IFdoZW4gY291bnRpbmcgcmVsb2NhdGlvbnMsIGRvbid0Ci0JY291bnQgdGhvc2UgaW4gc2VjdGlvbnMgd2UgYXJlIG5vdCBpbmNsdWRpbmcgaW4gdGhlIGxpbmsuCi0KLVRodSBTZXAgIDIgMTc6NDE6MjAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdvcmsgYXJvdW5kIGJvZ3VzIFNIX0xJTksKLQlmaWVsZCBpbiBocHV4MTEgc2hhcmVkIGxpYnJhcmllcy4KLQotMTk5OS0wOS0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkpOiBGaXggbWVtb3J5IGxlYWsuCi0KLVdlZCBTZXAgIDEgMTM6MzQ6MjkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9hZGRfc3ltYm9sX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmssIGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSwgZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IExpa2V3aXNlLgotCi0xOTk5LTA4LTMxICBBbGV4YW5kcmUgUGV0aXQtQmlhbmNvICA8YXBiaWFuY29AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChyZWNvcmRfbGlua19hc3NpZ25tZW50KTogV2hlbiBwb3NzaWJsZSwga2VlcCB0aGUKLQlvcmlnaW5hbCB0eXBlIG9mIHRoZSBzeW1ib2wuCi0KLU1vbiBBdWcgMzAgMTU6MjY6NDggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlKTogQWxsb3cgYm90aAotCVJfUEFSSVNDX0RJUjMyIGFuZCBSX1BBUklTQ19ESVI2NCByZWdhcmRsZXNzIG9mIGhvdyB0aGUKLQl0b29scyB3ZXJlIGNvbmZpZ3VyZWQuCi0JKiBlbGYzMi1ocHBhLmggKF9iZmRfZWxmMzJfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IERlY2xhcmUuCi0KLTE5OTktMDgtMjYgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBEb24ndCBhbGxvY2F0ZSBsb2NhbAotCUdPVCBlbnRyaWVzIGZvciBHT1QxNiByZWxvY2F0aW9uczsgdGhleSdyZSBub3QgcmVxdWlyZWQuCi0KLTE5OTktMDgtMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlGcm9tIGEgcGF0Y2ggc3VibWl0dGVkIGJ5IFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGJhYWxwZXJhemltLmZyb2IuY29tPgotCi0JKiBjb25maWcuYmZkIChhcm0tKi1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtbmV0YnNkX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkICZhcm1uZXRic2RfdmVjLgotCi0JKiBNYWtlZmlsZS5hbSAoQkZEMzJfQkFDS0VORFMpOiBBZGQgYXJtbmV0YnNkLmxvLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGFybW5ldGJzZC5jLgotCShhcm1uZXRic2QubG8pOiBOZXcgcnVsZSB3aXRoIGRlcHMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkKLQkqIGFybW5ldGJzZC5jOiBOZXcgZmlsZTogIERlZmluaXRpb25zIHNwZWNpZmljIHRvIGFybS1uZXRic2QKLQl0YXJnZXQuIAotCi1UdWUgQXVnIDI0IDAwOjI1OjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBGaXggdHlwbyBpbiBjb21tZW50LgotCi1GcmkgQXVnIDIwIDE3OjAxOjIzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmFrZV9zZWN0aW9ucyk6IENvbXB1dGUgc2VjdGlvbiBpbmRpY2VzCi0JaGVyZSBpbnN0ZWFkIG9mIHVzaW5nIGVsZl9zZWN0aW9uX2RhdGEuLi4KLQotMTk5OS0wOC0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChtY29yZV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSk6IE5ldyBmdW5jdGlvbjogIEVtaXQKLQlyZWxvY2F0aW9ucyBpbnRvIHRoZSBiYXNlIGZpbGUuCi0JKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IENhbGwgbWNvcmVfZW1pdF9iYXNlX2ZpbGVfZW50cnkgaWYKLQl3ZSBhcmUgYnVpbGRpbmcgYSBiYXNlIGZpbGUuCi0KLTE5OTktMDgtMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChhcm1fYWRkX3RvX3JlbCk6IE5ldyBmdW5jdGlvbi4gIEFkZCBhIHZhbHVlIHRvCi0JYSBSRUwgc3R5bGUgcmVsb2MuCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIGFybV9hZGRfdG9fcmVsIHRvIGluY3JlbWVudAotCVJFTCByZWxvY3Mgd2hlbiBwZXJmb3JtaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLgotCi0xOTk5LTA4LTE4ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogY29mZmxpbmsuYzogTW92ZSBkZWZpbml0aW9ucyBvZiBOX1RNQVNLLCBldC4gYWwuLCBvdXQgb2YKLQlfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgaW50byB0b3AgbGV2ZWwuCi0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBIYW5kbGUgUl9JTUFHRUJBU0UuCi0JKFJUWVBFMkhPV1RPKTogUmV0dXJuIE5VTEwgaWYgcmVsb2MgdHlwZSBpcyBvdXQgb2YgcmFuZ2UuCi0JKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2UgYSAtMiB0byBOX0RFQlVHLgotCUNvbXBsZXRlbHkgaWdub3JlIHN5bWJvbHMgd2hpY2ggYXJlIGFsbCB6ZXJvLgotCShkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogQWRkIHJldHVybiAwLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogUmVuYW1lIGlubmVyIHNjb3BlCi0JdmFyaWFibGUgY29weSB0byBuYW1lX2NvcHkgdG8gYXZvaWQgc2hhZG93aW5nIG91dGVyIHNjb3BlCi0JdmFyaWFibGUuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZGF0YV90eXBlKTogQ2hhbmdlIHJhd19zeW1lbnRfY291bnQgZmllbGQKLQlmcm9tIHVuc2lnbmVkIGludCB0byB1bnNpZ25lZCBsb25nLiAgQWRkIHRpbWVzdGFtcCBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotMTk5OS0wOC0xNyAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBlbGYzMi1ocHBhLmMgKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IEZpeCB0eXBvIGluCi0JbWFjcm8gZGVmaW5pdGlvbi4KLQotMTk5OS0wOC0xNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBTZXQgQlNGX0RZTkFNSUMKLQlmb3Igc3BlY2lhbCBzZWN0aW9uIHN5bWJvbHMuCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBJZiB3ZSBoYXZlIG5vIG9sZCBCRkQsIGNoZWNrCi0JQlNGX0RZTkFNSUMgb24gdGhlIHNlY3Rpb24gc3ltYm9sIHRvIHNlZSB3aGV0aGVyIHRoZSBvbGQgQkZEIGlzCi0JZHluYW1pYy4KLQotMTk5OS0wOC0xNSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEZpeCB1bmZvcnR1bmF0ZQotCWNvaW5jaWRlbmNlIG9mIHZhcmlhYmxlIG5hbWVzIGJldHdlZW4gb2xkIGFuZCBuZXcgY29kZS4KLQotMTk5OS0wOC0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV90b190aHVtYl9zdHViKTogIE1ha2UgJ29mZnNldCcgcGFyYW1ldGVyCi0JaW50byBhIGJmZF92bWEgYW5kICdhZGRlbmQnIHBhcmFtZXRlciBhICdiZmRfc2lnbmVkX3ZtYScuCi0JKGVsZjMyX3RodW1iX3RvX2FybV9zdHViKTogIE1ha2UgJ29mZnNldCcgcGFyYW1ldGVyIGludG8gYSBiZmRfdm1hCi0JYW5kICdhZGRlbmQnIHBhcmFtZXRlciBhICdiZmRfc2lnbmVkX3ZtYScuCi0JKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogRG8gbm90IGludm9sdmUgc3R1YnMgaW4KLQlSX0FSTV9USE1fUEMyMiByZWxvY3MgcmVsYXRpdmUgdG8gc2VjdGlvbiBzeW1ib2xzLCB0aGV5IGFyZSBsb25nCi0JanVtcHMsIG5vdCBmdW5jdGlvbiBjYWxscy4KLQotMTk5OS0wOC0xMSAgUm9iaW4gRmFyaW5lIDxhZHZhbmNAZGlhbC5ldW5ldC5jaD4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogQ2hlY2sgZm9yIG92ZXJmbG93Ci0JaW4gUl9BUk1fUEMyNCByZWxvY3MuCi0KLVR1ZSBBdWcgMTAgMTI6NDg6MDkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9mYWtlX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmMzItaHBwYS5jIChlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zKTogRGVmaW5lLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVXBkYXRlIGZvcgotCXJlY2VudCBjaGFuZ2VzIHRvIHRoZSBhcmNoX2luZm8gc3RydWN0dXJlLgotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlKTogSGFuZGxlCi0JUl9IUFBBX1NFR0JBU0UgYW5kIFJfSFBQQV9TRUdSRUwzMi4KLQkqIGNwdS1ocHBhLmMgKGJmZF9ocHBhMjB3X2FyY2gpOiBOZXcgZW50cnkgaW4gYXJjaGl0ZWN0dXJlIGluZm8KLQlsaXN0LgotCi1UdWUgQXVnIDEwIDAwOjM0OjI5IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0JICAgICAgICAgICAgICAgICAgUmFsZiBCYWVjaGxlIDxyYWxmQHVuaS1rb2JsZW56LmRlPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWx3YXlzCi0Jb3V0cHV0IERUX01JUFNfR09UU1lNLgotCShfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogVXNlIHRoZSBzYW1lIHZhbHVlIGFzCi0JRFRfTUlQU19TWU1UQUJOTyBpZiB0aGVyZSBhcmUgbm8gZ2xvYmFsIEdPVCBzeW1ib2xzLgotCi1UdWUgQXVnIDEwIDAwOjIxOjA4IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbik6IENoYW5nZQotCXByb3RvdHlwZS4gIEhhbmRsZSBsb2NhbCBzeW1ib2xzLiAgQWRkIGNvbW1lbnRhcnkuCi0JKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogQWRqdXN0IGFjY29yZGluZ2x5LgotCShfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSBsb2NhbCBzeW1ib2xzIGluIFJfTUlQU18zMgotCXJlbG9jYXRpb25zLiAKLQkKLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogVHdlYWsgbGFzdCBjaGFuZ2UuCi0KLTE5OTktMDgtMDkgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uKTogVXNlIHRoZSBjb3VudHMgaW4gdGhlCi0JZWxmLXNlY3Rpb24gZGF0YSB0byBhbGxvY2F0ZSBqdXN0IHRoZSByaWdodCBhbW91bnQgb2YgcmVsb2NhdGlvbgotCXNwYWNlLiAgRG9uJ3QgYWxsb2NhdGUgdGhlIGhhc2ggc3BhY2UgdHdpY2UuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHNwYWNlIHRvIGFsbG9jYXRlIGluCi0JZWFjaCByZWxvY2F0aW9uIHNlY3Rpb24uCi0KLU1vbiBBdWcgIDkgMTc6Mzc6MzAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlLCBjYXNlIDMyKTogV2hlbiBpbgotCTY0Yml0IG1vZGUsIGdlbmVyYXRlIGEgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBhIDMyYml0Ci0Jd2lkZSByZWxvY2F0aW9uLgotCShlbGZfaHBwYV9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVsZXRlZC4gIFRvIGJlCi0Jc2hhcmVkIGJldHdlZW4gMzJiaXQgYW5kIDY0Yml0IHBvcnQuCi0KLTE5OTktMDgtMDkgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBGaXggc3JjX21hc2sgZm9yCi0JUl9NSVBTX0dPVDE2IGFuZCBSX01JUFNfQ0FMTDE2LgotCShtaXBzX2VsZl9nb3QxNl9lbnRyeSk6IFVzZSBtaXBzX2VsZl9oaWdoIHRvIGNhbGN1bGF0ZSB0aGUgdmFsdWUKLQl0byB1c2Ugd2hlbiBsb29raW5nIGZvciBhIHByZWV4aXN0aW5nIEdPVCBlbnRyeS4KLQotMTk5OS0wOC0wOSAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQmFjayBvdXQgcGFydCBvZgotCXRoZSBTZXAuIDR0aCwgMTk5OCBjaGFuZ2UuICBnbGliYyAyLjAueCBkeW5hbWljIGxpbmtlciBoYWQgYnVnLAotCW5vdCBiaW51dGlscy4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotMTk5OS0wOC0wOSAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCBvdXRwdXQgYSB3ZWFrCi0JcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wganVzdCBiZWNhdXNlIGl0IHdhcyBkZWZpbmVkIHdlYWsKLQlpbiBhIHNoYXJlZCBvYmplY3QuCi0KLTE5OTktMDgtMDkgIEVsaSBaYXJldHNraWkgIDxlbGl6QGlzLmVsdGEuY28uaWw+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFdoZW4gbG9va2luZyBmb3IgZmlsZSwgdXNlCi0JbGFzdCBiZXN0IG1hdGNoIHJhdGhlciB0aGFuIGZpcnN0LiAgSWYgYWRkcmVzcyBpcyBiZXlvbmQgbGFzdCBsaW5lCi0JbnVtYmVyIHJlY29yZCwgZG9uJ3QgcmV0dXJuIHRoZSBsYXN0IGxpbmUgYXMgdGhlIGNvcnJlY3QgdmFsdWUuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzZWN0aW9uLmMgKFNFQ19TTUFMTF9EQVRBKTogUmVuYW1lIGZyb20gU0VDX1NIT1JULgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA4ICBNYXJrIEVsYnJlY2h0ICA8c25vd2JhbGwzQGJpZ2Zvb3QuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X2VudHJ5KTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfY3VzdG9tX3NlY3Rpb25fYWxpZ25tZW50KTogTmV3IHN0YXRpYwotCWZ1bmN0aW9uLgotCShjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlKTogTmV3IHN0YXRpYyBhcnJheS4KLQkoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogVXNlIGNvZmZfc2V0X2N1c3RvbWVyX3NlY3Rpb25fYWxpZ25tZW50LgotCSogY29mZi1nbzMyLmMgKENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyk6IERlZmluZS4KLQkqIGNvZmYtc3RnbzMyLmMgKENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyk6IERlZmluZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZW5hbWUgLmRlcCogZmlsZXMgdG8gREVQKi4gIENoYW5nZSBERVAgdmFyaWFibGUgdG8KLQlNS0RFUC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogc2VjdGlvbi5jIChTRUNfU0hBUkVEKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBIYW5kbGUgU0VDX1NIQVJFRC4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBMaWtld2lzZS4KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY2xhc3NpZnlfc3ltYm9sKTogQ29tbWVudCBvdXQgcGFydCBvZgotCTE5OTktMDgtMDUgY2hhbmdlIHdoaWNoIGJyZWFrcyBjeWd3aW4gRExMcy4KLQotCSogYWNpbmNsdWRlLm00IChCRkRfQklOQVJZX0ZPUEVOKTogQ2hhbmdlIC13aW5kb3dzIHRvIC13aW5kb3dzKi4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wOC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoZ2xvYmFsX3N5bXMpOiBPbmx5IGluaXRpYWxpemUgdW5pb24gZmllbGQgaWYKLQlfX1NURENfXy4KLQotMTk5OS0wOC0wNCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9nb3QxNl9lbnRyeSk6IERvbid0IG11bHRpcGx5IEdPVCBpbmRleCBieQotCXRoZSBzaXplIG9mIGEgR09UIGVudHJ5IGhlcmUuCi0JKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogRG9uJ3QgY3JlYXRlIGEgbG9jYWwgR09UIGVudHJ5Ci0JZm9yIHRoZSBzeW1ib2wgaW4gYSBHT1QxNiByZWxvY2F0aW9uOyBqdXN0IGZvciBpdCdzIGhpZ2gtb3JkZXIgYml0Ci0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0aGlua28uCi0KLTE5OTktMDgtMDUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIERvbm4gVGVycnkgPGRvbm5AaW50ZXJpeC5jb20+OgotCSogY29mZmNvZGUuaCAoZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbik6IERlZmluZS4KLQkoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogUmVuYW1lIF9iZmRfY29mZl9zeW1faXNfZ2xvYmFsIHRvCi0JX2JmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbC4gIENoYW5nZSByZXR1cm4gdHlwZS4KLQkoYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKTogUmVuYW1lIGZyb20gYmZkX2NvZmZfc3ltX2lzX2dsb2JhbC4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgY29mZl9jbGFzc2lmeV9zeW1ib2wuCi0JKGNvZmZfY2xhc3NpZnlfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9zeW1faXNfZ2xvYmFsKTogTmV2ZXIgZGVmaW5lLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgd2l0aCBjb2ZmX2NsYXNzaWZ5X3N5bWJvbC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogVXNlCi0JYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sIHJhdGhlciB0aGFuIGJmZF9jb2ZmX3N5bV9pc19nbG9iYWwuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkqIGNvZmYtc2guYyAoYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgd2l0aAotCWNvZmZfY2xhc3NpZnlfc3ltYm9sLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi1XZWQgQXVnICA0IDE4OjA4OjA3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChSX0hQUEFfTFRQU0VMLCBSX0hQUEFfUlRQU0VMKTogTmV3IGZpZWxkIHNlbGVjdG9ycwotCShlX2x0cHNlbCwgZV9ydHBzZWwpOiBTaW1pbGFybHkuCi0KLQkqIGVsZi1ocHBhLmggKF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgMjFiaXQgZV9sdHBzZWwKLQlhbmQgMTRiaXQgZXJ0cHNlbC4gIEhhbmRsZSA2NGJpdCBwc2VsLgotCi0xOTk5LTA4LTA0ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFR3ZWFrIEhJMTYvTE8xNgotCWhhbmRsaW5nIGZvciBSRUwgcmVsb2NhdGlvbnMuICBBbmQgb25seSBsZWZ0LXNoaWZ0IFJfTUlQUzI2Ci0JcmVsb2NhdGlvbiBhZGRlbmRzIHdoZXJlIG5lY2Vzc2FyeS4KLQotMTk5OS0wOC0wMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9uZXh0X2xvMTZfYWRkZW5kKTogUmVuYW1lIHRvIC4uLgotCShtaXBzX2VsZl9uZXh0X2xvMTZfcmVsb2NhdGlvbik6IERvbid0IGNvbXB1dGUgdGhlIGFkZGVuZCBoZXJlLgotCUp1c3QgcmV0dXJuIHRoZSByZWxvY2F0aW9uIGZvdW5kLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUHVsbCB0aGUgTE8xNiBhZGRlbmQgb3V0IG9mIHRoZQotCXNlY3Rpb24gaXRzZWxmIHdoZW4gdXNpbmcgUkVMIHJlbG9jYXRpb25zLgotCQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IFJlc3RvcmUKLQlfRFlOQU1JQ19MSU5LIGhhbmRsaW5nIGFuZCBoYW5kbGluZyBvZiB1bmRlZmluZWQgc3ltYm9scyBpbiBzaGFyZWQKLQlsaWJyYXJpZXMuCi0KLTE5OTktMDgtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdXNlIHRoZSByZWxvY2F0aW9uCi0JdmFsdWUgb2YgYSBzeW1ib2wgaW4gYSBTRUNfREVCVUdHSU5HIHNlY3Rpb24uICBXYXJuIHdoZW4gZG9pbmcgYQotCXJlbG9jYXRpb24gYWdhaW5zdCBhIHN5bWJvbCBpbiBhbiBpbnB1dCBzZWN0aW9uIHdpdGggbm8gb3V0cHV0Ci0Jc2VjdGlvbi4gIEZyb20gRGFuaWVsIEphY29ib3dpdHogPGRyb3dAZmFsc2Uub3JnPi4KLQotCSogY29mZi1zdGdvMzIuYyAoZ28zMl9zdHViYmVkX2NvZmZfb2JqZWN0X3ApOiBSZW1vdmU7IG5vdCB1c2VkLgotCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9DQ19GT1JfQlVJTEQpOiBDaGFuZ2UgdG8gdXNlIGNvbmZ0ZXN0LCBhbmQgdG8KLQlsb29rIGZvciBnZW5lcmF0ZWQgZmlsZSBjb3JyZWN0bHkuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDgtMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfTUlQU18yNgotCWFuZCBSX01JUFMxNl8yNiByZWxvY2F0aW9ucyBjb3JyZWN0bHkgd2hlbiByZWxvY2F0aW5nLgotCShfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IERvbid0IGFzc3VtZSB0aGF0IFJfTUlQU19DQUxMX0hJMTYKLQlhbmQgUl9NSVBTX0NBTExfTE8xNiBhcmUgZm9yIGdsb2JhbCBzeW1ib2xzLgotCQotMTk5OS0wOC0wMiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IENvcHkgdGhlIHdob2xlIGlzeW0sIG5vdCBqdXN0Ci0Jc29tZSBmaWVsZHMuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9vdXRwdXRfYXJjaF9zeW1zKTogRGVjbGFyZSB1c2VkCi0JdmFyaWFibGVzIGFuZCBpbml0aWFsaXplIHRoZW0uCi0KLTE5OTktMDgtMDEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogSGFuZGxlIHRoZSBjYXNlIHdoZXJlCi0JdGhlcmUgYXJlIG5vIGdsb2JhbCBzeW1ib2xzIHJlcXVpcmluZyBHT1QgZW50cmllcy4KLQkoX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogVW5kZWZpbmVkIHdlYWsKLQlzeW1ib2xzIGFyZSBjb25zaWRlcmVkIHRvIGhhdmUgdGhlIHZhbHVlIHplcm8uCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHRyeSB0byBwZXJmb3JtIGEKLQlyZWxvY2F0aW9uIGZvciBhbiB1bmRlZmluZWQgc3ltYm9sLgotCShfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEFsbG9jYXRlIGxvY2F0ZSBHT1Qgc3BhY2UgZm9yIGxvY2FsCi0JR09UMTYgcmVsb2NhdGlvbnMuCi0KLTE5OTktMDctMzAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfYnVpbGRfcGx0KTogQ29zbWV0aWMgY2hhbmdlIC0gQUJJCi0Jd2FudHMgYmEsYSxwdCAleGNjIGluc3RlYWQgb2YgJWljYy4KLQlFbWl0IGNvcnJlY3QgLlBMVDAtKC5QTFROKzQpIGluaXRpYWwgdmFsdWUgaW50byB0aGUgcG9pbnRlciBzbG90cwotCW9mIGxhcmdlIFBMVCBlbnRyaWVzLgotCShzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCk6IEZpeCBjYWxjdWxhdGlvbi4KLQkoc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTmVnYXRpdmUgdmFsdWUgb2YgUl9TUEFSQ19KTVBfU0xPVAotCWFkZGVuZCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gbG9hZCBhZGRyZXNzLCBub3QgLnBsdCBzZWN0aW9uIHN0YXJ0LgotCShzcGFyYzY0X2VsZl9zaXplX2luZm8pOiBTcGFyYzY0IHVzZXMgMzJiaXQgLmhhc2ggZW50cmllcy4KLQotMTk5OS0wNy0zMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkCi0JcHJpbnRfc3ltYm9sX2FsbCBhbmQgb3V0cHV0X2FyY2hfc3ltcyBiYWNrZW5kIG1ldGhvZHMuCi0JKiBlbGZ4eC10YXJnZXQuaDogTGlrZXdpc2UuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwKLQlzcGFyYzY0X2VsZl9hZGRfc3ltYm9sX2hvb2ssIHNwYXJjNjRfZWxmX291dHB1dF9hcmNoX3N5bXMsCi0Jc3BhcmM2NF9lbGZfZ2V0X3N5bWJvbF90eXBlLCBzcGFyYzY0X2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGVhdmUgc3BhY2UgZm9yIFNUVF9SRUdJU1RFUgotCXN5bWJvbHMgaW4gLmR5bnN5bSwgYWRkIHRoZWlyIG5hbWVzIGludG8gLmR5bnN0ci4gUHV0IHRob3NlIHN5bWJvbHMKLQlpbnRvIGR5bmxvY2FsLgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEZpeCB1cCBEVF9TUEFSQ19SRUdJU1RFUgotCXBvaW50ZXJzIHRvIFNUVF9SRUdJU1RFUiBzeW1ib2xzIGluIGR5bnN5bSBzZWN0aW9uLgotCShzcGFyYzY0X2VsZl9wcmludF9zeW1ib2xfYWxsKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogQWxsb3cgc3BlY2lhbCBiYWNrZW5kIHN5bWJvbAotCXByaW50aW5nIHVzaW5nIHRoZSBwcmludF9zeW1ib2xfYWxsIGhvb2suCi0KLTE5OTktMDctMzAgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyk6ICBVc2Ugcl9vZmZzZXQgZm9yCi0JUl9BUk1fR05VX1ZURU5UUlkuCi0KLTE5OTktMDctMjkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogT25seSByZS1zb3J0IGR5bnN5bXMgaWYKLQlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQuCi0KLTE5OTktMDctMjkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IFNwbGl0IG91dCBzd2l0Y2ggdG8gLi4uCi0JKG1pcHNfcnR5cGVfdG9faG93dG8pOiAuLi4gbmV3IGZ1bmN0aW9uLgotCShfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgaXQuCi0KLTE5OTktMDctMjggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8uCi0KLTE5OTktMDctMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlQYXRjaCBnZW5lcmF0ZWQgYnkgQmVybmQgU2NobWlkdC4gPGJlcm5kc0BjeWdudXMuY28udWs+Ci0JCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9pc19sb2NhbF9sYWJlbF9uYW1lKTogQ2hhbmdlIHRvIHN0cmlwCi0Jb3V0IG9ubHkgc3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggTE9DQUxfTEFCRUxfUFJFRklYIGZvbGxvd2VkIGJ5ICdMJy4KLQotMTk5OS0wNy0yMyAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgY29mZl9saW5rX2hhc2hfZmxhZ3MKLQlmaWVsZCwgYW5kIGRlZmluZSBDT0ZGX0xJTktfSEFTSF9QRV9TRUNUSU9OX1NZTUJPTC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IElmIFBFLCBoYW5kbGUgc2VjdGlvbgotCXN5bWJvbHMgc3BlY2lhbGx5LgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1pbnRlcml4Kik6IE5ldyB0YXJnZXQuCi0KLTE5OTktMDctMjEgIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAYmlnZm9vdC5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMgYW5kCi0JQ09GRl9TVVBQT1JUX0dOVV9MSU5LT05DRSwgbWFyayBzZWN0aW9ucyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoCi0JLmdudS5saW5rb25jZSB3aXRoIFNFQ19MSU5LT05DRSBhbmQgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJELgotCSogY29mZi1nbzMyLmM6IChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkoQ09GRl9TVVBQT1JUX0dOVV9MSU5LT05DRSk6IERlZmluZS4KLQkqIGNvZmYtc3RnbzMyLmM6IChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkoQ09GRl9TVVBQT1JUX0dOVV9MSU5LT05DRSk6IERlZmluZS4KLQotMTk5OS0wNy0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIE1hcmsgRWxicmVjaHQ6Ci0JKiBtYWtlZmlsZS5kb3M6IFJlbW92ZTsgb2Jzb2xldGUuCi0JKiBjb25maWd1cmUuYmF0OiBSZW1vdmU7IG9ic29sZXRlLgotCi0xOTk5LTA3LTIxICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLXZ4d29ya3MqKTogQWRkIHRhcmdfdW5kZXJzY29yZT15ZXMuCi0KLTE5OTktMDctMjEgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogSXNzdWUgYW4gZXJyb3IKLQltZXNzYWdlCWFuZCBmYWlsIGlmIGEgc3ltYm9sIGluZGV4IGlzIG91dCBvZiByYW5nZS4KLQotMTk5OS0wNy0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBHZXQgdGhlIEdQIHZhbHVlCi0Jd2hlbiBsb29raW5nIGF0IGEgUl9NSVBTX0dPVDE2IHJlbG9jYXRpb24uCi0KLTE5OTktMDctMjAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbTg4ay5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0KLU1vbiBKdWwgMTkgMTQ6MDM6NDQgMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZXN0b3JlIHNldHRpbmcgb2YgR1AKLSAJcmVtb3ZlZCBpbiBwcmV2aW91cyBjaGFuZ2UuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkanVzdCBHUCByZWxhdGl2ZSByZWxvY2F0aW9ucwotIAlpbiByZWxvY2F0ZWFibGUgb3V0cHV0LgotCi0xOTk5LTA3LTE5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZi1tODhrLmMgKG04OGtiY3NfdmVjKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldAotCXN0cnVjdHVyZS4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogRG8gbWVyZ2Ugc3ltYm9scyBmcm9tIHRoZSBzYW1lIEJGRAotCWlmIHRoZXkgYXBwZWFyIHRvIGJlIHNwZWNpYWxseSBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIuCi0KLTE5OTktMDctMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYWx0ZXJuYXRpdmVfdGFyZ2V0KTogTmV3IGZpZWxkIGluIGJmZF90YXJnZXQKLQlzdHJ1Y3R1cmUuCi0JKGJmZF9zZWFyY2hfZm9yX3RhcmdldCk6IE5ldyBmdW5jdGlvbjogIEZpbmQgYSB0YXJnZXQgdGhhdAotCXNhdGlzaWZpZXMgYSBzZWFyY2ggZnVuY3Rpb24uCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZnh4LXRhcmdldC5oOiBJbml0aWFsaXNlIHRoZSBhbHRlcm5hdGl2ZV90YXJnZXQgZmllbGQgb2YKLQl0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmVzIHRvIHBvaW50IHRvIHRoZSBvdGhlciB0YXJnZXQgKGlmCi0JZGVmaW5lZCkuCi0JKiBubG0tdGFyZ2V0Lmg6IEluaXRpYWxpc2UgdGhlIGFsdGVybmF0aXZlX3RhcmdldCBmaWVsZCBvZgotCXRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZXMgdG8gcG9pbnQgdG8gdGhlIG90aGVyIHRhcmdldCAoaWYKLQlkZWZpbmVkKS4KLQkKLQkqIGNvZmZjb2RlLmggKENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDKTogTmV3IG1hY3JvLgotCShDUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyk6IE5ldyBtYWNyby4KLQkKLQkqIGFpeDM4Ni1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGFvdXQtYWRvYmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogYW91dC1hcm0uYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogYW91dC10YXJnZXQuaDogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogYW91dC10aWMzMC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBiaW5hcnkuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogYm91dC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjaXNjby1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNvZmYtYTI5ay5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLWFscGhhLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNvZmYtYXBvbGxvLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtYXJtLmM6IFVzZSBDUkVBVEVfe0JJR3xMSVRUTEV9X0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtaDgzMDAuYzogVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1oODUwMC5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLWkzODYuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1pODYwLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNvZmYtaTk2MC5jOiBVc2UgQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLW02OGsuYzogVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1tY29yZS5jOiBVc2UgQ1JFQVRFX3tCSUd8TElUVExFfV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLW1pcHMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1wcGMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1yczYwMDAuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1zaC5jOiAgVXNlIENSRUFURV97QklHfExJVFRMRX1fQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1zcGFyYy5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLXRpYzMwLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNvZmYtdGljODAuYzogVXNlIENSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi13NjUuYzogICBVc2UgQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLXdlMzJrLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtejhrLmM6ICAgVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogaHBwYWJzZC1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGhwdXgtY29yZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBpMzg2bXNkb3MuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogaTM4Nm9zOWsuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogaWVlZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBpaGV4LmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGlyaXgtY29yZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBtaXBzYnNkLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIG5ldGJzZC1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIG9hc3lzLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIG9zZi1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHBwY2Jvb3QuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogcHRyYWNlLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogc2NvNS1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHNvbS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBzcmVjLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHRla2hleC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiB0cmFkLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogdmVyc2Fkb3MuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogdm1zLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQotMTk5OS0wNy0xOSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyByZWxfaGFzaAotCWFuZCByZWxfaGRyLgotCi1TYXQgSnVsIDE3IDAyOjI4OjI4IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRqdXN0X3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogVXNlIGl0LgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBEZWFsIHdpdGggdGhlIGZhY3QgdGhhdCB0aGVyZSBjYW4gYmUgCi0JdHdvIHJlbG9jYXRpb24gc2VjdGlvbnMgZm9yIGEgc2luZ2xlIHNlY3Rpb24uCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IEdQIGZvciAKLQlhIHJlbG9jYXRlYWJsZSBvYmplY3QuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSByZWxvY2F0ZWFibGUgbGlua3MuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaW5mb190b19ob3d0byk6IFVzZSBFTEY2NF9SX1RZUEVfSUQuCi0JKHNwYXJjNjRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCwKLQlzcGFyYzY0X2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwKLQlzcGFyYzY0X2VsZl9zbHVycF9vbmVfcmVsb2NfdGFibGUsIHNwYXJjNjRfZWxmX3NsdXJwX3JlbG9jX3RhYmxlLAotCXNwYXJjNjRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jLCBzcGFyYzY0X2VsZl93cml0ZV9yZWxvY3MpOgotCU5ldyBmdW5jdGlvbnMuCi0JKHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcywgc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZQotCUVMRjY0X1JfVFlQRV9JRC9EQVRBIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0xOTk5LTA3LTE2ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFJlbW92ZQotCURUX1NQQVJDX1BMVEZNVC4KLQotMTk5OS0wNy0xNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wKTogTmV3IHN0YXRpYwotCWZ1bmN0aW9uLgotCShtaXBzX2VsZl9uZXh0X2xvMTZfYWRkZW5kKTogQ2FsbCBiZmRfc2V0X2Vycm9yIG9uIGZhaWx1cmUuCi0JKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogVXNlIG1pcHNfZWxmX2xvY2FsX3JlbG9jYXRpb25fcC4KLQlBbHdheXMgc2V0ICpyZXF1aXJlX2phbHhwLgotCShtaXBzX2VsZl9zdHViX3NlY3Rpb25fcCk6IE1hcmsgYWJmZCBwYXJhbWV0ZXIgYXMgdW51c2VkLgotCShfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBPbmx5IGxvb2sgZm9yIExPMTYgZm9sbG93aW5nCi0JR09UMTYgaWYgdGhlIEdPVDE2IGlzIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wuICBEb24ndCByZXR1cm4gZmFsc2UKLQlmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbC4gIElmIHRoZXJlIGlzIGFuIG92ZXJmbG93LCBhc3NlcnQgdGhhdCB3ZQotCWhhdmUgYSBuYW1lLgotCi0xOTk5LTA3LTE2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbCk6IFJlbW92ZSB1bnVzZWQKLQl2YXJpYWJsZXMgYGxpbmsnIGFuZCBgZWxmc2VjJy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgb3MnLgotCi1UaHUgSnVsIDE1IDE3OjU1OjMxIDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBEb24ndCByZXF1aXJlCi0JYSBQVF9QSERSIHByb2dyYW0gaGVhZGVycy4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3QgYXNzdW1lIHRoZXJlIGFyZSBnb2luZyB0byBiZQotCXNlY3Rpb24gc3ltYm9scyB3aGVuIHdlJ3JlIG5vdCBidWlsZGluZyBhIHNoYXJlZCBvYmplY3QuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogTWFrZSBzdXJlIHdlIGhhdmUgYSBHT1Qgd2hlbgotCXdlIG5lZWQgb25lLgotCi0xOTk5LTA3LTE1ICBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFjay5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLXZ4d29ya3MqKTogTmV3IHRhcmdldC4KLQotMTk5OS0wNy0xNSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zdHViX3NlY3Rpb25fcCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBIYW5kbGUgTUlQUzE2IHN0dWIgZnVuY3Rpb25zLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IGNhbGxpbmcgc2VxdWVuY2UgZm9yCi0JbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gYW5kIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogVHVybiBgamFsJyBpbnRvIGBqYWx4JyB3aGVyZQotCXJlcXVpcmVkLgotCi0xOTk5LTA3LTE1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuOS41LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgSnVsIDE1IDAyOjU2OjE1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSwgY2FzZSBSX0hQUEEpOiBIYW5kbGUKLQk2NGJpdCBmb3JtYXQuCi0JKF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUsIGNhc2UgUl9HT1RPRkYpOiBVc2UgYmFzZSByZWxvYyB0eXBlCi0JdG8gZGVyaXZlIGZpbmFsIHR5cGUgaW5zdGVhZCBvZiBoYXJkd2lyaW5nIGEgc2VsZWN0aW9uLgotCi0xOTk5LTA3LTE0ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX29idGFpbl9jb250ZW50cyk6IFN3YXAgMTYtYml0IGhhbHZlcyBvZgotCXRoaW5ncyByZWxvY2F0ZWQgYnkgUl9NSVBTMTZfR1BSRUwuCi0JKG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCi1XZWQgSnVsIDE0IDE1OjIzOjE5IDE5OTkgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogZWxmeHgtdGFyZ2V0LmggKGVsZk5OX2JlZCk6IEFkZCBlbGZfYmFja2VuZF93YW50X2R5bmJzcy4KLQotMTk5OS0wNy0xNCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19nb3RfaW5mbyk6IEFkZCBnbG9iYWxfZ290bm8uCi0JKF9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IGl0LgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZS1zb3J0OyB2ZXJpZnkgdGhlIGdvdCBkaWQgbm90IGdyb3cuCi0JKG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSk6IFNldCBtYXhfbm9uX2dvdF9keW5pbmRleCBiYXNlZCBvZmYKLQluZXcgYXJndW1lbnQgbWF4X2xvY2FsLgotCi0xOTk5LTA3LTE0ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX29idGFpbl9jb250ZW50cyk6IFN3YXAgdGhlIDE2LWJpdAotCXN1YndvcmRzIHdoZW4gaGFuZGxpbmcgYW4gUl9NSVBTMTZfMjYgcmVsb2NhdGlvbi4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgYmUgcGFyYW5vaWQgYWJvdXIgcmlnaHQtc2hpZnQKLQlzZW1hbnRpY3MuCi0JCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzMTZfZ3ByZWxfaG93dG8pOiBBZGp1c3Qgc3JjX21hc2sgYW5kCi0JZHN0X21hc2sgdG8gbWF0Y2ggcmVhbGl0eS4KLQkoX2JmZF9taXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KLQkobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogVXNlIGJmZF9nZXQuCi0JKG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0xOTk5LTA3LTEzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogSGFuZGxlIFJfTUlQUzE2XzI2LgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IGNhbGxpbmcgc2VxdWVuY2UgZm9yIAotCW1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogVGFrZSBhZGRpdGlvbmFsIGFyZ3VtZW50LiAgSGFuZGxlCi0JUl9NSVBTMTZfMjYuICBVc2UgYmZkX3B1dCBmb3IgY29udmVuaWVuY2UuCi0KLTE5OTktMDctMTMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogVGhpbmtvIGxhc3QgY2hhbmdlLgotCUFsd2F5cyBvdmVyd3JpdGUgcF9mbGFncy4KLQotMTk5OS0wNy0xMyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCB3YW50X2R5bmJzcy4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGNyZWF0ZQotCS5keW5ic3MgYW5kIC5yZWxbYV0uYnNzIGlmIHdhbnRfZHluYnNzLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzKTogUHJvdmlkZSBkZWZhdWx0LgotCi0xOTk5LTA3LTEzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IERvbid0IG92ZXJ3cml0ZSBwX2ZsYWdzLgotCi0xOTk5LTA3LTEzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5KTogTmV3LgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBkeW5sb2NhbC4KLQkoX2JmZF9lbGZfbGlua19sb29rdXBfbG9jYWxfZHluaW5keCk6IFByb3RvdHlwZS4KLQkoX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCk6IERlbGV0ZS4KLQkoX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zKTogUHJvdG90eXBlLgotCShfYmZkX2VsZixsaW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbCk6IFByb3RvdHlwZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKTogTmV3IGFsaWFzLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4KTogRGVsZXRlLgotCShfYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4KTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvKTogRGVsZXRlIHJlbW92ZWRfZHluYW1pYy4KLQkoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0Ci0JaW5zdGVhZCBvZiBlbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMuCi0JUmVtb3ZlIHJlbW92ZWRfZHluYW1pYyBjb2RlLiAgVXNlIF9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcy4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogUmVtb3ZlIHJlbW92ZWRfZHluYW1pYyBjb2RlLgotCShlbGZfbGlua19yZW51bWJlcl9keW5zeW1zKTogRGVsZXRlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBJbnN0YWxsIHNlY3Rpb24gYW5kIGxvY2FsIHN5bWJvbHMgaW50byAuZHluc3ltLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogRGVsZXRlLgotCShlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgc2VjdGlvbiBkeW5pbmRpY2llcy4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCB3cml0ZSBzZWN0aW9uIGR5bnN5bXMuCi0JKiBlbGYzMi1taXBzLmM6IFNpbWlsYXJseS4KLQkqIGVsZjMyLXBwYy5jOiBTaW1pbGFybHkuCi0JKiBlbGYzMi1zcGFyYy5jOiBTaW1pbGFybHkuCi0JKiBlbGY2NC1hbHBoYS5jOiBTaW1pbGFybHkuCi0JKiBlbGY2NC1zcGFyYy5jOiBTaW1pbGFybHkuCi0KLTE5OTktMDctMTMgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBEbyBub3QgY29tcGxhaW4KLQl3aGVuIF9ncF9kaXNwIGlzIHVuZGVmaW5lZC4gIERvIG5vdCBjaGVjayBSX01JUFNfTE8xNiBmb3Igb3ZlcmZsb3cKLQl3aGVuIHRoZSByZWxvY2F0aW9uIGlzIGFnYWluc3QgX2dwX2Rpc3AuCi0KLTE5OTktMDctMTIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGR3YXJmMi5jIChyZWFkX2F0dHJpYnV0ZSk6IFN1cHBvcnQgRFdfRk9STV9yZWY4LgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgbWlwc18zMl9yZWxvY3MKLQl0byBwb3NzaWJseV9keW5hbWljX3JlbG9jcy4gIEFkanVzdCB1c2FnZSB0aHJvdWdob3V0IGNvZGUuCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogSGFuZGxlIFJfTUlQU182NCBjb3JyZWN0bHkuCi0JKGVsZl9taXBzX2N0b3I2NF9ob3d0byk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEhhbmRsZSBSX01JUFNfNjQgbGlrZSBSX01JUFNfMzIuCi0JQWRqdXN0IGluZGVudGF0aW9uLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfTUlQU182NCBpbiAzMi1iaXQgbW9kZS4KLQkoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBIYW5kbGUgUl9NSVBTXzY0IGxpa2UgUl9NSVBTXzMyLgotCVVzZSBNSVBTX0VMRl9HT1RfU0laRSB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgR09UIGVudHJpZXMuCi0JKiBlbGY2NC1taXBzLmMgKGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3ApOiBEZWZpbmUuCi0KLTE5OTktMDctMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYmZkLWluLmg6IFJlbW92ZSB0ZXN0cyBvZiBDT0ZGX0lNQUdFX1dJVEhfUEUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBBZGQgQVRUUklCVVRFX1VOVVNFRAotCWFzIGFwcHJvcHJpYXRlLiAgVXNlIEVNUFRZX0hPV1RPIGFzIGFwcHJvcHJpYXRlLiAgRmlsbCBpbgotCXN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMuICBBZGQgY2FzdHMuCi0JKiByZWxvYy5jIChFTVBUWV9IT1dUTyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IFJlbW92ZSB1c2VsZXNzCi0JY29tcGFyaXNvbnMgYWdhaW5zdCAwLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZQotCXByZXZpb3VzX2liZmRfZV9mbGFncyB0byB1bnNpZ25lZCBsb25nLgotCSogdm1zLmggKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCk6IENoYW5nZSBzZWN0aW9uX2NvdW50IHRvCi0JdW5zaWduZWQuCi0JKiB2bXMtZ3NkLmMgKF9iZmRfdm1zX3NsdXJwX2dzZCk6IENoYW5nZSBwc2VjdF9pZHggdG8gdW5zaWduZWQuCi0JKF9iZmRfdm1zX3dyaXRlX2dzZCk6IENoYW5nZSBzeW1udW0gdG8gdW5zaWduZWQuCi0JKiB2bXMtaGRyLmMgKF9iZmRfdm1zX3dyaXRlX2hkcik6IENoYW5nZSBzeW1udW0gdG8gdW5zaWduZWQuCi0JKiB2bXMtdGlyLmMgKGV0aXJfc3RhKTogQ2hhbmdlIHBzZWN0IHRvIHVuc2lnbmVkLgotCShhbGxvY19zZWN0aW9uKTogQ2hhbmdlIGlkeCB0byB1bnNpZ25lZC4KLQkodGlyX3N0YSwgdGlyX2N0bCk6IENoYW5nZSBwc2VjdCB0byB1bnNpZ25lZC4KLQkoX2JmZF92bXNfd3JpdGVfdGlyKTogQ2hhbmdlIGxlbiBhbmQgYmVmb3JlIHRvIGJmZF9zaXplX3R5cGUuCi0JKiB2bXMuYyAocHJpdl9zZWN0aW9uX2NvdW50KTogQ2hhbmdlIHRvIHVuc2lnbmVkLgotCi0xOTk5LTA3LTEyICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbGYzMi1tNjhrLmM6IEFkZCBzb21lIEFUVFJJQlVURV9VTlVTRUQuCi0JKiBtNjhrbGludXguYzogTGlrZXdpc2UuCi0KLTE5OTktMDctMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYW55IGZpbGVzOiBDaGFuZ2VzIHRvIGF2b2lkIGdjYyB3YXJuaW5nczogUmVtb3ZlIHVudXNlZCBsb2NhbAotCXZhcmlhYmxlcy4gIEFkZCBkZWZhdWx0IGNhc2UgdG8gZW51bSBzd2l0Y2hlcy4KLQkqIGNvZmYtYXJtLmMgKGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zKTogT25seQotCWNvbXBpbGUgaWYgbm90IENPRkZfSU1BR0VfV0lUSF9QRS4KLQkocmVjb3JkX2FybV90b190aHVtYl9nbHVlLCByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUpOiBMaWtld2lzZS4KLQkoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBMaWtld2lzZS4KLQkoYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBlcG9jLXBlaS1hcm0uYzogRG9uJ3QgcmVuYW1lIGJmZF9hcm0gZnVuY3Rpb25zLgotCSogcGVpLWFybS5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERvbid0IGRlY2xhcmUuCi0JKE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZKTogQ29ycmVjdCBsYXN0IGNoYW5nZS4KLQkobWlwc19lbGZfZ290MTZfZW50cnkpOiBQdXQgcGFyZW5zIGFyb3VuZCAmIGluIGJvZHkgb2YgPT0uCi0JKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogQ29ycmVjdCB0ZXN0IGZvciBlbXB0eSBzdHJpbmcuCi0JKiB2bXMtZ3NkLmM6IFVzZSBfYmZkX2Vycm9yX2hhbmRsZXIgcmF0aGVyIHRoYW4gZnByaW50ZiB0bwotCXN0ZGVyci4KLQkqIHZtcy1taXNjLmMgKF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCk6IENvcnJlY3Qgc3ByaW50ZgotCWZvcm1hdC4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBBZGQgQVRUUklCVVRFX1VOVVNFRAotCWFzIGFwcHJvcHJpYXRlLiAgRmlsbCBpbiBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLiAgQWRkIHZhcmlhYmxlCi0JaW5pdGlhbGl6YXRpb25zLiAgQWRkIGNhc3RzLgotCSogZHdhcmYxLmMgKHBhcnNlX2xpbmVfdGFibGUpOiBDaGFuZ2UgZWFjaExpbmUgdG8gdW5zaWduZWQgbG9uZy4KLQkoZHdhcmYxX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUpOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBsb25nLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9oYXNoKTogQ2hhbmdlIHBhcmFtZXRlciBmcm9tIHVuc2lnbmVkIGNoYXIgKiB0bwotCWNoYXIgKi4KLQkqIGVsZi1iZmQuaCAoYmZkX2VsZl9oYXNoKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IFJlbW92ZSBjYXN0cwotCXdoZW4gY2FsbGluZyBiZmRfZWxmX2hhc2guCi0KLTE5OTktMDctMTEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfcHV0XzgpOiBNYWtlIGl0IG9mIHR5cGUgYHZvaWQnLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLW1pcHMuYyAoTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkpOiBDb25kaXRpb25hbGl6ZQotCWZvciAzMi1iaXQgaG9zdHMuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IExpa2V3aXNlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbik6IEJlIHR5cGUtY29ycmVjdC4KLQotVGh1IEp1bCAgOCAxMjozMjoyMyAxOTk5ICBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+Ci0KLQkqIGNvbmZpZy5iZmQgKGhwcGEqLSotbGludXgtZ251Kik6IE5ldyB0YXJnZXQKLQotMTk5OS0wNy0wNyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmLWJmZC5oIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogQ29uc3RpZnkuCi0JKF9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCQotCShfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZ2NfbWFya19ob29rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfZGF0YSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZjMyX29iamVjdF9wKTogTW92ZSBjb250ZW50cyBpbnRvCi0JX2JmZF9taXBzX2VsZl9vYmplY3RfcC4KLQkobWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzLgotCShtaXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcC4KLQkoZWxmX21pcHNfYWJpX25hbWUpOiBDaGFuZ2UgcHJvdG90eXBlLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyKTogTWVyZ2UgaW50bwotCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIuCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nKTogTWVyZ2UgaW50bwotCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogUmVuYW1lIHRvIF9iZmRfbWlwc19lbGZfZmluYWxfbGluay4gIEludm9rZQotCXRoZSByaWdodCBiYWNrLWVuZCBFTEYgbGlua2VyLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uLiAgQ2xlYW4gdXAuICBBZGp1c3QgZm9yIDY0LWJpdCBjb2RlLgotCShtaXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2suCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb24pOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb24uCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlbmFtZSB0byBfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcy4KLQlBZGp1c3QgZm9yIDY0LWJpdCBjb2RlLiAgVXNlIG1pcHNfZWxmX2dvdF9zZWN0aW9uLgotCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4gIFVzZQotCW1pcHNfZWxmX2FsbG9jYXRlX2R5bmFtaWNfcmVsb2NhdGlvbnMuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLiAgVXNlIG1pcHNfZWxmX2dvdF9zZWN0aW9uLgotCUFkanVzdCBmb3IgNjQtYml0IGNvZGUuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucy4gIEFkanVzdCBmb3IgNjQtYml0IGNvZGUuCi0JKG1pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucy4KLQkobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2suCi0JKG1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQpOiBDb25zdGlmeS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2FsbG9jYXRlX2R5bmFtaWNfcmVsb2NhdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FKTogTmV3IG1hY3JvLgotCShNSVBTX0VMRl9SRUxfU0laRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9EWU5fU0laRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9HT1RfU0laRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9TWU1fU0laRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9MT0dfRklMRV9BTElHTik6IExpa2V3aXNlLgotCShNSVBTX0VMRl9HRVRfV09SRCk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9QVVRfV09SRCk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSk6IExpa2V3aXNlLgotCShTVFVCX0xXKTogQ29uZGl0aW9uYWxpemUgZm9yIDY0LWJpdCB2YWx1ZS4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgUl9NSVBTX0hJR0hFUiBhbmQgUl9NSVBTX0hJR0hFU1QKLQllbnRyaWVzLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBNZXJnZSBlX2lkZW50W0VJX0NMQVNTXS4KLQlDaGVjayBpdCBmb3IgaW5jb25zaXN0ZW5jeS4KLQkoX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogUHJpbnQgQUJJPTY0IGZvciA2NC1iaXQKLQlBQkkuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFJlbW92ZSBkdXBsaWNhdGUgaGFuZGxpbmcgb2YKLQkubXN5bS4gCi0JKG1pcHNfZWxmX2dsb2JhbF9nb3RfaW5kZXgpOiBVc2UgTUlQU19FTEZfR09UX1NJWkUuCi0JKG1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleCk6IFVzZSBtaXNwX2VsZl9nb3Rfc2VjdGlvbi4KLQkobWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSk6IFVzZSBNSVBTX0VMRl9HT1RfU0laRS4KLQkobWlwc19lbGZfbG9jYWxfZ290X2luZGV4KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9wYWdlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9pbmZvKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3JlbG9jYXRpb24pOiBIYW5kbGUgMzItYml0LzY0LWJpdCBzcGxpdC4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBIYW5kbGUgNjQtYml0IGNvZGUuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOLAotCWluc3RlYWQgb2YgY29uc3RhbnQgYDInLgotCShtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBUaWR5LiAgVXNlIE1JUFNfRUxGX0dPVF9TSVpFLgotCShtaXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uKTogVXNlIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UKLQlNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSwgTUlQU19FTEZfR09UX1NJWkUsCi0JTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkuICBSZW1vdmUgI2lmIDAnZCBjb2RlLgotCUFkanVzdCBhbGwgcmVsZXZlYW50IGVudHJpZXMgaW4gZWxmIGJhY2tlbmQgdGFibGUuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUuCi0JKG1pcHNfZWxmNjRfc2VjdGlvbl9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JQWRqdXN0IGVsZiBiYWNrZW5kIGVudHJpZXMgdG8gdXNlIF9iZmRfbWlwc19lbGYgdmFyaWFudHMgbm93Ci0JcHVibGljbHkgYXZhaWxhYmxlLgotCQotCSogZWxmbGluay5oIChlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IEhhbmRsZSBub24tc3RhbmRhcmQKLQloYXNoLWVudHJ5IHNpemVzLgotCShzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCSogZWxmLmM6IChlbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogbGliYmZkLmMgKGJmZF9nZXQpOiBOZXcgbWFjcm8uCi0JKGJmZF9wdXQpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDctMDcgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoZWxmX3NpemVfaW5mbyk6IEFkZCBoYXNoX2VudHJ5X3NpemUsCi0JaW50X3JlbHNfcGVyX2V4dF9yZWwsIHN3YXBfZHluX291dCwgc3dhcF9yZWxvY19pbiwgc3dhcF9yZWxvY19vdXQsCi0Jd2FwX3JlbG9jYV9pbiwgYW5kIHN3YXBfcmVsb2NhX291dC4gCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbik6IEFkanVzdCB0byBoYW5kbGUKLQltdWx0aXBsZSBpbnRlcm5hbCByZWxvY2F0aW9ucyBwZXIgZXh0ZXJuYWwgcmVsb2NhdGlvbi4KLQkobGlua19yZWFkX3JlbG9jcyk6IExpa2V3aXNlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKGVsZl9nY19tYXJrKTogTGlrZXdpc2UuCi0JKGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfZHluX291dCk6IEFkanVzdCB0eXBlIHRvIG1hdGNoCi0JZWxmX3N3YXBfZHluX2luLgotCShzaXplX2luZm8pOiBBZGQgZW50cmllcyBmb3IgbmV3IGZpZWxkcy4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zd2FwX3JlbG9jX291dCk6IEVuYWJsZS4KLQkobWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX2luKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY2FfaW4pOiBMaWtld2lzZS4KLQkobWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkobWlwc19lbGY2NF9zaXplX2luZm8pOiBBZGQgZW50cmllcyBmb3IgbmV3IGZpZWxkcy4KLQkKLTE5OTktMDctMDcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IEFzc2VydCB0aGF0IHNlY3Rpb24gcmVsb2NfY291bnQKLQlmaWVsZCBlcXVhbHMgdGhlIG5ldyByZWxfY291bnQgZmllbGQuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdXNlIHRoZSBuZXcKLQlyZWxfY291bnQgZmllbGQgcmF0aGVyIHRoYW4gdGhlIHJlbG9jX2NvdW50IGZpZWxkLgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCShlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogUGVybWl0IGEgbm9uLXdlYWsgZGVmaW5pdGlvbiBpbiBhCi0Jc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgYSB3ZWFrIGRlZmluaXRpb24gaW4gYSByZWd1bGFyIG9iamVjdC4KLQotVHVlIEp1bCAgNiAxMDoyMzozOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogUmV2ZXJ0IEp1bHkgMiwgMTk5OSBwYXRjaC4KLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IFQgbW9kZSBzZWxlY3RvcnMKLQluZWVkIHRvIGdlbmVyYXRlIERMVElORCByZWxvY2F0aW9ucywgbm90IERMVFJFTCByZWxvY2F0aW9ucy4KLQotMTk5OS0wNy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZWNvZ25pc2UgYXJtIDUKLQlhcmNoaXRlY3R1cmVzLiAKLQkoY29mZl9zZXRfZmxhZ3MpOiBSZWNvZ25pc2UgYXJtIDUgYXJjaGl0ZWN0dXJlcy4KLQotCSogY3B1LWFybS5jOiBBZGQgc3VwcG9ydCBmb3Igc3Ryb25nYXJtIGFuZCBhcm05IGNwdXMuCi0JQWRkIHN1cHBvcnQgZm9yIGFybXY1IGFyY2hpdGVjdHVyZS4KLQotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9tYWNoX2FybV81IGFuZCBiZmRfbWFjaF9hcm1fNVQuCi0JCi0JKiByZWxvYy5jOiBBZGQgbmV3LCBhc3NlbWJsZXIgb25seSwgQVJNIHJlbG9jOgotCUJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEUuCi0JCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDctMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGR3YXJmMi5jIChwYXJzZV9jb21wX3VuaXQpOiBBZGQgQUJCUkVWX0xFTkdUSCBwYXJhbWV0ZXIuCi0JKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRkIEFERFJfU0laRSBwYXJhbWV0ZXIuCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBQYXNzIGl0LgotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChBQklfNjRfUCk6IE5ldyBtYWNyby4KLQkoSVJJWF9DT01QQVQpOiBXZSBhcmUgSVJJWDYtY29tcGF0aWJsZSBpZiBBQklfNjRfUC4KLQkoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEFkanVzdCBjYWxsIHRvCi0JX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBVcGRhdGUgcHJvdG90eXBlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA3LTAyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkICogYXQgdGhlIGVuZCBvZiBpWzM0NTZdODYtKi11bml4d2FyZS4KLQotRnJpIEp1bCAgMiAxMjoyMToxMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoSFBQQV9SX0FSR19SRUxPQyk6IERlbGV0ZS4KLQkoSFBQQV9SX0NPTlNUQU5ULCBIUFBBX1JfQURERU5EKTogTGlrZXdpc2UuCi0KLTE5OTktMDctMDEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgcmVsX2NvdW50IGFuZCByZWxfY291bnQyCi0JZmllbGRzLgotCShfYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYuYyAoX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayk6IFVzZSBiZmRfemFsbG9jLCByYXRoZXIgdGhhbgotCWJmZF9hbGxvYyBmb2xsb3dlZCBieSBtZW1zZXQuCi0JKF9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkcik6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IGZyb20gLi4uCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogSGVyZS4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEFzc2lnbiBzZWN0aW9uIG51bWJlcnMgZm9yIHRoZSBzZWNvbmQKLQlyZWxvY2F0aW9uIHNlY3Rpb24sIGlmIHJlcXVpcmVkLgotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogVXNlIGVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbi4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogVXNlIGVsZl9saW5rX291dHB1dF9yZWxvY3MuCi0JCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFVzZQotCV9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciB0byBpbml0aWFsaXplIHJlbF9oZHIyLgotCi1UaHUgSnVsICAxIDEzOjU4OjQ4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSBSX1BDUkVMX0NBTEwKLQl3aXRoIDIyYml0IGZvcm1hdC4KLQotMTk5OS0wNi0yOCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9nb3RfaW5mbyk6IE1vdmUgZGVjbGFyYXRpb24gYmVmb3JlCi0JcHJvdG90eXBlcy4gIENoYW5nZSBnbG9iYWxfZ290c3ltIHRvIGJlIGEgcG9pbnRlciB0byBhIGhhc2ggZW50cnksCi0JcmF0aGVyIHRoYW4gYSBudW1iZXIgaW5kZXguCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IE1vdmUgZGVjbGFyYXRpb24gYmVmb3JlIHByb3RvdHlwZXMuCi0JKG1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfc2lnbl9leHRlbmQpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfaGlnaCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9oaWdoZXIpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfaGlnaGVzdCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nbG9iYWxfZ290X2luZGV4KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2xvY2FsX2dvdF9pbmRleCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXgpOiBMaWtlaXdzZS4KLQkobWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9wYWdlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9hc3NpZ25fZ3ApOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc29ydF9oYXNoX3RhYmxlX2YpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc29ydF9oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9pbmZvKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290MTZfZW50cnkpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCBkZXNjcmlwdGlvbiBvZiBSX01JUFNfU0NOX0RJU1AuCi0JKG1pcHNfZWxmX2ZpbmFsX2dwKTogVXNlIG1pcHNfZWxmX2Fzc2lnbl9ncC4KLQkoX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IERvbid0IG1vdmUgU0hOX0NPTU1PTiBzeW1ib2xzCi0JaW50byBTSE5fU0NPTU1PTiBhdXRvbWF0aWNhbGx5IG9uIElSSVg2LgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUsIHVzaW5nCi0JbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gYW5kIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbik6IFVzZSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRS4KLQlEb24ndCBkZWFsIHdpdGggLnJsZF9tYXAgb24gSVJJWDYuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEFkanVzdCB1c2Ugb2YgZ2xvYmFsX2dvdHN5bS4gIFNldAotCXNlY3Rpb24gZmxhZ3MgYXBwcm9wcmlhdGVseSBmb3IgLmdvdC4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogSGFuZGxlIElSSVg2IHJlbG9jYXRpb25zIG1ha2luZyB1c2Ugb2YKLQl0aGUgZ290LiAgQ2FsbCBtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgYW5kIGFsbG9jYXRlCi0JbG9jYWwgZ290IHNwYWNlIGFwcHJvcHJpYXRlbHkuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBiZmRfYnl0ZSAqLCBub3QgdW5zaWduZWQKLQljaGFyICouICBSZXdvcmsgY2FsY3VsYXRpb24gb2YgR09UIHNpemUuICBTb3J0IGR5bmFtaWMgc3ltYm9sCi0JdGFibGUgZW50cmllcyBzbyBlbnRyaWVzIHRoYXQgZG8gbm90IHJlcXVpcmUgR09UIGVudHJpZXMgYXBwZWFyIGF0Ci0JdGhlIGJlZ2lubmluZy4gIERvbid0IHVzZSBEVF9NSVBTX0hJUEFHRU5PIG9uIElSSVg2LiAgUmVtb3ZlIGRlYWQKLQljb2RlIGRlYWxpbmcgd2l0aCBEVF9JTklUIGFuZCBEVF9GSU5JLiAgUmVtb3ZlIGZpZGRsaW5nIHdpdGgKLQlnbG9iYWxfZ290c3ltLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBBZGp1c3QgY3JlYXRpb24gb2YgZ2xvYmFsIEdPVAotCWVudHJpZXMuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZQotCW1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3JyZWN0IG9mZi1ieS1vbmUgZXJyb3IKLQlzZXR0aW5nIERUX01JUFNfVU5SRUZFWFROTy4gIEFkanVzdCBzZXR0aW5nIG9mIERUX01JUFNfR09UU1lNIGZvcgotCWNoYW5nZSB0byBnbG9iYWxfZ290c3ltLiAgU2V0IERUX01JUFNfT1BUSU9OUyBvbiBJUklYNi4KLQkJCi0xOTk5LTA2LTMwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IENQSUMgd2hlbiBkb2luZyBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuICBGcm9tIFJhbGYgQmFlY2hsZSA8cmFsZkB1bmkta29ibGVuei5kZT4uCi0KLTE5OTktMDYtMDQgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSk6IExpa2V3aXNlLgotCi0xOTk5LTA2LTI4ICBKaW0gUGljayAgPGppbUBqaW1waWNrLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogTWluZCBub191bmRlZmluZWQKLQotVHVlIEp1biAyOSAwMjoyNTowMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmMgKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogVXNlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBhcwotCXJlbG9jYXRpb24gZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogS2lsbCB1bnVzZWQvdW53YW50ZWQgZnVuY3Rpb24uCi0KLTE5OTktMDYtMjcgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoTUlQU19FTEZfU1JEQVRBX1NFQ1RJT05fTkFNRSk6IE5ldyBtYWNyby4KLQkoTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUpOiBMaWtld2lzZS4KLQkoTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSB0aGVtLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4gIEFkZCAuc3JkYXRhIHRvIHRoZSBsaXN0Ci0Jb2YgR1AtcmVsYXRpdmUgc2VjdGlvbnMuCi0JKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBVc2UgdGhlbS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBTaGFyZSBjb2RlIGJldHdlZW4gLnNkYXRhIGFuZAotCS5saXQ0Ly5saXQ4IHNlY3Rpb25zLiAgU2V0IGFwcHJvcHJpYXRlIGZsYWdzIGZvciAuc3JkYXRhLgotCShtaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IEFkZCBoYW5kbGluZyBmb3IKLQlQVF9NSVBTX09QVElPTlMgc2VnbWVudCBvbiBJUklYNi4KLQkobWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwKTogTGlrZWl3c2UuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBTZXQgRUZfTUlQU19DUElDIHdoZW4gcmVxdWlyZWQgYnkgdGhlIEFCSS4KLQlJbmNsdWRlIHRoZSBvcHRpb25zIHNlY3Rpb25zIG9uIElSSVg2LiAgRG9uJ3QgbG9vayBmb3IgR1AtcmVsYXRpdmUKLQlzZWN0aW9ucyBieSBuYW1lOyB1c2UgU0hGX01JUFNfR1BSRUwgaW5zdGVhZC4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBBZGp1c3QgdG8gdXNlIC91c3IvbGliMzIvbGliYy5zby4xIGZvcgotCXRoZSBOMzIgQUJJLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IG11Y2sgYWJvdXQgd2l0aCBzZWN0aW9uCi0JYWxpZ25tZW50cyBhbmQgc3VjaCBvbiBJUklYNi4KLQkobWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogVXNlIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4gQWRqdXN0IHRvIGhhbmRsZSB0aGUKLQlmYWN0IHRoYXQgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgaXMgbm8gbG9uZ2VyIGEgY29uc3RhbnQuICBVc2UKLQliZmRfemFsbG9jIHJhdGhlciB0aGFuIGJmZF9hbGxvYyBhbmQgbWVtc2V0LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBVc2UgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUuCi0JRG9uJ3QgYXNzZXJ0IHRoZSBleGlzdGVuY2Ugb2YgLnJsZF9tYXAgb24gSVJJWDYuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogVXNlIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FLgotCQkKLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfYWRqdXN0X2R5bmluZHgpOiBSZW1vdmUuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4Ci0JaW5zdGVhZC4KLQotMTk5OS0wNi0yNiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zd2FwX21zeW1faW4pOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX3N3YXBfbXN5bV9vdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUpOiBOZXcgbWFjcm8uCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9saW5rIGZvciAubXN5bS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFJlamVjdCBhbiBTSFRfTUlQU19NU1lNCi0Jc2VjdGlvbiBub3QgbmFtZWQgLm1zeW0uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFVzZSBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSwgbm90Ci0JLm1zeW0gZGlyZWN0bHkuICBTZXQgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBmb3IgdGhlIC5tc3ltCi0Jc2VjdGlvbi4KLQkobWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG1pbl9keW5fcmVsb2NfaW5kZXggZmllbGQuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogQ2xlYXIgaXQuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIHRoZSAubXN5bSBzZWN0aW9uCi0Jb24gSVJJWDYuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6ICBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlCi0JLm1zeW0gc2VjdGlvbi4gIEFkZCBhIERUX01JUFNfTVNZTSBlbnRyeS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogV3JpdGUgb3V0IGEgLm1zeW0gZW50cnkgZm9yCi0JdGhlIHN5bWJvbC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBBc3NpZ24gYSB2YWx1ZSBmb3IKLQlEVF9NSVBTX01TWU0uICBBZGQgLm1zeW0gZW50cmllcyBmb3IgdGhlIHNlY3Rpb24gc3ltYm9scyBhcyB3ZWxsLgotCi0JKiBlbGYzMi1taXBzLmMgKGlyaXhfY29tcGF0X3QpOiBOZXcgZW51bWVyYXRpb24uCi0JKEFCSV9OMzJfUCk6IE5ldyBtYWNyby4KLQkoSVJJWF9DT01QQVQpOiBMaWtld2lzZS4KLQkoU0dJX0NPTVBBVCk6IEltcGxlbWVudCBpbiB0ZXJtcyBvZiBJUklYX0NPTVBBVC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvLgotCQotMTk5OS0wNi0yNiAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBNYXJrIG5vbiByZWFkb25seSBCRkQgc2VjdGlvbnMKLQlhcyB3cml0YWJsZSBQRSBzZWN0aW9ucy4KLQotMTk5OS0wNi0yNiAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMi5jIChzdHJ1Y3QgYXJhbmdlKTogTmV3IHR5cGUuCi0JKHN0cnVjdCBjb21wX3VuaXQpOiBSZXBsYWNlIExPVyBhbmQgSElHSCBieSBtZW1iZXIgQVJBTkdFLgotCShhcmFuZ2VfYWRkKTogTmV3IGZ1bmN0aW9uLgotCShkZWNvZGVfbGluZV9pbmZvKTogS2VlcCB0cmFjayBvZiBhZGRyZXNzIHJhbmdlcyB0aGF0IGEgY29tcGlsYXRpb24KLQl1bml0IGNvdmVycy4KLQkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBSZXR1cm4gdHJ1ZSBpZiBhZGRyZXNzIGlzIGNvbnRhaW5lZAotCWluIF9hbnlfIG9mIHRoZSBhZGRyZXNzIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggYSBjb21waWxhdGlvbiB1bml0LgotCShfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IENhbGwgY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lCi0Jb24gdGhlIGZpcnN0IGNvbXBfdW5pdCB0aGF0IGNvbnRhaW5zIHRoZSBhZGRyZXNzLgotCi0xOTk5LTA2LTI2ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKHN0cnVjdCBkd2FyZjJfZGVidWcpOiBBZGQgbWVtYmVyIGR3YXJmX2xpbmVfYnVmZmVyLgotCShkZWNvZGVfbGluZV9pbmZvKTogQWRkIHZhcmlhYmxlIFNUQVNIIGFuZCBpbml0aWFsaXplIGl0IHRvIHBvaW50Ci0JdG8gdGhlIHBlci1iZmQgZHdhcmYyX2RlYnVnIGluZm8uICBSZW1vdmUgc3RhdGljIHZhcmlhYmxlCi0JZHdhcmZfbGluZV9idWZmZXIgYW5kIHVzZSBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIgaW4gaXRzIHBsYWNlLgotCi0xOTk5LTA2LTI2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSXQncyBPSyBmb3IgYSAtQnN5bWJvbGljCi0Jc2hhcmVkIGxpYnJhcnkgdG8gaGF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sLgotCi0JRnJvbSBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT46Ci0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IGxhc3QgcGF0Y2guCi0KLVRodSBKdW4gMjQgMjA6NTk6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5jIChlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmMzItaHBwYS5jOiBSZW1vdmUgZXZlcnl0aGluZyByZWxhdGVkIHRvIHN5bWJvbCBleHRlbnNpb24KLQlzZWN0aW9ucyAmIHJlY29yZHMuICBVc2UgdGhlIGNvbW1vbiBlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nLgotCi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKHNpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSB1c2VyLXNwZWNpZmllZCBpbml0L2ZpbmkKLQlmdW5jdGlvbnMgaW5zdGVhZCBvZiBfaW5pdC9fZmluaSBpZiByZXF1ZXN0ZWQuCi0KLTE5OTktMDYtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogQXZvaWQgY3Jhc2hpbmcgb24gYSBib2d1cyBzaF9saW5rCi0JZmllbGQuCi0KLTE5OTktMDYtMjIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT46Ci0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgdW51c2VkIGR5bmluZHgKLQlmaWVsZCB0byAwLCBub3QgLTEuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDaGVjayBmb3IgcG9zaXRpdmUgc2VjdGlvbgotCWR5bmluZHggZmllbGQsIHJhdGhlciB0aGFuIGNvbXBhcmluZyBhZ2FpbnN0IC0xLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBPbmx5IHJldHVybiBmYWxzZSBpZiB1bmRlZmluZWRfc3ltYm9sCi0Jb3IgcmVsb2Nfb3ZlcmZsb3cgZmFpbCwgbm90IGFsd2F5cyB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvci4KLQotMTk5OS0wNi0yMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChsaW5rX3JlYWRfcmVsb2NzKTogRXhwbGljaXRseSBjYXN0IGV4dGVybmFsX3JlbG9jcyB0bwotCWJmZF9ieXRlICogYmVmb3JlIHBlcmZvcm1pbmcgcG9pbnRlciBhcml0aG1ldGljLgotCi1UdWUgSnVuIDIyIDEzOjA2OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaDogTmV3IGZpbGUuICBDb21tb24gc3R1ZmYgZm9yIGVsZjMyIGFuZCBlbGY2NCBQQQotCXN1cHBvcnQuCi0JKiBlbGYzMi1ocHBhLmM6IEluY2x1ZGUgZWxmLWhwcGEuaC4KLQkoQVJDSF9TSVpFKTogRGVmaW5lLgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IERlbGV0ZS4gIEZvdW5kIGluIHRoZSBjb21tb24gY29kZQotCW5vdy4KLQkoZWxmMzJfaHBwYV9pbmZvX3RvX2hvd3RvKTogU2ltaWxhcmx5LgotCShlbGZfaHBwYV9ob3d0b190YWJsZSk6IFNpbWlsYXJseS4KLQkoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBTaW1pbGFybHkuCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogU2ltaWxhcmx5LgotCSogZWxmMzItaHBwYS5oIChFTEZfSE9XVE9fVEFMQkUsIE5fUEFSSVNDX1JFTE9DUyk6IERlbGV0ZS4KLQotMTk5OS0wNi0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogQ2F0Y2ggb3ZlcmZsb3cKLQloYW5kbGluZyBSX1Y4NTBfMjJfUENSRUwgcmVsb2NhdGlvbi4KLQotMTk5OS0wNi0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSk6IEV4cGxpY2l0bHkgZGVjbGFyZSByZXR1cm4KLQl0eXBlLgotCi1TdW4gSnVuIDIwIDE0OjEzOjU3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogSWdub3JlIHNlY3Rpb25zCi0JRElTQ0FSRGVkIGJ5IHRoZSBsaW5rIHNjcmlwdC4KLQotMTk5OS0wNi0xOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVtb3ZlX3NlY3Rpb25fYW5kX2FkanVzdF9keW5pbmRpY2VzKToKLQlSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIHNwcC4KLQotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBjcmFzaCBpZgotCXRoZSBlbnRyeSBzeW1ib2wgaXMgbm90IHNldC4KLQotRnJpIEp1biAxOCAwNDoyNDo1NyAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYWRqdXN0Ci0JR1BESVNQIG9yIExJVFVTRSBpbiBhIHJlbG9jYXRhYmxlIGxpbmsuCi0KLVRodSBKdW4gMTcgMjE6MjQ6NDMgMTk5OSAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBkd2FyZjEuYyAoYWxsb2NfZHdhcmYxX3VuaXQpOiBBbGxvY2F0ZSB1c2luZyBiZmRfemFsbG9jLgotCSogKGFsbG9jX2R3YXJmMV9mdW5jKTogTGlrZXdpc2UuCi0KLVdlZCBKdW4gMTYgMDM6MDk6NTcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6IEZpeCB2YXJpb3VzIGZvcm1hdHRpbmcgZXJyb3JzLgotCShhc3NlbWJsZV8zKTsgUmV3cml0ZSB1c2luZyBDQVRFTkFURS4KLQkoYXNzZW1ibGVfMTcpOiBGaXggdmFyaW91cyBidWdzLgotCi0xOTk5LTA2LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tY29yZS5jIChSX01DT1JFX1JBVyk6IEZpeCBkZWZpbml0aW9uLgotCi0xOTk5LTA2LTE1ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKFNFQ19TSE9SVCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wNi0xMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMpOgotCVJlbW92ZSBhYmZkIHBhcmFtZXRlci4gIFVzZSBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQuCi0JKGJmZF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRqdXN0IGNhbGxlcnMgYWNjb3JkaW5nbHkuCi0JCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgpOiBEZWZpbmUgaXQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyk6IE5ldwotCWZ1bmN0aW9uLgotCShiZmRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBpdC4KLQotMTk5OS0wNi0xMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IENoYW5nZSBSXzM4Nl9QQzggZnJvbQotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkIHRvIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQotMTk5OS0wNi0xMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sCi0Jc3BsaXQgb3V0IGZyb20gLi4uCi0JKGVsZl9saW5rX3JlYWRfcmVsb2NzKTogSGVyZS4gIFVzZSBpdCBmb3IgYm90aCByZWxvY2F0aW9uCi0Jc2VjdGlvbnMuCi0KLTE5OTktMDYtMTIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbik6IERvbid0IGFzc3VtZQotCWFzZWN0LT5yZWxvY19jb3VudCBpcyB2YWxpZC4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBQZXJtaXQgYQotCVNIVF9NSVBTX1JFR0lORk8gc2VjdGlvbiB0byBoYXZlIGEgc2l6ZSBvZiAwLgotCi0xOTk5LTA2LTEyICBEYXZpZCBPJ0JyaWVuICA8b2JyaWVuQGZyZWVic2Qub3JnPgotCi0JKiBjb25maWcuYmZkIChhbHBoYSotKi1mcmVlYnNkKik6IE5ldyB0YXJnZXQuCi0JKGlbMzQ1Nl04Ni0qLWZyZWVic2QqKTogTm93IGRlZmF1bHRzIHRvIEVMRi4KLQotMTk5OS0wNi0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBQZXJtaXQgYml0ZmllbGQgcmVsb2NhdGlvbnMgdG8KLQl3cmFwIGlmIHRoZSByZWxvY2F0aW9uIGNvdmVycyB0aGUgaGlnaCBiaXQgb2YgYW4gYWRkcmVzcy4KLQotCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGZpcnN0X3RpbWUuCi0KLTE5OTktMDYtMTAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmNjRfc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBSX1NQQVJDX21heF9zdGQKLQlpbnN0ZWFkIG9mIFJfU1BBUkNfbWF4LgotCShzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKiBlbGYzMl9zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8pOiBMaWtld2lzZTsgaGFuZGxlIHZ0YWJsZSByZWxvY2F0aW9ucy4KLQotMTk5OS0wNi0wNyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBSZW1vdmUgb3V0cHV0Ci0Jc2VjdGlvbnMgd2l0aCBubyBpbml0aWFsIGxpbmtfb3JkZXIuCi0KLTE5OTktMDYtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW04OGsuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi1Nb24gSnVuICA3IDExOjQ5OjQzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKFNPVVJDRV9IRklMRVMpOiBBZGQgbWlzc2luZyBoZWFkZXJzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA2LTA2ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9kYXRhKTogUmVjb2duaXplCi0JdGhlIE4zMiBBQkkuCi0KLTE5OTktMDYtMDQgIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYmFyZiBvbiBvdXQgb2YKLQlyYW5nZSB1bmRlZndlYWsgc3ltYm9scy4KLQkqIGhhc2guYzogQWRkIG1pc3NpbmcgY29tbWEgYWZ0ZXIgQHhyZWZ7fQotCSogbGlua2VyLmM6IExpa2V3aXNlLgotCi0xOTk5LTA2LTA0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoRUxGX01BWFBBR0VTSVpFKTogUHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlCi0JaWYgbm90IGRlZmluZWQuCi0JKiBlbGYzMi1nZW4uYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCSogZWxmMzItaTg2MC5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKiBlbGYzMi1pOTYwLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQkqIGVsZjY0LWdlbi5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLTE5OTktMDYtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGR3YXJmMS5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGR3YXJmMS5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgZXBvYy1hcm0tcGUgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBwZS1hcm0uYzogT25seSByZWRlZmluZSBpbnRlcndvcmtpbmcgZnVuY3Rpb24gbmFtZXMgaWYgdGhleSBoYXZlCi0Jbm90IGFscmVhZHkgYmVlbiByZWRlZmluZWQuCi0JKiBwZWktYXJtLmM6IE9ubHkgcmVkZWZpbmUgaW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG5hbWVzIGlmIHRoZXkgaGF2ZQotCW5vdCBhbHJlYWR5IGJlZW4gcmVkZWZpbmVkLgotCSogZXBvYy1wZS1hcm0uYzogUmVkZWZpbmUgaW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG5hbWVzIHRvIGF2b2lkIGEKLQluYW1lIHNwYWNlIGNsYXNoLgotCSogZXBvYy1wZWktYXJtLmM6IFJlZGVmaW5lIGludGVyd29ya2luZyBmdW5jdGlvbiBuYW1lcyB0byBhdm9pZCBhCi0JbmFtZSBzcGFjZSBjbGFzaC4KLQotMTk5OS0wNi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmeHgtdGFyZ2V0LmggKEVMRl9NQVhQQUdFU0laRSk6IERlZmF1bHQgdG8gMHgxMDAwIG5vdCAxLgotCi1GcmkgSnVuICA0IDEwOjA1OjExIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogVW5kbyBjaGFuZ2Ugb2YgMTk5OS0wNS0xMC4KLQotRnJpIEp1biAgNCAwMzoxMDo0OSAxOTk5ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBGaXggc2V0dGluZyBvZgotCXN0YXJ0IC8gc3RvcCBmb3IgcmVjYWxjdWxhdGluZyBvZiByX2FkZGVuZCBvZiBSX1NIX1NXSVRDSCouCi0KLUZyaSBKdW4gIDQgMDI6NTM6MTMgMTk5OSAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogSGFuZGxlIFJfU0hfU1dJVENIMzIKLQlpbiBvdGhlciB0ZXh0IHNlY3Rpb25zLgotCi1GcmkgSnVuICA0IDAyOjI5OjM0IDE5OTkgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogbGliYmZkLmMgKF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCSogY29mZi1zaC5jIChzaF9tZXJnZV9wcml2YXRlX2RhdGEpOiBEZWxldGUuCi0JKGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGFuZ2UgdG8KLQlfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaC4KLQkoZWxmMzItc2guYyk6IGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YTogRGVmaW5lLgotCi0xOTk5LTA2LTAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmg6IEZpeCB0eXBvOiBjaGFuZ2UgRUxGX01BWFBBR0VfU0laRSB0byBFTEZfTUFYUEFHRVNJWkUuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiBDb3JyZWN0Ci0JcHJvdG90eXBlLgotCShiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wNi0wMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMi5jIChzdHJ1Y3QgbGluZV9pbmZvKTogQWRkIG1lbWJlciBFTkRfU0VRVUVOQ0UgdG8ga2VlcAotCXRyYWNrIG9mIGVuZF9zZXF1ZW5jZSBtYXJrZXJzLgotCShhZGRfbGluZV9pbmZvKTogQWRkIEVORF9TRVFVRU5DRSBhcmcuCi0JKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnkgdG8gaW5mZXIgbG9fcGMgYW5kIGhpX3BjIGZyb20gdGhlCi0JZGVidWctbGluZSBpbmZvLS0taXQgZG9lc24ndCB3b3JrIHJpZ2h0IGlmIGEgY29tcGlsYXRpb24gdW5pdAotCWNvbnNpc3RzIG9mIG11bHRpcGxlIGRpc2NvbnRpZ3VvdXMgY29kZS1zZXF1ZW5jZXMuICBJdCB3b3VsZCBiZQotCXdvcnRod2hpbGUgdG8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBhIGNvbXBpbGF0aW9uCi0JdW5pdCByZXN1bHRzIGluIGEgY29udGlndW91cyBzZXQgb2YgY29kZSBzZXF1ZW5jZXMsIGJ1dCB0aGlzIGlzCi0JcXVpdGUgdHJpY2t5IHRvIGdldCByaWdodCBmb3IgYXJiaXRyYXJ5IERXQVJGMiBmaWxlcy4KLQkobG9va3VwX2FkZHJlc3NfaW5fbGluZV9pbmZvX3RhYmxlKTogRG9uJ3QgdXNlIHRoZSBsYXN0IGxpbmUgZW50cnkKLQlmb3IgYSBjb21waWxhdGlvbiB1bml0IGZvciBhbnl0aGluZyB3aXRoIGFuIGFkZHJlc3MgaGlnaGVyIHRoYW4KLQl0aGlzIGxpbmUgZW50cnkuICBBbHNvLCBjaGVjayBmb3IgZW5kX3NlcXVlbmNlIG1hcmtlcnMgdG8KLQljb3JyZWN0bHkgaGFuZGxlIGRpc2NvbnRpbnVpdGllcy4KLQkoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBXaGVuIGNoZWNraW5nIHByZXZpb3VzbHkgbG9hZGVkCi0JY29tcGlsYXRpb24gdW5pdHMsIGNoZWNrIGFsbCBjb21waWxhdGlvbiB1bml0cyB3aXRoIGVhY2gtPmhpZ2g9PTAKLQlqdXN0IGxpa2Ugd2hlbiByZWFkaW5nIGNvbXBpbGF0aW9uIHVuaXRzLgotCi0JKiBkd2FyZjIuYyAoZGVjb2RlX2xpbmVfaW5mbyk6IEluaXRpYWxpemUgdGFibGUtPmZpbGVzIGFuZAotCXRhYmxlLT5sYXN0X2xpbmUgdG8gTlVMTCB0byBhdm9pZCBzZWdmYXVsdHMgZHVlIHRvIHJhbmRvbQotCXZhbHVlcyBpbiB0aGVzZSBtZW1iZXJzLgotCShjb25jYXRfZmlsZW5hbWUpOiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGZpbGUgbnVtYmVyIGJlZm9yZQotCWluZGV4aW5nIGZpbGVuYW1lIHRhYmxlLiAgU2VnZmF1bHRzIHN1Y2suCi0KLQkqIGR3YXJmMi5jIChkZWNvZGVfbGluZV9pbmZvKTogRG9uJ3QgdHJ1bmNhdGUgYWRkcmVzcyB0byBsZWFzdAotCXNpZ25pZmljYW50IDMyIGJpdHMgKGJyZWFrcyA2NCBiaXQgdGFyZ2V0cykuCi0JKGxvb2t1cF9hZGRyZXNzX2luX2Z1bmN0aW9uX3RhYmxlKTogRGl0dG8uCi0JKGNvbXBfdW5pdF9jb250YWluc19hZGRyZXNzKTogRGl0dG8uCi0KLTE5OTktMDYtMDIgIE1hcmsgTWl0Y2hlbGwgIDxNYXJrIE1pdGNoZWxsIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+PgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIFJfTUlQU19KQUxSLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbCk6IExpa2V3aXNlLgotCShtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbGEpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLAotCXNwbGl0IG91dCBmcm9tIC4uLgotCShlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBIZXJlLiAgVXNlIGl0IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhCi0Jc2luZ2xlIHNlY3Rpb24gaGFzIHR3byBhc3NvY2lhdGVkIHJlbG9jYXRpb24gc2VjdGlvbnMuCi0KLTE5OTktMDYtMDIgIE1hcmsgU2FsdGVyICA8bXNhbHRlckBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFNldCBsbWEgZnJvbSBzX3ZhZGRyIGlmCi0JQ09GRl9XSVRIX1BFIGRlZmluZWQuCi0KLTE5OTktMDYtMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlLWFybS5jOiBSZW5hbWUgZ2xvYmFsIGFybSBpbnRlcndvcmtpbmcgZnVuY3Rpb25zIHRvIGF2b2lkIG5hbWUKLQljb2xsaXNpb24gd2hlbiBhbGwgdGFyZ2V0cyBCRkQgaXMgYnVpbHQuCi0JKiBwZWktYXJtLmM6IERpdHRvLgotCi0xOTk5LTA1LTMxICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYtYmZkLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgdXNlX3JlbGFfcC4gIEFkZAotCW1heV91c2VfcmVsX3AsIG1heV91c2VfcmVsYV9wLCBkZWZhdWx0X3VzZV9yZWxhX3AuCi0JKGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHVzZV9yZWxhX3AuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogU2V0IHVzZV9yZWxhX3AgYXBwcm9wcmlhdGVseS4KLQkoX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayk6IExpa2V3aXNlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFVzZSBtYXlfdXNlX3JlbGFfcCwgZXRjLiwgaW5zdGVhZCBvZgotCXVzZV9yZWxhX3AuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDb3B5IHVzZV9yZWxhX3AuCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB1c2UgcmVsYQotCXJlbG9jcyBiYXNlZCBvbiB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIGhlYWRlci4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgZGVmYXVsdF91c2VfcmVsYV9wCi0JaW5zdGVhZCBvZiB1c2VfcmVsYV9wLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX21heV91c2VfcmVscCk6IE5ldyBtYWNyby4KLQkoZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxhX3ApOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wKTogTGlrZXdpc2UuCi0JKGVsZk5OX2JlZCk6IFVzZSB0aGVtLgotCi1XZWQgSnVuICAyIDEyOjM4OjQ5IDE5OTkgIE1pb2RyYWcgVmFsbGF0IDxtaW9kcmFnQG11bHRpbWFuaWEuY29tPgotCi0JKiBob3N0cy9hbHBoYWxpbnV4LmggKFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQpOiBFeHBhbmQgdG8gNDA5Ni4KLQotVHVlIEp1biAgMSAxNzo1Nzo1OCAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWl0Y2hlbGxAbjAyLmFjbC5sYW5sLmdvdj4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFNfU1VCKTogTmV3IHJlbG9jYXRpb24uCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9QQUdFKTogTGlrZXdpc2UuCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNUKTogTGlrZXdpc2UuCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogbGliYmZkLmg6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2luZm9fdG9faG93dG9fcmVsYSk6IE5ldyBmdW5jdGlvbi4KLQkoVVNFX1JFTCk6IEFkanVzdCBmb3IgbmV3IGNvbnZlbnRpb25zLgotCShNSU5VU19PTkUpOiBOZXcgbWFjcm8uCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIFJfTUlQU19TVUIuCi0JKG1pcHNfcik6IEFkZCBlbnRyaWVzIGZvciBNSVBTX1NVQiwgTUlQU19HT1RfUEFHRSwgTUlQU19HT1RfT0ZTVCwKLQlhbmQgTUlQU19HT1RfRElTUC4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9saW5rLCBub3Qgc2hfaW5mbywgZm9yIGEKLQkuTUlQUy5jb250ZW50IHNlY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFRyZWF0IGFsbCBzZWN0aW9ucyB0aGF0IGJlZ2luCi0Jd2l0aCAuTUlQUy5jb250ZW50IGFzIC5NSVBTLmNvbnRlbnQgc2VjdGlvbnMuICBTZXQKLQlTSEZfTU5JUFNfTk9TVFJJUCBmb3Igc3VjaCBzZWN0aW9uLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZSB0byBtaXBzX2luZm9fdG9faG93dG9fcmVsYS4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19yKTogIEFkZCBlbnRyaWVzIGZvciBNSVBTX1NVQiwgTUlQU19HT1RfUEFHRSwKLQlNSVBTX0dPVF9PRlNULCBhbmQgTUlQU19HT1RfRElTUC4KLQotV2VkIEp1biAgMiAxMTo1MToxMiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHZtcy1taXNjLmMgKF9iZmRfdm1zX2hhc2hfbmV3ZnVuYyk6IEZpeCB1c2Ugb2YgdW5pbml0aWFsaXplZAotCXZhcmlhYmxlLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEF2b2lkIGFtYmlnb3VzCi0JYGVsc2UnLgotCi0xOTk5LTA1LTMwICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWluc3RhdGUgY2hhbmdlIG9mCi0JMTk5My0wMy0yNSAoISEpLiAgVGFrZSBpbnRvIGFjY291bnQgdGhlIGJpdG1hc2tzIGZvciB0aGUgcmVsb2Mgc28KLQl0aGUgYWRkZW5kIGRvZXMgbm90IG92ZXJmbG93IGludG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmQuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBBbWVuZCBwcm90b3R5cGUgZm9yCi0JYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIC4KLQkqIGJmZC1pbi5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZhcm0tb2FiaS5jIChOVU1fRUxFTSk6IE5ldyBtYWNybzogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mCi0JZWxlbWVudHMgaW4gYSBmaXhlZCBzaXplZCBhcnJheS4KLQkoQVJNX0VMRl9BQklfVkVSU0lPTik6IERlZmluZS4KLQkoQVJNX0VMRl9PU19BQklfVkVSU0lPTik6IERlZmluZS4KLQkoUl9BUk1fVEhNX0FCUzUpOiBGaXggcmlnaHRzaGlmdCBhbmQgc2l6ZS4KLQkoUl9BUk1fVEhNX1BDMjIpOiBGaXggc2l6ZS4KLQkoUl9BUk1fUExUMzIpOiBEZWZpbmUgSG93dG8uCi0JKGZpbmRfaG93dG8pOiBOZXcgZnVuY3Rpb246IExvY2F0ZSBhIGhvd3RvIGJhc2VkIG9uIGEgcmVsb2MKLQludW1iZXIuCi0JKGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvKTogVXNlIGZpbmRfaG93dG8gaWYgbmVjZXNzYXJ5LgotCShlbGYzMl9hcm1fcmVsb2NfbWFwKTogQ2hhbmdlIHR5cGUgb2YgZmllbGQgYmZkX3JlbG9jX3ZhbCB0bwotCWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZS4KLQkoZWxmMzJfYXJtX3JlbG9jX21hcFtdKTogQWRkIGVudHJpZXMgZm9yIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotCWFuZCBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiBVc2UgZmluZF9ob3d0byBpZiBuZWNlc3NhcnkuCi0KLQkqIGVsZmFybS1uYWJpLmMgKE5VTV9FTEVNKTogTmV3IG1hY3JvOiBDb21wdXRlIHRoZSBudW1iZXIgb2YKLQllbGVtZW50cyBpbiBhIGZpeGVkIHNpemVkIGFycmF5LgotCShBUk1fRUxGX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShBUk1fRUxGX09TX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShSX0FSTV9USE1fQUJTNSk6IEZpeCByaWdodHNoaWZ0IGFuZCBzaXplLgotCShSX0FSTV9USE1fUEMyMik6IEZpeCBzaXplLgotCShlbGYzMl9hcm1faW5mb190b19ob3d0b19yZWwpOiBSZW5hbWUgdG8gZWxmMzJfYXJtX2luZm9fdG9faG93dG8uCi0JKGVsZjMyX2FybV9yZWxvY19tYXApOiBDaGFuZ2UgdHlwZSBvZiBmaWVsZCBiZmRfcmVsb2NfdmFsIHRvCi0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCi0JKiBlbGYzMi1hcm0uaCAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUpOiBBZGQgbmV3IGZpZWxkOgotCW5vX3BpcGVsaW5lX2tub3dsZWRnZS4KLQkoZWxmMzJfYXJtX2xpbmtfaGFzaF9jcmVhdGUpOiBJbml0aWFsaXNlIG5ldyBmaWVsZCB0byB6ZXJvLgotCShiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBBZGQgbmV3IHBhcmFlbXRlcjoKLQlub19waXBlbGluZV9rbm93bGVkZ2UuICBVc2UgdGhpcyBwYXJhbWV0ZXIgdG8gaW5pdGlhbGlzZSB0aGUgZmllbGQKLQlpbiB0aGUgZ2xvYmFscyBkYXRhIHN0cnVjdHVyZS4KLQkoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBPbmx5IGFkZCBpbiBwaXBlbGluZSBvZmZzZXQgaWYKLQlub19waXBlbGluZV9rbm93bGVkZ2UgaXMgZmFsc2UgYW5kIHRoZSBiaW5hcnkgaXMgZnJvbSBhbiBvbGQKLQl0b29sY2hhaW4uCi0JKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2RhdGEpOiBHZW5lcmF0ZSBhbiBlcnJvciBpZiBhbiBhdHRlbXB0IGlzCi0JbWFkZSB0byBsaW5sIHRvZ2V0aGVyIGJpZyBlbmRpYW4gYW5kIGxpdHRsZSBlbmRpYW4gY29kZS4KLQkoZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKTogTmV3IGZ1bmN0aW9uOiAgSW5pdGlhbGlzZSB0aGUKLQlFSV9PU0FCSSBhbmQgRUlfQUJJVkVSU0lPTiBmaWVsZHMgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgRUxGIHByb2dyYW0KLQloZWFkZXIuCi0JKGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKTogRGVmaW5lLgotCi0xOTk5LTA1LTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZDoKLQllbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycy4KLQotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKTogRGVmaW5lIHRvCi0JTlVMTCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShlbGZOTl9iZWQpOiBJbml0aWFsaXNlIGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzIGZpZWxkLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogU2V0IHRoZSBFSV9PU0FCSSBhbmQgRUlfQUJJVkVSU0lPTiBmaWVsZHMKLQl0byB6ZXJvLgotCShfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDYWxsCi0JZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMgaWYgZGVmaW5lZC4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgd2hldGhlciBnZXR1aWQgYW5kIGdldGdpZCBleGlzdC4KLQkqIGFyY2hpdmUuYzogRGVmaW5lIGdldHVpZCBhbmQgZ2V0Z2lkIGFzIG1hY3JvcyBpZiBIQVZFX0dFVFVJRCBvcgotCUhBVkVfR0VUR0lEIGFyZSBub3QgZGVmaW5lZCwgcmVzcGVjdGl2ZWx5LgotCShiZmRfd3JpdGVfYXJtYXApOiBEb24ndCBzcGVjaWFsIGNhc2Ugb24gX1dJTjMyIGZvciBnZXR1aWQgYW5kCi0JZ2V0Z2lkLgotCSogY29uZmlndXJlLmhvc3Q6IFNldCBhY19jdl9mdW5jX2dldHt1Z31pZCBmb3IgKi0qLXdpbmRvd3MqLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDUtMjggIE1hcnRpbiBEb3JleSAgPG1kb3JleUBtYWRnZS5jb20+Ci0KLQkqIGVsZjMyLWk5NjAuYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX2k5NjAuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkICZiZmRfZWxmMzJfaTk2MF92ZWMuCi0JKiBjb25maWcuYmZkIChpOTYwLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9pOTYwX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogTWFrZWZpbGUuYW0gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLWk5NjAubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1pOTYwLmMuCi0JKiBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tb2FiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBBZGQgZW50cnkgZm9yCi0JUl9BUk1fUExUMzIuCi0JKGZpbmRfaG93dG8pOiBOZXcgZnVuY3Rpb246IEZpbmQgZW50cmllcyBpbiB0aGUKLQllbGYzMl9hcm1faG93dG9fdGFibGUuCi0JKGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvKTogVXNlIGZpbmRfaG93dG8gaWYgdGhlIGVudHJ5IGNhbm5vdCBiZQotCWNvbXB1dGVkIHNpbXBseS4KLQkoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIGxvb2t1cCBmb3IKLQlCRkRfUkVMT0NfQVJNX1BMVDMyLgotCi0xOTk5LTA1LTI1ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogYmZkL2VsZjMyLWFybS5oIChlbGYzMl9hcm1fbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogVXNlIGFib3ZlIGZ1bmN0aW9uIGFzIHRoZQotCWNvbnN0cnVjdG9yIGZvciBoYXNoIHRhYmxlIGVudHJpZXMuCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQXZvaWQgY3Jhc2ggd2hlbiB0aGVyZSBpcyBubyBvdXRwdXQKLQlzZWN0aW9uLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBwYXJhbWV0ZXIgaC4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBQYXNzIHN5bWJvbCBoYXNoIGVudHJ5IHRvIGFib3ZlCi0gCXJvdXRpbmUuCi0JKGVsZjMyX2FybV9nY19zd2VlcF9ob29rLCBlbGYzMl9hcm1fY2hlY2sgcmVsb2NzKTogQ29ycmVjdAotCWNvbW1lbnRzLgotCi0xOTk5LTA1LTI1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGVtaXQKLQliYXNlIGZpbGUgZW50cmllcyBmb3IgcGMtcmVsYXRpdmUgdmFsdWVzLgotCi0xOTk5LTA1LTI1ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogV2hlbiB3ZSBjcmVhdGUgdGhlIGFjdHVhbCBzZWN0aW9uCi0JdG8gcmVmbGVjdCB0aGUgbm90LXRoZXJlIHNlY3Rpb24gQ19TRUNUSU9OIHN5bWJvbHMgcmVmZXIgdG8sCi0JY2hhbmdlIHRoZSBzeW1ib2wgY2xhc3MgdG8gQ19TVEFUIGFzIHRoZSBzZWN0aW9uIGlzIG5vdyByZWFsbHkKLQl0aGVyZS4KLQotMTk5OS0wNS0yNCAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFVuZG8gY2hhbmdlIG9mCi0gCTE5OTktMDMtMjUuCi0KLU1vbiBNYXkgMTcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2VkCi0JRl9QSUNfSU5UIHRvIEZfUElDLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBZGRlZCBGX0FSTV8yYSwgYW5kCi0JRl9BUk1fM00gbGFiZWxzLiAgQ2hhbmdlZCBGX1BJQ19JTlQgdG8gRl9QSUMuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAoaW5fcmVsb2NfcCk6IFJlaW5zdGF0ZS4KLQotMTk5OS0wNS0xNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01DT1JFX1JWQSk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGNvZmYtbWNvcmUuYyAoaW5fcmVsb2NfcCk6IFJlbW92ZSBkZWZpbnRpb24uCi0JKG1jb3JlX2NvZmZfaG93dG8pOiBBZGQgSU1BR0VfUkVMX01DT1JFX1JWQS4KLQkobWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IE1hcCBCRkRfUkVMT0NfUlZBIHRvCi0JSU1BR0VfUkVMX01DT1JFX1JWQS4KLQkoY29mZl9tY29yZV9ydHlwZV90b19ob3d0byk6IEFkZCBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yCi0JSU1BR0VfUkVMX01DT1JFX1JWQS4KLQkoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIHN1cHBvcnQgZm9yCi0JSU1BR0VfUkVMX01DT1JFX1JWQS4KLQkqIGVsZjMyLW1jb3JlIChtY29yZV9lbGZfaG93dG9fKTogQWRkIFJfTUNPUkVfUkVMQVRJVkUuCi0JKG1jb3JlX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IE1hcCBCRkRfUkVMT0NfUlZBIHRvCi0JUl9NQ09SRV9SRUxBVElWRS4KLQkobWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWxldGUgcmVkdW5kYW50IGNhc2UgbGFiZWxzLgotCi1GcmkgTWF5IDE0IDEwOjU5OjU1IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IG9wZXJhdG9yCi0gCXByZWNlZGVuY2UgYmV0d2VlbiBiaXQtYW5kIGFuZCBjb21wYXJpc29uLgotCi1UaHUgTWF5IDEzIDA5OjQ1OjIzIDE5OTkgIEpvZWwgU2hlcnJpbGwgKGpvZWxAT0FSY29ycC5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04NiotKi1ydGVtcyosIG02OGsqLSotcnRlbXMqKTogQWRkZWQgdG8KLQlsaXN0IG9mIHRhcmdldCBmb3JtYXRzICh0YXJnX3NlbHZlY3MpLgotCShpWzM0NTZdODYqLSotcnRlbXNlbGYqLCBtaXBzKmVsLSotcnRlbXMqKTogTmV3IHRhcmdldHMuCi0JKHBvd2VycGNsZSotKnJ0ZW1zKiwgc2gtKi1ydGVtc2VsZiopOiBOZXcgdGFyZ2V0cy4KLQotMTk5OS0wNS0xMCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfYXJtYXApOiBnaXZlIHRoZSBzeW10YWIgZWxlbWVudCBhCi0JcmVhc29uYWJsZSBtb2RlIHVudGlsICJhciB4IiBpcyBzbWFydCBlbm91Z2ggdG8gc2tpcCBpdCAoZml4ZXMKLQlnY2MvbGliZ2NjLmEgYnVpbGRzIG9uIG1pcHMtZWNvZmYgdGFyZ2V0cwotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IEV4cGxhaW4gaG93IENPTURBVHMgYXJlIHN1cHBvc2VkCi0JdG8gd29yay4gIEhhY2sgdG8gc3VwcG9ydCBNUyBpbXBvcnQgbGlicmFyaWVzLCB3aGljaCB1c2UgZGlmZmVyZW50Ci0JQ09NREFUIHR5cGVzIHRoYW4gR05VLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENfU0VDVElPTiBzeW1ib2xzIGFyZSBsb2NhbDsgdGhleSByZWZlcgotCXRvIGltcGxpZWQgemVyby1sZW5ndGggc2VjdGlvbnMgKHNlZSBwZWljb2RlIGJlbG93KQotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFByb3Blcmx5IHJlYWQgbG9uZyBNUwotCWZpbGVuYW1lIHN5bWJvbHMsIHdoaWNoIHVzZSBvbmUgKm9yIG1vcmUqIGF1eGVudHMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogZGl0dG8KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3N5bV9pbik6IEJ1aWxkIHRoZSBpbXBsaWVkIHplcm8tbGVuZ3RoCi0Jc2VjdGlvbnMKLQotVHVlIE1heSAxMSAxNTo1MTo1OCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfaG93dG9fdGFibGUpOiBNYWtlIHBhcnRpYWxfaW5wbGFjZSBmYWxzZQotCWZvciBhbGwgcmVsb2NhdGlvbnMuCi0KLTE5OTktMDUtMTAgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiAgU3RhdGljCi0JaWYgQ09GRl9JTUFHRV9XSVRIX1BFLgotCShiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBMaWtld2lzZS4KLQkqIGNvZmYtYXJtLmM6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluIChhcm1wZV9saXR0bGVfdmVjKTogUmVtb3ZlIGNvZmYtYXJtLmxvLgotCShhcm1wZV9iaWdfdmVjKTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDUtMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIGZvciAucmVsLiBhcyBzdGFydCBvZiByZWwKLQlzZWN0aW9uLCBub3QganVzdCAucmVsLiAgU2FtZSBmb3IgLnJlbGEuCi0KLTE5OTktMDUtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVwbGFjZSBhc3NlcnQgYWJvdXQKLQllbmRpYW5pc20gd2l0aCBhbiBlcnJvciBtZXNzYWdlLgotCi1UaHUgTWF5ICA2IDE3OjA5OjA5IDE5OTkgIEZyZWQgRmlzaCAgPGZuZkBiZS5jb20+Ci0KLQkqIGR3YXJmMi5jIChyZWFkX2FiYnJldnMpOiBDaGFuZ2UgY2FzdCBvZiBkd2FyZl9hYmJyZXZfYnVmZmVyCi0JYXNzaWdubWVudCBmcm9tICJ1bnNpZ25lZCBjaGFyICoiIHRvICJjaGFyICoiLgotCShkZWNvZGVfbGluZV9pbmZvKTogTGlrZXdpc2UgZm9yIGR3YXJmX2xpbmVfYnVmZmVyIGFzc2lnbm1lbnQuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIEFkZCBvbmUgdG8KLQlhZGRyZXNzIG9mIEFSTV9SVkEzMiB0aHVtYiBmdW5jdGlvbnMuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcuCi0JKGVsZjMyX202OGtfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCShlbGYzMl9tNjhrX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKGVsZjMyX202OGtfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoQ1BVMzJfRkxBRyk6IERlZmluZS4KLQkoUExUX0NQVTMyX0VOVFJZX1NJWkUpOiBEZWZpbmUuCi0JKGVsZl9jcHUzMl9wbHQwX2VudHJ5KTogRGVjbGFyZS4KLQkoZWxmX2NwdTMyX3BsdF9lbnRyeSk6IERlY2xhcmUuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIGNwdTMyIHBsdCBlbnRyaWVzLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplKTogUmVtb3ZlIGRlZmluaXRpb24uCi0JKGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQotTW9uIE1heSAgMyAwOToyNDo0OSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fZml4dXBfZm9ybWF0cyk6IEZpeCBjb21tZW50cyBmb3IgUl9TSE9SVF9QQ1JFTF9NT0RFCi0JYW5kIFJfTE9OR19QQ1JFTF9NT0RFLgotCi0xOTk5LTA0LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmMgKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvcy4KLQotRnJpIEFwciAyOCAxNjozNjoxOSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbmNsdWRlIHJlbG9jYXRpb24gYWRkZW5kCi0JaW4gcmVsb2NhdGlvbiBjYWxjdWxhdGlvbi4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYzogQWRkIHN1cHBvcnQgZm9yIG1jb3JlIHJlbG9jcy4KLQotMTk5OS0wNC0yMCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogU2NyYXAgdGhlCi0JaW5jb3JyZWN0IHVzZSBFRl9NSVBTX3h4QklUUFRSUy4KLQotMTk5OS0wNC0xOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsCi0JdmFyaWFibGUgaW5zbi4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLVNhdCBBcHIgMTcgMjA6NTU6MTUgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogUmVtb3ZlIEFSTTI2RCB0cmFuc2Zvcm0uCi0JKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgQWRkIEFSTTI2RCB0cmFuc2Zvcm0uICBPbmx5Ci0JY2hhbmdlIHRvIEFSTTI2RCBmb3IgcmVsb2NhdGVhYmxlIGxpbmtzLgotCi0xOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQotMTk5OS0wNC0xNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgRm9yIFJfQVJNX1RITV9BQlM1LAotCXJlZmV0Y2ggYWRkZW5kIGlmIFVTRV9SRUwsIGFkZCBtYW55IGNvbW1lbnRzIHJlZ2FyZGluZyBjdXJyZW50IHN0YXRlLgotCUZvciBSX0FSTV9USE1fUEMyMiwgcmVmZXRjaCBhZGRlbmQgaWYgVVNFX1JFTCwgc2ltcGxpZnkuCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBGb3IgUl9BUk1fVEhNX0FCUzUsIGZpeAotCXNpemUgYW5kIHJpZ2h0c2hpZnQuICBGb3IgUl9BUk1fVEhNX1BDMjIsIGZpeCBiaXRzaXplLgotCSogZWxmYXJtLW9hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogRGl0dG8uCi0KLVdlZCBBcHIgMTQgMTQ6MzM6MDggMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFplcm8gYGRlYnVnJy4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyk6IExpa2V3aXNlLgotCi0xOTk5LTA0LTEzICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnVuY2F0ZSBhZGRyZXNzIHRvIGxlYXN0Ci0Jc2lnbmlmaWNhbnQgMzIgYml0cyAoYnJlYWtzIDY0IGJpdCB0YXJnZXRzKS4KLQkobG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUpOiBEaXR0by4KLQkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBEaXR0by4KLQotVHVlIEFwciAxMyAyMToyNzoxOSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5KTogTmV3IHJvdXRpbmUuCi0JKEEyVDNfT0ZGU0VUKTogRGVmaW5lLgotCShUMkEzX09GRlNFVCk6IERlZmluZS4KLQkoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBFbWl0IGJhc2UgZmlsZSBlbnRyaWVzIGZvciBpbnRlcndvcmtpbmcKLQlzdHVicy4KLQotMTk5OS0wNC0xMyAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogQWRkIGR1bW15IGVudHJpZXMgZm9yCi0JcmVsb2NzIDE3IHRocm91Z2ggMTkuCi0KLVN1biBBcHIgMTEgMDE6MjU6MTcgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oOiBSZW1vdmUgZm5tYXRjaC5oLgotCSogZWxmbGluay5oIChlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBDYWxsIGJhY2sgdG8gbGQKLQlpbnN0ZWFkIG9mIGNhbGxpbmcgZm5tYXRjaC4KLQotCSogY29uZmlnLmJmZCAoaT84Ni0qLWJlb3NlbGYpOiBJbmNsdWRlIHBlIHZlY3MuCi0KLVN1biBBcHIgMTEgMDE6MTQ6MDYgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEFsbG93IC5wbHQKLQl0byBnbyBtaXNzaW5nLgotCi0xOTk5LTA0LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBNaW5kIG5vX3VuZGVmaW5lZAotCXdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgZHluYW1pYyBzeW1ib2wgcmVmZXJlbmNlcy4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQotU2F0IEFwciAxMCAxNToxMjowOSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IE5ldyBmdW5jdGlvbiBtb3ZlZCBmcm9tCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogLi4uIGhlcmUuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBpdC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBVcGRhdGUuCi0KLTE5OTktMDQtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGY2NC1zcGFyYy5jOiBGaXggaW5jb3JyZWN0IGNhbGxzIHRvIGJmZF9jaGVja19vdmVyZmxvdy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCBmb3IgbWNvcmUtcGUgdGFyZ2V0cy4KLQkqIGNwdS1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCBmb3IgbWNvcmUgdGFyZ2V0cy4KLQkqIGVsZjMyLW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZS1lbGYgdGFyZ2V0LgotCSogcGUtbWNvcmUuYzogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBtY29yZS1wZSB0YXJnZXQuCi0JKiBwZWktbWNvcmUuYzogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBtY29yZS1wZWkgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgYXJjaGl0ZWN0dXJlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogY29mZmNvZGUuaDogQWRkIHN1cHBvcnQgZm9yIG1jb3JlLXBlIHRhcmdldHMuCi0JKiBlbGYuYzogQWRkIHN1cHBvcnQgZm9yIG1jb3JlLWVsZiB0YXJnZXQuCi0JKiByZWxvYy5jOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgcmVsb2NzLgotCSogdGFyZ2V0cy5jOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQotMTk5OS0wNC0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yCi0JUl9BUk1fWFBDMjUgYW5kIFJfQVJNX1RITV9YUEMyMi4KLQkoZWxmMzJfYXJtX3JlbG9jX21hcCk6IFJlbW92ZSByZWR1bmRhbnQgZW50cmllcy4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHN5c2RlcC5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQotMTk5OS0wNC0wNiAgQ2hyaXMgVG9yZWsgIDx0b3Jla0Bic2RpLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX2NoZWNrX292ZXJmbG93KTogQWRkIGFkZHJzaXplIHBhcmFtZXRlci4gIENoYW5nZQotCWFsbCBjYWxsZXJzLiAgUmV3cml0ZSBjb21wbGV0ZWx5LgotCShfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogUmV3cml0ZSBvdmVyZmxvdyBjaGVja2luZy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotMTk5OS0wNC0wNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEdhYnJpZWwgUGF1YmVydCA8cGF1YmVydEBpcmFtLmVzPjoKLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IFNldCBSX1BQQ19HT1QxNl9MTywKLQlSX1BQQ19QTFQxNl9MTyBhbmQgUl9QUENfU0VDVE9GRl9MTyB0byBiZSBjb21wbGFpbl9vdmVyZmxvd19kb250LgotCVNldCBSX1BQQ19QTFQxNl9IQSwgUl9QUENfU0VDVE9GRl9IQSBhbmQgUl9QUENfRU1CX05BRERSMTZfSEEgdG8KLQloYXZlIGEgcmlnaHRzaGlmdCBvZiAxNiBhbmQgdXNlIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLgotCSogcHBjYm9vdC5jIChwcGNib290X3ZlYyk6IFVzZSBsaXR0bGUgZW5kaWFuIHJvdXRpbmVzIGZvcgotCWhlYWRlcnMuCi0KLQkqIGVsZi5jIChlbGZjb3JlX3N0cm5kdXApOiBPbmx5IGRlZmluZSBpZiBpdCB3aWxsIGJlIHVzZWQuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxheF9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgaXJlbAotCWFuZCBpcmVsZW5kLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgaS4KLQkocHBjX2VsZl9nY19tYXJrX2hvb2spOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotCUZyb20gQmVybmQgTml0emxlciA8bml0emxlckBrYWdjcGQwMS5hZzAxLmtvZGFrLkNPTT46Ci0JKiBzcmVjLmMgKHNyZWNfc2Nhbik6IEFjY2VwdCBcciBpbiBzeW1ib2wgZGVmaW5pdGlvbnMuCi0JKHNyZWNfb2JqZWN0X3ApOiBTZXQgSEFTX1NZTVMgaWYgd2Ugc2F3IGFueSBzeW1ib2xzLgotCShzeW1ib2xzcmVjX29iamVjdF9wKTogTGlrZXdpc2UuCi0KLTE5OTktMDQtMDQgIERvbiBCb3dtYW4gPGRvbkBwaXhzY2kuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgbWlwcyplbC0qLXZ4d29ya3MqIGFuZCBtaXBzKi0qLXZ4d29ya3MqLgotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZHdhcmYxLmMgKHBhcnNlX2xpbmVfdGFibGUpOiBSZW1vdmUgdW51c2VkIGxvY2FscyBsYXN0X3BjIGFuZAotCWxhc3RfbGluZS4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyKTogRGVjbGFyZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfZ2NfbWFya19ob29rKTogQWRkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaC4KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBSZW1vdmUgdW51c2VkCi0JbG9jYWwgaS4KLQkqIHN5bXMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBSZW1vdmUgdW51c2VkCi0JbG9jYWwgdmFsLgotCi0xOTk5LTAzLTMxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogdGFyZ2V0cy5jOiBBZGQgc3VwcG9ydCBmb3IgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogY29mZi1hcm0uYzogQWxsb3cgaGVhZGVyIGZpbGVzIHRvIG92ZXJyaWRlIGRlZmluaXRpb24gb2YKLQlUQVJHRVRfVU5ERVJTQ09SRSBhbmQgVVNFUl9MQUJFTF9QUkVGSVguCi0JKiBwZS1hcm0uaDogQWxsb3cgcHJldmlvdXMgaGVhZGVyIGZpbGVzIHRvIG92ZXJyaWRlIGRlZmluaXRpb24gb2YKLQlUQVJHRVRfTElUVExFX1NZTSBhbmQgVEFSR0VUX0JJR19TWU0uCi0JKiBwZWktYXJtLmg6IEFsbG93IHByZXZpb3VzIGhlYWRlciBmaWxlcyB0byBvdmVycmlkZSBkZWZpbml0aW9uIG9mCi0JVEFSR0VUX0xJVFRMRV9TWU0gYW5kIFRBUkdFVF9CSUdfU1lNLgotCSogZXBvYy1wZS1hcm0uYzogTmV3IGZpbGUuICBTdXBwb3J0IGFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGVwb2MtcGVpLWFybS5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgYXJtLWVwb2MtcGVpIHRhcmdldC4KLQotMTk5OS0wMy0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9tYXBfc3ltYm9scyk6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBzZWN0aW9uCi0Jc3ltYm9scyBhcmUgZ2VuZXJhdGVkIGZvciBjb250ZW50LWxlc3Mgc2VjdGlvbnMgd2hpY2ggYXJlCi0Jbm90IG1hcHBlZCB0byB0aGUgb3V0cHV0IGZpbGUuCi0KLQkqIGxpbmtlci5jOiBSZXBsYWNlIGRpcmVjdCByZWZlcmVuY2VzIHRvIGZpZWxkcyBpbiBCRkQgc3RydWN0dXJlCi0Jd2l0aCBhY2Nlc3NvciBtYWNyb3MuCi0KLQkqIGVsZmxpbmsuaDogUmVwbGFjZSBkaXJlY3QgcmVmZXJlbmNlcyB0byBmaWVsZHMgaW4gQkZEIHN0cnVjdHVyZQotCXdpdGggYWNjZXNzb3IgbWFjcm9zLgotCi0xOTk5LTAzLTI1ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlnLmJmZDogRWxpbWluYXRlIHJlZHVuZGFuY3kgaW4gY2hlY2tzIGZvciBMaW51eC9BUk0uCi0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFRha2UgdGhlIHJpZ2h0c2hpZnQgaW50bwotCWFjY291bnQgd2hlbiBhZGp1c3Rpbmcgc2VjdGlvbiBzeW1ib2xzIGR1cmluZyBhIHBhcnRpYWwgbGluay4KLQotMTk5OS0wMy0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1zcGFyYy5jIChzdHJ1Y3QgY29mZl9yZWxvY19tYXApOiBDaGFuZ2UgdHlwZSBvZiBmaWVsZAotCSAgJ2JmZF9yZWxvY192YWwnIHRvIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZS4KLQkqIGVsZi1tMTAyMDAuYyAoc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYtbTEwMzAwLmMgKHN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItYXJjLmMgKHN0cnVjdCBhcmNfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1kMTB2LmMgKHN0cnVjdCBkMTB2X3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItZDMwdi5jIChzdHJ1Y3QgZDMwdl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLWZyMzAuYyAoc3RydWN0IGZyMzBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1tMzJyLmMgKHN0cnVjdCBtMzJyX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItc2guYyAoc3RydWN0IGVsZl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLXNwYXJjLmMgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi12ODUwLmMgKHN0cnVjdCB2ODUwX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmNjQtc3BhcmMuYyAoc3RydWN0IGVsZl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZmFybS1uYWJpLmMgKHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGZhcm0tb2FiaS5jIChzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCk6IERpdHRvLgotCi0xOTk5LTAzLTE3ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IENoYW5nZWQgdGhpcwotCWZ1bmN0aW9uIHNvIHNvdXJjZS1sZXZlbCBhc3NlbWJseSB3b3Jrcy4gIElmIG11bHRpcGxlIE5fU09zCi0JYXJlIHNlZW4gd2l0aG91dCBhbmQgTl9GVU5zLCBjcmVhdGUgYW4gaW5kZXh0YWJsZSBlbnRyeSB3aXRoCi0JYSBOVUxMIGZ1bmN0aW9uIG5hbWUuCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSkgQWxsb3cgbWVyZ2luZwotCW9mIGNlcnRpYW4gc2ltaWxhciBjcHVzLgotCi0xOTk5LTAzLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCUFkZCB0aGUgNTAwMC4gIENoYW5nZSB0aGUgYXJjaGl0ZWN0dXJlIGZvciB0aGUgNTQwMCB0byBtaXBzNC4KLQkoZWxmX21pcHNfbWFjaCk6IEFkZCByNTAwMC4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjcHUtaTk2MC5jIChzY2FuX2k5NjBfbWFjaCk6IFJlY29nbml6ZSBpOTYwOmthX3NhIGFuZCBpOTYwOmtiX3NiLgotCi0xOTk5LTAzLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogR2VuZXJhdGUgd2FybmluZyBhYm91dAotCWh1Z2UgZmlsZSBvZmZzZXRzIGZvciBhbnkgc2VjdGlvbiB0aGF0IHdpbGwgb2NjdXB5IGZpbGUgc3BhY2UsIG5vdAotCWp1c3QgdGhvc2UgdGhhdCBhcmUgbG9hZGFibGUuCi0KLTE5OTktMDItMjQgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUgYWZ0ZXIgTmljayBDbGlmdG9uJ3MgRmViIDE3IGNoYW5nZXMuCi0KLTE5OTktMDItMjIgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYzogQWRkIHBwY19lbGZfcmVsYXhfc2VjdGlvbigpIGZvciB0aGUgbGQgb3B0aW9uIG1wYzg2MGMwLgotCi1Nb24gRmViIDIyIDE4OjI2OjUxIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspOiBEZWZpbmUuCi0JKiBlbGZsaW5rLmg6IFJldmVydCBhbGwgY2hhbmdlcyBzaW5jZSBGZWIgMTYuICBJbnN0ZWFkOgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgUkVGX1JFR1VMQVJfTk9OV0VBSyBmbGFnIGlmCi0JYXBwcm9wcmlhdGUuICBDb3B5IGl0IHRvIHZlcnNpb24gc3ltYm9scy4KLQkoZWxmX2ZpeF9zeW1ib2xfZmxhZ3MpOiBTZXQgUkVGX1JFR1VMQVJfTk9OV0VBSyBmb3Igbm9uIEVMRgotCXN5bWJvbHMgaWYgYXBwcm9wcmlhdGUuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBTZXQgUkVGX1JFR1VMQVJfTk9OV0VBSyBmb3Igd2Vha2RlZgotCXN5bWJvbCBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IElmIHN5bWJvbCBpcyBtYXJrZWQgYXMgdW5kZWZpbmVkLCBhbmQKLQloYXMgbm8gbm9ud2VhayByZWZlcmVuY2VzLCBtYXJrIGl0IGFzIHdlYWsgdW5kZWZpbmVkLgotCi1GcmkgRmViIDE5IDE2OjAxOjEyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogV2hlbiBvdmVycmlkaW5nIGEgZHluYW1pYwotCWRlZmluaXRpb24gd2l0aCBhIHdlYWsgdW5kZWZpbmVkIHN5bWJvbCwgc2V0IE5FRURTX1BMVCBpZiBpdCBpcyBhCi0JZnVuY3Rpb24uCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGNvcHkgdGhlIG90aGVyIGZpZWxkIGlmIHdlCi0JYXJlIG92ZXJyaWRkaW5nLgotCi1UaHUgRmViIDE4IDE4OjA3OjQzIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogRG8gbm90IG1lcmdlIGFueSBzeW1ib2wgZnJvbSBhCi0Jc2hhcmVkIG9iamVjdCB3aXRoIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLgotCi0xOTk5LTAyLTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tbmFiaS5jOiBTZXQgcGFydGlhbF9pbnBsYWNlIGJhY2sgdG8gZmFsc2UuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogUmUtZW5hYmxlLgotCShVU0VSX0xBQkVMX1BSRUZJWCk6IFNldCB0byAiXyIuCi0KLQlUaGUgZm9sbG93aW5nIHBhdGNoZXMgYXJlIGZyb206IFNjb3R0IEJhbWJyb3VnaAotCTxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoTV9BUk02X05FVEJTRCk6IFNldCB0byAxNDMuCi0KLQkqIHJlbG9jLmM6IEFkZCBBUk0gUElDIHJlbG9jczogICBCRkRfUkVMT0NfQVJNX0dPVDEyLAotCUJGRF9SRUxPQ19BUk1fR09UMzIsIEJGRF9SRUxPQ19BUk1fSlVNUF9TTE9ULCBCRkRfUkVMT0NfQVJNX0NPUFksCi0JQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCwgQkZEX1JFTE9DX0FSTV9QTFQzMiwKLQlCRkRfUkVMT0NfQVJNX1JFTEFUSVZFLCBCRkRfUkVMT0NfQVJNX0dPVE9GRiwgQkZEX1JFTE9DX0FSTV9HT1RQQy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogU2V0IHBhcnRpYWxfaW5wbGFjZSB0bwotCSd0cnVlJyBhcyBSRUwgcmVsb2NzIGFyZSBub3cgYmVpbmcgdXNlZC4gIEFkZCBuZXcgUElDIHJlbG9jczoKLQlSX0FSTV9DT1BZLCBSX0FSTV9HTE9CX0RBVCwgUl9BUk1fSlVNUF9TTE9ULCBSX0FSTV9SRUxBVElWRSwKLQlSX0FSTV9HT1RPRkYsIFJfQVJNX0dPVFBDLCBSX0FSTV9HT1QzMiwgUl9BUk1fUExUMzIuCi0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoZWNrIGJ5dGUgb3JkZXIKLQlvZiB0YXJnZXRzLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IENoYW5nZSBwYXJhbWV0ZXJzIHNvIHRoYXQgZW50aXJlCi0JcmVsb2MgaXMgcGFzc2VkLiAgQWRkIHN1cHBvcnQgZm9yIFBJQyByZWxvY3MuCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogUGFzcyBlbnRpcmUgcmVsb2MgdG8KLQllbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZS4KLQkoZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSBuZXcgUElDIHJlbG9jcy4KLQkoZWxmMzJfYXJtX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKEVMRl9NQVhQQUdFX1NJWkUpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogRGVmaW5lLgotCShlbGZfYmFja2VuZF93YW50X2dvdF9wbHQpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSk6IERlZmluZS4KLQotV2VkIEZlYiAxNyAxMjowMjoyNiAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFrZSByZWdpbmZvCi0Jc2VjdGlvbnMgU0VDX0xJTktfT05DRSBhbmQgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi1XZWQgRmViIDE3IDEyOjA3OjIzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmYXJtLW9hYmkuYyAoYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMsCi0JYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0JYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogRGVmaW5lIHRvIGF2b2lkIGNsYXNoCi0Jd2l0aCBlbGZhcm0tbmFiaS5jLgotCi0JKiBlbGYzMi1hcm0uaDogRG9uJ3QgZGVjbGFyZSBlbGYzMl9hcm1faW5mb190b19ob3d0by4KLQkoZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIsIGVsZjMyX2FybV90b190aHVtYl9zdHViLAotCWVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IE1ha2UgdGhlbSBzdGF0aWMuCi0KLVR1ZSBGZWIgMTYgMjI6NDQ6MzcgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBBZGQgcGZsYWdzIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgRG8gbm90IG1lcmdlIGEgZGVmaW5pdGlvbiBmcm9tIGEgc2hhcmVkIG9iamVjdCB3aXRoIGEKLQl3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvIG5vdCBjaGFuZ2UgdGhlIHN5bWJvbCB0eXBlIG9yCi0Jc2l6ZSBpZiB0aGUgb2xkIHN5bWJvbCBvdmVycmlkZXMgdGhlIG5ldyBvbmUuCi0KLTE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gdGFyZ2V0LgotCi1Nb24gRmViICA4IDExOjE4OjE0IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChyZWxvY19tYXApOiBVc2UgdGhlIGNvcnJlY3QgdHlwZXMgZm9yIHRoZSBzdHJ1Y3QKLQlmaWVsZHMgaW5zdGVhZCBvZiB1bnNpZ25lZCBjaGFyLgotCi1GcmkgRmViICA1IDAwOjIyOjM2IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBGZWIgIDQgMjI6MzA6MTMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBBQ19QUkVSRVEgdG8gMi4xMy4gIFJlbW92ZSBBTV9DWUdXSU4zMi4KLQlDaGFuZ2UgQU1fRVhFRVhUIHRvIEFDX0VYRUVYVCBhbmQgQU1fUFJPR19JTlNUQUxMIHRvCi0JQUNfUFJPR19JTlNUQUxMLiAgQWRkIGNvbW1lbnRzIHRvIHVzZXMgb2YgQUNfREVGSU5FLgotCSogYWNpbmNsdWRlLm00OiBBZGQgY29tbWVudHMgdG8gdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGF1dG9jb25mL2F1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCi0JKiBjb25maWcuaW46IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCi0xOTk5LTAyLTA0ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmMgKHJlYWxfcmVhZCk6IGRvbid0IGNhbGwgZnJlYWQgZm9yIHplcm8gYnl0ZXMuICBUaGlzCi0JY292ZXJzIHVwIGEgYnVnIChvciBtaXN1c2Ugb2YgYmZkKSB0aGF0J3MgZXhwb3NlZCBieSBTb2xhcmlzLgotCi1UaHUgRmViICA0IDEyOjM4OjEwIDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbnN1cmUgdGhhdCB0aGUgdGFyZ2V0Ci0Jb2YgYSBqdW1wIGlzIGluIHRoZSBjdXJyZW50IDI1NiBNQiByZWdpb24uCi0KLVRodSBGZWIgIDQgMTI6MTU6MzggMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2hhbmdlIGxhc3QgcGF0Y2ggdG8gb25seQotCXRha2UgZWZmZWN0IGZvciB0aGUgYmluYXJ5IHRhcmdldC4KLQotV2VkIEZlYiAgMyAxOTo0MDoxMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgQkZEX1JFTE9DX0NUT1IuCi0KLVdlZCBGZWIgIDMgMTU6MDI6NDQgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfY2hlY2tfcmVsb2NzKTogIE5ldyByb3V0aW5lLgotCi1UdWUgRmViICAyIDIxOjM4OjI4IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IElmIHRoZSB0YXJnZXQgd2FzCi0JcHJldmlvdXNseSBzcGVjaWZpZWQsIGRvbid0IGNoZWNrIG90aGVyIHRhcmdldHMgd2hlbiBjaGVja2luZyBmb3IKLQlhbiBhcmNoaXZlIGZpbGUuCi0KLVR1ZSBGZWIgIDIgMTg6MTY6NDMgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIFJlbW92ZWQuCi0JKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6ICBSZW1vdmVkCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIE5ldy4KLQkoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogIE5ldy4KLQkqIGVsZmFybS1vYWJpLmMgKGVsZjMyX2FybV9yZWxvY19tYXApOiAgTmV3LgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiAgTmV3LgotCi1Nb24gRmViICAxIDE5OjQ5OjIxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tbmFiaS5jOiAgUmVuYW1lZCBmcm9tIGVsZjMyLWFybS1uZXdhYmkuYy4KLQkqIGVsZmFybS1vYWJpLmM6ICBSZW5hbWVkIGZyb20gZWxmMzItYXJtLW9sZGFiaS5jCi0JKiBNYWtlZmlsZS5hbTogIFVzZSBuZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgbmV3IGZpbGVzLgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLQotMTk5OS0wMi0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9nY19tYXJrX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGZyMzBfZWxmX2djX3N3ZWVwX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQotTW9uIEZlYiAgMSAxMjoyMTo0NyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6ICBBZGQgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotCWFuZCBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjLgotCi1Nb24gRmViICAxIDExOjQ2OjMxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZWxmMzItYXJtLW9sZGFiaS5sbyk6ICBOZXcuCi0JKGVsZjMyLWFybS1uZXdhYmkubG8pOiAgTmV3LgotCSogTWFrZWZpbGUuaW46ICBSZWdlbmVyYXRlLgotCSogY29uZmlnLmJmZCAodGh1bWItKi1lbGYpOiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgdGFyZ191bmRlcnNjb3JlLgotCShhcm0tKi1lbGYpOiAgTGlrZXdpc2UuCi0JKGFybS0qLW9hYmkpOiAgTmV3LgotCSh0aHVtYi0qLW9hYmkpOiAgTmV3LgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYyk6ICBOZXcuCi0JKGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMpOiAgTmV3LgotCSogZWxmMzItYXJtLW5ld2FiaS5jOiAgTmV3LgotCSogZWxmMzItYXJtLW9sZGFiaS5jOiAgTmV3LgotCSogZWxmMzItYXJtLmM6ICBSZW1vdmVkLgotCSogZWxmMzItYXJtLmg6ICBOZXcuCi0KLU1vbiBGZWIgIDEgMTE6NTI6MTIgMTk5OSAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IE9taXQgd2FybmluZ3MgZm9yCi0JdW5sb2FkYWJsZSBzZWN0aW9ucy4KLQotMTk5OS0wMS0zMSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGN7LGxlfS0qLXZ4d29ya3MqKTogQWRkIGFsaWFzZXMgdG8KLQlwb3dlcnBjeyxsZX0tKi1lYWJpLgotCi0xOTk5LTAxLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAocmVhZF91bnNpZ25lZF9sZWIxMjgpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkqIGR3YXJmMi5jIChyZWFkX3NpZ25lZF9sZWIxMjgpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotRnJpIEphbiAyOSAwMDo0NzoyMSAxOTk5ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogT25seSBhZGp1c3QKLQlwX2FsaWduIHdoZW4gbmVlZGVkLgotCi1UaHUgSmFuIDI4IDIwOjA1OjIyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IHJldHVybiBlYXJseSBmb3IgYQotIAlub24tbG9hZGFibGUgc2VjdGlvbiwgaW4gY2FzZSB0aGUgZmlyc3Qgc2VjdGlvbiBpcyBub24tbG9hZGFibGUuCi0gIAlEb24ndCBzZXQgdGhlIGxvdyBsbWEgZm9yIGEgU0VDX05FVkVSX0xPQUQgc2VjdGlvbi4gIEZyb20gTWFjaWVqCi0JVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4uCi0KLTE5OTktMDEtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9yZWxvY19tYXApOiBBZGQgUl9GUjMwX0dOVV9WVElOSEVSSVQgYW5kCi0JUl9GUjMwX0dOVV9WVEVOVFJZIHJlbG9jcy4KLQotVGh1IEphbiAyOCAxMTowODoxNiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfc3ltKTogIFplcm8gc3ltcyB3aGljaCBhcmUKLSAgICAgICBwYXJ0IG9mIHNlY3Rpb25zIHdoaWNoIGhhdmUgYmVlbiBleGNsdWRlZC4KLQotV2VkIEphbiAyNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyk6IENoYW5nZWQgRl9QSUMKLQl0byBGX1BJQ19JTlQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlbW92ZWQgRl9BUk1fMmEgYW5kCi0JRl9BUk1fM00gbGFiZWxzLiAgQ2hhbmdlZCBGX1BJQyB0byBGX1BJQ19JTlQuCi0KLTE5OTktMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfaG93dG9fdGFibGUpOiBGaXggbmFtZSBvZiBSX0ZSMzBfNDgKLQlyZWxvY2F0aW9uLgotCShmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVc2UgY29tcHV0ZWQgdmFsdWUgYXMgcmVzdWx0IG9mCi0JcmVsb2NhdGlvbi4KLQotMTk5OS0wMS0yNiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEVtaXQgd2FybmluZyBmb3IKLQlodWdlIGZpbGUgb2Zmc2V0cyBkdWUgdG8gd2lkZWx5LWRpc3BlcnNlZCBzZWN0aW9uIExNQXMuCi0KLU1vbiBKYW4gMTggMDM6MzU6MzUgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIG5vdCBEX1BBR0VELAotCWFsaWduIGZpcnN0IHNlY3Rpb24gdG8gbGFyZ2VzdCBzZWN0aW9uIGFsaWdubWVudCwgbm90IGZpcnN0Ci0Jc2VjdGlvbiBhbGlnbm1lbnQuCi0KLTE5OTktMDEtMDQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTIuMSBvciBoaWdoZXIuCi0KLVR1ZSBEZWMgMjIgMTU6MjE6NDEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXgpOiAgRGVmaW5lLgotCSogYmZkLWluMi5oOiAgTGlrZXdpc2UuCi0JKiBjcHUtaTM4Ni5jIChiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCk6ICBOZXcuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jLGJmZC1pbjIuaCAoYmZkX21hY2hfbWlwczQxMTEpOiBOZXcuCi0JKiBjcHUtbWlwcy5jOiBBZGQgc3VwcG9ydCBmb3IgYW5kIGluZGVwZW5kZW50IDQxMTEuCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX21hY2gpOiBFX01JUFNfTUFDSF80MTExIC0+IGJmZF9tYWNoX21pcHM0MTExLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCWJmZF9tYWNoX21pcHM0MTExIC0+IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTExLgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19hYmlfbmFtZSk6IE5ldy4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ29tcGFyZSBFRl9NSVBTX0FCSSBmbGFncy4KLQotMTk5OC0xMi0xMiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKLQlIYW5kbGUgYmZkX21hY2hfbWlwczQzMDAuCi0KLTE5OTgtMTItMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmM6IFJlbW92ZSBsZWFrZWQgZGV2ZWxvcG1lbnQgY29kZSBmcm9tIHBhdGNoCi0JMTk5OC0xMi0xMCBieSBSaWNoYXJkIEhlbmRlcnNvbi4KLQotMTk5OC0xMi0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZmFpbCByZWxvY2F0aW9ucwotCWluIGRlYnVnIHNlY3Rpb25zIGZvciBzeW1ib2wgZGVmaW5lZCBleHRlcm5hbGx5LgotCi1UaHUgRGVjIDEwIDEwOjU4OjM4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZSBkdXBsaWNhdGUgZW50cnkgZm9yCi0JdGVraGV4X3ZlYy4KLQotMTk5OC0xMi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9ob3d0b190YWJsZSk6IFNldCBzcmNfbWFzayBmaWVsZHMgdG8gMAotCXNpbmNlIHdlIGFyZSB1c2luZyBSRUxBcy4KLQotVHVlIERlYyAgOCAyMjoxNTo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTQ08gT3BlbiBTZXJ2ZXIgUmVsZWFzZSA1IGNvcmUgZmlsZSBzdXBwb3J0LCBmcm9tIEpvdWtlIE51bWFuCi0JPGpudW1hbkBoaXNjb20ubmw+OgotCSogc2NvNS1jb3JlLmM6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtKi1zY28zLjJ2NSopOiBVc2Ugc2NvNS1jb3JlLmxvLgotCShzY281LWNvcmUubG8pOiBEZWZpbmUgU0NPNV9DT1JFIGluIENPUkVGTEFHLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShPUFRJT05BTF9CQUNLRU5EUyk6IEFkZCBzY281LWNvcmUubG8uCi0JKE9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBzY281LWNvcmUuYy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBzY281X2NvcmVfZGF0YSBmaWVsZCB0byB0ZGF0YS4KLQkqIHRhcmdldHMuYyAoc2NvNV9jb3JlX3ZlYyk6IEFkZCB0byB0YXJnZXQgbGlzdCBpZiBTQ081X0NPUkUuCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBEZWMgIDggMTk6Mzg6NDIgMTk5OCAgTWFyayBLbGVpbiAgPG1rbGVpbkBkaXMuY29tPgotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19IRUFERVJfRElSRU5ULgotCShocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAoaHBwYSotKi1tcGVpeCopOiBOZXcgaG9zdC4KLQkqIGhwdXgtY29yZS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4gIFVzZSBIQVZFX0RJUkVOVF9IIGFuZAotCWZyaWVuZHMgcmF0aGVyIHRoYW4ganVzdCBpbmNsdWRpbmcgPHN5cy9kaXIuaD4uCi0JKiBzb20uaCAoc3RydWN0IHNvbV9zeW1ib2wpOiBBZGQgaHBwYV9wcml2X2xldmVsIGFuZCBhcHRvCi0JdGNfZGF0YS4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKHN0cnVjdCBzb21kYXRhKTogQWRkIGNvbXBfdW5pdCBmaWVsZC4KLQkob2JqX3NvbV9jb21waWxhdGlvbl91bml0KTogRGVmaW5lLgotCShiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml4KTogRGVjbGFyZS4KLQkqIHNvbS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4KLQkoc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvKTogQWRkIG5ldyBmaWVsZCBwcml2X2xldmVsLgotCShzb21fb2JqZWN0X3NldHVwKTogQWRkIGN1cnJlbnRfb2Zmc2V0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShzZXR1cF9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShzb21fb2JqZWN0X3ApOiBGb3IgRVhFQ0xJQk1BR0lDLCByZWFkIHRoZSBsc3QgaGVhZGVyLgotCShzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MpOiBBZGQgY29tcGlsYXRpb25fdW5pdCBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBXcml0ZSBvdXQgY29tcGlsYXRpb25fdW5pdC4KLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFNldCBwcml2X2xldmVsLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFNldCB4bGVhc3QgZmllbGQgdG8gMy4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBzeW1ib2wgcHJpdl9sZXZlbC4KLQkoYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBTZXQgeGxlYXN0IGZpZWxkIHRvIDMuICBTZXQKLQlwcml2X2xldmVsIGludG8gc3ltYm9sX3ZhbHVlLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVR1ZSBEZWMgIDggMTY6MjE6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogQ2hhbmdlIGNhbGwgdG8gbm9uZXhpc3RlbnQKLQl3YXJuaW5nIGZ1bmN0aW9uIHRvIGNhbGwgX2JmZF9lcnJvcl9oYW5kbGVyIGluc3RlYWQuCi0KLQkqIGxpYmJmZC5jIChDT0VSQ0UzMik6IENhc3QgdGhyb3VnaCB1bnNpZ25lZCBsb25nIGFuZCBsb25nIHRvCi0JYXZvaWQgYnVnIGluIG9sZCB2ZXJzaW9uIG9mIGdjYy4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBSZW1vdmUuCi0JKGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogRG9uJ3QgZGVmaW5lLgotCi0xOTk4LTEyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBQQyByZWxhdGl2ZQotCXJlbG9jYXRpb25zIHRvIGluY2x1ZGUgb2Zmc2V0IG9mIDIgaW5jbHVkZWQgaW4gdGhlIGluc25zLCBhbmQgdGhlCi0Jb2Zmc2V0IG9mIHRoZSByZWxvY3Mgd2l0aGluIHRoZSBzZWN0aW9uLgotCi1XZWQgRGVjICAyIDE1OjAzOjU5IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBEYXZpZCBUYXlsb3IKLSAJPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPiwgRWRpdGggRXBzdGVpbgotIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+LCBKaW0gQmxhbmR5Ci0gCTxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4sIGFuZCBFbGVuYSBaYW5ub25pCi0gCTxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiB0aGUgcHJvamVjdCB0byBtZXJnZSBpbgotIAljaGFuZ2VzIG9yaWdpbmFsbHkgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nCi0gCWVudHJpZXMuCi0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbHQgdXNpbmcgbGF0ZXN0Ci0gCWF1dG9tYWtlIG1hY3JvIGxpYnJhcnkuCi0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfY29yZV9maWxlX3ApOiB0aGlzIGZ1bmN0aW9uIG5vdwotIAl1bmRlcnN0YW5kcyBIUFVYIDEwLjMwIHRocmVhZCBpbmZvLiBZZXMsIHRoZSB0aHJlYWQgc3RhY2tzIGNhbiBiZQotIAlmb3VuZCBpbiB0aGUgY29yZWZpbGUhIEFsc28sIGluIGhwdXhfY29yZV9jb3JlX2ZpbGVfcCwgaWYgd2UKLSAJZW5jb3VudGVyIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZSwgZG9uJ3QgcHVudC4gIEluc3RlYWQsCi0gCWp1c3Qgc2tpcCBpdC4gIEFsc28sIGNvdW50IHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgb2Yga25vd24gdHlwZQotIAl0aGF0IHdlIGVuY291bnRlci4gIElmIHdlIGVuY291bnRlciBhdCBsZWFzdCBvbmUgZ29vZCBvbmUsIHRoZW4KLSAJd2UnbGwgZGVjbGFyZSB0aGF0IHRoZSBmaWxlIGlzIGEgY29yZSBmaWxlLiAgSWYgd2UgZW5jb3VudGVyIGFueQotIAl1bmtub3duIG9uZXMgYnV0IHNvbWUga25vd24gb25lcywgdGhlbiB3ZSdsbCBpc3N1ZSBhIHdhcm5pbmcgKGJ1dAotIAlzdGlsbCBkZWNsYXJlIGl0IHRvIGJlIGEgY29yZSBmaWxlKS4gQWxzbywgY29ycmVjdGx5IGRlY2lkZSB3aGVuIGEKLSAJZmlsZSBpcyBub3QgYSBjb3JlLgotCShQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCk6IGRlZmluZSBpZiBDT1JFX0FOT05fU0hNRU0gZGVmaW5lZC4KLQkoQ09SRV9BTk9OX1NITUVNKTogZGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShocHV4X2NvcmVfc3RydWN0KTogYWRkIG1lbWJlcnMgbHdwaWQgYW5kIHVzZXJfdGlkLgotCShjb3JlX2tlcm5lbF90aHJlYWRfaWQsIGNvcmVfdXNlcl90aHJlYWRfaWQpOiBuZXcgbWFjcm9zLgotCShtYWtlX2JmZF9hc2VjdGlvbik6IHVzZSBiZmRfYWxsb2MgdG8gYWxsb2NhdGUgcm9vbSBmb3IgYSBjb3B5IG9mCi0gCXRoZSBuYW1lIGJlZm9yZSBzdG9yaW5nIGl0IGluIHRoZSBiZmQuCi0JKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IGhhbmRsZSB0aHJlYWRzLgotCi0JKiBsaWJocHBhLmggKEdFVF9GSUVMRCk6IHByb3RlY3QgYWdhaW5zdCByZWRlZmluaXRpb24uCi0JKEhQUEFfV0lERSk6IGRlZmluZS4KLQkoR0VUX0ZJRUxEKTogZGVmaW5lLgotCShHRVRfQklUKTogZGVmaW5lLgotCShNQVNLKTogZGVmaW5lLgotCShDQVRFTkFURSk6IGRlZmluZS4KLQkoRUxFVkVOKTogZGVmaW5lLgotCShzaWduX2V4dGVuZCk6IHJlZGVmaW5lLgotCShhc3NlbWJsZV82KTogZGVmaW5lLgotCShhc3NlbWJsZV8xMik6IHJld3JpdGUuCi0JKGFzc2VtYmxlXzE2KTogZGVmaW5lLgotCShhc3NlbWJsZV8xNmEpOiBkZWZpbmUuCi0JKGFzc2VtYmxlXzE3KTogcmV3cml0ZS4KLQkoYXNzZW1ibGVfMjIpOiBkZWZpbmUuCi0KLTE5OTgtMTItMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogVXNpbmcgc2lnbmVkCi0JcmVsb2NhdGlvbnMgZm9yIHNpZ25lZCB2YWx1ZXMuCi0KLVN1biBEZWMgIDYgMTY6MzA6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzYnNkLmMgKE1ZKHNldF9hcmNoX21hY2gpKTogTWFrZSBzdGF0aWMuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEZvciBiZmRfYXJjaF9taXBzLCB1c2UKLQliZmRfbWFjaF9taXBzKiBtYWNyb3MgcmF0aGVyIHRoYW4gc2ltcGxlIG51bWJlcnMuCi0KLQlDT0ZGIHdlYWsgc3ltYm9sIHN1cHBvcnQsIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNYXJrIEVsYnJlY2h0Ci0JPHNub3diYWxsM0B1c2EubmV0PjoKLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSGFuZGxlIENfV0VBS0VYVC4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBMaWtld2lzZS4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsd2F5cyBpbml0aWFsaXplIHRoZQotCWluY2x1ZGVzX3BoZHJzIGZpZWxkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogQ2hlY2sgZm9yIGNhc2Ugd2hlcmUgYSBub24tRUxGCi0JZmlsZSBkZWZpbmVzIGEgc3ltYm9sIGZpcnN0IG1lbnRpb25lZCBpbiBhbiBFTEYgZmlsZS4KLQotCSogYmZkLWluLmg6IEFsd2F5cyBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGFuZCBCRkRfSE9TVF9VXzY0X0JJVCBpZgotCXBvc3NpYmxlLCByYXRoZXIgdGhhbiBvbmx5IGlmIEJGRDY0LgotCSogZWxmbGluay5oIChjb21wdXRlX2J1Y2tldF9jb3VudCk6IEp1c3QgY2hlY2sgQkZEX0hPU1RfVV82NF9CSVQsCi0Jbm90IF9fR05VQ19fLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDb3JyZWN0IHRlc3QgdG8gYXZvaWQKLQlzd2l0Y2hpbmcgdG8gNCBieXRlIGFkZHJlc3NlcyBhZnRlciBzZWVpbmcgYSBzZWNvbmQgc2VjdGlvbiB3aGljaAotCXJlcXVpcmVzIDMgYnl0ZSBhZGRyZXNzZXMuICBGcm9tIEpvZWwgU2NoYW50egotCTxqb2VsLnNjaGFudHpAYXJnb3N5cy5ib2VpbmcuY29tPi4KLQotCSogY29uZmlnLmJmZCAobTY4Ki0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBeW1lcmljIFZpbmNlbnQKLQk8YXltZXJpYy52aW5jZW50QGVtaS51LWJvcmRlYXV4LmZyPi4KLQotMTk5OC0xMi0wNCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRml4IGxvZ2ljIHRvCi0JZGVjaWRlIHdoZXRoZXIgdGhlIG91dHB1dCBmaWxlIGlzIC1tcmVsb2NhdGFibGUtbGliLAotCS1tcmVsb2NhdGFibGUsIG9yIG5laXRoZXIuICAoZ2RiLmJhc2Uvbm9kZWJ1Zy5leHApCi0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYzogQWRkIHN1cHBvcnQgZm9yIFJfRlIzMF80OCByZWxvYy4KLQkqIHJlbG9jLmM6IEFkZCBCRkRfUkVMT0NfRlIzMF80OCByZWxvY2F0aW9uLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUKLQotV2VkIERlYyAgMiAwMDo1ODozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFdhcm4gb24gYW4gYXR0ZW1wdCB0bwotCWxpbmsgYWdhaW5zdCBhIGR5bmFtaWMgc3ltYm9sIHdpdGggbm8gdHlwZSBvciBzaXplLgotCi0xOTk4LTEyLTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChpMzg2X2NoZWNrX3JlbG9jcykgW1JfMzg2XzMyXTogRG9uJ3QgZW1pdAotCXJlbG9jYXRpb24gZm9yIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgZ2V0IGxvYWRlZC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbikgW1JfMzg2XzMyXTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgIDEgMTE6MzM6MzMgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTWFrZSByZWxvY19zaXplLAotCXJlbG9jX2NvdW50IGFuZCBpIGxvbmcgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLiAgSGFuZGxlIGVycm9yCi0JcmV0dXJuIGZyb20gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQotMTk5OC0xMi0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGV0ZWN0IHRoZSBhYnNlbmNlIG9mCi0JYSBoYXNoIHRhYmxlLgotCi1Nb24gTm92IDMwIDE1OjI4OjA5IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZWxmMzItc2guYyAoZWxmL3NoLmgpOiBJbmNsdWRlLgotCXNoX3JlbG9jX3R5cGU6IERlbGV0ZS4gIENoYW5nZWQgYWxsIHJlZmVyZW5jZXMgdG8gZWxmX3NoX3JlbG9jX3R5cGUuCi0JKHNoX2VsZl9ob3d0b190YWIpOiBBZGQgSE9XVE8gZm9yIFJfU0hfU1dJVENIOC4KLQkoc2hfcmVsb2NfbWFwKTogTWFwIEJGRF9SRUxPQ184X1BDUkVMIHRvIFJfU0hfU1dJVENIOC4KLQkoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEhhbmRsZSBSX1NIX1NXSVRDSDguCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY3kgb2YgZWxmMzItc2gubG8gb24gJChJTkNESVIpL2VsZi9zaC5oLgotCi1GcmkgTm92IDI3IDE3OjUxOjM4IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZmxpbmsuaCAoY29tcHV0ZV9idWNrZXRfY291bnQpOiBEb24ndCBhbGxvdyBtaW5zaXplPT0wLCBpdAotCWNhdXNlcyBkaXZpc2lvbiBieSB6ZXJvIGxhdGVyIG9uLgotCi1UaHUgTm92IDI2IDExOjE5OjM1IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9wYzlfcmVsb2MsZnIzMF9lbGZfcGMxMl9yZWxvYyk6IE5vdAotCW5lZWRlZC4KLQotMTk5OC0xMS0yNSAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBSZW1vdmUgaGFjay4gIFVzZSBuZXcgZW11bGF0aW9uCi0JaG9vayBub3cuCi0KLVR1ZSBOb3YgMjQgMTA6MjU6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbAotCWZyMzBfZmluYWxfbGlua19yZWxvY2F0ZS4KLQkoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgSTIwIGFuZCBJMzIKLQlyZWxvY3MuCi0JKGZyMzBfZWxmX2kzMl9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIEkzMiByZWxvY3MuCi0JKGZyMzBfZWxmX3BjOV9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIDlfUENSRUwgcmVsb2NzLgotCShmcjMwX2VsZl9wYzEyX3JlbG9jKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgMTJfUENSRUwgcmVsb2NzLgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXNldCBoaTE2cyByZWxvYwotCWNoYWluIHRvIGVtcHR5LgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIGFyZSBiYXNlZCBvbiBhIHBhdGNoIHN1Ym1pdHRlZCBieSBHaWFubHVjYQotCU1vcm8gPGdsY3RyQGFiYy5pdD46Ci0KLQkodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogT25seSB1cGRhdGUgYSBoaTE2cyByZWxvYyBpZiBpdCBoYXMKLQlub3QgYWxyZWFkeSBiZWVuIHVwZGF0ZWQuCi0JKGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYyk6IE5ldyBwYXJhbWV0ZXIgJ2FscmVhZHlfZm91bmQnCi0JcmV0dXJucyBzdGF0ZSBvZiByZW1lbWJlcmVkIGhpMTZzIHJlbG9jLgotCShyZW1lbWJlcl9oaTE2c19yZWxvYyk6IFNldCAnZm91bmQnIGZpZWxkIHRvIGZhbHNlLgotCShoaTE2c19sb2NhdGlvbik6IEFkZCAnZm91bmQnIGZpZWxkLgotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGJmZF9wZV9kbGxfbm90X3JlY29nbml6ZWRfaGFjayk6IHRoZSBsaW5rZXIgd2FudHMKLQl0byBzZWUgLkRMTCBmaWxlcyBhcyB1bnJlY29nbml6ZWQuCi0JKGkzY29mZl9vYmplY3RfcCk6IFNvcnJ5LCBoYWQgdG8gaGFjayBpdCB0byBub3QgcmVjb2duaXplIHRoZXNlCi0JZmlsZXMgKHBlaS1pMzg2KSBvbiByZXF1ZXN0LgotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogb3BuY2xzLmMgKGJmZF9tYWtlX3JlYWRhYmxlKTogbmVlZCBtb3JlIGNsZWFudXAgZm9yIHN5bWJvbHMgYW5kCi0JcmVsZW50cy4gIENhbGwgYmZkX2NoZWNrX2Zvcm1hdCB0byByZWluaXRpYWxpemUuCi0KLUZyaSBOb3YgMjAgMTQ6MjE6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHNwdXJpb3VzCi0Jd2FybmluZ3MuCi0KLVRodSBOb3YgMTkgMTQ6NDI6MTUgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogcmVnZW5lcmF0ZQotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBOb3YgMTcgMjA6MjM6MzUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB2dGFibGVfZW50cmllc19zaXplLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogQ2xlYXIgaXQuCi0JKiBlbGZsaW5rLmggKGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCk6IENvcHkgaXQsIGFuZAotCXJlc3BlY3QgaXQgYXMgYW4gdXBwZXIgYm91bmQgb24gd2hhdCBtZW1vcnkgdG8gcmVmZXJlbmNlLgotCShlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzKTogTGlrZXdpc2UuCi0JKGVsZl9nY19yZWNvcmRfdnRlbnRyeSk6IEhhbmRsZSBhcy15ZXQgdW5kZWZpbmVkIHZ0YWJsZXMuICBTZXQgYW5kCi0JdXBkYXRlIHZ0YWJsZV9lbnRyaWVzX3NpemUgYXBwcm9wcmlhdGVseS4KLQotVHVlIE5vdiAxNyAxNToyODozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfcmVsb2NfdHlwZV9sb29rdXApOiBVc2VkIGludGVnZXJzIHRvIGhvbGQKLQlyZWxvYyBudW1iZXIuCi0KLU1vbiBOb3YgMTYgMjI6MTk6MjEgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0pOiBzdXBwb3J0IEJGRF9JTl9NRU1PUlkKLSAJYmZkczsgdGhleSBoYXZlIG5vICJmaWxlIiBzbyB3ZSBmYWtlIGl0LgotCSogYmZkLWluMi5oOiBhZGQgYmZkX21ha2Vfd3JpdGFibGUgYW5kIGJmZF9tYWtlX3JlYWRhYmxlIChyZWdlbikKLQkqIGxpYmJmZC5jIChiZmRfd3JpdGUpOiBBbGxvdyB3cml0aW5nIHRvIEJGRF9JTl9NRU1PUlkgYmZkcyBieQotIAlyZXNpemluZyB0aGUgbWVtb3J5IGJ1ZmZlci4KLQkqIG9wbmNscy5jIChiZmRfbWFrZV93cml0YWJsZSk6IE5ldyBmdW5jdGlvbjsgbGV0cyB5b3Ugd3JpdGUgYQotIAliZmRfY3JlYXRlJ2QgYmZkIHRvIGFuIGluLW1lbW9yeSBidWZmZXIuCi0JKGJmZF9tYWtlX3JlYWRhYmxlKTogTmV3IGZ1bmN0aW9uOyBsZXRzIHlvdSByZWFkIGJhY2sgdGhhdCBidWZmZXIKLSAJYXMgaWYgaXQgd2VyZSBmcm9tIGJmZF9vcGVuci4gIFVzZWQgdG8gYnVpbGQgZ2VuZXJhdGVkIGFyY2hpdmUKLSAJbWVtYmVycyAod2luc3VwJ3MgbGQncyBkbGx0b29sKQotCi1Nb24gTm92IDE2IDE5OjE1OjE5IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vYmZkLnBvdDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBOb3YgMTYgMTA6NTc6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIChoaTE2c19sb2NhdGlvbik6IFJlcGxhY2VkIGZpeGVkIHNpemUgYXJyYXkgd2l0aAotCWxpbmtlZCBsaXN0LgotCi1TdW4gTm92IDE1IDIwOjI4OjI1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBTZWFyY2ggZm9yIHRoZSBwcm9wZXIKLQllbGVtZW50IG9mIHRoZSBnb3RlbnRyeSBsaXN0IGZvciBsb2NhbCBzeW1ib2xzIHRvby4KLQkoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFVuaWZ5IGxvY2FsIGFuZCBnbG9iYWwgaGFuZGxpbmcuCi0JQXNzZXJ0IHRoYXQgZ290ZW50LT51c2VfY291bnQgPiAwLgotCi1TYXQgTm92IDE0IDE1OjE2OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh2bXNfYWxwaGFfdmVjKTogUmVuYW1lIGZyb20gZXZheF9hbHBoYV92ZWMsIGFuZAotCXVwZGF0ZSBmb3IgZmlsZSBuYW1lIGNoYW5nZXMgb2YgSnVseSAyLCAxOTk4LgotCSh2bXNfdmF4X3ZlYyk6IE5ldy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE5vdiAxMiAxOToxOTo1NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2JmZC5wb3Q6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDEwIDE2OjE3OjA2IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNCwgY29uZmlnLmJmZDogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVHVlIE5vdiAxMCAxNToxMzo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIGJmZF9hcmNoX2ZyMzAuCi0KLVR1ZSBOb3YgMTAgMTM6Mzc6MzYgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRSwKLSAJQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUik6IGRpZG4ndCBkZWZpbmUgbWFjcm8gd2hlbiB2YWx1ZQotIAl3YXMgY2FjaGVkLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiByZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAxMCAxNDozMTowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChyZWxvY190eXBlKTogIEFkZCBSX0QxMFZfR05VX1ZUSU5IRVJJVCBhbmQKLQlSX0QxMFZfR05VX1ZURU5UUlkgcmVsb2NzLgotCShlbGZfZDEwdl9ob3d0b190YWJsZSk6ICBMaWtld2lzZS4KLQkoZDEwdl9yZWxvY19tYXAgZDEwdl9yZWxvY19tYXApOiAgTGlrZXdpc2UuCi0JKGVsZjMyX2QxMHZfZ2NfbWFya19ob29rKTogIE5ldy4KLQkoZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rKTogIE5ldy4KLQkoZWxmMzJfZDEwdl9jaGVja19yZWxvY3MpOiAgTmV3LgotCShlbGYzMl9kMTB2X3JlbG9jYXRlX3NlY3Rpb24pOiAgTmV3LgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogIERlZmluZS4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogIERlZmluZS4KLQotU2F0IE5vdiAgNyAxODowNzo1MSAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGV0ZXIuc2NoYXVlckByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoQkZEMzJfQkFDS0VORFMpOiBNb3ZlIHZtcyBmaWxlcyBoZXJlLi4uCi0JKEJGRDY0X0JBQ0tFTkRTKTogLi4uZnJvbSBoZXJlLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBNb3ZlIHZtcyBmaWxlcyBoZXJlLi4uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IC4uLmZyb20gaGVyZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgTm92ICA0IDE1OjU4OjQ4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgRlIzMCB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogQWRkIEZSMzAgdGFyZ2V0LgotCSogYXJjaHVyZXMuYzogQWRkIHN1cHBvcnQgZm9yIEZSMzAuCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgRlIzMC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIEZSMzAuCi0JKiByZWxvYy5jOiBBZGQgc3VwcG9ydCBmb3IgRlIzMCByZWxvY2F0aW9ucy4KLQkqIHRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIEZSMzAgcmVsb2NhdGlvbnMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogIFJlZ2VuZXJhdGUuCi0JKiBjcHUtZnIzMC5jOiBOZXcgZmlsZS4KLQkqIGVsZjMyLWZyMzAuYzogTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDIgMTQ6NTk6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVN1biBOb3YgIDEgMTk6MzI6MjggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBEbyBub3QgdXNlIGFsbG9jYSwKLQl1c2UgYmZkX21hbGxvYyBhbmQgZnJlZSBpbnN0ZWFkIGFuZCBjaGVjayByZXR1cm4gdmFsdWUgZnJvbSBiZmRfbWFsbG9jLgotCi1TdW4gTm92ICAxIDE2OjIwOjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXMpOiBDb21tZW50IG91dC4KLQkoU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTKTogTGlrZXdpc2UuCi0JKE1JUFNfVEVYVF9EWU5TWU1fU0VDTik6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBEb24ndCBzZXQgc2hfaW5mbyBmaWVsZCBvZiBhIC5oYXNoCi0Jc2VjdGlvbi4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IFJlbW92ZSBkeW5zeW1fc2VjX3N0cmluZGV4Ci0JZmllbGQuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEb24ndCBpbml0aWFsaXplCi0JZHluc3ltX3NlY19zdHJpbmRleC4KLQkobWlwc19lbGZfZ2NfbWFya19ob29rKTogQWRkIGRlZmF1bHQgY2FzZSB0byBhdm9pZCB3YXJuaW5nLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBHZW5lcmF0ZSBhIHNlY3Rpb24gc3ltYm9sIGZvcgotCWV2ZXJ5IG91dHB1dCBzZWN0aW9uLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENvdW50IGFsbCBzZWN0aW9ucyBmb3IKLQlEVF9NSVBTX1VOUkVGRVhUTk8uCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogVXNlIGR5bmFtaWMgc3ltYm9scyBmb3IgYWxsCi0Jb3V0cHV0IHNlY3Rpb25zLgotCi1TdW4gTm92ICAxIDEyOjQ2OjUzIDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEFsbG9jYXRlIHR3byBzbG90cwotCWZvciBsYXRlciBQTFQgZW50cmllcyBpbiBsYXJnZSBQTFRzLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEFsbG93IGZvciB0aGUgZXh0cmEgc2xvdHMuCi0KLVNhdCBPY3QgMzEgMjA6MTA6MDkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvYWRfc2VjdGlvbik6IEZpeCB0eXBvLgotCi0xOTk4LTEwLTI2IDE1OjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGQgZWxmX2hhc2hfdmFsdWUuCi0JKiBlbGZsaW5rLmggKGVsZl9jb2xsZWN0X2hhc2hfY29kZXMpOiBOZXcgZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzCi0JY2FsbGVkIGZvciBlYWNoIGV4cG9ydGVkIHN5bWJvbCBhbmQgd2UgY29tcHV0ZSB0aGUgRUxGIGhhc2ggdmFsdWUgZm9yCi0JaXQuCi0JKGNvbXB1dGVfYnVja2V0X3ZhbHVlKTogTmV3IGZ1bmN0aW9uLiAgSXQgaXMgY2FsbGVkIGZyb20KLQlzaXplX2R5bmFtaWNfc2VjdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBoYXNoIHRhYmxlIHNpemUuICBXaGVuIHdlIGFyZQotCW9wdGltaXppbmcgYSBiZXR0ZXIsIGJ1dCBzbG93ZXIsIGFsZ29yaXRobSBpcyB1c2VkLgotCShzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIGNvbXB1dGVfYnVja2V0X3ZhbHVlLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9oYXNoKTogT3B0aW1pemUgdGhlIGhhc2ggZnVuY3Rpb24gYSBiaXQuCi0KLU1vbiBPY3QgMTkgMjA6MDM6MjEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNoLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9TSF9HTlVfVlRJTkhFUklUIGFuZAotCVJfU0hfR05VX1ZURU5UUlkuCi0JKHNoX2VsZl9nY19tYXJrX2hvb2spOiAgTmV3LgotCShzaF9lbGZfZ2Nfc3dlZXBfaG9vayk6ICBOZXcuCi0JKHNoX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotCi1Nb24gT2N0IDE5IDE2OjU3OjA1IDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00OiB1bmRvIHByZXZpb3VzIGdldHRleHQgY2hhbmdlCi0JKiBhY2xvY2FsLm00OiByZWJ1aWxkIHdpdGggcmlnaHQgdmVyc2lvbiBvZiBhY2xvY2FsLgotCi1Nb24gT2N0IDE5IDAxOjQ3OjIxIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00LCBhY2xvY2FsLm00OiBtb3ZlIGdldHRleHQtcmVsYXRlZCBmcmFnbWVudHMgZnJvbQotIAlhY2xvY2FsLm00IHRvIGFjaW5jbHVkZS5tNCwgc28gdGhleSBkb24ndCBnZXQgbG9zdC4KLQotCSogZWxmY29yZS5oOiByZXdyaXRlIGZvciBiZXR0ZXIgY29yZWZpbGUgc3VwcG9ydC4KLQkqIGVsZi5jIChlbGZjb3JlXyopOiBuZXcgZnVuY3Rpb25zLgotCSogZWxmLWJmZC5oIChlbGZfb2JqX3RkYXRhKTogbmV3IHN0cnVjdHVyZSBtZW1iZXJzLgotCSogYWNjb25maWcuaCwgYWNpbmNsdWRlLm00LCBjb25maWd1cmUuaW46IGFkZCBmZWF0dXJlLXRlc3RzIGZvcgotIAlmbGF2b3Igb2YgcHJvY2ZzLgotCSogYWNsb2NhbC5tNCwgY29uZmlnLmluLCBjb25maWd1cmUsIE1ha2VmaWxlLmluOiByZWdlbmVyYXRlZC4KLQotRnJpIE9jdCAxNiAxNDowNzo0NSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jOiAgQWRkIEhPV1RPIGVudHJpZXMgZm9yIFJfTTMyUl9HTlVfVlRJTkhFUklUCi0JYW5kIFJfTTMyUl9HTlVfVlRFTlRSWS4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogIERlZmluZS4KLQkobTMycl9lbGZfY2hlY2tfcmVsb2NzKTogIE5ldy4KLQkobTMycl9lbGZfZ2NfbWFya19ob29rKTogIE5ldy4KLQkobTMycl9lbGZfZ2Nfc3dlZXBfaG9vayk6ICBOZXcuCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgSGFuZGxlIFZUIHJlbG9jcy4KLQotTW9uIE9jdCAxMiAxNDoxODo0MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhcm1fcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSByZWR1bmRhbnQgdGVzdC4KLQotCSogYmZkLWluMi5oIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogSW1wcm92ZSBjb21tZW50IHRvIG1ha2UKLQljbGVhdCB0aGF0IHRoZSAnYml0c2l6ZScgZmllbGQgaXMgdGhlIHNpemUgb2YgdGhlIGJpdGZpZWxkIEFGVEVSCi0JcmVsb2NhdGlvbiBub3QgYmVmb3JlLgotCi0JKiBlbGYzMi1tMzJyLmMgKFJfTTMyUl8xOF9QQ1JFTCk6IEZpeCBzaXplIG9mIGJpdGZpZWxkLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9oaSk6IENvcGUgd2l0aCBtaXNzaW5nIHJlZmhpIG9yIHJlZmxvCi0JcmVsb2NzLgotCi1UdWUgT2N0ICA2IDA5OjIwOjQ0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jOiAgQWRkIEhPV1RPIGVudHJpZXMgZm9yIFJfU1BBUkNfR05VX1ZUSU5IRVJJVCBhbmQKLQlSX1NQQVJDX0dOVV9WVEVOVFJZLgotCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiAgSGFuZGxlIHRoZW0uCi0JKGVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwKTogIExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogIExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19nY19tYXJrX2hvb2spOiAgTmV3LgotCShlbGYzMl9zcGFyY19nY19zd2VlcF9ob29rKTogIE5ldy4KLQotTW9uIE9jdCAgNSAxNDo1NTozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fZmluaXNoX3dyaXRpbmcpOiBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcyB3aGVuCi0Jd3JpdGluZyBhbiBleGVjdXRhYmxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCi1Nb24gT2N0ICA1IDEyOjAyOjMxIDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjEuYyA6IE5ldyBmaWxlLiAgQWRkcyBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZS4KLQkqIGNvbmZpZ3VyZS5pbiAoZWxmKTogQWRkIGR3YXJmMS5sby4KLQkqIGVsZl9iZmQuaCAoZWxmX29iX3RkYXRhKTogQWRkIGR3YXJmMV9maW5kX2xpbmVfaW5mby4KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEFkZCBjYWxsIHRvCi0JX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOgotCUFkZCBjYWxsIHRvIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gT2N0ICA1IDEwOjA2OjIyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9nY19zZWN0aW9ucyk6ICBEbyBub3QgYWxsb3cgZ2FyYmFnZQotCWNvbGxlY3Rpb24gaWYgZHluYW1pYyBzZWN0aW9ucyBoYXZlIGJlZW4gY3JlYXRlZC4KLQotTW9uIE9jdCAgNSAwOTowNzozNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jOiBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9WODUwX0dOVV9WVElOSEVSSVQgYW5kCi0JUl9WODUwX0dOVV9WVEVOVFJZLgotCSh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiAgSGFuZGxlIFZUSU5IRVJJVCBhbmQgVlRFTlRSWSByZWxvY3MuCi0JKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBMaWtld2lzZS4KLQkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBMaWtld2lzZS4KLQkodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBMaWtld2lzZS4KLQkodjg1MF9lbGZfZ2Nfc3dlZXBfaG9vayk6ICBOZXcgcm91dGluZS4KLQkodjg1MF9lbGZfZ2NfbWFya19ob29rKTogIE5ldyByb3V0aW5lLgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotCi1Nb24gT2N0ICA1IDA5OjA0OjI1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiAgRG9uJ3QgYXNzdW1lCi0JdGhhdCBkeW5vYmogZXhpc3RzLgotCi1TdW4gT2N0ICA0IDIzOjI5OjM0IDE5OTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6Ci0JRGVjbGFyZSBzaXplIGFzIGJmZF9zaXplX3R5cGUuCi0JKHJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWNsYXJlIGNvdW50IGFzIGJmZF9zaXplX3R5cGUuCi0KLVN1biBPY3QgIDQgMjA6Mzg6MjkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjcHUtaHBwYS5jIChiZmRfaHBwYTIwX2FyY2gpOiBEZWZpbmUuICBMaW5rIGl0IGludG8gdGhlIGJmZF9ocHBhX2FyY2gKLQlzdHJ1Y3R1cmUuCi0JKiBzb20uYyAoQ1BVX1BBX1JJU0MyXzApOiBEZWZpbmUuCi0JKF9QQV9SSVNDMl8wX0lEKTogTGlrZXdpc2UuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IFVzZSBDUFVfUEFfUklTQzJfMCBmb3IgdGhlIHN5c3RlbV9pZCBhcyBuZWVkZWQuCi0KLVN1biBPY3QgIDQgMjE6MTk6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdoZW4gYSB2ZXJzaW9uZWQgc3ltYm9sCi0JaGFzIGEgYmFzZSB3aGljaCBpcyBhbHJlYWR5IGRlZmluZWQsIG9ubHkgYWRkIHRoZSByZWZlcmVuY2VkCi0Jc3ltYm9sIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZiBpdCBpcyBkZWZpbmVkIG9yIHJlZmVyZW5jZWQKLQlieSBhIHJlZ3VsYXIgZmlsZS4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCk6IEhhbmRsZSB2dGFibGUgcmVsb2NzCi0JY29ycmVjdGx5LgotCi0xOTk4LTA5LTI3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVbmRvIGxhc3QgY2hhbmdlLgotCi1XZWQgU2VwIDIzIDE2OjA5OjMxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgcmVjb3JkIGEgZHluYW1pYwotCXN5bWJvbCBmb3IgdGhlIGluZGlyZWN0IGFsaWFzIHRvIGEgdmVyc2lvbmVkIHN5bWJvbC4KLQotTW9uIFNlcCAyMSAxMjoxNToyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0byk6IE5ldy4KLQkoZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvKTogTmV3LgotCShlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6ICBSZXR1cm4gZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvCi0Jb3IgZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG8gIG9uIGxvb2t1cC4KLQotU3VuIFNlcCAyMCAwMDo0ODowNyAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jOiBJbmNsdWRlICJlbGYvbTY4ay5oIi4gIFJlbW92ZSBkZWZpbml0aW9uIG9mIGVudW0KLQlyZWxvY190eXBlLiAgUmVuYW1lIFJfNjhLX19tYXggdG8gUl82OEtfbWF4LgotCShob3d0b190YWJsZSk6IFVzZSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuIGZvciBhIFZURU5UUlkKLQlyZWxvYy4KLQotU3VuIFNlcCAyMCAwMDowOToyNSAxOTk4ICBDaHJpcyBUb3JlayAgPHRvcmVrQGJzZGkuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldGIzMik6IFJld3JpdGUgZXhwcmVzc2lvbiB0byBnZXQgYmV0dGVyIGNvZGUuCi0JKGJmZF9nZXRsMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX2dldGxfc2lnbmVkXzMyKTogTGlrZXdpc2UuCi0KLQkqIGxpYmJmZC5jIChiZmRfbG9nMik6IENhc3QgdG8gYmZkX3ZtYSBiZWZvcmUgc2hpZnRpbmcsIG5vdAotCWFmdGVyLgotCi1TYXQgU2VwIDE5IDIyOjQyOjIzIDE5OTggIERvdWcgUmFic29uICA8ZGZyQG5sc3lzdGVtcy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRW5zdXJlIHRoYXQgdGhlIHdhcm5pbmcKLQltZXNzYWdlIGhhcyBhIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLgotCi1GcmkgU2VwIDE4IDE0OjM1OjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogSWdub3JlIGNvbnRlbnRzIG9mCi0Jd29yZCBzdWJqZWN0IHRvIFJfVjg1MF8zMiByZWxvY2F0aW9uLgotCi1UaHUgU2VwIDE3IDE3OjIwOjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5jOiBBZGQgY29tbWVudCBkZXNjcmliaW5nIHByb2JsZW0gY29tcHV0aW5nIGxpbmUgbnVtYmVycwotCWZvciB1bmRlZmluZWQgc3ltYm9scyBhdCBsaW5rIHRpbWUuCi0KLVRodSBTZXAgMTcgMTY6MDM6MjggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QKLQl0cmFuc2Zvcm0gYSBkZWZ3ZWFrIGludG8gYSBwbHQgZW50cnkuCi0JKGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzKTogQWxsb3cgcm9vbSBmb3Igc2Vjb25kYXJ5Ci0JcGx0IGVudHJ5IHJlZmVyZW5jZXMgdG8gcmVjZWl2ZSBhIFJFTEFUSVZFIHJlbG9jLgotCShlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaWxsIHRoZW0gaW4uCi0JKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBBc3NlcnQgd2UgZG9uJ3Qgb3ZlcnJ1bgotCXRoZSBhbGxvY2F0ZWQgcmVsb2NhdGlvbiBzcGFjZS4KLQotV2VkIFNlcCAxNiAxODowMzoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IEFsd2F5cyB0cmVhdCBzZWN0aW9uIHN5bWJvbHMgYXMKLQlzcGVjaWFsLCBldmVuIGlmIHRoZXkgYXJlIGF0dGFjaGVkIHRvIGEgY29tbW9uIHNlY3Rpb24uCi0KLVdlZCBTZXAgMTYgMTA6MzQ6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IE1vdmUgc3ltYm9scyBpbgotCXNlY3Rpb25zIHdpdGggdjg1MCBjb21tb24gc2VjdGlvbiBhdHRyaWJ1dGVzIGludG8gbmFtZWQgdjg1MAotCWNvbW1vbiBzZWN0aW9ucy4KLQkodjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rKTogTW92ZSBzeW1ib2xzIGluIHNlY3Rpb25zIHdpdGggdjg1MAotCWNvbW1vbiBzZWN0aW9uIGF0dHJpYnV0ZXMgaW50byBuYW1lZCB2ODUwIGNvbW1vbiBzZWN0aW9ucy4KLQotV2VkIFNlcCAxNiAxMToyNjo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZ2NfbWFya19ob29rKTogIFJlbW92ZSBwcmludAotCXN0YXRlbWVudC4KLQotMTk5OC0wOS0xNSAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJldmVyc2Ugb3V0cHV0X29mZnNldAotCXBhcnQgb2YgVmxhZGltaXIncyBjaGFuZ2Ugb2YgMTk5OC0wOC0xOS4gIE1ha2UgYSBSX1BQQ19TREFSRUwxNgotCXJlbG9jIHRvIHRoZSB3cm9uZyBzZWN0aW9uIGEgd2FybmluZywgbm90IGFuIGVycm9yLiAgLmR5bnNic3MKLQlpcyBub3QgYW4gb3V0cHV0IHNlY3Rpb24sIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGl0LgotCi1UdWUgU2VwIDE1IDEyOjQwOjA1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYtYmZkLmg6ICBBZGQgYXJndW1lbnQgdG8gZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotCi1UdWUgU2VwIDE1IDA4OjM0OjQwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6ICBQYXNzIHR5cGUgdG8gZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotICAgICAgICogZWxmMzItYXJtLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9BUk1fR05VX1ZUSU5IRVJJVCBhbmQKLSAgICAgICBSX0FSTV9HTlVfVlRFTlRSWS4KLSAgICAgICAoZWxmMzJfYXJtX2djX21hcmtfaG9vayk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2djX3N3ZWVwX2hvb2spOiBOZXcuCi0gICAgICAgKGVsZjMyX2FybV9jaGVja19yZWxvY3MpOiBOZXcuCi0gICAgICAgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIEhhbmRsZSBWVElOSEVSSVQgYW5kIFZURU5UUlkKLSAgICAgICByZWxvY2F0aW9ucy4KLSAgICAgICAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgVlRJTkhFUklUIGFuZCBWVEVOVFJZCi0gICAgICAgcmVsb2NhdGlvbnMuCi0KLTE5OTgtMDktMTAgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBkeW5vYmogaXMgTlVMTCwKLQlhc3N1bWUgdGhlcmUgaXMgbm8gUExUIG9yIEdPVC4KLQotV2VkIFNlcCAgOSAxNDoyNDoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lKTogTmV3IGZ1bmN0aW9uOiAganVzdAotCWxpa2UgX2VsZl9iZmRfZmluZF9uZWFyZXN0X2xpbmUoKSBleGNlcHQgdGhhdCBTVFRfQVJNX1RGVU5DIGlzCi0JYWxzbyBhY2NlcHRlZCBhcyBhIGZ1bmN0aW9uIHN5bWJvbCB0eXBlLgotCi1Nb24gU2VwICA3IDEzOjI0OjAzIDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KLQotCSogcnM2MDAwLWNvcmUuYyAoX0xPTkdfTE9ORyk6ICBEZWZpbmUgZm9yIEFJWCA0Lnggb25seS4KLQotU2F0IFNlcCAgNSAyMDo0MDoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMpOiBDb3JyZWN0IGRlZmluaXRpb24gdG8KLQltYXRjaCBkZWZpbml0aW9uIG9mIF9iZmRfZ2Nfc2VjdGlvbnMgZmllbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotRnJpIFNlcCAgNCAxMzo1NDoyMyAxOTk4ICBEYXZpZCBNaWxsZXIgIDxkYXZlbUBkbS5jb2JhbHRtaWNyby5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBQcm9wZXJseSBhZGp1c3QKLQl0aGUgYWRkZW5kIG9mIGEgZHluYW1pYyByZWxvY2F0aW9uIHJlZmVyZW5jaW5nIGEgc2VjdGlvbi4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRml4IHRoZSBQTFQgcmVsb2NhdGlvbiBvZmZzZXQuCi0KLVRodSBTZXAgIDMgMTc6Mjg6NTAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChiZmRfZWxmTk5fc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVmVyaWZ5IHRoYXQgdGhlCi0JYmVkIGhhcyBhIHNpemVfZHluYW1pY19zZWN0aW9ucyByb3V0aW5lIGJlZm9yZSB0cnlpbmcgdG8gdXNlIGl0LgotCi1Nb24gQXVnIDMxIDE0OjQ5OjIyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfZ251X3Z0ZW50cnlfaG93dG8pOiBVc2UKLQlfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLgotCi1Nb24gQXVnIDMxIDEwOjIzOjQwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogIEFkZCBlbGYzMi1hcm0uYy4KLQkqIE1ha2VmaWxlLmluOiAgUmVidWlsZC4KLQkqIGVsZi1iZmQuaDogIEFkZCBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6ICBJZiBkZWZpbmVkLCBjYWxsCi0JZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotCSogZWxmMzItYXJtLmM6IERlZmluZSBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0JKGVsZjMyX2FybV9nZXRfc3ltYm9sLXR5cGUpOiAgTmV3IHJvdXRpbmUuCi0JKHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6ICBDaGFuZ2UgdG8gdXNlIFNUVF9BUk1fVEZVTkMuCi0JKGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6ICBDaGFuZ2UgdG8KLQljaGVjayBmb3IgU1RUX0FSTV9URlVOQy4KLQkoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgTGlrZXdpc2UuCi0JKiBlbGZ4eC10YXJnZXQuaDogIEFkZCBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0KLUZyaSBBdWcgMjggMTk6NDQ6MDcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfYWxwaGFfZXZbNDU2XSk6IE5ldy4KLQkqIGNwdS1hbHBoYS5jOiBSZXdvcmsgdG8gbWF0Y2ggdGhlc2UgdHlwZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLUZyaSBBdWcgMjggMTk6Mzg6NTMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuKTogRGVjbGFyZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuKTogTmV3LgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IEFkZCB2dGFibGUgcmVsb2NzLgotCShlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IFJlY29nbml6ZSB0aGVtLgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBQYXNzIHRoZW0gb2ZmIHRvIGdlbmVyaWMgY29kZS4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IElnbm9yZSB0aGVtLgotCShlbGZfaTM4Nl9nY19tYXJrX2hvb2ssIGVsZl9pMzg2X2djX3N3ZWVwX2hvb2spOiBOZXcuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IFRydWUuCi0KLVRodSBBdWcgMjAgMTU6MDM6NDUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmMgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViKTogQ2hlY2sgc3ltX3NlYyBpcyBub3QgTlVMTAotCWJlZm9yZSBsb29raW5nIGF0IG93bmVyIGZpZWxkLgotCShlbGYzMl9hcm1fdG9fdGh1bWJfc3R1Yik6IERpdHRvLgotCShlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IENvbXB1dGUgbmFtZSBiZWZvcmUgY2FsbGluZwotCWVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKCkuCi0KLVRodSBBdWcgMjAgMTE6MzA6MTcgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KLQotCSogZWxmLmM6IGNvbW1lbnQgYW5kIGZvcm1hdHRpbmcgY2xlYW51cHMuCi0JKiBlbGZjb3JlLmg6IGRpdHRvLgotCi1XZWQgQXVnIDE5IDE1OjQzOjI2IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmVqZWN0IGZpbGVzIG9mIGhlYWRlciB0eXBlIEVUX0NPUkUKLQkoY29yZSBmaWxlcyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseSB0aGFuIG9iamVjdCBmaWxlcykuCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAotCWJmZF9lbGZfbWtjb3JlZmlsZSk6IGRlY2xhcmUuCi0JKiBlbGZ4eC10YXJnZXQuaCAoX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMsCi0JYmZkX2VsZl9ta2NvcmVmaWxlKTogYWRkIHRvIGJmZF90YXJnZXQgdmVjdG9yLgotCSogZWxmY29yZS5oIChlbGZfY29yZV9maWxlX3ApOiBzYXZlIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZSwKLQlhbmQgc2V0IHRoZSBiZmQgYXJjaGl0ZWN0dXJlIGZyb20gdGhlIGVsZiBmaWxlIGhlYWRlci4KLQkqIGVsZi5jIChiZmRfZWxmX21rY29yZWZpbGUpOiBuZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzKTogbmV3IGZ1bmN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogYWRkIGNhc2VzIGZvciBoYW5kbGluZwotCVBUX05PVEUgc2VnbWVudHMuICAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOgotCWNvcmUgZmlsZXMgc2hvdWxkIGJlIGhhbmRsZWQgdGhlIHNhbWUgYXMgZXhlYyBmaWxlcy4KLQkocHJlcF9oZWFkZXJzKTogaWRlbnRpZnkgY29yZSBmaWxlcyBhcyB0eXBlIEVUX0NPUkUuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IGlkZW50aWZ5IHRoZSBzZWN0aW9ucyBiZWxvbmdpbmcgdG8KLQl0aGUgUFRfTk9URSBzZWdtZW50LgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKLQlhZGQgYnJlYWsgc3RhdGVtZW50IHRvIGRlZmF1bHQgY2FzZS4KLQotMTk5OC0wOC0xOSAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayB0aGF0IG91dHB1dAotCXNlY3Rpb24gKG5vdCBpbnB1dCkgd2lsbCBiZSBpbiBzZWN0aW9ucyAiLnNic3MiLCAiLnNic3MyIiwKLQkiLnNkYXRhIiwgYW5kICIuc2RhdGEiIGZvciBSX1BQQ19TREFSRUwxNiwgUl9QUENfRU1CX1NEQTJSRUwsCi0JUl9QUENfRU1CX1NEQTIxLCBSX1BQQ19FTUJfUkVMU0RBLiAgSW4gYWxsIHRoZXNlIGNhc2VzIGFsc28gaWdub3JlCi0Jb3V0cHV0X29mZnNldCBmb3IgY29ycmVjdCBldmFsdWF0aW9uIG9mIGFkZGVuZC4KLQotVHVlIEF1ZyAxOCAxMTo0ODoxMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmM6IEFkZCBwcmVmaXggYmZkXyB0byBlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLAotCWVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgYW5kCi0JZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24uCi0KLVR1ZSBBdWcgMTggMTE6NDY6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmg6IEFtbWVuZCBwcm90b3R5cGUgZm9yCi0JZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gdG8gcmVtb3ZlIHN1cnBsdXMgdGhpcmQKLQlhcmd1bWVudC4KLQotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi1TYXQgQXVnIDE1IDIwOjU1OjA4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBIYW5kbGUgaW5kaXJlY3Qgc3ltYm9scy4KLQotRnJpIEF1ZyAxNCAwOToxMjoyOCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogVXNlIHRoZSByZWxvY2F0aW9uIGFscmVhZHkKLQljYWxjdWxhdGVkIGZvciBSRUxPQ19TUEFSQ19SRVYzMiBjYXNlLgotCi1UaHUgQXVnIDEzIDE0OjAyOjAyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBiZmQtaW4uaDogIEFkZCBwcm90b3R5cGVzIGZvciBlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLAotICAgICAgIGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgYW5kCi0gICAgICAgZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24uCi0gICAgICAgKiBiZmQtaW4yLmg6ICBSZWdlbmVyYXRlZC4KLSAgICAgICAqIGVsZjMyLWFybS5jIERlZmluZSBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlLgotICAgICAgIChpbnNlcnRfdGh1bWJfYnJhbmNoKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGZpbmRfdGh1bWJfZ2x1ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChmaW5kX2FybV9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKHJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChyZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUpOiBOZXcgcm91dGluZS4KLSAgICAgICAoZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgcm91dGluZS4KLSAgICAgICAoZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zKSBOZXcgcm91dGluZS4KLSAgICAgICAoZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pIE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl90aHVtYl90b19hcm1fc3R1Yik6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fdG9fdGh1bWJfc3R1Yik6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRml4IHR5cG8uCi0gICAgICAgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIEFkZCBhcmd1bWVudCBzeW1fc2VjLgotICAgICAgIENoZWNrIGZvciBicmFuY2hlcyB0byB0aHVtYiBzeW1ib2xzIGluIGNhc2UgUl9BUk1fUEMyNC4KLSAgICAgICBDaGVjayBmb3IgYnJhbmNoZXMgdG8gYXJtIHN5bWJvbHMgaW4gY2FzZSBSX0FSTV9USE1fUEMyMi4KLSAgICAgICAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgUGFzcyBzeW1ib2wgc2VjdGlvbiB0bwotICAgICAgIGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlLgotCi1XZWQgQXVnIDEyIDE5OjAwOjM5IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIFBMVAotCWVudHJpZXMgdW5sZXNzIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGUgZXhlY3V0YWJsZTsgaW4KLQlwYXJ0aWN1bGFyLCB1bmRlZmluZWQgd2VhayBzeW1ib2xzIGdldCBhIFBMVCBlbnRyeS4KLQotV2VkIEF1ZyAxMiAxNDo0ODozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaDogUmVtb3ZlIG5lc3RlZCBjb21tZW50IHRvIGF2b2lkIHdhcm5pbmcuCi0KLVdlZCBBdWcgMTIgMDg6MTA6MTEgMTk5OCBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIFJld29yawotICAgICAgIFJfQVJNX1BDMjQgcmVsb2NhdGlvbi4KLQotVHVlIEF1ZyAxMSAxNDo0MjoyNiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIFJlbW92ZSB1bnVzZWQKLSAgICAgICBhcmd1bWVudCBpc19sb2NhbC4gIEFkZCBhcmd1bWVudCBzeW1fZmxhZ3MuICBDaGVjayBzeW1fZmxhZ3MKLSAgICAgICBpbiBSX0FSTV9BQlMzMiBjYXNlLiAgSW5jbHVkZSBhZGRlbmQgZm9yIFJfQVJNX1RITV9QQzIyIGNhc2UuCi0gICAgICAgKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIERvbid0IHBhc3MgbG9jYWwgc3ltIGFuZCBwYXNzCi0gICAgICAgc3ltX2ZsYWdzIHRvIGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlLgotCi1Nb24gQXVnIDEwIDIwOjM4OjM5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzKTogQ29ycmVjdCBsYXN0IGNoYW5nZQotCXRvIG5vdCBjb3VudCB0b28gZmV3IHJlbG9jcyBmb3IgZHluYW1pY2x5IGxpbmtlZCBleGVjdXRhYmxlcy4KLQotTW9uIEF1ZyAxMCAxNTozNTozNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IE5ldmVyIGNvbnNpZGVyCi0Jc3ltYm9scyB3aXRob3V0IGEgZHluYW1pYyBpbmRleCBkeW5hbWljLiAgQ29uc2lkZXIgYWxsIHdlYWsKLQlzeW1ib2xzIGR5bmFtaWMuCi0JKGVsZjY0X2FscGhhX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBEb24ndCBhc3N1bWUgMS0xCi0JY29ycmVzcG9uZGFuY2UgYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IHNlY3Rpb25zLgotCi1Nb24gQXVnIDEwIDE1OjMxOjM5IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpOiBGb3IgYmFja2VuZHMKLQl0aGF0IHVzZSBhIC5nb3QucGx0IHNlY3Rpb24gc3RhcnQgdGhlIGdvdCBvZmZzZXQgYXQgemVyby4KLQotTW9uIEF1ZyAxMCAxNzozMToyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9wcm9jZXNzb3IpOiBDb3JyZWN0IHRoZSBwcm9jZXNzb3IgSUQgd3JpdHRlbgotCW91dCBmb3IgYmZkX2FyY2hfbTY4aywgYWNjb21tb2RhdGluZyBjaGFuZ2Ugb2YgTWFyY2ggMjUuCi0KLVN1biBBdWcgIDkgMjA6NTU6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBSZXdvcmsKLQlSX0FSTV9USE1fUlBDMjIgcmVsb2NhdGlvbnMuCi0KLVNhdCBBdWcgIDggMTU6MTU6MzAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3ApOiBVbmRlZiB3ZWFrIHN5bWJvbHMKLQlhcmUgYWx3YXlzIGR5bmFtaWMuCi0JKGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzKTogQWxsb3cgZW5vdWdoIHJvb20gZm9yIFJFTEFUSVZFCi0JLmdvdCByZWxvY3MgaW4gLUJzeW1ib2xpYyBzaGFyZWQgb2JqZWN0cy4KLQotV2VkIEF1ZyAgNSAxNTo0ODowOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uYzogQWRkIHByaXZhdGUgZmxhZ3MgdG8gRUxGIGhlYWRlci4KLQkoZWxmMzJfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgRnVuY3Rpb24uCi0JKGVsZjMyX2FybV9zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldyBGdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2NvcHlfcHJpdmF0ZV9mbGFncyk6IE5ldyBGdW5jdGlvbi4KLQkoZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgRnVuY3Rpb24uCi0KLU1vbiBBdWcgIDMgMTc6MTA6MTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBQZXJtaXQgV1BMVDMwIGFnYWluc3QKLQlhIGxvY2FsIHN5bWJvbC4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1TdW4gQXVnICAyIDAzOjE5OjIzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEluaXQgc2dvdCB0byBOVUxMLiAgQ3JlYXRlIHRoZQotCS5nb3QgaWYgYW55IHJlbG9jYXRpb24gcmVmZXJycyB0byBfR0xPQkFMX09GRlNFVF9UQUJMRV8uCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFB1bGwgc2dvdCBhbmQgc3BsdCBzZWFyY2ggdG8gdGhlIHN0YXJ0Ci0Jb2YgdGhlIGZ1bmN0aW9uLiAgUmVjb2duaXplIG5vIC5wbHQgYXMgc3RhdGljIGxpbmtpbmcuCi0KLTE5OTgtMDgtMDEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCBwYXNzCi0JIi5saWJsaXN0IiBzdHJpbmcgdGhyb3VnaCBnZXR0ZXh0LgotCi1GcmkgSnVsIDMxIDE2OjM4OjE0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIGVsZjMyLWFybS5sby4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlnLmJmZCAoYXJtLSotZWxmKTogIERlZmluZSB0YXJnX2RlZnZlYyBhbmQgdGFyZ19zZWx2ZWNzLgotCSh0aHVtYi0qLWVsZik6IERlZmluZSB0YXJnX2RlZnZlYyBhbmQgdGFyZ19zZWx2ZWNzLgotCSogY29uZmlndXJlLmluOiAgSGFuZGxlIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjIGFuZCBiZmRfZWxmMzJfYmlnYXJtX3ZlYy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGVsZi5jOiAocHJlcF9oZWFkZXJzKTogIFN1cHBvcnQgYXJjaF90eXBlIG9mIEVNX0FSTS4KLQkqIHRhcmdldHMuYzogIFN1cHBvcnQgbmV3IHRhcmdldHMgYmZkX2VsZjMyX2JpZ2FybV92ZWMgYW5kCi0JYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYy4KLQkqIGVsZjMyLWFybS5jOiAgTmV3IGZpbGUuCi0KLVR1ZSBKdW4gMjggMTk6MDU6MjggMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoTV9TUEFSQ0xJVEVfTEUpOiBOZXcgbWFjaGluZS4KLQkqIHN1bm9zLmMgKE1BQ0hUWVBFX09LKTogQWRkIG1hY2hpbmUgTV9TUEFSQ0xJVEVfTEUuCi0JKiBhb3V0ZjEuaCAoc3Vub3Nfc2V0X2FyY2hfbWFjaCk6IEFkZCBtYWNoaW5lIE1fU1BBUkNMSVRFX0xFLgotCShzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMpOiBBZGQgbWFjaGluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUKLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IEFkZCByZWxvY2F0aW9uIFJfU1BBUkNfUkVWMzIuCi0JKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKSBBZGQgbWFjaGluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUKLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogQWRkIFJFTE9DX1NQQVJDX1JFVjMyIHN1cHBvcnQuCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSwgc3BhcmNfcmVsb2NfbWFwLAotCWVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgUl9TUEFSQ18zMkxFIHRvIGJlIFJfU1BBUkNfUkVWMzIKLQkqIGxpYmJmZC5oIChiZmRfcmVsb2NfY29kZV9yZWFsX25hbWVzKTogUmVuYW1lIEJGRF9SRUxPQ19TUEFSQ18zMkxFIHRvCi0JYmUgQkZEX1JFTE9DX1NQQVJDX1JFVjMyLgotCSogcmVsb2MuYzogRGl0dG8uCi0JKiBjb25maWcuYmZkIChzcGFyYzg2eC0qLWFvdXQpOiBOZXcKLQotRnJpIEp1bCAyNCAxMzo1NDoxOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBBbGxvY2F0ZSBOVUxMIHN5bWJvbCBiZWZvcmUKLQlhY3R1YWxseSBtYXBwaW5nIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0KLUZyaSBKdWwgMjQgMTE6MjQ6MjkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfaG93dG8pOiBBZGQgUl9NTjEwMzAwXzI0IGVudHJ5LgotCShtbjEwMzAwX2VsZl9yZWxvY19tYXApOiBTaW1pbGFybHkuCi0JKG1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgUl9NTjEwMzAwXzI0LgotCi1GcmkgSnVsIDI0IDEyOjM2OjA0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCByZWxvYyB0eXBlcyB1c2VkIG9uCi0JSXJpeCA2LgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIGRlZmF1bHQgY2FzZS4KLQkqIGVsZjY0LW1pcHMuYzogUmVwbGFjZSBhbGwgdXNlcyBvZiBtaXBzX2VsZjY0X3JlbG9jX3R5cGUgd2l0aAotCWVsZl9taXBzX3JlbG9jX3R5cGUgZGVmaW5lZCBpbiBlbGYvbWlwcy5oLgotCi0xOTk4LTA3LTI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jOiBSZW1vdmUgcmVsb2NfdHlwZSBkZWZpbml0aW9uIGNvbXBsZXRlbHkuICBJdCdzIG5vdwotCWluIGVsZi9taXBzLmguCi0KLVRodSBKdWwgMjMgMTM6MzM6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3JlbG9jX3R5cGUpOiAjaWYgMCBvdXQgbW9yZSByZWxvY2F0aW9ucwotCWFzIHRoZXkgYXJlIGRlZmluZWQgaW4gZWxmL21pcHMuaCBub3cuCi0KLVRodSBKdWwgMjMgMTE6Mjk6NDMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0KLQkqIFJlLWFkZCBsb3N0IGNoYW5nZToKLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkCi0JIm1vdm1fc3RhY2tfc2l6ZSIuCi0JKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBJbmNsdWRlIHN0YWNrIHNwYWNlIGZvciByZWdpc3RlciBzYXZlcwotCWluIHRoZSBpbW04IGZpZWxkIG9mIGEgImNhbGwiIGluc3RydWN0aW9uLgotCShjb21wdXRlX2Z1bmN0aW9uX2luZm8pOiBEZXRlcm1pbmUgaG93IG11Y2ggc3RhY2sgaXMgYWxsb2NhdGVkIGJ5Ci0JdGhlIG1vdm0gaW5zdHJ1Y3Rpb24uICBGaXggdHlwby4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbW92bV9zdGFja19zaXplLgotCi1UaHUgSnVsIDIzIDExOjM4OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplKTogRGVmaW5lIGFzIDQuCi0JKiBlbGY2NC1zcGFyYy5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUgYXMgOC4KLQotMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jOiBDaGFuZ2UgdXNlIG9mIHBwX3JlbG9jX3R5cGUgdG8gZWxmX3BwY19yZWxvY190eXBlLgotCi1XZWQgSnVsIDIyIDE2OjI3OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWhwcGEuaDogTGV0IEVMRiBoZWFkZXIgZGVmaW5lIHRoZSBlbnVtIGNvbnRhaW5pbmcgdGhlCi0JZXh0ZXJuYWwgcmVsb2MgbnVtYmVycy4KLQkqIGVsZjMyLWkzODYuaDogTGlrZXdpc2UuCi0KLTE5OTgtMDctMjIgMTQ6NTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYtbTEwMzAwLmM6IExldCBFTEYgaGVhZGVyIG5vdyBkZWZpbmUgdGhlIG1hY3JvcyB0byBnZXQgdGhlIGVudW0uCi0JKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmM6IExpa2V3aXNlLgotCi1XZWQgSnVsIDIyIDEzOjUzOjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbjIuaDogQ2hhbmdlIHR5cGUgb2YgJ2NsYXNzJyBwYXJhbWV0ZXIgdG8gJ3Vuc2lnbmVkIGludCcgaW4KLQliZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKCksIGluIG9yZGVyIHRvIGF2b2lkIEsmUiBjb21wYXRhYmlsaXR5Ci0JcHJibGVtcy4KLQkqIGJmZC1pbi5oOiBSZWdlbmVyYXRlLgotCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogQ2hhbmdlIHR5cGUgb2YgJ2NsYXNzJwotCXBhcmFtZXRlciB0byAndW5zaWduZWQgaW50JyB0byBhdm9pZCBLJlIgY29tcGF0YWJpbGl0eSBwcm9ibGVtcy4KLQotV2VkIEp1bCAyMiAxNjo0MzoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9maW5kX25lYXJlc3RfbGluZSk6IENoYW5nZSBmaWxlbmFtZV9wdHIgYW5kCi0JZnVuY3Rpb25uYW1lX3B0ciB0byBiZSBjb25zdC4gIENoYW5nZSBsaW5lX3B0ciB0byBiZSB1bnNpZ25lZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pOiBTaW1wbGlmeSBoYW5kbGluZyB3aGVuCi0JbWFjcm8gaXMgbm90IGRlZmluZWQuICBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBmcm9tIGJmZF9saW5rX2luZm8KLQl0byBjb2ZmX2ZpbmFsX2xpbmtfaW5mby4gIEFkZCBwcm90b3R5cGUuCi0JKGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KTogU2ltcGxpZnkgaGFuZGxpbmcgd2hlbiBtYWNybyBpcyBub3QKLQlkZWZpbmVkLiAgQWRkIHByb3RvdHlwZS4KLQotMTk5OC0wNy0yMiAxMzowOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1tbjEwMzAwLmM6IEJlZm9yZSBpbmNsdWRlIHN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyIGRlZmluZQotCVNUQVJUX1JFTE9DX05VTUJFUlMsIFJFTE9DX05VTUJFUiwgYW5kIEVORF9SRUxPQ19OVU1CRVJTLgotCSogZWxmMzItbWlwcy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jOiBMaWtld2lzZS4KLQotV2VkIEp1bCAyMiAxMzo0Njo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9yZWxvY190eXBlKTogQ29weSBVbHJpY2gncyBlbGYzMi1taXBzLmMKLQl0ZW1wb3JhcnkgcGF0Y2ggb3ZlciB0byBlbGY2NC1taXBzLmMgYXMgd2VsbC4KLQotMTk5OC0wNy0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAocmVsb2NfdHlwZSk6IFRlbXBvcmFyaWx5IGRpc2FibGUgZGVmaW5pdGlvbiBvZgotCXN0YW5kYXJkIHJlbG9jYXRpb24gc2luY2UgdGhleSBhcmUgbm93IGRlZmluZWQgaW4gZWxmL21pcHMuaC4KLQotVHVlIEp1bCAyMSAwOTo0NzowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmLW0xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKToKLQlNb2RpZnkgcmFuZ2UgdGVzdCBmb3IgY2FzZSBSX01OMTAyMDBfOC4KLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKToKLQlNb2RpZnkgcmFuZ2UgdGVzdCBmb3IgY2FzZSBSX01OMTAzMDBfOC4KLQotTW9uIEp1bCAyMCAxODo1MDo1NCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGdvdF8gJiBwbHRfaGVhZGVyX3NpemUuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplKTogRGVmaW5lLgotCSogZWxmMzItbTY4ay5jLCBlbGYzMi1taXBzLmMsIGVsZjMyLXBwYy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMsIGVsZjY0LWFscGhhLmMsIGVsZjY0LXNwYXJjLmM6IExpa2V3aXNlLgotCSogZWxmeHgtdGFyZ2V0Lmg6IFByb3ZpZGUgYSBkZWZhdWx0IG9mIHplcm8uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFVzZSBnb3RfaGVhZGVyX3NpemUuCi0JKiBlbGZsaW5rLmggKGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpOiBMaWtld2lzZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgcmVtb3ZlIGEgUExUCi0JZW50cnkgZnJvbSBhbiBleGVjdXRhYmxlLCBldmVuIGlmIHRoZSBwbHQgcmVmY291bnQgZ29lcyB0byAwLgotCi1Nb24gSnVsIDIwIDEyOjQ3OjI2IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogQWxzbyByZW1lbWJlciB0aGUKLQlkaXJlY3RvcnkgbmFtZSBhdCB0aGUgbGluZSBudW1iZXIuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEFsc28gY29uc2lkZXIgc3ltYm9scwotCXdpdGggYW4gdW5zcGVjaWZpZWQgdHlwZS4KLQotV2VkIEp1bCAxNSAxMToyMDowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmM6IEFkZCB1bmRlZiBvZiB2YWxpZCB0byBhdm9pZCBwcm9ibGVtIG9uIFN1bk9TLgotCi1UdWUgSnVsIDE0IDE1OjMwOjU5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGk/ODYtcGMtYmVvc3twZSxlbGYsfSopOiBSZWNvZ25pemUuCi0KLVR1ZSBKdWwgMTQgMTE6MjI6MjEgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogQWxzbyByZWZlcmVuY2UgY291bnQKLQlSXzY4S19QQ3h4IGFuZCBSXzY4S194eCByZWxvY2F0aW9ucy4gIE1ha2Ugc3VyZSB0aGF0Ci0JRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgaXMgYWx3YXlzIHNldCBmb3IgYSBQTFQgcmVsb2MgcmVmZXJlbmNlLgotCShlbGZfbTY4a19nY19zd2VlcF9ob29rKTogQWxzbyByZWZlcmVuY2UgY291bnQgUl82OEtfUEN4eCBhbmQKLQlSXzY4S194eCByZWxvY2F0aW9ucy4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmVzZXQgdGhlIHBsdCBvZmZzZXQgb2YgYSBzeW1ib2wKLQl0aGF0IGhhcyBubyBwbHQgZW50cnkuCi0JKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBJZ25vcmUgdGhlIHBsdCBvZmZzZXQgaW4gYSBzdGF0aWMKLQlsaW5rLgotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmVzZXQgdGhlIHBsdCBvZmZzZXQgZm9yCi0JYW4gaWdub3JlZCBzeW1ib2wuCi0JKGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpOiBTZXQgdGhlIGdvdCBvZmZzZXRzIGFsc28gaW4KLQlhIHN0YXRpYyBsaW5rLgotCi0JKiBlbGYzMi1tNjhrLmMgKFJfNjhLX0dOVV9WVElOSEVSSVQsIFJfNjhLX0dOVV9WVEVOVFJZKTogTmV3IHJlbG9jCi0JdHlwZXMuCi0JKGhvd3RvX3RhYmxlLCByZWxvY19tYXApOiBBZGQgZW50cmllcyBmb3IgdGhlbS4KLQkoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogSGFuZGxlIHRoZW0uICBJbXBsZW1lbnQgcmVmZXJlbmNlCi0JY291bnRpbmcgZm9yIGdvdCBhbmQgcGx0IGVudHJpZXMuCi0JKGVsZl9tNjhrX2djX21hcmtfaG9vaywgZWxmX202OGtfZ2Nfc3dlZXBfaG9vayk6IE5ldyBmdW5jdGlvbnMuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEhhbmRsZSB1bnJlZmVyZW5jZWQgcGx0Ci0Jc3ltYm9scy4KLQkocnR5cGVfdG9faG93dG9fcmVsLCBlbGZfaW5mb190b19ob3d0b19yZWwpOiBEZWxldGUuCi0JKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgdGhlIG5ldyByZWxvYyB0eXBlcy4KLQkoYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rLCBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2ssCi0JZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vaywgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGNyZWF0aW5nIGFuCi0JaW5kaXJlY3QgcmVmZXJlbmNlIGZvciBzeW1ib2wgdmVyc2lvbmluZyBhbHNvIGNvcHkgdGhlIHBsdAotCW9mZnNldC4KLQkoZWxmX2ZpeF9zeW1ib2xfZmxhZ3MpOiBXaGVuIGNsZWFyaW5nIHRoZSBFTEZfTElOS19IQVNIX05FRURTX1BMVAotCWZsYWcgYWxzbyByZXNldCB0aGUgcGx0IG9mZnNldC4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogTGlrZXdpc2UuCi0JKGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpOiBJbmNyZW1lbnQgdGhlIGdvdCBvZmZzZXQgYnkKLQl0aGUgc2l6ZSBvZiB0aGUgZW50cnkgaW4gYnl0ZXMuCi0JKGVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cyk6IExpa2V3aXNlLgotCi1UdWUgSnVsIDE0IDExOjE4OjE0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZ2Nfc2VjdGlvbnMpOiBSZXR1cm4gdHJ1ZSByYXRoZXIgdGhhbiBmYWxsaW5nIG9mZgotCXRoZSBib3R0b20uCi0KLQkqIGNvZmZnZW4uYyAoYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyk6IENhbGwgYmZkX2FsbG9jLCBub3QKLQl4bWFsbG9jLgotCi1Nb24gSnVsIDEzIDExOjA2OjMxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IFN1cHJlc3MgZGVmaW5pdGlvbiBvZiBUQVJHRVRfVU5ERVJTQ09SRSBhbmQgYWRkIGEKLQljb21tZW50IGRlc2NyaWJpbmcgd2hlbiBpdCBzaG91bGQgYmUgZW5hYmxlZC4KLQlDaGFuZ2VkIGRlZmluaXRpb24gb2YgVVNFUl9MQUJFTF9QUkVGSVggdG8gIiIsIHRvIGZhbGwgaW50byBsaW5lCi0Jd2l0aCBHQ0Mgc291cmNlcy4KLQotTW9uIEp1bCAxMyAxMzowNjo1NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogSGFuZGxlIGNhbGwgb3B0aW1pemF0aW9uCi0JaW5mb3JtYXRpb24gQVROIHJlY29yZHMuCi0KLUZyaSBKdWwgMTAgMTY6MzE6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IFNlbGVjdCBhbiBhcHByb3ByaWF0ZQotCXNlY3Rpb24gZm9yIGFuIGFic29sdXRlIHN5bWJvbCBpbiBhIGZ1bGx5IGxpbmtlZCBmaWxlLiAgQmFzZWQgb24KLQlwYXRjaCBmcm9tIENocmlzdGlhbiBIb2xsYW5kIDxDSG9sbGFuZEBkZS5sdWNlbnQuY29tPi4KLQotV2VkIEp1bCAgOCAxMToyOTo1NiAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvZmYtbTg4ay5jIChtODhrX3NwZWNpYWxfcmVsb2MpOiBEb24ndCBsb3NlIHRoZSBpbmZvcm1hdGlvbgotCXRoYXQgYSBzeW1ib2wgaXMgdW5kZWZpbmVkLgotCi1UdWUgSnVsICA3IDIxOjQ3OjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9iZmRfZ2Nfc2VjdGlvbnMpOiBEZWZpbmUuCi0KLU1vbiBKdWwgIDYgMTE6MzU6NTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYW91dGFybV9zdGRfcmVsb2NfaG93dG8pOiBEbyBub3QgY29tcGxhaW4gYWJvdXQKLQlvdmVyZmxvd3MgaW4gQVJNXzI2RCBwYXRjaGVzLCBzaW5jZSB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuCi0JaW1wbG1lbnRlZC4gIFBhdGNoIHN1Ym1pdHRlZCBieSBEci4gUi5KLiBCbGFjayA8cmpiQGRjcy5nbGEuYWMudWs+Ci0KLVNhdCBKdWwgIDQgMTI6MjU6MzYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIHdlIGhhdmUgYW55IGxvbmcKLQlzZWN0aW9uIG5hbWVzLCBjYWxsIGNvZmZfd3JpdGVfc3ltYm9scyBldmVuIGlmIHRoZXJlIGFyZSBubwotCXN5bWJvbHMuCi0KLUZyaSBKdWwgIDMgMTM6MTE6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogT25seSBzZXQgcGhkcl9pbmNsdWRlZCBvbmNlIGZvciBhCi0JUFRfTE9BRCBzZWdtZW50LCByYXRoZXIgdGhhbiBvbmx5IHNldHRpbmcgaXQgb25jZSBmb3IgdGhlIGVudGlyZQotCWZpbGUuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogV2hlbiBzZXR0aW5nIHRoZSBMTUEsCi0JcmF0aGVyIHRoYW4gaWdub3JpbmcgZXZlcnkgcGhkciB3aXRoIGEgcF9wYWRkciBvZiAwLCBpZ25vcmUgYWxsCi0JdGhlIHBoZHJzIGlmIHRoZXkgYWxsIGhhdmUgYSBwX3BhZGRyIG9mIDAuCi0KLQkqIHN0YWJzLmMgKF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzKTogQ2hlY2sgd2hldGhlciB0aGUgLnN0YWJzdHIKLQlzZWN0aW9uIHdhcyBkaXNjYXJkZWQgZnJvbSB0aGUgbGluay4KLQotRnJpIEp1bCAgMyAxNDozOTowNSAxOTk4ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYtc2guYyAoc2hfaW5zbl91c2VzX2ZyZWcpOiBJZ25vcmUgbG93ZXN0IGJpdCBvZiByZWdpc3RlciBudW1iZXIuCi0KLUZyaSBKdWwgIDMgMTQ6MzU6NDggMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb2ZmLXNoLmMgKHNoX2luc25zX2NvbmZsaWN0KTogTG9hZCBvZiBmcHNjciBjb25mbGljdHMgd2l0aAotCWZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMuCi0KLVRodSBKdWwgIDIgMTg6Mzc6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBTa2lwIHVuZGVmaW5lZCBnbG9iYWwKLQlmdW5jdGlvbiBzeW1ib2xzLgotCi1UaHUgSnVsICAyIDE0OjU5OjQyIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcm1pLmRlPgotCi0JTWVyZ2Ugb2YgdmF4L3ZtcyAocmVhZC1vbmx5KSBzdXBwb3J0Ci0JKiBjb25maWd1cmUuY29tOiBTdXBwb3J0IFZheCB0YXJnZXQuCi0JKiBtYWtlZmlsZS52bXM6IFN1cHBvcnQgVmF4IHRhcmdldC4KLQkqIHZtcy5oOiBSZW5hbWVkIGZyb20gZXZheC5oLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KSBzdXBwb3J0LgotCSogdm1zLmM6IFJlbmFtZWQgZnJvbSBldmF4LWFscGhhLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIHZtcy1oZHIuYzogUmVuYW1lZCBmcm9tIGV2YXgtZW1oLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIHZtcy1nc2QuYzogUmVuYW1lZCBmcm9tIGV2YXgtZWdzZC5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiB2bXMtdGlyLmM6IFJlbmFtZWQgZnJvbSBldmF4LWV0aXIuYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLW1pc2MuYzogUmVuYW1lZCBmcm9tIGV2YXgtbWlzYy5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiBsaWJiZmQuYyAocmVhbF9yZWFkKTogVXNlIHVuYnVmZmVyZWQgcmVhZCBvbiBWTVMvVmF4LgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X292YXhfZmxhdm91cik6IE5ldyBmbGF2b3VyLgotCSh2bXNfYWxwaGFfdmVjKTogUmVuYW1lZCBmcm9tIGV2YXhfYWxwaGFfdmVjLgotCSh2bXNfdmF4X3ZlYyk6IE5ldy4KLQkodGFyZ2V0X3ZlY3Rvcik6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkqIGNvbmZpZy5iZmQgKGFscGhhKi0qLSp2bXMqKTogVXNlIHZtc19hbHBoYV92ZWMsIG5vdAotCWV2YXhfYWxwaGFfdmVjLgotCSh2YXgqLSotKnZtcyopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IFVwZGF0ZSBmb3IgcmVuYW1lZCBmaWxlcy4gIFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZC4KLQotVGh1IEp1bCAgMiAxMzozMTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIE1hdHQgU2VtZXJza3kgPG1hdHRzQHNjZC5ocC5jb20+OgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogRm9yY2UgYSB0cmFpbGluZyBOVUxMCi0JcG9pbnRlciBvbiBhYmZkLT5vdXRzeW1ib2xzLgotCShnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sKTogSGFuZGxlIE5VTEwgc3ltIHBhcmFtZXRlci4KLQotV2VkIEp1bCAgMSAxNzowNTo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogQWRkIHN1cHBvcnQgZm9yIGNoYW5naW5nIFZNQSBvcgotCUxNQSBvZiBzZWN0aW9ucy4KLQotV2VkIEp1bCAgMSAxNjo1ODo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogQ29ycmVjdCBhZGRyZXNzIGNvbXBhcmlzb25zCi0gCXdoZW4gaGFuZGxpbmcgMzIgYml0IGltbWVkaWF0ZSByZWxvY3MuCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0KLVR1ZSBKdW4gMzAgMDk6NTU6MDMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogQWNjb3VudCBmb3IgcmVjZW50bHkgYWRkZWQgZ2NfbWFyawotCWZpZWxkIGluIHN0cnVjdCBhc2VjdGlvbi4KLQotCSogZWxmLW0xMDMwMC5jIChiZmRfbW4xMDMwMF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCi1UaHUgSnVuIDI1IDE4OjMxOjQxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQlFTEYgU2VjdGlvbi1sZXZlbCBHYXJiYWdlIENvbGxlY3Rpb246Ci0JKiBiZmQuYyAoYmZkX2djX3NlY3Rpb25zKTogTmV3LgotCSogYW91dC1hZG9iZS5jOiBIb29rIHRvIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCi0JKiBhb3V0LXRhcmdldC5oLCBhb3V0LXRpYzMwLmMsIGJpbmFyeS5jLCBib3V0LmM6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywgY29mZi1yczYwMDAuYywgY29mZmNvZGUuaDogTGlrZXdpc2UuCi0JKiBldmF4LWFscGhhLmMsIGkzODZtc2Rvcy5jLCBpMzg2b3M5ay5jLCBpZWVlLmM6IExpa2V3aXNlLgotCSogaWhleC5jLCBubG0tdGFyZ2V0LmgsIG9hc3lzLmMsIHBwY2Jvb3QuYywgc3JlYy5jOiBMaWtld2lzZS4KLQkqIHRla2hleC5jLCB2ZXJzYWRvcy5jOiBMaWtld2lzZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMpOiBOZXcuCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0xJTkspOiBBZGQgX2JmZF9nY19zZWN0aW9ucy4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKTogTmV3LgotCShiZmRfZ2VuZXJpY19nY19zZWN0aW9ucyk6IE5ldy4KLQkqIHNlY3Rpb24uYyAoU0VDX0tFRVApOiBOZXcuCi0JKGFzZWN0aW9uKTogQWRkIGdjX21hcmsgbWVtYmVyLgotCi0JKiBlbGZjb2RlLmggKGVsZl9nYyopOiBOZXcgbmFtZSByZW1hcHBpbmdzLgotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBzZXQgY29udGVudHMgb24gc3RhYnMKLQlzZWN0aW9ucyB0byBiZSBleGNsdWRlZC4KLQkoZWxmX2djX21hcmssIGVsZl9nY19zd2VlcCwgZWxmX2djX3N3ZWVwX3N5bWJvbCk6IE5ldy4KLQkoZWxmX2djX3Byb3BvZ2F0ZV92dGFibGVfZW50cmllc191c2VkKTogTmV3LgotCShlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzKTogTmV3LgotCShlbGZfZ2Nfc2VjdGlvbnMsIGVsZl9nY19yZWNvcmRfdnRpbmhlcml0LCBlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkpOiBOZXcuCi0JKGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpOiBOZXcuCi0JKGVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cywgZWxmX2djX2NvbW1vbl9maW5hbF9saW5rKTogTmV3LgotCSogZWxmeHgtdGFyZ2V0Lmg6IEFkZCBhbmQgZGVmYXVsdCBnYyBob29rcy4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IFN3YXAgZ290X29mZnNldC9wbHRfb2Zmc2V0Ci0JZm9yIHVuaW9ucy4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBMaWtld2lzZSBmb3IgbG9jYWxfZ290X29mZnNldHMuCi0JKiBlbGYuYywgZWxmLWkzODYuYywgZWxmMzItbTY4ay5jLCBlbGYzMi1taXBzLmM6IFVwZGF0ZSBhbGwgdXNlcy4KLQkqIGVsZjMyLXBwYy5jLCBlbGYzMi1zcGFyYy5jLCBlbGY2NC1hbHBoYS5jOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMsIGVsZmxpbmsuaDogTGlrZXdpc2UuCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgdnRhYmxlIG1lbWJlcnMuCi0JKEVMRl9MSU5LX0hBU0hfTUFSSyk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgR0MgaG9va3MuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBaZXJvIHZ0YWJsZSBtZW1iZXJzLgotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcyk6IE5ldy4KLQkobW4xMDMwMF9lbGZfZ2NfbWFya19ob29rKTogTmV3LgotCShSX01OMTAzMDBfR05VX1ZUSU5IRVJJVCwgUl9NTjEwMzAwX0dOVV9WVEVOVFJZKTogTmV3LgotCShlbGZfbW4xMDMwMF9ob3d0bywgbW4xMDMwMF9yZWxvY19tYXApOiBIYW5kbGUgdGhlbS4KLQkobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZjMyLW1pcHMuYyAoUl9NSVBTX0dOVV9WVElOSEVSSVQsIFJfTUlQU19HTlVfVlRFTlRSWSk6IE5ldy4KLQkoZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0bywgZWxmX21pcHNfZ251X3Z0ZW50cnlfaG93dG8pOiBOZXcuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgdGhlbS4KLQkobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nY19tYXJrX2hvb2ssIG1pcHNfZWxmX2djX3N3ZWVwX2hvb2spOiBOZXcuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZjMyLXBwYy5jIChSX1BQQ19HTlVfVlRJTkhFUklULCBSX1BQQ19HTlVfVlRFTlRSWSk6IE5ldy4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBIYW5kbGUgdGhlbS4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZWZlcmVuY2UgY291bnQgLmdvdCBhbmQgLnBsdCBlbnRpcmVzLgotCUhhbmRsZSBuZXcgdnRhYmxlIHJlbG9jcy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZWNvZ25pemUgdW51c2VkIC5wbHQgZW50cmllcy4KLQkocHBjX2VsZl9nY19tYXJrX2hvb2ssIHBwY19lbGZfZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCi1GcmkgSnVuIDI2IDEwOjQ4OjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbW4xMDMwMCk6IERlZmluZS4KLQkqIGVsZi1tMTAzMDAuYzogSW5jbHVkZSBlbGYvbW4xMDMwMC5oCi0JKGVsZl9tbjEwMzAwX21hY2gpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbW4xMDMwMF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShfYmZkX21uMTAzMDBfZWxmX29iamVjdF9wKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQotVGh1IEp1biAyNSAxODozMTowOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZpeCBISTE2X1MKLQlyZWxvY2F0aW9uLgotCi1XZWQgSnVuIDI0IDE3OjE3OjU3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBMb29wIG92ZXIgaW5wdXRfYmZkcyB1c2luZyB0aGUKLQlsaW5rX25leHQgZmllbGQsIG5vdCB0aGUgbmV4dCBmaWVsZC4KLQotU3VuIEp1biAyMSAxOTozODozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBDaGVjayB0aGUgc2VjdGlvbiBhZGRyZXNzCi0JYWdhaW5zdCB0aGUgcGhkciBzaXplIGJvdGggd2l0aCBhbmQgd2l0aG91dCBhIG1vZHVsbyBvZgotCW1heHBhZ2VzaXplLgotCi1GcmkgSnVuIDE5IDE3OjA4OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHN0cmlwIGEKLQlsaW5rZXIgY3JlYXRlZCBlbXB0eSBpbnB1dCBzZWN0aW9uIGlmIHRoZSBvdXRwdXQgc2VjdGlvbiBoYXMgdGhlCi0Jc2FtZSBuYW1lLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGlmCi0JX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIGZhaWxzLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQ2FsbCBiZmRfc2V0X2Vycm9yIG9uCi0JZmFpbHVyZS4KLQotVHVlIEp1biAxNiAxMTo1NTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBJbXByb3ZlIGhhbmRsaW5nIG9mIFNvbGFyaXMKLSAJbmF0aXZlIGxpbmtlciBvdXRwdXQuICBBdm9pZCBwdXR0aW5nIGFuIGVtcHR5IHNlY3Rpb24gaW4gbW9yZSB0aGFuCi0gCW9uZSBzZWdtZW50LgotCi1GcmkgSnVuIDEyIDEzOjMwOjE3IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IElmIG1haW50YWluZXIgbW9kZSwgZGVwZW5kIG9uIC5wb3QgZmlsZS4KLQkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgotCi1GcmkgSnVuIDEyIDEzOjM0OjAyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogTmV3IGFyZyByZWxvY2F0YWJsZV9wLgotCURvbid0IGFkZCBzZWN0aW9uIFZNQSB0byBzeW1ib2xzIGZvciByZWxvY2F0YWJsZSBvdXRwdXQuCi0JKF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFVwZGF0ZSBjYWxsIHRvCi0Jc3dhcF9vdXRfc3ltcy4KLQotTW9uIEp1biAgOCAxNToyMDo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6IE1ha2UgY29tcGFyaXNvbnMKLQlhZ2FpbnN0ICdhZGRlbmQnIGJlIHNpZ25lZCByYXRoZXIgdGhhbiB1bnNpZ25lZC4KLQotU2F0IEp1biAgNiAwMDozMToyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmM6IEFkZCBwcm90b3R5cHMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIGNvZmYtYXJtLmM6IEFkZCBwcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLgotCi1GcmkgSnVuICA1IDE3OjIxOjUxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZfc29ydF9zZWN0aW9ucyk6IFNvcnQgYnkgTE1BIGZpcnN0IHRoZW4gVk1BLCBzaW5jZSB0aGUKLQlMTUEgaXMgdXNlZCB0byBvcmRlciBzZWN0aW9ucyBpbiBhIHNlZ21lbnQuCi0KLQkqIGVsZjMyLXY4NTAuYzogQWRkIHByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCi0JQ2hhbmdlIHR5cGUgb2YgYWRkZW5kIHBhcmFtZXRlciB0byBiZmRfdm1hIGluIHZhcmlvdXMgZnVuY3Rpb25zLgotCi1GcmkgSnVuICA1IDE4OjA5OjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQ2hhbmdlIFJFTE9DX0JBU0UxMyB0byB1c2UKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQgaW5zdGVhZCBvZiBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZC4KLQotRnJpIEp1biAgNSAxNToxMToxMSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmLmMgKGVsZl9tYXBfc3ltYm9scyk6IERvbid0IGFkZCBzZWN0aW9uIFZNQSB0byBzeW1ib2wgdmFsdWUKLQl3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IDAuCi0KLVdlZCBKdW4gIDMgMTc6NTI6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEp1biAgMyAxMjoxODoyNCAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogR2l2ZSBhbgotCWVycm9yIGlmIHByZXZpb3VzIG9iamVjdCBlbmRpYW5uZXNzIGRvZXNuJ3QgbWF0Y2ggY3VycmVudCBvYmplY3QuCi0KLVR1ZSBKdW4gIDIgMTc6NTA6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2FsbAotCV9iZmRfZWxmX3ByaW50X3ByaXZhdGUpYmZkX2RhdGEgKCkuCi0KLVR1ZSBKdW4gIDIgMTU6Mjk6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEb24ndCBhbHdheXMgc2V0IHR5cGVfY2hhbmdlX29rCi0JYW5kIHNpemVfY2hhbmdlX29rLgotIAkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHR5cGVfY2hhbmdlX29rIGFuZAotCXNpemVfY2hhbmdlX29rIGJlZm9yZSBjYWxsaW5nIGVsZl9tZXJnZV9zeW1ib2wuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IElmIHdlIGlzc3VlIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCBlcnJvciwgZG9uJ3QgYWxzbyBpc3N1ZSBhbiBvdmVyZmxvdyBlcnJvci4KLQotVHVlIEp1biAgMiAxMzo1MTowMCAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVGhlIHRhcmdldCBvZiBhbgotCVJfUFBDX0xPQ0FMMjRQQyByZWxvY2F0aW9uIHNob3VsZCBiZSBsb2NhbDsgaWYgbm90LCBwcmludCBhbiBlcnJvcgotCW1lc3NhZ2UgaW5zdGVhZCBvZiBjcmFzaGluZy4KLQotTW9uIEp1biAgMSAxODoyMzoxMiAxOTk4ICBZdWxpIEJhcmNvaGVuICA8eXVsaS5iYXJjb2hlbkB0ZWxyYWQuY28uaWw+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2NwdTMyKTogRGVmaW5lLgotCShiZmRfZGVmYXVsdF9zY2FuKTogQWRkIGNhc2UgZm9yIDY4MDYwLiAgRml4IDY4MzMyIGNhc2UgdG8gdXNlCi0JYmZkX21hY2hfY3B1MzIuCi0JKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG02OGs6Y3B1MzIuCi0JKiBpZWVlLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShpZWVlX29iamVjdF9wKTogUGFyc2Ugb3V0IHByb2Nlc3MgSUQgc3RyaW5nIHRvIG1ha2UgaXQgbW9yZQotCWxpa2VseSB0byBiZSBhY2NlcHRhYmxlIGZvciBiZmRfc2Nhbl9hcmNoLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gSnVuICAxIDExOjEyOjAyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsc28gY2FsbAotCV9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoKSBzbyB0aGF0IHRoZSBwcm9ncmFtIGhlYWRlciB3aWxsCi0JYmUgZGlzcGxheWVkLgotCi1Nb24gSnVuICAxIDEyOjE0OjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQ2hlY2sgZm9yIENfU0VDVElPTiByYXRoZXIgdGhhbgotCTB4NjguICBSZWluZGVudC4gIEFkZCBzb21lIGNvbW1lbnRzLgotCi1GcmkgTWF5IDI5IDA5OjU4OjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGp1c3QgcGh5c2ljYWwgYWRkcmVzcyBvZgotCXNlZ21lbnQgaW4gb3V0cHV0IEJGRCB0byBjb250YWluIExNQXMgb2YgaXRzIHNlY3Rpb25zLgotCi1UdWUgTWF5IDI2IDE5OjM3OjQ3IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlLCBzcGFyY19yZWxvY19tYXAsCi0JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IEFkZGVkIFJfU1BBUkNfMzJMRSBmb3IgbGl0dGxlCi0JZW5kaWFuIGRhdGEgMzIgYml0IHJlbG9jYXRpb25zLgotCShlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgaWYgbGlua2luZyBsaXR0bGUKLQllbmRpYW4gb2JqZWN0cyB3aXRoIGJpZyBlbmRpYW4gb2JqZWN0cy4KLQkoZWxmMzJfc3BhcmNfb2JqZWN0X3ApOiBTZXQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgotCShlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IEVGX1NQQVJDX0xFREFUQSBpbiBlX2ZsYWdzLgotCSogbGliYmZkLmggKGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXMpOiBBZGRlZCBCRkRfUkVMT0NfU1BBUkNfMzJMRS4KLQkqIHJlbG9jLmM6IFNhbWUuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZGVkIHNwYXJjOnNwYXJjbGl0ZV9sZQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTogTmV3LgotCSogYmZkLWluMi5oIChCRkRfUkVMT0NfU1BBUkNfMzJMRSwgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTogTmV3LgotCi1UaHUgTWF5IDIxIDE2OjU5OjI4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBGaXggcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMgaW4gaWYgKCkKLQlzdGF0ZW1lbnQuCi0KLVR1ZSBNYXkgMTkgMTg6NDE6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogTW92ZSBvdmVyIHBhdGNoIHRvIGJmZC1pbjIuaC4KLQotCSogcmVsb2MuYyAoYmZkX2NoZWNrX292ZXJmbG93KTogQWRkIGNhc3RzIGJlZm9yZSBzaGlmdHMgd2hpY2ggbWF5Ci0gCW5vdCBmaXQgaW4gMzIgYml0cy4KLQkoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IExpa2V3aXNlLgotCi1Nb24gTWF5IDE4IDE0OjQ0OjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBJZiB0aGUgc2VjdGlvbiBoYXMgbm8gcHJpdmF0ZSBkYXRhCi0JdGhlbiBkbyBub3QgY3JlYXRlIGEgRGF0YSBEaWN0aW9uYXJ5IGVudHJ5IGZvciBpdC4KLQotTW9uIE1heSAxOCAwMDowOToyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uKTogU2V0IGFnYWluIG9uIGNoYW5nZXMuCi0JKGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzLCBlbGY2NF9hbHBoYV9tZXJnZV9nb3RzLAotCWVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zKTogUmV3cml0ZSwgaGFuZGxpbmcgbXVsdGlwbGUgZ290Ci0Jc3Vic2VjdGlvbnMgZHVyaW5nIHJlbGF4YXRpb24gbW9yZSBjb3JyZWN0bHkuCi0KLVRodSBNYXkgMTQgMTQ6MjI6NTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmZkLWluMi5oOiBBZGQgbmV3IHByb3RvdHlwZTogYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyAoKS4KLQlBZGQgZXh0cmEgYXJndW1lbnQgdG8gYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uICgpLgotCSogYmZkLWluLmg6IFJlZmxlY3QgY2hhbmdlcyBtYWRlIGluIGJmZC1pbjIuaC4KLQkqIGNvZmZnZW4uYyAoYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyk6IE5ldyBmdW5jdGlvbi4gIFNldCB0aGUKLQljb2ZmIGNsYXNzIG9mIGEgQkZEIHN5bWJvbC4KLQkqIGNvZmYtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBpbnRlcndvcmtpbmcgYmV0d2VlbiBUaHVtYiBjb2RlIGFuZAotCW5vbi1pbnRlcndvcmtpbmcgYXdhcmUgQVJNIGNvZGUuCi0KLVN1biBNYXkgMTAgMjI6MzM6NTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1UaHUgTWF5ICA3IDE3OjQwOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZmlsZW1vZGUuYzogUmVtb3ZlOyBub3QgdXNlZC4KLQotCUlmIHN5c2RlcC5oIGluY2x1ZGVzIGEgaGVhZGVyIGZpbGUsIGRvbid0IGluY2x1ZGUgaXQgYWdhaW46Ci0JKiBhaXgzODYtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN0ZGRlZi5oPiwgb3IKLQk8ZXJybm8uaD4uCi0JKiBhb3V0eC5oOiBEb24ndCBpbmNsdWRlIDxzdHJpbmcuaD4uICBVc2UgInN5c2RlcC5oIiByYXRoZXIgdGhhbgotCTxzeXNkZXAuaD4uCi0JKiBhcmNoaXZlLmM6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPiBvciA8ZXJybm8uaD4uCi0JKiBldmF4LWFscGhhLmM7IERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+LgotCSogZXZheC1lZ3NkLmM6IExpa2V3aXNlLgotCSogZXZheC1ldGlyLmM6IExpa2V3aXNlLgotCSogZXZheC1taXNjLmM6IExpa2V3aXNlLgotCSogZXZheC1lbWguYzogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0JKiBocHBhYnNkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4sIDxzeXMvdHlwZXMuaD4sIG9yCi0JPGVycm5vLmg+LgotCSogaHB1eC1jb3JlLmM6IExpa2V3aXNlLgotCSogbmV0YnNkLWNvcmUuYzogTGlrZXdpc2UuCi0JKiBzb20uYzogTGlrZXdpc2UuCi0JKiBsaWJiZmQuYzogRG9uJ3QgaW5jbHVkZSA8c3lzL3R5cGVzLmg+LgotCSogbmxtY29kZS5oOiBEb24ndCBpbmNsdWRlIDxzdHJpbmcuaD4uCi0JKiBvc2YtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdHJpbmcuaD4gb3IgPHN0ZGlvLmg+LgotCSogcHRyYWNlLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4sIDxzeXMvdHlwZXMuaD4sCi0JPGVycm5vLmg+LCBvciA8dW5pc3RkLmg+LgotCSogdHJhZC1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+IG9yIDxzeXMvdHlwZXMuaD4uCi0KLVRodSBNYXkgIDcgMTM6MTI6NTAgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IElmIHRoZSB2ZXJzaW9uIG51bWJlciBjYW4gbm90IGJlIGZvdW5kIGluCi0JY29uZmlndXJlLmluLCBzZXQgaXQgdG8gInVua25vd24iIHJhdGhlciB0aGFuICIyLjguMSIuCi0KLVdlZCBNYXkgIDYgMDk6NDY6MDUgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfbWFjaCk6IE5ldy4KLQkoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IFVzZSBlbGZfbWlwc19tYWNoLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBVc2UgdGhlIG5hbWVzCi0Jb2YgbWFjaGluZXMsIHJhdGhlciB0aGFuIHRoZSBudW1iZXJzLiAgU2V0IGJvdGggdGhlIEFSQ0gKLQlhbmQgTUFDSCBpbiBlX2ZsYWdzLiAgSGFuZGxlIGEgZmV3IG1vcmUgc3BlY2lmaWMgbWFjaGluZXMuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE1lcmdlIGJvdGgKLQlFRl9NSVBTX0FSQ0ggYW5kIEVGX01JUFNfTUFDSC4KLQotVHVlIE1heSAgNSAyMTowMTo1MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IFJldmVydCBsYXN0IGNoYW5nZS4KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogRGlzY2FyZCBkZWJ1Z2dpbmcgc3ltYm9scy4KLQotVHVlIE1heSAgNSAyMzozNjowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNvbS5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkqIHNvbS5oOiBEb24ndCBpbmNsdWRlIHN5c2RlcC5oLgotCi1UdWUgTWF5ICA1IDE4OjI5OjI0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQtaW4uaDogUmVtb3ZlZCBnZXR0ZXh0IGluY2x1ZGVzIGFuZCBkZWZpbmVzLgotCSogc3lzZGVwLmg6IE1vdmVkIGdldHRleHQtcmVsYXRlZCBpbmNsdWRlcyBhbmQgZGVmaW5lcyBoZXJlLgotCi1UdWUgTWF5ICA1IDE2OjQ3OjU0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogVXNlIGJmZF9pc19sb2NhbF9sYWJlbCByYXRoZXIgdGhhbgotCWFuIGFkLWhvYyB0ZXN0LiAgS2lsbCBib2d1cyAjaWYgMCBjb2RlLgotCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBDb25zaWRlciBCU0ZfREVCVUdHSU5HIHN5bWJvbHMgbG9jYWwuCi0KLU1vbiBNYXkgIDQgMTY6MTA6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogRG9uJ3QgdXNlIHRoZSBQTFQgYWRkcmVzcwotCXdoZW4gZ2VuZXJhdGluZyBhIG5vcm1hbCBleGVjdXRhYmxlIGZvciBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQlyZWd1bGFyIGZpbGUuICBXaGVuIGNvcHlpbmcgYSByZWxvYyBpbnRvIHRoZSBvdXRwdXQgZmlsZSwgYWRqdXN0Ci0JdGhlIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbC4KLQotTW9uIE1heSAgNCAxMDowODoxOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGliYmZkLWluLmggKF8pOiBEZWZpbmUgYXMgZGdldHRleHQuCi0KLU1vbiBNYXkgIDQgMTE6MDI6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FzdCB0byBiZmRfc2lnbmVkX3ZtYSwKLQlub3Qgc2lnbmVkLgotCSogcGVpY29kZS5oIChwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogVXNlIFBBUkFNUwotCXdoZW4gZGVjbGFyaW5nIHBhcmFtZXRlciB0eXBlcy4KLQkocGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMjkgMTU6MzU6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBJZiB3ZSBpbmNsdWRlIGFueSBFTEYgdGFyZ2V0cyBpbiB0YXJnX2RlZnZlYyBhbmQvb3IKLQl0YXJnX3NlbHZlY3MsIHRoZW4gYWRkIHRoZSBnZW5lcmljIEVMRiB0YXJnZXRzIHRvIHRhcmdfc2VsdmVjcy4KLQkqIGVsZjMyLWdlbi5jIChkdW1teSk6IE5ldyBzdGF0aWMgY29uc3QgdmFyaWFibGUuCi0JKGVsZl9nZW5lcmljX2luZm9fdG9faG93dG8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIGFzIGVsZl9nZW5lcmljX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvX3JlbCk6IERlZmluZSBhcyBlbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbC4KLQkqIGVsZjY0LWdlbi5jOiBTYW1lIGNoYW5nZXMgYXMgZWxmMzItZ2VuLmMuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IEZvciB0aGUgZ2VuZXJpYyB0YXJnZXQsIGlnbm9yZSBhCi0JZmFpbHVyZSBvZiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLiAgRml4IGluZGVudGF0aW9uIGEgYml0LgotCi1UdWUgQXByIDI4IDIwOjA1OjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChXSU4zMkxJQkFERCk6IEFkZCAtbGludGwgb24gY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBBcHIgMjggMTI6MTY6NTcgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6ICBVcGRhdGUgT1NSNS9Vbml4d2FyZSBwYXR0ZXJucy4KLQotTW9uIEFwciAyNyAxODowMjoyNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEFsbG93IGZvciBob2xlcwotCWJldHdlZW4gc2VjdGlvbnMgYWRkZWQgYnkgYSBsaW5rIHNjcmlwdC4KLQotTW9uIEFwciAyNyAxMTo0OTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDIuOS40Ci0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIGVsZi5jIChiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0KTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotU2F0IEFwciAyNSAyMDowNzo1MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyk6IFJlcGxhY2UgZWxmc3ltIHdpdGggb3RoZXIuCi0JQ2hhbmdlIGFsbCB1c2Vycy4KLQotU2F0IEFwciAyNSAxODoyOTowNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyk6IEFkZCB0c2VjICYgZWxmc3ltIG1lbWJlcnMuCi0JKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBGaWxsIHRoZW0gaW4uCi0JKGVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsKTogSW1wbGVtZW50IG1vcmUgdGhhbiBhIHN0dWIuCi0JKGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vayk6IERvbid0IHNldCBTRUNfTE9BRCBvciBkZWZhdWx0Ci0JYWxpZ25tZW50IG9uIC5zY29tbW9uLgotCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogTWVyZ2UgdXNlIGNvdW50cyBhcyB3ZWxsLgotCi1TYXQgQXByIDI1IDE0OjA3OjI5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBVc2UgdGhlIHByb3BlciBzZWN0aW9uCi0JZm9yIGNhbGN1bGF0aW5nIGEgbG9jYWwgc3ltYm9sJ3MgYWRkcmVzcy4KLQkoZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyk6IFNraXAgZW50cmllcyB3aXRoIDAgdXNlIGNvdW50LgotCVNldCB0aGUgLmdvdCdzIGNvb2tlZCBzaXplIGFzIHdlbGwgYXMgdGhlIHJhdyBzaXplLgotCi1GcmkgQXByIDI0IDA5OjE2OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZAotCWludGVybmF0aW9uYWxpc2F0aW9uIG9mIHByaW50ZWQgaW5mb3JtYXRpb24uCi0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQKLQlpbnRlcm5hdGlvbmFsaXNhdGlvbiBvZiBwcmludGVkIGluZm9ybWF0aW9uLgotCi1GcmkgQXByIDI0IDEyOjA5OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChzdHJ1Y3QgaW5kZXhlbnRyeSk6IENoYW5nZSBkaXJlY3RvcnlfbmFtZSwgZmlsZV9uYW1lLAotCWFuZCBmdW5jdGlvbl9uYW1lIGZpZWxkcyB0byBjaGFyICouCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IENoYW5nZSBjYWNoZWRfZmlsZV9uYW1lIGZpZWxkIHRvIGNoYXIgKi4KLQotVGh1IEFwciAyMyAwODoxMzowNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGRpcl9uYW1lcyk6IEFkZCBtaXNzaW5nIE5fKCkgbWFjcm9zIHRvIGRpcl9uYW1lcyBhcnJheS4KLQotV2VkIEFwciAyMiAxMzowNjoxNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCi0KLVdlZCBBcHIgMjIgMTc6NDg6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWxvY2FsKTogTWFrZSAkKGluY2x1ZGVkaXIpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBcHIgMjIgMTM6MDY6MTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaDogVXNlIGBnZXR0ZXh0JyBhbmQgbm90IGBkZ2V0dGV4dCcgZm9yIG5vdy4KLQotV2VkIEFwciAyMiAxMjo1Mzo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChJTkNMVURFUyk6IEFkZCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQgZm9yIE5pY2sncyBjaGFuZ2VzLgotCi1UdWUgQXByIDIxIDIzOjExOjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyk6IEZpeCBsb3NzYWdlIGluIGxhc3QKLQljaGFuZ2Ugd3J0IGxlbmd0aCA9PSBtYXhfbmFtZWxlbi4KLQotVHVlIEFwciAyMSAyMToxOTozNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYW55IGZpbGVzOiBBZGRlZCBnZXR0ZXh0IGludm9jYXRpb25zIGFyb3VuZCB1c2VyLXZpc2libGUKLQlzdHJpbmdzLgotCSogbGliYmZkLWluLmg6IEFkZGVkIGdldHRleHQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCi0JKiBhY2NvbmZpZy5oIChFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VUVEVYVCwgSEFWRV9TVFBDUFksCi0JSEFWRV9MQ19NRVNTQUdFUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBDWV9HTlVfR0VUVEVYVC4gIENyZWF0ZSBwby9NYWtlZmlsZS5pbiBhbmQKLQlwby9NYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogQWRkZWQgcG8uCi0JKFBPVEZJTEVTKTogTmV3IG1hY3JvLgotCShwby9QT1RGSUxFUy5pbik6IE5ldyB0YXJnZXQuCi0JKFNPVVJDRV9IRklMRVMpOiBOZXcgbWFjcm8uCi0JKEhGSUxFUyk6IFVzZSBpdC4KLQkqIHBvL01ha2UtaW4sIHBvL1BPVEZJTEVTLmluLCBwby9iZmQucG90OiBOZXcgZmlsZXMuCi0KLVR1ZSBBcHIgMjEgMTM6Mzg6MTggMTk5OCBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZmNvcmUuaCAoYmZkX3Byc3RhdHVzKTogIENvcHkgY29yZV9wcnN0YXR1cyBmcm9tIHRoZSBmaXJzdAotCU5UX1BSU1RBVFVTIG5vdGUgc2VjdGlvbiBlbmNvdW50ZXJlZCwgaXQgY29udGFpbnMgdGhlIHN0YXR1cyBvZgotCXRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZCB3aGVuIHRoZSBjb3JlIGZpbGUgd2FzIHdyaXR0ZW4uCi0KLVR1ZSBBcHIgMjEgMTA6MDA6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi5oOiBBZGQgZXh0cmEgcGFyYW1ldGVyIHRvCi0JYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIG92ZXJyaWRlYWJsZSBmdW5jdGlvbi4KLQkqIGNvZmZsaW5rLmM6IFBhc3MgZXh0cmEgcGFyYW1ldGVyIHRvCi0JYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIGZ1bmN0aW9uLgotCSogYmZkLWluLmg6IEFkZCBwcm90b3R5cGVzIGZvciBleHBvcnRlZCBBUk0gaW50ZXJ3b3JraW5nCi0JZnVuY3Rpb25zLgotCSogcGVpY29kZS5oOiBBUk0gc3BlY2lmaWMgY29kZSByZW9yZ2FuaXNlZCB0byBjb25mb3JtIHRvIEJGRAotCWNvZGluZyBjb252ZW50aW9ucy4KLQkqIGNvZmZjb2RlLmg6IEFSTSBzcGVjaWZpYyBjb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gQkZECi0JY29kaW5nIGNvbnZlbnRpb25zLgotCSogY29mZi1hcm0uYzogQ29kZSByZW9yZ2FuaXNlZCB0byBjb25mb3JtIHRvIHRoZSBCRkQgY29kaW5nCi0JY29udmVudGlvbnMuICBHbG9iYWwgdmFyaWFibGVzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGFuIEFSTQotCXNwZWNpZmljIGhhc2ggdGFibGUgc3RydWN0dXJlIGFuZCBhIG5ldyBmdW5jdGlvbjoKLQliZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZygpIGhhcyBiZWVuIGNyZWF0ZWQgd2hpY2ggaXMKLQljYWxsZWQgZnJvbSB0aGUgbGlua2VyIHNjcmlwdHMuCi0KLVR1ZSBBcHIgMjEgMDA6MTE6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogU2ltcGxpZnkgZW5kLW9mLW5hbWUgdGVzdC4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMpOiBSZW5hbWVkIGZyb20KLQllbGY2NF9hbHBoYV9yZWxheF9maW5kX3JlbG9jX29mcy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vayk6IFB1dCBzbWFsbCBjb21tb25zIGluIC5zY29tbW9uIG5vdCAuc2Jzcy4KLQkoZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMpOiBEb24ndCBtZXJnZSAuZ290IHNlY3Rpb25zIHR3aWNlLgotCi1TYXQgQXByIDE4IDAxOjIxOjA0IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGRlZCBzcGFyYzg2eCBzdXBwb3J0LgotCi1GcmkgQXByIDE3IDIyOjI5OjA0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gbm90IGNvbXBsYWluIGFib3V0Ci0JYW4gb3V0IG9mIHJhbmdlIHBjLXJlbGF0aXZlIGp1bXAvY2FsbCB0byBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0KLVRodSBBcHIgMTYgMTM6NDk6MDAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwKTogRG8gYWxsIGdwZGlzcAotCWNvbXBhcmlzb25zIHNpZ25lZC4KLQotVGh1IEFwciAxNiAxMTo0MzozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSWYgYSBzbHVycCBzdWJyb3V0aW5lIHJldHVybnMKLSAJYW4gZXJyb3Igb3RoZXIgdGhhbiBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwsIHNldCB0aGUgZXJyb3IgdG8KLSAJYmZkX2Vycm9yX3dyb25nX2Zvcm1hdC4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3RvcikgW1NFTEVDVF9WRUNTIG5vdCBkZWZpbmVkXTogQWRkCi0JYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMuCi0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBJZiBhbGwgdGhlIHBfcGFkZHIgZmllbGRzIGluIHRoZQotCXByb2dyYW0gc2VnbWVudHMgYXJlIHplcm8sIGRvbid0IHNldCBwX3BhZGRyX3ZhbGlkLgotCi1XZWQgQXByIDE1IDIyOjE1OjE2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmM6IEluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgcmVsYXhhdGlvbiAtLQotCShzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB1c2VfY291bnQgbWVtYmVyLgotCShlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MpOiBJbml0aWFsaXplIGFuZCBpbmNyZW1lbnQgaXQuCi0JKGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzKTogQ2hlY2sgaXQgd2hlbiBjb25zaWRlcmluZyBtZXJnaW5nLgotCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogRHJvcCBlbnRyaWVzIHdpdGggemVybyB1c2UuCi0JKGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHNfZm9yX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IFNwbGl0IG91dCBnb3Qgc2l6aW5nIC4uLgotCShlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyk6IC4uLiBoZXJlLiAgTmV3IGZ1bmN0aW9uLgotCShlbGY2NF9hbHBoYV9yZWxheF9maW5kX3JlbG9jX29mcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfaG93dG9fdGFibGUpOiBJbXBsZW1lbnQgR1BSRUxISUdIL0xPVyAmIElNTUVEX0dQXzE2LgotCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMTUgMTY6MDg6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IFVzZSBuZXcgRU1fU1BBUkNWOSBzeW1ib2wuCi0JKiBlbGY2NC1zcGFyYy5jIChFTEZfTUFDSElORV9DT0RFKTogTGlrZXdpc2UuCi0JKEVMRl9NQUNISU5FX0FMVDEpOiBOZXcuICBTZXQgdG8gRU1fT0xEX1NQQVJDNjQuCi0KLVdlZCBBcHIgMTUgMTE6MzQ6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCAtbGtlcm5lbDMyIHRvIFdJTjMyTElCQUREIG9uIGN5Z3dpbjMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gQXByIDEzIDE2OjQ2OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZF9sYV9MSUJBREQpOiBBZGQgQFdJTjMyTElCQUREQC4KLQkobGliYmZkX2xhX0xERkxBR1MpOiBBZGQgQFdJTjMyTERGTEFHU0AuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBXSU4zMkxERkxBR1MgYW5kCi0JV0lOMzJMSUJBREQuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXByIDEwIDEzOjQ0OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNb3ZlIGEgUEUgQ09NREFUIHN5bWJvbAotCWJlZm9yZSBhbnkgb3RoZXIgc3ltYm9scyBpbiB0aGUgc2FtZSBzZWN0aW9uLgotCi1XZWQgQXByICA4IDE0OjUwOjIzIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjKi0qLSopOiBSZW1vdmUgUG93ZXJQQyBOVCBzdXBwb3J0IGZyb20gRUxGCi0Jc3lzdGVtcy4KLQotVHVlIEFwciAgNyAxNjoyNTozMSAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmMgKGNvbXBfdW5pdCk6IE1vdmUgaXQgZWFybGllciBpbiB0aGUgc291cmNlLiBBZGQKLQlhZGRyX3NpemUuCi0JKHJlYWRfYWRkcmVzcyk6IFJlcGxhY2UgJ2JkZionIGFyZ3VtZW50IHdpdGggJ2NvbXBfdW5pdConIGFyZ3VtZW50LgotCVVzZSBhZGRyX3NpemUgZm9yIGFkZHJlc3Mgc2l6ZSwgcmF0aGVyIHRoYW4gc2l6ZW9mKGJmZF92bWEpLgotCShyZWFkX2F0dHJpYnV0ZSk6IFJlcGxhY2UgYmRmKiBhcmd1bWVudCB3aXRoICdjb21wX3VuaXQqJyBhcmd1bWVudC4KLQlGaXggY2FsbCB0byByZWFkX2FkZHJlc3MuCi0JKGRlY29kZV9saW5lX2luZm8pOiBSZXBsYWNlIGJkZiogYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCi0JU2NyYXAgb3RoZXIgdW5uZWVkZWQgYXJndW1lbnRzLiAgRml4IGNhbGwgdG8gcmVhZF9hZGRyZXNzLgotCShzY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyk6IEZpeCBjYWxsIHRvIHJlYWRfYXR0cmlidXRlLgotCShwYXJzZV9jb21wX3VuaXQpOiBXZSBub3cgaGFuZGxlIG1vcmUgdmFsdWVzIGZvciBhZGRyX3NpemUuCi0JU2V0IGFkZHJfc2l6ZSBpbiB1bml0LiAgRml4IGNhbGwgdG8gcmVhZF9hdHRyaWJ1dGUgYW5kCi0JZGVjb2RlX2xpbmVfaW5mby4KLQotVHVlIEFwciAgNyAxNTo0NDo0NyAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAocGFyc2VfY29tcF91bml0KTogRHJvcCB1c2Ugb2YgdW5pdC0+bmFtZSB3aGVuIGl0IGlzIG51bGwuCi0KLVR1ZSBBcHIgIDcgMTI6MzU6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogQWRkIG02OGsgY2FzZXMgYmFjayB0byBkZWZhdWx0Ci0Jc3dpdGNoLCByZXZlcnRpbmcgcGF0Y2ggb2YgTWFyY2ggMjUsIHNpbmNlIElFRUUgc3VwcG9ydCBkZXBlbmRzCi0JdXBvbiB0aGVtLgotCi1Nb24gQXByICA2IDE0OjA2OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU3VuIEFwciAgNSAxNjoyMTo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEZpeCBjb21wdXRhdGlvbiBvZgotCXNvbV9vZmZzZXQgd2hlbiB3ZSBoYXZlIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLVN1biBBcHIgIDUgMTY6MDQ6MzkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoc3RhbXAtbGliKTogQ2hlY2sgdGhhdCAubGlicy9saWJiZmQuYSBleGlzdHMgYmVmb3JlCi0JdHJ5aW5nIHRvIGNvcHkgaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEFwciAgMyAxMTowOTo0MiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBHZW5lcmF0ZSBzZWN0aW9uCi0Jc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogTmV3IGZ1bmN0aW9uLCB1c2VkIGJ5IGFib3ZlIGNvZGUuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbgotCXN5bWJvbHMuCi0JKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGFuZ2UgYWJvcnQgdG8gQkZEX0FTU0VSVC4KLQotV2VkIEFwciAgMSAxNjowNDowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChpbl9yZWxvY19wKTogVXNlIEFSTV9SVkEzMiBpbiBwbGFjZSBvZiBjb25zdGFudAotCXZhbHVlIDExLgotCi1XZWQgQXByICAxIDEzOjM2OjU4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24sIGNhc2UgUl82OEtfUExUKk8pOiBGaXgKLQlhc3NlcnRpb24uCi0KLVR1ZSBNYXIgMzEgMDA6MTI6MTIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBDb3JyZWN0bHkgaGFuZGxlCi0JYWJzb2x1dGUgc3ltYm9scy4KLQotTW9uIE1hciAzMCAxMjo0NjoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotTW9uIE1hciAzMCAxMjoyMDo1MCAxOTk4ICBCcmVudCBCYWNjYWxhICA8YmFjY2FsYUBmcmVlc29mdC5vcmc+Ci0KLQkqIHN5bXMuYyAoRU5BQkxFX0NBQ0hJTkcpOiBEZWZpbmUuCi0JKHN0cnVjdCBpbmRleGVudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3Qgc3RhYl9jYWNoZSk6IFJlbW92ZS4KLQkoY21waW5kZXhlbnRyeSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IEFkZCBuZXcgZmllbGRzOiBpbmRleHRhYmxlLAotCWluZGV4dGFibGVzaXplLCBjYWNoZWRfaW5kZXhlbnRyeSwgY2FjaGVkX29mZnNldCwgY2FjaGVkX3N0YWIsIGFuZAotCWNhY2hlZF9maWxlX25hbWUuICBSZW1vdmUgZmllbGRzOiBmaWxlX2NhY2hlLCBmdW5jdGlvbl9jYWNoZSwgYW5kCi0JbGluZV9jYWNoZS4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBSZXdyaXRlIHRvIGJ1aWxkIGEgc29ydGVkCi0JaW5kZXggdGFibGUgYW5kIHNlYXJjaCBpdC4KLQotTW9uIE1hciAzMCAxMDozOTozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2FsbAotCWNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBvbmNlIHdlJ3ZlIHNlZW4gdGhlIGxhc3QgU0VDX0FMTE9DIHNlY3Rpb24uCi0KLQkqIGNwdS1taXBzLmM6IFJlbW92ZSB0cmFpbGluZyBjb21tYSBhdCBlbmQgb2YgZW51bWVyYXRpb24gbGlzdC4KLQotU2F0IE1hciAyOCAxNjozMzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IERlZmluZSBhbGwgZ2xvYmFsbHkgdmlzaWJsZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucwotCW9ubHkgd2hlbiBDT0ZGX1dJVEhfUEUgaXMgbm90IGRlZmluZWQuCi0JKiBjb25maWd1cmUuaW4gKGFybXBlX2xpdHRsZV92ZWMsIGFybXBlX2JpZ192ZWMpOiBBZGQKLQljb2ZmLWFybS5sby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyNyAxNjowNjowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBhb3V0LWFybS5jIChNWShmaXhfcGNyZWxfMjYpKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogTGlrZXdpc2UuCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogTGlrZXdpc2UuCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogTGlrZXdpc2UuCi0JKiBiaW5hcnkuYyAobWFuZ2xlX25hbWUpOiBMaWtld2lzZQotCSogY29mZi1hcm0uYyAoYW91dGFybV9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KLQkqIGNvZmYtc2guYyAoc2hfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1zdGdvMzIuYyAoY3JlYXRlX2dvMzJfc3R1Yik6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9saW5lX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IExpa2V3aXNlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IExpa2V3aXNlLgotCShtYW5nbGVfbmFtZSk6IExpa2V3aXNlLgotCSogcmlzY2l4LmMgKHJpc2NpeF9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogTGlrZXdpc2UuCi0JKiBzdGFicy5jIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGFvdXQtbnMzMmsuYyAoX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guICBEZWNsYXJlIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLgotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IEFkZCBicmFjZXMgdG8gYXZvaWQgYW1iaWd1b3VzIGlmCi0Jd2FybmluZy4KLQkqIGVsZi5jIChlbGZfc29ydF9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogY29mZi1hcm0uYyAoY29mZl90aHVtYl9wY3JlbF9jb21tb24pOiBJbml0aWFsaXplIHJlbG9jYXRpb24uCi0JQWRkIGRlZmF1bHQgY2FzZXMgdG8gc3dpdGNoZXMuCi0JKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQlBbHdheXMgc2V0IHJzdGF0LgotCShjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2UgZmxhZyB2YXJpYWJsZSB0byB0eXBlCi0JZmxhZ3dvcmQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSW5pdGlhbGl6ZSB1c2VfbG8uCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkoZHVtcF90b2MpOiBDaGFuZ2UgY2F0IHRvIGNvbnN0LCBhbmQgaW5pdGlhbGl6ZSBpdC4KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogSW5pdGlhbGl6ZSBzdGFydCBhbmQgdm9mZi4KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkoc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIHJfc3ltbmR4LgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IGRlY2xhcmUKLQlvbGRfc29mYXIgaWYgQUxJR05fU0VDVElPTlNfSU5fRklMRS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbml0aWFsaXplIGNzeW0uCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBNYWtlIHR5cGUgYW5kIGNsYXNzIHVuc2lnbmVkLgotCSogY3B1LW5zMzJrLmMgKF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guCi0JKiBkd2FyZjIuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkocmVhZF8yX3NpZ25lZF9ieXRlcywgcmVhZF80X3NpZ25lZF9ieXRlcyk6IENvbW1lbnQgb3V0LgotCShkZWNvZGVfbGluZV9pbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX3NkYTE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBMaWtld2lzZS4KLQkodjg1MF9lbGZfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVsZi1iZmQuaCAoZWxmX2xpbmtlcl9zZWN0aW9uX3QpOiBNYWtlIGFsaWdubWVudCB1bnNpZ25lZC4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBNYWtlIGN2ZXJkZWZzIGFuZCBjdmVycmVmcyB1bnNpZ25lZC4KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWx3YXlzIHNldCBhZGp1c3QuCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEluaXRpYWxpemUgdG1wX2FkZHIuICBGdWxseQotCXBhcmVudGhlc2l6ZSBleHByZXNzaW9uLgotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWx3YXlzIGluaXRpYWxpemUgaC4KLQkobTMycl9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KLQkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3QuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBsYXN0IGFuZCBkaW5keC4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KLQkodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2Ugc3ltY291bnQgYW5kIGkgdG8KLQl1bnNpZ25lZCBsb25nLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGFuZ2UgdmVybnVtIHRvCi0JdW5zaWduZWQgaW50LCBhbmQgaW5pdGlhbGl6ZSBpdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FzdCAtMSB0byBiZmRfc2l6ZV90eXBlCi0Jd2hlbiBzZXR0aW5nIG9yIGNvbXBhcmluZyB0byBzb25hbWVfaW5keC4KLQkoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQ2hhbmdlIG51bV9zeW1ib2xzIHRvCi0JdW5zaWduZWQgaW50LgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZSk6IENoYW5nZSBmbGFncyB0byBmbGFnd29yZC4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBJbml0aWFsaXplIGlkeC4gIENoYW5nZSBqIHRvCi0JYmZkX3NpemVfdHlwZS4gIEluaXRpYWxpemUgaGludF9tZW1iZXIuICBSZW1vdmUgdXNlbGVzcyB0ZXN0IHRvCi0JdGltZV9zdGFtcC4KLQkocGVfcHJpbnRfZWRhdGEpOiBDaGFuZ2UgbnVtX2Z1bmN0aW9ucyBhbmQgbnVtX25hbWVzIGluIHN0cnVjdAotCUVEVF90eXBlIHRvIHVuc2lnbmVkIGxvbmcuICBSZW1vdmUgY2FzdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdAotCXN0cmluZy4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IENoYW5nZSBpIHRvIHNpemVfdC4KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB1bnNpZ25lZAotCWludC4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIHNocmlua3MgdG8KLQlpbnQgKi4gIFVwZGF0ZSB1c2VzLiAgQ2hhbmdlIGogdG8gbG9uZy4KLQkqIGJmZC1pbjIuaCwgbGliY29mZi5oOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDEwOjEwOjQ2IDE5OTggIENhdGhlcmluZSBNb29yZSA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyBSZW1vdmUgZGVmaW5pdGlvbiBvZiBVU0VfUkVMLgotCSh2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBSZW5hbWVkIGZyb20KLQl2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbi4gIFJlbW92ZWQgcmVwbGFjZSBhcmd1bWVudC4KLQkodjg1MF9lbGZfcmVsb2MpOiBzdG9yZSB0aGUgcmVsb2NhdGlvbiBpbiB0aGUgYWRkZW5kIGZpZWxkIGluc3RlYWQKLQlvZiB0aGUgaW5zbi4KLQkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBOb3cgY2FsbHMKLQl2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24uCi0JKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgUmVtb3ZlIGNvZGUgdG8gZ2VuZXJhdGUgUkVMCi0JcmVsb2NhdGlvbnMuCi0KLVRodSBNYXIgMjYgMTM6MzI6MTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UKLQljbGFzcyBpbiB0aGUgbmF0aXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBhbGxvY2F0ZWQgZm9yIGEgbmV3IHNlY3Rpb24KLQlzeW1ib2wuCi0KLVRodSBNYXIgMjYgMTA6MTM6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oOiBDaGFpbiB0b2dldGhlciBjYWxscyB0bwotCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKLQljb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IKLQljb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKLQljb2ZmX2FybV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLgotCi1XZWQgTWFyIDI1IDE1OjQ1OjU1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IFNldCBwcml2YXRlIGZhbGdzIGV2ZW4gZm9yIGEgUEUKLQlidWlsZC4KLQotCSogcGVpY29kZS5oOiBDYWxsIGFybS1jb2ZmIHByaXZhdGUgZGF0YSBmdW5jdGlvbnMgYWZ0ZXIgaGFuZGxpbmcKLQlwZSBwcml2YXRlIGRhdGEuCi0KLQkqIGNvZmYtYXJtLmM6IFR1cm4gc3RhdGljcyBpbnRvIGdsb2JhbHMgc28gdGhhdCB0aGV5IGNhbiBiZSBzaGFyZWQKLQlib3RoIHBlIGFuZCBwZWkgYmFja2VuZHMuCi0KLVdlZCBNYXIgMjUgMTU6MTk6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoc3Vub3Nfc2V0X2FyY2hfbWFjaCk6IFVzZSBiZmRfbWFjaF9tNjgqIHJhdGhlciB0aGFuCi0JcGxhaW4gbnVtYmVycy4KLQkoc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBMaWtld2lzZS4KLQotV2VkIE1hciAyNSAxMzo1OToyNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbTY4Kik6IEFkZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBtNjhrCi0JdmFyaWFudHMuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBSZW1vdmUgbTY4ayBzcGVjaWFsIGNhc2VzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbWlwc2JzZC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIGJmZF9tYWNoX202OCogcmF0aGVyCi0JdGhhbiBwbGFpbiBudW1iZXJzLgotCSogc3BhcmNseW54LmMgKE5BTUUobHlueCxzZXRfYXJjaF9tYWNoKSk6IExpa2V3aXNlLgotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLiAgQWRkIGVudHJ5IGZvcgotCW02OGs6NjgwMDAuCi0JKGJmZF9tNjhrX2FyY2gpOiBTZXQgbWFjaCBmaWVsZCB0byB6ZXJvIHRvIHNpZ25hbCBubyBleHBsaWNpdAotCXNlbGVjdGlvbiwgY2hhbmdlIHByaW50YWJsZV9uYW1lIHRvIGp1c3QgIm02OGsiIGFuZCBtYWtlIHRoYXQgdGhlCi0JZGVmYXVsdCBpbnN0ZWFkIG9mIG02OGs6NjgwMjAuCi0KLQkqIGFvdXQtdGljMzAuYyAoTkFNRSk6IERlZmluZSB0aGlzIHRvIGF2b2lkIG11bHRpcGxlIGRlZmluaXRpb25zCi0JZnJvbSBhb3V0eC5oLgotCShNWV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZSBhcyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0JcmF0aGVyIHRoYW4gTkFNRShhb3V0LGdldF9zZWN0aW9uX2NvbnRlbnRzKS4KLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBGaXggY2FzdC4KLQotCSogZXZheC1hbHBoYS5jIChldmF4X3NldF9hcmNoX21hY2gpOiBPbmx5IGFjY2VwdCBiZmRfYXJjaF9hbHBoYQotCWFuZCBjYWxsIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggdG8gZG8gdGhlIHJlYWwgd29yay4KLQotV2VkIE1hciAyNSAxMDo0MTozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKEJBTFgpOiBJbmNsdWRlIHJldHVybiByZWdpc3RlciBnMTQgYXMgcGFydCBvZiB0aGUgaW5zbi4KLQkoQkFMWF9NQVNLKTogTmV3LgotCShjYWxsanhfY2FsbGJhY2spOiBVc2UgaXQuCi0KLVdlZCBNYXIgMjUgMTE6MTk6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoQkZEX0FMSUdOKTogQ2FzdCB0aGlzIHBhcmFtZXRlciB0byBiZmRfdm1hLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IENoYW5nZQotCWJ5dGVfY291bnQgdG8gdW5zaWduZWQgaW50LgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSW5pdGlhbGl6ZSBpbnRlcm5hbF9yZWxvY3MuICBSZW1vdmUKLQl1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfY2xvc2VfYW5kX2NsZWFudXApOiBSZW1vdmUgdW51c2VkIGxvY2FsCi0JdmFyaWFibGVzIGVyIGFuZCBlcjEuCi0KLQkqIGNwdS12ODUwLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShzY2FuKTogQ2FzZSBpc2RpZ2l0IGFyZ3VtZW50IHRvIHVuc2lnbmVkIGNoYXIuCi0KLQlGcm9tIFlhbiBNZXJvdGggPFlBTi5NRVJPVEhAc3QuY29tPjoKLQkqIGloZXguYyAoaWhleF9zY2FuKTogQWRkIGV4dGJhc2UgdmFyaWFibGUgc28gdGhhdCBnZXR0aW5nIGFuCi0gCWV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZCBkb2VzIG5vdCBpZ25vcmUgYW55IHByZXZpb3VzCi0gCWV4dGVuZGVkIGFkZHJlc3MuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogV2hlbiB3cml0aW5nIG91dCBhbiBleHRlbmRlZCBsaW5lYXIKLSAJYWRkcmVzcyByZWNvcmQsIHplcm8gb3V0IGFueSBwcmV2aW91cyBleHRlbmRlZCBhZGRyZXNzLgotCi1UdWUgTWFyIDI0IDE2OjA5OjQzIDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogaWVlZS5jIChkb19vbmUpOiBDaGVjayBzZWN0aW9uIGJlZm9yZSBkZXJlZmVyZW5jaW5nIGl0LgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlIHdpdGggc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIuCi0JKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogTGlrZXdpc2Ugd2l0aCBhYmZkLT5teV9hcmNoaXZlLgotCi1Nb24gTWFyIDIzIDE4OjUxOjQ3IDE5OTggIEpvZWwgU2hlcnJpbGwgIDxqb2VsQE9BUmNvcnAuY29tPgotCi0JKiBjb25maWcuYmZkOiAoc2gqLSotcnRlbXMqKTogU3dpdGNoZWQgZnJvbSBFTEYgdG8gQ09GRi4KLQotTW9uIE1hciAyMyAxNDoyMzozNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucyB0byBwZSBiYWNrZW5kcy4KLQotRnJpIE1hciAyMCAxODo0NzoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFNX0RJU0FCTEVfU0hBUkVELgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLUZyaSBNYXIgMjAgMTE6MjU6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEJldHRlciBlcnJvciBtZXNzYWdlcwotCXdoZW4gaW50ZXJvd3JraW5nIGNvbmZsdWN0cyBvY2N1ci4gIENvdXJ0ZXN5IG9mIEpvbmF0aGFuIFdhbHRvbgotCWFuZCBUb255IFRob21wc29uLgotCShhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IEZpeGVkIGJpdHNpemUgZmllbGRzIG9mIHJpZ2h0c2hpZnRlZAotCXJlbG9jYXRpb25zLiAgUGF0Y2ggY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uIGFuZCBUb255Ci0JVGhvbXBzb24uCi0KLUZyaSBNYXIgMjAgMDI6MjY6NDMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV2ZXJ0Ci0JcGFydCBvZiBGZWIgMjIgY2hhbmdlIGNvbnRyb2xpbmcgd2hlbiB0byBvdmVycmlkZSB0aGUgZXhpc3RpbmcKLQlzeW1ib2wgd2l0aCB0aGUgLnBsdCBlbnRyeS4KLQotV2VkIE1hciAxOCAwOToyNjoyNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLQkqIGNvZmZjb2RlLmggKE9USEVSX0dMT0JBTF9DTEFTUyk6IFN1cHBvcnQgdGh1bWIgZXh0ZXJuYWwKLQlmdW5jdGlvbnMgaW4gUEUgYnVpbGQuCi0KLVN1biBNYXIgIDggMjM6Mzc6MjYgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoc3BhcmNsaXRlLSotZWxmKik6IEFkZGVkLgotCi1Nb24gRmViIDIzIDE5OjMxOjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgZWxmLmxvIHRvIGVsZiBzaGVsbCB2YXJpYWJsZS4KLQkqIE1ha2VmaWxlLmFtIChCRkRfTElCUyk6IFJlbW92ZSBlbGYubG8uCi0JKEJGRF9MSUJTX0NGSUxFUyk6IFJlbW92ZSBlbGYuYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk4LTAyLTIzIDE1OjUzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBBIHBjLXJlbGF0aXZlCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGEgbm93LWxvY2FsIHN5bWJvbCBzaG91bGQgbm90IGhhdmUgYSBkeW5hbWljCi0JcmVsb2NhdGlvbi4KLQotTW9uIEZlYiAyMyAxNjoxNzowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEb24ndCBzZXQgQkZEIGZsYWcgSEFTX1NZTVMgaW4KLQlDT0ZGIGZpbGVoZHIgZmxhZ3MuCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQcmludCBQRSBmbGFncy4gIEZyb20gTWlrZXkKLQk8amVmZmRiQG5ldHpvbmUuY29tPi4KLQotU3VuIEZlYiAyMiAyMDozOTowMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjcmVhdGUKLSAJYSBwbHQgZW50cnkgd2hlbiB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgd2UgYXV0aG9yaXRhdGl2ZWx5IGRlZmluZQotIAl0aGUgc3ltYm9sLgotCi1TdW4gRmViIDIyIDIwOjMzOjA1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQ09SRUZJTEUgc2VsZWN0aW9uKTogUmVtb3ZlIHNwYXJjLSotbGludXgqLiAgVGhleQotCWRvbid0IGFjdHVhbGx5IHVzZSB0cmFkLWNvcmUsIGJ1dCBhIFN1bk9TLXN0eWxlIGNvcmUgZmlsZSBoYW5kbGVkCi0JYnkgZ2RiIGRpcmVjdGx5LgotCSogaG9zdHMvc3BhcmNsaW51eC5oOiBSZW1vdmUuCi0KLVdlZCBGZWIgMTggMTU6MzE6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogSWYgdGhlcmUgaXMgbm8gLmlkYXRhIHNlY3Rpb24sIGxvb2sKLQlmb3IgdGhlIGltcG9ydCB0YWJsZXMgaW4gc29tZSBvdGhlciBzZWN0aW9uLiAgTWFrZSB0aGUgaW5pdGlhbAotCWxhYmVsIGxpbmUgdXAgYmV0dGVyIHdpdGggdGhlIGRhdGEuICBQcmludCB0aGUgaW1wb3J0IGFkZHJlc3MKLQl0YWJsZSBldmVuIGlmIHRoZXJlIGlzIG5vIGltcG9ydCBuYW1lIHRhYmxlLiAgSWYgdGhlIGltcG9ydAotCWFkZHJlc3MgdGFibGUgaG9sZHMgYWN0dWFsIGFkZHJlc3NlcywgcHJpbnQgdGhlbS4KLQotVHVlIEZlYiAxNyAxMjo1ODozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IElmIGZzZWVrIGZhaWxzLCBzYXZlIGVycm5vIGFyb3VuZCBjYWxsIHRvCi0JYmZkX3RlbGwuICBJZiBlcnJubyBpcyBFSU5WQUwsIHNldCBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsIG5vdAotCWJmZF9lcnJvcl9zeXN0ZW1fY2FsbC4KLQotRnJpIEZlYiAxMyAxMzoxMTozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0KLQlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIE1ha2VmaWxlLmFtIChsaWJiZmRfbGFfTERGTEFHUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgRmViIDEyIDE3OjMxOjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU5ldEJTRCBwYXRjaGVzIGZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogbmV0YnNkLmggKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCShNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIERFRkFVTFRfQVJDSCBhbmQgREVGQVVMVF9NSUQgd2hlbgotCWNhbGxpbmcgTl9TRVRfTUFDSFRZUEUsIHJhdGhlciB0aGFuIGhhdmluZyBhIHN3aXRjaC4KLQkqIGxpYmFvdXQuaCAoZW51bSBtYWNoaW5lX3R5cGUpOiBBZGQgTV9QTUFYX05FVEJTRCwgTV9WQVhfTkVUQlNELAotCWFuZCBNX0FMUEhBX05FVEJTRC4KLQkqIGkzODZuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogbTY4azRrbmV0YnNkLmMgKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KLQkoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogbTY4a25ldGJzZC5jOiAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogbnMzMmtuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogc3BhcmNuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiB2YXhuZXRic2QuYzogTmV3IGZpbGUuCi0JKiBuZXRic2QtY29yZS5jOiBDbGVhbiB1cC4gIFJlbW92ZSB1bnVzZWQgbWFjcm9zLiAgVXNlIG5ldGJzZAotCXJhdGhlciB0aGFuIG5ldGJzZF9jb3JlLgotCSogdGFyZ2V0cy5jICh2YXhuZXRic2RfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgdmF4bmV0YnNkX3ZlYy4gIElmIE5FVEJTRF9DT1JFIGlzCi0JZGVmaW5lZCwgYWRkIG5ldGJzZF9jb3JlX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IENPUkVGSUxFIGZvciBhbHBoYSotKi1uZXRic2QqIGFuZAotCXBvd2VycGMtKi1uZXRic2QqIHRvIG5ldGJzZC1jb3JlLmxvLiAgSWYgQ09SRUZJTEUgaXMKLQluZXRic2QtY29yZS5sbywgc2V0IENPUkVGTEFHIHRvIC1ETkVUQlNEX0NPUkUuCi0JKiBjb25maWcuYmZkIChhbHBoYSotKi1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHZheG5ldGJzZC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHZheG5ldGJzZC5jLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlbW92ZSB0aGUgb2xkIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkIHN0dWZmLiAgV2UKLQlub3cgdXNlIGxpYnRvb2wgaW5zdGVhZC4KLQotV2VkIEZlYiAxMSAxNzoxMzowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0ZWtoZXguYyAodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgdGVraGV4X2luaXQuCi0KLVR1ZSBGZWIgMTAgMTk6MjM6MjggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWd1cmUuaW46IFRha2Ugc3RhYi1zeW1zLmxvIG91dCBvZiBzcGFyY2xpbnV4X3ZlYyBsaXN0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRmViIDEwIDE1OjE2OjM4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0JKiBlbGYzMi12ODUwLmMgKHJlbWVtYmVyX2hpMTZzX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogVXNlIHRoZSBhYm92ZSBuZXcgZnVuY3Rpb25zIHRvCi0JbWF0Y2ggdXAgSEk2UyByZWxvY3Mgd2l0aCBMTzE2IHJlbG9jcy4KLQotVHVlIEZlYiAxMCAxNTowMTozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCi0JKiBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdDogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDkgMTk6NDA6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IEZpeCBhbm90aGVyCi0JTE8xNi9ISTE2UyBidWcgYW5kIGltcHJvdmUgY29tbWVudHMgYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KLQotU2F0IEZlYiAgNyAxNToyNzowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1GcmkgRmViICA2IDE0OjQ4OjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvIG5vdCBjb21wbGFpbgotCXdoZW4gbWVyZ2luZyB2ODUwIGNvZGUgaW50byB2ODUwZS92ODUwZWEgY29kZS4gIERvIG5vdCBpbml0aWFsaXNlCi0Jb3V0cHV0IGZsYWdzIGlmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUuCi0KLUZyaSBGZWIgIDYgMTE6NTA6MjIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmMgKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBGb3IgQkZEX1JFTE9DX0NUT1IKLQlnZXQgdGhlIHNpemUgZnJvbSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIGluc3RlYWQgb2YgZGlyZWN0bHkKLQlmcm9tIHRoZSBpc2EuCi0KLVRodSBGZWIgIDUgMTQ6MjE6MzQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChCRkRfQUxJR04pOiBJZiByb3VuZGluZyB1cCB3b3VsZCBjYXVzZSB0aGUgYWRkcmVzcwotCXRvIHdyYXAsIGp1c3QgcmV0dXJuIGFsbCAxJ3MgYml0cyBpbnN0ZWFkLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgIDUgMTE6NTE6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uCi0JaWYgQ09GRl9XSVRIX1BFLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBDT0ZGX1dJVEhfUEUsIGRlZmluZSBhcwotCWNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsCi0Jc2tpcCBlbXB0eSBzZWN0aW9ucywgdG8gbWF0Y2ggY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuCi0KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQpOiBTd2FwIG91dCByX2FkZGVuZCwKLSAJcmF0aGVyIHRoYW4gc3dhcHBpbmcgb3V0IHJfb2Zmc2V0IHR3aWNlLiAgRnJvbSBMdWtlIERlbGxlcgotIAk8bHVrZWRAY3NlLnVuc3cuZWR1LmF1Pi4KLQotV2VkIEZlYiAgNCAxOToxMToyOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGxpYnRvb2xfZW5hYmxlX3NoYXJlZCByYXRoZXIgdGhhbgotCWxpYnRvb2xfc2hhcmVkLiAgUmVtb3ZlIGRpdmVyc2lvbiBoYWNrLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkCi0Jd2l0aCBuZXcgbGlidG9vbC4KLQotV2VkIEZlYiAgNCAxNjoxMDoyMSAxOTk4ICBCcmVudCBCYWNjYWxhICA8YmFjY2FsYUBmcmVlc29mdC5vcmc+Ci0KLQkqIHN5bXMuYyAoc3RydWN0IHN0YWJfY2FjaGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IFJlbW92ZSBjYWNoZWRfb2Zmc2V0LCBjYWNoZWRfc3RhYiwKLQljYWNoZWRfc3RyLCBhbmQgY2FjaGVkX3N0cm9mZiBmaWVsZHMuICBBZGQgZmlsZV9jYWNoZSwKLQlmdW5jdGlvbl9jYWNoZSwgYW5kIGxpbmVfY2FjaGUgZmllbGRzLgotCShfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBleHRlbnNpdmUgY2FjaGluZyB0bwotCXNwZWVkIHVwIHNlYXJjaGVzLgotCi1XZWQgRmViICA0IDEzOjM0OjIyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IENoZWNrIGZvciBpbXBvcnQgb2Ygb3JkaW5hbCByYXRoZXIKLQl0aGFuIG5hbWUuCi0JKHBlX3ByaW50X2VkYXRhKTogSWYgdGhlcmUgaXMgbm8gLmVkYXRhIHNlY3Rpb24sIGxvb2sgZm9yIHRoZQotCWV4cG9ydCBkYXRhIGluIHNvbWUgb3RoZXIgc2VjdGlvbi4KLQotTW9uIEZlYiAgMiAyMDowNTo0MiAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiB0byAyLjguNC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLU1vbiBGZWIgIDIgMTc6Mzk6MzkgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCUFkZCB0bXMzMjBjMzAgc3VwcG9ydDoKLQkqIGNwdS10aWMzMC5jOiBOZXcgZmlsZS4KLQkqIGFvdXQtdGljMzAuYzogTmV3IGZpbGUuCi0JKiBjb2ZmLXRpYzMwLmM6IE5ldyBmaWxlLgotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2hfdGljMzApOiBEZWZpbmUuCi0JKGJmZF90aWMzMF9hcmNoKTogRGVjbGFyZS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX3RpYzMwX2FyY2guCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHRpYzMwX2FvdXRfdmVjIGFuZAotCXRpYzMwX2NvZmZfdmVjLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1RJQzMwX0xEUCk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWRkIHRpYzMwIGNhc2UuCi0JKGNvZmZfc2V0X2ZsYWdzKTogTGlrZXdpc2UuCi0JKiBjb25maWcuYmZkICh0aWMzMC0qLSphb3V0KiwgdGljMzAtKi0qY29mZiopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAodGljMzBfYW91dF92ZWMsIHRpYzMwX2NvZmZfdmVjKTogTmV3IHZlY3RvcnMuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtdGljMzAubG8uCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LXRpYzMwLmMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQtdGljMzAubG8gYW5kIGNvZmYtdGljMzAubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBhb3V0LXRpYzMwLmMgYW5kIGNvZmYtdGljMzAuYy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDIgMTI6MjU6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IEFsbG93IEhJMTZfUyByZWxvYwotCXRvIGxhZyBiZWhpbmQgTE8xNiByZWxvYyBieSBhIGNvdXBsZSBvZiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBGZWIgIDIgMTQ6MDk6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoJChzcmNkaXIpL2JmZC1pbjIuaCk6IEFkZCBkdW1teSBjb21tYW5kIHRvIGZvcmNlCi0JbWFrZSB0byByZWV4YW1pbmUgdGhlIGZpbGUgdGltZXN0YW1wLgotCSgkKHNyY2RpcikvbGliYmZkLmgsICQoc3JjZGRpcikvbGliY29mZi5oKTogTGlrZXdpc2UuCi0KLQkqIGVsZjY0LWFscGhhLmMgKEVMRl9NQVhQQUdFU0laRSk6IENoYW5nZSB0byAweDEwMDAwIGZyb20KLQkweDEwMDAwMC4KLQotRnJpIEphbiAzMCAxOTowNzowNyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBwcm9jZWR1cmUKLQl0byBjcmVhdGUgLmR5bnNic3MgYW5kIC5yZWxhLnNic3Mgc2VjdGlvbnMuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUHV0IHNwYWNlIGZvciBzbWFsbCBkYXRhIHRvIGJlCi0JY29waWVkIGZyb20gZHluYW1pYyBvYmplY3RzIGludG8gLnNic3MuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU3RyaXAgLnJlbGEuc2JzcyBpZiB3ZSBkb24ndAotCXVzZSBpdC4gIENvcnJlY3QgdHlwbyBvZiAucmVsYS5zZGF0YTIuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgcmVsb2MgdG8gd2hlcmUgd2UKLQlwdXQgdGhlIGRhdGEsIHdoaWNoIG1heSBub3cgYmUgaW4gLnNic3MuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEEgU0RBUkVMMTYgcmVsb2MgY2FuIGJlIGluIGR5bnNic3MuCi0JKGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lIGFzCi0JcHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgZW1pdCBSX1BQQ19SRUwqIHJlbG9jcwotCWFnYWluc3QgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLgotIAkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdCBSX1BQQ19SRUwzMiByZWxvY3MgaW4KLQlzaGFyZWQgbGlicmFyaWVzIHdoaWNoIHJlZmVyIHRvIGxvY2FsIHN5bWJvbHMuICBNYWtlIHN1cmUgdGhhdCB0aGUKLQl0ZXN0IGZvciBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIHJlbG9jIGluIGEgc2hhcmVkIG9iamVjdCBpcyB0aGUKLQlzYW1lIGFzIHRoZSB0ZXN0IGZvciBlbWl0dGluZyBhIHJlbG9jLgotCi1UaHUgSmFuIDI5IDE1OjU1OjM1IDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuICA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdLSotbWluZ3czMiopOiBOZXcgdGFyZ2V0LgotCSogYWNpbmNsdWRlLm00IChCRkRfQklOQVJZX09QRU4pOiBDaGVjayBmb3IgbWluZ3czMi4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEphbiAyOCAxMzo0MToyNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCk6IE9ubHkgY2hlY2sgdGhlIHN0cnRhYiBpZiB3ZQotCWhhdmUgYSBiZmRfb2JqZWN0LgotCi1UdWUgSmFuIDI3IDIxOjQzOjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQlTcGFyYyB2OSBBQkkgY29tcGxpYW50IFBMVDoKLQkqIGVsZjY0LXNwYXJjLmMgKFBMVF9IRUFERVJfU0laRSk6IFY5IEFCSSB1c2VzIDQgZW50cmllcy4KLQkocGx0X3RlbXBsYXRlcywgc3BhcmM2NF9lbGZfYnVpbGRfcGx0X2VudHJ5KTogRGVsZXRlLgotCShMQVJHRV9QTFRfVEhSRVNIT0xEKTogTmV3IGRlZmluZS4KLQkoR09UX1JFU0VSVkVEX0VOVFJJRVMpOiBWOSBBQkkgb25seSB1c2VzIDEuCi0JKHNwYXJjNjRfZWxmX2J1aWxkX3BsdCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCk6IExpa2V3aXNlLgotCShzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCk6IExpa2V3aXNlLgotCShzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDaGFuZ2UgaC0+cGx0X29mZnNldCB0bwotCWNvbnRhaW4gdGhlIGluZGV4IGZvciBjb252ZW5pZW5jZS4gIFNraXAgdGhlIGluaXRpYWwgZW50cmllcwotCWluIC5yZWxhLnBsdC4KLQkoc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogWmVybyB0aGUgYWxsb2NhdGVkIGNvbnRlbnRzCi0JbWVtb3J5IGZvciB0aGUgYmVuZWZpdCBvZiAucmVsYS5wbHQuCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDYWxsIHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEtpbGwgdGVtcGxhdGUgc3R1ZmYuICBVc2UKLQlzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0ICYgc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQgZm9yIHJlbG9jLgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERUX1BMVEdPVCBwb2ludHMgdG8gLnBsdC4KLQlDYWxsIHNwYXJjNjRfZWxmX2J1aWxkX3BsdC4KLQkoZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0KTogTm8uCi0JKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IE5vLgotCShlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50KTogOC4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwKTogTmV3IGZ1bmN0aW9uOyBmcmVlIHRoZSBzaHN0cnRhYi4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXApOiBEZWNsYXJlIGl0LgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9jbG9zZV9hbmRfY2xlYW51cCk6IEFycmFuZ2UgZm9yIGl0Ci0JdG8gYmUgY2FsbGVkLgotCi1UdWUgSmFuIDI3IDIxOjQ1OjE1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbWlwcyopOiBBZGQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgTUlQUwotCXByb2Nlc3NvcnMuCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG1pcHMgdmFyaWFudHMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVR1ZSBKYW4gMjcgMTU6MDY6MDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFByZXNlcnZlIHRoZSBjb250ZW50cyBvZgotCXQyYTNfYl9pbnNuLgotCi1UdWUgSmFuIDI3IDEyOjQ3OjI3IDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LXNjbzMuMnY1Kik6IEVMRiBub3cgdGhlIGRlZmF1bHQuCi0JKGlbMzQ1Nl04NnNjbzMuMnY1KmNvZmYpOiBOZXcgdGFyZ2V0LgotCi1Nb24gSmFuIDI2IDE1OjQxOjMwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWxkIHdpdGggY2hhbmdlcyB0byBjaGV3LS10YWIgZXhwYW5zaW9uLgotCi1UaHUgSmFuIDIyIDIxOjI2OjQ4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfZ2V0X2Vycm9yX2hhbmRsZXIpOiBBZGQgb3J0aG9nb25hbCBmdW5jdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotVGh1IEphbiAyMiAyMToxMzozOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0ZWtoZXguYyAodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGZvciBubyBzeW1ib2xzLgotCi1XZWQgSmFuIDIxIDIxOjE5OjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IElmIENPRkZfV0lUSF9QRSwgZG9uJ3QKLSAJYWRqdXN0IGFkZGVuZCBmb3IgYW4gb3V0cHV0IGNvbW1vbiBzeW1ib2wgKGZyb20gSmltbXkgQmxhaXIKLSAJPGppbW15YkB3cnMuY29tPikuICBJZiBDT0ZGX1dJVEhfUEUsIGFkanVzdCBhZGRlbmQgZm9yIFBDIHJlbGF0aXZlCi0gCWRlZmluZWQgc3ltYm9sIHRvIGNvdW50ZXJhY3QgYWRqdXN0bWVudCBtYWRlIGluIGdlbmVyaWMgcmVsb2NhdGlvbgotIAljb2RlLgotCi0JKiBkd2FyZjIuYzogSW5jbHVkZSBzeXNkZXAuaCwgbm90IHN0ZGlvLmggYW5kIHN0ZGxpYi5oLgotCi1XZWQgSmFuIDIxIDIxOjE2OjA2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29mZi1tODhrLmMgKEdFVF9TQ05ESFJfTlJFTE9DKTogRml4IHR5cG8gaW4gbWFjcm8gbmFtZS4KLQkoR0VUX1NDTkRIUl9OTE5OTyk6IExpa2V3aXNlLgotCi1Nb24gSmFuIDE5IDEyOjQ5OjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LXNoLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBDb3JyZWN0IG5leHQgZmllbGQgb2Ygc2gzZS4KLQotV2VkIEphbiAxNCAxNzoyMzoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmM6IEFkZCBtYWNyb3MgdG8gaGFuZGxlIE5PUCBpbnNlcnRpb24uCi0KLVdlZCBKYW4gMTQgMTY6MTU6MjIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmtfc3ltYm9sKTogRG9uJ3QgbWFyayB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQkoeGNvZmZfbWFyayk6IExpa2V3aXNlLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBNYXJrIGFic29sdXRlIHN5bWJvbHMuCi0KLVdlZCBKYW4gMTQgMTY6MDM6MTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChiX291dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBTb3J0IHN5bWJvbHMgYmVmb3JlIG91dHB1dAotCXRvIGtlZXAge0NBTEwsQkFMfU5BTUUgc3ltYm9scyBhZGphY2VudC4KLQkoYl9vdXRfc3ltYm9sX2NtcCk6IE5ldyBmdW5jdGlvbi4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05Njk3Ci0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nLTkxOTMgYi9iZmQvQ2hhbmdlTG9nLTkxOTMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YWY5MzEuLjAwMDAwMDAKLS0tIGEvYmZkL0NoYW5nZUxvZy05MTkzCisrKyAvZGV2L251bGwKQEAgLTEsNzg1MSArMCwwIEBACi1GcmkgRGVjIDMxIDE2OjIzOjQzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCU1pbm9yIGNsZWFudXBzIHN1Z2dlc3RlZCBieSBDb2RlQ2VudGVyLgotCSogYW91dHguaCwgY29mZmdlbi5jLCBlY29mZi5jLCBlY29mZmxpbmsuYywgZWxmLmMsIGxpYmJmZC5jLAotCWxpbmtlci5jLCByZWxvYy5jLCBzZWN0aW9uLmMsIHNyZWMuYzogQWRkZWQgLypBUkdTVVNFRCovIGFzCi0JYXBwcm9wcmlhdGUuCi0JKiBhb3V0eC5oIChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyk6IFJlbW92ZWQgdW5uZWNlc3NhcnkgZGVjbGFyYXRpb24uCi0JKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogU2V0IHNvbWUgdGRhdGEgcG9pbnRlcnMgdG8gTlVMTC4KLQkoYWRqdXN0X3pfbWFnaWMpOiBSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUgZGF0YV92bWEuCi0JKHN0cmluZ3RhYl9pbml0KTogSW5pdGlhbGl6ZSBoYXNoX3plcm8uCi0JKGFkZF90b19zdHJpbmd0YWIpOiBSZW1vdmVkIHVudXNlZCBmb3VydGggYXJndW1lbnQuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogUmVtb3ZlZCB1c2VsZXNzIHZhcmlhYmxlCi0Jcl9hZGRlbmQuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogQWRkZWQgc29tZSBjYXN0cy4KLQkqIGFyY2hpdmUuYyAoZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lLCBkb19zbHVycF9jb2ZmX2FybWFwLAotCWJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtLCBic2Rfd3JpdGVfYXJtYXAsIGNvZmZfd3JpdGVfYXJtYXApOgotCU1pbm9yIGNvZGUgcmV3cml0aW5nIHRvIG1ha2UgaXQgbW9yZSBDIGxpa2UuCi0JKGRvX3NsdXJwX2JzZF9hcm1hcCk6IEFkZGVkIHNvbWUgY2FzdHMuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUKLQlzY25fYmFzZS4KLQkoZWNvZmZfd3JpdGVfYXJtYXApOiBBZGRlZCBzb21lIGNhc3RzLiAgVXNlICIiIHJhdGhlciB0aGFuICJcMCIuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnKTogQWRkZWQgYSBjYXN0LgotCSogbGliYW91dC5oIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk6IFJlbW92ZWQgdW5uZWNlc3NhcnkKLQlkZWNsYXJhdGlvbi4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlcik6IEFkZGVkIGEgY2FzdC4KLQkqIG9wbmNscy5jIChuZXdfYmZkKTogUmVtb3ZlZCBhIGNhc3QuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBZGRlZAotCXNvbWUgY2FzdHMuCi0JKiBzcmVjLmMgKGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlZCB1c2VsZXNzCi0JdmFyaWFibGUgYnl0ZXNfd3JpdHRlbi4KLQotRnJpIERlYyAzMSAxMTo0NjoxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGkzODZtYWNoMy5jIChOX1RYVEFERFIpOiBEb24ndCBkZWZpbmUgYWZ0ZXIgYWxsLgotCShURVhUX1NUQVJUX0FERFIpOiBEb24ndCBpbmNsdWRlIGV4ZWMgaGVhZGVyIHNpemUgaW4gdmFsdWUuCi0KLVRodSBEZWMgMzAgMTU6NDc6NTQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpMzg2bWFjaDMuYyAoTl9UWFRBRERSKTogRGVmaW5lLgotCi1UaHUgRGVjIDMwIDEzOjM3OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUV4dGVuc2l2ZSBjaGFuZ2VzIHRvIG1vdmUgdGhlIGJ1bGsgb2YgdGhlIGxpbmtlciBpbnRvIEJGRCBzbyB0aGF0Ci0JbW9yZSBlZmZpY2llbnQgYmFja2VuZCBjb2RlIGNhbiBiZSB3cml0dGVuIGZvciBzcGVjaWZpYyBvYmplY3QKLQlmaWxlcy4gIE9ubHkgZXhpc3RpbmcgZWZmaWNpZW50IGJhY2tlbmQgaXMgYS5vdXQuCi0JKiBzZWNsZXQuYywgc2VjbGV0Lmg6IFJlbW92ZWQuCi0JKiBoYXNoLmMsIGxpbmtlci5jLCBnZW5saW5rLmg6IE5ldyBmaWxlcy4KLQkqIGJmZC1pbi5oOiBSZW1vdmVkIGJmZF9lcnJvcl92ZWN0b3IuICBEZWNsYXJlZCBoYXNoIHRhYmxlCi0Jc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zLgotCShKVU1QX1RBQkxFKTogUmVtb3ZlZCBiZmRfc2VjbGV0X2xpbmssIGFkZGVkCi0JYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIGJmZF9saW5rX2FkZF9zeW1ib2xzIGFuZAotCWJmZF9maW5hbF9saW5rLgotCSogQWxsIGJhY2tlbmRzOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkZWQgbGlua19uZXh0IGFuZCBhcmNoaXZlX3Bhc3MgZmllbGRzLgotCVJlbW92ZWQgbGRfc3ltYm9scyBmaWVsZC4KLQkoYmZkX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwgYmZkX3VuZGVmaW5lZF9zeW1ib2wsCi0JYmZkX3JlbG9jX3ZhbHVlX3RydW5jYXRlZCwgYmZkX3JlbG9jX2lzX2Rhbmdlcm91cywKLQliZmRfZXJyb3JfdmVjdG9yKTogUmVtb3ZlZC4KLQkoYmZkX2RlZmF1bHRfZXJyb3JfdHJhcCwgYmZkX2Vycm9yX3RyYXAsCi0JYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibHRyYXApOiBSZW1vdmVkLgotCShiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUGFzcyBsaW5rX2luZm8uICBQYXNzCi0JbGlua19vcmRlciBpbnN0ZWFkIG9mIHNlY2xldC4gIFBhc3Mgc3ltYm9scy4KLQkoYmZkX3JlbGF4X3NlY3Rpb24pOiBQYXNzIGxpbmtfaW5mby4KLQkoYmZkX3NlY2xldF9saW5rKTogUmVtb3ZlZC4KLQkoYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIGJmZF9saW5rX2FkZF9zeW1ib2xzLAotCWJmZF9maW5hbF9saW5rKTogTmV3IG1hY3Jvcy4KLQkqIGxpYmJmZC1pbi5oOiBJZiBfX0dOVUNfXyBpcyBkZWZpbmVkIGFuZCBhbGxvY2EgaXMgbm90LCBkZWZpbmUKLQlhbGxvY2EgYXMgX19idWlsdGluX2FsbG9jYS4gIERlY2xhcmUgaW50ZXJuYWwgbGlua2luZyBmdW5jdGlvbnMuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IENvbW1lbnQgb3V0IGZzZWVrIGFzc2VydGlvbi4gIEl0J3Mgd29ya2VkCi0JZm9yIG1vbnRocy4KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBBZGRlZCBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50IHRvCi0Jc3BlY2lhbF9mdW5jdGlvbiBmaWVsZC4gIENoYW5nZWQgYWxsIGNhbGxlcnMgYW5kIGFsbCBkZWZpbml0aW9ucy4KLQkoYmZkX2dldF9yZWxvY19zaXplKTogTWFrZSBhcmd1bWVudCBhIGNvbnN0IHBvaW50ZXIuCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGQgZXJyb3JfbWVzc2FnZSBhcmd1bWVudCB0byBob2xkCi0Jc3RyaW5nIHNldCBpZiByZXR1cm4gdmFsdWUgaWYgYmZkX3JlbG9jX2Rhbmdlcm91cy4gIENoYW5nZWQgYWxsCi0JY2FsbGVycy4KLQkoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlLCBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHNlY3Rpb24uYyAoYXNlY3Rpb24pOiBSZW5hbWVkIHNlY2xldHNfaGVhZCBhbmQgc2VjbGV0c190YWlsIHRvCi0JbGlua19vcmRlcl9oZWFkIGFuZCBsaW5rX29yZGVyX3RhaWwuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZXBsYWNlZCBzZWNsZXQgYXJndW1lbnQgd2l0aCBsaW5rX2luZm8KLQlhbmQgbGlua19vcmRlciBhbmQgc3ltYm9scyBhcmd1bWVudHMgaW4KLQliZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLiAgQWRkZWQgc3ltYm9scyBhcmd1bWVudCB0bwotCWJmZF9yZWxheF9zZWN0aW9uLiAgUmVtb3ZlZCBiZmRfc2VjbGV0X2xpbmsuICBBZGRlZAotCWJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCBiZmRfbGlua19hZGRfc3ltYm9scyBhbmQKLQliZmRfZmluYWxfbGluay4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkZWQgZXh0ZXJuYWxfc3ltcywKLQlleHRlcm5hbF9zeW1fY291bnQsIGV4dGVybmFsX3N0cmluZ3MsIHN5bV9oYXNoZXMgZmllbGRzLgotCShvYmpfYW91dF9leHRlcm5hbF9zeW1zLCBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQsCi0Jb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncywgb2JqX2FvdXRfc3ltX2hhc2hlcyk6IE5ldyBhY2Nlc3NvcgotCW1hY3Jvcy4KLQkoV1JJVEVfSEVBREVSUyk6IE9ubHkgb3V0cHV0IHN5bWJvbHMgaWYgb3V0c3ltYm9scyBpcyBub3QgTlVMTC4KLQkqIGFvdXR4Lmg6IFdyb3RlIG5ldyBiYWNrIGVuZCBsaW5rZXIgcm91dGluZXMuCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuICBEb24ndCB1c2UKLQliZmRfZXJyb3JfdmVjdG9yLgotCShOQU1FKGFvdXQsd3JpdGVfc3ltcykpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4gIENoZWNrIHJldHVybiB2YWx1ZQotCW9mIHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIGFuZCBiZmRfd3JpdGUuCi0JKiBhb3V0LXRhcmdldC5oIChmaW5hbF9saW5rX2NhbGxiYWNrKTogTmV3IGZ1bmN0aW9uLgotCShNWV9iZmRfZmluYWxfbGluayk6IE5ldyBmdW5jdGlvbi4KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4KLQl2YWx1ZSBvZiBhb3V0XzMyX3dyaXRlX3N5bXMuCi0JKiBocDMwMGhwdXguYyAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYyAoV1JJVEVfSEVBREVSUyk6IExpa2V3aXNlLgotCSogbGliYW91dC5oIChXUklURV9IRUFERVJTKTogTGlrZXdpc2UuCi0JKiBib3V0LmM6IENoYW5nZWQgZnVuY3Rpb25zIHRvIHVzZSBsaW5rX2luZm8tPmNhbGxiYWNrcyByYXRoZXIKLQl0aGFuIGJmZF9lcnJvcl92ZWN0b3IsIGFuZCBsaW5rX29yZGVycyByYXRoZXIgdGhhbiBzZWNsZXRzLgotCSogY29mZi1hbHBoYS5jOiBMaWtld2lzZS4KLQkqIGNvZmYtaDgzMDAuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4NTAwLmM6IExpa2V3aXNlLgotCSogY29mZi1zaC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtejhrLmM6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExvb2sKLQl1cCBfZ3AgaW4gdGhlIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gaW4gb3V0c3ltYm9scy4KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogUGFzcyBlcnJvcnMgYmFjayBpbiBuZXcgZXJyb3JfbWVzc2FnZQotCWFyZ3VtZW50IHJhdGhlciB0aGFuIHByaW50aW5nIHRoZW0uCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogVGFrZSBsaW5rX2luZm8gYW5kCi0JbGlua19vcmRlciBhcmd1bWVudHMgcmF0aGVyIHRoYW4gc2VjbGV0LiAgQ2hhbmdlZCBhbGwgdXNlcyBhbmQKLQlkZWZpbml0aW9ucy4KLQkoYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSk6IFBhc3MgbGlua19pbmZvIGFyZ3VtZW50cy4gIENoYW5nZWQKLQlhbGwgdXNlcyBhbmQgZGVmaW5pdGlvbnMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBlY29mZi5jIChlY29mZl9nZXRfZXh0cik6IElmIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGxpbmtlciwgYnV0Ci0Jbm90IGJ5IEVDT0ZGLCBtYWtlIGl0IHNjQWJzLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IFJlbmFtZWQgZnJvbSBlY29mZl9iZmRfc2VjbGV0X2xpbmsgYW5kCi0JcmV3cml0dGVuLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogUmVuYW1lZCBmcm9tCi0JbWlwc19lbGZfc2VjbGV0X2xpbmsgYW5kIHJld3JpdHRlbi4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uKTogQWRkZWQgbGlua19pbmZvCi0JZmllbGQuCi0JKG5ld19zdHViLCBhZGRfc3R1Yl9ieV9uYW1lLCBocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1YiwKLQlocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViLCBocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOgotCUFkZGVkIGxpbmtfaW5mbyBhcmd1bWVudHMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgcXVpdCBpZiBvdXRzeW1ib2xzIGlzCi0Jbm90IE5VTEwuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IFJldHVybiBib29sZWFuIHZhbHVlIHJhdGhlciB0aGFuCi0JdXNpbmcgYmZkX2Vycm9yX3ZlY3Rvci4KLQkob2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0Jb2FzeXNfd3JpdGVfc2VjdGlvbnMuCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBEb24ndCBkZWNsYXJlIHFzb3J0IG9yIHN0cnRvbC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBSZW1vdmVkIHNlY2xldC5vLiAgQWRkZWQgaGFzaC5vIGFuZCBsaW5rZXIuby4KLQkoQ0ZJTEVTKTogUmVtb3ZlZCBzZWNsZXQuYy4gIEFkZGVkIGhhc2guYyBhbmQgbGlua2VyLmMuCi0JKEhGSUxFUyk6IFJlbW92ZWQgc2VjbGV0LmguICBBZGRlZCBnZW5saW5rLmguCi0KLVRodSBEZWMgMzAgMDc6NDE6MzYgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6ICBSZXR1cm4gemVybyBmaWxsZWQgYnVmZmVyCi0JaWYgc2VjdGlvbiBoYXMgbm8gY29udGVudHMuCi0KLVR1ZSBEZWMgMjggMTI6NDM6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2VsZl9nZW5lcmljX3JlbG9jKTogSWYgdGhpcyBpcyBub3QgYW4gaW5wbGFjZSByZWxvYywKLQl0aGVuIHNraXAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBldmVuIGlmIHRoZSBhZGRlbmQgaXMgbm9uLXplcm8uCi0KLVR1ZSBEZWMgMjEgMDk6MjI6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcykgW1NXQVBfT1VUX1JFTE9DX09GRlNFVF06IENvcHkKLQlhZGRlbmQgdG8gcl9vZmZzZXQgZmllbGQuCi0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGRlZCBjb2ZmLXNwYXJjLmMuICBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogY29mZi1zcGFyYy5jIChTV0FQX0lOX1JFTE9DX09GRlNFVCwgU1dBUF9PVVRfUkVMT0NfT0ZGU0VULAotCUNBTENfQURERU5EKTogRGVmaW5lLgotCi0JKiBhaXgzODYtY29yZS5jIChhaXgzODZfY29yZV9maWxlX3ApOiBVc2UgY2RfcmVnc1swXSBmb3IgY29tcHV0aW5nCi0JdGhlIG9mZnNldG9mIGJlY2F1c2UgQUlYIC9iaW4vY2MgZG9lcyBub3QgbGlrZSB0byB0YWtlIHRoZSBhZGRyZXNzCi0Jb2YgYW4gYXJyYXkuICAoRnJvbSBNaW5oIFRyYW4tTGUuKQotCi1UaHUgRGVjIDE2IDEzOjA2OjMyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBUaHUgRGVjIDE2IDE1OjQxOjA2IDE5OTMgIFBldGVyIEhvb2dlbmJvb20gIChob29nZW5AY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBNYWtlIHN1cmUgdG8gY29weQotCXRoZSByZXR1cm4gcG9pbnRlciBpbnRvICVyMiBpZiBubyBqdW1wLWluLWNhbGwtZGVsYXktc2xvdAotCW9wdGltaXphdGlvbiB3YXMgZG9uZS4KLQotCSogaG9zdHMvaHAzMDBic2QuaDogQ29ycmVjdGx5IGlkZW50aWZ5IDQuM0JTRCB2cyA0LjRCU0QuCi0KLVdlZCBEZWMgMTUgMDg6MDQ6MTYgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiAodGltZSk6IERvbid0IGRlY2xhcmU7IGNvbmZsaWN0cyBvbiBNYWNoMy4KLQotCSogaG9zdHMvaTM4Nm1hY2gzLmggKEhPU1RfUEFHRV9TSVpFKTogU2V0IHRvIDEgdG8gYXZvaWQgcGFkZGluZy4KLQkoSE9TVF9TRUdNRU5UX1NJWkUpOiBTZXQgdG8gMCBmb3Igc2FtZSByZWFzb24uCi0KLQkqIGkzODZtYWNoMy5jIChQQUdFX1NJWkUsIFNFR01FTlRfU0laRSk6IFNhbWUgY2hhbmdlcyBhcyBhYm92ZS4KLQkoVEVYVF9TVEFSVF9BRERSKTogQ29ycmVjdC4KLQkoTVlfYmFja2VuZF9kYXRhKTogRGVmaW5lLgotCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYywgYWRqdXN0X3pfbWFnaWMsIGFkanVzdF9uX21hZ2ljKToKLQlOZXcgZnVuY3Rpb25zOyBjb2RlIG1vdmVkIGZyb20gYW91dF88c2l6ZT5fYWRqdXN0X3NpemVzX2FuZF92bWFzLgotCi1UdWUgRGVjIDE0IDIxOjQ4OjMzIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRml4IHRoaW5rb3MgaW4gYXV4aWxpYXJ5IGhlYWRlcgotCXN1cHBvcnQuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBMaWtld2lzZS4KLQotTW9uIERlYyAxMyAyMzozNDo0OCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSAnVCcgZmllbGQKLQlzZWxlY3RvcnMgZm9yIFBJQyBjb2RlLgotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgJ1QnIGZpZWxkIHNlbGVjdG9ycy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0RMVF9SRUwsIFJfRlNFTCwgUl9SU0VMLCBSX0xTRUwKLQlyZWxvY2F0aW9ucyBuZWVkZWQgYnkgUElDLgotCi1UdWUgRGVjICA3IDE1OjQ3OjUxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaDogIEZpeGVzIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLi4uCi0KLVR1ZSBEZWMgIDcgMTU6MTA6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaWJubG0uaCAobmxtX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgbWFjcm8gZGVmaW5pdGlvbi4KLQkobmxtX2FscGhhX2JhY2tlbmRfZGF0YSk6IEFkanVzdGVkIGFjY29yZGluZ2x5LgotCi1TdW4gRGVjICA1IDE5OjMyOjA4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGbGVzaCBvdXQgY29kZSBmb3IgaGFuZGxpbmcgc2ltcGxlCi0JYXV4aWxpYXJ5IGhlYWRlcnMuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tZGF0YSk6IEFkZCBmaWVsZHMgZm9yIGF0dGFjaGluZyB2ZXJzaW9uIGFuZAotCWNvcHlyaWdodCBoZWFkZXJzLiAgQWRkIGFjY2Vzc29yIG1hY3Jvcy4KLQotCSogc29tLmMgKFJfRExUX1JFTCwgUl9BVVhfVU5XSU5ELCBSX1NFQ19TVE1UKTogQWRkIHByb3RlY3RlZAotCWRlZmluaXRpb25zIGZvciBvbGQgdmVyc2lvbnMgb2YgSFBVWCB3aGljaCBmYWlsIHRvIGRlZmluZSB0aGVtLgotCShzb21faHBwYV9ob3d0b190YWxiZSk6IEFkZCBSX0RMVF9SRUwsIFJfQVVYX1VOV0lORCwgYW5kIFJfU0VDX1NUTVQKLQlub3cgdGhhdCB0aGV5J3JlIHNhZmUuICBEZWxldGUgYm9ndXMgUl9TVEFURU1FTlQgcmVsb2NhdGlvbnMuCi0KLQkqIHNvbS5jIChzb21faHBwYV9ob3d0b190YWJsZSk6IEFkZCBtaXNzaW5nIFJfRU5EX1RSWS4gIERlbGV0ZSAKLQlleHRyYSBSX0RBVEFfT1ZFUlJJREUuCi0JKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogR2VuZXJhdGUgYSByZWxvY2F0aW9uIGZvciB0aGUgcm91bmRpbmcKLQltb2RlIHNlbGVjdG9yIGlmIG5lZWRlZC4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSByZXF1ZXN0cyBmb3IgYSBjaGFuZ2UgaW4gdGhlIGRlZmF1bHQKLQlyb3VuZGluZyBtb2RlLiAgUm91bmRpbmcgbW9kZXMgZG8gbm90IGNvbnN1bWUgaW5wdXQgYnl0ZXMsIGJ1dAotCWFyZSBqdXN0IG1hcmtlcnMgbXVjaCBsaWtlIFJfRU5UUlkgYW5kIFJfRVhJVC4KLQotU2F0IERlYyAgNCAxOTo0MDozMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCUZyaSBEZWMgIDMgMDk6NTU6MTcgMTk5MyAgUGV0ZSBIb29nZW5ib29tICAoaG9vZ2VuQGNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvYyk6ICBEbyBub3QgZG8gY29kZSByZW9yZGVyaW5nIHdoZW4KLQl0aGUgYnJhbmNoIGluc3RydWN0aW9uIGFzIG9yaWdpbmFsbHkgYmVlbiBudWxsaWZpZWQuCi0JaHBwYV9lbGZfcmVsb2MpOiAgQXZvaWQgdXNlbGVzcyBjYWxsIHRvIGJmZF9wdXRfMzIgKCkgaW4gdGhlCi0JY2FzZSBvZiBubyBjb2RlIHJlb3JkZXJpbmcgZHVlIHRvIGFuIExETyBpbnN0cnVjdGlvbiBpbiB0aGUKLQlkZWxheSBzbG90IG9mIHRoZSBicmFuY2guICBNYWtlIHN1cmUgdG8gcmVsb2NhdGUgdGhlIGNvcnJlY3QKLQlpbnN0cnVjdGlvbi4gIERvIG5vdCBwZXJmb3JtIGluc3RydWN0aW9uIHJlb3JkZXJpbmcgZm9yIG1pbGxpY29kZQotCWNhbGxzLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6ICBDaGFuZ2UgdGhlIHJlbG9jYXRpb24gdHlwZQotCXRvIFJfSFBQQV9TVFVCX0NBTExfMTcgd2hlbiBzcGVjaWFsIHByb2Nlc3NpbmcgbWlnaHQgYmUgbmVlZGVkLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogUHJldmVudCBjb2RlIHJlb3JkZXJpbmcgb24KLQlhIGNhbGwgZnJvbSBhIGxpbmtlciBzdHViIHRvIGFub3RoZXIgbGlua2VyIHN0dWIgYW5kIGZvciBtaWxsaWNvZGUKLQljYWxscy4gIERvIG5vdCB0cmFzaCB0aGUgcmV0dXJuIHJlZ2lzdGVyIGZvciBjYWxscyBmcm9tIG9uZSBsaW5rZXIKLQlzdHViIHRvIGEgc2Vjb25kIGxpbmtlciBzdHViLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGZfaHBwYV9ob3d0b190YWJsZSk6ICBQTEFCRUwgYW5kIERMVAotCXJlbG9jYXRpb25zIGFyZSBub3QgcGMtcmVsYXRpdmUuCi0KLQkqIGhwcGFfc3R1YnMuaDogKEJMRV9OX1hYWF8wXzMxKTogIE5ldyBpbnN0cnVjdGlvbiB1c2VkIGluCi0JbGlua2VyIHN0dWIgY29kZS4gCi0JKENPUFlfMl8zMSk6ICBMaWtld2lzZS4KLQotRnJpIERlYyAgMyAxODo0MDo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCAoSERFRklORVMpOiBSZW1vdmUgLURjb25zdD0KLQkqIGhvc3RzL3NvbGFyaXMuaDogSWYgbm90IF9fR05VQ19fLCBkZWZpbmUgY29uc3QgYXMgZW1wdHkuCi0KLVRodSBEZWMgIDIgMTU6NDM6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jOiBBZGRlZCB2YXJpb3VzIGNhc3RzIGZvciAzMi82NCBiaXQgY3Jvc3MgdGFyZ2V0aW5nLgotCShlY29mZl9ta29iamVjdF9ob29rKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgdGhlIC5yZWdpbmZvCi0Jc2VjdGlvbiBzbyB0aGF0IHRoZSBsaW5rZXIgaWdub3JlcyBpdC4KLQkqIGVjb2ZmbGluay5jOiBBZGRlZCB2YXJpb3VzIGNhc3RzIGZvciAzMi82NCBiaXQgY3Jvc3MgdGFyZ2V0aW5nLgotCShlY29mZl9hZGRfYnl0ZXMpOiBDaGFuZ2VkIG5lZWQgYXJndW1lbnQgdG8gc2l6ZV90LgotCShiZmRfZWNvZmZfZGVidWdfbGlua19vdGhlcik6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWVjb2ZmX2FkZF9zdHJpbmcuCi0KLQkqIGxpYmJmZC1pbi5oIChuZXdfYmZkKTogVXNlIHZvaWQgcmF0aGVyIHRoYW4gYW4gZW1wdHkgcGFyYW1ldGVyCi0JbGlzdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9vYmpfdGRhdGEpOiBOZXcgZmllbGQgYmFja2VuZF9kYXRhLgotCShubG1fYmFja2VuZF9kYXRhLCBubG1fYWxwaGFfYmFja2VuZF9kYXRhKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGQgbm9fdW5pbml0aWFsaXplZF9kYXRhLgotCShubG1fbm9fdW5pbml0aWFsaXplZF9kYXRhKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogbmxtY29kZS5oIChubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSGFuZGxlCi0Jbm9fdW5pbml0aWFsaXplZF9kYXRhLgotCShubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSk6IFNvcnQgcmVsb2NzIGJ5IGFkZHJlc3MgZm9yIGEKLQlwYXJ0aWN1bGFyIHN5bWJvbCwgdG8gbWFrZSB0aGUgc29ydCBtb3JlIHN0YWJsZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhc3QgdGhlIGFyZ3VtZW50cyB0byBxc29ydC4gIEdldCB0aGUKLQl2YWx1ZSBvZiBhIGRlYnVnZ2luZyBzeW1ib2wgdGhlIHNhbWUgd2F5IHdlIGdldCB0aGUgdmFsdWUgb2YgYQotCW5vcm1hbCBzeW1ib2wuCi0JKiBubG0zMi1hbHBoYS5jOiBWYXJpb3VzIGNoYW5nZXMuICBXcml0ZSBvdXQgR1AgYW5kIC5saXRhIHJlbG9jcy4KLQlTZXQgbm9fdW5pbml0aWFsaXplZF9kYXRhIHRvIHRydWUuCi0JKiBubG0zMi1pMzg2LmMgKG5sbTMyX2kzODZfYmFja2VuZCksIG5sbTMyLXNwYXJjLmMKLQkobmxtMzJfc3BhcmNfYmFja2VuZCk6IFNldCBub191bmluaXRpYWxpemVkX2RhdGEgZmllbGQgZmFsc2UuCi0JKiBubG1zd2FwLmggKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQpOiBaZXJvIG91dCBkZXN0aW5hdGlvbgotCWJlZm9yZSBmaWxsaW5nIGl0IGluLgotCi1XZWQgRGVjICAxIDIxOjQ3OjU4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NlY3Rpb25fdHlwZSwgc29tX2RlY29kZV9zeW1jYWxzcyk6IE5ldyBmdW5jdGlvbnMuCi0JKHNvbV9nZXRfc3ltYm9sX2luZm8pOiBVc2UgdGhlbS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCB0aGUgc2VjdGlvbiBvZiBjb21tb24gYW5kIHVuZGVmaW5lZAotCXN5bWJvbHMgY29ycmVjdGx5LgotCi1XZWQgRGVjICAxIDE0OjE1OjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEluaXRpYWxpemUgbG9jYWwgdmFyIExBU1RfU1lNX0lEWCwgdG8KLQltYWtlIGdjYyBoYXBweS4KLQotCSogbWlwc2JzZC5jOiBDaGFuZ2VzIGZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKG1pcHNfaG93dG9fdGFibGVfZXh0KTogTUlQU19SRUxPQ19MTzE2IHNob3VsZCB1c2UKLQljb21wbGFpbl9vdmVyZmxvd19kb250LgotCShhb3V0X21pcHNfKl92ZWMpOiBNYWtlIG5hbWUgdXNlICJhLm91dCIgaW5zdGVhZCBvZiAiYW91dCIsIHRvCi0JbWFrZSBnZGIgaGFwcHkuCi0KLQkqIGJmZC5jIChiZmRfZXJybXNncyk6IFJld29yZCBpbnZhbGlkLXRhcmdldCBtZXNzYWdlLgotCi0JKiBjb25maWcuYmZkOiBGb3Igc3BhcmMqLSotY29mZiwgdXNlIHNwYXJjLWNvZmYuCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBzcGFyY2NvZmZfdmVjLgotCSogdGFyZ2V0cy5jIChzcGFyY2NvZmZfdmVjKTogRGVjbGFyZS4KLQotCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogTmV3IGZ1bmN0aW9uLgotCShzdHJ1Y3QgcmVsb2NfaG93dG9fdHlwZSk6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIG9mIHNpemUgZmllbGQuCi0KLVdlZCBEZWMgIDEgMTQ6Mzk6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG0zMi1hbHBoYS5jOiBOZXcgZmlsZTsgcHJlbGltaW5hcnkgQWxwaGEgTmV0V2FyZSBzdXBwb3J0LgotCSogY29uZmlnLmJmZCAoYWxwaGEtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQ7IHVzZSBhbHBoYS1ubG0uCi0JKiBjb25maWcvYWxwaGEtbmxtLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAobmxtMzJfYWxwaGFfdmVjKTogTmV3IHZlY3RvcjsgdXNlIG5sbTMyLWFscGhhLm8sCi0JbmxtMzIubywgYW5kIG5sbS5vLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkZWQgbmxtMzItYWxwaGEuby4KLQkoQ0ZJTEVTKTogQWRkZWQgbmxtMzItYWxwaGEuYy4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkqIHRhcmdldHMuYyAobmxtMzJfYWxwaGFfdmVjKTogRGVjbGFyZS4KLQotCSogbGlibmxtLmggKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkcwotCW9wdGlvbmFsX3ByZWZpeF9zaXplLCBubG1fYmFja2VuZF9vYmplY3RfcCwgbmxtX3dyaXRlX3ByZWZpeCwKLQlubG1fc2V0X3B1YmxpY19zZWN0aW9uLCBubG1fZ2V0X3B1YmxpY19vZmZzZXQuICBSZW1vdmVkIHVudXNlZAotCW5sbV93cml0ZV9yZWxvYyBmaWVsZC4gIENoYW5nZWQgbmxtX3dyaXRlX2ltcG9ydCB0byByZW1vdmUKLQl1bm5lY2Vzc2FyeSBzeW1ib2wgYXJndW1lbnQuICBSZW5hbWVkIG5sbV93cml0ZV9leHRlcm5hbHMgdG8KLQlubG1fd3JpdGVfZXh0ZXJuYWwsIGFuZCBjaGFuZ2VkIGNvdW5kIGFyZ3VtZW50IGZyb20gYmZkX3ZtYSB0bwotCWJmZF9zaXplX3R5cGUuCi0JKG5sbV9vcHRpb25hbF9wcmVmaXhfc2l6ZSwgbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYywKLQlubG1fd3JpdGVfcHJlZml4X2Z1bmMsIG5sbV9zZXRfcHVibGljX3NlY3Rpb25fZnVuYywKLQlubG1fZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyk6IE5ldyBhY2Nlc3NvciBtYWNyb3MuCi0JKG5sbV93cml0ZV9yZWxvY19mdW5jKTogUmVtb3ZlZC4KLQkobmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMpOiBBZGp1c3RlZCBmb3IgZmllbGQgcmVuYW1pbmcuCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3dyaXRlX2ltcG9ydCk6IFJlbmFtZWQgZnJvbQotCW5sbV9pMzg2X3dyaXRlX3JlbG9jLiAgUmVtb3ZlZCBvbGQgbmxtX2kzODZfd3JpdGVfaW1wb3J0IHdoaWNoCi0JanVzdCBjYWxsZWQgb2xkIG5sbV9pMzg2X3dyaXRlX3JlbG9jLgotCShubG1faTM4Nl93cml0ZV9leHRlcm5hbCk6IFJlbmFtZWQgZnJvbSBubG1faTM4Nl93cml0ZV9leHRlcm5hbHMuCi0JRGVjbGFyZWQuICBDaGFuZ2VkIHNlY29uZCBhcmd1bWVudCBmcm9tIGJmZF92bWEgdG8gYmZkX3NpemVfdHlwZS4KLQkobmxtMzJfaTM4Nl9iYWNrZW5kKTogQWRqdXN0ZWQgZm9yIGNoYW5nZXMgdG8gZmllbGRzIGFuZCBuYW1lcy4KLQkqIG5sbTMyLXNwYXJjLmMgKG5sbV9zcGFyY19tYW5nbGVfcmVsb2NzKTogUmVtb3ZlZCB1bnVzZWQsCi0JaWZkZWZmZWQgb3V0IGNvZGUuCi0JKG5sbV9zcGFyY193cml0ZV9pbXBvcnQpOiBSZW1vdmVkIHNlY29uZCBhcmd1bWVudC4KLQkobmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsKTogUmVuYW1lZCBmcm9tCi0JbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFscy4gIENoYW5nZWQgc2Vjb25kIGFyZ3VtZW50IGZyb20gYmZkX3ZtYQotCXRvIGJmZF9zaXplX3R5cGUuCi0JKG5sbTMyX3NwYXJjX2JhY2tlbmQpOiBBZGp1c3RlZCBmb3IgY2hhbmdlcyB0byBmaWVsZHMgYW5kIG5hbWVzLgotCSogbmxtY29kZS5oOiBSZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCi0JKG5sbV9vYmplY3RfcCk6IERvbid0IGRlc3Ryb3kgdGRhdGEgcG9pbnRlci4gIENhbGwKLQliYWNrZW5kX29iamVjdF9wIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cy4KLQkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIHJjb3VudC4gIENhbGwKLQlzZXRfcHVibGljX3NlY3Rpb25fZnVuYyBpZiBpdCBleGlzdHMgaW5zdGVhZCBvZiBjaGVja2luZwotCU5MTV9ISUJJVC4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFjY291bnQgZm9yCi0Jb3B0aW9uYWxfcHJlZml4X3NpemUuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBBY2NvdW50IGZvciBvcHRpb25hbF9wcmVmaXhfc2l6ZS4KLQlSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUgd3JpdGVfcmVsb2NfZnVuYy4gIENoYW5nZWQgZGVjbGFyYXRpb24KLQlhbmQgY2FsbCBvZiB3cml0ZV9pbXBvcnRfZnVuYy4gIENhbGwgd3JpdGVfcHJlZml4X2Z1bmMgaWYgaXQKLQlleGlzdHMuICBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMgbGVuIGFuZCB0ZW1wLiAgQ2FsbAotCWdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMgaWYgaXQgZXhpc3RzIHJhdGhlciB0aGFuIHNldHRpbmcgTkxNX0hJQklULgotCSogbmxtc3dhcC5oOiBEZWNsYXJlIGZ1bmN0aW9ucy4KLQotCSogYmZkLWluLmggKHVpbnQ2NF90eXBlTE9XLCB1aW50NjRfdHlwZUhJR0gpOiBGdWxseSBwYXJlbnRoZXNpemUKLQlmb3IgY2xhcml0eS4KLQkoZnByaW50Zl92bWEsIHNwcmludGZfdm1hKTogVXNlICVseCwgbm90ICV4LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogaG9zdHMvYWxwaGFvc2YuaCAodWludDY0X3R5cGVMT1csIHVpbnQ2NF90eXBlSElHSCk6IENhc3QgcmVzdWx0cwotCXRvIHVuc2lnbmVkIGxvbmcuCi0KLQkqIGNvbmZpZy5iZmQ6IERvbid0IHNldCB0YXJnZXQ2NCBoZXJlLCBhcyB0aGUgc2V0dGluZyBpcyBpZ25vcmVkLgotCSogY29uZmlndXJlLmluIChlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBTZXQgdGFyZ2V0NjQuCi0KLQkqIGNvbmZpZy9hbHBoYW9zZi5tdCAoVERFRklORVMpOiBSZW1vdmVkOyBzZXR0aW5nIGhvc3QgcGFyYW1ldGVycwotCWluIFRERUZJTkVTIGlzIHdyb25nLgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBvdXRwdXRfc2VjdGlvbi4KLQotVHVlIE5vdiAzMCAxNjo0NToyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGlyaXgtY29yZS5jOiBOZXcgZmlsZSBmb3IgSXJpeCA0IGFuZCBJcml4IDUgY29yZSBzdXBwb3J0LgotCUZ1bmN0aW9ucyB0YWtlbiBvdXQgb2YgY29mZi1taXBzLmMuICBIYW5kbGUgdm1hcCB0eXBlIFZNQVBGSUxFLgotCSogY29mZi1taXBzLmM6IElyaXggNCBjb3JlIGZpbGUgc3VwcG9ydCBtb3ZlZCB0byBpcml4LWNvcmUuYy4KLQkqIHRhcmdldHMuYzogSWYgSVJJWF9DT1JFIGRlZmluZWQsIGluY2x1ZGUgaXJpeF9jb3JlX3ZlYyBpbgotCXRhcmdldF92ZWN0b3IuCi0JKiBjb25maWcvaXJpeDQubWggKEhERUZJTkVTKTogQWRkIC1ESVJJWF9DT1JFLgotCShIREVQRklMRVMpOiBEZWZpbmUgdG8gYmUgaXJpeC1jb3JlLm8uCi0JKiBjb25maWcvaXJpeDUubWggKEhERUZJTkVTKTogRGVmaW5lIHRvIGJlIC1ESVJJWF9DT1JFLgotCShIREVQRklMRVMpOiBEZWZpbmUgdG8gYmUgaXJpeC1jb3JlLm8uCi0JKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiBBZGRlZCBpcml4LWNvcmUuby4gIFJlbW92ZWQKLQlzY28tY29yZS5vLCB3aGljaCBubyBsb25nZXIgZXhpc3RzLgotCShDRklMRVMpOiBBZGRlZCBhbGwgKi1jb3JlLmMgZmlsZXMuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLVdlZCBOb3YgMjQgMDI6MDI6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogUmVzdG9yZSBjaGVjayBvZiBmaWxlX3NpemUgIT0KLQltZW1fc2l6ZSwgYnV0IG9ubHkgaWYgU0hUX1BST0dCSVRTLgotCi0JKiBlY29mZmxpbmsuYzogTmV3IGZpbGUgdG8gaG9sZCBFQ09GRiBkZWJ1ZyBpbmZvcm1hdGlvbiBsaW5raW5nCi0Jcm91dGluZXMuCi0JKiBlY29mZi5jIChlY29mZl9jbGVhcl9vdXRwdXRfZmxhZ3MsIGVjb2ZmX3JlbCwgZWNvZmZfZHVtcF9zZWNsZXQsCi0JZWNvZmZfYWRkX3N0cmluZywgZWNvZmZfZ2V0X2RlYnVnKTogUmVtb3ZlZC4gIEZ1bmN0aW9uYWxpdHkgbm93IGluCi0JZWNvZmZsaW5rLmMuCi0JKGVjb2ZmX2dldF9leHRyLCBlY29mZl9zZXRfaW5kZXgpOiBOZXcgZnVuY3Rpb25zLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogRG9uJ3Qgc2F2ZSByYXdfc2l6ZS4KLQkoZWNvZmZfYmZkX3NlY2xldF9saW5rKTogUmV3cm90ZSB0byB1c2UgZWNvZmZsaW5rLmMgZnVuY3Rpb25zLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEb24ndCBzZXQgRVhFQ19QIGp1c3QKLQliZWNhdXNlIHRoZXJlIGlzIGEgc3RhcnQgYWRkcmVzcy4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGV4dGVybmFsIHN5bWJvbHMgaGVyZS4gIFVzZQotCWVjb2ZmbGluay5jIGZ1bmN0aW9ucyB0byB3cml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8sIG1pcHNfZWxmX2dldF9leHRyLAotCW1pcHNfZWxmX3NldF9pbmRleCk6IE5ldyBmdW5jdGlvbnMuCi0JKG1pcHNfZWxmX3NlY2xldF9saW5rKTogRGlzY2FyZCBlbXB0eSBzZWN0aW9ucywgdGhlIC5vcHRpb25zCi0Jc2VjdGlvbiBhbmQgLmdwdGFiIHNlY3Rpb25zLiAgSGFuZGxlIGxpbmtpbmcgLm1kZWJ1ZyBzZWN0aW9uLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogUmVtb3ZlZCByYXdfc2l6ZSBhbmQgaWZkYmFzZS4KLQkqIGxpYmVsZi5oIChlbGZfc3ltYm9sX3R5cGUpOiBBZGRlZCBtaXBzX2V4dHIgdG8gdGNfZGF0YSB1bmlvbi4KLQkqIGJmZC1pbi5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciByb3V0aW5lcyBpbiBlY29mZmxpbmsuYyAoc29tZSBhcmUKLQljYWxsZWQgYnkgZ2FzLCBzbyB0aGV5IGFyZSBwdWJsaWMpLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWRkZWQgZWNvZmZsaW5rLm8uCi0JKENGSUxFUyk6IEFkZGVkIGVjb2ZmbGluay5jLgotCShlY29mZmxpbmsubyk6IE5ldyB0YXJnZXQuICBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotTW9uIE5vdiAyMiAyMjoyNjo0MiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGhwcGFfb2JqZWN0X3ApOiBBbHNvIHJlY29nbml6ZSBTSEFSRURfTUFHSUNfQ05YIGFzCi0JYSB2YWxpZCBtYWdpYyBudW1iZXIgaWYgaXQncyBiZWVuIGRlZmluZWQuCi0KLU1vbiBOb3YgMjIgMTQ6MTc6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdCk6IERvbid0IGNyZWF0ZSAuc2NvbW1vbiBzZWN0aW9uOyBsaW5rZXIKLQlubyBsb25nZXIgcmVxdWlyZXMgaXQuCi0JKGVjb2ZmX2JmZF9zZWNsZXRfbGluaywgZWNvZmZfc2l6ZW9mX2hlYWRlcnMsCi0JZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgdHJlYXQgLnNjb21tb24gc2VjdGlvbgotCXNwZWNpYWxseS4KLQotTW9uIE5vdiAyMiAxMDo1NDoyNyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20ga2V2QHNwdWRzLmdlZy5tb3QuY29tIChLZXZpbiBBLiBCdWV0dG5lcik6Ci0JKiBiZmQvY29uZmlnL2RlbHRhODgubWggKEhERUZJTkVTKTogRGVmaW5lIHRoaXMgdG8gYmUgLURQVFJBQ0VfQ09SRS4KLQkqIGJmZC9jb25maWcvZGVsdGE4OC5taCAoSERFUEZJTEVTKTogRGVmaW5lZCB0byBiZSBwdHJhY2UtY29yZS5vLgotCSogYmZkL3B0cmFjZS1jb3JlLmM6ICBOZXcgZmlsZSBmb3IgZGVhbGluZyB3aXRoIGNvcmUgZmlsZXMgd2l0aAotCXN0YXJ0IHdpdGggdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSBmb3VuZCBvbiBCQ1MgY29tcGxpYW50IHN5c3RlbXMuCi0JKiBiZmQvdGFyZ2V0cy5jIChwdHJhY2VfY29yZV92ZWMpOiAgTmV3IHZlY3Rvci4KLQotTW9uIE5vdiAyMiAwMjozMzoxMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWluaW1hbCBzdXBwb3J0IGZvciByZWFkaW5nIFNPTSBmaXh1cCBzdHJlYW1zLiAgQWxsb3dzCi0Jb2JqZHVtcCAtciB0byBkbyBzb21ldGhpbmcgcmVhc29uYWJsZS4KLQkqIHNvbS5jIChzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogSW1wbGVtZW50LgotCShzb21fY2Fub25pY2FsaXplX3JlbG9jKTogSW1wbGVtZW50LgotCShzb21fc2V0X3JlbG9jX2luZm8sIHNvbV9zbHVycF9yZWxvY190YWJsZSk6IE5ldyBmdW5jdGlvbnMuCi0KLVN1biBOb3YgMjEgMTM6NDY6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBob3N0cy9seW54LmggKEZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRCk6IERlZmluZS4KLQkqIGhvc3RzL3NwYXJjbHlueC5oOiBJbmNsdWRlIGx5bnguaCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0LgotCi1GcmkgTm92IDE5IDE0OjM0OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBGb3IgUl9JUkVMLCBkb24ndCBsZWZ0IHNoaWZ0Ci0Jc2lnbmVkX3ZhbHVlIGJlZm9yZSBzaWduIGV4dGVuZGluZyBpdC4gIERvbid0IHN1YnRyYWN0IG91dAotCXJlbG9jX2VudHJ5LT5hZGRyZXNzLiAgVGhpcyBtYWtlcyBpdCBjb21wYXRpYmxlIHdpdGggd2hhdCBnYXMgaXMKLQlnZW5lcmF0aW5nLgotCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQWNjZXB0IC5zYnNzIGFzIHRoZSBuYW1lIGZvciBhCi0JU0hUX05PQklUUyBzZWN0aW9ucy4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBEb24ndCBsZWF2ZSB0aGUgbG9vcCBhZnRlciB0aGUgZmlyc3QKLQlTSFRfTk9CSVRTIHNlY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogT25seSBmb3JjZSBzaF9vZmZzZXQgYW5kCi0Jc2hfYWRkciB0byBtYXRjaCBtb2R1bG8gbWF4cGFnZXNpemUgZm9yIGEgc2VjdGlvbiB3aGljaCBpcyBub3QKLQlTSFRfTk9CSVRTLiAgQ2hhbmdlZCB0aGUgbWV0aG9kIHVzZWQgdG8gZm9yY2UgcGFnZSBhbGlnbm1lbnQgYWZ0ZXIKLQlhIFNIVF9OT0JJVFMgc2VjdGlvbiB0byBvbmx5IGRvIGl0IGZvciB0aGUgbGFzdCBzdWNoIGNvbnNlY3V0aXZlCi0Jc2VjdGlvbiwgYW5kIHRvIHJlYWxseSBmb3JjZSBwYWdlIGFsaWdubWVudC4KLQotRnJpIE5vdiAxOSAwNDowMjowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUHJpbnQgbW9yZSB2ZXJib3NlIG1lc3NhZ2UKLQlpbiB0aGUgY2FzZSBvZiBhbiB1bmtub3duIChvciB1bmhhbmRsZWQpIHN0b3JhZ2UgY2xhc3MuCi0KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQgKFRERUZJTkVTKTogRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVEIHNob3VsZAotCW5vdCBiZSBkZWZpbmVkIGhlcmUsIHNpbmNlIGl0IGlzIGEgaG9zdCBhdHRyaWJ1dGUsIG5vdCBhIHRhcmdldAotCW9uZS4KLQkqIGNvbmZpZy9tNjhrLWx5bngubXQsIGNvbmZpZy9zcGFyYy1seW54Lm10OiBEaXR0by4KLQotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeQotCWRlZmluZWQuCi0KLQkqIGNvZmYtc3BhcmMuYzogRGVmaW5lIHNvbWUgcmVsb2NhdGlvbnMsIGJhc2VkIG9uIEVMRiByZWxvY2F0aW9ucy4KLQkoZW51bSByZWxvY190eXBlLCBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlLAotCXN0cnVjdCBjb2ZmX3JlbG9jX21hcCwgc3BhcmNfcmVsb2NfbWFwLAotCWNvZmZfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXApOiBCb3Jyb3dlZCBmcm9tIGVsZjMyLXNwYXJjLmMgYW5kCi0JZWxmLmMsIHJlbmFtZWQuCi0JKGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lIHRvIGJlIGNvZmZfc3BhcmNfcmVsb2NfLi4uLgotCShydHlwZTJob3d0byk6IEluZGV4IGludG8gY29mZl9zcGFyY19ob3d0b190YWJsZSB1c2luZwotCWRzdC0+cl90eXBlLgotCi1UaHUgTm92IDE4IDExOjQ1OjM5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1pcml4NSopOiBOZXcgdGFyZ2V0OyB1c2UgbWlwc2JlbGYuCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcy1zZ2ktaXJpeDUqKSBOZXcgaG9zdDsgdXNlIGlyaXg1IChubwotCWhvc3RzL2lyaXg1LmggY3JlYXRlZDsganVzdCB1c2Ugc3RkLWhvc3QuaCkuCi0JKiBjb25maWcvaXJpeDUubWg6IE5ldyBmaWxlOyBsaWtlIGlyaXg0Lm1oLCBidXQgZG9uJ3QgdXNlIC1HIG9yCi0JLWxtYWxsb2MuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVjb2Zmc3dhcC5oOiBDaGFuZ2VkIHR5cGUgb2YgaW50ZXJuYWwgcG9pbnRlcnMgZm9yIHN3YXAgb3V0Ci0JZnVuY3Rpb25zIHRvIGNvbnN0ICouCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZ290MTZfcmVsb2MpOiBOZXcgZnVuY3Rpb24uICBIYW5kbGUgR09UMTYKLQljb3JyZWN0bHkgZm9yIGFzc2VtYmxlciwgYnV0IGxpbmtlciBzdXBwb3J0IG5vdCBpbXBsZW1lbnRlZC4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBVc2UgbWlwc19lbGZfZ290MTZfcmVsb2MgZm9yIEdPVDE2LgotCShtaXBzX2VsZl9zeW1faXNfZ2xvYmFsKTogTmV3IGZ1bmN0aW9uOyBhdCBsZWFzdCBvbiBJcml4IDUsIGFsbAotCW5vbiBzZWN0aW9uIHN5bWJvbHMgYXJlIGNvbnNpZGVyZWQgZ2xvYmFsLgotCShlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKTogRGVmaW5lLgotCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLiAgU2V0IHRoZSBNSVBTCi0JYXJjaGl0ZWN0dXJlIGxldmVsIGNvcnJlY3RseS4KLQkoZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQkobWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfT1BUSU9OUy4KLQkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBlbnRzaXplIG9mIC5tZGVidWcgb3IgLnJlZ2luZm8KLQlzZWN0aW9uIHRvIDEuICBIYW5kbGUgLm9wdGlvbnMgc2VjdGlvbi4KLQkobWlwc19lbGZfYWNvbV9zZWN0aW9uLCBtaXBzX2VsZl9hY29tX3N5bWJvbCwKLQltaXBzX2VsZl9hY29tX3N5bWJvbF9wdHIpOiBOZXcgc3RhdGljIHZhcmlhYmxlcywgdXNlZCB0byBidWlsZCBhCi0JZ2VuZXJpYyAuYWNvbW1vbiBzZWN0aW9uIHRvIGhvbGQgU0hOX01JUFNfQUNPTU1PTiBzeW1ib2xzLgotCShtaXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IEhhbmRsZSBTSE5fTUlQU19BQ09NTU9OIHN5bWJvbHMgYnkKLQlwdXR0aW5nIHRoZW0gYWxsIGluIGEgZ2xvYmFsIC5hY29tbW9uIHNlY3Rpb24uCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgZHVtcCBjb3JlIGlmIHRhcmdldAotCXNlY3Rpb24gaGFzIG5vIEVMRiBzZWN0aW9uIGRhdGEuCi0JKGVsZl9tYWtlX3NlY3Rpb25zKTogU2V0IGFkZHJhbGlnbiBvZiByZWxvYyBzZWN0aW9uIHRvIDQuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKToJRG9uJ3QgY29uc2lkZXIgc2VjdGlvbiAwLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IERvbid0IGNvbnNpZGVyIHNlY3Rpb24gMC4KLQlJbiB0aGUgbWFpbiBsb29wLCBza2lwIHRoZSBzeW10YWIgYW5kIHN0cnRhYiBzZWN0aW9ucywgc2luY2UgdGhlaXIKLQlwb3NpdGlvbnMgYXJlIHNldCBlbHNld2hlcmUuCi0JKHN3YXBfb3V0X3N5bXMpOiBTZXQgYWRkcmFsaWduIG9mIHN5bXRhYiBzZWN0aW9uIHRvIDQuICBTZXQKLQlhZGRyYWxpZ24gb2Ygc3RydGFiIHNlY3Rpb25zIHRvIDEuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogRG9uJ3QgY29uc2lkZXIgc2VjdGlvbiAwLgotCSh3cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB3cml0ZSBvdXQgc2VjdGlvbiAwLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBmaWVsZHMKLQllbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsIGFuZCBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nLgotCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEFkZGVkIGNvcnJlc3BvbmRpbmcgaW5pdGlhbGl6ZXJzLgotCSogZWxmNjQtdGFyZ2V0LmggKGVsZjY0X2JlZCk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChzeW1faXNfZ2xvYmFsKTogVGFrZSBhYmZkIGFyZ3VtZW50LiAgQ2FsbAotCWVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwgaWYgaXQgaXMgbm90IE5VTEwuCi0JKGVsZl9tYXBfc3ltYm9scyk6IFBhc3MgYWJmZCB0byBzeW1faXNfZ2xvYmFsLgotCSh3cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLQlpZiBpdCBpcyBkZWZpbmVkLgotCi1XZWQgTm92IDE3IDE4OjQzOjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliZWNvZmYuaDogSW5jbHVkZSBjb2ZmL2Vjb2ZmLmguCi0JKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBNb3ZlIGV4dGVybmFsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCWZpZWxkcyBpbnRvIGEgc2luZ2xlIGZpZWxkIHBvaW50aW5nIHRvIGFuIGVjb2ZmX2RlYnVnX3N3YXAKLQlzdHJ1Y3R1cmUuCi0JKGVjb2ZmX2RhdGFfdHlwZSk6IE1vdmUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZpZWxkcyBpbnRvIGEgc2luZ2xlCi0JZmllbGQgcG9pbnRpbmcgdG8gYW4gZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuCi0JKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLCBlY29mZi5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVdlZCBOb3YgMTcgMTc6Mzg6NTggMTk5MyAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIG5sbXN3YXAuaDogTmV3IGZpbGUgdG8gc3dhcCBmaXhlZCBoZWFkZXIuICBJbmNsdWRlZCBieSBOTE0KLQliYWNrZW5kcy4KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgcmVsb2NfYW5kX3NlYyk6IERlZmluZS4KLQkoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGZpeGVkX2hlYWRlcl9zaXplLAotCW5sbV9yZWFkX2ltcG9ydCwgbmxtX3dyaXRlX2ltcG9ydCwgbmxtX3N3YXBfZmhkcl9pbiwKLQlubG1fc3dhcF9maGRyX291dC4KLQkobmxtX2ZpeGVkX2hlYWRlcl9zaXplLCBubG1fcmVhZF9pbXBvcnRfZnVuYywKLQlubG1fd3JpdGVfaW1wb3J0X2Z1bmMsIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jLAotCW5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXRfZnVuYywgbmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMpOiBOZXcKLQlhY2Nlc3NvciBtYWNyb3MuCi0JKiBubG1jb2RlLmg6IFVzZSBuZXcgZnVuY3Rpb25zLgotCSogbmxtMzItaTM4Ni5jOiBQcm92aWRlIG5ldyBmdW5jdGlvbnMuCi0JKiBubG0zMi1zcGFyYy5jOiBOZXcgZmlsZTsgU1BBUkMgTkxNIGJhY2tlbmQuCi0KLVdlZCBOb3YgMTcgMTM6NTY6MTAgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2bHlueC5jIChzd2FwX3N0ZF9yZWxvY19pbiwgc3dhcF9leHRfcmVsb2NfaW4pOiBJZ25vcmUKLQlnYXJiYWdlIGJpdHMgYXBwZWFyaW5nIGluIHRoZSB1cHBlciBlbmQgb2Ygc3ltYm9sbnVtcy4KLQotCSogY29uZmlnL3NwYXJjLWx5bngubXQgKFRERUZJTkVTKTogQWRkIC1ERlBSSU5URl9BTFJFQURZX0RFQ0xBUkVELgotCi1UdWUgTm92IDE2IDE3OjAzOjQxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGx5bngtY29yZS5jIChseW54X2NvcmVfZmlsZV9wKTogIENoYW5nZSBiZmRfemFsbG9jIHRvIGJmZF9hbGxvYy4KLQkqIG02OGtseW54LmM6ICBEZWZpbmUgY29yZSBmaWxlIG1hY3Jvcy4KLQkqIGhvc3RzL2kzODZseW54LmgsIGhvc3RzL202OGtseW54LmgsIGhvc3RzL2x5bnguaDogIE1vdmUgYWxsCi0Jbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBzdHVmZiBpbnRvIGx5bnguaC4KLQotVHVlIE5vdiAxNiAxNTo0NTo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaTM4NmxpbnV4LmM6IERlZmluZSBuZXcgbWFjcm8gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSB0byAxMDI0LCBhbmQKLQljaGFuZ2UgUEFHRV9TSVpFIHRvIDQwOTYuCi0KLU1vbiBOb3YgMTUgMTE6NDg6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQotCSogVkVSU0lPTjogVXBkYXRlZC4KLQotU3VuIE5vdiAxNCAyMzozMzowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBEbyBub3QgY3JlYXRlIGR1bW15ICIudGV4dCIsICIuZGF0YSIsCi0JYW5kICIuYnNzIiBzZWN0aW9ucy4KLQkoc2V0dXBfc2VjdGlvbnMpOiBEbyBub3Qgc2V0IFNFQ19IQVNfQ09OVEVOVFMgaWYgYSBzZWN0aW9uJ3Mgc2l6ZQotCWlzIHplcm8uICBSZWNvZ25pemUgQlNTIHR5cGUgc2VjdGlvbnMgYW5kIHR1cm4gb2ZmIFNFQ19MT0FEIGFuZAotCVNFQ19EQVRBIChzbyBiaW51dGlscy9zaXplIHdvcmtzKS4gIFNldCB0aGUgY29ycmVjdCB2YWx1ZSBmb3IKLQlhIHNlY3Rpb24ncyBfcmF3X3NpemUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBQcm9ncmFtIGVudHJ5IHBvaW50cywgYW5kIG1pbGxpY29kZSBhcmUKLQlhbHNvIGZ1bmN0aW9ucy4gIE1hcmsgdGhlbSBhcyBzdWNoLiAgQWxzbyBtYXJrIEwkKiBzeW1ib2xzIGFzCi0JZGVidWdnaW5nIHN5bWJvbHMuCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotU2F0IE5vdiAxMyAxNToyNzoxNSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgbWlzc2luZyBwcm90b3R5cGUuICBSZXR1cm5zCi0JYSBwb2ludGVyIHRvIGNvbnN0YW50IGRhdGEuICBEZWxldGUgYm9ndXMgI2RlZmluZSB3aGljaCBtYWRlIHRoZSAKLQlmdW5jdGlvbiB1c2VsZXNzLgotCi0JKiBzb20uYyAoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBOb3YgMTIgMTU6Mjk6MzYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG8gbm90IGFib3J0LiAgRmxlc2ggb3V0LgotCShzb21fc2V0X3NlY3Rpb25fY29udGVudHMpOiBEbyBub3QgYWJvcnQuICBGbGVzaCBvdXQuCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfaGVhZGVycyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3ByZXBfaGVhZGVycyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jIChzb21fc2l6ZW9mX2hlYWRlcnMpOiBBZGQgbWlzc2luZyBwcm90b3R5cGUuCi0JKHNvbV9zZXRfYXJjaF9tYWNoKTogRG8gbm90IGFib3J0LgotCi0JKiBzb20uYyAoc29tX2NvdW50X3NwYWNlcyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2NvdW50X3N1YnNwYWNlcyk6IE5ldyBmdW5jdGlvbi4KLQkoY29tcGFyZV9zeW1zKTogTmV3IGZ1bmN0aW9uLgotCShzb21fY29tcHV0ZV9jaGVja3N1bSk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAodHJ5X3ByZXZfZml4dXApOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19za2lwKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcmVsb2NfYWRkZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcmVsb2NfY2FsbCk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcmVsb2NfcXVldWVfaW5zZXJ0KTogTGlrZXdpc2UuCi0JKHNvbV9yZWxvY19xdWV1ZV9maXgpOiBMaWtld2lzZS4KLQkoc29tX3JlbG9jX3F1ZXVlX2ZpbmQpOiBMaWtld2lzZS4KLQotCSogc29tLmMgKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogU09NIGhvd3RvIHJlbG9jYXRpb24gdGFibGUuCi0JKGhwcGFfc29tX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoc3RydWN0IHJlbG9jX3F1ZXVlKTogTmV3IHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mCi0JdGhlIGxhc3QgZm91ciBtdWx0aWJ5dGUgcmVsb2NhdGlvbnMgZW1pdHRlZC4KLQkoZW51bSBwYV9zeW1ib2xfdHlwZSk6IFR5cGUgdG8gZnVsbHkgZGVzY3JpYmUgdGhlIHN5bWJvbCB0eXBlcwotCWFzc29jaWF0ZWQgd2l0aCAuaW1wb3J0Ly5leHBvcnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCi0KLQkqIHNvbS5jOiBJbmNsdWRlIGxpYmhwcGEuaAotCi0JKiBzb20uYyAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMpOiBMaWtld2lzZS4KLQkoYmZkX3NvbV9zZXRfc3ltYm9MX3R5cGUpOiBMaWtld2lzZS4KLQkoYmZkX3NvbV9hdHRhY2hfdW53aW5kX2luZm8pOiBMaWtld2lzZS4KLQkqIHNvbS5oOiBEZWNsYXJlIG5ldyBleHBvcnRlZCBmdW5jdGlvbnMuCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX3N5bWJvbCk6IEFkZCBuZXcgZmllbGRzIHRvIGhvbGQgYWRkaXRpb25hbAotCWluZm9ybWF0aW9uIG5lZWRlZCB0byBidWlsZC93cml0ZSBzeW1ib2wgdGFibGVzIGFuZCBmaXh1cCBzdHJlYW1zLgotCShzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkcyB0byBob2xkIGFkZGl0aW9uYWwKLQlpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQvd3JpdGUgc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMuCi0JKHNvbV9zeW1ib2xfZGF0YSk6IE5ldyBhY2Nlc3NvciBtYWNybyBmb3IgU09NIHN5bWJvbCBpbmZvcm1hdGlvbi4KLQkoUl9IUFBBXyopOiBCYXNpYyByZWxvY2F0aW9uIHR5cGVzIHRvIGJlIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4KLQotRnJpIE5vdiAxMiAxMTowMDoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IElmIG5ldyBob29rCi0JVFJBRF9DT1JFX0FMTE9XX0FOWV9FWFRSQV9TSVpFIGRlZmluZWQsIHRoZW4gc2tpcCB0aGUgY2hlY2sgZm9yIHRoZQotCWNvcmVmaWxlIGJlaW5nIHRvbyBiaWcuCi0JKiBob3N0cy9pMzg2c2NvLmg6IERlZmluZSBpdC4KLQotVGh1IE5vdiAxMSAxNToxNjoyOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGhwcGFic2RfY29yZV9kYXRhLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogQWRkIGhwcGFic2RfY29yZV92ZWMuCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogRmFpbCBpZiBhbiB1bmtub3duIGNvcmUKLQlzZWN0aW9uIGlzIGVuY291bnRlcmVkIGR1cmluZyBjb3JlIHNlY3Rpb24gc2Nhbm5pbmcuCi0JKiBocHBhYnNkLWNvcmUuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvaHBwYWJzZC5taDogRW5hYmxlIEhQUEEgQlNEIGNvcmUgZmlsZXMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiBSZW1vdmUgREVGVU4gY3J1ZC4gIFJlbW92ZSBjb2RlCi0Jd2hpY2ggaXMgZWl0aGVyIGNvbW1lbnRlZCBvdXQgb3IgaWZkZWYnZCBvdXQuICBBZGQsIHVwZGF0ZSBhbmQKLQljbGVhbiBjb21tZW50cy4gIEZpeCB2YXJpb3VzIGluZGVudGlvbiBhbmQgc3BhY2luZyBwcm9ibGVtcy4gIEhhbmRsZQotCXByb2JsZW1zIHJlbGF0ZWQgdG8gdXNpbmcgImJsZSIgdG8ganVtcCB0byBhIHN0dWIgcmF0aGVyIHRoYW4gImJsIgotCSglcjMxIGlzIHRyYXNoZWQgYnkgImJsZSIsIGJ1dCBub3QgYnkgImJsIikuCi0JKE5FV19JTlNUUlVDVElPTik6IFB1dCBpbnNpZGUgY3VybHkgYnJhY2VzLgotCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogRml4IGluZGVudGlvbiBwcm9ibGVtcy4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBGaXggaW5kZW50aW9uIGFuZCBzcGFjaW5nIHByb2JsZW1zLgotCUFkZCwgdXBkYXRlIGFuZCBjbGVhbiBjb21tZW50cy4gIEhhbmRsZSAiYmxlIiAlcjMxIGxvc3NhZ2UgcHJvYmxlbXMuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBMaWtld2lzZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGhwcGFfZWxmX3N0dWJfY2hlY2spOiBSZW1vdmUgb2Jzb2xldGUgZnVuY3Rpb24uCi0KLQkqIGhwcGFfc3R1YnMuaDogQWRkIG5ldyBpbnN0cnVjdGlvbnMgdG8gZGVhbCB3aXRoICVyMzEgbG9zc2FnZQotCXByb2JsZW1zLiAgRGVsZXRlIHVudXNlZCBpbnN0cnVjdGlvbnMuCi0JCi1UdWUgTm92ICA5IDExOjQwOjI3IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogbTY4a2x5bnguYyAoVEFSR0VUX0lTX0JJR19FTkRJQU5fUCk6IERlZmluZS4KLQotVHVlIE5vdiAgOSAxMToyNjowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoIGFuIGFycmF5Ci0Jb2YgYXJjaGl0ZWN0dXJlcywgZ2V0IHRoZSBFTEYgRU1feHh4IGNvZGUgZnJvbSB0aGUgYmFja2VuZAotCWluZm9ybWF0aW9uLiAgTGV0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQgbWF0Y2ggYW55IEVNX3h4eCBjb2RlIG5vdAotCW1hdGNoZWQgYnkgYW5vdGhlciBFTEYgdGFyZ2V0LiAgQ2FsbCBlbGZfYmFja2VuZF9vYmplY3RfcCB0byBsZXQKLQl0aGUgYmFja2VuZCBkbyBtb3JlIGNoZWNrcyBhbmQgc2V0IGdsb2JhbCBpbmZvcm1hdGlvbi4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGVsZl9tYWNoaW5lX2NvZGUgYW5kCi0JZWxmX2JhY2tlbmRfb2JqZWN0X3AgZmllbGRzLgotCShzdHJ1Y3QgYmZkX2VsZl9hcmNoX21hcCk6IFJlbW92ZWQuCi0JKGJmZF9lbGZfYXJjaF9tYXAsIGJmZF9lbGZfYXJjaF9tYXBfc2l6ZSk6IERvbid0IGRlY2xhcmUuCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IEluaXRpYWxpemUgZWxmX21hY2hpbmVfY29kZQotCWZpZWxkIHdpdGggRUxGX01BQ0hJTkVfQ09ERS4gIEluaXRpYWxpemUgZWxmX2JhY2tlbmRfb2JqZWN0X3AKLQlmaWVsZCB3aXRoIGVsZl9iYWNrZW5kX29iamVjdF9wIChpZiBpdCBpcyBkZWZpbmVkKS4KLQkqIGVsZjMyLWdlbi5jLCBlbGYzMi1ocHBhLmMsIGVsZjMyLWkzODYuYywgZWxmMzItaTg2MC5jLAotCWVsZjMyLW02OGsuYywgZWxmMzItbTg4ay5jLCBlbGYzMi1taXBzLmMsIGVsZjMyLXNwYXJjLmMsCi0JZWxmNjQtZ2VuLmMgKEVMRl9NQUNISU5FX0NPREUpOiBEZWZpbmVkLgotCSogZWxmMzItbWlwcy5jOiBJbmNsdWRlIGVjb2Zmc3dhcC5oIHRvIGdldCBFQ09GRiBzd2FwcGluZwotCXJvdXRpbmVzLgotCShtaXBzX2VsZl9vYmplY3RfcCk6IFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuCi0JKG1pcHNfZWxmX2Vjb2ZmX2RlYnVnX3N3YXApOiBEZWZpbmVkLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IERlZmluZWQgdG8gYmUgbWlwc19lbGZfb2JqZWN0X3AuCi0JKGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApOiBEZWZpbmVkIHRvIGJlCi0JbWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcC4KLQkqIGVsZi5jIChiZmRfZWxmX2FyY2hfbWFwLCBiZmRfZWxmX2FyY2hfbWFwX3NpemUpOiBSZW1vdmVkLgotCi0JKiBsaWJiZmQtaW4uaCAodGFyZ2V0X3ZlY3RvciwgZGVmYXVsdF92ZWN0b3IpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBmb3JtYXQuYyAodGFyZ2V0X3ZlY3RvciwgZGVmYXVsdF92ZWN0b3IpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogRG9uJ3QgY29tcGxhaW4gb24gb3ZlcmZsb3cKLQlmb3IgUl9NSVBTXzI2LiAgQ29ycmVjdCBvdmVyZmxvdyBkZXRlY3Rpb24gcmVxdWlyZXMgbWF0Y2hpbmcgdGhlCi0JdXBwZXIgZm91ciBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhZ2FpbnN0IHRoZSBQQy4gIEZyb20gVGVkIExlbW9uCi0JPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4uCi0KLQkqIGJvdXQuYyAoYl9vdXRfcmVsb2NfdHlwZV9sb29rdXApOiBSZXR1cm4gdHlwZSBzaG91bGQgcG9pbnQgdG8KLQljb25zdCBkYXRhLgotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShyZWxvY19ob3d0b190eXBlX2xvb2t1cCkpOiBMaWtld2lzZS4KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBNYWRlIGhvd3RvIGNvbnN0LgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfZGF0YSk6IE1hZGUgaG93IGNvbnN0LgotCi0JKiBsaWJlbGYuaDogQWRkZWQgc29tZSBjb21tZW50cy4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCi0JZmllbGQuICBSZW1vdmVkIHVudXNlZCB3cml0ZV9yZWxvY3MgZmllbGQuCi0JKiBlbGYzMi10YXJnZXQuaDogQWRqdXN0ZWQgZWxmX2JhY2tlbmRfZGF0YSBpbml0aWFsaXphdGlvbgotCWFjY29yZGluZ2x5LgotCSogZWxmNjQtdGFyZ2V0Lmg6IENvcnJlY3RlZCBlbGZfYmFja2VuZF9kYXRhIGluaXRpYWxpemF0aW9uIHRvCi0JZmlsbCBpbiBhbGwgZmllbGRzIGFuZCB0byBzZXQgZWxmXzY0X3AgdG8gMS4KLQotTW9uIE5vdiAgOCAxODoxMzoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlIGR1cGxpY2F0ZSBhc3NpZ25tZW50Ci0JdG8gZmlsZXBvcyBpbiBTSFRfU1RSVEFCIGNhc2UuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogU2V0IEJGRCBzZWN0aW9uIGZpbGVwb3MgYXMKLQl3ZWxsIGFzIEVMRiBzZWN0aW9uIHNoX29mZnNldC4KLQotCSogcmVsb2MuYzogVXNlIGNvbnN0IGluc3RlYWQgb2YgQ09OU1QuCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBNYWtlIHZhcmlhYmxlIGhvd3RvIGEgY29uc3QgcG9pbnRlci4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLU1vbiBOb3YgIDggMTI6MTk6MTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChyZWFsY2xlYW4pOiBEb24ndCByZW1vdmUgZ2VuZXJhdGVkIGhlYWRlcnMuICBSZXZlcnRzCi0JY2hhbmdlIG9mIDIgSnVsIDE5OTMuCi0KLU1vbiBOb3YgIDggMDY6MDg6MzEgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmJmZDogbWFrZSB1bml4d2FyZSBlcXVpdmFsZW50IHRvIHN5c3Y0LgotCi0JKiBjb25maWcvaTM4Ni1ubG0ubXQ6IGJyaW5nIGluIGVsZiBjb25maWc7IG1ha2UgaXQgdGhlIGRlZmF1bHQuCi0KLVN1biBOb3YgIDcgMjA6MjE6MzggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmJmZC5jIChiZmRfcHV0XzgpOiBBZGQgcGFyZW5zIGFyb3VuZCByZWZlcmVuY2UgdG8gInZhbCIKLQlhcmd1bWVudC4KLQotRnJpIE5vdiAgNSAyMTo0NTowOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZtYWNoMy5oIChIT1NUX1NFR01FTlRfU0laRSksCi0JaTM4Nm1hY2gzLmMgKFNFR01FTlRfU0laRSwgVEVYVF9TVEFSVF9BRERSKTogQ29ycmVjdCB2YWx1ZXMgKD8pLgotCi1GcmkgTm92ICA1IDE1OjE3OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBaZXJvIG91dCBpbnRlcm5hbF9hLgotCi1GcmkgTm92ICA1IDEwOjQxOjA3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBiZmQuYywgY2FjaGUuYywgY29mZmNvZGUuaCwKLQljb3JlLmMsIGN0b3IuYywgZm9ybWF0LmMsIGluaXQuYywgbGliYmZkLmMsIG9wbmNscy5jLCByZWxvYy5jLAotCXNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmM6Ci0JRG9jIGNsZWFudXAgKHNwZWxsaW5nLCBwdW5jdHVhdGlvbiwgZ3JhbW1hciwgZm9ybWF0dGluZykuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1UaHUgTm92ICA0IDE0OjQ2OjE0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKGJmZF9nZXRfY2FjaGVhYmxlLCBiZmRfc2V0X2NhY2hlYWJsZSk6ICBOZXcgYWNjZXNzb3JzLgotCSogYmZkLmMsIG9wbmNscy5jOiAgSW1wcm92ZSBjb21tZW50cyBvbiBmaWxlIGRlc2NyaXB0b3IgY2FjaGVpbmcuCi0KLVRodSBOb3YgIDQgMDg6NTQ6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIEZyb20gUGV0ZSBIb29nZW5ib29tIChob29nZW5AY3MudXRhaC5lZHUpCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IGxvZ2ljIGVycm9yCi0JaW4gbGFzdCBjaGFuZ2UuICBBbHdheXMgcmVidWlsZCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gdGhlIGZpcnN0Ci0JdGltZSB0aG91Z2ggaWYgb3V0cHV0IHNlY3Rpb25zIGV4aXN0IChmaXhlcyBsZCAtciBwcm9ibGVtcykuCi0KLVRodSBOb3YgMDQgMDg6MDg6NDYgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCAuUEhPTlkgZm9yIGNoZWNrIGFuZCBpbnN0YWxsY2hlY2sgcnVsZXMuCi0KLVR1ZSBOb3YgIDIgMTQ6NDI6MjcgMTk5MyAgQmlsbCBDb3ggKGJpbGxAdGFya2FzLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChhcnRkYXRhKTogVXNlIGxvbmcsIG5vdCB0aW1lX3QgZm9yIHBvcnRhYmlsaXR5LCBhdAotCSAgbGVhc3QgdG8gSFBVWC4gIEZpbGUgYmVsb3cgaXMgYSBkZXJpdmVkIGZpbGUuCi0KLVR1ZSBOb3YgIDIgMTQ6NDI6MjcgMTk5MyAgQmlsbCBDb3ggKGJpbGxAdGFya2FzLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5oIChhcnRkYXRhKTogVXNlIGxvbmcsIG5vdCB0aW1lX3QgZm9yIHBvcnRhYmlsaXR5LCBhdAotCSAgbGVhc3QgdG8gSFBVWC4KLQotVHVlIE5vdiAgMiAwOTozMjoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIGJpZ21pcHMgZm9yIG1pcHMqLSotYnNkKi4KLQotTW9uIE5vdiAgMSAxNDozMDowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSwgZWxmX3NsdXJwX3JlbG9jX3RhYmxlKToKLQlIYW5kbGUgc3ltYm9sIG51bWJlciBvZiB6ZXJvLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZAotCUJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIEJGRF9SRUxPQ19NSVBTX0dPVDE2LAotCUJGRF9SRUxPQ19NSVBTX0NBTEwxNiwgQkZEX1JFTE9DX01JUFNfR1BSRUwzMi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZQotCUJGRF9SRUxPQ19NSVBTX0xJVEVSQUwuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfcmVsb2NfbWFwKTogSGFuZGxlIG5ldyByZWxvY3MuCi0JKG1pcHNfZWxmX2hpMTZfcmVsb2MsIG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBSZWFycmFuZ2UgX2dwX2Rpc3AKLQljaGVja3Mgc2xpZ2h0bHkuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCBNWV9iZmRfZGVidWdfaW5mb19lbmQsCi0JTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0IFtzaWNdKTogUmVtb3ZlIHVudXNlZCBkZWZpbml0aW9ucy4KLQkoTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgTVlfYmZkX3JlbGF4X3NlY3Rpb24sCi0JTVlfYmZkX3NlY2xldF9saW5rKTogRGVmaW5lLgotCShNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgZnJvbQotCU1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwLgotCShNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBSZW5hbWUgZnJvbSBNWV9tYWtlX2RlYnVnX3N5bWJvbC4KLQkoTVkodmVjKSk6IFVzZSBKVU1QX1RBQkxFIHJhdGhlciB0aGFuIGxpc3RpbmcgZnVuY3Rpb25zLgotCSogaHAzMDBocHV4LmMgKE1ZX2dldF9zeW10YWIsIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQsCi0JTVlfY2Fub25pY2FsaXplX3JlbG9jLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBkZWZpbmUgaW4KLQl0ZXJtcyBvZiBNWSwgYmVjYXVzZSB0aGF0IGNhdXNlcyBhIHJlY3VzaXZlIGludm9jYXRpb24gb2YgQ0FUIHdoZW4KLQlleHBhbmRlZCB3aXRoaW4gSlVNUF9UQUJMRSwgYW5kIEFOU0kgY29tcGlsZXJzIGRvbid0IGV4cGFuZAotCXJlY3Vyc2l2ZSBtYWNyb3MuCi0JKiBtaXBzYnNkLmMgKE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSBmcm9tCi0JTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXAsIGFuZCBkb24ndCBkZWZpbmUgaW4gdGVybXMgb2YgTVkuCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IERvbid0IGRlZmluZSBpbiB0ZXJtcyBvZiBNWS4KLQkoYW91dF9taXBzX2xpdHRsZV92ZWMsIGFvdXRfbWlwc19iaWdfdmVjKTogVXNlIEpVTVBfVEFCTEUgcmF0aGVyCi0JdGhhbiBsaXN0aW5nIGZ1bmN0aW9ucy4KLQotTW9uIE5vdiAgMSAwOToxMjoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIG02OGstZWxmIGZvciBtNjgqLSotc3lzdjQqLgotCi1TdW4gT2N0IDMxIDA5OjM1OjQ5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmM6IE1vdmUgZW51bSB0YXJnZXRfZmxhdm91ciBvdXRzaWRlIG9mIHN0cnVjdCBhbmQgY2hhbmdlCi0JdGhlIG5hbWUgdG8gZW51bSBiZmRfZmxhdm91ci4gIFRoaXMgbWVhbnMgYmZkIGNsaWVudHMgY2FuIHVzZSBpdC4KLQkqIGJmZC1pbi5oOiBBZGQgbWFjcm8gYmZkX2dldF9mbGF2b3VyLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBzb20uYzogQWRkIGNvbW1lbnQgYWJvdXQgaG93IGFib3J0KCkgb24gY29ycnVwdCBleGVjdXRhYmxlIGlzIGV2aWwuCi0KLVNhdCBPY3QgMzAgMTI6Mjc6MDkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKTogQXZvaWQgYSBnb3RvLgotCi1GcmkgT2N0IDI5IDE2OjA0OjMzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2VuLWFvdXQuYywgbGliYmZkLmM6IGV4aXQoMSkgaW5zdGVhZCBvZiBleGl0KC0xKS4KLQotRnJpIE9jdCAyOSAxMzoxNzoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiBBZGRlZCBjb21tYW5kcyBmb3Igb2JqZWN0IGZpbGUgZmxhZyB2YWx1ZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IElmIHR5cGUgaXMgRVRfRFlOLCBzZXQgRFlOQU1JQyBmbGFnLAotCW5vdCBFWEVDX1AuCi0JKiBib3V0LmMsIGNvZmYtaDgzMDAuYywgY29mZi1zaC5jOiBBZGQgQkZEX0lTX1JFTEFYQUJMRSB0bwotCW9iamVjdF9mbGFncyBmaWVsZCBmb3IgdGFyZ2V0IHZlY3Rvci4KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtYWRvYmUuYywgYW91dC10YXJnZXQuaCwgYm91dC5jLCBjb2ZmLWEyOWsuYywKLQljb2ZmLWFscGhhLmMsIGNvZmYtYXBvbGxvLmMsIGNvZmYtaDgzMDAuYywgY29mZi1oODUwMC5jLAotCWNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLCBjb2ZmLW1pcHMuYywKLQljb2ZmLXJzNjAwMC5jLCBjb2ZmLXNoLmMsIGNvZmYtd2UzMmsuYywgY29mZi16OGsuYywgaHB1eC1jb3JlLmMsCi0JaWVlZS5jLCBtaXBzYnNkLmMsIG5sbS10YXJnZXQuaCwgb2FzeXMuYywgb3NmLWNvcmUuYywgc29tLmMsCi0Jc3JlYy5jLCB0ZWtoZXguYywgdHJhZC1jb3JlLmM6CVJlbW92ZSBEWU5BTUlDIGZyb20gb2JqZWN0X2ZsYWdzCi0JZmllbGQgZm9yIHRhcmdldCB2ZWN0b3IuCi0KLVRodSBPY3QgMjggMjA6MDI6MzEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBEb24ndCBkZWNsYXJlIHRpbWU7IGNhdXNlcyBlcnJvciBvbiBtYWNoMy4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Nm1hY2gzX3ZlYyk6IFJlcXVpcmUgYW91dDMyLm8gc3RhYi1zeW1zLm8uCi0KLVRodSBPY3QgMjggMTY6MzM6MjYgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JTHlueE9TIGFuZCBTcGFyYyBMeW54T1MgY2hhbmdlczoKLQkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBzcGFyYy0qLWx5bnhvcyouCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIHNwYXJjLSotbHlueG9zKi4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIFNwYXJjIEx5bnggdmVjdG9ycy4KLQkqIHRhcmdldHMuYyAoc3BhcmNseW54X2FvdXRfdmVjKTogRGVjbGFyZS4KLQkoc3BhcmNseW54X2NvZmZfdmVjKTogRGVjbGFyZS4KLQkodGFyZ2V0X3ZlY3Rvcik6IEFkZCB0aGVtLgotCSogY2YtaTM4Nmx5bnguYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBpMzg2bHlueC1jZi5jLgotCSogY2YtbTY4a2x5bnguYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBtNjhrbHlueC1jZi5jLgotCSogY2Ytc3BhcmNseW54LmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBjb2ZmIGluIFNwYXJjIEx5bnhPUy4KLQkqIGNvZmYtc3BhcmMuYzogTmV3IGZpbGUsIGJhc2ljIFNwYXJjIGNvZmYgc3VwcG9ydC4KLQkqIHNwYXJjbHlueC5jOiBOZXcgZmlsZSwgc3VwcG9ydCBmb3IgYS5vdXQgaW4gU3BhcmMgTHlueE9TLgotCSogTWFrZWZpbGUuaW46IENoYW5nZSBmaWxlbmFtZXMgYXBwcm9wcmlhdGVseSwgYWRkIFNwYXJjIHJ1bGVzLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZWNvZ25pemUgU3BhcmMgbWFnaWMKLQludW1iZXIuCi0JKGNvZmZfc2V0X2ZsYWdzKTogVXNlIEx5bnhPUyBtYWdpYyBudW1iZXIgZm9yIGkzODYsIG02OGssIGFuZAotCVNwYXJjIEx5bnhPUywgc2V0IFNwYXJjIG1hZ2ljIG51bWJlciBmb3IgU3BhcmNzLgotCSogY29uZmlnL202OGstbHlueC5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW1vdmUgcmVkdW5kYW50IHZlY3Rvci4KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGhvc3RzL2kzODZseW54Lmg6IENvc21ldGljIGltcHJvdmVtZW50cy4KLQkqIGhvc3RzL202OGtseW54Lmg6IEFkZCBpZmRlZnMsICNkZWZpbmUgb2YgY2ZyZWUuCi0JKiBob3N0cy9zcGFyY2x5bnguaDogTmV3IGZpbGUuCi0KLVRodSBPY3QgMjggMTY6MjM6NDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JZ2NjIC1XYWxsIGxpbnQ6Ci0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBEZWNsYXJlIHJldHVybiB0eXBlLgotCVJlbW92ZSB1c2VsZXNzIHN0YXRlbWVudCBwcm9iYWJseSBsZWZ0IGJ5IGNvZGUgY29weS4KLQkqIGNwdS1pOTYwLmMgKGNvbXBhdGlibGUpOiBGdWxseSBicmFja2V0IG1hdHJpeCBpbml0aWFsaXplci4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBVc2UgYmZkX3htYWxsb2MKLQlyYXRoZXIgdGhhbiB4bWFsbG9jLiAgVXNlIHJlYWxsb2MgYW5kIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKLQlyYXRoZXIgdGhhbiB4cmVhbGxvYy4KLQkoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBBZGQgc29tZSBjYXN0cy4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGUuICBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQkqIGhwMzAwaHB1eC5jOiBEZWNsYXJlIGFvdXRfMzJfd3JpdGVfc3ltcy4KLQkqIGkzODZic2QuYywgaTM4NmxpbnV4LmMsIG5ldGJzZDM4Ni5jIChOX1NIQVJFRF9MSUIpOiBEZWZpbmUgYXMgMAotCShkZWZpbml0aW9uIGZyb20gYW91dC9hb3V0NjQuaCBpcyBhbHdheXMgMCBhbnlob3cpLgotCSogaTM4Nmx5bnguYyAoc3dhcF9zdGRfcmVsb2NfaW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCSogaWVlZS5jIChpZWVlX3dyaXRlX2lkKTogbGVuZ3RoIGNhbiBuZXZlciBiZSBuZWdhdGl2ZS4KLQkocmVhZF9pZCk6IExpa2V3aXNlLgotCShpZWVlX2FyY2hpdmVfcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0JKiBsaWJjb2ZmLWluLmggKGJmZF9wZXJmb3JtX3NsaXApOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBSZW1vdmUgemVybyBpbml0aWFsaXphdGlvbiBvZgotCXN0YXRpYyBzdHJ1Y3R1cmUuCi0JKiByZWxvYzE2LmM6IEluZGVudGF0aW9uIGNoYW5nZS4KLQotV2VkIE9jdCAyNyAxNjo1MToyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvaTM4Ni1tYWNoMy5tdDogVXBkYXRlIGZvciBuZXcgY29uZmlndXJhdGlvbgotCSgtLXdpdGgtdGFyZ2V0cwlhbmQgc28gb24pLgotCSogaG9zdHMvaTM4Nm1hY2gzLmg6IERlY2xhcmUgZXJybm8uCi0JKiB0YXJnZXRzLmM6IERlY2xhcmUgaTM4Nm1hY2gzX3ZlYy4KLQotV2VkIE9jdCAyNyAxMjoxODowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4sCi0JbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogSGFuZGxlIHNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0Ci0JYW5kIHNoYXJlZERlYnVnUmVjb3JkQ291bnQgZmllbGRzLgotCi1UdWUgT2N0IDI2IDE2OjIxOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZW1vdmUgU0NPX0NPUkUuICBPbiBTZXAgMTEgMTk5MywKLQl3ZSBzdGFydGVkIHVzaW5nIHRyYWQtY29yZS5jIGZvciBTQ08gaW5zdGVhZC4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmUtZW5hYmxlIGdlbmVyaWMgRUxGIGFuZCBOTE0gdGFyZ2V0cy4KLQotVHVlIE9jdCAyNiAxNjo1MzoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBBbGlnbiBzaF9vZmZzZXQgdG8KLQlzaF9hZGRyYWxpZ24gKHRoaXMgaXMgd2hhdCBVbml4V2FyZSBkb2VzLCBhbmQgaXQgc2hvdWxkbid0IGh1cnQpLgotCi1UdWUgT2N0IDI2IDEwOjE2OjU0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JRnJvbSBKZWZmIExhdyBhbmQgUGV0ZSBIb29nZW5ib29tIGF0IFV0YWg6Ci0KLQkqIGVsZjMyLWhwcGEuaCAoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBBZGQgcHJvdG90eXBlLgotCShFTEYzMl9IUFBBX1JfQVJHX1JFTE9DKTogUmVuYW1lZCB3aXRob3V0IHRoZSBFTEYzMiBwcmVmaXgKLQlhbmQgbW92ZWQgaW50byBsaWJocHBhLmguICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgotCShFTEYzMl9IUFBBX1JfQ09OU1RBTlQsIEVMRjMyX0hQUEFfUl9BRERFTkQpOiBMaWtld2lzZS4KLQkoZ2V0X29wY29kZSBhbmQgb3Bjb2RlIGRlZmluZXMpOiBNb3ZlIGludG8gbGliaHBwYS5oCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2luc24yZm10KTogUmVuYW1lIGFuZCBtb3ZlIGluZm8KLQlsaWJocHBhLmguCi0JKiBsaWJocHBhLmggKEhQUEFfUl8qKTogTW92ZWQgaGVyZS4gIFJlZm9ybWF0dGVkIHNsaWdodGx5IHRvIG1ha2UKLQlmb3IgZWFzaWVyIHJlYWRpbmcuCi0JKGdldF9vcGNvZGUpOiBNb3ZlZCBoZXJlLiAgRklYTUUhIHRoaXMgcmVhbGx5IHNob3VsZCBiZSBhIEMgZnVuY3Rpb24KLQlpbnNpZGUgdGhlIG9wY29kZSBsaWJyYXJ5IQotCShiZmRfaHBwYV9pbnNuMmZtdCk6IExpa2V3aXNlLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBFbmFibGUgZWxmMzItaHBwYSB2ZWN0b3IuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBBZGQgbmV3IGNvbW1lbnRzCi0JYW5kIGNsYXJpZnkgZXhpc3RpbmcgY29tbWVudHMuICBEbyBub3QgdXNlIERFRlVOIHRvIGRlY2xhcmUgdGhpcwotCWZ1bmN0aW9uLiAgRml4IG51bWVyb3VzIGluZGVudGlvbiBwcm9ibGVtcy4gIENvcnJlY3RseSBoYW5kbGUgY2FzZXMKLQl3aGVyZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gbWF5IG5lZWQgdG8gYmUgcmVhZCBmcm9tIGRpc2ssIAotCXJlYWQgZnJvbSBtZW1vcnksIG9yIGJ1aWx0IHRoZW4gcmVhZCBmcm9tIG1lbW9yeS4KLQotCSogZWxmMzItaHBwYS5oOiBSZWZvcm1hdCB3aXRoIGdudS1pbmRlbnQgYW5kIGhhbmQgZml4IG51bWVyb3VzCi0JZm9ybWF0dGluZyBhbmQgaW5kZW50aW9uIHByb2JsZW1zIGdudS1pbmRlbnQgY2FuIG5vdCBoYW5kbGUuCi0JQ2xhcmlmeSBzb21lIGNvbW1lbnRzIGFib3V0IHJlbG9jYXRpb24gdHlwZXMuICBDb21tZW50IGJhc2ljCi0JcmVsb2NhdGlvbiAiY2xhc3NlcyIuICBHcm91cCBQQVJBTSBkZWNsYXJhdGlvbnMgdG9nZXRoZXIuCi0JKEhQUEFfU1hUX3tOVUxMLCBTWU1ORFgsIFJHX1JFTE9DfSk6IE1ha2UgbWVtYmVycyBvZiBhIG5ldyAKLQllbnVtZXJhdGVkIHR5cGUgcmF0aGVyIHRoYW4gI2RlZmluZXMuCi0KLVR1ZSBPY3QgMjYgMDI6NDA6NDYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKGhwcGFfb2JqZWN0X3NldHVwKTogIFNldCBTRUNfQ09ERSBmb3IgLnRleHQgc2VjdGlvbiBzbwotCXRoYXQgR0RCIGNhbiBmaWd1cmUgb3V0IHRleHRfc3RhcnQgYW5kIHRleHRfZW5kLgotCi1Nb24gT2N0IDI1IDE2OjA1OjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUZpeCB1cCB3YXJuaW5ncyBmcm9tIGdjYyAtV2FsbDoKLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBVc2UgJWx4IGFuZCBjYXN0IG5fdmFsdWUgdG8KLQl1bnNpZ25lZCBsb25nLiAgVXNlICVsZCBmb3IgdGFnbmR4LiAgVXNlICVseCBmb3Igb2Zmc2V0ICsgdm1hIGFuZAotCWNhc3QgaXQgdG8gdW5zaWduZWQgbG9uZy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2VtaXRfYWdncmVnYXRlKTogVXNlICVsZC4JCi0JKGVjb2ZmX3ByaW50X3N5bWJvbCk6IFVzZSAlbGQsIGFuZCBjYXN0IGluZHggYW5kIHN5bV9iYXNlIHRvIGxvbmcuCi0JKiBjb2ZmY29kZS5oIChkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogU3BlY2lmeSByZXR1cm4gdHlwZS4KLQotCSogbGliYmZkLmMgKGJmZF93cml0ZSk6IElmIG5vdCBldmVyeXRoaW5nIGlzIHdyaXR0ZW4gb3V0LCBzZXQKLQliZmRfZXJyb3IgdG8gc3lzdGVtX2NhbGxfZXJyb3IuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzCi0Jbm9uLW5lZ2F0aXZlLCBzZXQgZXJybm8gdG8gRU5PU1BDIChpZiBFTk9TUEMgaXMgZGVmaW5lZCkuCi0JKGJmZF9zZWVrKTogSWYgdGhlIHNlZWsgZmFpbHMsIHNldCBiZmRfZXJyb3IgdG8gc3lzdGVtX2NhbGxfZXJyb3IuCi0JKGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRm9yIGEgYmFkIG9mZnNldCArIGNvdW50LCBzZXQKLQliZmRfZXJyb3IgdG8gYmFkX3ZhbHVlLgotCSogc2VjbGV0LmMgKHJlbCk6IERvbid0IGFib3J0LiAgSW5zdGVhZCwgcmV0dXJuIGZhbHNlLgotCi1Nb24gT2N0IDI1IDA5OjU5OjM3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChyZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMi4KLQotRnJpIE9jdCAyMiAyMDozNTo1NCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IGhhbmRsZSBtaXBzKi0qIGluc3RlYWQgb2YgbWlwcy0qLCB1c2UgbWlwcyplbAotCSAgaW5zdGVhZCBvZiBtaXBzLSotKmwKLQotRnJpIE9jdCAyMiAxNDowMzozMyAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLWx5bngubXQsIGkzODYtbHlueC5tdCAoVERFRklORVMpOiBzZXQKLQlGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQgYmVjYXVzZSB0aGUgb2JqZHVtcC5jIGRlY2xhcmF0aW9uIG9mCi0JZnByaW50ZiBjb2xsaWRlcyB3aXRoIHRoZSBuYXRpdmUgb25lLgotCi1GcmkgT2N0IDIyIDExOjUwOjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogRW5hYmxlIE1JUFMgRUxGIHZlY3RvcnMuCi0KLUZyaSBPY3QgMjIgMDc6NTE6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBiaWdtaXBzIGZvciBtaXBzLXNvbnktYnNkKi4KLQotCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCi0KLVRodSBPY3QgMjEgMTI6MTY6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoRklMRV9BTElHTik6IFJlbmFtZWQgZnJvbSBFQUxJR04sIHRvIGF2b2lkIGNvbmZsaWN0Ci0Jd2l0aCBVbHRyaXggaGVhZGVyIGZpbGVzLgotCi0JKiBzb20uaCAoc3RydWN0IHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KTogUmVuYW1lZCBmcm9tCi0Jc29tX3NlY3Rpb25fZGF0YSB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1hY3JvIGJ5IHRoYXQgbmFtZS4KLQotCUNoYW5nZXMgZnJvbSBKZWZmIExhdyBhbmQgUGV0ZXIgSG9vZ2VuYm9vbSBhdCBVdGFoOgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogIFRhcmdldCByZWdpc3RlciBmb3IgYSAnanVtcAotCWluIGRlbGF5IHNsb3QnIG9wdGltaXphdGlvbiBpbiBjb21iaW5hdGlvbiB3aXRoIGEgbG9uZyBjYWxsCi0Jc3R1YiBzaG91bGQgYWx3YXlzIGJlIHIzMS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IFRvIGJlIGNvbnNpc3RlbnQKLQlhY3Jvc3MgYWxsIHJlbG9jYXRpb24gdHlwZXMsIHJldHJpZXZlIGluc3RydWN0aW9uIGFkZGVuZHMgZnJvbQotCXRoZSByZWxvY2F0aW9uIGVudHJ5IHJhdGhlciB0aGFuIGZyb20gdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IEZpeCBhIHJlbG9jYXRpb24KLQllcnJvciB0aGF0IG9ubHkgb2NjdXJyZWQgd2hlbiB0aGUgYWRkZW5kIG9mIGFuICdhZGRpbCcgb3IKLQknbGRpbCcgd2FzIGxhcmdlciB0aGFuIDIxIGJpdHMgYW5kIHZlcnkgY2xvc2UgdG8gYSAySyBieXRlCi0JYm91bmRhcnkuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jKTogIEhhbmRsZSB0aGUgb3B0aW1pemF0aW9uIGluCi0Jd2hpY2ggYSBqdW1wIGlzIHBsYWNlZCBpbiB0aGUgZGVsYXkgc2xvdCBvZiBhIGZ1bmN0aW9uIGNhbGwuCi0JVGhlIGp1bXAgd2FzIGJlaW5nIGFjY29tcGxpc2hlZCB2aWEgYW4gYWRqdXN0bWVudCB0byB0aGUKLQlyZXR1cm4gcG9pbnRlci4gIFRoaXMgb3B0aW1pemF0aW9uIHdvdWxkIGJyZWFrIHRoZSBsb25nIGNhbGwKLQlzdHViIGNvZGUsIGlmIHRoZXJlIHdhcyBhbnkuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBDb3JyZWN0aW9ucwotCXRvIGxvbmcgYnJhbmNoIHN0dWJzIHRvIGF2b2lkIHVzZSBvZiBnZW5lcmFsIHJlZ2lzdGVyIDIuCi0KLQkqIGhwcGFfc3R1YnMuaDogTmV3IHN0dWIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBlbGZjb2RlLmg6IERlY2xhcmUgYmZkX2VsZl9maW5kX3NlY3Rpb24uCi0KLQkqIHNvbS5oIChzb21fc2VjdGlvbl9kYXRhKTogQWRkIG5ldyAic3Vic3BhY2VfaW5kZXgiIGZpZWxkLgotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBTYXZlIHRoZSBvcmlnaW5hbCBTT00gc3Vic3BhY2UgaW5kZXgKLQlpbiB0aGUgQkZEIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgc3Vic3BhY2UuICAKLQkoc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBJbXBsZW1lbnQuCi0JKHNvbV9nZXRfc3ltdGFiKTogSW1wbGVtZW50LgotCShzb21fcHJpbnRfc3ltYm9sKTogSW1wbGVtZW50LgotCShzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgYSBzdHJpbmcgdGFibGUKLQlmcm9tIGEgU09NIG9iamVjdCBmaWxlLgotCShzb21fc2VjdGlvbl9mcm9tX3N1YnNwYWNlX2luZGV4KTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiB0aGUKLQlzZWN0aW9uIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgU09NIHN1YnNwYWNlIGluZGV4LgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgdGhlIHN5bWJvbAotCXRhYmxlIGZyb20gYSBTT00gb2JqZWN0IGZpbGUuCi0JKHNvbV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGZvciBlcnJvcnMgZnJvbSBiZmRfemFsbG9jLgotCShzb21fbmV3X3NlY3Rpb25faG9vayk6IEluaXRpYWxpemUgc3Vic3BhY2VfaW5kZXggZmllbGQgdG8KLQktMSBpbnN0ZWFkIG9mIDAuCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogRml4IHBvbGFyaXR5IG9mIHRlc3QgdG8gc2V0IEhBU19SRUxPQy4KLQlTZXQgRVhFQ19QIGZvciBleGVjdXRhYmxlcy4KLQkoc2V0dXBfc2VjdGlvbnMpOiBDb3JyZWN0bHkgaWRlbnRpZnkgd2hlbiBhIHNlY3Rpb24gaGFzCi0JcmVsb2NhdGlvbnMuCi0JKGxvZzIpOiBOZXcgZnVuY3Rpb24uCi0JKHNldHVwX3NlY3Rpb25zKTogQ29ycmVjdGx5IGNvbnZlcnQgYmV0d2VlbiBTT00gYWxpZ25tZW50cyBhbmQgQkZECi0JYWxpZ25tZW50cy4KLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogRG8gbm90IHNldCBTRUNfQUxMT0Mgb3IgU0VDX0xPQUQKLQlmb3Igc2VjdGlvbnMgd2hpY2ggY29ycmVzcG9uZCB0byBTT00gc3BhY2VzLCBkb2luZyBzbyBjb25mdXNlcwotCW1hbnkgdXRpbGl0aWVzLiAgU2V0IGFzc29ydGVkIFNFQ18qIGZsYWdzIGZvciBTT00gc3Vic3BhY2VzCi0Jd2hpY2ggY29ycmVzcG9uZCB0byBCRkQgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zKTogVGhlIHN0YWIKLQlzdHJpbmcgdGFibGUgc2hvdWxkIGhhdmUgc2hfdHlwZSA9PSBTSFRfU1RSVEFCLiAgQWRkCi0JcHJvY2Vzc2luZyB0byBtYWtlIGl0IHNvLgotCi0JKiBlbGZjb2RlLmg6IChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBTdHJpbmcgdGFibGVzIChvdGhlcgotCXRoYW4gLnN0cnRhYikgd2VyZSBub3QgZ2V0dGluZyB0aGUgZmlsZSBvZmZzZXRzIHJlY29yZGVkLCBzbwotCXRoZXkgY291bGQgbm90IGJlIHJlYWQgZnJvbSBkaXNrLgotCi0JKiBlbGZjb2RlLmg6IChlbGZfbWFrZV9zZWN0aW9ucyk6ICBMZWF2ZSB0aGUgc2hfYWRkciBmaWVsZCBvZgotCXRoZSBzZWN0aW9uIGhlYWRlciBhbmQgdGhlIHZtYSBmaWVsZCBvZiBhIHNlY3Rpb24gYXQgMCBpZiB0aGUKLQlzZWN0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbiBpbWFnZS4gKGUuZy4sCi0JLnN0YWIpCi0KLQkqIHNvbS5baGNdOiBDaGFuZ2UgdGFyZ2V0IHZlY3RvciBwcmVmaXggZnJvbSAiaHBwYSIgdG8gInNvbSIuCi0JQ29uc2lzdGVudGx5IHVzZSBvYmpfc29tIHByZWZpeCB0byBhY2Nlc3MgZmllbGRzIGluIGJhY2tlbmQgZGF0YQotCXN0cnVjdHVyZXMuICBGaXggYWxsIGNhbGxlcnMvcmVmZXJlbmNlcy4KLQotCSogc29tLmg6IERvIG5vdCBpbmNsdWRlIGZpbGVzIG9ubHkgbmVlZGVkIGZvciBjb3JlIGZpbGUgcmVhZGluZyBoZXJlLgotCUluY2x1ZGUgYS5vdXQgZm9yIGJvdGggSE9TVF9IUFBBSFBVWCBhbmQgSE9TVF9IUFBBQlNELiAgRGVsZXRlCi0JZm9yd2FyZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zLCB0aGV5IGFyZSB1bm5lY2Vzc2FyeS4KLQkoc3RydWN0IHNvbWRhdGEpOiBEZWxldGUgYXV4X2hkciwgYW5kIGhwX3N5bWJvbF9lbnRyeV9zaXplIGZpZWxkcy4KLQlDaGFuZ2UgInN5bWJvbHMiIHRvICJzeW10YWIiLiAgQWRkICJzdHJpbmd0YWIiIGFuZCAicmVsb2NfZmlsZXBvcyIKLQlmaWVsZHMgZm9yIGZ1dHVyZSB1c2UuICBDaGFuZ2Ugb2JqX3NvbV8qIG1hY3JvcyBhcyBhcHByb3ByaWF0ZS4KLQkoc29tX3NlY3Rpb25fZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdG8ga2VlcCBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24KLQlhYm91dCBCRkQgc2VjdGlvbnMgKGZvciBmdXR1cmUgdXNlKS4KLQotCSogc29tLmM6IFByb3ZpZGUgUEFSQU1TIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGZ1bmN0aW9ucyBjdXJyZW50bHkKLQlpbiB0aGlzIGZpbGUuCi0JKHN0cnVjdCBjb250YWluZXIpOiBEZWxldGUgdW53YW50ZWQgc3RydWN0dXJlIGRlZmluaXRpb24uCi0JKHNvbV9vYmplY3Rfc2V0dXApOiBBZGQgY29tbWVudHMuICBVc2Ugc29tX21rb2JqZWN0IHRvIGFsbG9jYXRlCi0JU09NIHNwZWNpZmljIGluZm9ybWF0aW9uIGluIHRoZSBCRkQ7IHVzZSBpbmZvcm1hdGlvbiBmcm9tIHRoZQotCWZpbGUgYW5kIChwb3NzaWJseSBlbXB0eSkgYXV4aWxpYXJ5IGhlYWRlcnMgdG8gaW5pdGlhbGl6ZSB0aGlzCi0JaW5mb3JtYXRpb24uICBEZWxldGUgcmVkdW5kYW50IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICJjYWxscyIuCi0JKHNldHVwX3NlY3Rpb25zKTogUmV0dXJuIHR5cGUgaXMgbm93IGJvb2xlYW4sIGZpeCByZXR1cm4gc3RhdGVtZW50cy4KLQkiRml4IiBoYW5kbGluZyBvZiBCU1MgbGlrZSBzdWJzcGFjZXMgaW4gdGhlIGNvbXB1dGF0aW9uIG9mIHRoZQotCWNvbnRhaW5pbmcgc3BhY2UncyBzaXplLiAgSWYgdGhlIHN1YnNwYWNlIGhhcyByZWxvY2F0aW9ucywgc2V0IHRoZQotCWFwcHJvcHJpYXRlIEJGRCBzZWN0aW9uIGZsYWdzIGFuZCByZWNvcmQgdGhlIGluZGV4IGludG8gYW5kIHRoZQotCXNpemUgb2YgdGhlIGZpeHVwIHN0cmVhbS4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkoc29tX29iamVjdF9wKTogU2V0IGJmZF9lcnJvciBhcHByb3ByaWF0ZWx5IGlmIGVycm9ycyBhcmUgZGV0ZWN0ZWQKLQlmcm9tIGJmZF97cmVhZCxzZWVrfSBmdW5jdGlvbnMuICBIYW5kbGUgRVhFQ0xJQk1BR0lDIHR5cGUgZmlsZXMuCi0JRG8gbm90IHRyeSB0byByZWFkIGEgbm9uLWV4aXN0YW50IGF1eGlsaWFyeSBoZWFkZXIuCi0JKHNvbV9ta29iamVjdCk6IEZsZXNoIG91dC4KLQkoc29tX3NlY3Rpb25faG9vayk6IEFsbG9jYXRlIHNwYWNlIHRvIGhvbGQgU09NIHNwZWNpZmljIGluZm9ybWF0aW9uCi0JYWJvdXQgc2VjdGlvbnMuCi0KLVRodSBPY3QgMjEgMTI6NDE6MzQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQlnY2MgLVdhbGwgbGludDoKLQkqIGNvZmYtaDgzMDAuYywgY29mZmNvZGUuaDogQ2hhbmdlIHNocmluayBwYXJhbWV0ZXIKLQlpbiAqX3JlbG9jMTZfZXN0aW1hdGUgdG8gdW5zaWduZWQgdG8gbWF0Y2ggcHJvdG90eXBlLgotCSogYXJjaGl2ZS5jOiBBdm9pZCAiLyoiIGluIGNvbW1lbnQuCi0KLVRodSBPY3QgMjEgMTM6MDU6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBkZXAtaW4uc2VkOiBDcmVhdGUgb3VyIG93biBsaW5lIGJyZWFrcyBmb3IgYSBtb3JlIGFlc3RoZXRpYwotCU1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGYzMi1taXBzLmM6IEluY2x1ZGUgInNlY2xldC5oIi4KLQkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IEZvcmNlIHNpemUgb2YgLnJlZ2luZm8gc2VjdGlvbiB0byBzaXplb2YKLQlFbGYzMl9FeHRlcm5hbF9SZWdJbmZvLgotCShtaXBzX2VsZl9zZWNsZXRfbGluayk6IE5ldyBmdW5jdGlvbi4gIExpbmsgdGhlIC5yZWdpbmZvIHNlY3Rpb24KLQlzcGVjaWFsbHksIGFuZCBwYXNzIGV2ZXJ5dGhpbmcgZWxzZSB0byB0aGUgZ2VuZXJpYyByb3V0aW5lLgotCShiZmRfZWxmMzJfYmZkX3NlY2xldF9saW5rKTogRGVmaW5lIG1hY3JvLgotCSogZWxmMzItdGFyZ2V0Lmg6IElmIGJmZF9lbGYzMl9iZmRfc2VjbGV0X2xpbmsgaXMgYWxyZWFkeSBkZWZpbmVkLAotCWRvbid0IG92ZXJyaWRlIGl0LgotCi1XZWQgT2N0IDIwIDEyOjIyOjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlibmxtLmggKG5sbV9iYWNrZW5kX2RhdGEpOiBBZGRlZCBzaWduYXR1cmUgZmllbGQuCi0JKG5sbV9zaWduYXR1cmUpOiBOZXcgbWFjcm8uCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCwgbmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSB0aGUgTkxNCi0Jc2lnbmF0dXJlIGZyb20gdGhlIGJhY2tlbmQgcmF0aGVyIHRoYW4gdGhlIGNvbnN0YW50IE5MTV9TSUdOQVRVUkUuCi0JKiBubG0zMi1pMzg2LmMgKG5sbTMyX2kzODZfYmFja2VuZCk6IEluaXRpYWxpemUgc2lnbmF0dXJlIGZpZWxkLgotCi0JKiBhb3V0ZjEuaCAoTUFDSFRZUEVfT0spOiBBY2NlcHQgTV9VTktOT1dOLgotCShOQU1FKHN1bm9zLHNldF9hcmNoX21hY2gpKTogVHJlYXQgTV9VTktOT1dOIGFzIDY4MDAwLCBub3QgNjgwMjAuCi0KLVdlZCBPY3QgMjAgMTA6Mjg6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZic2QuaCBbX19ic2RpX19dOiBEZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIuCi0KLVdlZCBPY3QgMjAgMTA6MTA6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBOZXcgdmFyaWFibGUsIGZvciB1c2UgaW4gIm1ha2UgZGVwIi4KLQkoLmRlcCk6IERlcGVuZCBvbiAkKENGSUxFUykgYW5kICQoSEZJTEVTKS4gIERlbGV0ZSAuZGVwMSBhbmQKLQlyZW1ha2UgaXQsIHNvIHRoYXQgIiQ/IiBpcyBjb21wbGV0ZS4KLQkoLmRlcDEpOiBEb24ndCBuZWVkIHRvIHJlbW92ZSAuZGVwMSBmaXJzdC4KLQkoZGVwLnNlZCk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzLCBub3QgTWFrZWZpbGUuCi0JKENGSUxFUyk6IEFkZCBubG0uYy4KLQotVHVlIE9jdCAxOSAxNToyNjoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYzogSW1wbGVtZW50ZWQgcmVsb2MgaGFuZGxpbmcgZm9yIHRoZSBsaW5rZXIsIG1hZGUKLQl2YXJpb3VzIG90aGVyIHJlbGF0ZWQgY2hhbmdlcy4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIHJkYXRhX2luX3RleHQgZmllbGQuCi0JUmVuYW1lZCBmaW5pc2hfcmVsb2MgdG8gYWRqdXN0X3JlbG9jX2luLiAgQWRkZWQgYWRqdXN0X3JlbG9jX291dAotCWZpZWxkLgotCShlY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgZGVmaW5lLgotCSogZWNvZmYuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MsIGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKToKLQlIYW5kbGUgLmxpdGEgc2VjdGlvbi4KLQkoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBIYW5kbGUgUkVMT0NfU0VDVElPTl9GSU5JLgotCWZpbmlzaF9yZWxvYyBiYWNrZW5kIGZpZWxkIHJlbmFtZWQgdG8gYWRqdXN0X3JlbG9jX2luLgotCShlY29mZl9iZmRfc2VjbGV0X2xpbmspOiBBZGp1c3QgbnVtYmVyIG9mIGF1eCBlbnRyaWVzIHRvCi0JZGVidWdfYWxpZ24gYm91bmRhcnkuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIHJkYXRhX2luX3RleHQgcHV0Ci0JLnJkYXRhIHNlY3Rpb24gaW4gdGV4dCBzZWdtZW50LCBub3QgZGF0YSBzZWdtZW50LiAgUHV0IC5wZGF0YQotCXNlY3Rpb24gaW4gdGV4dCBzZWdtZW50LgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4gIEFsc28sIGNhbGwKLQlhZGp1c3RfcmVsb2Nfb3V0LCBhbmQgaGFuZGxlIC5saXRhLCAueGRhdGEsIC5wZGF0YSwgLmZpbmkgYW5kCi0JYWJzb2x1dGUgc2VjdGlvbnMgd2hlbiB3cml0aW5nIG91dCByZWxvY3MuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBGb3IgQUxQSEFFQ09GRiwgb3V0cHV0IDIgZm9yCi0JYmxkcmV2IGZpZWxkLCBhcyBvbiBBbHBoYSBPU0YvMS4gIFBhZGRpbmcgZmllbGQgaXMgbm93IDIgYnl0ZXMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9zd2FwX3JlbG9jX291dCk6IEFkZGVkIGFzc2VydGlvbi4KLQkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBSZW5hbWVkIGZyb20gbWlwc19maW5pc2hfcmVsb2MuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX291dCk6IE5ldyBmdW5jdGlvbiAoZG9lcyBub3RoaW5nKS4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGlvbl9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lIHRvIGJlCi0JYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkZWQgY2FzdHMgdG8gYXZvaWQgQWxwaGEKLQlPU0YvMSBjYyBidWcuCi0KLVRodSBPY3QgMTQgMDE6MTA6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkIGNvbW1lbnRzIGF0dGVtcHRpbmcgdG8KLQlleHBsYWluIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IERvbid0IHNldCBTRUNfREVCVUdHSU5HIHVudGlsIGl0Ci0JaXMgbWFkZSB0byB3b3JrLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFJlbW92ZSBjaGVjayBmb3IKLQlVU0VfRElTQ0FSREVEX1NFQ1RJT05TX0NPVU5ULgotCSogY29mZi1pMzg2LmM6IERvbid0IGRlZmluZSBVU0VfRElTQ0FSREVEX1NFQ1RJT05TX0NPVU5ULiAgQmFzaW5nCi0JaXQgb24gaG9zdCBkZWZpbmVzIGlzIHdyb25nLgotCi0JKiBlY29mZi5jIChlY29mZl9iZmRfc2VjbGV0X2xpbmspOiBEb24ndCBsaW5rIGEgLnJlZ2luZm8gc2VjdGlvbi4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgcmVxdWlyZSB0aGUgLnJlZ2luZm8gc2VjdGlvbgotCXRvIGJlIGEgcGFydGljdWxhciBzaXplLgotCi1XZWQgT2N0IDEzIDE4OjM5OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRlcC1pbik6IE5ldyBydWxlLCBmb3IgZWRpdGluZyBkZXBlbmRlbmNpZXMgaW50bwotCU1ha2VmaWxlLmluIGluICQoc3JjZGlyKS4gIFVzZSBtb3ZlLWlmLWNoYW5nZS4KLQkoLmRlcDEsIGRlcCk6IFVzZSBtb3ZlLWlmLWNoYW5nZS4KLQkoQ0ZJTEVTKTogQWRkIGNvZmYtYXBvbGxvLmMuCi0KLQlTdW4gT2N0IDEwIDE4OjAyOjU2IDE5OTMgIFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LkVEVS5BVSkKLQotCSogTWFrZWZpbGUuaW46IFJlY29nbmlzZSBuZXcgZmlsZSwgY29mZi1hcG9sbG8ubwotCi0JKiBjb2ZmLWFwb2xsby5jOiBOZXcgZmlsZQotCi0JKiBjb2ZmY29kZS5oOiBSZWNvZ25pc2UgYXBvbGxvIG1hZ2ljIG51bWJlcnMgYW5kIHdyaXRhYmxlIHRleHQKLQotCSogY29mZnN3YXAuaDogU3dhcCBBcG9sbG8gb3B0aW9uYWwgaGVhZGVyIGVudHJpZXMKLQotCSogY29uZmlnLmJmZDogQWRkIGxpbmUgZm9yIEFwb2xsbwotCi0JKiBjb25maWd1cmUuaG9zdDogUmVwbGFjZSBhcG9sbG82OGIgYW5kIGFwb2xsbzY4diB3aXRoIEFwb2xsbwotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbmlzZSBhcG9sbG9jb2ZmX3ZlYwotCi0JKiB0YXJnZXRzLmM6IExpa2V3aXNlCi0KLQkqIGNvbmZpZy9hcG9sbG8ubWgsIGNvbmZpZy9hcG9sbG8ubXQ6IE5ldyBmaWxlcwotCi0JKiBob3N0cy9hcG9sbG82OC5oOiBSZW1vdmUgaW5jbHVzaW9uIG9mIHN0cmluZ3MuaAotCi1XZWQgT2N0IDEzIDE0OjI4OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pMzg2LmMgKGkzY29mZl9vYmplY3RfcCk6IE5vdyBzdGF0aWMuCi0KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIGRlcGVuZGVuY2llcy4KLQkoLmRlcCwgLmRlcDEsIGRlcC5zZWQpOiBOZXcgdGFyZ2V0cywgdG8gbWFrZSAibWFrZSBkZXAiIHdvcmsKLQliZXR0ZXIuCi0JKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KLQotCSogbTY4a2x5bngtY2YuYyAoT05MWV9ERUNMQVJFX1JFTE9DUyk6IERlZmluZSwgdG8gYXZvaWQgbmFtZQotCWNvbmZsaWN0cyB3aGVuICItLXdpdGgtdGFyZ2V0cz1hbGwiLgotCSogY29mZi1tNjhrLmMgKG02OGtjb2ZmX2hvd3RvX3RhYmxlLCBtNjhrX3J0eXBlMmhvd3RvLAotCW02OGtfaG93dG8ycnR5cGUpOiBSZW5hbWUgdmlhIG1hY3JvcyB0byBrZWVwIG5hbWVzcGFjZSBjbGVhbi4KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIG02OGtseW54X2NvZmZfdmVjLCBpbmNsdWRlIGNvZmYtbTY4ay5vIGZvcgotCW5vdy4KLQotVHVlIE9jdCAxMiAxNzowMzoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1pcHMuYzogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBkbyByZWxvY2F0aW9ucyBhbmQgdG8KLQloYW5kbGUgTUlQUyBzcGVjaWZpYyBzZWN0aW9ucy4KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogUGFzcyBmb3VydGggYXJndW1lbnQgdG8KLQllbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gdG8gcGVybWl0IGl0IHRvIGNvbnRyb2wgdGhlCi0Jc2VjdGlvbiBpbmRleCB0byB1c2UuCi0JKGVsZl9vYmpfdGRhdGEpOiBBZGQgZ3AgYW5kIGdwX3NpemUgZmllbGRzLgotCShlbGZfZ3AsIGVsZl9ncF9zaXplKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkqIGVsZmNvZGUuaDogUmVtb3ZlZCBhIG51bWJlciBvZiB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENsZWFyIHNlY3Rpb24gaGVhZGVyIGJlZm9yZSBjYWxsaW5nCi0JZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywgbm90IGFmdGVyLgotCShwcmVwX2hlYWRlcnMpOiBSZXR1cm4gdHJ1ZSBhdCBlbmQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBQYXNzIHJldHZhbCBhcmd1bWVudCB0bwotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbi4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6Ci0JQWNjZXB0IGFuZCBpZ25vcmUgbmV3IHJldHZhbCBhcmd1bWVudC4KLQkqIGJmZC5jOiBJbmNsdWRlIGxpYmVsZi5oLgotCShiZmRfc2V0X2dwX3NpemUpOiBIYW5kbGUgRUxGIHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbiAoYmZkLm8pOiBEZXBlbmRzIHVwb24gbGliZWxmLmguCi0JKGVsZjMyLW1pcHMubyk6IERlcGVuZHMgdXBvbiAkKElOQ0RJUikvZWxmL21pcHMuaC4KLQotTW9uIE9jdCAxMSAxNzoyNToxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0KTogQ2hlY2sgYmZkX21ha2Vfc2VjdGlvbiByZXR1cm4gdmFsdWUuCi0JKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX25ld19zZWN0aW9uX2hvb2ssIGVjb2ZmX3NpemVvZl9oZWFkZXJzLAotCWVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywgZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMsCi0JZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGR1bW15IFJFR0lORk8gc2VjdGlvbi4KLQkoZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIHJlYWRpbmcKLQlSRUdJTkZPIHNlY3Rpb24uCi0JKiBsaWJlY29mZi5oIChlY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSBmcm9tIG1hY3JvCi0JZGVmaW5pdGlvbiB0byBmdW5jdGlvbiBwcm90b3R5cGUuCi0JKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBOZXcgcHJvdG90eXBlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9ta29iamVjdF9ob29rKTogUmVtb3ZlZC4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogVXNlIGVjb2ZmX21rb2JqZWN0X2hvb2suCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9ta29iamVjdF9ob29rKTogUmVtb3ZlZC4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBVc2UgZWNvZmZfbWtvYmplY3RfaG9vay4KLQotRnJpIE9jdCAgOCAxNToyNTozMyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0KjMyLCBiZmRfZ2V0KjY0KTogIFByZXZlbnQgQU5TSSBzaWduIGV4dGVuc2lvbgotCWJ5IGNhc3RpbmcgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSB0byBiZmRfdm1hLgotCi1GcmkgT2N0ICA4IDAyOjM0OjIxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluOiAgRG8gbm90IGRlZmluZSBTRUxFQ1RfVkVDUywgU0VMRUNUX0FSQ0hJVEVDVFVSRVMKLQlpZiBjb25maWd1cmluZyAtLXdpdGgtdGFyZ2V0cz1hbGwuCi0KLVRodSBPY3QgIDcgMTc6MzQ6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9zdGQpOiBDb3JyZWN0IHRoZSAic2l6ZSIgZmllbGQgaW4gc29tZQotCWVudHJpZXMuCi0KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBDaGFuZ2UgZG9jdW1lbnRhdGlvbiB0byBkaXNwZWwgYW55Ci0Jbm90aW9uIHRoYXQgdGhlICJzaXplIiBmaWVsZCBpcyBhIHBvd2VyLW9mLXR3byBpbmRpY2F0b3IuCi0KLVRodSBPY3QgIDcgMTA6NTA6MzggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotICAgICAgICogY29mZnN3YXAuaDogKGJmZF9zd2FwX3JlbG9jX2luKTogYSBzeW1uZHggaXMgc2lnbmVkLgotCi0JTWFrZSBzdXBwb3J0IGZvciByZWxheGluZyBtb3JlIGdlbmVyaWMuCi0JKiByZWxvYzE2LmM6IEFkZCBuZXcgdGFyZ2V0IGVudHJ5IC0gYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSwKLQlmaXggYml0IHJvdC4KLQkqIGxpYmNvZmYuaCwgbGliY29mZi1pbi5oOiBkZWNsYXJhdGlvbnMuIFByb3RvdHlwZXMKLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogQWRkIGNhbGxzIHRvCi0JY29mZl9yZWxvY18xNl9leHRyYV9jYXNlcyBhbmQgY29mZl9yZWxvYzE2X2VzdGltYXRlLgotCShkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogTmV3IGZ1bmN0aW9uLgotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogTmV3IGZ1bmN0aW9uCi0KLVRodSBPY3QgIDcgMTQ6MjQ6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKEVBTElHTik6IERlZmluZSwgZGVwZW5kZW50IG9uIEFSQ0hfU0laRS4KLQkoYWxpZ25fZmlsZV9wb3NpdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2xvY2F0ZV9zaCk6IERpc2FibGVkIGZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc3ltdGFiX2FuZF9zdHJ0YWJzKTogQWxpZ24gcG9zaXRpb24sCi0JdGhlbiBwbGFjZSBzeW10YWIsIHRoZW4gZG8gb3RoZXIgc2VjdGlvbnMuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQWxpZ24gcHJvZ3JhbSBoZWFkZXIuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWxpZ24gc2VjdGlvbiBoZWFkZXJzLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyk6IEFsaWduIHJlbG9jYXRpb24gc2VjdGlvbnMuCi0KLVR1ZSBPY3QgIDUgMTA6NDQ6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgaHBwYSotKi1oaXV4KiAoY3VycmVudGx5IHN5bm9ueW0gZm9yIGhwdXgpLgotCUNoYW5nZSBvdGhlciBocHBhIGVudHJpZXMgdG8gdXNlIC0qLSBub3QgLWhwLS4KLQkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBocHBhKi0qLWhpdXgqIChjdXJyZW50bHkgc3lub255bSBmb3IgaHB1eCkuCi0KLQkqIGNvZmYtcnM2MDAwLmMsIGNwdS1yczYwMDAuYywgcnM2MDAwLWNvcmUuYzogQ2hhbmdlIG5vbi1BU0NJSQotCWNoYXJhY3RlcnMgaW4gY29tbWVudCB0byBvY3RhbCBlc2NhcGVzLgotCi1TdW4gT2N0ICAzIDEyOjM1OjE1IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pMzg2bHlueC5jOiBSZW1vdmVkLCBuYW1lIHRvbyBsb25nLgotCSogaTM4Nmx5bngtY2YuYzogTmV3IGZpbGUsIHdhcyBjb2ZmLWkzODZseW54LmMuCi0JKiBjb25maWd1cmUuaW46IFJlZmxlY3QgZmlsZSBuYW1lIGNoYW5nZXMuCi0JKiBNYWtlZmlsZS5pbjogTWVudGlvbiBMeW54LXJlbGF0ZWQgZmlsZXMuCi0KLQkqIGkzODZseW54LmMgKGx5bnhfMzJfc3dhcF9leHRfcmVsb2NfaW4pOiBnZXQgcmVsb2MgYml0cyBpbiBpMzg2Ci0JTHlueC1zcGVjaWZpYyB3YXkuCi0KLQkqIG02OGtseW54LWNmLmM6IE5ldyBmaWxlLCBkZWZpbmVzIGNvZmYgZm9ybWF0IGZvciBNNjhLIEx5bnhPUy4KLQkqIG02OGtseW54LmM6IFJlbW92ZSBjb2ZmIHZlY3RvciBkZWZpbml0aW9uLCBub3cgaW4gbTY4a2x5bngtY2YuYy4KLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBTZXQgc2VjdGlvbiBmbGFnIHRvIFNUWVBfSU5GTwotCWZvciAuc3RhYiwgLnN0YWJzdHIgYW5kIC5kZWJ1ZyBzZWN0aW9ucywgYW5kIHNldCBTRUNfREVCVUdHSU5HIGZvcgotCXNlY3Rpb25zIG9mIHR5cGUgU1RZUF9JTkZPLiAgKGZyb20gTWluaCBUcmFuLUxlKQotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkZCBkaXNjYXJkZWRfc2VjdGlvbnNfY291bnQKLQl0byBhYmZkLT5zZWN0aW9uX2NvdW50LCB3aGljaCBoZWxwcyBgc3RyaXAnIGtlZXAgdGhlIHNpemUKLQlvZiB0aGUgZXhlY3V0YWJsZSBoZWFkZXIgY29uc3RhbnQuCi0JKiBjb2ZmLWkzODYuYyAoZGlzY2FyZGVkX3NlY3Rpb25zX2NvdW50KTogTmV3IHZhcmlhYmxlLCBpbml0aWFsaXplZAotCXRvIHplcm8uICBGb3IgdXNlIGJ5IGBzdHJpcCcuICBDdXJyZW50bHkgYmVpbmcgdXNlZCBvbmx5IGluIGFpeDM4NgotCWNvZmYsIGJ1dCBtYXkgYmUgdXNlZnVsIGZvciBvdGhlciBjb2ZmIHN5c3RlbXMuICAoZnJvbSBNaW5oIFRyYW4tTGUpCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IEFkZGVkIGEgbWlzc2luZyBjYXN0LgotCi0JKiBhcmNoaXZlLmM6IENvc21ldGljIGltcHJvdmVtZW50cy4KLQkqIG9wbmNscy5jOiBDb3NtZXRpYyBpbXByb3ZlbWVudHMuCi0JKG5ld19iZmQpOiBSZW1vdmVkIHJlZHVuZGFudCBzdHJ1Y3R1cmUgc2xvdCBpbml0LgotCi1TYXQgT2N0ICAyIDE4OjQ4OjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbmV3cy1taXBzLm1oLCBob3N0cy9uZXdzLW1pcHMuaDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBuZXdzLW1pcHMgZm9yIG1pcHMtc29ueS1ic2QqLgotCi1GcmkgT2N0ICAxIDEzOjE0OjE3IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBpMzg2bHlueF9jb2ZmX3ZlYyByZXF1aXJlcyBjb2ZmLWkzODZseW54Lm8uCi0JKiBjb2ZmLWkzODZseW54LmM6IE5ldyBmaWxlLCBkZWZpbmVzIEx5bnggdGFyZ2V0IHZlY3RvciBhbmQgbmFtZSwKLQlpbmNsdWRlcyBjb2ZmLWkzODYuYy4KLQkqIGNvZmYtaTM4Ni5jIChpMzg2Y29mZl92ZWMpOiBBbGxvdyByZWRlZmluaXRpb24gb2YgdGFyZ2V0IHZlY3RvcgotCXN5bWJvbCBhbmQgbmFtZSwgaWYgVEFSR0VUX1NZTSBhbmQvb3IgVEFSR0VUX05BTUUgYXJlIGRlZmluZWQuCi0JKiBpMzg2bHlueC5jOiBSZW1vdmUgY29mZiB2ZWN0b3IgZGVmaW5pdGlvbiBlbnRpcmVseS4KLQkobHlueF8zMl9zd2FwX2V4dF9yZWxvY19pbik6IERlZmluZS4KLQkobHlueF8zMl9zd2FwX3N0ZF9yZWxvY19pbik6IERlZmluZSwgZ2V0IHJlbG9jIGJpdHMgaW4gaTM4NgotCUx5bngtc3BlY2lmaWMgd2F5LgotCShseW54XzMyX3N3YXBfZXh0X3JlbG9jX291dCk6IERlZmluZS4KLQkobHlueF8zMl9zd2FwX3N0ZF9yZWxvY19vdXQpOiBEZWZpbmUuCi0JKGx5bnhfMzJfc2x1cnBfcmVsb2NfdGFibGUpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0JKGx5bnhfMzJfc3F1aXJ0X291dF9yZWxvY3MpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0JKGx5bnhfMzJfY2Fub25pY2FsaXplX3JlbG9jKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgotCShXUklURV9IRUFERVJTKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgotCi0JKiBjb25maWcvaTM4Ni1seW54Lm10IChTRUxFQ1RfVkVDUyk6IFJlbW92ZSByZWR1bmRhbnQgdmVjdG9yLgotCi1UaHUgU2VwIDMwIDE3OjUwOjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IEFkZCBsaW5rYWdlLXRhYmxlIHJlbGF0aXZlCi0JcmVsb2NhdGlvbnMgb2Ygc2l6ZSA4LCAxNiwgMzIuICBTb3J0IGdlbmVyaWMgcmVsb2NzIGJ5IHR5cGUgcmF0aGVyCi0JdGhhbiBzaXplLiAgQWRkZWQgYSBsaXR0bGUgZG9jdW1lbnRhdGlvbiB0b28uCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6IEFkZCBCQVNFMTYgYW5kIEJBU0UzMiByZWxvY3MuCi0JKFRBQkxFX1NJWkUpOiBOZXcgbWFjcm8uCi0JKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ197MTYsMzJ9X0JBU0VSRUwgZm9yIHN0ZAotCXJlbG9jcy4KLQkoc3dhcF9zdGRfcmVsb2Nfb3V0KTogV3JpdGUgYmFzZXJlbCByZWxvY3MgY29ycmVjdGx5LgotCShzd2FwX3N0ZF9yZWxvY19pbik6IEhhbmRsZSByX2Jhc2VyZWwgZmllbGQuICBBc3NlcnQgdGhhdAotCXJfam1wdGFibGUgYW5kIHJfcmVsYXRpdmUgZmllbGRzIGFyZSBjbGVhciwgYW5kIHRoYXQgdGhlIGNvbXB1dGVkCi0JaW5kZXggZG9lcyByZWZlciB0byBhIGRlZmluZWQgZW50cnkgb2YgdGhlIGhvd3RvIHRhYmxlLgotCi1UdWUgU2VwIDI4IDE0OjQ3OjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogTmV3IGZ1bmN0aW9uLgotCSogc2VjdGlvbi5jOiBDaGFuZ2UgY29tbWVudHMgdG8gc2F5IHNldmVyYWwgc2VjdGlvbnMgY2FuIGhhdmUKLQl0aGUgc2FtZSBuYW1lLgotCSogYmZkLWluMi5oOiBSZS1nZW5lcmF0ZSB0byByZWZsZWN0IGFib3ZlIGNoYW5nZS4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogQ2FsbCBiZmRfbWFrZV9zZWN0aW9uX2FueXdheQotCWlmIHN0aWxsIG5vIHNlY3Rpb24gYWZ0ZXIgdGhlIGJmZF9jb2ZmX21ha2Vfc2VjdGlvbl9ob29rLgotCSogY29mZmNvZGUuaDogQWRkIGNvbW1lbnQgYWJvdXQgVFdPX0RBVEFfU0VDUy4KLQotVHVlIFNlcCAyOCAwMzoyMjoyNCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiAgQWx3YXlzIGRldGVybWluZSByYXdfc2l6ZQotCWV4cGxpY2l0bHkuCi0JKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncywgZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiAgSGFuZGxlCi0JLmZpbmkgc2VjdGlvbi4KLQotTW9uIFNlcCAyNyAxODoyOToxOCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgY29uZmlndXJlLmhvc3Q6IE1hdGNoIG9uICotbHlueG9zKiBmb3IgTHlueE9TLAotCWFkZCBtNjgqLSotbHlueG9zKi4KLQkqIGNvbmZpZ3VyZS5pbiA6IFJlcGxhY2VkIGkzODZseW54X3ZlYyB3aXRoIGkzODZseW54X2FvdXRfdmVjCi0JYW5kIGkzODZseW54X2NvZmZfdmVjLgotCUFkZGVkIG02OGtseW54X2FvdXRfdmVjIGFuZCBtNjhrbHlueF9jb2ZmX3ZlYy4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZWQgaTM4Nmx5bnhfdmVjLCBhZGRlZAotCXtpMzg2LG02OGt9bHlueF97YW91dCxjb2ZmfV92ZWMuCi0JKiBpMzg2bHlueC5jOiBBZGRlZCBjb3B5IG9mIGkzODZjb2ZmLmMsIHJlbmFtZWQgYmZkIHRhcmdldCB0bwotCWkzODZseW54X2NvZmZfdmVjLgotCSogbTY4a2x5bnguYzogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1seW54Lm10OiBSZXBsYWNlZCBpMzg2bHlueF92ZWMgd2l0aCBpMzg2bHlueF9hb3V0X3ZlYwotCWFuZCBpMzg2bHlueF9jb2ZmX3ZlYy4KLQkqIGNvbmZpZy9tNjhrLWx5bngubXQ6IE5ldyBmaWxlLgotCSogaG9zdHMvaTM4Nmx5bnguaDogQWRkZWQgZGVmaW5pdGlvbiBvZiBjZnJlZSBhcyBmcmVlIChmcm9tIEVpY2hpbikuCi0JKiBob3N0cy9tNjhrbHlueC5oOiBOZXcgZmlsZS4KLQotTW9uIFNlcCAyNyAxODowMDo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jOiBEZWZpbmUgb2Zmc2V0b2YgaGVyZS4KLQkqIGhvc3RzLyouaDogRG9uJ3QgZGVmaW5lIGl0IGhlcmUuCi0KLU1vbiBTZXAgMjcgMTk6MDk6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFNldCBmaWxlcG9zIGZvciBTSFRfU1RSVEFCCi0Jc2VjdGlvbi4KLQotRnJpIFNlcCAyNCAxNTo0Nzo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaHB1eC1jb3JlLmM6IEFkZCBjb21tZW50IGFib3V0IGhwdXggdmVyc2lvbiA3LgotCi1GcmkgU2VwIDI0IDE2OjUwOjI2IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGx5bngtY29yZS5jIChseW54X2NvcmVfZmlsZV9wKTogIENoYW5nZSBwZXItdGhyZWFkIHJlZ2lzdGVyCi0Jc2VjdGlvbiBuYW1lcyBmcm9tIC5yZWdYWFggdG8gLnJlZy9YWFggdG8gYXZvaWQgcGFyc2luZyBhbWJpZ3VpdHkKLQlpbiBnZGIvY29yZWxvdy5jLiAgQ3JlYXRlIGFsaWFzIC5yZWcgc2VjdGlvbiBmb3IgdGhlIGN1cnJlbnRseQotCXJ1bm5pbmcgdGhyZWFkLgotCi1GcmkgU2VwIDI0IDEzOjIyOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliZWNvZmYuaCAoZWNvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBiaWdfbWFnaWMgYW5kCi0JbGl0dGxlX21hZ2ljIGZpZWxkcy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBpbml0aWFsaXphdGlvbgotCW9mIGJpZ19tYWdpYyBhbmQgbGl0dGxlX21hZ2ljLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rKTogTWFrZSBzdXJlIG1hZ2ljIG51bWJlcgotCW1hdGNoZXMgZW5kaWFuZXNzIG9mIGJmZC4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIGluaXRpYWxpemF0aW9uIG9mIGJpZ19tYWdpYyBhbmQKLQlsaXR0bGVfbWFnaWMuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBTZXQgTUlQUyBtYWNoaW5lIG51bWJlcgotCWJhc2VkIG9uIG1hZ2ljIG51bWJlci4gIFN1cHBvcnQgcjQwMDAgbWFnaWMgbnVtYmVycy4KLQkoZWNvZmZfZ2V0X21hZ2ljKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgZWNvZmZfZ2V0X21hZ2ljLCBub3QgZmllbGRzIGluCi0JdGhlIGJhY2tlbmQgc3RydWN0dXJlLgotCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZGVkIGNhc2UgZm9yIHI2MDAwLgotCi0JRm9yIE1JUFMgY29uZmlndXJhdGlvbnMgcHV0IGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIHZlcnNpb25zIGluCi0JdGhlIGxpc3Qgb2YgdGFyZ2V0czsgdGhlIGNvZGUgaXMgZ2V0dGluZyBjb21waWxlZCBpbiBhbnlob3cuCi0JKiBiaWdtaXBzLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBlY29mZl9saXR0bGVfdmVjLgotCSogZGVjc3RhdGlvbi5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgZWNvZmZfYmlnX3ZlYy4KLQkqIG1pcHNiZWxmLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMuCi0JKiBtaXBzbGVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgYmZkX2VsZjMyX2JpdG1pcHNfdmVjLgotCSogcmlzY29zLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBlY29mZl9saXR0bGVfdmVjLgotCi1GcmkgU2VwIDI0IDAwOjQyOjIzIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogb3NmLWNvcmUuYzogIE5ldyBmaWxlIGZvciBPU0YvMSBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGNvbmZpZy9hbHBoYW9zZi5taCAoSERFRklORVMpOiAgQWRkIC1ET1NGX0NPUkUuCi0JKEhERVBGSUxFUyk6ICBTZXQgdG8gb3NmLWNvcmUuby4KLQkqIGJmZC1pbjIuaCAodW5pb24gdGRhdGEpOiAgQWRkIG9zZl9jb3JlX2RhdGEgbWVtYmVyLgotCSogdGFyZ2V0cy5jOiAgSWYgT1NGX0NPUkUgaXMgZGVmaW5lZCwgYWRkIG9zZl9jb3JlX3ZlYyB0byB0YXJnZXQgbGlzdC4KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6ICBBZGQgb3NmLWNvcmUuby4KLQkob3NmLWNvcmUubyk6ICBOZXcgZGVwZW5kZW5jeS4KLQotVGh1IFNlcCAyMyAyMTowNDo1MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogVE9ETzogUmVtb3ZlIG5vdGUgYWJvdXQgbWFraW5nIC0td2l0aC1iZmQtdGFyZ2V0cyB1c2UgY2Fub25pY2FsCi0JdGFyZ2V0IGNvbmZpZ3VyYXRpb24gbmFtZSAoYWxyZWFkeSBkb25lKTsgcmV3b3JkIGl0ZW0gYWJvdXQKLQlzZXBhcmF0aW5nIHJlYWRpbmcgYW5kIHdyaXRpbmcgc3R1ZmYgdG8gbm90IHJlZmVyIHRvIGEKLQlub24tZXhpc3RlbnQgaXRlbS4KLQotCSogZWNvZmYuaCAoZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWNjZXB0IE1JUFNfTUFHSUNfTElUVExFMgotCWFuZCBNSVBTX01BR0lDX0JJRzIuCi0KLVRodSBTZXAgMjMgMTE6MDY6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBnZW4tYW91dC5jIChtYWluKTogT3V0cHV0IG5ld2xpbmUgYWZ0ZXIgZW5kIG9mIGNvbW1lbnQsIG5vdAotCWJlZm9yZS4gIChSZXBvcnRlZCBieSBKb25hdGhhbiBTdG9uZSwKLQlqb25hdGhhbkBvc2Nhci5zdGFuZm9yZC5lZHUpLgotCi1UaHUgU2VwIDIzIDEwOjQ4OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IFB1dCB3ZWFrIHN5bWJvbHMgaW4gdGhlCi0JYXJtYXAuCi0KLQkqIGVsZmNvZGUuaCAoZml4X3VwX3N0cnRhYnMpOiBTZXQgc2hfZW50c2l6ZSBmb3IgdGhlIC5zdGFiCi0Jc2VjdGlvbiwgbm90IHRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgU2V0IHRoZSB0eXBlIG9mIHRoZSAuc3RhYnN0cgotCXNlY3Rpb24gdG8gU0hUX1NUUlRBQi4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEhhbmRsZSBTSFRfU1RSVEFCIHNlY3Rpb25zLgotCi0JKiBzZWN0aW9uLmMgKFNFQ19ERUJVR0dJTkcpOiBOZXcgc2VjdGlvbiBmbGFnLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJZiBzZWN0aW9uIGlzIFNIVF9QUk9HQklUUywKLQlhbmQgdGhlIG5hbWUgc3RhcnRzIHdpdGggLmRlYnVnLCAubGluZSBvciAuc3RhYiwgc2V0Ci0JU0VDX0RFQlVHR0lORy4gIElmIFNIVF9TVFJUQUIsIGNoZWNrIGZvciAuZGVidWcgYW5kIC5zdGFiLgotCSogZWxmMzItdGFyZ2V0LmggKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfTElUVExFX1NZTSk6IEFkZGVkCi0JU0VDX0RFQlVHR0lORyB0byBzZWN0aW9uX2ZsYWdzLgotCSogZWxmNjQtdGFyZ2V0LmggKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfTElUVExFX1NZTSk6IEFkZGVkCi0JU0VDX0RFQlVHR0lORyBhbmQgU0VDX0NPREUgdG8gc2VjdGlvbl9mbGFncy4KLQkqIGJmZC1pbjIuaDogVXBkYXRlZC4KLQotV2VkIFNlcCAyMiAxNjozNDoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jICh0ZGF0YSk6IEFkZCBseW54X2NvcmVfZGF0YS4KLQotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2V0IGZpbGVwb3MgZm9yCi0Jc2VjdGlvbnMgd2l0aCBTRUNfTE9BRCBzZXQsIGV2ZW4gaWYgU0VDX0hBU19DT05URU5UUyBpcyBjbGVhci4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IHNjbnB0ciB0byB6ZXJvIGp1c3QKLQliZWNhdXNlIHNpemUgb2Ygc2VjdGlvbiBpcyB6ZXJvLiAgTmVlZGVkIGZvciBJcml4IDQuMC41Ri4KLQotV2VkIFNlcCAyMiAwOTo0OTozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIGk5NjAtYm91dCwgbm90IGk5NjAtY29mZiBmb3IgaTk2MC0qLW5pbmR5Ki4KLQotV2VkIFNlcCAyMiAwNzozNDowOSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiAgQWRkIGx5bngtY29yZS5vLgotCSogYmZkLWluMi5oICh0ZGF0YSk6ICBBZGQgbHlueF9jb3JlX2RhdGE7Ci0JKiBjb25maWcuYmZkIGNvbmZpZ3VyZS5ob3N0OiAgR2V0IHJpZCBvZiBzdXBlcmZsdW91cyBuZXRic2QgYW5kCi0JbHlueG9zIGVudHJpZXMuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgbHlueC1jb3JlLm8gdG8gTHlueCBjb25maWcuCi0JKiBpMzg2bHlueC5jOiAgQWRkIGRlZnMgZm9yIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogbHlueC1jb3JlLmM6ICBOZXcgZmlsZSB3aXRoIEx5bnggY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBob3N0cy9pMzg2bHlueC5oOiAgTW92ZSBsb3RzIG9mIGhvc3Qgc3BlY2lmaWMgaW5jbHVkZXMgdG8gaGVyZS4KLQlBZGQgZGVmIG9mIEhPU1RfTFlOWC4gIFJlbW92ZSB1bm5lY2Vzc2FyeSBkZWZzLgotCi1Nb24gU2VwIDIwIDE5OjE4OjEwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBPbmx5IHNldCBTRUNfREFUQSBmb3IgYQotCVNIRl9QUk9HQklUUyBvciBTSFRfU1RSVEFCIHNlY3Rpb24gaWYgU0VDX0FMTE9DIGlzIHNldC4gIE5ldmVyIHNldAotCVNFQ19EQVRBIGZvciBhIFNIRl9OT0JJVFMgc2VjdGlvbi4KLQotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl9tYW5nbGVfcmVsb2NzKTogQ2hlY2sgU0VDX0xPQUQgcmF0aGVyCi0JdGhhbiBTRUNfQ09ERSB8IFNFQ19EQVRBLiAgQWRkIHNvbWUgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBubG1jb2RlLmg6IEFkZCBzb21lIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWdub3JlIHJlbG9jcyBmb3Igc2VjdGlvbnMgdGhhdCBhcmUKLQluZWl0aGVyIGNvZGUgbm9yIGRhdGEuICBKdXN0IHVzZSB0aGUgc3ltYm9sIHZhbHVlIGZvciBkZWJ1Z2dpbmcKLQlzeW1ib2xzOyBkb24ndCBvZmZzZXQgYnkgdGhlIHNlY3Rpb24gdm1hLgotCi1GcmkgU2VwIDE3IDE4OjA4OjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IHJldHVybiBhbiBlcnJvciB3aGVuCi0JcGVyZm9ybWluZyBhIHJlbG9jIGFnYWluc3QgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCSogc3ltcy5jIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogU2hvdyB2YWx1ZSBvZiBCU0ZfV0VBSyByYXRoZXIKLQl0aGFuIG9ic29sZXRlIEJTRl9FWFBPUlQuCi0KLUZyaSBTZXAgMTcgMDI6MDQ6MzEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3thbHBoYW9zZi5oLCBhbWl4LmgsIGFwb2xsbzY4LmgsIGFwb2xsb3Y2OC5oLAotCWRlY3N0YXRpb24uaCwgZGVsdGE4OC5oLCBkZ3V4LmgsIGRvc2UuaCwgZ28zMi5oLCBoYXJyaXMuaCwKLQlocDMwMC5oLCBocDMwMGJzZC5oLCBocHBhYnNkLmgsIGhwcGFocHV4LmgsIGkzODZhaXguaCwgaTM4NmJzZC5oLAotCWkzODZsaW51eC5oLCBpMzg2bHlueC5oLCBpMzg2di5oLCBpMzg2djQuaCwgaXJpeDMuaCwgaXJpeDQuaCwKLQltaXBzYnNkLmgsIG5jcjMwMDAuaCwgcnM2MDAwLmgsIHJ0YnNkLmgsIHNvbGFyaXMyLmgsIHNwYXJjLWxsLmgsCi0Jc3RkLWhvc3QuaCwgc3RyYXR1cy5oLCBzdW4zLmgsIHN5c3Y0LmgsIHRhaG9lLmgsIHVsdHJhMy5oLAotCXZheHVsdC5oLCB2YXh1bHQyLmgsIHdlMzJrLmh9OiAgTWFrZSBzdXJlIHRoYXQgIm9mZnNldG9mIiBpcwotCWRlZmluZWQgb24gYWxsIGhvc3RzLCBub3cgdGhhdCBhcmNoaXZlLmMgdXNlcyBpdC4KLQotVGh1IFNlcCAxNiAxODoyMDozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogQ3JlYXRlIHNlY3Rpb24gc3ltYm9scyBmb3IgYWxsCi0Jc2VjdGlvbnMsIG5vdCBqdXN0IGFsbG9jYXRlZCBzZWN0aW9uczsgZGVidWdnaW5nIHNlY3Rpb25zIGNhbiBoYXZlCi0JcmVsb2NzLgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IElmIHRoZXJlIGlzIGFuIG91dHB1dCBzZWN0aW9uLCB1c2UKLQl0aGUgc2VjdGlvbiBpbmRleCBmcm9tIHRoYXQgcmF0aGVyIHRoYW4gdGhlIGlucHV0IHNlY3Rpb24uCi0KLVRodSBTZXAgMTYgMTI6MjA6NTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChiZmRfZmx1c2gsIGJmZF9zdGF0KTogUmVmbGVjdCBKb2huJ3MgY2hhbmdlcyB0bwotCWxpYmJmZC5oLCB3aGljaCBpcyByZWdlbmVyYXRlZCBmcm9tIHRoaXMgZmlsZS4KLQotCSogYmZkLWluLmggKHN5bXR5cGUpOiBEZWxldGVkIHR5cGVkZWYuCi0KLVdlZCBTZXAgMTUgMTE6NDg6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYyAoQ09FUkNFeHgpOiBDYXN0IHggdG8gYmZkX3NpZ25lZF92bWEgYmVmb3JlIGRvaW5nIHRoZQotCXhvciBhbmQgc3VidHJhY3QuICBPdGhlcndpc2UgaXQgd2lsbCBub3Qgc2lnbiBleHRlbmQgaWYgdGhlIHR5cGUKLQlvZiBiZmRfdm1hIGlzIGxhcmdlciB0aGFuIGludC4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luKTogR2V0IHJlZ29mZnNldCwgaW9wdCwgZnJlZ29mZnNldAotCWFuZCBmcmFtZW9mZnNldCBhcyBzaWduZWQgbnVtYmVycy4gIEZyb20gUGV0ZXIgU2NoYXVlci4KLQotVHVlIFNlcCAxNCAxODoyMDozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQWRkIGJmZF9lbGZfZ2VuZXJpY19yZWxvYwotCXNwZWNpYWwgZnVuY3Rpb24gZm9yIGFsbCByZWxvYyBlbnRyaWVzLgotCSogZWxmMzItdGFyZ2V0LmggKFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkIFNFQ19DT0RFIHRvCi0Jc2VjdGlvbl9mbGFncy4KLQkqIGxpYmVsZi5oIChlbGZfc3ltYm9sX3R5cGUpOiBSZW1vdmUgZGVzYywgdHlwZSBhbmQgb3RoZXIgZmllbGRzLgotCSogTWFrZWZpbGUuaW4gKGVsZjMyLSoubyk6IFRoZXNlIGRlcGVuZCB1cG9uIGVsZjMyLXRhcmdldC5oLgotCi1UdWUgU2VwIDE0IDE0OjM0OjQ1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChzdHJ1Y3QgYXJ0ZGF0YSk6ICBBZGQgYXJtYXBfdGltZXN0YW1wIGFuZAotCWFybWFwX2RhdGVwb3MgaGVyZSB0b28uCi0KLU1vbiBTZXAgMTMgMjE6MDM6MTggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGNhY29waG9ueS5jeWdudXMuY29tKQotCi0JSW1wcm92ZSB0aW1lc3RhbXAgc3VwcG9ydCBpbiBCU0QgYXJjaGl2ZSBmaWxlcyB0byBhdm9pZCBsaW5rZXIKLQl3YXJuaW5ncy4KLQotCSogbGliYmZkLmggKHN0cnVjdCBhcnRkYXRhKTogIEFkZCBhcm1hcF90aW1lc3RhbXAgYW5kIGFybWFwX2RhdGVwb3MuCi0JKGJmZF9mbHVzaCwgYmZkX3N0YXQpOiAgQWRkIHByb3RvdHlwZXMuCi0JKiBsaWJiZmQuYyAoYmZkX2ZsdXNoKTogIEFkZCwgZG9lcyBmZmx1c2ggb24gYSBCRkQuCi0JKGJmZF9zdGF0KTogIEFkZCwgZG9lcyBmc3RhdCBvbiBhIEJGRC4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBBdCBlbmQgb2YgZmlsZSB3cml0aW5nLAotCXZlcmlmeSBhbmQgcG9zc2libHkgdXBkYXRlIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGFybWFwLCBpZiBhIEJTRAotCWFyY2hpdmUuICBGSVhNRSEgIEtsdWRnZSByZWNvZ25pemVzIEJTRCBhcmNoaXZlLCByYXRoZXIgdGhhbgotCXZlY3RvcmluZyBwcm9wZXJseS4gIFNob3VsZCBhZGQgdG8geHZlYy4KLQkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiAgTW92ZSBwcm90b3R5cGUgdG8gdG9wLCBhdm9pZCBQUk9UTy4KLQkoYnNkX3dyaXRlX2FybWFwKTogU2F2ZSB0aW1lc3RhbXAgYW5kIGZpbGUgbG9jYXRpb24gdGhlcmVvZiwgd2hlbgotCXdyaXRpbmcgdGhlIGFybWFwIGluIGEgQlNEIGZpbGUuCi0JKGJzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogIE5ldyBmdW5jdGlvbiB0byBjaGVjayBhbmQKLQlyZXdyaXRlIHRoZSB0aW1lc3RhbXAuCi0KLQkqIGhvc3RzL3N0ZC1ob3N0LmggKG9mZnNldG9mKTogIERlZmluZSwgaWYgbm90IGFscmVhZHksIGZvciBhcmNoaXZlLmMuCi0KLVNhdCBTZXAgMTEgMTg6MTM6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZzY28uaDogRGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYgZm9yIGNvcmUgZmlsZXMuCi0JKiBzY28tY29yZS5jOiBSZW1vdmUsIHJlcGxhY2UgYnkgdHJhZC1jb3JlLmMuCi0JKiB0cmFkLWNvcmUuYzogSWYgSE9TVF9TVEFDS19TVEFSVF9BRERSIGlzIGRlZmluZWQsIHVzZSBpdC4KLQkqIGNvbmZpZy9pMzg2c2NvLm1oOiBVc2UgdHJhZC1jb3JlIG5vdCBzY28tY29yZS4KLQkqIGhvc3RzL2kzODZpc2MuaCwgY29uZmlnL2kzODZpc2MubWg6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgaTM4NnNjbyBmb3IgaXNjLgotCSogY29uZmlnL2kzODYtc2NvLm10OiBSZW1vdmUsIGlkZW50aWNhbCB0byBpMzg2LWNvZmYubXQuCi0JKiBjb25maWcuYmZkOiBVc2UgaTM4Ni1jb2ZmIG5vdCBpMzg2LXNjby4KLQotCSogY29uZmlnLmJmZDogUmVjb2duaXplIGlbMzRdODYtKi1zb2xhcmlzMiogc3BlY2lmaWNhbGx5IHJhdGhlcgotCXRoYW4gdXNpbmcgKi0qLXNvbGFyaXMyKiAoaTQ4Ni11bmtub3duLXNvbGFyaXMyIGlzIGkzODYtZWxmLCBub3QKLQlpNDg2LWVsZiB3aGljaCBkb2Vzbid0IGV4aXN0KS4KLQotRnJpIFNlcCAxMCAxMjo1NjozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEZvciBBTFBIQUVDT0ZGLCBmb3JjZQotCXBhZGRpbmcgZmllbGQgdG8gemVyby4KLQotCSogY29uZmlnLmJmZCAoaVszNF04Ni0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0OyB1c2UgaTM4Ni1uZXRic2QuCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBib2d1cyBuZXRic2QzODYgaGFuZGxpbmcuCi0KLQkqIGNvZmYtbWlwcy5jOiBEb24ndCB3YXJuIGFib3V0IG92ZXJmbG93IGZvciBNSVBTX1JfSk1QQUREUiByZWxvYy4KLQlDb3JyZWN0IG92ZXJmbG93IGRldGVjdGlvbiByZXF1aXJlcyBtYXRjaGluZyB0aGUgdXBwZXIgZm91ciBiaXRzCi0Jb2YgdGhlIGRlc3RpbmF0aW9uIGFnYWluc3QgdGhlIFBDLgotCi1UaHUgU2VwICA5IDE2OjU3OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBNYWtlIDY0LWJpdCBzdHVmZiB3b3JrIHdpdGggIi0td2l0aC10YXJnZXRzPWFsbCIuCi0KLVR1ZSBTZXAgIDcgMTQ6MTc6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaDogUmVtb3ZlZCBzd2FwcGluZyByb3V0aW5lcyBkZWNsYXJhdGlvbnMuCi0JKiBiZmQtaW4uaDogQWRkZWQgc3dhcHBpbmcgcm91dGluZSBkZWNsYXJhdGlvbnMsIGFuZCByZW5hbWVkIHRoZW0KLQlmcm9tIF9kb18qIHRvIGJmZF8qLgotCSogbGliYmZkLmM6IFJlbmFtZWQgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBfZG9fKiB0byBfYmZkXyouCi0JKiBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVidWlsdC4KLQotTW9uIFNlcCAgNiAxNToyODowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogU2V0IHBjcmVsX29mZnNldCB0byB0cnVlIGZvcgotCVJfMzg2X1BDMzIuCi0KLUZyaSBTZXAgIDMgMTM6MDY6MTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlb3JnYW5pemVkIHNldHRpbmcgb2YgbWFrZWZpbGUgdmFyaWFibGVzIHNvCi0JNjQtYml0IHN0dWZmIHdvcmtzIGFnYWluLgotCi0JKiBsaWJiZmQtaW4uaCAoX2RvX2dldCosIF9kb19wdXQqKTogUmVuYW1lZCB2aWEgbWFjcm9zIHRvIGNsZWFuIHVwCi0JbmFtZXNwYWNlLgotCi0JKiBsaWJlbGYuaCAoZWxmMzJfc3ltYm9sX3R5cGUsIGVsZjY0X3N5bWJvbF90eXBlKTogRGVsZXRlZAotCSJuYXRpdmVfZWxmX3N5bSIgZmllbGQsIG1lcmdlZCB0byBtYWtlIG5ldyB0eXBlICJlbGZfc3ltYm9sX3R5cGUiLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEZpZWxkIHN5bWJvbHMgaXMgbm93IGVsZl9zeW1ib2xfdHlwZSouCi0JRGVsZXRlZCBmaWVsZCByYXdfc3ltcy4KLQkob2JqX3N5bWJvbHMpOiBSZW1vdmUgY2FzdC4KLQkob2JqX3Jhd19zeW1zKTogRGVsZXRlZC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHNldCByYXdfc3ltcyBvcgotCW5hdGl2ZV9lbGZfc3ltIGZpZWxkcy4KLQkqIGVsZjMyLWhwcGEuYzogQ2hhbmdlZCB1c2VzIG9mIGVsZjMyX3N5bWJvbF90eXBlIHRvCi0JZWxmX3N5bWJvbF90eXBlLgotCi0JRnJvbSBQZXRlIEhvb2dlbmJvb20gYW5kIEplZmYgTGF3OgotCi0JKiBlbGYzMi1ocHBhLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV90Y19zeW1ib2wpOiBJZiB0aGUgYXJndW1lbnQgcmVsb2NhdGlvbgotCWJpdHMgYXJlIHplcm8gKGUuZy4sIHRoZXkgc3BlY2lmeSBubyByZWxvY2F0aW9ucyksIHRoZW4gZG8gbm90Ci0JZXZlbiBib3RoZXIgYWRkaW5nIHRoZWlyIGVudHJpZXMgdG8gdGhlIHN5bWV4dG4gc2VjdGlvbi4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV90Y19zeW1ib2wpOiBBbnkgZnVuY3Rpb24sIHJlZ2FyZGxlc3MKLQlvZiBzY29wZSBjYW4gaGF2ZSBhbiBhcmd1bWVudCByZWxvY2F0aW9uIHN0dWIuCi0KLQkqIGVsZjMyLWhwcGEuYzogKEVsZjMyX2hwcGFfU3R1Yl9kZXNjcmlwdGlvbik6ICBSZW5hbWUgdGhpcwotCXN0cnVjdHVyZSBhbmQgdHlwZSB0byBlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24uICBUaGlzIG1ha2VzCi0JaXQgY29uc2lzdGVudCB3aXRoIHRoZSBHTlUgY29kaW5nIGNvbnZlbnRpb25zLgotCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24pOiBBZGRlZCBhICduZXh0JyBmaWVsZCB0byBhbGxvdwotCWxpbmtpbmcgb2Ygc3R1YiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmVzLgotCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24pOiBBZGRlZCBhICdzdHViX2xpc3RQJyBmaWVsZCB0bwotCWtlZXAgdHJhY2sgb2YgaW5kaXZpZHVhbCBzdHVicy4KLQkoRWxmMzJfaHBwYV9TdHViX2xpc3QsIEVsZjMyX2hwcGFfU3R1Yl9saXN0X3N0cnVjdCk6ICBSZW1vdmVkLgotCUNvbWJpbmVkIHdpdGggdGhlIGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbiBzdHJ1Y3R1cmUuCi0JKGVsZjMyX2hwcGFfc3R1Yl9uYW1lX2xpc3QpOiAgTmV3IHR5cGUgdG8ga2VlcCB0cmFjayBvZgotCWluZGl2aWR1YWwgc3R1YnMuCi0JKGFkZF9zdHViKTogIFJlbW92ZWQuCi0JKGFkZF9zdHViX2J5X25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbmRfc3R1Yl9ieV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IEFsbG93IHJldXNpbmcgc3R1YnMgdGhhdAotCWFscmVhZHkgZXhpc3QuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBBbGxvdyByZXVzaW5nIHN0dWJzIHRoYXQKLQlhbHJlYWR5IGV4aXN0LgotCi0JKiBlbGYzMi1ocHBhLmM6IChyZXR2YWxfbWlzbWF0Y2hlcyk6ICBUaGUgZGlyZWN0aW9uIG9mIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiB3YXMgcmV2ZXJzZWQuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogUmV0dXJuIGFkZHJlc3Mgd2FzIG5vdCBiZWluZwotCXJlc3RvcmVkLgotCShocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3ApOiBBZGQgYXJndW1lbnQgY29udGFpbmluZyBjYWxsZXIKLQlhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgc28gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiB0aGUgY2hlY2sKLQlmb3IgcGxhYmVsIHN0dWJzLgotCShocHBhX2VsZl9zdHViX2NoZWNrKTogUGFzcyBjYWxsZXIgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGludG8KLQlocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3AoKS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogQWRkIGNoZWNrIGZvciBwbGFiZWwgc3R1YnMgYW5kCi0JcGFzcyBjYWxsZXIgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGludG8KLQlocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3AoKS4KLQotVGh1IFNlcCAgMiAwMDo1OTo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChocHBhX2ZpZWxkX2FkanVzdCk6IFJlbW92ZSB1bnVzZWQgYGluaXRfdmFsdWUnIHZhcmlhYmxlLgotCi0JKiBob3N0cy9kZWx0YTg4djQuaDogTmV3IGZvciBTVlI0LgotCSogY29uZmlndXJlLmhvc3RzOiBVc2UgaXQuCi0KLVdlZCBTZXAgIDEgMTQ6MjM6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCwgbmV0YnNkMzg2LmM6IENoYW5nZSBNX0kzODYgdG8gTV8zODZfTkVUQlNELiAgTV9JMzg2Ci0JaXMgYW4gU0NPIHByZS1kZWZpbmUuCi0KLVR1ZSBBdWcgMzEgMTI6NTA6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IFNldCBIQVNfU1lNUyBpZiB0aGVyZSBhcmUgZXh0ZXJuYWwKLQlyZWZlcmVuY2VzLgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc197aW4sb3V0fSk6IFRoZSBjb3B5cmlnaHQgbGVuZ3RoIGlzCi0Jb25seSBvbmUgYnl0ZS4KLQkobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBJbmNsdWRlIGRlYnVnZ2luZyBzeW1ib2xzIGluIHN5bWJvbAotCWNvdW50LgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogTWFrZSBzeW1sZW5ndGggdW5zaWduZWQuICBSZWFkIGRlYnVnZ2luZwotCXN5bWJvbHMgYXMgQkZEIGxvY2FsIHN5bWJvbHMuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBib3RoZXIgd3JpdGluZyBvdXQgZXhwb3J0ZWQKLQlzeW1ib2xzIG1vcmUgdGhhbiBvbmNlOyB0aGV5IG5vdyBhcHBlYXIgaW4gdGhlIHN5bWJvbCB0YWJsZSBtb3JlCi0JdGhhbiBvbmNlICh3aXRoIGFuZCB3aXRob3V0IGEgcHJlZml4KSBpZiBuZWNlc3NhcnkuICBTZXQgb2Zmc2V0Ci0JdmFsdWVzIHRvIGJlIG5vbi16ZXJvIGFzIE5MTUxJTksgZG9lcy4KLQotVHVlIEF1ZyAzMSAxMjowNzo0MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oOiBSZXN0b3JlICN1bmRlZnMgb2YgZV9mc2VsIGFuZCBvdGhlciBlXyogc3ltYm9scy4KLQotRnJpIEF1ZyAyNyAxNjo0MzozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoc3RydWN0IHNlYyk6IE1vdmUgcG9zaXRpb24gb2YgdXNlcl9zZXRfdm1hLCBhbmQKLQlkb2N1bWVudCBpdC4KLQkoU0VDX0JBTElHTik6IERpc2FibGUgZm9yIG5vdy4gIEkgZG9uJ3QgdGhpbmsgaXQncyBjdXJyZW50bHkgdXNlZC4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9ob3d0b190YWJsZSk6IE5vdyBzdGF0aWMuCi0JKHN5bWV4dF9yb290UCwgc3ltZXh0X2xhc3RQLCBnbG9iYWxfdmFsdWUsIEdPVF92YWx1ZSwKLQlnbG9iYWxfc3ltYm9sLCBnbG9iYWxfc3ltX2RlZmluZWQsIHN5bWV4dG5fY29udGVudHMsCi0Jc3ltZXh0bl9jb250ZW50c19yZWFsX3NpemUsIGVsZl9ocHBhX3N0dWJfcm9vdFAsCi0JZWxmMzJfaHBwYV9zeW1leHRuX21hcCwgZWxmMzJfaHBwYV9zeW1leHRuX21hcF9zaXplKTogUmVseSBvbgotCWRlZmF1bHQgaW5pdGlhbGl6YXRpb24uCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogTWFjcm8gIlVOREVGSU5FRCIgZG9lc24ndCBuZWVkIGEKLQl0cmFpbGluZyBzZW1pY29sb24uCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IEludHJvZHVjZSB0ZW1wb3JhcmllcyB0byBtYWtlCi0JY29kZSBtb3JlIHJlYWRhYmxlIGluIDgwIGNvbHVtbnMuCi0KLQkqIGxpYmhwcGEuaCAoYWxsIGZ1bmN0aW9ucyk6IE5vdyBpbmxpbmUgdW5kZXIgR05VIEMuCi0KLQlNb3JlIHBhdGNoZXMgZnJvbSBKZWZmIExhdzoKLQotCSogZWxmMzItaHBwYS5jIChBUl9XQVJOKTogR2l2ZSBhcmd1bWVudCB3aGljaCBjYXVzZWQgdGhlCi0JaW52YWxpZCBhcmd1bWVudCByZWxvY2F0aW9uLgotCShBUl9VTklNUCk6IERlbGV0ZSB1bnVzZWQgbWFjcm8uCi0JKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfdGFibGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nOiBMaWtld2lzZS4KLQotCSogc29tLmM6IE5ldyBmaWxlIGNvbnRhaW5pbmcgU09NIHNwZWNpZmljIGNvZGUgZXh0cmFjdGVkCi0JZnJvbSBocHBhLmMKLQotCSogc29tLmg6IE5ldyBmaWxlIGNvbnRhaW5pbmcgU09NIHNwZWNpZmljIGNvZGUgZXh0cmFjdGVkCi0JZnJvbSBsaWJocHBhLmgKLQotCSogaHBwYS5jOiBEZWxldGVkLgotCi0JKiBsaWJocHBhLmg6IERlbGV0ZSBTT00gc3BlY2lmaWMgY29kZS4gIEFkZCBnZW5lcmljIFBBCi0JY29kZSB3aGljaCBjYW4gYmUgc2hhcmVkIGJ5IGJvdGggU09NIGFuZCBFTEYgYmFja2VuZHMuCi0KLQkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIGhwcGEuYyB3aXRoIHNvbS5jLiAgZWxmMzItaHBwYS5vCi0JZGVwZW5kcyBvbiBsaWJocHBhLmggbm93LgotCi0JKiBjb25maWd1cmUuaW4gKGhwcGFfdmVjKTogTmVlZHMgc29tLm8gbW9kdWxlIGluc3RlYWQgb2YKLQlocHBhLm8uCi0KLQkqIGVsZjMyLWhwcGEuYzogSW5jbHVkZSBsaWJocHBhLmguICBEbyBub3QgZGVmaW5lCi0JQllURVNfSU5fV09SRC4KLQotCSogZWxmMzItaHBwYS5oIChocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUpOiBEZWxldGUKLQlub3cgbGl2ZXMgaW4gbGliaHBwYS5oLgotCShocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0KTogTGlrZXdpc2UuCi0KLQkqIGhvc3RzL2hwcGFic2QuaDogSW5jbHVkZSA8c3RkbGliLmg+IGFuZCA8dW5pc3RkLmg+LiAgRG8gbm90Ci0JZGVmaW5lIG1hbGxvYyBvciBmcmVlLgotCi0JKiBjb25maWcvaHBwYS1lbGYubXQgKFNFTEVDVF9BUkNISVRFQ1RVUkVTKTogRG9uJ3QgZGVmaW5lCi0JU0VMRUNUX1ZFQ1MuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2NhdGVfdW53aW5kX3RhYmxlKTogRGVsZXRlIHVudXNlZAotCXZhcmlhYmxlcy4KLQkoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3ApOiBMaWtld2lzZS4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IExpa2V3aXNlLgotCShlbGZfcmVsb2NfbWFwKTogRGVsZXRlLCBubyBsb25nZXIgdXNlZC4KLQkoZWxmX2hwcGFfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfc3ltZXh0bl9tYXBfbWF4X3NpemUpOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9nZXRfc3ltX2V4dG4pOiBBYm9ydCBpZiB0eXBlIGlzIGJvZ3VzLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zKTogQWRkIHByb2Nlc3NpbmcKLQlvZiB0aGUgLmhwcGFfdW53aW5kIHNlY3Rpb24uCi0KLVdlZCBBdWcgMjUgMTY6MTM6NDkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiByZWNvZ25pemUgbTg4MTEwLgotCi1UdWUgQXVnIDI0IDE2OjMyOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGUgSG9vZ2VuYm9vbSBhdCBVdGFoOgotCi0JKiBlbGZjb2RlLmggKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBBZGQgZGV0ZWN0aW9uIG9mCi0JU0hUX05PVEUgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLWhwcGEuYzoKLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1YixocHBhX2VsZl9sb25nX2JyYW5jaF9uZWVkZWRfcCk6Ci0JTmV3IGZ1bmN0aW9ucyBmb3Igc3VwcG9ydCBvZiBsb25nIGJyYW5jaCBzdHVicy4KLQkoaHBwYV9lbGZfc3R1Yl9jaGVjayxocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiAgQWRkCi0JY2hlY2sgZm9yIGxvbmcgYnJhbmNoIHN0dWJzLgotCShocHBhX2xvb2tfZm9yX3N0dWJzKTogIFVudXNlZCBmdW5jdGlvbi4gIFJlbW92ZWQuCi0JKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSW1wbGVtZW50IGEgUEEvRUxGLXNwZWNpZmljCi0JdmVyc2lvbiBvZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMuCi0JKGhwcGFfZWxmX2xvbmdfYnJhbmNoX25lZWRlZF9wKTogT25seSBvdXRwdXQgZGVidWdnaW5nIGRpYWdub3N0aWNzCi0Jd2hlbiBCRkQgaXMgY29uZmlndXJlZCBmb3IgZGVidWdnaW5nLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGYzMl9ocHBhX2dldF9zeW1leHRuX2NoYWluKTogIE5ldyBmdW5jdGlvbgotCXRvIHJldHVybiBhIGxpc3Qgb2Ygc3ltYm9scyB0aGF0IGhhdmUgbm9uLXplcm8gYXJndW1lbnQKLQlyZWxvY2F0aW9uIGJpdHMuCi0JKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogTWFrZSBzdXJlIHN0dWIgZ2VuZXJhdGlvbiBpcyBkb25lIG9ubHkKLQlvbmNlLgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9zdHViX3JlbG9jKTogIE5ldyBmdW5jdGlvbiBmb3IKLQlnZW5lcmF0aW9uIHJlbG9jYXRpb24gZW50cmllcyB3aXRoaW4gYSBzdHViLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IENvcnJlY3Rpb25zIHRvIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiBzdHVicy4KLQotCSogZWxmMzItaHBwYS5jOiBOZXcgI2RlZmluZSdzIGZvciBhcmd1bWVudCByZWxvY2F0aW9uIHR5cGVzLgotCShtaXNtYXRjaGVzLCByZXR2YWxfbWlzbWF0Y2hlcyk6IFVwZGF0ZWQgdG8gcmVmbGVjdCBuZXcKLQlhcmd1bWVudCByZWxvY2F0aW9uIHR5cGVzLgotCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogTmV3IG1hY3JvLgotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogU2V0IHRoZSBQRl9YIGJpdCBmb3IgZGF0YQotCXNlZ21lbnRzLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGZfaHBwYV9ob3d0b190YWJsZSk6IEFkZAotCVJfSFBQQV9TVFVCX0NBTExfMTcgZm9yIHN1cHBvcnQgb2YgbGlua2VyIHN0dWIgZ2VuZXJhdGlvbi4KLQkoaHBwYV9lbGZfcmVsb2MpOiBBZGQgc3VwcG9ydCBvZiBSX0hQUEFfU1RVQl9DQUxMXzE3Ci0JcmVsb2NhdGlvbiB0eXBlLgotCi0JKiBlbGYzMi1ocHBhLmg6IChlbGYzMl9ocHBhX3JlbG9jX3R5cGUpOiBBZGQKLQlSX0hQUEFfU1RVQl9DQUxMXzE3IGZvciBzdXBwb3J0IG9mIGxpbmtlciBzdHViIGdlbmVyYXRpb24uCi0KLQkqIGhwcGFfc3R1YnMuaDogQWRkIG5ldyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgdXNlZCBpbiBsaW5rZXIKLQlzdHViIGdlbmVyYXRpb24uCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2NhdGVfdW53aW5kX3RhYmxlKTogVGhlIG9mZnNldHMgaW4gYW4KLQl1bndpbmQgZGVzY3JpcHRvciB3ZXJlIGluY29ycmVjdC4KLQotCSogbGliZWxmLmggKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogRGVjbGFyZS4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKTogIE5ldwotCWZ1bmN0aW9uIGluIHBsYWNlIG9mIGdsb2JhbF9zeW0gZmllbGQgaW4gZWxmX2JhY2tlbmRfZGF0YQotCXN0cnVjdHVyZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nLAotCWVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAotCWVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiAgTmV3IGZ1bmN0aW9ucyB0bwotCXByb3ZpZGUgc3VwcG9ydCBvZiBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb25zIGFuZCBhcmd1bWVudAotCXJlbG9jYXRpb24gc3R1YnMuCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogIFJlbW92ZSBjYWxsIHRvIGFib3J0KCkuCi0KLQkqIGVsZjMyLXRhcmdldC5oOiAgU3VwcG9ydCBmb3Igc3BlY2lhbCBwcm9jZXNzaW5nIGJ5IHRoZSBiYWNrZW5kLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6ICBBZGRlZCBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZywKLQllbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKLQllbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAotCWVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMsIGFuZAotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBmaWVsZHMuCi0JKiBlbGZjb2RlLmg6IChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGQgYSBjaGVjayBmb3IKLQlwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiAgQWRkIGEgY2hlY2sgZm9yIHByb2Nlc3Nvci1zcGVjaWZpYwotCXNlY3Rpb24gdHlwZXMuCi0JKGJmZF9lbGYzMl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgQWRkIGEgY2hlY2sgdG8gc2VlIGlmCi0JdGhlcmUgaXMgYW55IGZpbmFsIHNlY3Rpb24gcHJvY2Vzc2luZyB0byBiZSBkb25lIGJ5IHRoZQotCWJhY2tlbmQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiAgQWRkIGEgY2hlY2sgZm9yCi0JcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gdHlwZXMuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgUmVtb3ZlIHJlZmVyZW5jZSB0byBnbG9iYWxfc3ltIGluIHRoZQotCWVsZl9iYWNrZW5kX2RhdGEgc3RydWN0dXJlLiAgUmVwbGFjZSBpdCB3aXRoIGEgY2FsbCB0bwotCWVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLgotCSogbGliZWxmLmg6IFJlbW92ZSBnbG9iYWxfc3ltIGZpZWxkIGluIHRoZSBlbGZfYmFja2VuZF9kYXRhCi0Jc3RydWN0dXJlLiAgUmVwbGFjZSBpdCB3aXRoIGEgc2VyaWVzIG9mIGJhY2tlbmQtc3BlY2lmaWMKLQlmdW5jdGlvbnMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9icmFuY2hfcmVsb2MpOiBUaGUgZm9ybWFsIGFyZ3VtZW50Ci0Jc3R1Yl9zeW0gc2hvdWxkIGJlIGNhbGxlZCB0YXJnZXRfc3ltLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFJlZmVyIHRvIHRoZSBzdHViIGJmZCAoYWJmZCkKLQlyYXRoZXIgdGhhbiB0aGUgb3V0cHV0IGJmZCAob3V0cHV0X2JmZCkuCi0JKGhwcGFfZWxmX3JlbG9jKTogR2V0IHJpZCBvZiByZWZlcmVuY2VzIHRvIHRoZSBnbG9iYWxfc3ltIGZpZWxkIGluCi0JdGhlIGVsZl9iYWNrZW5kX2RhdGEgc3RydWN0dXJlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgdGhlIGNvcnJlY3QgY29uZGl0aW9uIGZvcgotCS5ic3MuICBBbHNvLCBkZXRlY3QgdGhlIGV4aXN0ZW5jZSBvZiBhIC5ub3RlIHNlY3Rpb24uCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IHJfZm9ybWF0IGFyZ3VtZW50IHNob3VsZAotCWhhdmUgYmVlbiByX2ZpZWxkLgotCi0JKiBob3N0cy9ocHBhYnNkLmggKEhPU1RfTUFDSElORV9BUkNIKTogUmVmZXJlbmNlIHRvIGJmZF9hcmNoX202OGsKLQlzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYmZkX2FyY2hfaHBwYS4KLQotCSogaHBwYS5jIChocHBhX3ZlYyk6IFJlcGxhY2UgYmZkX2ZhbHNlIHdpdGggX2JmZF9kdW1teV90YXJnZXQgaW4KLQl0aGUgYmZkX2NoZWNrX2Zvcm1hdCBzdHJ1Y3R1cmUgdG8gYXZvaWQgYSB0eXBlIG1pc21hdGNoLgotCi1Nb24gQXVnIDIzIDE5OTMgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQkJIGFuZCBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCUFkZCBOZXRCU0Qgc3VwcG9ydDoKLQkqIG5ldGJzZDM4Ni5jOiBOZXcgZmlsZS4KLQkqIGFvdXR4Lmg6IE1ha2Ugc3ltX2lzX2RlYnVnZ2VyX2luZm8gdHJ1ZSBmb3IgTl9GTi4KLQkqIE1ha2VmaWxlLmluLCBhb3V0LXRhcmdldC5oLCBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdCwgY29uZmlndXJlLmluLAotCWxpYmFvdXQuaCwgdGFyZ2V0cy5jOiBPdGhlciBjaGFuZ2VzLgotCi1GcmkgQXVnIDIwIDE3OjA0OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTg4ay1lbGYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZDogVXNlIGl0IGZvciBtODgqLSotc3lzdjQqLgotCi1GcmkgQXVnIDIwIDE1OjE2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfYnVpbGRfcGhkcnMpOiBVbnVzZWQgZnVuY3Rpb24gZGVsZXRlZC4KLQkoYmZkX3NoZHJfZnJvbV9zZWN0aW9uKTogRGl0dG8uCi0JKHdyaXRlX3JlbG9jcyk6IERvbid0IGNoYW5nZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBhZGRlbmQuCi0JKGVsZl9sb2NhdGVfc2gpOiBSZXR1cm4gdHlwZSBpcyBub3cgYWx3YXlzIGVsZl9pbnRlcm5hbF9zaGRyLAotCXNpbmNlIHRoZSBvdGhlciB0eXBlcyB3ZXJlIHJlYWxseSBhbGlhc2VzIGZvciB0aGlzIHR5cGUgYW55d2F5cy4KLQlEb24ndCBjb21waWxlIHRoaXMgZnVuY3Rpb24sIHNpbmNlIGl0IGlzIHN0YXRpYyBhbmQgZG9lc24ndCBhcHBlYXIKLQl0byBiZSB1c2VkIGluIHRoaXMgZmlsZS4KLQkoc3ltX2lzX2dsb2JhbCk6IFJldHVybiBub24temVybyBmb3Igd2VhayBzeW1ib2xzLiAgQWJvcnQgaWYKLQlzZWN0aW9uIHBvaW50ZXIgaXMgbnVsbC4KLQkoc3dhcF9vdXRfc3ltcyk6IFJlb3JkZXIgdGVzdHMgc28gZnVuY3Rpb24gc3ltYm9scyBjYW4gYmUgd2Vhay4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHVzZSBCU0ZfRVhQT1JULgotCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogTWFrZSBSRUxPQ19QUk9DRVNTSU5HIHNlY3Rpb24gc21hbGxlciBieQotCWV4dHJhY3Rpbmcgb3V0IHNvbWUgY29tbW9uIGNvZGUuICBBYm9ydCBpZiBCRkQgc2VjdGlvbiBzeW1ib2wgaGFzCi0JbnVsbCBuYW1lLgotCShlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBUcmFuc2xhdGUgRUxGIHNlY3Rpb24gc3ltYm9scyBpbnRvIEJGRAotCXNlY3Rpb24gc3ltYm9scy4gIERvbid0IHJlYWQgc2VjdGlvbiBjb250ZW50cyB0byBmaWxsIGluIGFkZGVuZAotCWZpZWxkLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IEFsbCBwYXJ0aWFsX2lucGxhY2UgZmllbGRzCi0Jc2hvdWxkIGJlICJ0cnVlIi4KLQotCSogTWVyZ2VkIGZyb20gT1NGOgotCi0JVHVlIEp1biAxNSAxNDozODozMiAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogbGliZWxmLmggKHN0cnVjdCBFbGZfU3ltX0V4dHJhKTogTmV3IHN0cnVjdHVyZSB0byBjb250YWluIEVMRgotCXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gIFB1dCBpbiBlbGZfc3ltX251bSwgd2hpY2gKLQlnaXZlcyB0aGUgZXh0ZXJuYWwgc3ltYm9sIG51bWJlciBpbiB0aGUgZWxmIG9iamVjdCBmaWxlLCBzaW5jZQotCWxvY2FsIHN5bWJvbHMgbXVzdCBjb21lIGJlZm9yZSBnbG9iYWwgc3ltYm9scy4KLQkoZWxmX3N5bV9leHRyYSk6IE5ldyBtYWNyby4KLQkoZWxmX3N5bXRhYl9tYXApOiBEZWxldGUsIGluIGZhdm9yIG9mIHVzaW5nIEVsZl9TeW1fRXh0cmEuCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IFVzZSBFbGZfU3ltX0V4dHJhIHRvIG1hcCBpbnRlcm5hbAotCXN5bWJvbCBudW1iZXIgdG8gZXh0ZXJuYWwgbnVtYmVyLiAgU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlCi0JRWxmX1N5bV9FeHRyYSBmaWVsZCBmb3IgdGhlIHN5bWJvbCBpbiB0aGUgdWRhdGEgZmllbGQuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgRWxmX1N5bV9FeHRyYSB0byBtYXAgb3V0IHN5bWJvbHMuCi0KLQlTdW4gSnVuIDIwIDE2OjMwOjExIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmpfdGRhdGEpOiBBZGQgZmllbGQgdG8gY291bnQgdGhlIHNpemUgb2YgdGhlCi0JYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2VjdGlvbiBzeW1ib2xzLgotCShlbGZfbWFwX3N5bWJvbHMpOiBCdW1wIHRoZSBtYXggaW5kZXggb2YgdGhlIHNlY3Rpb24gc3ltYm9scyBzbwotCXRoYXQgd2UgZG9uJ3Qgb3ZlcndyaXRlIG1lbW9yeS4gIFN0b3JlIHRoZSBtYXggaW5kZXggaW50byB0aGUKLQllbGZfb2JqX3RkYXRhIGZpZWxkLgotCi0JU2F0IEp1biAxOSAxMDoxMjoyNyAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfb2JqX3RkYXRhKTogQWRkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMKLQl0byB0aGUgc2VjdGlvbiBzeW1ib2xzIHdlIGNyZWF0ZWQuICBSZW1vdmUgdW51c2VkIGZpZWxkCi0JaW50ZXJuYWxfc3ltcy4KLQkoZWxmX21hcF9zeW1ib2xzKTogRmlsbCBpbiBhcnJheSBvZiBwb2ludGVycyB0byBzZWN0aW9uIHN5bWJvbHMuCi0JT25seSBjcmVhdGUgc2VjdGlvbiBzeW1ib2xzIGZvciBzZWN0aW9ucyB0aGF0IGhhdmUgU0VDX0FMTE9DIHNldCwKLQlhbmQgaGF2ZSBub24temVybyBzaXplLgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IElmIHVkYXRhIGlzIE5VTEwsIGFuZCB0aGlzIGlzIGEKLQlzZWN0aW9uIHN5bWJvbCwgbG9vayB1cCB0aGUgc2VjdGlvbiBpbiB0aGUgbGlzdCBvZiBzZWN0aW9uCi0Jc3ltYm9scywgYW5kIHNldCB0aGUgdWRhdGEgcG9pbnRlciBhcHByb3ByaWF0ZWx5LiAgT3RoZXJ3aXNlLCBpZgotCXVkYXRhIGlzIHN0aWxsIE5VTEwsIGZhaWwgYW4gYXNzZXJ0aW9uLCBhbmQgdXNlIDAsIGluc3RlYWQgb2YKLQlkcm9wcGluZyBjb3JlLgotCi1GcmkgQXVnIDIwIDEyOjE4OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAobWlwcy0qLWVsZmwqLCBtaXBzLSotZWxmKik6IE5ldyB0YXJnZXRzLCB1c2luZwotCW1pcHNsZWxmIGFuZCBtaXBzYmVsZiByZXNwZWN0aXZlbHkuCi0JKiBjb25maWcvbWlwc2xlbGYubXQsIGNvbmZpZy9taXBzYmVsZi5tdDogTmV3IGZpbGVzLgotCSogZWxmMzItbWlwcy5jOiBBZGRlZCBzb21lIHJlbG9jIGluZm9ybWF0aW9uLgotCSogY29uZmlndXJlLmluOiBGaXhlZCBlcnJvciBtZXNzYWdlLgotCi0JKiBlY29mZi5jIChFQ09GRl9MT05HX1NJWkUpOiBSZW1vdmVkLiAgSnVzdCB1c2UgY29uc3RhbnRzLgotCi1UaHUgQXVnIDE5IDA5OjQ1OjUxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTLCBBTExfTUFDSElORVMsIEJGRDMyX0JBQ0tFTkRTLCBCRkQ2NF9CQUNLRU5EUywKLQlPUFRJT05BTF9CQUNLRU5EUyk6IEFscGhhYmV0aXplIGVudHJpZXMgYW5kIGFkZCBhIGZldyBtaXNzaW5nIG9uZXMuCi0JKiBhcmNodXJlcy5jOiBBbHBoYWJldGl6ZSBkZWNscy4KLQotCSogY29uZmlndXJlLmluLCB0YXJnZXRzLmM6IEFkZCBtaXNzaW5nIHZlY3RvcnMgdG8gdGhlIHRhYmxlcy4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3RvcikgWyFTRUxFQ1RfVkVDU106IEFkZCBERUZBVUxUX1ZFQ1RPUi4KLQlSZW1vdmUgaHAzMDBic2RfdmVjIGR1ZSB0byBjbGFzaCB3aXRoIHN1bm9zX2JpZ192ZWMuCi0KLVR1ZSBBdWcgMTcgMTg6MTI6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZ7bWFjaDMsb3NmMW1rfS5oOiBOZXcgZmlsZXMsIGZvciBNYWNoIGhvc3RpbmcuCi0JKiBob3N0cy9pMzg2bWFjaC5oOiByZW1vdmVkLCByZXBsYWNlZCBieSBpMzg2b3NmMW1rLmguCi0JKiBjb25maWcvaTM4Nm1hY2gzLm10LCBpMzg2bWFjaDMuYzogTmV3IGZpbGVzLCBmb3IgTWFjaCBhLm91dCBmb3JtYXQuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGhvc3RzL2RlY3N0YXRpb24uaDogSW5jbHVkZSA8c3lzL3BhcmFtLmg+IG5vdCA8bWFjaGluZS9wYXJhbS5oPi4KLQotVHVlIEF1ZyAxNyAxNToxOTo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9zZWN0aW9uX3N5bWJvbCk6IElmIHNlY3Rpb24ncyBvdXRwdXRfc2VjdGlvbiBpcwotCW5vdCB5ZXQgc2V0LCBwb2ludCB0byBpdHNlbGYuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgaXMKLQljYWxsZWQgb24gdGhlIG91dHB1dCBmaWxlLCBub3QgdGhlIGlucHV0IGZpbGUuCi0KLQkqIGNvZmYtcnM2MDAwLmMgKGR1bW15X3JlbG9jLCBSVFlQRTJIT1dUTyk6IFNldCBob3d0byBmaWVsZCB0byBhCi0JZHVtbXkgdmFsdWUsIHJhdGhlciB0aGFuIGxlYXZpbmcgaXQgTlVMTC4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCk6IFNldCBiZmRfZXJyb3Igb24KLQlmYWlsdXJlLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9hcmNoX21hY2gpKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaC4KLQotVHVlIEF1ZyAxNyAwOTo0MjoxNiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKGNwdSk6IEV4dHJhY3QgZnJvbSBjYW5vbmljYWwgbmFtZSB3aXRoIHNlZC4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgcGFzcyBpdC4KLQotU3VuIEF1ZyAxNSAyMDo0NTo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IFJlbW92ZSB7QllURSxXT1JELExPTkd9X1NJWkU7IHRoZXkgYXJlIHBvaW50bGVzcyBhbmQKLQlCWVRFX1NJWkUgY29uZmxpY3RzIHdpdGggYSBNYWNoIGhlYWRlci4KLQkqIGVjb2ZmLmM6IENoYW5nZSBMT05HX1NJWkUgdG8gRUNPRkZfTE9OR19TSVpFIGFuZCBkZWZpbmUgaXQuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBNYWtlIHN1cmUgYWxsIE9TIGZpZWxkcyBlbmQgaW4gKi4KLQotRnJpIEF1ZyAxMyAxNjozMzozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogVXNlIGJmZF9hYnNfc2VjdGlvbiBmb3IKLQlSRUxPQ19TRUNUSU9OX05PTkUgYW5kIFJFTE9DX1NFQ1RJT05fQUJTLiAgSWYgYSByZWxvYyBzZWN0aW9uCi0JZG9lc24ndCBleGlzdCwgZG9uJ3QgdHJ5IHRvIGNyZWF0ZSBpdC4KLQotCSogbmxtY29kZS5oIChubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogcHJvY2VkdXJlIG9mZnNldHMgYXJlCi0JZnJvbSBzdGFydCBvZiBjb2RlIHNlZ21lbnQsIG5vdCBzdGFydCBvZiBmaWxlLgotCSogY29uZmlnL2kzODYtbmxtLm10IChERUZBVUxUX1ZFQ1RPUik6IEl0J3MgbmxtMzJfaTM4Nl92ZWMsIG5vdAotCWJmZF9ubG0zMl9pMzg2X3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAoU0VMRUNUX1ZFQ1Mgc3dpdGNoKTogTGlrZXdpc2UuCi0KLVRodSBBdWcgMTIgMTA6MzI6NDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6IElmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgZGVmYXVsdAotCXRhcmdldCwgc2V0IG1hdGNoX2NvdW50IHRvIDEsIHRvIGlnbm9yZSBhbnkgcHJldmlvdXMgbWF0Y2hlcy4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIHNyZWMubywgYWRkIHJlbG9jMTYuby4KLQotCSogY29uZmlndXJlLmluOiBBZGQgcmVsb2MxNi5vIHdoZW4gd2UgYWRkCi0JY29mZi1oODMwMC5vLCBjb2ZmLWg4NTAwLm8sIGNvZmYtc2gubywgY29mZi16OGsuby4KLQlNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBSZW1vdmUgcmVsb2MxNi5vLgotCi0JKiBjb25maWcvdTY4ay1jb2ZmLm10OiBGaXggdHlwbywgREVGQVVMVF9UQVJHRVQgZm9yCi0JREVGQVVMVF9WRUNUT1IuCi0KLQkqIGNvbmZpZy9oODMwMC1jb2ZmLm10LCBoODUwMC1jb2ZmLm10LCBzaC1jb2ZmLm10LCBzdDIwMDAubXQsCi0JejhrLWNvZmYubXQgKERFRkFVTFRfVkVDVE9SKTogRGVmaW5lLiAgRG9uJ3QgZXhwbGljaXRseSBhZGQKLQlTLXJlY29yZHMgdmlhIFNFTEVDVF9WRUNTLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpLCBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBbHdheXMKLQlzdXBwb3J0IFMtcmVjb3JkcywgZm9yIGNvbnZlbmllbmNlLgotCi1UaHUgQXVnIDEyIDA4OjMwOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSwgYWxwaGFfZmluaXNoX3JlbG9jLAotCWFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfe2luLG91dH0sIGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6Ci0JUmVhZCBhbmQgd3JpdGUgQWxwaGEgcmVsb2NzLiAgQ2FuJ3QgcHJvY2VzcyB0aGVtIHlldC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogUmVjb2duaXplIG5ldyByZWxvYyBzZWN0aW9ucy4KLQlJZiB0aGUgc2VjdGlvbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBjcmVhdGUgaXQuCi0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl97aW4sb3V0fSk6IEhhbmRsZSBuZXcgZmllbGRzIGRlZmluZWQKLQlvbiB0aGUgQWxwaGEuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGNvbnN0cnVjdG9yX3JlbG9jIGFuZAotCWZpbmlzaF9yZWxvYyBmaWVsZHMuCi0JKiBlY29mZi5jOiBNb3ZlIE1JUFMgcmVsb2Mgc3VwcG9ydCBmcm9tIGhlcmUuLi4KLQkqIGNvZmYtbWlwcy5jOiB0byBoZXJlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogR2V0IGNvbnN0cnVjdG9yIHJlbG9jIGhvd3RvCi0JZnJvbSBiYWNrZW5kLgotCShlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFJlbW92ZWQgTUlQUyBzcGVjaWZpYyBzdHVmZi4gIENhbGwKLQlmaW5pc2hfcmVsb2MgYmFja2VuZCBmdW5jdGlvbi4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlZCBNSVBTIHNwZWNpZmljIGFzc2VydGlvbnMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19maW5pc2hfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogRmlsbCBpbiBuZXcgZmllbGRzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBVc2UgTlVMTCBmb3IgbmV3Ci0JZmllbGRzLgotCSogdGFyZ2V0cy5jOiBBZGRlZCBleHRlcm4gZm9yIGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYy4KLQotCSogYmZkLmMgKF9iZmRfaG9zdF9iaWdfZW5kaWFuKTogUmVtb3ZlZC4KLQkqIGJmZC1pbi5oIChIT1NUX0JZVEVfT1JERVJfQklHX1AsIGJmZF9oZWFkZXJfdHdpZGRsZV9yZXF1aXJlZCk6Ci0JUmVtb3ZlZC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVdlZCBBdWcgMTEgMTI6MTE6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBOZXcgZmlsZSwgYnJva2VuIG91dCBvZiBjb25maWd1cmUuaW4uCi0JKiBjb25maWd1cmUuaW46IFVzZSBpdCwgYW5kIHVzZSBzdGFuZGFyZCB0YXJnZXQgbmFtZXMgZm9yCi0JLS13aXRoLXRhcmdldHMsIHJlcGxhY2luZyAtLXdpdGgtYmZkLXRhcmdldHMuCi0KLQkqIGFyY2h1cmVzLmMgKGFyY2h1cmVzX2luaXRfdGFibGUpOiBBZGQgYmZkX3NoX2FyY2guCi0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBjb2ZmLW02OGsubyBmb3IgbTY4a2NvZmZ1bl92ZWMuCi0JSW5jbHVkZSBubG0zMi5vIGFuZCBubG0ubyBmb3IgYmZkX25sbTMyX2kzODZfdmVjLgotCUZpeCBlcnJvciBpbiBlcnJvciBtZXNzYWdlLgotCi0JKiBvYXN5cy5jOiBNYWtlIGJmZF9lcnJvcl92ZWN0b3IgZXh0ZXJuLgotCi0JKiBjb25maWd1cmUuaW46IEluY2x1ZGUgc3RhYi1zeW1zLm8gZm9yIGEub3V0L2Iub3V0IHRhcmdldHMKLQlhbmQgaHAzMDB7YnNkLGhwdXh9LgotCi1XZWQgQXVnIDExIDA2OjQwOjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRkIHRoZSAuYnNzCi0Jc2VjdGlvbiBiZWZvcmUgc2V0dGluZyBvdXRwdXRfaGFzX2JlZ3VuLgotCShubG1fc2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW1vdmUgYXJndW1lbnQgbmFtZXMgZnJvbQotCW1hbmdsZV9yZWxvY3NfZnVuYyBwcm90b3R5cGUuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgc2hhZG93aW5nIGxvY2FsIHZhcmlhYmxlLgotCURvbid0IHdyaXRlIG91dCBkZWJ1Z2dpbmcgc3ltYm9scyBpZiBkZWJ1Z0luZm9PZmZzZXQgaXMgLTEuICBBZGQKLQl0aGUgY29kZUltYWdlT2Zmc2V0IHRvIHRoZSBzdGFydCwgZXhpdCwgYW5kIGNoZWNrIHByb2NlZHVyZQotCW9mZnNldHMuCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3dyaXRlX3JlbG9jLCBubG1faTM4Nl9tYW5nbGVfcmVsb2NzKToKLQlEb24ndCBjaGVjayBwYXJ0aWFsX2lucGxhY2UgZmllbGQ7IGl0cyB2YWx1ZSBpcyBpcnJlbGV2YW50LgotCi0JKiBCYXNlIHVzZSBvZiBzY28tY29yZSBvbiBob3N0LCBub3QgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3QgKGlbMzRdODYtKi1zY28qKTogVXNlIGkzODZzY28gcmF0aGVyIHRoYW4gaTM4NnYuCi0JKiBjb25maWcvaTM4Ni1zY28ubXQgKFRERUZJTkVTKTogUmVtb3ZlZC4KLQkqIGNvbmZpZy9pMzg2c2NvLm1oOiBOZXcgZmlsZSB0byB1c2Ugc2NvLWNvcmUuCi0JKiBob3N0cy9pMzg2c2NvLmg6IE5ldyBmaWxlOyBqdXN0IGluY2x1ZGVzIGhvc3RzL2kzODZ2LmguCi0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3toZHIsZXh0fV97aW4sb3V0fSk6IFVzZSBzaWduZWQKLQljb252ZXJzaW9ucyBmb3Igc29tZSBmaWVsZHMuCi0KLVR1ZSBBdWcgMTAgMTM6MzI6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9ncHJlbF9yZWxvYyk6IElmIF9ncCBpcyBub3QgZGVmaW5lZCwgZ2l2ZSBhbgotCWVycm9yIHJhdGhlciB0aGFuIGFib3J0aW5nLgotCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBBZGRlZCBtYWNoIGZpZWxkLgotCShubG1fbWFjaGluZSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIG5sbS5jIChubG1fbWtvYmplY3QpOiBTZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGZyb20gYmFja2VuZAotCWluZm9ybWF0aW9uLgotCSogbmxtMzItaTM4Ni5jIChubG0zMl9pMzg2X2JhY2tlbmQpOiBJbml0aWFsaXplIG5ldyBtYWNoIGZpZWxkLgotCi1UdWUgQXVnIDEwIDA5OjMxOjE4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZXBsYWNlIGNhbGxzIHRvIHNvcnQgd2l0aCBzaGVsbCBjb2RlCi0JdG8gdW5pcSB0aGUgbGlzdHMuCi0KLVR1ZSBBdWcgMTAgMDY6MjM6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEluY2x1ZGUgYW91dDMyLm8gZm9yIGFueSBhLm91dC9iLm91dCBmb3JtYXRzLgotCi1Nb24gQXVnICA5IDA5OjM3OjE4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODYtbGludXgubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBiZmRfZWxmMzJfaTM4Nl92ZWMuCi0JKiBjb25maWcvbTY4ay1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBtNjhrY29mZl92ZWMuCi0JKiBjb25maWcvaTM4Ni1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBpMzg2Y29mZl92ZWMuCi0JKiBjb25maWcvaHBwYS1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBocHBhX3ZlYy4KLQkqIGNvbmZpZy9zcGFyYy1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBzdW5vc19iaWdfdmVjLgotCSogY29uZmlnL2kzODYtc2NvLm10IChTRUxFQ1RfVkVDUyk6IERvbid0IGRlZmluZTsgSWFuIHNheXMgaXQgd2FzCi0JanVzdCBhIGhhY2suCi0KLU1vbiBBdWcgIDkgMTM6MTU6MDAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTg4ay1jb2ZmLm10IChERUZBVUxUX1ZFQyAtPiBERUZBVUxUX1ZFQ1RPUik6IHJlbmFtZWQuCi0KLU1vbiBBdWcgIDkgMTQ6MjY6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzeW1zLmMgKEJTRl9FWFBPUlQpOiBOb3cgc2FtZSBhcyBCU0ZfR0xPQkFMLgotCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogTmV3IGZ1bmN0aW9uLgotCi1Nb24gQXVnICA5IDExOjI5OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKGJmZF9nZXRfYXJjaGl0ZWN0dXJlLCBiZmRfZ2V0X21hY2hpbmUpOiBSZW1vdmVkCi0Jb2Jzb2xldGUgbWFjcm9zLgotCSogYmZkLWluMi5oOiBVcGRhdGVkLgotCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9hcm1hcCk6IENvcnJlY3QgYnVnIGluIGluaXRpYWxpemF0aW9uIG9mCi0Jc3RyaW5nYmFzZS4KLQotU3VuIEF1ZyAgOCAxMjoyMToxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIHVubmVlZGVkIHRlc3QuCi0KLVN1biBBdWcgIDggMTI6NDE6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh7ZGlzdCxyZWFsfWNsZWFuKTogVXNlICQoTUFLRSksIG5vdCBtYWtlLgotCi1TYXQgQXVnICA3IDA5OjE0OjIxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N0MjAwMC5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgTVJJOyBub3QgdXNlZC4KLQotCSogUE9SVElORywgVE9ETywgY29uZmlnL1JFQURNRTogVXBkYXRlIHRvIHJlZmxlY3QgYmVsb3cgY2hhbmdlcy4KLQotCSogY29uZmlndXJlLmluOiBSZXBsYWNlIE1JTklNSVpFIGFuZCAtLXdpdGgtbWluaW1hbC1iZmQgd2l0aAotCS0td2l0aC1iZmQtdGFyZ2V0cz0idGFyZ2V0MSx0YXJnZXQyLC4uLiIgYW5kIHRoZSBzcGVjaWFsIHRhcmdldAotCSJhbGwiIHRvIGdldCB0aGUgcHJldmlvdXMgZGVmYXVsdCBiZWhhdmlvci4KLQlGaWd1cmUgb3V0IHdoaWNoIGFyY2hpdGVjdHVyZSBhbmQgYmFja2VuZCAubyBmaWxlcyBhcmUgbmVlZGVkIGZyb20KLQlERUZBVUxUX1ZFQ1RPUiwgU0VMRUNUX1ZFQ1MsIGFuZCBTRUxFQ1RfQVJDSElURUNUVVJFUyBhcyBzZXQgaW4KLQl0aGUgLm10IGZpbGVzLiAgRGVmaW5lIFRERUZBVUxUUyBiYXNlZCBvbiB0aGVtLCBhbHNvLgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gTUlOSU1JWkUuCi0JKiBhcmNodXJlcy5jLCB0YXJnZXRzLmM6IERpdHRvLgotCi0JKiBjb25maWcvKi5tdDogRGVmaW5lIERFRkFVTFRfVkVDVE9SLCBTRUxFQ1RfVkVDUywgYW5kCi0JU0VMRUNUX0FSQ0hJVEVDVFVSRVMgYXMgdmFyaWFibGVzIHJhdGhlciB0aGFuIGFzIC1EIGFyZ3VtZW50cyB0bwotCVRERUZBVUxUUy4KLQotCSogY29uZmlnL2EyOWstY29mZi5tdCxhbHBoYW9zZi5tdCwgaTM4Ni1zY28ubXQsIGk5NjAtYm91dC5tdCwKLQlpOTYwLWNvZmYubXQgKFRERUZBVUxUUyk6IERvbid0IHB1dCB0aGUgZGVmYXVsdCB2ZWN0b3IgaW4KLQlTRUxFQ1RfVkVDUyBtYW51YWxseTsgaXQncyBhdXRvbWF0aWMgbm93LgotCi0JKiBjb25maWcvaTM4Ni1zY28ubXQgKFRERUZBVUxUUyk6IERvbid0IHB1dCAmc2NvX2NvcmVfdmVjIGluCi0JU0VMRUNUX1ZFQ1MgbWFudWFsbHk7IC1EU0NPX0NPUkUgZG9lcyBpdCBhdXRvbWF0aWNhbGx5IG5vdy4KLQotCSogY29uZmlnL2g4MzAwLWNvZmYubXQsaDg1MDAtY29mZi5tdCxzaC1jb2ZmLm10LHN0MjAwMC5tdCx6OGstY29mZi5tdAotCShUREVGQVVMVFMpOiBEb24ndCBkZWZpbmUgQkZEOyBub3QgdXNlZC4KLQotCSogY29uZmlnL2hwcGFvc2YubWggKEhERUZJTkVTKTogRG9uJ3QgZGVmaW5lIFNFTEVDVF9BUkNISVRFQ1RVUkVTOwotCXRoaXMgaXMgYSBob3N0LCBub3QgYSB0YXJnZXQuCi0KLVNhdCBBdWcgIDcgMDU6Mjg6MDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogIEFkZCBjb21tZW50IGFib3V0IHdoYXQgdGhpcyBmdW5jdGlvbgotCWRvZXMgYW5kIHRvIHdhdGNoIG91dCBmb3Igc2lkZSBlZmZlY3RzLiAgQWRkIEZJWE1FIGZvciBtZW1vcnkgbGVha3MuCi0JRml4IGNvbW1lbnQgYWJvdXQgY2hlY2tpbmcgZm9yIG1hdGNoaW5nIGJ5dGUgb3JkZXIuICBQcmVzZXJ2ZQotCXBvaW50ZXIgdG8gb2xkIHRkYXRhIChpZiBhbnkpLCBhbmQgcmVzdG9yZSBpdCBpZiB3ZSBkb24ndCBtYXRjaAotCWZpbGUgd2l0aCB0YXJnZXQgdmVjdG9yLiAgSWYgd2UgYXJlIGdvaW5nIHRvIHVzZSBnb3RvJ3MsIHVzZSB0aGVtCi0JY29uc2lzdGVudGx5IGFuZCBtYWludGFpbmFibHkuCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6ICBFeHBhbmQgY29tbWVudHMgYWJvdXQgbGVha2VkIG1lbW9yeQotCXRvIG5vdGUgdGhhdCB0aGUgcHJvYmxlbSBpcyBldmVuIG1vcmUgc2VyaW91cyB0aGFuIGp1c3QgbGVha2VkCi0JbWVtb3J5LiAgUmVwbGFjZSBnb3RvIHdpdGggbW9yZSB0cmFkaXRpb25hbCByZXR1cm4uCi0KLUZyaSBBdWcgIDYgMTI6MDA6MDMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JRml4IGluY29ycmVjdCBvciB1c2VsZXNzIG1ha2VmaWxlIHZhcmlhYmxlIGRlZmluaXRpb25zOgotCSogY29uZmlnL25ld3MubXQsIGNvbmZpZy91NjhrLWNvZmYubXQgKFRERUZBVUxUUyk6IFVzZSB0aGlzIHRvCi0JZGVmaW5lIERFRkFVTFRfVkVDVE9SLCBpbnN0ZWFkIG9mIFRERUZJTkVTLgotCSogY29uZmlnL2kzODZhaXgubWggKE1JTklNSVpFKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL2hwcGFvc2YubWggKE1JTklNSVpFKTogRG9uJ3QgY29uZGl0aW9uYWxpemUuCi0JKiBjb25maWcvcnM2MDAwLm1oIChBTExPQ0EpLAotCSogY29uZmlnL2kzODZ2Lm1oIChBTExPQ0EpLAotCSogY29uZmlnL2kzODZsaW51eC5taCAoQUxMT0NBKSwKLQkqIGNvbmZpZy9pMzg2aXNjLm1oIChBTExPQ0EpLAotCSogY29uZmlnL2dvMzIubWggKEVYVFJBTElCUyk6IERvbid0IGRlZmluZTsgbm90IHVzZWQuCi0JKiBjb25maWcvc29sYXJpczIubWggKEhERUZJTkVTKTogUmVuYW1lZCBmcm9tIEhfREVGSU5FUy4KLQkqIGNvbmZpZy9hbHBoYW9zZi5tdCAoVERFRklORVMpOiBTZXQgaXQsIG5vdCBIREVGSU5FUy4KLQkqIGNvbmZpZy96OGstY29mZi5tdCAoQ0MpOiBEb24ndCBkZWZpbmUuICBJdCdzIGEgdGFyZ2V0LCBub3QgYSBob3N0LgotCi0JKiBjb25maWcvUkVBRE1FOiBOZXcgZmlsZSwgZXhwbGFpbmluZyB0aGUgdmFyaWFibGVzLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBBZGQgaHAzMDBfYnNkX3ZlYy4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUywgQ0ZJTEVTKTogQWRkIGhwMzAwYnNkLgotCShocDMwMGJzZC5vKTogTmV3IHJ1bGUuCi0KLUZyaSBBdWcgIDYgMTU6MTM6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoTkFNRSk6IFByb3ZpZGUgYSBkZWZhdWx0IGRlZmluaXRpb24sIHRoYXQncyBuZWl0aGVyCi0JZm9yIDMyIGJpdHMgbm9yIGZvciA2NC4KLQotCVR1ZSBKdW4gMTUgMTQ6Mzg6MzIgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGxpYmVsZi5oIChlbGZfaGFzaCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byBiZmRfZWxmX2hhc2gsIHNpbmNlCi0JdGhhdCBpcyB3aGF0IGlzIGluIGVsZi5jLgotCi1GcmkgQXVnICA2IDEyOjI4OjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogUmVtb3ZlZCBzcGVjaWFsIGhhbmRsaW5nIGZvcgotCXNjQnNzIGFuZCBzY1NCc3Mgc3ltYm9scywgc2luY2UgaXQgd2FzIHdyb25nLgotCi0JKiBNYWtlZmlsZS5pbiAoY29mZi1taXBzLm8sIGNvZmYtYWxwaGEubyk6IERvbid0IGRlcGVuZCBvbgotCWNvZmZjb2RlLmguCi0KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSW5zcGlyZWQgYnkgbWJAdHRpLkNPTSAoTWljaGFlbAotCUJsb29tKTogT25seSBzZXQgU1RZUF9CU1MgZm9yIFNFQ19BTExPQyBzZWN0aW9ucy4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfYXJtYXApOiBGcm9tIEFybmUgSGVucmlrIEp1dWwKLQk8YXJuZWpAa2FyaS5mbS51bml0Lm5vPjogSGFuZGxlIGEgQ09GRiBzdHlsZSBhcm1hcC4KLQotRnJpIEF1ZyAgNiAwOTo1OTo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaHB1eC1jb3JlLmM6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20gYmZkX3phbGxvYy4KLQotVGh1IEF1ZyAgNSAxMzoyMjo0NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGxvZzIpOiBEZWxldGUgaTM4Ny1zcGVjaWZpYyBjb2RlLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBbHdheXMgaW5jbHVkZSBlbGYuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBEb24ndCBpbmNsdWRlIGVsZi5vIGhlcmUuCi0JKG9maWxlcyk6IERlbGV0ZSByZWZlcmVuY2VzIHRvIG9maWxlczIgYW5kIG9maWxlczMuCi0JKGRvX2NsZWFuKTogRGVsZXRlIG9maWxlcy4KLQkoQkZESU5fSCk6IENoYW5nZWQgcmVmZXJlbmNlcyB0byAkKHNyY2RpcikvYmZkLWluMi5oLgotCShzdG1wLWJmZC5oKTogVXNlIGJmZC5oLW5ldyBhcyB0ZW1wb3JhcnkgbmFtZSwgbm90IGJmZC5oMi4KLQkoaGVhZGVycyk6IFVzZSBiZmQtaW4yLmgtbmV3IGFzIHRlbXBvcmFyeSBuYW1lLCBub3QgYmZkLmgtbmV3LgotCi0JKiBiZmQtaW4uaDogUmV3b3JkZWQgY29tbWVudCB0byBtYWtlIGl0IGNsZWFyIHRoYXQgYmZkLWluMi5oIGlzIGEKLQlnZW5lcmF0ZWQgZmlsZS4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQgaTM4Ni1lbGYgcmVsb2MgdHlwZXMKLQkoZnJvbSBNZWlzc25lcidzIGFkZGl0aW9ucyB0byBiZmQtaW4yLmgpLgotCi0JKiBlbGYzMi1pMzg2LmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQotCU1lcmdlZDoKLQotCVdlZCBKdW4gMjMgMDY6MDU6NTggMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGRyb3AgY29yZSBpZgotCWVsZl9zeW1ib2xfZnJvbSByZXR1cm5zIGEgTlVMTCBwb2ludGVyIHdoZW4gcHJvY2Vzc2luZyBhIG5vbi1lbGYKLQlzeW1ib2wsIHVzZSBhIDAgc2l6ZSBpbnN0ZWFkLgotCi0JVHVlIEp1biAxNSAxNDozODozMiAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfaGFzaCk6IERlbGV0ZSBtYWNybyBtYXBwaW5nIGVsZl9oYXNoIHRvCi0JYmZkX2VsZjMyX2hhc2gsIHNpbmNlIHRoZSBoYXNoIHRhYmxlIGlzIGluZGVwZW5kZW50IG9mIHRoZSAzMi82NAotCWJpdCBzeXN0ZW0uCi0KLQkqIGxpYmVsZi5oIChlbGZfaGFzaCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byBiZmRfZWxmX2hhc2gsIHNpbmNlCi0JdGhhdCBpcyB3aGF0IGlzIGluIGVsZi5jLgotCi0JU2F0IEp1biAxOSAxMDoxMjoyNyAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmMzItaTM4Ni5oIChyZWxvY190eXBlKTogUmVmb3JtYXQgc3BhY2luZy4KLQkoZWxmX2hvd3RvX3RhYmxlKTogQWRkIHRoZSByZXN0IG9mIHRoZSAzODYvRUxGIHJlbG9jYXRpb25zLgotCShlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvKTogRGl0dG8uCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogRGl0dG8uCi0KLVRodSBBdWcgIDUgMTA6MDc6NDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCk6ICBUZXN0IHJldHVybiB2YWx1ZQotCW9mIG5sbV9zbHVycF9zeW1ib2xfdGFibGUgYXMgYm9vbGVhbiwgbm90IHBvaW50ZXIuCi0JKiBubG1jb2RlLmggKG5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiAgVGVzdCByZXR1cm4gdmFsdWUKLQlvZiBubG1fc2x1cnBfcmVsb2NfZml4dXBzIGFzIGJvb2xlYW4sIG5vdCBwb2ludGVyLgotCi1XZWQgQXVnICA0IDE2OjIyOjU1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWg6IHJlbW92ZSBIREVGSU5FUzsgc2luY2UgX19NU0RPU19fIGFuZCBfX0dPMzJfXwotCWFyZSBub3cgcHJlZGVmaW5lZCBieSBHQ0MKLQotV2VkIEF1ZyAgNCAxNjowNjoyOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBBZGQgdGhlIHNlY3Rpb24gb2Zmc2V0IHRvIHRoZQotCWxpbmUgbnVtYmVyIGFkZHJlc3MsIHNvIGl0J3MgcHJpbnRlZCB0aGUgc2FtZSB3YXkgYXMgdGhlIGZ1bmN0aW9uCi0JYWRkcmVzcy4gIE9ubHkgc2hvd2VkIHVwIGZvciBsaW5lIG51bWJlcnMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpcnN0Ci0Jc2VjdGlvbiAoLnRleHQpLgotCi1XZWQgQXVnICA0IDA4OjMzOjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlibmxtLmggKG5sbV9iYWNrZW5kX2RhdGEpOiBBZGRlZCBubG1fbWFuZ2xlX3JlbG9jcy4KLQkobmxtX21hbmdsZV9yZWxvY3NfZnVuYyk6IE5ldyBtYWNyby4KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfd3JpdGVfcmVsb2MpOiBSZXdyb3RlIGNvcnJlY3RseS4KLQkobmxtX2kzODZfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkqIG5sbWNvZGUuaCAobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE1vdmUgYWxsIGNvbW1vbgotCXN5bWJvbHMgaW50byB0aGUgLmJzcyBzZWN0aW9uLgotCShubG1fc2V0X3NlY3Rpb25fY29udGVudHMpOiBDYWxsIHRoZSBtYW5nbGVfcmVsb2NzIGZ1bmN0aW9uLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGFueSBkZWZpbmVkCi0Jc3ltYm9sIGFzIGFuIGludGVybmFsIHJlbG9jLiAgRml4IGJ1ZyBpbiBleHRlcm5hbCByZWxvYyBjb3VudGluZy4KLQlHZXQgdGhlIG9mZnNldCBhbmQgZGVidWdnaW5nIHR5cGUgcmlnaHQgZm9yIC5ic3Mgc3ltYm9scy4gIE9ubHkKLQlvdXRwdXQgZGVidWdnaW5nIHN5bWJvbHMgZm9yIGRlZmluZWQgc3ltYm9scy4KLQotCSogY29mZi1oODUwMC5jIChydHlwZTJob3d0byk6IERvIGFuIGZwcmludGYgdG8gc3RkZXJyIHJhdGhlciB0aGFuCi0JdXNpbmcgcHJpbnRmLgotCSogY29mZi16OGsuYyAocnR5cGUyaG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoVFJBQ0UpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlLCBzd2FwX3N0ZF9yZWxvY19pbik6IExpa2V3aXNlLgotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IERvIGFuIGZwcmludGYgdG8gdGhlIGZpbGUKLQlhcmd1bWVudCByYXRoZXIgdGhhbiB1c2luZyBwcmludGYuCi0KLVR1ZSBBdWcgIDMgMTg6MTc6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2Zmc3dhcC5oOiBBZGRlZCBtYWNyb3MgdXNlZCB3aGVuIGFjY2Vzc2luZyBzZXZlcmFsIGZpZWxkczsKLQlkZWZhdWx0IGlzIHRoZSBzYW1lIGFzIGJlZm9yZS4KLQkoY29mZl9zd2FwX2FvdXRoZHJfe2luLG91dH0pOiBIYW5kbGUgdGhlIEFscGhhIEVDT0ZGIGZpZWxkcy4KLQkqIGNvZmYtYWxwaGEuYzogRGVmaW5lZCBtYWNyb3MgdG8gdXNlIHRoZSByaWdodCBzaXplcyBpbgotCWNvZmZzd2FwLmguCi0JKiBsaWJlY29mZi5oOiBCYWNrZW5kIGluZm9ybWF0aW9uIGlzIG5vdyBpbiB0YXJnZXQgdmVjdG9yLCBub3QKLQlCRkQuICBTdGFydCBvZiBiYWNrZW5kIGluZm9ybWF0aW9uIGlzIENPRkYgYmFja2VuZCBpbmZvcm1hdGlvbi4KLQkqIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmM6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoQVJNQVBfU1RBUlQpOiBDaGFuZ2VkIGludG8gYmFja2VuZCBpbmZvcm1hdGlvbiwgc2luY2UgQWxwaGEgdXNlcwotCWEgZGlmZmVyZW50IG5hbWUuCi0JKGVjb2ZmX3NsdXJwX2FybWFwKTogRG9uJ3Qgb3ZlcmxheSBhcmNoaXZlIGhlYWRlci4KLQkqIGJmZC5jOiBJbmNsdWRlIGxpYmNvZmYuaC4KLQotVHVlIEF1ZyAgMyAxNjozMzoxMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRml4IHNoIHN5bnRheCBlcnJvci4KLQotCSogYW91dGYxLmg6IE1ha2UgYmZkX2Vycm9yX3RyYXAgZXh0ZXJuOyBpdCdzIGRlZmluZWQgaW4gYmZkLmMuCi0KLVR1ZSBBdWcgIDMgMTU6MTk6MDkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbV9zbHVycF9zeW1ib2xfdGFibGU6IERvbid0IHVzZSAnJicgb24gYXJyYXlzLgotCi1UdWUgQXVnICAzIDExOjA2OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYzogTmV3IGZpbGUgZm9yIGdlbmVyaWMgRUNPRkYgZnVuY3Rpb25zLgotCSogZWNvZmZzd2FwLmg6IE5ldyBmaWxlIGZvciBFQ09GRiBzd2FwcGluZyBmdW5jdGlvbnMgd2hpY2ggZGlmZmVyCi0Jb25seSBzbGlnaHRseSBmb3IgZGlmZmVyZW50IHRhcmdldHMuCi0JKiBsaWJlY29mZi5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciBlY29mZi5jIGZ1bmN0aW9ucy4KLQkoZWNvZmZfYmFja2VuZF9kYXRhKTogTmV3IHN0cnVjdHVyZS4KLQkoZWNvZmZfdGRhdGEpOiBBZGRlZCBiYWNrZW5kX2RhdGEgZmllbGQuICBDaGFuZ2VkIGV4dGVybmFsIGRhdGEKLQlwb2ludGVycyB0byBiZSBQVFIgcmF0aGVyIHRoYW4gdG8gYSBwYXJ0aWN1bGFyIHN0cnVjdC4KLQkoZWNvZmZfc3ltYm9sX3N0cnVjdCk6IE1vdmVkIGluIGZyb20gY29mZi1taXBzLmMuCi0JKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jOiBNb3ZlZCBjb21tb24gZnVuY3Rpb25zIGludG8gZWNvZmYuYy4KLQlBZGRlZCBFQ09GRiBiYWNrZW5kIHN0cnVjdHVyZXMuICBJbmNsdWRlIGVjb2Zmc3dhcC5oLgotCSogY29mZi1tc3ltLmM6IFJlbW92ZWQ7IHN1cGVyc2VkZWQgYnkgZWNvZmZzd2FwLmguCi0JKiBiZmQuYzogSW5jbHVkZSBjb2ZmL2ludGVybmFsLmguCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBSZW1vdmVkIGNvZmYtbWlwcy5vIGFuZCBjb2ZmLW1zeW0uby4KLQlBZGRlZCBlY29mZi5vLgotCShCRkQ2NF9CQUNLRU5EUyk6IEFkZGVkIGNvZmYtYWxwaGEuby4KLQkoQ0ZJTEVTKTogUmVtb3ZlZCBjb2ZmLW1zeW0uYy4gIEFkZGVkIGVjb2ZmLmMuCi0JKGJmZC5vKTogQWRkZWQgZGVwZW5kZW5jeSBvbiAkKElOQ0RJUikvY29mZi9zeW0uaC4KLQkoY29mZi1taXBzLm8pOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGVjb2Zmc3dhcC5oIGFuZCBjb2ZmL2Vjb2ZmLmguCi0JKGVjb2ZmLm8sIGNvZmYtYWxwaGEubyk6IE5ldyB0YXJnZXRzLgotCShjb2ZmLW1zeW0ubyk6IFJlbW92ZWQgdGFyZ2V0LgotCi1Nb24gQXVnICAyIDIzOjMzOjM4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmgsIGhvc3RzLyo6ICBSZW1vdmUgKG9uZSBtb3JlIHRpbWUpIGFsbCBvY2N1cnJhbmNlcwotCW9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcy4gIEhlYXZlIGhvIQotCi1Nb24gQXVnICAyIDE2OjQ1OjU3IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogIEFkZCBjaGVjayBmb3IgSTM4NkxZTlhNQUdJQy4KLQotTW9uIEF1ZyAgMiAxMjoxODowMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogcmVtb3ZlIHNvbWUgbW9yZSBjb25mbGljdGluZyBkZWNscwotCi1Nb24gQXVnICAyIDExOjQ4OjIzIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmM6ICBSZW1vdmUgdW5uZWNlc3NhcnkgZGVmIG9mIE5fSEVBREVSX0lOX1RFWFQsCi0JcmVkZWZpbmUgVEVYVF9TVEFSVF9BRERSIHRvIGJlIDAuCi0KLVN1biBBdWcgIDEgMjI6NTQ6MDggMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZ3VyZS5pbiwgaG9zdHMvaTM4Nmx5bnguaDogIEx5bngvMzg2Ci0JaG9zdCBhbmQgdGFyZ2V0IGluZm8uCi0KLUZyaSBKdWwgMzAgMTg6MDg6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG0zMi1pMzg2LmM6IE5ldyBmaWxlLiAgRmlyc3QgY3V0IGF0IGkzODYgTkxNIGNvZGUuCi0JKiBsaWJubG0uaDogQWRkZWQgc29tZSBtb3JlIHByb3RvdHlwZXMuCi0JKHN0cnVjdCBubG1fcmVsZW50KTogTmV3IHN0cnVjdHVyZS4KLQkobmxtTkFNRShzeW1ib2xfdHlwZSkpOiBBZGRlZCByY250IGFuZCByZWxvY3MgZmllbGRzLgotCShzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IEFkZGVkIG5ldyBmaWVsZHM6IG5sbV9zeW1ib2xzLAotCW5sbV90ZXh0X2xvdywgbmxtX2RhdGFfbG93LCBubG1fcmVsb2NfZml4dXBzLAotCW5sbV9yZWxvY19maXh1cF9zZWNzLgotCShzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUsIHdpdGggYWNjZXNzb3IgbWFjcm9zLgotCSogbmxtY29kZS5oOiBVc2UgTkxNX0hJQklUIHJhdGhlciB0aGFuIE1TQi4KLQkobmxtX29iamVjdF9wKTogU2V0IFNFQ19SRUxPQyBmb3IgLnRleHQgYW5kIC5kYXRhLiAgRG9uJ3Qgc2V0Ci0JU0VDX0RBVEEgZm9yIC5ic3MuICBTZXQgSEFTX1JFTE9DIGFuZCBIQVNfU1lNUyBmb3IgYWJmZC4gIFNldCB0aGUKLQlhcmNoaXRlY3R1cmUuCi0JKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsIG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQsCi0JZmluZF9ub256ZXJvLCBubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBOZXcgb3V0Ym91bmQKLQlzd2FwcGluZyBmdW5jdGlvbnMuCi0JKG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogSW5jbHVkZQotCWV4dGVybmFsIHJlZmVyZW5jZXMgaW4gc3ltYm9sIHRhYmxlIGFzIHVuZGVmaW5lZCBzeW1ib2xzLgotCShubG1fZ2V0X3N5bXRhYiwgbmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IEZpbGwgaW4gYWxvY2F0aW9uCi0JYXJndW1lbnQgaW4gZ2V0X3N5bXRhYiByYXRoZXIgdGhhbiBpbiBzbHVycF9zeW1ib2xfdGFibGUuCi0JKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTYXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBpbiB0ZGF0YS4KLQkobmxtX3ByaW50X3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkobmxtX3NsdXJwX3JlbG9jX2ZpeHVwcywgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCwKLQlubG1fY2Fub25pY2FsaXplX3JlbG9jKTogTmV3IGZ1bmN0aW9ucyB0byByZWFkIHJlbG9jcy4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywgbmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzLAotCW5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlLCBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTmV3Ci0JZnVuY3Rpb25zIHRvIGNyZWF0ZSBOTE0gZmlsZXMuCi0JKiBubG0tdGFyZ2V0Lmg6IERlZmluZSBhbGwgdGhlIG5sbSBmdW5jdGlvbnMgaGVyZSBlaXRoZXIgYXMKLQlkZWZhdWx0IHZhbHVlcyBvciBpbiB0ZXJtcyBvZiBubG1OQU1FLiAgVXNlIEpVTVBfVEFCTEUobmxtKS4gIFNldAotCXRoZSBiYWNrZW5kX2RhdGEgZmllbGQgdG8gVEFSR0VUX0JBQ0tFTkRfREFUQS4KLQkqIG5sbTMyLWdlbi5jLCBubG02NC1nZW4uYzogRG9uJ3QgZGVmaW5lIGZ1bmN0aW9uIG1hY3JvcyBoZXJlOwotCXRoZXkgYXJlIG5vdyBpbiBubG0tdGFyZ2V0LmguCi0JKFRBUkdFVF9CQUNLRU5EX0RBVEEpOiBEZWZpbmUgYXMgTlVMTC4KLQkqIG5sbS5jIChubG1fbWtvYmplY3QpOiBEbyBhbGxvY2F0ZSB0aGUgdGRhdGEgZmllbGQuCi0JKG5sbV9zZXRfYXJjaF9tYWNoKTogTmV3IGZ1bmN0aW9uLgotCSogdGFyZ2V0cy5jOiBBZGRlZCBubG0zMl9pMzg2X3ZlYy4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZGVkIG5sbTMyLWkzODYuby4KLQkoQ0ZJTEVTKTogQWRkZWQgbmxtMzItaTM4Ni5jLgotCShubG0zMi1nZW4ubywgbmxtNjQtZ2VuLm8pOiBEZXBlbmQgb24gbmxtLXRhcmdldC5oLgotCShubG0zMi1pMzg2Lm8pOiBOZXcgdGFyZ2V0LgotCi1UaHUgSnVsIDI5IDIwOjIwOjM5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiByZW1vdmUgc29tZSBmdW5jdGlvbiBkZWNscyB0aGF0IGNvbmZsaWN0IHcvIEFOU0kKLQlDLCBhbmQgYXJlbid0IG5lZWRlZCBhbnl3YXkgKHJldHVybiBpbnQpCi0KLVdlZCBKdWwgMjggMTU6NDY6MzggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IFVzZSBjYXN0cyB3aXRoIGJmZF9hbGxvYyBhbmQgYWxsb2NhLgotCi1UdWUgSnVsIDI3IDEyOjUxOjQzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG17MzIsNjR9LWdlbi5jIChKVU1QX1RBQkxFX1BSRUZJWCk6ICBEZWxldGUuCi0JKiBubG17MzIsNjR9LWdlbi5jIChKVU1QX1RBQkxFX0lOSVQpOiAgTmV3IG1hY3JvIHRoYXQgd29ya3Mgd2l0aAotCW9sZGVyIGNwcCdzLCB0aGF0IGRvbid0IGRvIGFkZGl0aW9uYWwgcmVwbGFjZW1lbnQgb24gdGhlIEpVTVBfVEFCTEUKLQltYWNybydzIGFyZ3VtZW50LgotCSogbmxtLXRhcmdldC5oIChKVU1QX1RBQkxFX0lOSVQpOiAgVXNlIG5ldyBtYWNybyBpbiBwbGFjZSBvZgotCUpVTVBfVEFCTEUgbWFjcm8uCi0KLU1vbiBKdWwgMjYgMTc6Mzk6MDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQlZZXQgYW5vdGhlciB0cmFkLWNvcmUgdmFyaWFudDoKLQkqIGNvbmZpZy9lc2l4Lm1oLCBob3N0cy9lc2l4Lmg6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5ob3N0czogVXNlIHRoZW0uCi0KLU1vbiBKdWwgMjYgMTM6MjI6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIHRoZSBjYXNlIG9mCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHJpZ2h0c2hpZnQgPiBiaXRwb3MsIGFuZCBhIG5lZ2F0aXZlCi0JbnVtYmVyLgotCi1Nb24gSnVsIDI2IDE0OjQwOjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oOiBSZWltcGxlbWVudCBzZWdtZW50IHdyaXRpbmcuCi0JKGVsZl93cml0ZV9waGRycyk6IFVzZSBwcmVjb21wdXRlZCBlX3Bob2ZmIHJhdGhlciB0aGFuIG1ha2luZwotCWFzc3VtcHRpb25zLgotCShlbGZfYnVpbGRfcGhkcnMpOiBEaXNhYmxlZCwgZm9yIG5vdy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBEb24ndCBjaGFuZ2UgZmlsZSBvZmZzZXQgZm9yCi0JU0hUX05PQklUUy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBOZXcgZnVuY3Rpb24uCi0JKHN0cnVjdCBzZWdfaW5mbyk6IE5ldyB0eXBlLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IE5ldyBmdW5jdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBGb3IgZXhlY3V0YWJsZXMsIGxlYXZlCi0Jc2VjdGlvbiBoZWFkZXJzICZjIGZvciBsYXN0LCBhbmQgcHJvcGVybHkgYWxpZ24gYWxsIHNlY3Rpb25zIHdpdGgKLQlmbGFnIFNIRl9BTExPQyBzZXQuCi0JKHByZXBfaGVhZGVycyk6IE5vIGxvbmdlciBhYm9ydCB3aGVuIEVYRUNfUCBpcyBzZXQuCi0JKHdyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVsZXRlZCBhbGwgY29kZSByZWxhdGluZyB0byBwcm9ncmFtCi0Jc2VnbWVudHMuCi0KLQkqIGVsZmNvZGUuaCAodmFyaW91cyk6IERlbGV0ZWQgc29tZSB1bnVzZWQgY29kZSwgYW5kIGRlYnVnZ2luZwotCSJtYWxsb2MoMCkiIGNhbGxzLgotCSh3cml0ZV9yZWxvY3MpOiBDYWNoZSB2YWx1ZSBvZiBsYXN0IHN5bWJvbCBsb29rZWQgdXAsIHRvIHNhdmUKLQl0aW1lIGlmIHRoZSBzeW1ib2wgaXMgcmVmZXJyZWQgdG8gcmVwZWF0ZWRseS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGVjayBvbmx5IFNFQ19SRUxPQyBmbGFnLCBub3QgbnVtYmVyIG9mCi0JcmVsb2NzLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluIChvZmlsZXMpOiBTdGFycyBpbiB3aWxkY2FyZHMgYmVsb25nIG91dHNpZGUgcXVvdGVzLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGQsIG1heHBhZ2VzaXplLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBmaWVsZCwgcGhkci4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGYzMl9iZWQpOiBJbml0aWFsaXplIG1heHBhZ2VzaXplIGZyb20KLQlFTEZfTUFYUEFHRVNJWkUuCi0JKEVMRl9NQVhQQUdFU0laRSk6IERlZmF1bHQgdG8gMS4KLQkqIGVsZjY0LXRhcmdldC5oIChlbGY2NF9iZWQsIEVMRl9NQVhQQUdFU0laRSk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCShlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBBbGwgcmVsb2NzIHNob3VsZCBoYXZlIHBjcmVsX29mZnNldD10cnVlLgotCU1vc3Qgc2hvdWxkIGhhdmUgbGVuZ3RoIGZpZWxkIG9mIGAyJy4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSA2NC1iaXQgcmVsb2NzLgotCi0JKiBjb25maWcvc3BhcmMtYW91dC5tdCAoVEFSR0VUX0JBQ0tFTkRTKTogRGVmaW5lLgotCi1Nb24gSnVsIDI2IDA4OjU2OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBsb29rIGluICR7c3JjZGlyfSBmb3IgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ307Ci0JdGhlIHRvcCBsZXZlbCBzY3JpcHQgaGFzIGFscmVhZHkgYWRqdXN0ZWQgZm9yIGl0LgotCi1Nb24gSnVsIDI2IDA4OjA5OjE5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogIEdldCBDUiBMRiBpbiB0aGUgcmlnaHQgb3JkZXIuCi0KLU1vbiBKdWwgMjYgMDI6MDg6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3ZheGJzZC5oOiBJbmNsdWRlIHN0ZC1ob3N0LmguICBEb24ndCBpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+LgotCi1TYXQgSnVsIDI0IDE2OjEzOjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSBjYXNlIG9mIHJpZ2h0c2hpZnQgIT0KLQliaXRwb3Mgd2hlbiBvdmVyZmxvdyBjaGVja2luZy4KLQotRnJpIEp1bCAyMyAxMDoyMDoyNyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwgYmZkX3VuZGVmaW5lZF9zeW1ib2wsCi0JYmZkX3JlbG9jX3ZhbHVlX3RydW5jYXRlZCwgYmZkX3JlbG9jX2lzX2Rhbmdlcm91cywgYmZkX2Fzc2VydCk6Ci0JU2VuZCBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIuCi0KLVRodSBKdWwgMjIgMTU6NTc6MjkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbXszMiw2NH0tdGFyZ2V0Lmg6ICBSZW1vdmUuCi0JKiBubG0tdGFyZ2V0Lmg6ICBOZXcgZmlsZSwgbWVyZ2VkIGZyb20gbmxtezMyLDY0fS10YXJnZXQuaAotCSogbGlibmxtLmggKE5MTV9BUkNIX1NJWkUpOiAgRGVmaW5lIHRvIEFSQ0hfU0laRS4KLQkqIG5sbS5jIChBUkNIX1NJWkUpOiAgUmVtb3ZlIGRlZmluZSB0byB6ZXJvLgotCSogbmxtMzItZ2VuLmMgKEFSQ0hfU0laRSk6ICBEZWZpbmUgdG8gMzIuCi0JKiBubG0zMi1nZW4uYyAoSlVNUF9UQUJMRV9QUkVGSVgpOiAgRGVmaW5lIHRvIG5sbTMyLgotCSogbmxtezMyLDY0fS1nZW4uYyAobmxtLXRhcmdldC5oKTogIEluY2x1ZGUuCi0JKiB0YXJnZXRzLmMsIGxpYm5sbS5oLCBubG0uYywgbmxtezMyLDY0fS1nZW4uYywgbmxtezMyLDY0fS5jLAotCW5sbWNvZGUuaDogIENvbnZlcnQgcHJlZml4ZXMgZnJvbSBiZmRfbmxtPHNpemU+IHRvIGp1c3QKLQlubG08c2l6ZT4sIGFuZCB1c2UgbWFjcm9zIHNlbGVjdCBzaXplLgotCi1UaHUgSnVsIDIyIDE1OjQwOjE0IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogYWRkIGNvbmZpZ3VyZS5pbiwgZHJvcCByZWR1bmRhbnQKLQkgICQoc3JjZGlyKSwgZHJvcCByZWR1bmRhbnQgLi8KLQotVGh1IEp1bCAyMiAxMzozNDo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGhwdXgtY29yZS5jOiBOZXcgZmlsZTsgYmFja2VuZCBmb3IgSFAvVVggc3R5bGUgY29yZSBmaWxlcy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IFJlbmFtZWQgaHBwYV9jb3JlX2RhdGEgZmllbGQgdG8KLQlocHV4X2NvcmVfZGF0YS4KLQkqIGJmZC1pbjIuaDogVXBkYXRlZC4KLQkqIGhwcGEuYyAobWFrZV9iZmRfYXNlY3Rpb24sIGhwcGFfY29yZV9maWxlX3AsCi0JaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kLCBocHBhX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCwKLQlocHBhX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IE1vdmVkIGludG8gaHB1eC1jb3JlLmMuCi0JUmVtb3ZlZCBmcm9tIHRhcmdldCB2ZWN0b3IuCi0JKiBsaWJocHBhLmggKHN0cnVjdCBocHBhX2NvcmVfc3RydWN0IGFuZCBhY2Nlc3NvciBtYWNyb3MpOiBNb3ZlZAotCWludG8gaHB1eC1jb3JlLmMuCi0JKiB0YXJnZXRzLmM6IElmIEhQVVhfQ09SRSBpcyBkZWZpbmVkLCBhZGQgaHB1eF9jb3JlX3ZlYyB0bwotCXRhcmdldCBsaXN0LgotCSogY29uZmlnL2hwMzAwLm1oIChIREVGSU5FUyk6IFNldCB0byAtREhQVVhfQ09SRS4KLQkoSERFUEZJTEVTKTogU2V0IHRvIGhwdXgtY29yZS5vLgotCSogY29uZmlnL2hwcGFic2QubWgsIGNvbmZpZy9ocHBhaHB1eC5taDogTGlrZXdpc2UuCi0JKiBob3N0cy9ocDMwMC5oIChIT1NUX0hQMzAwSFBVWCk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6IEFkZGVkIHNjby1jb3JlLm8sCi0JYWl4Mzg2LWNvcmUubywgaHB1eC1jb3JlLm8uCi0JKHNjby1jb3JlLm8sIGFpeDM4Ni1jb3JlLm8sIGhwdXgtY29yZS5vKTogTmV3IGRlcGVuZGVuY2llcy4KLQotCSogcmVsb2MuYyAoZW51bSBjb21wbGFpbl9vdmVyZmxvdyk6IE5ldyBlbnVtZXJhdGlvbiB3aXRoIHRoZQotCXZhcmlvdXMgZmxhdm91cnMgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcuCi0JKHNydHVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBDaGFuZ2VkIGNvbXBsYWluX29uX292ZXJmbG93IGZpZWxkCi0JZnJvbSBib29sZWFuIHRvIGVtdW0gY29tcGxhaW5fb3ZlcmZsb3cuICBSZW1vdmVkIG9ic29sZXRlIGFic29sdXRlCi0JZmllbGQuCi0JKEhPV1RPKTogUmVtb3ZlZCBhYnNvbHV0ZSBhcmd1bWVudC4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvIG92ZXJmbG93IGNoZWNraW5nIG9uIGFsbCB0eXBlcyBvZgotCWZpZWxkcy4KLQkqIGJmZC1pbjIuaDogVXBkYXRlZCBhY2NvcmRpbmdseS4KLQkqIGFsbCB0YXJnZXRzOiBVcGRhdGVkIGluaXRpYWxpemF0aW9uIG9mIHJlbG9jIGhvd3RvIHRhYmxlcy4KLQotV2VkIEp1bCAyMSAyMDozNDozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfY3JlYXRlKTogRG9uJ3QgdXNlIEMrKyBrZXl3b3JkICJ0ZW1wbGF0ZSIgYXMgYSBDCi0JdmFyaWFibGUgbmFtZS4KLQotVHVlIEp1bCAyMCAxNTowMjoyMyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmMgKG02OGtfaG93dG8ycnR5cGUpOiAgTWFrZSBhcmcgQ09OU1QgdG8gbWF0Y2ggY2FsbGVycy4KLQotCSogZWxmY29kZS5oOiAgRml4IHNldmVyYWwgaWxsZWdhbCBwb2ludGVyIGNvbWJpbmF0aW9uIHdhcm5pbmdzIGZvcgotCXVzYWdlcyBvZiBiZmRfYWxsb2MgYW5kIGFsbG9jYS4KLQotCSogbGlibmxtLmggKG5sbV9vYmpfdGRhdGEpOiAgUmVuYW1lIGhpZGRlbiBzdHJ1Y3QgbWVtYmVycyB0byBhdm9pZAotCWFwcGFyZW50IFN1biBDIHByZXByb2Nlc3NvciByZWN1cnNpb24uICBGaXggYWNjZXNzIG1hY3Jvcy4KLQkqIG5sbWNvZGUuaDogIFJlbW92ZSBzcHVyaW91cyAnJicgYmVmb3JlIHNldmVyYWwgYXJyYXkgcmVmZXJlbmNlcy4KLQotVHVlIEp1bCAyMCAxNDozNjoyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIGZvciBET1MgdW5pcXVlbmVzczogY29mZi1tNjhrLXVuLmMgLT4gY29mZi11NjhrLmMKLQljb25maWcvbTY4ay1jb2ZmdW4ubXQgLT4gdTY4ay1jb2ZmLm10LgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UdWUgSnVsIDIwIDE2OjIxOjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRG9uJ3QgdXNlICImIiBiZWZvcmUKLQlmdW5jdGlvbiBuYW1lOyBpdCdzIHZhbGlkIHdpdGhvdXQsIGFuZCBzb21lIGNvbXBpbGVycyBnaXZlCi0Jd2FybmluZ3Mgd2l0aCBpdCB0aGVyZS4KLQotVHVlIEp1bCAyMCAwODoyMToxNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6ICBBcHBseSBzb21lIG9mIHRoZSBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlIHRvIGJmZC1pbjIuaC4KLQkqIGJmZC5jICh1bmlvbiB0ZGF0YSk6ICBBZGQgbmxtX29ial9kYXRhOwotCSogdGFyZ2V0cy5jIChlbnVtIHRhcmdldF9mbGF2b3VyKTogIEFkZCBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLgotCi1Nb24gSnVsIDE5IDIwOjQ2OjE4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlLCBpWzM0XTg2LSotbmV0d2FyZSk6ICBOZXcgY29uZmlncy4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6ICBBZGQgbmxtLm8sIG5sbTMyLm8sIG5sbTMyLWdlbi5vLgotCSogTWFrZWZpbGUuaW4gKEJGRDY0X0JBQ0tFTkRTKTogIEFkZCBubG02NC5vLCBubG02NC1nZW4uby4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiAgQWRkIG5sbXszMiw2NH0uYywgbmxtezMyLDY0fS1nZW4uYy4KLQkqIE1ha2VmaWxlLmluIChubG0ubywgbmxtezMyLDY0fS5vLCBubG17MzIsNjR9LWdlbi5vOiAgTmV3IHRhcmdldHMuCi0JKiBiZmQtaW4yLmggKElOTElORSk6ICBEZWZpbmVzIG1vdmVkIGhlcmUuCi0JKiB7YW91dHguaCwgZWxmLmMsIGVsZmNvZGUuaH06ICBNb3ZlIElOTElORSBkZWZpbmVzIHRvIGJmZC1pbjIuaC4KLQkqIGxpYmVsZi5oIChDQVQ0KTogIE1vdmUgZGVmaW5lIHRvIGJmZC1pbjIuaC4KLQkqIGJmZC1pbjIuaCAoQ0FUNCk6ICBNZXJnZSBDQVQ0IG1hY3JvIHdpdGggb3RoZXIgQ0FUIG1hY3Jvcy4KLQkqIGJmZC1pbjIuaCAodW5pb24gdGRhdGEpOiAgQWRkIG5sbV9vYmpfZGF0YS4KLQkqIGJmZC1pbjIuaCAoZW51bSB0YXJnZXRfZmxhdm91cik6ICBBZGQgYmZkX3RhcmdldF9ubG1fZmxhdm91ci4KLQkqIHRhcmdldHMuYyAoYmZkX25sbXszMiw2NH1fe2JpZyxsaXR0bGV9X3ZlYyk6ICBBZGQgcHJvdG90eXBlcy4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBBZGQgYmZkX25sbXszMiw2NH1fe2JpZyxsaXR0bGV9X3ZlYy4KLQkqIChsaWJubG0uaCwgbmxtLmMsIG5sbWNvZGUuaCwgbmxtezMyLDY0fS1nZW4uYywKLQlubG17MzIsNjR9LXRhcmdldC5oLCBubG17MzIsNjR9LmMsIGNvbmZpZy9pMzg2LW5sbS5tdCk6ICBOZXcgZmlsZXMKLQlmb3IgTkxNIHN1cHBvcnQuCi0KLU1vbiBKdWwgMTkgMTU6MDk6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUue2hvc3RzLGlufTogYWRkIGlbMzRdODYtKi1seW54b3MqIHN1cHBvcnQKLQotTW9uIEp1bCAxOSAxNDo1MzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jLCBlbGZjb2RlLmgsIGxpYmVsZi5oOiBTZXJpb3VzIHJlb3JnYW5pemF0aW9uLgotCURlbGV0ZWQgYHRodW5rJyBzdHJ1Y3R1cmUsIG1lcmdlZCBpbnRvIHRkYXRhLCBkdXBsaWNhdGUgZGF0YQotCWVsaW1pbmF0ZWQuCi0JUmVhcnJhbmdlZCBmdW5jdGlvbnMsIGdyb3VwaW5nIGJ5IGZ1bmN0aW9uYWxpdHkuCi0JQnJva2UgdXAgbWFueSBmdW5jdGlvbnMgaW4gZWxmY29kZS5oLCByZS1vcmRlcmVkIG1hbnkgcGFydHMgb2YKLQlmaWxlIHdyaXRpbmcgdG8gaGFuZGxlIHVucHJlZGljdGFibGUgc3RhdGUgb2Ygc2VjdGlvbiByZWxvY2F0aW9uCi0JdGFibGUgYXMgcHJvdmlkZWQgYnkgdmFyaW91cyBhcHBsaWNhdGlvbnMuCi0JU3RpbGwgbmVlZHMgY2xlYW51cDogTWVyZ2UgZnVuY3Rpb25zIGJhY2sgdG9nZXRoZXIsIHNwbGl0IG91dAotCWRhdGEgc3RydWN0dXJlIHdpdGggb25seSBkYXRhIHRoYXQgaXMgdXNlZCBvbmx5IHdoZW4gd3JpdGluZyBvdXQKLQlvYmplY3QgZmlsZS4KLQotCSogZWxmLmMgKGJmZF9lbGZfZ2VuZXJpY19yZWxvYyk6IE5ldyBmdW5jdGlvbiwgdGFrZW4gZnJvbQotCWNvZmYtbWlwcy5jLgotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogVXNlIGl0LCB0byB3b3JrIGFyb3VuZAotCWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gbG9zc2FnZS4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogSW5jbHVkZSBjb2ZmLW1pcHMubyBhbmQgY29mZi1tc3ltLm8sIHNvCi0JdGhhdCBnZGIgd2lsbCBsaW5rLgotCShvZmlsZXMpOiBEb24ndCB1c2Ugc29ydCBvciB1bmlxOyBkbyBpdCB3aXRoIHNoIGNvbnN0cnVjdHMuCi0KLVN1biBKdWwgMTggMTk6NDI6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBSZWNvZ25pemUgSTM4NlBUWE1BR0lDLgotCSogYW91dGYxLmgsIGxpYmFvdXQuaDogQWRkIE1fMzg2X0RZTklYLgotCSogdHJhZC1jb3JlLmMgKFRSQURfQ09SRV9VU0VSX09GRlNFVCwgVFJBRF9DT1JFX1NUQUNLX0ZJTEVQT1MpOgotCU5ldyBtYWNyb3M7IHVzZSBpdCBpZiBkZWZpbmVkLgotCSogY29uZmlnL3N5bW1ldHJ5Lm1oLCBob3N0cy9zeW1tZXRyeS5oOiBOZXcgZmlsZXMuCi0KLUZyaSBKdWwgMTYgMTQ6NTY6MzEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBSZW5hbWUgZWxmezMyLDY0fS1nZW5lcmljLmMgdG8gKi1nZW4uYyBmb3IgMTQgY2hhciBmaWxlbmFtZXMuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGFjY29yZGluZ2x5LgotCShDRklMRVMpOiBBZGQgZWxmNjQtZ2VuLmMuCi0KLUZyaSBKdWwgMTYgMDk6NTM6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYzogVXNlIE1JUFNfQU9VVF97T1p9TUFHSUMgcmF0aGVyIHRoYW4ge09afU1BR0lDLgotCi1UaHUgSnVsIDE1IDE2OjAyOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tODhrLmMgKGhvd3RvX3RhYmxlKTogQ29ycmVjdGVkIGJpdHNpemUgZm9yIFJfUENSMjZMIGZyb20KLQkxNiB0byAyNi4KLQotV2VkIEp1bCAxNCAxNToyOTo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIFtIT1NUX0hQUEFCU0RdOiBVc2UgaHB1eC1zdHlsZSBjb3JlIGZpbGVzLgotCSogbGliaHBwYS5oIFtIT1NUX0hQUEFCU0RdOiBJbmNsdWRlIGhwdXggdmVyc2lvbiBvZiBjb3JlLmgKLQotV2VkIEp1bCAxNCAwOTozMDo0OCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBoODMwMGgtKi0qLgotCi1UdWUgSnVsIDEzIDEyOjAzOjAwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDg1MDAuYyAocmVsb2NfcHJvY2Vzc2luZywgcnR5cGUyaG93dG8pOiBOZXcgcmVsb2NhdGlvbgotCXR5cGUgUl9IODUwMF9ISUdIXzE2LgotCSogY29mZi1zaC5jIChyX2ltbTMyKTogR2V0IHRoZSB3aWR0aCBvZiB0aGUgcmVsb2MgcmlnaHQuCi0KLVR1ZSBKdWwgMTMgMTY6NDg6NTYgMTk5MyAgRnJlZGVyaWMgUGllcnJlc3RlZ3V5IChGLlBpZXJyZXN0ZWd1eUBmcmNsLmJ1bGwuZnIpCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG5ldyB0YXJnZXQgbTY4ay1jb2ZmdW4gdG8gdGhlIGRweC8yLgotCSogY29uZmlnL202OGstY29mZnVuLm10OiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIGNvbmZpZy9kcHgyLm10LgotCi1Nb24gSnVsIDEyIDEwOjQyOjQ5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBNb3ZlIFNQQVJDX0JBU0UxMyByZWxvYyBpbnRvCi0Jc3BhcmMtYW91dC1zcGVjaWZpYyBsaXN0LgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgZmllbGQgYHRodW5rJy4KLQotCSogY29uZmlnL3NwYXJjLWVsZi5tdCAoVEFSR0VUX0JBQ0tFTkRTKTogTmV3IG1ha2UgdmFyaWFibGUuCi0KLVRodSBKdWwgIDEgMTQ6NTI6NDcgMTk5MyAgRnJlZGVyaWMgUGllcnJlc3RlZ3V5IChGLlBpZXJyZXN0ZWd1eUBmcmNsLmJ1bGwuZnIpCi0JCQkgIGFuZCBKaW0gS2luZ2RvbiAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IFVzZSBtZW1zZXQgbm90IGJ6ZXJvLgotCSogdHJhZC1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN5cy9maWxlLmg+LgotCSogaTM4NmxpbnV4Lmg6IEluY2x1ZGUgPHN5cy9maWxlLmg+LgotCSogY29mZi1tNjhrLXVuLmM6IG5ldyBmaWxlIHRvIGhhbmRsZSBuYW1lcyB3aXRoIHVuZGVyc2NvcmVzIG9uCi0Jc3ZyMyBtYWNoaW5lcy4KLQkqIGNvZmYtbTY4ay5jIChtNjhrX3J0eXBlMmhvd3RvKTogYWRkZWQgI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLQl0byBub3QgZHVwbGljYXRlIHRoZSBmdW5jdGlvbiBpbiB0aGUgZXhlY3V0YWJsZS4KLQkoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSk6IG5ldyBtYWNyb3MgbmVlZGVkCi0JYnkgY29mZi1tNjhrLXVuLmMuCi0JKiBjb2ZmY29kZS5oIChNQzY4S0JDU01BR0lDKTogY2FzZSBhZGRlZC4KLQkqIHRhcmdldHMuYzogQWRkIG02OGtjb2ZmdW5fdmVjLgotCSogY29uZmlndXJlLmhvc3Q6IGFkZGVkIHN1cHBvcnQgZm9yIEJ1bGwgZHB4LzIuCi0JKiBjb25maWcvZHB4Mi5taCwgaG9zdHMvZHB4Mi5oOiBuZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdGFyZ2V0IGNvZmYtbTY4ay11bi4KLQotRnJpIEp1bCAgOSAwMDo0MzowNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmg6IEFkZCBkZWZpbml0aW9uIG9mIE1BQ0hUWVBFX09LLgotCi1UaHUgSnVsICA4IDE0OjM3OjQ0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IHN1YnRyYWN0IHRoZSBhZGRlbmQKLQlhZ2FpbiBmb3IgY29mZi4KLQotCSogc3ltcy5jLCBiZmQtaW4yLmg6IERvYyBmaXguCi0KLQkqIGNvZmZjb2RlLmggKENBTENfQURERU5EKTogQ2hlY2sgZm9yIGNvbW1vbiBzZWN0aW9uIHVzaW5nIHRoZQotCXNlY3Rpb24gZmxhZyBhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgZmxhZy4KLQotVGh1IEp1bCAgOCAxMzo0Mzo1MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NmJzZC5oOiBDb25kaXRpb25hbGl6ZSBIT1NUX1NUQUNLX0VORF9BRERSIG9uIF9fYnNkaV9fLgotCWkzODZic2QuYzogUmVtb3ZlIGRlZmluZXMgb2YgTl9UWFQqOyB0aGUgdmVyc2lvbnMgaW4gYW91dDY0Lmggc2hvdWxkCi0JYmUgc3VmZmljaWVudC4gIERlZmluZSBURVhUX1NUQVJUX0FERFIuCi0KLVdlZCBKdWwgIDcgMTA6NTY6MjEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogUmVtb3ZlZCBzdGF0ZXAKLQlhcmd1bWVudC4gIEp1c3QgbGV0IGFuIGluZGlyZWN0IHN5bWJvbCBwb2ludCB0byB0aGUgbmV4dCBzeW1ib2wKLQl3aXRob3V0IGZvcmNpbmcgdGhlIG5leHQgc3ltYm9sIHRvIGJlIHVuZGVmaW5lZC4gIENoYW5nZWQgYWxsCi0JY2FsbGVycy4KLQkqIGhwMzAwaHB1eC5jIChzbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2VkIGNhbGwgdG8KLQl0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLgotCSogdGFyZ2V0cy5jOiBBZGRlZCBocDMwMGhwdXhfdmVjLgotCSogTWFrZWZpbGUuaW4gKGhwMzAwaHB1eC5vKTogQWRkZWQgZGVwZW5kZW5jaWVzLgotCi1UdWUgSnVsICA2IDEzOjI0OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogUHV0IHNpbXBsZSBwb3dlci1vZi10d28KLQlyZWxvY3MgdG9nZXRoZXIsIGFuZCBhZGQgNjQtYml0IHZlcnNpb25zLgotCShiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBcmd1bWVudCB0byBhbGxvY2EKLQlpcyBzaXplX3QuCi0KLQkqIGxpYmJmZC5jIChiZmRfeG1hbGxvY19ieV9zaXplX3QpOiBOZXcgZnVuY3Rpb24uCi0JKiBvcG5jbHMuYyAoYmZkX2NhY2hlX2luaXQsIGJmZF9vcGVuX2ZpbGUpOiBBZGQgcHJvdG90eXBlcyB0bwotCWRlY2xhcmF0aW9ucy4KLQkob2JzdGFja19jaHVua19hbGxvYyk6IFVzZSBiZmRfeG1hbGxvY19ieV9zaXplX3QuCi0JKG5ld19iZmQpOiBQcm90b3R5cGUtc3R5bGUgZGVmaW5pdGlvbiwgdXNpbmcgREVGVU4uCi0JKGJmZF9hbGxvY19ncm93LCBiZmRfYWxsb2MsIGJmZF96YWxsb2MsIGJmZF9yZWFsbG9jKTogU2l6ZQotCWFyZ3VtZW50IGlzIHR5cGUgc2l6ZV90LCBub3QgYmZkX3NpemVfdHlwZS4KLQkqIGllZWUuYyAob2JzdGFja19jaHVua19hbGxvYyk6IFVzZSBiZmRfeG1hbGxvY19ieV9zaXplX3QuCi0JKiBiZmQuYyAoYmZkX2RlZmF1bHRfZXJyb3JfdHJhcCwgYmZkX2Vycm9yX3RyYXAsCi0JYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibHRyYXApOiBQcm90b3R5cGVzLgotCSogbGliYmZkLWluLmggKGJmZF9hbGxvYywgYmZkX3phbGxvYywgYmZkX3JlYWxsb2MsCi0JYmZkX2FsbG9jX2dyb3cpOiBBZGp1c3RlZCBwcm90b3R5cGVzIGZvciBhcmcgdHlwZSBjaGFuZ2UuCi0JKiBhcmNoaXZlLmMgKGdldF9lbHRfYXRfZmlsZXBvcywgZG9fc2x1cnBfYnNkX2FybWFwLCBub3JtYWxpemUsCi0JZG9fc2x1cnBfY29mZl9hcm1hcCwgYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKToKLQlQcm90b3R5cGVzLgotCSogZWxmY29kZS5oIChlbGZfc3RyaW5nX2Zyb21fZWxmX3N0cnRhYik6IFByb3RvdHlwZXMuCi0JKiBsaWJlbGYuaCAoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uLCBlbGZfZ2V0X3N0cl9zZWN0aW9uKToKLQlQcm90b3R5cGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogUmVuYW1lZCBmcm9tIEJGRF9NQUNISU5FUy4KLQkob2ZpbGVzKTogTmV3IHRhcmdldC4gIEJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZmlsZSBuYW1lcywgaW4gY2FzZQotCWFueSBnb3QgZHVwbGljYXRlZC4KLQkoVEFSR0VUTElCKTogVXNlIGxpc3Qgb2YgZmlsZXMgZnJvbSBvZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFNldCBCRkRfTUFDSElORVMgYW5kIEJGRF9CQUNLRU5EUyBkZXBlbmRpbmcgb24KLQltaW5pbWFsLWJmZCBmbGFnIGFuZCB0YXJnZXQgbWFrZWZpbGUgZnJhZyBjb250ZW50cy4KLQotCSogZWxmY29kZS5oIChlbGZfcmVhZCk6IERlbGV0ZSBzdGF0aWMgZGVjbGFyYXRpb24sIHNpbmNlIGZ1bmN0aW9uCi0JaGFzIG1vdmVkLgotCShlbGZfbWFwX3N5bWJvbHMpOiBXcml0ZSBvdXQgc2VjdGlvbiBzeW1ib2xzIGZvciBhbGwgc2VjdGlvbnMsIGZvcgotCW5vdy4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBBbGxvdyBtYXRjaCBpZiBib3RoIHN5bWJvbHMgYXJlCi0Jc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgc2FtZSBzZWN0aW9uLgotCShlbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCBwcmludCBtZXNzYWdlLCBqdXN0IHJldHVybiBmYWxzZS4KLQotCSogbGliZWxmLmggKGJmZF9lbGZfbG9jYXRlX3NoKTogRGVjbGFyYXRpb24gZGVsZXRlZC4KLQotTW9uIEp1bCAgNSAxNjo0ODoxMSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjcHUtaDgzMDAuYyAoaDgzMDBfc2Nhbik6IEZpeCBwYXJzaW5nIG9mIGFyY2hpdGVjdHVyZSBzdHJpbmcuCi0KLUZyaSBKdWwgIDIgMTg6Mjc6MDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBiZmQuaCBhbmQgc3RtcC1iZmQuaC4KLQkocmVhbGNsZWFuKTogUmVtb3ZlIGdlbmVyYXRlZCBoZWFkZXJzLgotCi1GcmkgSnVsICAyIDE0OjUxOjUxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fY29udGVudCk6ICBEZW55IGlmIGZpbGUgaXMgbm90IG9wZW5lZCB3aXRoCi0JdGhlIHByb3BlciBtb2RlLCBzZXQgb3V0cHV0X2hhc19iZWd1biBpZiBmaWxlIGlzIG9wZW5lbmVkIGZvciB1cGRhdGUuCi0JKiBhb3V0eC5oIChhb3V0Xypfc2V0X3NlY3Rpb25fY29udGVudCk6ICBSZW1vdmUgY2hlY2tzIHRoYXQgYXJlIG5vdwotCWRvbmUgaW4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnQuCi0KLUZyaSBKdWwgIDIgMDk6MjU6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBSZW1vdmVkIGRlY2xhcmF0aW9ucyBvZiBwcmludGYsIGZwcmludGYsCi0JZmNudGwsIGZyZWFkIGFuZCBmd3JpdGUuICBUaGV5IGFyZSBhbGwgZXJyb3IgcHJvbmUgZm9yIG9uZSByZWFzb24KLQlvciBhbm90aGVyLiAgQ2hhbmdlZCBkZWNsYXJhdGlvbiBvZiBtZW1jaHIgZnJvbSBjaGFyICogdG8gUFRSLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1yaXNjb3MqKTogTmV3IHRhcmdldDsgdXNlIHJpc2Nvcy4KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLSotcmlzY29zKik6IE5ldyBob3N0OyB1c2UgcmlzY29zLgotCSogY29uZmlnL3Jpc2Nvcy5taCAoSERFRklORVMpOiBBZGQgLUcgNC4KLQotCSogbGliYW91dC5oIChHRVRfU1dPUkQpOiBVc2UgdGhlIGJmZF9oX2dldF9zaWduZWQgZW50cnkgcG9pbnRzCi0JcmF0aGVyIHRoYW4gY2FzdGluZyB0aGUgcmVzdWx0IG9mIGJmZF9oX2dldC4KLQotRnJpIEp1bCAgMiAxMDoxMzo0OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBob3N0cy9kZWx0YTY4LmgsIGNvbmZpZy9kZWx0YTY4Lm1oOiBBZGQgc3R1ZmYgZm9yCi0JTW90b3JvbGEgRGVsdGEgNjguCi0KLVdlZCBKdW4gMzAgMDY6MDI6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGY2NF97YmlnLGxpdHRsZX1fZ2VuZXJpY192ZWMpOiBEZWNsYXJlLCBhbmQKLQlpbmNsdWRlIGluIHNlYXJjaCBsaXN0IGlmIEJGRDY0IGlzIGRlZmluZWQuCi0KLQkqIGxpYmVsZi5oIChDQVQ0KTogQWRkZWQgYSB2ZXJzaW9uIGZvciBTYWJlci1DLCBBTlNJIG1vZGUuCi0JKGJmZF9lbGY2NF8qKTogRGVjbGFyYXRpb25zIGZvciA2NC1iaXQgdmVyc2lvbnMgb2YgbWFueSByb3V0aW5lcy4KLQotVHVlIEp1biAyOSAyMjo1MDo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZjY0LXRhcmdldC5oLCBlbGY2NC1nZW5lcmljLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChCRkQ2NF9CQUNLRU5EUyk6IEluY2x1ZGUgZWxmNjQtZ2VuZXJpYy5vLgotCShlbGY2NC1nZW5lcmljLm8pOiBMaXN0IGRlcGVuZGVuY2llcy4KLQotCSogTWFrZWZpbGUuaW46IExpc3QgdGFyZ2V0IGBhbGwnIGV4cGxpY2l0bHkgYmVmb3JlIGhvc3QvdGFyZ2V0Ci0JbWFrZWZpbGUgZnJhZ21lbnRzIGFyZSBpbmNsdWRlZCwgaW4gY2FzZSB0aGV5IGRlZmluZSBhbnkgbmV3Ci0JdGFyZ2V0cy4KLQotCSogZWxmY29kZS5oIChFTEZfUl9JTkZPLCBFTEZfUl9TWU0pOiBEZWZpbmUgYXMgMzItIG9yIDY0LWJpdAotCXZlcnNpb25zIGFzIGFwcHJvcHJpYXRlLiAgVXNlcyB1cGRhdGVkLgotCShlbGZfZGVidWdfc2VjdGlvbik6IERlY2xhcmUgYmVmb3JlIHVzZS4KLQkoZWxmX2RlYnVnX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgYmZkX3NoZHJfZnJvbV9zZWN0aW9uLCBlbGZfZmFrZV9zZWN0aW9ucyk6Ci0JQWxpZ25tZW50IHZhbHVlIGluIHNlY3Rpb24gaGVhZGVyIGlzIG5fYnl0ZXMsIG5vdCBsb2cyLgotCShuZXdfc2VjdGlvbl9ob29rKTogRG8gbm90aGluZyBmb3Igbm93LgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgRWxmX0V4dGVybmFsX1JlbFthXSwgbm90IDMyLWJpdAotCXZlcnNpb24gZXhwbGljaXRseS4KLQkoZWxmX2NvcmVfZmlsZV9wKTogU2ltcGxpZnkgY2hlY2sgZm9yIGNvcnJlY3QgY2xhc3MgKHdvcmQgc2l6ZSkuCi0JKGVsZl9tYWtlX3NlY3Rpb25zLCBlbGZfZmFrZV9zZWN0aW9ucywgZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6Ci0JSW5pdGlhbGl6ZSBhbGwgZmllbGRzIHdoZW4gY3JlYXRpbmcgZGF0YSBzdHJ1Y3R1cmVzLgotCShlbGZfbG9jYXRlX3NoKTogUmVuYW1lZCBmcm9tIGJmZF9lbGZYWF9sb2NhdGVfc2gsIG1hZGUgc3RhdGljLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2V0IGNvcnJlY3QgY2xhc3MgaW4gb3V0cHV0Ci0JZmlsZS4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNlY3Rpb24gc3ltYm9scyBoYXZlIGVtcHR5IG5hbWVzIGluCi0Jb3V0cHV0IGZpbGUuCi0KLQkqIGxpYmJmZC5jIChiZmRfeG1hbGxvYywgemFsbG9jKTogQmUgc3VyZSB0byBjYXN0IG1hbGxvYywgbWVtc2V0Ci0JYXJncyB0byBzaXplX3QgYmVmb3JlIGNhbGwuCi0JKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogQ2FzdCB6YWxsb2MgYXJnIHRvIGJmZF9zaXplX3R5cGUuCi0KLVR1ZSBKdW4gMjkgMTA6NDk6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBJZiBwcm9jZWR1cmUgaGFzIG5vIGxpbmUKLQludW1iZXIgaW5mb3JtYXRpb24sIHJldHVybiAwIGZvciBsaW5lIG51bWJlci4KLQotTW9uIEp1biAyOCAxMDo0NTowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogSWYgKm9sZHJhd3B0ciBpcyBub24tTlVMTCwgY29weSBpdAotCWludG8gKnJhd3B0ci4KLQotU3VuIEp1biAyNyAwOTowNToxOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvcmlzY29zLmg6IERlZmluZSBOQlBHIGFuZCBVUEFHRVMuCi0KLVN1biBKdW4gMjcgMTY6Mjg6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHVzZSBvYmpfcmF3X3N5bXMgYXMKLQlsdmFsdWU7IGl0IGNvbnRhaW5zIGEgY2FzdC4KLQotRnJpIEp1biAyNSAxNzowOTo1NSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGhhc2gsIGNvbXBhcmUsIHN0cnVjdCBzdHJpbmd0YWJfZW50cnksIGFkZF90b19zdHJpbmd0YWIpOgotCVVzZSB1bnNpZ25lZCBoYXNoIHZhbHVlcyBmb3IgYmV0dGVyIGhhc2hpbmcuCi0JKGhhc2gpOiBIYXNoIGluIHRoZSBzdHJpbmcgbGVuZ3RoIGZvciBsb25nIHN0cmluZ3MuCi0KLVRodSBKdW4gMjQgMTU6NDc6NTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChjb21wYXJlKTogUmVwbGFjZSAzIGlmJ3Mgd2l0aCBhIHN1YnRyYWN0aW9uLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncywgYWRkX3RvX3N0cmluZ3RhYik6IFJlb3JkZXIgdGVzdHMKLQlpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIHN1Y2Nlc3MsIGFzIGFuIG9wdGltaXphdGlvbi4KLQkoaGFzaCk6IFRha2UgYSBsZW5ndGggYXJnOyBpZ25vcmUgY2hhcnMgYWZ0ZXIgIzI1LCBmb3Igc3BlZWQuCi0JKGFkZF90b19zdHJpbmd0YWIpOiBQYXNzIGxlbmd0aCB0byBoYXNoLgotCi1UaHUgSnVuIDI0IDE3OjI1OjUxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1zcGFyYy5jIChzcGFyY19yZWxvY19tYXApOiBBZGQgU1BBUkNfV0RJU1AyMiByZWxvYy4KLQotCSogZWxmY29kZS5oIChlbGZfbmV3X3NlY3Rpb25faG9vayk6IERvIG5vdGhpbmcgZm9yIG5vdy4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE91dHB1dCBjb21tb24gc3ltYm9scyB0aGUgd2F5IEVMRgotCXdhbnRzIHRoZW0uCi0KLVdlZCBKdW4gMjMgMTY6MjA6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSBhbmQgYXNzb2NpYXRlZCBtYWNyb3MpOiBNb3ZlZAotCWhlcmUgZnJvbSBlbGZjb2RlLmguICBBIGNvdXBsZSBvZiBzaXplLXNwZWNpZmljIHN0cnVjdHVyZSBwb2ludGVycwotCXdlcmUgY2hhbmdlZCB0byBQVFI7IHVzZXMgZml4ZWQgYXBwcm9wcmlhdGVseS4KLQkoZWxmMzJfc3ltYm9sX3R5cGUsIGVsZjY0X3N5bWJvbF90eXBlKTogU2VwYXJhdGVkIGRlZmluaXRpb25zLgotCShiZmRfZWxmX21rb2JqZWN0KTogUmVuYW1lZCBmcm9tIGJmZF9lbGYzMl9ta29iamVjdC4KLQkoYmZkX2VsZjMyX21rb2JqZWN0LCBiZmRfZWxmNjRfbWtvYmplY3QsIGVsZl9ta29iamVjdCk6IE5ldwotCXRlbXBvcmFyeSBtYWNyb3MgdG8gZWFzZSBuYW1lIGNoYW5nZS4KLQkqIGVsZi5jIChlbGZfcmVhZCwgZWxmX21rb2JqZWN0LCBlbGZfZ2V0X3N0cl9zZWN0aW9uLAotCWVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiwgYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBNb3ZlZCBoZXJlCi0JZnJvbSBlbGZjb2RlLmguCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogUHJvY2VzcyBlbGYuYyB0b28uCi0JKiBNYWtlZmlsZS5pbiAoZWxmLm8pOiBOb3RlIG5ldyBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZmNvZGUuaDogTG90cyBvZiBzdHVmZiBtb3ZlZCBlbHNld2hlcmUuICBEZWxldGVkIHNvbWUgdW51c2VkCi0JY29kZSwgdHdlYWtlZCBzb21lIGRlYnVnIGhvb2tzLgotCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogVHJhbnNsYXRlIEVMRiBzZWN0aW9uIHN5bWJvbHMgaW50byBCRkQKLQlzZWN0aW9uIHN5bWJvbHMuCi0KLVdlZCBKdW4gMjMgMTE6MzQ6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3Jpc2Nvcy5oOiBOZXcgZmlsZS4KLQotVHVlIEp1biAyMiAxNDozNToyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGNhc2UgU0hUX1BST0dCSVRTKTogRXZlbiBpZgotCXNlY3Rpb24gYWxyZWFkeSBleGlzdHMsIHVzZSBpdHMgcG9pbnRlciB0byBmaWxsIGluIHJhd2RhdGEgc2xvdC4KLQotVHVlIEp1biAyMiAxNjozNjo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogUmV0dXJuIHZhbHVlIG9mIHB1dHMgYW5kIGZwdXRzIGlzIGludCBub3Qgdm9pZC4KLQotVHVlIEp1biAyMiAxNDoyNTo1OCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IENvbW1lbnQgdGhlIGZpZWxkIG5hbWVzLgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZpeCBtYXggYW5kIG1pbiB2YWx1ZXMuCi0KLU1vbiBKdW4gMjEgMTg6MTk6MTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGYzMi1ocHBhLmMsIGVsZmNvZGUuaDogVXNlIG5ldwotCXNpemUtaW5kZXBlbmRlbnQgZWxmIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KLQkqIGVsZmNvZGUuaCAocHV0X3dvcmQsIGdldF93b3JkKTogRGVmaW5lIGFzIGFwcHJvcHJpYXRlIGZvcgotCWFyY2hpdGVjdHVyZSB3b3JkIHNpemUuICBTdHJ1Y3R1cmUgc3dhcHBpbmcgZnVuY3Rpb25zIGNoYW5nZWQgdG8KLQl1c2UgdGhlbSBhcyBhcHByb3ByaWF0ZS4KLQotCSogY29uZmlndXJlLmluOiBJZiBjb21waWxpbmcgNjQtYml0IGJhY2sgZW5kcywgZG8gdGhlbSBiZWZvcmUKLQkzMi1iaXQgb25lcy4KLQotCSogbGliZWxmLmg6IFVzZSBuZXcgc2l6ZS1pbmRlcGVuZGVudCB2ZXJzaW9ucyBvZiBlbGYgaW50ZXJuYWwgZGF0YQotCXN0cnVjdHVyZXMuCi0JKHN5bWJvbF90eXBlKTogUmVvcmRlcmVkIHRvIHB1dCBhbnkgZmllbGRzIGRlcGVuZGVudCBvbiB0YXJnZXQKLQlzaXplIGF0IHRoZSBlbmQuCi0JKGVsZl9iYWNrZW5kX2RhdGEpOiBSZW5hbWVkIGZyb20gZWxmIyNfYmFja2VuZF9kYXRhIGFuZCBtYWRlCi0Jc2l6ZS1pbmRlcGVuZGVudC4KLQkoZWxmX3NlY3RfdGh1bmspOiBOb3cgc2l6ZS1pbmRlcGVuZGVudC4KLQotCSogbGliYmZkLmMgKGJmZF9sb2cyKTogTm93IHJldHVybnMgdW5zaWduZWQgaW50LgotCi1Nb24gSnVuIDIxIDEyOjMwOjQ3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBSZW5hbWUgY29uZmlnL204OGstYW91dC5tdCB0byBjb25maWcvbm9vcC5tdC4KLQljb25maWd1cmUuaW46IFVzZSBpdCBmb3IgbWlwcy0qLWJzZCouCi0KLVN1biBKdW4gMjAgMjA6MzI6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGNwdS1tNjhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBFbGltaW5hdGUgInBhcnRpYWxseSBicmFja2V0ZWQKLQlpbml0aWFsaXplciIgd2FybmluZyBmcm9tIGdjYy4KLQkqIGNwdS1oODUwMC5jIChhcmNoX2luZm9fc3RydWN0KTogTGlrZXdpc2UuCi0JKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLgotCi0JKiBjcHUtaDgzMDAuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCBob3d0bypfY2FsbGJhY2ssCi0JaG93dG9fKik6IFVudXNlZCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBjb21tZW50ZWQgb3V0LgotCSogY3B1LXo4ay5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsIGhvd3RvKl9jYWxsYmFjaywKLQlob3d0b18qKTogTGlrZXdpc2UuCi0JKiBjcHUtaDg1MDAuYyAoY29tcGF0aWJsZSk6IExpa2V3aXNlLgotCSogY3B1LXNoLmMgKGNvbXBhdGlibGUpOiBMaWtld2lzZS4KLQotCSogaHAzMDBocHV4LmMgKHN3YXBfc3RkX3JlbG9jX2luKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMuCi0JQWx3YXlzIHNldCBhIHZhbGlkIGxlbmd0aCB2YWx1ZSwgZXZlbiBmb3IgaW52YWxpZCBpbnB1dC4KLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBVc2Ugc3ByaW50Zl92bWEuCi0KLQkqIGJmZC1pbi5oICh1aW50NjRfdHlwZUxPVywgdWludDY0X3R5cGVISUdILCBpbnQ2NF90eXBlLAotCXVpbnQ2NF90eXBlKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zLgotCSogaG9zdHMvc3RkLWhvc3QuaCAoaW50NjQgc3R1ZmYpOiBSZW1vdmUgdGhlbSBmcm9tIGhlcmUuCi0KLQkqIGJmZC1pbi5oIChzcHJpbnRmX3ZtYSk6IERlZmluZSBwYXJhbGxlbCB0byBmcHJpbnRmX3ZtYS4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IERlbGV0ZSB1bnVzZWQKLQl2YXJpYWJsZS4gIEFkZGVkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBCZWZvcmUgY2FzdGluZwotCXBvaW50ZXJzIHRvIGludGVnZXJzLCBtYWtlIHN1cmUgdGhlIGludGVnZXIgdHlwZSBpcyB3aWRlIGVub3VnaC4KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBEaXR0by4KLQotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBTaW5jZSBgY291bnQnIGlzIHVuc2lnbmVkLAotCWRvbid0IGJvdGhlciBjb21wYXJpbmcgZm9yIGxlc3MtdGhhbi16ZXJvLgotCShiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQotCSogZWxmY29kZS5oIChiZmRfYWRkX3RvX3N0cnRhYik6IE5vdyBzdGF0aWMuCi0JKHN5bV9pc19nbG9iYWwpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9tYXBfc3ltYm9scyk6IENhbGwgaXQuICBOb3cgcmV0dXJucyB2b2lkLiAgUmVtb3ZlZCB1bnVzZWQKLQlsb2NhbCB2YXJpYWJsZS4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFyayBzdHJpbmcgdGFibGVzIG90aGVyIHRoYW4gZm9yIHNlY3Rpb24KLQlhbmQgc3ltYm9sIG5hbWVzIGFzIG5vcm1hbCBzZWN0aW9ucyBoYXZpbmcgY29udGVudHMuCi0JKGZpeF91cF9zdHJ0YWJzKTogTmV3IGZ1bmN0aW9uOyBmaXhlcyB1cCBFTEYgaGVhZGVyIGZpZWxkcyBmb3IKLQlzdGFiIHNlY3Rpb25zIHdpdGggc3RyaW5nIHRhYmxlcyBhc3NvY2lhdGVkLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTWFwIGZpeF91cF9zdHJ0YWJzIG92ZXIgYWxsIEJGRAotCXNlY3Rpb25zLiAgUmVvcmRlcmVkIGNvbmRpdGlvbiB0ZXN0cyBmb3Igc3ltYm9sIGZsYWdzOyBkZWZhdWx0IHRvCi0JbG9jYWwtb2JqZWN0IHZhbHVlIGluc3RlYWQgb2YgZ2xvYmFsLW9iamVjdC4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBIaWQgY29uZGl0aW9uYWxseS11c2VkIHZhcmlhYmxlCi0JaW5zaWRlIGNvbmRpdGlvbiB0ZXN0LgotCShlbGZfcHJpbnRfc3ltYm9sKTogVXNlIGZwcmludGZfdm1hLgotCShlbGZfaWR4X29mX3N5bSwgYmZkX3NoZHJfZnJvbV9zZWN0aW9uKTogVW51c2VkIGZ1bmN0aW9ucwotCWNvbW1lbnRlZCBvdXQuCi0KLQkqIGJmZC1pbi5oIChpbnQ2NF90eXBlLCB1aW50NjRfdHlwZSk6IERlZmluZSB0aGVzZSBpZiB3ZSBmYWxsCi0JYmFjayB0byAibG9uZyBsb25nIiBmb3IgSE9TVF82NF9CSVQuCi0KLQkqIGxpYmVsZi5oIChlbGZOQU1FLCBFbGZOQU1FKTogTmV3IHZlcnNpb25zIHRvIGdldCBkZXNpcmVkIHJlc3VsdHMKLQl3aXRob3V0IHVzaW5nIGludmFsaWQgQU5TSSBDIHByZXByb2Nlc3NpbmcgdG9rZW5zLgotCi0JKiBlbGYzMi10YXJnZXQuaCAoYmZkX2VsZjMyX25ld19zZWN0aW9uX2hvb2spOiBEZWxldGUgbWFjcm8uCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX25ld19zZWN0aW9uX2hvb2spOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChuZXdfc2VjdGlvbl9ob29rKTogRGVmaW5lIGhlcmUuCi0KLQkqIGhvc3RzL3NwYXJjLmgsIGhvc3RzL3N0ZC1ob3N0LmgsIGhvc3RzL2kzODZic2QuaDogUHJvdGVjdAotCWFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQotCSogaG9zdHMvbmV3cy5oOiBJbmNsdWRlIGhvc3RzL3N0ZC1ob3N0LmgsIG5vdCBwbGFpbiBzdGQtaG9zdC5oLgotCi0JKiBNYWtlZmlsZS5pbiAoYmZkLmgpOiBHZW5lcmF0ZSBpbnRvIGN1cnJlbnQgZGlyZWN0b3J5IGJ5IGdyYWJiaW5nCi0JNjQtYml0IGRlZmluaXRpb24gKGlmIGFueSkgZnJvbSBzeXNkZXAuaC4KLQkqIGJmZC1pbi5oOiBQdXQgaW4gbWFya2VyIGZvciBzeXNkZXAuaCBpbmNsdXNpb24uCi0KLUZyaSBKdW4gMTggMTk6NTc6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQ2hlY2sgZm9yIG92ZXJmbG93IG9uCi0JcGMtcmVsYXRpdmUgcmVsb2NhdGlvbnMgaWYgdGhlIGhvd3RvIGFza2VkIGZvciBpdC4KLQotRnJpIEp1biAxOCAxNjowMDoyMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBJZ25vcmUgbm9uemVybyBleGl0IHN0YXR1cyBmcm9tIGdyZXAuCi0KLUZyaSBKdW4gMTggMTY6NTQ6MjkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9yaXNjb3MubXtoLHR9OiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUue2hvc3QsaW59OiBVc2UgdGhlbS4KLQotRnJpIEp1biAxOCAxMjo1NToxMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbWlwcy5jOiBjb21tZW50IGNoYW5nZS4gIFRoaXMgaXMgYSBtaXBzIGZpbGUsIG5vdCA4OGsuCi0KLU1vbiBKdW4gMTQgMTQ6MDI6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGNhY2hlLmMgKGJmZF9jYWNoZV9pbml0KTogSW5jcmVtZW50IG9wZW5fZmlsZXMgYW5kIGNhbGwgY2xvc2Vfb25lCi0JaWYgbmVjZXNzYXJ5LgotCShiZmRfb3Blbl9maWxlKTogRG9uJ3QgaW5jcmVtZW50IG9wZW5fZmlsZXMgaGVyZS4KLQotRnJpIEp1biAxOCAxMDowMDoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlbHRhODgubWg6IERvbid0IHNldCBDQy4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBlbGYzMi17bWlwcyxtODhrLGdlbmVyaWN9LgotCWVsZjMyLXttaXBzLG04OGssZ2VuZXJpY30uYzogTmV3IGZpbGVzLgotCXRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEluY2x1ZGUgYmZkX2VsZjMyX3ttaXBzLG04OGssZ2VuZXJpY31fdmVjLgotCWVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogTWF0Y2ggZWxmMzItZ2VuZXJpYyBmb3IgYWxsIG1hY2hpbmVzIHdoaWNoCi0JZG9uJ3QgbWF0Y2ggYSBkaWZmZXJlbnQgdGFyZ2V0LgotCi1GcmkgSnVuIDE4IDAzOjEyOjEyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JRWxpbWluYXRlICJpbnQ4X3R5cGUiLCAiaW50MTZfdHlwZSIsICJpbnQzMl90eXBlIiwgYW5kIHRoZWlyCi0JdmFyaWFudHMgZnJvbSB0aGUgQkZEIHVuaXZlcnNlLiAgTGVhdmUgdGhlIDY0LWJpdCB0eXBlcyBmb3Igbm93LAotCXNpbmNlIHRoZXkgYXJlIGluIGZsdXguCi0KLQkqIGFvdXR4LmgsIGhwMzAwaHB1eC5jOiAgRWxpbWluYXRlIG5lZWRsZXNzIChpbnQzMl90eXBlKSBjYXN0cy4KLQkqIGxpYmFvdXQuaCAoR0VUX1NXT1JEKTogIENvbnZlcnQgKGludDMyX3R5cGUpIHRvIChpbnQpLgotCSogaWVlZS5jOiAgQ29udmVydCB1aW50OGVfdHlwZSA9PiB1bnNpZ25lZCBjaGFyLgotCSogb2FzeXMuYzogIEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGVsaW1pbmF0ZSBvYnNvbGV0ZSB0eXBlcy4KLQlUaGVzZSBkZXBlbmQgb24gY2hhbmdlcyBpbiAuLi9pbmNsdWRlL29hc3lzLmggYXMgd2VsbC4KLQkqIGhvc3RzLyouaDogIFJlbW92ZSBkZWNsYXJhdGlvbnMgb2YgYWxsIHRoZXNlIHR5cGVzLgotCi1Nb24gSnVuIDE0IDE0OjAyOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9kZWx0YTg4Lmg6ICNpZiAwIG91dCBzb21lIGRlY2xhcmF0aW9ucyB3aGljaCBjb25mbGljdCB3aXRoCi0Jc3lzdGVtIGhlYWRlcnMuCi0KLU1vbiBKdW4gMTQgMTc6MDg6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IHJlbW92ZSBwYXJlbnRkaXIgY3J1ZnQKLQotTW9uIEp1biAxNCAxOTowNDowOSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfZ2V0X3N5bWJvbF9pbmZvKTogIFJlbW92ZSByZWR1bmRhbnQgY29weS4KLQkqIEV4cHVyZ2F0ZSByYW5kb20gREVGVU5zIHRoYXQgaGF2ZSBjcmVwdCBpbi4KLQotTW9uIEp1biAxNCAxMDoyMzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDb25zdHJ1Y3RvciBzZWN0aW9ucyBzaG91bGQKLQlvbmx5IGJlIGFsaWduZWQgdG8gYSA0IGJ5dGUgYm91bmRhcnkuCi0KLVNhdCBKdW4gMTIgMTY6MTM6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0LmggKHN0cnVjdCBpbnQ2NGVfc3RydWN0KTogUmVtb3ZlIG5lZWRsZXNzIHR5cGVkZWYKLQlrZXl3b3JkLgotCi1GcmkgSnVuIDExIDE0OjI1OjM0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGZsYWdzIHRvIDEsIGJyZWFraW5nCi0JMTkyNyBidXQgZml4aW5nIHNvbWUgb3RoZXIgaW1wb3J0YW50IHRoaW5ncy4KLQotVGh1IEp1biAxMCAyMDozNjoyMiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oIChpbnQ2NGVfdHlwZSk6IEZpeCBkZWZpbml0aW9uLgotCi1UaHUgSnVuIDEwIDExOjQ4OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogVXNlIFNUWVBfTUlQU19JTklUIGZvcgotCXNlY3Rpb24gbmFtZWQgX0lOSVQuICBEb24ndCBzZXQgU1RZUF9URVhUIHVubGVzcyBTRUNfQ09ERSBpcyBzZXQuCi0JKGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogVHJlYXQgYSBTVFlQX01JUFNfSU5JVCBzZWN0aW9uIGxpa2UKLQlhIFNUWVBfVEVYVCBzZWN0aW9uLgotCi1XZWQgSnVuICA5IDE2OjQ4OjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwsIGhlYWRlcnMpOiBkb24ndCBwdXQgY29tbWVudHMgYWZ0ZXIgYSB0YWIKLQlpbiB0aGUgYWN0aW9ucyBzZWN0aW9uIG9mIGEgcnVsZQotCi1XZWQgSnVuICA5IDE1OjAwOjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBNYXJrIFpNQUdJQyBmaWxlcyBhcyBEX1BBR0VELgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBub3QgRF9QQUdFRCwgZG9uJ3QgYWRkIHRoZQotCXNlY3Rpb24gaGVhZGVycyB0byB0ZXh0X3NpemUuICBJZiBub3QgRF9QQUdFRCwgc2V0IHRoZSBtYWdpYwotCW51bWJlciB0byBPTUFHSUMgcmF0aGVyIHRoYW4gWk1BR0lDLiAgSWYgY3JlYXRpbmcgYSBEX1BBR0VECi0JZXhlY3V0YWJsZSwgdGhlIGV4ZWN1dGFibGUgbXVzdCBmdWxseSBvY2N1cHkgYW4gZXZlbiBudW1iZXIgb2YKLQlwYWdlcy4KLQkoZWNvZmZfc2V0X3N5bWJvbF9pbmZvLCBtYWtlX2JmZF9hc2VjdGlvbiwgZWNvZmZfbGl0dGxlX3ZlYywKLQllY29mZl9iaWdfdmVjKTogQ29uc2lzdGVudGx5IHNldCBzZWN0aW9uIGFsaWdubWVudCBwb3dlciB0byA0LAotCXNpbmNlIEVDT0ZGIHNlY3Rpb25zIHNob3VsZCBiZSBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCi0JKGVjb2ZmX2xpdHRsZV92ZWMsIGVjb2ZmX2JpZ192ZWMpOiBBZGRlZCBEX1BBR0VEIHRvIG9iamVjdF9mbGFncy4KLQlNYWRlIGFyX3BhZF9jaGFyIGFuZCBhcl9tYXhfbmFtZWxlbiBhZ3JlZSBmb3IgYm90aC4KLQotVHVlIEp1biAgOCAyMDoyODowMiAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyKQotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBzdWJ0cmFjdCBzZWN0aW9uIHZtYSBmcm9tCi0Jc3ltYm9sIHZhbHVlLCBzaW5jZSBiZmQgc3ltYm9scyBhcmUgc2VjdGlvbiByZWxhdGl2ZSwgYnV0IEVMRgotCXN5bWJvbHMgYXJlbid0LgotCi1UdWUgSnVuICA4IDEyOjA4OjI3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNwdS1pOTYwLmMsIGNwdS1oODMwMC5jIChjb21wYXRpYmxlKTogTWFrZSBzdGF0aWMuCi0KLVR1ZSBKdW4gIDggMTQ6Mjc6NTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9uZXdzLmgsIGNvbmZpZy9uZXdzLm1oOiBOZXcgZmlsZXMuCi0KLVR1ZSBKdW4gIDggMTI6MDg6MjcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogYmZkLWluMi5oLCBhcmNodXJlcy5jIChiZmRfbWFjaF9oODMwMFtoXSk6IG5ldyBkZWZpbmVzLgotCSogY29mZi1oODMwMC5jOiBNb3JlIGFkZHJlc3NpbmcgbW9kZXMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IENvcGUgd2l0aCBIODMwMCBtYWdpYwotCW51bWJlci4KLQkqIGNwdS1oODMwMC5jOiBSZW1vdmVkIGRpc2Fzc2VtYmxlIHN0dWZmLiAoaDgzMDBfc2Nhbik6IFJlY29nbmlzZQotCUg4LzMwMEggbmFtZS4gKGNvbXBhdGlibGUpOiBOZXcgZnVuY3Rpb24uCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWMpOiBDb3BlIHdpdGggbW9yZQotCWFkZHJlc3NpbmcgbW9kZXMuCi0KLVR1ZSBKdW4gIDggMTA6MzA6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAotCWVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE9ubHkgcm91bmQgdG8gcGFnZSBib3VuZGFyaWVzIGlmCi0JRF9QQUdFRCBmbGFnIGlzIHNldCBmb3IgdGhlIG91dHB1dCBCRkQuCi0KLUZyaSBKdW4gIDQgMTU6NDc6NTIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoZ2V0X2luZGV4LCBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEZpeCBwb2ludGVyCi0JY2FzdHMgdG8gd29yayBvbiBtYWNoaW5lIHdoZXJlIHNpemVvZihsb25nKSAhPSBzaXplb2YoaW50KSAhPQotCXNpemVvZihjaGFyICopLgotICAgICAgICAqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBEaXR0by4KLQkqIGNwdS1oODMwMC5jIGNvZmYtaDgzMDAuYzogU3VwcG9ydCBmb3IgSDgvMzAwLUguCi0KLUZyaSBKdW4gIDQgMTU6MjQ6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfc3ltYm9scyk6IEZvciBlbXB0eSBzdHJpbmcgdGFibGUsIHdyaXRlCi0Jb3V0IDQgaW4gY29ycmVjdCBieXRlIG9yZGVyLiAgKGZyb20gbWlueWFyZEBibnIuY2EpCi0KLQkqIGVsZjMyLWhwcGEuYzogRG9uJ3QgaW5jbHVkZSBsaWJocHBhLmggZm9yIG5vdzsgZGVmaW5lCi0JQllURVNfSU5fV09SRCBpbnN0ZWFkLCB1bnRpbCBVdGFoIHNlbmRzIGEgYmV0dGVyIGZpeC4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBVc2UgeG1hbGxvYyBhbmQgeHJlYWxsb2MgaW5zdGVhZAotCW9mIG1hbGxvYyBhbmQgcmVhbGxvYy4KLQotRnJpIEp1biAgNCAwNzo0OTowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVjb2ZmbCopOiBOZXcgdGFyZ2V0OyB1c2UgZGVjc3RhdGlvbi4KLQkobWlwcy0qLWVjb2ZmKik6IEFkZGVkIHRyYWlsaW5nICcqJy4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2dldF9kZWJ1Zyk6IEdldCB0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IFBEUgotCWZvciB0aGUgRkRSLCBub3QgZnJvbSB0aGUgZmlyc3QgUERSIGluIHRoZSBmaWxlLgotCi1UaHUgSnVuICAzIDE2OjQxOjEwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoaHBwYV9nZXRfc3ltYm9sX2luZm8pOiAgTmV3IGZ1bmMgbmVlZGVkIGZvciBKVU1QX1RBQkxFLgotCi1UaHUgSnVuICAzIDE1OjMzOjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChocHBhX2dldF9zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IEp1biAgMyAxMzowNzo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3QgY3Jhc2ggaWYgbm8gc3ltYm9scyBoYXZlIGJlZW4KLQlhbGxvY2F0ZWQgeWV0LgotCi0JRnJvbSBQZXRlciBIb29nZW5ib29tIChob29nZW5Ac2NoYWZlci5jcy51dGFoLmVkdSk6Ci0JKiBsaWJocHBhLmggKE1BWENPTUxFTik6IERlZmluZSB1bmNvbmRpdGlvbmFsbHkuCi0JKF9QQV9SSVNDX0lEKTogT25seSBkZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkqIGVsZjMyLWhwcGEuYzogSW5jbHVkZSBsaWJocHBhLmguCi0KLQlGcm9tIFJhbHBoIENhbXBiZWxsOgotCSogaG9zdHMvbWlwc2JzZC5oIChIT1NUX0RBVEFfU1RBUlRfQUREUik6IERlbGV0ZSBkZWZpbml0aW9uLgotCi0JKiBlbGYzMi1ocHBhLmggKHN5bWV4dF9yb290UCwgc3ltZXh0X2xhc3RQKTogRGVsZXRlIGRlY2xzLgotCi1UaHUgSnVuICAzIDAwOjIzOjUzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWg6IGRlZmluZSBFWFRSQUxJQkVTIHRvIC1sbSAoZm9yIGJpbnV0aWxzKSwgYWxzbwotCXJlbW92ZSBkZWZpbmVzIG9mIF9fTVNET1NfXyBhbmQgX19HTzMyX18gKHRoZXNlIGFyZSBpbiB0aGUKLQljb21waWxlciBub3cpLgotCi1XZWQgSnVuICAyIDE3OjU3OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCUZyb20gVXRhaDoKLQkqIGhvc3RzL2hwcGFic2QuaDogRWxpbWluYXRlIHVzZSBvZiBvYnNvbGV0ZSBFWEZVTi4KLQkqIGNvbmZpZy9ocHBhYnNkLm1oOiBEb24ndCB1c2UgcmFubGliLgotCi1UdWUgSnVuICAxIDA0OjE1OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBlbGYuYzogTmV3IGZpbGUsIGZvciB3b3JkLXNpemUgaW5kZXBlbmRlbnQgY29kZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2hhc2gpOiBNb3ZlZCB0byB0aGVyZSwgcmVuYW1lZCBiZmRfZWxmX2hhc2guCi0JKiBNYWtlZmlsZS5pbjogSW5jbHVkZSBlbGYubyBpbiBzdGFuZGFyZCBvYmplY3RzLgotCi0JKiBiZmQtaW4uaCAoQ0FUMyk6IERlZmluZSBoZXJlLgotCSogbGliYW91dC5oLCBsaWJlbGYuaDogTm90IGhlcmUuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3Qgc3RydGFiKTogRGVmaW5lIGhlcmUuCi0JKGJmZF9lbGZfbG9jYXRlX3NoKTogRGVjbGFyZSBoZXJlLgotCSogZWxmY29kZS5oIChzdHJ1Y3Qgc3RydGFiKTogRGVmaW5pdGlvbiBkZWxldGVkLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZCBIUFBBX1BDUkVMX0NBTExfMTIuCi0KLQkqIE1ha2VmaWxlLmluOiBNYWtlICJhbGwiLCBub3QgImJmZC5oIiwgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0LgotCShzdG1wLWJmZC5oKTogTmV3IHRhcmdldDsgcHJldmVudHMgcmVidWlsZGluZyB3b3JsZCBpZiBiZmQuaAotCWhhc24ndCByZWFsbHkgY2hhbmdlZC4KLQotCVR1ZSBNYXkgMjUgMTI6MTU6MTUgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2hhc2gpOiBQcm92aWRlIGVsZiBzdGFuZGFyZCBoYXNoIGZ1bmN0aW9uLgotCSh2YXJpb3VzKTogS2V5IG9mZiBvZiB0aGUgbWFjaGluZXMgdXNlX3JlbGFfcCBmaWVsZCB0byBkZXRlcm1pbmUKLQl3aGV0aGVyIHRvIHVzZSBSRUwgb3IgUkVMQSByZWxvY2F0aW9ucy4KLQkoZWxmX3N3YXBfcmVsb2Nfb3V0LCBlbGZfc3dhcF9yZWxvY19pbik6IE5ldyBmdW5jdGlvbnMuCi0JKGVsZl9tYWtlX3NlY3Rpb25zKTogQWxsb2NhdGUgYSBwb2ludGVyIHRvIGhvbGQgYWxsIGRhdGEgZm9yIGEKLQlnaXZlbiBzZWN0aW9uLCBhbmQgY29weSBlYWNoIGZyYWdtZW50IGludG8gdGhlIGRhdGEgcmVnaW9uLgotCVVwZGF0ZSB0aGUgc2VjdGlvbidzIHBvaW50ZXIgd2l0aCB0aGUgUkVMIGltcGxpY2l0IGFkZGVuZHMgaWYgdGhlCi0JbWFjaGluZSB1c2VzIFJFTCByZWxvY2F0aW9uLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgdG8KLQllbGZfaTM4Nl9iZmRfcmVsb2NfdHlwZV9sb29rdXAsIGFuZCB1c2UgY3BwIHRvIG1hcCB0aGUgbmFtZSBiYWNrCi0JaW50byB3YXMgZWxmMzItdGFyZ2V0LmggZXhwZWN0cy4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBSZW5hbWUgdG8gZWxmX2kzODZfaW5mb190b19ob3d0by4KLQkoZWxmX2kzODZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIHJlbG9jYXRpb24gc3VwcG9ydC4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0byk6IEFkZCBtaW5pbWFsIHJlbG9jYXRpb24gc3VwcG9ydC4KLQotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgdXNlX3JlbGFfcCwgZWxmXzY0X3AsCi0JZWxmX2luZm9fdG9faG93dG9fcmVsIGZpZWxkcy4KLQotCSogZWxmMzItdGFyZ2V0LmggKGVsZl9iZWQpOiBBZGQgc3VwcG9ydCBmb3IgbmV3IGZpZWxkcyBpbgotCWVsZl9iYWNrZW5kX2RhdGEuCi0KLQlTdW4gTWF5IDMwIDE2OjM4OjI0IDE5OTMgIFBldGVyIEhvb2dlbmJvb20gIChob29nZW5AZmFzdC5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jOiBBZGQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIHN1cHBvcnQsIGZpeAotCXJlbG9jYXRpb24gaG93dG8gdGFibGUsIGFkZCBzdHViIGdlbmVyYXRpb24gc3VwcG9ydC4KLQotCSogZWxmMzItaHBwYS5oOiBBZGQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIHN1cHBvcnQsIGZpeAotCXJlbG9jYXRpb24gaG93dG8gdGFibGUsIGFkZCBzdHViIGdlbmVyYXRpb24gc3VwcG9ydC4KLQotCSogZWxmY29kZS5oIChiZmRfZWxmX2xvY2F0ZV9zaCk6IE5ldyBmdW5jdGlvbiB0byBsb2NhdGUgRUxGCi0Jc2VjdGlvbiBoZWFkZXIuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX2FkZF90b19zdHJ0YWIpOiBNYWRlIG5vbi1zdGF0aWMgZHVlIHRvIGEgY2FsbAotCWZyb20gZWxmMzItaHBwYS5jLgotCi0JKiBlbGZjb2RlLmggKGVsZl9pZHhfb2Zfc3ltKTogUmV0dXJuIFNUTl9VTkRFRiBpbnN0ZWFkIG9mIDAgd2hlbgotCXRoZSBzeW1ib2wgaXMgbm90IGZvdW5kLgotCi0JKiBlbGZjb2RlLmggKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBOb3QgYWxsIHNlY3Rpb24KLQlmaWxlIHBvc2l0aW9ucyB3ZXJlIGNvbXB1dGVkLgotCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfc2VjdF90aHVuayk6IE5ldyBmdW5jdGlvbi4KLQotCSogaHBwYS5jIChzaWduX2V4dCk6IFJlaW1wbGVtZW50LgotCi0JKiBocHBhLmMgKHJvdW5kX2Rvd24scm91bmQscm91bmRfdXAsTCxSLExTLFJTLExELFJELExSLFJSKTogTWFrZQotCXRoZXNlIGZ1bmN0aW9ucyBzdGF0aWMuCi0KLVR1ZSBKdW4gIDEgMTQ6NDA6NDEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYmZkLmgpOiAgTW92ZSBjbG9zZXIgdG8gaGVhZGVycyAtIGFuZCBhZnRlciAnYWxsJyEKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6ICBEb24ndCBzZXQKLQlCU0ZfREVCVUdHSU5HIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzLCBvbmx5IEJTRl9DT05TVFJVQ1RPUi4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogIFRyYW5zbGF0ZQotCWNvbnN0cnVjdG9yIHN5bWJvbHMgcHJvcGVybHkuCi0KLVRodSBNYXkgMjcgMTY6MDk6MDQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QpOiB1c2UgNCBieXRlIGFsaWdubWVudCBhcyBhCi0JbWluaW11bS4KLQkqIGFvdXQtdGFyZ2V0LmggKG1pbmltdW1fYWxpZ25tZW50KTogOCBieXRlIGFsaWdubWVudCBpcyByaWdodC4KLQkoZml4IGxkLzI2ODApCi0KLVRodSBNYXkgMjcgMTM6Mzg6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBCdWlsZCBiZmQtaW4yLmggaW4gc291cmNlIGRpcmVjdG9yeSwKLQlmcm9tIGJmZC1pbi5oIGFuZCAuYyBmaWxlcy4gIEJ1aWxkIGJmZC5oIGluIGJ1aWxkIGRpcmVjdG9yeSwKLQlzdWJzdGl0dXRpbmcgaW4gcmVxdWVzdGVkIHRhcmdldCB3b3JkIHNpemUuICBJbnNlcnQgd29yZCBzaXplIGludG8KLQltYWtlZmlsZSwgYW5kIG1heWJlIGVuYWJsZSA2NC1iaXQgdGFyZ2V0cy4KLQotCSogYmZkLWluLmgsIGxpYmJmZC5jLCBkZW1vNjQuYywgdGFyZ2V0cy5jOiBEZWZpbmUgQkZENjQgaWYgNjQgYml0cwotCWFyZSBhdmFpbGFibGUuICBDb25kaXRpb25hbGl6ZSBvbiB0aGlzLiAgQXNzdW1lIEhPU1RfNjRfQklUCi0Jd2lsbCBiZSBkZWZpbmVkIGlmIG5lZWRlZCwgc28gNjQtYml0IHRhcmdldHMgYXJlIGNvbmRpdGlvbmFsaXplZAotCW9ubHkgaW4gdGhlIE1ha2VmaWxlLgotCi1UdWUgTWF5IDI1IDE0OjAzOjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKENPRVJDRTY0KTogUmV3cml0ZSB0byBhdm9pZCBvdXQtb2YtcmFuZ2UgdmFsdWVzLgotCi0JKiBjb2ZmLXNoLmMgKHJ0eXBlMmhvd3RvKTogUHV0IGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyLgotCShleHRyYV9jYXNlKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZS4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3ByaW50X3N5bWJvbCk6IENhc3QgYmZkX3ZtYSB2YWx1ZXMgdG8gbG9uZwotCWJlZm9yZSBjYWxsaW5nIHByaW50Zi4KLQotCSogZWxmY29kZS5oOiBOZXcgZmlsZSwgYWxtb3N0IGNvbXBsZXRlbHkgZGVyaXZlZCBmcm9tIG9sZCBlbGYzMi5jLgotCSogZWxmMzIuYzogTm93IGp1c3QgZGVmaW5lIEFSQ0hfU0laRSBhbmQgaW5jbHVkZSBlbGZjb2RlLmguCi0JKiBNYWtlZmlsZS5pbiAoZWxmNjQubyk6IExpc3QgZGVwZW5kZW5jaWVzLCBkb24ndCBidWlsZCBieQotCWRlZmF1bHQuCi0JKGVsZjY0LmMpOiBBZGQgdG8gbGlzdCBvZiBzb3VyY2VzLgotCShlbGYzMi5vKTogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGVsZjMyLSouYzogVXBkYXRlZCB0eXBlL21hY3JvL3N0cnVjdHVyZSBuYW1lcy4gIENsZWFuZWQgdXAKLQluYW1lc3BhY2UgcG9sbHV0aW9uOyByZW5hbWUgdmVjdG9ycy4KLQkqIHRhcmdldHMuYywgY29uZmlnLyotZWxmLm10OiBVcGRhdGVkLgotCSogQWxsIHVzZXMgb2YgMzItYml0IHZlcnNpb25zIG9mIHN0cnVjdHVyZXMsIHJvdXRpbmVzLCBhbmQgbWFjcm9zCi0JcmVuYW1lZC4KLQotCSogTWFrZWZpbGUuaW4gKGFyY2h1cmVzLm8sIHRhcmdldHMubyk6IERlcGVuZCBvbiBNYWtlZmlsZS4KLQotTW9uIE1heSAyNCAxNTo1MzoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbnVtIHJlbG9jX3R5cGUpOiBObyBjb21tYSBhZnRlciBsYXN0IGVudW1lcmF0b3IuCi0KLQkqIGVsZjMyLmMgKGVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbik6IEhhbmRsZSBpbmRleCBvZiB6ZXJvCi0Jc3BlY2lhbGx5LgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBuZWVkIHRvIGRvCi0Jc28gaGVyZS4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlbGV0ZWQgb25lIHVudXNlZCB2YXJpYWJsZSBhbmQKLQlpbml0aWFsaXplZCBhbm90aGVyIHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KLQkoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZS4KLQotRnJpIE1heSAyMSAxOTowNDoyMSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBpMzg2bHlueC5jOiAgTmV3IG1vZHVsZSBmb3IgTHlueCB2YXJpYW50IG9mIGEub3V0LgotCSogTWFrZWZpbGUuaW4gKEJGRF9CQUNLRU5EUyBDRklMRVMgZGVwZW5kcyk6ICBBZGQgaTM4Nmx5bnguYy4KLQkqIGdlbi1hb3V0LmM6ICBHZXQgcmlkIG9mIGRlZnVuY3QgZW5kaWFuIHN0dWZmLCBwcmludCBvdXQgdHJ1ZQotCXBhZ2VzaXplLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIEFkZCBpMzg2bHlueF92ZWMuCi0KLUZyaSBNYXkgMjEgMTc6MDI6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGkzODYtc2NvLm10IGZvciBpWzM2XTg2LSotaXNjKi4KLQotRnJpIE1heSAyMSAxMzo0NDoxOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtdGFyZ2V0LmgsIGFvdXR4LmgsIGNvZmYtYWxwaGEuYywKLQljb2ZmLW1pcHMuYywgY29mZmdlbi5jLCBlbGYzMi5jLCBpZWVlLmMsIGxpYmFvdXQuaCwgbGliY29mZi1pbi5oLAotCWxpYmVsZi5oLCBtaXBzYnNkLmMsIG9hc3lzLmMsIHNjby1jb3JlLmMsIHNyZWMuYywgdGVraGV4LmMsCi0JdHJhZC1jb3JlLmM6IERlZmluZSBhIFRBUkdFVF9nZXRfc3ltYm9sX2luZm8gZnVuY3Rpb24gb3IgbWFjcm8uCi0JUmVtb3ZlIHRoZSBiZmRfcHJpbnRfc3ltYm9sX25tIGNhc2UgZnJvbSBUQVJHRVRfcHJpbnRfc3ltYm9sLgotCi0JKiBiZmQtaW4uaDogRG9uJ3QgZGVmaW5lIGJmZF9wcmludF9zeW1ib2xfbm0uCi0JRGVmaW5lIHN5bWJvbF9pbmZvIHR5cGUuCi0JKEpVTVBfVEFCTEUpOiBTZXQgX2dldF9zeW1ib2xfaW5mbyBlbGVtZW50LgotCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlLCBiZmRfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb25zLgotCShiZmRfZGVjb2RlX3N5bWNsYXNzKTogVXNlIGNvZmZfc2VjdGlvbl90eXBlLgotCi0JKiB0YXJnZXRzLmM6IEFkZCBiZmRfZ2V0X3N5bWJvbF9pbmZvIGNhbGwuCi0KLVdlZCBNYXkgMTkgMTU6MzA6NTIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6ICBVc2UgdW5zaWduZWQgY2hhciB0byBhdm9pZAotCWNvbXBsYWludHMgZnJvbSBhbmNpZW50IGdjYydzLgotCi1XZWQgTWF5IDE5IDE1OjUxOjE5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYzogIENoZWNrIG1hY3JvIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQuCi0JaG9zdHMvaTM4NmxpbnV4Lmg6ICBEZWZpbmUgaXQuCi0KLU1vbiBNYXkgMTcgMTU6MDA6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIFZFUlNJT04sIGJmZC1pbi5oOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuMi4KLQotCSogaHBwYS5jIChhc3NlbWJsZV8zLCBkaXNfYXNzZW1ibGVfMywgYXNzZW1ibGVfMTIsCi0JZGlzX2Fzc2VtYmxlXzEyLCBhc3NlbWJsZV8xNywgZGlzX2Fzc2VtYmxlXzE3LCBhc3NlbWJsZV8yMSwKLQlkaXNfYXNzZW1ibGVfMjEsIHNpZ25fZXh0LCBvbmVzLCBzaWduX3VuZXh0LCBsb3dfc2lnbl9leHQsCi0JbG93X3NpZ25fdW5leHQsIHJvdW5kX2Rvd24sIHJvdW5kLCByb3VuZF91cCwgTCwgUiwgTFMsIFJTLCBMRCwgUkQsCi0JTFIsIFJSLCBocHBhX2ZpZWxkX2FkanVzdCk6IE5ldyBmdW5jdGlvbnMuCi0KLU1vbiBNYXkgMTcgMTA6MDQ6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQWRkZWQgc3VwcG9ydCBmb3IgaW5kaXJlY3QKLQlzdGFicyBzeW1ib2xzLCBpbmNsdWRpbmcgbmV3IGluZGlyZWN0X3B0cl9wdHIgYXJndW1lbnQuCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFBhc3MgbmV3IGFyZ3VtZW50IGluIGNhbGxzIHRvCi0JZWNvZmZfc2V0X3N5bWJvbF9pbmZvLgotCi1GcmkgTWF5IDE0IDAwOjA1OjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBGb3IgbTY4ayBzeXN2IHN5c3RlbXMsIHVzZSBtNjhrLWNvZmYuCi0KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgREVGQVVMVF9WRUNUT1IgaGVyZS4KLQkoVERFRkFVTFRTKTogRGVmaW5lIGl0IGhlcmUuICBVc2UgdGhlIG5ldyBuYW1lLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2JhY2tlbmRfZGF0YSk6IERlbGV0ZTsgcmVseSBvbiBkZWZhdWx0Ci0JdmFsdWVzIGluc3RlYWQuCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZCBzb21lIEhQUEEgcmVsb2MgdHlwZXMuCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKE5PX0dFVFMpOiBGaXggUFJPVE8gaW52b2NhdGlvbiB0byBoYXZlIGNvcnJlY3QKLQludW1iZXIgb2YgYXJndW1lbnRzLgotCShhaXgzODZfY29yZV9maWxlX3ApOiBJbml0aWFsaXplIGNvcmVfc2l6ZSB0byBjb3JyZWN0IHZhbHVlLgotCi1XZWQgTWF5IDEyIDE0OjM5OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9CVUlMRCk6IE5ldyB2YXJpYWJsZSwgc2V0IHRvICQoQ0MpLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIENDX0ZPUl9CVUlMRC4KLQotCSogYm91dC5jIChhb3V0MzJfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZSB0byBiZQotCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSByYXRoZXIgdGhhbiBiZmRfdHJ1ZS4KLQotCSogY29mZi1taXBzLmM6IEluY2x1ZGUgbGliYW91dC5oIGFuZCBhb3V0L2FvdXQ2NC5oIHRvIGdldAotCWRlZmluaXRpb25zIGZvciBOX1NFVFtBVERCXS4KLQkoZWNvZmZfaG93dG9fdGFibGUpOiBNb3ZlZCBuZWFyIHRvcCBvZiBmaWxlLgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBJZiBhIFNUQUJTIHN5bWJvbCBvZiB0eXBlIE5fU0VUW0FUREJdIGlzCi0Jc2VlbiwgY29vayB1cCBhIGNvbnN0cnVjdG9yIHNlY3Rpb24gb2YgdGhlIHNhbWUgbmFtZSBhbmQgcHV0IGluIGEKLQlyZWxvYyBwb2ludGluZyB0byB0aGUgc3ltYm9sLiAgVGhpcyBsZXRzIHRoZSBHTlUgbGlua2VyIGJ1aWxkCi0JZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgd2l0aG91dCB1c2luZyBjb2xsZWN0LgotCi1UdWUgTWF5IDExIDAwOjMzOjMxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYyAobTg4a2Jjc192ZWMpOiAgU3ltYm9scyBoYXZlIHVuZGVyYmFycy4KLQotTW9uIE1heSAxMCAwNTo1NTo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvbWluaWZyYW1lLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBpdC4KLQotU3VuIE1heSAgOSAxNjozNjo1OSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLWJzZCk6ICBDaGFuZ2UgdG8gaHBwYSotKi1ic2QqCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotaHB1eCk6ICBDaGFuZ2UgdG8gaHBwYSotKi1ocHV4KgotCSogY29uZmlndXJlLmluIChtNjgqLWhwLWJzZCk6ICBDaGFuZ2UgdG8gbTY4Ki1ocC1ic2QqCi0JKiBjb25maWd1cmUuaW4gKG02OCotKi1ocHV4KTogIENoYW5nZSB0byBtNjgqLSotaHB1eCoKLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWJzZCk6ICBDaGFuZ2UgdG8gKi0qLWJzZCoKLQotV2VkIE1heSAgNSAxNjowODozMiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6ICBDYXN0IGVudW1zIHRvCi0JaW50LCBmb3IgdGhlIHNha2Ugb2YgdGhlIG9sZCBQb3J0YWJsZSBDIENvbXBpbGVyLgotCi1Nb24gTWF5ICAzIDE0OjM3OjAxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiAgQWRkIGNwdS1zaC5jIGFuZCBjb2ZmLXNoLmMuCi0KLU1vbiBNYXkgIDMgMTQ6MDM6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogR2V0IHRhcmdldCBuYW1lIHJpZ2h0IGZvciBtNjgqLSotaHB1eC4KLQotU3VuIE1heSAgMiAxMTozOTo0NCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKE5PX1NJR05FRF9HRVQpOiAgTmV3IG1hY3JvLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfY29yZV92ZWMpOiAgVXNlIG5ldyBOT19TSUdORURfR0VUIGluc3RlYWQgb2YKLQlzaWduZWQgTk9fR0VULCB3aGVyZSBhcHByb3ByaWF0ZS4KLQotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotbGludXgqKTogIEFkZDsgYmZkX3RhcmdldCA9IGkzODYtbGludXguCi0JKiBjb25maWd1cmUuaW4gKCotKi1saW51eCopOiAgUmVtb3ZlIHVudGlsIGxpbnV4IHBvcnQgZm9yIGEKLQlub24taTM4Ni9pNDg2IHN5c3RlbSBpcyBhY3R1YWxseSBhdmFpbGFibGUuCi0KLUZyaSBBcHIgMzAgMjA6MDQ6MTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oOiAgI3VuZGVmIGVfKiBzeW1ib2xzIHdoaWNoIGNvbWUgZnJvbSA8bWFjaGluZS9zb20uaD4KLQl3aGVuIGNvbXBpbGluZyB1bmRlciBIUFVYLgotCi1GcmkgQXByIDMwIDE3OjI1OjIzIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIFRoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgZnJvbSBKZWZmcmV5IExhdyA8bGF3QGNzLnV0YWguZWR1Pi4KLQkqIGhwcGEuYyAoaHBwYV9jb3JlX2ZpbGVfcCk6IFByb3ZpZGUgYSB0ZW1wb3JhcnkgZHVtbXkgcm91dGluZQotCWZvciBIT1NUX0hQUEFCU0QuCi0JKiBiZmQvaG9zdHMvaHBwYWJzZC5oOiBGaXggZGVjbGFyYXRpb25zIG9mIG1hbGxvYyBhbmQgZnJlZS4KLQkqIGJmZC9saWJocHBhLmg6IEluY2x1ZGUgc3lzZGVwIGhlcmUuICBDb25kaXRpb25hbGl6ZQotCWluY2x1ZGVzIGJhc2VkIG9uIEhPU1RfSFBQQUhQVVggb3IgSE9TVF9IUFBBQlNELgotCVByb3ZpZGUgZGVmaW5pdGlvbnMgZm9yIE1BWENPTUxFTiBhbmQgX1BBX1JJU0NfSUQgc3VpdGFibGUKLQlmb3IgQlNELgotCi1GcmkgQXByIDMwIDE3OjM0OjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5jOiBEb24ndCBpbmNsdWRlIGEub3V0LmguICBBcHBhcmVudGx5IG5vdCBldmVuIHRoZQotCUdOVSB2ZXJzaW9uIGlzIG5lZWRlZC4KLQotRnJpIEFwciAzMCAwOTozODo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogdXNlIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMgcmF0aGVyIHRoYW4gY2FzdGluZyBhYm9ydC4KLQotVGh1IEFwciAyOSAxMTozMDozMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEJ1aWxkIGVsZjMyLWhwcGEuby4KLQotCSogc3ltcy5jIChCU0ZfRlVOQ1RJT04pOiBOZXcgc3ltYm9sIGZsYWcuCi0KLQkqIGVsZjMyLWhwcGEuYzogRml4ZWQgdG8gd29yayB3aXRoIGVsZjMyLXRhcmdldC5oLgotCi0JKiBocDMwMGhwdXguYyAoTkFNRSwgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luKTogRml4IGZvcgotCXRyYWRpdGlvbmFsIEMuCi0JKiBsaWJhb3V0LmggKE5BTUUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBsaWJlbGYuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0JKGVsZl9zeW1ib2xfdHlwZSk6IE1vdmVkIGhlcmUsIGFkZGVkIG5ldyBmaWVsZHMuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkIGBnbG9iYWxfc3ltJzsgSSBzdXNwZWN0IHRoaXMKLQltYXkgYmUgbWlzcGxhY2VkLgotCSogZWxmMzIuYyAoZWxmX3N5bWJvbF90eXBlKTogRGVsZXRlZCBmcm9tIGhlcmUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IGZpZWxkcyByYXdfc3ltcyBhbmQgaW50ZXJuYWxfc3ltcywgdG8KLQlwb2ludCB0byBiYWNrZW5kIHZlcnNpb25zIG9mIHN5bWJvbHMuCi0JKG9ial9zeW1ib2xzLCBvYmpfcmF3X3N5bXMsIG9ial9pbnRlcm5hbF9zeW1zKTogTmV3IG1hY3Jvcy4KLQkoZWxmX3N3YXBfcGhkcl9vdXQsIGVsZl9idWlsZF9waGRycywgZWxmX3dyaXRlX3BoZHJzKTogTmV3Ci0JZnVuY3Rpb25zLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogV3JpdGUgcHJvZ3JhbSBoZWFkZXJzIGlmIGFwcHJvcHJpYXRlLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVbm5hbWVkIHNlY3Rpb25zIGdldCBlbXB0eSBzdHJpbmcgZm9yCi0JbmFtZSwgbm90ICJ1bm5hbWVkIi4gIEhhbmRsZSBTSFRfTk9CSVRTIHNlcGFyYXRlbHkgZnJvbQotCVNIVF9QUk9HQklUUywgYW5kIHNldCBzb21lIGRpZmZlcmVudCBmbGFncy4KLQkoZWxmX2ZpbGVfcCk6IE5ldyByb3V0aW5lLgotCShlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6IENhbGwgaXQuCi0JKGVsZl9vYmplY3RfcCk6IEhhbmRsZSBFTV9IUFBBLgotCShlbGZfc3ltYm9sX2Zyb20sIGVsZl9pZHhfb2Zfc3ltKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBHZXQgc3ltYm9sIG51bWJlciByaWdodCBmb3IgcmVsb2NhdGlvbnMuICBTZXQKLQlTSEZfQUxMT0MsIFNIRl9XUklURSwgU0hGX0VYRUNJTlNUUiB3aGVuIGFwcHJvcHJpYXRlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IEJTUyBzZWN0aW9uIHNob3VsZCBiZSBTSFRfTk9CSVRTLCBub3QKLQlTSFRfUFJPR0JJVFMuICBBbHdheXMgZ2VuZXJhdGUgc3ltdGFiIGFuZCBzdHJ0YWIsIG5vdCBvbmx5IGlmCi0JcmVsb2NhdGlvbnMgYXJlIG5lZWRlZC4gIFNldCBTSEZfKiBmbGFncyBhcyBhcHByb3ByaWF0ZS4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEhhbmRsZSBiZmRfYXJjaF9ocHBhLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRml4IG9mZi1ieS1vbmUgZXJyb3IgaW4gc3ltYm9sIGNvdW50LgotCVN0b3JlIGEgY29ycmVjdCB2YWx1ZSBmb3IgdGhlIHN5bWJvbDsgd3JpdGUgdGhlIHNpemUgZmllbGQKLQlwcm9wZXJseTsgbWFrZSBzb21lIGd1ZXNzZXMgYWJvdXQgdGhlIHR5cGUgZmllbGQuICBTZXQgc2VjdGlvbgotCXR5cGUgY29ycmVjdGx5IGZvciBzdHJpbmcgdGFibGVzLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogQ2hlY2sgZm9yIGFic29sdXRlIGFuZCBjb21tb24gc2VjdGlvbnMKLQlmaXJzdC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERpdHRvLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIGVsZl9zeW1ib2xfdHlwZSBpbnN0ZWFkIG9mIGFzeW1ib2wuCi0JVXNlIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJ1bm5hbWVkIiBmb3IgbmFtZWxlc3Mgc3ltYm9scy4KLQlIYW5kbGUgU1RUWV9GVU5DIHR5cGUsIGFuZCB3ZWlyZG5lc3Mgd2l0aCAiJGdsb2JhbCQiIHN5bWJvbCBmb3IKLQlIUFBBIChvbmx5PykuICBEb24ndCBmcmVlIHJhdyBzeW1ib2xzOyBrZWVwIHRoZSBwb2ludGVyIGFyb3VuZCBmb3IKLQlsYXRlci4KLQkoZWxmX3NldF9hcmNoX21hY2gpOiBIYW5kbGUgYmZkX2FyY2hfaHBwYS4KLQkoZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCByZXR1cm4gZmFsc2UuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMsIGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldAotCW91dHB1dF9oYXNfYmVndW4gZmllbGQgYWZ0ZXIgY29tcHV0aW5nIGZpbGUgcG9zaXRpb25zLgotCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBXcml0ZSBzZWN0aW9uIGNvbnRlbnRzIGltbWVkaWF0ZWx5LAotCXJhdGhlciB0aGFuIGNhY2hpbmcgdGhlIHdob2xlIGZpbGUgYW5kIHdyaXRpbmcgaXQgYXQgY2xvc2UgdGltZS4KLQotCSogbGliaHBwYS5oIChlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSwgZW51bQotCWhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwX2FsdCwgZW51bSBocHBhX3JlbG9jX2V4cHJfdHlwZSwgZW51bQotCWhwcGFfcmVsb2NfZXhwcl90eXBlX2FsdCk6IE5ldyBlbnVtZXJhdG9yIHR5cGVzLgotCi0JKiBjb25maWcvaHBwYS1lbGYubXQsLiBjb25maWcvaHBwYW9zZi5taDogSFAgUEEvT1NGIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZS5ob3N0OiBVc2UgdGhlbS4KLQotV2VkIEFwciAyOCAyMzoyMTowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXRhcmdldC5oOiBBbGxvdyBvdmVycmlkZXMgb2YgYXJtYXAgZGVmYXVsdHMuCi0KLQkqIGVsZjMyLWhwcGEuYywgZWxmMzItaHBwYS5oOiBOZXcgZmlsZXMuCi0KLQkqIGNvbmZpZy9ocDMwMGhwdXgubXQ6IE5ldyBmaWxlLgotCi1UdWUgQXByIDI3IDA1OjM5OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhaXgzODYtY29yZS5jIChOT19HRVRTKTogTmV3IG1hY3JvOyBOT19HRVQgZm9yIHNpZ25lZCB2YWx1ZXMuCi0JKGFpeDM4Nl9jb3JlX3ZlYyk6IFVwZGF0ZSBmb3IgbmV3IGZpZWxkcy4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBDYWxsIHRhcmdldC1zcGVjaWZpYwotCXNsdXJwX2FybWFwIGNvZGUsIGluc3RlYWQgb2YgYmZkX3NsdXJwX2FybWFwLgotCShiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBEZWNsYXJlIGl0LgotCSogYW91dC10YXJnZXQuaCAoQVJfUEFEX0NIQVIpOiBEZWZpbmUgaXQgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkodmVjKTogVXNlIGl0LgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBOZXcgZmllbGQgZm9yIHN1YmZvcm1hdCwgZm9yCi0JZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gaGlnaGx5IHNpbWlsYXIgYS5vdXQgZm9ybWF0cy4KLQkqIGFvdXR4LmggKE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbik6IE5ldyBtYWNybywgZGVmYXVsdHMgdG8gbG9jYWwKLQl2ZXJzaW9uIG9mIGZ1bmN0aW9uLgotCShzd2FwX2V4ZWNfaGVhZGVyX2luKTogRG9uJ3QgZGVmaW5lIGlmIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBpcwotCWFscmVhZHkgZGVmaW5lZC4KLQkqIGhwMzAwaHB1eC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIGl0LgotCi1Nb24gQXByIDI2IDEzOjI0OjQzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgdGFyZ2V0cy5jOiBTdXBwb3J0IGZvcgotCUhpdGFjaGkgU0guCi0KLU1vbiBBcHIgMjYgMTM6NTU6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDaGVjayB0aGUgZmlsZSBzaXplLgotCi1Nb24gQXByIDI2IDEzOjI0OjQzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmM6IFJlbW92ZSBkdXBsaWNhdGUgZnVuY3Rpb24gYW5kIGFkZCB3YXJuaW5ncy4KLQotTW9uIEFwciAyNiAxMToyNTo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNjby1jb3JlLmMgKHNjb19jb3JlX3ZlYyk6IEFkZCBpbml0aWFsaXplcnMgZm9yIG5ldyB0YXJnZXQKLQlmaWVsZHMuCi0KLVNhdCBBcHIgMjQgMjE6MzM6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggW19MSVRdOiBSZWNvZ25pemUgLmxpdCBzZWN0aW9uLgotCi1GcmkgQXByIDIzIDE5OjAwOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMsIGNwdS1hbHBoYS5jLCBjb25maWcvYWxwaGFvc2YubXQsCi0JY29uZmlnL2FscGhhb3NmLm10LCBob3N0cy9hbHBoYW9zZi5oOiAgTmV3IGZpbGVzLgotCi1GcmkgQXByIDIzIDE2OjQ4OjQ2IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIE1lcmdlIGluIEhQUEEvQlNEIGNoYW5nZXMgZnJvbSBVdGFoLgotCSogaHBwYS5jOiAgVXNlIHRoaXMgZm9yIGJvdGggSFBVWCAmIEJTRC4KLQkqIHRhcmdldHMuYzogIEVuYWJsZSBocHBhX3ZlYyBmb3IgYm90aCBIUFVYICYgQlNELgotCSogY29uZmlnL2hwcGFic2QubXQ6ICBUREVGSU5FUyA9PiBUREVGQVVMVFMuCi0JKiBob3N0cy9ocHBhYnNkLmg6ICAjZGVmaW5lIEhPU1RfSFBQQUJTRC4KLQotV2VkIEFwciAyMSAwMTo1MDoxMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmM6ICBXaGl0ZXNwYWNlIGNoYW5nZXMgYXJvdW5kIGJ5dGVzd2FwIG1hY3Jvcy4KLQkqIGxpYmJmZC1pbi5oOiAgV2hpdGVzcGFjZSBjaGFuZ2VzIGFyb3VuZCBieXRlc3dhcCBkZWNsYXJhdGlvbnMuCi0KLVR1ZSBBcHIgMjAgMTU6NTk6MDcgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBEb24ndCBkZWZhdWx0IGJmZF9lcnJvciB0bwotCXN5c3RlbV9lcnJvciBhbnltb3JlLiAgSXQgY29uZnVzZXMgYmZkX2NoZWNrX2Zvcm1hdCgpLgotCi1Nb24gQXByIDE5IDIzOjAzOjA4IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgQWRkIHNnaV9jb3JlX2RhdGEgdG8gdGRhdGEgdW5pb24uCi0JKiBjb2ZmLW1pcHMuYzogIEFkZCBJcml4IDQueCBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL2lyaXg0Lmg6ICAjZGVmaW5lIEhPU1RfSVJJWDQuCi0KLU1vbiBBcHIgMTkgMTg6NTI6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBDaGVjayB0aGF0IHRoZQotCXN5bWJvbCdzIHNlY3Rpb24gZG9lcyBnZXQgc2V0LgotCShzbHVycF9zeW1ib2xfdGFibGUpOiBaZXJvIGluZGV4IG1lYW5zIG51bGwtc3RyaW5nIG5hbWUuCi0KLQkqIGFvdXR4LmggKHN0cnVjdCBzdHJpbmd0YWJfZW50cnksIHN0cnVjdCBzdHJpbmd0YWJfZGF0YSk6IE5ldwotCWRhdGEgc3RydWN0dXJlcy4KLQkoaGFzaCwgc3RyaW5ndGFiX2luaXQsIGFkZF90b19zdHJpbmd0YWIsIGVtaXRfc3RydGFiLCBjb21wYXJlKToKLQlOZXcgZnVuY3Rpb25zLgotCSh3cml0ZV9zeW1zKTogVXNlIHRoZW0sIHRvIHJlZHVjZSBzdHJpbmcgdGFibGUgc2l6ZS4KLQotTW9uIEFwciAxOSAxNjo0NToxMiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfY29yZV92ZWMpOiAgQWRkIDYgbmV3IGluaXRpYWxpemVycyB0byBtYXRjaAotCSAgbmV3IHNpZ25lZCBnZXQvcHV0IGZpZWxkcy4gIE1pbm9yIHJlZm9ybWF0dGluZyB0byBsYWJlbAotCSAgc29tZSBmaWVsZHMuCi0KLU1vbiBBcHIgMTkgMDY6MDk6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiBJbnNlcnQgY29tbWVudCBhYm91dCBTVlIzIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBob3N0cy97aHAzMDAsaTM4NmlzYyxpMzg2dn0uaDogUmVtb3ZlIHVudXNlZCAjZGVmaW5lcyBvZiB7cix9aW5kZXgKLQkoYmZkIHVzZXMgc3RyY2hyIGFuZCB0aGUgYnJva2VuIFNWUjMuMiBjcHAgbG9zZXMgd2l0aCB0aGUgZGVmaW5lcykuCi0KLQkqIGxpYmJmZC5jOiBiZmRfcHV0KjogUmVtb3ZlIGNhc3RzIHRvIGJmZF92bWEuCi0KLUZyaSBBcHIgMTYgMTc6NDk6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChpbnRlcm5hbF9zdW5vc19jb3JlKTogTWFrZSBjX3N0YWNrdG9wIGEgYmZkX3ZtYS4KLQkoc3dhcGNvcmVfc3BhcmMpOiBNYWtlIHNwIGEgYmZkX3ZtYS4KLQotVGh1IEFwciAxNSAwOTowOToxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmM6IEFkZCBzaWduZWQgdmVyc2lvbnMgb2YgYmZkX3toXyx9e2dldCxwdXR9X3NpZ25lZF88c2l6ZT4uCi0JbGliYmZkLmMsIGxpYmJmZC1pbi5oOiBBZGQgX2RvKnNpZ25lZCouCi0JdGFyZ2V0cy5jLCBhbGwgdGFyZ2V0czogQWRkIGJmZCpzaWduZWQqLgotCWJmZC1pbi5oOiBBZGQgYmZkX3NpZ25lZF92bWEuICBBZGQgY29tbWVudHMuCi0KLQkqIGJmZC1pbi5oIChiZmRfZXJyb3IpLCBiZmQuYyAoYmZkX2Vycm1zZ3MpOiBBZGQgZmlsZV90cnVuY2F0ZWQuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZXJyb3IpOiBDaGVjayBlcnJvciByZXR1cm4gZnJvbQotCV9iZmRfY2hlY2tfZm9ybWF0IHJvdXRpbmVzLgotCi1XZWQgQXByIDE0IDIzOjQ4OjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6IEltcHJvdmUgZXJyb3IgY2hlY2tpbmcgYW5kCi0JcmVjb2duaXplIC5kYXRhIHNlY3Rpb24gaWYgcHJlc2VudC4KLQotVGh1IEFwciAxNSAwMTowMDoyOSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF8qX2FkanVzdF9zaXplc19hbmRfdm1hcyk6ICBBdm9pZCBgc2FuaXR5JwotCWNoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciBzZXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBCU1MKLQlzZWN0aW9uIChhbmQgdGhlIGZpbGUgaGVhZGVyIGNhbid0IHNwZWNpZnkgdGhpcykuICBMZXQgdGhlIHVzZXIKLQlzZXQgaXQgd2hlcmV2ZXIgdGhleSB3YW50LCByZWdhcmRsZXNzIG9mIHdoYXQgZ29lcyBpbiB0aGUgaGVhZGVyLgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbnMpOiAgUGFzcyBhbGwgaWVlZSBzZWN0aW9uIG5hbWVzCi0Jc3RyYWlnaHQgdGhyb3VnaCBpbnRvIEJGRCBzZWN0aW9ucy4gIEFkZCBjb21tZW50cy4KLQotV2VkIEFwciAxNCAyMDozNDo1NCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNsZWFudXAgaW4gcHJlcGFyYXRpb24gZm9yIGJldHRlciA2NC1iaXQgaG9zdCBzdXBwb3J0LgotCi0JKiBiZmQtaW4uaCAoYmZkXzY0X3R5cGUpOiAgUmVtb3ZlLgotCSogbGliYmZkLmMgKF9kb19nZXRiNjQsIF9kb19wdXRiNjQpOiAgVXNlIGJmZF92bWEsIG5vdCBiZmRfNjRfdHlwZS4KLQotCSogYmZkLWluLmggKGJmZF9zaXplKTogIFJlbW92ZS4KLQotCSogYmZkLWluLmggKGJmZF9vZmZzZXQpOiAgUmVtb3ZlLCBhZnRlciBmaXhpbmcgbGQvbGRsYW5nLltjaF0uCi0KLQkqIGJmZC1pbi5oIChiZmRfd29yZCk6ICBSZW1vdmUuCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b190eXBlKTogIFJlcGxhY2UgYmZkX3dvcmQgd2l0aCBiZmRfdm1hLgotCi0JKiBiZmQtaW4uaCAocmF3ZGF0YV9vZmZzZXQpOiAgUmVtb3ZlLgotCSogcmVsb2MuYyAoYXJlbGVudCk6ICBSZXBsYWNlIHJhd2RhdGFfb2Zmc2V0IHdpdGggYmZkX3NpemVfdHlwZS4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBMaW50LgotCShlbnVtIGJmZF9yZWxvY19zdGF0dXMpOiAgQ29tbWVudCBjbGVhbnVwLgotCi0JKiBhb3V0LWFkb2JlLmMsIGNwdS1oODMwMC5jLCBtaXBzYnNkLmMsIHNyZWMuYzogbGludCAtV2FsbC4KLQotVHVlIEFwciAxMyAxMToxOTo1MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN3YXBjb3JlX3NwYXJjKTogR3Vlc3MgdGhlIHJpZ2h0IHZhbHVlIG9mIFVTUlNUQUNLLgotCi1Nb24gQXByIDEyIDE0OjE4OjAwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBlbGYzMi5jOiAgQ2xlYW4gdXAgb2xkIGNvbW1lbnRzLgotCi1GcmkgQXByICA5IDEwOjQzOjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N1bjMuaDogU3RyaW5nIGFyZ3VtZW50IHRvIGZwcmludGYgaXMgY29uc3QuCi0KLQkqIGNvZmYtbWlwcy5jOiBSZW5hbWVkIFBBR0VfU0laRSB0byBST1VORF9TSVpFLCB0byBhdm9pZCBjb25mdXNpb24KLQlvbiBzeXN0ZW1zIHdoaWNoIGRlZmluZSBQQUdFX1NJWkUgaW4gPGxpbWl0cy5oPi4KLQotVGh1IEFwciAgOCAxMDoyODowMCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogVXNlIG5ldyBtYWNybwotCVRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwgdG8gYWxsb3cgaG9zdCBmaWxlcyB0byBzcGVjaWZ5Ci0JdGhlIGNvcmUgZmlsZSBmYWlsaW5nIHNpZ25hbC4KLQkqIGhvc3RzL2RlY3N0YXRpb24uaCAoVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTCk6IERlZmluZQotCXRvIHN1cHBseSB0aGUgY29yZSBmaWxlIGZhaWxpbmcgc2lnbmFsLgotCi1UaHUgQXByICA4IDA5OjE3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBPbmx5IHNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yCi0JYSBTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24gaWYgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQotCWlzIGRlZmluZWQuICBPbiBtYW55IENPRkYgdGFyZ2V0cyBTVFlQX0JTUyBpcyBhbHdheXMgU1RZUF9OT0xPQUQuCi0JKiBjb2ZmLWkzODYuaCAoQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWSk6IERlZmluZS4KLQotV2VkIEFwciAgNyAxMTozMzowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChQQUdFU0laRSk6IENvcnJlY3QgdmFsdWUuCi0KLVR1ZSBBcHIgIDYgMTI6MDU6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBBZGRyZXNzIG9mIGZpcnN0IFBEUiBpcwotCWFuIG9mZnNldCAocGF0Y2ggZnJvbSBKZWFuLURhbmllbCBGZWtldGUgPGpkZkBscmkubHJpLmZyPikuCi0KLU1vbiBBcHIgIDUgMTI6MDc6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IFNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yIGEKLQlTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24uICBEb24ndCBzZXQgU0VDX05FVkVSX0xPQUQgZm9yIGEKLQlTVFlQX0lORk8gc2VjdGlvbi4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3JjZSB2bWEgYW5kIGxtYSBvZiBfTElCCi0Jc2VjdGlvbiB0byBiZSB6ZXJvLgotCShjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ291bnQgbnVtYmVyIG9mIGVudHJpZXMgaW4gbmV3IGxtYQotCWZpZWxkLCBub3QgaW4gdm1hLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBGb3JjZSBsaW5lbm9fY291bnQgb2YKLQlTRUNfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbiB0byBiZSB6ZXJvLCBzaW5jZSBpdCBpcyBub24temVybyBvbiB0aGUKLQlTQ08gMy4ydjQgc2hhcmVkIGxpYnJhcnkuCi0JKiBzZWNsZXQuYyAocmVsKTogQ29weSBvdmVyIGFueSBzZWN0aW9uIHdpdGggY29udGVudHMsIG5vdCBqdXN0Ci0JbG9hZGFibGUgc2VjdGlvbnMuCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9tYWtlX2VtcHR5X3N5bWJvbCk6IFplcm8gb3V0IG5ld2x5IGFsbG9jYXRlZAotCXN5bWJvbC4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IE5ldyBmdW5jdGlvbiwgdG8gZ2VuZXJhdGUKLQlyZWxvY2F0ZWFibGUgb3V0cHV0IGNvcnJlY3RseS4KLQkoaG93dG9fdGFibGUpOiBVc2UgY29mZl9pMzg2X3JlbG9jIGZvciBhbGwgcmVsb2MgdHlwZXMuCi0JKENBTENfQURERU5EKTogVXNlIGEgbW9yZSBlZmZpY2llbnQgaGFjayB0byBnZXQgdGhlIGNvcnJlY3QgYWRkZW5kCi0JZm9yIGEgY29tbW9uIHN5bWJvbC4KLQkoaTM4NmNvbW1fdmFsdWUpOiBSZW1vdmVkOyBubyBsb25nZXIgbmVlZGVkLgotCi1TdW4gQXByICA0IDE1OjA4OjQ4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3Qgd3JpdGUgb3V0Ci0Jc2VjdGlvbnMgd2l0aG91dCBhIGZpbGVwb3MuCi0KLUZyaSBBcHIgIDIgMTQ6MzU6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzZWNsZXQuYyAoc2VjbGV0X2R1bXBfc2VjbGV0KTogQ29ycmVjdCBTRUNfSEFTX0NPTlRFTlRTIHRlc3QuCi0KLVdlZCBNYXIgMzEgMTc6NDE6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGRlZCBCRkRfUkVMT0NfTUlQU19HUFJFTC4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZGVkIGdwX3NpemUgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgZ3Bfc2l6ZSB0byA4LgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDb21wYXJlIGFnYWluc3QgZ3Bfc2l6ZSwgbm90IGhhcmRjb2RlZCA4LgotCVNldCBmbGFncyB0byAwIGZvciBsYXJnZSBjb21tb24gc3ltYm9scy4KLQkoZWNvZmZfZ3ByZWxfcmVsb2MpOiBIYW5kbGUgbm9uLXplcm8gYWRkZW5kIGZvciBleHRlcm5hbCBzeW1ib2xzLAotCXdoaWNoIGNhbiBvY2N1ciBmb3IgZ2FzLWdlbmVyYXRlZCByZWxvY3MuCi0JKGVjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZGVkIEJGRF9SRUxPQ19NSVBTX0dQUkVMIGNhc2UuCi0JKiBiZmQuYyAoYmZkX2dldF9ncF9zaXplLCBiZmRfc2V0X2dwX3NpemUpOiBOZXcgZnVuY3Rpb25zLgotCSogTWFrZWZpbGUuaW4gKGJmZC5vKTogTm93IGRlcGVuZHMgb24gY29mZi9zeW0uaCBhbmQgbGliZWNvZmYuaC4KLQotVHVlIE1hciAzMCAwOTozMzoxNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlIGxtYSBmaWVsZCBmb3IgbG9hZAotCWFkZHJlc3MuCi0JKiBzZWN0aW9uLmM6IEFkZCBkZWNsYXJhdGlvbiBvZiBsbWEgZmllbGQgdG8gc2VjdGlvbiBzdHJ1Y3R1cmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBsbWEgZmllbGQgZm9yIGxvYWQKLQlhZGRyZXNzLgotCSogYmZkLWluLmggKGJmZF9zZXRfc2VjdGlvbl92bWEpOiBTZXQgbG1hIGFsb25nIHdpdGggdm1hLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogTm93IGhhbmRsZXMgaW5kaXJlY3QKLQlzeW1ib2xzIGluIGEgYmV0dGVyIHdheS4gKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWcpOiBTZXQgdGhlCi0JTl9JTkRSIGJpdCB3aGVuIG5lY2Vzc2FyeS4gKGFvdXQ8PnNsdXJwX3N5bWJvbF90YWJsZSk6IE1haW50YWluCi0JaW5kaXJlY3Qgc3RhdGUuCi0JKiBzZWN0aW9uLmM6IEFkZGVkIEJGRF9JTkRfU0VDVElPTl9OQU1FIGFuZCBiZmRfaW5kX3NlY3Rpb24uCi0JKGJmZF9tYWtlX3NlY3Rpb24pOiBDb3BlIHdpdGggbmV3IGJ1aWx0aW4gc2VjdGlvbi4KLQkqIHN5bXMuYyAoYmZkX2RlY29kZV9zeW1jbGFzcyk6IENhbiBub3cgcHJpbnQgaW5kaXJlY3Qgc2VjdGlvbgotCWluZm8uCi0KLVdlZCBNYXIgMjQgMTM6MzY6MzMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChNWShvYmplY3RfcCkpOiAgRmFpbCBpZiBNQUNIVFlQRV9PSyBpcwotCWRlZmluZWQsIGFuZCB5aWVsZHMgZmFsc2UuCi0JKiBhb3V0LW1pcHNic2QuYywgaTM4NmJzZC5jOiAgRGVmaW5lIE1BQ0hUWVBFX09LIGFwcHJvcHJpYXRlbHkuCi0KLQkqIGFyY2hpdmUuYyAoc25hcmZfYXJfaGRyKTogIEFkZCBzdXBwb3J0IGZvciByZWFkaW5nIChvbmx5LAotCXNvIGZhcikgQlNELTQuNC1zdHlsZSBleHRlbmRlZCBoZWFkZXJzLgotCSogYXJjaGl2ZS5jOiAgU29tZSBtb3JlIGNvbW1lbnRzLgotCi1XZWQgTWFyIDI0IDAyOjA1OjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IHJ1bGUgZm9yIGR2aSBhbmQgaW5mbywgc28gdGhhdCB0aGUgcmVjdXJzaXZlCi0JbWFrZXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcsIGluc3RlYWQgb2YgYWx3YXlzIGluZm8KLQotV2VkIE1hciAyNCAwMjo1Njo0NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IERpc2FibGUgb3B0aW1pemVkIGhhbmRsaW5nIGZvciBhcmNoaXZlcyBhbmQKLQlhcmNoaXZlIG1lbWJlcnM7IHRoZXkgbmVlZCBtb3JlIHNwZWNpYWwgcmVhdG1lbnQuICBGb3Igbm93LCB2ZXJpZnkKLQl0aGF0IGNvbXB1dGVkIGFuZCBhY3R1YWwgZmlsZSBwb3NpdGlvbnMgY29ycmVzcG9uZC4KLQotVHVlIE1hciAyMyAwODo0NTozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1pcHNic2QuYzogUmVuYW1lZCBmcm9tIGFvdXQtbWlwc2JzZC5jLgotCShzZXRfYXJjaF9tYWNoKTogRGVsZXRlIG5vbi1NSVBTIGNvZGUuCi0JKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKiBNYWtlZmlsZS5pbjogQWRqdXN0ZWQuCi0KLQkqIGxpYmJmZC5jIChiZmRfdGVsbCk6IFVwZGF0ZSBgd2hlcmUnIGZpZWxkLgotCShiZmRfc2Vlayk6IERvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgZmlsZQotCXBvc2l0aW9uLiAgSWYgRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWCBpcyBkZWZpbmVkLCBjaGVjayBgd2hlcmUnCi0JZmllbGQgYWdhaW5zdCBhIFNFRUtfU0VUIHJlcXVlc3QuICBDYWxsIGJmZF90ZWxsIHRvIHJlLXVwZGF0ZQotCWB3aGVyZScgZmllbGQgd2hlbiBkb25lLgotCShiZmRfcmVhZCwgYmZkX3dyaXRlKSBbRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWF06IE1haW50YWluCi0JYHdoZXJlJyBmaWVsZC4KLQkqIGhvc3RzL3NwYXJjLmg6IERlZmluZSBGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYLgotCi1Nb24gTWFyIDIyIDIzOjE4OjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGluc3RhbGxjaGVjayB0YXJnZXQKLQotTW9uIE1hciAyMiAxNDo1NzoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBSZWxvY2F0ZSBlbmNhcHN1bGF0ZWQgc3RhYnMKLQlpZiB0aGUgdHlwZSBpcyBub3Qgc3ROaWwuCi0KLVR1ZSBNYXIgMTYgMTA6MzU6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLmMgKGVsZl9saXR0bGVfdmVjLCBlbGZfYmlnX3ZlYyk6IERlbGV0ZSBub3ctaW52YWxpZAotCWZvcndhcmQgZGVjbGFyYXRpb25zLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBEb24ndCB1c2UgQ09OU1QgaGVyZSwKLQlpdCdzIGltcGxpZWQgYnkgdGhlIHR5cGUuCi0KLUZyaSBNYXIgMTIgMTg6NTg6MDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogcmVjb2duaXplIHNwYXJjLXN1bi1zb2xhcmlzMiogaW5zdGVhZCBvZiBzcGFyYy1zdW4tc29sYXJpcyoKLQotVHVlIE1hciAgOSAwOToyMzoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLWNvcmUuYzogQWRkIC5sZGluZm8gc2VjdGlvbi4KLQotRnJpIE1hciAxMiAxMTo1Nzo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCi1GcmkgTWFyIDEyIDA4OjMyOjExIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IHdoaXRlc3BhY2UKLQkqIHNlY2xldC5jIChzZWNsZXRfZHVtcF9zZWNsZXQpOiBEb24ndCB0cnkgYW5kIGZpbGwgc2VjdGlvbnMgd2l0aAotCW5vIGNvbnRlbnRzLgotCi1UaHUgTWFyIDExIDE5OjI2OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvZ28zMi5oOiBkb24ndCBkZWZpbmUgUE9TSVhfVVRJTUUKLQotVHVlIE1hciAgOSAxMDo1MjowMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmMzIuYyAoZWxmX29iamVjdF9wKTogIFVzZSBFTEZfQVJDSCBzdG9yZWQgaW4geHZlYyB0byBtYXRjaAotCWFnYWluc3QgbWFjaGluZSBhcmNoaXRlY3R1cmUgc3RvcmVkIGluIHRoZSBFTEYgaGVhZGVyLCB0byByZXNvbHZlCi0JYW1iaWd1aXRpZXMuCi0JKiBlbGYzMi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgQmZkX21ha2Vfc2VjdGlvbiBjYW4gcmV0dXJuCi0JTlVMTCwgc28gb25seSB1c2UgcmVzdWx0cyB3aGVuIG5vbi1OVUxMLgotCSogdGFyZ2V0cy5jIChlbGYzMl9tNjhrX3ZlYywgZWxmMzJfaTg2MF92ZWMpOiAgQWRkIGV4dGVybiBkZWNscwotCWFuZCBhZGQgdG8gdmVjdG9yIG9mIHRhcmdldHMuCi0KLU1vbiBNYXIgIDggMTU6MTM6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogRW5jYXBzdWxhdGVkIFNUQUJTIHN5bWJvbHMKLQlhcmUgYWx3YXlzIGp1c3QgZGVidWdnaW5nIHN5bWJvbHMuCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9bZ3NdZXRfc3ltX2luZGV4KTogTW92ZWQgbWFjcm9zIGZyb20gaGVyZS4uLgotCWxpYmVjb2ZmLmggKGVjb2ZmX1tnc11ldF9zeW1faW5kZXgpOiAuLi50byBoZXJlLgotCi1Nb24gTWFyICA4IDE0OjU1OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChfUEFfUklTQ19JRCk6IERlZmluZWQgaWYgbm90IGFscmVhZHkgZGVmaW5lZCAoZS5nLiwgZm9yCi0JaHB1eCA3KS4gIFBhdGNoIGZyb20gZnJpZWRtYW5AZ251LmFpLm1pdC5lZHUuCi0JKGhwcGFfb2JqZWN0X3ApOiBPbmx5IGNoZWNrIGZvciBETF9NQUdJQyBhbmQgU0hMX01BR0lDIGlmIHRoZXkncmUKLQlkZWZpbmVkLCB3aGljaCB0aGV5IGFyZW4ndCBpbiBocHV4IDcuMC4KLQotCSogYWl4Mzg2LWNvcmUuYzogSW5jbHVkZSB1aW5mby5oIGFuZCBjb3JlZHVtcC5oLiAgUGF0Y2ggZnJvbSBNaW5oCi0JVHJhbi1MZSwgdHJhbmxlQGludGVsbGljb3JwLmNvbS4KLQotRnJpIE1hciAgNSAxNDo1NDoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9nZW5lcmljX3JlbG9jKTogSWYgdGhlIGFkZGVuZCBpcyBub24temVybywgZ28KLQlhaGVhZCBhbmQgZG8gdGhlIHJlbG9jYXRpb24uCi0JKGVjb2ZmX3JlZmhpX3JlbG9jKTogRG9uJ3QgdG8gdGhlIHJlbG9jYXRpb24gaGVyZSwganVzdCByZW1lbWJlcgotCXdoYXQgbmVlZHMgdG8gYmUgZG9uZS4KLQkoZWNvZmZfcmVmbG9fcmVsb2MpOiBEbyB0aGUgUkVGSEkgcmVsb2NhdGlvbiBoZXJlLgotCi1UaHUgTWFyICA0IDE0OjQ0OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQWRkZWQgQkZEX0FTU0VSVCBjYWxscyB0byBlbnN1cmUKLQlyZWxvY3MgYXJlIHJlYXNvbmFibGUuCi0JKiBjb2ZmLW1zeW0uYzogRWxpbWluYXRlZCB1c2VzIG9mIERFRlVOLgotCShlY29mZl9zd2FwX3Rpcl9vdXQpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBNYXIgIDIgMTc6NTI6NTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkoVWx0cml4IDIuMiBzdXBwb3J0IGZyb20gTWljaGFlbCBSZW5kZWxsIDxtaWNoYWVsQG1lcmN1cnkuY3MubXVuLmNhPikKLQkqIGNvbmZpZ3VyZS5ob3N0ICh2YXgtKi11bHRyaXgyKik6ICBBZGQgdHJpcGxldC4KLQkqIGhvc3RzL3ZheHVsdDIuaDogIE5ldyBmaWxlLgotCSogY29uZmlnL3ZheHVsdDIubWg6ICBOZXcgZmlsZS4KLQotCSogYW91dHguaCAoc3RyaW5nLmgpOiAgSW5jbHVkZSBmb3Igc3RyY2hyIGFuZCBmcmllbmRzLgotCSogYXJjaGl2ZS5jIChzdHJpbmcuaCk6ICBJbmNsdWRlIGZvciBtZW1jaHIgYW5kIGZyaWVuZHMuCi0JKiBlbGYzMi5jIChzdHJpbmcuaCk6ICBJbmNsdWRlIGZvciBzdHJyY2hyIGFuZCBmcmllbmRzLgotCi1TYXQgRmViIDI3IDAwOjQ0OjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmMgKHN1bm9zNF9yZWxvY190eXBlX2xvb2t1cCk6IFVudXNlZDsgZGVsZXRlZC4KLQkoTVlfc2V0X3NpemVzKTogVXNlIHN1bm9zNF9zZXRfc2l6ZXMuCi0KLQkqIGVsZjMyLmM6IFJlbmFtZWQgZnJvbSBlbGYuYy4gIFNldmVyYWwgQ1BVLXNwZWNpZmljIGZ1bmN0aW9ucwotCWRlbGV0ZWQsIGFzIHdlbGwgYXMgZWxmLWJpZyBhbmQgZWxmLWxpdHRsZSB0YXJnZXRzLgotCSogbGliZWxmLmg6IE5ldyBmaWxlLgotCSogZWxmMzItc3BhcmMuYywgZWxmMzItaTM4Ni5jLCBlbGYzMi1pODYwLmMsIGVsZjMyLW02OGsuYzogTmV3Ci0JZmlsZXMsIG5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy8qLWVsZi5tdCwgdGFyZ2V0cy5jOiBBZGp1c3RlZC4KLQotCSogaTM4NmxpbnV4LmMgKFRBUkdFVE5BTUUpOiBVc2UgaHlwaGVucyBpbnN0ZWFkIG9mIHBhcmVudGhlc2VzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IG5lZWQKLQl2YXJpYWJsZSAib2xkX3NvZmFyIiBpZiBjb21waWxpbmcgZm9yIGk5NjAuCi0KLQkqIHJlbG9jLmMgKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKTogRmlyc3QgYXJndW1lbnQgaXMgbm93IGEKLQliZmQgcG9pbnRlci4KLQkqIGxpYmJmZC5oOiBVcGRhdGVkLgotCi0JKiBpZWVlLmMgKGV4dGVuLCBlbnZpKTogInN0YXRpYyIgYmVsb25ncyBmaXJzdCBpbiBkZWNsYXJhdGlvbi4KLQotRnJpIEZlYiAyNiAxNzozNzozNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jOiBhZGQgc3VwcG9ydCBmb3Igc3ltYm9sc3JlYywgc3JlY29yZHMgd2l0aCBzeW1ib2xzIGluCi0JdGhlbS4KLQotVGh1IEZlYiAyNSAxMTo0MzozMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY2Fjb3Bob255LmN5Z251cy5jb20pCi0KLQkqIGllZWUuYzogIGNhc3QgYWxsIGFyZ3VtZW50cyBvZiBpZWVlX3dyaXRlX2J5dGUgdG8gYmZkX2J5dGUKLQl0byBhdm9pZCBsaW50IGNvbXBsYWludHMuCi0KLVRodSBGZWIgMjUgMDI6MTU6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNlY3Rpb24gIi5zaHN0cnRhYiIgc2hvdWxkIGJlCi0JdHlwZSBTSFRfU1RSVEFCLiAgRG9uJ3QgYWx0ZXIgZmlsZSBvZmZzZXQgZm9yIHNlY3Rpb24gMC4KLQkocmVsb2NfdHlwZV9uYW1lcyk6IE5vdyBhbiBhcnJheSBpbnN0ZWFkIG9mIGEgbWFjcm8uICBTdGlsbCBpbnNpZGUKLQkiI2lmIDAiLCBzaW5jZSBpdCdzIHVzZWQgb25seSBpbiBkZWJ1Z2dpbmcgY29kZSBhbHNvIGluICIjaWYgMCIuCi0JKHN0cnVjdCBlbGZfcmVsb2NfbWFwX2VsdCwgc3RydWN0IGVsZl9yZWxvY19tYXApOiBOZXcgdHlwZXMuCi0JKHNvcnRfcmVsb2NfbWFwKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19yZWxvY19tYXApOiBOZXcgdmFyaWFibGUuCi0JKGVsZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBGZWIgMjMgMTI6MTc6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZGVkIGJmZF9yZWxvY190eXBlX2xvb2t1cCBhbmQKLQliZmRfbWFrZV9kZWJ1Z19zeW1ib2w7IHRoZXkgd2VyZSBhbHJlYWR5IGluIHRoZSB0YXJnZXQgc3RydWN0dXJlLgotCSogQWRqdXN0ZWQgYWxsIHVzZXMgb2YgSlVNUF9UQUJMRS4KLQkqIGNvZmZnZW4uYywgbGliY29mZi1pbi5oIChjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IFJlbmFtZWQKLQlmcm9tIGNvZmZfbWFrZV9kZWJ1Z19zeW1ib2wuCi0JKiBsaWJjb2ZmLmg6IFVwZGF0ZWQgYWNjb3JkaW5nbHkuCi0KLQkqIE1pbm9yIGNsZWFudXBzIHByb3Zva2VkIGJ5IGdjYyB3YXJuaW5nczoKLQkqIGFvdXR4LmggKE5BTUUoYW91dCwgcmVsb2NfdHlwZV9sb29rdXApKSwKLQljcHUtaDgzMDAuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwKSwKLQljcHUtejhrLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZGVkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaGVzLgotCSogYXJjaGl2ZS5jIChkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApLAotCWllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpLAotCWVsZi5jIChlbGZfbWFrZV9zZWN0aW9ucywgZWxmX2Zha2Vfc2VjdGlvbnMsCi0JZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywgZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6Ci0JUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzLgotCSogYXJjaHVyZXMuYzogUmVtb3ZlZCAvKiBmcm9tIHdpdGhpbiBjb21tZW50LgotCSogYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IEluaXRpYWxpemUgcl9leHRlcm4uCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9kYXRhKTogSW5pdGlhbGl6ZSBpLgotCi1Nb24gRmViIDIyIDE4OjQwOjA2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGliY29mZi5oIChvYmpfcmF3X3N5bWVudF9jb3VuKTogIE5ldyBtYWNyby4KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiAgSW5pdGlhbGl6ZQotCXJhd19zeW1lbnRfY291bnQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiAgTnVtZXJvdXMgbGl0dGxlIGZpeGVzLgotCi1Nb24gRmViIDIyIDE1OjAzOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IHN0QmxvY2sgc3ltYm9scyBhcmUgYWx3YXlzCi0JZGVidWdnaW5nIHN5bWJvbHMuCi0JKGVjb2ZmX2dldF9kZWJ1Zyk6IE9mZnNldCB0aGUgZmRyIGFkciBieSB0aGUgYWRyIG9mIHRoZSBmaXJzdCBwZHIsCi0JZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0b29scyBmcm9tIE1JUFMuCi0KLQkqIGNvbmZpZy9iaWdtaXBzLm10OiBOZXcgZmlsZTsgZGVmYXVsdCB2ZWN0b3IgaXMgZWNvZmZfYmlnX3ZlYy4KLQkqIGNvbmZpZy9pcml4My5tdCwgY29uZmlnL2lyaXg0Lm10OiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChtaXBzLSotZWNvZmYpOiBOZXcgdGFyZ2V0OyB1c2VzIGJpZ21pcHMubXQuCi0JKG1pcHMtc2dpLSosIG1pcHMtYmlnLSopOiBVc2UgYmlnbWlwcyByYXRoZXIgdGhhbiBpcml4My4KLQotV2VkIEZlYiAxNyAyMzo0MDo0MSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaHAzMDBic2QuaDogIEFkZCBncm9zcyBoYWNrIHRvIGRldGVybWluZSB3aGV0aGVyIHdlCi0JYXJlIHJ1bm5pbmcgb24gQlNEIDQuMyBvciBCU0QgNC40LCBhbmQgdXNlIGFwcHJvcHJpYXRlIGluY2x1ZGUKLQlmaWxlcyAoYW5kIHNldCBvdGhlciBwYXJhbWV0ZXJzKSB0byBtYXRjaC4KLQotV2VkIEZlYiAxNyAxMjoyODoxMyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9tYWtlX2VtcHR5X3N5bWJvbCk6IHdyYXAgUEFSQU1TIGFyb3VuZCBhbgotCSAgYW5zaSBkZWZpbml0aW9uIHdoaWNoIG90aGVyd2lzZSBjb25mdXNlcyBub24tYW5zaSBjb21waWxlcnMuCi0KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9vYmplY3RfcCk6IGVsaW1pbmF0ZSBhIHdhcm5pbmcgZnJvbSB2YXgKLQkgIHVsdHJpeCBjYyBieSBmb3J3YXJkIGRlY2xhcmluZyBnZXRlbnYgYXMgaXMgZG9uZSBpbgotCSAgYmZkX2ZpbmRfdGFyZ2V0LgotCi1UdWUgRmViIDE2IDE3OjU2OjU4IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX2luZm9fdG9faG93dG8pOiBjYXN0IGFuIGVudW0gaW50byB1bnNpZ25lZCBjaGFyCi0JICBhdm9pZGluZyBhIGZhdGFsIGVycm9yIGluIHZheCB1bHRyaXggNC4yIGNjLgotCi1UdWUgRmViIDE2IDAwOjQ0OjU0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCwgVkVSU0lPTjogIFJvbGwgdG8gdmVyc2lvbiAyLjEuCi0KLU1vbiBGZWIgMTUgMjA6NDM6NTEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBMaW50LgotCSogc3JlYy5jOiAgV2hpdGVzcGFjZSBjbGVhbnVwLgotCi1GcmkgRmViIDEyIDE0OjIzOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IFByaW50IGNvcnJlY3QgdGFnbmR4IHZhbHVlOwotCWNsZWFuZWQgdXAgb3V0cHV0IGZvcm1hdHRpbmcgYSBiaXQuCi0KLUZyaSBGZWIgMTIgMDg6Mjg6NTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogKkZJWE1FKiB0aGUgSDgvMzAwIGlzIGFsd2F5cwotCXJlbGF4YWJsZS4gIFNob3VsZCBiZSBtb3ZlZCBzb21ld2hlcmUgZWxzZS4KLQotVGh1IEZlYiAxMSAxNDowOTo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtbWlwc2JzZC5jOiBFbGltaW5hdGVkIHVzZXMgb2YgREVGVU4uCi0JKGFvdXRfbWlwc18qX3ZlYyk6IEFkZGVkIHNlY2xldF9saW5rIGVsZW1lbnQuCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfQkFDS0VORFMsIENGSUxFUywgYW91dC1taXBzYnNkLm8pOiBBZGRlZAotCXN1cHBvcnQgZm9yIGFvdXQtbWlwc2JzZCB0YXJnZXQuCi0KLQkqIGJvdXQuYyAoZ2V0X3ZhbHVlKTogRG9uJ3QgdHJ1bmNhdGUgMzItYml0IGFkZGVuZCB0byAxNiBiaXRzLgotCi1GcmkgRmViICA1IDA4OjA4OjQzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjcHUtaDg1MDAuYyAoc2Nhbl9tYWNoKTogcmV0dXJuIGZhbHNlIGlmIGl0J3Mgbm90IGFuIEg4LzUwMAotCi1UaHUgRmViICA0IDEyOjUyOjQwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JQWRkIHN1cHBvcnQgZm9yIHRoZSBIOC81MDAKLQotCSogY29mZi1oODUwMC5jLCBjcHUtaDg1MDAuYywgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgdGFyZ2V0cy5jCi0KLVRodSBGZWIgIDQgMTI6MzU6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaWJlY29mZi5oOiBOZXcgZmlsZS4gIERlZmluZXMgRUNPRkYgYmFja2VuZCBkYXRhIGZvciBnZGIuCi0JKiBjb2ZmLW1pcHMuYzogTm93IGluY2x1ZGVzIGxpYmVjb2ZmLmguCi0JKGVjb2ZmX2RhdGFfdHlwZSk6IE1vdmVkIHRvIGxpYmVjb2ZmLmguCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBNYWRlIGdsb2JhbGx5IHZpc2libGUgc28gdGhhdCBnZGIgY2FuCi0JY2FsbCBpdC4gIElmIHRoZXJlIGlzIGV2ZXIgYW5vdGhlciBFQ09GRiB0YXJnZXQsIHRoaXMgYW5kIHRoZQotCXN3YXBwaW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgYWNjZXNzZWQgdmlhIGFuIEVDT0ZGIHNwZWNpZmljIHRhcmdldAotCXZlY3Rvci4KLQkqIE1ha2VmaWxlLmluIChjb2ZmLW1pcHMubyk6IERlcGVuZHMgb24gbGliZWNvZmYuaC4KLQotV2VkIEZlYiAgMyAwOToxNDozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IFJlbW92ZWQgTUlQUyBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgc2luY2UgY29mZi1taXBzLmMKLQlubyBsb25nZXIgaW5jbHVkZXMgdGhpcyBmaWxlLgotCi0JKiBjb2ZmLW1zeW0uYyAoZWNvZmZfc3dhcF9mZHJfaW4sIGVjb2ZmX3N3YXBfZXh0X2luKTogU2V0IHJlc2VydmVkCi0JYml0cyB0byAwIHRvIG1ha2UgY29tcGFyaXNvbiB0ZXN0IHVzZWZ1bC4KLQotCSogY29uZmlnL2lyaXgzLm1oLCBjb25maWcvaXJpeDQubWggKEhERUZJTkVTKTogU2V0IHRvIC1HIDQgdG8KLQlhdm9pZCBvdmVyZmxvd2luZyBHUCBhY2Nlc3NpYmxlIHNlY3Rpb25zIGluIGJpbnV0aWxzL29iamR1bXAuCi0KLVR1ZSBGZWIgIDIgMTU6MzY6NTUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogIE1hZGUgc3ltYm9sCi0JcmVhZGluZyBtb3JlIHJvYnVzdDogIEZhaWwgaWYgc3RyaW5nIGluZGV4IGlzIG91dCBvZiBzdHJpbmcKLQl0YWJsZSByYW5nZS4KLQotVHVlIEZlYiAgMiAxMTo0MzoyNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlcyBQQ1JFTDI0IGFuZAotCVBDUkVMMTMpOiBEb24ndCB0YWtlIGRzdF9hZGRyZXNzIGludG8gYWNjb3VudDsgdGhlIGlucHV0IGZpbGUgaGFzCi0JYWxyZWFkeSB0YWtlbiBjYXJlIG9mIHRoYXQuCi0KLVR1ZSBGZWIgIDIgMTE6NDE6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYzogQ29tcGxldGVkIHN1cHBvcnQgZm9yIGxpbmtlciBhbmQgYmludXRpbHMuCi0KLU1vbiBGZWIgIDEgMTQ6NDU6MzggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgY2FzZSBBQlMzMik6IEtlZXAKLQlvcmlnaW5hbCBhZGRlbmQgZnJvbSBzZWN0aW9uIGNvbnRlbnRzLgotCi1UaHUgSmFuIDI4IDIxOjAxOjM3IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JRml4IG1pbm9yIGJ1Z3MgcmVwb3J0ZWQgYnkgQ2FybCBHcmVjbywgPGNncmVjb0BwYXJyb3QuY3JlaWdodG9uLmVkdT46Ci0JKiBob3N0cy9kZWx0YTg4LmggKHN0cnRvbCk6ICBGaXggcHJvdG90eXBlLgotCSogY29uZmlnL204OGstY29mZi5tdCAoU0VMRUNUX0FSQ0hJVEVDVFVSRVMpOiAgRml4IG5hbWUuCi0KLVdlZCBKYW4gMjcgMTc6MTY6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYuYzogR2V0IHJpZCBvZiAiI2lmZGVmIHNwYXJjIi4KLQkoUkVMT0NfVFlQRV9OQU1FUyk6IE5ldmVyIHVzZWQgKGN1cnJlbnRseSksIHNvIGRvbid0IGluY2x1ZGUgaXQuCi0JKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IFJlbmFtZWQgZnJvbSBlbGZfaG93dG9fdGFibGUsIGFuZCBhbHdheXMKLQl1c2VkLgotCShlbGZfaW5mb190b19ob3d0byk6IFVzZSBydW50aW1lIGNvbmRpdGlvbmFscyBvbiBDUFUgdHlwZSwgbm90Ci0JY29tcGlsZSB0eXBlIGNvbmRpdGlvbmFscyBvbiBob3N0IENQVS4KLQkoZWxmX2xpdHRsZV92ZWMsIGVsZl9iaWdfdmVjKTogVXNlIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwLAotCW5vdCBudWxsIHBvaW50ZXIuCi0JKHJlbG9jX3R5cGUsIFJFTE9DX1RZUEVfTkFNRVMpOiBJbmNsdWRlIGkzODYgdmFsdWVzLgotCi1UdWUgSmFuIDI2IDExOjQzOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTRUNfSVNfQ09NTU9OKTogTmV3IHNlY3Rpb24gZmxhZywgbmVlZGVkIGZvciBNSVBTCi0JRUNPRkYgd2hpY2ggaGFzIHR3byBjb21tb24gc2VjdGlvbnMuCi0JKGJmZF9jb21fc2VjdGlvbik6IFNldCBTRUNfSVNfQ09NTU9OIGZsYWcuCi0JKiBiZmQtaW4uaCAoYmZkX2lzX2NvbV9zZWN0aW9uKTogTmV3IG1hY3JvIHRvIHRlc3QgU0VDX0lTX0NPTU1PTi4KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYm91dC5jLCBjb2ZmLWEyOWsuYywgY29mZi1tODhrLmMsCi0JY29mZi1taXBzLmMsIGNvZmZnZW4uYywgaWVlZS5jLCBvYXN5cy5jLCByZWxvYy5jLCBzeW1zLjogVXNlCi0JYmZkX2lzX2NvbV9zZWN0aW9uIG1hY3JvIHJhdGhlciB0aGFuIGNoZWNraW5nIGZvciBlcXVhbGl0eSB0bwotCWJmZF9jb21fc2VjdGlvbi4KLQotTW9uIEphbiAyNSAxNToyNzozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKF9iZmRfY29mZl9ta29iamVjdF9ob29rKTogUGFzcyBhb3V0aGRyIGFyZ3VtZW50LgotCShjb2ZmX21rb2JqZWN0X2hvb2spOiBBY2NlcHQgYW91dGhkciBhcmd1bWVudC4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogUGFzcyBhb3V0aGRyIHRvIG1rb2JqZWN0X2hvb2suCi0JSGFuZGxlIE5VTEwgYW91dGhkciBhcmd1bWVudC4KLQkoY29mZl9vYmplY3RfcCk6IElmIHRoZXJlIGlzIG5vIGFvdXRoZHIsIHBhc3MgaXQgYXMgTlVMTCB0bwotCWNvZmZfcmVhbF9vYmplY3RfcC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdCBmb3IgbWtvYmplY3RfaG9vayBjaGFuZ2VzLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbiwgY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBTd2FwCi0JYWRkaXRpb25hbCBNSVBTIEVDT0ZGIGZpZWxkcy4KLQotU2F0IEphbiAyMyAxODozNjoyMCBQU1QgMTk5MyAgUmFscGggQ2FtcGJlbGwgIChyYWxwaGNAcHlyYW1pZC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBhZGRlZCBtaXBzLWRlYy1ic2QqCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIG1pcHMtZGVjLWJzZCoKLQkqIGFvdXQtbWlwc2JzZC5jOiBuZXcgZmlsZSBmb3IgbWlwcy1kZWMtYnNkKgotCSogYW91dC10YXJnZXQuaDogZG9uJ3QgZGVmaW5lICcnIGlmICdNWV9CRkRfVEFSR0VUJyBpcyBkZWZpbmVkLgotCSogYW91dHguaDogYWRkZWQgbWlwcyBzdXBwb3J0LgotCSogYXJjaHVyZXMuYzogYWRkZWQgbWlwcyBzdXBwb3J0IHRvIGJmZF9kZWZhdWx0X3NjYW4oKS4KLQkqIGNwdS1taXBzLmM6IGFkZGVkIHN1cHBvcnQgZm9yIFI0MDAwICh1bnRlc3RlZCkuCi0JKiBsaWJhb3V0Lmg6IGFkZGVkIE1JUFMxICYgTUlQUzIgbWFnaWMgbnVtYmVycy4KLQkqIHJlbG9jLmM6IGZpeCB0eXBvJ3MgaW4gY29tbWVudHMuIEFkZGVkIEJGRF9SRUxPQyBlbnRyaWVzIHdoaWNoIEkKLQkJaG9wZSB3aWxsIG1ha2UgaXQgaW50byBpbmNsdWRlL2JmZC5oLgotCSogdGFyZ2V0cy5jOiBhZGRlZCBhb3V0X21pcHNfKl92ZWMuCi0KLVdlZCBKYW4gMjAgMTc6MTU6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVjc3RhdGlvbi5tdDogU2V0IERFRkFVTFRfVkVDVE9SIHRvIGVjb2ZmX2xpdHRsZV92ZWMuCi0KLVR1ZSBKYW4gMTkgMDk6MDY6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2FzeW1ib2xfdmFsdWUpOiBBZGQgbmVlZGVkIHBhcmVudGhlc2VzLgotCi0JKiBsaWJjb2ZmLWluLmg6IFVwZGF0ZSBwcm90b3R5cGUgZm9yIGNvZmZfY291bnRfbGluZW51bWJlcnMuCi0KLUZyaSBKYW4gMTUgMTg6MTM6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1zeW0uYyAoZWNvZmZfc3dhcF9oZHJfb3V0LCBlY29mZl9zd2FwX2Zkcl9vdXQsCi0JZWNvZmZfc3dhcF9wZHJfb3V0LCBlY29mZl9zd2FwX3N5bV9vdXQsIGVjb2ZmX3N3YXBfZXh0X291dCwKLQllY29mZl9zd2FwX3JuZHhfb3V0LCBlY29mZl9zd2FwX3JmZF9vdXQsIGVjb2ZmX3N3YXBfb3B0X2luLAotCWVjb2ZmX3N3YXBfb3B0X291dCwgZWNvZmZfc3dhcF9kbnJfaW4sIGVjb2ZmX3N3YXBfZG5yX291dCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkqIGNvZmZzd2FwLmg6IElmIE5PX0NPRkZfUkVMT0NTIGlzIGRlZmluZWQsIGRvbid0IGRlZmluZQotCWJmZF9zd2FwX3JlbG9jX2luIG9yIGNvZmZfc3dhcF9yZWxvY19vdXQuCi0JKiBjb2ZmLW1pcHMuYzogQWRkZWQgY29kZSB0byBsaW5rIGFuZCB3cml0ZSBvdXQgc3ltYm9saWMgZGVidWdnaW5nCi0JaW5mb3JtYXRpb24sIGFuZCB0byBzd2FwIHJlbG9jcyBpbiBhbmQgb3V0LgotCi1UaHUgSmFuIDE0IDE1OjUxOjU4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsaWJjb2ZmLmgsIGNvZmZnZW4uYyAoY29mZl9jb3VudF9saW5lbnVtYmVycyksIGNvZmZjb2RlLmgKLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIHJldHVybnMgdGhlCi0JbnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgaXQgZm91bmQuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9saW5lbnVtYmVycyk6IG9ubHkgd3JpdGUgb3V0IGxpbmUgbnVtYmVycwotCWluIHRoZSBzZWN0aW9uIHRoZXkgYmVsb25nIHRvLgotCi1Nb24gSmFuIDExIDE4OjMyOjIyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkZWQgcmVsb2NhdGVhYmxlIGFyZ3VtZW50IHRvCi0JX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBBZGRlZCBfYmZkX3NlY2xldF9saW5rCi0JdGFyZ2V0IHZlY3RvciBmb3IgbGlua2VyIHVzZS4KLQkqIGJmZC5jIChiZmRfc2VjbGV0X2xpbmspOiBOZXcgbWFjcm8uCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZGVkIF9iZmRfc2VjbGV0X2xpbmsuCi0JKiBzZWNsZXQuYyAocmVsLCBzZWNsZXRfZHVtcF9zZWNsZXQpOiBBZGRlZCByZWxvY2F0ZWFibGUgYXJndW1lbnQKLQlhbmQgYm9vbGVhbiByZXR1cm4gdmFsdWUuICBNYWRlIHN0YXRpYy4KLQkoYmZkX2dlbmVyaWNfc2VjbGV0X2xpbmspOiBSZW5hbWVkIGZyb20gc2VjbGV0X2R1bXAuICBBZGRlZAotCXJlbG9jYXRlYWJsZSBhcmd1bWVudC4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFkZGVkCi0JcmVsb2NhdGVhYmxlIGFyZ3VtZW50IChpZiByZWxvY2F0ZWFibGUsIHNhdmVzIHJlbG9jcykuCi0JKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyksCi0JcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFkZGVkCi0JcmVsb2NhdGVhYmxlIGFyZ3VtZW50IChpZiByZWxvY2F0ZWFibGUsIGp1c3QgY2FsbHMKLQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLgotCSogbGliY29mZi1pbi5oIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IEFkZGVkIHJlbG9jYXRlYWJsZQotCWFyZ3VtZW50IHRvIHByb3RvdHlwZS4KLQkqIEFsbCB0YXJnZXRzOiBTZXQgbmV3IF9iZmRfc2VjbGV0X2xpbmsgdmVjdG9yIHRvCi0JYmZkX2dlbmVyaWNfc2VjbGV0X2xpbmsuCi0KLVNhdCBKYW4gIDkgMjE6Mjk6MzIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jOiAgI2luY2x1ZGUgc2VjbGV0LmguCi0KLVNhdCBKYW4gIDkgMTk6NDg6MTQgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChocHBhX29iamVjdF9zZXR1cCk6ICBHZXQgcmlkIG9mIGFsbCBrbm93bGVkZ2Ugb2Ygc3RhYnMKLQlkZWJ1ZyBpbmZvLiAgU2V0dXAgaW5mbyBhYm91dCBsaW5rZXIgc3ltYm9scyBvbmx5LCBhbmQgdXNlCi0Jc3RhbmRhcmQgYmZkIGZpZWxkcyB0byBob2xkIHRoZSBpbmZvLgotCSogKGhwcGFfb2JqZWN0X3ApOiAgUmVtb3ZlIHVubmVlZGVkIGRlY2xzLgotCSogKGhwcGFfbmV3X3NlY3Rpb25faG9vayk6ICBHZXQgcmlkIG9mIG1vc3Qgb2YgdGhpcy4KLQkqIGxpYmhwcGEuaCAoc3RydWN0IGhwcGFkYXRhKTogIFJlbW92ZSB0ZW4gcG91bmRzIG9mIHVzZWxlc3MgdWdseQotCWZhdC4gIFJlbW92ZSBhbGwga25vd2xlZGdlIG9mIHN0YWJzLCByZW1vdmUgcmVkdW5kYW50IGtub3dsZWRnZSBvZgotCWxpbmtlciBzeW1ib2xzLgotCSogUmVtb3ZlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGZpZWxkcyB3aGljaCBhcmUgbm93IGdvbmUuCi0KLUZyaSBKYW4gIDggMTU6MjA6MDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogYWxsb3cgU0VDX05FVkVSX0xPQUQgdG8gdHVybiBvbgotCVNUWVBfTk9MT0FEIGJpdC4KLQkqIGNvZmYtejhrLmM6IGRlbGV0ZSB1bnVzZWQgcmVsb2MgZnVuY3Rpb25zCi0KLUZyaSBKYW4gIDggMTU6NDc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGRlZCBlY29mZl90ZGF0YSB0byB0ZGF0YSB1bmlvbi4KLQkqIHRhcmdldHMuYyAoZW51bSB0YXJnZXRfZmxhdm91cik6IEFkZGVkIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ci4KLQkqIGNvZmYtbXN5bS5jOiBVc2UgREVGVU4gZm9yIGZ1bmN0aW9uIGRlZmluaXRvbnMuCi0JKiBjb2ZmLW1pcHMuYzogQWRkZWQgY29kZSB0byByZWFkIGFuZCBwcmludCBzeW1ib2xzLCBhbmQgdG8gZmluZAotCWxpbmUgbnVtYmVycy4KLQotCSogY29mZmNvZGUuaDogTW92ZWQgbWFueSBnZW5lcmljIGZ1bmN0aW9ucyBpbnRvIGNvZmZnZW4uYy4gIE1vdmVkCi0Jc3dhcHBpbmcgZnVuY3Rpb25zIGludG8gY29mZnN3YXAuaCBmb3IgRUNPRkYgdXNlLiAgTW92ZWQKLQlyZWxvY2F0aW9uIGZ1bmN0aW9ucywgb25seSB1c2VkIGJ5IGg4MzAwIGFuZCB6OGssIGludG8gcmVsb2MxNi5jLgotCUFkZGVkIGhvb2tzIGZvciBjb2ZmZ2VuLmMgZnVuY3Rpb25zIHRvIGJhY2tlbmQgZGF0YSBzdHJ1Y3R1cmUsIGFuZAotCWFkZGVkIGhvb2sgZnVuY3Rpb25zLiAgU3RpbGwgbW9yZSBjb3VsZCBiZSBkb25lLgotCSogY29mZnN3YXAuaDogTmV3IGZpbGUgdG8gaG9sZCBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLgotCSogY29mZmdlbi5jOiBOZXcgZmlsZSB0byBob2xkIGdlbmVyaWMgQ09GRiBmdW5jdGlvbnMuCi0JKiByZWxvYzE2LmM6IE5ldyBmaWxlIHRvIGhvbGQgaDgzMDAgYW5kIHo4ayBzcGVjaWZpYyByZWxvY2F0aW9uCi0JZnVuY3Rpb25zLgotCSogbGliY29mZi1pbi5oOiBBZGRlZCBkZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQgdG8gaW5jb3Jwb3JhdGUgY2hhbmdlcy4KLQkqIGNvZmYtaDgzMDAuYzogRnVuY3Rpb24gbmFtZSBjaGFuZ2VzLgotCSogY29mZi16OGsuYzogRnVuY3Rpb24gbmFtZSBjaGFuZ2VzLiAgVXNlIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcwotCWhvb2sgcmF0aGVyIHRoYW4gZGVmaW5pbmcgRVhUUkFfQ0FTRVMuCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgbmV3IGZpbGVzIGNvZmZnZW4gYW5kIHJlbG9jMTYuICBBZGRlZAotCWRlcGVuZGVuY2llcyBvZiBjb2ZmLSoubyBvbiBjb2Zmc3dhcC5oIGFuZCBzZWNsZXQuaC4KLQotVGh1IEphbiAgNyAxNjoxNjoyNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25zKTogIEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcKLQlhYm91dCBkaXNjYXJkaW5nIGNvbnN0LgotCi1XZWQgSmFuICA2IDAwOjE2OjQ5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jLCBzZWNsZXQuYywgZWxmLmMgdXNlIGJmZF94bWFsbG9jIGluc3RlYWQgb2YgbWFsbG9jCi0KLVR1ZSBKYW4gIDUgMDk6MzU6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHBvc3QtdGFyZ2V0KTogSWYgLS13aXRoLW1pbmltYWwtYmZkIGlzIHNwZWNpZmllZCwKLQlzZXQgTUlOSU1JWkU9MS4KLQotTW9uIEphbiAgNCAwNzoyMDowMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3JlY29yZHMpOiBvbmUgb2YgbXkgYm9hcmRzIHdhbnRzIGEgQ1IgYmV0d2VlbgotCXJlY29yZHMuCi0KLVdlZCBEZWMgMzAgMTI6NDY6MzAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiBzZXQgc3ltZGVmX2NvdW50IGNvcnJlY3RseQotCShpdCBicm9rZSBhIGNvdXBsZSBvZiB3ZWVrcyBhZ28pLgotCi1UdWUgRGVjIDI5IDIxOjQxOjA1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogU3dpdGNoIGJhY2sgdG8gInN0cnVjdCAuLi4iIGZvcgotCXJldHVybiB0eXBlLCBzbyBsaWJiZmQuaCBkb2Vzbid0IHJlZmVyZW5jZSB1bmRlZmluZWQgdHlwZWRlZm5hbWVzLgotCi1UdWUgRGVjIDI5IDEzOjU0OjM1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wKTogdXNlIG5hbWUgSTM4NkFJWE1BR0lDIHJhdGhlcgotCXRoYW4gSTM4NlNWTUFHSUMuCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBkb24ndCBwb2ludGVyaXplIGEgbmVnYXRpdmUgdGFnbmR4Ci0JKHNvbWV0aW1lcyBnZW5lcmF0ZWQgYnkgU0NPIDMuMnY0IGNjKS4KLQotCSogYm91dC5jIChjYWxsanhfY2FsbGJhY2ssIGNhbGxqX2NhbGxiYWNrLAotCWJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IHdhcm4gaWYgcmVsb2NhdGluZyBhZ2FpbnN0Ci0JYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQotTW9uIERlYyAyOCAxNDozMDo1NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmM6ICBHZXQgcmlkIG9mIERFRlVOLCB1c2UgbW9yZSBjb252ZW50aW9uYWwgcHJvbG9nIHN0dWZmLgotCU1ha2UgYSBidW5jaCBtb3JlIHJvdXRpbmVzIGJlIHN0YXRpYy4KLQkqIGhwcGEuYyAoZmlsbF9zcGFjZXMpOiAgR2V0IHJpZCBvZiB0aGlzLCByZXBsYWNlIHdpdGggbXVjaCBiZXR0ZXIKLQl3cml0dGVuIHNldHVwX3NlY3Rpb25zKCkuCi0JKiAoc2V0dXBfc2VjdGlvbnMpOiAgTmV3IHJvdXRpbmUgdG8gY3JlYXRlIEJGRCBzZWN0aW9ucyBmb3IgZWFjaAotCXNwYWNlIGFuZCBzdWJzcGFjZSBpbiBTT00gZmlsZXMuCi0JKiAoaHBwYV9vYmplY3Rfc2V0dXApOiAgVXNlIEJGRCBzZWN0aW9ucyBjcmVhdGVkIGJ5Ci0Jc2V0dXBfc2VjdGlvbnMoKSB0byBsb2NhdGUgR0RCIHN5bWJvbCB0YWJsZSBpbmZvLgotCSogKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiAgTmV3IHJvdXRpbmUgdG8gY3JlYXRlIGEgQkZEIHNlY3Rpb24uICBJdAotCWVuc3VyZXMgdGhhdCB0aGUgZ2l2ZW4gbmFtZSBpcyB1bmlxdWUsIGFuZCB3aWxsIGdlbmVyYXRlIGEgdW5pcXVlCi0Jb25lIGlmIG5lY2Vzc2FyeS4KLQkqIChocHBhX29iamVjdF9wKTogIEJlY29tZSBtdWNoIG1vcmUgcGFyYW5vaWQgYWJvdXQgZmlsZSBoZWFkZXIuCi0JKiAobWFrZV9iZmRfYXNlY3Rpb24pOiAgQ2FsbCBiZmRfbWFrZV9zZWN0aW9uIHRvIGRvIHRoZSBkaXJ0eQotCXdvcmsuICBTaW1wbGlmeSBjb2RlIHNvbWV3aGF0LgotCSogKGhwcGFfY29yZV9maWxlX3ApOiAgVXNlIHByb3BlciBuYW1lIGZvciBzdGFjayBzZWN0aW9uLgotCSogbGliaHBwYS5oOiAgUmVtb3ZlIG1pbGxpY29kZV9zdGFydCwgbWlsbGljb2RlX2VuZCBkZWNscy4KLQotTW9uIERlYyAyOCAxMTowMzoyMiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvZmYtd2UzMmsubywgY29mZi16OGsubyk6IE5vdGUgZGVwZW5kZW5jaWVzLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRm9yIG5vcm1hbCAyLSBvciA0LWJ5dGUKLQlyZWxvY3MsIGRvbid0IGJvdGhlciBkb2luZyB0aGUgYWRqdXN0bWVudCBpZiB0aGUgdmFsdWUgdG8gYWRkIGlzCi0JemVyby4KLQotU3VuIERlYyAyNyAxNzo0NTowNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfc2l6ZSk6ICBOZXcgZnVuY3Rpb24gdGhhdCBnZXRzIGFuIHVwcGVyIGJvdW5kCi0Jb24gdGhlIHBvc3NpYmxlIHNpemUgb2YgYW55IG9iamVjdCBpbiBhIGJmZC4KLQkqIGVsZi5jIChiZmRfZWxmX2ZpbmRfc2VjdGlvbiwgZWxmX2dldF9zdHJfc2VjdGlvbiwKLQllbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6ICBSZXdyaXRlIHRvIGF2b2lkIE5VTEwgcG9pbnRlcgotCWRlcmVmZXJlbmNlcy4KLQkqIGVsZi5jIChlbGZfYmlnX3ZlYywgZWxmX2xpdHRsZV92ZWMpOiAgRG9jdW1lbnQgbGFzdCB0aHJlZQotCW1lbWJlcnMgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KLQotVGh1IERlYyAyNCAxNzo0OTowOSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogY2hhbmdlIGEgJ2NvbnN0JyB0byAnQ09OU1QnLCBvciBlbHNlIEhQIEMgY29tcGlsZXIgZGllcwotCi1Nb24gRGVjIDIxIDE2OjMzOjM0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogIE5ldyBmaWxlLiAgQXR0ZW1wdCBhdCBhIGdlbmVyaWMvZGVmYXVsdAotCXNldCBvZiBkZWZpbml0aW9ucywgdG8gZGlzY291cmFnZSBwb3J0aW5nIHRvIG5ldyBob3N0cyBieSBjb3B5aW5nLgotCSogaG9zdHMvbmV3cy5oOiAgUmVtb3ZlZC4KLQkqIGhvc3RzL3NwYXJjLmg6ICBVc2Ugc3RkLWhvc3QuaC4KLQkqIGJmZC1pbi5oOiAgTmV3IG1hY3JvcyBiZmRfYXN5bWJvbF9iZmQgYW5kIGJmZF9hc3ltYm9sX2ZsYXZvdXI7Ci0JcGVyaGFwcyB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIHRoZSB0aGVfYmZkIGZpZWxkIGZyb20gZWFjaCBzeW1ib2wuCi0JKiBzeW1zLmMgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkpOiAgUmVtb3ZlIHVudXNlZCBmaWVsZAotCWFwcF9kYXRhLiAgQWRkIGNvbW1lbnQgbm90aW5nIHRoYXQgdGhlX2JmZCBpcyBhbG1vc3QgcmVkdW5kYW50LAotCWJ1dCBub3QgcXVpdGUuCi0JKiBhb3V0eC5oLCBjb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmY29kZS5oOgotCVVzZSBuZXcgbWFjcm9zIGJmZF9hc3ltYm9sX2JmZCBhbmQgYmZkX2FzeW1ib2xfZmxhdm91ci4KLQkqIGhwcGEuYyAoZmlsbF9zcGFjZXMpOiAgTWFrZSBzbGlnaHRseSBtb3JlIHJlYnVzdC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IHN0ZC1ob3N0IGFzIHRoZSAiZGVmYXVsdCIgaG9zdC4KLQotTW9uIERlYyAyMSAxNzoyNDoxMyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIEFkZCBzdHJ1Y3QgaHBwYV9jb3JlX2RhdGEgdG8gdGRhdGEgdW5pb24uCi0JKiBocHBhLmM6ICBDb25kaXRpb25hbGl6ZSBvbiBIT1NUX0hQUEFIUFVYIGluc3RlYWQgb2YgaHA5MDAwczgwMC4KLQlHZXQgcmlkIG9mIEhQUEEvQlNEIHNwZWNpZmljIGNvZGUuICBUaGF0IHdpbGwgZ28gc29tZXdoZXJlIGVsc2UKLQlzb21lZGF5LgotCSogKGZpbGxfc3BhY2VzKTogIERvbid0IHNwaW4gZm9yZXZlciBhbmQgZGllIGlmIHlvdSBkb24ndCBmaW5kCi0JJE1JTExJQ09ERSQgc3Vic3BhY2UuCi0JKiAoaHBwYV9vYmplY3RfcCk6ICBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgcmVhbCBob25lc3QtdG8tY3RodWx1Ci0JZXhlYyBmaWxlIQotCSogKGhwcGFfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLCBocHBhX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpOgotCU1ha2UgdGhlc2Ugd29yayBmb3IgSFBVWC4KLQkqIChtYWtlX2JmZF9hc2VjdGlvbik6ICBOZXcgcm91dGluZSB0byBtYWtlIHNlY3Rpb24gY3JlYXRpb24gYQotCWxpdHRsZSBlYXNpZXIuCi0JKiAoaHBwYV9jb3JlX2ZpbGVfcCk6ICBDb21wbGV0ZWx5IHJld3JpdGUsIGxlYXZlIG91dCBidWdzLgotCSogbGliaHBwYS5oOiAgI2luY2x1ZGUgdGhlIHJpZ2h0IHN5c3RlbSBmaWxlcy4gIFJlZGVmaW5lIGFsbCBvZgotCXRoZSBzdHJ1Y3RzL21hY3JvcyBmb3IgaGFja2luZyBjb3JlIGZpbGVzIHRvIHVzZSBtb3JlIHNlbnNpYmxlCi0JSFBVWCBjb3JlIGZpbGUgc3RydWN0dXJlcy4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBDb25kaXRpb25hbGl6ZSBocHBhX3ZlYyBvbgotCUhPU1RfSFBQQUhQVVgsIG5vdCBocDkwMDBzODAwLgotCSogaG9zdHMvaHBwYWhwdXguaDogICNpbmNsdWRlIHN0ZGxpYi5oIHRvIGdldCBjb3JyZWN0IGRlY2xzIGZvcgotCW1hbGxvYyBhbmQgcmVhbGxvYy4gICNkZWZpbmUgSE9TVF9IUFBBSFBVWC4KLQotTW9uIERlYyAyMSAxMjo0MDoxMCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIFBhdGNoZXMgZnJvbSBNaW5oIFRyYW4tbGUgPG10cmFubGVAcGFyaXMuaW50ZWxsaWNvcnAuY29tPi4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWlzYyosIGkzODYtKi1haXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaG9zdCAoaTM4Ni0qLWlzYyosIGkzODYtKi1haXgqKTogTmV3IGhvc3RzLgotCSogaG9zdHMvaTM4NmlzYy5oLCBjb25maWcvaTM4NmlzYy5taDogTmV3IGZpbGVzIGZvciBJbnRlcmFjdGl2ZQotCVVuaXguCi0JKiBob3N0cy9pMzg2YWl4LmgsIGNvbmZpZy9pMzg2YWl4Lm1oOiBOZXcgZmlsZXMgZm9yIEFJWCBvbiBQUy8yLgotCSogYWl4Mzg2LWNvcmUuYzogTmV3IGZpbGUgZm9yIGhhbmRsaW5nIGNvcmUgZmlsZXMgb24gQUlYIG9uIFBTLzIuCi0JKiB0YXJnZXRzLmM6IGlmIEFJWDM4Nl9DT1JFLCB1c2UgYWl4Mzg2X2NvcmVfdmVjLgotCSogY29mZmNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wKTogY2hlY2sgZm9yIEkzODZTVk1BR0lDIGFzIHdlbGwKLQlhcyBJMzg2TUFHSUMuCi0KLUZyaSBEZWMgMTggMTA6MjA6MjcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGZsYWdzIHRvIDAsIGZpeGluZwotCTE5MjcuCi0KLVRodSBEZWMgMTcgMTk6MzU6MzIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgZHZpIHRhcmdldAotCi1UaHUgRGVjIDE3IDAwOjM2OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIFVzZSByaWdodCBuYW1lIGZvciB0ZWtoZXggdGRhdGEgc3RydWN0LgotCSogdGVraGV4LmM6ICBJbnNlcnQgbGVhZGluZ19jaGFyICgwKSBpbnRvIGJmZF90YXJnZXQgc3RydWN0LiAgU3R5bGUuCi0JKiBsaWJjb2ZmLmg6ICBVcGRhdGVkIHRvIGdldCBzcGFjaW5nIGNoYW5nZSBmcm9tIGNvZmZjb2RlLmguCi0JKiB0cmFkLWNvcmUuYzogIGxlYWRpbmdfY2hhciBpcyAwIChubyBzeW1ib2xzISksIG5vdCAnXycuCi0KLVR1ZSBEZWMgMTUgMTU6NDA6MzAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfYnNkX2FybWFwLCBkb19zbHVycF9jb2ZmX2FybWFwKTogIE5ldwotCWZ1bmN0aW9ucywgd2l0aCB0aGUgImd1dHMiIG9mIHRoZSBvbGQgYmZkX3NsdXJwX2JzZF9hcm1hcAotCWFuZCBiZmRfc2x1cnBfY29mZl9hcm1hcCwgYnV0IGFzc3VtaW5nIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZAotCWlmIHRoZSBhcm1hcCBpcyBwcmVzZW50IG9yIG5vdC4KLQlBbHNvLCByZXdyaXRlIGEgYml0IHRvIGF2b2lkIGtlZXBpbmcgYXJvdW5kIG9ic3RhY2sgZGF0YQotCXRoYXQgd2UgZG9uJ3QgbmVlZC4KLQkqIGFyY2hpdmUuYyAoc25hcmZfYXJfaGVhZGVyLCBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOgotCVZhcmlvdXMgZml4ZXMgdG8gY29ycmVjdGx5IGhhbmRsZSBDT0ZGX3N0eWxlIGFyY2hpdmVzIG5hbWVzLgotCShOb3RlIHRoYXQgYmVjYXVzZSB0aGVzZSBoYXZlIGEgdHJhaWxpbmcgJy8nLCB0aGUgbmFtZXMgY2FuCi0JaGF2ZSBlbWJlZGRlZCBzcGFjZXMuKQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYXJtYXApOiAgTmV3IGZ1bmN0aW9uLCByZXBsYWNlcyBvbGQKLQliZmRfc2x1cnBfYnNkX2FybWFwIGFuZCBiZmRfc2x1cnBfY29mZl9hcm1hcC4gIFJlY29nbml6ZXMKLQlfZWl0aGVyXyBmb3JtYXQsIGFuZCBjYWxscyBkb19zbHVycF9ic2RfYXJtYXAgb3IKLQlkb19zbHVycF9jb2ZmX2FybWFwIGlmIGVpdGhlciBmb3JtIG9mIG1hcCBpcyBzZWVuLgotCSogbGliYmZkLWluLmg6ICBDaGFuZ2VkIGJmZF9zbHVycF9ic2RfYXJtYXAgYW5kCi0JYmZkX3NsdXJwX2NvZmZfYXJtYXAgaW50byBtYWNybyBzeW5vbnltcyBmb3IgYmZkX3NsdXJwX2FybWFwLgotCSogZWxmLmMgKGVsZl9zbHVycF9hcm1hcCwgZWxmX3dyaXRlX2FybWFwKTogIEZpeC4KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBVc2UgcmMgaW5zdGVhZCBvZiBub24tc3RhbmRhcmQgcWMuCi0KLU1vbiBEZWMgMTQgMTc6MDg6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiAgI2luY2x1ZGUgInN5c2RlcC5oIiwgbm90IDxzeXNkZXAuaD4uCi0JKiBsaWJocHBhLmg6ICBNYWtlIG1pbGxpY29kZV9zdGFydCBhbmQgbWlsbGljb2RlX2VuZCBiZSB1bnNpZ25lZAotCWludCB0byBiZSBzYW1lIHR5cGUgYXMgQ09SRV9BRERSIGluIEdEQi4gIFdoeSBhcmUgdGhlc2UgaGVyZT8KLQotU2F0IERlYyAxMiAxNTo1NDozNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTM4Ni5jIChDQUxDX0FEREVORCk6IGlmIHJlbG9jIGlzIFBDIHJlbGF0aXZlLCBhZGQgdGhlCi0JdmFkZHIgb2YgdGhlIHNlY3Rpb24gdG8gdGhlIGFkZGVuZC4KLQkqIHRhcmdldHMuYzogaWYgTUlOSU1JWkUgaXMgMSwgYW5kIFNDT19DT1JFIGlzIGRlZmluZWQsIGFkZAotCVNDT19DT1JFIHRvIFNFTEVDVF9WRUNTLgotCSh0YXJnZXRfdmVjdG9yKTogYWRkIHNjb19jb3JlX3ZlYy4KLQkqIHNjby1jb3JlLmMgKHNjb19jb3JlX3ZlYyk6IGFkZCBsZWFkaW5nIHVuZGVyc2NvcmUgaW5pdGlhbGl6ZXIuCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zY28qKTogdXNlIHRhcmdldCBpMzg2LXNjby4KLQkqIGNvbmZpZy9pMzg2LXNjby5tdDogbmV3IGZpbGU7IGRlZmluZSBTQ09fQ09SRS4KLQotVGh1IERlYyAxMCAwMjoxMzoxNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX29iamVjdF9wKTogIEZpeCAhc3RyY21wIHRoaW5rby4KLQotRnJpIERlYyAgNCAxNDowMjo0OSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogTm93IHN0YXRpYyBhbmQgY29uc3QuCi0KLVRodSBEZWMgIDMgMTY6NTQ6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2bGludXguaDogSW5jbHVkZSB1bmlzdGQuaC4KLQotCSogYW91dHguaCAocHJpbnRfc3ltYm9sKTogYW91dF9zdGFiX25hbWUgcmV0dXJucyBhIGNvbnN0YW50Ci0Jc3RyaW5nLgotCSogbGliYW91dC5oIChhb3V0X3N0YWJfbmFtZSk6IEZpeCBwcm90b3R5cGUuCi0JKiBzdGFiLXN5bXMuYyAoYW91dF9zdGFiX25hbWVzKTogQXJyYXkgaXMgbm93IGNvbnN0LgotCShhb3V0X3N0YWJfbmFtZSk6IFJldHVybiB2YWx1ZSBpcyBub3cgcG9pbnRlciB0byBjb25zdC4KLQotCSogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCBjdG9yLmMsIHJlbG9jLmMsCi0Jc3ltcy5jOiBEb2MgZml4ZXMuCi0KLQkqIHN5bXMuYyAoYXN5bWJvbCk6IEFkZGVkIG5ldyBmaWVsZCAiYXBwX2RhdGEiLCBmb3IgZGF0YQotCXBhcnRpY3VsYXIgdG8gdGhlIGFwcGxpY2F0aW9uLiAgU29tZSBvZiB0aGUgbGlua2VyIGZsYWdzIG91Z2h0IHRvCi0JZ2V0IG1vdmVkIHRvIHRoaXMgZmllbGQgc29tZWRheS4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IFJlY29nbml6ZSBhIGZldyBtb3JlIG51bWJlcnM6Ci0JODA0ODYsIDgwOTYwLCBhbmQgOTYwLgotCi0JKiBiZmQtaW4uaCAoQ09GRl9TV0FQX1RBQkxFKTogTmV3IGlzIGp1c3QgYWRkcmVzcyBvZgotCWJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlLCBjYXN0IHRvIFBUUi4KLQkqIGJmZC5jIChiZmRfY29mZl9zd2FwXyopOiBEZWxldGVkIG1hY3Jvcy4KLQkqIHRhcmdldHMuYyAoc3RydWN0IGJmZF90YXJnZXQpOiBEZWxldGVkIENPRkYtc3BlY2lmaWMgc3dhcHBpbmcKLQlyb3V0aW5lIHBvaW50ZXJzLgotCSogY29mZmNvZGUuaCAodHlwZSBiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBOZXcgc3RydWN0dXJlIHR5cGUsCi0JY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIENPRkYtc3BlY2lmaWMgc3dhcHBpbmcgcm91dGluZXMuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogTmV3IGRhdGEgc3RydWN0dXJlLCB0byBiZSB1c2VkIHdoZW4KLQlOT19DT0ZGX1NZTUJPTFMgYW5kIE5PX0NPRkZfTElORU5PUyBhcmUgbm90IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N3YXBfKik6IE5ldyBtYWNyb3MuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19jb2ZmX3N3YXBfdGFibGUpOiBOZXcgZGF0YSBzdHJ1Y3R1cmUuCi0JKGVjb2ZmX2JpZ192ZWMpOiBVc2UgaXQuCi0JKiBBbGwgQ09GRiB0YXJnZXRzOiBNb3ZlZCBDT0ZGX1NXQVBfVEFCTEUgdG8gdGFyZ2V0LXNwZWNpZmljIGRhdGEuCi0JKiBBbGwgb3RoZXIgdGFyZ2V0czogRGVsZXRlZCBjb2ZmLXNwZWNpZmljIHZlY3RvciBlbnRyaWVzLgotCi0JKiB0cmFkLWNvcmUuYzogRml4ZWQgc29tZSBgUEFSQU1TJyB1c2VzIHRoYXQgd2VyZSBtaXNzaW5nCi0JcGFyZW50aGVzZXMuCi0KLVN1biBOb3YgMjkgMDg6Mzc6MTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBQcm90ZWN0IGFyZyBwcm90b3R5cGUgaW4KLQljYWxsYmFja190b19yZWFsX29iamVjdF9wIHdpdGggUEFSQU1TIG1hY3JvIGZvciBub24tQU5TSSBjb21waWxlcnMuCi0KLVNhdCBOb3YgMjggMDQ6MDE6MjEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmgsIGFvdXRmMS5oLCB0cmFkLWNvcmUuYywgY29mZmNvZGUuaCwgbGliYW91dC5oLAotCWxpYmJmZC1pbi5oLCBiZmQtaW4uaDogRWxpbWluYXRlIGFsbCBQUk9UTyBjYWxscywgcmVwbGFjZSB3aXRoCi0JUEFSQU1TIGZvciByZWFkYWJpbGl0eS4KLQotCSogYW91dHguaDogIEFkZCB0eXBlIHRvIGNhbGxiYWNrIHBhcmFtZXRlci4KLQkqIGNvZmYtbWlwcy5jOiAgRG9uJ3QgY2FsbCB0cmFkLWNvcmUuaCwgbm90IG5lZWRlZC4KLQkqIHRyYWQtY29yZS5jOiAgSW5jb3Jwb3JhdGUgdHJhZC1jb3JlLmggZGVjbGFyYXRpb25zLiAgRml4IGNvbW1lbnRzLgotCSogdHJhZC1jb3JlLmg6ICBFbGltaW5hdGUsIHVudXNlZC4KLQotV2VkIE5vdiAxOCAxMzoxNjoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXQpOiBpZiBkZWZhdWx0IHRhcmdldCBpc24ndCBmb3VuZAotCXRoZW4gbG9vayB0aHJvdWdoIHRoZSBlbnRpcmUgbGlzdCByYXRoZXIgdGhhbiByZXR1cm4gZWFybHkuCi0KLU1vbiBOb3YgMTYgMTQ6MzM6MDMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaTk2MC1jb2ZmLm10OiByZW9yZGVyIHZlYyB0byBtYXRjaCBiZmRfY2hlY2tfZm9ybWF0IChmcm9tIFBlcikKLQotVGh1IE5vdiAxMiAxNzowMTo0MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIGRvd24gcHJlZml4IGFuZCBleGVjX3ByZWZpeCBpbiBGTEFHU19UT19QQVNTCi0KLVRodSBOb3YgMTIgMDk6NDY6NDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtejhrLmM6IGNoZWNrcG9pbnQsIG1vcmUgYWRkcmVzc2luZyBtb2RlcyBoYW5kbGVkCi0JKiBjb2ZmY29kZS5oIChnZXRfdmFsdWUpOiBkb24ndCB0cnVuY2F0ZSByZWxvYy0+YWRkZW5kIGZpZWxkLCBpdCdzCi0JYSBsb25nIG5vdy4KLQotV2VkIE5vdiAxMSAyMzo1Nzo1NSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiB3ZTMyay5tdCAoVERFRkFVTFRTKTogVXNlIHdlMzJrY29mZl92ZWMsIG5vdCBpMzg2Y29mZl92ZWMuCi0KLVR1ZSBOb3YgMTAgMTQ6MDQ6MzggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWlub3IgdHdlYWtzIHRvIG1ha2UgJChDQykgY29tbWFuZCBsaW5lcyBtb3JlIGNvbnNpc3RlbnQKLQotTW9uIE5vdiAgOSAyMzo1ODoxNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yLCBiZmRfY2xvc2UpOiAgQWRkIGRvYyBhYm91dCBjYWNoZWluZwotCWFuZCBhYm91dCB3aGVuIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGNsb3NlZC4KLQotU2F0IE5vdiAgNyAwMDo0MjoyMCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBNYWtlIHN1cmUgYWxpZ25tZW50IHJlbG9jcyBnZXQKLQl3cml0dGVuIG91dCBjb3JyZWN0bHkuCi0KLVRodSBOb3YgIDUgMTU6MzQ6MTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmM6IE5ldyBzZWN0aW9uIGJpdCBTRUNfU0hBUkVEX0xJQlJBUlkuCi0JY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBpZiBTVFlQX05PTE9BRCAmJiAoU1RZUF9URVhUIHx8Ci0JU1RZUF9EQVRBKSwgc2V0IFNFQ19TSEFSRURfTElCUkFSWS4gIFRoaXMgc2VlbXMgdG8gYmUgY29ycmVjdCBmb3IKLQlpMzg2LXN5c3YuCi0KLVRodSBOb3YgIDUgMDQ6NDM6MDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHRhcmdldC5jIChzdHJ1Y3QgYmZkX3RhcmdldCk6ICBFbGltaW5hdGUgdGhlIFNERUYgYW5kIFNERUZfRk1UCi0JbWFjcm9zOyB1c2UgUEFSQU1TIHRvIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGludm9sdmVkLgotCi0JKiBiZmQtaW4uaCwgYmZkLmMsIGxpYmJmZC5oLCByZWxvYy5jLCBzZWNsZXQuaCwgc2VjdGlvbi5jLAotCXRhcmdldHMuYzogUmVuYW1lIHN0cnVjdCBiZmRfc2VjbGV0X3N0cnVjdCB0byBzdHJ1Y3QgYmZkX3NlY2xldC4KLQotVGh1IE5vdiAgNSAwMjo1OTowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNsZWFudXA6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcywgd2l0aCBQQVJBTVMuCi0KLQkqIGFyY2h1cmVzLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywgdGVraGV4LmM6ICBVc2UgUEFSQU1TIGluCi0JZGVjbGFyaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucy4KLQkqIGNhY2hlLmMsIGVsZi5jOiAgTW92ZSBzdGF0aWMgZnVuY3Rpb24gZGVjbHMgdG8gdG9wLCB1c2UgUEFSQU1TLgotCSogc2VjbGV0Lmg6ICBEZWNsYXJlIGV4dGVybmFsIGZ1bmN0aW9uIHdpdGggUEFSQU1TLgotCi0JKiBkb2MvY2hldy5jIChleGZ1bnN0dWZmKTogIEVsaW1pbmF0ZS4KLQkocGFyYW1zdHVmZik6ICBSZXBsYWNlIGV4ZnVuc3R1ZmYgd2l0aCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBQQVJBTVMuCi0JKiBkb2MvcHJvdG8uc3RyOiAgVXNlIHBhcmFtc3R1ZmYgcmF0aGVyIHRoYW4gZXhmdW5zdHVmZi4KLQotCSogbGliYmZkLmg6ICBVcGRhdGUsIGJhc2VkIG9uIGNoYW5nZXMgaW4gc291cmNlIGNvZGUgYW5kIGNoZXcuCi0KLVdlZCBOb3YgIDQgMjI6NDc6MjkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGxpYmllZWUuaDogIEFkZCBGSVhNRSBhYm91dCByZW1vdmluZyBsaW1pdCBvbiBudW1iZXIgb2Ygc2VjdGlvbnMuCi0JKiBiZmQtaW4uaDogIEltcHJvdmUgY29tbWVudHMgdG8gbWFrZSBpdCBjbGVhciB0aGF0IGJmZC5oIGlzCi0JdGhlIHdyb25nIHBsYWNlIHRvIGVkaXQgdGhpcyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiAgSW5zdGFsbCBhbnNpZGVjbC5oIGFuZCBvYnN0YWNrLmggaW4gdGhlCi0Jc2FtZSBwbGFjZXMgd2hlcmUgd2UgaW5zdGFsbCBiZmQuaC4KLQotV2VkIE5vdiAgNCAxMzo0MDoyMyAxOTkyICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9vdXQsIGNvZmZfc3dhcF9hdXhfaW4pOiAgY2hlY2sgZm9yCi0Jc3ltYm9sIHR5cGUgYmVmb3JlIGJsaW5kbHkgbW9kaWZ5aW5nIHRoZSBhdXhlbnQuICBTcGVjaWZpY2FsbHksCi0Jb25seSBtb2RpZnkgdGhlIGVuZG5keCBmaWVsZHMgZm9yIHR5cGVzIHRoYXQgbmVlZCBpdCwgYW5kIGRvbid0Ci0Jc2V0IHRoZSBhcnJheSBpbmZvcm1hdGlvbiBmb3Igbm9uLWFycmF5cy4KLQotV2VkIE5vdiAgNCAwOTozMDo1MCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogU2VjdGlvbiBsaXN0IHNob3VsZCBiZSBzZXQgdXAKLQljb3JyZWN0bHkgYW55d2F5czsgZG9uJ3QgaGF2ZSB0byBzZXQgdXAgIm5leHQiIHBvaW50ZXJzIG1hbnVhbGx5LgotCi1Nb24gTm92ICAyIDEyOjM2OjE0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlbHRhODgubWgsIGNvbmZpZy9ocDMwMC5taCwgY29uZmlnL2hwcGFocHV4Lm1oLAotCWNvbmZpZy9pMzg2di5taDogcmVtb3ZlZCAtRFVTRyBmcm9tIEhERUZJTkVTLgotCWhvc3RzL2RlbHRhODguaCwgaG9zdHMvaHAzMDAuaCwgaG9zdHMvaHBwYWhwdXguaCwgaG9zdHMvaTM4NnYuaDoKLQlkZWZpbmVkIFVTRV9VVElNRS4KLQlob3N0cy9pMzg2di5oOiBkb24ndCBkZWZpbmUgUE9TSVhfVVRJTUUuCi0KLUZyaSBPY3QgMzAgMTY6MTM6NTIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9ucyk6IG1ha2UgYSBwcml2YXRlIGNvcHkgb2YgdGhlCi0Jc2VjdGlvbidzIG5hbWUgYmVmb3JlIHRydW5jYXRpbmcgaXQuCi0KLVRodSBPY3QgMjkgMDg6MzA6NTAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogYWRkIHN5bWJvbF9sZWFkaW5nX2NoYXIgZW50cnkgaW4gdHJhbnNmZXIgdmVjCi0KLSxXZWQgT2N0IDI4IDE2OjExOjU3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGdldF9zeW1ib2wpOiBjYW4gbm93IGNvcGUgd2hlbiB0d28gc3ltYm9scyBvZiBhCi0JZGlmZmVyZW50IGNsYXNzLCBidXQgdGhlIHNhbWUgaW5kZXggbnVtYmVyIG9jY3VyIGNvbnNlY3V0aXZlbHkuCi0JKGdldF9zZWN0aW9uX2VudHJ5KTogbmljZXIgbmFtZSBmb3Igc2VjdGlvbnMgYmVpbmcgZm9yd2FyZAotCXJlZmVyZW5jZWQuIChpZWVlX2FyY2hpdmVfcCk6IGRvbid0IGZyZWUgdGhlIGZpbGVuYW1lIHN0cmluZywKLQlzaW5jZSBpdCB3YXMgbmV2ZXIgbWFsbG9jZWQuCi0KLVdlZCBPY3QgMjggMTM6NDI6MDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIFplcm8gdGltZXN0YW1wIGZpZWxkLgotCi1UdWUgT2N0IDI3IDEyOjI0OjM0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9vdXQpOiBzZXQgdGhlIGZjbmFyeSBpbmZvIGJlZm9yZQotCW9wdGlvbmFsbHkgc2V0dGluZyB0aGUgZGltZW4gaW5mbywgc2luY2UgdGhleSBhcmUgaW4gdGhlIHNhbWUKLQltZW1vcnkgbG9jYXRpb25zLiAgQWxzbyB6ZXJvIG91dCBleHRlcm5hbCBhdXhlbnQuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogZG9uJ3QgemVybyBleHRlcm5hbCBhdXhlbnQ7IG5vdyBkb25lIGluCi0JY29mZl9zd2FwX2F1eF9vdXQuCi0KLUZyaSBPY3QgMjMgMTM6NTU6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBDaGVjayBmY2xvc2UgcmV0dXJuIHZhbHVlIGZvciBlcnJvcnMuCi0JbGliYmZkLmg6IGJmZF9jYWNoZV9jbG9zZSBub3cgcmV0dXJucyBhIGJvb2xlYW4uCi0JY2FjaGUuYyAoYmZkX2NhY2hlX2RlbGV0ZSk6IHJldHVybiBmY2xvc2Ugc3VjY2VzcyB2YWx1ZS4KLQkoYmZkX2NhY2hlX2Nsb3NlKTogcmV0dXJuIGJmZF9jYWNoZV9kZWxldGUgcmV0dXJuIHZhbHVlLgotCW9wbmNscy5jIChiZmRfY2xvc2UsIGJmZF9jbG9zZV9hbGxfZG9uZSk6IHJldHVybiByZXN1bHQgb2YKLQliZmRfY2FjaGVfY2xvc2UuCi0KLUZyaSBPY3QgMjMgMTA6MzI6MzYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNlY2xldC5jIChyZWwpOiBkb24ndCBsb2FkIHNlY3Rpb25zIHdpdGhvdXQgdGhlIFNFQ19MT0FEIGJpdC4KLQotVGh1IE9jdCAxNSAxMDoxNjozNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmMgKG02OGtfaG93dG8ydHlwZSwgU0VMRUNUX1JFTE9DKTogbmV3IGZ1bmN0aW9uIHRvCi0Jd29yayBvdXQgYSBjb2ZmIHJlbG9jYXRpb24gdHlwZSBmcm9tIGEgaG93dG8ncyBhdHRyaWJ1dGVzIHJhdGhlcgotCXRoYW4gdXNpbmcgdGhlIGlucHV0IHJfdHlwZSBmaWVsZC4gVGhpcyBmaXhlcyBQUjE2NzcgYW5kIGFsbG93cwotCWNvbnZlcnNpb24gb2YgYS5vdXQgcmVsb2NzIHRvIGNvZmYgcmVsb2NzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IGlmIHN1cHBsaWVkIGEgcmVsb2NhdGlvbgotCXJlbGF0aXZlIHRvIGFuIGFic29sdXRlIHN5bWJvbCwgdXNlIHRoZSByaWdodCBzeW1ib2wgaW5kZXguCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBkbyBhIHBhcnRpYWwgbGluayBmb3IgY29mZgotCXJlbG9jcyByaWdodC4KLQotRnJpIE9jdCAyMyAwODoxNTo1NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNoYW5nZXMgdG8gc3VwcG9ydCBpMzg2LXN5c3Ygd2l0aCBzaGFyZWQgbGlicmFyaWVzOgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBpZiBUV09fREFUQV9TRUNTIGlzIGRlZmluZWQsCi0JY2hlY2sgZm9yIC5kYXRhMjsgaWYgX0xJQiBpcyBkZWZpbmVkLCBjaGVjayBmb3IgaXQ7IG1hcAotCVNFQ19ORVZFUl9MT0FEIHRvIFNUWVBfTk9MT0FELgotCShzdHlwX3RvX3NlY19mbGFncyk6IG1hcCBTVFlQX05PTE9BRCB0byBTRUNfTkVWRVJfTE9BRC4KLQkobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogaWYgVFdPX0RBVEFfU0VDUywgYWNjZXB0IC5kYXRhMi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBmb3JjZSB2YWRkciBvZiAubGliIHRvIDA7IHNldCBzY25wdHIKLQlpZiBzZWN0aW9uIGhhcyBjb250ZW50cywgbm90IGp1c3QgaWYgaXQgaXMgbG9hZGFibGU7IGlmCi0JVFdPX0RBVEFfU0VDUywgY2hlY2sgZm9yIC5kYXRhMgotCShjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogc2V0IHZtYSBvZiAubGliIHNlY3Rpb24gdG8gbnVtYmVyIG9mCi0JLmxpYiBzZWN0aW9ucy4KLQkqIGNvZmYtaTM4Ni5jOiBkZWZpbmUgVFdPX0RBVEFfU0VDUzsgdXNlIGEgc3BlY2lhbCBDQUxDX0FEREVORDsKLQlkb24ndCBkZWZpbmUgY29mZl93cml0ZV9hcm1hcCB0byBic2Rfd3JpdGVfYXJtYXAuCi0JKiBob3N0cy9pMzg2di5oOiBkb24ndCBpbmNsdWRlIDx1dGltZS5oPiwgc2luY2UgaXQgaXMgbm90IHByb3ZpZGVkCi0JYnkgU1ZSMy4yLgotCi1UaHUgT2N0IDIyIDIyOjQwOjIwIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogc29sYXJpczIuaDogR2V0IHRoZSBkZWZpbml0aW9uIG9mIGFsbG9jYSBmcm9tIGFsbG9jYS5oIGlmIHdlCi0JYXJlbid0IHVzaW5nIGdjYy4KLQotVGh1IE9jdCAyMiAwMzowNzoyOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpOTYwLSote2FvdXQsYm91dH0pOiAgU3VwcG9ydCB0aGVzZS4KLQotV2VkIE9jdCAyMSAwMzo0NjozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2EyOWstYW91dC5tdCAoREVGQVVMVF9UQVJHRVQpOiAgU2V0IHRvIG9uZSB0aGF0IGV4aXN0cy4KLQotVGh1IE9jdCAxNSAxNTowNTozOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXBvbGxvNjguaCwgYXBvbGxvdjY4LmgsIGhwMzAwLmgsIGkzODZ2LmgsIGlyaXgzLmg6IFJlbW92ZQotCW5vLWxvbmdlci11c2VkIGRlZmluaXRpb25zIG9mIExfU0VUIGFuZCBMX0lOQ1IuCi0JKiBpMzg2bGludXguaDogIFR3ZWFrcyB0byBzbW9vdGggTGludXggYnVpbGQuCi0KLVRodSBPY3QgMTUgMDE6MzI6MjIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHNlY2xldC5oOiAgQWRkIGVudW0gdGFnIHRvIGJmZF9zZWNsZXRfZW51bV90eXBlLgotCi0JKiBiZmQtaW4uaCAoZmlsZV9wdHIpOiAgVXBkYXRlIGNvbW1lbnRzLCBtYWtlIEZJWE1FIHJlIG9mZl90LgotCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXRmMS5oLCBhcmNoaXZlLmMsIGJvdXQuYywgY29mZi1yczYwMDAuYywKLQljb2ZmY29kZS5oLCBlbGYuYywgaWVlZS5jLCBsaWJhb3V0LmgsIGxpYmJmZC5jLCBvYXN5cy5jLAotCXNjby1jb3JlLmM6ICBMaW50OiAgU2Vjb25kIGFyZ3VtZW50IG9mIGJmZF9zZWVrIGlzIGFsd2F5cyBmaWxlX3B0ci4KLQlUaGlyZCBhcmd1bWVudCBpcyBTRUVLX1NFVCBvciBTRUVLX0NVUi4gIFJlc3VsdCBpcyBhbHdheXMgMCBvciAtMS4KLQotCSogYW91dC1hZG9iZS5jLCBhb3V0ZjEuaCwgYW91dHguaCwgYm91dC5jIGNvZmYtbTY4ay5jLCBjb2ZmLXo4ay5jLAotCWNvZmZjb2RlLmgsIGVsZi5jLCBsaWJhb3V0LmgsIGxpYmJmZC1pbi5oLCBzcmVjLmM6ICBMaW50LgotCi1GcmkgT2N0ICA5IDAzOjQ2OjM3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogIE5ldyBmaWxlLCBjb250YWlucyBtYXBwaW5nIG9mIGhvc3QgY29uZmlncwotCXRvIGhvc3Qgc3VwcG9ydCBmaWxlIG5hbWVzIGZvciBiZmQsIGJpbnV0aWxzLCBvcGNvZGVzLgotCSogY29uZmlndXJlLmluOiAgVXNlIGl0LgotCSogaTM4NmFvdXQuYzogIENsZWFudXAsIGR1bXAgVEFSR0VUX0lTX0xJVFRMRV9FTkRJQU5fUC4KLQkqIGkzODZic2QuYzogIENsZWFudXAsIHJlZm9ybWF0LgotCSogY29uZmlnL2kzODYtYnNkLm10OiAgQ29tbWVudCBjaGFuZ2VzLgotCSogY29uZmlnL2kzODZic2QubWg6ICBOZXcgZmlsZSBmb3IgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBob3N0cy9pMzg2YnNkLmg6ICBNZXJnZSBjaGFuZ2VzIGZyb20gUGV0ZXIgU2NoYXVlci4KLQkqIGJvdXQuYyAoQUxJR04pOiAgUmVuYW1lIHRvIEFMSUdORVIsIHNpbmNlIHN5c3RlbSBoZWFkZXIgZmlsZXMKLQlvbiBCU0QgNC40IGRlZmluZSBBTElHTiAoc2lnaCEpLgotCi1UaHUgT2N0ICA4IDIyOjE4OjEwIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChhb3V0X2JhY2tlbmRfZGF0YSk6IGFkZGVkIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0JZmllbGQuIEZvciBaTUFHSUMgZmlsZXMgb25seSwgd2hlbiB0ZXh0X2luY2x1ZGVzX2hlYWRlciBpcyBzZXQsIGJ5Ci0JZGVmYXVsdCB0aGUgbGVuZ3RoIG9mIHRoZSBleGVjIGhlYWRlciBpcyBjb3VudGVkIGluIHRoZSB0ZXh0Ci0Jc2VjdGlvbiBzaXplLiBGb3IgZ28zMiwgZXhlYyBoZWFkZXIgaXMgbWFwcGVkIGluIGJ1dCBkb2VzICpub3QqCi0JY29udHJpYnV0ZSB0byB0aGUgc2l6ZSBvZiBzZWN0aW9uLgotCSogYW91dHguaCAoYW91dF9hZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiBpZiBleGVjX2hlYWRlcl9ub3RfY291bnRlZAotCWlzIG5vdCBzZXQsIGJ1dCB6dGloIGlzLCBhZGQgdGhlIHNpemUgb2YgdGhlIGV4ZWMgaGVhZGVyIHRvIHRoZQotCXJlY29yZGVkIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbi4KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogY2xlYXIgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQuCi0JKiBpMzg2YW91dC5jIChpMzg2YW91dF9iYWNrZW5kX2RhdGEpOiBzZXQgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQuCi0JQWxzbyBzZXQgdGV4dF9pbmNsdWRlc19oZWFkZXIuCi0JKiBhb3V0LXRhcmdldC5oICgqX2JhY2tlbmRfZGF0YSk6IGNsZWFyZSBleGVjX2hlYWRlcl9ub3RfY291bnRlZAotCWJ5IGRlZmF1bHQgaW4gTVkoYmFja2VuZF9kYXRhKS4KLQotVGh1IE9jdCAgOCAxODoxMjo0OSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoY2FsbGJhY2spOiBEb24ndCBkZWZpbmUgdGhpcyBmdW5jdGlvbiBpZiBpdCB3b24ndCBiZQotCXVzZWQuCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IFJlc3RvcmUgb2xkIGFvdXRfZGF0YSB2YWx1ZSBpZiB0aGlzCi0JdHlwZSBkb2Vzbid0IG1hdGNoLiAgRG9uJ3QgbG9zZSBpZiBmaWxlIHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCi0JY3JlYXRlZC4KLQkoc2V0X2FyY2hfbWFjaCk6IFNldCByZWxvY19lbnRyeV9zaXplLgotCShzbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgYmZkX2hfZ2V0X3sxNiw4fSBmb3IgcmVhZWRpbmcgc3ltYm9sIGRhdGEuCi0KLQkqIGhvc3RzL2kzODZic2QuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpWzM0XTg2LSotYnNkIGhvc3QuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKGNhbGxiYWNrLCB3cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWxldGUgdW51c2VkCi0JdmFyaWFibGVzLgotCi0JKiBhb3V0eC5oIChyZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogVXNlIGl0IGFzIGRlZmF1bHQuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3JlbG9jX3R5cGVfbG9va3VwKTogRGVsZXRlZC4KLQkoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBEb24ndCBkZWZpbmUgaXQuCi0KLQkqIGFvdXR4LmggKGFkanVzdF9zaXplc19hbmRfdm1hcyk6IERvbid0IGJvdGhlciB3aXRoIHBhZGRpbmcgZm9yCi0JT01BR0lDIGZpbGVzLgotCShzbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgaGVhZGVyIGJ5dGUgb3JkZXIsIG5vdCB0YXJnZXQgYnl0ZQotCW9yZGVyLCBmb3IgcmVhZGluZyBzeW1ib2wgZGF0YS4KLQotVGh1IE9jdCAgOCAxNzozMzozOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgVW5kbyBzb21lIGJyYWluIGRhbWFnZSBpbiB0aGUgaG9zdCBzZWN0aW9uLgotCSogY29uZmlndXJlLmluOiAgUmVmb3JtYXQgdGhlIHRhcmdldCBzZWN0aW9uLCB0ZXN0IG1hbnkgY29uZmlncy4KLQkqIE1ha2VmaWxlLmluIChtYWtlKTogIFJlbW92ZSBvYnNvbGV0ZSBgbWFrZSBtYWtlJy4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBNYWtlIGRlZmluZXMgbGluZSB1cC4KLQotVGh1IE9jdCAgOCAwODo1Mjo0OCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCU5vdyBhIGJmZCBrbm93cyB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZSBub3JtYWxseSBwcmVwZW5kZWQKLQl0byBzeW1ib2xzIGluIGl0cyBmaWxlIGZvcm1hdC4KLQotCSogYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBib3V0LmMsIGNvZmYtYTI5ay5jLCBjb2ZmLWg4MzAwLmMsCi0JY29mZi16OGsuYzogdGFyZ2V0cyBzZXQgc28gdGhleSBoYXZlIGxlYWRpbmcgdW5kZXJzY29yZQotCSogY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1taXBzLmMsIGNvZmYtbTg4ay5jLAotCWNvZmYtcnM2MDAwLmMsIGNvZmYtd2UzMmsuYywgZWxmLmMsIGllZWUuYywgc3JlYy5jOiB0YXJnZXRzIHNldAotCXdpdGhvdXQgbGVhZGluZyB1bmRlcnNjb3JlIGZsYWcKLQkqIHRhcmdldHMuYzogYWRkIHN5bWJvbCBsZWFkaW5nIGNoYXIgdG8geHZlYyBkZXNjcmlwdGlvbgotCSogYmZkLWluLmggKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcik6IG5ldyBtYWNyby4KLQotTW9uIE9jdCAgNSAxNDozMjo1NSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jOiAgTWFrZSBlcnJubyBnbG9iYWwuCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6ICBJZiByZWFkIGZhaWxzIChhbmQKLQllcnJubyE9MCkgc2V0IGJmZF9lcnJvciB0byBtYWxmb3JtZWRfYXJjaGl2ZSAoc2luY2UgdGhpcyBwcm9iYWJseQotCWluZGljYXRlcyBhIHRydW5jYXRlZCBhcmNoaXZlKSwgcmF0aGVyIHRoYW4gc3lzdGVtX2NhbGxfZXJyb3IuCi0KLU1vbiBPY3QgIDUgMDM6MzM6MzkgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgcnVsZXMgZm9yIGkzODZic2QuYwotCSogaTM4NmJzZC5jOiBuZXcgZmlsZSwgc3VwcG9ydGluZyAzODZic2QuCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBpMzg2LSotYnNkIHRhcmdldC4KLQkqIGNvbmZpZy9pMzg2LWJzZC5tdDogbmV3IGZpbGUgLSAzODZic2QgdGFyZ2V0IGNvbmZpZ3VyYXRpb24uCi0KLVRodSBPY3QgIDEgMTc6NTE6MDcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlLWFycmFuZ2UgaG9zdCBzZWN0aW9uIHRvIHVzZSAqLSotKiBub3RhdGlvbiwKLQljbGVhbiB1cCBzb21lIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBhcyB3ZWxsCi0KLQkqIHNlY2xldC5jOiBjYXN0IHJlc3VsdCBvZiBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHRvCi0JYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLQotVHVlIFNlcCAyOSAxMzoyNDowOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZWN0aW9uX3N5bWJvbCk6IENyZWF0ZSBzZWN0aW9uIGlmIGl0IGRvZXNuJ3QKLQlhbHJlYWR5IGV4aXN0LgotCi0JKiBib3V0LmM6IFJlbW92ZWQgc29tZSB1bnVzZWQgdmFyaWFibGVzLgotCi1UdWUgU2VwIDI5IDA4OjMwOjIxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogUG9ydGFiaWxpdHkgZml4ZXMgZnJvbSBwMzoKLQljb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IHJlbW92ZWQgc2FuaXR5IGNoZWNrIHVudGlsIGl0Ci0Jd29ya3Mgb24gYWxsIHRhcmdldHMgKHBlciBhZHZpY2UgZnJvbSBzYWMpLgotCWNvbmZpZy9ocDkwMDAubWg6IG5ldyBmaWxlIHRvIGRlZmluZSBVU0cuCi0JaHBwYS5jOiAjdW5kZWYgaHBwYSBiZWZvcmUgdGhlIEpVTVBfVEFCTEUuCi0JaG9zdHMvaHBwYWhwdXguaDogI2RlZmluZSBOQVRJVkVfSFBQQUhQVVhfQ09NUElMRVIgaWYgbm90Ci0JX19TVERDX18uCi0JdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2xpc3QpOiBpZiBOQVRJVkVfSFBQQUhQVVhfQ09NUElMRVIsIG1ha2UKLQlsb2NhbCB2YXJpYWJsZSB0YXJnZXQgdm9sYXRpbGUgdG8gYXZvaWQgbXlzdGVyaW91cyBidWcgaW4KLQlIUDkwMDAvNzAwIGNjLgotCi1TYXQgU2VwIDI2IDAzOjU4OjQ5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaHBwYWJzZC5taCwgY29uZmlnLmhwcGFocHV4Lm1oOiAgUmVtb3ZlIHZhcmlvdXMgYm9nb3NpdHkuCi0JKiBob3N0cy9ocHBhaHB1eC5oOiAgUmVtb3ZlIGJjb3B5IGFuZCBpbmRleCBjaXJjdW12ZW50aW9ucy4KLQotRnJpIFNlcCAyNSAyMjozNjo1MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29mZi16OGsuYyAoZnVuY19kYSwgZnVuY19qcik6ICBMaW50LgotCSogY29mZmNvZGUuaDogIFVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCi0JKiBlbGYuYzogIFVzZSBtZW1jcHkgcmF0aGVyIHRoYW4gYmNvcHkuCi0JKiB0ZWtoZXguYzogIFVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCi0KLUZyaSBTZXAgMjUgMTk6MTQ6NDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlBZGQgQWRvYmUgYS5vdXQgc3VwcG9ydC4KLQotCSogYW91dC1hZG9iZS5jOiAgTmV3IGZpbGUuICBTbyBmYXIsIG9ubHkgcmVhZHMgYS5vdXQuYWRvYmUuICBGSVhNRS4KLQkqIGNvbmZpZy9hZG9iZS5tdDogIEFkZC4KLQkqIGNvbmZpZ3VyZS5pbiAoKi1hZG9iZS0qIHRhcmdldCk6ICBBZGQuCi0JKiB0YXJnZXRzLmMgKGFfb3V0X2Fkb2JlX3ZlYyk6ICBBZGQuCi0JKiBNYWtlZmlsZS5pbjogIGFkZCBhb3V0LWFkb2JlLmMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFB1dCB0d28gZGFzaGVzIGluIGFsbCBlbnRyaWVzIHRvIGJlIG1hdGNoZWQuCi0JQWRkIGNvbW1lbnRzIHRvIHJlbWluZCBwZW9wbGUgdG8gZG8gdGhpcy4KLQlSZW9yZGVyIGFsbCBlbnRyaWVzIHRoYXQgbWF0Y2ggbWFudWZhY3R1cmVyIG5hbWVzLCB0byBvY2N1cgotCWxhc3QsIHNvIHRoZXkgd2lsbCBvbmx5IGJlIG1hdGNoZWQgaWYgbm8gbW9yZSBzcGVjaWZpYyBtYXRjaAotCW9jY3Vycy4gIFJlbW92ZSBtYW51ZmFjdHVyZXJzIGBhb3V0JywgYGJvdXQnLCBgY29mZicsIGFuZCBgZWxmJy4KLQotRnJpIFNlcCAyNSAxNTowMzoyMiAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBSZXR1cm4gYmZkX2Fic19zZWN0aW9uLCBub3QgMCwKLQlzaW5jZSB3ZSBzaG91bGQgbmV2ZXIgaGF2ZSBhIE5VTEwgc2VjdGlvbi4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIHN0X3NobmR4IGRvZXNuJ3QgbWF0Y2ggYW55IG9mIG91cgotCXRlc3RzLCBzZXQgdGhlIHNlY3Rpb24gdG8gYmZkX2Fic19zZWN0aW9uLgotCi1GcmkgU2VwIDI1IDExOjExOjU3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXo4ay5jOiBnZXR0aW5nIGNsb3NlcgotCSogY29mZmNvZGUuaCAoY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBhbGxvdwotCUVYVFJBX0NBU0VTIGhvb2tzIGZvciBkaWZmZXJlbnQgYXJjaGVzIHRvIHByb3ZpZGUgZGlmZmVyZW50IHJlbG9jCi0JdHlwZXMuCi0JKiBzZWNsZXQuaDogI2lmbmRlZiBhcm91bmQgaXQgdG8gYWxsb3cgbXVsdGlwbGUgaW5jbHVzaW9uCi0JKiBzcmVjLmM6IG1pbm9yIGRvYyBmaXgKLQotTW9uIFNlcCAyMSAxNDozMzo1OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2hwOTAwMC5oLCBob3N0cy9pcml4My5oOiBjaGFuZ2VzIGZyb20gV1JTLgotCi1TdW4gU2VwIDIwIDA4OjQ4OjI1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBVc2UgaTM4Ni1lbGYgZm9yIGFsbCBpMzg2L2k0ODYgc3lzdjQgaG9zdHMsIG5vdAotCWp1c3QgbmNyLgotCi1UaHUgU2VwIDE3IDA2OjQwOjQ2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSk6IENsZWFyIGhvd3RvIGZpZWxkIGJlZm9yZQotCWZpbGxpbmcgaW4gcmVsb2MsIGluIGNhc2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNvZGUgZG9lc24ndCBzZXQKLQlpdC4KLQotRnJpIFNlcCAxMSAxNTozNzowNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IHNldCB0aGUgbGFzdCByZW51bWJlcmVkCi0Jc3ltYm9sIHBvaW50ZXIgdG8gTlVMTCwgYXMgZXhwZWN0ZWQgYnkgY29mZl93cml0ZV9saW5lbnVtYmVycy4KLQkoY29mZl93cml0ZV9yZWxvY3MpOiBhcHBhcmVudGx5IGEgbm9uLXplcm8gYWRkZW5kIGlzIE9LIGZvciByZWxvYwotCXR5cGUgUl9JSENPTlNUIHVzZWQgb24gdGhlIDI5ay4KLQotVGh1IFNlcCAxMCAxMzoyODoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIERldGVybWluZSB3aGV0aGVyIHRvIGZkb3BlbiBmb3IKLQl1cGRhdGUsIGJhc2VkIG9uIGhvdyB0aGUgdW5kZXJseWluZyBmaWxlIHdhcyBvcGVuZWQuICBPYnNvbGV0ZXMKLQlGQVNDSVNUX0ZET1BFTi4KLQkqIGhvc3RzL3JzNjAwMC5oLCBob3N0cy90YWhvZS5oLCBob3N0cy92YXhic2QuaDogIFJlbW92ZQotCWFsbCBGQVNDSVNUX0ZET1BFTiBjb25maWcgZGVmaW5lcy4KLQotVHVlIFNlcCAgOCAyMTozNzo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jOiBNb3ZlZCB0byBvcGNvZGVzIGxpYnJhcnksIG5vdyB0aGF0IHdlIGhhdmUgb25lLgotCSogTWFrZWZpbGU6IERvbid0IGNvbXBpbGUgaXQuCi0KLVR1ZSBTZXAgIDggMTA6MTA6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oOiBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMgZGlkIG5vdCByZXR1cm4gYW55dGhpbmcuCi0KLVRodSBTZXAgIDMgMTk6Mjk6MDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9mbGFncyk6ICBSZW1vdmUgYSBzYW5pdHkgY2hlY2suCi0JSXQgaXMgdW5mb3J0dW5hdGVseSBicm9rZW4sIGFuZCBwcmV2ZW50cyBzdHJpcCBmcm9tIHdvcmtpbmcuCi0KLVRodSBTZXAgIDMgMTY6MTQ6NDAgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYyAoY29uZHIpOiBSZW1vdmUgZXh0cmFuZW91cywgYnV0IGhhcm1sZXNzLCBiYWNrbGFzaAotCWNyZWF0ZWQgYnkgbGFzdCBjaGFuZ2UuCi0KLVRodSBTZXAgIDMgMTM6NTI6MzggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b19zdHJ1Y3QpOiAgTWFrZSBzaXplIGZpZWxkIGJlIHVuc2lnbmVkLgotCSogYmZkLWluLmg6ICBCdW1wIHRvIHZlcnNpb24gMi4wLgotCi1UaHUgU2VwICAzIDA5OjA1OjM3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYywgY3B1LXo4ay5jOiAgVXNlIGVudW1zIHdoZW4gaW5pdGlhbGl6aW5nIHN0cnVjdHMgdG8ga2VlcAotCWJyYWluZGFtYWdlZCBIUC9BcG9sbG8gY29tcGlsZXIgaGFwcHkuCi0KLVdlZCBTZXAgIDIgMDI6NTM6MjkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jOiAgRml4IGRlc2NyaXB0aW9uIG9mIHNlYXJjaCBmb3IgbWF0Y2hpbmcgdGFyZ2V0LgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIFNldCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEuCi0JKiB0YXJnZXRzLmM6ICBVcGRhdGUgZGVzY3JpcHRpb24gb2Ygc2VhcmNoIGZvciBtYXRjaGluZyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoZG9fY2xlYW4sIGNsZWFuKTogIEZpeCBpbmZhbnQgbW9ydGFsaXR5IHR5cG8uCi0JKGRvY2Rpcik6ICBTZXQgdG8gLi9kb2MsIG5vdCAke3NyY2Rpcn0vZG9jLCB3aGljaCBoYXMgbm8gbWFrZWZpbGUuCi0JKHo4ayBhbmQgd2UzMmsgZmlsZXMpOiAgYCoubzogKi5jJzogYXZvaWQgU3VuIE1ha2UgYnVnLgotCi1XZWQgU2VwICAyIDAwOjI2OjMyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBtb3N0bHljbGVhbi9jbGVhbi9kaXN0Y2xlYW4gcnVsZXMuCi0KLVR1ZSBTZXAgIDEgMTM6Mzg6NDAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBUYWtlIG91dCBvYXN5cyAodW5sZXNzIHRoYXQgaXMKLQl0aGUgZGVmYXVsdCk6ICBCZWNhdXNlIHRoZXJlIGlzIG5vIG1hZ2ljIG51bWJlciBpbiBhcmNoaXZlcywKLQl0aGVyZSBjYW4gYmUgYW5ub3lpbmcgdGFyZ2V0IG1pcy1tYXRjaGVzLgotCi1Nb24gQXVnIDMxIDEwOjExOjM3IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmM6IFJpZ29yb3VzbHkgdXBkYXRlZCB0byBtYXRjaCBhcmNoaXRlY3R1cmUgbWFudWFsLgotCi1Nb24gQXVnIDMxIDA4OjA3OjU4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0PG4+c3dhcF9leHRfcmVsb2Nfb3V0KSwgYm91dC5jCi0JKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogZml4IGJ1ZyAxNTA2IHdoZXJlIGFicyBzeW1ib2xzIGF0dGFjaGVkCi0JdG8gdGhlIGJ1aWx0LWluIGFic19zZWN0aW9uIHdlcmUgbm90IHdyaXR0ZW4gb3V0IGNvcnJlY3RseS4KLQotRnJpIEF1ZyAyOCAxNjoyOToxNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2JzZF9hcm1hcCk6IGlmIHRoZSBzeW1kZWZfY291bnQgaXMgdG9vCi0JbGFyZ2UsIGFzc3VtZSB3ZSdyZSB1c2luZyBhIHN3YXBwZWQgYnl0ZSBvcmRlciBhbmQgZmFpbCB3aXRoCi0Jd3JvbmdfZm9ybWF0IHJhdGhlciB0aGFuIGR1bXBpbmcgY29yZS4KLQotRnJpIEF1ZyAyOCAxNTozODowMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lZCBvcGMtc3BhcmMuYyB0byBzcGFyYy1vcGMuYyBmb3Igc3lzdGVtcyB3aXRoIHNob3J0Ci0JZmlsZW5hbWUgY29uc3RyYWludHMuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCB0byByZWZsZWN0IGNoYW5nZS4KLQotVGh1IEF1ZyAyNyAxMzowNToyOCAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JQWRkIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHRoZSB3ZTMyazoKLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvZmZvY29kZS5oLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYzoKLQlNaW5vciBlZGl0cy4KLQkqIGNvZmYtd2UzMmsuYywgY3B1LXdlMzJrLmMsIGNvbmZpZy93ZTMyay5tdCwgaG9zdHMvd2UzMmsuaDogTmV3IGZpbGVzLgotCi1XZWQgQXVnIDI2IDE0OjIwOjE2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBib3V0LmM6IGFkZGVkIHN1cHBvcnQgZm9yIHJlbGF4YWJsZSBhbGlnbm1lbnQgcmVsb2NzLgotCi0JKiBzZWNsZXQuYyAocmVsLCBzZWNsZXRfZHVtcF9zZWNsZXQsIHNlY2xldF9kdW1wKTogZ2V0IHRoZSBhcHAgdG8KLQlwYXNzIGRvd24gcG9pbnRlciB0byBwbGF5IGFyZWEgcmF0aGVyIHRoYW4gdXNlIGFsbG9jYQotCi0JKiBjcHUtejhrLmMgKGNvbXBhdGlibGUpOiBtYWRlIHN0YXRpYyB0byByZWR1Y2UgbmFtZSBzcGFjZQotCXBvbHV0aW9uLgotCi1UdWUgQXVnIDI1IDA4OjM5OjEwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgICAgIEFkZCBiYXNpYyBzdXBwb3J0IGZvciB0aGUgejhrOgotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgY29uZmlndXJlLmluLCByZWxvYy5jLAotCXNlY3Rpb24uYywgdGFyZ2V0cy5jLAotCi0JKiBzeW1zLmM6IG1vdmUgbWlzLWluc2VydGVkIHBhdGNoLgotCi1GcmkgQXVnIDE0IDE1OjM5OjI5IFBEVCAxOTkyICBIb3dhcmQgQ2h1ICAoaHljQGhhbmF1bWEuanBsLm5hc2EuZ292KQotCi0JRG9jdW1lbnRhdGlvbiBmaXhlczoKLQkqIGN0b3JzLmMsIGZvcm1hdC5jLCBzZWN0aW9uLmMsIHJlbG9jLmM6IGFwcGVuZCAiIC0iIHRvIGl0ZW0gdGFncy4KLQkqIHJlbG9jLmMsIHNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmM6IGFkZCBET0NERCBiZWZvcmUgQG5vZGUKLQkJY29tbWVudHMuCi0JKiByZWxvYy5jOiBicmVhayBvdXQgYWRkZW5kIGl0ZW0gZnJvbSBzdXJyb3VuZGluZyB0ZXh0LgotCi0JKiBkb2Muc3RyIChET0NERCk6IERlZmluZWQuIEFkZHMgdGV4dCB0byBvdXRwdXQuCi0JKGJvZHl0ZXh0KTogUHV0IGJ1bGxldGl6ZSBiZWZvcmUga2lsbF9ib2d1c19saW5lcy4KLQkqIGNoZXcuYyAoYnVsbGV0aXplKTogRW5kIGl0ZW1pemF0aW9uIGFmdGVyIGEgYmxhbmsgbGluZSwgdG8KLQlwcmV2ZW50IGZvbGxvd2luZyB0ZXh0IGZyb20gYmVpbmcgc3dhbGxvd2VkIHVwIGluIGFuIGl0ZW0uCi0KLU1vbiBBdWcgMjQgMjA6NTA6MjIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIHNwYXJjbGl0ZSBhcyBhIHRhcmdldC4KLQotTW9uIEF1ZyAyNCAxMjowNjozMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX2dldF9zeW10YWIpOiBhbHdheXMgbnVsbCB0ZXJtaW5hdGUgdGhlIHN5bWJvbCBsaXN0LAotCWxpbnQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IGlmIHN5bWJvbHMgZG9uJ3QgY29tZQotCWZyb20gYSBjb2ZmIGZpbGUgKGNzeW0gaXMgbnVsbCksIGRvbnQgZGVyZWYgdGhlbQotCi0JKiBpZWVlLmMgKHBhcnNlX2V4cHJlc3Npb24pOiBnZXQgdGhlIGFuc3dlciByaWdodCB3aGVuIGFkZGluZyBhbgotCWFicysoc2VjK29mZiksIChpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IGNhbGwgaWVlZV9vYmplY3RfcAotCW9uIGVsdHMgc28gdGhhdCBmaWxlbmFtZSBpcyBmaWxsZWQgaW4uCi0KLVRodSBBdWcgMjAgMTk6MDU6NDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoaG93dG9fYWxpZ25fdGFibGUpOiBOZXcgc2V0IG9mIHJlbG9jcywgd2l0aCBlbm91Z2gKLQlkYXRhIGZvciAib2JqZHVtcCAtciIgdG8gd29yay4KLQkoYl9vdXRfcmVsb2NfdHlwZV9sb29rdXApOiBSZWNvZ25pemUgYWxpZ25tZW50IHJlbG9jcy4KLQotVHVlIEF1ZyAxOCAxMjo1Nzo0NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLSAJKiBNYWtlZmlsZS5pbjogYWRkZWQgRkxBR1NfVE9fUEFTUywgYW5kIHVzZWQgaXQgZm9yIGFsbCByZWN1cnNpdmUKLQlpbnZvY2F0aW9ucyBvZiBtYWtlLiAgQWxzbywgYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24KLQlkaXJlY3Rvcmllcy4KLQotCSogY29uZmlnL2Fwb2xsb3Y2OC5taDogcmVtb3ZlZCAtZyBmcm9tIENDIGRlZmluaXRpb24uCi0KLU1vbiBBdWcgMTcgMTM6NDA6MDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWNzdGF0aW9uLm1oIChIREVGSU5FUyk6IFNwZWNpZnkgIi1HIDQiIHRvIGF2b2lkCi0Jb3ZlcmZsb3dpbmcgZ3Atb2Zmc2V0IHJhbmdlLgotCi1Nb24gQXVnIDE3IDExOjQ0OjI4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBkb24ndCB3cml0ZSBvdXQgc2VjdGlvbnMKLQl3aXRob3V0IHRoZSBMT0FEIGFuZCBBTExPQyBhdHRyaWJ1dGVzCi0KLU1vbiBBdWcgMTcgMTE6NTU6MDcgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jLCBjcHUtbTY4ay5jLCBjcHUtc3BhcmMuYzogVW5kbyAxNiBKdW5lIGNoYW5nZXMuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IE5ldyBjYWxsYmFjayAic2V0X3NpemVzIi4KLQkqIGFvdXQtdGFyZ2V0LmggKGNhbGxiYWNrKTogRG9uJ3Qgc2V0IHBhZ2Uvc2VnIHNpemVzLgotCShta29iamVjdCk6IERpdHRvLgotCShzZXRfc2l6ZXMpOiBOZXcgcm91dGluZS4KLQkoYmFja2VuZF9kYXRhKTogUG9pbnQgdG8gaXQuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3NldF9zaXplcyk6IEhlZWQgYXJjaGl0ZWN0dXJlIHdoZW4gc2V0dGluZyBzaXplcy4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IFBvaW50IHRvIGl0LgotCSogYW91dHguaCAoc2V0X2FyY2hfbWFjaCk6IENhbGwgc2V0X3NpemVzIGNhbGxiYWNrLgotCi1GcmkgQXVnIDE0IDE5OjIyOjE4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oOiAgTWFrZSBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmUKLQl0aGUgZGVmYXVsdC4gIEdpdmVuIHRoYXQgd2UgKndyaXRlKiB0aGUgc3Vja2VycyAoZm9yIGxvbmcKLQlhcmNoaXZlIG1lbWJlciBuYW1lcyksIHdlIHJlYWxseSBvdWdodCB0byBiZSBhYmxlIHRvIHJlYWQgdGhlbSEKLQkqIHRyYWQtY29yZS5jOiAgRG9uJ3QgaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4uICBJdCBkb2Vzbid0Ci0Jc2VlbSB0byBiZSBuZWVkZWQsIGFuZCBtYW55IG1hY2hpbmVzIGRvbid0IGhhdmUgaXQuCi0KLVRodSBBdWcgMTMgMDk6NTM6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jICh2ZWN0b3IpOiByZWFkIGFuZCB3cml0ZSBhcmNoaXZlcyBpbiBjb2ZmIGZvcm1hdC4KLQotVHVlIEF1ZyAxMSAxMjoxOTo0MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogb3BjLXNwYXJjLmM6IE5ldyBmaWxlLgotCi1TYXQgQXVnICA4IDIzOjE1OjM1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJmZF9yZWxvY19zdGF0dXNfdHlwZSwgY2FsbGpfY2FsbGJhY2spOiAgQ2FzdCB2b2lkKgotCXBvaW50ZXJzIHRvIGJmZF9ieXRlKiBiZWZvcmUgcGVyZm9ybWluZyBhcml0aG1ldGljIG9uIHRoZW0uICBTdWNoCi0JdXNlIHdpdGggYmFyZSB2b2lkKiBwb2ludGVycyBpcyBhIGdjYyBleHRlbnNpb24uCi0JKiBjYWNoZS5jIChiZmRfY2FjaGVfZGVsZXRlKTogIEZvcndhcmQgZGVjbCB3aXRoIHByb3RvdHlwZSBmb3JtLgotCSogYXJjaGl2ZSAobm9ybWFsaXplKTogIEFkZCB0byBDT05TVCB0byBtYXRjaCBhY3R1YWwgdXNhZ2VzIHdpdGgKLQlDT05TVC4KLQotTW9uIEF1ZyAgMyAwMDozNToyOSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIGk0ODYgaG9zdCBjcHUsIGFuZCB1c2UgaTM4Ni1lbGYKLQlmb3IgaTQ4Ni1uY3Itc3lzdjQuCi0KLVNhdCBBdWcgIDEgMTM6NDk6NTkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zdHJhdHVzLm10IChDQyk6ICBSZW1vdmUgZGVmaW5pdGlvbi4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgVGVzdCBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQKLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4IHJldHVybnMgTlVMTCBhbmQgZG9uJ3QgZGVyZWZlcmVuY2UgaXQuCi0KLU1vbiBKdWwgMjAgMDI6NDY6MDkgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBhZGQgaHBwYV9kYXRhIHRvIGJmZCB0ZGF0YSAoaW5kaXJlY3RseSB2aWEgc2VmKS4KLQotCSogY29uZmlnL2hwcGFocHV4Lm1oOiBocHV4IGlzIC1EVVNHIChwYXRjaCBieSBzZWYpCi0KLVNhdCBKdWwgMTggMTU6NTA6MTEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVyciwgbm90IHN0ZG91dAotCi1GcmkgSnVsIDE3IDE4OjMyOjQ2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMsIGNhY2hlLmMsIGNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsCi0JICBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsIGRlbW82NC5jLCBsaWJhb3V0LmgsIGxpYmJmZC5jLAotCSAgb2FzeXMuYywgb3BuY2xzLmMsIHN1bm9zLmMsIHRhcmdldHMuYzogcmVtb3ZlZCByY3NpZCdzLgotCi1GcmkgSnVsIDE3IDE3OjA2OjU2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaHBwYSogaW5zdGVhZCBvZiBocHBhCi0KLVRodSBKdWwgMTYgMTY6Mzk6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jOiBhZGRlZCBSX1JFTExPTkdfTkVHIHJlbG9jIHR5cGUsIGFuZCBjaGFuZ2VkCi0JUlRZUEUySE9XVE8gdG8gY29wZSB3aXRoIHNhbWUuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogYWRkZWQgc3VwcG9ydCBmb3Igc2l6ZSBvZiAtMgotCShzdWJ0cmFjdCBhIHdvcmQgcmVsb2MgdHlwZSkuIFVwZGF0ZWQgZG9jLgotCi1UaHUgSnVsIDE2IDE2OjI4OjA5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1lcmdlZCBjaGFuZ2VzIGZyb20gcHJvZ3Jlc3NpdmUsIHJlbW92ZWQgcmNzaWQuCi0KLQkqIGFyY2h1cmVzLmMsIGFyY2hpdmUuYywgTWFrZWZpbGUuZG9zOiByZW1vdmVkIHJjc2lkLgotCi1UaHUgSnVsIDE2IDA4OjA4OjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCA6IGFkZCBCRkRfSVNfUkVMQVhBQkxFIGZsYWcKLQkqIGJvdXQuYyAoYm91dF9zd2FwX2V4ZWNfaGVhZGVyX1tpbl9vdXRdKTogbmV3IGZpZWxkIGluIGV4ZWMKLQloZWFkZXIgZV9yZWxheGFibGUsIG1ham9yIGhhY2tlcnkgaW4gY2FsbGJhY2tzCi0JKiBsaWJhb3V0LmggOiBhZGQgc3BhY2UgZm9yIGFfcmVsYXhhYmxlLgotCSogc2VjbGV0LmMgKHJlbCk6IGRvbid0IHJlbGF4IGVtcHR5IHNlY3Rpb25zCi0KLQotV2VkIEp1bCAxNSAwNzo1Nzo0NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTVERfU0VDVElPTik6IGFkZCBzb21lIGNhc3RzIHRvIHRoZSBpbml0aWFsaXplcnMgZm9yCi0JZHVtYiBjb21waWxlcnMKLQotVHVlIEp1bCAxNCAxNDowNjoyOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBHcmVhdGx5IHNpbXBsaWZ5IGV4cHJlc3Npb24sCi0JYW5kIGFkZCBhcHByb3ByaWF0ZSBjYXN0cyB0byBrZWVwIChwaWNheXVuZSkgYWl4LWNjIGhhcHB5LgotCi1Nb24gSnVsIDEzIDA1OjA2OjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBOb3cgMm5kIGFyZyBpcyB3aGVyZSB0byB3cml0ZQotCXN5bWJvbCBwb2ludGVycy4gIFB1bnQgZXhwZW5zaXZlICYgdXNlbGVzcyBiZmRfcmVhbGxvYy4gIFVzZQotCW1hbGxvYyBmb3IgcmF3IHN5bWJvbHMsIGFuZCBmcmVlIGl0IGJlZm9yZSByZXR1cm5pbmcuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBEbyBub3Qgc2x1cnAgc3ltYm9sIHRhYmxlIHVudGlsIHBvbGl0ZWx5Ci0JYXNrZWQuIAlEbyBub3QgZXZlbiBzbHVycCBzdHJpbmcgdGFibGVzLgotCShlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6ICBDb3VudCAnZW0gd2l0aG91dCByZWFkaW5nIHRoZW0uCi0JKGVsZl9nZXRfc3ltdGFiKTogIFRoaXMgaXMgaG93IHRvIHBvbGl0ZWx5IGFzay4gIFNjaGx1cnAhCi0JVGhpcyBzaG91bGQgcHJvYmFibHkganVzdCAqYmVjb21lKiBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlLCBGSVhNRS4KLQotV2VkIEp1bCAgOCAxNjoyNDozMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiB3cml0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZQotCWFyY2hpdmUgaGVhZGVyIHRvIGJlIGp1c3QgYSBsaXR0bGUgYml0IGxhdGVyIHRoYW4gdGhlIHRpbWVzdGFtcCBvZgotCXRoZSBmaWxlLCBvdGhlcndpc2UgdGhlIGxpbmtlciB3aWxsIGNvbXBsYWluIHRoYXQgdGhlIGluZGV4IGlzCi0Jb3V0IG9mIGRhdGUuCi0KLVR1ZSBKdWwgIDcgMDA6MjM6MjMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG02OGstZXJpY3Nzb24tKi4KLQotU2F0IEp1bCAgNCAwMzoyOTo0MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltcy5oOiAgRGVmaW5lIEJTRl9GSUxFLCB1cGRhdGUgQlNGX1NFQ1RJT05fU1lNIGRlc2MuCi0JKiBlbGYuYzogIFJlbW92ZSB1bmNvbmRpdGlvbmFsIGRlYnVnIHByaW50ZidzLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEhhbmRsZQotCUJTRl9TRUNUSU9OX1NZTSA8PT4gU1RUX1NFQ1RJT04sIEJTRl9GSUxFIDw9PiBTVFRfRklMRS4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBIYW5kIG91dCBzeW1ib2xzIGluIGZvcndhcmQsIG5vdAotCXJldmVyc2Ugb3JkZXIuICBTaW1wbGlmeSBkdXBsaWNhdGUgY29kZS4KLQotRnJpIEp1bCAgMyAyMDoyMzozNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6ICBSZW1vdmUgIih2b2lkKSIgY2FzdHMgZnJvbSBmdW5jdGlvbiBjYWxscyB3aGVyZSB0aGUKLQlyZXR1cm4gdmFsdWUgaXMgaWdub3JlZCwgaW4gYWNjb3JkYW5jZSB3aXRoIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1UdWUgSnVuIDMwIDE2OjQ5OjEyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBocHBhLmM6ICBBcHBseSBKb2huJ3Mgc3RhbmRhcmQgZml4IHRvIGF2b2lkICJlbXB0eSB0cmFuc2xhdGlvbgotCXVuaXQiIHdhcm5pbmdzIGZyb20gc29tZSBBTlNJLUMgY29tcGlsZXJzLgotCi1UaHUgSnVuIDI1IDA0OjM5OjI1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9zb2xhcmlzMi5oOiAgQ29uZmlndXJlIHNhbWUgYXMgc3lzdjQuCi0KLVR1ZSBKdW4gMjMgMjE6NTQ6NDQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5oLCBsaWJiZmQtaW4uaCAoYmZkX3NlZWspOiAgTWFrZSBwcm90b3R5cGUgbWF0Y2ggZGVmaW5pdGlvbi4KLQkqIHJlbG9jLmMgKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKTogIE1ha2UgY2FzdCBvbiByZXR1cm4KLQl0eXBlIG1hdGNoIGFjdHVhbCByZXR1cm4gdHlwZS4KLQkqIGVsZl9wcmludF9zeW1ib2wgKHNlY3Rpb25fbmFtZSk6ICBNYWtlIENPTlNULgotCi1Nb24gSnVuIDIyIDE3OjM1OjI0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBpMzg2bGludXguYywgaG9zdHMvaTM4NmxpbnV4LmgsIGNvbmZpZy9pMzg2LWxpbnV4Lm10OgotCU5ldyBmaWxlcywgZm9yIExpbnV4IChhIGZyZWUgVW5peCBjbG9uZSBmb3IgMzg2IG1hY2hpbmVzKS4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYzogIFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotRnJpIEp1biAxOSAyMDoyMzoyMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQlMaW50cyBmb3IgYmZkX3JlbG9jX2NvZGVfdHlwZS0+YmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLCBhbmQKLQljb3JyZWN0IGNhbGxpbmcgb2YgaG93dG8gc3BlY2lhbCBmdW5jdGlvbnMgYW5kIGZpeGVzIGZyb20gUmFlYnVybgotCWZvciBnYXM8PmJmZG5lc3MKLQkqIGFyY2h1cmVzLmM6IG51a2UgYmZkX3JlbG9jX2NvZGVfdHlwZQotCSogYm91dC5jLCBjcHUtaDgzMDAuYywgY29mZi1pOTYwLmMsIGNvZmYtbTg4ay5jOiBzcGVjaWFsIGZ1bmN0aW9uIGxpbnQKLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogU1RZUF9JTkZPIGlzIG1hcmtlZCBhcwotCVNFQ19ORVZFUl9MT0FELCB2YXJpb3VzIG90aGVyIGJmZGdhcyBuZXduZXNzCi0JKiByZWxvYy5jLT5saWJiZmQuaDogY2hhbmdlIHByb3R5cGUgb2YgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLQkqIHRhcmdldHMuYzogY2hhbmdlIGp1bXAgdGFibGUgdmVjdG9yIHRvIGFib3ZlCi0KLQotRnJpIEp1biAxOSAxOTowMDo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogIE1hcmsgYXMgSU5URVJOQUxfRlVOQ1RJT04gc28KLQlpdHMgcHJvdG90eXBlIHdpbGwgYmUgaW5jbHVkZWQgaW4gbGliYmZkLmguICBDaGFuZ2UgcmVzdWx0IHR5cGUKLQl0byBzdHJ1Y3QgKiAocmF0aGVyIHRoYW4gZXF1aXZhbGVudCB0eXBlZGVmKSBzbyBpdCBjYW4gYmUgdXNlZCBpbgotCXRoZSBwcm90b3R5cGUsIHdoZXJlIHRoZXkgdHlwZWRlZiB3b24ndCBiZSBrbm93bi4KLQkqIGxpYmJmZC5oOiAgVXBkYXRlZCB2ZXJzaW9uLgotCi1GcmkgSnVuIDE5IDE1OjIxOjU2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb25maWd1cmUuaW4sIGNwdS1ocHBhLmMsIGhwcGEuYywgbGliaHBwYS5oLAotCXRhcmdldHMuYzogIEhQUEEgbWVyZ2UuCi0KLUZyaSBKdW4gMTkgMTI6MjE6MzggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFNlcGFyYXRlIFNvbGFyaXMyIGZyb20gU1lTVjQgb24gU1BBUkMuCi0JKiBjb25maWcvc29sYXJpczIubWg6ICBLbHVkZ2UgYXJvdW5kIFN1biBjb21waWxlciBidWcuCi0KLVdlZCBKdW4gMTcgMTQ6MDI6NDYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChhb3V0X2JhY2tlbmRfZGF0YSk6ICBDaGFuZ2UgZGVmcyBvZiB0d28gYml0ZmllbGRzIHRvCi0JYmUgdW5zaWduZWQgY2hhcnMgaW5zdGVhZCB0byBnZXQgYXJvdW5kIHJzNjAwMCBjb21waWxlciBwcm9ibGVtLgotCi1XZWQgSnVuIDE3IDEzOjU1OjMxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKToKLQlDb3JyZWN0IG1pc2NvbmNlcHRpb24gdGhhdCB0aGVyZSBjYW4gYmUgb25seSBvbmUgc3ltYm9sIHRhYmxlLgotCU9ubHkgY2FsbCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlIG9uIHRoZSBmdWxsIHN5bWJvbCB0YWJsZSwgbm90Ci0JdGhlIGR5bmFtaWMgb25lIHdoaWNoIGlzIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGZ1bGwgb25lLgotCi1XZWQgSnVuIDE3IDE1OjU0OjU3IDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvciBJOTYwLAotCWRvbid0IGFsaWduIHNlY3Rpb25zIGluIGZpbGUuCi0KLVR1ZSBKdW4gMTYgMDY6Mjg6MjEgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIHRhcmdldHMuYyAoc3RydWN0IGJmZF90YXJnZXQpOiBBZGRlZCBmaWVsZCBmb3IgdGFyZ2V0LXNwZWNpZmljCi0JKGJ1dCBub3QgZmlsZS1zcGVjaWZpYykgZGF0YSwgZm9yIGRpc3Rpbmd1aXNoaW5nIG1pbm9yCi0JY2hhcmFjdGVyaXN0aWNzIGJldHdlZW4gKGUuZy4pIGEub3V0IGZvcm1hdHMuCi0KLQkqIHNlY3Rpb24uYyAoc3RydWN0IHNlYyk6IE5ldyBmaWVsZCB1c2VyX3NldF92bWEgaW5kaWNhdGVzIHZtYQotCWZpZWxkIHNob3VsZCBiZSBoZWVkZWQsIG5vdCBhc3N1bWVkIHRvIGJlIHVuc2V0LgotCShTVERfU0VDVElPTik6IEluaXRpYWxpemUgdGhhdCBmaWVsZCBvZiBzdGFuZGFyZCBzZWN0aW9ucyB0byB6ZXJvLgotCSogYmZkLWluLmggKGJmZF9zZXRfc2VjdGlvbl92bWEpOiBTZXQgdXNlcl9zZXRfdm1hIHRvIHRydWUuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogV3JpdGUgb3V0IHN3YXBwZWQgcmVsb2MsIG5vdAotCXByZS1zd2FwcGVkIHZlcnNpb24uCi0KLQkqIGFyY2h1cmVzLmMgKHN0cnVjdCBiZmRfYXJjaF9pbmZvKTogRml4ZWQgb3JkZXIgb2YgY29tbWVudCBhbmQKLQlmaWVsZCBkZWNsLiAgTmV3IGZpZWxkcyBpbmRpY2F0ZSBzaXplIG9mIHBhZ2UgYW5kIHNlZ21lbnQgZm9yCi0JYXJjaGl0ZWN0dXJlLgotCSogY3B1LW02OGsuYyAoTik6IEZpbGwgaW4gdmFsdWVzLgotCSogY3B1LXNwYXJjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBEaXR0by4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBWYXJpb3VzIGJpdHMgb2YgZGF0YSAobm90Ci0JYWxsIHVzZWQgY3VycmVudGx5KSB3aXRoIGNoYXJhY3RlcmlzdGljcyBvZiBhLm91dCBpbXBsZW1lbnRhdGlvbi4KLQlJbXBvcnRhbnQgZmllbGQgZm9yIG5vdyBpcyB0ZXh0X2luY2x1ZGVzX2hlYWRlciwgaW5kaWNhdGluZyB0aGF0Ci0JdGhlIHRleHQgc2VjdGlvbiBzdGFydHMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZpbGUgaGVhZGVyLCB3aGljaAotCWdldHMgbWFwcGVkIGluIHdpdGggaXQuCi0JKHN0cnVjdCBhb3V0X2RhdGEpOiBOZXcgZmllbGRzIGluZGljYXRlIHdoZXRoZXIgdm1hIGhhcyBiZWVuCi0JYWRqdXN0ZWQgeWV0IChub3QgeWV0IHVzZWQpLCBhbmQgd2hhdCBtYWdpYyBudW1iZXIgd2lsbCBiZSB1c2VkIGluCi0JdGhlIG91dHB1dCBmaWxlIChzaG91bGQgZ28gYXdheSBpbiBmYXZvciBvZiB2bWFfYWRqdXN0ZWQpLgotCShXUklURV9IRUFERVJTKTogQ29kZSBmb3IgZGVhbGluZyB3aXRoIHNlY3Rpb24gc2l6ZXMgYW5kIHJlbGF0ZWQKLQloZWFkZXIgZmllbGRzIHJlcGxhY2VkIHdpdGggY2FsbCB0byBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBGaWxsIGluIG1hZ2ljIG51bWJlciBmaWVsZC4KLQlTZXQgV1BfVEVYVCBmbGFnIGZvciBaTUFHSUMgYXMgd2VsbCBhcyBOTUFHSUMgZmlsZXMuCi0JKHNldF9hcmNoX21hY2gpOiBTZXQgcGFnZSBzaXplIGFuZCBzZWdtZW50IHNpemUgb25jZSBDUFUKLQl0eXBlIGlzIGtub3duLgotCShhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiBOZXcgZnVuY3Rpb247IGhhcyBtdWNoIGNvZGUgbW92ZWQKLQlmcm9tIHNldF9zZWN0aW9uX2NvbnRlbnRzIGFuZCBXUklURV9IRUFERVJTLiAgU2V0cyBvciBhZGp1c3RzIHZtYQotCWFuZCBzaXplIHBhcmFtZXRlcnMsIGFzIHdlbGwgYXMgbWFueSBoZWFkZXIgZmllbGRzLCBhZnRlciBkZWNpZGluZwotCW9uIG1hZ2ljIG51bWJlciBmb3Igb3V0cHV0IGZpbGUuICBDaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhpcwotCWFkanVzdG1lbnQgaGFzIG9ubHkgYmVlbiBkb25lIG9uY2UuCi0JKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FsbCBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMgaW5zdGVhZCBvZgotCWRvaW5nIG11Y2ggb2YgdGhlIHdvcmsgaGVyZS4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfbWFrZV9kZWJ1Z19zeW1ib2wsIE1ZX2JhY2tlbmRfZGF0YSk6IFByb3ZpZGUKLQlkZWZhdWx0IChudWxsKSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzLgotCSogYW91dGYxLmggKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBvdmVycmlkZSBhX3RleHQKLQl2YWx1ZSBpbiBleGVjIGhlYWRlci4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCwgTVlfYmFja2VuZF9kYXRhKTogRGVmaW5lIGJhY2tlbmQgZGF0YQotCWluZGljYXRpbmcgZmlsZSBoZWFkZXIgaXMgaW5jbHVkZWQgaW4gdGV4dCBzZWN0aW9uLgotCi0JKiBhb3V0ZjEuaCAoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBGaXggdHlwby4KLQotCSogaG9zdHMvc3BhcmMuaCAoYWJvcnQsIGV4aXQpOiBIaWRlIHRoZXNlIG5hbWVzIGlmIGNvbXBpbGluZyB3aXRoCi0JZ2NjIHZlcnNpb24gMiwgdG8gYXZvaWQgd2FybmluZ3MuCi0KLU1vbiBKdW4gMTUgMTI6MjY6NTYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9uY3IzMDAwLm1oIChJTlNUQUxMLCBSQU5MSUIpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQncyBicm9rZW4gb24gbmNyIDMwMDAncy4gIFVzZSBzaW1wbGUgInRydWUiIGZvciBSQU5MSUIuCi0KLVNhdCBKdW4gMTMgMDk6MTY6NDMgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtNjgwWzAxMjM0XTAtd3JzLSopOiBGaXggdHlwbyBpbiBtYXRjaCBwYXR0ZXJuLgotCi1GcmkgSnVuIDEyIDE5OjQ4OjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogIFJlbW92ZSBleHRyYSBzZW1pY29sb24gaW4gZGVjbGFyYXRpb25zLgotCSogY29uZmlndXJlLmluOiAgUmV3cml0ZSB0YXJnZXQgcGFyc2luZyB0byB1c2Ugc2ltcGxlIGZvcm1hdC4KLQlIYW5kbGUgc3BhcmMtc3VuLXNvbGFyaXMyIGNvbmZpZ3VyYXRpb24uCi0JKiBhb3V0NjQuaDogIEF2b2lkIEFOU0kgQyBicmFpbiBkZWF0aCB3YXJuaW5nLgotCSogZWxmLmM6ICBBdm9pZCB0cmlncmFwaCAoPz8/KSBvciAvKiBpbiBjb21tZW50cy4KLQotRnJpIEp1biAxMiAxNDo1MToxNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zeXN2NC5taDogbmV3IGZpbGUsIFJBTkxJQj1lY2hvCi0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIFNvbGFyaXMyIGFzIC1zeXN2NCBvciAtc29sYXJpczIKLQotVGh1IEp1biAxMSAwMDo1MjowMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9vYmpfdGRhdGEpOiAgTWVyZ2UgZWxmX29ial90ZGF0YV9zdHJ1Y3QgYW5kCi0JZWxmX2NvcmVfdGRhdGFfc3RydWN0IGludG8gYSBzaW5nbGUgY29tbW9uIHN0cnVjdC4gIENvcmUgZmlsZXMKLQl3b3VsZG4ndCBoYXZlIHdvcmtlZCBhdCBhbGwgd2l0aG91dCB0aGlzLgotCShiZmRfZWxmX2ZpbmRfc2VjdGlvbik6ICBOZXcgZnVuY3Rpb24gZm9yIEdEQidzIHVuZGVyY292ZXIgdXNlCi0JdG8gZmluZCBzdHJpbmcgc2VjdGlvbnMgdGhhdCBCRkQgaGlkZXMgZnJvbSBpdC4KLQkoZWxmX2dldF9zdHJfc2VjdGlvbik6ICBBdm9pZCBtdWx0aXBsZSBhbGxvYyZyZWFkcyBmb3Igc2FtZSBkYXRhOwotCWxpbnQuCi0JKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIEFsbG9jYXRlIGludGVybmFsIGZpbGUgaGVhZGVyCi0Jc3RvcmFnZSBkeW5hbWljYWxseS4KLQkqIGJmZC5jICh1bmlvbiB7Li4ufSB0ZGF0YSk6ICBSZW1vdmUgZWxmX2NvcmVfdGRhdGFfc3RydWN0LgotCSogZGVtbzY0LmM6ICBQcmV2ZW50ICJlbXB0eSB0cmFuc2xhdGlvbiB1bml0IiB3YXJuaW5ncyBmcm9tIGlkaW90cy4KLQotVHVlIEp1biAgOSAxNzoxNToyNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3tpMzg2djQubWgsIG5jcjMwMDAubWh9OiAgVXBkYXRlIFJBTkxJQiwgYWRkIElOU1RBTEwuCi0KLVNhdCBKdW4gIDYgMTc6MDI6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBTb2xhcmlzMiBhcyAqLXN1bi1zeXN2NCBvciBhcyAqLXN1bi1zdW5vczUuCi0KLVN1biBNYXkgMzEgMDU6NDU6MDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBoYW5kbGUgbTY4MFswMTIzNF0wIGFzIGFsaWFzZXMgZm9yIG02OGsKLQotVHVlIE1heSAyNiAxNjo1MDo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hMjlrLmM6IGRvIGJ5dGUgcmVsb2NzIGNvcnJlY3RseQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBuZXZlciBsb2FkIElORk8gc2VjdGlvbnMKLQkqIHNlY2xldC5jIChyZWwpOiBkb24ndCByZWxvY2F0ZSBJTkZPIHNlY3Rpb25zCi0KLVdlZCBNYXkgMjAgMDg6MTg6MTggMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIHNlY3Rpb24uYyAoYmZkXypfc3ltYm9sLCBiZmRfKl9zZWN0aW9uKTogSW5pdGlhbGl6ZSBzdGF0aWNhbGx5LgotCU1ha2UgdGhlIHN5bWJvbHMgdW5tb2RpZmlhYmxlLgotCShiZmRfc2VjdGlvbl9pbml0KTogRGVsZXRlZC4KLQkqIGluaXQuYyAoYmZkX2luaXQpOiBEb24ndCBjYWxsIGJmZF9zZWN0aW9uX2luaXQuCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRW5zdXJlIHRoYXQgcmFuZ2UgdG8gYmUKLQl3cml0dGVuIGlzIHdpdGhpbiBzZWN0aW9uIGJvdW5kYXJpZXMuCi0JKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLiAgRG9uJ3QgYm90aGVyIGRpc3BhdGNoaW5nIGlmCi0Jc2l6ZSBpcyB6ZXJvLgotCi0JKiBsaWJiZmQuYyAoYmZkX3htYWxsb2MpOiBUZXh0IG9mIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIGNvbnN0LgotCi0JKiBjb2ZmLWk5NjAuYyAoaG93dG9fdGFibGUpOiBEZWxldGVkLgotCShob3d0b19yZWxsb25nLCBob3d0b19pcHJtZWQsIGhvd3RvX29wdGNhbGwpOiBOZXcgdmFyczsKLQlpbnRlcmVzdGluZyBlbnRyaWVzIGZyb20gb2xkIGhvd3RvX3RhYmxlLgotCShSVFlQRTJIT1dUTyk6IEFkanVzdGVkIHRvIHVzZSBzd2l0Y2guCi0JKGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogQWxsb2NhdGUgc3RvcmFnZSBmb3IgYXV4Ci0JcmVjb3JkcyBmb3Igc2VjdGlvbiBzeW1ib2wuCi0JKG1ha2VfYWJzX3NlY3Rpb24pOiBVbnVzZWQ7IGRlbGV0ZWQuCi0JKHJlbnVtYmVyX3N5bWJvbHMpOiBSZS1vcmRlciBzeW1ib2xzIHNvIHVuZGVmaW5lZCBzeW1ib2xzIGNvbWUKLQlsYXN0LCBhcyBDT0ZGIGZvcm1hdCBkZXNpcmVzLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IFB1dCBDX0ZJTEUgc3ltYm9scyBpbiBkZWJ1ZyBzZWN0aW9uIGFsd2F5cy4KLQkoY29mZl9zZWN0aW9uX3N5bWJvbCk6IE5ldyBmdW5jdGlvbjsgY3JlYXRlcyBhIHN5bWJvbCB3aXRoIHRoZQotCXNhbWUgbmFtZSBhcyBhIHNlY3Rpb24sIGFuZCBzZXRzIHVwIGF1eCByZWNvcmRzIGZvciBpdC4KLQkoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogTmV3IGZ1bmN0aW9uOyBhZGRzIHNlY3Rpb24gc3ltYm9scyB0bwotCXN5bWJvbCB0YWJsZSBpZiB0aGV5IGFyZW4ndCB0aGVyZSBhbHJlYWR5LiAgU2hvdWxkIHNvbWVkYXkgYWxzbwotCWFkZCBhIGR1bW15IENfRklMRSBzeW1ib2wgaWYgbm9uZSBpcyBwcmVzZW50LgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZCBtaXNzaW5nIHN5bWJvbHMgYmVmb3JlIHByZXBhcmluZwotCXN5bWJvbCB0YWJsZSB0byBiZSB3cml0dGVuLgotCShjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogVmVyaWZ5IHRoYXQgc3ltYm9sIGluZGljZXMgcmVhZCBpbiBhcmUKLQlpbiBhIHJlYXNvbmFibGUgcmFuZ2UuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3RkYXRhKTogTmV3IGZpZWxkIGNvbnZfdGFibGVfc2l6ZS4KLQkob2JqX2NvbnZfdGFibGVfc2l6ZSk6IEFjY2Vzc29yIG1hY3JvLgotCi0JKiBib3V0LmMgKGJfb3V0X3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLiAgSGFuZGxlcyB0aHJlZQotCXJlbG9jIHR5cGVzIG9uIGk5NjAuCi0KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSk6IE5ldyBtYWNyby4gIExpa2UKLQliZmRfc2VjdGlvbl9uYW1lLCBidXQgcmV0dXJucyBydmFsdWUsIG5vdCBsdmFsdWUuCi0JKGJmZF9nZXRfc2VjdGlvbl92bWEsIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQpOiBTaW1pbGFyLgotCShiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MpOiBOb3cgcmV0dXJucyBydmFsdWUuCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZCBzZXZlcmFsIG5ldyB2YWx1ZXMsIHNvbWUKLQlnZW5lcmFsLCBzb21lIHNwZWNpZmljIHRvIHNwYXJjIG9yIGk5NjAuCi0KLQkqIGFvdXR4LmggKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IFZNQSBmb3IgZWFjaCBzZWN0aW9uIGJhc2VkCi0Jb24gcHJldmlvdXMgc2VjdGlvbi4gIElmIHRleHQgc2VjdGlvbiBWTUEgZG9lc24ndCBhcHBlYXIgdG8gaGF2ZQotCWJlZW4gc2V0LCBtYWtlIGEgYmVzdCBndWVzcyBmcm9tIHRoZSB0eXBlIG9mIGZpbGUuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRGVmaW5lIGFzIHplcm8gaWYKLQlub3QgZGVmaW5lZC4KLQkoTVkodmVjKSk6IEluaXRpYWxpemUgcmVsb2NfdHlwZV9sb29rdXAgZmllbGQuCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlXyopOiBFeHBvcnQgYXMgYW91dF8jXypfaG93dG9fdGFibGUuCi0JKGJmZF9lcnJvcl90cmFwLCBiZmRfZXJyb3JfdmVjdG9yKTogRXh0ZXJuLCBub3QgY29tbW9uLgotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLiAgSGFuZGxlcyBhCi0JZmV3IHR5cGVzIG9mIHJlbG9jcyBmb3Igc3BhcmM7IHdpbGwgbmVlZCBlbmhhbmNlbWVudC4KLQotCSogYm91dC5jIChjYWxsal9jYWxsYmFjayk6IFVzZSBERUZVTiBtYWNybyBpbiBkZWZpbml0aW9uLgotCSogY29mZi1pOTYwLmMgKG9wdGNhbGxfY2FsbGJhY2spOiBMaWtld2lzZS4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkZWQgZmllbGRzIHJlbG9jX3R5cGVfbG9va3VwIGFuZAotCV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wuICBBbHNvIG1pbm9yIGNvbW1lbnQgY2hhbmdlcy4KLQkqIHN5bXMuYyAoYmZkX21ha2VfZGVidWdfc3ltYm9sKTogTmV3IGRpc3BhdGNoaW5nIG1hY3JvLgotCSogcmVsb2MuYyAoYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVGFrZSBhIEJGRCBwdHIgYXMgYXJnIHJhdGhlcgotCXRoYW4gYXJjaCBpbmZvLCBhbmQgZGlzcGF0Y2ggd2l0aCBCRkRfU0VORC4gIENhbGxlcnMgY2hhbmdlZC4KLQkqIGFyY2h1cmVzLmMgKHN0cnVjdCBiZmRfYXJjaF9pbmZvKTogRGVsZXRlZCBmaWVsZAotCXJlbG9jX3R5cGVfbG9va3VwLgotCSogY3B1LSouYzogRG9uJ3QgaW5pdGlhbGl6ZSB0aGF0IGZpZWxkLgotCi0JKiBiZmQtaW4uaCAoZW51bSBiZmRfZXJyb3IpOiBBZGQgbmV3IHZhbHVlICJiYWRfdmFsdWUiLgotCSogYmZkLmMgKGJmZF9lcnJtc2dzKTogTm93IGNvbnN0OyBhZGRlZCBlbnRyeSBmb3IgYmFkX3ZhbHVlLgotCShiZmRfZXJybXNnKTogTm93IHJldHVybnMgcHRyIHRvIGNvbnN0LgotCSogYmZkLWluLmggKGJmZF9lcnJtc2cpOiBGaXggcHJvdG90eXBlLgotCi0JKiBjYWNoZS5jIChCRkRfQ0FDSEVfTUFYX09QRU4pOiBGaXggdHlwbyBpbiBkb2MuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uKTogRGl0dG8uCi0KLQkqIHNlY3Rpb24uYyAoU2VjdGlvbiBPdXRwdXQgZG9jKTogSW1wcm92ZSBkZXNjcmlwdGlvbiBvZiB1c2Ugb2YKLQlvdXRwdXRfc2VjdGlvbiBhbmQgb3V0cHV0X29mZnNldC4KLQotVHVlIE1heSAxOSAyMzo0MjoxMCAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIHNjby1jb3JlLmM6IG5ldyBmaWxlIGZyb20gbmV0LgotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBidWdmaXggZnJvbSBuZXQ6Ci0JICBOb3cgd2UgaGF2ZSB0aGUgaGFpcnkgbGlua2VyLCBpdCdzIHBvc3NpYmxlIHRvIG1vdmUgc3ltYm9scyBmcm9tCi0JICBvbmUgc2VjdGlvbiBpbnRvIGFub3RoZXIuICBBY3R1YWxseSBtYWtlIHRoYXQgd29yayEKLQotU2F0IE1heSAxNiAxNzo1Nzo1OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogZml4IGRlY2xhcmF0aW9uIG9mIGZyZWUuCi0KLVR1ZSBNYXkgMTIgMTQ6MDg6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYTI5ay5jIChwZXJmb3JtX3JlbG9jKTogZml4IGJ1ZyBpbiBqbXAvY2FsbCBldmFsdWF0aW9uCi0JKiBjb2ZmLWg4MzAwLmMgKHJlbG9jX3Byb2Nlc3NpbmcpOiBhbGwgcmVsb2NzIGFyZSByZWxhdGl2ZSB0bwotCXNlY3Rpb24gc3RhcnQuCi0JKiBvcG5jbHMuYzogZG9uJ3QgdXNlIGZkb3BlbiBvbiBET1Mgc3lzdGVtcwotCi0Jc2hvcnQgcGF0Y2hlcyBmcm9tIEdsZW5uIEthc3RlbiAoZ2xlbm5AcmVhZHkuY29tKQotCSogdGFyZ2V0LmM6IGVuYWJsZWQgb2FzeXMgc3VwcG9ydAotCSogb2FzeXMuYzogIEluc2VydCAuIHdoZW4gVU5ERVJTQ09SRV9IQUNLIGlzIGVuYWJsZWQsCi0JZml4IHByb2JsZW0gd2hlcmUgYSByZWxvY2F0aW9uIHdoaWNoIGNyb3NzZWQgYSBtb2RpZmljYXRpb24gYnl0ZQotCWJvdW5kYXJ5IGRpZCBub3Qgd29yay4gRml4IHByb2JsZW0gd2hlcmUgYSByZWxvY2F0aW9uIG5lYXIgdGhlIGVuZAotCW9mIGEgZGF0YSByZWNvcmQgZGlkIG5vdCB3b3JrLgotCi0KLVR1ZSBNYXkgIDUgMTg6MTE6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2NvZmZfYXJtYXApOiBvbGQgdmVyc2lvbnMgb2YgQkZEIHdyb3RlCi0JYXJjaHZpZSBoZWFkZXIgc3RyaW5nIGNvdW50cyB0aGUgZW5kaWFuIHdheSwgdGhpcyBoZXVyaXN0aWMgc2VlcwotCWhvdyBiaWcgYW4gYXJjaGl2ZSBzdHJpbmcgdG8gcmVhZCBieSB0cnlpbmcgaXQgb25lIHdheSBhbmQgaWYgdGhlCi0Jc3RyaW5nIHRhYmxlIGlzIHVucmVhc29uYWJseSBiaWcsIHRyeWluZyBpdCB0aGUgb3RoZXIuICpGSVhNRSouCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBjYW4ndCBkbyBmZG9wZW5zIG9uIFZNUwotCi1UdWUgTWF5ICA1IDE0OjE4OjI0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6ICBJbmNyZWFzZSB2ZXJzaW9uIG51bWJlciB0byAxLjk3LCBmb3IgY29uc2lzdGVuY3kKLQl3aXRoIC4uL2JpbnV0aWxzLgotCSogTWFrZWZpbGUuaW46ICBkb2NkaXIgaXMgLi9kb2MsIG5vdCAke3NyY2Rpcn0vZG9jLgotCi1Nb24gTWF5ICA0IDExOjQ5OjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgICAgICogYmZkLWluLmg6IGJ1bXAgdmVyc2lvbiB0byAxLjk2Ci0gICAgICAgICBNYWpvciBjaGFuZ2U7IGNoYW5nZWQgY2FsbGluZyBjb252ZW50aW9uIGZvcgotCSBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHNvIHRoYXQgY2FsbGVyIGFsbG9jYXRlcwotCSBtZW1vcnkgZm9yIHNlY3Rpb24gZGF0YS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyksIHJlbG9jLmMsCi0Jc2VjbGV0LmMsIHRhcmdldHMuYywgYmZkLmM6IHJlZmxlY3QgbmV3IGNvbnZlbnRpb24uCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IGlmIHN0eXBfZmxhZ3MgaXMgbm90IGEgc3BlY2lhbAotCWNhc2UsIHRoZW4gdXNlIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMgZm9yIFNFQ18qIGZsYWdzLgotCi1GcmkgTWF5ICAxIDEyOjU4OjM0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHVzZSBSRUxTWiB0byB3b3JrIG91dAotCXNpemUgb2Ygb3V0cHV0IHJlbG9jIHN0cnVjdC4KLQkqIHRhcmdldHMuYywgTWFrZWZpbGUuaW46IGNvbW1lbnQgb3V0IHRla2hleCBmb3IgdGhlIG1vbWVudC4KLQkqIGllZWUuYzogaWYgc29tZSBwbGFjZXMgd2hlcmUgbnVsbCBwb2ludGVycyB3ZXJlIHVzZWQgaW5zdGVhZCBvZiAmYmZkX2Fic19zZWN0aW9uLgotCSogY29uZmlndXJlLmluOiB0YW5kZW0gdGFyZ2V0IGlzIHN0MjAwMAotCSogY29mZi1tNjhrLmM6IHJlbmFtZSBzdGF0aWMgaG93dG9fdGFibGUgdG8gZ2xvYmFsCi0JbTY4a2NvZmZfaG93dG9fdGFibGUuCi0JKiBib3V0LmM6IHJlbW92ZSB1bm5lY2Vzc2FyeSBhYm9ydAotCSogY29mZi1hMjlrLmM6IHZhcmlvdXMgY2hhbmdlcyB0byB0aGUgd2F5IHJlbG9jYXRpb25zIHdvcmsgdG8gY29wZQotCXdpdGggdGhlICJuZXcgb3JkZXIiIGFuZCBsYXRlbnQgYnVncy4KLQkqIGNvZmZjb2RlLmg6IGxpbnQKLQotV2VkIEFwciAyOSAxMjozNzowNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9zd2FwX2V4dF9yZWxvY19vdXQsIGFvdXRfc3dhcF9zdGRfcmVsb2Nfb3V0KQotCWJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiB0cmVhdCBhYnMgc3VtYm9scyB0aGUgcmlnaHQgd2F5LgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm0tcmVsb2NhdGlvbik6IGRvbid0IHJlbG9jYXRlIHJlZnMgdG8KLQlhYnNvbHV0ZSBzeW1ib2xzIGlmIGRvaW5nIGEgcGFydGlhbCBsaW5rLgotCi1GcmkgQXByIDI0IDA3OjM1OjI2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBhMjlrLWFtZC11ZGkuCi0KLVRodSBBcHIgMjMgMTg6Mzc6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfPGJpdHM+X3N3YXBfZXhlY19oZWFkZXJfaW4pOiAgWmVybyBvdXQgdGhlCi0JaW50ZXJuYWxfZXhlYyBzdHJ1Y3R1cmUgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgZmllbGRzIHRoYXQKLQlhcmUgdXNlZCwgc28gdGhhdCB0aGUgdW51c2VkIGZpZWxkcyBhcmUgaW4gYSBrbm93biBzdGF0ZS4KLQotV2VkIEFwciAyMiAwOTozNjowOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogdGVraGV4LmMgKHN0cnVjdCBkYXRhX3N0cnVjdCk6ICBDb252ZXJ0IGZyb20gdHlwZWRlZiB0aGF0Ci0JdHlwZWRlZnMgbm90aGluZyB0byBhIG5vcm1hbCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24uCi0JKiB0ZWtoZXguYyAocGFzc19vdmVyKTogIFByb3RvdHlwZSBhcmdzIGZvciBmdW5jdGlvbiB0aGF0Ci0Jc2Vjb25kIGFyZyBwb2ludHMgdG8uCi0KLU1vbiBBcHIgMjAgMjI6MjI6NTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIG9sZCBzdHlsZSBzdGFnaW5nLiAgRG8gbm90IHByaW50IHJlY3Vyc2lvbgotCSAgbGluZXMuCi0KLQkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgQ0ZMQUdTIGNhbiBiZSBwYXNzZWQgZnJvbSB0aGUKLQkgIE1ha2VmaWxlIGNvbW1hbmQgbGluZS4gIFJlbW92ZSBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0JICBQYXNzIENGTEFHUy4KLQotRnJpIEFwciAxNyAwOToxNTozMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMsIE1ha2VmaWxlLmluOiBhZGRlZCB0ZWtoZXgKLQkqIGFvdXR4LmggKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogcGFnZXMgc2hvdWxkIGJlIHBhZGRlZCB0byB0aGUKLQlzaXplIG9mIGEgcGFnZSwgbm90IHRoZSBzaXplIG9mIGEgc2VnbWVudC4KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgZ28zMiBob3N0IGFuZCBpMzg2LWFvdXQgdGFyZ2V0LgotCSogaTM4NmFvdXQuYywgbGliYW91dC5oOiBub3cgd29ya3MgZm9yIGdvMzIgdGFyZ2V0Ci0JKiBpZWVlLmM6IGZpeCBiaXQgcm90LgotCSogc2VjbGV0LmM6IHN1cHBvcnQgZm9yIHBhZGRpbmcgc2VjbGV0IHR5cGUuCi0KLVdlZCBBcHIgMTUgMTg6MTE6NTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLk5PRVhQT1JUOgotCi1UdWUgQXByIDE0IDE0OjM0OjQyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2FkZF9zdHJ0YWIsIGJmZF9hZGRfMl90b19zdHJ0YWIpOiAgQ09OU1Qgc3ByZWFkcwotCWxpa2Ugb296ZS4KLQkqIGVsZi5jIChlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAotCWVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgUmV0dXJuIGJvb2xlYW4sIG5vdCBOVUxMICh3aGljaAotCWNhbiBiZSB2b2lkICopLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBJZmRlZi1vdXQgZGVidWdnaW5nIGNvZGUuCi0JQWxzbyBpZmRlZi1vdXQgY29kZSB0aGF0IGFib3J0cyBvbiB1bmhhbmRsZWQgc2VjdGlvbiB0eXBlcy4KLQotRnJpIEFwciAxMCAyMjoyOToxOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5jcjMwMDAgY29uZmlnCi0JKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBQYXNzIG9uIHRvIHJlY3Vyc2l2ZSBtYWtlcy4KLQkqIGhvc3RzL25jcjMwMDAuaCwgY29uZmlnL25jcjMwMDAubWg6ICBBZGQgaG9zdCBjb25maWcgZmlsZXMuCi0KLVRodSBBcHIgIDIgMTc6NDI6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTm93IHRoYXQgd2UgaGF2ZSBzeW0uaCBhbmQgc3ltY29uc3QuaCwgY29tcGlsZQotCWNvZmYtbXN5bS5jIG9uIGFsbCBzeXN0ZW1zLgotCSogY29uZmlnL3tkZWNzdGF0aW9uLm1oLCBpcml4My5taCwgaXJpeDQubWh9OiAgUmVtb3ZlIGNvZmYtbXN5bS5vIGRlcC4KLQkqIGNvZmYtbXN5bS5jOiAgVXBkYXRlIGluY2x1ZGUgZmlsZXMgYW5kIGNvbW1lbnRzOyBhZGQgd2Vha2V4dCBiaXQuCi0KLVdlZCBBcHIgIDEgMjM6MTY6MzggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYywgYmZkLmMsIGJvdXQuYywgY29mZmNvZGUuaCwgaW5pdC5jLCByZWxvYy5jLAotCXNlY3Rpb24uYywgc3JlYy5jLCBzeW1zLmMsIGNvZmYtaDgzMDAuYzogIExpbnQuCi0KLVN1biBNYXIgMjkgMDk6Mzc6NTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYywgY29mZi1hMjlrLmMsIGNvZmYtaTk2MC5jOiAgTGludC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBuZXcgaG9zdCBhbmQgdGFyZ2V0IGNvbmZpZ3MuCi0JKiBlbGYuYyAoYmZkX3Byc3RhdHVzLCBiZmRfZnByZWdzZXQpOiAgQXZvaWQgdHlwZW5hbWUgb2YgcmVnaXN0ZXIKLQlzdHJ1Y3RzLCB3aGljaCB2YXJ5OyBqdXN0IHVzZSBtZW1iZXIgbmFtZS4KLQkoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgTGludCwgZml4IGNvbW1lbnRzLgotCSogY29uZmlnL3NwYXJjLWVsZi5tdCwgaG9zdHMvc3lzdjQuaDogIE5ldyBjb25maWcgZmlsZXMuCi0KLVNhdCBNYXIgMjggMTM6MDc6MDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBGaXggdG8gdXNlIG9ubHkgYSBzaW5nbGUKLQlsb2NhbCwgZGlzcG9zYWJsZSwgY29weSBvZiB0aGUgZXh0ZXJuYWwgZm9ybSBvZiBzZWN0aW9uIGhlYWRlcgotCXRhYmxlIGFuZCBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzLgotCi1UaHUgTWFyIDI2IDE2OjU5OjU4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFNldCBNSU5JTUlaRSBiYWNrIHRvIDAgZm9yIGEgcmVhbCByZWxlYXNlLgotCi1UdWUgTWFyIDI0IDE1OjU3OjAzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZy9pcml4NC5tW2h0XSwgaG9zdHMvaXJpeDQuaDogYWRkIHN1cHBvcnQgZm9yCi0JICBpcml4NC4KLQotTW9uIE1hciAyMyAyMjozNzozNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1zeW0uYyAoZWNvZmZfc3dhcF9yZmRfaW4pOiAgcmVtb3ZlICYgZm9yIGFycmF5IHJlZi4KLQotVHVlIE1hciAxNyAxNDoxMjoyNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUpOiAgVXNlIEJGRF9BU1NFUlQgbWFjcm8sCi0Jbm90IGludGVybmFsIGJmZF9hc3NlcnQgZnVuY3Rpb24gKHR3aWNlKS4KLQotVHVlIE1hciAxNyAxMDo0NToxMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaDogY2hhbmdlIGFyX21heF9uYW1lbGVuIHRvIDE1ICh0aGUgcmlnaHQgdmFsdWUpCi0JKiBjb2ZmLWEyOWssIGNvZmZjb2RlLmg6IG1vcmUgaGFuZ292ZXJzIGZyb20gdGhlIGJmZF9hYnNfc2VjdGlvbgotCWNoYW5nZQotCi1Nb24gTWFyIDE2IDE0OjU3OjIyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IGNoZWNrIGZvciBib3V0IGFyY2hpdmVzIHRvby4KLQkqIGJvdXQuYzogbWFrZSBpdCB3b3JrIGFnYWluLgotCi1TYXQgTWFyIDE0IDE3OjMwOjQwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX2NvcmVmaWxlX25vdGUpOiAgQ2FsbCBiZmRfeG1hbGxvYygpIGluc3RlYWQgb2YgYmFyZQotCW1hbGxvYygpLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogIENhbGwKLQliZmRfeG1hbGxvYygpIGluc3RlYWQgb2YgYmFyZSBtYWxsb2MoKS4KLQotRnJpIE1hciAxMyAxNTo0NDozNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biBNQUtFSU5GTyBvbiBpbmZvLgotCi1GcmkgTWFyIDEzIDA3OjQxOjEzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtPGZvbz4gbm93IDxmb28+Lm10LCBjb25maWcvbWgtPGZvbz4gbm93IDxmb28+Lm1oLgotCWhvc3QvaC08Zm9vPiBub3cganVzdCA8Zm9vPi4KLQkqIGNvbmZpZ3VyZS5pbjogcmVmbGVjdCBjaGFuZ2VzCi0KLVRodSBNYXIgMTIgMTE6MTU6MDIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChzZXRfdGRhdGEpOiAgTWFrZSBjaGFuZ2Ugb2YgRmViIDI3IGluIHRoZQotCWFjdHVhbCBzb3VyY2UgZmlsZSwgbm90IGp1c3QgdGhlIGdlbmVyYXRlZCBsaWJiZmQuaC4KLQotU2F0IE1hciAgNyAxMDozMzo0MSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmMgKGljb2ZmX2xpdHRsZV92ZWMpOiBhZGQgQ09GRl9TV0FQX1RBQkxFIHNvIHdlIGNhbiBydW4KLQlnZGIgb24gbGl0dGxlLWVuZGlhbiA5NjAgY29kZS4KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBpbmRpcmVjdCBzeW1ib2xzIHNob3VsZCBnbwotCWludG8gdGhlIGFyY2hpdmUgaGVhZGVyIHRvby4KLQotRnJpIE1hciAgNiAyMTo1NToxNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KLQotVGh1IE1hciAgNSAyMzo1MTo0MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1tc3ltLmM6ICBNb3ZlIHRoaXMgZmlsZSBmcm9tIGdkYi9lY29mZi5jLiAgSXQKLQloYW5kbGVzIGJ5dGUtc3dhcHBpbmcgZm9yIEVDT0ZGIChNSVBTIHN5bWJvbCkgZmlsZXMuCi0JKiBjb25maWcvbWgtZGVjc3RhdGlvbiwgY29uZmlnL21oLWlyaXgzOiAgQWRkIGNvZmYtbXN5bS5vCi0JdG8gdGhlIGZpbGVzIGJ1aWx0IG9uIE1JUFMtYmFzZWQgaG9zdHMuCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBydWxlIGZvciBjb2ZmLW1zeW0uCi0KLVRodSBNYXIgIDUgMjE6MzY6MDUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjbGVhbi1pbmZvIHRhcmdldC4gIE1JTklNSVpFPTEuCi0KLVN1biBNYXIgIDEgMjI6MzI6NTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmM6ICBNb3ZlIGNvcmUgZmlsZSBmdW5jdGlvbnMgaW50byBzZXBhcmF0ZQotCW5ldyBmaWxlIHJzNjAwMC1jb3JlLmMuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHJlYWRpbmcKLQljb3JlIGZpbGVzIGRlcGVuZHMgb24gbmF0aXZlIGluY2x1ZGUgZmlsZXMgdGhhdCBjb25mbGljdAotCXdpdGggLi4vaW5jbHVkZS9jb2ZmL3JzNjAwMC5oLgotCSogY29uZmlnL21oLXJzNjAwMDogIEFkZCByczYwMDAtY29yZS5vIHRvIEhERVBGSUxFUy4KLQotVGh1IEZlYiAyNyAyMjoxOTo1NSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LHByaW50X3N5bWJvbCkpOiBEb24ndCBwcmludAotCXN5bWJvbCBhZGRyZXNzcyBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKiBjb2ZmLXJzNjAwMC5jOiAgVmFyaW91cyB1cGRhdGVzIChkdWUgdG8gdGFyZ2V0LQotCWluZGVwZW5kZW50IGNoYW5nZXMpLgotCSogbGliYmZkLmg6ICBEaXR0byAodGRhdGEgZmllbGQgaXMgbm93IGEgdW5pb24pLgotCSogaG9zdHMvaC1zcGFyYy5oOiAgUmVtb3ZlZCBwcm90b3R5cGUgZm9yIGJvZ3VzIGZ1bmN0aW9uCi0JJ2Vtc2V0JyAocHJlc3VtYWJseSBzaG91bGQgaGF2ZSBiZWVuICdtZW1zZXQnIC0gd2hpY2ggaXMgdGhlcmUpLgotCi1UaHUgRmViIDI3IDExOjQ2OjMzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtYmlnLSogdGFyZ2V0KTogIFNhbWUgaXMgSXJpcy4KLQotVGh1IEZlYiAyNyAwOToyNDo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IHdoZW4gY3JlYXRpbmcgYW4KLQlhbGlhcyBzeW1ib2wsIGZpbGwgaW4gdGhlIHNlY3Rpb24gYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbgotCWxlYXZpbmcgaXQgYmxhbmsuIElmIGFuIG91dHB1dCBzZWN0aW9uIGNhbid0IGJlIGZvdW5kIGZvciBhCi0Jc3ltYm9sLCB0aGVuIGRvbid0IGNvcmUgZHVtcC4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLVdlZCBGZWIgMjYgMTk6NDA6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiBsaW50Ci0JKiBjb2ZmLWg4MzAwLmM6IGZpeCBzdHVwaWQgcmVsb2Mgc3VidHJhY3Rpb24gYnVnCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X291dCk6IG9ubHkgc3dhcCBhIHR2bmR4IGJ5IDIgYnl0ZXMsCi0Jc2luY2UgdGhhdCdzIGhvdyB3aWRlIGl0IGlzLiAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBhbHdheXMgemVybyBvdXQKLQl0aGUgc3ltYm9sLmZsYWdzIGFuZCBkb25lX2xpbmVubyBmaWVsZHMuCi0KLVR1ZSBGZWIgMjUgMTQ6Mjk6MjQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfc3ltYm9sKTogd3JpdGUgb3V0IHRoZSBjb3JyZWN0IG51bWJlciBvZgotCWF1eGVudHMuCi0JKiBjcHUtaDgzMDAuYzogZml4IGRpc2Fzc2VtYmx5IGJ1ZwotCi1GcmkgRmViIDIxIDIxOjM5OjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2Vycm1zZyksIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4sCi0Jc2VjdGlvbl9mcm9tX2JmZF9pbmRleCksIGNwdS1oODMwMC5jIChob3d0bypfY2FsbGJhY2spLAotCXJlbG9jLmMsIHNlY3Rpb24uYyAoYmZkX21hcF9vdmVyX3NlY3Rpb25zKSwgdGFyZ2V0cy5jCi0JKGJmZF90YXJnZXRfbGlzdCk6ICBQcm90b2xpbnQuCi0JKiBsaWJiZmQuaDogIFVwZGF0ZSB0byBtYXRjaCBhIGxpYmJmZC1pbi5oIGZyb20gYSBtb250aCBhZ28uCi0KLUZyaSBGZWIgMjEgMTA6NTc6NTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBsaW50LCAoY29mZl9wcmludF9zeW1ib2wpOiBwcmludHMKLQlvdXQgdGFnbmR4IHRvby4KLQkqIGFvdXR4LmggKHN3YXBfc3RkX3JlbG9jX291dCwgc3dhcF9leHRfcmVsb2Nfb3V0KTogdXNlIHRoZSBvdXRwdXQKLQlzZWN0aW9uIG9mIGEgc3ltYm9sIHJhdGhlciB0aGFuIHRoZSBzZWN0aW9uIG9mIGEgcmVmZmVkIHN5bWJvbCB0bwotCWRldGVybWluZSB0aGUgcl9pbmRleCBvZiBhbiBlbW1pdHRlZCByZWxvYy4KLQotVGh1IEZlYiAyMCAxODoxMDozNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogUE9SVElORzogTmV3IChwcmVsaW1pbmFyeSkgcG9ydGluZyBndWlkZS4KLQotV2VkIEZlYiAxOSAyMTozOTozNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChjYWxsal9jYWxsYmFjayksIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKSwgY29mZi1tODhrLmMKLQkoaG93dG9faHZydDE2KTogIGxpbnQuCi0KLU1vbiBGZWIgMTcgMTI6MDI6MTcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwMzAwYnNkLmMgKG5ldyksIGNvbmZpZy9tdC1ocDMwMGJzZDogIE1ha2UgaHAzMDBic2QKLQlhIGZ1bGwgY29uZmlndXJhdGlvbiAod2l0aCBwb3NzaWJsZSBjcm9zcy1kZXZlbG9wbWVudCksCi0JaW5zdGVhZCBvZiB1c2luZyBob3N0LWFvdXQuYy4KLQotU3VuIEZlYiAxNiAxMzowMTo0OSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKToKLQlTZXQgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpLgotCSogZ2VuLWFvdXQuYzogIENoYW5nZSB0byBlbWl0IGEgLmMgZmlsZXMsIG5vdCBhIC5oIGZpbGUuCi0KLVRodSBGZWIgMTMgMjA6MTE6NDcgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIFJlbW92ZSBvYnNvbGV0ZSB1c2Ugb2YKLQlCU0ZfQUJTT0xVVEUgYW5kIHJlcGxhY2Ugd2l0aCBiZmRfYWJzX3NlY3Rpb24gcmVmZXJlbmNlLgotCi1UaHUgRmViIDEzIDE3OjIyOjQ0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChnZXRfbm9ybWFsaXplZF9zeW10YWIpOiBmaXhlZCBidWcgd2hlcmUgc3ltYm9scwotCXdpdGggbW9yZSB0aGFuIG9uZSBhdXhlbnQgY2FuIGNhdXNlIG5hc3R5IGNvcmUgZHVtcHMuCi0KLQkqIGNvZmZjb2RlLmgsIGxpYmNvZmYuYzogYWRkZWQgbmV3IGZpZWxkZWQgdG8gY29mZl9zeW1ib2xfc3RydWN0Ci0JImRvbmVfbGluZW5vIiBzbyB0aGF0IGEgc3ltYm9sIHdoaWNoIGFwcGVhcnMgdHdpY2UgaW4gdGhlIHN5bWJvbAotCXRhYmxlIG9ubHkgZ2V0cyBpdCdzIGxpbmVudW1iZXJzIHJlbG9jYXRlZCBvbmNlLiBNb2RpZmVkCi0JKGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCkgYW5kIChjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKSB0byBtYWtlCi0JdXNlIG9mIGl0LgotCi1UdWUgRmViICA0IDE1OjM5OjU1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oOiAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IGZpeCBjb25zdHJ1Y3RvcgotCXN0dWZmIHRvIHVzZSB0aGUgTmV3IE9yZGVyLgotCi1GcmkgSmFuIDMxIDAxOjM0OjQ1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGllZWUuYzogIENoYW5nZSB0eXBlIG9mIGVudmlbXSB0byB1bnNpZ25lZCBjaGFyLgotCi0JKiBjb25maWd1cmUuaW46ICBmaXggdmF4IHVsdHJpeCBjb25maWd1cmF0aW9uLgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIERlYWwgd2l0aCBudWxsIHJldHVybiBmcm9tCi0JYmZkX21ha2Vfc2VjdGlvbigpLiAgKGVsZl9vYmplY3RfcCk6ICBTZWxlY3QgZW5kaWFuZXNzIHByb3Blcmx5LgotCi1GcmkgSmFuIDMxIDAxOjE5OjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLXRhaG9lLmgsIGgtdmF4YnNkLmg6ICBGaXggc3RhY2sgaW4gY29yZSBmaWxlcy4KLQotVGh1IEphbiAzMCAyMzo1MTowNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBob3N0LWFvdXQuYyBkb2Vzbid0IGRlcGVuZCBvbiBhb3V0LXBhcmFtcy5oLgotCSogYW91dC10YXJnZXQuaDogIFVzZSBUQVJHRVRfQklHX0VORElBTl9QIHRvIHNldCB1cCB2ZWN0b3IuCi0JKiBob3N0LWFvdXQuYzogIERvbid0IHVzZSBhb3V0LXBhcmFtcy5oOyBjb25maWd1cmUgdGhlc2Ugc3lzdGVtcwotCWluIHRoZWlyIHhtIGZpbGVzLCBub3QgaW4gYSByYW5kb21seSBnZW5lcmF0ZWQgZmlsZS4KLQkqIGhvc3RzL2gtaHAzMDBic2QuaCwgaC10YWhvZS5oLCBoLXZheGJzZC5oLCBoLXZheHVsdC5oOgotCVNwZWNpZnkgYnl0ZSBvcmRlci4KLQkqIGhvc3RzL2gtdmF4YnNkLmg6ICBEZWZpbmUgdGhlIGZvcm0gb2YgZXhlYyBhbmQgY29yZSBmaWxlcy4KLQotVGh1IEphbiAzMCAxMzowMjo0MSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LXRhaG9lLCBjb25maWcvbXQtdmF4OiAgQ2hhbmdlIERFRkFVTFRfVkVDVE9SIHRvCi0JaG9zdF9hb3V0X3ZlYyBoZXJlIGFzIHdlbGwuCi0KLVRodSBKYW4gMzAgMTE6NDE6NDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdC1hb3V0LmM6ICBDaGFuZ2UgVEFSR0VUTkFNRSB0byAiYS5vdXQiIHRvIGJlIGNvbXBhdGlibGUgd2l0aAotCWdkYi4gIGNvbmZpZy9tdC1ocDMwMGJzZDogIENoYW5nZSBERUZBVUxUX1ZFQ1RPUiB0byBob3N0X2FvdXRfdmVjCi0JdG8gcHJldmVudCB1bmRlZmluZWQgc3ltYm9sLgotCi1UaHUgSmFuIDMwIDA3OjI2OjUzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JVmFyaW91cyBsaW50cyBmb3VuZCBvbiBQZXJzU29ueQotCSogYW91dHguaDogY2FzdCBhbiBlbnVtCi0JKiBjb2ZmLWEyOWsuYzogbWFueSBpbnRzIGluIHJlbG9jIHN0cnVjdHVyZSB0dXJuZWQgdG8gZW51bQotCSogY29mZmNvZGUuaDogbW9yZSBlbnVtcwotCSogY3B1LWg4MzAwLmM6IG1vcmUgZW51bXMKLQkqIG9wbmNscy5jOiBtb3JlIGVudW1zCi0KLVRodSBKYW4gMzAgMDE6MTk6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgVGFob2UgY29uZmlndXJhdGlvbiB3b3JrIGFnYWluLgotCSogYmZkLWluLmg6ICBSZW1vdmUgdHJhaWxpbmcgY29tbWEgZnJvbSBlbnVtIGRlY2xhcmF0aW9uLgotCSogaWVlZS5jOiAgQ2FuJ3QgcHV0IGJ5dGUgdmFsdWVzID4weDdGIGludG8gYSBzaWduZWQgY2hhci4KLQotVHVlIEphbiAyOCAyMToxMDo1MSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgZGVwZW5kZW5jaWVzIGZvciB2YXJpb3VzIGNvZmYtKi5vIGZpbGVzLgotCi0JKiBlbGYuYzogIFJlbW92ZSBleHRyYW5lb3VzIHBhcmVuIGZyb20gY29yZV9wcnBzaW5mbyBhbmQKLQljb3JlX3BycHN0YXR1cyBtYWNyb3MsIHJlbmFtZSBjb3JlX3BycHN0YXR1cyB0byBjb3JlX3Byc3RhdHVzLgotCVJlcGxhY2UgcmVmZXJlbmNlcyB0byBvbGQgc2VjdGlvbiAic2l6ZSIgbWVtYmVyIHdpdGggbmV3Ci0JIl9yYXdfc2l6ZSIgbWVtYmVyLiAgSW1wbGVtZW50IGVsZl9tYWtlX2VtcHR5X3N5bWJvbCwgd2hpY2gKLQlpcyBub3cgdXNlZC4KLQotVHVlIEphbiAyOCAxNDo1MTo0MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYywgYmZkLmMsIC4uL2luY2x1ZGUvYmZkLmg6ICBWYXJpb3VzIGZpeGVzIGZvciBQTUFYCi0JY29yZSByZWFkaW5nLgotCi1UdWUgSmFuIDI4IDEwOjQ2OjMyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9yZWxheF9zZWN0aW9uKTogbm93IHN0YXRpYy4KLQkoYmZkX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogdmFyaW91cyB0eXBlIGxpbnRzLgotCi1Nb24gSmFuIDI3IDE5OjQ0OjA4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JTmV3IGVudHJ5IHBvaW50IGluIHRoZSB0cmFuc2ZlciB2ZWN0b3IgLSBiZmRfcmVsYXhfc2VjdGlvbi4KLQotCSogYW91dC10YXJnZXQuaDogYWRkIHRvIHZlY3RvciwgY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiBiZmQtaW4uaDogYWRkIHRvIHZlY3RvcgotCSogYmZkLmM6IGFkZCAjZGVmaW5lIGZvciB2ZWN0b3IKLQkqIGJvdXQuYzogYWRkIHRvIHZlY3RvciwgY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiBjb2ZmY29kZS5oOiBhZGQgdG8gdmVjdG9yLCBhbHNvIG5vdyBoYXMgY29mZiBzcGVjaWZpYyByZWxheCBjb2RlCi0JZm9yIHRoZSByZWxheGFibGUgSDgvMzAwIHJlbG9jcy4gQWxzbyBjbGVhbiB1cCBhYnMgc2VjdGlvbiBjcnVmdC4KLQkqIGVsZi5jOiBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIGllZWUuYzogY2FsbCBuZXcgdmVjdG9yLCBjbGVhbiB1cCBzb21lIGJ1Z3MgZHVlIHRvIHRoZSBjcmVhdGlvbgotCW9mIGJmZF9hYnNfc2VjdGlvbgotCSogbGliYmZkLmg6IGFkZCBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uIEVYRlVOCi0JKiBvYXN5cy5jOiBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIHJlbG9jLmM6IGltcGxlbWVudCBnZW5lcmljX3JlbGF4Ci0JKiBzZWNsZXQuYzogbW92ZWQgbXVjaCBvZiB0aGlzIGludG8gY29mZmNvZGUuaAotCSogc3JlYy5jOiBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIHRhcmdldHMuYzogZGVmaW5lIG5ldyB0cmFuc2ZlciB2ZWN0b3IKLQotRnJpIEphbiAyNCAxNDo0MDoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogZXZlcnl0aGluZzogbm93IG1vZGlmaWVkIHRvIHVzZSBzbWFsbGVyIHJlbG9jIHR5cGUuIFNlbGYgaG9zdHMKLQlvbiBzdW4zICYgc3VuNC4KLQotU2F0IEphbiAxOCAxNzowMDoxNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN0cmF0dXMsIGNvbmZpZy9tdC1pODYwLWVsZiwgaG9zdHMvaC1zdHJhdHVzOgotCU5ldyBmaWxlcyBmb3Igc3RyYXR1cy4KLQotCSogY29uZmlndXJlLmluOiAgQWRkIGNvbmZpZ3VyYXRpb24gZnJhZ21lbnRzIGZvciBzdHJhdHVzLgotCi1XZWQgSmFuIDE1IDEwOjAyOjQzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogRGVjbGFyZSB2YXJpb3VzIGZpbGVuYW1lCi0JdmFyaWFibGVzIGFzIENPTlNUIHNpbmNlIHRoZXkgYXJlIHNldCB0byBwb2ludCB0byBhIGNvbnN0IGNoYXIKLQlzdHJpbmcuICBGaXhlcyBjb21waWxlciBjb21wbGFpbnRzLgotCi1GcmkgSmFuIDEwIDE3OjQ0OjUzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLWFtaXguaCBob3N0cy9oLWkzODZ2NC5oOiAgQ2hhbmdlIGFib3J0KCkgdG8gYSBmdW5jdGlvbgotCXJldHVybmluZyB2b2lkLgotCi1GcmkgSmFuIDEwIDE0OjMzOjMyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogIFJlY29nbml6ZSBOX1NPTAotCXN5bWJvbHMsIHNvIHRoYXQgd2UgY2FuIGVtaXQgdGhlIGNvcnJlY3QgZmlsZSBuYW1lIGV2ZW4KLQlpZiBpdCdzIGFuIGluY2x1ZGUgZmlsZS4KLQotVGh1IEphbiAgMiAxNjo0MzozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmM6ICBBZGQgQ09GRl9TV0FQX1RBQkxFIHRvIGxpdHRsZV92ZWMgYXMgd2VsbCBhcyBiaWdfdmVjLgotCShSZXBvcnRlZCBieSBqb2huQGxhYnRhbS5sYWJ0YW0ub3ouYXUgKEpvaG4gQ2FyZXkpKS4KLQotV2VkIEphbiAgMSAwNDoyMzowNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6ICBDaGFuZ2UgYWxsICcjaWYgSEFWRV9QUk9DRlMnIHRvICcjaWZkZWYgSEFWRV9QUk9DRlMnLgotCi0JKiBjb25maWcvbWgtYW1peCwgY29uZmlnL21oLWkzODZ2NDogIFJlbW92ZSBIREVGSU5FUyB0aGF0IHdhcwotCWJlaW5nIHVzZWQgdG8gLURIQVZFX1BST0NGUy4KLQotCSogaG9zdHMvaC1hbWl4LCBob3N0cy9oLWkzODZ2NDogIEFkZCAnI2RlZmluZSBIQVZFX1BST0NGUycuICBNb3ZlCi0JJyNpbmNsdWRlICJmb3Blbi1zYW1lLmgiJyB0byBlbmQgb2YgZmlsZSB0byBtYXRjaCBvdGhlciBoLSogZmlsZXMuCi0KLUZyaSBEZWMgMjAgMTI6MDY6MTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZSBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuICBBZGQgY2FzZQotCSJ1bmtub3duIiBmb3IgdGFyZ2V0IHZlbmRvciBhbmQgaW5mZXIgc29tZSB0YXJnZXRzIGJhc2VkCi0Jb24gdGhlIHNwZWNpZmllZCBvcGVyYXRpbmcgc3lzdGVtLgotCi1XZWQgRGVjIDE4IDE3OjE3OjU5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oLCBsaWJhb3V0Lmg6ICBBTlNJZnkgZW51bXMuCi0KLVdlZCBEZWMgMTggMTY6MTI6MjUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAobm9ybWFsaXplKTogY3JlYXRlZCB2ZXJzaW9uIGZvciBWTVMgd2hpY2ggcmVtb3ZlcyB0aGUKLQlWTVMgZGlyZWN0b3J5IGNyYXAgZnJvbSB0aGUgZnJvbnQgYW5kIGVuZCBvZiBhIGZpbGVuYW1lLCBlZyB0dXJuCi0JWy0uZm9vXWJhci5vYmo7MTIzIGludG8gYmFyLm9iagotCShiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBub3cgd3JpdGVzIGluZGV4IGludG8gYW4KLQlleHRlbmRlZCBuYW1lIHRhYmxlIGluIGRlY2ltYWwgLSB0aGUgc2FtZSBiYXNlIHVzZWQgdG8gcmVhZCBhbgotCWV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLVdlZCBEZWMgMTggMTQ6NDA6MzkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQtZW5jYXAuYzogIEZpeCB0byB1c2UgYW91dC10YXJnZXQuaC4KLQkqIGFvdXRmMS5oOiAgVXNlIHN0YW5kYXJkIE1ZX29iamVjdF9wIGFuZCBNWV9jYWxsYmFjawotCWluIGFvdXQtdGFyZ2V0LmguICBSZW1vdmUgdGFyZ2V0LXNwZWNpZmljIHZlcnNpb25zLgotCSogaG9zdC1hb3V0LmM6ICBSZS13cml0ZSB0byB1c2UgYW91dC10YXJnZXQuaC4KLQkqIGdlbi1hb3V0LmM6ICBOZXcgZmlsZXMgdXNlIHdpdGggaG9zdC1hb3V0LmMgdG8gZ2VuZXJhdGUKLQlob3N0LXNwZWNpZmljIGEub3V0LXJlbGF0ZWQgcGFyYW1ldGVycy4KLQkqIE1ha2VmaWxlLmluOiAgaG9zdC1hb3V0Lm8gZGVwZW5kcyBvbiBhb3V0LXBhcmFtcy5oLCB3aGljaCBpcwotCWdlbmVyYXRlZCBieSBnZW4tYW91dC4KLQkqIGFvdXQtdGFyZ2V0Lmg6ICBNYWtlIGEgbGl0dGxlIG1vcmUgZmxleGlibGUuCi0JKiBsaWJhb3V0LmgsIGFvdXQtdGFyZ2V0Lmg6ICBSZW1vdmVkIFdPUktfT1VUX0ZJTEVfUE9TVElPTlMKLQltYWNyby4gIEluc3RlYWQsIGlubGluZSBpdCBpbiBhb3V0LXRhcmdldC5oLgotCSogbmV3c29zMy5jOiAgRGVmaW5lIE5fU0hBUkVEX0xJQih4KSBhcyAwIHRvIGF2b2lkCi0JYSBnY2MgLVdhbGwgd2FybmluZy4KLQkqIGFyY2hpdmUuYzogIEFkZCBtaXNzaW5nIGNvbW1hcyBpbiBERUZVTiBtYWNybyAoMiBwbGFjZXMpLgotCSogZWxmLmMsIGNvZmZjb2RlLmgsIGFvdXRmMS5oOiAgVXNlIEFOU0kgZnVuY3Rpb25zIGluc3RlYWQgb2YKLQlCZXJrZWxleSBvbmVzLCBub3cgdGhhdCBsaWJpYmVydHkgaGFzIHRoZW06Ci0JYmNvcHktPm1lbWNweSwgYnplcm8tPm1lbXNldCwgYmNtcC0+bWVtY21wLgotCSogYW91dHguaDogIFZhcmlvdXMgdG91Y2gtdXBzOiAgUmUtZm9ybWF0dGluZywgZml4IGEgY2FzdCwKLQlyZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCi1UdWUgRGVjIDE3IDE5OjQ4OjU5IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6ICBFbmNsb3NlIGNvcmVuYW1lCi0JYW5kIGV4ZWNuYW1lIGluc2lkZSBIQVZFX1BST0NGUyBpZmRlZiBzaW5jZSB0aGV5IGFyZSB1bnVzZWQKLQl3aGVuIGl0IGlzIG5vdCBkZWZpbmVkLgotCi1Nb24gRGVjIDE2IDEyOjAwOjEwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIEZsYWcgYWxsIHNlY3Rpb25zIGFzIGVpdGhlciBjb2RlIG9yIGRhdGEuICBXZSBjYW4ndAotCWJlIHN1cmUgd2hhdCB0aGV5IGFyZSBhbnl3YXksIHNpbmNlIEVMRiBkb2Vzbid0IGZpdCB0aGUKLQl0cmFkaXRpb25hbCBtb2RlbCBvZiB0ZXh0K2RhdGErYnNzIHZlcnkgd2VsbC4gIEFkZCBuZXcgbG9jYWwKLQlmdW5jdGlvbiBlbGZfcmVhZCgpIHRvIHNpbXBsaWZ5IGNvZGUuICBSZWNvcmQgZW50cnkgcG9pbnQgaW4KLQl0aGUgYmZkIHN0cnVjdHVyZS4KLQotVGh1IERlYyAxMiAyMTowMToyMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC0qLmg6ICBDb25maWd1cmUgZm9wZW4gdXNpbmcgLi4vaW5jbHVkZS9mb3Blbi0qLmgKLQlyYXRoZXIgdGhhbiBOIGNvcGllcyBvZiB0aGUgc2FtZSBsaW5lcy4KLQotV2VkIERlYyAxMSAxNjozOTo0NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY3B1LWg4MzAwLmM6IGRpc2Fzc2VtYmxlIGJyYW5jaCBkaXNwbGFjZW1lbnRzIGNvcnJlY3RseQotCSogY29mZi1oODMwMC5jOiBwdXQgcmVsb2Mgb2Zmc2V0cyBvdXQgaW4gMzJiaXRzCi0KLQkqIG1ha2VmaWxlLmRvcywgY29uZmlnZGouYmF0OiBOZXcgZmlsZXMgZnJvbSBESgotCSogY2FjaGUuYzogZm9wZW4gd2l0aCBuZXcgbWFjcm9zIGlzIG5lZWRlZCBmb3IgRE9TLgotCSogaWVlZS5jOiBlbnZpcm9uIHJlbmFtZWQgdG8gZW52aSB0byBzdG9wIGFuIGluY2x1ZGUgZmlsZQotCWNvbmZsaWN0LgotCSogb3BuY2xzLmMsIGNvZmYtcnM2MDAwLmM6IG1vcmUgZm9wZW5zIHdpdGggbWFjcm9zLgotCi1UdWUgRGVjIDEwIDA0OjA3OjI0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1TYXQgRGVjICA3IDE2OjM5OjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JICogTWFrZWZpbGUuaW46IGZpeCB3aGVyZSBkb2NkaXIgbGl2ZXMKLQotCSAqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgYmZkLmMsIGNhY2hlLmMsIGNvZmYtbTg4ay5jLAotCSBjb2ZmY29kZS5oLCBjb3JlLmMsIGN0b3IuYywgZWxmLmMsIGZvcm1hdC5jLCBpZWVlLmMsIGluaXQuYywKLQkgbGliYmZkLmMsIGxpYmJmZC5oLCBsaWJjb2ZmLmgsIG9wbmNscy5jLCByZWxvYy5jLCBzZWN0aW9uLmMsCi0JIHNyZWMuYywgc3ltcy5jLCB0YXJnZXRzLmMgOiBhbGwgbmV3IGRvY3VtZW50YXRpb24gYW5kIGxpbnQKLQkgcmVtb3ZhbC4KLQotCi1TYXQgRGVjICA3IDA3OjIyOjA5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oLCBzcmVjLmM6ICBMaW50LgotCi1GcmkgRGVjICA2IDIyOjU4OjQ4IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluc3RhbGwgdXNpbmcgSU5TVEFMTF9EQVRBLCBhZGRlZCBzdGFuZGFyZHMudGV4dAotCSAgc3VwcG9ydC4KLQotCSogY29uZmlndXJlLmluOiBtYXJrIGRpcmVjdG9yeSBhcyB0YXJnZXQgZGVwZW5kZW50LiAgY29uZmlndXJlCi0JICBub3dzIHdvcmtzIGluIG9iamRpciBhbHdheXMgc28gbWFrZSBmaWxlIGV4aXN0ZW5jZSBjaGVja3MKLQkgIGFnYWluc3QgJHtzcmNkaXJ9LgotCi1UaHUgRGVjICA1IDIyOjQ2OjE5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotV2VkIERlYyAgNCAxMDoxNDoxNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zXzxzaXplPl9vYmplY3RfcCwgc3Vub3M0X2NhbGxiYWNrKTogbW92ZWQgdGhlCi0JY29tcHV0YXRpb24gb2YgYXJjaCBhbmQgbWFjaGluZSB0eXBlIHNvIGl0J3Mgd29ya2VkIG91dCBiZWZvcmUKLQlzb21lX2FvdXRfb2JqZWN0X3AgaXMgY2FsbGVkLgotCSogYW91dHguaDogKHNvbWVfYW91dF9vYmplY3RfcCk6IGRvbid0IHNldCBhcmNoIGFuZCBtYWNoIHRvCi0JdW5rbm93bi4KLQkqIGFyY2h1cmVzLmM6IGFkZCBleHRyYSBmaWVsZCAnc2VjdGlvbl9hbGlnbl9wb3dlcicgdG8gaG9sZAotCWRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgaW4gb2JqZWN0IGZpbGVzLgotCSogY3B1LWEyOWsuYywgY3B1LWg4MzAwLmMsIGNwdS1pMzg2LmMsIGNwdS1pOTYwLmMsIGNwdS1tNjhrLmMsCi0JY3B1LW04OGsuYywgY3B1LW1pcHMuYywgY3B1LXJzNjAwMC5jLCBjcHUtc3BhcmMuYywgY3B1LXZheC5jOgotCWluaXRpYWxpemUgdGhlIG5ldyBmaWVsZC4KLQkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiByZXBsYWNlIHRoZSB0ZXh0IHNpemUsIHNpbmNlIGFvdXQKLQlmcmllcyB0aGVtLgotCSogYW91dHguaDogRG9jdW1lbnRhdGlvbiBpbiB0aGUgbmV3IHN0eWxlCi0KLVdlZCBEZWMgIDQgMDI6MDA6MzAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X210aW1lKTogIERvbid0IGNhY2hlIG10aW1lIGFueSBtb3JlOyBvbmx5Ci0JdXNlIHRoZSBzYXZlZCB2YWx1ZSBpZiBtdGltZV9zZXQgaXMgYWxyZWFkeSBzZXQgKGludGVuZGVkCi0JZm9yIGFyY2hpdmUgZmlsZXMsIHRob3VnaCBhcHBhcmVudGx5IG5vdCB1c2VkIHlldCkuCi0KLVR1ZSBEZWMgIDMgMjI6NTQ6NTAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYzogIFJldmlzZSBjb21tZW50cyBhYm91dCBob3cgdG8gY29uZmlndXJlIHRoZSB0YXJnZXQKLQl2ZWN0b3IsIHRvIG1hdGNoIHJlYWxpdHkuICBSZW1vdmUgbWVudGlvbiBvZiBvYnNvbGV0ZSBtZXRob2RzLgotCVJlbW92ZSBsb25nIGxpc3RzIG9mIGNhcGl0YWxpemVkIG1hY3JvcyB0aGF0IHR1cm4gaW50byB0aGUgc2FtZQotCXRoaW5nIGluIGxvd2VyY2FzZS4gIE5vcm1hbCB2ZWN0b3Igc2ltcGx5IGxpc3RzIGFsbCBrbm93bgotCWxvd2VyY2FzZSB4dmVjIG5hbWVzOyBhbGwgb3RoZXIgY2FzZXMgYXJlIGhhbmRsZWQgYnkgU0VMRUNUX1ZFQ1MuCi0KLQkqIGNvbmZpZy9tdC1pMzg2LWNvZmY6ICBTZXQgREVGQVVMVF9WRUNUT1IgdG8gcmVhbCBpZGVudGlmaWVyLAotCW5vdCBtYWNybyBuYW1lLgotCi0JKiBjb25maWcvbXQtaTk2MC17Y29mZixib3V0fTogIFVzZSBTRUxFQ1RfVkVDUyB0byBtYWtlIGEgc2hvcnQKLQlsaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXRzLgotCi1UdWUgRGVjICAzIDE0OjA2OjE1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6ICBUaGUgcGFkIGJ5dGUgc29tZXRpbWVzIGFkZGVkIHRvCi0JdGhlIHN0cmluZyB0YWJsZSBpbiBhIF9fLlNZTURFRiBtZW1iZXIgaXMgbm93Ci0JY291bnRlZCBhcyBwYXJ0IG9mIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdGFibGUuCi0JVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCByYW5saWIsIGFzIHdlbGwgYXMgU3VuJ3MuCi0KLVR1ZSBEZWMgIDMgMTA6NTM6MzAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYzogUmV3cm90ZSB0byBmaXggbWFueSBidWdzOyBub3cgZ2V0cyB0aGUgcmVjb3JkIHR5cGUKLQlyaWdodCwgZG9lc24ndCBjaG9rZSBvbiBpbnB1dCwgc2V0cyB0aGUgc3RhcnQgYWRkcmVzcyBpbiBhbiBTOSBhbmQKLQlmaWxscyBpbiB0aGUgZmlsZW5hbWUgb24gYW4gUzAuCi0KLVNhdCBOb3YgMzAgMjE6MTk6MTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODMwMC5jOiBBZGQgc3VwcG9ydCBmb3IgTUVNSU5EIGFkZHJlc3NpbmcgbW9kZQotCi0JKiBjb2ZmLWEyOWsuYzogZGVmaW5lZCBSRUxPQ19QUk9DRVNTSU5HIHRvIHRha2UgdGhlICNpZmRlZiBvdXQgb2YKLQljb2ZmY29kZS5oCi0JKiBjb2ZmY29kZS5oOiB1c2UgdGhlIG5ldyBtYWNybyBpZiBhdmFpbGFibGUKLQotCSogZWxmLmMgKGVsZl9jb3JlZmlsZV9ub3RlKTogY2FzdCBtYWxsb2MgdG8gYXZvaWQgd2FybmluZy4KLQkqIE1ha2VmaWxlLmluOiBGaXhlZCBkZXBlbmRlbmNpZXMgZHVlIHRvIGZpbGUgcmVuYW1lCi0KLQkqIGFvdXQtZW5jYXAuYywgYW91dGYxLmgsIGFvdXR4LmgsIGFyY2hpdmUuYywgYm91dC5jLCBjb2ZmLWEyOWsuYywKLQljb2ZmLWg4MzAwLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmLXJzNjAwMC5jLCBjcHUtaDMwMC5jLCBlbGYuYywgaTM4NmFvdXQuYywKLQluZXdvczMuYywgc3RhYi1zeW1zLmMsIHN5bXMuYzogQWxsIHRoZXNlIGZpbGVzIGhhdmUgaGFkIHRoZWlyCi0JI2luY2x1ZGVzIGFsdGVyZWQgdG8gcG9pbnQgdG8gdGhlIG5ldyBwbGFjZXMuCi0KLUZyaSBOb3YgMjkgMjA6MDQ6NDkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1pMzg2djQsIGNvbmZpZy9taC1pMzg2LWVsZiwgaG9zdHMvaC1pMzg2djQuaDogIE5ldyBmaWxlcy4KLQotCSogY29uZmlndXJlLmluOiAgQWRkIHZlbmRvciAibmNyIiBhcyBzdXBwb3J0ZWQgcGVyLXRhcmdldCB2ZW5kb3IuCi0JQWRkIHN2cjQgY2FzZSBmb3IgaTM4NiBwZXItaG9zdCBjYXNlLgotCi0JKiBlbGYuYyAoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgQWRkIG1pc3NpbmcgImJyZWFrIiB0bwotCUVMRkRBVEEyTFNCIGNhc2VzLgotCi1GcmkgTm92IDI5IDEyOjE2OjUxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzeW1zLmMgKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiAgUmV0dXJuICdBJwotCWZvciBzeW1ib2xzIHRoYXQgYXJlIGJvdGggYWJzb2x1dGUgYW5kIGdsb2JhbC4KLQkqIGFyY2hpdmUuYyAoYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUpOiAgUmV0dXJuIE5VTEwKLQlpZiBiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSByZXR1cm5zIE5VTEwuCi0KLVR1ZSBOb3YgMjYgMDk6MTA6NTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNvZmYtaDgzMDAKLQkqIGNvbmZpZ3VyZS5pbjogbm93IGg4IGlzIGEgY29mZiB0YXJnZXQKLQkqIGNwdS1oODMwMC5jOiBmaXggdmFyaW91cyBkaXNhc3NlbWJseSBwcm9ibGVtcwotCSogbGliY29mZi5oOiB0b29rIG91dCBzb21lIGNvZGUgd2hpY2ggaGFzIGJlZW4gIzBlZCBmb3IgYSBsb25nCi0JdGltZS4KLQkqIHRhcmdldHMuYzogYWRkZWQgaDggY29mZgotCSogY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jCi0JYWRkZWQgbmV3IG1hY3JvIFJUWVBFMkhPV1RPIHRvIHRha2UgYSBsb2FkIG9mICNpZmRlZnMgb3V0IG9mCi0JY29mZmNvZGUuaAotCSogY29mZmNvZGUuaDogU3RhcnRlZCB0byBjaGFuZ2UgdGhlIHdheSBtYWNoaW5lIGRlcGVuZGVuY2llcyBhcmUKLQloYW5kbGVkLCBmcm9tIHRoZSBuZXN0IG9mICNpZmRlZnMgdG8gbWFjcm9zIGRlZmluZWQgaW4gdGhlCi0JaW5jbHVkaW5nIGNvZmYtPGZvbz4uYwotCi1GcmkgTm92IDIyIDA4OjExOjQyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgU2V0IHRoZSBgZXhlY3V0YWJsZScgYml0Ci0JaWYgdGhlIGVudHJ5IHBvaW50IGlzIGNvbnRhaW5lZCBpbiB0aGUgdGV4dCBzZWdtZW50LCBldmVuIGlmIHRoZQotCXRleHQgc2VnbWVudCBpcyBhdCBsb2NhdGlvbiAwLgotCi0JKiBjb2ZmLW1pcHMuYywgY29mZmNvZGUuaDogIFBldGVyIFNjaGF1ZXIncyBwYXRjaCB0byBrbHVkZ2UgaW4KLQlub25zdGFuZGFyZCBNSVBTIHNlY3Rpb25zICgucmRhdGEsIC5zZGF0YSwgZXRjKS4KLQotCSogYW91dHguaCwgYmZkLmMsIGNvZmZjb2RlLmgsIGllZWUuYywgb2FzeXMuYywgdGFyZ2V0cy5jOiBDT05TVCBsaW50LgotCSogbGliYmZkLWluLmgsIGxpYmJmZC5oLCBhb3V0eC5oLCBjb2ZmY29kZS5oLCBlbGYuYywgbGliYW91dC5oOgotCVJlbmFtZSBBTElHTiB0byBCRkRfQUxJR04gdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBCU0QgPHN5cy9wYXJhbS5oPi4KLQkqIGxpYmJmZC5jOiAgTGludC4KLQkqIGhvc3QtYW91dC5jLCB0cmFkLWNvcmUuYzogIEZpeCB3cml0ZV9hcm1hcCBwcm90b3R5cGVzLiAgTGludC4KLQotVGh1IE5vdiAyMSAxOTo1Njo0MCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi1zeW1zLmMsIHN5bXMuYzogIE1vdmVkIGJmZF9zdGFiX25hbWUoKSBhbmQgYmZkX3N0YWJfbmFtZXNbXQotCWZyb20gc3ltcy5jIHRvIG5ldyBmaWxlIHN0YWItc3ltcy5jLiAgQWxzbywgc2luY2UgR05VIGV4dGVuZGVkCi0JdHlwZSBjb2RlcyBzdWNoIGFzIE5fU0VUVCBhcmUgbm8gbG9uZ2VyIGluIC4uL2luY2x1ZGUvc3RhYi5kZWYsCi0JaW5jbHVkZSB0aGVtIG1hbnVhbGx5LgotCSogc3RhYi1zeW1zLmMsIGFvdXR4Lmg6IFJlbmFtZWQgYmZkX3N0YWJfbmFtZSgpIGFuZAotCWJmZF9zdGFiX25hbWVzW10gdG8gYW91dF9zdGFiX25hbWUoKSBhbmQgYW91dF9zdGFiX25hbWVzW10uCi0JKiBsaWJhb3V0Lmg6IEFkZGVkIHByb3RvdHlwZSBmb3IgYW91dF9zdGFiX25hbWUoKS4KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIE1ha2VmaWxlIGZvciBuZXcgc3RhYi1zeW1zLltjb10uCi0KLVRodSBOb3YgMjEgMTE6NTA6NDkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoV09SS19PVVRfRklMRV9QT1NJVElPTlMpOiAgT25lIG1vcmUgdHJ5IGF0IHRoaXMKLQlyYXRoZXIgY29tcGxpY2F0ZWQgc2VlbWluZyBwcm9ibGVtLiAgRWxpbWluYXRlIExPR0lDQUxfIHZlcnNpb25zLAotCWp1c3QgbWFrZSBOX1hYWCB3b3JrIGJ5IGV4Y2x1ZGluZyB0aGUgaGVhZGVyIGZyb20gdGhlIHRleHQgc2VnbWVudC4KLQkqIGFvdXR4Lmg6ICBGaXggY29tbWVudHMgdG8gbWF0Y2guCi0KLVR1ZSBOb3YgMTkgMTg6NDk6MDEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoV09SS19PVVRfRklMRV9QT1NJVElPTlMpOiAgVXNlIG5ldyBMT0dJQ0FMX1RYVEFERFIsCi0JTE9HSUNBTF9UWFRPRkYsIExPR0lDQUxfVFhUU0laRSBtYWNyb3MgdG8gZmlndXJlIG91dCBudW1iZXJzCi0JZm9yIHRoZSAibG9naWNhbCIgdGV4dCBzZWdtZW50IChpLmUuIG5ldmVyIGNvbnNpZGVyIHRoZSBleGVjCi0JaGVhZGVyIHRvIGJlIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCkuICBUaGlzIGNoYW5nZSBpcwotCW5lZWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB2YXJpb3VzIG90aGVyIHBhcnRzIG9mIGJmZCBhbmQgbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29lX2FvdXRfb2JqZWN0X3ApKTogIEZpeCBjb21tZW50LAotCWFuZCBtb3ZlIGNhbGN1bGF0aW9uIG9mIG9ial90ZXh0c2VjKGFiZmQpLT5zaXplIHRvIGxpYmFvdXQuaC4KLQkqIGJmZC1pbi5oOiAgUmVtb3ZlZCBib2d1cyAnOycuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIE1JTklNSVpFIGZsYWcgdG8gc2VsZWN0IGxlYW4KLQlvciBibG9hdGVkIHRhcmdldF92ZWN0b3IuCi0JKiB0YXJnZXRzLmM6ICBVc2UgbmV3IE1JTklNSVpFIG1hY3JvLCBhbmQgYWRkIHRyYWRfY29yZSBpZiBuZWVkZWQuCi0JKiBuZXdzb3MzLmM6ICBGaXhlcyB0byAuLi9pbmNsdWRlL2FvdXQ2NC5oIHJlbW92ZSBuZWVkCi0JZm9yIHNwZWNpYWwgTl9UWFRPRkYgbWFjcm8sIGJ1dCByZXF1aXJlIE5fSEVBREVSX0lOX1RFWFQuCi0KLU1vbiBOb3YgMTggMTI6MDA6NTkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmgsIGFvdXRmMS5oLCBuZXdzb3MzLmM6ICBNYWtlIGFvdXQtdGFyZ2V0LmgKLQloYW5kbGUgYm90aCBsaXR0bGUgYW5kIGJpZy1lbmRpYW4gdGFyZ2V0cywgd2l0aCBsaXR0bGUKLQl0aGUgZGVmYXVsdCB1bmxlc3MgVEFSR0VUX0lTX0JJR19FTkRJQU5fUCBpcyBkZWZpbmVkLgotCSogaG9zdC1hb3V0LmM6ICBBZGQgRklYTUUgbm90ZS4KLQotU3VuIE5vdiAxNyAxMzoyOTozOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiAgTWFrZSB0aGUgZGVmYXVsdCB0YXJnZXRfdmVjdG9yIGNvbnRhaW4KLQlqdXN0ICZERUZBVUxUX1ZFQ1RPUi4gIFRoaXMgbWFrZXMgZXhlY3V0YWJsZXMgYSBsb3Qgc21hbGxlci4KLQlPbGQgYmVoYXZpb3IgY2FuIGJlIGdvdHRlbiBieSBkZWZpbmluZyBBTExfVEFSR0VUUy4KLQkqIGFvdXRmMS5oLCBkZW1vNjQuYywgaTM4NmFvdXQuYywgbmV3c29zMy5jLCBzdW5vcy5jOgotCUZhY3RvcmVkIG91dCBjb21tb24gY29kZSBpbnRvIG5ldyBmaWxlIGFvdXQtdGFyZ2V0LmguCi0JU2F2ZXMgYSBsb3Qgb2YgZHVwbGljYXRlIGNvZGUgZm9yIGEub3V0IHZhcmlhbnRzLgotCi1GcmkgTm92IDE1IDEzOjAwOjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JR2V0ICdtYWtlIGhlYWRlcnMnIHRvIHdvcmsgd2hlbiBjb25maWd1cmVkIHdpdGggK3N1YmRpcnMuCi0JKiBNYWtlZmlsZS5pbjogQWRkICQoc3ViZGlyKSB0byBkb2NkaXIgcGF0aC4KLQkqIGRvYy9NYWtlZmlsZS5pbiAocHJvdG9zKTogQWRkICQoc3JjZGlyKSBwcmVmaXgKLQl0byBuYW1lIG9mIHNlZCBzY3JpcHRzLgotCi1UaHUgTm92IDE0IDE5OjQ5OjEwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSk6ICBGaXggdGhpbmtvLgotCSogc3ltcy5jIChiZmRfc3RhYl9uYW1lcyk6ICBUdXJuIG9uIG5ldyBHTlVfRVhUUkFfU1RBQlMgbWFjcm8KLQl0byBpbmNsdWRlIG5hbWVzIG9mIE5fU0VUVCBldGMuCi0KLVRodSBOb3YgMTQgMTk6MTE6MTMgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLSAgICAJKiBlbGYuYzogIEFkZCBtaW5pbWFsIHN1cHBvcnQgZm9yIEVMRiBzeW1ib2wgdGFibGVzLiAgR2VuZXJhdGVzCi0JY2Fub25pY2FsIGJmZCBzeW1ib2wgdGFibGVzIGZyb20gRUxGIHN5bWJvbCB0YWJsZXMuICBDaGFuZ2UgdGhlCi0JbmFtZSBvZiBzb21lIGZ1bmN0aW9ucyBmcm9tIGJmZF88bmFtZT4gdG8gZWxmXzxuYW1lPi4KLQotCSogc3ltcy5jOiAgVHJpdmlhbCBmaXggdG8gY29tbWVudCB0byByZW1vdmUgYSByZWR1bmRhbnQgInRvIi4KLQotV2VkIE5vdiAxMyAxNzowMjowMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi17aTM4NixtNjhrLG04OGt9LmM6ICBDaGFuZ2UgbmFtZSBvZiBmaWxlIGZvcm1hdCB0byBzdGFuZGFyZAotCWZvcm0gdGhhdCBHREIgcmVjb2duaXplcyBhcyBDT0ZGLgotCi1XZWQgTm92IDEzIDA5OjA5OjQxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoaWVlZV9vYmplY3RfcCk6ICBjYXN0IE5VTEwgY29ycmVjdGx5LgotCSogY29uZmlndXJlLmluOiBhZGRlZCBoYXJyaXMgaG9zdAotCi0JKiBjb2ZmLWEyOWsuYzogTG90cyBvZiBjaGFuZ2VzLCBtb3N0IGZyb20gRGF2aWQgV29vZC4KLQotVHVlIE5vdiAxMiAwNzoyMTo0MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1tODhrLmMgKGNvZmZfd3JpdGVfYXJtYXApOiAgSnVzdCAjdW5kZWYgaXQuCi0KLU1vbiBOb3YgMTEgMjA6MzA6MTggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHN0YW5kYXJkaXplIG9uIE1JTlVTX0cgdG8gZGlzYWJsZSBkZWJ1Z2dpbmcKLQkqIGNvZmYtbTg4ay5jOiBjcmVhdGUgY29mZiBhcm1hcHMgaW5zdGVhZCBvZiBic2Qgb25lcy4KLQkqIG9wbmNscy5jIChiZmRfY2xvc2VfYWxsX2RvbmUpLCAoYmZkX2Nsb3NlKTogTWFzayBvdXQgcmFuZG9tIGJpdHMKLQl3aGVuIGNhbGxpbmcgY2htb2QuCi0KLU1vbiBOb3YgMTEgMTk6MDc6MzIgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiAgQWRkaXRpb25zIHRvIHN1cHBvcnQgRUxGIGZvcm1hdCBjb3JlIGZpbGVzLgotCSogY29uZmlnL21oLWFtaXg6ICBBZGQgLURIQVZFX1BST0NGUyB0byBIREVGSU5FUywgc2luY2UgaG9zdAotCWhhcyBzdXBwb3J0IGZvciAvcHJvYyAoYWxsIHRoZSBpbmNsdWRlIGZpbGVzIGluIHBhcnRpY3VsYXIpLgotCi1Nb24gTm92IDExIDE4OjM2OjQ3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogIEhhbmRsZSB0aGUgY2FzZQotCW9mIHR3byBOX1NPIHN0YWJzLCBvbmUgZm9yIGRpcmVjdG9yeSwgYW5kIG9uZSBmb3IgZmlsZW5hbWUuCi0KLQkqIGJmZC1pbi5oIChwcmludF92bWEpOiAgRmFjdG9yIG91dCBkdXBsaWNhdGUgZGVmaW5pdGlvbi4KLQotCUV4aXQgYSBsaXR0bGUgbW9yZSBncmFjZWZ1bGx5IHdoZW4gbWFsbG9jIHJldHVybnMgTlVMTC4KLQkqIGxpYmJmZC5jOiBOZXcgZnVuY3Rpb24gYmZkX3htYWxsb2MgKG1hbGxvYyB3cmFwcGVyKS4KLQkqIG9wbmNscy5jLCBzeW1zLmMsIGJvdXQuYywgYW91dHguaDogIFJlcGxhY2UgbWFsbG9jIGJ5IGJmZF94bWFsbG9jLgotCSogbGliYmZkLmg6IFJyZS1nZW5lcmF0ZWQgZHVlIHRvIGxpYmJmZC5jIHVwZGF0ZS4KLQotU2F0IE5vdiAgOSAxMzo0NTowMSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LW02OGstZWxmOiAgRGVmaW5lIERFRkFVTFRfVkVDVE9SIGFzIGVsZl9iaWdfdmVjLgotCi0JKiBlbGYuYyAoZWxmX29iamVjdF9wKTogIERvbid0IHRyeSB0byBjcmVhdGUgYSBiZmQgc2VjdGlvbiBmb3IKLQl0aGUgZmlyc3QgRUxGIHNlY3Rpb24gaGVhZGVyLiAgSXQgaXMganVzdCBhIHBsYWNlaG9sZGVyLgotCi1TYXQgTm92ICA5IDAzOjA0OjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5jLCBjb25maWcvbWgtcnM2MDAwOiAgTWFrZSBpdCB3b3JrIG9uIGFyY2hpdmUgYW5kCi0JY29yZSBmaWxlcywgd2hlbiBjb21waWxpbmcgbmF0aXZlLgotCSogaG9zdHMvaC1yczYwMDAuaDogIERlZmluZSBGQVNDSVNUX0ZET1BFTiBmb3IgYmZkX2Zkb3BlbnIuCi0KLQlGSVhNRTogIFRoZSBhb3V0ZjEuaCBjaGFuZ2UgYmVsb3cgbmVlZHMgdG8gYmUgcmV2ZXJzZWQgYmFjawotCXRvIHRoZSB3YXkgaXQgd2FzLgotCi1UaHUgTm92ICA3IDExOjAzOjU1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBEZWZpbmVkIG5ldyBtYWNyb3MgW1BVVHxHRVRdTElORU5PX0xOTk8gZm9yCi0JbWFuaXB1bGF0aW9uIG9mIGxubm8gZmllbGRzIGluIGxpbmVubyBzdHJ1Y3RzIGluIGEgY29mZi08Zj4uaAotCWluZGVwZW5kZW50IHdheS4gT3ZlcnJpZGUgaXQgaW4gY29mZi08Zj4uaCB0byB5b3VyIGZhdm91cml0ZQotCW51bWJlciBpZiB5b3UgZG9uJ3QgaGF2ZSBhIDE2Yml0IGxubm8gZmllbGQuIChjb2ZmX3N3YXBfbGluZW5vX2luKQotCShjb2ZmX3N3YXBfbGluZW5vX291dCk6IG1vZGlmaWVkIHRvIHVzZSB0aGUgbmV3IG1hY3Jvcy4KLQotTW9uIE5vdiAgNCAxMTozODozMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2NhbGxiYWNrKTogTm93IGRlZmF1bHRzIHRvIDY4MDIwIHJhdGhlciB0aGFuCi0JdW5rbm93biBhcmNoIHdoZW4gdGhlIG1hZ2ljIG51bWJlciBkb2Vzbid0IHNwZWNpZnkgdGhlCi0JYXJjaGl0ZWN0dXJlLCBzaW5jZSBzb21lIE9TcyAoZWcgb2xkIHN1bjNzKSBkb24ndCBzZXQgdGhlIG51bWJlciwgYW5kCi0JMDIwIGlzIHByb2JhYmx5IHRoZSByaWdodCBhbnN3ZXIgYW55d2F5LgotCi1TdW4gTm92ICAzIDEyOjA3OjA4IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLW5ld3MuaCwgaG9zdHMvaC1ydGJzZC5oOgotCUdldCByaWQgb2YgTUlTU0lOR19WRlBSSU5URiwgc2luY2UgbGliaWJlcnR5IHByb3ZpZGVzIG9uZS4KLQkqIGJmZC1pbi5oIChiZmRfcHJpbnRfc3ltYm9sX3R5cGVfaG9wdyBlbnVtKTogICBBZGQgbmV3IG9wdGlvbgotCWJmZF9wcmludF9zeW1ib2xfbm0sIGZvciB1c2UgYnkgbm0uCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSk6ICBBZGQgY29kZSBmb3IgbmV3Ci0JYmZkX3ByaW50X3N5bWJvbF9ubSBvcHRpb24sIHRvIHByaW50IGluIG5tIGZvcm1hdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfcHJpbnRfc3ltYm9sKSwgaWVlZS5jIChpZWVlX3ByaW50X3N5bWJvbCkKLQlvYXN5cy5jIChvYXN5c19wcmludF9zeW1ib2wpOiAgUHJvdmlkZSBzdHViIGltcGxlbWVudGF0aW9ucwotCWZvciBiZmRfcHJpbnRfc3ltYm9sX25tLgotCSogc3ltcy5jOiAgTmV3IGZ1bmN0aW9uIGJmZF9kZWNvZGVfc3ltY2xhc3MsIHVzZWQgYnkgbm0gcHJpbnRlci4KLQlOZXcgZnVuY3Rpb24gYmZkX3N0YWJfbmFtZSB0byBsb29rIHVwIHN0cmluZyBuYW1lIG9mIHN0YWIgY29kZS4KLQotU2F0IE5vdiAgMiAxNDoyNjowMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBjdG9yLmMKLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0KSBhZGRlZAotCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwLgotCSogY29mZmNvZGUuaDogcmVtb3ZlZCBhIGxvYWQgb2YgI2lmIDBlZCBjb2RlLgotCShjb2ZmX2NvbXB1dGVfZmlsZV9zZWN0aW9uX3Bvc2l0aW9ucyk6IG5vdyB3b3JrcyBvdXQgdGhlIHNlY3Rpb24KLQlhbGlnbm1lbnQgYW5kIHNpemUgY29ycmVjdGx5IGluIGFsbCBjYXNlcy4KLQkoY29mZl9nZXRfc3ltdGFiKTogbG9va3MgZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMgYW5kIGNhbGxzIHRoZQotCXJpZ2h0IGZ1bmN0aW9uIHdoZW4gdGhleSdyZSBmb3VuZC4gKGNvZmZfY2Fub25pY2FsaXplX3JlbG9jKToKLQlrbm93cyB3aGVuIGEgc2VjdGlvbiBpcyBmdWxsIG9mIGNvbnN0cnVjdG9ycyBhbmQgZG9lcyB0aGUgcmlnaHQKLQl0aGluZy4KLQkqIGNwdS1tODhrLmM6IEFkZGVkIGRlZmF1bHRfcmVsb2NfdHlwZSBsb29rdXAgdG8gdGhlIGFyY2hpdGVjdHVyZQotCWRlc2NyaXB0aW9uLgotCSogbGliYmZkLWluLmg6IChiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCkgZGVmdW4gIGFkZGVkLgotCSogbGliY29mZi5oOiByZW1vdmVkICNpZiAwZWQgY29kZQotCSogcmVsb2MuYzogKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgYWRkZWQgQkZEX1JFTE9DX0NUT1IgZm9yCi0JYXJjaCBpbmRlcGVuZGVudCBjb25zdHJ1Y3RvciByZWxvY2F0aW9uIHR5cGUuCi0JKGJmZF9yZWxvY190eXBlX2xvb2t1cCk6IHJlbW92ZWQgdGhlIGNvbW1lbnQgInRoaXMgd2lsbCBnbyBhd2F5IgotCXNpbmNlIGl0IHdvbid0LiAoYmZkX2hvd3RvXzMyKTogc3RvbGVuIGZyb20gODhrLCB0aGlzIGlzIGEgMzJiaXQKLQlyZWxvYyB3aGljaCBpcyB1c2VkIHdoZW4gQkZEX1JFTE9DX0NUT1IgZmFsbHMgdGhyb3VnaCB0byBnaXZlIGEKLQlkZWZhdWx0IDMyYml0IHJlbG9jIGZvciBjb25zdHJ1Y3RvcnMuCi0JKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKTogYWRkZWQuCi0JKiBhb3V0ZjEuaDogZml4ZWQgU0VHTUVOVF9TSVpFIHR5cG8uCi0KLVRodSBPY3QgMzEgMTg6MjM6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmM6ICBDaGFuZ2UgbmFtZSB0byAiYWl4Y29mZi1yczYwMDAiLCB0byBhdm9pZAotCW1hdGNoaW5nIHByZWZpeCAiY29mZiIuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfYXV4X291dCk6ICBIYW5kbGUKLQlycy82MDAwIGNzZWN0IHJlY29yZHMuCi0KLVN1biBPY3QgMjcgMTY6NTY6NTggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYywgdGFyZ2V0cy5jOiBjaGFuZ2UgbmFtZSBvZiBtODhrX2JjcyB0byBtODhrYmNzCi0JKiBjb25maWd1cmUuaW46IGFkZCBtb3Rvcm9sYSBkZWx0YTg4IGNhc2VzCi0JKiBsaWJiZmQuaCwgbGliYmZkLWluLmgsIGFyY2hpdmUuYywgaWVlZS5jLCBlbGYuYywgc3JlYy5jOiBmaXgKLQl3cml0ZV9hcm1hcCBwcm90b3R5cGUKLQkqIGxpYmJmZC5jOiBhZGQgZG9jIG9uIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50Ci0KLUZyaSBPY3QgMjUgMDI6NDg6MTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBDT0ZGLXJlbGF0ZWQgZmlsZXMgaW4gYGNvZmYtQVJDSC5jJyBmb3JtLgotCWNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywKLQljb2ZmLW1pcHMuYywgY29mZi1yczYwMDAuYyB0byBiZSBleGFjdC4KLQotCSogTWFrZWZpbGUuaW46ICBPbmx5IHN1cHBseSBUQVJHRVRfREVGQVVMVFMgdG8gdGFyZ2V0cy5jLCByZWR1Y2luZwotCW1ha2Ugb3V0cHV0IGNsdXR0ZXIuCi0JKiBjb25maWcvbXQtKjogIERpdHRvLgotCi1UaHUgT2N0IDI0IDIyOjQwOjA3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUlMvNjAwMCBzdXBwb3J0LCBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGj79G5nLVRo5W8gVvUsIGFuZAotCUpvaG4gR2lsbW9yZS4gIEFyY2hpdmUgc3VwcG9ydCBmcm9tIERhbW9uIEEuIFBlcm1lemVsLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBjcHUtcnM2MDAwLmMgYW5kIHJzNjAwMGNvZmYuYy4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCByczYwMDAgY2FzZS4KLQkqIHRhcmdldHMuYzogIEFkZCByczYwMDAgdmVjdG9yLgotCSogYXJjaHVyZXMuYzogIEFkZCByczYwMDAsIGZpeCBjb21tZW50IG9uIHJvbXAuCi0JKiBiZmQtaW4uaCAoZW51bSBiZmRfZXJyb3IpOiAgQWRkIG5vX2RlYnVnX3NlY3Rpb24gZXJyb3IuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3RkYXRhKTogIFJlbW92ZSB1bnVzZWQgc3RyaW5nX3RhYmxlLgotCSogYmZkLmMgKGJmZF9lcnJtc2dzKTogIEFkZCBub19kZWJ1Z19zZWN0aW9uIGVycm9yIG1lc3NhZ2UuCi0JKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb24pOiAgUmV0dXJuIE5VTEwgb24gYXR0ZW1wdCB0byBjcmVhdGUKLQlhIHNlY3Rpb24gdHdpY2UuCi0JKiBjb2ZmY29kZS5oIChiZmRfc3dhcF9yZWxvY19pbik6ICBIYW5kbGUgcl90eXBlIGFuZCByX3NpemUuCi0JKGJmZF9zd2FwX2FvdXRoZHJfaW4pOiAgSGFuZGxlIGxvdHMgbW9yZSBtZW1iZXJzLgotCShtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiAgSWYgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNlZW4sCi0JanVzdCByZXR1cm4gZmFsc2UgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcgaXQuCi0JKGNvZmZfcmVhbF9vYmplY3RfcCk6ICBVbmRlcnN0YW5kIGluY29taW5nIG1hZ2ljIG51bWJlcnMuCi0JKGNvZmZfc2V0X2ZsYWdzKTogIFVuZGVyc3RhbmQgb3V0Z29pbmcgbWFnaWMgbnVtYmVycy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiAgb3V0Z29pbmcgYW91dGhkciBtYWdpYyAjLgotCShidWlsZF9kZWJ1Z19zZWN0aW9uKTogIEFkZCBmbiBmb3IgcmVhZGluZyBkZWJ1ZyBzdHJpbmcgc2VjdGlvbi4KLQkoZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogIEhhbmRsZSBzeW1ib2wgbmFtZXMgaW4gZGVidWcgc3RyaW5nIHNlY3Rpb24uCi0JUmVtb3ZlIHVudXNlZCBvYmpfc3RyaW5nX3RhYmxlLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBIYW5kbGUgcnM2MDAwLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3Nlcy4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MsIE5fU0VUKik6ICBDaGVjayBmb3IKLQlleGlzdGluZyBzZWN0aW9uIGJlZm9yZSBtYWtpbmcgb25lLgotCSogY3B1LXJzNjAwMC5jOiAgTmV3IGZpbGUuCi0JKiByczYwMDBjb2ZmLmM6ICBOZXcgZmlsZS4KLQotVGh1IE9jdCAyNCAwMjowMzoyNCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6IEFkZCBwYXJ0aWFsIHN1cHBvcnQgZm9yIEVMRiBmb3JtYXQgY29yZWZpbGVzLiBTdGlsbCBuZWVkcwotCXN1cHBvcnQgZm9yIGV4dHJhY3RpbmcgcmVnaXN0ZXJzIGZyb20gY29yZWZpbGVzLgotCi0JKiBjb25maWcvdC1tNjhrLWVsZjogIFNldCBERUZBVUxUX1ZFQ1RPUiB0byBlbGZfYmlnX3ZlYy4KLQotCSogY29uZmlnL3toLWFtaXgsaC1kZ3V4LGgtaXJpeDMsaC11bHRyYTN9OiBGb3Igc3lzdGVtcyB3aGVyZQotCVJBTkxJQiBpcyBkZWZpbmVkIGFzIGVjaG8sIHNlbmQgdGhlIG91dHB1dCB0byAvZGV2L251bGwgdG8gaGVscAotCXJlZHVjZSBjbHV0dGVyIGluIHRoZSBvdXRwdXQgZnJvbSBkb2luZyBhIG1ha2UuCi0KLU1vbiBPY3QgMjEgMTc6NDg6NDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtdmF4dWx0Lmg6ICBSZW1vdmUgbWFsbG9jL2ZyZWUgZGVjbHMgY292ZXJlZCBpbiBzdGRsaWIuaC4KLQlGaXggSE9TVF9QQUdFX1NJWkUgYW5kIEhPU1RfU0VHTUVOVF9TSVpFLiAgRnJvbSBEYXZpZCBUYXlsb3IuCi0KLU1vbiBPY3QgMjEgMDk6MzQ6MTEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBtYWtlIGl0IHBhZAotCXNlY3Rpb24gc2l6ZSBvdXQgaWYgdGhlcmUgYXJlIGFsaWdubWVudCByZXN0cmljdGlvbnMgc28gdGhhdCB0aGUKLQlpbWFnZSB3aWxsIGJlIG9rIG9uIGEgc3lzdGVtIHdoZXJlIHNlY3Rpb24gcG9zaXRpb25zIGFyZSB3b3JrZWQKLQlvdXQgYnkgYWNjdW11bGF0aW5nIHNpemVzIHJhdGhlciB0aGFuIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycy4KLQkqIHRhcmdldHMuYyAocHJvdG8gd3JpdGVfYXJtYXApLiBDaGFuZ2VkIG9ybF9jb3VudCB0byB1bnNpZ25lZC4KLQkqIG9wbmNscy5jIChiZmRfY2xvc2VfYWxsX2RvbmUpLiBBZGRlZCBzbyB0aGF0IGdlbmVyYXRpdmUKLQlwcm9ncmFtcyBsaWtlIGdhcyBjYW4gY2xvc2UgYSBiZmQgd2l0aG91dCBjYXVzaW5nIGJmZCBjb25mdXNpb24uCi0JKiBsaWJiZmQuaCAoY2hhbmdlZCBiZWN1YXNlIG9mIHByb3RvcykKLQkqIGFtZGNvZmYuYzogbWVzc2VkIHdpdGggdGhlIHdheSB0aGF0IGptcCBkaXNwbGFjZW1lbnRzIGFyZQotCWNhbGN1YWxhdGVkLiBUaGlzIG1heSBub3QgeWV0IGJlIHRvdGFsbHkgY29ycmVjdC4KLQkqIGFyY2hpdmUuYyAoY29mZl93cml0ZV9hcm1hcCk6IHJld3JvdGUgdGhlIHdheSB0aGF0IHJhbmxpYnMgYXJlCi0Jd3JpdHRlbiBvdXQuCi0JKiBjb2ZmY29kZS5oIChmaXh1cF9zeW1ib2xfdmFsdWUpOiBub3cgZG9lc24ndCBjb3JlIGR1bXAgaWYgYSBub24KLQlhYnMgc3ltYm9sIGhhcyBubyBzZWN0aW9uIChsaWtlIGEgcmVnaXN0ZXIgc3ltYm9sKS4KLQkoY29mZl93cml0ZV9zeW1ib2wpIG5vdyB6ZXJvcyBhdXhlbnQgYmVmb3JlIGZpbGxpbmcgaXQgdXAgdG8gaGVscAotCXdpdGggc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucy4KLQkqIGxpYmJmZC5jIChiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCk6IGFkZGVkLgotCi1XZWQgT2N0IDE2IDIyOjU4OjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYSBtYWNybyBzdHJlcnJvcigpLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIElmIEZBU0NJU1RfRkRPUEVOLCB1c2UgInIiLCBub3QgInIrIi4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6ICBTdXBwcmVzcwotCWF0dGVtcHQgdG8gcmVjb3ZlciBjb21tYW5kLCBpZmRlZiBOT19DT1JFX0NPTU1BTkQuCi0JKiBob3N0cy9oLXRhaG9lLmg6ICBBZGQgRkFTQ0lTVF9GRE9QRU4gYW5kIE5PX0NPUkVfQ09NTUFORDsKLQlyZXZhbXAgSE9TVF8qLCBldGMuCi0JKiBob3N0cy9oLWkzODZ2Lmg6ICBVc2UgPHV0aW1lLmg+LCBub3QgPHN5cy91dGltZS5oPiwgdW5saWtlIFBPU0lYLgotCi1XZWQgT2N0IDE2IDEyOjQzOjQ5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcmdtYXApOiBUaGUgc2l6ZSBvZiB0aGUgcmFubGliIHN0cnVjdHVyZXMKLQlzaG91bGQgbm90IGluY2x1ZGUgdGhlIHNpemUgZmllbGQgaXRzZWxmLgotCSogYW91dHguaCwgbGliYW91dC5oIChOQU1FKGFvdXQsIHNpemVvZl9oZWFkZXJzKSk6ICBVc2UKLQlhZGF0YShhYmZkKS0+ZXhlY19ieXRlc19zaXplIGZpZWxkIGluc3RlYWQgb2YgY29uc3RhbnQgbWFjcm8sCi0JYmVjYXVzZSBhb3V0eC5oIGNvbXBpbGVzIHRvIGEgc2ltcGxlIC5vIGZpbGUgc2hhcmVkIGJ5Ci0JYWxsIDMyLWJpdHMgYS5vdXQgdGFyZ2V0cy4KLQotV2VkIE9jdCAxNiAxMToxMTowNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWxsb3cgaTM4Ni1zY28tc3lzdi4KLQkqIGJvdXQuYzogIFJlbW92ZSB1bnVzZWQgaTk2MF9hbGlnbjsgbGludCBkdW1teSBjb3JlIGZpbGUgaGFuZGxlcnMuCi0JKiBjcHUtaDgzMDAuYzogIGxpbnQuCi0KLQkqIGhvc3QtYW91dC5jOiAgTmV3IHN0cmF0ZWd5LiAgV2UgdXNlIGNvbW1vbiBjb2RlLCBpbmNsdWRlIGZpbGVzLAotCWFuZCBkYXRhIHN0cnVjdHVyZXMgdG8gaGFuZGxlIHRoZSBmaWxlLCBidXQgc2V0IGEgZmV3IHBhcmFtZXRlcnMKLQlmcm9tIHRoZSBob3N0J3MgY29uZmlnIGZpbGUgKHBhZ2Ugc2l6ZSwgdGV4dCBzdGFydCBhZGRyLCBldGMpLgotCSogbGliYW91dC5oOiAgRGVmaW5lIEhQIEJTRCBtYWNoaW5lIHR5cGVzLgotCSogYW91dGYxLmg6ICBIYW5kbGUgcmVhZGluZyBhLm91dHMgd2l0aCB0aGVzZSB0eXBlcy4KLQotCSogdHJhZC1jb3JlLmM6ICBQYXNzIHRoZSB1LnVfYXIwIHZhbHVlIGFzIHRoZSBuZWdhdGl2ZSBvZiB0aGUKLQl2aXJ0dWFsLW1lbW9yeS1hZGRyZXNzIG9mIHRoZSAucmVnIHNlY3Rpb24uICBXZSBjYW4ndCBqdXN0IG1ha2UgYQotCXNlY3Rpb24gZm9yICJhbGwgdGhlIHJlZ3MgYW5kIG5vdGhpbmcgZWxzZSIgYmVjYXVzZSBvbmx5IEdEQiBrbm93cwotCWV4YWN0bHkgd2hlcmUgdGhlIHJlZ3MgYXJlIChzY2F0dGVyZWQgYXJvdW5kIHRoZSB1cGFnZSBhbmQgc3RhY2spLgotCUNsZWFuIHVwIG1lbW9yeSBhbGxvY2F0aW9uLiAgUmVtb3ZlIGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4KLQl2ZWN0b3JzLCByZXBsYWNlIHdpdGggc2luZ2xlIHZlY3RvcjsgdGhpcyBvbmx5IHJ1bnMgb24gdGhlIGhvc3QsCi0JaW4gaG9zdCBieXRlIG9yZGVyLiAgUmVwbGFjZSBieXRlc3dhcCByb3V0aW5lcyB3aXRoIGFib3J0cyBpbiBjYXNlCi0JYW55b25lIGNhbGxzIHRoZW0uCi0JKiB0YXJnZXRzLmM6ICBUaGVyZSdzIG9ubHkgb25lIHRyYWRfY29yZV92ZWMgbm93LgotCSogYW91dGYxLmggKHN1bm9zX2NvcmVfZmlsZV9wKTogIFZNQSBvZiAucmVnKiBub3cgbmVlZHMgdG8gYmUgMC4KLQotVHVlIE9jdCAxNSAwODoyOTowMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC1hbWl4LmggKGZyZWUpOiAgRml4IHByb3RvdHlwZS4KLQotCSogYW91dHguaDogIERvbid0IHVzZSBOVUxMIGFzIGFuIGludGVnZXIsIGZvciBicmFpbmRlYWQgc3lzdGVtcwotCXRoYXQgZGVjbGFyZSBpdCBhcyAodm9pZCAqKTAuICAoRnJvbSBQZXRlciBTY2hhdWVyLikKLQotTW9uIE9jdCAxNCAxNzoyMDo0NyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIEFkZCBwYXJlbnRoZXNlcyB0byBhdm9pZCByZXBvcnRlZAotCXByb2JsZW0gd2l0aCBiYWQgVWx0cml4IHN5c3RlbSBoZWFkZXJzLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSk6ICBUcnkgdG8gaGFuZGxlIHRoZQotCXZhcmlvdXMga2luZHMgb2YgYWxpZ25tZW50cyBmb3IgdGhlIHZhcmlvdXMga2luZHMgb2YKLQltYWdpYyBudW1iZXJzLgotCi1Nb24gT2N0IDE0IDE0OjIzOjEwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGU6ICBEb24ndCBhc3N1bWUgLiBpcyBvbiB0aGUgcGF0aCAoZnJvbSBKYW1lcyBDbGFyaykuCi0KLUZyaSBPY3QgMTEgMjI6NDU6MTQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQXZvaWQgU3VuIE1ha2UgVlBBVEggYnVncy4KLQkqIHRhcmdldHMuYzogIERlY2xhcmUgdHJhZF9jb3JlIHZlY3RvcnMgZXh0ZXJuLgotCi1GcmkgT2N0IDExIDEzOjAzOjAyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBNb3ZlZCBBTElHTiBtYWNybyB0byBsaWJiZmQuaC4gUmVtb3ZlZCBpOTYwX2FsaWduLgotCSogbGliYmZkLmg6IE1vdmVkIEFMSUdOIG1hY3JvIGhlcmUuCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogUmVwbGFjZSBpOTYwX2FsaWduIGJ5IGFsaWduX3Bvd2VyLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6ICBBZGRlZCBmaWVsZHMgcGFnZV9zaXplLAotCXNlZ21lbnRfc2l6ZSBhbmQgZXhlY19ieXRlc19zaXplLiAgVGhlc2UgaGVscCBnZW5lcmljIGNvZGUKLQkoaW4gYW91dHguaCBhbmQgbGliYW91dC5oKSB0byBmaWd1cmUgb3V0IHdoZXJlIHRvIGFsaWduCi0JdGhlIHZhcmlvdXMgc2VnbWVudHMgaW4gYSBkZW1hbmQgcGFnZWQgZmlsZS4KLQkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSKTogIFVzZSBuZXcgKHN0cnVjdCBhb3V0ZGF0YSkgZmllbGRzCi0JdG8gZGVjaWRlIGlmIHRoZSBleGVjIGhlYWRlciBjb3VudHMgaW4gYV90ZXh0ICh0ZXh0IHNlZ21lbnQgc2l6ZSkuCi0JQWxzbywgYXNzdW1lIERfUEFHRUQgZmxhZyBpcyBzZXQ7IGRvbid0IHNldCBpdCBoZXJlLgotCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IEFkZCBpbml0aWFsaXphdGlvbiBvZgotCWFkYXRhIGZpZWxkcyBwYWdlX3NpemUsIHNlZ21lbnRfc2l6ZSwgYW5kIGV4ZWNfYnl0ZXNfc2l6ZS4KLQkqIGhvc3QtYW91dC5jIChOQU1FKGhvc3RfYW91dCwgY2FsbGJhY2spIGFuZAotCU5BTUUoaG9zdF9hb3V0LG1rb2JqZWN0KTogRGl0dG8uCi0JKiBpMzg2YW91dC5jIChhb3V0Mzg2X2NhbGxiYWNrKSBhbmQgbmV3IGFvdXQzODZfbWtvYmplY3QpOiBEaXR0by4KLQkqIG5ld29zMy5jIChuZXdzb3MzX2NhbGxiYWNrKSBhbmQgbmV3IG5ld3Nvc19ta29iamVjdCk6IERpdHRvLgotCSogYW91dGYxLmMgKHN1bm9zNF9jYWxsYmFjaykgYW5kIG5ldyBzdW5vc19ta29iamVjdCk6IERpdHRvLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBEb24ndCBzdWJ0cmFjdAotCUVYRUNfQllURVNfU0laRSBmcm9tIHRoZSBhX3Rlc3Qgc2l6ZTsgdGhpcyBpcyBvbmx5IGFwcHJvcHJpYXRlCi0JZm9yIHNvbWUgc3lzdGVtcyAobWFpbmx5IHN1bm9zKSwgc28gZG8gaXQgaW4gdGhlIGNhbGxiYWNrIGluc3RlYWQuCi0JU2FtZSByb3V0aW5lOiBBZGQgc3R1ZmYgdG8gdGhlIFRISVNfSVNfT05MWV9ET0NVTUVOVEFUSU9OIGNvbW1lbnQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGFuZ2UgdGhlIHdheQotCWZpbGVwb3MgYW5kIHNpemUgb2Ygc2VjdGlvbnMgYXJlIGNhcnJpZWQgb3V0IHRvIHN1cHBvcnQKLQlvbGRlciBzdHlsZXMgb2YgZGVtYW5kIHBhZ2VkIGV4ZWN1dGFibGVzLgotCi0KLUZyaSBPY3QgMTEgMTI6MzM6MzYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogQWRkZWQgbW9yZSBtYWNyb3MgdG8gQ09GRl9TV0FQX1RBQkxFLgotCSogYmZkLmM6IEFkZGVkIG1hY3JvcyB0byBlbmFibGUgZ2FzIHRvIHN3YXAgY29mZiByZWNvcmRzLgotCSogY29mZmNvZGUuaDogTWFrZSB0aGUgY29mZl9zd2FwXypfb3V0IHJvdXRpbmVzIHJldHVybiB0aGUgbnVtYmVyCi0Jb2YgYnl0ZXMgc3dhcHBlZCwgYW5kIGNsZWFuZWQgdXAgdGhlaXIgcHJvdG90eXBlcy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgZWJtb24vY29mZiBzdXBwb3J0Ci0JKiBlY29mZi5jOiBDaGFuZ2VkIG51bGwgZGVmaW5pdGlvbnMgb2YgY29mZl9zd2FwXypfb3V0IHRvIGNvbmZvcm0KLQl0byBuZXcgcHJvdG90eXBlcwotCSogdGFyZ2V0cy5jOiBBZGRlZCBuZXcgZW50cnkgcG9pbnRzIGZvciBjb2ZmIHN3YXBwaW5nCi0KLUZyaSBPY3QgMTEgMDM6MDE6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSZXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIHNjaGVtZSBmb3IgYmZkLCBiaW51dGlscywgbGQuCi0KLQkqIGluY2x1ZGUvc3lzL2gtKi5oOiAgTW92ZSB0byBiZmQvaG9zdHMvaC0qLmguCi0JKiBjb25maWd1cmUuaW46ICBSZXZpc2UgdG8gc3ltbGluayBzeXNkZXAuaCB0byBob3N0cy9oLXh4eC5oLgotCUNoYW5nZSBzb21lIGNvbmZpZyBuYW1lcyB0byBtYXRjaCBvdGhlciBkaXJzLgotCSogKi5jOiAgSW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmgsIHNvIGFuc2lkZWNsIGFuZCBQUk9UTygpCi0JZ2V0IGRlZmluZWQgZmlyc3QuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSAtSS4gdG8gZ2V0IHN5c2RlcC5oLiAgUmVtb3ZlIHJlZnMgdG8KLQkuLi9pbmNsdWRlL3N5c2RlcC5oLgotCSogY3B1LWk5NjAuYzogIFN0cm5jbXAgbmVlZGVkIGEgbGVuZ3RoIGFyZy4KLQkqIGVjb2ZmLmM6ICBEb24ndCBldmVyIGNhbGwgdHJhZF91bml4X2NvcmVfZmlsZV9wIGZyb20gaGVyZS4KLQkqIGkzODZhb3V0LmM6ICBSZW1vdmUgZGVhZCBOX1RYVE9GRiBvdmVycmlkZS4KLQkqIHRyYWQtY29yZS5jOiAgRG9uJ3QgZGlzYWJsZSB0aGUgd2hvbGUgZmlsZSBpZiBTVU40X1NZUy4KLQkqIGNvbmZpZy86ICBSZW5hbWUgc29tZSBjb25maWcgZmlsZXMgdG8gbWF0Y2ggdXAgaC0qLmggbmFtZXMuCi0JUmVtb3ZlIGFsbCB0aGUgSE9TVF9TWVMgZGVmaW5pdGlvbnMgZnJvbSB0aGUgY29uZmlnIGZpbGVzLgotCSogaG9zdHMvaC1hbWl4LmgsIGgtaTM4NnYuaDogIERlZmluZSBQT1NJWF9VVElNRSwgbm90IFVTRy4KLQkqIGhvc3RzL2gtaHA5MDAwLmg6ICBSZW1vdmUgVVNHIGNvbW1lbnQuCi0JKiBob3N0cy9oLXJzNjAwMC5oOiAgSW5jbHVkZSA8c3RkbGliLmg+IGZvciBtYWxsb2MuCi0JKiBob3N0cy9oLW5ld3MuaCwgaC1zcGFyYy02NC5oOiAgTmV3IGNvbmZpZyBmaWxlcyB0aGF0IGhhZAotCXByZXZpb3VzbHkgYmVlbiBrbHVkZ2VkIGluIHRoZSA8c3lzZGVwLmg+IGZpbGUuCi0KLVRodSBPY3QgMTAgMTc6NTQ6MDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy8qOiAgdHJhZC1jb3JlIHN1cHBvcnQgaXMgSE9TVCBkZXBlbmRlbnQsIG5vdCB0YXJnZXQKLQlkZXBlbmRlbnQuICBUYXJnZXQgY29uZmlnIGZpbGVzIG9ubHkgc2V0IERFRkFVTFRfVkVDVE9SIGFuZC9vcgotCW90aGVyIHZlY3RvciBlbGVtZW50cy4gIEV4Y2VwdGlvbjogIHdoZW4gaG9zdC1hb3V0LmMgaXMgaW4gdXNlLAotCWluIHdoaWNoIGNhc2Ugd2UncmUgZm9yY2VkIHRvIGFzc3VtZSB3ZSdyZSBuYXRpdmUgKGhwLCB2YXgsCi0JdGFob2UpLiAgUmVuYW1lIFhERVBGSUxFUyB0byBIREVQRklMRVMuCi0JKiBNYWtlZmlsZS5pbjogIFJlbmFtZSBYREVQRklMRVMuCi0JKiBjb25maWcvaC1zdW4qOiAgRG9uJ3QgZm9yY2Ugc3RhdGljIGxpbmtpbmcuCi0JKiB0cmFkLWNvcmUuYzogIERvY3VtZW50IGhvdyB0byB1c2UgaXQgbm93YWRheXMuCi0JKiBpMzg2YW91dC5jLCBuZXdzb3MzLmM6ICBDbGVhbiB1cC4KLQkqIGkzODZjb2ZmLmM6ICBBbGxvdyAzODYgY29mZiBmaWxlcyB0byBiZSB1c2VkIGFzIGNvcmUgZmlsZXMgdG9vCi0JKGZvciByZWFkaW5nIGNvcmUgZmlsZXMgZnJvbSBlbWJlZGRlZCBzeXN0ZW1zKS4KLQotVHVlIE9jdCAgOCAxNTozMDozOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogQWRkIGkzODZhb3V0LmMgZm9yIGEub3V0IHN1cHBvcnQgb24gdGhlIGkzODYuCi0KLVR1ZSBPY3QgIDggMTI6MTg6NTQgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYywgc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYzogY29ycmVjdCBpbmZvLW5vZGUKLQlzdHJ1Y3R1cmUgaW4gKmRvYyogY29tbWVudHMuCi0JZG9jL01ha2VmaWxlOiBzdG9wIGhpZGluZyBjb21wbGFpbnRzIGZyb20gbWFrZWluZm8uCi0KLVN1biBPY3QgIDYgMTk6MTA6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKC4uLnNvbWVfYW91dF9vYmplY3RfcCk6ICBUYWtlIGEgdGhpcmQgcGFyYW1ldGVyLAotCXRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdCwgYW5kIGF2b2lkIGV2ZXIgbG9va2luZyBhdCBhbgotCWV4dGVybmFsX2V4ZWMuICBBbGwgY2FsbGVycyBjaGFuZ2VkIHRvIHJlYWQgdGhlIGVudGlyZQotCWV4dGVybmFsX2V4ZWMgc3RydWN0LCBzd2FwIGFuZCBjaGVjayBpdHMgbWFnaWMgbnVtYmVyLAotCXN3YXAgaW4gdGhlIHdob2xlIHN0cnVjdHVyZSwgYW5kIHBhc3MgdGhlIHN3YXBwZWQtaW4gdmVyc2lvbiB0bwotCXNvbWVfYW91dF9vYmplY3RfcC4KLQkqIGJvdXQuYzogIEJyaW5nIGludG8gbW9kZXJuIGVyYS4gIFVzZSBzaW5nbGUgX29iamVjdF9wIHJvdXRpbmUKLQlmb3IgYmlnLSBhYW5kIGxpdHRsZS1lbmRpYW4uICBQcm92aWRlIGludGVybmFsIGFuZCBleHRlcm5hbAotCWV4ZWMgaGVhZGVyIHN0cnVjdHMuICBVc2Ugc2VwYXJhdGUgc3dhcC1pbiBhbmQgc3dhcC1vdXQgcm91dGluZXMuCi0KLQkqIGxpYmFvdXQuaDogIE1vdmUgc3RydWN0IGludGVybmFsX2V4ZWMgZnJvbSAuLi9pbmNsdWRlL2FvdXQ2NC5oCi0JdG8gaGVyZS4gIEFkZCBvYmpfc3ltYm9sX2VudHJ5X3NpemUgdG8gc3RydWN0IGFvdXRkYXRhLgotCSogYW91dHguaCAoLi4uc29tZV9hb3V0X29iamVjdF9wKTogIFNldCBvYmpfc3ltYm9sX2VudHJ5X3NpemUuCi0KLQkqIC4uL2luY2x1ZGUvYW91dDY0Lmg6ICBDaGFuZ2UgRVhURVJOQUxfTElTVF9TSVpFIHRvCi0JRVhURVJOQUxfTkxJU1RfU0laRS4gIENhbGxlcnMgY2hhbmdlZC4KLQotRnJpIE9jdCAgNCAxODoxODo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBSZW1vdmUgc3RyZXJyb3IoKSB0byBsaWJpYmVydHkuCi0KLQkqIGVsZi5jOiAgUmVtb3ZlIGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cywgdXNlIGdlbmVyaWMgb25lLiAgTGludC4KLQkqIGxpYmJmZC1pbi5oLCBsaWJiZmQuYzogIEFkZCBiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cy4KLQkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY197Z2V0LHNldH1fc2VjdGlvbl9jb250ZW50cyk6ICBDaGVjayB0aGF0Ci0JbGFzdCBieXRlIG9mIHRyYW5zZmVyLCBub3QgZmlyc3QgYnl0ZSwgaXMgd2l0aGluIHRoZSBzZWN0aW9uLgotCi0JKiBob3N0LWFvdXQuYzogIFJlbW92ZSBgQlNEJyBhcmNoaXZlIHN1cHBvcnQuICBMaW50LgotCi0JKiBhcmNodXJlcy5jOiBSZW5hbWUgYHN0cnVjdCBiZmRfYXJjaF9pbmZvX3N0cnVjdCcgdG8gYHN0cnVjdAotCWJmZF9hcmNoX2luZm8nLiAgUmVuYW1lIGB0eXBlZGVmIGJmZF9hcmNoX2luZm9fc3RydWN0X3R5cGUnIHRvCi0JYGJmZF9hcmNoX2luZm9fdHlwZScuICBBbGwgdXNlcyBjaGFuZ2VkLgotCSogcmVsb2MuYzogIFJlbmFtZSBgYmZkX3JlbG9jX3N0YXR1c19lbnVtX3R5cGUnIHRvCi0JYGJmZF9yZWxvY19zdGF0dXNfdHlwZScuICBSZW5hbWUgYGJmZF9yZWxvY19jb2RlX2VudW1fcmVhbF90eXBlJwotCXRvIGBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUnLiAgKFRoaXMgc2VlbXMgdG8gYmUgYSBtaXNub21lciwKLQlpdCBuZWVkcyBhIGJldHRlciBuYW1lLikgIEFsbCB1c2VzIGNoYW5nZWQuCi0JKiB0YXJnZXRzLmM6ICBSZW5hbWUgYGVudW0gdGFyZ2V0X2ZsYXZvdXJfZW51bScgdG8gYGVudW0KLQl0YXJnZXRfZmxhdm91cicsIGFuZCByZW1vdmUgdGhlIGBfZW51bScgZnJvbSBhbGwgb2YgdGhlIGVudW0KLQl2YWx1ZXMgdGhlbXNlbHZlcy4gIEFsbCB1c2VzIGNoYW5nZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2gtaTM4Nm1hY2g6ICBpMzg2IG1hY2ggaG9zdC4KLQkqIGNvbmZpZy90LWkzODYtYW91dDogIFVzZSBob3N0LWFvdXQuYy4KLQotCSogdHJhZC1jb3JlLmM6ICBHaXZlIGl0IGl0cyBvd24geHZlYydzIHRvIG1ha2UgaXQgaW5kZXBlbmRlbnQKLQlvZiBvdGhlciBmaWxlIGZvcm1hdHMuCi0JKiBlY29mZi5jLCBob3N0LWFvdXQuYzogIFJlbW92ZSByZWZzIHRvIHRyYWQtY29yZS4KLQkqIGNvbmZpZy90LWRlYzMxMDAsIHQtaHAzMDBic2QsIHQtdGFob2UsIHQtdmF4OiAgRGVmaW5lIFRSQURfQ09SRS4KLQkqIHRhcmdldHMuYzogICNpZmRlZiBUUkFEX0NPUkUsIGluY2x1ZGUgaXQgaW4gdGhlIHZlY3Rvci4KLQotRnJpIE9jdCAgNCAxNzozODowMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmM6IEV4dGVuZGVkIE5FV0hPV1RPIG1hY3JvCi0JKiBpZWVlLmM6IENoYW5nZWQgdGhlIHdheSA4Yml0IHBjcmVsIGlzIGRvbmUKLQkqIGNwdS1oODMwMC5jOiBnb3QgdGhlIHJlZ2lzdGVycyBpbiB0aGUgcmlnaHQgb3JkZXIKLQotVGh1IE9jdCAgMyAxOTozOTo1NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6ICBlbnVtIGJvb2xlYW4gPT4gZW51bSBiZmRfYm9vbGVhbiBmb3IgU1ZSNC4gIEd1bWJ5J3MKLQlwcmVkaWN0aW9uIGlzIHZpbmRpY2F0ZWQhCi0KLQkqIGJmZC1pbi5oLCBsaWJiZmQtaW4uaCwgZG9jL01ha2VmaWxlLCBkb2MvdG9saWJiZmQsIGRvYy9pbnRvYmZkOgotCVJlbW92ZSByZWZzIHRvIGhvd3RvLmMsIHNpbmNlIFN0ZXZlIGZvcmdvdC4KLQotVGh1IE9jdCAgMyAwNzo0OToyMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiB0b29rIHRoZSBhYm9ydCBvdXQgb2Ygc2V0X2FyY2hfbWFjaCBzbyB0aGF0IG9iamR1bXAgLWkgd2lsbAotCXN0aWxsIHdvcmsuIE5vdyBhbGxvd3MgYW55IGFyY2hpdGVjdHVyZS9tYWNoaW5lIHRvIGJlIHNldC4KLQotV2VkIE9jdCAgMiAxMzo1MDozNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvd3RvLmMgZGVsZXRlZCBhbmQgbW92ZWQgY29kZSB0byByZWxvYy5jCi0KLQkqIGxpYmJmZC5oLCBsaWJiZmQtaW4uaCByZW1vdmVkICRpZCBzdHVmZiBmb3IgcmVhbAotCi0JKiBjcHUtaDgzMDAuYyBNYWRlIGl0IG1hdGNoIHZhcmlvdXMgZGlmZmVyZW50IHNwZWxsaW5ncyBvZiBoODMwMC4KLQotCSogYXJjaHVyZXMuYzogVG9vayBvdXQgdGhlIGZpcnN0IGNoYXIgZmlsdGVyIHdoaWNoIG1hZGUgaXQgb25seQotCWxvb2sgZm9yIGEgY3B1L2FyY2ggbWF0Y2ggd2hlbiB0aGUgZmlyc3QgY2hhcnMgb2Ygc3VwcGxpZWQgYW5kCi0JdGVzdGVkIG5hbWVzIHdlcmUgdGhlIHNhbWUuCi0KLQkqIHRhcmdldHMuYyByZW1vdmVkIG9hc3lzIHN0dWZmLCBwZW5kaW5nIHNvbWVvbmUgdG8gZml4IHRoZSBidWdzCi0JaW4gaXQuCi0KLQotVHVlIE9jdCAgMSAxMjoyOTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jLCBlbGYuYzogIEFkZCBwcmVsaW1pbmFyeQotCUVMRiBzdXBwb3J0IGdvb2QgZW5vdWdoIGZvciBHREIuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9oLWFtaXgsIGNvbmZpZy90LW02OGstZWxmOiAgSGFuZGxlCi0JbTY4ay1jYm0tc3ZyNCBob3N0IGFuZCB0YXJnZXQuCi0JKiBjb25maWcvdC1tNjhrLWNvZmYsIHQtbTg4ay1jb2ZmLCB0LW04OGstYW91dDogIE1ha2UgZmlsZXMgbm9uZW1wdHkKLQlzbyBgZGlmZicgYW5kIGBwYXRjaCcgY2FuIGNvcGUuCi0KLVR1ZSBPY3QgIDEgMTE6MjQ6MzEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jOiByZW1vdmVkIHRleGluZm8gZXJyb3IKLQotCSogaW5pdC5jOiBhZGRlZCB0ZXhpbmZvIGhvb2tzLCBhbmQgcmVtb3ZlZCBpbml0aWFsaXphdGlvbiBlcnJvcgotCW1lc3NhZ2UuCi0KLQkqIGxpYmNvZmYtaW4uaCwgbGliYmZkLWluLmggcmVtb3ZlZCAkaWQgZmllbGQgc28gY3ZzIGNhbiBtZXJnZQotCXdpdGhvdXQgY29tcGxhaW50cy4KLQotVHVlIE9jdCAgMSAwNTowMjo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY3B1LWk5NjAuYzogIEF2b2lkIG51bWVyaWNhbCBjb3VudCBvZiBpbml0aWFsaXplcnMuCi0KLQlWYXggVWx0cml4IGNoYW5nZXMgZnJvbSBEYXZpZCBUYXlsb3IgPHRheWxvckB0aGluay5jb20+OgotCSogaG9zdC1hb3V0LmM6ICBNYWtlIGxpdHRsZS1lbmRpYW4gdmVjdG9yIHJlYWxseSBsaXR0bGUtZW5kaWFuLgotCSogY29uZmlndXJlLmluOiAgU2VwYXJhdGUgdmF4IGFuZCB0YWhvZSBjYXNlcywgaGFuZGxlIHVsdHJpeC4KLQkqIGNvbmZpZy90LXZheDogIEFkZCB0cmFkLWNvcmUuby4KLQkqIGNvbmZpZy9oLXZheHVsdDogIE5ldyBob3N0IHN5c3RlbS4KLQotTW9uIFNlcCAzMCAxNToxMzo0NiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIFZFUlNJT04sIGNoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAwLjE4LCB0aGlzIG1ha2VzIGEKLQlnYXAsIGJ1dCBub3cgaXMgdGhlIHNhbWUgYXMgdGhlIGxpbmtlciB2ZXJzaW9uIG51bWJlci4KLQotCSogY3B1LWEyOWsuYywgY3B1LWkzODYuYywgY3B1LW02OGsuYywgY3B1LW1pcHMuYywgY3B1LXZheC5jLAotCWNwdS1oODMwMC5jLCBjcHUtaTk2MC5jLCBjcHUtbTg4ay5jLCBjcHUtc3BhcmMuYzogYWRkZWQuIFRoZXNlCi0JZmlsZXMgd2lsbCBldmVudHVhbGx5IGNvbnRhaW4gcHJvY2Vzc29yIHNwZWNpZmljIGJpdHMgZm9yIGJmZCwKLQlsaWtlIHN0cmFuZ2UgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGlzL2Fzc2VtYmx5LiAgU28gZmFyIG9ubHkKLQl0aGUgSDggaGFzIGJlZW4gZXZlbiBwYXJ0aWFsbHkgZG9uZS4gIFRoaXMgd29yayBhbHNvIHRpZXMgaW4gd2l0aAotCXRoZSBjaGFuZ2UgaW4gaGFuZGxpbmcgYXJjaGl0ZWN0dXJlcy4KLQotCSogYW1kY29mZi5jOiAoYTI5a19yZWxvYykgZml4IGVycm9yIG1lc3NhZ2UuCi0KLQkqIGFvdXQtZjEuaDogKGNob29zZV9yZWxvY19zaXplKSBub3cgY2FsbHMgYmZkX2dldF9hcmNoIHRvCi0JZGlzY292ZXIgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgYmZkLiAoc3Vub3M0X2NhbGxiYWNrKSBjYWxscyB0aGUKLQlmdW5jdGlvbiBiZmRfc2V0X2FyY2hfbWFjaCByYXRoZXIgdGhhbiBzdHVmZmluZyBzdHVmZiBkaXJlY3RseQotCWludG8gdGhlIGJmZC4gKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpLCBjaGFuZ2VkIG5hbWVzIG9mCi0JYWNjZXNzb3IgZnVuY3Rpb25zLgotCi0JKiBhb3V0eC5oOiAoc2V0X2FyY2hfbWFjaCkgbm93IGNhbGxzIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggdG8KLQlzZXR1cCB0aGUgZW52aXJvbm1lbnQuCi0KLQkqIGFyY2hpdmUuYzogKGJmZF9zbHVycF9jb2ZmX2FybWFwKSBjb2ZmIGFyY2hpdmVzIGFsd2F5cyBoYXZlIHRoZQotCWhlYWRlcnMgaW4gYmlnIGVuZGlhbiBmb3JtYXQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbmVzcyBvZiB0aGUKLQlob3N0IG9yIHRhcmdldC4KLQotCSogYXJjaHVyZXMuYzogdG90YWxseSBjaGFuZ2VkLiBOb3cgYW4gYXJjaGl0ZWN0dXJlIGlzIHJlcHJlc2VudGVkCi0Jd2l0aCBhIHBvaW50ZXIgdG8gYW4gaW5mbyBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gYW4gZW51bWVyYXRlZCB0eXBlCi0JYW5kIGEgbG9uZy4gVGhlIG9sZCBpbmZvIGlzIGF2YWlsYWJsZSBhcyB0d28gZWxlbWVudHMgaW4gdGhlCi0Jc3RydWN0dXJlLiAgRnV0dXJlIGVuaGFuY2VtZW50cyB0byBhcmNoaXRlY3VyZSBzdXBwb3J0IHdpbGwKLQlpbnZvbHZlIHBvaW50ZXJzIHRvIG1ldGhvZHMgYmVpbmcgcGxhY2VkIGludG8gdGhlIGluZm8gc3RydWN0dXJlLgotCi0JKiBiZmQuYzogY2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYmZkIHN0cnVjdHVyZSBmb3IgdGhlIG5ldwotCWFyY2hpdGVjdHVyZSBzdHVmZi4KLQotCSogYm91dC5jOiAoYl9vdXRfc2V0X2FyY2hfbWFjaCkgY2hhbmdlZCB0byB1c2UgdGhlIG5ldwotCWFyY2hpdGVjdHVyZSBtZWNoYW5pc20uCi0KLQkqIGNvZmZjb2RlLmg6IChjb2ZmX3NldF9hcmNoX21hY2gsIGNvZmZfc2V0X2ZsYWdzKSBjaGFuZ2VkIHRvIHVzZQotCXRoZSBuZXcgYXJjaGl0ZWN0dXJlIG1lY2hhbmlzbS4KLQotCSogY29uZmlndXJlLmluOiBhZGRlZCBoOCBzdHVmZi4KLQotCSogaWVlZS5jOiB0b28gbWFueSBjaGFuZ2VzIHRvIG5vdGUuICBOb3cgaWVlZSBmaWxlcyB3cml0dGVuIHdpdGgKLQliZmQgZ2FzIGFuZCBsZCBjYW4gYmUgcmVhZCBieSBnbGQgYW5kIGllZWUgb25seSBsaW5rZXJzIGFuZAotCXNpbXVsYXRvcnMuCi0KLQkqIGxpYmJmZC5jLCBsaWJiZmQuaDogY2hhbmdlZCBwcm90b3R5cGUgb2YgYmZkX3dyaXRlLgotCi0JKiBuZXdzb3MzLmM6IChuZXdvczNfY2FsbGJhY2spIG5vdyBjYWxscyBiZmRfc2V0X2FyY2hfbWFjaCByYXRoZXIKLQl0aGFuIGZpeGluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5LgotCi0JKiBvYXN5cy5jOiAob2FzeXNfb2JqZWN0X3ApIG5vdyBjYWxscyBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIHJhdGhlcgotCXRoYW4gZml4aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuCi0KLQkqIG9wbmNscy5jOiAobmV3X2JmZCkgbWFrZXMgc3VyZSB0aGF0IGJmZF9pbml0IGhhcyBiZWVuIGNhbGxlZAotCWJlZm9yZSBvcGVuaW5nIGEgYmZkLgotCi0JKiBzcmVjLmM6IChzcmVjX3NldF9hcmNoX21hY2gpIG5vdyBjYWxscyBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi0JcmF0aGVyIHRoYW4gZml4aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuCi0KLQkqIHRhcmdldHMuYzogKHRhcmdldF92ZWN0b3IpIG5vdyBieSBkZWZpbmluZyBTRUxFQ1RfVkVDUyAocGVyaGFwcwotCWluIHRoZSB0L2htYWtlIGZpbGUpIGEgdXNlciBjYW4gc2VsZWN0IHdoaWNoIGJhY2tlbmRzIHRoZXkgd2FudAotCWxpbmtlZCB3aXRoIGJmZCB3aXRob3V0IGNoYW5naW5nIHRoZSBzb3VyY2UuCi0KLQkqIGluaXQuYzogbmV3LCBsb29rcyBhZnRlciBpbml0aWFsaXppbmcgbW9kdWxlcy4KLQotCSogaG93dG8uYzogZm9yIGZ1dHVyZSB1c2UsIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gd29yayBvdXQKLQl3aGF0IGNvb2tpZSB0byB1c2UgYXMgYSBoYW5kbGUgb24gYSByZWxjb2F0aW8gaG93dG8uCi0KLU1vbiBTZXAgMzAgMTM6MzE6MTUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNyZWMuYzogIEJldHRlciBlcnJvciBjaGVja2luZywgcGFydGx5IGZyb20gUGV0ZXIgU2NoYXVlci4KLQkoc3JlY19vYmplY3RfcCk6ICBBdm9pZCBhc3N1bWluZyBhbnkgZmlsZSB0aGF0IHN0YXJ0cyB3aXRoICdTJyBpcwotCWFuIFMtcmVjb3JkIGZpbGUhICAoQ2hlY2sgZm9yIDMgdXBwZXJjYXNlLWhleCBkaWdpdHMgYWZ0ZXIgaXQuKQotCShJU0hFWCk6ICBEZWZpbmUgbmV3IG1hY3JvIGZvciBjaGVja2luZyBzdXBwb3NlZGx5IGhleCBjaGFyYWN0ZXJzLgotCShwYXNzX292ZXIpOiAgVHJlYXQgYXMgRU9GIGFueSBTLXJlY29yZCBsaW5lIHRoYXQ6Ci0JICAgICogIGRvZXNuJ3QgaGF2ZSBoZXggaW4gZWl0aGVyIHNpemUgY2hhcmFjdGVyCi0JICAgICogIHByb2R1Y2VzIGEgc2l6ZSBsYXJnZXIgdGhhbiAweDdGCi0JICAgICogIGhhcyBhbiB1bnJlY29nbml6ZWQgdHlwZSBudW1iZXIKLQotVGh1IFNlcCAyNiAxNToyNzoyOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmgsIGFvdXR4LmgsIGJvdXQuYywgY29mZmNvZGUuaCwgaG9zdC1hb3V0LmMsIG9hc3lzLmMsCi0Jb3BuY2xzLmM6ICBMaW50IChzYWJlciBhY3R1YWxseSkuCi0KLVRodSBTZXAgMjYgMTE6MjQ6MjQgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSUyk6IFNldCBoZWFkZXIncyBhX3RleHQgZmllbGQgYWx3YXlzLgotCSogbmV3c29zMy5jOiBGaXhlZCB0d28gdHlwZXM6IG5ld29zMyAtPiBuZXdzb3MzLgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZpeCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uCi0JdG8gdXNlIGNvcnJlY3Qgc2VnbWVudC4KLQotTW9uIFNlcCAyMyAxODoyNDozNCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAocHJpbnRfc3ltYm9sKTogIEhhbmRsZSBtaXNzaW5nIHN5bWJvbC0+bmFtZS4KLQotRnJpIFNlcCAyMCAxMjoyNjowMSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3dhcGNvcmVfc3BhcmMpOiAgQ2hhbmdlIG5hbWUgb2YgVVNSU1RBQ0ssIGZpeCBjb21tZW50Ci0JYXQgdG9wIG9mIHJvdXRpbmUuCi0KLVR1ZSBTZXAgMTcgMTc6MjM6NDkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogb2FzeXMuYywgY29uZmlndXJlLmluLCBjb25maWcvaC1pcml4MywgY29uZmlnL3QtaXJpeDM6Ci0JYWRkIHNnaS9pcml4IHN1cHBvcnQuCi0KLVRodSBTZXAgMTIgMTQ6Mjk6MDkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyBmb3IgdGhlIEFNRCAyOTAwMCBVbHRyYWNvbXB1dGVyIHBvcnQgZnJvbSBEYXZpZCBXb29kLgotCSh3b29kQG55dS5lZHUpLgotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgSGFuZGxlIE5PX0ZDTlRMLgotCi0JKiBNYWtlZmlsZS5pbjogIE1ha2Ugc3ViZGlycyB3b3JrIGJ5IHVzaW5nICQoSU5DRElSKSBpbiB0aGUKLQljcnVkZSBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCk6ICBQYXNzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCWN1cnJlbnQgZmlsZSdzIGNvZmYgc3ltYm9sIGZvcm1hdCB0byBCRkQgdmlhIHRoZSBjb2ZmX2RhdGEgc3RydWN0LgotCShjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogIG9ial9pY29mID0+IGNvZmZfZGF0YS4KLQkoY29mZl9zd2FwX3N5bV97aW4sb3V0fSk6ICBDaGVjayB0aGF0IFNZTU5NTEVOID09IEVfU1lNTk1MRU4uCi0JKGNvZmZfc3dhcF9hdXhfe2luLG91dH0pOiAgQ2hlY2sgdGhhdCBGSUxOTUxFTiA9PSBFX0ZJTE5NTEVOCi0JYW5kIERJTU5VTSA9PSBFX0RJTU5VTS4KLQkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBhMjlrLSotKiBob3N0cywgYW5kIHRhcmdldHMKLQlhMjlrLSotY29mZiwgYTI5ay0qLWFvdXQsIGFuZCBhMjlrLSotc3ltMS4KLQkqIGxpYmNvZmYtaW4uaDogIEFkZCBsb2NhbF9uX2J0bWFzaywgbG9jYWxfbl9idHNoZnQsCi0JbG9jYWxfbl90bWFzaywgbG9jYWxfbl90c2hpZnQsIGxvY2FsX3N5bWVzeiwgbG9jYWxfYXV4ZXN6LAotCWxvY2FsX2xpbmVzeiB0byBgY29mZl9kYXRhJyAodGRhdGEpIHN0cnVjdC4KLQkoY29mZl9kYXRhLCBjb2ZmX2RhdGFfdHlwZSwgY29mZl90ZGF0YSk6ICBSZW5hbWUgc3RydWN0IGljb2ZkYXRhLgotCSogY29uZmlnL2gtdWx0cmEzOiAgSGFuZGxlIGEyOWstKi0qIGhvc3RzIGFzIFVsdHJhY29tcHV0ZXJzLgotCi1UaHUgU2VwIDEyIDE0OjA3OjIyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogJChNQUtFKSBmb3IgbWFrZSwgJChkb2NkaXIpIGZvciBkb2MKLQkqIGRvYy9NYWtlZmlsZTogcmVkdW5kYW50IGRlcGVuZGVuY2llcyBmb3IgU3VuLW1ha2UgVlBBVEggYnVnCi0KLVR1ZSBTZXAgMTAgMjA6MzQ6MTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2NvcmVfZmlsZV9wKTogIFJlbGVhc2UgdGhlIHJpZ2h0IHN0b3JhZ2UgaW4KLQllcnJvciBjYXNlLgotCShzdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogIEZpeCBoZWFkZXIgY29tcGFyaXNvbi4KLQkqIGFvdXR4Lmg6ICBBdm9pZCBzaGlmdHMgb2YgMzIgYml0cywgdW5kZWZpbmVkIGluIEMuICBMaW50LgotCSogYm91dC5jLCBpY29mZi5jLCBpZWVlLmMsIGxpYmJmZC5jLCBvYXN5cy5jOiAgZ2NjIC1PIC1XIGxpbnQuCi0KLVdlZCBTZXAgIDQgMDA6NDQ6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JQWxsb3cgR0RCIHRvIHBhdGNoIG9iamVjdCBmaWxlcy4KLQotCSogYW91dGYxLmggKHN1bm9zX2NvcmVfZmlsZV9wKTogIFNldCBTRUNfSEFTX0NPTlRFTlRTIG9uIGFsbCBzZWN0aW9ucy4KLQkqIHRyYWQtY29yZS5oICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiAgRGl0dG8uCi0JKiBhb3V0eC5oIChhb3V0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogIE9uIGZpcnN0IG91dHB1dCwgY2hlY2sKLQlhYmZkLT5kaXJlY3Rpb24gYW5kIGNvbXBsYWluIGlmIGVycm9uZW91cy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgY3J1ZGUgZGVwZW5kZW5jaWVzLgotCi1UdWUgU2VwICAzIDEzOjQ2OjE5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy8qIGFvdXR4LmggY29uZmlndXJlKiBzaG9ydGVuZWQgYWxsIHRoZSBoL3RtYWtlLXh4eHgKLQl0byBoL3QteHh4eCBmaWxlcyBzbyB0aGF0IGV2ZXJ5dGhpbmcgd2lsbCB3b3JrIG9uIFN5c3RlbSBWLgotCi1GcmkgQXVnIDIzIDEzOjUxOjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaDogIEFkZCBpbmZvcm1hdGlvbiBvbiBob3N0LWFvdXQuYyBhbmQgaG93IHRvIGNvbmZpZ3VyZQotCXRvIHVzZSBpdCwgdG8gdGhlIG1hbnVhbC4KLQkqIGNvbmZpZ3VyZS5pbjogIFRpeCB0eXBvLgotCSogZWNvZmYuYzogIElmIGNvbXBpbGluZyBmb3IgREVDMzEwMCwgdXNlIHRyYWRfdW5peCBjb3JlIGZpbGVzLAotCWVsc2UgZHVtbXkgb3V0IHRoZSBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiAgSWYgSE9TVF9EQVRBX1NUQVJUX0FERFIgaXMKLQlzcGVjaWZpZWQsIHVzZSBpdCB0byBsb2NhdGUgdGhlIGRhdGEgc2VjdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfc3ltYm9scyk6ICBEZWNsYXJlIGJ1ZmZlciBhcyBiZmRfYnl0ZXMKLQlyYXRoZXIgdGhhbiBhcyBjaGFycyAobGludCkuCi0KLVRodSBBdWcgMjIgMjI6MjA6MTkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmgsIGNvZmZjb2RlLmg6ICBzYWJlcml6ZWQuCi0KLVRodSBBdWcgMjIgMTE6Mjc6MDYgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvOiBzb21lIGNsZWFudXAsIHJlaW5jb3Jwb3JhdGVkIG1vcmUgaW50cm8gbWF0dGVyIGZyb20KLQliZmQuZG9jCi0JYmZkLmMsIHRhcmdldHMuYzogbWlub3IgcmV3b3JkaW5nIG9mIGRvYyBzZWdtZW50cwotCi0KLVdlZCBBdWcgMjEgMTk6MTM6MjIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogIFVzZSBIT1NUX1RFWFRfU1RBUlRfQUREUiwKLQlldGMsIHJhdGhlciB0aGFuIFRFWFRfU1RBUlRfQUREUi4KLQkqIGhvc3QtYW91dC5jOiAgUmVtb3ZlICNpZiAwIGFyb3VuZCB3aG9sZSB0aGluZy4KLQlVcGRhdGUgdG8gbW9kZXJuICgzMi82NC1iaXQpIGEub3V0IG5hbWluZyBjb252ZW50aW9ucy4KLQlJbmNsdWRlIGEgbGFyZ2UgY2h1bmsgb2YgLi4vaW5jbHVkZS9hLm91dC5nbnUuaCB0byBnZXQgbWFjcm9zIHRoYXQKLQlhcmUgbm90IGRlZmluZWQgYnkgdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGVzLgotCShob3N0X2FvdXRfezMyLDY0fV93cml0ZV9vYmplY3RfY29udGVudHMpOiAgVXNlIHRoZSBXUklURV9IRUFERVJTCi0JbWFjcm8gdXNlZCBieSB0aGUgb3RoZXIgYS5vdXQgaW1wbGVtZW50YXRpb25zLgotCSogTWFrZWZpbGUuaW46ICBHaXZlIGRlcGVuZGVuY2llcyB0byBPUFRJT05BTF9CQUNLRU5EUy4KLQotV2VkIEF1ZyAyMSAxNDozMzowNiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHVzZSB0YXJnZXRzICJiZmQuZHZpIiBhbmQgImJmZC5wcyIgaW5zdGVhZCBvZgotCXRleGRvYyBhbmQgcHNkb2M7IG1ha2UgdGhlc2UgZGVwZW5kIG9uIGdlbmVyYXRlZCAudGV4aSdzCi0KLQkqIHNjYW5pdCwgKG5ldykgdW5QUk9UTzogdHVybiBQUk9UTyBtYWNyb3MgaW50byBBTlNJIGRlY2xhcmF0aW9ucyBpbgotCWRvYwotCi0JKiBiZmQuYywgcmVsb2MuYywgc3ltcy5jOiBtaW5vciBzcGVsbGluZy93b3JkaW5nIGZpeGVzIGluIGRvYwotCXBvcnRpb25zCi0KLQkqIE1ha2VmaWxlLmluLCBhd2tzY2FuLWlwLCBhd2tzY2FuLXAsIGludG9iZmQsCi0JbGliYmZkLmgsIGxpYmNvZmYuaCwgdG9saWJjb2ZmOyBuZXcgYmZkLWluLmgsIGxpYmJmZC1pbi5oLAotCWxpYmNvZmYtaW4uaDogKGEpIHVzZSBzZXBhcmF0ZSBmaWxlcyBmb3IgaW52YXJpYW50IHBhcnRzIG9mIGJmZC5oLAotCWxpYmJmZC5oLCBhbmQgbGliY29mZi5oOyAoYikgaW4gZ2VuZXJhdGVkIHBhcnRzIG9mIHNhbWUsIHVzZSBsZXNzCi0Jb2J0cnVzaXZlIG1hcmtzIGluZGljYXRpbmcgLmMgb3JpZ2lucy4KLQotCSogYmZkLnRleGluZm86IGdlbmVyYWxpemUgbW9zdCByZWZlcmVuY2VzIHRvIGxpbmtlcgotCi1UdWUgQXVnIDIwIDE1OjE4OjAyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5jbHVkZSBjb3JlLnAgaW4gUFJPVE9TIChidWlsZGluZyBiZXR0ZXIgYmZkLmgpCi0JKiBhcmNodXJlcy5jOiByZW1vdmUgZW1wdHkgZm9vKCkgZGVmaW5pdGlvbiAoY3JlcHQgaW4gYXQgdm4xLjkpCi0KLU1vbiBBdWcgMTkgMTM6NDg6MjIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvOiB1c2UgQHNldGNoYXB0ZXJuZXdwYWdlIG9uIGluc3RlYWQgb2YgbG90cyBvZgotCUBwYWdlJ3M7IG1pbm9yIHJlcGhyYXNpbmcgaW4gSW50cm9kdWN0aW9uLgotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGJmZC5jLCBiZmQudGV4aW5mbywgY2FjaGUuYywKLQljb2ZmY29kZS5oLCBjb3JlLmMsIGZvcm1hdC5jLCBpZWVlLmMsIGxpYmJmZC5jLCBsaWJiZmQuaCwgbGliY29mZi5oLAotCW9hc3lzLmMsIG9wbmNscy5jLCByZWxvYy5jLCBzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jIChkb2N1bWVudGF0aW9uCi0Jc2VnbWVudHMpOiB1c2VkIEJGRCAoY2FwcykgbW9yZSBjb25zaXN0ZW50bHkgYXMgYSBuYW1lIGluCi0JZGlzY291cnNlLCBmaXhlZCBhIGZldyBvdGhlciBtaW5vciB0eXBvcyBhbmQgdXNlcyBvZiBmb250cwotCi0KLVRodSBBdWcgIDggMTY6NDc6NDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogZml4ZWQgYnVnIHdoZXJlIHN0cmluZyB0YWJsZSBzaXplIHdhc24ndCBiZWluZyBzd2FwcGVkLgotCi1UaHUgQXVnICAxIDE2OjM1OjI4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYzogYWRkZWQgU0VDX0NPTlNUUlVDVE9SX1RFWFR8REFUQXxCU1MgZmxhZ3MKLQotCSogc3ltcy5jOiBhZGRlZCBCU0ZfQ09OU1RSVUNUT1IsIEJTRl9XQVJOSU5HIGFuZCBCU0ZfSU5ESVJFQ1QKLQlmbGFncy4gKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpIG5vdyBrbm93cyB3aGF0IHRvIGRvIHdpdGggdGhlCi0JYWJvdmUgZmxhZ3MuCi0KLQkqIGFvdXR4Lmg6IG1hZGUgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyBhbmQKLQl0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyBwcm9kdWNlIHRoZSBhYm92ZSBmbGFncy4KLQotCi1XZWQgSnVsIDMxIDA5OjUzOjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYWxsIGZpbGVzOiAgdXBkYXRlIGNvcHlyaWdodCBub3RpY2VzIGZvciBHUEwgdmVyc2lvbiAyLgotCUluc3RhbGwgaGVhZGVyIGNvbW1lbnRzIGFuZCBhdHRyaWJ1dGUgbW9zdCBtb2R1bGVzIHRvIHRoZWlyCi0JYXV0aG9ycy4gIEJGRCdzIG5hbWUgaXMgbm93IG9mZmljaWFsbHkgIkJpbmFyeSBGaWxlIERlc2NyaXB0b3IiLAotCXNvIHJlbW92ZSBhbnkgY29uZmxpY3RpbmcgcGVqb3JhdGl2ZXMuCi0JYXJjaHVyZXMuaDogIENvbnNpc3RzIHNvbGVseSBvZiBjb21tZW50czsgcmVtb3ZlIGl0LgotCi1GcmkgSnVsIDI2IDE4OjExOjM0IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBiZmQuYzogTWFkZSBpdCBjb21waWxlIGFnYWluLgotCi1GcmkgSnVsIDE5IDA4OjE3OjA5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIG5ld3NvczMuYywgdGFyZ2V0cy5jLCBjb2ZmY29kZS5oOiBuZXcgcGF0Y2hlcyBmcm9tIERhdmlkIFdvb2QKLQotCi1Nb24gSnVsIDE1IDE2OjI3OjQyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIGFyY2hpdmUuYyBiZmQuYyBjb2ZmY29kZS5oIGNvcmUuYyBlY29mZi5jIGllZWUuYwotCWJmZC50ZXhpbmZvIG9hc3lzLmMgb3BuY2xzLmMgcmVsb2MuYyBzcmVjLmM6IE1vcmUgZG9jdW1lbnRhdGlvbiBvbgotCWxpbnQgZml4ZXMuCi0KLQkqIGFtZGNvZmYuYyBiZmQudGV4aW5mbyBNYWtlZmlsZS5pbiA6IEZvbGRlZCBpbiBjaGFuZ2VzIGZvciBhbWQKLQkyOWsgY29mZiBieSBEYXZpZCBXb29kICh3b29kQGxhYi51bHRyYS5ueXUuZWR1KS4KLQotVGh1IEp1bCAgNCAwOTo1MzoxNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBFdmVyeXRoaW5nOiBjcmVhdGVkIHNvbWUgbmV3IGZpbGVzLCBjb3JlLmMgZm9ybWF0LmMsIHJlbG9jLmMsCi0Jc2VjdGlvbi5jIGFuZCBzeW1zLmMgdG8gc3BsaXQgdGhlIGZ1bmN0aW9uYWxpdHkgYSBiaXQgYmV0dGVyLgotCUNsZWFuZWQgdXAgdGhlIHJlc3Qgb2YgdGhlIGZpbGVzIGEgYml0LCBhbmQgYWRkZWQgc29tZQotCWRvY3VtZW50YXRpb24uCi0KLQotTW9uIEp1bCAgMSAxMzoyOTo0NyAxOTkxICBEYXZpZCBXb29kICh3b29kIGF0IGRhdmlkLnVsdHJhLm55YS5lZHUpCi0KLQkqIG9wbmNscy5jLCAuLi9pbmNsdWRlL3N5cy9oLXN1bjMuaCAuLi9pbmNsdWRlL3N5cy9oLXN1bjQuaDogZmNudGwKLQlyZWFsbHkgdGFrZXMgMyBhcmd1bWVudHMsIHBhdGNoZWQgY29kZSBhbmQgYW1tZW5kZWQgcHJvdG90eXBlcy4KLQotRnJpIEp1biAxNCAxMzoxOTo0MCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiAuLi9pbmNsdWRlL2JmZC5oIChzdHJ1Y3QgYmZkX3RhcmdldCk6IEFkZGVkIG5ldyBmaWVsZAotCSJhbGlnbl9wb3dlcl9taW4iIHdoaWNoIGNvbnRhaW5zIHRoZSBtaW5pbXVtIGFsaWdubWVudCBmb3IgYQotCXNlY3Rpb24uIFRoaXMgaXMgdXNlZCBpbiBjb2ZmX25ld19zZWN0aW9uX2hvb2suIFRoZSBmaWVsZAotCWluc2VydGlvbiBuZWNlc3NpdGF0ZXMgYW4gdXBkYXRlIG9mIGFsbCBiYWNrZW5kcy4uCi0KLQkqIGFvdXRmMS5oIGp1bXAgdGFibGUgZmllbGQgaW5zZXJ0ZWQKLQotCSogYXJjaGl2ZS5jKHNuYXJmX2FyX2hkcikoYmZkX3NsdXJwX2NvZmZfYXJtYXApIGNhbiBub3cgcGFyc2UgZGd1eCBzdHlsZSBleHRlbmRlZAotCWZpbGVuYW1lcyB0b28uCi0KLQkqIGJvdXQuYyhiX291dF9zcXVpcnRfb3V0X3JlbG9jcykgZml4IHRvIGFzc2VydGlvbiB0ZXN0cy4gSnVtcAotCXRhYmxlIGZpZWxkIGluc2VydGVkLgotCi0JKiBjb2ZmY29kZS5oKGp1c3QgYWJvdXQgZXZlcnl0aGluZykgTm93IHBhdGNoZXMgdXAgc3ltYm9sIHRhYmxlcwotCXVzaW5nIGEgZGlmZmVyZW50IG1lY2hhbmlzbS4gVGhlIEludGVsIG1ham9yIGJ1ZyBoYXMgYmVlbiBmaXhlZCwKLQlhbmQgdGhlIGxpbmtlciBjYW4gc2VsZiBob3N0IG9uIHRoZSBBdmlpb24gYW5kIGJlIGRlYnVnZ2VkIHdpdGgKLQlnZGIuCi0KLQkqIGVjb2ZmLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLCBpMzg2Y29mZi5jOiBuZXcKLQlpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLCAgaWNvZmYuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUKLQlwYXRjaCwgaWVlZS5jOiBjYW4gbm93IHJlYWQgYXJjaGl2ZXMgY29udGFpbmluZyBpZWVlIG1vZHVsZXMuLAotCWxpYmNvZmYuaDogYWRkZWQgKGNvbWJpbmVkX2VudHJ5X3R5cGUpLCBsaWJpZWVlLmg6IHVwZWQgbWF4Ci0Jc2VjdGlvbnMgdG8gMjAsIG02OGtjb2ZmLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLAotCW04OGtiY3MuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsIG9hc3lzLmM6IHZhcmlvdXMgYnVncwotCWZpeGVkLiBvcG5jbHMuYzogYWRkZWQgYmZkX2FsbG9jX2dyb3cgYW5kIGJmZF9hbGxvY19maW5pc2guCi0Jc3JlYy5jOiBqdW1wIHRhYmxlIHBhdGNoLiB0cmFkLWNvZGUuYyBmaXhlZCAjSUYgdHlwZW8KLQotRnJpIEp1biAgNyAxMjozNTo0NiAxOTkxICBTZWFuIEZhZ2FuICAoc2VmIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0gCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IGFkZGVkIGVsc2UgY2FzZSB0byBkZWFsIHdpdGgKLSAJZmlsZW5hbWVzIGxlc3MgdGhhbiA5IGNoYXJhY3RlcnMuCi0KLQotVGh1IEp1biAgNiAxODoyNzozOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiAuLi9pbmNsdWRlL29hc3lzLmggb2FzeXMuYyAob2FzeXNfYXJjaGl2ZV9wKTogZml4ZWQgc28gaXQgd29ya3MKLQotCSogc3JlYy5jOiBub3cgYWxsb3dzIGFueSBudW1iZXIgb2Ygc2VjdGlvbnMgdG8gYmUgY3JlYXRlZCBpbiBhCi0JZmlsZS4gT3V0cHV0cyBhZGRyZXNzZXMgb2YgdGhlIHJpZ2h0IGxlbmd0aC4KLQotVGh1IE1heSAzMCAxNTozMDoxMCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6IEZpeGVkIHByb2JsZW0gd2hlcmUgd2hlbiBhIGRlZmF1bHRlZAotCXRhcmdldCBkaWRuJ3QgbWF0Y2gsIHRoZSBmb3JtYXQgZ290IHNldCB0byB0aGUgYXR0ZW1wdGVkIG1hdGNoLAotCWJyZWFraW5nIGEgZnV0dXJlIHRlc3QuCi0KLSAgICAgICAgKi4uL2luY2x1ZGUvaTM4NmNvZmYuaCA6IGZpeGVkIHR5cG8gaW4gdHlwZSBmaWVsZCB3aXRoIHNpemUKLQotCSogaTM4NmNvZmYuYyBpY29mZi5jIG04OGstYmNzLmMgZWNvZmYuYyAuLi9pbmNsdWRlL2JmZC5oIDogQWRkZWQKLQlzdXBwb3J0IGluIHRoZSBqdW1wIHRhYmxlIGZvciB0aGUgc3dhcHBpbmcgcm91dGluZXMgZXhwb3J0ZWQgdG8KLQlnZGIuIE5vdyBnZGIgd29ya3Mgd2l0aCB0aGUgMzg2LgotCi1UdWUgTWF5IDI4IDE3OjIxOjQzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGdkYi0zLjk1IHJlbGVhc2UuCi0JTWFrZWZpbGUuaW46ICBBbGxvdyBobWFrZSBhbmQgdG1ha2UgZmlsZXMgdG8gYWRkIE9GSUxFUy4KLQlhb3V0ZjEuaDoKLQliZmQuYzogIHN1cHBvcnQgc3BlY2lmaWMgdGFyZ2V0cyBhcyB3ZWxsIGFzIHNlYXJjaGluZy4gIFdoZW4KLQlzZWFyY2hpbmcsIHRha2UgZGVmYXVsdCB0YXJnZXQgaW4gcHJlZmVyZW5jZSB0byBvdGhlcnMuCi0JYmZkLmRvYzogIHR5cG9zCi0JaWVlZS5jLCBvYXN5cy5jOiAgQXZvaWQgdXNpbmcgdGhlICJ0ZGF0YSIgbWFjcm9zIGxlZnQgb2YgYXNzaWdubWVudC4KLQlsaWJhLm91dC5oOiAgRG9uJ3QgaGFyZC1jb2RlIGZpbGUgb2Zmc2V0czsgdXNlIE5fIG1hY3JvcyBmb3IgdGhlbS4KLQlsaWJiZmQuaDogIFN1cHBvcnQgc3BlY2lmaWMgdGFyZ2V0cyBhcyB3ZWxsIGFzIHNlYXJjaGluZy4KLQlvcG5jbHMuYzogIFN1cHBvcnQgc3BlY2lmaWMgdGFyZ2V0cyBhcyB3ZWxsIGFzIHNlYXJjaGluZy4KLQl0YXJnZXRzLmM6ICBTZWFyY2ggaXMgc2hvcnQtY2lyY3VpdGVkIGlmIGRlZmF1bHQgdGFyZ2V0IG1hdGNoZXMuCi0JbGlib2FzeXMuYywgbGliaWVlZS5jOiAgVW5kbyBib3RobmVyIGNoYW5nZXMgdGhhdCBtYWtlIG1hY3JvcwotCXdvcmsgdG8gdGhlIGxlZnQgb2YgYXNzaWdubWVudCwgYnV0IHdoaWNoIGRlcGVuZCBvbiB0aGUKLQlyZXByZXNlbnRhdGlvbnMgb2YgZGlmZmVyZW50IHBvaW50ZXIgdHlwZXMgYmVpbmcgdGhlIHNhbWUuCi0KLUZyaSBNYXkgMjQgMTg6NTY6NTIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaTM4NmNvZmYuYzogY3JlYXRlZC4KLQkqIGNvZmZjb2RlLmg6IGFkZGVkIHN1cHBvcnQgZm9yIDM4Ni4KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdXBwb3J0IGZvciAzODYuCi0JKiAuLi9pbmNsdWRlL2kzODZjb2ZmLmg6IGNyZWF0ZWQKLQotV2VkIE1heSAyMiAwNzoyNjozOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiByZW1vdmVkIGFsbCBwdXRfeF88c2l6ZXM+Ci0JKiBsaWJiZmQuYzogQ2hhbmdlZCAjaWZkZWYgX19HTlVDX18gdG8gI2lmZGVmIEhPU1RfNjRfQklULCBBZGRlZAotCURFRlVOUwotCi0KLVR1ZSBNYXkgMjEgMDg6NTg6NTggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQkoYm90aG5lcikKLQkqIG9wbmNscy5jOiBDaGFuZ2VkIG9ic3RhY2tfY2h1bmtfYWxsb2MgdXNlIHhtYWxsb2MKLQotTW9uIE1heSAyMCAxNzoxMjoxNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBldmVyeXRoaW5nOiBSZW1vdmVkIHN5c2RlcC5oIGZyb20gYmZkLmggYW5kIHB1dCBiYWNrIGludG8gZmlsZXMKLQlmcm9tIHdoaWNoIGl0IHdhcyBzcGxpdCBvdXQuIE5vdyA2NCBiaXQgdmVyc2lvbiBpcyBidWlsdCB3aXRoIGEKLQktREhPU1RfNjRfQklUPSJsb25nIGxvbmciIG9uIHRoZSBjb21waWxlIGxpbmUuCi0KLUZyaSBNYXkgMTcgMTk6MzU6MjYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCUNoYW5nZWQgYWxsIHRoZSBbZ2V0fHB1dF1bbmFtZV0gcm91dGluZXMgdG8gdXNlICBbZ2V0fHB1dF1fW3NpemUKLQlpbiBieXRlc10uCi0KLQlQdXQgaW4gc3VwcG9ydCBmb3IgNjQgYml0IHdvcmsuIE5vdyB0d28gdmVyc2lvbnMgb2YgYmZkIG1heSBiZQotCWdlbmVyYXRlZCwgYWNjb3JkaW5nIHRvIHRoZSBzdGF0ZSBvZiBUQVJHRVRfNjRfQklULCBvbmUgd2hpY2ggaXMKLQkzMiBiaXQgb25seSwgYW5kIG9uZSB3aGljaCBpcyA2NC8zMiBiaXRzLgotCUNyZWF0ZWQgbmV3IGJhY2sgZW5kICdkZW1vNjQnIHRvIHRlc3QgNjQgYml0IGZ1bmN0aW9uYWxpdHkuCi0KLQlSZW5hbWVkIHNvbWUgZmlsZXMgdG8gd29yayBvbiBET1MuCi0KLQkqIGFyY2hpdmUuYzogbGludCAqIGJmZC5jOiBwcm90b3R5cGVzIGFuZCBsaW50LiAqIGVjb2ZmLmM6IGFkZGVkCi0JNjRiaXQgdHJhbnNmZXIgCSogaWNvZmYuYzogYWRkZWQgNjRiaXQgdHJhbnNmZXIgKiBpZWVlLmM6IG5hbWUKLQljaGFnZSwgNjQgYml0IHRyYW5zZmVyLiAqIGxpYmEub3V0Lmg6IFNwbGl0IG91dCBjb21tb24gY29kZSBmcm9tCi0Jc3Vub3MgYW5kIG5ld3NvcyBpbnRvIGxpYmEub3V0LiBOYW1lIGNoYW5nZXMgYW5kIHByb3RvdHlwZSBtb2RzLiAqCi0JbGliYmZkLmM6IGxpbnQgYW5kIHByb3RvdHlwZXMsIGV4dHJhIDY0Yml0IHN3YXBzLiAqIGxpYmJmZC5oOgotCXByb3RvdHlwZXMgZm9yIG5ldyBmdW5jdGlvbnMuICogbGliY29mZi5oOiBsaW50ICogbGliaWVlZS5oOiBtYWtlCi0Jd29yayBvbiBET1MgKiBsaWJvYXN5cy5oOiBtYWtlIHdvcmsgb24gRE9TICogbTg4ay1iY3MuYzogTmFtZQotCWNoYW5nZSBhbmQgNjRiaXQgc3R1ZmYuKiBuZXdzb3MzLmM6IGNvbW1vbiBjb2RlIHJlbW92ZWQsIG5ldyBqdW1wCi0JdGFibGUuICogb2FzeXMuYzogTmFtZSBjaGFuZ2UgKiBvcG5jbHMuYzogUG9ydGFiaWxpdHkgZml4ZXMgKgotCXNyZWMuYzogTmFtZSBjaGFuZ2VzICogc3Vub3MuYzogUmVtb3ZlZCBjb21vbiBjb2RlLiAqIHRhcmdldHMuYzoKLQlBZGRlZCBkZW1vICogYW91dDMyLCBhb3V0NjQuYyBpbmNsdWRlICBhb3V0eC5oICogYm91dC5jOiB1c2VkIHRvCi0JYmUgY2FsbGVkIGIub3V0LmMgKiBjb2ZmY29kZS5oOiB1c2VkIHRvIGJlIGNhbGxlZCBjb2ZmLWNvZGUuaCwgbm93Ci0JNjRiaXQgaXplZC4gKiBkZW1vNjQuYzogNjQgYml0IGEub3V0IGJhY2sgZW5kCi0KLVRodSBNYXkgMTYgMTY6MDI6MDcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQlmcm9tIGJvdGhuZXIKLSAJKiBsaWJpZWVlLmg6IE1ha2UgaWVlZV9kYXRhIGFuZCBpZWVlX2FyX2RhdGEgbWFjcm9zIHVzYWJsZQotCW9uIExIUyBvZiBhc3NpZ25tZW50LCBldmVuIHdoZW4gdXNpbmcgb2xkIGNvbXBpbGVycy4KLQkqIGxpYm9hc3lzLmg6IERpdHRvIGZvciBvYXN5c19kYXRhIGFuZCBvYXN5c19hcl9kYXRhLgotCSogbTY4a2NvZmYuYzogQWRkIGVudW0tdG8taW50IGNhc3RzIHRvIGFjY29tb2RhdGUgb2xkIGNvbXBpbGVycy4KLQkqIG5ld3NvczMuYzogRml4IGRlZmluaXRpb25zIG9mIFNFR01FTlRfU0laRSBhbmQgVEVYVF9TVEFSVF9BRERSLgotCSogb3BuY2xzLmM6IERlZmluZSBTX0lYVVNSLCBTX0lYR1JQLCBTX0lYT1RIIGlmIHVuZGVmaW5lZC4KLQkqIHRhcmdldHMuYzogQWRkIGRlY2xhcmF0aW9uIG9mIG5ld3NvczNfdmVjLgotCi1Nb24gTWF5IDEzIDEwOjAzOjI5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXQuYzogZml4eGVkIHNvbWUgb2YgdGhlIHByb2JsZW1zIHdpdGggZmlsZXBvcyBjYWxjdWxhdGlvbi4KLQkoc3dhcF9leHRfcmVsb2MpOiBmaXhlZCBwcm9ibGVtIHdpdGggY3JlYXRpb24gb2YgcmVsb2NzLgotCShhb3V0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogZml4ZWQgZmlsZXBvcyBwcm9ibGVtCi0KLQkqIGNvZmYtY29kZS5oOiAoc3dhcF9maWxlaGRyX2luLCBzd2FwX2ZpbGVoZHJfb3V0KSBhZGQuCi0JKHN3YXBfZmlsZWhkcikgZGVsZXRlLiBDaGFuZ2VkIGFsbCB0aGUgdXNhZ2Ugb2YgYmZkX2hfcHV0X3guCi0JKHN3YXBfYW91dGhkcl9pbiwgc3dhcF9hb3V0aGRyX291dCkgYWRkLiAoc3dhcF9hb3V0aGRyKSBkZWxldGUuCi0JKGNvZmZfcmVhbF9vYmplY3RfcCkgY2xlYW5lZCB1cCwgYWRkZWQgTUlQUy4gKGNvZmZfb2JqZWN0X3ApCi0JY2xlYW5lZCB1cC4gKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBjbGVhbmVkIHVwLgotCi0JKiBlY29mZi5jOiBUb3RhbGx5IGRpZmZlcmVudC4gTm93IHN1cHBvcnRzIGVjb2ZmIGZ1bGx5LgotCi0JKiBpY29mZi5jOiBmaXhlZCBwcm9ibGVtcyBpbiByZWxvY2F0aW9uIGNhbGxvdXQuCi0KLQkqIGxpYmNvZmYuaDogKHN0cnVjdCBpY29mZGF0YSkgcmVtb3ZlZCBoZHIgc3RydWN0dXJlIGZyb20gdGRhdGEuCi0KLQkqIG02OGtjb2ZmLmM6IHVwZGF0ZWQgdGFyZ2V0IHZlY3Rvci4KLQotCSogc3Vub3MuYzogKGNob29zZV9yZWxvY19zaXplKSBhZGRlZDogKHN1bm9zNF9jYWxsYmFjaykgY2FsbHMKLQljaG9vc2VfcmVsb2Nfc2l6ZS4gKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpIG5vdyBjYWxscwotCWNob29zZV9yZWxvY19zaXplIHNvIG91dHB1dHMgcmVsb2NzIGNvcnJlY3RseSwgYWxzbyBjYWxjdWxhdGVzIHRoZQotCXNpemUgb2YgdGhlIHNlY3Rpb25zIGNvcnJlY3RseS4KLQotCi0KLUZyaSBNYXkgMTAgMTY6NTg6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JTWVyZ2UgUGVyIEJvdGhuZXIncyBjaGFuZ2VzIHRvIG1vZHVsYXJpemUgQkZEIGEub3V0IGEgYml0LgotCi0JKiBsaWJiZmQuaCwgbGliYmZkLmMgKGJmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogIEFkZC4KLQkqIGllZWUuYzogIENhc3QgZW51bXMgdG8gaW50IGJlZm9yZSBjb21wYXJpbmcgdGhlbSwgZm9yIGJyYWluLQotCWRlYWQgY29tcGlsZXJzLgotCSogY29mZi1jb2RlLmg6ICBSZW1vdmUgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cywgYW5kIHVzZSB0aGUKLQlnZW5lcmljIG9uZSBpbnN0ZWFkLgotCi0JKiBhb3V0LmM6ICBEZXJpdmUgbmV3IG1vZHVsZSBmcm9tIHN1bm9zLmMsIGNvbnRhaW5pbmcgZ2VuZXJpYwotCXN1cHBvcnQgY29kZSBmb3IgYWxsIGtpbmRzIG9mIGEub3V0IGZpbGVzLgotCi0JKiBzdW5vcy5jOiBSZW1vdmUgYWxsIGNvZGUgdGhhdCBnb2VzIGluIGFvdXQuYy4gIFNwbGl0IG91dAotCW1hY2hpbmUgZGVwZW5kZW50IGZvbGxvd3VwIGluIHN1bm9zNF9vYmplY3RfcCBpbnRvCi0Jc3Vub3M0X2NhbGxiYWNrLiAgVXNlIEpVTVBfVEFCTEUoYW91dCkgZm9yIHRoZSB0cmFuc3ZlciB2ZWN0b3IsCi0JYW5kIHJlZGVmaW5lIG9ubHkgdGhlIG5hbWVzIHdlIENIQU5HRSwgbm90IGFsbCB0aGUgbmFtZXMuICBEcm9wCi0JdGhlIGxpdHRsZS1lbmRpYW4gdmVjdG9yLCBhbmQgcmVuYW1lIHRoZSB2ZWN0b3IgYXMgc3Vub3M0IHJhdGhlcgotCXRoYW4gZ2VuZXJpYy4KLQotCSogYi5vdXQuYzogIFVzZSBhb3V0LmMgcm91dGluZXMgZm9yIG1vc3Qgb2YgdGhlIHdvcmsuICBTbGlnaHQKLQljaGFuZ2VzIGZvciB0aGUgbmV3IHJlZ2ltZS4gIFJlbW92ZSBjbG9zZV9hbmRfY2xlYW51cCBhbmQKLQlnZXRfc2VjdGlvbl9jb250ZW50cyBpbiBmYXZvciBvZiBnZW5lcmljcy4gIE5ldyB0cmFuc2ZlciB2ZWN0b3IKLQlyZWdpbWUuCi0KLQkqIG5ld3Nvcy5jOiAgTmV3IHN1cHBvcnQgZm9yIFNvbnkgTkVXUywgYW5vdGhlciBhLm91dCBmb3JtYXQuCi0KLQkqIGVjb2ZmLmM6ICBSZW1vdmUgY2xvc2VfYW5kX2NsZWFudXAuICBOZXcgdHZlYyByZWdpbWUuCi0JKiBpY29mZi5jLCBtODhrLWJjcy5jOiAgQWRkIHdyaXRlX2NvbnRlbnRzIHRvIHR2ZWMuCi0JKiBpZWVlLmMsIG9hc3lzLmM6ICBSZW1vdmUgY2xvc2VfYW5kX2NsZWFudXAsIGFkZCB3cml0ZV9jb250ZW50cwotCXRvIHR2ZWMuCi0JKiBvcG5jbHMuYyAoYmZkX2Nsb3NlKTogIENhbGwgZm9ybWF0LWRlcGVuZGVudCB3cml0ZV9jb250ZW50cwotCXJvdXRpbmUsIGlmIHdyaXRpbmcsIGJlZm9yZSBjYWxsaW5nIHRhcmdldC1kZXBlbmRlbnQKLQljbG9zZV9hbmRfY2xlYW51cCByb3V0aW5lICh3aGljaCBpcyBub3cgYWx3YXlzIGdlbmVyaWMsIEkgdGhpbmspLgotCSogc3JlYy5jOiAgVXNlIGJmZF9hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4gIFJlbW92ZQotCWNsb3NlX2FuZF9jbGVhbnVwIGFuZCBtb3ZlIGNvZGUgZnJvbSBpdCB0bwotCXNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgQWRkIHdyaXRlX2NvbnRlbnRzIHRvIHR2ZWMuCi0JKiB0YXJnZXRzLmM6ICBSZW1vdmUgYS5vdXQgbGl0dGxlIHZlY3RvciwgcmVwbGFjZSBhLm91dCBiaWcKLQl2ZWN0b3Igd2l0aCBTdW5PUyB2ZWN0b3IuICBGSVhNRTogIE5lZWQgVmF4IHN1cHBvcnQgYWdhaW4gbm93LgotCi0JKiBsaWJiZmQuaDogIEFkZCB3cml0ZV9jb250ZW50cyBmb3JtYXQtZGVwZW5kZW50LXZlY3RvciB0byB0aGUKLQliZmRfdGFyZ2V0IHZlY3Rvci4gIFN1cHBseSBhIGdlbmVyaWMgY2xvc2VfYW5kX2NsZWFudXAgcm91dGluZS4KLQkqIGxpYmEub3V0Lmg6ICBIYW5kbGUgdGhlIG5ldyBhb3V0LmMgc3BsaXQuICBBZGQgcHJvdG90eXBlcyBmb3IKLQlhbGwgcm91dGluZXMgZGVmaW5lZCBpbiBhb3V0LmMuICBSZW5hbWUgInN1bm9zIiB0aGluZ3MgdG8gImFvdXQiCi0JdGhpbmdzLiAgQWRkIGEgZmV3IGZpZWxkcyB3aGVyZSBuZWVkZWQgZm9yIHZhcmlvdXMgZm9ybWF0cy4KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGFvdXQuYyBhbmQgbmV3c29zLmMuCi0KLQkqIGFyY2hpdmUuYywgaWVlZS5jLCBvYXN5cy5jOiAgTGludC4KLQotRnJpIE1heSAxMCAxMjozNDo0OCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiAuLi9pbmNsdWRlL2JmZC5oCi0JY2hhbmdlZCBmb3J3YXJkIGRlY2xhcmF0aW9uIHN0cnVjdCBzdGF0OyB0byByZWR1Y2Ugd2FybmluZ3MuIENoYW5nZWQKLQljb21tZW50IG9uIGJmZF9oXzx4Pl94LgotCi0JKiAuLi9pbmNsdWRlL202OGtjb2ZmLmgsIC4uL2luY2x1ZGUvaW50ZWwtY29mZi5oLAotCS4uL2luY2x1ZGUvbTg4ay1iY3MuaAotCU5vdyB0aGVyZSBhcmUgdHdvIGluY2FybmF0aW9ucyBvZiByZWxvY3MsIGxpbmVub3MgYW5kIHN5bWVudHMuIE9uZSBmb3IKLQlpbnRlcm5hbCBkaWdlc3Rpb24sIGFuZCBvbmUgZnVsbCBvZiBjaGFyIGFycmF5cyBmb3IgSS9PLiBUaGUgb3JpZ2luYWwKLQluYW1lcyBoYXZlIGdvbmUgdG8gZGV0ZWN0IGVycm9ycy4KLQotCSogTWFrZWZpbGUuaW4sIG02OGtjb2ZmLmMsIHRhcmdldHMuYwotCVRlc3QgbmV3IHN0cnVjdHVyZSBjb2RlIHdpdGggYSA2OGsgY29mZiBpbXBsZW1lbnRhaW9uCi0KLQkqIGNvZmYtY29kZS5oLCBpY29mZi5jLCBjb2Zmc3dhcC5jLCBsaWJjb2ZmLmgKLQlGaXhlZCBhbGwgdGhlIHBsYWNlcyB3aGVyZSB0aGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggdGhlIHNpemUgYW5kCi0JYWxpZ25tZW50cyBvZiBzdHJ1Y3R1cmVzIG9uIGRpc2sgYW5kIHN0cnVjdHVyZXMgaW4gbWVtb3J5LiAjaWZlZCBvdXQKLQlhbGwgdGhlIGNvZGUgaW4gY29mZnN3YXAuYywgc2luY2UgaXQgc2hvdWxkIGJlIGRvbmUgdXNpbmcgdGhlIHRhcmdldAotCXN3YXAgcm91dGluZXMgbm93LgotCi1UaHUgTWF5ICA5IDExOjAwOjQ1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoZG9fb25lLCBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IG5vdyBzdXBwb3J0cyB0aGUgbG9hZAotCW11bHRpcGxlIHJlbG9jIGNvbW1hbmQuCi0KLQkqIHN1bm9zLmMgKHN1bm9zNF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IE1hZGUgaXQgc28gdGhhdCBzZWN0aW9ucwotCWFyZSBhbHdheXMgcGFkZGVkIHRvIHRoZWlyIGFsaWdubWVudCBzaXplLgotCi1TYXQgTWF5ICA0IDE1OjQ5OjQzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jLCBiZmQuYywgY29mZi1jb2RlLmgsIG9wbmNscy5jLCBzdW5vcy5jLCB0cmFkLWNvcmUuYzoKLQlDbGVhbiB1cCB0eXBlcyBhbmQgc3VjaCAoc2FiZXIgQyBwcm9ibGVtcykuCi0JKiBlY29mZi5jOiAgQ2xlYW4gdXAgdHlwZXMgYW5kIHN1Y2guICBSZW1vdmUgcm91dGluZXMgdGhhdCBhcmUKLQlub3QgdXNlZC4gIEZpeCB1cCByZWFkaW5nIGFuZCBzd2FwcGluZyBvZiBzaG9ydHMgZnJvbSBmaWxlcy4KLQotICAgTm90ZXMgb24gYmZkLTAuNS4yLXBhdGNoMWEsIGZyb20gUGVyIEJvdGhuZXI6Ci0KLQkqIGEub3V0LnZheC5jOiBSZW1vdmUgdHdvIGJvZ3VzICJzdGF0aWMiIGZyb20gcHJvdG90eXBlcy4KLQotCSogZWNvZmYuYzogR290IHJpZCBvZiBsb3RzIG9mIG5vbi13b3JraW5nIGp1bmsgKHRoYXQgaGFkCi0JYmVlbiBjb3BpZWQgZGlyZWN0bHkgZnJvbSBjb2ZmLWNvZGUuaCkuCi0JVXBkYXRlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdXBkYXRlcyB0byBpY29mZi5jIGFuZCBjb2ZmLWNvZGUuaC4KLQotCSogbGliYmZkLmg6IEFkZGVkIGRlZmluaXRpb25zIGZvciBTX0lYVVNSLCBTX0lYR1JQLCBhbmQgU19JWE9USAotCWlmIHRoZXkncmUgbWlzc2luZyAoYXMgdGhleSBhcmUgaW4gKEJEUy00LjMtYmFzZWQpIE5ld3NPUy0zKS4KLQotCSogc3Vub3MuYyAobl90eHRvZmYpOiAoUmUtKUFkZCBzdXBwb3J0IGZvciBzb255LiBUaGlzIGlzIGEga2x1ZGdlLAotCWJ1dCB1bnRpbCB0aGUgdGFyZ2V0X3ZlY3RvciBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCwKLQlpdCdzIGFzIGdvb2QgYXMgYW55LiBOb3RlIHRoYXQgdGhlIHRleHQgb2Zmc2V0IGlzIHRoZSBvbmx5Ci0JZGlmZmVyZW5jZSBiZXR3ZWVuIE5ld3NPUyBhbmQgU3VuT3MgKGluY2x1ZGluZyBtYWdpYyBudW1iZXJzKS4KLQkoTW9zdCBvZiB0aGUgc3Vub3NfKiByb3V0aW5lcyBzaG91bGQgdG8gcmVuYW1lZCBic2RfKgotCWFuZCBtb3ZlIHRvIGEgYnNkLmMgZmlsZS4gVGhlbiAoYW5kIHdoZW4gdGhlIHRhcmdldF92ZWN0b3IKLQlpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCkgaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBjcmVhdGUKLQlhIHNlcGFyYXRlIFNvbnkgdGFyZ2V0LikKLQotCSogc3lzZGVwLmg6IERvbid0IGRlY2xhcmUgZnJlYWQgYW5kIGZ3cml0ZS4gQ2F1c2VzIHRyb3VibGUKLQlvbiBzb21lIHN5c3RlbXMsIGFuZCBkb2Vzbid0IGhlbHAgb24gb3RoZXJzLgotCVNpbWlsYXJseSwgb25seSBkZWZpbmUgWF9PSyBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSBzeXMvc3RhdC5oIC0gYXQgbGVhc3QKLQlvbiBOZXdzT1MgMywgaXQgaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZC4KLQotVHVlIE1hciAgNSAwMTo0Nzo1NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtY29kZS5oIChiZmRfY29mZl9zd2FwX3N5bSwgYmZkX2NvZmZfc3dhcF9hdXgsCi0JYmZkX2NvZmZfc3dhcF9saW5lbm8pOiAgRXhwb3J0IHRoZSByb3V0aW5lcyB0aGF0IGJ5dGUtc3dhcCBDT0ZGCi0Jc3ltYm9sIHRhYmxlcyBpZiBuZWNlc3Nhcnkgd2hlbiByZWFkaW5nIHRoZW0gaW4sIHNvIGdkYiBjYW4gdXNlCi0JdGhlbS4gIEFkZCAiYmZkX2NvZmZfIiB0byB0aGUgbmFtZXMgc28gdGhleSB3b24ndCBjb25mbGljdCB3aXRoCi0JbmFtZXMgaW4gY2FsbGluZyBwcm9ncmFtcy4gIEZJWE1FLXNvb246ICBpZiBjb2ZmLWNvZGUuaCBpcwotCWluY2x1ZGVkIGluIHR3byBCRkQgbW9kdWxlcywgdGhpcyB3aWxsIGNhdXNlIGR1cGxpY2F0ZQotCWRlZmluaXRpb25zOyB0aGUgcm91dGluZXMgc2hvdWxkIGJlIGV4cG9ydGVkIHRvIGEgc2VwYXJhdGUsCi0JY29tbW9uLCBtb2R1bGUgKHByb2JhYmx5IGFsb25nIHdpdGggYSBtZXNzIG9mIG90aGVyIG9uZXMpLgotCi1TYXQgTWFyICAyIDEyOjExOjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCUltcHJvdmUgbW9kdGltZSBzdXBwb3J0LgotCi0JKiBiZmQuaDogIEFkZCBib29sZWFuIG10aW1lX3NldCwgYW5kIGRlY2xhcmUgYmZkX2dldF9tdGltZS4KLQlSZW1vdmUgI2RlZmluZSBmb3IgYmZkX2dldF9tdGltZS4gIFJlbW92ZSBncmF0dWl0b3VzIGNvbW1lbnQuCi0JKiBiZmQuYyAoYmZkX2dldF9tdGltZSk6ICBOZXcgZm4sIGNhY2hlcyBtdGltZSwgZ2V0cyBpZiBub3QgY2FjaGVkLgotCUJVRzogIGFyY2hpdmUgbWVtYmVycyBzdGlsbCBkbyBub3QgZ2V0IGNvcnJlY3QgbW9kIHRpbWVzLgotCi0JSW1wcm92ZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGZvciBjb3JlIGZpbGVzLgotCi0JKiBzdW5vcy5jIChzdHJ1Y3QgY29yZSk6ICBDaGFuZ2Ugdm9pZCAqZnBhX2R1bW15IHRvIGRvdWJsZSBmcF9zdHVmZi4KLQkoc3Vub3M0X2NvcmVfZmlsZV9wKTogIENyZWF0ZSBhIHNlY29uZCByZWdpc3RlcnMgc2VjdGlvbiBpbiB0aGUKLQljb3JlIGZpbGUsIGNhbGxlZCAiLnJlZzIiLCBmb3IgdGhlIGZsb2F0IHJlZ2lzdGVycy4KLQotVGh1IEZlYiAxNCAxNTo0OTowNiAxOTkxICBHdW1ieSBWaW5heWFrIFdhbGxhY2UgIChndW1ieSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogbWFueSBjaGFuZ2VzIHRvIGltcHJvdmUgYXJjaGl2ZSBoYW5kbGluZzsgZm91bmQgYSBsb2dpYyBmbGF3IGluCi0JICBiZmRfY2hlY2tfZm9ybWF0IHdoaWNoIG9ubHkganVzdCBoYXBwZW5lZCB0byB3b3JrIGJ5IGNvb25jaWRlbmNlLgotCi1UaHUgRmViIDE0IDA3OjUzOjE2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogZml4ZWQgdG8gdXNlIG91dHB1dF9vZmZzZXRzCi0JY29ycmVjdGx5LgotCi0JKiBiZmQuaDogY2hhbmdlZCB0eXBlIG9mIHVkYXRhIGluIGFzeW1ib2wgdG8gdm9pZCAqLCBsaWtlIGl0Ci0Jc2hvdWxkIGJlLiBBZGRlZCBiZmRfcmVsb2NfZGFuZ2Vyb3VzIGVudW0gbWVtYmVyLgotCi0JKiBjb2ZmLWNvZGUuaDogRml4ZWQgaXQgc28gdGhhdCBpbnRlcm5hbGx5IGdlbmVyYXRlZCBzeW1ib2xzIGdldAotCXRoZWlyIHZhbHVlcyByZWxvY2F0ZWQgY29ycmVjdGx5IGluIGFsbCBjYXNlcy4gUmVtb3ZlZCBjYWxscyB0bwotCXhtYWxsb2MuCi0KLQkqIGljb2ZmLmM6IE5vdCB1bmRlcnN0YW5kaW5nIHRoZSBkZXN0aW5hdGlvbiBzeW1ib2wgb2YgYSByZWxvYyBpcwotCW5vdCBhIGZhaWx1cmUgYW55IG1vcmUsIGp1c3QgJ2Rhbmdlcm91cycuIFRoaXMgYWxsb3dzIGxpbmtpbmcgb2YKLQliLm91dCBhbmQgY29mZiBpbWFnZXMuCi0KLQkqIHN1bm9zLmM6IENsZWFuZWQgdXAgdGhlIHdheSB0aGF0IFpNQUdJQyBzZWN0aW9uIHNpemVzIGFyZQotCWNhbGN1bGF0ZWQuCi0KLQotVHVlIEZlYiAxMiAxMzoyNTo0NiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBzdW5vcy5jICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IGZpeGVkCi0Jc3ltX3BvaW50ZXItPm5fdmFsdWUgc28gdGhhdCBzeW1ib2xzIG9uIHRoZSB3YXkgb3V0IGdldCB0aGVpcgotCXNlY3Rpb24gcmVsYXRpdmUgdmFsdWVzIGNhbGN1bGF0ZWQgY29ycmVjdGx5LgotCi0JKiBjb2ZmLWNvZGUuaCAobWFuZ2xlX3N5bWJvbHMpOiBmaXhlZCBwcm9ibGVtIHdoZXJlIHRhZ3Mgd2VyZSBub3QKLQliZWluZyByZWxvY2F0ZWQgZm9yIHN0cnVjdHMsIGVudW1zLCB1bmlvbnMuIEFsc28gdmFyaW91cyBsaW50cy4KLQotTW9uIEZlYiAxMSAxOTo1MjoyNiAxOTkxICBHdW1ieSBWaW5heWFrIFdhbGxhY2UgIChndW1ieSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChnZXRfZWx0X2F0X2ZpbGVwb3MpOiBzeXN0ZW1fY2FsbF9lcnJvciByZXR1cm5lZAotCSAgaW5jb3JyZWN0bHkuCi0KLVN1biBGZWIgMTAgMjM6MTg6NDAgMTk5MSAgR3VtYnkgVmluYXlhayBXYWxsYWNlICAoZ3VtYnkgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIFJlc29sdmUgdGhlIHVzZSBvZiBub19lcnJvciBhbmQgc3lzdGVtX2NhbGxfZXJyb3IuCi0JICBUaGUgYmZkIGxpYnJhcnkgaXRzZWxmIG5vdyB3aWxsIG5ldmVyIHNldCBiZmRfZXJyb3IgdG8KLQkgIG5vX2Vycm9yLgotCi0JICBUaGUgY29kZSBzdGlsbCBuZWVkcyB0byBiZSBjb21iZWQgdG8gbWFrZSBzdXJlIGFsbCB0aGUgZXJyb3IKLQkgIGNvZGVzIGFyZSBjb3JyZWN0LiAgSSBzdXNwZWN0IHRoZXkgYXJlIG5vdCBhbHdheXMgc2V0IGNvcnJlY3RseS4KLQotCSogVGhlIG5hbWVzIG9mIGFsbCB0aGUgbWVzc2FnZXMgaGF2ZSBfIHByZXBlbmRlZCBiZWNhdXNlIHRoZSBzdW4KLQkgIGJ1bmRsZWQgY29tcGlsZXIgY2FuJ3QgZGlzdGluZ3Vpc2ggZnJvbSBhIG1hY3JvIHdoaWNoIHRha2VzIGFuCi0JICBhcmd1bWVudCBhbmQgdGhlIHNhbWUgaWRlbnRpZmllciBpbiBhIG5vbi1tYWNybyBjb250ZXh0LgotCi0JKiBUaGUgcmVhc29uIGZvciB0aGUgYWJvdmUgYmVpbmcgdGhhdCBlbnRyeSBwb2ludHMgd2hpY2ggdXNlZCB0bwotCSAgYmUgdHJhbXBvbGluZSBmdW5jdGlvbnMgYXJlIG5vdyBqdXN0IG1hY3JvcyB3aGljaCBleHBhbmQgdG8gYQotCSAgZGlyZWN0IGNhbGwgdGhyb3VnaCB0aGUgYmZkJ3MgeGZlciB2ZWN0b3IuCi0KLQkqICguLi9pbmNsdWRlL2ludGVsLWNvZmYuaCkgRl9BUjMyV1I6IGZpeCB0aGlzIGNvbnN0YW50LiAgV2h5Ci0JICBtdXN0IGdhcyBoYXZlIGl0cyBvd24gdmVyc2lvbiBvZiBldmVyeXRoaW5nICh0aGUgZ2FzIHZlcnNpb24KLQkgIGhhZCB0aGUgY29ycmVjdCB2YWx1ZSkKLQotVHVlIEZlYiAgNSAxMTo0Njo1MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiLm91dC5jOiBBZGRlZCBwYXRjaGVzIHN1cHBsaWVkIGJ5IGNocmlzYkBtaXBvbjIuaW50ZWwuY29tIHRvCi0JcHJvcGVybHkgc3VwcG9ydCBpOTYwIGFyY2hpdGVjdHVyZSBhbmQgb3V0cHV0IGNvcnJlY3QgcmVsb2Mgc3R1ZmYuCi0KLQkqIGJmZC5oOiBhZGRlZCBwcm90b3R5cGUgZm9yIGJmZF9wcmludGFibGVfYXJjaF9tYWNoLCBhZGRlZAotCUJGRF9GQUlMCi0KLQkqIGNvZmYtY29kZS5oOiBBcHBsaWVkIHBhdGNoZXMgZnJvbSBjaHJpc2IgdG8gc3VwcG9ydCBpOTYwCi0JYXJjaGl0ZWN0dXJlLCB6ZXJvIHJlbG9jcyBhbmQgc3dhcCB0aGVtIGNvcnJlY2x5IGFuZCBjb25kaXRpb25hbGx5Ci0JY29tcGlsZWQgdGhlIHRpbWVzdGFtcC4KLQotCSogc3Vub3MuYzogTWFkZSB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCAyXjMgc28gdGhhdCBkb3VibGVzCi0JYXJlIGRvbmUgcHJvcGVybHkuIEZpeGVkIHRoZSBzYW1lIHJlbG9jIGJ1ZyB0aGF0IHdhcyBpbiBiLm91dC5jCi0KLQkqIHN5c2RlcC5oOiBOb3cgY29tcGlsZXMgb24gYSBQb3NpeCBib3gKLQotV2VkIEphbiAzMCAyMTozNjoyNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGljb2ZmLmM6ICBGaXggY29tbWVudCBvbiBiaWctZW5kaWFuIHZlcnNpb24uCi0JKiBjb2ZmLWNvZGUuaDogIE1ha2UgSEFTX1JFTE9DIHJlYWxseSB3b3JrIChpdCdzIGJhY2t3YXJkcyBmcm9tCi0JRl9SRUxGTEcpLiAgU2V0IEZfQVIzMldSIGluIG91dHB1dCBmaWxlcyBpZiBsaXR0bGUgZW5kaWFuCi0JYXJjaGl0ZWN0dXJlLgotCi1UdWUgSmFuIDI5IDIwOjU2OjEwIFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYXJjaHVyZXMuYyBmaXhlZCA9Lz09IHR5cG8KLQotCSogc3Vub3MuYyBhZGRlZCBhcmNoaXRlY3R1cmUgc3R1ZmYgZm9yIG91dHB1dC4gRml4ZWQKLQlidWcgd2hlcmUgZmlsZXMgd2hlcmUgdm1hKGRhdGEpICE9IHNpemUodGV4dCkKLQl3ZXJlIHByb2Nlc3NlZCB3cm9uZy4KLQotCSogY29mZi1jb2RlLmggYWRkZWQgYSBsaW50IGNhc3QKLQotCSogKC4uL2luY2x1ZGUvYS5vdXQuc3VuNC5oKSBmaXhlZCBpdCBzbyB6bWFnaWMKLQl3b3JrZWQKLQotTW9uIEphbiAyOCAxOToxNToyOSBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGFyY2hpdmUuYyByZW1vdmVkIGxvYWRzIG9mIGluY2x1ZGVzLCBhbmQgZml4ZWQgYnVnIHdoZXJlIHN0cmluZwotCXRhYmxlIGRpZG4ndCBoYXZlIGEgbnVsbCBhdCB0aGUgZW5kLgotCi0JKiBiZmQuYyBmaXhlZCBpbmNsdWRlcywgYWRkZWQgc3ltYm9scyBhcmd1bWVudCB0bwotCWNhbm9uaWNhbGl6ZV9yZWxvYyBlbnRyeSBwb2ludC4KLQotCSogbGliYmZkLmMgZml4ZWQgaW5jbHVkZXMgYW5kIGFkZGVkIHNvbWUgbGludCBwYXRjaGVzLgotCi0JKiB0YXJnZXRzLmMgYWRkZWQgYm90aCBzb3J0cyBvZiBpbnRlbCBjb2ZmLgotCi0JKiBiLm91dC5jIGZpeGVkIGluY2x1ZGVkLCBjaGFuZ2VkIHdhcyB0aGUgY2Fub25pY2FsCi0JcmVsb2NzIHdlcmUgZG9uZS4KLQotCSogaWNvZmYuYyBhZGRlZCBzdXBwb3J0IGZvciBjYWxsaiBhbmQgYmlnIGFuZCBsaXR0bGUKLQllbmlkaWFuIHRhYmxlcy4KLQotCSogb3BuY2xzLmMgYWRkZWQgY2htb2QreGluZyBmb3IgZmlsZXMgd2l0aCBFWEVDX1Agc2V0LgotCi0JKiBzdW5vcy5jIGZpeGVkIGluY2x1ZGVzLiBDaGFuZ2VkIGRlZmF1bHQgc2VjdGlvbgotCWFsaWduZW1lbnQgdG8gd29yZHMuIEZpeGVkIHJlbG9jYXRpb24gc3R1ZmYgdG8gd29yayB3aXRoCi0JbmV3IHNjaGVtZQotCi0JKiBiZmQuaCB2YXJpb3VzIG5ldyB0eXBlcyBhZGRlZCwgcHJvdG90eXBlIGZvciBuZXcKLQlyZWxvYyBjYWxscywgY2hhbmdlZCBiZmQtPmlvc3RyZWFtIHRvIGEgdm9pZCAqCi0JdG8gaW5jbHVkaW5nIGZpbGVzIGRvbid0IG5lZWQgc3RkaW8uaC4KLQotCSogbGliY29mZi5oIGFkZGVkIGNvbnZlcnNpb24gdGFibGUgdG8gdGllIHJlbG9jcyB0bwotCWNhbm9uaWNhbCBzeW1ib2xzCi0KLQkqIHN5c2RlcC5oIGNyZWF0ZWQKLQotCSogY29mZi1jb2RlLmggZml4ZWQgaW5jbHVkZXMuIEFkZGVkIGNvZGUgdG8gc3VwcG9ydAotCWJpZyBhbmQgbGl0dGxlIGVuZGlhbiBmb3JtYXRzLiBWYXJpb3VzIGxpbnRzLiBCZXR0ZXIKLQlwcm9jZXNzaW5nIG9mIHN5bWJvbHMuIENoYW5nZWQgcmVsb2Mgc3R1ZmYgdG8gbmV3Ci0Jb3JkZXIKLQotCSogbGliYmZkLmggZml4ZWQgaW5jbHVkZXMKLQotCi1Nb24gSmFuIDIxIDExOjUzOjUxIFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYmZkLmgJY2hhbmdlZCBuYW1lIG9mIGFsaWdubWVudCBlbnRyeSBpbiBzZWNfc3RydWN0IHRvCi0JYWxpZ25tZW50X3Bvd2VyLCBiZWNhdXNlIG9mIGNvbmZsaWN0aW5nIHVzZXMgd2l0aGluIGJmZC4KLQlOb3cgaXQgc2hvdWxkIGJlIG9idmlvdXMgdGhhdCBpdCdzIGEgMioqbiBhbGlnbm1lbnQKLQlzcGVjaWZpZXIuIFJlbW92ZWQgc3RhcnRfcGFkLCBlbmRfYWxpZ25tZW50LCBibG9jaywgbWluc2l6ZSwKLQlvdXRwdXRfZmlsZV9hbGlnbm1lbnQsIHN1YnNlY3Rpb25fYWxpZ25tZW50IGFuZCBvcmlnaW5hbF92bWEgZmllbGRzLgotCUFkZGVkIGFsaWduX3Bvd2VyKCkgbWFjcm8uIEZpeGVkIGJmZF9zZWN0aW9uX2FsaWdubWVudAotCWFjZXNzb3IgbWFjcm9zLiBBZGRlZCBiZmRfc3ltYm9sX3NhbWVfdGFyZ2V0IG1hY3JvLgotCi0JKiBiLm91dC5jIChiX291dF93cml0ZV9vYmplY3RfY29udGVudHMpIGZpeGVkIHRvIHVzZQotCW5ldyBhbGlnbm1lbnQgbWVtYmVyLiBGaXhlZCAoY2FsbGpfY2FsbGJhY2spIHRvIHVzZSBzZWN0aW9uCi0JcmVsYXRpdmUgc3ltYm9scyBwcm9wZXJseS4KLQotCSogc3Vub3MuYyAoc3Vub3M0X29iamVjdF9wKSBmaXhlZCB0byB1c2UgbmV3IGFsaWdubWVudF9wb3dlci4KLQlGaXhlZCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncykgdG8gY29ycmVjdGx5IG1ha2UKLQlzeW1ib2xzIHNlY3Rpb24gcmVsYXRpdmUuCi0KLQkqIGJmZC5jIChiZmRfZXJybXNnKSBmaXhlZCB2YXJpb3VzIGVudW0gY2FzdCBwcm9ibGVtcy4KLQkoYmZkX21ha2Vfc2VjdGlvbikgdG9vayBvdXQgaW5pdGlhbGl6YXRpb24gb2Ygb2Jzb2xldGUgbWVtYmVycy4KLQkoYmZkX3ByaW50X3N5bWJvbF92YW5kZikgYWRkZWQKLQotCSogb3BuY2xzLmMgKGJmZF9jcmVhdGUpIGNyZWF0ZWQuCi0KLQkqIGNvZmYtY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spIHRvb2sgYXdheSByZWZzCi0JdG8gb2Jzb2xldGUgbWVtYmVycy4gKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSkgYWRkZWQKLQljb252ZXJzaW9uIGJldHdlZW4gYWxpZ25tZW50IHR5cGVzLiAoY29mZl9zeW1ib2xfZnJvbSkKLQlhZGRlZC4gKGNvZmZfY291bnRfbGluZW51bWJlcnMpIG9ubHkgY291bnRzIGxpbmVudW1iZXJzCi0JaWYgc3ltYm9sIGlzIG9mIGNvZmYtdHlwZS4gKGNvZmZfbWFuZ2xlX3N5bWJvbHMpIG9ubHkKLQloZWF2aWx5IG1hbmdsZXMgc3ltYm9scyBpZiBzeW1ib2wgaXMgY29mZi10eXBlLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpIHZhcmlvdXMgbGludHMuIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cykKLQl2YXJpb3VzIGxpbnRzIGFuZCBtb2RpZmljYXRpb24gZm9yIGFsaWdubWVudCBjb252ZXJzaW9uLgotCShjb2ZmX3NsdXJwX3JlbG9jcykgZml4ZWQgZm9yIHVzZSB3aXRoIG5ldyBhc2VjdGlvbiBzaGFwZS4KLQotU2F0IEphbiAxOSAxNjoxMDo0MiBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGFyY2hpdmUuYyBsb3RzIG9mIGxpbnQKLQotCSogYi5vdXQuYyBhZGRlZCBjYWxsaiByZWxvY2F0aW9uIHN1cHBvcnQsIHVwZ3JhdGVkIHJlbG9jIGhvd3RvLgotCUZpeGVkIHNvIHRoYXQgYXN5bWJvbCBhbmQgcmVsb2MgcmVjb3JkcyBhcmUgb3V0cHV0Ci0JY29ycmVjdGx5LgotCi0JKiBiZmQuYyBsb3RzIG9mIGxpbnQsIHN1cHBvcnQgZm9yIG5ldyBiZmQgZW50cnkgcG9pbnQKLQliZmRfcHJpbnRfc3ltYm9sLgotCi0JKiBiZmQuaCBjaGFuZ2VkIGRlZmluaXRpb24gb2YgYXN5bWJvbCB0byBjb250YWluIHBvaW50ZXIgdG8KLQlvd25pbmcgYmZkLCByZW1vdmVkIHRhcmdldCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNhY2hlLmMgdG9vayBvdXQgcHJpbnQgc3RhdGVtZW50cywgcHV0IGluIEJGRF9BU1NFUlQgY2FsbHMuCi0KLQkqIGNvZmYtY29kZS5oIHZhcmlvdXMgbGludHMsIGNvcnJlY3RlZCBsaW5lbnVtYmVyIG91dHB1dAotCWZ1bmN0aW9uYWxpdHkuIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBzdHlsZSBhc3ltYm9scyBhbmQKLQliZmRfcHJpbnRfc3ltYm9sLiBGaXhlZCBzbyB0aGF0IGFzeW1ib2wgYW5kCi0JcmVsb2MgcmVjb3JkcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuIEFkZGVkIHRpbWVzdGFtcC4KLQotCSogaWNvZmYuYyBBZGRlZCBzdXBwb3J0IGZvciBuZXcgaG93dG8gc2hhcGUuCi0KLQkqIGxpYmEub3V0LmggQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGFzeW1ib2wgc2hhcGUKLQotCSogbGliYmZkLmMgdmFyaW91cyBsaW50cwotCi0JKiBsaWJiZmQuaCB2YXJpb3VzIGxpbnRzCi0KLQkqIGxpYmNvZmYuaCBhZGRlZCBzdXBwb3J0IGZvciBuZXcgYXN5bWJvbCBzaGFwZS4KLQotCSogc3Vub3MuYyAgdmFyaW91cyBsaW50cy4gQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGFzeW1ib2wgc2hhcGUKLQlhbmQgYmZkX3ByaW50X3N5bWJvbC4KLQotV2VkIEphbiAxNiAyMTozODowOSBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGIub3V0LmMgcmVtb3ZlZCBwcm90b3R5cGUgb2Ygc3Vub3M0X2VubmF0aXZhdGVfc3ltdGFiLCBsb3RzIG9mCi0JcG9pbnRlciBsaW50LiBBZGRlZCBzdXBwb3J0IGZvciBjYWxsaiByZWxvY2F0aW9uLiBGaXhlZCBidWcgd2hlcmUKLQl0aGUgbGFzdCAzMiBieXRlcyBvZiB0aGUgdGV4dCBzZWN0aW9uIHdlcmUgb3ZlcndyaXR0ZW4gYnkgZGF0YS4gRml4ZWQgYnVnCi0Jd2hlcmUgYXJjaGl2ZXMgb2YgYi5vdXQgZGlkbid0IHdvcmsgZHVlIGJmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0JcmV0dXJuaW5nIGZhbHNlLgotCi0JKiBzdW5vcy5jIGFkZGVkIHN1cHBvcnQgZm9yIG5fb3RoZXIgZmllbGQuIEJyYWNlZCB0aGUgaG93dG8gdGFibGUgc28KLQl0aGF0IGl0IHdvbid0IGJlIGFmZmVjdGVkIGJ5IGFueSBsZW5ndGhpbmcgb2YgdGhlIGhvd3RvIHN0cnVjdCB0eXBlZGVmLgotCVZhcmlvdXMgbGludHMKLQotCSogYmZkLmggYWRkZWQgc3VwcG9ydCBmb3Igbl9vdGhlciBmaWVsZCwgYWRkZWQgc3BlY2lhbF9mdW5jdGlvbgotCXJlbG9jIHR5cGUsIG1vZGlmaWVkIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gcHJvdG90eXBlLiBBZGRlZCBiZmRfaF9nZXRfeAotCW1hY3Jvcy4KLQotCSogYmZkLmMgdXBncmFkZWQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgdmFyaW91cyBsaW50cy4KLQotV2VkIEphbiAxNiAwMTo1NTo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgcnRsKQotCi0JKiBDaGFuZ2VMb2c6ICBTdGFydGVkIENoYW5nZUxvZyBmb3IgQkZELgotCSogVG9EbzogIENyZWF0ZSBmaWxlIGZvciBzdWdnZXN0aW9ucy4KLQotCSogTWFrZWZpbGU6ICBTdXBwb3J0IGVhc3kgbG9hZGluZyBpbnRvIFNhYmVyIEMuCi0JQWRkIGRlcGVuZGVuY2llcyBmb3IgaWNvZmYubyBhbmQgYmNzODhrY29mZi5vLgotCVJlbmFtZSBjb2ZmLmMgdG8gY29mZi1jb2RlLmguICBDaGFuZ2UgY2FsbGVycy4KLQotCSogYmZkLmMgKGJmZF9jaGVja19mb3JtYXQpOiAgQWxsb3cgdGhlIGNoZWNrX2Zvcm1hdCByb3V0aW5lcwotCXRvIHJldHVybiB0aGUgZGVzaXJlZCB0YXJnZXQgdmVjdG9yLCByYXRoZXIgdGhhbiBqdXN0IGEgQm9vbGVhbi4KLQliZmQuaCAoYmZkX2NoZWNrX2Zvcm1hdCk6ICBDaGFuZ2UgZnVuY3Rpb24gcG9pbnRlciByZXR1cm4gdHlwZS4KLQlhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCWIub3V0LmMgKGJfb3V0X2xpdHRsZV9vYmplY3RfcCwgYl9vdXRfYmlnX29iamVjdF9wLAotCWJfb3V0X3JlYWxfb2JqZWN0X3ApOiAgY2hhbmdlIGNhbGxlZS4KLQlsaWJiZmQuYyAoX2JmZF9kdW1teV90YXJnZXQpOiAgRHVtbXkgcm91dGluZSByZXBsYWNpbmcgYmZkX2ZhbHNlCi0JaW4gY2hlY2tfZm9ybWF0IHRyYW5zZmVyIHZlY3RvcnMgdGhhdCBuZWVkIGEgZmlsbGVyLgotCWxpYmJmZC5oIChiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0KTogIEZpeCBkZWNscy4KLQliY3M4OGtjb2ZmLmM6ICBjaGFuZ2UgY2FsbGVlLgotCWNvZmYtY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3AsIGNvZmZfYmlnX29iamVjdF9wKTogIGNoYW5nZSBjYWxsZWUuCi0JaWNvZmYuYzogIGNoYW5nZSBjYWxsZWUuCi0Jc3Vub3MuYyAoc3Vub3M0X29iamVjdF9wLCBzdW5vczRfY29yZV9maWxlX3ApOiAgY2hhbmdlIGNhbGxlZS4KLQotCSogbGliYmZkLmMgKHphbGxvYyk6ICBJdCBzaG91bGQgYWN0dWFsbHkgemVybyB0aGUgc3RvcmFnZSEKLQlUaGlzIHdhcyBjb21tZW50ZWQgb3V0IGZvciBzb21lIHJlYXNvbi4KLQotCSogbGliYmZkLmg6ICBBZGQgbWFsbG9jLCB4bWFsbG9jLCBtZW1jcHksIGFuZCBmYXRhbCBkZWNscy4KLQlUaGlzIGlzIHNvIGNhbGxlcnMgY2FuIGF2b2lkIDxzdGRsaWIuaD4gd2hpY2ggZG9lc24ndCBleGlzdAotCW9uIG9sZGVyIHN5c3RlbXMuCi0KLQkqIGJmZC5jIChtYXBfb3Zlcl9zZWN0aW9ucyk6ICBBZGQgZGVidWdnaW5nIGNvZGUsIHNpbmNlIEkKLQlub3RpY2VkIHRoZSBzZWN0aW9uIGNvdW50IGZvciBzdW5vcyBjb3JlIGZpbGVzIHdhcyBiYWQsIGJ1dCBvbmx5Ci0JR0RCIGhhZCBkZXRlY3RlZCB0aGUgcHJvYmxlbS4KLQkoYmZkX3NldF9zZWN0aW9uX2xpbmVub19zaXplLCBiZmRfc2V0X3NlY3Rpb25fbGluZW5vcywKLQliZmRfZ2V0X3NlY3Rpb25fbGluZW5vcyk6ICBSZW1vdmUgb2Jzb2xldGUgZnVuY3Rpb25zLgotCShiZmRfYXBwbHlfcmVsb2NhdGlvbnMpOiAgVXNlIGxvbmdzLCBub3QgaW50cywgZm9yIHRoZSBtYXRoLgotCi0JKiBiZmQuaDogIERlY2xhcmUgZW51bSBib29sZWFuIGFuZCBzdHJ1Y3QgYmZkX3RhcmdldCBhcyB3ZWxsCi0JYXMgdHlwZWRlZnMgZm9yIHRoZW0uICBSZW1vdmUgb2Jzb2xldGUKLQliZmRfZ2V0X3NlY3Rpb25fbGluZW5vX3NpemUuCi0KLQkqIGNhY2hlLmM6ICBNYWtlIHRoZSAiZmRvcGVuIiBzdXBwb3J0IHdvcmsuICBLZWVwIGJldHRlciB0cmFjawotCW9mIGhvdyBtYW55IGZpbGVzIGFyZSBvcGVuLiAgQ2VudHJhbGl6ZSB0aGUgb3BlbmluZyBvZiBmaWxlcwotCWFuZCBiZSBzdXJlIGJmZF9vcGVuW3J3XSBhY3R1YWxseSB0cnkgdG8gb3BlbiB0aGUgZmlsZS4gIEV2YWRlCi0JbGlua2VkIGxpc3QgaW5pdGlhbGl6YXRpb24gcHJvYmxlbXMuCi0KLQkqIGIub3V0LmMsIGNvZmYtY29kZS5oLCBvcG5jbHMuYywgc3Vub3MuYzogIGxpbnQuCi0KLQkqIGNvZmYtY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBOdWxsLXRlcm1pbmF0ZSBzeW10YWIgbmFtZXMuCi0KLQkqIGNwbHVzLWRlbS5jOiAgRGVsZXRlIGZpbGUsIHNpbmNlIGl0IGlzIG5vdCBwYXJ0IG9mIEJGRC4KLQotCSogb3BuY2xzLmMgKGJmZF9vcGVucik6ICBFbGltaW5hdGUgbWlzcGxhY2VkICNpZiAwIGNvZGUuCi0JKGJmZF9vcGVuciwgYmZkX29wZW53KTogIEFjdHVhbGx5IG9wZW4gdGhlIGZpbGUsIGdpdmUgZXJyb3Igbm93LgotCi0JKiBzdW5vcy5jIChzdW5vczRfY29yZV9maWxlX3ApOiAgU2V0IHNlY3Rpb24gY291bnQuCi0JKHN1bm9zNF9zZXRfc2VjdGlvbl9saW5lbm9zLCBzdGFiX25hbWVzLCBmcHJpbnRfbmFtZSk6ICBFbGltaW5pYXRlCi0Jb2Jzb2xldGUgZGVmaW5pdGlvbnMuCi0JKF93cml0ZV9zeW1ib2xfdGFibGUpOiAgSW5pdGlhbGl6ZSA8aWR4PiBjb3VudGVyLgotCShmb29wKTogIEVsaW1pbmF0ZSBkZWJ1Z2dpbmcgY29kZS4KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2ctOTQ5NSBiL2JmZC9DaGFuZ2VMb2ctOTQ5NQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2ODU4My4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nLTk0OTUKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA0MyArMCwwIEBACi1UaHUgRGVjIDIxIDEyOjQzOjQ5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQWRkIGEgcGhvbnkgcmVsb2MgdG8gaGFuZGxlIHRoZQotCW9sZCBzdHlsZSBUT0MxNiByZWZlcmVuY2VzIHdpdGhvdXQgdXNpbmcgUl9QUENfR09ULgotCShwcGNfcmVsb2NfdHlwZSk6IERpdHRvLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIHN1cHBvcnQgZm9yIFRPQzE2LgotCShwcGNfZWxmX3RvYzE2X2lubmVyKTogUmVuYW1lZCBmcm9tIHBwY19lbGZfZ290MTZfaW5uZXIuCi0JKHBwY19lbGZfdG9jMTZfcmVsb2MpOiBSZW5hbWVkIGZyb20gcHBjX2VsZl90b2MxNl9yZWxvYy4KLQkocHBjX2VsZl9nb3QxNl97aW5uZXIscmVsb2N9KTogU3R1YnMgZm9yIHJlYWwgR09UIHN1cHBvcnQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogTmV3IGZ1bmN0aW9uIGZvciBHT1QvUExUIHN1cHBvcnQgdGhhdCBpcwotCXdvcmsgaW4gcHJvZ3Jlc3MuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRGl0dG8uCi0JKHBwY19lbGZfYWRqdXN0X2R5bmluZHgpOiBEaXR0by4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEaXR0by4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEaXR0by4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERpdHRvLgotCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IERlZmluZS4KLQotV2VkIERlYyAyMCAxOToxNDoxOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFdoZW4gYXR0YWNoaW5nIHNlY3Rpb25zIHRvCi0Jc2VnbWVudHMgaWdub3JlIHNlY3Rpb25zIHRoYXQgd29uJ3QgYmUgYWxsb2NhdGVkLiAgUGF0Y2ggZnJvbQotCUFuZHJlYXMgU2Nod2FiLgotCi1UdWUgRGVjIDE5IDIwOjAxOjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBNYXRjaCBvbiBtNjhrLWNibS0qIG9ubHkgaWYgT1MgZG9lc24ndCBtYXRjaAotCWFueXRoaW5nIGVsc2UuCi0KLVR1ZSBEZWMgMTkgMTY6Mzg6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoQ0FMQ19BRERFTkQpOiBEZWZpbmUuCi0JKGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIHRoZSBpbnB1dCBzZWN0aW9uIFZNQSB0byB0aGUKLQlhZGRlbmQgZm9yIFBDIHJlbGF0aXZlIHJlbG9jcy4KLQotU3VuIERlYyAxNyAyMDoxMTo1NSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9wZGF0YSk6IE11c3QgdGVzdCB0aGUgZW50aXJlIGVudHJ5IGZvciB6ZXJvCi0JdG8gY29ycmVjdGx5IHRlcm1pbmF0ZS4KLQotRnJpIERlYyAxNSAxMjowNTo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZW5kaWFuKTogRGVmaW5lLgotCShiZmRfdGFyZ2V0KTogUmVuYW1lIGJ5dGVvcmRlcl9iaWdfcCB0byBieXRlb3JkZXIsIGFuZCBjaGFuZ2UgaXQKLQlmcm9tIGJvb2xlYW4gdG8gZW51bSBiZmRfZW5kaWFuLiAgQ2hhbmdlIGhlYWRlcl9ieXRlb3JkZXJfYmlnX3AKLQljb3JyZXNwb25kaW5nbHkuCi0JKiBiZmQtaW4uaCAoYmZkX2JpZ19lbmRpYW4sIGJmZF9saXR0bGVfZW5kaWFuKTogTmV3IG1hY3Jvcy4KLQkoYmZkX2hlYWRlcl9iaWdfZW5kaWFuLCBiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4pOiBOZXcgbWFjcm9zLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogQWxsIHRhcmdldHM6IENoYW5nZSBpbml0aWFsaXphdGlvbiBvZiBieXRlb3JkZXIgYW5kCi0JaGVhZGVyX2J5dGVvcmRlciB0byB1c2UgZW51bSBiZmRfZW5kaWFuIHZhbHVlcyByYXRoZXIgdGhhbgotCWJvb2xlYW5zLgotCSogQWxsIGZpbGVzOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gYnl0ZW9yZGVyX2JpZ19wIGFuZAotCWhlYWRlcl9ieXRlb3JkZXJfYmlnX3AgdG8gdXNlIG5ldyBiZmRfKl9lbmRpYW4gbWFjcm9zLgotCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IFNldCBsbWEgdG8gc19wYWRkciwgbm90Ci0Jc192YWRkci4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHNfcGFkZHIgdG8gbG1hLCBub3QKLQl2bWEuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCi1GcmkgRGVjIDE1IDA3OjMyOjA5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlW2ldLWkzODYuYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBEZWZpbmUgdG8gJ18nLgotCi1UaHUgRGVjIDE0IDEzOjQ1OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBMb3RzIG9mIG1pbm9yIGNsZWFudXBzLiAgTWFrZSBtYW55IGZ1bmN0aW9ucyByZXR1cm4KLQllcnJvcnMgcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4gIEFsc286Ci0JKGllZWVfd3JpdGVfdHdvYnl0ZSk6IFJlbW92ZTsgY2hhbmdlIGNhbGxlcnMgdG8gY2FsbCBleGlzdGluZwotCWllZWVfd3JpdGVfMmJ5dGVzIGZ1bmN0aW9uLgotCShpZWVlX3dyaXRlX2V4cHJlc3Npb24pOiBEb24ndCBvdXRwdXQgdGhlIHNlY3Rpb24gdHdpY2Ugd2hlbgotCW91dHB1dHRpbmcgYSBsb2NhbCBzeW1ib2wuICBEb24ndCBlbWl0IGFuIGV4dHJhbmVvdXMgemVybyBpZiB0aGVyZQotCWlzIG9ubHkgb25lIHRlcm0uCi0JKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBTZXQgdGhlIGxtYSBhcyB3ZWxsIGFzIHRoZSB2bWEuCi0JKGllZWVfYXJjaGl2ZV9wKTogVXNlIGJmZF9hbGxvY19ncm93IHJhdGhlciB0aGFuIGFuIG9ic3RhY2suCi0KLQkqIGloZXguYyAoaWhleF9zZXRfYXJjaF9tYWNoKTogRG9uJ3QgYWNjZXB0IGFueSBhcmNoaXRlY3R1cmUsIGp1c3QKLQlhIHJlY29nbml6ZWQgb25lIG9yIGJmZF9hcmNoX3Vua25vd24uCi0JKGloZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERlZmluZSBhcyBiZmRfMGwsIHRvIHBlcm1pdCBvYmpjb3B5Ci0JdG8gc3VjY2VlZC4KLQkoaWhleF9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0KLVdlZCBEZWMgMTMgMTU6NDQ6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190YWJsZSk6IERlZmluZS4KLQkoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMpOiBEZWZpbmUuCi0JKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkpOiBEZWZpbmUuCi0JKGFvdXRfbGlua19pbmNsdWRlc19sb29rdXApOiBEZWZpbmUgbWFjcm8uCi0JKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBpbmNsdWRlcyBmaWVsZC4KLQkoYW91dF9saW5rX2luY2x1ZGVzX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJbml0aWFsaXplIGluY2x1ZGVzIGhhc2ggdGFibGUuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogRWxpbWluYXRlIGR1cGxpY2F0ZSBOX0JJTkNMIGVudHJpZXMuCi0KLVdlZCBEZWMgMTMgMTA6NTI6MTQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBNYXRjaCBvbiBtaXBzLSotKiBpbnN0ZWFkIG9mIG1pcHMtaWR0LWVjb2ZmLgotCi1XZWQgRGVjIDEzIDExOjA3OjQ1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogcmVtb3ZlZCBkZWJ1Z2dpbmcgY29kZS4KLQotVHVlIERlYyAxMiAxNzo0MjowNiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9yZWxvYyk6IE5ldyBmdW5jdGlvbiB0byBkdW1wIHRoZSAucmVsb2Mgc2VjdGlvbi4KLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IGNhbGwgcGVfcHJpbnRfcmVsb2MuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IC5yZWxvYyBzZWN0aW9uIGFsaWdubWVudC4KLQkqIGNvZmYtcHBjLmMgKGluX3JlbG9jX3ApOiBBZGRlZCBtaXNzaW5nIG5vbi1lbGlnaWJsZSByZWxvY3MuIFNwaWZmZWQKLQl1cCBzb21lIGRlYnVnZ2luZyBhcyB3ZWxsLgotCi1UdWUgRGVjIDEyIDExOjM0OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogSGFuZGxlIHNwYXJjLSotZWxmKi4gIEZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZQotCTxyZmdAbW9ua2V5cy5jb20+LgotCi1GcmkgRGVjICA4IDE3OjQ3OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgc2VjdGlvbl9jb3VudCB0byAwCi0Jd2hlbiBzZXR0aW5nIHNlY3Rpb25zIHRvIE5VTEwuCi0KLVdlZCBEZWMgIDYgMTc6MDU6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvKTogQWRkIGV4cG9ydF9kZWZpbmVkcwotCWZpZWxkLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIGV4cG9ydF9kZWZpbmVkcyBwYXJhbWV0ZXIuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IElmIGV4cG9ydF9kZWZpbmVkcyBpcyBzZXQsIHNldCBYQ09GRl9FWFBPUlQKLQlmb3IgYWxsIHN5bWJvbHMuCi0JKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIERlYyAgNCAxNjo0MDo0NyAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBSZW1vdmVkIHNvbWUgZGVidWdnaW5nIHByaW50ZidzCi0KLU1vbiBEZWMgIDQgMTE6MjU6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IEhhbmRsZSByZWNvcmQgdHlwZXMgNCBhbmQgNS4KLQkoaWhleF9vYmplY3RfcCk6IFBlcm1pdCB0eXBlcyA0IGFuZCA1LgotCShpaGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogUmVtb3ZlIGNoZWNrIGZvciBvdXQgb2YgcmFuZ2UKLQlhZGRyZXNzZXMuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogR2VuZXJhdGUgdHlwZXMgNCBhbmQgNS4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSnVzdCBpZ25vcmUgd2FybmluZyBhbmQKLQlpbmRpcmVjdCByZWZlcmVuY2VzIHRvIHN5bWJvbHMgd2hpY2ggZG9uJ3QgcmVhbGx5IGV4aXN0LgotCi1TdW4gRGVjICAzIDE5OjAwOjI3IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogTWlub3IgZm9ybWF0IGZpeGVzCi0JKHBlX3ByaW50X2VkYXRhKTogTmV3IGZ1bmN0aW9uLiBVbmRlciBwcml2YXRlIHByaW50aW5nLCB0aGlzIGZvcm1hdHMKLQl0aGUgZWRhdGEgc2VjdGlvbiBvZiBhIFBFIGZpbGUuCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGRlZCBjYWxsIHRvIHBlX3ByaW50X2VkYXRhLgotCi1TdW4gRGVjICAzIDE2OjQ2OjU0IDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogYW91dC1hcm0uYyAoTVlfc3dhcF9zdGRfcmVsb2Nfb3V0KTogVXNlIEtFRVBJVCB0byBnZXQgdGhlIHN5bWJvbAotCWluZGV4LCBkb24ndCBjYWxsIHN0b2kuCi0KLUZyaSBEZWMgIDEgMTQ6NDY6NTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcmVjLmMgKHNyZWNfc2Nhbik6IFNldCBsbWEgYXMgd2VsbCBhcyB2bWEuCi0KLQkqIGloZXguYzogTmV3IGZpbGU7IHN1cHBvcnQgZm9yIEludGVsIEhleCBmb3JtYXQuCi0JKiB0YXJnZXRzLmMgKGVudW0gYmZkX2ZsYXZvdXIpOiBBZGQgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIuCi0JKGloZXhfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBbHdheXMgaW5jbHVkZSBpaGV4X3ZlYy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBpaGV4X2RhdGEgZmllbGQgdG8gdGRhdGEgdW5pb24uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogQWRkIGloZXgubwotCShCRkRfTElCU19DRklMRVMpOiBBZGQgaWhleC5jLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IFNvcnQgdGhlIHNlY3Rpb25zIGluCi0JZWFjaCBzZWdtZW50LgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IFJldHVybiB0aGUgcmlnaHQgc2l6ZSBpZiBzZWdtZW50X21hcCBpcwotCW5vdCBOVUxMLgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCBib3RoZXIgdG8gc29ydCB0aGUgc2VjdGlvbnMuCi0KLQkqIGJmZC5jIChiZmRfcmVjb3JkX3BoZHIpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX3JlY29yZF9waGRyKTogRGVjbGFyZS4KLQkqIGJmZF9pbjIuaDogUmVidWlsZC4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBib2d1cwotCUJGRF9BU1NFUlQuCi0KLQkqIGxpYmJmZC5jIChiZmRfbWFsbG9jLCBiZmRfcmVhbGxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKGJmZF96bWFsbG9jKTogUmV0dXJuIFBUUiwgbm90IGNoYXIgKi4gIFRha2Ugc2l6ZV90LCBub3QKLQliZmRfc2l6ZV90eXBlLgotCSogbGliYmZkLWluLmggKGJmZF9tYWxsb2MsIGJmZF9yZWFsbG9jKTogRGVjbGFyZS4KLQkoYmZkX3ptYWxsb2MpOiBDaGFuZ2UgZGVjbGFyYXRpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIE1hbnkgZmlsZXM6IFVzZSBiZmRfbWFsbG9jIGFuZCBiZmRfcmVhbGxvYyByYXRoZXIgdGhhbiBtYWxsb2MKLQlhbmQgcmVhbGxvYy4gIERvbid0IHNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmIHRoZXkgZmFpbC4KLQotVGh1IE5vdiAzMCAxOTozMjoyNiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYzogQWRkZWQgbWFjcm9zIHRvIHRpZHkgdXAgdG9jIGNlbGwgdHJlYXRtZW50LiBOdW1lcm91cwotCXVzZXMgYXMgd2VsbC4gQWRkZWQgYSBuZXcgaG93dG8gdG8gZGVhbCB3aXRoIFRPQ1JFTDE2IHJlbG9jcyB0aGF0Ci0JYXJlIFRPQ0RFRk4gYXMgd2VsbC4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEV4cGFuZGVkIHRyZWF0bWVudCBvZiBBRERSMzJOQiByZWxvY3MKLQl0byBoYW5kbGUgUlZBIHJlbG9jcyBmcm9tIGRsbHRvb2wuCi0JKHBwY19jb2ZmX3J0eXBlMmhvd3RvKTogVE9DREVGTiByZWxvYyBhZGRpdGlvbi4KLQkoY29mZl9wcGNfcnR5cGVfdG9faG93dG8pOiBUT0NERUZOIHJlbG9jIGFkZGl0aW9uLgotCShwcGNfY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IFRPQ0RFRk4gcmVsb2MgYWRkaXRpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogY2hlY2sgaWRhdGEkWCBzZWN0aW9ucwotCXRvIGdldCB0aGUgcmlnaHQgc2VjdGlvbiBhbGlnbm1lbnQuCi0KLVRodSBOb3YgMzAgMTY6NDg6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IHNldCBsbWEgYmFzZWQgb24KLQlwX3BhZGRyIGlmIHBfcGFkZHIgaXMgemVyby4KLQkobWFrZV9tYXBwaW5nKTogU2V0IGluY2x1ZGVzX2ZpbGVoZHIgYW5kIGluY2x1ZGVzX3BoZHJzIGZvciBmaXJzdAotCVBUX0xPQUQgc2VnbWVudC4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogU2V0IGluY2x1ZGVzX3BoZHJzIGZvciBQVF9QSERSCi0Jc2VnbWVudC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEhhbmRsZSBpbmNsdWRlc19maWxlaGRyIGFuZAotCWluY2x1ZGVzX3BoZHJzLiAgUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YgUFRfUEhEUiBhbmQgZmlyc3QKLQlQVF9MT0FEIHNlZ21lbnRzLgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBTZXQgaW5jbHVkZXNfZmlsZWhkciBhbmQgaW5jbHVkZXNfcGhkcgotCXdoZW4gYXBwcm9wcmlhdGUuICBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiBQVF9QSERSIHNlZ21lbnQuCi0JVXNlIGEgbW9yZSBjb21wbGV4IGNvbmRpdGlvbiBmb3Igd2hlbiBhIHNlY3Rpb24gaXMgaW5jbHVkZWQgaW4gYQotCXNlZ21lbnQgdG8gaGFuZGxlIFNvbGFyaXMgbGlua2VyIG9kZGl0aWVzLgotCi1UaHUgTm92IDMwIDExOjE3OjMzIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb2ZmLW04OGsuYyAoaG93dG9fdGFibGUpOiBSZWZvcm1hdHRlZCBmb3IgZWFzaWVyIHJlYWRpbmc7Ci0Jc3BlY2lhbF9mdW5jdGlvbiBub3cgcG9pbnRzIHRvIG5ldyBmdW5jdGlvbiBtODhrX3NwZWNpYWxfcmVsb2MuCi0JKGhvd3RvX2h2cnQxNik6IEZ1bmN0aW9uIHByZXZpb3VzbHkgdXNlZCBmb3IgaGFuZGxpbmcgSFZSVDE2IHJlbG9jcwotCXJlbW92ZWQuCi0JKHJ0eXBlMmhvd3RvKTogRG8gbm90IGFkZCByZWxvYydzIHJfb2Zmc2V0IHRvIHRoZSBhZGRlbmQsIHRoaXMgd2lsbAotCWJlIGRvbmUgY29ycmVjdGx5IGJ5IG04OGtfc3BlY2lhbF9yZWxvYy4KLQkocmVsb2NfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbiB0byBiZSB1c2VkIGJ5IFJFTE9DX1BST0NFU1NJTkcuCi0JKFJFTE9DX1BST0NFU1NJTkcpOiBEZWZpbmUgdG8gY2FsbCByZWxvY19wcm9jZXNzaW5nLgotCi1XZWQgTm92IDI5IDEyOjQyOjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IENhbGwgbWFsbG9jIHJhdGhlciB0aGFuIHhtYWxsb2MuCi0JKHBlX3ByaW50X3BkYXRhKTogTGlrZXdpc2UuCi0KLQkqIG9wbmNscy5jIChiZmRfYWxsb2NfYnlfc2l6ZV90KTogU2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYKLQlvYnN0YWNrX2FsbG9jIGZhaWxzLgotCShiZmRfYWxsb2NfZmluaXNoKTogU2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgb2JzdGFja19maW5pc2gKLQlmYWlscy4KLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IFNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmIG1hbGxvYyBmYWlscy4KLQkqIE1hbnkgZmlsZXM6IGRvbid0IHNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmIG9uZSBvZiB0aGUgYWJvdmUKLQlyb3V0aW5lcyBmYWlscy4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBEb24ndCBhZGp1c3QgcF9wYWRkcgotCWlmIHBfcGFkZHJfdmFsaWQgaXMgc2V0LgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2FsbCBjb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRml4IGNhc2Ugd2hlcmUgZXh0cmEKLQlwcm9ncmFtIGhlYWRlcnMgd2VyZSBhbGxvY2F0ZWQuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZS4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUgdG8KLQlfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhLgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2NfaW4pOiBEb24ndCBhYm9ydCBpZgotCXJfc3ltbmR4IGlzIFJFTE9DX1NFQ1RJT05fTk9ORSBmb3IgYW4gQUxQSEFfUl9JR05PUkUgcmVsb2MuCi0JQ2hhbmdlIGEgUkVMT0NfU0VDVElPTl9MSVRBIHN5bW5keCB0byBSRUxPQ19TRUNUSU9OX0FCUy4KLQkoYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQpOiBDaGFuZ2UgUkVMT0NfU0VDVElPTl9BQlMgdG8KLQlSRUxPQ19TRUNUSU9OX0xJVEEgZm9yIEFMUEhBX1JfSUdOT1JFLgotCShhbHBoYV9hZGp1c3RfcmVsb2Nfb3V0KTogRm9yIEFMUEhBX1JfSUdOT1JFLCBkb24ndCBjaGFuZ2UKLQlSRUxPQ19TRUNUSU9OX0FCUyB0byBSRUxPQ19TRUNUSU9OX05PTkUuCi0KLVR1ZSBOb3YgMjggMTY6NTk6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIHNlZ21lbnRfbWFwIGZpZWxkLgotCSogZWxmLmMgKG1ha2VfbWFwcGluZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9zb3J0X3NlY3Rpb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogUmVtb3ZlLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IFJlbW92ZSBzb3J0ZWRfaGRycywgY291bnQsIGFuZAotCW1heHBhZ2VzaXplIHBhcmFtZXRlcnMuICBTaW1wbGlmeS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBXaGVuIGdlbmVyYXRpbmcgYW4KLQlleGVjdXRhYmxlLCB1c2UgYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cy4KLQkoZWxmX3NvcnRfaGRycyk6IFJlbW92ZS4KLQkoX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMpOiBSZW1vdmUgZWxpbWluYXRlZCBwYXJhbWV0ZXJzIGZyb20gY2FsbAotCXRvIGdldF9wcm9ncmFtX2hlYWRlcl9zaXplLgotCi1Nb24gTm92IDI3IDEyOjI3OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaHAzMDBocHV4LmMgKE1ZKGNhbGxiYWNrKSk6IFNldCBsbWEgYXMgd2VsbCBhcyB2bWEuCi0KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IFNldCBjb3JyZWN0bHksIHRvIDEuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBTZXQgY29ycmVjdGx5LCB0byAwLgotCi1XZWQgTm92IDIyIDEyOjAyOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rKTogSGFuZGxlIC5yY29uc3Qgc2VjdGlvbi4KLQkoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IEhhbmRsZSBTVFlQX1JDT05TVC4KLQkoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogSGFuZGxlIHNjUkNvbnN0LgotCShlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IEhhbmRsZSBSRUxPQ19TRUNUSU9OX1JDT05TVC4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSGFuZGxlIC5yY29uc3Qgc2VjdGlvbi4KLQkoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBIYW5kbGUgc2NSQ29uc3QuCi0JKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogSGFuZGxlIC5yY29uc3Qgc2VjdGlvbi4KLQkoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogSGFuZGxlIHNjUkNvbnN0LgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jKTogSGFuZGxlIC5yY29uc3QKLQlzZWN0aW9uLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJFTE9DX1NFQ1RJT05fUkNPTlNULgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogT25seSBzZXQgd3JpdHRlbiBpZiB0aGUKLQlERUZfRFlOQU1JQyBmbGFnIGlzIHNldC4KLQotVHVlIE5vdiAyMSAxMzoyNToyOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaG9zdC1hb3V0LmM6IElmIFRSQURfSEVBREVSIGlzIGRlZmluZWQsIGluY2x1ZGUgaXQuCi0KLVR1ZSBOb3YgMjEgMTM6MDM6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChBQ19QUk9HX0NDKTogUmVtb3ZlIGxvY2FsIGRlZmluaXRpb24uCi0JKEJGRF9CSU5BUllfRk9QRU4pOiBSZXF1aXJlIEFDX0NBTk9OSUNBTF9TWVNURU0uCi0JKEJGRF9ORUVEX0RFQ0xBUkFUSU9OKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlndXJlLmluOiBVc2UgQkZEX05FRURfREVDTEFSQVRJT04uCi0JKiBhY2NvbmZpZy5oOiBQdXQgTkVFRF9ERUNMQVJBVElPTl8qIGluIEBUT1BAIHNlY3Rpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDbGVhcgotCXNwZWNpYWxfc2VjdGlvbnMgYmVmb3JlIHJldHVybmluZyB3aGVuIGNhbGxlZCB3aXRoIGEgbm9uIFhDT0ZGCi0JQkZELgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IFNvcnQgY29tbW9uIHN5bWJvbHMgd2l0aAotCWdsb2JhbCBzeW1ib2xzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE9ubHkgcGFkIHRoZQotCXByZXZpb3VzIHNlY3Rpb24gdG8gZm9yY2UgZmlsZSBhbGlnbm1lbnQgd2hlbiBjcmVhdGluZyBhbgotCWV4ZWN1dGFibGUuCi0KLU1vbiBOb3YgMjAgMTQ6NTQ6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmCi0JUlM2MDAwQ09GRl9DLCBzZXQgdXAgdGhlIC5kZWJ1ZyBzZWN0aW9uLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBBZGp1c3QgdGhlIFRPQyBhbmNob3IgdmFsdWUKLQlpZiBpdCBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGFjY29tb2RhdGUgdGhlIGVudGlyZSBUT0MgYXJlYSB3aXRoCi0Jc2lnbmVkIDE2IGJpdCBvZmZzZXRzLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogSGFuZGxlIG5lZ2F0aXZlIFRPQyBvZmZzZXRzIGluIGdsb2JhbAotCWxpbmthZ2UgY29kZS4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IEFkanVzdCByZWxvY2F0aW9ucyBhZ2FpbnN0IGEKLQlUT0MgYW5jaG9yIHRvIHVzZSB0aGUgVE9DIHZhbHVlIHVzZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1TYXQgTm92IDE4IDE4OjAxOjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBDYXN0IG1hbGxvYyByZXR1cm4uCi0JKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IExpa2V3aXNlLgotCi1TYXQgTm92IDE4IDE5OjQzOjA0IDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogcGUtYXJtLmM6IEZpeCB0eXBvcy4KLQkqIGNvZmYtYXJtLmM6IExpa2V3aXNlLgotCi1GcmkgTm92IDE3IDE2OjIyOjA0IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChsaXN0X2VsZSk6IEFkZGVkICJjYXQiZWdvcnkgbWVtYmVyLgotCShyZWNvcmRfdG9jKTogTmV3IGNhdGVnb3J5IHBhcmFtZXRlciAocHJpdiBvciBwdWIpLgotCShwcGNfcmVjb3JkX3RvY19lbnRyeSk6IENoZWNrIHRvIHNlZSBpZiB0b2MgYm91bmRzIGV4Y2VlZGVkLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IFJlbW92ZWQgZW1icmlvbmljIGRhdGEtaW4tdG9jIGZyb20KLQl0aGUgbWFpbmxpbmUuIEl0IGFkZGVzIGV4dHJhIHRvYyBjZWxscyBpbiBlcnJvci4KLQkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IEFkZGVkIHNvbWUgZG9jdW1lbnRhdGlvbi4KLQkoZHVtcF90b2MpOiBDYW4gbm93IGRpYWdub3NlICJ2aXJ0dWFsIHRvYyIgY2hpY2FuZXJ5LgotCi1GcmkgTm92IDE3IDEwOjQxOjI1IDE5OTUgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBDaGFuZ2UgdHlwZSBvZgotCWR5bnN5bWNvdW50IGFuZCBidWNrZXRjb3VudCBmaWVsZHMgZnJvbSBzaXplX3QgdG8gYmZkX3NpemVfdHlwZS4KLQotRnJpIE5vdiAxNyAxMDowMjo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayk6IEk5NjAgdmVyc2lvbjogZG9uJ3QKLQlwb2ludGVyaXplIENfTEVBRlNUQVQgb3IgQ19MRUFGRVhUIGVudHJpZXMuCi0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBPbmx5IGNyZWF0ZQotCURUX0lOSVQgYW5kIERUX0ZJTkkgZW50cmllcyBpZiB0aGUgX2luaXQgb3IgX2Zpbmkgc3ltYm9sIGlzCi0JZGVmaW5lZCBvciBtZW50aW9uZWQgaW4gYSByZWd1bGFyIGZpbGUuCi0KLVRodSBOb3YgMTYgMTU6MTY6NDIgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHBwY19yZWNvcmRfZGF0YV9pbl90b2NfZW50cnkpOiBuZXcgZnVuY3Rpb24KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBUT0NERUZOIGF0dHJpYnV0ZQotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogQ29ycmVjdCBSRUwyNCBoYW5kbGluZwotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IENvcnJlY3QgVE9DREVGTiBoYW5kbGluZwotCi0JKiBwZWljb2RlLmggKGRpcl9uYW1lcyk6IEFkZGVkIG5hbWUgZGVzY3JpcHRpb25zCi0KLVRodSBOb3YgMTYgMDM6Mzg6MDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIFZFUlNJT046IFVwZGF0ZWQgdG8gY3lnbnVzLTIuNi4KLQotV2VkIE5vdiAxNSAxOTozMDowNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChtNjhrNGtuZXRic2RfdmVjKTogRGVjbGFyZS4KLQotV2VkIE5vdiAxNSAxODowNTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IENoYW5nZSB0eXBlIG9mIHNlY29uZCBhcmd1bWVudCB0bwotCV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBmcm9tIHZvaWQgKiB0byBQVFIuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2FzdAotCXVzaW5nIFBUUiByYXRoZXIgdGhhbiB2b2lkICouCi0JKiBiZmQtaW4yLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSB2ZmlsZSBmcm9tIHZvaWQgKgotCXRvIFBUUi4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUgYXMKLQlfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgcmF0aGVyIHRoYW4gY2FzdGluZwotCWJmZF90cnVlLgotCi1XZWQgTm92IDE1IDA0OjA5OjE0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmRlcDEpOiBGaXggc3R1cGlkIHR5cG8gaW4gbGFzdCBjaGFuZ2UuICBSZW1vdmUgYW55Ci0JIkRPIE5PVCBERUxFVEUiIGxpbmVzIG9yIGJsYW5rIGxpbmVzIHRoYXQgbWtkZXAgd3JpdGVzIG9uIHNvbWUKLQlzeXN0ZW1zLgotCShCRkRfTElCU19DRklMRVMsIEFMTF9NQUNISU5FU19DRklMRVMsIEJGRDMyX0JBQ0tFTkRTX0NGSUxFUywKLQlCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBOZXcgdmFyaWFibGVzLgotCShDRklMRVMpOiBVc2UgdGhlbS4KLQotVHVlIE5vdiAxNCAxMTo1MjoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRm9yIFBQQyBQRSwgc3RhcnQgaXNpemUgYXQgMCwKLQlub3QgYXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHNlY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEF2b2lkIHVzaW5nCi0JdW5wb3J0YWJsZSAjZWxpZi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBXaGVuIGdlbmVyYXRpbmcgYSBQUEMgUEUgZXhlY3V0YWJsZQotCXdpdGggbm8gc3ltYm9scywgcm91bmQgdXAgdGhlIGZpbGUgc2l6ZSB0byBhIENPRkZfUEFHRV9TSVpFCi0JYm91bmRhcnkuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLAotCWRvbid0IHdyaXRlIG91dCBhIHN0cmluZyB0YWJsZS4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFdoZW4gdXNpbmcgYSBkaWZmZXJlbnQgc2VjdGlvbgotCWhlYWRlciwgcGFzcyB0aGUgbmV3IG9uZSB0byBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IERvbid0IHNldCBzaF9pbmZvIGFuZCBzaF9lbnRzaXplIGZpZWxkcy4KLQkoZWxmX21hcF9zeW1ib2xzKTogQWRkIHNlY3Rpb24gVk1BIHRvIHN5bWJvbCB2YWx1ZSB3aGVuIGNvbXBhcmluZwotCWFnYWluc3QgMC4KLQkoX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogT25seSBidWlsZCBzeW1ib2wgdGFibGUKLQlpZiB0aGVyZSBhcmUgc29tZSBzeW1ib2xzLiAgU2V0IGZpbGUgb2Zmc2V0IG9mIHN5bXRhYiBhbmQgc3RydGFiCi0Jc2VjdGlvbnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogUmVtb3ZlIGRvc3ltcyBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLiAgTmV2ZXIgc2V0IGZpbGUgb2Zmc2V0IG9mIHN5bXRhYiBhbmQgc3RydGFiCi0Jc2VjdGlvbnMuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKE1BUF9PTkVTWU1UQUIsIE1BUF9EWU5TWU1UQUIsIE1BUF9TVFJUQUIsIE1BUF9TSFNUUlRBQik6IERlZmluZS4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShzd2FwX291dF9zeW1zKTogQ2hlY2sgZm9yIHNwZWNpYWwgbWFwcGluZyBvZiBzdF9zaG5keCBjcmVhdGVkIGJ5Ci0JY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLgotCSogZWxmeHgtdGFyZ2V0Lmg6IFVzZSBuZXcgY29weSByb3V0aW5lcy4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IERlY2xhcmUuCi0KLQkqIGNvbmZpZy5iZmQgKHNoLSotKik6IFNldCB0YXJnX2RlZnZlYyB0byBzaGNvZmZfdmVjLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIENPRkZfV0lUSF9QRSwgaGFuZGxlCi0JQ19OVF9XRUFLLgotCi0JKiBjb2ZmLXNoLmMgKHNobGNvZmZfdmVjKTogVXNlIF9iZmRfZ2VuZXJpY19hcmNoaXZlX3AsIG5vdAotCV9iZmRfZHVtbXlfdGFyZ2V0LCBtYXRjaGluZyB0aGUgcmVjZW50IGNoYW5nZSB0byBhcmNoaXZlCi0JcmVjb2duaXRpb24uCi0KLU1vbiBOb3YgMTMgMTM6MjQ6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldF9maWxlX3dpbmRvdyk6IFVzZSBjYXN0cyB0byBhdm9pZCBkb2luZwotCWFyaXRobWV0aWMgb24gUFRSIHR5cGVzLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBTZXQgdGhlIGxtYSBvZiB0aGUgc2VjdGlvbnMuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBUdXJuIGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQKLQlzeW1ib2wgaW50byBhIHJlbG9jIGFnYWluc3QgdGhlIHNlY3Rpb24uCi0KLU1vbiBOb3YgMTMgMDc6MzE6MzUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IGFkZGVkIHN1cHBvcnQgZm9yIGlubGluZQotCWdsdWUgZm9yIHRoZSByZWxvY3M6IElNR0xVRSBhbmQgSUZHTFVFLgotCShyZWNvcmRfdG9jKTogbmV3IGZ1bmN0aW9uIC0gdHJhY2tzIHRvYyBjb250ZW50cwotCShwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZSk6IG5ldyBmdW5jdGlvbiAtIHN1cHBvcnRzIHRoZSBJTUdMVUUgcmVsb2MKLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEFkZGVkIHN1cHBvcnQgYW5kIGZpeGVzIGZvciBJTUdMVUUvSUZHTFVFCi0JKHBwY19jb2ZmX3J0eXBlMmhvd3RvKTogcmVtb3ZlZCBpbnZhbGlkIElNR0xVRSBoYWNrCi0JKGNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvKTogcmVtb3ZlZCBpbnZhbGlkIElNR0xVRSBoYWNrCi0JKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogUmVtb3ZlZCBhIGRlYnVnIGRlZmluZSAoZHVoKQotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogRml4ZWQgaW52YWxpZCBzdHJjbXAgZm9yICIucmVsZGF0YSIKLQkocGVfcHJpbnRfaWRhdGEpOiBOZXcgZnVuY3Rpb24gLSBmb3JtYXRzIHRoZSBpZGF0YSBzZWN0aW9uIGRhdGEKLQkocGVfcHJpbnRfcGRhdGEpOiBOZXcgZnVuY3Rpb24gLSBmb3JtYXRzIHRoZSBwZGF0YSBzZWN0aW9uIGRhdGEKLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IGNhbGxzIHRvIGFib3ZlCi0KLVN1biBOb3YgMTIgMTI6MjM6MjQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYmZkX2xpYnNfaGVyZSwgZXRjKTogUHJvdmlkZSBlbXB0eSBkZWZpbml0aW9ucy4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdmVjKTogQWRkIGNvbmRpdGlvbmFsIGRlZmluZXMKLQlUQVJHRVRfU1lNIGFuZCBUQVJHRVRfTkFNRSBmb3IgdmVjdG9yIGFuZCBCRkQgbmFtZS4KLQkqIGNvZmYtcG1hYy5jIChwbWFjX3hjb2ZmX3ZlYyk6IFJlbW92ZS4KLQkoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgW1BPV0VSTUFDXTogU2V0IHRoZQotCW1hY2hpbmUgdG8gMCwgbm90IGFsbCBQb3dlck1hY3MgYXJlIDYwMXMuCi0KLUZyaSBOb3YgMTAgMTI6MTA6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJlYWQgaW4gYW55IHByb2dyYW0gaGVhZGVycy4KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogQWRqdXN0IHNlY3Rpb24gbG1hCi0JYmFzZWQgb24gdGhlIHByb2dyYW0gaGVhZGVycywgaWYgYW55LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzaF9hZGRyIGZyb20gdGhlIHZtYSwgbm90IHRoZSBsbWEuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogU2V0IHBfcGFkZHIgb2YgcHJvZ3JhbSBoZWFkZXJzIGJhc2VkIG9uCi0JdGhlIGxtYS4KLQotVGh1IE5vdiAgOSAxMzowMTozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogUHJlc2VydmUgdGRhdGEgaW4gY2FzZSBvZgotCWZhaWx1cmUuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IFJlcG9ydCBhIHJlYXNvbmFibGUgZXJyb3Igd2hlbgotCXRyeWluZyB0byBkbyBhIHJlbG9jYXRlYWJsZSBsaW5rIHdpdGggYSBub24tYS5vdXQgb2JqZWN0IGZpbGUuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogQ2hlY2sgdGhlIGZpcnN0IG9iamVjdCBmaWxlCi0JaW4gYW4gYXJjaGl2ZSBldmVuIGlmIHRhcmdldF9kZWZhdWx0ZWQgaXMgc2V0LiAgSWYgdGhlIG9iamVjdCBmaWxlCi0JaGFzIHRoZSB3cm9uZyB4dmVjLCByZWplY3QgaXQuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykpOiBJZiBhIHNlY3Rpb24gY2FuIG5vdAotCWJlIHJlcHJlc2VudGVkLCByZXBvcnQgdGhlIG5hbWUgdmlhIF9iZmRfZXJyb3JfaGFuZGxlci4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBXcml0ZSBSUzYwMDBDT0ZGX0MgdmVyc2lvbgotCXdoaWNoIGNoZWNrcyBmb3IgU1RZUF9PVlJGTE8gc2VjdGlvbnMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUKLQlyZWxvYyBhbmQgbGluZW5vIGNvdW50IG92ZXJmbG93cy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGNvZmZfY291bnRfbGluZW51bWJlcnMgYmVmb3JlCi0JY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZQotCXJlbG9jIGFuZCBsaW5lbm8gY291bnQgb3ZlcmZsb3dzLgotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBDb3VudCBsaW5lIG51bWJlcnMgYW5kCi0JcmVsb2NzIGJlZm9yZSBkZWFsaW5nIHdpdGggLnBhZCBzZWN0aW9ucy4gIENvdW50IG92ZXJmbG93IHNlY3Rpb24KLQloZWFkZXJzIHdoZW4gaGFuZGxpbmcgLnBhZCBzZWN0aW9ucy4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgYS5vdXQgdnN0YW1wIHRvIDEKLQlpZiBSUzYwMDBDT0ZGX0MuCi0KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9ERVNDUklQVE9SKTogRGVmaW5lLgotCShzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX3RhYmxlKTogQWRkIGRlc2NyaXB0b3Jfc2VjdGlvbiBhbmQKLQlzcGVjaWFsX3NlY3Rpb25zIGZpZWxkcy4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFNldCBsaW5rYWdlIHNlY3Rpb24gYWxpZ25tZW50LiAgQ3JlYXRlCi0JZGVzY3JpcHRvciBzZWN0aW9uLiAgQ2hlY2sgZm9yIG1hZ2ljIHN5bWJvbCBuYW1lcyAoX3RleHQsIGV0Yy4pLAotCWFuZCByZWNvcmQgdGhlbSBpbiBzcGVjaWFsX3NlY3Rpb25zIGlmIGZvdW5kLiAgU2V0Ci0JWENPRkZfREVTQ1JJUFRPUiBmbGFnIGZvciBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBzZXQgaXRzCi0JZGVzY3JpcHRvciBmaWVsZCB0byBwb2ludCBiYWNrIHRvIHRoZSBmdW5jdGlvbiBjb2RlIHN5bWJvbC4KLQkoeGNvZmZfc3dlZXApOiBBbHdheXMgbWFyayB0aGUgc3BlY2lhbCBkZXNjcmlwdG9yX3NlY3Rpb24uCi0JKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogQ2hlY2sgd2hldGhlciB0aGUgc3ltYm9sIG1pZ2h0IGJlIGEKLQlmdW5jdGlvbiBkZXNjcmlwdG9yLCBhbmQgbWFyayBpdCBpZiBpdCBpcy4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBuZXcgc3BlY2lhbF9zZWN0aW9ucwotCXBhcmFtZXRlciwgYW5kIGZpbGwgaXQgaW4uICBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRlc2NyaXB0b3IKLQlzZWN0aW9uLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBTZXQgWENPRkZfREVGX1JFR1VMQVIgZmxhZyB3aGVuIGRlZmluaW5nCi0JZ2xvYmFsIGxpbmthZ2UgY29kZS4gIElmIGFuIHVuZGVmaW5lZCBmdW5jdGlvbiBkZXNjcmlwdG9yIGlzCi0JZXhwb3J0ZWQsIGFycmFuZ2UgdG8gZGVmaW5lIGl0LiAgV2FybiBhYm91dCBhbnkgb3RoZXIgdW5kZWZpbmVkCi0JZXhwb3J0ZWQgc3ltYm9sLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogV3JpdGUgb3V0IHRoZSBkZXNjcmlwdG9yIHNlY3Rpb24uCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBDcmVhdGUgYSBmdW5jdGlvbiBkZXNjcmlwdG9yIHdoZW4KLQluZWNlc3NhcnkuCi0JKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVGh1IE5vdiAgOSAwODo0MDoyMyAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX2NvZmZfbGlua19oYXNoX2VudHJ5KTogbmV3IHR5cGVzIGZvciBoYXNoaW5nCi0JKHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSk6IG5ldyB0eXBlcyBmb3IgaGFzaGluZwotCShwcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IGhhc2ggZW50cnkgY29uc3RydWN0b3IKLQkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBoYXNoIHRhYmxlIGluaXRpYWxpemVyCi0JKHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBoYXNoIHRhYmxlIGNvbnN0cnVjdG9yCi0JKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogY2hhbmdlZCByZWZlcmVuY2VzIHRvIGhhc2ggdGFibGUKLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IGNoYW5nZWQgcmVmZXJlbmNlcyB0byBoYXNoIHRhYmxlCi0KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9saW5rX2hhc2hfZW50cnkpOiByZW1vdmVkIHRvY19vZmZzZXQKLQkqIGxpYmNvZmYuaDogUmVidWlsZAotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiByZW1vdmVkIHRvY19vZmZzZXQgaW5pdAotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiByZW1vdmVkIHRvY19vZmZzZXQgaW5pdAotCi1UaHUgTm92ICA5IDA0OjAwOjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmRlcDEpOiBNYWtlIHN1cmUgdGhlIGZpbGUgbWtkZXAgaXMgdG8gd3JpdGUgZXhpc3RzCi0JZmlyc3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgbmV3IG9wdGlvbiAtLXdpdGhbb3V0XS1tbWFwLiAgU2V0IFVTRV9NTUFQCi0JaWYgaXQgaXMgZ2l2ZW4gYW5kIG1tZXAgaXMgYXZhaWxhYmxlLgotCSogYWNjb25maWcuaDogVW5kZWYgVVNFX01NQVAuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCi0JKiBhb3V0eC5oOiBJZiBVU0VfTU1BUCBpcyBub3QgZGVmaW5lZCwgZG8gYWxsIHN5bWJvbCBhbmQgc3RyaW5nCi0JdGFibGUgaGFuZGxpbmcgdGhlIG9sZCB3YXkuCi0JKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBEb24ndCBjb21wbGFpbiBpZiBsYXN0IGJ5dGUgb2Ygc3RyaW5nCi0JdGFibGUgaXMgbm9uemVyby4KLQkqIGxpYmJmZC5jIFtIQVZFX01BRFZJU0VdOiBJbmNsdWRlIHN5cy90eXBlcy5oIGFuZCBzeXMvbW1hbi5oLgotCShiZmRfZnJlZV93aW5kb3cpIFshIFVTRV9NTUFQXTogRG9uJ3QgZGVmaW5lLgotCShiZmRfZ2V0X2ZpbGVfd2luZG93LAotCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpIFshIFVTRV9NTUFQXTogQWJvcnQuCi0KLVdlZCBOb3YgIDggMjA6MDM6NDQgMTk5NSAgRXJpYyBGcmV1ZGVudGhhbCA8ZnJldWRlbnRoYWxAbnl1LmVkdT4KLQotCSogY29mZi1hMjlrLmMgKFNJR05fRVhURU5EX0hXT1JEKTogVXNlIH4weGZmZmYgcmF0aGVyIHRoYW4KLQkweGZmZmYwMDAwLgotCi1XZWQgTm92ICA4IDExOjMxOjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBDaGFuZ2UgaGFuZGxpbmcgb2YgUl9JUkVMIHJlbG9jIHRvIGJlCi0JY29tcGF0aWJsZSB3aXRoIEFNRCBnZW5lcmF0ZWQgQ09GRiBmaWxlcy4gIFRyeSB0byBzdXBwb3J0IGJvdGggQU1ECi0JYW5kIEdOVSBmb3JtYXRzIHNpbXVsdGFuZW91c2x5LgotCShjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldF9maWxlX3dpbmRvdyk6IENoYW5nZSB3cml0YWJsZSBwYXJhbWV0ZXIgZnJvbQotCWludCB0byBib29sZWFuOyB1cGRhdGUgYWxsIGNhbGxlcnMuICBQYXNzIE1BUF9TSEFSRUQgaWYgbm90Ci0Jd3JpdGFibGUtLWl0J3MgcmVxdWlyZWQgb24gU29sYXJpcy4gIENhc3QgZnByaW50ZiBhcmd1bWVudCB0bwotCWF2b2lkIHdhcm5pbmcuCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9maWxlX3dpbmRvdyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4Lmg6IFVwZGF0ZSBjYWxscyB0byBiZmRfZ2V0X2ZpbGVfd2luZG93LgotCi0JKiB4Y29mZmxpbmsuYyAoWENPRkZfREVGX0RZTkFNSUMpOiBSZW5hbWUgZnJvbSBYQ09GRl9SRUZfRFlOQU1JQy4KLQlDaGFuZ2UgYWxsIHVzZXMuCi0JKHhjb2ZmX3N3YXBfbGRoZHJfaW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9zd2FwX2xkc3ltX2luKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoeGNvZmZfZmluZF9yZWxvYyk6IEhhbmRsZSB0aGUgY2FzZSBvZiBhIHNpbmdsZSByZWxvYyBjb3JyZWN0bHkuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiB3ZSBqdXN0IGNyZWF0ZWQgYSBkZXNjcmlwdG9yLCBwYXNzIGl0Ci0JdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wsIHRvIHNhdmUgYSBoYXNoIGxvb2t1cC4KLQlIYW5kbGUgWFRZX0VSL1hNQ19YTyBzeW1ib2xzIGNvcnJlY3RseS4KLQkoeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzKTogUmV3cml0ZSB0byByZWFkIC5sb2FkZXIgc3ltYm9scwotCXJhdGhlciB0aGFuIG5vcm1hbCBzeW1ib2wgdGFibGUuCi0JKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogSXQncyBub3QgYW4gZXJyb3IgaWYgdGhlIHN5bWJvbCBpcwotCWFscmVhZHkgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIGFic29sdXRlIHZhbHVlLgotCSh4Y29mZl9tYXJrKTogV2hlbiBjb25zaWRlcmluZyBjYWxsZWQgc3ltYm9scywgY2hlY2sgd2hldGhlciB0aGUKLQlkZXNjcmlwdG9yIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdCwgcmF0aGVyIHRoYW4gdGhlIHN5bWJvbAotCWl0c2VsZi4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogTGlrZXdpc2UuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JQ2FzdCByZWFsbG9jIGFuZCBtYWxsb2MgcmV0dXJuIHZhbHVlcy4gIElmIG1hbGxvYyBvciByZWFsbG9jIGZhaWwsCi0Jc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkuCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9maWxlX3dpbmRvdyk6IENoYW5nZSB0eXBlIHRvIGJvb2xlYW4uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVR1ZSBOb3YgIDcgMTE6NTM6NDggMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogbmV3IGZ1bmN0aW9uLgotCShpbl9yZWxvY19wKTogY2hhbmdlZCByZXR1cm4gdmFsdWUuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBtdWNoIHJld29yay4KLQkocHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uKTogbmV3IGZ1bmN0aW9uLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IG5ldyBmdW5jdGlvbi4KLQkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IG5ldyBmdW5jdGlvbi4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogaW5pdGlhbGl6ZSB0b2Nfb2Zmc2V0LgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBpbml0aWFsaXplIHRvY19vZmZzZXQuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3N5bV9pbik6IEFkZGVkIGNvZmZfc3dhcF9zeW1faW5faG9vawotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBBZGRlZCBtb3JlIHNlY3Rpb25zIHRvIHRoZSBkYXRhCi0JZGljdGlvbmFyeSBmb3IgdGhlIHBlIGZpbGUgaGVhZGVyLiBBbHNvIGNoYW5nZWQgbGlua2VyIHZlcnNpb24KLQludW1iZXIgb24gdGhlIHBwYyBzaWRlLgotCShkaXJfbmFtZXMpOiBzbWFsbCBpbXByb3ZlbWVudHMgdG8gdGhlIGRpY3Rpb25hcnkgcHJpbnRpbmcuCi0JKHBlX21rb2JqZWN0X2hvb2spOiBzYXZlIHRoZSBmaWxlIGxldmVsIGZsYWdzLgotCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgdG9jX29mZnNldCBmaWVsZAotCShwZV90ZGF0YSk6IGFkZGVkIHJlYWxfZmxhZ3MgZmllbGQKLQkoY29mZl90ZGF0YSk6IGFkZGVkIGxvY2FsX3RvY19zeW1fbWFwIGFuZCBhY2Nlc3MgbWFjcm8KLQotCSogbGliY29mZi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IGFkZGVkIHRvY19vZmZzZXQgZmllbGQKLQkocGVfdGRhdGEpOiBhZGRlZCByZWFsX2ZsYWdzIGZpZWxkCi0JKGNvZmZfdGRhdGEpOiBhZGRlZCBsb2NhbF90b2Nfc3ltX21hcCBhbmQgYWNjZXNzIG1hY3JvCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogYWRkZWQgaG9vayBmb3IgUEUuCi0JKGNvZmZfbWtvYmplY3QpOiBpbml0IGZvciBsb2NhbF90b2Nfc3ltX21hcAotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCB0aGUgaW50ZXJuYWxfYS5tYWdpYyB0bwotICAgICAgICBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMgd2hpY2ggYXBwZWFycyB0byBiZSB3aGF0IG90aGVyCi0JcHBjIGNvbXBpbGVycyB1c2UuCi0KLVR1ZSBOb3YgIDcgMTM6NDg6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZmxpbmsuYyAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IEtlZXAgbG9va2luZyB0aHJvdWdoIHN0YWJzCi0JZW50cmllcyB1bnRpbCBib3RoIHRoZSBsaW5lIG51bWJlciBhZGRyZXNzIGFuZCB0aGUgZnVuY3Rpb24gbmFtZQotCWFkZHJlc3MgYXJlIHRvbyBsYXJnZS4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1BST0cgdG8gZmluZCBhbmQgY2FjaGUgQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLQkqIGFjbG9jYWwubTQgKEJGRF9DQ19GT1JfQlVJTEQpOiBEb24ndCBkZWZpbmUgQ0NfRk9SX0JVSUxEIGlmIGl0Ci0JaXMgZGVmaW5lZCBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLVR1ZSBOb3YgIDcgMTA6NTc6MjQgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6IERlZmluZSB0byB1c2UKLQlnZW5lcmljIHZlcnNpb24uCi0KLU1vbiBOb3YgIDYgMTc6MTM6MTUgMTk5NSAgSGFycnkgRG9sYW4gIDxkb2xhbkBzc2QuaW50ZWwuY29tPgotCi0JKiBjb2ZmLWk4NjAuYzogTmV3IGZpbGUsIGJhc2VkIG9uIGNvZmYtaTM4Ni5jLgotCSogY3B1LWk4NjAuYzogTmV3IGZpbGUsIGJhc2VkIG9uIGNwdS1pMzg2LmMuCi0JKiBob3N0cy9pODYwbWFjaDMuaDogTmV3IGZpbGUsIGJhc2VkIG9uIGhvc3RzL2kzODZtYWNoMy5oLgotCSogY29uZmlnLmJmZCAoaTg2MC0qLW1hY2gzKiwgaTg2MC0qLW9zZjEqLCBpODYwLSotY29mZiopOiBOZXcKLQl0YXJnZXRzLCB1c2luZyBpODYwY29mZl92ZWMuCi0JKiBjb25maWd1cmUuaW4gKGk4NjAtKi1tYWNoMyosIGk4NjAtKi1vc2YxKik6IE5ldyBob3N0cywgdXNpbmcKLQl0cmFkLWNvcmUubyBhbmQgaG9zdHMvaTg2MG1hY2gzLmguCi0JKGk4NjBjb2ZmX3ZlYyk6IFVzZSBjb2ZmLWk4NjAubyBhbmQgY29mZmxpbmsuby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1pODYwLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtaTg2MC5vLgotCShDRklMRVMpOiBBZGQgY3B1LWk4NjAuYyBhbmQgY29mZi1pODYwLmMuCi0JKiB0YXJnZXRzLmMgKGk4NjBjb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkICZpODYwY29mZl92ZWMuCi0JKiBhcmNodXJlcy5jIChiZmRfaTg2MF9hcmNoKTogRGVjbGFyZS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgJmJmZF9pODYwX2FyY2guCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEhhbmRsZSBJODYwIG1hZ2ljIG51bWJlci4KLQkoY29mZl9zZXRfZmxhZ3MpOiBIYW5kbGUgYmZkX2FyY2hfaTg2MC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgSTg2MCBhLm91dCBtYWdpYyBudW1iZXIuCi0KLU1vbiBOb3YgIDYgMTQ6MzQ6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFNldCB0aGUgYWxpZ25tZW50IHBvd2VyIG9mCi0JdGhlIGNyZWF0ZWQgLnRjIHNlY3Rpb24gdG8gMi4KLQkoeGNvZmZfbWFyayk6IERvbid0IGtlZXAgYSAubG9hZGVyIHJlbG9jIGZvciBhIGNhbGwgdG8gYW4KLQl1bmRlZmluZWQgc3ltYm9sIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBnZW5lcmF0ZQotCWdsb2JhbCBsaW5rYWdlIGNvZGUgZm9yIGEgY2FsbCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLgotCi1TdW4gTm92ICA1IDIxOjQ0OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogUmVidWlsZCBsaXN0IGZyb20gQkZEX0xJQlMsIEFMTF9NQUNISU5FUywKLQlCRkQzMl9CQUNLRU5EUywgQkZENjRfQkFDS0VORFMuCi0JKC5kZXAxKTogUHV0IG1rZGVwIG91dHB1dCBpbiBhIHNlcGFyYXRlIGZpbGUuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXApOiBDYXN0IF9iZmRfcmVhZF9hcl9oZHIgcmV0dXJuCi0JdmFsdWUuCi0KLQlQZXJtaXQgdXNlIG9mIG1tYXAgd2hlbiBhdmFpbGFibGU6Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIG1tYXAsIG1hZHZpc2UsIG1wcm90ZWN0LgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0JKiBsaWJiZmQuYyAoc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsKTogRGVmaW5lIHR5cGUuCi0JKGJmZF9pbml0X3dpbmRvdywgYmZkX2ZyZWVfd2luZG93LCBiZmRfZ2V0X2ZpbGVfd2luZG93KTogTmV3Ci0JZnVuY3Rpb25zLgotCShva190b19tYXApOiBOZXcgc3RhdGljIHZhcmlhYmxlIGZvciBkZWJ1Z2dpbmcuCi0JKF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX3dpbmRvd19pbnRlcm5hbCk6IERlY2xhcmUgdHlwZS4KLQkoYmZkX3dpbmRvdyk6IERlZmluZSB0eXBlLgotCShiZmRfaW5pdF93aW5kb3csIGJmZF9mcmVlX3dpbmRvdywgYmZkX2dldF9maWxlX3dpbmRvdyk6IERlY2xhcmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6Ci0JRGVjbGFyZS4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgdHdvIHdpbmRvdyBmaWVsZHMuCi0JKG9ial9hb3V0X3N5bV93aW5kb3csIG9ial9hb3V0X3N0cmluZ193aW5kb3cpOiBOZXcgbWFjcm9zLgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogSW5pdGlhbGl6ZSB3aW5kb3dzLgotCShhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogR2V0IHN5bWJvbCBkYXRhIGFuZCBzdHJpbmdzIGluCi0Jd2luZG93cyBpbnN0ZWFkIG9mIGV4cGxpY2l0bHkgYWxsb2NhdGVkIGJ1ZmZlcnMuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IEZyZWUgd2luZG93IGluc3RlYWQgb2YgbWVtb3J5LgotCShiZmRfZnJlZV9jYWNoZWRfaW5mbyk6IFJlbGVhc2Ugd2luZG93cyBpbnN0ZWFkIG9mIGZyZWVpbmcgc3RvcmFnZQotCWRpcmVjdGx5LgotCShhb3V0X2xpbmtfZnJlZV9zeW1ib2xzKTogRGl0dG8uCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBuZXcgZmllbGQgZm9yCi0JZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93LgotCShCRkRfSlVNUF9UQUJMRV9HRU5FUklDKTogVXBkYXRlZC4KLQkqIGFvdXQtYWRvYmUuYywgYW91dC10YXJnZXQuaCwgYmluYXJ5LmMsIGJvdXQuYywgY29mZi1hbHBoYS5jLAotCWNvZmYtbWlwcy5jLCBlbGZ4eC10YXJnZXQuaCwgaTM4Nm1zZG9zLmMsIGkzODZvczlrLmMsIGllZWUuYywKLQlsaWJjb2ZmLWluLmgsIG9hc3lzLmMsIHNyZWMuYywgdGVraGV4LmMsIHZlcnNhZG9zLmM6IEFkZGVkIG5ldwotCW1hY3JvcyBmb3IgZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IGZpZWxkLgotCi1TYXQgTm92ICA0IDEyOjIzOjI2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb3JlLmM6IFJlbmFtZWQgdG8gY29yZWZpbGUuYwotCSogbWFrZWZpbGUuZG9zIChPQkpTKTogQ2hhbmdlIGNvcmUubyB0byBjb3JlZmlsZS5vCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTLCBCRkRfTElCUyk6IFVzZSBjb3JlZmlsZS5jIGluc3RlYWQgb2YgY29yZS5jCi0KLUZyaSBOb3YgIDMgMTU6NTQ6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFJlbmFtZSBsb2NhbCB2YXJpYWJsZSBzdWIKLQl0byBvLiAgQ2xvYmJlciBhbmQgcmVzdG9yZSB0aGUgbGlzdCBvZiBuZXcgY3NlY3RzIGFyb3VuZCB0aGUgY2FsbAotCXRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLCBpbiBjYXNlIGl0IHdhbnRzIHRvIHJlcG9ydCBhCi0JbGlua2VyIGVycm9yIGFuZCB0aGUgbGlua2VyIHdhbnRzIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gIFJlc2V0Ci0JdGhlIGxpbmUgbnVtYmVyIGNvdW50IG9mIGEgcmVhbCBzZWN0aW9uIGV2ZW4gaWYgaXQgaGFzIG5vIHJlbG9jcy4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IElmIHNoYXJlZCwgc2V0IHRoZSBEWU5BTUlDIGZsYWcuCi0KLQkqIGNvZmZnZW4uYyAoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogV2FybiBpZiB0aGUgc3RyaW5nIHNpemUKLQlpcyB0b28gc21hbGwuCi0KLVRodSBOb3YgIDIgMjM6MTY6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHdhcm4gYWJvdXQKLQlhbiB1bmRlZmluZWQgc3ltYm9sIGluIGEgc2hhcmVkIGxpbmsuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IENvcnJlY3QgdHlwZSBvZgotCW9sZHR5cGUgZnJvbSBiZmRfbGlua19vcmRlcl90eXBlIHRvIGJmZF9saW5rX2hhc2hfdHlwZS4gIEZyb20KLQlwaGRtQGluZm8udWNsLmFjLmJlIChQaGlsaXBwZSBEZSBNdXl0ZXIpLgotCi1XZWQgTm92ICAxIDE0OjI2OjAyIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb2ZmLW04OGsuYyAocnR5cGUyaG93dG8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShSVFlQRTJIT1dUTyk6IFVzZSBpdCByYXRoZXIgdGhhbiBhIG1hY3JvIGRlZmluaXRpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGludGVybmFsX2EubWFnaWMKLQl0byBQQUdFTUFHSUNQRVhFQ1BBR0VEICNpZiBkZWZpbmVkIChNNjgpICYmICFkZWZpbmVkIChMWU5YT1MpLgotCi0JKiBjb25maWd1cmUuaW46IG02OCotbW90b3JvbGEtc3lzdiogZG9lcyBub3QgdXNlIHB0cmFjZS1jb3JlLm87Ci0JZGVmaW5lIFRSQURfSEVBREVSIHRvIG5ldyBmaWxlIGhvc3RzL2RlbHRhNjguaC4KLQltODgqLW1vdG9yb2xhLXN5c3YqLCBob3dldmVyLCBkb2VzIHVzZSBwdHJhY2UtY29yZS5vLgotCSogaG9zdHMvZGVsdGE2OC5oOiBOZXcgZmlsZS4KLQotCSogcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfY29yZV9maWxlX3ApOiBjaGFuZ2UgYmZkX3ptYWxsb2MgdG8KLQliZmRfemFsbG9jOyBwcm92aWRlIHByb3BlciBwYXJtIGFiZmQgdG8gY2FsbHMgdG8gYmZkX3phbGxvYy4KLQotV2VkIE5vdiAgMSAxMzo1MTo1NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4NmxpbnV4LmMgKE1ZKHZlYykpOiBEZWNsYXJlIGJlZm9yZSB1c2UuCi0KLVdlZCBOb3YgIDEgMTE6NDU6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlQYXNzIGlucHV0X2JmZCwgbm90IGluX2JmZCwgdG8gYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcy4KLQotCSogZWxmLmMgKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlCi0JQkZEIGlzIG5vdCBvZiB0aGUgcmlnaHQgdHlwZS4KLQkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0KTogTGlrZXdpc2UuCi0JKiB4Y29mZmxpbmsuYyAoWENPRkZfWFZFQ1ApOiBEZWZpbmUuCi0JKGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgQkZEIGlzIG5vdAotCW9mIHRoZSByaWdodCB0eXBlLgotCShiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IE9ubHkgY2hlY2sgdGhlIHJlbG9jIHN5bWJvbAotCXRhYmxlIGluZGV4IGFnYWluc3QgdGhlIG51bWJlciBvZiBzeW1ib2xzIGZvciBhIGJhc2UgcmVsYXRpdmUKLQlyZWxvYy4KLQotCSogY29mZi1yczYwMDAuYyAoX2JmZF94Y29mZl9zaXplb2ZfaGVhZGVycyk6IENoYW5nZSBmcm9tIG1hY3JvIHRvCi0Jc3RhdGljIGZ1bmN0aW9uLgotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBTZXQKLQlmdWxsX2FvdXRoZHIgZmxhZyBoZXJlLi4uCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiAuLi5ub3QgaGVyZS4KLQotVHVlIE9jdCAzMSAxMjo1MjowMiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmg6ICBSZW5hbWUgdG8gZWxmLWJmZC5oIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGgKLQlzeXN0ZW1zIHRoYXQgaGF2ZSBhIHN5c3RlbSA8bGliZWxmLmg+LgotCSogTWFrZWZpbGUuaW46IEdsb2JhbGx5IHJlcGxhY2UgbGliZWxmLmggd2l0aCBlbGYtYmZkLmguCi0JKiBiZmQuYywgZWxmLmMsIGVsZjMyLWFyYy5jLCBlbGYzMi1nZW4uYywgZWxmMzItaHBwYS5jLAotCWVsZjMyLWhwcGEuaCwgZWxmMzItaTM4Ni5jLCBlbGYzMi1pODYwLmMsIGVsZjMyLW02OGsuYywKLQllbGYzMi1tODhrLmMsIGVsZjMyLW1pcHMuYywgZWxmMzItcHBjLmMsIGVsZjMyLXNwYXJjLmMsCi0JZWxmNjQtZ2VuLmMsIGVsZjY0LXNwYXJjLmMsIGVsZmNvZGUuaCwgZWxmbGluay5jLAotCWVsZnh4LXRhcmdldC5oOiBJbmNsdWRlIGVsZi1iZmQuaCByYXRoZXIgdGhhbiBsaWJlbGYuaC4KLQkqIGVsZnh4LXRhcmdldC5oOiBDaGFuZ2UgbGliZWxmLmggcmVmZXJlbmNlIHRvIGVsZi1iZmQuaC4KLQotVHVlIE9jdCAzMSAxNTozMDowNyAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBBZGQgbmV3IHBhcmFtZXRlciB3ZWFrLiAgSWYKLQlzZXQsIHNldCBCU0ZfV0VBSyBpbiBzeW1ib2wuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGVjb2ZmX2dldF9leHRyKTogU2V0IHdlYWtleHQgYmFzZWQgb24gQlNGX1dFQUsuCi0JKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IElmIHdlYWtleHQgaXMgc2V0LCBwYXNzIEJTRl9XRUFLIHRvCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBDaGVjayB0aGF0IHRoZSBzZWN0aW9uIHRkYXRhIHJlbG9jcwotCWFyZSBub3QgTlVMTCBiZWZvcmUgdXNpbmcgdGhlbS4KLQotCSogY29uZmlndXJlLmluIChhbHBoYSotKi1saW51eCopOiBTZXQgQ09SRUZJTEUgdG8gdHJhZC1jb3JlLm8gYW5kCi0JZGVmaW5lIFRSQURfSEVBREVSIGFzIGhvc3RzL2FscGhhbGludXguaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGhvc3RzL2FscGhhbGludXguaDogTmV3IGZpbGUuCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogQ2FzdCB1LnVfYXIwIHRvIGJmZF92bWEsCi0Jbm90IGludC4KLQotVHVlIE9jdCAzMSAxMjozNDoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQWNjZXB0IENfQkNPTU0gYW5kCi0JQ19FQ09NTSBzdG9yYWdlIGNsYXNzZXMuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrX3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiB4Y29mZl9tYXJrLgotCSh4Y29mZl9tYXJrKTogQ2FsbCB4Y29mZl9tYXJrX3N5bWJvbC4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBDYWxsIHhjb2ZmX21hcmtfc3ltYm9sLgotCShiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyk6IENhbGwgeGNvZmZfbWFya19zeW1ib2wgcmF0aGVyIHRoYW4KLQlkb2luZyBpdCBieSBoYW5kLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBCdWlsZCBhIC5sb2FkZXIgc3ltYm9sIGZvciBhbiBleHBvcnQgc3ltYm9sLgotCi1Nb24gT2N0IDMwIDE0OjUzOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgbmV3IGxpbmVfZmlsZXBvcwotCWZpZWxkLgotCSh4Y29mZl9maW5kX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFVzZSBpdC4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IFNldCBmaW5mby5saW5lX2ZpbGVwb3MuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIENfQklOQ0wgYW5kIENfRUlOQ0wuICBEb24ndAotCXJlbG9jYXRlIHRoZSB2YWx1ZSBvZiBDX0RFQ0wuCi0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IFJlbW92ZSBib2d1cyBCRkRfQVNTRVJULgotCi1TYXQgT2N0IDI4IDAxOjI1OjM0IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlCi0JY2FsbGJhY2sgZGVjaWRlIHdoYXQgZ29lcyBpbiAucmVsb2NzLgotCSogcGVbaV0taTM4Ni5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IERlZmluZS4KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3RfaG9vayk6IE9ubHkgY29weSBhb3V0aGRyIGlmCi0JdGhlcmUgaXMgb25lLgotCi1TYXQgT2N0IDI4IDAxOjUxOjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBIYW5kbGUgY3NlY3RzIGluIHRoZQotCWFic29sdXRlIHNlY3Rpb24uCi0KLUZyaSBPY3QgMjcgMTg6MTQ6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYzogTW9yZSBpbXByb3ZlbWVudHMsIG1vc3RseSB0byBmaXggaGFuZGxpbmcgb2YKLQljb25zdHJ1Y3RvcnMgYW5kIGEgZmV3IG90aGVyIHNwZWNpYWwgY2FzZXMuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX3ZlYyk6IFNldCBzeW1ib2xfbGVhZGluZ19jaGFyIGJhY2sgdG8KLQl6ZXJvLCByZXZlcnRpbmcgeWVzdGVyZGF5J3MgY2hhbmdlLgotCSogYmZkLWluLmggKGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQpOiBEZWNsYXJlLgotCShiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyk6IERlY2xhcmUuCi0JKGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotRnJpIE9jdCAyNyAxNDo0MjoxNSAxOTk1ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBQT1JUSU5HLCBhb3V0LWFybS5jLCBhb3V0LWVuY2FwLmMsIGFvdXQtdGFyZ2V0LmgsCi0JYW91dHguaCwgZ2VuLWFvdXQuYywgaG9zdC1hb3V0LmMsIGhwMzAwYnNkLmMsIGkzODZhb3V0LmMKLQlpMzg2YnNkLmMsIGkzODZkeW5peC5jLCBpMzg2bGludXguYywgaTM4Nmx5bnguYywgaTM4Nm1hY2gzLmMsCi0JaTM4Nm5ldGJzZC5jLCBtNjhrbHlueC5jLCBtODhrbWFjaDMuYywgbWlwc2JzZC5jLCBuZXdzb3MzLmMsCi0JbnMzMmtuZXRic2QuYywgcGM1MzItbWFjaC5jLCByaXNjaXguYywgc3BhcmNseW54LmMsIHNwYXJjbmV0YnNkLmM6Ci0JQ2hhbmdlIFBBR0VfU0laRSB0byBUQVJHRVRfUEFHRV9TSVpFLgotCi0JKiBtNjhrbmV0YnNkLmM6IERpdHRvIGFzIHdlbGwgYXMgYWRkIHN1cHBvcnQgZm9yIHRoZSBtNjhrNGsgb2JqZWN0Ci0JZm9ybWF0LgotCi0JKiBuZXRic2QuaDogRG91YmxlIGRpdHRvIChpbmNsLiBtNjhrNGsgc3VwcG9ydCkuICBOZXRCU0QncyB0ZXh0Ci0Jc2VnbWVudHMgaW5jbHVkZXMgdGhlIGEub3V0IGhlYWRlci4gIFNlZSB0byB0aGF0IHRoZSBtYWdpYyBudW1iZXIKLQkqYWx3YXlzKiBpcyBiaWctZW5kaWFuLgotCi0JKiBjb25maWcuYmZkOiBBZGQgbTY4Ki1ocCotbmV0YnNkKiBjYXNlLiAgQ3Jvc3MtcG9sbGluYXRlIG02OGsgYW5kCi0JbTY4azRrIE5ldEJTRCBjb25maWd1cmF0aW9ucy4KLQotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IFNlcGFyYXRlIGkzODYgJiBtaXBzIE5ldEJTRAotCWNvbmZpZ3VyYXRpb25zIGZyb20gb3RoZXIgQlNEIG9uZXMuICBEb24ndCBhc3N1bWUgREVDIGlzIHRoZSBvbmx5Ci0JdGhpbmcgTmV0QlNEL21pcHMgcnVuIG9uLiAgQWRkIHttNjhrLG5zMzJrLHNwYXJjfS0qLW5ldGJzZCoKLQljb25maWd1cmF0aW9ucy4gIEFkZCBzdXBwb3J0IGZvciBtNjhrNGsgTmV0QlNEIG9iamVjdCBmb3JtYXQuCi0KLQkqIGxpYmFvdXQuaDogQWRkZWQgTV82OEs0S19ORVRCU0QgbWFnaWMuCi0KLQkqIG02OGs0a25ldGJzZC5jOiBOZXcgZmlsZS4KLQotCSogaG9zdHMve202OGssc3BhcmN9bmJzZC5oOiBEb24ndCBkZWZpbmUgSE9TVF9CSUdfRU5ESUFOX1AuCi0KLQkqIGhvc3RzL25ic2QuaDogRGVmaW5lIEhPU1RfQklHX0VORElBTl9QIGFjY29yZGluZyB0bwotCTxtYWNoaW5lL2VuZGlhbi5oPi4KLQotCSogaG9zdHMvbWlwc25ic2QuaDogTmV3IGZpbGUuCi0KLVRodSBPY3QgMjYgMTQ6MTY6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYzogTnVtZXJvdXMgY2hhbmdlcyB0byBnZXQgY2xvc2VyIHRvIGEgd29ya2luZyBYQ09GRgotCWxpbmtlci4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogQWRkIGZ1bGxfYW91dGhkciwKLQl0b2Nfc2VjdGlvbiwgYW5kIGVudHJ5X3NlY3Rpb24gZmllbGRzLgotCShzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSk6IFJlbW92ZSBsZHJlbF9jb3VudCBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgbmV3IHhjb2ZmX2RhdGEKLQlmaWVsZHMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgUlM2MDAwQ09GRl9DLCBnZW5lcmF0ZQotCWZ1bGwgYS5vdXQgaGVhZGVyIGlmIGZ1bGxfYW91dGhkciBpcyBzZXQgaW4geGNvZmZfZGF0YS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4gIFNldCBvX3NuZW50cnkgYW5kIG9fc250b2MKLQliYXNlZCBvbiBzZWN0aW9ucyBzdG9yZWQgaW4geGNvZmZfZGF0YS4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgbmV3IHhjb2ZmX2RhdGEKLQlmaWVsZHMuCi0JKHhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SLgotCShyczYwMDBjb2ZmX3ZlYyk6IFNldCBzeW1ib2xfbGVhZGluZ19jaGFyIHRvICcuJy4KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfc3ltYm9sX2luZm8pOiBJZiBmaXhfdmFsdWUgaXMgc2V0LCBmaXggdGhlCi0JdmFsdWUgc3RvcmVkIGluIHJldCByYXRoZXIgdGhhbiByZXR1cm5pbmcgYSBwb2ludGVyIHZhbHVlLgotCi1XZWQgT2N0IDI1IDIzOjEwOjM5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwY3ssbGV9LXtlbGYsc3lzdjQsZWFiaSxzb2xhcmlzMn0pOiBSZW1vdmUgTUFDCi0JZm9ybWF0IGZvciBub3cuCi0KLVdlZCBPY3QgMjUgMTY6MTk6MjcgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N0cmluZ190YWJsZSk6IEFsbG9jYXRlIHRoZSBzdHJpbmdzIHdpdGggbWFsbG9jCi0Jc2luY2UgdGhleSdyZSBmcmVlJ2QgYnkgZnJlZV9jYWNoZWRfaW5mby4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNpbWlsYXJseSBmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQotV2VkIE9jdCAyNSAxNDo1OToyMiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RzdHVmZik6ICBEb24ndCBtYWtlIGhlYWRlcnMuCi0KLVdlZCBPY3QgMjUgMTE6MzI6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRG9uJ3QgZG8gYW55dGhpbmcgaWYKLQlvdXRwdXRfYmZkIGlzIG5vdCBTdW5PUy4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLiAgRG9uJ3Qgc2NhbiByZWxvY3Mgb2YKLQlub24tU3VuT1MgaW5wdXQgZmlsZXMuCi0KLQkqIHhjb2ZmbGluay5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byBzdXBwb3J0IGxpbmtpbmcgc2hhcmVkIG9iamVjdHMKLQlhbmQgZ2VuZXJhdGluZyBhIC5sb2FkZXIgc2VjdGlvbi4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogQWRkIGltcG9ydF9maWxlX2lkIGZpZWxkLgotCShzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCBsaW5lbm9fY291bnQsIGZpcnN0X3N5bW5keCwKLQlsYXN0X3N5bW5keCwgYW5kIGxkcmVsX2NvdW50IGZpZWxkcy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2hvd3RvX3RhYmxlKTogQ29ycmVjdCByZWxvYyBuYW1lcy4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogRG9uJ3Qgc2V0IGFueSBmbGFncyBpZiBTVFlQX1BBRAotCWlzIHNldC4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IERlY2xhcmUuCi0JKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVR1ZSBPY3QgMjQgMTc6NDQ6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCB4Y29mZmxpbmsubyB0byBwbWFjX3hjb2ZmX3ZlYy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIG1wdy1jb25maWcuaW46IEFkZCB4Y29mZmxpbmsuYy5vIHRvIHBvd2VycGMtYXBwbGUtbWFjb3MuCi0JKiBjb2ZmLXBtYWMuYzogSW5jbHVkZSBjb2ZmLXJzNjAwMC5jIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXRzCi0JY29udGVudHMuCi0JKHBtYWNfeGNvZmZfdmVjKTogVXBkYXRlIHRvIHVzZSBuZXcgeGNvZmYgc3VwcG9ydC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IE1ha2Ugc3RhdGljLgotCSh4Y29mZl93cml0ZV9hcm1hcCk6IERlY2xhcmUgYnVmIGFzIHVuc2lnbmVkIGNoYXIuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUgYSBsb2NhbCBhcyBQVFIuCi0KLQkqIG1wdy1tYWtlLnNlZDogR2VuZXJhbGl6ZSBzdWJkaXJfZG8gZWRpdC4KLQotVHVlIE9jdCAyNCAxMDoyNTowMSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGFic2QtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbik6IEluaXRpYWxpemUgYXNlY3QtPmZpbGVwb3MKLQljb3JyZWN0bHkuICBEb24ndCBpbml0aWFsaXplIGFzZWN0LT52bWEuCi0KLUZyaSBPY3QgMjAgMTM6MjM6NDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG9wbmNscy5jIChfYmZkX25ld19iZmQpOiBJZiBfYmZkX2NodW5rc2l6ZSB3YXNuJ3QgcHJlc2V0LCB1c2UKLQlzb21ldGhpbmcgYSBsaXR0bGUgbGVzcyB0aGFuIHRoZSBwYWdlIHNpemUuCi0KLVRodSBPY3QgMTkgMTM6MDY6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX2FkanVzdF9zeW1uZHgpOiBDbGVhciAqYWRqdXN0ZWRwLgotCi1XZWQgT2N0IDE4IDE2OjIwOjA4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIC5ic3MgaXMgYmVmb3JlCi0JLmRhdGEgdXMgdGhhdCBhcyBkYXRhX3N0YXJ0LgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IEdldCByZWxvYwotCWNhbGMgY29ycmVjdC4KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBVc2UgX2Nvb2tlZF9zaXplIG9mIGRhdGEgZGlyZWN0b3J5LgotCShjb2ZmX3N3YXBfb3V0aGRyX291dCk6IEhhcmR3aXJlIGluIHZlcnNpb24gbnVtYmVyLgotCi1XZWQgT2N0IDE4IDE2OjUwOjU0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlcwotCW1ham9yIGFuZCBtaW5vciB0byAqX3Zubywgc2luY2UgdGhlIGZvcm1lciBhcmUgYWxzbyBtYWNyb3MgaW4KLQlTdW5PUyBoZWFkZXIgZmlsZXMuICBDYXN0IHJlc3VsdCBvZiBiZmRfYWxsb2MgdG8gYXBwcm9wcmlhdGUKLQl0eXBlLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBDYXN0IHVzZWRfYnlfYmZkIHZhbHVlCi0JYmVmb3JlIGFzc2lnbmluZyB0byBzZWNfZGF0YS4KLQotV2VkIE9jdCAxOCAxMzoyNToxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBUaGUgb2Zmc2V0IGFyZ3VtZW50IGlzCi0Jbm93IHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uLCBub3QgYWJzb2x1dGUuCi0JKiBlY29mZmxpbmsuYyAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IFVzZSB0aGUgcmlnaHQgc3ltYm9sIHRvCi0JZ2V0IHRoZSBmaWxlIG5hbWUgd2hlbiB0aGVyZSBpcyBhIE5fU08gZGlyZWN0b3J5IG5hbWUuICBXaGVuCi0JaGFuZGxpbmcgc3RhYnMsIHJlbWVtYmVyIHRoYXQgc2VjdGlvbi0+dm1hIHdhcyBhZGRlZCB0byB0aGUKLQlvZmZzZXQuCi0KLVR1ZSBPY3QgMTcgMTg6MjQ6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIG5lZWRlZCBmaWVsZC4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IENhbGwgYmZkX3JlbGVhc2UsIG5vdCBmcmVlLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZWVkZWQgZmllbGQuCi0JKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZWNvcmQgbmVlZGVkIG9iamVjdHMuCi0JKGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBPY3QgMTYgMTQ6NDM6NTkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChwZV9kYXRhX3R5cGUuaW5fcmVsb2NfcCk6IE5ldy4KLQotTW9uIE9jdCAxNiAxMDo1Mjo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QpOiBSZW5hbWUgZnJvbQotCWJmZF9lbGZfbGlua19uZWVkZWRfbGlzdC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVsZi5jLCBlbGZsaW5rLmgsIGxpYmVsZi5oOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLQlBZGQgc3RhcnQgYXQgQUlYIGxpbmtlciBzdXBwb3J0OyBubyBzaGFyZWQgbGlicmFyaWVzIHlldC4KLQkqIHhjb2ZmbGluay5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDBjb2ZmX3ZlYyk6IFVzZSB4Y29mZmxpbmsuby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogQWRkIGNzZWN0cyBhbmQgZGVidWdfaW5kaWNlcwotCWZpZWxkcy4KLQkoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEpOiBEZWZpbmUuCi0JKHhjb2ZmX3NlY3Rpb25fZGF0YSk6IERlZmluZSBtYWNyby4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogRGVjbGFyZS4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLXJzNjAwMC5jOiBDbGVhbiB1cCBhIGJpdC4KLQkoeGNvZmZfbWtvYmplY3QpOiBEZWZhdWx0IG1vZHR5cGUgdG8gMUwsIG5vdCBSRS4gIEluaXRpYWxpemUKLQljcHV0eXBlLCBjc2VjdHMsIGFuZCBkZWJ1Z19pbmRpY2VzLgotCSh4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IGNwdXR5cGUuCi0JKHhjb2ZmX2hvd3RvX3RhYmxlKTogUmVuYW1lIGZyb20gcnM2MDAwY29mZl9ob3d0b190YWJsZS4KLQkoeGNvZmZfcnR5cGUyaG93dG8pOiBSZW5hbWUgZnJvbSByczYwMDBjb2ZmX3J0eXBlMmhvd3RvLgotCSh4Y29mZl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSBmcm9tCi0JcnM2MDAwY29mZl9yZWxvY190eXBlX2xvb2t1cC4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShfYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzKTogRGVmaW5lLgotCShfYmZkX3hjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbik6IERlZmluZS4KLQkocnM2MDAwY29mZl92ZWMpOiBGb3IgQkZEX0pVTVBfVEFCTEVfTElOSywgdXNlIF9iZmRfeGNvZmYsIG5vdAotCWNvZmYuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIEFJWCwKLQlpbmNyZW1lbnQgc29mYXIgYnkgU01BTExfQU9VVFNaIGlmIG5vdCBleGVjdXRhYmxlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIEFJWCwgYWx3YXlzIG91dHB1dCBhbiBhLm91dAotCWhlYWRlcjsgaWYgbm90IGV4ZWN1dGFibGUsIGhlYWRlciBzaXplIG9mIFNNQUxMX0FPVVRTWi4KLQkqIGhhc2guYyAoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCk6IEFkZCB4Y29mZiBmaWVsZC4KLQkoX2JmZF9zdHJpbmd0YWJfaW5pdCk6IEluaXRpYWxpemUgeGNvZmYgZmllbGQuCi0JKF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfc3RyaW5ndGFiX2FkZCk6IEluIFhDT0ZGIG1vZGUsIGxlYXZlIHR3byBieXRlcyBmb3IgbGVuZ3RoLgotCShfYmZkX3N0cmluZ3RhYl9lbWl0KTogSW4gWENPRkYgbW9kZSwgd3JpdGUgb3V0IGxlbmd0aC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCB4Y29mZmxpbmsuby4KLQkoQ0ZJTEVTKTogQWRkIHhjb2ZmbGluay5jLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogU2V0IFNFQ19BTExPQywgbm90Ci0JU0VDX05PX0ZMQUdTLCBmb3IgLmFjb21tb24gc2VjdGlvbi4gIEZyb20gUGV0ZXIgU2NoYXVlcgotCTxQZXRlci5TY2hhdWVyQFJlZ2VudC5FLVRlY2huaWsuVFUtTXVlbmNoZW4uREU+LgotCi1TYXQgT2N0IDE0IDIxOjM2OjAyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoaW5fcmVsb2NfcCk6IEFkZCwgY2xvbmUgZnJvbSBjb2ZmLWkzODYuYy4KLQotRnJpIE9jdCAxMyAxNzo0ODo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaCAoSEFWRV9TWVNfUFJPQ0ZTX0gpOiBVbmRlZiwgd2l0aCBjb21tZW50LgotCSogY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KLQotCSogb3BuY2xzLmMgKGdldHBhZ2VzaXplKSBbIUhBVkVfR0VUUEFHRVNJWkVdOiBEZWZpbmUgYXMgMjA0OC4KLQkoX2JmZF9jaHVua3NpemUpOiBOZXcgdmFyaWFibGUuCi0JKF9iZmRfbmV3X2JmZCk6IFNldCBpdCB0byBnZXRwYWdlc2l6ZSgpIGlmIG5lZ2F0aXZlLCBhbmQgdXNlIGl0Ci0JZm9yIG9ic3RhY2sgY2h1bmsgc2l6ZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGdldHBhZ2VzaXplLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHRyYWQtY29yZS5jIChyYXdwdHIpOiBNYWtlIGl0IGEgbG9jYWwgdmFyaWFibGUgb2YKLSAJcHRyYWNlX3VuaXhfY29yZV9maWxlX3AuCi0KLUZyaSBPY3QgMTMgMTE6MjI6MDEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoaW5fcmVsb2NfcCk6IE5ldy4KLQkqIGNvZmYtaTM4Ni5jIChpbl9yZWxvY19wKTogTmV3LgotCSogY29mZmNvZGUuaDogQWxsd2F5cyBpbmNsdWRlIHBlaWNvZGUuaCBpZiBDT0ZGX1dJVEhfUEUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT25seSBzZXQgaGFzX3JlbG9jX3NlY3Rpb24KLQlpZiBQRV9JTUFHRS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDYWxsCi0JaW5fcmVsb2NfcCB0byBkZWNpZGUgaWYgcmVsb2Mgc2hvdWxkIGJlIGVtaXR0ZWQuCi0JKiBsaWJjb2ZmLmggKHBlX2RhdGFfdHlwZS5pbl9yZWxvY19wKTogTmV3LgotCSogcGVpY29kZS5oIChwZV9ta29iamVjdCk6IEluaXRpYWxpemUgaW5fcmVsb2NfcC4KLQotV2VkIE9jdCAxMSAwMDo0OToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IE1vdmUgdG8gY29mZmdlbi5jLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogQ29weSBmcm9tIGNvZmZnZW4uYy4KLQkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogTGlrZXdpc2UuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ29ycmVjdCBjb25kaXRpb25zCi0JdW5kZXIgd2hpY2ggdHlwZSBhbmQgc2l6ZSBjaGFuZ2Ugd2FybmluZ3MgYXJlIGlzc3VlZC4KLQotVHVlIE9jdCAxMCAxODozMjo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9jb3VudF9saW5lbnVtYmVycyk6IERvbid0IGNvdW50IGxpbmUgbnVtYmVycyBmb3IKLQlhIHN5bWJvbCB3aGljaCBpcyBub3QgaW4gYSByZWFsIHNlY3Rpb24uCi0JKGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBSZW5hbWUgZnJvbQotCWNvZmZfbGlua19oYXNoX25ld2Z1bmMgYW5kIG1ha2Ugbm9uLXN0YXRpYy4KLQkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUuCi0JKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogVXNlIGl0LgotCShwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzKTogTWFrZSBzdGF0aWMuCi0JKiBsaWJjb2ZmLWluLmggKChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJZiBSUzYwMDBDT0ZGX0MsIHNldCBjcHV0eXBlCi0JZmllbGQgaW4gWENPRkYgdGRhdGEuCi0JKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQ2hlY2sgaWZkZWYgUlM2MDAwQ09GRl9DLCBub3QgaWZkZWYKLQlVODAyUk9NQUdJQywgZm9yIGNsYXJpdHkuICBUcnkgdG8gc2V0IGFyY2ggYW5kIG1hY2hpbmUgY29ycmVjdGx5Ci0JYmFzZWQgb24gY3B1dHlwZSBzdG9yZWQgaW4gYS5vdXQgaGVhZGVyLCBvciBpbiBuX3R5cGUgb2YgaW5pdGlhbAotCS5maWxlIHN5bWJvbC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgY3B1dHlwZSBjb3JyZWN0bHkgaW4gYS5vdXQKLQloZWFkZXIuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQWRkIGNhc3RzIHRvIGZpbGVfcHRyIHRvIGF2b2lkCi0Jd2FybmluZ3MuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IFN3YXAgaW4gY3B1dHlwZSBmaWVsZC4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogU3dhcCBvdXQgY3B1dHlwZSBmaWVsZC4gIERvbid0IGNsZWFyCi0Jb2xkIHJlc3YxIGZpZWxkLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgY3B1dHlwZSBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogY3B1LXJzNjAwMC5jIChyczYwMDBfY29tcGF0aWJsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9yczYwMDBfYXJjaCk6IFVzZSBpdC4KLQkqIGNwdS1wb3dlcnBjLmMgKHBvd2VycGNfY29tcGF0aWJsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBEZWZpbmUgdmFyaW91cyBmbGF2b3VycyBvZiBQb3dlclBDLgotCShiZmRfcG93ZXJwY19hcmNoKTogVXNlIHBvd2VycGNfY29tcGF0aWJsZS4gIFBvaW50IGF0Ci0JYXJjaF9pbmZvX3N0cnVjdC4KLQotVHVlIE9jdCAxMCAxMDo1MDo0NiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiAgUmVtb3ZlIEJJU09OLgotCi1UdWUgT2N0IDEwIDAxOjI4OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCB3YXJuIGFib3V0Ci0JY2hhbmdpbmcgdGhlIHNpemUgb3IgdHlwZSBpZiB0aGUgb2xkIGRlZmluaXRpb24gd2FzIHdlYWsuCi0KLU1vbiBPY3QgIDkgMTE6MjQ6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb21iaW5lZF9lbnRyeV90eXBlKTogQWRkIGZpeF9saW5lIGZpZWxkLgotCShjb2ZmX3NsdXJwX2xpbmVfdGFibGUpOiBXYXJuIGlmIHdlIHRyeSB0byBzZXQgdGhlIGxpbmVubyBmaWVsZCBvZgotCWEgc3ltYm9sIHR3aWNlLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIFJTNjAwMENPRkZfQywgaGFuZGxlIENfQklOQ0wgYW5kCi0JQ19FSU5DTCBieSBzZXR0aW5nIGZpeF9saW5lLiAgRml4IENfQlNUQVQgc3ltYm9sIHZhbHVlLgotCSogY29mZmdlbi5jIChjb2ZmX21hbmdsZV9zeW1ib2xzKTogSGFuZGxlIGZpeF9saW5lLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IE9ubHkgdXNlIE5fREVCVUcgaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLgotCShjb2ZmX3ByaW50X3N5bWJvbCk6IFByaW50IGZpeF92YWx1ZSBzeW1ib2xzIGluIGEgdXNlZnVsIGZhc2hpb24uCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogRGVmaW5lLgotCSh4Y29mZl9kYXRhKTogRGVmaW5lLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIHhjb2ZmX29ial9kYXRhIGZpZWxkIHRvIHRkYXRhIHVuaW9uLgotCSogYmZkLWluMi5oLCBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9ta29iamVjdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfbWtvYmplY3QpOiBEZWZpbmUuCi0JKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQkocnM2MDAwY29mZl9ob3d0b190YWJsZSk6IENoYW5nZSBSX1RPQyBjb21wbGFpbl9vbl9vdmVyZmxvdyBmcm9tCi0Jc2lnbmVkIHRvIGJpdGZpZWxkLgotCShyczYwMDBjb2ZmX3ZlYyk6IEFkZCBEWU5BTUlDIHRvIG9iamVjdF9mbGFncy4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUgLnBhZCBhbmQKLQkubG9hZGVyIHNlY3Rpb25zIHNwZWNpYWxseS4KLQkoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogSWYgUlM2MDAwQ09GRl9DLCBnZXQgdGhlIC50ZXh0IGFuZCAuZGF0YQotCXNlY3Rpb24gYWxpZ25tZW50IGZyb20gdGhlIFhDT0ZGIHRkYXRhIGluZm9ybWF0aW9uLgotCShjb2ZmX21rb2JqZWN0X2hvb2spOiBJZiBSUzYwMDBDT0ZGX0MsIHNldCBEWU5BTUlDIGJhc2VkIG9uCi0JRl9TSFJPQkosIGFuZCBjb3B5IHRoZSBleHRyYSBhLm91dCBoZWFkZXIgaW5mb3JtYXRpb24gaW50byB0aGUKLQlYQ09GRiB0ZGF0YSBzdHJ1Y3R1cmUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgUlM2MDAwQ09GRl9DLCBzZXQgRl9TSFJPQkosCi0JRl9EWU5MT0FEIGFuZCB0aGUgZXh0cmEgYS5vdXQgaGVhZGVyIGluZm9ybWF0aW9uLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBCU0ZfTk9UX0FUX0VORCBmb3IgYSBDX0VYVCBvcgotCUNfSElERVhUIHN5bWJvbCB3aXRoIGF0dGFjaGVkIGNzZWN0IGluZm9ybWF0aW9uLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBJZiBSUzYwMDBDT0ZGX0MsIHN3YXAKLQlpbiB0aGUgb19tYXhkYXRhIGZpZWxkLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBJZiBSUzYwMDBDT0ZGX0MsIHN3YXAgZXh0cmEgWENPRkYgZmllbGRzLgotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBEb24ndCBtb3ZlIGFueSBzeW1ib2wgdG8gdGhlCi0JZW5kIGlmIEJTRl9OT1RfQVRfRU5EIGlzIHNldC4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVuYW1lIF9iZmRfcmVhZF9hcl9oZHIgZmllbGQgdG8KLQlfYmZkX3JlYWRfYXJfaGRyX2ZuLgotCSogbGliYmZkLWluLmggKF9iZmRfcmVhZF9hcl9oZHIpOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogYXJjaGl2ZS5jIChfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IENhc3QgX2JmZF9yZWFkX2FyX2hkcgotCXJldHVybiB2YWx1ZS4KLQkoZG9fc2x1cnBfYnNkX2FybWFwLCBkb19zbHVycF9jb2ZmX2FybWFwKTogTGlrZXdpc2UuCi0JKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBMaWtld2lzZS4KLQkoX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTGlrZXdpc2UuCi0KLUZyaSBPY3QgIDYgMTY6MTg6MzUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZXRfbmV4dF9tYXBlbnQpOiBSZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUwotCXdoZW4gdGhlIHN5bWJvbCB0YWJsZSBpcyBlbXB0eS4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCByZXNlcnZlCi0Jc3BhY2UgZm9yIHNlY3Rpb24gc3ltYm9scywgc2luY2Ugd2UgZG9uJ3Qgb3V0cHV0IHRoZW0gZWl0aGVyLgotCShlbGZfbTY4a19hZGp1c3RfZHluaW5keCk6IFJlbW92ZWQuCi0KLQkqIHB0cmFjZS1jb3JlLmMgKHJhd3B0cik6IE1ha2UgaXQgYSBsb2NhbCB2YXJpYWJsZSBvZgotIAlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcC4KLQotRnJpIE9jdCAgNiAxMjoyNDo0NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBSZXR1cm4gZmFsc2UsIG5vdAotCU5VTEwuCi0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGN7LGxlfS17ZWxmLHN5c3Y0LGVhYmksc29sYXJpczJ9KTogQWRkIE5ULCBhbmQKLQlNYWMgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotRnJpIE9jdCAgNiAxMjowNDowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9maXhfc3ltYm9sX25hbWUpOiBEb24ndCB0cnkgdG8gc2V0IHVwIGZpbGUKLQlhdXhlbnQgaWYgdGhlcmUgaXNuJ3Qgb25lLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBJZiB0aGVyZSBpcyBubyBmaWxlIGF1eGVudCwgdXNlIFNZTU5NTEVOCi0JcmF0aGVyIHRoYW4gRklMTk1MRU4gYXMgdGhlIG1heGltdW0gbmFtZSBsZW5ndGguCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfcHJpbnRfYXV4LgotCShiZmRfY29mZl9wcmludF9hdXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgKFJTNjAwMENPRkZfQyB2ZXJzaW9uKSk6IFBvaW50ZXJpemUgdGhlCi0Jc2NubGVuIGZpZWxkIG9mIGFuIFhUWV9MRCBjc2VjdCBhdXggZW50cnkuCi0JKGNvZmZfcHJpbnRfYXV4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBwb2ludGVyaXplIHNjbmxlbiBmaWVsZDsgbm93IGRvbmUKLQlpbiBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2suCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQ2FsbCBiZmRfY29mZl9wcmludF9hdXguCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT24gQUlYLCBjbGVhciBGX1JFTEZMRwotCWlmIHRoZXJlIGFyZSBzeW1ib2xzLCBmb3IgbmF0aXZlIEFJWCBsZCBjb21wYXRpYmlsaXR5LgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2suCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayk6IERlZmluZSBhcyBhIGZ1bmN0aW9uIGlmIFJTNjAwMENPRkZfQwotCW9yIEk5NjAsIGFuZCBhcyAwIG90aGVyd2lzZS4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAoY29mZl9wb2ludGVyaXplX2F1eCk6IENoYW5nZSBwYXJhbWV0ZXJzICB0byB0YWtlCi0Jc3ltYm9sIHBvaW50ZXIgaW5zdGVhZCBvZiB0eXBlIGFuZCBjbGFzcywgYW5kIHRvIHRha2UgYXV4IGluZGV4LgotCUNhbGwgX2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgaWYgaXQgaXMgZGVmaW5lZC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBBbHdheXMgY2FsbCBjb2ZmX3BvaW50ZXJpemVfYXV4LgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIGFsbCBmaWVsZHMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogY29mZi1yczYwMDAuYzogQWRkIGZ1bGwgc3VwcG9ydCBmb3IgQUlYIGFyY2hpdmVzLiAgUmV3cml0ZSBvbGQKLQlyZWFkLW9ubHkvaG9zdC1vbmx5IHN1cHBvcnQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IENfSElERVhUIHN5bWJvbHMgdG8gYmUKLQlCU0ZfTE9DQUwuCi0JKE9USEVSX0dMT0JBTF9DTEFTUyk6IERvIG5vdCBkZWZpbmUgdG8gYmUgQ19ISURFWFQgaWYKLQlSUzYwMDBDT0ZGX0MuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBfYmZkX3JlYWRfYXJfaGRyIGZpZWxkLiAgTW9kaWZ5Ci0JQkZEX0pVTVBfVEFCTEVfQVJDSElWRSBhY2NvcmRpbmdseS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3NuYXJmX2FyX2hkcik6IERvbid0IGRlY2xhcmUuCi0JKF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBEZWNsYXJlLgotCShfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIpOiBEZWNsYXJlLgotCShfYmZkX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCShfYmZkX25vYXJjaGl2ZV9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2JzZF9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBhcmNoaXZlLmM6IENoYW5nZSBhbGwgY2FsbGVycyBvZiBfYmZkX3NuYXJmX2FyX2hkciB0byBjYWxsCi0JX2JmZF9yZWFkX2FyX2hkciBpbnN0ZWFkLgotCShfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIpOiBSZW5hbWUgZnJvbSBfYmZkX3NuYXJmX2FyX2hkci4KLQkoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IFJlbmFtZSBmcm9tCi0JY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAuICBNYWtlIG5vbi1zdGF0aWMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3NsdXJwX2FybWFwKTogQ2FsbCBfYmZkX3JlYWRfYXJfaGRyIHJhdGhlcgotCXRoYW4gX2JmZF9zbmFyZl9hcl9oZHIuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWFkX2FyX2hkcik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkqIGllZWUuYyAoaWVlZV9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBvYXN5cy5jIChvYXN5c19yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIHNvbS5jIChzb21fcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1UaHUgT2N0ICA1IDE0OjA0OjA3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuYyAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBJZiBzeW1wdHIgaXMKLQl6ZXJvLCB0aGVyZSBhcmVuJ3QgYW55IHN5bWJvbHMsIGV2ZW4gaWYgbnN5bXMgaXMgc2V0LgotCi1UaHUgT2N0ICA1IDExOjQ1OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBhZGp1c3RfaGVhZGVycwotCWZpZWxkLgotCSogZWNvZmYuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBDaGVjayBmb3IgdmFyaW91cyBBbHBoYQotCXNlY3Rpb25zLCBhbmQgc2V0IHN0eXAgY29ycmVjdGx5IGZvciB0aGVtOiAuZ290LCAuaGFzaCwgLmR5bmFtaWMsCi0JLmxpYmxpc3QsIC5yZWwuZHluLCAuY29uZmxpYywgLmR5bnN0ciwgLmR5bnN5bSwgLmNvbW1lbnQuCi0JKF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBDaGVjayBmb3IgdmFyaW91cyBBbHBoYSBzZWN0aW9uCi0JdHlwZXMuCi0JKGVjb2ZmX3NvcnRfaGRycyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFJldHVybiBib29sZWFuLCBub3Qgdm9pZC4KLQlTb3J0IHRoZSBzZWN0aW9ucyBieSBWTUEgYmVmb3JlIGxvb2tpbmcgdGhyb3VnaCB0aGVtLiAgUHV0IHRoZQotCWZpcnN0IG5vbiBTRUNfQUxMT0Mgc2VjdGlvbiBvbiBhIG5ldyBwYWdlLiAgUHV0IGV2ZXJ5IFNFQ19BTExPQwotCXNlY3Rpb24gb24gYW4gYXBwcm9wcmlhdGUgYm91bmRhcnkgd2l0aGluIHRoZSBwYWdlLgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgotCShfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgZm9yIHZhcmlvdXMgQWxwaGEKLQlzZWN0aW9uIHR5cGVzIHdoZW4gaW5jcmVtZW50aW5nIHRleHRfc2l6ZSBhbmQgZGF0YV9zaXplLiAgQ2FsbAotCWFkanVzdF9oZWFkZXJzIGJhY2tlbmQgZnVuY3Rpb24gaWYgaXQgZXhpc3RzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9hZGp1c3RfaGVhZGVycyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgYWRqdXN0X2hlYWRlcnMgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogaG9zdHMvaTM4NmJzZC5oOiBSZXN0b3JlIGZpbGUgaW5jb3JyZWN0bHkgZGVsZXRlZCBvbiBTZXAgNi4KLQotV2VkIE9jdCAgNCAxODoxNTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmMgKENPUkVfVkVSU0lPTl8xKTogVXNlIENPUkVfVkVSU0lPTl8xIGluc3RlYWQKLQlvZiBBTFRFUk5BVEVfQUlYX0NPUkVfRk9STUFULgotCSogY29uZmlndXJlLmluIChhaXg0KTogTm8gbG9uZ2VyIG5lZWQgQ09SRV9GTEFHUy4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlZC4KLQotV2VkIE9jdCAgNCAxNTozNjozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU5TMzJrIGNoYW5nZXMgZnJvbSBJYW4gRGFsbDoKLQkqIGFvdXR4LmggKE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUsIE1ZX3JlbG9jYXRlX2NvbnRlbnRzKTogTmV3Ci0JbWFjcm9zLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQsIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCwKLQlhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IENhbGwgdGhlbSBpbnN0ZWFkIG9mIF9iZmRfKgotCXZlcnNpb25zLgotCSogYW91dC10YXJnZXQuaCAoTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQpOiBOZXcgbWFjcm8sIGRlZmF1bHRzCi0JdG8gemVyby4KLQkoYmFja2VuZF9kYXRhKTogVXNlIGl0IGluc3RlYWQgb2YgaGFyZGNvZGVkIHplcm8uCi0KLQkqIGFvdXQtbnMzMmsuYyAoQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyk6IE5ldyBtYWNyby4KLQkoTVlfc3dhcF9zdGRfcmVsb2Nfb3V0KTogVXNlIHVkYXRhLmkgZm9yIEtFRVBJVCwgZG9uJ3QgY2FsbCBzdG9pLgotCi0JKiBuczMya25ldGJzZC5jOiBJbmNsdWRlIGJmZC5oLgotCShNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciwgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IG1hY3Jvcy4KLQkoTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVjbGFyZSBmdW5jdGlvbiB0b28uCi0JKiBwYzUzMi1tYWNoLmMgKHNldF9zaXplcyk6IERvbid0IGRlY2xhcmUuCi0JKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLCBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCk6IERlZmluZS4KLQkoYmFja2VuZF9kYXRhLCBNWV9iYWNrZW5kX2RhdGEpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGNvbmZpZy5iZmQ6IFRyZWF0IG5zMzJrLXBjNTMyLXV4KiBsaWtlIG5zMzJrLXBjNTMyLW1hY2gqLCBhbmQKLQluczMyay0qLWxpdGVzKiBsaWtlIG5zMzJrLSotbmV0YnNkKi4KLQotCSogaG9zdHMvbmJzZC5oOiBTd2FwIG9yZGVyIG9mIHN5cy92bXBhcmFtLmggYW5kIHN5cy9wYXJhbS5oLCB0bwotCWNvbXBpbGUgb24gbGl0ZXMuCi0KLVdlZCBPY3QgIDQgMTQ6MTU6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlc3RvcmUgc2V0dGluZwotCWZfdGltZGF0IHRvIDAsIGRlbGV0ZWQgb24gQXVndXN0IDIyLgotCi1UdWUgT2N0ICAzIDE2OjI4OjMyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSwKLQljb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLAotCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IGlmZGVmIHRvIGFsbG93IG92ZXJyaWRlcy4KLQkqIHBlaWNvZGUuaCAoY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3Ci0JKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBTd2FwIGJzcyBzaXplIGludG8gdGhlIHJpZ2h0IHBsYWNlLgotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkIHNvbWUgbmV3bGluZXMuCi0KLVR1ZSBPY3QgIDMgMTE6NTM6MDQgMTk5NSAgSmVmZiBMYXcgIChsYXdAaHVybC5jeWdudXMuY29tKQotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBkaWUgaWYgYSBzcGFjZSBoYXMgbm8gc3Vic3BhY2VzLgotCi1Nb24gT2N0ICAyIDE0OjA4OjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBsZXQgYSB3ZWFrCi0JZHluYW1pYyBzeW1ib2wgb3ZlcnJpZGUgYSBjb21tb24gc3ltYm9sLiAgRG9uJ3QgY2hhbmdlIHRoZSBzaXplIG9yCi0JdHlwZSBpZiB0aGV5IGhhdmUgYmVlbiBzZXQgYW5kIHRoZSBuZXcgc3ltYm9sIGlzIG5vdCBhIGRlZmluaXRpb24uCi0JV2FybiBpZiB0aGUgc2l6ZSBvciB0eXBlIGNoYW5nZXMuCi0KLVN1biBPY3QgIDEgMDE6MzQ6NDEgMTk5NSAgSmVmZiBMYXcgIChsYXdAaHVybC5jeWdudXMuY29tKQotCi0gICAgICAgICogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3Qgd3JpdGUgdGhlIHN5bWJvbCB0YWJsZSBvcgotCXN5bWJvbAlzdHJpbmdzLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBXcml0ZSB0aGVtIGhlcmUuICBQbGFjZSB0aGVtIGFmdGVyIHRoZQotCXN1YnNwYWNlIGRhdGEsIGJ1dCBiZWZvcmUgdGhlIHJlbG9jcy4KLQotRnJpIFNlcCAyOSAxMTowMTo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogSnVzdCBwYXNzIGZhbHNlLCBub3QKLQlpbmZvLT5zaGFyZWRfbGlicmFyeSwgdG8gc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IERvbid0IHdhcm4gYWJvdXQgYSByZWxvYyBpbiB0aGUgLnRleHQKLQlzZWN0aW9uLgotCShzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogUmVtb3ZlIC50ZXh0IHNlY3Rpb24gYXNzZXJ0aW9uLgotCi1UaHUgU2VwIDI4IDE4OjQ4OjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIHBvd2VycGMtKi1tYWNvcyosIHBvd2VycGMtKi1tcHcqLgotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IEFkZCBwbWFjX3hjb2ZmX3ZlYyBjYXNlLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtcG1hYy5vLgotCSogY29mZi1wbWFjLmM6IE5ldyBmaWxlLCBQb3dlck1hYyBYQ09GRiBzdXBwb3J0LgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBZGQgUG93ZXJNYWMgY2FzZS4KLQkqIHRhcmdldHMuYyAocG1hY194Y29mZl92ZWMpOiBEZWNsYXJlLgotCi0JKiBtcHctY29uZmlnLmluOiBWYXJpb3VzIGNoYW5nZXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZQotCWF1dG9jb25mLWJhc2VkIGNvbmZpZ3VyeS4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHNlZCBjb21tYW5kcyB0byB0cmFuc2xhdGUgVW5peAotCW1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBob3N0cy9tcHcuaDogUmVtb3ZlLgotCSogYmZkLWluLmgsIGJmZC1pbjIuaDogSWYgTVBXLCBpbmNsdWRlIHRoZSBmaWxlIHRoYXQgZGVmaW5lcwotCXRydWUgYW5kIGZhbHNlIGFzIGVudW1zLCB0aGVuIGRlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRC4KLQotVGh1IFNlcCAyOCAxNzowNjoyMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X2dldF9zeW10YWIpOiBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIG9uIGVycm9yLgotCSogb3BuY2xzLmMgKGJmZF9mZHBlbnIpOiBDaGFuZ2UgV0lOMzIgcmVzdHJpY3Rpb24gdG8gV0lOR0RCLgotCi1UaHUgU2VwIDI4IDE1OjMwOjQ0IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIGNvZmYtcHBjLmM6IFJlZm9ybWF0dGVkIGFjY29yZGluZyB0byBnbnUgY29udmVudGlvbnMKLQkgICAgICAgICAgICAgIFJlbW92ZWQgaXJyZWxldmFudCAiaWYgMCIgY29kZQotCi1UaHUgU2VwIDI4IDExOjE5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUpOiBUcmVhdCBzZWNvbmRhcnkgc3ltYm9scyBhcyB3ZWFrCi0Jc3ltYm9scyByYXRoZXIgdGhhbiBhcyBpbmRpcmVjdCBzeW1ib2xzLgotCShNWShzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBhYm91dAotCXNlY29uZGFyeSBzeW1ib2xzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBNYWtlIHN1cmUgdGhhdCB0aGUgYWxpZ25tZW50Ci0Jb2YgLmN0b3JzIGFuZCAuZHRvcnMgc2VjdGlvbnMgaXMgbm8gbGFyZ2VyIHRoYW4gMi4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBjaGFuZ2UKLQliZmRfbGlua19oYXNoX2NvbW1vbiB0byBiZmRfbGlua19oYXNoX25ldywgc2luY2UgaXQgbWF5IGJlIG9uIHRoZQotCXVuZGVmIGxpc3QuCi0JKGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRG9uJ3QgcHV0IF9fRFlOQU1JQyBpbiB0aGUKLQlkeW5hbWljIHN5bWJvbHMgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBIYW5kbGUgcmVsb2NzIGNvcnJlY3RseSB3aGVuIGNyZWF0aW5nIGEKLQlzaGFyZWQgbGlicmFyeS4KLQkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IERvbid0IG1hcmsgdGhlIF9fRFlOQU1JQyBzeW1ib2wgYXMKLQl3cml0dGVuIGV2ZW4gaWYgaXQgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4KLQkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBVc2UgcGx0X29mZnNldCBmb3IgdGhlIGFkZHJlc3Mgb2YKLQl0aGUganVtcCB0YWJsZSByZWxvYy4gIEFkZCBhbiBhc3NlcnRpb24uICBVc2UgUkVMT0NfSk1QX1NMT1QKLQlyYXRoZXIgdGhhbiB0aGUgY29uc3RhbnQgMjIuCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBIYW5kbGUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluayk6IFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIEdPVCB0bwotCXplcm8gd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogSWYgdGhlcmUgaXMgYSBzeW1ib2wgX19EWU5BTUlDLAotCXdyaXRlIGl0IG91dCBhdCB0aGUgc3RhcnQgb2YgdGhlIHN5bWJvbCB0YWJsZS4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtYXJtLm8uCi0KLVRodSBTZXAgMjggMDA6NTg6MDUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgYXJtLSotY29mZi4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBBZGQgYXJtY29mZl97bGl0dGxlLGJpZ31fdmVjLgotCSogdGFyZ2V0cy5jIChhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMuCi0JKiBjb2ZmLWFybS5jIChhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMpOiBBbHdheXMgZGVmaW5lLgotCi1XZWQgU2VwIDI3IDEwOjM3OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfZmluZF90YXJnZXQpOiBSZW1vdmUgZGVidWdnaW5nIGNvZGUuCi0KLVdlZCBTZXAgMjcgMDc6MjM6MzkgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogY29mZi1wcGMuYywgcGUtcHBjLmMsIHBlaS1wcGMuYzogSW5pdGlhbCBiZmQgZm9yIGNvZmYvUEUKLSAgICAgICAgc3VwcG9ydCBvbiBwb3dlcnBjLgotCSogTWFrZWZpbGUuaW46IGFkZGVkICotcHBjIGZpbGVzCi0JKiBjb2ZmY29kZS5oOiBwcGMgTUFHSUMsIGFuZCB1c2UgcGVpY29kZS5oIHJhdGhlciB0aGFuIGNvZmZzd2FwLmggdG8KLSAgICAgICAgYWxsb3cgcGUgYmFzZWQgLm8ncyB0byBiZSBzaGFyZWQgd2l0aCBvdGhlciB0b29scyBvbiBwcGMvTlQKLQkqIGNvbmZpZy5iZmQ6IGFkZGVkIHBvd2VycGNbbGVdLVtwZXx3aW5udF0gY29uZmlnIHN1cHBvcnQKLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBhZGRlZCBiZmRfcG93ZXJwY1tsZV1fcGVbaV1fdmVjCi0JKiBwZWljb2RlLmg6IEFkZGVkIG1vcmUgc2VjdGlvbiBmbGFncyBmb3IgUEUgb24gcHBjCi0JICAgICAgICAgICAgIEFkZGVkIGNvZmZfc3dhcF9maWxlaGRyX291dCB0byBhbGxvdyBwZWljb2RlLmggdG8gYmUKLQkJICAgICB1c2VkIGZvciBub24taW1hZ2UgUEUgZmlsZXMgb24gcHBjLgotCQkgICAgIENoZWNrIGZvciBpbWFnZSwgb3Igbm90LCBiZWZvcmUgY29weWluZyBwZV9vcHRoZHIKLQkqIHRhcmdldHMuYzogQWRkZWQgbmV3IGJmZCdzCi0JKiB0YXJnZXRzLmM6IFJlbW92ZWQgdHdvIGluYWN0aXZlIGJmZHMgdGhhdCBzaG91bGRuJ3QgaGF2ZSBtYWRlIGl0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgIGZhci4KLQotVHVlIFNlcCAyNiAxNDowNjo0MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfcmVsb2NfdHlwZSk6IFJlbmFtZSBmcm9tIHJlbG9jX3R5cGUsIGFuZCB1c2UKLQlleHBsaWNpdCB2YWx1ZXMgdG8gaW5pdGlhbGl6ZSBhbGwgcmVsb2NzLiAgQ2hhbmdlIGFsbCB1c2Vycy4KLQkocHBjX2VsZl9icnRha2VuX2lubmVyKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSBicmFuY2ggcHJlZGljaXRpb24KLQlyZWxvY3MuCi0JKHBwY19lbGZfYnJ0YWtlbl9yZWxvYyk6IERpdHRvLgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IFVzZSBuZXcgZnVuY3Rpb25zLiAgTWFrZSBzdXJlIGFsbCB1bnN1cHBvcnRlZAotCXJlbG9jcyB1c2UgcHBjX2VsZl91bnN1cHBvcnRlZF9yZWxvYy4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogS2VlcCB0cmFjayBvZiB3aGV0aGVyIGFuIGVycm9yCi0JbmVlZHMgdG8gYmUgcmVwb3J0ZWQuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFN1cHBvcnQgYnJhbmNoIHByZWRpY3Rpb24gcmVsb2NzLgotCi1UdWUgU2VwIDI2IDEyOjQ4OjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9hc3NlcnQpOiBSZW1vdmUgXG4gZnJvbSBzdHJpbmcgcGFzc2VkIHRvCi0gICAgICAgIF9iZmRfZXJyb3JfaGFuZGxlci4KLQotCSogY29mZi1pMzg2LmM6IChUV09fREFUQV9TRUNTKTogRG9uJ3QgZGVmaW5lLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIF9iZmRfbWFrZV9zZWN0aW9uX2hvb2suCi0JKGJmZF9jb2ZmX21ha2Vfc2VjdGlvbl9ob29rKTogRG9uJ3QgZGVmaW5lLgotCShjb2ZmX21ha2Vfc2VjdGlvbl9ob29rKTogUmVtb3ZlLgotCShzZWNfdG9fc3R5cF9mbGFncyk6IFJlbW92ZSBUV09fREFUQV9TRUNTIGNhc2UuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogRG9uJ3QgaW5pdGlhbGl6ZSBtYWtlX3NlY3Rpb25faG9vawotCWZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBKdXN0IGNhbGwKLQliZmRfbWFrZV9zZWN0aW9uX2FueXdheSwgbm90IGJmZF9tYWtlX3NlY3Rpb24gb3IKLQliZmRfY29mZl9tYWtlX3NlY3Rpb25faG9vay4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBSZW1vdmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX21ha2Vfc2VjdGlvbl9ob29rKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogRG9uJ3QgaW5pdGlhbGl6ZQotCW1ha2Vfc2VjdGlvbl9ob29rIGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCB0cnkgdG8gc3R1ZmYKLQlwb2ludGVycyBpbnRvIHZhbHVlIGZpZWxkIGZvciB3YXJuaW5nIGFuZCBpbmRpcmVjdCBzeW1ib2xzOyBqdXN0Ci0JbGVhdmUgdGhlIHZhbHVlIGZpZWxkIGFsb25lLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBVc2UgbmV4dCBzeW1ib2wgZm9yCi0Jd2FybmluZyBhbmQgaW5kaXJlY3Qgc3ltYm9scywgcmF0aGVyIHRoYW4gbG9va2luZyBpbiBzeW1ib2wgdmFsdWUuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBSZW1vdmUgaW5kaXJlY3RfcHRyX3B0cgotCXBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4gIFJlbW92ZSBzdXBwb3J0IGZvciBpbmRpcmVjdAotCXN5bWJvbHM7IGl0IGRpZG4ndCB3b3JrIGFueWhvdy4KLQkoX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBSZW1vdmUgaW5kaXJlY3RfcHRyIHZhcmlhYmxlLgotCSogc3ltcy5jOiBDaGFuZ2UgY29tbWVudHMgYWJvdXQgQlNGX1dBUk5JTkcgYW5kIEJTRl9JTkRJUkVDVC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIFNlcCAyNSAxNjowNDowOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEZvciBhbGwgMTQtYml0IGJyYW5jaCByZWxvY3MsCi0JZ28gYmFjayB0byB0ZWxsaW5nIHRoZSB0b29scyB0aGlzIHJlbG9jIG9wZXJhdGVzIG9uIDMyIGJpdHMuCi0KLU1vbiBTZXAgMjUgMTE6NDg6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfY2FsbGJhY2spOiBVc2UgX2JmZF9lcnJvcl9oYW5kbGVyCi0JcmF0aGVyIHRoYW4gYSBkaXJlY3QgZnByaW50Zi4KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogaTM4NmxpbnV4LmMgKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkobGludXhfZmluaXNoX2R5bmFtaWNfbGluayk6IExpa2V3aXNlLgotCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfY29yZV9maWxlX3ApOiBMaWtld2lzZS4KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fc2l6ZW9mX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19iYWRfYnl0ZSk6IExpa2V3aXNlLgotCSogYmZkLmMgKGJmZF9hc3NlcnQpOiBMaWtld2lzZS4gIEFsc28gY2hhbmdlIGZpbGUgdG8gYmUgY29uc3QuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2Fzc2VydCk6IERlY2xhcmUgZmlyc3QgcGFyYW1ldGVyIGNvbnN0LgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IERvbid0IGJvdGhlciB0byBmcHJpbnRmOyByZXR1cm5pbmcKLQliZmRfcmVsb2Nfb3ZlcmZsb3cgaXMgZW5vdWdoLgotCSogY29mZi1oODMwMC5jIChydHlwZTJob3d0byk6IERvbid0IGJvdGhlciB0byBmcHJpbnRmOyBqdXN0IGFib3J0LgotCSogY29mZi1oODUwMC5jIChydHlwZTJob3d0byk6IExpa2V3aXNlLgotCSogY29mZi16OGsuYyAocnR5cGUyaG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9nZXRfbGluZW5vKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX25vX2luZm9fdG9faG93dG8pOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbm9faW5mb190b19ob3d0b19yZWwpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlKTogTGlrZXdpc2UuCi0JKE1ZKHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbW92ZSAjaWYgMCBzZWN0aW9ucy4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgbGluZV9idWYgZmllbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogUmVtb3ZlIHN0YXRpY3MgYnVmZmVyCi0JYW5kIGZpbGVuYW1lX2J1ZmZlci4gIEluc3RlYWQsIHVzZSBhIG1hbGxvYyBidWZmZXIgc3RvcmVkIGluIHRoZQotCW5ldyBsaW5lX2J1ZiBmaWVsZC4gIFJlbW92ZSBsZW5ndGggcmVzdHJpY3Rpb25zLgotCi0JKiBjb2ZmZ2VuLmMgKHN0cmluZ19zaXplKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZGVidWdfc3RyaW5nX3NpemUsIGRlYnVnX3N0cmluZ19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogQWRkIHN0cmluZ19zaXplX3AsIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCi0JYW5kIGRlYnVnX3N0cmluZ19zaXplX3AgcGFyYW1ldGVycy4gIFVzZSB0aGVtIGluc3RlYWQgb2YgdGhlCi0JZ2xvYmFsIHZhcmlhYmxlcy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wsIGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBBZGQgbG9jYWwgdmFyaWFibGVzIHRvIHJlcGxhY2UgcmVtb3ZlZAotCWdsb2JhbCB2YXJpYWJsZXMuCi0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCBvZmZzZXQsIGksCi0JZnVuY3Rpb24sIGFuZCBsaW5lX2Jhc2UgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogVXNlIHNlY3Rpb24gdGRhdGEgdG8gY2FjaGUKLQlpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gdXNpbmcgc3RhdGljIHZhcmlhYmxlcy4KLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBBZGp1c3Qgb2Zmc2V0cyBpbiBhbiBOTUFHSUMKLQlmaWxlLiAgRnJvbSBQZXRlciBEZVdvbGYgPHBsZEBhbXQudGF5MS5kZWMuY29tPi4KLQotCSogaW5pdC5jIChpbml0aWFsaXplZCk6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGUuCi0JKGJmZF9pbml0KTogRG9uJ3QgYm90aGVyIHNldHRpbmcgaW5pdGlhbGl6ZWQuCi0JKGJmZF9jaGVja19pbml0KTogUmVtb3ZlLgotCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCk6IERvbid0IGNhbGwgYmZkX2NoZWNrX2luaXQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotU2F0IFNlcCAyMyAwMToyMjoyMyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIERvbid0IGNoZWNrIHRoZSBjb3JlIGZpbGUKLQlzaXplIGZvciBmdWxsIGNvcmUgZHVtcHMuIENvcHkgY29yZSBmaWxlIGhlYWRlciB0byBwcml2YXRlIGRhdGEuCi0JKHJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwKLQlyczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6ICBOZXcgZnVuY3Rpb25zIHRvIGV4dHJhY3QKLQl0aGUgZmlsZSBuYW1lIGFuZCB0ZXJtaW5hdGluZyBzaWduYWwgZnJvbSB0aGUgY29yZSBmaWxlLgotCSogY29mZi1yczYwMDAuYzogIFVzZSB0aGVtLgotCi1GcmkgU2VwIDIyIDE3OjQ0OjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUNoYW5nZSBhcmNoIGluZm8gdG8gYmUgY29uc3QsIGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZS4KLQkqIGFyY2h1cmVzLmM6IFJlaW5kZW50IG1hbnkgZnVuY3Rpb25zLiAgQ2hhbmdlIENPTlNUIHRvIGNvbnN0LgotCShiZmRfYXJjaF9pbmZvX3R5cGUpOiBNYWtlIGFyY2hfbmFtZSBjb25zdC4gIFJlbW92ZSBkaXNhc3NlbWJsZTsKLQlub3RoaW5nIHNldCBpdCBhbnlob3cuICBNYWtlIG5leHQgY29uc3QuCi0JKGJmZF9hcmNoX2luZm9fbGlzdCk6IFJlbW92ZS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBSZW5hbWUgZnJvbSBhcmNodXJlc19pbml0X3RhYmxlLiAgQ2hhbmdlIGZyb20KLQlhIHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGEgdGFibGUgb2YgYmZkX2FyY2hfaW5mb190eXBlCi0Jc3RydWN0dXJlIGFkZHJlc3Nlcy4KLQkoYmZkX3NjYW5fYXJjaCk6IFJld3JpdGUgYWNjb3JkaW5nbHkuICBSZXR1cm4gYSBjb25zdCBwb2ludGVyLgotCShiZmRfbG9va3VwX2FyY2gpOiBMaWtld2lzZS4KLQkoYmZkX3NldF9hcmNoX2luZm8pOiBSZXdyaXRlIGFjY29yZGluZ2x5LiAgQ2hhbmdlIGFyZ3VtZW50IHRvIGJlIGEKLQljb25zdCBwb2ludGVyLgotCShiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCk6IE1ha2UgY29uc3QuCi0JKGJmZF9hcmNoX2luaXQsIGJmZF9hcmNoX2xpbmtpbik6IFJlbW92ZS4KLQkoYmZkX2dldF9hcmNoX2luZm8pOiBSZXR1cm4gYSBjb25zdCBwb2ludGVyLgotCSogaW5pdC5jIChiZmRfaW5pdCk6IERvbid0IGNhbGwgYmZkX2FyY2hfaW5pdC4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IE1ha2UgYXJjaF9pbmZvIGNvbnN0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IFB1dCAmIGJlZm9yZSBldmVyeXRoaW5nIGluICRzZWxhcmNocy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNwdS0qLmM6IENoYW5nZSBiZmRfKl9hcmNoIGZyb20gYSBmdW5jdGlvbiB3aGljaCBjYWxscwotCWJmZF9hcmNoX2xpbmtpbiB0byBhIGNvbnN0IHN0cnVjdHVyZS4KLQkqIGllZWUuYyAoaWVlZV9vYmplY3RfcCk6IE1ha2UgYXJjaCBjb25zdC4KLQotRnJpIFNlcCAyMiAxNjoyMzoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3R5cGUpOiBBZGQgcmVsb2NhdGlvbnMgdG8gc3VwcG9ydCBhbGwgb2YKLQlQb3dlclBDIFYuNC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGYzMi1wcGMuYyAocmVsb2NfdHlwZSk6IFVwZGF0ZSBuYW1lcyB0byBtYXRjaCBjdXJyZW50IGRyYWZ0LgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IE1hcmsgMTQgYml0IHJlbG9jcyBhcyBzaG9ydCBzaXplZCBhbmQgUEMKLQlyZWxhdGl2ZS4gIFVwZGF0ZSBuYW1lcyB0byBjdXJyZW50IFYuNCBkcmFmdC4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBzdXBwb3J0IGZvciBtb3JlIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgcmVsb2NhdGlvbnMgdG8gbWF0Y2ggZHJhZnQuCi0KLVRodSBTZXAgMjEgMjE6NTM6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBBbGxvdyBtb2R1bGVzCi0JY29tcGlsZWQgd2l0aCAtbXJlbG9jYXRhYmxlLWxpYiB0byBiZSBsaW5rZWQgd2l0aCBlaXRoZXIgbm9ybWFsCi0JbW9kdWxlcyBvciAtbXJlbG9jYXRhYmxlIG1vZHVsZXMuCi0KLVdlZCBTZXAgMjAgMTI6MDM6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENsZWFyIHRoZSB2c3RhbXAgZmllbGQKLQlpbiB0aGUgYS5vdXQgaGVhZGVyLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IERvbid0IHNldCByX2V4dGVybiBmb3IKLQlhIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIGV2ZW4gaWYgaXQncyBub3QgYSBzZWN0aW9uLgotCi1UdWUgU2VwIDE5IDE3OjAyOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVtb3ZlIHVudXNlZCBhbGlnbl9wb3dlcl9taW4gZmllbGQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBBbGwgYmFja2VuZHM6IFJlbW92ZSBpbml0aWFsaXphdGlvbiBvZiBhbGlnbl9wb3dlcl9taW4uCi0KLVR1ZSBTZXAgMTkgMTQ6MDI6MjEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEdldCBzaXplcyBmb3IgQlNTIHJpZ2h0LgotCi1Nb24gU2VwIDE4IDE0OjM1OjAxIDE5OTUgIEFybmUgSC4gSnV1bCAgPGFybmVqQHB2di51bml0Lm5vPgotCi0JKiBjb25maWcuYmZkIChtaXBzLWRlYy1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLWRlYy1uZXRic2QqKTogTmV3IGhvc3QuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgbmF0aXZlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgU2VwIDE1IDEwOjI0OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU1ha2UgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIgbWVyZ2UgY29tbW9uIHR5cGVzOgotCSogY29mZmxpbmsuYyAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQpOiBEZWZpbmUuCi0JKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlKTogRGVmaW5lLgotCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwKTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgZGVidWdfbWVyZ2UgZmllbGQuCi0JKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBBbGxvY2F0ZSBhbmQgZnJlZSBkZWJ1Z19tZXJnZSB0YWJsZS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IE1lcmdlIGlkZW50aWNhbCBlbnVtLCBzdHJ1Y3QgYW5kIHVuaW9uCi0JdHlwZXMuCi0KLVRodSBTZXAgMTQgMTQ6NTM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQ29udmVydCBpOTYwIENPRkYgdG8gdXNlIENPRkYgYmFja2VuZCBsaW5rZXIuCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogVXNlIGEgY29mZl9zZWN0aW9uX2RhdGEKLQlzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIHN5bWJvbCBiZWluZyB1c2VkLgotCShjb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9pOTYwX2FkanVzdF9zeW1uZHgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspOiBEZWZpbmUuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBjYWxsYmFjayBmdW5jdGlvbgotCV9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rLgotCShiZmRfY29mZl9zdGFydF9maW5hbF9saW5rKTogRGVmaW5lLgotCShjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogQWRkIGNvZmZfc3RhcnRfZmluYWxfbGluay4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IE1ha2UgZ2xvYmFsbHkKLQl2aXNpYmxlLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IENhbGwgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayBpZiB0aGUKLQlmdW5jdGlvbiBjYWxsYmFjayBpcyBub3QgTlVMTC4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCB0ZGF0YSBmaWVsZC4KLQkoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbiAoaWNvZmZfYmlnX3ZlYyk6IEFkZCBjb2ZmbGluay5vLgotCShpY29mZl9saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgMTMgMTc6Mzg6MjMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4taW5mbyk6IFJlbW92ZSBleHRyYW5lb3VzIHRhYiBmcm9tIGxpbmUKLQlmb2xsb3dpbmcgYWN0aW9uLgotCi1XZWQgU2VwIDEzIDEzOjI3OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IEZhaWwgaWYgYSBzZWN0aW9uIHdpdGggbm8KLQljb250ZW50cyBoYXMgcmVsb2NzLgotCi1UaHUgU2VwIDEyIDEyOjQ1OjM0IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogS2VlcCB0aGUKLQlyYXcgc2l6ZSBzYWZlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbWVtYmVyIGlmIGl0J3MgYSByZWxvY2F0YWJsZQotCWZpbGUuCi0JKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZSk6IE5ldyBtZW1iZXIgJ2hhc19yZWxvY19zZWN0aW9uJwotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBDbGVhciBub3QtcmVsb2MgZmxhZwotCWlmIHJlbG9jYXRhYmxlIGZpbGUuIFN3YXAgb3V0IHNhdmVkIHJhdyBzaXplLgotCi1UdWUgU2VwIDEyIDEyOjE0OjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvX21haW50YWluZXJfY2xlYW4pOiBSZW5hbWUgZnJvbSBkb19yZWFsY2xlYW4uCi0JKG1haW50YWluZXItY2xlYW4pOiBSZW5hbWUgZnJvbSByZWFsY2xlYW4sIHBhc3NpbmcKLQltYWludGFpbmVyLWNsZWFuIGRvd24gdG8gc3ViZGlyZWN0b3JpZXMsIGJ1dCBsZWF2ZSByZWFsY2xlYW4gYXMgYQotCXN5bm9ueW0uCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFBhc3Mgc3ltYm9sIG5hbWUgdG8KLQl3YXJuaW5nIGNhbGxiYWNrLgotCi0JKiBkZXAtaW4uc2VkOiBSZW1vdmUgY29uZmlnLmggZnJvbSBnZW5lcmF0ZWQgZGVwZW5kZW5jaWVzLgotCi0JKiBzdW5vcy5jIChzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYik6IE5ldyBzdGF0aWMgZnVuY3Rpb24sCi0JYnJva2VuIG91dCBvZiBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIuCi0JKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IENhbGwgbmV3IGZ1bmN0aW9uCi0Jc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIuCi0JKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBBZGQgdGhyZWUgbmV3IHBhcmFtZXRlcnMuICBSZXR1cm4gdGhlCi0JZHluYW1pYyBzeW1ib2wgdGFibGUgdG8gdGhlIGNhbGxlci4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFBlcm1pdCBhZGRfZHluYW1pY19zeW1ib2xzCi0JY2FsbGJhY2sgdG8gb3ZlcnJpZGUgdGhlIHN5bWJvbHMgYmVpbmcgcmVhZC4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIHRocmVlIG5ldyBwYXJhbWV0ZXJzCi0JdG8gYWRkX2R5bmFtaWNfc3ltYm9scyBjYWxsYmFjay4KLQotCUV4dGVuc2l2ZSBtaW5vciBjaGFuZ2VzIHRvIGF2b2lkIHZhcmlvdXMgZ2NjIHdhcm5pbmdzLiAgQWxzbzoKLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBjb2ZmLWFybS5vLgotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2hfaW5mb190eXBlKTogQ2hhbmdlIG1hY2ggZmllbGQgZnJvbSBsb25nIHRvCi0JdW5zaWduZWQgbG9uZy4KLQkoYmZkX2xvb2t1cF9hcmNoKTogQ2hhbmdlIG1hY2hpbmUgcGFyYW1ldGVyIGZyb20gbG9uZyB0byB1bnNpZ25lZAotCWxvbmcuCi0KLU1vbiBTZXAgMTEgMTA6NTU6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBGaXggQkZEX0FTU0VSVDogaXQncyBPSyB0byBmaW5kCi0JYSBzeW1ib2wgd2l0aCBhIG5vbi16ZXJvIHBsdF9vZmZzZXQuCi0KLUZyaSBTZXAgIDggMTE6NDc6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGFsaWduX2ZpbGVfcG9zaXRpb24pOiBSZW1vdmU7IG5vdCB1c2VkLgotCi0JKiBjb25maWd1cmUuaW46IE9ubHkgY2hlY2sgZm9yIDxzeXMvcHJvY2ZzLmg+IG9uIGEgbmF0aXZlIHN5c3RlbSwKLQlhbmQgbWFrZSBzdXJlIGl0IGRlZmluZXMgcHJzdGF0dXNfdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IFNlcCAgNyAxMjo0ODowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogQ29ycmVjdCBtNjhrIGFib3J0IHRlc3QuCi0KLQkqIGNvbmZpZy5pbjogUmVuYW1lIGZyb20gY29uZmlnLmguaW4uCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiB3aXRoIGNvbmZpZy5oOmNvbmZpZy5pbi4KLQlDaGVjayBmb3IgY29uZmlnLmg6Y29uZmlnLmluIHdoZW4gY3JlYXRpbmcgc3RhbXAtaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gY29uZmlnLmluIHJhdGhlciB0aGFuCi0JY29uZmlnLmguaW4uICBTZXQgQ09ORklHX0hFQURFUlMgdG8gY29uZmlnLmg6Y29uZmlnLmluIHdoZW4KLQljYWxsaW5nIGNvbmZpZy5zdGF0dXMuCi0KLQkqIE1ha2VmaWxlLmluIChkb19kaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmggYW5kIHN0YW1wLWguCi0JKE1ha2VmaWxlKTogSnVzdCByZWJ1aWxkIE1ha2VmaWxlLgotCShjb25maWcuaCwgc3RhbXAtaCk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluOiBDcmVhdGUgc3RhbXAtaCB3aGVuIHJlYnVpbGRpbmcgY29uZmlnLmguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgIDYgMTU6MDA6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUi4gIFN1YnN0aXR1dGUKLQlIT1NUXzY0QklUX0xPTkcuICBDaGVjayB0aGF0IHZhcmlvdXMgaGVhZGVyIGZpbGVzIGV4aXN0LiAgQ2hlY2sKLQl0aGF0IGZjbnRsIGV4aXN0cy4gIENhbGwgQkZEX0JJTkFSWV9GT1BFTi4gIENoZWNrIHdoZXRoZXIgbWFsbG9jCi0JYW5kL29yIGZyZWUgbmVlZCB0byBiZSBkZWNsYXJlZC4gIERvbid0IG1ha2UgYSBsaW5rIHRvIHN5c2RlcC5oLgotCURlZmluZSBUUkFEX0hFQURFUiBmb3IgdmFyaW91cyBob3N0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBEb24ndCBzZXQgbXlfaG9zdC4gIEFkZCBkZWZpbml0aW9ucyB0YWtlbiBmcm9tCi0JaG9zdCBoZWFkZXIgZmlsZXMgZm9yIHZhcmlvdXMgZW50cmllcy4gIFJlbW92ZSBlbnRyaWVzIHdoaWNoIG5vdwotCWRvIG5vdGhpbmcuCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLmluOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2hlYWRlci4KLQkqIHN5c2RlcC5oOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChkb19kaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgc3lzZGVwLmguCi0JKFJFQ09ORklHKTogUmVtb3ZlLgotCShMT0NBTF9IX0RFUFMpOiBOZXcgdmFyaWFibGUuCi0JKCQoQkZEX0xJQlMpKTogVXNlICQoTE9DQUxfSF9ERVBTKSByYXRoZXIgdGhhbiBsaWJiZmQuaCBhbmQKLQkkKFJFQ09ORklHKS4KLQkoJChCRkRfTUFDSElORVMpLCAkKEJGRF9CQUNLRU5EUykpOiBMaWtld2lzZS4KLQkoJChPUFRJT05BTF9CQUNLRU5EUykpOiBMaWtld2lzZS4KLQkoc3RtcC1iZmQuaCk6IEp1c3Qgc3Vic3RpdHV0ZSBmb3IgQkZEX0hPU1RfNjRCSVRfTE9ORywgcmF0aGVyIHRoYW4KLQlsb29raW5nIHRocm91Z2ggc3lzZGVwLmguCi0JKiBiZmQtaW4uaCAoQkZEX0hPU1RfNjRCSVRfTE9ORyk6IERlZmluZTsgc2V0IGJ5IE1ha2VmaWxlLgotCShCRkRfSE9TVF82NF9CSVQpOiBEZWZpbmUgYmFzZWQgb24gQkZEX0hPU1RfNjRCSVRfTE9ORy4KLQkoZnByaW50Zl92bWEsIHNwcmludGZfdm1hKTogTGlrZXdpc2UuCi0JKGludDY0X3R5cGUsIHVpbnQ2NF90eXBlKTogRG9uJ3QgZGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYXJjaHVyZXMuYywgYmZkLmMsIHNyZWMuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKiBlbGZjb3JlLmg6IENoZWNrIEhBVkVfU1lTX1BST0NGU19IIHJhdGhlciB0aGFuIEhBVkVfUFJPQ0ZTLgotCSogbHlueC1jb3JlLmM6IEluY2x1ZGUgc3R1ZmYgZnJvbSBvbGQgaG9zdHMvbHlueC5oLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ2hlY2sgSEFWRV9GTkNUTCBhbmQgZGVmaW5lZCAoRl9HRVRGTCksCi0JcmF0aGVyIHRoYW4gTk9fRkNOVEwuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfbGlzdCk6IENoZWNrIEhPU1RfSFBQQUhQVVggYW5kICEgX19TVERDX18KLQlyYXRoZXIgdGhhbiBOQVRJVkVfSFBQQUhQVVhfQ09NUElMRVIuCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8ZXJybm8uaD4uICBJbmNsdWRlIFRSQURfSEVBREVSIGlmIGl0Ci0JaXMgZGVmaW5lZC4KLQkqIGhvc3RzLyouaDogUmVtb3ZlIGFsbCBoZWFkZXIgZmlsZXMgd2hpY2ggbWVyZWx5IGluY2x1ZGUsCi0JZGVjbGFyZSwgYW5kIGRlZmluZSB0aGluZ3MuICBMZWF2ZSBoZWFkZXIgZmlsZXMgd2hpY2ggZGVmaW5lCi0JaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRyYWQtY29yZS5jLgotCi0JKiBhY2xvY2FsLm00IChCRkRfQklOQVJZX0ZPUEVOKTogRGVmaW5lLgotCShCRkRfQ0NfRk9SX0JVSUxEKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBVc2UgQkZEX0NDX0ZPUl9CVUlMRC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAgNSAxOTozNToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IERvbid0IHRyeSB0byBncmVwIC4uL01ha2VmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvZmYtc3BhcmMuYyAoQ0FMQ19BRERFTkQpOiBEb24ndCBzZXQgdGhlIGFkZGVuZCB0byB0aGUgdmFsdWUgb2YKLQlhIGdsb2JhbCBzeW1ib2wuCi0KLVR1ZSBTZXAgIDUgMTI6NDg6MjYgMTk5NSAgSmFzb24gTW9sZW5kYSAgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBpMzg2cGVfdmUgLT4gaTM4NnBlX3ZlYy4KLQotTW9uIFNlcCAgNCAxNDowMjo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBJbmNvcnBvcmF0ZSBob3N0IE1ha2VmaWxlIGZyYWdtZW50cyBieSBzZXR0aW5nCi0Jc2hlbGwgdmFyaWFibGVzLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1BST0dfQ0MuICBTdWJzdGl0dXRlIENGTEFHUywgSERFRklORVMgYW5kCi0JQVIuICBDYWxsIEFDX1BST0dfSU5TVEFMTC4gIFN1YnN0aXR1dGUgQ0NfRk9SX0JVSUxELCBjaG9vc2luZyBhCi0JdmFsdWUgYmFzZWQgb24gd2hldGhlciB0aGUgY29kZSBpcyBiZWluZyBjb21waWxlZCBieSBhIGNyb3NzCi0JY29tcGlsZXIuICBEb24ndCBzdWJzdGl0dXRlIGhvc3RfbWFrZWZpbGVfZnJhZyBvciBmcmFncy4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlIHRvIGRlZmluZSBsb2NhbCBBQ19QUk9HX0NDLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1BST0dSQU0pOiBTZXQgdG8gQElOU1RBTExfUFJPR1JBTUAuCi0JKElOU1RBTExfREFUQSk6IFNldCB0byBASU5TVEFMTF9EQVRBQC4KLQkoQVIpOiBTZXQgdG8gQEFSQC4KLQkoQ0MpOiBEZWZpbmUgYXMgQENDQC4KLQkoQ0ZMQUdTKTogU2V0IHRvIEBDRkxBR1NALgotCShDQ19GT1JfQlVJTEQpOiBTZXQgdG8gQENDX0ZPUl9CVUlMREAuCi0JKEBob3N0X21ha2VmaWxlX2ZyYWdAKTogUmVtb3ZlLgotCShBTExfQ0ZMQUdTKTogQ2hhbmdlICQoSERFRklORVMpIHRvIEBIREVGSU5FU0AuICBNb3ZlICQoQ0ZMQUdTKQotCWFmdGVyIG90aGVyIG9wdGlvbnMuCi0JKGNvbmZpZy5zdGF0dXMpOiBSZW1vdmUgZGVwZW5kZW5jeSB1cG9uIEBmcmFnc0AuCi0JKiBjb25maWcvKi5taCwgY29uZmlnL1JFQURNRTogUmVtb3ZlLgotCi0JKiBjb25maWcuYmZkOiBSZXdyaXRlIHRvIGluY29ycG9yYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgTWFrZWZpbGUKLQlmcmFnbWVudHMgYnkgc2V0dGluZyBzaGVsbCB2YXJpYWJsZXMsIHJhdGhlciB0aGFuIG1lcmVseSByZXR1cm5pbmcKLQl0aGUgbmFtZSBvZiBhIE1ha2VmaWxlIGZyYWdtZW50LgotCSogY29uZmlndXJlLmluOiBVc2Ugc2hlbGwgdmFyaWFibGVzIHNldCBieSBjb25maWcuYmZkIHJhdGhlciB0aGFuCi0JbG9va2luZyBhdCB0aGUgdGFyZ2V0IE1ha2VmaWxlIGZyYWdtZW50IGZpbGVzLiAgRG9uJ3Qgc3Vic3RpdHV0ZQotCXRhcmdldF9tYWtlZmlsZV9mcmFnLiAgRG8gc3Vic3RpdHV0ZSBUREVGSU5FUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChAdGFyZ2V0X21ha2VmaWxlX2ZyYWdAKTogUmVtb3ZlLgotCShBTExfQ0ZMQUdTKTogQ2hhbmdlICQoVERFRklORVMpIHRvIEBUREVGSU5FU0AuCi0JKiBjb25maWcvKi5tdDogUmVtb3ZlLgotCi1Nb24gU2VwICA0IDAzOjEzOjI4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFB1dCBjaGFuZ2VxdW90ZSBsaW5lcyBhcm91bmQgImlbMzQ1XTg2IiBwYXR0ZXJucwotCXNlY3Rpb24gb2YgY29yZSBmaWxlIHN1cHBvcnQuCi0KLVN1biBTZXAgIDMgMTE6MzE6NTggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUgdG8gdXNlIHRoZQotCWdlbmVyaWMgdmVyc2lvbi4KLQotRnJpIFNlcCAgMSAxNzowODo0MCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogQWRkIEltYWdlQmFzZSB0bwotCWVudHJ5LCB0ZXh0X3N0YXJ0IGFuZCBkYXRhX3N0YXJ0LgotCi1GcmkgU2VwICAxIDE4OjA2OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE9GSUxFUyk6IFJlbW92ZSAkKFRERVBGSUxFUykuCi0JKiBjb25maWcvYXBvbGxvLm10IChUREVQRklMRVMpOiBSZW1vdmUuCi0JKiBjb25maWcvUkVBRE1FOiBVcGRhdGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIHNldCBDT1JFRklMRSBhbmQKLQlDT1JFRkxBRyBiYXNlZCBvbiB0aGUgY2Fub25pY2FsIGhvc3QgbmFtZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQUxMX0NGTEFHUyk6IEFkZCBAQ09SRUZMQUdALgotCShPRklMRVMpOiBSZXBsYWNlICQoSERFUEZJTEVTKSB3aXRoIEBDT1JFRklMRUAuCi0JKiBjb2ZmLXJzNjAwMC5jOiBDaGVjayBBSVhfQ09SRSByYXRoZXIgdGhhbiBIT1NUX0FJWCBmb3IgY29yZSBmaWxlCi0Jc3VwcG9ydCByb3V0aW5lcy4gIENoZWNrIExZTlhfQ09SRSByYXRoZXIgdGhhbiBIT1NUX0xZTlguCi0JKiBseW54LWNvcmUuYzogQ2hlY2sgTFlOWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfTFlOWC4KLQkqIGkzODZseW54LmM6IExpa2V3aXNlLgotCSogbTY4a2x5bnguYzogTGlrZXdpc2UuCi0JKiBzcGFyY2x5bnguYzogTGlrZXdpc2UuCi0JKiByczYwMDAtY29yZS5jOiBDaGVjayBBSVhfQ09SRSByYXRoZXIgdGhhbiBIT1NUX0FJWC4KLQkqICotY29yZS5jOiBDb21tZW50IGNoYW5nZXMuCi0JKiBjb25maWcvZGVjc3RhdGlvbi5taCAoSERFUEZJTEVTKTogUmVtb3ZlLgotCShIREVGSU5FUyk6IFJlbW92ZSAtRFRSQURfQ09SRS4KLQkqIGNvbmZpZy9pcml4My5taCAoUkFOTElCKTogUmVtb3ZlLgotCSogY29uZmlnL2lyaXg0Lm1oIChIREVQRklMRVMsIFJBTkxJQik6IFJlbW92ZS4KLQkoSERFRklORVMpOiBSZW1vdmUgLURJUklYX0NPUkUuCi0JKiBjb25maWcvcmlzY29zLm1oIChSQU5MSUIsIEhERVBGSUxFUyk6IFJlbW92ZS4KLQkoSERFRklORVMpOiBSZW1vdmUgLURUUkFEX0NPUkUuCi0JKiBjb25maWcvbmNyMzAwMC5taCAoQVJfRkxBR1MsIFJBTkxJQik6IFJlbW92ZS4KLQkqIGNvbmZpZy91bHRyYTMubWggKFJBTkxJQik6IFJlbW92ZS4KLQkqIGNvbmZpZy9haXg0Lm1oLCBjb25maWcvYWxwaGFvc2YubWgsIGNvbmZpZy9hbWl4Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvYXBvbGxvLm1oLCBjb25maWcvZGVsdGE2OC5taCwgY29uZmlnL2RlbHRhODgubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9kcHgyLm1oLCBjb25maWcvZXNpeC5taCwgY29uZmlnL2hhcnJpcy5taDogUmVtb3ZlLgotCSogY29uZmlnL2hwMzAwLm1oLCBjb25maWcvaHAzMDBic2QubWgsIGNvbmZpZy9ocHBhYnNkLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaHBwYWhwdXgubWgsIGNvbmZpZy9ocHBhb3NmLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NmFpeC5taCwgY29uZmlnL2kzODZic2QubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2bGludXgubWgsIGNvbmZpZy9pMzg2bWFjaDMubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2c2NvLm1oLCBjb25maWcvaTM4NnYubWgsIGNvbmZpZy9pMzg2djQubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NS5taCwgY29uZmlnL204OGttYWNoMy5taCwgY29uZmlnL21pcHNic2QubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9taXBzbWFjaDMubWgsIGNvbmZpZy9uZXdzLW1pcHMubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9uZXdzLm1oLCBjb25maWcvcGM1MzJtYWNoLm1oLCBjb25maWcvcmlzY2l4Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvcnM2MDAubWgsIGNvbmZpZy9yczYwMDBseW54Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvc29sYXJpczIubWgsIGNvbmZpZy9zdHJhdHVzLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvc3ltbWV0cnkubWgsIGNvbmZpZy9zeXN2NC5taCwgY29uZmlnL3RhaG9lLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvdmF4YnNkLm1oLCBjb25maWcvdmF4dWx0Lm1oLCBjb25maWcvdmF4dWx0Mi5taDogUmVtb3ZlLgotCi1GcmkgU2VwICAxIDE1OjE4OjUwIDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IGNoYW5nZSBhIERUX0lOSVQgb3IKLQlEVF9GSU5JIGVudHJ5IGlmIHRoZSBhcHByb3ByaWF0ZSBzeW1ib2wgaXMgbm90IGluIHRoZSBoYXNoIHRhYmxlLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgY3JlYXRlX3Byb2dyYW1faGVhZGVycwotCWFuZCB3YW50X2hkcl9pbl9zZWcgZmllbGRzLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3dhbnRfaGRyX2luX3NlZyk6IERlZmluZSBpZiBub3QKLQlkZWZpbmVkLgotCShlbGZfYmFja2VuZF9jcmVhdGVfcHJvZ3JhbV9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKGVsZk5OX2JlZCk6IEluaXRpYWxpemUgY3JlYXRlX3Byb2dyYW1faGVhZGVycyBhbmQKLQl3YW50X2hkcl9pbl9zZWcuCi0JKiBlbGYuYyAoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBDYWxsIGNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMKLQliYWNrZW5kIHJvdXRpbmUuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQ2hlY2sgd2FudF9oZHJfaW5fc2VnIGJhY2tlbmQgZmllbGQuICBDYWxsCi0JY3JlYXRlX3Byb2dyYW1faGVhZGVycyBiYWNrZW5kIHJvdXRpbmUuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFsaWduIG5vbiBhbGxvY2F0ZWQKLQlzZWN0aW9ucyB3aGVuIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfcGhkcl9pbik6IE1ha2Ugbm9uIHN0YXRpYy4KLQkoZWxmX3N3YXBfcGhkcl9vdXQpOiBNYWtlIG5vbiBzdGF0aWMuCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX3N3YXBfcGhkcl9pbik6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zd2FwX3BoZHJfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcGhkcl9pbik6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3BoZHJfb3V0KTogRGVjbGFyZS4KLQotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3Bkcik6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIpOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0pOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotRnJpIFNlcCAgMSAxMzoyMDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBGaXggdHlwby4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBIYW5kbGUgaW5kaXJlY3QgYW5kCi0Jd2FybmluZyBzeW1ib2xzLiAgSWYgYW55IHNlY3Rpb24gaXMgbmFtZWQgLmdudS53YXJuaW5nLlhYWCwgdHJlYXQKLQl0aGUgY29udGVudHMgYXMgYSB3YXJuaW5nIHRvIGJlIGlzc3VlZCBpZiB0aGUgc3ltYm9sIFhYWCBpcwotCXJlZmVyZW5jZWQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBGb3IgYW4gaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wsIGp1c3QKLQlvdXRwdXQgdGhlIHN5bWJvbCBpdCBwb2ludHMgdG8uCi0KLQkqIGxpbmtlci5jIChfYmZkX2xpbmtfaGFzaF9uZXdmdW5jKTogRG9uJ3QgYm90aGVyIHRvIHNldCBiZmRfZXJyb3IKLQlpZiBiZmRfaGFzaF9hbGxvY2F0ZSBmYWlscywgc2luY2UgaXQgd2lsbCBhbHJlYWR5IGJlIHNldC4KLQkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IExpa2V3aXNlLgotCShhcmNoaXZlX2hhc2hfbmV3ZnVuYyk6IExpa2V3aXNlLgotCShoYXNoX2VudHJ5X2JmZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUGFzcyBuZXcgYXJndW1lbnRzIHRvIHdhcm5pbmcKLQljYWxsYmFjay4gIEFsbG9jYXRlIGEgbmV3IHdhcm5pbmcgdXNpbmcgdGhlIGhhc2ggdGFibGUgbmV3ZnVuYy4KLQlVc2UgYmZkX2hhc2hfcmVwbGFjZSB0byB1cGRhdGUgdGhlIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLCByYXRoZXIKLQl0aGFuIGFzc3VtaW5nIHdlIGNhbiBjb3B5IHRoZSBmaWVsZHMgd2l0aCBzdHJ1Y3R1cmUgYXNzaWdubWVudC4KLQotCSogaGFzaC5jIChiZmRfaGFzaF9yZXBsYWNlKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9oYXNoX3JlcGxhY2UpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgU2VwICAxIDA4OjEyOjUwIDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgbWlwcyp2cjQzMDAtKi1lbGYqIHRhcmdldC4KLQkqIGNvbmZpZy9taXBzYnZyNDMwMC5tdDogQWRkZWQuCi0KLVRodSBBdWcgMzEgMTY6MDA6NTMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGJmZC1pbi5oIChQRSBTVFVGRik6IERlbGV0ZWQuCi0JKiBiZmQuYyAodGRhdGEtPnBlX29ial9kYXRhKTogTmV3LgotCShiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGNvZmYtaTM4Ni5jLCBjb2ZmLWFybS5jIChjb2ZmXyotcnR5cGVfdG9faG93dG8pOiBHZXQgaW1hZ2UgYmFzZSBmcm9tCi0JbmV3IHBsYWNlLgotCSogbGliY29mZi5oLCBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAocGVfdmFsdWUpOiBEZWxldGUKLQkoY29mZl9ta29iamVjdCwgY29mZl9ta29iamVjdF9ob29rKTogQ29uZGl0aW9uYWxseSBidWlsZC4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMb29rIGluIG5ldyBwbGFjZS4KLQkoYWRkX2RhdGFfZW50cnksIGZpbGxfcGVfaGVhZGVyX2luZm8pOiBEZWxldGVkLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSBQRSBzdHVmZi4KLQkoY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGNvZmZzd2FwLmg6IFJlbW92ZSBQRSBzdHVmZi4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogbGliY29mZi1pbi5oIChwZV9kYXRhX3R5cGUpOiBOZXcuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogdGFyZ2V0cy5jIChfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBwZWljb2RlLmg6IE5ldyBmaWxlLgotCi1UaHUgQXVnIDMxIDExOjQ5OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmg6IEFkZCBleHRlcm4gIkMiIGlmIF9fY3BsdXNwbHVzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgY29udmVydCBhIHJlbG9jCi0JYWdhaW5zdCBhbiBhYnNvbHV0ZSBzeW1ib2wgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLgotCi1UaHUgQXVnIDMxIDA4OjAwOjE0IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0JCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvYyk6IEZpeCBjb21tb24gc2l6ZSBwcm9ibGVtLgotCShpM2NvZmZfb2JqZWN0X3ApOiBEZWxldGUuCi0KLVdlZCBBdWcgMzAgMjA6NDE6MjcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoZGVsZXRlbWVhY29mZl9hcm1fcmVsb2MpOiBEZWxldGVkLgotCShhcm0yNik6IE5vdCBwYXJ0aWFsIGlucGxhY2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0Ci0JZG8gcGFnZSBhbGlnbmluZyBpZiBDT0ZGX1BBR0VfU0laRSBpc24ndCBkZWZpbmVkLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9pbik6IFVwZGF0ZSBpbWFnZSBiYXNlIGNvcnJlY3RseS4KLQotVHVlIEF1ZyAyOSAxMzo1MDoyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6Ci0JQ29tcGlsZSBldmVuIGlmIENPRkZfUEFHRV9TSVpFIGlzbid0IGRlZmluZWQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJhdGVfcmVsb2Nfc2VjdGlvbik6IFdyaXRlCi0JYmFzZSBmaWxlIGluZm8gYXMgcnZhcy4KLQkqIGNvZmYtYXJtLmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWFsIHdpdGggcmVsb2MgMTEuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSAjaWYwZWQgY29kZQotCU9ubHkgcmVtb3ZlIGVtcHR5IHNlY3Rpb25zIGluIFBFIGlubWFnZSBmaWxlcy4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IHJlZ2VuZXJhdGVkLgotCSogY29mZi1hcm0uYyAoYW91dGFybV9zdGRfcmVsbyk6IE5ldyBlbnRyeSBhdCAxMS4KLQkoYXJtX3JlbG9jX3R5cGVfbG9va3VwKSA6IFVuZGVyc3RhbmQgdHlwZSAxMS4KLQkqIGNvZmYtaTM4Ni5jIChob3d0b190YWJsZSk6IGZpeCBuYW1lIG9mIHJ2YSB0eXBlLgotCShjb2ZmLWkzODZfcnR5cGVfdG9faG93dG8pOiBVbmRlcnN0YW5kIFJfSU1BR0VCQVNFIHR5cGUuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IC5lZGF0YSBpcyBkYXRhLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEdldCBwYWdlIHNpemUgcmlnaHQgZm9yIFBFLgotCVBhZ2VzaXplIGluZm8gaXMgb25seSB2YWxpZCBpbiBQRSBpbWFnZSBmaWxlcy4KLQkoZmlsbF9wZV9oZWFkZXJfaW5mbyk6IEZpeCBmaWVsZHMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIGVuZF9vZl9pbWFnZSBjYWxjLgotCShfYmZkX2NvZmZfZ2VuZXJhdGVfcmVsb2Nfc2VjdGlvbik6IFJlbW92ZSBvcnBoYW5lZCBjb21tZW50LgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9pbik6IERvbid0IGFsd2F5cyBhZGQgSU1BR0VfQkFTRS4KLQlTd2FwIGluIFBFIGhlYWRlci4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBTZXR1cCBQRSBmbGFncyBjb3JyZWN0bHkuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfUlZBKTogTmV3IGZpZWxkLgotCi1UaHUgQXVnIDI0IDE3OjQ5OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGluY2x1ZGUgbGluZSBudW1iZXJzIGZvcgotCWEgc2VjdGlvbiBpZiBpdHMgb3V0cHV0IHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzLgotCi1XZWQgQXVnIDIzIDE2OjQ4OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQWRkIHBhcmVudGhlc2VzIHRvIEZJWAotCWV4cHJlc3Npb24gdG8gYXZvaWQgY29tcGlsZXIgYnVnIG9uIEhQLVVYIDkuMDEuCi0KLVdlZCBBdWcgMjMgMDk6NDk6MzkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKHBlX3ZhbHVlKTogVW5hbnNpZnkuCi0KLU1vbiBBdWcgMjEgMTc6NDk6MjggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKGJmZF9saW5rX3N1YnN5c3RlbSk6IFR1cm4gZW51bSBpbnRvICNkZWZpbmVzLgotCShiZmRfbGlua19wZV9pbmZvX2R2YWwpOiBOZXcKLQkoYmZkX2xpbmtfc3RhY2tfaGVhcCk6IFJlbmFtZWQgYW5kIG1hc3NhZ2VkIGludG8gYmZkX2xpbmtfcGVfaW5mby4KLQkqIGJmZC1pbjIuaDogcmVidWlsdC4KLQkqIGJmZC5jIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWxldGVkLgotCSogY29mZmNvZGUuaCAocGVfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbGxfcGVfaGVhZGVyX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIG5ldyBmdW5jdGlvbi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbml0aWFsemUgbGlua19kYXRhIGlmIG5vdCBzZXQuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IFJlbW92ZSBwZSByYW5kb21uZXNzLgotCShkb3Jlc19jb20pOiBVcGRhdGUgaW5mbyBpbiBiZmRfbGlua19wZV9pbmZvX2R2YWwuCi0JKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBVc2UgdGhlIGJmZF9saW5rX3BlX2luZm9fZHZhbC4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBSZW1vdmUgUEUgc3R1ZmYsIGluaXRpYWxpemUKLQljb2ZmX2RhdGEtPmxpbmtfaW5mby4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9bYW91dHxmaWxlaGRyXV9vdXQpOiBVc2UgaW5kaXJlY3QgUEUgcG9pbnRlci4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBVc2UgcmVhbCBpbWFnZWJhc2UuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZGF0YV90eXBlLmxpbmtfaW5mbyk6IE5ldyBmaWVsZC4KLQotTW9uIEF1ZyAyMSAxMToxMDozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChsaW5rX2FjdGlvbik6IElmIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UgZm9sbG93cyBhbgotCXVuZGVmaW5lZCB3ZWFrIHJlZmVyZW5jZSwgY2hhbmdlIHRoZSB0eXBlIHRvIHVuZGVmaW5lZC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IERvbid0IHJlY29yZCBhbgotCXVuZGVmaW5lZCB3ZWFrIHJlZmVyZW5jZSBhcyBkZWZpbmVkLCBpbiBjYXNlIGl0IHR1cm5zIGludG8gYSByZWFsCi0JdW5kZWZpbmVkIHJlZmVyZW5jZSBsYXRlciBpbiB0aGUgc2FtZSBhcmNoaXZlLgotCi1UaHUgQXVnIDE3IDE2OjI5OjA5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9zZWN0aW9uKTogQ2FzdCB2YWx1ZSBmb3IgdXNlZF9ieV9iZmQgZmllbGQKLQl0byBQVFIsIG5vdCBjb2ZmX3NlY3Rpb25fdGRhdGEgcG9pbnRlciwgc2luY2UgUFRSIGlzIHRoZSByZWFsIHR5cGUKLQlvZiB0aGUgZmllbGQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBEaXR0by4KLQotVGh1IEF1ZyAxNyAxNDo0NDoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgbGlua2luZyBTUEFSQyBTdW5PUyBQSUMgY29tcGlsZWQgY29kZS4KLQkqIHN1bm9zLmMgKFNQQVJDX1BMVF9QSUNfV09SRDApOiBEZWZpbmUuCi0JKFNQQVJDX1BMVF9QSUNfV09SRDEsIFNQQVJDX1BMVF9QSUNfV09SRDIpOiBEZWZpbmUuCi0JKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkpOiBBZGQgZ290X29mZnNldCBhbmQgcGx0X29mZnNldAotCWZpZWxkcy4KLQkoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgYW5kCi0JZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGRzLgotCShzdW5vc19saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkoc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2Ygc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scy4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IENhbGwgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgc3Vub3Nfc2Nhbl9yZWxvY3MgYmVmb3JlCi0JY2hlY2tpbmcgd2hldGhlciB3ZSBuZWVkIHRvIHNldCB1cCB0aGUgZHluYW1pYyBsaW5rIGluZm9ybWF0aW9uLgotCURlZmluZSBfX0dMT0JBTF9PRkZTRVRfVEFCTEUgaWYgYW55dGhpbmcgcmVmZXJyZWQgdG8gaXQuCi0JKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IENhbGwgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICBVc2UKLQlwbHRfb2Zmc2V0IGZpZWxkOyBvbmx5IHB1dCBzeW1ib2wgaW4gLnBsdCBpZiBpdCBpcyBub3QgZGVmaW5lZCBieQotCWEgcmVndWxhciBvYmplY3QuCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IExpa2V3aXNlLiAgSGFuZGxlIGJhc2UgcmVsYXRpdmUgcmVsb2NzLgotCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogU3RvcmUgZHlub2JqIGluIGxvY2FsIHZhcmlhYmxlLgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IENoZWNrIHBsdF9vZmZzZXQgcmF0aGVyIHRoYW4KLQljaGVja2luZyB3aGV0aGVyIHN5bWJvbCBpcyBpbiAucGx0IHNlY3Rpb24uICBJZiBzeW1ib2wgaXMgZGVmaW5lZAotCWluIGEgcmVndWxhciBvYmplY3QgZmlsZSwgdXNlIFNQQVJDX1BMVF9QSUNfV09SRFswMTJdLCBhbmQgZG9uJ3QKLQlhZGQgYSBKTVBfVEJMIHJlbG9jLgotCShzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogQWRkIGNvbnRlbnRzIGFuZCByZWxvY2F0aW9ucCBmaWVsZHMuCi0JSWYgcGx0X29mZnNldCBpcyBzZXQsIHJlZGlyZWN0IHJlbG9jYXRpb24gdG8gUExULiAgSWYgdGhpcyBpcyBhCi0JYmFzZSByZWxhdGl2ZSByZWxvYywgcmVkaXJlY3QgcmVsb2NhdGlvbiB0byBHT1QuICBDaGVjawotCWR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkIGZpZWxkIHJhdGhlciB0aGFuIHdoZXRoZXIgZHlub2JqIGlzIHNldC4KLQkoc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluayk6IENoZWNrIGR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkIGZpZWxkCi0JcmF0aGVyIHRoYW4gd2hldGhlciBkeW5vYmogaXMgc2V0LiAgRG9uJ3QgZGllIGlmIC5uZWVkIGFuZCAucnVsZXMKLQlzZWN0aW9ucyB3ZXJlIG5vdCBjcmVhdGVkLgotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogTWFyayBQQzEwLCBQQzIyLCBhbmQgSk1QX1RCTCBlbnRyaWVzCi0JUEMgcmVsYXRpdmUuICBNYXJrIFBDMTAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4gIE1hcmsgUEMyMiBhbmQKLQlKTVBfVEJMIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogSWYgaW5mby0+c2hhcmVkIGlzIHNldCwgc2V0IERZTkFNSUMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IENhbGwgY2hlY2tfZHluYW1pY19yZWxvYyBmb3IgYWxsCi0JcmVsb2NzLiAgUGFzcyBjb250ZW50cyBhbmQgJnJlbG9jYXRpb24uICBEb24ndCB3YXJuIGFib3V0IGFuCi0JdW5kZWZpbmVkIHN5bWJvbCB1bnRpbCBjaGVja19keW5hbWljX3JlbG9jIGhhcyBiZWVuIGNhbGxlZC4gIERvbid0Ci0Jd2FybiBhYm91dCBhbiB1bmRlZmluZWQgc3ltYm9sIGZvciBhIGJhc2UgcmVsYXRpdmUgcmVsb2MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLiAgRm9yIGEgYmFzZSByZWxhdGl2ZQotCXJlbG9jLCBhbHdheXMgdHJlYXQgcl9pbmRleCBhcyBhbiBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCBjb250ZW50cyBhbmQKLQlyZWxvY2F0aW9uIGFyZ3VtZW50IHRvIGNoZWNrX2R5bmFtaWNfcmVsb2MgZW50cnkgcG9pbnQuCi0JKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBsb2NhbF9nb3Rfb2Zmc2V0cyBmaWVsZC4KLQotV2VkIEF1ZyAxNiAwMTowMzowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRml4IGJ1ZyBpbiBsYXN0IGNoYW5nZS4KLQotTW9uIEF1ZyAxNCAxMTozOToyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogSGFuZGxlIGEgbWFjaGluZSBvZgotCWJmZF9tYWNoX3NwYXJjIG9yIGJmZF9tYWNoX3NwYXJjNjQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgYSBzeW1ib2wgaXMgYSB3ZWFrCi0JZGVmaW5pdGlvbiwgYWRkIGl0IHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZiBhbnkgZHluYW1pYwotCW9iamVjdCBtZW50aW9ucyBpdC4gIElmIHdlIGRvIGFkZCBpdCwgbWFrZSBzdXJlIHdlIGFkZCB0aGUKLQljb3JyZXNwb25kaW5nIHJlYWwgc3ltYm9sLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQWRqdXN0IGEgd2VhayBkZWZpbmVkIHN5bWJvbCB3aGljaCB3ZQotCXB1dCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGV2ZW4gaWYgbm8gcmVndWxhciBvYmplY3QgcmVmZXJzCi0JdG8gaXQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBkb24ndCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEKLQlsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENoYW5nZSBhc3NlcnRpb24KLQl0byBhY2NlcHQgc3ltYm9sIHdpdGggd2Vha2RlZiBzZXQuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGliYXJ5LCBkb24ndCBjb3B5IG92ZXIgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgbG9jYWwKLQlzeW1ib2wuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVN1biBBdWcgMTMgMDA6NDA6NTggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChSX0hQUEFfQkVHSU5fQlJUQUIpOiBEZWZpbmUuCi0JKFJfSFBQQV9FTkRfQlJUQUIpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfQkVHSU5fQlJUQUIgYW5kIFJfRU5EX0JSVEFCLgotCi1UaHUgQXVnIDEwIDE1OjUzOjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IFN3YXAgdGhlIGFycmF5IGRpbWVuc2lvbnMKLQl3aGVuZXZlciB4X2ZjbmFyeSBpcyBub3QgYmVpbmcgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2UsIHJhdGhlcgotCXRoYW4gb25seSBmb3IgYW4gYXJyYXkuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgIDggMTY6MzQ6NTcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBtb3N0Ci0Jb2Ygc3BlY2lhbCBjYXNlIHN0dWZmIGZvciBQRS4gIE5vdyBoYW5kbGVkIGJ5IHJlbG9jcy4KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBTcGVjaWFsIGNhc2Ugb2YgUEUgdHlwZSA3cy4KLQkoaG93dG9fdGFibGUpOiBUeXBlIDcgaXMgZGlyMzItcnZhLgotCi1UdWUgQXVnICA4IDEwOjE1OjQzIDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIGFpeDQgZXhwbGljaXRseS4KLQkqIHJzNjAwMC1jb3JlLmMgKENPUkVfREFUQV9TSVpFX0ZJRUxEKTogTmV3IG1hY3JvIHRvIGdldCBhIHRoZSBzaXplCi0Jb2YgYSBjb3JlIGR1bXAncyBkYXRhIHNlY3Rpb24uICBQcm92aWRlIGFsdGVybmF0ZSBkZWZpbml0aW9uIGZvciBhaXg0LgotCShTQVZFX0ZJRUxEKTogU2ltaWxhcmx5IGZvciBzYXZlIHN0YXRlIGZpZWxkIChyZWdpc3RlciBpbmZvKS4KLQkoU1RBQ0tfRU5EX0FERFIpOiBQcm92aWRlIGRlZmluaXRpb24gc3VpdGFibGUgZm9yIGFpeDQuCi0JKiBjb25maWcve2FpeDQubWgsYWl4NC5tdH06IE5ldyBjb25maWd1cmF0aW9uIGZpbGVzLgotCSogaG9zdHMvYWl4NC5oOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAgNyAyMzowMzoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IENhc3QgaW5pdGlhbGl6YXRpb25zCi0JdG8gYXZvaWQgd2FybmluZ3MuCi0KLU1vbiBBdWcgIDcgMTQ6NTE6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fZGVjb2RlX3N5bWNsYXNzKTogSGFuZGxlIGFic29sdXRlIHN5bWJvbHMgYnkgY2hlY2tpbmcKLQl0aGUgU09NIHR5cGUgKHNpbmNlIHRoZXkgd2lsbCByYXJlbHkgaWYgZXZlciBiZSBpbiB0aGUgYWJzb2x1dGUKLQlzZWN0aW9uKS4KLQotV2VkIEF1ZyAgNiAwOToxMjo1MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyYywgYmZkX21hY2hfc3BhcmM2NCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBjcHUtc3BhcmMuYyAoc3BhcmNfYXJjaF9pbmZvKTogUmVuYW1lZCBmcm9tIGFyY2hfaW5mb19zdHJ1Y3QuCi0JKHNwYXJjNjRfYXJjaF9pbmZvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYmZkX3NwYXJjX2FyY2gpOiBMaW5rIGluIHNwYXJjNjRfYXJjaF9pbmZvLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfeHh4KTogUmVuYW1lZCBmcm9tIGVsZjY0X3h4eC4KLQkoc3BhcmM2NF9lbGZfb2JqZWN0X3ApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IERlZmluZS4KLQkqIGNvbmZpZy9zcGFyYzY0LWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgYmZkX2VsZjMyX3NwYXJjX3ZlYy4KLQotU2F0IEF1ZyAgNSAwMDowNDowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tIChzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogUmV0dXJuIC0xIG9uIGVycm9yLiAgQ29tcHV0ZQotCXJldHVybiB2YWx1ZSB3aXRoIHNpemVvZiAoYXJlbGVudCAqKSwgbm90IHNpemVvZiAoYXJlbGVudCkuCi0KLVdlZCBBdWcgIDIgMTI6MzI6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSWYgdGhlIHNlY3Rpb24gcG9pbnRlZCB0byBieSB0aGUKLQlzaF9saW5rIGZpZWxkIG9mIGEgcmVsb2Mgc2VjdGlvbiBpcyBub3QgYSBzeW1ib2wgdGFibGUsIGFuZCB0aGUKLQlmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIHN5bWJvbCB0YWJsZSwgY2xvYmJlciB0aGUgc2hfbGluayBmaWVsZCBvZgotCXRoZSByZWxvYyBzZWN0aW9uIHRvIHBvaW50IHRvIHRoZSBzeW1ib2wgdGFibGUuCi0KLVR1ZSBBdWcgIDEgMTA6MDk6MDEgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoaG93dG8gcmVsb2MgQVJNMjYpOiBDaGFuZ2Ugc2l6ZSBmcm9tIDMgdG8gMi4KLQkoaG93dG8gcmVsb2MgQVJNMjZEKTogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMjQgMTQ6MTc6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogVXNlIHRoZSBsaW5lIGp1c3QgYmVmb3JlCi0JdGhlIG9mZnNldCwgbm90IHRoZSBvbmUganVzdCBhZnRlci4gIEJyZWFrIG91dCBvZiB0aGUgbG9vcCBhZnRlcgotCWZpbmRpbmcgYSBmdW5jdGlvbiBwYXN0IHRoZSBvZmZzZXQsIG5vdCBtZXJlbHkgd2hlbiBmaW5kaW5nIGEKLQlmdW5jdGlvbiB3aXRoIGEgbGluZSBkZWZpbmVkLgotCi0JKiBlY29mZmxpbmsuYyAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IFdoZW4gaGFuZGxpbmcgc3RhYnM6Ci0JY29ycmVjdCBzZXR0aW5nIG9mIHN5bV9wdHJfZW5kIHRvIGNvbnNpZGVyIHN5bWJvbHMgc2tpcHBlZCB3aGVuCi0Jc2V0dGluZyBzeW1fcHRyOyBkb24ndCBsZWF2ZSBsb29wIGVhcmx5IHVubGVzcyBhbiBOX0ZVTiBpcyBmb3VuZAotCXdpdGggYSBsYXJnZXIgdmFsdWUuCi0KLQkqIGNvZmYtc2guYyAoc2hfY29mZl9ob3d0b3MpOiBNYXJrIFJfU0hfUENESVNQOEJZMiBhbmQgUl9TSF9QQ0RJU1AKLQlhcyBQQyByZWxhdGl2ZS4gIERlc2NyaWJlIFJfU0hfSU1NMTYuICBBZGQgZW50cmllcyBmb3IKLQlSX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDMyLCBSX1NIX1VTRVMsIFJfU0hfQ09VTlQsIGFuZAotCVJfU0hfQUxJR04uCi0JKFNXQVBfSU5fUkVMT0NfT0ZGU0VUKTogRGVmaW5lLgotCShTV0FQX09VVF9SRUxPQ19PRkZTRVQpOiBEZWZpbmUuCi0JKENBTENfQURERU5EKTogRGVmaW5lLgotCShzaF9yZWxvYyk6IENoYW5nZSBzeW1fdmFsdWUgYW5kIGFkZHIgdG8gdHlwZSBiZmRfdm1hLiAgU2tpcCByZWxvYwotCXR5cGVzIG90aGVyIHRoYW4gUl9TSF9JTU0zMiBhbmQgUl9TSF9QQ0RJU1Agb24gYW4gZXh0ZXJuYWwgc3ltYm9sLgotCShjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCi0JKHNoX3JlbGF4X3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaF9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfU0hfUENESVNQIG9uIGFuIGV4dGVybmFsIHN5bWJvbC4KLQkoc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2FsbAotCV9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scywgbm90IGNvZmZfbGlua19nZXRfc3ltYm9scy4gIENhbGwKLQlfYmZkX2NvZmZfZnJlZV9zeW1ib2xzLCBub3QgY29mZl9saW5rX2ZyZWVfc3ltYm9scy4gIENhbGwKLQlfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUsIG5vdCBjb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLgotCShjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2dldF9zeW1ib2xzKTogTW92ZSB0byBjb2ZmZ2VuLmMuCi0JKGNvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2ZyZWVfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IFVzZSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogVXNlIGNhY2hlZCBzZWN0aW9uIGNvbnRlbnRzIGlmIGF2YWlsYWJsZS4KLQlVc2UgX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBjYWxsIGJmZF9zZWVrLgotCShjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBPbmx5IGRlZmluZSBpZiBub3QKLQlhbHJlYWR5IGRlZmluZWQuCi0JKGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoYnVpbGRfc3RyaW5nX3RhYmxlKTogUmVtb3ZlLgotCShfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZyb20gb2xkCi0JY29mZl9saW5rX2dldF9zeW1ib2xzIGluIGNvZmZsaW5rLmMuCi0JKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbSBvbGQKLQljb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIGluIGNvZmZsaW5rLmMuCi0JKF9iZmRfY29mZl9mcmVlX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZybW8gb2xkCi0JY29mZl9saW5rX2ZyZWVfc3ltYm9scyBpbiBjb2ZmbGluay5jLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFVzZSBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMKLQlyYXRoZXIgdGhhbiByZWFkaW5nIHRoZSBzeW1ib2xzIGRpcmVjdGx5LiAgVG8gZnJlZSB0aGVtLCBjYWxsCi0JX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scy4gIFVzZSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgcmF0aGVyCi0JdGhhbiBidWlsZF9zdHJpbmdfdGFibGUuCi0JKiBsaWJjb2ZmLWluLmggKG9ial9jb2ZmX2tlZXBfc3ltcyk6IERlZmluZS4KLQkob2JqX2NvZmZfa2VlcF9zdHJpbmdzKTogRGVmaW5lLgotCShjb2ZmX2RhdGFfdHlwZSk6IEFkZCBmaWVsZHMga2VlcF9zeW1zIGFuZCBrZWVwX3N0cmluZ3MuCi0JKGNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShjb2ZmX3NlY3Rpb25fZGF0YSk6IERlZmluZS4KLQkoX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLUZyaSBKdWwgMjEgMjI6MzI6NTQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEFkZCBzdXBwb3J0IGZvciBSX1BQQ19TREFSRUwKLQlyZWxvY2F0aW9uLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKHBwY19lbGZfZ290MTZfaW5uZXIpOiBEaXR0by4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLVRodSBKdWwgMjAgMTk6MTk6MDYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBBZGQgbmV3IChpZ25vcmVkKQotCWFyZ3VtZW50LgotCSogZWxmMzItaHBwYS5oOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotVGh1IEp1bCAyMCAxOTowMTowNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChzZXRfYW91dF9zZWN0aW9uX2RhdGEpOiBOZXcgbWFjcm8uCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX3JlbG9jcyk6IFVzZSBpdC4KLQotCSogYW91dC1uczMyay5jIChNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVbmRlZiBLRUVQSVQgYmVmb3JlCi0JZGVmaW5pbmcgaXQuCi0KLVRodSBKdWwgMjAgMTM6NDg6MDAgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGhvc3RzL2kzODZ2NC5oIChnZXRnaWQsIGdldHVpZCk6ICBDaGFuZ2UgcHJvdG90eXBlcyB0byBiZQotCWNvbXBhdGlibGUgd2l0aCBVbml4d2FyZSAxLnggYW5kIFVuaXh3YXJlIDIueCwgYW5kIHByb2JhYmx5IG90aGVyCi0JaTM4NiBzdnI0IHZlcnNpb25zIGFzIHdlbGwuCi0KLVRodSBKdWwgMjAgMTM6NDE6MjEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBTaW5jZSBhcm1wZSBhbmQgYXJtcGVpIGhhdmUgYmVlbgotCXNwbGl0IGludG8gYmlnLSBhbmQgbGl0dGxlLWVuZGlhbiB2YXJpYW50cywgbGlzdCBhbGwgb2YgdGhlbSwKLQlpbnN0ZWFkIG9mIHRoZSBub3ctbm9uZXhpc3RhbnQgYXJtcGVbaV1fdmVjLgotCi1UaHUgSnVsIDIwIDAwOjA2OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IFNldCBsbWEgYmFzZWQgb24gcF9wYWRkci4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2hfYWRkciBiYXNlZCBvbiBsbWEsIG5vdCB2bWEuCi0KLVdlZCBKdWwgMTkgMTU6NTI6MDEgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtcGVfdmVjLCBhcm1wZWlfdmVjKTogQWRkIGJpLWVuZGlhbiBzdXBwb3J0LgotCSogY29uZmlndXJlOiAicmVnZW5lcmF0ZWQiLgotCSogcGUtYXJtLmMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfQklHX1NZTSk6IFJlcGxhY2VzIFRBUkdFVF9TWU0uCi0JKFRBUkdFVF9MSVRUTEVfTkFNRSwgVEFSR0VUX0JJR19OQU1FKTogUmVwbGFjZXMgVEFSR0VUX05BTUUuCi0JKiBwZWktYXJtLmMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfQklHX1NZTSk6IFJlcGxhY2VzIFRBUkdFVF9TWU0uCi0JKFRBUkdFVF9MSVRUTEVfTkFNRSwgVEFSR0VUX0JJR19OQU1FKTogUmVwbGFjZXMgVEFSR0VUX05BTUUuCi0JKiB0YXJnZXRzLmMgKGFybXBlX3ZlYywgYXJtcGVpX3ZlYyk6IERlbGV0ZWQuCi0JKGFybXBlX2xpdHRsZV92ZWMsIGFybXBlX2JpZ192ZWMsIGFybXBlaV9saXR0bGVfdmVjLCBhcm1wZWlfYmlnX3ZlYyk6Ci0JQWRkZWQuCi0JKiBjb25maWcvYXJtLXBlLm10IChERUZBVUxUX1ZFQ1RPUik6IERlZmF1bHQgaXMgYXJtcGVfbGl0dGxlX3ZlYy4KLQkoU0VMRUNUX1ZFQ1MpOiBBZGQgYmktZW5kaWFuIHN1cHBvcnQuCi0KLVdlZCBKdWwgMTkgMTA6NDc6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmM6IENsZWFuIHVwIGFuZCBjb21tZW50LgotCShyX2ltbTMyKTogUmVtb3ZlLgotCShzaF9jb2ZmX2hvd3Rvcyk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKFNIX0NPRkZfSE9XVE9fQ09VTlQpOiBEZWZpbmUuCi0JKGdldF9zeW1ib2xfdmFsdWUpOiBNYWtlIHJlbG9jYXRpb24gYmZkX3ZtYSByYXRoZXIgdGhhbiBsb25nLgotCShSVFlQRTJIT1dUTyk6IFJld3JpdGUgdG8gdXNlIHNoX2NvZmZfaG93dG9zLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUgdG8gc2hfcmVsb2NhdGVfc2VjdGlvbi4KLQkoc2hfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVNhdCBKdWwgMTUgMDE6MDI6NTMgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaG9zdDogIEFkZCBzdXBwb3J0IGZvciBnZW5lcmljIG02OGsgU1ZSNCBob3N0LgotCi1GcmkgSnVsIDE0IDEzOjEzOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoS0VFUElUKTogQ2hhbmdlIGRlZmluaXRpb24gdG8gdWRhdGEuaS4KLQkoS0VFUElUVFlQRSk6IFJlbW92ZS4KLQkoTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKSk6IEFkZCBjYXNlcyB0byB0aGUKLQlleHRlbmRlZCByZWxvYyB0eXBlIHN3aXRjaDogU1BBUkNfR09UMTAsIFNQQVJDX0dPVDEzLCBTUEFSQ19HT1QyMiwKLQlTUEFSQ19QQzEwLCBTUEFSQ19QQzIyLCBTUEFSQ19XUExUMzAuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogRG9uJ3QgYm90aGVyIHRvIHVzZSBzdG9pIHdoZW4KLQlyZXRyaWV2aW5nIEtFRVBJVCB2YWx1ZS4KLQkoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkpOiBMaWtld2lzZS4gIEFsc28sIG9ubHkgYWRkIGluCi0Jb3V0cHV0IHNlY3Rpb24gVk1BIGZvciBzZWN0aW9uIHN5bWJvbHMsIGFuZCBjaGVjayBCU0ZfU0VDVElPTl9TWU0KLQl0byBjb250cm9sIHdoZXRoZXIgdG8gc2V0IHJfZXh0ZXJuIHRvIDEuCi0KLQkqIHN5bXMuYzogRml4IGNvbW1lbnRzIHNvIHRoYXQgYG1ha2UgaW5mbycgd29ya3MuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBTZXQgU0VDX0hBU19DT05URU5UUwotCWluIC5tZGVidWcgc2VjdGlvbiwgaW4gY2FzZSBiYWNrZW5kIGxpbmtlciBoYXMgY2xlYXJlZCBpdC4KLQotRnJpIEp1bCAxNCAxMTo1ODozNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZHIxNl9oYV9pbm5lcik6IFJld3JpdGUgdG8gdGFrZSBqdXN0IG9uZQotCWFyZ3VtZW50LCB0aGUgZmluYWwgcmVsb2NhdGVkIGFkZHJlc3MuCi0JKHBwY19lbGZfYWRkcjE2X2hhX2lubmVyKTogQWRqdXN0IHBwY19lbGZfYWRkcjE2X2hhX2lubmVyIGNhbGxlci4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLVRodSBKdWwgMTMgMTc6MjI6MDMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IENob29zZSBhIHJlYXNvbmFibGUgZmllbGQKLQlzZWxlY3RvciByZWxvY2F0aW9uIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4KLQotVGh1IEp1bCAxMyAxMDozMzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBDYXN0IGFyZ3VtZW50IHRvIHNpemVfdAotCWZvciBtYWxsb2MuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UsIGZvciBtZW1tb3ZlLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIGNvZmZsaW5rLmMgKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSk6IExpa2V3aXNlLgotCShlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UsIGZvciBtZW1jcHkgYW5kIG1hbGxvYy4KLQkoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX2FsaWduX2RlYnVnKTogTGlrZXdpc2UsIGZvciBtZW1zZXQuCi0JKGVjb2ZmX3dyaXRlX3N5bWhkcik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBMaWtld2lzZS4KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IExpa2V3aXNlLCBmb3IKLQlxc29ydC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlLgotCSogZWxmY29yZS5oIChlbGZfY29yZWZpbGVfbm90ZSk6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfcmVhZF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBMaWtld2lzZSwgZm9yIG1lbXNldC4KLQkqIGkzODZsaW51eC5jIChiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBpZWVlLmMgKGRvX3dpdGhfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IExpa2V3aXNlLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c19zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLCBmb3IgbWVtY3B5LgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsCi0JZm9yIG1hbGxvYy4KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvciBtZW1jcHkuCi0JKiBzcmVjLmMgKHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLCBmb3IKLQlyZWFsbG9jIGFuZCBtZW1zZXQuCi0JKHN1bm9zX3NjYW5fcmVsb2NzKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZSwgZm9yIHJlYWxsb2MuCi0JKiBzeW1zLmMgKF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiB2ZXJzYWRvcy5jICh2ZXJzYWRvc19nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLCBmb3IKLQltZW1jcHkuCi0KLQkqIGxpYmJmZC5jIChyZWFsX3JlYWQpOiBBZGQgcHJvdG90eXBlLiAgQ2hhbmdlIGFyZ3VtZW50IHR5cGVzIGZyb20KLQlpbnQgdG8gc2l6ZV90LgotCShiZmRfcmVhZCk6IENhc3QgcmVhbF9yZWFkIGFyZ3VtZW50IHRvIHNpemVfdCwgbm90IGludC4KLQkoYmZkX3dyaXRlKTogQ2FzdCBmd3JpdGUgYXJndW1lbnQgdG8gc2l6ZV90LCBub3QgaW50LgotCi0JKiBlbGY2NC1nZW4uYyAoZWxmX2luZm9fdG9faG93dG8pOiBGaXggZGVmaW5pdGlvbiBmb3IgcmVjZW50IGVsZi5jCi0JY2hhbmdlcy4KLQotCSogY29uZmlndXJlLmluOiBGaXggdHlwbzogY2hhbmdlIHskZW5hYmxldmFsfSB0byAke2VuYWJsZXZhbH0uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGZsaW5rLm8uCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBmaWVsZHMgX3JlYWRfbWluaXN5bWJvbHMgYW5kCi0JX21pbmlzeW1ib2xfdG9fc3ltYm9sLgotCShCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKTogQWRkIF9yZWFkX21pbmlzeW1ib2xzIGFuZAotCV9taW5pc3ltYm9sX3RvX3N5bWJvbC4KLQkoYmZkX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCi0JKGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlZmluZS4KLQkqIHN5bXMuYyAoX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCi0JKF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlZmluZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzKTogRGVmaW5lLgotCShfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMpOiBEZWNsYXJlLgotCShfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oIChNSU5JU1lNX1RIUkVTSE9MRCk6IERlZmluZS4KLQkoTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpKTogTmV3IGZ1bmN0aW9uLgotCShOQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpKTogRGVjbGFyZS4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCi0JKE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCSogQWxsIHRhcmdldHM6IERlZmluZSByZWFkX21pbmlzeW1ib2xzIGFuZCBtaW5pc3ltYm9sX3RvX3N5bWJvbC4KLQotV2VkIEp1bCAxMiAxNzo1NTo1NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tCi0JYmZkX2FsbG9jLgotCi0JKiBlbGZjb2RlLmggKHNpemVfaW5mbyk6IERvbid0IHVzZSAiJiIgYmVmb3JlIGZ1bmN0aW9uIG5hbWVzLgotCi1XZWQgSnVsIDEyIDAwOjE2OjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IFVzZSB1bnNpZ25lZCwgbm90IHVuc2lnbmVkIGNoYXIsCi0JZm9yIGJpdGZpZWxkcy4KLQotVHVlIEp1bCAxMSAxNToxOTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJbiBjYXNlIFNIVF9SRUxbQV0sIG9ubHkgZ2V0IHRoZQotICAgICAgICBCRkQgc2VjdGlvbiBmb3IgdGhlIHNoX2xpbmsgc2VjdGlvbiBpZiBpdCBpcyBhIFNZTVRBQiBzZWN0aW9uLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykpOiBEb24ndCBib3RoZXIgdG8gY2hlY2sKLQl0aGF0IGFyY2hpdmVzIGhvbGQgYS5vdXQgb2JqZWN0cy4KLQkqIGNmLWkzODZseW54LmMgKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKGx5bnhfbGlua19hZGRfc3ltYm9scyk6IFJlbW92ZS4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKGx5bnhfbGlua19hZGRfc3ltYm9scyk6IFJlbW92ZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIHRoYXQKLQlhcmNoaXZlcyBob2xkIEVMRiBvYmplY3RzLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IElmIHRoZSBhcmNoaXZlIGhhcyBhIG1hcCwgYW5kCi0JdGhlIHRhcmdldCB3YXMgZGVmYXVsdGVkLCBidXQgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgYXJjaGl2ZSBjYW4KLQlub3QgYmUgbWF0Y2hlZCB3aXRoIHRoYXQgdGFyZ2V0LCB0aGVuIHJldHVybiBhIGJhZCBmb3JtYXQgZXJyb3IuCi0KLQkqIGVsZjY0LXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IFNldCBob3d0byBmb3IgV0RJU1AxNiB0bwotCWVsZjY0X3dkaXNwMTZfcmVsb2MuCi0JKGVsZjY0X3dkaXNwMTZfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGY2NF9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogQ2hhbmdlIHR5cGUgb2YgbGFzdCBhcmd1bWVudCB0bwotCXN3YXBfc3ltYm9sX291dCBmcm9tIGNoYXIgKiB0byBQVFIuCi0JKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfc3ltYm9sX291dCk6IENoYW5nZSB0eXBlIG9mIGNkc3QgZnJvbSBjaGFyICoKLQl0byBQVFIuCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IENhc3QgdG8gUFRSLCBub3QgY2hhciAqLCB3aGVuIGNhbGxpbmcKLQlzd2FwX3N5bWJvbF9vdXQgcm91dGluZS4KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X3N5bSk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi1UdWUgSnVsIDExIDEyOjI5OjQ5IDE5OTUgIFJpY2sgU2xhZGtleSAgPGpyc0B3b3JsZC5zdGQuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBIYW5kbGUgdGhlIHNpbXBsZSBjYXNlIHdoZXJlCi0JdGhlcmUgaXMgbm8gZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi1Nb24gSnVsIDEwIDExOjQ1OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtYWtlZmlsZS5kb3MgKE9CSlMpOiBBZGQgYmluYXJ5Lm8gYW5kIHRla2hleC5vLiAgRnJvbSBESgotCURlbG9yaWUuCi0KLU1vbiBKdWwgMTAgMTE6MDk6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoc2V0X3N5bWJvbF9mcm9tX2hhc2gpOiBiZmRfbGlua19oYXNoX25ldyBjYXNlOiBEb24ndAotCWFib3J0OyBpdCBjYW4gaGFwcGVuIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzIHdoZW4gbm90IGJ1aWxkaW5nCi0JY29uc3RydWN0b3JzLgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogQ29ycmVjdCB0eXBvOiB1c2UgISBvbiBzdHJjbXAsCi0Jbm90IG9uIHN0cmluZy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkCi0JbG9jYWwgaS4KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogRG9uJ3QgZGVjbGFyZS4KLQkoUENSRUxPRkZTRVQpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1hcm0ubwotCShDRklMRVMpOiBBZGQgY29mZi1hcm0uYywgcGUtYXJtLmMsIHBlaS1hcm0uYy4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpKTogQWxsb2NhdGUgaGFzaCB0YWJsZQotCXVzaW5nIGJmZF9hbGxvYywgbm90IG1hbGxvYy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBpMzg2bGludXguYyAobGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYWliLmNvbT46Ci0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogSWYgLUJzeW1ib2xpYywKLQlvdXRwdXQgYSBEVF9TWU1CT0xJQyBkeW5hbWljIGVudHJ5LgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgZG9uJ3QgcmVxdWlyZSBhIFBMVAotCWVudHJ5IGZvciBhIGxvY2FsbHkgZGVmaW5lZCBzeW1ib2wuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCBkbyB3YXJuCi0JYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCBmaWxsIGluIHRoZSBHT1QgZW50cnkgZm9yIGEgc3ltYm9sCi0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IElmIC1Cc3ltYm9saWMsIG91dHB1dCBhIFJFTEFUSVZFCi0JcmVsb2MgcmF0aGVyIHRoYW4gYSBHTE9CX0RBVCByZWxvYyBmb3IgYSBzeW1ib2wgZGVmaW5lZCBpbiBhCi0JcmVndWxhciBvYmplY3QgZmlsZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvIHdhcm4KLQlhYm91dCB1bmRlZmluZWQgc3ltYm9scywgYW5kIGZpbGwgaW4gdGhlIEdPVCBlbnRyeSBmb3IgYSBzeW1ib2wKLQlkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgb3V0cHV0IGEgUkVMQVRJVkUKLQlyZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUIHJlbG9jIGZvciBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQlyZWd1bGFyIG9iamVjdCBmaWxlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvCi0Jd2FybiBhYm91dCB1bmRlZmluZWQgc3ltYm9scywgYW5kIGZpbGwgaW4gdGhlIEdPVCBlbnRyeSBmb3IgYQotCXN5bWJvbCBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgb3V0cHV0IGEKLQlSRUxBVElWRSByZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUIHJlbG9jIGZvciBhIHN5bWJvbCBkZWZpbmVkCi0JaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCi0JKiBjb25maWcvbTY4ay1jb2ZmLm10IChTRUxFQ1RfVkVDUyk6IFJlbmFtZSBmcm9tIFNFTEVDVF9WRUNUT1JTLgotCUNvcnJlY3QgZWxlbWVudHMgdG8gYmUgYWN0dWFsIEJGRCB2ZWN0b3IgbmFtZXMuCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IERvbid0IGRlcGVuZCB1cG9uIEBmcmFnc0AuCi0JKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBAZnJhZ3NALgotCi1GcmkgSnVsICA3IDE3OjM2OjQ0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBTb3J0IGRlZmluZWQgc3ltYm9scyB0aGF0IGFyZQotCW5laXRoZXIgQlNGX0ZVTkNUSU9OIG5vdCBCU0ZfTk9UX0FUX0VORCBqdXN0IGJlZm9yZSB1bmRlZmluZWQKLQlzeW1ib2xzLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQlNGX0ZVTkNUSU9OIGFzIHdlbGwKLQlhcyBCU0ZfTk9UX0FUX0VORC4KLQotRnJpIEp1bCAgNyAxNzoxNjoxNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvX21vc3RseWNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0JKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUuCi0KLVRodSBKdWwgIDYgMTQ6Mzc6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBSZXZlcnQgTWF5IDI0IHBhdGNoLgotICAgICAgICBEb24ndCBjb3B5IFBDMzIgcmVsb2MgYWdhaW5zdCBzZWN0aW9uIGludG8gc2hhcmVkIG9iamVjdC4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGRlZCBlbGZsaW5rLmMuCi0JKE1ha2VmaWxlKTogRGVwZW5kIHVwb24gY29uZmlnLnN0YXR1cywgbm90IGNvbmZpZ3VyZS5pbi4KLQkoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQ7IGRlcGVuZCB1cG9uIGNvbmZpZ3VyZSBjb25maWd1cmUuaG9zdAotCWFuZCBjb25maWcuYmZkLgotCi1XZWQgSnVsICA1IDIwOjE3OjE0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGZjb3JlLmgsIGVsZmxpbmsuaCwgZWxmY29kZS5oLCBlbGYuYywgZWxmbGluay5jOiBNb3ZlZCBzb21lCi0gCXByaW1hcmlseSBzaXplLWluZGVwZW5kZW50IGNvZGUgZnJvbSBlbGZjb2RlLmggdG8gZWxmLmMgYW5kIG5ldwotIAlmaWxlIGVsZmxpbmsuYzsgbW92ZWQgb3V0IG90aGVyIGNvcmUtIG9yIGxpbmtlci1yZWxhdGVkIHJvdXRpbmVzCi0gCWludG8gb3RoZXIgbmV3IC5oIGZpbGVzIGZvciBjbGFyaXR5LiAgUmVuYW1lZCBtYW55IHJvdXRpbmVzIHRvCi0gCXN0YXJ0IHdpdGggYmZkX2VsZiBvciBfYmZkX2VsZi4gIEFkZGVkIGEgc3RydWN0dXJlIG9mCi0gCXNpemUtZGVwZW5kZW50IGJ1dCB0YXJnZXQtaW5kZXBlbmRlbnQgaW5mbyB0byBlbGZjb2RlLmguCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgZWxmbGluay5vLiAgVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGxpYmVsZi5oOiBVcGRhdGVkIHNvbWUgZGVjbGFyYXRpb25zLiAgQWRkZWQgYSBkZWZpbml0aW9uIGZvciB0aGUKLQluZXcgc3RydWN0dXJlIGluIGVsZmNvZGUuaC4gIEFkZGVkIG1vcmUgZmllbGRzIHRvIGVsZiBiYWNrZW5kIGRhdGEKLQlzdHJ1Y3R1cmUuCi0JKiBlbGZ4eC10YXJnZXQuaDogUmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHNpemUtZGVwZW5kZW50IGluZm8uCi0JKiBlbGYzMi0qLmM6IENoYW5nZWQgc29tZSBmdW5jdGlvbiBuYW1lcy4gIE1vdmVkIGNvbW1vbgotCWNyZWF0ZV9keW5hbWljX3NlY3Rpb25zIGNvZGUgZnJvbSBtNjhrLCBzcGFyYywgYW5kIGkzODYgc3VwcG9ydAotCWludG8gZWxmbGluay5jLiAgRGVmaW5lIHNvbWUgbmV3IG1hY3JvcyB0byBmaWxsIGluIG5ldyBmaWVsZHMgb2YKLQliYWNrIGVuZCBkYXRhLiAgQWxzbyBjbGVhbiB1cCBzb21lICJnY2MgLVdhbGwiIHdhcm5pbmdzIHJlZ2FyZGluZwotCXVudXNlZCBvciB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogTm8sIGRvbid0IHB1dCBlbGZsaW5rLm8gaGVyZS4KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBpdCBoZXJlIHdoZW5ldmVyIGVsZi5vIGlzIHNwZWNpZmllZC4KLQotV2VkIEp1bCAgNSAxMDozMTo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb2JqZWN0X3ApOiBVbmNvbmRpdGlvbmFsbHkgc2V0Ci0JZWxmX2JhZF9zeW10YWIsIHNpbmNlIHNvbWV0aW1lcyB0aGUgc3ltYm9sIHRhYmxlIGlzIG1lc3NlZCB1cCBhbmQKLQl0aGUgbGFzdCBzeW1ib2wgaXMgZ2xvYmFsLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsKTogRGVjbGFyZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaXNfbG9jYWxfbGFiZWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAkYWNfY29uZmlnX3N1Yiwgbm90ICRjb25maWdzdWIuCi0JKiBjb25maWd1cmU6IExpa2V3aXNlLgotCi0JUGVybWl0IC0tZW5hYmxlLXRhcmdldHM9aWVlZToKLQkqIGNvbmZpZy5iZmQgKCotKi1pZWVlKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvaWVlZS5tdDogTmV3IGZpbGUuCi0KLVdlZCBKdWwgIDUgMDQ6MTY6MzUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9pMzg2YWl4Lm1oIChIREVGSU5FUyk6IFJlbW92ZSAtREZBU0NJU1RfRkRPUEVOLgotCi0JQXV0b2NvbmZpc2NhdGlvbjoKLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogU3dpdGNoIGZyb20gQ3lnbnVzCi0JY29uZmlndXJlIHRvIGF1dG9jb25mIHdheXMgb2YgcHJvY2Vzc2luZyAtLWVuYWJsZSBhcmd1bWVudHMsCi0Jc2V0dGluZyB1cCBzeW1saW5rcywgaW5jb3Jwb3JhdGluZyBtYWtlZmlsZSBmcmFnbWVudHMsIHByaW50aW5nCi0JbWVzc2FnZXMgYXQgY29uZmlndXJhdGlvbiB0aW1lLCBzZXR0aW5nIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS4KLQlEZWxldGVkIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4gIENoZWNrIGZvciByYW5saWIgdmlhIGF1dG9jb25mLgotCUZvciBub3csIGNvbmZpZ3VyZSBzY3JpcHQgcmVtb3ZlcyBkb2MvY29uZmlnLnN0YXR1cy4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUuCi0JKiBkZXAtaW4uc2VkOiBVc2UgQFNSQ0RJUkAgaW5zdGVhZCBvZiBAc3JjZGlyQCwgc28gTWFrZWZpbGUuaW4KLQlsaW5lIGRvZXNuJ3QgZ2V0IGJyb2tlbiBieSBjb25maWd1cmUuCi0JKiBkb2MvY29uZmlndXJlLmluOiBSZW1vdmVkLgotCi1UdWUgSnVsICA0IDEyOjIyOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogSWYKLQlCRkRfVFJBRElUSU9OQUxfRk9STUFUIGlzIHNldCwgbGltaXQgdGhlIGxlbmd0aCBvZiBhbGwgZmlsZSBuYW1lcwotCXRvIGFyX21heF9uYW1lbGVuLgotCShiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUpOiBJZiBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGlzIHNldCwgY2FsbAotCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lLgotCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBSZXZlcnQgSnVuZSAxIGNoYW5nZS4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBBZGQgcHJvdmlkZQotCWFyZ3VtZW50LgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogVXBkYXRlIHByb3RvdHlwZS4KLQkoYmZkX2VsZjY0X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIG5lZWRlZCBmaWVsZC4gIFJlbW92ZQotCXNhd19uZWVkZWQgZmllbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGVsZl9kdF9uZWVkZWRfbmFtZQotCWlzIGFuIGVtcHR5IHN0cmluZywgZG9uJ3QgbWFrZSBhIERUX05FRURFRCBlbnRyeSBpbiB0aGUgb3V0cHV0Ci0JZmlsZS4gIFJlY29yZCBhbGwgRFRfTkVFREVEIGVudHJpZXMgZm91bmQgaW4gaW5wdXQgZHluYW1pYwotCW9iamVjdHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCBjaGVjayBzYXdfbmVlZGVkIHdoZW4gaXNzdWluZwotCXdhcm5pbmdzLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBuZWVkZWQsIG5vdAotCXNhd19uZWVkZWQuCi0JKGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0KTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKHN0cnVjdCBiZmRfZWxmX2xpbmtfbmVlZGVkX2xpc3QpOiBEZWZpbmUuCi0JKGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0KTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWxzbyBpbml0aWFsaXplCi0JZmluZF9idWZmZXIgYW5kIGZkcnRhYl9sZW4gZmllbGRzIG9mIG5ld2x5IGFsbG9jYXRlZAotCWZpbmRfbGluZV9pbmZvIHN0cnVjdHVyZS4KLQotTW9uIEp1bCAgMyAxNzowMzo1MiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogTmV3IGFyZ3VtZW50ICJzeW1fZGlmZiIsCi0Jbm9uemVybyB3aGVuIHdlJ3JlIGdlbmVyYXRpbmcgcmVsb2NhdGlvbnMgZm9yIGFuIGV4cHJlc3Npb24KLQl1c2luZyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JSGFuZGxlIGRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBmb3IgYm90aCBSX0hQUEEgYW5kIFJfQ09NUExFWAotCWNhc2VzLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfQ09NUDEsIFJfQ09NUDIgYW5kIFJfQ09ERV9FWFBSCi0JZml4dXBzLgotCi1Nb24gSnVsICAzIDEzOjU1OjE4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHdpbjMyKTogTmV3IGNvbmZpZ3VyYXRpb24uCi0JKiBjb25maWd1cmUuaG9zdCAocGUpOiBDaGFuZ2VkIHRvIGkzODZ3aW4zMi4KLQkqIGNvbmZpZy9pMzg2cGUubWg6IERlbGV0ZWQuCi0JKiBjb25maWcvaTM4NndpbjMyLm1oOiBOZXcgZmlsZS4KLQotTW9uIEp1bCAgMyAxMTozMDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBJZiB3ZSBhbGxvY2F0ZQotCWZpbmRfbGluZV9pbmZvLCBjbGVhciB0aGUgZmRydGFiIGZpZWxkLgotCi0JKiB0YXJnZXRzLmMgKGVudW0gYmZkX2ZsYXZvdXIpOiBBZGQgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyIGhlcmUsCi0JcmF0aGVyIHRoYW4gaW4gYmZkLWluMi5oLgotCi0JKiBiZmQuYyAoZW51bSBiZmRfZXJyb3IpOiBEZWZpbmUgYmZkX2Vycm9yX25vX2FybWFwLgotCShiZmRfZXJybXNncyk6IEFkZCBzdHJpbmcgZm9yIGJmZF9lcnJvcl9ub19hcm1hcC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IElmIGFuIGFyY2hpdmUgaGFzIG5vCi0JYXJtYXAsIHNldCBiZmRfZXJyb3Jfbm9fYXJtYXAgcmF0aGVyIHRoYW4gYmZkX2Vycm9yX25vX3N5bWJvbHMuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogUGVybWl0IGNvbW1vbiBhbmQKLQlpbmRpcmVjdCBzeW1ib2xzIGluIHdlYWtkZWZzIEJGRF9BU1NFUlQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNpbXBsaWZ5Ci0JQkZEX0FTU0VSVCB0byBwZXJtaXQgc29tZSBsZWdhbCwgYnV0IG9kZCwgY2FzZXMuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgdmVyc2Fkb3Muby4KLQkoQ0ZJTEVTKTogQWRkIHBlLWkzODYuYywgcGVpLWkzODYuYywgYW5kIHZlcnNhZG9zLmMuCi0KLVN1biBKdWwgIDIgMTc6NDk6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ2FzdCBiYXNlX2ZpbGUKLQl0byBGSUxFICogYmVmb3JlIHVzaW5nIGl0LgotCSogc3RhYi1zeW1zLmM6IFJldmVydCB5ZXN0ZXJkYXkncyBwYXRjaC4KLQotU2F0IEp1bCAgMSAxMjoxMDo0MiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogc3RhYi1zeW1zLmMgKHN0ZGlvLmgpOiAgSW5jbHVkZSBwcmlvciB0byBsaWJhb3V0LmgsIHdoaWNoCi0JaW5jbHVkZXMgYmZkbGluay5oLCB3aGljaCBub3cgdXNlcyBGSUxFLgotCi1TYXQgSnVsICAxIDAwOjExOjA4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaDogTmV3IGZpbGUuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBlbGZfNjRfcCBmaWVsZC4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZOTl9iZWQpOiBEb24ndCBzZXQgaXQuCi0KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaDogRGVsZXRlZC4KLQkqIE1ha2VmaWxlLmluIChlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0LmgpOiBCdWlsZCB0aGVtIGZyb20KLQllbGZ4eC10YXJnZXQuaC4KLQotRnJpIEp1biAzMCAxNjowNzoxOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ29tcGFyZQotCXRoZSBmdWxsIHRleHQgb2YgLnJlbG9jIG9yIC5lZGF0YSBzZWN0aW9uIG5hbWVzLgotCi1GcmkgSnVuIDMwIDE1OjQ3OjM3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKToKLQlSZW1vdmUgZXh0cmEgJysnLgotCi1UaHUgSnVuIDI5IDE3OjI0OjUyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaDgzMDAuYyAoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQotV2VkIEp1biAyOCAxODowNDo0MiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogdmVyc2Fkb3MubyBpcyBub3cgY29uZGl0aW9uYWxseSBidWlsdC4KLQkqIGNvZmZjb2RlLmggKGFkZF9kYXRhX2VudHJ5KTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENsZWFuIHVwLiBDYWxjdWxhdGUKLQlkYXRhIGVudHJpZXMuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKToKLQkucmVsb2MgYW5kIC5lZGF0YSBzZWN0aW9ucyBhcmUgSU1BR0VfQkFTRUQgdG9vLgotCUlmIHRoZXJlJ3MgYSBiYXNlX2ZpbGUgdGhlbiB3cml0ZSBvdXQgYmFzZSBpbmZvcm1hdGlvbi4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpMzg2LSotcGUpOiBOZXcuCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogT25seSBzY2FuIHByZWZpeGVzLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFZlcnNhZG9zIGlzIG5vdyBjb25kaXRpb25hbGx5Ci0JYnVpbHQuCi0JKiBjb25maWcvbTY4ay1jb2ZmLm10OiBCdWlsZCB2ZXJzYWRvcy5vCi0JKiBob3N0cy9pMzg2cGUuaDogTmV3IGZpbGUuCi0KLU1vbiBKdW4gMjYgMTM6NTM6NDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBDbG9zZSBjb21tZW50IGJlZm9yZQotCVJfUEFSSVNDX0RQUkVMMjFMIGhhbmRsaW5nLgotCi1UaHUgSnVuIDIyIDE5OjI4OjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTdW4gTWF5ICA3IDExOjUzOjQxIE1EVCAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCi0JKiBjb25maWcvaTM4Ni1tb3NzLm10OiBjcmVhdGVkLgotCi1UaHUgSnVuIDIyIDA4OjU2OjEwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGQgY2FzZSBmb3IgLXZlIHdvcmRzLgotCi1XZWQgSnVuIDIxIDEzOjEzOjQ5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHRyeSB0byBhcHBseSBhCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIHVuZGVmaW5lZCBzeW1ib2xzLgotCi1XZWQgSnVuIDIxIDEwOjE2OjEwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHZlcnNhZG9zLmM6IFNlY29uZCBwYXNzL3Jld3JpdGUuCi0KLU1vbiBKdW4gMTkgMDg6NDA6NDUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSk6IENvbXBhcmUgb25seSB0aGUgZnJvbnQgcGFydAotCW9mIGEgc2VjdGlvbiBuYW1lLgotCi1TYXQgSnVuIDE3IDA5OjQwOjQ0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IFNldCB0aGUgc2l6ZSBvZiB0aGUgc3R1YgotCXNlY3Rpb24gaWYgd2UgZ2V0IGFuIGVycm9yLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBEb24ndCBtZXNzCi0Jd2l0aCB0aGUgb3BlcmFuZHMgb2YgYW4gUl9QQVJJU0NfRFBSRUwyMUwgcmVsb2NhdGlvbiBpZiB0aGUgaW5zbgotCWlzIG5vdCAiYWRkaWwgPHN5bWJvbD4sJXIyNyIuCi0KLUZyaSBKdW4gMTYgMTU6MDQ6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogRGVjbGFyZSBidXQgZG9uJ3QKLQlkZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBiZmQuYyAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogRGVmaW5lLgotCi1GcmkgSnVuIDE2IDAwOjA3OjI1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2xpbmtfbGlua19yZWxvY2F0ZSk6IFVzZSB0aGUgcmlnaHQKLQl0eXBlIGZpZWxkICh0aGVyZSBhcmUgdHdvISkgd2hlbiBjaGVja2luZyB0byBzZWUgaWYgJGdsb2JhbCQgaXMKLQlkZWZpbmVkLgotCi1UaHUgSnVuIDE1IDE0OjAzOjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmgsIGJmZC1pbjIuaCAoYmZkX2Jvb2xlYW4pOiBSZW5hbWUgYmZkX3RydWUsIGJmZF9mYWxzZQotCXRvIGJmZF90dHRydWUsIGJmZF9mZmZhbHNlIHNvIGFzIG5vdCB0byBjb25mbGljdCB3aXRoIGZ1bmN0aW9ucy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogUmVtb3ZlIHZlcnNpb24gdGhhdCB3YXMKLQloYWNrZWQgZm9yIE1QVyBDLgotCSogbXB3LWNvbmZpZy5pbjogU2V0IHNoZWxsIHZhcnMgaW5zdGVhZCBvZiBwYXN0aW5nIHRvIG1ha2VmaWxlCi0JZm9yIGVhY2ggY29uZmlndXJhdGlvbiwgZWRpdCBjb2Zmc3dhcC5oIHRvIG1ha2UgTVBXIEMgbm90IGNob2tlLgotCShpMzg2LXVua25vd24tY29mZiwgc2gtaGl0YWNoaS1obXMpOiBSZWNvZ25pemUuCi0JKiBtcHctbWFrZS5pbiAoQkZEX0xJQlMpOiBBZGQgdmVyc2Fkb3MuYy5vLgotCi0JKiB2ZXJzYWRvcy5jICh2ZXJzYWRvc19zY2FuKTogUHJvcGVybHkgY2FzdCByZXN1bHRzIGZyb20gYmZkX2FsbG9jLgotCi1XZWQgSnVuIDE0IDE1OjI3OjMyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBOZXcgZnVuY3Rpb24KLQlyZWFkcyBhbmQgaGFuZGxlcyAuZHJlY3R2ZSBzZWN0aW9ucyBmb3IgUEUuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBDYWxsIG5ldyBmdW5jdGlvbiBpZiBQRS4KLQotTW9uIEp1biAxMiAxMjowOTozOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkLWluLmggKGJmZF9zZXRfc2VjdGlvbl92bWEpOiBDYXNlIHRydWUgdG8gYSBib29sZWFuLgotCShiZmRfc2V0X2NhY2hlYWJsZSk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgSnVuICA5IDEyOjIwOjI4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBSZXdyaXRlIHRvIGJlIHN5bW1ldHJpY2FsLgotCi1GcmkgSnVuICA5IDEyOjQ5OjAwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB0YXJnZXRzLmM6IEFkZCBjb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgYW5kIGxpbmtfc3BsaXRfc2VjdGlvbgotCXRvIHRoZSB0YXJnZXQgdmVjdG9yLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogRGVmaW5lLgotCShfYmZkX25vbGlua19iZmRfbGlua19zcGxpdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBzeW1zLmMgKGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWZpbmUuCi0JKiBsaW5rZXIuYyAoYmZfbGlua19zcGxpdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBOZXcgZnVuY3Rpb24KLQkoc29tX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIEFsbCBvdGhlciB0YXJnZXRzIHVwZGF0ZWQgd2l0aCBkZWZhdWx0IHZlcnNpb25zIG9mIG5ldyByb3V0aW5lcy4KLQotCSogVGFrZSBvdXQgbXkgYnJhaW5kYW1hZ2VkIGJmZF90cnVlL2JmZF9mYWxzZSBjaGFuZ2VzIGZyb20gZWFybGllcgotCXRvZGF5LiAgUmVwbGFjZSB3aXRoIGp1c3Q6Ci0JKiBiZmQtaW4uaDogKFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVEKTogRGVmaW5lIHRoaXMgaWYKLQljb21waWxpbmcgd2l0aCBnKystMi42IG9yIGxhdGVyLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgSnVuICA5IDA3OjU0OjI5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHZlcnNhZG9zLmMgKHN0cnVjdCBlc2QsIGdldF80KTogTGludDsgdXNlIHVuc2lnbmVkIGNoYXJzLgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogIENvbXBhcmUgb3V0cHV0IHNlY3Rpb24gbmFtZXMKLQl3aGVuIGNvbnZlcnRpbmcgZm9yIHZ4d29ya3MuCi0KLVdlZCBKdW4gIDcgMTk6MDE6MzAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IFBlcm1pdCAuc2NvbW1vbiBvciBDT01NT04KLQlzZWN0aW9ucyBhcyByYW5kb20gU0hUX05PQklUUyBzZWN0aW9ucywgaW4gY2FzZSBhIGxpbmtlciBzY3JpcHQgaXMKLQlzdHJhbmdlLgotCi1UdWUgSnVuICA2IDE3OjI5OjMyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBNb3ZlZCBmcm9tIHBlLmgKLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBHZXQgUEUgcmVsb2NzIHJpZ2h0LgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdCk6IFNldCBwZSB0ZGF0YSBiaXQgd2hlbiB1c2luZyBQRS4KLQkqIGNvZmZsaW5rLmMgKENPRkZfV0lUSF9QRSBjb2RlKTogVGVzdCBvbiBvYmpfcGUgYml0IHJhdGhlcgotCXRoYW4gY29uZGl0aW9uYWwgY29tcGlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogRml4IFBFIGRlcGVuZGVuY2llcy4KLQkqIGxpYmNvZmYtaW4uaCAob2JqX3BlKTogTmV3LgotCShjb2ZmX3RkYXRhKTogQWRkZWQgcGUgZW50cnkuCi0JKiBsaWJjb2ZmLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gSnVuICA1IDA5OjA3OjEzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCk6IENvbXBsZXRlbHkgcGFyZW50aGVzaXplCi0JbWFjcm8uCi0KLU1vbiBKdW4gIDUgMDI6MTU6MjAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JTGlua2VyIHN1cHBvcnQgZm9yIG02OGstZWxmIGZyb20gQW5kcmVhcyBTY2h3YWIKLQk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPjoKLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2hlY2sgZm9yIE5VTEwgd2hlbgotCWxvb3BpbmcgdGhyb3VnaCB0aGUgc3ltYm9sIGhhc2hlcy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogV2hlbiBsb29raW5nIGZvciBfaW5pdCBhbmQgX2ZpbmkgZG9uJ3QgdXNlCi0JdGhlIHN5bWJvbCBpZiBpdCBpcyBpbXBvcnRlZCBmcm9tIGFub3RoZXIgb2JqZWN0LgotCSogZWxmMzItbTY4ay5jOiBSZWxvY2F0aW9uIHR5cGUgY2hhbmdlZCBmcm9tIFJFTCB0byBSRUxBLiAgUmVndWxhcgotCWFuZCBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydCBmdW5jdGlvbnMgYWRkZWQsIHNpbWlsYXIgdG8gb3RoZXIgZWxmCi0JdGFyZ2V0cy4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1nbnUqKTogVXNlIEVMRiBjb25maWd1cmF0aW9uLgotCi1GcmkgSnVuICAyIDE4OjU0OjU5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHZlcnNhZG9zLmM6IE5ldyBmaWxlLgotCSogYmZkLWluMi5oIChzdHJ1Y3QgX2JmZCk6IE5ldyBmaWVsZC4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IE5ldyBmaWVsZC4KLQkqIGNvbmZpZ3VyZS5pbiAodmVyc2Fkb3NfdmVjKTogTmV3IGZpZWxkLgotCSogdGFyZ2V0cy5jIChiZmRfZmxhdm9yKTogQWRkZWQgdmVyc2Fkb3MuCi0KLVRodSBKdW4gIDEgMTM6NTE6NDkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MsIHN0eXBfdG9fc2VjX2ZsYWdzLCAKLQljb2ZmX25ld19zZWN0aW9uX2hvb2spOiAgQW55IHNlY3Rpb24gdGhhdCBzdGFydHMgIi5zdGFiIgotCWlzIG5vdyBtYXJrZWQgYXMgZGVidWdnaW5nLgotCi1UaHUgSnVuICAxIDE2OjE1OjE2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogRGlzYWJsZSBleHRlbmRlZCBuYW1lCi0JdGFibGUgdW50aWwgaXQgY2FuIGJlIG1hZGUgb3B0aW9uYWwsIHNvIHRoYXQgbmF0aXZlIEFSIGhhcyBoYWxmIGEKLQljaGFuY2Ugb24gU3VuT1MgYW5kIEhQL1VYLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMsIGNhc2UKLQliZmRfbGlua19oYXNoX2luZGlyZWN0KTogQWRkIGNhc3QgdG8gY29ycmVjdCBwb2ludGVyIHR5cGVzLgotCi1TYXQgTWF5IDI3IDIxOjM3OjMxIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAobTY4ay1idWxsLXN5c3YqKTogQWRkZWQgc3RyaXBfdW5kZXJzY29yZT15ZXMuCi0JICAobTY4ay1lc3QtY29mZik6IFJlbW92ZWQuICB0YXJnZXQgZG9lcyBub3QgZWZmZWN0IG9iamVjdCBmb3JtYXQuCi0KLVdlZCBNYXkgMjQgMTA6NTI6MDEgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogQ29wZSB3aXRoCi0JaW5kaXJlY3Qgc3ltYm9scy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogR2l2ZSBlcnJvcgotCW1lc3NhZ2Ugd2hlbiBsaW5raW5nIHRvIGEgc2hhcmVkIHJlbG9jIHdoaWNoIGlzbid0IHRoZXJlLgotCi1XZWQgTWF5IDI0IDEwOjQwOjAwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBBUk0tUEUuCi0KLQkqIE1ha2VmaWxlLmluLCBjb2ZmY29kZS5oLCBjb25maWcuYmZkLCBjb25maWd1cmUuaW4sIHBlLWFybS5jLAotCSBwZWktYXJtLmMsIGNvZmYtYXJtLmMsIHJlbG9jLmMsIHRhcmdldHMuYywgY29uZmlnL2FybS1wZS5tdDoKLQkgU3VwcG9ydCBmb3IgQVJNIENPRkYvUEUuCi0KLVR1ZSBNYXkgMjMgMTk6MjQ6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBOb3cgYSBmdW5jdGlvbiwKLQl0cmllcyBjYWxsaW5nIHJvdXRpbmUgZnJvbSBpbnB1dCBiZmQgdGFyZ2V0IHZlY3RvciBmb3IKLQliZmRfaW5kaXJlY3RfbGlua19vcmRlci4gIFB1dCBhIGRlY2xhcmF0aW9uIGludG8gdGhlIGhlYWRlciBmaWxlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLW1pcHMuYyAoZ3ByZWwxNl93aXRoX2dwKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgZnJvbQotCW1pcHNfZWxmX2dwcmVsMTZfcmVsb2MuCi0JKG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBDYWxsIGl0LiAgSWYgb3V0cHV0IGJmZCB0YXJnZXQgdmVjdG9yCi0JaXNuJ3QgZWxmIGZsYXZvdXJlZCwgYWJvcnQsIHNpbmNlIGl0J3MgYXNzdW1lZCB0byBiZSBlbGYgaW4gc29tZQotCW9mIHRoaXMgY29kZSwgaW5jbHVkaW5nIHRoZSBjb2RlIHRoYXQgbG9va3MgdXAgdGhlIGdwIHZhbHVlLgotCShlbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBmdW5jdGlvbiwKLQltb2RpZmllZCBmcm9tIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyB0byBkZWFsCi0Jd2l0aCBwYXNzaW5nIGdwIHRvIGdwcmVsMTZfd2l0aF9ncC4KLQkoYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBOZXcgbWFjcm8uCi0JKiBlbGYzMi10YXJnZXQuaCAoYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCURvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLVR1ZSBNYXkgMjMgMTU6NTg6MTUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiBJbnN0YWxsIGJmZGxpbmsuaCB0b28uCi0KLVN1biBNYXkgMjEgMjI6MjU6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHVuZGVmaW5lZCBhbmQKLQlub3RzdXBwb3J0ZWQgcmV0dXJuIGNvZGVzIGZyb20gZmluYWxfbGlua19yZWxvY2F0ZSAodXNlZCB3aGVuCi0JJGdsb2JhbCQgaXMgdW5kZWZpbmVkIG9yIG5vbmV4aXN0YW50KS4KLQkoZWxmMzJfaHBwYV9iZmRfbGlua19saW5rX3JlbG9jYXRlKTogSWYgJGdsb2JhbCQgZXhpc3RzLCBidXQgaXMKLQlub3QgZGVmaW5lZCx0aGVuIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkLgotCi1GcmkgTWF5IDE5IDEwOjAwOjE0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oOiAoSU1BR0VfQkFTRSk6IERlZmluZSB0byAwIGlmIG5vdC4KLQotVGh1IE1heSAxOCAwNDoyNDowMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlXZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGFuZGFyZCk6IElmIGRlZmluZWQsIGNhbGwKLQlNWV9yZWxvY2F0YWJsZV9yZWxvYyBiZWZvcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uCi0KLQkqIGFvdXQtYXJtLmM6IChXUklURV9IRUFERVJTKTogRGVsZXRlLgotCShOQU1FKTogRGVmaW5lIHZlcnNpb24gdG8gb3ZlcnJpZGUgZGVmYXVsdCBpbiBhb3V0eC5oCi0JKE1ZKGhvd3RvX3RhYmxlKSk6IFJlZm9ybWF0LiAgQWx0ZXIgc29tZSBlbnRyaWVzIHNsaWdodGx5LgotCShSRUxPQ19BUk1fQklUU19ORUdfe0JJRyxMSVRUTEV9KTogRGVmaW5lLgotCShNWShyZWxvY19ob3d0byksIE1ZKHB1dF9yZWxvYyksIE1ZKHJlbG9jYXRhYmxlX3JlbG9jKSk6IE5ldyBmdW5jdGlvbnMuCi0JKE1ZX3JlbG9jX2hvd3RvLCBNWV9wdXRfcmVsb2MsIE1ZX3JlbG9jYXRhYmxlX3JlbG9jKTogRGVmaW5lLgotCShNWShmaXhfcGNyZWxfMjYpKTogUmVuYW1lZCBmcm9tIGFvdXRhcm1fZml4X3BjcmVsXzI2LCByZXR1cm4KLQliZmRfcmVsb2Nfb2sgbm90IGJmZF9yZWxvY19jb250aW51ZS4KLQkoTVkoZml4X3BjcmVsXzI2X2RvbmUpKTogTGlrZXdpc2UuCi0JKE1ZKGJmZF9yZWxvY190eXBlX2xvb2t1cCkpOiBSZW5hbWVkIGZyb20gYW91dGFybV9yZWxvY190eXBlX2xvb2t1cC4KLQkoTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzLAotCU1ZX2JmZF9maW5hbF9saW5rKTogRGVsZXRlLgotCShNWV9zd2FwX3N0ZF9yZWxvY19pbiwgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0LCBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyk6Ci0JRGVmaW5lLgotCShhb3V0eC5oKTogSW5jbHVkZSBpdC4KLQkoTVkoc3dhcF9zdGRfcmVsb2Nfe2luLG91dH0pKTogTmV3IGZ1bmN0aW9ucy4KLQlVc2UgUkVMT0NfQVJNX0JJVFNfTkVHX3tCSUcsTElUVExFfSB0byBleHRyYWN0IG5lZ2F0aXZlIHJlbG9jIGJpdC4KLQkoYW91dGFybV9zcXVpcnRfb3V0X3JlbG9jcyk6IERlbGV0ZS4KLSAKLQlGcm9tOiBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCSogY29uZmlnL2FybVtsYl0tYW91dC5tdDogTmV3IGZpbGVzLgotCSogYW91dC1hcm0uYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkOiBIYW5kbGUgYXJteyxlW2xiXX0tKi1hb3V0Ci0JKiBjb25maWd1cmUuaW46IEFkZCB2ZXRvciBmb3IgYW91dF9hcm1fe2JpZyxsaXR0bGV9X3ZlYy4KLQkqIHJlbG9jLmM6IE5ldyByZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgQVJNLgotCSogdGFyZ2V0cy5jIChhb3V0X2FybV97YmlnLGxpdHRsZX1fdmVjKTogZGVjbGFyZS4KLQotVHVlIE1heSAxNiAxMDoyOTo1MSAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9zdGF0KTogSWYgYmZkX2NhY2hlX2xvb2t1cCByZXR1cm5zIGFuIGVycm9yLAotCXJldHVybiBhbiBlcnJvciB0byB0aGUgY2FsbGVyLiAgQ2FsbCBiZmRfc2V0X2Vycm9yIG9uIGVycm9ycy4KLQotVHVlIE1heSAxNiAxNDo0NDo0NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IE1vZGlmaWVkIHByb3RvdHlwZXMgaW4KLQlhY2NvcmRhbmNlIHdpdGggMTEgTWF5IGxpYmNvZmYuaCBjaGFuZ2UuCi0KLVRodSBNYXkgMTEgMTY6NDM6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCXRla2hleC5jIChmaXJzdF9waGFzZSk6IFVuZGVyc3RhbmQgdHlwZSAwIHN5bWJvbHMuCi0JKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBGaXggdHlwbyBpbiBmaW5hbCByZWNvcmQuCi0KLVRodSBNYXkgMTEgMTY6NDM6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKG9wdGNhbGxfY2FsbGJhY2spOiBkb24ndCB0cnkgYW5kIG9wdGltaXplCi0JdW5kZWZpbmVkIHJlZnMuIAotCShjb2ZmX3dyaXRlX3JlbG9jcyk6IFNlYXJjaCBmb3IgYnJva2VuIHJlbG9jcyBvbiB0aGUgd2F5Ci0Jb3V0IGFuZCBmaXggdGhlbSB1cC4KLQkoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogQ2FsY3VsYXRlIGFuZCByZXR1cm4gaW5kZXggb2YKLQlmaXJzdCB1bmRlZmluZWQgc3ltYm9sLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgY29mZl9yZW51bWJlcl9zeW1ib2xzIAotCWFuZCBjb2ZmX3dyaXRlX3JlbG9jcyB3aXRoIHRoZSBuZXcgYXJncy4KLQkqIGxpYmNvZmYuaDogKGNvZmZfcmVudW1iZXJfc3ltYm9scywgY29mZl9yZW51bWJlcl9zeW1ib2xzKToKLQlNb2RpZmllZCBwcm90b3R5cGVzLgotCi1UaHUgTWF5IDExIDE2OjQzOjE0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0JCQkgIFRvbSBHcmllc3QgPGdyaWVzdEBjcy55YWxlLmVkdT4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgUEUgZm9ybWF0LiAKLQkKLQkqIE1ha2VmaWxlLmluLCB0YXJnZXRzLmMsIGNvbmZpZ3VyZS5pbiwgY29uZmlnLmJmZDoKLQlBZGQgc3VwcG9ydCBmb3IgaTM4Ni0qLXdpbm50IGFuZCBpMzg2LSotcGUuCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiAgVW5kZXJzdGFuZCBOVFBFIGZvcm1hdAotCWFyY2hpdmVzLgotCShfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBUdXJuIFwgaW4gYSBmaWxlbmFtZQotCWludG8gLy4KLQkqIGJmZC1pbi5oIChiZmRfbGlua19zdWJzeXN0ZW0sIF9iZmRfbGlua19zdGFja19oZWFwKTogTmV3LgotCSogY29mZi1pMzg2LmMgIChob3d0b190YWJsZSk6IENvbmRpdGlvbmFsaXplIFBDUkVMT0ZGU0VULgotCSogY29mZmNvZGUuaCAoSU1BR0VfQkFTRSk6IE5ldy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBUaHJvdyBhd2F5IC5qdW5rCi0Jc2VjdGlvbnMgZm9yIFBFLCBhbGlnbiBzeW1ib2xzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFRocm93IGF3YXkgLmp1bmsgc2VjdGlvbnMKLQlmb3IgUEUuIFJlbWVtYmVyIGluZm8gb24gLmlkYXRhIGFuZCAucnNyYyBzZWN0aW9ucy4KLQlGaWxsIGluIHRoZSBQRSBoZWFkZXIuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUEUgdXNlcyBDX1NFQ1RJT04gY2xhc3MuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEtlZXAgUEUgaW5mbyB1cCB0byBkYXRlLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ29wZSB3aXRoIFBFIHJlbG9jcy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF97YW91dC9maWxlL3Njbi9zeW19aGRyX3tpbi9vdXR9KTogCi0JTmV3IGNvZGUgZm9yIFBFIGhlYWRlcnMuCi0KLVR1ZSBNYXkgIDkgMTc6MDE6MzggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgbGl0dGxlIGVuZGlhbiBQb3dlclBDIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IERpdHRvLgotCSogdGFyZ2V0cy5jOiBEaXR0by4KLQkqIGNvbmZpZy9wcGNsZS1lbGYubXQ6IE5ldyBmaWxlLCBmb3IgbGl0dGxlIGVuZGlhbiBQb3dlclBDCi0Jc3VwcG9ydC4KLQkqIGNvbmZpZy9wcGMtZWxmLm10OiBBZGQgbGl0dGxlIGVuZGlhbiBwb3dlcnBjIHRvIHRoZSBCRkQKLQlzZWxlY3Rpb24gdmVjdG9ycy4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDb21wbGFpbiBpZgotCWxpbmtpbmcgYSBkaWZmZXJlbnQgZW5kaWFuIG9iamVjdCB0aGFuIHdlIGV4cGVjdC4KLQkoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9MSVRUTEVfTkFNRSk6IERlZmluZSwgdG8gcHJvdmlkZSBsaXR0bGUKLQllbmRpYW4gc3VwcG9ydC4KLQotVHVlIE1heSAgMiAxNjozMjoyNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLmJmZCAoaHBwYSotKi1saXRlcyopOiBUcmVhdCBqdXN0IGxpa2UgaHBwYSotKi0qZWxmKi4KLQotVHVlIEFwciAyNSAxOTozODo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEluaXRpYWxpemUgbG1hIHNhbWUgYXMKLQl2bWEuCi0KLVR1ZSBBcHIgMjUgMTE6MDM6MjEgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6ICNpbmNsdWRlIGFuc2lkZWNsLmggJ2NhdXNlIFBUUiBpcyB1c2VkIGluCi0Jc3RkLWhvc3QuaC4KLQotTW9uIEFwciAyNCAyMzo1Njo0NCAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NmxpbnV4LmggKEhBVkVfUFJPQ0ZTKTogRG9uJ3QgZGVmaW5lIGl0LiAgQWRkZWQgbGVuZ3RoeQotCWNvbW1lbnQgZXhwbGFpbmluZyB3aHkuCi0KLU1vbiBBcHIgMjQgMTA6MzQ6MDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGhvc3RzL2kzODZsaW51eC5oIChIQVZFX1BST0NGUyk6IElmIE5PX1BST0NGUyBpcyBkZWZpbmVkLCBkb24ndAotCWRlZmluZSBIQVZFX1BST0NGUy4KLQotTW9uIEFwciAyNCAwODozMzoxMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvIG5vdCBjb250aW51ZQotCXByb2Nlc3NpbmcgdW5rbm93biBzeW1ib2xzIHRvIHByZXZlbnQgYSBjYXNjYWRlIG9mIGVycm9ycy4KLQotRnJpIEFwciAyMSAxMjo0ODo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JUGF0Y2hlcyBmcm9tIEguSi4gTHUgZm9yIExpbnV4IEVMRiBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGVsZmNvZGUuaCAoZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgW0hBVkVfUFJPQ0ZTXToKLQlVc2UgcHJwc2luZm9fdCBpbnN0ZWFkIG9mIHN0cnVjdCBwcnBzaW5mbywgZm9yIGNvbnNpc3RlbmN5LgotCSogaG9zdHMvaTM4NmxpbnV4LmggKEhBVkVfUFJPQ0ZTKTogRGVmaW5lLgotCi1UaHUgQXByIDIwIDA5OjA3OjM5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChsaW5rX2FjdGlvbik6IERvIHRoZSByaWdodCB0aGluZyB3aGVuIGEgdW5kZWZpbmVkCi0Jc3Ryb25nIHN5bWJvbCBhcHBlYXJzIGFmdGVyIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQotRnJpIEFwciAxNCAxNjo1MToxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gdG8gcmVsb2NhdGUKLQlhIHdob2xlIHNlY3Rpb24gZm9yIHRoZSBsaW5rZXIsIGJ5cGFzc2luZyBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uIHRvIG1hcCB0aGUgQkZECi0JZW51bWVyYXRpb24gY29kZSBpbnRvIGEgaG93dG8gc3RydWN0dXJlLgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IFJlbmFtZSBmcm9tIHBwY19lbGZfaG93dG9fdGFibGUuCi0JKHBwY19lbGZfaG93dG9fdGFibGUpOiBOZXcgYXJyYXkgdGhhdCBtYXBzIFBvd2VyUEMgcmVsb2NhdGlvbgotCW51bWJlcnMgdG8gaG93dG8gc3RydWN0dXJlcyB3aXRob3V0IGEgbGluZWFyIHNlYXJjaC4gIENoYW5nZSBmcm9tCi0JdXNpbmcgYmZkX2VsZl9nZW5lcmljX3JlbG9jIHRvIHVzZSBwcGNfZWxmX3N0ZF9yZWxvYy4KLQkocHBjX2VsZl9ob3d0b19pbml0KTogSW5pdGlhbGl6ZSBwcGNfZWxmX2hvd3RvX3RhYmxlIGZyb20KLQlwcGNfZWxmX2hvd3RvX3Jhdy4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IFVzZSBhIGNhc2Ugc3RhdGVtZW50IGluc3RlYWQgb2YgYQotCWxvb3AuCi0JKHBwY19lbGZfc3RkX3JlbG9jKTogUmVwbGFjZW1lbnQgZm9yIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4KLQkocHBjX2VsZl91bnN1cHBvcnRlZF9yZWxvYyk6IFByaW50IGEgcmVhbCBlcnJvciBtZXNzYWdlLCBpbnN0ZWFkCi0Jb2YgY2FsbGluZyBhYm9ydC4KLQkocHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIpOiBBYnN0cmFjdCBnZXR0aW5nIGFkanVzdG1lbnQgZnJvbQotCXBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCBzbyBwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gY2FuIHVzZSBpdAotCXRvby4KLQkocHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MpOiBDYWxsIGl0LgotCShwcGNfZWxmX2dvdDE2X2lubmVyKTogQWJzdHJhY3QgZ2V0dGluZyBhZGp1c3RtZW50IGZyb20KLQlwcGNfZWxmX2dvdDE2X3JlbG9jLCBzbyBwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gY2FuIHVzZSBpdCB0b28uCi0JKHBwY19lbGZfZ290MTZfcmVsb2MpOiBDYWxsIGl0LgotCShwcGNfZWxmX2luZm9fdG9faG93dG8pOiBSZW5hbWUgZnJvbSBwb3dlcnBjX2luZm9fdG9faG93dG8uCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBPbWl0IHNwYWNlIGluIGRlYnVnZ2luZwotCW91dHB1dC4KLQkoZWxmX3N5bWJvbF9mbGFncyk6IEFkZCBkZWJ1ZyBmdW5jdGlvbiB0byBkZWNvZGUgZmxhZ3Mgc28gdGhhdAotCWRlZmluaW5nIERFQlVHIHRvIGJlIDQgd2lsbCBjb21waWxlIGFnYWluLgotCShlbGZfZGVidWdfc2VjdGlvbik6IEZpeCB0eXBvIGluIGRlYnVnIG91dHB1dC4KLQotRnJpIEFwciAxNCAxNjowMzowNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgbTY4Ki0qLWVsZiouCi0JKiBlbGYzMi1tNjhrLmM6IEZpbGxlZCBvdXQgaW1wbGVtZW50YXRpb24sIGV4Y2VwdCBmb3IgZHluYW1pYwotCWxpbmtpbmcgc3VwcG9ydC4KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkICpfR09UX1BDUkVMLCAqX0dPVE9GRiwKLQkqX1BMVF9QQ1JFTCwgKl9QTFRPRkYsICpfNjhLXyogcmVsb2NhdGlvbnMgZm9yIEVMRi4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgQXByIDEzIDE0OjI4OjA0IDE5OTUgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBhZGRlci5jeWdudXMuY29tPgotCi0JKiBjb2ZmLW02OGsuYyAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKTogQ2hhbmdlIGZyb20KLQkxIHRvIDIuCi0JKGJmZF90YXJnZXQpOiBDaGFuZ2UgbWluaW11bSBzZWN0aW9uIGFsaWdubWVudCBmcm9tIDEgdG8gMi4KLQotV2VkIEFwciAxMiAxMjo0MDowNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChtYWNoaW5lX3R5cGUsIGNhc2UgYmZkX2FyY2hfbWlwcyk6IFRyZWF0IFI4MDAwIGxpa2UKLQlSNjAwMCBhbmQgUjQwMDAgZm9yIG5vdy4KLQotVHVlIEFwciAgNCAxMjoyODoyNSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBjb25maWd1cmUuaW4uCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIE1ha2VmaWxlLmluLgotCSogaG9zdHMvbXB3Lmg6IE5ldyBmaWxlLCBNUFcgaG9zdCBkZWZpbml0aW9ucy4KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl9pbiwgZWNvZmZfc3dhcF9wZHJfaW4pIFtNUFdfQ106Ci0JQWx0ZXJuYXRlIHZlcnNpb25zIHdpdGhvdXQgRUNPRkZfNjQgdGhhdCBjaG9rZXMgTVBXIEMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEFkZCBhbHRlcm5hdGl2ZSB2ZXJzaW9uIHdpdGgKLQlwYXJ0bHktZXhwYW5kZWQgbWFjcm9zLgotCi1UaHUgTWFyIDMwIDE0OjU2OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IGJvdGhlciB0byBjaGVjayBmb3IKLQlvdmVyZmxvdyBpZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotVGh1IE1hciAzMCAxNDozMjoyNiAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IENoYW5nZSBsaW51eCB0byBkZWZhdWx0IHRvIGVsZi4gIFVzaW5nCi0JaVszNDVdODYtKi1saW51eGFvdXQgd2lsbCBidWlsZCBhIGxpYnJhcnkgd2hpY2ggZGVmYXVsdHMgdG8gYS5vdXQuCi0JKiBjb25maWcvaTM4Ni1sYW91dC5tdDogUmVuYW1lIGZyb20gb2xkIGNvbmZpZy9pMzg2LWxpbnV4Lm10LgotCSogY29uZmlnL2kzODYtbGludXgubXQ6IFJlbmFtZSBmcm9tIG9sZCBjb25maWcvaTM4Ni1sZWxmLm10LgotCUNvbW1lbnQgb3V0IEVYVFJBTElCUy4KLQkqIGNvbmZpZy9pMzg2LWxlbGYubXQ6IFJlbW92ZS4KLQotV2VkIE1hciAyOSAxMjowMTozMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBDYWNoZSB0aGUgc2VjdGlvbiBzeW1ib2wgaW4KLQl0aGUgdXNlZF9ieV9iZmQgZmllbGQgb2YgdGhlIHNlY3Rpb24sIHRvIGF2b2lkIGxvb3BpbmcgZm9yIGVhY2gKLQlyZWxvYy4KLQotCSogY3B1LWg4NTAwLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbmFtZSBmcm9tICJIOC8zMDAiIHRvCi0JImg4MzAwIiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBjcHUtKiBmaWxlcy4KLQotVHVlIE1hciAyOCAxNToxNDoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoYl9vdXRfY2Fub25pY2FsaXplX3JlbG9jKTogSGFuZGxlIFNFQ19DT05TVFJVQ1RPUgotCXNlY3Rpb25zLgotCShiX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBTa2lwIGNvbnN0cnVjdG9yCi0Jc3ltYm9scyB3aGljaCB0aGUgbWFpbiBsaW5rZXIgY29kZSBkaWQgbm90IGRvIGFueXRoaW5nIHdpdGguCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogVXNlIHVkYXRhLnAgaWYgaXQgaXMgc2V0LAotCXJhdGhlciB0aGFuIGxvb2tpbmcgdGhlIHN5bWJvbCB1cCBpbiB0aGUgaGFzaCB0YWJsZS4gIEp1c3QgcGFzcwotCXRocm91Z2ggY29uc3RydWN0b3Igc3ltYm9scyBmb3Igd2hpY2ggdWRhdGEucCBpcyBub3Qgc2V0LiAgSWYgdGhlCi0JbGlua2VyIGRlZmluZWQgdGhlIHN5bWJvbCwgY2xlYXIgdGhlIGNvbnN0cnVjdG9yIGZsYWcuCi0KLVR1ZSBNYXIgMjEgMTA6NTA6MzIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2V0X3JlbG9jX2luZm8pOiBTaWduIGV4dGVuZCBjb25zdGFudHMgZnJvbQotCVJfREFUQV9PVkVSUklERSBmaXh1cHMuCi0JKiBsaWJocHBhLmggKHNpZ25fZXh0ZW5kKTogUmVuYW1lZCBmcm9tIHNpZ25fZXh0LiAgRml4LgotCShsb3dfc2lnbl9leHRlbmQpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyMCAyMjozOToxMCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBUaWdodGVuIHRlc3QgdG8gZGV0ZXJtaW5lCi0Jd2hhdCBzeW1ib2xzIGFyZSBzZWN0aW9uIHN5bWJvbHMuCi0KLVNhdCBNYXIgMTggMDE6NTQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IEFuIGVtcHR5IGFyY2hpdmUgaXMgT0suCi0KLUZyaSBNYXIgMTcgMTY6Mjk6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBKdXN0IHJldHVybiB0cnVlIHdoZW4KLQllaXRoZXIgdGhlIGlucHV0IG9yIG91dHB1dCBzZWN0aW9uIGlzbid0IGF0dGFjaGVkIHRvIGEgU09NIEJGRC4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBTaW1pbGFybHkgZm9yIEJGRCBwcml2YXRlIGRhdGEuCi0KLUZyaSBNYXIgMTcgMTE6NTA6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENoZWNrIHdoZXRoZXIgYSBkeW5hbWljCi0Jb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQsIGFuZCBpZ25vcmUgaXQgdGhlIHNlY29uZCB0aW1lLgotCi1XZWQgTWFyIDE1IDExOjU2OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfU1BBUkNfR09UMTMgZnJvbQotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkIHRvIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQotCSogbGliZWxmLmggKGJmZF9lbGYzMl9fd3JpdGVfcmVsb2NzKTogRG9uJ3QgZGVjbGFyZS4KLQkoYmZkX2VsZjY0X193cml0ZV9yZWxvY3MpOiBEb24ndCBkZWNsYXJlLgotCi1UdWUgTWFyIDE0IDA1OjU0OjMzIDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBzdGFiLXN5bXMuYyAoYW91dF9zdGFiX25hbWUpOiBNb3ZlZCBhb3V0X3N0YWJfbmFtZXMgdG8gYmUgbG9jYWwKLQl0byB0aGlzIGZ1bmN0aW9uLiAgUmVjb2RlZCBmdW5jdGlvbiB0byBzdG9wIHVzaW5nIHRhYmxlLCB0bwotCWltcHJvdmUgcGVyZm9ybWFuY2UgKG9uIGk0ODYtbmV0YnNkIGhvc3QpLiAgTGVmdCBvbGQgdmVyc2lvbgotCWludGFjdCB1bmRlciAiI2lmIDAiIGZvciBmdXJ0aGVyIHBlcmZvcm1hbmNlIHRlc3RpbmcuCi0KLU1vbiBNYXIgMTMgMTM6NDg6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IE1ha2Ugc3RhdGljLiAgVXNlIFBUUiBhcmd1bWVudCBhcyBhCi0JcG9pbnRlciB0byBhIGJvb2xlYW4gdmFyaWFibGUgc2V0IHRvIHRydWUgaWYgc29tZXRoaW5nIGZhaWxzLgotCUNhc3QgdG8gUFRSIHJhdGhlciB0aGFuIHZvaWQgKi4KLQkoc3ltX2lzX2dsb2JhbCk6IFJld3JpdGUgZm9yIGNsYXJpdHkuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogSWYgdGhlIHByb2dyYW0gaGVhZGVyIHNpemUgaXMgdG9vIHNtYWxsLAotCWNhbGwgX2JmZF9lcnJvcl9oYW5kbGVyIGFuZCByZXR1cm4gZmFpbHVyZSByYXRoZXIgdGhhbiBhYm9ydGluZy4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBQYXNzIGJvb2xlYW4gdmFyaWFibGUgd2hlbgotCWNhbGxpbmcgd3JpdGVfcmVsb2NzLgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IFVzZSBCRkRfQVNTRVJUIHJhdGhlciB0aGFuIGFib3J0LgotCShzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkKTogRGVmaW5lLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IERlY2xhcmUgdmFyaWFibGVzIGluIGlubmVyCi0JYmxvY2tzLiAgUGFzcyBlbGZfaW5mb19mYWlsZWQgc3RydWN0dXJlIHdoZW4gY2FsbGluZwotCWVsZl9leHBvcnRfc3ltYm9sIGFuZCBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLgotCShlbGZfZXhwb3J0X3N5bWJvbCk6IFRyZWF0IGRhdGEgYXJndW1lbnQgYXMgZWxmX2luZm9fZmFpbGVkIHJhdGhlcgotCXRoYW4gYmZkX2xpbmtfaW5mby4gIFNldCBmYWlsZWQgZmllbGQgb24gZXJyb3IuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoc3RydWN0IGVsZl9maW5mb19mYWlsZWQpOiBEZWZpbmUuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFBhc3MgZWxmX2ZpbmZvX2ZhaWxlZCBzdHJ1Y3R1cmUgd2hlbiBjYWxsaW5nCi0JZWxmX2xpbmtfb3V0cHV0X2V4dHN5bS4gIFVzZSBCRkRfQVNTRVJUIHJhdGhlciB0aGFuIGFib3J0LgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogVHJlYXQgZGF0YSBhcmd1bWVudCBhcyBlbGZfZmluZm9fZmFpbGVkCi0JcmF0aGVyIHRoYW4gZWxmX2ZpbmFsX2xpbmtfaW5mby4gIFNldCBmYWlsZWQgZmllbGQgb24gZXJyb3IuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFVzZSBCRkRfQVNTRVJUIHJhdGhlciB0aGFuIGFib3J0LgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHdyaXRlCi0Jb3V0IFBMVFJFTFNaLCBQTFRSRUwgYW5kIEpNUFJFTCByZWxvY3MgaWYgdGhlcmUgaXMgYSAucmVsYS5wbHQKLQlzZWN0aW9uLiAgU29sYXJpcyAyLjQgYXBwYXJlbnRseSBkb2VzIG5vdCBoYW5kbGUgZW1wdHkgcmVsb2MKLQlpbmZvcm1hdGlvbiBjb3JyZWN0bHkuCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogQ2FzdCBnZXR1aWQgYW5kIGdldGdpZCByZXN1bHRzIHRvCi0JbG9uZywgYW5kIHByaW50IHdpdGggJWxkLgotCi1GcmkgTWFyIDEwIDE2OjQxOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBBbHdheXMgdXNlIHRoZSBvdXRwdXQKLQlzZWN0aW9uIGlmIGl0IGlzIG5vdCBOVUxMLgotCi1UaHUgTWFyICA5IDE1OjA2OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBJZiB0aGUgbGluZSBudW1iZXIgY291bnQgb3IKLQl0aGUgcmVsb2MgY291bnQgZG9lcyBub3QgZml0LCBwcmludCBhbiBlcnJvciBhbmQgcmV0dXJuIDAuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWNvZmZfc3dhcF9zY25oZHJfb3V0LgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUKLQlvZiBiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQuCi0KLQkqIGJmZC5jOiBJbmNsdWRlIDxzdGRhcmcuaD4gb3IgPHZhcmFyZ3MuaD4sIGRlcGVuZGluZyB1cG9uCi0JQU5TSV9QUk9UT1RZUEVTLgotCShiZmRfZXJyb3JfaGFuZGxlcl90eXBlKTogTmV3IGdsb2JhbCB0eXBlLgotCShfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9lcnJvcl9oYW5kbGVyKTogTmV3IEJGRCBwcml2YXRlIGdsb2JhbCB2YXJpYWJsZS4KLQkoYmZkX3NldF9lcnJvcl9oYW5kbGVyKTogTmV3IGdsb2JhbGx5IHZpc2libGUgZnVuY3Rpb24uCi0JKGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lKTogTmV3IGdsb2JhbGx5IHZpc2libGUgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9lcnJvcl9oYW5kbGVyKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyLAotCWFuZCB1c2UgaXQgaW5zdGVhZCBvZiBiZmRfZ2V0X3N5bWNvdW50LiAgQ2hlY2sgcl9pbmRleCBhZnRlcgotCXNldHRpbmcgcl9leHRlcm4gYmFzZWQgb24gd2hldGhlciB0aGlzIGlzIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX0lOKSk6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIsIGFuZCB1c2UgaXQKLQlpbnN0ZWFkIG9mIGJmZF9nZXRfc3ltY291bnQuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBQYXNzIGJmZF9nZXRfc3ltY291bnQgdG8gcmVsb2MKLQlzd2FwIHJvdXRpbmVzLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlcgotCXRvIGRlY2xhcmF0aW9uLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IFBhc3MKLQlpbmZvLT5keW5zeW1fY291bnQgdG8gcmVsb2Mgc3dhcCByb3V0aW5lcy4KLQkqIGFvdXQtbnMzMmsuYyAoTVlfc3dhcF9zdGRfcmVsb2NfaW4pOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyLgotCSogaHAzMDBocHV4LmMgKE1ZKHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCShNWShzbHVycF9yZWxvY190YWJsZSkpOiBQYXNzIGJmZF9nZXRfc3ltY291bnQgdG8gcmVsb2Mgc3dhcAotCXJvdXRpbmUuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsc3dhcF9leHRfcmVsb2NfaW4pKTogQWRkIHN5bWNvdW50Ci0JcGFyYW1ldGVyLgotCShOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkpOiBQYXNzIGJmZF9nZXRfc3ltY291bnQgdG8gcmVsb2MKLQlzd2FwIHJvdXRpbmVzLgotCi1UaHUgTWFyICA5IDEyOjA0OjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uIHZlY3RvciB0byBiZQotCWNhbGxlZCBieSB0aGUgbGlua2VyIHRvIG1lcmdlIGFueSBwcml2YXRlIGJmZCBkYXRhIG9mIHRoZSBpbnB1dAotCWZpbGVzIGFuZCB0aGUgb3V0cHV0IGZpbGUuICBVc2VkIGJ5IHRoZSBQb3dlclBDIEVMRiBzdXBwb3J0IHRvCi0JY2hlY2sgd2hldGhlciAtbXJlbG9jYXRhYmxlIGlzIHVzZWQgZm9yIGFsbCBtb2R1bGVzLgotCShiZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgZnVuY3Rpb24gdmVjdG9yIHRvIGJlIGNhbGxlZCBieSB0aGUKLQlhc3NlbWJsZXIgdG8gc2V0IHByaXZhdGUgZmxhZ3MuICBVc2VkIGJ5IHRoZSBQb3dlclBDIEVMRiBzdXBwb3J0Ci0JdG8gc2V0IHRoYXQgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIHdhcyBhc3NlbWJsZWQgd2l0aCB0aGUKLQktbXJlbG9jYXRhYmxlIG9wdGlvbi4KLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9DT1BZKTogQWRkIGludGlpYWxpemF0aW9uIG9mIHRoZQotCWJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIGFuZCBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MgZnVuY3Rpb24KLQl2ZWN0b3JzLgotCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC1pbi5oOiBSZWJ1aWxkIHdpdGggYmZkLmMgYW5kIHRhcmdldHMuYwotCWNoYW5nZXMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3IGZ1bmN0aW9uIHRvIHNldCB0aGUKLQlFTEYgZV9mbGFncyBmaWVsZC4KLQkocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IHRoZSBlX2ZsYWdzIGZpZWxkIGZyb20gdGhlCi0JaW5wdXQgZmlsZSB0byB0aGUgb3V0cHV0IGZpbGUuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoZWNrIGZvciBhIG1pc21hdGNoIGJldHdlZW4gdGhlCi0JZV9mbGFncyBmaWVsZCBvZiBhbGwgb2YgdGhlIGxpbmtlciBpbnB1dCBmaWxlcy4KLQotCSogbGliZWxmLmggKGVsZl9vYmpfdGRhdGEpOiBBZGQgcHBjX2ZsYWdzX2luaXQgZmllbGQgc28gdGhhdCB0aGUKLQlQb3dlclBDIHN1cHBvcnQgY2FuIGNoZWNrIGlmIGNvbXBhdGFpYmxlIGVfZmxhZ3MgYXJlIHByZXNlbnQuCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6IEFkZCBOT1AgZm9yIHRoZSBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCWFuZCBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MgZnVuY3Rpb24gdmVjdG9ycy4KLQkqIGNvZmZjb2RlLmg6IERpdHRvLgotCSogZWxmMzItdGFyZ2V0Lmg6IERpdHRvLgotCSogZWxmNjQtdGFyZ2V0Lmg6IERpdHRvLgotCSogbGliYmZkLmg6IERpdHRvLgotCSogbGliZWNvZmYuaDogRGl0dG8uCi0JKiBzb20uYzogRGl0dG8uCi0KLVdlZCBNYXIgIDggMDA6NTM6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG1pcHM6ODAwMCBlbnRyeS4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogTWFyayBhbiB1bmRlZmluZWQgQlNGX1dFQUsgc3ltYm9sIGFzCi0JU1RCX1dFQUsgcmF0aGVyIHRoYW4gU1RCX0dMT0JBTC4KLQotVHVlIE1hciAgNyAxMjoyMzo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfYWRqdXN0X3N5bW5keC4KLQkoYmZkX2NvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZS4KLQkoY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lIGFzIE5VTEwgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZCB0bwotCWNvZmZfYWRqdXN0X3N5bW5keC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBDYWxsIGNvZmZfYWRqdXN0X3N5bW5keCBpZiBpdAotCWlzIGRlZmluZWQuCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX2FkanVzdF9zeW1uZHgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUgYmVmb3JlIGluY2x1ZGluZyBjb2ZmY29kZS5oLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogU2tpcCBiaW5hcnlfdmVjIHdoZW4KLQlzZWFyY2hpbmcgdGhyb3VnaCBiZmRfdGFyZ2V0X3ZlY3Rvci4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogQ2hlY2sgU0hUX05PQklUUyBiZWZvcmUgY2hlY2tpbmcKLQlzaF9zaXplLgotCi1Nb24gTWFyICA2IDIzOjMxOjM2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogS2VlcCBTSFRfTk9CSVRTIHNlY3Rpb25zIGFmdGVyCi0JIVNIVF9OT0JJVFMgb25lcy4KLQotTW9uIE1hciAgNiAwOTo1MzowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY3B1LWhwcGEuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IFN1cHBvcnQgYm90aCBQQTEuMCBhbmQgUEExLjEKLQltYWNoaW5lIHR5cGVzLgotCShiZmRfaHBwYV9hcmNoKTogTGluayBpbiBib3RoIFBBMS4wIGFuZCBQQTEuMSBhcmNoaXRlY3R1cmUgaW5mbwotCXN0cnVjdHVyZXMuCi0JKiBsaWJocHBhLmggKGVudW0gcGFfYXJjaCk6IE5ldyBlbnVtZXJhdGlvbiB0byBkZXNjcmliZSB0aGUKLQlkaWZmZXJlbnQgdmFyaWFudHMgb2YgdGhlIFBBIGFyY2hpdGVjdHVyZS4KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogVXNlIG5ldyBlbnVtZXJhdGlvbiB0byBzZXQgbWFjaGluZQotCXR5cGUuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IElmIHRoZSBtYWNoaW5lIHR5cGUgaXMgUEExLjEsIHRoZW4gdXNlIHRoZQotCVBBMS4xIG1hY2hpbmUgaWRlbnRpZmllciBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLVRodSBNYXIgIDIgMTU6NTg6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogVHJlYXQgdGhlIGluZGV4IG9mIGEKLSAgICAgICAgYmFzZSByZWxhdGl2ZSByZWxvYyBhcyBhbiBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHJlZ2FyZGxlc3MKLSAgICAgICAgb2YgdGhlIHNldHRpbmcgb2Ygcl9leHRlcm4uCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSk6IERvdWJsZSBjaGVjayB0aGF0IHRoZQotCWNhbGxlciBpcyB3cml0aW5nIHRvIGEgdmFsaWQgc2VjdGlvbi4KLQotVGh1IE1hciAgMiAxNDozNzo1NyAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCi0JKiBiaW5hcnkuYzogQWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgYmluYXJ5IGZpbGVzLiAgTG9hZHMgdGhlIHJhdwotCWNvbnRlbnRzIG9mIHRoZSBmaWxlIGludG8gYSBkYXRhIHNlY3Rpb24gYW5kIHdyYXBzIHNvbWUgc3ltYm9scwotCWFyb3VuZCBpdC4gIFRoZSBzeW1ib2xzIGBfYmluYXJ5XzxmaWxlbmFtZT5fc3RhcnQnIGFuZAotCWBfYmluYXJ5XzxmaWxlbmFtZT5fZW5kJyBpbmRpY2F0ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZGF0YSwKLQl3aGlsZSBgX2JpbmFyeV88ZmlsZW5hbWU+X3NpemUnIGlzIGFuIGFic29sdXRlIHN5bWJvbCB3aG9zZSB2YWx1ZQotCWlzIHRoZSBzaXplIG9mIHRoZSBkYXRhLiAgPGZpbGVuYW1lPiBpcyB0aGUgbmFtZSBvZiB0aGUgYmluYXJ5Ci0JaW5wdXQgZmlsZSwgd2l0aCBhbGwgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0bwotCXVuZGVyc2NvcmVzLgotCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaF9nZXRfY29tcGF0aWJsZSk6IEFzc3VtZSB1c2VycyBrbm93cyB3aGF0Ci0JdGhleSdyZSBkb2luZyBpZiBvbmUgb2YgdGhlIGFyY2hpdGVjdHVyZXMgaXMgYmZkX2FyY2hfdW5rbm93bi4KLQotV2VkIE1hciAgMSAxNzozMDo0NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKGVsZl9wb3dlcnBjX2hvd3RvX3RhYmxlKTogRm9yIHJlbG9jYXRpb24KLQlSX1BQQ19HT1QxNiwgY2hhbmdlIGNvbXBsYWluX29uX292ZXJmbG93IHRvIGJlCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi1XZWQgTWFyICAxIDExOjUyOjU1IDE5OTUgIEphc29uIE1vbGVuZGEgIDxjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIHBvd2VycGMtKi1haXgqLgotCi1XZWQgTWFyICAxIDExOjU3OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKENPRkZfUEFHRV9TSVpFKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuaW46IFJld3JpdGUgb3V0cHV0IG9mIFRERUZBVUxUUyB0byBhdm9pZCByZWx5aW5nIG9uCi0Jc2VtYW50aWNzIG9mIHNpbmdsZSBxdW90ZXMgaW4gcGFyYW1ldGVyIHN1YnN0aXR1dGlvbi4KLQotVHVlIEZlYiAyOCAxMjo1MzowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IFNvcnQgZW1wdHkgc2VjdGlvbnMgYmVmb3JlIG5vbi1lbXB0eQotCXNlY3Rpb25zLCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgVk1BLgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWxpbnV4ZWxmKik6IE5ldyB0YXJnZXQuICBVc2UgaTM4Ni1sZWxmLgotCShpWzM0NV04Ni0qLWdudWVsZiopOiBOZXcgdGFyZ2V0LiAgVXNlIGkzODYtZ2VsZi4KLQkqIGNvbmZpZy9pMzg2LWxlbGYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnL2kzODYtZ2VsZi5tdDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgMjcgMTI6NTg6MjUgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogYWRkIGEyOWstKi12eHdvcmtzIGNvbmZpZ3VyYXRpb24uCi0KLVdlZCBGZWIgMjIgMTQ6NDA6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8KLQl1c2UgcmVsb2NfaG93dG9fdHlwZSByYXRoZXIgdGhhbiBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0LgotCi1UdWUgRmViIDIxIDE4OjE5OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSk6IERvbid0IHJldHVybiBhbiBlcnJvciBpZiBhc2tlZAotCWZvciByZWxvY2F0aW9ucyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4KLQotVHVlIEZlYiAyMSAxNToxMzowNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogSGFuZGxlIG9iamVjdHMgd2l0aCBvZGQKLQlsZW5ndGhzLgotCi1GcmkgRmViIDE3IDEyOjM0OjM2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9nb3QxNl9yZWxvYyk6IE1ha2UgR09UIHN0eWxlIHJlbG9jcyBhZGQKLQkzMjc2OCwgc28gdGhlIEdPVCBwb2ludGVyIGNhbiBwb2ludCB0byAxNjM4NCBwb2ludGVycywgaW5zdGVhZCBvZgotCTgxOTIuCi0KLUZyaSBGZWIgMTcgMTE6NDU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBob3N0cy9zeXN2NC5oOiBJbmNsdWRlIDx1bmlzdGQuaD4sIDxzdGRsaWIuaD4sIGFuZCA8dGltZS5oPi4KLQlPbmx5IGRlZmluZSBTRUVLX1NFVCBhbmQgU0VFS19DVVIgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgZGVmaW5lZC4KLQlSZW1vdmUgYWxsIGV4dGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQotCSogc3ltcy5jIChiZmRfZGVjb2RlX3N5bWNsYXNzKTogUmV0dXJuICdXJyBmb3IgYSB3ZWFrIHN5bWJvbC4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBTZXQgc3RhcnQgYWRkcmVzcyBhbmQgZmxhZ3MKLQliZWZvcmUgY2FsbGluZyBjb2ZmX21rb2JqZWN0X2hvb2suICBSZXN0b3JlIHRoZW0gb24gZmFpbHVyZS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayk6IElmIG5vdCBFQ09GRl9BT1VUX1pNQUdJQywKLQljbGVhciBEX1BBR0VELgotCi0JKiBjb2ZmZ2VuLmM6IFJlaW5kZW50ZWQuCi0KLVRodSBGZWIgMTYgMTQ6Mzc6MjMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgdXNlIGJpdHBvcyBpbiBvdmVyZmxvdwotCWNhbGN1bGF0aW9ucy4KLQkoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCi1UaHUgRmViIDE2IDEzOjIyOjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvc3RkLWhvc3QuaDogUmVtb3ZlIGFsbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgd2hpY2ggcmV0dXJuCi0JaW50IG9yIHZvaWQsIGV4Y2VwdCB0aGUgb25lIGZvciBmcmVlLgotCi1XZWQgRmViIDE1IDE0OjU0OjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKGVsZl9wb3dlcnBjX2hvd3RvX3RhYmxlKTogVXNlIGEgZGVzdGluYXRpb24gbWFzayBvZgotCTB4ZmZmZmZmZmYgZm9yIFJfUFBDX1JFTDMyLCBub3QgMC4KLQkocG93ZXJwY19yZWxvY19tYXApOiBBZGQgbG93IDE2IGJpdCwgaGlnaCAxNiBiaXQsIGFuZCBoaWdoIDE2IGJpdAotCWFkanVzdGVkIHJlbG9jYXRpb25zLgotCi1UdWUgRmViIDE0IDE3OjQ3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lKTogRGVmaW5lLgotCShtaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9maW5kX25lYXJlc3RfbGluZSk6IERlZmluZS4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBmaW5kX2xpbmVfaW5mbyBmaWVsZC4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zd2FwX3Rpcl9pbik6IE1vdmUgdG8gZWNvZmZsaW5rLmMuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCk6IExpa2V3aXNlLgotCShjbXBfZmRydGFiX2VudHJ5KTogTGlrZXdpc2UuCi0JKG1rX2ZkcnRhYik6IExpa2V3aXNlLgotCShsb29rdXApOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEp1c3QgY2FsbCBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lCi0JdG8gZG8gbW9zdCBvZiB0aGUgd29yay4gIEFsbG9jYXRlIGZpbmRfbGluZV9pbmZvIGlmIG5lY2Vzc2FyeS4KLQkqIGVjb2ZmbGluay5jOiBJbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luKTogTW92ZSBpbiBmcm9tIGVjb2ZmLmMuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCk6IExpa2V3aXNlLgotCShjbXBfZmRydGFiX2VudHJ5KTogTGlrZXdpc2UuICBVc2UgUFRSIGluc3RlYWQgb2Ygdm9pZCAqLgotCShta19mZHJ0YWIpOiBNb3ZlIGluIGZyb20gZWNvZmYuYy4gIEFkZCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLAotCWFuZCBsaW5lX2luZm8gYXJndW1lbnRzLCBhbmQgdXNlIHRoZW0gaW5zdGVhZCBvZiBlY29mZl9kYXRhLgotCShmZHJ0YWJfbG9va3VwKTogTW92ZSBpbiBmcm9tIGxvb2t1cCBpbiBlY29mZi5jLiAgUmVtb3ZlIGFiZmQKLQlhcmd1bWVudCwgYWRkIGxpbmVfaW5mbyBhcmd1bWVudC4gIFVzZSBpdCBpbnN0ZWFkIG9mIGVjb2ZmX2RhdGEuCi0JKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBOZXcgZnVuY3Rpb24sIG1vc3RseSBmcm9tIHRoZSBvbGQKLQlfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIGluIGVjb2ZmLmMuCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBSZW1vdmUgZmluZF9idWZmZXIsIGZkcnRhYl9sZW4gYW5kCi0JZmRydGFiIGZpZWxkcywgcmVwbGFjaW5nIHRoZW0gZmluZF9saW5lX2luZm8gZmllbGQuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfaW4pOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luKTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBEb24ndCB1c2UgZWNvZmYubyBmb3IgYmZkX2VsZjMyX2JpZ21pcHNfdmVjIG9yCi0JYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1UdWUgRmViIDE0IDE0OjA0OjIyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGVsZl9tYWNoaW5lX2FsdDEgYW5kCi0JZWxmX21hY2hpbmVfYWx0MiB3aGljaCBwcm92aWRlIGFsdGVybmF0ZSB2ZXJzaW9ucyBvZiB0aGUgbWFjaGluZQotCWNvZGUuCi0KLQkqIGVsZjMyLXBwYy5jIChFTEZfTUFDSElORV9BTFQxLCBFTEZfTUFDSElORV9BTFQyKTogRGVmaW5lIHRvCi0JcmVjb2duaXplIG9sZCB2ZXJzaW9ucyBvZiB0aGUgUG93ZXJQQyBtYWNoaW5lIGNvZGUuCi0KLQkqIGVsZjMyLXRhcmdldC5oIChlbGYzMl9iZWQpOiBJbml0aWFsaXplIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUKLQlmaWVsZHMgZGVmaW5lZCBieSBFTEZfTUFDSElORV9BTFQxIGFuZCBFTEZfTUFDSElORV9BTFQyLgotCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmNjRfYmVkKTogSW5pdGlhbGl6ZSBhbHRlcm5hdGUgbWFjaGluZSBjb2RlCi0JZmllbGRzIGRlZmluZWQgYnkgRUxGX01BQ0hJTkVfQUxUMSBhbmQgRUxGX01BQ0hJTkVfQUxUMi4KLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6IEluIGFkZGl0aW9uIHRvIHRoZQotCW1haW4gbWFjaGluZSBjb2RlIGZpZWxkLCBjaGVjayB0aGUgdHdvIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUKLQlmaWVsZHMuCi0KLVR1ZSBGZWIgMTQgMTI6NDY6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLiAgRG9uJ3QKLQlhY2NlcHQgTV9TUEFSQyBpZiBiZmRfYXJjaF9zcGFyYyBpcyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkCi0JYXJjaGl0ZWN0dXJlcywgYW5kIGRvbid0IGFjY2VwdCBhIDY4MHgwIG1hY2hpbmUgdHlwZSBpZgotCWJmZF9hcmNoX202OGsgaXMgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzLgotCSogYW91dDAuYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0KLU1vbiBGZWIgMTMgMjM6MjU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogRG9uJ3QgcmV0dXJuIGEgcG9pbnRlcgotCXRvIGdhcmJhZ2UgaWYgdGhlIHN5bWJvbCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAgOSAxODozNjo1MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgaTM4Nm1zZG9zLm8uCi0KLVRodSBGZWIgIDkgMTI6MDI6MzUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2bGludXguYyAoTkVFRFNfU0hSTElCKTogRGVmaW5lLgotCShsaW51eF90YWxseV9zeW1ib2xzKTogQ3Jhc2ggaWYgYSBORUVEU19TSFJMSUIgc3ltYm9sIGlzCi0JdW5kZWZpbmVkLiAgRnJvbSBoamxAbnluZXhzdC5jb20gKEguSi4gTHUpLgotCi1XZWQgRmViICA4IDE3OjI2OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBBbGxvY2F0ZSBjb21tb24KLQlzeW1ib2wgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAgRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvciBjb21tb24KLQlzeW1ib2wgc2l6ZSBvdmVyZmxvdy4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEFkanVzdCByZWZlcmVuY2VzCi0JdG8gY29tbW9uIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgbmV3IHN0cnVjdHVyZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCi1XZWQgRmViICA4IDA5OjUzOjQyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IFB1dCBTSFRfTk9CSVRTIHNlY3Rpb25zIGFmdGVyICFTSFRfTk9CSVRTLgotCi1UdWUgRmViICA3IDE2OjI3OjMzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9maW5kX25lYXJlc3RfbGluZSk6IEp1c3QgcmV0dXJuIGZhbHNlLCBkb24ndAotCWFib3J0LgotCi1UdWUgRmViICA3IDE0OjQzOjMzIDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jOiBSZWZvcm1hdHRlZCBzb21lIGNvbW1lbnRzIGFuZCBicmFjZSBjb25zdHJ1Y3RzIGluCi0JcmVjZW50IGNoYW5nZXMgdG8gR05VIHN0eWxlLgotCShjbXBfZmRydGFiX2VudHJ5LCBta19mZHJ0YWIsIGxvb2t1cCk6IFVzZSBvbGQtc3R5bGUgZnVuY3Rpb24KLQlkZWZpbml0aW9ucy4KLQotVHVlIEZlYiAgNyAxNDoyMToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl9pbik6IFplcm8gb3V0IGludGVybiBiZWZvcmUgc2V0dGluZwotCWFueSBvZiB0aGUgZmllbGRzLgotCi1Nb24gRmViICA2IDIwOjAxOjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTYXQgRmViICA0IDE0OjIwOjI0IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luLCBlY29mZl9zd2FwX3Bkcl9vdXQpOiBhZGRlZAotCWludGVybmFsaXppbmcvZXh0ZXJuYWxpemluZyBuZXcgInByb2YiIGZpZWxkLgotCi0JKiBsaWJlY29mZi5oIChlY29mZl90ZGF0YSk6IGFkZGVkIGZkcnRhYi4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEZpeGVkLgotCi1Nb24gRmViICA2IDE0OjI1OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIHNhd19uZWVkZWQgZmllbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBzYXdfbmVlZGVkIGlmCi0JRFRfTkVFREVEIHNlZW4gaW4gLmR5bmFtaWMgc2VjdGlvbi4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFdhcm4gaWYgYW4gdW5kZWZpbmVkIHN5bWJvbCBpcwotCW9ubHkgcmVmZXJlbmNlZCBmcm9tIGEgZHluYW1pYyBvYmplY3QsIGFuZCBub3QgbWFraW5nIGEgc2hhcmVkCi0Jb2JqZWN0LCBhbmQgc2F3X25lZWRlZCBpcyBmYWxzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgc2F3X25lZWRlZC4KLQotCSogbGliZWxmLmggKEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBjbGVhciBvciBzZXQKLQlFTEZfTElOS19IQVNIX0RFRklORURfV0VBSy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IGNoZWNrIEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLLgotCi0JRGlzdGluZ3Vpc2ggYSB3ZWFrIGRlZmluZWQgc3ltYm9sIGZyb20gYSByZWd1bGFyIGRlZmluZWQgc3ltYm9sLgotCSogbGlua2VyLmMgKGVudW0gbGlua19hY3Rpb24pOiBBZGQgREVGVy4KLQkobGlua19hY3Rpb24pOiBBZGQgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrIGNvbHVtbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBBZGQgREVGVyBjYXNlLiAgSGFuZGxlCi0JYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrIGluIGEgZmV3IG90aGVyIGNhc2VzLgotCSogTWFueSBmaWxlcyAoYmZkX2xpbmtfaGFzaF91bmRlZndlYWspOiBSZW5hbWVkIGZyb20KLQliZmRfbGlua19oYXNoX3dlYWsuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IEhhbmRsZSBiZmRfbGlua19oYXNoX2RlZndlYWsuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCSogYm91dC5jIChnZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jKTogTGlrZXdpc2UuCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfd3JpdGVfZ2xvYmFsX3N5bSk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IExJa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkobGludXhfdGFsbHlfc3ltYm9scyk6IExpa2V3aXNlLgotCShsaW51eF9maW5pc2hfZHluYW1pY19saW5rKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoc2V0X3N5bWJvbF9mcm9tX2hhc2gpOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkoYmZkX3BlcmZvcm1fc2xpcCk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IExpa2V3aXNlLgotCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgIDYgMDM6MjA6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBCcnlhbiBGb3JkLCBiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1OgotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1tc2RvcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChpMzg2bXNkb3NfdmVjKTogSGFuZGxlIGl0LgotCSogaTM4Nm1zZG9zLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL2kzODYtbXNkb3MubXQ6IE5ldyBmaWxlLgotCSogYmZkLmMgKGVudW0gYmZkX2Vycm9yKTogQWRkZWQgbmV3IHZhbHVlIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcuCi0JKGJmZF9lcnJtc2dzKTogQWRkZWQgc3RyaW5nIHRvIHRhYmxlLgotCSogbGliYW91dC5oIChyZWxvY190eXBlLWxvb2t1cCk6IERlY2xhcmUgaXQuCi0JKiB0YXJnZXRzLmMgKGVudW0gYmZkX2ZsYXZvdXIpOiBBZGRlZCBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIuCi0JKGkzODZtc2Rvc192ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBpdCB0byB0aGUgbGlzdC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVdlZCBGZWIgIDEgMDE6MzI6MTQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2V0X3JlbG9jX2luZm8sIGNhc2UgUl9EQVRBX09ORV9TWU1CT0wpOiBJZiB0aGVyZSdzCi0Jbm90aGluZyBpbiBSX0RBVEFfT1ZFUlJJREUsIHRoZW4gdHJ5IHRvIGZpbmQgdGhlIGFkZGVuZCBpbiB0aGUKLQlzZWN0aW9uJ3MgY29udGVudHMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBJZ25vcmUgdGhlIGFkZGVuZCBpbiBhIFJfREFUQV9PTkVfU1lNQk9MIGZpeHVwLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IE1vcmUgaGVydWlzdGljcyB0byBkZXRlY3QgdGhlCi0JYnJhaW5kYW1hZ2VkIEhQIE9TRjEgbGlua2VyLiAKLQkoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBmb3JnZXQgdG8gZnJlZSBzdWJzcGFjZV9zZWN0aW9ucyBpZiB3ZSBnZXQKLQlhbiBlcnJvci4KLQkoc29tX3NsdXJwX3N0cmluZ190YWJsZSk6IEFsbG9jYXRlIHN0cmluZ3Mgb24gdGhpcyBiZmQncyBvYnN0YWNrCi0JcmF0aGVyIHRoYW4gZGlyZWN0bHkgb3V0IG9mIHRoZSBoZWFwLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UgZm9yIHRoZSBzYXZlZCBjb3B5IG9mIHRoZQotCWNhbm9uaWNhbCBzeW1ib2xzLgotCShzb21fc2x1cnBfcmVsb2NfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIHNhdmVkIGNvcHkgb2YgdGhlCi0JY2Fub25pY2FsIHJlbG9jYXRpb25zLiAgRnJlZSB0aGUgbmF0aXZlIHJlbG9jYXRpb25zIHdoZW4gd2UncmUKLQlkb25lIHdpdGggdGhlbS4KLQotVHVlIEphbiAzMSAyMTo1MzoyOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBOZXcgbWVtYmVyIHByb2dyYW1faGVhZGVyX3NpemUuCi0JKiBlbGZjb2RlLmggKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogTmV3IHBhcmFtZXRlcnMgc29ydGVkX2hkcnMsCi0JY291bnQsIGFuZCBtYXhwYWdlc2l6ZS4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JSWYgc29ydGVkX2hkcnMgaXMgbm9uLU5VTEwsIHVzZSBpdCB0byBjb21wdXRlIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuCi0JU2F2ZSByZXN1bHQgaW4gY2FzZSBjYWxsZWQgYWdhaW4uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogU29ydCBoZWFkZXJzIGJlZm9yZSBjYWxsaW5nCi0JZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuCi0KLVR1ZSBKYW4gMzEgMTU6Mjc6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQWRkIHNvcnRlZF9oZHJzIHBhcmFtZXRlci4KLQlTZWFyY2ggdGhyb3VnaCBpdCByYXRoZXIgdGhhbiB0aHJvdWdoIHVuc29ydGVkIHNlY3Rpb24gaGVhZGVycy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBQYXNzIHNvcnRlZF9oZHJzIHRvCi0JbWFwX3Byb2dyYW1fc2VnbWVudHMuCi0KLU1vbiBKYW4gMzAgMjI6MDQ6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEZpeCBwcm9ibGVtcyBpbiByYW5nZQotCWNoZWNraW5nLiAgRXhwZWN0IGFyZ3VtZW50IE9GRlNFVCB0byBiZSBzZWN0aW9uLXJlbGF0aXZlLiAgRnJvbQotCURhdmlkIE1vc2Jlcmdlci1UYW5nLCBkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1LgotCi1Nb24gSmFuIDMwIDExOjIyOjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBEb24ndCBkbwotCWFueXRoaW5nIGlmIHdlIGFyZSBub3QgbGlua2luZyBhbiBFTEYgZmlsZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBMaWtld2lzZS4KLQotU2F0IEphbiAyOCAxMjo0ODo1NyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGNvbXBhcmVfc3Vic3BhY2VzKTogTmV3IGZ1bmN0aW9uIHRvIHNvcnQgc3Vic3BhY2VzIGJ5Ci0JdGhlaXIgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlLgotCShzZXR1cF9zZWN0aW9ucyk6IFdoZW4gY29tcHV0aW5nIHRoZSBpbmRleCBmb3IgZWFjaCBzdWJzcGFjZSwKLQloYW5kbGUgY2FzZSB3aGVyZSBzZXR1cF9zZWN0aW9ucyByZWFkcyB0aGUgc3Vic3BhY2VzIGluIGEKLQlkaWZmZXJlbnQgb3JkZXIgdGhhdCB0aGV5IGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuCi0JKHNvbV9pc19zcGFjZSk6IEFsc28gZXhhbWluZSB0aGUgb3V0cHV0IHNlY3Rpb24gZm9yIHRoZSBjb250YWluaW5nCi0Jc2VjdGlvbi4KLQkoc29tX2lzX3N1YnNwYWNlLCBzb21faXNfY29udGFpbmVyKTogTGlrZXdpc2UuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3QgcHJlcGFyZSBvciB3cml0ZSBmaXh1cHMgaGVyZS4gIFdoZW4KLQl3cml0aW5nIHRoZSBzeW1ib2wgc3RyaW5ncywgdXNlIHRoZSB1bnNvcnRlZCBzeW1ib2wgdGFibGUuCi0JKHNvbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlIGhlcmUuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IFByZXBhcmUgYW5kIHdyaXRlIHRoZSBmaXh1cHMgaGVyZS4gIExpa2V3aXNlCi0JZm9yIHRoZSBzeW1ib2wgdGFibGUuCi0JKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBVbmRlZmluZWQgc3ltYm9scyBhbHdheXMgaGF2ZQotCXR5cGUgU1NfVU5TQVQgcmVnYXJkbGVzcyBvZiBCU0ZfRVhQT1JULgotCShzb21fc2V0X3JlbG9jX2luZm8pOiBVbnBhY2sgYW5kIGF0dGFjaCBhcmd1bWVudCBsb2NhdGlvbgotCWluZm9ybWF0aW9uIGZvciBSX1BDUkVMX0NBTEwgYW5kIFJfQUJTX0NBTEwgcmVsb2NhdGlvbnMuCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogTmV3IGhldXJpc3RpYyB0byBkZXRlcm1pbmUgaWYgdGhlCi0JZW50cnkgYW5kIGZsYWdzIGZpZWxkcyBhcmUgc3dpdGNoZWQgaW4gdGhlIGV4ZWMgaGVhZGVyLgotCi1TYXQgSmFuIDI4IDAwOjE2OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgKnN5bV9oYXNoIGluc3RlYWQKLQlvZiBoIGlmIHdlIG1pZ2h0IG5vdCBiZSBkb2luZyBhbiBFTEYgbGluay4KLQotRnJpIEphbiAyNyAxNjoxMzo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IElmIHRoZSBzaXplIG9mIGFuIGlucHV0Ci0JLnJlZ2luZm8gc2VjdGlvbiBpcyB6ZXJvLCBmb3JjZSBpdCB0byB0aGUgY29ycmVjdCBzaXplLCBzaW5jZSB0aGUKLQlsaW5rZXIgZW11bGF0aW9uIGNvZGUgbWF5IGhhdmUgY2xvYmJlcmVkIGl0LgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBDb3JyZWN0IFNIRl9BTExPQyB0ZXN0LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEZyZWUgc29ydGVkX2hkcnMuCi0KLVRodSBKYW4gMjYgMDk6MDA6MTIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIHNyZWMuYyAoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IEZpeCBvZmYgYnkKLQlvbmUgZW5kIGFkZHJlc3MgY2FsY3VsYXRpb24uCi0KLQkqIGNvbmZpZy5iZmQ6IChtNjgqLWVzdC1jb2ZmKTogTmV3IGNvbmZpZ3VyYXRpb24uCi0KLVRodSBKYW4gMjYgMTE6Mzk6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgZXhhbWluZSB3ZWFrZGVmIGlmCi0Jd2UgYXJlIHVzaW5nIGFuIEVMRiBoYXNoIHRhYmxlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEFsd2F5cyBzZXQgRVhFQ19QIGlmCi0JdGhlIHN0YXJ0IGFkZHJlc3MgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIGV2ZW4gaWYgU1RBVF9GT1JfRVhFQwotCWlzIHNldC4gIEp1c3QgdXNlIFNUQVRfRk9SX0VYRUMgYXMgYW4gYWRkaXRpb25hbCB0ZXN0LgotCi1UaHUgSmFuIDI2IDExOjEyOjU0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IFVzZSBFTV9QUEMgaW5zdGVhZCBvZgotCUVNX0NZR05VU19QT1dFUlBDLgotCi0JKiBlbGYzMi1wcGMuYyAocmVsb2NfdHlwZSk6IEFkZCBhbGwgU3lzdGVtIFYuNCBhbmQgZUFCSQotCXJlbG9jYXRpb25zIGN1cnJlbnRseSBkZWZpbmVkLgotCShwb3dlcnBjX3JlbG9jX21hcCk6IEFkanVzdCB0byBuZXcgcmVsb2NhdGlvbiBuYW1lcy4KLQkoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBBZGQgbW9zdCBvZiB0aGUgbmV3IHJlbG9jYXRpb25zLgotCShFTEZfTUFDSElORV9DT0RFKTogVXNlIEVNX1BQQyBpbnN0ZWFkIG9mIEVNX0NZR05VU19QT1dFUlBDLgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgcG93ZXJwYy0qLWVhYmkuCi0KLQkqIGNvbmZpZy9wcGMtZWxmLm10OiBBZGQgcnM2MDAwIGFyY2hpdGVjdHVyZSBzdXBwb3J0IHRvIHRoZQotCVBvd2VyUEMuICBBbHNvIGFkZCBYQ09GRiBzdXBwb3J0LgotCi1XZWQgSmFuIDI1IDIzOjI2OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChDQUxDX0FEREVORCk6IERvbid0IGRlZmluZS4KLQkoY29mZl9zaF9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbi4KLQotVHVlIEphbiAyNCAxNDoyMjo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb3V0cHV0X2V4dHN5bSk6IFNldCB0aGUgdmFsdWUgb2YgdGhlCi0JRUNPRkYgc3ltYm9sIGZyb20gdGhlIGhhc2ggdGFibGUgZW50cnkuCi0KLU1vbiBKYW4gMjMgMTQ6NTM6MzUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIGNvZmYtc2guYyAoY29mZl9zaF9yZWxvY2F0ZV9zZWN0aW9uKTogIERvbid0IHN1YnRyYWN0Ci0Jdm1hIHR3aWNlLgotCi1Nb24gSmFuIDIzIDEzOjMzOjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxvYyk6IERvbid0IGlnbm9yZSB0aGUgcHJldmlvdXMgY29udGVudHMgb2YgYW4KLQlSX1NIX0lNTTMyIHJlbG9jLgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWdudSopOiBTZXQgYmZkX25hbWUgdG8gaTM4Ni1nbnUuCi0JKiBjb25maWcvaTM4Ni1nbnUubXQ6IE5ldyBmaWxlLiAgSW5jbHVkZSBFTEYgc3VwcG9ydC4KLQotCSogb3BuY2xzLmMgKGJmZF9vcGVuc3RyZWFtcik6IENhbGwgYmZkX2NhY2hlX2luaXQuCi0KLUZyaSBKYW4gMjAgMTE6NDQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IE9ubHkgc2V0IHRoZSBzdW5vcyBzcGVjaWZpYwotCWZpZWxkcyBpZiB3ZSBhcmUgZG9pbmcgYSBzdW5vcyBsaW5rLgotCi1XZWQgSmFuIDE4IDEyOjI4OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY3B1LWg4MzAwLmMgKGg4MzAwX2luZm9fc3RydWN0KTogQ2hhbmdlIG5hbWUgZnJvbSAiSDgvMzAwIiB0bwotCSJoODMwMCIgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgY3B1LSogZmlsZXMuCi0JKGg4MzAwaF9pbmZvX3N0cnVjdCk6IENoYW5nZSBuYW1lIGZyb20gIkg4LzMwMEgiIHRvICJoODMwMGgiLgotCSogY29mZi1oODMwMC5jIChzcGVjaWFsKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBkaWZmLgotCi1UdWUgSmFuIDE3IDEwOjUyOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKGJmZF9ieXRlLCByZWxvY19ob3d0b190eXBlKTogRGVmaW5lIGhlcmUsIG5vdC4uLgotCSogcmVsb2MuYyAoYmZkX2J5dGUsIHJlbG9jX2hvd3RvX3R5cGUpOiBoZXJlLgotCSogQ2hhbmdlZCBhbGwgb2NjdXJyZW5jZXMgb2YgYGBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0JycKLQl0byBiZSBgYHJlbG9jX2hvd3RvX3R5cGUnJyBpbnN0ZWFkLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaCwgbGliY29mZi5oOiBSZWJ1aWx0LgotCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5zdHJlYW1yKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi1taXBzLmMgKGVudW0gcmVsb2NfdHlwZSk6IERlZmluZSBuZXcgcmVsb2NzIHVzZWQgb24gSXJpeC4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IgbmV3IHJlbG9jcy4KLQkobWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfTVNZTSwKLQlTSFRfTUlQU19EV0FSRiwgYW5kIFNIVF9NSVBTX0VWRU5UUy4KLQkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IEhhbmRsZSBzZWN0aW9ucyBuYW1lZCAubXN5bSwgLmRlYnVnXyoKLQlhbmQgLk1JUFMuZXZlbnRzLiouCi0KLQkqIHNyZWMuYyAoc3JlY19pbml0KTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBpLgotCi1TYXQgSmFuIDE0IDE5OjA5OjQ4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQGpvbm55PgotCi0JKiBhcmNodXJlcy5jLCBNYWtlZmlsZS5pbiwgdGFyZ2V0cy5jLCBiZmQtaW4yLmgsIGNvZmZjb2RlLmgsCi0JY29uZmlnLmJmZCwgY29uZmlndXJlLmluLCBjb25maWcvdzY1Lm10OiBJbml0aWFsIHN1cHBvcnQgZm9yIHRoZSBXNjUuCi0KLVN1biBKYW4gMTUgMTM6NTc6NDUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENvbmZpZ3VyZSBmb3IgV0lOMzIuCi0KLVRodSBKYW4gMTIgMTY6MzA6NDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RzdHVmZik6IEluY2x1ZGUgYGhlYWRlcnMnLgotCi0JKiBzdW5vcy5jIChtNjhrX3BsdF9maXJzdF9lbnRyeSwgc3BhcmNfcGx0X2ZpcnN0X2VudHJ5KTogTm93Ci0JY29uc3QuCi0JKiB0ZWtoZXguYyAoZGlncyk6IERpdHRvLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9wbHQwX2VudHJ5LCBlbGZfaTM4Nl9wbHRfZW50cnkpOiBEaXR0by4KLQotCSogc3JlYy5jLCB0ZWtoZXguYzogSW5jbHVkZSBsaWJpYmVydHkuaC4gIERlbGV0ZSBzdGF0aWMgYXJyYXkKLQloZXhfdmFsdWUgYW5kIHJlcGxhY2UgcmVmZXJlbmNlcyB0byBpdCB3aXRoIHJlZmVyZW5jZXMgdG8KLQloZXhfaW5pdCwgaGV4X3AsIGFuZCBoZXhfdmFsdWUuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGFyY2h1cmVzLmMgKGFyY2h1cmVzX2luaXRfdGFibGUpOiBOb3cgY29uc3QuCi0JKGJmZF9hcmNoX2luaXQpOiBBZGp1c3RlZCB0eXBlIG9mIGxvY2FsIHZhciBgcHRhYmxlJy4KLQotVGh1IEphbiAxMiAwOTozMzoyNCAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGhvc3RzL3N5bW1ldHJ5Lmg6ICBSZWRlZmluZSBgc2hhcmVkJyB0byBlbmFibGUgY29tcGlsYXRpb24KLQl3aXRoIHRoZSBuYXRpdmUgRHluaXggY2MgY29tcGlsZXIuCi0JKiBpMzg2ZHluaXguYzogIEluY2x1ZGUgYW91dHguaCBpbnN0ZWFkIG9mIHVzaW5nIHJvdXRpbmVzCi0JZnJvbSBhb3V0MzIuYy4KLQotV2VkIEphbiAxMSAyMTozMTo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b190eXBlKTogTWFrZSB0eXBlZGVmIGluY2x1ZGUgYGNvbnN0Jy4KLQkqIGFvdXQtbnMzMmsuYywgYW91dHguaCwgYm91dC5jLCBjZi1tNjhrbHlueC5jLCBjb2ZmLWkzODYuYywKLQljb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmZsaW5rLmMsIGNwdS1uczMyay5jLCBlY29mZi5jLAotCWVsZjMyLWhwcGEuYywgZWxmMzItaTM4Ni5jLCBlbGYzMi1taXBzLmMsIGVsZjMyLXNwYXJjLmMsCi0JZWxmY29kZS5oLCBsaWJiZmQtaW4uaCwgbGlua2VyLmMsIG1pcHNic2QuYywgbmxtMzItcHBjLmMsIG9hc3lzLmMsCi0JcmVsb2MuYywgc29tLmM6IERvbid0IHVzZSBgY29uc3QnIGluIGNvbWJpbmF0aW9uIHdpdGgKLQlgcmVsb2NfaG93dG9fdHlwZScuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotCSogZWNvZmYuYyAoZWNvZmZfdHlwZV90b19zdHJpbmcpOiBMb2NhbCB2YXJpYWJsZSBgYnVmZmVyMScgZG9lc24ndAotCW5lZWQgdG8gYmUgc3RhdGljLgotCi1XZWQgSmFuIDExIDE0OjM2OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBjb3JlIGR1bXAgaWYgYSBtdWx0aXBsZQotCWRlZmluaXRpb24gb2YgYW4gYWJzb2x1dGUgc3ltYm9sIGlzIGVuY291bnRlcmVkLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJZ25vcmUKLQlyZWRlZmluaXRpb25zIG9mIGFuIGFic29sdXRlIHN5bWJvbCB0byB0aGUgc2FtZSB2YWx1ZS4KLQotTW9uIEphbiAgOSAxNTo1MTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSXQncyByZWFzb25hYmxlIGZvciBubwotCWZsYWdzIHRvIGJlIHNldCwgc28gZG9uJ3QgaW5zaXN0IG90aGVyd2lzZS4KLQotRnJpIEphbiAgNiAxNjozOTo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHNldCBCU0ZfR0xPQkFMIGZvciBhbgotCXVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQotV2VkIEphbiAgNCAxNDoxNDowNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IE9ubHkgcmV0dXJuIHNlY3Rpb25zIHdoaWNoCi0JY29ycmVzcG9uZCB0byBzdWJzcGFjZXMuCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IGZvcmdldCB0byBidW1wIHRoZQotCXRvdGFsX3N1YnNwYWNlcyB3aGVuIHdyaXRpbmcgdGhlIHVubG9hZGFibGUgc3Vic3BhY2VzLgotCi1XZWQgRGVjIDI4IDIwOjU0OjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IFVzZSBTRUNfSEFTX0NPTlRFTlRTIHRvIGlkZW50aWZ5Ci0JYnNzLWxpa2Ugc2VjdGlvbnMuCi0JKHNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShzb21fc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotVHVlIERlYyAyNyAxNDowMzo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogVHVybiBvZmYgU0VDX0hBU19DT05URU5UUyBmb3IgYnNzLWxpa2UKLQlzZWN0aW9ucy4KLQotVHVlIERlYyAyMCAxNTozMDoxMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGJmZF9kZWJ1Z19zZWN0aW9uKTogRGVsZXRlZC4KLQkoY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4KTogUmV0dXJuIGFic29sdXRlIHNlY3Rpb24gZm9yIGRlYnVnCi0Jc3ltYm9sLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IFNldCBCU0ZfREVCVUdHSU5HIGZvciBDX0ZJTEUgc3ltYm9scy4gIElmCi0JQlNGX0RFQlVHR0lORyBpcyBzZXQsIHNldCBzZWN0aW9uIHRvIE5fREVCVUcuCi0JKGNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sKTogVXNlIGFic29sdXRlIHNlY3Rpb24uCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBJbiBhc3NlcnRpb24sCi0JZm9yY2UgYWxsIHZhbHVlcyB0byB0aGUgc2FtZSB0eXBlLgotCi1UdWUgRGVjIDIwIDExOjExOjU4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaG93dG9fdGFibGUpOiBBbGwgcmVsb2NzIGdldCBhIHNwZWNpYWwgZnVuY3Rpb24uCi0JKHNwZWNpYWwpOiBOZXZlciBkbyBhbnl0aGluZyB3aGVuIGxpbmtpbmcgLXIuCi0KLVR1ZSBEZWMgMjAgMTM6NTg6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBkbyBhbnl0aGluZyBMaW51eAotCXNwZWNpZmljIGlmIHRoaXMgaXMgbm90IGEgTGludXggaGFzaCB0YWJsZS4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY0BhaWIuY29tPi4KLQotCVBhdGNoZXMgZnJvbSBra29qaW1hQG1peC5vci5qcCAoS2F6dW1vdG8gS29qaW1hKToKLQkqIG1pcHNic2QuYyAobWlwc19ob3d0b190YWJsZV9leHQpOiBDaGFuZ2Ugc2l6ZXMgb2YgbWVtb3J5IHJlbG9jcwotCWFwcGx5IHRvIGZyb20gdHdvIGJ5dGVzIHRvIGZvdXIgYnl0ZXMuCi0JKiBNWShyZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUi4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29ycmVjdCBhbmQgZXhwYW5kIHRoZQotCWxpc3Qgb2YgY2FzZXMgZm9yIHdoaWNoIHJlbG9jYXRpb24gbmVlZCBub3QgYmUgY29tcHV0ZWQuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLU1vbiBEZWMgMTkgMjM6MDk6MTYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogRGVsZXRlIGRvX2xvY2FscyBhbmQKLQlkb19nbG9iYWxzIGFyZ3VtZW50cywgYWx3YXlzIHJlYWQgc3ltYm9sIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiBmb3IKLQlnbG9iYWxzIGFuZCBsb2NhbHMuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBSZXdvcmsgdG8gb25seSByZWFkIHN5bWJvbCBleHRlbnNpb24KLQlpbmZvcm1hdGlvbiBvbmNlIGZvciBlYWNoIGlucHV0IGJmZC4gIDEwJSBpbXByb3ZlbWVudCBpbiBsaW5rZXIKLQlwZXJmb3JtYW5jZS4KLQotRnJpIERlYyAxNiAxMjoyODo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IENoZWNrCi0JYmZkX2lzX2Fic19zZWN0aW9uLCBldGMuLCBvbmx5IGFmdGVyIGNoZWNraW5nIGZvciB0aGUgc2VjdGlvbiBpbgotCXRoZSBCRkQgYW5kIGFmdGVyIGNhbGxpbmcgdGhlIGJhY2tlbmQgcm91dGluZS4KLQotV2VkIERlYyAxNCAyMDoyMTo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogT25seSB1c2Ugc2VjdGlvbiBzeW1ib2xzIHdob3NlCi0JdmFsdWUgaXMgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLCBjaGVja2luZyBvdXRwdXRfb2Zmc2V0IHdoZW4KLQl1c2luZyBvdXRwdXRfc2VjdGlvbi4gIFdoZW4gY3JlYXRpbmcgYSBuZXcgc3ltYm9sLCBzZXQgdGhlIHZhbHVlCi0JdG8gMCwgc2luY2UgQkZEIHN5bWJvbCB2YWx1ZXMgYXJlIHNlY3Rpb24gcmVsYXRpdmUuCi0KLVR1ZSBEZWMgMTMgMTM6MzE6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjcHUtejhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBNYWtlIHo4MDAyIHRoZSBkZWZhdWx0Ci0JYXJjaGl0ZWN0dXJlLgotCi1GcmkgRGVjICA5IDEyOjQzOjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZQotCWFyY2hpdmUgaXMgbm90IGFuIEVMRiBvYmplY3QsIHBhc3MgdGhlIGFyY2hpdmUgdG8gdGhlIGFkZF9zeW1ib2xzCi0JZW50cnkgcG9pbnQgYXBwcm9wcmlhdGUgZm9yIHRoZSBmaXJzdCBvYmplY3QuICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWNAYWliLmNvbT4uCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykpOiBTaW1pbGFyIGNoYW5nZSBpZiB0aGUKLQlmaXJzdCBvYmplY3QgaXMgbm90IGFuIGEub3V0IG9iamVjdC4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgY29tcHV0ZQotCXJlbG9jYXRpb24gaW4gY2FzZXMgd2hlcmUgd2Ugd29uJ3QgdXNlIGl0LgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1UaHUgRGVjICA4IDE0OjE5OjQxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHBjNTMyLW1hY2guYyAoTkFNRSk6IERlZmluZSB0byB1c2UgbnMzMmthb3V0IHByZWZpeC4KLQkqIG5zMzJrbmV0YnNkLmMgKE5BTUUpOiBEaXR0by4KLQkobnMzMmthb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lIHRvIHN0YW5kYXJkIGFvdXQtMzIKLQl2ZXJzaW9uLgotCi1GcmkgRGVjICAyIDEzOjU2OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlYWRfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dAotCW9mIG1pcHNfcmVsYXhfc2VjdGlvbi4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogQ2FsbCBtaXBzX3JlYWRfcmVsb2NzLgotCShiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9tbmlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotV2VkIE5vdiAzMCAxNDoxMjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc2guYzogVXNlIF9iZmRfZHVtbXlfdGFyZ2V0IGluc3RlYWQgb2Ygbm9fYXJjaGl2ZS4KLQotVHVlIE5vdiAyOSAxNDowMDoxOSAxOTk0ICBKLlQuIENvbmtsaW4gIDxqdGNALnJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWZyZWVic2QqKTogVXNlIGkzODYtYnNkIGFzIGJmZF9uYW1lLgotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotZnJlZWJzZCopOiBVc2UgaTM4NmJzZCBhcyBteV9ob3N0LgotCi1Nb24gTm92IDI4IDE1OjM2OjA0IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL202OGstbmJzZC5tdCAoREVGQVVMVF9WRUNUT1IpOiBzZXQgdG8gbTY4a25ldGJzZF92ZWMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRhbmNpZXMuCi0JICAoQ0ZJTEVTKTogQWRkZWQgbTY4a25ldGJzZC5jLgotCSAgKEhGSUxFUyk6IEFkZGVkIG5ldGJzZC5oLgotCi1XZWQgTm92IDIzIDE5OjIxOjQxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc2guYyAoc2hsY29mZl92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkobm9fYXJjaGl2ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLCBjb2ZmX3NldF9mbGFncyk6IEhhbmRsZQotCWxpdHRsZSBlbmRpYW4gU0guCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBzaGwuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNobGNvZmZfdmVjLgotCSogY29uZmlnL3NoLWNvZmYubXQgKFNFTEVDVF9WRUNTKTogSGFuZGxlIHNobF9jb2ZmX3ZlYy4KLQotV2VkIE5vdiAyMyAxMDo1MDoxMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBEbyBub3Qgc3VidHJhY3QgdGhlIHNlY3Rpb24ncyB2bWEgZnJvbQotCXRoZSByZWxvYydzIG9mZnNldCB3aGVuIHdyaXRpbmcgLm8ncy4gIEluc3RlYWQgYWRkIHRoZSBzZWN0aW9uJ3MKLQl2bWEgdG8gdGhlIHJlbG9jJ3Mgb2Zmc2V0IHdoZW4gd3JpdGluZyBhbiBleGVjdXRhYmxlIG9yIHNoYXJlZAotCWxpYnJhcnkuCi0KLVR1ZSBOb3YgMjIgMjM6MzQ6MzcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IERvIG5vdCBhZGQKLQlpbnB1dF9zZWN0aW9uLT52bWEgdG8gdGhlIHJlbG9jYXRpb24ncyBvZmZzZXQuCi0KLU1vbiBOb3YgMjEgMTI6Mzc6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzcmVjLmMgKHNyZWNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShzcmVjX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IERlZmluZS4KLQkoc3JlY19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0JKHNyZWNfdmVjLCBzeW1ib2xzcmVjX3ZlYyk6IFVzZSBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNyZWMpLgotCi1TYXQgTm92IDE5IDAzOjEwOjUxIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotc29sYXJpcyopOiAgVXNlIHNvbGFyaXMyIHRvCi0JZW5hYmxlIGV4dHJhY3Rpb24gb2YgcHJvY2ZzIGluZm8gZnJvbSBjb3JlIGZpbGUgZm9yIEdEQi4KLQotVGh1IE5vdiAxNyAxNzozNzozOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV90eXBlKTogQWRkIG5ldyB2YWx1ZSBCRkRfUkVMT0NfMTJfUENSRUwuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UaHUgTm92IDE3IDEzOjEyOjA4IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQvZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlZCk6IFVzZSB0aGUKLQl2bWEgZnJvbSB0aGUgb3V0cHV0X3NlY3Rpb24gY29udGFpbmluZyAkZ2xvYmFsJCB3aGVuIGNvbXB1dGluZwotCWdsb2JhbF92bGF1ZS4KLQotVGh1IE5vdiAxNyAxNDoyOToxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogUm91bmQgdXAgdGhlIGFyY2hpdmUKLQloZWFkZXIgc2l6ZSBvZiB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZSB0byBhbiBldmVuIG51bWJlci4KLQotV2VkIE5vdiAxNiAxNjowODowNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmM6IERlbGV0ZWQgc29tZSBjb2RlIHRoYXQgd2FzIGNvbW1lbnRlZCBvdXQgb3IgaW5zaWRlCi0JIiNpZiAwIi4KLQkoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQotCSogY3B1LXNoLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBDb252ZXJ0IG5hbWUgdG8gbG93ZXJjYXNlLCBmb3IKLQljb25zaXN0ZW5jeSB3aXRoIG90aGVyIGFyY2hpdGVjdHVyZXMuCi0KLVNhdCBOb3YgMTIgMjM6NTA6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9leHBvcnRfc3ltYm9sKTogQWxzbyBleHBvcnQgc3ltYm9scyB3aGljaCBhcmUKLQlyZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBmaWxlLgotCi1GcmkgTm92IDExIDE0OjI5OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZAotCWV4cG9ydF9keW5hbWljIGFyZ3VtZW50LCBhbmQgaGFuZGxlIGl0LgotCShlbGZfZXhwb3J0X3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgTm92IDExIDEwOjM1OjMzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX3N0cnVjdCk6IERlbGV0ZSBoYW5kbGVzIGZvciB0aGUKLQlkYXRhLCByZWcgYW5kIHN0YWNrIHNlY3Rpb25zLiAgVGhleSdyZSBuZXZlciB1c2VkLiAgRGVsZXRlCi0JYWNjZXNzb3IgbWFjcm9zLgotCShtYWtlX2JmZF9hc2VjdGlvbik6IFVzZSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSBzaW5jZSBkZWJ1Z2dpbmcKLQljb3JlcyBmcm9tIGR5bmFtaWMgZXhlY3V0YWJsZXMgbWF5IGhhdmUgc2V2ZXJhbCBzZWN0aW9ucyB3aXRoIHRoZQotCXNhbWUgbG9naWNhbCBuYW1lLgotCShocHV4X2NvcmVfY29yZV9maWxlX3ApOiBEb24ndCBzYXZlIGhhbmRsZXMgdG8gZGF0YSwgcmVnIGFuZAotCXN0YWNrIHNlY3Rpb25zLiAgSGFuZGxlIENPUkVfVEVYVCwgQ09SRV9NTUYgYW5kIENPUkVfU0hNLgotCi1UdWUgTm92ICA4IDEzOjAzOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChjYWxsal9jYWxsYmFjayk6IEFkZCBuZXcgYXJndW1lbnQgc2hyaW5raW5nLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBIYW5kbGUgcmVsb2NzIGFnYWluc3Qgc2VjdGlvbiBzeW1ib2xzIGNvcnJlY3RseS4gIElmIG5vdAotCXNocmlua2luZywgZG9uJ3Qgc3VidHJhY3Qgb3V0IGRzdGlkeDsgdGhlIHN1YnRyYWN0aW9uIGlzIGFscmVhZHkKLQlpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLVN1biBOb3YgIDYgMTI6NTI6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oOiBDb25kaXRpb25hbGx5IGluY2x1ZGUgPHNobC5oPiBhbmQgPGRsLmg+LgotCi1UaHUgTm92ICAzIDE4OjE5OjEzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBJbmNsdWRlIG02OGtuZXRic2Quby4KLQotCSogY29uZmlnL2kzODZsaW51eC5taCAoRVhUUkFMSUJTKTogSW5jbHVkZSAtbG0uCi0KLQlQYXRjaGVzIGZyb20gREogRGVsb3JpZToKLQkqIGNvZmYtZ28zMi5jOiBSZXBsYWNlbWVudCBmaWxlLCB1c2VzIGNvZmYtaTM4Ni5jIHdpdGggbWlub3IKLQljaGFuZ2VzLgotCSogY29mZi1pMzg2LmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogYWxsb3cgb3RoZXIgZmlsZXMgdG8gb3ZlcnJpZGUKLQl1bmRlcnNjb3JlIGFsc28KLQkqIG1ha2VmaWxlLmRvczogZGVsIGN0b3IubywgYWRkIGNvZmZsaW5rLm8gYW5kIGVsZjMyLm8KLQotCSogYW91dHguaCAoYWRqdXN0X29fbWFnaWMpOiBJZiB1c2VyIHNldCBkYXRhIHNlY3Rpb24gdm1hLCB1c2UgaXQKLQl0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgYnNzIHZtYS4gIFBhdGNoIGZyb20gVGFrYWRhIEhpcm9ha2ksCi0JaGlyb0Bpcy5zLnUtdG9reW8uYWMuanAuCi0JKG1hY2hpbmVfdHlwZSwgY2FzZSBiZmRfYXJjaF92YXgpOiBTZXQgKnVua25vd24gdG8gZmFsc2UuICBQYXRjaAotCWZyb20gSm9obiBEYXZpZCBBbmdsaW4gPGRhdmVAaGlhdWx5MS5oaWEubnJjLmNhPi4KLQotCSogY29uZmlndXJlLmluICh0Yik6IFJlbmFtZSBuczMya25ldGJzZF92ZWMgdG8gcGM1MzJuZXRic2RfdmVjLAotCXNpbmNlIHRoYXQncyB3aGF0IGl0J3MgY2FsbGVkLgotCi1XZWQgTm92ICAyIDE1OjI0OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChub3JtYWxpemUpOiBDaGFuZ2UgdG8gdGFrZSBhIEJGRCBhcyBhbiBhcmd1bWVudC4KLQlDaGFuZ2UgVk1TIHZlcnNpb24gdG8gdXNlIGJmZF9hbGxvYyByYXRoZXIgdGhhbiBtYWxsb2MsIHNvIHRoYXQgd2UKLQlkb24ndCBsb3NlIHRoZSBtZW1vcnkgZm9yZXZlci4KLQkoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IENoZWNrIHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUKLQllbnRyeSB3aGljaCBpcyBub3QgYmVpbmcgZXh0ZW5kZWQsIGFuZCBjb3JyZWN0IGl0IGlmIGl0IGlzIHdyb25nLgotCVRoaXMgaXMgbmVjZXNzYXJ5IGluIGNhc2UgdGhlIGFyY2hpdmUgd2FzIGNvbnN0cnVjdGVkIGJ5IGFub3RoZXIKLQlwcm9ncmFtIHdoaWNoIHB1dCBhbiBlbnRyeSBpbiB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZSB3aGljaCB3ZQotCWRvbid0IHBsYW4gdG8gcHV0IGluIG91cnNlbHZlcy4gIEZyb20gampjQGpjbGFyay5jb20gKEphbWVzCi0JQ2xhcmspLgotCShiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUpOiBDaGVjayByZXR1cm4gdmFsdWUgb2Ygbm9ybWFsaXplLgotCi1Nb24gT2N0IDMxIDE0OjE5OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaHBwYS5jIChFTEYzMl9QQVJJU0NfU1hfU0laRSk6IERlZmluZS4KLQkoRUxGMzJfUEFSSVNDX1NYX0dFVCwgRUxGMzJfUEFSSVNDX1NYX1BVVCk6IERlZmluZS4KLQkoc3ltZXh0bl9lbnRyeSk6IERvbid0IGRlZmluZS4KLQkoc3ltZXh0X2NoYWluX3NpemUpOiBDaGFuZ2UgdHlwZSB0byBiZmRfc2l6ZV90eXBlLgotCShzeW1leHRuX2NvbnRlbnRzKTogQ2hhbmdlIHR5cGUgdG8gYmZkX2J5dGUgKi4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBVc2UKLQlFTEYzMl9QQVJJU0NfU1hfU0laRSBpbnN0ZWFkIG9mIHNpemVvZiAoc3ltZXh0X2VudHJ5UykuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zeW1leHQpOiBMaWtld2lzZS4gIEFsc28sIGNoYW5nZSB0eXBlIG9mIHNpemVwIHRvCi0JYmZkX3NpemVfdHlwZSAqLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogQ2FzdCBzeW1leHRuX2NvbnRlbnRzIGFzc2lnbm1lbnQgdG8KLQliZmRfYnl0ZSAqLiAgVXNlIEVMRjMyX1BBUklTQ19TWF9QVVQgaW5zdGVhZCBvZiBkaXJlY3QgYXNzaWdubWVudC4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKTogVXNlCi0JRUxGMzJfUEFSSVNDX1NYX1NJWkUgaW5zdGVhZCBvZiBzaXplb2YgKHN5bWV4dF9lbnRyeVMpLiAgVXNlCi0JRUxGMzJfUEFSSVNDX1NYX0dFVCBpbnNldGFkIG9mIGRpcmVjdCBhc3NpZ25tZW50LgotCShlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBjb250ZW50cywgYW5kIGl0cwotCWFzc2lnbm1lbnQgY2FzdCwgdG8gYmZkX2J5dGUgKi4gIFVzZSBFTEYzMl9QQVJJU0NfU1hfU0laRSBpbnN0ZWFkCi0Jb2Ygc2l6ZW9mIChzeW1leHRuX2VudHJ5KS4gIFVzZSBzeW1leHRfZW50cnlTIGluc3RlYWQgb2YKLQlzeW1leHRuX2VudHJ5LiAgVXNlIEVMRjMyX1BBUklTQ19TWF9HRVQgaW5zdGVhZCBvZiBkaXJlY3QKLQlhc3NpZ25tZW50LgotCi0JKiBhcmNoaXZlLmMgKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IEFkZCB0aGUgYXIgcGFkZGluZwotCWNoYXJhY3RlciwgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQsIGV2ZW4gaWYgdGhlIG5hbWUgaXMgdGhlCi0JbWF4aW11bSBsZW5ndGguCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTb3J0IHRoZSBFTEYKLQloZWFkZXJzIGJ5IHNlY3Rpb24gYWRkcmVzcyB3aGVuIGFzc2lnbmluZyBmaWxlIHBvc2l0aW9ucy4KLQkoZWxmX3NvcnRfaGRycyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVN1biBPY3QgMzAgMTg6NTY6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ3JlYXRlIERUX0lOSVQKLQlhbmQgRFRfRklOSSBkeW5hbWljIGVudHJpZXMgYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZiBfaW5pdCBhbmQKLQlfZmluaSBzeW1ib2xzLCBub3Qgb24gdGhlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucy4gIFRoaXMgaXMKLQljb21wYXRpYmxlIHdpdGggc29tZSBTVlI0IGxpbmtlcnMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1TYXQgT2N0IDI5IDEyOjE4OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBtb3ZlIGEKLQlzeW1ib2wgd2l0aCBhIFBMVCBlbnRyeSBpbnRvIHRoZSAucGx0IHNlY3Rpb24gaWYgaXQgaXMgZGVmaW5lZCBpbgotCWEgcmVndWxhciBmaWxlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSXQncyBub3QgYW4KLQllcnJvciBpZiBhbiBlbXB0eSBhcmNoaXZlIGhhcyBubyBzeW1ib2wgdGFibGUuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCi1GcmkgT2N0IDI4IDEwOjA4OjQxIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotICAgICAgICBOZXRCU0QvbTY4ayBzdXBwb3J0LCBiYXNlZCBvbiB3b3JrIGJ5IG1pa2ViQHNub3cuZGF0YW1ldHJpY3MuY29tOiAKLQkqIGNvbmZpZy5iZmQgKG02OCotKi1uZXRic2QqKTogVXNlIG02OGstbmJzZCBhcyBiZmRfbmFtZS4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4a25ldGJzZF92ZWMpOiBBZGRlZC4KLQkqIHRhcmdldHMuYyAoYmZkX202OGtuZXRic2RfdmVjKTogQWRkZWQuCi0JKiBob3N0cy9tNjhrbmJzZC5oLCBjb25maWcvbTY4ay1uYnNkLm10LCBtNjhrbmV0YnNkLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUywgQ0ZJTEVTKTogQWRkIG02OGtuZXRic2QuYy4KLQotCW1pc2NlbGxhbmVvdXMgY2xlYW51cCByZXF1aXJlZCBieSBhbGwgbmV0YnNkIHRhcmdldHMsIGJhc2VkIG9uIHdvcmsgCi0JYnkgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT46Ci0JKiBuZXRic2QuaCAoTl9NQUdJQywgTl9TRVRfTUFHSUMsIE5fR0VUTUFHSUMsIE5fR0VUTUFHSUMyLCBOX1RYVEFERFIsCi0JICBOX1RYVE9GRiwgTl9BTElHTiwgTl9EQVRBRERSLCBOX0RBVE9GRik6IFJlbW92ZWQuICBHZW5lcmljIGEub3V0Ci0JICBkZWZpbml0aW9ucyB3b3JrLgotCSogaTM4Nm5ic2QuYywgbnMzMmtuYnNkLmMsIHNwYXJjbmJzZC5jIChfX0xEUEdTWik6IFJlbW92ZWQuCi0JICAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFVzZSBOZXRCU0QncyBtYWdpYyBudW1iZXJzCi0KLVRodSBPY3QgMjcgMTY6NTk6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIGZpZWxkIGR5bmluZHguCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogRG9uJ3QgZmluYWxpemUKLQl0aGUgLmR5bnN5bSwgLmR5bnN0ciBvciAuaGFzaCBzZWN0aW9ucyB1bnRpbCBhZnRlciB0aGUgYmFja2VuZAotCXNpemVfZHluYW1pY19zZWN0aW9ucyByb3V0aW5lLCBzbyB0aGF0IGl0IGNhbiBhZGQgZHluYW1pYyBzeW1ib2xzCi0JaWYgaXQgd2FudHMgdG8uCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IGRlZmluZSB0aGUKLQlzeW1ib2wgdG8gYmUgaW4gdGhlIC5wbHQgc2VjdGlvbiB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeQotCWlmIGl0IGlzIGEgZGVmaW5lZCBzeW1ib2wuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeSwgYWxsb2NhdGUgc3BhY2UgZm9yIGEgZHluYW1pYyBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0Ci0Jc2VjdGlvbiwgc3RvcmluZyB0aGUgaW5kZXggaW4gdGhlIGR5bmluZHggZmllbGQgb2YgdGhlIEVMRiBzZWN0aW9uCi0JZGF0YS4gIEFkanVzdCB0aGUgb3RoZXIgZHluaW5keCBmaWVsZHMgdG8gYWNjb3VudCBmb3IgdGhpcy4KLQkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmluZHgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogV2hlbiBjb3B5aW5nIGEgcmVsb2MgaW50byBhIHNoYXJlZAotCWxpYnJhcnksIHVzZSB0aGUgb3JpZ2luYWwgYWRkZW5kIGFzIGFwcHJvcHJpYXRlLiAgQ29udmVydCBhbgotCVJfU1BBUkNfMzIgcmVsb2MgaW50byBhbiBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jLiAgVXNlIHRoZSBkeW5hbWljCi0Jc3ltYm9sIGluZGV4IG9mIHRoZSBvdXRwdXQgc2VjdGlvbiwgbm90IHRoZSBub3JtYWwgc3ltYm9sIGluZGV4LgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGRpZSBpZiBhIHNlY3Rpb24gZG9lcwotCW5vdCBleGlzdCB3aGVuIHNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBkeW5hbWljIHRhZ3MuICBXcml0ZSBvdXQKLQlhIGR5bmFtaWMgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLgotCi1XZWQgT2N0IDI2IDAxOjE1OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb24pOiBEb24ndCBib3RoZXIgdG8gcmVhZCBvciB3cml0ZQotCXRoZSByZWxvY3MgaWYgdGhlcmUgYXJlbid0IGFueS4KLQotVHVlIE9jdCAyNSAxMTo0NDozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgdGVraGV4Lm8uCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogSWYgU0VMRUNUX1ZFQ1MgaXMgbm90IGRlZmluZWQsCi0JaW5jbHVkZSB0ZWtoZXhfdmVjLgotCSogdGVraGV4LmMgKE5JQkJMRSwgSVNIRVgpOiBDYXN0IGFycmF5IGFyZ3VtZW50cyB0byB1bnNpZ25lZCBjaGFyLgotCShnZXR2YWx1ZSwgZ2V0c3ltLCBvdXQpOiBMaWtld2lzZS4KLQkoZmluZF9jaHVuayk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcy4KLQkoZmlyc3RfcGhhc2UpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHMuCi0JKHBhc3Nfb3Zlcik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYWRkcmVzcy4KLQkodGVraGV4X29iamVjdF9wKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzZWN0aW9uLgotCShtb3ZlX3NlY3Rpb25fY29udGVudHMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgZnJvbSBib29sZWFuIHRvIHZvaWQuCi0JKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyB0ZGF0YSBhbmQKLQlsaXN0LgotCi0JKiBsaW5rZXIuYyAoZW51bSBsaW5rX2FjdGlvbik6IEFkZCBDSU5ELgotCShsaW5rX2FjdGlvbik6IENoYW5nZSBDT01NT05fUk9XXGluZHIgZnJvbSBNREVGIHRvIENSRUYuICBDaGFuZ2UKLQlJTkRSX1JPV1xjb21tb24gZnJvbSBNREVGIHRvIENJTkQuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSW4gQ1JFRiBjYXNlLCBoYW5kbGUgYW4KLQlleGlzdGluZyBzeW1ib2wgd2hpY2ggaXMgaW5kaXJlY3QgcmF0aGVyIHRoYW4gZGVmaW5lZC4gIEFkZCBuZXcKLQlDSU5EIGNhc2UuCi0KLU1vbiBPY3QgMjQgMTU6MzM6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JQ2hhbmdlIFMtcmVjb3JkIGJhY2tlbmQgdG8gdXNlIG11bHRpcGxlIHNlY3Rpb25zIHRvIGhhbmRsZSBnYXBzIGluCi0JZmlsZS4KLQkqIHNyZWMuYyAoc3JlY19kYXRhX2xpc3Rfc3RydWN0KTogTW92ZSBmaWVsZCBuZXh0IGZyb20gbGFzdCBwbGFjZQotCXRvIGZpcnN0LiAgQ2hhbmdlIHR5cGUgb2YgZGF0YSB0byBiZmRfYnl0ZSAqLgotCShzdHJ1Y3Qgc3JlY19zeW1ib2wpOiBEZWZpbmUuCi0JKHRkYXRhX3R5cGUpOiBSZW1vdmUgZG9uZV9zeW1ib2xfcmVhZCwgY291bnQsIHN0cmluZ3MsIHN5bWJvbF9pZHgsCi0Jc3RyaW5nX3NpemUsIHN0cmluZ19pZHguICBDaGFuZ2UgdHlwZSBvZiBzeW1ib2xzIHRvIHN0cnVjdAotCXNyZWNfc3ltYm9sICouICBBZGQgc3ltdGFpbCBhbmQgY3N5bWJvbHMuCi0JKGxvdywgaGlnaCk6IFJlbW92ZS4KLQkoc2l6ZV9zeW1ib2xzLCBmaWxsdXBfc3ltYm9scywgc2l6ZV9zcmVjLCBmaWxsdXApOiBSZW1vdmUuCi0JKHdoaXRlLCBza2lwd2hpdGUsIHBhc3Nfb3Zlciwgb2JqZWN0X3ApOiBSZW1vdmUuCi0JKHNyZWNfbWtvYmplY3QpOiBDYWxsIHNyZWNfaW5pdC4gIEFkanVzdCB0ZGF0YSBpbml0aWFsaXphdGlvbiBmb3IKLQlmaWVsZCBjaGFuZ2VzLgotCShzcmVjX2dldF9ieXRlLCBzcmVjX2JhZF9ieXRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNyZWNfbmV3X3N5bWJvbCwgc3JlY19zY2FuKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNyZWNfb2JqZWN0X3ApOiBDaGFuZ2UgdHlwZSBvZiBiIHRvIGJmZF9ieXRlLiAgRXhwbGljaXRseSBzZXQKLQl3cm9uZ19mb3JtYXQgZXJyb3IuICBDYWxsIHNyZWNfbWtvYmplY3QgYW5kIHNyZWNfc2NhbiBpbnN0ZWFkIG9mCi0Jb2JqZWN0X3AuCi0JKHN5bWJvbHNyZWNfb2JqZWN0X3ApOiBMaWtld2lzZS4gIEFsc28sIGNoYW5nZSBiIHRvIGJlIG9ubHkgdHdvCi0JYnl0ZXMuCi0JKHNyZWNfcmVhZF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IENhbGwgc3JlY19yZWFkX3NlY3Rpb24gcmF0aGVyIHRoYW4KLQlwYXNzX292ZXIuICBIYW5kbGUgemVybyBsZW5ndGggc2VjdGlvbiBjb3JyZWN0bHkuCi0JKHNldF9zZXRfYXJjaF9tYWNoKTogQ2hhbmdlIGZyb20gZnVuY3Rpb24gdG8gbWFjcm8uCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGFuZ2UgZGF0YSB0byBiZmRfYnl0ZSAqLgotCShzcmVjX3dyaXRlX3JlY29yZCk6IENoYW5nZSBkYXRhLCBlbmQgYW5kIHNyYyB0byBiZmRfYnl0ZSAqLgotCShzcmVjX3dyaXRlX2hlYWRlcik6IENoYW5nZSBidWZmZXIgYW5kIGRzdCB0byBiZmRfYnl0ZSAqLgotCShzcmVjX3dyaXRlX3NlY3Rpb24pOiBDaGFuZ2UgbG9jYXRpb24gdG8gYmZkX2J5dGUgKi4KLQkoc3JlY193cml0ZV90ZXJtaW5hdG9yKTogQ2hhbmdlIGJ1ZmZlciB0byBiZmRfYnl0ZSAqLgotCShzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBEb24ndCBjYWxsCi0Jc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cy4KLQkoc3JlY19nZXRfc3ltdGFiKTogUmV3cml0ZS4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogU2V0IHVkYXRhLmkgdG8gMCwgbm90IE5VTEwuCi0KLUZyaSBPY3QgMjEgMTY6NDM6MTMgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKG1hY2hpbmVfdHlwZSk6IGFkZGVkIE1fNjhLX05FVEJTRCBhbmQgTV9TUEFSQ19ORVRCU0QuCi0JKiBpMzg2bmV0YnNkLmMsIG5zMzJrbmV0YnNkLmMsIHNwYXJjbmV0YnNkLmM6IHJlbW92ZWQgUkNTIElkJ3MuCi0JICBjaGFuZ2VkIGhvdyBQQUdFX1NJWkUgYW5kIFNFR01FTlRfU0laRSBhcmUgZGVmaW5lZCBzbyB0aGV5IGFyZQotCSAgY29uc2lzdGFudCB3aXRoIGVhY2ggb3RoZXIuCi0JKiBuZXRic2QuaCAoTl9IRUFERVJfSU5fVEVYVCwgVEVYVF9TVEFSVF9BRERSKTogTmV0QlNEIGZpdHMgaXRzCi0JICBoZWFkZXIgaW50byB0aGUgc3RhcnQgb2YgaXRzIHRleHQgc2VnbWVudC4KLQotRnJpIE9jdCAyMSAxNzoxMzowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfQVJDSElWRSk6IEFkZCBjYXNlIGZvcgotCV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZS4KLQkoYmZkX3RhcmdldCk6IEFkZCBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLgotCSogYXJjaGl2ZS5jIChfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTmV3Ci0JZnVuY3Rpb24uCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogUmVuYW1lZCBieSBhZGRpbmcgYSBsZWFkaW5nCi0JdW5kZXJzY29yZSwgYW5kIG1hZGUgZXh0ZXJuYWxseSB2aXNpYmxlLiAgQWRkZWQgdHJhaWxpbmdfc2xhc2gKLQlhcmd1bWVudCwgYW5kIHVzZWQgaXQgaW5zdGVhZCBvZiBlbGZfc3R5bGUuICBDaGFuZ2VkIHR5cGUgb2YKLQl0YWJsZW4gdG8gYmZkX3NpemVfdHlwZSAqLgotCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBVc2UgQkZEX1NFTkQgdG8gY2FsbAotCWNvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLiAgVXNlIHRoZSByZXR1cm5lZCBuYW1lLgotCSogbGliYmZkLWluLmggKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWNsYXJlLgotCShfYmZkX25vYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlY2xhcmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogc29tLmMgKHNvbV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBhb3V0LXRhcmdldC5oIChNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOgotCURlZmluZS4KLQkqIGllZWUuYyAoaWVlZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKiBvYXN5cy5jIChvYXN5c19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQotCUZpeCB0aGUgRUxGIGxpbmtlciB0byBub3QgcmVxdWlyZSBhbiBpbnRlcnByZXRlciBpZiBubyBkeW5hbWljCi0Jb2JqZWN0cyB3ZXJlIHNlZW4sIGV2ZW4gd2hlbiBsaW5raW5nIFBJQyBjb2RlLgotCSogbGliZWxmLmggKEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBmaWVsZCBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IENyZWF0ZSBkeW5zdHIgaWYgaXQKLQlkb2Vzbid0IGFscmVhZHkgZXhpc3QuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENyZWF0ZSBkeW5hbWljIHNlY3Rpb25zIGJhc2VkIG9uCi0JZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIGZpZWxkLCBub3QgZHlub2JqIGZpZWxkLiAgRG9uJ3QgYm90aGVyIHRvCi0Jc2V0IGR5bm9iai4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBkeW5hbWljIHNlY3Rpb25zIHdlcmUKLQlhbHJlYWR5IGNyZWF0ZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgSWYgZHlub2JqIGlzIGFscmVhZHkgc2V0LCB1c2UKLQlpdDsgb3RoZXJ3aXNlLCBzZXQgaXQgdG8gdGhlIGJmZCBhcmd1bWVudC4gIERvbid0IGluaXRpYWxpemUKLQlkeW5zeW1jb3VudC4gIE9ubHkgY3JlYXRlIGR5bnN0ciBpZiBpdCBkb2VzIG5vdCBleGlzdC4gIFNldAotCWR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCB0byB0cnVlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IFNraXAgbW9zdCBvZiB0aGlzIGZ1bmN0aW9uCi0JaWYgbm8gZHluYW1pYyBvYmplY3RzIHdlcmUgc2Vlbi4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIGhhcyB0aGUKLQlFTEZfTElOS19IQVNIX05FRURTX1BMVCBmbGFnIHNldCwgbGV0IHRoZSBiYWNrZW5kIGFkanVzdCBpdC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2hhbmdlIG1vc3QgZGVjaXNpb25zIGJhc2VkIG9uIGR5bm9iaiB0bwotCWNoZWNrIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCBpbnN0ZWFkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT25seSBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGlmIGEgZHluYW1pYwotCW9iamVjdCB3YXMgc2Vlbi4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgbmV3IGZpZWxkCi0JZHluYW1pY19zZWN0aW9uc19jcmVhdGVkLiAgU2V0IGR5bnN5bWNvdW50IHRvIDEsIG5vdCAwLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwKLQllbGZfaTM4Nl9jcmVhdGVfZ290X3NlY3Rpb24gcmF0aGVyIHRoYW4gY3JlYXRpbmcgdGhlIC5nb3QgYW5kCi0JLmdvdC5wbHQgc2VjdGlvbnMuCi0JKGVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IEp1c3QgY2FsbCBlbGZfaTM4Nl9jcmVhdGVfZ290X3NlY3Rpb24gaWYKLQlhIEdPVCB0YWJsZSBpcyBuZWVkZWQsIG5vdCBiZmRfZWxmMzJfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQlPbmx5IGNyZWF0ZSB0aGUgLnJlbC5nb3Qgc2VjdGlvbiwgYW5kIG9ubHkgbWFrZSBzcGFjZSBmb3IgYSByZWxvYywKLQlmb3IgYSBnbG9iYWwgc3ltYm9sIG9yIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuICBGb3IgYQotCVJfMzg2X1BMVDMyIHJlbG9jLCBqdXN0IHNldCB0aGUJRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgZmxhZy4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV3b3JrIGluaXRpYWwgYXNzZXJ0aW9uIHRvCi0JcGVybWl0IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIG5vbiBkeW5hbWljIHN5bWJvbHMuICBDcmVhdGUgYQotCXByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5IGZvciBzdWNoIHN5bWJvbHMuICBCdXQsIGlmIG5vCi0JZHluYW1pYyBvYmplY3RzIHdlcmUgc2VlbiwgbmV2ZXIgY3JlYXRlIGEgUExUIGVudHJ5LgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBubyBkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLAotCXNraXAgbW9zdCBvZiB0aGlzIGZ1bmN0aW9uLCBhbmQgZm9yY2UgdGhlIHNpemUgb2YgdGhlIC5yZWwuZ290Ci0Jc2VjdGlvbiB0byB6ZXJvLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIGEgUl8zODZfR09UMzIgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbAotCXN5bWJvbCB3aGVuIG5vIGR5bmFtaWMgb2JqZWN0IHdhcyBzZWVuLCBpbml0aWFsaXplIHRoZSBjb250ZW50cyBvZgotCXRoZSAuZ290IHNlY3Rpb24uICBGb3IgYSBSXzM4Nl9HT1QzMiBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCBvbmx5Ci0JY3JlYXRlIGEgUl8zODZfUkVMQVRJVkUgcmVsb2Mgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4KLQlUcmVhdCBhIFJfMzg2X1BMVDMyIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZm9yIHdoaWNoIHdlIGRpZCBub3QKLQljcmVhdGUgYSBQTFQgZW50cnkgYXMgYSBSXzM4Nl9QQzMyIHJlbG9jLgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgZmlkZGxlIHdpdGggdGhlIGR5bmFtaWMKLQllbnRyaWVzIGFuZCB0aGUgUExUIGlmIHdlIHNhdyBhIGR5bmFtaWMgb2JqZWN0LgotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRml4IFJfU1BBUkNfUEMyMiBieQotCXNldHRpbmcgcmlnaHRzaGlmdCB0byAxMC4gIEZpeCBSX1NQQVJDX1dQTFQyMCBieSBzZXR0aW5nCi0JcmlnaHRzaGlmdCB0byAyLCBzaXplIHRvIDIsIGJpdHNpemUgdG8gMzAsIGFuZCBkc3RfbWFzayB0bwotCTB4M2ZmZmZmZmYuCi0JKGVsZjMyX3NwYXJjX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHRoZSBzaXplIG9mIHRoZQotCS5wbHQgc2VjdGlvbi4gIENhbGwgZWxmMzJfc3BhcmNfY3JlYXRlX2dvdF9zZWN0aW9uIHJhdGhlciB0aGFuCi0JY3JlYXRpbmcgdGhlIC5nb3Qgc2VjdGlvbi4KLQkoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogQ2FsbCBlbGYzMl9zcGFyY19jcmVhdGVfZ290X3NlY3Rpb24gaWYKLQlhIEdPVCB0YWJsZSBpcyBuZWVkZWQsIG5vdCBiZmRfZWxmMzJfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQlPbmx5IGNyZWF0ZSB0aGUgLnJlbGEuZ290IHNlY3Rpb24sIGFuZCBvbmx5IG1ha2Ugc3BhY2UgZm9yIGEKLQlyZWxvYywgZm9yIGEgZ2xvYmFsIHN5bWJvbCBvciB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LgotCVNldCB0aGUgYWxpZ25tZW50IG9mIHRoZSAucmVsYS5nb3Qgc2VjdGlvbiB0byAyLiAgRm9yIGEKLQlSX1NQQVJDX1dQTFQzMCByZWxvYywganVzdCBzZXQgdGhlIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGZsYWcuCi0JKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJld29yayBpbml0aWFsIGFzc2VydGlvbiB0bwotCXBlcm1pdCBFTEZfTElOS19IQVNIX05FRFNfUExUIG5vbiBkeW5hbWljIHN5bWJvbHMuICBDcmVhdGUgYQotCXByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGZvciBzdWNoIHN5bWJvbHMuICBCdXQsIGlmIG5vIGR5bmFtaWMKLQlvYmplY3RzIHdlcmUgc2VlbiwgbmV2ZXIgY3JlYXRlIGEgUExUIGVudHJ5LiAgSW5pdGlhbGl6ZSB0aGUgc2l6ZQotCW9mIHRoZSAucGx0IHNlY3Rpb24uCi0JKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIG5vIGR5bmFtaWMgb2JqZWN0cyB3ZXJlCi0Jc2Vlbiwgc2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24sIGFuZCBmb3JjZSB0aGUgc2l6ZSBvZiB0aGUKLQkucmVsYS5nb3Qgc2VjdGlvbiB0byB6ZXJvLiAgU3RyaXAgZW1wdHkgcmVsb2Mgc2VjdGlvbnMsIGFuZCBzdHJpcAotCWFuIGVtcHR5IC5wbHQgc2VjdGlvbi4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBhIEdPVCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsCi0Jc3ltYm9sIHdoZW4gbm8gZHluYW1pYyBvYmplY3Qgd2FzIHNlZW4sIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCi0JdGhlIC5nb3Qgc2VjdGlvbi4gIEZvciBhIEdPVCByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCBvbmx5Ci0JY3JlYXRlIGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYyB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LgotCVRyZWF0IGEgUl9TUEFSQ19XUExUMzAgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBmb3Igd2hpY2ggd2UgZGlkIG5vdAotCWNyZWF0ZSBhIFBMVCBlbnRyeSBhcyBhIFJfU1BBUkNfV0RJU1AzMCByZWxvYy4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGZpZGRsZSB3aXRoIHRoZQotCWR5bmFtaWMgZW50cmllcyBhbmQgdGhlIFBMVCBpZiB3ZSBzYXcgYSBkeW5hbWljIG9iamVjdC4KLQotVGh1IE9jdCAyMCAxMzoyODo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3Qgd29ycnkgYWJvdXQgc2VjdGlvbiBzeW1ib2xzCi0JaW4gYSBzZWN0aW9uIG5vdCBvd25lZCBieSBhbnkgQkZELgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogU2VwYXJhdGUgb3V0IGxvb3Agd2hpY2ggY2FsbHMKLQliYWNrZW5kIHJvdXRpbmUuICBDaGVjayBiZmRfc2VjdGlvbiBhbmQgY2FsbCB0aGUgYmFja2VuZCByb3V0aW5lCi0JZXZlbiBmb3IgYSBzZWN0aW9uIG5vdCBvd25lZCBieSBhbnkgQkZELgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBIYW5kbGUKLQkuYWNvbW1vbiBzZWN0aW9uLgotCi1XZWQgT2N0IDE5IDEzOjI4OjI5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogTWFrZSBuYW1lcyBmb3Igc2VjdGlvbiBudW1iZXIgYW5kCi0Jc3RvcmFnZSBjbGFzcyBzbGlnaHRseSBtb3JlIHZlcmJvc2UuICBJdCdzIG5vdCBjbGVhciBob3cgbWFueQotCWNoYXJhY3RlcnMgSSBjYW4ganVzdGlmeSB1c2luZyB1cCwgYnV0IGJlZm9yZSB0aGlzIGNoYW5nZSB0aGV5Ci0JYm90aCB3ZXJlIGFiYnJldmlhdGVkICJzYyIgd2hpY2ggaXMgKElNSE8pIGNsZWFybHkgdW5hY2NlcHRhYmxlLgotCi1XZWQgT2N0IDE5IDAxOjI2OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldCB0aGUgYmFzZSBmaWxlCi0JcG9zaXRpb24gZnJvbSB0aGUgbG93ZXN0IHNlY3Rpb24gVk1BLCBub3QgdGhlIHN0YXJ0IGFkZHJlc3MuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yCi0JaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IExpa2V3aXNlLgotCi1UdWUgT2N0IDE4IDEyOjU2OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBPbmx5IGNvcHkKLQlzdWJmb3JtYXQgdG8gYW5vdGhlciBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciBmaWxlLgotCi0JKiBiaW5hcnkuYzogTmV3IGZpbGUgZm9yIHJhdyBiaW5hcnkgb3V0cHV0IGZvcm1hdC4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFkZCBiaW5hcnkuby4KLQkoQ0ZJTEVTKTogQWRkIGJpbmFyeS5jLgotCSogdGFyZ2V0cy5jIChiaW5hcnlfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBJbmNsdWRlIGJpbmFyeV92ZWMuCi0KLQkqIHNyZWMuYyAodGRhdGFfdHlwZSk6IEFkZCBmaWVsZCB0YWlsLgotCShzcmVjX21rb2JqZWN0KTogSW5pdGlhbGl6ZSB0YWlsLgotCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU29ydCBTIHJlY29yZCBsaXN0IGJ5IGFkZHJlc3MuCi0KLU1vbiBPY3QgMTcgMTE6Mzg6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IFNvcnQgdGhlIHN5bWJvbHMgaW50byBhIG5ldyBhcnJheSwKLQlyYXRoZXIgdGhhbiBtZXNzaW5nIHdpdGggRWxmX1N5bV9FeHRyYS4gIFN0b3JlIHRoZSBzeW1ib2wgaW5kZXggaW4KLQl0aGUgdWRhdGEuaSBmaWVsZC4KLQkoc3dhcF9vdXRfc3ltcyk6IFVzZSBvdXRib3VuZF9zeW1zIGFzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhcyBhbgotCWFycmF5LiAgRG9uJ3Qgd29ycnkgYWJvdXQgZWxmX3N5bV9udW0uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9zeW1fZXh0cmEpOiBEb24ndCBkZWZpbmUuCi0JKEVsZl9TeW1fRXh0cmEpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIHN5bV9leHRyYSBmaWVsZC4KLQkoZWxmX3N5bV9leHRyYSk6IERvbid0IGRlZmluZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBVc2UKLQl1ZGF0YS5pIHJhdGhlciB0aGFuIGVsZl9zeW1fZXh0cmEgYXJyYXkuCi0KLQkqIHN5bXMuYyAoYXN5bWJvbCk6IENoYW5nZSB1ZGF0YSBmaWVsZCBpbnRvIGEgdW5pb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkpOiBVc2UgdWRhdGEucCByYXRoZXIKLQl0aGFuIGp1c3QgdWRhdGEuCi0JKiBib3V0LmMgKHBlcmZvcm1fc2xpcCk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IExpa2V3aXNlLgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfcGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCi0JKiBzcmVjLmMgKGZpbGx1cF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChnZXRfaW5kZXgpOiBVc2UgdWRhdGEuaSByYXRoZXIgdGhhbiBqdXN0IHVkYXRhLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChzZXRfaW5kZXgpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IExpa2V3aXNlLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZ2V0X3N5bV9pbmRleCwgZWNvZmZfc2V0X3N5bV9pbmRleCk6IExpa2V3aXNlLgotCSogc29tLmMgKGNvbXBhcmVfc3ltcyk6IExpa2V3aXNlLgotCShzb21fcHJlcF9mb3JfZml4dXBzKTogTGlrZXdpc2UuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBMaWtld2lzZS4KLQotCVVzZSBhIGhhc2ggdGFibGUgd2hlbiB3cml0aW5nIG91dCBFTEYgc3ltYm9sIG5hbWVzLgotCSogZWxmY29kZS5oIChlbGZfc3RyaW5ndGFiX2luaXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfbmV3X3N0cnRhYiwgYmZkX2FkZF90b19zdHJ0YWIsIGJmZF9hZGRfMl90b19zdHJ0YWIpOiBSZW1vdmUuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzIHRvIHVzZSBlbGZfc3RyaW5ndGFiX2luaXQgb3IKLQlfYmZkX3N0cmluZ3RhYl9hZGQsIGFuZCBnZXQgc3RyaW5ndGFiIGxlbmd0aHMgdXNpbmcKLQlfYmZkX3N0cmluZ3RhYl9zaXplLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENoYW5nZSBpZ25vcmVkIGFyZ3VtZW50IHRvIHBvaW50ZXIgdG8KLQlib29sZWFuLCBhbmQgc2V0IHRoZSBib29sZWFuIHRvIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJzLiAgSWYgYW4KLQllcnJvciBoYXMgYWxyZWFkeSBvY2N1cnJlZCwgZG9uJ3QgZG8gYW55dGhpbmcuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBKdXN0IHNldCBzaF9zaXplLCBub3QgY29udGVudHMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBQYXNzIHRoZSBhZGRyZXNzIG9mIGEKLQlib29sZWFuIHRvIGVsZl9mYWtlX3NlY3Rpb25zLiAgUGFzcyB0aGUgYWRkcmVzcyBvZiBhCi0JYmZkX3N0cnRhYl9oYXNoIHRvIHN3YXBfb3V0X3N5bXMuICBXcml0ZSBvdXQgdGhlIC5zdHJ0YWIgc2VjdGlvbi4KLQkocHJlcF9oZWFkZXJzKTogQ2hhbmdlIHNoc3RydGFiIHRvIGJmZF9zdHJ0YWJfaGFzaC4KLQkoc3dhcF9vdXRfc3ltcyk6IFRha2UgYSBwb2ludGVyIHRvIGEgYmZkX3N0cnRhYl9oYXNoIGFzIGFuCi0JYXJndW1lbnQuICBTZXQgaXQgdG8gdGhlIHN5bWJvbCBuYW1lcy4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24KLQloZWFkZXIgbmFtZXMgdXNpbmcgX2JmZF9zdHJpbmd0YWJfZW1pdC4KLQkoZWxmX2RlYnVnX3NlY3Rpb24pOiBSZW1vdmUgZmlyc3QgYXJndW1lbnQ7IGdldCB0aGUgc2VjdGlvbiBuYW1lCi0JdmlhIHRoZSBiZmRfc2VjdGlvbiBwb2ludGVyLiAgQ2hhbmdlIGNhbGxlci4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogV3JpdGUgb3V0IHRoZSBzeW1ib2wgbmFtZXMgdXNpbmcKLQlfYmZkX3N0cmluZ3RhYl9lbWl0LiAgTGlrZXdpc2UgZm9yIHRoZSAuZHluc3RyIHNlY3Rpb24gY29udGVudHMuCi0JRnJlZSB0aGUgc3ltYm9sIG5hbWVzIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBSZW1vdmUgdGhlIGxhc3QgYXJndW1lbnQsIG91dHB1dF9uYW1lcywKLQlmcm9tIHJlbG9jYXRlX3NlY3Rpb24uICBTYXZlIHRoZSBvbGQgc3ltYm9sIGNvbnRlbnRzIGJlZm9yZQotCWNhbGxpbmcgZWxmX2xpbmtfb3V0cHV0X3N5bSwgYW5kIHJlc3RvcmUgdGhlbSBhZnRlcndhcmQuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBDaGFuZ2UgZHluc3RyIGZpZWxkIHRvCi0Jc3RydWN0IGJmZF9zdHJ0YWJfaGFzaC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgbGFzdCBhcmd1bWVudCwgb3V0cHV0X25hbWVzLAotCWZyb20gZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBmaWVsZC4KLQkoc3RydWN0IHN0cnRhYik6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBDaGFuZ2Ugc3RydGFiX3B0ciBmaWVsZCB0byBzdHJ1Y3QKLQliZmRfc3RydGFiX2hhc2guCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBsYXN0Ci0JYXJndW1lbnQsIG91dHB1dF9uYW1lcy4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGxpYmJmZC1pbi5oIChERUZBVUxUX1NUUklOR19TUEFDRV9TSVpFKTogRG9uJ3QgZGVmaW5lLgotCShiZmRfYWRkX3RvX3N0cmluZ190YWJsZSk6IERvbid0IGRlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5jIChiZmRfYWRkX3RvX3N0cmluZ190YWJsZSk6IFJlbW92ZS4KLQotCSogZWxmY29kZS5oIChlbGZfc3dhcF9zaGRyX2luKTogVXNlIGJmZF9zZWN0aW9uLCBub3QgcmF3ZGF0YS4KLQlDbGVhciBjb250ZW50cyBmaWVsZC4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSW4gU0hUX1NUUlRBQiBjYXNlLCBjaGVjayBiZmRfc2VjdGlvbiwKLQlub3QgcmF3ZGF0YS4gIERvbid0IHNldCByYXdkYXRhIGlmIGVfc2hzdHJuZHguICBVc2UgYmZkX3NlY3Rpb24KLQlyYXRoZXIgdGhhbiByYXdkYXRhIGluIGNvbW1lbnRlZCBvdXQgY29kZS4gIEluIFNIVF9SRUxbQV0gY2FzZSwKLQlkb24ndCBib3RoZXIgdG8gY2hlY2sgZWxmX3NlY3Rpb25fZGF0YSBvZiBzZWN0aW9uIHJldHVybmVkIGJ5Ci0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleC4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgYmZkX3NlY3Rpb24sIG5vdCByYXdkYXRhLiAgRG9uJ3Qgc2V0Ci0Jc2l6ZS4KLQkoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3Qgc2V0IGVsZl9udW1fc2VjdGlvbl9zeW1zLiAgRG9uJ3QgY3JlYXRlCi0Jc2VjdGlvbiBzeW1ib2xzIHRoYXQgYWxyZWFkeSBleGlzdC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBVc2UgYmZkX3NlY3Rpb24sIG5vdCByYXdkYXRhLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogSnVzdCBjaGVjayBiZmRfc2VjdGlvbiBmaWVsZC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfZGVidWdfc2VjdGlvbik6IERvbid0IHByaW50IHJhd2RhdGEsIGNvbnRlbnRzLCBvciBzaXplLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBlcnJvciBvdXQgaWYKLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4IHJldHVybnMgTlVMTC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2hlY2sgcmV0dXJuIHZhbHVlIGZyb20KLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4IGFnYWluc3QgTlVMTCwgbm90IGJmZF9pc19hYnNfc2VjdGlvbi4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgY2hlY2sgc2VjdGlvbl9mcm9tX2VsZl9pbmRleCByZXR1cm4KLQl2YWx1ZS4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbW92ZSBudW1fc2VjdGlvbl9zeW1zIGZpZWxkLgotCShlbGZfbnVtX3NlY3Rpb25fc3ltcyk6IERvbid0IGRlZmluZS4KLQkqIGVsZi5jIChlbGZfZ2V0X3N0cl9zZWN0aW9uKTogU3RvcmUgc2VjdGlvbiBjb250ZW50cyBpbiBjb250ZW50cwotCWZpZWxkIHJhdGhlciB0aGFuIHJhd2RhdGEgZmllbGQuCi0JKGVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbik6IExpa2V3aXNlLgotCShfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogU3RvcmUgQkZEIHNlY3Rpb24gcG9pbnRlciBpbgotCWJmZF9zZWN0aW9uIGZpZWxkIHJhdGhlciB0aGFuIHJhd2RhdGEgZmllbGQuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IFVzZSBiZmRfc2VjdGlvbgotCXJhdGhlciB0aGFuIHJhd2RhdGEuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBEb24ndCBzZXQKLQlzeW1leHRuX2hkci0+c2l6ZTsganVzdCB1c2Ugc2hfc2l6ZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZSBiZmRfc2VjdGlvbgotCXJhdGhlcm4gdGhhbiByYXdkYXRhLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogUmVtb3ZlIHJhd2RhdGEgY2hlY2suCi0KLQkqIHNyZWMuYyAocGFzc19vdmVyKTogU2V0IHRoZSBzdGFydCBhZGRyZXNzIGZvciBTNywgUzggb3IgUzkuCi0KLUZyaSBPY3QgMTQgMTk6MTU6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogVXBkYXRlZCB0byAyLjUuCi0KLUZyaSBPY3QgMTQgMTE6MDc6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogQ2FzdCBlbmQgdG8gYmUgbm9uIGNvbnN0IGJlZm9yZSBwYXNzaW5nIGl0Ci0JdG8gc3RydG91bC4KLQotVGh1IE9jdCAxMyAxNDo0MDo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBQYXNzIGVuZCBhcmd1bWVudCBvbiB0byBzdHJ0b3VsLgotCi1XZWQgT2N0IDEyIDE2OjQ2OjQzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9wbmNscy5jIChiZmRfcmVhbGxvYyk6IERlbGV0ZWQsIHNpbmNlIGl0J3MgYnJva2VuIGFuZCBmaXhpbmcgaXQKLQl3b3VsZCBtYWtlIGl0IHNsb3cuICBCZXNpZGVzLCBpdCBpc24ndCB1c2VkIG11Y2guCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IEFsd2F5cyBhbGxvY2F0ZSBuZXcgc3RvcmFnZSBmb3IgdGhlCi0Jc3ltYm9sIHRhYmxlLgotCi1XZWQgT2N0IDEyIDExOjU0OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogTWFyayBsb2NhbCBzdFByb2MsIHN0TGFiZWwgb3IKLQlzdGFicyBzeW1ib2xzIGFzIEJTRl9ERUJVR0dJTkcuCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogTWFrZQotCXN0cjEgYW5kIHN0cjIgY29uc3QgcG9pbnRlcnMuCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlIHRvcCBsZXZlbCBpbnN0YWxsLnNoIHNjcmlwdC4KLQkqIGNvbmZpZy9SRUFETUUgKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvZGVsdGE4OC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2djQubWggKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvaXJpeDQubWggKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvaXJpeDUubWggKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvbmNydDMwMDAubWggKElOU1RBTEwpOiBSZW1vdmUuCi0KLVR1ZSBPY3QgMTEgMTM6NTc6NTYgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljQGFuZGFudGUuYWliLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBNYWtlIHN1cmUgdGhhdCBhIHN5bWJvbAotCXdpdGggYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IG9yIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUKLQllbnRyeSBpcyBhZGRlZCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaGFzCi0JYWxyZWFkeSBnb3R0ZW4gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSwgY2hhbmdlIHRoZQotCWRlZmluaXRpb24gdG8gdGhlIFBMVCBlbnRyeS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi1UdWUgT2N0IDExIDE3OjEyOjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbHlueC1jb3JlLmMgKGx5bnhfY29yZV9maWxlX3ApOiBTUEFSQyBMeW54IGFwcGVhcnMgdG8gc3RhcnQKLQlkdW1waW5nIHRoZSAuZGF0YSBzZWN0aW9uIGluIGEgY29yZSBmaWxlIGF0IGEgcGFnZSBib3VuZGFyeS4KLQotTW9uIE9jdCAxMCAxNjoyNDo0NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IENhc3QgYXJndW1lbnQgdG8gYmZkX2hfcHV0XzMyCi0JdG8gY29ycmVjdCB0eXBlLgotCShjb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogQ2FzdCBhcmd1bWVudCB0byBiZmRfaF9nZXRfMzIgdG8gY29ycmVjdAotCXR5cGUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBDYXN0IGFyZ3VtZW50IHRvCi0JYmZkX2VsZl9oYXNoIHRvIGNvcnJlY3QgdHlwZS4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogVGhlIFBDMTAsIFBDMjIsIGFuZAotCVdQTFQzMCByZWxvY2F0aW9ucyBhcmUgUEMtcmVsYXRpdmUuCi0KLVRodSBPY3QgIDYgMTI6NTc6MjYgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogYW91dHguaCAoYWRqdXN0X29fbWFnaWMpOiBDb3JyZWN0bHkgaW5pdGlhbGl6ZSB2bWEgaWYgdGhlIHZtYSBvZgotCXRoZSB0ZXh0IHNlY3Rpb24gd2FzIHVzZXItZGVmaW5lZC4KLQotV2VkIE9jdCAgNSAxNDo0MjoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogU1ZSNCB1c2VzIHNsYXNoCi0JbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUsIG5vdCBqdXN0IG5ld2xpbmUuCi0KLVR1ZSBPY3QgIDQgMTE6MjM6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50Ci0JcG93ZXIgdG8gNCwgcmF0aGVyIHRoYW4gdXNpbmcgYWxpZ25fcG93ZXJfbWluLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEb24ndCB1c2UgYWxpZ25fcG93ZXJfbWluOwotCXVzZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgaW5zdGVhZC4gIEZvcmNlIHRoZSAuc3RhYgotCWFuZCAuc3RhYnN0ciBzZWN0aW9ucyB0byBiZSBhbGlnbmVkIHRvIG5vIG1vcmUgdGhhbiAyLiAgUmVtb3ZlCi0JQ09GRl9TUEFSQyBzcGVjaWFsIGNhc2VzLgotCSogY29mZi1hMjlrLmM6IERlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIuCi0JKiBjb2ZmLWFwb2xsby5jLCBjb2ZmLWdvMzIuYywgY29mZi1oODMwMC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtaDg1MDAuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLW04OGsuYywgY29mZi1yczYwMDAuYywgY29mZi1zaC5jLCBjb2ZmLXNwYXJjLmM6IExpa2V3aXNlLgotCSogY29mZi13ZTMyay5jLCBjb2ZmLXo4ay5jOiBMaWtld2lzZS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgJHtjb25maWdfc2hlbGx9IHdoZW4gcnVubmluZyBjb25maWcuYmZkLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgdHJ5IHRvIGNvbnZlcnQgYSBsb25nCi0JZmlsZW5hbWUgaWYgdGhlIG9mZnNldCBmaWVsZCBpcyB6ZXJvLgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBJZiB0aGUgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbAotCXdhcyBub3Qgc2V0LCB1c2UgYSBzZW5zaWJsZSBkZWZhdWx0IHJhdGhlciB0aGFuIHplcm8uCi0KLU1vbiBPY3QgIDMgMTY6MDQ6MjkgMTk5NCAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Nsb3NlKTogSG9ub3IgdW1hc2sgd2hlbiBzZXR0aW5nIGV4ZWN1dGlvbiBiaXRzLgotCShiZmRfY2xvc2VfYWxsX2RvbmUpOiBMaWtld2lzZS4KLQotTW9uIE9jdCAgMyAwNDo0MTo0OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIFNldCBTRUNfSEFTX0NPTlRFTlRTIGZsYWcKLQlmb3IgLnN0YWNrIGFuZCAubGRpbmZvIHNlY3Rpb25zLiBDYXN0IGNvcmVkYXRhLmNfdGFiIHRvIGEKLQlmaWxlX3B0ciB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIGdjYy4KLQotRnJpIFNlcCAzMCAxMzoxMTozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogUmVtb3ZlIGFzc2VydGlvbiB3aGVuIGEgbm9uCi0gICAgICAgIFNFQ19JTl9NRU1PUlkgc2VjdGlvbiBpcyBmb3VuZCBpbiBkeW5vYmouICBUaGlzIGNhbiBoYXBwZW4gd2hlbgotCWxpbmtpbmcgUElDIGNvbXBpbGVkIGNvZGUuCi0KLVRodSBTZXAgMjkgMTU6MjE6NDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IENoYW5nZSB0eXBlIG9mICJkYXRhIiB0bwotCWJmZF9ieXRlICosIHRvIGdvIGFsb25nIHdpdGggeWVzdGVyZGF5J3MgY2hhbmdlLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBNb3ZlZCBoZXJlIGZyb20gZWxmX3ByaW50X3N5bWJvbAotCWluIGVsZmNvZGUuaC4gIChjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsKTogUHJpbnQgc3ltYm9sJ3Mgc2l6ZQotCWZpZWxkLCBleGNlcHQgZm9yIGNvbW1vbiBzeW1ib2xzOyBwcmludCB0aGVpciBhbGlnbm1lbnQuCi0JKiBlbGZjb2RlLmggKGVsZl9wcmludF9zeW1ib2wpOiBEZWxldGVkLgotCSogbGliZWxmLmggKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX2VsZnszMiw2NH1fcHJpbnRfc3ltYm9sKTogUmVwbGFjZSBkZWNsYXJhdGlvbnMgd2l0aCBtYWNyb3MuCi0KLQkqIHN5bXMuYyAoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IFNob3cgQlNGX0xPQ0FMIGFuZCBCU0ZfR0xPQkFMCi0JaW4gb25lIGNvbHVtbi4gIFVzZSB0aGUgY29sdW1uIGZyZWVkIHVwIHRvIHNob3cgQlNGX0ZVTkNUSU9OIGFuZAotCUJTRl9GSUxFLgotCi1UaHUgU2VwIDI5IDEyOjI5OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc3ltcy5jIChzdHQpOiBBZGQgLnJkYXRhIGFuZCAucm9kYXRhLgotCi1XZWQgU2VwIDI4IDEzOjM1OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IENhc3QgZGF0YV9zdGFydCB0byBiZmRfYnl0ZSAqCi0JYmVmb3JlIHRyeWluZyB0byBhZGQgdmFsdWVzIHRvIGl0LgotCi1UdWUgU2VwIDI3IDE2OjQ3OjU4IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBDYXN0Ci0JcmV0dXJuIHZhbHVlIGZyb20gZWxmX3N5bV9leHRyYS4KLQkoZWxmMzJfaHBwYV9idWlsZF9zdHVicyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20gYmZkX3phbGxvYy4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBtYWxsb2MuCi0KLQkqIGdlbi1hb3V0LmMgKG1haW4pOiBEZWNsYXJlIGFuZCBpbml0aWFsaXplICJhcmNoIi4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ2FzdCByZXR1cm4gdmFsdWUgb2YKLQliZmRfaGFzaF9hbGxvY2F0ZS4KLQotCSogcmlzY2l4LmMgKHJpc2NpeF9jYWxsYmFjayk6IFVzZSBQQVJBTVMgbWFjcm8gaW4gcHJvdG90eXBlLgotCi0JKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLCBtb3N0bHkgY29waWVkCi0JZnJvbSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhZGp1c3RlZCBmb3IgdGhlIGFzc2VtYmxlcidzIG5lZWRzLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotTW9uIFNlcCAyNiAxMTowMDoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBbGlnbiB0aGUKLQlzZWN0aW9uIFZNQSBhbmQgdGhlIGZpbGUgcG9zaXRpb24gZXZlbiBpZiBEX1BBR0VEIGlzIG5vdCBzZXQuCi0KLQkqIGJmZC1pbi5oIChiZmRfc2Vlayk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byBub3QgbWFyayBmcCBjb25zdC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IERvbid0IG1hcmsgcGFyYW1ldGVycyBjb25zdCwgdG8gYXZvaWQKLQljb25mbGljdHMgd2l0aCBkZWNsYXJhdGlvbi4KLQotRnJpIFNlcCAyMyAxNToxNTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBEb24ndCBhYm9ydCBpZiB3ZSBhbGxvY2F0ZWQKLQl0b28gbXVjaCBzcGFjZSBmb3IgdGhlIHByb2dyYW0gaGVhZGVyLCBvbmx5IGlmIHdlIGFsbG9jYXRlZCB0b28KLQlsaXR0bGUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogU2ltaWxhciBjaGFuZ2UuCi0KLVR1ZSBTZXAgMjAgMTM6MTc6MDcgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0Lmg6IEZpeCBjb21tZW50LgotCSogbnMzMmtuYnNkLmg6IENoYW5nZWQgTV9OUzMyS19ORVRCU0QgdG8gTV81MzJfTkVUQlNEIHRvIG1hdGNoCi0JICBsaWJhb3V0LmguCi0KLVR1ZSBTZXAgMjAgMTU6MjM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHNwYXJjbmV0YnNkLm8uCi0JKENGSUxFUyk6IEFkZCBuczMya25ldGJzZC5jIGFuZCBzcGFyY25ldGJzZC5jLgotCSogdGFyZ2V0cy5jOiBuczMya25ldGJzZF92ZWMgd2FzIHJlbmFtZWQgdG8gcGM1MzJuZXRic2RfdmVjLgotCi0JKiBjb2ZmLXNoLmMgKHJ0eXBlMmhvd3RvKTogUmVtb3ZlOyB1bnVzZWQuCi0JKGNvZmZfc2hfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgcnN0YXQuCi0JKHJlbG9jX3Byb2Nlc3NpbmcpOiBDb21tZW50IG91dDsgdW51c2VkLgotCi1GcmkgU2VwIDE2IDEyOjEyOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IElmIGgtPmluZHggaXMgLTIsIHRoZW4KLQlhbHdheXMgd3JpdGUgaXQgb3V0IGV2ZW4gaWYgaXQgd291bGQgbm9ybWFsbHkgYmUgc3RyaXBwZWQuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IElmIHdlIGZpbmQgYSByZWxvYyBhZ2FpbnN0IGEKLQlzdHJpcHBlZCBnbG9iYWwgc3ltYm9sLCBmb3JjZSBpdCB0byBiZSB3cml0dGVuIG91dCByYXRoZXIgdGhhbgotCW1lcmVseSBjYWxsaW5nIHVuYXR0YWNoZWRfcmVsb2MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi1XZWQgU2VwIDE0IDE1OjM3OjE5IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoc3RydWN0IHNvbWRhdGEpOiBOZXcgZmllbGQgc29ydGVkX3N5bXMuCi0JKG9ial9zb21fc29ydGVkX3N5bXMpOiBBY2Nlc3NvciBtYWNyby4KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogSW5pdGlhbGl6ZSBzb3J0ZWRfc3ltcyB0byBOVUxMLgotCShzb21fcHJlcF9mb3JfZml4dXBzKTogU29ydCBhIGNvcHkgb2YgdGhlIEJGRCdzIHN5bWJvbCB0YWJsZTsKLQlzdG9yZSB0aGUgc29ydGVkIHN5bWJvbCB0YWJsZSBpbiBzb3J0ZWRfc3ltcy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEluaXRhbGl6ZSB0bXBfcmVsb2MgdG8gTlVMTCB0byBtYWtlIEdDQyBoYXBweS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBTaW1pbGFybHkgZm9yIGV4ZWNfaGVhZGVyLiAgUGFzcyB0aGUgc29ydGVkCi0Jc3ltYm9sIHRhYmxlIHRvIHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncy4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBVc2UgdGhlIHNvcnRlZCBzeW1ib2xzIHJhdGhlcgotCXRoYW4gdGhlIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUuCi0KLQkqIHNvbS5oIChzb21fc3ltYm9sX3R5cGUpOiBBZGQgInN0cmluZ3RhYl9vZmZzZXQiIGZpZWxkLgotCSogc29tLmMgKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyk6IFVzZSAic3RyaW5ndGFiX29mZnNldCIKLQlyYXRoZXIgdGhhbiBkZXN0cm95aW5nIHRoZSAibmFtZSIgZmllbGQgaW4gdGhlIEJGRCBzeW1ib2wuCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgMTQgMTU6MDY6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFJlbmFtZSBza2lwX2luZGlyZWN0IHRvCi0Jc2tpcF9uZXh0LiAgSWYgd2UgZmluZCBhbiBOX1dBUk5JTkcgc3ltYm9sIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4KLQl3cml0dGVuIG91dCwgc2V0IHNraXBfbmV4dC4KLQotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX3RkYXRhKTogQWRkIGZpZWxkIGZpbmRfYnVmZmVyLgotCSogZWNvZmYuYzogSW5jbHVkZSBhb3V0L3N0YWJfZ251LmguCi0JKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSGFuZGxlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogS2VlcCBhIHN5bWJvbCBtYXJrZWQgYXMgd2VhawotCWV2ZW4gaWYgaXQgaXMgcmVmZXJlbmNlZCBieSBhbm90aGVyIG9iamVjdC4KLQotVHVlIFNlcCAxMyAxNzo1NzowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9maXh1cF9mb3JtYXRzKTogQ2FzZSBSX0VOVFJZICgweGIzKSwgc2V0IGJvdGgKLQknVCcgYW5kICdVJyB0byBncmFiIGFsbCB0aGUgdW53aW5kIGluZm9ybWF0aW9uLgotCShzb21fc2V0X3JlbG9jX2luZm8pOiBNYWtlICdVJyB1bndpbmQgYml0cyBwZXJzaXN0IGFjcm9zcwotCW11bHRpcGxlIFNPTSByZWxvY2F0aW9ucy4gIFNldCB0aGUgYWRkZW5kIGZpZWxkIG9mIGFuIFJfRU5UUlkKLQlyZWxvY2F0aW9uIHRvIHRoZSB2YWx1ZSBpbiAnVCc7IHNldCB0aGUgYWRkZW5kIGZpZWxkIG9uIGFuCi0JUl9FWElUIHJlbG9jYXRpb24gdG8gdGhlIHZhbHVlIGluICdVJy4KLQotCSogc29tLmggKHNvbV9zeW1ib2xfdHlwZSk6IERlbGV0ZSB1bndpbmQgZmllbGQuCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogRm9yIFJfRU5UUlkgZml4dXBzLCBnZXQgMzJiaXRzIG9mCi0JdW53aW5kIGluZm9ybWF0aW9uIGZyb20gdGhlIGFkZGVuZCBmaWVsZCBvZiB0aGUgUl9FTlRSWSwgZ2V0IHRoZQotCW90aGVyIDMyYml0cyBmcm9tIHRoZSBhZGRlbmQgZmllbGQgb2YgdGhlIFJfRVhJVC4KLQkoYmZkX3NvbV9hdHRhY2hfdW53aW5kX2luZm8pOiBEZWxldGUgZnVuY3Rpb24gYW5kIGFsbCByZWZlcmVuY2VzLgotCi0JKiBzb20uaCAoc29tX3N5bWJvbF90eXBlKTogRGVsZXRlIHVudXNlZCBhLm91dC1yZWxhdGVkIGZpZWxkcy4KLQotCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFVzZSBiZmRfYWJzX3NlY3Rpb25fcHRyCi0JaW5zdGVhZCBvZiAmYmZkX2Fic19zZWN0aW9uLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IEhhbmRsZSBleGVjX2VudHJ5IGFuZCBleGVjX2ZsYWdzIGJlaW5nCi0Jc3dpdGNoZWQgaW4gZXhlY3V0YWJsZXMgY3JlYXRlZCBieSB0aGUgT1NGMSBsaW5rZXIuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9FWElUIGp1c3QgbGlrZSB0aGUgUl97RixMLFJ9U0VMCi0JZml4dXBzLiAgU3VwcG9ydCBSX0FMVF9FTlRSWSAoaGFuZGxlIGp1c3QgbGlrZSBSX0VYSVQpLgotCi1UdWUgU2VwIDEzIDE2OjA0OjA3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBzeW1lbnRfYmFzZSBpcyB1bnNpZ25lZAotCXNvIGNhbid0IGNvbXBhcmUgLXZlIG51bWJlcnMgd2l0aCBpdC4KLQotTW9uIFNlcCAxMiAyMDozMToxNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHNoY29mZl92ZWMpOiBVc2UgY29mZmxpbmsubyBub3cuCi0JKiBjb2ZmLXNoLmM6IFJld3JpdHRlbiB0byB1c2UgbmV3IGZhc3QgY29mZiBiYWNrZW5kLgotCi1UdWUgU2VwIDEzIDE2OjIzOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogRG9uJ3QgYXNzdW1lIHRoYXQgYWxsIHRoZSBpbnB1dAotICAgICAgICBmaWxlcyBhcmUgYS5vdXQuCi0KLVR1ZSBTZXAgMTMgMTE6MDk6MzkgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMtKi1uZXRic2QpOiB1c2Ugc3BhcmNuYnNkLgotCSAgKG5zMzJrLSotbmV0YnNkKTogdXNlIG5zMzJrbmJzZC4KLQotCSogaG9zdHMve25ic2QsaTM4Nm5ic2QsbnMzMmtuYnNkLHNwYXJjbmJzZH0uaDogTmV3IGZpbGVzLCBOZXRCU0QKLQkgIGhvc3Qgc3VwcG9ydC4KLQotCSogc3BhcmNuZXRic2QuYzogTmV3IGZpbGUsIGFkZHMgc3VwcG9ydCBmb3IgTmV0QlNEL3NwYXJjLgotCSogY29uZmlnL3NwYXJjLW5ic2QubXQ6IExpa2V3aXNlLgotCi0JKiBuZXRic2QuaDogTmV3IGZpbGUsIGRlZmluaXRpb25zIGNvbW1vbiB0byBhbGwgbmV0YnNkIHBvcnRzLgotCSogaTM4Nm5ldGJzZC5jOiBVc2UgaXQuCi0gICAgICAgICogbnMzMmtuZXRic2QuYzogVXNlIGl0LgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCB0YXJnZXRzLmMsIGNvbmZpZy9pMzg2LW5ic2QubXQsCi0JICBjb25maWcvbnMzMmstbmJzZC5tdDogY2Fub25pY2FsaXplIG5ldGJzZCB0YXJnZXRzIHRvIGNvbmZvcm0gdG8KLQkgIGZpbGUvdmFyaWFibGUgbmFtaW5nIGNvbnZlbnRpb25zLgotCSogaTM4Nm5ldGJzZC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIG5ldGJzZDM4Ni5jLgotCSogbnMzMmtuZXRic2QuYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBuZXRic2Q1MzIuYy4KLQkKLU1vbiBTZXAgMTIgMjE6NTY6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcmVsb2Nfc2tpcCk6IENvcnJlY3Qgb2ZmLWJ5LW9uZSBlcnJvciBmb3IgNC1ieXRlCi0JUl9OT19SRUxPQ0FUSU9OIGZpeHVwcy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogUmV0dXJuIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIGlmIHRoZQotCXN5bWJvbCBpc24ndCBjb250YWluZWQgaW4gYW55IHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU1RfUFJJX1BST0cgYW5kIFNUX1NFQ19QUk9HIHN5bWJvbHMgYXJlCi0Jbm90IGZ1bmN0aW9uIHN5bWJvbHMgKHRoZXkgYXJlIG1hZ2ljIGNvZGUgbGFiZWxzIHdoaWNoICpjYW4qIGJlIHRoZQotCXRhcmdldHMgb2YgY3Jvc3Mgc3BhY2UgYnJhbmNoZXMpLiAgJFNUQVJUJCBpcyBub3QgYSBzZWN0aW9uIHN5bWJvbC4KLQotTW9uIFNlcCAxMiAxMTo0MzowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogQWRkIFNFQ19DT0RFIGFuZCBTRUNfREFUQQotCXRvIHNlY3Rpb25fZmxhZ3MuCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbGl0dGxlX3ZlYywgZWNvZmZfYmlnX3ZlYyk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBTZXQgdGhlIHR5cGUgb2YgYW4gdW5kZWZpbmVkIHN5bWJvbAotCXRvIFNUVF9GVU5DIGlmIHRoZSBCU0ZfRlVOQ1RJT04gZmxhZyBpcyBzZXQuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBJZiByX3N5bW5keCBpcyAtMSwgZG9uJ3QKLQljaGFuZ2UgaXQuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiByX3N5bW5keCBpcyAtMSwgaXQgaXMgYW4KLQlhYnNvbHV0ZSByZWxvYy4gIERvbid0IGR1bXAgY29yZSB1c2luZyByX3N5bW5keCBhcyBhbiBhcnJheSBpbmRleC4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWZpbmUuCi0JKGx5bnhfbGlua19hZGRfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24gKGNvcHkgb2YgZnVuY3Rpb24gaW4KLQljb2ZmLWkzODYuYykuCi0JKGNvZmZfbTY4a19seW54cnR5cGVfdG9faG93dG8pOiBzeW0gYXJndW1lbnQgbWF5IGJlIE5VTEwuCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgYW4gcl9zeW1uZHgKLQl2YWx1ZSBvZiAtMSwgbWVhbmluZyBhbiBhYnNvbHV0ZSByZWxvYy4KLQotCSogY3Rvci5jOiBSZW1vdmU7IG9ic29sZXRlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IFJlbW92ZSBjdG9yLm8uCi0JKENGSUxFUyk6IFJlbW92ZSBjdG9yLmMuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotTW9uIFNlcCAxMiAwMTo1ODo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiB0aGVyZSB3YXMgYSBsaW5rCi0JZXJyb3Igb2Ygc29tZSBzb3J0IChmb3IgZXhhbXBsZSwgdW5kZWZpbmVkIHN5bWJvbHMpLCB0aGVuIGRvIG5vdAotCWFwcGx5IGFueSByZWxvY3MsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIG9mIHRoZSBlcnJvcnMuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogRG8gbm90IGJ1aWxkIGEgc3ltYm9sCi0JZXh0ZW5zaW9uIHNlY3Rpb24gZm9yIGFuIGV4ZWN1dGFibGUgKGl0J3MgdXNlbGVzcykuCi0JKGVsZjMyX2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBEbyBub3RoaW5nIGlmIHRoZXJlIHdhcyBhCi0JbGluayBlcnJvciBvZiBzb21lIHNvcnQgKGZvciBleGFtcGxlLCB1bmRlZmluZWQgc3ltYm9scykuCi0JKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IEtsdWRnZS4gIFR1cm4gb2ZmIFNFQ19IQVNfQ09OVEVOVFMKLQlmb3IgYWxsIHRoZSBpbnB1dCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb25zIHRvIGtlZXAgdGhlIGdlbmVyaWMKLQlCRkQgY29kZSBoYXBweS4gIFRlbXBvcmFyaWx5IHR1cm4gaXQgb24gdG8gcmVhZCB0aGUgY29udGVudHMgb2YKLQl0aGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLgotCi1TdW4gU2VwIDExIDIxOjU4OjU5IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvaHBwYW9zZi5taCAoUkFOTElCKTogRG8gbm90IHNldC4KLQkqIGNvbmZpZy9ocHBhYnNkLm1oIChSQU5MSUIpOiBMaWtld2lzZS4KLQotU3VuIFNlcCAxMSAyMjo1MDo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNmLWkzODZseW54LmM6IFJlbW92ZSAjaWYgMCBjb2RlLgotCShpMzg2X2x5bnhvc19jb2ZmX29iamVjdF9wKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KLQkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJZgotCWNvZmZfcmVsb2NhdGVfc2VjdGlvbiBpcyBkZWZpbmVkLCBvbmx5IGRlZmluZSB0aGlzIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scywgY29mZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBIYW5kbGUKLQliZmRfaW5kaXJlY3RfbGlua19vcmRlciBleHBsaWNpdGx5LCByYXRoZXIgdGhhbiB2aWEKLQlfYmZkX2RlZmF1bHRfbGlua19vcmRlci4KLQkoc2V0X3N5bWJvbF9mcm9tX2hhc2gpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IFN5bWJvbCBzZXR0aW5nIGNvZGUgbW92ZWQKLQl0byBzZXRfc3ltYm9sX2Zyb21faGFzaDsgY2FsbCBpdC4KLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogQWRkIGdlbmVyaWNfbGlua2VyIGFyZ3VtZW50LgotCUNoYW5nZSBhbGwgY2FsbGVycy4gIElmIGZhbHNlLCBzZXQgdGhlIGdlbmVyaWMgc3ltYm9scyBiYXNlZCBvbgotCXRoZSBoYXNoIHRhYmxlIGVudHJpZXMuCi0KLUZyaSBTZXAgIDkgMTE6NTE6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X3N5bXRhYik6IFJlaW5kZW50ZWQuICBSZW1vdmVkIGNvbW1lbnRlZCBvdXQKLQljYWxsIHRvIGJmZF9jb25zdHJ1Y3Rvcl9lbnRyeS4KLQotCUNvbnZlcnQgbTY4ayBDT0ZGIHRvIHVzZSBuZXcgQ09GRiBiYWNrZW5kIGxpbmtlci4KLQkqIGNvZmYtbTY4ay5jIChjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBjZi1tNjhrbHlueC5jIChjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lLgotCShjb2ZmX202OGtfbHlueF9ydHlwZV90b19ob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb25maWd1cmUuaW4gKG02OGtjb2ZmX3ZlYyk6IEJ1aWxkIGNvZmZsaW5rLm8uCi0JKG02OGtjb2ZmdW5fdmVjLCBtNjhrbHlueF9jb2ZmX3ZlYyk6IExpa2V3aXNlLgotCi1UaHUgU2VwICA4IDE2OjIwOjM4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcywgY2FzZSBSRUxCWVRFKTogRmxhZwotCW92ZXJmbG93cyBjb3JyZWN0bHkuCi0KLVdlZCBTZXAgIDcgMTk6MDE6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2Ugc2Vjb25kIGFyZ3VtZW50IG9mCi0JZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rIHRvIGJvb2xlYW4uCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxpbmtlciBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBQYXNzIHZhbHVlIG9mCi0JdGRhdGEgbGlua2VyIGZpZWxkIHRvIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcsIHJhdGhlciB0aGFuIE5VTEwuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IGNhbGwgZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rLiAgU2V0Ci0JdGRhdGEgbGlua2VyIGZpZWxkIHRvIHRydWUuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBDaGFuZ2UgdHlwZSBvZgotCXNlY29uZCBhcmd1bWVudCB0byBib29sZWFuLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JTGlrZXdpc2UuCi0KLQkqIGNvZmYtZ28zMi5jIChSVFlQRTJIT1dUTyk6IEZ1bGx5IHBhcmVudGhlc2l6ZSBhcmd1bWVudHMuCi0JKiBjb2ZmLWk5NjAuYyAoUlRZUEUySE9XVE8pOiBMaWtld2lzZS4KLQkqIGNvZmYtbTg4ay5jIChSVFlQRTJIT1dUTyk6IExpa2V3aXNlLgotCSogY29mZi13ZTMyay5jIChSVFlQRTJIT1dUTyk6IExpa2V3aXNlLgotCi0JTWFrZSBpMzg2IENPRkYgdXNlIG5ldyBDT0ZGIGJhY2tlbmQgbGlua2VyLgotCSogY29mZi1pMzg2LmMgKFJUWVBFMkhPV1RPKTogRnVsbHkgcGFyZW50aGVzaXplIGFyZ3VtZW50cy4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWd1cmUuaW4gKGkzODZjb2ZmX3ZlYyk6IFVzZSBjb2ZmbGluay5vLgotCShpMzg2bHlueF9jb2ZmX3ZlYyk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvLgotCShiZmRfY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZS4KLQkoY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZSB0byB1c2UgUlRZUEUySE9XVE8sIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogQWxsb2NhdGUgc2VjdGlvbl9jb3VudCArIDEKLQlzZWN0aW9uX2luZm8gc3RydWN0dXJlcywgc2luY2UgdGhlIHRhcmdldF9pbmRleCBpcyAxIGJhc2VkLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2V0ICpzZWNwcCB0byBiZmRfY29tX3NlY3Rpb25fcHRyIGZvciBhCi0JY29tbW9uIHN5bWJvbC4gIEFkanVzdCByZWxfaGFzaCBieSB0aGUgb3V0cHV0IHJlbG9jIGNvdW50LgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSogbGliY29mZi1pbi5oIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotVHVlIFNlcCAgNiAyMzoyODo1MiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBUcmVhdCB1bmRlZmluZWQgY29kZQotCXN5bWJvbHMgYW5kIHVuZGVmaW5lZCBzeW1ib2xzIHdoaWNoIG5vIHR5cGUgaW4gdGhlIHNhbWUgbWFubmVyCi0JaWYgdGhlIGFzc29jaWF0ZWQgQkZEIHN5bWJvbCBoYXMgQlNGX0ZVTkNUSU9OIHNldC4gIEZvciBhIGRlZmluZWQKLQlzeW1ib2wgd2hpY2ggbm8gdHlwZSwgc2VsZWN0IGEgU09NIHR5cGUgYmFzZWQgb24gdGhlIGZsYWdzIG9mIHRoZQotCXNlY3Rpb24gY29udGFpbmluZyB0aGUgc3ltYm9sLgotCShzb21fc2x1cnBfc3ltYm9sX3R5cGUpOiBTZXQgQlNGX0ZVTkNUSU9OIGZvciB1bmRlZmluZWQgU1RfU1RVQgotCW9yIFNUX0NPREUgc3ltYm9scyAoaW1wb3J0aW5nIGEgbm9uLWZ1bmN0aW9uIGNvZGUgc3ltYm9sIGlzCi0JbWVhbmluZ2xlc3MgaW4gU09NKS4KLQkoc29tX3NldF9yZWxvY19pbmZvKTogRG9uJ3Qgc2V0ICJvZmZzZXQiIHRvIHRoZSBzZWN0aW9uJ3Mgdm1hOyBpdAotCXNob3VsZCBhbHdheXMgc3RhcnQgYXQgemVyby4KLQotVHVlIFNlcCAgNiAxNDo1MToxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlBZGQgbmV3IHN0eWxlIGxpbmtlciBzdXBwb3J0IHRvIENPRkYgYmFja2VuZC4gIGEyOWsgb25seSBmb3Igbm93LgotCSogY29mZmxpbmsuYzogTmV3IGZpbGUuCi0JKiBsaWJjb2ZmLWluLmg6IEluY2x1ZGUgYmZkbGluay5oLgotCShvYmpfY29mZl9leHRlcm5hbF9zeW1zLCBvYmpfY29mZl9zdHJpbmdzKTogRGVmaW5lIGFjY2Vzc29yIG1hY3JvLgotCShvYmpfY29mZl9zeW1faGFzaGVzKTogRGVmaW5lIGFjY2Vzc29yIG1hY3JvLgotCShzdHJ1Y3QgY29mZl90ZGF0YSk6IEFkZCBmaWVsZHMgZXh0ZXJuYWxfc3ltcywgc3RyaW5ncywgYW5kCi0Jc3ltX2hhc2hlcy4KLQkoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGNvZmZfbGlua19oYXNoX2xvb2t1cCwgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UpOiBEZWZpbmUuCi0JKGNvZmZfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scywgX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBfYmZkX3JlbHN6LAotCV9iZmRfY29mZl9zd2FwX3JlbG9jX2luLCBfYmZkX2NvZmZfc3ltX2lzX2dsb2JhbCwKLQlfYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAotCV9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uLgotCShiZmRfY29mZl9yZWxzeiwgYmZkX2NvZmZfc3dhcF9yZWxvY19pbik6IERlZmluZS4KLQkoYmZkX2NvZmZfc3ltX2lzX2dsb2JhbCk6IERlZmluZS4KLQkoYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRGVmaW5lLgotCShiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShjb2ZmX21rb2JqZWN0X2hvb2spOiBJbml0aWFsaXplIG9ial9yYXdfc3ltZW50X2NvdW50IGFuZAotCW9ial9jb252X3RhYmxlX3NpemUuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2V0IHRhcmdldF9pbmRleCBvZiBhbGwKLQlzZWN0aW9ucy4gIFNldCBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHNldCB0YXJnZXRfaW5kZXg7IG5vdyBkb25lIGJ5Ci0JY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICBSZW1vdmUgb2Jzb2xldGUgaGFuZGxpbmcgb2YKLQlzY25fYmFzZSBhbmQgZGF0YV9iYXNlLiAgRG9uJ3QgYm90aGVyIHRvIGNoZWNrIHRoYXQgdGFyZ2V0X2luZGV4Ci0JaXMgcG9zaXRpdmUsIHNpbmNlIGl0IGFsd2F5cyBpcy4gIFJlbW92ZSB1c2Ugb2YgcGFkLCB3aGljaCBpcwotCWFsd2F5cyB6ZXJvLiAgQ2hlY2sgb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdCBiZmRfZ2V0X3N5bWNvdW50LAotCWZvciB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIGJ1dCBvbmx5IHdyaXRlIHRoZW0gb3V0IGlmCi0JYmZkX2dldF9zeW1jb3VudCBpcyBub24temVyby4gIERvbid0IGNoZWNrIG9ial9yYXdfc3ltZW50X2NvdW50Ci0JdW50aWwgYWZ0ZXIgY29mZl93cml0ZV9zeW1ib2xzIGlzIGNhbGxlZC4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBVc2Ugb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAotCWJmZF9nZXRfc3ltY291bnQgZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scy4gIERvbid0IHNldAotCW9ial9jb252X3RhYmxlX3NpemUuCi0JKGNvZmZfc3ltX2lzX2dsb2JhbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24gb3IgbWFjcm8uCi0JKGNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBDYWxsIGNvZmZfc3dhcF9yZWxvY19pbiwgbm90Ci0JYmZkX3N3YXBfcmVsb2NfaW4uCi0JKGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJZiBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaXMKLQlkZWZpbmVkLCBkZWZpbmUgYXMgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUuCi0JKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBTaW1pbGFyIGNoYW5nZS4KLQkoY29mZl9iZmRfZmluYWxfbGluayk6IFNpbWlsYXIgY2hhbmdlLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUgYXMgTlVMTCBpZiBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IERvbid0IHNldCBvYmpfcmF3X3N5bWVudF9jb3VudAotCWFuZCBvYmpfY29udl90YWJsZV9zaXplIGhlcmUuCi0JKGNvZmZfY291bnRfbGluZW51bWJlcnMpOiBSZWluZGVudC4gIElmIGJmZF9nZXRfc3ltY291bnQgaXMgemVybywKLQlhZGQgdXAgdGhlIGxpbmUgbnVtYmVycyBmcm9tIHRoZSBzZWN0aW9ucy4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogU2V0IG9ial9yYXdfc3ltZW50X2NvdW50LCBub3QKLQliZmRfZ2V0X3N5bWNvdW50LgotCShjb2ZmX3BvaW50ZXJpemVfYXV4KTogRG9uJ3QgcG9pbnRlcml6ZSBhIG5vbnBvc2l0aXZlIHhfZW5kbmR4Ci0JZmllbGQuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogVXNlIG9ial9yYXdfc3ltZW50X2NvdW50LCBub3QKLQliZmRfZ2V0X3N5bWNvdW50LgotCShjb2ZmX3ByaW50X3N5bWJvbCk6IElmIGF1eHAtPmZpeF9lbmQsIHByaW50IHhfZW5kbmR4IHZhbHVlLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3JlbG9jX2luKTogUmVuYW1lIGZyb20gYmZkX3N3YXBfcmVsb2NfaW4uCi0JUmVpbmRlbnQuICBDaGFuZ2UgYXJndW1lbnQgdHlwZSB0byAgUFRSLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluIChhMjlrY29mZl9iaWdfdmVjKTogQ29tcGlsZSBjb2ZmbGluay5vLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZmxpbmsuby4KLQkoQ0ZJTEVTKTogQWRkIGNvZmZsaW5rLmMuCi0KLVR1ZSBTZXAgIDYgMTQ6MDA6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCwgY2FzZSBiZmRfc3ltYm9sX3ByaW50X2FsbCk6IENoZWNrCi0JZm9yIHNlY3Rpb24gc3ltYm9sLCBhbmQgcHJpbnQgaXRzIGF1eCBmaWVsZHMgd2l0aCBhcHByb3ByaWF0ZQotCWxhYmVscy4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZGVkIGNwdS1hcm0uby4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IFJlY29nbml6ZSB0aGUgQVJNIHByb2Nlc3Nvci4KLQkqIGFyY2h1cmVzLmMsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5ob3N0LCBsaWJhb3V0LmgsIHJlbG9jLmMsCi0JdGFyZ2V0cy5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEFSTS4KLQkqIGNwdS1hcm0uYywgcmlzY2l4LmMsIGNvbmZpZy9yaXNjaXgubWgsIGNvbmZpZy9yaXNjaXgubXQ6IE5ldyBmaWxlcy4KLQotCSogYW91dHguaCAoYWRkX3RvX3N0cmluZ3RhYmxlKTogQ2hlY2sgdGhhdCBzdHIgaXNuJ3QgYSBOVUxMIHBvaW50ZXIuCi0KLUZyaSBTZXAgIDIgMTQ6MTA6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogUmV3cm90ZSBkZWZpbml0aW9uIHRvIHVzZQotCW5ldyAiY2hldyIgY29tbWFuZHMgZm9yIHNpbXVsdGFuZW91cyBkZWZpbml0aW9uIG9mIGVudW1lcmF0b3IgYW5kCi0JZW51bWVyYXRvciBuYW1lIHRhYmxlLgotCShiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSk6IE5ldyBmdW5jdGlvbiwgZm9yIHJldHJpZXZpbmcgYSBzeW1ib2xpYwotCW5hbWUgYXNzb2NpYXRlZCB3aXRoIGFuIGVudW1lcmF0b3IuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotVHVlIEF1ZyAzMCAyMToyNDo1NCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMsIGNhc2UgUl9FTlRSWSk6IEhhbmRsZSBjYXNlIHdoZXJlIG5vCi0JdW53aW5kIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgotCi1UdWUgQXVnIDMwIDExOjQzOjMwIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCBzb25hbWUKLQlhcmd1bWVudCwgYW5kIHVzZSBpdCB0byBzZXQgRFRfU09OQU1FIGR5bmFtaWMgZW50cnkuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgcHJvdG90eXBlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgQXVnIDI2IDE1OjQ3OjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBTZXQgb2JqX3Jhd19zeW1lbnRfY291bnQuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogVmVyaWZ5IG9ial9yYXdfc3ltZW50X2NvdW50LCByYXRoZXIKLQl0aGFuIHNldHRpbmcgaXQuCi0KLVRodSBBdWcgMjUgMTA6NDQ6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6IFJlbW92ZSBob3N0IGRlcGVuZGVuY2llcy4KLQotCSogYW91dHguaCAoYWRkX3RvX3N0cmluZ3RhYik6IENoZWNrIGZvciBfYmZkX3N0cmluZ3RhYl9hZGQgZXJyb3IKLQliZWZvcmUgYWRkaW5nIEJZVEVTX0lOX1dPUkQuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IExvb2sgZm9yIHRoZSBiZXN0IENfRklMRSwKLQlub3QgbWVyZWx5IHRoZSBmaXJzdC4KLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IElmIHdlIGFyZSBub3QgdXNpbmcgdGhlCi0Jc3ltYm9sLCBjbGVhciB0aGUgbmFtZSBzbyB0aGF0IGl0IGlzIG5vdCBwdXQgaW4gdGhlIHN0cmluZyB0YWJsZS4KLQlGcm9tIEFudHRpLk1pZXR0aW5lbkBudGMubm9raWEuY29tLgotCi1XZWQgQXVnIDI0IDExOjQ5OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IENhc3QgcG9pbnRlciBkaWZmZXJlbnQgdG8gbG9uZwotCWFuZCB1c2UgJWxkIHRvIHByaW50IGl0LgotCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfY29yZV9maWxlX3ApOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCi0JZHNlY2NudC4KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX2V4dF9vdXQpOiBJZiBFQ09GRl82NCwgY2xlYXIgcmVtYWluaW5nCi0JYnl0ZXMgaW4gYml0czIuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWcuYmZkOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogU2V0IG9ial9jb252X3RhYmxlX3NpemUgaGVyZSwKLQlyYXRoZXIgdGhhbiB3YWl0aW5nIHVudGlsIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IEp1c3QgaWdub3JlIEJTRl9ERUJVR0dJTkcgc3ltYm9scy4KLQlGcm9tIEFudHRpLk1pZXR0aW5lbkBudGMubm9raWEuY29tLgotCi0JKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogRml4IGZhaWx1cmUgY2hlY2sgb2YKLQliZmRfbWFrZV9lbXB0eV9zeW1ib2wuICBGcm9tIEFudHRpLk1pZXR0aW5lbkBudGMubm9raWEuY29tLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IFVzZSB0aGUgb3V0cHV0X3NlY3Rpb24KLQkoYW5kIG91dHB1dF9vZmZzZXQpIGlmIHRoZXJlIGlzIG9uZS4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IERpc2NhcmQgdGhlIHN5bWJvbHMKLQlpZiB0aGUgYXJjaGl2ZSBlbGVtZW50IHdhcyBub3QgbmVlZGVkLgotCi0JKiBhb3V0eC5oIChhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogRW5zdXJlIHRoYXQgYSB6ZXJvIHN0cmluZwotCWluZGV4IHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHVzZSBuYW1lCi0JZnJvbSBvcmlnaW5hbCBoYXNoIHRhYmxlIGVudHJ5LCBub3QgZnJvbSBlbnRyeSBpbiAqc3ltX2hhc2guCi0KLQkqIGFvdXR4LmggKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBmaWVsZHMgY29udGVudHMsCi0JcmVsb2NzLCBzeW1ib2xfbWFwIGFuZCBvdXRwdXRfc3ltcy4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogV29yayBvdXQgdGhlIGxhcmdlc3Qgc2VjdGlvbiBzaXplLCByZWxvYwotCXNpemUsIGFuZCBudW1iZXIgb2Ygc3ltYm9scy4gIFVzZSB0aGVtIHRvIHByZWFsbG9jYXRlIGJ1ZmZlcnMgdGhhdAotCWFyZSBsYXJnZSBlbm91Z2ggZm9yIGFsbCBjYXNlcy4KLQkoYW91dF9saW5rX2lucHV0X2JmZCk6IFVzZSBwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcC4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBSZW1vdmUgc3ltYm9sX21hcCBhcmd1bWVudDsgdXNlCi0JcHJlYWxsb2NhdGVkIHN5bWJvbF9tYXAgaW5zdGVhZC4gIENoYW5nZSBhbGwgY2FsbGVycy4gIFVzZQotCXByZWFsbG9jYXRlZCBvdXRwdXRfc3ltcy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb24pOiBSZW1vdmUgc3ltYm9sX21hcCBhcmd1bWVudC4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgVXNlIHByZWFsbG9jYXRlZCBjb250ZW50cyBhbmQgcmVsb2NzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBSZW1vdmUgc3ltYm9sX21hcCBhcmd1bWVudDsgdXNlCi0JcHJlYWxsb2NhdGVkIHN5bWJvbF9tYXAgaW5zdGVhZC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgMjMgMTA6NTE6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IERvbid0IHVwZGF0ZSB0aGUKLQlzeW1ib2wgbWFwIHRpbWVzdGFtcCBpZiB0aGVyZSBpcyBubyBzeW1ib2wgbWFwLiAgRnJvbQotCXNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSAoQW5kcmVhcyBTY2h3YWIpLgotCi1Nb24gQXVnIDIyIDEyOjI2OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogQWRkIF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLgotCShiZmRfdGFyZ2V0KTogQWRkIGZpZWxkIF9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4KLQkqIGJmZC5jIChiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWNsYXJlLgotCShfYmZkX2FyY2hpdmVfY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IENhbGwKLQliZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBpbnN0ZWFkIG9mIGNoZWNraW5nIGZvciBhIEJTRCBhcmNoaXZlCi0JYW5kIGNhbGxpbmcgYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IFJlbmFtZSBmcm9tCi0JX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLiAgRG9uJ3QgYXNzdW1lIHRoYXQgYXJtYXBfZGF0ZXBvcyBpcwotCWFscmVhZHkgc2V0LgotCSogYW91dC10YXJnZXQuaCAoTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZSBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBpZWVlLmMgKGllZWVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0KLQkqIGhhc2guYzogQ29weSBzdHJpbmcgaGFzaCBmdW5jdGlvbnMgZnJvbSBhb3V0eC5oLgotCSogYW91dHguaDogU3RyaW5nIGhhc2ggZnVuY3Rpb25zIG1vdmVkIHRvIGhhc2guYy4gIFJldGFpbgotCXNpbXBsaWZpZWQgdmVyc2lvbnMgb2YgYWRkX3RvX3N0cmluZ3RhYiBhbmQgZW1pdF9zdHJpbmd0YWIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzIHRvIHVzZSBuZXcgZnVuY3Rpb24gYW5kIHN0cnVjdHVyZSBuYW1lcy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3N0cmluZ3RhYl9pbml0LCBfYmZkX3N0cmluZ3RhYl9mcmVlKTogRGVjbGFyZS4KLQkoX2JmZF9zdHJpbmd0YWJfc2l6ZSwgX2JmZF9zdHJpbmd0YWJfYWRkKTogRGVjbGFyZS4KLQkoX2JmZF9zdHJpbmd0YWJfZW1pdCk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotTW9uIEF1ZyAyMiAxMDo0OTozNyAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IENyZWF0ZSBhIGZpeHVwIGZvciBhbnkKLQlkZWZpbmVkIGFic29sdXRlIHN5bWJvbCwgbm90IGp1c3QgR09UIG9yIFBMVCBzeW1ib2xzLgotCShsaW51eF90YWxseV9zeW1ib2xzKTogQ29ycmVjdCBoYW5kbGluZyBvZiByZWZlcmVuY2VzIHRvIGRlZmluZWQKLQlzeW1ib2xzLgotCi1UaHUgQXVnIDE4IDE2OjI5OjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCUdldCBsZCAteCAtciB0byBoYW5kbGUgYS5vdXQgc2V0IHN5bWJvbHMgY29ycmVjdGx5LgotCSogYW91dHguaCAoYWRqdXN0X29fbWFnaWMpOiBJZiB0aGUgLmJzcyBWTUEgd2FzIHNldCBvdXRzaWRlIG9mCi0JQkZELCBwYWQgdGhlIC5kYXRhIHNlY3Rpb24gdXAgdG8gdGhlIFZNQSBvZiB0aGUgLmJzcyBzZWN0aW9uLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBJZiBhIHNldCBzeW1ib2wgZG9lcyBub3QgZ2V0IG1vZGlmaWVkLAotCXRyZWF0IGl0IGFzIGEgbG9jYWwgc3ltYm9sLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFNldCB0aGUgdmFsdWUgb2Ygc2V0IHN5bWJvbHMKLQljb3JyZWN0bHkuICBEb24ndCBkaXNjYXJkIHNldCBzeW1ib2xzIGV2ZW4gaWYgZGlzY2FyZGluZyBsb2NhbAotCXN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBEb24ndCBhYm9ydCBvbiBiZmRfbGlua19oYXNoX25ldywKLQlzaW5jZSBpdCBjYW4gbm93IGhhcHBlbiBmb3Igc2V0IHN5bWJvbHMuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBKdXN0IGNoZWNrIGZvciAiLnJlbGEiIGFuZAotCSIucmVsIiwgbm90ICIucmVsYS4iIGFuZCAiLnJlbC4iOyBtYWtlIHRoaXMgd29yayBieSBjaGVja2luZwotCXVzZV9yZWxhX3AuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IEp1c3QgY2hlY2sgZm9yICIucmVsIiwgbm90Ci0JIi5yZWwuIgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSnVzdCBjaGVjayBmb3IKLQkiLnJlbGEiLCBub3QgIi5yZWxhLiIKLQkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAxNyAxNjo1NDoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSW5pdGlhbGl6ZQotCVBBU1MgdG8gdGhlIG9sZCB2YWx1ZSArIDEuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBJZiBhIENfRklMRSBzeW1ib2wgaGFzCi0Jbm8gYXV4IGVudHJpZXMsIHVzZSB0aGUgc3ltYm9sIG5hbWUgYXMgdGhlIGZpbGUgbmFtZS4KLQkoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IExvb2sgZm9yIHRoZSByaWdodCBDX0ZJTEUgc3ltYm9sLCByYXRoZXIKLQl0aGFuIGFsd2F5cyB1c2luZyB0aGUgZmlyc3Qgb25lLiAgSWYgdGhlcmUgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sCi0JYWZ0ZXIgYSBmdW5jdGlvbiBzeW1ib2wsIHNraXAgaXQuICBBZGQgdGhlIHNlY3Rpb24gVk1BIHRvIHRoZSBsaW5lCi0Jb2Zmc2V0LCBzaW5jZSBpdCB3YXMgc3VidHJhY3RlZCBvdXQgaW4gY29mZl9zbHVycF9saW5lX3RhYmxlLgotCi1UdWUgQXVnIDE2IDE2OjUzOjAwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IElmIHdyaXRpbmcgc29tZSBmb3JtIG9mIGFuIGV4ZWN1dGFibGUsCi0JYWxsb2NhdGUgYW5kIGF0dGFjaCBhbiBleGVjIGhlYWRlciB0byB0aGUgQkZEIHByaXZhdGUgZGF0YS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCBmaWxsIGZpZWxkcyBvZiB0aGUgZXhlYyBoZWFkZXIgYmFzZWQKLQlvbiBCRkQgcHJpdmF0ZSBkYXRhIGhlcmUgKGxpa2UgdGhlIGV4ZWMgZmxhZ3MpLiAgRG8gbm90IHdyaXRlCi0JdGhlIGV4ZWMgaGVhZGVyIGhlcmUuCi0JKHNvbV93cml0ZV9oZWFkZXJzKTogSW5zdGVhZCBkbyBpdCBoZXJlLgotCSogc29tLmggKHN0cnVjdCBzb21kYXRhKTogTmV3IGZpZWxkICJleGVjX2hkciIgZm9yIHRoZSBleGVjdXRhYmxlCi0JZmlsZSBoZWFkZXIuCi0JKG9ial9zb21fZXhlY19oZHIpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0KLVR1ZSBBdWcgMTYgMDA6MTI6MzEgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYyAobGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENyZWF0ZSBzZWN0aW9uCi0JbmFtZWQgLmxpbnV4LWR5bmFtaWMsIG5vdCAuZHluYW1pYy4KLQkobGludXhfYWRkX29uZV9zeW1ib2wpOiBVc2UgLmxpbnV4LWR5bmFtaWMsIG5vdCAuZHluYW1pYy4KLQkoYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShsaW51eF9maW5pc2hfZHluYW1pY19saW5rKTogTGlrZXdpc2UuCi0KLU1vbiBBdWcgMTUgMTI6MTY6NTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKFNUUklOR19TSVpFX1NJWkUpOiBEZWZpbmUuCi0JKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogVXNlIFNUUklOR19TSVpFX1NJWkUsIG5vdCA0LgotCShjb2ZmX3dyaXRlX3N5bWJvbHMsIGJ1aWxkX3N0cmluZ190YWJsZSk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IExpa2V3aXNlLgotCi0JKiBsaWJjb2ZmLWluLmggKG9ial9zeW1ib2xfc2xldyk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGNvZmZfdGRhdGEpOiBSZW1vdmUgdW51c2VkIGZpZWxkcyBpbmRleF9zbGV3LCByYXdfbGluZW5vcywKLQlhbmQgZmxhZ3MuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0KTogRG9uJ3QgaW5pdGlhbGl6ZSByYXdfbGluZW5vcy4KLQkoY29mZl9ta29iamVjdF9ob29rKTogRG9uJ3QgaW5pdGlhbGl6ZSBmbGFncy4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfem1hZ2ljX2NvbnRpZ3VvdXMpOiBEZWZpbmUgYXMgMCBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKE1ZKGJhY2tlbmRfZGF0YSkpOiBVc2UgTVlfem1hZ2ljX2NvbnRpZ3VvdXMsIG5vdCBoYXJkY29kZWQgMC4KLQkqIGkzODZsaW51eC5jIChNWV96bWFnaWNfY29udGlndW91cyk6IERlZmluZS4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJZiBhIFNIVF9TWU1UQUIgc2VjdGlvbiBpbiBhCi0Jc2hhcmVkIG9iamVjdCBoYXMgU0hGX0FMTE9DIHNldCwgY3JlYXRlIGEgQkZEIHNlY3Rpb24gZm9yIGl0LgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogVGhlcmUgbWF5IGJlIGEgQkZEIHNlY3Rpb24gZm9yIGEKLQlTSFRfU1lNVEFCIHNlY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIG5hbWUgYXJndW1lbnQuICBJZiBubyBmbGFncwotCWFyZSByZWNvZ25pemVkLCBjaG9zZSBzZWN0aW9uIGZsYWdzIGJhc2VkIG9uIHRoZSBuYW1lLgotCShiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBfYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2sgZmllbGQ6IEFkZAotCW5hbWUgYXJndW1lbnQuCi0JKGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spOiBBZGQgbmFtZSBhcmd1bWVudC4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEb24ndCBhZGp1c3QgdGhlIHNlY3Rpb24KLQlwb3NpdGlvbiBieSBDT0ZGX1BBR0VfU0laRSB1bmxlc3MgU0VDX0FMTE9DIGlzIHNldC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogUGFzcyBzZWN0aW9uIG5hbWUgdG8KLQliZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IEFkZCB1bnVzZWQgbmFtZQotCWFyZ3VtZW50LgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IEFkZCBuYW1lIGFyZ3VtZW50IHRvCi0JcHJvdG90eXBlLgotCi1GcmkgQXVnIDEyIDExOjIyOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogQ29ycmVjdCBjaGVjayBmb3IgaW52YWxpZAotCXNlY3Rpb24gaW5kZXguCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgdGhlcmUgaXMgbm8gc3ltYm9sCi0JdGFibGUsIHRyeSB1c2luZyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMtKi1zb2xhcmlzMiopOiBVc2Ugc29sYXJpczIsIG5vdCBzeXN2NC4KLQlUaGUgbGlua2VyIGRlcGVuZHMgdXBvbiBjb25maWd1cmluZyBmb3Igc29sYXJpczIuCi0JKiBob3N0cy9zb2xhcmlzMi5oOiBOZXcgZmlsZTsgaW5jbHVkZSBob3N0cy9zeXN2NC5oLgotCSogY29uZmlnL3NvbGFyaXMyLm1oOiBOZXcgZmlsZTsgY29weSBvZiBjb25maWcvc3lzdjQubWguCi0KLVdlZCBBdWcgMTAgMTM6MDk6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhZGp1c3Rfel9tYWdpYyk6IE1ha2Ugc3VyZSBkYXRhIHNlY3Rpb24gaXMgcGFkZGVkIHRvCi0JcGFnZSBib3VuZGFyeSB3aGVuIHRoZSBWTUEgaXMgc2V0IGJ5IHRoZSBjYWxsaW5nIHByb2dyYW0uICBGcm9tCi0JRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCi1Nb24gQXVnICA4IDE3OjE4OjQ5IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCVVwZGF0ZSB0byBuczMyayBzdXBwb3J0LCBmcm9tIElhbiBEYWxsIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpLgotCSogYW91dC1uczMyay5jOiBBZGQgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSBpbiBhb3V0LW5zMzJrLmgsIGNoYW5nZQotCWRlY2xhcmF0aW9ucyB0byB0cmFkaXRpb25hbCBmb3JtLgotCShNWV9yZWxvY19ob3d0bywgTVlfcHV0X3JlbG9jKTogQ2hhbmdlIGZyb20gbWFjcm8gdG8gZnVuY3Rpb24uCi0JKG5zMzJrX3JlbG9jYXRlX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLgotCSogYW91dC1uczMyay5oOiBSZW1vdmUuCi0JKiBjcHUtbnMzMmsuYzogQWRkIGRlY2xhcmF0aW9ucyB0aGF0IHdlcmUgaW4gYW91dC1uczMyay5oLCBjaGFuZ2UKLQlkZWNsYXJhdGlvbnMgdG8gdHJhZGl0aW9uYWwgZm9ybS4KLQkobnMzMmtfZmluYWxfbGlua19yZWxvY2F0ZSk6IENhbGwgbnMzMmtfcmVsb2NhdGVfY29udGVudHMuCi0JKiBuZXRic2Q1MzIuYzogUmVmb3JtYXQgdG8gc3RhbmRhcmRzLCBhZGQgY29weXJpZ2h0IG5vdGljZS4KLQkoQVJDSCk6IERvbid0IGRlZmluZS4KLQkoYW91dC1uczMyay5oKTogRG9uJ3QgaW5jbHVkZS4KLQkqIHBjNTMyLW1hY2guYzogRGl0dG8uCi0KLU1vbiBBdWcgIDggMTc6NTU6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogRG9uJ3QgdHJ5IHRvIGNvbnZlcnQgcmVsb2NzCi0JYWdhaW5zdCBjb21tb24gc3ltYm9scy4KLQotU2F0IEF1ZyAgNiAyMjoyNzozMCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfY29yZV9maWxlX3ApOiAgSWdub3JlIHNlY3Rpb25zIHRoYXQKLQlhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgY29yZSBmaWxlLgotCi1UaHUgQXVnICA0IDExOjMyOjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmMgKG02OGtfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCSogY2YtbTY4a2x5bnguYyAoX2JmZF9tNjhrY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBGb3JjZSB0aGUgdm1hIG9mIHNlY3Rpb25zIHdoaWNoCi0JZG8gbm90IGhhdmUgU0VDX0FMTE9DIHNldCB0byBiZSAwLiAgVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlCi0JcmVsb2NzIGFnYWluc3QgZGVidWdnaW5nIHNlY3Rpb25zLgotCi1XZWQgQXVnICAzIDE2OjQ1OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IFJld3JvdGUgdG8gY2hhbmdlIHJlbG9jcwotCWFnYWluc3QgbG9jYWxseSBkZWZpbmVkIHN5bWJvbHMgaW50byByZWxvY3MgYWdhaW5zdCBzZWN0aW9uCi0Jc3ltYm9scywgZm9yIFZ4V29ya3MgNS4xLgotCi1XZWQgQXVnICAzIDEwOjM0OjM3IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogT25seSBoYW5kbGUKLQlTSEFSQUJMRV9DT05GTElDVFMgc3BlY2lhbGx5IGlmIEJTRl9DT05TVFJVQ1RPUiBpcyBzZXQuICBTZXQgaGFzaHAKLQlmb3IgYSBHT1Qgb3IgUExUIHN5bWJvbC4gIFNldCBqdW1wIGZpZWxkIG9mIGZpeHVwIGZvciBhIFBMVCBzeW1ib2wuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDaGVjayBzZWN0aW9uIG9mIHJlYWwgc3ltYm9sLiAgV2hlbiBsb29raW5nCi0JZm9yIGEgYnVpbHRpbiBmaXh1cCwgY2hlY2sgYnVpbHRpbiBhbmQganVtcCBmbGFncy4gIENyZWF0ZSBubyBtb3JlCi0JdGhhbiBvbmUgZml4dXAsIGFuZCBhbHdheXMgY3JlYXRlIG9uZSBpZiB0aGUgcmVhbCBzeW1ib2wgaXMgaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4gIE9ubHkgc3RyaXAgYWJzb2x1dGUgc3ltYm9scy4KLQotV2VkIEF1ZyAgMyAwNTowODoyNCAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGludGVybmFsX2EubWFnaWMgdG8KLQlMWU5YQ09GRk1BR0lDIHdoZW5ldmVyIDY4aywgU1BBUkMgb3IgaTM4NiBMeW54T1MKLQkoeWVzLCB0aGV5IGhhdmUgdGhlIHNhbWUgbWFnaWMgbnVtYmVyISkKLQotVHVlIEF1ZyAgMiAxMDo0MzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGhwMzAwaHB1eC5jIChCTUFHSUMpOiBEZWZpbmUgYXMgSFBVWF9ET1RfT19NQUdJQywgdG8gbWFrZSB0ZXN0Ci0JaW4gYW91dHguaCB3b3JrIGNvcnJlY3RseS4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoaG93dG9fcmVsbG9uZywgaG93dG9faXBybWVkKTogVXNlIGl0IGFzIHNwZWNpYWxfZnVuY3Rpb24uCi0KLQkqIGxpYmJmZC1pbi5oOiBNb3ZlIGRlY2xhcmF0aW9ucyBvZiBiZmRfcmVhZCwgYmZkX3dyaXRlLCBiZmRfc2VlaywKLQliZmRfdGVsbCwgYmZkX2ZsdXNoLCBhbmQgYmZkX3N0YXQgZnJvbSBoZXJlLi4uCi0JKiBiZmQtaW4uaDogLi4udG8gaGVyZSwgdG8gbWFrZSB0aGVtIHZpc2libGUgdG8gcHJvZ3JhbXMgd2hpY2gKLQlrbm93IG1vcmUgYWJvdXQgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCB0aGFuIEJGRCBkb2VzLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVidWlsdC4KLQotTW9uIEF1ZyAgMSAxNzo1NTo1MyAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfY29yZV9maWxlX3ApOiAgQ29udmVydCB6YWxsb2MgdXNhZ2UKLQl0byBiZmRfemFsbG9jLgotCi1Nb24gQXVnICAxIDEyOjA0OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmNjQtc3BhcmMuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi0JRUxGIGxpbmtlciBwYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogZWxmY29kZS5oIChlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB0eXBlIG9mCi0JX0RZTkFNSUMgdG8gU1RUX09CSkVDVC4KLQkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogQWx3YXlzIGNyZWF0ZSBoYXNoIHRhYmxlCi0JZW50cnkuICBTZXQgdHlwZSB0byBTVFRfT0JKRUNULgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3Qgc2V0IHR5cGUgb2Ygd2VhayBkZWZpbmVkIHN5bWJvbCB0bwotCVNUQl9XRUFLIGlmIHN5bWJvbCB3YXMgcmVmZXJlbmNlZC4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDaGVjayBEWU5BTUlDIGFzIHdlbGwgYXMgRVhFQ19QLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB0eXBlIG9mCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEUgdG8gU1RUX09CSkVDVC4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSWdub3JlIGxvY2FsIFBMVDMyIHJlbG9jcy4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFRyZWF0IGxvY2FsIFBMVDMyIHJlbG9jcyBhcyBQQzMyLgotCi0JKiBlbGZjb2RlLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDb3JyZWN0IHdlYWsgc3ltYm9sCi0JaGFuZGxpbmcgYWdhaW4uCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogRG9uJ3QgdHJ5IHRvIHJlYWQgdGhlIHJlbG9jcwotCWlmIHRoZXJlIGFyZW4ndCBhbnkuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLXNvbGFyaXMyKik6IFVzZSBzeXN2NCwgbm90IHNvbGFyaXMyLgotCSogaG9zdHMvc29sYXJpczIuaDogUmVtb3ZlLgotCSogY29uZmlnL3NvbGFyaXMyLm1oOiBSZW1vdmUuCi0KLVN1biBKdWwgMzEgMTQ6Mjc6MDQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYywgZWxmMzItaHBwYS5oOiBVcGRhdGUgY29tbWVudCByZWZsZWN0aW5nIHdoaWNoCi0JSFBQQSBFTEYgc3BlYyB0aGUgY29kZSBpbXBsZW1lbnRzLgotCi1UdWUgSnVsIDI2IDE3OjM4OjAxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNwdS1pOTYwLmMgKE1BWF9BUkNIKTogTmV3IG1hY3JvLgotCShjb21wYXRpYmxlKTogVXNlIGl0IGluIGNvbXB1dGluZyBhcnJheSBib3VuZHMuICBQdXQgY29tbWEgYWZ0ZXIKLQlsYXN0IGVudHJ5IGluIGFycmF5LCBmb3IgcmVndWxhcml0eS4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IEFkanVzdCBzcGFjaW5nIGZvciBlYXNpZXIgcmVhZGluZy4KLQotCSogY29mZi1pOTYwLmMgKGhvd3RvX3JlbGxvbmcsIGhvd3RvX2lwcm1lZCwgaG93dG9fb3B0Y2FsbCk6IFVzZQotCUhPV1RPIG1hY3JvLgotCi0JKiBjcHUtaTk2MC5jIChKWCk6IERlZmluZSBhcyBiZmRfbWFjaF9pOTYwX2p4LgotCShzY2FuXzk2MF9tYWNoKTogUmVjb2duaXplIGp4IG1hY2hpbmUuCi0JKE1BWF9BUkNIKTogRGVmaW5lIHRvIGJlIEpYLgotCShjb21wYXRpYmxlKTogQWRkIEpYIHJvdyB0byBhcnJheS4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBKWCBlbnRyeS4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfaTk2MF9qeCk6IE5ldyBtYWNyby4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogRm9yIEZfSTk2MEpYLCBzZXQgbWFjaGluZQotCXRvIGJmZF9tYWNoX2k5NjBfanguCi0JKGNvZmZfc2V0X2ZsYWdzKTogRm9yIGJmZF9tYWNoX2k5NjBfangsIHNldCBGX0k5NjBKWC4KLQotVHVlIEp1bCAyNiAxMTowNDowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFdoZW4gaGFuZGxpbmcgYSB3ZWFrCi0Jc3ltYm9sLCBjb3JyZWN0IGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBlcXVpdmFsZW50IG5vcm1hbCBzeW1ib2wKLQl3YXMgcmVmZXJlbmNlZC4KLQotCUFkZCBzdXBwb3J0IGZvciBjcmVhdGluZyBzaGFyZWQgbGlicmFyaWVzIHVuZGVyIGkzODYgRUxGIGFuZCBTUEFSQwotCUVMRi4gIEJhc2VkIG9uIHBhdGNoZXMgYnkgRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogUmVtb3ZlIGNvcHlfb2Zmc2V0IGZpZWxkLgotCUFkZCBnb3Rfb2Zmc2V0IGFuZCBwbHRfb2Zmc2V0IGZpZWxkcy4KLQkoRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQ19NVUxUSVBMRSk6IERvbid0IGRlZmluZS4KLQkoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQ19NVUxUSVBMRSk6IERvbid0IGRlZmluZS4KLQkoRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBjaGVja19yZWxvY3MgZmllbGQuCi0JKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IENoYW5nZSByZWxvY3MgZnJvbSBQVFIgdG8KLQlFbGZfSW50ZXJuYWxfUmVsYSAqLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBsb2NhbF9nb3Rfb2Zmc2V0cyBmaWVsZC4KLQkoZWxmX2xvY2FsX2dvdF9vZmZzZXRzKTogRGVmaW5lIGFjY2Vzc29yIG1hY3JvLgotCShiZmRfZWxmMzJfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogRG9uJ3QgdXNlIHRoZSBzZWN0aW9uIGRhdGEKLQlyZWxvY3MgZmllbGQuCi0JKGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIFVzZQotCW1hY3JvIHRvIHJlbmFtZSB0byBOQU1FKGJmZF9lbGYsbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBwdXQKLQltYWtlIGFsbCBsb2NhbCBzeW1ib2xzIGR5bmFtaWMuICBEb24ndCBib3RoZXIgd2l0aCB0aGUKLQlEWU5BTUlDX01VTFRJUExFIGZsYWdzLiAgQ2FsbCB0aGUgY2hlY2tfcmVsb2NzIGJhY2tlbmQgZnVuY3Rpb24gaWYKLQlpdCBpcyBkZWZpbmVkLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIFVzZQotCW1hY3JvIHRvIHJlbmFtZSB0byBOQU1FKGJmZF9lbGYsbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucykuICBJZgotCWNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIG1ha2Ugc3VyZSB0aGF0IF9EWU5BTUlDIGlzIGFkZGVkIGFzIGEKLQlkeW5hbWljIHN5bWJvbC4KLQkoZWxmX2xpbmtfcmVhZF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IElmIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeSwgYWx3YXlzIGNyZWF0ZSBzeW1ib2xzLCBhbmQgYWx3YXlzIG1ha2UgdGhlbSBkeW5hbWljLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBQZXJtaXQgY3JlYXRpb24gb2Ygc2hhcmVkIGxpYnJhcmllcy4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogVXNlIGVsZl9saW5rX3JlYWRfcmVsb2NzIHRvIGdldCB0aGUgcmVsb2NzLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogRG9uJ3QgaW5pdGlhbGl6ZQotCWNvcHlfb2Zmc2V0LiAgSW5pdGlhbGl6ZSBnb3Rfb2Zmc2V0IGFuZCBwbHRfb2Zmc2V0LgotCSogZWxmMzItdGFyZ2V0LmggKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZSBhcyAwIGlmIG5vdAotCWRlZmluZWQuCi0JKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgY2hlY2tfcmVsb2NzIGZpZWxkLgotCSogZWxmNjQtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZSBhcyAwIGlmIG5vdAotCWRlZmluZWQuCi0JKGVsZjY0X2JlZCk6IEluaXRpYWxpemUgY2hlY2tfcmVsb2NzIGZpZWxkLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl8zODZfUExUMzIgYW5kCi0JUl8zODZfR09UUEMgdG8gYmUgcGNfcmVsYXRpdmUgYW5kIHBjcmVsX29mZnNldC4KLQkoZWxmX2kzODZfcGljX3BsdDBfZW50cnkpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X3BpY19wbHRfZW50cnkpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIGEgLmdvdC5wbHQgc2VjdGlvbiwgYW5kCi0JZGVmaW5lIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgaXQuICBJZiBjcmVhdGluZyBhCi0Jc2hhcmVkIGxpYnJhcnksIG1ha2Ugc3VyZSB0aGF0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhZGRlZCBhcyBhCi0JZHluYW1pYyBzeW1ib2wuICBEb24ndCBjcmVhdGUgLnJlbC5ic3MgaWYgY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IG1ha2UgYSBQTFQgZW50cnkgaWYgdGhlCi0Jc3ltYm9sIGFscmVhZHkgaGFzIG9uZS4gIFdoZW4gbWFraW5nIGEgUExUIGVudHJ5LCBzZXQgcGx0X29mZnNldC4KLQlEb24ndCBjcmVhdGUgYSBjb3B5IHJlbG9jIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIERvbid0Ci0Jc2V0IGNvcHlfb2Zmc2V0LCBqdXN0IHNldCBFTEZfTElOS19IQVNIX05FRURTX0NPUFkuCi0JKGVsZl9pMzg2X2FsbG9jYXRlX2R5bmFtaWNfc2VjdGlvbik6IFJlbW92ZS4KLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTG9vayB0aHJvdWdoIGFsbCB0aGUgc2VjdGlvbnMKLQlyYXRoZXIgdGhhbiBhc3N1bWluZyB3ZSBrbm93IHRoZWlyIG5hbWVzLiAgUmVtb3ZlIGFueSBlbXB0eSByZWxvYwotCW9yIHBsdCBzZWN0aW9ucy4gIE9ubHkgYWRkIGEgRFRfREVCVUcgZW50cnkgaWYgbm90IGNyZWF0aW5nIGEKLQlzaGFyZWQgbGlicmFyeS4gIE9ubHkgYWRkIGEgRFRfUExUR09UIGVudHJ5IGlmIHRoZXJlIGlzIGEgUExULgotCUFkZCBhIERUX1RFWFRSRUwgZW50cnkgaWYgcmVxdWlyZWQuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgdW5kZWZpbmVkIHN5bWJvbHMgd2hlbgotCWNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBIYW5kbGUgdGhlIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlcwotCXNwZWNpYWxseS4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGEgUExUIGVudHJ5IGlmIHBsdF9vZmZzZXQKLQlpcyBzZXQuICBJZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBwcm9kdWNlIGEgUElDIFBMVCBlbnRyeS4KLQlPbmx5IG1hcmsgYSBQTFQgc3ltYm9sIGFzIHVuZGVmaW5lZCBpZiBpdCB3YXMgbm90IGRlZmluZWQgYnkgYQotCXJlZ3VsYXIgb2JqZWN0IGZpbGUuICBDcmVhdGUgYSBHT1QgZW50cnkgaWYgZ290X29mZnNldCBpcyBzZXQuCi0JQ3JlYXRlIGEgY29weSByZWxvYyBpZiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkgaXMgc2V0LgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENoYW5nZSB0aGUgaGFuZGxpbmcgb2YKLQlEVF9SRUxTWiB0byBzaW1wbHkgc3VidHJhY3Qgb3V0IHRoZSBzaXplIG9mIC5yZWwucGx0LiAgSWYgY3JlYXRpbmcKLQlhIHNoYXJlZCBsaWJyYXJ5LCBwcm9kdWNlIFBJQyBQTFQgY29kZS4KLQkoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lLgotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfU1BBUkNfR09UMTAsCi0JUl9TUEFSQ19HT1QyMiwgYW5kIFJfU1BBUkNfUEMxMCB0byBub3Qgd2FybiBhYm91dCByZWxvYyBvdmVyZmxvdy4KLQkoZWxmMzJfc3BhcmNfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnksIG1ha2Ugc3VyZSB0aGF0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhZGRlZCBhcyBhCi0gICAgICAgIGR5bmFtaWMgc3ltYm9sLCBhbmQgc2V0IHRoZSB0eXBlIHRvIFNUVF9PQkpFQ1QuICBMaWtld2lzZSBmb3IKLSAgICAgICAgX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXy4gIERvbid0IGNyZWF0ZSAucmVsLmJzcyBpZiBjcmVhdGluZyBhCi0gICAgICAgIHNoYXJlZCBsaWJyYXJ5LgotCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IG1ha2UgYSBQTFQgZW50cnkgaWYgdGhlCi0Jc3ltYm9sIGFscmVhZHkgaGFzIG9uZS4gIFdoZW4gbWFraW5nIGEgUExUIGVudHJ5LCBzZXQgcGx0X29mZnNldC4KLQlEb24ndCBjcmVhdGUgYSBjb3B5IHJlbG9jIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIERvbid0Ci0Jc2V0IGNvcHlfb2Zmc2V0LCBqdXN0IHNldCBFTEZfTElOS19IQVNIX05FRURTX0NPUFkuCi0JKGVsZjMyX3NwYXJjX2FsbG9jYXRlX2R5bmFtaWNfc2VjdGlvbik6IFJlbW92ZS4KLQkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTG9vayB0aHJvdWdoIGFsbCB0aGUgc2VjdGlvbnMKLQlyYXRoZXIgdGhhbiBhc3N1bWluZyB3ZSBrbm93IHRoZWlyIG5hbWVzLiAgT25seSBhZGQgYSBEVF9ERUJVRwotCWVudHJ5IGlmIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgQWRkIGEgRFRfVEVYVFJFTCBlbnRyeSBpZgotCXJlcXVpcmVkLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUGVybWl0IHVuZGVmaW5lZCBzeW1ib2xzIHdoZW4KLQljcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgSGFuZGxlIHRoZSBzcGVjaWFsIHJlbG9jYXRpb24gdHlwZXMKLQlzcGVjaWFsbHkuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IENyZWF0ZSBhIFBMVCBlbnRyeSBpZiBwbHRfb2Zmc2V0Ci0JaXMgc2V0LiAgT25seSBtYXJrIGEgUExUIHN5bWJvbCBhcyB1bmRlZmluZWQgaWYgaXQgd2FzIG5vdCBkZWZpbmVkCi0JYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlLiAgQ3JlYXRlIGEgR09UIGVudHJ5IGlmIGdvdF9vZmZzZXQgaXMKLQlzZXQuICBDcmVhdGUgYSBjb3B5IHJlbG9jIGlmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSBpcyBzZXQuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogU3RvcmUgZHlub2JqIGluIGEgbG9jYWwKLQl2YXJpYWJsZS4KLQkoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lLgotCi1Nb24gSnVsIDI1IDEyOjIxOjA3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwYzUzMm1hY2hfdmVjKTogQ2hhbmdlIHRvIHBjNTMybWFjaGFvdXRfdmVjLgotCSogY29uZmlnLmJmZCAobnMzMmstKi1uZXRic2QqKTogVXNlIG5zMzJrLW5ic2QgYXMgYmZkX25hbWUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1uczMyay5vLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0LW5zMzJrLm8sIG5ldGJzZDUzMi5vLCBtODhrbWFjaDMubywKLQlwYzUzMi1tYWNoLm8uCi0JKiB0YXJnZXRzLmMgKHBjNTMybWFjaGFvdXRfdmVjKTogVXNlIGluc3RlYWQgb2YgcGM1MzJtYWNoX3ZlYy4KLQkqIGNvbmZpZy9wYzUzMi1tYWNoLm10IChERUZBVUxUX1ZFQ1RPUik6IERpdHRvLgotCShTRUxFQ1RfVkVDUyk6IFJlbW92ZS4KLQkqIGNvbmZpZy9uczMyay1uYnNkLm10OiBOZXcgZmlsZSwgd2FzIG5zMzJrLW5ldGJzZC5tdC4KLQkqIGNvbmZpZy9uczMyay1uZXRic2QubXQ6IFJlbW92ZSwgbmFtZSB0b28gbG9uZy4KLQotRnJpIEp1bCAyMiAxMTowNzoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogV2hlbiBjaGFuZ2luZyBhCi0Jc3ltYm9sIHRvIGNvbW1vbiwgc2V0IHRoZSBhbGlnbm1lbnQuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogV2hlbiBjcmVhdGluZyBhIGNvbW1vbiBzeW1ib2wsCi0Jc2V0IHRoZSBhbGlnbm1lbnQuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IFdoZW4gY2hhbmdpbmcgYSBzeW1ib2wgdG8KLQljb21tb24sIHNldCB0aGUgYWxpZ25tZW50LgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBSZXN0cmljdCB0aGUgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbAotCXRvIHRoZSBhbGlnbm1lbnQgcG93ZXIgZ2l2ZW4gYnkgdGhlIGFyY2hpdGVjdHVyZS4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IFJlbW92ZSBhbGlnbiBmaWVsZC4gIEFkZAotCWNvcHlfb2Zmc2V0IGZpZWxkLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTdG9yZSBhbGlnbm1lbnQgaW4KLQluZXcgYmZkX2xpbmtfaGFzaF9lbnRyeSBmaWVsZCwgbm90IGluIGVsZl9saW5rX2hhc2hfZW50cnkgZmllbGQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBTaW1pbGFyIGNoYW5nZSB3aGVuIGdldHRpbmcgYWxpZ25tZW50LgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogRG9uJ3QgaW5pdGlhbGl6ZSBhbGlnbi4gIERvCi0JaW5pdGlhbGl6ZSBjb3B5X29mZnNldC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogVXNlIGNvcHlfb2Zmc2V0Ci0JZmllbGQgcmF0aGVyIHRoYW4gYWxpZ24gZmllbGQuICBHZXQgYWxpZ25tZW50IHVzaW5nIGJmZF9sb2cyCi0JcmF0aGVyIHRoYW4gc3dpdGNoLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZSBjb3B5X29mZnNldCwKLQlub3QgYWxpZ24uCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBKdXN0IGNoZWNrCi0JU1RBVF9GT1JfRVhFQywgZG9uJ3QgY2hlY2sgTUFDSC4KLQkqIG04OGttYWNoMy5jIChNQUNIKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL2kzODYtbWFjaDMubXQgKFRERUZJTkVTKTogRGVmaW5lIFNUQVRfRk9SX0VYRUMuCi0JKiBjb25maWcvbTg4ay1tYWNoMy5tdCAoVERFRklORVMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9taXBzLW1hY2gzLm10IChUREVGSU5FUyk6IExpa2V3aXNlLgotCi1UaHUgSnVsIDIxIDE3OjI0OjMxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogaTM4Nm1hY2gzLmM6IFJldmVydGVkIHRvIHZlcnNpb24gZnJvbSBiZWZvcmUgSnVsIDUgMTk5NCBjaGFuZ2VzLgotCi1UaHUgSnVsIDIxIDEyOjI2OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6IFJlbW92ZSBzcGVjaWFsX2Z1bmN0aW9uMS4KLQlJdCdzIHRoZSB3cm9uZyB3YXkgdG8gZG8gdGhpbmdzLgotCShIT1dUTyk6IENoYW5nZSBhY2NvcmRpbmdseS4KLQkoSE9XVE8yKTogUmVtb3ZlLgotCShfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBSZW1vdmUgcmVmZXJlbmNlcyB0bwotCXNwZWNpYWxfZnVuY3Rpb24xLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8KLQlzcGVjaWFsX2Z1bmN0aW9uMS4KLQkoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotV2VkIEp1bCAyMCAxNTo0Njo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgcnBhdGgKLQlhcmd1bWVudC4gIElmIGl0IGlzIG5vdCBOVUxMLCB1c2UgaXQgdG8gc2V0IERUX1JQQVRILgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgcHJvdG90eXBlLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVNhdCBKdWwgMTYgMjE6MTA6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBJZiB0aGVyZSBpcyBubwotCWR5bmFtaWMgc3ltdGFiLCByZXR1cm4gZXJyb3IuCi0KLQkqIGxpYmVsZi5oIChFTEZfTElOS19IQVNIX0RFRklORURfV0VBSyk6IERlZmluZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgc3ltYm9sIGlzIGRlZmluZWQgYXMKLQl3ZWFrLCBzZXQgRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUsuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBJZiBzeW1ib2wgaXMgZGVmaW5lZCBhcyB3ZWFrLCBtYXJrIGl0Ci0JU1RCX1dFQUsuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgcmVsb2NzIGZpZWxkLgotCShzaGRyX25hbWUpOiBSZW1vdmU7IHVudXNlZC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogUmV3cm90ZSB0byBoYW5kbGUgYm90aCBSRUwKLQlhbmQgUkVMQSByZWxvY3MuICBGcmVlIHVwIHRoZSB1bnN3YXBwZWQgcmVsb2NzLiAgUGVybWl0IHRoZSByZWxvY3MKLQl0byBiZSBjYWNoZWQgaW4gdGhlIHNlY3Rpb25fZGF0YS4gIENvcnJlY3QgdGhlIHJlbG9jIGFkZHJlc3MuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBSZW1vdmUuCi0JKGVsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBSZXdyb3RlLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBQZXJtaXQgdGhlIHJlbG9jcyB0byBiZSBjYWNoZWQgaW4gdGhlCi0Jc2VjdGlvbiBkYXRhLgotCi1TYXQgSnVsIDE2IDEzOjU1OjM4IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAobTg4Ki1oYXJyaXMtY3h1eCopOiBSZWNvZ25pemUuCi0JKiBob3N0cy9oYXJyaXMuaCAoUE9TSVhfVVRJTUUsIEhBVkVfUFJPQ0ZTKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki1hdGFyaS1zeXN2NCopOiBOZXcgaG9zdC4KLQkobTY4Ki1jYm0tc3lzdjQqKTogVXNlIG02OGt2NCBpbnN0ZWFkIG9mIGFtaXguCi0JKiBob3N0cy9hbWl4Lmg6IFJlbW92ZS4KLQkqIGhvc3RzL202OGt2NC5oOiBOZXcgZmlsZSwgd2FzIGFtaXguaC4KLQotVGh1IEp1bCAxNCAxNToxMjoyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwsIGJmZF90eXBlLCBzdHJ1Y3QKLQlyZWxvY19ob3d0b19zdHJ1Y3QsIHJlbG9jX2hvd3RvX3R5cGUsIEhPV1RPLCBIT1dUTzIpOiBDb3BpZWQKLQljaGFuZ2VzIG92ZXIgZnJvbSBiZmQtaW4yLmggc28gdGhleSBnZXQgZ2VuZXJhdGVkIHByb3Blcmx5IG5leHQKLQl0aW1lIHNvbWVvbmUgcnVucyAibWFrZSBoZWFkZXJzIi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogdGFyZ2V0cy5jIChuZXRic2Q1MzJfdmVjLCBwYzUzMm1hY2hfdmVjKTogRGVjbGFyZSBjb25zdC4KLQkobTg4a21hY2gzX3ZlYyk6IFJlc3RvcmUgZGVsZXRlZCBkZWNsYXJhdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBBbHBoYWJldGl6ZSB0YXJnZXQgdmVjdG9yIG5hbWVzLgotCi0JKiBjb25maWcvcGM1MzJtYWNoLm1oOiBOZXcgZmlsZS4KLQkoSERFUEZJTEVTLCBIREVGSU5FUyk6IERlZmluZSBoZXJlLgotCSogY29uZmlnL3BjNTMyLW1hY2gubXQgKEhERVBGSUxFUywgSERFRklORVMpOiBEZWxldGVkLgotCSogY29uZmlnL25zMzJrLW5ldGJzZC5tdCAoSERFUEZJTEVTLCBIREVGSU5FUyk6IERlbGV0ZWQuCi0KLQlTdW4gSnVsIDEwIDAwOjA0OjIwIDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBwYzUzMi1tYWNoLmM6IE5ldyBGaWxlLiBwYzUzMi1tYWNoIGEub3V0IGZvcm1hdC4KLQotCSogbmV0YnNkNTMyLmM6IE5ldyBmaWxlLiBwYzUzMi1uZXRic2Q1MzIgYS5vdXQgZm9ybWF0LgotCi0JKiBob3N0cy9wYzUzMm1hY2guaDogTmV3IGZpbGUuIHBjNTMyLW1hY2ggaG9zdCBzdXBwb3J0LgotCi0JKiBjcHUtbnMzMmsuYzogTmV3IGZpbGUuIG5zMzJrIHN1cHBvcnQgY3B1IHNwZWNpZmljIGNvZGUgcmF0aGVyCi0JdGhhbiBmb3JtYXQgc3BlY2lmaWMgY29kZS4KLQotCSogY29uZmlnL3BjNTMyLW1hY2gubXQ6IE5ldyBmaWxlLiBTdXBwb3J0IGZvciBwYzUzMi1tYWNoIHRhcmdldC4KLQotCSogY29uZmlnL25zMzJrLW5ldGJzZC5tdDogTmV3IGZpbGUuIFN1cHBvcnQgZm9yIG5ldGJzZDUzMiB0YXJnZXQuCi0KLQkqIGFvdXQtbnMzMmsuYywgYW91dC1uczMyay5oOiBOZXcgZmlsZXMgc3VwcG9ydGluZyBhb3V0IGZvcm1hdCBmb3IKLQluczMyayBzZXJpZXMuIAotCi0JKiB0YXJnZXRzLmM6IEFkZCBuZXRic2Q1MzJfdmVjIGFuZCBwYzUzMm1hY2hhb3V0X3ZlYyBpbnRvCi0JYmZkX3RhcmdldF92ZWN0b3IgYXJyYXkuIE1vdmUgbmV0YnNkMzg2X3ZlYyB0byBhbHBoYWJldGljIG9yZGVyCi0JbG9jYXRpb24uCi0KLQkqIHJlbG9jLmMgKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSkgQWRkIHN1cHBvcnQgZm9yCi0Jc3BlY2lhbF9mdW5jdGlvbjEgaW4gaG93dG8uCi0KLQkqIGxpYmFvdXQuaDogYWRkIE1fTlMzMjAzMiwgTV9OUzMyNTMyLCBNXzUzMl9ORVRCU0QgZW50cmllcyBpbgotCW1hY2hpbmVfdHlwZSBlbnVtLgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBwYzUzMm1hY2hfdmVjIGFuZCBuZXRic2Q1MzJfdmVjIGVudHJpZXMuCi0KLQkqIGNvbmZpZy5iZmQ6IGFkZCBwYzUzMm1hY2ggaG9zdCBlbnRyaWVzLiBVc2UgZm9yIGJvdGgKLQluczMyay1wYzUzMi1tYWNoIGFuZCBuczMyay1wYzUzMi1uZXRic2QuCi0KLQkqIGNvbmZpZy5iZmQ6IGl0IGRvZXNuJ3Qgd29yayB0byB1c2UgaTM4Ni1tYWNoMyBmb3IgbnMzMmsqLSotbWFjaC4KLQlhZGQgbnMzMmstcGM1MzItbWFjaCogYW5kIG5zMzJrLSotbmV0YnNkKiBlbnRyaWVzLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBuczMyayBzcGVjaWZpYyByZWxvY2F0aW9ucyB0byBiZmRfcmVsb2NfY29kZV9yZWFsCi0JZW51bS4KLQotCSogYmZkLWluMi5oOiBBZGQgc3BlY2lhbF9mdW5jdGlvbjEgdG8gc3RydWN0IGhvd3RvLiBDaGFuZ2UgSE9XVE8KLQlhbmQgTkVXSE9XVE8gbWFjcm9zIHRvIG1ha2Ugc3BlY2lhbF9mdW5jdGlvbjEgTlVMTC4gTmV3dyBIT1dUTzIKLQltYWNyby4KLQotCSogYmZkLWluMi5oOiBTcGxpdCBkZWZpbml0aW9uIG9mIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QKLQlhbmQgY29ycmVzcG9uZGluZyB0eXBlZGVmIGludG8gdHdvIHN0YXRlbWVudHMuCi0KLQkqIGJmZC1pbjIuaDogQWRkIGVudHJ5IGJmZF9hcmNoX25zMzJrIHRvIGJmZF9hcmNoaXRlY3R1cmUgZW51bS4KLQotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9uczMya19hcmNoIHByb3RvdHlwZSwgYW5kIGVudHJ5IGluCi0JYXJjaHVyZXNfaW5pdF90YWJsZS4gCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQKLQlNWV9wdXRfcmVsb2MgbWFjcm8uIEFsbG93IGZvciB0YXJnZXQgZGVwZW5kZW50IHNwZWNpYWxfZnVuY3Rpb24xCi0JdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24uIAotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBBbGxvdyBmb3IgdGFyZ2V0Ci0JZGVwZW5kZW50IGRldGVybWluYXRpb24gb2YgcmVsb2MgaG93dG8uIEFsbG93IGZvciB0YXJnZXQgZGVwZW5kZW50Ci0Jc3BlY2lhbF9mdW5jdGlvbjEgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24uCi0KLQkqIGFvdXR4LmggKGdldF9yZWxvY191cHBlcl9ib3VuZCk6IERldGVjdCBic3MgYW5kIHJldHVybiAwLgotCi0JKiBhb3V0eC5oIChzbHVycF9yZWxvY190YWJsZSk6IERldGVjdCBic3MgYW5kIHN1Y2Nlc2Z1bGx5IHJlYWQKLQl6ZXJvIHJlbG9jIGVudHJpZXMuCi0KLQkqIGFvdXR4LmggKG1hY2hpbmVfdHlwZSk6IEFkZCBiZmRfYXJjaF9uczMyayBjYXNlLgotCi0JKiBhb3V0eC5oOiBTdGF0IHRvIGRldGVybWluZSBleGVjdXRhYmxlIHN0YXR1cyBpZiBTVEFUX0ZPUl9FWEVDCi0JaXMgZGVmaW5lZCAobm90IGp1c3QgTUFDSCkuIFVzZSBmc3RhdCBpbnN0ZWFkIG9mIHN0YXQgYW5kIGNoZWNrCi0JZm9yIGZzdGF0IGVycm9yLgotCi0JKiBhb3V0eC5oOiBBbGxvdyB0YXJnZXQgZGVwZW5kZW50IHN3YXBfc3RkX3JlbG9jX3tpbixvdXR9LgotCi0JKiBhb3V0eC5oOiBBbGxvdyBDVE9SUyByZWxvYyBpbmZvIHRvIGJlIGluIHRhcmdldCBkZXBlbmRlbnQgcmVsb2MKLQl0YWJsZS4KLQotCSogYW91dC10YXJnZXQuaDogQXBwbHkgU1dBUF9NQUdJQyAoaWYgZGVmaW5lZCkgYWZ0ZXIKLQlzd2FwX2V4ZWNfaGVhZGVyX2luLCBvdGhlcndpc2Ugd2UgaGF2ZSBtYWdpYyBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0KLVRodSBKdWwgMTQgMTE6NDc6MjcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNwYXJjLmMgKHNwYXJjY29mZl92ZWMpOiBIYXZlIGxlYWRpbmcgdW5kZXJzY29yZXMuCi0KLVR1ZSBKdWwgMTIgMTI6MDg6MTAgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0ZjEuaCwgY2lzY28tY29yZS5jLCBlbGZjb2RlLmgsIGhwcGFic2QtY29yZS5jLAotCWhwdXgtY29yZS5jLCBpcml4LWNvcmUuYywgbHlueC1jb3JlLmMsIG9zZi1jb3JlLmMsIHB0cmFjZS1jb3JlLmMsCi0JcnM2MDAwLWNvcmUuYywgdHJhZC1jb3JlLmM6ICBSZW1vdmUgU0VDX0FMTE9DIGZsYWcgZnJvbSAucmVnCi0Jc2VjdGlvbnMsIC5yZWcgc2VjdGlvbnMgYXJlIG5vdCBhbGxvY2F0ZWQgYW5kIGNvbnRhaW4gZGVidWcKLQlpbmZvcm1hdGlvbiBvbmx5LgotCSogb3NmLWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24sIG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogIFVzZQotCWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IGluc3RlYWQgb2YgYnVpbGRpbmcgdW5pcXVlIHNlY3Rpb24gbmFtZXMuCi0KLVR1ZSBKdWwgMTIgMTE6NDE6MjIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbiwgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCk6IERlY2xhcmUuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlX2luaXQpOiBDb3JyZWN0IGNhc3QuCi0KLQkqIGFvdXQtZW5jYXAuYyAoQVJDSCk6IERvbid0IGRlZmluZS4gIE9ic29sZXRlLgotCSogYW91dDAuYywgYW91dHguaCwgZ2VuLWFvdXQuYywgaHAzMDBic2QuYywgaHAzMDBocHV4LmM6IExpa2V3aXNlLgotCSogaTM4NmFvdXQuYywgaTM4NmJzZC5jLCBpMzg2ZHluaXguYywgaTM4NmxpbnV4LmM6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYywgbTY4a2x5bnguYywgbWlwc2JzZC5jLCBuZXRic2QzODYuYzogTGlrZXdpc2UuCi0JKiBuZXdzb3MzLmMsIHNwYXJjbHlueC5jLCBzdW5vcy5jOiBMaWtld2lzZS4KLQotTW9uIEp1bCAxMSAyMDowODoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiBNYWtlIHRoZSBzaXh0aCBhcmd1bWVudCBib29sZWFuLCBub3QKLQl0aGUgc2V2ZW50aC4gIEZyb20gZ2FyeUB0dXZhLnBhY3NlbWkub3ouYXUgKGdhcnkga29wZmYpLgotCi1TdW4gSnVsIDEwIDA5OjEyOjAyIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBDaGFuZ2UgbmFtZSBvZiBGUkVFIHRvIEJGQ0lfRlJFRQotCWluIG9yZGVyIG5vdCB0byBjb2xsaWRlIHdpdGggTHlueE9TJ3MgZGVmaW5pdGlvbiBvZiBGUkVFIGluCi0JL3Vzci9pbmNsdWRlL3N5cy9wcm9jLmgKLQotVGh1IEp1bCAgNyAxNDoxODowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCBjbG9iYmVyIHRoZSByZWxvY2F0aW9uCi0JdmFsdWUgZm9yIGNvZmYtSW50ZWwtbGl0dGxlIG9yIGNvZmYtSW50ZWwtYmlnLiAgSGFjayB1cG9uIGhhY2suCi0KLVRodSBKdWwgIDcgMTA6MTA6MzQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9zdGQpOiAgQWRkIGVudHJ5IGZvciBHT1QgcmVsb2NhdGlvbnMKLQl3aGljaCBhcmUgcHJlc2VudCBpbiBzdW4zIHNoYXJlZCBsaWJyYXJpZXMsIHRvIGF2b2lkIGFzc2VydGlvbnMKLQl3aGVuIHJlYWRpbmcgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMuCi0KLVRodSBKdWwgIDcgMTA6MTk6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChSX0hQUEFfQ09NUExFWCk6IEZpeCBkdW1iIHR5cG8uIAotCi1XZWQgSnVsICA2IDE5OjIxOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3lzdjQuaCAocXNvcnQsIHN0cnRvbCk6IERvbid0IGRlY2xhcmUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfb3V0cHV0X3N5bSk6IERvbid0IGNhbGwgb3V0cHV0X3N5bWJvbF9ob29rCi0JaWYgaXQgaXMgTlVMTC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogQWRkIGlnbm9yZWQgaW5mbwotCWFyZ3VtZW50IHRvIGNvcnJlc3BvbmQgdG8gcmVjZW50IGxpYmVsZi5oIGNoYW5nZS4KLQotV2VkIEp1bCAgNiAwMDo0ODo1NyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vayk6ICBOZXcgaG9vayB0bwotCWFkZGl0aW9uYWxseSBjb3B5IG9iamVjdCB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIGFscGhhIGZpbGUKLQloZWFkZXIgdG8gdGhlIEJGRCBmbGFncy4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogIFVzZSBpdC4KLQkoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogIEFkZCBEWU5BTUlDIHRvIG9iamVjdF9mbGFncy4KLQkqIGFvdXQ2NC5jOiAgRml4IHR5cG8gaW4gY29uZGl0aW9uYWwgUU1BR0lDIGRlZmluaXRpb24uCi0KLVdlZCBKdWwgIDYgMDA6MTM6MTcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGFic2QtY29yZS5jIChocHBhYnNkX2NvcmVfY29yZV9maWxlX3ApOiBTYW5pdHkgY2hlY2sgdGhlCi0JdmFsdWUgb2YgY2xpY2tzeiB0byBoZWxwIHdlZWQgb3V0IG5vbiBIUFBBIEJTRCBjb3JlIGZpbGVzLgotCi1UdWUgSnVsICA1IDEzOjI2OjAyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCU1hY2ggMyBzdXBwb3J0LgotCSogY29uZmlnLmJmZCAobTg4Ki0qLW1hY2gzKiwgbWlwcyotZGVjLW1hY2gzKiwgbWlwcyotKi1tYWNoMyopOgotCU5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmhvc3QgKGlbMzRdODYtKi1tYWNoMyosIG5zMzJrLSotbWFjaDMqKTogUmVjb2duaXplCi0JIm1hY2gzIiBpbnN0ZWFkIG9mICJtYWNoIi4KLQkobTg4Ki0qLW1hY2gzKiwgbWlwcyotZGVjLW1hY2gzKiwgbWlwcyotKi1tYWNoMyopOiBOZXcgaG9zdHMuCi0JKiB0YXJnZXRzLmMgKG04OGttYWNoM192ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgaTM4Nm1hY2gzX3ZlYyBhbmQgbTg4a21hY2gzX3ZlYywgYnV0Ci0JaW5zaWRlICNpZiAwLgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKSBbTUFDSF06IFJlY29nbml6ZSBleGVjdXRhYmxlcyBieQotCWNoZWNraW5nIGZvciBleGVjdXRlIHBlcm1pc3Npb24sIGluc3RlYWQgb2YgbG9va2luZyBhdCBlbnRyeQotCXBvaW50LgotCSogaTM4Nm1hY2gzLmM6IFVwZGF0ZSwgZGVmaW5lIE1BQ0gsIE5fVFhUT0ZGLCBOX1RYVEFERFIsCi0JTl9TSEFSRURfTElCLCBkb24ndCBpbmNsdWRlIGFvdXQvKi5oIGZpbGVzLCBldGMuCi0JKiBtODhrbWFjaDMuYzogTmV3IGZpbGUsIG04OGsgTWFjaCAzIHRhcmdldC4KLQkqIGNvbmZpZy9tODhrLW1hY2gzLm10LAljb25maWcvbWlwcy1tYWNoMy5tdDogTmV3IGZpbGVzLCB0YXJnZXQKLQltYWtlZmlsZSBmcmFnbWVudHMuCi0JKiBjb25maWcvaTM4Nm1hY2gzLm1oLCBjb25maWcvbTg4a21hY2gzLm1oLCBjb25maWcvbWlwc21hY2gzLm1oOgotCU5ldyBmaWxlcywgaG9zdAltYWtlZmlsZSBmcmFnbWVudHMuCi0JKiBob3N0cy9tODhrbWFjaDMuaCwgaG9zdHMvbWlwc21hY2gzLmg6IE5ldyBmaWxlcywgaG9zdCBkZWZpbml0aW9ucy4KLQotVHVlIEp1bCAgNSAxMzo1Njo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IEdldCBhbGlnbm1lbnQgb2YgY29tbW9uIHN5bWJvbCBmcm9tCi0Jc3RfdmFsdWUgZmllbGQgb2Ygc2F2ZWQgRUxGIHN5bWJvbCBpbmZvcm1hdGlvbiwgaWYgdGhlcmUgaXMgYW55LgotCi1Nb24gSnVsICA0IDE5OjEzOjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoUl9IUFBBX0NPTVBMRVgpOiBEZWZpbmUuCi0JKiBlbGYzMi1ocHBhLmggKFJfSFBQQV9DT01QTEVYKTogRGVmaW5lLgotCShlbGYzMl9ocHBhX3JlbG9jX3R5cGUpOiBEZWxldGUgUl9QQVJJU0NfU1RVQl9DQUxMXzE3LgotCi1GcmkgSnVsICAxIDEyOjA3OjQxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBTdXBwb3J0IGNvZGUgZm9yIGVuYWJsaW5nIHRoZSBuZXcgc3R5bGUgbGlua2VyIGZvciBQQSBFTEYuCi0JKiBlbGZjb2RlLmggKHN3YXBfc3ltYm9sX2luLCBzd2FwX3N5bWJvbF9vdXQpOiBFeHRlcm5hbGl6ZS4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFBhc3MgbGlua19pbmZvIHRvCi0JdGhlIGJlZ2luX3dyaXRlX3Byb2Nlc3NpbmcgaG9vay4KLQkoYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBQYXNzIE5VTEwgZm9yIG5ldyBsaW5rX2luZm8KLQlhcmd1bWVudCB0byBmaW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2suCi0JKGVsZl9saW5rX291dHB1dF9zeW0pOiBBY2NlcHQgbmV3ICJpbnB1dF9zZWN0aW9uIiBhcmd1bWVudCBmb3IKLQl0aGUgc3ltYm9scydzIGlucHV0IHNlY3Rpb24uICBBbGwgY2FsbGVycyBjaGFuZ2VkLiAgQ2FsbCB0aGUKLQlsaW5rX291dHB1dF9zeW1ib2xfaG9vayBpZiBpdCdzIGRlZmluZWQuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IENhbGwgdGhlIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vayBpZgotCWl0J3MgZGVmaW5lZC4KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IERlY2xhcmUuCi0JKGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBBZGQgbmV3ICJpbmZvIiBhcmd1bWVudC4KLQkoZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCSogZWxmMzItdGFyZ2V0LmggKGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogUHJvdmlkZQotCWEgZGVmYXVsdCBkZWZpbml0aW9uLgotCShlbGYzMl9iZWQpOiBBZGQgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2suCi0JKiBlbGY2NC10YXJnZXQuaDogTGlrZXdpc2UuCi0JCi0JKiBNYWpvciByZXdvcmsgb2YgdGhlIFBBIEVMRiBjb2RlLiAgVXNlcyB0aGUgbmV3IHN0eWxlIEJGRAotCWxpbmtlciwgbWFqb3IgY2xlYW51cHMuCi0JKiBocHBhX3N0dWJzLmg6IFJld3JpdGUgZnJvbSBzY3JhdGNoLiAgTXVjaCBzbWFsbGVyIGFuZCBzaW1wbGVyLgotCSogZWxmMzItaHBwYS5oOiBEZWxldGUgYWxsIHN5bWJvbCBleHRlbnNpb24gcmVsYXRlZCBjb2RlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEZWxldGUgZGVjbC4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzLCBlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogTmV3IGRlY2xzLgotCSogZWxmMzItaHBwYS5jOiBTeW1ib2wgZXh0ZW5zaW9uIHN0dWZmIG1vdmVkIGZvcm0gZWxmMzItaHBwYS5oCi0JaW50byBlbGYzMi1ocHBhLmMuICBEbyBub3QgaW5jbHVkZSBhb3V0NjQuaC4KLQkodHlwZGVmIGhwcGFfc3R1Yl90eXBlKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX3N0dWJfbmFtZV9saXN0X3N0cnVjdCk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uX3N0cnVjdCk6IERlbGV0ZS4KLQkoYXJnX3JlbG9jX3R5cGUpOiBVc2Ugc2ltcGxlciBlbnVtZXJhdGlvbnMuICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgotCShhcmdfbG9jYXRpb24sIGFyZ19yZWxvY19yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfc3ltZXh0bl9tYXBfc3RydWN0KTogRGVsZXRlLgotCShnZXRfc3ltYm9sX3ZhbHVlKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2dldF9zeW1fZXh0bik6IERlbGV0ZS4KLQkoZmluZF9zdHVicywgbmV3X3N0dWJzLCB0eXBlX29mX21pc21hdGNoKTogRGVsZXRlLgotCShmaW5kX3N0dWJfYnlfbmFtZSwgYWRkX3N0dWJfYnlfbmFtZSk6IERlbGV0ZS4KLQkoaHBwYV9lbGZfc3R1Yl9maW5pc2gsIGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBEZWxldGUuCi0JKGhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWQpOiBSZW5hbWVkLiAgU2ltcGxpZnkuCi0JKGhwcGFfZWxmX2J1aWxkX2xpbmtlcl9zdHViLCBocHBhX2VsZl9jcmVhdGVfc3R1Yl9zZWMpOiBEZWxldGUuCi0JKGhwcGFfZWxmX2xvbmdfYnJhbmNoX25lZWRlZF9wKTogRGVsZXRlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEZWxldGUuCi0JKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcik6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEZWxldGUuCi0JKE5FV19JTlNUUlVDVElPTik6IERlbGV0ZS4KLQkoQ1VSUkVOVF9TVFVCX09GRlNFVCk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3NpemVfc3ltZXh0KTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX25hbWVfb2Zfc3R1Yik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9zaXplX29mX3N0dWIpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfYnVpbGRfb25lX3N1Yik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9idWlsZF9zdHVicyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShsaW5rZXIsIHN0dWIgYW5kIGFyZ3VtZW50IGhhc2ggdGFibGVzKTogQWRkIGFwcHJvcHJpYXRlCi0Jc3RydWN0dXJlcywgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgYWxsIHRocmVlCi0JaGFzaCB0YWJsZXMuCi0JKGhwcGFfZWxmX3JlbG9jYXRlX2luc24pOiBEb24ndCBuZWVkIGFyZ3VtZW50IGxvY2F0aW9uIGluZm9ybWF0aW9uCi0JaW4gdGhpcyBmdW5jdGlvbi4KLQkoYWRkX2VudHJ5X3RvX3N5bWV4dF9jaGFpbik6IEFjY2VwdCBhIHN5bWJvbCdzIGFyZ3VtZW50IGxvY2F0aW9uCi0JaW5mb3JtYXRpb24gcmF0aGVyIHRoYW4gdGhlIHN5bWJvbCBpdHNlbGYuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFNpbXBsaWZ5LgotCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFN0dWIgc2VjdGlvbiBpcyBubyBsb25nZXIgc3BlY2lhbC4KLQkoaHBwYV9lbGZfcmVsb2MpOiBHcmVhdGx5IHNpbXBsaWZ5LgotCShlbGYzMl9ocHBhX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBBY2NlcHQgbGlua19pbmZvIGFyZ3VtZW50LgotCUhhbmRsZSBiZWluZyBjYWxsZWQgZnJvbSB0aGUgQkZEIGJhY2tlbmQgbGlua2VyLgotCShlbGYzMl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IE5vIGxvbmdlciBjYWxsIHN0dWJfZmluaXNoLgotCQotTW9uIEp1biAyNyAxODowNzowNiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBQdXQgaW4gcGFyZW5zIHRvIGdldAotCXByZWNlZGVuY2UgcmlnaHQuCi0KLVN1biBKdW4gMjYgMTg6MDg6MjkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmVsZi5oIChyZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGFyZ3VtZW50ICJvdXRwdXRfbmFtZXMiIGFkZGVkCi0JdG8gcHJvdG90eXBlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBOZXcgYXJndW1lbnQgIm91dHB1dF9uYW1lcyIKLQlhZGRlZCB0byBwcm90b3R5cGUgb2YgcmVsb2NhdGVfc2VjdGlvbi4gIFBhc3MgdGhlIG91dHB1dCBzeW1ib2wKLQluYW1lcyB0byByZWxvY2F0ZV9zZWN0aW9uLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlICJvdXRwdXRfbmFtZXMiIHRvCi0JZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIGEgbG9jYWwgc3ltYm9sLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gMjQgMDg6MTU6NDIgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JQWRkIFNvbGFyaXMgQkNQICh0aGUgcGFydCBvZiBTb2xhcmlzIHdoaWNoIGFsbG93cyBpdCB0byBydW4KLQlTdW5PUzQgYS5vdXQgZmlsZXMpIGNvcmUgZmlsZSBoYW5kbGluZy4KLQkqIGFvdXRmMS5oIChleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlLCBzd2FwY29yZV9zb2xhcmlzX2JjcCk6Ci0JTmV3IHN0cnVjdHVyZSBhbmQgaXRzIHN3YXAgaW4gZnVuY3Rpb24uCi0JKGludGVybmFsX3N1bm9zX2NvcmUpOiAgTmV3IG1lbWJlciBjX2RhdGFfYWRkciwgdG8gcmVjZWl2ZSB0aGUKLQlzdGFydCBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlY3Rpb24gaW4gdGhlIGNvcmUgZmlsZS4KLQkoc3dhcGNvcmVfc3VuMywgc3dhcGNvcmVfc3BhcmMsIHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBVc2UgaXQuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBSZWNvZ25pemUgU29sYXJpcyBCQ1AgY29yZSBmaWxlLgotCShzdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogIEFsd2F5cyBpbmRpY2F0ZSBtYXRjaAotCWZvciBTb2xhcmlzIEJDUCBjb3JlIGZpbGVzLgotCi1UaHUgSnVuIDIzIDE1OjMxOjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgc2hhcmVkIGxpYnJhcmllcywgZnJvbSBFcmljCi0JWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogSWYgRFlOQU1JQywgc2V0IGVfdHlwZSB0byBFVF9EWU4uCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwKLQljcmVhdGUgZHluYW1pYyBzZWN0aW9ucyBmb3IgZmlyc3QgaW5wdXQgQkZEIHdpdGggdGhlIHJpZ2h0IGZvcm1hdC4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBjcmVhdGUgLmludGVycCBzZWN0aW9uCi0JaWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogU2tpcCBkeW5hbWljIHNlY3Rpb25zIGluIGlucHV0IGZpbGUuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGl0J3MgT0sgZm9yCi0JZHlub2JqIHRvIGhhdmUgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBTRUNfSU5fTUVNT1JZLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHNldCAuaW50ZXJwCi0Jc2VjdGlvbiBpZiBub3QgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBEb24ndCBzZXQgRFlOQU1JQyBqdXN0IGJlY2F1c2UgdGhlcmUKLQlpcyBhbiBTSFRfRFlOQU1JQyBzZWN0aW9uLgotCi0JKiBjZi1pMzg2bHlueC5jIChpMzg2Y29mZl92ZWMpOiBEb24ndCBpbmNsdWRlIERZTkFNSUMgaW4KLQlvYmplY3RfZmxhZ3MuCi0JKiBjb2ZmLXNwYXJjLmMgKHNwYXJjY29mZl92ZWMpOiBMaWtld2lzZS4KLQkqIGhwcGFic2QtY29yZS5jIChocHBhYnNkX2NvcmVfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogRG9uJ3Qgc2V0IFNFQ19SRUxPQwotCWp1c3QgYmVjYXVzZSBEWU5BTUlDIGlzIHNldC4KLQotVGh1IEp1biAyMyAxMjo1Mzo0MSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMgYW5kCi0JLS13aXRoLTY0LWJpdC1iZmQgdG8gLS1lbmFibGUtNjQtYml0LWJmZC4KLQkqIE1ha2VmaWxlLmluLCBtcHctbWFrZS5pbiwgdGFyZ2V0cy5jOiBDaGFuZ2UgY29tbWVudHMuCi0KLVdlZCBKdW4gMjIgMTc6NTk6NTkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLWVsZiopOiBOZXcgdGFyZ2V0LCBqdXN0IGxpa2UKLQlwb3dlcnBjLSotc3lzdjQqLgotCi0JKiBsaW5rZXIuYyAoRkFJTCk6IFVuZGVmaW5lIG1hY3JvIGJlZm9yZSBkZWZpbmluZyBhcyBlbnVtLgotCi1XZWQgSnVuIDIyIDEwOjUyOjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJbml0aWFsaXplCi0JcGFzcyBmcm9tIGFiZmQtPmFyY2hpdmVfcGFzcywgYW5kIHNhdmUgaXQgdGhlcmUgYXMgd2VsbC4KLQotCSogaGFzaC5jIChiZmRfaGFzaF9hbGxvY2F0ZSk6IERvbid0IGNhbGwgYmZkX3NldF9lcnJvciBpZgotCW9ic3RhY2tfYWxsb2MgcmV0dXJucyBOVUxMIHVubGVzcyB0aGUgc2l6ZSBpcyBub24temVyby4KLQotCSogbGlua2VyLmMgKGFyY2hpdmVfaGFzaF9hbGxvY2F0ZSk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IFVzZSBhcmNoaXZlX2hhc2hfYWxsb2NhdGUKLQlyYXRoZXIgdGhhbiBvYnN0YWNrX2FsbG9jLCBmb3IgY2xhcml0eS4KLQotCSogZWxmY29kZS5oIChlbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogQ29ycmVjdC4KLQotCSogYW91dDY0LmMgKEJNQUdJQywgUU1BR0lDKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBGcm9tCi0JUGV0ZXIgU2NoYXVlciA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+LgotCi0JTGludXggWk1BR0lDIHN1cHBvcnQgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBmaWVsZCB6bWFnaWNfZGlza19ibG9ja19zaXplLgotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogT25seSBzZXQgYWxpZ25tZW50IGFjY29yZGluZyB0bwotCWFyY2hpdGVjdHVyZSBpZiB0aGUgc2VjdGlvbiBzaXplcyBhcmUgYWxpZ25lZCB0byB0aGF0IGFsaWdubWVudCwKLQlmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQkoTVkoc2V0X3NpemVzKSk6IEluaXRpYWxpemUgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSBmaWVsZC4KLQkqIGFvdXR4LmggKGFkanVzdF96X21hZ2ljKTogU2V0IHp0aWggaWYgdXNpbmcgcV9tYWdpY19mb3JtYXQuICBTZXQKLQl0ZXh0IHNlY3Rpb24gZmlsZXBvcyB0byB6bWFnaWNfZGlza19ibG9ja19zaXplIGlmIG5vdCB6dGloLiAgVXNlIGEKLQlkaWZmZXJlbnQgcGFkZGluZyBhbGdvcml0aG0gaWYgbm90IHp0aWguCi0JKiBpMzg2bGludXguYyAoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogSnVzdCBza2lwIE5fU1RBQiBhbmQgTl9GTgotICAgICAgICBzeW1ib2xzOyBkb24ndCBsb29rIHRoZW0gdXAgaW4gdGhlIGhhc2ggdGFibGUuICBGcm9tCi0gICAgICAgIHJhbHBoY0BweXJhbWlkLmNvbSAoUmFscGggQ2FtcGJlbGwpLgotCi1UdWUgSnVuIDIxIDExOjQ3OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1nbzMyLmMgKGdvMzJjb2ZmX2FyY2hpdmVfcCk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2Fic19zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX2Fic19zZWN0aW9uX3B0ciwgYmZkX2lzX2Fic19zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfdW5kX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgotCShiZmRfdW5kX3NlY3Rpb25fcHRyLCBiZmRfaXNfdW5kX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF9jb21fc2VjdGlvbik6IE1ha2UgY29uc3QuCi0JKGJmZF9jb21fc2VjdGlvbl9wdHIpOiBEZWZpbmUuCi0JKGJmZF9pbmRfc2VjdGlvbik6IE1ha2UgY29uc3QuCi0JKGJmZF9pbmRfc2VjdGlvbl9wdHIsIGJmZF9pc19pbmRfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX2Fic19zeW1ib2wsIGJmZF9jb21fc3ltYm9sKTogTWFrZSBjb25zdC4KLQkoYmZkX3VuZF9zeW1ib2wsIGJmZF9pbmRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGdsb2JhbF9zeW1zKTogQ2FzdCBpbml0aWFsaXphdGlvbiBvZiBzZWN0aW9uIGZpZWxkLgotCShTVERfU0VDVElPTik6IERlZmluZSBhcyBjb25zdCwgYW5kIGNhc3QgaW5pdGlhbGl6YXRpb25zLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogTWFueSBmaWxlczogQ2hhbmdlIHVzZXMgb2YgYmZkX2Fic19zZWN0aW9uLCBldGMuLCB0byB1c2UKLQliZmRfYWJzX3NlY3Rpb25fcHRyIG9yIGJmZF9pc19hYnNfc2VjdGlvbiwgZXRjLgotCi1Nb24gSnVuIDIwIDExOjA2OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFueSBmaWxlczogY2hhbmdlIGFsbCBiZmRfdGFyZ2V0IHZlY3RvcnMgdG8gYmUgY29uc3QuICBDaGFuZ2UKLQlhbGwgdXNlcyBvZiBiZmRfdGFyZ2V0ICogdG8gYmUgY29uc3QgYmZkX3RhcmdldCAqLiAgQ2hhbmdlCi0JYmZkX3RhcmdldF92ZWN0b3IgYW5kIGJmZF9kZWZhdWx0X3ZlY3RvciBhcnJheXMgdG8gYmUgY29uc3QKLQliZmRfdGFyZ2V0ICogY29uc3QgKi4KLQotCSogZWNvZmYuYywgbGliZWNvZmYuaCwgZWNvZmZzd2FwLmgsIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmMsCi0JZWxmMzItbWlwcy5jOiBSZW5hbWVkIGFsbCBleHRlcm5hbGx5IHZpc2libGUgRUNPRkYgcm91dGluZXMgd2hpY2gKLQlhcmUgbG9jYWwgdG8gQkZEIHRvIHN0YXJ0IHdpdGggX2JmZF9lY29mZiBpbnN0ZWFkIG9mIGp1c3QgZWNvZmYuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N3YXBfdGlyX2luKTogQ2hhbmdlIGlucHV0IGFyZ3VtZW50IHRvIGNvbnN0LgotCShlY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KLQkoZWNvZmZfc3dhcF9ybmR4X2luLCBlY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBBZGQgbmV3IGFyZ3VtZW50cyB0byBjb3JyZXNwb25kIHRvCi0JcmVhZF9kZWJ1Z19pbmZvIGVudHJ5IHBvaW50IGluIGVjb2ZmX2RlYnVnX3N3YXAgc3RydWN0dXJlLgotCUNoYW5nZSBhbGwgY2FsbHMuCi0JKiBsaWJlY29mZi5oIChlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQ2hhbmdlIGRlY2xhcmF0aW9uLgotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfdGlyX2luLCBlY29mZl9zd2FwX3Rpcl9vdXQpOiBEZWNsYXJlLgotCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBEZWNsYXJlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldwotCWVjb2ZmX2RlYnVnX3N3YXAgZmllbGRzLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFVuZGVmaW5lIFJFQUQuCi0JKG1pcHNfZWxmX2Vjb2ZmX2RlYnVnX3N3YXApOiBJbml0aWFsaXplIG5ldyBlY29mZl9kZWJ1Z19zd2FwCi0JZmllbGRzLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfYmlnbWlwc192ZWMpOiBVc2UgZWNvZmYubyBhbmQKLQllY29mZmxpbmsuby4KLQkoYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2JpZ192ZWMsIGVjb2ZmX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBSZW1vdmUgZWNvZmYubyBhbmQgZWNvZmZsaW5rLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVjb2ZmLm8gYW5kIGVjb2ZmbGluay5vLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBDaGVjayBmbGF2b3VyIG9mIHN1Yiwgbm90IGFiZmQsCi0Jd2hlbiBjb21wdXRpbmcgcmVsb2Mgc2l6ZXMuICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCB0cnkgdG8gY29tcHV0ZSBtYXhpbXVtCi0JcmVsb2MgY291bnQgb3Igc2l6ZSBmb3IgYSBub24tRUxGIGZpbGUuCi0KLQkqIG1pcHNic2QuYyAoTVlfZmluYWxfbGlua19jYWxsYmFjayk6IERlZmluZSB0byBhdm9pZCB3YXJuaW5nLgotCi0JKiBocDMwMGhwdXguYyAoTVlfZmluYWxfbGlua19jYWxsYmFjayk6IERlZmluZSB0byBhdm9pZCB3YXJuaW5nLgotCShCTUFHSUMsIFFNQUdJQyk6IERlZmluZTsgdXNlZCBieSBhb3V0eC5oLgotCShNWShzbHVycF9zeW1ib2xfdGFibGUpKTogQ2hhbmdlIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MKLQljYWxscyB0byB1c2UgbmV3IHBhcmFtZXRlcnMuCi0KLUZyaSBKdW4gMTcgMTQ6NDU6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBTZXQgdGhlIGFsaWdubWVudHMgb2YgdGhlIHRleHQsCi0JZGF0YSBhbmQgYnNzIHNlY3Rpb25zIGFmdGVyIGRldGVybWluaW5nIHRoZSBhcmNoaXRlY3R1cmUuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogVHJlYXQgYSBjb21tb24gc3ltYm9sIGZyb20gYQotCWR5bmFtaWMgb2JqZWN0IGFzIGJlaW5nIGluIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIG9iamVjdCwgcmF0aGVyCi0JdGhhbiBhcyBiZWluZyB1bmRlZmluZWQuCi0KLUZyaSBKdW4gMTcgMTE6MTY6NTAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmhwcGEuaCAoYmZkX2hwcGFfaW5zbjJmbXQsIGhwcGFfcmVidWlsZF9pbnNuKTogTWFrZSBJTkxJTkUuCi0KLQkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IERlbGV0ZSBkZWNsLgotCi1UaHUgSnVuIDE2IDIzOjM2OjIzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHRyeSB0byByZWFkIGxvY2FsIHN5bWJvbHMKLQlpZiB0aGVyZSBhcmVuJ3QgYW55IGluIHRoZSBpbnB1dCBmaWxlLgotCi1UaHUgSnVuIDE2IDE0OjI1OjIyIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogaTM4NmxpbnV4LmM6IE1hbnkgbmV3IGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgZm9yIGxpbmtlcgotCXN1cHBvcnQgZm9yIExpbnV4IHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBiZmQtaW4uaCAoYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVRodSBKdW4gMTYgMTQ6MjM6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBJZiBzZWNvbmQgYXJndW1lbnQgaXMgYGBfJycsIHRoZW4sIGluc3RlYWQgb2YKLQllY2hvaW5nIGNvbmZpZyBmaWxlIG5hbWUsIGVjaG8gd2hldGhlciB0YXJnZXQgdXNlcyBsZWFkaW5nCi0JdW5kZXJzY29yZXMgb24gc3ltYm9sIG5hbWVzLiAgQWRkIGFwcHJvcHJpYXRlIHNldHRpbmdzIHRvCi0JZGlmZmVyZW50IGNhc2VzLiAgVXNlZCBieSBiaW51dGlscy9jb25maWd1cmUuaW4gdG8gc2V0IGRlZmF1bHQgZm9yCi0JYysrZmlsdC4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBJZiB0cnlpbmcgdG8gZ2VuZXJhdGUgYSBzaGFyZWQKLQlvYmplY3QsIHdhcm4gYW5kIHJldHVybiBmYWxzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBBY2NlcHQgQk1BR0lDIG9iamVjdHMKLQlhbmQgdHJlYXQgdGhlbSBhcyBPTUFHSUMuCi0KLVdlZCBKdW4gMTUgMTg6MDI6MjEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCUVuYWJsZSBzcGFyYyB2OSBzdXBwb3J0IGZvciByZWxlYXNlLiAgTm90ZSB0aGF0IHRoaXMgaXMgc3RpbGwgYQotCXdvcmsgaW4gcHJvZ3Jlc3MsIHBlbmRpbmcgcmVsZWFzZSBvZiBhbiBBQkkgc3BlY2lmaWNhdGlvbi4KLQkqIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBzcGFyYyB2OSBlbGYgY29uZmlnLgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgc3BhcmMgdjkgKDY0IGJpdCkuCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsKTogTmV3IHJlbG9jIHR5cGVzLgotCSogZWxmNjQtc3BhcmMuYzogSW1wbGVtZW50IGVsZjY0LXNwYXJjIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluLCB0YXJnZXRzLmM6IFVwZGF0ZWQuCi0KLVdlZCBKdW4gMTUgMDE6MzQ6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBOZXcgZmllbGQgZHRfbmVlZGVkX25hbWUuCi0JKGVsZl9kdF9uZWVkZWRfbmFtZSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZWxmX2R0X25lZWRlZF9uYW1lCi0JaXMgc2V0LCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZSBmaWxlbmFtZSBmb3IgdGhlIERUX05FRURFRCBkeW5hbWljCi0JZW50cnkuCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHNpbnRlcnBwdHIKLQlhcmd1bWVudCwgYW5kIHNldCBpdCB0byB0aGUgLmludGVycCBzZWN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgcHJvdG90eXBlLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGNvZmYtc3BhcmMuYyAoU1dBUF9PVVRfUkVMT0NfRVhUUkEpOiBEZWZpbmUgdG8gY2xlYXIgdGhlIHJfc3BhcmUKLQlmaWVsZCBvZiB0aGUgcmVsb2MgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBiZSBnYXJiYWdlLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9hcm1hcCk6IFJlY29nbml6ZSBfXy5TWU1ERUYvIGFzIHdlbGwgYXMKLQlfXy5TWU1ERUY7IHRoZSBmb3JtZXIgd2FzIHVzZWQgaW4gb2xkIExpbnV4IGFyY2hpdmVzLiAgRnJvbQotCWpyc0B3b3JsZC5zdGQuY29tIChSaWNrIFNsYWRrZXkpLgotCi0JKiBpMzg2bGludXguYyAoaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlZmluZTsgbGlrZQotCU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgaW4gYW91dC10YXJnZXQuaCwgYnV0IHNldCBNQUNIVFlQRSB0bwotCU1fMzg2LiAgRnJvbSBqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KS4KLQkoTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVmaW5lLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogVHJlYXQgTl9TRVRWIHN5bWJvbHMKLQlhcyBOX0RBVEEgc3ltYm9scy4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4Lmg6IFJld3JpdGUgc3ltYm9sIGR1cGxpY2F0ZSBlbGltaW5hdGlvbiB0byB1c2UgQkZEIGhhc2gKLQl0YWJsZXMuCi0JKHN0cnVjdCBzdHJpbmd0YWJfZW50cnksIHN0cnVjdCBzdHJpbmd0YWJfZGF0YSk6IFJlbW92ZS4KLQkoSEFTSE1BWExFTiwgSEFTSF9DSEFSLCBoYXNoLCBjb21wYXJlLCBsb2cyLCBlbWl0X3N0cnRhYik6IFJlbW92ZS4KLQkoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5LCBzdHJ1Y3Qgc3RydGFiX2hhc2gpOiBEZWZpbmUuCi0JKHN0cnRhYl9oYXNoX25ld2Z1bmMsIHN0cnRhYl9oYXNoX2xvb2t1cCk6IERlZmluZS4KLQkoc3RyaW5ndGFiX2ZyZWUsIGVtaXRfc3RyaW5ndGFiKTogRGVmaW5lLgotCShzdHJpbmd0YWJfaW5pdCwgYWRkX3RvX3N0cmluZ3RhYik6IFJld3JpdGUuCi0JKE5BTUUoYW91dCx3cml0ZV9zeW1zKSk6IFVzZSBuZXcgc3RyaW5ndGFiIGNvZGUuCi0JKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbywgTkFNRShhb3V0LGZpbmFsX2xpbmspKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzLCBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGJmZC1pbi5oIChCRkRfVFJBRElUSU9OQUxfRk9STUFUKTogRGVmaW5lIG5ldyBCRkQgZmxhZyB0bwotCXJlcXVlc3QgQkZEIHRvIHdyaXRlIG9iamVjdCBpbiB0aGUgdHJhZGl0aW9uYWwgZm9ybWF0LCB3aGF0ZXZlcgotCXRoYXQgbWVhbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIGJhY2tlbmQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGhhc2guYyAoYmZkX2hhc2hfYWxsb2NhdGUpOiBJZiBvYnN0YWNrX2FsbG9jIGZhaWxzLCBzZXQKLQliZmRfZXJyb3Jfbm9fbWVtb3J5LgotCi1UdWUgSnVuIDE0IDEzOjAwOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgcV9tYWdpY19mb3JtYXQgdG8gc3ViZm9ybWF0Ci0JZW51bS4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUgYXMgZnVuY3Rpb24KLQlpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgQ29weSBzdWJmb3JtYXQgaW5mb3JtYXRpb24uCi0JKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyKTogRGVmaW5lIGFzIDAgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IFVzZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciByYXRoZXIgdGhhbiAwLgotCShNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogUmVuYW1lIGZyb20gZmluYWxfbGlua19jYWxsYmFjaywgYW5kCi0JZGVmaW5lIG9ubHkgaWYgTVlfZmluYWxfbGlua19jYWxsYmFjayBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShNWV9iZmRfZmluYWxfbGluayk6IFJlbmFtZSB1c2Ugb2YgZmluYWxfbGlua19jYWxsYmFjayB0bwotCU1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2suCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEhhbmRsZSBRTUFHSUMgbGlrZQotCVpNQUdJQywgYnV0IHNldCB0aGUgc3ViZm9ybWF0IHRvIHFfbWFnaWNfZm9ybWF0LiAgQWJvcnQgaWYgdGhlCi0JbWFnaWMgbnVtYmVyIGlmIG5vdCByZWNvZ25pemVkLgotCShhZGp1c3Rfel9tYWdpYyk6IFVzZSBRTUFHSUMgaWYgcV9tYWdpY19mb3JtYXQuCi0JKiBpMzg2bGludXguYyAoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIpOiBEZWZpbmUgYXMgMS4KLQkoaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoTVlfYmZkX2ZpbmFsX2xpbmspOiBEZWZpbmUgYXMgaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IENoZWNrIGJvdGggc2VjdGlvbiBhbmQKLQlvdXRwdXRfc2VjdGlvbiBhZ2FpbnN0IHNlY3Rpb25zIG9mIGFiZmQuCi0KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgdHlwZSBvZgotCXdyaXR0ZW4gZnJvbSBib29sZWFuIHRvIGNoYXIuICBBZGQgbmV3IGZpZWxkIHNtYWxsLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHdyaXR0ZW4gdG8gMAotCXJhdGhlciB0aGFuIGZhbHNlLiAgSW5pdGlhbGl6ZSBzbWFsbCB0byAwLgotCShlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBJZiBFQ09GRiB0eXBlIGlzIHNjU1VuZGVmaW5lZCwgc2V0Ci0Jc21hbGwuICBJZiBzbWFsbCBpcyBzZXQsIGFuZCBoYXNoIHRhYmxlIHR5cGUgaXMgY29tbW9uLCBmb3JjZSB0aGUKLQlzeW1ib2wgaW50byBhIHNlY3Rpb24gbmFtZWQgU0NPTU1PTiBhbmQgY2hhbmdlIHRoZSBFQ09GRiB0eXBlIGZyb20KLQlzY0NvbW1vbiB0byBzY1NDb21tb24uCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBTZXQgd3JpdHRlbiB0byAxIHJhdGhlciB0aGFuIHRydWUuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogQ29ycmVjdCBKTVBBRERSIHJlbG9jCi0Jb3ZlcmZsb3cgY2hlY2sgdG8gY29uc2lkZXIgc2VjdGlvbiBWTUEgb2YgaW5wdXQgZmlsZS4KLQotTW9uIEp1biAxMyAxNDoyMDowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgYQotCW1hY2hpbmUgdHlwZSBvZiA2ODAwMC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogQWRkIG5ldyBhcmd1bWVudCB1bmtub3duLgotCVNldCAqdW5rbm93biB0byB0cnVlIGlmIG1hY2hpbmUgdHlwZSBpcyByZWFsbHkgdW5rbm93biwgYXMgb3Bwb3NlZAotCXRvIE1fVU5LTk9XTiBmb3IgdGhlIDY4MDAwLgotCShOQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkpOiBDaGFuZ2UgTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkgY2FsbAotCWFjY29yZGluZ2x5LgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEFkZCBuZXcgYXJndW1lbnQgdG8KLQlwcm90b3R5cGUuCi0KLVN1biBKdW4gMTIgMjA6MjE6MDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChFWEVDX0FVWF9JRCk6IERlZmluZSBiYXNlZCBvbiBhdmFpbGFibGl0eSBvZiBIUFVYX0FVWF9JRAotCW9yIEhJVVhfQVVYX0lELgotCShzb21fYmVnaW5fd3JpdGluZyk6IFVzZSBFWEVDX0FVWF9JRCBpbnN0ZWFkIG9mIEhQVVhfQVVYX0lELgotCShzb21fd3JpdGVfYXJtYXApOiBVc2UgQ1BVX1BBX1JJU0MxXzAgYXMgdGhlIG1hZ2ljIG51bWJlci4gIE5vdGUKLQlzb20uYyBpcyBjYXJlZnVsIHRvIGFsd2F5cyBkZWZpbmUgQ1BVX1BBX1JJU0MxXzAuCi0KLVNhdCBKdW4gMTEgMTY6MzI6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIHdlYWsgc3ltYm9scyBhcyBhbiBleHRlbnNpb24gdG8gYS5vdXQuCi0JKiBhb3V0eC5oIChzeW1faW5fdGV4dF9zZWN0aW9uKTogRG9uJ3QgZGVmaW5lLgotCShzeW1faW5fZGF0YV9zZWN0aW9uLCBzeW1faW5fYnNzX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoc3ltX2lzX3VuZGVmaW5lZCwgc3ltX2lzX2dsb2JhbF9kZWZuKTogTGlrZXdpc2UuCi0JKHN5bV9pc19kZWJ1Z2dlcl9pbmZvLCBzeW1faXNfZm9ydHJhbmNvbW1vbik6IExpa2V3aXNlLgotCShzeW1faXNfYWJzb2x1dGUsIHN5bV9pc19pbmRpcmVjdCk6IExpa2V3aXNlLgotCSh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogUmV3cml0ZSBmb3IgY2xhcml0eS4gIFJlYXJyYW5nZQotCWFyZ3VtZW50cyBhbmQgY2hhbmdlIGNhbGxlci4gIEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogRG9uJ3QgaWdub3JlIHdlYWsgc3ltYm9scy4gIFB1bGwKLQlvYmplY3QgaW4gZnJvbSBhcmNoaXZlIGlmIGEgd2VhayBkZWZpbnRpb24gaXMgZm91bmQgZm9yIGFuCi0JZXhpc3RpbmcgdW5kZWZpbmVkIHN5bWJvbC4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUHV0IGFsbCBjYXNlcyBpbiBzd2l0Y2guICBTZXQgZmxhZ3Mgb2YgYW4KLQl1bmRlZmluZWQgc3ltYm9sIHRvIDAuICBIYW5kbGUgd2VhayBzeW1ib2xzLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotRnJpIEp1biAxMCAxMzoyNToxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogSGFuZGxlIC5ic3Mgc2VjdGlvbi4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfQ1RPUi4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogRG9uJ3QgYXNzdW1lCi0JdGhlIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sIGlzIG5vdCBOVUxMLgotCi1XZWQgSnVuICA4IDIzOjE1OjUzIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogIFNldCBFWEVDX1AgYW5kIHN0YXJ0IGFkZHJlc3MgZm9yIEdEQi4KLQotV2VkIEp1biAgOCAyMzo1NzozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBEb24ndCB0cnkgdG8gcmVhZCB0aGUKLQlzdHJpbmdzIGlmIHRoZXJlIGFyZSBubyBzeW1ib2xzLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogVXNlIHRoZSBvdXRwdXQgc2VjdGlvbiB3aGVuCi0Jd29ya2luZyBvdXQgdGhlIHR5cGUuCi0KLVR1ZSBKdW4gIDcgMTM6MjU6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBQdXQgc2hzdHJ0YWIsIHN5bXRhYiBhbmQKLQlzdHJ0YWIgc2VjdGlvbnMgYXQgZW5kIG9mIGZpbGUuICBBdm9pZHMgYnVnIGluIHNvbWUgdmVyc2lvbnMgb2YKLQlTVlI0IHN0cmlwLiAgRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0B0YW50YWx1cy5ucmwubmF2eS5taWw+LgotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IElmIENPRkZfUEFHRV9TSVpFIGlzIGRlZmluZWQsCi0Jc2V0IFNFQ19ERUJVR0dJTkcgZm9yIFNUWVBfSU5GTyBzZWN0aW9ucy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBDT0ZGX1BBR0VfU0laRSBpcwotCWRlZmluZWQsIGFuZCBEX1BBR0VEIGlzIHNldCwgc2V0IHRoZSBmaWxlIHBvc2l0aW9uIGVxdWFsIHRvIHRoZQotCXNlY3Rpb24gVk1BIG1vZHVsbyBDT0ZGX1BBR0VfU0laRS4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogSWYgRl9FWEVDIGlzIHNldCwgc2V0IERfUEFHRUQuCi0JKiBjb2ZmLWkzODYuYzogU2V0IERfUEFHRUQgaW4gQkZEIHRhcmdldC4KLQkoQ09GRl9QQUdFX1NJWkUpOiBEZWZpbmUuCi0JKiBjb2ZmLW02OGsuYywgY29mZi1zcGFyYy5jOiBMaWtld2lzZS4KLQotTW9uIEp1biAgNiAxMDo1NzoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgdHVybiBhIHJlbG9jIHNlY3Rpb24KLQlpbnRvIGEgQkZEIHNlY3Rpb24ganVzdCBiZWNhdXNlIFNIRl9BTExPQyBpcyBzZXQ7IHJlcXVpcmUgdGhhdCBpdAotCW5vdCB1c2UgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCUJldHRlciBpbmRpcmVjdCBhbmQgd2FybmluZyBzeW1ib2wgaGFuZGxpbmcgaW5zcGlyZWQgYnkgU3R1YXJ0Ci0JUXVpY2sgPHN0dWNrQGNzLm1hbi5hYy51az4uCi0JKiBsaW5rZXIuYyAoZW51bSBsaW5rX2FjdGlvbik6IEFkZCBSRUYsIE1JTkQsIENXQVJOLCBSRUZDLgotCShsaW5rX2FjdGlvbik6IENoYW5nZSBVTkRFRl9ST1cvZGVmIGFuZCBVTkRFRldfUk9XL2RlZiBmcm9tIE5PQUNUCi0JdG8gUkVGLiAgQ2hhbmdlIFVOREVGX1JPVy9pbmRyIGFuZCBVTkRFRldfUk9XL2luZHIgZnJvbSBDWUNMRSB0bwotCVJFRkMuICBDaGFuZ2UgREVGX1JPVy9pbmRyIGFuZCBDT01NT05fUk9XL2luZHIgZnJvbSBDWUNMRSB0byBNREVGLgotCUNoYW5nZSBERUZXX1JPVy9pbmRyIGZyb20gQ1lDTEUgdG8gTk9BQ1QuICBDaGFuZ2UgSU5EUl9ST1cvaW5kcgotCWZyb20gTURFRiB0byBNSU5ELiAgQ2hhbmdlIElORFJfUk9XL3dhcm4gZnJvbSBXQVJOQyB0byBDWUNMRS4KLQlDaGFuZ2UgV0FSTl9ST1cvZGVmIGFuZCBXQVJOX1JPVy9pbmRyIGZyb20gTVdBUk4gdG8gQ1dBUk4uICBDaGFuZ2UKLQlXQVJOX1JPVy9jb20gZnJvbSBNV0FSTiB0byBXQVJOLiAgQ2hhbmdlIFdBUk5fUk9XL3dhcm4gZnJvbSBOT0FDVAotCXRvIENZQ0xFLiAgQ2hhbmdlIFNFVF9ST1cvd2FybiBmcm9tIFdBUk5DIHRvIENZQ0xFPgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEhhbmRsZSBSRUYsIE1JTkQsIENXQVJOIGFuZAotCVJFRkMuICBJZiBhIG5ldyBpbmRpcmVjdCBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZCwgcHVzaCB0aGUKLQlyZWZlcmVuY2UgZG93biB0byB0aGUgc3ltYm9sIGl0IHBvaW50cyB0by4gIEZJeCBoYW5kbGluZyBvZiBXQVJOLgotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IElmIE5fV0FSTklORywgZG9uJ3QKLQljbG9iYmVyIGVfdHlwZSBvZiBuZXh0IHN5bWJvbC4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBMb29wIG9uIGJmZF9saW5rX2hhc2hfd2FybmluZyBhcyB3ZWxsCi0JYXMgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpOiBOZXcgZmllbGQgd3JpdHRlbi4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBJbml0aWFsaXplIHdyaXR0ZW4uCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXNlIHdyaXR0ZW4sIG5vdCByb290LndyaXR0ZW4uCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkpOiBOZXcgZmllbGQgd3JpdHRlbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSB3cml0dGVuLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogdXNlIHdyaXR0ZW4sIG5vdCByb290LndyaXR0ZW4uCi0JKiBnZW5saW5rLmggKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgotCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplIHdyaXR0ZW4uCi0JKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHdyaXR0ZW4uCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogVXNlIHdyaXR0ZW4sIG5vdCByb290LndyaXR0ZW4uCi0JKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogQWRkIGxpbmtlciBmaWVsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIG5ldyB0ZGF0YSBsaW5rZXIKLQlmaWVsZCwgcmF0aGVyIHRoYW4gb3V0c3ltYm9scyBiZWluZyBub24tTlVMTCwgdG8gZGVjaWRlIHdoZXRoZXIgdG8KLQlvdXRwdXQgdGhlIHN5bWJvbHMgYW5kIHJlbG9jcy4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBTZXQgbmV3IHRkYXRhIGxpbmtlciBmaWVsZCB0byB0cnVlLgotCi0JKiBlY29mZi5jIChlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgdHJ5IHRvIGNvcHkKLQlkYXRhIHRvIGEgbm9uLUVDT0ZGIGZpbGUuCi0KLQkqIGxpYmJmZC1pbi5oOiBBZGQgd2FybmluZyB0aGF0IGxpYmJmZC5oIGlzIGEgZ2VuZXJhdGVkIGZpbGUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotU3VuIEp1biAgNSAxNTowMjozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIHRvIHN1cHBvcnQgRUxGIHN0cmlwIGFuZCBvYmpjb3B5IG9uIGR5bmFtaWNhbGx5IGxpbmtlZAotCWZpbGVzLgotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IEFkZCBwcm90b3R5cGUuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1ha2UgYSBCRkQgc2VjdGlvbiBmcm9tIGFuIFNIVF9IQVNICi0Jc2VjdGlvbiwgYW5kIGZyb20gYW4gU0hUX0RZTlNZTSBzZWN0aW9uLCBhbmQgZnJvbSB0aGUgZHluYW1pYwotCXN0cmluZyB0YWJsZSBzZWN0aW9uLgotCShlbGZfb2JqZWN0X3ApOiBTZXQgRF9QQUdFRCBpZiB0aGVyZSBpcyBhIHByb2dyYW0gaGVhZGVyLgotCShlbGZfbWFrZV9zZWN0aW9ucyk6IFJlbW92ZS4KLQkoZml4X3VwX3N0cnRhYnMpOiBSZW1vdmUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogUmV3cml0ZS4gIE5vdyBzZXRzIHNoX2VudHNpemUuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBSZXdyaXRlLiAgTm93IHNldHMgc2hfbGluayBhbmQgc2hfaW5mbwotCWZvciBhbGwgc2VjdGlvbnMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiAgRG9uJ3QgY2FsbCBvYnNvbGV0ZQotCWZ1bmN0aW9ucyBlbGZfbWFrZV9zZWN0aW9ucyBvciBmaXhfdXBfc3RydGFicy4KLQkoc3dhcF9vdXRfc3ltcyk6IFNldCBzaF9hZGRyYWxpZ24gdG8gRklMRV9BTElHTiByYXRoZXIgdGhhbiA0LgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBlcm1pdCB3cml0aW5nIERZTkFNSUMKLQlvYmplY3RzLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogVHJlYXQgU0hUX0RZTlNZTSBsaWtlIG90aGVyIG5vcm1hbAotCXNlY3Rpb25zLiAgSWYgYW4gU0hUX1JFTCBvciBTSFRfUkVMQSBzZWN0aW9uIGlzIGFsbG9jYXRlZCBvciB1c2VzCi0JYW4gdW51c3VhbCBzeW1ib2wgdGFibGUsIHBlcm1pdCBhIEJGRCBzZWN0aW9uIHRvIG1hcCB0byBpdC4KLQlQZXJtaXQgbW9zdCBTSFRfU1RSVEFCIHNlY3Rpb25zIHRvIGhhdmUgYSBCRkQgc2VjdGlvbiBtYXBwZWQgdG8KLQl0aGVtLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgc2hfbGluaywgc2hfaW5mbyBvciBzaF9lbnRzaXplCi0JZmllbGRzIG9mIGR5bmFtaWMgc2VjdGlvbnMgaGVyZTsgZG8gaXQgaW4gYXNzaWduX3NlY3Rpb25fbnVtYmVycy4KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaDogQWRkIERfUEFHRUQgdG8gcGVybWl0dGVkIG9iamVjdAotCWZsYWdzLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IE9ubHkgc2V0IFNFQ19EQVRBIGlmCi0JU0VDX0xPQUQgaXMgc2V0LCByYXRoZXIgdGhhbiBjaGVja2luZyBTRUNfQUxMT0MuCi0KLQkqIGxpYmJmZC1pbi5oIChiZmRfcmVhbGxvYyk6IENoYW5nZSBsYXN0IGFyZyB0byAic2l6ZV90IHNpemUiLgotCi1GcmkgSnVuICAzIDEwOjU4OjAyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNvbXB1dGUgdGhlIGZpbGUgaGVhZGVyJ3MKLQljaGVja3N1bSBoZXJlLgotCShzb21fd3JpdGVfaGVhZGVycyk6IEluc3RlYWQgZG8gaXQgaGVyZS4KLQotCSogbGliYmZkLmggKGJmZF9yZWFsbG9jKTogQ2hhbmdlIGxhc3QgYXJnIHRvICJzaXplX3Qgc2l6ZSIuCi0KLVRodSBKdW4gIDIgMTc6Mzk6MjIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPi4gIERvbid0IGRlY2xhcmUgZnJlZSwgZXhpdCBvcgotCWdldGVudi4KLQotCUFkZCBsaW5rZXIgc3VwcG9ydCBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcy4KLQkqIHN1bm9zLmM6IEluY2x1ZGUgYmZkbGluay5oLiAgQWRkIG1hbnkgbmV3IGZ1bmN0aW9ucyBhbmQKLQlkZWZpbml0aW9ucyBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KLQkqIGJmZC1pbi5oIChiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogYW91dHguaCAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KTogTW92ZSB0byBsaWJhb3V0LmguCi0JKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaGFzaF9sb29rdXAsIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKTogTGlrZXdpc2UuCi0JKGFvdXRfaGFzaF90YWJsZSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpKTogUmVuYW1lIGZyb20gYW91dF9saW5rX2hhc2hfbmV3ZnVuYwotCWFuZCBtYWtlIGV4dGVybmFsbHkgdmlzaWJsZS4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSk6IE5ldyBmdW5jdGlvbi4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpKTogQ2FsbAotCU5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCksIG5vdCBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0LgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBmYWlsIGlmIG5vIHN5bWJvbHMuICBJZiBpdCBleGlzdHMsCi0JY2FsbCBhZGRfZHluYW1pY19zeW1ib2xzIGJhY2tlbmQgZW50cnkgcG9pbnQgZm9yIGR5bmFtaWMgb2JqZWN0cy4KLQlVc2UgYWRkX29uZV9zeW1ib2wgYmFja2VuZCBlbnRyeSBwb2ludCBpZiBpdCBleGlzdHMuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IENhbGwgZmluaXNoX2R5bmFtaWNfbGluayBiYWNrZW5kIGVudHJ5Ci0JcG9pbnQsIGlmIGl0IGV4aXN0cy4KLQkoYW91dF9saW5rX2lucHV0X2JmZCk6IEZvciBhIGR5bmFtaWMgb2JqZWN0LCBjYWxsCi0JbGlua19keW5hbWljX29iamVjdCBiYWNrZW5kIGVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBDYWxsIHdyaXRlX2R5bmFtaWNfc3ltYm9sIGJhY2tlbmQKLQllbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IERvbid0IHJlYWQgdGhlIHJlbG9jcyBpZiB0aGV5IGhhdmUKLQlhbHJlYWR5IGJlZW4gcmVhZC4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogV2hlbiBkb2luZyBhIGZpbmFsIGxpbmssIGZvciBhCi0JcmVsb2MgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGNhbGwgY2hlY2tfZHluYW1pY19yZWxvYyBiYWNrZW5kCi0JZW50cnkgcG9pbnQsIGlmIGl0IGV4aXN0cy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKiBsaWJhb3V0Lmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICBJbmNsdWRlCi0JYmZkbGluay5oLgotCShzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpOiBNb3ZlIGluIGZyb20gYW91dHguaC4KLQkoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19oYXNoX2xvb2t1cCwgYW91dF9saW5rX2hhc2hfdHJhdmVyc2UpOiBMaWtld2lzZS4KLQkoYW91dF9oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgYWRkX2R5bmFtaWNfc3ltYm9scywKLQlhZGRfb25lX3N5bWJvbCwgbGlua19keW5hbWljX29iamVjdCwgd3JpdGVfZHluYW1pY19zeW1ib2wsCi0JY2hlY2tfZHluYW1pY19yZWxvYywgYW5kIGZpbmlzaF9keW5hbWljX2xpbmsuCi0JKHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkoYW91dF9zZWN0aW9uX2RhdGEpOiBEZWZpbmUgbmV3IGFjY2Vzc29yIG1hY3JvLgotCShOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpKTogRGVjbGFyZS4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSk6IERlY2xhcmUuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgbmV3IGFvdXRfYmFja2VuZF9kYXRhCi0JZmllbGRzLgotCSogYW91dC10YXJnZXQuaCAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogaTM4NmFvdXQuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogaTM4Nm1hY2gzLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogc3BhcmNseW54LmMgKHNwYXJjbHlueF9hb3V0X2JhY2tlbmQpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCB6ZXJvIG91dCBjYWNoZWQKLQl1bnRpbCB3ZSBrbm93IGl0IGlzIG5vbi1OVUxMLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IERvbid0IHNraXAgYSB3YXJuaW5nIHN5bWJvbCBldmVuIGlmIGl0Ci0JaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIG91dC4gIElmIHNraXBwaW5nIGFuIGluZGlyZWN0IHN5bWJvbCwKLQlza2lwIHRoZSBuZXh0IHN5bWJvbCBhcyB3ZWxsLgotCi1XZWQgSnVuICAxIDE0OjM3OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiBEb24ndCBkZWNsYXJlIHFzb3J0LCBtYWxsb2Mgb3IgcmVhbGxvYy4KLQotVGh1IE1heSAyNiAxMzo1NjowMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogQ2FzdCBiZmRfYnl0ZSBwb2ludGVyCi0JdG8gY2hhciBwb2ludGVyIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBkZXAtaW4uc2VkOiBSZW1vdmUgc3BhY2VzIGJlZm9yZSBjb2xvbnMuCi0KLQlNZXJnZWQgY2hhbmdlcyBiYWNrIGluIGZyb20gRlNGIGdhcyByZWxlYXNlIDIuMzoKLQotCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBXcmFwIGBpZicgYmxvY2sgYXJvdW5kIGdyZXAKLQlpbnZvY2F0aW9uLCB0byBhdm9pZCBhIGJ1ZyBpbiBCU0QgNC40IG1ha2UuCi0KLQlGcm9tIFJhbHBoIENhbXBiZWxsOgotCSogbWlwc2JzZC5jIChtaXBzX2ZpeF9qbXBfYWRkcik6IElmIHN5bWJvbCBpcyB1bmRlZmluZWQsIHJldHVybiBhbgotCWVycm9yLgotCShtaXBzX2ZpeF9oaTE2X3MpOiBEaXR0by4KLQotCUZyaSBNYXkgMTMgMjE6MjE6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBtYWtlZmlsZS5kb3M6IGRlZmluZSBhIGRlZmF1bHQgdGFyZ2V0LCBvciBhcmNoaXZlcyB3b24ndCB3b3JrCi0JICBkdWUgdG8gbXVsdGlwbGUgbWF0Y2hlcy4KLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgZm9yIGxhdGVzdCBmaWxlcwotCSogbWFrZWZpbGUuZG9zOiB1cGRhdGUgZm9yIGNvcnJlY3QgdGFyZ2V0cyBhbmQgc291cmNlcwotCSogY29mZi1nbzMyLmM6IFtuZXddIGdvMzIncyBDT0ZGIGZvcm1hdCAoaTM4NmNvZmYgd2l0aCB1bmRlcnNjb3JlcykKLQkqIHRhcmdldHMuYzogYWRkIGdvMzJjb2ZmIHRhcmdldAotCSogbWFrZWZpbGUuaW46IGFkZCBjb2ZmLWdvMzIuYyBzdXBwb3J0Ci0KLVRodSBNYXkgMjYgMTA6MTA6MjEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogRG8gbm90IHNldCB0aGUgc3lzdGVtX2lkIGhlcmUsIHByaXZhdGUKLQliZmQgZGF0YSBoYXMgbm90IGJlZW4gY29waWVkIHlldC4KLQkoc29tX3dyaXRlX2hlYWRlcnMpOiBJbnN0ZWFkIGRvIGl0IGhlcmUuCi0KLVR1ZSBNYXkgMjQgMTY6MTc6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JTWFrZSBNSVBTIEVMRiB1c2UgbmV3IEVMRiBiYWNrZW5kIGxpbmtlci4gIE5vIHNoYXJlZCBsaWJyYXJ5Ci0Jc3VwcG9ydCB5ZXQuCi0JKiBlbGYzMi1taXBzLmMgKGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4pOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfb3V0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZl9vYmplY3RfcCk6IElmIGxhc3Qgc3ltYm9sIGlzIExPQ0FMLCBzZXQgZWxmX2JhZF9zeW10YWIuCi0JKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBTZXQgc2hfaW5mbyBmaWVsZCBmb3IgLmdwdGFiLioKLQlzZWN0aW9ucy4KLQkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzaF9lbnRzaXplIGZvciAuZ3B0YWIuKiBzZWN0aW9ucy4KLQkobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogUmVhZCBhbmQgZnJlZSBleHRlcm5hbCBzeW1ib2xzIGxhc3QsCi0Jbm90IGZpcnN0LCBmb3IgY2xhcml0eS4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9sb29rdXApOiBEZWZpbmUgbmV3IG1hY3JvLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UpOiBEZWZpbmUgbmV3IG1hY3JvLgotCShtaXBzX2VsZl9oYXNoX3RhYmxlKTogRGVmaW5lIG5ldyBtYWNyby4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IGV4dHN5bV9pbmZvKTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKG1pcHNfZWxmX2dldF9leHRyLCBtaXBzX2VsZl9zZXRfaW5kZXgpOiBSZW1vdmUuCi0JKG1pcHNfZWxmX291dHB1dF9leHRzeW0pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShncHRhYl9jb21wYXJlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfZmluYWxfbGluayk6IFJld3JpdGUgdG8gdXNlIEVMRiBiYWNrZW5kIGxpbmtlciwgYW5kIHRvCi0JbWVyZ2UgZ3B0YWIgaW5mb3JtYXRpb24gaW4gaW5wdXQgZmlsZXMuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVmaW5lIGFzIG1hY3JvIGJlZm9yZQotCWluY2x1ZGluZyBlbGYzMi10YXJnZXQuaC4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFJlbmFtZSBmcm9tCi0JZWxmX2xpbmtfaGFzaF9uZXdmdW5jIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuICBDaGFuZ2UgY2FsbGVyLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBVc2UKLQlfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdC4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBuZXcgZmllbGQgYmFkX3N5bXRhYi4KLQkoZWxmX2JhZF9zeW10YWIpOiBEZWZpbmUgbmV3IGFjY2Vzc29yIG1hY3JvLgotCShfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERlY2xhcmUuCi0JKF9iZXdfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogQ2FsbCBiYWNrZW5kIG9iamVjdF9wIGhvb2sgYWZ0ZXIKLQlzd2FwcGluZyBpbiBhbGwgdGhlIHNlY3Rpb24gaGVhZGVycy4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDb3JyZWN0IHR5cG86IEludGVybmFsIGZvciBFeHRlcm5hbC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCByZWFkIGFsbAotCXRoZSBzeW1ib2xzLiAgU2tpcCBTVEJfTE9DQUwgc3ltYm9scyByYXRoZXIgdGhhbiBnaXZpbmcgYW4gZXJyb3IuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IElmIGVsZl9iYWRfc3ltdGFiIGlzIHNldCwgYWxsb2NhdGUgc3BhY2UgZm9yCi0JYWxsIHN5bWJvbHMsIG5vdCBqdXN0IGxvY2Fscy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IE9ubHkgc2tpcCBhIHN5bWJvbCBub3QgbWVudGlvbmVkIGJ5IGEKLQlyZWd1bGFyIGZpbGUgaWYgaXQgaXMgbWVudGlvbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IElmIGVsZl9iYWRfc3ltdGFiIGlzIHNldCwgcmVhZCBhbGwgdGhlCi0Jc3ltYm9scy4KLQotRnJpIE1heSAyMCAxMzozODoyMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IERvIG5vdCBzZXQgYW55IHJlbG9jYXRpb24gaW5mbwotCWZvciBTT00gZml4dXBzIHdoaWNoIGFyZSBuZXZlciBwYXNzZWQgdG8gQkZELgotCi1GcmkgTWF5IDIwIDExOjU3OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBNSVBTX1JfSk1QQUREUiBvdmVyZmxvdwotCWNoZWNraW5nLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBEVF9ERUJVRyB0bwotCXRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBkZWJ1Z2dlci4KLQlGcm9tIFBldGVyIFNjaGF1ZXIuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBOZXcgZnVuY3Rpb24sIGJhc2VkIG9uCi0JY29kZSByZXBlYXRlZCB0aHJlZSB0aW1lcyBpbiBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgaW4gZWxmY29kZS5oLgotCSogbGliZWxmLmggKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgbmV3IGZ1bmN0aW9uCi0JX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciB0byBjcmVhdGUgQkZEIHNlY3Rpb25zLiAgSWYgYQotCXJlbG9jIHNlY3Rpb24gZG9lcyBub3QgdXNlIHRoZSBtYWluIHN5bWJvbCB0YWJsZSwgb3IgaXQgaXMgcGFydCBvZgotCXRoZSBwcm9jZXNzIGltYWdlLCB0cmVhdCBpdCBhcyBhIG5vcm1hbCBzZWN0aW9uLCBub3QgcmVsb2NzLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBuZXcgZnVuY3Rpb24KLQlfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyLgotCi1UaHUgTWF5IDE5IDExOjM3OjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBDaGFuZ2UgYXJfbWF4X25hbWVsZW4gdmFsdWUgZnJvbQotCTE1IHRvIDE0IHRvIG1hdGNoIFNWUjQgYXIuCi0KLQlBZGQgc3VwcG9ydCBmb3IgRUxGIHNoYXJlZCBsaWJyYXJpZXMuICBMb29zZWx5IGJhc2VkIG9uIHdvcmsgYnkKLQlFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jb20+LgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZHMgZm9yIGR5bmFtaWMKLQlsaW5raW5nOiBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucywKLQllbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wsCi0JZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zLAotCWVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCwKLQllbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucy4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgdHlwZSBvZiBhbGlnbiBmaWVsZCB0bwotCWJmZF9zaXplX3R5cGUuICBBZGQgZmllbGRzIGR5bmluZHgsIGR5bnN0cl9pbmRleCwgd2Vha2RlZiwKLQllbGZfbGlua19oYXNoX2ZsYWdzLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBmaWVsZHMgZHlub2JqLCBkeW5zeW1jb3VudCwKLQlkeW5zdHIsIGJ1Y2tldGNvdW50LgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY19pbiwgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NhX2luLCBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX2luLCBiZmRfZWxmMzJfc3dhcF9keW5fb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NfaW4sIGJmZF9lbGY2NF9zd2FwX3JlbG9jX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9pbiwgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9pbiwgYmZkX2VsZjY0X3N3YXBfZHluX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSk6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKEVsZl9FeHRlcm5hbF9EeW4pOiBEZWZpbmUuCi0JKGVsZl9zd2FwX3JlbG9jX2luKTogRGVmaW5lIGFzIG1hY3JvIHVzaW5nIE5BTUUuICBNYWtlIGV4dGVybmFsbHkKLQl2aXNpYmxlLgotCShlbGZfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfcmVsb2NhX2luLCBlbGZfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX2R5bl9pbiwgZWxmX3N3YXBfZHluX291dCk6IERlZmluZSBhcyBtYWNybyB1c2luZyBOQU1FCi0JYW5kIGFzIG5ldyBleHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24uCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNlY3Rpb24gdHlwZSBvZiBkeW5hbWljIHNlY3Rpb25zIGJhc2VkIG9uCi0Jc2VjdGlvbiBuYW1lcy4KLQkoZWxmX3dyaXRlX3BoZHJzKTogUmVtb3ZlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IEFkZCBuZXcgYWxpZ24gYXJndW1lbnQuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBzZWdfaW5mbyk6IFJlbW92ZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDb21wbGV0ZWx5IHJld3JpdGUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQ29tcGxldGVseSByZXdyaXRlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyk6IERvbid0IHNldCBhIGZpbGUgcG9zaXRpb24gZm9yCi0Jc2VjdGlvbnMgd2hpY2ggYWxyZWFkeSBoYXZlIG9uZS4gIERvbid0IGJvdGhlciB0byBhbGlnbiB0aGUgZmlsZQotCXBvc2l0aW9uIGhlcmUuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBIYW5kbGUgU0hUX0hBU0ggYW5kIFNIVF9EWU5BTUlDCi0Jc2VjdGlvbiB0eXBlcy4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBmYWlscywganVzdAotCXVzZSBiZmRfYWJzX3NlY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIGVycm9yLgotCShlbGZfc2l6ZW9mX2hlYWRlcnMpOiBNYWtlIHVzZWZ1bC4KLQkoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSGFuZGxlIGR5bmFtaWMgb2JqZWN0cy4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYWRkX2R5bmFtaWNfZW50cnkpOiBEZWZpbmUgYXMgbWFjcm8gdXNpbmcgTkFNRSBhbmQgYXMgbmV3Ci0JZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9uLgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9idWNrZXRzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBOZXcgZnVuY3Rpb24uCi0JKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvKTogQWRkIGR5bnN5bV9zZWMgYW5kIGhhc2hfc2VjIGZpZWxkcy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSGFuZGxlIGR5bmFtaWMgbGlua2luZy4gIENyZWF0ZSBhIHNlY3Rpb24KLQlzeW1ib2wgZm9yIGFsbCBFTEYgc2VjdGlvbnMsIG5vdCBhbGwgQkZEIHNlY3Rpb25zLiAgU3RvcmUgc2VjdGlvbgotCXN5bWJvbCBpbmRleCBpbiB0YXJnZXRfaW5kZXggZmllbGQsIG5vdCBpbmRleCBmaWVsZC4gIFRyYXZlcnNlCi0Jb3ZlciBnbG9iYWwgc3ltYm9scyBldmVuIGlmIHN0cmlwcGluZy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IE91dHB1dCBkeW5hbWljIHN5bWJvbHMuICBNYXJrIHN5bWJvbHMKLQlkZWZpbmVkIGJ5IGR5bmFtaWMgb2JqZWN0cyBhcyB1bmRlZmluZWQuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IElnbm9yZSBkeW5hbWljIG9iamVjdHMuICBVc2UgdGFyZ2V0X2luZGV4Ci0JZmllbGQgZm9yIHNlY3Rpb24gcmVsb2NzLCBhbmQgbWFrZSBzdXJlIGl0IGlzIHNldC4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBVc2UgdGFyZ2V0X2luZGV4IGZpZWxkIGZvciBzZWN0aW9uIHJlbG9jcywKLQlhbmQgbWFrZSBzdXJlIGl0IGlzIHNldC4KLQkqIGVsZi5jIChlbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIGR5bmluZHgsIGR5bnN0cl9pbmRleCwKLQl3ZWFrZGVmIGFuZCBlbGZfbGlua19oYXNoX2ZsYWdzIGZpZWxkcy4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgZHlub2JqLCBkeW5zeW1jb3VudCwKLQlkeW5zdHIgYW5kIGJ1Y2tldGNvdW50IGZpZWxkcy4KLQkqIGVsZjMyLXRhcmdldC5oOiBJbml0aWFsaXplIG5ldyBkeW5hbWljIGxpbmtpbmcgZmllbGRzLgotCSogZWxmNjQtdGFyZ2V0Lmg6IExpa2V3aXNlLiAgCi0JKiBlbGYzMi1pMzg2LmM6IE5ldyBmdW5jdGlvbnMgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LgotCSogZWxmMzItc3BhcmMuYzogTGlrZXdpc2UuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotV2VkIE1heSAxOCAwODoyOTowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNvbS5jOiBEb24ndCBpbmNsdWRlIDxzeXMvZGlyLmg+IG9yIDxzeXMvdXNlci5oPi4KLQkoc29tX3JlbG9jX3F1ZXVlX2ZpbmQpOiBDYWxsIG1lbWNtcCBpbnN0ZWFkIG9mIGJjbXAuCi0JKHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBDaGFuZ2UgZmlyc3QgYXJndW1lbnQgdG8gYmZkICouCi0JKGNvbXBhcmVfc3ltcyk6IENoYW5nZSB0eXBlcyBvZiBhcmd1bWVudHMgdG8gY29uc3Qgdm9pZCAqLgotCShiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBSZW1vdmVkIHVudXNlZCBsb2NhbCBmb3VuZC4KLQkoc29tX3dyaXRlX2FybWFwKTogQWRkIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50IGFuZCBpbnQgYXJndW1lbnRzLgotCShzb21fd3JpdGVfYXJtYXApOiBVc2UgJWxkIGFuZCBjYXN0IHRvIGxvbmcgZm9yIGdldHVpZCByZXN1bHQuCi0KLVdlZCBNYXkgMTggMDk6MDk6MzIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuaCAoUl9IUFBBX0FCU19DQUxMKTogRGVmaW5lLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSBhYnNvbHV0ZSBjYWxscy4KLQotCSogc29tLmggKFJfSFBQQV9BQlNfQ0FMTCk6IERlZmluZS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IERlbGV0ZSBjb21wbGV4IHJlbG9jYXRpb24gdHlwZXMuCi0KLVR1ZSBNYXkgMTcgMTk6MzM6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmMgKGljb2ZmX2xpdHRsZV92ZWMsIGljb2ZmX2JpZ192ZWMpOiBJbmRpY2F0ZSBsZWFkaW5nCi0JdW5kZXJzY29yZSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJbnRlbCB0b29sIGNoYWluIChnbnU5NjB2MikuCi0KLU1vbiBNYXkgMTYgMTA6MDk6MjIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogZWxmMzItaHBwYS5jOiBDaGFuZ2UgLmhwcGFfbGlua2VyX3N0dWJzIHRvIC5QQVJJU0Muc3R1YnMsCi0JbGlrZXdpc2UgZm9yIG90aGVyIFBBIHNwZWNpZmljIHNlY3Rpb25zLgotCShocHBhX2VsZl9yZWxvY2F0ZV91bndpbmRfdGFibGUpOiBEZWxldGUgdW51c2VkCi0JZnVuY3Rpb24uCi0JKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogQ29tcGxldGVseSBuZXcgdGFibGUgYmFzZWQgb24gOTQtMDItMDIKLQlkcmFmdCBQQSBFTEYgc3BlYy4gIENoYW5nZSByZWxvY2F0aW9uIHRhZ3MgYXBwcm9wcmlhdGVseQotCXRocm91Z2hvdXQgZWxmMzItaHBwYS5jCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogUmV3cml0ZSBhbmQgc2ltcGxpZnkgYmFzZWQgb24gOTQtMDItMDIKLQlzcGVjLgotCShocHBhX2VsZl9yZWxvYyk6IExpa2V3aXNlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBMaWtld2lzZQotCShFTEZfTUFDSElORV9DT0RFKTogQ2hhbmdlIHRvIEVNX1BBUklTQy4KLQkqIGVsZjMyLWhwcGEuaDogSW5jbHVkZSAiZWxmL2hwcGEuaCIuICBDaGFuZ2UgcmVsb2NhdGlvbiB0YWdzIAotCWFwcHJvcHJpYXRlbHkgdGhyb3VnaG91dCBlbGYzMi1ocHBhLmguCi0JKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSk6IE5ldyB0YWJsZSBiYXNlZCBvbiA5NC0wMi0wMiBkcmFmdCBQQSBFTEYKLQlzcGVjLgotCShSX0hQUEFfQUJTX0NBTEwsIFJfSFBQQV9DT01QTEVYKiwgUl9IUFBBX1VOV0lORCk6IERlbGV0ZSBkZWZpbml0aW9ucy4KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogVXNlIEVNX1BBUklTQyBpbnN0ZWFkIG9mIEVNX0hQUEEuCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsKTogRGVsZXRlIHVudXNlZCBIUFBBIHJlbG9jYXRpb25zLgotCSogc29tLmggKFJfSFBQQV9BQlNfQ0FMTCwgUl9IUFBBX0NPTVBMRVgpOiBEZWxldGUgZGVmaW5pdGlvbnMuCi0KLQkqIGxpYmhwcGEuaCAoaHBwYV9maWVsZF9hZGp1c3QpOiBBdm9pZCBhZGRpbmcgY29uc3RhbnRfdmFsdWUgaW50bwotCXRoZSBmaW5hbCB2YWx1ZSB0d2ljZSBmb3IgTFIgYW5kIFJSIGZpZWxkIHNlbGVjdG9ycy4KLQotU2F0IE1heSAxNCAwOTowOToxOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYWRkX3RvX3N0cmluZ3RhYik6IFVzZSBCRkRfQVNTRVJUIG5vdCBhc3NlcnQuICBUaGlzCi0JYXZvaWRzIF9fZXByaW50ZiB0cm91Ymxlcy4KLQotRnJpIE1heSAxMyAxMDo1MToyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SLgotCi0JKiBjb25maWcvbWlwc2JlbGYubXQgKFNFTEVDVF9WRUNTKTogQWRkIGVjb2ZmX2JpZ192ZWMgYW5kCi0JZWNvZmZfbGl0dGxlX3ZlYyBzaW5jZSBJcml4IDUgc3VwcG9ydHMgRUNPRkYgZXhlY3V0YWJsZXMuCi0KLVdlZCBNYXkgMTEgMDA6MzE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEhhbmRsZSBmZHIuYWRyICE9IHBkci5hZHIKLQljb3JyZWN0bHkuCi0KLQkqIE1ha2VmaWxlLmluIChzdG1wLWJmZC5oKTogVXNlIHx8IGluc3RlYWQgb2YgOyB0byBmb3JjZSBTdW5PUwotCW1ha2UgdG8gaW52b2tlIHRoZSBzaGVsbC4KLQotVHVlIE1heSAxMCAxNDoyMzo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpOiBSZW5hbWVkIGZyb20KLQlTRUNfU0hBUkVEX0xJQlJBUlkgZm9yIGNsYXJpdHkuICBDaGFuZ2VkIGFsbCB1c2VzLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSBpcwotCXNldCwgc2V0IFNUWVBfTk9MT0FELgotCSogY29mZmdlbi5jIChjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXgpOiBEb24ndCBnZXQgYW4gYXNzZXJ0aW9uCi0JZmFpbHVyZSBiZWNhdXNlIG9mIGEgYmFkIHNoYXJlZCBsaWJyYXJ5LgotCi1Nb24gTWF5ICA5IDE4OjUzOjQwIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmM6IEFkZCBtaXNzaW5nIGNvbW1lbnQgdGVybWluYXRvci4KLQotTW9uIE1heSAgOSAxMTo1Mzo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IElmIGhhc2hwIGFuZCAqaGFzaHAKLQlhcmUgbm90IE5VTEwsIGFzc3VtZSB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGxvb2tlZCB1cCB0aGUgc3ltYm9sCi0JaW4gdGhlIGhhc2ggdGFibGUgYW5kIGhhcyBzdG9yZWQgdGhlIGVudHJ5IGluICpoYXNocC4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFNldCBoIHRvIE5VTEwgYmVmb3JlIGNhbGxpbmcKLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRG9uJ3QgcmVxdWlyZQotCXBhZ2Ugc2hhcmVkIGJldHdlZW4gLmRhdGEgYW5kIC5ic3Mgc2VnbWVudHMgdG8gY29udGFpbiB6ZXJvZXMuCi0KLQkqIGVsZmNvZGUuaDogSW5jbHVkZSBiZmRsaW5rLmguICBBZGRlZCBzZXZlcmFsIG5ldyBmdW5jdGlvbnMgdG8gZG8KLQlsaW5raW5nLgotCShFTEZfUl9UWVBFKTogRGVmaW5lLgotCShiZmRfYWRkX3RvX3N0cnRhYik6IFJldHVybiB1bnNpZ25lZCBsb25nLiAgQ2hhbmdlIGNoZWNrIGZvcgotCXJlYWxsb2MgZmFpbHVyZS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX2FkZF90b19zdHJ0YWIuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGQgbGlua19pbmZvIGFyZ3VtZW50LgotCUNhbGwgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyBob29rIGFuZCBwcmVwX2hlYWRlcnMKLQloZXJlLiAgT25seSBjYWxsIHN3YXBfb3V0X3N5bXMgaWYgbGlua19pbmZvIGlzIE5VTEwuICBTZXQgdXAKLQkuc2hzdHJ0YWIgc2VjdGlvbiBoZXJlLiAgUGFzcyBkb3N5bXMgYXJndW1lbnQgdG8KLQlhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcy4gIFNldCBvdXRwdXRfaGFzX2JlZ3VuIGZsYWcuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc3ltdGFiX2FuZF9zdHJ0YWJzKTogQWRkIGRvc3ltcwotCWFyZ3VtZW50LCBhbmQgdXNlIGl0IHRvIGNvbnRyb2wgc2V0dGluZyAuc3ltdGFiIGFuZCAuc3RydGFiIGZpbGUKLQlwb3NpdGlvbnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWRkIGRvc3ltcyBhcmd1bWVudCwgYW5kCi0JcGFzcyBpdCBvbi4KLQkocHJlcF9oZWFkZXJzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9hZGRfdG9fc3RydGFiLgotCShzd2FwX291dF9zeW1zKTogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBzZXQgdXAgLnNoc3RydGFiIGhlcmUuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogU29tZSBjYWxscyBtb3ZlZCBpbnRvCi0JZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTSE5fTE9SRVNFUlYgY29ycmVjdGVkIHRvIFNITl9MT1JFU0VSVkUuCi0JKiBsaWJlbGYuaDogSW5jbHVkZSBiZmRsaW5rLmguCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBjb2xsZWN0LAotCWVsZl9hZGRfc3ltYm9sX2hvb2ssIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24uCi0JKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCBmaWVsZCByZWxfaGFzaGVzLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbW92ZSBmaWVsZHMgaW50ZXJuYWxfc3ltcyBhbmQgc3ltYm9scy4KLQlBZGQgZmllbGQgc3ltX2hhc2hlcy4KLQkob2JqX3N5bWJvbHMsIG9ial9pbnRlcm5hbF9zeW1zKTogUmVtb3ZlIGRlZmluaXRpb25zLgotCShlbGZfc3ltX2hhc2hlcyk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGZfbGlua19oYXNoX2xvb2t1cCk6IERlZmluZS4KLQkoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZS4KLQkoZWxmX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgotCSogZWxmLmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShlbGZfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IElmIG5vdCBkZWZpbmVkLAotCWRlZmluZSBhcyAwIGFuZCB1c2UgZ2VuZXJpYyBsaW5rZXIuICBPdGhlcndpc2UsIHVzZSBFTEYgYmFja2VuZAotCWxpbmtlci4KLQkoZWxmX2JhY2tlbmRfY29sbGVjdCk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgZmFsc2UuCi0JKGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KLQkoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCSogZWxmNjQtdGFyZ2V0Lmg6IFNhbWUgY2hhbmdlcyBhcyBlbGYzMi10YXJnZXQuaC4KLQkqIGVsZjMyLWkzODYuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBlbGYzMi1zcGFyYy5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBDaGFuZ2UgdHlwZSBvZiBkc3QgZnJvbSBFbGYzMl9JbnRlcm5hbF9SZWxhCi0JdG8gRWxmX0ludGVybmFsX1JlbGEgKHRoZXkncmUgdGhlIHNhbWUgdHlwZSBhbnlob3cpLgotCShlbGZfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX2JhY2tlbmRfY29sbGVjdCk6IERlZmluZS4KLQotCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBBdm9pZCB1c2VsZXNzIG1ha2UgZXJyb3IgbWVzc2FnZSBpbiBhCi0JZGlmZmVyZW50IHdheTsgdG91Y2ggdGFrZXMgYSBudW1lcmljIGFyZ3VtZW50IG9uIHNvbWUgc3lzdGVtcy4KLQotRnJpIE1heSAgNiAxMzozNDoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBSZXdvcmsgY3VzdG9tIGhlYWRlcgotCWhhbmRsaW5nIGZvciBsYXRlc3Qgc3VnZ2VzdGVkIGZvcm1hdC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogTGlrZXdpc2UuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQotRnJpIE1heSAgNiAxMToxMTo1MCAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBoYW5kbGUgZXJyaWNzc29uIGNvbmZpZyAoZm9yIE9TRSkuCi0KLVRodSBNYXkgIDUgMTU6NDA6NDcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCVBhdGNoZXMgZnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkqIG1pcHNic2QuYyAobWlwc19maXhfam1wX2FkZHIpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZml4X2hpMTZfcyk6IFVzZSBiZmRfaXNfY29tX3NlY3Rpb24uCi0JKG1pcHNfaG93dG9fdGFibGVfZXh0KTogQ2FsbCBtaXBzX2ZpeF9qbXBfYWRkciBmb3IgTUlQU19SRUxPQ19KTVAuCi0KLUZyaSBNYXkgIDYgMTE6NDg6NTUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWg6IFhYIHN1cHBvcnQuCi0KLQlGcm9tIGJpbGwKLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBzeXNkZXAuaCB3aXRob3V0IGNhdXNpbmcgd29ycnlpbmcgYnV0Ci0JaGFybWxlc3MgZXJyb3IgbWVzc2FnZS4KLQotV2VkIE1heSAgNCAxMTowOTo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQlDaGFuZ2VkIG02OGstYW91dCB0byBzZXQgZmxhZ3MgdG8gMDsgbTY4ay1zdW5vcyBzdGlsbCB1c2VzIDEuCi0JKiBhb3V0MC5jOiBOZXcgZmlsZS4KLQkqIHRhcmdldHMuYyAoYW91dDBfYmlnX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGFvdXQwX2JpZ192ZWMuCi0JKiBjb25maWcuYmZkIChtNjgqLSotYW91dCopOiBVc2UgbTY4ay0wYW91dCwgbm90IG02OGstYW91dC4KLQkqIGNvbmZpZy9tNjhrLWFvdXQubXQgKFNFTEVDVF9WRUNTKTogUmVtb3ZlZC4KLQkqIGNvbmZpZy9tNjhrLTBhb3V0Lm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoYW91dDBfYmlnX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOiB1c2UgYW91dDAubywKLQlhb3V0MzIubyBhbmQgc3RhYi1zeW1zLm8uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQwLm8uCi0JKENGSUxFUyk6IEFkZCBhb3V0MC5jLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZCBleGVjX2hkcl9mbGFncy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAwLgotCU1ZKGJhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCi0JKiBhb3V0ZjEuaCAoc3Vub3NfMzJfc2V0X2FyY2hfbWFjaCk6IE1ha2Ugc3RhdGljLgotCShhb3V0MzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBmbGFncyBmcm9tIGJhY2tlbmQKLQlpbmZvLgotCShNWV9leGVjX2hkcl9mbGFncyk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMS4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCi0JKiBhb3V0LWVuY2FwLmMgKGVuY2FwX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBmbGFncyBmcm9tCi0JYmFja2VuZCBpbmZvLgotCShNWV9leGVjX2hkcl9mbGFncyk6IERlZmluZSBhcyBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUuCi0JKiBocDMwMGhwdXguYyAoTVlfZXhlY19oZHJfZmxhZ3MpOiBEZWZpbmUgYXMgMHgyLgotCShNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogU2V0IGZsYWdzIGZyb20gYmFja2VuZCBpbmZvLgotCSogaTM4NmFvdXQuYyAoTVkoYmFja2VuZF9kYXRhKSk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCi0JKiBpMzg2bWFjaDMuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBzcGFyY2x5bnguYyAoTkFNRShhb3V0LHNwYXJjbHlueF93cml0ZV9vYmplY3RfY29udGVudHMpKTogU2V0Ci0JZmxhZ3MgZnJvbSBiYWNrZW5kIGluZm8uCi0JKHNwYXJjbHlueF9hb3V0X2JhY2tlbmQpOiBJbml0aWFsaXplIGV4ZWNfaGRyX2ZsYWdzIGZpZWxkLgotCi1XZWQgTWF5ICA0IDAyOjU2OjAwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChpMzg2LSotZ251Kik6IFRyZWF0IGxpa2UgaTM4Ni0qLW1hY2gqLgotCShtNjgqLWFwb2xsby0qKTogVHJlYXQgYWxsIEFwb2xsbyBjb25maWdzIHRoZSBzYW1lLCBkb24ndCBoYW5kbGUKLQlCU0Qgc3BlY2lhbGx5LgotCi1UdWUgTWF5ICAzIDE5OjQzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2FjaGUuYzogUmV3cm90ZSB0byB3b3JrIGNvcnJlY3RseS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogb3BuY2xzLmMgKGJmZF9jYWNoZV9pbml0LCBiZmRfb3Blbl9maWxlKTogRG9uJ3QgZGVjbGFyZS4KLQkoYmZkX2Zkb3BlbnIpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX2NhY2hlX2luaXQuCi0KLUZyaSBBcHIgMjkgMTU6MDg6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjZi1tNjhrbHlueC5jIChDQUxDX0FEREVORCk6IENoZWNrIGZvciBQQyByZWxhdGl2ZSByZWxvY3MgYnkKLQllbnVtZXJhdGluZyB0aGVtLCBzaW5jZSB0aGUgcmVsb2MgdHlwZSBjYW4gbm90IHNlcnZlIGFzIGFuIGluZGV4Ci0JaW50byB0aGUgbTY4ayBDT0ZGIGhvd3RvX3RhYmxlLgotCi1GcmkgQXByIDI5IDA5OjQyOjM5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcuYmZkICgqLWdvMzIpOiBDaGFuZ2VkIHRvIGNvZmYuCi0JKiBjb2ZmLWg4MzAwLmMgKEpNUEwxKTogR2V0IEhPV1RPIHJpZ2h0IGZvciAyNGJpdCBicmFuY2hlcy4KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogV3JpdGUgb3V0IHRoZSBjb3JyZWN0IG51bWJlciBvZgotCXN5bWJvbHMgYW5kIGRvbid0IHN0aWNrIGluIGV4dHJhIG51bGxzLgotCi1UdWUgQXByIDI2IDE1OjA3OjI0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY2Ytc3BhcmNseW54LmMgKExZTlhPUywgQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQkqIGNvZmYtc3BhcmMuYyAoQkFETUFHKTogUmVjb2duaXplIExZTlhDT0ZGTUFHSUMuCi0JKENPRkZfU1BBUkMpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBJZiBDT0ZGX1NQQVJDLCBzZXQgYWxpZ25tZW50Ci0JcG93ZXIgb2YgZGF0YSBhbmQgYnNzIHNlY3Rpb25zIHRvIDMuCi0JKiBob3N0cy9seW54LmggKF9fTFlOWE9TKTogRGVmaW5lLgotCi1UdWUgQXByIDI2IDE1OjA0OjI2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogQWRqdXN0IHRoZSBhZGRlbmQgb2YgcmVsb2NhdGlvbnMKLQlhZ2FpbnN0IHNlY3Rpb24gc3ltYm9scyB0byBhdm9pZCBsb3NpbmcgZHVyaW5nIGxkIC1yLgotCi1UdWUgQXByIDI2IDEyOjE2OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChzaHN0cnRhYl9sZW5ndGhfZml4ZWQpOiBSZW1vdmUgdXNlbGVzcyBzdGF0aWMKLQl2YXJpYWJsZS4KLQkoc3RydWN0IGVsZl9zZWN0X2RhdGEpOiBSZW1vdmUgdW51c2VkIHN0cnVjdHVyZS4KLQkoZWxmX29iamVjdF9wKTogRnJlZSBtZW1vcnkgaWYgZXJyb3Igb2NjdXJzLiAgQ2hlY2sgcmV0dXJuIHZhbHVlCi0Jb2YgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaC4gIElmIGVsZl9nZXRfc3RyX3NlY3Rpb24gZmFpbHMsCi0JcHJlc2VydmUgZXJyb3IgY29kZSByYXRoZXIgdGhhbiBzZXR0aW5nIHdyb25nX2Zvcm1hdC4KLQkobnVsbF9zaGRyKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFJlbW92ZSBzaHN0cnRhYl9sZW5ndGhfZml4ZWQgYXNzaWdubWVudC4KLQlBbGxvY2F0ZSBmaXJzdCBzZWN0aW9uIGhlYWRlciBvbiBCRkQgb2JzdGFjayByYXRoZXIgdGhhbiB1c2luZwotCW51bGxfc2hkci4KLQkoYmZkX3BycHNpbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBuZXdzZWN0LgotCi1Nb24gQXByIDI1IDE1OjMxOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBVbmRvIHBhdGNoIG9mIEFwciAxMDsgYnJlYWtzIFNvbGFyaXMuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5Ci0JdG8gY3JlYXRlIHNlY3Rpb25zLiAgQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIHJlY3Vyc2l2ZSBjYWxscy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9tYWtlX3NlY3Rpb24uCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZl9vYmplY3RfcCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfc2VjdGlvbl9mcm9tX3NoZHIuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBMaWtld2lzZS4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXguCi0JKGJmZF9wcnN0YXR1cyk6IFJldHVybiBib29sZWFuIHZhbHVlLiAgQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX21ha2Vfc2VjdGlvbi4KLQkoYmZkX2ZwcmVnc2V0KTogTGlrZXdpc2UuCi0JKGJmZF9wcnBzaW5mbyk6IFJldHVybiBib29sZWFuIHZhbHVlLgotCShlbGZfY29yZWZpbGVfbm90ZSk6IENoZWNrIHJldHVybiB2YWx1ZXMgb2YgYmZkX3Byc3RhdHVzLAotCWJmZF9mcHJlZ3NldCwgYW5kIGJmZF9wcnBzaW5mby4KLQkoZWxmX2NvcmVfZmlsZV9wKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGVsZl9jb3JlZmlsZV9ub3RlLgotCi1GcmkgQXByIDIyIDExOjA4OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUdldCByaWQgb2YgdGhlIEVDT0ZGIC5yZWdpbmZvIHNlY3Rpb24gaGFjay4KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBjcmVhdGUgYSAucmVnaW5mbyBzZWN0aW9uLgotCShlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogRG9uJ3QgaGFuZGxlIHRoZSAucmVnaW5mbyBzZWN0aW9uLgotCShlY29mZl9zaXplb2ZfaGVhZGVycyk6IExpa2V3aXNlLgotCShlY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShlY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgdGhlIEdQIHZhbHVlIGFuZCB0aGUKLQlyZWdpc3RlciBtYXNrcy4KLQkoYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KLQkoYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSk6IERlY2xhcmUuCi0JKGJmZF9lY29mZl9zZXRfcmVnbWFza3MpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JRml4IEVDT0ZGIG9iamNvcHkgdG8gYWN0dWFsbHkgY29weSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKiBlY29mZi5jIChlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9nZXRfZXh0cik6IEFzc3VtZSB0aGF0IGFueSBFQ09GRiBzeW1ib2wgd2l0aCBsb2NhbCBjbGVhciBpcwotCWFuIGV4dGVybmFsIHN5bWJvbCwgcmF0aGVyIHRoYW4gY2hlY2tpbmcgdGhlIHN5bWJvbCBmbGFncy4gIE9ubHkKLQljaGVjayB0aGUgZmxhZ3MgZm9yIG5vbi1FQ09GRiBzeW1ib2xzLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMpOiBEb24ndCBjcmFzaCBpZiB0aGUKLQlvdXRwdXRfc2VjdGlvbiBmaWVsZCBvZiB0aGUgc3ltYm9sIHNlY3Rpb24gaXMgTlVMTC4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlIGFzCi0JZnVuY3Rpb24gcmF0aGVyIHRoYW4gZGVmaW5pbmcgYXMgbWFjcm8uCi0KLQkqIGllZWUuYyAoaWVlZV9vYmplY3RfcCk6IFNldCBiZmRfZXJyb3JfZ290X3dyb25nX2Zvcm1hdCBpZgotCWFwcHJvcHJpYXRlLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGYzMl9wb3dlcnBjX3ZlYy4KLQotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX3NldF9hcmNoX21hY2gpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLiAgQWNjZXB0IGJmZF9hcmNoX202OGsgYXMgd2VsbCBhcwotCWJmZF9hcmNoX3Vua25vd24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2gpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLgotCSogZWxmY29kZS5oIChlbGZfc2V0X2FyY2hfbWFjaCk6IERvbid0IGNoZWNrIGEgbGlzdCBvZiBFTEYKLQlhcmNoaXRlY3R1cmVzLCBqdXN0IHNlZSBpZiB0aGUgZGVzaXJlZCBhcmNoaXRlY3R1cmUgbWF0Y2hlcyB3aGF0Ci0JdGhlIEVMRiBiYWNrZW5kIHBlcm1pdHMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogUmVuYW1lIFNITUFHSUMgdG8KLQlTSF9BUkNIX01BR0lDIHRvIG1hdGNoIGNoYW5nZSBpbiBjb2ZmL3NoLmguCi0JKGNvZmZfc2V0X2ZsYWdzKTogTGlrZXdpc2UuCi0KLQlGb2xsb3cgY29udmVudGlvbiBpbiB3aGljaCBlYWNoIE5MTSBoZWFkZXIgaGFzIGFuIDggYnl0ZSBzdGFtcAotCWZvbGxvd2VkIGJ5IGEgZm91ciBieXRlIGxlbmd0aC4KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IFJlbmFtZSBubG1fY3lnbnVzX3NlY3Rpb25faGRyCi0JdG8gbmxtX2N5Z251c19leHRfaGVhZGVyLCBhbmQgY2hhbmdlIHR5cGUgdG8KLQlObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIuCi0JKG5sbV9jeWdudXNfZXh0X2hlYWRlcik6IFJlbmFtZSBmcm9tIG5sbV9jeWdudXNfc2VjdGlvbl9oZWFkZXIuCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogVXNlIEN5R25Vc0V4IGluc3RlYWQKLQlvZiBDeUduVXNTZUNzLiAgUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb24gdG8gY3lnbnVzX2V4dC4gIFJlcXVpcmUKLQlsZW5ndGggd29yZCB0byBiZSA4LgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbiB0bwotCWN5Z251c19leHQuICBTZXQgbGVuZ3RoIHdvcmQgdG8gOC4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFJlbmFtZSBmcm9tIGN5Z251c19zZWN0aW9uCi0JdG8gY3lnbnVzX2V4dC4KLQotVGh1IEFwciAyMSAyMjo1NDoyMiAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogIEtlZXAgc2VjdGlvbiB0YWJsZQotCShmcm9tIEN5R25Vc1NlQ3MpIGluIG1vcmUgcGVybWFuZW50IG1lbW9yeSB0byBrZWVwIHNlY3Rpb24gbmFtZXMKLQlmcm9tIGdldHRpbmcgdHJhc2hlZC4KLQotVGh1IEFwciAyMSAwOToyOTozNyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGxpYmVsZi5oIChlbGZfb2JqX3RkYXRhKTogIEFkZCBtZW1iZXJzIGZvciBkeW5hbWljIHN5bWJvbCB0YWJsZQotCWhhbmRsaW5nLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgSGFuZGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIFRha2UgYWRkaXRpb25hbCBwYXJhbWV0ZXIKLQl0byBzZWxlY3Qgc3RhdGljIG9yIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGFuZCByZXR1cm4gbnVtYmVyIG9mCi0Jc3ltYm9scyBzbHVycGVkIG9yIC0xIG9uIGVycm9yLgotCSogZWxmY29kZS5oIChlbGZfZ2V0X3N5bXRhYik6ICBTZXQgYmZkIHN5bWNvdW50IGZyb20KLQllbGZfc2x1cnBfc3ltYm9sX3RhYmxlIHJlc3VsdC4KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwKLQllbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogIE5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIGR5bmFtaWMKLQlzeW1ib2wgdGFibGUuCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0LmggKEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMpOgotCUNoYW5nZSB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIHByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9ucwotCWZvciBkeW5hbWljIHJlbG9jcy4KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCwgTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCksCi0JTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSwgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkLAotCWFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogIEhhbmRsZSByX2ptcHRhYmxlIGFuZCByX3JlbGF0aXZlCi0JcmVsb2NhdGlvbnMuCi0KLVRodSBBcHIgMjEgMTE6NTg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2xlYW4gdXAgdXNlcyBvZiBfYmZkX2R1bW15X3RhcmdldCAoZnJvbSBQZXRlciBTY2hhdWVyKS4KLQkqIGxpYmJmZC5jIChfYmZkX2R1bW15X3RhcmdldCk6IFNldCBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LgotCSogbmxtLXRhcmdldC5oIChubG1fY29yZV9maWxlX3ApOiBEZWZpbmUgYXMgX2JmZF9kdW1teV90YXJnZXQsIG5vdAotCU5VTEwuCi0JKiBzcmVjLmMgKHNyZWNfdmVjKTogVXNlIF9iZmRfZHVtbXlfdGFyZ2V0LCBub3QgTlVMTCwgaW4KLQlfYmZkX2NoZWNrX2Zvcm1hdC4KLQkoc3ltYm9sc3JlY192ZWMpOiBMaWtld2lzZS4KLQkqIHRla2hleC5jICh0ZWtoZXhfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IEFkZCBubG1fY3lnbnVzX3NlY3Rpb25faGRyCi0JZmllbGQuCi0JKG5sbV9jeWdudXNfc2VjdGlvbl9oZWFkZXIpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IEZyZWUgbmV3IHRkYXRhIHN0cnVjdHVyZSBpZiBmYWlsdXJlLgotCUFkZCBmaXhlZCBzZWN0aW9ucyBiZWZvcmUgc3dhcHBpbmcgaW4gYXV4aWxpYXJ5IGhlYWRlcnMuICBBZnRlcgotCWFkZGluZyBzZWN0aW9ucywgdHJlYXQgZXJyb3JzIGFzIHJlYWwsIG5vdCBhcyB3cm9uZyBmb3JtYXQuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogU3dhcCBpbiB0aGUgc2VjdGlvbnMgaGVhZGVyOyBhZGQKLQlzZWN0aW9ucyB0byB0aGUgQkZEIGZvciBlYWNoIHNlY3Rpb24gaXQgZGVzY3JpYmVzLgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBTd2FwIG91dCB0aGUgc2VjdGlvbnMgaGVhZGVyLgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWNjb3VudCBmb3IgdGhlIHNpemUgb2YgdGhlCi0Jc2VjdGlvbnMgaGVhZGVyLgotCi1XZWQgQXByIDIwIDE2OjQ1OjUxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IENoYW5nZSBtaW5pbXVtIGFsaWdubWVudCBwb3dlciB0bwotCTIsIHNvIHRoYXQgc3RhYiBzZWN0aW9ucyBjYW4gYmUgbXVsdGlwbGVzIG9mIDQgYnl0ZXMgb25seS4KLQotCSogaG9zdHMvaTM4NmFpeC5oOiBDaGFuZ2VzIHRvIGF2b2lkIHByb3RvdHlwZXMgY29uZmxpY3RzIHdpdGggdGhlCi0Jb25lcyBkZWZpbmVkIGluIHN0ZGxpYi5oLiAgKEZyb20gTWluaCBUcmFuLUxlLikKLQotV2VkIEFwciAyMCAxNDoxNToyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbTMyLXBwYy5jOiBDb21wbGV0ZSByZXdyaXRlIGZvciBuZXcgdmVyc2lvbiBvZiBQb3dlclBDCi0JTmV0V2FyZS4gIE9sZCBjb2RlIHN0aWxsIHByZXNlbnQsIGJ1dCBpZmRlZmZlZCBvdXQuCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBEb24ndCBhc3N1bWUgYQotCXBhcnRpY3VsYXIgZm9ybWF0IGZvciB0aGUgY3VzdG9tZXIgaGVhZGVyLiAgQWxsb2NhdGUgYSBibG9jayBvZgotCW1lbW9yeSBhbmQgcmVhZCBpdCBpbnRvIHRoYXQuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFdyaXRlIG91dCB0aGUgYmxvY2sgb2YgbWVtb3J5LgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSW5jbHVkZSBsZW5ndGggb2YgY3VzdG9tZXIKLQloZWFkZXIgd2hlbiBjb21wdXRpbmcgaXRzIHNpemUuCi0KLU1vbiBBcHIgMTggMTQ6Mjc6MTcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogR2V0IHRoZSBzcGFjZSdzIG51bWJlciBmcm9tIHRoZQotCWJhY2tlbmQgcHJpdmF0ZSBzZWN0aW9uIGRhdGEgcmF0aGVyIHRoYW4gdGFyZ2V0X2luZGV4LgotCShiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBTdG9yZSB0aGUgc3BhY2UncyBudW1iZXIKLQlpbiB0aGUgYmFja2VuZCBwcml2YXRlIHNlY3Rpb24gZGF0YSByYXRoZXIgdGhhbiB0YXJnZXRfaW5kZXguCi0KLQkqIHNvbS5oIChzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IEFkZCBzcGFjZV9udW1iZXIuCi0KLUZyaSBBcHIgMTUgMTI6MjI6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYyAocmVsb2NfcHJvY2Vzc2luZyk6IEFsd2F5cyBzZXQgdGhlIGFkZHJlc3Mgb2YgYQotCVJfSUhDT05TVCByZWxvYyB0byB0aGF0IG9mIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgUl9JSElIQUxGLgotCWdhcyBkb2VzIHRoaXMgYW55aG93LCBidXQgc29tZSBvdGhlciBhc3NlbWJsZXJzIHNlZW0gdG8gbGVhdmUKLQlnYXJiYWdlIGluIHRoZSBSX0lIQ09OU1QgYWRkcmVzcyBmaWVsZC4KLQotCSogYmZkL2FyY2hpdmUuYzogQ29uc2lzdGVudGx5IHVzZSBBUkZNQUc7IGZyb20KLQlzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUgKEFuZHJlYXMgU2Nod2FiKS4KLQkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogVXNlIEFSRk1BRyByYXRoZXIgdGhhbiAnYCcgYW5kCi0JJ1wwMTInLgotCShic2Rfd3JpdGVfYXJtYXApOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogV2hlbiByZWxheGluZywgYWRqdXN0IGxvY2FsCi0JcmVsb2NzIGFnYWluc3QgdGhlIC50ZXh0IHNlY3Rpb24gYXMgcmVxdWlyZWQuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBXaGVuIHJlbGF4aW5nLCBhZGp1c3QKLQlQRFIgYWRkcmVzc2VzIGFzIHJlcXVpcmVkLgotCi0JKiBlY29mZi5jIChlY29mZl9lbWl0X2FnZ3JlZ2F0ZSk6IFRha2UgZmRyIGFyZ3VtZW50LiAgTWFwIGZkcgotCWluZGV4IHRocm91Z2ggcmZkIG1hcCBpZiBpdCBleGlzdHMuICBDaGVjayBmb3IgYSBjb3VwbGUgb2YgY2FzZXMKLQl3aGljaCBnZGIgaGFuZGxlcyBzcGVjaWFsbHkuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGVjb2ZmX3R5cGVfdG9fc3RyaW5nKTogVGFrZSBmZHIgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXV4X3B0ciBhbmQKLQliaWdlbmRpYW4gYXJndW1lbnQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGVjb2ZmX3ByaW50X3N5bWJvbCk6IEhhbmRsZSBzdFN0cnVjdCwgc3RVbmlvbiBhbmQgc3RFbnVtLgotCi1UaHUgQXByIDE0IDEzOjA1OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfaG93dG9fdGFibGUpOiBBZGQgZHVtbXkgZW50cmllcyB0byBhY2NvdW50IGZvcgotCW51bWJlcmluZyBjaGFuZ2VzIGluIGluY2x1ZGUvY29mZi9taXBzLmguICBBZGQgZW50cmllcyBmb3IKLQlNSVBTX1JfUkVMSEkgYW5kIE1JUFNfUl9SRUxMTy4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX2luKTogSGFuZGxlIGFuIGV4dHJhIGJpdCBmb3IgdGhlIHJlbG9jIHR5cGUKLQl3aGVuIGxpdHRsZSBlbmRpYW4uICBUcmVhdCBpbnRlcm5hbCBNSVBTX1JfUkVMTE8gb3IgTUlQU19SX1JFTEhJCi0JcmVsb2NzIGxpa2UgTUlQU19SX1NXSVRDSCwgYW5kIGNvbnZlcnQgcl9vZmZzZXQgZnJvbSAyNCB0byAzMgotCWJpdHMuCi0JKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBIYW5kbGUgaW50ZXJuYWwgTUlQU19SX1JFTExPIG9yCi0JTUlQU19SX1JFTEhJIHJlbG9jcyBsaWtlIE1JUFNfUl9TV0lUQ0guCi0JKG1pcHNfYWRqdXN0X3JlbG9jX291dCk6IExpa2V3aXNlLgotCShtaXBzX3JlbGhpX2FkZHIsIG1pcHNfcmVsaGlfYWRkZW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1pcHNfcmVsaGlfcmVsb2MsIG1pcHNfcmVsbG9fcmVsb2MpOiBOZXcgZnVuY3Rpb25zLgotCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFR1cm4gQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBpbnRvCi0JTUlQU19SX1JFTEhJIGFuZCB0dXJuIEJGRF9SRUxPQ19QQ1JFTF9MTzE2IGludG8gTUlQU19SX1JFTExPLgotCShtaXBzX3JlbG9jYXRlX2hpKTogUmVuYW1lIGZyb20gbWlwc19yZWxvY2F0ZV9yZWZoaSwgYW5kIGFkZCBwY3JlbAotCWFyZ3VtZW50LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogUmVuYW1lIGdvdF9yZWZsbyB0byBnb3RfbG8gYW5kCi0JcmVmbG9faW50X3JlbCB0byBsb19pbnRfcmVsLiAgSGFuZGxlIE1JUFNfUl9SRUxMTyBhbmQgTUlQU19SX1JFTEhJCi0JcmVsb2NzLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBBZGp1c3QgTUlQU19SX1JFTEhJL01JUFNfUl9SRUxMTyBwYWlycyB3aGVuCi0JZXhwYW5kaW5nIGEgUEMgcmVsYXRpdmUgY2FsbC4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MKLQlhbmQgQkZEX1JFTE9DX1BDUkVMX0xPMTYuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVdlZCBBcHIgMTMgMTE6NTA6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNwYXJjLmMgKHNwYXJjY29mZl92ZWMpOiBTZXQgbWluaW11bSBhbGlnbm1lbnQgcG93ZXIgdG8gMy4KLQotVHVlIEFwciAxMiAxMzozNjoyMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBBbHdheXMgZW1pdCBhdCBsZWFzdAotICAgICAgICBvbmUgcmVsb2NhdGlvbiBmb3IgYW55IG5vbi1ic3Mgc2VjdGlvbi4KLQotTW9uIEFwciAxMSAxNDo0MTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBEb24ndCByZXF1aXJlCi0JdGhlIGZpbGUgYWxpZ25tZW50IHRvIGNvcnJlc3BvbmQgdG8gdGhlIHBhZ2Ugc2l6ZSB3aGVuIGxpbmtpbmcKLQl3aXRoIC1OLgotCi1TdW4gQXByIDEwIDAxOjAyOjI0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEZvciByZWxhIHJlbG9jYXRpb25zLCBhZGp1c3QgdGhlCi0JYWRkZW5kIGZvciByZWxvY2F0aW9ucyBpbnZvbHZpbmcgc2VjdGlvbiBzeW1ib2xzIHRvIGFjY291bnQKLQlmb3IgdGhlIGxvc3NhZ2Ugb2YgMToxIG1hcHBpbmcgZnJvbSBpbnB1dCBzZWN0aW9uIHN5bWJvbHMgdG8KLQlvdXRwdXQgc2VjdGlvbiBzeW1ib2xzLgotCi1GcmkgQXByICA4IDEyOjIyOjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpKTogTmV3IGZ1bmN0aW9uLgotCShOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IENhbGwgTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpCi0JcmF0aGVyIHRoYW4gbWFraW5nIHNlY3Rpb25zIGlubGluZS4KLQkoTkFNRShhb3V0LG1rb2JqZWN0KSk6IERvbid0IG1ha2UgYW55IHNlY3Rpb25zLgotCShOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSk6IENhbGwgTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBkZXJlZmVyZW5jZSBvYmpfdGV4dHNlYyAoYWJmZCkgb3IKLQlvYmpfZGF0YXNlYyAoYWJmZCkgaWYgdGhleSBhcmUgTlVMTC4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpKTogRGVjbGFyZS4KLQkqIGJvdXQuYyAoYl9vdXRfbWtvYmplY3QpOiBEb24ndCBtYWtlIGFueSBzZWN0aW9ucy4KLQkoYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBhb3V0XzMyX21ha2Vfc2VjdGlvbnMuCi0JKGJfb3V0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBpMzg2b3M5ay5jIChvczlrX21rb2JqZWN0KTogRG9uJ3QgbWFrZSBhbnkgc2VjdGlvbnMuCi0JKG9zOWtfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBhb3V0XzMyX21ha2Vfc2VjdGlvbnMuCi0JKG9zOWtfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spKTogRG9uJ3Qgc2V0IE5fRVhUIGluIHRhcmdldAotCWluZGV4LgotCi1XZWQgQXByICA2IDIwOjQ0OjU2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlnLmJmZCwgY29uZmlndXJlLmhvc3Q6ICBBZGQgbWlwcy0qLXN5c3Y0KiBzdXBwb3J0LgotCi1UaHUgQXByICA3IDE0OjIzOjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfaG93dG9fdGFibGUpOiBBZGQgZW50cnkgZm9yIE1JUFNfUl9TV0lUQ0guCi0JKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbik6IEZvciBNSVBTX1JfU1dUSUNILCBjb3B5IHJfc3ltbmR4IGludG8KLQlyX29mZnNldCBhbmQgc2V0IHJfc3ltbmR4IHRvIFJFTE9DX1NFQ1RJT05fVEVYVC4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX291dCk6IEZvciBNSVBTX1JfU1dJVENILCBnZXQgdGhlIHJfc3ltbmR4Ci0JdmFsdWUgZnJvbSB0aGUgcl9vZmZzZXQgZmllbGQuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogTWF4aW11bSByX3R5cGUgdmFsdWUgaXMgbm93IE1JUFNfUl9TV0lUQ0guCi0JRm9yIE1JUFNfUl9TV0lUQ0gsIGNvcHkgdGhlIHJfb2Zmc2V0IGZpZWxkIGludG8gdGhlIGFkZGVuZCBmaWVsZC4KLQkobWlwc19hZGp1c3RfcmVsb2Nfb3V0KTogRm9yIE1JUFNfUl9TV0lUQ0gsIGNvcHkgdGhlIGFkZGVuZCBmaWVsZAotCWludG8gdGhlIHJfb2Zmc2V0IGZpZWxkLgotCShtaXBzX3N3aXRjaF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBUcmFuc2xhdGUgQkZEX1JFTE9DX0dQUkVMMzIgaW50bwotCU1JUFNfUl9TV0lUQ0guCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBNSVBTX1JfU1dJVENILgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBBZGp1c3QgTUlQU19SX1NXSVRDSCBvZmZzZXQgaWYgbmVjZXNzYXJ5LgotCi1UaHUgQXByICA3IDExOjEwOjUxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFN1cHBvcnQgY2FsbGluZyB0aGUgYmFja2VuZAotCWZ1bmN0aW9uIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3Npbmcgd2hlbiBqdXN0IGJlZ2lubmluZyB0bwotCXdyaXRlIGFuIG9iamVjdCBmaWxlLgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0KLQkqIGVsZnszMiw2NH0tdGFyZ2V0LmggKGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBQcm92aWRlCi0JYSBkZWZhdWx0IGRlZmluaXRpb24uCi0JKGVsZnszMiw2NH1fYmVkKTogQWRkIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcuCi0JCi0JKiBlbGYzMi1ocHBhLmggKGVsZl9ocHBhX3RjX3N5bWJvbCk6IERlbGV0ZSBleHRlcm4gZGVjbGFyYXRpb24uCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZWxmMzItaHBwYS5jIChzeW1leHRfY2hhaW5fYnVpbHQpOiBEZWxldGUuCi0JKHN5bWV4dF9jaGFpbl9zaXplKTogUmVuYW1lZCBmcm9tIHN5bWV4dG5fY29udGVudHNfcmVhbF9zaXplLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfe2JlZ2luLGZpbmFsfV93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9ucy4KLQkoYWRkX2VudHJ5X3RvX3N5bWV4dF9jaGFpbik6IE5ldyBmdW5jdGlvbi4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJZ25vcmUgd3JpdGVzIHRvIHRoZSBzeW1ib2wgZXh0ZW5zaW9uCi0Jc2VjdGlvbiB1bnRpbCBpdCdzIGJlZW4gcmVidWlsdCBpbnRlcm5hbGx5LgotCShocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBpcyBubwotCWxvbmdlciBzcGVjaWFsLgotCShlbGZfYmFja2VuZF97YmVnaW4sZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWZpbmUuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBTaW1wbGlmeSBub3cgdGhhdCBtdWNoIGNvZGUgaGFzCi0JbWlncmF0ZWQgaW50byBlbGYzMl9ocHBhX2JhY2tlbmRfe2JlaW5nLGZpbmFsfV93cml0ZV9wcm9jZXNzaW5nLgotCi1XZWQgQXByICA2IDE3OjI0OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCBuZXcgdGFyZ2V0IHZlY3RvcnMgdG8gcmVhZCB0aGUgZHluYW1pYyBzeW1ib2xzIGFuZCBkeW5hbWljCi0JcmVsb2NzLiAgQ2hhbmdlIGEub3V0IHRvIHVzZSB0aGVzZSByYXRoZXIgdGhhbiByZWFkaW5nIHRoZSBkeW5hbWljCi0Jc3ltYm9scyBhbmQgcmVsb2NzIGFsb25nIHdpdGggdGhlIG5vcm1hbCBzeW1ib2xzIGFuZCByZWxvY3MuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgZmllbGRzCi0JX2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQsCi0JX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIsCi0JX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jLgotCShCRkRfSlVNUF9UQUJMRV9EWU5BTUlDKTogRGVmaW5lLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6Ci0JRGVmaW5lLgotCShfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWZpbmUuCi0JKF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlZmluZS4KLQkqIGJmZC5jIChiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVmaW5lLgotCShiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlZmluZS4KLQkqIHN1bm9zLmMgKE1ZX3JlYWRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShNWV9yZWFkX2R5bmFtaWNfcmVsb2NzKTogRG9uJ3QgZGVmaW5lLgotCShNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlZmluZS4KLQkoTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgotCShzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvKTogQ2hhbmdlIHR5cGUgb2YgZHluc3ltX2NvdW50IGFuZAotCWR5bnJlbF9jb3VudCB0byBsb25nLiAgQWRkIGZpZWxkcyBjYW5vbmljYWxfZHluc3ltIGFuZAotCWNhbm9uaWNhbF9keW5yZWwuCi0JKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogQ2hlY2sgdGhhdCBCRkQgaGFkIERZTkFNSUMgZmxhZyBzZXQuCi0JQ2xlYXIgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSBhbmQgaW5mby0+Y2Fub25pY2FsX2R5bnJlbC4KLQkoTVkocmVhZF9keW5hbWljX3N5bWJvbHMpKTogUmVtb3ZlZC4KLQkoTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBSZW1vdmVkLgotCShzdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KLQkoc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYW91dC5oOiBEZWNsYXJlIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgYW5kCi0JcmVsb2Nfc3RkX2V4dGVybmFsIHRvIGF2b2lkIHByb3RvdHlwZSBwcm9ibGVtcy4KLQkoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogUmVtb3ZlIGZpZWxkcyByZWFkX2R5bmFtaWNfc3ltYm9scyBhbmQKLQlyZWFkX2R5bmFtaWNfcmVsb2NzLgotCShOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogRGVjbGFyZS4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IERlY2xhcmUuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkpOiBSZW5hbWVkIGZyb20KLQl0cmFuc2xhdGVfc3ltYm9sX3RhYmxlIGFuZCBtYWRlIG5vbi1zdGF0aWMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IHJlYWQgZHluYW1pYyBzeW1ib2xzLgotCShOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogRG9uJ3QgcmVhZCBkeW5hbWljIHJlbG9jcy4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBEb24ndCBjb3VudCBkeW5hbWljIHJlbG9jcy4KLQkqIGFvdXRmMS5oIChhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBib3RoZXIgdG8KLQlyZW1vdmUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICBUaGV5IHdpbGwgbm8gbG9uZ2VyIGJlCi0JcHJlc2VudC4KLQkoTVlfcmVhZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX3JlYWRfZHluYW1pY19yZWxvY3MpOiBEb24ndCBkZWZpbmUuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBEb24ndCBpbml0aWFsaXplIGR5bmFtaWMgZW50cnkgcG9pbnRzLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVhZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX3JlYWRfZHluYW1pY19yZWxvY3MpOiBEb24ndCBkZWZpbmUuCi0JKE1ZKGJhY2tlbmRfZGF0YSkpOiBEb24ndCBpbml0aWFsaXplIGR5bmFtaWMgZW50cnkgcG9pbnRzLgotCShNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIHRvCi0JX2JmZF9ub2R5bmFtaWMgdmVyc2lvbi4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTGlrZXdpc2UuCi0JKE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBBbGwgYmFja2VuZHM6IEFkZGVkIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgdG8gdGFyZ2V0IHZlY3Rvci4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBjZi1tNjhrbHlueC5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCi0JKiBocDMwMGhwdXguYzogUmVtb3ZlZCBzb21lIHNwYWNlcyBpbiB1c2VzIG9mIE5BTUUgdG8gYXZvaWQKLQlwcm9ibGVtcyB3aXRoIHRyYWRpdGlvbmFsIEMgY29tcGlsZXJzLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZWFycmFuZ2VkIGZpZWxkcyBpbiB0YXJnZXQgdmVjdG9yLgotCVJlbW92ZWQgX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCBfYmZkX2RlYnVnX2luZm9fZW5kIGFuZAotCV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLCB3aGljaCB3ZXJlIG5ldmVyIHVzZWQuCi0JKEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMsIEJGRF9KVU1QX1RBQkxFX0NPUFkpOiBEZWZpbmVkLgotCShCRkRfSlVNUF9UQUJMRV9DT1JFLCBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogRGVmaW5lZC4KLQkoQkZEX0pVTVBfVEFCTEVfU1lNQk9MUywgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKTogRGVmaW5lZC4KLQkoQkZEX0pVTVBfVEFCTEVfV1JJVEUsIEJGRF9KVU1QX1RBQkxFX0xJTkspOiBEZWZpbmVkLgotCSogQWxsIGJhY2tlbmRzOiBDaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IEJGRF9KVU1QX1RBQkxFXyogbWFjcm9zCi0JcmF0aGVyIHRoYW4gdGhlIHNpbmdsZSBKVU1QX1RBQkxFIG1hY3JvLiAgUmVtb3ZlZCBtYW55IG9mIHRoZQotCXdlaXJkIG1hY3JvIGRlZmluaXRpb25zIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBtb25vbGl0aGljCi0JSlVNUF9UQUJMRS4KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogUmVtb3ZlZC4KLQkqIGxpYmJmZC1pbi5oOiBEZWZpbmUgYSBidW5jaCBvZiBtYWNyb3MsIGFuZCBkZWNsYXJlIGEgZmV3Ci0JZnVuY3Rpb25zLCBmb3IgdXNlIHdpdGggdGhlIG5ldyBCRkRfSlVNUF9UQUJMRV8qIG1hY3Jvcy4KLQkqIGxpYmJmZC5jIChfYmZkX2R1bW15X25ld19zZWN0aW9uX2hvb2spOiBSZW1vdmVkLgotCShiZmRfZmFsc2UpOiBTZXQgYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uLgotCShiZmRfbnVsbHZvaWRwdHIpOiBMaWtld2lzZS4KLQkoYmZkX24xKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBSZW5hbWVkIGZyb20KLQlfYmZkX2R1bW15X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcC4KLQkoX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6IFNpbWlsYXIgcmVuYW1lLiAgU2V0Ci0JYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uLgotCShfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogUmVuYW1lZCBmcm9tCi0JYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTaW1pbGFyIHJlbmFtZS4KLQkqIGllZWUuYzogI2lmIDAgb3V0IGllZWVfYmZkX2RlYnVnX2luZm9fc3RhcnQsCi0JaWVlZV9iZmRfZGVidWdfaW5mb19lbmQsIGllZWVfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZS4gIFRoZXkKLQl3ZXJlIG5ldmVyIGNhbGxlZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UdWUgQXByICA1IDIyOjEwOjA0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBDcnVkZSBzdXBwb3J0IGZvciBleGFtaW5pbmcgZHluYW1pYyBsaWJyYXJpZXMuCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IFNldCBEWU5BTUlDIGZsYWcgZm9yIFNITF9NQUdJQyBhbmQKLQlETF9NQUdJQyBvYmplY3RzLgotCShzb21fcHJlcF9oZWFkZXJzKTogUHJlc2VydmUgdGhlIHN5c3RlbV9pZCBmb3IgRFlOQU1JQyBvYmplY3RzLgotCVVzZSBTSExfTUFHSUMgYXMgdGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgRFlOQU1JQyBmbGFnIGlzIHNldC4KLQlXcml0ZSBleGVjIGhlYWRlcnMgZm9yIERZTkFNSUMgb2JqZWN0cy4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBEWU5BTUlDIG9iamVjdHMgaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQKLQlyZXN0cmljdGlvbnMgYXMgRF9QQUdFRCBvYmplY3RzLgotCShiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBUcmVhdCBEWU5BTUlDIG9iamVjdHMgbGlrZSBFWEVDX1AKLQlvYmplY3RzLgotCShvYmplY3RfZmxhZ3MpOiBBZGQgRFlOQU1JQy4KLQotVHVlIEFwciAgNSAxNzo0ODo1MiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmMsIHNwYXJjbHlueC5jIChOQU1FKTogUmVtb3ZlIGVtYmVkZGVkIHdoaXRlc3BhY2UgaW4KLQltYWNybyB1c2VzLCBjb25mdXNlcyBzb21lIG5vbi1BTlNJIGNvbXBpbGVycy4KLQotVHVlIEFwciAgNSAxNTo1MDowMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IEFkZCBtaXNzaW5nIFBBUkFNUyBkZWNsLgotCURvbid0IGZyZWUgYW55dGhpbmcgaWYgd2UgZG9uJ3QgaGF2ZSBhIGJmZF9vYmplY3QuCi0JKHNvbV9jbG9zZV9hbmRfY2xlYW51cCk6IENhbGwgc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvLgotCi1UdWUgQXByICA1IDExOjIyOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3QgcmVtb3ZlIGVtcHR5IHNlY3Rpb25zLgotCUl0IHR1cm5zIG91dCBub3QgdG8gYmUgcmVxdWlyZWQgb24gSXJpeCA1LCBhbmQgaXQgY2F1c2VzIHByb2JsZW1zCi0JaWYgdGhlIHNlY3Rpb25zIGhhcHBlbiB0byBjb250YWluIHN5bWJvbHMuCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBDb3JyZWN0IGJmZF93cml0ZSBjaGVjay4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBEb24ndCBlcnJvciBvdXQgaWYKLQlzZWN0aW9uLT5yZWxvY2F0aW9uIGlzIE5VTEw7IG1hbGxvYyBtaWdodCBoYXZlIHJldHVybmVkIE5VTEwgd2hlbgotCWdpdmVuIGEgemVybyBzaXplIGlmIHRoZXJlIHdlcmUgbm8gcmVsb2NhdGlvbnMuCi0JKiBib3V0LmMgKGJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBubG1jb2RlLmggKG5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfcmVsb2NfdGFibGUpKTogTGlrZXdpc2UuICBBbHNvLCBpZiBtYWxsb2MKLQlyZXR1cm5zIE5VTEwsIGRvbid0IHJlcG9ydCBhbiBlcnJvciBpZiB3ZSBhc2tlZCBmb3IgemVybyBieXRlcy4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkpOiBJZiBtYWxsb2MgcmV0dXJucwotCU5VTEwsIGRvbid0IHJlcG9ydCBhbiBlcnJvciBpZiB3ZSBhc2tlZCBmb3IgemVybyBieXRlcy4KLQkqIG5sbWNvZGUuaCAobmxtX3NsdXJwX3JlbG9jX2ZpeHVwcyk6IExpa2V3aXNlLgotCi1Nb24gQXByICA0IDE1OjMwOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSk6IERvbid0IGZyZWUgYW55dGhpbmcKLQlpZiB3ZSBkb24ndCBoYXZlIGEgYmZkX29iamVjdC4KLQotCU1hZGUgc3VyZSB0aGF0IGV2ZXJ5IGNhbGwgdG8gYmZkX3JlYWQsIGJmZF93cml0ZSwgYW5kIGJmZF9zZWVrCi0JY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgYW5kIGhhbmRsZWQgYmZkX2Vycm9yIGNvcnJlY3RseS4gIFRoZXNlCi0JY2hhbmdlcyBhcmUgbm90IGl0ZW1pc2VkLiAgQWxzbzoKLQkqIGFvdXR4LmggKGVtaXRfc3RydGFiKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4sIGFuZCByZXR1cm4KLQllcnJvcnMuCi0JKE5BTUUoYW91dCx3cml0ZV9zeW1zKSk6IENoZWNrIGVtaXRfc3RydGFiIHJldHVybiB2YWx1ZS4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLAotCWFuZCByZXR1cm4gZXJyb3JzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGNvZmZfd3JpdGVfcmVsb2NzIHJldHVybgotCXZhbHVlLgotCSogaTM4Nm9zOWsuYyAob3M5a19zd2FwX2V4ZWNfaGVhZGVyX2luKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCi0JYm9vbGVhbi4KLQkob3M5a19vYmplY3RfcCk6IENoZWNrIG9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbiByZXR1cm4gdmFsdWUuCi0JKiBvYXN5cy5jIChvYXN5c19yZWFkX3JlY29yZCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCShvYXN5c19zbHVycF9zeW1ib2xfdGFibGU6IENoZWNrIG9hc3lzX3JlYWRfcmVjb3JkIHJldHVybiB2YWx1ZS4KLQkob2FzeXNfb2JqZWN0X3AsIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSk6IExpa2V3aXNlLgotCShvYXN5c193cml0ZV9yZWNvcmQpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQkob2FzeXNfd3JpdGVfc3ltcyk6IExpa2V3aXNlLiAgQWxzbywgY2hlY2sgb2FzeXNfd3JpdGVfcmVjb3JkCi0JcmV0dXJuIHZhbHVlLgotCShvYXN5c193cml0ZV9zZWN0aW9ucyk6IENoZWNrIG9hc3lzX3dyaXRlX3JlY29yZCByZXR1cm4gdmFsdWUuCi0JKG9hc3lzX3dyaXRlX2hlYWRlcik6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLiAgQ2hlY2sKLQlvYXN5c193cml0ZV9yZWNvcmQgcmV0dXJuIHZhbHVlLgotCShvYXN5c193cml0ZV9lbmQsIG9hc3lzX3dyaXRlX2RhdGEpOiBMaWtld2lzZS4KLQkob2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlcyBvZgotCW9hc3lzX3dyaXRlX2hlYWRlciwgb2FzeXNfd3JpdGVfc3ltcywgb2FzeXNfd3JpdGVfZGF0YSwgYW5kCi0Jb2FzeXNfd3JpdGVfZW5kLgotCSogc3JlYy5jIChzcmVjX3dyaXRlX3JlY29yZCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCShzcmVjX3dyaXRlX2hlYWRlcik6IExpa2V3aXNlLiAgQWxzbywgY2hlY2sgc3JlY193cml0ZV9yZWNvcmQKLQlyZXR1cm4gdmFsdWUuCi0JKHNyZWNfd3JpdGVfc2VjdGlvbiwgc3JlY193cml0ZV90ZXJtaW5hdG9yKTogTGlrZXdpc2UuCi0JKHNyZWNfd3JpdGVfc3ltYm9scyk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCShpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCXNyZWNfd3JpdGVfc3ltYm9scywgc3JlY193cml0ZV9oZWFkZXIsIHNyZWNfd3JpdGVfc2VjdGlvbiwgYW5kCi0Jc3JlY193cml0ZV90ZXJtaW5hdG9yLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBBcHIgIDQgMTA6NTY6NDUgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhaXgzODYtY29yZS5jIChhaXgzODZfYmZkX2lzX2xvY2FsX2xhYmVsKTogIENvcnJlY3QgY2FzdCBmcm9tCi0JYXNlY3Rpb24gdG8gYXN5bWJvbC4KLQkqIHB0cmFjZS1jb3JlLmMgKHB0cmFjZV91bml4X2JmZF9pc19sb2NhbF9sYWJlbCk6ICBDb3JyZWN0IGNhc3QgZnJvbQotCWJmZCB0byBhc3ltYm9sLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9iZmRfaXNfbG9jYWxfbGFiZWwpOiAgQ29ycmVjdCBjYXN0IGZyb20KLQlhc2VjdGlvbiB0byBhc3ltYm9sLgotCi1TdW4gQXByICAzIDE4OjI3OjI5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N0cmluZ190YWJsZSk6IFVzZSBtYWxsb2MgdG8gYWxsb2NhdGUgc3BhY2UKLQlmb3IgdGhlIGNhY2hlZCBjb3B5IG9mIHRoZSBuYXRpdmUgc3RyaW5nIHRhYmxlLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UgZm9yIHRoZSBuYXRpdmUgc3ltYm9sIHRhYmxlLgotCShzb21fc2x1cnBfcmVsb2NfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIG5hdGl2ZSBhbmQgZ2VuZXJpYwotCXJlbG9jYXRpb24gdGFibGVzLgotCShzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBGcmVlIHRoZSBjYWNoZWQgbmF0aXZlIHN0cmluZ3MsCi0Jc3ltYm9scywgYW5kIHJlbG9jYXRpb25zLiAgQWxzbyBmcmVlIHRoZSBjYW5vbmljYWwgY2FjaGVkCi0JcmVsb2NhdGlvbnMuCi0KLUZyaSBBcHIgIDEgMTI6NDA6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IElmIGtlZXBfbWVtb3J5IGlzIGZhbHNlLCBtYWtlCi0Jc3VyZSB0aGUgc3ltYm9sIG5hbWUgaXMgc3RvcmVkIGluIHBlcm1hbmVudCBtZW1vcnkgYmVmb3JlIGFkZGluZwotCWl0IHRvIHRoZSBzdHJpbmcgdGFibGUuCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogT25jZSB3ZSd2ZSBmb3VuZCBhbgotCW9iamVjdCwgZG9uJ3QgYm90aGVyIHRvIGxvb2sgZm9yIG1vcmUgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvCi0JYnVpbGQgYSBtYXAuCi0JKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogQWZ0ZXIgYWRkaW5nIHRoZSBzeW1ib2xzIGZvciBhIEJGRCwKLQljYWxsIGJmZF9mcmVlX2NhY2hlZF9pbmZvIG9uIGl0LgotCi0JQWRkIGJmZF9mcmVlX2NhY2hlZF9pbmZvIHN1cHBvcnQgdG8gYS5vdXQgYmFja2VuZHMuCi0JKiBhb3V0eC5oIChhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogUmVuYW1lZCBmcm9tCi0JYW91dF9saW5rX2dldF9zeW1ib2xzLiAgUmVhZCBzdHJpbmdzIGV2ZW4gaWYgc3ltYm9scyBoYXZlIGJlZW4KLQlyZWFkLiAgU3RvcmUgc3RyaW5nIHNpemUgaW4gb2JqX2FvdXRfc3RyaW5nX3NpemUuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogQ2FsbCBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIHRvCi0JcmVhZCB0aGUgc3ltYm9scy4gIEFsbG9jYXRlIHRoZSBjYWNoZWQgc3ltYm9scyB3aXRoIG1hbGxvYywgbm90Ci0JYmZkX2FsbG9jLgotCShOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogQWxsb2NhdGUgdGhlIGNhY2hlZCByZWxvY3Mgd2l0aAotCW1hbGxvYywgbm90IGJmZF9hbGxvYy4KLQkoTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSk6IE5ldyBmdW5jdGlvbjsgZnJlZSBjYWNoZWQKLQlzeW1ib2xzIGFuZCByZWxvY3MuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBleHRlcm5hbF9zdHJpbmdfc2l6ZSBmaWVsZC4KLQkob2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5nX3NpemUpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKE5BTUUoYW91dCxjbG9zZV9hbmRfY2xlYW51cCkpOiBEb24ndCBkZWNsYXJlLgotCShOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogRGVjbGFyZS4KLQkoYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCk6IERvbid0IGRlZmluZS4KLQkoYW91dF82NF9jbG9zZV9hbmRfY2xlYW51cCk6IERvbid0IGRlZmluZS4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogSWYgbm90IGFscmVhZHkgZGVmaW5lZCwKLQlkZWZpbmUgYXMgTkFNRShhb3V0LGZyZWVfY2FjaGVkX2luZm8pLgotCShNWV9jbG9zZV9hbmRfY2xlYW51cCk6IElmIG5vdCBhbHJlYWR5IGRlZmluZWQsIGRlZmluZSBhcwotCU1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvLgotCSogYW91dC1hZG9iZS5jIChhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgotCShhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRG9uJ3QgZGVmaW5lLgotCSogYm91dC5jIChhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgotCShhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRG9uJ3QgZGVmaW5lLgotCSogaHAzMDBocHV4LmMgKE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRGVmaW5lIGFzIGJmZF90cnVlLgotCShNWV9jbG9zZV9hbmRfY2xlYW51cCk6IERvbid0IGRlZmluZS4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkpOiBBbGxvY2F0ZSB0aGUgY2FjaGVkCi0JcmVsb2NzIHdpdGggbWFsbG9jLCBub3QgYmZkX2FsbG9jLgotCSogaTM4Nm9zOWsuYyAoYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCk6IERlZmluZS4KLQkoYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERvbid0IGRlZmluZS4KLQotCUFkZCBhIG5ldyBlbnRyeSBwb2ludCB0byBmcmVlIG1lbW9yeSBjYWNoZWQgYnkgYSBCRkQuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgX2JmZF9mcmVlX2NhY2hlZF9pbmZvIGZpZWxkLgotCSogYmZkLmMgKGJmZF9mcmVlX2NhY2hlZF9pbmZvKTogRGVmaW5lLgotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBBZGQgX2JmZF9mcmVlX2NhY2hlZF9pbmZvLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogQWxsIGJhY2tlbmRzOiBJbml0aWFsaXplIGJmZF9mcmVlX2NhY2hlZF9pbmZvIGVudHJ5IHBvaW50IHRvCi0JYmZkX3RydWUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBDb3JyZWN0IHR5cGUgb2YKLQlmaXJzdCwgdW51c2VkLCBhcmd1bWVudC4KLQkoaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlIGluc3RlYWQgb2YKLQlzb21fYmZkX2lzX2xvY2FsX2xhYmVsLgotCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IEFkZCByZWxvY19lbnRyeS0+YWRkcmVzcyB0byB2YWx1ZSBvZgotCWFic29sdXRlIFJfSVJFTCByZWxvYy4KLQotVGh1IE1hciAzMSAxMTo1MjoxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGRlZCBzb21lIHN1cHBvcnQgZm9yIElyaXggNCBzaGFyZWQgbGlicmFyaWVzLgotCSogZWNvZmYuYyAoZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yIGEKLQkubGliIHNlY3Rpb24uCi0JKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBpZgotCVNUWVBfRUNPRkZfTElCIGJpdCBpcyBzZXQuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFJvdW5kIHRoZSBjb250ZW50cyBvZiBhCi0JLmxpYiBzZWN0aW9uIHVwIHRvIHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkuCi0JKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSWYgd2Ugc2VlIGEgLmxpYiBzZWN0aW9uLCBpbmNyZW1lbnQKLQl0aGUgdm1hIGJ5IG9uZSB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHNoYXJlZCBsaWJyYXJpZXMgd2UgaGF2ZS4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY3Jhc2ggaWYgd2Ugc2VlIGEKLQlTVFlQX0VDT0ZGX0xJQiBzZWN0aW9uLCBhbmQgZG9uJ3QgYWRqdXN0IHRleHRfc3RhcnQgb3IgZGF0YV9zdGFydAotCW9yIGJzc19zaXplIGVpdGhlci4KLQotCSogY29mZmNvZGUuaCAoQ0FMQ19BRERFTkQpOiBDaGFuZ2UgdG8gZmV0Y2ggb3JpZ2luYWwgc3ltYm9sIHZhbHVlCi0JZnJvbSBvcmlnaW5hbCBCRkQsIHJhdGhlciB0aGFuIHVzaW5nIHZhbHVlIG9mIGN1cnJlbnQgQkZEIHN5bWJvbC4KLQlOZWVkZWQgZm9yIG5ldyBsaW5rZXIuCi0JKiBjb2ZmLXNwYXJjLmMgKENBTENfQURERU5EKTogTGlrZXdpc2UuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCB0aGUgdGV4dF9zdGFydCBhbmQKLQlkYXRhX3N0YXJ0IGVudHJpZXMgaW4gdGhlIG9wdGlvbmFsIGhlYWRlciBjb3JyZWN0bHkgZXZlbiBpZiBhIHRleHQKLQlvciBkYXRhIHNlY3Rpb24gc3RhcnRzIGF0IGxvY2F0aW9uIHplcm8uCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZGVkIEJGRF9SRUxPQ18yNiAoZnJvbSBzZWYKLQlhbmQgcmFlYnVybikuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfcmVhZF9pbXBvcnQpOiBOdWxsIHRlcm1pbmF0ZSB0aGUgc3ltYm9sCi0JbmFtZS4KLQkqIG5sbTMyLWFscGhhLmMgKG5sbV9hbHBoYV9yZWFkX2ltcG9ydCk6IExpa2V3aXNlLgotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX3JlYWRfaW1wb3J0KTogTGlrZXdpc2UuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9zeW1ib2wpOiBSZWluZGVudGVkLiAgQ2hhbmdlZCB0byByZXR1cm4KLQlib29sZWFuLCBhbmQgY2hhbmdlZCB3cml0dGVuIHRvIHVuc2lnbmVkIGludCAqLiAgQ2hlY2sgZXJyb3IKLQlyZXR1cm5zIGZyb20gY2FsbGVkIGZ1bmN0aW9ucy4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IExpa2V3aXNlLiAgUmV3b3JrZWQgY2hlY2tzIG9uIHdoZXRoZXIgdG8KLQl3cml0ZSBzeW1ib2wgbmFtZSB0byBzdHJpbmcgdGFibGUgZm9yIGNsYXJpdHkgYW5kIHRvIGF2b2lkIGNvcmUKLQlkdW1waW5nIHdoZW4gZ2l2ZW4gYSBub24gQ09GRiBzeW1ib2wuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfd3JpdGVfc3ltYm9scyk6IERlY2xhcmUgYXMgcmV0dXJuaW5nIGJvb2xlYW4uCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWNvZmZfd3JpdGVfc3ltYm9scy4KLQotV2VkIE1hciAzMCAxNjoyNTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIHRvIGxldCBCRkQgcmV0dXJuIGFuIGVycm9yIGluZGljYXRpb24gZnJvbQotCWdldF9zeW10YWJfdXBwZXJfYm91bmQsIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLAotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQsIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLiAgVGhleSBub3cKLQlyZXR1cm4gbG9uZyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGludCwgYW5kIHVzZSAtMSB0byBpbmRpY2F0ZSBhbgotCWVycm9yLiAgQWxvbmcgdGhlIHdheSwgcmVuYW1lIGdldF9zeW10YWJfdXBwZXJfYm91bmQgdG8KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4KLQkqIGJmZC5jIChiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogUmV0dXJuIGxvbmcsIGFuZCAtMSBvbgotCWVycm9ycy4KLQkoYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc3ltcy5jIChiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFJlbmFtZWQgZnJvbQotCWdldF9zeW10YWJfdXBwZXJfYm91bmQuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW5hbWVkIF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHRvCi0JX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBhbmQgY2hhbmdlZCBpdCBhbmQKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgYW5kIF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JX2JmZF9jYW5vbmljYWxpemVfcmVsb2MgdG8gYWxsIHJldHVybiBsb25nLgotCSogYW91dHguaCAoTkFNRShhb3V0LGdldF9zeW10YWIpKTogUmV0dXJuIGxvbmcsIGFuZCAtMSBvbiBlcnJvcnMuCi0JKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCSogYm91dC5jIChiX291dF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoYl9vdXRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCShlbGZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKE1ZKGdldF9zeW10YWIpKTogTGlrZXdpc2UuCi0JKE1ZKGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKE1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IENoYW5nZSByZXR1cm4gdHlwZSB0bwotCWJvb2xlYW4uICBDaGVjayBmb3IgZXJyb3JzIGZyb20gZ2V0X3N5bWJvbC4KLQkoaWVlZV9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4gIENoZWNrCi0JZm9yIGVycm9ycyBmcm9tIGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scy4KLQkoaWVlZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogUmV0dXJuIGxvbmcsIGFuZCAtMSBvbiBlcnJvcnMuCi0JKGllZWVfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShpZWVlX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBubG1jb2RlLmggKG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG5sbV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkobmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShvYXN5c19nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKG9hc3lzX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShvYXN5c19jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShzb21fZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKHNvbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKHNyZWNfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShzcmVjX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZSBhcyBiZmRfMGwuCi0JKHNyZWNfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiB0ZWtoZXguYyAodGVraGV4X2dldF9zeW10YWIpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KLQkodGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkodGVraGV4X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZSBhcyBiZmRfMGwuCi0JKHRla2hleF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogQ2hhbmdlCi0JZGVjbGFyYXRpb24gdG8gcmV0dXJuIGxvbmcuCi0JKE5BTUUoYW91dCxnZXRfc3ltdGFiKSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCSogbGliY29mZi1pbi5oIChjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKiBsaWJlY29mZi5oIChlY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbGlibmxtLmggKG5sbU5BTUUoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkobmxtTkFNRShnZXRfc3ltdGFiKSk6IExpa2V3aXNlLgotCShubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkobmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBhcmNoaXZlLmMgKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogVXNlIGVycm9yX3JldHVybiBhbmQKLQlub19tZW1vcnlfcmV0dXJuIGxhYmVscyByYXRoZXIgdGhhbiBmcmVlaW5nIGluZm9ybWF0aW9uIGluIHZhcmlvdXMKLQlwbGFjZXMuICBDaGFuZ2Ugc3RvcmFnZSwgc3ltY291bnQgYW5kIHNyY19jb3VudCB0byBsb25nLiAgQ2hlY2sKLQllcnJvcnMgZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkqIGJvdXQuYyAoYl9vdXRfcmVsYXhfc2VjdGlvbik6IENoYW5nZSByZWxvY19zaXplIHRvIGxvbmcuICBDaGVjawotCWZvciBlcnJvcnMgZnJvbSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCUxpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBMaWtld2lzZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyKTogQ2hlY2sgZm9yIGVycm9ycwotCWZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogbGliYmZkLmMgKGJmZF8wbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChiZmRfMGwpOiBEZWNsYXJlLgotCSogYWl4Mzg2LWNvcmUuYzogQ2hhbmdlIGdldF9zeW10YWJfdXBwZXJfYm91bmQsIGdldF9zeW10YWIsCi0JZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCBhbmQgY2Fub25pY2FsaXplX3JlbG9jIHRvIHVzZSBiZmRfMGwgcmF0aGVyCi0JdGhhbiBiZmRfMHUuCi0JKiBjaXNjby1jb3JlLmMsIGhwcGFic2QtY29yZS5jLCBocHV4LWNvcmUuYzogTGlrZXdpc2UuCi0JKiBpcml4LWNvcmUuYywgb3NmLWNvcmUuYywgcHRyYWNlLWNvcmUuYywgdHJhZC1jb3JlLmM6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0KLQkqIG5sbTMyLXNwYXJjLmMgKG5sbV9zcGFyY19yZWFkX3JlbG9jKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMKLQl0ZW1wIGFuZCBuYW1lLgotCi1XZWQgTWFyIDMwIDA4OjMzOjA0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9kcHgyLmg6IERlZmluZSBQT1NJWF9VVElNRS4KLQotV2VkIE1hciAzMCAwMDozMTo0OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGkzODZkeW5peC5jLCBjb25maWcvaTM4Ni1keW5peC5tdDogIE5ldyBmaWxlcywgaGFuZGxpbmcgRHluaXgKLQl2YXJpYW50IG9mIGEub3V0LgotCSogY29uZmlndXJlLmluLCBjb25maWcuYmZkOiAgVXNlIHRoZW0gZm9yIER5bml4LgotCSogTWFrZWZpbGUuaW46ICBBZGQgZGVwZW5kZW5jaWVzIGZvciBpMzg2ZHluaXguby4gCi0JKiB0YXJnZXRzLmM6ICBBZGQgZGVmaW5pdGlvbiBmb3IgaTM4NmR5bml4X3ZlYy4KLQkqIGhvc3RzL3N5bW1ldHJ5Lmg6ICBEbyBub3QgZGVmaW5lIFRSQURfQ09SRV9VU0VSX09GRlNFVCBmb3IgRHluaXguCi0JRGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIGFuZCBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMCi0JZm9yIER5bml4LiBSZW1vdmUgaW5jbHVzaW9uIG9mIGR5bml4My5oLCBEeW5peCBiZmQgaXMgbm93IGhhbmRsZWQgYnkKLQlpMzg2ZHluaXguYwotCi1Nb24gTWFyIDI4IDEyOjUzOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtc3BhcmMuby4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfZmxhZ3MpOiBIYW5kbGUgYmZkX2FyY2hfcG93ZXJwYyBsaWtlCi0JYmZkX2FyY2hfcnM2MDAwLgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotYWl4Kik6IE5ldyB0YXJnZXQ7IHVzZSByczYwMDAubXQuCi0JKiBjb25maWcvcnM2MDAwLm10IChTRUxFQ1RfQVJDSElURUNUVVJFUyk6IEFkZCBiZmRfcG93ZXJwY19hcmNoLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogU2V0IFNFQ19SRUxPQyBmbGFnCi0JZm9yIGdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzZWN0aW9uLgotCi1TdW4gTWFyIDI3IDE2OjI1OjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBOZXcgYXBwcm9hY2ggYXQgZGVhbGluZyB3aXRoIGhvbGVzCi0JaW4gZXhlY3V0YWJsZXMgbGVmdCBieSB0aGUgSFAgbGlua2VyLiAgRG9lcyBub3QgcmVseSBvbiBzdWJzcGFjZQotCWFsaWdubWVudHMgYXMgc3Vic3BhY2VzIGFyZSAqTk9UKiBndWFyYW50ZWVkIHRvIGJlIHByb3Blcmx5Ci0JYWxpZ25lZCBpbiBhbiBleGVjdXRhYmxlIChjYW4geW91IGJlbGlldmUgdGhhdCEpLgotCi1TYXQgTWFyIDI2IDEwOjI1OjQzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLiAgRG8gbm90IHRyeQotCXRvIGFjdHVhbGx5IHJlYWQgZGF0YSBmcm9tIGEgc2VjdGlvbiB0aGF0IGRvZXNuJ3QgaGF2ZSBlaXRoZXIKLQlTRUNfTE9BRCBvciBTRUNfREVCVUdHSU5HIHNldCAoZWcgJEJTUyQpIGp1c3QgcmV0dXJuIHRydWUuCi0KLSAgICAgICAgKiBsaWJiZmQuYyAoYmZkX3JlYWQpOiBTZXQgYmZkX2Vycm9yIGFzIGFwcHJvcHJpYXRlIGZvciBhIHNob3J0Ci0JcmVhZC4gKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCBvciBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpLgotCi0JKiBzb20uYzogRG8gbm90IGJsaW5kbHkgc2V0IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCBhZnRlciBhCi0JZmFpbGluZyBiZmRfcmVhZCwgYmZkX3dyaXRlLCBvciBiZmRfc2Vlay4gIEluIGEgZmV3IHBsYWNlcwotCShsaWtlIHNvbV9vYmplY3RfcCkgb3ZlcnJpZGUgdGhlIGVycm9yIHN0YXR1cyBzZXQgYnkgYmZkX3JlYWQuCi0KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtZW5jYXAsYyBhcmNoaXZlLmMsIGJvdXQuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXJzNjAwMC5jLCBjb2ZmZ2VuLmMgZWNvZmYuYywgZWxmLmM6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jLCBlbGZjb2RlLmgsIGhwMzAwaHB1eC5jLCBpMzg2bHlueC5jOiBMaWtld2lzZS4KLQkqIG5sbTMyLWFscGhhLmMsIG5sbTMyLWkzODYuYywgbmxtMzItc3BhcmMuYzogTGlrZXdpc2UuCi0KLQkqIHNvbS5jOiBDaGVjayByZXR1cm4gdmFsdWVzIGZyb20gc2V2ZXJhbCBiZmRfe3NlZWsscmVhZCx3cml0ZX0KLQljYWxscyB0aGF0IHdlIGp1c3QgYXNzdW1lZCB3ZXJlIG5vdCBmYWlsaW5nLgotCi1GcmkgTWFyIDI1IDExOjQ0OjA2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zeXN2NC5oIChIQVZFX1BST0NGUyk6IEFkZCBjb21tZW50cyBhYm91dCBwdHg0LgotCSogY29uZmlnL3N5c3Y0Lm1oOiBBZGQgY29tbWVudC4KLQkqIGNvbmZpZy9zeW1tZXRyeS5taDogQ2hhbmdlIGNvbW1lbnQuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIHN5c3Y0LCBub3Qgc3ltbWV0cnksIGZvciBpWzM0XTg2LXNlcXVlbnQtc3lzdjQqLgotCi1GcmkgTWFyIDI1IDE3OjEwOjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gc3VwcG9ydCBsaW5rZXIgcmVsYXhpbmcgb2YgZW1iZWRkZWQgTUlQUyBQSUMgY29kZSB0bwotCXVzZSBhIGZpdmUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgZm9yIGZ1bmN0aW9uIGNhbGxzIHdoaWNoIGFyZSBvdXQgb2YKLQlyYW5nZSBvZiB0aGUgYmFsIGluc3RydWN0aW9uLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEpOiBEZWZpbmUuCi0JKGVjb2ZmX3NlY3Rpb25fZGF0YSk6IERlZmluZS4KLQkoZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEb24ndCBkZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUpOiBEb24ndCByZWFkIG9yIGZyZWUKLQl0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVhZC4KLQkoZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlcik6IEhhbmRsZSBfY29va2VkX3NpemUgYmVpbmcgZGlmZmVyZW50Ci0JZnJvbSBfcmF3X3NpemUuICBEb24ndCByZXJlYWQgdGhlIGNvbnRlbnRzIG9yIHRoZSByZWxvY3MgaWYgdGhleQotCWhhdmUgYWxyZWFkeSBiZWVuIHJlYWQgaW4uCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IENoYW5nZSBiaXRzaXplIG9mIFBDUkVMMTYgZnJvbQotCTE4IHRvIDE2LgotCShQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UKTogRGVmaW5lLgotCShtaXBzX3JlbG9jYXRlX3JlZmhpKTogVGFrZSBhZGp1c3QgYXJndW1lbnQuCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSByZWxvYyBvZmZzZXRzIHN0b3JlZCBpbiBzZWN0aW9uCi0JdXNlZF9ieV9iZmQgZmllbGQuICBDYWxsIG1pcHNfcmVsYXhfcGNyZWwxNiB0byBoYW5kbGUgZGV0YWlscyBvZgotCWV4cGFuZGluZyBhbiBvdXQgb2YgcmFuZ2UgUENSRUwxNi4gIEtlZXAgdHJhY2Ugb2YgYWRqdXN0bWVudHMKLQlyZXF1aXJlZCBieSBleHBhbnNpb25zLiAgU2V0IHMgYW5kIHVuc2V0IGggd2hlbiBjb252ZXJ0aW5nIGEgcmVsb2MKLQlmcm9tIHVuZGVmaW5lZCB0byBzZWN0aW9uLiAgQ2hhbmdlIGhhbmRsaW5nIG9mIFBDIHJlbGF0aXZlIHJlbG9jczoKLQlpZiBhZ2FpbnN0IGEgc2VjdGlvbiwgdGhleSBhcmUgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsIGlmCi0JYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wgdGhleSBhcmUgcGNyZWxfb2Zmc2V0LgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfcmVsYXhfcGNyZWwxNik6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBjb2ZmLWFscGhhLmMgKGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogSGFuZGxlIGFkanVzdG1lbnRzCi0JYnVpbHQgYnkgbWlwc19yZWxheF9zZWN0aW9uIHdoZW4gd3JpdGluZyBvdXQgYWRkcmVzc2VzLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBDbGVhciBhZGp1c3QgZmllbGQuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBUaGUgY2FsbGVyIGV4cGVjdHMKLQlmdW5jdGlvbm5hbWVfcHRyIHRvIGJlIHNldCB0byBhIHN5bWJvbCBuYW1lLCBzbyBwcmVwZW5kCi0Jc3ltYm9sX2xlYWRpbmdfY2hhci4KLQotVGh1IE1hciAyNCAxMTozMzo0NiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBBZGQgcmVsYXhpbmcgaW5mbwotCWZvciAxNmJpdCByZWxhdGl2ZSBicmFuY2hlcy4KLQkqIGNvZmYtaDg1MDAuYyAocl9oaWdoOCwgcl9sb3cxNiwgcl9oaWdoMTYpOiBEb24ndCBjb21wbGFpbiBvbgotCW92ZXJmbG93LgotCi1UaHUgTWFyIDI0IDA5OjIxOjEzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSk6IElnbm9yZSBub24tU09NIG9iamVjdHMuCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmLCBzb21fd3JpdGVfYXJtYXApOiBMaWtld2lzZS4KLQotV2VkIE1hciAyMyAxNDoyOTozMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIG5ldGJzZDM4Ni5jIChOX1NFVF9GTEFHUyk6IERlbGV0ZSB0aGUgb2xkIGRlZmluaXRpb24uCi0KLVdlZCBNYXIgMjMgMTQ6NTg6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2xlYW4gdXAgdGhlIHJlbGF4aW5nIGNvZGUgZm9yIHRoZSBuZXcgbGlua2VyLgotCSogdGFyZ2V0cy5jIChfYmZkX3JlbGF4X3NlY3Rpb24pOiBUYWtlIGJvb2xlYW4gKmFnYWluIGFyZ3VtZW50Ci0JcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCSogYmZkLmMgKGJmZF9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIG5hbWUgb2YgZm91cnRoIGFyZ3VtZW50IGZyb20KLQlzeW1ib2xzIHRvIGFnYWluLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4KLQlhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBBbHdheXMgcmV0dXJuIHRydWUuCi0JKiBib3V0LmM6IEluY2x1ZGUgZ2VubGluay5oLgotCShhbGlnbmNvZGUsIHBlcmZvcm1fc2xpcCk6IERlY2xhcmUuCi0JKHBlcmZvcm1fc2xpcCk6IFRha2UgQkZEIGFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KLQlDaGFuZ2VkIGFsbCBjYWxsZXJzLiAgR2V0IHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRC4gIENoYW5nZSB0aGUKLQloYXNoIHRhYmxlIGVudHJ5IHZhbHVlIGFzIHdlbGwgYXMgdGhlIHN5bWJvbCB2YWx1ZS4KLQkoYWJzMzJjb2RlKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LiAgQ2hhbmdlZAotCWFsbCBjYWxsZXJzLgotCShhbGlnbmNvZGUpOiBMaWtld2lzZS4KLQkoYl9vdXRfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQgcmF0aGVyIHRoYW4KLQlhc3ltYm9sIGxpc3QuICBPbmx5IHJldHVybiBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4gIFNldCAqYWdhaW4KLQl0byBmYWxzZS4gIEdldCBzeW1ib2xzIGZyb20gQkZELgotCSogcmVsb2MxNi5jOiBJbmNsdWRlIGdlbmxpbmsuaC4KLQkoYmZkX3BlcmZvcm1fc2xpcCk6IFRha2UgQkZEIGFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KLQlHZXQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZELiAgQ2hhbmdlIHRoZSBoYXNoIHRhYmxlIGVudHJ5IHZhbHVlCi0JYXMgd2VsbCBhcyB0aGUgc3ltYm9sIHZhbHVlLgotCShiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBUYWtlIGJvb2xlYW4gKmFnYWluIGFyZ3VtZW50Ci0JcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LiAgT25seSByZXR1cm4gZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0JU2V0ICphZ2FpbiB0byBmYWxzZS4gIEdldCBzeW1ib2xzIGZyb20gQkZELgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQ2hhbmdlCi0JX2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUgdG8gdGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4KLQlhc3ltYm9sIGxpc3QuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQkoZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCSogbGliY29mZi1pbi5oIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2UKLQlkZWNsYXJhdGlvbiB0byB0YWtlIGJvb2xlYW4gKiByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCi0JKGJmZF9wZXJmb3JtX3NsaXApOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gdGFrZSBCRkQgcmF0aGVyIHRoYW4KLQlhc3ltYm9sIGxpc3QuCi0JKiBjb2ZmLWg4MzAwLmMgKGgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IFRha2UgQkZEIGFyZ3VtZW50IHJhdGhlcgotCXRoYW4gYXN5bWJvbCBsaXN0LiAgQ2hhbmdlZCBjYWxscyB0byBiZmRfcGVyZm9ybV9zbGlwLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGdlbmxpbmsuaCAoX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMpOiBEZWZpbmUuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCk6IERlZmluZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgotCShnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIGl0LiAgVXNlCi0JX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgYW5kIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudAotCXRvIGdldCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQuCi0JKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBTdG9yZSBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkKLQlpbiBhc3ltYm9sIHVkYXRhIGZpZWxkLgotCi1UdWUgTWFyIDIyIDEzOjA5OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfaG93dG9fdGFibGUpOiBBZGQgZW50cnkgZm9yIG5ldyBNSVBTX1JfUENSRUwxNgotCXJlbG9jLCB1c2VkIGluIGVtYmVkZGVkIFBJQyBjb2RlLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IENoYW5nZSBzYW5pdHkgY2hlY2sgdG8gcGVybWl0IG5ldyByZWxvYy4KLQkobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBUdXJuIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMiBpbnRvCi0JTUlQU19SX1BDUkVMMTYuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIKLQlyZWxvY3Mgd2hlbiBhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIFNldCBTRUNfUkVMT0MgZmxhZwotCWZvciBhbnkgc2VjdGlvbiB3aGljaCBoYXMgcmVsb2NzLiAgSGFuZGxlIGxpbmtfb3JkZXIgcmVsb2NzIGluCi0JbGlua19vcmRlciBsb29wLiAgVXNlIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QgZm9yCi0JYWRkX3N5bWJscyBlbnRyeSBwb2ludC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogU2V0IHJlbG9jX2NvdW50IHRvIDAgYmVmb3JlCi0JY291bnRpbmcgcmVsb2NzLiAgU2V0IFNFQ19SRUxPQyBmbGFnIGZvciBhbnkgc2VjdGlvbiB3aGljaCBoYXMKLQlyZWxvY3MuCi0KLQkqIGxpbmtlci5jIChfYmZkX2RlZmF1bHRfbGlua19vcmRlcik6IEhhbmRsZSBiZmRfZGF0YV9saW5rX29yZGVyLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMpOiBKdXN0IGNhbGwKLQlnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QpOiBOZXcgZnVuY3Rpb24sIGxpa2UKLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyBidXQgYWxzbyBjb2xsZWN0IGNvbnN0cnVjdG9ycyBhbmQKLQlkZXN0cnVjdG9ycyBieSBuYW1lIGFzIGNvbGxlY3QyIGRvZXMuCi0JKGdlbmVyaWNfbGlua19hZGRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbGlrZSBvbGQKLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyBidXQgd2l0aCBjb2xsZWN0IGFyZ3VtZW50LgotCShnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgotCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QpOiBOZXcgZnVuY3Rpb24uCi0JKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfY29sbGVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IFRha2UgY29sbGVjdCBhcmd1bWVudC4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFRha2UgY29sbGVjdCBhcmd1bWVudC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW5hbWUgY29uc3RydWN0b3IgYXJndW1lbnQgdG8KLQljb2xsZWN0LgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBNYXIgMjIgMTA6MDQ6MDAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogVXNlIGFyX3BhZGNoYXIKLQlmb3IgZmlyc3QgY2hhcmFjdGVyIGluIGFuIGV4dGVuZGVkIG5hbWUuCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IElmIGFyX3BhZGNoYXIgPT0gJy8nLCB0aGVuIHVzZQotCSIvLyIgYXMgdGhlIG5hbWUgb2YgdGhlIHNwZWNpYWwgYXJjaGl2ZSBtZW1iZXIgaG9sZGluZyB0aGUKLQlleHRlbmRlZCBuYW1lIHRhYmxlLgotCi1Nb24gTWFyIDIxIDEyOjI4OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVN1cHBvcnQgZm9yIGxpbmtfb3JkZXIgdHlwZXMgd2hpY2ggZ2VuZXJhdGUgcmVsb2NzIGluIG9yZGVyIHRvCi0Jc3VwcG9ydCAtVXIgaW4gdGhlIGxpbmtlci4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQKLQlmcm9tIGNhbGwgdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQuCi0JRG9uJ3QgcGFzcyBiaXRzaXplIHRvIGNvbnN0cnVjdG9yIGNhbGwgYmFjay4gIFBhc3MgQkZEX1JFTE9DX0NUT1IKLQlpbnN0ZWFkIG9mIGJpdHNpemUgdG8gYWRkX3RvX3NldCBjYWxsIGJhY2suCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogQWNjb3VudCBmb3IgbGlua19vcmRlciByZWxvY3Mgd2hlbgotCWFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgSGFuZGxlIHRoZW0gaW4gbGlua19vcmRlciBsb29wLgotCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIpOiBJZiBhIHJlbG9jX2xpbmtfb3JkZXIgaXMgc2VlbiBoZXJlLAotCWFib3J0LgotCShfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUmVtb3ZlIGJpdHNpemUKLQlhcmd1bWVudCBmcm9tIGRlY2xhcmF0aW9uLgotCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IERlY2xhcmUuCi0JKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudCBmcm9tCi0JY2FsbCB0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogQWNjb3VudCBmb3IgbGlua19vcmRlciByZWxvY3Mgd2hlbgotCWFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgSGFuZGxlIHRoZW0gYWZ0ZXIgaGFuZGxpbmcgYWxsCi0JaW5wdXQgQkZEcy4KLQkoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudCBmcm9tCi0JY2FsbCB0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBpbiBsaW5rX29yZGVyIGxvb3AuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBTZXQgdGhlIHN0b3JhZ2UgY2xhc3Mgb2YgYSBkZWZpbmVkCi0JbGlua2VyIGNyZWF0ZWQgc3ltYm9sIGJhc2VkIG9uIHRoZSBzZWN0aW9uIGl0IGlzIGluLiAgQ29ycmVjdAotCWJmZF9saW5rX2hhc2hfd2VhayBjYXNlIHRvIHVzZSAuc2MgcmF0aGVyIHRoYW4gLnN0LgotCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTmV3IGZ1bmN0aW9uLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUKLQlCRkRfUkVMT0NfQ1RPUi4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCi0JKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGR5bnN5bQotCWFuZCBidWYuCi0KLQkqIGNpc2NvLWNvcmUuYyAoY2lzY29fY29yZV9maWxlX3ApOiBPbmx5IHBhc3Mgb25lIGFyZ3VtZW50IHRvCi0JYmZkX3ptYWxsb2MuICBGcmVlIGEgcG9pbnRlciwgbm90IGEgdW5pb24uCi0JKGNpc2NvX2JmZF9pc19sb2NhbF9sYWJlbCk6IENvcnJlY3QgY2FzdCBmcm9tIGFzZWN0aW9uIHRvIGFzeW1ib2wuCi0KLVN1biBNYXIgMjAgMDk6MjQ6MzYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC9zb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGaXggdGhpbmtvIChvZmYgYnkgb25lIGVycm9yKS4KLQotCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IE9ubHkgdG8gZG8gdGhlIHZhbHVlCi0JY29tcGFyaXNvbiBmb3IgZnVuY3Rpb24gc3ltYm9scyB3aXRoaW4gZXhlY3V0YWJsZXMuCi0KLQkqIHNvbS5jIChiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBSZW5hbWVkIGZyb20KLQlzb21fc2VjdGlvbl9mcm9tX3N1YnNwYWNlX2luZGV4LiAgUGFzcyBpbiBhIG5hdGl2ZSBTT00gc3ltYm9sLgotCUZvciBleGVjdXRhYmxlcywgaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZWN0aW9ucyB0byBmaW5kIG91dAotCXdoaWNoIGNvbnRhaW5zIHRoZSBzeW1ib2wncyBhZGRyZXNzIHJhdGhlciB0aGFuIHVzaW5nIHRoZQotCXN5bWJvbF9pbmZvIGZpZWxkLiAgKHN5bWJvbF9pbmZvIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIGZvcgotCWR5bmFtaWNseSBsaW5rZWQgZXhlY3V0YWJsZXMuKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogRG9uJ3QgcGFzcyBhYmZkIHRvCi0JYmZkX3ptYWxsb2MuCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZpeCBicmFpbm8gKG9uZSBjYWxsIHRvIGFsaWduCi0Jc3BhY2Uvc3Vic3BhY2UgZGF0YSB3YXMgZG9uZSB1bmNvbmRpdGlvbmFsbHkgcmF0aGVyIHRoYW4KLQlqdXN0IGZvciBleGVjdXRhYmxlcy4pCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEFsaWduIHRleHQgaW4gYWxsIGV4ZWN1dGFibGVzIHRvCi0JbWFrZSBIUFVYIGtlcm5lbCBoYXBweS4gIEZpeGVzIHN0cmlwL29iamNvcHkgZm9yIHNoYXJlZAotCWV4ZWN1dGFibGVzLgotCi1TYXQgTWFyIDE5IDA3OjA2OjU5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBBY2NvdW50IGZvciBhbGlnbm1lbnQgbmVlZHMgb2YKLQlzdWJzcGFjZXMgdG9vIHdoZW4gd3JpdGluZyBleGVjdXRhYmxlcy4gIE5ldmVyIHJlcXVlc3QgYSBuZWdhdGl2ZQotCWJzcyBzaXplLiAgRml4ZXMgc29tZSBwcm9ibGVtcyB3aXRoIGRlbWFuZCBwYWdlZCBleGVjdXRhYmxlcywKLQlzdGlsbCBoYXZpbmcgcHJvYmxlbXMgd2l0aCBwdXJlIGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQgZXhlY3V0YWJsZXMuCi0KLUZyaSBNYXIgMTggMTk6MTI6NDcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDYWxsIGJmZF96bWFsbG9jIG5vdAotCWJmZF96YWxsb2MgZm9yIHJhd3B0ciwgYmVjYXVzZSBsYXRlciBvbiB3ZSBtYXkgY2FsbCBmcmVlLCBub3QKLQliZmRfcmVsZWFzZSwgb24gaXQuCi0KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBjaXNjb19jb3JlX3N0cnVjdCB0byB0ZGF0YSB1bmlvbi4KLQkqIGxpYmJmZC5jIChiZmRfcmVhZCwgYmZkX3NlZWspOiBBZGQgY29tbWVudHMgcmVnYXJkaW5nIGVycm9ycy4KLQkqIGNpc2NvLWNvcmUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGFjY29yZGluZ2x5LgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgY2lzY29fY29yZV92ZWMuCi0JKiBjb25maWcvbTY4ay1hb3V0Lm10IChTRUxFQ1RfVkVDUyk6IEFkZCBjaXNjb19jb3JlX3ZlYy4KLQkqIHRhcmdldHMuYzogQWRkIGNpc2NvX2NvcmVfdmVjLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgTWFyIDE4IDE4OjEzOjQ5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBOZXcgc3RydWN0dXJlCi0JY29udGFpbmluZyBhbGwgdGhlIHByaXZhdGUgc2VjdGlvbiBpbmZvcm1hdGlvbiB3aGljaCBuZWVkcwotCXRvIGJlIGNvcGllZCBmcm9tIGlucHV0IHNlY3Rpb24gdG8gb3V0cHV0IHNlY3Rpb24gZHVyaW5nCi0Jb2JqY29weSBvciBzdHJpcC4KLQkoc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBSZW1vdmUgc2V2ZXJhbCBmaWVsZHMgbm93IGluCi0Jc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QuICBNYWtlIHRoZSBzcGFjZSBhbmQgCi0Jc3Vic3BhY2UgZGljdGlvbmFyaWVzIGJlIHBvaW50ZXJzICh0byBzYXZlIHNwYWNlIHdoZW4KLQlvbmx5IHJlYWRpbmcgb2JqZWN0cykuCi0KLQkqIHNvbS5jIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBOb3cgcmV0dXJucyBhIGJvb2xlYW47Ci0Jc29tZSByZWZlcmVuY2VzIGNoYW5nZWQuICBBbGxvY2F0ZSBhIGNvcHlhYmxlIGRhdGEgc3R1Y3R1cmUgaWYKLQlub25lIGV4aXN0cy4gIFN0b3JlIGluZm8gaW50byB0aGUgY29weWFibGUgZGF0YSBzdHJ1Y3R1cmUuCi0JKGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyk6IExpa2V3aXNlLgotCShzb21faXNfc3BhY2UsIHNvbV9pc19zdWJzcGFjZSwgc29tX2lzX2NvbnRhaW5lcik6IE5ldyBmdW5jdGlvbnMuCi0JVXNlIHRoZXNlIGluc3RlYWQgb2YgZGlyZWN0bHkgYWNjZXNzaW5nIHByaXZhdGUgZGF0YS4KLQkoc29tX3ByZXBfaGVhZGVycyk6IEFsbG9jYXRlIHNwYWNlIGFuZCBzdWJzcGFjZSBoZWFkZXJzIGhlcmUuCi0JRmlsbCBpbiBzb21lIGZpZWxkcyBpbiB0aGUgc3BhY2Uvc3Vic3BhY2UgaGVhZGVycyBmcm9tIHRoZQotCWNvcHlhYmxlIGRhdGEuCi0JKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE9ubHkgY29weSB0aGUgc3R1ZmYKLQl0aGF0IHdlIHJlYWxseSBuZWVkIHRvIG1ha2Ugb2JqY29weSBhbmQgc3RyaXAgd29yay4gIEFsbG9jYXRlCi0JdGhlIGNvcHlfZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBvdXRwdXQgYmZkIGJlZm9yZSBjb3B5aW5nLgotCi0JKiBzb20uaCAoc3RydWN0IHNvbV9leGVjX2RhdGEpOiBOZXcgc3RydWN0dXJlIHRvIGhvbGQgZXhlYwotCWluZm8gdGhhdCBtdXN0IGJlIHByZXNlcnZlZCB3aGVuIHJ1bm5pbmcgb2JqY29weS9zdHJpcC4KLQkoc3RydWN0IHNvbWRhdGEpOiBBZGQgbmV3ICJleGVjX2RhdGEiIGZpZWxkIGFuZCBhY2Nlc3NvcgotCW1hY3JvLiAgQWRkIHNvbWUgY29tbWVudHMgb24gaG93IHRoZSB2YXJpb3VzIGZpZWxkcyBhcmUgdXNlZC4KLQkoc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBNYWtlIGlzX3NwYWNlIGFuZCBpc19zdWJzcGFjZSBiaXRmaWVsZHMuCi0JRGVsZXRlIHVudXNlZCBzdWJzcGFjZV9pbmRleC4gIEFsbCByZWZlcmVuY2VzIG5vdyB1c2UgdGhlCi0JdGFyZ2V0X2luZGV4IGZpZWxkIHdpdGhpbiB0aGUgc2VjdGlvbiBzdHJ1Y3R1cmUgaXRzZWxmLgotCi0JKiBzb20uYyAobWFrZV91bmlxdWVfc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgZGVjbGFyYXRpb24uCi0JKHNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShzb21fb2JqZWN0X3NldHVwKTogQWxsb2NhdGUgc3BhY2UgZm9yIGFuZCBzYXZlIGV4ZWMgaW5mb3JtYXRpb24KLQl0aGF0IG5lZWRzIHRvIGJlIGNvcGllZCBkdXJpbmcgb2JqY29weS9zdHJpcC4KLQkoc29tX21rb2JqZWN0KTogRG8gbm90IGFsbG9jYXRlIHNwYWNlIGZvciBhIGZpbGUgaGVhZGVyIGhlcmUuCi0JSXQgaXMgbm90IHVzZWQgd2hlbiBvbmx5IHJlYWRpbmcgU09NIG9iamVjdHMuCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIGF0dGFjaCBhIGZpbGUgaGVhZGVyCi0JdG8gdGhlIG91dHB1dCBiZmQuICBGb3IgZXhlY3V0YWJsZXMsIHVzZSB0aGUgc2F2ZWQgc3lzdGVtX2lkCi0JdmFsdWUgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGd1ZXNzIHRoZSByaWdodCB2YWx1ZS4gIERvIG5vdCBhYm9ydAotCXd3aGVuIHNldHRpbmcgZmlsZV9oZHItPmVudHJ5KiBmb3IgZXhlY3V0YWJsZXMuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogRm9yIGV4ZWN1dGFibGVzLCBzZXQgdGhlIGV4ZWNfZW50cnkgYW5kCi0JZXhlY19mbGFncyBmaWVsZHMuCi0JKHNvbV9jb3B5X3ByaXZhdGVfYmFja2VuZF9zZWN0aW9uX2RhdGEpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGxpYmhwcGEuaCAoUEFfUEFHRVNJWkUpOiBEZWZpbmUuCi0KLQkqIHNvbS5jIChTT01fQUxJR04pOiBEZWZpbmUuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogSWYgd3JpdGluZyBhbiBleGVjdXRhYmxlLCBpbml0aWFsaXplIGFsbAotCWZpZWxkcyBpbiB0aGUgZXhlYyBoZWFkZXIgdG8gemVyby4gIFVwZGF0ZSBmaWVsZHMgaW4gdGhlIGV4ZWMKLQloZWFkZXIgYXMgc2l6ZXMgb2YgbG9hZGFibGUgc3Vic3BhY2VzIGFyZSBjb21wdXRlZC4gIENhcmVmdWxseQotCXByZXNlcnZlIGFsaWdubWVudHMgd2hlbiBidWlsZGluZyBleGVjdXRhYmxlcy4gIEFjdHVhbGx5IHdyaXRlIHRoZQotCWV4ZWMgYWZ0ZXIgYWxsIHRoZSBmaWVsZHMgYXJlIGZpbGxlZCBpbi4KLQotICAgICAgICAqIEJldHRlciBsb25nLWZpbGVuYW1lIGhhbmRsaW5nLiAgUmVhZHMgU09NIEFCSSBjb21wbGlhbnQgZXh0ZW5kZWQKLQluYW1lcywgYnV0IGRvZXNuJ3QgcXVpdGUgd3JpdGUgY29tcGxpYW50IGV4dGVuZGVkIG5hbWVzIHlldC4KLQkqIHNvbS5jIChzb21fc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlbGV0ZSBmdW5jdGlvbi4gIFRoZQotCWdlbmVyaWMgY29kZSB3aWxsIGhhbmRsZSB0aGluZ3MgY29ycmVjdGx5LgotCShzb21fc2x1cnBfYXJtYXApOiBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWVtYmVyLgotCShub3JtYWxpemUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogVGFrZSB0aGUgc2l6ZSBvZiB0aGUgZXh0ZW5kZWQKLQluYW1lIHRhYmxlIGludG8gYWNjb3VudCB3aGVuIGNvbXB1dGluZyB0aGUgZmlsZSBvZmZzZXRzIGluIHRoZQotCVNPTSBkaWN0aW9uYXJ5LiAgTWFrZSBzdXJlIHRvIGFsaWduIHRvIGFuIGV2ZW4gYm91bmRhcnkuCi0JKHNvbV93cml0ZV9hcm1hcCk6IEluaXRpYWxpemUgdGhlIGNoZWNrc3VtIHRvIHplcm8uCi0JKGFyX21heGNoYXJzKTogRml4LiAgT3Bwcy4KLQotRnJpIE1hciAxOCAyMDozNToyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChyZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUiBvbiBhIDY0LWJpdAotCW1hY2hpbmUuICBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDMTMgYW5kIEJGRF9SRUxPQ19TUEFSQ19CQVNFMTMuCi0KLVRodSBNYXIgMTcgMTg6MjY6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKEJGRF9WRVJTSU9OKTogVXNlIEBWRVJTSU9OQC4KLQkqIE1ha2VmaWxlLmluIChiZmQuaCk6IFJlcGxhY2UgaXQgd2l0aCBjb250ZW50cyBvZiBWRVJTSU9OIGZpbGUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2JmZF9pc19sb2NhbF9sYWJlbCk6IEZpeGVkIHR5cG8gd2hlcmUKLQl0aGlzIHdhcyBhbHNvIG5hbWVkIHRyYWRfdW5peF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLgotCi1UaHUgTWFyIDE3IDEwOjM3OjA3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oLCBlbGZjb2RlLmgsIGNvZmYtYWxwaGEuYywgYm91dC5jLCBlY29mZi5jLCBlY29mZmxpbmsuYywKLQllbGYzMi1ocHBhLmMsIGVsZjMyLW1pcHMuYywgbGlua2VyLmMsIHNvbS5jLCBzdW5vcy5jOiBJZiBtYWxsb2MoMCkKLQlyZXR1cm5zIE5VTEwsIGl0IGlzIG5vdCBhbiBlcnJvci4gIEl0J3MgcG9zc2libGUgdGhhdCBzb21lIG9mCi0JdGhlc2UgY2hlY2tzIGFyZSBub3QgbmVjZXNzYXJ5IChiZWNhdXNlIHRoZSBzaXplIGNhbiBuZXZlciBiZQotCXplcm8pLCBidXQgcHV0dGluZyBpbiB0aGUgY2hlY2tzIGlzIHRoZSBjb25zZXJ2YXRpdmUgdGhpbmcgdG8gZG8KLQlpbiBsaWdodCBvZiB0aGUgZmFjdCB0aGF0IHNvbWUgb2YgdGhlc2UgbWFsbG9jIGNhbGxzIHJlcGxhY2VkCi0JdW5jaGVja2VkIGFsbG9jYSBjYWxscywgaW4gd2hpY2ggYSB6ZXJvIGFyZ3VtZW50IHdvdWxkIHdvcmsgZmluZS4KLQotVGh1IE1hciAxNyAxMTo0NDo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9zZi1jb3JlLmMgKG9zZl9jb3JlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBSZW1vdmUKLQlkdXBsaWNhdGUgZGVmaW5pdGlvbi4KLQkob3NmX2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsKTogRGVmaW5lLgotCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEb24ndCBmYWlsCi0JaWYgbWFsbG9jICgwKSBmYWlscy4gIGJmZF9jYW5vbmljYWxpemVfcmVsb2MgcmV0dXJuaW5nIDAgaXMgbm90IGEKLQlmYWlsdXJlIGluZGljYXRpb24sIGl0IG1lcmVseSBtZWFucyB0aGVyZSBhcmUgbm8gcmVsb2NzLgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogRG9uJ3QgdXNlIHNwYWNlCi0JYWZ0ZXIgTkFNRSwgc2luY2UgU3VuT1MgL2Jpbi9jYyBjYW4ndCBoYW5kbGUgaXQuCi0KLVdlZCBNYXIgMTYgMTY6NDM6MzMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBuZXRic2QzODYuYyAoTl9TRVRfRkxBR1MpOiBEb24ndCBudWtlIHRoZSBtYWNoaW5lIGlkIGZpZWxkLgotCUZyb20gc3VrZXNAZ2x1ZS51bWQuZWR1IChUYXN1a2kgSGlyYXRhKS4KLQotV2VkIE1hciAxNiAwNzo1NTo1NCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKDQgcGxhY2VzKTogVXNlIGEgc2ltcGxlICNpZiBvbiBBUkNIX1NJWkUsIHJhdGhlciB0aGFuCi0JYWxsIHRoYXQgY29udm9sdXRlZCBzdHVmZiB3aXRoIE5BTUUsIENBVDMsIGV0Yy4gIFRoZSBjb252b2x1dGVkCi0Jc3R1ZmYgYnJva2UgZm9yIFN1bk9TNCAvYmluL2NjIChkdWUgdG8gREVGVU4gZWxpbWluYXRpb24sIEkgZ3Vlc3MpLgotCi1XZWQgTWFyIDE2IDAwOjAyOjA1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IERldGVjdCBzZWN0aW9uIHN5bWJvbHMgYmFzZWQKLQlvbiBlaXRoZXIgdGhlIGxhY2sgb2YgcHJpdmF0ZSBkYXRhIG9yIHRoZSBzeW1ib2wgZmxhZ3MuICBEbyBub3QKLQltdW5nZSBzZWN0aW9uIHN5bWJvbCBuYW1lcyBhbnltb3JlIC0tIHRoZXkgbm8gbG9uZ2VyIGNvbmZ1c2UgR0RCLgotCShzb21fYmVnaW5fd3JpdGluZyk6IExlYXZlIHNwYWNlIGZvciBhbiBleGVjIGhlYWRlciBpZiB3cml0aW5nCi0JYW4gZXhlY3V0YWJsZS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFJlY29nbml6ZSBib3RoIGZvcm1zIG9mIHNlY3Rpb24gc3ltYm9sCi0JbmFtZXMgIkwkMFwwMDIiIGFuZCAiJDxGT08+JCIuICBDaGFuZ2UgdGhlIG5hbWUgb2YgIkwkMFwwMDIiCi0Jc2VjdGlvbiBzeW1ib2xzIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIHRoZXkgcmVwcmVzZW50LgotCURlYnVnZ2luZyAgc3ltYm9scyBiZWdpbiB3aXRoICJMJDBcMDAxIiwgbm90IGp1c3QgIkwkIi4KLQotVHVlIE1hciAxNSAyMjo1ODoyOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkLWluMi5oLCBsaWJiZmQuaCwgbGliY29mZi5oOiBSZWJ1aWx0LgotCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZCBuZXcgZW50cmllcyB0byB0aGUganVtcCB0YWJsZQotCWZvciBiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSwgYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSwKLQlhbmQgYmZkX2lzX2xvY2FsX2xhYmVsLgotCi0JKiB0YXJnZXRzLmM6IEFkZCBuZXcgZW50cmllcyB0byB0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuCi0JCi0JKiBiZmQuYyAoYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBkZWZpbml0aW9uLgotCi0JKiBzZWN0aW9uLmMgKGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTmV3IGRlZmluaXRpb24uCi0KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogTmV3IGRlZmluaXRpb24uCi0KLQkqIGxpYmJmZC1pbi5oIChiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbCk6IERlY2xhcmUuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQotCSogKi1jb3JlLmM6IFByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgbmV3IGZ1bmN0aW9ucyBpbgotCXRoZSB0YXJnZXQgdmVjdG9yIHdoaWNoIGFsbCBwb2ludCB0byBiZmRfZmFsc2UuCi0KLQkqIGFvdXQtdGFyZ2V0LmgsIGNvZmZjb2RlLmgsIGVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oLCBpZWVlLmMKLQlsaWJhb3V0LmgsIGxpYmVjb2ZmLmgsIG5sbS10YXJnZXQuaCwgb2FzeXMuYywgc3JlYy5jLCB0ZWtoZXguYwotCURlZmF1bHQgbmV3IHZlY3RvcnMgZm9yIGNvcHlpbmcgcHJpdmF0ZSBiYWNrZW5kIGRhdGEgdG8gYmZkX3RydWUuCi0JRGVmYXVsdCBuZXcgdmVjdG9yIGZvciBkZXRlcm1pbmluZyBpZiBhIHN5bWJvbCBpcyBhIGxvY2FsIGxhYmVsCi0JdG8gYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwuCi0KLQkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRm9yIG5vdyBkZWZhdWx0IHRvIGJmZF90cnVlLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgTWFyIDE1IDIzOjU1OjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2YtbTY4a2x5bnguYyAoQ0FMQ19BRERFTkQpOiBVc2UgX2JmZF9tNjhrbHlueF9ob3d0b190YWJsZS4KLQotVHVlIE1hciAxNSAwNDo0MToxMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1vc3QgZmlsZXM6Ci0JUmVwbGFjZSBERUZVTiBhbmQgREVGVU5fVk9JRCB3aXRoIEsmUi1zdHlsZSBmdW5jdGlvbiBkZWZpbml0aW9uLgotCUluZGVudCBzb21lIG9mIHRoZW0gdG8gR05VIHN0YW5kYXJkcy4KLQotCSogYW91dDMyLmMsIGFyY2h1cmVzLmMsIGNvcmUuYywgY3B1LWg4MzAwLmMsIGNwdS1pOTYwLmMsCi0JY3B1LW02OGsuYywgY3B1LW04OGsuYywgY3B1LW1pcHMuYywgY3B1LXZheC5jLCBjdG9yLmMsIGRlbW82NC5jLAotCWVsZjMyLWhwcGEuaCwgZ2VuLWFvdXQuYywgaG9zdC1hb3V0LmMsIGluaXQuYywgbGliaHBwYS5oLAotCWxpYmllZWUuaCwgbGlib2FzeXMuaCwgbmV3c29zMy5jLCBzb20uaCwgc3RhYi1zeW1zLmMsIHN1bm9zLmM6Ci0JVXBkYXRlIGNvcHlyaWdodCB5ZWFycy4KLQotTW9uIE1hciAxNCAxMTo0MToyMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBBIHJlbG9jYXRpb24gaW52b2x2aW5nIHRoZSBzZWN0aW9uCi0Jc3ltYm9sIGZvciB0aGUgKkFCUyogc2VjdGlvbiBpcyByZWFsbHkgYSByZWxvY2F0aW9uIGludm9sdmluZwotCW5vIHN5bWJvbC4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvIG5vdCBzZXQgQlNGX0dMT0JBTCBvciBCU0ZfRVhQT1JUIGZvcgotCXVuZGVmaW5lZCBzeW1ib2xzLiAgQ29ycmVjdGx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gZGVidWdnZXIgc3ltYm9scwotCWFuZCBzZWN0aW9uIHN5bWJvbHMuCi0KLQkqIHNvbSAoc2V0dXBfc2VjdGlvbnMpOiBTZXQgU0VDX0RFQlVHR0lORyBhbmQgdGhlIHNlY3Rpb24gYXR0cmlidXRlcwotCWZvciBzcGFjZXMgYW5kIHN1YnNwYWNlcy4KLQotCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IEZpeCB0eXBvLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IFNldCBFWEVDX1AsIERfUEFHRUQsIFdQX1RFWFQsIGFuZAotCUhBU19SRUxPQyBiYXNlZCBvbiB0aGUgb2JqZWN0J3MgbWFnaWMgbnVtYmVyLgotCShtYWtlX3VuaXF1ZV9zZWN0aW9uKTogRGVsZXRlIGZ1bmN0aW9uLiAgQkZEIGFuZCBpdHMgdXNlcnMgYXJlCi0JcHJlcGFyZWQgdG8gaGFuZGxlIG11bHRpcGxlIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZS4KLQkoc2V0dXBfc2VjdGlvbnMpOiBBbGxvY2F0ZSBzcGFjZSBvbiB0aGUgQkZEJ3Mgb2JzdGFjayB0byBob2xkCi0Jc2VjdGlvbiBuYW1lcy4gIFVzZSBiZmRfbWFrZV9zZXRpb25fYW55d2F5IHJhdGhlciB0aGFuIHRoZQotCW9ic29sZXRlIG1ha2VfdW5pcXVlX3NlY3Rpb24uCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBDaG9vc2UgdGhlIGNvcnJlY3QgU09NIG1hZ2ljIG51bWJlciBiYXNlZAotCW9uIHRoZSBCRkQncyBmbGFncy4KLQkoc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMpOiBSZXR1cm4gZmFsc2UsIG5vdCBOVUxMIG9uIGVycm9yLgotCi1TYXQgTWFyIDEyIDA5OjQ2OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWxmMzItcHBjLmM6IFJlbmFtZWQgZnJvbSBlbGYzMi1wb3dlcnBjLmMuCi0JKiBubG0zMi1wcGMuYzogUmVuYW1lZCBmcm9tIG5sbTMyLXBvd2VycGMuYy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotRnJpIE1hciAxMSAyMjoyNzoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXBvd2VycGMuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gdXBkYXRlIHRvIHByZWxpbWluYXJ5IEFCSS4KLQotRnJpIE1hciAxMSAwMDozNDo1OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogIEFzc3VtZSB0aGF0IGR5bmFtaWMgaW5mbwotCWlzIGFsd2F5cyBsb2NhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWN0aW9uIHRvIGFsbG93Ci0JcmVjb3Zlcnkgb2YgdGhlIGR5bmFtaWMgaW5mbyBmcm9tIGEgc3RyaXBwZWQgZXhlY3V0YWJsZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogIEhhbmRsZSBTVFlQX1BEQVRBLCBTVFlQX1hEQVRBCi0JYW5kIFNUWVBfQ09NTUVOVC4KLQotV2VkIE1hciAgOSAxNzoxNzo1MyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmg6IFJlbW92ZSBhbGxvY2EgY3J1ZnQuICBJdCB3YXMgbWlzc2luZyBzb21lIG5lY2Vzc2FyeQotCWNydWZ0IChsaWtlIHRoZSAjcHJhZ21hIGFsbG9jYSBmb3IgQUlYKS4KLQlJbiBhZGRpdGlvbiB0byB0aGF0IHByb2JsZW0sIHRoZSBDIGFsbG9jYSBjYWxscyB4bWFsbG9jLCB3aGljaAotCW1lYW5zIGNoZWNraW5nIGZvciBiZWluZyBvdXQgb2YgbWVtb3J5IGNhbid0IHdvcmsgcmlnaHQuICBUaGUKLQlmb2xsb3dpbmcgY2hhbmdlcyByZW1vdmUgYWxsIHVzZXMgb2YgYWxsb2NhIGZyb20gQkZELgotCSogaG9zdHMvc29sYXJpczIuaDogUmVtb3ZlIGFsbG9jYSBjcnVmdC4KLQkqIHNvbS5jOiBSZXBsYWNlIGFsbG9jYSB3aXRoIGEgZml4ZWQgc2l6ZSBhdXRvIGFycmF5LgotCSogYW91dHguaCwgZWxmY29kZS5oLCBubG1jb2RlLmgsIGJvdXQuYywgY29mZi1hbHBoYS5jLCBlY29mZi5jLAotCWVjb2ZmbGluay5jLCBlbGYzMi1ocHBhLmMsIGVsZjMyLW1pcHMuYywgbGlua2VyLmMsIHJlbG9jLmMsIHNvbS5jLAotCXN1bm9zLmM6IFJlcGxhY2UgYWxsb2NhIHdpdGggbWFsbG9jIGFuZCBhcHByb3ByaWF0ZSBlcnJvciBjaGVja2luZyBhbmQKLQlmcmVlaW5nLgotCSogbGlua2VyLmM6IFJlcGxhY2UgYWxsb2NhIHdpdGggb2JzdGFja19hbGxvYy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UdWUgTWFyICA4IDEyOjEwOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBNSVBTX1JfTElURVJBTCBsaWtlCi0JTUlQU19SX0dQUkVMLgotCi1TYXQgTWFyICA1IDE0OjA4OjU0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmMzItaHBwYS5oLCBlbGZjb2RlLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmKl9IYWxmLCBFbGYqX1dvcmQsCi0JRWxmKl9PZmYgdHlwZWRlZnMgYnkgdGhlaXIgZXhwYW5zaW9uLCB0aGUgdHlwZWRlZnMgaGF2ZSBiZWVuCi0JcmVtb3ZlZCBmcm9tIGluY2x1ZGUvZWxmL2ludGVybmFsLmguCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBIYW5kbGUgU0hUX0RZTkFNSUMgc2VjdGlvbiBsaWtlCi0JU0hUX1BST0dCSVRTIHNlY3Rpb24uCi0KLVRodSBNYXIgIDMgMjA6MDM6MzkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChfUEFfUklTQ19JRCk6IFRyZWF0IEhPU1RfSFBQQU9TRiBqdXN0IGxpa2UgSE9TVF9IUFBBQlNELgotCi1XZWQgTWFyICAyIDEzOjI4OjA2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIGlbMzRdODYtc2VxdWVudC0qLgotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogQSBub24temVybywgbm90IHplcm8sCi0JcmV0dXJuIGZyb20gYmZkX3NlZWsgaW5kaWNhdGVzIGFuIGVycm9yLgotCU5ldyBtYWNybyBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUgdG8gcmVwbGFjZQotCVRSQURfQ09SRV9TVEFDS19PRkZTRVQuCi0JKiBob3N0cy9zeW1tZXRyeS5oOiBEZWZpbmUgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFIGFuZAotCVRSQURfQ09SRV9VU0VSX09GRlNFVCBidXQgbm90IEhPU1RfU1RBQ0tfT0ZGU0VULgotCi1XZWQgTWFyICAyIDExOjU3OjAzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uW2NoXTogRG8gbm90IGluY2x1ZGUgbGliaHBwYS5oIGluIHNvbS5jLCBpbnN0ZWFkIGluY2x1ZGUKLQlpdCBpbiBzb20uaC4KLQotCSogZWxmMzItaHBwYS5bY2hdOiBEbyBub3QgaW5jbHVkZSBsaWJocHBhLmggaW4gZWxmMzItaHBwYS5jLCBpbnN0ZWFkCi0JaW5jbHVkZSBpdCBpbiBlbGYzMi1ocHBhLmguCi0KLQkqIHNvbS5jIChsb2cyKTogUmV0dXJuIC0xIG9uIGVycm9yIHJhdGhlciB0aGFuIGFib3J0aW5nLgotCShzZXR1cF9zZWN0aW9ucyk6IEJ1YmJsZSB1cCBhbiBlcnJvciBmcm9tIGxvZzIuCi0KLQkqIENoYW5nZXMgdG8gbWFrZSBIUCBDIGNvbXBpbGVyIGhhcHB5IGluIGJvdGggdHJhZGl0aW9uYWwKLQlhbmQgQU5TSSBtb2RlLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogVXNlIGNvcnJlY3QgZW51bSB0eXBlIGZvcgotCWZpZWxkIHBhcmFtZXRlci4KLQkoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogVXNlIHVuc2lnbmVkIGludCByYXRoZXIgdGhhbgotCXVuc2lnbmVkIGNoYXIgdG8gYXZvaWQgR05VLUMgZXh0ZW5zaW9ucy4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IFJldHVybiBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgc3VjY2VzcwotCW9yIGZhaWx1cmUgcmF0aGVyIHRoYW4gYWJvcnRpbmcgb24gZmFpbHVyZS4KLQotCSogc29tLmggKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IEZpeCBwcm90b3R5cGUgdG8gbWF0Y2gKLQlzb20uYyBjaGFuZ2VzLgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogQWRkIHByb3RvdHlwZS4KLQkoaHBwYV9zb20tZ2VuX3JlbG9jX3R5cGUpOiBMaWtld2lzZS4KLQotCSogZWxmMzItaHBwYS5jOiBBZGQgYSBjb3VwbGUgY2FzdHMgdG8gbWFrZSBIUCBjb21waWxlciBoYXBweS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogRG8gbm90IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCi0JdW50aWwgcmVzdCBvZiBjb2RlIGlzIHJlYWR5IHRvIGhhbmRsZSBpdC4gIEFib3J0IGZvciBub3cuCi0KLVR1ZSBNYXIgIDEgMTg6MzM6NTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotVHVlIE1hciAgMSAxMzowNjo1MyAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBpMzg2b3M5ay5jOiB1c2UgbmV3IGZ1bmN0aW9ucyBiZmRfc2V0X2Vycm9yIGFuZCBiZmRfZ2V0X2Vycm9yLgotCSogTWFrZWZpbGUuaW46IGRlbGV0ZSBhbiBleHRyYSBibGFuay4KLQkqIGNvbmZpZ3VyZS5pbiA6IEFkZCBpMzk2b3M5a192ZWMuCi0KLU1vbiBGZWIgMjggMTU6NDE6MDEgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCA6IEFkZCBpMzg2LW9zOWsuCi0JKiBjb25maWcvaTM4Ni1vczlrLm10IDogTmV3bHkgYWRkIG9zOWsgdGFyZ2V0IG1ha2VmaWxlLgotCi0JKiBpMzg2b3M5ay5jIDogbmV3IGZpbGUgdG8gaGFuZGxlIG9zOWsgZm9ybWF0IGJmZC4KLQkqIE1ha2VmaWxlLmluIDogSGFuZGxlIG5ldyBmaWxlIGkzODZvczlrLmMKLQkqIHRhcmdldHMuYyA6IEFkZCBiZmRfdGFyZ2V0X29zOWtfZmxhdm91ciBhbmQgaTM4Nm9zOWtfdmVjLgotCSogY2FjaGUuYyA6IEluaXRpYWxpemUgY2FjaGVfc2VudGluZWwgdG8gMC4KLQotU3VuIEZlYiAyNyAxNjozMDo1NSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChtaXNtYXRjaGVzLCByZXR2YWxfbWlzbWF0Y2hlcyk6IEZpeCBtaXNtYXRjaAotCWFjdGlvbiBpbiBjYXNlIHdoZXJlIGNhbGxlciBzcGVjaWZpZWQgbm8gYXJndW1lbnQgcmVsb2NhdGlvbi4KLQkoaHBwYV9lbGZfYnVpbGRfbGlua2VyX3N0dWIpOiBUcnkgYWdhaW4gdG8gZ2V0IHRoZSBzeW1fcHRyX3B0cgotCXJpZ2h0IGluIHRoZSBvcmlnaW5hbCByZWxvY2F0aW9uIGFuZCB0aGUgc3R1YidzIHJlbG9jYXRpb24uCi0KLSAgICAgICAgKiBlbGYzMi1ocHBhLmggKGhwcGFfbG9va19mb3Jfc3R1Yl9pbl9zZWN0aW9uKTogRml4IHR5cG8uICBEZWxldGUKLQl1bnVzZWQgc3ltYm9scyBhcmd1bWVudC4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX3JlbG9jKTogQWNjZXB0IGFzeW1ib2wgKiogcmF0aGVyCi0JdGhhbiBhc3ltYm9sICogZm9yIG9yaWdpbmFsIHRhcmdldCBzeW1ib2wuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCVNldCByZWxvYy0+c3ltX3B0cl9wdHIgYXBwcm9wcmlhdGVseS4KLQkoaHBwYV9lbGZfYnVpbGRfbGlua2VyX3N0dWIpOiBTZXQgcmVsb2MtPnN5bV9wdHJfcHRyIGNvcnJlY3RseS4KLQkoaHBwYV9lbGZfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IE5vIGxvbmdlciBuZWVkIHN5bWJvbHMKLQlhcmd1bWVudC4gIFVzZSB0aGUgb3V0cHV0IHN5bWJvbHMgd2hlbiBjYW5vbmljYWxpemluZyB0aGUgcmVsb2NzLAotCWNyZWF0aW5nIHRoZW0gaWYgbmVjZXNzYXJ5LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBEbyBub3QKLQlyZWJ1aWxkL2Nsb2JiZXIgdGhlIG91dHB1dCBzeW1ib2xzIGlmIHRoZXkgYWxyZWFkeSBleGlzdC4KLQotU3VuIEZlYiAyNyAxNToyMjozNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAoQkZEX1NFTkQsIEJGRF9TRU5EX0ZNVCk6IEFkZCBkZWJ1Z2dpbmcgdmVyc2lvbnMgdGhhdAotCWNoZWNrIGFsbCB0aGUgcG9pbnRlciBkZXJlZmVyZW5jZXMuICBFbmFibGVkIHZpYSBERUJVR19CRkRfU0VORC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogc3JlYy5jIChoZXhfdmFsdWUpOiBBbHdheXMgc2V0IHRvIGEgc2l6ZSBvZiAyNTYgYnl0ZXMuCi0JKHNyZWNfaW5pdCk6IENvc21ldGljIGNoYW5nZXMuCi0KLVN1biBGZWIgMjcgMTE6MTg6NDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYzogU2Vjb25kIGhhbGYgb2YgbWFqb3IgY2xlYW51cC4gIE1vcmUgY29tbWVudHMsCi0JUEFSQU1pemUgYW5kIHN0YXRpY2l6ZSByZXN0IG9mIGZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQKLQlmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkL3VubmVjZXNzYXJ5IGFyZ3VtZW50cyB0byBzb21lIGZ1bmN0aW9ucy4KLQlHcm91cCBzdGF0aWMgdmFycyB0b2dldGhlci4gIEFib3J0IGZvciBiYWQgZXJyb3JzIHVudGlsIHdlIGhhdmUKLQllcnJvciBjb2RlIHByb3BvZ2F0aW9uIHdvcmtpbmcuICBXb3JrIG9uIHNwYWNpbmcgYW5kIGluZGVudGlvbi4KLQlBZGQgRklYTUVzIGZvciB1bnJlc29sdmVkIHByb2JsZW1zLiAgVXNlIGVudW1zIHJhdGhlciB0aGFuCi0JI2RlZmluZXMgZm9yIGxvdHMgb2YgdGhpbmdzLiAgTWVyZ2UgdHdvIGZ1bmN0aW9ucyB3aGljaCBidWlsZAotCWxpbmtlciBzdHVicyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIChzbyB0aGV5IGNhbiBlYXNpbHkgc2hhcmUgYQotCXRvbiBvZiBjb21tb24gY29kZSkuCi0KLVNhdCBGZWIgMjYgMTA6MDA6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogQWRqdXN0IGhhbmRsaW5nIG9mIG92ZXJmbG93IHRvCi0JYXZvaWQgZGVwZW5kaW5nIHVwb24gcmlnaHQgc2hpZnRzIG9mIHNpZ25lZCBudW1iZXJzLCBhbmQgdG8KLQljb3JyZWN0IGhhbmRsaW5nIG9mIHNyY19tYXNrIHdpdGggbG93ZXIgYml0cyB6ZXJvLgotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmM6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuCi0JKiBlY29mZi5jLCBlY29mZmxpbmsuYywgZWNvZmZzd2FwLmgsIHNyZWMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmM6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYWtlIGkgdW5zaWduZWQ7IHJlbW92ZSBvbGQKLQkjaWYgMCBjb2RlLgotCShlbGZfd3JpdGVfcGhkcnMpOiBNYWtlIGkgdW5zaWduZWQuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogTWFrZSBpIGFuZCBuX2xlZnQgdW5zaWduZWQuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTWFrZSBpIHVuc2lnbmVkLgotCSh3cml0ZV9zaGRyc19hbmRfZWhkcik6IE1ha2UgY291bnQgdW5zaWduZWQuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogTWFrZSBpIHVuc2lnbmVkLgotCShOQU1FKGJmZCxlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IE1ha2UgY291bnQgdW5zaWduZWQuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBNYWtlIGluZGV4IGFyZ3VtZW50IHVuc2lnbmVkLgotCi1GcmkgRmViIDI1IDIxOjM0OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oOiBEb24ndCBpbmNsdWRlIGFzc2VydC5oLgotCShzd2FwX291dF9zeW1zKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYXNzZXJ0LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IEFkZCBtaXNzaW5nCi0JYnJlYWsgaW4gc3dpdGNoLgotCi0JKiBob3N0cy9pMzg2djQuaCAocXNvcnQsIHN0cnRvbCk6IFJlbW92ZSBpbmNvcnJlY3QgYW5kIHVzZWxlc3MKLQlkZWNsYXJhdGlvbnMuCi0KLUZyaSBGZWIgMjUgMTY6MzU6NTcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmhwcGEuaCAoaHBwYV9yZWJ1aWxkX2luc24pOiBNb3ZlZCBoZXJlIGZyb20gZWxmMzItaHBwYS5jLgotCi0JKiBlbGYzMi1ocHBhLmggKGVsZl9ocHBhX3RjX3N5bWJvbCk6IEFkZCBuZXcgYXJndW1lbnRzLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBBZGQgZXh0ZXJuIGRlY2wuCi0KLQkqIGVsZjMyLWhwcGEuYzogRmlyc3QgaGFsZiBvZiBtYWpvciBjbGVhbnVwLiAgQWRkL2NsZWFudXAgbG90cyBvZgotCWNvbW1lbnRzLiAgUEFSQU1pemUgc29tZSBzdGF0aWMgZnVuY3Rpb25zLiAgRGVsZXRlIHVudXNlZCBmdW5jdGlvbnMuCi0JRGVsZXRlIHVudXNlZC91bm5lY2Vzc2FyeSBhcmd1bWVudHMgdG8gbWFueSBmdW5jdGlvbnMuICBHcm91cAotCXN0YXRpYyB2YXJzIHRvZ2V0aGVyLiAgQ29sbGFwc2UgY29tbW9uIGNhc2Ugc3RhdGVtZW50cyB0b2dldGhlcgotCWluIG1hbnkgcGxhY2VzLiAgVXNlIGRlZmF1bHQgY2FzZSB3aGVuIHBvc3NpYmxlIGluc3RlYWQgb2YgbGlzdGluZwotCWVhY2ggY2FzZSBzZXBhcmF0ZWx5LiAgQWJvcnQgZm9yIGJhZCBlcnJvcnMgdW50aWwgd2UgZ2V0IGVycm9yCi0JY29kZSBwcm9wb2dhdGlvbiB3b3JraW5nLiAgV29yayBvbiBzcGFjaW5nIGFuZCBpbmRlbnRpb24gcHJvYmxlbXMuCi0JQWRkIEZJWE1FcyBmb3Igc29tZSB1bnJlc29sdmVkIHByb2JsZW1zLiAgRGVsZXRlIGhvcGVsZXNzbHkgYnJva2VuIAotCUNPTVBMRVggcmVsb2NhdGlvbiBzdXBwb3J0IChpdCdzIG5ldmVyIHVzZWQgYW55d2F5KS4KLQkoaHBwYV9lbGZfcmVidWlsZF9pbnNuKTogRGVsZXRlLiAgTW92ZWQgaW50byBsaWJocHBhLmguCi0JKGVsZl9ocHBhX3RjX3N5bWJvbCk6IEFjY2VwdCBhbmQgdXNlIG5ldyBhcmd1bWVudHMgKHN5bWV4dCBjaGFpbnMpLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBJbml0aWFsaXplIG1hdGNoaW5nX3ZlY3RvcgotCXRvIGtlZXAgZ2NjIC1XYWxsIHF1aWV0LgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBGaXggdHlwby4KLQotCSogc29tLmMgKHNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogVXNlICJzaXplb2YgKGFzeW1ib2wgKikiCi0Jbm90ICJzaXplb2YgKHNvbV9zeW1ib2xfdHlwZSAqKSIuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBVc2UgInNpemVvZiAoYXN5bWJvbCAqKSIKLQlub3QgInNpemVvZiAoYXN5bWJvbCIpLiAgT3Bwcy4KLQotRnJpIEZlYiAyNSAxMzoxOTowNCAxOTk0ICBUZWQgTGVtb24gIChtZWxsb25AcGVwcGVyLm5jZC5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X2dwX3NpemUpOiBDYW4ndCByZXR1cm4gZ3AgdmFsdWUgb24gYW4gYXJjaGl2ZS4KLQkoYmZkX3NldF9ncF9zaXplKTogIENhbid0IHNldCBncCB2YWx1ZSBvbiBhbiBhcmNoaXZlLgotCi1GcmkgRmViIDI1IDEyOjU3OjAwIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAocGFzc19vdmVyKTogRG9uJ3Qgc2tpcCB0b28gbWFueSBjaGFyYWN0ZXJzIHdoZW4KLQllbmQgb2YgbGluZSBzZWVuLgotCi1GcmkgRmViIDI1IDExOjQxOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBBbGlnbiByZXN1bHQgdG8gMTYgYnl0ZQotCWJvdW5kYXJ5LgotCi1UaHUgRmViIDI0IDA3OjEzOjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IERlcml2ZSBzeW1ib2xfaW5mbwotCWZpZWxkIGZvciBhYnNvbHV0ZSBzeW1ib2xzIGluIHRoZSBzYW1lIG1hbm5lciBhcyB1bmRlZmluZWQKLQlhbmQgY29tbW9uIHN5bWJvbHMuCi0KLVRodSBGZWIgMjQgMDQ6Mjk6MTkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGZjb2RlLmggKGVsZl9jb3JlX2ZpbGVfcCk6ICBDaGVjayBmb3IgY29yZSBmaWxlIGVfbWFjaGluZSBtYXRjaAotCWxpa2UgaW4gZWxmX29iamVjdF9wLgotCi1XZWQgRmViIDIzIDE4OjI4OjM3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKGFsbG9jYSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBVc2UgQ1BVX1BBX1JJU0MxXzAgZm9yIG1hZ2ljCi0JbnVtYmVyIHJhdGhlciB0aGFuIEhQOTAwMFM4MDBfSUQuICBOb3RlIHNvbS5jIGlzIGNhcmVmdWwKLQl0byBtYWtlIHN1cmUgQ1BVX1BBX1JJU0MxXzAgaXMgYWx3YXlzIGRlZmluZWQuCi0KLU1vbiBGZWIgMjEgMTA6MTI6MDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGFyZ2V0cy5vLCBhcmNodXJlcy5vKTogVXNlIEFMTF9DRkxBR1MgdG8gc3VwcGx5Ci0JZmxhZ3MgdG8gZXhwbGljaXQgY29tcGlsZSBhY3Rpb25zLgotCi1Nb24gRmViIDIxIDA5OjUwOjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfd3JpdGVfc3ltaGRyKTogU2V0IHN5bWhkci0+bWFnaWMgaGVyZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE1ha2Ugc3VyZSAuYnNzIHNlY3Rpb24KLQllbmRzIG9uIGEgcGFnZSBib3VuZGFyeSBpZiB0aGVyZSBpcyBubyBzeW1ib2wgdGFibGUuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IHN5bWhkci0+bWFnaWMgaGVyZS4KLQotCSogaG9zdHMvaHAzMDAuaDogSW5jbHVkZSA8c3RkbGliLmg+OyBkb24ndCBkZWNsYXJlIGZyZWUuCi0KLQkqIHNvbS5jIChzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMpOiBVc2UgYSBwb2ludGVyIGFuZCBhbGxvY2EKLQlyYXRoZXIgdGhhbiBhbiBhcnJheSBvZiB2YXJpYWJsZSBzaXplLgotCShzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IExpa2V3aXNlLgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXdyaXRlIG1hc2sgYW5kIHNoaWZ0Ci0Jb3BlcmF0aW9uIHRvIGF2b2lkIE9TRiAxLjMgY2MgYnVnLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTWFrZSB0ZXh0X3NpemUsIGRhdGFfc2l6ZQotCWFuZCBic3Nfc2l6ZSBiZmRfc2l6ZV90eXBlIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4gIE1ha2UKLQl0ZXh0X3N0YXJ0IGFuZCBkYXRhX3N0YXJ0IGJmZF92bWEgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLgotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX2FkZF9zdHJpbmcpOiBSZW1vdmUgaW5jb3JyZWN0IGNhc3Qgb2YgcmV0dXJuCi0JdmFsdWUuCi0KLVN1biBGZWIgMjAgMTY6MDY6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogQ29uc2lkZXIKLQlzeW1ib2xzIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgYXJjaGl2ZSBtYXAuCi0KLVNhdCBGZWIgMTkgMDM6MTc6MzIgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb2ZmLWFscGhhLmMgKHJlbG9jX25pbCk6ICBBZGQgZm9yd2FyZCBkZWNsYXJhdGlvbiwgYWRkIG1pc3NpbmcKLQllcnJvcl9tZXNzYWdlIGFyZ3VtZW50LgotCSogY29mZi1zcGFyYy5jIChiZmRfY29mZl9nZW5lcmljX3JlbG9jKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLAotCWFkZCBtaXNzaW5nIGVycm9yX21lc3NhZ2UgYXJndW1lbnQuCi0JKiBtaXBzYnNkLmMgKG1pcHNfZml4X2hpMTZfcyk6ICBBZGQgZm9yd2FyZCBkZWNsYXJhdGlvbiwgYWRkIG1pc3NpbmcKLQllcnJvcl9tZXNzYWdlIGFyZ3VtZW50LgotCi1GcmkgRmViIDE4IDExOjQxOjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVN1cHBvcnQgZm9yIFBvd2VyUEMgTmV0V2FyZS4KLQkqIG5sbTMyLXBvd2VycGMuYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotbmV0d2FyZSopOiBOZXcgdGFyZ2V0OyB1c2UgcHBjLW5sbS4KLQkqIGNvbmZpZy9wcGMtbmxtLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAobmxtMzJfcG93ZXJwY192ZWMpOiBOZXcgdGFyZ2V0IHZlY3RvcjsgdXNlCi0JbmxtMzItcG93ZXJwYy5vLCBubG0zMi5vLCBubG0uby4KLQkqIHRhcmdldHMuYyAobmxtMzJfcG93ZXJwY192ZWMpOiBEZWNsYXJlLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIG5sbTMyLXBvd2VycGMuby4KLQkoQ0ZJTEVTKTogQWRkIG5sbTMyLXBvd2VycGMuYy4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgUG93ZXJQQyBFTEYuICBEb25lIHdpdGhvdXQgYW4gQUJJLCBhbmQKLQlwcm9iYWJseSB0byBiZSBjaGFuZ2VkIHdoZW4gSSBnZXQgYW4gQUJJLgotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLXN5c3Y0Kik6IE5ldyB0YXJnZXQ7IHVzZSBwcGMtZWxmLgotCSogY29uZmlnL3BwYy1lbGYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfcG93ZXJwY192ZWMpOiBOZXcgdGFyZ2V0IHZlY3RvcjsgdXNlCi0JZWxmMzItcG93ZXJwYy5vLCBlbGYzMi5vLCBlbGYuby4KLQkqIGVsZjMyLXBvd2VycGMuYzogTmV3IGZpbGUuCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IEFkZCBiZmRfYXJjaF9wb3dlcnBjIGNhc2UuCi0JKGVsZl9zZXRfYXJjaF9tYWNoKTogTGlrZXdpc2UuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9wb3dlcnBjX3ZlYyk6IERlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItcG93ZXJwYy5vLgotCShDRklMRVMpOiBBZGQgZWxmMzItcG93ZXJwYy5jLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1UaHUgRmViIDE3IDE1OjI5OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX2xpbmVudW1iZXJzKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBIYW5kbGUgemVybyBzeW1ib2xzCi0JcmVhc29uYWJseS4gIEFsbG9jYXRlIHhfc3ltcCB1c2luZyBhbGxvY2EuCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBFTEYgcHJvZ3JhbSBoZWFkZXIgZW50cmllcwotCW11c3QgYmUgc29ydGVkIGJ5IGxvYWQgYWRkcmVzcy4gIFRoaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZW50cmllcwotCWluIHJldmVyc2Ugb3JkZXIuCi0KLQkqIHNlY3Rpb24uYyAoU0VDX0lOX01FTU9SWSk6IERlZmluZS4KLQkoYXNlY3Rpb24pOiBSZW5hbWUgdW51c2VkIGZpZWxkIG90aGVydXNlcmRhdGEgdG8gY29udGVudHMsIGFuZAotCW1ha2UgaXQgY2hhciAqLgotCShiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IEluaXRpYWxpemUgY29udGVudHMgZmllbGQgdG8gTlVMTC4KLQkoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogSWYgU0VDX0lOX01FTU9SWSBpcyBzZXQsIGdldCBzZWN0aW9uCi0JY29udGVudHMgZnJvbSBjb250ZW50cyBmaWVsZCByYXRoZXIgdGhhbiBmcm9tIGZpbGUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVRodSBGZWIgMTcgMDg6MzA6NTMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9lcnJvciwgYmZkX3NldF9lcnJvcik6IE5ldyBmdW5jdGlvbnMuCi0JKGJmZF9lcnJvcik6IE1ha2Ugc3RhdGljLgotCShiZmRfZXJyb3JfdHlwZSk6IFJlbmFtZWQgZnJvbSBiZmRfZWMuICBQcmVwZW5kICJiZmRfZXJyb3JfIiB0bwotCWFsbCB2YWx1ZXMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogYWl4Mzg2LWNvcmUuYywgYW91dC1hZG9iZS5jLCBhb3V0LWVuY2FwLmMsIGFvdXQtdGFyZ2V0LmgsIAotCWFvdXRmMS5oLCBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIAotCWJmZC5jLCBib3V0LmMsIGNhY2hlLmMsIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmMsIAotCWNvZmYtcnM2MDAwLmMsIGNvZmZjb2RlLmgsIGNvZmZnZW4uYywgY29yZS5jLCBjdG9yLmMsIAotCWVjb2ZmLmMsIGVjb2ZmbGluay5jLCBlbGYuYywgZWxmMzItaHBwYS5jLCBlbGYzMi1taXBzLmMsIAotCWVsZmNvZGUuaCwgZm9ybWF0LmMsIGhhc2guYywgaHAzMDBocHV4LmMsIGhwcGFic2QtY29yZS5jLCAKLQlpMzg2bHlueC5jLCBpZWVlLmMsIGxpYmJmZC5jLCBsaWJlbGYuaCwgbGlua2VyLmMsIAotCWx5bngtY29yZS5jLCBubG0uYywgbmxtMzItYWxwaGEuYywgbmxtMzItaTM4Ni5jLCAKLQlubG0zMi1zcGFyYy5jLCBubG1jb2RlLmgsIG9hc3lzLmMsIG9wbmNscy5jLCBvc2YtY29yZS5jLCAKLQlwdHJhY2UtY29yZS5jLCByZWxvYzE2LmMsIHJzNjAwMC1jb3JlLmMsIHNlY3Rpb24uYywgc29tLmMsIAotCXNyZWMuYywgc3Vub3MuYywgc3ltcy5jLCB0YXJnZXRzLmMsIHRla2hleC5jLCAKLQl0cmFkLWNvcmUuYzogQ2hhbmdlIGNhbGxlcnMuCi0KLVR1ZSBGZWIgMTUgMjI6Mjc6MjcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jOiBSZW1vdmUgRklYTUVzIGZvciB0aGluZ3Mgd2hpY2ggaGF2ZSBiZWVuIGRlYWx0IHdpdGguCi0KLVR1ZSBGZWIgMTUgMTk6Mzk6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBTaW5jZSB0aGlzIGZ1bmN0aW9uIHJlYWRzCi0JdW5yZWxvY2F0ZWQgY29udGVudHMsIHRoZSBzZWN0aW9uJ3MgcmF3IHNpemUgaXMgYWx3YXlzIHRoZSBvbmUgdG8KLQl1c2UgZm9yIGJvdW5kcyBjaGVja2luZy4KLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IEluIGFzc2VydGlvbiwgY29tcGFyZQotCWxpbmtfb3JkZXIgc2l6ZSBmaWVsZCBhZ2FpbnN0IGNvb2tlZCBzaXplLCBub3QgcmF3IHNpemUsIG9mIGlucHV0Ci0Jc2VjdGlvbi4KLQotCSogYm91dC5jIChiX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBGb3IgQlNTIHNlY3Rpb24sIGp1c3QKLQlyZXR1cm4gMC4KLQkoYWxpZ25jb2RlKTogV2hlbiBzaHJpbmtpbmcsIHRoZSBhZGRlbmQgc2hvdWxkIGJlIHNldCB0byB0aGUKLQljdXJyZW50IG9mZnNldCBpbiB0aGUgc2VjdGlvbiBwbHVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgcGFkZGluZwotCXRoYXQgd2lsbCBhY3R1YWxseSBiZSByZXRhaW5lZC4KLQkoYl9vdXRfcmVsYXhfc2VjdGlvbik6IElmIGEgc2VjdGlvbiBjb250YWlucyBubyByZWxvY2F0aW9ucywgZG9uJ3QKLQlib3RoZXIgcHJvY2Vzc2luZyB0aGVtLgotCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBTZXQgcmVsb2NfZG9uZS4gIEFzc2VydAotCXRoYXQgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIHJldHVybnMgdHJ1ZS4gIENoZWNrIHRoYXQgcmVsb2NzIGFyZQotCXByb3Blcmx5IG9yZGVyZWQuCi0JKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgY2FzZSBBTElHTkRPTkUpOiBBc3NlcnQKLQl0aGF0IHJlbG9jLT5hZGRlbmQgZmFsbHMgYmV0d2VlbiB0aGUgY3VycmVudCBzb3VyY2Ugb2Zmc2V0IGFuZCB0aGUKLQlyYXcgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbi4KLQotCSogY29uZmlnLmJmZDogU3VwcG9ydCBpOTYwIHZ4d29ya3MgdmVyc2lvbnMgPiA1LjAgd2l0aCBjb2ZmLCBub3QKLQlib3V0LiAgRGVmYXVsdCB3aXRoIG5vIHZlcnNpb24gbnVtYmVyIGlzIHN0aWxsIGJvdXQuICBTdXBwb3J0Ci0JZXhwbGljaXQgaTk2MC1jb2ZmIHRhcmdldCB0b28uCi0KLQkqIGJvdXQuYzogQ2hhbmdlZCBzb21lIGluZGVudGF0aW9uLCBkZWxldGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsCi0JZml4ZWQgc29tZSBjb21tZW50cywgcmVtb3ZlZCBzb21lICIjaWYgMSIgbGluZXMuCi0JKG91dHB1dF9hZGRyKTogTmV3IG1hY3JvLgotCShjYWxsanhfY2FsbGJhY2ssIGNhbGxqX2NhbGxiYWNrLCBnZXRfdmFsdWUsIGFiczMyY29kZSwgYWxpZ25jb2RlLAotCWJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFVzZSBpdCBmb3IgcmVhZGFiaWxpdHkuCi0KLVR1ZSBGZWIgMTUgMDk6MDA6MTYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogSXRlcmF0ZSB0aHJvdWdoIHRoZSBTT00KLQlzeW1ib2xzLCBub3QgdGhlIEJGRCBzeW1ib2xzLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IExpa2V3aXNlLgotCi1Nb24gRmViIDE0IDIyOjU1OjIwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvIG5vdCBkaWUgaWYgYSBCRkQgZG9lc24ndAotCWhhdmUgYW55IHN5bWJvbHMuCi0KLQkqIEZpbmlzaCBiYXNpYyByZWFkLXdyaXRlIHN1cHBvcnQgZm9yIFNPTSBhcmNoaXZlIGxpYnJhcmllcy4gIEJ1Z3MKLQlzdXJlbHkgcmVtYWluIGFzIHRoaXMgaGFzbid0IGJlZW4gdGVzdGVkIGFsbCB0aGF0IG11Y2guCi0JKiBzb20uYyAoU09NX0xTVF9IQVNIX1NJWkUsIFNPTV9MU1RfTU9EVUxFX0xJTUlUKTogRGVmaW5lLgotCShzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8pOiBOZXcgc3RydWN0dXJlIHRvIGhvbGQgaW5mbyBuZWNlc3NhcnkKLQl0byBidWlsZCBib3RoIG5vcm1hbCBhbmQgbGlicmFyeSBzeW1ib2wgdGFibGVzLgotCShzb21fZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb24gdG8gZGVyaXZlIGluZm8gbmVjZXNzYXJ5Ci0JdG8gYnVpbGQgYm90aCBub3JtYWwgYW5kIGxpYnJhcnkgc3ltYm9sIHRhYmxlcy4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBVc2UgbmV3IGZ1bmN0aW9uIHRvIGRlcml2ZSBtaXNjCi0Jc3ltYm9sIGluZm9ybWF0aW9uLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogVXBkYXRlIGJhY2tlbmQgcHJpdmF0ZSBkYXRhIGZvciBzeW1ib2xzCi0JYXBwcm9wcmlhdGVseS4KLQkoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl9zeW1ib2xfaGFzaCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV93cml0ZV9hcm1hcCk6IEZsZXNoIG91dC4KLQkoc29tX3ZlYyk6IEZpeCBhciBwYWRkaW5nIGNoYXJhY3Rlci4KLQotCSogc29tLmM6IENvbnNpc3RlbnRseSB1c2UgbWVtc2V0IHJhdGhlciB0aGFuIGJ6ZXJvLgotCi1Nb24gRmViIDE0IDE3OjAyOjI4IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmM6ICBBZGQgTHlueCBjb3JlIGZpbGUgc3VwcG9ydCwgdXNlIEhPU1RfQUlYLCB3aGVyZQotCWFwcHJvcHJpYXRlLgotCSogcnM2MDAwLWNvcmUuYzogIFVzZSBIT1NUX0FJWCBpbnN0ZWFkIG9mIENPUkVGSUxFU19QTEVBU0UuCi0JKiBjb25maWcvcnM2MDAwLm1oOiAgUmVtb3ZlIGRlZnMgb2YgQVJDSElWRVNfUExFQVNFIGFuZAotCUNPUkVGSUxFU19QTEVBU0UuCi0JKiBjb25maWcvcnM2MDAwbHlueC5taDogIFR1cm4gb24gTHlueCBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL3JzNjAwMC5oOiAgI2RlZmluZSBIT1NUX0FJWC4KLQkqIGhvc3RzL3JzNjAwMGx5bnguaDogIENyZWF0ZSB0aGlzIHRvIGVuYWJsZSBMeW54IGhvc3Qgc3VwcG9ydC4KLQotU3VuIEZlYiAxMyAxNDozMDowMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKHNvbV9zeW1ib2xfZGF0YSk6IFNhZmVseSBhY2Nlc3MgYmFja2VuZCBwcml2YXRlIGRhdGEKLQlmb3IgQkZEIHN5bWJvbHMuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi0JKiBSZWFkLW9ubHkgU09NIGFyY2hpdmUgc3VwcG9ydC4KLQkqIHNvbS5jIChzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMpOiBOZXcgaGVscGVyIGZ1bmN0aW9uLgotCShzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyk6IE5ldyBoZWxwZXIgZnVuY3Rpb24uCi0JKHNvbV9zbHVycF9hcm1hcCk6IE5ldyBmdW5jdGlvbiB0byByZWFkIGEgU09NIExTVC4KLQotCSogc29tLmg6IEluY2x1ZGUgPGxzdC5oPiBhbmQgPGFyLmg+LgotCi1TYXQgRmViIDEyIDIyOjM0OjE0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IEZpeCB0eXBvLgotCSh3cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWVzIGZyb20gcHJlcF9oZWFkZXJzIGFuZAotCWVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCi0JKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgMTEgMTY6NTY6NTAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKG5vcm1hbGl6ZSkgW1ZNU106IENhbGwgbWFsbG9jLCBub3QgYmZkX3htYWxsb2MuCi0JKGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IENoZWNrIHJlc3VsdCBvZiBub3JtYWxpemUuCi0KLVR1ZSBGZWIgIDggMDg6NTc6MzEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JTWFrZSBhbGwgY2FsbGVycyBvZiBtYWxsb2Mgb3IgcmVhbGxvYyAoaW5jbHVkaW5nIHZpYSBvYnN0YWNrcykKLQljaGVjayB0aGUgcmVzdWx0IGZvciBOVUxMLiAgTW9zdCBzZXQgYmZkX2Vycm9yIHRvIG5vX21lbW9yeSBhbmQKLQlyZXR1cm4gaW4gdGhhdCBjYXNlOyBhIGZldyBhcmUgaGFyZGVyIHRvIGZpeCwgYW5kIGFyZSBtYXJrZWQKLQl3aXRoICJGSVhNRSA8cmV0dXJuIHR5cGU+Ii4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1YgotCWhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiAgQ2hlY2sgYmZkX21ha2VfZW1wdHlfc3ltYm9sIHJldHVybi4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scwotCV9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEaXR0bwotCSogc2VjdGlvbi5jIChiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IERpdHRvLgotCi0JKiB0ZWtoZXguYyAoZmluZF9jaHVuayB0ZWtoZXhfbWtvYmplY3QpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGZpcnN0X3BoYXNlKTogRGl0dG8uICBGSVhNRSB2b2lkCi0JKHRla2hleF9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoTVkocmVhZF9keW5hbWljX3N5bWJvbHMpIE1ZKHJlYWRfZHluYW1pY19yZWxvY3MpKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBzdHJpbmdoYXNoLmMgKF9iZmRfc3RyaW5ndGFiX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlLgotCi0JKiBzcmVjLmM6IEluZGVudC4KLQkoZmlsbHVwX3N5bWJvbHMpOiBDaGVjayBiZmRfYWxsb2MuICBGSVhNRSB2b2lkCi0JKHNyZWNfbWtvYmplY3Qgc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cwotCXNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGVjayBiZmRfYWxsb2MuIAotCShzcmVjX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4KLQkobWFrZV91bmlxdWVfc2VjdGlvbik6IENoZWNrIGJmZF9hbGxvYy4KLQkoc29tX25ld19zZWN0aW9uX2hvb2spOiBDaGVjayBiZmRfemFsbG9jLgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogRGl0dG8uICBGSVhNRSB2b2lkCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCShvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogb2FzeXMuYyAob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIG9hc3lzX2FyY2hpdmVfcAotCW9hc3lzX21rb2JqZWN0IG9hc3lzX29iamVjdF9wIG9hc3lzX25ld19zZWN0aW9uX2hvb2sKLQlvYXN5c19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoZWNrIGJmZF9hbGxvYy4KLQkob2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhKTogQ2hlY2sgYmZkX3phbGxvYyBhbmQgYmZkX2FsbG9jLgotCShvYXN5c19tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIG5sbWNvZGUuaCAobmxtX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoZWNrIGJmZF96YWxsb2MgYW5kIGJmZF9hbGxvYy4KLQotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX3JlYWRfaW1wb3J0KTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3JlYWRfaW1wb3J0KTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBubG0zMi1hbHBoYS5jIChubG1fYWxwaGFfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGxpbmtlci5jIChfYmZkX2xpbmtfaGFzaF9uZXdmdW5jCi0JKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMKLQkoYXJjaGl2ZV9oYXNoX25ld2Z1bmMKLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZS4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMKLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogQ2hlY2sgYmZkX2FsbG9jLgotCShiZmRfbmV3X2xpbmtfb3JkZXIpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCi0JKiBpcml4LWNvcmUuYyAoaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogaWVlZS5jOiBJbmRlbnQuCi0JKHJlYWRfaWQgZ2V0X3N5bWJvbCBnZXRfc2VjdGlvbl9lbnRyeSBpZWVlX2FyY2hpdmVfcCBpZWVlX29iamVjdF9wCi0JaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgaWVlZV9uZXdfc2VjdGlvbl9ob29rKTogQ2hlY2sgYmZkX2FsbG9jLgotCShkb19vbmUpOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IENoZWNrIGl0LgotCShpbml0X2Zvcl9vdXRwdXQpOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShpZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hlY2sgaXQuCi0JKGRvX3dpdGhfcmVsb2NzKTogIENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGllZWVfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSk6IERpdHRvLiAgRklYTUUgdm9pZC4KLQkoaWVlZV9ta29iamVjdCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKGllZWVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfem1hbGxvYy4KLQotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrCi0JYmZkX3phbGxvYy4KLQotCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrCi0JYmZkX3phbGxvYy4KLQkoaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9wKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX25ld19zZWN0aW9uX2hvb2spOiBDaGVjayBiZmRfYWxsb2MuCi0JKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IERpdHRvLgotCSh3cml0ZV9yZWxvY3MpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQkoZWxmX21hcF9zeW1ib2xzIGFzc2lnbl9zZWN0aW9uX251bWJlcnMgbWFwX3Byb2dyYW1fc2VnbWVudHMpOgotCURpdHRvLiAgUmV0dXJuIGEgYm9vbGVhbi4gCi0JKHN3YXBfb3V0X3N5bXMpOiBEaXR0by4gIENoZWNrIGVsZl9tYXBfc3ltYm9scy4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoZWNrIGJmZF96YWxsb2MuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IERpdHRvLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ2hlY2sgYXNzaWduX3NlY3Rpb25fbnVtYmVycy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBSZXR1cm4gYSBib29sZWFuLgotCUNoZWNrIG1hcF9wcm9ncmFtX3NlZ21lbnRzLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ2hlY2sgaXQuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2JyYW5jaF9yZWxvYyk6IENoZWNrIGJmZF96bWFsbG9jIGFuZAotCXJlYWxsb2MuIAotCShocHBhX2VsZl9zdHViX3JlbG9jKTogRGl0dG8uCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IERpdHRvLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBEaXR0by4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgaXQuCi0JKGVjb2ZmX3NsdXJwX2FybWFwKTogQ2hlY2sgYmZkX2FsbG9jLgotCShlY29mZl93cml0ZV9hcm1hcCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKGVjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUgYW5kCi0JX2JmZF9saW5rX2hhc2hfbmV3ZnVuYy4gCi0JKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogY3Rvci5jIChiZmRfY29uc3RydWN0b3JfZW50cnkpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogQ2hlY2sgYmZkX2FsbG9jLgotCShjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBDaGVjayBiZmRfYWxsb2MuICBGSVhNRSBpbnQKLQkoY29mZl93cml0ZV9saW5lbnVtYmVycyk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IENoZWNrIGJmZF9hbGxvYy4KLQkoY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCSogbGliY29mZi1pbi5oOiBDaGFuZ2UgZGVjbHMgb2YgY29mZl9yZW51bWJlcl9zeW1ib2xzLAotCWNvZmZfd3JpdGVfbGluZW51bWJlcnMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrCi0JY29mZl9yZW51bWJlcl9zeW1ib2xzLCBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzLgotCi0JKiBjb2ZmY29kZS5oOiBJbmRlbnQuCi0JKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuICBSZXR1cm4gYQotCWJvb2xlYW4uIAotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGl0LgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBiZmRfYWxsb2MuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IENoZWNrIGJmZF9hbGxvYyB2YWx1ZS4KLQkoZG9fc2x1cnBfYnNkX2FybWFwKTogRGl0dG8uCi0JKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogQ2hlY2sgYmZkX3JlYWxsb2MgdmFsdWUuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBDaGVjayBiZmRfYWxsb2MKLQlyZXR1cm4gdmFsdWUuICBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4KLQkoTkFNRShhb3V0LG1ha2VfZW1wdHlfc3ltYm9sKSk6IENoZWNrIGJmZF96YWxsb2MgcmV0dXJuIHZhbHVlLgotCShOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENoZWNrIGJmX2FsbG9jIGFuZCBiZmRfemFsbG9jCi0JcmV0dXJuIHZhbHVlLgotCShhZGRfdG9fc3RyaW5ndGFiKTogRGl0dG8uICBGSVhNRSB2b2lkCi0JKGFvdXRfbGlua19oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZSByZXR1cm4gdmFsdWUuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvYyB2YWx1ZS4KLQkodHJhbnNsYXRlX3N5bWJvbF90YWJsZSk6IENoZWNrIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MuCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERpdHRvLgotCSogYW91dHguaCAoYW91dF9saW5rX2hhc2hfbmV3ZnVuYyk6IENoZWNrIF9iZmRfbGlua19oYXNoX25ld2Z1bmMuCi0KLQkqIG9wbmNscy5jIChiZmRfemFsbG9jIGJmZF9yZWFsbG9jKTogQ2hlY2sgcmVzdWx0IG9mIGJmZF9hbGxvYy4KLQotCSogb3BuY2xzLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCShfYmZkX25ld19iZmQpOiBDaGVjayBvYnN0YWNrX2JlZ2luIGZvciAwIHJldHVybi4KLQotCSogaWVlZS5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKLQkoaWVlZV9hcmNoaXZlX3ApOiBDaGVjayBvYnN0YWNrX2JlZ2luIGZvciAwIHJldHVybiBhbmQKLQlvYnN0YWNrX2ZpbmlzaCBmb3IgTlVMTCByZXR1cm4uCi0KLQkqIGhhc2guYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCi0JKGJmZF9oYXNoX3RhYmxlX2luaXRfbik6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuIGFuZAotCW9ic3RhY2tfZmluaXNoIGZvciBOVUxMIHJldHVybi4KLQkoYmZkX2hhc2hfbG9va3VwKTogQ2hlY2sgb2JzdGFja19hbGxvYyBmb3IgTlVMTCByZXR1cm4uCi0KLQkqIGVjb2ZmbGluay5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKLQliZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotCWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyKTogQ2hlY2sgb2JzdGFja19hbGxvYy4KLQkoYWRkX2ZpbGVfc2h1ZmZsZSBhZGRfbWVtb3J5X3NodWZmbGUpOiBDaGVjayBvYnN0YWNrX2FsbG9jIGZvcgotCU5VTEwgcmV0dXJuLiAgUmV0dXJuIGJvb2xlYW4sIG5vdCB2b2lkLgotCShiZmRfZWNvZmZfZGVidWdfaW5pdCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IENoZWNrIGFkZF9maWxlX3NodWZmbGUKLQlhbmQgYWRkX21lbW9yeV9zaHVmZmxlIHJldHVybi4gCi0JKHN0cmluZ19oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZSBhbmQgYmZkX2hhc2hfbmV3ZnVuYy4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGVjb2ZmX2FkZF9zdHJpbmcpOiBDaGVjayBhZGRfbWVtb3J5X3NodWZmbGUgcmV0dXJuLgotCi0JKiBsaWJiZmQtaW4uaCAoeG1hbGxvYywgYmZkX3htYWxsb2MsIGJmZF94bWFsbG9jX2J5X3NpemVfdCk6Ci0JUmVtb3ZlIGRlY2xzLiAKLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1GcmkgRmViIDExIDE1OjM1OjMyIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIEx5bngvcnM2MDAwIHN1cHBvcnQuCi0JKiBjb25maWcvaTM4Ni1ubG0ubXQ6ICBFbmFibGUgYS5vdXQgZmlsZSBzdXBwb3J0LgotCSogY29uZmlnL3JzNjAwMGx5bngubWg6ICBMeW54L3JzNjAwMCBob3N0IHN1cHBvcnQuCi0KLUZyaSBGZWIgMTEgMTc6MjU6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogUmV3cml0ZSBzb21ld2hhdCB0byBpbXByb3ZlCi0JbWVtb3J5IHVzYWdlLgotCi1GcmkgRmViIDExIDEzOjEwOjQyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gJ1xuJyBpbiBhcmNoaXZlIG1hZ2ljCi0JdG8gJ1wwMTInLCBmb3IgZ3JlYXRlciBwb3J0YWJpbGl0eS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX2FybWFwKTogRGl0dG8uCi0KLVRodSBGZWIgMTAgMTI6NTg6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogQ2hlY2sgc3RyaXAgc2V0dGluZ3MgdG8KLQlzZWUgd2hldGhlciBzeW1ib2wgc2hvdWxkIGJlIG91dHB1dC4KLQkqIGdlbmxpbmsuaCAoc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvKTogQWRkZWQgaW5mbwotCWZpZWxkLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogSW5pdGlhbGl6ZSB3Z2luZm8uaW5mby4KLQkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IENoZWNrIHN0cmlwIHNldHRpbmdzIHRvCi0Jc2VlIHdoZXRoZXIgc3ltYm9sIHNob3VsZCBiZSBvdXRwdXQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIHdnaW5mby5pbmZvLgotCi1XZWQgRmViICA5IDIxOjM0OjU4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3JlbG9jX3F1ZXVlX2ZpbmQpOiBEbyBub3QgZXhhbWluZSBhIE5VTEwgcXVldWUgZW50cnkuCi0KLQkqIHNvbS5jOiBDYXN0IHJldHVybiB2YWx1ZXMgZnJvbSBCRkQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgdG8KLQlhdm9pZCB3YXJuaW5ncyBmcm9tIHRoZSBIUCBjb21waWxlci4KLQotV2VkIEZlYiAgOSAxMjo1NTowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEFjY2VwdCBhIExJVEVSQUwKLQlyZWxvYyBvbiBhbiAibGRsIiBpbnN0cnVjdGlvbiB0b28uCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0pOiBDYXN0IHN0YXR1cyBlbGVtZW50cwotCXdoZW4gcGFzc2luZyB0aGVtIHRvIHNwcmludGYuICBVc2UgJWxkIGluc3RlYWQgb2YgJWQuCi0KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfbWthcmNoaXZlKTogUmV0dXJuIGZhbHNlLgotCShyczYwMDBfY29mZl9zbmFyZl9hcl9oZHIpOiBEb24ndCBkZWNsYXJlIGVycm5vOyBpdCdzIG5vdCB1c2VkLgotCUFsc28gcmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgbmFtZWxlbi4KLQkocnM2MDAwY29mZl93cml0ZV9hcm1hcCk6IERlY2xhcmUgb3JsX2NvdW50IGFuZCBzdHJpZHggcGFyYW1ldGVycy4KLQotVHVlIEZlYiAgOCAxODowMDozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oICh4bWFsbG9jKTogRG9uJ3QgZGVjbGFyZSBwYXJhbWV0ZXIgdHlwZSwgdG8gYXZvaWQKLQljb25mbGljdHMuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVHVlIEZlYiAgOCAxNTo1NTo1MCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKHJlbG9jX25pbCk6IE5ldyBmdW5jdGlvbi4KLQkoYWxwaGFfaG93dG9fdGFibGUpOiBVc2UgaXQgYXMgc3BlY2lhbF9mdW5jdGlvbiB0byBwcmV2ZW50IGNlcnRhaW4KLQlyZWxvY3MgZnJvbSBiZWluZyBhZGp1c3RlZCBieSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSUdOT1JFCi0JcmVsb2Mgc2hvdWxkIGJlIHBhcnRpYWxfaW5wbGFjZS4KLQkoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWNjZXB0IGEgTElURVJBTAotCXJlbG9jIG9uIGFuICJsZGwiIGluc3RydWN0aW9uIHRvby4KLQotVHVlIEZlYiAgOCAwMDozMjoyOCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoQ1VSUkVOVF9TVFVCX09GRlNFVCwgaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIsCi0JaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6ICBDYXN0IHRvIGNoYXIgKiBpbnN0ZWFkIG9mIGludAotCWJlZm9yZSBwZXJmb3JtaW5nIHBvaW50ZXIgYXJpdGhtZXRpYy4KLQotTW9uIEZlYiAgNyAyMDo1NjoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLmJmZCAoaHBwYSotKi1vc2YqKTogVXNlIGJmZF9uYW1lIGhwcGFvc2YgZm9yIHRoaXMKLQljb25maWd1cmF0aW9uLgotCShocHBhKi0qLSplbGYqKTogVGhpcyBjb25maWd1cmF0aW9uIHVzZWQgaHBwYS1lbGYgbm93LgotCi0JKiBzb20uYzogVGhpcyBmaWxlIGlzIGFsc28gdXNlZCBmb3IgSE9TVF9IUFBBT1NGLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogRW5hYmxlIHNvbV92ZWMgZm9yIEhPU1RfSFBQQU9TRi4KLQotCSogaG9zdHMvaHBwYW9zZi5oOiBOZXcgaG9zdCBjb25maWd1cmF0aW9uIGZpbGUuCi0KLQkqIGNvbmZpZy9ocHBhYnNkLm10IChTRUxFQ1RfVkVDUyk6IEFkZCBiZmRfZWxmMzJfaHBwYV92ZWMgYXMKLQlCU0QgaGFuZGxlcyBib3RoIFNPTSBhbmQgRUxGIG9iamVjdCBmaWxlcy4KLQotCSogY29uZmlnL2hwcGFvc2YubWggKEhERUZJTkVTKTogRGVsZXRlLiAgTm8gbG9uZ2VyIG5lZWRlZC4KLQkoUkFOTElCKTogRG9lc24ndCBkbyBhbnl0aGluZywgZGVmaW5lIGl0IHRvIGJlICJlY2hvIi4KLQotCSogY29uZmlnL2hwcGFvc2YubXQ6IE5ldyB0YXJnZXQgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIGEgUEEgcnVubmluZwotCU9TRjEuCi0KLU1vbiBGZWIgIDcgMTU6MDI6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGRlZCBiZmRfYXJjaF9wb3dlcnBjLgotCShhcmNodXJlc19pbml0X3RhYmxlKTogSWYgU0VMRUNUX0FSQ0hJVEVDVFVSRVMgaXMgbm90IGRlZmluZWQsCi0JYWRkZWQgYmZkX3Bvd2VycGNfYXJjaC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNwdS1wb3dlcnBjLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUywgQ0ZJTEVTKTogQWRkZWQgY3B1LXBvd2VycGMuYy4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBHZXQgdm1hIGFuZCBhbGlnbm1lbnRfcG93ZXIKLQlvZiBhbiBTSFRfU1RSVEFCIHNlY3Rpb24gZnJvbSBzaF9hZGRyIGFuZCBzaF9hZGRyYWxpZ24sIHJhdGhlcgotCXRoYW4ganVzdCBzZXR0aW5nIHRoZW0gdG8gemVyby4KLQotU3VuIEZlYiAgNiAyMDowNDoxMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzLCBzd2FwX291dF9zeW1zKTogQ2hlY2sgZm9yIE5VTEwgcmV0dXJuCi0JZnJvbSBiZmRfbmV3X3N0cnRhYi4gCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBmb3IgZmFsc2UgcmV0dXJuIGZyb20KLQlzd2FwX291dF9zeW1zLiAKLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IENoZWNrIGZvciBOVUxMIHJldHVybgotCWZyb20gYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4KLQotCSogc3ltcy5jOiBNYWtlIGV4YW1wbGUgYXBwbGljYXRpb24gaW4gZG9jIGNhbGwgeG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2MuIAotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSwKLQlhb3V0X2xpbmtfZ2V0X3N5bWJvbHMsIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKSk6Ci0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlLCBiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6Ci0JKiBlY29mZi5jIChlY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IAotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19pbml0KTogCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiAKLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiAKLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogCi0JKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiAKLQkqIGVsZmNvZGUuaCAoYmZkX25ld19zdHJ0YWIpOiAKLQkoYmZkX2FkZF8yX3RvX3N0cnRhYik6IAotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogCi0JKGVsZl9jb3JlZmlsZV9ub3RlKTogCi0JKiBsaWJiZmQuYyAoYmZkX3ptYWxsb2MpOiAKLQlVc2UgbWFsbG9jIGFuZCBjaGVjayB0aGUgcmVzdWx0LCBpbnN0ZWFkIG9mIGJmZF94bWFsbG9jLgotCi1TYXQgRmViICA1IDEyOjM5OjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBQdXQgbTY4Ki0qLXN5c3YqIGxpbmUgYWZ0ZXIgbTY4Ki0qLXN5c3Y0Ki4KLQotU2F0IEZlYiAgNSAwNTozMjo0NCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9yZWNvcmQpOiAgUHV0IENPTlNUIGtleXdvcmQgZm9yICJzcmMiIGJlZm9yZQotCSJ1bnNpZ25lZCIsIHNvbWUgY29tcGlsZXJzIGRvbid0IGxpa2UgaXQgYWZ0ZXIgInVuc2lnbmVkIi4KLQkqIGxpYmNvZmYuaCwgbGliY29mZi1pbi5oIChiZmRfcGVyZm9ybV9zbGlwKTogIFJlbmFtZSAidmFsdWUiIHRvCi0JInZhbCIgaW4gcHJvdG90eXBlIGRlY2xhcmF0aW9uIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZQotCWFyZ3VtZW50cyB3aG9zZSBuYW1lcyBhcmUgdGhlIHNhbWUgYXMgdHlwZXMuCi0KLVNhdCBGZWIgIDUgMDE6MTQ6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IENvcnJlY3QgdGVzdCBmb3Igd2hldGhlcgotCW9iamVjdCBmaWxlIGRlZmluZXMgc3ltYm9sLiAgQWxzbywgaWYgc2tpcHBpbmcgYSBzeW1ib2wsIHNraXAgdGhlCi0Jc2Vjb25kIHN5bWJvbCBvZiBhIE5fV0FSTklORyBvciBOX0lORFIgc3ltYm9sIGFzIHdlbGwuCi0KLUZyaSBGZWIgIDQgMjM6NTU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIGJhc2ljIHN1cHBvcnQgZm9yIHdyaXRpbmcgUlMvNjAwMCBYQ09GRiBmaWxlcy4KLQkqIGNvZmYtcnM2MDAwLmMgKGR1bW15X3JlbG9jKTogUmVtb3ZlZC4KLQkocnM2MDAwY29mZl9ob3d0b190YWJsZSk6IERlZmluZWQgWENPRkYgcmVsb2NzLgotCShSVFlQRTJIT1dUTyk6IERlZmluZWQgdG8gdXNlIHJzNjAwMGNvZmZfcnR5cGUyaG93dG8uCi0JKHJzNjAwMGNvZmZfcnR5cGUyaG93dG8pOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lZCB0byB1c2UKLQlyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwLiAKLQkocnM2MDAwY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoU0VMRUNUX1JFTE9DKTogRGVmaW5lZCB0byBzZXQgcl90eXBlIGFuZCByX3NpemUgZmllbGRzLgotCShDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lZC4KLQkqIGNvZmZjb2RlLmggKGNvbWJpbmVkX2VudHJ5X3R5cGUpOiBDaGFuZ2VkIGZpeF90YWcgYW5kIGZpeF9lbmQKLQlmaWVsZHMgdG8gYml0ZmllbGRzLiAgQWRkZWQgZmllbGRzIGZpeF92YWx1ZSBhbmQgZml4X3Njbmxlbi4KLQkoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBTVFlQX0RFQlVHIGlzIGRlZmluZWQsIHVzZSBpdCByYXRoZXIgdGhhbgotCVNUWVBfSU5GTyBmb3IgdGhlIHR5cGUgb2YgYSBzZWN0aW9uIG5hbWVkIC5kZWJ1Zy4KLQkoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogRG9uJ3QgZGVmaW5lIGlmIFJTNjAwMENPRkZfQy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBSUzYwMDBDT0ZGX0MsIGRvbid0IGNhbGwKLQljb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgUlM2MDAwQ09GRl9DLCB0aGVuIGlmIHRoZSBsYXN0IGF1eAotCWVudHJ5IGhhcyB0eXBlIFNUWV9MRCBjaGFuZ2UgdGhlIHhfc2NubGVuIGludG8gYSBwb2ludGVyIHRvIGEKLQlzeW1ib2wgYW5kIHNldCBmaXhfc2NubGVuLiAgQWxzbywgZm9yIGEgQ19CU1RBVCBzeW1ib2wsIGNoYW5nZSB0aGUKLQl2YWx1ZSBpbnRvIGEgcG9pbnRlciB0byBhIHN5bWJvbCBhbmQgc2V0IGZpeF92YWx1ZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZnZW4uYyAoY29mZl9tYW5nbGVfc3ltYm9scyk6IFJlaW5kZW50LiAgSWYgZml4X3ZhbHVlIGlzIHNldCwKLQlnZXQgdGhlIHN5bWJvbCBvZmZzZXQuIExpa2V3aXNlIGZvciBmaXhfc2NubGVuLgotCShzdHJpbmdfc2l6ZSk6IENoYW5nZSB0eXBlIHRvIGJmZF9zaXplX3R5cGUuCi0JKGRlYnVnX3N0cmluZ19zaXplLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbik6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IElmIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgcmV0dXJucyB0cnVlLAotCXdyaXRlIHRoZSBzeW1ib2wgbmFtZSBpbnRvIHRoZSAuZGVidWcgc2VjdGlvbjsgYXNzdW1lIHRoYXQgdGhlCi0Jc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgcmlnaHQgc2l6ZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogSW5pdGlhbGl6ZSBkZWJ1Z19zdHJpbmdfc2l6ZSB0byAwLiAgSWYKLQliZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIHJldHVybnMgdHJ1ZSwgZG9uJ3QgcHV0IHN5bWJvbCBuYW1lIGluCi0JdXN1YWwgc3RyaW5nIHRhYmxlLiAgQWZ0ZXIgd3JpdGluZyBvdXQgYWxsIHN5bWJvbHMsIGlmCi0JZGVidWdfc3RyaW5nX3NpemUgaXMgbm90IDAsIGNoZWNrIHRoYXQgaXQgbWF0Y2hlcyB0aGUgc2l6ZSBvZiB0aGUKLQkuZGVidWcgc2VjdGlvbi4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBDbGVhciBuZXcgZml4X3ZhbHVlIGFuZCBmaXhfc2NubGVuCi0JZmllbGRzLiAgSWYgdGhlIHN0cmluZyBvZmZzZXQgaXMgMCwgYWx3YXlzIHVzZSBhbiBlbXB0eSBzdHJpbmcgYXMKLQl0aGUgbmFtZS4KLQkoY29mZl9tYWtlX2VtcHR5X3N5bWJvbCk6IFplcm8gb3V0IHRoZSBzeW1ib2wgc3RydWN0dXJlLgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IFdvcmsgYXJvdW5kIG9uZSBncm9zcyBoYWNrCi0Jd2l0aCBhbm90aGVyOiBhY3R1YWxseSBsb29rIGF0IHRoZSB0YXJnZXQgbmFtZSB0byBhdm9pZCB0aGUgYnJva2VuCi0JQ09GRiBjaGVjay4KLQkoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkIEJGRF9SRUxPQ19QUENfQjI2LAotCUJGRF9SRUxPQ19QUENfQkEyNiBhbmQgQkZEX1JFTE9DX1BQQ19UT0MxNi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIEZlYiAgNCAxNzoyODozMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IENhbGwgYmZkX3htYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MuCi0JKGJmZF94bWFsbG9jLCBiZmRfeG1hbGxvY19ieV9zaXplX3QpOiBGdW5jdGlvbnMgZGVsZXRlZC4KLQkqIGxpYmJmZC1pbi5oOiBEZWZpbmUgdGhlbSBhcyBtYWNyb3MgY2FsbGluZyB4bWFsbG9jIGFuZCBkZWNsYXJlCi0JeG1hbGxvYy4gCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVGh1IEZlYiAgMyAxNjo0OTozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzKTogSWYgYSBzbWFsbCB1bmRlZmluZWQKLQlzeW1ib2wgaGFzIGEgdmFsdWUgaW4gdGhlIEVDT0ZGIHN5bWJvbCBidXQgbm90IGluIHRoZSBCRkQgc3ltYm9sLAotCWtlZXAgdGhlIHZhbHVlIGluIHRoZSBFQ09GRiBzeW1ib2wuICBUaGlzIGhlbHBzIGdhcy4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzLAotCV9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEb24ndCByZXF1aXJlIHRoYXQgYWxsCi0JcmVmZXJlbmNlcyB0byBhIGNvbW1vbiBzeW1ib2wgYmUgdGhlbXNlbHZlcyBjb21tb24gc3ltYm9scy4KLQotCSogYW91dHguaCAoYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uKTogSGFuZGxlIE5fVU5ERi4KLQotV2VkIEZlYiAgMiAyMDozNzoxOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMsIGJmZC1pbi5oLCBob3N0cy9hbHBoYW9zZi5oLCBob3N0cy9zcGFyYy1sbC5oLCBhb3V0ZjEuaCwKLQlzcGFyY2x5bnguYywgTWFrZWZpbGUuaW46IENoYW5nZSBIT1NUXzY0X0JJVCB0byBCRkRfSE9TVF82NF9CSVQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVdlZCBGZWIgIDIgMTI6MzA6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUgdHlwZQotCWFuZCBzaXplIGNvcnJlY3RseS4KLQkoY29mZl9zd2FwX2F1eF9pbik6IElmIFJTNjAwMENPRkZfQywgY2hhbmdlIHhfY3NlY3QueF9zY25sZW4gdG8KLQl4X2NzZWN0Lnhfc2NubGVuLmwgdG8gbWF0Y2ggY2hhbmdlIGluIGNvZmYvaW50ZXJuYWwuaC4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKSwgY29mZi1hbHBoYS5jCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IENoYW5nZSBjYXN0cyBvZiBhdXhfaW4gYW5kIGF1eF9vdXQKLQlmaWVsZHMgdG8gbWF0Y2ggeWVzdGVyZGF5J3MgY2hhbmdlcy4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiBJZiBTRUxFQ1RfUkVMT0MgaXMgZGVmaW5lZCwgcGFzcwotCWluIHRoZSBpbnRlcm5hbF9yZWxvYyBpdHNlbGYsIG5vdCB0aGUgdHlwZS4KLQkqIGNvZmYtYXBvbGxvLmMsIGNvZmYtaDgzMDAuYywgY29mZi1oODUwMC5jLCBjb2ZmLWkzODYuYywKLQljb2ZmLW02OGsuYywgY29mZi1zaC5jLCBjb2ZmLXdlMzJrLmMsIGNvZmYtejhrLmM6IENoYW5nZWQKLQlkZWZpbml0aW9uIG9mIFNFTEVDVF9SRUxPQyBhY2NvcmRpbmdseS4KLQotVHVlIEZlYiAgMSAxMjowNTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIG5ldyBhcmd1bWVudHMgdG8KLQlfYmZkX2NvZmZfc3dhcF9hdXhfaW4gYW5kIF9iZmRfY29mZl9zd2FwX2F1eF9vdXQ6IGF1eCBpbmRleCBudW1iZXIKLQlhbmQgbnVtYmVyIG9mIGF1eCBlbnRyaWVzLgotCShiZmRfY29mZl9zd2FwX2F1eF9pbiwgYmZkX2NvZmZfc3dhcF9hdXhfb3V0KTogQ2hhbmdlZAotCWFjY29yZGluZ2x5LgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbiwgY29mZl9zd2FwX2F1eF9vdXQpOiBBY2NlcHQgbmV3Ci0JYXJndW1lbnRzLiAgSWYgUlM2MDAwQ09GRl9DLCBvbmx5IHRyZWF0IENfRVhUIGFuZCBDX0hJREVYVAotCXNwZWNpYWxseSBpZiB0aGlzIGlzIHRoZSBsYXN0IGF1eCBlbnRyeS4KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9zeW1ib2wsIGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogUGFzcwotCW5ldyBhcmd1bWVudHMgdG8gc3dhcF9hdXggZnVuY3Rpb25zLgotCi1TdW4gSmFuIDMwIDE1OjE0OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdlbi1hb3V0LmMgKG1haW4pOiBTZXQgREVGQVVMVF9BUkNIIGJhc2VkIG9uIHByZXByb2Nlc3NvciBtYWNyb3MKLQkob25seSB0ZXN0aW5nIGZvciBtNjhrIGFuZCB2YXggYXQgdGhlIG1vbWVudCk7IGRvIHZlcmlmeSB0aGF0IHRoZQotCXByZXByb2Nlc3NvciBkaWRuJ3QgdHJhc2ggdGhlIGFyY2ggbmFtZSBpbnNpZGUgdGhlIHN0cmluZyB2ZXJzaW9uLgotCURvbid0IHByaW50IG91dCAicGFnZXNpemUgPSIgbGluZSB0aGF0IHByZXZlbnRzIG91dHB1dCBmcm9tCi0JY29tcGlsaW5nLiAgRGVyaXZlIEJZVEVTX0lOX1dPUkQgYW5kIEFSQ0ggdmFsdWVzIGZyb20gc2l6ZW9mCi0JcmVzdWx0cy4KLQkqIE1ha2VmaWxlLmluIChhb3V0LXBhcmFtcy5oKTogUGFzcyBnZW4tYW91dCBhIGR1bW15IHRhcmdldCBuYW1lLgotCShjaGVjaywgaW5zdGFsbGNoZWNrKTogSWRlbnRpZnkgZGlyZWN0b3J5IGluICJubyB0ZXN0c3VpdGVzIgotCW1lc3NhZ2UuCi0KLVN1biBKYW4gMzAgMTM6MjU6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFdyaXRlIG91dCBjb3JyZWN0IHZhbHVlIGZvcgotCW9iamVjdCBmaWxlIHN5bWJvbC4KLQotRnJpIEphbiAyOCAxODozNDowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBob3N0cy92YXhic2QuaCAoSE9TVF9TVEFDS19FTkRfQUREUik6IFZheCBCU0QgZG9lc24ndCBkZWZpbmUKLQlLRVJOQkFTRSwgc28gaGFyZC1jb2RlIDB4ODAwMDAwMDAgaW5zdGVhZC4KLQotVGh1IEphbiAyNyAxMzo1NDowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogSWYgc3ltYm9sIGlzIGNvbW1vbiwKLQlzZXQgdGhlIEJTRl9PTERfQ09NTU9OIGZsYWcuCi0KLVdlZCBKYW4gMjYgMTM6NDc6MTUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogUHV0IHRoZSBuZXcgZW50cnkgaW4gdGhlCi0JY29ycmVjdCBlbGVtZW50IG9mIG1hdGNoaW5nX3ZlY3Rvci4KLQotVHVlIEphbiAyNSAxMTo0MzoyOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc29tLmMsIHNvbS5oIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMsCi0JYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzKTogQ2hhbmdlIHBhcmFtZXRlcnMgZnJvbSBjaGFyCi0JdG8gaW50LiAgRm9sbG93aW5nIGEgcHJvdG90eXBlIHdpdGggYW4gb2xkLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb24KLQlpbiB0aGUgcHJlc2VuY2Ugb2Ygd2lkZW5lZCBwYXJhbWV0ZXJzIGlzIGEgR0NDLWlzbSBub3Qgc3VwcG9ydGVkCi0JYnkgdGhlIEhQIGNvbXBpbGVyIGluIEFOU0kgbW9kZS4KLQotVHVlIEphbiAyNSAxMTo0Njo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IFNpemUgb2YgdHlwZSAtMiBpcyA0IGJ5dGVzLCBub3QgMi4KLQotCSogaHAzMDBocHV4LmMgKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBXcml0ZSBvdXQgdGhlIHN5bWJvbHMKLQliZWZvcmUgd3JpdGluZyBvdXQgdGhlIHJlbG9jcywgc28gdGhhdCB0aGUgcmlnaHQgc3ltYm9sIGluZGljZXMKLQlhcmUgdXNlZC4KLQotCSogYXJjaGl2ZS5jIChkb19zbHVycF9ic2RfYXJtYXAsIGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBEbyBub3QKLQl0cnkgdG8gb3ZlcmxheSB0aGUgaW50ZXJuYWwgY2Fyc3ltcyBvbiB0aGUgZXh0ZXJuYWwgc3ltZGVmcy4gIFRoYXQKLQljYW4gbm90IHdvcmsgaWYgdGhlIHNpemUgb2YgYSBob3N0IHBvaW50ZXIgaXMgbGFyZ2VyIHRoYW4gNCBieXRlcy4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IENhc3QgcmVzdWx0IG9mCi0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LgotCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCk6IEF2b2lkIEFOU0kgQyBwcm90b3R5cGUuCi0KLQkqIGFyY2hpdmUuYzogUmVpbmRlbnRlZCB0byBHTlUgc3RhbmRhcmRzLgotCi1Nb24gSmFuIDI0IDE0OjQxOjIzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCwgX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbik6IEFkZAotCSJfYmZkXyIgdG8gZnVuY3Rpb24gbmFtZXMuCi0JKiBhcmNoaXZlLmMgKF9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCksCi0JbGliYmZkLWluLmg6IENoYW5nZSBjYWxsZXJzLgotCi0JKiBsaWJiZmQuYyAoYmZkX3ptYWxsb2MpOiBSZW5hbWVkIGZyb20gemFsbG9jLgotCSogbGliYmZkLmMgKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKSwKLQl0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKSwKLQl0YXJnZXRzLmMgKGJmZF90YXJnZXRfbGlzdCksCi0JcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfY29yZV9maWxlX3ApLAotCW9wbmNscy5jIChuZXdfYmZkKSwgbGliYmZkLWluLmgsCi0JaWVlZS5jIChpZWVlX21ha2VfZW1wdHlfc3ltYm9sKSwKLQllbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfYnJhbmNoX3JlbG9jKSwKLQkoaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IENoYW5nZSBjYWxsZXJzLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlKTogQWRkICJfYmZkXyIgdG8gbmFtZS4KLQkoX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MpLCAKLQljb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyksIGxpYmJmZC1pbi5oOgotCUNoYW5nZSBjYWxsZXJzLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKSwgbGliYmZkLWluLmgsIHRhcmdldHMuYywKLQllbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJlbmFtZSB0YXJnZXRfdmVjdG9yIHRvIGJmZF90YXJnZXRfdmVjdG9yCi0JYW5kIGRlZmF1bHRfdmVjdG9yIHRvIGJmZF9kZWZhdWx0X3ZlY3Rvci4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2NoZWNrX2Zvcm1hdCk6IENhbGwgaXQuCi0JKGJmZF9tYXRjaGluZ19mb3JtYXRzKTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkqIHRhcmdldHMuYzogUmVwbGFjZSB0aGUgdmVjdG9yIGFkZGVkIG9uIEphbiAyMSB3aXRoIGEgY291bnQgb2YKLQllbnRyaWVzIGluIGRlZmF1bHRfdmVjdG9yLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotTW9uIEphbiAyNCAxMjozODo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfb2JqZWN0X3ApOiBOZXcgZnVuY3Rpb24uICBTZXQgc2l6ZSBvZgotCS5wZGF0YSBzZWN0aW9uIGJhc2VkIG9uIGxubm9wdHIgZmllbGQsIG5vdCBzZWN0aW9uIGhlYWRlci4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGJvdGhlciB0byBjaGVjayBpZiByX3N5bW5keCA+PSAwLAotCXNpbmNlIGl0IGlzIHVuc2lnbmVkLgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBVc2UgYWxwaGFfZWNvZmZfb2JqZWN0X3AgcmF0aGVyIHRoYW4KLQljb2ZmX29iamVjdF9wLgotCSogZWNvZmYuYyAoZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCBhbGlnbm1lbnRfcG93ZXIgZmllbGQgb2YKLQkucGRhdGEgc2VjdGlvbiB0byAzLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTYXZlIHRoZSBzaXplIG9mIHRoZQotCS5wZGF0YSBzZWN0aW9uIGluIHRoZSBsaW5lX2ZpbGVwb3MgZmllbGQsIGFuZCBhY3R1YWxseSBhbGlnbiB0aGUKLQkucGRhdGEgc2VjdGlvbiB0byBhbiBhbGlnbm1lbnQgcG93ZXIgb2YgNC4KLQkoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IFNldCBvdXRwdXRfaGFzX2JlZ3VuIGFmdGVyCi0JY2FsbGluZyBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBzX2xubm9wdHIgZm9yIHRoZSAucGRhdGEKLQlzZWN0aW9uIGZyb20gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZC4gIFNldCB2c3RhbXAgZm9yIHRoZSBvcHRpb25hbAotCWhlYWRlciBmcm9tIHRoZSB2c3RhbXAgb2YgdGhlIHN5bWJvbGljIGhlYWRlci4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBTZXQgdnN0YW1wIG9mIHRoZSBzeW1ib2xpYyBoZWFkZXIgdG8gdGhlCi0JdnN0YW1wIHVzZWQgYnkgdGhlIGZpcnN0IG9iamVjdCBmaWxlIGluIHRoZSBsaW5rLgotCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfYWxpZ25fZGVidWcpOiBBbGlnbiBSRkRzIHRvIGRlYnVnX2FsaWduLgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FjaGl2ZV9lbGVtZW50KTogU2V0IFNFQ19BTExPQyBmbGFnCi0JZm9yIGEgY3JlYXRlZCBjb21tb24gc2VjdGlvbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogVXNlIGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gdG8KLQlnZXQgdGhlIGluZGV4IG9mIGEgY29tbW9uIHNlY3Rpb24sIHJhdGhlciB0aGFuIGFsd2F5cyB1c2luZwotCVNITl9DT01NT04gKE1JUFMgaGFzIG11bHRpcGxlIGNvbW1vbiBzZWN0aW9ucykuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBUeXBvICg9PSBmb3IgPSkuCi0KLQkqIGJmZC9hb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQsCi0JYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogUGFzcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0bwotCXJlbG9jX292ZXJmbG93IGNhbGxiYWNrLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsCi0JYWxwaGFfcmVsb2NhdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQkqIGNvZmYtaDg1MDAuYyAoZXh0cmFfY2FzZSk6IExpa2V3aXNlLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi16OGsuYyAoZXh0cmFfY2FzZSk6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2ZpbmlzaCk6IExpa2V3aXNlLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLQkqIGJvdXQuYyAoY2FsbGp4X2NhbGxiYWNrLCBjYWxsal9jYWxsYmFjayk6IFVzZSBnZXRfdmFsdWUgdG8gZ2V0Ci0JdGhlIHN5bWJvbCB2YWx1ZSBhbmQgY2hlY2sgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLgotCShnZXRfdmFsdWUpOiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgbG9vayBpdCB1cCBpbiB0aGUgbGlua2VyCi0JaGFzaCB0YWJsZS4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRm9yIFBDUkVMMjQgYW5kIFBDUkVMMTMKLQl1c2UgZ2V0X3ZhbHVlIHRvIGdldCB0aGUgc3ltYm9sIHZhbHVlIGFuZCBjaGVjayBmb3IgdW5kZWZpbmVkCi0Jc3ltYm9scy4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBJZiB0aGUgc3ltYm9sIGlzCi0JdW5kZWZpbmVkLCBsb29rIGl0IHVwIGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3N5bWJvbF90YWJsZSk6IFRoZSBzdHJpbmcgaW5kZXggMCBoYXMgYQotCXNwZWNpYWwgbWVhbmluZyBmb3Igbm9ybWFsIHN5bWJvbHMsIGJ1dCBub3QgZm9yIGR5bmFtaWMgc3ltYm9scy4KLQotU2F0IEphbiAyMiAxMjoyNjowMSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyY2x5bnguYzogIFNldHVwIGFwcHJvcHJpYXRlIG1hY3JvcyB0byBlbmFibGUgY29yZSBmaWxlCi0Jc3VwcG9ydC4KLQotRnJpIEphbiAyMSAxNjoyNTozNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYzogQWRkIGEgdmVjdG9yIG9mIG1hdGNoaW5nIGZvcm1hdCBuYW1lcy4KLQkqIGZvcm1hdC5jIChiZmRfbWF0Y2hpbmdfZm9ybWF0cyk6IE5ldyBmdW5jdGlvbiB0byByZXR1cm4gaXQuCi0JKGJmZF9jaGVja19mb3JtYXQpOiBTZXQgaXQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBiZmQtaW4uaDogUmVtb3ZlIGRlY2xzIG9mIGJmZF9lYyB0eXBlIGFuZCBlcnJvciBwcmludGluZyBmdW5jdGlvbnMuCi0JUmVtb3ZlIGRlY2wgb2YgdHlwZSBzeW1jbGFzczsgd2Fzbid0IHVzZWQuCi0JKiBiZmQuYzogRG9jdW1lbnQgZXJyb3IgaGFuZGxpbmcsIGluY2x1ZGluZyBjb2RlIGZyYWdtZW50cwotCWNvbnRhaW5pbmcgdGhlIGVycm9yIGRlY2xzIHRoYXQgd2VyZSBpbiBiZmQtaW4uaC4KLQlSZW1vdmUgREVGVU5zLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotRnJpIEphbiAyMSAxNDoxMToxNiAxOTk0ICBTZWFuIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCwgbGlibG5tLmgsIG5sbTMyLWFscGhhLmMgbmxtMzItaTM4Ni5jIG5sbTMyLXNwYXJjLmM6Ci0JVGhlIHNwYXJjIChhbmQgcG9zc2libHkgb3RoZXI/KSBOTE0gZm9ybWF0IHJlcXVpcmVzIGEgZGlmZmVyZW50Ci0Jd2F5IHRvIHdyaXRlIGV4cG9ydHMsIHNvIGFkZCBhIHdyaXRlX2V4cG9ydCBmaWVsZCB0byB0aGUgYmFja2VuZAotCWRhdGEgKGFuZCBzZXQgaXQgdG8gTlVMTCBmb3IgZXZlcnl0aGluZyBidXQgdGhlIHNwYXJjKS4KLQotRnJpIEphbiAyMSAxNDoxMToxNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3Vub3MuYyAoTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBDb21wYXJlIGluZm8tPmR5bnJlbCB3aXRoIE5VTEwsCi0Jbm90IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTC4gIGluZm8tPmR5bnJlbCBpcyBhIFBUUiwgbm90Ci0JYSBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKi4KLQotRnJpIEphbiAyMSAwOToyOTowMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiBSZW1vdmUgZXJyb3Igc3RyaW5ncyBmb3IgZXJyb3JzIHJlbW92ZWQgYmVsb3cuCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyksIGJmZC1pbi5oIChiZmRfZWMpLAotCW9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogUmVuYW1lCi0JYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiB0byBub25yZXByZXNlbnRhYmxlX3NlY3Rpb24uCi0JTm9uZSBvZiB0aGUgb3RoZXIgYmZkIGVycm9yIG5hbWVzIHN0YXJ0IHdpdGggImJmZF9lcnJvciIuCi0JUmVtb3ZlIGVycm9ycyBzeW1ib2xfbm90X2ZvdW5kIGFuZCBub19yZWxvY2F0aW9uX2luZm8sIHdoaWNoIHNlZW0KLQl0byBiZSB1bnVzZWQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1GcmkgSmFuIDIxIDAxOjExOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfZ3Bfc2l6ZSk6IEFkZGVkIHN1cHBvcnQgZm9yIEVMRi4KLQotCSogc3ltcy5jIChCU0ZfRFlOQU1JQyk6IE5ldyBzeW1ib2wgZmxhZy4KLQkoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IFByaW50IGl0LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBOZXcgcmVhZF9keW5hbWljX3N5bWJvbHMKLQlhbmQgcmVhZF9keW5hbWljX3JlbG9jcyBmaWVsZHMuCi0JKHN0cnVjdCBhb3V0ZGF0YSk6IE5ldyBkeW5hbWljX2luZm8gZmllbGQuCi0JKG9ial9hb3V0X2R5bmFtaWNfaW5mbyk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8pOiBOZXcgc3RydWN0dXJlLgotCShzdW5vc19yZWFkX2R5bmFtaWNfaW5mbywgTVkocmVhZF9keW5hbWljX3N5bWJvbHMpLAotCU1ZKHJlYWRfZHluYW1pY19yZWxvY3MpKTogTmV3IGZ1bmN0aW9ucyB0byByZWFkIGR5bmFtaWMgc3ltYm9scwotCWFuZCByZWxvY3MuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IElmIHRoZSBvYmplY3QgaXMKLQlkeW5hbWljYWxseSBsaW5rZWQsIHNldCBTRUNfUkVMT0MgZm9yIGJvdGggdGhlIC50ZXh0IGFuZCAuZGF0YQotCXNlY3Rpb25zLgotCSh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogRG9uJ3Qgc2V0IEJTRl9MT0NBTCBmb3IgYW4KLQl1bmRlZmluZWQgc3ltYm9sLgotCSh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgb2YKLQlzbHVycF9zeW1ib2xfdGFibGU7IHNldCB0aGUgQlNGX0RZTkFNSUMgZmxhZyBhcHByb3ByaWF0ZWx5LgotCShOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IFJlYWQgZHluYW1pYyBzeW1ib2xzLCBpZiBhbnkuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBSZWFkIGR5bmFtaWMgcmVsb2NzLCBpZiBhbnkuCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogSW5jbHVkZSBkeW5hbWljIHJlbG9jIGNvdW50IGluCi0JcmV0dXJuIHZhbHVlLgotCSogYW91dGYxLmggKE5BTUUoYW91dCxzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERvbid0IHdyaXRlCi0Jb3V0IGR5bmFtaWMgc3ltYm9scyBvciByZWxvY3MgYWdhaW5zdCByZWxvYyBzeW1ib2xzLCBzaW5jZSB0aGV5Ci0JYXJlIGFscmVhZHkgaW4gdGhlIC50ZXh0IHNlY3Rpb24gYW5kIHdlIHdvdWxkbid0IGtub3cgd2hlcmUgdG8KLQl3cml0ZSB0aGVtIGFueWhvdy4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgcmVhZF9keW5hbWljX3N5bWJvbHMgYW5kCi0JcmVhZF9keW5hbWljX3JlbG9jcyBmaWVsZHMuCi0JKiBhb3V0LXRhcmdldC5oIChNWShiYWNrZW5kX2RhdGEpKTogSW5pdGlhbGl6ZQotCXJlYWRfZHluYW1pY19zeW1ib2xzIGFuZCByZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KLQotVGh1IEphbiAyMCAyMDo1NzoyNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBob3N0cy9hbHBoYW9zZi5oICh1aW50NjRlX3R5cGUsIHVpbnQ2NF90eXBlLCBpbnQ2NF90eXBlKTogRGVsZXRlCi0JdHlwZWRlZnMsIHNpbmNlIEhPU1RfNjRfQklUIHdpbGwgdGFrZSBjYXJlIG9mIGRlZmluaW5nIHRoZW0gaW4KLQliZmQuaC4KLQotV2VkIEphbiAxOSAxNzoyODo1OSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvYWxwaGFvc2YubWggKEhERUZJTkVTKTogRG9uJ3QgZGVmaW5lIEhPU1RfNjRfQklUIGhlcmU7Ci0JdGhhdCdzIGRlYWx0IHdpdGggZWxzZXdoZXJlLgotCSogaG9zdHMvYWxwaGFvc2YuaCAoc3ByaW50Zl92bWEsIGZwcmludGZfdm1hKTogTmV3IG1hY3Jvcy4KLQkodWludDY0X3R5cGVISUdILCB1aW50NjRfdHlwZUxPVyk6IENvbW1lbnQgd2l0aCBIT1NUXzY0X0JJVCBzbwotCXRoZXkgZ2V0IGNvcGllZCB0byBiZmQuaC4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkIHNvbWUgQWxwaGEgcmVsb2NhdGlvbgotCXR5cGVzLiAgUmVvcmdhbml6ZWQgc29tZSBvZiB0aGUgZXhpc3Rpbmcgb25lcy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfaG93dG9fdGFibGUpOiBDb25zdHJ1Y3QgNjQtYml0IG5lZ2F0aXZlIG9uZQotCXZhbHVlcyBpbiBjYXNlIG9mIGNvbXBpbGF0aW9uIG9uIGEgMzItYml0IG1hY2hpbmUuICBGaXggcGNyZWwKLQlmaWVsZHMgb2Ygc29tZSByZWxvYyB0eXBlcy4KLQkoYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIG1vcmUgcmVsb2NhdGlvbiB0eXBlcy4KLQotCSogYmZkLWluLmggKHVpbnQ2NF90eXBlSElHSCwgdWludDY0X3R5cGVMT1cpOiBTdXBwbHkgZGVmYXVsdAotCWRlZmluaXRpb25zIHdoZW4gbm90IGRlZmluZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB1aW50NjRfdHlwZSBpcwotCWEgZGVmaW5lZCBtYWNybyBvciBub3QuCi0JKGZwcmludGZfdm1hLCBzcHJpbnRmX3ZtYSk6IERlZmluZSBvbmx5IGlmIGZwcmludGZfdm1hIGlzIG5vdAotCWFscmVhZHkgZGVmaW5lZC4KLQotV2VkIEphbiAxOSAwMDowMjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogU2V0IHRoZSB0eXBlIG9mIGEKLQlCU0ZfV0FSTklORyBzeW1ib2wgdG8gTl9XQVJOSU5HLgotCi1UdWUgSmFuIDE4IDE2OjQzOjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogSW5jcmVtZW50IHN5bV9oYXNoIGFzIHdlbGwgYXMgcAotCWZvciBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVcGRhdGUgc3ltX2hhc2ggd2l0aCB0aGUgdGFyZ2V0IG9mIGFuCi0JaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuICBJZiBhbiBpbmRpcmVjdCBzeW1ib2wgaXMgZGVmaW5lZCwKLQlvdXRwdXQgdGhlIGNhbGN1bGF0ZWQgdmFsdWUgYW5kIGRvbid0IG91dHB1dCB0aGUgdGFyZ2V0IHN5bWJvbC4KLQotVHVlIEphbiAxOCAwMzo1NDo1OSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBHaXZlIHdhcm5pbmcgc3ltYm9scwotCWFuICh1bnVzZWQpIG5vbnplcm8gc2VjdGlvbiB2YWx1ZSwgbmVlZGVkIGZvciBjaGVjayBiZWxvdy4KLQotTW9uIEphbiAxNyAxNToxMjowNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MsCi0JYW91dF9saW5rX2FkZF9zeW1ib2xzKTogVHJlYXQgTl9TRVRbQUJEVF0gfCBOX0VYVCBsaWtlCi0JTl9TRVRbQUJEVF0uCi0KLUZyaSBKYW4gMTQgMTY6NDU6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IElmIHRoZXJlIGlzIGEgU0hUX0RZTkFNSUMgc2VjdGlvbiwgc2V0Ci0JdGhlIERZTkFNSUMgZmxhZyBmb3IgdGhlIEJGRC4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBEb24ndCB0cnkgdG8gd3JpdGUgb3V0IGEKLQlCRkQgd2l0aCB0aGUgRFlOQU1JQyBmbGFnIHNldCwgc2luY2Ugd2UgZG9uJ3QgZ2VuZXJhdGUgdGhlIHByb2dyYW0KLQloZWFkZXIgdGFibGUgY29ycmVjdGx5LgotCi1GcmkgSmFuIDE0IDAxOjA0OjM2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEZyZWUgeF9zeW1wIGF0IHRoZSBlbmQKLQlvZiB0aGUgZnVuY3Rpb24gdG8gYXZvaWQgc3RvcmFnZSBsZWFrLgotCi1UaHUgSmFuIDEzIDIzOjA3OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IEFuIGlmZCBjYW4gYmUgLTEuCi0KLVRodSBKYW4gMTMgMTI6MzM6MjcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2V0X3JlbG9jX2luZm8pOiBQcm92aWRlIGEgZGVmYXVsdCBzeW1ib2wgZm9yCi0JcmVsb2NhdGlvbnMgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbiBhc3NvY2lhdGVkIHN5bWJvbC4KLQotCSogc29tLmMgKGhwcGFfc29tX3JlbG9jKTogQWRkIG5ldyAiZXJyb3IgbWVzc2FnZSIgYXJndW1lbnQuCi0KLVdlZCBKYW4gMTIgMTM6MzY6NDMgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JRW5hYmxlIGdkYiB0byB3cml0ZSB0byBjb3JlIGZpbGVzIG9uIG1vcmUgY29yZSBmaWxlIHJlYWRlcnMuCi0JKiBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiAgUmVtb3ZlIHJhbmdlIGNoZWNrCi0JZm9yIHNlY3Rpb24gc2l6ZSwgaXQgaXMgYWxyZWFkeSBkb25lIGluIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotCXdpdGggYmZkX2dldF9zZWN0aW9uX3NpemVfbm93LgotCSogYWl4Mzg2LWNvcmUuYywgaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jLCBpcml4LWNvcmUuYywKLQlvc2YtY29yZS5jLCBwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYyAoKl9zZXRfc2VjdGlvbl9jb250ZW50cyk6Ci0JVXNlIGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIGluc3RlYWQgb2YgYmZkX2ZhbHNlLgotCi1XZWQgSmFuIDEyIDE1OjMxOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmM6IEFkZGVkIGluaXRpYWwgZG9jdW1lbnRhdGlvbi4KLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IERvbid0IGV4cGVjdCBzcGFjZSBmb3IKLQlvdXRwdXQgcmVsb2NhdGlvbnMgaWYgdGhlcmUgYXJlbid0IGFueSBpbnB1dCByZWxvY2F0aW9ucy4KLQotVHVlIEphbiAxMSAxNDozNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IFNldCBhX2VudHJ5IGJlZm9yZSBjb21wdXRpbmcKLQlmaWxlIG9mZnNldHMuCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IEEgY29tbW9uIHN5bWJvbCBpcyBTVFRfT0JKRUNULCBub3QKLQlTVFRfTk9UWVBFLgotCi1UdWUgSmFuIDExIDA5OjEwOjU2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgRUxGLCBub3QgQ09GRiBmb3IgbTg4Ki0qLWRndXgqLgotCUNvbWJpbmUgbTg4ay0qLSogYW5kIG04ODExMC0qLSogY2FzZXMgaW50byBtODgqLSotKi4KLQotVHVlIEphbiAxMSAwMDowNzoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmbGluay5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byBjb21wcmVzcyBhbmQgbWVyZ2UgZGVidWdnaW5nCi0JaW5mb3JtYXRpb24sIGFuZCB0byB3cml0ZSBzb21lIG9mIG91dCBkaXJlY3RseSByYXRoZXIgdGhhbiBzYXZpbmcKLQlpdCBpbiBtZW1vcnkuICBTZXZlcmFsIG5ldyBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMsIGFuZCBuZXcKLQlhcmd1bWVudHMgdG8gZXhpc3RpbmcgZnVuY3Rpb25zLgotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IENvbXB1dGUKLQlzeW1fZmlsZXBvcyBhcyB3ZWxsLgotCShlY29mZl9nZXRfZXh0cik6IFVzZSBpZmRtYXAgaW5zdGVhZCBvZiBpZmRiYXNlLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjb21wdXRlIHN5bV9maWxlcG9zIGhlcmUuCi0JT25seSBvdXRwdXQgc3ltYm9scyBpZiBvdXRzeW1ib2xzIGlzIG5vdCBOVUxMLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IEFkanVzdCBmb3IgY2hhbmdlcyBpbiBlY29mZl9kZWJ1Z19pbmZvIGFuZAotCWJmZF9lY29mZl9kZWJ1ZyBmdW5jdGlvbnMuICBXcml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGhlcmUuCi0JKGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSk6IEFkanVzdCBmb3IgY2hhbmdlcyBpbgotCWJmZF9lY29mZl9kZWJ1ZyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBVc2UgaWZkbWFwIHJhdGhlciB0aGFuIGlmZGJhc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFJlYWQgZXh0ZXJuYWwgc3ltYm9scwotCWZpcnN0LCB0byBwdXQgdGhlbSBpbiB0aGUgZmlyc3QgbWVtb3J5IGJ1ZmZlci4gIENsZWFyIGZkciBmaWVsZC4KLQkobWlwc19lbGZfZ2V0X2V4dHIpOiBVc2UgcG9pbnRlciB0byB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9sLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluIGJmZF9lY29mZiBmdW5jdGlvbnMuCi0JUHJlc2VydmUgLnRleHQsIC5kYXRhIGFuZCAuYnNzIGV2ZW4gaWYgdGhleSBhcmUgZW1wdHkuICBTYXZlCi0JcG9pbnRlciB0byB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9sIHJhdGhlciB0aGFuIGNvcHlpbmcgaXQuCi0JRG9uJ3QgZnJlZSB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4KLQkqIGxpYmVsZi5oIChlbGZfc3ltYm9sX3R5cGUpOiBDaGFuZ2UgbWlwc19leHRyIHRvIFBUUi4KLQkqIGJmZC1pbi5oIChiZmRfZWNvZmZfZGVidWdfaW5pdCwgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUpOiBEZWNsYXJlLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBSZW5hbWUgZGVjbGFyYXRpb24gZnJvbQotCWJmZF9lY29mZl9kZWJ1Z19saW5rX290aGVyIGFuZCB1cGRhdGUuCi0JKGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1Zyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBKYW4gMTAgMjA6NDY6NTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVtb3ZlICJAIiB3aGljaCBmb2xsb3dzIGEgYmFja3NsYXNoLiAgSW4KLQl0aGlzIHBvc2l0aW9uIGl0IGp1c3QgY2F1c2VzIGVycm9ycywgbm90IHN1cHByZXNzZXMgZWNob2VzLgotCi1Nb24gSmFuIDEwIDA5OjA2OjIxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBGaXggaGFuZGxpbmcgb2YgTFQgYW5kIFJUCi0JZmllbGQgc2VsZWN0b3JzLgotCi1TdW4gSmFuICA5IDA0OjMyOjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaTM4Ni1uZXRic2QubXQgKFNFTEVDVF9WRUNTKTogSW5jbHVkZSBpMzg2YnNkX3ZlYy4KLQotRnJpIEphbiAgNyAxMDoyNzoyNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFkanVzdF96X21hZ2ljKTogRG9uJ3QgbWVyZ2UgdGhlIHN0YXJ0IG9mIGJzcyB3aXRoIHRoZQotCWVuZCBvZiBkYXRhIGlmIHRoZXkgYXJlIG5vdCBjb250aWd1b3VzLgotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2FvdXRfYmFja2VuZCk6IENvbW1lbnQgdGhlIGZpZWxkcycgbWVhbmluZ3MuCi0KLUZyaSBKYW4gIDcgMTU6NDA6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdF9ob29rKTogRG9uJ3Qgc2V0IFNFQ19TSEFSRURfTElCUkFSWSBmbGFnCi0JZm9yIC5yZWdpbmZvIHNlY3Rpb24gaGVyZS4KLQkoZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCBpdCBoZXJlIGluc3RlYWQuCi0KLUZyaSBKYW4gIDcgMTA6Mjk6MjcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0gICAgCSogYmZkLWluLmg6IChiZmRfYm9vbGVhbik6IEFkZCB3b3JrYXJvdW5kIGZvciBzeXN0ZW1zIHRoYXQgYWxzbwotCWRlZmluZSB0cnVlIGFuZCBmYWxzZSBhcyBlbnVtcy4KLQkoQUxNT1NUX1NUREMpOiBBZGQgYXMgYWx0ZXJuYXRpdmUgdG8gX19TVERDX18uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBzeW1zLmMgKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBDb252ZXJ0IGEgUFRSIHRvIEZJTEUqLgotCi1UaHUgSmFuICA2IDE0OjI0OjQ0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBDYXRjaCB0aGUgY2FzZSB3aGVyZQotCXRoZXJlIGlzIG5vIG91dHB1dCBzZWN0aW9uLgotCi1UaHUgSmFuICA2IDE0OjM3OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiBJZiB3ZSBjYW4ndCByZWFkIHRoZSBmaXhlZCBoZWFkZXIsCi0JY291bnQgaXQgYXMgYSB3cm9uZyBmb3JtYXQgZXJyb3IsIG5vdCBhIHN5c3RlbSBjYWxsIGVycm9yLCBzaW5jZQotCXRoZSBvYmplY3QgZmlsZSBtaWdodCBzaW1wbHkgYmUgdG9vIHNtYWxsLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBBZGRlZCBubG0zMl9hbHBoYV92ZWMgaW5zaWRlICNpZmRlZgotCUJGRDY0LgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIG5sbTMyLWFscGhhLm8uCi0JKEJGRDY0X0JBQ0tFTkRTKTogQWRkIG5sbTMyLWFscGhhLm8uICBJdCBkZXBlbmRzIG9uIDY0IGJpdAotCXN1cHBvcnQsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvciBhbiBBbHBoYSBpbiAzMiBiaXQgbW9kZS4KLQkqIGNvbmZpZ3VyZS5pbiAobmxtMzJfYWxwaGFfdmVjKTogU2V0IHRhcmdldDY0IHRvIHRydWUuCi0KLQkqIG5sbTMyLWdlbi5jLCBubG02NC1nZW4uYzogUmVtb3ZlZC4gIEFsbCBubG0gdGFyZ2V0cyBhcmUKLQlkaWZmZXJlbnQsIHNvIHRoZXJlIGlzIG5vIHBvaW50IHRvIHByb3ZpZGluZyBhIGdlbmVyaWMgb25lLgotCSogbGlibmxtLmg6IERvbid0IGJvdGhlciB0byBjaGVjayBmb3IgbmxtX2JhY2tlbmQoYmZkKSBiZWluZyBOVUxMCi0JaW4gdGhlIGJhY2tlbmQgYWNjZXNzb3IgbWFjcm9zOyB0aGF0IHNob3VsZCBubyBsb25nZXIgYmUgcG9zc2libGUuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZW1vdmVkIG5sbTMyX2JpZ19nZW5lcmljX3ZlYywKLQlubG02NF9iaWdfZ2VuZXJpY192ZWMsIG5sbTY0X2xpdHRsZV9nZW5lcmljX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAobmxtMzJfYmlnX2dlbmVyaWNfdmVjLCBubG0zMl9saXR0bGVfZ2VuZXJpY192ZWMsCi0JbmxtNjRfYmlnX2dlbmVyaWNfdmVjLCBubG02NF9saXR0bGVfZ2VuZXJpY192ZWMpOiBSZW1vdmVkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLCBhbmQKLQkoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmVkIG5sbTMyLWdlbi5vLgotCShCRkQ2NF9CQUNLRU5EUyk6IFJlbW92ZWQgbmxtNjQtZ2VuLm8uCi0JKENGSUxFUyk6IFJlbW92ZWQgbmxtMzItZ2VuLmMgYW5kIG5sbTY0LWdlbi5jLgotCi0JKiBocDMwMGhwdXguYyAoQVJDSF9TSVpFKTogRGVmaW5lIGJlZm9yZSBpbmNsdWRpbmcgYW91dHguaC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQWRkIGNvbnN0cnVjdG9yIGFuZAotCWJpdHNpemUgYXJndW1lbnRzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycyAoYW91dHguaCkuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBBZGQgY29uc3RydWN0b3IKLQlhbmQgYml0c2l6ZSBhcmd1bWVudHMgdG8gZGVjbGFyYXRpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogZWNvZmYuYzogRmlyc3QgY3V0IGF0IG5ldyBzdHlsZSBvZiBsaW5rZXIgYmFja2VuZCBmb3IKLQlFQ09GRi0tYWRkZWQgYSBidW5jaCBvZiBmdW5jdGlvbnMuICBBbHNvOgotCShlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IFNldCBmbGFncyBmb3IgLnBkYXRhIGFuZCAueGRhdGEuCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlcik6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IENhbGwgZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyLgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEdldCBvdXQgcXVpY2tseSBpZiBjb3VudCBpcyB6ZXJvLgotCUNoZWNrIGVycm9ycyBiZXR0ZXIuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFB1dCAueGRhdGEgc2VjdGlvbiBpbiBkYXRhIHNlZ21lbnQuCi0JQ2FsbCBlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zLiAgRG9uJ3Qgb3V0cHV0IHJlbG9jcyBvcgotCWV4dGVybmFsIHN5bWJvbHMgaWYgb3V0c3ltYm9scyBpcyBOVUxMLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IENvbXBsZXRlbHkgcmV3cml0dGVuLgotCSogbGliZWNvZmYuaDogSW5jbHVkZSBiZmRsaW5rLmguCi0JKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgcmVsb2NhdGVfc2VjdGlvbiBmaWVsZC4KLQkoZWNvZmZfZGF0YV90eXBlKTogQWRkIHN5bV9oYXNoZXMgYW5kIHN5bW5keF90b19zZWN0aW9uIGZpZWxkcy4KLQkoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlIGFzIGZ1bmN0aW9uLCBub3QgbWFjcm8uCi0JKGVjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyk6IENhbGwgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbC4KLQkqIGJmZC1pbi5oIChiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfaG93dG9fdGFibGUpOiBNYXJrIEJSQUREUiBhcwotCXBhcnRpYWxfaW5wbGFjZSwgYW5kIHNldCB0aGUgc3JjX21hc2sgdG8gMHgxZmZmZmYuCi0JKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFJlbW92ZSB1bnVzZWQKLQl2YXJpYWJsZSBncF93YXJuZWQuCi0JKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfcmVmaGkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgcmVsb2NhdGVfc2VjdGlvbiBmaWVsZC4KLQotCSogcmVsb2MuYyAoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IENvcnJlY3RlZCBzaWduZWQgb3ZlcmZsb3cKLQljaGVja2luZyB3aGVuIHRoZXJlIGlzIGFuIGFkZGVuZC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogRG9uJ3QgYWJvcnQgd2hlbiB0cnlpbmcgdG8gbGluawotCWEgbm9uIGEub3V0IGZpbGUsIGp1c3QgcGFzcyBpdCB0byBfYmZkX2RlZmF1bHRfbGlua19vcmRlci4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogV2hlbiBkb2luZyBhIGZpbmFsIFBDIHJlbGF0aXZlIGxpbmsKLQlhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHN1YnRyYWN0IHRoZSBWTUEgb2YgdGhlIGlucHV0IHNlY3Rpb24uCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogUmVuYW1lZCBmcm9tCi0JX2JmZF9nZW5lcmljX2luZGlyZWN0X2xpbmtfb3JkZXIgYW5kIG1hZGUgc3RhdGljLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IERvbid0IHN3aXRjaCBvbiBsaW5rX29yZGVyIHR5cGUsIGp1c3QKLQljYWxsIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCShfYmZkX2RlZmF1bHRfbGlua19vcmRlcik6IEhhbmRsZSBiZmRfaW5kaXJlY3RfbGlua19vcmRlciB0eXBlLgotCSogZ2VubGluay5oOiBSZW1vdmVkIGRlY2xhcmF0aW9uIG9mCi0JX2JmZF9nZW5lcmljX2luZGlyZWN0X2xpbmtfb3JkZXIuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCBzd2l0Y2ggb24gbGlua19vcmRlcgotCXR5cGUsIGp1c3QgY2FsbCBfYmZkX2RlZmF1bHRfbGlua19vcmRlci4KLQotVHVlIEphbiAgNCAyMToyMzozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogQmFzZSB0aGUgbmFtZSBvZgotCXRoZSBjcmVhdGVkIGNvbW1vbiBzZWN0aW9uIG9uIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIHRoZSBzeW1ib2wKLQljYW1lIGZyb20uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogKGNhc2UgQklHKTogQSBjb21tb24gc3ltYm9sCi0JbXVzdCBoYXZlIGEgc2VjdGlvbiwgc28gZG9uJ3QgYm90aGVyIHRvIGNyZWF0ZSBvbmUuCi0KLU1vbiBKYW4gIDMgMTU6MzI6MTYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChNWSh2ZWMpKTogQWRkIERZTkFNSUMgdG8gbWFzayBvZiBvYmplY3QgZmxhZ3MuCi0JKiBhb3V0ZjEuaCAoTkFNRShhb3V0LHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpKToKLQlJZiB0aGUgRFlOQU1JQyBmbGFnIGlzIHNldCwgc2V0IGl0IGluIHRoZSBleGVjIGhlYWRlci4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSWYgdGhlIG9iamVjdCBpcwotCWR5bmFtaWNhbGx5IGxpbmtlZCwgc2V0IHRoZSBEWU5BTUlDIGZsYWcgaW4gdGhlIEJGRC4KLQkqIGxpYmFvdXQuaCAoTl9TRVRfRFlOQU1JQyk6IE5ldyBtYWNyby4KLQkoTl9EWU5BTUlDKTogQWRkIG1pc3NpbmcgMCBpbiBtYXNrLgotCi1Nb24gSmFuICAzIDExOjQxOjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZ2V0X2V4dHIpOiBEb24ndCBvdXRwdXQgc2VjdGlvbiBzeW1ib2xzIGFzCi0JZXh0ZXJuYWwgc3ltYm9scy4KLQotCSogYmZkLWluLmgsIGhhc2guYzogQ2hhbmdlIGJmZF9oYXNoX2FsbG9jYXRlIGFyZ3VtZW50IGZyb20gc2l6ZV90Ci0JdG8gdW5zaWduZWQgaW50LCBiZWNhdXNlIHNpemVfdCBtYXkgbm90IGJlIGRlZmluZWQgaW4gYmZkLmguCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGJmZC1pbi5oIChiZmRfZ2V0e2IsbH1bX3NpZ25lZF9dezE2LDMyLDY0fSk6IERlY2xhcmUgYXJndW1lbnQgdG8KLQliZSBhIGNvbnN0IHBvaW50ZXIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuYyAoYmZkX2dldHtiLGx9W19zaWduZWRfXXsxNiwzMiw2NH0pOiBEZWNsYXJlIGFyZ3VtZW50IHRvCi0JYmUgYSBjb25zdCBwb2ludGVyLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQ2hhbmdlIHN3YXAgZnVuY3Rpb24gcG9pbnRlcnMKLQlhY2NvcmRpbmdseS4KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6IENoYW5nZSBzd2FwIGFjY29yZGluZ2x5LgotCSogYWl4Mzg2LWNvcmUuYzogQ2hhbmdlIE5PX0dFVCBhbmQgTk9fR0VUUyBhY2NvcmRpbmdseS4KLQkqIGhwcGFic2QtY29yZS5jLCBocHV4LWNvcmUuYywgaXJpeC1jb3JlLmMsIG9zZi1jb3JlLmMsCi0JcHRyYWNlLWNvcmUuYywgdHJhZC1jb3JlLmM6IENoYW5nZSBOT19HRVQgYW5kIE5PX1NJR05FRF9HRVQKLQlhY2NvcmRpbmdseS4KLQotCSogbGliYmZkLWluLmggKHN0cnVjdCBhcnRkYXRhKTogQWRkZWQgdGRhdGEgZmllbGQuCi0JKF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlKTogRGVjbGFyZS4KLQkoX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBEZWNsYXJlLgotCShfYmZkX3NuYXJmX2FyX2hkcik6IFJlbmFtZWQgZnJvbSBzbmFyZl9hcl9oZHIuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGFyY2hpdmUuYzogQ2xlYW5lZCB1cCBzb21lIG1vcmUuCi0JKF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IEluaXRpYWxpemUKLQlwb2ludGVyIGVsZW1lbnRzIG9mIGFydGRhdGEuCi0JKF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlKTogUmVuYW1lZCBmcm9tIGFkZF9iZmRfdG9fY2FjaGUuCi0JKF9iZmRfc25hcmZfYXJfaGRyKTogUmVuYW1lZCBmcm9tIHNuYXJmX2FyX2hkci4KLQkoX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBSZW5hbWVkIGZyb20gZ2V0X2VsdF9hdF9maWxlcG9zLgotCShnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUsIGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSwKLQliZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSwgY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBNYWRlIHN0YXRpYy4KLQkqIGVjb2ZmLmM6IFNvbWUgY29tbWVudCBjaGFuZ2VzLgotCShlY29mZl9zbHVycF9hcm1hcCk6IEhhbmRsZSByZW5hbWUgb2Ygc25hcmZfYXJfaGRyLiAgU2V0Ci0JYXJkYXRhLT50ZGF0YSB0byByYXdfYXJtYXAuCi0JKGVjb2ZmX2FyY2hpdmVfcCk6IEluaXRpYWxpemUgcG9pbnRlciBlbGVtZW50cyBvZiBhcnRkYXRhLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBIYW5kbGUgcmVuYW1lIG9mCi0JYWRkX2JmZF90b19jYWNoZS4KLQotCSogaGFzaC5jOiBBZGRlZCBzb21lIGRvY3VtZW50YXRpb24uCi0KLU1vbiBKYW4gIDMgMTE6MDk6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmgsIG5ldGJzZDM4Ni5jOiBSZXBsYWNlIE5PX1NXQVBfTUFHSUMgd2l0aCBTV0FQX01BR0lDLAotCWFuZCBkbyB0aGUgc3dhcHBpbmcgaGVyZSByYXRoZXIgdGhhbiBjYWxsaW5nIG50b2hsIGZyb20gdGhlIE5fKgotCW1hY3Jvcy4gIFRoaXMgY2xlYW5zIHVwIGFzc3VtcHRpb25zIGFib3V0IHRoZSBzaXplIG9mIGEgaG9zdCBsb25nLAotCXRoZSBleGlzdGVuY2UgdG8gbnRvaGwsIGV0Yy4KLQotU2F0IEphbiAgMSAxMzo1MDowNSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBWU1RhIG1pY3JvLWtlcm5lbC4gSXQgY3VycmVudGx5IHVzZXMKLQlpMzg2LWFvdXQuCi0KLVNhdCBKYW4gIDEgMTA6MTg6NTQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2bWFjaDMuaCAoSE9TVF9TRUdNRU5UX1NJWkUpOiBGaXggdmFsdWUuCi0JKiBpMzg2bWFjaDMuYyAoU0VHTUVOVF9TSVpFKTogRml4IHZhbHVlLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTkxOTMKLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2ctOTY5NyBiL2JmZC9DaGFuZ2VMb2ctOTY5NwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyMmM4Yy4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nLTk2OTcKKysrIC9kZXYvbnVsbApAQCAtMSw2NzExICswLDAgQEAKLVR1ZSBEZWMgMzAgMTI6NDU6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBJZiAtQnN5bWJvbGljLCBkb24ndAotCWFsbG9jYXRlIHNwYWNlIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgd2hpY2ggaXMKLQlkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG9uJ3QgY29weSBhIFBDCi0JcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGluIGEgcmVndWxhcgotCWZpbGUuCi0KLU1vbiBEZWMgMjkgMTg6MDI6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBKb25hdGhhbiBTdG9uZSA8am9uYXRoYW5ARFNHLlN0YW5mb3JkLkVEVT46Ci0JKiBjb25maWcuYmZkIChtaXBzLWRlYy1uZXRic2QqKTogQWRkIEVDT0ZGIHZlY3RvcnMgdG8KLQl0YXJnX3NlbHZlY3MuCi0JKG1pcHMqZWwtKi1uZXRic2QqKTogTGlrZSBtaXBzLWRlYy1uZXRic2QqLgotCShtaXBzKi0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCi1Nb24gRGVjIDI5IDE3OjEzOjI4IDE5OTcgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogZWxmbGluay5oIChlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZQotCWZyb20gInVuZGVmaW5lZCB2ZXJzaW9uIG5hbWUiIHRvICJ1bmRlZmluZWQgdmVyc2lvbmVkIHN5bWJvbAotCW5hbWUiLgotCi1Nb24gRGVjIDI5IDExOjQxOjE2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwbyBmcm9tIHByZXZpb3VzCi0JZGVsdGEuCi0KLVR1ZSBEZWMgMjMgMTc6MDE6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBTZXQgLnJlbG9jIHNlY3Rpb24gdG8gYmUKLQlzaGFyZWQuICBTZXQgc3RhYiogc2VjdGlvbnMgdG8gYmUgc2hhcmVkIGFuZCByZWFkLiAgU2V0IC5yc3JjCi0Jc2VjdGlvbiB0byBiZSByZWFkIGFuZCBzaGFyZWQuCi0KLU1vbiBEZWMgMjIgMTM6MjA6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGR3YXJmMi5sby4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBkd2FyZjIuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb2ZmLWFybS5jOiBEb24ndCBpbmNsdWRlIG9ic3RhY2suaC4KLQotTW9uIERlYyAyMiAxMzowNDozMyAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04NiotZ28zMi1ydGVtcyopOiBGaXggdG8gYmUgdGhlIHNhbWUgYXMKLQlpWzM0NTZdODYtZ28zMi4KLQotVGh1IERlYyAxOCAxNjowMToyNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdG8gZ2V0IEBTSEVMTEAgc3Vic3RpdHV0ZWQuCi0KLVdlZCBEZWMgMTcgMDk6NDU6MDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IE9ubHkgbG9vayBhdCBzZWN0aW9uCi0Jb3duZXIgaWYgdGhlcmUgaXMgb25lLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEZhaWwgaWYgdGhlcmUgaXMgbm90Ci0JZW5vdWdoIHJvb20gZm9yIHRoZSBwcm9ncmFtIGhlYWRlcnMuCi0KLVR1ZSBEZWMgMTYgMDg6MDk6NTYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IENhbGwKLQlfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSBmaXJzdC4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFNhbWUuCi0JKiBkd2FyZjIuYzogTmV3IGZpbGU7IGltcGxlbWVudCBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZS4KLQotTW9uIERlYyAxNSAxNjowODo1MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX21hY2hfbTMyci4KLQotTW9uIERlYyAxNSAxNjoxMToyMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoQUxJR05fU0VDVElPTlNfSU5fRklMRSk6IERlZmluZSBpZiBJOTYwIG5vdCBkZWZpbmVkLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFVzZSBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0JdG8gZGVjaWRlIHdoZW4gdG8gYWxpZ24gdGhlIGZpbGUgc2VjdGlvbnMgZm9yIHBhZ2luZy4KLQkqIGNvZmZjb2RlLmggKEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUpOiBVbmRlZmluZSBmb3IgVElDODBDT0ZGLgotCi1Nb24gRGVjIDE1IDE1OjAxOjE1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfb2JqZWN0X3ApOiBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiAgTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiAgTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogIE5ldyBGdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfb2JqZWN0X3ApOiBQb2ludCB0byBtMzJyX29iamVjdF9wLgotCShlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogUG9pbnQgdG8KLQltMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nLgotCShiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFBvaW50IHRvCi0JbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBQb2ludCB0bwotCW0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEuCi0JKGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBQb2ludCB0bwotCW0zMnJfZWxmX3NldF9wcml2YXRlX2JmZF9kYXRhLgotCShiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQb2ludCB0bwotCW0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEuCi0KLQotCSogYmZkLWluMi5oIChiZmRfbWFjaF9tMzJyKTogQWRkIGlkZW50aWZpZXIgZm9yIE0zMlIgYXJjaGl0ZWN0dXJlCi0JbWFjaGluZXMuCi0KLUZyaSBEZWMgMTIgMTE6MzA6MjggMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogT25seSBidWlsZCBsaWJiZmQgc2hhcmVkIGlmIC0tZW5hYmxlLXNoYXJlZCdzIHZhbHVlCi0Jd2FzIGB5ZXMnLCBvciB3YXMgc2V0IHRvIGAqYmZkKicuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIE5PVEU6IHRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGZpeGVkIGluIGxpYnRvb2wvbGlidG9vbC5tNCwgdGhlCi0Jb3JpZ2luYWwgc291cmNlIG9mIHRoaXMgYml0IG9mIGNvZGUuICBJdCdzIG5vdCBjbGVhciB3aGF0IHRoZSBiZXN0IGZpeAotCXdvdWxkIGJlLCB0aG91Z2guCi0KLVRodSBEZWMgMTEgMTc6NDg6MTEgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBBbHdheXMgaW5pdCB1ZGF0YS5wIHNvCi0JdGhhdCB0aGUgZ2VuZXJpYyByZWxheGF0aW9uIGNvZGUgY2FuIGZ1bmN0aW9uIHdoZW4gaW5wdXQgYW5kIG91dHB1dAotCWZpbGUgZm9ybWF0cyBhcmUgbWlzbWF0Y2hlZC4KLQotVGh1IERlYyAxMSAwMTowMjoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBGb3IgYSBsb2FkYWJsZQotCXNlY3Rpb24sIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2FkIGFkZHJlc3MgaXMgY29ycmVjdCByZWxhdGl2ZSB0bwotCXRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQgcGx1cyB0aGUgc2l6ZSBvZiB0aGUgc2VnbWVudCBzbwotCWZhci4KLQotCSogY29mZmNvZGUuaCAoX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKTogTWFrZSBzdGF0aWMuCi0JKF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IExpa2V3aXNlLgotCi1XZWQgRGVjIDEwIDIzOjM3OjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgYSByZWxvY2F0ZWFibGUgbGluayBpbgotCXdoaWNoIGEgcmVsb2NhdGlvbiByZWZlcnMgdG8gYW4gaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuCi0KLVdlZCBEZWMgMTAgMTE6MTU6NTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYmZkX2FybV9jb2ZmX2ZpbmFsX2xpbmspOiBGdW5jdGlvbiBkZWxldGVkLgotCShjb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYXJtX2xpbmtfb3V0cHV0X2hhc19iZWd1bik6IE5ldyBmdW5jdGlvbi4KLQotCSogbGliY29mZi5oIChzdHJ1Y3QgYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZHM6Ci0JX2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biBhbmQKLQlfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0LiAgQWRkIG5ldyBtYWNyb3M6Ci0JYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKCkgYW5kCi0JYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KCkuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSW5zZXJ0IGNhbGxzIHRvCi0JYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKCkgYW5kCi0JYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KCkuCi0KLQkqIGNvZmZjb2RlLmg6IEFkZCB0d28gbmV3IGZpZWxkcyB0byBiZmRfY29mZl9iYWNrZW5kX2RhdGEKLQlzdHJ1Y3R1cmU6IF9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gYW5kCi0JX2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdC4gIEFkZCBkZWZhdWx0IGluaXRpYWxpc2VycyBmb3IKLQl0aGVzZSBmaWVsZHMuICBBZGQgb3ZlcnJpZGFibGUgYWxpYXNlcyBmb3IgdGhlIGNvZmYgc3dhcCBmdW5jdGlvbnMKLQlpbiB0aGUgYmFja2VuZCBkYXRhIHN0cnVjdHVyZS4KLQotCSogZWxmMzItdjg1MC5jOiBVcGRhdGUgd2l0aCBwYXRjaGVzIGZyb20gdGhlIGJyYW5jaCB0byBmaXgKLQlISTE2X1MvTE8xNiByZWxvYyBwYWlycy4KLQotV2VkIERlYyAxMCAxNDowNjo0OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChkMzB2X2luZm9fdG9faG93dG9fcmVsYSk6IE5ldyBmdW5jdGlvbiB0byBzdXBwb3J0Ci0JUkVMQSByZWxvY2F0aW9ucy4KLQkoVVNFX1JFTCk6IERvbid0IGRlZmluZSBhbnkgbW9yZSwgc3dpdGNoIHRvIHVzaW5nIFJFTEEKLQlyZWxvY2F0aW9ucy4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUgYXMgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEuCi0KLVR1ZSBEZWMgIDkgMTE6Mzc6NTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9taXBzKik6IERlZmluZS4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IEZvciAzMDAwIGFuZCA0MDAwIHJlcGxhY2UgbWFnaWMgY29uc3RhbnQgd2l0aAotIAltYWNyby4KLQotCSogY3B1LW1pcHMuYyAoTik6IERlZmluZS4KLQkoYmZkX21pcHNfYXJjaCwgYXJjaF9pbmZvX3N0cnVjdCk6IFJlLXdyaXRlIHVzaW5nIG1hY3JvIE4sIHJlcGxhY2UKLSAJbnVtYmVycyB3aXRoIGJmZF9tYWNoX21pcHMqIG1hY3Jvcy4KLQotRnJpIERlYyAgNSAxMToxMzo0NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jLCB2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbiwKLQl2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHJlbG9jIGFkZGVuZCBoYW5kbGluZy4KLQkodjg1MF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uLCB2ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZywKLQl2ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2ssIHY4NTBfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rLAotCXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9zaGRyLCB2ODUwX2VsZl9mYWtlX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9ucwotCXRvIGNyZWF0ZSBhbmQgaGFuZGxlIHNwZWNpYWwgY29tbW9uIHNlY3Rpb25zLgotCSh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogRml4IEhJMTYgYW5kIEhJMTZfUyByZWxvY2F0aW9ucwotCXdoaWNoIGhhdmUgZGF0YSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9ucy4KLQotVHVlIERlYyAgMiAxMDoyNjoxNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IFJldmVydCBiYWNrIHRvICdfJwotCShVU0VSX0xBQkVMX1BSRUZJWCk6IFJldmVydCBiYWNrIHRvICdfJwotCi0JKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiB0YXJnZXQuCi0KLU1vbiBEZWMgIDEgMjA6MjQ6MTggMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb2ZmLXNoLmMgKHNoX2NvZmZfaG93dG9zKTogQWRkIFJfU0hfU1dJVENIOCBlbnRyeS4KLQkoZ2V0X3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBSX1NIX1NXSVRDSDguCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgotCi1XZWQgTm92IDI2IDE0OjEzOjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogQ2hhbmdlZCB0byBtYXRjaCBkZWZpbml0aW9uIGluCi0JZ2NjL2NvbmZpZy9hcm0vc2VtaS5oCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQWRkIEFSTSBhbmQgVGh1bWIgc3ltYm9sCi0JY2xhc3Nlcy4KLQotU3VuIE5vdiAyMyAxNjowMjo1OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGZyZWVic2QuaCAoU1dBUF9NQUdJQyk6IFJlYWQgbWFnaWMgbnVtYmVyIGxpdHRsZSBhbmQgbm90IGJpZwotIAllbmRpYW4uCi0KLVdlZCBOb3YgMjYgMDk6MzA6MzcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogT25seSBzZXQgcHJpdmF0ZSBmbGFncyBmb3Igbm9uCi0JUEUgQVJNIHBvcnRzLgotCi1UdWUgTm92IDI1IDE1OjMzOjIzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBBbHNvIGlnbm9yZSBORVZFUl9MT0FECi0Jc2VjdGlvbnMuCi0KLVR1ZSBOb3YgMjUgMTA6NTU6MzYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEbyBub3QKLQljb21wbGFpbiBpZiBpbm91dCBhbmQgb3V0cHV0IGZvcm1hdHMgZGlmZmVyLgotCi1UdWUgTm92IDI1IDExOjI2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIHRla2hleC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogUmVtb3ZlIHRla2hleC5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIHNyYy9NYWtlZmlsZS5pbjogUmVidWlsZCB3aXRoIGN1cnJlbnQKLQlhdXRvbWFrZSBhbmQgYXV0b2NvbmYuCi0KLQkqIGNvZmYtYXJtLmMgKGFybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiBGaXggdHlwbwotCShDT0ZGX1dJVEhfUFIgdG8gQ09GRl9XSVRIX1BFKS4KLQotTW9uIE5vdiAyNCAxNTo0Nzo0OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBNYWtlIHZhcmlhYmxlcyBhbmQgc29tZSBmdW5jdGlvbnMgc3RhdGljLCBzbyB0aGF0Ci0JdGhpcyBmaWxlIGNhbiBiZSBpbmNsdWRlZCBpbiBtdWx0aXBsZSBvYmplY3QgZmlsZXMuCi0JKGNvZmZfYXJtX2JmZF9maW5hbF9saW5rKTogRml4IG1pbm9yIGJ1Zy4KLQotU2F0IE5vdiAyMiAxNToxNjowMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgc3VwcG9ydCBmb3IgUElDIGFuZCBBUENTLUZMT0FUIHR5cGUgYmluYXJpZXMuCi0KLQkqIGNvZmZjb2RlLmg6IEFkZCBzdXBwb3J0IGZvciBQSUMgYW5kIEFQQ1MtRkxPQVQgdHlwZSBiaW5hcmllcy4KLQotU2F0IE5vdiAyMiAxNjowNjo1NiAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZXZheC1lbWguYyAoX2JmZF9ldmF4X3dyaXRlX2VtaCk6IFVzZSBhbGxvY2EgaW5zdGVhZCBvZiBzdHJkdXAuCi0KLVNhdCBOb3YgMjIgMTI6Mjk6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IFdoZW4gb3ZlcnJpZGluZyBhIGRlZmluZWQKLQlzeW1ib2wsIHNldCBpdCB0byB1bmRlZmluZWQsIG5vdCBuZXcuCi0KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBraWxsIExBQkVMCi0JcmVsb2NzLgotCi1GcmkgTm92IDIxIDE0OjE0OjIyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfc2VjdGlvbik6IEZvcmNlIHNpZ24gZXh0ZW50aW9uIG9mIFVTRVMgcl9vZmZzZXQuCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IGtpbGwgTEFCRUwgcmVsb2NzLgotCi1Nb24gTm92IDE3IDE1OjA4OjM4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5KTogRml4IHR5cG8uCi0JKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KLQotU2F0IE5vdiAxNSAxNTozNjowNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IENhc3Qgc2Vjb25kIGFyZyBvZgotCWJmZF9oX2dldF8qIGNhbGxzIHRvICJiZmRfYnl0ZSAqIi4KLQotVHVlIE5vdiAxMSAxMDozNzoyMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkCi0JIm1vdm1fc3RhY2tfc2l6ZSIuCi0JKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBJbmNsdWRlIHN0YWNrIHNwYWNlIGZvciByZWdpc3RlciBzYXZlcwotCWluIHRoZSBpbW04IGZpZWxkIG9mIGEgImNhbGwiIGluc3RydWN0aW9uLgotCShjb21wdXRlX2Z1bmN0aW9uX2luZm8pOiBEZXRlcm1pbmUgaG93IG11Y2ggc3RhY2sgaXMgYWxsb2NhdGVkIGJ5Ci0JdGhlIG1vdm0gaW5zdHJ1Y3Rpb24uICBGaXggdHlwby4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbW92bV9zdGFja19zaXplLgotCi1Nb24gTm92IDEwIDE0OjMyOjQwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogRG9uJ3QgY3Jhc2ggaWYKLQlhIHZlcnNpb24gZGVwZW5kZW5jeSBjb3VsZCBub3QgYmUgZm91bmQuCi0KLVR1ZSBOb3YgIDQgMTI6MDU6NTYgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IEdldCB2ZXJzaW9uIGluZm8gZnJvbSBjb25maWd1cmUuaW4KLQotRnJpIE9jdCAyNCAxMToxNTo1OCAxOTk3ICBKYWt1YiBKZWxpbmVrICA8ampAc3Vuc2l0ZS5tZmYuY3VuaS5jej4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6Ci0JTmV3IGZ1bmN0aW9uLiBBdm9pZCBtaXhpbmcgVVMxIGFuZCBIQUwgUjEgY29kZS4KLQlTZXQgcmVzdWx0aW5nIG1lbW9yeSBvcmRlcmluZyB0byB0aGUgc3Ryb25nZXN0IG9uZSB1c2VkLgotCShzcGFyYzY0X2VsZl9vYmplY3RfcCk6IFNldCBiZmRfbWFjaCBjb3JyZWN0bHkuCi0KLVRodSBPY3QgMjMgMTQ6MDk6MzMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBBZGQgVUE2NCAmIFVBMTYuCi0JKHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSB0aGVtLgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuICBCZWZvcmUgZW1pdHRpbmcgYSBkeW4gcmVsb2MsCi0JY2hlY2sgYWxpZ25tZW50IGFuZCB0cmFuc211dGUgUl9TUEFSQ194PC0+Ul9TUEFSQ19VQXguCi0KLVRodSBPY3QgMjMgMDA6NTM6MTQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAZG90LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbGludXgqKTogVXNlIHRyYWQtY29yZSBhbmQgLi4uCi0JKiBob3N0cy9zcGFyY2xpbnV4Lmg6IE5ldyBmaWxlLgotCi1UaHUgT2N0IDIzIDAwOjI1OjI5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChzcGFyYzY0LSotbGludXgqKTogTmV3IHRhcmdldC4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBwbHRfYWxpZ25tZW50IG1lbWJlci4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogU2V0IC5nb3QgYWxpZ25tZW50IGJhc2VkCi0Jb24gYXJjaF9zaXplLgotCShfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlIGZvciAucmVsKiBzZWN0aW9ucy4KLQlTZXQgLnBsdCBhbGlnbm1lbnQgZnJvbSBuZXcgcGx0X2FsaWdubWVudC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgdmVyc2lvbiBzZWN0aW9uCi0JYWxpZ25tZW50IHRvIExPR19GSUxFX0FMSUdOLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQpOiBQcm92aWRlIGRlZmF1bHQuCi0JKGVsZlhYX2JlZCk6IEluaXQgcGx0X2FsaWdubWVudC4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzLAotCXNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCwgc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zLAotCXNwYXJjNjRfZWxmX2FkanVzdF9keW5pbmR4LCBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wsCi0Jc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb25zLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IEZpeCBhIGZldyBuYW1lIHN0cmluZ3MuCi0JKEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSKTogTmV3IGRlZmluaXRpb24uCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgc2hhcmVkIGxpYnJhcmllcy4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3RydWN0IHBsdF90ZW1wbGF0ZSwgcGx0XypfaGVhZGVyLCBwbHRfKl9lbnRyeSwKLQlzcGFyYzY0X2VsZl9idWlsZF9wbHRfZW50cnksIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6Ci0JUExUIGRlZmluaXRpb25zIHNwYXJjNjQtbGludXggb3JpZ2luYWxseSBjaG9vc2UuICBUaGVzZSB3aWxsIGdvCi0JYXdheSBzb29uIGluIGZhdm91ciBvZiB0aGUgb2ZmaWNpYWwgYWJpIGRlZmluaXRpb25zLgotCi1XZWQgT2N0IDIyIDE2OjA4OjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChjb2ZmX3NtYWxsX29iamVjdF9wKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9zbWFsbF9uZXdfc2VjdGlvbl9ob29rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZSk6IE5ldyBzdGF0aWMgY29uc3Qgc3RydWN0dXJlLgotCShjb2ZmX3NtYWxsX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgotCShjb2ZmX3NtYWxsX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRGVmaW5lLgotCShjb2ZmX3NtYWxsX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lLgotCShjb2ZmX3NtYWxsX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6IERlZmluZS4KLQkoc2hjb2ZmX3NtYWxsX3ZlYyk6IE5ldyBzdGF0aWMgc3RydWN0dXJlLgotCShzaGxjb2ZmX3NtYWxsX3ZlYyk6IE5ldyBzdGF0aWMgc3RydWN0dXJlLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzaGNvZmZfc21hbGxfdmVjIGFuZAotCXNobGNvZmZfc21hbGxfdmVjLgotCSogY29uZmlnLmJmZCAoc2gtKi1lbGYqKTogQWRkIHNoY29mZl9zbWFsbF92ZWMgYW5kCi0Jc2hsY29mZl9zbWFsbF92ZWMgdG8gdGFyZ19zZWx2ZWNzLgotCShzaC0qLSopOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHNoY29mZl9zbWFsbF92ZWMgYW5kIHNobGNvZmZfc21hbGxfdmVjIGNhc2VzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gT2N0IDIwIDE1OjAxOjI3IDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBldmF4LWVnc2QuYzogV2VhayBzeW1ib2xzIGFyZSBnbG9iYWwuCi0KLQkqIGV2YXgtZW1oLmM6IFVzZSBwcm9wZXIgY2FzdHMuCi0KLQkqIGV2YXgtZWdzZC5jIChfYmZkX2V2YXhfd3JpdGVfZWdzZCk6IFJlbW92ZSB1bm5lZWRlZCB1bmFtZS4KLQotCSogZXZheC1lZ3NkLmM6IFNlY3Rpb24gbmFtZXMgYW5kIHN5bWJvbHMgaGF2ZSBkaWZmZXJlbnQKLQlsZW5ndGggcmVzdHJpY3Rpb25zLiBBZGQgbGVuZ3RoIHBhcmFtZXRlciB0bwotCV9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wuCi0JKiBldmF4LWV0aXIuYzogTGlrZXdpc2UuCi0JKiBldmF4LW1pc2MuYyAoX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbCk6IEFkZCBsZW5ndGgKLQlwYXJhbWV0ZXIuCi0JKiBldmF4LmggKEVPQkpfU19DX1NFQ1NJWik6IERlZmluZS4KLQotCSogZXZheC1hbHBoYS5jOiBSZW1vdmUgZHVwbGljYXRlIHRlc3QuCi0KLQkqIGV2YXgtZW1oLmM6IFNZUyQgZnVuY3Rpb25zIGFyZSB1cHBlci1jYXNlLgotCi0JKiBldmF4LWVnc2QuYzogQ3JlYXRlIHNlcGFyYXRlIHNlY3Rpb25zIGZvciBjb21tb24gc3ltYm9scy4KLQkqIGV2YXgtZXRpci5jOiBEb24ndCBvdXRwdXQgY29tbW9uIHNlY3Rpb24uCi0JKiBldmF4Lmg6IEJ1bXAgdXAgc2VjdGlvbiBjb3VudC4KLQotCSogY29uZmlndXJlLmNvbTogVXNlIDY0Yml0IGludGVnZXJzIHdpdGggREVDIEMuCi0KLQkqIGV2YXgtZWdzZC5jOiBNYWtlIHNlY3Rpb24gZmxhZ3MgZGVjIGMgY29tcGF0aWJsZS4KLQotTW9uIE9jdCAyMCAwOTozODozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChub3JtYWxpemUpOiBEZWxldGUgZnVuY3Rpb24uCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTmV3IHBhcmFtZXRlciBlbGVuZ3RoLiAgQWxsIGNhbGxlcnMKLQljaGFuZ2VkLiAgVXNlIHBhc3NlZCBpbiBlbGVuZ3RoIHRvIGRldGVybWluZSBzaXplIG9mIHRoZSBleHRlbmRlZAotCW5hbWUgdGFibGUgaW5zdGVhZCBvZiBjb21wdXRpbmcgaXQgYWdhaW4uCi0KLVN1biBPY3QgMTkgMjM6MzY6MjEgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIHw9IG5vdCA9IHRvIHNldAotCUlNQUdFX1NDTl9NRU1fUkVBRCBmb3IgYW4gdW5yZWNvZ25pemVkIHNlY3Rpb24uCi0KLVN1biBPY3QgMTkgMjE6MDQ6NTYgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBBY2NvdW50IGZvciB0cmFpbGluZwotCScvJyBpbiB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotRnJpIE9jdCAxNyAwMDowNDoxMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IEZvciBleHBsaWNpdGx5IHZlcnNpb25lZAotCXN5bWJvbHMsIGNoZWNrIGdsb2JhbHMgbGlzdCBiZWZvcmUgbWF0Y2hpbmcgb24gbG9jYWxzLgotCi1UaHUgT2N0IDE2IDA4OjE3OjA2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0LHBlX3ByaW50X2lkYXRhKTogRml4IG1hbmdsZWQKLQlwYXRjaC4KLQotV2VkIE9jdCAxNSAxMzo0NToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3RfaG9vayk6IFNldCBETEwgZmxhZy4KLQkocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgRExMIGZsYWcuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBTZXQgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRQotCWZvciAuc3RhYiogc2VjdGlvbnMuICBSZXBsYWNlIHN0cmxlbiBvZiBjb25zdGFudCBzdHJpbmdzIHdpdGgKLQludW1iZXIuCi0KLVR1ZSBPY3QgMTQgMTU6NDI6NDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfbWVyZ2VfaW5kX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24gdG8KLQltZXJnZSBnb3QgYW5kIHJlbG9jIGVudHJpZXMgZnJvbSBpbmQgc3ltcyB0byB0aGVpciB0YXJnZXQuCi0JKGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogQ2FsbCBpdC4KLQkoZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzKTogT3BlcmF0ZSBvbiB0aGUgdGFyZ2V0IG9mIGluZGlyZWN0IHN5bWJvbHMuCi0JKGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzKTogTGlrZXdpc2UuCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBMaWtld2lzZS4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEJhY2sgb3V0IEhKJ3MgY2hhbmdlLAotCWFzIGl0IGlzIGluc3VmZmljaWVudCB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb24gY2hhbmdlcyBhcyB3ZWxsLgotCi1Nb24gT2N0IDEzIDIzOjEwOjA4IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzKTogQWxsb3cgZm9yIFJFTEFUSVZFCi0JcmVsb2NzIGZvciBzeW1ib2xzIGluIHNobGlicyB0aGF0IGhhdmUgYmVlbiBmb3JjZWQgbG9jYWwuCi0JKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBPdXRwdXQgUkVMQVRJVkVzIGluIC5nb3QgZm9yIHNhbWUuCi0KLU1vbiBPY3QgMTMgMjE6MjQ6MDQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSB0aGUKLQlnb3RfZW50aWVzIG9mIHRoZSBkZWZhdWx0IHN5bWJvbCBmb3IgdGhlIGRlZmF1bHQgdmVyc2lvbmVkCi0Jc3ltYm9sLiAgUGF0Y2ggZnJvbSBoamxAZ251LmFpLm1pdC5lZHUsIG1vZGlmaWVkIG5vdCB0byB1c2UKLQlhbGxvY2EgaW4gdGhlIGxvb3AuCi0KLU1vbiBPY3QgMTMgMTc6Mzc6MzcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogT25seSB1c2UgdGhlIGJvdHRvbQotCTI0IGJpdHMgb2YgdGhlIFBDIHdoZW4gY29tcHV0aW5nIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4KLQotRnJpIE9jdCAxMCAxNjowMTozMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jLCB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKToKLQlDb3JyZWN0IHZhbHVlIGZvciBtYXhpbXVtIHBvc2l0aXZlIDIyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLgotCSh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogIFByZXZlbnQgb3ZlcmZsb3cgZnJvbSBISTE2X1MgYW5kCi0JSElfMTYgcmVsb2NhdGlvbnMuICBDb3JyZWN0IGJpdCBhZGp1c3RtZW50IGluIFREQSBvZmZzZXRzLgotCi1UaHUgT2N0ICA5IDE2OjQzOjM5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjX2VsZl97aGl4MjIsbG94MTB9X3JlbG9jKTogTmV3IGZ1bmN0aW9ucy4KLQkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBVc2UgdGhlbSBmb3IgSElYMjIsTE9YMTAgcmVsb2NzLgotCi1XZWQgT2N0ICA4IDExOjM4OjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaCAoYmZkX3Byc3RhdHVzKTogUGVkYW50aWNseSwgYWxpZ25tZW50X3Bvd2VyIHNob3VsZAotCWJlIExPR19GSUxFX0FMSUdOLgotCi1XZWQgT2N0ICA4IDExOjM2OjAwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IE1pc3NlZCBvbmUgYWxwaGEqIGNoYW5nZS4KLQotVHVlIE9jdCAgNyAxMzowMDoxNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJlbW92ZSBCRkQ2NCBzdXBwb3J0LgotCSogZWxmNjQtc3BhcmMuYyAoU1BBUkM2NF9PTERfUkVMT0NTKTogVW5kZWYuCi0JKE1JTlVTX09ORSk6IE5ldyBtYWNyby4KLQkoc3BhcmNfZWxmX25vdHN1cF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IgRElTUDY0LFBMVDY0LEhJWDIyLExPWDEwLAotCUg0NCxNNDQsTDQ0LFJFR0lTVEVSLgotCShzcGFyY19yZWxvY19tYXApOiBMaWtld2lzZS4gIE1hcCBCRkRfUkVMT0NfQ1RPUiB0byBSX1NQQVJDXzY0LgotCShpbml0X2luc25fcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jKTogVXNlIGl0LgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIGVudHJpZXMgZm9yIE9MTzEwLEhJWDIyLExPWDEwLgotCi1UdWUgT2N0ICA3IDExOjQwOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmMgKHNvbV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFJlbW92ZSBzdGF0aWMKLQlmdW5jdGlvbiwgYW5kIGRlZmluZSBhcyBtYWNybyBpbnN0ZWFkLgotCi1GcmkgT2N0ICAzIDE0OjAyOjE3IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IENoYW5nZSBhbHBoYS0qLSogdG8gYWxwaGEqLSotKjsgY29uZmlnLmd1ZXNzIG5vdwotCXJlY29nbml6ZXMgYWxwaGFldjUgZXRjLgotCSogY29uZmlndXJlLmhvc3Q6IExpa2V3aXNlLgotCi1GcmkgT2N0ICAzIDExOjIzOjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU1ha2UgbGQgLXMgd29yayBvbiBBSVg6Ci0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGNyZWF0ZSB0aGUgLmRlYnVnCi0Jc2VjdGlvbiBpZiB3ZSBhcmUgc3RyaXBwaW5nLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHRoZSAuZGVidWcgc2VjdGlvbgotCXNpemUgaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCBTRUNfUkVMT0Mgb3IgcmVsX2ZpbGVwb3MsCi0JYW5kIGRvbid0IHdyaXRlIG91dCByZWxvY3MsIGlmIHdlIGFyZSBzdHJpcHBpbmcuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3Qgc2V0IHVwIHJlbG9jIGlmIHdlIGFyZSBzdHJpcHBpbmcuCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEb24ndCB3cml0ZSBvdXQgc3ltYm9sIG9yIHJlbG9jIGlmIHdlCi0JYXJlIHN0cmlwcGluZy4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBpbmNsdWRlIGVsZi5sbyBhZ2FpbiBmb3IgRUxGIHRhcmdldHM7IGl0J3MKLQlhbHdheXMgaW4gdGhlIGxpYnJhcnkgYW55aG93LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jKTogQ2FzdCB0byBiZmRfYnl0ZSAqLCBub3QKLQljaGFyICosIHdoZW4gY2FsbGluZyBiZmRfZ2V0XzMyIGFuZCBiZmRfcHV0XzMyLgotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IENhc3QgY29udGVudHMgdG8gY2hhciAqCi0Jd2hlbiBjYWxsaW5nIHN0cmNweS4KLQotVGh1IE9jdCAgMiAxNjoxNTo1MCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfY2hlY2tfb3ZlcmZsb3cpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBVc2UgaXQuCi0JKEJGRF9SRUxPQ19TUEFSQ197RElTUDY0LFBMVDY0fSk6IE5ldyByZWxvY3MuCi0JKEJGRF9SRUxPQ19TUEFSQ197SElYMjIsTE9YMTAsSDQ0LE00NCxMNDQsUkVHSVNURVJ9KTogTmV3IHJlbG9jcy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCi1UaHUgT2N0ICAyIDEzOjE3OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldCBJTUFHRV9TQ05fTUVNX1JFQUQgZm9yIGFuCi0JdW5yZWNvZ25pemVkIHNlY3Rpb24uICBGcm9tIEpvbiBUaGFja3JheSA8am9udEBoYXJsZXF1aW4uY28udWs+LgotCi1XZWQgT2N0ICAxIDE0OjAzOjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKCQoQkZEX0gpKTogQ2hhbmdlIHN0bXAtYmZkLmggdG8gc3RtcC1iZmQtaC4KLSAJKHN0bXAtYmZkLWgpOiBSZW5hbWUgZnJvbSBzdG1wLWJmZC5oLgotIAkoQkZEX0hfRklMRVMsIExJQkJGRF9IX0ZJTEVTLCBMSUJDT0ZGX0hfRklMRVMpOiBOZXcgdmFyaWFibGVzLgotCSgkKHNyY2RpcikvYmZkLWluMi5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdG1wLWJpbjItaC4KLQkoc3RtcC1iaW4yLWgpOiBOZXcgdGFyZ2V0LgotCSgkKHNyY2RpcikvbGliYmZkLmgpOiBKdXN0IGRlcGVuZCB1cG9uIHN0bXAtbGJmZC1oLgotCShzdG1wLWxiZmQtaCk6IE5ldyB0YXJnZXQuCi0JKCQoc3JjZGlyKS9saWJjb2ZmLmgpOiBKdXN0IGRlcGVuZCB1cG9uIHN0bXAtbGNvZmYtaC4KLQkoc3RtcC1sY29mZi1oKTogTmV3IHRhcmdldC4KLQkoQ0xFQU5GSUxFUyk6IENoYW5nZSBzdG1wLWJmZC5oIHRvIHN0bXAtYmZkLWguICBBZGQgc3RtcC1iaW4yLmgsCi0Jc3RtcC1sYmZkLWgsIGFuZCBzdG1wLWxjb2ZmLWguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBVc2UgYSBkaXZlcnNpb24gdG8gc2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIHRoZQotCWFyZ3VtZW50cyBhcmUgcGFyc2VkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwIDMwIDE0OjE4OjMyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUl9TUEFSQ19HTE9CX0pNUAotCXJlbmFtZWQgdG8gUl9TUEFSQ19VTlVTRURfNDIuCi0JKHNwYXJjX3JlbG9jX21hcCk6IERlbGV0ZSBSX1NQQVJDX0dMT0JfSk1QIGVudHJ5LgotCSogZWxmNjQtc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSX1NQQVJDX0dMT0JfSk1QCi0JcmVuYW1lZCB0byBSX1NQQVJDX1VOVVNFRF80Mi4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVsZXRlIFJfU1BBUkNfR0xPQl9KTVAgZW50cnkuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfU1BBUkNfR0xPQl9KTVApOiBEZWxldGUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgU2VwIDI1IDEyOjE1OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogRG9uJ3QgY2hlY2sgdGhlIGhhc2ggY3JlYXRvciB1bnRpbAotCWFmdGVyIHdlIGhhdmUgc2V0ICpzeW1faGFzaC4KLQotV2VkIFNlcCAyNCAxNjo1MjoyOCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy5iZmQgKHNoKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2Ugc2gtKi0qZWxmKi4KLQotV2VkIFNlcCAyNCAxMToyNzoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJiZmRfYV9TT1VSQ0VTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DSEVDS19UT09MIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgMjMgMTk6MDM6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogRXZlbiBpZiB3ZSBhcmUgbm90IGRlbWFuZAotCXBhZ2VkLCBkb24ndCBwdXQgYSBsb2FkYWJsZSBzZWN0aW9uIGFmdGVyIGEgbm9ubG9hZGFibGUgc2VjdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEluY3JlbWVudCB0aGUgZmlsZSBvZmZzZXQKLQlmb3IgYSBzZWN0aW9uIHdpdGggY29udGVudHMsIGV2ZW4gaWYgaXQgaXMgbm90IGxvYWRhYmxlLgotCi1TdW4gU2VwIDIxIDExOjAzOjI0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEFkZCByZXR1cm4gY29kZQotCWluZGljYXRpbmcgdGhhdCBfX2N0YnAgY291bGQgbm90IGJlIGZvdW5kLgotCi1UaHUgU2VwIDE4IDE1OjA0OjU3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfY2hlY2tfcmVsb2NzKTogSW1wcm92ZSBlcnJvciBtZXNzYWdlLgotCi1XZWQgU2VwIDE3IDA5OjU0OjUxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSwgdjg1MF9lbGZfcmVsb2MsCi0Jdjg1MF9lbGZfY2hlY2tfcmVsb2NzLCB2ODUwX2VsZl9yZWxvY19tYXAsIHY4NTBfZWxmX2hvd3RvX3RhYmxlKToKLQlBZGQgc3VwcG9ydCBmb3IgdGhlIENBTExUIHJlbG9jcy4KLQotCSogcmVsb2MuYyAoQ09NTUVOVCk6IEFkZCBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VUIGFuZAotCUJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVC4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogQWRkIGNoZWNrcyB0byBjYXRjaAotCXJlbG9jYXRpb25zIGFnYWluc3Qgbm9uLWV4aXN0YW50IHN5bWJvbHMuCi0KLVR1ZSBTZXAgMTYgMTQ6MjA6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIEJGUl9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQuCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MsIHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUsCi0Jdjg1MF9lbGZfaG93dG9fdGFibGUsIHY4NTBfZWxmX3JlbG9jX21hcCk6IEFkZCBzdXBwb3J0IGZvciBhIDE2Ci0JYml0IHJlbG9jIGluIHRoZSB0aW55IGRhdGEgYXJlYS4KLQotTW9uIFNlcCAxNSAxMToyNzozNiAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogQ2hhbmdlIHBjLXJlbGF0aXZlIHJlbG9jcwotCW92ZXIgMl4zMiBieXRlcyB0byBiZSBhYnNvbHV0ZS4gIE5lZWRlZCBiZWNhdXNlIEQzMFYgUEMgZG9lc24ndAotCW5lY2Vzc2FyaWx5IHdyYXAuCi0KLQkqIHJlbG9jLmMsIGVsZjMyLWQzMHYuYyAoQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCwKLQlCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IpOiBOZXcgcmVsb2NzLgotCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvY18yMSk6IE5ldyBmdW5jdGlvbi4KLQlEbyAxNSBhbmQgMjEgYml0IHBjLXJlbGF0aXZlIHJlbG9jYXRpb25zLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUiwgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUik6Ci0JTmV3IHJlbG9jYXRpb25zLgotCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEFkZGVuZCBuZWVkcyB0byBiZQotCWFkZGVkIHRvIHRoZSByZWxvY2F0aW9uLCBub3Qgb3InZC4KLQotV2VkIFNlcCAxMCAxNToxNzoyNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jKTogUmVtb3ZlIHNwdXJpb3VzIGVycm9yIG1lc3NhZ2UuCi0KLVdlZCBTZXAgMTAgMTE6MTc6NTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogVXNlIHN0cmNhc2VjbXAuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBUZXN0IGZvciBtYXRjaCB3aXRoIGFyY2hfbmFtZSArICI6IiArCi0gCXByaW50YWJsZV9uYW1lLgotCShiZmRfZGVmYXVsdF9zY2FuKTogVGVzdCBmb3IgbWF0Y2ggd2l0aCBwcmludGFibGVfbmFtZSAtICI6Ii4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IERlbGV0ZSB3NjUsIGg4MzAwLCBoODUwMCwgejhrLCBpOTYwIHNwZWNpYWwKLSAJY2FzZXMuICBFYWNoIGltcGxlbWVudHMgdGhlaXIgb3duIHNjYW4gZnVuY3Rpb24uCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBEZWxldGUgMzg2LCAyOTAwLCA4NjAsIG1pcHMgMjAwMCwgbWlwcyA0NDAwCi0gCXNwZWNpYWwgY2FzZXMuICBTaW5jZSBpbmZvLT5tYWNoID09IDAuICBUaGUgdGVzdCBtYWNoID09IG51bWJlcgotIAlmYWlscy4KLQkoYmZkX2FyY2hfbGlzdCk6IE5ldyBmdW5jdGlvbiwgcmV0dXJuIG5hbWUgb2YgYWxsIHRoZSBzdXBwb3J0ZWQKLSAJYXJjaGl0ZWN0dXJlcy4KLQotVHVlIFNlcCAgOSAxMDoyMTo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBCcmVhayBhZnRlcgotCWRlY29kaW5nIGFyY2hpdGVjdHVyZS4KLQkodjg1MF9lbGZfcmVsb2MpOiBEbyBub3QgY29tcGxhaW4gaWYgYSBSX1Y4NTBfTE8xNiByZWxvYyBoYXMgYml0Ci0JMTUgc2V0LgotCi1TdW4gU2VwICA3IDEyOjI1OjIyIDE5OTcgIEguSi4gTHUgIChoamxAZ251LmFpLm1pdC5lZHUpCi0KLQkqIGJmZC9lbGY2NC1hbHBoYS5jIChyZWxvY19ob3d0b190eXBlKTogRml4IHRoZSBob3d0byB0YWJsZS4KLQotVGh1IFNlcCAgNCAwOTo0NDoxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LXY4NTAuYy4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBlbGYzMi12ODUwLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogcmVsb2MuYzogUmVtb3ZlIGV4dHJhbmVvdXMgY29tbWFzIGZyb20gcmVsb2NhdGlvbiBlbnRyaWVzLgotCVJlbW92ZSBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBQdXQgWFRZX0NNL1hNQ19URCBzeW1ib2xzCi0JaW4gc2VjdGlvbnMgbmFtZWQgLnRvY2JzcyByYXRoZXIgdGhhbiAuYnNzLgotCi1XZWQgU2VwICAzIDExOjIzOjIzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmgsIGVsZjMyLXY4NTAuYzogUmVtb3ZlZAotCUJGRF9SRUxPQ19WODUwXzE2X1BDUkVMLgotCi1UdWUgU2VwICAyIDIwOjQ0OjEwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IEhhbmRsZSBDX1NZU1RFTSBzeW1zCi0JdGhlIHNhbWUgYXMgQ19FWFQgc3ltcy4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogRGl0dG8uCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERpdHRvLgotCShfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzKTogQWRkIHNhdmVfZ2xvYmFsX3RvX3N0YXRpYy4gIFVzZQotCWl0IHRvIHByZXNlcnZlIGFuZCByZXN0b3JlIHN0YXRlIG9mIGdsb2JhbF90b19zdGF0aWMgZmxhZy4KLQotVHVlIFNlcCAgMiAxNzo0NToyMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX29iamVjdF9wKTogU2V0IG1hY2hpbmUgbnVtYmVyIGJhc2VkIG9uCi0JYml0cyBpbiBlX2ZsYWdzIGZpZWxkIHJhdGhlciB0aGFuIG1hZ2ljIG51bWJlcnMuCi0JKHY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcsIHY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzLAotCXY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSwgdjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwKLQl2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9ucy4KLQotVHVlIFNlcCAgMiAxNzo0Mzo0OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogUmVtb3ZlIFY4NTBFIG1hZ2ljIG51bWJlci4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBSZW1vdmUgVjg1MEVBIG1hZ2ljIG51bWJlci4KLQotVHVlIFNlcCAgMiAxNzozNTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjcHUtYXJjLmMgKGFyY19nZXRfbWFjaCk6IFByb3Blcmx5IHNjYW4gZGVmaW5lZCBtYWNoIGVudHJpZXMuCi0KLVR1ZSBTZXAgIDIgMTg6Mjk6MzcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMjAwLmMgKG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBQQyByZWxhdGl2ZQotCWluc3RydWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIG5vdCB0aGUKLQljdXJyZW50IGluc3RydWN0aW9uLgotCShtbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uKTogU2ltaWxhcmx5LgotCi1UdWUgU2VwICAyIDE1OjQ1OjQ1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwLmM6IFVzZSBhIG1hY3JvIHRvIGNvbnN0cnVjdCBiZmRfYXJjaF9pbmZvX3R5cGUKLQllbnRyaWVzLgotCi0JKiByZWxvYy5jLCBsaWJiZmQuaCwgYmZkLWluMi5oLCBlbGYzMi12ODUwLmM6IFJlcGxhY2UKLQlCRkRfUkVMT0NfVjg1MF97U0RBL1REQS9aREF9X09GRlNFVCByZWxvY3Mgd2l0aCBuZXcgYml0IHBhdHRlcm4KLQlzcGVjaWZpYyB2ZXJzaW9uczogQkZEX1JFTE9DX1Y4NTBfe2FyZWF9X3tiaXRzfV9PRkZTRVQuCi0KLVRodSBBdWcgMjggMTc6MDE6MDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MC5jOiBSZW1vdmUgInBsYWluIiBmcm9tIHY4NTAgcHJpbnRhYmxlIG5hbWUuCi0JKHNjYW4pOiBVc2Ugc3RyY2FzZWNtcC4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfdjg1MCk6IERlZmluZS4KLQotCSogY3B1LXNoLmMgKHNjYW5fbWFjaCk6IENvbXBhcmUgd2l0aCB0YWJsZSBpbnN0ZWFkIG9mIGhhcmR3aXJlZCB0bwotIAlqdXN0IHNoL1NILCB1c2Ugc3RyY2FzZWNtcC4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBlbnRyaWVzIGZvciBzaDMgZXQuYWwuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NoLCAuLi4pOiBEZWZpbmUuCi0KLVdlZCBBdWcgMjcgMTc6MzM6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaHVyZXNfbGlzdCk6IEFsd2F5cyBOVUxMIHRlcm1pbmF0ZSB0aGUgbGlzdC4KLQotVHVlIEF1ZyAyNiAxNzoyNjo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtYXJjLmMuCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZWxmMzItYXJjLmMuCi0JKGVsZjMyLWFyYy5sbyk6IFJlbW92ZSBleHBsaWNpdCBkZXBlbmRlbmN5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IFNldCBFWEVFWFRfRk9SX0JVSUxELgotCSogZG9jL01ha2VmaWxlLmFtIChNS0RPQyk6IFVzZSBFWEVFWFRfRk9SX0JVSUxELCBub3QgRVhFRVhULgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXVnIDI1IDE2OjE0OjM0IDE5OTcgIENocmlzdG9waGVyIFByb3Zlbnphbm8gIDxwcm92ZW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGF0ZXN0IGRldm8gYXV0b2NvbmYgZm9yIE5UIHN1cHBvcnQKLQotTW9uIEF1ZyAyNSAxNjoxMTowNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiBJZiBCIGlzIGEgZGVmYXVsdCB0eXBlLCByZXR1cm4gQS4KLQotTW9uIEF1ZyAyNSAxNTozNTo0NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MC5jIChzY2FuKTogTmV3IGZ1bmN0aW9uLgotCShhcmNoX2luZm9fc3RydWN0KTogTmV3IHN0cnVjdHVyZS4KLQkoYmZkX3Y4NTBfYXJjaCk6IEFkZCBsaW5rIGludG8gYXJjaF9pbmZvX3N0cnVjdHVyZS4KLQotCSogY29uZmlnLmJmZCAodGFyZ19jcHUpOiBBbGwgdjg1MCB2YXJpYW50cyB1c2UgdGhlIGJmZF9hcmNoX3Y4NTAKLQlhcmNoaXRlY3R1cmUuCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3Y4NTBlKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGUuCi0KLQkqIGJmZC1pbjIuaCAoYmZkX21hY2hfdjg1MGUpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZS4KLQotCSogZWxmMzItdjg1MC5jIChFTEZfTUFDSElORV9DT0RFKTogRGVmYXVsdCB0byB2ODUwZSBtYWNoaW5lCi0JbnVtYmVyLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIG1hY2hpbmUgbnVtYmVyLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF92ODUwZWEpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZWEuCi0KLQkqIGJmZC1pbjIuaCAoYmZkX21hY2hfdjg1MGVhKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGVhLgotCi0JKiBlbGYzMi12ODUwLmMgKEVMRl9NQUNISU5FX0NPREUpOiBEZWZhdWx0IHRvIHY4NTBlYSBtYWNoaW5lCi0JbnVtYmVyLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSBtYWNoaW5lIG51bWJlci4KLQotTW9uIEF1ZyAyNSAxNDowNzozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBDbGVhciB0aGUKLSAJY2FjaGVkX3N0YWIgZmllbGQgaWYgdGhlIG9mZnNldCBwcmV2ZW50cyB1cyBmcm9tIHVzaW5nIHRoZSBjYWNoZS4KLQotTW9uIEF1ZyAyNSAxMjowODoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKHZlYykpOiBBZGQgU0VDX0NPREUgYW5kIFNFQ19EQVRBIHRvIHNlY3Rpb24KLQlmbGFncy4KLQkqIGFvdXQtYXJtLmMgKGFvdXRfYXJtX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkoYW91dF9hcm1fYmlnX3ZlYyk6IExpa2V3aXNlLgotCSogYm91dC5jIChiX291dF92ZWNfYmlnX2hvc3QpOiBMaWtld2lzZS4KLQkoYl9vdXRfdmVjX2xpdHRsZV9ob3N0KTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKGFvdXRfbWlwc19saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKGFvdXRfbWlwc19iaWdfdmVjKTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgMTkgMTA6MDk6MTAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAoQ09GRl9BTElHTl9JTl9TRkxBR1MpOiBEZWZpbmUgdG8gMS4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWdub3JlIGluY29taW5nIFNUWVBfSU5GTwotCWJpdCBpbiBzX2ZsYWdzIGlmIENPRkZfQUxJR05fSU5fU19GTEFHUyBpcyBkZWZpbmVkLgotCi1UdWUgQXVnIDE5IDA4OjQ3OjE3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUik6IERlZmluZSB0byAxLgotCShHRVRfU0NOSERSX0FMSUdOLCBQVVRfU0NOSERSX0FMSUdOKTogRGVmaW5lLgotCSogY29mZi1tODhrLmMgKEdFVF9TQ05IRFJfTlJFTE9DLCBHRVRfU0NOSERSX05MTk5PKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBDb25kaXRpb25hbGx5IGNvbXBpbGUgaW4gaWYKLQlDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSIGlzIGRlZmluZWQuICBDb252ZXJ0IGFsaWdubWVudCB0byBwb3dlcgotCW9mIHR3byBmb3IgSTk2MCBvbmx5LgotCSogY29mZnN3YXAuaCAoR0VUX1NDTkhEUl9OUkVMT0MsIFBVVF9TQ05IRFJfTlJFTE9DLCBHRVRfU0NOREhSX05MTk5PLAotCVBVVF9TQ05IRFJfTkxOTk8sIEdFVF9TQ05IRFJfRkxBR1MsIFBVVF9TQ05IRFJfRkxBR1MpOiBQcm92aWRlCi0JZGVmYXVsdCBkZWZpbml0aW9ucy4KLQkoY29mZl9zd2FwX3Njbmhkcl9pbik6IFVzZSBHRVRfU0NOSERSX0ZMQUdTLCBHRVRfU0NOSERSX05SRUxPQywKLQlHRVRfU0NOSERSX05MTk5PLCBhbmQgR0VUX1NDTkhEUl9BTElHTi4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBVc2UgUFVUX1NDTkhEUl9GTEFHUywgUFVUX1NDTkhEUl9BTElHTi4KLQkqIE1ha2VmaWxlLmluIChjb2ZmLXRpYzgwLm8pOiBEZXBlbmRzIHVwb24gY29mZnN3YXAuaC4KLQkqIGNvZmYtdGljODAuYyAoQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUik6IERlZmluZSB0byAxLgotCShHRVRfU0NOSERSX0ZMQUdTLCBQVVRfU0NOSERSX0ZMQUdTKTogRGVmaW5lCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBhbGlnbm1lbnQgZmllbGQgaW4KLSAJc2VjdGlvbiBoZWFkZXIgZm9yIFRJQzgwQ09GRiBmaWxlcy4KLQotTW9uIEF1ZyAxOCAxMTozNjoxOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2hvd3RvX3RhYmxlLCB2ODUwX2VsZl9yZWxvY19tYXAsCi0Jdjg1MF9lbGZfY2hlY2tfcmVsb2NzLCB2ODUwX2VsZl9yZWxvYywKLQl2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogIEFkZCBzdXBwb3J0IGZvcgotCUJGRF9SRUxPQ19WODUwXzE2X1BDUkVMIHJlbG9jYXRpb24uCi0KLQkqIHJlbG9jLmMgKENPTU1FTlQpOiBBZGQgc3V1cG9ydCBmb3IgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwKLQlyZWxvY2F0aW9uLgotCi0JKiBsaWJiZmQuaDogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMIHJlbG9jYXRpb24uCi0KLQkqIGJmZC1pbjIuaDogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMIHJlbG9jYXRpb24uCi0KLU1vbiBBdWcgMTggMTE6MzM6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTBlOiBOZXcgZmlsZS4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLQkqIGJmZC1pbjIuaCAoYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLU1vbiBBdWcgMTggMTE6MzM6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTBlYTogTmV3IGZpbGUuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotCSogYmZkLWluMi5oIChiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotRnJpIEF1ZyAxNSAxMjowMToyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IENvcnJlY3RseSBoYW5kbGUgdGhlIG9mZnNldAotCWFyZ3VtZW50IGFzIHNlY3Rpb24gcmVsYXRpdmUsIHJhdGhlciB0aGFuIGFuIGFic29sdXRlIGFkZHJlc3MuCi0JRnJvbSBKYW4gSG9vZ2VucmFhZCA8aG9vZ2VucmRAbmF0bGFiLnJlc2VhcmNoLnBoaWxpcHMuY29tPi4KLQotRnJpIEF1ZyAxNSAwNDo1ODowMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChhcmMtKi1lbGYqKTogQWRkLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfe2xpdHRsZSxiaWd9YXJjX3ZlYyk6IEFkZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmFtIChBTExfTUFDSElORVMpOiBBZGQgY3B1LWFyYy5sby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItYXJjLmxvLgotCShjcHUtYXJjLmxvLGVsZjMyLWFyYy5sbyk6IEFkZCBydWxlcyBmb3IuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGFyY2h1cmVzLmMgKGFyY2hpdGVjdHVyZSBsaXN0KTogQWRkIGJmZF9hcmNoX2FyYy4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX2FyY19hcmNoLgotCShiZmRfbWFjaF9hcmNfYmFzZSk6IERlZmluZS4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMLEJGRF9SRUxPQ19BUkNfQjI2KTogQWRkLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfe2xpdHRsZSxiaWd9YXJjX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdCk6IEFkZCB0aGVtLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNwdS1hcmMuYywgZWxmMzItYXJjLmM6IE5ldyBmaWxlcy4KLQkqIGVsZi5jIChwcmVfaGVhZGVycyk6IFJlY29nbml6ZSBiZmRfYXJjaF9hcmMuCi0KLVR1ZSBBdWcgMTIgMTE6NDU6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiBubyBzeW1ib2xzLCBtYWtlIHN1cmUgdGhlCi0JZGF0YSBzZWN0aW9uIGlzIGNvcnJlY3RseSByb3VuZGVkIHRvIGEgcGFnZSBpbiB0aGUgZmlsZS4KLQotTW9uIEF1ZyAxMSAxMjo0NTo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGVtaXQgdGhlIHN0cmluZyB0YWJsZSBpZgotCXRoZXJlIGFyZSBubyBzeW1ib2xzLgotCi1TdW4gQXVnIDEwIDE0OjQ1OjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zdGdvMzIuYzogUmVuYW1lIGZyb20gY29mZi1zdHViZ28zMi5jIHRvIGF2b2lkIG9sZCBTeXN0ZW0gVgotCWZpbGUgc3lzdGVtIDE0IGNoYXJhY3RlciBsaW1pdC4KLQkqIE1ha2VmaWxlLmFtLCBjb25maWd1cmUuaW46IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDggMTg6MzQ6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZWxmMzItZDEwdi5jLgotCVJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDYgMTg6NTY6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZG9jZGlyKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBBdWcgIDUgMjM6MDU6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLjEuCi0KLU1vbiBBdWcgIDQgMTI6MDA6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBuZXcgYXV0b21ha2UgcGF0Y2hlcy4KLQotU3VuIEF1ZyAgMyAwODoxNToxMiAxOTk3ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHJzNjAwMC1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uKTogIE5ldyBmdW5jdGlvbiB0byBhZGQgYSBzZWN0aW9uCi0JdG8gdGhlIGNvcmUgZmlsZSBiZmQuCi0JKHJzNjAwMGNvZmZfY29yZV9wKTogIFVzZSBtYWtlX2JmZF9hc2VjdGlvbiB0byBhZGQgdGhlIGNvcmUgZmlsZQotCXNlY3Rpb25zLgotCVVzZSBCRkQgcm91dGluZXMgdG8gc2VlaywgcmVhZCBhbmQgc3RhdCB0aGUgY29yZSBmaWxlLgotCUhhbmRsZSAuZGF0YSBzZWN0aW9ucyBmcm9tIGxvYWRlZCBvYmplY3RzIGFuZCBhbm9ueW1vdXNseSBtbWFwcGVkCi0JcmVnaW9ucywgdGhlc2UgYXJlIGF2YWlsYWJsZSBpbiBBSVggNCBjb3JlIGZpbGVzLgotCi1GcmkgQXVnICAxIDEyOjU4OjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgotCSogYWNpbmNsdWRlLm00OiBNb3ZlIGFjbWFjcm9zLm00IGluIGhlcmUuICBSZW1vdmUgQU1fUFJPR19MSUJUT09MCi0JY29weTsgdXNlIGEgcGF0Y2hlcyBsaWJ0b29sIGluc3RlYWQuCi0JKiBhY21hY3Jvcy5tNDogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEp1bCAzMSAxOTo1NTozNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgotCSogYWNtYWNyb3MubTQ6IE5ldyBmaWxlLCBjb3BpZWQgZnJvbSBvbGQgYWNsb2NhbC5tNC4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlIHNoYXJlZCBsaWJyYXJ5Ci0JaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlIEFDX0NPTkZJR19IRUFERVIgd2l0aAotCUFNX0NPTkZJR19IRUFERVIuICBSZXBsYWNlIEFDX1BST0dfSU5TVEFMTCB3aXRoIEFNX1BST0dfSU5TVEFMTC4KLQlDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwgQU1fQ1lHV0lOMzIsIGFuZCBBTV9FWEVFWFQuICBDaGFuZ2UgYWxsCi0JLm8gZmlsZXMgdG8gLmxvLiAgUmVtb3ZlIHN0YW1wLWggaGFuZGxpbmcgaW4gQUNfT1VUUFVULgotCSogYWNjb25maWcuaDogTWVudGlvbiBQQUNLQUdFIGFuZCBWRVJTSU9OLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBkZXAtaW4uc2VkOiBDaGFuZ2UgLm8gdG8gLmxvLgotCSogTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTm93IGJ1aWx0IHdpdGggYWNsb2NhbC4KLQkqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCSogVkVSU0lPTjogUmVtb3ZlLgotCi1UaHUgSnVsIDMxIDEyOjA5OjIwIDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldCBURVhUUkVMCi0gCWlmIHRoZXJlIGlzIG9ubHkgYSByZWxvY2F0aW9uIHRvIGEgcmVhZC1vbmx5IGJ1dCBub3QgYWxsb2NhdGFibGUKLSAJc2VjdGlvbiAobGlrZSAuc3RhYikuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBDb3JyZWN0IHZhcmlvdXMgY29tbWVudHMuCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogVGhlc2Ugc2VjdGlvbnMgYXJlIG5vdAotCWNyZWF0ZWQgYnkgdGhlIGxpbmtlciAodGhhdCBpcywgdGhleSBhcmUgY3JlYXRlZCBieSB0aGUgdXNlcgotCXB1dHRpbmcgZGF0YSBpbiB0aGVtKS4gSW4gcGFydGljdWxhciwgdGhleSBjYW4gYmUgdGhlIHNvdXJjZQotCWFuZCB0YXJnZXQgb2YgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2hlY2sgcG9zdGNvbmRpdGlvbiBvZgotIAliZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wuICBBbGlnbiAxNi1ieXRlIGNvbW1vbgotIAlvYmplY3RzIChmb3IgaW5zdGFuY2UsICdsb25nIGRvdWJsZScpIHRvIDE2LWJ5dGUgYm91bmRhcmllcy4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBNYWtlIHRoZSBjb2RlIHRoYXQgZ2VuZXJhdGVzCi0Jc2VjdGlvbiBzeW1ib2xzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yIHNwYXJjLCByZWR1Y2luZyB0aGUKLQludW1iZXIgb2Ygc2VjdGlvbiBzeW1ib2xzIG91dHB1dC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBDaGVjayBwb3N0Y29uZGl0aW9uIG9mCi0JYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sLiAgTWFrZSBkZWZhdWx0IGNhc2UgdGhlCi0Jc2FtZSBhcyBjb3JyZXNwb25kaW5nIGNvZGUgZm9yIHNwYXJjLCBmaXhpbmcgYnVnIGludm9sdmluZwotCS5yZWxhLnN0YWJzLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpeCBjYXNlIGludm9sdmluZyBHT1Qgc3ltYm9scwotIAlmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiB2ZXJzaW9uaW5nIChieSByZXBsaWNhdGluZwotIAljb3JyZXNwb25kaW5nIGNoYW5nZSBpbiBzcGFyYykuICBUcmVhdCBSX1BQQ19SRUxBVElWRSBSRUxBIHJlbG9jcwotIAlhcyB1c3VhbCBpbiBFTEYsIG5vdCBhcyBwc2V1ZG8tUkVMIHJlbG9jcyAoYXMgdGhlIHNwYXJjIGxpbmtlcgotIAlkb2VzKS4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIGhhbmR5IGRlYnVnZ2luZyBjb2RlIGZvciB3aGVuCi0gCWFzc2VydGlvbiBmYWlscy4gIEFkZCBzb21lIG1vcmUgJ3N5bWJvbCBtYWRlIGxvY2FsIGJlY2F1c2Ugb2YKLSAJdmVyc2lvbmluZycgY2FzZXMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3BlIHdpdGggYWRkZW5kIHdoZW4KLQlwcm9jZXNzaW5nIGEgR09UIHJlbG9jYXRpb24gYXMgcmVxdWlyZWQgYnkgQUJJLgotCi1XZWQgSnVsIDMwIDIxOjMwOjM1IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IFJlbW92ZSBhbnkKLQl2ZXJzaW9uIGluZm8gaWYgdGhpcyBzeW1ib2wgY2FtZSBmcm9tIGEgZHluYW1pYyBvYmplY3QuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCB0aGUgdmVyc2lvbiBpbmZvIG9mIGEgc3ltYm9sCi0Jb25seSBpZiB0aGUgb2JqZWN0IGFjdHVhbGx5IGNvbnRhaW5zIHZlcnNpb24gZGVmaW5pdGlvbnMgYW5kCi0JZGVmaW5lcyB0aGlzIHN5bWJvbC4KLQotTW9uIEp1bCAyOCAxODowNzo0MyAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBBZGQgQ1lHV0lOIGFuZCBFWEVFWFQgYXV0b2NvbmYgbWFjcm9zLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogVXNlIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3JvIHRvIGxvb2sgZm9yCi0gICAgICAgIHdpbjMyIGRlcGVuZGVuY2llcy4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xMi4KLSAgICAgICAgKiBkb2MvTWFrZWZpbGUuaW46IEFkZCAkKEVYRUVYVCkgdG8gY2hldyBleGVjdXRhYmxlLgotCi1Nb24gSnVsIDI4IDAyOjUwOjI5IDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgSWYgQ09SRV9UUlVOQyBpcyBzZXQsIHByaW50Ci0JYSB3YXJuaW5nIHJhdGhlciB0aGFuIHJldHVybmluZyBhbiBlcnJvci4KLQotU3VuIEp1bCAyNyAxOTo1NDoxNCAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBhZGQgc2VtaWNvbG9uIHRvIG1ha2UgTVNWQyBoYXBweS4KLQotRnJpIEp1bCAyNSAxNDo1MDowOCAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNpc2NvLWNvcmUuYzogZGVmaW5lIHNpZ25hbHMgZm9yIHdpbmdkYi4KLQotRnJpIEp1bCAyNSAxNjoyNzowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IE9ubHkgbWVyZ2UgZmlsZXMgd2l0aAotCXRoZSBzYW1lIG51bWJlciBvZiBhdXggZW50cmllcy4KLQotRnJpIEp1bCAyNSAwODoyMjoxNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IFVzZSBSX0RBVEFfRVhQUiBmb3IgdGhlCi0JZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpZiB0aGUgcmVsb2NhdGlvbiBzaXplIGlzIDMyIGJpdHMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9EQVRBX0VYUFIuCi0KLVdlZCBKdWwgMjMgMTY6MDg6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogRG9uJ3Qgb2Zmc2V0IGEgY29tbW9uIHN5bWJvbCBieQotCWl0cyB2YWx1ZSBpZiBDT0ZGX1dJVEhfUEUgaXMgZGVmaW5lZC4KLQotVHVlIEp1bCAyMiAxNzoxOTo0NSAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGNvZmYtc3R1YmdvMzIuYzogTmV3IGZpbGUuCi0JKiBnbzMyc3R1Yi5oOiBOZXcgZmlsZS4KLQkqIGNvZmYtaTM4Ni5jOiBJZiBDT0ZGX0dPMzJfRVhFLCBpbmNsdWRlIGNvZmYvZ28zMmV4ZS5oLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBJbnZva2UKLQlDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BSRSBhbmQgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QT1NUIGlmIHRoZXkKLQlhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogSW52b2tlIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9hdXhfaW4pOiBJbnZva2UgQ09GRl9BREpVU1RfQVVYX0lOX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IEludm9rZSBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX3Njbmhkcl9pbik6IEludm9rZSBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUFJFIGFuZAotCUNPRkZfQURKVVNUX1NDTkhEUl9JTl9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogSW52b2tlIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFIGFuZAotCUNPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCSogdGFyZ2V0cy5jIChnbzMyc3R1YmJlZGNvZmZfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgZ28zMnN0dWJiZWRjb2ZmX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAoZ28zMmNvZmZfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKGdvMzJzdHViYmVkY29mZl92ZWMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKTogTmV3IHRhcmdldC4KLQkoaVszNDU2XTg2LSotZ28zMiopOiBDaGFuZ2UgdG8gYmUgbGlrZSBuZXcgbXNkb3NkamdwcCouCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXN0dWJnbzMyLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBjb2ZmLXN0dWJnbzMyLmMuCi0JKEhGSUxFUyk6IEFkZCBnbzMyc3R1Yi5oLgotCi1UdWUgSnVsIDIyIDE1OjA5OjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgZmRvcGVuLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDaGVjayBIQVZFX0ZET1BFTiByYXRoZXIgdGhhbiBWTVMgb3IKLQlfX0dPMzJfXy4gIFJlaW5kZW50IGEgYml0LgotCi1TdW4gSnVsIDIwIDIwOjA1OjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgU0VDX0xJTktFUl9DUkVBVEVECi0JZmxhZyBmb3IgbmV3bHkgY3JlYXRlZCBzZWN0aW9ucy4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRpc2NhcmQgbmV3bHkgY3JlYXRlZCBzZWN0aW9ucwotCWlmIHNoYXJlZCBsaWJyYXJ5IGlzIGR5bm9iai4KLQotTW9uIEp1bCAxNCAxNTozMzo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBXaGVuIGNoZWNraW5nIHdoZXRoZXIKLQlpbmNsdWRpbmcgYSBzZWN0aW9uIGluIGEgc2VnbWVudCB3b3VsZCBmb3JjZSB1cyB0byBza2lwIGEgcGFnZSwKLQlhbGlnbiB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBzZWdtZW50IHRvIGF2b2lkIHdyYXBhcm91bmQKLQlwcm9ibGVtcy4KLQotVHVlIEp1bCAgOCAxMjoxMToyOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbml0aWFsaXplCi0gCXRhcmdldCBpZCBmaWVsZCB0byBUSUM4MF9UQVJHRVRfSUQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBTd2FwIG91dCB0YXJnZXQgaWQgZmllbGQKLSAJaWYgdXNlZC4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBTd2FwIGluIHRhcmdldCBpZCBmaWVsZCBpZiB1c2VkLgotCi1Nb24gSnVsICA3IDE2OjQxOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbgotCWlmIFRBUkdFVF9VTkRFUlNDT1JFLgotCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lIGlmIFRBUkdFVF9VTkRFUlNDT1JFLgotCShpMzg2Y29mZl92ZWMpOiBBZGQgU0VDX0NPREUgYW5kIFNFQ19EQVRBIHRvIHNlY3Rpb25fZmxhZ3MuCi0KLU1vbiBKdW4gMzAgMTQ6Mjk6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tNjhrLmMgKGhvd3RvX3RhYmxlKTogVXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBub3QKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGZvciAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLVRodSBKdW4gMjYgMDE6MjY6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdoZW4gYSB2ZXJzaW9uCi0JaW5kaXJlY3Rpb24gc3ltYm9sIGlzIG92ZXJyaWRkZW4sIG1ha2UgdGhlIG9yaWdpbmFsIHN5bWJvbCBwb2ludAotCWF0IHRoZSByZWFsIG92ZXJyaWRpbmcgc3ltYm9sLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbik6IENoZWNrIGZvciBhbiBpbnZhbGlkCi0Jc3RyaW5nIGluZGV4LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBVc2UgdGhlIHJpZ2h0IHNlY3Rpb24gZm9yIGEKLQljb21tb24gc3ltYm9sLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IElmIGEgY29tbW9uCi0Jc3ltYm9sIHdhcyBpbiAuc2NvbW1vbiwgbWFyayBpdCBhcyBTSE5fTUlQU19TQ09NTU9OLgotCi1XZWQgSnVuIDI1IDEyOjQzOjEwIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbHMpOiBSZXNvbHZlIGluZGlyZWN0IGFuZCB3YXJuaW5nCi0Jc3ltYm9scyBiZWZvcmUgY2hlY2tpbmcgZm9yIG5ldyBzeW1ib2xzLgotCi0JKiBlbGZjb3JlLmggKGVsZl9jb3JlZmlsZV9ub3RlKTogTW92ZSBvdXQgb2YgSEFWRV9TWVNfUFJPQ0ZTX0guCi0KLVR1ZSBKdW4gMjQgMTE6MjA6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfb2JqZWN0X3ApOiBSZWFkIHRoZSBmX29wdGhkciBieXRlcyBmcm9tIHRoZQotCWZpbGUsIG5vdCBhb3V0c3ogYnl0ZXMgKHRoZXkgYXJlIGRpZmZlcmVudCBpbiBYQ09GRiAubyBmaWxlcykuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUGVybWl0IHN5bWJvbHMgdG8gYmUKLQlyZWRlZmluZWQgYnkgb2JqZWN0cyBpbmNsdWRlZCBmcm9tIGFyY2hpdmVzLgotCi1Nb24gSnVuIDIzIDE4OjAzOjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogSW4gdGhlIGNhc2Ugb2YgYSBuZXcgZGVmaW5lZAotCXN5bWJvbCBvdmVycmlkaW5nIGFuIG9sZCBkZWZpbmVkIHN5bWJvbCwgcmV0dXJuIHRoZSBoYXNoIHRhYmxlCi0JZW50cnkgd2hpY2ggd2UgbW9kaWZ5LCBldmVuIGlmIGl0IGlzIHRoZSB0YXJnZXQgb2YgYW4KLQlpbmRpcmVjdGlvbi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgdGhlIHJlYWwgbmFtZSBvZiB0aGUgc3ltYm9sIGdldHMKLQlvdmVycmlkZGVuLCBjb252ZXJ0IHRoZSB2ZXJzaW9uZWQgc3ltYm9sIGludG8gYW4gaW5kaXJlY3Qgc3ltYm9sCi0JdG8gdGhlIHJlYWwgc3ltYm9sLgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYWxsIGl0LgotCi1TdW4gSnVuIDIyIDE5OjQwOjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGkzY29mZl9vYmplY3RfcCk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwgaGFjayB0bwotCWhhbmRsZSBjYXNlIHdoZXJlIENPRkYgZmlsZWhkciBkb2VzIG5vdCBpbW1lZGlhdGVseSBmb2xsb3cgUEUKLQloZWFkZXIuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfb2JqZWN0X3ApOiBSZW1vdmUgdXNlbGVzcyBzZWVrIHRvIGN1cnJlbnQKLQlsb2NhdGlvbi4KLQotV2VkIEp1biAxOCAxOTowMzozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChsaW5rX2FjdGlvbik6IENoYW5nZSBDT01NT05fUk9XL2luZHIgdG8gZnJvbSBDUkVGIHRvCi0JUkVGQy4KLQotVHVlIEp1biAxNyAxMTo1NTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IElmIHN0cmlwcGluZyBkZWJ1Z2dpbmcKLQlzeW1ib2xzLCBza2lwIE5fQUJTIHN5bWJvbHMgd2l0aCBkZWJ1Z2dpbmcgc3RvcmFnZSBjbGFzc2VzLgotCi1Nb24gSnVuIDE2IDE4OjU2OjI3IDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBlbWl0IFJfUFBDX1JFTCoKLQlyZWxvY3MgaW4gc2hhcmVkIGxpYnJhcmllcyB3aGljaCByZWZlciB0byBsb2NhbCBzeW1ib2xzLiAgQ29wZQotCXdpdGggYWRkZW5kIHdoZW4gcHJvY2Vzc2luZyBhIEdPVCByZWxvY2F0aW9uLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGNyZWF0ZSBzeW1ib2xzCi0JZm9yIHNlY3Rpb25zIHRoYXQgdGhlIGxpbmtlciBkaWRuJ3QgY3JlYXRlLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSB0cnkgdG8gd3JpdGUgb3V0IGEgc2VjdGlvbgotCXN5bWJvbCBpZiBpdCB3YXMgY3JlYXRlZCBpbiBwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29tcGxhaW4gaWYgd2UgaGF2ZSB0byBnZW5lcmF0ZSBhIHJlbG9jCi0JcmVsYXRpdmUgdG8gYSBzZWN0aW9uIGZvciB3aGljaCB3ZSBkaWRuJ3Qgb3V0cHV0IGEgc3ltYm9sLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDbGVhbiB1cC4gIFBMVAotCXJlbG9jcyBhcmUgJ3JlbGEnIHJlbG9jcywgbGlrZSBldmVyeXRoaW5nIGVsc2UuICAucmVsYS5wbHQgaXMgbm90Ci0JYSByZWFkLW9ubHkgc2VjdGlvbiwgc28gd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWFsLWNhc2UgaXQuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEVudHJpZXMgaW4gdGhlCi0JLnJlbGEuYnNzIHNlY3Rpb24gYXJlIChvZiBjb3Vyc2UpICdyZWxhJyByZWxvY3Mgbm90ICdyZWwnIHJlbG9jcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogSW5pdGlhbGlzZSBzcmVsZ290LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBAZ290IG9mZnNldHMgYXJlIDQgZnJvbSBzdGFydCBvZiB0aGUKLQlhY3R1YWwgLmdvdCBzZWN0aW9uLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBUaGUgdGhyZWUgcmVzZXJ2ZWQKLQl3b3JkcyBzdGFydCBmcm9tIHRoZSBzeW1ib2wgJ19HTE9CQUxfT0ZGU0VUX1RBQkxFXycuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6ICcucmVsYScgaXMgNQotCWNoYXJhY3RlcnMsIG5vdCA0LgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBVc2UKLQlfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gdG8gY3JlYXRlIHRoZSBHT1QgcmF0aGVyIHRoYW4KLQlwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbi4gQ3JlYXRlIHRoZSAnLnJlbGEuZ290JyBzZWN0aW9uCi0Jb3Vyc2VsdmVzLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFNldCB1cCBHT1QgcmVsb2NhdGlvbnMgd2hlbiBhCi0Jc3ltYm9sIGhhcyBhIEdPVCBlbnRyeS4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVjb3JkIHdoZW4gYSBzeW1ib2wgaXMgdXNlZCB0aHJvdWdoCi0JdGhlIEdPVCwgYW5kIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBHT1QgZm9yIGVhY2ggc3VjaCBzeW1ib2wuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRGVsZXRlIHVudXNlZCAuZ290LnBsdCBzdHVmZi4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBEZWxldGUgdW51c2VkIExJTktFUl9TRUNUSU9OX0dPVAotCXN0dWZmLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBHT1QxNl9IQSByZWxvY3Mgc2hvdWxkIGJlCi0JdHJlYXRlZCBpbiBhIHNpbWlsYXIgd2F5IHRvIEFERFIxNl9IQSByZWxvY3MuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFBMVFJFTDI0IHJlbG9jcyBkbyBub3QgZ2V0IGNvcGllZCBpbnRvCi0Jc2hhcmVkIG9iamVjdHM7IHRoZSBsaW5rZXIgbXVzdCBkZWFsIHdpdGggdGhlbS4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBTdG9wIHNldHRpbmcKLQlfR0xPQkFMX09GRlNFVF9UQUJMRV8gdG8gdGhlIHdyb25nIHZhbHVlOyBkZWxldGUgdW51c2VkCi0JTElOS0VSX1NFQ1RJT05fUExUIHN0dWZmLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IERlbGV0ZSB1bnVzZWQgTElOS0VSX1NFQ1RJT05fUExUIHN0dWZmLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogVXNlIEJGRCBjYWxscyB0byBnZXQgR09UCi0Jc2VjdGlvbiwgbm90IEVMRi1zcGVjaWZpYyBjYWxscy4KLQkoZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQpOiBTZXQgdG8gMS4KLQkoZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQpOiBTZXQgdG8gNC4KLQkqIGVsZi1iZmQuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCAncGx0X25vdF9sb2FkZWQnIG1lbWJlcgotCWZvciB3aGVuIGxkLnNvIGZpbGxzIGluIHRoZSBQTFQ7IGFuZCAnZ290X3N5bWJvbF9vZmZzZXQnIG1lbWJlci4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBBcHBseQotCXBsdF9ub3RfbG9hZGVkIG1lbWJlci4KLQkoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogQXBwbHkgZ290X3N5bWJvbF9vZmZzZXQuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQpOiBTZXQgZGVmYXVsdCB0bwotCSdsb2FkZWQnLgotCShlbGZfYmFja2VuZF9HX09fVF9vZmZzZXQpOiBTZXQgZGVmYXVsdCB0byAwLgotCShlbGZOTl9iZWQpOiBTZXQgYWRkZWQgZmllbGRzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBXYXMgc2V0dGluZwotCURUX1JFTEVOVCBpbiBzaGFyZWQgb2JqZWN0czsgc2hvdWxkIGJlIERUX1JFTEFFTlQuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQcm9wYWdhdGUKLQlSX1BQQ19BRERSMTZfSEEgcmVsb2NzIHRvIHNoYXJlZCBvYmplY3RzLiBDb3BlIHdpdGggY2FzZSB3aGVyZQotCXN1Y2ggYSByZWxvYyAoaW4gYSBub24tc2hhcmVkIG9iamVjdCkgcmVmZXJzIHRvIGEgc3ltYm9sIHRoYXQncwotCW5vdCBkZWZpbmVkLgotCi1Nb24gSnVuIDE2IDE0OjQyOjE0IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGVsZmNvZGUuaCAocHV0X3NpZ25lZF93b3JkKTogRGVmaW5lLgotCShnZXRfc2lnbmVkX3dvcmQpOiBEZWZpbmUuCi0JKGVsZl9zd2FwX3JlbG9jYV9pbik6IFVzZSBnZXRfc2lnbmVkX3dvcmQgZm9yIHRoZSByX2FkZGVuZCBmaWVsZC4KLQkoZWxmX3N3YXBfcmVsb2NhX291dCk6IFVzZSBwdXRfc2lnbmVkX3dvcmQgZm9yIHRoZSByX2FkZGVuZAotCWZpZWxkLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBVc2UKLQliZmRfZ2V0X3NpZ25lZF8zMiB0byBzZXQgdGhlIHJfYWRkZW5kIGZpZWxkLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX2luKTogVXNlCi0JYmZkX2hfZ2V0X3NpZ25lZF82NCB0byBzZXQgdGhlIHJfYWRkZW5kIGZpZWxkLgotCi1Nb24gSnVuIDE2IDEyOjMxOjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogV2hlbiBnZW5lcmF0aW5nIGEKLQlzaGFyZWQgbGlicmFyeSwgZG8gdGhlIHJlbG9jYXRpb24gaWYgdGhlIGlucHV0IHNlY3Rpb24gaXMgbm90Ci0JYWxsb2NhdGVkIGluIG1lbW9yeS4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENhbGwKLQllbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24gYmVmb3JlIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wuCi0JKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDYWxsIGVsZl9maXhfc3ltYm9sX2ZsYWdzLgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBMaWtld2lzZS4gIFBlcm1pdCBhIHN5bWJvbCB0byBiZQotCWZvcmNlZCBsb2NhbCBldmVuIGlmIE5FRURTX1BMVCBpcyBzZXQuICBXaGVuIGZvcmNpbmcgYSBzeW1ib2wgdG8KLQliZSBsb2NhbCwgY2xlYXIgTkVFRFNfUExULgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBiZWQuCi0KLVdlZCBKdW4gMTEgMjI6NDQ6MjAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KTogTmV3IHN0cnVjdHVyZQotCWZvciBkZXJpdmVkIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgUmVmZXJlbmNlcyB0bwotCWVsZl9saW5rX2hhc2hfZW50cnkgY2hhbmdlZCBhcHByb3ByaWF0ZWx5LgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSk6IE5ldyBzdHJ1Y3R1cmUgZm9yIGRlcml2ZWQgZWxmCi0JbGlua2VyIGhhc2ggdGFibGUuCi0JKGVsZjMyX21uMTAzMDBfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdHJhdmVyc2UpOiBMaWtld2lzZS4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkpOiBMaWtld2lzZS4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSAiY2FsbCIgLT4gImNhbGxzIiwgcmVtb3ZhbAotCW9mIHByb2xvZ3VlIGNvZGUsIGFuZCBjYWxsOjMyLT5jYWxsOjE2IHJlbGF4aW5nLgotCShjb21wdXRlX2Z1bmN0aW9uX2luZm86IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9pbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlZmluZS4KLQotV2VkIEp1biAxMSAwMDowMDowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IENhbGwgZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0JZm9yIGEgc3ltYm9sIHdoaWNoIGlzIGJlaW5nIGZvcmNlZCB0byBiZSBsb2NhbC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFdyaXRlIG91dCB0aGUKLQlyZWxvY2F0aW9uIHZhbHVlIGZvciBhIEdPVCByZWxvYyBmb3IgYSBzeW1ib2wgd2hpY2ggaXMgdHVybmluZwotCWludG8gYSBsb2NhbCBzeW1ib2wuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIGlzIHR1cm5pbmcgaW50byBhCi0JbG9jYWwgc3ltYm9sLCB3cml0ZSBvdXQgYSBSRUxBVElWRSByZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUCi0JcmVsb2MuCi0JKiBlbGYzMi1tNjhrLmMsIGVsZjMyLXNwYXJjLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogR2V0IHRoZSByZWxvY2F0aW9uCi0JdmFsdWUgaWYgdGhlIHN5bWJvbCBpcyB0dXJuaW5nIGludG8gYSBsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotMTk5Ny0wNi0xMCAyMjo1OCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQWxzbyByZWFkIHZlcm5lZWQKLQlpbmZvcm1hdGlvbiBieSBjYWxsaW5nIGBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcycuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEZvciB1bmRlZmluZWQgc3ltYm9scyBsb29rIGZvcgotCXZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIHZlcm5lZWQgcmVjb3Jkcy4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIHNvbmFtZSBvZiBzaGFyZWQgb2JqZWN0Ci0JZm9yIHZlcm5lZWQgcmVjb3JkIGlmIGl0IGlzIGF2YWlsYWJsZS4KLQotVHVlIEp1biAxMCAxMToxMzowMyAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjcHUtYXJtLmM6IEFkZCBwcm90b3R5cGVzIGZvciBjb21wYXRpYmxlIGFuZCBzY2FuLgotCSogY29mZmxpbmsuYzogQWRkIHByb3RvdHlwZSBmb3IgbWFya19yZWxvY3MuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUpOiBDaGFuZ2UgZmlsZW5hbWUgdG8KLQljb25zdCBwb2ludGVyLiAgQWRkIHByb3RvdHlwZS4KLQotTW9uIEp1biAgOSAxMjozNDoyMSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZ25vcmUgcmVsb2NhdGlvbnMgb2YKLQlzZWN0aW9ucyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkLgotCi0xOTk3LTA2LTA2IDIyOjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzKTogV2hlbiBzZWFyY2hpbmcKLQlmb3Iga25vd24gdmVyc2lvbiBzeW1ib2wgc2tpcCBub24tbWF0Y2hpbmcgdmVyZGVmIHJlY29yZHMsIG5vdAotCW1hdGNoaW5nIHJlY29yZHMuCi0KLVRodSBKdW4gIDUgMTU6NTI6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogV3JpdGUgYSBsb25nLAotCW5vdCBhIGJmZF92bWEsIHRvIHRoZSBiYXNlIGZpbGUsIHRvIG1hdGNoIGhvdyBkbGx0b29sIHJlYWRzIGl0LgotCi1UdWUgSnVuICAzIDE2OjU3OjQ1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCB0aHVtYiByZWxvY2F0aW9ucy4KLQotCSogYmZkLWluMi5oOiBBZGQgVGh1bWIgcmVsb2NhdGlvbnMuCi0KLQkqIGxpYmJmZC5oOiBBZGQgVGh1bWIgcmVsb2NhdGlvbnMuCi0KLU1vbiBKdW4gIDIgMTA6NDE6NTIgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNwdS1tNjhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBGaXggNjgwNjAgY3B1IG5hbWUuCi0KLUZyaSBNYXkgMzAgMTI6NDY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgZHluaW5keAotCWZvciBhIHNlY3Rpb24gZXZlbiBpZiBpdCBpcyBub3QgbG9hZGVkLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiBQRSBmaWxlLCBkb24ndCBzdWJ0cmFjdAotCXNlY3Rpb24gVk1BLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBTZXBhcmF0ZSBzZWN0aW9uIFZNQSBoYW5kbGluZyBmb3IKLQlpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgd2hldGhlciBpbnB1dCBmaWxlLAotCW5vdCBvdXRwdXQgZmlsZSwgaXMgYSBQRSBmaWxlLgotCi1XZWQgTWF5IDI4IDE1OjQ4OjQzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IChjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBNYWtlIHN0YXRpYy4KLQotV2VkIE1heSAyOCAxNjoxNjowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBEb24ndCBqdXN0IGV4aXQgaWYgd2Ugc2VlIGFuCi0JUl9JTUFHRUJBU0UgcmVsb2MuCi0KLVdlZCBNYXkgMjggMDk6NDg6NDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogQWRkIHRlc3QgZm9yIHN1cGVyc2V0cyBvZiBBUk0KLQlhcmNoaXRlY3R1cmVzLgotCi1UdWUgTWF5IDI3IDE5OjQyOjAzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEluaXRpYWxpemUgZ2xvYmFsX3RvX3N0YXRpYwotCW1lbWJlci4KLQotVHVlIE1heSAyNyAxNDozNDowOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBNYWtlIGdsb2JhbC4gIEl0IGlzCi0JY2FsbGVkIGRpcmVjdGx5IGJ5IGdhcy9jb25maWcvdGMtYXJtLmMuCi0KLVR1ZSBNYXkgMjcgMTU6NTg6NTMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKFBMVF9FTlRSWV8qKTogVXNlIGEgbmV3IHRocmVhZC1zYWZlIGZvcm1hdC4KLQkoZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRmlsbCBpdCBpbiBwcm9wZXJseS4KLQotTW9uIE1heSAyNiAxNDowNToxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBQRSBmaWxlLCBkb24ndCBhZGQKLQlzZWN0aW9uIFZNQS4KLQotTW9uIE1heSAyNiAxMDo1Nzo0OCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogI3VuZGVmIGJlZm9yZSAjZGVmaW5lLgotCShjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEaXR0by4KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTWFrZSBzdGF0aWMuCi0JKGNvZmZfYXJtX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGl0dG8uCi0JKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IERpdHRvLgotCShjb2ZmX2FybV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGl0dG8uCi0KLUZyaSBNYXkgMjMgMTU6MTQ6NTggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvKTogQWRkIGJvb2xlYW4KLQlnbG9iYWxfdG9fc3RhdGljIG1lbWJlciBmb3Igc3VwcG9ydCBvZiB0YXNrIGxpbmtpbmcuCi0JKF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMpOiBBZGQgcHJvdG90eXBlLgotCSogbGliY29mZi5oOiBSZWdlbmVyYXRlLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgI2lmZGVmIHRvCi0JY2hlY2sgUlM2MDAwQ09GRl9DLCB0byBiZSBjb25zaXN0ZW50IHdpdGggYWxsIG90aGVyIHVzZXMKLQlpbiB0aGlzIGZpbGUuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IElmIGRvaW5nIHRhc2sgbGlua2luZywKLQljYWxsIF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IElmIGRvaW5nIHRhc2sgbGlua2luZywgY29udmVydAotCWdsb2JhbCBmdW5jdGlvbnMgdG8gc3RhdGljLgotCShfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSk6IElmIGRvaW5nIHRhc2sgbGlua2luZywgY29udmVydAotCWdsb2JhbCB2YXJpYWJsZXMgdG8gc3RhdGljLgotCShfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzKTogTmV3IGZ1bmN0aW9uLgotCSogY29mZi10aWM4MC5jIChUSUM4MENPRkYpOiBEZWZpbmUgdGhpcyBpbnN0ZWFkIG9mIGp1c3QgVElDODAuCi0JKENfQVVUT0FSRyk6ICN1bmRlZiBzaW5jZSBpdCBjbGFzaGVzIHdpdGggQ19VRVhULgotCShDX0xBU1RFTlQpOiAjdW5kZWYgc2luY2UgaXQgY2xhc2hlcyB3aXRoIENfU1RBVExBQi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIFRJQzgwQ09GRgotCXJhdGhlciB0aGFuIFRJQzgwLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBDX1NZU1RFTS4gIEhpZGUgQ19BVVRPQVJHIHVzZQotCXdoZW4gVElDODBDT0ZGIGRlZmluZWQgKGNsYXNoZXMgd2l0aCBDX1VFWFQpLiAgRXhwbGljaXRseQotCXJlY29nbml6ZSBDX1VFWFQsIENfU1RBVExBQiwgYW5kIENfRVhUTEFCIGFzIHVuc3VwcG9ydGVkLgotCi1GcmkgTWF5IDIzIDEyOjM4OjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MF9ob3d0b190YWJsZSk6IENoYW5nZSBvdmVyZmxvdyBjaGVjayBmb3IgbW9zdAotCVBQIHJlbG9jYXRpb25zIHRvIGNvbXBsYWluX292ZXJmbG93X2RvbnQuCi0KLVRodSBNYXkgMjIgMjA6MjI6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwX2hvd3RvX3RhYmxlKTogQWRkIFBQIHJlbG9jYXRpb25zLiAgQ2hhbmdlCi0JbmFtZSBvZiBSX1JFTExPTkcgdG8gIlJFTExPTkciLiAgU2V0IHJpZ2h0c2hpZnQgYW5kIGNvbXBsYWluIGZvcgotCU1fUFBDUi4KLQkocHBiYXNlX3JlbG9jLCBnbG9iMTVfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoZ2xvYjE2X3JlbG9jLCBsb2NhbDE2X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHJ0eXBlMmhvd3RvKTogSGFuZGxlIGFsbCByZWxvY2F0aW9uIHR5cGVzLgotCShjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUgdG8gY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uLgotCSogTWFrZWZpbGUuaW4gKGNvZmYtdGljODAubyk6IERlcGVuZHMgdXBvbiBpbmNsdWRlL2NvZmYvdGljODAuaC4KLQotV2VkIE1heSAyMSAxNzoxNTo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgQ09GRl9XSVRIX1BFIG9yCi0JQ09GRl9JTUFHRV9XSVRIX1BFLCBkb24ndCBzdWJ0cmFjdCB0aGUgc2VjdGlvbiBWTUEgZnJvbSB0aGUgc3ltYm9sCi0JdmFsdWUuCi0JKiBjb2ZmZ2VuLmMgKGZpeHVwX3N5bWJvbF92YWx1ZSk6IEFkZCBhYmZkIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgSWYgUEUgZmlsZSwgZG9uJ3QgYWRkIHNlY3Rpb24gVk1BLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IElmIFBFIGZpbGUsIGRvbid0IGFkZCBzZWN0aW9uIFZNQS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHBlaWNvZGUuaDogQWRkICYgMHhmZmZmZmZmZiB3aGVuIHVzaW5nIEltYWdlQmFzZSBpbiBjYXNlIGJmZF92bWEKLQlpcyA2NCBiaXRzLgotCi1XZWQgTWF5IDIxIDA5OjU4OjEwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKG1hcmtfcmVsb2NzKTogQWRkIG5ldyBmdW5jdGlvbiB0byBtYXJrIHN5bWJvbHMgd2hpY2gKLQlhcmUgdXNlZCBieSByZWxvY2F0aW9ucy4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogQWRkIGNhbGwgdG8gbWFya19yZWxvY3MoKSBhbmQgY29kZSB0bwotCXN1cHByZXNzIHRoZSBza2lwcGluZyBvZiBzeW1ib2xzIHRoYXQgaGF2ZSB0aHVzIGJlZW4gbWFya2VkLgotCi1UdWUgTWF5IDIwIDE4OjQ1OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9tZXJnZV9wcml2YXRlX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCi1Nb24gTWF5IDE5IDE0OjQ2OjAwIDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jOiBSZW1vdmUgdW5uZWNlc3NhcnkgI2lmZGVmcy4KLQkqIGNvbmZpZy5iZmQ6IFNldCB0YXJnX3VuZGVyc2NvcmUgdG8geWVzIGZvciB0aWM4MC4KLQotTW9uIE1heSAxOSAxNDoyNjozNiAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAoTkFNRVNfSEFWRV9VTkRFUlNDT1JFKTogRGVmaW5lIChmaXhlcyBwcm9ibGVtCi0Jd2l0aCB1bnJlc29sdmVkIGV4dGVybmFsIHN5bWJvbHMgaW4gR0RCKS4KLQotRnJpIE1heSAxNiAxMDoyMzowMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9yZWxheF9zZWN0aW9uKTogUmVhZCBpbiBhbGwKLQl0aGUgc3ltYm9scyBhc3NvY2lhdGVkIHdpdGggZWFjaCBCRkQuCi0JKG1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IGFkanVzdCB0aGUgc2FtZSBzeW1ib2wKLQltb3JlIHRoYW4gb25jZS4KLQkqIGVsZi1tMTAyMDAuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1tMzJyLmM6IExpa2V3aXNlLgotCSogZWxmMzItc2guYzogTGlrZXdpc2UuCi0KLUZyaSBNYXkgMTYgMTI6MTA6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGRlY3JlYXNlIHRoZQotCWFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wuICBJZiB0d28gc3ltYm9scyB0aGF0IGxvb2sgbGlrZQotCWNvbW1vbiBzeW1ib2xzIGFyZSBmb3VuZCBpbiB0d28gc2hhcmVkIGxpYnJhcmllcywgYW5kIHRoZSBzaXplIGlzCi0JZGlmZmVyZW50LCB1c2UgdGhlIGxhcmdlciBzaXplLCBhbmQgd2FybiBpZiAtLXdhcm4tY29tbW9uLiAgSWYgYQotCWNvbW1vbiBzeW1ib2wgb3ZlcnJpZGVzIGEgZGVmaW5pdGlvbiBpbiBhIHNoYXJlZCBsaWJyYXJ5LCBzZXQgdGhlCi0Jc2l6ZSB0byB0aGUgbGFyZ2VyIHNpemUsIGFuZCB3YXJuIGlmIC0td2Fybi1jb21tb24uCi0KLVRodSBNYXkgMTUgMTQ6MzE6MjggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogIEFsbG93IGRlZmF1bHQgbWFjaGluZSB0byBiZSBwb2x5bW9ycGhlZAotCWludG8gYW55IG90aGVyIG1hY2hpbmUgdHlwZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfZmxhZ3MpOiAgSW5pdGlhbGlzZSBmbGFncyB2YXJpYWJsZSB0byAwLgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6ICBXaGVuIG1lcmdpbmcKLQlkYXRhIGludG8gYW4gdW5pdGlhbGlzZWQgZGVzdGluYXRpb24gc2V0IGl0cyBtYWNoaW5lIHR5cGUgYXMgd2VsbC4KLQotVGh1IE1heSAxNSAxNjo0MDoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRm9yY2UgRUxGIHN5bWJvbCBzaXplCi0JdG8gY29tbW9uIHN5bWJvbCBzaXplLiAgQ29uc2lzdGVudGx5IHRyZWF0IHVuaW5pdGlhbGl6ZWQgc3ltYm9scwotCWluIHNoYXJlZCBvYmplY3RzIGFzIGNvbW1vbiBzeW1ib2xzLgotCi1GcmkgTWF5ICA5IDEwOjE1OjI3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGNvbnN0YW50cyk6ICBBZGRlZCBuZXcgY29uc3RhbnRzIHRvIGlkZW50aWZ5IHRoZQotCXR5cGUgb2YgdGhlIEFSTSBhcmNoaXRlY3R1cmU6IGJmZF9tYWNoX2FybV8yLCBiZmRfbWFjaF9hcm1fMmEsCi0JYmZkX21hY2hfYXJtXzMsCWJmZF9tYWNoX2FybV8zTSwgYmZkX21hY2hfYXJtXzQgYW5kIGJmZF9tYWNoX2FybV80VC4KLQotCSogYmZkLWluMi5oIChjb25zdGFudHMpOiAgIEFkZGVkIG5ldyBjb25zdGFudHMgdG8gaWRlbnRpZnkKLQl0aGUgdHlwZSBvZiB0aGUgQVJNIGFyY2hpdGVjdHVyZTogYmZkX21hY2hfYXJtXzIsIGJmZF9tYWNoX2FybV8yYSwKLQliZmRfbWFjaF9hcm1fMywgYmZkX21hY2hfYXJtXzNNLCBiZmRfbWFjaF9hcm1fNCBhbmQKLQliZmRfbWFjaF9hcm1fNFQuICBUaGlzIGZpbGUgaXMgYXV0by1tYWdpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlCi0JYXJjaHVyZXMuYyBmaWxlLiAgVGhpcyB1cGRhdGUgaXMganVzdCB0byBzYXZlIHdvcmsuCi0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLAotCWNvZmZfYXJtX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLAotCWNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncywKLQljb2ZmX2FybV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQWRkZWQgdGhlc2UgbmV3IGZ1bmN0aW9ucy4KLQkoZ2xvYmFsKTogTWFjcm8gcmVkZWZpbml0aW9ucyBzZXQgdXAgdG8gdXNlIHRoZXNlIG5ldyBmdW5jdGlvbnMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IEFkZGVkIGNhbGwgdG8KLQljb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MoKS4KLQkoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBZGRlZCBjb2RlIHRvIHNldCBtYWNoaW5lIHR5cGUgYmFzZWQgb24KLQliaXRzIHN0b3JlZCBpbiBpbnRlcm5hbCBmbGFncy4KLSAgCShjb2ZmX3NldF9mbGFncyk6IEFkZGVkIGNvZGUgdG8gc2V0IHRoZSBuZXcgYml0cyBpbiB0aGUgZmxhZ3MKLQlmaWVsZCBiYXNlZCBvbiB0aGUgbWFjaGluZSBudW1iZXIuCi0JKGZ1bmN0aW9uIGRlZmluaXRpb24gbWFjcm9zKTogTWFkZSBhbGwgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYWNyb3MKLQljb25kaXRpb25hbCBzbyB0aGF0IHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGFyZ2V0IHNwZWNpZmljCi0JZmlsZXMuCi0KLQkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6IEFkZGVkIHRoaXMgZnVuY3Rpb24uICAoYXJjaF9pbmZvX3N0cnVjdCk6Ci0JU3RydWN0dXJlIGV4dGVuZGVkIHRvIGluY2x1ZGUgbmV3IHR5cGVzLCBvbmUgZWFjaCBmb3IgQVJNdjIsCi0JQVJNdjJhLCBBUk12MywgQVJNdjNNLCBBUk12NCBhbmQgQVJNdjRULgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3RkYXRhKTogIEFkZGVkIGZsYWdzIGZpZWxkLgotCi1GcmkgTWF5ICA5IDE3OjQwOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotZ251Kik6IERvbid0IGluY2x1ZGUgTWFjaCBzdXBwb3J0LgotCi0JKiBjb25maWcuYmZkOiBDaGFuZ2UgI2lmIDAgYXJvdW5kIHVzZXMgb2YgaG9zdF9hb3V0X3ZlYyB0byAjaWYKLQlIQVZFX2hvc3RfYW91dF92ZWMuCi0KLU1vbiBNYXkgIDUgMTM6NTc6MzIgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IElmIHRoZXJlIGFyZSBubyBzeW1lbnRzLAotCWp1c3QgcmV0dXJuIGZhbHNlLgotCi1Nb24gTWF5ICA1IDE4OjE4OjQ1IDE5OTcgIFBoaWxpcCBCbHVuZGVsbCAgPHBqYjI3QGNhbS5hYy51az4KLQotCSogY29uZmlnLmJmZDogY29wZSB3aXRoICcqLSotbGludXgtZ251YW91dCcgdGFyZ2V0cy4KLQotVGh1IE1heSAgMSAxMTozMToxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdtYXRjaC5zZWQ6IEFkZCBleHBsaWNpdCBcbiBjaGFyYWN0ZXJzIHRvIHdvcmsgYXJvdW5kIGJ1ZyBpbgotCUhQL1VYIDEwLjIwIHNlZCBwcm9ncmFtLgotCi1XZWQgQXByIDMwIDEyOjI3OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENhc3QgY3NlY3MgdG8gYXZvaWQgc2lnbgotCWV4dGVuc2lvbiBwcm9ibGVtcy4KLQotVHVlIEFwciAyMiAxMjowNjowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkb19tYWludGFpbmVyX2NsZWFuKTogRG9uJ3QgcmVtb3ZlIGJmZC1pbjIuaC4KLQotTW9uIEFwciAyMSAxMToyMTozMSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jOiBGb2xsb3cgdGhlIGxhc3QgY2hhbmdlcyBpbiBlbGYzMi1pMzg2LmM6Ci0JKHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkLCBzdHJ1Y3QKLQllbGZfbTY4a19saW5rX2hhc2hfZW50cnksIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUsCi0JZWxmX202OGtfbGlua19oYXNoX3RyYXZlcnNlLCBlbGZfbTY4a19oYXNoX3RhYmxlLAotCWVsZl9tNjhrX2xpbmtfaGFzaF9uZXdmdW5jLCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlLAotCWVsZl9tNjhrX2Rpc2NhcmRfY29waWVzLCBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOgotCU5ldyBkZWZpbml0aW9ucy4KLQkoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGRvbid0IGNvcHkKLQlQQyByZWxhdGl2ZSByZWxvY3MgZm9yIGEgZ2xvYmFsIHN5bWJvbCBkZWZpbmVkIGluIGEgcmVndWxhcgotCW9iamVjdCwgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgYW55Ci0JZ2xvYmFsIHN5bWJvbC4KLQkoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsCi0JdHJhdmVyc2Ugd2l0aCBlbGZfbTY4a19kaXNjYXJkX2NvcGllcy4KLQotU2F0IEFwciAxOSAyMjo1MDoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogT25seSBjb3VudCBQQyByZWxhdGl2ZQotCXJlbG9jcy4gIEZyb20gSmFtaWUgTG9raWVyIDxqYW1pZUByZWJlbGxpb24uY28udWs+LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvcmNlIHRoZQotCXBvdGVudGlhbCBsYXN0IGJ5dGUgaW4gdGhlIGZpbGUgdG8gYmUgd3JpdHRlbiBvdXQgd2hlbgotCUNPRkZfSU1BR0VfV0lUSF9QRS4KLQotVGh1IEFwciAxNyAxMzo0Njo1NiAxOTk3ICBQZXIgRm9nZWxzdHJvbSAgPHBlZm9Ab3BlbmJzZC5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzKi0qLW9wZW5ic2QqKTogTmV3IGhvc3QuCi0KLVRodSBBcHIgMTcgMTE6MTA6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgc3VidHJhY3QgdGhlCi0Jc2VjdGlvbiBWTUEgZnJvbSB0aGUgc3ltYm9sIHZhbHVlIGlmIHRoaXMgaXMgYSBmdWxseSBsaW5rZWQgZmlsZS4KLQotCSogZWxmMzItaTM4Ni5jIChzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lLgotCShlbGZfaTM4Nl9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGZfaTM4Nl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgZG9uJ3QgY29weQotCVBDIHJlbGF0aXZlIHJlbG9jcyBmb3IgYSBnbG9iYWwgc3ltYm9sIGRlZmluZWQgaW4gYSByZWd1bGFyCi0Jb2JqZWN0LCBhbmQgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciBhbnkKLQlnbG9iYWwgc3ltYm9sLgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywKLQl0cmF2ZXJzZSB3aXRoIGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzLgotCShlbGZfaTM4Nl9kaXNjYXJkX2NvcGllcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlZmluZS4KLQotCUZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogYW91dGYxLmggKE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IFVzZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MuCi0KLVdlZCBBcHIgMTYgMTI6NDM6MzIgMTk5NyAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQzMHYuYyAoZWxmX2QzMHZfaG93dG9fdGFibGUpOiBDaGFuZ2VkIHNpemUgb2YKLQlSX0QzMFZfMzJfTk9STUFMIHRvIDIgKDQgYnl0ZXMpLgotCi1XZWQgQXByIDE2IDE0OjAyOjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogbmV0YnNkLmggKE5fU0hBUkVEX0xJQik6IERlZmluZS4KLQkoU0VHTUVOVF9TSVpFKTogRG9uJ3QgZGVmaW5lLgotCSogbTY4a25ldGJzZC5jIChTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUgKHJldmVydCBjaGFuZ2Ugb2YKLQlBcHJpbCAxMSkuCi0JKiBzcGFyY25ldGJzZC5jIChUQVJHRVRfUEFHRV9TSVpFKTogRGVmaW5lIGFzIDB4MjAwMC4KLQkoU0VHTUVOVF9TSVpFKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBTZXQgLnJlbGEuYnNzIHNpemUKLQl0byBzaXplb2YgUmVsYSBzdHJ1Y3R1cmUsIG5vdCBzaXplb2YgUmVsIHN0cnVjdHVyZS4gIEZyb20gR2FyeQotCVRob21hcyA8Zy50aG9tYXNAb3Blbmdyb3VwLm9yZz4uCi0KLVR1ZSBBcHIgMTUgMTE6NTA6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBJZiBlbnRyeV9pc190ZXh0X2FkZHJlc3MsIGFkanVzdAotCXdoZW5ldmVyIGVudHJ5IGlzIGxhcmdlciB0aGFuIHRleHQgYWRkcmVzcywgYnV0IG9ubHkgYnkgd2hvbGUKLQlwYWdlcy4gIEZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+LgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlCi0JbWtpbnN0YWxsZGlycyB0byBidWlsZCAkKG9sZGluY2x1ZGVkaXIpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgY2FsbCBjaGVja19yZWxvY3MKLQlpZiB0aGlzIGlzIGEgZGVidWdnaW5nIHNlY3Rpb24gd2hpY2ggd2UgYXJlIHN0cmlwcGluZy4KLQotTW9uIEFwciAxNCAxMjozOTozMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfb2JqZWN0X3ApOiBBbGxvY2F0ZSB0aGUKLQlhbHBoYS1zcGVjaWZpYyB0YXJnZXQgZGF0YSBzdHJ1Y3QuCi0KLU1vbiBBcHIgMTQgMTE6NDU6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogTWFrZWZpbGUuaW46IEFsd2F5cyB1c2UgJChTSEVMTCkgd2hlbiBydW5uaW5nIG1vdmUtaWYtY2hhbmdlLgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAxMSAxNTo0MzoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IE9ubHkgc3VidHJhY3QgdGhlIHNlY3Rpb24KLQlWTUEgaWYgdGhpcyBpcyBhbiBleGVjdXRhYmxlIGZpbGUgb3IgYSBzaGFyZWQgb2JqZWN0LgotCi0JKiB0YXJnZXRzLmMgKG5ldGJzZF9jb3JlX3ZlYyk6IERlY2xhcmUuICBGcm9tIEdvcmRvbiBXLiBSb3NzCi0JPGd3ckBtYy5jb20+LgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCBlbnRyeV9pc190ZXh0X2FkZHJlc3MKLQlmaWVsZC4KLQkqIGFvdXQtdGFyZ2V0LmggKFNFR01FTlRfU0laRSk6IERlZmluZSB0byBUQVJHRVRfUEFHRV9TSVpFIGF0IHRoZQotCXN0YXJ0IG9mIHRoZSBmaWxlLiAgUmVtb3ZlIHVzZXMgbGF0ZXIgb24gd2hpY2ggc3dpdGNoIHVzaW5nCi0JaWZkZWYuCi0JKE1ZKGNhbGxiYWNrKSk6IEhhbmRsZSBlbnRyeV9pc190ZXh0X2FkZHJlc3MuCi0JKE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogYW91dGYxLmggKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBMaWtld2lzZS4KLQkqIGkzODZhb3V0LmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIGkzODZtYWNoMy5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jIChzcGFyY2x5bnhfYW91dF9iYWNrZW5kKTogTGlrZXdpc2UuCi0JKiBuZXRic2QuaCAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MpOiBEZWZpbmUuCi0JKiBtNjhrbmV0YnNkLmMgKFNFR01FTlRfU0laRSk6IERlZmluZSBhcyAweDIwMDAwLgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBIYW5kbGUgaW1wb3J0aW5nIGEgc3ltYm9sCi0Jd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBgLicuCi0KLUZyaSBBcHIgMTEgMTE6NTc6MTUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogY29uZmlnLmJmZDogKGlbMzQ1Nl04Ni0qLW9wZW5ic2QqLCBtNjgqLSotb3BlbmJzZCosCi0JbWlwcyplbCotKi1vcGVuYnNkKiwgbWlwcyotKi1vcGVuYnNkKiwgbnMzMmstKi1vcGVuYnNkKiwKLQlwb3dlcnBjLSotKmJzZCosIHNwYXJjLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDU2XTg2LSotb3BlbmJzZCosIG1pcHMqLSotb3BlbmJzZCosCi0JbTY4Ki0qLW9wZW5ic2QqLCBuczMyay0qLW9wZW5ic2QqLCBwb3dlcnBjLSotKmJzZCosCi0Jc3BhcmMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgQXByICA4IDE4OjA5OjI5IDE5OTcgIEphbWllIExva2llciAgPGphbWllQHJlYmVsbGlvbi5jby51az4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvKTogTmV3IGZpZWxkCi0JYGN1bXVsYXRpdmVfc2tpcHMnLgotCShfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IEZpbGwgdGhlIGFib3ZlIGFycmF5LgotCShfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQpOiBVc2UgYGN1bXVsYXRpdmVfc2tpcHMnIHRvCi0Jc3BlZWQgdXAgb2Zmc2V0IGNhbGN1bGF0aW9uLgotCi1UdWUgQXByICA4IDAwOjAxOjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGVsZi1tbjEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBEb24ndCBmb3JnZXQgdGhlCi0gICAgICAgIGFkZGVuZCBmb3Igbm9uIHBjLXJlbGF0aXZlIHJlbG9jYXRpb25zLgotCi0JKiBlbGYtbTEwMzAwLmMgKGJmZF9lbGYzMl9tbjEwMzAwX3JlbG9jKTogUmVtb3ZlIHByb3RvdHlwZQotCWZvciBub24tZXhpc3RlbnQgZnVuY3Rpb24uCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0JKG1uMTAzMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3ApOiBMaWtld2lzZS4KLQkobW4xMDMwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotTW9uIEFwciAgNyAxNjo0NzowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgU0hMSUJfTElCUy4KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBTSExJQl9MSUJTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFNITElCX0xJQlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoU0hMSUIpKTogVXNlICQoU0hMSUJfTElCUykuCi0KLU1vbiBBcHIgIDcgMTA6NTM6NTIgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggYmZkLWluMi5oOiBhZGQgYmZkX3NlY3Rpb25fbG1hIG1hY3JvIHRvIGNvcnJlc3BvbmQKLQl3aXRoIGJmZF9zZWN0aW9uX3ZtYS4KLQotRnJpIEFwciAgNCAxMTozNzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXBkYXRlIGZpbGUgbmFtZXMgZm9yIGJmZF9lbGYzMl9tbjEwWzIzXTAwX3ZlYy4KLQlDb3JyZWN0IENQVSBmaWxlIG5hbWVzIGZvciBtbjEwWzIzXTAwLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBiZmQuYyAoYmZkX3JlY29yZF9waGRyKTogQ2FzdCBjb3VudCB0byBzaXplX3QgYmVmb3JlCi0Jc3VidHJhY3Rpb24uCi0KLQkqIGNvZmYtcHBjLmMgKGR1bXBfdG9jKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZyBmcm9tIFN1bk9TIGNjLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfcmVhZF9hcl9oZHIpOiBMaWtld2lzZS4KLQkoeGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IExJa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUpOiBMaWtld2lzZS4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBMaWtld2lzZS4KLQkocGVfcHJpbnRfZWRhdGEsIHBlX3ByaW50X3BkYXRhLCBwZV9wcmludF9yZWxvYyk6IExpa2V3aXNlLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCi0JKiBwcGNib290LmMgKHBwY2Jvb3Rfc2V0X2FyY2hfbWFjaCk6IE1ha2Ugc3RhdGljLgotCShwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfY3RvcjY0X2hvd3RvKTogU2V0IGNvbXBsYWluX29uX292ZXJmbG93Ci0JdG8gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi1UaHUgQXByICAzIDExOjUxOjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogU2V0IHRvIDIuOC4xLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6ICBEb24ndCBjaGVjayBTRUNfQUxMT0Mgd2hlbgotCWRlY2lkaW5nIHdoZXRoZXIgdG8gY29weSBhIHJlbG9jIGludG8gYSBzaGFyZWQgb2JqZWN0LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4gIFJlbG9jYXRlIFJfUFBDX1JFTEFUSVZFCi0JcmVsb2NzIGluIHVuYWxsb2NhdGVkIHNlY3Rpb25zLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbG9jYXRlCi0JUl9TUEFSQ19SRUxBVElWRSByZWxvY3MgaW4gdW5hbGxvY2F0ZWQgc2VjdGlvbnMuCi0KLVdlZCBBcHIgIDIgMTY6MTk6NDEgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFVuZG8gTWFyY2ggMjYgY2hhbmdlIGFuZAotCWFsd2F5cyBjcmVhdGUgZ290IHNlY3Rpb24gc28gdGhhdCB0aGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGxhYmVsCi0JaXMgYWx3YXlzIGNyZWF0ZWQuCi0KLVdlZCBBcHIgIDIgMTA6NDk6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExldCBhIGNvbW1vbiBzeW1ib2wKLQlvdmVycmlkZSBhbiB1bmluaXRpYWxpemVkIHN5bWJvbCBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBhCi0Jc21hbGxlciBzaXplLgotCi0JKiBlbGYtbTEwMjAwLmM6IFJlbmFtZSBmcm9tIGVsZjMyLW1uMTAyMDAuYy4KLQkqIGVsZi1tMTAzMDAuYzogUmVuYW1lIGZyb20gZWxmMzItbW4xMDMwMC5jLgotCSogY3B1LW0xMDIwMC5jOiBSZW5hbWUgZnJvbSBjcHUtbW4xMDIwMC5jCi0JKiBjcHUtbTEwMzAwLmM6IFJlbmFtZSBmcm9tIGNwdS1tbjEwMzAwLmMKLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfY3RvcjY0X2hvd3RvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZWxmX21pcHNfaXNhKTogTW92ZSB0byBlYXJsaWVyIGluIGZpbGUuCi0JKG1pcHNfcmVsb2NfbWFwKTogUmVtb3ZlIEJGRF9SRUxPQ19DVE9SIGVudHJ5LgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SCi0Jc3BlY2lhbGx5LgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHMxNl9qdW1wX3JlbG9jKTogUHJpbnQgYSB3YXJuaW5nIHJhdGhlciB0aGFuCi0JY2FsbGluZyBhYm9ydC4KLQotVHVlIEFwciAgMSAxNjoxODowNSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbTogTmV3IGZpbGUuCi0JKiBjb25maWcuaC12bXM6IFJlbW92ZSBmaWxlLgotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgZm9yIG5ldyBjb25maWd1cmUgc2NoZW1lLgotCi1Nb24gTWFyIDMxIDIzOjI4OjM5IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGxpYmNvZmYtaW4uaCAocHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uKTogRGVjbGFyZS4KLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBEZWNsYXJlIGlmIG5vdCBhIG1hY3JvLgotCi1Nb24gTWFyIDMxIDE2OjI5OjUwIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlnLmJmZCAoaHBwYSotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KLQotTW9uIE1hciAzMSAxNjoxMTozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHVzZSBzeW1uZHggYXMgYQotCXN5bWJvbCBpbmRleCBmb3IgYSBSX0lIQ09OU1QgcmVsb2MuCi0KLU1vbiBNYXIgMzEgMTU6NDA6NTkgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogdGFyZ21hdGNoLnNlZDogRG8gbm90IHVzZSBcKFwpIHJlY3Vyc2l2ZWx5LgotCi1GcmkgTWFyIDI4IDE0OjQ0OjA4IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIG02OGtsaW51eC5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQkqIGkzODZsaW51eC5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQotRnJpIE1hciAyOCAxMTo1NjoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdT4gYW5kIEguSi4gTHUKLQk8aGpsQGdudS5haS5taXQuZWR1PjoKLQkqIHNwYXJjbGludXguYzogTmV3IGZpbGUuCi0JKiBiZmQtaW4uaCAoYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjLSotbGludXhhb3V0Kiwgc3BhcmMtKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsaW51eF92ZWMpOiBBZGQgdG8gbGlzdCBvZiB2ZWN0b3JzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChzcGFyY2xpbnV4X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNwYXJjbGludXhfdmVjLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBzcGFyY2xpbnV4Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBzcGFyY2xpbnV4LmMuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3Ci0JYmZkX2NvZmZfYmFja2VuZF9kYXRhIGZpZWxkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogY29uZmlnLmJmZDogQWRkIGJmZF9lbGY2NF97YmlnLGxpdHRsZX1taXBzX3ZlYyB0byB0YXJnX3NlbHZlY3MKLQlmb3IgbWlwcyplbCotKi1saW51eCogYW5kIG1pcHMqLSotbGludXgqLiAgRnJvbSBILkouIEx1Ci0JPGhqbEBsdWNvbi5vcmc+IGFuZCBSYWxmIEJhZWNobGUgPHJhbGZAZ251LmFpLm1pdC5lZHU+LgotCi0JKiBiZmQuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShzdHJlcnJvcik6IERvbid0IGRlY2xhcmUuCi0JKGJmZF9lcnJtc2cpOiBDYWxsIHhzdHJlcnJvciByYXRoZXIgdGhhbiBzdHJlcnJvci4KLQotVGh1IE1hciAyNyAxMjo1NTo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgYSBDT1BZCi0JcmVsb2MgZXZlbiBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSAuYnNzIHNlY3Rpb24uCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyLgotCShiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKTogRGVmaW5lLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGltaXQgYWxpZ25tZW50IG9mIGEgY29tbW9uCi0Jc3ltYm9sIHRvIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50LgotCi0JKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLVRodSBNYXIgMjcgMDA6NDU6NTcgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQzMHYuYyAoZWxmX2QzMHZfaG93dG9fdGFibGUpOiBGaXggYSB0eXBvIGluIHRoZQotCTIxLWJpdCBhYnNvbHV0ZSB0aGF0IG1hZGUgaXQgYWN0IGFzIGEgcmVsYXRpdmUuCi0KLVdlZCBNYXIgMjYgMTQ6NTA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IERvbid0IHNldAotCWJzc19zZWN0aW9uIGFuZCByZWxfc2VjdGlvbiBmcm9tIGV4aXN0aW5nIHNlY3Rpb25zLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBPbmx5IGNyZWF0ZSB0aGUgZ290IHNlY3Rpb24KLQlpZiBpdCBpcyBuZWVkZWQuCi0KLVR1ZSBNYXIgMjUgMjI6MjY6NTYgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIENoYW5nZSBleGVjdXRhYmxlIHRlc3QgdG8gZml4Ci0JcHJvYmxlbXMgd2l0aCBlbWJlZGRlZCBhLm91dCBzeXN0ZW1zLgotCi1UdWUgTWFyIDI1IDE0OjM1OjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0KTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEFkanVzdCB0aGUgb2Zmc2V0IG9mIGEKLQlzdGFiIHJlbG9jLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBDb3B5IG92ZXIgdGhlIGZpcnN0IGhlYWRlcgotCXN5bWJvbC4gIENoZWNrIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIG9mICpwc2luZm8uCi0JKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyk6IEFkZCBwc2luZm8gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBoZWFkZXIgc3ltYm9sLgotCSogbGliYmZkLWluLmggKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDI0IDIwOjA3OjI5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwX2hvd3RvX3RhYmxlKTogQWRkIFJfQUJTIGVudHJ5LgotCShydHlwZTJob3d0byk6IEhhbmRsZSBSX0FCUyByZWxvYyB0eXBlLiAgQWxzbyBhYm9ydCBvbiB1bmhhbmRsZWQKLQlyZWxvYyB0eXBlcywgcmF0aGVyIHRoYW4gc2lsZW50bHkgZmFpbGluZyB0byBnZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZS4KLQotTW9uIE1hciAyNCAxMzo0MTowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdtYXRjaC5zZWQ6IFVzZSB0aGUgaG9sZCBzcGFjZSB0byBwdXQgdGhlICNpZmRlZiBhcm91bmQgdGhlCi0JdGhlIHN0cmluZyBjb25zdGFudC4KLQkqIHRhcmdldHMuYyAoVU5TVVBQT1JURURfVEFSR0VUKTogRG9uJ3QgZGVmaW5lLgotCShmaW5kX3RhcmdldCk6IERvbid0IGNoZWNrIGZvciBVTlNVUFBPUlRFRF9UQVJHRVQuCi0JKGJmZF9zZXRfZGVmYXVsdF90YXJnZXQpOiBEb24ndCB0cnkgdG8gb3B0aW1pemUgYnkgY2hlY2tpbmcgZm9yCi0JZGVmYXVsdC4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtbTMyci5jLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmMzItbTMyci5jLgotCShlbGYzMi1tMzJyLm8pOiBSZW1vdmUgZXhwbGljaXQgdGFyZ2V0LgotCi0JKiBjb25maWcuYmZkOiBEb24ndCBzZXQgdGFyZ191bmRlcnNjb3JlIGZvciBpWzM0NTZdODYtKi1nbnUqIG9yCi0JaVszNDU2XTg2LSotbGludXgqLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndAotCWNvdW50IHNlY3Rpb24gc3ltYm9scyBmb3Igc2VjdGlvbnMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgdGhlCi0JbGlua2VyLCBvciBhcmUgbm90IGFsbG9jYXRhYmxlIG9yIG5vdCBsb2FkYWJsZS4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPdXRwdXQgb3V0cHV0IHNlY3Rpb24KLQlzeW1ib2xzIGZvciBzZWN0aW9uIGZvciB3aGljaCB3ZSBtYWRlIHNwYWNlIGZvciB0aGVtLgotCi1GcmkgTWFyIDIxIDEzOjA4OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgdGhlcmUgaXMKLQlubyAucmVsYS5wbHQgc2VjdGlvbiwgZG9uJ3Qgb3V0cHV0IGEgRFRfUExUR09UIGR5bmFtaWMgZW50cnkuCi0KLUZyaSBNYXIgMjEgMTI6MzY6NDYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9ob3d0b190YWJsZSk6IFVzZSBzcGVjaWFsIGZ1bmN0aW9uIGZvciBMTzE2LgotCShtMzJyX2hpMTZfbGlzdCk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKG0zMnJfZWxmX2hpMTZfcmVsb2MpOiBEb24ndCBwZXJmb3JtIHJlbG9jLCBqdXN0IHF1ZXVlIGl0IHVwLgotCShtMzJyX2VsZl9kb19oaTE2X3JlbG9jKTogRGVsZXRlLgotCShtMzJyX2VsZl9yZWxvY2F0ZV9oaTE2KTogTmV3IGZ1bmN0aW9uLgotCShtMzJyX2VsZl9sbzE2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIEhJMTYgcmVsb2NzLCBzY2FuIGZvciBjb3JyZXNwb25kaW5nCi0JTE8xNiByZWxvYy4KLQotCU1vbiBNYXIgMTAgMTY6MDM6MzEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogRGVsZXRlLgotCShtMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBSZXdyaXRlIF9TREFfQkFTRV8gc3VwcG9ydC4KLQkobTMycl9lbGZfZmluYWxfc2RhX2Jhc2UpOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXdyaXRlIHNkYXRhIHN1cHBvcnQuCi0JKG0zMnJfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRGVsZXRlLgotCi1UaHUgTWFyIDIwIDEyOjM5OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LgotCSogY29mZi1zdm02OGsuYzogTmV3IGZpbGUuICBKdXN0IGRlZmluZXMgc29tZSBtYWNyb3MgYW5kIGluY2x1ZGVzCi0JY29mZi1tNjhrLmMuCi0JKiBjb2ZmLW02OGsuYzogQWRkIGZ1bmN0aW9ucyB0byBoYW5kbGUgY29tbW9uIGFkZGVuZHMsIG1vdmVkIGluCi0JZnJvbSBjZi1tNjhrbHlueC5jLiAgQ29udHJvbCB0aGVtIHVzaW5nIENPRkZfQ09NTU9OX0FEREVORCBtYWNyby4KLQlDb250cm9sIHdoZXRoZXIgcmVsb2NzIGFyZSB2aXNpYmxlIHVzaW5nIFNUQVRJQ19SRUxPQ1MuCi0JKiBjZi1tNjhrbHlueC5jOiBTaW1wbGlmeSBncmVhdGx5OiBqdXN0IGRlZmluZSBtYWNyb3MgdG8gY29udHJvbAotCWNvZmYtbTY4ay5jLgotCSogY29mZi1hdXguYzogTGlrZXdpc2UuICBKdXN0IGxlYXZlIGFkZF9vbmVfc3ltYm9sIHJvdXRpbmUuCi0JKiB0YXJnZXRzLiAobTY4a3N5c3Zjb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIG02OGtzeXN2Y29mZl92ZWMuCi0JKiBjb25maWcuYmZkIChtNjgqLW1vdG9yb2xhLXN5c3YqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4a3N5c3Zjb2ZmX3ZlYyk6IE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXN2bTY4ay5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgY29mZi1zdm02OGsuYy4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IGdldCBtaXNsZWQgaWYgdGhlCi0gCWZpcnN0IHNlY3Rpb24gaXMgbm90IGxvYWRhYmxlLiAgRnJvbSBNYXR0aGV3IEwuIE1hcnRpbgotIAk8bWxtQHhlZGlhLmNvbT4uCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogU2V0IHRoZSB2YWx1ZSBvZiBhIHNlY3Rpb24KLQlzeW1ib2wgdG8gdGhlIHNlY3Rpb24gYWRkcmVzcyB1bmxlc3MgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluay4KLQotVHVlIE1hciAxOCAyMzowMzoxNyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgY3JlYXRlCi0JLnBsdCBlbnRyeSBpZiB3ZSd2ZSB0YWtlbiB0aGUgZnVuY3Rpb24ncyBhZGRyZXNzLgotCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogTWVyZ2UgY29sbGVjdGVkIGZsYWdzIGluZm8gYXMgd2VsbC4KLQotVHVlIE1hciAxOCAyMjo0MDowOSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogTWFueSBmaWxlczogQWRkIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiBjcHUtbTY4ay5jIChiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGVjb2ZmbGluay5jOiBJbmNsdWRlICJsaWJjb2ZmLmgiIGFuZCAibGliZWNvZmYuaCIuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9mYWtlX3NlY3Rpb25zKTogTWFrZSBzdGF0aWMuCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5zdHJlYW1yKTogQ2hhbmdlIHN0cmVhbSBwYXJhbWV0ZXIgdG8gUFRSLgotCSogcGVpY29kZS5oOiBDaGFuZ2Ugc2V2ZXJhbCB2b2lkICogcGFyYW1ldGVycyB0byBQVFIuCi0JKiBzcmVjLmMgKHNyZWNfZ2V0X3N5bWJvbF9pbmZvKTogTWFrZSBzdGF0aWMuCi0JKiBzeW1zLmMgKGJmZF9zeW1ib2xfaXNfYWJzb2x1dGUpOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBNYXIgMTggMTI6NTg6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBSZW1vdmUuCi0JKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEb24ndCBkZWZpbmUuCi0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogQ2FsbCBiZmRfbWFsbG9jIHJhdGhlcgotCXRoYW4gbWFsbG9jLgotCi1Nb24gTWFyIDE3IDExOjMyOjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmg6IERvbid0IGluY2x1ZGUgb2JzdGFjay5oLgotCShzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpOiBDaGFuZ2UgbWVtb3J5IGZpZWxkIHRvIFBUUi4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IENoYW5nZSBtZW1vcnkgZmllbGQgdG8gUFRSLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLWluLmggKGJmZF9yZWxlYXNlKTogRGVjbGFyZSBhcyBmdW5jdGlvbiwgZG9uJ3QgZGVmaW5lIGFzCi0JbWFjcm8uCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIG9wbmNscy5jOiBJbmNsdWRlICJvYmphbGxvYy5oIiByYXRoZXIgdGhhbiAib2JzdGFjay5oIi4gIFVzZQotCW9iamFsbG9jIHJvdXRpbmVzIHJhdGhlciB0aGFuIG9ic3RhY2sgcm91dGluZXMuCi0JKG9ic3RhY2tfY2h1bmtfYWxsb2MsIG9ic3RhY2tfY2h1bmtfZnJlZSk6IERvbid0IGRlZmluZS4KLQkoZ2V0cGFnZXNpemUpOiBEb24ndCBkZWZpbmUuCi0JKF9iZmRfbmV3X2JmZCk6IERvbid0IHNldCBfYmZkX2NodW5rc2l6ZS4KLQkoYmZkX29wZW5yKTogRnJlZSBuZXcgYmZkIGFuZCBvYmphbGxvYyBvbiBmYWlsdXJlLgotCShiZmRfZmRvcGVuciwgYmZkX29wZW5zdHJlYW1yLCBiZmRfb3BlbncpOiBMaWtld2lzZS4KLQkoYmZkX2FsbG9jX3NpemUpOiBSZW1vdmUuCi0JKGJmZF9yZWxlYXNlKTogTmV3IGZ1bmN0aW9uLgotCSogaGFzaC5jOiBJbmNsdWRlICJvYmphbGxvYy5oIiByYXRoZXIgdGhhbiAib2JzdGFjay5oIi4gIFVzZQotCW9iamFsbG9jIHJvdXRpbmVzIHJhdGhlciB0aGFuIG9ic3RhY2sgcm91dGluZXMuCi0JKG9ic3RhY2tfY2h1bmtfYWxsb2MsIG9ic3RhY2tfY2h1bmtfZnJlZSk6IERvbid0IGRlZmluZS4KLQkqIGVjb2ZmbGluay5jOiBJbmNsdWRlICJvYmphbGxvYy5oIiByYXRoZXIgdGhhbiAib2JzdGFjay5oIi4gIFVzZQotCW9iamFsbG9jIHJvdXRpbmVzIHJhdGhlciB0aGFuIG9ic3RhY2sgcm91dGluZXMuCi0JKG9ic3RhY2tfY2h1bmtfYWxsb2MsIG9ic3RhY2tfY2h1bmtfZnJlZSk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGFjY3VtdWxhdGUpOiBDaGFuZ2UgbWVtb3J5IHRvIHN0cnVjdCBvYmphbGxvYyAqLgotCSogbGlib2FzeXMuaCAob2FzeXNfZGF0YV90eXBlKTogUmVtb3ZlIG9hc3lzX29ic3RhY2sgZmllbGQuCi0JKiBkZXAtaW4uc2VkOiBEb24ndCByZW1vdmUgb2JzdGFjay5oIGZyb20gZGVwZW5kZW5jeSBsaXN0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfSF9ERVBTKTogUmVtb3ZlIG9ic3RhY2suaC4KLQkoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgb2JzdGFjay5oLgotCSogTWFueSBmaWxlczogRG9uJ3QgaW5jbHVkZSAib2JzdGFjay5oIi4KLQkqIFZFUlNJT046IEJ1bXAuCi0KLQkqIG9wbmNscy5jIChiZmRfYWxsb2NfZ3JvdywgYmZkX2FsbG9jX2ZpbmlzaCk6IFJlbW92ZS4KLQkqIGxpYmJmZC1pbi5oIChiZmRfYWxsb2NfZ3JvdywgYmZkX2FsbG9jX2ZpbmlzaCk6IERvbid0IGRlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGllZWUuYyAoaWVlZV9hcmNoaXZlX3ApOiBSZXdyaXRlIHRvIG5vdCB1c2UgYmZkX2FsbG9jX2dyb3cuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBzcmVjLmMgKHNyZWNfc2Nhbik6IFJld3JpdGUgdG8gbm90IHVzZSBvYnN0YWNrXzFncm93LgotCi0JKiBvcG5jbHMuYyAoYmZkX2FsbG9jKTogUmVuYW1lIGZyb20gYmZkX2FsbG9jX2J5X3NpemVfdC4gIFJlbW92ZQotCW9sZCB2ZXJzaW9uIG9mIGJmZF9hbGxvYy4KLQkqIGxpYmJmZC1pbi5oIChiZmRfYWxsb2NfYnlfc2l6ZV90KTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogU2V2ZXJhbCBmaWxlczogQ2FsbCBiZmRfYWxsb2MgcmF0aGVyIHRoYW4gYmZkX2FsbG9jX2J5X3NpemVfdC4KLQotU2F0IE1hciAxNSAxNToyNDoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IEFjY2VwdCB0aGUgZ2VuZXJpYwotCUVMRiBsb2NhbCBsYWJlbCBzeW50YXggYXMgd2VsbC4KLQotU2F0IE1hciAxNSAxMDoxNjo0MiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLWJlb3MqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYy0qLWJlb3MqKTogQWRkIGNhc2UgdGhhdCBleHBsaWNpdGx5Ci0JZG9lcyBub3Qgc2V0IENPUkVGSUxFIGZvciBub3cuICBBIGZ1dHVyZSBCZU9TIHZlcnNpb24gaXMKLQlleHBlY3RlZCB0byBzdXBwb3J0IGNvcmUgZmlsZXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQotRnJpIE1hciAxNCAxNjo0MzoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogR2l2ZSBhbiBlcnJvciBpZiBDQUxMMTYgaXMKLSAJc2VlbiB3aXRoIGEgbG9jYWwgc3ltYm9sLCByYXRoZXIgdGhhbiBjcmFzaGluZy4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgdHJ5IHRvIHJlYWQgdGhlCi0JdmVyc2lvbiBzeW1ib2xzIGlmIHRoZXJlIGFyZW4ndCBhbnkuCi0KLVRodSBNYXIgMTMgMTY6Mzg6MzAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZQotCShjb2ZmX3RpYzgwX3J0eXBlX3RvX2hvd3RvKTogQ2xvbmUgZ2VuZXJpYyBjb2ZmIHZlcnNpb24gYW5kCi0JYWRkIGNvZGUgdG8gaGFuZGxlIHRoZSBmdW5reSBUSSAiaW50ZXJuYWwgcmVsb2NhdGlvbnMiLgotCi1UaHUgTWFyIDEzIDE0OjA4OjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCB3YXJuIGFib3V0IHR5cGUKLQlvciBzaXplIGNoYW5nZXMgYmVjYXVzZSBvZiBhIHdlYWsgc3ltYm9sLgotCi0JKiBjaXNjby1jb3JlLmMgKFNJR0VNVCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQotV2VkIE1hciAxMiAyMTozNjowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIGV4dHN5bW9mZiB3aGVuCi0Jc2V0dGluZyBldmVyLiAgU2FuaXR5IGNoZWNrIHRoZSB2ZXJzaW9uIG51bWJlci4gIFNvcnQgb3V0IGNvcHlpbmcKLQlmbGFncyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gd2hlbiBhZGRpbmcgYW4gaW5kaXJlY3Qgc3ltYm9sLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IFByZXNlcnZlIGFueSBkeW5hbWljCi0Jc3ltYm9scyBhZGRlZCBieSB0aGUgYmFja2VuZC4gIENsZWFyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlCi0JdmVyc3ltIHNlY3Rpb24uCi0JKGVsZl9leHBvcnRfc3ltYm9sKTogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBBY2NlcHQgYSBzZWN0aW9uIHdpdGhvdXQgYW4gb3duZXIgaW4gYW4KLQlhc3NlcnQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGQgYSBzYW5pdHkgY2hlY2sgb24gdGhlCi0JdmVyc2lvbiBjb3VudC4gIENvcnJlY3QgdGhlIGFsbG9jYXRpb24gb2YgeF92ZXJzeW1wLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IERvbid0IHNldCB0aGUgb3duZXIgb2YKLQl0aGUgbWFnaWMgc2VjdGlvbnMgdXNlZCBmb3IgU0hOX01JUFNfVEVYVCBhbmQgU0hOX01JUFNfREFUQS4KLQlEb24ndCByZXR1cm4gYmZkX3VuZF9zZWN0aW9uX3B0ciB3aGVuIGluZm8tPnNoYXJlZC4KLQkobWlwc19lbGZfZmluYWxfbGluayk6IFNldCB0aGUgYWxpZ25tZW50IG9mIC5ydHByb2MgdG8gNCwgbm90IDEyLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENvcnJlY3QgdHlwZTogXj0gZm9yICY9LgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBSZXNvbHZlIGFuIGluZGlyZWN0IHN5bWJvbCBpbgotCXN5bV9oYXNoZXMuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERvbid0IGNoYW5nZSBTSE5fQUJTIGludG8KLQlTSE5fTUlQU19URVhUIG9yIFNITl9NSVBTX0RBVEEuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IFR3ZWFrIHZlcnNpb24gb3V0cHV0IHNsaWdodGx5LgotCi1UdWUgTWFyIDExIDAxOjM4OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGVsZi1iZmQuaCAoRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKTogRGVmaW5lLgotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogQ29ycmVjdCBlcnJvcnMgaW4gbGFzdCBjaGFuZ2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEhhbmRsZSBjYXNlcyBpbiB3aGljaCBhCi0JdmVyc2lvbmVkIHN5bWJvbCBhcHBlYXJzIGluIGJvdGggYSByZWd1bGFyIGFuZCBhIHNoYXJlZCBvYmplY3QuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IFNldCBFTEZfTElOS19GT1JDRURfTE9DQUwgd2hlbgotCWFwcHJvcHJpYXRlLiAgSW1wcm92ZSBlcnJvciBtZXNzYWdlLgotCShzdHJ1Y3QgZWxmX291dGV4dF9pbmZvKTogUmVuYW1lIGZyb20gZWxmX2ZpbmZvX2ZhaWxlZC4gIENoYW5nZQotCWFsbCB1c2VzLiAgQWRkIGxvY2Fsc3ltcyBmaWVsZC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGNhbGwKLQllbGZfbGlua19vdXRwdXRfZXh0c3ltIHRvIG91dHB1dCBhbGwgbG9jYWwgc3ltYm9scy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEhhbmRsZSBzeW1ib2xzIHdoaWNoIHdlcmUgZm9yY2VkIHRvCi0JYmVjb21lIGxvY2FsLgotCi1TdW4gTWFyICA5IDIzOjA4OjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGVsZi1iZmQuaCAoZWxmX3N5bWJvbF90eXBlKTogQWRkIHZlcnNpb24gZmllbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgdmVyc2lvbiBmaWVsZC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBjcmVhdGluZyBhbgotIAlpbmRpcmVjdCBzeW1ib2wgZm9yIGEgZGVmYXVsdCB2ZXJzaW9uIHN5bWJvbCwgc2V0IERFRl9EWU5BTUlDIGlmCi0gCWFwcHJvcHJpYXRlLiAgU2V0IHVwIGFuIGluZGlyZWN0aW9uIGZyb20gdGhlIG5vbmRlZmF1bHQgdmVyc2lvbiBvZgotCXRoZSBzeW1ib2wgYXMgd2VsbC4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDYWxsCi0JZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uIGJlZm9yZSBjaGVja2luZyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkKLQl2ZXJzaW9ucy4gIEFsd2F5cyByZWNvcmQgdGhlIHZlcnNpb24gbmFtZSBhcyBhIGR5bmFtaWMgc3ltYm9sLgotCUluaXRpYWxpemUgY291bnRlcnMuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IEFmdGVyIGZpbmRpbmcgYSB2ZXJzaW9uLCBzZWUgaWYgYQotCXN5bWJvbCBzaG91bGQgYmUgZm9yY2VkIHRvIGxvY2FsIHNjb3BlLiAgQ3JlYXRlIGEgbmV3IHZlcnNpb24KLQlkZWZpbml0aW9uIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQ29ycmVjdCBpbmRpcmVjdCBzeW1ib2wgaGFuZGxpbmcuCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBUdXJuIHZlcnNpb24gc2VjdGlvbnMgaW50byBCRkQgc2VjdGlvbnMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogT25seSBjb3B5IGN2ZXJkZWZzIGFuZCBjdmVycmVmcyBpbnRvIHNoX2luZm8KLQlpZiBzaF9pbmZvIGlzIG5vdCBhbHJlYWR5IHNldC4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENvcHkgc2hfaW5mbyBmb3IgdmVyc2lvbgotCXNlY3Rpb25zLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IFRlbGwKLQlfYmZkX3N0cmluZ3RhYl9hZGQgdG8gY29weSB0aGUgbmFtZSBpbnRvIHBlcm1hbmVudCBtZW1vcnkgaWYKLQlhcHByb3ByaWF0ZS4KLQotRnJpIE1hciAgNyAxMTo1NTozMSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IEZ1bGx5IHBhcmVudGhlc2l6ZS4KLQotRnJpIE1hciAgNyAxMDozNzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IENoYW5nZQotCV9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgdG8gcmV0dXJuIGEgYm9vbGVhbgotCXZhbHVlLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoYW5nZSByZXR1cm4gdHlwZSB0bwotCWJvb2xlYW4uICBJZiB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBzZWN0aW9uIGNoYW5nZWQsIHRoZW4gb3V0cHV0IGEKLQl6ZXJvIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBBbHdheXMgYWxsb2NhdGUgc3BhY2UKLQlmb3IgYXQgbGVhc3QgNiBvdXRwdXQgc3ltYm9scy4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IFdoZW4gZW1pdHRpbmcgVE9DIGVudHJ5IHJlbG9jcywgYWxzbwotCWVtaXQgYSBUQyBjc2VjdCB0byByZXByZXNlbnQgdGhlIHNwYWNlIHRoZXkgdGFrZSB1cC4gIEZvciBhbiBYTwotCXN5bWJvbCwganVzdCBlbWl0IGEgcmVmZXJlbmNlLCBub3QgYSBjc2VjdC4KLQotCSogTWFrZWZpbGUuaW4gKCQoU0hMSU5LKSk6IEp1c3QgdXNlIGxuIC1zLCBub3QgbG4gLXNmLCBzaW5jZQotCVNvbGFyaXMgZG9lc24ndCBsaWtlIHRoZSBjb21iaW5lZCBvcHRpb25zLCBhbmQgdGhlIC1mIGlzCi0JdW5uZWNlc3NhcnkuCi0JKHN0YW1wLXRzaGxpbmssIGluc3RhbGwpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29ycmVjdCBSX01JUFMxNl8yNgotCWhhbmRsaW5nIHdoZW4gbGl0dGxlIGVuZGlhbi4KLQotVGh1IE1hciAgNiAxMzo1MTo1MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkobW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKHJlbG9jX3R5cGUpOiBSZW1vdmUgUENSRUx7OCwxNiwzMn1fezEsMn1CWVRFCi0JcmVsb2NzLiAgUmVwbGFjZSB0aGVtIHdpdGggZ2VuZXJpYyBQQ1JFTF97OCwxNiwzMn0gcmVsb2NzLgotCShlbGYzMl9tbjEwMzAwX2hvd3RvX3RhYmxlKTogTGlrZXdpc2UuCi0JKGVsZjMyX21uMTAzMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9tbjEwMzAwX3JlbG9jKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQotVGh1IE1hciAgNiAxMjoxOTo1OSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChydHlwZTJob3d0byk6IElmIHBhc3NlZCBhIHJlbG9jYXRpb24gdHlwZSB3ZSBkb24ndAotCXVuZGVyc3RhbmQsIGp1c3Qgc2V0IHRoZSBob3d0byBmaWVsZCB0byBOVUxMLCBhbmQgdGhlIGNhbGxlciB3aWxsCi0JcHJpbnQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBQdWxsIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgYW5kCi0JY29kZSBmcmFnbWVudCBvdXQgb2YgYm90aCBsZWdzIG9mICNpZmRlZiBSRUxPQ19QUk9DRVNTSU5HIC4uLiAjZW5kaWYKLQlibG9jay4gIFVzZSBOVUxMIGZvciBpbml0aWFsaXphdGlvbnMgb2YgInB0ciIgcmF0aGVyIHRoYW4gYmFyZSAwLgotCSogY29mZi1oODMwMC5jOiBGaXggdHlwbyBpbiBjb21tZW50LgotCSogY29mZi1oODUwMC5jOiBEaXR0by4KLQkqIGNvZmYtdzY1LmM6IERpdHRvCi0JKiBjb2ZmLXo4ay5jOiBEaXR0by4KLQotV2VkIE1hciAgNSAxMzo1OTowOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyk6IEZpeCBvdmVyZmxvdyBjYWxjLgotCShtMzJyX2VsZl9yZWxheF9zZWN0aW9uLCBtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMsCi0JbTMycl9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRmlyc3QgcGFzcyBhdCByZWxheCBzdXBwb3J0LgotCi1Nb24gTWFyICAzIDEzOjI3OjA5IDE5OTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBydGwuY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgY29ycmVjdCBzaF9zaXplCi0JZW50cnkgZm9yIHJlYWRpbmcgdmVyZGVmIHJlY29yZHMuCi0JVXNlIGNvcnJlY3QgYnJhY2VzIGZvciBjb21wdXRpbmcgaW5jcmVtZW50cyBvZiBleHR2ZXJkYXV4IGFuZAotCWV4dGV2ZXJkZWYgcmVjb3JkIHBvaW50ZXJzLgotCi1TdW4gTWFyICAyIDIyOjQ3OjU0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik6IFNldCB0aGlzIHRvIDIKLQlpbnN0ZWFkIG9mIDQuCi0KLVN1biBNYXIgIDIgMTY6MjU6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMpOiBDaGVjayB0aGF0Ci0JREVGX1JFR1VMQVIgaXMgbm90IHNldCBhcyB3ZWxsIGFzIGNoZWNraW5nIHRoYXQgREVGX0RZTkFNSUMgaXMKLQlzZXQuCi0KLUZyaSBGZWIgMjggMTY6NTI6NDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogQWRkIGNhc2UgZm9yIFRJQzgwX0FSQ0hfTUFHSUMuCi0KLUZyaSBGZWIgMjggMTU6MDY6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF9kZWZhdWx0X3ZlY3Rvcik6IE1ha2Ugbm9uLWNvbnN0LgotCShmaW5kX3RhcmdldCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQliZmRfZmluZF90YXJnZXQuCi0JKGJmZF9zZXRfZGVmYXVsdF90YXJnZXQpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9maW5kX3RhcmdldCk6IENhbGwgZmluZF90YXJnZXQuICBXaGVuIGRlZmF1bHRpbmcsIHVzZQotCWJmZF9kZWZhdWx0X3ZlY3RvclswXSBpZiBpdCBpcyBub3QgTlVMTC4KLQkqIGxpYmJmZC1pbi5oIChiZmRfZGVmYXVsdF92ZWN0b3IpOiBBZGp1c3QgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IFJldHVybiBmYWxzZSBpZiB0aGUgc3ltYm9sIGhhcyBubwotCW5hbWUuCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBjb2ZmLW02OGsuYyAobTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCSogZWxmLmMgKF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBUcmVhdCBzeW1ib2xzIGJlZ2lubmluZwotCXdpdGggLi4gb3IgXy5MXyBhcyBsb2NhbC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCSogZXZheC1hbHBoYS5jIChldmF4X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogVHJlYXQgc3ltYm9scwotCWJlZ2lubmluZyB3aXRoICQgYXMgbG9jYWwuCi0KLVRodSBGZWIgMjcgMTg6MzY6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVzZSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotCXJhdGhlciB0aGFuIGNvbXBhcmluZyBhZ2FpbnN0IGluZm8tPmxwcmVmaXguCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lIGFzCi0JX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogZWxmLmMgKF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWNsYXJlLgotCi0JKiBjb2ZmLW04OGsuYyAoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkobTg4a19pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZSBhcwotCV9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogbGliY29mZi1pbi5oIChfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyk6IENoYW5nZSBfYmZkX2lzX2xvY2FsX2xhYmVsCi0JdG8gX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLgotCShiZmRfdGFyZ2V0KTogTGlrZXdpc2UuCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IERlZmluZSBhcyBmdW5jdGlvbiwgbm90IG1hY3JvLgotCShiZmRfaXNfbG9jYWxfbmFtZSk6IERlZmluZS4KLQkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lKTogUmVuYW1lIGZyb20KLQliZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbCwgYW5kIHRha2UgYSBzdHJpbmcgcmF0aGVyIHRoYW4gYQotCXN5bWJvbC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWwpOiBEb24ndCBkZWZpbmUuCi0JKF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotIAkoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBBbGwgYmFja2VuZHM6IENoYW5nZSBsb2NhbF9sYWJlbCB0byBsb2NhbF9sYWJlbF9uYW1lLgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2dvdF9pbmZvKTogQWRkIGFzc2lnbmVkX2dvdG5vIGZpZWxkLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQlEb24ndCBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgemVybyBlbnRyeSBpcyB1bmFzc2lnbmVkOyBpbnN0ZWFkLCB1c2UKLQlhc3NpZ25lZF9nb3Ruby4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCW1pcHNfZWxmX3JlbG9jYXRlX2dvdF9sb2NhbC4KLQkobWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogSW5pdGlhbGl6ZSBhc3NpZ25lZF9nb3RubyBmaWVsZC4KLQotV2VkIEZlYiAyNiAxNToxOTo1MSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2MpOiBBZGQgY29kZSB0byBkbyAzMi1iaXQKLQlyZWxvY2F0aW9ucy4KLQotV2VkIEZlYiAyNiAxMzozMzowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3Qgc2tpcCBzeW1ib2xzIGZyb20gc2VjdGlvbnMKLQl0aGF0IGhhdmUgbm8gY29udGVudHMgbWVyZWx5IGJlY2F1c2UgbGlua2VyX21hcmsgaXMgbm90IHNldC4KLQotVHVlIEZlYiAyNSAxODo1MTozNSAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqLSotbG5ld3MqKTogTmV3IHRhcmdldC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlIGFzc2VydCBjb21wYXJlCi0JY29udGVudCBieXRlb3JkZXIgaW5zdGVhZCBvZiBoZWFkZXIgYnl0ZW9yZGVyLgotCShlY29mZl9iaWdsaXR0bGVfdmVjKTogTmV3IEJGRCwgYmlnLWVuZGlhbiBoZWFkZXJzLCBsaXR0bGUtZW5kaWFuCi0JZGF0YS4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgZWNvZmZfYmlnbGl0dGxlX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAoZWNvZmZfYmlnbGl0dGxlX3ZlYyk6IEFkZCBjYXNlLgotCSogY29uZmlndXJlOiBVcGRhdGUuCi0KLVR1ZSBGZWIgMjUgMDA6MzI6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBVc2UgU0hUX05PVEUgZm9yIGFueSBzZWN0aW9uIHdob3NlCi0JbmFtZSBiZWdpbnMgd2l0aCAiLm5vdGUiLgotCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBBZGQgYSBQVF9OT1RFIHNlZ21lbnQgZm9yIGFueSBsb2FkYWJsZQotCXNlY3Rpb24gd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCAiLm5vdGUiLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBmb3IgbWlzYWxpZ25lZAotCWphbCBhbmQgZm9yIGphbCBvdmVyZmxvdy4KLQotTW9uIEZlYiAyNCAxNzo1MzoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJZiBhIGRlZmF1bHQgc3ltYm9sIGlzCi0Jbm90IGZvdW5kLCB0cnkgbG9va2luZyBpdCB1cCBhZ2FpbiB3aXRob3V0IHRoZSB2ZXJzaW9uIG5hbWUuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEFsd2F5cyBsaW5rIGFnYWluc3QgdGhlIGR5bmFtaWMKLQlzeW1ib2wgdGFibGUgb2YgYSBkeW5hbWljIG9iamVjdC4gIFdoZW4gbGlua2luZyBhZ2FpbnN0IGEgZHluYW1pYwotCW9iamVjdCwgaW5jbHVkZSB2ZXJzaW9uIHN0cmluZ3MgaW4gc3ltYm9sIG5hbWVzLCBhbmQgc2V0IHVwCi0JdmVyc2lvbiBpbmZvcm1hdGlvbi4gIEFkZCBpbmRpcmVjdCBzeW1ib2xzIGZvciBkZWZhdWx0IHZlcnNpb25zLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBzcGVjaWFsIHZlcnNpb24gc2VjdGlvbnMuCi0JKHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8pOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbyk6IERlZmluZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgdmVyZGVmcyBwYXJhbWV0ZXIuICBTZXQKLQl1cCB2ZXJzaW9uIHNlY3Rpb25zLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuCi0JKGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfbGlua19yZW51bWJlcl9keW5zeW1zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8pOiBBZGQgc3ltdmVyX3NlYyBmaWVsZC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBmaW5mby5zeW12ZXJfc2VjLiAgRG9uJ3QgY291bnQKLQlsb2NhbCBzeW1ib2xzIG9mIGEgZHluYW1pYyBvYmplY3QuICBIYW5kbGUgRFRfVkVSKiBjb25zdGFudHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBTaW1wbGlmeSBCRkRfQVNTRVJUIGNoZWNraW5nIGZvciBhCi0JZHluYW1pYyBvYmplY3QuICBTa2lwIGluZGlyZWN0IHN5bWJvbHMgZnJvbSBFTEYgb2JqZWN0cy4gIFJlbW92ZQotCXRoZSB2ZXJzaW9uIG5hbWUgYmVmb3JlIGNob29zaW5nIGEgaGFzaCBidWNrZXQuICBXcml0ZSBvdXQgdGhlCi0JdmVyc2lvbiBpbmZvcm1hdGlvbiBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogQ2hlY2sgZm9yIERZTkFNSUMsIG5vdCBFVF9EWU4uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB2ZXJpbmZvIGZpZWxkLgotCUNoYW5nZSBlbGZfbGlua19oYXNoX2ZsYWdzIHRvIHVuc2lnbmVkIHNob3J0LgotCShFTEZfTElOS19ISURERU4pOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGZpZWxkcyBkeW52ZXJzeW1faGRyLCBkeW52ZXJyZWZfaGRyLAotCWR5bnZlcmRlZl9oZHIsIGR5bnZlcnN5bV9zZWN0aW9uLCBkeW52ZXJkZWZfc2VjdGlvbiwKLQlkeW52ZXJyZWZfc2VjdGlvbiwgY3ZlcmRlZnMsIGN2ZXJyZWZzLCB2ZXJkZWYsIHZlcnJlZi4KLQkoZWxmX2R5bnZlcnN5bSwgZWxmX2R5bnZlcmRlZiwgZWxmX2R5bnZlcnJlZik6IERlZmluZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4sIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luLCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyk6IERlY2xhcmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4pOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiwgX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQgRFRfVkVSKiBjb25zdGFudHMuICBQcmludAotCXZlcnNpb24gaW5mb3JtYXRpb24gaWYgdGhlcmUgaXMgYW55LgotCShfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgdmVyaW5mbyBmaWVsZC4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9HTlVfdmVyKiBzZWN0aW9uIHR5cGVzLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IEhhbmRsZSAuZ251LnZlcnNpb24qIHNlY3Rpb24gbmFtZXMuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBIYW5kbGUgU0hUX0dOVV92ZXIqIHNlY3Rpb24gdHlwZXMuCi0JKF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IERvbid0IGluY2x1ZGUKLQl2ZXJzaW9uIG5hbWUgaW4gc3RyaW5nIGVudGVyZWQgaW4gZHluYW1pYyBoYXNoIHRhYmxlLgotCSogZWxmY29kZS5oOiBJbmNsdWRlIGZubWF0Y2guaC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBhIGR5bmFtaWMKLQlzeW1ib2wgd2hpY2ggd2FzIGZvcmNlZCB0byBiZWNvbWUgbG9jYWwuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgMjEgMTY6MTU6MTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBTaW1wbGlmeQotCXNvbWV3aGF0LgotCShtbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uKTogQ29ycmVjdGx5IGNvbXB1dGUgYSBzeW1ib2wncyB2YWx1ZQotCXdoZW4gdGhlIHN5bWJvbCBpcyBsb2NhbCwgYnV0IG5vdCBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzIHdlIGFyZQotCXJlbGF4aW5nLiAgSW1wbGVtZW50IGFiczI0IC0+IGFiczE2LCBpbW0yNCAtPiBpbW0xNiBhbmQgZDI0IC0+IGQxNgotCXJlbGF4aW5nLgotCi1GcmkgRmViIDIxIDEzOjU1OjE0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmM6IFJld3JpdGUgdG8gdXNlIEVMRiBiYWNrZW5kIGxpbmtlci4KLQlTdG9yZSBsb3dlciAxNiBiaXRzIG9mIGFkZGVuZCBpbiBSX00zMlJfSEkxNl9bU1VdTE8gaW5zbnMuCi0JQWRkIHNtYWxsIGRhdGEgYXJlYSBzdXBwb3J0IChSX00zMlJfU0RBMTYpLgotCSogcmVsb2MuYzogRG9jdW1lbnQgQkZEX1JFTE9DX00zMlJfU0RBMTYuCi0JKiBiZmQtaW4yLmgsbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRmViIDIwIDIzOjUwOjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChtbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkobW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCk6IExpa2V3aXNlLgotCShtbjEwMjAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQotVHVlIEZlYiAxOCAxNzoyMjo1OSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgZWxmLmMsCi0JcmVsb2MuYywgdGFyZ2V0cy5jOiBOZXcgdGFyZ2V0LCBlbGYtKi1EMzBWLgotCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZSwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGNwdS1kMzB2LmMsIGVsZjMyLWQzMHYuYzogTmV3IGZpbGVzLgotCi1UdWUgRmViIDE4IDE1OjMxOjQ4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogRml4IHR5cG8gaW4gY29tbWVudC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBjb2ZmLXRpYzgwLmMgKFJUWVBFMkhPV1RPKTogUmVwbGFjZSBhYm9ydCB3aXRoIHJlYWwgZnVuY3Rpb24uCi0JKHJ0eXBlMmhvd3RvKTogQWRkIGZ1bmN0aW9uLgotCSh0aWM4MF9ob3d0b190YWJsZSk6IEFkZC4KLQotVHVlIEZlYiAxOCAxMTo0MTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIHN5c2RlcC5oOiBEb24ndCBkZWZpbmUgZXJybm8gaW4gTVNWQyBpZiBlcnJvci5oIGlzIGluY2x1ZGVkLgotCi1UdWUgRmViIDE4IDEwOjA0OjEzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTWFrZSBzdXJlIHJfc3ltbmR4Ci0JaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IGlzIHVzZWQuCi0KLU1vbiBGZWIgMTcgMTE6Mjg6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSk6IERvbid0IGNvbnZlcnQgYSBzZWNvbmRhcnkgY29tbW9uCi0Jc3ltYm9sIGludG8gYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2w7IGxlYXZlIGl0IGFzIGEgY29tbW9uIHN5bWJvbC4KLQotRnJpIEZlYiAxNCAxOTowODowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgaXNzdWUgYSB3YXJuaW5nCi0JYWJvdXQgYSBzeW1ib2wgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4KLQlkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCi0KLVRodSBGZWIgMTMgMjA6NTM6MjIgMTk5NyAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBwcm9naXMuZGUpCi0KLQkqIG1ha2VmaWxlLnZtczogQWRkIGdjYyBmbGFncyB0byBhbGxvdyBjb21waWxpbmcgd2l0aCBjdXJyZW50IGdjYwotCXNuYXBzaG90Ci0JKHRhcmdtYXRjaC5oKTogTmV3IGRlcGVuZGVuY3kuCi0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUik6IE5ldyByZWxvY2F0aW9uIGZvcgotCW9wZW5WTVMvQWxwaGEuCi0JKiBldmF4LmggKEFMUEhBX1JfQ09ERUFERFIpOiBOZXcgcmVsb2NhdGlvbi4KLQkqIGV2YXgtYWxwaGEuYyAoQUxQSEFfUl9DT0RFQUREUik6IDY0IGJpdCBwcm9jZWR1cmUgcmVsb2NhdGlvbiBmb3IKLQlvcGVuVk1TL0FscGhhLgotCSogZXZheC1ldGlyLmMgKEFMUEhBX1JfQ09ERUFERFIpOiBPdXRwdXQgb2JqZWN0IGNvZGUgZm9yIHRoaXMKLQlyZWxvY2F0aW9uLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCVJlc3RyaWN0IHN5bWJvbCBsZW5ndGggdG8gNjQgYnl0ZXMsIGNhc2UgcHJlc2VydmluZzoKLQkqIGV2YXgtZW1oLmMgKF9iZmRfZXZheF93cml0ZV9lbWgpOiBSZW1vdmUgY2FzZSBoYWNraW5nLgotCSogZXZheC1taXNjLmMgKF9iZmRfZXZheF9jYXNlX2hhY2tfc3ltYm9sKTogUmVtb3ZlLgotCShfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sKTogQWRkZWQuCi0JKiBldmF4LWV0aXIuYyAoX2JmZF9ldmF4X3dyaXRlX2V0aXIpOiBDYWxsCi0JX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbCBiZWZvcmUgb3V0cHV0IG9mIHN5bWJvbC4KLQkqIGV2YXgtZWdzZC5jIChfYmZkX2V2YXhfd3JpdGVfZWdzZCk6IExpa2V3aXNlLgotCSogZXZheC5oIChmbGFnX2hhc2hfbG9uZ19uYW1lcywgZmxhZ19zaG93X2FmdGVyX3RydW5jKTogUmVtb3ZlLgotCi0JKiBldmF4LWVtaC5jOiBPdXRwdXQgZmlsZW5hbWUgdG8gb2JqZWN0IGZpbGUgd2l0aG91dCBwYXRoLgotCi0JKiBldmF4LWVnc2QuYzogTmV3IHNlY3Rpb25zIGZvciBsb2NhbCBhbmQgZ2xvYmFsIGNvbW1vbnMuCi0KLQkqIGV2YXgtYWxwaGEuYywgZXZheC1lbWguYywgZXZheC1lZ3NkLmMsIGV2YXgtZXRpci5jLAotCWV2YXgtbWlzYy5jLCBldmF4Lmg6IFJlbW92ZSA4IGJpdCBjaGFyYWN0ZXJzIGZyb20gY29weXJpZ2h0Ci0Jbm90aWNlcy4gIFJlcGxhY2UgQVhQIHdpdGggQWxwaGEuCi0KLVdlZCBGZWIgMTIgMTg6MTA6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFdlIG5lZWQgdGhlIGR5bmFtaWMKLQlzZWN0aW9ucyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQotVHVlIEZlYiAxMSAxNTo0NTo0MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAoaTM4Ni13aW5kb3dzKTogRG9uJ3Qgc2V0IGhvc3Q2ND10cnVlLgotCi1UdWUgRmViIDExIDE1OjI3OjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChyZWxvY190eXBlKTogQWRkIFJfTUlQUzE2X0dQUkVMLgotCShlbGZfbWlwczE2X2dwcmVsX2hvd3RvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwczE2X2dwcmVsX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMLgotCShtaXBzX2luZm9fdG9faG93dG9fcmVsKTogSGFuZGxlIFJfTUlQUzE2X0dQUkVMLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfTUlQUzE2X0dQUkVMLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFMxNl9HUFJFTCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTAgMjM6MjU6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAoZWxmX20zMnJfaG93dG9fdGFibGUpOiBDaGFuZ2UgcGFydGlhbF9pbnBsYWNlIHRvIHRydWUKLQlmb3IgUl9NMzJSX3sxNiwzMiwyNCxISTE2X1VMTyxISTE2X1NMTyxMTzE2fS4KLQotRnJpIEZlYiAgNyAxMjozOToxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWYgd2UndmUgZGlzY2FyZGVkIGEgc2VjdGlvbiwKLQl0aGUgb3V0cHV0IHNlY3Rpb24gd2lsbCBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbjsgZG9uJ3QgcHJpbnQgYW4KLQlhc3NlcnRpb24gbWVzc2FnZSBmb3IgdGhhdCBjYXNlIHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluay4KLQotVGh1IEZlYiAgNiAxNjo1NTo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoRk5fU1RVQiwgQ0FMTF9TVFVCLCBDQUxMX0ZQX1NUVUIpOiBEZWZpbmUuCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkcyBmbl9zdHViLAotCW5lZWRfZm5fc3ViLCBjYWxsX3N0dWIsIGFuZCBjYWxsX2ZwX3N0dWIuCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZmllbGQgbWlwczE2X3N0dWJzX3NlZW4uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWRpcmVjdCByZWxvY2F0aW9ucyB0byB1c2UgbWlwczE2Ci0Jc3R1YnMgd2hlbiBhcHByb3ByaWF0ZS4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogQXR0YWNoIHN0dWIgc2VjdGlvbnMgdG8gdGhlIGFwcHJvcHJpYXRlCi0Jc3ltYm9sLiAgU2V0IG5lZWRfZm5fc3R1YiB3aGVuIGFwcHJvcHJpYXRlLgotCShtaXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogRGVmaW5lLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBsb2NhbF9zdHVicyBmaWVsZC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEaXNjYXJkIGxvY2FsIHN5bWJvbHMgdGhhdCBhcmUKLQlhdHRhY2hlZCB0byBzZWN0aW9ucyB3aGljaCBhcmUgbm90IGJlaW5nIGluY2x1ZGVkIGluIHRoZSBsaW5rLgotCi1XZWQgRmViICA1IDEzOjIwOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElnbm9yZSB0aGUKLQlzeW1ib2wgdmFsdWUgd2hlbiBjb21wdXRpbmcgdGhlIGFkZGVuZCBmb3IgYSBwY19yZWxhdGl2ZQotCXBjcmVsX29mZnNldCByZWxvYy4KLQotTW9uIEZlYiAgMyAxMTo1NDowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBkb2luZyBhCi0JcmVsb2NhdGVhYmxlIGxpbmssIGp1c3Qgc2tpcCBwY19yZWxhdGl2ZSBwY3JlbF9vZmZzZXQgcmVsb2NzLgotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiBSZXR1cm4gYSBkaWZmZXJlbnQgaG93dG8KLQlzdHJ1Y3R1cmUgZm9yIGFuIEFSTTI2IHJlbG9jIHdoaWNoIGNhbiBiZSByZXNvbHZlZC4KLQkoY29mZl9hcm1fYWRqdXN0X3N5bW5keCk6IE9ubHkgY29udmVydCBBUk0yNiB0byBBUk0yNkQgaWYgdGhlCi0JcmVsb2MgY2FuIGJlIHJlc29sdmVkLgotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBDb3JyZWN0IG9mZiBieSBvbmUKLQllcnJvciBpbiBvdmVyZmxvdyBjaGVjayBmb3IgUl9SRUxCWVRFLgotCi1GcmkgSmFuIDMxIDE0OjA3OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IFBpY2sgdXAgdGhlIHN0YXJ0IGFkZHJlc3MuCi0JRnJvbSBNYXJrIFJhc2luIDxtYXJrLnJhc2luQHRlbHJhZC5jby5pbD4uCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogRG9uJ3QgYXBwbHkgZGlzY2FyZF9sIHRvCi0JZGVidWdnaW5nIHN5bWJvbHMuCi0KLVdlZCBKYW4gMjkgMDA6MDA6NDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKHJlbG9jX3R5cGUpOiBBZGQgMTZiaXQgcGMtcmVsYXRpdmUgcmVsb2MuCi0JKGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0KLU1vbiBKYW4gMjcgMTI6MDc6MzUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCByZWxvY3MgQkZEX1JFTE9DX00zMlJfe0hJMTZfW1VTXUxPLExPMTZ9LgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1tMzJyLmM6IEFkZCBzdXBwb3J0IGZvciB0aGVtLgotCi1Nb24gSmFuIDI3IDEyOjI1OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC1hcm0uYyAoTVlfc3dhcF9zdGRfcmVsb2NfaW4pOiBSZW1vdmUgdW51c2VkIHJfbGVuZ3RoLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUmVtb3ZlIHVudXNlZCBwbHQuCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBSZW1vdmUgdXNlZAotCXJfZm9ybWF0IGFuZCByX3BjcmVsLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCSogcmlzY2l4LmMgKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBEZWZpbmUgdG8gZHVtbXkgdmFsdWUuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogV2hlbiBjaGVja2luZyBmb3IKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZSB0ZXh0IHNlZ21lbnQsIGxvb2sgdXAgdGhlIG91dHB1dCBuYW1lIG9mCi0JdGhlIHJlbG9jIHNlY3Rpb24uCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotV2VkIEphbiAyMiAxNTo0MDoyOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MGNvZmZfdmVjKTogVXNlIGNvcnJlY3QgZGF0YSBwdXQvZ2V0Ci0Jcm91dGluZXMgZm9yIGxpdHRsZSBlbmRpYW4gZGF0YS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IG1hZ2ljIHRvCi0gCVRJQzgwX0FSQ0hfTUFHSUMgZm9yIFRJYzgwLgotCi1UdWUgSmFuIDIxIDEyOjMyOjQzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwY29mZl92ZWMpOiBDaGFuZ2UgdG8gbGl0dGxlIGVuZGlhbiBkYXRhCi0JYXMgdGhlIGRlZmF1bHQuCi0KLVRodSBKYW4gMTYgMTc6NDU6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2hhbmdlIHR5cGUgb2YKLQlhdXhpbGlhcnlfZmlsdGVycyBwYXJhbWV0ZXIgdG8gYmUgY29uc3QgY2hhciAqIGNvbnN0ICouICBBY2NlcHQgYQotCU5VTEwgdGVybWluYXRlZCBhcnJheS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDE1IDExOjIxOjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogVHJlYXQgYQotCU5PVFlQRSBzeW1ib2wgaW4gYSB0ZXh0IHNlY3Rpb24gYXMgYSBGVU5DIHN5bWJvbC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3JjZQotCXJlbG9jYmFzZSB0byBiZSBhbGlnbmVkIHRvIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUi4KLQotVHVlIEphbiAxNCAwODo0NjozMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKG1hY2hpbmVfdHlwZSk6IFJlc2VydmUgc2V2ZXJhbCB2YWx1ZXMgZm9yIHNwYXJjbGV0LgotCi1Nb24gSmFuIDEzIDIyOjM5OjA4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAodGljODAtKi0qKTogRG9uJ3QgcmVxdWlyZSAnY29mZicuCi0KLU1vbiBKYW4gMTMgMTk6MzY6MjUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2hvd3RvX3RhYmxlKTogU2V0IHRoZSBzcGVjaWFsX2Z1bmN0aW9uCi0JdGFibGUgdG8gdjg1MF9lbGZfcmVsb2MgZm9yIGFsbCBub24tc3RhbmRhcmQgcmVsb2NhdGlvbnMuCi0JKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6IEFkZCBjaGVjayBmb3IgaCBiZWluZyBub24tbnVsbC4KLQkodjg1MF9lbGZfcmVsb2MpOiBBZGQgIFJfVjg1MF9aREFfT0ZGU0VUIHN1cHBvcnQuICBVc2Ugc3dpdGNoCi0Jc3RhdGVtZW50IGluc3RlYWQgb2YgbXVsdGlwbGUgaWZzLgotCSh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHVwIGVycm9yIG1lc3NhZ2UsIGRvbid0IGp1c3QgY2FsbAotCWFib3J0LgotCi1Nb24gSmFuICA2IDEzOjI4OjM1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChlbGZfbW4xMDIwMF9ob3d0byk6IERvbid0IGV2ZXIgc2V0IHBhcnRpYWwtaW5wbGFjZS4KLQlVc2UgYmZkX2VsZl9nZW5lcmljX3JlbG9jIGFzIHNwZWNpYWwgZnVuY3Rpb24gZm9yIGFsbCByZWxvY3MuCi0JKGJmZF9lbGYzMl9tbjEwMjAwX3JlbG9jKTogUmVtb3ZlIHVubmVjZXNzYXJ5IGZ1bmN0aW9uLgotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVsZl9tbjEwMjAwX2hvd3RvKTogU2V0IHBjcmVsX29mZnNldCBmb3IKLQkyNGJpdCBwYy1yZWxhdGl2ZSByZWxvYy4KLQotRnJpIEphbiAgMyAxNjozMzowMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvZmYtdGljODAubyk6IEFkZCBjb2ZmY29kZS5oIHRvIGRlcGVuZGVuY3kgbGlzdC4KLQkqIGNvZmYtdGljODAuYyAodGljODBjb2ZmX3ZlYyk6IERhdGEgYnl0ZSBvcmRlciBpcyBiaWcgZW5kaWFuIGFuZAotCWhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4uICBVc2UgY29ycmVjdCBiZmRfZ2V0IGFuZAotCWJmZF9wdXQgcm91dGluZXMgZm9yIGxpdHRsZSBlbmRpYW4gaGVhZGVycy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogU2V0IGFyY2ggdG8KLQliZmRfYXJjaF90aWM4MCBmb3IgVElDODBfQVJDSF9NQUdJQyBudW1iZXIuCi0KLUZyaSBKYW4gIDMgMTY6NTQ6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiByZWxvYy5jOiBBZGQgQkZEX1JFTE9DXzI0LgotCSogZWxmMzItbW4xMDIwMC5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgMjRiaXQgYW5kIHBjcmVsIHJlbG9jcy4KLQkoZWxmX21uMTAyMDBfaG93dG8sIG1uMTAyMDBfcmVsb2NfbWFwKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotRnJpIEphbiAgMyAxNjo1ODozMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCWVsZjY0LWFscGhhIG11bHRpcGxlIC5nb3QgcmV3cml0ZToKLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBhbHdheXNfc2l6ZV9zZWN0aW9ucyBlbnRyeS4KLQkoYmZkX2VsZipfbWtvYmplY3QpOiBEb24ndCBkZWZpbmUgaGVyZSAuLi4KLQkqIGVsZnh4LXRhcmdldC5oOiAuLi4gYnV0IHJhdGhlciBoZXJlLiAgRGVmYXVsdCBhbHdheXNfc2l6ZV9zZWN0aW9ucwotCWhvb2sgdG8gTlVMTC4KLQkqIGVsZi5jIChlbGZfbWtvYmplY3QpOiBSZW5hbWUgdG8gYmZkX2VsZl9ta29iamVjdCwgc2luY2UgdGhhdCB3YXMKLQl3aGF0IHRoZSAjZGVmaW5lcyBpbiBlbGYtYmZkLmggdHJhbnNtdXRlZCBpdCB0byBhbnl3YXkuCi0KLQkqIHNlY3Rpb24uYzogQWRkIFNFQ19MSU5LRVJfQ1JFQVRFRCBmbGFnLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBBZGQgU0VDX0xJTktFUl9DUkVBVEVEIHRvCi0JcmVsb2NhdGlvbiBzZWN0aW9uIGZsYWdzLgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgU0VDX0xJTktFUl9DUkVBVEVEIGluc3RlYWQgb2YKLQlTRUNfSU5fTUVNT1JZIHRvIHJlY29nbml6ZSBnZW5lcmF0ZWQgYml0cy4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzLCBlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOgotCUxpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rLCBtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucywKLQltaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbiwgbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uLAotCW1pcHNfZWxmX2NoZWNrX3JlbG9jcywgbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24sCi0JcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcywKLQllbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogQWRkIFNFQ19MSU5LRVJfQ1JFQVRFRCB0bwotCXNlY3Rpb24gZmxhZ3MuCi0JKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX21ha2VfbGlua2VyX3NlY3Rpb25fcmVsYSk6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgdGhlIGFsd2F5c19zaXplX3NlY3Rpb25zIGhvb2suCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFVzZSBTRUNfTElOS0VSX0NSRUFURUQgaW5zdGVhZCBvZiBTRUNfSU5fTUVNT1JZCi0JdG8gaWRlbnRpZnkgZ2VuZXJhdGVkIGJpdHMuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCi0JKiBlbGY2NC1hbHBoYS5jOiBSZXdyaXRlIGV2ZXJ5dGhpbmcgdG91Y2hpbmcgcmVsb2NhdGlvbnMuCi0KLUZyaSBKYW4gIDMgMTE6NDI6NTMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKGFsbCBmdW5jdGlvbnMgYW5kIHN0YXRpYyB2YXJpYWJsZXMpOiBHbyB0aHJvdWdoCi0JYW5kIHJlZ3VsYXJpemUgbmFtZXMgdG8gYmUgb2YgdGhlIGZvcm0gdjg1MF9lbGZfPHh4eD4uCi0JKHRvcGxldmVsKTogSW5jbHVkZSA8ZWxmL3Y4NTAuaD4uCi0JKGVudW0gcmVsb2NfdHlwZSk6IE1vdmUgdG8gaW5jbHVkZS9lbGYvdjg1MC5oLgotCSh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiBGb3IgY29tbW9uIHZhcmlhYmxlcywgaWYgdGhlIHZhcmlhYmxlIGlzCi0JcmVmZXJlbmNlZCBieSBhIFJfVjg1MF97U0RBLFpEQSxUREF9IHJlbG9jYXRpb24sIHB1dCB0aGUgdmFyaWFibGUKLQlpbnRvIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLgotCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCi0KLVR1ZSBEZWMgMzEgMTU6MTU6MjggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogRml4IHNvbWUgc3BhY2luZy4KLQotVHVlIERlYyAzMSAxNDo0NDo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqZWwtKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCShtaXBzKi0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2xlYW4gdXAuCi0JUmV0dXJuIGEgdXNlZnVsIHZhbHVlLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQsIG5vdAotCWFjX2N2X2Z1bmNfbW1hcC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCBpbnN0ZWFkIG9mCi0JYWNfY3ZfZnVuY19tbWFwIGluIGJmZC9jb25maWd1cmUuaG9zdC4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZAotCWZpbHRlcl9zaGxpYiBhbmQgYXV4aWxpYXJ5X2ZpbHRlcl9zaGxpYiBwYXJhbWV0ZXJzLgotCSogZWxmLmMgKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBIYW5kbGUgRFRfQVVYSUxJQVJZIGFuZAotCURUX0ZJTFRFUi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBEZWMgMzAgMTg6NDg6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfYnVpbGRfbGRzeW1zKTogV2hlbiBleHBvcnRpbmcgYWxsIGRlZmluZWQKLQlzeW1ib2xzLCBkb24ndCBleHBvcnQgYSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBieSBhbiBvYmplY3QgaW4gYW4KLQlhcmNoaXZlIHdoaWNoIGNvbnRhaW5zIHNoYXJlZCBvYmplY3RzLgotCi1Nb24gRGVjIDMwIDE2OjEyOjU4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgYmZkX2FyY2hfdGljODAKLQlmb3IgVEkgVE1TMzIwYzgwIChNVlApLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfdGljODBfYXJjaC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZSBieSBydW5uaW5nICJtYWtlIGhlYWRlcnMiLgotCi1TdW4gRGVjIDI5IDE2OjE4OjUyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjcHUtdGljODAuYyAoYmZkX3RpYzgwX2FyY2gpOiBBZGQgc3RydWN0LgotCSogY29uZmlndXJlLmluIChjYXNlICR2ZWMpOiBDb3JyZWN0IHR5cG8sICJ0YiIgbm90ICJ0cCIuCi0JQWxzbyBhZGQgY29mZmxpbmsubyBmb3IgdGljODBjb2ZmX3ZlYy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCi1Nb24gRGVjIDMwIDExOjU0OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmM6IFBhdGNoIHVwIHRoZSBtbWFwIGNvZGUgc28gdGhhdCBpdCBpcyBvbmx5IGJ1aWx0IGlmIEJGRAotCWlzIGNvbmZpZ3VyZWQgd2l0aCAtLXdpdGgtbW1hcC4KLQotU3VuIERlYyAyOSAxMDo0ODo1NyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtdGljODAubwotCShBTExfTUFDSElORVMpOiBBZGQgY3B1LXRpYzgwLm8KLQkoY3B1LXRpYzgwLm8sIGNvZmYtdGljODAubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBjb2ZmLXRpYzgwLmM6IEFkZCBza2VsZXRvbiwgY2xvbmVkIGZyb20gYW5vdGhlciBjb2ZmIGNvbmZpZy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IG1hZ2ljIHRvIFRJQzgwTUFHSUMKLSAJZm9yIFRJYzgwLgotCi1GcmkgRGVjIDI3IDIwOjU2OjQxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBUT0RPOiBDb3JyZWN0IGEgbWlzc3BlbGxpbmcuCi0JKiBjb2ZmLXRpYzgwLmM6IE5ldyBmaWxlIGZvciBUSSBUTVMzMjBDODAgKE1WUCkuCi0JKiBjcHUtdGljODAuYzogTmV3IGZpbGUgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKS4KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAkdmVjKTogQWRkIHRpYzgwY29mZl92ZWMgZW50cnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQkqIGFyY2h1cmVzLmMgKGJmZF90aWM4MF9hcmNoKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaCAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX3RpYzgwLgotCSogY29uZmlnLmJmZCAoY2FzZSAke3Rhcmd9KTogQWRkIHRpYzgwKi0qLWNvZmYqIHRhcmdldC4KLQkqIHRhcmdldHMuYyAodGljODBjb2ZmX3ZlYyk6IEFkZCBkZWNsIGFzIGV4dGVybiBiZmRfdGFyZ2V0LgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCB0aWM4MGNvZmZfdmVjIGVudHJ5LgotCi1GcmkgRGVjIDI3IDExOjQ4OjEyIDE5OTYgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBlbGZsaW5rLmggKGVsZl9idWNrZXRzKTogQWRkIHNvbWUgbW9yZSB2YWx1ZXMgZm9yIGxhcmdlcgotCWJpbmFyaWVzLgotCi1UaHUgRGVjIDI2IDE4OjM2OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBNb3ZlIHN1YmRpcl9kbyBvdXQgb2YgY29uZGl0aW9uYWwuIEZyb20KLQlGcmVkIEZpc2ggPGZuZkBjeWdudXMuY29tPi4KLQotV2VkIERlYyAxOCAxMDowNDozMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAoZW51bSByZWxvY190eXBlKTogRW5hYmxlIGJhc2ljIDgsIDE2LCBhbmQKLQkzMiBiaXQgcmVsb2NzLgotCShlbGZfbW4xMDIwMF9ob3d0b190YWJsZSk6IExpa2V3aXNlLgotCShtbjEwMjAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDE3IDExOjA5OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBBZGQgMSB0byB0aGUgdmFsdWUgb2YgYQotCW1pcHMxNiBzeW1ib2wgZHVyaW5nIHRoZSBsaW5rLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBTdWJ0cmFjdCAxIGZyb20gdGhlIHZhbHVlIG9mIGEKLQltaXBzMTYgc3ltYm9sLgotCShtaXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogRGVmaW5lLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBQcmludCB0aGUgc3Rfb3RoZXIgZmllbGQgaWYgaXQgaXMKLQlub3QgemVyby4KLQotTW9uIERlYyAxNiAxNDozODozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCBjaGVjayBmb3IgcmVsb2Mgc2VjdGlvbnMKLQlhZ2FpbnN0IFNFQ19ERUJVR0dJTkcgc2VjdGlvbnMgaGVyZSAocmV2ZXJ0IHBhdGNoIG9mIERlY2VtYmVyIDUpLgotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBDaGVjayBmb3IgdGhlbSBoZXJlLCBpbnN0ZWFkLgotCi1TdW4gRGVjIDE1IDE0OjQ2OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBBZGQgZHluYW1pYyBwYXJhbWV0ZXIuCi0JKiBlbGYuYyAoX2JmZF9lbGZfY2Fub25pY2FsaXplX3JlbG9jKTogUGFzcyBuZXcgYXJndW1lbnQgdG8KLQlzbHVycF9yZWxvY190YWJsZS4KLQkoX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX3NpemVfaW5mbyk6IFVwZGF0ZSBkZWNsYXJhdGlvbiBvZgotCXNsdXJwX3JlbG9jX3RhYmxlLgotCShfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVjbGFyZS4KLQkqIGVsZnh4LXRhcmdldC5oOiBVc2UgbmV3IGR5bmFtaWMgcmVsb2Mgcm91dGluZXMgYnkgZGVmYXVsdC4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zbHVycF9yZWxvY190YWJsZSk6IEFkZCBkeW5hbWljCi0JcGFyYW1ldGVyLgotCi1GcmkgRGVjIDEzIDEzOjE4OjQ5IDE5OTYgIERhbiBXaWxkZXIgIDxkYW5AZ2FzYm95LmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfZmxhZ3MpOiBVc2UgTUM2OEtCQ1NNQUdJQyBmb3IgYmZkX2FyY2hfbTY4awotCWlmIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSBpcyBkZWZpbmVkLgotCi1GcmkgRGVjIDEzIDExOjEzOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoZW51bSBtYWNoaW5lX3R5cGUpOiBDaGFuZ2UgTV9TUEFSQ0xFVCBmcm9tIDE0MiB0byAxMzEuCi0KLVRodSBEZWMgMTIgMTU6MDc6MjAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBNb3ZlIFJfUFBDX1BMVFJFTDI0IGludG8gdGhlCi0Jc3VwcG9ydGVkIHJlbG9jcy4KLQotVGh1IERlYyAxMiAxNDo1NTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBhZGQgYSB3ZWFrCi0Jc3ltYm9sIGlmIHRoZSByZWFsIGRlZmluaXRpb24gaXMgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCUFmdGVyIGZpbmRpbmcgdGhlIHJlYWwgZGVmaW5pdGlvbiwgdGhlbiwgaWYgaXQgaXMgZHluYW1pYywgYWRkIHRoZQotCXdlYWsgc3ltYm9sIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQotCSogY29mZi1hdXguYyAoY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sKTogTWFrZSBzdGF0aWMuCi0KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9zZXRfYXJjaF9tYWNoKTogRG9uJ3QgZGVmaW5lOyBpdCdzIGEKLQlmdW5jdGlvbi4KLQkocHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IHRha2UgdGhlIGFkZHJlc3Mgb2YgYW4KLQlhcnJheS4KLQotVHVlIERlYyAxMCAyMzoyMzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAocmVsb2NfdHlwZSk6IFJlbW92ZSBiaWcgZW5kaWFuIG1uMTAzMDAgcmVsb2MKLQl2YXJpYW50cy4KLQkoZWxmMzJfbW4xMDMwMF9ob3d0b190YWJsZSwgbW4xMDMwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBXcml0ZSBkYXRhIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LgotCSogcmVsb2MuYzogUmVtb3ZlIG1uMTAzMDAgYmlnIGVuZGlhbiByZWxvY3MuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi1tbjEwMjAwLmM6IFVwZGF0ZSBmcm9tIGVsZjMyLW1uMTAzMDAuYy4KLQotRnJpIERlYyAgNiAxNToxODowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIpOiBEZWZpbmUuCi0KLQkqIGVsZjMyLW1uMTAzMDAuYzogQWRkIHNvbWUgY29tbWVudHMuCi0KLUZyaSBEZWMgIDYgMTc6MTY6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IEFsd2F5cyBpbml0aWFsaXplIGJ1ZiBiZWZvcmUganVtcGluZyB0bwotCWVycm9yX3JldHVybi4KLQkoaWhleF9yZWFkX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotVGh1IERlYyAgNSAyMjoyOToxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoZWxmX21uMTAzMDBfaG93dG9fdGFibGUpOiBEb24ndCBzZXQgcGFydGlhbC0KLQlpbnBsYWNlIGZvciBtb3N0IHJlbG9jcy4KLQotVGh1IERlYyAgNSAxMzoyNDo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2FsbGluZyBjaGVja19yZWxvY3MKLQlldmVuIGlmIFNFQ19BTExPQyBpcyBub3Qgc2V0LgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBEb24ndCBjaGVjayBTRUNfQUxMT0MKLQl3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gY29weSBhIHJlbG9jIGludG8gYSBzaGFyZWQgb2JqZWN0LgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBEb24ndCBzZXQgU0VDX0FMTE9DIGluIGEKLQlyZWxvYyBzZWN0aW9uIGlmIGl0IGlzIG5vdCBzZXQgaW4gdGhlIHNvdXJjZSBzZWN0aW9uLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFyayBhIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZAotCXdpdGggYSBTRUNfREVCVUdHSU5HIHNlY3Rpb24gYXMgU0VDX0RFQlVHR0lORy4KLQotV2VkIERlYyAgNCAxNDoxODoxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6ICNpZiAwIGNvZGUgdGhhdAotCWV4cGVjdHMgYSAuZ290LnBsdCB1bnRpbCB3ZSBhY3R1YWxseSBjcmVhdGUgaXQuCi0KLU1vbiBEZWMgIDIgMTI6MTM6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogUHJpbnQgYW4gZXJyb3IKLQltZXNzYWdlIGZvciBiZmRfcmVsb2Nfb3V0b2ZyYW5nZSwgcmF0aGVyIHRoYW4gYWJvcnRpbmcuICBGcm9tCi0JUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jcyBpbgotCWEgcmVsb2NhdGVhYmxlIGxpbmssIGRvbid0IHRyeSB0byBwcm9jZXNzIHRoZW0uICBGcm9tIEhlaW56IFdyb2JlbAotCTx3cm9iZWxAbHByLmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uCi0KLU1vbiBEZWMgIDIgMDA6Mzk6MjQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKG1uMTAzMDBfaW5mb19ob3d0byk6IFJlbmFtZWQgZnJvbQotCW1uMTAzMDBfaW5mb19ob3d0b19yZWwuICBUd2VhayByZWxvYyBhcmd1bWVudCB0byBiZSBhbgotCUVsZjMyX0ludGVybmFsX1JlbGEuCi0JKFVTRV9SRUxBKTogRGVmaW5lIGluc3RlYWQgb2YgVVNFX1JFTC4KLQkoZWxmX2luZm9fdG9faG93dG8sIGVsZl9pbmZvX2hvd3RvX3JlbCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotU3VuIERlYyAgMSAwMDoxODo1OSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiAgSGFuZGxlIG1pcHMqLXNnaS1pcml4NiouCi0JKiBpcml4LWNvcmUuYyAoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogIEFjY2VwdCBDT1JFX01BR0lDTjMyCi0JY29yZSBmaWxlcy4KLQotV2VkIE5vdiAyNyAxMjoxMDoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFdhcm4gYWJvdXQgYQotCXJlbG9jYXRpb24gYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIGEgc2VjdGlvbiB3aXRoIG5vIG91dHB1dAotCXNlY3Rpb24uCi0KLVR1ZSBOb3YgMjYgMTE6MDc6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChCRkRfQ0NfRk9SX0JVSUxEKTogRG9uJ3QgcmVxdWlyZSBBQ19DX0NST1NTLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG90aGVyIGZpZWxkLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBvdGhlciBmaWVsZC4KLQkoc3dhcF9vdXRfc3ltcyk6IFNldCBzdF9vdGhlciBmcm9tIGV4aXN0aW5nIHN0X290aGVyIGZpZWxkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTdG9yZSBzdF9vdGhlciBpbiBoYXNoCi0JdGFibGUgb3RoZXIgZmllbGQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBTZXQgdGhlIG90aGVyIGZpZWxkIGZyb20gdGhlIGdsb2JhbCBoYXNoCi0JdGFibGUgZW50cnkuCi0JKiBlbGYzMi1taXBzLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX01JUFMxNl8yNi4KLQkoZWxmX21pcHMxNl9qdW1wX2hvd3RvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwczE2X2p1bXBfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTMTZfSk1QLgotCShtaXBzX2luZm9fdG9faG93dG9fcmVsKTogSGFuZGxlIFJfTUlQUzE2XzI2LgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfTUlQUzE2XzI2LiAgSGFuZGxlIFJfTUlQU18yNgotCXRvIGEgbWlwczE2IHN5bWJvbC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NSVBTMTZfSk1QKTogQWRkIHRvIGxpc3Qgb2YgcmVsb2NzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbWlwczoxNiBlbnRyeS4KLQotTW9uIE5vdiAyNSAxMToyMzozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgbG9uZyBsb25nIGZvciBtaXBzLXNnaS1pcml4NiouCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogTWFrZSBsaW5lIG51bWJlciBvdmVyZmxvdwotCW9ubHkgYSB3YXJuaW5nLiAgRnJvbSBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZGVtdXl0QHVsYi5hYy5iZT4uCi0KLU1vbiBOb3YgMjUgMDg6NTI6MjkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKGJmZF9lbGYzMl9tbjEwMzAwX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShlbnVtIHJlbG9jX3R5cGUpOiBBZGQgbW9yZSByZWxvYyB0eXBlcy4KLQkoZWxmMzJfbW4xMDMwMF9ob3d0b190YWJsZSk6IFVwZGF0ZSBmb3IgbmV3IHJlbG9jIHR5cGVzLgotCShlbGYzMl9tbjEwMzAwX3JlbG9jX21hcCk6IFVwZGF0ZSBmb3IgbmV3IHJlbG9jIHR5cGVzLgotCSogcmVsb2MuYzogQWRkIHNvbWUgbmV3IHJlbG9jcyBmb3IgdGhlIG1uMTAzMDAgc2VyaWVzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotU2F0IE5vdiAyMyAxMzoyNjoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IERvbid0IGxvc2UgZm9yIGEgc3BhY2Ugd2hpY2ggaGFzCi0Jbm8gZGF0YSwgYnV0IHNvbWUgc3ltYm9scy4KLQotRnJpIE5vdiAyMiAxMTozMjoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgZ290X25lZWRlZCBmaWVsZC4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgZ290X25lZWRlZC4KLQkoc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHNldCAuZ290IHNlY3Rpb24gc2l6ZSBpZiBpdAotCWlzIG5vdCBhbHJlYWR5IHNldC4gIFNldCBnb3RfbmVlZGVkLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2hlY2sgZ290X25lZWRlZC4gIE9ubHkgc2V0Ci0Jc2R5bnB0ciwgYW5kIG9ubHkgaGFuZGxlIGR5bmFtaWMgc2VjdGlvbnMsIGlmIGR5bmFtaWMgc2VjdGlvbnMgYXJlCi0JbmVlZGVkLgotCShzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBQYXNzIGZhbHNlIHRvIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCUluaXRpYWxpemUgLmdvdCBzZWN0aW9uLgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBTZXQgdXAgUExUIGVudHJ5IGV2ZW4gaWYgdGhpcyBpcyBub3QKLQlhIGR5bmFtaWMgc3ltYm9sLgotCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogQ2hlY2sgZ290X25lZWRlZC4gIE9ubHkgc2V0IHVwCi0JZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGlmIG5lZWRlZC4KLQotVGh1IE5vdiAyMSAxMDozMTozMSAxOTk2ICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZGVkIFZlcnNhRE9TIGZvcm1hdCB0byB0aGUgRXJpY3Nzb24gY29uZmlndXJhdGlvbi4KLQotV2VkIE5vdiAyMCAxNjozMTozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYzogUm91Z2ggY3V0IGF0IHJlbG9jcyBmb3IgdGhlIG1uMTAzMDAuCi0KLVdlZCBOb3YgMTMgMDg6MTI6MzggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZWxmMzItZDEwdi5vKTogRG9uJ3QgZGVwZW5kIG9uIGVsZi9kMTB2LmgKLQlhbnltb3JlLgotCi1UdWUgTm92IDEyIDEzOjMwOjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogZmlsZW1vZGUuYzogSW5jbHVkZSBzeXNkZXAuaC4KLQkqIGloZXguYzogQWRkIGNhc3RzIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncy4KLQkqIHN1bm9zLmM6IEFkZCBjYXN0cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCi0KLU1vbiBOb3YgMTEgMTA6Mzc6MDIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgLmdvdC5wbHQKLQlzZWN0aW9uLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEFkZCBzdXBwb3J0IGZvciBSX1BQQ19MT0NBTDI0UEMuICBNYWtlCi0JYXBwcm9wcmlhdGUgcmVsb2NhdGlvbnMgaW4gdGhlIC5zbyBmaWxlIGlmIHNoYXJlZC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLVR1ZSBPY3QgMjkgMTU6MDM6MDIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChlbGZfbTMycl9ob3d0b190YWJsZSwgUl9NMzJSXzI0KTogVXNlCi0JY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQuCi0KLVR1ZSBPY3QgMjkgMTI6NTM6NDYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQxMHYuYyAoZWxmX2QxMHZfaG93dG9fdGFibGUpOiBEb24ndCBjb21wbGFpbiBvbgotCW92ZXJmbG93cyBmb3IgUl9EMTBWXzE2IGFuZCBSX0QxMFZfMTguCi0KLVR1ZSBPY3QgMjkgMTM6MjM6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0KTogVXNlIExNQSByYXRoZXIgdGhhbiBWTUEuCi0JKGRvX3dpdGhfcmVsb2NzKTogTGlrZXdpc2UuCi0JKGRvX2FzX3JlcGVhdCk6IExpa2V3aXNlLgotCShjb3B5X2V4cHJlc3Npb24pOiBMaWtld2lzZS4KLQotRnJpIE9jdCAyNSAxNjo1Njo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0KTogQ29ycmVjdGx5IHJlY29yZCB3aGV0aGVyCi0JdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcGFydC4KLQotVGh1IE9jdCAyNCAxNDozMjo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmMzJfdjg1MF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IENvcnJlY3RseQotCWhhbmRsZSB0ZGEgb2Zmc2V0cyBmb3Igc2xkLncgYW5kIHNzdC53IGluc3RydWN0aW9ucy4KLQlGaXggYWxpZ25tZW50IGNoZWNrIGluIHNsZC53IGFuZCBzc3QudyB0ZGEgcmVsb2MgaGFuZGxpbmcuCi0KLVRodSBPY3QgMjQgMDk6MDg6NDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiAgU2V0IFVTRV9CSU5BUllfRk9QRU4gZm9yICotKi13aW5kb3dzLgotCi1XZWQgT2N0IDIzIDAwOjUzOjE2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jOiBBZGQgY29tbWVudHMgYWJvdXQgYXNzdW1wdGlvbnMgYWJvdXQKLQljaGFyLCBzaG9ydCAmIGxvbmcgc2l6ZXMuCi0JKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBGaXggc2lnbiBleHRlbnNpb24KLQlwcm9ibGVtcyBmb3Igc2V2ZXJhbCByZWxvY3MuCi0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmMzJfdjg1MF9ob3d0b190YWJsZSk6IEZpeCB0eXBvIGluCi0JUl9WODUwX1NEQV9PRkZTRVQgZW50cnkuCi0KLVdlZCBPY3QgMjMgMDA6MjA6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBEb24ndCBhbGxvY2F0ZSBsZHN5bS4KLQlTdG9yZSBpbXBvcnQgZmlsZSBpbmRleCBpbiBsZGluZHguCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IEFzc3VtZSB0aGF0IGxkc3ltIHdhcyBub3QgcHJldmlvdXNseQotCWFsbG9jYXRlZC4gIEZvciBhbiBpbXBvcnRlZCBzeW1ib2wsIGNvcHkgbGRpbmR4IGludG8gbF9pZmlsZS4KLQotVHVlIE9jdCAyMiAxOToyMDozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBGaXggb3JkZXJpbmcgb2YKLQlSX1Y4NTBfWkRBX09GRlNFVCBhbmQgUl9WODUwX1REQV9PRkZTRVQuICBGaXggdmFyaW91cwotCWZpZWxkcyBpbiBSX1Y4NTBfVERBX09GRlNFVC4KLQkoZWxmMzJfdjg1MF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IFR3ZWFrIHBjLXJlbGF0aXZlCi0JcmVsb2NzIHRvIHdvcmsgbW9yZSBsaWtlIG90aGVyIHJlbG9jcy4gIEhhbmRsZSBSX1Y4NTBfVERBX09GRlNFVAotCXJlbG9jYXRpb25zLgotCi0JKiBlbGYzMi12ODUwLmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IFJldHVybiBhbiBlcnJvciBpZiB3ZSBnZXQgYSByZWxvYwotCXdlIGNhbid0IGhhbmRsZS4KLQkoZWxmMzJfdjg1MF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkodjg1MF9lbGZfcmVsb2NhdGlvbl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0KLVR1ZSBPY3QgMjIgMTc6MjI6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSWdub3JlIHNlY3Rpb25zIHdoaWNoCi0JZG9uJ3QgaGF2ZSBTRUNfTE9BRCBhbmQgU0VDX0FMTE9DIHNldC4KLQotTW9uIE9jdCAyMSAxMjoxMzowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEF2b2lkIGxvc2luZyBzdGF0aWMKLQlzeW1ib2xzIGluIHRoZSAuYnNzIHNlY3Rpb24uCi0KLU1vbiBPY3QgMjEgMTA6NTQ6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogRGVzY3JpYmUgUl9NSVBTXzY0LgotCShtaXBzMzJfNjRiaXRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX3JlbG9jX21hcCk6IEFkZCBlbnRyeSBmb3IgQkZEX1JFTE9DXzY0LgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfTUlQU182NC4KLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IFByaW50IGFuIGVycm9yIG1lc3NhZ2UKLQl3aGVuIGF0dGVtcHRpbmcgdG8gZG8gYSByZWxvY2F0ZWFibGUgbGluayB3aXRoIGRpZmZlcmVudCBvYmplY3QKLQlmaWxlIGZvcm1hdHMsIHJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLVRodSBPY3QgMTcgMTA6NDM6MjkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAobTMyciByZWxvY3MpOiBSZW5hbWUgdGhlbS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItbTMyci5jOiBVcGRhdGUuCi0JKG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbTMycl9ob3d0b190YWJsZSwgUl9NMzJSXzEwX1BDUkVMIGVudHJ5KTogVXNlIGl0LgotCShlbGZfbTMycl9ob3d0b190YWJsZSwgUl9NMzJSXzI0IGVudHJ5KTogRml4IHtzcmMsZHN0fV9tYXNrcy4KLQotV2VkIE9jdCAxNiAxMToyNDozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IFNldCAibGlua2VyX21hcmsiIGZvcgotCWFsbCBzZWN0aW9ucyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IERpc2NhcmQgc3ltYm9scyBpbiBzZWN0aW9ucwotCXdoaWNoIGFyZSBiZWluZyBkaXNjYXJkZWQuCi0JKiBlbGYzMi12ODUwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfU0RBX09GRlNFVCwKLQlSX1Y4NTBfVERBX09GRlNFVCBhbmQgUl9WODUwX1pEQV9PRkZTRVQuCi0JKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCShlbGZfdjg1MF9yZWxvY19tYXApOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiByZWxvYy5jOiBBZGQgYWRkaXRpb25hbCBWODUwIHJlbG9jYXRpb25zLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IE1hc2sgb3V0IGJpdHMgd2UKLQlubyBsb25nZXIgd2FudCBpbiBwYy1yZWxhdGl2ZSByZWxvY3MuCi0KLVR1ZSBPY3QgMTUgMjI6MTc6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogRG9uJ3Qgc2lsZW50bHkKLQlhY2NlcHQgYSByZWxvYyBhZ2FpbnN0IGFuIHVuZGVmaW5lZCBzeWJtb2whCi0KLVR1ZSBPY3QgMTUgMTY6MTc6MjggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jOiAgRGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyIHRvIGJlICdfJy4KLQotVHVlIE9jdCAxNSAxMjo0MDo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFZFUlNJT046IEJ1bXAgZm9yIG5ldyByZWxvY2F0aW9uLgotCi0JKiBob3N0cy9pMzg2YnNkLmg6IElmIE5CUEcgaXMgbm90IGRlZmluZWQsIGRlZmluZSBpdCBhcwotCVBBR0VfU0laRSwgZm9yIHJlY2VudCB2ZXJzaW9ucyBvZiBGcmVlQlNELgotCi1Nb24gT2N0IDE0IDEyOjM3OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBgbG9uZyBsb25nJyBhcyB0aGUgNjQgYml0IHR5cGUgb24gYSBTb2xhcmlzCi0JaG9zdCwgc2luY2UgYm90aCBnY2MgYW5kIHRoZSBTdW5QUk8gY29tcGlsZXJzIHN1cHBvcnQgaXQuCi0KLU1vbiBPY3QgMTQgMTE6MTc6MjQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHJlbG9jLmM6IENyZWF0ZSBhIG5ldyBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwuICBJdCB3YXMgYQotCW1pc3Rha2UgdG8gaGF2ZSByZXVzZWQgdGhlIEVDT0ZGIExJVEVSQUwgZm9yIEVMRiBzaW5jZSB0aGV5IGhhdmUKLQlkaWZmZXJlbnQgc2VtYW50aWNzLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmX3JlbG9jX21hcCk6IE1hcCBmcm9tIEVMRl9MSVRFUkFMLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVHJhcCAuZ290Ci0Jc2VjdGlvbiBvdmVyZmxvdy4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IERvIG5vdCBlbWl0IGEKLQlkeW5hbWljIHJlbG9jYXRpb24gZm9yIGFuIHVuZGVmd2VhayBzeW1ib2wgd2hlbiB3ZSBhcmUgYnVpbGRpbmcKLQlhIHN0YXRpYyBleGVjdXRhYmxlLgotCi1UaHUgT2N0IDEwIDExOjE1OjA2IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkIChjb25maWcuYmZkLCB0YXJnbWF0Y2guc2VkKTogRWRpdCByZWZlcmVuY2VzIHRvCi0JcG9pbnQgZXhwbGljaXRseSB0byBzcmNkaXIuCi0JKHRhcmdtYXRjaC5oKTogRWRpdCByZWZlcmVuY2VzIHRvIHBvaW50IGV4cGxpY2l0bHkgdG8gb2JqZGlyLgotCi1UaHUgT2N0IDEwIDE0OjE0OjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogV2hlbiBzZXR0aW5nIHRhcmdfY3B1LCBkb24ndCBnZXQgY29uZnVzZWQgYnkKLQlsaW51eC1nbnUuCi0KLVR1ZSBPY3QgIDggMDg6NTE6MTkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6ICBBZGQgc3VwcG9ydCBmb3Igd2luZG93cyBob3N0IChhIGJ1aWxkIGRvbmUKLQl1bmRlciB0aGUgTWljcm9zb2Z0IGJ1aWxkIGVudmlyb25tZW50KS4KLQotVHVlIE9jdCAgOCAxMTo0MDoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgYSBzeW1ib2wgaXMgYSB3ZWFrCi0JZGVmaW5pdGlvbiBpbiBhIGR5bmFtaWMgb2JqZWN0LCBhZGQgaXQgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlCi0JaWYgYW55IGR5bmFtaWMgb2JqZWN0IG1lbnRpb25zIGl0LiAgUmV2ZXJ0cyBwYXJ0IG9mIGxhc3QgcGF0Y2guCi0KLQkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgZ290X2Jhc2UgZmllbGQuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIGdvdF9iYXNlLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlCi0JdGhhbiAweDEwMDAgYnl0ZXMsIHNldCBfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFuZCBnb3RfYmFzZSB0bwotCTB4MTAwMC4KLQkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IFN1YnRyYWN0IGdvdF9iYXNlIGZyb20gYSBiYXNlCi0JcmVsYXRpdmUgcmVsb2NhdGlvbi4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19pc2EpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCB3YXJuIGFib3V0IGxpbmtpbmcKLQktbWlwczEgYW5kIC1taXBzMiBjb2RlIHRvZ2V0aGVyLCBvciAtbWlwczMgYW5kIC1taXBzNCBjb2RlLgotCi1Nb24gT2N0ICA3IDExOjQ0OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogT25seSB0cmVhdCBhcmNoaXZlIGFzIGxpdHRsZQotCWVuZGlhbiBmb3IgaTk2MCBDT0ZGLgotCi1GcmkgT2N0ICA0IDEzOjQ5OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGp1c3Qgc29mYXIKLSAJYnkgdGhlIGNoYW5nZSBpbiBzaXplIG9mIHRoZSBzZWN0aW9uIHdoZW4gRVhFQ19QIGlzIG5vdCBzZXQuCi0KLQkqIGNvZmYtbTY4ay5jIChjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShtNjhrY29mZl9ydHlwZV90b19ob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjZi1tNjhrbHlueC5jIChjb2ZmX202OGtfbHlueF9ydHlwZV90b19ob3d0byk6IEFkZCB0aGUgc2VjdGlvbgotCVZNQSB0byB0aGUgYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jLgotCi0JKiBkZXAtaW4uc2VkOiBSZXdvcmsgYmFja3NsYXNoIGxvb3AgYSBiaXQgdG8gYXZvaWQgYnVnIGluIHNlZCBvbgotCUhQL1VYIDEwLjIwLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBkZXAtaW4uc2VkOiBSZW1vdmUgLi4vYmZkL3N5c2RlcC5oLCBzaW5jZSBpdCB3aWxsIGFwcGVhciB3aGVuCi0Jc29tLmggaXMgaW5jbHVkZWQuCi0KLUZyaSBPY3QgIDQgMTE6NDE6MzkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIGV4cGxpY2l0IGRlcGVuZGVuY2llcyBmb3IgbW4xMDIwMCBhbmQKLQltbjEwMzAwIGZpbGVzLgotCShBTExfTUFDSElORV9DRklMRVMpOiBBZGQgY3B1LW1uMTAyMDAuYyBhbmQgY3B1LW1uMTAzMDAuYy4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLW1uMTAyMDAuYyBhbmQgZWxmMzItbW4xMDMwMC5jCi0JKGRlcGVuZGVuY2llcyk6IFJlYnVpbHQuCi0KLVRodSBPY3QgIDMgMTY6NTc6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBTZXQgb2JqX2NvZmZfa2VlcF9zeW1zCi0JZHVyaW5nIHRoaXMgZnVuY3Rpb24uCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogT25seSB1c2UgYW4gZXhpc3RpbmcKLQlzZWN0aW9uIGlmIHRoZSBmbGFncyBhcmUgY29tcGF0aWJsZS4KLQotCSogY29uZmlndXJlLmluOiBBZGQgaGF2ZXZlY3MsIGFuZCBwdXQgaXQgaW4gdGRlZmF1bHRzLgotCSogbXB3LWNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnbWF0Y2guc2VkOiBOZXcgZmlsZTsgYSBzZWQgc2NyaXB0IHRvIGJ1aWxkIHRhcmdtYXRjaC5oIGZyb20KLQljb25maWcuYmZkLgotCSogY29uZmlnLmJmZDogQWRkICNpZiwgI2VuZGlmLCBhbmQgY29tbWVudHMgZm9yIHRhcmdtYXRjaC5oLgotCSogdGFyZ2V0cy5jOiBJbmNsdWRlICJmbm1hdGNoLmgiLgotCShzdHJ1Y3QgdGFyZ21hdGNoKTogRGVmaW5lLgotCShiZmRfdGFyZ2V0X21hdGNoKTogRGVmaW5lIGJ5IGluY2x1ZGluZyB0YXJnbWF0Y2guaC4KLQkoYmZkX2ZpbmRfdGFyZ2V0KTogSWYgdGhlIHRhcmdldCBpcyBub3QgZm91bmQgYnkgbmFtZSwgc2VhcmNoIGZvcgotCWl0IGFzIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dC1hcm0ubywgYW91dC1zcGFyY2xlLm8sIGhwMzAwYnNkLm8sCi0JaTM4NmR5bml4Lm8sIG02OGs0a25ldGJzZC5vLCBhbmQgcmlzY2l4Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBhb3V0LWFybS5jLCBhb3V0LXNwYXJjbGUuYywKLQlocDMwMGJzZC5jLCBpMzg2ZHluaXguYywgbTY4azRrbmV0YnNkLmMsIGFuZCByaXNjaXguYy4KLQkoSEZJTEVTKTogQWRkIHRhcmdtYXRjaC5oLiAgQWxzbywgYWxwaGFiZXRpemUgYW5kIHJlaW5kZW50LgotCShDRklMRVMpOiBSZW1vdmUgaTM4NmR5bml4LmMgYW5kIGhwMzAwYnNkLmMuCi0JKHRhcmdtYXRjaC5oKTogTmV3IHRhcmdldC4KLQkoZG9fY2xlYW4pOiBSZW1vdmUgdGFyZ21hdGNoLmguCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikuCi0JKiBhY2NvbmZpZy5oOiBBZGQgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIHN5c2RlcC5oOiBJZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViwgZGVjbGFyZSBnZXRlbnYuCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfb2JqZWN0X3ApOiBEb24ndCBkZWNsYXJlIGdldGVudi4KLQotVGh1IE9jdCAgMyAwOToyOTowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNwdS1tbjEweDAwLmMsIGVsZjMyLW1uMTB4MDA6IFJlbW92ZWQuCi0JKiBjcHUtbW4xMDIwMC5jLCBjcHUtbW4xMDMwMC5jOiBOZXcgZmlsZXMuCi0JKiBlbGYzMi1tbjEwMjAwLmMsIGVsZjMyLW1uMTAzMDAuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IEJyZWFrIG1uMTB4MDAgc3VwcG9ydCBpbnRvIHR3byBzZXBhcmF0ZQotCWNvbmZpZ3VyYXRpb25zLCBtbjEwMjAwIGFuZCBtbjEwMzAwLgotCSogYXJjaHVyZXMuYywgY29uZmlnLmJmZCwgY29uZmlndXJlLmluLCBlbGYuYywgdGFyZ2V0cy5jOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaCwgY29uZmlndXJlOiBSZWJ1aWx0LgotCi1UaHUgT2N0ICAzIDE1OjM4OjE5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkb19jbGVhbik6IE1vdmUgY29uZmlnLmxvZyB0byBkb19kaXN0Y2xlYW4uCi0KLVdlZCBPY3QgIDIgMjE6NDA6NTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjcHUtbW4xMHgwMC5jLCBlbGYzMi1tbjEweDAwLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LW1uMTB4MDAuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBTaW1pbGFybHkgZm9yIGVsZjMyLW1uMTB4MDAuby4KLQkoZWxmMzItbW4xMHgwMC5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGFyY2h1cmVzLmMgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBiZmRfYXJjaF9tbjEweDAwLgotCShiZmRfbW4xMHgwMF9hcmNoKTogRGVjbGFyZS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX21uMTB4MDBfYXJjaC4KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtbjEweDAwLSotKi4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGJmZF9lbGYzMl9tbjEweDAwX3ZlYy4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgYmZkX2FyY2hfbW4xMHgwMC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX21uMTB4MDBfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjMyX21uMTB4MDBfdmVjLgotCSogYmZkLWluMi5oLCBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVdlZCBPY3QgIDIgMTU6NDY6NDUgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQlvcGVuVk1TL0FscGhhOiBQcm92aWRlIGZpbGVuYW1lIGFuZCBjYXNlX2hhY2sgZmxhZ3MgdmlhCi0Jc3ltYm9sIHRhYmxlIGZyb20gZ2FzLgotCUFkZCBjYXNlX2hhY2sgY29kZSBmb3Igc3ltYm9sIG91dHB1dCBmcm9tIHZheC92bXMuCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfaW5pdGlhbGl6ZSk6IFJlbW92ZSBmaWxlbmFtZSBoYW5kbGluZywKLQlmaWxlbmFtZSBpcyBwcm92aWRlZCB2aWEgc3ltYm9sIHRhYmxlLgotCShldmF4X2dldF9zeW10YWIpOiBVc2UgbG9jYWwgc3ltYm9sIGNvdW50IHdoZW4gc2V0dGluZyB1cCB0YWJsZS4KLQkqIGV2YXgtZWdzZC5jIChfYmZkX2V2YXhfc2x1cnBfZWdzZCk6IFByaW50IGNvcnJlY3QgbmFtZSB3aGVuCi0JZGVidWdnaW5nLgotCShfYmZkX2V2YXhfd3JpdGVfZWdzZCk6IFNraXAgZmlsZSBuYW1lIHN5bWJvbC4KLQkqIGV2YXgtZW1oLmMgKGdldF92bXNfdGltZV9zdHJpbmcpOiBMb2NhbCBmdW5jdGlvbiBub3cuCi0JKF9iZmRfZXZheF93cml0ZV9lbWgpOiBFeHRyYWN0IHNvdXJjZSBmaWxlbmFtZSBhbmQgY2FzZV9oYWNrIGZsYWdzCi0JZnJvbSBzeW1ib2wgdGFibGUuCi0JKiBldmF4X3dyaXRlX2V0aXIgKF9iZmRfZXZheF93cml0ZV9ldGlyKTogUGFzcyBhbGwgc3ltYm9sIG5hbWVzCi0JdGhyb3VnaCBfYmZkX2V2YXhfY2FzZV9oYWNrX3N5bWJvbC4KLQkqIGV2YXgtbWlzYy5jIChoYXNoX3N0cmluZywgX2JmZF9ldmF4X2Nhc2VfaGFja19zeW1ib2wpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKF9iZmRfZXZheF9iYXNlbmFtZSk6IFJlbW92ZWQuCi0JKF9iZmRfZ2V0X3Ztc190aW1lX3N0cmluZyk6IE1vdmVkIHRvIGV2YXgtZW1oLmMuCi0JKiBldmF4LmggKGV2YXhfcHJpdmF0ZV9kYXRhX3N0cnVjdCk6IFJlbW92ZSBmaWxlbmFtZS4KLQkoZmxhZ19oYXNoX2xvbmdfbmFtZXMsIGZsYWdfc2hvd19hZnRlcl90cnVuYywKLQlmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZSwgdm1zX25hbWVfbWFwcGluZyk6IE5ldyBmbGFncyBmb3IKLQl2bXNfY2FzZV9oYWNrLgotCi1XZWQgT2N0ICAyIDEyOjAyOjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZnJlZWJzZC5oIChOX0dFVF9NQUdJQ19ORVQpOiBEb24ndCB1c2UgbnRvaGwuCi0JKE5fR0VUTUlEX05FVCwgTl9HRVRGTEFHX05FVCk6IExpa2V3aXNlLgotCShOT19TV0FQX01BR0lDKTogRG9uJ3QgZGVmaW5lLgotCShTV0FQX01BR0lDKTogRGVmaW5lLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBjcmFzaCBpZiB0aGVyZSBpcwotCW5vIGhhc2ggdGFibGUgZW50cnkgZm9yIGEgZ2xvYmFsIHN5bWJvbC4KLQotVHVlIE9jdCAgMSAxNjoxNDoyMiAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIG1pcHMqLSotZWxmKi4KLQotVHVlIE9jdCAgMSAxMjozMTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERvbid0IG92ZXJyaWRlIGEgbWVhbmluZ2Z1bAotCXN5bWJvbCB0eXBlIHdpdGggVF9OVUxMLiAgV2FybiBpZiBzeW1ib2wgdHlwZSBjaGFuZ2VzLiAgQmFzZWQgb24KLQlwYXRjaCBmcm9tIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBwdXQgYSBzeW1ib2wgZnJvbQotCWEgZHluYW1pYyBvYmplY3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlmIGl0IGlzIHJlZmVyZW5jZWQKLQlvciBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuCi0KLUZyaSBTZXAgMjcgMTg6NDE6MDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9pc19sb2NhbF9sYWJlbCk6ICBOZXcgZnVuY3Rpb24gdG8KLQlyZW1vdmUgZHdhcmYgbG9jYWwgbGFiZWxzLiAgU2hyaW5rcyBiaW5hcmllcyBieSBhIGZhY3RvciBvZiAzIQotCi1Nb24gU2VwIDIzIDEzOjMzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogQ3JlYXRlIHRoZSAuc2JzcyBzZWN0aW9uCi0JYnkgaGFuZCwgcmF0aGVyIHRoYW4gYnkgY2FsbGluZyBiZmRfbWFrZV9zZWN0aW9uLgotCi1Nb24gU2VwIDIzIDA5OjIzOjQxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBSZW5hbWUgbTMyciByZWxvY3MuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogZWxmMzItbTMyci5jOiBVcGRhdGUuCi0KLUZyaSBTZXAgMjAgMTE6NDM6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlCi0JbGluaywgYWRqdXN0IHRoZSBzeW1ib2wgaW5kZXggb2YgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLiAgRG9uJ3QKLQljaGFuZ2UgdGhlIGFkZGVuZCBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jIGlmIHBjcmVsX29mZnNldCBpcyBzZXQuCi0JKiBzdW5vcy5jIChiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgZG8gYW55dGhpbmcgZm9yCi0JYSByZWxvY2F0ZWFibGUgbGluay4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFwcGx5IHRoZSByZWxvY2F0aW9uIGV2ZW4gaWYKLQlpdCBpcyB6ZXJvLCBpbiBjYXNlIHNyY19tYXNrIG1hdHRlcnMuCi0JKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQotVGh1IFNlcCAxOSAxMTowMzowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogQWx3YXlzIGluaXRpYWxpemUKLQlrZWVwX3N5bXMuCi0gCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IHRhcmdldF9pbmRleAotCXRvIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUuCi0KLVR1ZSBTZXAgMTcgMTQ6MTg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX2xpbmVfdGFibGUpOiBXYXJuIGFib3V0IGlsbGVnYWwgc3ltYm9sCi0JaW5kaWNlcywgcmF0aGVyIHRoYW4gY3Jhc2hpbmcuCi0JKGNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBMaWtld2lzZS4gIENoZWNrIHdoZXRoZXIgdGhlIGhvd3RvIGZpZWxkCi0JaXMgTlVMTC4KLQkqIGNvZmYtc2guYyAoc2hfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGZvciBhbiBpbGxlZ2FsIHN5bWJvbAotCWluZGV4LgotCi1Nb24gU2VwIDE2IDEyOjM5OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYW91dGFybV9zdGRfcmVsb2NfaG93dG8pOiBDaGFuZ2UgZHN0X21hc2sgZm9yIEFSTTI2RAotIAlyZWxvYyB0byAwLgotCShjb2ZmX2FybV9hZGp1c3Rfc3ltbmR4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lLgotCi0JKiBzcmVjLmMgKHNyZWNfc2Nhbik6IEFjY2VwdCBtdWx0aXBsZSBzeW1ib2xzIG9uIGEgc2luZ2xlIGxpbmUuCi0JRnJvbSBQYXNjYWwgTWFydGluIDxwbWFydGluQGFsc3lzLmNvbT4uCi0KLQkqIFJFQURNRTogTmV3IGZpbGUuCi0KLUZyaSBTZXAgMTMgMTQ6MzI6NDIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYW91dGYxLmggKE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCShzdW5vc19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCi1GcmkgU2VwIDEzIDE1OjUwOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBTd2l0Y2ggb24gb3V0cHV0IEJGRCByYXRoZXIKLQl0aGFuIGlucHV0IEJGRC4KLQkoYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIHNlY3Rpb24uYyAoYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBMaWtld2lzZS4KLQkqIHN5bXMuYyAoYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDaGVjayB0aGF0Ci0JYm90aCBCRkQncyBhcmUgdGhlIHJpZ2h0IGZsYXZvdXIuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBwZWljb2RlLmggKHBlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBGaWxsIGluIHNvbWUgZmllbGRzIGZvcgotCVJfUEFSSVNDX0RJUjMyLCBzbyB0aGF0IF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIHBhc3NlcwotCWl0cyBzYW5pdHkgY2hlY2suCi0KLVRodSBTZXAgMTIgMTE6NDU6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCBtMzJyIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBjcHUtbTMyci5jLGVsZjMyLW0zMnIuYzogTmV3IGZpbGVzLgotCi1UaHUgU2VwIDEyIDExOjEwOjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3ZlYyk6IFNldCBzeW1ib2xfbGVhZGluZ19jaGFyIGZpZWxkIHRvICdfJy4KLQotV2VkIFNlcCAxMSAxMTo1Nzo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRla2hleC5jIChmaXJzdF9waGFzZSk6IENoYW5nZSB0eXBlIHBhcmFtZXRlciBmcm9tIGNoYXIgdG8gaW50LgotCShvdXQpOiBMaWtld2lzZS4KLQkocGFzc19vdmVyKTogQ2hhbmdlIGZ1bmMgdG8gZXhwZWN0IGludCwgbm90IGNoYXIuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogVGVzdCBTRUNfQUxMT0MKLQlyYXRoZXIgdGhhbiBTRUNfTE9BRCB3aGVuIGFsaWduaW5nIHRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGZpcnN0Ci0Jc2VjdGlvbiBpbiBhIHNlZ21lbnQuCi0KLVR1ZSBTZXAgMTAgMTY6MTg6MzAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBNYWtlIGFyZyBjb25zdC4KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfY29yZV9maWxlX3ApOiBSZW1vdmUgZXh0cmFuZW91cyBleHRyYSBhcmcKLQl0byBtYWtlX2JmZF9hc2VjdGlvbigpLgotCSogZWxmLWJmZC5oIChiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBBZGQgcHJvdG90eXBlLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBSZW1vdmUgcHJvdG90eXBlLgotCShfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCk6IFJlbW92ZSBwcm90b3R5cGUuCi0KLQkqIG5ldGJzZC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBBZGQgcHJvdG90eXBlLgotCSogYWl4Mzg2LWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMKLQkqIGhwdXgtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkqIGlyaXgtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkqIHB0cmFjZS1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogdHJhZC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3JlbG9jX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9yZWxvY19vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9zeW1faW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX3N5bV9vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX2F1eF9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfbGluZW5vX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9saW5lbm9fb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogRGl0dG8uCi0JKiBpaGV4LmMgKGloZXhfc2l6ZW9mX2hlYWRlcnMpOiBEaXR0by4KLQkqIHRla2hleC5jIChnZXRzeW0pOiBEaXR0by4KLQkoZmluZF9jaHVuayk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKGluc2VydF9ieXRlKTogRGl0dG8uCi0JKGZpcnN0X3BoYXNlKTogRGl0dG8uCi0JKHBhc3Nfb3Zlcik6IERpdHRvLgotCSh0ZWtoZXhfZ2V0X3N5bXRhYik6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKHRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkodGVraGV4X21rb2JqZWN0KTogRGl0dG8uCi0JKHRla2hleF9vYmplY3RfcCk6IERpdHRvLgotCShtb3ZlX3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkodGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKHRla2hleF9zZXRfYXJjaF9tYWNoKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkodGVraGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKHdyaXRldmFsdWUpOiBEaXR0by4KLQkod3JpdGVzeW0pOiBEaXR0by4KLQkob3V0KTogRGl0dG8uCi0JKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkodGVraGV4X3NpemVvZl9oZWFkZXJzKTogRGl0dG8uCi0JKHRla2hleF9tYWtlX2VtcHR5X3N5bWJvbCk6IERpdHRvLgotCSh0ZWtoZXhfZ2V0X3N5bWJvbF9pbmZvKTogRGl0dG8uCi0JKHRla2hleF9wcmludF9zeW1ib2wpOiBEaXR0by4KLQkqIGlyaXgtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbik6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX3ApOiBEaXR0by4KLQkoaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpOiBEaXR0by4KLQkoaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogRGl0dG8uCi0JKGlyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IERpdHRvLgotCSogY29mZi1taXBzLmMgKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKiBzcmVjLmMgKHNyZWNfbmV3X3N5bWJvbCk6IERpdHRvLgotCShzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKHNyZWNfc2V0X2FyY2hfbWFjaCk6IERpdHRvLgotCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGl0dG8uCi0JKHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGl0dG8uCi0JKHN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGl0dG8uCi0JKHNyZWNfc2l6ZW9mX2hlYWRlcnMpOiBEaXR0by4KLQkoc3JlY19tYWtlX2VtcHR5X3N5bWJvbCk6IERpdHRvLgotCShzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBEaXR0by4KLQkoc3JlY19nZXRfc3ltdGFiKTogRGl0dG8uCi0JKHNyZWNfcHJpbnRfc3ltYm9sKTogRGl0dG8gYW5kIG1ha2Ugc3RhdGljLgotCSogZWxmLmMgKGVsZl9yZWFkKTogRGl0dG8KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IERpdHRvLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IERpdHRvLgotCShzeW1faXNfZ2xvYmFsKTogRGl0dG8uCi0JKGVsZl9tYXBfc3ltYm9scyk6IERpdHRvLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IERpdHRvLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBEaXR0by4KLQkoY29mZl9yZWFsX29iamVjdF9wKTogRGl0dG8uCi0JKGZpeHVwX3N5bWJvbF92YWx1ZSk6IERpdHRvLgotCShidWlsZF9kZWJ1Z19zZWN0aW9uKTogRGl0dG8uCi0JKGNvcHlfbmFtZSk6IERpdHRvLgotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSk6IERpdHRvLgotCi1Nb24gU2VwICA5IDIyOjM2OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0IGFmdGVyIG0zMnIgY2hhbmdlcy4KLQotTW9uIFNlcCAgOSAxMjozMToyMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkLGNvbmZpZ3VyZS5pbixjb25maWd1cmU6IEFkZCBtMzJyIHN1cHBvcnQuCi0JKiBNYWtlZmlsZS5pbixhcmNodXJlcy5jLGVsZi5jLHRhcmdldHMuYzogTGlrZXdpc2UuCi0JKiBjb25maWcuYmZkOiBLZWVwIHRhcmdldCBsaXN0IGFscGhhYmV0aWNhbGx5IHNvcnRlZC4KLQotTW9uIFNlcCAgOSAxMTo0ODo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MsIGNhc2UgUl9WODUwX0hJMTYpOiBEb24ndCBmb3JnZXQKLQl0byBhZGQgaW4gdGhlIGNvbnN0YW50IHBhcnQgZm91bmQgaW4gdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KLQkoY2FzZSBSX1Y4NTBfSEkxNl9TKTogTGlrZXdpc2UuCi0KLUZyaSBTZXAgIDYgMTc6MDQ6MzkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQxMHYuYyAoZWxmX2QxMHZfaG93dG9fdGFibGUpOiBNb2RpZnkgdGhlIHNpemUgb2YgUl9EMTBWXzE2Ci0JYW5kIFJfRDEwVl8xOCB0byBiZSAxICh3b3JkKS4KLQotVGh1IFNlcCAgNSAxNToyMzowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogSWYgdGhlIG91dHB1dF9zZWN0aW9uIGZpZWxkCi0Jb2YgZWl0aGVyIHNlY3Rpb24gaXMgYmZkX2Fic19zZWN0aW9uLCB0aGVuIHRoZSBsaW5rZXIgaXMKLQlkaXNjYXJkaW5nIHRoZSBzZWN0aW9uIGFuZCB3ZSBzaG91bGQgbm90IG9wdGltaXplIGl0LgotCi1UdWUgU2VwICAzIDEyOjE2OjIwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhb3V0LXNwYXJjbGUubyk6IE5ldyB0YXJnZXQuCi0JKiBhb3V0ZjEuaCAoVEFSR0VUX0lTX0JJR19FTkRJQU5fUCk6IERvbid0IGRlZmluZSBpZiBsaXR0bGUgZW5kaWFuLgotCSogY29uZmlnLmJmZCAoc3BhcmNsZXQtKi1hb3V0Kik6IEFkZCBjYXNlLgotCSogY29uZmlndXJlLmluIChzcGFyY2xlX2FvdXRfdmVjKTogQWRkIGNhc2UuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogdGFyZ2V0cy5jIChzcGFyY2xlX2FvdXRfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc3BhcmNsZV9hb3V0X3ZlYy4KLQkqIGFvdXQtc3BhcmNsZS5jOiBOZXcgZmlsZS4KLQotVHVlIFNlcCAgMyAwMDo1NzowMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBGaXggaGFuZGxpbmcgb2YKLQlsb3cgb3JkZXIgc2lnbiBiaXQgcHJvcG9nYXRpb24gZm9yIFJfVjg1MF9ISTE2X1MuCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBOZXcgZnVuY3Rpb24gZm9yCi0JaGFuZGxpbmcgVjg1MCBzcGVjaWZpYyByZWxvY3MuCi0JKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogVXNlIHRoZSBuZXcgZnVuY3Rpb24gZm9yIHNvbWUKLQlyZWxvY2F0aW9ucy4gIFR3aWRkbGUgbWFza3MgJiBzaGlmdHMgZm9yIHNvbWUgcmVsb2NzLgotCVNldCBwYXJ0aWFsX2lucGxhY2Ugd2hlcmUgbmVlZGVkLgotCi1Nb24gU2VwICAyIDEyOjEyOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LW1pcHMuYzogQWRkIGFuIGV4cGxpY2l0IG1pcHM6MzAwMCBlbnRyeSwgYW5kIGNoYW5nZSB0aGUKLQlkZWZhdWx0IGFyY2hpdGVjdHVyZSB0byBhIG1hY2hpbmUgbnVtYmVyIG9mIDAuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfb2JqZWN0X3ApOiBTZXQgdGhlIG1hY2hpbmUgbnVtYmVyCi0JZm9yIEVfTUlQU19BUkNIXzEuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IElmIHRoZSBtYWNoaW5lIG51bWJlciBvZgotCXRoZSBvdXRwdXQgQkZEIGlzIHRoZSBkZWZhdWx0LCBzZXQgaXQgZnJvbSB0aGUgZmlyc3QgaW5wdXQgQkZELgotCi1TdW4gU2VwICAxIDE4OjM4OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbGZfdjg1MF9ob3d0b190YWJsZSk6IEFsbCB0aGUgMTZiaXQgcmVsb2NzCi0JaW5zZXJ0IGF0IGJpdHBvcyB6ZXJvLiAgVGhlIEhJMTYgcmVsb2NzIGFyZSBzaGlmdGVkIHJpZ2h0Ci0JYnkgMTYgYml0cy4gIEZpeCBzcmNfbWFzayBmb3IgYWxsIHJlbG9jcy4KLQkoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9MSVRUTEVfTkFNRSk6IERlZmluZS4gIFRoZSBWODUwIGlzCi0JbGl0dGxlIGVuZGlhbiEKLQkoVEFSR0VUX0JJR19TWU0sIFRBUkdFVF9CSUdfTkFNRSk6IFJlbW92ZS4gIFRoZSBWODUwIGlzIGxpdHRsZQotCWVuZGlhbiEKLQotU3VuIFNlcCAgMSAxNTo0MTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKToKLQlSZXdyaXRlIHRvIHVzZSBCRkQgZmlsZSByZWFkIHJvdXRpbmVzIGFuZCB0byBhdm9pZCB1c2luZyBhIGZpeGVkCi0JbGVuZ3RoIGZvciB0aGUgZmlsZSBuYW1lLgotCi1TYXQgQXVnIDMxIDEwOjIyOjI1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9WODUwX3szMiwxNiw4fS4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBBZGQgc3VwcG9ydCBmb3IgUl9WODUwX3szMiwxNiw4fS4KLQkodjg1MF9yZWxvY19tYXApOiBBZGQgdHJhbnNsYXRpb24gZnJvbSBCRkRfUkVMT0NfezMyLDE2LDh9Ci0JdG8gUl9WODUwX3szMiwxNiw4fS4KLQotRnJpIEF1ZyAzMCAxODowNjowNCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIChyZWxvY190eXBlKTogQWRkIFJfVjg1MF9ISTE2X1MuCi0JKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQWRkIGluZm8gZm9yIEhJMTZfUyByZWxvYy4KLQkodjg1MF9yZWxvY19tYXApOiBBZGQgSElfMTZfUyByZWxvYy4KLQkqIHJlbG9jLmM6IERlZmluZSBCRkRfUkVMT0NfVjg1MF8qIHJlbG9jcy4KLQotRnJpIEF1ZyAzMCAxMTo0OToxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgU0ggRUxGIHN1cHBvcnQuCi0JKiBlbGYzMi1zaC5jOiBOZXcgZmlsZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgYmZkX2FyY2hfc2guCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEhhbmRsZSBhYnNvbHV0ZSBzeW1ib2wuCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcyk6IERlY2xhcmUuCi0JKF9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcyk6IERlY2xhcmUuCi0JKiBlbGZsaW5rLmggKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykpOiBSZW5hbWUgZnJvbQotCWVsZl9saW5rX3JlYWRfcmVsb2NzLiAgTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IEdldCBleHRlcm5hbCBzeW1ib2xzIGZyb20gY2FjaGUgaW4KLQlzeW10YWJfaGRyLT5jb250ZW50cy4gIEdldCBjb250ZW50cyBmcm9tIGNhY2hlIGluCi0JZWxmX3NlY3Rpb25fZGF0YS4KLQkqIGVsZnh4LXRhcmdldC5oIChiZkRfZWxmTk5fYmZkX3JlbGF4X3NlY3Rpb24pOiBPbmx5IGRlZmluZSBpZiBub3QKLQlhbHJlYWR5IGRlZmluZWQuCi0JKiByZWxvYy5jOiBEZWZpbmUgQkZEX1JFTE9DX1NIXyogcmVsb2NzLgotCSogbGliYmZkLWluLmggKF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuKTogRGVjbGFyZS4KLQkqIGNvZmYtc2guYyAoc2hfaW5zbnNfY29uZmxpY3QpOiBGaXggYSByZXR1cm4gdmFsdWUuCi0JKF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuKTogTmV3IGdsb2JhbGx5IHZpc2libGUgZnVuY3Rpb24sIGJyb2tlbgotCW91dCBvZiBzaF9hbGlnbl9sb2FkLgotCShzaF9hbGlnbl9sb2FkKTogQ2FsbCBfYmZkX3NoX2FsaWduX2xvYWRfc3Bhbi4KLQkoc2hfc3dhcF9pbnNucyk6IENoYW5nZSByZWxvY3MgcGFyYW1ldGVyIHRvIFBUUi4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9zaF92ZWMpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc2hsX3ZlYyk6IERlY2xhcmUuCi0JKiBjb25maWcuYmZkIChzaC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfc2hfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKGJmZF9lbGYzMl9zaGxfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1zaC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmMzItc2guYy4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IENoZWNrIHRoYXQgTE1BIGRvZXMgbm90IHNraXAgYQotCXBhZ2UgYmVmb3JlIGNoZWNraW5nIERfUEFHRUQuCi0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBleHRiYXNlIHZhcmlhYmxlLgotCShpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSBleHRiYXNlOyBhbHdheXMgdXNlIHNlZ2Jhc2UKLQlpbnN0ZWFkLgotCi1UaHUgQXVnIDI5IDE2OjUyOjE3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi0qKTogRGl0dG8uCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLSopOiBEaXR0by4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotZGd1eCopOiBSZWNvZ25pemUgYXMgYSBzeW5vbnltIGZvciB4ODYKLQllbGYuCi0KLVR1ZSBBdWcgMjcgMDk6MTg6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogQWRkIG5ldyBhcmd1bWVudC4KLQkqIGVsZjMyLWhwcGEuaCAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBVcGRhdGUgcHJvdG90eXBlLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogQWRkIG5ldyBhcmd1bWVudC4gIElmCi0Jd2UgZW5jb3VudGVyIGFuIFJfREFUQV9PTkVfU1lNQk9MIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgdGhhdAotCXdpbGwgaGF2ZSBhbiBTVF9DT0RFIHR5cGUsIGNoYW5nZSB0aGUgc3ltYm9sJ3MgdHlwZSB0byBTVF9EQVRBLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogVXBkYXRlIHByb3RvdHlwZS4KLQotVHVlIEF1ZyAyNyAwMDoxMjoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogU2V0IGR5bm9iaiBpZiBuZWVkZWQgZm9yCi0JUl9NSVBTXzMyIGFuZCBSX01JUFNfUkVMMzIuICBTZXQgc2dvdCBhbmQgZyBhcyBzb29uIGFzIHBvc3NpYmxlLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCByZXF1aXJlIC5nb3QgdG8gZXhpc3QuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVRodSBBdWcgMjIgMTA6NTQ6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAoSExERU5WKTogTmV3IHZhcmlhYmxlIHRvIHNldC4gIFNldCBpdCBmb3IKLQkqLSotc3lzdjQqLCBzaW5jZSB0aG9zZSBsaW5rZXJzIG1heSBub3Qgc3VwcG9ydCAtUiBidXQgdGhleSBhbHdheXMKLQlzdXBwb3J0IExEX1JVTl9QQVRILgotCi0JKiBsaWJpZWVlLmggKE5TRUNUSU9OUyk6IERvbid0IGRlZmluZS4KLQkoaWVlZV9kYXRhX3N0cnVjdCk6IENoYW5nZSBzZWN0aW9uX3RhYmxlIHRvIGFzZWN0aW9uICoqLiAgQWRkCi0Jc2VjdGlvbl90YWJsZV9zaXplLgotCSogaWVlZS5jIChnZXRfc2VjdGlvbl9lbnRyeSk6IElmIHRoZSB0YWJsZSBpc24ndCBiaWcgZW5vdWdoLCBtYWtlCi0JaXQgYmlnZ2VyLgotCShpZWVlX3NsdXJwX3NlY3Rpb25zKTogUmVtb3ZlIGFzc2VydGlvbiBhYm91dCBudW1iZXIgb2Ygc2VjdGlvbnMuCi0JKGllZWVfb2JqZWN0X3ApOiBBZGp1c3QgaW5pdGlhbGl6YXRpb24gb2YgaWVlZSB0byBtYXRjaCBjaGFuZ2VzIHRvCi0JdGhlIHN0cnVjdHVyZS4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmspOiBEb24ndCBjb3B5IHJlbG9jcyBmb3IgdW5kZWZpbmVkCi0Jc3ltYm9scyBtZXJlbHkgYmVjYXVzZSB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBEb24ndCBzZXQgdXAgZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgYW4KLQl1bmRlZmluZWQgc3ltYm9sIG1lcmVseSBiZWNhdXNlIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeS4KLQotVHVlIEF1ZyAyMCAxNTowNjowNSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtdjg1MC5vLgotCShCRkQzMl9CQUNLRU5EUykgQWRkIGVsZjMyLXY4NTAuby4KLQkqIGFyY2h1cmVzLmM6IEFkZCBiZmRfdjg1MF9hcmNoLgotCSogYmZkLWluMi5oOiBBZGQgYmZkX3Y4NTBfYXJjaC4KLQkqIGNvbmZpZy5iZmQgKHY4NTAtKi0qKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogKGJmZF9lbGYzMl92ODUwX3ZlYykgTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF9lbGYzMl92ODUwX3ZlYykgTmV3IHZlY3Rvci4KLQkqIGNwdS12ODUwLmM6IE5ldyBmaWxlLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZGVkIGNhc2UgYmZkX2FyY2hfdjg1MC4KLQkqIGVsZjMyLXY4NTAuYzogTmV3IGZpbGUuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl92ODUwX3ZlYyk6IE5ldyB2ZWN0b3IuCi0KLUZyaSBBdWcgMTYgMTY6MjU6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzKTogQ3JlYXRlIGFuZCBkZWZpbmUKLSAJYSBmdW5jdGlvbiBjb2RlIHN5bWJvbCBmb3IgYW4gWE1DX1hPIHN5bWJvbC4KLQotVGh1IEF1ZyAxNSAxMjozMzoyOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFVwZGF0ZSBlZGl0aW5nIG9mIGF1dG9jb25mIHZhcnMgdG8gcmVmbGVjdAotCUp1bCAxOCBjb25maWd1cmUuaW4gY2hhbmdlLgotCSogbXB3LW1ha2Uuc2VkOiBVcGRhdGUgZWRpdGluZyBvZiBpbmNsdWRlIHBhdGhuYW1lcyB0byBiZQotCW1vcmUgZ2VuZXJhbCwgYWRkIEBEQVNIX0NfRkxBR0AgdG8gZXhwbGljaXQgY29tcGlsZSBydWxlIGVkaXQuCi0KLVRodSBBdWcgMTUgMTA6MzU6MTMgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX291dHB1dF9leHRzeW0pOiBUaGUgc2VjdGlvbiBmcm9tCi0Jd2hpY2ggdG8gb2Zmc2V0IHRvIGdldCB0aGUgLnBsdCBlbnRyeSBhZGRyZXNzIGlzICIucGx0Ii4KLQotVGh1IEF1ZyAxNSAxNjo0MDozMCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIHJlbG9jLmM6IChCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCwgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0sCi0JQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVCwgQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQpOgotIAlBZGRlZCwgZm9yIGludGVybmFsIHVzZSBieSB0aGUgQVJNIGdhcy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0Ci0JKiBiZmQtaW4yLmg6IFJlYnVpbHQKLQotV2VkIEF1ZyAxNCAxNzowMjowOSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ29ycmVjdCB0eXBvCi0JaW4gc2VjdGlvbiBkeW5pZHggc3RhcnQuCi0KLVR1ZSBBdWcgMTMgMTQ6MzU6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IFRyZWF0IHNlY3Rpb25zIHdob3NlCi0JbmFtZSBiZWdpbnMgd2l0aCAuZ251LmxpbmtvbmNlIGFzIFNFQ19MSU5LX09OQ0UuICBUaGlzIGlzIGFuCi0Jb3B0aW1pemF0aW9uIGZvciBnKysuCi0KLVR1ZSBBdWcgMTMgMTc6MDQ6NDAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogSWYgb25lIG1vZHVsZSBoYXMKLQl0aGUgLW1yZWxvY2F0YWJsZS1saWIgYml0IHNldCBhbmQgdGhlIG90aGVyIGRvZXNuJ3QsIGNsZWFyIHRoZQotCS1tcmVsb2NhdGFibGUtbGliIGJpdCBpbiB0aGUgaGVhZGVyLgotCi1TYXQgQXVnIDEwIDIyOjU5OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEbyBub3QgcmVzb2x2ZSBhIGNvbW1vbgotCXN5bWJvbCBhZ2FpbnN0IGEgU1RUX0ZVTkMgc3ltYm9sIGluIGEgc2hhcmVkIGxpYnJhcnkuCi0KLUZyaSBBdWcgIDkgMTI6NDQ6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzKTogSWYgYSBkZXNjcmlwdG9yCi0gCXN5bWJvbCBpcyBmb3VuZCwgYXV0b21hdGljYWxseSBkZWZpbmUgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24KLSAJY29kZS4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogT25seSBzZXQgKCpzeW1faGFzaCktPm51bWF1eAotCWlmIHN5bS5uX251bWF1eCBpcyBub3QgemVyby4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogUGVybWl0IHRoZSBzeW1ib2wgYW5kIHRoZSBoYXNoIHRhYmxlCi0JZW50cnkgdG8gZGlzYWdyZWUgYWJvdXQgdGhlIG51bWJlciBvZiBhdXggZW50cmllcyBpZiB0aGUgc3ltYm9sCi0JaGFzIHplcm8uCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogQ3JlYXRlIHRoZSAucmVsLmR5bgotCXNlY3Rpb24gaWYgaXQgbWlnaHQgYmUgbmVlZGVkLCBub3QganVzdCBpZiBpbmZvLT5zaGFyZWQuCi0JKG1pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IE1ha2Ugcm9vbSBmb3IgYSBudWxsIGVsZW1lbnQgYXQKLQl0aGUgc3RhcnQgb2YgLnJlbC5keW4gaWYgd2UgYXJlIGdvaW5nIHRvIHVzZSBpdC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGNsZWFyIHRoZSBmaXJzdCBlbGVtZW50Ci0Jb2YgLnJlbC5keW4gaWYgdGhlIHNpemUgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLVRodSBBdWcgIDggMTY6MjQ6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBJZiB3ZSBhbHJlYWR5IGNhbGxlZCB0aGUKLQl1bmRlZmluZWRfc3ltYm9sIGNhbGxiYWNrIGZvciBhIHN5bWJvbCwgdGhlbiBkb24ndCBpc3N1ZSBhbnkgbW9yZQotCXdhcm5pbmdzIGFib3V0IGxvYWRlciByZWxvY3MuCi0JKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBkbyBhbnkgZnVydGhlciBwcm9jZXNzaW5nCi0JYWZ0ZXIgY2FsbGluZyB0aGUgdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjay4KLQotCSogeGNvZmZsaW5rLmMgKFhDT0ZGX01VTFRJUExZX0RFRklORUQpOiBEZWZpbmUuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBQZXJtaXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgYSBzeW1ib2wKLQlhcyB0aGUgQUlYIGxpbmtlciBzZWVtcyB0byBkby4KLQotVGh1IEF1ZyAgOCAxMjoyMTo1NiAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZXZheC1hbHBoYS5jIChldmF4X2FscGhhX3ZlYyk6IENvcnJlY3RlZCBmbGFncywgY2xlYW51cC4KLQkoZXZheF9pbml0aWFsaXplKTogUmVtb3ZlIGV2YXhfcmVsb2NfdGFibGUuCi0JKGV2YXhfY2xvc2VfYW5kX2NsZWFudXApOiBEaXR0by4KLQkocmVsb2NfbmlsKTogRGl0dG8uCi0JKGFscGhhX2hvd3RvX3RhYmxlKTogUmVtb3ZlIEFMUEhBX1JfU1dSRUwzMiBhbmQgQUxQSEFfUl9TV1JFTDY0Ci0JZW50cmllcy4KLQkoZXZheF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkqIGV2YXgtZWdzZC5jIChfYmZkX2V2YXhfc2x1cnBfZWdzZCk6IEFkZCBhIGZldyBjYXN0czsgc2V0Ci0JY29va2VkX3NpemUgPT0gcmF3X3NpemUuCi0JKiBldmF4LWVtaC5jIChfYmZkX2V2YXhfcmVnaXN0ZXJfZmlsZW5hbWUpOiBSZW1vdmUuCi0JKiBldmF4LWV0aXIuYyAoZXRpcl9zdGMpOiBBbGxvdyBFVElSX1NfQ19TVENfeHggY29tbWFuZHMuCi0JKiBldmF4LW1pc2MuYyAoYWRkX25ld19jb250ZW50cyk6IE1hbGxvYyBzZWN0aW9uIGF0IGZ1bGwgc2l6ZS4KLQkoX2JmZF9zYXZlX2V2YXhfc2VjdGlvbik6IE1lbWNweSBzZWN0aW9uIGNvbnRlbnRzIGRpcmVjdGx5LgotCSogZXZheC5oIChBTFBIQV9SX1NXUkVMMzIsIEFMUEhBX1JfU1dSRUw2NCk6IFJlbW92ZS4KLQkoZXZheF9yZWxvY190YWJsZSk6IFJlbW92ZS4KLQotCSogaG9zdHMvYWxwaGF2bXMuaCAoT19BQ0NNT0RFKTogRGVmaW5lIGlmIG5lZWRlZC4KLQotCSogbWFrZWZpbGUudm1zOiBBZGQgYmV0dGVyIHN1cHBvcnQgZm9yIERFQyBDIGNvbXBpbGF0aW9uCi0JQWRkIGV2YXguaCBkZXBlbmRlbmNpZXMKLQotCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogQWRkIGNhc2UgZm9yIDE2IGJ5dGUgcmVsb2MuCi0JKEJGRF9SRUxPQ19TV1JFTDMyLEJGRF9SRUxPQ19TV1JFTDY0KTogUmVtb3ZlLgotCShCRkRfUkVMT0NfQUxQSEFfQkFTRVJFRyk6IFJlbW92ZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLVRodSBBdWcgIDggMDg6MTc6MzIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiAgSWZkZWYgYXJvdW5kIGNhbGxzIHRvIGdldHVpZCBhbmQKLQlnZXRnaWQgaWYgX1dJTjMyIGlzIGRlZmluZWQuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgUmVtb3ZlIHVubmVjZXNzYXJ5IFdJTkdEQiBpZmRlZi4KLQotV2VkIEF1ZyAgNyAyMzoxOTowMCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIGJmZC1pbi5oIGJmZC1pbjIuaCBvcG5jbHMuYyByaXNjaXguYyBzb20uYyB0YXJnZXRzLmM6Ci0JQ2hhbmdlIE5PX0ZMQUdTIHRvIEJGRF9OT19GTEFHUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIGFuIEhQVVgKLQlpbmNsdWRlIGZpbGUuCi0JKiBsaWJiZmQuYzogIENyZWF0ZSBkdW1teSBnZXRwYWdlc2l6ZSgpIG1hY3JvIGlmIEhBVkVfR0VUUEFHRVNJWkUKLQlpc24ndCBkZWZpbmVkLgotCi1XZWQgQXVnICA3IDE0OjExOjQ0IDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfTkVFREVEX0RFQ0xBUkFUSU9OIG9uIHN0cnN0ciBhbmQKLQlyZWFsbG9jLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIpOiBOZXcgbWFjcm8uCi0JKE5FRURfREVDTEFSQVRJT05fUkVBTExPQyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogc3lzZGVwLmggKHN0cnN0cik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIuCi0JKHJlYWxsb2MpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fUkVBTExPQy4KLQotCSogYWNsb2NhbC5tNCAoQkZEX05FRURfREVDTEFSQVRJT04pOiBJbmNsdWRlIDxzdHJpbmcuaD4gb3IKLQk8c3RyaW5ncy5oPiBpZiB0aGV5IGV4aXN0LgotCi0JKiBpZWVlLmMgKGllZWVfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDYXN0IGJmZF9hbGxvYyByZXR1cm4uCi0KLVdlZCBBdWcgIDcgMTI6MTI6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtaTM4Ni5jIChpODA4Nl9hcmNoKTogQXJjaGl0ZWN0dXJlIGluZm8gZm9yIHRoZSBpODA4Ni4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBFcmljIFZhbGV0dGUgPHZhbGV0dGVAY3JmLmNhbm9uLmZyPjoKLQkqIGVsZjMyLWkzODYuYyAoZW51bSByZWxvY190eXBlKTogQWRkIEZJUlNUX0lOVkFMSURfUkVMT0MsCi0JTEFTVF9JTlZBTElEX1JFTE9DLCBSXzM4Nl8xNiwgUl8zODZfUEMxNiwgUl8zODZfOCwgUl8zODZfUEM4LgotCShlbGZfaG93dG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IgbmV3IHJlbG9jcy4KLQkoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgbmV3IHJlbG9jcy4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0byk6IEp1c3QgY2FsbCBhYm9ydC4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwpOiBDaGVjayB0aGF0IHRoZSByZWxvYyB0eXBlIGlzIHZhbGlkLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgIDYgMTI6NTQ6NTYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQxMHYuYyAoZWxmX2QxMHZfaG93dG9fdGFibGUpOiBBZGRlZCBSX0QxMFZfMzIuCi0KLU1vbiBBdWcgIDUgMTM6NDI6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IEZvciBhIGxvYWRhYmxlIHNlY3Rpb24sCi0Jb25seSBnZXQgdGhlIExNQSBmcm9tIHRoZSBwaGRyIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIHBhcnQgb2YgdGhlCi0JZmlsZS4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IFJld3JpdGUgdGVzdHMgZm9yIHN0YXJ0aW5nIGEKLQluZXcgc2VnbWVudCB0byBtYWtlIHRoZW0gbW9yZSBjb21wcmVoZW5zaWJsZS4gIElmIHRoZSByZWxhdGlvbnNoaXAKLQliZXR3ZWVuIHRoZSBMTUEgYW5kIHRoZSBWTUEgY2hhbmdlZCwgc3RhcnQgYSBuZXcgc2VnbWVudC4gIERvbid0Ci0JY2hlY2sgZHluc2VjIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBzdGFydCBhIG5ldyBzZWdtZW50IGZvciBhCi0Jd3JpdGVhYmxlIHNlY3Rpb247IC1OIHdpbGwgbm93IGhhbmRsZSB0aGlzLgotCi1UaHUgQXVnICAxIDIyOjQzOjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oOiBSZW1vdmUgImVzZWwiIGNoYW5nZXMuICBOb3QgdGhlIHJpZ2h0IGFwcHJvYWNoLgotCSogc29tLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFVzZSBTVF9EQVRBIGZvciBzeW1ib2xzCi0Jd2hpY2ggZG9uJ3QgaGF2ZSBhIFNPTSBzeW1ib2wgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlbS4KLQlSZXZlcnNlcyBhIDE5OTQgY2hhbmdlLgotCi1XZWQgSnVsIDMxIDE1OjUwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU1ha2UgbGQgLU4gbW9yZSByZWFzb25hYmxlIGZvciBFTEY6Ci0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogSWYgRF9QQUdFRCBpcyBub3Qgc2V0LCBzZXQKLQlwaGRyX2luX3NlY3Rpb24gdG8gZmFsc2UsIGFuZCBhbHdheXMgdXNlIGEgc2luZ2xlIGxvYWQgc2VnbWVudC4KLQkoZWxmX3NvcnRfc2VjdGlvbnMpOiBTb3J0IHNlY3Rpb25zIGJ5IExNQSBhZnRlciBWTUEuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJZiBEX1BBR0VEIGlzIG5vdCBzZXQsIGRvbid0Ci0JYWxpZ24gdG8gbWF4cGFnZXNpemUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IElmIGEgc2VjdGlvbiBpcyBsb2FkZWQgYnV0IG5vdCBwYWdlCi0JYWxpZ25lZCwgY2xlYXIgRF9QQUdFRC4KLQotV2VkIEp1bCAzMSAxNTowMDoxMiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIHJlbG9jLmM6IChCRkRfUkVMT0NfQVJNX09GRlNFVElNTTgsIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMKToKLSAJQWRkZWQsIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIEFSTSBnYXMuCi0JKiBsaWJiZmQuaDogUmVidWlsdAotCSogYmZkLWluMi5oOiBSZWJ1aWx0Ci0KLVR1ZSBKdWwgMzAgMTQ6MTQ6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKFJfSFBQQV9FU0VMKTogTmV3IGZpZWxkIHNlbGVjdG9yLgotCShlX2VzZWwpOiBTaW1pbGFybHkuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBJZiB3ZSBlbmNvdW50ZXIgYW4gZV9lc2VsLAotCXRoZW4gZ2VuZXJhdGUgUl9DT01QMiAoUFVTSF9TWU0pLCBSX0RBVEFfRVhQUiBmaXh1cCBzdHJlYW0uCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9EQVRBX0VYUFIganVzdCBsaWtlIFJfQ09ERV9FWFBSLgotCi1UdWUgSnVsIDMwIDEzOjMxOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEbyB0aGUgcmVndWxhcgotCWFyY2hpdmUgc2VhcmNoIGJlZm9yZSBsb29raW5nIGZvciBzdHJpcHBlZCBkeW5hbWljIG9iamVjdHMuCi0KLUZyaSBKdWwgMjYgMTc6NTE6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfYnVpbGRfbGRzeW1zKTogTWFrZSBleHBvcnRpbmcgYW4gdW5kZWZpbmVkCi0Jc3ltYm9sIGEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvci4KLQotV2VkIEp1bCAyNCAxMjowMjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogVHJhY2sgdGhlIHZpcnR1YWwKLQltZW1vcnkgcG9zaXRpb24gc2VwYXJhdGVseSBmcm9tIHRoZSBmaWxlIHBvc2l0aW9uLCBhbmQgdXNlIGl0IHRvCi0JY29tcHV0ZSB0aGUgYWxpZ25tZW50IGFkanVzdG1lbnQuCi0KLVR1ZSBKdWwgMjMgMTA6NDM6MzEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQxMHYuYyAoZWxmX2QxMHZfaG93dG9fdGFibGUpOiBDaGFuZ2VkIGFsbCByZWxvY3MgdG8gImxvbmciCi0gCWFuZCBmaXhlZCBtYXNrIG9uIFJfRDEwVl8xMF9QQ1JFTF9MLgotCi1Nb24gSnVsIDIyIDE1OjMwOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jOiBJbmNsdWRlICJhb3V0L2FyLmgiLgotCShtaXBzX2VsZjY0X3NsdXJwX2FybWFwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGY2NF93cml0ZV9hcm1hcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGY2NF9hcmNoaXZlXyopOiBEZWZpbmUuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2FyY2hpdmVfcCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQlVc2UgaW5zdGVhZCBvZiBiZmRfZ2VuZXJpY19hcmNoaXZlX3AuCi0JKGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLiAgVXNlCi0JaW5zdGVhZCBvZiBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMuCi0JKGJmZF9lbGZOTl9ta2RhcmNoaXZlKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLiAgVXNlIGluc3RlYWQgb2YKLQlfYmZkX2dlbmVyaWNfbWthcmNoaXZlLgotCShUQVJHRVRfQklHX1NZTSk6IElmIGJmZF9lbGZOTl9hcmNoaXZlX2Z1bmN0aW9ucyBpcyBkZWZpbmVkLCB1c2UKLQliZmRfZWxmTk5fYXJjaGl2ZSBpbiBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHJhdGhlciB0aGFuCi0JX2JmZF9hcmNoaXZlX2NvZmYuCi0JKFRBUkdFVF9MSVRUTEVfU1lNKTogTGlrZXdpc2UuCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9hcm1hcCk6IENoZWNrIGZvciBhbmQgcmVqZWN0IGFuIGFyY2hpdmUgbWFwCi0JbmFtZSBvZiAvU1lNNjQvLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IEhhbmRsZQotCVNIVF9NSVBTX0xJQkxJU1QsIFNIVF9NSVBTX0NPTlRFTlQsIFNIVF9NSVBTX1NZTUJPTF9MSUIsIGFuZAotCVNIVF9NSVBTX0VWRU5UUyBzZWN0aW9ucy4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19JRkFDRSwKLQlTSFRfTUlQU19DT05URU5ULCBTSFRfTUlQU19TWU1CT0xfTElCLCBhbmQgU0hUX01JUFNfRVZFTlRTCi0Jc2VjdGlvbnMuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBBZGQgcmRhdGFfaW5fdGV4dCBmaWVsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENvcHkKLQlyZGF0YV9pbl90ZXh0IGZyb20gYmFja2VuZCBpbmZvIHRvIHRkYXRhLiAgQ2xlYXIgaXQgaWYgYW55IGRhdGEKLQlzZWN0aW9uIGNvbWVzIGJlZm9yZSAucmRhdGEuCi0JKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIHJkYXRhX2luX3RleHQgZmllbGQgaW4KLQl0ZGF0YSByYXRoZXIgdGhhbiBiYWNrZW5kIGluZm8uCi0KLUZyaSBKdWwgMTkgMTg6MTU6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEZpeCB0ZXN0IGZvciB3aGV0aGVyIGEgY29tcGlsZXIgaGFzIGEgNjQgYml0Ci0JdHlwZS4gIEZyb20gSmltIFdpbHNvbiA8d2lsc29uQGN5Z251cy5jb20+LgotCi1UaHUgSnVsIDE4IDE1OjM5OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtc2dpLWlyaXg2Kik6IE5ldyBob3N0LgotCi0JKiBjb25maWd1cmUuaW46IFNldCBhbmQgc3Vic3RpdHV0ZSBWRVJTSU9OLCBCRkRfSE9TVF82NEJJVF9MT05HCi0JKHJlcGxhY2luZyBIT1NUXzY0QklUTE9ORyksIEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVELAotCUJGRF9IT1NUXzY0X0JJVCwgYW5kIEJGRF9IT1NUX1VfNjRfQklULiAgQWRkIGJmZC1pbjIuaDpiZmQtaW4yLmgKLQl0byBBQ19PVVRQVVQgY2FsbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGJmZC1pbi5oIChCRkRfQVJDSF9TSVpFKTogRGVmaW5lIGFzIEB3b3Jkc2l6ZUAsIG5vdCBAV09SRFNJWkVALgotCShCRkRfSE9TVF82NF9CSVQpOiBEZWZpbmUgY29uZGl0aW9uYWxseS4KLQkoQkZEX0hPU1RfVV82NF9CSVQpOiBEZWZpbmUgd2hlbiBCRkRfSE9TVF82NF9CSVQgaXMgZGVmaW5lZC4KLQkoYmZkX3ZtYSk6IFR5cGVkZWYgYXMgQkZEX0hPU1RfVV82NF9CSVQuCi0JKHN5bXZhbHVlLCBiZmRfc2l6ZV90eXBlKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoZG9fY2xlYW4pOiBSZW1vdmUgYmZkLXRtcC5oLgotCShkb19kaXN0Y2xlYW4pOiBSZW1vdmUgYmZkLWluMy5oLgotCShzdG1wLWJmZC5oKTogSnVzdCBkbyBjb3B5LWlmLWNoYW5nZSBiZmQtaW4zLmggYmZkLmguCi0JKGJmZC1pbjMuaCk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjLSotc3lzdjQqKTogRG9uJ3QgYnVpbGQgc3Vub3NfYmlnX3ZlYy4gIEZyb20KLQlBbmRyZXcgR2llcnRoIDxBTkRSRVdHQG1pY3JvbGlzZS5jby51az4uCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSU5TVEFMTF9TSExJQi4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19TVUJTVCAoSU5TVEFMTF9TSExJQikuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFVzZSBASU5TVEFMTF9TSExJQkAuCi0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqLSotaXJpeDYqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBIYW5kbGUgSXJpeCA2IHNoYXJlZCBsaWJyYXJ5IGxpa2UgSXJpeCA1LgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGNoZWNrIGFuIFhNQ19URAotCXN5bWJvbCBmb3IgYSBtYWdpYyBuYW1lLgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGNoYW5nZSB0aGUgcmVsb2Mgc3ltYm9sIGZvciBhbgotCVhNQ19URCBzeW1ib2wuCi0JKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBnZXQgdGhlIFRPQyBvZmZzZXQgZm9yIGFuCi0JWE1DX1REIHN5bWJvbC4KLQotVGh1IEp1bCAxOCAxMTozNjozMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBFTEYgc3VwcG9ydCB0byBtaXBzIGNvbmZpZywgY3JlYXRlIHRoZQotCWVsZjMyLXRhcmdldC5oIGZpbGUgaW4gdGhlIG9iamVjdCBkaXIuCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgZWxmWFgtdGFyZ2V0LmggcmVmcyBhdCBiZWdpbm5pbmdzIG9mIGxpbmVzLgotCi1XZWQgSnVsIDE3IDE4OjAyOjMyIDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jOiBSZWRpZCBkZWJ1ZyBzY2hlbWUgLSBudW1lcm91cyBmcHJpbnRmJ3MgZ29uZS4KLQlBbHNvIHJlbW92ZWQgbW9zdCBhYm9ydCBjYWxscywgaW4gZmF2b3Igb2YgdXNpbmcgYmZkIHJlcG9ydGluZy4KLQotV2VkIEp1bCAxNyAxNDo1MTo1MiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtZDEwdi5vLgotCShCRkQzMl9CQUNLRU5EUykgQWRkIGVsZjMyLWQxMHYuby4KLQkqIGFyY2h1cmVzLmM6IEFkZCBiZmRfZDEwdl9hcmNoLgotCSogYmZkLWluMi5oOiBBZGQgYmZkX2QxMHZfYXJjaC4KLQkqIGNvbmZpZy5iZmQgKGQxMHYtKi0qKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogKGJmZF9lbGYzMl9kMTB2X3ZlYykgTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF9lbGYzMl9kMTB2X3ZlYykgTmV3IHZlY3Rvci4KLQkqIGNwdS1kMTB2LmM6IE5ldyBmaWxlLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZGVkIGNhc2UgYmZkX2FyY2hfZDEwdi4KLQkqIGVsZjMyLWQxMHYuYzogTmV3IGZpbGUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IsIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wsCi0gCUJGRF9SRUxPQ19EMTBWXzE4LCBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTCk6IERlZmluZS4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX2QxMHZfdmVjKTogTmV3IHZlY3Rvci4KLQotV2VkIEp1bCAxNyAxMDo1ODo1NSAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZWQgYm9ndXMgZnByaW50ZgotCi1UdWUgSnVsIDE2IDIzOjQ5OjAyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgYmZkLWluMi5oOiAgQWRkIGJmZF9tYWNoX2kzODZfaTM4NiBhbmQKLQliZmRfbWFjaF9pMzg2X2k4MDg2IG1hY2hpbmUgdHlwZXMuCi0KLVdlZCBKdWwgMTAgMTI6NDI6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgU0VDX0NPREUgZm9yIF9JTklUCi0JYW5kIF9GSU5JIHNlY3Rpb25zLgotCi1XZWQgSnVsIDEwIDExOjE4OjIxIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQS9VWCBkb2VzIG5vdCByZXF1aXJlCi0Jc3BlY2lhbCBoYW5kbGluZyBvZiB0aGUgX0xJQiBzZWN0aW9uLgotCi1UdWUgSnVsICA5IDE1OjUyOjIwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogVXNlIHRoZSBjb3JyZWN0Ci0JdmFsdWUgZm9yIFJfUkVMQllURS4KLQotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBPbmx5ICJzaHJpbmtzIgotCWFycmF5IGlmIG9uZSB3YXMgYWxsb2NhdGVkLgotCi1UdWUgSnVsICA5IDEyOjIxOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gS2F6dW1vdG8gS29qaW1hIDxra29qaW1hQGtrLmluZm8ua2FuYWdhd2EtdS5hYy5qcD46Ci0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgbmV3IGZpZWxkcwotCXVzZV9ybGRfb2JqX2hlYWQgYW5kIHJsZF92YWx1ZS4KLQkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogTWFyayBfX3JsZF9vYmpfaGVhZCBzeW1ib2wgYXMKLQlkeW5hbWljLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENyZWF0ZSAucmxkX21hcCBzZWN0aW9uLiAgSWYKLQlfX3JsZF9vYmpfaGVhZCBzeW1ib2wgbm90IHNlZW4sIGNyZWF0ZSBhbiBfX3JsZF9tYXAgc3ltYm9sLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBNYWtlIHNwYWNlIGluIC5ybGRfbWFwIHNlY3Rpb24uCi0JQ3JlYXRlIGEgRFRfTUlQU19STERfTUFQIGVudHJ5IHJhdGhlciB0aGFuIGEgRFRfREVCVUcgZW50cnkuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFNhdmUgdmFsdWUgb2YgX19ybGRfbWFwIG9yCi0JX19ybGRfb2JqX2hlYWQgc3ltYm9sLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEhhbmRsZSBEVF9NSVBTX1JMRF9NQVAuCi0KLU1vbiBKdWwgIDggMTY6MTg6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfcmVsb2NfbWFwKTogUmVtb3ZlIEJGRF9SRUxPQ18zMl9QQ1JFTCBlbnRyeS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogRm9yIFJfUFBDX0FERFIxNl9IQSwgdXNlCi0JcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MuCi0JKHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29mZi1taXBzLmMgKHN0cnVjdCBtaXBzX2hpKTogRGVmaW5lLgotCShtaXBzX3JlZmhpX2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotIAkobWlwc19yZWZoaV9hZGRyLCBtaXBzX3JlZmhpX2FkZGVuZCk6IFJlbW92ZS4KLQkobWlwc19yZWZoaV9yZWxvYyk6IE1haW50YWluIGEgbGlzdCBvZiB1bm1hdGNoZWQgUkVGSEkgcmVsb2NzLgotCShtaXBzX3JlZmxvX3JlbG9jKTogUHJvY2VzcyBtaXBzX3JlZmhpX2xpc3QuCi0JKG1pcHNfcmVsaGlfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHNfcmVsaGlfYWRkciwgbWlwc19yZWxoaV9hZGRlbmQpOiBSZW1vdmUuCi0JKG1pcHNfcmVsaGlfcmVsb2MpOiBNYWludGFpbiBhIGxpc3Qgb2YgdW5tYXRjaGVkIFJFTEhJIHJlbG9jcy4KLQkobWlwc19yZWxsb19yZWxvYyk6IFByb2Nlc3MgbWlwc19yZWxoaV9saXN0LgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBSRUZISSBvcgotCVJFTEhJIHJlbG9jcyBiZWZvcmUgdGhlIGFzc29jaWF0ZWQgUkVGTE8gb3IgUkVMTE8gcmVsb2MuCi0KLUZyaSBKdWwgIDUgMTk6Mjc6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBTZXQgcmVsb2NfY291bnQgZmllbGRzLgotCi1UaHUgSnVsICA0IDEyOjAwOjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGNyZWF0ZSBkeW5hbWljCi0Jc2VjdGlvbnMgdW5sZXNzIHRoaXMgaXMgYSBTdW5PUyBsaW5rLgotCi0JKiBWRVJTSU9OOiBTZXQgdG8gMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotV2VkIEp1bCAgMyAxNDo1OTo0NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODZhb3V0LmM6IEluY2x1ZGUgImFvdXQvYW91dDY0LmgiLgotIAkoaTM4NmFvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVmaW5lLgotCi0JKiBuZXRic2QuaCAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IE1ha2Ugc3VyZSB0aGF0Ci0JYWRqdXN0X3NpemVzX2FuZF92bWFzIGlzIGNhbGxlZCBiZWZvcmUgZmlkZGxpbmcgd2l0aCB0aGUgbWFnaWMKLQludW1iZXIuCi0KLVR1ZSBKdWwgIDIgMjM6MzA6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IEZpeCBjYXN0cyBvZiBwc2luZm8uCi0KLVN1biBKdW4gMzAgMTM6MzQ6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoaXRvcywgc3RvaSk6IERvbid0IGRlZmluZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogaTM4Nmx5bnguYyAoS0VFUElUKTogRGVmaW5lIGFzIHVkYXRhLmkuCi0JKE5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogRG9uJ3QgdXNlIHN0b2kuCi0JKE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19vdXQpKTogTGlrZXdpc2UuCi0JKiByaXNjaXguYyAocmlzY2l4X3N3YXBfc3RkX3JlbG9jX291dCk6IFVzZSB1ZGF0YS5pIHJhdGhlciB0aGFuCi0JZmxhZ3MuICBEb24ndCB1c2Ugc3RvaS4KLQotCSogZWxmMzItbWlwcy5jIChFTEZfTUFHUEFHRVNJWkUpOiBDaGFuZ2UgZGVmaW5pdGlvbiB0byAweDEwMDAuCi0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBEb24ndCBzdGFydCBhIG5ldyBzZWdtZW50IGZvcgotIAlhIHdyaXRhYmxlIHNlY3Rpb24gaWYgaXQncyBvbiB0aGUgc2FtZSBwYWdlIGFzIHRoZSBwcmV2aW91cwotIAlzZWdtZW50LiAgUmVzZXQgdGhlIHdyaXRhYmxlIHZhcmlhYmxlIGZvciBhIHJlYWRvbmx5IHNlY3Rpb24uCi0KLVNhdCBKdW4gMjkgMTY6MTg6NTEgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBNaXNzaW5nIGluaXRpYWxpemF0aW9ucyBvZgotCWZpcnN0X3RodW5rX2FkZHJlc3MsIHRodW5rX3NpemUsIGFuZCBpbXBvcnRfdGFibGVfc2l6ZS4KLQkqIHBlaWNvZGUuaDogSW1wcm92ZWQgc29tZSBkaWFnbm9zdGljcyByZWdhcmRpbmcgZWRhdGEgc2VjdGlvbnMuCi0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBFYXJsaWVyIGVycm9yIGNoZWNrCi0Jb24gSU1HTFVFIHJlbG9jcy4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEltcHJvdmVkIGRpYWdub3N0aWMgZm9yIGxhcmdlIFRPQ0RFRk4ncy4KLQkoVEFSR0VUX0xJVFRMRV9TWU0pOiBBZGRlZCBtaXNzaW5nIERfUEFHRUQuCi0KLUZyaSBKdW4gMjggMTM6NDg6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogQW4gdW5kZWZpbmVkIHN5bWJvbAotCXdpdGggWENPRkZfREVGX0RZTkFNSUMgc2V0IGlzIHJlYWxseSBkZWZpbmVkLgotCSh4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogT25seSBjcmVhdGUgc3BlY2lhbCBzZWN0aW9ucyBpZiB1c2luZyBhbgotCVhDT0ZGIGhhc2ggdGFibGUuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBIYW5kbGUgeGNvZmYtcG93ZXJtYWMgbGlrZQotCWFpeGNvZmYtcnM2MDAwLgotCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gMjggMTE6MTc6MDAgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIGZsYWdzCi0JZmllbGQuCi0JKEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQUREUik6IERlZmluZS4KLQkoQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9NRU0pOiBEZWZpbmUuCi0JKEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQyk6IERlZmluZS4KLQkoZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIGZsYWdzIGZpZWxkLgotCShlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MpOiBSZWNvcmQgdHlwZXMgb2YgTElUVVNFIGVudHJpZXMgdGhhdAotCWFyZSBmb3VuZCBmb3IgTElURVJBTCByZWxvY3MuCi0JKGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIGhhcyBpdHMgYWRkcmVzcwotCXRha2VuLCB3ZSBjYW5ub3QgZ2VuZXJhdGUgYSAucGx0IGVudHJ5IGZvciB0aGUgc3ltYm9sLgotCi1UaHUgSnVuIDI3IDExOjI0OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQUNfSVNDX1BPU0lYLCBhbmQgY2hlY2sgZm9yIHNldGl0aW1lciBhbmQKLQlzeXNjb25mIGZ1bmN0aW9ucyAoZm9yIGdwcm9mKS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1XZWQgSnVuIDI2IDE2OjI5OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9hcmNoaXZlX3ApOiBDaGVjayB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgaW4KLQlhbiBhcmNoaXZlIGlmIGl0IGhhcyBhIG1hcC4gIElmIHRoZSBvYmplY3QgZmlsZSBoYXMgdGhlIHdyb25nCi0JeHZlYywgcmVqZWN0IGl0LgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2FkanVzdF9yZWxvY19pbik6IFNldCB0aGUgYWRkZW5kIGZvciBhCi0JQlJBRERSLCBTUkVMMTYsIFNSRUwzMiwgb3IgU1JFTDY0IHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwKLQlzeW1ib2wuCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3JlbG9jX291dCk6IFVzZSBSRUxTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogVXNlIEZJTEhTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX3N5bV9vdXQpOiBVc2UgU1lNRVNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IFVzZSBBVVhFU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9saW5lbm9fb3V0KTogVXNlIExJTkVTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogVXNlIEFPVVRTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBVc2UgU0NOSFNaLCBub3Qgc2l6ZW9mLgotCSogcGVpY29kZS5oOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBKdW4gMjUgMTU6Mjg6MzQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IENvbW1lbnQgb3V0IGNvZGUKLQlkZWFsaW5nIHdpdGggbWFraW5nIEdPVCBwb2ludGVycyBuZWdhdGl2ZSBvZiB0aGUgR09UIHN5bWJvbCBmb3IKLQlub3cuCi0KLVR1ZSBKdW4gMjUgMTE6NDE6MjQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0Ci0JaW5jcmVtZW50IHRoZSAucmVsYS5wbHQgc2l6ZSB1bnRpbCBhZnRlciB3ZSdyZSBkb25lIGNyZWF0aW5nIHRoZQotCS5wbHQgZW50cnkuCi0JKGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IENoYW5nZSAucGx0IGVudHJ5IHRvIGxvYWQgdGhlCi0JLnJlbGEucGx0IG9mZnNldCBkaXJlY3RseSByYXRoZXIgdGhhbiBjYWxjdWxhdGluZyBpdC4KLQotTW9uIEp1biAyNCAxNzoxNToxMCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4sIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyKToKLQlVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLSAgICAgICAgKiBkb2MvTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsCi0JaW5jbHVkZWRpciwgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0Ci0JdmFsdWVzLgotICAgICAgICAoZG9jZGlyKTogRGVsZXRlZC4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIHYyLjUgb3IgaGlnaGVyLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIEp1biAyNCAyMjo1MDozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogRml4IHR5cG8gaW4gUl9FTkRfVFJZIGZvciBleGNlcHRpb24KLQloYW5kbGluZyBjb2RlID4gMWsgYXdheS4KLQotTW9uIEp1biAyNCAxODo0MTowNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogSWYgREVCVUcgaXMKLQlkZWZpbmVkLCBvdXRwdXQgd2hlbmV2ZXIgdGhlIHN5bWJvbCBpcyB1cGRhdGVkLgotCi1Nb24gSnVuIDI0IDE3OjU4OjEyIDE5OTYgIEpvdWtlIE51bWFuICA8am51bWFuQGJhemlzLm5sPgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBEb24ndCBzZXQgc2hfYWRkciBvZiBhIG5vbiBTRUNfQUxMT0MKLQlzZWN0aW9uIHRvIDAgaWYgdXNlcl9zZXRfdm1hIGlzIHNldC4KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0KLVN1biBKdW4gMjMgMjA6NDI6NTEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCVBhcnRpYWxseSB1bmRvIHBhdGNoIG9mIEp1biAyMC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogVXNlIENPRkZfSU1BR0VfV0lUSF9QRS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4gIFJlLWFkZCBkZWxldGVkIGNvZGUsIGJ1dAotCXVzZSAjaWZkZWYgQ09GRl9XSVRIX1BFLCBub3QgQ09GRl9PQkpfV0lUSF9QRS4KLQkqIHBlaWNvZGUuaCAocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlLWFkZCAjaWZkZWYuCi0KLUZyaSBKdW4gMjEgMTc6Mzg6MTUgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAbWVybGluLmdjcy5yZWRzdG9uZS5hcm15Lm1pbD4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yICotKi1ydGVtcyogY29uZmlndXJhdGlvbnMuCi0KLUZyaSBKdW4gMjEgMTU6MTk6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIGJmZF9hcmNoX2FscGhhIGNhc2UuCi0KLUZyaSBKdW4gMjEgMTI6MzU6MjcgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmM6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZCAoYWxwaGEtKi1saW51eGVjb2ZmKik6IE5ldyB0YXJnZXQuCi0JKGFscGhhLSotbGludXgqLCBhbHBoYS0qLWVsZiopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjY0X2FscGhhX3ZlYyk6IE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGY2NF9hbHBoYV92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmNjRfYWxwaGFfdmVjIGlmIEJGRDY0LgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0FMUEhBX0dQRElTUCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBlbGY2NC1hbHBoYS5vLgotCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmNjQtYWxwaGEuYy4KLQotVGh1IEp1biAyMCAxODoxNDoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2FybWFwX2hhc2gpOiBJZiBobG9nIGlzIDAsIGp1c3QgcmV0dXJuIDAsIHJhdGhlcgotCXRoYW4gcmVseWluZyBvbiBhIHJpZ2h0IHNoaWZ0IG9mIDMyLgotCi1UaHUgSnVuIDIwIDExOjAwOjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogQ2hhbmdlIENPRkZfSU1BR0VfV0lUSF9QRQotCWlmZGVmIHRvIENPRkZfV0lUSF9QRS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4gIERlbGV0ZSBDT0ZGX09CSl9XSVRIX1BFLgotCSogcGUte2FybSxpMzg2LHBwY30uYyAoQ09GRl9PQkpfV0lUSF9QRSk6IERlbGV0ZS4KLQkqIHBlaWNvZGUuaCAocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlbGV0ZSBpZmRlZgotCUNPRkZfSU1BR0VfV0lUSF9QRSwgYWx3YXlzIGluY2x1ZGUuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiAiLmRyZWN0dmUiIGRvZXNuJ3QgaGF2ZSB0cmFpbGluZyAwLgotCi1XZWQgSnVuIDE5IDExOjM3OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IEZpeCB1cCB0aGUgdGVzdCBmb3IgLVR0ZXh0IHRvCi0JYXBwcm94aW1hdGUgdGhlIGNvcnJlY3QgYW5zd2VyIGlmIFNJWkVPRl9IRUFERVJTIHdhcyBub3QgdXNlZC4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldCBzZWN0aW9uIGZpbGUKLQlwb3NpdGlvbiBiYXNlZCBvbiBMTUEgcmF0aGVyIHRoYW4gVk1BLgotCi1XZWQgSnVuIDE5IDExOjE5OjI1IDE5OTYgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VJQzUgNjAvMy8xNDIgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IERvbid0IG91dHB1dCBhbnkKLQlzeW1ib2xzIGlmIGluZm8tPnN0cmlwID09IHN0cmlwX2FsbC4KLQotVHVlIEp1biAxOCAxNToxNzozNiAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZi1oODMwMC5jOiBSZW1vdmUgI2lmIDAgY29kZS4KLQkoY29tcGF0YWJsZSk6IERvbid0IGFsbG93IG1peGluZy9tYXRjaGluZyBvZiBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfaDgzMDBzKTogQWRkLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZi1oODMwMC5jIChmdW5jdmVjX2hhc2hfbmV3ZnVuYyk6IEhhbmRsZSBIOC9TIHRvby4KLQkoQkFETUFHKTogTGlrZXdpc2UuCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBMaWtld2lzZS4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCShoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBMaWtld2lzZS4KLQkoY29mZl9zZXRfZmxhZ3MpOiBMaWtld2lzZS4KLQkqIGNwdS1oODMwMC5jIChoODMwMF9zY2FuKTogTGlrZXdpc2UuCi0JQWRkIEg4L1MgdG8gYmZkX2g4MzAwX2FyY2ggbGlzdC4KLQotVHVlIEp1biAxOCAxNDo0Mjo1OCAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCUFkZGVkIHN1cHBvcnQgZm9yIEFscGhhIE9wZW5WTVM6Ci0JKiBldmF4LmgsIGV2YXgtYWxwaGEuYywgZXZheC1lZ3NkLmMsIGV2YXgtZW1oLmM6IE5ldyBmaWxlcy4KLQkqIGV2YXgtZXRpci5jLCBldmF4LW1pc2MuYywgaG9zdHMvYWxwaGF2bXMuaDogTmV3IGZpbGVzLgotCSogY29uZmlnLmgtdm1zLCBtYWtlZmlsZS52bXM6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZy5iZmQgKGFscGhhLSotKnZtcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChldmF4X2FscGhhX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1NXUkVMMzIsIEJGRF9SRUxPQ19TV1JFTDY0KTogRGVmaW5lLgotCShCRkRfUkVMT0NfQUxQSEFfTElOS0FHRSwgQkZEX1JFTE9DX0FMUEhBX0JBU0VSRUcpOiBEZWZpbmUuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfZXZheF9mbGF2b3VyKTogRGVmaW5lLgotCShldmF4X2FscGhhX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyBhbmQgZXZheF9hbHBoYV92ZWMKLQlpZiBCRkQ2NCBpcyBkZWZpbmVkLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZENjRfQkFDS0VORFMpOiBBZGQgZXZheC1hbHBoYS5vLCBldmF4LWVnc2QubywgZXZheC1ldGlyLm8sCi0JZXZheC1lbWgubywgYW5kIGV2YXgtbWlzYy5vLgotCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBBZGQgZXZheC1hbHBoYS5jLCBldmF4LWVnc2QuYywKLQlldmF4LWV0aXIuYywgZXZheC1lbWguYywgYW5kIGV2YXgtbWlzYy5jLgotCShIRklMRVMpOiBBZGQgZXZheC5oLgotCi1UdWUgSnVuIDE4IDEzOjU0OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTWFrZSBuYW1lIGEgY29uc3QKLQlwb2ludGVyLgotCShoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDE3IDEwOjA2OjUwIDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBzb20uaCAoUl9IUFBBX0JFR0lOX1RSWSwgUl9IUFBBX0VORF9UUlkpOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0JFR0lOX1RSWSBhbmQgUl9FTkRfVFJZLgotCi1Nb24gSnVuIDE3IDEyOjQ5OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgY3JlYXRlIGEgcmVsb2MKLQlmb3IgUl9NSVBTX1JFTDMyIGFuZCBSX01JUFNfMzIgcmVsb2NzIGlmIG5vIGR5bmFtaWMgc2VjdGlvbnMgd2VyZQotCWNyZWF0ZWQuCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IE9ubHkgY3JlYXRlIC5yZWwuZHluIGZvciBSX01JUFNfUkVMMzIgYW5kCi0JUl9NSVBTXzMyIHJlbG9jcyBpZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCi1UaHUgSnVuIDEzIDIwOjE0OjUxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBVc2UgcGVpX3NlY3Rpb25fZGF0YSByYXRoZXIgdGhhbgotCV9jb29rZWRfc2l6ZS4gIENvcnJlc3BvbmRzIHRvIE1heSAxMyBjaGFuZ2UgaW4gY29mZmNvZGUuaC4KLQotVGh1IEp1biAxMyAxMDoyMzo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgdGhlcmUgYXJlIGxvbmcKLQlzZWN0aW9uIG5hbWVzLCBhbHdheXMgc2V0IHRoZSBmX3N5bXB0ciBmaWVsZCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8KLQlzeW1ib2xzLgotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IERvbid0IGNsZWFyIHRoZSBmX3N5bXB0ciBmaWVsZAotCWlmIHRoZXJlIGFyZSBubyBzeW1ib2xzLgotCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCV9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZS4KLQkoY29mZl9yZWFsX29iamVjdF9wKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JbWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlLgotCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBDaGVjayB0aGF0IHRoZXJlIGFyZSBzb21lIHN5bWJvbHMKLQliZWZvcmUgdHJ5aW5nIHRvIHJlYWQgdGhlIHN0cmluZyB0YWJsZSBzaXplLgotCi1XZWQgSnVuIDEyIDExOjE2OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBXaGVuIGNvbnNpZGVyaW5nIHdoZXRoZXIKLQl0byByZXBsYWNlIGEgc3ltYm9sIGluIGEgZHluYW1pYyBvYmplY3Qgd2l0aCBhIHN5bWJvbCBmcm9tIGFub3RoZXIKLQlkeW5hbWljIG9iamVjdCwgZG8gdGhlIHJlcGxhY2VtZW50IGlmIHRoZSBleGlzdGluZyBzeW1ib2wgaXMKLQlnbG9iYWwgbGlua2FnZSBjb2RlLgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGV4cGxpY2l0bHkKLQlmb3IgX3B0cmdsLCBhbmQgdHJlYXQgaXQgYXMgZ2xvYmFsIGxpbmthZ2UgY29kZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IE5vdGljZSBpZiB3ZSBmaW5kIGEKLQlmaWxlbmFtZSBvciBOX1NPIHN5bWJvbCBwYXN0IHRoZSBvZmZzZXQsIGFuZCB1c2UgaXQgdG8gaW5kaWNhdGUKLQl0aGF0IHRoZXJlIGlzIG5vIGxpbmUgbnVtYmVyIG9yIGZ1bmN0aW9uIHdoZW4gYXBwcm9wcmlhdGUuCi0KLVR1ZSBKdW4gMTEgMTU6MjQ6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfYnVpbGRfbGRzeW1zKTogU2V0IFhDT0ZGX0RFRl9SRUdVTEFSIGZvciBhCi0JY29tbW9uIHN5bWJvbCBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIuICBEb24ndCBleHBvcnQgZnVuY3Rpb24gY29kZQotCWV2ZW4gaWYgZXhwb3J0X2RlZmluZWRzIGlzIHNldC4KLQotTW9uIEp1biAxMCAxMTo1NzoyNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaG93dG9fdGFibGUpOiBBZGQgbmV3IGVudHJpZXMgZm9yIFJfQkNDX0lOVgotCWFuZCBSX0pNUF9ERUwuCi0JKHJ0eXBlMmhvd3RvKTogSGFuZGxlIFJfQkNDX0lOViBhbmQgUl9KTVBfREVMLgotCShoODMwMF9zeW1ib2xfYWRkcmVzc19wKTogTmV3IGZ1bmN0aW9uLgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogRWxpbWluYXRlIGp1bXBzIG1hZGUgdW5uZWNlc3NhcnkgYnkKLQlyZWxheGluZy4KLQotU3VuIEp1biAgOSAxNjozMDoyMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IEZpeCBtYW55IG1pbm9yIHNwYWNpbmcKLQlwcm9ibGVtcy4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSwgY2FzZXMgUl9KTVAxLCBSX0pNUDIpOiBBZGp1c3QgImRvdCIKLQljb3JyZWN0bHkgZm9yIHRoZSB0d28gdmFyaWFudHMuICBBbGxvdyByZWxheGluZyBpZiB0aGUgdGFyZ2V0Ci0JaXMgMTI4IGJ5dGVzIGF3YXkgc2luY2UgYWZ0ZXIgcmVsYXhhdGlvbiBpdCdsbCBiZSAxMjYgYnl0ZXMgYXdheS4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSwgY2FzZSBSX1BDUldPUkQpOiBDb3JyZWN0bHkgYWRqdXN0Ci0JImRvdCIgYW5kICJ2YWx1ZSIuICBBbGxvdyByZWxheGluZyBpZiB0aGUgdGFyZ2V0IGlzIDEyOCBieXRlcwotCWF3YXkgc2luY2UgYWZ0ZXIgcmVsYXhhdGlvbiBpdCdsbCBiZSAxMjYgYnl0ZXMgYXdheS4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogS2VlcCByZWxheGluZwotCXRoZSBnaXZlbiBzZWN0aW9uIHVudGlsIG5vdGhpbmcgY2hhbmdlcy4KLQotVGh1IEp1biAgNiAxNToyNDo0NSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rKTogUmVtb3ZlIHRoZSBfUERBVEEKLSAJYWxpZ25tZW50IGhhY2stLXdlIGNhbiBnZXQgdGhlIGxubm9wdHIgaW5mbyBhbm90aGVyIHdheSB3aXRob3V0Ci0gCXN1ZGRlbmx5IGluY3JlYXNpbmcgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMuICBTZXQgdGhlIGZsYWdzIGZvcgotCXRoZSBfUERBVEEgc2VjdGlvbi4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG8gc28uCi0KLVRodSBKdW4gIDYgMTE6MjQ6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUHV0IGEgdGltZXN0YW1wIGluIHRoZSBmaWxlCi0JdG8ga2VlcCB0aGUgSFAgZW11bGF0b3IgZGF0YWJhc2UgaGFwcHkuCi0KLQkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBwb3dlcnBjLSotbGludXgqIGFuZCBwb3dlcnBjbGUtKi1saW51eCouCi0JRnJvbSBLZXZpbiBCdWV0dG5lciA8a2V2QHByaW1lbmV0LmNvbT4uCi0KLVdlZCBKdW4gIDUgMTU6MTY6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IHRyeSB0byBwcmludCB0aGUKLQluYW1lIG9mIGEgTlVMTCBzZWN0aW9uLgotCi1UdWUgSnVuICA0IDE4OjUzOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSWYgbm90aWNlX2FsbCBpcwotCXNldCwgYWx3YXlzIGNhbGwgdGhlIG5vdGljZSBjYWxsYmFjay4KLQotCSogVkVSU0lPTjogSW5jcmVtZW50IGZvciBiZmRsaW5rLmggY2hhbmdlLgotCi1Nb24gSnVuICAzIDExOjAxOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBTZXQgdG8gNC4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogQ29ycmVjdCBoYW5kbGluZyBvZiBkaWZmZXJlbnRseSBzaXplZAotCXRyYWlsaW5nIGFsaWdubWVudCByZWxvYy4KLQotCSogYmZkLWluLmg6IFVzZSAjZXJyb3IgaWYgQkZEX0hPU1RfNjRfQklUIGNhbiBub3QgYmUgZGVmaW5lZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbjogV2FybiBpZiB0aGVyZSBpcyBubyBrbm93biA2NCBiaXQgdHlwZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgcHBjYm9vdC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgcHBjYm9vdC5jLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEluaXRpYWxpemUgYy4KLQlGcm9tIFBlciBGb2dlbHN0cm9tIDxwZXIuZm9nZWxzdHJvbUBtYWlsYm94MjAwLnN3aXBuZXQuc2U+LgotCi1TYXQgSnVuICAxIDIxOjQ5OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jIChiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4pCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQpOiBNb3ZlIGZyb20gaGVyZS4uLgotCSogZWxmMzItbWlwcy5jIChiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4pCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQpOiAuLi50byBoZXJlLgotCi1GcmkgTWF5IDMxIDEzOjUxOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jOiBJbXByb3ZlIHJlbG9jIHNwZWNpYWxfZnVuY3Rpb25zIGFuZCBoYW5kbGluZyBvZgotCVNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9oaTE2X3JlbG9jIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2xvMTZfcmVsb2MgYW5kCi0JbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfZ290MTZfcmVsb2MgYW5kCi0JbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9ncHJlbDE2X3JlbG9jCi0JYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoZ3ByZWwxNl93aXRoX2dwKTogQ2hlY2sgaG93dG8tPnNyY19tYXNrIGJlZm9yZSB1c2luZyB2YWx1ZSBpbgotCWluc24uCi0JKF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2dwcmVsMzJfcmVsb2MKLQlhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShncHJlbDMyX3dpdGhfZ3ApOiBDaGVjayBob3d0by0+c3JjX21hc2sgYmVmb3JlIGZldGNoaW5nIHZhbHVlLgotCShiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEFjY2VwdCAuTUlQUy5vcHRpb25zIGFzIGEgbmFtZQotCWZvciBhIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkobWlwc19lbGYzMl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IENvbnNpZGVyIC5NSVBTLm9wdGlvbnMgdG8gYmUgdGhlCi0JbmFtZSBvZiBhIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBTZXQgdGhlIEdQIHZhbHVlIGluIGEKLQlTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKGJmZF9lbGYzMl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkqIGVsZi1iZmQuaCAoX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVjbGFyZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2luZm9fdG9faG93dG8pOiBSZW5hbWUgZnJvbQotCWVsZl9pbmZvX3RvX2hvd3RvLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8pOiBSZW5hbWUgZnJvbQotCWVsZl9pbmZvX3RvX2hvd3RvLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8pOiBSZW5hbWUgZnJvbQotCWVsZl9pbmZvX3RvX2hvd3RvLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZS4KLQotCSogY29mZi13NjUuYyAoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IFJlbmFtZSBSX01PVkJbMTJdIHRvCi0JUl9NT1YxNkJbMTJdLCB0byBtYXRjaCBjaGFuZ2UgaW4gY29mZi9pbnRlcm5hbC5oLgotCi1UaHUgTWF5IDMwIDEyOjM4OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jOiBFeHRlbnNpdmUgYWRkaXRpb25zIHRvIHByb3ZpZGUgYmV0dGVyIHN1cHBvcnQgZm9yCi0Jd3JpdGluZyBmaWxlcyBhbmQgZm9yIGdhcy4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dAotCW9mIG1pcHNfZWxmX29iamVjdF9wLgotCShtaXBzX2VsZjMyX29iamVjdF9wKTogUmVuYW1lIGZyb20gbWlwc19lbGZfb2JqZWN0X3A7IGNhbGwKLQlfYmZkX21pcHNfZWxmX29iamVjdF9wLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9mYWtlX3NlY3Rpb25zIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQltaXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcuCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3Npbmc7IGNhbGwKLQlfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZy4KLQkoX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShtaXBzX2VsZjMyX2Vjb2ZmX2RlYnVnX3N3YXApOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2Vjb2ZmX2RlYnVnX3N3YXAuCi0JKiBlbGYuYyAoX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IFVzZSBhc3ltYm9sIHJhdGhlciB0aGFuCi0Jc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeS4KLQkoX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZyb20KLQllbGZjb2RlLmg6dmFsaWRhdGVfcmVsb2MuCi0JKiBlbGZjb2RlLmggKHZhbGlkYXRlX3JlbG9jKTogUmVtb3ZlOyBtb3ZlZCBpbnRvIGVsZi5jIGFuZCByZW5hbWVkCi0JdG8gX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKiBlbGYtYmZkLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBEZWNsYXJlLgotCShfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfb2JqZWN0X3ApOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRG9uJ3QgZGVmaW5lCi0JaWYgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX29iamVjdF9wKTogSGFuZGxlIEVfTUlQU19BUkNIXzQuCi0JKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQotV2VkIE1heSAyOSAxNjoxNToyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQk2NC1iaXQgTUlQUyBFTEYgQUJJIG9iamR1bXAgc3VwcG9ydDoKLQkqIGVsZjY0LW1pcHMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBlbGY2NC1taXBzLm8uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGY2NC1taXBzLmMuCi0JKiBjb25maWcuYmZkIChtaXBzKmVsLSotZWxmKikgQWRkIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBhbmQKLQliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgdG8gdGFyZ19zZWx2ZWNzLgotCShtaXBzKi0qLWVsZiopOiBMaWtld2lzZS4KLQkqIGNvbmZpbmd1cmUuaW46IEFkZCBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYW5kCi0JYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIHRvIHZlY3RvciBzd2l0Y2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBOZXcgZnVuY3Rpb24sCi0JYnJva2VuIG91dCBvZiBtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkci4KLQkobWlwc19lbGYzMl9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIuICBDYWxsIG5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVcGRhdGUgbmFtZSBvZiByZW5hbWVkIGZ1bmN0aW9uLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX3NpemVfaW5mbyk6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIG9mCi0Jd3JpdGVfb3V0X3BoZHJzIHRvIGJlIGNvbnN0LiAgTGlrZXdpc2UgZm9yIHNlY29uZCBwYXJhbWV0ZXIgb2YKLQlzd2FwX3N5bWJvbF9vdXQuCi0JKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCByZWxfaGRyMiBmaWVsZC4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCi0JKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3BoZHJfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcGhkcl9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3NsdXJwX3N5bWJvbF90YWJsZSk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl93cml0ZV9zaGRyc19hbmRfZWhkcik6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl93cml0ZV9vdXRfcGhkcnMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9zeW1ib2xfaW4pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY19pbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcGhkcl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9keW5faW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfZHluX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc2x1cnBfc3ltYm9sX3RhYmxlKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3dyaXRlX291dF9waGRycyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBEZWNsYXJlLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbW92ZSBhc3NlcnRpb24gcmVxdWlyaW5nCi0JU0hUX1JFTC9TSFRfUkVMQSB0byBtYXRjaCB1c2VfcmVsYV9wLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlbG9jCi0Jc2VjdGlvbiBmb3IgdGhlIHNlY3Rpb24sIGFkZCB0aGUgbmV3IG9uZSB0byByZWxfaGRyMi4gIEluY3JlbWVudAotCXJlbG9jX2NvdW50IHJhdGhlciB0aGFuIHNldHRpbmcgaXQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEZWZpbmUgbmFtZSBhcyBtYWNyby4KLQlSZW1vdmUgc3RhdGljIGRlY2xhcmF0aW9uLgotCShlbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWZpbmUgbmFtZSBhcyBtYWNyby4KLQkoZWxmX3dyaXRlX291dF9waGRycyk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9laGRyX2luLCBlbGZfc3dhcF9laGRyX291dCk6IERlY2xhcmUuCi0JKGVsZl9zd2FwX3NoZHJfaW4sIGVsZl9zd2FwX3NoZHJfb3V0KTogRGVjbGFyZS4KLQkoZWxmX3N3YXBfc3ltYm9sX2luKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCi0JKGVsZl9zd2FwX3N5bWJvbF9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfZWhkcl9pbiwgZWxmX3N3YXBfZWhkcl9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfc2hkcl9pbiwgZWxmX3N3YXBfc2hkcl9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfcGhkcl9pbiwgZWxmX3N3YXBfcGhkcl9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfcmVsb2NfaW4sIGVsZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9yZWxvY2FfaW4sIGVsZl9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3dyaXRlX291dF9waGRycyk6IFJlbmFtZSBmcm9tIHdyaXRlX291dF9waGRycy4gIENoYW5nZSBzZWNvbmQKLQlwYXJhbWV0ZXIgdG8gYmUgY29uc3QuICBNYWtlIG5vbi1zdGF0aWMuCi0JKGVsZl93cml0ZV9zaGRyc19hbmRfZWhkcik6IFJlbmFtZSBmcm9tIHdyaXRlX3NoZHJzX2FuZF9laGRyLgotCU1ha2Ugbm9uLXN0YXRpYy4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkoTkFNRShfYmZkX2VsZixzaXplX2luZm8pKTogVXBkYXRlIG5hbWVzIG9mIHJlbmFtZWQgZnVuY3Rpb25zLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShlbGZfYmFja2VuZF9zaXplX2luZm8pOiBMaWtld2lzZS4KLQkoZWxmTk5fYmVkKTogVXNlIGVsZl9iYWNrZW5kX3NpemVfaW5mby4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjY0X2JpZ21pcHNfdmVjKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGFuZAotCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyBpZiBCRkQ2NCBpcyBkZWZpbmVkLgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldF9maWxlX3dpbmRvdyk6IEFkZCBjYXN0IHRvIGZwcmludGYgYXJndW1lbnQuCi0KLVR1ZSBNYXkgMjggMTE6NDI6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEluc2VydCBub3AgaW5zdHJ1Y3Rpb25zLCBub3QKLQl6ZXJvZXMsIGluIGFsaWdubWVudCBob2xlcy4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IE1ha2Ugcm9vbSBmb3IgdGhlCi0JcG90ZW50aWFsIGxlYWRpbmcgdW5kZXJzY29yZSBpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KLQotRnJpIE1heSAyNCAxNDoyODozOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IERvIG5vdCBwdXQgc21hbGwgY29tbW9uCi0Jc3ltYm9scyBpbnRvIC5zYnNzIGlmIHRoaXMgaXMgYSByZWxvY2F0YWJsZSBsaW5rLgotCi1UaHUgTWF5IDIzIDEyOjI2OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBXYXJuIGFib3V0Ci0JdW5kZWZpbmVkIHN5bWJvbHMgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCi1GcmkgTWF5IDE3IDEzOjU0OjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jOiBBZGQgYSBidW5jaCBvZiBuZXcgY29kZSBhbmQgc3RhdGljIGNvbnN0IGFycmF5cyB0bwotCXN1cHBvcnQgYWxpZ25pbmcgbG9hZHMgYW5kIHN0b3JlcyBvbiBmb3VyIGJ5dGUgbWVtb3J5IGJvdW5kYXJpZXMuCi0JQWxzbzoKLQkoc2hfY29mZl9ob3d0b3MpOiBBZGQgZW50cmllcyBmb3IgUl9TSF9DT0RFLCBSX1NIX0RBVEEgYW5kCi0JUl9TSF9MQUJFTC4KLQkoc2hfcmVsYXhfc2VjdGlvbik6IExvb2sgZm9yIFJfU0hfQ09ERSByZWxvY3MuICBJZiB3ZSBmaW5kIG9uZSwKLQljYWxsIHNoX2FsaWduX2xvYWRzLgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBtYXJrIFJfU0hfQ09ERSBvciBSX1NIX0RBVEEgcmVsb2NzCi0JYXMgdW51c2VkLgotCi1UaHUgTWF5IDE2IDE2OjM0OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2FjaGUuYyAoYmZkX29wZW5fZmlsZSk6IFVubGluayB0aGUgZmlsZSBiZWZvcmUgb3BlbmluZyBpdCBmb3IKLQl3cml0ZS4gIEZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT4uCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IFNldCBvcGVuZWRfb25jZS4KLQotVHVlIE1heSAxNCAxMjozNTozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNvbS5jIChzb21fc2x1cnBfcmVsb2NfdGFibGUpOiBDbGVhciBleHRlcm5hbF9yZWxvY3MgY2FjaGUgYWZ0ZXIKLQlmcmVlaW5nIGl0LgotCi0JKiBsaWJiZmQuYzogUmVtb3ZlICNpZmRlZiBGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYLCBhbmQgY29tcGlsZQotCXRoZSBjb2RlIHVuY29uZGl0aW9uYWxseS4KLQotTW9uIE1heSAxMyAxOTo1MTozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKTogRGVmaW5lIHN0cnVjdHVyZS4KLQkocGVpX3NlY3Rpb25fZGF0YSk6IERlZmluZSBtYWNyby4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLAotCXN0b3JlIHNfcGFkZHIgZmllbGQgaW4gcGVpX3NlY3Rpb25fZGF0YS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBVc2UgcGVpX3NlY3Rpb25fZGF0YSByYXRoZXIKLQl0aGFuIF9jb29rZWRfc2l6ZSwgYW5kIGRvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyB2YWx1ZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBDT0ZGX09CSl9XSVRIX1BFLCBzZXQgc19wYWRkciB0bwotCTAuICBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsIHNldCBzX3BhZGRyIHRvIHBlaV9zZWN0aW9uX2RhdGEuCi0JKiBwZWljb2RlLmggKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBEZWZpbmUgaWYKLQlDT0ZGX0lNQUdFX1dJVEhfUEUuCi0gCShwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24gaWYKLQlDT0ZGX0lNQUdFX1dJVEhfUEUuCi0KLVdlZCBNYXkgIDggMTY6MTA6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X2FyY2hfbWFjaCk6IFdyaXRlIGFzIGEgZnVuY3Rpb24gcmF0aGVyIHRoYW4gYQotCW1hY3JvIGRlZmluaXRpb24uCi0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogSWYgYW4gYXJjaGl2ZSBoYXMKLQlubyBtYXAsIGp1c3QgY2hlY2sgZWFjaCBtZW1iZXIgaW4gdHVybiB0byBzZWUgd2hldGhlciBpdCBpcwotCXJlcXVpcmVkLgotCi1XZWQgTWF5ICA4IDA5OjE3OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjYm9vdC5jIChwcGNib290X29iamVjdF9wKTogQ2hlY2sgZm9yIHR5cGUgMHg0MSBpbiBwYXJ0aXRpb24KLQl0YWJsZS4gIENhbGwgQkZEX0FTU0VSVCB0byB2YWxpZGF0ZSBoZWFkZXIgc2l6ZSwgaW5zdGVhZCBvZgotCWNhbGxpbmcgZmF0YWwuCi0JKHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQdXQgcXVvdGVzIGFyb3VuZCBwYXJ0aXRpb24KLQluYW1lLgotCi1UdWUgTWF5ICA3IDE2OjEwOjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjYm9vdC5jOiBOZXcgdGFyZ2V0IGZvciBsb29raW5nIGF0IFBQQ2J1ZyBib290IHJlY29yZHMuCi0KLQkqIGNvbmZpZ3t1cmUuaW4sLmJmZH06IEFkZCBzdXBwb3J0IGZvciBwcGNib290IHRhcmdldC4KLQkqIHRhcmdldHMuYzogRGl0dG8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBNYXkgIDcgMTE6MTU6MTkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGhvd3RvX3RhYmxlKTogVXBkYXRlIG5hbWVzIHRvIG1hdGNoIHJlY2VudAotCWNoYW5nZXMgdG8gaW5jbHVkZS9jb2ZmL2ludGVybmFsLmguICBGaXggbWlub3IgZXJyb3JzIGluIHRoZQotCWV4aXN0aW5nIHJlbG9jcy4gIEFkZCBSX01PVkwxIGFuZCBSX01PVkwyLgotCShydHlwZTJob3d0byk6IFNpbWlsYXJseS4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IFJld3JpdGUgdG8gc2ltcGxpZnksIGZpeCBidWdzIGluIHRoZQotCWV4aXN0aW5nIHJlbGF4aW5nIGNvZGUgIGFuZCBwZWZvcm0gbW9yZSByZWxheGluZy4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCi1Nb24gTWF5ICA2IDE4OjI0OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IEhhbmRsZSBjb21tb24KLQlzeW1ib2xzIGNvcnJlY3RseS4KLQotU2F0IE1heSAgNCAwNTowODo0NSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogIFJlamVjdCBnZW5lcmljIEVMRiB0YXJnZXQgaWYKLQllX21hY2hpbmUgbWF0Y2hlcyBhbiBhbHRlcm5hdGUgbWFjaGluZSBjb2RlIGluIGEgc3BlY2lmaWMgYmFja2VuZC4KLQotCSogbmV0YnNkLWNvcmUuYyAobmV0YnNkX2NvcmVfdmVjKTogIFJlbW92ZSBpbml0aWFsaXplciBmb3IKLQlvYnNvbGV0ZSBhbGlnbl9wb3dlcl9taW4gZmllbGQuCi0KLUZyaSBNYXkgIDMgMTM6MDc6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBBZGQgaG93dG8gZW50cnkgZm9yCi0JUl9QQ1JXT1JEX0IuCi0JKHJ0eXBlMmhvd3RvKTogSGFuZGxlIFJfUENSV09SRF9CLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogSGFuZGxlIFJfUENSV09SRF9CLgotCShoODMwMF9yZWxvY18xNl9lc3RpbWF0ZSk6IExpa2V3aXNlLiAgVHJ5IHRvIHR1cm4gYSAxNmJpdAotCXBjLXJlbGF0aXZlIGJyYW5jaCAoUl9QQ1JXT1JEKSBpbnRvIGFuIDhiaXQgcGMtcmVsYXRpdmUKLQlicmFuY2ggKFJfUENXT1JEX0IpLgotCi1GcmkgTWF5ICAzIDEwOjQ3OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFNldCB0aGUgc2VjdGlvbiBmb3IKLQlCU0ZfQ09OU1RSVUNUT1Igc3ltYm9scy4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ29ycmVjdCBzZXR0aW5nIG9mCi0JbGFzdF9iZl9pbmRleC4KLQotV2VkIE1heSAgMSAxODozOTozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluIGNvbWRhdCBzZWN0aW9uIGxvb2t1cCwKLQlzdG9wIGxvb2tpbmcgd2hlbiBzZWN0aW9uIGlzIGZvdW5kLgotCi1XZWQgTWF5ICAxIDE0OjE3OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoU1RSSU5HX1NJWkVfU0laRSk6IERlZmluZS4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBIYW5kbGUgbG9uZyBzeW1ib2wgbmFtZXMgd2hlbiBsb29raW5nIGZvciB0aGUKLQlzZWN0aW9uIHN5bWJvbC4KLQkoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIF9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgZmllbGQuCi0JKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyk6IERlZmluZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBIYW5kbGUgbG9uZyBzZWN0aW9uCi0JbmFtZXMuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBwZS1hcm0uYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZWktYXJtLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGUtaTM4Ni5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlaS1pMzg2LmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGUtcHBjLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGVpLXBwYy5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQotCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IFNldCBsbWEgb2Ygc2VjdGlvbnMuCi0JKGJfb3V0X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBSZW5hbWUgaW5fYWJmZAotCXBhcmFtZXRlciB0byBvdXRwdXRfYmZkLiAgVXNlZCBpbnB1dF9iZmQgaW5zdGVhZCBvZiBvdXRwdXRfYmZkIGluCi0Jc2V2ZXJhbCBwbGFjZXMuCi0KLVR1ZSBBcHIgMzAgMTc6NTY6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogRG9uJ3QgY3JlYXRlCi0JU0VDX0NPTlNUUlVDVE9SIHNlY3Rpb25zLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBlbGZfZ3AuCi0JRnJvbSBEb24gQm93bWFuIDxib3dtYW5Ad2F0ZXJsb28uaHAuY29tPi4KLQotVHVlIEFwciAzMCAxNzowNjozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhcm1jb2ZmX2xpdHRsZV92ZWMpOiBJZiBDT0ZGX1dJVEhfUEUgaXMgZGVmaW5lZCwgYWRkCi0JU0VDX0xJTktfT05DRSBhbmQgU0VDX0xJTktfRFVQTElDQVRFUyB0byBzZWN0aW9uX2ZsYWdzLgotCi1Nb24gQXByIDI5IDEzOjE1OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkCi0JbWlwc18zMl9yZWxvY3MgZmllbGQuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBtaXBzXzMyX3JlbG9jcyBmaWVsZC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvcHkgUl9NSVBTX1JFTDMyIGFuZCBSX01JUFNfMzIKLQlyZWxvY3MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyCi0JZmlsZS4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogRm9yIGEgUl9NSVBTX1JFTDMyIG9yIFJfTUlQU18zMiByZWxvYwotCWFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBpbmNyZW1lbnQgbWlwc18zMl9yZWxvY3MuCi0JKG1pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIG1pcHNfMzJfcmVsb2NzIGlzIHNldCwgYW5kCi0JdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgbWFrZSByb29tIGluIHRoZQotCS5yZWwuZHluIHNlY3Rpb24uCi0KLUZyaSBBcHIgMjYgMTg6MDA6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBUcmFjayB0aGUgcmVhbAotCWZpbGUgcG9zaXRpb24gYW5kIHRoZSB2aXJ0dWFsIGZpbGUgcG9zaXRpb24gc2VwYXJhdGVseS4gIFNldAotCWZpbGVwb3MgaW5mb3JtYXRpb24gYnNhZWQgb24gdGhlIHJlYWwgZmlsZSBwb3NpdGlvbi4KLQkoX2JmZF9lY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEhhbmRsZSAubGliIHNlY3Rpb25zIGxpa2UgdGhlCi0JSmFuIDIzIGNoYW5nZSB0byBjb2ZmY29kZS5oLgotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCB0aGUgc3ltYm9sIGNvdW50IHRvIHRoZQotCW51bWJlciBvZiBCRkQgc3ltYm9scyBjcmVhdGVkLgotCi1GcmkgQXByIDI2IDEyOjM0OjI5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogRm9yd2FyZCByZWxvY2F0aW9ucyB0byB0aGUKLQlvdXRwdXQgZmlsZSBpZiBsaW5raW5nIHNoYXJlZCBvYmplY3RzLiAgTG9vcCB0byBjaGVjayBhbGwgcmVsb2NzLAotCXJhdGhlciB0aGFuIHJldHVybmluZyBmYWxzZSBvbiBmaXJzdCBlcnJvci4KLQotVGh1IEFwciAyNSAxMzoyNToxMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IEFkZCBQTFQgY2FzZS4KLQkocHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IElmIC5pbnRlcnAgc2VjdGlvbiwgYnVtcCAjCi0Jb2YgcHJvZ3JhbSBoZWFkZXJzIGJ5IDEuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRmxlc2ggb3V0IHN1cHBvcnQuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIHN1cHBvcnQgZm9yIC5wbHQgc2VjdGlvbi4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBQcmludCBvdXQgZmlsZW5hbWUgaW4gZGVidWcgY29kZS4gIEVuYWJsZQotCVBMVCBzdXBwb3J0LgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEFkZCBzdXBwb3J0IGZvciBQTFQncywgYmVlZiB1cAotCWRlYnVnIG91dHB1dC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgdGhlIG91dHB1dCBzZWN0aW9uIGlzbid0IGRlZmluZWQsCi0JZG9uJ3QgYWJvcnQsIGp1c3QgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgdGhlIHNlY3Rpb24KLQliZWluZyBjcmVhdGVkIGlzIC5zZGF0YSBvciAuc2RhdGEyLCBkb24ndCBtYWtlIHRoZSBzeW1ib2wgZHluYW1pYy4KLQotV2VkIEFwciAyNCAxNDowNDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTG9vayB0aHJvdWdoIHRoZQotCW1lbWJlcnMgb2YgYW4gYXJjaGl2ZSBmb3IgZHluYW1pYyBvYmplY3RzIHdpdGggbm8gc3ltYm9scywgYW5kCi0JcGFzcyB0aGVtIGRpcmVjdGx5IHRvIGNoZWNrX2FyY2hpdmVfZWxlbWVudC4KLQkoeGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogUGFzcyBkeW5hbWljIG9iamVjdHMgdG8KLQl4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scy4KLQkoeGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX3ZlYyk6IENoYW5nZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDCi0JZnJvbSBfYmZkX25vZHluYW1pYyB0byBfYmZkX3hjb2ZmLgotCSogbGliY29mZi1pbi5oIChfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6Ci0JRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfc3dhcF9sZHJlbF9pbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF94Y29mZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCSh4Y29mZl9keW5hbWljX3JlbG9jKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzKTogVXNlIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzLgotCi1UdWUgQXByIDIzIDEyOjQ4OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zcGFyYy5jIChiZmRfY29mZl9nZW5lcmljX3JlbG9jKTogUmV0dXJuIGJmZF9yZWxvY19vayBldmVuCi0JaWYgcmVsb2NfZW50cnktPmFkZGVuZCBpcyBub3QgMC4KLQkoQ0FMQ19BRERFTkQpOiBKdXN0IHNldCB0aGUgYWRkZW5kIHRvIHJlbG9jLnJfb2Zmc2V0LgotCi1Nb24gQXByIDIyIDE4OjI5OjAxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogRml4IHNwZWxsaW5nIG9mCi0JUl9TUEFSQ19HTE9CX0pNUC4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogTGlrZXdpc2UuCi0JQWRkIGVudHJpZXMgZm9yIFJfU1BBUkNfWzU2XS4KLQkoc3BhcmNfcmVsb2NfbWFwKTogQWRkIGVudHJpZXMgZm9yIFJfU1BBUkNfWzU2XS4KLQotTW9uIEFwciAyMiAxNTowNzoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlPcHRpbWl6ZSBsaW5raW5nIG9mIHN0YWJzIGluIHNlY3Rpb25zIGFzIHVzZWQgaW4gRUxGIGFuZCBDT0ZGLgotCSogc3RhYnMuYzogTmV3IGZpbGUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBEZWNsYXJlLgotCShfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBEZWNsYXJlLgotCShfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplCi0Jc3RhYl9pbmZvIGZpZWxkLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDYWxsIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzIGlmCi0JYXBwcm9wcmlhdGUuCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogV3JpdGUgb3V0IHN0YWIgc3RyaW5ncyBoYXNoIHRhYmxlLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgb3B0aW1pemVkIHN0YWJzIHNlY3Rpb25zLgotCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgc3RhYiBzdHJpbmdzCi0JaGFzaCB0YWJsZS4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgotCShzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBzdGFiX2luZm8KLQlmaWVsZC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgYXBwcm9wcmlhdGUsIGNhbGwKLQlfYmZkX2xpbmtfc2VjdGlvbl9zdGFicy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogV3JpdGUgb3V0IHN0YWIgc3RyaW5ncyBoYXNoIHRhYmxlLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgb3B0aW1pemVkIHN0YWJzIHNlY3Rpb25zLgotCSogcmVsb2MuYyAoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogQ2hlY2sgYWRkcmVzcyBhZ2FpbnN0Ci0JX3Jhd19zaXplIHJhdGhlciB0aGFuIF9jb29rZWRfc2l6ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBBZGQgc3RhYnMubwotCShCRkRfTElCU19DRklMRVMpOiBBZGQgc3RhYnMuYy4KLQotCSogVkVSU0lPTjogSW5jcmVtZW50IGZvciBiZmRsaW5rLmggY2hhbmdlLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IENvcnJlY3QgaGFuZGxpbmcgb2YKLQlCU0ZfTk9UX0FUX0VORCBjb21tb24gc3ltYm9scy4KLQotRnJpIEFwciAxOSAxOToyMTo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHJlY29yZF90b2MpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCShwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBBTlNJIEMgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi0JKHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogUmVtb3ZlIHVucmVhY2hlZCBjb2RlLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB0YWtlIHRoZSBhZGRyZXNzCi0Jb2YgYW4gYXJyYXkuCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmcuCi0JKHBlX3ByaW50X2VkYXRhKTogTGlrZXdpc2UuCi0JKHBlX3ByaW50X3JlbG9jKTogUmVtb3ZlIEFOU0kgQyBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KLQotVGh1IEFwciAxOCAxODo1MToxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvKTogQWRkIGxhc3RfYmZfaW5kZXgKLQlhbmQgbGFzdF9iZiBmaWVsZHMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogU3dhcCBlbmRuZHggZmllbGQgZm9yIENfRkNOCi0Jc3ltYm9scy4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IExpa2V3aXNlLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChjb2ZmX3BvaW50ZXJpemVfYXV4KTogQ2hlY2sgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTgotCXN5bWJvbHMuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEluaXRpYWxpemUgbGFzdF9iZl9pbmRleAotCWZpZWxkLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBlbmRuZHggZmllbGQgZm9yIENfRkNOIHN5bWJvbHMuCi0JRml4IHVwIC5iZiBlbmRuZHggbGluayBmaWVsZHMuCi0JKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IEluaXRpYWxpemUgbGFzdF9iZl9pbmRleAotCWZpZWxkLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2hlY2sgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTgotCXN5bWJvbHMuCi0KLVdlZCBBcHIgMTcgMTI6MDg6MjQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwZXssaX0tcHBjLmMgKFBQQ19QRSk6IERlZmluZSBpbnN0ZWFkIG9mIFBQQywgc28gdGhhdCBjb21waWxpbmcKLQlvbiBTb2xhcmlzIFBvd2VyUEMgc3lzdGVtcyBkb2Vzbid0IGdldCBjb25mdXNlZC4KLQotCSogY2NmZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgI2lmZGVmIFBQQ19QRSwgbm90Ci0JI2lmZGVmIFBQQy4KLQotCSogZWxmY29yZS5oIChiZmRfcHJzdGF0dXMsIGJmZF9mcHJlZ3NldCk6IEFkZCB0aHJlYWQgYXJndW1lbnQuCi0JKGVsZl9jb3JlZmlsZV9ub3RlKTogSWYgSEFWRV9TWVNfUFJPQ0ZTX0ggaXMgbm90IGRlZmluZWQsIGRvbid0Ci0JdXBkYXRlIGRpZF9yZWcgYW5kIGRpZF9yZWcyLgotCi1XZWQgQXByIDE3IDEzOjA3OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2hlY2sgZm9yIFRPQyBvdmVyZmxvdy4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogV2hlbiBjYWxsaW5nIHRoZQotCWNhbGxiYWNrIHJvdXRpbmVzLCBwYXNzIGgtPnJvb3Quc3RyaW5nIHJhdGhlciB0aGFuIG5hbWUsIGluIGNhc2UKLQljb3B5IGlzIHRydWUgYW5kIG5hbWUgaXMgdHJhbnNpZW50LgotCi1UdWUgQXByIDE2IDE2OjM2OjM4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogZWxmY29yZS5oOiAgQWRkIHN1cHBvcnQgZm9yIGNvcmUgZmlsZXMgd2l0aCBtdWx0aXBsZSB0aHJlYWRzLgotCShQcmltYXJpbHkgZm9yIFNvbGFyaXMuKQotCi1UdWUgQXByIDE2IDEzOjQ0OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSk6IERvbid0IGRvIGFueXRoaW5nIGlmCi0Jc2VjdGlvbi0+b3JlbG9jYXRpb24gaXMgTlVMTC4KLQotCSogY29mZmdlbi5jIChiZmRfY29mZl9nZXRfc3ltZW50KTogTmV3IGZ1bmN0aW9uLgotCShiZmRfY29mZl9nZXRfYXV4ZW50KTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9jb2ZmX2dldF9zeW1lbnQpOiBEZWNsYXJlLgotCShiZmRfY29mZl9nZXRfYXV4ZW50KTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIEFwciAxNSAxOTowNjo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfaGkxNik6IERlZmluZS4KLQkobWlwc19oaTE2X2FkZHIsIG1pcHNfaGkxNl9hZGRlbmQpOiBSZW1vdmUuCi0JKG1pcHNfaGkxNl9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc19lbGZfaGkxNl9yZWxvYyk6IE1haW50YWluIGEgbGlzdCBvZiB1bm1hdGNoZWQgSEkxNiByZWxvY3MuCi0JKG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBQcm9jZXNzIG1pcHNfaGkxNl9saXN0LgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUGVybWl0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkxNgotCXJlbG9jcyBiZWZvcmUgdGhlIGFzc29jaWF0ZWQgTE8xNiByZWxvYy4KLQotV2VkIEFwciAxMCAwMDoyMzo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX3NjYW4pOiBDaGVjayBiZmRfYWxsb2MgcmV0dXJuIHZhbHVlLgotCSh2ZXJzYWRvc19vYmplY3RfcCk6IENoZWNrIGFsbCBiZmRfcmVhZCByZXR1cm4gdmFsdWVzLiAgUmVxdWlyZQotCXRoYXQgbGFuZyBmaWVsZCBiZSBsZXNzIHRoYW4gMTAsIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIEludGVsIEhleAotCWZpbGVzLgotCi0JKiBsaWJhb3V0LmggKFdSSVRFX0hFQURFUlMpOiBXcml0ZSBvdXQgdGhlIHJlbG9jcyBldmVuIGlmIHRoZXJlCi0JYXJlbid0IGFueSBzeW1ib2xzLgotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkpOiBTZXQgcl9pbmRleCB0byBOX0FCUywKLQlub3QgMCwgZm9yIGFuIGFic29sdXRlIHN5bWJvbC4KLQkoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkpOiBMaWtld2lzZS4KLQotCSogaWhleC5jIChpaGV4X3NjYW4pOiBBY2NlcHQgYSBsZW5ndGggb2YgNCBmb3IgcmVjb3JkIHR5cGUgNS4KLQkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBGb3IgYSBsYXJnZSBzdGFydCBhZGRyZXNzLCBvdXRwdXQKLQl0aGUgZnVsbCAzMiBiaXQgYWRkcmVzcyBpbiByZWNvcmQgdHlwZSA1LgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfYnl0ZSk6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIGZyb20gYmZkX2J5dGUKLQl0byBpbnQgdG8gYXZvaWQgcHJvbW90aW9uIHByb2JsZW1zIGluIHByb3RvdHlwZS4KLQotVHVlIEFwciAgOSAxMTo0NDoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgJHtzcmNkaXJ9IHdoZW4gbG9va2luZyBmb3IgcGljZnJhZy4KLQotCSogY29uZmlndXJlLmhvc3Q6IFN3aXRjaCBvbiAke2xpYmRpcn0sIG5vdCAkKGxpYmRpcikuICBGcm9tCi0JYWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXUgKEFsYW4gTW9kcmEpLgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBBbHdheXMgY2FsbCBhZGRfZHluYW1pY19zeW1ib2xzCi0JZW50cnkgcG9pbnQsIG5vdCBqdXN0IGZvciBEWU5BTUlDIG9iamVjdHMuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogQWx3YXlzIGNhbGwKLQlzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gIElmIGNhbGxlZCB3aXRoIGEgbm9uIERZTkFNSUMKLQlvYmplY3QsIGRvbid0IGRvIGFueXRoaW5nIGVsc2UuCi0JKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgY2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQotTW9uIEFwciAgOCAxMjowOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhMREZMQUdTIGFuZCBTSExJQl9DRkxBR1MgZm9yICotZGVjLW9zZioKLQlob3N0IHdoZW4gY29uZmlndXJpbmcgd2l0aCAtLWVuYWJsZS1zaGFyZC4KLQotRnJpIEFwciAgNSAxMjoyNDoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBpWzM0NV04Ni0qLWZyZWVic2RlbGYqIHRhcmdldDsgZnJvbSBKb2huIFBvbHN0cmEKLQk8amRwQHBvbHN0cmEuY29tPi4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogRm9yIFdBUk5fUk9XL3dhcm4sIHVzZSBNV0FSTiwgbm90IENZQ0xFLAotCXRvIGF2b2lkIGNyYXNoaW5nIGluIGJmZF9oYXNoX3JlcGxhY2UuCi0KLQkqIHN5c2RlcC5oOiBVc2UgI2lmZGVmLCBub3QgI2lmLgotCi1UaHUgQXByICA0IDIzOjMyOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCi1UaHUgQXByICA0IDE4OjQ5OjA5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc29ueS1ic2QqKTogRml4IHR5cG8gaW4gQUNfREVGSU5FLgotCShBQ19DSEVDS19IRUFERVJTKTogQ2hlY2sgZm9yIHN5cy90aW1lLmgKLQkoQUNfSEVBREVSX1RJTUUpOiBBZGQgbWFjcm8uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBzeXNkZXAuaDogVXNlIFRJTUVfV0lUSF9TWVNfVElNRSBhbmQgSEFWRV9TWVNfVElNRV9ICi0JdG8gY29udHJvbCB3aGF0IGNvbWJpbmF0aW9uIG9mIDx0aW1lPiBhbmQgPHN5cy90aW1lLmg+Ci0JZ2V0IGluY2x1ZGVkLgotCi1UdWUgQXByICAyIDEzOjExOjUzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFvdXRmMS5oIChzdW5vc18zMl9zZXRfYXJjaF9tYWNoKTogSGFuZGxlIE1fU1BBUkNMRVQuCi0JKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBIYW5kbGUKLQliZmRfbWFjaF9zcGFyY197c3BhcmNsZXQsc3BhcmNsaXRlfS4KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NwYXJjX3tzcGFyY2xldCxzcGFyY2xpdGV9KTogRGVmaW5lLgotCShiZmRfbWFjaF9zcGFyY192OV9wKTogVXBkYXRlLgotCSogY3B1LXNwYXJjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgZW50cmllcyBmb3Igc3BhcmNsZXQsc3BhcmNsaXRlLgotCSogbGliYW91dC5oIChlbnVtIG1hY2hpbmVfdHlwZSk6IEFkZCBNX1NQQVJDTEVULgotCSogc3Vub3MuYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgQXByICAyIDAwOjMzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBoZ290IGZpZWxkLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBoZ290IGZpZWxkLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBTdG9yZSB0aGUKLQlfR0xPQkFMX09GRlNFVF9UQUJMRV8gaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUgaGdvdCBmaWVsZC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IElmIHRoZSBzaXplIG9mIHRoZQotCWdsb2JhbCBvZmZzZXQgdGFibGUgZ29lcyBvdmVyIDB4MTAwMCwgc2V0IHRoZSB2YWx1ZSBvZgotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyB0byAweDEwMDAgaW50byB0aGUgc2VjdGlvbi4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFN1YnRyYWN0IHRoZSBvZmZzZXQgb2YKLQlfR0xPQkFMX09GRlNFVF9UQUJMRV8gd2hlbiBoYW5kbGluZyBHT1QgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZmNvZGUuaDogRG9uJ3QgaW5jbHVkZSA8c3RyaW5nLmg+LgotCi1Nb24gQXByICAxIDEwOjM5OjI0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IFJlbmFtZWQgZnJvbQotCWdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMuICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgotCSogZ2VubGluay5oIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBEZWNsYXJhdGlvbgotCW1vdmVkIGhlcmUgZnJvbSBsaWJiZmQtaW4uaC4KLQkqIGxpYmJmZC1pbi5oOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBBcHIgIDEgMTI6MzU6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIHJlcG9ydGluZyBhbgotCW92ZXJmbG93IGVycm9yLCB1c2UgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBpZgotCWF2YWlsYWJsZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgY29tbW9uIHN5bWJvbCBnb3QKLQlkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBzZXQgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUi4KLQotU3VuIE1hciAzMSAwMTo1ODo0MSAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IERlbGV0ZSB0ZXN0IGZvciAuanVuay4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMjkgMTI6NDQ6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKFNFQ19MSU5LX09OQ0UpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVMpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRCk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWSk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSWYgQ09GRl9XSVRIX1BFLCB0dXJuCi0JU0VDX0xJTktfT05DRSBpbnRvIElNQUdFX1NDTl9MTktfQ09NREFULgotCShzdHlwX3RvX3NlY19mbGFncyk6IElmIENPRkZfV0lUSF9QRSwgdHVybiBJTUFHRV9TQ05fTE5LX1JFTU9WRQotCWludG8gU0VDX0VYQ0xVREUuICBJZiBJTUFHRV9TQ05fTE5LX0NPTURBVCBpcyBzZXQsIHNldAotCVNFQ19MSU5LX09OQ0UsIGFuZCBsb29rIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlIHNldHRpbmcKLQlmb3IgU0VDX0xJTktfRFVQTElDQVRFUy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBDT0ZGX1dJVEhfUEUsIGlmIFNFQ19MSU5LX09OQ0UgaXMKLQlzZXQgZm9yIGEgc2VjdGlvbiwgZmluZCB0aGUgc2VjdGlvbiBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSwKLQlhbmQgc2V0IHRoZSBhdXggZW50cnkgYmFzZWQgb24gU0VDX0xJTktfRFVQTElDQVRFUy4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBBZGQgYSBzcGFjZSBiZWZvcmUgImNoZWNrc3VtIi4KLQkqIGNvZmYtYXJtLmMgKGFybWNvZmZfYmlnX3ZlYyk6IElmIENPRkZfV0lUSF9QRSBpcyBkZWZpbmVkLCBhZGQKLQlTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTIHRvIHNlY3Rpb25fZmxhZ3MuCi0JKiBjb2ZmLWkzODYuYyAoaTM4NmNvZmZfdmVjKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXBwYy5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBMaWtld2lzZS4KLQotCSogVkVSU0lPTjogQnVtcCB0byAyLjYuMS4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gVkVSU0lPTi4KLQotVGh1IE1hciAyOCAyMzo0ODo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogQWRkIGRlY2xhcmF0aW9uLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IE5vIGxvbmdlciBzdGF0aWMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9saW5rX2hhc2hfY3JlYXRlKTogQWxsb3cgc3BlY2lmaWMgdGFyZ2V0cwotCXRvIG92ZXJyaWRlLgotCSogY29mZi1oODMwMC5jOiBBZGQgdHdvIGRlcml2ZWQgaGFzaCB0YWJsZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQKLQlmdW50aW9ucyBhbmQgI2RlZmluZXMgZm9yIHVzZSBieSB0aGUgaDgzMDAgbGlua2VyLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjYXNlIFJfTUVNX0lORElSRUNUKTogQ3JlYXRlIGVudHJpZXMgaW4KLQl0aGUgZnVuY3Rpb24gdmVjdG9yIGFzIG5lZWRlZC4gIFBsYWNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbgotCXZlY3RvciBlbnRyeSBpbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBSX01FTV9JTkRJUkVDVCByZWxvYy4KLQlSZXdyaXRlIHRoZSB2ZWN0b3JzIHNlY3Rpb24gY29udGVudHMgYXMgbmVjZXNzYXJ5LgotCShoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiBmb3IgdGhlIGg4MzAwIGxpbmtlci4KLQkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlZmluZSB0byB1c2UgaDgzMDAgc3BlY2lmaWMgdmVyc2lvbi4KLQkoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCi1UaHUgTWFyIDI4IDE3OjQ0OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliaHBwYS5oOiBJZiBnY2MgMi43IG9yIGhpZ2hlciwgZGVjbGFyZSBhbGwgdGhlIGZ1bmN0aW9ucyB3aXRoCi0JX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKSBzbyB0aGF0IC1XYWxsIGRvZXNuJ3Qgd2FybiBhYm91dAotCXRoZW0uCi0JKGhwcGFfcmVidWlsZF9pbnNuKTogUGFzcyBwb2ludGVyIHRvIGNvcnJlY3QgdHlwZSB0bwotCWxvd19zaWduX3VuZXh0IGFuZCBkaXNfYXNzZW1ibGVfMjEuCi0KLVRodSBNYXIgMjggMTE6MDA6MzYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoc3BhcmM2NC17c3lzdjQqLHNvbGFyaXMyKn0pOiBEZWxldGUuCi0JU3RpY2sgd2l0aCBzcGFyYy0qLXtzeXN2NCosc29sYXJpczIqfS4KLQotV2VkIE1hciAyNyAxMDo0MzozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IFN3YXAgaW4gZXh0cmEgUEUgeF9zY24gZmllbGRzLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IFN3YXAgb3V0IGV4dHJhIFBFIHhfc2NuIGZpZWxkcy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBaZXJvIG91dCBleHRyYSBQRSB4X3NjbiBmaWVsZHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogSWYgYW55IG9mIHRoZSBleHRyYSBQRSB4X3NjbgotCWZpZWxkcyBpcyBub24temVybywgcHJpbnQgdGhlbS4KLQotCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF90b2NfZW50cnkpOiBQdXQgaW5zaWRlIENPRkZfSU1BR0VfV0lUSF9QRQotCWlmZGVmLiAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKHBwY19yZWNvcmRfZGF0YV9pbl90b2NfZW50cnkpOiBJZmRlZiBvdXQuICBSZW1vdmVkIHVudXNlZAotCXZhcmlhYmxlcy4KLQkocHBjX21hcmtfc3ltYm9sX2FzX2dsdWUpOiBQdXQgaW5zaWRlIENPRkZfSU1BR0VfV0lUSF9QRSBpZmRlZi4KLQkoZ2V0X3N5bWJvbF92YWx1ZSk6IElmZGVmIG91dC4KLQkocGVfcHBjX3JlbG9jKTogSWZkZWYgb3V0LiAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4gIE1ha2UKLQlmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzIGNvcnJlc3BvbmQuICBQdXQgYmVmb3JlX2FkZHIgaW4KLQlERUJVR19SRUxPQyBpZmRlZi4KLQkoZHVtcF90b2MpOiBNYWtlIGZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMgY29ycmVzcG9uZC4KLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4gIEFsd2F5cwotCXJldHVybiBhIHZhbHVlLgotCShwcGNfcmVmbG9fcmVsb2MpOiBJZmRlZiBvdXQuCi0JKHBwY19hZGRyMzJuYl9yZWxvYyk6IElmZGVmIG91dC4KLQkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiBNYWtlIGZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMKLQljb3JyZXNwb25kLgotCShjb2ZmX3BwY19ydHlwZV90b19ob3d0byk6IExpa2V3aXNlLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBNb3ZlIG90aGVyd2lzZSB1bnVzZWQgdmFyaWFibGVzIGludG8KLQl0aGUgI2lmZGVmIHdoZXJlIHRoZXkgYXJlIHVzZWQuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKHBlX3ByaW50X2VkYXRhKTogTWFrZSBmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzCi0JY29ycmVzcG9uZC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkocGVfcHJpbnRfcGRhdGEpOiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBhZGRyX3ZhbHVlLiAgQWx3YXlzCi0JcmV0dXJuIGEgdmFsdWUuCi0JKHBlX3ByaW50X3JlbG9jKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBvbmFsaW5lLiAgTWFrZSBmcHJpbnRmCi0Jc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMgY29ycmVzcG9uZC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfZmFrZV9zZWN0aW9ucyk6IFJldHVybiB0cnVlLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IE1vdmUgZGVmaW5pdGlvbiBvZiB1bnVzZWQKLQl2YXJpYWJsZSByZWxhIGluc2lkZSAjaWYgMCBzZWN0aW9uIHdoZXJlIGl0IGlzIHVzZWQuCi0KLQkqIG5zMzJrLmg6IE5ldyBmaWxlLgotCSogY3B1LW5zMzJrLmg6IEluY2x1ZGUgbnMzMmsuaC4gIFJlbmFtZSBleHRlcm5hbGx5IHZpc2libGUKLQlmdW5jdGlvbnMgdG8gc3RhcnQgd2l0aCBfYmZkXy4KLQkqIGFvdXQtbnMzMmsuYzogSW5jbHVkZSBuczMyay5oLiAgQ2hhbmdlIHJlZmVyZW5jZXMgdG8gcmVuYW1lZAotCWZ1bmN0aW9ucyBpbiBjcHUtbnMzMmsuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoSEZJTEVTKTogQWRkIG5zMzJrLmguCi0KLQkqIHNlY3Rpb24uYyAoc3RydWN0IHNlYyk6IEFkZCBsaW5rZXJfbWFyayBmaWVsZC4gIENoYW5nZQotCXVzZXJfc2V0X3ZtYSBhbmQgcmVsb2NfZG9uZSB0byBiZSBzaW5nbGUgYml0IGZpZWxkcy4KLQkoU1REX1NFQ1RJT04pOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuCi0JKGFvdXRfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0JKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4KLQl0aGUgbGluay4KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbiB0aGUKLQlsaW5rLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkCi0JaW4gdGhlIGxpbmsuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBJbmNsdWRlIHNlY3Rpb24gbmFtZSBpbgotCW92ZXJmbG93IGVycm9yIG1lc3NhZ2VzLgotCi1UdWUgTWFyIDI2IDE1OjQ2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyKTogSWYgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUKLQlpcyBub3Qgc2V0LCBwcmludCAiQkZEOiAiIGJlZm9yZSB0aGUgZXJyb3IgbWVzc2FnZS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQUNfQ0hFQ0tfVE9PTCB0byBmaW5kIGFyIGFuZCByYW5saWIuICBGcm9tCi0JTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5haS5taXQuZWR1Pi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyMiAxMjoxNzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IEZpeCBzY2FuIGZvciBDX0JJTkNML0NfRUlOQ0wKLQlzeW1ib2xzLgotCi0JKiBjb25maWcuYmZkOiBBZGQgaWVlZV92ZWMgdG8gdGFyZ19zZWx2ZWNzIGZvciBpOTYwIHRhcmdldHMgYW5kCi0JbTY4ay1hb3V0LCBtNjhrLWNvZmYsIGFuZCBtNjhrLWVsZiB0YXJnZXRzLgotCi1GcmkgTWFyIDIyIDExOjMzOjQ0IDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AZ29vZnkuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiBpZWVlLmM6IENoYW5nZWQgI2lmZGVmIEtFRVBNSU5VU1BDSU5JTlNUIHRvICNpZiBLRUVQTUlOVVNQQ0lOSU5TVC4KLQkoaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBSZXN0cnVjdHVyZWQgdG8gcHJldmVudAotCWllZWVfb2JqZWN0X3AgZnJvbSBiZWluZyBjYWxsZWQgcmVwZWF0ZWRseS4KLQotVGh1IE1hciAyMSAxMTowMDo0NyAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBBbGxvY2F0ZQotCWJ1ZmZlcnMgbGFyZ2UgZW5vdWdoIGZvciBhbnkgRklMRUhEUiBvciBBT1VUSERSLgotCi1UaHUgTWFyIDIxIDE2OjI4OjE3IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmbGluay5jIChsb29rdXBfbGluZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHJlbmFtZWQgYW5kCi0Jc2xpZ2hseSBjaGFuZ2VkIGZyb20gb2xkIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUuCi0JKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBDYWNoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gIFVzZQotCWxvb2t1cF9saW5lIGZvciBhY3R1YWwgbG9va3VwLgotCi1UaHUgTWFyIDIxIDE0OjU5OjExIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9wZGF0YSk6IFdhcm4gaWYgdGhlIC5wZGF0YSBzZWN0aW9uIGlzIG5vdCBhCi0JbXVsdGlwbGUgb2YgMjAgYnl0ZXMuCi0KLVRodSBNYXIgMjEgMTM6NTQ6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogVXNlIGJmZF96YWxsb2MgdG8KLQlhbGxvY2F0ZSBlY29mZl9maW5kX2xpbmUsIGFuZCBkb24ndCBpbml0aWFsaXplIGJ5IGhhbmQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogVXNlIGJmZF96YWxsb2MgZm9yCi0JbWlwc19lbGZfZmluZF9saW5lLCBhbmQgZG9uJ3QgY2FsbCBtZW1zZXQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgbm90Ci0JcHJvZHVjaW5nIGEgZmluYWwgZXhlY3V0YWJsZSwgZG9uJ3QgY29uc2lkZXIgc29mYXIgd2hlbiBhbGlnbmluZwotCXRoZSBzZWN0aW9uIHRvIHRoZSBjb3JyZWN0IHNpemUuCi0KLVdlZCBNYXIgMjAgMTY6NTM6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBJZmRlZiBvdXQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY2FsbCBjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBJZmRlZiBvdXQuCi0KLU1vbiBNYXIgMTggMTI6NTQ6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBJbml0aWFsaXplIGdwIGlmCi0Jb3V0cHV0X2JmZCBpcyBub3QgTlVMTC4KLQotVGh1IE1hciAxNCAxNzoxMjowNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IENhbGwgYmZkX3phbGxvYyBpbnN0ZWFkCi0Jb2YgYmZkX2FsbG9jIChmaXhlcyBmaXhfbGluZSBub3QgYmVpbmcgaW5pdGlhbGl6ZWQpLgotCURlbGV0ZSB6ZXJvaW5nIG9mIGZpeF97dmFsdWUsdGFnLGVuZCxzY25sZW59IGZpZWxkcy4KLQotVGh1IE1hciAxNCAxNjowNjowNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IEFsbG93IHNwZWNpZmljIGJhY2tlbmRzIHRvIG92ZXJyaWRlIHRoZQotCWJmZF9saW5rX2FkZF9zeW1ib2xzIHJvdXRpbmUuCi0KLQkqIGNvZmYtaDgzMDAuYzogSW5jbHVkZSBnZW5saW5rLmguCi0JKGhvd3RvX3RhYmxlKTogQWRkIFJfTUVNX0lORElSRUNULgotCShydHlwZTJob3d0byk6IFN1cHBvcnQgUl9NRU1fSU5ESVJFQ1QuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBIYW5kbGUgUl9NRU1fSU5ESVJFQ1QgbGlrZSBSX1JFTEJZVEUKLQlmb3Igbm93LgotCi1UdWUgTWFyIDEyIDEyOjQxOjE3IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGtvYWxhLmF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFVzZQotCWluZm8tPmNhbGxiYWNrc193YXJuaW5nLCByYXRoZXIgdGhhbiBfYmZkX2Vycm9yX2hhbmRsZXIsIGZvcgotCSJtdWx0aXBsZSBncCIgd2FybmluZy4KLQotVHVlIE1hciAxMiAxMjoxMDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbW92ZSBCRkRfQVNTRVJUIG9uIGhhc2gKLQl0YWJsZSBzdHJpbmcuICBVc2UgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IFJlbW92ZSBCRkRfQVNTRVJUIG9uIGhhc2gKLQl0YWJsZSBzdHJpbmcuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBoYXNoCi0JdGFibGUsIGlmIGFueSwgd2hlbiB3cml0aW5nIG91dCBzeW1ib2xzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBVc2UgdGhlIG5hbWUgZnJvbSB0aGUgaGFzaCB0YWJsZSwKLQlpZiBhbnksIHdoZW4gcmVwb3J0aW5nIHVuZGVmaW5lZCBzeW1ib2xzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBVc2UgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cC4KLQkqIGJvdXQuYyAoZ2V0X3ZhbHVlKTogTGlrZXdpc2UuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyk6IExpa2V3aXNlLgotCSh4Y29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX2Zkcl9pbik6IElmIEVDT0ZGXzY0LCB0dXJuIDB4ZmZmZmZmZmYKLQlpbnRvIC0xIGZvciBpbnRlcm4tPnJzcy4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi1Nb24gTWFyIDExIDEyOjI4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYi1zeW1zLmMgKF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKTogRGVmaW5lLgotCShiZmRfZ2V0X3N0YWJfbmFtZSk6IFJlbmFtZSBmcm9tIGFvdXRfc3RhYl9uYW1lLiAgUmV3cml0ZSB0byB1c2UgYQotCXN3aXRjaC4KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X3N0YWJfbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogQWRkIHN0YWItc3ltcy5vLgotCShCRkRfTElCU19DRklMRVMpOiBBZGQgc3RhYi1zeW1zLmMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIHN0YWItc3ltcy5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBSZW1vdmUgc3RhYi1zeW1zLmMuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGxpc3Qgc3RhYi1zeW1zLm8gaW4gYmZkX2JhY2tlbmRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbGliYW91dC5oIChhb3V0X3N0YWJfbmFtZSk6IERvbid0IGRlY2xhcmUuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKSk6IENhbGwgYmZkX2dldF9zdGFiX25hbWUsCi0Jbm90IGFvdXRfc3RhYl9uYW1lLgotCi1GcmkgTWFyICA4IDExOjI2OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBBZGp1c3QgZmlsZSBvZmZzZXQKLQlmb3Igc2VjdGlvbiBhbGlnbm1lbnQgZXZlbiBpZiBTRUNfTE9BRCBpcyBub3Qgc2V0LgotCi1UdWUgTWFyICA1IDEyOjAyOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgU0hMSUIgb3IgU0hMSU5LIHRvIGFuIGVtcHR5IHN0cmluZywKLQlzaW5jZSB0aGV5IGFwcGVhciBhcyB0YXJnZXRzIGluIE1ha2VmaWxlLmluLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBJZiBub3QgbWFraW5nIGEgc2hhcmVkIGxpYnJhcnksCi0JZG9uJ3QgZmlkZGxlIHdpdGggYSBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQgYW55d2hlcmUuCi0KLU1vbiBNYXIgIDQgMTI6NDk6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFyayk6IFRyZWF0IHVuZGVmaW5lZCBpbXBvcnRlZCBzeW1ib2xzIGFzCi0JdGhvdWdoIHRoZXkgYXJlIGRlZmluZWQgaW4gYSBzaGFyZWQgbGlicmFyeS4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IGxvb2sgYXQgdGhlIGxpbmUKLQludW1iZXJzIGZvciB0aGUgc2VjdGlvbiBpZiBzZWN0aW9uLT5saW5lbm8gaXMgTlVMTC4KLQotCSogZWxmLmMgKF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBQcmludCBhIHVzZWZ1bCBlcnJvcgotCW1lc3NhZ2UgcmF0aGVyIHRoYW4gY2FsbGluZyBCRkRfQVNTRVJULgotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sLgotCi1GcmkgTWFyICAxIDA5OjQyOjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG9uJ3Qgc2V0IFNFQ19MT0FEIGZsYWcKLQlmb3IgLnNic3Mgc2VjdGlvbi4KLQotV2VkIEZlYiAyOCAxMToyNTo0NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlKTogQWRkIFJfSFBQQV9OTFNFTAotCWFuZCBSX0hQUEFfTkxSU0VMLgotCShlX25zZWwsIGVfbmxzZWwsIGVfbmxyc2VsKTogVW5kZWZpbmUuICBBZGQgdG8KLQlocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0LgotCShocHBhX2ZpZWxkX2FkanVzdCk6IEhhbmRsZSBlX25sc2VsLCBlX25scnNlbC4gIEZpeCBlX25zZWwgaGFuZGxpbmcuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgTicsIE5MJyBOTFInIGZpZWxkCi0Jc2VsZWN0b3JzLgotCShzb21fd3JpdGVfZml4dXBzKTogRmluaXNoIGhhbmRsaW5nIG9mIFJfTjBTRUwgYW5kIFJfTjFTRUwuCi0KLVdlZCBGZWIgMjggMTE6MDA6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEFkanVzdCB0aGUgc2VnbWVudAotCW1lbW9yeSBzaXplIGZvciB0aGUgYWxpZ25tZW50IG9mIGEgU0VDX0FMTE9DIHNlY3Rpb24sIG5vdCBqdXN0IGEKLQlTRUNfTE9BRCBzZWN0aW9uLgotCi1UdWUgRmViIDI3IDE0OjE3OjMxIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrbGludXguYzogTmV3IGZpbGUuCi0JKiBob3N0cy9tNjhrbGludXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChtNjgqLSotbGludXhhb3V0KiwgbTY4Ki0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChtNjgqLSotbGludXgqKTogTmV3IG5hdGl2ZSBob3N0LgotCShtNjhrbGludXhfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAobTY4a2xpbnV4X3ZlYyk6IERlY2xhcmUuCi0JKiBpMzg2bGludXguYyAoYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBSZW5hbWVkIGZyb20KLQliZmRfbGludXhfc2l6ZV9keW5taWNfc2VjdGlvbnMgdG8gYXZvaWQgY2xhc2ggd2l0aCBtNjhrbGludXguYy4KLQkqIGJmZC1pbi5oIChiZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFJlbmFtZQotCWRlY2xhcmF0aW9uIGZyb20gYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQkoYmZkX202OGtsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBtNjhrbGludXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIG02OGtsaW51eC5jLgotCi1UdWUgRmViIDI3IDExOjMxOjM0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChwYV9hcmNoKTogQWRkIHBhMjAuCi0JKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSk6IEFkZCBSX0hQUEFfTlNFTC4KLQkoZV9uc2VsKTogVW5kZWZpbmUuICBBZGQgdG8gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdC4KLQkoaHBwYV9maWVsZF9hZGp1c3QpOiBIYW5kbGUgZV9uc2VsLgotCSogc29tLmM6IFByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgbWFueSBuZXcgcmVsb2NzIGZvdW5kIG9ubHkKLQlpbiBocHV4MTAgaW5jbHVkZSBmaWxlcy4KLQkoc29tX2ZpeHVwX2Zvcm1hdHMpOiBBZGQgc2V2ZXJhbCBuZXcgcmVsb2NzIGZyb20gaHB1eDEwLgotCShzb21faHBwYV9ob3d0b190YWJsZSk6IEFkZCBocHV4MTAgcmVsb2NzLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfTjBTRUwgYW5kIFJfTjFTRUwgaHB1eDEwIHJlbG9jcy4KLQotTW9uIEZlYiAyNiAxMjo1Mjo0OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgcmVjZW50IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQsIGFuZAotCXJ1bGVzIHRvIHJlYnVpbGQgLmggZmlsZXMgdXNpbmcgZG9jL2NoZXcuCi0KLU1vbiBGZWIgMjYgMTQ6NDg6MzkgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AQVpTdGFyTmV0LmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRqdXN0IHRoZSBmaWxlCi0Jc2l6ZSBldmVuIG9mIHNlY3Rpb25zIHdpdGggbm8gY29udGVudHMuCi0KLU1vbiBGZWIgMjYgMTQ6MDE6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBXaGVuIG1lcmdpbmcsIHNraXAgbmFtZXMKLQlzdGFydGluZyB3aXRoICckJyB0aGUgd2F5IHdlIHNraXAgbmFtZXMgc3RhcnRpbmcgd2l0aCAnLicuICBXaGVuCi0JdXBkYXRpbmcgeF9lbmRuZHgsIGRvbid0IGJlIGZvb2xlZCBieSBhbiBpbmRleCB3aGljaCBoYXMgYmVlbgotCW1lcmdlZC4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgdHJ5IHRvIG9wdGltaXplIGEKLQlzdHJ1Y3QvdW5pb24vZW51bSB0eXBlIHdpdGggbm8gZWxlbWVudHMuCi0KLVNhdCBGZWIgMjQgMTE6Mzg6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2Vycm1zZyk6IEhhbmRsZSBhIE5VTEwgcmV0dXJuIGZyb20gc3RyZXJyb3IuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSWYgdGhlIGZpcnN0IGZpbGUgaW4gdGhlCi0JYXJjaGl2ZSBjYW4gbm90IGJlIHJlY29nbml6ZWQgYXMgYW4gb2JqZWN0LCBkb24ndCBhc3N1bWUgdGhhdCB0aGlzCi0JaXMgdGhlIHdyb25nIGZvcm1hdC4KLQotCSogZWxmLmMgKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlCi0JZm9ybWF0IGlzIG5vdCBiZmRfb2JqZWN0LgotCShiZmRfZWxmX2dldF9kdF9zb25hbWUpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAyMSAxMzo1ODowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogQ29ycmVjdCByYW5nZSBvZiBSX1NIX1VTRVMKLQlyZWxvYy4KLQotVHVlIEZlYiAyMCAxNjoyMjo0NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jICh0ZGF0YSk6IEFkZCBuZXRic2RfY29yZV9kYXRhLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotVHVlIEZlYiAyMCAxNjo1MDowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKFNVTk9TX0NPTlNUUlVDVE9SKTogRGVmaW5lLgotCShzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGxldCBhIHN5bWJvbCBmcm9tIGEgZHluYW1pYyBvYmplY3QKLQlvdmVycmlkZSBhIGNvbnN0cnVjdG9yIHN5bWJvbC4gIFNldCBTVU5PU19DT05TVFJVQ1RPUiB3aGVuCi0JYXBwcm9wcmlhdGUuCi0KLQkqIGJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBVc2UgdWRhdGEuaSByYXRoZXIgdGhhbiBmbGFncwotCXRvIGdldCB0aGUgc3ltYm9sIGluZGV4LCBtYXRjaGluZyAxNCBKdWwgOTUgY2hhbmdlLgotCi1UdWUgRmViIDIwIDA4OjI2OjI3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JUmVtb3ZlIGR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mIGdwLgotCi1Nb24gRmViIDE5IDEyOjM3OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEb24ndAotCWFzc3VtZSB0aGF0IHdlIGNhbiBzZXQgdGhlIEdQIHZhbHVlIGFuZCB0aGVuIGdldCB0aGUgc2FtZSB2YWx1ZSwKLQlzaW5jZSBpdCB3b24ndCBiZSB0cnVlIGlmIHRoZSBvdXRwdXQgZmlsZSBpcyBuZWl0aGVyIEVMRiBub3IKLQlFQ09GRi4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2FkanVzdF9yZWxvY19pbik6IERvbid0IGJvdGhlciB0byB1c2UKLQlfYmZkX2dldF9ncF92YWx1ZSBoZXJlLgotCShtaXBzX2dwcmVsX3JlbG9jKTogRG9uJ3QgYXNzdW1lIHdlIGNhbiBzZXQgYW5kIGdldCB0aGUgR1AgdmFsdWUuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2hpMTZfcmVsb2MpOiBHZXQgZ3AgdmFsdWUgZnJvbQotCW1pcHNfZWxmX2ZpbmFsX2dwLgotCShtaXBzX2VsZl9sbzE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2ZpbmFsX2dwKTogQWRkIHBncCBwYXJhbWV0ZXIuICBTZXQgaXQgdG8gdGhlIEdQIHZhbHVlLgotCURvbid0IHJlcXVpcmUgdGhhdCB0aGUgQkZEIGJlIEVMRi4KLQkobWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IEdldCBncCB2YWx1ZSBmcm9tIG1pcHNfZWxmX2ZpbmFsX2dwLgotCShtaXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBhc3N1bWUgd2UgY2FuIHNldCBhbmQgZ2V0IHRoZQotCUdQIHZhbHVlLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEb24ndCBib3RoZXIgdG8gdXNlCi0JX2JmZF9nZXRfZ3BfdmFsdWUgaGVyZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlKTogSW5pdGlhbGl6ZSBzdi4KLQlEb24ndCBjaGFuZ2UgZXBkciBiZXR3ZWVuIG1hbGxvYyBhbmQgZnJlZS4gIEJlIGNhcmVmdWwgbm90IHRvIGZyZWUKLQlOVUxMIHBvaW50ZXJzLiAgWmVybyBvdXQgdGhlIGZpcnN0IFJQRFIuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBPbiBMaW51eCwgb25seSBwYXNzIC1ycGF0aCBvcHRpb24gaWYgJChsaWJkaXIpCi0JaXMgbmVpdGhlciAvbGliIG5vciAvdXNyL2xpYi4gIEZyb20gQWxhbiBNb2RyYQotCTxhbGFuQG11bGxldC5MZXZlbHMuVW5pU0EuRWR1LkF1Pi4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbmFtZSBkdF9uZWVkZWRfbmFtZSB0bwotCWR0X25hbWUuCi0JKGVsZl9kdF9uYW1lKTogUmVuYW1lIGZyb20gZWxmX2R0X25lZWRlZF9uYW1lLgotCSogZWxmLmMgKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogVXNlIGVsZl9kdF9uYW1lLCBub3QKLQllbGZfZHRfbmVlZGVkX25hbWUuCi0JKGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIGVsZl9kdF9uYW1lLCBub3QKLQllbGZfZHRfbmVlZGVkX25hbWUuICBTYXZlIHRoZSBTT05BTUUgYmFjayBpbiBlbGZfZHRfbmFtZS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmX2dldF9kdF9zb25hbWUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gRmViIDE5IDAyOjUwOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZWQgZnJvbQotCV9iZmRfc3BhcmNfZWxmX3JlbG9jX3R5cGVfbG9va3VwLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVXBkYXRlLgotCSogZWxmNjQtc3BhcmMuYyAoU1BBUkM2NF9PTERfUkVMT0NTKTogRGVmaW5lLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IERlZmluZS4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVmaW5lLgotCShzcGFyYzY0X2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogVXNlIHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlLgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBVcGRhdGUuCi0KLVN1biBGZWIgMTggMTU6MDI6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogQ2hlY2sgZm9yICdkbyBub3QgbWl4JyBmcm9tIG5hdGl2ZSBsaW5rZXIgYmVmb3JlCi0JdHJ5aW5nIHRvIHVzZSAtcnBhdGguCi0KLUZyaSBGZWIgMTYgMTI6NDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoX2JmZF9nZXRfZ3BfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfc2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KLQkoX2JmZF9zZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFVzZQotCV9iZmRfZ2V0X2dwX3ZhbHVlIGFuZCBfYmZkX3NldF9ncF92YWx1ZSByYXRoZXIgdGhhbiByZWZlcnJpbmcKLQlkaXJlY3RseSB0byB0aGUgZmllbGRzIGluIHRoZSB0ZGF0YSBpbmZvcm1hdGlvbi4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1taXBzLmMgKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKG1pcHNfZ3ByZWxfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2hpMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfbG8xNl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9maW5hbF9ncCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogYm91dC5jIChiX291dF9zZXRfYXJjaF9tYWNoKTogUmVjb2duaXplIGJmZF9tYWNoX2k5NjBfanguCi0KLVRodSBGZWIgMTUgMTE6Mjk6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQyBiZWZvcmUgY29uZmlndXJlLmhvc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogRG9uJ3Qgc2V0IGluZm9ybWF0aW9uIHdoaWNoIGF1dG9jb25mIHNob3VsZAotCWZpZ3VyZSBvdXQsIG5hbWVseSBDQywgQ0ZMQUdTLCBMREZMQUdTLCBBUiwgYW5kIFJBTkxJQi4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlbW92ZSBnbzMyIGFuZCB3aW4zMiBob3N0IGluZm9ybWF0aW9uLCBzaW5jZSBpdAotCXNob3VsZCBubyBsb25nZXIgYmUgbmVlZGVkLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogSWYgd2UgaGF2ZSBhIC5keW5hbWljIHNlY3Rpb24sCi0JdGhlbiBzdGFydCBhIG5ldyBzZWdtZW50IHJhdGhlciB0aGFuIHB1dCBhIHdyaXRhYmxlIHNlY3Rpb24gaW4gYQotCXJlYWRvbmx5IHNlZ21lbnQuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgUlBBVEhfRU5WVkFSLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZAotCXplcm9fc2VjdGlvbiB2YXJpYWJsZS4KLQotVGh1IEZlYiAxNSAxMDozOToxNyAxOTk2ICBILkouIEx1ICA8aGpsQHpvb20uY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChzcmNkaXIpL2JmZC1pbjIuaCk6IFJlbmFtZSB0YXJnZXQgZnJvbSBiZmQtaW4yLmguCi0JKCQoc3JjZGlyKS9saWJiZmQuaCk6IFJlbmFtZSBmcm9tIGxpYmJmZC5oLgotCSgkKHNyY2RpcikvbGliY29mZi5oKTogUmVuYW1lIGZyb20gbGliY29mZi5oLgotCi1XZWQgRmViIDE0IDE2OjI5OjA3IDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9leHByZXNzaW9uKTogT25seSB1c2UgYW4gUiB2YXJpYWJsZSBmb3IgYQotCWxvY2FsIHN5bWJvbC4gIERvbid0IG91dHB1dCBhIHplcm8gb2Zmc2V0LiAgSGFuZGxlIGEgemVybyBhZGRyZXNzLgotCShTUkNfTUFTSywgUENSRUxfT0ZGU0VUKTogRGVmaW5lIGJhc2VkIG9uIEtFRVBNSU5VU1BDSU5JTlNULgotCShyZWwzMl9ob3d0bywgcmVsMTZfaG93dG8sIHJlbDhfaG93dG8pOiBVc2UgU1JDX01BU0sgYW5kCi0JUENSRUxfT0ZGU0VULgotCShwYXJzZV9leHByZXNzaW9uKTogRG9uJ3QgdHJ5IHRvIGhhbmRsZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiBhCi0JUCB2YXJpYWJsZS4gIEhhbmRsZSBJIHZhcmlhYmxlcyBkaWZmZXJlbnRseSBmcm9tIFggdmFyaWFibGVzLiAgRml4Ci0JdGhlIG9yZGVyIG9mIG1pbnVzIGV4cHJlc3Npb25zLgotCShpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBHZW5lcmF0ZSBhbiBJIHZhcmlhYmxlIGZvciBhbiBOTgotCXJlY29yZC4gIEZpeCBoYW5kbGluZyBvZiBBVEkgYW5kIEFUWCByZWNvcmRzLgotCShpZWVlX3NsdXJwX3NlY3Rpb25zKTogT25seSBzZXQgbWluaW1hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuCi0JQWRqdXN0IHRoZW0gbGF0ZXIsIGJhc2VkIG9uIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotCShpZWVlX29iamVjdF9wKTogUmVhZCBpbiB0aGUgZmlsZSB1bnRpbCBqdXN0IGFmdGVyIHRoZSBNRSByZWNvcmQuCi0JQ2FsbCBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSB0byBzZXQgdGhlIHNlY3Rpb24gZmxhZ3MuCi0JKGRvX29uZSk6IEFkZCBpdGVyYXRpb25zIHBhcmFtZXRlci4gIE9ubHkgcmVwZWF0IHRoZSBmaXJzdCBsb2FkCi0JaXRlbS4gIFNldCB0aGUgc2VjdGlvbiBhbmQgZmlsZSByZWxvYyBmbGFncy4KLQkoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBTZXQgc2VjdGlvbiBmbGFncy4gIFBhc3MgaXRlcmF0aW9ucyB0bwotCWRvX29uZS4KLQkoaWVlZV9jYW5vbmljYWxpemVfcmVsb2MpOiBIYW5kbGUgSSB2YXJpYWJsZXMuCi0JKGRvX3dpdGhfcmVsb2NzKTogT25seSBlbWl0IHJlbG9jYXRpb24gc2l6ZSB3aGVuIG5lY2Vzc2FyeS4KLQlJbmNyZWFzZSBNQVhSVU4gdG8gMTI3LiAgQ2hhbmdlIG92IHRvIGJlIGFzc2lnbmVkLCBhbmQgdGFrZQotCXNyY19tYXNrIGFuZCBwY3JlbF9vZmZzZXQgaW50byBhY2NvdW50LgotCShpZWVlX3dyaXRlX2RhdGFfcGFydCk6IFNraXAgc2VjdGlvbnMgdGhhdCBhcmUgbm90IGxvYWRlZC4KLQkoaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0KTogRG9uJ3Qgb3V0cHV0IG9wdGlvbmFsIGxhc3QgZW50cnkgb2YgV1gKLQlyZWNvcmRzLgotCShpZWVlX3dyaXRlX21lX3BhcnQpOiBNYWtlIHNldHRpbmcgb2YgbWVfcmVjb3JkIG5lYXRlci4KLQkoaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBHZXQgdGhlIHNpemUgb2YgYW4gYXJjaGl2ZSBlbGVtZW50LgotCi0JKiBzeW1zLmMgKHN0dCk6IEFkZCBlbnRyaWVzIGZvciB6ZXJvdmFycywgdmFycywgYW5kIGNvZGUuCi0KLQkqIGVsZmNvZGUuaCAodmFsaWRhdGVfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh3cml0ZV9yZWxvY3MpOiBDYWxsIHZhbGlkYXRlX3JlbG9jIGZvciBub24gRUxGIHJlbG9jcy4KLQotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShUQVJHRVRfQklHX1NZTSk6IFVzZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhci4KLQkoVEFSR0VUX0xJVFRMRV9TWU0pOiBMaWtld2lzZS4KLQotCSogY29uZmlnLmJmZCAobTY4Ki0qLXBzb3MqKTogTmV3IHRhcmdldC4KLQotVHVlIEZlYiAxMyAxNTo1NjoyMiAxOTk2ICBCcnlhbiBGb3JkICA8YmFmb3JkQHNuYWtlLmNzLnV0YWguZWR1PgotCi0JKiBpMzg2bXNkb3MuYzogUmVtb3ZlIHNvbWUgI2lmIDAgY29kZS4KLQkobXNkb3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgaW5jbHVkZSBlbXB0eSBzZWN0aW9ucyBpbiB0aGUKLQlzaXplIGNvbXB1dGF0aW9uLCByZWdhcmRsZXNzIG9mIHRoZWlyIGFkZHJlc3MuCi0KLVR1ZSBGZWIgMTMgMTU6MzY6MzcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3Qgc2VnZmF1bHQgaWYgZHluYm9qCi0JaXMgTlVMTCwgaWUsIHRoZSAtciBzd2l0Y2ggaXMgdXNlZC4KLQotVHVlIEZlYiAxMyAxNDozNToxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTogRGVmaW5lLgotCShCRkRfUkVMT0NfTUlQU19HT1RfTE8xNik6IERlZmluZS4KLQkoQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogZWxmMzItbWlwcy5jIChtaXBzX3JlbG9jX21hcCk6IE1hcCBuZXcgcmVsb2NzLgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhETEZMQUdTIGZvciAqLSotaHB1eCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KLQotCSogTWFrZWZpbGUuaW4gKCQoU0hMSU5LKSk6IENoZWNrIHRzIGFnYWluc3QgJChTSExJQiksIG5vdAotCSQoU0hMSU5LKS4KLQotCSogaWVlZS5jIChnZXRfc3ltYm9sKTogU2V0IHRoZSBzZWN0aW9uIHRvIGJmZF9hYnNfc2VjdGlvbi4KLQkoZG9fd2l0aF9yZWxvY3MpOiBJZiBFWEVDX1AgaXMgc2V0IGFuZCB0aGVyZSBhcmUgbm8gcmVsb2NzLCB1c2UgYQotCXNpbXBsZSBudW1iZXIgZm9yIHRoZSBzZWN0aW9uIGFkZHJlc3MsIHJhdGhlciB0aGFuIGFuIGV4cHJlc3Npb24uCi0JTGltaXQgdGhlIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIHJlbG9jcyB0byBNQVhSVU4uCi0JKGllZWVfd3JpdGVfbWVfcGFydCk6IFNldCBtZV9yZWNvcmQgdG8gdGhlIGZpbGUgb2Zmc2V0IGFmdGVyIHRoZQotCXN0YXJ0IGFkZHJlc3MuCi0JKGllZWVfd3JpdGVfcHJvY2Vzc29yKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgaWVlZV93cml0ZV9wcm9jZXNzb3IuCi0KLUZyaSBGZWIgIDkgMTA6NTM6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlICR7Q0MtZ2NjfSB3aGVuIHRlc3RpbmcgZm9yIC1ycGF0aCBvbiBTdW5PUy4KLQotCSogY29mZi1hdXguYzogQ2hhbmdlIGluY2x1ZGUgb2YgYXV4LmggdG8gYXV4LWNvZmYuaC4KLQotVGh1IEZlYiAgOCAxNDowMTowMyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIGEgUl82OEtfUkVMQVRJVkUKLQlyZWxvY2F0aW9uIHB1dCB0aGUgYWRkZW5kIGJvdGggaW4gdGhlIHJlbG9jIGVudHJ5IGFuZCB0aGUgZGF0YS4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuICBNYXNrIG91dCBtYXJrZXIgaW4KLQlHT1Qgb2Zmc2V0IHZhbHVlLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCByZXNvbHZlCi0JYSBSXzY4S19QQ3h4IHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIGdsb2JhbCBzeW1ib2wgZGlyZWN0bHkuCi0JKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IERvbid0IGNvdW50IHN1Y2ggYSByZWxvYy4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MpOiBEb24ndCByZWNvcmQgYSBzeW1ib2wgd2l0aAotCWEgUExUeHggcmVsb2MgYXMgZHluYW1pYy4gIERpc2FsbG93IFBMVHh4TyByZWxvYyBhZ2FpbnN0IGEgbG9jYWwKLQlzeW1ib2wgZm9yIG5vdywgb3RoZXJ3aXNlIGFsd2F5cyByZWNvcmQgdGhlIHN5bWJvbCBhcyBkeW5hbWljLgotCShlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCB3aXRoIGEgUExUeHggcmVsb2MKLQlpcyBub3QgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgYXJlIG5vdCBtYWtpbmcgYQotCXNoYXJlZCBvYmplY3QsIHRoZW4gZG9uJ3QgbWFrZSBhIFBMVCBlbnRyeS4gIElmIHdlIGRvIG1ha2UgYSBQTFQKLQllbnRyeSwgbWFrZSBzdXJlIHRoZSBzeW1ib2wgaGFzIGJlZW4gcmVjb3JkZWQgYXMgZHluYW1pYy4KLQotV2VkIEZlYiAgNyAxMzo1NjowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBXaGVuIG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5LCBzZXQgSExERkxBR1MgdG8KLQlwYXNzIGFuIGFwcHJvcHJpYXRlIC1ycGF0aCBvcHRpb24uICBVc2UgdGhlIG1ha2UgdmFyaWFibGUgU09OQU1FCi0JYXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHNvbmFtZSwgcmF0aGVyIHRoYW4gY29tcHV0aW5nIGl0IGhlcmUuICBPbgotCVN1bk9TLCBidWlsZCBzdGFtcC10c2hsaW5rIGluIHBsYWNlIG9mICQoU0hMSU5LKS4KLQkqIE1ha2VmaWxlLmluIChTT05BTUUpOiBOZXcgdmFyaWFibGUuCi0JKCQoU0hMSU5LKSk6IE1ha2UgYSBsaW5rIHRvIHRoZSB0cmFuc2Zvcm1lZCBuYW1lLCBhcyB3ZWxsLgotCShzdGFtcC10c2hsaW5rKTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IFNraXAgc3RhbXAtdHNobGluayBkdXJpbmcgaW5zdGFsbC4KLQotV2VkIEZlYiAgNyAxMzozNzozOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IERvIG5vdCBhc3N1bWUgdGhhdCB0aGUKLQlsaW5rZXIgc2VjdGlvbnMgaGF2ZSBiZWVuIHNldCB1cCB5ZXQuCi0KLQkqIGVsZi5jIChtYWtlX21hcHBpbmcpOiBBZGQgYW4gYWRkaXRpb25hbCBhcmd1bWVudCB0byBzdXBwcmVzcwotCW1ha2luZyB0aGUgZmlyc3Qgc2VjdGlvbiBpbmNsdWRlIHRoZSBwcm9ncmFtIGhlYWRlcnMuCi0JKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IElmIHRoZSB1c2VyIHVzZWQgLVR0ZXh0IHN1Y2ggdGhhdCB0aGUKLQlwcm9ncmFtIGhlYWRlcnMgYXJlIG9uIGEgZGlmZmVyZW50IHBhZ2UsIGRvIG5vdCBzZXQgdGhlIGZsYWdzCi0Jc2F5aW5nIHRoYXQgdGhpcyBzZWN0aW9uIGluY2x1ZGVzIHRoZSBwcm9ncmFtIGhlYWRlcnMuCi0KLVR1ZSBGZWIgIDYgMTQ6MDQ6NDkgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXRic2QqKTogU2V0IENPUkVGSUxFIHRvIG5ldGJzZC1jb3JlLmMuCi0JZG9uJ3QgZGVmaW5lIFRSQURfSEVBREVSLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBuZXRic2QtY29yZS5jOiBOZXcgZmlsZSwgc3VwcG9ydCBmb3IgTmV0QlNEIGNvcmUgZmlsZXMuCi0JKiBob3N0cy8qbmJzZC5oOiBSZW1vdmVkLgotCi1UdWUgRmViICA2IDExOjQ3OjQ5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfU1BBUkNfWzU2N10pOiBOZXcgcmVsb2MgdHlwZXMuCi0JKEJGRF9SRUxPQ19TUEFSQ19MTzcgcmVsb2MgdHlwZSk6IERlbGV0ZWQuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lZCBmcm9tCi0JYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cC4KLQkocmVsb2NfdHlwZXssX25hbWVzfSk6IERlbGV0ZWQuCi0JKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUmVuYW1lZCBmcm9tIGVsZl9zcGFyY19ob3d0b190YWJsZS4KLQlBZGQgc3BhcmM2NCByZWxvY3MuCi0JKHNwYXJjX3JlbG9jX21hcCk6IEFkZCBzcGFyYzY0IHJlbG9jcy4KLQkoc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSGFuZGxlIFJfU1BBUkNfV0RJU1B7MTYsMTl9LgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl93ZGlzcDE2X3JlbG9jKTogRGVsZXRlZC4KLQkocmVsb2NfdHlwZXssX25hbWVzfSk6IERlbGV0ZWQuCi0JKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IERlbGV0ZWQuCi0JKHNwYXJjX3JlbG9jX21hcCk6IERlbGV0ZWQuCi0JKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUmVuYW1lZCBmcm9tIGVsZl9zcGFyY19ob3d0b190YWJsZS4KLQkoYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IENoYW5nZSBmcm9tIGZ1bmN0aW9uIHRvICNkZWZpbmUuCi0KLVR1ZSBGZWIgIDYgMTI6MTI6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogTWFrZSBTSExJQl9DRkxBR1MgaW5jbHVkZSAkKFBJQ0ZMQUcpIG9uIGEKLQkqLSotaHB1eCogaG9zdC4KLQotCSogTWFrZWZpbGUuaW4gKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpOiBOZXcgdmFyaWFibGUuCi0JKGluc3RhbGwpOiBUcmFuc2Zvcm0gbGlicmFyeSBuYW1lIGJlZm9yZSBpbnN0YWxsaW5nIGl0LgotCi1Nb24gRmViICA1IDEwOjM4OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfaTk2MF9oeCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNwdS1pOTYwLmMgKHNjYW5fOTYwX21hY2gpOiBBY2NlcHQgbWFjaGluZSAiaHgiLgotCShNQVRSSVgpOiBFeHBhbmQgZW50cmllcyBmb3IgSFguCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgaTk2MDpoeCBlbnRyeS4KLQkqIGJvdXQuYyAoYl9vdXRfc2V0X2FyY2hfbWFjaCk6IEhhbmRsZSBiZmRfbWFjaF9pOTYwX2h4LgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBIYW5kbGUgRl9JOTYwSFguCi0JKGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlIGJmZF9tYWNoX2k5NjBfaHguCi0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBiYXNlZCBvbiBwYXRjaGVzIGZyb20KLQlBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfRU5BQkxFIGZvciBzaGFyZWQgYW5kIGNvbW1vbmJmZGxpYi4KLQlOZXcgc3Vic3RpdHV0aW9uczogQUxMTElCUywgUElDRkxBRywgU0hMSUIsIFNITElCX0NDLAotCVNITElCX0NGTEFHUywgQ09NTU9OX1NITElCLCBQSUNMSVNULCBTSExJTksuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogSWYgLS1lbmFibGUtc2hhcmVkLCBhZGp1c3Qgc2hhcmVkIGxpYnJhcnkgc3R1ZmYKLQliYXNlZCBvbiB0aGUgaG9zdC4gIElmIHRoZSBob3N0IGlzIFN1bk9TLCBhbmQgdGhlIGxpbmtlciBzdXBwb3J0cwotCS1ycGF0aCwgc2V0IEhMREZMQUdTIHRvIHVzZSBpdC4KLQkqIE1ha2VmaWxlLmluIChBTExMSUJTKTogTmV3IHZhcmlhYmxlLgotCShQSUNGTEFHLCBTSExJQiwgU0hMSUJfQ0MsIFNITElCX0NGTEFHUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENPTU1PTl9TSExJQiwgU0hMSU5LKTogTmV3IHZhcmlhYmxlcy4KLQkoLmMubyk6IElmIFBJQ0ZMQUcgaXMgc2V0LCBjb21waWxlIHR3aWNlLCBvbmNlIFBJQywgb25jZSBub3JtYWwuCi0JKFNUQUdFU1RVRkYpOiBSZW1vdmUgdmFyaWFibGUuCi0JKGFsbCk6IERlcGVuZCB1cG9uICQoQUxMTElCUykgYW5kIEBQSUNMSVNUQCByYXRoZXIgdGhhbgotCSQoVEFSR0VUTElCKS4KLQkoc3RhbXAtb2ZpbGVzKTogTmV3IHRhcmdldCwgbGlrZSBvbGQgb2ZpbGVzIHRhcmdldCwgYnV0IGJ1aWxkCi0JdXNpbmcgYSB0ZW1wb3JhcnkgZmlsZSBhbmQgbW92ZS1pZi1jaGFuZ2UsIGFuZCB0b3VjaCBzdGFtcC1vZmlsZXMKLQl3aGVuIGRvbmUuCi0JKG9maWxlcyk6IEp1c3QgZGVwZW5kIHVwb24gc3RhbXAtb2ZpbGVzLgotCShzdGFtcC1waWNsaXN0LCBwaWNsaXN0KTogTmV3IHRhcmdldHMuCi0JKCQoU0hMSUIpLCAkKFNITElOSykpOiBOZXcgdGFyZ2V0cy4KLQkodGFyZ2V0cy5vLCBhcmNodXJlcy5vKTogQnVpbGQgdHdpY2UgaWYgUElDRkxBRyBpcyBzZXQuCi0JKGRvX21vc3RseWNsZWFuKTogUmVtb3ZlIHBpYy8qLm8uCi0JKGRvX2NsZWFuKTogUmVtb3ZlIHN0YW1wLW9maWxlcywgJChTSExJQiksICQoU0hMSU5LKSwgcGljbGlzdCwgYW5kCi0Jc3RhbXAtcGljbGlzdC4KLQkoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIHBpYyBhbmQgc3RhbXAtcGljZGlyLgotCShpbnN0YWxsKTogSW5zdGFsbCBzaGFyZWQgbGlicmFyaWVzLgotCSgkKE9GSUxFUykpOiBEZXBlbmQgdXBvbiBzdGFtcC1waWNkaXIuCi0JKHN0YW1wLXBpY2Rpcik6IE5ldyB0YXJnZXQuCi0KLQkqIGxpYmNvZmYtaW4uaDogQWRkIGNvbW1lbnQgcmVtaW5kaW5nIHBlb3BsZSB0aGF0IGxpYmNvZmYuaCBpcyBhCi0JZ2VuZXJhdGVkIGZpbGUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IHRyeSB0byBnZXQgdGhlCi0JZmxhdm91ciBvZiBhIHNlY3Rpb24gd2l0aCBubyBvd25lci4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENsZWFyCi0JRUxGX0xJTktfTk9OX0VMRiBmbGFnLgotCShtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogZWxmLmM6IFJldmVydCBsYXN0IGNoYW5nZSwgc2luY2UgaXQgYnJlYWtzIGR5bmFtaWMgbGlua2luZy4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgd2FudF9oZHJfaW5fc2VnCi0JZmllbGQuCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9iYWNrZW5kX3dhbnRfaGRyX2luX3NlZyk6IERvbid0IGRlZmluZS4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF93YW50X2hkcl9pbl9zZWcpOiBEb24ndCBkZWZpbmUuCi0JKGVsZk5OX2JlZCk6IERvbid0IGluaXRpYWxpemUgd2FudF9oZHJfaW5fc2VnIGZpZWxkLgotCi1TdW4gRmViICA0IDIwOjQ1OjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJZiB0aGUgYmFja2VuZCBkb2VzCi0Jbm90IHdhbnQgdGhlIGVsZiBoZWFkZXIgb3IgdGhlIHByb2dyYW0gaGVhZGVycyBpbiB0aGUgYWRkcmVzcwotCXNwYWNlLCBkbyBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWxjdWxhdGlvbnMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogTmV3IGhvb2sKLQlmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCBhZGRpdGlvbmFsIHByb2dyYW0gaGVhZGVycy4KLQkocHBjX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBEZWZpbmUgYXMgYSBOT1AgZnVuY3Rpb24gZm9yIG5vdy4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiAuc2RhdGEyIGlzIGEgcmVhZC1vbmx5IHNlY3Rpb24uCi0KLVNhdCBGZWIgIDMgMjM6MDA6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oOiBNb3ZlIHRvZGF5J3MgbGliY29mZi5oIGNoYW5nZSBpbnRvIGNvZmZjb2RlLmguCi0KLVNhdCBGZWIgIDMgMTU6NDM6NDQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYuaCAoYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCk6IENvbWJpbmUgbWFjcm8gYXJncwotCWJhY2sgaW50byBvbmUgbGluZS4gIFNvbWUgY29tcGlsZXJzIChzdW5vcyA0LjEuMyBmb3IgZXhhbXBsZSkKLQl3b24ndCBhY2NlcHQgYXJncyBzcGxpdCBhY3Jvc3MgbW9yZSB0aGFuIG9uZSBsaW5lLgotCi1GcmkgRmViICAyIDExOjQyOjE1IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEJGRF9CSU5BUllfRk9QRU4pOiBVbmRlcnN0YW5kIGN5Z3dpbjMyLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1GcmkgRmViICAyIDEyOjEyOjE2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBEb24ndAotCXRyeSB0byBkbyBhcml0aG1ldGljIG9uIGEgdm9pZCAqLCBjYXN0IGl0IHRvIGEgdW5zaWduZWQgY2hhciAqIGZpcnN0LgotCi1UaHUgRmViICAxIDE2OjA0OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChFTEZfTElOS19OT05fRUxGKTogRGVmaW5lLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogU2V0IGVsZl9saW5rX2hhc2hfZmxhZ3MgdG8KLQlFTEZfTElOS19OT05fRUxGLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBSZXNldCBFTEZfTElOS19OT05fRUxGCi0JZmxhZyBmb3IgYSBuZXdseSBkZWZpbmVkIHN5bWJvbC4KLQkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogTGlrZXdpc2UuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBFTEZfTElOS19OT05fRUxGIGlzIHNldCwgdHJ5IHRvCi0Jc2V0IHRoZSBERUYgb3IgUkVGX1JFR1VMQVIgZmxhZ3MgY29ycmVjdGx5LgotCi0JKiBNYWtlZmlsZS5pbiAoYmZkLWluMi5oKTogTWFrZSBiZmQuaCwgbm90IHByb3RvcywgaW4gZG9jZGlyLgotCShsaWJiZmQuaCwgbGliY29mZi5oKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgcmVjb3JkIGEgc3ltYm9sIHdpdGgKLQlhIFBMVDMyIHJlbG9jIGFzIGR5bmFtaWMuCi0JKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIHdpdGggYSBQTFQzMiByZWxvYwotCWlzIG5vdCByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSBhcmUgbm90IG1ha2luZyBhCi0Jc2hhcmVkIG9iamVjdCwgdGhlbiBkb24ndCBtYWtlIGEgUExUIGVudHJ5LiAgSWYgd2UgZG8gbWFrZSBhIFBMVAotCWVudHJ5LCBtYWtlIHN1cmUgdGhlIHN5bWJvbCBoYXMgYmVlbiByZWNvcmRlZCBhcyBkeW5hbWljLgotCi1XZWQgSmFuIDMxIDE3OjIzOjMyIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgQkZEX1JFTE9DXzMyX1BDUkVMLgotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi13aW4zMik6IEJlY29tZXMgaVszNDVdODYtKi1jeWd3aW4zMi4KLQkocG93ZXJwY2xlLSotY3lnd2luMzIpOiBOZXcuCi0JKiBwZWljb2RlLmggKGFkZF9kYXRhX2VudHJ5KTogR2V0IGFkZHJlc3MgZnJvbSB2bWEuCi0KLVdlZCBKYW4gMzEgMTY6MjM6NTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IElmIHRoZSBzeW1ib2wKLQlhdHRhY2hlZCB0byB0aGUgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYXMgYW4gdW5kZWZpbmVkCi0Jc3ltYm9sLCB0cmVhdCBpdCBhcyBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC4KLQotV2VkIEphbiAzMSAxNjoxNjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgb3V0cHV0IGluaXRpYWwgZHVtbXkKLQlzeW1ib2wgb3Igc2VjdGlvbiBzeW1ib2xzIGlmIHN0cmlwcGluZyBhbGwgc3ltYm9scyBhbmQgdGhpcyBpcyBub3QKLQlhIHJlbG9jYXRlYWJsZSBsaW5rLiAgRG9uJ3Qgb3V0cHV0IHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlIGlmCi0JdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0JKGVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlcmUgYXJlIG5vCi0Jc3ltYm9scyB0byBmbHVzaC4KLQotV2VkIEphbiAzMSAxMjo1NTo0OSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29mZi1hdXguYzogTmV3IGZpbGUuCi0JKiBob3N0cy9tNjhrYXV4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZCAobTY4Ki1hcHBsZS1hdXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki1hcHBsZS1hdXgqKTogTmV3IG5hdGl2ZSBob3N0LgotCShtNjhrYXV4X2NvZmZfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAobTY4a2F1eF9jb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGQKLQlfYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCk6IERlZmluZS4KLQkoY29tcGFyZV9hcmVsZW50X3B0cik6IE5ldyBzdGF0aWMgZnVuY3Rpb24gaWYgVEFSR19BVVguCi0JKGNvZmZfd3JpdGVfcmVsb2NzKTogSWYgVEFSR19BVVgsIHNvcnQgdGhlIHJlbG9jcy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgQS9VWCBhb3V0aGRyIG1hZ2ljIG51bWJlci4KLQkoY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ2FsbAotCWJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgcmF0aGVyIHRoYW4KLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkqIGNvZmYtbTY4ay5jIChDT0ZGX1BBR0VfU0laRSk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtYXV4Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBjb2ZmLWF1eC5jLgotCi1XZWQgSmFuIDMxIDExOjM3OjQ2IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggUl82OEtfR09UKgotCXJlbG9jYXRpb247IGlnbm9yZSBhZGRlbmQgd2l0aCBSXzY4S197R09ULFBMVH0qTyByZWxvY2F0aW9uLgotCi1UdWUgSmFuIDMwIDEyOjA5OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvX21haW50YWluZXJfY2xlYW4pOiBSZW1vdmUgJChzcmNkaXIpL2JmZC1pbjIuaCwKLQkkKHNyY2RpcikvbGliYmZkLmggYW5kICQoc3JjZGlyKS9saWJjb2ZmLmguCi0JKG1haW50YWluZXItY2xlYW4pOiBXYXJuIGFib3V0IGRlbGV0aW5nIHNwZWNpYWwgZmlsZXMuCi0JKGJmZC1pbjIuaCwgbGliYmZkLmgsIGxpYmNvZmYuaCk6IE5ldyB0YXJnZXRzLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBpbmRpcmVjdCBhbmQKLQl3YXJuaW5nIHN5bWJvbHMgY29ycmVjdGx5LgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRkIGNhc3RzIHRvIGF2b2lkCi0Jd2FybmluZ3MuCi0KLU1vbiBKYW4gMjkgMTQ6Mjc6MjQgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaDogYWxpZ25lZCBuZXdseSBleHBvcnRlZCBuYW1lcyB3aXRoIGJmZCBuYW1pbmcKLQljb252ZW50aW9ucy4gUmVtb3ZlZCBhbiBlcnJvbmVvdXMgZGVmaW5lIG9mIFBPV0VSUENfTEVfUEUuCi0gCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmxpbmsuYywgY29mZi1wcGMuYzogdGhlIGFib3ZlIGZ1bmN0aW9uIG5hbWUgY2hhbmdlcwotCi1Nb24gSmFuIDI5IDEzOjA2OjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQmFzaW0gS2FkaGltIDxrYWRoaW1Ac3BvY2suY3MuY29sb3JhZG8uZWR1PjoKLQkqIGVjb2ZmLmMgKHN0cnVjdCBleHRzeW1faW5mbyk6IERlZmluZS4KLQkoX2JmZF9lY29mZl9iZmRfZmluYWxfbGluayk6IFBhc3MgYSBwb2ludGVyIHRvIHN0cnVjdCBleHRzeW1faW5mbwotCXRvIGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBBY2NlcHQgYSBzdHJ1Y3QgZXh0c3ltX2luZm8gcG9pbnRlci4KLQlTdHJpcCBzeW1ib2xzIHdoZW4gYXBwcm9wcmlhdGUuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPjoKLQkqIHN5bXMuYyAoQlNGX09CSkVDVCk6IERlZmluZS4KLQkoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IFByaW50ICdPJyBmb3IgQlNGX09CSkVDVC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBCU0ZfT0JKRUNUIGZvciBhbgotCVNUVF9PQkpFQ1Qgc3ltYm9sLgotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiBPbmx5IHNldCB0eXBlIHRvIFNUVF9PQkpFQ1QgaWYgQlNGX09CSkVDVAotCWlzIHNldC4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgd2hlbgotCWNvcHlpbmcgcmVsb2NzIGludG8gYSBzaGFyZWQgb2JqZWN0LCB0cmVhdCBhIGRlZmluZWQgZ2xvYmFsIHN5bWJvbAotCWFzIGEgbG9jYWwgc3ltYm9sLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IHNldCB3ZWFrZGVmIHRvIGEKLQlyZWFsIGRlZmluZWQgc3ltYm9sLCBub3QgdG8gYSB3ZWFrIGRlZmluZWQgc3ltYm9sLgotCi1Nb24gSmFuIDI5IDExOjM0OjM2IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jOiByZW1vdmVkIHRoZSBQT1dFUlBDX0xFX1BFIGhhY2ssIHByb21vdGVkIHNvbWUgdHlwZXMKLQlhbmQgbWFkZSBhIGZldyBzdGF0aWMgZnVuY3Rpb25zIGV4dGVybnMuCi0KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogbmV3IGZ1bmN0aW9uLCByZXBsYWNlcyB0aGUKLQlQT1dFUlBDX0xFX1BFIGhhY2sgaW4gY29mZmxpbmsuCi0KLQkqIGxpYmNvZmYtaW4uaDogcHJvbW90ZWQgdGhlIGZvbGxvd2luZyBmcm9tIGNvZmZsaW5rLmMgdG8gYWxsb3cKLQlfYmZkX2NvZmZfZmluYWxfbGluayB0byBiZSBvdmVycmlkZGVuIC0gIFNUUklOR19TSVpFX1NJWkUsCi0JY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50LCBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlLAotCWNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSwgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlLAotCWNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0LCAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUsCi0JY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2xvb2t1cCwgY29mZl9saW5rX3NlY3Rpb25faW5mbywKLQljb2ZmX2ZpbmFsX2xpbmtfaW5mbywgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMsCi0JY29mZl93cml0ZV9nbG9iYWxfc3ltLCBjb2ZmX2xpbmtfaW5wdXRfYmZkLCBjb2ZmX3JlbG9jX2xpbmtfb3JkZXIuCi0KLQkqIGxpYmNvZmYuaDogcmUtZ2VuJ2QKLQotRnJpIEphbiAyNiAxODozMzozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYzogSW5jbHVkZSAiYmZkbGluay5oIi4KLQkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogRGVmaW5lLgotCShfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbGluZV9pbmZvIGZpZWxkLgotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogVHJ5IGNhbGxpbmcKLQlfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSBiZWZvcmUgc2VhcmNoaW5nIHRoZSBFTEYKLQlzeW1ib2wgdGFibGUuICBGaW5kIHRoZSBjbG9zZXN0IFNUVF9GVU5DIHN5bWJvbCwgbm90IHRoZSBsYXN0IG9uZS4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9kYXRhX3R5cGUpOiBBZGQgbGluZV9pbmZvIGZpZWxkLgotIAkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFRyeSBjYWxsaW5nCi0JX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgYmVmb3JlIHNlYXJjaGluZyB0aGUgQ09GRgotCXN5bWJvbCB0YWJsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotRnJpIEphbiAyNiAxNjoxMToxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChSX1BQQ19FTUJfU0RBMjEgcmVsb2NhdGlvbnMpOiBNYWtlIHJlbG9jYXRpb24gc2l6ZQotCTQgYnl0ZXMsIHNvIHdlIGdldCB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIHVwZGF0aW5nIHRoZSByZWdpc3RlcgotCWZpZWxkIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KLQotVGh1IEphbiAyNSAxMjoxNDoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogUmVtb3ZlIHRvY19zZWN0aW9uIGFuZAotCWVudHJ5X3NlY3Rpb24gZmllbGRzLiAgQWRkIHNudG9jIGFuZCBzbmVudHJ5IGZpZWxkcy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgc250b2MgYW5kIHNuZW50cnksCi0Jbm90IHRvY19zZWN0aW9uIGFuZCBlbnRyeV9zZWN0aW9uICh0aGUgQ09GRiBmaWxlIGRvZXMgbm90IGhhdmUgYW55Ci0Jc2VjdGlvbnMgYXQgdGhpcyBwb2ludCkuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IG9fc25lbnRyeSBhbmQgb19zbnRvYyBmcm9tCi0Jc25lbnRyeSBhbmQgc250b2MgcmF0aGVyIHRoYW4gZW50cnlfc2VjdGlvbiBhbmQgdG9jX3NlY3Rpb24uCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IHNudG9jIGFuZAotCXNuZW50cnksIG5vdCB0b2Nfc2VjdGlvbiBhbmQgZW50cnlfc2VjdGlvbi4KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3Qgc2V0Ci0JZW50cnlfc2VjdGlvbiBmcm9tIGhlbnRyeS4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBJZiBhIGRlZmluZWQgc3ltYm9sIGhhcyBYQ09GRl9FTlRSWSBzZXQsCi0Jc2V0IHNuZW50eS4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBTZXQgc250b2MsIG5vdCB0b2Nfc2VjdGlvbi4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IEdldCB0b2Nfc2VjdGlvbiBmcm9tIHNudG9jLCByYXRoZXIKLQl0aGFuIHVzaW5nIHRvY19zZWN0aW9uIGRpcmVjdGx5LgotCi0JKiBhcmNodXJlcy5jOiBBZGQgbWlzc2luZyBgLicgaW4gZW51bSBiZmRfYXJjaGl0ZWN0dXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLXNjbyplbGYqKTogVXNlIGJmZF9lbGYzMl9pMzg2X3ZlYy4gIEZyb20KLQlSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgotCi1UaHUgSmFuIDI1IDEyOjA4OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIC5yZWxhLnNkYXRheywyfQotCXRvIHNlY3Rpb25zIHdlIGFsbG9jYXRlLiAgVXNlIGJmZF96YWxsb2MgdG8gYWxsb2NhdGUgaW5pdGlhbGlhbAotCXNlY3Rpb25zLCBub3QgYmZkX2FsbG9jLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlbW92ZSBCRkRfQVNTRVJUcyBmb3IgIXNoYXJlZCBmcm9tCi0JU0RBeywyfUkxNiByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBVc2UgdGhlIHZhbHVlIG9mIC1HIG5uIHRvIGRldGVybWluZQotCXdoZXRoZXIgdG8gcHV0IHNvbWV0aGluZyBpbiAuc2JzcyBvciBub3QuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBzdXBwb3J0IGZvciBtb3JlIHJlbG9jYXRpb25zLiAgQWRkCi0JaW4gc2VjLT5vdXRwdXRfb2Zmc2V0IHdoZXJlIGFwcHJvcHJpYXRlLiAgTWFrZSBlcnJvciBtZXNzYWdlcwotCWluY2x1ZGUgdGhlIHN5bWJvbCBuYW1lLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IExvb2t1cCBzeW1ib2wgYmVmb3JlCi0JdHJ5aW5nIHRvIGFkZCBpdCB0byB0aGUgc3ltYm9sIHRhYmxlLCBzbyBfR0xPQkFMX09GRlNFVF9UQUJMRV8KLQlkb2Vzbid0IGdldCByZWRlZmluZWQgbWVzc2FnZXMgaWYgLXNoYXJlZC4KLQotCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pIE9ubHkgYnVtcCBSRUxBCi0Jc2VjdGlvbiBpZiB0aGUgcmVsX3NlY3Rpb24gZmllbGQgaGFzIGJlZW4gc2V0IHVwLgotCi1XZWQgSmFuIDI0IDIwOjQwOjI2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvIGluIGVhYmkKLQlyZWxvY2F0aW9ucy4KLQotV2VkIEphbiAyNCAxMDozODozNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlbGV0ZSBjaGVja2luZwotCW9mIGZsYWdzLCBvbmx5IGZsYWdzIHVzZWQgYXJlIGNvbnRyb2xsZWQgYnkgbWFjaCBudW1iZXIuICBCdW1wIHVwCi0Jb3V0cHV0IGZpbGUgbWFjaCBudW1iZXIgdG8gaGlnaGVzdCBvZiBpbnB1dCBmaWxlIG1hY2ggbnVtYmVycy4KLQkoZWxmMzJfc3BhcmNfb2JqZWN0X3ApOiBXYXRjaCBmb3IgRUZfU1BBUkNfU1VOX1VTMS4KLQkoZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBFRl9TUEFSQ19TVU5fVVMxIGlmIHY4cGx1c2EuCi0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjNjQtKi17c3lzdjQqLHNvbGFyaXMyKn0pOiBDb21tZW50IG91dAotCWJmZF9lbGY2NF9zcGFyY192ZWMgc3VwcG9ydC4KLQotVHVlIEphbiAyMyAxNDozMzowNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IGNvbXBsYWluIGlmCi0JdGhlIGVtYmVkZGVkIGJpdCBpcyBzZXQgb24gc29tZSBvYmplY3RzIGFuZCBub3Qgb24gb3RoZXJzLiAgSnVzdAotCW9yIGl0IHRvZ2V0aGVyLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbXBsZW1lbnQgUl9QUENfRU1CX3tTREEyMSxSRUxTREF9Ci0JcmVsb2NhdGlvbnMuCi0KLVR1ZSBKYW4gMjMgMTQ6MjI6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEb24ndCB0cnkgdG8gYWxpZ24gdGhlCi0JLnN0YWJzdHIgc2VjdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEZpeCB0aGUgaGFuZGxpbmcgb2YgdGhlCi0JLmxpYiBzZWN0aW9uIHRvIHdvcmsgZXZlbiBpZiB0aGUgZW50aXJlIHNlY3Rpb24gY29udGVudHMgYXJlCi0Jd3JpdHRlbiBhdCBvbmNlLiAgRnJvbSBHdnJhbiBVZGRlYm9yZyA8Z3ZyYW5AdWRkZWJvcmcucHAuc2U+IGFuZAotCVJvYmVydCBMaXBlIDxyb2JlcnRsQGFybmV0LmNvbT4uCi0KLU1vbiBKYW4gMjIgMTg6NDU6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IERvbid0IGFsbG9jYXRlCi0JbWVtb3J5IGhlcmUgZm9yIGNvbnRlbnRzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQnVtcCB1cCBfU0RBX0JBU0VfIGFuZAotCV9TREEyX0JBU0VfIGJ5IDMyNzY4LgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6ICNpZiBvdXQgUExUIGNvZGUgd2hpY2ggd2UgaGF2ZW4ndAotCXN0YXJ0ZWQgdXNpbmcuICBBbGxvY2F0ZSBjb250ZW50cyBmb3IgLnNkYXRhIGFuZCAuc2RhdGEyIHNlY3Rpb25zCi0JYWxzby4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBVc2UgYmZkX2dldF9zZWN0aW9uX25hbWUgaW4gZGVidWcgbWVzc2FnZSwKLQlyYXRoZXIgdGhhbiBfbmFtZS4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBSZW1vdmUgY29kZSB0aGF0IGF0dGVtcHRlZCB0bwotCXNpemUgX1NEQXssMn1fQkFTRV8uCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoYW5nZSBob3cgc2RhdGF7LDJ9IHJlbG9jYXRpb25zIGFyZQotCWRvbmUuCi0KLU1vbiBKYW4gMjIgMDg6NTI6MDQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRml4IHR5cG8uCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NwYXJjX3Y5KTogUmVuYW1lZCBmcm9tIGJmZF9tYWNoX3NwYXJjNjQuCi0JKGJmZF9tYWNoX3NwYXJjX3t2OHBsdXMsdjhwbHVzYX0pOiBEZWZpbmUuCi0JKGJmZF9tYWNoX3NwYXJjX3Y5YSk6IERlZmluZS4KLQkoYmZkX21hY2hfc3BhcmNfdjlfcCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBhb3V0eC5oIChhb3V0LG1hY2hpbmVfdHlwZSk6IGJmZF9tYWNoX3NwYXJjNjQgcmVuYW1lZCB0bwotCWJmZF9tYWNoX3NwYXJjX3Y5LgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjNjQtKi1zeXN2NCosc3BhcmM2NC0qLXNvbGFyaXMyKik6IFNldCB0YXJnX2RlZnZlYwotCXRvIGJmZF9lbGYzMl9zcGFyY192ZWMuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IFJlbmFtZWQgZnJvbSBzcGFyY19hcmNoX2luZm8uCi0JQWRkIHY4cGx1c3ssYX0gc3VwcG9ydC4KLQlBZGQgdjlhIHN1cHBvcnQuCi0JKHNwYXJjX2NvbXBhdGlibGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi1zcGFyYy5oOiAjaW5jbHVkZSAiZWxmL3NwYXJjLmgiLgotCShlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBlbGYzMl9zcGFyY19vYmplY3RfcCwKLQllbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBlbGZfYmFja2VuZF9vYmplY3RfcCwKLQllbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgotCi1Nb24gSmFuIDIyIDExOjIxOjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZAotCWxpbmtlcl9zZWN0aW9uX3BvaW50ZXIgZmllbGQuCi0JKGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0pOiBFbnVtZXJhdGlvbiBmb3IgbmV3IHdheSBvZgotCWNyZWF0aW5nIGxpbmtlciBkeW5hbWljIHNlY3Rpb25zIGFuZCBzeW1ib2xzLgotCShlbGZfbGlua2VyX3NlY3Rpb257LF9wb2ludGVyc30pOiBOZXcgc3RydWN0dXJlcyBmb3IgY3JlYXRpbmcKLQlkeW5hbWljIHNlY3Rpb25zIGFuZCBzeW1ib2xzLgotCShlbGZfb2JqX3RkYXRhKTogQWRkIGxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzIGFuZCBsaW5rZXJfc2VjdGlvbgotCWZpZWxkcy4KLQkoZWxmX2xvY2FsX3B0cl9vZmZzZXRzLGVsZl9saW5rZXJfc2VjdGlvbik6IE5ldyBhY2Nlc3NvciBtYWNyb3MuCi0JKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE5ldyBkZWNsYXJhdGlvbnMuCi0JKF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IERpdHRvLgotCShiZmRfZWxmezMyLDY0fV97Y3JlYXRlLGZpbmlzaH1fcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IERpdHRvLgotCShfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEpOiBEaXR0by4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlbGV0ZS4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZQotCXNlY3Rpb25zIC5nb3QsIC5zZGF0YSwgYW5kIC5zZGF0YTIuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogWmFwIC5yZWxhLntzZGF0YSxzZGF0YTJ9IGlmCi0JbmVlZGVkLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFN1cHBvcnQgbW9yZSBvZiB0aGUgZWFiaSByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9scyk6IEFkanVzdCBfU0RBeywyfV9CQVNFXyBieSAzMjc2OAotCWlmIHRoZSAuc2RhdGF7LDJ9ICsgLnNic3N7LDJ9IHNlY3Rpb24gc2l6ZSBpcyA+IDMyay4KLQotCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gdG8KLQljcmVhdGUgaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gZHluYW1pYyBsaW5rZXIgc2VjdGlvbnMuCi0JKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IEFjdHVhbGx5IGludGlhbGl6ZSB0aGUKLQlwb2ludGVycyBjcmVhdGVkIGFib3ZlLgotCi0JKiBlbGZjb2RlLmggKGJmZF9lbGZ7MzIsNjR9X2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogTmV3Ci0JbWFjcm9zIHRvIHByb3ZpZGUgYm90aCAzMiBhbmQgNjQgYml0IHZlcnNpb25zIG9mCi0JZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uLgotCShiZmRfZWxmezMyLDY0fV9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IE5ldyBtYWNyb3MgdG8KLQlwcm92aWRlIGJvdGggMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucyBvZgotCWVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbi4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gdG8KLQljcmVhdGUgYSBsaW5rZXIgc2VjdGlvbi4KLQkoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRmluZCBhIHVuaXF1ZSBwb2ludGVyIHRvIGEKLQlnaXZlbiBhZGRyZXNzIGluIHRoZSBsaW5rZXIgcG9pbnRlciBvZmZzZXRzIGNyZWF0ZWQgZm9yIGEgZ2l2ZW4KLQlzeW1ib2wuCi0JKF9iZmRfZWxmX21ha2VfbGlua2VyX3NlY3Rpb25fcmVsYSk6IE1ha2UgYSBSRUxBIHNlY3Rpb24KLQljb3JyZXNwb25kaW5nIHRvIHRoZSBnZW5lcmF0ZWQgbGlua2VyIHNlY3Rpb24uCi0KLVNhdCBKYW4gMjAgMDg6MzY6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoRUxGX01BQ0hJTkVfQUxUMSk6IERlZmluZS4KLQotVGh1IEphbiAxOCAxODoyNTozNCAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IGNoYW5nZWQgVE9DREVGTiByZWxvY3MuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgc3BlY2lhbCB2YWx1ZXMgZm9yIGdjYyBidWlsdCBkbGxzLgotCShkdW1wX3RvYyk6IGZpeCBkaWFnbm9zaW5nIGNvZGUgdG8gaWRlbnRpZnkgb3V0LW9mLXRvYy1ib3VuZHMgZW50cmllcy4KLQlBbHNvIGJlZ2luIHRoZSB0b2MgYXQgNCBhcyBhbiBleWUgY2F0Y2hlciAoJzMxMzEzMTMxJyBtYXJrcyB0aGUgZmlyc3QKLQl0b2MgZW50cnkgaW4gYW4gb2JqZHVtcCkgZm9yIG5vdy4KLQkocHBjX2RvX2xhc3QsIHBwY19nZXRfbGFzdCk6IE5ldyBmdW5jdGlvbiAtIG5lZWRlZCB0byBzYXZlIHByb2Nlc3NpbmcKLQl0aGUgdG9jIG93bmVyIHRvIHRoZSBlbmQuCi0JKHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2spOiBSZW1vdmVkIGFuIGluY29ycmVjdCBoYWNrIGZvciBkb2luZyB0aGUKLQl0b2Mgb3duZXIgbGFzdC4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBBZGRlZCBhIG5ldyBoYWNrIHRvIGtlZXAgdGhlCi0JdG9jIG93bmVyIGZyb20gYmVpbmcgZG9uZSB0aWxsIGxhc3QuIE11c3QgZGVmaW5lIFBPV0VSUENfTEVfUEMKLQl0byBlbmFibGUgaXQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogYWxpZ25tZW50IHNldHRpbmcgZm9yIC5zdGFiCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBzZXQgc2VjdGlvbiBmbGFncyBmb3Igc3RhYi9zdHIKLQl0byBJTkZPLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBSZW1vdmVkIGEgbm9uLXdvcmtpbmcgaGFjayBmb3IgY29tcHV0aW5nIHRoZQotCVNpemVPZkltYWdlIGZvciBQb3dlclBDLiBJZ25vcmUgdGhlIHNpemUgb2YgdGhlIC5qdW5rIHNlY3Rpb24uCi0KLVRodSBKYW4gMTggMTc6NDI6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb3JlLmg6IEluY2x1ZGUgPHNpZ25hbC5oPiBiZWZvcmUgPHN5cy9wcm9jZnMuaD4uCi0KLVdlZCBKYW4gMTcgMTI6NDA6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtcG93ZXJwYy5jIChhcmNoX2luZm9fc3RydWN0KTogQ2hhbmdlIGxhc3QgZW50cnkgdG8gbm90IHBvaW50Ci0JYmFjayB0byBmaXJzdC4KLQkoYmZkX3Bvd2VycGNfYXJjaCk6IFBvaW50IGF0IGZpcnN0IGVudHJ5IGluIGFyY2hfaW5mb19zdHJ1Y3QuCi0KLVR1ZSBKYW4gMTYgMTU6MTA6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IERvbid0IGluY3JlbWVudCBmaWxlCi0Jb2Zmc2V0IGZvciBhIHNlZ21lbnQgd2hpY2ggY29udGFpbnMgbm8gbG9hZGFibGUgc2VjdGlvbnMuCi0KLU1vbiBKYW4gMTUgMTc6NDY6MjcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgbmV3IFBvd2VyUEMgcmVsb2NhdGlvbnMuCi0JKiB7YmZkLWluMixsaWJiZmR9Lmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEFkZCBtb3JlIFBQQyByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IExvb2t1cCBuZXcgcmVsb2NhdGlvbnMuCi0KLU1vbiBKYW4gMTUgMTQ6Mjk6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBGaXggUkVMT0NfQkFTRTEwIGFuZCBSRUxPQ19CQVNFMjIKLQllbnRyaWVzLgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBEb24ndCBmYWlsIGFzc2VydCBpZgotICAgICAgICBpbmZvLT5zaGFyZWQuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IHRyeSB0byBjYWNoZQotCWluZm9ybWF0aW9uIGluIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCBvd25lZCBieSBhIEJGRC4gIEZyb20gUmljaGFyZAotCUhlbmRlcnNvbiA8cmljaGFyZEBhdGhlaXN0LnRhbXUuZWR1Pi4KLQotCSogZWxmMzItbWlwcy5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGR5bmFtaWMgbGlua2luZyBjb2RlLCBtb3N0bHkKLQlmcm9tIEthenVtb3RvIEtvamltYSA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+LgotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogUmVtb3ZlIHNwZWNpYWwgY2hlY2sgZm9yCi0JX3JsZF9uZXdfaW50ZXJmYWNlLgotCi0JKiBlY29mZnN3YXAuaDogQWRkIHByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCi0KLVN1biBKYW4gMTQgMjE6MzY6MDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl97dW5zdXBwb3J0ZWQsc3RkfV9yZWxvYyk6IFJlbW92ZSBmdW5jdGlvbnMuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogUmVtb3ZlIHBwY19lbGZfe3Vuc3VwcG9ydGVkLHN0ZH1fcmVsb2MKLQlyZWZlcmVuY2VzLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgTm8gbG9uZ2VyIGFsbG93IC5zZGF0YS8uc2JzcyBzZWN0aW9ucwotCXRvIHNhdGlzZnkgYSBUT0MxNiByZWxvY2F0aW9uLiAJUmV3cml0ZSB1bnN1cHBvcnRlZCByZWxvY2F0aW9uCi0Jc3VwcG9ydC4gIEJlZ2luIHN1cHBvcnQgZm9yIFJfUFBDX1NEQXsyLH1SRUwuCi0KLVNhdCBKYW4gMTMgMDk6MzY6NTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSB0aGUgLmdvdCBhbmQgLmdvdC5uZWcgc2VjdGlvbnMuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCBpdC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBDYWxsIGl0LgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFN1cHBvcnQgLmdvdC5uZWcsIGp1c3QgbGlrZSAuZ290LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEFkZCBlcnJvciBtZXNzYWdlcyBmb3IgcmVsb2NhdGlvbnMgd2UKLQlkb24ndCB5ZXQgc3VwcG9ydC4gIERvIG5vdCBpbmNsdWRlIFJfUFBDX1NEQVJFTDE2IGxpa2UgYSBHT1QKLQlyZWxvY2F0aW9uLgotCi1GcmkgSmFuIDEyIDE1OjI3OjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfZmFrZV9zZWN0aW9ucyk6IERlZmluZSwgYW5kIGhhbmRsZSB0aGUgbmV3Ci0Jc2VjdGlvbiBmbGFncyBmb3IgVi40IGFuZCBlYWJpLgotCi1GcmkgSmFuIDEyIDEzOjU5OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJZiBhIHNlZ21lbnQKLQljb250YWlucyBubyBzZWN0aW9ucywgZG9uJ3QgbWFyayBpdCBhcyByZWFkYWJsZS4KLQotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEb24ndCBkZWNsYXJlLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IER1bXAgY29udGVudHMgb2YKLQlkeW5hbWljIHNlY3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBBZGQgc3dhcF9keW5faW4gZmllbGQuCi0JKGJmZF9lbGYzMl9zd2FwX2R5bl9pbik6IENoYW5nZSB0eXBlIG9mIHNlY29uZCBwYXJhbWV0ZXIgdG8gUFRSLgotCShiZmRfZWxmNjRfc3dhcF9keW5faW4pOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfZHluX2luKTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIHBhcmFtZXRlciB0bwotCVBUUi4KLQkoTkFNRShfYmZkX2VsZixzaXplX2luZm8pKTogSW5pdGlhbGl6ZSBzd2FwX2R5bl9pbiBmaWVsZC4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBjcmVhdGUgYQotCURUX1RFWFRSRUwgZW50cnkgYmVjYXVzZSBvZiAucmVsLnBsdC4gIEZyb20gTWFydGluIFBpcmtlcgotCTxwaXJrZXJAZWl1bml4LnR1d2llbi5hYy5hdD4uCi0KLVRodSBKYW4gMTEgMTc6MDY6MTQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKFNFQ197RVhDTFVERSxTT1JUX0VOVFJJRVN9KTogTmV3IHNlY3Rpb24gZmxhZ3MgZm9yCi0JUG93ZXJQQyBWLjQgYW5kIGVhYmkuCi0gCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliZmQuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmeHgtdGFyZ2V0LmggKFRBUkdFVF97QklHLExJVFRMRX1fU1lNKTogQWRkIG5ldyBmbGFncy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBTdXBwb3J0IFNIVF9PUkRFUkVECi0Jc2VjdGlvbiB0eXBlIGFuZCBTSEZfRVhDTFVERSBzZWN0aW9uIGZsYWcsIHR1cm5pbmcgdGhlbSBpbnRvIHRoZQotCWFwcHJvcHJpYXRlIGJmZCBzZWN0aW9uIGZsYWcuCi0KLVRodSBKYW4gMTEgMTE6MjM6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENyZWF0ZSB0aGUgc3BlY2lhbAotCXNlY3Rpb25zIGlmIHdlIHNlZSBhIERZTkFNSUMgb2JqZWN0LCBpbiBjYXNlIHRoYXQgaXMgdGhlIG9ubHkKLQlYQ09GRiBpbnB1dCBvYmplY3Qgd2Ugc2VlLgotCi0JKiBlbGYzMi1taXBzLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIGZvciBhIHN0YXJ0IGF0IGR5bmFtaWMgbGlua2luZwotCXN1cHBvcnQsIGZyb20gS2F6dW1vdG8gS29qaW1hIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4uCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgdHlwZV9jaGFuZ2Vfb2sgZmllbGQuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlCi0JZWxmX2JhY2tlbmRfY3JlYXRlX3Byb2dyYW1faGVhZGVycyBmaWVsZC4gIEFkZAotCWVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIGFuZAotCWVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCBmaWVsZHMuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2spOiBEZWZpbmUgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX2NyZWF0ZV9wcm9ncmFtX2hlYWRlcnMpOiBEb24ndCBkZWZpbmUuCi0JKGVsZk5OX2JlZCk6IENoYW5nZSB0byBhY2NvdW50IGZvciBmaWVsZCBjaGFuZ2VzLgotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBDYWxsIG5ldwotCW1vZGlmeV9zZWdtZW50X21hcCBiYWNrZW5kIGZ1bmN0aW9uLiAgRG9uJ3QgY2FsbCBvbGQKLQljcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGJhY2tlbmQgZnVuY3Rpb24uCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogQ2FsbCBhZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyByYXRoZXIKLQl0aGFuIGNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEluaXRpYWxpemUKLQl0eXBlX2NoYW5nZV9vayBmcm9tIG5ldyBiYWNrZW5kIGZpZWxkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3Qgd2FybiBpZiBfcmxkX25ld19pbnRlcmZhY2UgaXMKLQlkZWZpbmVkLgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sIGFzCi0JYSByZWxvYyBhZ2FpbnN0IHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCB0ZGF0YSBmaWVsZC4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW5hbWUgcHBjX2ZsYWdzX2luaXQgZmllbGQgdG8gZmxhZ3NfaW5pdC4KLQkoZWxmX2ZsYWdzX2luaXQpOiBSZW5hbWUgZnJvbSBlbGZfcHBjX2ZsYWdzX2luaXQuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IFVzZSBlbGZfZmxhZ3NfaW5pdCwgbm90Ci0JZWxmX3BwY19mbGFnc19pbml0LgotCShwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbTY4ay5jIChob3d0b190YWJsZSk6IENoYW5nZSBzcmNfbWFzayB0byAwIGZvciBhbGwKLQlyZWxvY2F0aW9uIGVudHJpZXMuCi0KLVR1ZSBKYW4gIDkgMTU6MjI6NTMgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRHVyaW5nIGZpbmFsIGxpbmssIGFsbG93Ci0gCW91dHB1dCAubGl0YSBzZWN0aW9uIHRvIGJlIGJpZ2dlciB0aGFuIDY0ayBieSBhZGp1c3RpbmcgZ3AgdmFsdWUKLSAJb24gYSBwZXItaW5wdXQgc2VjdGlvbiBiYXNpcy4KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl90ZGF0YSk6IEFkZCBpc3N1ZWRfbXVsdGlwbGVfZ3Bfd2FybmluZwotCWZpZWxkLgotCShzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCBncCBmaWVsZC4KLQotVHVlIEphbiAgOSAxMjowMDozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlIYW5kbGUgQWxwaGEgRUNPRkYgY2hhbmdlcyBpbiBPU0YvMSAzLjIuCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkIGdldF9lbHRfYXRfZmlsZXBvcwotCWZpZWxkLgotCSogY29mZi1hbHBoYS5jOiBJbmNsdWRlICJhb3V0L2FyLmgiLgotCShhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEb24ndCByZXF1aXJlIGFuCi0JQUxQSEFfUl9JR05PUkUgcmVsb2MgYWZ0ZXIgYW4gQUxQSEFfUl9HUERJU1AgcmVsb2MsIHNpbmNlIE9TRi8xCi0JMy4yIGRvZXNuJ3QgZ2VuZXJhdGUgb25lLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGFscGhhX2Vjb2ZmX3NsdXJwX2FybWFwKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfdHJ1bmNhdGVfYXJuYW1lKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl93cml0ZV9hcm1hcCk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogRGVmaW5lLgotCShhbHBoYV9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCShBUkZaTUFHKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl9yZWFkX2FyX2hkcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIGdldF9lbHRfYXRfZmlsZXBvcyBmaWVsZC4KLQkoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogQ2hhbmdlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgZnJvbQotCV9iZmRfZWNvZmYgdG8gYWxwaGFfZWNvZmYuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBVc2UgZ2V0X2VsdF9hdF9maWxlcG9zCi0JZmllbGQgZnJvbSBiYWNrZW5kIHN0cnVjdHVyZSwgcmF0aGVyIHRoYW4gYWx3YXlzIGNhbGxpbmcKLQlfYmZkX2dldF9lbHRfYXRfZmlsZXBvcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUKLQlnZXRfZWx0X2F0X2ZpbGVwb3MgZmllbGQuCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBOZXcgZnVuY3Rpb24sIGNvcGllZAotCWZyb20gX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIHdpdGggbWlub3IgY2hhbmdlcy4KLQkoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyKTogVXNlIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogYmZkLWluLmggKEJGRF9JTl9NRU1PUlkpOiBEZWZpbmUuCi0JKiBsaWJiZmQtaW4uaCAoc3RydWN0IGJmZF9pbl9tZW1vcnkpOiBEZWZpbmUuCi0JKiBsaWJiZmQuYyAoYmZkX3JlYWQpOiBIYW5kbGUgQkZEX0lOX01FTU9SWSBmbGFnLgotCShiZmRfZ2V0X2ZpbGVfd2luZG93KTogRG9uJ3QgdHJ5IHRvIG1hcCBhIEJGRF9JTl9NRU1PUlkgZmlsZS4KLQkoYmZkX3dyaXRlLCBiZmRfc3RhdCk6IEFib3J0IGlmIEJGRF9JTl9NRU1PUlkgaXMgc2V0LgotCShiZmRfdGVsbCwgYmZkX2ZsdXNoLCBiZmRfc2Vlayk6IEhhbmRsZSBCRkRfSU5fTUVNT1JZIGZsYWcuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBDaGFuZ2UgaW9zdHJlYW0gZmllbGQgZnJvbSBjaGFyICogdG8gUFRSLgotCShiZmRfZ2V0X3NpemUpOiBIYW5kbGUgQkZEX0lOX01FTU9SWSBmbGFnLgotCSogY2FjaGUuYyAoYmZkX2NhY2hlX2Nsb3NlKTogSWdub3JlIEJGRF9JTl9NRU1PUlkgZmlsZXMuCi0JKGJmZF9vcGVuX2ZpbGUpOiBDYXN0IHRvIFBUUiwgbm90IGNoYXIgKiwgd2hlbiBzZXR0aW5nIGlvc3RyZWFtLgotCShiZmRfY2FjaGVfbG9va3VwX3dvcmtlcik6IEFib3J0IGlmIEJGRF9JTl9NRU1PUlkgaXMgc2V0LgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ2FzdCB0byBQVFIsIG5vdCBjaGFyICosIHdoZW4gc2V0dGluZwotCWlvc3RyZWFtLgotCShiZmRfb3BlbnN0cmVhbXIpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogT25seSBmc3RhdCBpb3N0cmVhbSBpZgotCUJGRF9JTl9NRU1PUlkgaXMgbm90IHNldC4KLQkqIHJpc2NpeC5jIChyaXNjaXhfc29tZV9hb3V0X29iamVjdF9wKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgX2JmZF9nZXRfZWx0X2F0X2luZGV4IGZpZWxkLgotCShCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogQWRkIF9nZXRfZWx0X2F0X2luZGV4LgotCShiZmRfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgpOiBSZW5hbWUgZnJvbQotCWJmZF9nZXRfZWx0X2F0X2luZGV4LiAgQ2hhbmdlIGluZGV4IHBhcmFtZXRlciBmcm9tIGludCB0bwotCXN5bWluZGV4LgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4KTogRGVjbGFyZS4KLQkoX2JmZF9ub2FyY2hpdmVfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2JzZF9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogaWVlZS5jIChpZWVlX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBvYXN5cy5jIChvYXN5c19nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogc29tLmMgKHNvbV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgcmVzdHJpY3QgbGluZQotCW51bWJlcnMgdG8gdGhlIC50ZXh0IHNlY3Rpb24uCi0KLU1vbiBKYW4gIDggMTc6MDA6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfZGVidWdfcGFydCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCUlmIHRoZXJlIGlzIGEgU0VDX0RFQlVHR0lORyBzZWN0aW9uLCBnZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZWJ1ZwotCWluZm9ybWF0aW9uIHBhcnQgZnJvbSBpdC4KLQkoaWVlZV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFN0b3JlIHRoZSBjb250ZW50cyBvZiBhIFNFQ19ERUJVR0dJTkcKLQlzZWN0aW9uIGluIG1lbW9yeS4KLQkoaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBpZWVlX3dyaXRlX2RlYnVnX3BhcnQgcmV0dXJuLgotCi1UaHUgSmFuICA0IDE3OjEyOjM3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWZyZWVic2QqKTogQWRkIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4NmZyZWVic2RfdmVjKTogQWRkIHZlYy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBpMzg2ZnJlZWJzZC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgaTM4NmZyZWVic2QuYy4KLQlSZWJ1aWxkIGRlcGVuZGVuY2llcy4uCi0JKiBmcmVlYnNkLmg6IE5ldyBmaWxlLgotCSogaTM4NmZyZWVic2QuYzogTmV3IGZpbGUuCi0JKiB0YXJnZXRzLmMgKGkzODZmcmVlYnNkX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGkzODZmcmVlYnNkX3ZlYy4KLQkqIGkzODZsaW51eC5jIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgYXMgVEFSR0VUX1BBR0VfU0laRQotCSogaTM4Nm5ldGJzZC5jIChTRUdNRU5UX1NJWkUpOiAgRGVmaW5lIGFzIFRBUkdFVF9QQUdFX1NJWkUKLQotVGh1IEphbiAgNCAxNjoyNzo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9kZWJ1Zyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGllZWVfb2JqZWN0X3ApOiBDYWxsIGl0LgotCShpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IFNraXAgZGVidWdnaW5nIHNlY3Rpb25zLgotCShpZWVlX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShpZWVlX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0KTogTGlrZXdpc2UuCi0JKGllZWVfd3JpdGVfZGVidWdfcGFydCk6IExpa2V3aXNlLgotCShpZWVlX3dyaXRlX2RhdGFfcGFydCk6IExpa2V3aXNlLgotCShpbml0X2Zvcl9vdXRwdXQpOiBMaWtld2lzZS4KLQotV2VkIEphbiAgMyAxOTo0Mjo0NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTWFrZSBAR09UIHJlbG9jYXRpb25zCi0Jd29yay4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBKdXN0IHVzZSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgZm9yIGFsbCBob3d0bwotCXJlbG9jcywgc2luY2UgcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGhhbmRsZXMgdGhlIGxpbmtlciBjYXNlLgotCShwcGNfZWxmX3thZGRyMTZfaGEsZ290MTYsdG9jMTYsYnJ0YWtlbn1fcmVsb2MpOiBEZWxldGUsIG5vIGxvbmdlcgotCXVzZWQuCi0JKHBwY19lbGZfe2FkZHIxNl9oYSxnb3QxNix0b2MxNixicnRha2VufV9pbm5lcik6IE1lcmdlIHRoZXNlIGludG8KLQlwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gc2luY2UgdGhhdCBpcyBub3cgdGhlIG9ubHkgY2FsbGVyLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotV2VkIEphbiAgMyAxNToxMTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgd2UgZG9uJ3Qga25vdyB0aGUKLQlzZWN0aW9uIG9mIHRoZSBlbnRyeSBwb2ludCBmb3IgYW4gWENPRkYgZXhlY3V0YWJsZSwgYWx3YXlzIHNldCB0aGUKLQllbnRyeSBhZGRyZXNzIHRvIC0xLgotCi1UdWUgSmFuICAyIDE0OjE3OjE1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEFkZCBzdXBwb3J0IGZvciBub3RlIHNlY3Rpb25zLgotCi1UdWUgSmFuICAyIDEzOjEwOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKHN0cnVjdCBfc3ltYm9sX2luZm8pOiBBZGQgc3RhYl90eXBlIGZpZWxkLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykpOiBTZXQgc3RhYl90eXBlLgotCi0JKiBlbGYzMi1wcGMuYzogUmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmUgZnJvbSBjYWxscyB0bwotICAgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE9ubHkgd2FybiBhYm91dCBlbmRpYW5uZXNzCi0JZGlmZmVyZW5jZSBpZiB0YXJnZXQgZW5kaWFubmVzcyBpcyBrbm93bi4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05NDk1Ci0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iZmQvTWFrZWZpbGUuYW0gYi9iZmQvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4M2ZjZjQuLjAwMDAwMDAKLS0tIGEvYmZkL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMTEzMyArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKLUNTRUFSQ0ggPSAtSS4gLUkkKHNyY2RpcikgLUkkKElOQ0RJUikKLU1LREVQID0gbWtkZXAKLQotU1VCRElSUyA9IGRvYyBwbwotCi1kb2NkaXIgPSBkb2MKLQotbGliX0xUTElCUkFSSUVTID0gbGliYmZkLmxhCi0KLSMgYmZkLmggZ29lcyBoZXJlLCBmb3Igbm93Ci1CRkRfSCA9IGJmZC5oCi0KLSMgSmltIEtpbmdkb24gbm90ZXM6Ci0jIFdyaXRpbmcgUy1yZWNvcmRzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbGwgKG9yIGF0IGxlYXN0IG1vc3QpCi0jICotKi1jb2ZmLCAqLSotYW91dCwgZXRjLiwgY29uZmlndXJhdGlvbnMsIGJlY2F1c2UgcGVvcGxlIHdpbGwgd2FudCB0bwotIyBiZSBhYmxlIHRvIHVzZSBvYmpjb3B5IHRvIGNyZWF0ZSBTLXJlY29yZHMuICAoUy1yZWNvcmRzIGFyZSBub3QgdXNlZnVsCi0jIGZvciB0aGUgZGVidWdnZXIsIHNvIGlmIHlvdSBhcmUgZG93bmxvYWRpbmcgdGhpbmdzIGFzIFMtcmVjb3JkcyB5b3UKLSMgbmVlZCB0d28gY29waWVzIG9mIHRoZSBleGVjdXRhYmxlLCBvbmUgdG8gZG93bmxvYWQgYW5kIG9uZSBmb3IgdGhlCi0jIGRlYnVnZ2VyKS4KLUJGRF9MSUJTID0gXAotCWFyY2hpdmUubG8gYXJjaHVyZXMubG8gYmZkLmxvIGNhY2hlLmxvIGNvZmZnZW4ubG8gY29yZWZpbGUubG8gXAotCWZvcm1hdC5sbyBpbml0LmxvIGxpYmJmZC5sbyBvcG5jbHMubG8gcmVsb2MubG8gXAotCXNlY3Rpb24ubG8gc3ltcy5sbyB0YXJnZXRzLmxvIGhhc2gubG8gbGlua2VyLmxvIFwKLQlzcmVjLmxvIGJpbmFyeS5sbyB0ZWtoZXgubG8gaWhleC5sbyBzdGFicy5sbyBzdGFiLXN5bXMubG8KLQotQkZEX0xJQlNfQ0ZJTEVTID0gXAotCWFyY2hpdmUuYyBhcmNodXJlcy5jIGJmZC5jIGNhY2hlLmMgY29mZmdlbi5jIGNvcmVmaWxlLmMgXAotCWZvcm1hdC5jIGluaXQuYyBsaWJiZmQuYyBvcG5jbHMuYyByZWxvYy5jIFwKLQlzZWN0aW9uLmMgc3ltcy5jIHRhcmdldHMuYyBoYXNoLmMgbGlua2VyLmMgXAotCXNyZWMuYyBiaW5hcnkuYyB0ZWtoZXguYyBpaGV4LmMgc3RhYnMuYyBzdGFiLXN5bXMuYwotCi0jIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jCi0jIHdpdGggdGhlIGRlY2xzIGFuZCBpbml0aWFsaXplciBpbiBhcmNodXJlcy5jLgotQUxMX01BQ0hJTkVTID0gXAotCWNwdS1hMjlrLmxvIFwKLQljcHUtYWxwaGEubG8gXAotCWNwdS1hcmMubG8gXAotCWNwdS1hcm0ubG8gXAotCWNwdS1hdnIubG8gXAotCWNwdS1kMTB2LmxvIFwKLQljcHUtZDMwdi5sbyBcCi0JY3B1LWZyMzAubG8gXAotCWNwdS1oODMwMC5sbyBcCi0JY3B1LWg4NTAwLmxvIFwKLQljcHUtaHBwYS5sbyBcCi0JY3B1LWkzNzAubG8gXAotCWNwdS1pMzg2LmxvIFwKLQljcHUtaTg2MC5sbyBcCi0JY3B1LWk5NjAubG8gXAotCWNwdS1tMzJyLmxvIFwKLQljcHUtbTY4ay5sbyBcCi0JY3B1LW04OGsubG8gXAotCWNwdS1tMTAyMDAubG8gXAotCWNwdS1tMTAzMDAubG8gXAotCWNwdS1tY29yZS5sbyBcCi0JY3B1LW1pcHMubG8gXAotCWNwdS1uczMyay5sbyBcCi0JY3B1LXBqLmxvIFwKLQljcHUtcG93ZXJwYy5sbyBcCi0JY3B1LXJzNjAwMC5sbyBcCi0JY3B1LXNoLmxvIFwKLQljcHUtc3BhcmMubG8gXAotCWNwdS10aWMzMC5sbyBcCi0JY3B1LXRpYzgwLmxvIFwKLQljcHUtdjg1MC5sbyBcCi0JY3B1LXZheC5sbyBcCi0JY3B1LXdlMzJrLmxvIFwKLQljcHUtdzY1LmxvIFwKLQljcHUtejhrLmxvCi0KLUFMTF9NQUNISU5FU19DRklMRVMgPSBcCi0JY3B1LWEyOWsuYyBcCi0JY3B1LWFscGhhLmMgXAotCWNwdS1hcmMuYyBcCi0JY3B1LWFybS5jIFwKLQljcHUtYXZyLmMgXAotCWNwdS1kMTB2LmMgXAotCWNwdS1kMzB2LmMgXAotCWNwdS1mcjMwLmMgXAotCWNwdS1oODMwMC5jIFwKLQljcHUtaDg1MDAuYyBcCi0JY3B1LWhwcGEuYyBcCi0JY3B1LWkzNzAuYyBcCi0JY3B1LWkzODYuYyBcCi0JY3B1LWk4NjAuYyBcCi0JY3B1LWk5NjAuYyBcCi0JY3B1LW0zMnIuYyBcCi0JY3B1LW02OGsuYyBcCi0JY3B1LW04OGsuYyBcCi0JY3B1LW0xMDIwMC5jIFwKLQljcHUtbTEwMzAwLmMgXAotCWNwdS1tY29yZS5jIFwKLQljcHUtbWlwcy5jIFwKLQljcHUtbnMzMmsuYyBcCi0JY3B1LXBqLmMgXAotCWNwdS1wb3dlcnBjLmMgXAotCWNwdS1yczYwMDAuYyBcCi0JY3B1LXNoLmMgXAotCWNwdS1zcGFyYy5jIFwKLQljcHUtdGljMzAuYyBcCi0JY3B1LXRpYzgwLmMgXAotCWNwdS12ODUwLmMgXAotCWNwdS12YXguYyBcCi0JY3B1LXdlMzJrLmMgXAotCWNwdS13NjUuYyBcCi0JY3B1LXo4ay5jCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDMyIGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwuCi1CRkQzMl9CQUNLRU5EUyA9IFwKLQlhb3V0LWFkb2JlLmxvIFwKLQlhb3V0LWFybS5sbyBcCi0JYW91dC1uczMyay5sbyBcCi0JYW91dC1zcGFyY2xlLmxvIFwKLQlhb3V0LXRpYzMwLmxvIFwKLQlhb3V0MC5sbyBcCi0JYW91dDMyLmxvIFwKLQlhcm1uZXRic2QubG8gXAotCWJvdXQubG8gXAotCWNmLWkzODZseW54LmxvIFwKLQljZi1tNjhrbHlueC5sbyBcCi0JY2Ytc3BhcmNseW54LmxvIFwKLQljb2ZmLWEyOWsubG8gXAotCWNvZmYtYXBvbGxvLmxvIFwKLQljb2ZmLWFybS5sbyBcCi0JY29mZi1hdXgubG8gXAotCWNvZmYtaDgzMDAubG8gXAotCWNvZmYtaDg1MDAubG8gXAotCWNvZmYtaTM4Ni5sbyBcCi0JY29mZi1nbzMyLmxvIFwKLQljb2ZmLWk4NjAubG8gXAotCWNvZmYtaTk2MC5sbyBcCi0JY29mZi1tNjhrLmxvIFwKLQljb2ZmLW04OGsubG8gXAotCWNvZmYtbWlwcy5sbyBcCi0JY29mZi1wbWFjLmxvIFwKLQljb2ZmLXJzNjAwMC5sbyBcCi0JY29mZi1zaC5sbyBcCi0JY29mZi1zcGFyYy5sbyBcCi0JY29mZi1zdGdvMzIubG8gXAotCWNvZmYtc3ZtNjhrLmxvIFwKLQljb2ZmLXRpYzMwLmxvIFwKLQljb2ZmLXRpYzgwLmxvIFwKLQljb2ZmLXU2OGsubG8gXAotCWNvZmYtd2UzMmsubG8gXAotCWNvZmYtdzY1LmxvIFwKLQljb2ZmLXo4ay5sbyBcCi0JY29mZmxpbmsubG8gXAotCWR3YXJmMS5sbyBcCi0JZHdhcmYyLmxvIFwKLQllY29mZi5sbyBcCi0JZWNvZmZsaW5rLmxvIFwKLQllbGYubG8gXAotCWVsZjMyLWFyYy5sbyBcCi0JZWxmYXJtLW9hYmkubG8gXAotCWVsZmFybS1uYWJpLmxvIFwKLQllbGYzMi1hdnIubG8gXAotCWVsZjMyLWQxMHYubG8gXAotCWVsZjMyLWQzMHYubG8gXAotCWVsZjMyLWZyMzAubG8gXAotCWVsZjMyLWdlbi5sbyBcCi0JZWxmMzItaTM3MC5sbyBcCi0JZWxmMzItaTM4Ni5sbyBcCi0JZWxmMzItaTg2MC5sbyBcCi0JZWxmMzItaTk2MC5sbyBcCi0JZWxmMzItbTMyci5sbyBcCi0JZWxmMzItbTY4ay5sbyBcCi0JZWxmMzItbTg4ay5sbyBcCi0JZWxmLW0xMDIwMC5sbyBcCi0JZWxmLW0xMDMwMC5sbyBcCi0JZWxmMzItbWNvcmUubG8gXAotCWVsZjMyLW1pcHMubG8gXAotCWVsZjMyLXBqLmxvIFwKLQllbGYzMi1wcGMubG8gXAotCWVsZjMyLXNoLmxvIFwKLQllbGYzMi1zcGFyYy5sbyBcCi0JZWxmMzItdjg1MC5sbyBcCi0JZWxmMzIubG8gXAotCWVsZmxpbmsubG8gXAotCWVwb2MtcGUtYXJtLmxvIFwKLQllcG9jLXBlaS1hcm0ubG8gXAotCWhwMzAwYnNkLmxvIFwKLQlocDMwMGhwdXgubG8gXAotCXNvbS5sbyBcCi0JaTM4NmFvdXQubG8gXAotCWkzODZic2QubG8gXAotCWkzODZkeW5peC5sbyBcCi0JaTM4NmZyZWVic2QubG8gXAotCWkzODZsaW51eC5sbyBcCi0JaTM4Nmx5bngubG8gXAotCWkzODZtc2Rvcy5sbyBcCi0JaTM4Nm5ldGJzZC5sbyBcCi0JaTM4Nm1hY2gzLmxvIFwKLQlpMzg2b3M5ay5sbyBcCi0JaWVlZS5sbyBcCi0JbTY4azRrbmV0YnNkLmxvIFwKLQltNjhrbGludXgubG8gXAotCW02OGtseW54LmxvIFwKLQltNjhrbmV0YnNkLmxvIFwKLQltODhrbWFjaDMubG8gXAotCW1pcHNic2QubG8gXAotCW5ld3NvczMubG8gXAotCW5sbS5sbyBcCi0JbmxtMzItaTM4Ni5sbyBcCi0JbmxtMzItc3BhcmMubG8gXAotCW5sbTMyLXBwYy5sbyBcCi0JbmxtMzIubG8gXAotCW5zMzJrbmV0YnNkLmxvIFwKLQlvYXN5cy5sbyBcCi0JcGM1MzItbWFjaC5sbyBcCi0JcGUtYXJtLmxvIFwKLQlwZWktYXJtLmxvIFwKLQlwZS1pMzg2LmxvIFwKLQlwZWktaTM4Ni5sbyBcCi0JcGUtbWNvcmUubG8gXAotCXBlaS1tY29yZS5sbyBcCi0JcGUtcHBjLmxvIFwKLQlwZWktcHBjLmxvIFwKLQlwZS1zaC5sbyBcCi0JcGVpLXNoLmxvIFwKLQlwZS1taXBzLmxvIFwKLQlwZWktbWlwcy5sbyBcCi0JcGVpZ2VuLmxvIFwKLQlwcGNib290LmxvIFwKLQlyZWxvYzE2LmxvIFwKLQlyaXNjaXgubG8gXAotCXNwYXJjbGludXgubG8gXAotCXNwYXJjbHlueC5sbyBcCi0Jc3BhcmNuZXRic2QubG8gXAotCXN1bm9zLmxvIFwKLQl2YXhuZXRic2QubG8gXAotCXZlcnNhZG9zLmxvIFwKLQl2bXMubG8gXAotCXZtcy1nc2QubG8gXAotCXZtcy1oZHIubG8gXAotCXZtcy1taXNjLmxvIFwKLQl2bXMtdGlyLmxvIFwKLQl4Y29mZmxpbmsubG8KLQotQkZEMzJfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQtYWRvYmUuYyBcCi0JYW91dC1hcm0uYyBcCi0JYW91dC1uczMyay5jIFwKLQlhb3V0LXNwYXJjbGUuYyBcCi0JYW91dC10aWMzMC5jIFwKLQlhb3V0MC5jIFwKLQlhb3V0MzIuYyBcCi0JYXJtbmV0YnNkLmMgXAotCWJvdXQuYyBcCi0JY2YtaTM4Nmx5bnguYyBcCi0JY2YtbTY4a2x5bnguYyBcCi0JY2Ytc3BhcmNseW54LmMgXAotCWNvZmYtYTI5ay5jIFwKLQljb2ZmLWFwb2xsby5jIFwKLQljb2ZmLWFybS5jIFwKLQljb2ZmLWF1eC5jIFwKLQljb2ZmLWg4MzAwLmMgXAotCWNvZmYtaDg1MDAuYyBcCi0JY29mZi1pMzg2LmMgXAotCWNvZmYtaTg2MC5jIFwKLQljb2ZmLWdvMzIuYyBcCi0JY29mZi1pOTYwLmMgXAotCWNvZmYtbTY4ay5jIFwKLQljb2ZmLW04OGsuYyBcCi0JY29mZi1taXBzLmMgXAotCWNvZmYtcG1hYy5jIFwKLQljb2ZmLXJzNjAwMC5jIFwKLQljb2ZmLXNoLmMgXAotCWNvZmYtc3BhcmMuYyBcCi0JY29mZi1zdGdvMzIuYyBcCi0JY29mZi1zdm02OGsuYyBcCi0JY29mZi10aWMzMC5jIFwKLQljb2ZmLXRpYzgwLmMgXAotCWNvZmYtdTY4ay5jIFwKLQljb2ZmLXdlMzJrLmMgXAotCWNvZmYtdzY1LmMgXAotCWNvZmYtejhrLmMgXAotCWNvZmZsaW5rLmMgXAotCWR3YXJmMS5jIFwKLQlkd2FyZjIuYyBcCi0JZWNvZmYuYyBcCi0JZWNvZmZsaW5rLmMgXAotCWVsZi5jIFwKLQllbGYzMi1hcmMuYyBcCi0JZWxmYXJtLW9hYmkuYyBcCi0JZWxmYXJtLW5hYmkuYyBcCi0JZWxmMzItYXZyLmMgXAotCWVsZjMyLWQxMHYuYyBcCi0JZWxmMzItZDMwdi5jIFwKLQllbGYzMi1mcjMwLmMgXAotCWVsZjMyLWdlbi5jIFwKLQllbGYzMi1pMzcwLmMgXAotCWVsZjMyLWkzODYuYyBcCi0JZWxmMzItaTg2MC5jIFwKLQllbGYzMi1pOTYwLmMgXAotCWVsZjMyLW0zMnIuYyBcCi0JZWxmMzItbTY4ay5jIFwKLQllbGYzMi1tODhrLmMgXAotCWVsZi1tMTAyMDAuYyBcCi0JZWxmLW0xMDMwMC5jIFwKLQllbGYzMi1tY29yZS5jIFwKLQllbGYzMi1taXBzLmMgXAotCWVsZjMyLXBqLmMgXAotCWVsZjMyLXBwYy5jIFwKLQllbGYzMi1zaC5jIFwKLQllbGYzMi1zcGFyYy5jIFwKLQllbGYzMi12ODUwLmMgXAotCWVsZjMyLmMgXAotCWVsZmxpbmsuYyBcCi0JZXBvYy1wZS1hcm0uYyBcCi0JZXBvYy1wZWktYXJtLmMgXAotCWhwMzAwYnNkLmMgXAotCWhwMzAwaHB1eC5jIFwKLQlzb20uYyBcCi0JaTM4NmFvdXQuYyBcCi0JaTM4NmJzZC5jIFwKLQlpMzg2ZHluaXguYyBcCi0JaTM4NmZyZWVic2QuYyBcCi0JaTM4NmxpbnV4LmMgXAotCWkzODZseW54LmMgXAotCWkzODZtc2Rvcy5jIFwKLQlpMzg2bmV0YnNkLmMgXAotCWkzODZtYWNoMy5jIFwKLQlpMzg2b3M5ay5jIFwKLQlpZWVlLmMgXAotCW02OGs0a25ldGJzZC5jIFwKLQltNjhrbGludXguYyBcCi0JbTY4a2x5bnguYyBcCi0JbTY4a25ldGJzZC5jIFwKLQltODhrbWFjaDMuYyBcCi0JbWlwc2JzZC5jIFwKLQluZXdzb3MzLmMgXAotCW5sbS5jIFwKLQlubG0zMi1pMzg2LmMgXAotCW5sbTMyLXNwYXJjLmMgXAotCW5sbTMyLXBwYy5jIFwKLQlubG0zMi5jIFwKLQluczMya25ldGJzZC5jIFwKLQlvYXN5cy5jIFwKLQlwYzUzMi1tYWNoLmMgXAotCXBlLWFybS5jIFwKLQlwZWktYXJtLmMgXAotCXBlLWkzODYuYyBcCi0JcGVpLWkzODYuYyBcCi0JcGUtbWNvcmUuYyBcCi0JcGVpLW1jb3JlLmMgXAotCXBlLXBwYy5jIFwKLQlwZWktcHBjLmMgXAotCXBlLXNoLmMgXAotCXBlaS1zaC5jIFwKLQlwZS1taXBzLmMgXAotCXBlaS1taXBzLmMgXAotCXBlaWdlbi5jIFwKLQlwcGNib290LmMgXAotCXJlbG9jMTYuYyBcCi0JcmlzY2l4LmMgXAotCXNwYXJjbGludXguYyBcCi0Jc3BhcmNseW54LmMgXAotCXNwYXJjbmV0YnNkLmMgXAotCXN1bm9zLmMgXAotCXZheG5ldGJzZC5jIFwKLQl2ZXJzYWRvcy5jIFwKLQl2bXMuYyBcCi0Jdm1zLWdzZC5jIFwKLQl2bXMtaGRyLmMgXAotCXZtcy1taXNjLmMgXAotCXZtcy10aXIuYyBcCi0JeGNvZmZsaW5rLmMKLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgNjQgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbAotIyBhbmQgLS1lbmFibGUtNjQtYml0LWJmZC4KLUJGRDY0X0JBQ0tFTkRTID0gXAotCWFvdXQ2NC5sbyBcCi0JY29mZi1hbHBoYS5sbyBcCi0JZGVtbzY0LmxvIFwKLQllbGY2NC1hbHBoYS5sbyBcCi0JZWxmNjQtZ2VuLmxvIFwKLQllbGY2NC1taXBzLmxvIFwKLQllbGY2NC1zcGFyYy5sbyBcCi0JZWxmNjQubG8gXAotCW5sbTMyLWFscGhhLmxvIFwKLQlubG02NC5sbwotCi1CRkQ2NF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dDY0LmMgXAotCWNvZmYtYWxwaGEuYyBcCi0JZGVtbzY0LmMgXAotCWVsZjY0LWFscGhhLmMgXAotCWVsZjY0LWdlbi5jIFwKLQllbGY2NC1taXBzLmMgXAotCWVsZjY0LXNwYXJjLmMgXAotCWVsZjY0LmMgXAotCW5sbTMyLWFscGhhLmMgXAotCW5sbTY0LmMKLQotT1BUSU9OQUxfQkFDS0VORFMgPSBcCi0JYWl4Mzg2LWNvcmUubG8gXAotCWhwdXgtY29yZS5sbyBcCi0JaXJpeC1jb3JlLmxvIFwKLQlseW54LWNvcmUubG8gXAotCW9zZi1jb3JlLmxvIFwKLQlzY281LWNvcmUubG8gXAotCXRyYWQtY29yZS5sbyBcCi0JY2lzY28tY29yZS5sbwotCi1PUFRJT05BTF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYWl4Mzg2LWNvcmUuYyBcCi0JaHB1eC1jb3JlLmMgXAotCWlyaXgtY29yZS5jIFwKLQlseW54LWNvcmUuYyBcCi0Jb3NmLWNvcmUuYyBcCi0Jc2NvNS1jb3JlLmMgXAotCXRyYWQtY29yZS5jIFwKLQljaXNjby1jb3JlLmMKLQotIyBUaGVzZSBhcmUgZGVmaW5lZCBieSBjb25maWd1cmUuaW46Ci1XT1JEU0laRSA9IEB3b3Jkc2l6ZUAKLUFMTF9CQUNLRU5EUyA9IEBhbGxfYmFja2VuZHNACi1CRkRfQkFDS0VORFMgPSBAYmZkX2JhY2tlbmRzQAotQkZEX01BQ0hJTkVTID0gQGJmZF9tYWNoaW5lc0AKLVRERUZBVUxUUyA9IEB0ZGVmYXVsdHNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSBASERFRklORVNAIEBDT1JFRkxBR0AgQFRERUZJTkVTQCAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCSQoQkZEX0xJQlNfQ0ZJTEVTKSBcCi0JJChBTExfTUFDSElORVNfQ0ZJTEVTKSBcCi0JJChCRkQzMl9CQUNLRU5EU19DRklMRVMpIFwKLQkkKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKQotCi0jIyBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgLmggZmlsZXMgd2hpY2ggYXJlIGluIHRoZSBzb3VyY2UgdHJlZS4KLVNPVVJDRV9IRklMRVMgPSBcCi0JYW91dC10YXJnZXQuaCBhb3V0ZjEuaCBhb3V0eC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0JZWNvZmZzd2FwLmggZWxmMzItYXJtLmggZWxmY29kZS5oIGVsZmNvcmUuaCBcCi0JZWxmbGluay5oIGZyZWVic2QuaCBnZW5saW5rLmggZ28zMnN0dWIuaCBsaWJhb3V0LmggXAotCWxpYmJmZC5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGVsZi1iZmQuaCBsaWJocHBhLmggbGliaWVlZS5oIFwKLQlsaWJubG0uaCBsaWJvYXN5cy5oIGxpYnBlaS5oIG5ldGJzZC5oIG5sbS10YXJnZXQuaCBubG1jb2RlLmggXAotCW5sbXN3YXAuaCBuczMyay5oIHBlaWNvZGUuaCBzb20uaCB2bXMuaAotCi1IRklMRVMgPSBcCi0JZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmggdGFyZ21hdGNoLmggXAotCSQoU09VUkNFX0hGSUxFUykKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChTT1VSQ0VfSEZJTEVTKQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1kaXN0c3R1ZmY6IGluZm8KLQotIyBWYXJpb3VzIGtpbmRzIG9mIC5vIGZpbGVzIHRvIHB1dCBpbiBsaWJiZmQuYToKLSMgQkZEX0JBQ0tFTkRTCVJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQkZEX01BQ0hJTkVTCUFyY2hpdGVjdHVyZS1zcGVjaWZpYyByb3V0aW5lcyB0aGUgY29uZmlndXJlZCB0YXJnZXRzIG5lZWQuCi0jIENPUkVGSUxFCUNvcmUgZmlsZSByb3V0aW5lcyBmb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbgotT0ZJTEVTID0gJChCRkRfQkFDS0VORFMpICQoQkZEX01BQ0hJTkVTKSBAQ09SRUZJTEVACi0KLXN0YW1wLW9maWxlczogTWFrZWZpbGUKLQlybSAtZiB0b2ZpbGVzCi0JZj0iIjsgXAotCWZvciBpIGluICQoT0ZJTEVTKSA7IGRvIFwKLQkgIGNhc2UgIiAkJGYgIiBpbiBcCi0JICAgICoiICQkaSAiKikgOzsgXAotCSAgICAqKSBmPSIkJGYgJCRpIiA7OyBcCi0JICBlc2FjIDsgXAotCWRvbmUgOyBcCi0JZWNobyAkJGYgPiB0b2ZpbGVzCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRvZmlsZXMgb2ZpbGVzCi0JdG91Y2ggc3RhbXAtb2ZpbGVzCi0KLW9maWxlczogc3RhbXAtb2ZpbGVzIDsgQHRydWUKLQotbGliYmZkX2xhX1NPVVJDRVMgPSAkKEJGRF9MSUJTX0NGSUxFUykKLWxpYmJmZF9sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykgb2ZpbGVzCi1saWJiZmRfbGFfTElCQUREID0gYGNhdCBvZmlsZXNgIEBXSU4zMkxJQkFEREAKLWxpYmJmZF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJiZmQuYS4gIFdlIGNyZWF0ZSBsaWJiZmQuYSBpbiB0aGUgYnVpbGQKLSMgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UKLSMgbGliYmZkLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpZgotIyBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJmZC5hCi1saWJiZmRfYV9TT1VSQ0VTID0KLQotc3RhbXAtbGliOiBsaWJiZmQubGEKLQlsaWJ0b29sZGlyPWAkKExJQlRPT0wpIC0tY29uZmlnIHwgc2VkIC1uIC1lICdzL15vYmpkaXI9Ly9wJ2A7IFwKLQlpZiBbIC1mICQkbGlidG9vbGRpci9saWJiZmQuYSBdOyB0aGVuIFwKLQkgIGNwICQkbGlidG9vbGRpci9saWJiZmQuYSBsaWJiZmQudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGliYmZkLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi0KLSMgVGhpcyBmaWxlIGhvbGRzIGFuIGFycmF5IGFzc29jaWF0aW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgYW5kCi0jIHZlY3RvciBuYW1lcy4gIEl0IGlzIGJ1aWx0IGZyb20gY29uZmlnLmJmZC4gIEl0IGlzIG5vdCBjb21waWxlZCBieQotIyBpdHNlbGYsIGJ1dCBpcyBpbmNsdWRlZCBieSB0YXJnZXRzLmMuCi10YXJnbWF0Y2guaDogY29uZmlnLmJmZCB0YXJnbWF0Y2guc2VkCi0Jcm0gLWYgdGFyZ21hdGNoLmgKLQlzZWQgLWYgJChzcmNkaXIpL3RhcmdtYXRjaC5zZWQgPCAkKHNyY2RpcikvY29uZmlnLmJmZCA+IHRhcmdtYXRjaC5uZXcKLQltdiAtZiB0YXJnbWF0Y2gubmV3IHRhcmdtYXRjaC5oCi0KLSMgV2hlbiBjb21waWxpbmcgYXJjaHVyZXMuYyBhbmQgdGFyZ2V0cy5jLCBzdXBwbHkgdGhlIGRlZmF1bHQgdGFyZ2V0Ci0jIGluZm8gZnJvbSBjb25maWd1cmUuCi0KLXRhcmdldHMubG86IHRhcmdldHMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvdGFyZ2V0cy5jCi0KLWFyY2h1cmVzLmxvOiBhcmNodXJlcy5jIGNvbmZpZy5zdGF0dXMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS9hcmNodXJlcy5jCi0KLWVsZjMyLXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKLQlybSAtZiBlbGYzMi10YXJnZXQuaAotCXNlZCAtZSBzL05OLzMyL2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGYzMi10YXJnZXQubmV3Ci0JbXYgLWYgZWxmMzItdGFyZ2V0Lm5ldyBlbGYzMi10YXJnZXQuaAotCi1lbGY2NC10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmNjQtdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi82NC9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmNjQtdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjY0LXRhcmdldC5uZXcgZWxmNjQtdGFyZ2V0LmgKLQotQkZEX0hfREVQUz0gJChJTkNESVIpL2Fuc2lkZWNsLmgKLUxPQ0FMX0hfREVQUz0gbGliYmZkLmggc3lzZGVwLmggY29uZmlnLmgKLSQoQkZEX0xJQlMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfTUFDSElORVMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChPUFRJT05BTF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0KLSMgSW5zdGFsbCBCRkQgaW5jbHVkZSBmaWxlLCBhbmQgb3RoZXJzIHRoYXQgaXQgbmVlZHMuCi1pbnN0YWxsLWRhdGEtbG9jYWw6ICQoQkZEX0gpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKGluY2x1ZGVkaXIpCi0JJChJTlNUQUxMX0RBVEEpICQoQkZEX0gpICQoaW5jbHVkZWRpcikvYmZkLmgKLQkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2Fuc2lkZWNsLmggJChpbmNsdWRlZGlyKS9hbnNpZGVjbC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9iZmRsaW5rLmggJChpbmNsdWRlZGlyKS9iZmRsaW5rLmgKLQotIyBIYXZlIHRvIGdldCByaWQgb2YgREVQMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotREVQOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgYmZkLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPERFUDEgPkRFUAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotIyBUaGUgTmV0QlNEIG1rZGVwIG92ZXJ3cml0ZXMgYW55IGV4aXN0aW5nIGZpbGUgY29udGVudHMsIGFuZCBkb2Vzbid0IGluc2VydAotIyB0aGUgIkRPIE5PVCBERUxFVEUiIGxpbmUuCi0jIE90aGVyIG1rZGVwIHZlcnNpb25zIHJlcXVpcmUgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMsIGFuZCBkbyBpbnNlcnQgaXQuCi0jIEhlbmNlIHRoZSB3ZWlyZG5lc3MuLi4uCi1ERVAxOiAkKENGSUxFUykKLQlybSAtZiBERVAyIERFUDJhCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JZWNobyA+IERFUDJhCi0JJChNS0RFUCkgLWYgREVQMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/Ci0Jc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IERFUDJhID4+IERFUDIKLQlybSAtZiBERVAyYQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVAyIERFUDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLWhvc3QtYW91dC5sbzogTWFrZWZpbGUKLQotIyBUaGUgZm9sbG93aW5nIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBzaW1wbGUgY29uZmlnIGZpbGUKLSMgd2hpY2ggY2FuIGJlIGZvbGRlZCBpbnRvIGFuIGgtWFhYIGZpbGUgZm9yIGEgbmV3IGhvc3QsIHdpdGggc29tZSBlZGl0aW5nLgotYW91dC1wYXJhbXMuaDogZ2VuLWFvdXQKLQkuL2dlbi1hb3V0IGhvc3QgPiBhb3V0LXBhcmFtcy5oCi1nZW4tYW91dDogJChzcmNkaXIpL2dlbi1hb3V0LmMgTWFrZWZpbGUKLQkkKENDKSAtbyBnZW4tYW91dCAkKENGTEFHUykgJChMRkxBR1MpICQoc3JjZGlyKS9nZW4tYW91dC5jCi0KLSQoQkZEX0gpOiBzdG1wLWJmZC1oIDsgQHRydWUKLQotc3RtcC1iZmQtaDogYmZkLWluMy5oCi0Jcm0gLWYgYmZkLXRtcC5oCi0JY3AgYmZkLWluMy5oIGJmZC10bXAuaAotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtdG1wLmggJChCRkRfSCkKLQlybSAtZiBiZmQtdG1wLmgKLQl0b3VjaCBzdG1wLWJmZC1oCi0KLUJGRF9IX0ZJTEVTID0gYmZkLWluLmggaW5pdC5jIG9wbmNscy5jIGxpYmJmZC5jIHNlY3Rpb24uYyBhcmNodXJlcy5jIFwKLQlyZWxvYy5jIHN5bXMuYyBiZmQuYyBhcmNoaXZlLmMgY29yZWZpbGUuYyB0YXJnZXRzLmMgZm9ybWF0LmMKLUxJQkJGRF9IX0ZJTEVTID0gbGliYmZkLWluLmggaW5pdC5jIGxpYmJmZC5jIGNhY2hlLmMgcmVsb2MuYyBhcmNodXJlcy5jIGVsZi5jCi1MSUJDT0ZGX0hfRklMRVMgPSBsaWJjb2ZmLWluLmggY29mZmNvZGUuaAotCi0jIENvdWxkIHJlYWxseSB1c2UgYSAiY29weS1pZi1jaGFuZ2UiLi4uCi1oZWFkZXJzOgotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgcHJvdG9zICQoRkxBR1NfVE9fUEFTUykpCi0JY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCi0JY3AgJChkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAotCi0jIFdlIG9ubHkgcmVidWlsZCB0aGUgaGVhZGVyIGZpbGVzIGF1dG9tYXRpY2FsbHkgaWYgd2UgaGF2ZSBiZWVuCi0jIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUuCi0KLSQoc3JjZGlyKS9iZmQtaW4yLmg6IEBNQUlOVEAgc3RtcC1iaW4yLWggOyBAdHJ1ZQotc3RtcC1iaW4yLWg6ICQoQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGJmZC5oKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCXRvdWNoIHN0bXAtYmluMi1oCi0KLSQoc3JjZGlyKS9saWJiZmQuaDogQE1BSU5UQCBzdG1wLWxiZmQtaCA7IEB0cnVlCi1zdG1wLWxiZmQtaDogJChMSUJCRkRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliYmZkLmgpCi0JY3AgJChkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JdG91Y2ggc3RtcC1sYmZkLWgKLQotJChzcmNkaXIpL2xpYmNvZmYuaDogQE1BSU5UQCBzdG1wLWxjb2ZmLWggOyBAdHJ1ZQotc3RtcC1sY29mZi1oOiAkKExJQkNPRkZfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliY29mZi5oKQotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQl0b3VjaCBzdG1wLWxjb2ZmLWgKLQotTU9TVExZQ0xFQU5GSUxFUyA9IGVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIG9maWxlcyBzdGFtcC1vZmlsZXMgXAotCXRhcmdtYXRjaC5oCi0KLUNMRUFORklMRVMgPSBiZmQuaCBkZXAuc2VkIHN0bXAtYmZkLWggREVQIERFUDEgbGliYmZkLmEgc3RhbXAtbGliIFwKLQlzdG1wLWJpbjItaCBzdG1wLWxiZmQtaCBzdG1wLWxjb2ZmLWgKLQotIyBXZSB3YW50IHRvIHJlcnVuIGNvbmZpZ3VyZSBpZiBjb25maWcuYmZkIG9yIGNvbmZpZ3VyZS5ob3N0IGNoYW5nZS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZy5iZmQgJChzcmNkaXIpL2NvbmZpZ3VyZS5ob3N0Ci0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0KLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgZWxmMzItYXJtLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWFyY2hpdmUubG86IGFyY2hpdmUuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYwotYmZkLmxvOiBiZmQuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotY2FjaGUubG86IGNhY2hlLmMKLWNvZmZnZW4ubG86IGNvZmZnZW4uYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWNvcmVmaWxlLmxvOiBjb3JlZmlsZS5jCi1mb3JtYXQubG86IGZvcm1hdC5jCi1pbml0LmxvOiBpbml0LmMKLWxpYmJmZC5sbzogbGliYmZkLmMKLW9wbmNscy5sbzogb3BuY2xzLmMgJChJTkNESVIpL29iamFsbG9jLmgKLXJlbG9jLmxvOiByZWxvYy5jICQoSU5DRElSKS9iZmRsaW5rLmgKLXNlY3Rpb24ubG86IHNlY3Rpb24uYyAkKElOQ0RJUikvYmZkbGluay5oCi1zeW1zLmxvOiBzeW1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXRhcmdldHMubG86IHRhcmdldHMuYyAkKElOQ0RJUikvZm5tYXRjaC5oIHRhcmdtYXRjaC5oCi1oYXNoLmxvOiBoYXNoLmMgJChJTkNESVIpL29iamFsbG9jLmgKLWxpbmtlci5sbzogbGlua2VyLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmgKLXNyZWMubG86IHNyZWMuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJpbmFyeS5sbzogYmluYXJ5LmMKLXRla2hleC5sbzogdGVraGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1paGV4LmxvOiBpaGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zdGFicy5sbzogc3RhYnMuYyAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdGFiLXN5bXMubG86IHN0YWItc3ltcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLWNwdS1hMjlrLmxvOiBjcHUtYTI5ay5jCi1jcHUtYWxwaGEubG86IGNwdS1hbHBoYS5jCi1jcHUtYXJjLmxvOiBjcHUtYXJjLmMKLWNwdS1hcm0ubG86IGNwdS1hcm0uYwotY3B1LWF2ci5sbzogY3B1LWF2ci5jCi1jcHUtZDEwdi5sbzogY3B1LWQxMHYuYwotY3B1LWQzMHYubG86IGNwdS1kMzB2LmMKLWNwdS1mcjMwLmxvOiBjcHUtZnIzMC5jCi1jcHUtaDgzMDAubG86IGNwdS1oODMwMC5jCi1jcHUtaDg1MDAubG86IGNwdS1oODUwMC5jCi1jcHUtaHBwYS5sbzogY3B1LWhwcGEuYwotY3B1LWkzODYubG86IGNwdS1pMzg2LmMKLWNwdS1pODYwLmxvOiBjcHUtaTg2MC5jCi1jcHUtaTk2MC5sbzogY3B1LWk5NjAuYwotY3B1LW0zMnIubG86IGNwdS1tMzJyLmMKLWNwdS1tNjhrLmxvOiBjcHUtbTY4ay5jCi1jcHUtbTg4ay5sbzogY3B1LW04OGsuYwotY3B1LW0xMDIwMC5sbzogY3B1LW0xMDIwMC5jCi1jcHUtbTEwMzAwLmxvOiBjcHUtbTEwMzAwLmMKLWNwdS1tY29yZS5sbzogY3B1LW1jb3JlLmMKLWNwdS1taXBzLmxvOiBjcHUtbWlwcy5jCi1jcHUtbnMzMmsubG86IGNwdS1uczMyay5jIG5zMzJrLmgKLWNwdS1wai5sbzogY3B1LXBqLmMKLWNwdS1wb3dlcnBjLmxvOiBjcHUtcG93ZXJwYy5jCi1jcHUtcnM2MDAwLmxvOiBjcHUtcnM2MDAwLmMKLWNwdS1zaC5sbzogY3B1LXNoLmMKLWNwdS1zcGFyYy5sbzogY3B1LXNwYXJjLmMKLWNwdS10aWMzMC5sbzogY3B1LXRpYzMwLmMKLWNwdS10aWM4MC5sbzogY3B1LXRpYzgwLmMKLWNwdS12ODUwLmxvOiBjcHUtdjg1MC5jCi1jcHUtdmF4LmxvOiBjcHUtdmF4LmMKLWNwdS13ZTMyay5sbzogY3B1LXdlMzJrLmMKLWNwdS13NjUubG86IGNwdS13NjUuYwotY3B1LXo4ay5sbzogY3B1LXo4ay5jCi1hb3V0LWFkb2JlLmxvOiBhb3V0LWFkb2JlLmMgJChJTkNESVIpL2FvdXQvYWRvYmUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotYW91dC1hcm0ubG86IGFvdXQtYXJtLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0eC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLWFvdXQtbnMzMmsubG86IGFvdXQtbnMzMmsuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gIG5zMzJrLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtc3BhcmNsZS5sbzogYW91dC1zcGFyY2xlLmMgJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxpYmFvdXQuaCBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1hb3V0LXRpYzMwLmxvOiBhb3V0LXRpYzMwLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0eC5oCi1hb3V0MC5sbzogYW91dDAuYyBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1hb3V0MzIubG86IGFvdXQzMi5jIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaAotYXJtbmV0YnNkLmxvOiBhcm1uZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWJvdXQubG86IGJvdXQuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCAkKElOQ0RJUikvYm91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmgKLWNmLWkzODZseW54LmxvOiBjZi1pMzg2bHlueC5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLW02OGtseW54LmxvOiBjZi1tNjhrbHlueC5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLXNwYXJjbHlueC5sbzogY2Ytc3BhcmNseW54LmMgY29mZi1zcGFyYy5jICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWEyOWsubG86IGNvZmYtYTI5ay5jICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWFwb2xsby5sbzogY29mZi1hcG9sbG8uYyAkKElOQ0RJUikvY29mZi9hcG9sbG8uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXJtLmxvOiBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXV4LmxvOiBjb2ZmLWF1eC5jICQoSU5DRElSKS9jb2ZmL2F1eC1jb2ZmLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL202OGsuaCBjb2ZmLW02OGsuYyBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1oODMwMC5sbzogY29mZi1oODMwMC5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1oODUwMC5sbzogY29mZi1oODUwMC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pMzg2LmxvOiBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pODYwLmxvOiBjb2ZmLWk4NjAuYyAkKElOQ0RJUikvY29mZi9pODYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1nbzMyLmxvOiBjb2ZmLWdvMzIuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk5NjAubG86IGNvZmYtaTk2MC5jICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW02OGsubG86IGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW04OGsubG86IGNvZmYtbTg4ay5jICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW1pcHMubG86IGNvZmYtbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL21pcHMuaCBsaWJjb2ZmLmggbGliZWNvZmYuaCBjb2Zmc3dhcC5oIFwKLSAgZWNvZmZzd2FwLmgKLWNvZmYtcG1hYy5sbzogY29mZi1wbWFjLmMgY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtcnM2MDAwLmxvOiBjb2ZmLXJzNjAwMC5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zaC5sbzogY29mZi1zaC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zcGFyYy5sbzogY29mZi1zcGFyYy5jICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXN0Z28zMi5sbzogY29mZi1zdGdvMzIuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2dvMzJleGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0gIGdvMzJzdHViLmgKLWNvZmYtc3ZtNjhrLmxvOiBjb2ZmLXN2bTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljMzAubG86IGNvZmYtdGljMzAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljODAubG86IGNvZmYtdGljODAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdTY4ay5sbzogY29mZi11NjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13ZTMyay5sbzogY29mZi13ZTMyay5jICQoSU5DRElSKS9jb2ZmL3dlMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXc2NS5sbzogY29mZi13NjUuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3c2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXo4ay5sbzogY29mZi16OGsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3o4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmbGluay5sbzogY29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmgKLWR3YXJmMS5sbzogZHdhcmYxLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9kd2FyZi5oCi1kd2FyZjIubG86IGR3YXJmMi5jICQoSU5DRElSKS9saWJpYmVydHkuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKLWVjb2ZmLmxvOiBlY29mZi5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oCi1lY29mZmxpbmsubG86IGVjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29iamFsbG9jLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaAotZWxmLmxvOiBlbGYuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotZWxmMzItYXJjLmxvOiBlbGYzMi1hcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmYXJtLW9hYmkubG86IGVsZmFybS1vYWJpLmMgJChJTkNESVIpL2VsZi9hcm0tb2FiaS5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLWFybS5oIGVsZjMyLXRhcmdldC5oCi1lbGZhcm0tbmFiaS5sbzogZWxmYXJtLW5hYmkuYyAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYzMi1hcm0uaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1hdnIubG86IGVsZjMyLWF2ci5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hdnIuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1kMTB2LmxvOiBlbGYzMi1kMTB2LmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZDMwdi5sbzogZWxmMzItZDMwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWZyMzAubG86IGVsZjMyLWZyMzAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvZnIzMC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWdlbi5sbzogZWxmMzItZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItaTM3MC5sbzogZWxmMzItaTM3MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWkzODYubG86IGVsZjMyLWkzODYuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWk4NjAubG86IGVsZjMyLWk4NjAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pOTYwLmxvOiBlbGYzMi1pOTYwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2k5NjAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tMzJyLmxvOiBlbGYzMi1tMzJyLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL20zMnIuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tNjhrLmxvOiBlbGYzMi1tNjhrLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL202OGsuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tODhrLmxvOiBlbGYzMi1tODhrLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmLW0xMDIwMC5sbzogZWxmLW0xMDIwMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZi1tMTAzMDAubG86IGVsZi1tMTAzMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvbW4xMDMwMC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbWNvcmUubG86IGVsZjMyLW1jb3JlLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL21jb3JlLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1taXBzLmxvOiBlbGYzMi1taXBzLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvbWlwcy5oIGVjb2Zmc3dhcC5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXBqLmxvOiBlbGYzMi1wai5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9wai5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXBwYy5sbzogZWxmMzItcHBjLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXNoLmxvOiBlbGYzMi1zaC5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9zaC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXNwYXJjLmxvOiBlbGYzMi1zcGFyYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItdjg1MC5sbzogZWxmMzItdjg1MC5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi92ODUwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzIubG86IGVsZjMyLmMgZWxmY29kZS5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgZWxmY29yZS5oIGVsZmxpbmsuaAotZWxmbGluay5sbzogZWxmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1lcG9jLXBlLWFybS5sbzogZXBvYy1wZS1hcm0uYyBwZS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLWVwb2MtcGVpLWFybS5sbzogZXBvYy1wZWktYXJtLmMgcGVpLWFybS5jIGNvZmYtYXJtLmMgXAotICAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBcCi0gIGxpYnBlaS5oCi1ocDMwMGJzZC5sbzogaHAzMDBic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWhwMzAwaHB1eC5sbzogaHAzMDBocHV4LmMgJChJTkNESVIpL2FvdXQvaHAzMDBocHV4LmggXAotICBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotc29tLmxvOiBzb20uYwotaTM4NmFvdXQubG86IGkzODZhb3V0LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2YnNkLmxvOiBpMzg2YnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2ZHluaXgubG86IGkzODZkeW5peC5jICQoSU5DRElSKS9hb3V0L2R5bml4My5oIGFvdXR4LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWkzODZmcmVlYnNkLmxvOiBpMzg2ZnJlZWJzZC5jIGZyZWVic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZsaW51eC5sbzogaTM4NmxpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1pMzg2bHlueC5sbzogaTM4Nmx5bnguYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZtc2Rvcy5sbzogaTM4Nm1zZG9zLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWkzODZuZXRic2QubG86IGkzODZuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZtYWNoMy5sbzogaTM4Nm1hY2gzLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1pMzg2b3M5ay5sbzogaTM4Nm9zOWsuYyAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9vczlrLmgKLWllZWUubG86IGllZWUuYyAkKElOQ0RJUikvaWVlZS5oIGxpYmllZWUuaAotbTY4azRrbmV0YnNkLmxvOiBtNjhrNGtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW02OGtsaW51eC5sbzogbTY4a2xpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1tNjhrbHlueC5sbzogbTY4a2x5bnguYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW02OGtuZXRic2QubG86IG02OGtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW04OGttYWNoMy5sbzogbTg4a21hY2gzLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1taXBzYnNkLmxvOiBtaXBzYnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1uZXdzb3MzLmxvOiBuZXdzb3MzLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1ubG0ubG86IG5sbS5jIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1ubG0zMi1pMzg2LmxvOiBubG0zMi1pMzg2LmMgJChJTkNESVIpL25sbS9pMzg2LWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzItc3BhcmMubG86IG5sbTMyLXNwYXJjLmMgJChJTkNESVIpL25sbS9zcGFyYzMyLWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzItcHBjLmxvOiBubG0zMi1wcGMuYyAkKElOQ0RJUikvbmxtL3BwYy1leHQuaCBsaWJubG0uaCBcCi0gICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBcCi0gIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLmxvOiBubG0zMi5jIG5sbWNvZGUuaCBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAotbnMzMmtuZXRic2QubG86IG5zMzJrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1vYXN5cy5sbzogb2FzeXMuYyAkKElOQ0RJUikvb2FzeXMuaCBsaWJvYXN5cy5oCi1wYzUzMi1tYWNoLmxvOiBwYzUzMi1tYWNoLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1wZS1hcm0ubG86IHBlLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLWFybS5sbzogcGVpLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGUtaTM4Ni5sbzogcGUtaTM4Ni5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktaTM4Ni5sbzogcGVpLWkzODYuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGUtbWlwcy5sbzogcGUtbWlwcy5jICQoSU5DRElSKS9jb2ZmL21pcHNwZS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggXAotICBwZWljb2RlLmgKLXBlaS1taXBzLmxvOiBwZWktbWlwcy5jIHBlLW1pcHMuYyAkKElOQ0RJUikvY29mZi9taXBzcGUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZS1tY29yZS5sbzogcGUtbWNvcmUuYyBjb2ZmLW1jb3JlLmMgJChJTkNESVIpL2NvZmYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktbWNvcmUubG86IHBlaS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLXBwYy5sbzogcGUtcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLXBwYy5sbzogcGVpLXBwYy5jIGNvZmYtcHBjLmMgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLXNoLmxvOiBwZS1zaC5jIGNvZmYtc2guYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3NoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlaS1zaC5sbzogcGVpLXNoLmMgY29mZi1zaC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGVpZ2VuLmxvOiBwZWlnZW4uYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggbGlicGVpLmgKLXBwY2Jvb3QubG86IHBwY2Jvb3QuYwotcmVsb2MxNi5sbzogcmVsb2MxNi5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmgKLXJpc2NpeC5sbzogcmlzY2l4LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1zcGFyY2xpbnV4LmxvOiBzcGFyY2xpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1zcGFyY2x5bngubG86IHNwYXJjbHlueC5jICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXNwYXJjbmV0YnNkLmxvOiBzcGFyY25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotc3Vub3MubG86IHN1bm9zLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggYW91dGYxLmggXAotICAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotdmF4bmV0YnNkLmxvOiB2YXhuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXZlcnNhZG9zLmxvOiB2ZXJzYWRvcy5jICQoSU5DRElSKS9saWJpYmVydHkuaAotdm1zLmxvOiB2bXMuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtZ3NkLmxvOiB2bXMtZ3NkLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWhkci5sbzogdm1zLWhkci5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1taXNjLmxvOiB2bXMtbWlzYy5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy10aXIubG86IHZtcy10aXIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi14Y29mZmxpbmsubG86IHhjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotYW91dDY0LmxvOiBhb3V0NjQuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWNvZmYtYWxwaGEubG86IGNvZmYtYWxwaGEuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9hbHBoYS5oICQoSU5DRElSKS9hb3V0L2FyLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCBjb2Zmc3dhcC5oIGVjb2Zmc3dhcC5oCi1kZW1vNjQubG86IGRlbW82NC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotZWxmNjQtYWxwaGEubG86IGVsZjY0LWFscGhhLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmggZWNvZmZzd2FwLmggZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LWdlbi5sbzogZWxmNjQtZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtbWlwcy5sbzogZWxmNjQtbWlwcy5jICQoSU5DRElSKS9hb3V0L2FyLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1zcGFyYy5sbzogZWxmNjQtc3BhcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LmxvOiBlbGY2NC5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLW5sbTMyLWFscGhhLmxvOiBubG0zMi1hbHBoYS5jICQoSU5DRElSKS9ubG0vYWxwaGEtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG02NC5sbzogbmxtNjQuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLWFpeDM4Ni1jb3JlLmxvOiBhaXgzODYtY29yZS5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWhwdXgtY29yZS5sbzogaHB1eC1jb3JlLmMKLWlyaXgtY29yZS5sbzogaXJpeC1jb3JlLmMKLWx5bngtY29yZS5sbzogbHlueC1jb3JlLmMKLW9zZi1jb3JlLmxvOiBvc2YtY29yZS5jCi1zY281LWNvcmUubG86IHNjbzUtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi10cmFkLWNvcmUubG86IHRyYWQtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgaG9zdHMvaTM4NmxpbnV4LmgKLWNpc2NvLWNvcmUubG86IGNpc2NvLWNvcmUuYwotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9iZmQvTWFrZWZpbGUuaW4gYi9iZmQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMmVjZGEuLjAwMDAwMDAKLS0tIGEvYmZkL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTY2NSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQkZEX0hPU1RfNjRCSVRfTE9ORyA9IEBCRkRfSE9TVF82NEJJVF9MT05HQAotQkZEX0hPU1RfNjRfQklUID0gQEJGRF9IT1NUXzY0X0JJVEAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEID0gQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotQkZEX0hPU1RfVV82NF9CSVQgPSBAQkZEX0hPU1RfVV82NF9CSVRACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1DT1JFRklMRSA9IEBDT1JFRklMRUAKLUNPUkVGTEFHID0gQENPUkVGTEFHQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVERFRklORVMgPSBAVERFRklORVNACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACi1XSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKLWFsbF9iYWNrZW5kcyA9IEBhbGxfYmFja2VuZHNACi1iZmRfYmFja2VuZHMgPSBAYmZkX2JhY2tlbmRzQAotYmZkX21hY2hpbmVzID0gQGJmZF9tYWNoaW5lc0AKLWwgPSBAbEAKLXRkZWZhdWx0cyA9IEB0ZGVmYXVsdHNACi13b3Jkc2l6ZSA9IEB3b3Jkc2l6ZUAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSSQoSU5DRElSKQotTUtERVAgPSBta2RlcAotCi1TVUJESVJTID0gZG9jIHBvCi0KLWRvY2RpciA9IGRvYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKLQotIyBiZmQuaCBnb2VzIGhlcmUsIGZvciBub3cKLUJGRF9IID0gYmZkLmgKLQotIyBKaW0gS2luZ2RvbiBub3RlczoKLSMgV3JpdGluZyBTLXJlY29yZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCAob3IgYXQgbGVhc3QgbW9zdCkKLSMgKi0qLWNvZmYsICotKi1hb3V0LCBldGMuLCBjb25maWd1cmF0aW9ucywgYmVjYXVzZSBwZW9wbGUgd2lsbCB3YW50IHRvCi0jIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gY3JlYXRlIFMtcmVjb3Jkcy4gIChTLXJlY29yZHMgYXJlIG5vdCB1c2VmdWwKLSMgZm9yIHRoZSBkZWJ1Z2dlciwgc28gaWYgeW91IGFyZSBkb3dubG9hZGluZyB0aGluZ3MgYXMgUy1yZWNvcmRzIHlvdQotIyBuZWVkIHR3byBjb3BpZXMgb2YgdGhlIGV4ZWN1dGFibGUsIG9uZSB0byBkb3dubG9hZCBhbmQgb25lIGZvciB0aGUKLSMgZGVidWdnZXIpLgotQkZEX0xJQlMgPSBcCi0JYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBjb3JlZmlsZS5sbyBcCi0JZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBcCi0Jc2VjdGlvbi5sbyBzeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gXAotCXNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotCi0KLUJGRF9MSUJTX0NGSUxFUyA9IFwKLQlhcmNoaXZlLmMgYXJjaHVyZXMuYyBiZmQuYyBjYWNoZS5jIGNvZmZnZW4uYyBjb3JlZmlsZS5jIFwKLQlmb3JtYXQuYyBpbml0LmMgbGliYmZkLmMgb3BuY2xzLmMgcmVsb2MuYyBcCi0Jc2VjdGlvbi5jIHN5bXMuYyB0YXJnZXRzLmMgaGFzaC5jIGxpbmtlci5jIFwKLQlzcmVjLmMgYmluYXJ5LmMgdGVraGV4LmMgaWhleC5jIHN0YWJzLmMgc3RhYi1zeW1zLmMKLQotCi0jIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jCi0jIHdpdGggdGhlIGRlY2xzIGFuZCBpbml0aWFsaXplciBpbiBhcmNodXJlcy5jLgotQUxMX01BQ0hJTkVTID0gXAotCWNwdS1hMjlrLmxvIFwKLQljcHUtYWxwaGEubG8gXAotCWNwdS1hcmMubG8gXAotCWNwdS1hcm0ubG8gXAotCWNwdS1hdnIubG8gXAotCWNwdS1kMTB2LmxvIFwKLQljcHUtZDMwdi5sbyBcCi0JY3B1LWZyMzAubG8gXAotCWNwdS1oODMwMC5sbyBcCi0JY3B1LWg4NTAwLmxvIFwKLQljcHUtaHBwYS5sbyBcCi0JY3B1LWkzNzAubG8gXAotCWNwdS1pMzg2LmxvIFwKLQljcHUtaTg2MC5sbyBcCi0JY3B1LWk5NjAubG8gXAotCWNwdS1tMzJyLmxvIFwKLQljcHUtbTY4ay5sbyBcCi0JY3B1LW04OGsubG8gXAotCWNwdS1tMTAyMDAubG8gXAotCWNwdS1tMTAzMDAubG8gXAotCWNwdS1tY29yZS5sbyBcCi0JY3B1LW1pcHMubG8gXAotCWNwdS1uczMyay5sbyBcCi0JY3B1LXBqLmxvIFwKLQljcHUtcG93ZXJwYy5sbyBcCi0JY3B1LXJzNjAwMC5sbyBcCi0JY3B1LXNoLmxvIFwKLQljcHUtc3BhcmMubG8gXAotCWNwdS10aWMzMC5sbyBcCi0JY3B1LXRpYzgwLmxvIFwKLQljcHUtdjg1MC5sbyBcCi0JY3B1LXZheC5sbyBcCi0JY3B1LXdlMzJrLmxvIFwKLQljcHUtdzY1LmxvIFwKLQljcHUtejhrLmxvCi0KLQotQUxMX01BQ0hJTkVTX0NGSUxFUyA9IFwKLQljcHUtYTI5ay5jIFwKLQljcHUtYWxwaGEuYyBcCi0JY3B1LWFyYy5jIFwKLQljcHUtYXJtLmMgXAotCWNwdS1hdnIuYyBcCi0JY3B1LWQxMHYuYyBcCi0JY3B1LWQzMHYuYyBcCi0JY3B1LWZyMzAuYyBcCi0JY3B1LWg4MzAwLmMgXAotCWNwdS1oODUwMC5jIFwKLQljcHUtaHBwYS5jIFwKLQljcHUtaTM3MC5jIFwKLQljcHUtaTM4Ni5jIFwKLQljcHUtaTg2MC5jIFwKLQljcHUtaTk2MC5jIFwKLQljcHUtbTMyci5jIFwKLQljcHUtbTY4ay5jIFwKLQljcHUtbTg4ay5jIFwKLQljcHUtbTEwMjAwLmMgXAotCWNwdS1tMTAzMDAuYyBcCi0JY3B1LW1jb3JlLmMgXAotCWNwdS1taXBzLmMgXAotCWNwdS1uczMyay5jIFwKLQljcHUtcGouYyBcCi0JY3B1LXBvd2VycGMuYyBcCi0JY3B1LXJzNjAwMC5jIFwKLQljcHUtc2guYyBcCi0JY3B1LXNwYXJjLmMgXAotCWNwdS10aWMzMC5jIFwKLQljcHUtdGljODAuYyBcCi0JY3B1LXY4NTAuYyBcCi0JY3B1LXZheC5jIFwKLQljcHUtd2UzMmsuYyBcCi0JY3B1LXc2NS5jIFwKLQljcHUtejhrLmMKLQotCi0jIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSAzMiBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KLSMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsLgotQkZEMzJfQkFDS0VORFMgPSBcCi0JYW91dC1hZG9iZS5sbyBcCi0JYW91dC1hcm0ubG8gXAotCWFvdXQtbnMzMmsubG8gXAotCWFvdXQtc3BhcmNsZS5sbyBcCi0JYW91dC10aWMzMC5sbyBcCi0JYW91dDAubG8gXAotCWFvdXQzMi5sbyBcCi0JYXJtbmV0YnNkLmxvIFwKLQlib3V0LmxvIFwKLQljZi1pMzg2bHlueC5sbyBcCi0JY2YtbTY4a2x5bngubG8gXAotCWNmLXNwYXJjbHlueC5sbyBcCi0JY29mZi1hMjlrLmxvIFwKLQljb2ZmLWFwb2xsby5sbyBcCi0JY29mZi1hcm0ubG8gXAotCWNvZmYtYXV4LmxvIFwKLQljb2ZmLWg4MzAwLmxvIFwKLQljb2ZmLWg4NTAwLmxvIFwKLQljb2ZmLWkzODYubG8gXAotCWNvZmYtZ28zMi5sbyBcCi0JY29mZi1pODYwLmxvIFwKLQljb2ZmLWk5NjAubG8gXAotCWNvZmYtbTY4ay5sbyBcCi0JY29mZi1tODhrLmxvIFwKLQljb2ZmLW1pcHMubG8gXAotCWNvZmYtcG1hYy5sbyBcCi0JY29mZi1yczYwMDAubG8gXAotCWNvZmYtc2gubG8gXAotCWNvZmYtc3BhcmMubG8gXAotCWNvZmYtc3RnbzMyLmxvIFwKLQljb2ZmLXN2bTY4ay5sbyBcCi0JY29mZi10aWMzMC5sbyBcCi0JY29mZi10aWM4MC5sbyBcCi0JY29mZi11NjhrLmxvIFwKLQljb2ZmLXdlMzJrLmxvIFwKLQljb2ZmLXc2NS5sbyBcCi0JY29mZi16OGsubG8gXAotCWNvZmZsaW5rLmxvIFwKLQlkd2FyZjEubG8gXAotCWR3YXJmMi5sbyBcCi0JZWNvZmYubG8gXAotCWVjb2ZmbGluay5sbyBcCi0JZWxmLmxvIFwKLQllbGYzMi1hcmMubG8gXAotCWVsZmFybS1vYWJpLmxvIFwKLQllbGZhcm0tbmFiaS5sbyBcCi0JZWxmMzItYXZyLmxvIFwKLQllbGYzMi1kMTB2LmxvIFwKLQllbGYzMi1kMzB2LmxvIFwKLQllbGYzMi1mcjMwLmxvIFwKLQllbGYzMi1nZW4ubG8gXAotCWVsZjMyLWkzNzAubG8gXAotCWVsZjMyLWkzODYubG8gXAotCWVsZjMyLWk4NjAubG8gXAotCWVsZjMyLWk5NjAubG8gXAotCWVsZjMyLW0zMnIubG8gXAotCWVsZjMyLW02OGsubG8gXAotCWVsZjMyLW04OGsubG8gXAotCWVsZi1tMTAyMDAubG8gXAotCWVsZi1tMTAzMDAubG8gXAotCWVsZjMyLW1jb3JlLmxvIFwKLQllbGYzMi1taXBzLmxvIFwKLQllbGYzMi1wai5sbyBcCi0JZWxmMzItcHBjLmxvIFwKLQllbGYzMi1zaC5sbyBcCi0JZWxmMzItc3BhcmMubG8gXAotCWVsZjMyLXY4NTAubG8gXAotCWVsZjMyLmxvIFwKLQllbGZsaW5rLmxvIFwKLQllcG9jLXBlLWFybS5sbyBcCi0JZXBvYy1wZWktYXJtLmxvIFwKLQlocDMwMGJzZC5sbyBcCi0JaHAzMDBocHV4LmxvIFwKLQlzb20ubG8gXAotCWkzODZhb3V0LmxvIFwKLQlpMzg2YnNkLmxvIFwKLQlpMzg2ZHluaXgubG8gXAotCWkzODZmcmVlYnNkLmxvIFwKLQlpMzg2bGludXgubG8gXAotCWkzODZseW54LmxvIFwKLQlpMzg2bXNkb3MubG8gXAotCWkzODZuZXRic2QubG8gXAotCWkzODZtYWNoMy5sbyBcCi0JaTM4Nm9zOWsubG8gXAotCWllZWUubG8gXAotCW02OGs0a25ldGJzZC5sbyBcCi0JbTY4a2xpbnV4LmxvIFwKLQltNjhrbHlueC5sbyBcCi0JbTY4a25ldGJzZC5sbyBcCi0JbTg4a21hY2gzLmxvIFwKLQltaXBzYnNkLmxvIFwKLQluZXdzb3MzLmxvIFwKLQlubG0ubG8gXAotCW5sbTMyLWkzODYubG8gXAotCW5sbTMyLXNwYXJjLmxvIFwKLQlubG0zMi1wcGMubG8gXAotCW5sbTMyLmxvIFwKLQluczMya25ldGJzZC5sbyBcCi0Jb2FzeXMubG8gXAotCXBjNTMyLW1hY2gubG8gXAotCXBlLWFybS5sbyBcCi0JcGVpLWFybS5sbyBcCi0JcGUtaTM4Ni5sbyBcCi0JcGVpLWkzODYubG8gXAotCXBlLW1jb3JlLmxvIFwKLQlwZWktbWNvcmUubG8gXAotCXBlLXBwYy5sbyBcCi0JcGVpLXBwYy5sbyBcCi0JcGUtc2gubG8gXAotCXBlaS1zaC5sbyBcCi0JcGUtbWlwcy5sbyBcCi0JcGVpLW1pcHMubG8gXAotCXBlaWdlbi5sbyBcCi0JcHBjYm9vdC5sbyBcCi0JcmVsb2MxNi5sbyBcCi0JcmlzY2l4LmxvIFwKLQlzcGFyY2xpbnV4LmxvIFwKLQlzcGFyY2x5bngubG8gXAotCXNwYXJjbmV0YnNkLmxvIFwKLQlzdW5vcy5sbyBcCi0JdmF4bmV0YnNkLmxvIFwKLQl2ZXJzYWRvcy5sbyBcCi0Jdm1zLmxvIFwKLQl2bXMtZ3NkLmxvIFwKLQl2bXMtaGRyLmxvIFwKLQl2bXMtbWlzYy5sbyBcCi0Jdm1zLXRpci5sbyBcCi0JeGNvZmZsaW5rLmxvCi0KLQotQkZEMzJfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQtYWRvYmUuYyBcCi0JYW91dC1hcm0uYyBcCi0JYW91dC1uczMyay5jIFwKLQlhb3V0LXNwYXJjbGUuYyBcCi0JYW91dC10aWMzMC5jIFwKLQlhb3V0MC5jIFwKLQlhb3V0MzIuYyBcCi0JYXJtbmV0YnNkLmMgXAotCWJvdXQuYyBcCi0JY2YtaTM4Nmx5bnguYyBcCi0JY2YtbTY4a2x5bnguYyBcCi0JY2Ytc3BhcmNseW54LmMgXAotCWNvZmYtYTI5ay5jIFwKLQljb2ZmLWFwb2xsby5jIFwKLQljb2ZmLWFybS5jIFwKLQljb2ZmLWF1eC5jIFwKLQljb2ZmLWg4MzAwLmMgXAotCWNvZmYtaDg1MDAuYyBcCi0JY29mZi1pMzg2LmMgXAotCWNvZmYtaTg2MC5jIFwKLQljb2ZmLWdvMzIuYyBcCi0JY29mZi1pOTYwLmMgXAotCWNvZmYtbTY4ay5jIFwKLQljb2ZmLW04OGsuYyBcCi0JY29mZi1taXBzLmMgXAotCWNvZmYtcG1hYy5jIFwKLQljb2ZmLXJzNjAwMC5jIFwKLQljb2ZmLXNoLmMgXAotCWNvZmYtc3BhcmMuYyBcCi0JY29mZi1zdGdvMzIuYyBcCi0JY29mZi1zdm02OGsuYyBcCi0JY29mZi10aWMzMC5jIFwKLQljb2ZmLXRpYzgwLmMgXAotCWNvZmYtdTY4ay5jIFwKLQljb2ZmLXdlMzJrLmMgXAotCWNvZmYtdzY1LmMgXAotCWNvZmYtejhrLmMgXAotCWNvZmZsaW5rLmMgXAotCWR3YXJmMS5jIFwKLQlkd2FyZjIuYyBcCi0JZWNvZmYuYyBcCi0JZWNvZmZsaW5rLmMgXAotCWVsZi5jIFwKLQllbGYzMi1hcmMuYyBcCi0JZWxmYXJtLW9hYmkuYyBcCi0JZWxmYXJtLW5hYmkuYyBcCi0JZWxmMzItYXZyLmMgXAotCWVsZjMyLWQxMHYuYyBcCi0JZWxmMzItZDMwdi5jIFwKLQllbGYzMi1mcjMwLmMgXAotCWVsZjMyLWdlbi5jIFwKLQllbGYzMi1pMzcwLmMgXAotCWVsZjMyLWkzODYuYyBcCi0JZWxmMzItaTg2MC5jIFwKLQllbGYzMi1pOTYwLmMgXAotCWVsZjMyLW0zMnIuYyBcCi0JZWxmMzItbTY4ay5jIFwKLQllbGYzMi1tODhrLmMgXAotCWVsZi1tMTAyMDAuYyBcCi0JZWxmLW0xMDMwMC5jIFwKLQllbGYzMi1tY29yZS5jIFwKLQllbGYzMi1taXBzLmMgXAotCWVsZjMyLXBqLmMgXAotCWVsZjMyLXBwYy5jIFwKLQllbGYzMi1zaC5jIFwKLQllbGYzMi1zcGFyYy5jIFwKLQllbGYzMi12ODUwLmMgXAotCWVsZjMyLmMgXAotCWVsZmxpbmsuYyBcCi0JZXBvYy1wZS1hcm0uYyBcCi0JZXBvYy1wZWktYXJtLmMgXAotCWhwMzAwYnNkLmMgXAotCWhwMzAwaHB1eC5jIFwKLQlzb20uYyBcCi0JaTM4NmFvdXQuYyBcCi0JaTM4NmJzZC5jIFwKLQlpMzg2ZHluaXguYyBcCi0JaTM4NmZyZWVic2QuYyBcCi0JaTM4NmxpbnV4LmMgXAotCWkzODZseW54LmMgXAotCWkzODZtc2Rvcy5jIFwKLQlpMzg2bmV0YnNkLmMgXAotCWkzODZtYWNoMy5jIFwKLQlpMzg2b3M5ay5jIFwKLQlpZWVlLmMgXAotCW02OGs0a25ldGJzZC5jIFwKLQltNjhrbGludXguYyBcCi0JbTY4a2x5bnguYyBcCi0JbTY4a25ldGJzZC5jIFwKLQltODhrbWFjaDMuYyBcCi0JbWlwc2JzZC5jIFwKLQluZXdzb3MzLmMgXAotCW5sbS5jIFwKLQlubG0zMi1pMzg2LmMgXAotCW5sbTMyLXNwYXJjLmMgXAotCW5sbTMyLXBwYy5jIFwKLQlubG0zMi5jIFwKLQluczMya25ldGJzZC5jIFwKLQlvYXN5cy5jIFwKLQlwYzUzMi1tYWNoLmMgXAotCXBlLWFybS5jIFwKLQlwZWktYXJtLmMgXAotCXBlLWkzODYuYyBcCi0JcGVpLWkzODYuYyBcCi0JcGUtbWNvcmUuYyBcCi0JcGVpLW1jb3JlLmMgXAotCXBlLXBwYy5jIFwKLQlwZWktcHBjLmMgXAotCXBlLXNoLmMgXAotCXBlaS1zaC5jIFwKLQlwZS1taXBzLmMgXAotCXBlaS1taXBzLmMgXAotCXBlaWdlbi5jIFwKLQlwcGNib290LmMgXAotCXJlbG9jMTYuYyBcCi0JcmlzY2l4LmMgXAotCXNwYXJjbGludXguYyBcCi0Jc3BhcmNseW54LmMgXAotCXNwYXJjbmV0YnNkLmMgXAotCXN1bm9zLmMgXAotCXZheG5ldGJzZC5jIFwKLQl2ZXJzYWRvcy5jIFwKLQl2bXMuYyBcCi0Jdm1zLWdzZC5jIFwKLQl2bXMtaGRyLmMgXAotCXZtcy1taXNjLmMgXAotCXZtcy10aXIuYyBcCi0JeGNvZmZsaW5rLmMKLQotCi0jIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSA2NCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KLSMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsCi0jIGFuZCAtLWVuYWJsZS02NC1iaXQtYmZkLgotQkZENjRfQkFDS0VORFMgPSBcCi0JYW91dDY0LmxvIFwKLQljb2ZmLWFscGhhLmxvIFwKLQlkZW1vNjQubG8gXAotCWVsZjY0LWFscGhhLmxvIFwKLQllbGY2NC1nZW4ubG8gXAotCWVsZjY0LW1pcHMubG8gXAotCWVsZjY0LXNwYXJjLmxvIFwKLQllbGY2NC5sbyBcCi0JbmxtMzItYWxwaGEubG8gXAotCW5sbTY0LmxvCi0KLQotQkZENjRfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQ2NC5jIFwKLQljb2ZmLWFscGhhLmMgXAotCWRlbW82NC5jIFwKLQllbGY2NC1hbHBoYS5jIFwKLQllbGY2NC1nZW4uYyBcCi0JZWxmNjQtbWlwcy5jIFwKLQllbGY2NC1zcGFyYy5jIFwKLQllbGY2NC5jIFwKLQlubG0zMi1hbHBoYS5jIFwKLQlubG02NC5jCi0KLQotT1BUSU9OQUxfQkFDS0VORFMgPSBcCi0JYWl4Mzg2LWNvcmUubG8gXAotCWhwdXgtY29yZS5sbyBcCi0JaXJpeC1jb3JlLmxvIFwKLQlseW54LWNvcmUubG8gXAotCW9zZi1jb3JlLmxvIFwKLQlzY281LWNvcmUubG8gXAotCXRyYWQtY29yZS5sbyBcCi0JY2lzY28tY29yZS5sbwotCi0KLU9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhaXgzODYtY29yZS5jIFwKLQlocHV4LWNvcmUuYyBcCi0JaXJpeC1jb3JlLmMgXAotCWx5bngtY29yZS5jIFwKLQlvc2YtY29yZS5jIFwKLQlzY281LWNvcmUuYyBcCi0JdHJhZC1jb3JlLmMgXAotCWNpc2NvLWNvcmUuYwotCi0KLSMgVGhlc2UgYXJlIGRlZmluZWQgYnkgY29uZmlndXJlLmluOgotV09SRFNJWkUgPSBAd29yZHNpemVACi1BTExfQkFDS0VORFMgPSBAYWxsX2JhY2tlbmRzQAotQkZEX0JBQ0tFTkRTID0gQGJmZF9iYWNrZW5kc0AKLUJGRF9NQUNISU5FUyA9IEBiZmRfbWFjaGluZXNACi1UREVGQVVMVFMgPSBAdGRlZmF1bHRzQAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgQEhERUZJTkVTQCBAQ09SRUZMQUdAIEBUREVGSU5FU0AgJChDU0VBUkNIKSAkKENTV0lUQ0hFUykgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwKLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQkkKEJGRF9MSUJTX0NGSUxFUykgXAotCSQoQUxMX01BQ0hJTkVTX0NGSUxFUykgXAotCSQoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKSBcCi0JJChCRkQ2NF9CQUNLRU5EU19DRklMRVMpIFwKLQkkKE9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUykKLQotCi1TT1VSQ0VfSEZJTEVTID0gXAotCWFvdXQtdGFyZ2V0LmggYW91dGYxLmggYW91dHguaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAotCWVjb2Zmc3dhcC5oIGVsZjMyLWFybS5oIGVsZmNvZGUuaCBlbGZjb3JlLmggXAotCWVsZmxpbmsuaCBmcmVlYnNkLmggZ2VubGluay5oIGdvMzJzdHViLmggbGliYW91dC5oIFwKLQlsaWJiZmQuaCBsaWJjb2ZmLmggbGliZWNvZmYuaCBlbGYtYmZkLmggbGliaHBwYS5oIGxpYmllZWUuaCBcCi0JbGlibmxtLmggbGlib2FzeXMuaCBsaWJwZWkuaCBuZXRic2QuaCBubG0tdGFyZ2V0LmggbmxtY29kZS5oIFwKLQlubG1zd2FwLmggbnMzMmsuaCBwZWljb2RlLmggc29tLmggdm1zLmgKLQotCi1IRklMRVMgPSBcCi0JZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmggdGFyZ21hdGNoLmggXAotCSQoU09VUkNFX0hGSUxFUykKLQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKFNPVVJDRV9IRklMRVMpCi0KLSMgVmFyaW91cyBraW5kcyBvZiAubyBmaWxlcyB0byBwdXQgaW4gbGliYmZkLmE6Ci0jIEJGRF9CQUNLRU5EUwlSb3V0aW5lcyB0aGUgY29uZmlndXJlZCB0YXJnZXRzIG5lZWQuCi0jIEJGRF9NQUNISU5FUwlBcmNoaXRlY3R1cmUtc3BlY2lmaWMgcm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBDT1JFRklMRQlDb3JlIGZpbGUgcm91dGluZXMgZm9yIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24KLU9GSUxFUyA9ICQoQkZEX0JBQ0tFTkRTKSAkKEJGRF9NQUNISU5FUykgQENPUkVGSUxFQAotCi1saWJiZmRfbGFfU09VUkNFUyA9ICQoQkZEX0xJQlNfQ0ZJTEVTKQotbGliYmZkX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKSBvZmlsZXMKLWxpYmJmZF9sYV9MSUJBREQgPSBgY2F0IG9maWxlc2AgQFdJTjMyTElCQUREQAotbGliYmZkX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACi0KLSMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYmJmZC5hLiAgV2UgY3JlYXRlIGxpYmJmZC5hIGluIHRoZSBidWlsZAotIyBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZSBwcm9ncmFtcyB0aGF0IHVzZQotIyBsaWJiZmQuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkIGlmCi0jIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgotCi1ub2luc3RfTElCUkFSSUVTID0gbGliYmZkLmEKLWxpYmJmZF9hX1NPVVJDRVMgPSAKLQotQkZEX0hfREVQUyA9ICQoSU5DRElSKS9hbnNpZGVjbC5oCi1MT0NBTF9IX0RFUFMgPSBsaWJiZmQuaCBzeXNkZXAuaCBjb25maWcuaAotCi1CRkRfSF9GSUxFUyA9IGJmZC1pbi5oIGluaXQuYyBvcG5jbHMuYyBsaWJiZmQuYyBzZWN0aW9uLmMgYXJjaHVyZXMuYyBcCi0JcmVsb2MuYyBzeW1zLmMgYmZkLmMgYXJjaGl2ZS5jIGNvcmVmaWxlLmMgdGFyZ2V0cy5jIGZvcm1hdC5jCi0KLUxJQkJGRF9IX0ZJTEVTID0gbGliYmZkLWluLmggaW5pdC5jIGxpYmJmZC5jIGNhY2hlLmMgcmVsb2MuYyBhcmNodXJlcy5jIGVsZi5jCi1MSUJDT0ZGX0hfRklMRVMgPSBsaWJjb2ZmLWluLmggY29mZmNvZGUuaAotCi1NT1NUTFlDTEVBTkZJTEVTID0gZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0Lmggb2ZpbGVzIHN0YW1wLW9maWxlcyBcCi0JdGFyZ21hdGNoLmgKLQotCi1DTEVBTkZJTEVTID0gYmZkLmggZGVwLnNlZCBzdG1wLWJmZC1oIERFUCBERVAxIGxpYmJmZC5hIHN0YW1wLWxpYiBcCi0Jc3RtcC1iaW4yLWggc3RtcC1sYmZkLWggc3RtcC1sY29mZi1oCi0KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gIGJmZC1pbjMuaAotTElCUkFSSUVTID0gICQobm9pbnN0X0xJQlJBUklFUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotbGliYmZkX2FfTElCQUREID0gCi1saWJiZmRfYV9PQkpFQ1RTID0gCi1MVExJQlJBUklFUyA9ICAkKGxpYl9MVExJQlJBUklFUykKLQotbGliYmZkX2xhX09CSkVDVFMgPSAgYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBcCi1jb3JlZmlsZS5sbyBmb3JtYXQubG8gaW5pdC5sbyBsaWJiZmQubG8gb3BuY2xzLmxvIHJlbG9jLmxvIHNlY3Rpb24ubG8gXAotc3ltcy5sbyB0YXJnZXRzLmxvIGhhc2gubG8gbGlua2VyLmxvIHNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBcCi1paGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENPUFlJTkcgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIFwKLU1ha2VmaWxlLmluIFRPRE8gYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgYmZkLWluMi5oIGNvbmZpZy5pbiBjb25maWd1cmUgXAotY29uZmlndXJlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGxpYmJmZF9hX1NPVVJDRVMpICQobGliYmZkX2xhX1NPVVJDRVMpCi1PQkpFQ1RTID0gJChsaWJiZmRfYV9PQkpFQ1RTKSAkKGxpYmJmZF9sYV9PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubG8gLm8gLnMKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci1iZmQtaW4zLmg6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzIGJmZC1pbjIuaAotCWNkICQodG9wX2J1aWxkZGlyKSAmJiBDT05GSUdfRklMRVM9JEA6YmZkLWluMi5oIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKLQotZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLW1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1jbGVhbi1saWJMVExJQlJBUklFUzoKLQktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKLQotZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1pbnN0YWxsLWxpYkxUTElCUkFSSUVTOiAkKGxpYl9MVExJQlJBUklFUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICAkKExJQlRPT0wpICAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCi0JZG9uZQotCi1saWJiZmQubGE6ICQobGliYmZkX2xhX09CSkVDVFMpICQobGliYmZkX2xhX0RFUEVOREVOQ0lFUykKLQkkKExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJiZmRfbGFfTERGTEFHUykgJChsaWJiZmRfbGFfT0JKRUNUUykgJChsaWJiZmRfbGFfTElCQUREKSAkKExJQlMpCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWluZm8tYW06Ci1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotZHZpLWFtOgotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1saWJMVExJQlJBUklFUwotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1kYXRhLWxvY2FsCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1saWJMVExJQlJBUklFUwotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKSAkKExUTElCUkFSSUVTKSBjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChsaWJkaXIpCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIG1vc3RseWNsZWFuLXRhZ3MgXAotCQltb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06ICBjbGVhbi1oZHIgY2xlYW4tbm9pbnN0TElCUkFSSUVTIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBcCi0JCW1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLQkJZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi1jbGVhbi1ub2luc3RMSUJSQVJJRVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJMVExJQlJBUklFUyBcCi1tYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCi1pbnN0YWxsLWxpYkxUTElCUkFSSUVTIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgdW5pbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgdW5pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4tdGFncyBcCi1kaXN0Y2xlYW4tdGFncyBjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGluZm8tYW0gaW5mbyBcCi1kdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgaW5zdGFsbC1pbmZvLWFtIFwKLWluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAotaW5zdGFsbC1kYXRhLWxvY2FsIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIFwKLXVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLWRpc3RzdHVmZjogaW5mbwotCi1zdGFtcC1vZmlsZXM6IE1ha2VmaWxlCi0Jcm0gLWYgdG9maWxlcwotCWY9IiI7IFwKLQlmb3IgaSBpbiAkKE9GSUxFUykgOyBkbyBcCi0JICBjYXNlICIgJCRmICIgaW4gXAotCSAgICAqIiAkJGkgIiopIDs7IFwKLQkgICAgKikgZj0iJCRmICQkaSIgOzsgXAotCSAgZXNhYyA7IFwKLQlkb25lIDsgXAotCWVjaG8gJCRmID4gdG9maWxlcwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0b2ZpbGVzIG9maWxlcwotCXRvdWNoIHN0YW1wLW9maWxlcwotCi1vZmlsZXM6IHN0YW1wLW9maWxlcyA7IEB0cnVlCi0KLXN0YW1wLWxpYjogbGliYmZkLmxhCi0JbGlidG9vbGRpcj1gJChMSUJUT09MKSAtLWNvbmZpZyB8IHNlZCAtbiAtZSAncy9eb2JqZGlyPS8vcCdgOyBcCi0JaWYgWyAtZiAkJGxpYnRvb2xkaXIvbGliYmZkLmEgXTsgdGhlbiBcCi0JICBjcCAkJGxpYnRvb2xkaXIvbGliYmZkLmEgbGliYmZkLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLmE7IFwKLQllbHNlIHRydWU7IGZpCi0JdG91Y2ggc3RhbXAtbGliCi0KLWxpYmJmZC5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotCi0jIFRoaXMgZmlsZSBob2xkcyBhbiBhcnJheSBhc3NvY2lhdGluZyBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFuZAotIyB2ZWN0b3IgbmFtZXMuICBJdCBpcyBidWlsdCBmcm9tIGNvbmZpZy5iZmQuICBJdCBpcyBub3QgY29tcGlsZWQgYnkKLSMgaXRzZWxmLCBidXQgaXMgaW5jbHVkZWQgYnkgdGFyZ2V0cy5jLgotdGFyZ21hdGNoLmg6IGNvbmZpZy5iZmQgdGFyZ21hdGNoLnNlZAotCXJtIC1mIHRhcmdtYXRjaC5oCi0Jc2VkIC1mICQoc3JjZGlyKS90YXJnbWF0Y2guc2VkIDwgJChzcmNkaXIpL2NvbmZpZy5iZmQgPiB0YXJnbWF0Y2gubmV3Ci0JbXYgLWYgdGFyZ21hdGNoLm5ldyB0YXJnbWF0Y2guaAotCi0jIFdoZW4gY29tcGlsaW5nIGFyY2h1cmVzLmMgYW5kIHRhcmdldHMuYywgc3VwcGx5IHRoZSBkZWZhdWx0IHRhcmdldAotIyBpbmZvIGZyb20gY29uZmlndXJlLgotCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgY29uZmlnLnN0YXR1cwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkKFRERUZBVUxUUykgJChzcmNkaXIpL3RhcmdldHMuYwotCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvYXJjaHVyZXMuYwotCi1lbGYzMi10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmMzItdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi8zMi9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmMzItdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjMyLXRhcmdldC5uZXcgZWxmMzItdGFyZ2V0LmgKLQotZWxmNjQtdGFyZ2V0LmggOiBlbGZ4eC10YXJnZXQuaAotCXJtIC1mIGVsZjY0LXRhcmdldC5oCi0Jc2VkIC1lIHMvTk4vNjQvZyA8ICQoc3JjZGlyKS9lbGZ4eC10YXJnZXQuaCA+IGVsZjY0LXRhcmdldC5uZXcKLQltdiAtZiBlbGY2NC10YXJnZXQubmV3IGVsZjY0LXRhcmdldC5oCi0kKEJGRF9MSUJTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX01BQ0hJTkVTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX0JBQ0tFTkRTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoT1BUSU9OQUxfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotCi0jIEluc3RhbGwgQkZEIGluY2x1ZGUgZmlsZSwgYW5kIG90aGVycyB0aGF0IGl0IG5lZWRzLgotaW5zdGFsbC1kYXRhLWxvY2FsOiAkKEJGRF9IKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChpbmNsdWRlZGlyKQotCSQoSU5TVEFMTF9EQVRBKSAkKEJGRF9IKSAkKGluY2x1ZGVkaXIpL2JmZC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9hbnNpZGVjbC5oICQoaW5jbHVkZWRpcikvYW5zaWRlY2wuaAotCSQoSU5TVEFMTF9EQVRBKSAkKElOQ0RJUikvYmZkbGluay5oICQoaW5jbHVkZWRpcikvYmZkbGluay5oCi0KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIERFUDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLURFUDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGJmZC5oCi0Jcm0gLWYgREVQMQotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgREVQMQotCXNlZCAtZiBkZXAuc2VkIDxERVAxID5ERVAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLSMgVGhlIE5ldEJTRCBta2RlcCBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBmaWxlIGNvbnRlbnRzLCBhbmQgZG9lc24ndCBpbnNlcnQKLSMgdGhlICJETyBOT1QgREVMRVRFIiBsaW5lLgotIyBPdGhlciBta2RlcCB2ZXJzaW9ucyByZXF1aXJlIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzLCBhbmQgZG8gaW5zZXJ0IGl0LgotIyBIZW5jZSB0aGUgd2VpcmRuZXNzLi4uLgotREVQMTogJChDRklMRVMpCi0Jcm0gLWYgREVQMiBERVAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQMgotCWVjaG8gPiBERVAyYQotCSQoTUtERVApIC1mIERFUDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCBERVAyYSA+PiBERVAyCi0Jcm0gLWYgREVQMmEKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQMiBERVAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi1ob3N0LWFvdXQubG86IE1ha2VmaWxlCi0KLSMgVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgc2ltcGxlIGNvbmZpZyBmaWxlCi0jIHdoaWNoIGNhbiBiZSBmb2xkZWQgaW50byBhbiBoLVhYWCBmaWxlIGZvciBhIG5ldyBob3N0LCB3aXRoIHNvbWUgZWRpdGluZy4KLWFvdXQtcGFyYW1zLmg6IGdlbi1hb3V0Ci0JLi9nZW4tYW91dCBob3N0ID4gYW91dC1wYXJhbXMuaAotZ2VuLWFvdXQ6ICQoc3JjZGlyKS9nZW4tYW91dC5jIE1ha2VmaWxlCi0JJChDQykgLW8gZ2VuLWFvdXQgJChDRkxBR1MpICQoTEZMQUdTKSAkKHNyY2RpcikvZ2VuLWFvdXQuYwotCi0kKEJGRF9IKTogc3RtcC1iZmQtaCA7IEB0cnVlCi0KLXN0bXAtYmZkLWg6IGJmZC1pbjMuaAotCXJtIC1mIGJmZC10bXAuaAotCWNwIGJmZC1pbjMuaCBiZmQtdG1wLmgKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLXRtcC5oICQoQkZEX0gpCi0Jcm0gLWYgYmZkLXRtcC5oCi0JdG91Y2ggc3RtcC1iZmQtaAotCi0jIENvdWxkIHJlYWxseSB1c2UgYSAiY29weS1pZi1jaGFuZ2UiLi4uCi1oZWFkZXJzOgotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgcHJvdG9zICQoRkxBR1NfVE9fUEFTUykpCi0JY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCi0JY3AgJChkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAotCi0jIFdlIG9ubHkgcmVidWlsZCB0aGUgaGVhZGVyIGZpbGVzIGF1dG9tYXRpY2FsbHkgaWYgd2UgaGF2ZSBiZWVuCi0jIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUuCi0KLSQoc3JjZGlyKS9iZmQtaW4yLmg6IEBNQUlOVEAgc3RtcC1iaW4yLWggOyBAdHJ1ZQotc3RtcC1iaW4yLWg6ICQoQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGJmZC5oKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCXRvdWNoIHN0bXAtYmluMi1oCi0KLSQoc3JjZGlyKS9saWJiZmQuaDogQE1BSU5UQCBzdG1wLWxiZmQtaCA7IEB0cnVlCi1zdG1wLWxiZmQtaDogJChMSUJCRkRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliYmZkLmgpCi0JY3AgJChkb2NkaXIpL2xpYmJmZC5oIGxpYmJmZC5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQuaC1uZXcgJChzcmNkaXIpL2xpYmJmZC5oCi0JdG91Y2ggc3RtcC1sYmZkLWgKLQotJChzcmNkaXIpL2xpYmNvZmYuaDogQE1BSU5UQCBzdG1wLWxjb2ZmLWggOyBAdHJ1ZQotc3RtcC1sY29mZi1oOiAkKExJQkNPRkZfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgbGliY29mZi5oKQotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQl0b3VjaCBzdG1wLWxjb2ZmLWgKLQotIyBXZSB3YW50IHRvIHJlcnVuIGNvbmZpZ3VyZSBpZiBjb25maWcuYmZkIG9yIGNvbmZpZ3VyZS5ob3N0IGNoYW5nZS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZy5iZmQgJChzcmNkaXIpL2NvbmZpZ3VyZS5ob3N0Ci0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi1lbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyBlbGYzMi1hcm0uaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLWVsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi1hcmNoaXZlLmxvOiBhcmNoaXZlLmMgJChJTkNESVIpL2FvdXQvYXIuaCAkKElOQ0RJUikvYW91dC9yYW5saWIuaAotYXJjaHVyZXMubG86IGFyY2h1cmVzLmMKLWJmZC5sbzogYmZkLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWNhY2hlLmxvOiBjYWNoZS5jCi1jb2ZmZ2VuLmxvOiBjb2ZmZ2VuLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1jb3JlZmlsZS5sbzogY29yZWZpbGUuYwotZm9ybWF0LmxvOiBmb3JtYXQuYwotaW5pdC5sbzogaW5pdC5jCi1saWJiZmQubG86IGxpYmJmZC5jCi1vcG5jbHMubG86IG9wbmNscy5jICQoSU5DRElSKS9vYmphbGxvYy5oCi1yZWxvYy5sbzogcmVsb2MuYyAkKElOQ0RJUikvYmZkbGluay5oCi1zZWN0aW9uLmxvOiBzZWN0aW9uLmMgJChJTkNESVIpL2JmZGxpbmsuaAotc3ltcy5sbzogc3ltcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgJChJTkNESVIpL2ZubWF0Y2guaCB0YXJnbWF0Y2guaAotaGFzaC5sbzogaGFzaC5jICQoSU5DRElSKS9vYmphbGxvYy5oCi1saW5rZXIubG86IGxpbmtlci5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oCi1zcmVjLmxvOiBzcmVjLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1iaW5hcnkubG86IGJpbmFyeS5jCi10ZWtoZXgubG86IHRla2hleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAotaWhleC5sbzogaWhleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAotc3RhYnMubG86IHN0YWJzLmMgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RhYi1zeW1zLmxvOiBzdGFiLXN5bXMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1jcHUtYTI5ay5sbzogY3B1LWEyOWsuYwotY3B1LWFscGhhLmxvOiBjcHUtYWxwaGEuYwotY3B1LWFyYy5sbzogY3B1LWFyYy5jCi1jcHUtYXJtLmxvOiBjcHUtYXJtLmMKLWNwdS1hdnIubG86IGNwdS1hdnIuYwotY3B1LWQxMHYubG86IGNwdS1kMTB2LmMKLWNwdS1kMzB2LmxvOiBjcHUtZDMwdi5jCi1jcHUtZnIzMC5sbzogY3B1LWZyMzAuYwotY3B1LWg4MzAwLmxvOiBjcHUtaDgzMDAuYwotY3B1LWg4NTAwLmxvOiBjcHUtaDg1MDAuYwotY3B1LWhwcGEubG86IGNwdS1ocHBhLmMKLWNwdS1pMzg2LmxvOiBjcHUtaTM4Ni5jCi1jcHUtaTg2MC5sbzogY3B1LWk4NjAuYwotY3B1LWk5NjAubG86IGNwdS1pOTYwLmMKLWNwdS1tMzJyLmxvOiBjcHUtbTMyci5jCi1jcHUtbTY4ay5sbzogY3B1LW02OGsuYwotY3B1LW04OGsubG86IGNwdS1tODhrLmMKLWNwdS1tMTAyMDAubG86IGNwdS1tMTAyMDAuYwotY3B1LW0xMDMwMC5sbzogY3B1LW0xMDMwMC5jCi1jcHUtbWNvcmUubG86IGNwdS1tY29yZS5jCi1jcHUtbWlwcy5sbzogY3B1LW1pcHMuYwotY3B1LW5zMzJrLmxvOiBjcHUtbnMzMmsuYyBuczMyay5oCi1jcHUtcGoubG86IGNwdS1wai5jCi1jcHUtcG93ZXJwYy5sbzogY3B1LXBvd2VycGMuYwotY3B1LXJzNjAwMC5sbzogY3B1LXJzNjAwMC5jCi1jcHUtc2gubG86IGNwdS1zaC5jCi1jcHUtc3BhcmMubG86IGNwdS1zcGFyYy5jCi1jcHUtdGljMzAubG86IGNwdS10aWMzMC5jCi1jcHUtdGljODAubG86IGNwdS10aWM4MC5jCi1jcHUtdjg1MC5sbzogY3B1LXY4NTAuYwotY3B1LXZheC5sbzogY3B1LXZheC5jCi1jcHUtd2UzMmsubG86IGNwdS13ZTMyay5jCi1jcHUtdzY1LmxvOiBjcHUtdzY1LmMKLWNwdS16OGsubG86IGNwdS16OGsuYwotYW91dC1hZG9iZS5sbzogYW91dC1hZG9iZS5jICQoSU5DRElSKS9hb3V0L2Fkb2JlLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtYXJtLmxvOiBhb3V0LWFybS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dHguaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1hb3V0LW5zMzJrLmxvOiBhb3V0LW5zMzJrLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBuczMyay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LXNwYXJjbGUubG86IGFvdXQtc3BhcmNsZS5jICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsaWJhb3V0LmggYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotYW91dC10aWMzMC5sbzogYW91dC10aWMzMC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggYW91dHguaAotYW91dDAubG86IGFvdXQwLmMgYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dDMyLmxvOiBhb3V0MzIuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWFybW5ldGJzZC5sbzogYXJtbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1ib3V0LmxvOiBib3V0LmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggJChJTkNESVIpL2JvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oCi1jZi1pMzg2bHlueC5sbzogY2YtaTM4Nmx5bnguYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jZi1tNjhrbHlueC5sbzogY2YtbTY4a2x5bnguYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jZi1zcGFyY2x5bngubG86IGNmLXNwYXJjbHlueC5jIGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hMjlrLmxvOiBjb2ZmLWEyOWsuYyAkKElOQ0RJUikvY29mZi9hMjlrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcG9sbG8ubG86IGNvZmYtYXBvbGxvLmMgJChJTkNESVIpL2NvZmYvYXBvbGxvLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWFybS5sbzogY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWF1eC5sbzogY29mZi1hdXguYyAkKElOQ0RJUikvY29mZi9hdXgtY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9tNjhrLmggY29mZi1tNjhrLmMgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDgzMDAubG86IGNvZmYtaDgzMDAuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDg1MDAubG86IGNvZmYtaDg1MDAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTM4Ni5sbzogY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTg2MC5sbzogY29mZi1pODYwLmMgJChJTkNESVIpL2NvZmYvaTg2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtZ28zMi5sbzogY29mZi1nbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pOTYwLmxvOiBjb2ZmLWk5NjAuYyAkKElOQ0RJUikvY29mZi9pOTYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1tNjhrLmxvOiBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1tODhrLmxvOiBjb2ZmLW04OGsuYyAkKElOQ0RJUikvY29mZi9tODhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1taXBzLmxvOiBjb2ZmLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9taXBzLmggbGliY29mZi5oIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBcCi0gIGVjb2Zmc3dhcC5oCi1jb2ZmLXBtYWMubG86IGNvZmYtcG1hYy5jIGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXJzNjAwMC5sbzogY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc2gubG86IGNvZmYtc2guYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3NoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3BhcmMubG86IGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zdGdvMzIubG86IGNvZmYtc3RnbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9nbzMyZXhlLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAotICBnbzMyc3R1Yi5oCi1jb2ZmLXN2bTY4ay5sbzogY29mZi1zdm02OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzMwLmxvOiBjb2ZmLXRpYzMwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzgwLmxvOiBjb2ZmLXRpYzgwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXU2OGsubG86IGNvZmYtdTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtd2UzMmsubG86IGNvZmYtd2UzMmsuYyAkKElOQ0RJUikvY29mZi93ZTMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13NjUubG86IGNvZmYtdzY1LmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi93NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi16OGsubG86IGNvZmYtejhrLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi96OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZmxpbmsubG86IGNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oCi1kd2FyZjEubG86IGR3YXJmMS5jICQoSU5DRElSKS9saWJpYmVydHkuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYuaAotZHdhcmYyLmxvOiBkd2FyZjIuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5sbzogZWNvZmYuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FyLmggXAotICAkKElOQ0RJUikvYW91dC9yYW5saWIuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaAotZWNvZmZsaW5rLmxvOiBlY29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYmphbGxvYy5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVsZi5sbzogZWxmLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVsZjMyLWFyYy5sbzogZWxmMzItYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jICQoSU5DRElSKS9lbGYvYXJtLW9hYmkuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi1hcm0uaCBlbGYzMi10YXJnZXQuaAotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItYXJtLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItYXZyLmxvOiBlbGYzMi1hdnIuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXZyLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItZDEwdi5sbzogZWxmMzItZDEwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQzMHYubG86IGVsZjMyLWQzMHYuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1mcjMwLmxvOiBlbGYzMi1mcjMwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2ZyMzAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1nZW4ubG86IGVsZjMyLWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWkzNzAubG86IGVsZjMyLWkzNzAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pMzg2LmxvOiBlbGYzMi1pMzg2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pODYwLmxvOiBlbGYzMi1pODYwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItaTk2MC5sbzogZWxmMzItaTk2MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9pOTYwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTMyci5sbzogZWxmMzItbTMyci5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTY4ay5sbzogZWxmMzItbTY4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTg4ay5sbzogZWxmMzItbTg4ay5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZi1tMTAyMDAubG86IGVsZi1tMTAyMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMzAwLmxvOiBlbGYtbTEwMzAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1jb3JlLmxvOiBlbGYzMi1tY29yZS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbWlwcy5sbzogZWxmMzItbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wai5sbzogZWxmMzItcGouYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvcGouaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wcGMubG86IGVsZjMyLXBwYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zaC5sbzogZWxmMzItc2guYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zcGFyYy5sbzogZWxmMzItc3BhcmMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXY4NTAubG86IGVsZjMyLXY4NTAuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvdjg1MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLmxvOiBlbGYzMi5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLWVsZmxpbmsubG86IGVsZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotZXBvYy1wZS1hcm0ubG86IGVwb2MtcGUtYXJtLmMgcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1lcG9jLXBlaS1hcm0ubG86IGVwb2MtcGVpLWFybS5jIHBlaS1hcm0uYyBjb2ZmLWFybS5jIFwKLSAgJChJTkNESVIpL2NvZmYvYXJtLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggXAotICBsaWJwZWkuaAotaHAzMDBic2QubG86IGhwMzAwYnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1ocDMwMGhwdXgubG86IGhwMzAwaHB1eC5jICQoSU5DRElSKS9hb3V0L2hwMzAwaHB1eC5oIFwKLSAgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLXNvbS5sbzogc29tLmMKLWkzODZhb3V0LmxvOiBpMzg2YW91dC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmJzZC5sbzogaTM4NmJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmR5bml4LmxvOiBpMzg2ZHluaXguYyAkKElOQ0RJUikvYW91dC9keW5peDMuaCBhb3V0eC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1pMzg2ZnJlZWJzZC5sbzogaTM4NmZyZWVic2QuYyBmcmVlYnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bGludXgubG86IGkzODZsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotaTM4Nmx5bngubG86IGkzODZseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bXNkb3MubG86IGkzODZtc2Rvcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1pMzg2bmV0YnNkLmxvOiBpMzg2bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bWFjaDMubG86IGkzODZtYWNoMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotaTM4Nm9zOWsubG86IGkzODZvczlrLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvb3M5ay5oCi1pZWVlLmxvOiBpZWVlLmMgJChJTkNESVIpL2llZWUuaCBsaWJpZWVlLmgKLW02OGs0a25ldGJzZC5sbzogbTY4azRrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbGludXgubG86IG02OGtsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotbTY4a2x5bngubG86IG02OGtseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbmV0YnNkLmxvOiBtNjhrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tODhrbWFjaDMubG86IG04OGttYWNoMy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbWlwc2JzZC5sbzogbWlwc2JzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbmV3c29zMy5sbzogbmV3c29zMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotbmxtLmxvOiBubG0uYyBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAotbmxtMzItaTM4Ni5sbzogbmxtMzItaTM4Ni5jICQoSU5DRElSKS9ubG0vaTM4Ni1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLXNwYXJjLmxvOiBubG0zMi1zcGFyYy5jICQoSU5DRElSKS9ubG0vc3BhcmMzMi1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLXBwYy5sbzogbmxtMzItcHBjLmMgJChJTkNESVIpL25sbS9wcGMtZXh0LmggbGlibmxtLmggXAotICAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggXAotICBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi5sbzogbmxtMzIuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5zMzJrbmV0YnNkLmxvOiBuczMya25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotb2FzeXMubG86IG9hc3lzLmMgJChJTkNESVIpL29hc3lzLmggbGlib2FzeXMuaAotcGM1MzItbWFjaC5sbzogcGM1MzItbWFjaC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotcGUtYXJtLmxvOiBwZS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaS1hcm0ubG86IHBlaS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLWkzODYubG86IHBlLWkzODYuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLWkzODYubG86IHBlaS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLW1pcHMubG86IHBlLW1pcHMuYyAkKElOQ0RJUikvY29mZi9taXBzcGUuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIFwKLSAgcGVpY29kZS5oCi1wZWktbWlwcy5sbzogcGVpLW1pcHMuYyBwZS1taXBzLmMgJChJTkNESVIpL2NvZmYvbWlwc3BlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGUtbWNvcmUubG86IHBlLW1jb3JlLmMgY29mZi1tY29yZS5jICQoSU5DRElSKS9jb2ZmL21jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLW1jb3JlLmxvOiBwZWktbWNvcmUuYyBjb2ZmLW1jb3JlLmMgJChJTkNESVIpL2NvZmYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZS1wcGMubG86IHBlLXBwYy5jIGNvZmYtcHBjLmMgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaS1wcGMubG86IHBlaS1wcGMuYyBjb2ZmLXBwYy5jICQoSU5DRElSKS9jb2ZmL3Bvd2VycGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZS1zaC5sbzogcGUtc2guYyBjb2ZmLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktc2gubG86IHBlaS1zaC5jIGNvZmYtc2guYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3NoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlaWdlbi5sbzogcGVpZ2VuLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYnBlaS5oCi1wcGNib290LmxvOiBwcGNib290LmMKLXJlbG9jMTYubG86IHJlbG9jMTYuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oCi1yaXNjaXgubG86IHJpc2NpeC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaAotc3BhcmNsaW51eC5sbzogc3BhcmNsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotc3BhcmNseW54LmxvOiBzcGFyY2x5bnguYyAkKElOQ0RJUikvYW91dC9zdW40LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1zcGFyY25ldGJzZC5sbzogc3BhcmNuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXN1bm9zLmxvOiBzdW5vcy5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIGFvdXRmMS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXZheG5ldGJzZC5sbzogdmF4bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi12ZXJzYWRvcy5sbzogdmVyc2Fkb3MuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXZtcy5sbzogdm1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWdzZC5sbzogdm1zLWdzZC5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1oZHIubG86IHZtcy1oZHIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtbWlzYy5sbzogdm1zLW1pc2MuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtdGlyLmxvOiB2bXMtdGlyLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAoteGNvZmZsaW5rLmxvOiB4Y29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmgKLWFvdXQ2NC5sbzogYW91dDY0LmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1jb2ZmLWFscGhhLmxvOiBjb2ZmLWFscGhhLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBlY29mZnN3YXAuaAotZGVtbzY0LmxvOiBkZW1vNjQuYyBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWVsZjY0LWFscGhhLmxvOiBlbGY2NC1hbHBoYS5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oIGVjb2Zmc3dhcC5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1nZW4ubG86IGVsZjY0LWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LW1pcHMubG86IGVsZjY0LW1pcHMuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBnZW5saW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggZWNvZmZzd2FwLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtc3BhcmMubG86IGVsZjY0LXNwYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC5sbzogZWxmNjQuYyBlbGZjb2RlLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGZjb3JlLmggZWxmbGluay5oCi1ubG0zMi1hbHBoYS5sbzogbmxtMzItYWxwaGEuYyAkKElOQ0RJUikvbmxtL2FscGhhLWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtNjQubG86IG5sbTY0LmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1haXgzODYtY29yZS5sbzogYWl4Mzg2LWNvcmUuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ocHV4LWNvcmUubG86IGhwdXgtY29yZS5jCi1pcml4LWNvcmUubG86IGlyaXgtY29yZS5jCi1seW54LWNvcmUubG86IGx5bngtY29yZS5jCi1vc2YtY29yZS5sbzogb3NmLWNvcmUuYwotc2NvNS1jb3JlLmxvOiBzY281LWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotdHJhZC1jb3JlLmxvOiB0cmFkLWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGhvc3RzL2kzODZsaW51eC5oCi1jaXNjby1jb3JlLmxvOiBjaXNjby1jb3JlLmMKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iZmQvUE9SVElORyBiL2JmZC9QT1JUSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJmZDc3Li4wMDAwMDAwCi0tLSBhL2JmZC9QT1JUSU5HCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotCVByZWxpbWluYXJ5IE5vdGVzIG9uIFBvcnRpbmcgQkZECi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlICdob3N0JyBpcyB0aGUgc3lzdGVtIGEgdG9vbCBydW5zICpvbiouCi1UaGUgJ3RhcmdldCcgaXMgdGhlIHN5c3RlbSBhIHRvb2wgcnVucyAqZm9yKiwgaS5lLgotYSB0b29sIGNhbiByZWFkL3dyaXRlIHRoZSBiaW5hcmllcyBvZiB0aGUgdGFyZ2V0LgotCi1Qb3J0aW5nIHRvIGEgbmV3IGhvc3QKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUGljayBhIG5hbWUgZm9yIHlvdXIgaG9zdC4gQ2FsbCB0aGF0IDxob3N0Pi4KLSg8aG9zdD4gbWlnaHQgYmUgc3VuNCwgLi4uKQotQ3JlYXRlIGEgZmlsZSBob3N0cy88aG9zdD4ubWguCi0KLVBvcnRpbmcgdG8gYSBuZXcgdGFyZ2V0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUGljayBhIG5hbWUgZm9yIHlvdXIgdGFyZ2V0LiBDYWxsIHRoYXQgPHRhcmdldD4uCi1DYWxsIHRoZSBuYW1lIGZvciB5b3VyIENQVSBhcmNoaXRlY3R1cmUgPGNwdT4uCi1Zb3UgbmVlZCB0byBjcmVhdGUgPHRhcmdldD4uYyBhbmQgY29uZmlnLzx0YXJnZXQ+Lm10LAotYW5kIGFkZCBhIGNhc2UgZm9yIGl0IHRvIGEgY2FzZSBzdGF0ZW1lbnRzIGluIGJmZC9jb25maWd1cmUuaG9zdCBhbmQKLWJmZC9jb25maWcuYmZkLCB3aGljaCBhc3NvY2lhdGVzIGVhY2ggY2Fub25pY2FsIGhvc3QgdHlwZSB3aXRoIGEgQkZECi1ob3N0IHR5cGUgKHVzZWQgYXMgdGhlIGJhc2Ugb2YgdGhlIG1ha2VmaWxlIGZyYWdtZW50IG5hbWVzKSwgYW5kIHRvIHRoZQotdGFibGUgaW4gYmZkL2NvbmZpZ3VyZS5pbiB3aGljaCBhc3NvY2lhdGVzIGVhY2ggdGFyZ2V0IHZlY3RvciB3aXRoCi10aGUgLm8gZmlsZXMgaXQgdXNlcy4KLQotY29uZmlnLzx0YXJnZXQ+Lm10IGlzIGEgTWFrZWZpbGUgZnJhZ21lbnQuCi1UaGUgZm9sbG93aW5nIGlzIHVzdWFsbHkgZW5vdWdoOgotREVGQVVMVF9WRUNUT1I9PHRhcmdldD5fdmVjCi1TRUxFQ1RfQVJDSElURUNUVVJFUz1iZmRfPGNwdT5fYXJjaAotCi1TZWUgdGhlIGxpc3Qgb2YgY3B1IHR5cGVzIGluIGFyY2h1cmVzLmMsIG9yICJscyBjcHUtKi5jIi4KLUlmIHlvdXIgYXJjaGl0ZWN0dXJlIGlzIG5ldywgeW91IG5lZWQgdG8gYWRkIGl0IHRvIHRoZSB0YWJsZXMKLWluIGJmZC9hcmNodXJlcy5jLCBvcGNvZGVzL2NvbmZpZ3VyZS5pbiwgYW5kIGJpbnV0aWxzL29iamR1bXAuYy4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgLm10IGFuZCAubWggZmlsZXMsIHNlZSBjb25maWcvUkVBRE1FLgotCi1UaGUgZmlsZSA8dGFyZ2V0Pi5jIGlzIHRoZSBoYXJkIHBhcnQuICBJdCBpbXBsZW1lbnRzIHRoZQotYmZkX3RhcmdldCA8dGFyZ2V0Pl92ZWMsIHdoaWNoIGluY2x1ZGVzIHBvaW50ZXJzIHRvCi1mdW5jdGlvbnMgdGhhdCBkbyB0aGUgYWN0dWFsIDx0YXJnZXQ+LXNwZWNpZmljIG1ldGhvZHMuCi0KLVBvcnRpbmcgdG8gYSA8dGFyZ2V0PiB0aGF0IHVzZXMgdGhlIGEub3V0IGJpbmFyeSBmb3JtYXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSW4gdGhpcyBjYXNlLCB0aGUgaW5jbHVkZSBmaWxlIGFvdXQtdGFyZ2V0LmggcHJvYmFieSBkb2VzIG1vc3QKLW9mIHdoYXQgeW91IG5lZWQuIFRoZSBwcm9ncmFtIGdlbi1hb3V0IGdlbmVyYXRlcyA8dGFyZ2V0Pi5jIGZvcgoteW91IGF1dG9tYXRpY2FsbHkgZm9yIG1hbnkgYS5vdXQgc3lzdGVtcy4gIERvOgotCW1ha2UgZ2VuLWFvdXQKLQkuL2dlbi1hb3V0IDx0YXJnZXQ+ID4gPHRhcmdldD4uYwotKFRoaXMgb25seSB3b3JrcyBpZiB5b3UgYXJlIGJ1aWxkaW5nIG9uIHRoZSB0YXJnZXQgKCJuYXRpdmUiKS4KLUlmIHlvdSBtdXN0IG1ha2UgYSBjcm9zcy1wb3J0IGZyb20gc2NyYXRjaCwgY29weSB0aGUgbW9zdAotc2ltaWxhciBleGlzdGluZyBmaWxlIHRoYXQgaW5jbHVkZXMgYW91dC10YXJnZXQuaCwgYW5kIGZpeCB3aGF0IGlzIHdyb25nLikKLQotQ2hlY2sgdGhlIHBhcmFtZXRlcnMgaW4gPHRhcmdldD4uYywgYW5kIGZpeCBhbnl0aGluZyB0aGF0IGlzIHdyb25nLgotKEFsc28gbGV0IHVzIGtub3cgYWJvdXQgaXQ7IHBlcmhhcHMgd2UgY2FuIGltcHJvdmUgZ2VuLWFvdXQuYy4pCi0KLVRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQlTaG91bGQgYmUgZGVmaW5lZCBpZiA8dGFyZ2V0PiBpcyBiaWctZW5kaWFuLgotCi1OX0hFQURFUl9JTl9URVhUKHgpCi0JU2VlIGRpc2N1c3Npb24gaW4gLi4vaW5jbHVkZS9hb3V0L2FvdXQ2NC5oLgotCi1CWVRFU19JTl9XT1JECi0JTnVtYmVyIG9mIGJ5dGVzIHBlciB3b3JkLiAoVXN1YWxseSA0IGJ1dCBjYW4gYmUgOC4pCi0KLUFSQ0gKLQlOdW1iZXIgb2YgYml0cyBwZXIgd29yZC4gIChVc3VhbGx5IDMyLCBidXQgY2FuIGJlIDY0LikKLQotRU5UUllfQ0FOX0JFX1pFUk8KLQlEZWZpbmUgaWYgdGhlIGV4dHJ5IHBvaW50IChzdGFydCBhZGRyZXNzIG9mIGFuCi0JZXhlY3V0YWJsZSBwcm9ncmFtKSBjYW4gYmUgMHgwLgotCi1URVhUX1NUQVJUX0FERFIKLQlUaGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnZW1udCBpbgotCXZpcnR1YWwgbWVtb3J5LiAgTm9ybWFsbHksIHRoZSBzYW1lIGFzIHRoZSBlbnRyeSBwb2ludC4KLQotVEFSR0VUX1BBR0VfU0laRQotCi1TRUdNRU5UX1NJWkUKLSAgICAgICAgVXN1YWxseSwgdGhlIHNhbWUgYXMgdGhlIFRBUkdFVF9QQUdFX1NJWkUuCi0gICAgICAgIEFsaWdubWVudCBuZWVkZWQgZm9yIHRoZSBkYXRhIHNlZ21lbnQuCi0KLVRBUkdFVE5BTUUKLQlUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0LCBmb3IgcnVuLXRpbWUgbG9va3Vwcy4KLQlVc3VhbGx5ICJhLm91dC08dGFyZ2V0PiIKZGlmZiAtLWdpdCBhL2JmZC9SRUFETUUgYi9iZmQvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNlMTMzLi4wMDAwMDAwCi0tLSBhL2JmZC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1CRkQgaXMgYSBhbiBvYmplY3QgZmlsZSBsaWJyYXJ5LiAgSXQgcGVybWl0cyBhcHBsaWNhdGlvbnMgdG8gdXNlIHRoZQotc2FtZSByb3V0aW5lcyB0byBwcm9jZXNzIG9iamVjdCBmaWxlcyByZWdhcmRsZXNzIG9mIHRoZWlyIGZvcm1hdC4KLQotQkZEIGlzIHVzZWQgYnkgdGhlIEdOVSBkZWJ1Z2dlciwgYXNzZW1ibGVyLCBsaW5rZXIsIGFuZCB0aGUgYmluYXJ5Ci11dGlsaXRpZXMuCi0KLVRoZSBkb2N1bWVudGF0aW9uIG9uIHVzaW5nIEJGRCBpcyBzY2FudHkgYW5kIG1heSBiZSBvY2Nhc2lvbmFsbHkKLWluY29ycmVjdC4gIFBvaW50ZXJzIHRvIGRvY3VtZW50YXRpb24gcHJvYmxlbXMsIG9yIGFuIGVudGlyZWx5Ci1yZXdyaXR0ZW4gbWFudWFsLCB3b3VsZCBiZSBhcHByZWNpYXRlZC4KLQotVGhlcmUgaXMgc29tZSBCRkQgaW50ZXJuYWxzIGRvY3VtZW50YXRpb24gaW4gZG9jL2JmZGludC50ZXhpIHdoaWNoIG1heQotaGVscCBwcm9ncmFtbWVycyB3aG8gd2FudCB0byBtb2RpZnkgQkZELgotCi1CRkQgaXMgbm9ybWFsbHkgYnVpbHQgYXMgcGFydCBvZiBhbm90aGVyIHBhY2thZ2UuICBTZWUgdGhlIGJ1aWxkCi1pbnN0cnVjdGlvbnMgZm9yIHRoYXQgcGFja2FnZSwgcHJvYmFibHkgaW4gYSBSRUFETUUgZmlsZSBpbiB0aGUKLWFwcHJvcHJpYXRlIGRpcmVjdG9yeS4KLQotQkZEIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJlIG9wdGlvbnM6Ci0KLSAgLS10YXJnZXQ9VEFSR0VUCi0JVGhlIGRlZmF1bHQgdGFyZ2V0IGZvciB3aGljaCB0byBidWlsZCB0aGUgbGlicmFyeS4gIFRBUkdFVCBpcwotCWEgY29uZmlndXJhdGlvbiB0YXJnZXQgdHJpcGxldCwgc3VjaCBhcyBzcGFyYy1zdW4tc29sYXJpcy4KLSAgLS1lbmFibGUtdGFyZ2V0cz1UQVJHRVQsVEFSR0VULFRBUkdFVC4uLgotCUFkZGl0aW9uYWwgdGFyZ2V0cyB0aGUgbGlicmFyeSBzaG91bGQgc3VwcG9ydC4gIFRvIGluY2x1ZGUKLQlzdXBwb3J0IGZvciBhbGwga25vd24gdGFyZ2V0cywgdXNlIC0tZW5hYmxlLXRhcmdldHM9YWxsLgotICAtLWVuYWJsZS02NC1iaXQtYmZkCi0JSW5jbHVkZSBzdXBwb3J0IGZvciA2NCBiaXQgdGFyZ2V0cy4gIFRoaXMgaXMgYXV0b21hdGljYWxseQotCXR1cm5lZCBvbiBpZiB5b3UgZXhwbGljaXRseSByZXF1ZXN0IGEgNjQgYml0IHRhcmdldCwgYnV0IG5vdAotCWZvciAtLWVuYWJsZS10YXJnZXRzPWFsbC4gIFRoaXMgcmVxdWlyZXMgYSBjb21waWxlciB3aXRoIGEgNjQKLQliaXQgaW50ZWdlciB0eXBlLCBzdWNoIGFzIGdjYy4KLSAgLS1lbmFibGUtc2hhcmVkCi0JQnVpbGQgQkZEIGFzIGEgc2hhcmVkIGxpYnJhcnkuCi0gIC0td2l0aC1tbWFwCi0JVXNlIG1tYXAgd2hlbiBhY2Nlc3NpbmcgZmlsZXMuICBUaGlzIGlzIGZhc3RlciBvbiBzb21lIGhvc3RzLAotCWJ1dCBzbG93ZXIgb24gb3RoZXJzLiAgSXQgbWF5IG5vdCB3b3JrIG9uIGFsbCBob3N0cy4KLQotUmVwb3J0IGJ1Z3Mgd2l0aCBCRkQgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnLgotCi1QYXRjaGVzIGFyZSBlbmNvdXJhZ2VkLiAgV2hlbiBzZW5kaW5nIHBhdGNoZXMsIGFsd2F5cyBzZW5kIHRoZSBvdXRwdXQKLW9mIGRpZmYgLXUgb3IgZGlmZiAtYyBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlIHRvIHRoZSBuZXcgZmlsZS4gIERvIG5vdAotc2VuZCBkZWZhdWx0IGRpZmYgb3V0cHV0LiAgRG8gbm90IG1ha2UgdGhlIGRpZmYgZnJvbSB0aGUgbmV3IGZpbGUgdG8KLXRoZSBvcmlnaW5hbCBmaWxlLiAgUmVtZW1iZXIgdGhhdCBhbnkgcGF0Y2ggbXVzdCBub3QgYnJlYWsgb3RoZXIKLXN5c3RlbXMuICBSZW1lbWJlciB0aGF0IEJGRCBtdXN0IHN1cHBvcnQgY3Jvc3MgY29tcGlsYXRpb24gZnJvbSBhbnkKLWhvc3QgdG8gYW55IHRhcmdldCwgc28gcGF0Y2hlcyB3aGljaCB1c2UgYGAjaWZkZWYgSE9TVCcnIGFyZSBub3QKLWFjY2VwdGFibGUuICBQbGVhc2UgYWxzbyByZWFkIHRoZSBgYFJlcG9ydGluZyBCdWdzJycgc2VjdGlvbiBvZiB0aGUKLWdjYyBtYW51YWwuCi0KLUJ1ZyByZXBvcnRzIHdpdGhvdXQgcGF0Y2hlcyB3aWxsIGJlIHJlbWVtYmVyZWQsIGJ1dCB0aGV5IG1heSBuZXZlciBnZXQKLWZpeGVkIHVudGlsIHNvbWVib2R5IHZvbHVudGVlcnMgdG8gZml4IHRoZW0uCmRpZmYgLS1naXQgYS9iZmQvVE9ETyBiL2JmZC9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTEyNzM1Li4wMDAwMDAwCi0tLSBhL2JmZC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotVGhpbmdzIHRoYXQgc3RpbGwgbmVlZCB0byBiZSBkb25lOiAtKi0gVGV4dCAtKi0KLQotIG8gLSBBIHNvdXJjZSBvZiBzcGFjZSBsb3NzYWdlIGlzIHRoYXQgYWxsIHRoZSB0YXJnZXQtZGVwZW5kZW50IGNvZGUKLSAgICAgaXMgaW4gYSBzaW5nbGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuICBIZW5jZSBhbGwgdGhlIGNvZGUgZm9yCi0gICAgICp3cml0aW5nKiBvYmplY3QgZmlsZXMgaXMgc3RpbGwgcHVsbGVkIGludG8gYWxsIHRoZSBhcHBsaWNhdGlvbnMKLSAgICAgdGhhdCBvbmx5IGNhcmUgYWJvdXQgKnJlYWRpbmcqIChnZGIsIG5tLCBvYmpkdW1wKSwgd2hpbGUgZ2FzIGhhcwotICAgICB0byBjYXJyeSBhbG9uZyBhbGwgdGhlIHVubmVlZGVkIGJhZ2dhZ2UgZm9yIHJlYWRpbmcgb2JqZWN0cy4gIEFuZAotICAgICBzbyBvbi4gIFRoaXMgd291bGQgYmUgYSBzdWJzdGFudGlhbCBjaGFuZ2UsIGFuZCB0aGUgcGF5b2ZmIHdvdWxkCi0gICAgIG5vdCBhbGwgdGhhdCBncmVhdCAoZXNzZW50aWFsbHkgbm9uZSBpZiBiZmQgaXMgdXNlZCBhcyBhIHNoYXJlZAotICAgICBsaWJyYXJ5KS4KLQotIG8gLSBUaGUgc3RvcmFnZSBuZWVkZWQgYnkgQkZEIGRhdGEgc3RydWN0dXJlcyBpcyBhbHNvIGxhcmdlciB0aGFuIHN0cmljdGx5Ci0gICAgIG5lZWRlZC4gIFRoaXMgbWF5IGJlIGRpZmZpY3VsdCB0byBkbyBtdWNoIGFib3V0LgotCi0gbyAtIGltcGxlbWVudCBiZmRfYWJvcnQsIHdoaWNoIHNob3VsZCBjbG9zZSB0aGUgYmZkIGJ1dCBub3QgYWx0ZXIgdGhlCi0gICAgIGZpbGVzeXN0ZW0uCi0KLSBvIC0gdXBkYXRlIHRoZSBiZmQgZG9jOyB3cml0ZSBhIGhvdy10by13cml0ZS1hLWJhY2tlbmQgZG9jLCB0YWtlIG91dAotICAgICB0aGUgc3R1cGlkIHF1aXBzIGFuZCBmaWxsIGluIGFsbCB0aGUgYmxhbmtzLgotCi0gbyAtIHVwZ3JhZGUgdGhlIHJlbG9jIGhhbmRsaW5nIGFzIHBlciBTdGV2ZSdzIHN1Z2dlc3Rpb24uCi0KLQotCi0KZGlmZiAtLWdpdCBhL2JmZC9hY2luY2x1ZGUubTQgYi9iZmQvYWNpbmNsdWRlLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWMyNmU4Li4wMDAwMDAwCi0tLSBhL2JmZC9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gdXNlIGZvcGVuLWJpbi5oIHJhdGhlciB0aGFuIGZvcGVuLXNhbWUuaC4KLUFDX0RFRlVOKEJGRF9CSU5BUllfRk9QRU4sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX1NZU1RFTV0pCi1jYXNlICIke2hvc3R9IiBpbgotY2hhbmdlcXVvdGUoLClkbmwKLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgQUNfREVGSU5FKFVTRV9CSU5BUllfRk9QRU4sIDEsIFtVc2UgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzP10pIDs7Ci1lc2FjXSlkbmwKLQotZG5sIEdldCBhIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCB0byBwdXQgaW50byBNYWtlZmlsZS4KLUFDX0RFRlVOKEJGRF9DQ19GT1JfQlVJTEQsCi1bIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAteiAiJENDX0ZPUl9CVUlMRCI7IHRoZW4KLSAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotICBlbHNlCi0gICAgQ0NfRk9SX0JVSUxEPWdjYwotICBmaQotZmkKLUFDX1NVQlNUKENDX0ZPUl9CVUlMRCkKLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXhdLCBiZmRfY3ZfYnVpbGRfZXhlZXh0LAotICAgIFtybSAtZiBjb25mdGVzdCoKLSAgICAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC5jCi0gICAgIGJmZF9jdl9idWlsZF9leGVleHQ9Ci0gICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBjb25mdGVzdCBjb25mdGVzdC5jIDE+JjUgMj4mNQotICAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAgKikgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICAgZXNhYwotICAgICBkb25lCi0gICAgIHJtIC1mIGNvbmZ0ZXN0KgotICAgICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgPSB4ICYmIGJmZF9jdl9idWlsZF9leGVleHQ9bm9dKQotICBFWEVFWFRfRk9SX0JVSUxEPSIiCi0gIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUX0ZPUl9CVUlMRD0ke2JmZF9jdl9idWlsZF9leGVleHR9Ci1maQotQUNfU1VCU1QoRVhFRVhUX0ZPUl9CVUlMRCldKWRubAotCi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCBhIGRlY2xhcmF0aW9uIGZvciBhIGZ1bmN0aW9uLgotQUNfREVGVU4oQkZEX05FRURfREVDTEFSQVRJT04sCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICQxIG11c3QgYmUgZGVjbGFyZWRdKQotQUNfQ0FDSEVfVkFMKGJmZF9jdl9kZWNsX25lZWRlZF8kMSwKLVtBQ19UUllfQ09NUElMRShbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWZdLAotW2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpICQxXSwKLWJmZF9jdl9kZWNsX25lZWRlZF8kMT1ubywgYmZkX2N2X2RlY2xfbmVlZGVkXyQxPXllcyldKQotQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2RlY2xfbmVlZGVkXyQxKQotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkXyQxID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgIFtEZWZpbmUgaWYgJDEgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuXSkKLWZpCi1dKWRubAotCi1kbmwgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBhIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMSBpbiBzeXMvcHJvY2ZzLmhdKQotIEFDX0NBQ0hFX1ZBTChiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEsCi0gICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKLSAgICAgIFskMSBhdmFyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT15ZXMsCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDE9bm8KLSAgICldKQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLl0pCi0gZmkKLSBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEpCi1dKQotCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIG1lbWJlciAkMiBpbiB0eXBlICQxIGluIHN5cy9wcm9jZnMuaAotCi1BQ19ERUZVTihCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxLiQyIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIsCi0gICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKLSAgICAgIFskMSBhdmFyOyB2b2lkKiBhcmVmID0gKHZvaWQqKSAmYXZhci4kMl0sCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9bm8KLSAgICldKQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIgPSB5ZXM7IHRoZW4KLSAgIEFDX0RFRklORShbSEFWRV9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSlbX110cmFuc2xpdCgkMiwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLiQyLl0pCi0gZmkKLSBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyKQotXSkKLQotCmRpZmYgLS1naXQgYS9iZmQvYWNsb2NhbC5tNCBiL2JmZC9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTlkNDMyLi4wMDAwMDAwCi0tLSBhL2JmZC9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTAyMiArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gdXNlIGZvcGVuLWJpbi5oIHJhdGhlciB0aGFuIGZvcGVuLXNhbWUuaC4KLUFDX0RFRlVOKEJGRF9CSU5BUllfRk9QRU4sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX1NZU1RFTV0pCi1jYXNlICIke2hvc3R9IiBpbgotY2hhbmdlcXVvdGUoLClkbmwKLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgQUNfREVGSU5FKFVTRV9CSU5BUllfRk9QRU4sIDEsIFtVc2UgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzP10pIDs7Ci1lc2FjXSlkbmwKLQotZG5sIEdldCBhIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCB0byBwdXQgaW50byBNYWtlZmlsZS4KLUFDX0RFRlVOKEJGRF9DQ19GT1JfQlVJTEQsCi1bIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAteiAiJENDX0ZPUl9CVUlMRCI7IHRoZW4KLSAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotICBlbHNlCi0gICAgQ0NfRk9SX0JVSUxEPWdjYwotICBmaQotZmkKLUFDX1NVQlNUKENDX0ZPUl9CVUlMRCkKLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXhdLCBiZmRfY3ZfYnVpbGRfZXhlZXh0LAotICAgIFtybSAtZiBjb25mdGVzdCoKLSAgICAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC5jCi0gICAgIGJmZF9jdl9idWlsZF9leGVleHQ9Ci0gICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBjb25mdGVzdCBjb25mdGVzdC5jIDE+JjUgMj4mNQotICAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAgKikgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICAgZXNhYwotICAgICBkb25lCi0gICAgIHJtIC1mIGNvbmZ0ZXN0KgotICAgICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgPSB4ICYmIGJmZF9jdl9idWlsZF9leGVleHQ9bm9dKQotICBFWEVFWFRfRk9SX0JVSUxEPSIiCi0gIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUX0ZPUl9CVUlMRD0ke2JmZF9jdl9idWlsZF9leGVleHR9Ci1maQotQUNfU1VCU1QoRVhFRVhUX0ZPUl9CVUlMRCldKWRubAotCi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCBhIGRlY2xhcmF0aW9uIGZvciBhIGZ1bmN0aW9uLgotQUNfREVGVU4oQkZEX05FRURfREVDTEFSQVRJT04sCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICQxIG11c3QgYmUgZGVjbGFyZWRdKQotQUNfQ0FDSEVfVkFMKGJmZF9jdl9kZWNsX25lZWRlZF8kMSwKLVtBQ19UUllfQ09NUElMRShbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWZdLAotW2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpICQxXSwKLWJmZF9jdl9kZWNsX25lZWRlZF8kMT1ubywgYmZkX2N2X2RlY2xfbmVlZGVkXyQxPXllcyldKQotQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2RlY2xfbmVlZGVkXyQxKQotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkXyQxID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgIFtEZWZpbmUgaWYgJDEgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuXSkKLWZpCi1dKWRubAotCi1kbmwgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBhIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMSBpbiBzeXMvcHJvY2ZzLmhdKQotIEFDX0NBQ0hFX1ZBTChiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEsCi0gICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKLSAgICAgIFskMSBhdmFyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT15ZXMsCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDE9bm8KLSAgICldKQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLl0pCi0gZmkKLSBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEpCi1dKQotCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIG1lbWJlciAkMiBpbiB0eXBlICQxIGluIHN5cy9wcm9jZnMuaAotCi1BQ19ERUZVTihCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxLiQyIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIsCi0gICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKLSAgICAgIFskMSBhdmFyOyB2b2lkKiBhcmVmID0gKHZvaWQqKSAmYXZhci4kMl0sCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9bm8KLSAgICldKQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIgPSB5ZXM7IHRoZW4KLSAgIEFDX0RFRklORShbSEFWRV9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSlbX110cmFuc2xpdCgkMiwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLiQyLl0pCi0gZmkKLSBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyKQotXSkKLQotCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgNDAgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBMREZMQUdTPSIkTERGTEFHUyIgTElCUz0iJExJQlMiIFwKLUxOX1M9IiRMTl9TIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBPQkpEVU1QPSIkT0JKRFVNUCIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRsdF90YXJnZXQgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotY2FzZSAiJHRhcmdldCIgaW4KLU5PTkUpIGx0X3RhcmdldD0iJGhvc3QiIDs7Ci0qKSBsdF90YXJnZXQ9IiR0YXJnZXQiIDs7Ci1lc2FjCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX0RMT1BFTl0sCi1bbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIl0pCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtd2luMzItZGxsIl0pCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLSAgWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siID0geG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotdGVzdCB4IiRzaWxlbnQiID0geHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqKQotICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCi0gIDs7Ci1dKQotZXNhYwotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGVuYWJsZSBjaGVja3MgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSldKQotCi0jIEFDX0xJQlRPT0xfV0lOMzJfRExMIC0gZGVjbGFyZSBwYWNrYWdlIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpbjMyIGRsbCdzCi1BQ19ERUZVTihBQ19MSUJUT09MX1dJTjMyX0RMTCwgW0FDX0JFRk9SRShbJDBdLCBbQUNfTElCVE9PTF9TRVRVUF0pXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELCBbZG5sCi1kZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLCBbZG5sCi1kZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsIFtkbmwKLWRlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubSB8fCB0ZXN0IC1mICRhY19kaXIvbm0kYWNfZXhlZXh0IDsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotTElCTT0KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotYmVvcyogfCAqLSotY3lnd2luKikKLSAgIyBUaGVzZSBzeXN0ZW0gZG9uJ3QgaGF2ZSBsaWJtCi0gIDs7Ci0qLW5jci1zeXN2NC4zKikKLSAgQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCwgTElCTT0iLWxtdyIpCi0gIEFDX0NIRUNLX0xJQihtLCBtYWluLCBMSUJNPSIkTElCTSAtbG0iKQotICA7OwotKikKLSAgQUNfQ0hFQ0tfTElCKG0sIG1haW4sIExJQk09Ii1sbSIpCi0gIDs7Ci1lc2FjCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLSAgSU5DTFRETD1pZmVsc2UoJCMsMSwtSSQxLFsnLUkke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLAotICBbdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4eWVzICYmIGVuYWJsZV9sdGRsX2luc3RhbGw9bm9dLAotICBbaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHhubzsgdGhlbgotICAgICBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkKLSAgIGVsc2UKLSAgICAgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgIGZpCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4InllcyI7IHRoZW4KLSAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIKLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICAgIElOQ0xUREw9aWZlbHNlKCQjLDEsLUkkMSxbJy1JJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkKLSAgZWxzZQotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsPW5vIgotICAgIExJQkxUREw9Ii1sbHRkbCIKLSAgICBJTkNMVERMPQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotCi1kbmwgVGhpcyBpcyBqdXN0IHRvIHNpbGVuY2UgYWNsb2NhbCBhYm91dCB0aGUgbWFjcm8gbm90IGJlaW5nIHVzZWQKLWlmZWxzZShbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCmRpZmYgLS1naXQgYS9iZmQvYWl4Mzg2LWNvcmUuYyBiL2JmZC9haXgzODYtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjY3YjE3Li4wMDAwMDAwCi0tLSBhL2JmZC9haXgzODYtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQUlYIG9uIFBTLzIgY29yZSBmaWxlcy4KLSAgIFRoaXMgd2FzIGJhc2VkIG9uIHRyYWQtY29yZS5jLCB3aGljaCB3YXMgd3JpdHRlbiBieSBKb2huIEdpbG1vcmUgb2YKLSAgICAgICAgQ3lnbnVzIFN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWluaCBUcmFuLUxlIDxUUkFOTEVASU5URUxMSUNPUlAuQ09NPi4KLSAgIENvbnZlcnRlZCB0byBiYWNrIGVuZCBmb3JtIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaWYgZGVmaW5lZCAoX0FJWCkgJiYgZGVmaW5lZCAoX0kzODYpCi0jZGVmaW5lIE5PQ0hFQ0tTCQkvKiB0aGlzIGlzIGZvciBjb3JlZHVtcC5oICovCi0jZGVmaW5lIF9oX1VTRVIJCQkvKiBhdm9pZCBpbmNsdWRpbmcgdXNlci5oIGZyb20gY29yZWR1bXAuaCAqLwotI2luY2x1ZGUgPHVpbmZvLmg+Ci0jaW5jbHVkZSA8c3lzL2kzODYvY29yZWR1bXAuaD4KLSNlbmRpZiAvKiBfQUlYICYmIF9JMzg2ICovCi0KLS8qIG1heWJlIHRoaXMgY291bGQgd29yayBvbiBzb21lIG90aGVyIGkzODYgYnV0IEkgaGF2ZSBub3QgdHJpZWQgaXQKLSAqIG10cmFubGVAcGFyaXMgLSBUdWUgU2VwIDI0IDEyOjQ5OjM1IDE5OTEKLSAqLwotCi0jaWZuZGVmIENPUl9NQUdJQwotIyBkZWZpbmUgQ09SX01BR0lDICJjb3JlIgotI2VuZGlmCi0KLS8qIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UgcHRyIGlzIHJlYWxseSB2b2lkICogKi8KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSBcCi0gICAgKCgoYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YSkpLT5oZHIpCi0jZGVmaW5lIGNvcmVfc2VjdGlvbihiZmQsbikgXAotICAgICgoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhKS0+c2VjdGlvbnNbbl0pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgXAotICAgICgoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhKS0+cmVnX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnMnNlYyhiZmQpIFwKLSAgICAoKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YSktPnJlZzJfc2VjdGlvbikKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLXN0cnVjdCB0cmFkX2NvcmVfc3RydWN0IHsKLSAgc3RydWN0IGNvcmVoZHIgKmhkcjsJCS8qIGNvcmUgZmlsZSBoZWFkZXIgKi8KLSAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOwotICBhc2VjdGlvbiAqcmVnMl9zZWN0aW9uOwotICBhc2VjdGlvbiAqc2VjdGlvbnNbTUFYX0NPUkVfU0VHU107Ci19OwotCi1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYWl4Mzg2X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBpLG47Ci0gIHVuc2lnbmVkIGNoYXIgbG9uZ2J1Zls0XTsJLyogUmF3IGJ5dGVzIG9mIHZhcmlvdXMgaGVhZGVyIGZpZWxkcyAqLwotICBpbnQgY29yZV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgY29yZWhkcik7Ci0gIHN0cnVjdCBjb3JlaGRyICpjb3JlOwotICBzdHJ1Y3QgbWVyZ2VtIHsKLSAgICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCBjb3JlZGF0YTsKLSAgICBzdHJ1Y3QgY29yZWhkciBpbnRlcm5hbF9jb3JlOwotICB9ICptZXJnZW07Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKWxvbmdidWYsIDEsIHNpemVvZiAobG9uZ2J1ZiksIGFiZmQpICE9IHNpemVvZiAobG9uZ2J1ZikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChzdHJuY21wKGxvbmdidWYsQ09SX01BR0lDLDQpKSByZXR1cm4gMDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDBMLCBmYWxzZSkgPCAwKSByZXR1cm4gMDsKLQotICBtZXJnZW0gPSAoc3RydWN0IG1lcmdlbSAqKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1lcmdlbSkpOwotICBpZiAobWVyZ2VtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgY29yZSA9ICZtZXJnZW0tPmludGVybmFsX2NvcmU7Ci0KLSAgaWYgKChiZmRfcmVhZCAoKFBUUikgY29yZSwgMSwgY29yZV9zaXplLCBhYmZkKSkgIT0gY29yZV9zaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKW1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc2V0X3RkYXRhIChhYmZkLCAmbWVyZ2VtLT5jb3JlZGF0YSk7Ci0gIGNvcmVfaGRyIChhYmZkKSA9IGNvcmU7Ci0KLSAgLyogY3JlYXRlIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgcmF1bmNoeSwgYnV0IGJmZF9jbG9zZSB3YW50cyB0byByZWNsYWltCi0gICAgIHRoZW0gKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjoKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKW1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWcyc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjE6Ci0gICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX3JlZ3NlYyAoYWJmZCkpOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0KLSAgZm9yIChpPTAsIG49MCA7IChpIDwgTUFYX0NPUkVfU0VHUykgJiYgKGNvcmUtPmNkX3NlZ3NbaV0uY3NfdHlwZSkgOyBpKyspCi0gICAgewotICAgICAgaWYgKGNvcmUtPmNkX3NlZ3NbaV0uY3Nfb2Zmc2V0ID09IDApCi0JY29udGludWU7Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsbikgPQotCShhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gICAgICBpZiAoY29yZV9zZWN0aW9uIChhYmZkLG4pID09IE5VTEwpCi0JewotCSAgaW50IGo7Ci0JICBpZiAobiA+IDApCi0JICAgIHsKLQkgICAgICBmb3IgKGo9MDsgaiA8IG47IGorKykKLQkJYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfc2VjdGlvbihhYmZkLCBqKSk7Ci0JICAgIH0KLQkgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKW1lcmdlbSk7Ci0JICBnb3RvIGxvc2VyMTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoY29yZS0+Y2Rfc2Vnc1tpXS5jc190eXBlKQotCXsKLQljYXNlIENPUl9UWVBFX0RBVEE6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5kYXRhIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19MT0FEICsKLQkJCQkJICAgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX1NUQUNLOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIuc3RhY2siOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0xPQUQgKwotCQkJCQkgICBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09SX1RZUEVfTElCREFUQToKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLmxpYmRhdGEiOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX1dSSVRFOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIud3JpdGVhYmxlIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JfVFlQRV9NU0M6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5taXNjIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLnVua25vd24iOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5fcmF3X3NpemUgPSBjb3JlLT5jZF9zZWdzW2ldLmNzX2xlbjsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPnZtYSAgICAgICA9IGNvcmUtPmNkX3NlZ3NbaV0uY3NfYWRkcmVzczsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZpbGVwb3MgICA9IGNvcmUtPmNkX3NlZ3NbaV0uY3Nfb2Zmc2V0OwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5leHQgICAgICA9IE5VTEw7Ci0gICAgICBpZiAobiA+IDApCi0JY29yZV9zZWN0aW9uIChhYmZkLCAobi0xKSktPm5leHQgPSBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pOwotCi0gICAgICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gKytuOwotICAgIH0KLQotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPm5hbWUgPSAiLnJlZzIiOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBzaXplb2YoY29yZS0+Y2RfcmVncyk7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZihjb3JlLT5jZF9mcHJlZ3MpOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gLTE7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPnZtYSA9IC0xOwotCi0gIC8qIFdlJ2xsIGFjY2VzcyB0aGUgcmVncyBhZnJlc2ggaW4gdGhlIGNvcmUgZmlsZSwgbGlrZSBhbnkgc2VjdGlvbjogKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKW9mZnNldG9mKHN0cnVjdCBjb3JlaGRyLGNkX3JlZ3NbMF0pOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKW9mZnNldG9mKHN0cnVjdCBjb3JlaGRyLAotCQkJCQkJICAgIGNkX2ZwcmVncyk7Ci0KLSAgLyogYWRkIHRoZSAyIHJlZyBmYWtlIHNlY3Rpb25zIHRvIGFiZmQgKi8KLSAgYWJmZC0+c2VjdGlvbl9jb3VudCArPSAyOwotICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWcyc2VjIChhYmZkKTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfc2VjdGlvbiAoYWJmZCwgMCk7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWFpeDM4Nl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2hkciAoYWJmZCktPmNkX2NvbW07Ci19Ci0KLXN0YXRpYyBpbnQKLWFpeDM4Nl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+Y2RfY3Vyc2lnOwotfQotCi1zdGF0aWMgYm9vbGVhbgotYWl4Mzg2X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCQkvKiBGSVhNRSwgV2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyBhdCB0aGlzCi0JCQkJICAgcG9pbnQgKi8KLX0KLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoUFJPVE8oYmZkX3ZtYSwgKCopLCAoICAgICAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lIE5PX0dFVFMgKChQUk9UTyhiZmRfc2lnbmVkX3ZtYSwgKCopLCAoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgoUFJPVE8odm9pZCwgICAgICAgICgqKSwgKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgYWl4Mzg2X2NvcmVfdmVjID0KLSAgewotICAgICJhaXgzODYtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5HX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAgICcgJywJCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwgLyogZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULCAvKiBoZHJzICovCi0KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgICBfYmZkX2R1bW15X3RhcmdldCwgYWl4Mzg2X2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF9jcmVhdGVfb2JqZWN0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoYWl4Mzg2KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LWFkb2JlLmMgYi9iZmQvYW91dC1hZG9iZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE2YzdlLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWFkb2JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhLm91dC5hZG9iZSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgQmFzZWQgb24gYm91dC5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvYWRvYmUuaCIKLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYzsJCS8qIEZvcndhcmQgZGVjbCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYW91dF9hZG9iZV9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBzZWN0KSk7Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKLSAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCi0KLXZvaWQgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3ApKTsKLQkgCi12b2lkCi1hb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyIHN0cnVjdHVyZSBpbnRvIHRoZQotICAgc3VwcGxpZWQgYnVmZmVyIHJlYWR5IGZvciB3cml0aW5nIHRvIGRpc2suICAqLwotCi1QUk9UTyh2b2lkLCBhb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfb3V0LAotCSAgKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsCi0JICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwotdm9pZAotYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIHJhdyBkYXRhLCBmcm9tIHRoZSBmaWVsZHMgaW4gdGhlIGV4ZWMgc3RydWN0LiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2luZm8gICwgYnl0ZXMtPmVfaW5mbyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90ZXh0ICAsIGJ5dGVzLT5lX3RleHQpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZGF0YSAgLCBieXRlcy0+ZV9kYXRhKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2JzcyAgICwgYnl0ZXMtPmVfYnNzKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3N5bXMgICwgYnl0ZXMtPmVfc3ltcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9lbnRyeSAsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3Ryc2l6ZSwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Ryc2l6ZSwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1hb3V0X2Fkb2JlX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgY2hhciAqdGFyZzsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGFuZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLQotICAvKiBOb3JtYWxseSB3ZSBqdXN0IGNvbXBhcmUgZm9yIHRoZSBtYWdpYyBudW1iZXIuCi0gICAgIEhvd2V2ZXIsIGEgYnVuY2ggb2YgQWRvYmUgdG9vbHMgYXJlbid0IGZpeGVkIHVwIHlldDsgdGhleSBnZW5lcmF0ZQotICAgICBmaWxlcyB1c2luZyBaTUFHSUMoISkuCi0gICAgIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHTlVUQVJHRVQgaXMgc2V0IHRvICJhLm91dC5hZG9iZSIsIHdlIHdpbGwKLSAgICAgdGFrZSBqdXN0IGFib3V0IGFueSBhLm91dCBmaWxlIGFzIGFuIEFkb2JlIGEub3V0IGZpbGUuICBGSVhNRSEgICovCi0KLSAgaWYgKE5fQkFETUFHIChhbmV4ZWMpKSB7Ci0gICAgdGFyZyA9IGdldGVudiAoIkdOVVRBUkdFVCIpOwotICAgIGlmICh0YXJnICYmICFzdHJjbXAgKHRhcmcsIGFfb3V0X2Fkb2JlX3ZlYy5uYW1lKSkKLSAgICAgIDsJCS8qIEp1c3QgY29udGludWUgYW55d2F5LCBpZiBzcGVjaWZpY2FsbHkgc2V0IHRvIHRoaXMgZm9ybWF0ICovCi0gICAgZWxzZQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotICB9Ci0KLSAgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCAmZXhlY19ieXRlcywgJmFuZXhlYyk7Ci0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgYW91dF9hZG9iZV9jYWxsYmFjayk7Ci19Ci0KLQotLyogRmluaXNoIHVwIHRoZSBvcGVuaW5nIG9mIGEgYi5vdXQgZmlsZSBmb3IgcmVhZGluZy4gIEZpbGwgaW4gYWxsIHRoZQotICAgZmllbGRzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IGNvbW1vbiBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYW91dF9hZG9iZV9jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGFzZWN0aW9uICpzZWN0OwotICBzdHJ1Y3QgZXh0ZXJuYWxfc2VnZGVzYyBleHRbMV07Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciB0cnlfYWdhaW5bMzBdOwkvKiBuYW1lIGFuZCBudW1iZXIgKi8KLSAgY2hhciAqbmV3bmFtZTsKLSAgaW50IHRyeW51bTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgLyogQXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgLS0gdW5rbm93biBpbiB0aGlzIGZvcm1hdC4gICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGJmZF9hcmNoX3Vua25vd24sIDApOwotCi0gIC8qIFRoZSBwb3NpdGlvbnMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0KLSAgLyogU3VjayB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlLCBvbmUgc2VjdGlvbiBhdCBhIHRpbWUuICAqLwotCi0gIGZvciAoOzspIHsKLSAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGV4dCwgMSwgc2l6ZW9mICgqZXh0KSwgYWJmZCkgIT0gc2l6ZW9mICgqZXh0KSkgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHN3aXRjaCAoZXh0LT5lX3R5cGVbMF0pIHsKLSAgICBjYXNlIE5fVEVYVDoKLSAgICAgIHNlY3Rpb25fbmFtZSA9ICIudGV4dCI7Ci0gICAgICBmbGFncyA9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fREFUQToKLSAgICAgIHNlY3Rpb25fbmFtZSA9ICIuZGF0YSI7Ci0gICAgICBmbGFncyA9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fQlNTOgotICAgICAgc2VjdGlvbl9uYW1lID0gIi5ic3MiOwotICAgICAgZmxhZ3MgPSBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMDoKLSAgICAgIGdvdG8gbm9fbW9yZV9zZWN0aW9uczsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IFVua25vd24gc2VjdGlvbiB0eXBlIGluIGEub3V0LmFkb2JlIGZpbGU6ICV4XG4iKSwgCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBleHQtPmVfdHlwZVswXSk7Ci0gICAgICBnb3RvIG5vX21vcmVfc2VjdGlvbnM7Ci0gICAgfQotCi0gICAgLyogRmlyc3Qgb25lIGlzIGNhbGxlZCAiLnRleHQiIG9yIHdoYXRldmVyOyBzdWJzZXF1ZW50IG9uZXMgYXJlCi0gICAgICAgIi50ZXh0MSIsICIudGV4dDIiLCAuLi4gKi8KLQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0gICAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb25fbmFtZSk7Ci0gICAgdHJ5bnVtID0gMDsKLSAgICB3aGlsZSAoIXNlY3QpIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19lcnJvcikKLQlyZXR1cm4gMDsJLyogU29tZSBvdGhlciBlcnJvciAtLSBzbGlkZSBpbnRvIHRoZSBzdW5zZXQgKi8KLSAgICAgIHNwcmludGYgKHRyeV9hZ2FpbiwgIiVzJWQiLCBzZWN0aW9uX25hbWUsICsrdHJ5bnVtKTsKLSAgICAgIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCB0cnlfYWdhaW4pOwotICAgIH0KLQotICAgIC8qIEZpeCB0aGUgbmFtZSwgaWYgaXQgaXMgYSBzcHJpbnRmJ2QgbmFtZS4gICovCi0gICAgaWYgKHNlY3QtPm5hbWUgPT0gdHJ5X2FnYWluKSB7Ci0gICAgICBuZXduYW1lID0gKGNoYXIgKikgYmZkX3phbGxvYyhhYmZkLCBzdHJsZW4gKHNlY3QtPm5hbWUpKTsKLSAgICAgIGlmIChuZXduYW1lID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgICBzdHJjcHkgKG5ld25hbWUsIHNlY3QtPm5hbWUpOwotICAgICAgc2VjdC0+bmFtZSA9IG5ld25hbWU7Ci0gICAgfQotCi0gICAgLyogTm93IHNldCB0aGUgc2VjdGlvbidzIGF0dHJpYnV0ZXMuICAqLwotICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdCwgZmxhZ3MpOwotICAgIHNlY3QtPl9yYXdfc2l6ZSA9ICgoZXh0LT5lX3NpemVbMF0gPDwgOCkJLyogQXNzdW1lZCBiaWctZW5kaWFuICovCi0JCSAgICAgIHwgZXh0LT5lX3NpemVbMV0gPDwgOCkKLQkJICAgICAgfCBleHQtPmVfc2l6ZVsyXTsKLSAgICBzZWN0LT5fY29va2VkX3NpemUgPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgc2VjdC0+dm1hID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPmVfdmlydGJhc2UpOwotICAgIHNlY3QtPmZpbGVwb3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+ZV9maWxlYmFzZSk7Ci0gICAgLyogRklYTUUgWFhYIGFsaWdubWVudD8gKi8KLQotICAgIC8qIFNldCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBmaXJzdCBzZWN0aW9uIG9mIGVhY2ggdHlwZS4gICovCi0gICAgaWYgKHRyeW51bSA9PSAwKSBzd2l0Y2ggKGV4dC0+ZV90eXBlWzBdKSB7Ci0gICAgY2FzZSBOX1RFWFQ6Ci0gICAgICBzZWN0LT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgICAgIHNlY3QtPnJlbG9jX2NvdW50ID0gZXhlY3AtPmFfdHJzaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fREFUQToKLSAgICAgIHNlY3QtPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGICgqZXhlY3ApOwotICAgICAgc2VjdC0+cmVsb2NfY291bnQgPSBleGVjcC0+YV9kcnNpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLW5vX21vcmVfc2VjdGlvbnM6ICAKLQotICBhZGF0YShhYmZkKS5yZWxvY19lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgYWRhdGEoYWJmZCkuc3ltYm9sX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCB7Ci0gICAgc3RydWN0IGFvdXRkYXRhIGE7Ci0gICAgc3RydWN0IGludGVybmFsX2V4ZWMgZTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKLQotICBhZGF0YShhYmZkKS5yZWxvY19lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgYWRhdGEoYWJmZCkuc3ltYm9sX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLSAgc3RhdGljIHN0cnVjdCBleHRlcm5hbF9zZWdkZXNjIHNlbnRpbmVsWzFdOwkvKiBJbml0aWFsaXplZCB0byB6ZXJvICovCi0gIGFzZWN0aW9uICpzZWN0OwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV9pbmZvID0gWk1BR0lDOwotCi0gIC8qIENhbGN1bGF0ZSB0ZXh0IHNpemUgYXMgdG90YWwgb2YgdGV4dCBzZWN0aW9ucywgZXRjLiAqLwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ID0gMDsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2RhdGEgPSAwOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzICA9IDA7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSAwOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gMDsKLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkJewotICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX3RleHQgKz0gc2VjdC0+X3Jhd19zaXplOwotICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSArPSBzZWN0LT5yZWxvY19jb3VudCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCk7Ci0gICAgfSBlbHNlIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplICs9IHNlY3QtPnJlbG9jX2NvdW50ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgICB9IGVsc2UgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0FMTE9DICYmICEoc2VjdC0+ZmxhZ3MgJiBTRUNfTE9BRCkpIHsKLSAgICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICB9Ci0gIH0KLQotICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpCi0gICAgCQkJCSogc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIGFvdXRfYWRvYmVfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNfaGRyIChhYmZkKSwgJnN3YXBwZWRfaGRyKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZzd2FwcGVkX2hkciwgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIFRleHQgZmlyc3QsIGRhdGEgbmV4dCwgcmVzdAotICAgICBhZnRlcndhcmQuICAqLwotCi0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7Ci0gICAgICBhb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpOwotICAgIH0KLSAgfQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJewotICAgICAgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KTsKLSAgICB9Ci0gIH0KLSAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgaWYgKCEoc2VjdC0+ZmxhZ3MgJiAoU0VDX0NPREV8U0VDX0RBVEEpKSkgewotICAgICAgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KTsKLSAgICB9Ci0gIH0KLQotICAvKiBXcml0ZSBmaW5hbCBgc2VudGluZWxgIHNlY3Rpb24gaGVhZGVyICh3aXRoIHR5cGUgb2YgMCkuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzZW50aW5lbCwgMSwgc2l6ZW9mICgqc2VudGluZWwpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mICgqc2VudGluZWwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYW91dF8zMl93cml0ZV9zeW1zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkJewotICAgICAgICAgIGlmICghYW91dF8zMl9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgc2VjdCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICAgICAgaWYgKCFhb3V0XzMyX3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlY3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUgWFhYICovCi19Ci0MCi1zdGF0aWMgYm9vbGVhbgotYW91dF9hZG9iZV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBmaWxlX3B0ciBzZWN0aW9uX3N0YXJ0OwotICBzZWNfcHRyIHNlY3Q7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpIHsgLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KLQotICAgIC8qIEFzc2lnbiBmaWxlIG9mZnNldHMgdG8gc2VjdGlvbnMuICBUZXh0IHNlY3Rpb25zIGFyZSBmaXJzdCwgYW5kCi0gICAgICAgYXJlIGNvbnRpZ3VvdXMuICBUaGVuIGRhdGEgc2VjdGlvbnMuICBFdmVyeXRoaW5nIGVsc2UgYXQgdGhlIGVuZC4gICovCi0KLSAgICBzZWN0aW9uX3N0YXJ0ID0gTl9UWFRPRkYgKGlnbm9yZTwtLT5tZSk7Ci0KLSAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJewotICAgICAgICBzZWN0LT5maWxlcG9zID0gc2VjdGlvbl9zdGFydDsKLQkvKiBGSVhNRTogIFJvdW5kIHRvIGFsaWdubWVudCAqLwotCXNlY3Rpb25fc3RhcnQgKz0gc2VjdC0+X3Jhd19zaXplOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUyAmJgotCSAgIShzZWN0LT5mbGFncyAmIChTRUNfQ09ERXxTRUNfREFUQSkpKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogcmVnYXJkbGVzcywgb25jZSB3ZSBrbm93IHdoYXQgd2UncmUgZG9pbmcsIHdlIG1pZ2h0IGFzIHdlbGwgZ2V0IGdvaW5nICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCAhPSAwKSB7Ci0gICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgP3RydWU6ZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24KLSAgICAgIHx8IGFyY2ggPT0gYmZkX2FyY2hfbTY4aykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgCi1hb3V0X2Fkb2JlX3NpemVvZl9oZWFkZXJzIChpZ25vcmVfYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBzaXplb2Yoc3RydWN0IGludGVybmFsX2V4ZWMpOwotfQotCi0KLQotCi0vKiBCdWlsZCB0aGUgdHJhbnNmZXIgdmVjdG9yIGZvciBBZG9iZSBBLk91dCBmaWxlcy4gICovCi0KLSNkZWZpbmUgYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCBhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgYW91dF8zMl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gICgocmVsb2NfaG93dG9fdHlwZSAqKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2RlZmluZQlhb3V0XzMyX3NldF9hcmNoX21hY2gJCWFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaAotI2RlZmluZQlhb3V0XzMyX3NldF9zZWN0aW9uX2NvbnRlbnRzCWFvdXRfYWRvYmVfc2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZQlhb3V0XzMyX3NpemVvZl9oZWFkZXJzCQlhb3V0X2Fkb2JlX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIGFvdXRfMzJfYmZkX3JlbGF4X3NlY3Rpb24gICAgICAgYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBhb3V0XzMyX2JmZF9nY19zZWN0aW9ucyAgICAgICAgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBhb3V0XzMyX2JmZF9saW5rX2FkZF9zeW1ib2xzCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2ZpbmFsX2xpbmsJCV9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbglfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjID0KLXsKLSAgImEub3V0LmFkb2JlIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIHVua25vd24gKGJpZyBhc3N1bWVkKSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhkciBieXRlIG9yZGVyIGlzIGJpZyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUICksCi0gIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUkVMT0MpLAotICAnXycsCQkJCS8qICBzeW1ib2wgbGVhZGluZyBjaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBhb3V0X2Fkb2JlX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBhb3V0X2Fkb2JlX21rb2JqZWN0LCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBhb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvYW91dC1hcm0uYyBiL2JmZC9hb3V0LWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzY1ZjlkLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgcmF3IEFSTSBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAoKE5fTUFHSUMoeCkgPT0gTk1BR0lDKSA/IDB4ODAwMCA6IFwKLSAgIChOX01BR0lDKHgpICE9IFpNQUdJQykgPyAwIDogXAotICAgKE5fU0hBUkVEX0xJQih4KSkgPyAoKHgpLmFfZW50cnkgJiB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKSkgOiBcCi0gICBURVhUX1NUQVJUX0FERFIpCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDB4ODAwMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4ODAwMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfYXJtCi0KLSNkZWZpbmUgTVkoT1ApIENBVChhb3V0YXJtXyxPUCkKLSNkZWZpbmUgTl9CQURNQUcoeCkgKCgoKHgpLmFfaW5mbyAmIH4wMDcyMDApICE9IFpNQUdJQykgJiYgXAotICAgICAgICAgICAgICAgICAgICAgKCgoeCkuYV9pbmZvICYgfjAwNjAwMCkgIT0gT01BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKHgpLmFfaW5mbyAhPSBOTUFHSUMpKQotI2RlZmluZSBOX01BR0lDKHgpICgoeCkuYV9pbmZvICYgfjA3MjAwKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgTVlBUk0oT1ApIENBVChhb3V0YXJtXyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgCSpNWUFSTShiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0JCQkJUEFSQU1TKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiAJCU1ZQVJNKHdyaXRlX29iamVjdF9jb250ZW50cykJUEFSQU1TKChiZmQgKikpOwotCi0vKiBBdm9pZCBtdWx0aXBsZSBkZWZpbmluaXRpb25zIGZyb20gYW91dHggaWYgc3VwcG9ydGluZyBzdGFuZGFyYWQgYS5vdXQgCi0gICBhcyB3ZWxsIGFzIG91ciBvd24uICAqLwotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhhb3V0YXJtLF8zMl8seSkKLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dGFybV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1NWShmaXhfcGNyZWxfMjZfZG9uZSkJUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLU1ZKGZpeF9wY3JlbF8yNikJIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJCSAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIE1ZKHN3YXBfc3RkX3JlbG9jX2luKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLAotCQkJCQkgICBhcmVsZW50ICosIGFzeW1ib2wgKiosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKLXZvaWQgTVkoc3dhcF9zdGRfcmVsb2Nfb3V0KSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCAKLQkJCQkgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikpOwotCi1yZWxvY19ob3d0b190eXBlIE1ZKGhvd3RvX3RhYmxlKVtdID0KLXsKLSAgLyogdHlwZSBycyBzaXplIGJzeiBwY3JlbCBiaXRwb3Mgb3ZyZiBzZiBuYW1lIHBhcnRfaW5wbCByZWFkbWFzayBzZXRtYXNrCi0gICAgIHBjZG9uZSAqLwotICBIT1dUTyAoMCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsIHRydWUsCi0JIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsIHRydWUsCi0JIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDMsIDIsIDIsIDI2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIE1ZKGZpeF9wY3JlbF8yNiksCi0JICJBUk0yNiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoNCwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCB0cnVlLAotCSAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8gKDUsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCB0cnVlLAotCSAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKDYsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKDcsIDIsIDIsIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSBNWShmaXhfcGNyZWxfMjZfZG9uZSksICJBUk0yNkQiLCB0cnVlLCAweDAsIDB4MCwKLQkgZmFsc2UpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTyAoOSwgMCwgLTEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJORUcxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDEwLCAwLCAtMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIk5FRzMyIiwgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpCi19OwotCi0jZGVmaW5lIFJFTE9DX0FSTV9CSVRTX05FR19CSUcgICAgICAoKHVuc2lnbmVkIGludCkgMHgwOCkKLSNkZWZpbmUgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRSAgICgodW5zaWduZWQgaW50KSAweDEwKQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvKShhYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbDsKLSAgICAgaW50ICpyX2luZGV4OwotICAgICBpbnQgKnJfZXh0ZXJuOwotICAgICBpbnQgKnJfcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgdW5zaWduZWQgaW50IHJfcGNyZWxfZG9uZTsKLSAgdW5zaWduZWQgaW50IHJfbmVnOwotICBpbnQgaW5kZXg7Ci0KLSAgKnJfcGNyZWwgPSAwOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICAqcl9pbmRleCAgICAgPSAgKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgIHwgcmVsLT5yX2luZGV4WzJdKTsKLSAgICAgICpyX2V4dGVybiAgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgICAgcl9uZWcgCSAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRykpOwotICAgICAgcl9sZW5ndGggICAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0JCSAgICAgID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpyX2luZGV4ICAgICA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgfCByZWwtPnJfaW5kZXhbMF0pOwotICAgICAgKnJfZXh0ZXJuICAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotICAgICAgcl9wY3JlbF9kb25lID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7Ci0gICAgICByX25lZyAJICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFKSk7Ci0gICAgICByX2xlbmd0aCAgICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLQkJICAgICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotICBpbmRleCA9IHJfbGVuZ3RoICsgNCAqIHJfcGNyZWxfZG9uZSArIDggKiByX25lZzsKLSAgaWYgKGluZGV4ID09IDMpCi0gICAgKnJfcGNyZWwgPSAxOwotCi0gIHJldHVybiBNWShob3d0b190YWJsZSkgKyBpbmRleDsKLX0KLSAKLSNkZWZpbmUgTVlfcmVsb2NfaG93dG8oQkZELCBSRUwsIElOLCBFWCwgUEMpIFwKLQlNWShyZWxvY19ob3d0bykgKEJGRCwgUkVMLCAmSU4sICZFWCwgJlBDKQotCi12b2lkCi1NWShwdXRfcmVsb2MpKGFiZmQsIHJfZXh0ZXJuLCByX2luZGV4LCB2YWx1ZSwgaG93dG8sIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCByX2V4dGVybjsKLSAgICAgaW50IHJfaW5kZXg7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbmVnOwotCi0gIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7Ci0gIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0KLSAgLyogU3BlY2lhbCBjYXNlIGZvciBicmFuY2ggcmVsb2NhdGlvbnMuICovCi0gIGlmIChob3d0by0+dHlwZSA9PSAzIHx8IGhvd3RvLT50eXBlID09IDcpCi0gICAgcl9sZW5ndGggPSAzOwotCi0gIHJfcGNyZWwgID0gaG93dG8tPnR5cGUgJiA0OyAJLyogUEMgUmVsYXRpdmUgZG9uZT8gKi8KLSAgcl9uZWcgPSBob3d0by0+dHlwZSAmIDg7CS8qIE5lZ2F0aXZlIHJlbG9jYXRpb24gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgICAgcmVsb2MtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICByZWxvYy0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICByZWxvYy0+cl90eXBlWzBdID0KLQkoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCSB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHIDogMCkKLQkgfCAocl9uZWcgPwkgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRyA6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgcmVsb2MtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICByZWxvYy0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICByZWxvYy0+cl90eXBlWzBdID0KLQkoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQkgfCAocl9uZWcgPwkgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRSA6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7Ci0gICAgfQotfQotIAotI2RlZmluZSBNWV9wdXRfcmVsb2MoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpIFwKLSAgTVkocHV0X3JlbG9jKShCRkQsIEVYVCwgSURYLCBWQUwsIEhPV1RPLCBSRUxPQykKLQotdm9pZAotTVkocmVsb2NhdGFibGVfcmVsb2MpKGhvd3RvLCBhYmZkLCByZWxvYywgYW1vdW50LCByX2FkZHIpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jOwotICAgICBiZmRfdm1hICphbW91bnQ7Ci0gICAgIGJmZF92bWEgcl9hZGRyOwotewotICBpZiAoaG93dG8tPnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBpZiAocmVsb2MtPnJfdHlwZVswXSAKLQkgICYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkKLQkgICAgID8gUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKQotCXsKLQkgIC8qIFRoZSByZWxvYyBpcyBzdGlsbCBleHRlcm5hbCwgc28gZG9uJ3QgbW9kaWZ5IGFueXRoaW5nLiAqLwotCSAgKmFtb3VudCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICphbW91bnQgLT0gcl9hZGRyOwotCSAgLyogQ2hhbmdlIHRoZSByX3BjcmVsIHZhbHVlIC0tIG9uIHRoZSBBUk0sIHRoaXMgYml0IGlzIHNldCBvbmNlIHRoZQotCSAgICAgcmVsb2NhdGlvbiBpcyBkb25lLiAgKi8KLQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCSAgICByZWxvYy0+cl90eXBlWzBdIHw9IFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzsKLQkgIGVsc2UKLQkgICAgcmVsb2MtPnJfdHlwZVswXSB8PSBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoaG93dG8tPnR5cGUgPT0gNykKLSAgICAqYW1vdW50ID0gMDsKLX0KLQotI2RlZmluZSBNWV9yZWxvY2F0YWJsZV9yZWxvYyhIT1csIEJGRCwgUkVMLCBBTU9VTlQsIEFERFIpIFwKLSAgTVkocmVsb2NhdGFibGVfcmVsb2MpKEhPVywgQkZELCBSRUwsICYoQU1PVU5UKSwgQUREUikKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2X2RvbmUpIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2KSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICBpZiAocmVsb2NhdGlvbiAmIDMpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgaWYgKHJlbG9jYXRpb24gJiAweDAyMDAwMDAwKQotICAgIHsKLSAgICAgIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpICE9IH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+MHgwM2ZmZmZmZikKLSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHRhcmdldCAmPSB+MHgwMGZmZmZmZjsKLSAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDIpICYgMHgwMGZmZmZmZjsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgotICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCi0gIHJlbG9jX2VudHJ5LT5ob3d0byA9ICZNWShob3d0b190YWJsZSlbN107Ci0gIAotICByZXR1cm4gZmxhZzsKLX0KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1NWShiZmRfcmVsb2NfdHlwZV9sb29rdXApKGFiZmQsY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSNkZWZpbmUgQVNURChpLGopICAgICAgIGNhc2UgaTogcmV0dXJuICZNWShob3d0b190YWJsZSlbal0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotICAgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgICAgfQotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTYsIDEpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAzKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCA0KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgNSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzJfUENSRUwsIDYpOwotICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgIH0KLX0KLQotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19pbiBNWShzd2FwX3N0ZF9yZWxvY19pbikKLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IE1ZKHN3YXBfc3RkX3JlbG9jX291dCkKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0vKiAjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlICovCi0vKiAjZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzICovCi0vKiAjZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rICovCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX3BjcmVsOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IE1ZX3JlbG9jX2hvd3RvIChhYmZkLCBieXRlcywgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOwotCi0gIE1PVkVfQUREUkVTUyAoMCk7Ci19Ci0KLXZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25lZyA9IDA7CS8qIE5lZ2F0aXZlIHJlbG9jcyB1c2UgdGhlIEJBU0VSRUwgYml0LiAgKi8KLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl9sZW5ndGggPSBnLT5ob3d0by0+c2l6ZSA7ICAgLyogU2l6ZSBhcyBhIHBvd2VyIG9mIHR3byAqLwotICBpZiAocl9sZW5ndGggPCAwKQotICAgIHsKLSAgICAgIHJfbGVuZ3RoID0gLXJfbGVuZ3RoOwotICAgICAgcl9uZWcgPSAxOwotICAgIH0KLQotICByX3BjcmVsICA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsgLyogUmVsYXRpdmUgdG8gUEM/ICovCi0KLSAgLyogRm9yIFJJU0MgaVgsIGluIHBjLXJlbGF0aXZlIHJlbG9jcyB0aGUgcl9wY3JlbCBiaXQgbWVhbnMgdGhhdCB0aGUKLSAgICAgcmVsb2NhdGlvbiBoYXMgYmVlbiBkb25lIGFscmVhZHkgKE9ubHkgZm9yIHRoZSAyNi1iaXQgb25lIEkgdGhpbmspPz8/ISEhCi0gICAgICovCi0KLSAgaWYgKGctPmhvd3RvLT50eXBlID09IDMpCi0gICAgewotICAgICAgcl9sZW5ndGggPSAzOwotICAgICAgcl9wY3JlbCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChnLT5ob3d0by0+dHlwZSA9PSA3KQotICAgIHsgCi0gICAgICByX2xlbmd0aCA9IDM7Ci0gICAgICByX3BjcmVsID0gMTsKLSAgICB9Ci0gIAotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbgotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCSggIChyX2V4dGVybiA/ICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRzogMCkKLQkgfCAocl9wY3JlbCAgPyAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzogMCkKLQkgfCAocl9uZWcgICAgPyAgIFJFTE9DX0FSTV9CSVRTX05FR19CSUc6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRTogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgTVlfQkZEX1RBUkdFVAotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYzsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9saXR0bGVfdmVjID0KLXsKLSAgImEub3V0LWFybS1saXR0bGUiLCAgICAgICAgICAgLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgICAgLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICBBUl9QQURfQ0hBUiwgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gICYgYW91dF9hcm1fYmlnX3ZlYywKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYyA9Ci17Ci0gICJhLm91dC1hcm0tYmlnIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLCAgICAgICAgICAgICAgIC8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLCAgICAgICAgICAgICAgIC8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8ICAgICAgICAgLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsICAgICAgICAgICAgICAgICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LCAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKLQotICAmIGFvdXRfYXJtX2xpdHRsZV92ZWMsCi0gIAotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtZW5jYXAuYyBiL2JmZC9hb3V0LWVuY2FwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWY5MDM3Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWVuY2FwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhLm91dCBmaWxlcyBlbmNhcHN1bGF0ZWQgd2l0aCBDT0ZGIGhlYWRlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVEhJUyBNT0RVTEUgSVMgTk9UIEZJTklTSEVELiAgSVQgUFJPQkFCTFkgRE9FU04nVCBFVkVOIENPTVBJTEUuICAqLwotCi0jaWYgMAotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPHN5c2RlcC5oPgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgPGFvdXQvYW91dDY0Lmg+Ci0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKmVuY2FwX3JlYWxfY2FsbGJhY2sgKCk7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKgotZW5jYXBfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY2J1Zls0XTsgLyogUmF3IGJ5dGVzIG9mIG1hZ2ljIG51bWJlciBmcm9tIGZpbGUgKi8KLSAgdW5zaWduZWQgbG9uZyBtYWdpYzsJCS8qIFN3YXBwZWQgbWFnaWMgbnVtYmVyICovCi0gIHNob3J0IGNvZmZfbWFnaWM7Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKW1hZ2ljYnVmLCAxLCBzaXplb2YgKG1hZ2ljYnVmKSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobWFnaWNidWYpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIGNvZmZfbWFnaWMgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIG1hZ2ljYnVmKTsKLSAgaWYgKGNvZmZfbWFnaWMgIT0gQ09GRl9NQUdJQykKLSAgICByZXR1cm4gMDsJCQkvKiBOb3QgYW4gZW5jYXAgY29mZiBmaWxlICovCi0KLSAgX19oZWFkZXJfb2Zmc2V0X3RlbXA9PUNPRkZfTUFHSUMgPyBzaXplb2Yoc3RydWN0IGNvZmZoZWFkZXIpIDogMCkKLSAgKGZzZWVrICgoZiksIEhFQURFUl9PRkZTRVQoKGYpKSwgMSkpCi0KLSAgbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIG1hZ2ljYnVmKTsKLQotICBpZiAoTl9CQURNQUcgKCooKHN0cnVjdCBpbnRlcm5hbF9leGVjICopICZtYWdpYykpKSByZXR1cm4gMDsKLQotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKLQotICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZleGVjLCBlbmNhcF9yZWFsY2FsbGJhY2spOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIHJlYWRpbmcgb2YgYSBlbmNhcHN1bGF0ZWQtY29mZiBhLm91dCBmaWxlIGhlYWRlciAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1lbmNhcF9yZWFsX2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgCi0gIE1ZKGNhbGxiYWNrKShhYmZkLCBleGVjcCk7Ci0gIAotICAvKiBJZiB3ZSBoYXZlIGEgY29mZiBoZWFkZXIsIGl0IGNhbiBnaXZlIHVzIGJldHRlciB2YWx1ZXMgZm9yCi0gICAgIHRleHRfc3RhcnQgYW5kIGV4ZWNfZGF0YV9zdGFydC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bAotICAgICBmb3IgcmVtb3RlIGRlYnVnZ2luZyBvZiBlbWJlZGRlZCBzeXN0ZW1zLiAgKi8KLSAgaWYgKE5fRkxBR1MoZXhlY19hb3V0aGRyKSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkKLSAgewotCSAgc3RydWN0IGNvZmZoZWFkZXIgY2g7Ci0JICBpbnQgdmFsOwotCSAgdmFsID0gbHNlZWsgKGV4ZWNjaGFuLCAtKHNpemVvZiAoQU9VVEhEUikgKyBzaXplb2YgKGNoKSksIDEpOwotCSAgaWYgKHZhbCA9PSAtMSkKLQkJICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7Ci0JICB2YWwgPSBteXJlYWQgKGV4ZWNjaGFuLCAmY2gsIHNpemVvZiAoY2gpKTsKLQkgIGlmICh2YWwgPCAwKQotCQkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKLQkgIHRleHRfc3RhcnQgPSBjaC50ZXh0X3N0YXJ0OwotCSAgZXhlY19kYXRhX3N0YXJ0ID0gY2guZGF0YV9zdGFydDsKLSAgfSBlbHNlCi0JIHsKLQkgIHRleHRfc3RhcnQgPQotCSAgICBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKSA/IDAgOiBOX1RYVEFERFIgKGV4ZWNfYW91dGhkcik7Ci0JICBleGVjX2RhdGFfc3RhcnQgPSBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKQotCSAgICA/IGV4ZWNfYW91dGhkci5hX3RleHQgOiBOX0RBVEFERFIgKGV4ZWNfYW91dGhkcik7Ci0gIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7IC8qIEZJWE1FICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEVuY2Fwc3VsYXRlZCBDT0ZGIGZvcm1hdC4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotYm9vbGVhbgotZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgZGF0YV9wYWQgPSAwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLS8qKioqKiogRklYTUU6ICBGcmFnbWVudHMgZnJvbSB0aGUgb2xkIEdOVSBMRCBwcm9ncmFtIGZvciBkZWFsaW5nIHdpdGgKLSAgICAgICAgZW5jYXAgY29mZi4gICovCi1zdHJ1Y3QgY29mZmhlYWRlciBjb2ZmaGVhZGVyOwotaW50IG5lZWRfY29mZl9oZWFkZXI7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gY291bnQgdGhlIGhlYWRlciBhcyBwYXJ0IG9mCi0gICAgIHRoZSB0ZXh0IHNpemUsIGFuZCBpbml0aWFsaXplIHRoZSB0ZXh0IHNpemUgYWNjb3JkaW5nbHkuCi0gICAgIFRoaXMgZGVwZW5kcyBvbiB0aGUga2luZCBvZiBzeXN0ZW0gYW5kIG9uIHRoZSBvdXRwdXQgZm9ybWF0IHNlbGVjdGVkLiAgKi8KLQotICBOX1NFVF9NQUdJQyAob3V0aGVhZGVyLCBtYWdpYyk7Ci0jaWZkZWYgSU5JVElBTElaRV9IRUFERVIKLSAgSU5JVElBTElaRV9IRUFERVI7Ci0jZW5kaWYKLQotICB0ZXh0X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleGVjKTsKLSNpZmRlZiBDT0ZGX0VOQ0FQU1VMQVRFCi0gIGlmIChyZWxvY2F0YWJsZV9vdXRwdXQgPT0gMCAmJiBmaWxlX3RhYmxlWzBdLmp1c3Rfc3ltc19mbGFnID09IDApCi0gICAgewotICAgICAgbmVlZF9jb2ZmX2hlYWRlciA9IDE7Ci0gICAgICAvKiBzZXQgdGhpcyBmbGFnIG5vdywgc2luY2UgaXQgd2lsbCBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBOX1RYVE9GRiwgZXRjICovCi0gICAgICBOX1NFVF9GTEFHUyAob3V0aGVhZGVyLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLSAgICAgIHRleHRfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCi0gICAgewotICAgICAgLyogV2UgYXJlIGVuY2Fwc3VsYXRpbmcgQlNEIGZvcm1hdCB3aXRoaW4gQ09GRiBmb3JtYXQuICAqLwotICAgICAgc3RydWN0IGNvZmZzY24gKnRwLCAqZHAsICpicDsKLQotICAgICAgdHAgPSAmY29mZmhlYWRlci5zY25zWzBdOwotICAgICAgZHAgPSAmY29mZmhlYWRlci5zY25zWzFdOwotICAgICAgYnAgPSAmY29mZmhlYWRlci5zY25zWzJdOwotCi0gICAgICBzdHJjcHkgKHRwLT5zX25hbWUsICIudGV4dCIpOwotICAgICAgdHAtPnNfcGFkZHIgPSB0ZXh0X3N0YXJ0OwotICAgICAgdHAtPnNfdmFkZHIgPSB0ZXh0X3N0YXJ0OwotICAgICAgdHAtPnNfc2l6ZSA9IHRleHRfc2l6ZTsKLSAgICAgIHRwLT5zX3NjbnB0ciA9IHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYyk7Ci0gICAgICB0cC0+c19yZWxwdHIgPSAwOwotICAgICAgdHAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICB0cC0+c19ucmVsb2MgPSAwOwotICAgICAgdHAtPnNfbmxubm8gPSAwOwotICAgICAgdHAtPnNfZmxhZ3MgPSAweDIwOwotICAgICAgc3RyY3B5IChkcC0+c19uYW1lLCAiLmRhdGEiKTsKLSAgICAgIGRwLT5zX3BhZGRyID0gZGF0YV9zdGFydDsKLSAgICAgIGRwLT5zX3ZhZGRyID0gZGF0YV9zdGFydDsKLSAgICAgIGRwLT5zX3NpemUgPSBkYXRhX3NpemU7Ci0gICAgICBkcC0+c19zY25wdHIgPSB0cC0+c19zY25wdHIgKyB0cC0+c19zaXplOwotICAgICAgZHAtPnNfcmVscHRyID0gMDsKLSAgICAgIGRwLT5zX2xubm9wdHIgPSAwOwotICAgICAgZHAtPnNfbnJlbG9jID0gMDsKLSAgICAgIGRwLT5zX25sbm5vID0gMDsKLSAgICAgIGRwLT5zX2ZsYWdzID0gMHg0MDsKLSAgICAgIHN0cmNweSAoYnAtPnNfbmFtZSwgIi5ic3MiKTsKLSAgICAgIGJwLT5zX3BhZGRyID0gZHAtPnNfdmFkZHIgKyBkcC0+c19zaXplOwotICAgICAgYnAtPnNfdmFkZHIgPSBicC0+c19wYWRkcjsKLSAgICAgIGJwLT5zX3NpemUgPSBic3Nfc2l6ZTsKLSAgICAgIGJwLT5zX3NjbnB0ciA9IDA7Ci0gICAgICBicC0+c19yZWxwdHIgPSAwOwotICAgICAgYnAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICBicC0+c19ucmVsb2MgPSAwOwotICAgICAgYnAtPnNfbmxubm8gPSAwOwotICAgICAgYnAtPnNfZmxhZ3MgPSAweDgwOwotCi0gICAgICBjb2ZmaGVhZGVyLmZfbWFnaWMgPSBDT0ZGX01BR0lDOwotICAgICAgY29mZmhlYWRlci5mX25zY25zID0gMzsKLSAgICAgIC8qIHN0b3JlIGFuIHVubGlrZWx5IHRpbWUgc28gcHJvZ3JhbXMgY2FuCi0gICAgICAgKiB0ZWxsIHRoYXQgdGhlcmUgaXMgYSBic2QgaGVhZGVyCi0gICAgICAgKi8KLSAgICAgIGNvZmZoZWFkZXIuZl90aW1kYXQgPSAxOwotICAgICAgY29mZmhlYWRlci5mX3N5bXB0ciA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLmZfbnN5bXMgPSAwOwotICAgICAgY29mZmhlYWRlci5mX29wdGhkciA9IDI4OwotICAgICAgY29mZmhlYWRlci5mX2ZsYWdzID0gMHgxMDM7Ci0gICAgICAvKiBhb3V0aGRyICovCi0gICAgICBjb2ZmaGVhZGVyLm1hZ2ljID0gWk1BR0lDOwotICAgICAgY29mZmhlYWRlci52c3RhbXAgPSAwOwotICAgICAgY29mZmhlYWRlci50c2l6ZSA9IHRwLT5zX3NpemU7Ci0gICAgICBjb2ZmaGVhZGVyLmRzaXplID0gZHAtPnNfc2l6ZTsKLSAgICAgIGNvZmZoZWFkZXIuYnNpemUgPSBicC0+c19zaXplOwotICAgICAgY29mZmhlYWRlci5lbnRyeSA9IG91dGhlYWRlci5hX2VudHJ5OwotICAgICAgY29mZmhlYWRlci50ZXh0X3N0YXJ0ID0gdHAtPnNfdmFkZHI7Ci0gICAgICBjb2ZmaGVhZGVyLmRhdGFfc3RhcnQgPSBkcC0+c192YWRkcjsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCi0gICAgbXl3cml0ZSAoJmNvZmZoZWFkZXIsIHNpemVvZiBjb2ZmaGVhZGVyLCAxLCBvdXRkZXNjKTsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgcGFkZmlsZSAoTl9UWFRPRkYgKG91dGhlYWRlcikgLSBzaXplb2Ygb3V0aGVhZGVyLCBvdXRkZXNjKTsKLSNlbmRpZgotCi0gIHRleHRfc2l6ZSAtPSBOX1RYVE9GRiAob3V0aGVhZGVyKTsKLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50IGVuY2FwX3dyaXRlX29iamVjdF9jb250ZW50cwotI2RlZmluZSBNWV9vYmplY3RfcCBlbmNhcF9vYmplY3RfcAotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dC1uczMyay5jIGIvYmZkL2FvdXQtbnMzMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhYzg0ZS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC1uczMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgbnMzMmsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gRGFsbCAoaWRhbGxAZWxlY2VuZy5hZGVsYWlkZS5lZHUuYXUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgIm5zMzJrLmgiCi0KLSNkZWZpbmUgTVlOUyhPUCkgQ0FUKG5zMzJrYW91dF8sT1ApCi1yZWxvY19ob3d0b190eXBlICoKLU1ZTlMoYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBQQVJBTVMoKGJmZCAqYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWJvb2xlYW4KLU1ZTlMod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICBQQVJBTVMoKGJmZCAqYWJmZCkpOwotCi0vKiBBdm9pZCBtdWx0aXBsZSBkZWZpbml0aW9ucyBmcm9tIGFvdXR4IGlmIHN1cHBvcnRpbmcgc3RhbmRhcmQgYS5vdXQgZm9ybWF0KHMpCi0gKiBhcyB3ZWxsIGFzIHRoaXMgb25lCi0gKi8KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotdm9pZCBiZmRfbnMzMmtfYXJjaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgTVkoT1ApIE1ZTlMoT1ApCi0KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTVkoc3dhcF9zdGRfcmVsb2NfaW4pCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBNWShzd2FwX3N0ZF9yZWxvY19vdXQpCi0KLXN0YXRpYyB2b2lkCi1NWV9zd2FwX3N0ZF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzLAotCQkJICAgICAgYXJlbGVudCAqY2FjaGVfcHRyLCBhc3ltYm9sICoqc3ltYm9scywKLQkJCSAgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQpKTsKLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKmcsCi0JCQkgICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyKSk7Ci0KLS8qIFRoZSBuczMyayBzZXJpZXMgaXMgYWgsIHVudXN1YWwsIHdoZW4gaXQgY29tZXMgdG8gcmVsb2NhdGlvbi4KLSAqIFRoZXJlIGFyZSB0aHJlZSBzdG9yYWdlIG1ldGhvZHMgZm9yIHJlbG9jYXRlYWJsZSBvYmplY3RzLiAgVGhlcmUKLSAqIGFyZSBkaXNwbGFjZW1lbnRzLCBpbW1lZGlhdGUgb3BlcmFuZHMgYW5kIG9yZGluYXJ5IHR3b3MgY29tcGxlbWVudAotICogZGF0YS4gT2YgdGhlc2UsIG9ubHkgdGhlIGxhc3QgZml0cyBpbnRvIHRoZSBzdGFuZGFyZCByZWxvY2F0aW9uCi0gKiBzY2hlbWUuICBJbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHN0b3JlZCBodWZmbWFuIGVuY29kZWQgYW5kCi0gKiBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHN0b3JlZCBiaWcgZW5kaWFuICh3aGVyZSBhcyB0aGUgbmF0dXJhbCBieXRlCi0gKiBvcmRlciBpcyBsaXR0bGUgZW5kaWFuIGZvciB0aGlzIGFjaGl0ZWN0dXJlKS4KLQotICogTm90ZSB0aGF0IHRoZSBuczMyayBkaXNwbGFjZW1lbnQgc3RvcmFnZSBtZXRob2QgaXMgb3J0aG9nb25hbCB0bwotICogd2hldGhlciB0aGUgcmVsb2NhdGlvbiBpcyBwYyByZWxhdGl2ZSBvciBub3QuIFRoZSAiZGlzcGxhY2VtZW50IgotICogc3RvcmFnZSBzY2hlbWUgaXMgdXNlZCBmb3IgZXNzZW50aWFsbHkgYWxsIGFkZHJlc3MgY29uc3RhbnRzLiBUaGUKLSAqIGRpc3BsYWNlbWVudCBjYW4gYmUgcmVsYXRpdmUgdG8gemVybyAoYWJzb2x1dGUgZGlzcGxhY2VtZW50KSwKLSAqIHJlbGF0aXZlIHRvIHRoZSBwYyAocGMgcmVsYXRpdmUpLCB0aGUgc3RhY2sgcG9pbnRlciwgdGhlIGZyYW1lCi0gKiBwb2ludGVyLCB0aGUgc3RhdGljIGJhc2UgcmVnaXN0ZXIgYW5kIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBldGMuCi0KLSAqIEZvciBleGFtcGxlOgotICoKLSAqICBzeW0xOiAubG9uZyAuCSMgcGMgcmVsYXRpdmUgMidzIGNvbXBsZW1lbnQKLSAqICBzeW0xOiAubG9uZyBmb28JIyAyJ3MgY29tcGxlbWVudCBub3QgcGMgcmVsYXRpdmUKLSAqCi0gKiAgc2VsZjogIG1vdmQgQHNlbGYsIHIwICMgcGMgcmVsYXRpdmUgZGlzcGxhY2VtZW50Ci0gKgkgICBtb3ZkIGZvbywgcjAgIyBub24gcGMgcmVsYXRpdmUgZGlzcGxhY2VtZW50Ci0gKgotICogIHNlbGY6ICBtb3ZkIHNlbGYsIHIwICMgcGMgcmVsYXRpdmUgaW1tZWRpYXRlCi0gKiAgICAgICAgIG1vdmQgZm9vLCByMCAjIG5vbiBwYyByZWxhdGl2ZSBpbW1lZGlhdGUKLSAqCi0gKiBJbiBhZGRpdGlvbiwgZm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHJlbG9jYXRpb24gdHlwZXMKLSAqIGluIHRoZSBhLm91dCBmb3JtYXQgcmVsb2NhdGlvbiBlbnRyaWVzIGlzIHN1Y2ggdGhhdCBldmVuIHRoZSByZWxvY2F0aW9uCi0gKiBtZXRob2RzIHdoaWNoIGFyZSBzdGFuZGFyZCBhcmUgbm90IGVuY29kZWQgdGhlIHN0YW5kYXJkIHdheS4KLSAqCi0gKi8KLQotcmVsb2NfaG93dG9fdHlwZSBNWShob3d0b190YWJsZSlbXSA9IAotewotICAvKiBuczMyayBpbW1lZGlhdGUgb3BlcmFuZHMgKi8KLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fOCwgMCwgMCwgOCwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiTlMzMktfSU1NXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICAiTlMzMktfSU1NXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiTlMzMktfSU1NXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwsIDAsIDAsIDgsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV84IiwKLQkgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV8zMiIsCi0JIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIC8qIG5zMzJrIGRpc3BsYWNlbWVudHMgKi8KLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzgsIDAsIDAsIDgsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJOUzMyS19ESVNQXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfMTYiLAotCSB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJOUzMyS19ESVNQXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIlBDUkVMX05TMzJLX0RJU1BfOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsIDAsIDEsIDE2LCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsIDAsIDIsIDMyLCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF8zMiIsCi0JIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIC8qIE5vcm1hbCAyJ3MgY29tcGxlbWVudCAqLwotICBIT1dUTyAoQkZEX1JFTE9DXzgsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLAotCSAiOCIsIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICIxNiIsIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICIzMiIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzhfUENSRUwsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzgiLCB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ18xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMzJfUENSRUwsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsCi0JICJQQ1JFTF8zMiIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSE9XVE8oQkZEKSAoTVkoaG93dG9fdGFibGUpICsgMTQpCi0KLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9CSUcgMHgwNgotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX0xJVFRMRSAweDYwCi0jZGVmaW5lIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfU0hfQklHIDEKLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9MSVRUTEUgNQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvKShhYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICAgICBpbnQgKnJfaW5kZXg7Ci0gICAgIGludCAqcl9leHRlcm47Ci0gICAgIGludCAqcl9wY3JlbDsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9uczMya190eXBlOwotLyogIEJGRF9BU1NFUlQoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7ICovCi0gICpyX2luZGV4ID0gICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkgICAgICAgfCAgcmVsLT5yX2luZGV4WzBdICk7Ci0gICpyX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICpyX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgcl9sZW5ndGggID0gICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQk+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgcl9uczMya190eXBlICA9ICAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9MSVRUTEUpCi0JCSAgICA+PiBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci0gIHJldHVybiAoTVkoaG93dG9fdGFibGUpICsgcl9sZW5ndGggKyAzICogKCpyX3BjcmVsKSArIDYgKiByX25zMzJrX3R5cGUpOwotfQotCi0jZGVmaW5lIE1ZX3JlbG9jX2hvd3RvKEJGRCxSRUwsSU4sRVgsUEMpIE1ZKHJlbG9jX2hvd3RvKShCRkQsIFJFTCwgJklOLCAmRVgsICZQQykKLQotdm9pZAotTVkocHV0X3JlbG9jKShhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgdmFsdWUsIGhvd3RvLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcl9leHRlcm47Ci0gICAgIGludCByX2luZGV4OwotICAgICBsb25nIHZhbHVlOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25zMzJrX3R5cGU7Ci0gIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7Ci0gIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgID0gKGludCkgaG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgcl9uczMya190eXBlID0gKGhvd3RvIC0gTVkoaG93dG9fdGFibGUpICkvNjsKLS8qICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsgKi8KLSAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICByZWxvYy0+cl90eXBlWzBdID0KLSAgICAocl9leHRlcm4/ICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCi0gICAgICB8IChyX3BjcmVsPyAgICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCXwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKQotCSAgfCAocl9uczMya190eXBlIDw8ICBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci19Ci0KLSNkZWZpbmUgTVlfcHV0X3JlbG9jKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKSBcCi0gIE1ZKHB1dF9yZWxvYykoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpCi0KLSNkZWZpbmUgU1RBVF9GT1JfRVhFQwotCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMKLQotI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKShhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0KLSNkZWZpbmUgRU5UUlkoaSxqKQljYXNlIGk6IHJldHVybiAmTVkoaG93dG9fdGFibGUpW2pdCi0KLSAgaW50IGV4dCA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19FWFRfU0laRTsKLQotICBCRkRfQVNTRVJUKGV4dCA9PSAwKTsKLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotCWNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzgsIDApOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMSk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCA0KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsIDUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwgNyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgOCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCA5KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLCAxMCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMTEpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzgsIDEyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ18xNiwgMTMpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzMyLCAxNCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfOF9QQ1JFTCwgMTUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzE2X1BDUkVMLCAxNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfMzJfUENSRUwsIDE3KTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci0jdW5kZWYgRU5UUlkKLX0KLQotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX3BjcmVsOwotICBzdHJ1Y3QgYW91dGRhdGEgICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IE1ZX3JlbG9jX2hvd3RvKGFiZmQsIGJ5dGVzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCk7Ci0KLSAgTU9WRV9BRERSRVNTKDApOwotfQotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfYWRkZW5kOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICAKLSAgLyogbmFtZSB3YXMgY2xvYmJlcmVkIGJ5IGFvdXRfd3JpdGVfc3ltcyB0byBiZSBzeW1ib2wgaW5kZXggKi8KLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgdGhlbiBzZXQgdGhlIAotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBDaGVjayBmb3IgdGhhdCBoZXJlLiAgKi8KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24KLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24pIAotICAgIHsKLSAgICAgIGlmIChiZmRfYWJzX3NlY3Rpb24uc3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotI3VuZGVmIEtFRVBJVAotI2RlZmluZSBLRUVQSVQgdWRhdGEuaQotCSAgcl9pbmRleCA9ICAoKihnLT5zeW1fcHRyX3B0cikpLT5LRUVQSVQ7Ci0jdW5kZWYgS0VFUElUICAgICAKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OyAgICAgIAotICAgIH0KLQotICBNWV9wdXRfcmVsb2MgKGFiZmQsIHJfZXh0ZXJuLCByX2luZGV4LCBnLT5hZGRyZXNzLCBnLT5ob3d0bywgbmF0cHRyKTsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLCBsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLXsKLSAgaW50IHJfbnMzMmtfdHlwZSA9IChob3d0byAtIE1ZKGhvd3RvX3RhYmxlKSkgLyA2OwotICBsb25nICgqZ2V0X2RhdGEpIFBBUkFNUyAoKGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLSAgaW50ICgqcHV0X2RhdGEpIFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLQotICBzd2l0Y2ggKHJfbnMzMmtfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZ2V0X2RhdGEgPSBfYmZkX25zMzJrX2dldF9pbW1lZGlhdGU7Ci0gICAgICBwdXRfZGF0YSA9IF9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGdldF9kYXRhID0gX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50OwotICAgICAgcHV0X2RhdGEgPSBfYmZkX25zMzJrX3B1dF9kaXNwbGFjZW1lbnQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgICAgbG9jYXRpb24pOwotICAgICAgLyogTk9UIFJFQUNIRUQgKi8KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0gIHJldHVybiBfYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgICAgICBsb2NhdGlvbiwgZ2V0X2RhdGEsIHB1dF9kYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9hb3V0LXNwYXJjbGUuYyBiL2JmZC9hb3V0LXNwYXJjbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzYjEzNi4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC1zcGFyY2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3Igc3BhcmMgbGl0dGxlLWVuZGlhbiBhb3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWxpdHRsZSIKLSNkZWZpbmUgTVkoT1ApIENBVChzcGFyY2xlX2FvdXRfLE9QKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9TUEFSQyB8fCAobXR5cGUpID09IE1fU1BBUkNMRVQpCi0KLS8qIEluY2x1ZGUgdGhlIHVzdWFsIGEub3V0IHN1cHBvcnQuICAqLwotI2RlZmluZSBUQVJHRVRfSVNfTElUVExFX0VORElBTl9QCi0jaW5jbHVkZSAiYW91dGYxLmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dC10YXJnZXQuaCBiL2JmZC9hb3V0LXRhcmdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDY0MTdiLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQ5ICswLDAgQEAKLS8qIERlZmluZSBhIHRhcmdldCB2ZWN0b3IgYW5kIHNvbWUgc21hbGwgcm91dGluZXMgZm9yIGEgdmFyaWFudCBvZiBhLm91dC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLS8qI2luY2x1ZGUgImxpYmFvdXQuaCIqLwotCi0jaWZuZGVmIFNFR01FTlRfU0laRQotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2VuZGlmCi0KLWV4dGVybiByZWxvY19ob3d0b190eXBlICogTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKQotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0KLS8qIFNldCBwYXJhbWV0ZXJzIGFib3V0IHRoaXMgYS5vdXQgZmlsZSB0aGF0IGFyZSBtYWNoaW5lLWRlcGVuZGVudC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBzb21lX2FvdXRfb2JqZWN0X3AganVzdCBiZWZvcmUgaXQgcmV0dXJucy4gICovCi0jaWZuZGVmIE1ZX2NhbGxiYWNrCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpNWShjYWxsYmFjaykgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotTVkoY2FsbGJhY2spIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGFyY2hfYWxpZ25fcG93ZXI7Ci0gIHVuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbjsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUoKmV4ZWNwKTsKLQotICAvKiBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSA9IE5fVFhUQUREUigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IE5fREFUQUREUigqZXhlY3ApOwotICBvYmpfYnNzc2VjICAoYWJmZCktPnZtYSA9IE5fQlNTQUREUigqZXhlY3ApOwotCi0gIC8qIEZvciBzb21lIHRhcmdldHMsIGlmIHRoZSBlbnRyeSBwb2ludCBpcyBub3QgaW4gdGhlIHNhbWUgcGFnZQotICAgICBhcyB0aGUgc3RhcnQgb2YgdGhlIHRleHQsIHRoZW4gYWRqdXN0IHRoZSBWTUEgc28gdGhhdCBpdCBpcy4KLSAgICAgRklYTUU6IERvIHRoaXMgd2l0aCBhIG1hY3JvIGxpa2UgU0VUX0FSQ0hfTUFDSCBpbnN0ZWFkPyAgKi8KLSAgaWYgKGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZW50cnlfaXNfdGV4dF9hZGRyZXNzCi0gICAgICAmJiBleGVjcC0+YV9lbnRyeSA+IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRqdXN0OwotCi0gICAgICBhZGp1c3QgPSBleGVjcC0+YV9lbnRyeSAtIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICAgICAgLyogQWRqdXN0IG9ubHkgYnkgd2hvbGUgcGFnZXMuICovCi0gICAgICBhZGp1c3QgJj0gfihUQVJHRVRfUEFHRV9TSVpFIC0gMSk7Ci0gICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSArPSBhZGp1c3Q7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSArPSBhZGp1c3Q7Ci0gICAgICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSBsb2FkIGFkZHJlc3NlcyB0byBiZSB0aGUgc2FtZSBhcyB0aGUgdmlydHVhbCBhZGRyZXNzZXMuICAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmxtYSA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmxtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotICBvYmpfYnNzc2VjIChhYmZkKS0+bG1hID0gb2JqX2Jzc3NlYyAoYWJmZCktPnZtYTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RSRUxPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fU1lNT0ZGICgqZXhlY3ApOwotICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gTl9TVFJPRkYgKCpleGVjcCk7Ci0gIAotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0jaWZkZWYgU0VUX0FSQ0hfTUFDSAotICBTRVRfQVJDSF9NQUNIKGFiZmQsICpleGVjcCk7Ci0jZWxzZQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKGFiZmQsIERFRkFVTFRfQVJDSCwgMCk7Ci0jZW5kaWYKLQotICAvKiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gcmVjb3Jkcy4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKLSAgICAgU0VUX0FSQ0hfTUFDSC4gIEl0IGFzc3VtZXMgdGhhdCBTRVRfQVJDSF9NQUNIIHdpbGwgc2V0Ci0gICAgIG9ial9yZWxvY19lbnRyeV9zaXplIGNvcnJlY3RseSwgaWYgdGhlIHJlbG9jIHNpemUgaXMgbm90Ci0gICAgIFJFTE9DX1NURF9TSVpFLiAgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCA9Ci0gICAgZXhlY3AtPmFfdHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID0KLSAgICBleGVjcC0+YV9kcnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgYXJjaGl0ZWN0dXJlLCBzZXQgdGhlIGFsaWdubWVudHMgb2YgdGhlCi0gICAgIHNlY3Rpb25zLiAgVGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSwKLSAgICAgYnV0IHdoZW4gdGhlIGluaXRpYWwgc2VjdGlvbnMgd2VyZSBjcmVhdGVkIHRoZSBhcmNoaXRlY3R1cmUgaGFkCi0gICAgIG5vdCB5ZXQgYmVlbiBzZXQuICBIb3dldmVyLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UgZG9uJ3QKLSAgICAgc2V0IHRoZSBhbGlnbm1lbnQgcG93ZXIgYW55IGhpZ2hlciB0aGFuIGFzIHJlcXVpcmVkIGJ5IHRoZSBzaXplCi0gICAgIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYXJjaF9hbGlnbl9wb3dlciA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKLSAgYXJjaF9hbGlnbiA9IDEgPDwgYXJjaF9hbGlnbl9wb3dlcjsKLSAgaWYgKChCRkRfQUxJR04gKG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotICAgICAgID09IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplKQotICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0JICA9PSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICAgICYmIChCRkRfQUxJR04gKG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0JICA9PSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplKSkKLSAgICB7Ci0gICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgICBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICB9Ci0KLSAgLyogRG9uJ3Qgc2V0IHNpemVzIG5vdyAtLSBjYW4ndCBiZSBzdXJlIHVudGlsIHdlIGtub3cgYXJjaCAmIG1hY2guCi0gICAgIFNpemVzIGdldCBzZXQgaW4gc2V0X3NpemVzIGNhbGxiYWNrLCBsYXRlci4gICovCi0jaWYgMAotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSBTRUdNRU5UX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSNlbmRpZgotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfb2JqZWN0X3AKLS8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhbiBhLm91dCBmaWxlIGhlYWRlciAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqTVkob2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLU1ZKG9iamVjdF9wKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwkvKiBSYXcgZXhlYyBoZWFkZXIgZnJvbSBmaWxlICovCi0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7CQkvKiBDbGVhbmVkLXVwIGV4ZWMgaGVhZGVyICovCi0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0jaWZkZWYgU1dBUF9NQUdJQwotICBleGVjLmFfaW5mbyA9IFNXQVBfTUFHSUMgKGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbHNlCi0gIGV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZW5kaWYgLyogU1dBUF9NQUdJQyAqLwotCi0gIGlmIChOX0JBRE1BRyAoZXhlYykpIHJldHVybiAwOwotI2lmZGVmIE1BQ0hUWVBFX09LCi0gIGlmICghKE1BQ0hUWVBFX09LIChOX01BQ0hUWVBFIChleGVjKSkpKSByZXR1cm4gMDsKLSNlbmRpZgotCi0gIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKShhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0jaWZkZWYgU1dBUF9NQUdJQwotICAvKiBzd2FwX2V4ZWNfaGVhZGVyX2luIHJlYWQgaW4gYV9pbmZvIHdpdGggdGhlIHdyb25nIGJ5dGUgb3JkZXIgKi8KLSAgZXhlYy5hX2luZm8gPSBTV0FQX01BR0lDIChleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZW5kaWYgLyogU1dBUF9NQUdJQyAqLwotCi0gIHRhcmdldCA9IE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIChhYmZkLCAmZXhlYywgTVkoY2FsbGJhY2spKTsKLQotI2lmZGVmIEVOVFJZX0NBTl9CRV9aRVJPCi0gIC8qIFRoZSBORVdTT1MzIGVudHJ5LXBvaW50IGlzL3dhcyAwLCB3aGljaCAoYW1vbmdzdCBvdGhlciBsb3NzYWdlKQotICAgKiBtZWFucyB0aGF0IGl0IGlzbid0IG9idmlvdXMgaWYgRVhFQ19QIHNob3VsZCBiZSBzZXQuCi0gICAqIEFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZSBmb3IgYW4gZXhlY3V0YWJsZToKLSAgICogVGhlcmUgbXVzdCBiZSBubyByZWxvY2F0aW9ucywgdGhlIGJmZCBjYW4gYmUgbmVpdGhlciBhbgotICAgKiBhcmNoaXZlIG5vciBhbiBhcmNoaXZlIGVsZW1lbnQsIGFuZCB0aGUgZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUuICovCi0KLSAgaWYgKGV4ZWMuYV90cnNpemUgKyBleGVjLmFfZHJzaXplID09IDAKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0KGFiZmQpID09IGJmZF9vYmplY3QgJiYgYWJmZC0+bXlfYXJjaGl2ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSNpZm5kZWYgU19JWFVTUgotI2RlZmluZSBTX0lYVVNSIDAxMDAJLyogRXhlY3V0ZSBieSBvd25lci4gICovCi0jZW5kaWYKLSAgICAgIGlmIChzdGF0KGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwICYmIChidWYuc3RfbW9kZSAmIFNfSVhVU1IpKQotCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0jZW5kaWYgLyogRU5UUllfQ0FOX0JFX1pFUk8gKi8KLQotICByZXR1cm4gdGFyZ2V0OwotfQotI2RlZmluZSBNWV9vYmplY3RfcCBNWShvYmplY3RfcCkKLSNlbmRpZgotCi0KLSNpZm5kZWYgTVlfbWtvYmplY3QKLQotc3RhdGljIGJvb2xlYW4gTVkobWtvYmplY3QpIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWShta29iamVjdCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKE5BTUUoYW91dCxta29iamVjdCkoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotI2lmIDAgLyogU2l6ZXMgZ2V0IHNldCBpbiBzZXRfc2l6ZXMgY2FsbGJhY2ssIGxhdGVyLCBhZnRlciB3ZSBrbm93Ci0JIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUuICAqLwotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSBTRUdNRU5UX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLSNkZWZpbmUgTVlfbWtvYmplY3QgTVkobWtvYmplY3QpCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi0vKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBkYXRhLiAgVGhpcyBhY3R1YWxseSBkb2VzIG5vdGhpbmcgd2l0aCB0aGUKLSAgIHNlY3Rpb25zLiAgSXQgY29waWVzIHRoZSBzdWJmb3JtYXQgZmllbGQuICBXZSBjb3B5IGl0IGhlcmUsIGJlY2F1c2UKLSAgIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoaXMgaXMgYSBRTUFHSUMgZmlsZSBiZWZvcmUgd2Ugc2V0IHRoZQotICAgc2VjdGlvbiBjb250ZW50cywgYW5kIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBpcyBub3QgY2FsbGVkIHVudGlsCi0gICBhZnRlciB0aGUgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLSAgICAgICYmIGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgb2JqX2FvdXRfc3ViZm9ybWF0IChvYmZkKSA9IG9ial9hb3V0X3N1YmZvcm1hdCAoaWJmZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0gICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLSNpZm5kZWYgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9zZXRfc2l6ZXMKLQotc3RhdGljIGJvb2xlYW4gTVkoc2V0X3NpemVzKSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkoc2V0X3NpemVzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSBTRUdNRU5UX1NJWkU7Ci0KLSNpZmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCi0gIGFkYXRhKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBaTUFHSUNfRElTS19CTE9DS19TSVpFOwotI2Vsc2UKLSAgYWRhdGEoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0jZW5kaWYKLQotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBNWV9zZXRfc2l6ZXMgTVkoc2V0X3NpemVzKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmFja2VuZF9kYXRhCi0KLSNpZm5kZWYgTVlfem1hZ2ljX2NvbnRpZ3VvdXMKLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZAotI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKLSNlbmRpZgotI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAotI2VuZGlmCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgTVlfem1hZ2ljX2NvbnRpZ3VvdXMsCi0gIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLAotICBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MsCi0gIE1ZX2V4ZWNfaGRyX2ZsYWdzLAotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVlfc2V0X3NpemVzLAotICBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCwKLSAgTVlfYWRkX2R5bmFtaWNfc3ltYm9scywKLSAgTVlfYWRkX29uZV9zeW1ib2wsCi0gIE1ZX2xpbmtfZHluYW1pY19vYmplY3QsCi0gIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sLAotICBNWV9jaGVja19keW5hbWljX3JlbG9jLAotICBNWV9maW5pc2hfZHluYW1pY19saW5rCi19OwotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEgJk1ZKGJhY2tlbmRfZGF0YSkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLQotLyogQ2FsbGJhY2sgZm9yIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUgdG8gc2V0IHRoZSBzZWN0aW9uIG9mZnNldHMuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1NWV9maW5hbF9saW5rX2NhbGxiYWNrIChhYmZkLCBwdHJlbG9mZiwgcGRyZWxvZmYsIHBzeW1vZmYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmlsZV9wdHIgKnB0cmVsb2ZmOwotICAgICBmaWxlX3B0ciAqcGRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwc3ltb2ZmOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgKnB0cmVsb2ZmID0gTl9UUkVMT0ZGICgqZXhlY3ApOwotICAqcGRyZWxvZmYgPSBOX0RSRUxPRkYgKCpleGVjcCk7Ci0gICpwc3ltb2ZmID0gTl9TWU1PRkYgKCpleGVjcCk7Ci19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9maW5hbF9saW5rCi0KLS8qIEZpbmFsIGxpbmsgcm91dGluZS4gIFdlIG5lZWQgdG8gdXNlIGEgY2FsbCBiYWNrIHRvIGdldCB0aGUgY29ycmVjdAotICAgb2Zmc2V0cyBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBNWV9iZmRfZmluYWxfbGluayBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbgotTVlfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZW5kaWYKLQotLyogV2UgYXNzdW1lIEJGRCBnZW5lcmljIGFyY2hpdmUgZmlsZXMuICAqLwotI2lmbmRlZglNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgTVlfZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNlbmRpZgotI2lmbmRlZglNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9hcm1hcAotI2RlZmluZQlNWV9zbHVycF9hcm1hcAkJCWJmZF9zbHVycF9ic2RfYXJtYXAKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYJTVlfd3JpdGVfYXJtYXAKLSNkZWZpbmUJTVlfd3JpdGVfYXJtYXAJCWJzZF93cml0ZV9hcm1hcAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfYXJfaGRyCi0jZGVmaW5lIE1ZX3JlYWRfYXJfaGRyCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNlbmRpZgotI2lmbmRlZglNWV90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUJTVlfdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2VuZGlmCi0jaWZuZGVmIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNkZWZpbmUgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNlbmRpZgotCi0vKiBObyBjb3JlIGZpbGUgZGVmaW5lZCBoZXJlIC0tIGNvbmZpZ3VyZSBpbiB0cmFkLWNvcmUuYyBzZXBhcmF0ZWx5LiAgKi8KLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AJXAotCQkJCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wCQlfYmZkX2R1bW15X3RhcmdldAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fZW5kCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIE5BTUUoYW91dCxjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIE5BTUUoYW91dCxnZXRfc2VjdGlvbl9jb250ZW50cykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNlbmRpZgotI2lmbmRlZiBNWV9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIE1ZX25ld19zZWN0aW9uX2hvb2sgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBOQU1FKGFvdXQsZ2V0X3N5bXRhYikKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIE1ZX21ha2VfZW1wdHlfc3ltYm9sIE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9wcmludF9zeW1ib2wKLSNkZWZpbmUgTVlfcHJpbnRfc3ltYm9sIE5BTUUoYW91dCxwcmludF9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIE1ZX2dldF9zeW1ib2xfaW5mbyBOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9saW5lbm8KLSNkZWZpbmUgTVlfZ2V0X2xpbmVubyBOQU1FKGFvdXQsZ2V0X2xpbmVubykKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIE1ZX3NldF9hcmNoX21hY2ggTkFNRShhb3V0LHNldF9hcmNoX21hY2gpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgTVlfZmluZF9uZWFyZXN0X2xpbmUgTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIE1ZX3NpemVvZl9oZWFkZXJzIE5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBNWV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIE5BTUUoYW91dCxyZWxvY190eXBlX2xvb2t1cCkKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgTVlfY2xvc2VfYW5kX2NsZWFudXAgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNlbmRpZgotCi0vKiBBb3V0IHN5bWJvbHMgbm9ybWFsbHkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzICovCi0jaWZuZGVmIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIgCi0jZGVmaW5lIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCi0jZW5kaWYKLQotLyogQW91dCBhcmNoaXZlcyBub3JtYWxseSB1c2Ugc3BhY2VzIGZvciBwYWRkaW5nICovCi0jaWZuZGVmIEFSX1BBRF9DSEFSCi0jZGVmaW5lIEFSX1BBRF9DSEFSICcgJwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfQkZEX1RBUkdFVAotY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpID0KLXsKLSAgVEFSR0VUTkFNRSwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0jaWZkZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotI2Vsc2UKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSNlbmRpZgotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gIEFSX1BBRF9DSEFSLAkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotI2lmZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0jZWxzZQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSNlbmRpZgotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChNWSksCi0KLSAgLyogQWx0ZXJuYXRpdmVfdGFyZ2V0ICovCi0gIE5VTEwsCi0gIAotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEKLX07Ci0jZW5kaWYgLyogTVlfQkZEX1RBUkdFVCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtdGljMzAuYyBiL2JmZC9hb3V0LXRpYzMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmMxNTkuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtdGljMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNjQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBUTVMzMjBDMzAgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMTAyNAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDEyOAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfdGljMzAKLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNkZWZpbmUgTVkoT1ApIENBVCh0aWMzMF9hb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtdGljMzAiCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKHRpYzMwX2FvdXQsXzMyXyx5KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZml4XzE2Ci0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpeF8zMgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9maXhfcGNyZWxfMTYKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqdGljMzBfYW91dF9yZWxvY19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLCBpbnQgKiwgaW50ICosIGludCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfcmVsb2NhdGVfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSwKLQkgICBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqdGljMzBfYW91dF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHRpYzMwX2FvdXRfc2V0X3NpemVzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSNkZWZpbmUgTVlfcmVsb2NfaG93dG8oQkZELFJFTCxJTixFWCxQQykgdGljMzBfYW91dF9yZWxvY19ob3d0byhCRkQsUkVMLCZJTiwmRVgsJlBDKQotI2RlZmluZSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZQotI2RlZmluZSBNWV9vYmplY3RfcCB0aWMzMF9hb3V0X29iamVjdF9wCi0jZGVmaW5lIE1ZX21rb2JqZWN0IE5BTUUoYW91dCxta29iamVjdCkKLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRpYzMwX2FvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3NldF9zaXplcyB0aWMzMF9hb3V0X3NldF9zaXplcwotCi0jaWZuZGVmIE1ZX2V4ZWNfaGRyX2ZsYWdzCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JhY2tlbmRfZGF0YQotCi0jaWZuZGVmIE1ZX3ptYWdpY19jb250aWd1b3VzCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcgotI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzCi0jZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLSNkZWZpbmUgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQgMQotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2xpbmtfZHluYW1pY19vYmplY3QKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2hlY2tfZHluYW1pY19yZWxvYyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluaXNoX2R5bmFtaWNfbGluawotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIDAKLSNlbmRpZgotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIHRpYzMwX2FvdXRfYmFja2VuZF9kYXRhID0KLXsKLSAgTVlfem1hZ2ljX2NvbnRpZ3VvdXMsCi0gIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLAotICBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MsCi0gIE1ZX2V4ZWNfaGRyX2ZsYWdzLAotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVlfc2V0X3NpemVzLAotICBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCwKLSAgTVlfYWRkX2R5bmFtaWNfc3ltYm9scywKLSAgTVlfYWRkX29uZV9zeW1ib2wsCi0gIE1ZX2xpbmtfZHluYW1pY19vYmplY3QsCi0gIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sLAotICBNWV9jaGVja19keW5hbWljX3JlbG9jLAotICBNWV9maW5pc2hfZHluYW1pY19saW5rCi19OwotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEgJnRpYzMwX2FvdXRfYmFja2VuZF9kYXRhCi0jZW5kaWYKLQotLyogRklYTUU6IFRoaXMgaXMgd3JvbmcuICBhb3V0eC5oIHNob3VsZCByZWFsbHkgb25seSBiZSBpbmNsdWRlZCBieQotICAgYW91dDMyLmMuICAqLwotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotLyogVGhpcyB0YWJsZSBsaXN0cyB0aGUgcmVsb2NhdGlvbiB0eXBlcyBmb3IgdGhlIFRNUzMyMEMzMC4gIFRoZXJlIGFyZQotICAgb25seSBhIGZldyByZWxvY2F0aW9ucyByZXF1aXJlZCwgYW5kIGFsbCBtdXN0IGJlIGRpdmlkZWQgYnkgNCAoPj4KLSAgIDIpIHRvIGdldCB0aGUgMzItYml0IGFkZHJlc3NlcyBpbiB0aGUgZm9ybWF0IHRoZSBUTVMzMjBDMzAgbGlrZXMKLSAgIGl0LiAqLwotcmVsb2NfaG93dG9fdHlwZSB0aWMzMF9hb3V0X2hvd3RvX3RhYmxlW10gPQotewotICBFTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTyAoMSwgMiwgMSwgMTYsIGZhbHNlLCAwLCAwLCB0aWMzMF9hb3V0X2ZpeF8xNiwKLQkgIjE2IiwgZmFsc2UsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDIsIDIsIDIsIDI0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIE5VTEwsCi0JICIyNCIsIGZhbHNlLCAweDAwRkZGRkZGLCAweDAwRkZGRkZGLCBmYWxzZSksCi0gIEhPV1RPICgzLCAxOCwgMywgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIkxEUCIsIGZhbHNlLCAweDAwRkYwMDAwLCAweDAwMDAwMEZGLCBmYWxzZSksCi0gIEhPV1RPICg0LCAyLCA0LCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCB0aWMzMF9hb3V0X2ZpeF8zMiwKLQkgIjMyIiwgZmFsc2UsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDUsIDIsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIHRpYzMwX2FvdXRfZml4X3BjcmVsXzE2LCAiUENSRUwiLCB0cnVlLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGLCB0cnVlKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgRU1QVFlfSE9XVE8gKC0xKQotfTsKLQotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKk5BTUUgKGFvdXQsIHJlbG9jX3R5cGVfbG9va3VwKSAoKTsKLQotcmVsb2NfaG93dG9fdHlwZSAqCi10aWMzMF9hb3V0X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICBjYXNlIEJGRF9SRUxPQ19USUMzMF9MRFA6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbM107Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbMV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjQ6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbMl07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbNV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbNF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotdGljMzBfYW91dF9yZWxvY19ob3d0byAoYWJmZCwgcmVsb2NzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvY3M7Ci0gICAgIGludCAqcl9pbmRleDsKLSAgICAgaW50ICpyX2V4dGVybjsKLSAgICAgaW50ICpyX3BjcmVsOwotewotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIHVuc2lnbmVkIGludCByX3BjcmVsX2RvbmU7Ci0gIGludCBpbmRleDsKLQotICAqcl9wY3JlbCA9IDA7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgICpyX2luZGV4ID0gKChyZWxvY3MtPnJfaW5kZXhbMF0gPDwgMTYpIHwgKHJlbG9jcy0+cl9pbmRleFsxXSA8PCA4KSB8IHJlbG9jcy0+cl9pbmRleFsyXSk7Ci0gICAgICAqcl9leHRlcm4gPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSk7Ci0gICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKLSAgICAgIHJfbGVuZ3RoID0gKChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpyX2luZGV4ID0gKChyZWxvY3MtPnJfaW5kZXhbMl0gPDwgMTYpIHwgKHJlbG9jcy0+cl9pbmRleFsxXSA8PCA4KSB8IHJlbG9jcy0+cl9pbmRleFswXSk7Ci0gICAgICAqcl9leHRlcm4gPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICAgIHJfbGVuZ3RoID0gKChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUpID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpOwotICAgIH0KLSAgaW5kZXggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsX2RvbmU7Ci0gIHJldHVybiB0aWMzMF9hb3V0X2hvd3RvX3RhYmxlICsgaW5kZXg7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGNhbGxiYWNrIGZvciAxNi1iaXQgcmVsb2NzLiAgVGhpcyBpcwotICAgcmVxdWlyZWQgZm9yIHJlbG9jYXRpb25zIGJldHdlZW4gc2VnbWVudHMuICBBIGxpbmUgaW4gYW91dHguaAotICAgcmVxdWlyZXMgdGhhdCBhbnkgcmVsb2NhdGlvbnMgZm9yIHRoZSBkYXRhIHNlY3Rpb24gc2hvdWxkIHBvaW50IHRvCi0gICB0aGUgZW5kIG9mIHRoZSBhbGlnbmVkIHRleHQgc2VjdGlvbiwgcGx1cyBhbiBvZmZzZXQuICBCeSBkZWZhdWx0LAotICAgdGhpcyBkb2VzIG5vdCBoYXBwZW4sIHRoZXJlZm9yZSB0aGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YKLSAgIHRoYXQuICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXRpYzMwX2FvdXRfZml4XzE2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3ltYm9sJ3Mgc2VjdGlvbiBpcyBkZWZpbmVkLiAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24gJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19vayA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0gIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbiBhbmQgdHVybiBpdCBpbnRvIHRoZSBUTVMzMjBDMzAKLSAgICAgMzItYml0IGFkZHJlc3MgZm9ybWF0LiAqLwotICByZWxvY2F0aW9uID0gKHN5bWJvbC0+c2VjdGlvbi0+dm1hID4+IDIpOwotICByZWxvY2F0aW9uICs9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICBiZmRfcHV0XzE2IChhYmZkLCByZWxvY2F0aW9uLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIHRpYzMwX2FvdXRfZml4XzE2IGV4Y2VwdCBmb3IgMzIKLSAgIGJpdCByZWxvY2F0aW9ucy4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maXhfMzIgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wncyBzZWN0aW9uIGlzIGRlZmluZWQuICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLSAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uIGFuZCB0dXJuIGl0IGludG8gdGhlIFRNUzMyMEMzMAotICAgICAzMi1iaXQgYWRkcmVzcyBmb3JtYXQuICovCi0gIHJlbG9jYXRpb24gPSAoc3ltYm9sLT5zZWN0aW9uLT52bWEgPj4gMik7Ci0gIHJlbG9jYXRpb24gKz0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHJlbG9jYXRpb24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd29yayBvdXQgcGMtcmVsYXRpdmUgb2Zmc2V0cyBmb3IgdGhlCi0gICBUTVMzMjBDMzAuICBUaGUgZGF0YSBhbHJlYWR5IHBsYWNlZCBieSBtZF9wY3JlbF9mcm9tIHdpdGhpbiBnYXMgaXMKLSAgIHVzZWxlc3MgZm9yIGEgcmVsb2NhdGlvbiwgc28gd2UganVzdCBnZXQgdGhlIG9mZnNldCB2YWx1ZSBhbmQgcGxhY2UKLSAgIGEgdmVyc2lvbiBvZiB0aGlzIHdpdGhpbiB0aGUgb2JqZWN0IGNvZGUuCi0gICB0aWMzMF9hb3V0X2ZpbmFsX2xpbmtfcmVsb2NhdGUgd2lsbCB0aGVuIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQKLSAgIHJlbG9jYXRpb24gdG8gYWRkIG9uIHRvIHRoZSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGNvZGUuICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXRpYzMwX2FvdXRfZml4X3BjcmVsXzE2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbiA9IDE7Ci0gIGJmZF9ieXRlIG9mZnNldF9kYXRhID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzIC0gMSk7Ci0KLSAgLyogVGhlIGJ5dGUgYmVmb3JlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZml4IGNvbnRhaW5zIGJpdHMgMjMtMTYgb2YKLSAgICAgdGhlIHBjcmVsIGluc3RydWN0aW9uLiAgQml0IDIxIGlzIHNldCBmb3IgYSBkZWxheWVkIGluc3RydWN0aW9uCi0gICAgIHdoaWNoIHJlcXVpcmVzIG9uIG9mZnNldCBvZiAzIGluc3RlYWQgb2YgMS4gKi8KLSAgaWYgKG9mZnNldF9kYXRhICYgMHgyMCkKLSAgICByZWxvY2F0aW9uIC09IDM7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uIC09IDE7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGVzZSBtYWNyb3Mgd2lsbCBnZXQgMjQtYml0IHZhbHVlcyBmcm9tIHRoZSBiZmQgZGVmaW5pdGlvbi4KLSAgIEJpZy1lbmRpYW4gb25seS4gKi8KLSNkZWZpbmUgYmZkX2dldGJfMjQoQkZELEFERFIpIChiZmRfZ2V0XzgoQkZELEFERFIpIDw8IDE2KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfZ2V0XzgoQkZELEFERFIrMSkgPDwgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmZkX2dldF84KEJGRCxBRERSKzIpKQotCi0jZGVmaW5lIGJmZF9wdXRiXzI0KEJGRCxEQVRBLEFERFIpIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKSgoREFUQSA+PiAxNikgJiAweEZGKSxBRERSKTsgXAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHV0XzgoQkZELChiZmRfYnl0ZSkoKERBVEEgPj4gOCkgJiAweEZGKSxBRERSKzEpOyBcCi0JCSAgICAgICAgIAkJCQkgICBiZmRfcHV0XzgoQkZELChiZmRfYnl0ZSkoREFUQSAmIDB4RkYpLEFERFIrMikKLQotLyogU2V0IHBhcmFtZXRlcnMgYWJvdXQgdGhpcyBhLm91dCBmaWxlIHRoYXQgYXJlIG1hY2hpbmUtZGVwZW5kZW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHNvbWVfYW91dF9vYmplY3RfcCBqdXN0IGJlZm9yZSBpdCByZXR1cm5zLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotdGljMzBfYW91dF9jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBhcmNoX2FsaWduX3Bvd2VyOwotICB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ247Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcGFydHMgb2YgYSBuZXdseSByZWFkIGFvdXQgaGVhZGVyICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gTl9UWFRTSVpFICgqZXhlY3ApOwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IE5fREFUQUREUiAoKmV4ZWNwKTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IE5fQlNTQUREUiAoKmV4ZWNwKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmxtYSA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmxtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotICBvYmpfYnNzc2VjIChhYmZkKS0+bG1hID0gb2JqX2Jzc3NlYyAoYWJmZCktPnZtYTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RSRUxPRkYgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0RSRUxPRkYgKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0jaWZkZWYgU0VUX0FSQ0hfTUFDSAotICBTRVRfQVJDSF9NQUNIIChhYmZkLCAqZXhlY3ApOwotI2Vsc2UKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgREVGQVVMVF9BUkNILCAwKTsKLSNlbmRpZgotCi0gIC8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIGFyY2hpdGVjdHVyZSwgc2V0IHRoZSBhbGlnbm1lbnRzIG9mIHRoZQotICAgICBzZWN0aW9ucy4gIFRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSBOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vayksCi0gICAgIGJ1dCB3aGVuIHRoZSBpbml0aWFsIHNlY3Rpb25zIHdlcmUgY3JlYXRlZCB0aGUgYXJjaGl0ZWN0dXJlIGhhZAotICAgICBub3QgeWV0IGJlZW4gc2V0LiAgSG93ZXZlciwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlIGRvbid0Ci0gICAgIHNldCB0aGUgYWxpZ25tZW50IHBvd2VyIGFueSBoaWdoZXIgdGhhbiBhcyByZXF1aXJlZCBieSB0aGUgc2l6ZQotICAgICBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGFyY2hfYWxpZ25fcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0gIGFyY2hfYWxpZ24gPSAxIDw8IGFyY2hfYWxpZ25fcG93ZXI7Ci0gIGlmICgoQkZEX0FMSUdOIChvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLSAgICAgICA9PSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICAgICYmIChCRkRfQUxJR04gKG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotCSAgPT0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgICAmJiAoQkZEX0FMSUdOIChvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotCSAgPT0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSkpCi0gICAgewotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgICAgb2JqX2Jzc3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgfQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQlhZGRyZXNzLCB2YWx1ZSwgYWRkZW5kKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IHZhbHVlICsgYWRkZW5kOwotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQotCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKLSAgICB9Ci0gIHJldHVybiB0aWMzMF9hb3V0X3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgICAgICBjb250ZW50cyArIGFkZHJlc3MpOwotfQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXRpYzMwX2FvdXRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgYmZkX2J5dGUgKmxvY2F0aW9uOwotewotICBiZmRfdm1hIHg7Ci0gIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgaWYgKGhvd3RvLT5zaXplIDwgMCkKLSAgICByZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHggPSBiZmRfZ2V0Yl8yNCAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICB4ID0gYmZkX2dldF84IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgb3ZlcmZsb3cgPSBmYWxzZTsKLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KQotICAgIHsKLSAgICAgIGJmZF92bWEgY2hlY2s7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBzaWduZWRfY2hlY2s7Ci0gICAgICBiZmRfdm1hIGFkZDsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9hZGQ7Ci0KLSAgICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA9PSAwKQotCXsKLQkgIGNoZWNrID0gcmVsb2NhdGlvbjsKLQkgIHNpZ25lZF9jaGVjayA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCSAgICBzaWduZWRfY2hlY2sgPSBjaGVjazsKLQkgIGVsc2UKLQkgICAgc2lnbmVkX2NoZWNrID0gKGNoZWNrIHwgKChiZmRfdm1hKSAtIDEgJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPnJpZ2h0c2hpZnQpKSk7Ci0JfQotICAgICAgYWRkID0geCAmIGhvd3RvLT5zcmNfbWFzazsKLSAgICAgIHNpZ25lZF9hZGQgPSBhZGQ7Ci0gICAgICBpZiAoKGFkZCAmICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSkgIT0gMCkKLQlzaWduZWRfYWRkIC09ICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSA8PCAxOwotICAgICAgaWYgKGhvd3RvLT5iaXRwb3MgPT0gMCkKLQl7Ci0JICBjaGVjayArPSBhZGQ7Ci0JICBzaWduZWRfY2hlY2sgKz0gc2lnbmVkX2FkZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7Ci0JICBpZiAoc2lnbmVkX2FkZCA+PSAwKQotCSAgICBzaWduZWRfY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7Ci0JICBlbHNlCi0JICAgIHNpZ25lZF9jaGVjayArPSAoKGFkZCA+PiBob3d0by0+Yml0cG9zKSB8ICgoYmZkX3ZtYSkgLSAxICYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5iaXRwb3MpKSk7Ci0JfQotICAgICAgc3dpdGNoIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cpCi0JewotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotCSAgewotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMTsKLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21pbiA9IH5yZWxvY19zaWduZWRfbWF4OwotCSAgICBpZiAoc2lnbmVkX2NoZWNrID4gcmVsb2Nfc2lnbmVkX21heCB8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgcmVsb2NfdW5zaWduZWRfbWF4ID0gKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0JICAgIGlmIChjaGVjayA+IHJlbG9jX3Vuc2lnbmVkX21heCkKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgewotCSAgICBiZmRfdm1hIHJlbG9jX2JpdHMgPSAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQkgICAgaWYgKChjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAwICYmICgoKGJmZF92bWEpIHNpZ25lZF9jaGVjayAmIH5yZWxvY19iaXRzKSAhPSAoLTEgJiB+cmVsb2NfYml0cykpKQotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSk7Ci0gIHN3aXRjaCAoaG93dG8tPnNpemUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGJmZF9wdXRiXzI0IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIHJlYWRpbmcgb2YgYW4gYS5vdXQgZmlsZSBoZWFkZXIgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotdGljMzBfYW91dF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwkvKiBSYXcgZXhlYyBoZWFkZXIgZnJvbSBmaWxlICovCi0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7CS8qIENsZWFuZWQtdXAgZXhlYyBoZWFkZXIgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgU1dBUF9NQUdJQwotICBleGVjLmFfaW5mbyA9IFNXQVBfTUFHSUMgKGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbHNlCi0gIGV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZW5kaWYgLyogU1dBUF9NQUdJQyAqLwotCi0gIGlmIChOX0JBRE1BRyAoZXhlYykpCi0gICAgcmV0dXJuIDA7Ci0jaWZkZWYgTUFDSFRZUEVfT0sKLSAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLQotICBOQU1FIChhb3V0LCBzd2FwX2V4ZWNfaGVhZGVyX2luKSAoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKLQotI2lmZGVmIFNXQVBfTUFHSUMKLSAgLyogc3dhcF9leGVjX2hlYWRlcl9pbiByZWFkIGluIGFfaW5mbyB3aXRoIHRoZSB3cm9uZyBieXRlIG9yZGVyICovCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2VuZGlmIC8qIFNXQVBfTUFHSUMgKi8KLQotICB0YXJnZXQgPSBOQU1FIChhb3V0LCBzb21lX2FvdXRfb2JqZWN0X3ApIChhYmZkLCAmZXhlYywgdGljMzBfYW91dF9jYWxsYmFjayk7Ci0KLSNpZmRlZiBFTlRSWV9DQU5fQkVfWkVSTwotICAvKiBUaGUgTkVXU09TMyBlbnRyeS1wb2ludCBpcy93YXMgMCwgd2hpY2ggKGFtb25nc3Qgb3RoZXIgbG9zc2FnZSkKLSAgICogbWVhbnMgdGhhdCBpdCBpc24ndCBvYnZpb3VzIGlmIEVYRUNfUCBzaG91bGQgYmUgc2V0LgotICAgKiBBbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWUgZm9yIGFuIGV4ZWN1dGFibGU6Ci0gICAqIFRoZXJlIG11c3QgYmUgbm8gcmVsb2NhdGlvbnMsIHRoZSBiZmQgY2FuIGJlIG5laXRoZXIgYW4KLSAgICogYXJjaGl2ZSBub3IgYW4gYXJjaGl2ZSBlbGVtZW50LCBhbmQgdGhlIGZpbGUgbXVzdCBiZSBleGVjdXRhYmxlLiAqLwotCi0gIGlmIChleGVjLmFfdHJzaXplICsgZXhlYy5hX2Ryc2l6ZSA9PSAwCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCAmJiBhYmZkLT5teV9hcmNoaXZlID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAkJLyogRXhlY3V0ZSBieSBvd25lci4gICovCi0jZW5kaWYKLSAgICAgIGlmIChzdGF0IChhYmZkLT5maWxlbmFtZSwgJmJ1ZikgPT0gMCAmJiAoYnVmLnN0X21vZGUgJiBTX0lYVVNSKSkKLQlhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gICAgfQotI2VuZGlmIC8qIEVOVFJZX0NBTl9CRV9aRVJPICovCi0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gZGF0YS4gIFRoaXMgYWN0dWFsbHkgZG9lcyBub3RoaW5nIHdpdGggdGhlCi0gICBzZWN0aW9ucy4gIEl0IGNvcGllcyB0aGUgc3ViZm9ybWF0IGZpZWxkLiAgV2UgY29weSBpdCBoZXJlLCBiZWNhdXNlCi0gICB3ZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGlzIGlzIGEgUU1BR0lDIGZpbGUgYmVmb3JlIHdlIHNldCB0aGUKLSAgIHNlY3Rpb24gY29udGVudHMsIGFuZCBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgaXMgbm90IGNhbGxlZCB1bnRpbAotICAgYWZ0ZXIgdGhlIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIHNldC4gICovCi0KLS8qQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYywgb2JmZCwgb3NlYykKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqaXNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotICAgIG9ial9hb3V0X3N1YmZvcm1hdCAob2JmZCkgPSBvYmpfYW91dF9zdWJmb3JtYXQgKGliZmQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0gICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi10aWMzMF9hb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgewotICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCi0gICAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gICAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgICBOQU1FIChhb3V0LCBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwotCi0gICAgZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgICBleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgICBOQU1FIChhb3V0LCBzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7Ci0KLSAgICBpZiAoYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA+IDApCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChiZmRfd3JpdGUgKChQVFIpICYgZXhlY19ieXRlcywgMSwgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSwgYWJmZCkgIT0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLQotICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCi0JJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICAgIHsKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fU1lNT0ZGICgqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlpZiAoIU5BTUUgKGFvdXQsIHdyaXRlX3N5bXMpIChhYmZkKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9UUkVMT0ZGICgqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFOQU1FIChhb3V0LCBzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fRFJFTE9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghTkFNRSAoYW91dCwgc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi10aWMzMF9hb3V0X3NldF9zaXplcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLQotI2lmZGVmIFNFR01FTlRfU0laRQotICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotI2Vsc2UKLSAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0jZW5kaWYKLQotI2lmZGVmIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUKLSAgYWRhdGEgKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBaTUFHSUNfRElTS19CTE9DS19TSVpFOwotI2Vsc2UKLSAgYWRhdGEgKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotI2VuZGlmCi0KLSAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmbmRlZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0KLS8qIENhbGxiYWNrIGZvciB0aGUgZmluYWxfbGluayByb3V0aW5lIHRvIHNldCB0aGUgc2VjdGlvbiBvZmZzZXRzLiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotCi1zdGF0aWMgdm9pZAotTVlfZmluYWxfbGlua19jYWxsYmFjayAoYWJmZCwgcHRyZWxvZmYsIHBkcmVsb2ZmLCBwc3ltb2ZmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyICpwdHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBkcmVsb2ZmOwotICAgICBmaWxlX3B0ciAqcHN5bW9mZjsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gICpwdHJlbG9mZiA9IG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyArIGV4ZWNwLT5hX2RhdGE7Ci0gICpwZHJlbG9mZiA9ICpwdHJlbG9mZiArIGV4ZWNwLT5hX3Ryc2l6ZTsKLSAgKnBzeW1vZmYgPSAqcGRyZWxvZmYgKyBleGVjcC0+YV9kcnNpemU7OwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZmluYWxfbGluawotCi0vKiBGaW5hbCBsaW5rIHJvdXRpbmUuICBXZSBuZWVkIHRvIHVzZSBhIGNhbGwgYmFjayB0byBnZXQgdGhlIGNvcnJlY3QKLSAgIG9mZnNldHMgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGZpbGVfcHRyIHBvczsKLSAgYmZkX3ZtYSB2bWEgPSAwOwotICBpbnQgcGFkOwotCi0gIC8qIFNldCB0aGUgZXhlY3V0YWJsZSBoZWFkZXIgc2l6ZSB0byAwLCBhcyB3ZSBkb24ndCB3YW50IG9uZSBmb3IgYW4KLSAgICAgb3V0cHV0LiAqLwotICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gMDsKLSAgcG9zID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgLyogVGV4dC4gICovCi0gIHZtYSA9IGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT52bWE7Ci0gIHBvcyArPSB2bWE7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSB2bWE7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKLSAgcG9zICs9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogRGF0YS4gICovCi0gIGlmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpCi0gICAgewotICAgICAgaWYgKGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT5uZXh0LT52bWEgPiAwKQotCW9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24tPm5leHQtPnZtYTsKLSAgICAgIGVsc2UKLQlvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCA0KTsKLSAgICB9Ci0gIGlmIChvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA8IHZtYSkKLSAgICB7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCA0KTsKLSAgICB9Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKLSAgdm1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IHZtYSArIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIGV4ZWNwLT5hX3RleHQgPSB2bWEgLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV90ZXh0OwotCi0gIC8qIFNpbmNlIEJTUyBmb2xsb3dzIGRhdGEgaW1tZWRpYXRlbHksIHNlZSBpZiBpdCBuZWVkcyBhbGlnbm1lbnQuICAqLwotICB2bWEgKz0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0gIHBvcyArPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSB2bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT51c2VyX3NldF92bWEgPSAxOwotCi0gIC8qIFdlIGFyZSBmdWxseSByZXNpemVkLCBzbyBkb24ndCByZWFkanVzdCBpbiBmaW5hbF9saW5rLiAqLwotICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotCi0gIHJldHVybiBOQU1FIChhb3V0LCBmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNlbmRpZgotCi1lbnVtIG1hY2hpbmVfdHlwZQotdGljMzBfYW91dF9tYWNoaW5lX3R5cGUgKGFyY2gsIG1hY2hpbmUsIHVua25vd24pCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiAqdW5rbm93bjsKLXsKLSAgZW51bSBtYWNoaW5lX3R5cGUgYXJjaF9mbGFnczsKLQotICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOwotICAqdW5rbm93biA9IHRydWU7Ci0KLSAgc3dpdGNoIChhcmNoKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzMwOgotICAgICAgKnVua25vd24gPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOwotICAgIH0KLSAgaWYgKGFyY2hfZmxhZ3MgIT0gTV9VTktOT1dOKQotICAgICp1bmtub3duID0gZmFsc2U7Ci0gIHJldHVybiBhcmNoX2ZsYWdzOwotfQotCi1ib29sZWFuCi10aWMzMF9hb3V0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKCFiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgewotICAgICAgYm9vbGVhbiB1bmtub3duOwotICAgICAgdGljMzBfYW91dF9tYWNoaW5lX3R5cGUgKGFyY2gsIG1hY2hpbmUsICZ1bmtub3duKTsKLSAgICAgIGlmICh1bmtub3duKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICByZXR1cm4gKCphb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPnNldF9zaXplcykgKGFiZmQpOwotfQotCi0vKiBXZSBhc3N1bWUgQkZEIGdlbmVyaWMgYXJjaGl2ZSBmaWxlcy4gICovCi0jaWZuZGVmCU1ZX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZQlNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBNWV9nZXRfZWx0X2F0X2luZGV4CQlfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2VuZGlmCi0jaWZuZGVmCU1ZX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZQlNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2VuZGlmCi0jaWZuZGVmCU1ZX3NsdXJwX2FybWFwCi0jZGVmaW5lCU1ZX3NsdXJwX2FybWFwCQkJYmZkX3NsdXJwX2JzZF9hcm1hcAotI2VuZGlmCi0jaWZuZGVmCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUJTVlfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQlfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNlbmRpZgotI2lmbmRlZiBNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNlbmRpZgotI2lmbmRlZglNWV93cml0ZV9hcm1hcAotI2RlZmluZQlNWV93cml0ZV9hcm1hcAkJYnNkX3dyaXRlX2FybWFwCi0jZW5kaWYKLSNpZm5kZWYgTVlfcmVhZF9hcl9oZHIKLSNkZWZpbmUgTVlfcmVhZF9hcl9oZHIJCV9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2VuZGlmCi0jaWZuZGVmCU1ZX3RydW5jYXRlX2FybmFtZQotI2RlZmluZQlNWV90cnVuY2F0ZV9hcm5hbWUJCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZW5kaWYKLSNpZm5kZWYgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotI2RlZmluZSBNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotI2VuZGlmCi0KLS8qIE5vIGNvcmUgZmlsZSBkZWZpbmVkIGhlcmUgLS0gY29uZmlndXJlIGluIHRyYWQtY29yZS5jIHNlcGFyYXRlbHkuICAqLwotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAlcCi0JCQkJX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX3AJCV9iZmRfZHVtbXlfdGFyZ2V0Ci0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19zdGFydAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19lbmQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQlcCi0JCQkodm9pZCAoKikgUEFSQU1TICgoYmZkKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBOQU1FKGFvdXQsY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgTkFNRShhb3V0LGNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9zZXRfc2VjdGlvbl9jb250ZW50cyBOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2VuZGlmCi0jaWZuZGVmIE1ZX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgTVlfbmV3X3NlY3Rpb25faG9vayBOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQgTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYgotI2RlZmluZSBNWV9nZXRfc3ltdGFiIE5BTUUoYW91dCxnZXRfc3ltdGFiKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfcmVsb2MKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX3JlbG9jIE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWFrZV9lbXB0eV9zeW1ib2wKLSNkZWZpbmUgTVlfbWFrZV9lbXB0eV9zeW1ib2wgTkFNRShhb3V0LG1ha2VfZW1wdHlfc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3ByaW50X3N5bWJvbAotI2RlZmluZSBNWV9wcmludF9zeW1ib2wgTkFNRShhb3V0LHByaW50X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgTVlfZ2V0X3N5bWJvbF9pbmZvIE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2xpbmVubwotI2RlZmluZSBNWV9nZXRfbGluZW5vIE5BTUUoYW91dCxnZXRfbGluZW5vKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NldF9hcmNoX21hY2gKLSNkZWZpbmUgTVlfc2V0X2FyY2hfbWFjaCB0aWMzMF9hb3V0X3NldF9hcmNoX21hY2gKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBNWV9maW5kX25lYXJlc3RfbGluZSBOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgTVlfc2l6ZW9mX2hlYWRlcnMgTkFNRShhb3V0LHNpemVvZl9oZWFkZXJzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBNWV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2djX3NlY3Rpb25zCi0jZGVmaW5lIE1ZX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgdGljMzBfYW91dF9yZWxvY190eXBlX2xvb2t1cAotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykKLSNlbmRpZgotI2lmbmRlZiBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBOQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBNWV9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZW5kaWYKLQotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBNWV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBNWV9jbG9zZV9hbmRfY2xlYW51cCBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBcCi0gIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2VuZGlmCi0KLS8qIEFvdXQgc3ltYm9scyBub3JtYWxseSBoYXZlIGxlYWRpbmcgdW5kZXJzY29yZXMgKi8KLSNpZm5kZWYgTVlfc3ltYm9sX2xlYWRpbmdfY2hhcgotI2RlZmluZSBNWV9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotI2VuZGlmCi0KLS8qIEFvdXQgYXJjaGl2ZXMgbm9ybWFsbHkgdXNlIHNwYWNlcyBmb3IgcGFkZGluZyAqLwotI2lmbmRlZiBBUl9QQURfQ0hBUgotI2RlZmluZSBBUl9QQURfQ0hBUiAnICcKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX0JGRF9UQVJHRVQKLWNvbnN0IGJmZF90YXJnZXQgdGljMzBfYW91dF92ZWMgPQotewotICBUQVJHRVROQU1FLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChiaWcpICovCi0gIChIQVNfUkVMT0MgfAkJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICBBUl9QQURfQ0hBUiwJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChNWSksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YQotfTsKLSNlbmRpZiAvKiBNWV9CRkRfVEFSR0VUICovCmRpZmYgLS1naXQgYS9iZmQvYW91dDAuYyBiL2JmZC9hb3V0MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM3YWUwLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIFN1bk9TIHN0eWxlIGEub3V0IHdpdGggZmxhZ3Mgc2V0IHRvIDAKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC16ZXJvLWJpZyIKLSNkZWZpbmUgTVkoT1ApIENBVChhb3V0MF9iaWdfLE9QKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMAotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSBcCi0gICgobXR5cGUpID09IE1fVU5LTk9XTiB8fCAobXR5cGUpID09IE1fNjgwMTAgfHwgKG10eXBlKSA9PSBNXzY4MDIwKQotCi0vKiBJbmNsdWRlIHRoZSB1c3VhbCBhLm91dCBzdXBwb3J0LiAgKi8KLSNpbmNsdWRlICJhb3V0ZjEuaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0MzIuYyBiL2JmZC9hb3V0MzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjNDBiNC4uMDAwMDAwMAotLS0gYS9iZmQvYW91dDMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIDMyLWJpdCBhLm91dCBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNpbmNsdWRlICJhb3V0eC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQ2NC5jIGIvYmZkL2FvdXQ2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDAzNmM4Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0NjQuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgNjQtYml0IGEub3V0IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSA2NAotCi0vKiBhb3V0eC5oIHJlcXVpcmVzIGRlZmluaXRpb25zIGZvciBCTUFHSUMgYW5kIFFNQUdJQy4gICovCi0jaWZuZGVmIEJNQUdJQwotI2RlZmluZSBCTUFHSUMgMAotI2VuZGlmCi0jaWZuZGVmIFFNQUdJQwotI2RlZmluZSBRTUFHSUMgMAotI2VuZGlmCi0KLSNpbmNsdWRlICJhb3V0eC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXRmMS5oIGIvYmZkL2FvdXRmMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY5NWI1Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0ZjEuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1OSArMCwwIEBACi0vKiBBLm91dCAiZm9ybWF0IDEiIGZpbGUgaGFuZGxpbmcgY29kZSBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiYW91dC9zdW40LmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotCi0vKiBUaGlzIGlzIG5lZWRlZCB0byByZWplY3QgYSBOZXdzT1MgZmlsZSwgZS5nLiBpbgotICAgZ2RiL3Rlc3RzdWl0ZS9nZGIudDEwL2Nyb3NzbG9hZC5leHAuIDxraW5nZG9uQGN5Z251cy5jb20+Ci0gICBJIG5lZWRlZCB0byBhZGQgTV9VTktOT1dOIHRvIHJlY29nbml6ZSBhIDY4MDAwIG9iamVjdCwgc28gdGhpcyB3aWxsCi0gICBwcm9iYWJseSBubyBsb25nZXIgcmVqZWN0IGEgTmV3c09TIG9iamVjdC4gIDxpYW5AY3lnbnVzLmNvbT4uICovCi0jaWZuZGVmIE1BQ0hUWVBFX09LCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSBcCi0gICgoKG10eXBlKSA9PSBNX1NQQVJDICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfc3BhcmMsIDApICE9IE5VTEwpIFwKLSAgIHx8ICgoKG10eXBlKSA9PSBNX1VOS05PV04gfHwgKG10eXBlKSA9PSBNXzY4MDEwIHx8IChtdHlwZSkgPT0gTV82ODAyMCkgXAotICAgICAgICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfbTY4aywgMCkgIT0gTlVMTCkpCi0jZW5kaWYKLQotLyoKLVRoZSBmaWxlIEBjb2Rle2FvdXRmMS5ofSBjb250YWlucyB0aGUgY29kZSBmb3IgQkZEJ3MKLWEub3V0IGJhY2sgZW5kLiBDb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBiYWNrIGVuZCBpcyBnaXZlbiBieSB0aGVzZQotdHdvIHByZXByb2Nlc3NvciBuYW1lczoKLUB0YWJsZSBAY29kZQotQGl0ZW0gQVJDSF9TSVpFCi1UaGlzIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgMzIgb3IgNjQsIGRlcGVuZGluZyB1cG9uIHRoZSBzaXplIG9mIGFuCi1pbnQgaW4gdGhlIHRhcmdldCBmb3JtYXQuIEl0IGNoYW5nZXMgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3RzIHdoaWNoCi1wZXJmb3JtIHRoZSBtZW1vcnkvZGlzayBtYXBwaW5nIG9mIHN0cnVjdHVyZXMuCi0KLVRoZSA2NCBiaXQgYmFja2VuZCBtYXkgb25seSBiZSB1c2VkIGlmIHRoZSBob3N0IGNvbXBpbGVyIHN1cHBvcnRzIDY0Ci1pbnRzIChlZyBsb25nIGxvbmcgd2l0aCBnY2MpLCBieSBkZWZpbmluZyB0aGUgbmFtZSBAY29kZXtCRkRfSE9TVF82NF9CSVR9IGluIEBjb2Rle2JmZC5ofS4KLVdpdGggdGhpcyBuYW1lIGRlZmluZWQsIEBlbXBoe2FsbH0gYmZkIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoIDY0Yml0Ci1hcml0aG1ldGljLCBub3QganVzdCB0aG9zZSB0byBhIDY0Yml0IHRhcmdldC4KLQotQGl0ZW0gVEFSR0VUTkFNRQotVGhlIG5hbWUgcHV0IGludG8gdGhlIHRhcmdldCB2ZWN0b3IuCi1AaXRlbQotQGVuZCB0YWJsZQotCi0qLwotCi0vKlNVUFBSRVNTNTU4Ki8KLS8qU1VQUFJFU1M1MjkqLwotCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIHN1bm9zX3NldF9hcmNoX21hY2ggc3Vub3NfNjRfc2V0X2FyY2hfbWFjaAotI2RlZmluZSBzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMgYW91dF82NF9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0jZWxzZQotI2RlZmluZSBzdW5vc19zZXRfYXJjaF9tYWNoIHN1bm9zXzMyX3NldF9hcmNoX21hY2gKLSNkZWZpbmUgc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cwotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHN1bm9zX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzdW5vc19zZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGNob29zZV9yZWxvY19zaXplIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpzdW5vczRfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICpzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3M0X3NldF9zaXplcyBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBNZXJnZSBiYWNrZW5kIGRhdGEgaW50byB0aGUgb3V0cHV0IGZpbGUuCi0gICBUaGlzIGlzIG5lY2Vzc2FyeSBvbiBzcGFyY2xldC1hb3V0IHdoZXJlIHdlIHdhbnQgdGhlIHJlc3VsdGFudCBtYWNoaW5lCi0gICBudW1iZXIgdG8gYmUgTV9TUEFSQ0xFVCBpZiBhbnkgaW5wdXQgZmlsZSBpcyBNX1NQQVJDTEVULiAgKi8KLQotI2RlZmluZSBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBzdW5vc19tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQsICpvYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfYXJjaF9zcGFyYykKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoIChvYmZkKSA8IGJmZF9nZXRfbWFjaCAoaWJmZCkpCi0JYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfZ2V0X21hY2ggKGliZmQpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgZWl0aGVyIHN1bm9zXzMyX3NldF9hcmNoX21hY2ggb3Igc3Vub3NfNjRfc2V0X2FyY2hfbWFjaCwKLSAgIGRlcGVuZGluZyB1cG9uIEFSQ0hfU0laRS4gICovCi0KLXN0YXRpYyB2b2lkCi1zdW5vc19zZXRfYXJjaF9tYWNoIChhYmZkLCBtYWNodHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgbWFjaHR5cGU7Ci17Ci0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIGxvbmcgbWFjaGluZTsKLSAgc3dpdGNoIChtYWNodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIE1fVU5LTk9XTjoKLSAgICAgIC8qIFNvbWUgU3VuM3MgbWFrZSBtYWdpYyBudW1iZXJzIHdpdGhvdXQgY3B1IHR5cGVzIGluIHRoZW0sIHNvCi0JIHdlJ2xsIGRlZmF1bHQgdG8gdGhlIDY4MDAwLiAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fNjgwMTA6Ci0gICAgY2FzZSBNX0hQMjAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fNjgwMjA6Ci0gICAgY2FzZSBNX0hQMzAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDIwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU1BBUkM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NQQVJDTEVUOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU1BBUkNMSVRFX0xFOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzM4NjoKLSAgICBjYXNlIE1fMzg2X0RZTklYOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2kzODY7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzI5SzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hMjlrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9IUFVYOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKEFCRkQsIEVYRUMpIFwKLSAgTkFNRShzdW5vcyxzZXRfYXJjaF9tYWNoKShBQkZELCBOX01BQ0hUWVBFIChFWEVDKSk7IFwKLSAgY2hvb3NlX3JlbG9jX3NpemUoQUJGRCk7Ci0KLS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnksIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1jaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIFN1bk9TIGZvcm1hdC4gIFNlY3Rpb24gY29udGVudHMgaGF2ZQotICAgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZAotICAgcmVsb2NhdGlvbi4gIFRoZSByZWFsIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBlaXRoZXIKLSAgIGFvdXRfNjRfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyBvcgotICAgYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBkZXBlbmRpbmcgdXBvbiBBUkNIX1NJWkUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX202ODAwMDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fVU5LTk9XTik7Ci0JICBicmVhazsKLQljYXNlIGJmZF9tYWNoX202ODAxMDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fNjgwMTApOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9tYWNoX202ODAyMDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fNjgwMjApOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkNMRVQpOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGU6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDTElURV9MRSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9TUEFSQyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzM4Nik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzI5Syk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9VTktOT1dOKTsKLSAgICB9Ci0KLSAgY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpOwotCi0gIE5fU0VUX0ZMQUdTICgqZXhlY3AsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOwotCi0gIE5fU0VUX0RZTkFNSUMgKCpleGVjcCwgYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpOwotCi0gIFdSSVRFX0hFQURFUlMgKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIGNvcmUgZmlsZXMgKi8KLQotI2RlZmluZSBDT1JFX01BR0lDIDB4MDgwNDU2Ci0jZGVmaW5lIENPUkVfTkFNRUxFTiAxNgotCi0vKiBUaGUgY29yZSBzdHJ1Y3R1cmUgaXMgdGFrZW4gZnJvbSB0aGUgU3VuIGRvY3VtZW50YXRpb24uCi0gIFVuZm9ydHVuYXRlbHksIHRoZXkgZG9uJ3QgZG9jdW1lbnQgdGhlIEZQQSBzdHJ1Y3R1cmUsIG9yIGF0IGxlYXN0IEkKLSAgY2FuJ3QgZmluZCBpdCBlYXNpbHkuICBGb3J0dW5hdGVseSB0aGUgY29yZSBoZWFkZXIgY29udGFpbnMgaXRzIG93bgotICBsZW5ndGguICBTbyB0aGlzIHNob3VsZG4ndCBjYXVzZSBwcm9ibGVtcywgZXhjZXB0IGZvciBjX3Vjb2RlLCB3aGljaAotICBzbyBmYXIgd2UgZG9uJ3QgdXNlIGJ1dCBpcyBlYXN5IHRvIGZpbmQgd2l0aCBhIGxpdHRsZSBhcml0aG1ldGljLiAqLwotCi0vKiBCdXQgdGhlIHJlZyBzdHJ1Y3R1cmUgY2FuIGJlIGdvdHRlbiBmcm9tIHRoZSBTUEFSQyBwcm9jZXNzb3IgaGFuZGJvb2suCi0gIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBpbiBhIEdOVSBpbmNsdWRlIGZpbGUgdGhvdWdoIHNvIHRoYXQgZ2RiIGNhbiB1c2UKLSAgdGhlIHNhbWUgaW5mby4gKi8KLXN0cnVjdCByZWdzCi17Ci0gIGludCByX3BzcjsKLSAgaW50IHJfcGM7Ci0gIGludCByX25wYzsKLSAgaW50IHJfeTsKLSAgaW50IHJfZzE7Ci0gIGludCByX2cyOwotICBpbnQgcl9nMzsKLSAgaW50IHJfZzQ7Ci0gIGludCByX2c1OwotICBpbnQgcl9nNjsKLSAgaW50IHJfZzc7Ci0gIGludCByX28wOwotICBpbnQgcl9vMTsKLSAgaW50IHJfbzI7Ci0gIGludCByX28zOwotICBpbnQgcl9vNDsKLSAgaW50IHJfbzU7Ci0gIGludCByX282OwotICBpbnQgcl9vNzsKLX07Ci0KLS8qIFRha2VuIGZyb20gU3VuIGRvY3VtZW50YXRpb246ICovCi0KLS8qIEZJWE1FOiAgSXQncyB3b3JzZSB0aGFuIHdlIGV4cGVjdC4gIFRoaXMgc3RydWN0IGNvbnRhaW5zIFRXTyBzdWJzdHJ1Y3RzCi0gIG5laXRoZXIgb2Ygd2hvc2Ugc2l6ZSB3ZSBrbm93LCBXSVRIIFNUVUZGIElOIEJFVFdFRU4gVEhFTSEgIFdlIGNhbid0Ci0gIGV2ZW4gcG9ydGFibHkgYWNjZXNzIHRoZSBzdHVmZiBpbiBiZXR3ZWVuISAgKi8KLQotc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUKLSAgewotICAgIGludCBjX21hZ2ljOwkJLyogQ29yZWZpbGUgbWFnaWMgbnVtYmVyICovCi0gICAgaW50IGNfbGVuOwkJCS8qIFNpemVvZiAoc3RydWN0IGNvcmUpICovCi0jZGVmaW5lCVNQQVJDX0NPUkVfTEVOCTQzMgotICAgIGludCBjX3JlZ3NbMTldOwkJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAtLSBNQUNIREVQIFNJWkUgKi8KLSAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBjX2FvdXRoZHI7CS8qIEEub3V0IGhlYWRlciAqLwotICAgIGludCBjX3NpZ25vOwkJLyogS2lsbGluZyBzaWduYWwsIGlmIGFueSAqLwotICAgIGludCBjX3RzaXplOwkJLyogVGV4dCBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19kc2l6ZTsJCS8qIERhdGEgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfc3NpemU7CQkvKiBTdGFjayBzaXplIChieXRlcykgKi8KLSAgICBjaGFyIGNfY21kbmFtZVtDT1JFX05BTUVMRU4gKyAxXTsJLyogQ29tbWFuZCBuYW1lICovCi0gICAgZG91YmxlIGZwX3N0dWZmWzFdOwkJLyogZXh0ZXJuYWwgRlBVIHN0YXRlIChzaXplIHVua25vd24gYnkgdXMpICovCi0gICAgLyogVGhlIHR5cGUgImRvdWJsZSIgaXMgY3JpdGljYWwgaGVyZSwgZm9yIGFsaWdubWVudC4KLSAgICBTdW5PUyBkZWNsYXJlcyBhIHN0cnVjdCBoZXJlLCBidXQgdGhlIHN0cnVjdCdzIGFsaWdubWVudAotICAgICAgaXMgZG91YmxlIHNpbmNlIGl0IGNvbnRhaW5zIGRvdWJsZXMuICAqLwotICAgIGludCBjX3Vjb2RlOwkJLyogRXhjZXB0aW9uIG5vLiBmcm9tIHVfY29kZSAqLwotICAgIC8qICh0aGlzIG1lbWJlciBpcyBub3QgYWNjZXNzaWJsZSBieSBuYW1lIHNpbmNlIHdlIGRvbid0Ci0gICAgcG9ydGFibHkga25vdyB0aGUgc2l6ZSBvZiBmcF9zdHVmZi4pICovCi0gIH07Ci0KLS8qIENvcmUgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBCQ1AgKHRoZSBwYXJ0IG9mIFNvbGFyaXMgd2hpY2ggYWxsb3dzCi0gICBpdCB0byBydW4gU3VuT1M0IGEub3V0IGZpbGVzKS4gICovCi1zdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZQotICB7Ci0gICAgaW50IGNfbWFnaWM7CQkvKiBDb3JlZmlsZSBtYWdpYyBudW1iZXIgKi8KLSAgICBpbnQgY19sZW47CQkJLyogU2l6ZW9mIChzdHJ1Y3QgY29yZSkgKi8KLSNkZWZpbmUJU09MQVJJU19CQ1BfQ09SRV9MRU4JNDU2Ci0gICAgaW50IGNfcmVnc1sxOV07CQkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIC0tIE1BQ0hERVAgU0laRSAqLwotICAgIGludCBjX2V4ZGF0YV92cDsJCS8qIGV4ZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgICBpbnQgY19leGRhdGFfdHNpemU7Ci0gICAgaW50IGNfZXhkYXRhX2RzaXplOwotICAgIGludCBjX2V4ZGF0YV9ic2l6ZTsKLSAgICBpbnQgY19leGRhdGFfbHNpemU7Ci0gICAgaW50IGNfZXhkYXRhX25zaGxpYnM7Ci0gICAgc2hvcnQgY19leGRhdGFfbWFjaDsKLSAgICBzaG9ydCBjX2V4ZGF0YV9tYWc7Ci0gICAgaW50IGNfZXhkYXRhX3RvZmZzZXQ7Ci0gICAgaW50IGNfZXhkYXRhX2RvZmZzZXQ7Ci0gICAgaW50IGNfZXhkYXRhX2xvZmZzZXQ7Ci0gICAgaW50IGNfZXhkYXRhX3R4dG9yZzsKLSAgICBpbnQgY19leGRhdGFfZGF0b3JnOwotICAgIGludCBjX2V4ZGF0YV9lbnRsb2M7Ci0gICAgaW50IGNfc2lnbm87CQkvKiBLaWxsaW5nIHNpZ25hbCwgaWYgYW55ICovCi0gICAgaW50IGNfdHNpemU7CQkvKiBUZXh0IHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX2RzaXplOwkJLyogRGF0YSBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19zc2l6ZTsJCS8qIFN0YWNrIHNpemUgKGJ5dGVzKSAqLwotICAgIGNoYXIgY19jbWRuYW1lW0NPUkVfTkFNRUxFTiArIDFdOwkvKiBDb21tYW5kIG5hbWUgKi8KLSAgICBkb3VibGUgZnBfc3R1ZmZbMV07CQkvKiBleHRlcm5hbCBGUFUgc3RhdGUgKHNpemUgdW5rbm93biBieSB1cykgKi8KLSAgICAvKiBUaGUgdHlwZSAiZG91YmxlIiBpcyBjcml0aWNhbCBoZXJlLCBmb3IgYWxpZ25tZW50LgotICAgIFN1bk9TIGRlY2xhcmVzIGEgc3RydWN0IGhlcmUsIGJ1dCB0aGUgc3RydWN0J3MgYWxpZ25tZW50Ci0gICAgICBpcyBkb3VibGUgc2luY2UgaXQgY29udGFpbnMgZG91Ymxlcy4gICovCi0gICAgaW50IGNfdWNvZGU7CQkvKiBFeGNlcHRpb24gbm8uIGZyb20gdV9jb2RlICovCi0gICAgLyogKHRoaXMgbWVtYmVyIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IG5hbWUgc2luY2Ugd2UgZG9uJ3QKLSAgICBwb3J0YWJseSBrbm93IHRoZSBzaXplIG9mIGZwX3N0dWZmLikgKi8KLSAgfTsKLQotc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZQotICB7Ci0gICAgaW50IGNfbWFnaWM7CQkvKiBDb3JlZmlsZSBtYWdpYyBudW1iZXIgKi8KLSAgICBpbnQgY19sZW47CQkJLyogU2l6ZW9mIChzdHJ1Y3QgY29yZSkgKi8KLSNkZWZpbmUJU1VOM19DT1JFX0xFTgk4MjYJLyogQXMgb2YgU3VuT1MgNC4xLjEgKi8KLSAgICBpbnQgY19yZWdzWzE4XTsJCS8qIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgLS0gTUFDSERFUCBTSVpFICovCi0gICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgY19hb3V0aGRyOwkvKiBBLm91dCBoZWFkZXIgKi8KLSAgICBpbnQgY19zaWdubzsJCS8qIEtpbGxpbmcgc2lnbmFsLCBpZiBhbnkgKi8KLSAgICBpbnQgY190c2l6ZTsJCS8qIFRleHQgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfZHNpemU7CQkvKiBEYXRhIHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX3NzaXplOwkJLyogU3RhY2sgc2l6ZSAoYnl0ZXMpICovCi0gICAgY2hhciBjX2NtZG5hbWVbQ09SRV9OQU1FTEVOICsgMV07CS8qIENvbW1hbmQgbmFtZSAqLwotICAgIGRvdWJsZSBmcF9zdHVmZlsxXTsJCS8qIGV4dGVybmFsIEZQVSBzdGF0ZSAoc2l6ZSB1bmtub3duIGJ5IHVzKSAqLwotICAgIC8qIFRoZSB0eXBlICJkb3VibGUiIGlzIGNyaXRpY2FsIGhlcmUsIGZvciBhbGlnbm1lbnQuCi0gICAgU3VuT1MgZGVjbGFyZXMgYSBzdHJ1Y3QgaGVyZSwgYnV0IHRoZSBzdHJ1Y3QncyBhbGlnbm1lbnQKLSAgICAgIGlzIGRvdWJsZSBzaW5jZSBpdCBjb250YWlucyBkb3VibGVzLiAgKi8KLSAgICBpbnQgY191Y29kZTsJCS8qIEV4Y2VwdGlvbiBuby4gZnJvbSB1X2NvZGUgKi8KLSAgICAvKiAodGhpcyBtZW1iZXIgaXMgbm90IGFjY2Vzc2libGUgYnkgbmFtZSBzaW5jZSB3ZSBkb24ndAotICAgIHBvcnRhYmx5IGtub3cgdGhlIHNpemUgb2YgZnBfc3R1ZmYuKSAqLwotICB9OwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZQotICB7Ci0gICAgaW50IGNfbWFnaWM7CQkvKiBDb3JlZmlsZSBtYWdpYyBudW1iZXIgKi8KLSAgICBpbnQgY19sZW47CQkJLyogU2l6ZW9mIChzdHJ1Y3QgY29yZSkgKi8KLSAgICBsb25nIGNfcmVnc19wb3M7CQkvKiBmaWxlIG9mZnNldCBvZiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCi0gICAgaW50IGNfcmVnc19zaXplOwkJLyogc2l6ZSBvZiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCi0gICAgc3RydWN0IGludGVybmFsX2V4ZWMgY19hb3V0aGRyOwkvKiBBLm91dCBoZWFkZXIgKi8KLSAgICBpbnQgY19zaWdubzsJCS8qIEtpbGxpbmcgc2lnbmFsLCBpZiBhbnkgKi8KLSAgICBpbnQgY190c2l6ZTsJCS8qIFRleHQgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfZHNpemU7CQkvKiBEYXRhIHNpemUgKGJ5dGVzKSAqLwotICAgIGJmZF92bWEgY19kYXRhX2FkZHI7CS8qIERhdGEgc3RhcnQgKGFkZHJlc3MpICovCi0gICAgaW50IGNfc3NpemU7CQkvKiBTdGFjayBzaXplIChieXRlcykgKi8KLSAgICBiZmRfdm1hIGNfc3RhY2t0b3A7CQkvKiBTdGFjayB0b3AgKGFkZHJlc3MpICovCi0gICAgY2hhciBjX2NtZG5hbWVbQ09SRV9OQU1FTEVOICsgMV07CS8qIENvbW1hbmQgbmFtZSAqLwotICAgIGxvbmcgZnBfc3R1ZmZfcG9zOwkJLyogZmlsZSBvZmZzZXQgb2YgZXh0ZXJuYWwgRlBVIHN0YXRlIChyZWdzKSAqLwotICAgIGludCBmcF9zdHVmZl9zaXplOwkJLyogU2l6ZSBvZiBpdCAqLwotICAgIGludCBjX3Vjb2RlOwkJLyogRXhjZXB0aW9uIG5vLiBmcm9tIHVfY29kZSAqLwotICB9OwotCi1zdGF0aWMgdm9pZCBzd2FwY29yZV9zdW4zCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICopKTsKLXN0YXRpYyB2b2lkIHN3YXBjb3JlX3NwYXJjCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICopKTsKLXN0YXRpYyB2b2lkIHN3YXBjb3JlX3NvbGFyaXNfYmNwCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICopKTsKLQotLyogYnl0ZS1zd2FwIGluIHRoZSBTdW4tMyBjb3JlIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQKLXN3YXBjb3JlX3N1bjMgKGFiZmQsIGV4dCwgaW50Y29yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpleHQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICppbnRjb3JlOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICpleHRjb3JlID0gKHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKikgZXh0OwotCi0gIGludGNvcmUtPmNfbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX21hZ2ljKTsKLSAgaW50Y29yZS0+Y19sZW4gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2xlbik7Ci0gIGludGNvcmUtPmNfcmVnc19wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqKSAwKS0+Y19yZWdzKTsKLSAgaW50Y29yZS0+Y19yZWdzX3NpemUgPSBzaXplb2YgKGV4dGNvcmUtPmNfcmVncyk7Ci0jaWYgQVJDSF9TSVpFID09IDY0Ci0gIGFvdXRfNjRfc3dhcF9leGVjX2hlYWRlcl9pbgotI2Vsc2UKLSAgYW91dF8zMl9zd2FwX2V4ZWNfaGVhZGVyX2luCi0jZW5kaWYKLSAgICAoYWJmZCwgJmV4dGNvcmUtPmNfYW91dGhkciwgJmludGNvcmUtPmNfYW91dGhkcik7Ci0gIGludGNvcmUtPmNfc2lnbm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NpZ25vKTsKLSAgaW50Y29yZS0+Y190c2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfdHNpemUpOwotICBpbnRjb3JlLT5jX2RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19kc2l6ZSk7Ci0gIGludGNvcmUtPmNfZGF0YV9hZGRyID0gTl9EQVRBRERSIChpbnRjb3JlLT5jX2FvdXRoZHIpOwotICBpbnRjb3JlLT5jX3NzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zc2l6ZSk7Ci0gIG1lbWNweSAoaW50Y29yZS0+Y19jbWRuYW1lLCBleHRjb3JlLT5jX2NtZG5hbWUsIHNpemVvZiAoaW50Y29yZS0+Y19jbWRuYW1lKSk7Ci0gIGludGNvcmUtPmZwX3N0dWZmX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICopIDApLT5mcF9zdHVmZik7Ci0gIC8qIEZQIHN0dWZmIHRha2VzIHVwIHdob2xlIHJlc3Qgb2Ygc3RydWN0LCBleGNlcHQgY191Y29kZS4gKi8KLSAgaW50Y29yZS0+ZnBfc3R1ZmZfc2l6ZSA9IGludGNvcmUtPmNfbGVuIC0gKHNpemVvZiBleHRjb3JlLT5jX3Vjb2RlKSAtCi0gICAgKGZpbGVfcHRyKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICopIDApLT5mcF9zdHVmZik7Ci0gIC8qIFVjb2RlIGlzIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBzdHJ1Y3QgLS0ganVzdCBiZWZvcmUgdGhlIGVuZCAqLwotICBpbnRjb3JlLT5jX3Vjb2RlID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsCi0gICAgaW50Y29yZS0+Y19sZW4gLSBzaXplb2YgKGV4dGNvcmUtPmNfdWNvZGUpICsgKHVuc2lnbmVkIGNoYXIgKikgZXh0Y29yZSk7Ci0gIGludGNvcmUtPmNfc3RhY2t0b3AgPSAweDBFMDAwMDAwOwkvKiBCeSBleHBlcmltZW50YXRpb24gKi8KLX0KLQotCi0vKiBieXRlLXN3YXAgaW4gdGhlIFNwYXJjIGNvcmUgc3RydWN0dXJlICovCi1zdGF0aWMgdm9pZAotc3dhcGNvcmVfc3BhcmMgKGFiZmQsIGV4dCwgaW50Y29yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpleHQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICppbnRjb3JlOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqZXh0Y29yZSA9IChzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqKSBleHQ7Ci0KLSAgaW50Y29yZS0+Y19tYWdpYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbWFnaWMpOwotICBpbnRjb3JlLT5jX2xlbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbGVuKTsKLSAgaW50Y29yZS0+Y19yZWdzX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqKSAwKS0+Y19yZWdzKTsKLSAgaW50Y29yZS0+Y19yZWdzX3NpemUgPSBzaXplb2YgKGV4dGNvcmUtPmNfcmVncyk7Ci0jaWYgQVJDSF9TSVpFID09IDY0Ci0gIGFvdXRfNjRfc3dhcF9leGVjX2hlYWRlcl9pbgotI2Vsc2UKLSAgYW91dF8zMl9zd2FwX2V4ZWNfaGVhZGVyX2luCi0jZW5kaWYKLSAgICAoYWJmZCwgJmV4dGNvcmUtPmNfYW91dGhkciwgJmludGNvcmUtPmNfYW91dGhkcik7Ci0gIGludGNvcmUtPmNfc2lnbm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NpZ25vKTsKLSAgaW50Y29yZS0+Y190c2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfdHNpemUpOwotICBpbnRjb3JlLT5jX2RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19kc2l6ZSk7Ci0gIGludGNvcmUtPmNfZGF0YV9hZGRyID0gTl9EQVRBRERSIChpbnRjb3JlLT5jX2FvdXRoZHIpOwotICBpbnRjb3JlLT5jX3NzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zc2l6ZSk7Ci0gIG1lbWNweSAoaW50Y29yZS0+Y19jbWRuYW1lLCBleHRjb3JlLT5jX2NtZG5hbWUsIHNpemVvZiAoaW50Y29yZS0+Y19jbWRuYW1lKSk7Ci0gIGludGNvcmUtPmZwX3N0dWZmX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBGUCBzdHVmZiB0YWtlcyB1cCB3aG9sZSByZXN0IG9mIHN0cnVjdCwgZXhjZXB0IGNfdWNvZGUuICovCi0gIGludGNvcmUtPmZwX3N0dWZmX3NpemUgPSBpbnRjb3JlLT5jX2xlbiAtIChzaXplb2YgZXh0Y29yZS0+Y191Y29kZSkgLQotICAgIChmaWxlX3B0cikgKCgoc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogVWNvZGUgaXMgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIHN0cnVjdCAtLSBqdXN0IGJlZm9yZSB0aGUgZW5kICovCi0gIGludGNvcmUtPmNfdWNvZGUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwKLSAgICBpbnRjb3JlLT5jX2xlbiAtIHNpemVvZiAoZXh0Y29yZS0+Y191Y29kZSkgKyAodW5zaWduZWQgY2hhciAqKSBleHRjb3JlKTsKLQotICAvKiBTdXBwb3NlZGx5IHRoZSB1c2VyIHN0YWNrIGdyb3dzIGRvd253YXJkIGZyb20gdGhlIGJvdHRvbSBvZiBrZXJuZWwgbWVtb3J5LgotICAgICBQcmVzdW1pbmcgdGhhdCB0aGlzIHJlbWFpbnMgdHJ1ZSwgdGhpcyBkZWZpbml0aW9uIHdpbGwgd29yay4gICovCi0gIC8qIE5vdyBzdW4gaGFzIHByb3ZpZGVkIHVzIHdpdGggYW5vdGhlciBjaGFsbGVuZ2UuICBUaGUgdmFsdWUgaXMgZGlmZmVyZW50Ci0gICAgIGZvciBzcGFyYzIgYW5kIHNwYXJjMTAgKGJvdGggcnVubmluZyBTdW5PUyA0LjEuMykuICBXZSBwaWNrIG9uZSBvcgotICAgICB0aGUgb3RoZXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIuICBUaGlzCi0gICAgIGxvc2VzIChhKSBpZiB0aGUgc3RhY2sgcG9pbnRlciBoYXMgYmVlbiBjbG9iYmVyZWQsIG9yIChiKSBpZiB0aGUgc3RhY2sKLSAgICAgaXMgbGFyZ2VyIHRoYW4gMTI4IG1lZ2FieXRlcy4KLQotICAgICBJdCdzIHRpbWVzIGxpa2UgdGhlc2UgeW91J3JlIGdsYWQgdGhleSdyZSBzd2l0Y2hpbmcgdG8gRUxGLgotCi0gICAgIE5vdGUgdGhhdCB1c2luZyBpbmNsdWRlIGZpbGVzIG9yIG5saXN0IG9uIC92bXVuaXggd291bGQgYmUgd3JvbmcsCi0gICAgIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgZm9yIHRoaXMgY29yZSBmaWxlLCBubyBtYXR0ZXIgd2hhdCBraW5kIG9mCi0gICAgIG1hY2hpbmUgd2Ugd2VyZSBjb21waWxlZCBvbiBvciBhcmUgcnVubmluZyBvbi4gICovCi0jZGVmaW5lIFNQQVJDX1VTUlNUQUNLX1NQQVJDMiAoKGJmZF92bWEpMHhmODAwMDAwMCkKLSNkZWZpbmUgU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMCAoKGJmZF92bWEpMHhmMDAwMDAwMCkKLSAgewotICAgIGJmZF92bWEgc3AgPSBiZmRfaF9nZXRfMzIKLSAgICAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJigoc3RydWN0IHJlZ3MgKikgJmV4dGNvcmUtPmNfcmVnc1swXSktPnJfbzYpOwotICAgIGlmIChzcCA8IFNQQVJDX1VTUlNUQUNLX1NQQVJDMTApCi0gICAgICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMDsKLSAgICBlbHNlCi0gICAgICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gU1BBUkNfVVNSU1RBQ0tfU1BBUkMyOwotICB9Ci19Ci0KLS8qIGJ5dGUtc3dhcCBpbiB0aGUgU29sYXJpcyBCQ1AgY29yZSBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1zd2FwY29yZV9zb2xhcmlzX2JjcCAoYWJmZCwgZXh0LCBpbnRjb3JlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmV4dDsKLSAgICAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmludGNvcmU7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICpleHRjb3JlID0KLSAgICAoc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKikgZXh0OwotCi0gIGludGNvcmUtPmNfbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX21hZ2ljKTsKLSAgaW50Y29yZS0+Y19sZW4gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2xlbik7Ci0gIGludGNvcmUtPmNfcmVnc19wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKikgMCktPmNfcmVncyk7Ci0gIGludGNvcmUtPmNfcmVnc19zaXplID0gc2l6ZW9mIChleHRjb3JlLT5jX3JlZ3MpOwotCi0gIC8qIFRoZSBTb2xhcmlzIEJDUCBleGRhdGEgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW4gYV9zeW1zIGZpZWxkLAotICAgICBzbyB3ZSBhcmUgdW5hYmxlIHRvIHN5bnRoZXNpemUgYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIuCi0gICAgIEx1Y2tpbHkgd2UgYXJlIGFibGUgdG8gZmlndXJlIG91dCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWN0aW9uLAotICAgICB3aGljaCBpcyB0aGUgb25seSB0aGluZyBuZWVkZWQgZnJvbSB0aGUgaW50ZXJuYWwgZXhlYyBoZWFkZXIsCi0gICAgIGZyb20gdGhlIGV4ZGF0YSBzdHJ1Y3R1cmUuCi0KLSAgICAgQXMgb2YgU29sYXJpcyAyLjMsIEJDUCBjb3JlIGZpbGVzIGZvciBzdGF0aWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcwotICAgICBhcmUgYnVnZ3kuIFRoZSBleGRhdGEgc3RydWN0dXJlIGlzIG5vdCBwcm9wZXJseSBmaWxsZWQgaW4sIGFuZAotICAgICB0aGUgZGF0YSBzZWN0aW9uIGlzIHdyaXR0ZW4gZnJvbSBhZGRyZXNzIHplcm8gaW5zdGVhZCBvZiB0aGUgZGF0YQotICAgICBzdGFydCBhZGRyZXNzLiAgKi8KLSAgbWVtc2V0ICgoUFRSKSAmaW50Y29yZS0+Y19hb3V0aGRyLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7Ci0gIGludGNvcmUtPmNfZGF0YV9hZGRyID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2V4ZGF0YV9kYXRvcmcpOwotICBpbnRjb3JlLT5jX3NpZ25vID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zaWdubyk7Ci0gIGludGNvcmUtPmNfdHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3RzaXplKTsKLSAgaW50Y29yZS0+Y19kc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfZHNpemUpOwotICBpbnRjb3JlLT5jX3NzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zc2l6ZSk7Ci0gIG1lbWNweSAoaW50Y29yZS0+Y19jbWRuYW1lLCBleHRjb3JlLT5jX2NtZG5hbWUsIHNpemVvZiAoaW50Y29yZS0+Y19jbWRuYW1lKSk7Ci0gIGludGNvcmUtPmZwX3N0dWZmX3BvcyA9Ci0gICAgKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICopIDApLT5mcF9zdHVmZik7Ci0gIC8qIEZQIHN0dWZmIHRha2VzIHVwIHdob2xlIHJlc3Qgb2Ygc3RydWN0LCBleGNlcHQgY191Y29kZS4gKi8KLSAgaW50Y29yZS0+ZnBfc3R1ZmZfc2l6ZSA9IGludGNvcmUtPmNfbGVuIC0gKHNpemVvZiBleHRjb3JlLT5jX3Vjb2RlKSAtCi0gICAgKGZpbGVfcHRyKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBVY29kZSBpcyB0aGUgbGFzdCB0aGluZyBpbiB0aGUgc3RydWN0IC0tIGp1c3QgYmVmb3JlIHRoZSBlbmQgKi8KLSAgaW50Y29yZS0+Y191Y29kZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLAotICAgIGludGNvcmUtPmNfbGVuIC0gc2l6ZW9mIChleHRjb3JlLT5jX3Vjb2RlKSArICh1bnNpZ25lZCBjaGFyICopIGV4dGNvcmUpOwotCi0gIC8qIFN1cHBvc2VkbHkgdGhlIHVzZXIgc3RhY2sgZ3Jvd3MgZG93bndhcmQgZnJvbSB0aGUgYm90dG9tIG9mIGtlcm5lbCBtZW1vcnkuCi0gICAgIFByZXN1bWluZyB0aGF0IHRoaXMgcmVtYWlucyB0cnVlLCB0aGlzIGRlZmluaXRpb24gd2lsbCB3b3JrLiAgKi8KLSAgLyogTm93IHN1biBoYXMgcHJvdmlkZWQgdXMgd2l0aCBhbm90aGVyIGNoYWxsZW5nZS4gIFRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQKLSAgICAgZm9yIHNwYXJjMiBhbmQgc3BhcmMxMCAoYm90aCBydW5uaW5nIFN1bk9TIDQuMS4zKS4gIFdlIHBpY2sgb25lIG9yCi0gICAgIHRoZSBvdGhlciBiYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RhY2sgcG9pbnRlci4gIFRoaXMKLSAgICAgbG9zZXMgKGEpIGlmIHRoZSBzdGFjayBwb2ludGVyIGhhcyBiZWVuIGNsb2JiZXJlZCwgb3IgKGIpIGlmIHRoZSBzdGFjawotICAgICBpcyBsYXJnZXIgdGhhbiAxMjggbWVnYWJ5dGVzLgotCi0gICAgIEl0J3MgdGltZXMgbGlrZSB0aGVzZSB5b3UncmUgZ2xhZCB0aGV5J3JlIHN3aXRjaGluZyB0byBFTEYuCi0KLSAgICAgTm90ZSB0aGF0IHVzaW5nIGluY2x1ZGUgZmlsZXMgb3Igbmxpc3Qgb24gL3ZtdW5peCB3b3VsZCBiZSB3cm9uZywKLSAgICAgYmVjYXVzZSB3ZSB3YW50IHRoZSB2YWx1ZSBmb3IgdGhpcyBjb3JlIGZpbGUsIG5vIG1hdHRlciB3aGF0IGtpbmQgb2YKLSAgICAgbWFjaGluZSB3ZSB3ZXJlIGNvbXBpbGVkIG9uIG9yIGFyZSBydW5uaW5nIG9uLiAgKi8KLSNkZWZpbmUgU1BBUkNfVVNSU1RBQ0tfU1BBUkMyICgoYmZkX3ZtYSkweGY4MDAwMDAwKQotI2RlZmluZSBTUEFSQ19VU1JTVEFDS19TUEFSQzEwICgoYmZkX3ZtYSkweGYwMDAwMDAwKQotICB7Ci0gICAgYmZkX3ZtYSBzcCA9IGJmZF9oX2dldF8zMgotICAgIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmKChzdHJ1Y3QgcmVncyAqKSAmZXh0Y29yZS0+Y19yZWdzWzBdKS0+cl9vNik7Ci0gICAgaWYgKHNwIDwgU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMCkKLSAgICAgIGludGNvcmUtPmNfc3RhY2t0b3AgPSBTUEFSQ19VU1JTVEFDS19TUEFSQzEwOwotICAgIGVsc2UKLSAgICAgIGludGNvcmUtPmNfc3RhY2t0b3AgPSBTUEFSQ19VU1JTVEFDS19TUEFSQzI7Ci0gIH0KLX0KLQotLyogbmVlZCB0aGlzIGNhc3QgYmVjYXVzZSBwdHIgaXMgcmVhbGx5IHZvaWQgKiAqLwotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuc3VuX2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPmRhdGFfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5zdGFja19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5yZWdfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWcyc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPnJlZzJfc2VjdGlvbikKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLXN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QKLXsKLSAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmhkcjsJLyogY29yZSBmaWxlIGhlYWRlciAqLwotICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKLSAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOwotICBhc2VjdGlvbiAqcmVnMl9zZWN0aW9uOwotfTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc3Vub3M0X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgbG9uZ2J1Zls0XTsJLyogUmF3IGJ5dGVzIG9mIHZhcmlvdXMgaGVhZGVyIGZpZWxkcyAqLwotICBiZmRfc2l6ZV90eXBlIGNvcmVfc2l6ZTsKLSAgdW5zaWduZWQgbG9uZyBjb3JlX21hZzsKLSAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmNvcmU7Ci0gIGNoYXIgKmV4dGNvcmU7Ci0gIHN0cnVjdCBtZXJnZW0KLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3VuX2NvcmVfc3RydWN0IHN1bmNvcmVkYXRhOwotICAgICAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgaW50ZXJuYWxfc3Vub3NfY29yZTsKLSAgICAgIGNoYXIgZXh0ZXJuYWxfY29yZVsxXTsKLSAgICB9Ci0gICAqbWVyZ2VtOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgbG9uZ2J1ZiwgMSwgc2l6ZW9mIChsb25nYnVmKSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobG9uZ2J1ZikpCi0gICAgcmV0dXJuIDA7Ci0gIGNvcmVfbWFnID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBsb25nYnVmKTsKLQotICBpZiAoY29yZV9tYWcgIT0gQ09SRV9NQUdJQykKLSAgICByZXR1cm4gMDsKLQotICAvKiBTdW5PUyBjb3JlIGhlYWRlcnMgY2FuIHZhcnkgaW4gbGVuZ3RoOyBzZWNvbmQgd29yZCBpcyBzaXplOyAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpIGxvbmdidWYsIDEsIHNpemVvZiAobG9uZ2J1ZiksIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKGxvbmdidWYpKQotICAgIHJldHVybiAwOwotICBjb3JlX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGxvbmdidWYpOwotICAvKiBTYW5pdHkgY2hlY2sgKi8KLSAgaWYgKGNvcmVfc2l6ZSA+IDIwMDAwKQotICAgIHJldHVybiAwOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiAwOwotCi0gIG1lcmdlbSA9IChzdHJ1Y3QgbWVyZ2VtICopIGJmZF96YWxsb2MgKGFiZmQsIGNvcmVfc2l6ZSArIHNpemVvZiAoc3RydWN0IG1lcmdlbSkpOwotICBpZiAobWVyZ2VtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgZXh0Y29yZSA9IG1lcmdlbS0+ZXh0ZXJuYWxfY29yZTsKLQotICBpZiAoKGJmZF9yZWFkICgoUFRSKSBleHRjb3JlLCAxLCBjb3JlX3NpemUsIGFiZmQpKSAhPSBjb3JlX3NpemUpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopIG1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogVmFsaWRhdGUgdGhhdCBpdCdzIGEgY29yZSBmaWxlIHdlIGtub3cgaG93IHRvIGhhbmRsZSwgZHVlIHRvIHN1bgotICAgICBib3RjaGluZyB0aGUgcG9zaXRpb25pbmcgb2YgcmVnaXN0ZXJzIGFuZCBvdGhlciBmaWVsZHMgaW4gYSBtYWNoaW5lCi0gICAgIGRlcGVuZGVudCB3YXkuICAqLwotICBjb3JlID0gJm1lcmdlbS0+aW50ZXJuYWxfc3Vub3NfY29yZTsKLSAgc3dpdGNoIChjb3JlX3NpemUpCi0gICAgewotICAgIGNhc2UgU1BBUkNfQ09SRV9MRU46Ci0gICAgICBzd2FwY29yZV9zcGFyYyAoYWJmZCwgZXh0Y29yZSwgY29yZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVTjNfQ09SRV9MRU46Ci0gICAgICBzd2FwY29yZV9zdW4zIChhYmZkLCBleHRjb3JlLCBjb3JlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU09MQVJJU19CQ1BfQ09SRV9MRU46Ci0gICAgICBzd2FwY29yZV9zb2xhcmlzX2JjcCAoYWJmZCwgZXh0Y29yZSwgY29yZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsJLyogRklYTUUgKi8KLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKSBtZXJnZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFiZmQtPnRkYXRhLnN1bl9jb3JlX2RhdGEgPSAmbWVyZ2VtLT5zdW5jb3JlZGF0YTsKLSAgYWJmZC0+dGRhdGEuc3VuX2NvcmVfZGF0YS0+aGRyID0gY29yZTsKLQotICAvKiBjcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIHJlY2xhaW0KLSAgICAgdGhlbSAqLwotICBjb3JlX3N0YWNrc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3N0YWNrc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjoKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKSBtZXJnZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBjb3JlX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfZGF0YXNlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgbG9zZXIxOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfc3RhY2tzZWMgKGFiZmQpKTsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgIGxvc2VyMjoKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX2RhdGFzZWMgKGFiZmQpKTsKLSAgICAgIGdvdG8gbG9zZXIxOwotICAgIH0KLSAgY29yZV9yZWcyc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZzJzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfcmVnc2VjIChhYmZkKSk7Ci0gICAgICBnb3RvIGxvc2VyMjsKLSAgICB9Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5hbWUgPSAiLnN0YWNrIjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmFtZSA9ICIuZGF0YSI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnMiI7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+X3Jhd19zaXplID0gY29yZS0+Y19zc2l6ZTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gY29yZS0+Y19kc2l6ZTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBjb3JlLT5jX3JlZ3Nfc2l6ZTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+X3Jhd19zaXplID0gY29yZS0+ZnBfc3R1ZmZfc2l6ZTsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gKGNvcmUtPmNfc3RhY2t0b3AgLSBjb3JlLT5jX3NzaXplKTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gY29yZS0+Y19kYXRhX2FkZHI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMDsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+dm1hID0gMDsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmlsZXBvcyA9IGNvcmUtPmNfbGVuICsgY29yZS0+Y19kc2l6ZTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IGNvcmUtPmNfbGVuOwotICAvKiBXZSdsbCBhY2Nlc3MgdGhlIHJlZ3MgYWZyZXNoIGluIHRoZSBjb3JlIGZpbGUsIGxpa2UgYW55IHNlY3Rpb246ICovCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChmaWxlX3B0cikgY29yZS0+Y19yZWdzX3BvczsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChmaWxlX3B0cikgY29yZS0+ZnBfc3R1ZmZfcG9zOwotCi0gIC8qIEFsaWduIHRvIHdvcmQgYXQgbGVhc3QgKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfc3RhY2tzZWMgKGFiZmQpOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfZGF0YXNlYyAoYWJmZCk7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnMnNlYyAoYWJmZCk7Ci0KLSAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDQ7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2hkciAoYWJmZCktPmhkci0+Y19jbWRuYW1lOwotfQotCi1zdGF0aWMgaW50Ci1zdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2hkciAoYWJmZCktPmhkci0+Y19zaWdubzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZDsKLSAgICAgYmZkICpleGVjX2JmZDsKLXsKLSAgaWYgKGNvcmVfYmZkLT54dmVjICE9IGV4ZWNfYmZkLT54dmVjKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFNvbGFyaXMgY29yZSBmaWxlcyBkbyBub3QgaW5jbHVkZSBhbiBhb3V0aGRyLiAqLwotICBpZiAoKGNvcmVfaGRyIChjb3JlX2JmZCktPmhkciktPmNfbGVuID09IFNPTEFSSVNfQkNQX0NPUkVfTEVOKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiAobWVtY21wICgoY2hhciAqKSAmKChjb3JlX2hkciAoY29yZV9iZmQpLT5oZHIpLT5jX2FvdXRoZHIpLAotCQkgIChjaGFyICopIGV4ZWNfaGRyIChleGVjX2JmZCksCi0JCSAgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpID09IDApID8gdHJ1ZSA6IGZhbHNlOwotfQotCi0jZGVmaW5lIE1ZX3NldF9zaXplcyBzdW5vczRfc2V0X3NpemVzCi1zdGF0aWMgYm9vbGVhbgotc3Vub3M0X3NldF9zaXplcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLS8qIFdlIGRlZmF1bHQgdG8gc2V0dGluZyB0aGUgdG9vbHZlcnNpb24gZmllbGQgdG8gMSwgYXMgaXMgcmVxdWlyZWQgYnkKLSAgIFN1bk9TLiAgKi8KLSNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzCi0jZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKLSNlbmRpZgotI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAotI2VuZGlmCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgc3Vub3M0X2FvdXRfYmFja2VuZCA9Ci17Ci0gIDAsCQkJCS8qIHptYWdpYyBmaWxlcyBhcmUgbm90IGNvbnRpZ3VvdXMgKi8KLSAgMSwJCQkJLyogdGV4dCBpbmNsdWRlcyBoZWFkZXIgKi8KLSAgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzLAotICBNWV9leGVjX2hkcl9mbGFncywKLSAgMCwJCQkJLyogZGVmYXVsdCB0ZXh0IHZtYSAqLwotICBzdW5vczRfc2V0X3NpemVzLAotICAwLAkJCQkvKiBoZWFkZXIgaXMgY291bnRlZCBpbiB6bWFnaWMgdGV4dCAqLwotICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAotICBNWV9hZGRfb25lX3N5bWJvbCwKLSAgTVlfbGlua19keW5hbWljX29iamVjdCwKLSAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCi0gIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCi0gIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLX07Ci0MCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgCXN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAlzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBzdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQlcCi0JCQkodm9pZCAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfcAkJCXN1bm9zNF9jb3JlX2ZpbGVfcAotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMJTkFNRShhb3V0LHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpCi0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YQkJCSZzdW5vczRfYW91dF9iYWNrZW5kCi0KLSNpZm5kZWYgVEFSR0VUX0lTX0xJVFRMRV9FTkRJQU5fUAotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZW5kaWYKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dHguaCBiL2JmZC9hb3V0eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTEwN2E3Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcxNyArMCwwIEBACi0vKiBCRkQgc2VtaS1nZW5lcmljIGJhY2stZW5kIGZvciBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCWEub3V0IGJhY2tlbmRzCi0KLQotREVTQ1JJUFRJT04KLQotCUJGRCBzdXBwb3J0cyBhIG51bWJlciBvZiBkaWZmZXJlbnQgZmxhdm91cnMgb2YgYS5vdXQgZm9ybWF0LAotCXRob3VnaCB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYXJlIG9ubHkgdGhlIHNpemVzIG9mIHRoZQotCXN0cnVjdHVyZXMgb24gZGlzaywgYW5kIHRoZSBzaGFwZSBvZiB0aGUgcmVsb2NhdGlvbgotCWluZm9ybWF0aW9uLgotCi0JVGhlIHN1cHBvcnQgaXMgc3BsaXQgaW50byBhIGJhc2ljIHN1cHBvcnQgZmlsZSBAZmlsZXthb3V0eC5ofQotCWFuZCBvdGhlciBmaWxlcyB3aGljaCBkZXJpdmUgZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UuIE9uZQotCWRlcml2YXRpb24gZmlsZSBpcyBAZmlsZXthb3V0ZjEuaH0gKGZvciBhLm91dCBmbGF2b3VyIDEpLCBhbmQKLQlhZGRzIHRvIHRoZSBiYXNpYyBhLm91dCBmdW5jdGlvbnMgc3VwcG9ydCBmb3Igc3VuMywgc3VuNCwgMzg2Ci0JYW5kIDI5ayBhLm91dCBmaWxlcywgdG8gY3JlYXRlIGEgdGFyZ2V0IGp1bXAgdmVjdG9yIGZvciBhCi0Jc3BlY2lmaWMgdGFyZ2V0LgotCi0JVGhpcyBpbmZvcm1hdGlvbiBpcyBmdXJ0aGVyIHNwbGl0IG91dCBpbnRvIG1vcmUgc3BlY2lmaWMgZmlsZXMKLQlmb3IgZWFjaCBtYWNoaW5lLCBpbmNsdWRpbmcgQGZpbGV7c3Vub3MuY30gZm9yIHN1bjMgYW5kIHN1bjQsCi0JQGZpbGV7bmV3c29zMy5jfSBmb3IgdGhlIFNvbnkgTkVXUywgYW5kIEBmaWxle2RlbW82NC5jfSBmb3IgYQotCWRlbW9uc3RyYXRpb24gb2YgYSA2NCBiaXQgYS5vdXQgZm9ybWF0LgotCi0JVGhlIGJhc2UgZmlsZSBAZmlsZXthb3V0eC5ofSBkZWZpbmVzIGdlbmVyYWwgbWVjaGFuaXNtcyBmb3IKLQlyZWFkaW5nIGFuZCB3cml0aW5nIHJlY29yZHMgdG8gYW5kIGZyb20gZGlzayBhbmQgdmFyaW91cwotCW90aGVyIG1ldGhvZHMgd2hpY2ggQkZEIHJlcXVpcmVzLiBJdCBpcyBpbmNsdWRlZCBieQotCUBmaWxle2FvdXQzMi5jfSBhbmQgQGZpbGV7YW91dDY0LmN9IHRvIGZvcm0gdGhlIG5hbWVzCi0JPDxhb3V0XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4+PiwgPDxhb3V0XzY0X3N3YXBfZXhlY19oZWFkZXJfaW4+PiwgZXRjLgotCi0JQXMgYW4gZXhhbXBsZSwgdGhpcyBpcyB3aGF0IGdvZXMgb24gdG8gbWFrZSB0aGUgYmFjayBlbmQgZm9yIGEKLQlzdW40LCBmcm9tIEBmaWxle2FvdXQzMi5jfToKLQotfAkjZGVmaW5lIEFSQ0hfU0laRSAzMgotfAkjaW5jbHVkZSAiYW91dHguaCIKLQotCVdoaWNoIGV4cG9ydHMgbmFtZXM6Ci0KLXwJLi4uCi18CWFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jCi18CWFvdXRfMzJfZmluZF9uZWFyZXN0X2xpbmUKLXwJYW91dF8zMl9nZXRfbGluZW5vCi18CWFvdXRfMzJfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi18CS4uLgotCi0JZnJvbSBAZmlsZXtzdW5vcy5jfToKLQotfAkjZGVmaW5lIFRBUkdFVF9OQU1FICJhLm91dC1zdW5vcy1iaWciCi18CSNkZWZpbmUgVkVDTkFNRSAgICBzdW5vc19iaWdfdmVjCi18CSNpbmNsdWRlICJhb3V0ZjEuaCIKLQotCXJlcXVpcmVzIGFsbCB0aGUgbmFtZXMgZnJvbSBAZmlsZXthb3V0MzIuY30sIGFuZCBwcm9kdWNlcyB0aGUganVtcCB2ZWN0b3IKLQotfAlzdW5vc19iaWdfdmVjCi0KLQlUaGUgZmlsZSBAZmlsZXtob3N0LWFvdXQuY30gaXMgYSBzcGVjaWFsIGNhc2UuICBJdCBpcyBmb3IgYSBsYXJnZSBzZXQKLQlvZiBob3N0cyB0aGF0IHVzZSBgYG1vcmUgb3IgbGVzcyBzdGFuZGFyZCcnIGEub3V0IGZpbGVzLCBhbmQKLQlmb3Igd2hpY2ggY3Jvc3MtZGVidWdnaW5nIGlzIG5vdCBpbnRlcmVzdGluZy4gIEl0IHVzZXMgdGhlCi0Jc3RhbmRhcmQgMzItYml0IGEub3V0IHN1cHBvcnQgcm91dGluZXMsIGJ1dCBkZXRlcm1pbmVzIHRoZQotCWZpbGUgb2Zmc2V0cyBhbmQgYWRkcmVzc2VzIG9mIHRoZSB0ZXh0LCBkYXRhLCBhbmQgQlNTCi0Jc2VjdGlvbnMsIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlLCBhbmQgdGhlCi0JZW50cnkgcG9pbnQgYWRkcmVzcywgaW4gYSBob3N0LWRlcGVuZGVudCBtYW5uZXIuICBPbmNlIHRoZXNlCi0JdmFsdWVzIGhhdmUgYmVlbiBkZXRlcm1pbmVkLCBnZW5lcmljIGNvZGUgaXMgdXNlZCB0byBoYW5kbGUKLQl0aGUgIG9iamVjdCBmaWxlLgotCi0JV2hlbiBwb3J0aW5nIGl0IHRvIHJ1biBvbiBhIG5ldyBzeXN0ZW0sIHlvdSBtdXN0IHN1cHBseToKLQotfCAgICAgICAgSE9TVF9QQUdFX1NJWkUKLXwgICAgICAgIEhPU1RfU0VHTUVOVF9TSVpFCi18ICAgICAgICBIT1NUX01BQ0hJTkVfQVJDSCAgICAgICAob3B0aW9uYWwpCi18ICAgICAgICBIT1NUX01BQ0hJTkVfTUFDSElORSAgICAob3B0aW9uYWwpCi18ICAgICAgICBIT1NUX1RFWFRfU1RBUlRfQUREUgotfCAgICAgICAgSE9TVF9TVEFDS19FTkRfQUREUgotCi0JaW4gdGhlIGZpbGUgQGZpbGV7Li4vaW5jbHVkZS9zeXMvaC1AdmFye1hYWH0uaH0gKGZvciB5b3VyIGhvc3QpLiAgVGhlc2UKLQl2YWx1ZXMsIHBsdXMgdGhlIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyBkZWZpbmVkIGluIEBmaWxle2Eub3V0Lmh9IG9uCi0JeW91ciBob3N0IHN5c3RlbSwgd2lsbCBwcm9kdWNlIGEgQkZEIHRhcmdldCB0aGF0IHdpbGwgYWNjZXNzCi0Jb3JkaW5hcnkgYS5vdXQgZmlsZXMgb24geW91ciBob3N0LiBUbyBjb25maWd1cmUgYSBuZXcgbWFjaGluZQotCXRvIHVzZSBAZmlsZXtob3N0LWFvdXQuY30sIHNwZWNpZnk6Ci0KLXwJVERFRkFVTFRTID0gLURERUZBVUxUX1ZFQ1RPUj1ob3N0X2FvdXRfYmlnX3ZlYwotfAlUREVQRklMRVM9IGhvc3QtYW91dC5vIHRyYWQtY29yZS5vCi0KLQlpbiB0aGUgQGZpbGV7Y29uZmlnL0B2YXJ7WFhYfS5tdH0gZmlsZSwgYW5kIG1vZGlmeSBAZmlsZXtjb25maWd1cmUuaW59Ci0JdG8gdXNlIHRoZQotCUBmaWxle0B2YXJ7WFhYfS5tdH0gZmlsZSAoYnkgc2V0dGluZyAiPDxiZmRfdGFyZ2V0PVhYWD4+Iikgd2hlbiB5b3VyCi0JY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZC4KLQotKi8KLQotLyogU29tZSBhc3N1bXB0aW9uczoKLSAgICogQW55IEJGRCB3aXRoIERfUEFHRUQgc2V0IGlzIFpNQUdJQywgYW5kIHZpY2UgdmVyc2EuCi0gICAgIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHNldHRpbmcgb2YgV1BfVEVYVCBpcyBvbiBvdXRwdXQsIGJ1dCBpdCdsbAotICAgICBnZXQgc2V0IG9uIGlucHV0LgotICAgKiBBbnkgQkZEIHdpdGggRF9QQUdFRCBjbGVhciBhbmQgV1BfVEVYVCBzZXQgaXMgTk1BR0lDLgotICAgKiBBbnkgQkZEIHdpdGggYm90aCBmbGFncyBjbGVhciBpcyBPTUFHSUMuCi0gICAoSnVzdCB3YW50IHRvIG1ha2UgdGhlc2UgZXhwbGljaXQsIHNvIHRoZSBjb25kaXRpb25zIHRlc3RlZCBpbiB0aGlzCi0gICBmaWxlIG1ha2Ugc2Vuc2UgaWYgeW91J3JlIG1vcmUgZmFtaWxpYXIgd2l0aCBhLm91dCB0aGFuIHdpdGggQkZELikgICovCi0KLSNkZWZpbmUgS0VFUElUIHVkYXRhLmkKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotc3RhdGljIGJvb2xlYW4gYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgYW91dF9zeW1ib2xfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X29fbWFnaWMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leGVjICopKTsKLXN0YXRpYyB2b2lkIGFkanVzdF96X21hZ2ljIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqKSk7Ci1zdGF0aWMgdm9pZCBhZGp1c3Rfbl9tYWdpYyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4ZWMgKikpOwotCi0vKgotU1VCU0VDVElPTgotCVJlbG9jYXRpb25zCi0KLURFU0NSSVBUSU9OCi0JVGhlIGZpbGUgQGZpbGV7YW91dHguaH0gcHJvdmlkZXMgZm9yIGJvdGggdGhlIEBlbXBoe3N0YW5kYXJkfQotCWFuZCBAZW1waHtleHRlbmRlZH0gZm9ybXMgb2YgYS5vdXQgcmVsb2NhdGlvbiByZWNvcmRzLgotCi0JVGhlIHN0YW5kYXJkIHJlY29yZHMgY29udGFpbiBvbmx5IGFuCi0JYWRkcmVzcywgYSBzeW1ib2wgaW5kZXgsIGFuZCBhIHR5cGUgZmllbGQuIFRoZSBleHRlbmRlZCByZWNvcmRzCi0JKHVzZWQgb24gMjlrcyBhbmQgc3BhcmNzKSBhbHNvIGhhdmUgYSBmdWxsIGludGVnZXIgZm9yIGFuCi0JYWRkZW5kLgotCi0qLwotI2lmbmRlZiBDVE9SX1RBQkxFX1JFTE9DX0hPV1RPCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSURYIDIKLSNkZWZpbmUgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhCRkQpICgob2JqX3JlbG9jX2VudHJ5X3NpemUoQkZEKSA9PSBSRUxPQ19FWFRfU0laRSBcCi0JICAgICA/IGhvd3RvX3RhYmxlX2V4dCA6IGhvd3RvX3RhYmxlX3N0ZCkgXAotCSAgICArIENUT1JfVEFCTEVfUkVMT0NfSURYKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9zdGRfcmVsb2NfaW4KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0Ci0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19yZWxvY2F0ZQotI2RlZmluZSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfcmVsb2NhdGVfY29udGVudHMKLSNkZWZpbmUgTVlfcmVsb2NhdGVfY29udGVudHMgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotI2VuZGlmCi0KLSNkZWZpbmUgaG93dG9fdGFibGVfZXh0IE5BTUUoYW91dCxleHRfaG93dG9fdGFibGUpCi0jZGVmaW5lIGhvd3RvX3RhYmxlX3N0ZCBOQU1FKGFvdXQsc3RkX2hvd3RvX3RhYmxlKQotCi1yZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlX2V4dFtdID0KLXsKLSAgLyogdHlwZSAgICAgICAgICAgcnMgICBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICAgICAgIHBhcnRfaW5wbCByZWFkbWFzayBzZXRtYXNrIHBjZG9uZSAqLwotICBIT1dUTyhSRUxPQ184LCAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiOCIsICAgICAgICBmYWxzZSwgMCwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzE2LCAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjE2IiwgICAgICAgZmFsc2UsIDAsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18zMiwgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIzMiIsICAgICAgIGZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfRElTUDgsICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkRJU1A4IiwgCWZhbHNlLCAwLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfRElTUDE2LCAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkRJU1AxNiIsIAlmYWxzZSwgMCwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1AzMiwgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQMzIiLCAJZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19XRElTUDMwLDIsICAyLCAJMzAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiV0RJU1AzMCIsIAlmYWxzZSwgMCwweDNmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1dESVNQMjIsMiwgIDIsIAkyMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJXRElTUDIyIiwgCWZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfSEkyMiwgICAxMCwgMiwgCTIyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSEkyMiIsCWZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfMjIsICAgICAwLCAgMiwgCTIyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMjIiLCAgICAgICBmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzEzLCAgICAgMCwgIDIsIAkxMywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjEzIiwgICAgICAgZmFsc2UsIDAsMHgwMDAwMWZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19MTzEwLCAgIDAsICAyLCAJMTAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIkxPMTAiLCAgICAgZmFsc2UsIDAsMHgwMDAwMDNmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19TRkFfQkFTRSwwLCAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJTRkFfQkFTRSIsIGZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfU0ZBX09GRjEzLDAsMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0ZBX09GRjEzIixmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0JBU0UxMCwgMCwgIDIsIAkxMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsMCwiQkFTRTEwIiwgICBmYWxzZSwgMCwweDAwMDAwM2ZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0JBU0UxMywgMCwgIDIsCTEzLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkJBU0UxMyIsICAgZmFsc2UsIDAsMHgwMDAwMWZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMjIsIDEwLCAyLAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkJBU0UyMiIsICAgZmFsc2UsIDAsMHgwMDNmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19QQzEwLCAgIDAsICAyLAkxMCwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsMCwiUEMxMCIsCWZhbHNlLCAwLDB4MDAwMDAzZmYsIHRydWUpLAotICBIT1dUTyhSRUxPQ19QQzIyLCAgIDEwLCAgMiwJMjIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiUEMyMiIsIGZhbHNlLCAwLDB4MDAzZmZmZmYsIHRydWUpLAotICBIT1dUTyhSRUxPQ19KTVBfVEJMLDIsICAyLCAJMzAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiSk1QX1RCTCIsIAlmYWxzZSwgMCwweDNmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1NFR09GRjE2LDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0VHT0ZGMTYiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0dMT0JfREFULDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiR0xPQl9EQVQiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0pNUF9TTE9ULDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSk1QX1NMT1QiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1JFTEFUSVZFLDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUkVMQVRJVkUiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKDAsICAwLCAwLCAgICAwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKDAsICAwLCAwLCAgICAwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0jZGVmaW5lIFJFTE9DX1NQQVJDX1JFVjMyIFJFTE9DX1dESVNQMTkKLSAgSE9XVE8oUkVMT0NfU1BBUkNfUkVWMzIsICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIlJfU1BBUkNfUkVWMzIiLCAgICAgICBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0vKiBDb252ZXJ0IHN0YW5kYXJkIHJlbG9jIHJlY29yZHMgdG8gImFyZWxlbnQiIGZvcm1hdCAoaW5jbCBieXRlIHN3YXApLiAgKi8KLQotcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZV9zdGRbXSA9IHsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotSE9XVE8oIDAsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjgiLAkJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi1IT1dUTyggMSwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotSE9XVE8oIDIsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKCAzLAkgICAgICAgMCwgIDQsIAk2NCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjY0IiwJdHJ1ZSwgMHhkZWFkZGVhZCwweGRlYWRkZWFkLCBmYWxzZSksCi1IT1dUTyggNCwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotSE9XVE8oIDUsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi1IT1dUTyggNiwJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKCA3LAkgICAgICAgMCwgIDQsIAk2NCwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1A2NCIsCXRydWUsIDB4ZmVlZGZhY2UsMHhmZWVkZmFjZSwgZmFsc2UpLAotSE9XVE8oIDgsCSAgICAgICAwLCAgMiwgICAgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkdPVF9SRUwiLAlmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLUhPV1RPKCA5LAkgICAgICAgMCwgIDEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMTYiLAlmYWxzZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKDEwLAkgICAgICAgMCwgIDIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMzIiLAlmYWxzZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTygxNiwJICAgICAgIDAsICAyLAkgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkpNUF9UQUJMRSIsIGZhbHNlLCAgICAgICAgIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTygzMiwJICAgICAgIDAsICAyLAkgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJFTEFUSVZFIiwgIGZhbHNlLCAgICAgICAgIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8oNDAsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFUkVMIiwgICBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLX07Ci0KLSNkZWZpbmUgVEFCTEVfU0laRShUQUJMRSkJKHNpemVvZihUQUJMRSkvc2l6ZW9mKFRBQkxFWzBdKSkKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1OQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIChhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0jZGVmaW5lIEVYVChpLGopCWNhc2UgaTogcmV0dXJuICZob3d0b190YWJsZV9leHRbal0KLSNkZWZpbmUgU1REKGksaikJY2FzZSBpOiByZXR1cm4gJmhvd3RvX3RhYmxlX3N0ZFtqXQotICBpbnQgZXh0ID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID09IFJFTE9DX0VYVF9TSVpFOwotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0JY29kZSA9IEJGRF9SRUxPQ18zMjsKLQlicmVhazsKLSAgICAgIGNhc2UgNjQ6Ci0JY29kZSA9IEJGRF9SRUxPQ182NDsKLQlicmVhazsKLSAgICAgIH0KLSAgaWYgKGV4dCkKLSAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICB7Ci0JRVhUIChCRkRfUkVMT0NfMzIsIDIpOwotCUVYVCAoQkZEX1JFTE9DX0hJMjIsIDgpOwotCUVYVCAoQkZEX1JFTE9DX0xPMTAsIDExKTsKLQlFWFQgKEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgNik7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgNyk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkMxMywgMTApOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCAxNCk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLCAxNSk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfR09UMTMsIDE1KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgMTYpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1BDMTAsIDE3KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19QQzIyLCAxOCk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCAxOSk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfUkVWMzIsIDI2KTsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgICAgfQotICBlbHNlCi0gICAgLyogc3RkIHJlbG9jcyAqLwotICAgIHN3aXRjaCAoY29kZSkKLSAgICAgIHsKLQlTVEQgKEJGRF9SRUxPQ18xNiwgMSk7Ci0JU1REIChCRkRfUkVMT0NfMzIsIDIpOwotCVNURCAoQkZEX1JFTE9DXzhfUENSRUwsIDQpOwotCVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCA1KTsKLQlTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgNik7Ci0JU1REIChCRkRfUkVMT0NfMTZfQkFTRVJFTCwgOSk7Ci0JU1REIChCRkRfUkVMT0NfMzJfQkFTRVJFTCwgMTApOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgICB9Ci19Ci0KLS8qCi1TVUJTRUNUSU9OCi0JSW50ZXJuYWwgZW50cnkgcG9pbnRzCi0KLURFU0NSSVBUSU9OCi0JQGZpbGV7YW91dHguaH0gZXhwb3J0cyBzZXZlcmFsIHJvdXRpbmVzIGZvciBhY2Nlc3NpbmcgdGhlCi0JY29udGVudHMgb2YgYW4gYS5vdXQgZmlsZSwgd2hpY2ggYXJlIGdhdGhlcmVkIGFuZCBleHBvcnRlZCBpbgotCXR1cm4gYnkgdmFyaW91cyBmb3JtYXQgc3BlY2lmaWMgZmlsZXMgKGVnIHN1bm9zLmMpLgotCi0qLwotCi0vKgotRlVOQ1RJT04KLQkgYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfaW4KLQotU1lOT1BTSVMKLQl2b2lkIGFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX2luLAotICAgICAgICAgICAoYmZkICphYmZkLAotICAgICAgICAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywKLSAgICAgICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCk7Ci0KLURFU0NSSVBUSU9OCi0JU3dhcCB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgQHZhcntyYXdfYnl0ZXN9IHRha2VuCi0JZnJvbSBhIHJhdyBieXRlIHN0cmVhbSBtZW1vcnkgaW1hZ2UgaW50byB0aGUgaW50ZXJuYWwgZXhlYyBoZWFkZXIKLQlzdHJ1Y3R1cmUgQHZhcntleGVjcH0uCi0qLwotCi0jaWZuZGVmIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbgotdm9pZAotTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCByYXdfYnl0ZXMsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIFRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBoYXMgc29tZSBmaWVsZHMgdGhhdCBhcmUgdW51c2VkIGluIHRoaXMKLSAgICAgY29uZmlndXJhdGlvbiAoSUUgZm9yIGk5NjApLCBzbyBlbnN1cmUgdGhhdCBhbGwgc3VjaCB1bmluaXRpYWxpemVkCi0gICAgIGZpZWxkcyBhcmUgemVybydkIG91dC4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgdHdvIG9mIHRoZXNlIHN0cnVjdHMKLSAgICAgYXJlIG1lbWNtcCdkLCBhbmQgdGh1cyB0aGUgY29udGVudHMgZG8gbWF0dGVyLiAqLwotICBtZW1zZXQgKChQVFIpIGV4ZWNwLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7Ci0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfaW5mbyk7Ci0gIGV4ZWNwLT5hX3RleHQgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90ZXh0KTsKLSAgZXhlY3AtPmFfZGF0YSAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOwotICBleGVjcC0+YV9ic3MgICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKLSAgZXhlY3AtPmFfc3ltcyAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpOwotICBleGVjcC0+YV9lbnRyeSAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOwotICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci19Ci0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikKLSNlbmRpZgotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9vdXQKLQotU1lOT1BTSVMKLQl2b2lkIGFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX291dAotCSAgKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsCi0JICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcyk7Ci0KLURFU0NSSVBUSU9OCi0JU3dhcCB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlCi0JQHZhcntleGVjcH0gaW50byB0aGUgYnVmZmVyIEB2YXJ7cmF3X2J5dGVzfSByZWFkeSBmb3Igd3JpdGluZyB0byBkaXNrLgotKi8KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCByYXdfYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvICAsIGJ5dGVzLT5lX2luZm8pOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGV4dCAgLCBieXRlcy0+ZV90ZXh0KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2RhdGEgICwgYnl0ZXMtPmVfZGF0YSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9ic3MgICAsIGJ5dGVzLT5lX2Jzcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9zeW1zICAsIGJ5dGVzLT5lX3N5bXMpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZW50cnkgLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kcnNpemUsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci19Ci0KLS8qIE1ha2UgYWxsIHRoZSBzZWN0aW9uIGZvciBhbiBhLm91dCBmaWxlLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfdGV4dHNlYyAoYWJmZCkgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgICYmIGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIudGV4dCIpID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG9ial9kYXRhc2VjIChhYmZkKSA9PSAoYXNlY3Rpb24gKikgTlVMTAotICAgICAgJiYgYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIikgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAob2JqX2Jzc3NlYyAoYWJmZCkgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgICYmIGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuYnNzIikgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X3NvbWVfYW91dF9vYmplY3RfcAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF90YXJnZXQgKmFvdXRfQHZhcntzaXplfV9zb21lX2FvdXRfb2JqZWN0X3AKLQkgKGJmZCAqYWJmZCwKLQkgIGNvbnN0IGJmZF90YXJnZXQgKigqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkoKSk7Ci0KLURFU0NSSVBUSU9OCi0JU29tZSBhLm91dCB2YXJpYW50IHRoaW5rcyB0aGF0IHRoZSBmaWxlIG9wZW4gaW4gQHZhcnthYmZkfQotCWNoZWNraW5nIGlzIGFuIGEub3V0IGZpbGUuICBEbyBzb21lIG1vcmUgY2hlY2tpbmcsIGFuZCBzZXQgdXAKLQlmb3IgYWNjZXNzIGlmIGl0IHJlYWxseSBpcy4gIENhbGwgYmFjayB0byB0aGUgY2FsbGluZwotCWVudmlyb25tZW50J3MgImZpbmlzaCB1cCIgZnVuY3Rpb24ganVzdCBiZWZvcmUgcmV0dXJuaW5nLCB0bwotCWhhbmRsZSBhbnkgbGFzdC1taW51dGUgc2V0dXAuCi0qLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLU5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIChhYmZkLCBleGVjcCwgY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIGNvbnN0IGJmZF90YXJnZXQgKigqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLXsKLSAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0ciwgKm9sZHJhd3B0cjsKLSAgY29uc3QgYmZkX3RhcmdldCAqcmVzdWx0OwotCi0gIHJhd3B0ciA9IChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCApKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIG9sZHJhd3B0ciA9IGFiZmQtPnRkYXRhLmFvdXRfZGF0YTsKLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotCi0gIC8qIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvbGQgdGRhdGEgc3RydWN0LgotICAgICBJbiBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRoZSBzdWJmb3JtYXQsIHNpbmNlIGZvciBocHV4IGl0IHdhcyBzZXQgaW4KLSAgICAgaHAzMDBocHV4LmM6c3dhcF9leGVjX2hlYWRlcl9pbiBhbmQgd2lsbCBiZSB1c2VkIGluCi0gICAgIGhwMzAwaHB1eC5jOmNhbGxiYWNrLiAgKi8KLSAgaWYgKG9sZHJhd3B0ciAhPSBOVUxMKQotICAgICphYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSAqb2xkcmF3cHRyOwotCi0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIgPSAmcmF3cHRyLT5lOwotICAqKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIpID0gKmV4ZWNwOwkvKiBDb3B5IGluIHRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdCAqLwotICBleGVjcCA9IGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHI7Ci0KLSAgLyogU2V0IHRoZSBmaWxlIGZsYWdzICovCi0gIGFiZmQtPmZsYWdzID0gQkZEX05PX0ZMQUdTOwotICBpZiAoZXhlY3AtPmFfZHJzaXplIHx8IGV4ZWNwLT5hX3Ryc2l6ZSkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gIC8qIFNldHRpbmcgb2YgRVhFQ19QIGhhcyBiZWVuIGRlZmVycmVkIHRvIHRoZSBib3R0b20gb2YgdGhpcyBmdW5jdGlvbiAqLwotICBpZiAoZXhlY3AtPmFfc3ltcykKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOwotICBpZiAoTl9EWU5BTUlDKCpleGVjcCkpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQotICBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBaTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRCB8IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBRTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRCB8IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICAgICAgYWRhdGEgKGFiZmQpLnN1YmZvcm1hdCA9IHFfbWFnaWNfZm9ybWF0OwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBOTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG5fbWFnaWM7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE9NQUdJQwotCSAgIHx8IE5fTUFHSUMgKCpleGVjcCkgPT0gQk1BR0lDKQotICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG9fbWFnaWM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTaG91bGQgaGF2ZSBiZWVuIGNoZWNrZWQgd2l0aCBOX0JBRE1BRyBiZWZvcmUgdGhpcyByb3V0aW5lCi0JIHdhcyBjYWxsZWQuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBleGVjcC0+YV9lbnRyeTsKLQotICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IChhb3V0X3N5bWJvbF90eXBlICopTlVMTDsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotCi0gIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gZW50cnkgc2l6ZSBpcyB0aGF0IG9mIHRyYWRpdGlvbmFsIFY3IFVuaXguICAqLwotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICAvKiBUaGUgZGVmYXVsdCBzeW1ib2wgZW50cnkgc2l6ZSBpcyB0aGF0IG9mIHRyYWRpdGlvbmFsIFVuaXguICovCi0gIG9ial9zeW1ib2xfZW50cnlfc2l6ZSAoYWJmZCkgPSBFWFRFUk5BTF9OTElTVF9TSVpFOwotCi0jaWZkZWYgVVNFX01NQVAKLSAgYmZkX2luaXRfd2luZG93ICgmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCkpOwotICBiZmRfaW5pdF93aW5kb3cgKCZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSk7Ci0jZW5kaWYKLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOwotICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IE5VTEw7Ci0gIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpID0gTlVMTDsKLQotICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfZGF0YTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX2JzczsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZsYWdzID0KLSAgICAoZXhlY3AtPmFfdHJzaXplICE9IDAKLSAgICAgPyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVMT0MpCi0gICAgIDogKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPQotICAgIChleGVjcC0+YV9kcnNpemUgIT0gMAotICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKLSAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DOwotCi0jaWZkZWYgVEhJU19JU19PTkxZX0RPQ1VNRU5UQVRJT04KLSAgLyogVGhlIGNvbW1vbiBjb2RlIGNhbid0IGZpbGwgaW4gdGhlc2UgdGhpbmdzIGJlY2F1c2UgdGhleSBkZXBlbmQKLSAgICAgb24gZWl0aGVyIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSB0ZXh0IHNlZ21lbnQsIHRoZSByb3VuZGluZwotICAgICB1cCBvZiB2aXJ0dWFsIGFkZHJlc3NlcyBiZXR3ZWVuIHNlZ21lbnRzLCBvciB0aGUgc3RhcnRpbmcgZmlsZQotICAgICBwb3NpdGlvbiBvZiB0aGUgdGV4dCBzZWdtZW50IC0tIGFsbCBvZiB3aGljaCB2YXJpZXMgYW1vbmcgZGlmZmVyZW50Ci0gICAgIHZlcnNpb25zIG9mIGEub3V0LiAgKi8KLQotICAvKiBDYWxsIGJhY2sgdG8gdGhlIGZvcm1hdC1kZXBlbmRlbnQgY29kZSB0byBmaWxsIGluIHRoZSByZXN0IG9mIHRoZQotICAgICBmaWVsZHMgYW5kIGRvIGFueSBmdXJ0aGVyIGNsZWFudXAuICBUaGluZ3MgdGhhdCBzaG91bGQgYmUgZmlsbGVkCi0gICAgIGluIGJ5IHRoZSBjYWxsYmFjazogICovCi0KLSAgc3RydWN0IGV4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+c2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJhd19zaXplID0gTl9UWFRTSVpFKCpleGVjcCk7Ci0gIC8qIGRhdGEgYW5kIGJzcyBhcmUgYWxyZWFkeSBmaWxsZWQgaW4gc2luY2UgdGhleSdyZSBzbyBzdGFuZGFyZCAqLwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSKCpleGVjcCk7Ci0gIG9ial9ic3NzZWMgIChhYmZkKS0+dm1hID0gTl9CU1NBRERSKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9UWFRPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gTl9TVFJPRkYgKCpleGVjcCk7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHN3aXRjaCAoTl9NQUNIVFlQRSAoKmV4ZWNfaGRyIChhYmZkKSkpIHsKLSAgZGVmYXVsdDoKLSAgICBhYmZkLT5vYmpfYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBhZGF0YShhYmZkKS0+cGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSAgYWRhdGEoYWJmZCktPnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCktPmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotICAvKiBUaGUgYXJjaGl0ZWN0dXJlIGlzIGVuY29kZWQgaW4gdmFyaW91cyB3YXlzIGluIHZhcmlvdXMgYS5vdXQgdmFyaWFudHMsCi0gICAgIG9yIGlzIG5vdCBlbmNvZGVkIGF0IGFsbCBpbiBzb21lIG9mIHRoZW0uICBUaGUgcmVsb2NhdGlvbiBzaXplIGRlcGVuZHMKLSAgICAgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgdGhlIGEub3V0IHZhcmlhbnQuICBGaW5hbGx5LCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgIGlzIHRoZSBiZmRfdGFyZ2V0IHZlY3RvciBpbiB1c2UuICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiB6ZXJvIGFuZAotICAgICBzZXQgYmZkX2Vycm9yIHRvIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgotCi0gICAgIEZvcm1hdHMgc3VjaCBhcyBiLm91dCwgd2hpY2ggaGF2ZSBhZGRpdGlvbmFsIGZpZWxkcyBpbiB0aGUgYS5vdXQKLSAgICAgaGVhZGVyLCBzaG91bGQgY29wZSB3aXRoIHRoZW0gaW4gdGhpcyBjYWxsYmFjayBhcyB3ZWxsLiAgKi8KLSNlbmRpZgkJCQkvKiBET0NVTUVOVEFUSU9OICovCi0KLSAgcmVzdWx0ID0gKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKShhYmZkKTsKLQotICAvKiBOb3cgdGhhdCB0aGUgc2VnbWVudCBhZGRyZXNzZXMgaGF2ZSBiZWVuIHdvcmtlZCBvdXQsIHRha2UgYSBiZXR0ZXIKLSAgICAgZ3Vlc3MgYXQgd2hldGhlciB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLiAgSWYgdGhlIGVudHJ5IHBvaW50Ci0gICAgIGlzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhc3N1bWUgaXQgaXMuICAoVGhpcyBtYWtlcyBmaWxlcwotICAgICBleGVjdXRhYmxlIGV2ZW4gaWYgdGhlaXIgZW50cnkgcG9pbnQgYWRkcmVzcyBpcyAwLCBhcyBsb25nIGFzCi0gICAgIHRoZWlyIHRleHQgc3RhcnRzIGF0IHplcm8uKS4KLQotICAgICBUaGlzIHRlc3QgaGFkIHRvIGJlIGNoYW5nZWQgdG8gZGVhbCB3aXRoIHN5c3RlbXMgd2hlcmUgdGhlIHRleHQgc2VnbWVudAotICAgICBydW5zIGF0IGEgZGlmZmVyZW50IGxvY2F0aW9uIHRoYW4gdGhlIGRlZmF1bHQuICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZQotICAgICBlbnRyeSBhZGRyZXNzIGNhbiBhcHBlYXIgdG8gYmUgb3V0c2lkZSB0aGUgdGV4dCBzZWdtZW50LCB0aHVzIGNhdXNpbmcgYW4KLSAgICAgZXJyb25lb3VzIGNvbmNsdXNpb24gdGhhdCB0aGUgZmlsZSBpc24ndCBleGVjdXRhYmxlLgotCi0gICAgIFRvIGZpeCB0aGlzLCB3ZSBub3cgYWNjZXB0IGFueSBub24temVybyBlbnRyeSBwb2ludCBhcyBhbiBpbmRpY2F0aW9uIG9mCi0gICAgIGV4ZWN1dGFiaWxpdHkuICBUaGlzIHdpbGwgd29yayBtb3N0IG9mIHRoZSB0aW1lLCBzaW5jZSBvbmx5IHRoZSBsaW5rZXIKLSAgICAgc2V0cyB0aGUgZW50cnkgcG9pbnQsIGFuZCB0aGF0IGlzIGxpa2VseSB0byBiZSBub24temVybyBmb3IgbW9zdCBzeXN0ZW1zLiAqLwotCi0gIGlmIChleGVjcC0+YV9lbnRyeSAhPSAwCi0gICAgICB8fCAoZXhlY3AtPmFfZW50cnkgPj0gb2JqX3RleHRzZWMoYWJmZCktPnZtYQotCSAgJiYgZXhlY3AtPmFfZW50cnkgPCBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hICsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSkpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotI2lmZGVmIFNUQVRfRk9SX0VYRUMKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBzdGF0IHN0YXRfYnVmOwotCi0gICAgICAvKiBUaGUgb3JpZ2luYWwgaGV1cmlzdGljIGRvZXNuJ3Qgd29yayBpbiBzb21lIGltcG9ydGFudCBjYXNlcy4KLSAgICAgICAgVGhlIGEub3V0IGZpbGUgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXh0IHN0YXJ0Ci0gICAgICAgIGFkZHJlc3MuICBGb3IgZmlsZXMgKGxpa2Uga2VybmVscykgbGlua2VkIHRvIG5vbi1zdGFuZGFyZAotICAgICAgICBhZGRyZXNzZXMgKGxkIC1UdGV4dCBubm4pIHRoZSBlbnRyeSBwb2ludCBtYXkgbm90IGJlIGJldHdlZW4KLSAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBzdGFydCAob2JqX3RleHRzZWMoYWJmZCktPnZtYSkgYW5kCi0gICAgICAgIChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSArIHRleHQgc2l6ZS4gIFRoaXMgaXMgbm90IGp1c3QgYSBtYWNoCi0gICAgICAgIGlzc3VlLiAgTWFueSBrZXJuZWxzIGFyZSBsb2FkZWQgYXQgbm9uIHN0YW5kYXJkIGFkZHJlc3Nlcy4gICovCi0gICAgICBpZiAoYWJmZC0+aW9zdHJlYW0gIT0gTlVMTAotCSAgJiYgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgPT0gMAotCSAgJiYgKGZzdGF0KGZpbGVubygoRklMRSAqKSAoYWJmZC0+aW9zdHJlYW0pKSwgJnN0YXRfYnVmKSA9PSAwKQotCSAgJiYgKChzdGF0X2J1Zi5zdF9tb2RlICYgMDExMSkgIT0gMCkpCi0JYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLSNlbmRpZiAvKiBTVEFUX0ZPUl9FWEVDICovCi0KLSAgaWYgKHJlc3VsdCkKLSAgICB7Ci0jaWYgMCAvKiBUaGVzZSBzaG91bGQgYmUgc2V0IGNvcnJlY3RseSBhbnl3YXlzLiAgKi8KLSAgICAgIGFiZmQtPnNlY3Rpb25zID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5uZXh0ID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcmVlIChyYXdwdHIpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gb2xkcmF3cHRyOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X21rb2JqZWN0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBhb3V0X0B2YXJ7c2l6ZX1fbWtvYmplY3QsIChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCUluaXRpYWxpemUgQkZEIEB2YXJ7YWJmZH0gZm9yIHVzZSB3aXRoIGEub3V0IGZpbGVzLgotKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LG1rb2JqZWN0KSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAgKnJhd3B0cjsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCi0gIC8qIFVzZSBhbiBpbnRlcm1lZGlhdGUgdmFyaWFibGUgZm9yIGNsYXJpdHkgKi8KLSAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCApKTsKLQotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJihyYXdwdHItPmUpOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0gIG9ial9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0gIG9ial9ic3NzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fbWFjaGluZV90eXBlCi0KLVNZTk9QU0lTCi0JZW51bSBtYWNoaW5lX3R5cGUgIGFvdXRfQHZhcntzaXplfV9tYWNoaW5lX3R5cGUKLQkgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLURFU0NSSVBUSU9OCi0JS2VlcCB0cmFjayBvZiBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIGZvcgotCWEub3V0J3MuIFJldHVybiB0aGUgPDxtYWNoaW5lX3R5cGU+PiBmb3IgYSBwYXJ0aWN1bGFyCi0JYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLCBvciA8PE1fVU5LTk9XTj4+IGlmIHRoYXQgZXhhY3QgYXJjaGl0ZWN0dXJlCi0JYW5kIG1hY2hpbmUgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gYS5vdXQgZm9ybWF0LgotCi0JSWYgdGhlIGFyY2hpdGVjdHVyZSBpcyB1bmRlcnN0b29kLCBtYWNoaW5lIHR5cGUgMCAoZGVmYXVsdCkKLQlpcyBhbHdheXMgdW5kZXJzdG9vZC4KLSovCi0KLWVudW0gbWFjaGluZV90eXBlCi1OQU1FKGFvdXQsbWFjaGluZV90eXBlKSAoYXJjaCwgbWFjaGluZSwgdW5rbm93bikKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLSAgICAgYm9vbGVhbiAqdW5rbm93bjsKLXsKLSAgZW51bSBtYWNoaW5lX3R5cGUgYXJjaF9mbGFnczsKLQotICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOwotICAqdW5rbm93biA9IHRydWU7Ci0KLSAgc3dpdGNoIChhcmNoKSB7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgaWYgKG1hY2hpbmUgPT0gMAotCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmMKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZQotCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlCi0JfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY192OSkKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX1NQQVJDOwotICAgIGVsc2UgaWYgKG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpCi0gICAgICBhcmNoX2ZsYWdzID0gTV9TUEFSQ0xFVDsKLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgc3dpdGNoIChtYWNoaW5lKSB7Ci0gICAgY2FzZSAwOgkJICBhcmNoX2ZsYWdzID0gTV82ODAxMDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMDA6IGFyY2hfZmxhZ3MgPSBNX1VOS05PV047ICp1bmtub3duID0gZmFsc2U7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDEwOiBhcmNoX2ZsYWdzID0gTV82ODAxMDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6IGFyY2hfZmxhZ3MgPSBNXzY4MDIwOyBicmVhazsKLSAgICBkZWZhdWx0OgkJICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOyBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgIGlmIChtYWNoaW5lID09IDApCWFyY2hfZmxhZ3MgPSBNXzM4NjsKLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgaWYgKG1hY2hpbmUgPT0gMCkJYXJjaF9mbGFncyA9IE1fMjlLOwotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfYXJtOgotICAgIGlmIChtYWNoaW5lID09IDApCWFyY2hfZmxhZ3MgPSBNX0FSTTsKLSAgICBicmVhazsKLSAgICAKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIHN3aXRjaCAobWFjaGluZSkgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzMDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczM5MDA6Ci0gICAgICBhcmNoX2ZsYWdzID0gTV9NSVBTMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6Ci0gICAgICBhcmNoX2ZsYWdzID0gTV9NSVBTMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDAxMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQzMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDQwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2NTA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzODAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMxMDAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMxNjoKLSAgICAgIC8qIEZJWE1FOiBUaGVzZSBzaG91bGQgYmUgTUlQUzMgb3IgTUlQUzQuICAqLwotICAgICAgYXJjaF9mbGFncyA9IE1fTUlQUzI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX25zMzJrOgotICAgIHN3aXRjaCAobWFjaGluZSkgewotICAgIGNhc2UgMDogICAgCQlhcmNoX2ZsYWdzID0gTV9OUzMyNTMyOyBicmVhazsKLSAgICBjYXNlIDMyMDMyOgkJYXJjaF9mbGFncyA9IE1fTlMzMjAzMjsgYnJlYWs7Ci0gICAgY2FzZSAzMjUzMjoJCWFyY2hfZmxhZ3MgPSBNX05TMzI1MzI7IGJyZWFrOwotICAgIGRlZmF1bHQ6CQlhcmNoX2ZsYWdzID0gTV9VTktOT1dOOyBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF92YXg6Ci0gICAgKnVua25vd24gPSBmYWxzZTsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gIH0KLQotICBpZiAoYXJjaF9mbGFncyAhPSBNX1VOS05PV04pCi0gICAgKnVua25vd24gPSBmYWxzZTsKLQotICByZXR1cm4gYXJjaF9mbGFnczsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fc2V0X2FyY2hfbWFjaAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYW91dF9AdmFye3NpemV9X3NldF9hcmNoX21hY2gsCi0JIChiZmQgKiwKLQkgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIHRoZSBtYWNoaW5lIG9mIHRoZSBCRkQgQHZhcnthYmZkfSB0byB0aGUKLQl2YWx1ZXMgQHZhcnthcmNofSBhbmQgQHZhcnttYWNoaW5lfS4gIFZlcmlmeSB0aGF0IEB2YXJ7YWJmZH0ncyBmb3JtYXQKLQljYW4gc3VwcG9ydCB0aGUgYXJjaGl0ZWN0dXJlIHJlcXVpcmVkLgotKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9hcmNoX21hY2gpIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdW5rbm93bjsKLQotICAgICAgTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkgKGFyY2gsIG1hY2hpbmUsICZ1bmtub3duKTsKLSAgICAgIGlmICh1bmtub3duKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSAqLwotICBzd2l0Y2ggKGFyY2gpIHsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gKCphb3V0X2JhY2tlbmRfaW5mbyhhYmZkKS0+c2V0X3NpemVzKSAoYWJmZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfb19tYWdpYyAoYWJmZCwgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBmaWxlX3B0ciBwb3MgPSBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBiZmRfdm1hIHZtYSA9IDA7Ci0gIGludCBwYWQgPSAwOwotCi0gIC8qIFRleHQuICAqLwotICBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgaWYgKCFvYmpfdGV4dHNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOwotCi0gIHBvcyArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBEYXRhLiAgKi8KLSAgaWYgKCFvYmpfZGF0YXNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIHsKLSNpZiAwCSAgICAvKiA/PyBEb2VzIGFsaWdubWVudCBpbiB0aGUgZmlsZSBpbWFnZSByZWFsbHkgbWF0dGVyPyAqLwotICAgICAgcGFkID0gYWxpZ25fcG93ZXIgKHZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7Ci0jZW5kaWYKLSAgICAgIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICAgICAgcG9zICs9IHBhZDsKLSAgICAgIHZtYSArPSBwYWQ7Ci0gICAgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hID0gdm1hOwotICAgIH0KLSAgZWxzZQotICAgIHZtYSA9IG9ial9kYXRhc2VjKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBwb3MgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogQlNTLiAgKi8KLSAgaWYgKCFvYmpfYnNzc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotI2lmIDAKLSAgICAgIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7Ci0jZW5kaWYKLSAgICAgIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICAgICAgcG9zICs9IHBhZDsKLSAgICAgIHZtYSArPSBwYWQ7Ci0gICAgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIFZNQSBvZiB0aGUgLmJzcyBzZWN0aW9uIGlzIHNldCBieSB0aGUgdGhlIFZNQSBvZiB0aGUKLSAgICAgICAgIC5kYXRhIHNlY3Rpb24gcGx1cyB0aGUgc2l6ZSBvZiB0aGUgLmRhdGEgc2VjdGlvbi4gIFdlIG1heQotICAgICAgICAgbmVlZCB0byBhZGQgcGFkZGluZyBieXRlcyB0byBtYWtlIHRoaXMgdHJ1ZS4gICovCi0gICAgICBwYWQgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hIC0gdm1hOwotICAgICAgaWYgKHBhZCA+IDApCi0JewotCSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotCSAgcG9zICs9IHBhZDsKLQl9Ci0gICAgfQotICBvYmpfYnNzc2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotCi0gIC8qIEZpeCB1cCB0aGUgZXhlYyBoZWFkZXIuICAqLwotICBleGVjcC0+YV90ZXh0ID0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2JzcyA9IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgTl9TRVRfTUFHSUMgKCpleGVjcCwgT01BR0lDKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF96X21hZ2ljIChhYmZkLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIGJmZF9zaXplX3R5cGUgZGF0YV9wYWQsIHRleHRfcGFkOwotICBmaWxlX3B0ciB0ZXh0X2VuZDsKLSAgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhICphYmRwOwotICBpbnQgenRpaDsJCQkvKiBOb256ZXJvIGlmIHRleHQgaW5jbHVkZXMgZXhlYyBoZWFkZXIuICAqLwotICAKLSAgYWJkcCA9IGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKTsKLQotICAvKiBUZXh0LiAgKi8KLSAgenRpaCA9IChhYmRwICE9IE5VTEwKLQkgICYmIChhYmRwLT50ZXh0X2luY2x1ZGVzX2hlYWRlcgotCSAgICAgIHx8IG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gcV9tYWdpY19mb3JtYXQpKTsKLSAgb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MgPSAoenRpaAotCQkJCT8gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplCi0JCQkJOiBhZGF0YShhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplKTsKLSAgaWYgKCEgb2JqX3RleHRzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICB7Ci0gICAgICAvKiA/PyBEbyB3ZSByZWFsbHkgbmVlZCB0byBjaGVjayBmb3IgcmVsb2NzIGhlcmU/ICAqLwotICAgICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSA9ICgoYWJmZC0+ZmxhZ3MgJiBIQVNfUkVMT0MpCi0JCQkJPyAwCi0JCQkJOiAoenRpaAotCQkJCSAgID8gKGFiZHAtPmRlZmF1bHRfdGV4dF92bWEKLQkJCQkgICAgICArIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSkKLQkJCQkgICA6IGFiZHAtPmRlZmF1bHRfdGV4dF92bWEpKTsKLSAgICAgIHRleHRfcGFkID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgLnRleHQgc2VjdGlvbiBpcyBiZWluZyBsb2FkZWQgYXQgYW4gdW51c3VhbCBhZGRyZXNzLiAgV2UKLSAgICAgICAgIG1heSBuZWVkIHRvIHBhZCBpdCBzdWNoIHRoYXQgdGhlIC5kYXRhIHNlY3Rpb24gc3RhcnRzIGF0IGEgcGFnZQotICAgICAgICAgYm91bmRhcnkuICAqLwotICAgICAgaWYgKHp0aWgpCi0JdGV4dF9wYWQgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyAtIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hKQotCQkgICAgJiAoYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSAtIDEpKTsKLSAgICAgIGVsc2UKLQl0ZXh0X3BhZCA9ICgoLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSkKLQkJICAgICYgKGFkYXRhIChhYmZkKS5wYWdlX3NpemUgLSAxKSk7Ci0gICAgfQotCi0gIC8qIEZpbmQgc3RhcnQgb2YgZGF0YS4gICovCi0gIGlmICh6dGloKQotICAgIHsKLSAgICAgIHRleHRfZW5kID0gb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zICsgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gICAgICB0ZXh0X3BhZCArPSBCRkRfQUxJR04gKHRleHRfZW5kLCBhZGF0YSAoYWJmZCkucGFnZV9zaXplKSAtIHRleHRfZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBpZiBwYWdlX3NpemUgPT0gem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSwgdGhlbgotCSBmaWxlcG9zID09IHBhZ2Vfc2l6ZSwgYW5kIHRoaXMgY2FzZSBpcyB0aGUgc2FtZSBhcyB0aGUgenRpaAotCSBjYXNlLiAgKi8KLSAgICAgIHRleHRfZW5kID0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gICAgICB0ZXh0X3BhZCArPSBCRkRfQUxJR04gKHRleHRfZW5kLCBhZGF0YSAoYWJmZCkucGFnZV9zaXplKSAtIHRleHRfZW5kOwotICAgICAgdGV4dF9lbmQgKz0gb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zOwotICAgIH0KLSAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSB0ZXh0X3BhZDsKLSAgdGV4dF9lbmQgKz0gdGV4dF9wYWQ7Ci0KLSAgLyogRGF0YS4gICovCi0gIGlmICghb2JqX2RhdGFzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHZtYTsKLSAgICAgIHZtYSA9IG9ial90ZXh0c2VjKGFiZmQpLT52bWEgKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICAgICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUpOwotICAgIH0KLSAgaWYgKGFiZHAgJiYgYWJkcC0+em1hZ2ljX21hcHBlZF9jb250aWd1b3VzKQotICAgIHsKLSAgICAgIHRleHRfcGFkID0gKG9ial9kYXRhc2VjKGFiZmQpLT52bWEKLQkJICAtIG9ial90ZXh0c2VjKGFiZmQpLT52bWEKLQkJICAtIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpOwotICAgICAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSB0ZXh0X3BhZDsKLSAgICB9Ci0gIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gKG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zCi0JCQkJKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSAgCi0gIC8qIEZpeCB1cCBleGVjIGhlYWRlciB3aGlsZSB3ZSdyZSBhdCBpdC4gICovCi0gIGV4ZWNwLT5hX3RleHQgPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBpZiAoenRpaCAmJiAoIWFiZHAgfHwgKGFiZHAgJiYgIWFiZHAtPmV4ZWNfaGVhZGVyX25vdF9jb3VudGVkKSkpCi0gICAgZXhlY3AtPmFfdGV4dCArPSBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IHFfbWFnaWNfZm9ybWF0KQotICAgIE5fU0VUX01BR0lDICgqZXhlY3AsIFFNQUdJQyk7Ci0gIGVsc2UKLSAgICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBaTUFHSUMpOwotCi0gIC8qIFNwZWMgc2F5cyBkYXRhIHNlY3Rpb24gc2hvdWxkIGJlIHJvdW5kZWQgdXAgdG8gcGFnZSBib3VuZGFyeS4gICovCi0gIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUKLSAgICA9IGFsaWduX3Bvd2VyIChvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplLAotCQkgICBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOwotICBleGVjcC0+YV9kYXRhID0gQkZEX0FMSUdOIChvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplLAotCQkJICAgICBhZGF0YShhYmZkKS5wYWdlX3NpemUpOwotICBkYXRhX3BhZCA9IGV4ZWNwLT5hX2RhdGEgLSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIGlmICghb2JqX2Jzc3NlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSA9IChvYmpfZGF0YXNlYyhhYmZkKS0+dm1hCi0JCQkgICAgICsgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSk7Ci0gIC8qIElmIHRoZSBCU1MgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZGF0YSBzZWN0aW9uIGFuZCBleHRyYSBzcGFjZQotICAgICBpbiB0aGUgcGFnZSBpcyBsZWZ0IGFmdGVyIHRoZSBkYXRhIHNlY3Rpb24sIGZ1ZGdlIGRhdGEKLSAgICAgaW4gdGhlIGhlYWRlciBzbyB0aGF0IHRoZSBic3Mgc2VjdGlvbiBsb29rcyBzbWFsbGVyIGJ5IHRoYXQKLSAgICAgYW1vdW50LiAgV2UnbGwgc3RhcnQgdGhlIGJzcyBzZWN0aW9uIHRoZXJlLCBhbmQgbGllIHRvIHRoZSBPUy4KLSAgICAgKE5vdGUgdGhhdCBhIGxpbmtlciBzY3JpcHQsIGFzIHdlbGwgYXMgdGhlIGFib3ZlIGFzc2lnbm1lbnQsCi0gICAgIGNvdWxkIGhhdmUgZXhwbGljaXRseSBzZXQgdGhlIEJTUyB2bWEgdG8gaW1tZWRpYXRlbHkgZm9sbG93Ci0gICAgIHRoZSBkYXRhIHNlY3Rpb24uKSAgKi8KLSAgaWYgKGFsaWduX3Bvd2VyIChvYmpfYnNzc2VjKGFiZmQpLT52bWEsIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikKLSAgICAgID09IG9ial9kYXRhc2VjKGFiZmQpLT52bWEgKyBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplKQotICAgIGV4ZWNwLT5hX2JzcyA9IChkYXRhX3BhZCA+IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSkgPyAwIDoKLSAgICAgIG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSAtIGRhdGFfcGFkOwotICBlbHNlCi0gICAgZXhlY3AtPmFfYnNzID0gb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X25fbWFnaWMgKGFiZmQsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgZmlsZV9wdHIgcG9zID0gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBiZmRfdm1hIHZtYSA9IDA7Ci0gIGludCBwYWQ7Ci0gIAotICAvKiBUZXh0LiAgKi8KLSAgb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIGlmICghb2JqX3RleHRzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hID0gdm1hOwotICBlbHNlCi0gICAgdm1hID0gb2JqX3RleHRzZWMoYWJmZCktPnZtYTsKLSAgcG9zICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHZtYSArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIERhdGEuICAqLwotICBvYmpfZGF0YXNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgaWYgKCFvYmpfZGF0YXNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplKTsKLSAgdm1hID0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKLSAgCi0gIC8qIFNpbmNlIEJTUyBmb2xsb3dzIGRhdGEgaW1tZWRpYXRlbHksIHNlZSBpZiBpdCBuZWVkcyBhbGlnbm1lbnQuICAqLwotICB2bWEgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgcGFkID0gYWxpZ25fcG93ZXIgKHZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKLSAgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0gIHBvcyArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIGlmICghb2JqX2Jzc3NlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgZWxzZQotICAgIHZtYSA9IG9ial9ic3NzZWMoYWJmZCktPnZtYTsKLQotICAvKiBGaXggdXAgZXhlYyBoZWFkZXIuICAqLwotICBleGVjcC0+YV90ZXh0ID0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2JzcyA9IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgTl9TRVRfTUFHSUMgKCpleGVjcCwgTk1BR0lDKTsKLX0KLQotYm9vbGVhbgotTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsIHRleHRfc2l6ZSwgdGV4dF9lbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGV4dF9zaXplOwotICAgICBmaWxlX3B0ciAqdGV4dF9lbmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIGlmICghIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhZGF0YShhYmZkKS5tYWdpYyAhPSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSA9Ci0gICAgYWxpZ25fcG93ZXIob2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkJb2JqX3RleHRzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcik7Ci0KLSAgKnRleHRfc2l6ZSA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICAvKiBSdWxlIChoZXVyaXN0aWMpIGZvciB3aGVuIHRvIHBhZCB0byBhIG5ldyBwYWdlLiAgTm90ZSB0aGF0IHRoZXJlCi0gICAgIGFyZSAoYXQgbGVhc3QpIHR3byB3YXlzIGRlbWFuZC1wYWdlZCAoWk1BR0lDKSBmaWxlcyBoYXZlIGJlZW4KLSAgICAgaGFuZGxlZC4gIE1vc3QgQmVya2VsZXktYmFzZWQgc3lzdGVtcyBzdGFydCB0aGUgdGV4dCBzZWdtZW50IGF0Ci0gICAgIChUQVJHRVRfUEFHRV9TSVpFKS4gIEhvd2V2ZXIsIG5ld2VyIHZlcnNpb25zIG9mIFNVTk9TIHN0YXJ0IHRoZSB0ZXh0Ci0gICAgIHNlZ21lbnQgcmlnaHQgYWZ0ZXIgdGhlIGV4ZWMgaGVhZGVyOyB0aGUgbGF0dGVyIGlzIGNvdW50ZWQgaW4gdGhlCi0gICAgIHRleHQgc2VnbWVudCBzaXplLCBhbmQgaXMgcGFnZWQgaW4gYnkgdGhlIGtlcm5lbCB3aXRoIHRoZSByZXN0IG9mCi0gICAgIHRoZSB0ZXh0LiAqLwotCi0gIC8qIFRoaXMgcGVyaGFwcyBpc24ndCB0aGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMsIGJ1dCBtYWRlIGl0IHNpbXBsZXIgZm9yIG1lCi0gICAgIHRvIHVuZGVyc3RhbmQgZW5vdWdoIHRvIGltcGxlbWVudCBpdC4gIEJldHRlciB3b3VsZCBwcm9iYWJseSBiZSB0byBnbwotICAgICByaWdodCBmcm9tIEJGRCBmbGFncyB0byBhbGlnbm1lbnQvcG9zaXRpb25pbmcgY2hhcmFjdGVyaXN0aWNzLiAgQnV0IHRoZQotICAgICBvbGQgY29kZSB3YXMgc2xvcHB5IGVub3VnaCBhYm91dCBoYW5kbGluZyB0aGUgZmxhZ3MsIGFuZCBoYWQgZW5vdWdoCi0gICAgIG90aGVyIG1hZ2ljLCB0aGF0IGl0IHdhcyBhIGxpdHRsZSBoYXJkIGZvciBtZSB0byB1bmRlcnN0YW5kLiAgSSB0aGluawotICAgICBJIHVuZGVyc3RhbmQgaXQgYmV0dGVyIG5vdywgYnV0IEkgaGF2ZW4ndCB0aW1lIHRvIGRvIHRoZSBjbGVhbnVwIHRoaXMKLSAgICAgbWludXRlLiAgKi8KLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKQotICAgIC8qIFdoZXRoZXIgb3Igbm90IFdQX1RFWFQgaXMgc2V0IC0tIGxldCBEX1BBR0VEIG92ZXJyaWRlLiAgKi8KLSAgICBhZGF0YShhYmZkKS5tYWdpYyA9IHpfbWFnaWM7Ci0gIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgV1BfVEVYVCkKLSAgICBhZGF0YShhYmZkKS5tYWdpYyA9IG5fbWFnaWM7Ci0gIGVsc2UKLSAgICBhZGF0YShhYmZkKS5tYWdpYyA9IG9fbWFnaWM7Ci0KLSNpZmRlZiBCRkRfQU9VVF9ERUJVRyAvKiByZXF1aXJlcyBnY2MyICovCi0jaWYgX19HTlVDX18gPj0gMgotICBmcHJpbnRmIChzdGRlcnIsICIlcyB0ZXh0PTwleCwleCwleD4gZGF0YT08JXgsJXgsJXg+IGJzcz08JXgsJXgsJXg+XG4iLAotCSAgICh7IGNoYXIgKnN0cjsKLQkgICAgICBzd2l0Y2ggKGFkYXRhKGFiZmQpLm1hZ2ljKSB7Ci0JICAgICAgY2FzZSBuX21hZ2ljOiBzdHIgPSAiTk1BR0lDIjsgYnJlYWs7Ci0JICAgICAgY2FzZSBvX21hZ2ljOiBzdHIgPSAiT01BR0lDIjsgYnJlYWs7Ci0JICAgICAgY2FzZSB6X21hZ2ljOiBzdHIgPSAiWk1BR0lDIjsgYnJlYWs7Ci0JICAgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0JICAgICAgfQotCSAgICAgIHN0cjsKLQkgICAgfSksCi0JICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSwgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX3RleHRzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlciwKLQkgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hLCBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplLAotCSAgIAlvYmpfZGF0YXNlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyLAotCSAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplLAotCSAgIAlvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOwotI2VuZGlmCi0jZW5kaWYKLQotICBzd2l0Y2ggKGFkYXRhKGFiZmQpLm1hZ2ljKQotICAgIHsKLSAgICBjYXNlIG9fbWFnaWM6Ci0gICAgICBhZGp1c3Rfb19tYWdpYyAoYWJmZCwgZXhlY3ApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB6X21hZ2ljOgotICAgICAgYWRqdXN0X3pfbWFnaWMgKGFiZmQsIGV4ZWNwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugbl9tYWdpYzoKLSAgICAgIGFkanVzdF9uX21hZ2ljIChhYmZkLCBleGVjcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0jaWZkZWYgQkZEX0FPVVRfREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiICAgICAgIHRleHQ9PCV4LCV4LCV4PiBkYXRhPTwleCwleCwleD4gYnNzPTwleCwleD5cbiIsCi0JICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSwgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MsCi0JICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MsCi0JICAgb2JqX2Jzc3NlYyhhYmZkKS0+dm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9uZXdfc2VjdGlvbl9ob29rCi0KLVNZTk9QU0lTCi0gICAgICAgIGJvb2xlYW4gYW91dF9AdmFye3NpemV9X25ld19zZWN0aW9uX2hvb2ssCi0JICAgKGJmZCAqYWJmZCwKLQkgICAgYXNlY3Rpb24gKm5ld3NlY3QpKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsZWQgYnkgdGhlIEJGRCBpbiByZXNwb25zZSB0byBhIEBjb2Rle2JmZF9tYWtlX3NlY3Rpb259Ci0JcmVxdWVzdC4KLSovCi1ib29sZWFuCi1OQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykgKGFiZmQsIG5ld3NlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci17Ci0gIC8qIGFsaWduIHRvIGRvdWJsZSBhdCBsZWFzdCAqLwotICBuZXdzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyhhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKLQotCi0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKLSAgewotICAgIGlmIChvYmpfdGV4dHNlYyhhYmZkKSA9PSBOVUxMICYmICFzdHJjbXAobmV3c2VjdC0+bmFtZSwgIi50ZXh0IikpIHsKLQlvYmpfdGV4dHNlYyhhYmZkKT0gbmV3c2VjdDsKLQluZXdzZWN0LT50YXJnZXRfaW5kZXggPSBOX1RFWFQ7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICBpZiAob2JqX2RhdGFzZWMoYWJmZCkgPT0gTlVMTCAmJiAhc3RyY21wKG5ld3NlY3QtPm5hbWUsICIuZGF0YSIpKSB7Ci0Jb2JqX2RhdGFzZWMoYWJmZCkgPSBuZXdzZWN0OwotCW5ld3NlY3QtPnRhcmdldF9pbmRleCA9IE5fREFUQTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgIGlmIChvYmpfYnNzc2VjKGFiZmQpID09IE5VTEwgJiYgIXN0cmNtcChuZXdzZWN0LT5uYW1lLCAiLmJzcyIpKSB7Ci0Jb2JqX2Jzc3NlYyhhYmZkKSA9IG5ld3NlY3Q7Ci0JbmV3c2VjdC0+dGFyZ2V0X2luZGV4ID0gTl9CU1M7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgfQotCi0gIC8qIFdlIGFsbG93IG1vcmUgdGhhbiB0aHJlZSBzZWN0aW9ucyBpbnRlcm5hbGx5ICovCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBmaWxlX3B0ciB0ZXh0X2VuZDsKLSAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7Ci0KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uICE9IG9ial90ZXh0c2VjIChhYmZkKQotICAgICAgJiYgc2VjdGlvbiAhPSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbikpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjb3VudCAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBmcm9tIGFuIGEub3V0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0KLSAgICAgIGNvdW50ID0gZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgLyBFWFRFUk5BTF9OTElTVF9TSVpFOwotCi0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGlmIChiZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLAotCQkJICAgICAgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zLAotCQkJICAgICAgICZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSwgdHJ1ZSkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3ltcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCkuZGF0YTsKLSNlbHNlCi0gICAgICAvKiBXZSBhbGxvY2F0ZSB1c2luZyBtYWxsb2MgdG8gbWFrZSB0aGUgdmFsdWVzIGVhc3kgdG8gZnJlZQotCSBsYXRlciBvbi4gIElmIHdlIHB1dCB0aGVtIG9uIHRoZSBvYmphbGxvYyBpdCBtaWdodCBub3QgYmUKLQkgcG9zc2libGUgdG8gZnJlZSB0aGVtLiAgKi8KLSAgICAgIHN5bXMgPSAoKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKQotCSAgICAgIGJmZF9tYWxsb2MgKChzaXplX3QpIGNvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRSkpOwotICAgICAgaWYgKHN5bXMgPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMICYmIGNvdW50ICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKHN5bXMsIDEsIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zLCBhYmZkKQotCSAgICAgICE9IGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zKSkKLQl7Ci0JICBmcmVlIChzeW1zKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0jZW5kaWYKLQotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBzeW1zOwotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKSA9IGNvdW50OwotICAgIH0KLSAgICAgIAotICBpZiAob2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPT0gTlVMTAotICAgICAgJiYgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHN0cmluZ19jaGFyc1tCWVRFU19JTl9XT1JEXTsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3RyaW5nc2l6ZTsKLSAgICAgIGNoYXIgKnN0cmluZ3M7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5ncy4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zdHJfZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKChQVFIpIHN0cmluZ19jaGFycywgQllURVNfSU5fV09SRCwgMSwgYWJmZCkKLQkgICAgICAhPSBCWVRFU19JTl9XT1JEKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJpbmdzaXplID0gR0VUX1dPUkQgKGFiZmQsIHN0cmluZ19jaGFycyk7Ci0KLSNpZmRlZiBVU0VfTU1BUAotICAgICAgaWYgKGJmZF9nZXRfZmlsZV93aW5kb3cgKGFiZmQsIG9ial9zdHJfZmlsZXBvcyAoYWJmZCksIHN0cmluZ3NpemUsCi0JCQkgICAgICAgJm9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpLCB0cnVlKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJpbmdzID0gKGNoYXIgKikgb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkuZGF0YTsKLSNlbHNlCi0gICAgICBzdHJpbmdzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3RyaW5nc2l6ZSArIDEpOwotICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFNraXAgc3BhY2UgZm9yIHRoZSBzdHJpbmcgY291bnQgaW4gdGhlIGJ1ZmZlciBmb3IgY29udmVuaWVuY2UKLQkgd2hlbiB1c2luZyBpbmRleGVzLiAgKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoc3RyaW5ncyArIEJZVEVTX0lOX1dPUkQsIDEsIHN0cmluZ3NpemUgLSBCWVRFU19JTl9XT1JELAotCQkgICAgYWJmZCkKLQkgICE9IHN0cmluZ3NpemUgLSBCWVRFU19JTl9XT1JEKQotCXsKLQkgIGZyZWUgKHN0cmluZ3MpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSNlbmRpZgotCi0gICAgICAvKiBFbnN1cmUgdGhhdCBhIHplcm8gaW5kZXggeWllbGRzIGFuIGVtcHR5IHN0cmluZy4gICovCi0gICAgICBzdHJpbmdzWzBdID0gJ1wwJzsKLQotICAgICAgc3RyaW5nc1tzdHJpbmdzaXplIC0gMV0gPSAwOwotCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IHN0cmluZ3M7Ci0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCkgPSBzdHJpbmdzaXplOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIGEub3V0IHN5bWJvbCBpbnRvIGEgQkZEIHN5bWJvbC4gIFRoZSBkZXNjLCBvdGhlciwgdHlwZQotICAgYW5kIHN5bWJvbC0+dmFsdWUgZmllbGRzIG9mIENBQ0hFX1BUUiB3aWxsIGJlIHNldCBmcm9tIHRoZSBhLm91dAotICAgbmxpc3Qgc3RydWN0dXJlLiAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZwotICAgc3ltYm9sLT5mbGFncyBhbmQgc3ltYm9sLT5zZWN0aW9uLCBhbmQgYWRqdXN0aW5nIHN5bWJvbC0+dmFsdWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyAoYWJmZCwgY2FjaGVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0cjsKLXsKLSAgZmxhZ3dvcmQgdmlzaWJsZTsKLQotICBpZiAoKGNhY2hlX3B0ci0+dHlwZSAmIE5fU1RBQikgIT0gMAotICAgICAgfHwgY2FjaGVfcHRyLT50eXBlID09IE5fRk4pCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgLyogVGhpcyBpcyBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwotCi0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgICAgIC8qIFdvcmsgb3V0IHRoZSBzeW1ib2wgc2VjdGlvbi4gICovCi0gICAgICBzd2l0Y2ggKGNhY2hlX3B0ci0+dHlwZSAmIE5fVFlQRSkKLQl7Ci0JY2FzZSBOX1RFWFQ6Ci0JY2FzZSBOX0ZOOgotCSAgc2VjID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0RBVEE6Ci0JICBzZWMgPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0JICBicmVhazsKLQljYXNlIE5fQlNTOgotCSAgc2VjID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgTl9BQlM6Ci0JICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gc2VjOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gc2VjLT52bWE7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBHZXQgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eS4gIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gYWxsIHR5cGVzLCBzbwotICAgICB3ZSBqdXN0IGhvbGQgaXQgaW4gYSBsb2NhbCB2YXJpYWJsZSB0byB1c2UgaWYgd2FudGVkLiAgKi8KLSAgaWYgKChjYWNoZV9wdHItPnR5cGUgJiBOX0VYVCkgPT0gMCkKLSAgICB2aXNpYmxlID0gQlNGX0xPQ0FMOwotICBlbHNlCi0gICAgdmlzaWJsZSA9IEJTRl9HTE9CQUw7Ci0KLSAgc3dpdGNoIChjYWNoZV9wdHItPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBOX0FCUzogY2FzZSBOX0FCUyB8IE5fRVhUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IHZpc2libGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0gICAgICBpZiAoY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgIT0gMCkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gICovCi0JICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSAwOwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fVEVYVDogY2FzZSBOX1RFWFQgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IHZpc2libGU7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogTl9TRVRWIHN5bWJvbHMgdXNlZCB0byByZXByZXNlbnQgc2V0IHZlY3RvcnMgcGxhY2VkIGluIHRoZQotCSBkYXRhIHNlY3Rpb24uICBUaGV5IGFyZSBubyBsb25nZXIgZ2VuZXJhdGVkLiAgVGhlb3JldGljYWxseSwKLQkgaXQgd2FzIHBvc3NpYmxlIHRvIGV4dHJhY3QgdGhlIGVudHJpZXMgYW5kIGNvbWJpbmUgdGhlbSB3aXRoCi0JIG5ldyBvbmVzLCBhbHRob3VnaCBJIGRvbid0IGtub3cgaWYgdGhhdCB3YXMgZXZlciBhY3R1YWxseQotCSBkb25lLiAgVW5sZXNzIHRoYXQgZmVhdHVyZSBpcyByZXN0b3JlZCwgdHJlYXQgdGhlbSBhcyBkYXRhCi0JIHN5bWJvbHMuICAqLwotICAgIGNhc2UgTl9TRVRWOiBjYXNlIE5fU0VUViB8IE5fRVhUOgotICAgIGNhc2UgTl9EQVRBOiBjYXNlIE5fREFUQSB8IE5fRVhUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gdmlzaWJsZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0JTUzogY2FzZSBOX0JTUyB8IE5fRVhUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fU0VUQTogY2FzZSBOX1NFVEEgfCBOX0VYVDoKLSAgICBjYXNlIE5fU0VUVDogY2FzZSBOX1NFVFQgfCBOX0VYVDoKLSAgICBjYXNlIE5fU0VURDogY2FzZSBOX1NFVEQgfCBOX0VYVDoKLSAgICBjYXNlIE5fU0VUQjogY2FzZSBOX1NFVEIgfCBOX0VYVDoKLSAgICAgIHsKLQkvKiBUaGlzIGNvZGUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIEl0IHVzZWQgdG8gYmUgdXNlZCB0byBtYWtlCi0gICAgICAgICAgIHRoZSBsaW5rZXIgaGFuZGxlIHNldCBzeW1ib2xzLCBidXQgdGhleSBhcmUgbm93IGhhbmRsZWQgaW4KLSAgICAgICAgICAgdGhlIGFkZF9zeW1ib2xzIHJvdXRpbmUgaW5zdGVhZC4gICovCi0jaWYgMAotCWFzZWN0aW9uICpzZWN0aW9uOwotCWFyZWxlbnRfY2hhaW4gKnJlbG9jOwotCWFzZWN0aW9uICppbnRvX3NlY3Rpb247Ci0KLQkvKiBUaGlzIGlzIGEgc2V0IHN5bWJvbC4gIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaXMgdGhlIG5hbWUKLQkgICBvZiB0aGUgc2V0IChlLmcuLCBfX0NUT1JfTElTVF9fKS4gIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sCi0JICAgaXMgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgc2V0LiAgV2UgY3JlYXRlIGEgc2VjdGlvbiB3aXRoCi0JICAgdGhlIHNhbWUgbmFtZSBhcyB0aGUgc3ltYm9sLCBhbmQgYWRkIGEgcmVsb2MgdG8gaW5zZXJ0IHRoZQotCSAgIGFwcHJvcHJpYXRlIHZhbHVlIGludG8gdGhlIHNlY3Rpb24uCi0KLQkgICBUaGlzIGFjdGlvbiBpcyBhY3R1YWxseSBvYnNvbGV0ZTsgaXQgdXNlZCB0byBtYWtlIHRoZQotCSAgIGxpbmtlciBkbyB0aGUgcmlnaHQgdGhpbmcsIGJ1dCB0aGUgbGlua2VyIG5vIGxvbmdlciB1c2VzCi0JICAgdGhpcyBmdW5jdGlvbi4gICovCi0KLQlzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUpOwotCWlmIChzZWN0aW9uID09IE5VTEwpCi0JICB7Ci0JICAgIGNoYXIgKmNvcHk7Ci0KLQkgICAgY29weSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChjYWNoZV9wdHItPnN5bWJvbC5uYW1lKSArIDEpOwotCSAgICBpZiAoY29weSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBzdHJjcHkgKGNvcHksIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUpOwotCSAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgY29weSk7Ci0JICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JcmVsb2MgPSAoYXJlbGVudF9jaGFpbiAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXJlbGVudF9jaGFpbikpOwotCWlmIChyZWxvYyA9PSBOVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogQnVpbGQgYSByZWxvY2F0aW9uIGVudHJ5IGZvciB0aGUgY29uc3RydWN0b3IuICAqLwotCXN3aXRjaCAoY2FjaGVfcHRyLT50eXBlICYgTl9UWVBFKQotCSAgewotCSAgY2FzZSBOX1NFVEE6Ci0JICAgIGludG9fc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgIGNhY2hlX3B0ci0+dHlwZSA9IE5fQUJTOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRUOgotCSAgICBpbnRvX3NlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICAgIGNhY2hlX3B0ci0+dHlwZSA9IE5fVEVYVDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE5fU0VURDoKLQkgICAgaW50b19zZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX0RBVEE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEI6Ci0JICAgIGludG9fc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX0JTUzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBCdWlsZCBhIHJlbG9jYXRpb24gcG9pbnRpbmcgaW50byB0aGUgY29uc3RydWN0b3Igc2VjdGlvbgotCSAgIHBvaW50aW5nIGF0IHRoZSBzeW1ib2wgaW4gdGhlIHNldCB2ZWN0b3Igc3BlY2lmaWVkLiAgKi8KLQlyZWxvYy0+cmVsZW50LmFkZGVuZCA9IGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlOwotCWNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBpbnRvX3NlY3Rpb247Ci0JcmVsb2MtPnJlbGVudC5zeW1fcHRyX3B0ciA9IGludG9fc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0KLQkvKiBXZSBtb2RpZnkgdGhlIHN5bWJvbCB0byBiZWxvbmcgdG8gYSBzZWN0aW9uIGRlcGVuZGluZyB1cG9uCi0JICAgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCwgYW5kIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbgotCSAgIHRvIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wuIEJ1aWxkIGEgcmVsb2MgZW50cnkgdG8KLQkgICByZWxvY2F0ZSB0byB0aGlzIHN5bWJvbCBhdHRhY2hlZCB0byB0aGlzIHNlY3Rpb24uICAqLwotCXNlY3Rpb24tPmZsYWdzID0gU0VDX0NPTlNUUlVDVE9SIHwgU0VDX1JFTE9DOwotCi0Jc2VjdGlvbi0+cmVsb2NfY291bnQrKzsKLQlzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0JcmVsb2MtPm5leHQgPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQlzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbiA9IHJlbG9jOwotCXJlbG9jLT5yZWxlbnQuYWRkcmVzcyA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQlzZWN0aW9uLT5fcmF3X3NpemUgKz0gQllURVNfSU5fV09SRDsKLQotCXJlbG9jLT5yZWxlbnQuaG93dG8gPSBDVE9SX1RBQkxFX1JFTE9DX0hPV1RPKGFiZmQpOwotCi0jZW5kaWYgLyogMCAqLwotCi0Jc3dpdGNoIChjYWNoZV9wdHItPnR5cGUgJiBOX1RZUEUpCi0JICB7Ci0JICBjYXNlIE5fU0VUQToKLQkgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVFQ6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEQ6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEI6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYWNoZV9wdHItPnN5bWJvbC5mbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XQVJOSU5HOgotICAgICAgLyogVGhpcyBzeW1ib2wgaXMgdGhlIHRleHQgb2YgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGUgbmV4dAotCSBzeW1ib2wgaXMgdGhlIHN5bWJvbCB0byBhc3NvY2lhdGUgdGhlIHdhcm5pbmcgd2l0aC4gIElmIGEKLQkgcmVmZXJlbmNlIGlzIG1hZGUgdG8gdGhhdCBzeW1ib2wsIGEgd2FybmluZyBpcyBpc3N1ZWQuICAqLwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HIHwgQlNGX1dBUk5JTkc7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0lORFI6IGNhc2UgTl9JTkRSIHwgTl9FWFQ6Ci0gICAgICAvKiBBbiBpbmRpcmVjdCBzeW1ib2wuICBUaGlzIGNvbnNpc3RzIG9mIHR3byBzeW1ib2xzIGluIGEgcm93LgotCSBUaGUgZmlyc3Qgc3ltYm9sIGlzIHRoZSBuYW1lIG9mIHRoZSBpbmRpcmVjdGlvbi4gIFRoZSBzZWNvbmQKLQkgc3ltYm9sIGlzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQuICBBIHJlZmVyZW5jZSB0byB0aGUgZmlyc3QKLQkgc3ltYm9sIGJlY29tZXMgYSByZWZlcmVuY2UgdG8gdGhlIHNlY29uZC4gICovCi0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkcgfCBCU0ZfSU5ESVJFQ1QgfCB2aXNpYmxlOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9pbmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLVToKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1dFQUtBOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS1Q6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1dFQUtEOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLQjoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgZmllbGRzIG9mIFNZTV9QT0lOVEVSIGFjY29yZGluZyB0byBDQUNIRV9QVFIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0ciwgc3ltX3BvaW50ZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqY2FjaGVfcHRyOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bV9wb2ludGVyOwotewotICBiZmRfdm1hIHZhbHVlID0gY2FjaGVfcHRyLT52YWx1ZTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSBvZmY7Ci0KLSAgLyogTWFzayBvdXQgYW55IGV4aXN0aW5nIHR5cGUgYml0cyBpbiBjYXNlIGNvcHlpbmcgZnJvbSBvbmUgc2VjdGlvbgotICAgICB0byBhbm90aGVyLiAgKi8KLSAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSAmPSB+Tl9UWVBFOwotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoY2FjaGVfcHRyKTsKLSAgb2ZmID0gMDsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBjYXNlIG9jY3VycywgZS5nLiwgZm9yIHRoZSAqREVCVUcqIHNlY3Rpb24gb2YgYSBDT0ZGCi0JIGZpbGUuICAqLwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGZvciBzeW1ib2wgYCVzJyBpbiBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIAotCSBjYWNoZV9wdHItPm5hbWUgIT0gTlVMTCA/IGNhY2hlX3B0ci0+bmFtZSA6IF8oIip1bmtub3duKiIpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIG9mZiA9IHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIHNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX0FCUzsKLSAgZWxzZSBpZiAoc2VjID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdIHw9IE5fVEVYVDsKLSAgZWxzZSBpZiAoc2VjID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdIHw9IE5fREFUQTsKLSAgZWxzZSBpZiAoc2VjID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9CU1M7Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gTl9VTkRGIHwgTl9FWFQ7Ci0gIGVsc2UgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc2VjKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gTl9JTkRSOwotICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fVU5ERiB8IE5fRVhUOwotICBlbHNlCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVHVybiB0aGUgc3ltYm9sIGZyb20gc2VjdGlvbiByZWxhdGl2ZSB0byBhYnNvbHV0ZSBhZ2FpbiAqLwotICB2YWx1ZSArPSBzZWMtPnZtYSArIG9mZjsKLQotICBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfV0FSTklORykgIT0gMCkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gTl9XQVJOSU5HOwotCi0gIGlmICgoY2FjaGVfcHRyLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9ICgoYW91dF9zeW1ib2xfdHlwZSAqKSBjYWNoZV9wdHIpLT50eXBlOwotICBlbHNlIGlmICgoY2FjaGVfcHRyLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDApCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX0VYVDsKLQotICBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgewotICAgICAgaW50IHR5cGUgPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikgY2FjaGVfcHRyKS0+dHlwZTsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBOX0FCUzoJdHlwZSA9IE5fU0VUQTsgYnJlYWs7Ci0JY2FzZSBOX1RFWFQ6CXR5cGUgPSBOX1NFVFQ7IGJyZWFrOwotCWNhc2UgTl9EQVRBOgl0eXBlID0gTl9TRVREOyBicmVhazsKLQljYXNlIE5fQlNTOgl0eXBlID0gTl9TRVRCOyBicmVhazsKLQl9Ci0gICAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gdHlwZTsKLSAgICB9Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX1dFQUspICE9IDApCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0KLSAgICAgIHN3aXRjaCAoc3ltX3BvaW50ZXItPmVfdHlwZVswXSAmIE5fVFlQRSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIE5fQUJTOgl0eXBlID0gTl9XRUFLQTsgYnJlYWs7Ci0JY2FzZSBOX1RFWFQ6CXR5cGUgPSBOX1dFQUtUOyBicmVhazsKLQljYXNlIE5fREFUQToJdHlwZSA9IE5fV0VBS0Q7IGJyZWFrOwotCWNhc2UgTl9CU1M6CXR5cGUgPSBOX1dFQUtCOyBicmVhazsKLQljYXNlIE5fVU5ERjoJdHlwZSA9IE5fV0VBS1U7IGJyZWFrOwotCX0KLSAgICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSB0eXBlOwotICAgIH0KLQotICBQVVRfV09SRChhYmZkLCB2YWx1ZSwgc3ltX3BvaW50ZXItPmVfdmFsdWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTmF0aXZlLWxldmVsIGludGVyZmFjZSB0byBzeW1ib2xzLiAqLwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYW91dF9zeW1ib2xfdHlwZSAgKm5ldyA9Ci0gICAgKGFvdXRfc3ltYm9sX3R5cGUgKiliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhIHNldCBvZiBpbnRlcm5hbCBzeW1ib2xzIGludG8gZXh0ZXJuYWwgc3ltYm9scy4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSAoYWJmZCwgaW4sIGV4dCwgY291bnQsIHN0ciwgc3Ryc2l6ZSwgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhb3V0X3N5bWJvbF90eXBlICppbjsKLSAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpleHQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGNoYXIgKnN0cjsKLSAgICAgYmZkX3NpemVfdHlwZSBzdHJzaXplOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0X2VuZDsKLQotICBleHRfZW5kID0gZXh0ICsgY291bnQ7Ci0gIGZvciAoOyBleHQgPCBleHRfZW5kOyBleHQrKywgaW4rKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHg7Ci0KLSAgICAgIHggPSBHRVRfV09SRCAoYWJmZCwgZXh0LT5lX3N0cngpOwotICAgICAgaW4tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotICAgICAgLyogRm9yIHRoZSBub3JtYWwgc3ltYm9scywgdGhlIHplcm8gaW5kZXggcG9pbnRzIGF0IHRoZSBudW1iZXIKLQkgb2YgYnl0ZXMgaW4gdGhlIHN0cmluZyB0YWJsZSBidXQgaXMgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgdGhlCi0JIG51bGwgc3RyaW5nLiAgRm9yIHRoZSBkeW5hbWljIHN5bWJvbHMsIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4KLQkgdGhlIHN0cmluZyB0YWJsZSBpcyBzdG9yZWQgaW4gdGhlIF9fRFlOQU1JQyBzdHJ1Y3R1cmUgYW5kIHRoZQotCSB6ZXJvIGluZGV4IHBvaW50cyBhdCBhbiBhY3R1YWwgc3RyaW5nLiAgKi8KLSAgICAgIGlmICh4ID09IDAgJiYgISBkeW5hbWljKQotCWluLT5zeW1ib2wubmFtZSA9ICIiOwotICAgICAgZWxzZSBpZiAoeCA8IHN0cnNpemUpCi0JaW4tPnN5bWJvbC5uYW1lID0gc3RyICsgeDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGluLT5zeW1ib2wudmFsdWUgPSBHRVRfU1dPUkQgKGFiZmQsICBleHQtPmVfdmFsdWUpOwotICAgICAgaW4tPmRlc2MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4dC0+ZV9kZXNjKTsKLSAgICAgIGluLT5vdGhlciA9IGJmZF9oX2dldF84IChhYmZkLCBleHQtPmVfb3RoZXIpOwotICAgICAgaW4tPnR5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgIGV4dC0+ZV90eXBlKTsKLSAgICAgIGluLT5zeW1ib2wudWRhdGEucCA9IE5VTEw7Ci0KLSAgICAgIGlmICghIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGluKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChkeW5hbWljKQotCWluLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0RZTkFNSUM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSByZWFkIHRoZSBzeW1ib2xzIGludG8gYSBidWZmZXIsIHdoaWNoIGlzIGRpc2NhcmRlZCB3aGVuIHRoaXMKLSAgIGZ1bmN0aW9uIGV4aXRzLiAgV2UgcmVhZCB0aGUgc3RyaW5ncyBpbnRvIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0bwotICAgaG9sZCB0aGVtIGFsbCBwbHVzIGFsbCB0aGUgY2FjaGVkIHN5bWJvbCBlbnRyaWVzLiAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKm9sZF9leHRlcm5hbF9zeW1zOwotICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZWQ7Ci0gIHNpemVfdCBjYWNoZWRfc2l6ZTsKLQotICAvKiBJZiB0aGVyZSdzIG5vIHdvcmsgdG8gYmUgZG9uZSwgZG9uJ3QgZG8gYW55ICovCi0gIGlmIChvYmpfYW91dF9zeW1ib2xzIChhYmZkKSAhPSAoYW91dF9zeW1ib2xfdHlwZSAqKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9sZF9leHRlcm5hbF9zeW1zID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0KLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNhY2hlZF9zaXplID0gKG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkKLQkJICogc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7Ci0gIGNhY2hlZCA9IChhb3V0X3N5bWJvbF90eXBlICopIGJmZF9tYWxsb2MgKGNhY2hlZF9zaXplKTsKLSAgaWYgKGNhY2hlZCA9PSBOVUxMICYmIGNhY2hlZF9zaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoY2FjaGVkX3NpemUgIT0gMCkKLSAgICBtZW1zZXQgKGNhY2hlZCwgMCwgY2FjaGVkX3NpemUpOwotCi0gIC8qIENvbnZlcnQgZnJvbSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gdG8gaW50ZXJuYWwuICAqLwotICBpZiAoISAoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpCi0JIChhYmZkLCBjYWNoZWQsCi0JICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSwKLQkgIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSwKLQkgIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplIChhYmZkKSwKLQkgIGZhbHNlKSkpCi0gICAgewotICAgICAgZnJlZSAoY2FjaGVkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotCi0gIG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpID0gY2FjaGVkOwotCi0gIC8qIEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW55Ym9keSB3aG8gY2FsbHMgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdAotICAgICB3YW50IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24sIHNvIGlmIGl0IHdhcyBhbGxvY2F0ZWQKLSAgICAgYmVjYXVzZSBvZiBvdXIgY2FsbCB0byBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzLCB3ZSBmcmVlIGl0IHVwCi0gICAgIHJpZ2h0IGF3YXkgdG8gc2F2ZSBzcGFjZS4gICovCi0gIGlmIChvbGRfZXh0ZXJuYWxfc3ltcyA9PSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwKLSAgICAgICYmIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSNlbHNlCi0gICAgICBmcmVlIChvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSk7Ci0jZW5kaWYKLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBXZSB1c2UgYSBoYXNoIHRhYmxlIHdoZW4gd3JpdGluZyBvdXQgc3ltYm9scyBzbyB0aGF0IHdlIG9ubHkgd3JpdGUKLSAgIG91dCBhIHBhcnRpY3VsYXIgc3RyaW5nIG9uY2UuICBUaGlzIGhlbHBzIHBhcnRpY3VsYXJseSB3aGVuIHRoZQotICAgbGlua2VyIHdyaXRlcyBvdXQgc3RhYnMgZGVidWdnaW5nIGVudHJpZXMsIGJlY2F1c2UgZWFjaCBkaWZmZXJlbnQKLSAgIGNvbnRyaWJ1dGluZyBvYmplY3QgZmlsZSB0ZW5kcyB0byBoYXZlIG1hbnkgZHVwbGljYXRlIHN0YWJzCi0gICBzdHJpbmdzLgotCi0gICBUaGlzIGhhc2ggdGFibGUgY29kZSBicmVha3MgZGJ4IG9uIFN1bk9TIDQuMS4zLCBzbyB3ZSBkb24ndCBkbyBpdAotICAgaWYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBpcyBzZXQuICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZSBhZGRfdG9fc3RyaW5ndGFiCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gZW1pdF9zdHJpbmd0YWIgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBHZXQgdGhlIGluZGV4IG9mIGEgc3RyaW5nIGluIGEgc3RydGFiLCBhZGRpbmcgaXQgaWYgaXQgaXMgbm90Ci0gICBhbHJlYWR5IHByZXNlbnQuICAqLwotCi1zdGF0aWMgSU5MSU5FIGJmZF9zaXplX3R5cGUKLWFkZF90b19zdHJpbmd0YWIgKGFiZmQsIHRhYiwgc3RyLCBjb3B5KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBib29sZWFuIGNvcHk7Ci17Ci0gIGJvb2xlYW4gaGFzaDsKLSAgYmZkX3NpemVfdHlwZSBpbmRleDsKLQotICAvKiBBbiBpbmRleCBvZiAwIGFsd2F5cyBtZWFucyB0aGUgZW1wdHkgc3RyaW5nLiAgKi8KLSAgaWYgKHN0ciA9PSAwIHx8ICpzdHIgPT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLQotICAvKiBEb24ndCBoYXNoIGlmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBiZWNhdXNlIFN1bk9TIGRieAotICAgICBkb2Vzbid0IHVuZGVyc3RhbmQgYSBoYXNoZWQgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaGFzaCA9IHRydWU7Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotICAgIGhhc2ggPSBmYWxzZTsKLQotICBpbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAodGFiLCBzdHIsIGhhc2gsIGNvcHkpOwotCi0gIGlmIChpbmRleCAhPSAoYmZkX3NpemVfdHlwZSkgLTEpCi0gICAgewotICAgICAgLyogQWRkIEJZVEVTX0lOX1dPUkQgdG8gdGhlIHJldHVybiB2YWx1ZSB0byBhY2NvdW50IGZvciB0aGUKLQkgc3BhY2UgdGFrZW4gdXAgYnkgdGhlIHN0cmluZyB0YWJsZSBzaXplLiAgKi8KLSAgICAgIGluZGV4ICs9IEJZVEVTX0lOX1dPUkQ7Ci0gICAgfQotCi0gIHJldHVybiBpbmRleDsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3RydGFiLiAgQUJGRCBpcyBhbHJlYWR5IGF0IHRoZSByaWdodCBsb2NhdGlvbiBpbiB0aGUKLSAgIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZW1pdF9zdHJpbmd0YWIgKGFiZmQsIHRhYikKLSAgICAgcmVnaXN0ZXIgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcltCWVRFU19JTl9XT1JEXTsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIHN0YXJ0cyB3aXRoIHRoZSBzaXplLiAgKi8KLSAgUFVUX1dPUkQgKGFiZmQsIF9iZmRfc3RyaW5ndGFiX3NpemUgKHRhYikgKyBCWVRFU19JTl9XT1JELCBidWZmZXIpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIEJZVEVTX0lOX1dPUkQsIGFiZmQpICE9IEJZVEVTX0lOX1dPUkQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCB0YWIpOwotfQotDAotYm9vbGVhbgotTkFNRShhb3V0LHdyaXRlX3N5bXMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudCA7Ci0gIGFzeW1ib2wgKipnZW5lcmljID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotCi0gIHN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChzdHJ0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7IGNvdW50KyspCi0gICAgewotICAgICAgYXN5bWJvbCAqZyA9IGdlbmVyaWNbY291bnRdOwotICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0IG5zcDsKLQotICAgICAgaW5keCA9IGFkZF90b19zdHJpbmd0YWIgKGFiZmQsIHN0cnRhYiwgZy0+bmFtZSwgZmFsc2UpOwotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgUFVUX1dPUkQgKGFiZmQsIGluZHgsIChiZmRfYnl0ZSAqKSBuc3AuZV9zdHJ4KTsKLQotICAgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIoZykgPT0gYWJmZC0+eHZlYy0+Zmxhdm91cikKLQl7Ci0JICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dF9zeW1ib2woZyktPmRlc2MsICBuc3AuZV9kZXNjKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIGFvdXRfc3ltYm9sKGcpLT5vdGhlciwgIG5zcC5lX290aGVyKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIGFvdXRfc3ltYm9sKGcpLT50eXBlLCAgbnNwLmVfdHlwZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9oX3B1dF8xNihhYmZkLDAsIG5zcC5lX2Rlc2MpOwotCSAgYmZkX2hfcHV0XzgoYWJmZCwgMCwgbnNwLmVfb3RoZXIpOwotCSAgYmZkX2hfcHV0XzgoYWJmZCwgMCwgbnNwLmVfdHlwZSk7Ci0JfQotCi0gICAgICBpZiAoISB0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyAoYWJmZCwgZywgJm5zcCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUoKFBUUikmbnNwLDEsRVhURVJOQUxfTkxJU1RfU0laRSwgYWJmZCkKLQkgICE9IEVYVEVSTkFMX05MSVNUX1NJWkUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIE5COiBgS0VFUElUJyBjdXJyZW50bHkgb3ZlcmxheXMgYHVkYXRhLnAnLCBzbyBzZXQgdGhpcyBvbmx5Ci0JIGhlcmUsIGF0IHRoZSBlbmQuICAqLwotICAgICAgZy0+S0VFUElUID0gY291bnQ7Ci0gICAgfQotCi0gIGlmICghIGVtaXRfc3RyaW5ndGFiIChhYmZkLCBzdHJ0YWIpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHN0cnRhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLWVycm9yX3JldHVybjoKLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoc3RydGFiKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0MCi1sb25nCi1OQU1FKGFvdXQsZ2V0X3N5bXRhYikgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gICAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLQotICAgIGlmICghTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkoYWJmZCkpCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBmb3IgKHN5bWJhc2UgPSBvYmpfYW91dF9zeW1ib2xzKGFiZmQpOyBjb3VudGVyKysgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTspCi0gICAgICAqKGxvY2F0aW9uKyspID0gKGFzeW1ib2wgKikoIHN5bWJhc2UrKyk7Ci0gICAgKmxvY2F0aW9uKysgPTA7Ci0gICAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi0MCi0vKiBTdGFuZGFyZCByZWxvYyBzdHVmZiAqLwotLyogT3V0cHV0IHN0YW5kYXJkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLwotCi1leHRlcm4gdm9pZCAgTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZTsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl9sZW5ndGggPSBnLT5ob3d0by0+c2l6ZSA7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLSAgcl9wY3JlbCAgPSAoaW50KSBnLT5ob3d0by0+cGNfcmVsYXRpdmU7IC8qIFJlbGF0aXZlIHRvIFBDPyAqLwotICAvKiBYWFggVGhpcyByZWxpZXMgb24gcmVsb2NzIGNvbWluZyBmcm9tIGEub3V0IGZpbGVzLiAgKi8KLSAgcl9iYXNlcmVsID0gKGctPmhvd3RvLT50eXBlICYgOCkgIT0gMDsKLSAgcl9qbXB0YWJsZSA9IChnLT5ob3d0by0+dHlwZSAmIDE2KSAhPSAwOwotICByX3JlbGF0aXZlID0gKGctPmhvd3RvLT50eXBlICYgMzIpICE9IDA7Ci0KLSNpZiAwCi0gIC8qIEZvciBhIHN0YW5kYXJkIHJlbG9jLCB0aGUgYWRkZW5kIGlzIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSNlbmRpZgotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLSAgICAgIHsKLQkvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQlyX2luZGV4ID0gTl9BQlM7Ci0Jcl9leHRlcm4gPSAwOwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkvKiBGaWxsIGluIHN5bWJvbCAqLwotCXJfZXh0ZXJuID0gMTsKLQlyX2luZGV4ID0gKCooZy0+c3ltX3B0cl9wdHIpKS0+S0VFUElUOwotCi0gICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLSAgICAgICAocl9leHRlcm4/ICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUc6IDApCi0JfCAocl9wY3JlbD8gICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzogMCkKLQkgfCAocl9iYXNlcmVsPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHOiAwKQotCSAgfCAocl9qbXB0YWJsZT8gIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRzogMCkKLQkgICB8IChyX3JlbGF0aXZlPyAgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHOiAwKQotCSAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0gICAgfSBlbHNlIHsKLQluYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCW5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQluYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4OwotCW5hdHB0ci0+cl90eXBlWzBdID0KLQkgKHJfZXh0ZXJuPyAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQotCSAgfCAocl9wY3JlbD8gICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRTogMCkKLQkgICB8IChyX2Jhc2VyZWw/ICAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEU6IDApCi0JICAgIHwgKHJfam1wdGFibGU/ICBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEU6IDApCi0JICAgICB8IChyX3JlbGF0aXZlPyAgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFOiAwKQotCSAgICAgIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgICAgIH0KLX0KLQotCi0vKiBFeHRlbmRlZCBzdHVmZiAqLwotLyogT3V0cHV0IGV4dGVuZGVkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLwotCi1leHRlcm4gdm9pZCBOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopKTsKLQotdm9pZAotTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsIGcsIG5hdHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpnOwotICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpuYXRwdHI7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIHVuc2lnbmVkIGludCByX2FkZGVuZDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKLQotICByX3R5cGUgPSAodW5zaWduZWQgaW50KSBnLT5ob3d0by0+dHlwZTsKLQotICByX2FkZGVuZCA9IGctPmFkZGVuZDsKLSAgaWYgKChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHJfYWRkZW5kICs9ICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlLiAgKi8KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotICAgIHsKLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBOX0FCUzsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgIHx8IChzeW0tPmZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMCkKLQlyX2V4dGVybiA9IDE7Ci0gICAgICBlbHNlCi0Jcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotICAgICAgKChyX2V4dGVybj8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRzogMCkKLSAgICAgICB8IChyX3R5cGUgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLSAgfSBlbHNlIHsKLSAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLSAgICAgKHJfZXh0ZXJuPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFOiAwKQotICAgICAgfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLSAgfQotCi0gIFBVVF9XT1JEIChhYmZkLCByX2FkZGVuZCwgbmF0cHRyLT5yX2FkZGVuZCk7Ci19Ci0KLS8qIEJGRCBkZWFscyBpbnRlcm5hbGx5IHdpdGggYWxsIHRoaW5ncyBiYXNlZCBmcm9tIHRoZSBzZWN0aW9uIHRoZXkncmUKLSAgIGluLiBzbywgc29tZXRoaW5nIGluIDEwIGJ5dGVzIGludG8gYSB0ZXh0IHNlY3Rpb24gIHdpdGggYSBiYXNlIG9mCi0gICA1MCB3b3VsZCBoYXZlIGEgc3ltYm9sICgudGV4dCsxMCkgYW5kIGtub3cgLnRleHQgdm1hIHdhcyA1MC4KLQotICAgQW91dCBrZWVwcyBhbGwgaXQncyBzeW1ib2xzIGJhc2VkIGZyb20gemVybywgc28gdGhlIHN5bWJvbCB3b3VsZAotICAgY29udGFpbiA2MC4gVGhpcyBtYWNybyBzdWJzIHRoZSBiYXNlIG9mIGVhY2ggc2VjdGlvbiBmcm9tIHRoZSB2YWx1ZQotICAgdG8gZ2l2ZSB0aGUgdHJ1ZSBvZmZzZXQgZnJvbSB0aGUgc2VjdGlvbiAqLwotCi0KLSNkZWZpbmUgTU9WRV9BRERSRVNTKGFkKSAgICAgICAJCQkJCQlcCi0gIGlmIChyX2V4dGVybikgewkJCQkJCQlcCi0gICAvKiB1bmRlZmluZWQgc3ltYm9sICovCQkJCQkJXAotICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIHJfaW5kZXg7CQkJXAotICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkOwkJCQkJCVwKLSAgICAgfSBlbHNlIHsJCQkJCQkJCVwKLSAgICAvKiBkZWZpbmVkLCBzZWN0aW9uIHJlbGF0aXZlLiByZXBsYWNlIHN5bWJvbCB3aXRoIHBvaW50ZXIgdG8gICAgCVwKLSAgICAgICBzeW1ib2wgd2hpY2ggcG9pbnRzIHRvIHNlY3Rpb24gICovCQkJCVwKLSAgICBzd2l0Y2ggKHJfaW5kZXgpIHsJCQkJCQkJXAotICAgIGNhc2UgTl9URVhUOgkJCQkJCQlcCi0gICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial90ZXh0c2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAgLSBzdS0+dGV4dHNlYy0+dm1hOwkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGNhc2UgTl9EQVRBOgkJCQkJCQlcCi0gICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial9kYXRhc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAtIHN1LT5kYXRhc2VjLT52bWE7CQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgY2FzZSBOX0JTUzoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQlNTIHwgTl9FWFQ6CQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX2Jzc3NlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgLSBzdS0+YnNzc2VjLT52bWE7CQkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGRlZmF1bHQ6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0FCUzoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6CQkJCQkJCVwKLSAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkOwkJCQkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIH0gICAgIAkJCQkJCQkJXAotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLSAgc3RydWN0IGFvdXRkYXRhICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSAoR0VUX1NXT1JEIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKSk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICByX2luZGV4ID0gIChieXRlcy0+cl9pbmRleFswXSA8PCAxNikKLQkgICAgIHwgKGJ5dGVzLT5yX2luZGV4WzFdIDw8IDgpCi0JICAgICB8ICBieXRlcy0+cl9pbmRleFsyXTsKLSAgICByX2V4dGVybiA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOwotICAgIHJfdHlwZSAgID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLQkJCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICByX2luZGV4ID0gIChieXRlcy0+cl9pbmRleFsyXSA8PCAxNikKLQkgICAgIHwgKGJ5dGVzLT5yX2luZGV4WzFdIDw8IDgpCi0JICAgICB8ICBieXRlcy0+cl9pbmRleFswXTsKLSAgICByX2V4dGVybiA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotICAgIHJfdHlwZSAgID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRSkKLQkJCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRTsKLSAgfQotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSAgaG93dG9fdGFibGVfZXh0ICsgcl90eXBlOwotCi0gIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgc3ltYm9sIHRhYmxlLAotICAgICByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHJfZXh0ZXJuLiAgcl9leHRlcm4ganVzdCByZWZsZWN0cwotICAgICB3aGV0aGVyIHRoZSBzeW1ib2wgdGhlIHJlbG9jIGlzIGFnYWluc3QgaXMgbG9jYWwgb3IgZ2xvYmFsLiAgKi8KLSAgaWYgKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0gICAgcl9leHRlcm4gPSAxOwotCi0gIGlmIChyX2V4dGVybiAmJiByX2luZGV4ID4gc3ltY291bnQpCi0gICAgewotICAgICAgLyogV2UgY291bGQgYXJyYW5nZSB0byByZXR1cm4gYW4gZXJyb3IsIGJ1dCBpdCBtaWdodCBiZSB1c2VmdWwKLSAgICAgICAgIHRvIHNlZSB0aGUgZmlsZSBldmVuIGlmIGl0IGlzIGJhZC4gICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gTl9BQlM7Ci0gICAgfQotCi0gIE1PVkVfQUREUkVTUyhHRVRfU1dPUkQoYWJmZCwgYnl0ZXMtPnJfYWRkZW5kKSk7Ci19Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotewotICB1bnNpZ25lZCBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9iYXNlcmVsLCByX2ptcHRhYmxlLCByX3JlbGF0aXZlOwotICBzdHJ1Y3QgYW91dGRhdGEgICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLSAgdW5zaWduZWQgaW50IGhvd3RvX2lkeDsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMF0gPDwgMTYpCi0gICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCXwgIGJ5dGVzLT5yX2luZGV4WzJdOwotICAgIHJfZXh0ZXJuICA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICAgIHJfcGNyZWwgICA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gICAgcl9iYXNlcmVsID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRykpOwotICAgIHJfam1wdGFibGU9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKSk7Ci0gICAgcl9yZWxhdGl2ZT0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcpKTsKLSAgICByX2xlbmd0aCAgPSAgICAgICAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0gICAgICAJCQk+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHOwotICB9IGVsc2UgewotICAgIHJfaW5kZXggPSAgKGJ5dGVzLT5yX2luZGV4WzJdIDw8IDE2KQotICAgICAgfCAoYnl0ZXMtPnJfaW5kZXhbMV0gPDwgOCkKLQl8ICBieXRlcy0+cl9pbmRleFswXTsKLSAgICByX2V4dGVybiAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgICByX3BjcmVsICAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotICAgIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpKTsKLSAgICByX2ptcHRhYmxlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSkpOwotICAgIHJfcmVsYXRpdmU9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFKSk7Ci0gICAgcl9sZW5ndGggID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotICAgICAgCQkJPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRTsKLSAgfQotCi0gIGhvd3RvX2lkeCA9IHJfbGVuZ3RoICsgNCAqIHJfcGNyZWwgKyA4ICogcl9iYXNlcmVsCi0JICAgICAgKyAxNiAqIHJfam1wdGFibGUgKyAzMiAqIHJfcmVsYXRpdmU7Ci0gIEJGRF9BU1NFUlQgKGhvd3RvX2lkeCA8IFRBQkxFX1NJWkUgKGhvd3RvX3RhYmxlX3N0ZCkpOwotICBjYWNoZV9wdHItPmhvd3RvID0gIGhvd3RvX3RhYmxlX3N0ZCArIGhvd3RvX2lkeDsKLSAgQkZEX0FTU0VSVCAoY2FjaGVfcHRyLT5ob3d0by0+dHlwZSAhPSAodW5zaWduZWQgaW50KSAtMSk7Ci0KLSAgLyogQmFzZSByZWxhdGl2ZSByZWxvY3MgYXJlIGFsd2F5cyBhZ2FpbnN0IHRoZSBzeW1ib2wgdGFibGUsCi0gICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2Ygcl9leHRlcm4uICByX2V4dGVybiBqdXN0IHJlZmxlY3RzCi0gICAgIHdoZXRoZXIgdGhlIHN5bWJvbCB0aGUgcmVsb2MgaXMgYWdhaW5zdCBpcyBsb2NhbCBvciBnbG9iYWwuICAqLwotICBpZiAocl9iYXNlcmVsKQotICAgIHJfZXh0ZXJuID0gMTsKLQotICBpZiAocl9leHRlcm4gJiYgcl9pbmRleCA+IHN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGFycmFuZ2UgdG8gcmV0dXJuIGFuIGVycm9yLCBidXQgaXQgbWlnaHQgYmUgdXNlZnVsCi0gICAgICAgICB0byBzZWUgdGhlIGZpbGUgZXZlbiBpZiBpdCBpcyBiYWQuICAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IE5fQUJTOwotICAgIH0KLQotICBNT1ZFX0FERFJFU1MoMCk7Ci19Ci0KLS8qIFJlYWQgYW5kIHN3YXAgdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBQVFIgcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfZHJzaXplOwotICBlbHNlIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX3Ryc2l6ZTsKLSAgZWxzZSBpZiAoYXNlY3QgPT0gb2JqX2Jzc3NlYyAoYWJmZCkpCi0gICAgcmVsb2Nfc2l6ZSA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFzZWN0LT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICBjb3VudCA9IHJlbG9jX3NpemUgLyBlYWNoX3NpemU7Ci0KLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0gIGlmIChyZWxvY19jYWNoZSA9PSBOVUxMICYmIGNvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1zZXQgKHJlbG9jX2NhY2hlLCAwLCBjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jcyA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NzID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkIChyZWxvY3MsIDEsIHJlbG9jX3NpemUsIGFiZmQpICE9IHJlbG9jX3NpemUpCi0gICAgewotICAgICAgZnJlZSAocmVsb2NzKTsKLSAgICAgIGZyZWUgKHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7Ci0gIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcnB0ciA9Ci0JKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2NzOwotCi0gICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0JTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgcnB0ciwgY2FjaGVfcHRyLCBzeW1ib2xzLAotCQkJCSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpycHRyID0KLQkoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvY3M7Ci0KLSAgICAgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLQlNWV9zd2FwX3N0ZF9yZWxvY19pbiAoYWJmZCwgcnB0ciwgY2FjaGVfcHRyLCBzeW1ib2xzLAotCQkJICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotICAgIH0KLQotICBmcmVlIChyZWxvY3MpOwotCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNhY2hlX3B0ciAtIHJlbG9jX2NhY2hlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSByZWxvY2F0aW9uIHNlY3Rpb24gaW50byBhbiBvYmplY3QgZmlsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICB1bnNpZ25lZCBjaGFyICpuYXRpdmUsICpuYXRwdHI7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0KLSAgdW5zaWduZWQgaW50IGNvdW50ID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIHNpemVfdCBuYXRzaXplOwotCi0gIGlmIChjb3VudCA9PSAwIHx8IHNlY3Rpb24tPm9yZWxvY2F0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotICBuYXRzaXplID0gZWFjaF9zaXplICogY291bnQ7Ci0gIG5hdGl2ZSA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKGFiZmQsIG5hdHNpemUpOwotICBpZiAoIW5hdGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2VuZXJpYyA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCi0gIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCi0gICAgewotICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0JICAgY291bnQgIT0gMDsKLQkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0JTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKW5hdHB0cik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0JICAgY291bnQgIT0gMDsKLQkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0JTVlfc3dhcF9zdGRfcmVsb2Nfb3V0KGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKW5hdHB0cik7Ci0gICAgfQotCi0gIGlmICggYmZkX3dyaXRlICgoUFRSKSBuYXRpdmUsIDEsIG5hdHNpemUsIGFiZmQpICE9IG5hdHNpemUpIHsKLSAgICBiZmRfcmVsZWFzZShhYmZkLCBuYXRpdmUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBiZmRfcmVsZWFzZSAoYWJmZCwgbmF0aXZlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBzdHVwaWQuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBhIGJvb2xlYW4gcHJlZGljYXRlICovCi1sb25nCi1OQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICAqcmVscHRyID0gTlVMTDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoISh0YmxwdHIgfHwgTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKShhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50ICsrKSB7Ci0gICAgICAqcmVscHRyICsrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0gICAgICB7Ci0JKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgICB9Ci0gIH0KLSAgKnJlbHB0ciA9IDA7Ci0KLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi1sb25nCi1OQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIHJldHVybiAoc2l6ZW9mIChhcmVsZW50ICopICogKGFzZWN0LT5yZWxvY19jb3VudCsxKSk7Ci0gIH0KLQotICBpZiAoYXNlY3QgPT0gb2JqX2RhdGFzZWMgKGFiZmQpKQotICAgIHJldHVybiAoc2l6ZW9mIChhcmVsZW50ICopCi0JICAgICogKChleGVjX2hkcihhYmZkKS0+YV9kcnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpCi0JICAgICAgICsgMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgcmV0dXJuIChzaXplb2YgKGFyZWxlbnQgKikKLQkgICAgKiAoKGV4ZWNfaGRyKGFiZmQpLT5hX3Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSkKLQkgICAgICAgKyAxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiBzaXplb2YgKGFyZWxlbnQgKik7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiAwOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAtMTsKLX0KLQotDAotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkrMSkgKiAoc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlICopKTsKLX0KLQotLypBUkdTVVNFRCovCi0gYWxlbnQgKgotTkFNRShhb3V0LGdldF9saW5lbm8pIChpZ25vcmVfYWJmZCwgaWdub3JlX3N5bWJvbCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICppZ25vcmVfc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAoYWxlbnQgKilOVUxMOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLU5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLQotICBpZiAocmV0LT50eXBlID09ICc/JykKLSAgICB7Ci0gICAgICBpbnQgdHlwZV9jb2RlID0gYW91dF9zeW1ib2woc3ltYm9sKS0+dHlwZSAmIDB4ZmY7Ci0gICAgICBjb25zdCBjaGFyICpzdGFiX25hbWUgPSBiZmRfZ2V0X3N0YWJfbmFtZSAodHlwZV9jb2RlKTsKLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMF07Ci0KLSAgICAgIGlmIChzdGFiX25hbWUgPT0gTlVMTCkKLQl7Ci0JICBzcHJpbnRmKGJ1ZiwgIiglZCkiLCB0eXBlX2NvZGUpOwotCSAgc3RhYl9uYW1lID0gYnVmOwotCX0KLSAgICAgIHJldC0+dHlwZSA9ICctJzsKLSAgICAgIHJldC0+c3RhYl90eXBlID0gdHlwZV9jb2RlOwotICAgICAgcmV0LT5zdGFiX290aGVyID0gKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5vdGhlciAmIDB4ZmYpOwotICAgICAgcmV0LT5zdGFiX2Rlc2MgPSAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPmRlc2MgJiAweGZmZmYpOwotICAgICAgcmV0LT5zdGFiX25hbWUgPSBzdGFiX25hbWU7Ci0gICAgfQotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLU5BTUUoYW91dCxwcmludF9zeW1ib2wpIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKilhZmlsZTsKLQotICBzd2l0Y2ggKGhvdykgewotICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICBpZiAoc3ltYm9sLT5uYW1lKQotICAgICAgZnByaW50ZihmaWxlLCIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgIGZwcmludGYoZmlsZSwiJTR4ICUyeCAlMngiLCh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZiksCi0JICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKSwKLQkgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT50eXBlKSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgewotICAgQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uLT5uYW1lOwotCi0KLSAgICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoKFBUUilmaWxlLHN5bWJvbCk7Ci0KLSAgICAgIGZwcmludGYoZmlsZSwiICUtNXMgJTA0eCAlMDJ4ICUwMngiLAotCSAgICAgIHNlY3Rpb25fbmFtZSwKLQkgICAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPmRlc2MgJiAweGZmZmYpLAotCSAgICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKSwKLQkgICAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUgICYgMHhmZikpOwotICAgICAgaWYgKHN5bWJvbC0+bmFtZSkKLSAgICAgICAgZnByaW50ZihmaWxlLCIgJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotfQotCi0vKiBJZiB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiAxTUIgdG8gaG9sZCB0aGUgZ2VuZXJpYwotICAgc3ltYm9scywgd2UgdXNlIHRoZSBnZW5lcmljIG1pbmlzeW1ib2wgbWV0aG9yZDogaXQncyBmYXN0ZXIsIHNpbmNlCi0gICBpdCBvbmx5IHRyYW5zbGF0ZXMgdGhlIHN5bWJvbHMgb25jZSwgbm90IG11bHRpcGxlIHRpbWVzLiAgKi8KLSNkZWZpbmUgTUlOSVNZTV9USFJFU0hPTEQgKDEwMDAwMDAgLyBzaXplb2YgKGFzeW1ib2wpKQotCi0vKiBSZWFkIG1pbmlzeW1ib2xzLiAgRm9yIG1pbmlzeW1ib2xzLCB3ZSB1c2UgdGhlIHVubW9kaWZpZWQgYS5vdXQKLSAgIHN5bWJvbHMuICBUaGUgbWluaXN5bWJvbF90b19zeW1ib2wgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGVzZSBpbnRvCi0gICBCRkQgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KLQotbG9uZwotTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSICptaW5pc3ltc3A7Ci0gICAgIHVuc2lnbmVkIGludCAqc2l6ZXA7Ci17Ci0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGhhbmRsZSB0aGUgZHluYW1pYyBzeW1ib2xzIGhlcmUgYXMgd2VsbCwgYnV0IGl0J3MKLSAgICAgICAgIGVhc2llciB0byBoYW5kIHRoZW0gb2ZmLiAgKi8KLSAgICAgIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7Ci0gICAgfQotCi0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKSA8IE1JTklTWU1fVEhSRVNIT0xEKQotICAgIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7Ci0KLSAgKm1pbmlzeW1zcCA9IChQVFIpIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotCi0gIC8qIEJ5IHBhc3NpbmcgdGhlIGV4dGVybmFsIHN5bWJvbHMgYmFjayBmcm9tIHRoaXMgcm91dGluZSwgd2UgYXJlCi0gICAgIGdpdmluZyB1cCBjb250cm9sIG92ZXIgdGhlIG1lbW9yeSBibG9jay4gIENsZWFyCi0gICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMsIHNvIHRoYXQgd2UgZG8gbm90IHRyeSB0byBmcmVlIGl0Ci0gICAgIG91cnNlbHZlcy4gICovCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLQotICAqc2l6ZXAgPSBFWFRFUk5BTF9OTElTVF9TSVpFOwotICByZXR1cm4gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLX0KLQotLyogQ29udmVydCBhIG1pbmlzeW1ib2wgdG8gYSBCRkQgYXN5bWJvbC4gIEEgbWluaXN5bWJvbCBpcyBqdXN0IGFuCi0gICB1bm1vZGlmaWVkIGEub3V0IHN5bWJvbC4gIFRoZSBTWU0gYXJndW1lbnQgaXMgYSBzdHJ1Y3R1cmUgcmV0dXJuZWQKLSAgIGJ5IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCwgd2hpY2ggd2UgZmlsbCBpbiBoZXJlLiAgKi8KLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBjb25zdCBQVFIgbWluaXN5bTsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpZiAoZHluYW1pYwotICAgICAgfHwgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKSA8IE1JTklTWU1fVEhSRVNIT0xEKQotICAgIHJldHVybiBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSk7Ci0KLSAgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpOwotCi0gIC8qIFdlIGNhbGwgdHJhbnNsYXRlX3N5bWJvbF90YWJsZSB0byB0cmFuc2xhdGUgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLSAgaWYgKCEgKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKQotCSAoYWJmZCwKLQkgIChhb3V0X3N5bWJvbF90eXBlICopIHN5bSwKLQkgIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgbWluaXN5bSwKLQkgIChiZmRfc2l6ZV90eXBlKSAxLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCksCi0JICBmYWxzZSkpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBzeW07Ci19Ci0KLS8qCi0gcHJvdmlkZWQgYSBCRkQsIGEgc2VjdGlvbiBhbmQgYW4gb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24sIGNhbGN1bGF0ZQotIGFuZCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGFuZCB0aGUgbGluZSBuZWFyZXN0IHRvIHRoZQotIHdhbnRlZCBsb2NhdGlvbi4KLSovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkKLSAgICAgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgLyogUnVuIGRvd24gdGhlIGZpbGUgbG9va2luZyBmb3IgdGhlIGZpbGVuYW1lLCBmdW5jdGlvbiBhbmQgbGluZW51bWJlciAqLwotICBhc3ltYm9sICoqcDsKLSAgQ09OU1QgY2hhciAqZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotICBDT05TVCBjaGFyICptYWluX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gIENPTlNUIGNoYXIgKmN1cnJlbnRfZmlsZV9uYW1lID0gTlVMTDsKLSAgQ09OU1QgY2hhciAqbGluZV9maWxlX25hbWUgPSBOVUxMOyAvKiBWYWx1ZSBvZiBjdXJyZW50X2ZpbGVfbmFtZSBhdCBsaW5lIG51bWJlci4gKi8KLSAgQ09OU1QgY2hhciAqbGluZV9kaXJlY3RvcnlfbmFtZSA9IE5VTEw7IC8qIFZhbHVlIG9mIGRpcmVjdG9yeV9uYW1lIGF0IGxpbmUgbnVtYmVyLiAqLwotICBiZmRfdm1hIGxvd19saW5lX3ZtYSA9IDA7Ci0gIGJmZF92bWEgbG93X2Z1bmNfdm1hID0gMDsKLSAgYXN5bWJvbCAqZnVuYyA9IDA7Ci0gIHNpemVfdCBmaWxlbGVuLCBmdW5jbGVuOwotICBjaGFyICpidWY7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGFiZmQtPmZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IDA7Ci0gICpsaW5lX3B0ciA9IDA7Ci0gIGlmIChzeW1ib2xzICE9IChhc3ltYm9sICoqKU5VTEwpIHsKLSAgICBmb3IgKHAgPSBzeW1ib2xzOyAqcDsgcCsrKSB7Ci0gICAgICBhb3V0X3N5bWJvbF90eXBlICAqcSA9IChhb3V0X3N5bWJvbF90eXBlICopKCpwKTsKLSAgICBuZXh0OgotICAgICAgc3dpdGNoIChxLT50eXBlKXsKLSAgICAgIGNhc2UgTl9URVhUOgotCS8qIElmIHRoaXMgbG9va3MgbGlrZSBhIGZpbGUgbmFtZSBzeW1ib2wsIGFuZCBpdCBjb21lcyBhZnRlcgotICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2UgaGF2ZSBmb3VuZCBzbyBmYXIsIGJ1dCBiZWZvcmUgdGhlCi0gICAgICAgICAgIG9mZnNldCwgdGhlbiB3ZSBoYXZlIHByb2JhYmx5IG5vdCBmb3VuZCB0aGUgcmlnaHQgbGluZQotICAgICAgICAgICBudW1iZXIuICAqLwotCWlmIChxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0Ci0JICAgICYmICgocS0+c3ltYm9sLnZhbHVlID4gbG93X2xpbmVfdm1hCi0JCSAmJiAobGluZV9maWxlX25hbWUgIT0gTlVMTAotCQkgICAgIHx8ICpsaW5lX3B0ciAhPSAwKSkKLQkJfHwgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19mdW5jX3ZtYQotCQkgICAgJiYgZnVuYyAhPSBOVUxMKSkpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnN5bW5hbWU7Ci0KLQkgICAgc3ltbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCSAgICBpZiAoc3RyY21wIChzeW1uYW1lICsgc3RybGVuIChzeW1uYW1lKSAtIDIsICIubyIpID09IDApCi0JICAgICAgewotCQlpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2xpbmVfdm1hKQotCQkgIHsKLQkJICAgICpsaW5lX3B0ciA9IDA7Ci0JCSAgICBsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7Ci0JCSAgfQotCQlpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2Z1bmNfdm1hKQotCQkgIGZ1bmMgPSBOVUxMOwotCSAgICAgIH0KLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSBOX1NPOgotCS8qIElmIHRoaXMgc3ltYm9sIGlzIGxlc3MgdGhhbiB0aGUgb2Zmc2V0LCBidXQgZ3JlYXRlciB0aGFuCi0gICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3ZSBoYXZlIGZvdW5kIHNvIGZhciwgdGhlbiB3ZSBoYXZlIG5vdAotICAgICAgICAgICBmb3VuZCB0aGUgcmlnaHQgbGluZSBudW1iZXIuICAqLwotCWlmIChxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgewotCSAgICBpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2xpbmVfdm1hKQotCSAgICAgIHsKLQkJKmxpbmVfcHRyID0gMDsKLQkJbGluZV9maWxlX25hbWUgPSBOVUxMOwotCSAgICAgIH0KLQkgICAgaWYgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19mdW5jX3ZtYSkKLQkgICAgICBmdW5jID0gTlVMTDsKLQkgIH0KLQotCW1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPSBxLT5zeW1ib2wubmFtZTsKLQkvKiBMb29rIGFoZWFkIHRvIG5leHQgc3ltYm9sIHRvIGNoZWNrIGlmIHRoYXQgdG9vIGlzIGFuIE5fU08uICovCi0JcCsrOwotCWlmICgqcCA9PSBOVUxMKQotCSAgYnJlYWs7Ci0JcSA9IChhb3V0X3N5bWJvbF90eXBlICopKCpwKTsKLQlpZiAocS0+dHlwZSAhPSAoaW50KU5fU08pCi0JICBnb3RvIG5leHQ7Ci0KLQkvKiBGb3VuZCBhIHNlY29uZCBOX1NPICBGaXJzdCBpcyBkaXJlY3Rvcnk7IHNlY29uZCBpcyBmaWxlbmFtZS4gKi8KLQlkaXJlY3RvcnlfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOwotCW1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPSBxLT5zeW1ib2wubmFtZTsKLQlpZiAob2JqX3RleHRzZWMoYWJmZCkgIT0gc2VjdGlvbikKLQkgIGdvdG8gZG9uZTsKLQlicmVhazsKLSAgICAgIGNhc2UgTl9TT0w6Ci0JY3VycmVudF9maWxlX25hbWUgPSBxLT5zeW1ib2wubmFtZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBOX1NMSU5FOgotCi0gICAgICBjYXNlIE5fRFNMSU5FOgotICAgICAgY2FzZSBOX0JTTElORToKLQkvKiBXZSdsbCBrZWVwIHRoaXMgaWYgaXQgcmVzb2x2ZXMgbmVhcmVyIHRoYW4gdGhlIG9uZSB3ZSBoYXZlCi0gICAgICAgICAgIGFscmVhZHkuICAqLwotCWlmIChxLT5zeW1ib2wudmFsdWUgPj0gbG93X2xpbmVfdm1hCi0JICAgICYmIHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCi0JICB7Ci0JICAgICpsaW5lX3B0ciA9IHEtPmRlc2M7Ci0JICAgIGxvd19saW5lX3ZtYSA9IHEtPnN5bWJvbC52YWx1ZTsKLQkgICAgbGluZV9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKLQkgICAgbGluZV9kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgfQotCWJyZWFrOwotICAgICAgY2FzZSBOX0ZVTjoKLQl7Ci0JICAvKiBXZSdsbCBrZWVwIHRoaXMgaWYgaXQgaXMgbmVhcmVyIHRoYW4gdGhlIG9uZSB3ZSBoYXZlIGFscmVhZHkgKi8KLQkgIGlmIChxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmNfdm1hICYmCi0JICAgICAgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkgewotCSAgICBsb3dfZnVuY192bWEgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIGZ1bmMgPSAoYXN5bWJvbCAqKXE7Ci0JICB9Ci0JICBlbHNlIGlmIChxLT5zeW1ib2wudmFsdWUgPiBvZmZzZXQpCi0JICAgIGdvdG8gZG9uZTsKLQl9Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSBkb25lOgotICBpZiAoKmxpbmVfcHRyICE9IDApCi0gICAgewotICAgICAgbWFpbl9maWxlX25hbWUgPSBsaW5lX2ZpbGVfbmFtZTsKLSAgICAgIGRpcmVjdG9yeV9uYW1lID0gbGluZV9kaXJlY3RvcnlfbmFtZTsKLSAgICB9Ci0KLSAgaWYgKG1haW5fZmlsZV9uYW1lID09IE5VTEwKLSAgICAgIHx8IG1haW5fZmlsZV9uYW1lWzBdID09ICcvJwotICAgICAgfHwgZGlyZWN0b3J5X25hbWUgPT0gTlVMTCkKLSAgICBmaWxlbGVuID0gMDsKLSAgZWxzZQotICAgIGZpbGVsZW4gPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKSArIHN0cmxlbiAobWFpbl9maWxlX25hbWUpOwotICBpZiAoZnVuYyA9PSBOVUxMKQotICAgIGZ1bmNsZW4gPSAwOwotICBlbHNlCi0gICAgZnVuY2xlbiA9IHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoZnVuYykpOwotCi0gIGlmIChhZGF0YSAoYWJmZCkubGluZV9idWYgIT0gTlVMTCkKLSAgICBmcmVlIChhZGF0YSAoYWJmZCkubGluZV9idWYpOwotICBpZiAoZmlsZWxlbiArIGZ1bmNsZW4gPT0gMCkKLSAgICBhZGF0YSAoYWJmZCkubGluZV9idWYgPSBidWYgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoZmlsZWxlbiArIGZ1bmNsZW4gKyAzKTsKLSAgICAgIGFkYXRhIChhYmZkKS5saW5lX2J1ZiA9IGJ1ZjsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChtYWluX2ZpbGVfbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChtYWluX2ZpbGVfbmFtZVswXSA9PSAnLycgfHwgZGlyZWN0b3J5X25hbWUgPT0gTlVMTCkKLQkqZmlsZW5hbWVfcHRyID0gbWFpbl9maWxlX25hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgc3ByaW50ZiAoYnVmLCAiJXMlcyIsIGRpcmVjdG9yeV9uYW1lLCBtYWluX2ZpbGVfbmFtZSk7Ci0JICAqZmlsZW5hbWVfcHRyID0gYnVmOwotCSAgYnVmICs9IGZpbGVsZW4gKyAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb24gPSBmdW5jLT5uYW1lOwotICAgICAgY2hhciAqcDsKLQotICAgICAgLyogVGhlIGNhbGxlciBleHBlY3RzIGEgc3ltYm9sIG5hbWUuICBXZSBhY3R1YWxseSBoYXZlIGEKLQkgZnVuY3Rpb24gbmFtZSwgd2l0aG91dCB0aGUgbGVhZGluZyB1bmRlcnNjb3JlLiAgUHV0IHRoZQotCSB1bmRlcnNjb3JlIGJhY2sgaW4sIHNvIHRoYXQgdGhlIGNhbGxlciBnZXRzIGEgc3ltYm9sIG5hbWUuICAqLwotICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gJ1wwJykKLQlzdHJjcHkgKGJ1ZiwgZnVuY3Rpb24pOwotICAgICAgZWxzZQotCXsKLQkgIGJ1ZlswXSA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0JICBzdHJjcHkgKGJ1ZiArIDEsIGZ1bmN0aW9uKTsKLQl9Ci0gICAgICAvKiBIYXZlIHRvIHJlbW92ZSA6IHN0dWZmICovCi0gICAgICBwID0gc3RyY2hyIChidWYsICc6Jyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotCSpwID0gJ1wwJzsKLSAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gYnVmOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTVVNFRCovCi1pbnQKLU5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykgKGFiZmQsIGV4ZWNhYmxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZXhlY2FibGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLX0KLQotLyogRnJlZSBhbGwgaW5mb3JtYXRpb24gd2UgaGF2ZSBjYWNoZWQgZm9yIHRoaXMgQkZELiAgV2UgY2FuIGFsd2F5cwotICAgcmVhZCBpdCBhZ2FpbiBsYXRlciBpZiB3ZSBuZWVkIGl0LiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbzsKLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNkZWZpbmUgQkZDSV9GUkVFKHgpIGlmICh4ICE9IE5VTEwpIHsgZnJlZSAoeCk7IHggPSBOVUxMOyB9Ci0gIEJGQ0lfRlJFRSAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkpOwotI2lmZGVmIFVTRV9NTUFQCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gMDsKLSAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCkpOwotICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSk7Ci0gIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID0gMDsKLSNlbHNlCi0gIEJGQ0lfRlJFRSAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotICBCRkNJX0ZSRUUgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpKTsKLSNlbmRpZgotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgQkZDSV9GUkVFIChvLT5yZWxvY2F0aW9uKTsKLSN1bmRlZiBCRkNJX0ZSRUUKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIGEub3V0IGxpbmsgY29kZS4gICovCi0KLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPndyaXR0ZW4gPSBmYWxzZTsKLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgcmV0dXJuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAocmV0LCBhYmZkLAotCQkJCQkgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSkpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBHaXZlbiBhbiBhLm91dCBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gYW91dF9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JKGFiZmQsIGluZm8sIGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gYS5vdXQgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBhb3V0X2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIGEgc2luZ2xlIGFyY2hpdmUgZWxlbWVudCB0byBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluCi0gICB0aGUgbGluay4gICpQTkVFREVEIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIGVsZW1lbnQgaXMKLSAgIG5lZWRlZCBpbiB0aGUgbGluayBvciBub3QuICBUaGlzIGlzIGNhbGxlZCBmcm9tCi0gICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgISAqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGcmVlIHVwIHRoZSBpbnRlcm5hbCBzeW1ib2xzIHJlYWQgZnJvbSBhbiBhLm91dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19mcmVlX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSNlbHNlCi0gICAgICBmcmVlICgoUFRSKSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSk7Ci0jZW5kaWYKLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMOwotICAgIH0KLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpICE9IChjaGFyICopIE5VTEwpCi0gICAgewotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSk7Ci0jZWxzZQotICAgICAgZnJlZSAoKFBUUikgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkpOwotI2VuZGlmCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IChjaGFyICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBpbnRlcm5hbCBzeW1ib2xzIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBmaWxlIHNob3VsZAotICAgYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBXZSBzaG91bGQgaW5jbHVkZSB0aGlzIG9iamVjdCBmaWxlIGlmIGl0Ci0gICBkZWZpbmVzIGFueSBzeW1ib2xzIHdoaWNoIGFyZSBjdXJyZW50bHkgdW5kZWZpbmVkLiAgSWYgdGhpcyBvYmplY3QKLSAgIGZpbGUgZGVmaW5lcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4gd2UgbWF5IGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUKLSAgIGtub3duIHN5bWJvbCBidXQgd2UgZG8gbm90IGluY2x1ZGUgdGhlIG9iamVjdCBmaWxlIGluIHRoZSBsaW5rCi0gICAodW5sZXNzIHRoZXJlIGlzIHNvbWUgb3RoZXIgcmVhc29uIHRvIGluY2x1ZGUgaXQpLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICByZWdpc3RlciBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnA7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqcGVuZDsKLSAgY2hhciAqc3RyaW5nczsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMuICAqLwotICBwID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIHBlbmQgPSBwICsgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpOwotICBmb3IgKDsgcCA8IHBlbmQ7IHArKykKLSAgICB7Ci0gICAgICBpbnQgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBwLT5lX3R5cGUpOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBJZ25vcmUgc3ltYm9scyB0aGF0IGFyZSBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLiAgVGhpcyBpcyBhbgotCSBvcHRpbWl6YXRpb24gb25seSwgYXMgd2UgY2hlY2sgdGhlIHR5cGUgbW9yZSB0aG9yb3VnaGx5Ci0JIGJlbG93LiAgKi8KLSAgICAgIGlmICgoKHR5cGUgJiBOX0VYVCkgPT0gMAotCSAgIHx8ICh0eXBlICYgTl9TVEFCKSAhPSAwCi0JICAgfHwgdHlwZSA9PSBOX0ZOKQotCSAgJiYgdHlwZSAhPSBOX1dFQUtBCi0JICAmJiB0eXBlICE9IE5fV0VBS1QKLQkgICYmIHR5cGUgIT0gTl9XRUFLRAotCSAgJiYgdHlwZSAhPSBOX1dFQUtCKQotCXsKLQkgIGlmICh0eXBlID09IE5fV0FSTklORwotCSAgICAgIHx8IHR5cGUgPT0gTl9JTkRSKQotCSAgICArK3A7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGFiZmQsIHAtPmVfc3RyeCk7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc3ltYm9scyB0aGF0IGFyZSBjdXJyZW50bHkKLQkgdW5kZWZpbmVkIG9yIGNvbW1vbi4gICovCi0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgfHwgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKSkKLQl7Ci0JICBpZiAodHlwZSA9PSAoTl9JTkRSIHwgTl9FWFQpKQotCSAgICArK3A7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICh0eXBlID09IChOX1RFWFQgfCBOX0VYVCkKLQkgIHx8IHR5cGUgPT0gKE5fREFUQSB8IE5fRVhUKQotCSAgfHwgdHlwZSA9PSAoTl9CU1MgfCBOX0VYVCkKLQkgIHx8IHR5cGUgPT0gKE5fQUJTIHwgTl9FWFQpCi0JICB8fCB0eXBlID09IChOX0lORFIgfCBOX0VYVCkpCi0JewotCSAgLyogVGhpcyBvYmplY3QgZmlsZSBkZWZpbmVzIHRoaXMgc3ltYm9sLiAgV2UgbXVzdCBsaW5rIGl0Ci0JICAgICBpbi4gIFRoaXMgaXMgdHJ1ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGN1cnJlbnQKLQkgICAgIGRlZmluaXRpb24gb2YgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgb3IgY29tbW9uLiAgSWYgdGhlCi0JICAgICBjdXJyZW50IGRlZmluaXRpb24gaXMgY29tbW9uLCB3ZSBoYXZlIGEgY2FzZSBpbiB3aGljaCB3ZQotCSAgICAgaGF2ZSBhbHJlYWR5IHNlZW4gYW4gb2JqZWN0IGZpbGUgaW5jbHVkaW5nCi0JICAgICAgICAgaW50IGE7Ci0JICAgICBhbmQgdGhpcyBvYmplY3QgZmlsZSBmcm9tIHRoZSBhcmNoaXZlIGluY2x1ZGVzCi0JICAgICAgICAgaW50IGEgPSA1OwotCSAgICAgSW4gc3VjaCBhIGNhc2Ugd2UgbXVzdCBpbmNsdWRlIHRoaXMgb2JqZWN0IGZpbGUuCi0KLQkgICAgIEZJWE1FOiBUaGUgU3VuT1MgNC4xLjMgbGlua2VyIHdpbGwgcHVsbCBpbiB0aGUgYXJjaGl2ZQotCSAgICAgZWxlbWVudCBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIC5kYXRhIHNlY3Rpb24sCi0JICAgICBidXQgbm90IGlmIGl0IGlzIGRlZmluZWQgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBUaGF0Ci0JICAgICBzZWVtcyBhIGJpdCBjcmF6eSB0byBtZSwgYW5kIEkgaGF2ZW4ndCBpbXBsZW1lbnRlZCBpdC4KLQkgICAgIEhvd2V2ZXIsIGl0IG1pZ2h0IGJlIGNvcnJlY3QuICAqLwotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKnBuZWVkZWQgPSB0cnVlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBpZiAodHlwZSA9PSAoTl9VTkRGIHwgTl9FWFQpKQotCXsKLQkgIGJmZF92bWEgdmFsdWU7Ci0KLQkgIHZhbHVlID0gR0VUX1dPUkQgKGFiZmQsIHAtPmVfdmFsdWUpOwotCSAgaWYgKHZhbHVlICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBjb21tb24gaW4gdGhlIG9iamVjdCBmcm9tIHRoZSBhcmNoaXZlCi0JCSBmaWxlLiAgKi8KLQkgICAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkJewotCQkgIGJmZCAqc3ltYmZkOwotCQkgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCQkgIHN5bWJmZCA9IGgtPnUudW5kZWYuYWJmZDsKLQkJICBpZiAoc3ltYmZkID09IChiZmQgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBzeW1ib2wgd2FzIGNyZWF0ZWQgYXMgdW5kZWZpbmVkIGZyb20KLQkJCSBvdXRzaWRlIEJGRC4gIFdlIGFzc3VtZSB0aGF0IHdlIHNob3VsZCBsaW5rCi0JCQkgaW4gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpcyBkb25lIGZvciB0aGUgLXUKLQkJCSBvcHRpb24gaW4gdGhlIGxpbmtlci4gICovCi0JCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywKLQkJCQkJCQkJICAgICBhYmZkLAotCQkJCQkJCQkgICAgIG5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JCSAgICAgIHJldHVybiB0cnVlOwotCQkgICAgfQotCQkgIC8qIFR1cm4gdGhlIGN1cnJlbnQgbGluayBzeW1ib2wgaW50byBhIGNvbW1vbgotCQkgICAgIHN5bWJvbC4gIEl0IGlzIGFscmVhZHkgb24gdGhlIHVuZGVmcyBsaXN0LiAgKi8KLQkJICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9jb21tb247Ci0JCSAgaC0+dS5jLnAgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSAqKQotCQkJICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkgIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5KSkpOwotCQkgIGlmIChoLT51LmMucCA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgaC0+dS5jLnNpemUgPSB2YWx1ZTsKLQotCQkgIC8qIEZJWE1FOiBUaGlzIGlzbid0IHF1aXRlIHJpZ2h0LiAgVGhlIG1heGltdW0KLQkJICAgICBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sIHNob3VsZCBiZSBzZXQgYnkgdGhlCi0JCSAgICAgYXJjaGl0ZWN0dXJlIG9mIHRoZSBvdXRwdXQgZmlsZSwgbm90IG9mIHRoZSBpbnB1dAotCQkgICAgIGZpbGUuICAqLwotCQkgIHBvd2VyID0gYmZkX2xvZzIgKHZhbHVlKTsKLQkJICBpZiAocG93ZXIgPiBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXIpCi0JCSAgICBwb3dlciA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKLQkJICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7Ci0KLQkJICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3ltYmZkLAotCQkJCQkJCQkiQ09NTU9OIik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGNvbW1vbiBzeW1ib2wgaWYKLQkJICAgICBuZWNlc3NhcnkuICAqLwotCQkgIGlmICh2YWx1ZSA+IGgtPnUuYy5zaXplKQotCQkgICAgaC0+dS5jLnNpemUgPSB2YWx1ZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodHlwZSA9PSBOX1dFQUtBCi0JICB8fCB0eXBlID09IE5fV0VBS1QKLQkgIHx8IHR5cGUgPT0gTl9XRUFLRAotCSAgfHwgdHlwZSA9PSBOX1dFQUtCKQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGlzIHdlYWsgYnV0IGRlZmluZWQuICBXZSBtdXN0IHB1bGwgaXQgaW4gaWYKLQkgICAgIHRoZSBjdXJyZW50IGxpbmsgc3ltYm9sIGlzIHVuZGVmaW5lZCwgYnV0IHdlIGRvbid0IHdhbnQKLQkgICAgIGl0IGlmIHRoZSBjdXJyZW50IGxpbmsgc3ltYm9sIGlzIGNvbW1vbi4gICovCi0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGFsbCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuICgqYWRkX29uZV9zeW1ib2wpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCSAgICAgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkJCQkgICAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwKLQkJCQkgICAgIGJvb2xlYW4sCi0JCQkJICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIGJmZF9zaXplX3R5cGUgc3ltX2NvdW50OwotICBjaGFyICpzdHJpbmdzOwotICBib29sZWFuIGNvcHk7Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICByZWdpc3RlciBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnA7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqcGVuZDsKLQotICBzeW1zID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCk7Ci0gIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKTsKLSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotICAgIGNvcHkgPSBmYWxzZTsKLSAgZWxzZQotICAgIGNvcHkgPSB0cnVlOwotCi0gIGlmIChhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmFkZF9keW5hbWljX3N5bWJvbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCphb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmFkZF9keW5hbWljX3N5bWJvbHMpCi0JICAgICAoYWJmZCwgaW5mbywgJnN5bXMsICZzeW1fY291bnQsICZzdHJpbmdzKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXZSBrZWVwIGEgbGlzdCBvZiB0aGUgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgdG8gcGFydGljdWxhciBzeW1ib2xzLiAgV2UgY291bGQganVzdCBsb29rIHRoZW0gdXAgaW4gdGhlIGhhc2gKLSAgICAgdGFibGUsIGJ1dCBrZWVwaW5nIHRoZSBsaXN0IGlzIG1vcmUgZWZmaWNpZW50LiAgUGVyaGFwcyB0aGlzCi0gICAgIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBpbmZvLT5rZWVwX21lbW9yeS4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJICgoc2l6ZV90KSBzeW1fY291bnQKLQkJCSAgKiBzaXplb2YgKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSkpKTsKLSAgaWYgKHN5bV9oYXNoID09IE5VTEwgJiYgc3ltX2NvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKSA9IHN5bV9oYXNoOwotCi0gIGFkZF9vbmVfc3ltYm9sID0gYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfb25lX3N5bWJvbDsKLSAgaWYgKGFkZF9vbmVfc3ltYm9sID09IE5VTEwpCi0gICAgYWRkX29uZV9zeW1ib2wgPSBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbDsKLQotICBwID0gc3ltczsKLSAgcGVuZCA9IHAgKyBzeW1fY291bnQ7Ci0gIGZvciAoOyBwIDwgcGVuZDsgcCsrLCBzeW1faGFzaCsrKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotCi0gICAgICAqc3ltX2hhc2ggPSBOVUxMOwotCi0gICAgICB0eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIHAtPmVfdHlwZSk7Ci0KLSAgICAgIC8qIElnbm9yZSBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCi0gICAgICBpZiAoKHR5cGUgJiBOX1NUQUIpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGFiZmQsIHAtPmVfc3RyeCk7Ci0gICAgICB2YWx1ZSA9IEdFVF9XT1JEIChhYmZkLCBwLT5lX3ZhbHVlKTsKLSAgICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIHN0cmluZyA9IE5VTEw7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgTl9VTkRGOgotCWNhc2UgTl9BQlM6Ci0JY2FzZSBOX1RFWFQ6Ci0JY2FzZSBOX0RBVEE6Ci0JY2FzZSBOX0JTUzoKLQljYXNlIE5fRk5fU0VROgotCWNhc2UgTl9DT01NOgotCWNhc2UgTl9TRVRWOgotCWNhc2UgTl9GTjoKLQkgIC8qIElnbm9yZSBzeW1ib2xzIHRoYXQgYXJlIG5vdCBleHRlcm5hbGx5IHZpc2libGUuICAqLwotCSAgY29udGludWU7Ci0JY2FzZSBOX0lORFI6Ci0JICAvKiBJZ25vcmUgbG9jYWwgaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLQkgICsrcDsKLQkgICsrc3ltX2hhc2g7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0JICBpZiAodmFsdWUgPT0gMCkKLQkgICAgewotCSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgICAgIGZsYWdzID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JY2FzZSBOX1NFVFYgfCBOX0VYVDoKLQkgIC8qIFRyZWF0IE5fU0VUViBzeW1ib2xzIGFzIE5fREFUQSBzeW1ib2w7IHNlZSBjb21tZW50IGluCi0JICAgICB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLiAgKi8KLQkgIHNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9CU1MgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0lORFIgfCBOX0VYVDoKLQkgIC8qIEFuIGluZGlyZWN0IHN5bWJvbC4gIFRoZSBuZXh0IHN5bWJvbCBpcyB0aGUgc3ltYm9sCi0JICAgICB3aGljaCB0aGlzIG9uZSByZWFsbHkgaXMuICAqLwotCSAgQkZEX0FTU0VSVCAocCArIDEgPCBwZW5kKTsKLQkgICsrcDsKLQkgIHN0cmluZyA9IHN0cmluZ3MgKyBHRVRfV09SRCAoYWJmZCwgcC0+ZV9zdHJ4KTsKLQkgIHNlY3Rpb24gPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgfD0gQlNGX0lORElSRUNUOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0NPTU0gfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NFVEE6IGNhc2UgTl9TRVRBIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIGJyZWFrOwotCWNhc2UgTl9TRVRUOiBjYXNlIE5fU0VUVCB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IG9ial90ZXh0c2VjIChhYmZkKTsKLQkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NFVEQ6IGNhc2UgTl9TRVREIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fU0VUQjogY2FzZSBOX1NFVEIgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dBUk5JTkc6Ci0JICAvKiBBIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybgotCSAgICAgYWJvdXQuICAqLwotCSAgQkZEX0FTU0VSVCAocCArIDEgPCBwZW5kKTsKLQkgICsrcDsKLQkgIHN0cmluZyA9IG5hbWU7Ci0JICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOwotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBmbGFncyB8PSBCU0ZfV0FSTklORzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLVToKLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLQToKLQkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLVDoKLQkgIHNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS0Q6Ci0JICBzZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBmbGFncyA9IEJTRl9XRUFLOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dFQUtCOgotCSAgc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBmbGFncyA9IEJTRl9XRUFLOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoISAoKCphZGRfb25lX3N5bWJvbCkKLQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywgY29weSwgZmFsc2UsCi0JICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogUmVzdHJpY3QgdGhlIG1heGltdW0gYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbCBiYXNlZCBvbgotCSB0aGUgYXJjaGl0ZWN0dXJlLCBzaW5jZSBhLm91dCBoYXMgbm8gd2F5IHRvIHJlcHJlc2VudAotCSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIGEgc2VjdGlvbiBpbiBhIC5vIGZpbGUuICBGSVhNRToKLQkgVGhpcyBpc24ndCBxdWl0ZSByaWdodDogaXQgc2hvdWxkIHVzZSB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZQotCSBvdXRwdXQgZmlsZSwgbm90IHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPgotCSAgICAgIGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcikpCi0JKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlciA9Ci0JICBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBzZXQgc3ltYm9sLCBhbmQgd2UgYXJlIG5vdCBidWlsZGluZyBzZXRzLCB0aGVuCi0JIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaGFzaCBlbnRyeSB0byBub3QgaGF2ZSBiZWVuIHNldC4gIEluCi0JIHN1Y2ggYSBjYXNlLCB0cmVhdCB0aGUgc3ltYm9sIGFzIG5vdCBnbG9iYWxseSBkZWZpbmVkLiAgKi8KLSAgICAgIGlmICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCXsKLQkgIEJGRF9BU1NFUlQgKChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMCk7Ci0JICAqc3ltX2hhc2ggPSBOVUxMOwotCX0KLQotICAgICAgaWYgKHR5cGUgPT0gKE5fSU5EUiB8IE5fRVhUKSB8fCB0eXBlID09IE5fV0FSTklORykKLQkrK3N5bV9oYXNoOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEEgaGFzaCB0YWJsZSB1c2VkIGZvciBoZWFkZXIgZmlsZXMgd2l0aCBOX0JJTkNMIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogQSBsaW5rZWQgbGlzdCBvZiB0b3RhbHMgdGhhdCB3ZSBoYXZlIGZvdW5kIGZvciBhIHBhcnRpY3VsYXIgaGVhZGVyCi0gICBmaWxlLiAgKi8KLQotc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMKLXsKLSAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKm5leHQ7Ci0gIGJmZF92bWEgdG90YWw7Ci19OwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIExpc3Qgb2YgdG90YWxzIHdlIGhhdmUgZm91bmQgZm9yIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzICp0b3RhbHM7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhb3V0X2xpbmtfaW5jbHVkZXNfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBEdXJpbmcgdGhlIGZpbmFsIGxpbmsgc3RlcCB3ZSBuZWVkIHRvIHBhc3MgYXJvdW5kIGEgYnVuY2ggb2YKLSAgIGluZm9ybWF0aW9uLCBzbyB3ZSBkbyBpdCBpbiBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbwotewotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogT3V0cHV0IGJmZC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogUmVsb2MgZmlsZSBwb3NpdGlvbnMuICAqLwotICBmaWxlX3B0ciB0cmVsb2ZmLCBkcmVsb2ZmOwotICAvKiBGaWxlIHBvc2l0aW9uIG9mIHN5bWJvbHMuICAqLwotICBmaWxlX3B0ciBzeW1vZmY7Ci0gIC8qIFN0cmluZyB0YWJsZS4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogSGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdGFibGUgaW5jbHVkZXM7Ci0gIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBjb250ZW50cyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlbG9jcyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIFBUUiByZWxvY3M7Ci0gIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBzeW1ib2wgbWFwIG9mIGFueSBpbnB1dCBCRkQuICAqLwotICBpbnQgKnN5bWJvbF9tYXA7Ci0gIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBzeW1ib2xzIG9mIGFueSBpbnB1dCBCRkQuICAqLwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKm91dHB1dF9zeW1zOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYW91dF9saW5rX2luY2x1ZGVzX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfd3JpdGVfc3ltYm9scwotICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKiwgYmZkICppbnB1dF9iZmQpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb24KLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkLAotCSAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLCBmaWxlX3B0ciAqcmVsb2ZmX3B0ciwKLQkgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkLAotCSAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosCi0JICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZSwgYmZkX2J5dGUgKmNvbnRlbnRzKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkLAotCSAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICosCi0JICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZSwgYmZkX2J5dGUgKmNvbnRlbnRzKSk7Ci1zdGF0aWMgSU5MSU5FIGFzZWN0aW9uICphb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBlbnRyeSBpbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotYW91dF9saW5rX2luY2x1ZGVzX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dG90YWxzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBEbyB0aGUgZmluYWwgbGluayBzdGVwLiAgVGhpcyBpcyBjYWxsZWQgb24gdGhlIG91dHB1dCBCRkQuICBUaGUKLSAgIElORk8gc3RydWN0dXJlIHNob3VsZCBwb2ludCB0byBhIGxpc3Qgb2YgQkZEcyBsaW5rZWQgdGhyb3VnaCB0aGUKLSAgIGxpbmtfbmV4dCBmaWVsZCB3aGljaCBjYW4gYmUgdXNlZCB0byBmaW5kIGVhY2ggQkZEIHdoaWNoIHRha2VzIHBhcnQKLSAgIGluIHRoZSBvdXRwdXQuICBBbHNvLCBlYWNoIHNlY3Rpb24gaW4gQUJGRCBzaG91bGQgcG9pbnQgdG8gYSBsaXN0Ci0gICBvZiBiZmRfbGlua19vcmRlciBzdHJ1Y3R1cmVzIHdoaWNoIGxpc3QgYWxsIHRoZSBpbnB1dCBzZWN0aW9ucyBmb3IKLSAgIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgY2FsbGJhY2spCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHZvaWQgKCpjYWxsYmFjaykgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLXsKLSAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvIGFvdXRfaW5mbzsKLSAgYm9vbGVhbiBpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gIHJlZ2lzdGVyIGJmZCAqc3ViOwotICBiZmRfc2l6ZV90eXBlIHRyc2l6ZSwgZHJzaXplOwotICBzaXplX3QgbWF4X2NvbnRlbnRzX3NpemU7Ci0gIHNpemVfdCBtYXhfcmVsb2NzX3NpemU7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsKLSAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKm87Ci0gIGJvb2xlYW4gaGF2ZV9saW5rX29yZGVyX3JlbG9jczsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgYW91dF9pbmZvLmluZm8gPSBpbmZvOwotICBhb3V0X2luZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGFvdXRfaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGFvdXRfaW5mby5yZWxvY3MgPSBOVUxMOwotICBhb3V0X2luZm8uc3ltYm9sX21hcCA9IE5VTEw7Ci0gIGFvdXRfaW5mby5vdXRwdXRfc3ltcyA9IE5VTEw7Ci0KLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYW91dF9pbmZvLmluY2x1ZGVzLnJvb3QsCi0JCQkgICAgICAgYW91dF9saW5rX2luY2x1ZGVzX25ld2Z1bmMsCi0JCQkgICAgICAgMjUxKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCA9IHRydWU7Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBzZWN0aW9uIHNpemUuICBBbHNvLCBpZiBnZW5lcmF0aW5nCi0gICAgIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGNvdW50IHRoZSByZWxvY3MuICAqLwotICB0cnNpemUgPSAwOwotICBkcnNpemUgPSAwOwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9yZWxvY3Nfc2l6ZSA9IDA7Ci0gIG1heF9zeW1fY291bnQgPSAwOwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc3o7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc3ViKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLQkgICAgewotCSAgICAgIHRyc2l6ZSArPSBleGVjX2hkciAoc3ViKS0+YV90cnNpemU7Ci0JICAgICAgZHJzaXplICs9IGV4ZWNfaGRyIChzdWIpLT5hX2Ryc2l6ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFdlIG5lZWQgdG8gaWRlbnRpZnkgdGhlIC50ZXh0IGFuZCAuZGF0YSBzZWN0aW9ucwotCQkgYW5kIGNhbGwgZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBjYW5vbmljYWxpemVfcmVsb2MgdG8KLQkJIHdvcmsgb3V0IHRoZSBudW1iZXIgb2YgcmVsb2NzIG5lZWRlZCwgYW5kIHRoZW4gbXVsdGlwbHkKLQkJIGJ5IHRoZSByZWxvYyBzaXplLiAgKi8KLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiByZWxvY2F0ZWFibGUgbGluayBmcm9tICVzIHRvICVzIG5vdCBzdXBwb3J0ZWQiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgc3ViLT54dmVjLT5uYW1lLCBhYmZkLT54dmVjLT5uYW1lKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChzdWIpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotCXsKLQkgIHN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoc3ViLCBvYmpfdGV4dHNlYyAoc3ViKSk7Ci0JICBpZiAoc3ogPiBtYXhfY29udGVudHNfc2l6ZSkKLQkgICAgbWF4X2NvbnRlbnRzX3NpemUgPSBzejsKLQkgIHN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoc3ViLCBvYmpfZGF0YXNlYyAoc3ViKSk7Ci0JICBpZiAoc3ogPiBtYXhfY29udGVudHNfc2l6ZSkKLQkgICAgbWF4X2NvbnRlbnRzX3NpemUgPSBzejsKLQotCSAgc3ogPSBleGVjX2hkciAoc3ViKS0+YV90cnNpemU7Ci0JICBpZiAoc3ogPiBtYXhfcmVsb2NzX3NpemUpCi0JICAgIG1heF9yZWxvY3Nfc2l6ZSA9IHN6OwotCSAgc3ogPSBleGVjX2hkciAoc3ViKS0+YV9kcnNpemU7Ci0JICBpZiAoc3ogPiBtYXhfcmVsb2NzX3NpemUpCi0JICAgIG1heF9yZWxvY3Nfc2l6ZSA9IHN6OwotCi0JICBzeiA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoc3ViKTsKLQkgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCi0JICAgIG1heF9zeW1fY291bnQgPSBzejsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKG9ial90ZXh0c2VjIChhYmZkKSAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQl0cnNpemUgKz0gKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKG9ial90ZXh0c2VjIChhYmZkKQotCQkJCQkJIC0+bGlua19vcmRlcl9oZWFkKQotCQkgICAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgICBpZiAob2JqX2RhdGFzZWMgKGFiZmQpICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCWRyc2l6ZSArPSAoX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyAob2JqX2RhdGFzZWMgKGFiZmQpCi0JCQkJCQkgLT5saW5rX29yZGVyX2hlYWQpCi0JCSAgICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgICB9Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9IHRyc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZSA9IGRyc2l6ZTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIC8qIEFkanVzdCB0aGUgc2VjdGlvbiBzaXplcyBhbmQgdm1hcyBhY2NvcmRpbmcgdG8gdGhlIG1hZ2ljIG51bWJlci4KLSAgICAgVGhpcyBzZXRzIGFfdGV4dCwgYV9kYXRhIGFuZCBhX2JzcyBpbiB0aGUgZXhlY19oZHIgYW5kIHNldHMgdGhlCi0gICAgIGZpbGVwb3MgZm9yIGVhY2ggc2VjdGlvbi4gICovCi0gIGlmICghIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSByZWxvY2F0aW9uIGFuZCBzeW1ib2wgZmlsZSBwb3NpdGlvbnMgZGlmZmVyIGFtb25nIGEub3V0Ci0gICAgIHRhcmdldHMuICBXZSBhcmUgcGFzc2VkIGEgY2FsbGJhY2sgcm91dGluZSBmcm9tIHRoZSBiYWNrZW5kCi0gICAgIHNwZWNpZmljIGNvZGUgdG8gaGFuZGxlIHRoaXMuCi0gICAgIEZJWE1FOiBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCBrbm93IGhvdyBtdWNoIHNwYWNlIHRoZSBzeW1ib2wKLSAgICAgdGFibGUgd2lsbCByZXF1aXJlLiAgVGhpcyB3aWxsIG5vdCB3b3JrIGZvciBhbnkgKG5vbnN0YW5kYXJkKQotICAgICBhLm91dCB0YXJnZXQgdGhhdCBuZWVkcyB0byBrbm93IHRoZSBzeW1ib2wgdGFibGUgc2l6ZSBiZWZvcmUgaXQKLSAgICAgY2FuIGNvbXB1dGUgdGhlIHJlbG9jYXRpb24gZmlsZSBwb3NpdGlvbnMuICBUaGlzIG1heSBvciBtYXkgbm90Ci0gICAgIGJlIHRoZSBjYXNlIGZvciB0aGUgaHAzMDBocHV4IHRhcmdldCwgZm9yIGV4YW1wbGUuICAqLwotICAoKmNhbGxiYWNrKSAoYWJmZCwgJmFvdXRfaW5mby50cmVsb2ZmLCAmYW91dF9pbmZvLmRyZWxvZmYsCi0JICAgICAgICZhb3V0X2luZm8uc3ltb2ZmKTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IGFvdXRfaW5mby50cmVsb2ZmOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gYW91dF9pbmZvLmRyZWxvZmY7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBhb3V0X2luZm8uc3ltb2ZmOwotCi0gIC8qIFdlIGtlZXAgYSBjb3VudCBvZiB0aGUgc3ltYm9scyBhcyB3ZSBvdXRwdXQgdGhlbS4gICovCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPSAwOwotCi0gIC8qIFdlIGFjY3VtdWxhdGUgdGhlIHN0cmluZyB0YWJsZSBhcyB3ZSB3cml0ZSBvdXQgdGhlIHN5bWJvbHMuICAqLwotICBhb3V0X2luZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGFvdXRfaW5mby5zdHJ0YWIgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBBbGxvY2F0ZSBidWZmZXJzIHRvIGhvbGQgc2VjdGlvbiBjb250ZW50cyBhbmQgcmVsb2NzLiAgKi8KLSAgYW91dF9pbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9jb250ZW50c19zaXplKTsKLSAgYW91dF9pbmZvLnJlbG9jcyA9IChQVFIpIGJmZF9tYWxsb2MgKG1heF9yZWxvY3Nfc2l6ZSk7Ci0gIGFvdXRfaW5mby5zeW1ib2xfbWFwID0gKGludCAqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChpbnQgKikpOwotICBhb3V0X2luZm8ub3V0cHV0X3N5bXMgPSAoKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKQotCQkJICAgYmZkX21hbGxvYyAoKG1heF9zeW1fY291bnQgKyAxKQotCQkJCSAgICAgICAqIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KSkpOwotICBpZiAoKGFvdXRfaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplICE9IDApCi0gICAgICB8fCAoYW91dF9pbmZvLnJlbG9jcyA9PSBOVUxMICYmIG1heF9yZWxvY3Nfc2l6ZSAhPSAwKQotICAgICAgfHwgKGFvdXRfaW5mby5zeW1ib2xfbWFwID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQotICAgICAgfHwgYW91dF9pbmZvLm91dHB1dF9zeW1zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSWYgd2UgaGF2ZSBhIHN5bWJvbCBuYW1lZCBfX0RZTkFNSUMsIGZvcmNlIGl0IG91dCBub3cuICBUaGlzIGlzCi0gICAgIHJlcXVpcmVkIGJ5IFN1bk9TLiAgRG9pbmcgdGhpcyBoZXJlIHJhdGhlciB0aGFuIGluIHN1bm9zLmMgaXMgYQotICAgICBoYWNrLCBidXQgaXQncyBlYXNpZXIgdGhhbiBleHBvcnRpbmcgZXZlcnl0aGluZyB3aGljaCB3b3VsZCBiZQotICAgICBuZWVkZWQuICAqLwotICB7Ci0gICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgaCA9IGFvdXRfbGlua19oYXNoX2xvb2t1cCAoYW91dF9oYXNoX3RhYmxlIChpbmZvKSwgIl9fRFlOQU1JQyIsCi0JCQkgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgaWYgKGggIT0gTlVMTCkKLSAgICAgIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wgKGgsICZhb3V0X2luZm8pOwotICB9Ci0KLSAgLyogVGhlIG1vc3QgdGltZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoZSBsaW5rIHdvdWxkIGJlIHRvIHJlYWQgYWxsCi0gICAgIHRoZSBpbnB1dCBvYmplY3QgZmlsZXMgaW50byBtZW1vcnkgYW5kIHRoZW4gc29ydCBvdXQgdGhlCi0gICAgIGluZm9ybWF0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLiAgVW5mb3J0dW5hdGVseSwgdGhhdCB3aWxsCi0gICAgIHByb2JhYmx5IHVzZSB0b28gbXVjaCBtZW1vcnkuICBBbm90aGVyIG1ldGhvZCB3b3VsZCBiZSB0byBzdGVwCi0gICAgIHRocm91Z2ggZXZlcnl0aGluZyB0aGF0IGNvbXBvc2VzIHRoZSB0ZXh0IHNlY3Rpb24gYW5kIHdyaXRlIGl0Ci0gICAgIG91dCwgYW5kIHRoZW4gZXZlcnl0aGluZyB0aGF0IGNvbXBvc2VzIHRoZSBkYXRhIHNlY3Rpb24gYW5kIHdyaXRlCi0gICAgIGl0IG91dCwgYW5kIHRoZW4gd3JpdGUgb3V0IHRoZSByZWxvY3MsIGFuZCB0aGVuIHdyaXRlIG91dCB0aGUKLSAgICAgc3ltYm9scy4gIFVuZm9ydHVuYXRlbHksIHRoYXQgcmVxdWlyZXMgcmVhZGluZyBzdHVmZiBmcm9tIGVhY2gKLSAgICAgaW5wdXQgZmlsZSBzZXZlcmFsIHRpbWVzLCBhbmQgd2Ugd2lsbCBub3QgYmUgYWJsZSB0byBrZWVwIGFsbCB0aGUKLSAgICAgaW5wdXQgZmlsZXMgb3BlbiBzaW11bHRhbmVvdXNseSwgYW5kIHJlb3BlbmluZyB0aGVtIHdpbGwgYmUgc2xvdy4KLQotICAgICBXaGF0IHdlIGRvIGlzIGJhc2ljYWxseSBwcm9jZXNzIG9uZSBpbnB1dCBmaWxlIGF0IGEgdGltZS4gIFdlIGRvCi0gICAgIGV2ZXJ5dGhpbmcgd2UgbmVlZCB0byBkbyB3aXRoIGFuIGlucHV0IGZpbGUgb25jZS0tY29weSBvdmVyIHRoZQotICAgICBzZWN0aW9uIGNvbnRlbnRzLCBoYW5kbGUgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24sIGFuZCB3cml0ZQotICAgICBvdXQgdGhlIHN5bWJvbHMtLWFuZCB0aGVuIHdlIHRocm93IGF3YXkgdGhlIGluZm9ybWF0aW9uIHdlIHJlYWQKLSAgICAgZnJvbSBpdC4gIFRoaXMgYXBwcm9hY2ggcmVxdWlyZXMgYSBsb3Qgb2YgbHNlZWtzIG9mIHRoZSBvdXRwdXQKLSAgICAgZmlsZSwgd2hpY2ggaXMgdW5mb3J0dW5hdGUgYnV0IHN0aWxsIGZhc3RlciB0aGFuIHJlb3BlbmluZyBhIGxvdAotICAgICBvZiBmaWxlcy4KLQotICAgICBXZSB1c2UgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGQgb2YgdGhlIGlucHV0IEJGRHMgdG8gc2VlCi0gICAgIHdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgaXQuICAqLwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSAoYmZkICopIE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotCi0gIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIFRoaXMKLSAgICAgd2lsbCBub3JtYWxseSBiZSBldmVyeSBzZWN0aW9uLiAgV2UgbmVlZCB0byBkbyB0aGlzIHNvIHRoYXQgd2UKLSAgICAgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaCB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdAotICAgICBpbmNsdWRlLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICBwLT51LmluZGlyZWN0LnNlY3Rpb24tPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGhhdmVfbGlua19vcmRlcl9yZWxvY3MgPSBmYWxzZTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCi0JCSAgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0KLQkgICAgICBpbnB1dF9iZmQgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGlmICghIGlucHV0X2JmZC0+b3V0cHV0X2hhc19iZWd1bikKLQkJewotCQkgIGlmICghIGFvdXRfbGlua19pbnB1dF9iZmQgKCZhb3V0X2luZm8sIGlucHV0X2JmZCkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBpbnB1dF9iZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIC8qIFRoZXNlIGFyZSBoYW5kbGVkIGJlbG93LiAgKi8KLQkgICAgICBoYXZlX2xpbmtfb3JkZXJfcmVsb2NzID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IGFueSBzeW1ib2xzIHRoYXQgd2UgaGF2ZSBub3QgYWxyZWFkeSB3cml0dGVuIG91dC4gICovCi0gIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlIChhb3V0X2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCwKLQkJCSAgIChQVFIpICZhb3V0X2luZm8pOwotCi0gIC8qIE5vdyBoYW5kbGUgYW55IHJlbG9jcyB3ZSB3ZXJlIGFza2VkIHRvIGNyZWF0ZSBieSB0aGUgbGlua2VyLgotICAgICBUaGVzZSBkaWQgbm90IGNvbWUgZnJvbSBhbnkgaW5wdXQgZmlsZS4gIFdlIG11c3QgZG8gdGhlc2UgYWZ0ZXIKLSAgICAgd2UgaGF2ZSB3cml0dGVuIG91dCBhbGwgdGhlIHN5bWJvbHMsIHNvIHRoYXQgd2Uga25vdyB0aGUgc3ltYm9sCi0gICAgIGluZGljZXMgdG8gdXNlLiAgKi8KLSAgaWYgKGhhdmVfbGlua19vcmRlcl9yZWxvY3MpCi0gICAgewotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKCEgYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIgKCZhb3V0X2luZm8sIG8sIHApKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGFvdXRfaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGFvdXRfaW5mby5jb250ZW50cyk7Ci0gICAgICBhb3V0X2luZm8uY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGFvdXRfaW5mby5yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhb3V0X2luZm8ucmVsb2NzKTsKLSAgICAgIGFvdXRfaW5mby5yZWxvY3MgPSBOVUxMOwotICAgIH0KLSAgaWYgKGFvdXRfaW5mby5zeW1ib2xfbWFwICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYW91dF9pbmZvLnN5bWJvbF9tYXApOwotICAgICAgYW91dF9pbmZvLnN5bWJvbF9tYXAgPSBOVUxMOwotICAgIH0KLSAgaWYgKGFvdXRfaW5mby5vdXRwdXRfc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGFvdXRfaW5mby5vdXRwdXRfc3ltcyk7Ci0gICAgICBhb3V0X2luZm8ub3V0cHV0X3N5bXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFvdXRfaW5mby5pbmNsdWRlcy5yb290KTsKLSAgICAgIGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRmluaXNoIHVwIGFueSBkeW5hbWljIGxpbmtpbmcgd2UgbWF5IGJlIGRvaW5nLiAgKi8KLSAgaWYgKGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZmluaXNoX2R5bmFtaWNfbGluayAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5maW5pc2hfZHluYW1pY19saW5rKSAoYWJmZCwgaW5mbykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgYWJmZC0+c3ltY291bnQgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGFiZmQtPnN5bWNvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgKyBleGVjX2hkciAoYWJmZCktPmFfc3ltczsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCA9Ci0gICAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCA9Ci0gICAgZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHN0cmluZyB0YWJsZSwgdW5sZXNzIHRoZXJlIGFyZSBubyBzeW1ib2xzLiAgKi8KLSAgaWYgKGFiZmQtPnN5bWNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zdHJfZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAhIGVtaXRfc3RyaW5ndGFiIChhYmZkLCBhb3V0X2luZm8uc3RydGFiKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQgPT0gMAotCSAgICYmIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICBiID0gMDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MKLQkJICAgICArIGV4ZWNfaGRyIChhYmZkKS0+YV9kYXRhCi0JCSAgICAgLSAxKSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFvdXRfaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGFvdXRfaW5mby5jb250ZW50cyk7Ci0gIGlmIChhb3V0X2luZm8ucmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoYW91dF9pbmZvLnJlbG9jcyk7Ci0gIGlmIChhb3V0X2luZm8uc3ltYm9sX21hcCAhPSBOVUxMKQotICAgIGZyZWUgKGFvdXRfaW5mby5zeW1ib2xfbWFwKTsKLSAgaWYgKGFvdXRfaW5mby5vdXRwdXRfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGFvdXRfaW5mby5vdXRwdXRfc3ltcyk7Ci0gIGlmIChpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkKQotICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZhb3V0X2luZm8uaW5jbHVkZXMucm9vdCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTGluayBhbiBhLm91dCBpbnB1dCBCRkQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltX2NvdW50OwotCi0gIEJGRF9BU1NFUlQgKGJmZF9nZXRfZm9ybWF0IChpbnB1dF9iZmQpID09IGJmZF9vYmplY3QpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIG9iamVjdCwgaXQgbWF5IG5lZWQgc3BlY2lhbCBoYW5kbGluZy4gICovCi0gIGlmICgoaW5wdXRfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmIGFvdXRfYmFja2VuZF9pbmZvIChpbnB1dF9iZmQpLT5saW5rX2R5bmFtaWNfb2JqZWN0ICE9IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuICgoKmFvdXRfYmFja2VuZF9pbmZvIChpbnB1dF9iZmQpLT5saW5rX2R5bmFtaWNfb2JqZWN0KQotCSAgICAgIChmaW5mby0+aW5mbywgaW5wdXRfYmZkKSk7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgc3ltYm9scy4gIFdlIHByb2JhYmx5IGhhdmUgdGhlbSBhbHJlYWR5LCB1bmxlc3MKLSAgICAgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLiAgKi8KLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ltX2NvdW50ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChpbnB1dF9iZmQpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3ltYm9scyBhbmQgZ2V0IGEgbWFwIG9mIHRoZSBuZXcgaW5kaWNlcy4gIFRoZSBtYXAKLSAgICAgaXMgcGxhY2VkIGludG8gZmluZm8tPnN5bWJvbF9tYXAuICAqLwotICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyAoZmluZm8sIGlucHV0X2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlbG9jYXRlIGFuZCB3cml0ZSBvdXQgdGhlIHNlY3Rpb25zLiAgVGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUKLSAgICAgc3ltYm9sIG1hcCBjcmVhdGVkIGJ5IGFvdXRfbGlua193cml0ZV9zeW1ib2xzLiAgVGhlIGxpbmtlcl9tYXJrCi0gICAgIGZpZWxkIHdpbGwgYmUgc2V0IGlmIHRoZXNlIHNlY3Rpb25zIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICAgbGluaywgd2hpY2ggd2lsbCBub3JtYWxseSBiZSB0aGUgY2FzZS4gICovCi0gIGlmIChvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKS0+bGlua2VyX21hcmspCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb24gKGZpbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICZmaW5mby0+dHJlbG9mZiwKLQkJCQkgICAgIGV4ZWNfaGRyIChpbnB1dF9iZmQpLT5hX3Ryc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKG9ial9kYXRhc2VjIChpbnB1dF9iZmQpLT5saW5rZXJfbWFyaykKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbiAoZmluZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgIG9ial9kYXRhc2VjIChpbnB1dF9iZmQpLAotCQkJCSAgICAgJmZpbmZvLT5kcmVsb2ZmLAotCQkJCSAgICAgZXhlY19oZHIgKGlucHV0X2JmZCktPmFfZHJzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3Qga2VlcGluZyBtZW1vcnksIHdlIGRvbid0IG5lZWQgdGhlIHN5bWJvbHMgYW55Ci0gICAgIGxvbmdlci4gIFdlIHN0aWxsIG5lZWQgdGhlbSBpZiB3ZSBhcmUga2VlcGluZyBtZW1vcnksIGJlY2F1c2UgdGhlCi0gICAgIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgcG9pbnQgaW50byB0aGVtLiAgKi8KLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGFuZCB3cml0ZSBvdXQgdGhlIHN5bWJvbHMgZm9yIGFuIGEub3V0IGZpbGUuICBTZXQgdGhlIG5ldwotICAgc3ltYm9sIGluZGljZXMgaW50byBhIHN5bWJvbF9tYXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX3dyaXRlX3N5bWJvbHMgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJmZF9zaXplX3R5cGUgc3ltX2NvdW50OwotICBjaGFyICpzdHJpbmdzOwotICBlbnVtIGJmZF9saW5rX3N0cmlwIHN0cmlwOwotICBlbnVtIGJmZF9saW5rX2Rpc2NhcmQgZGlzY2FyZDsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvdXRzeW07Ci0gIGJmZF9zaXplX3R5cGUgc3RydGFiX2luZGV4OwotICByZWdpc3RlciBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fZW5kOwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgaW50ICpzeW1ib2xfbWFwOwotICBib29sZWFuIHBhc3M7Ci0gIGJvb2xlYW4gc2tpcF9uZXh0OwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgc3ltX2NvdW50ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChpbnB1dF9iZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoaW5wdXRfYmZkKTsKLSAgc3RyaXAgPSBmaW5mby0+aW5mby0+c3RyaXA7Ci0gIGRpc2NhcmQgPSBmaW5mby0+aW5mby0+ZGlzY2FyZDsKLSAgb3V0c3ltID0gZmluZm8tPm91dHB1dF9zeW1zOwotCi0gIC8qIEZpcnN0IHdyaXRlIG91dCBhIHN5bWJvbCBmb3IgdGhpcyBvYmplY3QgZmlsZSwgdW5sZXNzIHdlIGFyZQotICAgICBkaXNjYXJkaW5nIHN1Y2ggc3ltYm9scy4gICovCi0gIGlmIChzdHJpcCAhPSBzdHJpcF9hbGwKLSAgICAgICYmIChzdHJpcCAhPSBzdHJpcF9zb21lCi0JICB8fCBiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIGlucHV0X2JmZC0+ZmlsZW5hbWUsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCi0gICAgICAmJiBkaXNjYXJkICE9IGRpc2NhcmRfYWxsKQotICAgIHsKLSAgICAgIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCBOX1RFWFQsIG91dHN5bS0+ZV90eXBlKTsKLSAgICAgIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0tPmVfb3RoZXIpOwotICAgICAgYmZkX2hfcHV0XzE2IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgb3V0c3ltLT5lX2Rlc2MpOwotICAgICAgc3RydGFiX2luZGV4ID0gYWRkX3RvX3N0cmluZ3RhYiAob3V0cHV0X2JmZCwgZmluZm8tPnN0cnRhYiwKLQkJCQkgICAgICAgaW5wdXRfYmZkLT5maWxlbmFtZSwgZmFsc2UpOwotICAgICAgaWYgKHN0cnRhYl9pbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHN0cnRhYl9pbmRleCwgb3V0c3ltLT5lX3N0cngpOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsCi0JCShiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLAotCQkJCSAgICAgIG9ial90ZXh0c2VjIChpbnB1dF9iZmQpLT5vdXRwdXRfc2VjdGlvbikKLQkJICsgb2JqX3RleHRzZWMgKGlucHV0X2JmZCktPm91dHB1dF9vZmZzZXQpLAotCQlvdXRzeW0tPmVfdmFsdWUpOwotICAgICAgKytvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotICAgICAgKytvdXRzeW07Ci0gICAgfQotCi0gIHBhc3MgPSBmYWxzZTsKLSAgc2tpcF9uZXh0ID0gZmFsc2U7Ci0gIHN5bSA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIHN5bV9lbmQgPSBzeW0gKyBzeW1fY291bnQ7Ci0gIHN5bV9oYXNoID0gb2JqX2FvdXRfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgc3ltYm9sX21hcCA9IGZpbmZvLT5zeW1ib2xfbWFwOwotICBtZW1zZXQgKHN5bWJvbF9tYXAsIDAsIHN5bV9jb3VudCAqIHNpemVvZiAqc3ltYm9sX21hcCk7Ci0gIGZvciAoOyBzeW0gPCBzeW1fZW5kOyBzeW0rKywgc3ltX2hhc2grKywgc3ltYm9sX21hcCsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGFzZWN0aW9uICpzeW1zZWM7Ci0gICAgICBiZmRfdm1hIHZhbCA9IDA7Ci0gICAgICBib29sZWFuIGNvcHk7Ci0KLSAgICAgIC8qIFdlIHNldCAqc3ltYm9sX21hcCB0byAwIGFib3ZlIGZvciBhbGwgc3ltYm9scy4gIElmIGl0IGhhcwotICAgICAgICAgYWxyZWFkeSBiZWVuIHNldCB0byAtMSBmb3IgdGhpcyBzeW1ib2wsIGl0IG1lYW5zIHRoYXQgd2UgYXJlCi0gICAgICAgICBkaXNjYXJkaW5nIGl0IGJlY2F1c2UgaXQgYXBwZWFycyBpbiBhIGR1cGxpY2F0ZSBoZWFkZXIgZmlsZS4KLSAgICAgICAgIFNlZSB0aGUgTl9CSU5DTCBjb2RlIGJlbG93LiAgKi8KLSAgICAgIGlmICgqc3ltYm9sX21hcCA9PSAtMSkKLQljb250aW51ZTsKLQotICAgICAgLyogSW5pdGlhbGl6ZSAqc3ltYm9sX21hcCB0byAtMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgc3ltYm9sIHdhcwotICAgICAgICAgbm90IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIHdpbGwgY2hhbmdlIGl0IGxhdGVyIGlmCi0gICAgICAgICB3ZSBkbyBjb3B5IHRoZSBzeW1ib2wgb3Zlci4gICovCi0gICAgICAqc3ltYm9sX21hcCA9IC0xOwotCi0gICAgICB0eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgc3ltLT5lX3R5cGUpOwotICAgICAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfc3RyeCk7Ci0KLSAgICAgIGggPSBOVUxMOwotCi0gICAgICBpZiAocGFzcykKLQl7Ci0JICAvKiBQYXNzIHRoaXMgc3ltYm9sIHRocm91Z2guICBJdCBpcyB0aGUgdGFyZ2V0IG9mIGFuCi0JICAgICBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4gICovCi0JICB2YWwgPSBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfdmFsdWUpOwotCSAgcGFzcyA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKHNraXBfbmV4dCkKLQl7Ci0JICAvKiBTa2lwIHRoaXMgc3ltYm9sLCB3aGljaCBpcyB0aGUgdGFyZ2V0IG9mIGFuIGluZGlyZWN0Ci0JICAgICBzeW1ib2wgdGhhdCB3ZSBoYXZlIGNoYW5nZWQgdG8gbm8gbG9uZ2VyIGJlIGFuIGluZGlyZWN0Ci0JICAgICBzeW1ib2wuICAqLwotCSAgc2tpcF9uZXh0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpocmVzb2x2ZTsKLQotCSAgLyogV2UgaGF2ZSBzYXZlZCB0aGUgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wsIGlmCi0JICAgICB0aGVyZSBpcyBvbmUuICBOb3RlIHRoYXQgd2UgY291bGQganVzdCBsb29rIGl0IHVwIGFnYWluCi0JICAgICBpbiB0aGUgaGFzaCB0YWJsZSwgcHJvdmlkZWQgd2UgZmlyc3QgY2hlY2sgdGhhdCBpdCBpcyBhbgotCSAgICAgZXh0ZXJuYWwgc3ltYm9sLiAqLwotCSAgaCA9ICpzeW1faGFzaDsKLQotCSAgLyogVXNlIHRoZSBuYW1lIGZyb20gdGhlIGhhc2ggdGFibGUsIGluIGNhc2UgdGhlIHN5bWJvbCB3YXMKLSAgICAgICAgICAgICB3cmFwcGVkLiAgKi8KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCi0JICAvKiBJZiB0aGlzIGlzIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLCB0aGVuIGNoYW5nZQotCSAgICAgaHJlc29sdmUgdG8gdGhlIGJhc2Ugc3ltYm9sLiAgV2UgYWxzbyBjaGFuZ2UgKnN5bV9oYXNoIHNvCi0JICAgICB0aGF0IHRoZSByZWxvY2F0aW9uIHJvdXRpbmVzIHJlbG9jYXRlIGFnYWluc3QgdGhlIHJlYWwKLQkgICAgIHN5bWJvbC4gICovCi0JICBocmVzb2x2ZSA9IGg7Ci0JICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKSkKLQkgICAgewotCSAgICAgIGhyZXNvbHZlID0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgICAgIHdoaWxlIChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJICAgICB8fCBocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJaHJlc29sdmUgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgIGhyZXNvbHZlLT5yb290LnUuaS5saW5rKTsKLQkgICAgICAqc3ltX2hhc2ggPSBocmVzb2x2ZTsKLQkgICAgfQotCi0JICAvKiBJZiB0aGUgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiBvdXQsIHNraXAgaXQuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfd2FybmluZwotCSAgICAgICYmIGgtPndyaXR0ZW4pCi0JICAgIHsKLQkgICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUgotCQkgIHx8IHR5cGUgPT0gTl9XQVJOSU5HKQotCQlza2lwX25leHQgPSB0cnVlOwotCSAgICAgICpzeW1ib2xfbWFwID0gaC0+aW5keDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBTZWUgaWYgd2UgYXJlIHN0cmlwcGluZyB0aGlzIHN5bWJvbC4gICovCi0JICBza2lwID0gZmFsc2U7Ci0JICBzd2l0Y2ggKHN0cmlwKQotCSAgICB7Ci0JICAgIGNhc2Ugc3RyaXBfbm9uZToKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBzdHJpcF9kZWJ1Z2dlcjoKLQkgICAgICBpZiAoKHR5cGUgJiBOX1NUQUIpICE9IDApCi0JCXNraXAgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIHN0cmlwX3NvbWU6Ci0JICAgICAgaWYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCQkgID09IE5VTEwpCi0JCXNraXAgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIHN0cmlwX2FsbDoKLQkgICAgICBza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKHNraXApCi0JICAgIHsKLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWgtPndyaXR0ZW4gPSB0cnVlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0JICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fVEVYVAotCSAgICAgIHx8IHR5cGUgPT0gTl9XRUFLVCkKLQkgICAgc3ltc2VjID0gb2JqX3RleHRzZWMgKGlucHV0X2JmZCk7Ci0JICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9EQVRBCi0JCSAgIHx8IHR5cGUgPT0gTl9XRUFLRCkKLQkgICAgc3ltc2VjID0gb2JqX2RhdGFzZWMgKGlucHV0X2JmZCk7Ci0JICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9CU1MKLQkJICAgfHwgdHlwZSA9PSBOX1dFQUtCKQotCSAgICBzeW1zZWMgPSBvYmpfYnNzc2VjIChpbnB1dF9iZmQpOwotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQUJTCi0JCSAgIHx8IHR5cGUgPT0gTl9XRUFLQSkKLQkgICAgc3ltc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKCgodHlwZSAmIE5fVFlQRSkgPT0gTl9JTkRSCi0JCSAgICAmJiAoaHJlc29sdmUgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCQl8fCAoaHJlc29sdmUtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAmJiBocmVzb2x2ZS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkJICAgICYmIGhyZXNvbHZlLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pKSkKLQkJICAgfHwgdHlwZSA9PSBOX1dBUk5JTkcpCi0JICAgIHsKLQkgICAgICAvKiBQYXNzIHRoZSBuZXh0IHN5bWJvbCB0aHJvdWdoIHVuY2hhbmdlZC4gIFRoZQotCQkgY29uZGl0aW9uIGFib3ZlIGZvciBpbmRpcmVjdCBzeW1ib2xzIGlzIHNvIHRoYXQgaWYKLQkJIHRoZSBpbmRpcmVjdCBzeW1ib2wgd2FzIGRlZmluZWQsIHdlIG91dHB1dCBpdCB3aXRoCi0JCSB0aGUgY29ycmVjdCBkZWZpbml0aW9uIHNvIHRoZSBkZWJ1Z2dlciB3aWxsCi0JCSB1bmRlcnN0YW5kIGl0LiAgKi8KLQkgICAgICBwYXNzID0gdHJ1ZTsKLQkgICAgICB2YWwgPSBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfdmFsdWUpOwotCSAgICAgIHN5bXNlYyA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQotCSAgICB7Ci0JICAgICAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKLQkgICAgICBzeW1zZWMgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSB3aXRoIGFuIGluZGlyZWN0IHN5bWJvbCwgaXQgbWVhbnMgdGhhdAotCQkgd2UgYXJlIG91dHB1dHRpbmcgaXQgd2l0aCBhIHJlYWwgZGVmaW5pdGlvbi4gIEluIHN1Y2gKLQkJIGEgY2FzZSB3ZSBkbyBub3Qgd2FudCB0byBvdXRwdXQgdGhlIG5leHQgc3ltYm9sLAotCQkgd2hpY2ggaXMgdGhlIHRhcmdldCBvZiB0aGUgaW5kaXJlY3Rpb24uICAqLwotCSAgICAgIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9JTkRSKQotCQlza2lwX25leHQgPSB0cnVlOwotCi0JICAgICAgc3ltc2VjID0gTlVMTDsKLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBoYXNoIHRhYmxlLiAgV2UgdXNlCi0JCSBocmVzb2x2ZSBzbyB0aGF0IGlmIHdlIGhhdmUgZGVmaW5lZCBhbiBpbmRpcmVjdAotCQkgc3ltYm9sIHdlIG91dHB1dCB0aGUgZmluYWwgZGVmaW5pdGlvbi4gICovCi0JICAgICAgaWYgKGggPT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQl7Ci0JCSAgc3dpdGNoICh0eXBlICYgTl9UWVBFKQotCQkgICAgewotCQkgICAgY2FzZSBOX1NFVFQ6Ci0JCSAgICAgIHN5bXNlYyA9IG9ial90ZXh0c2VjIChpbnB1dF9iZmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgTl9TRVREOgotCQkgICAgICBzeW1zZWMgPSBvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIE5fU0VUQjoKLQkJICAgICAgc3ltc2VjID0gb2JqX2Jzc3NlYyAoaW5wdXRfYmZkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIE5fU0VUQToKLQkJICAgICAgc3ltc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICB2YWwgPSAwOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICB8fCBocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCQkgIC8qIFRoaXMgY2FzZSB1c3VhbGx5IG1lYW5zIGEgY29tbW9uIHN5bWJvbCB3aGljaCB3YXMKLQkJICAgICB0dXJuZWQgaW50byBhIGRlZmluZWQgc3ltYm9sLiAgKi8KLQkJICBpbnB1dF9zZWN0aW9uID0gaHJlc29sdmUtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBvdXRwdXRfc2VjdGlvbiA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCQkgIEJGRF9BU1NFUlQgKGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0JCQkgICAgICB8fCBvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0JCSAgdmFsID0gKGhyZXNvbHZlLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbikKLQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgLyogR2V0IHRoZSBjb3JyZWN0IHR5cGUgYmFzZWQgb24gdGhlIHNlY3Rpb24uICBJZgotCQkgICAgIHRoaXMgaXMgYSBjb25zdHJ1Y3RlZCBzZXQsIGZvcmNlIGl0IHRvIGJlCi0JCSAgICAgZ2xvYmFsbHkgdmlzaWJsZS4gICovCi0JCSAgaWYgKHR5cGUgPT0gTl9TRVRUCi0JCSAgICAgIHx8IHR5cGUgPT0gTl9TRVRECi0JCSAgICAgIHx8IHR5cGUgPT0gTl9TRVRCCi0JCSAgICAgIHx8IHR5cGUgPT0gTl9TRVRBKQotCQkgICAgdHlwZSB8PSBOX0VYVDsKLQotCQkgIHR5cGUgJj1+IE5fVFlQRTsKLQotCQkgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICB0eXBlIHw9IChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICA/IE5fVEVYVAotCQkJICAgICA6IE5fV0VBS1QpOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHR5cGUgfD0gKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgID8gTl9EQVRBCi0JCQkgICAgIDogTl9XRUFLRCk7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JCSAgICB0eXBlIHw9IChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICA/IE5fQlNTCi0JCQkgICAgIDogTl9XRUFLQik7Ci0JCSAgZWxzZQotCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgPyBOX0FCUwotCQkJICAgICA6IE5fV0VBS0EpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkJdmFsID0gaHJlc29sdmUtPnJvb3QudS5jLnNpemU7Ci0JICAgICAgZWxzZSBpZiAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJewotCQkgIHZhbCA9IDA7Ci0JCSAgdHlwZSA9IE5fV0VBS1U7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXZhbCA9IDA7Ci0JICAgIH0KLQkgIGlmIChzeW1zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHZhbCA9IChzeW1zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBzeW1zZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyAoR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKQotCQkgICAgICAtIHN5bXNlYy0+dm1hKSk7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBnbG9iYWwgc3ltYm9sIHNldCB0aGUgd3JpdHRlbiBmbGFnLCBhbmQgaWYKLQkgICAgIGl0IGlzIGEgbG9jYWwgc3ltYm9sIHNlZSBpZiB3ZSBzaG91bGQgZGlzY2FyZCBpdC4gICovCi0JICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBoLT53cml0dGVuID0gdHJ1ZTsKLQkgICAgICBoLT5pbmR4ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUVAotCQkgICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRECi0JCSAgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEIKLQkJICAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoZGlzY2FyZCkKLQkJewotCQljYXNlIGRpc2NhcmRfbm9uZToKLQkJICBicmVhazsKLQkJY2FzZSBkaXNjYXJkX2w6Ci0JCSAgaWYgKCh0eXBlICYgTl9TVEFCKSA9PSAwCi0JCSAgICAgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgZGlzY2FyZF9hbGw6Ci0JCSAgc2tpcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBpZiAoc2tpcCkKLQkJewotCQkgIHBhc3MgPSBmYWxzZTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEFuIE5fQklOQ0wgc3ltYm9sIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgdGhlIHN0YWJzCi0JICAgICBlbnRyaWVzIGZvciBhIGhlYWRlciBmaWxlLiAgV2UgbmVlZCB0byBzY2FuIGFoZWFkIHRvIHRoZQotCSAgICAgbmV4dCBOX0VJTkNMIHN5bWJvbCwgaWdub3JpbmcgbmVzdGluZywgYWRkaW5nIHVwIGFsbCB0aGUKLQkgICAgIGNoYXJhY3RlcnMgaW4gdGhlIHN5bWJvbCBuYW1lcywgbm90IGluY2x1ZGluZyB0aGUgZmlsZQotCSAgICAgbnVtYmVycyBpbiB0eXBlcyAodGhlIGZpcnN0IG51bWJlciBhZnRlciBhbiBvcGVuCi0JICAgICBwYXJlbnRoZXNpcykuICAqLwotCSAgaWYgKHR5cGUgPT0gTl9CSU5DTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqaW5jbF9zeW07Ci0JICAgICAgaW50IG5lc3Q7Ci0JICAgICAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSAqaW5jbF9lbnRyeTsKLQkgICAgICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyAqdDsKLQotCSAgICAgIHZhbCA9IDA7Ci0JICAgICAgbmVzdCA9IDA7Ci0JICAgICAgZm9yIChpbmNsX3N5bSA9IHN5bSArIDE7IGluY2xfc3ltIDwgc3ltX2VuZDsgaW5jbF9zeW0rKykKLQkJewotCQkgIGludCBpbmNsX3R5cGU7Ci0KLQkJICBpbmNsX3R5cGUgPSBiZmRfaF9nZXRfOCAoaW5wdXRfYmZkLCBpbmNsX3N5bS0+ZV90eXBlKTsKLQkJICBpZiAoaW5jbF90eXBlID09IE5fRUlOQ0wpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChuZXN0ID09IDApCi0JCQlicmVhazsKLQkJICAgICAgLS1uZXN0OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQotCQkgICAgKytuZXN0OwotCQkgIGVsc2UgaWYgKG5lc3QgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqczsKLQotCQkgICAgICBzID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsIGluY2xfc3ltLT5lX3N0cngpOwotCQkgICAgICBmb3IgKDsgKnMgIT0gJ1wwJzsgcysrKQotCQkJewotCQkJICB2YWwgKz0gKnM7Ci0JCQkgIGlmICgqcyA9PSAnKCcpCi0JCQkgICAgewotCQkJICAgICAgLyogU2tpcCB0aGUgZmlsZSBudW1iZXIuICAqLwotCQkJICAgICAgKytzOwotCQkJICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCQkJKytzOwotCQkJICAgICAgLS1zOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGEgaGVhZGVyIGZpbGUgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgc2FtZSB2YWx1ZSwgdGhlbiByZXBsYWNlIHRoaXMgb25lIHdpdGggYW4gTl9FWENMCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICAgICAgY29weSA9ICEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5OwotCSAgICAgIGluY2xfZW50cnkgPSBhb3V0X2xpbmtfaW5jbHVkZXNfbG9va3VwICgmZmluZm8tPmluY2x1ZGVzLAotCQkJCQkJICAgICAgbmFtZSwgdHJ1ZSwgY29weSk7Ci0JICAgICAgaWYgKGluY2xfZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGZvciAodCA9IGluY2xfZW50cnktPnRvdGFsczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkJaWYgKHQtPnRvdGFsID09IHZhbCkKLQkJICBicmVhazsKLQkgICAgICBpZiAodCA9PSBOVUxMKQotCQl7Ci0JCSAgLyogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHNlZW4gdGhpcyBoZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgd2l0aCB0aGlzIHNldCBvZiBzdGFicyBzdHJpbmdzLiAgKi8KLQkJICB0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyAqKQotCQkgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZmaW5mby0+aW5jbHVkZXMucm9vdCwKLQkJCQkJICBzaXplb2YgKnQpKTsKLQkJICBpZiAodCA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIHQtPnRvdGFsID0gdmFsOwotCQkgIHQtPm5leHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7Ci0JCSAgaW5jbF9lbnRyeS0+dG90YWxzID0gdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGludCAqaW5jbF9tYXA7Ci0KLQkJICAvKiBUaGlzIGlzIGEgZHVwbGljYXRlIGhlYWRlciBmaWxlLiAgV2UgbXVzdCBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgIGl0IHRvIGJlIGFuIE5fRVhDTCBlbnRyeSwgYW5kIG1hcmsgYWxsIHRoZQotICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgc3ltYm9scyB0byBwcmV2ZW50IG91dHB1dHRpbmcgdGhlbS4gICovCi0JCSAgdHlwZSA9IE5fRVhDTDsKLQotCQkgIG5lc3QgPSAwOwotCQkgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyAxLCBpbmNsX21hcCA9IHN5bWJvbF9tYXAgKyAxOwotCQkgICAgICAgaW5jbF9zeW0gPCBzeW1fZW5kOwotCQkgICAgICAgaW5jbF9zeW0rKywgaW5jbF9tYXArKykKLQkJICAgIHsKLQkJICAgICAgaW50IGluY2xfdHlwZTsKLQotCQkgICAgICBpbmNsX3R5cGUgPSBiZmRfaF9nZXRfOCAoaW5wdXRfYmZkLCBpbmNsX3N5bS0+ZV90eXBlKTsKLQkJICAgICAgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQkJewotCQkJICBpZiAobmVzdCA9PSAwKQotCQkJICAgIHsKLQkJCSAgICAgICppbmNsX21hcCA9IC0xOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICAtLW5lc3Q7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQotCQkJKytuZXN0OwotCQkgICAgICBlbHNlIGlmIChuZXN0ID09IDApCi0JCQkqaW5jbF9tYXAgPSAtMTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBDb3B5IHRoaXMgc3ltYm9sIGludG8gdGhlIGxpc3Qgb2Ygc3ltYm9scyB3ZSBhcmUgZ29pbmcgdG8KLQkgd3JpdGUgb3V0LiAgKi8KLSAgICAgIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCB0eXBlLCBvdXRzeW0tPmVfdHlwZSk7Ci0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgc3ltLT5lX290aGVyKSwKLQkJICAgb3V0c3ltLT5lX290aGVyKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgYmZkX2hfZ2V0XzE2IChpbnB1dF9iZmQsIHN5bS0+ZV9kZXNjKSwKLQkJICAgIG91dHN5bS0+ZV9kZXNjKTsKLSAgICAgIGNvcHkgPSBmYWxzZTsKLSAgICAgIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKLQl7Ci0JICAvKiBuYW1lIHBvaW50cyBpbnRvIGEgc3RyaW5nIHRhYmxlIHdoaWNoIHdlIGFyZSBnb2luZyB0bwotCSAgICAgZnJlZS4gIElmIHRoZXJlIGlzIGEgaGFzaCB0YWJsZSBlbnRyeSwgdXNlIHRoYXQgc3RyaW5nLgotCSAgICAgT3RoZXJ3aXNlLCBjb3B5IG5hbWUgaW50byBtZW1vcnkuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgY29weSA9IHRydWU7Ci0JfQotICAgICAgc3RydGFiX2luZGV4ID0gYWRkX3RvX3N0cmluZ3RhYiAob3V0cHV0X2JmZCwgZmluZm8tPnN0cnRhYiwKLQkJCQkgICAgICAgbmFtZSwgY29weSk7Ci0gICAgICBpZiAoc3RydGFiX2luZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgc3RydGFiX2luZGV4LCBvdXRzeW0tPmVfc3RyeCk7Ci0gICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgdmFsLCBvdXRzeW0tPmVfdmFsdWUpOwotICAgICAgKnN5bWJvbF9tYXAgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotICAgICAgKytvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotICAgICAgKytvdXRzeW07Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgb3V0cHV0IHN5bWJvbHMgd2UgaGF2ZSBqdXN0IGNvbnN0cnVjdGVkLiAgKi8KLSAgaWYgKG91dHN5bSA+IGZpbmZvLT5vdXRwdXRfc3ltcykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIG91dHN5bV9jb3VudDsKLQotICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBmaW5mby0+c3ltb2ZmLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBvdXRzeW1fY291bnQgPSBvdXRzeW0gLSBmaW5mby0+b3V0cHV0X3N5bXM7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBmaW5mby0+b3V0cHV0X3N5bXMsCi0JCSAgICAgKGJmZF9zaXplX3R5cGUpIEVYVEVSTkFMX05MSVNUX1NJWkUsCi0JCSAgICAgKGJmZF9zaXplX3R5cGUpIG91dHN5bV9jb3VudCwgb3V0cHV0X2JmZCkKLQkgICE9IG91dHN5bV9jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZmluZm8tPnN5bW9mZiArPSBvdXRzeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3ltYm9sIHRoYXQgd2FzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gYS5vdXQgaW5wdXQKLSAgIG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvID0gKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqKSBkYXRhOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGludCB0eXBlOwotICBiZmRfdm1hIHZhbDsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0IG91dHN5bTsKLSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLQotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKG91dHB1dF9iZmQpLT53cml0ZV9keW5hbWljX3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgoKmFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+d3JpdGVfZHluYW1pY19zeW1ib2wpCi0JICAgICAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIGgpKSkKLQl7Ci0JICAvKiBGSVhNRTogTm8gd2F5IHRvIGhhbmRsZSBlcnJvcnMuICAqLwotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+d3JpdHRlbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoLT53cml0dGVuID0gdHJ1ZTsKLQotICAvKiBBbiBpbmR4IG9mIC0yIG1lYW5zIHRoZSBzeW1ib2wgbXVzdCBiZSB3cml0dGVuLiAgKi8KLSAgaWYgKGgtPmluZHggIT0gLTIKLSAgICAgICYmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICB8fCAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgLyogQXZvaWQgdmFyaWFibGUgbm90IGluaXRpYWxpemVkIHdhcm5pbmdzLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIHNldCBzeW1ib2xzIHdoZW4gc2V0cyBhcmUgbm90IGJlaW5nCi0gICAgICAgICBidWlsdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWFzZWN0aW9uICpzZWM7Ci0KLQlzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCUJGRF9BU1NFUlQgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotCQkgICAgfHwgc2VjLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQlpZiAoc2VjID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9URVhUIDogTl9XRUFLVDsKLQllbHNlIGlmIChzZWMgPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCSAgdHlwZSA9IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQgPyBOX0RBVEEgOiBOX1dFQUtEOwotCWVsc2UgaWYgKHNlYyA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9CU1MgOiBOX1dFQUtCOwotCWVsc2UKLQkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9BQlMgOiBOX1dFQUtBOwotCXR5cGUgfD0gTl9FWFQ7Ci0JdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkgICAgICAgKyBzZWMtPnZtYQotCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICB0eXBlID0gTl9XRUFLVTsKLSAgICAgIHZhbCA9IDA7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogRklYTUU6IElnbm9yZSB0aGVzZSBmb3Igbm93LiAgVGhlIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2gKLQkgdGhleSBzaG91bGQgYmUgd3JpdHRlbiBvdXQgYXJlIG5vdCBjbGVhciB0byBtZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIHR5cGUsIG91dHN5bS5lX3R5cGUpOwotICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLmVfb3RoZXIpOwotICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIDAsIG91dHN5bS5lX2Rlc2MpOwotICBpbmR4ID0gYWRkX3RvX3N0cmluZ3RhYiAob3V0cHV0X2JmZCwgZmluZm8tPnN0cnRhYiwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgIGZhbHNlKTsKLSAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gaGFuZGxlIGVycm9ycy4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBpbmR4LCBvdXRzeW0uZV9zdHJ4KTsKLSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbCwgb3V0c3ltLmVfdmFsdWUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgZmluZm8tPnN5bW9mZiwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgJm91dHN5bSwgKGJmZF9zaXplX3R5cGUpIEVYVEVSTkFMX05MSVNUX1NJWkUsCi0JCSAgICAoYmZkX3NpemVfdHlwZSkgMSwgb3V0cHV0X2JmZCkgIT0gRVhURVJOQUxfTkxJU1RfU0laRSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIGhhbmRsZSBlcnJvcnMuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGZpbmZvLT5zeW1vZmYgKz0gRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgaC0+aW5keCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0gICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTGluayBhbiBhLm91dCBzZWN0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9zZWN0aW9uIChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvZmZfcHRyLAotCQkJIHJlbF9zaXplKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGZpbGVfcHRyICpyZWxvZmZfcHRyOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBiZmRfc2l6ZV90eXBlIGlucHV0X3NpemU7Ci0gIFBUUiByZWxvY3M7Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaW5wdXRfc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgZmluZm8tPmNvbnRlbnRzLAotCQkJCSAgKGZpbGVfcHRyKSAwLCBpbnB1dF9zaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIGl0LiAgKi8KLSAgaWYgKGFvdXRfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKSAhPSBOVUxMCi0gICAgICAmJiBhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcyAhPSBOVUxMKQotICAgIHJlbG9jcyA9IGFvdXRfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzOwotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NzID0gZmluZm8tPnJlbG9jczsKLSAgICAgIGlmIChyZWxfc2l6ZSA+IDApCi0JewotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChyZWxvY3MsIDEsIHJlbF9zaXplLCBpbnB1dF9iZmQpICE9IHJlbF9zaXplKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQgKGZpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvY3MsCi0JCQkJCSByZWxfc2l6ZSwgZmluZm8tPmNvbnRlbnRzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0IChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2NzLAotCQkJCQkgcmVsX3NpemUsIGZpbmZvLT5jb250ZW50cykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCSAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICAoUFRSKSBmaW5mby0+Y29udGVudHMsCi0JCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgaW5wdXRfc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIHJlbG9jcyB3ZXJlCi0gICAgIG1vZGlmaWVkLCBhbmQgd2Ugbm93IHdyaXRlIHRoZW0gb3V0LiAgKi8KLSAgaWYgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUgJiYgcmVsX3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoZmluZm8tPm91dHB1dF9iZmQsICpyZWxvZmZfcHRyLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChyZWxvY3MsIChiZmRfc2l6ZV90eXBlKSAxLCByZWxfc2l6ZSwgZmluZm8tPm91dHB1dF9iZmQpCi0JICAhPSByZWxfc2l6ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAqcmVsb2ZmX3B0ciArPSByZWxfc2l6ZTsKLQotICAgICAgLyogQXNzZXJ0IHRoYXQgdGhlIHJlbG9jcyBoYXZlIG5vdCBydW4gaW50byB0aGUgc3ltYm9scywgYW5kCi0JIHRoYXQgaWYgdGhlc2UgYXJlIHRoZSB0ZXh0IHJlbG9jcyB0aGV5IGhhdmUgbm90IHJ1biBpbnRvIHRoZQotCSBkYXRhIHJlbG9jcy4gICovCi0gICAgICBCRkRfQVNTRVJUICgqcmVsb2ZmX3B0ciA8PSBvYmpfc3ltX2ZpbGVwb3MgKGZpbmZvLT5vdXRwdXRfYmZkKQotCQkgICYmIChyZWxvZmZfcHRyICE9ICZmaW5mby0+dHJlbG9mZgotCQkgICAgICB8fCAoKnJlbG9mZl9wdHIKLQkJCSAgPD0gb2JqX2RhdGFzZWMgKGZpbmZvLT5vdXRwdXRfYmZkKS0+cmVsX2ZpbGVwb3MpKSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byBhIHJlbG9jIGluZGV4LiAgKi8KLQotc3RhdGljIElOTElORSBhc2VjdGlvbiAqCi1hb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGFiZmQsIGluZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGluZHg7Ci17Ci0gIHN3aXRjaCAoaW5keCAmIE5fVFlQRSkKLSAgICB7Ci0gICAgY2FzZSBOX1RFWFQ6Ci0gICAgICByZXR1cm4gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgIGNhc2UgTl9EQVRBOgotICAgICAgcmV0dXJuIG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICBjYXNlIE5fQlNTOgotICAgICAgcmV0dXJuIG9ial9ic3NzZWMgKGFiZmQpOwotICAgIGNhc2UgTl9BQlM6Ci0gICAgY2FzZSBOX1VOREY6Ci0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmVsb2NhdGUgYW4gYS5vdXQgc2VjdGlvbiB1c2luZyBzdGFuZGFyZCBhLm91dCByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkIChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY3MsCi0JCQkgICAgIHJlbF9zaXplLCBjb250ZW50cykKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvY3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgYm9vbGVhbiAoKmNoZWNrX2R5bmFtaWNfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCSAgUFRSLCBiZmRfYnl0ZSAqLCBib29sZWFuICosCi0JCQkJCSAgYmZkX3ZtYSAqKSk7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltczsKLSAgY2hhciAqc3RyaW5nczsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgaW50ICpzeW1ib2xfbWFwOwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50OwotICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWw7Ci0gIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbF9lbmQ7Ci0KLSAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOwotICBjaGVja19keW5hbWljX3JlbG9jID0gYW91dF9iYWNrZW5kX2luZm8gKG91dHB1dF9iZmQpLT5jaGVja19keW5hbWljX3JlbG9jOwotCi0gIEJGRF9BU1NFUlQgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcik7Ci0KLSAgcmVsb2NhdGVhYmxlID0gZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZTsKLSAgc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChpbnB1dF9iZmQpOwotICBzeW1faGFzaGVzID0gb2JqX2FvdXRfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgc3ltYm9sX21hcCA9IGZpbmZvLT5zeW1ib2xfbWFwOwotCi0gIHJlbG9jX2NvdW50ID0gcmVsX3NpemUgLyBSRUxPQ19TVERfU0laRTsKLSAgcmVsID0gcmVsb2NzOwotICByZWxfZW5kID0gcmVsICsgcmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHJfYWRkcjsKLSAgICAgIGludCByX2luZGV4OwotICAgICAgaW50IHJfZXh0ZXJuOwotICAgICAgaW50IHJfcGNyZWw7Ci0gICAgICBpbnQgcl9iYXNlcmVsID0gMDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX2FkZHIgPSBHRVRfU1dPUkQgKGlucHV0X2JmZCwgcmVsLT5yX2FkZHJlc3MpOwotCi0jaWZkZWYgTVlfcmVsb2NfaG93dG8KLSAgICAgIGhvd3RvID0gTVlfcmVsb2NfaG93dG8oaW5wdXRfYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKTsKLSNlbHNlICAgICAgCi0gICAgICB7Ci0JaW50IHJfam1wdGFibGU7Ci0JaW50IHJfcmVsYXRpdmU7Ci0JaW50IHJfbGVuZ3RoOwotCXVuc2lnbmVkIGludCBob3d0b19pZHg7Ci0KLQlpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCSAgewotCSAgICByX2luZGV4ICAgPSAgKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCQkgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0JICAgIHJfZXh0ZXJuICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLQkgICAgcl9wY3JlbCAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0JICAgIHJfYmFzZXJlbCA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHKSk7Ci0JICAgIHJfam1wdGFibGU9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOwotCSAgICByX3JlbGF0aXZlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcpKTsKLQkgICAgcl9sZW5ndGggID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0JCQkgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICByX2luZGV4ICAgPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkJCSB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSB8IHJlbC0+cl9pbmRleFswXSk7Ci0JICAgIHJfZXh0ZXJuICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLQkgICAgcl9wY3JlbCAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7Ci0JICAgIHJfYmFzZXJlbCA9ICgwICE9IChyZWwtPnJfdHlwZVswXQotCQkJICAgICAgICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpKTsKLQkgICAgcl9qbXB0YWJsZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdCi0JCQkgICAgICAgJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKLQkgICAgcl9yZWxhdGl2ZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdCi0JCQkgICAgICAgJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUpKTsKLQkgICAgcl9sZW5ndGggID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUpCi0JCQkgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0JICB9Ci0KLQlob3d0b19pZHggPSAocl9sZW5ndGggKyA0ICogcl9wY3JlbCArIDggKiByX2Jhc2VyZWwKLQkJICAgICArIDE2ICogcl9qbXB0YWJsZSArIDMyICogcl9yZWxhdGl2ZSk7Ci0JQkZEX0FTU0VSVCAoaG93dG9faWR4IDwgVEFCTEVfU0laRSAoaG93dG9fdGFibGVfc3RkKSk7Ci0JaG93dG8gPSBob3d0b190YWJsZV9zdGQgKyBob3d0b19pZHg7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSwgYW5kIG11c3QKLQkgICAgIG1vZGlmeSB0aGUgcmVsb2MgYWNjb3JkaW5nbHkuICAqLwotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2Uga25vdyB0aGUgc3ltYm9sIHRoaXMgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0LAotCQkgY29udmVydCBpdCBpbnRvIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoaXMKLQkJIGlzIHdoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgZG9lcy4gICovCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCXsKLQkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBDaGFuZ2UgdGhlIHJfZXh0ZXJuIHZhbHVlLiAgKi8KLQkJICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOwotCQkgIGVsc2UKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX2luZGV4LiAgKi8KLQkJICBvdXRwdXRfc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX1RFWFQ7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fREFUQTsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX0JTUzsKLQkJICBlbHNlCi0JCSAgICByX2luZGV4ID0gTl9BQlM7Ci0KLQkJICAvKiBBZGQgdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIHNlY3Rpb24gVk1BIHRvIHRoZQotCQkgICAgIGFkZGVuZCBzdG9yZWQgaW4gdGhlIGNvbnRlbnRzLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIG91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNoYW5nZSByX2luZGV4IGFjY29yZGluZyB0byB0aGUgc3ltYm9sCi0JCSAgICAgbWFwLiAgKi8KLQkJICByX2luZGV4ID0gc3ltYm9sX21hcFtyX2luZGV4XTsKLQotCQkgIGlmIChyX2luZGV4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQkJewotCQkJICAvKiBXZSBkZWNpZGVkIHRvIHN0cmlwIHRoaXMgc3ltYm9sLCBidXQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QuICBOb3RlIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zZSB0aGUgb3RoZXIgYW5kIGRlc2MgaW5mb3JtYXRpb24gaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBkb24ndCB0aGluayB0aGF0IHdpbGwgZXZlciBtYXR0ZXIgZm9yIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbC4gICovCi0JCQkgIGlmIChoLT5pbmR4IDwgMCkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5pbmR4ID0gLTI7Ci0JCQkgICAgICBoLT53cml0dGVuID0gZmFsc2U7Ci0JCQkgICAgICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLAotCQkJCQkJCQkgIChQVFIpIGZpbmZvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJICByX2luZGV4ID0gaC0+aW5keDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIHJfYWRkcikpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgcl9pbmRleCA9IDA7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSBuZXcgcl9pbmRleCB2YWx1ZS4gICovCi0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQkJICByZWwtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JCSAgcmVsLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgV2UgbXVzdAotCQkgYWRqdXN0IGJ5IHRoZSBhbW91bnQgdGhhdCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCi0JICAgICAgc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkgICAgICByZWxvY2F0aW9uID0gKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHNlY3Rpb24tPnZtYSk7Ci0JICAgIH0KLQotCSAgLyogQ2hhbmdlIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLQkgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAotCQkgICAgcl9hZGRyICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHJlbC0+cl9hZGRyZXNzKTsKLQotCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlCi0JICAgICB0byB0aGUgb3JpZ2luYWwgYWRkcmVzcyBpbiB0aGUgc2VjdGlvbiBhbmQgaW5jbHVkaW5nIHRoZQotCSAgICAgcmVmZXJlbmNlIHRvIHRoZSBuZXcgYWRkcmVzcy4gICovCi0JICBpZiAocl9wY3JlbCkKLQkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSNpZmRlZiBNWV9yZWxvY2F0YWJsZV9yZWxvYwotCSAgTVlfcmVsb2NhdGFibGVfcmVsb2MgKGhvd3RvLCBvdXRwdXRfYmZkLCByZWwsIHJlbG9jYXRpb24sIHJfYWRkcik7Ci0jZW5kaWYKLQotCSAgaWYgKHJlbG9jYXRpb24gPT0gMCkKLQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkgIGVsc2UKLQkgICAgciA9IE1ZX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCQljb250ZW50cyArIHJfYWRkcik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJvb2xlYW4gaHVuZGVmOwotCi0JICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhbiBleGVjdXRhYmxlLCBhbmQgbXVzdCBkbyBhIGZ1bGwKLQkgICAgIHJlbG9jYXRpb24uICAqLwotCSAgaHVuZGVmID0gZmFsc2U7Ci0KLQkgIGlmIChyX2V4dGVybikKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotCi0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXJlbG9jYXRpb24gPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGh1bmRlZiA9IHRydWU7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgICAgICBzZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gc2VjdGlvbi0+dm1hKTsKLQkgICAgICBpZiAocl9wY3JlbCkKLQkJcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIH0KLQotCSAgaWYgKGNoZWNrX2R5bmFtaWNfcmVsb2MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gc2tpcDsKLQotCSAgICAgIGlmICghICgoKmNoZWNrX2R5bmFtaWNfcmVsb2MpCi0JCSAgICAgKGZpbmZvLT5pbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGgsCi0JCSAgICAgIChQVFIpIHJlbCwgY29udGVudHMsICZza2lwLCAmcmVsb2NhdGlvbikpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKHNraXApCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE5vdyB3YXJuIGlmIGEgZ2xvYmFsIHN5bWJvbCBpcyB1bmRlZmluZWQuICBXZSBjb3VsZCBub3QKLSAgICAgICAgICAgICBkbyB0aGlzIGVhcmxpZXIsIGJlY2F1c2UgY2hlY2tfZHluYW1pY19yZWxvYyBtaWdodCB3YW50Ci0gICAgICAgICAgICAgdG8gc2tpcCB0aGlzIHJlbG9jLiAgKi8KLQkgIGlmIChodW5kZWYgJiYgISBmaW5mby0+aW5mby0+c2hhcmVkICYmICEgcl9iYXNlcmVsKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIGVsc2UKLQkJbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByX2FkZHIsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHIgPSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgY29udGVudHMsIHJfYWRkciwgcmVsb2NhdGlvbiwKLQkJCQkgICAgICAoYmZkX3ZtYSkgMCk7Ci0JfQotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlIGlmIChyX2V4dGVybikKLQkJICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQllbHNlCi0JCSAgewotCQkgICAgYXNlY3Rpb24gKnM7Ci0KLQkJICAgIHMgPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JCSAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzKTsKLQkJICB9Ci0JCWlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBob3d0by0+bmFtZSwKLQkJCShiZmRfdm1hKSAwLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfYWRkcikpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBhLm91dCBzZWN0aW9uIHVzaW5nIGV4dGVuZGVkIGEub3V0IHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQgKGZpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jcywKLQkJCSAgICAgcmVsX3NpemUsIGNvbnRlbnRzKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICBQVFIsIGJmZF9ieXRlICosIGJvb2xlYW4gKiwKLQkJCQkJICBiZmRfdm1hICopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotICBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBpbnQgKnN5bWJvbF9tYXA7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbDsKLSAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsX2VuZDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIGNoZWNrX2R5bmFtaWNfcmVsb2MgPSBhb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPmNoZWNrX2R5bmFtaWNfcmVsb2M7Ci0KLSAgQkZEX0FTU0VSVCAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfRVhUX1NJWkUpOwotICBCRkRfQVNTRVJUIChpbnB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIKLQkgICAgICA9PSBvdXRwdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyKTsKLQotICByZWxvY2F0ZWFibGUgPSBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlOwotICBzeW1zID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGlucHV0X2JmZCk7Ci0gIHN5bV9oYXNoZXMgPSBvYmpfYW91dF9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBzeW1ib2xfbWFwID0gZmluZm8tPnN5bWJvbF9tYXA7Ci0KLSAgcmVsb2NfY291bnQgPSByZWxfc2l6ZSAvIFJFTE9DX0VYVF9TSVpFOwotICByZWwgPSByZWxvY3M7Ci0gIHJlbF9lbmQgPSByZWwgKyByZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgcl9hZGRyOwotICAgICAgaW50IHJfaW5kZXg7Ci0gICAgICBpbnQgcl9leHRlcm47Ci0gICAgICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICAgICAgYmZkX3ZtYSByX2FkZGVuZDsKLSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0gICAgICBhc2VjdGlvbiAqcl9zZWN0aW9uID0gTlVMTDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAgICAgcl9hZGRyID0gR0VUX1NXT1JEIChpbnB1dF9iZmQsIHJlbC0+cl9hZGRyZXNzKTsKLQotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQl7Ci0JICByX2luZGV4ICA9ICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgfCByZWwtPnJfaW5kZXhbMl0pOwotCSAgcl9leHRlcm4gPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHKSk7Ci0JICByX3R5cGUgICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByX2luZGV4ICA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgfCByZWwtPnJfaW5kZXhbMF0pOwotCSAgcl9leHRlcm4gPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFKSk7Ci0JICByX3R5cGUgICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRSkKLQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpOwotCX0KLQotICAgICAgcl9hZGRlbmQgPSBHRVRfU1dPUkQgKGlucHV0X2JmZCwgcmVsLT5yX2FkZGVuZCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA8IFRBQkxFX1NJWkUgKGhvd3RvX3RhYmxlX2V4dCkpOwotCi0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLCBhbmQgbXVzdAotCSAgICAgbW9kaWZ5IHRoZSByZWxvYyBhY2NvcmRpbmdseS4gICovCi0JICBpZiAocl9leHRlcm4KLQkgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JICAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBrbm93IHRoZSBzeW1ib2wgdGhpcyByZWxvY2F0aW9uIGlzIGFnYWluc3QsCi0JCSBjb252ZXJ0IGl0IGludG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhpcwotCQkgaXMgd2hhdCB0aGUgbmF0aXZlIGxpbmtlciBkb2VzLiAgKi8KLQkgICAgICBpZiAocl90eXBlID09IFJFTE9DX0JBU0UxMAotCQkgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkJICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCQloID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCWggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0JCSAgLyogQ2hhbmdlIHRoZSByX2V4dGVybiB2YWx1ZS4gICovCi0JCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCSAgICByZWwtPnJfdHlwZVswXSAmPX4gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRzsKLQkJICBlbHNlCi0JCSAgICByZWwtPnJfdHlwZVswXSAmPX4gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRTsKLQotCQkgIC8qIENvbXB1dGUgYSBuZXcgcl9pbmRleC4gICovCi0JCSAgb3V0cHV0X3NlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCQkgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9URVhUOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX0RBVEE7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9CU1M7Ci0JCSAgZWxzZQotCQkgICAgcl9pbmRleCA9IE5fQUJTOwotCi0JCSAgLyogQWRkIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZSBzZWN0aW9uIFZNQSB0byB0aGUKLQkJICAgICBhZGRlbmQuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgb3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkgIC8qIE5vdyBSRUxPQ0FUSU9OIGlzIHRoZSBWTUEgb2YgdGhlIGZpbmFsCi0JCSAgICAgZGVzdGluYXRpb24uICBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsCi0JCSAgICAgdGhlbiBBRERFTkQgaXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSBzb3VyY2UgVk1BLgotCQkgICAgIFdlIHdhbnQgdG8gc2V0IEFEREVORCB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0JCSAgICAgdGhlIGRlc3RpbmF0aW9uIFZNQSBhbmQgdGhlIHNvdXJjZSBWTUEsIHdoaWNoCi0JCSAgICAgbWVhbnMgd2UgbXVzdCBhZGp1c3QgUkVMT0NBVElPTiBieSB0aGUgY2hhbmdlIGluCi0JCSAgICAgdGhlIHNvdXJjZSBWTUEuICBUaGlzIGlzIGRvbmUgYmVsb3cuICAqLwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UgbXVzdCBjaGFuZ2Ugcl9pbmRleCBhY2NvcmRpbmcgdG8gdGhlIHN5bWJvbAotCQkgICAgIG1hcC4gICovCi0JCSAgcl9pbmRleCA9IHN5bWJvbF9tYXBbcl9pbmRleF07Ci0KLQkJICBpZiAocl9pbmRleCA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGggIT0gTlVMTCkKLQkJCXsKLQkJCSAgLyogV2UgZGVjaWRlZCB0byBzdHJpcCB0aGlzIHN5bWJvbCwgYnV0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIG91dCB0aGF0IHdlIGNhbid0LiAgTm90ZSB0aGF0IHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc2UgdGhlIG90aGVyIGFuZCBkZXNjIGluZm9ybWF0aW9uIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgZG9uJ3QgdGhpbmsgdGhhdCB3aWxsIGV2ZXIgbWF0dGVyIGZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wuICAqLwotCQkJICBpZiAoaC0+aW5keCA8IDApCi0JCQkgICAgewotCQkJICAgICAgaC0+aW5keCA9IC0yOwotCQkJICAgICAgaC0+d3JpdHRlbiA9IGZhbHNlOwotCQkJICAgICAgaWYgKCEgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwKLQkJCQkJCQkJICAoUFRSKSBmaW5mbykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQkJCSAgcl9pbmRleCA9IGgtPmluZHg7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkJICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkJCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCQkgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICByX2FkZHIpKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIHJfaW5kZXggPSAwOwotCQkJfQotCQkgICAgfQotCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0KLQkJICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHRoZW4gdGhlIGFkZGVuZAotCQkgICAgIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgc291cmNlIFZNQS4gIFdlIG11c3QKLQkJICAgICBhZGp1c3QgaXQgYnkgdGhlIGNoYW5nZSBpbiB0aGUgc291cmNlIFZNQS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGJlbG93LiAgKi8KLQkJfQotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSBuZXcgcl9pbmRleCB2YWx1ZS4gICovCi0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQkJICByZWwtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JCSAgcmVsLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFdlIG11c3QKLQkJIGFkanVzdCBieSB0aGUgYW1vdW50IHRoYXQgdGhlIHNlY3Rpb24gbW92ZWQuICAqLwotCSAgICAgIHJfc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkgICAgICByZWxvY2F0aW9uID0gKHJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgcl9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSByX3NlY3Rpb24tPnZtYSk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHRoZW4gdGhlIGFkZGVuZCBpcwotCQkgdGhlIGRpZmZlcmVuY2UgaW4gVk1BIGJldHdlZW4gdGhlIGRlc3RpbmF0aW9uIGFuZCB0aGUKLQkJIHNvdXJjZS4gIFdlIGhhdmUganVzdCBhZGp1c3RlZCBmb3IgdGhlIGNoYW5nZSBpbiBWTUEKLQkJIG9mIHRoZSBkZXN0aW5hdGlvbiwgc28gd2UgbXVzdCBhbHNvIGFkanVzdCBieSB0aGUKLQkJIGNoYW5nZSBpbiBWTUEgb2YgdGhlIHNvdXJjZS4gIFRoaXMgaXMgZG9uZSBiZWxvdy4gICovCi0JICAgIH0KLQotCSAgLyogQXMgZGVzY3JpYmVkIGFib3ZlLCB3ZSBtdXN0IGFsd2F5cyBhZGp1c3QgYSBQQyByZWxhdGl2ZQotCSAgICAgcmVsb2MgYnkgdGhlIGNoYW5nZSBpbiBWTUEgb2YgdGhlIHNvdXJjZS4gIEhvd2V2ZXIsIGlmCi0JICAgICBwY3JlbF9vZmZzZXQgaXMgc2V0LCB0aGVuIHRoZSBhZGRlbmQgZG9lcyBub3QgaW5jbHVkZSB0aGUKLQkgICAgIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBuZWVkCi0JICAgICB0byBhZGp1c3QgYW55dGhpbmcuICAqLwotCSAgaWYgKGhvd3RvX3RhYmxlX2V4dFtyX3R5cGVdLnBjX3JlbGF0aXZlCi0JICAgICAgJiYgISBob3d0b190YWJsZV9leHRbcl90eXBlXS5wY3JlbF9vZmZzZXQpCi0JICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAvKiBDaGFuZ2UgdGhlIGFkZGVuZCBpZiBuZWNlc3NhcnkuICAqLwotCSAgaWYgKHJlbG9jYXRpb24gIT0gMCkKLQkgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHJfYWRkZW5kICsgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLQkgIC8qIENoYW5nZSB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbi4gICovCi0JICBQVVRfV09SRCAob3V0cHV0X2JmZCwKLQkJICAgIHJfYWRkciArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCSAgICByZWwtPnJfYWRkcmVzcyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJvb2xlYW4gaHVuZGVmOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGFuIGV4ZWN1dGFibGUsIGFuZCBtdXN0IGRvIGEgZnVsbAotCSAgICAgcmVsb2NhdGlvbi4gICovCi0JICBodW5kZWYgPSBmYWxzZTsKLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0KLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaHVuZGVmID0gdHJ1ZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JCSAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkJICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKLQkgICAgewotCSAgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltOwotCSAgICAgIGludCB0eXBlOwotCi0JICAgICAgLyogRm9yIGJhc2UgcmVsYXRpdmUgcmVsb2NzLCByX2luZGV4IGlzIGFsd2F5cyBhbiBpbmRleAotICAgICAgICAgICAgICAgICBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIGV2ZW4gaWYgcl9leHRlcm4gaXMgMC4gICovCi0JICAgICAgc3ltID0gc3ltcyArIHJfaW5kZXg7Ci0JICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV90eXBlKTsKLQkgICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fVEVYVAotCQkgIHx8IHR5cGUgPT0gTl9XRUFLVCkKLQkJcl9zZWN0aW9uID0gb2JqX3RleHRzZWMgKGlucHV0X2JmZCk7Ci0JICAgICAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fREFUQQotCQkgICAgICAgfHwgdHlwZSA9PSBOX1dFQUtEKQotCQlyX3NlY3Rpb24gPSBvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKTsKLQkgICAgICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9CU1MKLQkJICAgICAgIHx8IHR5cGUgPT0gTl9XRUFLQikKLQkJcl9zZWN0aW9uID0gb2JqX2Jzc3NlYyAoaW5wdXRfYmZkKTsKLQkgICAgICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9BQlMKLQkJICAgICAgIHx8IHR5cGUgPT0gTl9XRUFLQSkKLQkJcl9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBlbHNlCi0JCWFib3J0ICgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAocl9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyByX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICArIChHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfdmFsdWUpCi0JCQkgICAgICAgLSByX3NlY3Rpb24tPnZtYSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByX3NlY3Rpb24gPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHRoZW4gUl9BRERFTkQgaXMgdGhlCi0JCSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byB2bWFzLCBvcgotCQkgICBvbGRfZGVzdF9zZWMgKyBvbGRfZGVzdF9vZmYgLSAob2xkX3NyY19zZWMgKyBvbGRfc3JjX29mZikKLQkJIHdoZXJlCi0JCSAgIG9sZF9kZXN0X3NlYyA9PSBzZWN0aW9uLT52bWEKLQkJIGFuZAotCQkgICBvbGRfc3JjX3NlYyA9PSBpbnB1dF9zZWN0aW9uLT52bWEKLQkJIGFuZAotCQkgICBvbGRfc3JjX29mZiA9PSByX2FkZHIKLQotCQkgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIGV4cGVjdHMgUkVMT0NBVElPTiArCi0JCSBSX0FEREVORCB0byBiZSB0aGUgVk1BIG9mIHRoZSBkZXN0aW5hdGlvbiBtaW51cwotCQkgcl9hZGRyICh0aGUgbWludXMgcl9hZGRyIGlzIGJlY2F1c2UgdGhpcyByZWxvY2F0aW9uCi0JCSBpcyBub3QgcGNyZWxfb2Zmc2V0LCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcgYW5kCi0JCSBzaG91bGQsIHBlcmhhcHMsIGJlIGNoYW5nZWQpLCBvcgotCQkgICBuZXdfZGVzdF9zZWMKLQkJIHdoZXJlCi0JCSAgIG5ld19kZXN0X3NlYyA9PSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgb3V0cHV0X29mZnNldAotCQkgV2UgYXJyYW5nZSBmb3IgdGhpcyB0byBoYXBwZW4gYnkgc2V0dGluZyBSRUxPQ0FUSU9OIHRvCi0JCSAgIG5ld19kZXN0X3NlYyArIG9sZF9zcmNfc2VjIC0gb2xkX2Rlc3Rfc2VjCi0KLQkJIElmIHRoaXMgaXMgbm90IGEgUEMgcmVsYXRpdmUgcmVsb2MsIHRoZW4gUl9BRERFTkQgaXMKLQkJIHNpbXBseSB0aGUgVk1BIG9mIHRoZSBkZXN0aW5hdGlvbiwgc28gd2Ugc2V0Ci0JCSBSRUxPQ0FUSU9OIHRvIHRoZSBjaGFuZ2UgaW4gdGhlIGRlc3RpbmF0aW9uIFZNQSwgb3IKLQkJICAgbmV3X2Rlc3Rfc2VjIC0gb2xkX2Rlc3Rfc2VjCi0JCSAqLwotCSAgICAgIHJlbG9jYXRpb24gPSAocl9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyByX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHJfc2VjdGlvbi0+dm1hKTsKLQkgICAgICBpZiAoaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ucGNfcmVsYXRpdmUpCi0JCXJlbG9jYXRpb24gKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgICB9Ci0KLQkgIGlmIChjaGVja19keW5hbWljX3JlbG9jICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBib29sZWFuIHNraXA7Ci0KLQkgICAgICBpZiAoISAoKCpjaGVja19keW5hbWljX3JlbG9jKQotCQkgICAgIChmaW5mby0+aW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoLAotCQkgICAgICAoUFRSKSByZWwsIGNvbnRlbnRzLCAmc2tpcCwgJnJlbG9jYXRpb24pKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChza2lwKQotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBOb3cgd2FybiBpZiBhIGdsb2JhbCBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgV2UgY291bGQgbm90Ci0gICAgICAgICAgICAgZG8gdGhpcyBlYXJsaWVyLCBiZWNhdXNlIGNoZWNrX2R5bmFtaWNfcmVsb2MgbWlnaHQgd2FudAotICAgICAgICAgICAgIHRvIHNraXAgdGhpcyByZWxvYy4gICovCi0JICBpZiAoaHVuZGVmCi0JICAgICAgJiYgISBmaW5mby0+aW5mby0+c2hhcmVkCi0JICAgICAgJiYgcl90eXBlICE9IFJFTE9DX0JBU0UxMAotCSAgICAgICYmIHJfdHlwZSAhPSBSRUxPQ19CQVNFMTMKLQkgICAgICAmJiByX3R5cGUgIT0gUkVMT0NfQkFTRTIyKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIGVsc2UKLQkJbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByX2FkZHIsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChyX3R5cGUgIT0gUkVMT0NfU1BBUkNfUkVWMzIpCi0JICAgIHIgPSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0b190YWJsZV9leHQgKyByX3R5cGUsCi0JCQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJfYWRkciwgcmVsb2NhdGlvbiwKLQkJCQkJcl9hZGRlbmQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB4OwotCi0JICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByX2FkZHIpOwotCSAgICAgIHggPSB4ICsgcmVsb2NhdGlvbiArIHJfYWRkZW5kOwotCSAgICAgIGJmZF9wdXRsMzIgKC8qaW5wdXRfYmZkLCovIHgsIGNvbnRlbnRzICsgcl9hZGRyKTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQkgIGFib3J0ICgpOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgICBpZiAoaCAhPSBOVUxMKQotCQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJICAgIGVsc2UgaWYgKHJfZXh0ZXJuCi0JCQkgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkJCSAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkJICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCQkgICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCQkgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlhc2VjdGlvbiAqczsKLQotCQkJcyA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkJCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQkgICAgICB9Ci0JCSAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJCSAgIChmaW5mby0+aW5mbywgbmFtZSwgaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ubmFtZSwKLQkJCSAgICByX2FkZGVuZCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX2FkZHIpKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgbGluayBvcmRlciB3aGljaCBpcyBzdXBwb3NlZCB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19yZWxvY19saW5rX29yZGVyIChmaW5mbywgbywgcCkKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYXNlY3Rpb24gKm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jICpwcjsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gIGZpbGVfcHRyICpyZWxvZmZfcHRyID0gTlVMTDsKLSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCBzcmVsOwotICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIGVyZWw7Ci0gIFBUUiByZWxfcHRyOwotCi0gIHByID0gcC0+dS5yZWxvYy5wOwotCi0gIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAocHItPnUuc2VjdGlvbikpCi0Jcl9pbmRleCA9IE5fQUJTIHwgTl9FWFQ7Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAocHItPnUuc2VjdGlvbi0+b3duZXIgPT0gZmluZm8tPm91dHB1dF9iZmQpOwotCSAgcl9pbmRleCA9IHByLT51LnNlY3Rpb24tPnRhcmdldF9pbmRleDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBCRkRfQVNTRVJUIChwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcik7Ci0gICAgICByX2V4dGVybiA9IDE7Ci0gICAgICBoID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSBwci0+dS5uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+aW5keCA+PSAwKQotCXJfaW5kZXggPSBoLT5pbmR4OwotICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCXsKLQkgIC8qIFdlIGRlY2lkZWQgdG8gc3RyaXAgdGhpcyBzeW1ib2wsIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCB3ZQotCSAgICAgY2FuJ3QuICBOb3RlIHRoYXQgd2UgbG9zZSB0aGUgb3RoZXIgYW5kIGRlc2MgaW5mb3JtYXRpb24KLQkgICAgIGhlcmUuICBJIGRvbid0IHRoaW5rIHRoYXQgd2lsbCBldmVyIG1hdHRlciBmb3IgYSBnbG9iYWwKLQkgICAgIHN5bWJvbC4gICovCi0JICBoLT5pbmR4ID0gLTI7Ci0JICBoLT53cml0dGVuID0gZmFsc2U7Ci0JICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLCAoUFRSKSBmaW5mbykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJfaW5kZXggPSBoLT5pbmR4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGZpbmZvLT5pbmZvLCBwci0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJfaW5kZXggPSAwOwotCX0KLSAgICB9Ci0KLSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGZpbmZvLT5vdXRwdXRfYmZkLCBwci0+cmVsb2MpOwotICBpZiAoaG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG8gPT0gb2JqX3RleHRzZWMgKGZpbmZvLT5vdXRwdXRfYmZkKSkKLSAgICByZWxvZmZfcHRyID0gJmZpbmZvLT50cmVsb2ZmOwotICBlbHNlIGlmIChvID09IG9ial9kYXRhc2VjIChmaW5mby0+b3V0cHV0X2JmZCkpCi0gICAgcmVsb2ZmX3B0ciA9ICZmaW5mby0+ZHJlbG9mZjsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZmluZm8tPm91dHB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotICAgIHsKLSNpZmRlZiBNWV9wdXRfcmVsb2MKLSAgICAgIE1ZX3B1dF9yZWxvYyhmaW5mby0+b3V0cHV0X2JmZCwgcl9leHRlcm4sIHJfaW5kZXgsIHAtPm9mZnNldCwgaG93dG8sCi0JCSAgICZzcmVsKTsKLSNlbHNlCi0gICAgICB7Ci0JaW50IHJfcGNyZWw7Ci0JaW50IHJfYmFzZXJlbDsKLQlpbnQgcl9qbXB0YWJsZTsKLQlpbnQgcl9yZWxhdGl2ZTsKLQlpbnQgcl9sZW5ndGg7Ci0KLQlyX3BjcmVsID0gaG93dG8tPnBjX3JlbGF0aXZlOwotCXJfYmFzZXJlbCA9IChob3d0by0+dHlwZSAmIDgpICE9IDA7Ci0Jcl9qbXB0YWJsZSA9IChob3d0by0+dHlwZSAmIDE2KSAhPSAwOwotCXJfcmVsYXRpdmUgPSAoaG93dG8tPnR5cGUgJiAzMikgIT0gMDsKLQlyX2xlbmd0aCA9IGhvd3RvLT5zaXplOwotCi0JUFVUX1dPUkQgKGZpbmZvLT5vdXRwdXRfYmZkLCBwLT5vZmZzZXQsIHNyZWwucl9hZGRyZXNzKTsKLQlpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JICB7Ci0JICAgIHNyZWwucl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0JICAgIHNyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkgICAgc3JlbC5yX2luZGV4WzJdID0gcl9pbmRleDsKLQkgICAgc3JlbC5yX3R5cGVbMF0gPQotCSAgICAgICgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IDApCi0JICAgICAgIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCSAgICAgICB8IChyX2Jhc2VyZWwgPyAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcgOiAwKQotCSAgICAgICB8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHIDogMCkKLQkgICAgICAgfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRyA6IDApCi0JICAgICAgIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBzcmVsLnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCSAgICBzcmVsLnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JICAgIHNyZWwucl9pbmRleFswXSA9IHJfaW5kZXg7Ci0JICAgIHNyZWwucl90eXBlWzBdID0KLQkgICAgICAoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSAgICAgICB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQkgICAgICAgfCAocl9iYXNlcmVsID8gIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFIDogMCkKLQkgICAgICAgfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSA6IDApCi0JICAgICAgIHwgKHJfcmVsYXRpdmUgPyBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUgOiAwKQotCSAgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotCSAgfQotICAgICAgfQotI2VuZGlmCi0gICAgICByZWxfcHRyID0gKFBUUikgJnNyZWw7Ci0KLSAgICAgIC8qIFdlIGhhdmUgdG8gd3JpdGUgdGhlIGFkZGVuZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwgc2luY2UKLQkgc3RhbmRhcmQgYS5vdXQgcmVsb2NzIGFyZSBpbiBwbGFjZS4gIEl0IHdvdWxkIGJlIG1vcmUKLQkgcmVsaWFibGUgaWYgd2UgaGFkIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBmaWxlIGhlcmUsCi0JIHJhdGhlciB0aGFuIGFzc3VtaW5nIHplcm9lcywgYnV0IHdlIGNhbid0IHJlYWQgdGhlIGZpbGUgc2luY2UKLQkgaXQgd2FzIG9wZW5lZCB1c2luZyBiZmRfb3BlbncuICAqLwotICAgICAgaWYgKHByLT5hZGRlbmQgIT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQkgIGJmZF9ieXRlICpidWY7Ci0JICBib29sZWFuIG9rOwotCi0JICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0JICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotCSAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgciA9IE1ZX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJICAgICAgcHItPmFkZGVuZCwgYnVmKTsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vazoKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGZpbmZvLT5pbmZvLAotCQkgICAgICAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgICA/IGJmZF9zZWN0aW9uX25hbWUgKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCQkgICBwci0+dS5zZWN0aW9uKQotCQkgICAgICAgOiBwci0+dS5uYW1lKSwKLQkJICAgICAgaG93dG8tPm5hbWUsIHByLT5hZGRlbmQsIChiZmQgKikgTlVMTCwKLQkJICAgICAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JCXsKLQkJICBmcmVlIChidWYpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoZmluZm8tPm91dHB1dF9iZmQsIG8sCi0JCQkJCSAoUFRSKSBidWYsCi0JCQkJCSAoZmlsZV9wdHIpIHAtPm9mZnNldCwKLQkJCQkJIHNpemUpOwotCSAgZnJlZSAoYnVmKTsKLQkgIGlmICghIG9rKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFBVVF9XT1JEIChmaW5mby0+b3V0cHV0X2JmZCwgcC0+b2Zmc2V0LCBlcmVsLnJfYWRkcmVzcyk7Ci0KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGZpbmZvLT5vdXRwdXRfYmZkKSkKLQl7Ci0JICBlcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotCSAgZXJlbC5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCSAgZXJlbC5yX2luZGV4WzJdID0gcl9pbmRleDsKLQkgIGVyZWwucl90eXBlWzBdID0KLQkgICAgKChyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCSAgICAgfCAoaG93dG8tPnR5cGUgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXJlbC5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQkgIGVyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkgIGVyZWwucl9pbmRleFswXSA9IHJfaW5kZXg7Ci0JICBlcmVsLnJfdHlwZVswXSA9Ci0JICAgIChyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSAgICAgIHwgKGhvd3RvLT50eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLQl9Ci0KLSAgICAgIFBVVF9XT1JEIChmaW5mby0+b3V0cHV0X2JmZCwgcHItPmFkZGVuZCwgZXJlbC5yX2FkZGVuZCk7Ci0KLSAgICAgIHJlbF9wdHIgPSAoUFRSKSAmZXJlbDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChmaW5mby0+b3V0cHV0X2JmZCwgKnJlbG9mZl9wdHIsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlIChyZWxfcHRyLCAoYmZkX3NpemVfdHlwZSkgMSwKLQkJICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZmluZm8tPm91dHB1dF9iZmQpLAotCQkgICAgIGZpbmZvLT5vdXRwdXRfYmZkKQotCSAgIT0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGZpbmZvLT5vdXRwdXRfYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpyZWxvZmZfcHRyICs9IG9ial9yZWxvY19lbnRyeV9zaXplIChmaW5mby0+b3V0cHV0X2JmZCk7Ci0KLSAgLyogQXNzZXJ0IHRoYXQgdGhlIHJlbG9jcyBoYXZlIG5vdCBydW4gaW50byB0aGUgc3ltYm9scywgYW5kIHRoYXQgbgotICAgICB0aGUgdGV4dCByZWxvY3MgaGF2ZSBub3QgcnVuIGludG8gdGhlIGRhdGEgcmVsb2NzLiAgKi8KLSAgQkZEX0FTU0VSVCAoKnJlbG9mZl9wdHIgPD0gb2JqX3N5bV9maWxlcG9zIChmaW5mby0+b3V0cHV0X2JmZCkKLQkgICAgICAmJiAocmVsb2ZmX3B0ciAhPSAmZmluZm8tPnRyZWxvZmYKLQkJICB8fCAoKnJlbG9mZl9wdHIKLQkJICAgICAgPD0gb2JqX2RhdGFzZWMgKGZpbmZvLT5vdXRwdXRfYmZkKS0+cmVsX2ZpbGVwb3MpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJjaGl2ZS5jIGIvYmZkL2FyY2hpdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyOTNhZi4uMDAwMDAwMAotLS0gYS9iZmQvYXJjaGl2ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzMCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGFyY2hpdmUgZmlsZXMgKGxpYnJhcmllcykuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBNb3N0bHkgR3VtYnkgSGVua2VsLVdhbGxhY2UncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotQHNldGZpbGVuYW1lIGFyY2hpdmUtaW5mbwotU0VDVElPTgotCUFyY2hpdmVzCi0KLURFU0NSSVBUSU9OCi0JQW4gYXJjaGl2ZSAob3IgbGlicmFyeSkgaXMganVzdCBhbm90aGVyIEJGRC4gIEl0IGhhcyBhIHN5bWJvbAotCXRhYmxlLCBhbHRob3VnaCB0aGVyZSdzIG5vdCBtdWNoIGEgdXNlciBwcm9ncmFtIHdpbGwgZG8gd2l0aCBpdC4KLQotCVRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIGFyY2hpdmUgQkZEIGFuZCBhbiBvcmRpbmFyeSBCRkQKLQlpcyB0aGF0IHRoZSBhcmNoaXZlIGRvZXNuJ3QgaGF2ZSBzZWN0aW9ucy4gIEluc3RlYWQgaXQgaGFzIGEKLQljaGFpbiBvZiBCRkRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgaXRzIGNvbnRlbnRzLiAgVGhlc2UgQkZEcyBjYW4KLQliZSBtYW5pcHVsYXRlZCBsaWtlIGFueSBvdGhlci4gIFRoZSBCRkRzIGNvbnRhaW5lZCBpbiBhbgotCWFyY2hpdmUgb3BlbmVkIGZvciByZWFkaW5nIHdpbGwgYWxsIGJlIG9wZW5lZCBmb3IgcmVhZGluZy4gIFlvdQotCW1heSBwdXQgZWl0aGVyIGlucHV0IG9yIG91dHB1dCBCRkRzIGludG8gYW4gYXJjaGl2ZSBvcGVuZWQgZm9yCi0Jb3V0cHV0OyB0aGV5IHdpbGwgYmUgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiB0aGUgYXJjaGl2ZSBpcyBjbG9zZWQuCi0KLQlVc2UgPDxiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlPj4gdG8gc3RlcCB0aHJvdWdoCi0JdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgb3BlbmVkIGZvciBpbnB1dC4gIFlvdSBkb24ndAotCWhhdmUgdG8gcmVhZCB0aGUgZW50aXJlIGFyY2hpdmUgaWYgeW91IGRvbid0IHdhbnQKLQl0byEgIFJlYWQgaXQgdW50aWwgeW91IGZpbmQgd2hhdCB5b3Ugd2FudC4KLQotCUFyY2hpdmUgY29udGVudHMgb2Ygb3V0cHV0IEJGRHMgYXJlIGNoYWluZWQgdGhyb3VnaCB0aGUKLQk8PG5leHQ+PiBwb2ludGVyIGluIGEgQkZELiAgVGhlIGZpcnN0IG9uZSBpcyBmaW5kYWJsZSB0aHJvdWdoCi0JdGhlIDw8YXJjaGl2ZV9oZWFkPj4gc2xvdCBvZiB0aGUgYXJjaGl2ZS4gIFNldCBpdCB3aXRoCi0JPDxiZmRfc2V0X2FyY2hpdmVfaGVhZD4+IChxLnYuKS4gIEEgZ2l2ZW4gQkZEIG1heSBiZSBpbiBvbmx5IG9uZQotCW9wZW4gb3V0cHV0IGFyY2hpdmUgYXQgYSB0aW1lLgotCi0JQXMgZXhwZWN0ZWQsIHRoZSBCRkQgYXJjaGl2ZSBjb2RlIGlzIG1vcmUgZ2VuZXJhbCB0aGFuIHRoZQotCWFyY2hpdmUgY29kZSBvZiBhbnkgZ2l2ZW4gZW52aXJvbm1lbnQuICBCRkQgYXJjaGl2ZXMgbWF5Ci0JY29udGFpbiBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cyAoZS5nLiwgYS5vdXQgYW5kIGNvZmYpIGFuZAotCWV2ZW4gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuICBZb3UgbWF5IGV2ZW4gcGxhY2UgYXJjaGl2ZXMKLQlyZWN1cnNpdmVseSBpbnRvIGFyY2hpdmVzIQotCi0JVGhpcyBjYW4gY2F1c2UgdW5leHBlY3RlZCBjb25mdXNpb24sIHNpbmNlIHNvbWUgYXJjaGl2ZQotCWZvcm1hdHMgYXJlIG1vcmUgZXhwcmVzc2l2ZSB0aGFuIG90aGVycy4gIEZvciBpbnN0YW5jZSwgSW50ZWwKLQlDT0ZGIGFyY2hpdmVzIGNhbiBwcmVzZXJ2ZSBsb25nIGZpbGVuYW1lczsgU3VuT1MgYS5vdXQgYXJjaGl2ZXMKLQljYW5ub3QuICBJZiB5b3UgbW92ZSBhIGZpbGUgZnJvbSB0aGUgZmlyc3QgdG8gdGhlIHNlY29uZAotCWZvcm1hdCBhbmQgYmFjayBhZ2FpbiwgdGhlIGZpbGVuYW1lIG1heSBiZSB0cnVuY2F0ZWQuCi0JTGlrZXdpc2UsIGRpZmZlcmVudCBhLm91dCBlbnZpcm9ubWVudHMgaGF2ZSBkaWZmZXJlbnQKLQljb252ZW50aW9ucyBhcyB0byBob3cgdGhleSB0cnVuY2F0ZSBmaWxlbmFtZXMsIHdoZXRoZXIgdGhleQotCXByZXNlcnZlIGRpcmVjdG9yeSBuYW1lcyBpbiBmaWxlbmFtZXMsIGV0Yy4gIFdoZW4KLQlpbnRlcm9wZXJhdGluZyB3aXRoIG5hdGl2ZSB0b29scywgYmUgc3VyZSB5b3VyIGZpbGVzIGFyZQotCWhvbW9nZW5lb3VzLgotCi0JQmV3YXJlOiBtb3N0IG9mIHRoZXNlIGZvcm1hdHMgZG8gbm90IHJlYWN0IHdlbGwgdG8gdGhlCi0JcHJlc2VuY2Ugb2Ygc3BhY2VzIGluIGZpbGVuYW1lcy4gIFdlIGRvIHRoZSBiZXN0IHdlIGNhbiwgYnV0Ci0JY2FuJ3QgYWx3YXlzIGhhbmRsZSB0aGlzIGNhc2UgZHVlIHRvIHJlc3RyaWN0aW9ucyBpbiB0aGUgZm9ybWF0IG9mCi0JYXJjaGl2ZXMuICBNYW55IFVuaXggdXRpbGl0aWVzIGFyZSBicmFpbmRlYWQgaW4gcmVnYXJkcyB0bwotCXNwYWNlcyBhbmQgc3VjaCBpbiBmaWxlbmFtZXMgYW55d2F5LCBzbyB0aGlzIHNob3VsZG4ndCBiZSBtdWNoCi0Jb2YgYSByZXN0cmljdGlvbi4KLQotCUFyY2hpdmVzIGFyZSBzdXBwb3J0ZWQgaW4gQkZEIGluIDw8YXJjaGl2ZS5jPj4uCi0KLSovCi0KLS8qIEFzc3VtZXM6Ci0gICBvIC0gYWxsIGFyY2hpdmUgZWxlbWVudHMgc3RhcnQgb24gYW4gZXZlbiBib3VuZGFyeSwgbmV3bGluZSBwYWRkZWQ7Ci0gICBvIC0gYWxsIGFyY2ggaGVhZGVycyBhcmUgY2hhciAqOwotICAgbyAtIGFsbCBhcmNoIGhlYWRlcnMgYXJlIHRoZSBzYW1lIHNpemUgKGFjcm9zcyBhcmNoaXRlY3R1cmVzKS4KLSovCi0KLS8qIFNvbWUgZm9ybWF0cyBwcm92aWRlIGEgd2F5IHRvIGNyYW0gYSBsb25nIGZpbGVuYW1lIGludG8gdGhlIHNob3J0Ci0gICAoMTYgY2hhcnMpIHNwYWNlIHByb3ZpZGVkIGJ5IGEgQlNEIGFyY2hpdmUuICBUaGUgdHJpY2sgaXM6IG1ha2UgYQotICAgc3BlY2lhbCAiZmlsZSIgaW4gdGhlIGZyb250IG9mIHRoZSBhcmNoaXZlLCBzb3J0IG9mIGxpa2UgdGhlIFNZTURFRgotICAgZW50cnkuICBJZiB0aGUgZmlsZW5hbWUgaXMgdG9vIGxvbmcgdG8gZml0LCBwdXQgaXQgaW4gdGhlIGV4dGVuZGVkCi0gICBuYW1lIHRhYmxlLCBhbmQgdXNlIGl0cyBpbmRleCBhcyB0aGUgZmlsZW5hbWUuICBUbyBwcmV2ZW50Ci0gICBjb25mdXNpb24gcHJlcGVuZCB0aGUgaW5kZXggd2l0aCBhIHNwYWNlLiAgVGhpcyBtZWFucyB5b3UgY2FuJ3QKLSAgIGhhdmUgZmlsZW5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhIHNwYWNlLCBidXQgdGhlbiBhZ2FpbiwgbWFueSBVbml4Ci0gICB1dGlsaXRpZXMgY2FuJ3QgaGFuZGxlIHRoYXQgYW55d2F5LgotCi0gICBUaGlzIHNjaGVtZSB1bmZvcnR1bmF0ZWx5IHJlcXVpcmVzIHRoYXQgeW91IHN0YW5kIG9uIHlvdXIgaGVhZCBpbgotICAgb3JkZXIgdG8gd3JpdGUgYW4gYXJjaGl2ZSBzaW5jZSB5b3UgbmVlZCB0byBwdXQgYSBtYWdpYyBmaWxlIGF0IHRoZQotICAgZnJvbnQsIGFuZCBuZWVkIHRvIHRvdWNoIGV2ZXJ5IGVudHJ5IHRvIGRvIHNvLiAgQydlc3QgbGEgdmllLgotCi0gICBXZSBzdXBwb3J0IHR3byB2YXJpYW50cyBvZiB0aGlzIGlkZWE6Ci0gICBUaGUgU1ZSNCBmb3JtYXQgKGV4dGVuZGVkIG5hbWUgdGFibGUgaXMgbmFtZWQgIi8vIiksCi0gICBhbmQgYW4gZXh0ZW5kZWQgcHNldWRvLUJTRCB2YXJpYW50IChleHRlbmRlZCBuYW1lIHRhYmxlIGlzIG5hbWVkCi0gICAiQVJGSUxFTkFNRVMvIikuICBUaGUgb3JpZ2luIG9mIHRoZSBsYXR0ZXIgZm9ybWF0IGlzIHVuY2VydGFpbi4KLQotICAgQlNEIDQuNCB1c2VzIGEgdGhpcmQgc2NoZW1lOiAgSXQgd3JpdGVzIGEgbG9uZyBmaWxlbmFtZQotICAgZGlyZWN0bHkgYWZ0ZXIgdGhlIGhlYWRlci4gIFRoaXMgYWxsb3dzICdhciBxJyB0byB3b3JrLgotICAgV2UgY3VycmVudGx5IGNhbiByZWFkIEJTRCA0LjQgYXJjaGl2ZXMsIGJ1dCBub3Qgd3JpdGUgdGhlbS4KLSovCi0KLS8qIFN1bW1hcnkgb2YgYXJjaGl2ZSBtZW1iZXIgbmFtZXM6Ci0KLSBTeW1ib2wgdGFibGUgKG11c3QgYmUgZmlyc3QpOgotICJfXy5TWU1ERUYgICAgICAgIiAtIFN5bWJvbCB0YWJsZSwgQmVya2VsZXkgc3R5bGUsIHByb2R1Y2VkIGJ5IHJhbmxpYi4KLSAiLyAgICAgICAgICAgICAgICIgLSBTeW1ib2wgdGFibGUsIHN5c3RlbSA1IHN0eWxlLgotCi0gTG9uZyBuYW1lIHRhYmxlIChtdXN0IGJlIGJlZm9yZSByZWd1bGFyIGZpbGUgbWVtYmVycyk6Ci0gIi8vICAgICAgICAgICAgICAiIC0gTG9uZyBuYW1lIHRhYmxlLCBTeXN0ZW0gNSBSNCBzdHlsZS4KLSAiQVJGSUxFTkFNRVMvICAgICIgLSBMb25nIG5hbWUgdGFibGUsIG5vbi1zdGFuZGFyZCBleHRlbmRlZCBCU0QgKG5vdCBCU0QgNC40KS4KLQotIFJlZ3VsYXIgZmlsZSBtZW1iZXJzIHdpdGggc2hvcnQgbmFtZXM6Ci0gImZpbGVuYW1lLm8vICAgICAiIC0gUmVndWxhciBmaWxlLCBTeXN0ZW0gNSBzdHlsZSAoZW1iZWRkZWQgc3BhY2VzIG9rKS4KLSAiZmlsZW5hbWUubyAgICAgICIgLSBSZWd1bGFyIGZpbGUsIEJlcmtlbGV5IHN0eWxlIChubyBlbWJlZGRlZCBzcGFjZXMpLgotCi0gUmVndWxhciBmaWxlcyB3aXRoIGxvbmcgbmFtZXMgKG9yIGVtYmVkZGVkIHNwYWNlcywgZm9yIEJTRCB2YXJpYW50cyk6Ci0gIi8xOCAgICAgICAgICAgICAiIC0gU1ZSNCBzdHlsZSwgbmFtZSBhdCBvZmZzZXQgMTggaW4gbmFtZSB0YWJsZS4KLSAiIzEvMjMgICAgICAgICAgICIgLSBMb25nIG5hbWUgKG9yIGVtYmVkZGVkIHBhY2VzKSAyMyBjaGFyYWN0ZXJzIGxvbmcsCi0JCSAgICAgIEJTRCA0LjQgc3R5bGUsIGZ1bGwgbmFtZSBmb2xsb3dzIGhlYWRlci4KLQkJICAgICAgSW1wbGVtZW50ZWQgZm9yIHJlYWRpbmcsIG5vdCB3cml0aW5nLgotICIgMTggICAgICAgICAgICAgIiAtIExvbmcgbmFtZSAxOCBjaGFyYWN0ZXJzIGxvbmcsIGV4dGVuZGVkIHBzZXVkby1CU0QuCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJhb3V0L3JhbmxpYi5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEdOVTk2MAotI2RlZmluZSBCRkRfR05VOTYwX0FSTUFHKGFiZmQpCShCRkRfQ09GRl9GSUxFX1AoKGFiZmQpKSA/IEFSTUFHIDogQVJNQUdCKQotI2VuZGlmCi0KLS8qIERlZmluZSBvZmZzZXRvZiBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBsYWNrIGl0ICovCi0KLSNpZm5kZWYgb2Zmc2V0b2YKLSNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHVuc2lnbmVkIGxvbmcpICYoKFRZUEUgKikwKS0+TUVNQkVSKQotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBjYWNoZSBvZiBhcmNoaXZlIGZpbGVwb2ludGVycyB0byBhcmNoaXZlIGVsZW1lbnRzIHRvCi0gICBzcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFyY2hpdmUgYnkgZmlsZXBvcy4gIFdlIG9ubHkgYWRkIGFuIGVudHJ5IHRvCi0gICB0aGUgY2FjaGUgd2hlbiB3ZSBhY3R1YWxseSByZWFkIG9uZS4gIFdlIGFsc28gZG9uJ3Qgc29ydCB0aGUgY2FjaGU7Ci0gICBpdCdzIGdlbmVyYWxseSBzaG9ydCBlbm91Z2ggdG8gc2VhcmNoIGxpbmVhcmx5LgotICAgTm90ZSB0aGF0IHRoZSBwb2ludGVycyBoZXJlIHBvaW50IHRvIHRoZSBmcm9udCBvZiB0aGUgYXJfaGRyLCBub3QKLSAgIHRvIHRoZSBmcm9udCBvZiB0aGUgY29udGVudHMhCi0qLwotc3RydWN0IGFyX2NhY2hlCi17Ci0gIGZpbGVfcHRyIHB0cjsKLSAgYmZkICphcmVsdDsKLSAgc3RydWN0IGFyX2NhY2hlICpuZXh0OwotfTsKLQotI2RlZmluZSBhcl9wYWRjaGFyKGFiZmQpICgoYWJmZCktPnh2ZWMtPmFyX3BhZF9jaGFyKQotI2RlZmluZSBhcl9tYXhuYW1lbGVuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmFyX21heF9uYW1lbGVuKQotCi0jZGVmaW5lIGFyY2hfZWx0ZGF0YShiZmQpICgoc3RydWN0IGFyZWx0ZGF0YSAqKSgoYmZkKS0+YXJlbHRfZGF0YSkpCi0jZGVmaW5lIGFyY2hfaGRyKGJmZCkgKChzdHJ1Y3QgYXJfaGRyICopYXJjaF9lbHRkYXRhKGJmZCktPmFyY2hfaGVhZGVyKQotCi1zdGF0aWMgY2hhciAqZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lIFBBUkFNUyAoKGJmZCAqYXJjaCwKLQkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIGJvb2xlYW4gZG9fc2x1cnBfYnNkX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gZG9fc2x1cnBfY29mZl9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpub3JtYWxpemUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKmZpbGUpKTsKLXN0YXRpYyBzdHJ1Y3QgYXJlbHRkYXRhICpiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJICAgICBjb25zdCBjaGFyICosCi0JCQkJCQkJICAgICBiZmQgKm1lbWJlcikpOwotDAotYm9vbGVhbgotX2JmZF9nZW5lcmljX21rYXJjaGl2ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSAoKHN0cnVjdCBhcnRkYXRhICopCi0JCQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcnRkYXRhKSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X25leHRfbWFwZW50Ci0KLVNZTk9QU0lTCi0Jc3ltaW5kZXggYmZkX2dldF9uZXh0X21hcGVudChiZmQgKmFiZmQsIHN5bWluZGV4IHByZXZpb3VzLCBjYXJzeW0gKipzeW0pOwotCi1ERVNDUklQVElPTgotCVN0ZXAgdGhyb3VnaCBhcmNoaXZlIEB2YXJ7YWJmZH0ncyBzeW1ib2wgdGFibGUgKGlmIGl0Ci0JaGFzIG9uZSkuICBTdWNjZXNzaXZlbHkgdXBkYXRlIEB2YXJ7c3ltfSB3aXRoIHRoZSBuZXh0IHN5bWJvbCdzCi0JaW5mb3JtYXRpb24sIHJldHVybmluZyB0aGF0IHN5bWJvbCdzIChpbnRlcm5hbCkgaW5kZXggaW50byB0aGUKLQlzeW1ib2wgdGFibGUuCi0KLQlTdXBwbHkgPDxCRkRfTk9fTU9SRV9TWU1CT0xTPj4gYXMgdGhlIEB2YXJ7cHJldmlvdXN9IGVudHJ5IHRvIGdldAotCXRoZSBmaXJzdCBvbmU7IHJldHVybnMgPDxCRkRfTk9fTU9SRV9TWU1CT0xTPj4gd2hlbiB5b3UndmUgYWxyZWFkeQotCWdvdCB0aGUgbGFzdCBvbmUuCi0KLQlBIDw8Y2Fyc3ltPj4gaXMgYSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2wuICBUaGUgb25seQotCXVzZXItdmlzaWJsZSBlbGVtZW50IGlzIGl0cyBuYW1lLCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCi0qLwotCi1zeW1pbmRleAotYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgcHJldiwgZW50cnkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3ltaW5kZXggcHJldjsKLSAgICAgY2Fyc3ltICoqZW50cnk7Ci17Ci0gIGlmICghYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUzsKLSAgICB9Ci0KLSAgaWYgKHByZXYgPT0gQkZEX05PX01PUkVfU1lNQk9MUykKLSAgICBwcmV2ID0gMDsKLSAgZWxzZQotICAgICsrcHJldjsKLSAgaWYgKHByZXYgPj0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudCkKLSAgICByZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUzsKLQotICAqZW50cnkgPSAoYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgKyBwcmV2KTsKLSAgcmV0dXJuIHByZXY7Ci19Ci0KLS8qIFRvIGJlIGNhbGxlZCBieSBiYWNrZW5kcyBvbmx5ICovCi0KLWJmZCAqCi1fYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKG9iZmQpCi0gICAgIGJmZCAqb2JmZDsKLXsKLSAgcmV0dXJuIF9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gKG9iZmQpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2FyY2hpdmVfaGVhZAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9hcmNoaXZlX2hlYWQoYmZkICpvdXRwdXQsIGJmZCAqbmV3X2hlYWQpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgaGVhZCBvZiB0aGUgY2hhaW4gb2YKLQlCRkRzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZSBAdmFye291dHB1dH0gdG8gQHZhcntuZXdfaGVhZH0uCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2FyY2hpdmVfaGVhZCAob3V0cHV0X2FyY2hpdmUsIG5ld19oZWFkKQotICAgICBiZmQgKm91dHB1dF9hcmNoaXZlOwotICAgICBiZmQgKm5ld19oZWFkOwotewotCi0gIG91dHB1dF9hcmNoaXZlLT5hcmNoaXZlX2hlYWQgPSBuZXdfaGVhZDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJmZCAqCi1fYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSAoYXJjaF9iZmQsIGZpbGVwb3MpCi0gICAgIGJmZCAqYXJjaF9iZmQ7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIHN0cnVjdCBhcl9jYWNoZSAqY3VycmVudDsKLQotICBmb3IgKGN1cnJlbnQgPSBiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlOyBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgaWYgKGN1cnJlbnQtPnB0ciA9PSBmaWxlcG9zKQotICAgICAgcmV0dXJuIGN1cnJlbnQtPmFyZWx0OwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBLaW5kIG9mIHN0dXBpZCB0byBjYWxsIGNvbnMgZm9yIGVhY2ggb25lLCBidXQgd2UgZG9uJ3QgZG8gdG9vIG1hbnkgKi8KLWJvb2xlYW4KLV9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIChhcmNoX2JmZCwgZmlsZXBvcywgbmV3X2VsdCkKLSAgICAgYmZkICphcmNoX2JmZCwgKm5ld19lbHQ7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIHN0cnVjdCBhcl9jYWNoZSAqbmV3X2NhY2hlID0gKChzdHJ1Y3QgYXJfY2FjaGUgKikKLQkJCQliZmRfemFsbG9jIChhcmNoX2JmZCwKLQkJCQkJICAgIHNpemVvZiAoc3RydWN0IGFyX2NhY2hlKSkpOwotCi0gIGlmIChuZXdfY2FjaGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3X2NhY2hlLT5wdHIgPSBmaWxlcG9zOwotICBuZXdfY2FjaGUtPmFyZWx0ID0gbmV3X2VsdDsKLSAgbmV3X2NhY2hlLT5uZXh0ID0gKHN0cnVjdCBhcl9jYWNoZSAqKSBOVUxMOwotICBpZiAoYmZkX2FyZGF0YSAoYXJjaF9iZmQpLT5jYWNoZSA9PSBOVUxMKQotICAgIGJmZF9hcmRhdGEgKGFyY2hfYmZkKS0+Y2FjaGUgPSBuZXdfY2FjaGU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJfY2FjaGUgKmN1cnJlbnQgPSBiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlOwotCi0gICAgICB3aGlsZSAoY3VycmVudC0+bmV4dCAhPSBOVUxMKQotCWN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotICAgICAgY3VycmVudC0+bmV4dCA9IG5ld19jYWNoZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGUgbmFtZSBiZWdpbnMgd2l0aCBzcGFjZS4gIEhlbmNlIHRoZSByZXN0IG9mIHRoZSBuYW1lIGlzIGFuIGluZGV4IGludG8KLSAgIHRoZSBzdHJpbmcgdGFibGUuICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSAoYXJjaCwgbmFtZSkKLSAgICAgYmZkICphcmNoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICB1bnNpZ25lZCBsb25nIGluZGV4ID0gMDsKLQotICAvKiBTaG91bGQgZXh0cmFjdCBzdHJpbmcgc28gdGhhdCBJIGNhbiBndWFyYW50ZWUgbm90IHRvIG92ZXJmbG93IGludG8KLSAgICAgdGhlIG5leHQgcmVnaW9uLCBidXQgSSdtIHRvbyBsYXp5LiAqLwotICBlcnJubyA9IDA7Ci0gIC8qIFNraXAgZmlyc3QgY2hhciwgd2hpY2ggaXMgJy8nIGluIFNWUjQgb3IgJyAnIGluIHNvbWUgb3RoZXIgdmFyaWFudHMuICovCi0gIGluZGV4ID0gc3RydG9sIChuYW1lICsgMSwgTlVMTCwgMTApOwotICBpZiAoZXJybm8gIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfYXJkYXRhIChhcmNoKS0+ZXh0ZW5kZWRfbmFtZXMgKyBpbmRleDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbnMgcmVhZHMgYW4gYXJjaCBoZWFkZXIgYW5kIHJldHVybnMgYW4gYXJlbHRkYXRhIHBvaW50ZXIsIG9yCi0gICBOVUxMIG9uIGVycm9yLgotCi0gICBQcmVzdW1lcyB0aGUgZmlsZSBwb2ludGVyIGlzIGFscmVhZHkgaW4gdGhlIHJpZ2h0IHBsYWNlIChpZSBwb2ludGluZwotICAgdG8gdGhlIGFyX2hkciBpbiB0aGUgZmlsZSkuICAgTW92ZXMgdGhlIGZpbGUgcG9pbnRlcjsgb24gc3VjY2VzcyBpdAotICAgc2hvdWxkIGJlIHBvaW50aW5nIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBjb250ZW50czsgb24gZmFpbHVyZSBpdAotICAgY291bGQgaGF2ZSBiZWVuIG1vdmVkIGFyYml0cmFyaWx5LgotKi8KLQotUFRSCi1fYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgKGFiZmQsIChjb25zdCBjaGFyICopIE5VTEwpOwotfQotCi0vKiBBbHBoYSBFQ09GRiB1c2VzIGFuIG9wdGlvbmFsIGRpZmZlcmVudCBBUkZNQUcgdmFsdWUsIHNvIHdlIGhhdmUgYQotICAgdmFyaWFudCBvZiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgd2hpY2ggYWNjZXB0cyBhIG1hZ2ljIHN0cmluZy4gICovCi0KLVBUUgotX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyAoYWJmZCwgbWFnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm1hZzsKLXsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIGNoYXIgKmhkcnAgPSAoY2hhciAqKSAmaGRyOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyZWQ7Ci0gIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IG5hbWVsZW4gPSAwOwotICB1bnNpZ25lZCBpbnQgYWxsb2NzaXplID0gc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0gIGNoYXIgKmFsbG9jcHRyID0gMDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGhkcnAsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKSAhPSAwCi0gICAgICAmJiAobWFnID09IE5VTEwKLQkgIHx8IHN0cm5jbXAgKGhkci5hcl9mbWFnLCBtYWcsIDIpICE9IDApKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZXJybm8gPSAwOwotICBwYXJzZWRfc2l6ZSA9IHN0cnRvbCAoaGRyLmFyX3NpemUsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBFeHRyYWN0IHRoZSBmaWxlbmFtZSBmcm9tIHRoZSBhcmNoaXZlIC0gdGhlcmUgYXJlIHR3byB3YXlzIHRvCi0gICAgIHNwZWNpZnkgYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZSwgZWl0aGVyIHRoZSBmaXJzdCBjaGFyIG9mIHRoZQotICAgICBuYW1lIGlzIGEgc3BhY2UsIG9yIGl0J3MgYSBzbGFzaC4gICovCi0gIGlmICgoaGRyLmFyX25hbWVbMF0gPT0gJy8nCi0gICAgICAgfHwgKGhkci5hcl9uYW1lWzBdID09ICcgJwotCSAgICYmIG1lbWNociAoaGRyLmFyX25hbWUsICcvJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpID09IE5VTEwpKQotICAgICAgJiYgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzICE9IE5VTEwpCi0gICAgewotICAgICAgZmlsZW5hbWUgPSBnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUgKGFiZmQsIGhkci5hcl9uYW1lKTsKLSAgICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotICAvKiBCU0Q0LjQtc3R5bGUgbG9uZyBmaWxlbmFtZS4KLSAgICAgT25seSBpbXBsZW1lbnRlZCBmb3IgcmVhZGluZywgc28gZmFyISAqLwotICBlbHNlIGlmIChoZHIuYXJfbmFtZVswXSA9PSAnIycKLQkgICAmJiBoZHIuYXJfbmFtZVsxXSA9PSAnMScKLQkgICAmJiBoZHIuYXJfbmFtZVsyXSA9PSAnLycKLQkgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaGRyLmFyX25hbWVbM10pKQotICAgIHsKLSAgICAgIC8qIEJTRC00LjQgZXh0ZW5kZWQgbmFtZSAqLwotICAgICAgbmFtZWxlbiA9IGF0b2kgKCZoZHIuYXJfbmFtZVszXSk7Ci0gICAgICBhbGxvY3NpemUgKz0gbmFtZWxlbiArIDE7Ci0gICAgICBwYXJzZWRfc2l6ZSAtPSBuYW1lbGVuOwotCi0gICAgICBhbGxvY3B0ciA9IGJmZF96YWxsb2MgKGFiZmQsIGFsbG9jc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2NwdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGZpbGVuYW1lID0gKGFsbG9jcHRyCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIGlmIChiZmRfcmVhZCAoZmlsZW5hbWUsIDEsIG5hbWVsZW4sIGFiZmQpICE9IG5hbWVsZW4pCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBmaWxlbmFtZVtuYW1lbGVuXSA9ICdcMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UganVkZ2UgdGhlIGVuZCBvZiB0aGUgbmFtZSBieSBsb29raW5nIGZvciAnLycgb3IgJyAnLgotCSBOb3RlOiAgVGhlIFNZU1YgZm9ybWF0ICh0ZXJtaW5hdGVkIGJ5ICcvJykgYWxsb3dzIGVtYmVkZGVkCi0JIHNwYWNlcywgc28gb25seSBsb29rIGZvciAnICcgaWYgd2UgZG9uJ3QgZmluZCAnLycuICovCi0KLSAgICAgIGNoYXIgKmU7Ci0gICAgICBlID0gbWVtY2hyIChoZHIuYXJfbmFtZSwgJ1wwJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOwotICAgICAgaWYgKGUgPT0gTlVMTCkKLQl7Ci0gICAgICAgICAgZSA9IG1lbWNociAoaGRyLmFyX25hbWUsICcvJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOwotCSAgaWYgKGUgPT0gTlVMTCkKLSAgICAgICAgICAgIGUgPSBtZW1jaHIgKGhkci5hcl9uYW1lLCAnICcsIGFyX21heG5hbWVsZW4gKGFiZmQpKTsKLQl9Ci0KLSAgICAgIGlmIChlICE9IE5VTEwpCi0JbmFtZWxlbiA9IGUgLSBoZHIuYXJfbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIHRlcm1pbmF0aW9uIGNoYXJhY3RlciwgdGhlbiB0aGUgbmFtZQotCSAgICAgbXVzdCBiZSB0aGUgZW50aXJlIGZpZWxkLiAgKi8KLQkgIG5hbWVsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQl9Ci0KLSAgICAgIGFsbG9jc2l6ZSArPSBuYW1lbGVuICsgMTsKLSAgICB9Ci0KLSAgaWYgKCFhbGxvY3B0cikKLSAgICB7Ci0gICAgICBhbGxvY3B0ciA9IGJmZF96YWxsb2MgKGFiZmQsIGFsbG9jc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2NwdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYXJlZCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGFsbG9jcHRyOwotCi0gIGFyZWQtPmFyY2hfaGVhZGVyID0gYWxsb2NwdHIgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpOwotICBtZW1jcHkgKChjaGFyICopIGFyZWQtPmFyY2hfaGVhZGVyLCAoY2hhciAqKSAmaGRyLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgYXJlZC0+cGFyc2VkX3NpemUgPSBwYXJzZWRfc2l6ZTsKLQotICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKLSAgICBhcmVkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgYXJlZC0+ZmlsZW5hbWUgPSBhbGxvY3B0ciArIChzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpICsKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIGlmIChuYW1lbGVuKQotCW1lbWNweSAoYXJlZC0+ZmlsZW5hbWUsIGhkci5hcl9uYW1lLCBuYW1lbGVuKTsKLSAgICAgIGFyZWQtPmZpbGVuYW1lW25hbWVsZW5dID0gJ1wwJzsKLSAgICB9Ci0KLSAgcmV0dXJuIChQVFIpIGFyZWQ7Ci19Ci0MCi0vKiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uOyBpdCdzIG1haW5seSB1c2VkIHdoZW4gaW5kZXhpbmcKLSAgIHRocm91Z2ggdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlLCBidXQgYWxzbyB1c2VkIHRvIGdldCB0aGUgbmV4dAotICAgZWxlbWVudCwgc2luY2UgaXQgaGFuZGxlcyB0aGUgYm9va2tlZXBpbmcgc28gbmljZWx5IGZvciB1cy4gICovCi0KLWJmZCAqCi1fYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXBvcykKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICpuZXdfYXJlbGRhdGE7Ci0gIGJmZCAqbl9uZmQ7Ci0KLSAgbl9uZmQgPSBfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSAoYXJjaGl2ZSwgZmlsZXBvcyk7Ci0gIGlmIChuX25mZCkKLSAgICByZXR1cm4gbl9uZmQ7Ci0KLSAgaWYgKDAgPiBiZmRfc2VlayAoYXJjaGl2ZSwgZmlsZXBvcywgU0VFS19TRVQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICgobmV3X2FyZWxkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYXJjaGl2ZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbl9uZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2hpdmUpOwotICBpZiAobl9uZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbmV3X2FyZWxkYXRhKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuX25mZC0+b3JpZ2luID0gYmZkX3RlbGwgKGFyY2hpdmUpOwotICBuX25mZC0+YXJlbHRfZGF0YSA9IChQVFIpIG5ld19hcmVsZGF0YTsKLSAgbl9uZmQtPmZpbGVuYW1lID0gbmV3X2FyZWxkYXRhLT5maWxlbmFtZTsKLQotICBpZiAoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgKGFyY2hpdmUsIGZpbGVwb3MsIG5fbmZkKSkKLSAgICByZXR1cm4gbl9uZmQ7Ci0KLSAgLyogaHVoPyAqLwotICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbl9uZmQpOwotICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbmV3X2FyZWxkYXRhKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgQkZEIHdoaWNoIGlzIHJlZmVyZW5jZWQgYnkgdGhlIHN5bWJvbCBpbiBBQkZEIGluZGV4ZWQgYnkKLSAgIElOREVYLiAgSU5ERVggc2hvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBieSBiZmRfZ2V0X25leHRfbWFwZW50LiAgKi8KLQotYmZkICoKLV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSAgY2Fyc3ltICplbnRyeTsKLQotICBlbnRyeSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgaW5kZXg7Ci0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYWJmZCwgZW50cnktPmZpbGVfb2Zmc2V0KTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotCi1TWU5PUFNJUwotCWJmZCAqYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShiZmQgKmFyY2hpdmUsIGJmZCAqcHJldmlvdXMpOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVkIGEgQkZELCBAdmFye2FyY2hpdmV9LCBjb250YWluaW5nIGFuIGFyY2hpdmUgYW5kIE5VTEwsIG9wZW4KLQlhbiBpbnB1dCBCRkQgb24gdGhlIGZpcnN0IGNvbnRhaW5lZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoYXQuCi0JU3Vic2VxdWVudCBjYWxscyBzaG91bGQgcGFzcwotCXRoZSBhcmNoaXZlIGFuZCB0aGUgcHJldmlvdXMgcmV0dXJuIHZhbHVlIHRvIHJldHVybiBhIGNyZWF0ZWQKLQlCRkQgdG8gdGhlIG5leHQgY29udGFpbmVkIGVsZW1lbnQuIE5VTEwgaXMgcmV0dXJuZWQgd2hlbiB0aGVyZQotCWFyZSBubyBtb3JlLgotCi0qLwotCi1iZmQgKgotYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBpZiAoKGJmZF9nZXRfZm9ybWF0IChhcmNoaXZlKSAhPSBiZmRfYXJjaGl2ZSkgfHwKLSAgICAgIChhcmNoaXZlLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfU0VORCAoYXJjaGl2ZSwKLQkJICAgb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlLAotCQkgICAoYXJjaGl2ZSwKLQkJICAgIGxhc3RfZmlsZSkpOwotfQotCi1iZmQgKgotYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgYmZkICpsYXN0X2ZpbGU7Ci17Ci0gIGZpbGVfcHRyIGZpbGVzdGFydDsKLQotICBpZiAoIWxhc3RfZmlsZSkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBhcmVsdF9zaXplIChsYXN0X2ZpbGUpOwotICAgICAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkuLi4KLQkgTm90ZSB0aGF0IGxhc3RfZmlsZS0+b3JpZ2luIGNhbiBiZSBvZGQgaW4gdGhlIGNhc2Ugb2YKLQkgQlNELTQuNC1zdHlsZSBlbGVtZW50IHdpdGggYSBsb25nIG9kZCBzaXplLiAqLwotICAgICAgZmlsZXN0YXJ0ID0gbGFzdF9maWxlLT5vcmlnaW4gKyBzaXplOwotICAgICAgZmlsZXN0YXJ0ICs9IGZpbGVzdGFydCAlIDI7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9nZW5lcmljX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqdGRhdGFfaG9sZDsKLSAgY2hhciBhcm1hZ1tTQVJNQUcgKyAxXTsKLQotICB0ZGF0YV9ob2xkID0gYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgYXJtYWcsIDEsIFNBUk1BRywgYWJmZCkgIT0gU0FSTUFHKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmZGVmIEdOVTk2MAotICBpZiAoc3RybmNtcCAoYXJtYWcsIEJGRF9HTlU5NjBfQVJNQUcgKGFiZmQpLCBTQVJNQUcpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0jZWxzZQotICBpZiAoc3RybmNtcCAoYXJtYWcsIEFSTUFHLCBTQVJNQUcpICE9IDAgJiYKLSAgICAgIHN0cm5jbXAgKGFybWFnLCBBUk1BR0IsIFNBUk1BRykgIT0gMCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIC8qIFdlIGFyZSBzZXR0aW5nIGJmZF9hcmRhdGEoYWJmZCkgaGVyZSwgYnV0IHNpbmNlIGJmZF9hcmRhdGEKLSAgICAgaW52b2x2ZXMgYSBjYXN0LCB3ZSBjYW4ndCBkbyBpdCBhcyB0aGUgbGVmdCBvcGVyYW5kIG9mIGFzc2lnbm1lbnQuICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9ICgoc3RydWN0IGFydGRhdGEgKikKLQkJCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKSk7Ci0KLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IFNBUk1BRzsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmNhY2hlID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmFyY2hpdmVfaGVhZCA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gTlVMTDsKLQotICBpZiAoIUJGRF9TRU5EIChhYmZkLCBfYmZkX3NsdXJwX2FybWFwLCAoYWJmZCkpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSwgKGFiZmQpKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZCAqZmlyc3Q7Ci0KLSAgICAgIC8qIFRoaXMgYXJjaGl2ZSBoYXMgYSBtYXAsIHNvIHdlIG1heSBwcmVzdW1lIHRoYXQgdGhlIGNvbnRlbnRzCi0JIGFyZSBvYmplY3QgZmlsZXMuICBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQkgYXJjaGl2ZSBjYW4gYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QgZmlsZSwgaXQgaXMgZm9yIHRoaXMKLQkgdGFyZ2V0LiAgSWYgbm90LCBhc3N1bWUgdGhhdCB0aGlzIGlzIHRoZSB3cm9uZyBmb3JtYXQuICBJZgotCSB0aGUgZmlyc3QgZmlsZSBpcyBub3QgYW4gb2JqZWN0IGZpbGUsIHNvbWVib2R5IGlzIGRvaW5nCi0JIHNvbWV0aGluZyB3ZWlyZCwgYW5kIHdlIHBlcm1pdCBpdCBzbyB0aGF0IGFyIC10IHdpbGwgd29yay4KLQotCSBUaGlzIGlzIGRvbmUgYmVjYXVzZSBhbnkgbm9ybWFsIGZvcm1hdCB3aWxsIHJlY29nbml6ZSBhbnkKLQkgbm9ybWFsIGFyY2hpdmUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGZvcm1hdCBvZiB0aGUgb2JqZWN0IGZpbGVzLgotCSBXZSBkbyBhY2NlcHQgYW4gZW1wdHkgYXJjaGl2ZS4gICovCi0KLSAgICAgIGZpcnN0ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICAgIGlmIChmaXJzdCAhPSBOVUxMKQotCXsKLQkgIGJvb2xlYW4gZmFpbDsKLQotCSAgZmlyc3QtPnRhcmdldF9kZWZhdWx0ZWQgPSBmYWxzZTsKLQkgIGZhaWwgPSBmYWxzZTsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaXJzdCwgYmZkX29iamVjdCkKLQkgICAgICAmJiBmaXJzdC0+eHZlYyAhPSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoZmlyc3QpOwotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0JICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JICAvKiBXZSBvdWdodCB0byBjbG9zZSBmaXJzdCBoZXJlLCBidXQgd2UgY2FuJ3QsIGJlY2F1c2Ugd2UKLSAgICAgICAgICAgICBoYXZlIG5vIHdheSB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJjaGl2ZSBjYWNoZS4gIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBTb21lIGNvbnN0YW50cyBmb3IgYSAzMiBiaXQgQlNEIGFyY2hpdmUgc3RydWN0dXJlLiAgV2UgZG8gbm90Ci0gICBzdXBwb3J0IDY0IGJpdCBhcmNoaXZlcyBwcmVzZW50bHk7IHNvIGZhciBhcyBJIGtub3csIG5vbmUgYWN0dWFsbHkKLSAgIGV4aXN0LiAgU3VwcG9ydGluZyB0aGVtIHdvdWxkIHJlcXVpcmUgY2hhbmdpbmcgdGhlc2UgY29uc3RhbnRzLCBhbmQKLSAgIGNoYW5naW5nIHNvbWUgYmZkX2hfZ2V0XzMyIHRvIGJmZF9oX2dldF82NC4gICovCi0KLS8qIFRoZSBzaXplIG9mIGFuIGV4dGVybmFsIHN5bWRlZiBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBCU0RfU1lNREVGX1NJWkUgOAotCi0vKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIGEgc3ltZGVmIHN0cnVjdHVyZSB0byB0aGUgZmlsZSBvZmZzZXQuICAqLwotI2RlZmluZSBCU0RfU1lNREVGX09GRlNFVF9TSVpFIDQKLQotLyogVGhlIHNpemUgb2YgdGhlIHN5bWRlZiBjb3VudC4gICovCi0jZGVmaW5lIEJTRF9TWU1ERUZfQ09VTlRfU0laRSA0Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBzdHJpbmcgY291bnQuICAqLwotI2RlZmluZSBCU0RfU1RSSU5HX0NPVU5UX1NJWkUgNAotCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotCi1zdGF0aWMgYm9vbGVhbgotZG9fc2x1cnBfYnNkX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBiZmRfYnl0ZSAqcmF3X2FybWFwLCAqcmJhc2U7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOwotICBjYXJzeW0gKnNldDsKLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBwYXJzZWRfc2l6ZSA9IG1hcGRhdGEtPnBhcnNlZF9zaXplOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7CS8qIERvbid0IG5lZWQgaXQgYW55IG1vcmUuICovCi0KLSAgcmF3X2FybWFwID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHBhcnNlZF9zaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIHBhcnNlZF9zaXplLCBhYmZkKSAhPSBwYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICBieWVieWU6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJhd19hcm1hcCkgLyBCU0RfU1lNREVGX1NJWkU7Ci0KLSAgaWYgKGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFID4KLSAgICAgIHBhcnNlZF9zaXplIC0gQlNEX1NZTURFRl9DT1VOVF9TSVpFKQotICAgIHsKLSAgICAgIC8qIFByb2JhYmx5IHdlJ3JlIHVzaW5nIHRoZSB3cm9uZyBieXRlIG9yZGVyaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgZ290byBieWVieWU7Ci0gICAgfQotCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotICByYmFzZSA9IHJhd19hcm1hcCArIEJTRF9TWU1ERUZfQ09VTlRfU0laRTsKLSAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSByYmFzZQotCQkrIGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFCi0JCSsgQlNEX1NUUklOR19DT1VOVF9TSVpFKTsKLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgKGFyZGF0YS0+c3ltZGVmX2NvdW50Ci0JCQkJCSAgICogc2l6ZW9mIChjYXJzeW0pKSk7Ci0gIGlmICghYXJkYXRhLT5zeW1kZWZzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ZXIgPSAwLCBzZXQgPSBhcmRhdGEtPnN5bWRlZnM7Ci0gICAgICAgY291bnRlciA8IGFyZGF0YS0+c3ltZGVmX2NvdW50OwotICAgICAgIGNvdW50ZXIrKywgc2V0KyssIHJiYXNlICs9IEJTRF9TWU1ERUZfU0laRSkKLSAgICB7Ci0gICAgICBzZXQtPm5hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlKSArIHN0cmluZ2Jhc2U7Ci0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYmFzZSArIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUpOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0gIC8qIEZJWE1FLCB3ZSBzaG91bGQgcHJvdmlkZSBzb21lIHdheSB0byBmcmVlIHJhd19hcmRhdGEgd2hlbgotICAgICB3ZSBhcmUgZG9uZSB1c2luZyB0aGUgc3RyaW5ncyBmcm9tIGl0LiAgRm9yIG5vdywgaXQgc2VlbXMKLSAgICAgdG8gYmUgYWxsb2NhdGVkIG9uIGFuIG9iamFsbG9jIGFueXdheS4uLiAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KLXN0YXRpYyBib29sZWFuCi1kb19zbHVycF9jb2ZmX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGludCAqcmF3X2FybWFwLCAqcmF3cHRyOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIGNhcnN5bSAqY2Fyc3ltczsKLSAgdW5zaWduZWQgaW50IG5zeW16OwkJLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYXJtYXAuICovCi0gIGJmZF92bWEgKCpzd2FwKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGNoYXIgaW50X2J1ZltzaXplb2YgKGxvbmcpXTsKLSAgdW5zaWduZWQgaW50IGNhcnN5bV9zaXplLCBwdHJzaXplLCBpOwotCi0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsJLyogRG9uJ3QgbmVlZCBpdCBhbnkgbW9yZS4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGludF9idWYsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBJdCBzZWVtcyB0aGF0IGFsbCBudW1lcmljIGluZm9ybWF0aW9uIGluIGEgY29mZiBhcmNoaXZlIGlzIGFsd2F5cwotICAgICBpbiBiaWcgZW5kaWFuIGZvcm1hdCwgbm9tYXR0ZXIgdGhlIGhvc3Qgb3IgdGFyZ2V0LiAqLwotICBzd2FwID0gYmZkX2dldGIzMjsKLSAgbnN5bXogPSBiZmRfZ2V0YjMyICgoUFRSKSBpbnRfYnVmKTsKLSAgc3RyaW5nc2l6ZSA9IHBhcnNlZF9zaXplIC0gKDQgKiBuc3lteikgLSA0OwotCi0jaWYgMQotICAvKiAuLi4gZXhjZXB0IHRoYXQgc29tZSBhcmNoaXZlIGZvcm1hdHMgYXJlIGJyb2tlbiwgYW5kIGl0IG1heSBiZSBvdXIKLSAgICAgZmF1bHQgLSB0aGUgaTk2MCBsaXR0bGUgZW5kaWFuIGNvZmYgc29tZXRpbWVzIGhhcyBiaWcgYW5kIHNvbWV0aW1lcwotICAgICBsaXR0bGUsIGJlY2F1c2Ugb3VyIHRvb2xzIGNoYW5nZWQuICBIZXJlJ3MgYSBob3JyaWJsZSBoYWNrIHRvIGNsZWFuCi0gICAgIHVwIHRoZSBjcmFwLiAgKi8KLQotICBpZiAoc3RyaW5nc2l6ZSA+IDB4ZmZmZmYKLSAgICAgICYmIGJmZF9nZXRfYXJjaCAoYWJmZCkgPT0gYmZkX2FyY2hfaTk2MAotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICB7Ci0gICAgICAvKiBUaGlzIGxvb2tzIGRhbmdlcm91cywgbGV0J3MgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQgKi8KLSAgICAgIG5zeW16ID0gYmZkX2dldGwzMiAoKFBUUikgaW50X2J1Zik7Ci0gICAgICBzdHJpbmdzaXplID0gcGFyc2VkX3NpemUgLSAoNCAqIG5zeW16KSAtIDQ7Ci0gICAgICBzd2FwID0gYmZkX2dldGwzMjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBUaGUgY29mZiBhcm1hcCBtdXN0IGJlIHJlYWQgc2VxdWVudGlhbGx5LiAgU28gd2UgY29uc3RydWN0IGEKLSAgICAgYnNkLXN0eWxlIG9uZSBpbiBjb3JlIGFsbCBhdCBvbmNlLCBmb3Igc2ltcGxpY2l0eS4gKi8KLQotICBjYXJzeW1fc2l6ZSA9IChuc3lteiAqIHNpemVvZiAoY2Fyc3ltKSk7Ci0gIHB0cnNpemUgPSAoNCAqIG5zeW16KTsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF96YWxsb2MgKGFiZmQsIGNhcnN5bV9zaXplICsgc3RyaW5nc2l6ZSArIDEpOwotICBpZiAoYXJkYXRhLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjYXJzeW1zID0gYXJkYXRhLT5zeW1kZWZzOwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIGFyZGF0YS0+c3ltZGVmcykgKyBjYXJzeW1fc2l6ZTsKLQotICAvKiBBbGxvY2F0ZSBhbmQgcmVhZCBpbiB0aGUgcmF3IG9mZnNldHMuICovCi0gIHJhd19hcm1hcCA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBwdHJzaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSBOVUxMKQotICAgIGdvdG8gcmVsZWFzZV9zeW1kZWZzOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJhd19hcm1hcCwgMSwgcHRyc2l6ZSwgYWJmZCkgIT0gcHRyc2l6ZQotICAgICAgfHwgYmZkX3JlYWQgKChQVFIpIHN0cmluZ2Jhc2UsIDEsIHN0cmluZ3NpemUsIGFiZmQpICE9IHN0cmluZ3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBnb3RvIHJlbGVhc2VfcmF3X2FybWFwOwotICAgIH0KLQotICAvKiBPSywgYnVpbGQgdGhlIGNhcnN5bXMgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5zeW16OyBpKyspCi0gICAgewotICAgICAgcmF3cHRyID0gcmF3X2FybWFwICsgaTsKLSAgICAgIGNhcnN5bXMtPmZpbGVfb2Zmc2V0ID0gc3dhcCAoKFBUUikgcmF3cHRyKTsKLSAgICAgIGNhcnN5bXMtPm5hbWUgPSBzdHJpbmdiYXNlOwotICAgICAgc3RyaW5nYmFzZSArPSBzdHJsZW4gKHN0cmluZ2Jhc2UpICsgMTsKLSAgICAgIGNhcnN5bXMrKzsKLSAgICB9Ci0gICpzdHJpbmdiYXNlID0gMDsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IG5zeW16OwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0KLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotCi0gIC8qIENoZWNrIGZvciBhIHNlY29uZCBhcmNoaXZlIGhlYWRlciAoYXMgdXNlZCBieSBQRSkgKi8KLSAgewotICAgIHN0cnVjdCBhcmVsdGRhdGEgKnRtcDsKLQotICAgIGJmZF9zZWVrIChhYmZkLCAgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCk7Ci0gICAgdG1wID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gICAgaWYgKHRtcCAhPSBOVUxMKSAKLSAgICAgIHsKLQlpZiAodG1wLT5hcmNoX2hlYWRlclswXSA9PSAnLycKLQkgICAgJiYgdG1wLT5hcmNoX2hlYWRlclsxXSA9PSAnICcpIAotCSAgewotCSAgICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPQotCSAgICAgICh0bXAtPnBhcnNlZF9zaXplICsgc2l6ZW9mKHN0cnVjdCBhcl9oZHIpICsgMSkgJiB+MTsKLQkgIH0KLQliZmRfcmVsZWFzZSAoYWJmZCwgdG1wKTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotCi1yZWxlYXNlX3Jhd19hcm1hcDoKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci1yZWxlYXNlX3N5bWRlZnM6Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSAoYXJkYXRhKS0+c3ltZGVmcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhpcyByb3V0aW5lIGNhbiBoYW5kbGUgZWl0aGVyIGNvZmYtc3R5bGUgb3IgYnNkLXN0eWxlIGFybWFwcy4KLSAgIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCi0KLWJvb2xlYW4KLWJmZF9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgaW50IGkgPSBiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKTsKLQotICBpZiAoaSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoaSAhPSAxNikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGICAgICAgICIsIDE2KQotICAgICAgfHwgIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGLyAgICAgICIsIDE2KSkgLyogb2xkIExpbnV4IGFyY2hpdmVzICovCi0gICAgcmV0dXJuIGRvX3NsdXJwX2JzZF9hcm1hcCAoYWJmZCk7Ci0gIGVsc2UgaWYgKCFzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikpCi0gICAgcmV0dXJuIGRvX3NsdXJwX2NvZmZfYXJtYXAgKGFiZmQpOwotICBlbHNlIGlmICghc3RybmNtcCAobmV4dG5hbWUsICIvU1lNNjQvICAgICAgICAgIiwgMTYpKQotICAgIHsKLSAgICAgIC8qIElyaXggNiBhcmNoaXZlLS1tdXN0IGJlIHJlY29nbml6ZWQgYnkgY29kZSBpbiBlbGY2NC1taXBzLmMuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCi0vKiBmbGF2b3IgMiBvZiBhIGJzZCBhcm1hcCwgc2ltaWxhciB0byBiZmRfc2x1cnBfYnNkX2FybWFwIGV4Y2VwdCB0aGUKLSAgIGhlYWRlciBpcyBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCBvcmRlciBhbmQgdGhlIG1hcCBuYW1lIGlzICcvJy4KLSAgIFRoaXMgZmxhdm91ciBpcyB1c2VkIGJ5IGhwMzAwaHB1eC4gKi8KLQotI2RlZmluZSBIUFVYX1NZTURFRl9DT1VOVF9TSVpFIDIKLQotYm9vbGVhbgotYmZkX3NsdXJwX2JzZF9hcm1hcF9mMiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICptYXBkYXRhOwotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGJmZF9ieXRlICpyYXdfYXJtYXAsICpyYmFzZTsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOwotICBjaGFyICpzdHJpbmdiYXNlOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZTsKLSAgY2Fyc3ltICpzZXQ7Ci0gIGludCBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0KLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBhcmNoaXZlIGhhcyBhdCBsZWFzdCAxNiBieXRlcyBpbiBpdCAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIC0xNkwsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGICAgICAgICIsIDE2KQotICAgICAgfHwgIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGLyAgICAgICIsIDE2KSkgLyogb2xkIExpbnV4IGFyY2hpdmVzICovCi0gICAgcmV0dXJuIGRvX3NsdXJwX2JzZF9hcm1hcCAoYWJmZCk7Ci0KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJhd19hcm1hcCA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBtYXBkYXRhLT5wYXJzZWRfc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgYnllYnllOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJhd19hcm1hcCwgMSwgbWFwZGF0YS0+cGFyc2VkX3NpemUsIGFiZmQpICE9Ci0gICAgICBtYXBkYXRhLT5wYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICBieWVieWVieWU6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIGdvdG8gYnllYnllOwotICAgIH0KLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotICBpZiAoYXJkYXRhLT5zeW1kZWZfY291bnQgKiBCU0RfU1lNREVGX1NJWkUKLSAgICAgID4gbWFwZGF0YS0+cGFyc2VkX3NpemUgLSBIUFVYX1NZTURFRl9DT1VOVF9TSVpFKQotICAgIHsKLSAgICAgIC8qIFByb2JhYmx5IHdlJ3JlIHVzaW5nIHRoZSB3cm9uZyBieXRlIG9yZGVyaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgZ290byBieWVieWVieWU7Ci0gICAgfQotCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotCi0gIHN0cmluZ3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJhd19hcm1hcCArIEhQVVhfU1lNREVGX0NPVU5UX1NJWkUpOwotICAvKiBza2lwIHN5bSBjb3VudCBhbmQgc3RyaW5nIHN6ICovCi0gIHN0cmluZ2Jhc2UgPSAoKGNoYXIgKikgcmF3X2FybWFwCi0JCSsgSFBVWF9TWU1ERUZfQ09VTlRfU0laRQotCQkrIEJTRF9TVFJJTkdfQ09VTlRfU0laRSk7Ci0gIHJiYXNlID0gKGJmZF9ieXRlICopIHN0cmluZ2Jhc2UgKyBzdHJpbmdzaXplOwotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAoYXJkYXRhLT5zeW1kZWZfY291bnQKLQkJCQkJICAgKiBCU0RfU1lNREVGX1NJWkUpKTsKLSAgaWYgKCFhcmRhdGEtPnN5bWRlZnMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnRlciA9IDAsIHNldCA9IGFyZGF0YS0+c3ltZGVmczsKLSAgICAgICBjb3VudGVyIDwgYXJkYXRhLT5zeW1kZWZfY291bnQ7Ci0gICAgICAgY291bnRlcisrLCBzZXQrKywgcmJhc2UgKz0gQlNEX1NZTURFRl9TSVpFKQotICAgIHsKLSAgICAgIHNldC0+bmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmJhc2UpICsgc3RyaW5nYmFzZTsKLSAgICAgIHNldC0+ZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlICsgQlNEX1NZTURFRl9PRkZTRVRfU0laRSk7Ci0gICAgfQotCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeSBpZiB5b3UgaGF2ZSB0byAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSAoYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKLSAgLyogRklYTUUsIHdlIHNob3VsZCBwcm92aWRlIHNvbWUgd2F5IHRvIGZyZWUgcmF3X2FyZGF0YSB3aGVuCi0gICAgIHdlIGFyZSBkb25lIHVzaW5nIHRoZSBzdHJpbmdzIGZyb20gaXQuICBGb3Igbm93LCBpdCBzZWVtcwotICAgICB0byBiZSBhbGxvY2F0ZWQgb24gYW4gb2JqYWxsb2MgYW55d2F5Li4uICovCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqIEV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLSAgTm9ybWFsbHkgYXJjaGl2ZXMgc3VwcG9ydCBvbmx5IDE0LWNoYXJhY3RlciBmaWxlbmFtZXMuCi0KLSAgSW50ZWwgaGFzIGV4dGVuZGVkIHRoZSBmb3JtYXQ6IGxvbmdlciBuYW1lcyBhcmUgc3RvcmVkIGluIGEgc3BlY2lhbAotICBlbGVtZW50ICh0aGUgZmlyc3QgaW4gdGhlIGFyY2hpdmUsIG9yIHNlY29uZCBpZiB0aGVyZSBpcyBhbiBhcm1hcCk7Ci0gIHRoZSBuYW1lIGluIHRoZSBhcl9oZHIgaXMgcmVwbGFjZWQgYnkgPHNwYWNlPjxpbmRleCBpbnRvIGZpbGVuYW1lCi0gIGVsZW1lbnQ+LiAgSW5kZXggaXMgdGhlIFAuUi4gb2YgYW4gaW50IChkZWNpbWFsKS4gIERhdGEgR2VuZXJhbCBoYXZlCi0gIGV4dGVuZGVkIHRoZSBmb3JtYXQgYnkgdXNpbmcgdGhlIHByZWZpeCAvLyBmb3IgdGhlIHNwZWNpYWwgZWxlbWVudCAqLwotCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotYm9vbGVhbgotX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICBzdHJ1Y3QgYXJlbHRkYXRhICpuYW1lZGF0YTsKLQotICAvKiBGSVhNRTogIEZvcm1hdHRpbmcgc3Vja3MgaGVyZSwgYW5kIGluIGNhc2Ugb2YgZmFpbHVyZSBvZiBCRkRfUkVBRCwKLSAgICAgd2UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byByZXR1cm4gdHJ1ZS4gICovCi0gIGJmZF9zZWVrIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKSA9PSAxNikKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICJBUkZJTEVOQU1FUy8gICAgIiwgMTYpICE9IDAgJiYKLQkgIHN0cm5jbXAgKG5leHRuYW1lLCAiLy8gICAgICAgICAgICAgICIsIDE2KSAhPSAwKQotCXsKLQkgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIG5hbWVkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gICAgICBpZiAobmFtZWRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9Ci0JYmZkX3phbGxvYyAoYWJmZCwgbmFtZWRhdGEtPnBhcnNlZF9zaXplKTsKLSAgICAgIGlmIChiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JYnllYnllOgotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG5hbWVkYXRhKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzLCAxLAotCQkgICAgbmFtZWRhdGEtPnBhcnNlZF9zaXplLCBhYmZkKSAhPSBuYW1lZGF0YS0+cGFyc2VkX3NpemUpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIChiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMpKTsKLQkgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0JICBnb3RvIGJ5ZWJ5ZTsKLQl9Ci0KLSAgICAgIC8qIFNpbmNlIHRoZSBhcmNoaXZlIGlzIHN1cHBvc2VkIHRvIGJlIHByaW50YWJsZSBpZiBpdCBjb250YWlucwotCSB0ZXh0LCB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBhcmUgbmV3bGluZS1wYWRkZWQsIG5vdCBudWxsCi0JIHBhZGRlZC4gSW4gU1ZSNC1zdHlsZSBhcmNoaXZlcywgdGhlIG5hbWVzIGFsc28gaGF2ZSBhCi0JIHRyYWlsaW5nICcvJy4gIERPUy9OVCBjcmVhdGVkIGFyY2hpdmUgb2Z0ZW4gaGF2ZSBcIGluIHRoZW0KLQkgV2UnbGwgZml4IGFsbCBwcm9ibGVtcyBoZXJlLi4gICovCi0gICAgICB7Ci0JY2hhciAqdGVtcCA9IGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lczsKLQljaGFyICpsaW1pdCA9IHRlbXAgKyBuYW1lZGF0YS0+cGFyc2VkX3NpemU7Ci0JZm9yICg7IHRlbXAgPCBsaW1pdDsgKyt0ZW1wKSB7Ci0JICBpZiAoKnRlbXAgPT0gJ1wwMTInKQotCSAgICB0ZW1wW3RlbXBbLTFdID09ICcvJyA/IC0xIDogMF0gPSAnXDAnOwotCSAgaWYgKCp0ZW1wID09ICdcXCcpCi0JICAgICp0ZW1wID0gJy8nOwotCX0KLSAgICAgIH0KLQotICAgICAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9Ci0JKGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKLQotICAgICAgLyogRklYTUUsIHdlIGNhbid0IHJlbGVhc2UgbmFtZWRhdGEgaGVyZSBiZWNhdXNlIGl0IHdhcyBhbGxvY2F0ZWQKLQkgYmVsb3cgZXh0ZW5kZWRfbmFtZXMgb24gdGhlIG9iamFsbG9jLi4uICovCi0gICAgICAvKiBiZmRfcmVsZWFzZSAoYWJmZCwgbmFtZWRhdGEpOyAqLwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBWTVMKLQotLyogUmV0dXJuIGEgY29weSBvZiB0aGUgc3R1ZmYgaW4gdGhlIGZpbGVuYW1lIGJldHdlZW4gYW55IDpdPiBhbmQgYQotICAgc2VtaWNvbG9uICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgKGFiZmQsIGZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgQ09OU1QgY2hhciAqZmlyc3Q7Ci0gIENPTlNUIGNoYXIgKmxhc3Q7Ci0gIGNoYXIgKmNvcHk7Ci0KLSAgZmlyc3QgPSBmaWxlICsgc3RybGVuIChmaWxlKSAtIDE7Ci0gIGxhc3QgPSBmaXJzdCArIDE7Ci0KLSAgd2hpbGUgKGZpcnN0ICE9IGZpbGUpCi0gICAgewotICAgICAgaWYgKCpmaXJzdCA9PSAnOycpCi0JbGFzdCA9IGZpcnN0OwotICAgICAgaWYgKCpmaXJzdCA9PSAnOicgfHwgKmZpcnN0ID09ICddJyB8fCAqZmlyc3QgPT0gJz4nKQotCXsKLQkgIGZpcnN0Kys7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmaXJzdC0tOwotICAgIH0KLQotICBjb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBsYXN0IC0gZmlyc3QgKyAxKTsKLSAgaWYgKGNvcHkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtZW1jcHkgKGNvcHksIGZpcnN0LCBsYXN0IC0gZmlyc3QpOwotICBjb3B5W2xhc3QgLSBmaXJzdF0gPSAwOwotCi0gIHJldHVybiBjb3B5OwotfQotCi0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgKgotbm9ybWFsaXplIChhYmZkLCBmaWxlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlLCAnLycpOwotCi0gIGlmIChmaWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIGZpbGVuYW1lKys7Ci0gIGVsc2UKLSAgICBmaWxlbmFtZSA9IGZpbGU7Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLSNlbmRpZgotCi0vKiBCdWlsZCBhIEJGRCBzdHlsZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotICAgICBjb25zdCBjaGFyICoqbmFtZTsKLXsKLSAgKm5hbWUgPSAiQVJGSUxFTkFNRVMvIjsKLSAgcmV0dXJuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIGZhbHNlLCB0YWJsb2MsIHRhYmxlbik7Ci19Ci0KLS8qIEJ1aWxkIGFuIFNWUjQgc3R5bGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0YWJsb2MsIHRhYmxlbiwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICoqdGFibG9jOwotICAgICBiZmRfc2l6ZV90eXBlICp0YWJsZW47Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lOwotewotICAqbmFtZSA9ICIvLyI7Ci0gIHJldHVybiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cnVlLCB0YWJsb2MsIHRhYmxlbik7Ci19Ci0KLS8qIEZvbGxvd3MgYXJjaGl2ZV9oZWFkIGFuZCBwcm9kdWNlcyBhbiBleHRlbmRlZCBuYW1lIHRhYmxlIGlmCi0gICBuZWNlc3NhcnkuICBSZXR1cm5zIChpbiB0YWJsb2MpIGEgcG9pbnRlciB0byBhbiBleHRlbmRlZCBuYW1lCi0gICB0YWJsZSwgYW5kIGluIHRhYmxlbiB0aGUgbGVuZ3RoIG9mIHRoZSB0YWJsZS4gIElmIGl0IG1ha2VzIGFuIGVudHJ5Ci0gICBpdCBjbG9iYmVycyB0aGUgZmlsZW5hbWUgc28gdGhhdCB0aGUgZWxlbWVudCBtYXkgYmUgd3JpdHRlbiB3aXRob3V0Ci0gICBmdXJ0aGVyIG1hc3NhZ2UuICBSZXR1cm5zIHRydWUgaWYgaXQgcmFuIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYKLSAgIHNvbWV0aGluZyB3ZW50IHdyb25nLiAgQSBzdWNjZXNzZnVsIHJldHVybiBtYXkgc3RpbGwgaW52b2x2ZSBhCi0gICB6ZXJvLWxlbmd0aCB0YWJsZW4hICAqLwotCi1ib29sZWFuCi1fYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cmFpbGluZ19zbGFzaCwgdGFibG9jLCB0YWJsZW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiB0cmFpbGluZ19zbGFzaDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotewotICB1bnNpZ25lZCBpbnQgbWF4bmFtZSA9IGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbmFtZWxlbiA9IDA7Ci0gIGJmZCAqY3VycmVudDsKLSAgY2hhciAqc3RycHRyOwotCi0gICp0YWJsZW4gPSAwOwotCi0gIC8qIEZpZ3VyZSBvdXQgaG93IGxvbmcgdGhlIHRhYmxlIHNob3VsZCBiZSAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbm9ybWFsOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47Ci0KLSAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOwotICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKLQotICAgICAgaWYgKHRoaXNsZW4gPiBtYXhuYW1lCi0JICAmJiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JdGhpc2xlbiA9IG1heG5hbWU7Ci0KLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKLQl7Ci0JICAvKiBBZGQgb25lIHRvIGxlYXZlIHJvb20gZm9yIFxuLiAgKi8KLQkgIHRvdGFsX25hbWVsZW4gKz0gdGhpc2xlbiArIDE7Ci0JICBpZiAodHJhaWxpbmdfc2xhc2gpCi0JICAgIHsKLQkgICAgICAvKiBMZWF2ZSByb29tIGZvciB0cmFpbGluZyBzbGFzaC4gICovCi0JICAgICAgKyt0b3RhbF9uYW1lbGVuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKLQkgIGlmIChzdHJuY21wIChub3JtYWwsIGhkci0+YXJfbmFtZSwgdGhpc2xlbikgIT0gMAotCSAgICAgIHx8ICh0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZQotCQkgICYmIGhkci0+YXJfbmFtZVt0aGlzbGVuXSAhPSBhcl9wYWRjaGFyIChjdXJyZW50KSkpCi0JICAgIHsKLQkgICAgICAvKiBNdXN0IGhhdmUgYmVlbiB1c2luZyBleHRlbmRlZCBmb3JtYXQgZXZlbiB0aG91Z2ggaXQKLQkgICAgICAgICBkaWRuJ3QgbmVlZCB0by4gIEZpeCBpdCB0byB1c2Ugbm9ybWFsIGZvcm1hdC4gICovCi0JICAgICAgbWVtY3B5IChoZHItPmFyX25hbWUsIG5vcm1hbCwgdGhpc2xlbik7Ci0JICAgICAgaWYgKHRoaXNsZW4gPCBtYXhuYW1lCi0JCSAgfHwgKHRoaXNsZW4gPT0gbWF4bmFtZSAmJiB0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZSkpCi0JCWhkci0+YXJfbmFtZVt0aGlzbGVuXSA9IGFyX3BhZGNoYXIgKGN1cnJlbnQpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAodG90YWxfbmFtZWxlbiA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gICp0YWJsb2MgPSBiZmRfemFsbG9jIChhYmZkLCB0b3RhbF9uYW1lbGVuKTsKLSAgaWYgKCp0YWJsb2MgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnRhYmxlbiA9IHRvdGFsX25hbWVsZW47Ci0gIHN0cnB0ciA9ICp0YWJsb2M7Ci0KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbm9ybWFsOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47Ci0KLSAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOwotICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKLQl7Ci0JICAvKiBXb3JrcyBmb3Igbm93OyBtYXkgbmVlZCB0byBiZSByZS1lbmdpbmVlcmVkIGlmIHdlCi0JICAgICBlbmNvdW50ZXIgYW4gb2RkYmFsbCBhcmNoaXZlIGZvcm1hdCBhbmQgd2FudCB0bwotCSAgICAgZ2VuZXJhbGlzZSB0aGlzIGhhY2suICovCi0JICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSBhcmNoX2hkciAoY3VycmVudCk7Ci0JICBzdHJjcHkgKHN0cnB0ciwgbm9ybWFsKTsKLQkgIGlmICghIHRyYWlsaW5nX3NsYXNoKQotCSAgICBzdHJwdHJbdGhpc2xlbl0gPSAnXDAxMic7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJwdHJbdGhpc2xlbl0gPSAnLyc7Ci0JICAgICAgc3RycHRyW3RoaXNsZW4gKyAxXSA9ICdcMDEyJzsKLQkgICAgfQotCSAgaGRyLT5hcl9uYW1lWzBdID0gYXJfcGFkY2hhciAoY3VycmVudCk7Ci0JICAvKiBXZSBrbm93IHRoZXJlIHdpbGwgYWx3YXlzIGJlIGVub3VnaCByb29tIChvbmUgb2YgdGhlIGZldwotCSAgICAgY2FzZXMgd2hlcmUgeW91IG1heSBzYWZlbHkgdXNlIHNwcmludGYpLiAqLwotCSAgc3ByaW50ZiAoKGhkci0+YXJfbmFtZSkgKyAxLCAiJS1kIiwgKHVuc2lnbmVkKSAoc3RycHRyIC0gKnRhYmxvYykpOwotCSAgLyogS2luZGEgS2x1ZGd5LiAgV2Ugc2hvdWxkIGp1c3QgdXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBvZgotCSAgICAgc3ByaW50ZiBidXQgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgZ2V0IHRoaXMgcmlnaHQgKi8KLQkgIHsKLQkgICAgY2hhciAqdGVtcCA9IGhkci0+YXJfbmFtZSArIDI7Ci0JICAgIGZvciAoOyB0ZW1wIDwgaGRyLT5hcl9uYW1lICsgbWF4bmFtZTsgdGVtcCsrKQotCSAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQotCQkqdGVtcCA9ICcgJzsKLQkgIH0KLQkgIHN0cnB0ciArPSB0aGlzbGVuICsgMTsKLQkgIGlmICh0cmFpbGluZ19zbGFzaCkKLQkgICAgKytzdHJwdHI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBBIGNvdXBsZSBvZiBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFyX2hkcnMgKi8KLQotI2lmbmRlZiBIQVZFX0dFVFVJRAotI2RlZmluZSBnZXR1aWQoKSAwCi0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dFVEdJRAotI2RlZmluZSBnZXRnaWQoKSAwCi0jZW5kaWYKLQotLyogVGFrZXMgYSBmaWxlbmFtZSwgcmV0dXJucyBhbiBhcmVsdF9kYXRhIGZvciBpdCwgb3IgTlVMTCBpZiBpdCBjYW4ndAotICAgbWFrZSBvbmUuICBUaGUgZmlsZW5hbWUgbXVzdCByZWZlciB0byBhIGZpbGVuYW1lIGluIHRoZSBmaWxlc3lzdGVtLgotICAgVGhlIGZpbGVuYW1lIGZpZWxkIG9mIHRoZSBhcl9oZHIgd2lsbCBOT1QgYmUgaW5pdGlhbGl6ZWQuICBJZiBtZW1iZXIKLSAgIGlzIHNldCwgYW5kIGl0J3MgYW4gaW4tbWVtb3J5IGJmZCwgd2UgZmFrZSBpdC4gKi8KLQotc3RhdGljIHN0cnVjdCBhcmVsdGRhdGEgKgotYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gKGFiZmQsIGZpbGVuYW1lLCBtZW1iZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJmZCAqbWVtYmVyOwotewotICBzdHJ1Y3Qgc3RhdCBzdGF0dXM7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyZWQ7Ci0gIHN0cnVjdCBhcl9oZHIgKmhkcjsKLSAgY2hhciAqdGVtcCwgKnRlbXAxOwotCi0gIGlmIChtZW1iZXIgJiYgKG1lbWJlci0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSB3ZSBqdXN0ICJtYWRlIiB0aGUgbWVtYmVyLCBhbmQgZmFrZSBpdCAqLwotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBtZW1iZXItPmlvc3RyZWFtOwotICAgICAgdGltZSgmc3RhdHVzLnN0X210aW1lKTsKLSAgICAgIHN0YXR1cy5zdF91aWQgPSBnZXR1aWQoKTsKLSAgICAgIHN0YXR1cy5zdF9naWQgPSBnZXRnaWQoKTsKLSAgICAgIHN0YXR1cy5zdF9tb2RlID0gMDY0NDsKLSAgICAgIHN0YXR1cy5zdF9zaXplID0gYmltLT5zaXplOwotICAgIH0KLSAgZWxzZSBpZiAoc3RhdCAoZmlsZW5hbWUsICZzdGF0dXMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhcmVkID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7Ci0gIGlmIChhcmVkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGhkciA9IChzdHJ1Y3QgYXJfaGRyICopICgoKGNoYXIgKikgYXJlZCkgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLQotICAvKiBhciBoZWFkZXJzIGFyZSBzcGFjZSBwYWRkZWQsIG5vdCBudWxsIHBhZGRlZCEgKi8KLSAgbWVtc2V0ICgoUFRSKSBoZHIsICcgJywgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0KLSAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOwotCi0gIC8qIEdvZGRhbW5lZCBzcHJpbnRmIGRvZXNuJ3QgcGVybWl0IE1BWElNVU0gZmllbGQgbGVuZ3RocyAqLwotICBzcHJpbnRmICgoaGRyLT5hcl9kYXRlKSwgIiUtMTJsZCIsIChsb25nKSBzdGF0dXMuc3RfbXRpbWUpOwotICBzcHJpbnRmICgoaGRyLT5hcl91aWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF91aWQpOwotICBzcHJpbnRmICgoaGRyLT5hcl9naWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF9naWQpOwotICBzcHJpbnRmICgoaGRyLT5hcl9tb2RlKSwgIiUtOG8iLCAodW5zaWduZWQgaW50KSBzdGF0dXMuc3RfbW9kZSk7Ci0gIHNwcmludGYgKChoZHItPmFyX3NpemUpLCAiJS0xMGxkIiwgKGxvbmcpIHN0YXR1cy5zdF9zaXplKTsKLSAgLyogQ29ycmVjdCBmb3IgYSBsb3NzYWdlIGluIHNwcmludGYgd2hlcmVieSBpdCBudWxsLXRlcm1pbmF0ZXMuICBJIGNhbm5vdAotICAgICB1bmRlcnN0YW5kIGhvdyB0aGVzZSBDIGxvc2VycyBjb3VsZCBkZXNpZ24gc3VjaCBhIHJhbXNoYWNrbGUgYnVuY2ggb2YKLSAgICAgSU8gb3BlcmF0aW9ucyAqLwotICB0ZW1wID0gKGNoYXIgKikgaGRyOwotICB0ZW1wMSA9IHRlbXAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpIC0gMjsKLSAgZm9yICg7IHRlbXAgPCB0ZW1wMTsgdGVtcCsrKQotICAgIHsKLSAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQotCSp0ZW1wID0gJyAnOwotICAgIH0KLSAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICBhcmVkLT5wYXJzZWRfc2l6ZSA9IHN0YXR1cy5zdF9zaXplOwotICBhcmVkLT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcjsKLQotICByZXR1cm4gYXJlZDsKLX0KLQotLyogVGhpcyBpcyBtYWdpYyByZXF1aXJlZCBieSB0aGUgImFyIiBwcm9ncmFtLiAgU2luY2UgaXQncwotICAgIHVuZG9jdW1lbnRlZCwgaXQncyB1bmRvY3VtZW50ZWQuICBZb3UgbWF5IHRoaW5rIHRoYXQgaXQgd291bGQgdGFrZQotICAgIGEgc3Ryb25nIHN0b21hY2ggdG8gd3JpdGUgdGhpcywgYW5kIGl0IGRvZXMsIGJ1dCBpdCB0YWtlcyBldmVuIGEKLSAgICBzdHJvbmdlciBzdG9tYWNoIHRvIHRyeSB0byBjb2RlIGFyb3VuZCBzdWNoIGEgdGhpbmchICAqLwotCi1zdHJ1Y3QgYXJfaGRyICpiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0cnVjdCBhcl9oZHIgKgotYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgKGFiZmQsIGZpbGVuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICphcl9lbHQgPSBiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSAoYWJmZCwgZmlsZW5hbWUsIDApOwotICBpZiAoYXJfZWx0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiAoc3RydWN0IGFyX2hkciAqKSBhcl9lbHQtPmFyY2hfaGVhZGVyOwotfQotCi0KLS8qIEFuYWxvZ291cyB0byBzdGF0IGNhbGwgKi8KLWludAotYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpidWY7Ci17Ci0gIHN0cnVjdCBhcl9oZHIgKmhkcjsKLSAgY2hhciAqYWxvc2VyOwotCi0gIGlmIChhYmZkLT5hcmVsdF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaGRyID0gYXJjaF9oZHIgKGFiZmQpOwotCi0jZGVmaW5lIGZvbyhhcmVsdCwgc3RlbHQsIHNpemUpICBcCi0gIGJ1Zi0+c3RlbHQgPSBzdHJ0b2wgKGhkci0+YXJlbHQsICZhbG9zZXIsIHNpemUpOyBcCi0gIGlmIChhbG9zZXIgPT0gaGRyLT5hcmVsdCkgcmV0dXJuIC0xOwotCi0gIGZvbyAoYXJfZGF0ZSwgc3RfbXRpbWUsIDEwKTsKLSAgZm9vIChhcl91aWQsIHN0X3VpZCwgMTApOwotICBmb28gKGFyX2dpZCwgc3RfZ2lkLCAxMCk7Ci0gIGZvbyAoYXJfbW9kZSwgc3RfbW9kZSwgOCk7Ci0KLSAgYnVmLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWJmZF9kb250X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgLyogRklYTUU6IFRoaXMgaW50ZXJhY3RzIHVucGxlYXNhbnRseSB3aXRoIGFyJ3MgcXVpY2stYXBwZW5kIG9wdGlvbi4KLSAgICAgRm9ydHVuYXRlbHkgaWM5NjAgdXNlcnMgd2lsbCBuZXZlciB1c2UgdGhhdCBvcHRpb24uICBGaXhpbmcgdGhpcwotICAgICBpcyB2ZXJ5IGhhcmQ7IGZvcnR1bmF0ZWx5IEkga25vdyBob3cgdG8gZG8gaXQgYW5kIHdpbGwgZG8gc28gb25jZQotICAgICBpbnRlbCdzIHJlbGVhc2UgaXMgb3V0IHRoZSBkb29yLiAqLwotCi0gIHN0cnVjdCBhcl9oZHIgKmhkciA9IChzdHJ1Y3QgYXJfaGRyICopIGFyaGRyOwotICBzaXplX3QgbGVuZ3RoOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgc2l6ZV90IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgewotICAgICAgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZpbGVuYW1lID0gbm9ybWFsaXplIChhYmZkLCBwYXRobmFtZSk7Ci0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgbGVuZ3RoID0gc3RybGVuIChmaWxlbmFtZSk7Ci0KLSAgaWYgKGxlbmd0aCA8PSBtYXhsZW4pCi0gICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBsZW5ndGgpOwotCi0gIC8qIEFkZCB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQuICAqLwotICBpZiAobGVuZ3RoIDwgbWF4bGVuCi0gICAgICB8fCAobGVuZ3RoID09IG1heGxlbiAmJiBsZW5ndGggPCBzaXplb2YgaGRyLT5hcl9uYW1lKSkKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0KLXZvaWQKLWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7Ci0gICAgIGNoYXIgKmFyaGRyOwotewotICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSAoc3RydWN0IGFyX2hkciAqKSBhcmhkcjsKLSAgaW50IGxlbmd0aDsKLSAgQ09OU1QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChwYXRobmFtZSwgJy8nKTsKLSAgaW50IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gcGF0aG5hbWU7Ci0gIGVsc2UKLSAgICArK2ZpbGVuYW1lOwotCi0gIGxlbmd0aCA9IHN0cmxlbiAoZmlsZW5hbWUpOwotCi0gIGlmIChsZW5ndGggPD0gbWF4bGVuKQotICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbGVuZ3RoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KLSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKLSAgICAgIGxlbmd0aCA9IG1heGxlbjsKLSAgICB9Ci0KLSAgaWYgKGxlbmd0aCA8IG1heGxlbikKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0KLS8qIFN0b3JlIG5hbWUgaW50byBhciBoZWFkZXIuICBUcnVuY2F0ZXMgdGhlIG5hbWUgdG8gZml0LgotICAgMT4gc3RyaXAgcGF0aG5hbWUgdG8gYmUganVzdCB0aGUgYmFzZW5hbWUuCi0gICAyPiBpZiBpdCdzIHNob3J0IGVudWYgdG8gZml0LCBzdHVmZiBpdCBpbi4KLSAgIDM+IElmIGl0IGRvZXNuJ3QgZW5kIHdpdGggLm8sIHRydW5jYXRlIGl0IHRvIGZpdAotICAgND4gdHJ1bmNhdGUgaXQgYmVmb3JlIHRoZSAubywgYXBwZW5kIC5vLCBzdHVmZiBUSEFUIGluLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IGdudSBhciBkb2VzLiAgSXQncyBiZXR0ZXIgYnV0IGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgYnNkIGFyLiAqLwotCi12b2lkCi1iZmRfZ251X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgc3RydWN0IGFyX2hkciAqaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgYXJoZHI7Ci0gIGludCBsZW5ndGg7Ci0gIENPTlNUIGNoYXIgKmZpbGVuYW1lID0gc3RycmNociAocGF0aG5hbWUsICcvJyk7Ci0gIGludCBtYXhsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9IHBhdGhuYW1lOwotICBlbHNlCi0gICAgKytmaWxlbmFtZTsKLQotICBsZW5ndGggPSBzdHJsZW4gKGZpbGVuYW1lKTsKLQotICBpZiAobGVuZ3RoIDw9IG1heGxlbikKLSAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIGxlbmd0aCk7Ci0gIGVsc2UKLSAgICB7CQkJCS8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KLSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKLSAgICAgIGlmICgoZmlsZW5hbWVbbGVuZ3RoIC0gMl0gPT0gJy4nKSAmJiAoZmlsZW5hbWVbbGVuZ3RoIC0gMV0gPT0gJ28nKSkKLQl7Ci0JICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMl0gPSAnLic7Ci0JICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMV0gPSAnbyc7Ci0JfQotICAgICAgbGVuZ3RoID0gbWF4bGVuOwotICAgIH0KLQotICBpZiAobGVuZ3RoIDwgMTYpCi0gICAgKGhkci0+YXJfbmFtZSlbbGVuZ3RoXSA9IGFyX3BhZGNoYXIgKGFiZmQpOwotfQotDAotLyogVGhlIEJGRCBpcyBvcGVuIGZvciB3cml0ZSBhbmQgaGFzIGl0cyBmb3JtYXQgc2V0IHRvIGJmZF9hcmNoaXZlICovCi0KLWJvb2xlYW4KLV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYXJjaCkKLSAgICAgYmZkICphcmNoOwotewotICBiZmQgKmN1cnJlbnQ7Ci0gIGNoYXIgKmV0YWJsZSA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgZWxlbmd0aCA9IDA7Ci0gIGNvbnN0IGNoYXIgKmVuYW1lID0gTlVMTDsKLSAgYm9vbGVhbiBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFyY2gpOwotICBib29sZWFuIGhhc29iamVjdHMgPSBmYWxzZTsJLyogaWYgbm8gLm8ncywgZG9uJ3QgYm90aGVyIHRvIG1ha2UgYSBtYXAgKi8KLSAgYmZkX3NpemVfdHlwZSB3cm90ZTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCB0cmllczsKLQotICAvKiBWZXJpZnkgdGhlIHZpYWJpbGl0eSBvZiBhbGwgZW50cmllczsgaWYgYW55IG9mIHRoZW0gbGl2ZSBpbiB0aGUKLSAgICAgZmlsZXN5c3RlbSAoYXMgb3Bwb3NlZCB0byBsaXZpbmcgaW4gYW4gYXJjaGl2ZSBvcGVuIGZvciBpbnB1dCkKLSAgICAgdGhlbiBjb25zdHJ1Y3QgYSBmcmVzaCBhcl9oZHIgZm9yIHRoZW0uICAqLwotICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGVfcCAoY3VycmVudCkpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCi0JewotCSAgY3VycmVudC0+YXJlbHRfZGF0YSA9Ci0JICAgIChQVFIpIGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIChhcmNoLCBjdXJyZW50LT5maWxlbmFtZSwgY3VycmVudCk7Ci0JICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogUHV0IGluIHRoZSBmaWxlIG5hbWUgKi8KLQkgIEJGRF9TRU5EIChhcmNoLCBfYmZkX3RydW5jYXRlX2FybmFtZSwgKGFyY2gsCi0JCQkJCQkgY3VycmVudC0+ZmlsZW5hbWUsCi0JCQkJCSAgICAgIChjaGFyICopIGFyY2hfaGRyIChjdXJyZW50KSkpOwotCX0KLQotICAgICAgaWYgKG1ha2VtYXAgJiYgISBoYXNvYmplY3RzKQotCXsJCQkvKiBkb24ndCBib3RoZXIgaWYgd2Ugd29uJ3QgbWFrZSBhIG1hcCEgKi8KLQkgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkpCi0jaWYgMAkJCQkvKiBGSVhNRSAtLSB0aGVzZSBhcmUgbm90IHNldCBjb3JyZWN0bHkgKi8KLQkgICAgICAmJiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoY3VycmVudCkgJiBIQVNfU1lNUykpCi0jZW5kaWYKLQkgICAgKQotCSAgICBoYXNvYmplY3RzID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGlmICghQkZEX1NFTkQgKGFyY2gsIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUsCi0JCSAoYXJjaCwgJmV0YWJsZSwgJmVsZW5ndGgsICZlbmFtZSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFyY2gsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotI2lmZGVmIEdOVTk2MAotICB3cm90ZSA9IGJmZF93cml0ZSAoQkZEX0dOVTk2MF9BUk1BRyAoYXJjaCksIDEsIFNBUk1BRywgYXJjaCk7Ci0jZWxzZQotICB3cm90ZSA9IGJmZF93cml0ZSAoQVJNQUcsIDEsIFNBUk1BRywgYXJjaCk7Ci0jZW5kaWYKLSAgaWYgKHdyb3RlICE9IFNBUk1BRykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKLSAgICB7Ci0gICAgICBpZiAoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCkgIT0gdHJ1ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGVuZ3RoICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGFyX2hkciBoZHI7Ci0KLSAgICAgIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIHN0cmNweSAoaGRyLmFyX25hbWUsIGVuYW1lKTsKLSAgICAgIC8qIFJvdW5kIHNpemUgdXAgdG8gZXZlbiBudW1iZXIgaW4gYXJjaGl2ZSBoZWFkZXIuICAqLwotICAgICAgc3ByaW50ZiAoJihoZHIuYXJfc2l6ZVswXSksICIlLTEwZCIsCi0JICAgICAgIChpbnQpICgoZWxlbmd0aCArIDEpICYgfjEpKTsKLSAgICAgIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLQlpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLQkgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0gICAgICBpZiAoKGJmZF93cml0ZSAoKGNoYXIgKikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLQkgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotCSAgfHwgYmZkX3dyaXRlIChldGFibGUsIDEsIGVsZW5ndGgsIGFyY2gpICE9IGVsZW5ndGgpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKChlbGVuZ3RoICUgMikgPT0gMSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgiXDAxMiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGZvciAoY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY2hhciBidWZmZXJbREVGQVVMVF9CVUZGRVJTSVpFXTsKLSAgICAgIHVuc2lnbmVkIGludCByZW1haW5pbmcgPSBhcmVsdF9zaXplIChjdXJyZW50KTsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKLQotICAgICAgLyogd3JpdGUgYXIgaGVhZGVyICovCi0gICAgICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBoZHIsIDEsIHNpemVvZiAoKmhkciksIGFyY2gpICE9IHNpemVvZiAoKmhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChjdXJyZW50LCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHdoaWxlIChyZW1haW5pbmcpCi0JewotCSAgdW5zaWduZWQgaW50IGFtdCA9IERFRkFVTFRfQlVGRkVSU0laRTsKLQkgIGlmIChhbXQgPiByZW1haW5pbmcpCi0JICAgIGFtdCA9IHJlbWFpbmluZzsKLQkgIGVycm5vID0gMDsKLQkgIGlmIChiZmRfcmVhZCAoYnVmZmVyLCBhbXQsIDEsIGN1cnJlbnQpICE9IGFtdCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgYW10LCAxLCBhcmNoKSAhPSBhbXQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbWFpbmluZyAtPSBhbXQ7Ci0JfQotICAgICAgaWYgKChhcmVsdF9zaXplIChjdXJyZW50KSAlIDIpID09IDEpCi0JewotCSAgaWYgKGJmZF93cml0ZSAoIlwwMTIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIHsKLSAgICAgIC8qIFZlcmlmeSB0aGUgdGltZXN0YW1wIGluIHRoZSBhcmNoaXZlIGZpbGUuICBJZiBpdCB3b3VsZCBub3QgYmUKLQkgYWNjZXB0ZWQgYnkgdGhlIGxpbmtlciwgcmV3cml0ZSBpdCB1bnRpbCBpdCB3b3VsZCBiZS4gIElmCi0JIGFueXRoaW5nIG9kZCBoYXBwZW5zLCBicmVhayBvdXQgYW5kIGp1c3QgcmV0dXJuLiAgKFRoZQotCSBCZXJrZWxleSBsaW5rZXIgY2hlY2tzIHRoZSB0aW1lc3RhbXAgYW5kIHJlZnVzZXMgdG8gcmVhZCB0aGUKLQkgdGFibGUtb2YtY29udGVudHMgaWYgaXQgaXMgPjYwIHNlY29uZHMgbGVzcyB0aGFuIHRoZSBmaWxlJ3MKLQkgbW9kaWZpZWQtdGltZS4gIFRoYXQgcGFpbmZ1bCBoYWNrIHJlcXVpcmVzIHRoaXMgcGFpbmZ1bCBoYWNrLiAgKi8KLSAgICAgIHRyaWVzID0gMTsKLSAgICAgIGRvCi0JewotCSAgaWYgKGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKSkKLQkgICAgYnJlYWs7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIldhcm5pbmc6IHdyaXRpbmcgYXJjaGl2ZSB3YXMgc2xvdzogcmV3cml0aW5nIHRpbWVzdGFtcFxuIikpOwotCX0KLSAgICAgIHdoaWxlICgrK3RyaWVzIDwgNik7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTm90ZSB0aGF0IHRoZSBuYW1pZHggZm9yIHRoZSBmaXJzdCBzeW1ib2wgaXMgMCAqLwotCi1ib29sZWFuCi1fYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotewotICBjaGFyICpmaXJzdF9uYW1lID0gTlVMTDsKLSAgYmZkICpjdXJyZW50OwotICBmaWxlX3B0ciBlbHRfbm8gPSAwOwotICBzdHJ1Y3Qgb3JsICptYXAgPSBOVUxMOwotICBpbnQgb3JsX21heCA9IDEwMjQ7CQkvKiBmaW5lIGluaXRpYWwgZGVmYXVsdCAqLwotICBpbnQgb3JsX2NvdW50ID0gMDsKLSAgaW50IHN0cmlkeCA9IDA7CQkvKiBzdHJpbmcgaW5kZXggKi8KLSAgYXN5bWJvbCAqKnN5bXMgPSBOVUxMOwotICBsb25nIHN5bXNfbWF4ID0gMDsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgLyogRHVubm8gaWYgdGhpcyBpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyBpbmZvLi4uICovCi0gIGlmIChlbGVuZ3RoICE9IDApCi0gICAgZWxlbmd0aCArPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotICBlbGVuZ3RoICs9IGVsZW5ndGggJSAyOwotCi0gIG1hcCA9IChzdHJ1Y3Qgb3JsICopIGJmZF9tYWxsb2MgKG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKTsKLSAgaWYgKG1hcCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIHB1dCB0aGUgc3ltYm9sIG5hbWVzIG9uIHRoZSBhcmNoIG9iamFsbG9jLCBhbmQgdGhlbiBkaXNjYXJkCi0gICAgIHRoZW0gd2hlbiBkb25lLiAgKi8KLSAgZmlyc3RfbmFtZSA9IGJmZF9hbGxvYyAoYXJjaCwgMSk7Ci0gIGlmIChmaXJzdF9uYW1lID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogRHJvcCBhbGwgdGhlIGZpbGVzIGNhbGxlZCBfXy5TWU1ERUYsIHdlJ3JlIGdvaW5nIHRvIG1ha2Ugb3VyCi0gICAgIG93biAqLwotICB3aGlsZSAoYXJjaC0+YXJjaGl2ZV9oZWFkICYmCi0JIHN0cmNtcCAoYXJjaC0+YXJjaGl2ZV9oZWFkLT5maWxlbmFtZSwgIl9fLlNZTURFRiIpID09IDApCi0gICAgYXJjaC0+YXJjaGl2ZV9oZWFkID0gYXJjaC0+YXJjaGl2ZV9oZWFkLT5uZXh0OwotCi0gIC8qIE1hcCBvdmVyIGVhY2ggZWxlbWVudCAqLwotICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gICAgICAgY3VycmVudCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsIGVsdF9ubysrKQotICAgIHsKLSAgICAgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkgPT0gdHJ1ZSkKLQkgICYmICgoYmZkX2dldF9maWxlX2ZsYWdzIChjdXJyZW50KSAmIEhBU19TWU1TKSkpCi0JewotCSAgbG9uZyBzdG9yYWdlOwotCSAgbG9uZyBzeW1jb3VudDsKLQkgIGxvbmcgc3JjX2NvdW50OwotCi0JICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGN1cnJlbnQpOwotCSAgaWYgKHN0b3JhZ2UgPCAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKHN0b3JhZ2UgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzdG9yYWdlID4gc3ltc19tYXgpCi0JCXsKLQkJICBpZiAoc3ltc19tYXggPiAwKQotCQkgICAgZnJlZSAoc3ltcyk7Ci0JCSAgc3ltc19tYXggPSBzdG9yYWdlOwotCQkgIHN5bXMgPSAoYXN5bWJvbCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3ltc19tYXgpOwotCQkgIGlmIChzeW1zID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGN1cnJlbnQsIHN5bXMpOwotCSAgICAgIGlmIChzeW1jb3VudCA8IDApCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogTm93IG1hcCBvdmVyIGFsbCB0aGUgc3ltYm9scywgcGlja2luZyBvdXQgdGhlIG9uZXMgd2Ugd2FudCAqLwotCSAgICAgIGZvciAoc3JjX2NvdW50ID0gMDsgc3JjX2NvdW50IDwgc3ltY291bnQ7IHNyY19jb3VudCsrKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoc3ltc1tzcmNfY291bnRdKS0+ZmxhZ3M7Ci0JCSAgYXNlY3Rpb24gKnNlYyA9IHN5bXNbc3JjX2NvdW50XS0+c2VjdGlvbjsKLQotCQkgIGlmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMIHx8Ci0JCSAgICAgICBmbGFncyAmIEJTRl9XRUFLIHx8Ci0JCSAgICAgICBmbGFncyAmIEJTRl9JTkRJUkVDVCB8fAotCQkgICAgICAgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCQkgICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLQkJICAgIHsKLQkJICAgICAgc2l6ZV90IG5hbWVsZW47Ci0JCSAgICAgIHN0cnVjdCBvcmwgKm5ld19tYXA7Ci0KLQkJICAgICAgLyogVGhpcyBzeW1ib2wgd2lsbCBnbyBpbnRvIHRoZSBhcmNoaXZlIGhlYWRlciAqLwotCQkgICAgICBpZiAob3JsX2NvdW50ID09IG9ybF9tYXgpCi0JCQl7Ci0JCQkgIG9ybF9tYXggKj0gMjsKLQkJCSAgbmV3X21hcCA9Ci0JCQkgICAgKChzdHJ1Y3Qgb3JsICopCi0JCQkgICAgIGJmZF9yZWFsbG9jIChtYXAsIG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKSk7Ci0JCQkgIGlmIChuZXdfbWFwID09IChzdHJ1Y3Qgb3JsICopIE5VTEwpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgbWFwID0gbmV3X21hcDsKLQkJCX0KLQotCQkgICAgICBuYW1lbGVuID0gc3RybGVuIChzeW1zW3NyY19jb3VudF0tPm5hbWUpOwotCQkgICAgICBtYXBbb3JsX2NvdW50XS5uYW1lID0gKChjaGFyICoqKQotCQkJCQkgICAgIGJmZF9hbGxvYyAoYXJjaCwKLQkJCQkJCQlzaXplb2YgKGNoYXIgKikpKTsKLQkJICAgICAgaWYgKG1hcFtvcmxfY291bnRdLm5hbWUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICAqKG1hcFtvcmxfY291bnRdLm5hbWUpID0gYmZkX2FsbG9jIChhcmNoLCBuYW1lbGVuICsgMSk7Ci0JCSAgICAgIGlmICgqKG1hcFtvcmxfY291bnRdLm5hbWUpID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgc3RyY3B5ICgqKG1hcFtvcmxfY291bnRdLm5hbWUpLCBzeW1zW3NyY19jb3VudF0tPm5hbWUpOwotCQkgICAgICAobWFwW29ybF9jb3VudF0pLnBvcyA9IChmaWxlX3B0cikgY3VycmVudDsKLQkJICAgICAgKG1hcFtvcmxfY291bnRdKS5uYW1pZHggPSBzdHJpZHg7Ci0KLQkJICAgICAgc3RyaWR4ICs9IG5hbWVsZW4gKyAxOwotCQkgICAgICArK29ybF9jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIE5vdyBhc2sgdGhlIEJGRCB0byBmcmVlIHVwIGFueSBjYWNoZWQgaW5mb3JtYXRpb24sIHNvIHdlCi0JICAgICBkb24ndCBmaWxsIGFsbCBvZiBtZW1vcnkgd2l0aCBzeW1ib2wgdGFibGVzLiAgKi8KLQkgIGlmICghIGJmZF9mcmVlX2NhY2hlZF9pbmZvIChjdXJyZW50KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBPSywgbm93IHdlIGhhdmUgY29sbGVjdGVkIGFsbCB0aGUgZGF0YSwgbGV0J3Mgd3JpdGUgdGhlbSBvdXQgKi8KLSAgcmV0ID0gQkZEX1NFTkQgKGFyY2gsIHdyaXRlX2FybWFwLAotCQkgIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KSk7Ci0KLSAgaWYgKHN5bXNfbWF4ID4gMCkKLSAgICBmcmVlIChzeW1zKTsKLSAgaWYgKG1hcCAhPSBOVUxMKQotICAgIGZyZWUgKG1hcCk7Ci0gIGlmIChmaXJzdF9uYW1lICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFyY2gsIGZpcnN0X25hbWUpOwotCi0gIHJldHVybiByZXQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzeW1zX21heCA+IDApCi0gICAgZnJlZSAoc3ltcyk7Ci0gIGlmIChtYXAgIT0gTlVMTCkKLSAgICBmcmVlIChtYXApOwotICBpZiAoZmlyc3RfbmFtZSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhcmNoLCBmaXJzdF9uYW1lKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2xlYW4KLWJzZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBpbnQgcGFkaXQgPSBzdHJpZHggJiAxOwotICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IG9ybF9jb3VudCAqIEJTRF9TWU1ERUZfU0laRTsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHggKyBwYWRpdDsKLSAgLyogSW5jbHVkZSA4IGJ5dGVzIHRvIHN0b3JlIHJhbmxpYnNpemUgYW5kIHN0cmluZ3NpemUgaW4gb3V0cHV0LiAqLwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHJhbmxpYnNpemUgKyBzdHJpbmdzaXplICsgODsKLSAgZmlsZV9wdHIgZmlyc3RyZWFsOwotICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIGJmZCAqbGFzdF9lbHQgPSBjdXJyZW50OwkvKiBsYXN0IGVsZW1lbnQgYXJjaCBzZWVuICovCi0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZpcnN0cmVhbCA9IG1hcHNpemUgKyBlbGVuZ3RoICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIFNBUk1BRzsKLQotICBzdGF0IChhcmNoLT5maWxlbmFtZSwgJnN0YXRidWYpOwotICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIHNwcmludGYgKGhkci5hcl9uYW1lLCBSQU5MSUJNQUcpOwotICAvKiBSZW1lbWJlciB0aGUgdGltZXN0YW1wLCB0byBrZWVwIGl0IGhvbHkuICBCdXQgZnVkZ2UgaXQgYSBsaXR0bGUuICAqLwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wID0gc3RhdGJ1Zi5zdF9tdGltZSArIEFSTUFQX1RJTUVfT0ZGU0VUOwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcyA9IChTQVJNQUcKLQkJCQkgICAgICArIG9mZnNldG9mIChzdHJ1Y3QgYXJfaGRyLCBhcl9kYXRlWzBdKSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCk7Ci0gIHNwcmludGYgKGhkci5hcl91aWQsICIlbGQiLCAobG9uZykgZ2V0dWlkICgpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2dpZCwgIiVsZCIsIChsb25nKSBnZXRnaWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0gIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLSAgaWYgKGJmZF93cml0ZSAoKGNoYXIgKikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfaF9wdXRfMzIgKGFyY2gsIChiZmRfdm1hKSByYW5saWJzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgMSwgc2l6ZW9mICh0ZW1wKSwgYXJjaCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgb3JsX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGJ1ZltCU0RfU1lNREVGX1NJWkVdOwotCi0gICAgICBpZiAoKChiZmQgKikgKG1hcFtjb3VudF0pLnBvcykgIT0gbGFzdF9lbHQpCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGZpcnN0cmVhbCArPSBhcmVsdF9zaXplIChjdXJyZW50KSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0JICAgICAgZmlyc3RyZWFsICs9IGZpcnN0cmVhbCAlIDI7Ci0JICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0JICAgIH0KLQkgIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgKG1hcFtjb3VudF0pLnBvcyk7Ci0JfQkJCS8qIGlmIG5ldyBhcmNoaXZlIGVsZW1lbnQgKi8KLQotICAgICAgbGFzdF9lbHQgPSBjdXJyZW50OwotICAgICAgYmZkX2hfcHV0XzMyIChhcmNoLCBtYXBbY291bnRdLm5hbWlkeCwgYnVmKTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYXJjaCwgZmlyc3RyZWFsLCBidWYgKyBCU0RfU1lNREVGX09GRlNFVF9TSVpFKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgQlNEX1NZTURFRl9TSVpFLCAxLCBhcmNoKSAhPSBCU0RfU1lNREVGX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBub3cgd3JpdGUgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcyAqLwotICBiZmRfaF9wdXRfMzIgKGFyY2gsIHN0cmluZ3NpemUsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCAxLCBzaXplb2YgKHRlbXApLCBhcmNoKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgb3JsX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCptYXBbY291bnRdLm5hbWUpICsgMTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKm1hcFtjb3VudF0ubmFtZSwgMSwgbGVuLCBhcmNoKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBzdW4ncyBhciB3ZSB1c2UgYSBudWxsLiAqLwotICBpZiAocGFkaXQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXQgdGhlIGVuZCBvZiBhcmNoaXZlIGZpbGUgaGFuZGxpbmcsIHVwZGF0ZSB0aGUgdGltZXN0YW1wIGluIHRoZQotICAgZmlsZSwgc28gdGhlIGxpbmtlciB3aWxsIGFjY2VwdCBpdC4KLQotICAgUmV0dXJuIHRydWUgaWYgdGhlIHRpbWVzdGFtcCB3YXMgT0ssIG9yIGFuIHVudXN1YWwgcHJvYmxlbSBoYXBwZW5lZC4KLSAgIFJldHVybiBmYWxzZSBpZiB3ZSB1cGRhdGVkIHRoZSB0aW1lc3RhbXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFyY2gpCi0gICAgIGJmZCAqYXJjaDsKLXsKLSAgc3RydWN0IHN0YXQgYXJjaHN0YXQ7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBGbHVzaCB3cml0ZXMsIGdldCBsYXN0LXdyaXRlIHRpbWVzdGFtcCBmcm9tIGZpbGUsIGFuZCBjb21wYXJlIGl0Ci0gICAgIHRvIHRoZSB0aW1lc3RhbXAgSU4gdGhlIGZpbGUuICAqLwotICBiZmRfZmx1c2ggKGFyY2gpOwotICBpZiAoYmZkX3N0YXQgKGFyY2gsICZhcmNoc3RhdCkgPT0gLTEpCi0gICAgewotICAgICAgcGVycm9yIChfKCJSZWFkaW5nIGFyY2hpdmUgZmlsZSBtb2QgdGltZXN0YW1wIikpOwotICAgICAgcmV0dXJuIHRydWU7CQkvKiBDYW4ndCByZWFkIG1vZCB0aW1lIGZvciBzb21lIHJlYXNvbiAqLwotICAgIH0KLSAgaWYgKGFyY2hzdGF0LnN0X210aW1lIDw9IGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXApCi0gICAgcmV0dXJuIHRydWU7CQkvKiBPSyBieSB0aGUgbGlua2VyJ3MgcnVsZXMgKi8KLQotICAvKiBVcGRhdGUgdGhlIHRpbWVzdGFtcC4gICovCi0gIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXAgPSBhcmNoc3RhdC5zdF9tdGltZSArIEFSTUFQX1RJTUVfT0ZGU0VUOwotCi0gIC8qIFByZXBhcmUgYW4gQVNDSUkgdmVyc2lvbiBzdWl0YWJsZSBmb3Igd3JpdGluZy4gICovCi0gIG1lbXNldCAoaGRyLmFyX2RhdGUsIDAsIHNpemVvZiAoaGRyLmFyX2RhdGUpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoaGRyLmFyX2RhdGUpOyBpKyspCi0gICAgaWYgKGhkci5hcl9kYXRlW2ldID09ICdcMCcpCi0gICAgICAoaGRyLmFyX2RhdGUpW2ldID0gJyAnOwotCi0gIC8qIFdyaXRlIGl0IGludG8gdGhlIGZpbGUuICAqLwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcyA9IChTQVJNQUcKLQkJCQkgICAgICArIG9mZnNldG9mIChzdHJ1Y3QgYXJfaGRyLCBhcl9kYXRlWzBdKSk7Ci0gIGlmIChiZmRfc2VlayAoYXJjaCwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX2RhdGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlIChoZHIuYXJfZGF0ZSwgc2l6ZW9mIChoZHIuYXJfZGF0ZSksIDEsIGFyY2gpCi0JICAhPSBzaXplb2YgKGhkci5hcl9kYXRlKSkpCi0gICAgewotICAgICAgLyogRklYTUU6IGJmZCBjYW4ndCBjYWxsIHBlcnJvci4gICovCi0gICAgICBwZXJyb3IgKF8oIldyaXRpbmcgdXBkYXRlZCBhcm1hcCB0aW1lc3RhbXAiKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsJCS8qIFNvbWUgZXJyb3Igd2hpbGUgd3JpdGluZyAqLwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7CQkJLyogV2UgdXBkYXRlZCB0aGUgdGltZXN0YW1wIHN1Y2Nlc3NmdWxseS4gICovCi19Ci0MCi0vKiBBIGNvZmYgYXJtYXAgbG9va3MgbGlrZSA6Ci0gICBsQVJNQUcKLSAgIHN0cnVjdCBhcl9oZHIgd2l0aCBuYW1lID0gJy8nCi0gICBudW1iZXIgb2Ygc3ltYm9scwotICAgb2Zmc2V0IG9mIGZpbGUgZm9yIHN5bWJvbCAwCi0gICBvZmZzZXQgb2YgZmlsZSBmb3Igc3ltYm9sIDEKLQotICAgb2Zmc2V0IG9mIGZpbGUgZm9yIHN5bWJvbCBuLTEKLSAgIHN5bWJvbCBuYW1lIDAKLSAgIHN5bWJvbCBuYW1lIDEKLQotICAgc3ltYm9sIG5hbWUgbi0xCi0qLwotCi1ib29sZWFuCi1jb2ZmX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIHN5bWJvbF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSByYW5saWIgaXMgdGhlIG51bWJlciBvZiBleHBvcnRlZCBzeW1ib2xzIGluIHRoZQotICAgICBhcmNoaXZlICogdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIGludCwgKyBhbiBpbnQgZm9yIHRoZSBjb3VudCAqLwotICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IChzeW1ib2xfY291bnQgKiA0KSArIDQ7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplID0gc3RyaWR4OwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHN0cmluZ3NpemUgKyByYW5saWJzaXplOwotICBmaWxlX3B0ciBhcmNoaXZlX21lbWJlcl9maWxlX3B0cjsKLSAgYmZkICpjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IHBhZGl0ID0gbWFwc2l6ZSAmIDE7Ci0KLSAgaWYgKHBhZGl0KQotICAgIG1hcHNpemUrKzsKLQotICAvKiB3b3JrIG91dCB3aGVyZSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgd2lsbCBnbyBpbiB0aGUgYXJjaGl2ZSAqLwotICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciA9IChtYXBzaXplCi0JCQkgICAgICsgZWxlbmd0aAotCQkJICAgICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikKLQkJCSAgICAgKyBTQVJNQUcpOwotCi0gIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgaGRyLmFyX25hbWVbMF0gPSAnLyc7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBtYXBzaXplKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgdGltZSAoTlVMTCkpOwotICAvKiBUaGlzLCBhdCBsZWFzdCwgaXMgd2hhdCBJbnRlbCBjb2ZmIHNldHMgdGhlIHZhbHVlcyB0by46ICovCi0gIHNwcmludGYgKChoZHIuYXJfdWlkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfZ2lkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfbW9kZSksICIlLTdvIiwgKHVuc2lnbmVkKSAwKTsKLSAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLSAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgLyogV3JpdGUgdGhlIGFyIGhlYWRlciBmb3IgdGhpcyBpdGVtIGFuZCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFyY2gsIHN5bWJvbF9jb3VudCk7Ci0KLSAgLyogVHdvIHBhc3NlcywgZmlyc3Qgd3JpdGUgdGhlIGZpbGUgb2Zmc2V0cyBmb3IgZWFjaCBzeW1ib2wgLQotICAgICByZW1lbWJlcmluZyB0aGF0IGVhY2ggb2Zmc2V0IGlzIG9uIGEgdHdvIGJ5dGUgYm91bmRhcnkuICAqLwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBlYWNoCi0gICAgIHN5bWJvbCwgYW5kIHJlbWVtYmVyIHRvIGtlZXAgdGhlIG9mZnNldHMgcGFkZGVkIG91dC4gICovCi0KLSAgY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgY291bnQgPSAwOwotICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIE5VTEwgJiYgY291bnQgPCBzeW1ib2xfY291bnQpCi0gICAgewotICAgICAgLyogRm9yIGVhY2ggc3ltYm9sIHdoaWNoIGlzIHVzZWQgZGVmaW5lZCBpbiB0aGlzIG9iamVjdCwgd3JpdGUgb3V0Ci0JIHRoZSBvYmplY3QgZmlsZSdzIGFkZHJlc3MgaW4gdGhlIGFyY2hpdmUgKi8KLQotICAgICAgd2hpbGUgKCgoYmZkICopIChtYXBbY291bnRdKS5wb3MpID09IGN1cnJlbnQpCi0JewotCSAgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFyY2gsIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyKTsKLQkgIGNvdW50Kys7Ci0JfQotICAgICAgLyogQWRkIHNpemUgb2YgdGhpcyBhcmNoaXZlIGVudHJ5ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSAoYXJlbHRfc2l6ZSAoY3VycmVudCkKLQkJCQkgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gICAgICAvKiByZW1lbWJlciBhYm9vdXQgdGhlIGV2ZW4gYWxpZ25tZW50ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciAlIDI7Ci0gICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKLSAgICB9Ci0KLSAgLyogbm93IHdyaXRlIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc3ltYm9sX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCptYXBbY291bnRdLm5hbWUpICsgMTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKm1hcFtjb3VudF0ubmFtZSwgMSwgbGVuLCBhcmNoKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBhcmM5NjAgd2UgdXNlIGEgbnVsbC4gKi8KLSAgaWYgKHBhZGl0KQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJjaHVyZXMuYyBiL2JmZC9hcmNodXJlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDYyNTkyLi4wMDAwMDAwCi0tLSBhL2JmZC9hcmNodXJlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTg5ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIGFyY2hpdGVjdHVyZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgSm9obiBHaWxtb3JlIGFuZCBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyoKLQotU0VDVElPTgotCUFyY2hpdGVjdHVyZXMKLQotCUJGRCBrZWVwcyBvbmUgYXRvbSBpbiBhIEJGRCBkZXNjcmliaW5nIHRoZQotCWFyY2hpdGVjdHVyZSBvZiB0aGUgZGF0YSBhdHRhY2hlZCB0byB0aGUgQkZEOiBhIHBvaW50ZXIgdG8gYQotCTw8YmZkX2FyY2hfaW5mb190eXBlPj4uICAKLQotCVBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgY2FuIGJlIHJlcXVlc3RlZCBpbmRlcGVuZGVudGx5IG9mIGEgQkZECi0Jc28gdGhhdCBhbiBhcmNoaXRlY3R1cmUncyBpbmZvcm1hdGlvbiBjYW4gYmUgaW50ZXJyb2dhdGVkCi0Jd2l0aG91dCBhY2Nlc3MgdG8gYW4gb3BlbiBCRkQuCi0KLQlUaGUgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGJ5IGVhY2ggYXJjaGl0ZWN0dXJlIHBhY2thZ2UuCi0JVGhlIHNldCBvZiBkZWZhdWx0IGFyY2hpdGVjdHVyZXMgaXMgc2VsZWN0ZWQgYnkgdGhlIG1hY3JvCi0JPDxTRUxFQ1RfQVJDSElURUNUVVJFUz4+LiAgVGhpcyBpcyBub3JtYWxseSBzZXQgdXAgaW4gdGhlCi0JQGZpbGV7Y29uZmlnL0B2YXJ7dGFyZ2V0fS5tdH0gZmlsZSBvZiB5b3VyIGNob2ljZS4gIElmIHRoZSBuYW1lIGlzIG5vdAotCWRlZmluZWQsIHRoZW4gYWxsIHRoZSBhcmNoaXRlY3R1cmVzIHN1cHBvcnRlZCBhcmUgaW5jbHVkZWQuIAotCi0JV2hlbiBCRkQgc3RhcnRzIHVwLCBhbGwgdGhlIGFyY2hpdGVjdHVyZXMgYXJlIGNhbGxlZCB3aXRoIGFuCi0JaW5pdGlhbGl6ZSBtZXRob2QuICBJdCBpcyB1cCB0byB0aGUgYXJjaGl0ZWN0dXJlIGJhY2sgZW5kIHRvCi0JaW5zZXJ0IGFzIG1hbnkgaXRlbXMgaW50byB0aGUgbGlzdCBvZiBhcmNoaXRlY3R1cmVzIGFzIGl0IHdhbnRzIHRvOwotCWdlbmVyYWxseSB0aGlzIHdvdWxkIGJlIG9uZSBmb3IgZWFjaCBtYWNoaW5lIGFuZCBvbmUgZm9yIHRoZQotCWRlZmF1bHQgY2FzZSAoYW4gaXRlbSB3aXRoIGEgbWFjaGluZSBmaWVsZCBvZiAwKS4gCi0KLQlCRkQncyBpZGVhIG9mIGFuIGFyY2hpdGVjdHVyZSBpcyBpbXBsZW1lbnRlZCBpbglAZmlsZXthcmNodXJlcy5jfS4KLSovCi0KLS8qCi0KLVNVQlNFQ1RJT04KLQliZmRfYXJjaGl0ZWN0dXJlCi0KLURFU0NSSVBUSU9OCi0JVGhpcyBlbnVtIGdpdmVzIHRoZSBvYmplY3QgZmlsZSdzIENQVSBhcmNoaXRlY3R1cmUsIGluIGEKLQlnbG9iYWwgc2Vuc2UtLS1pLmUuLCB3aGF0IHByb2Nlc3NvciBmYW1pbHkgZG9lcyBpdCBiZWxvbmcgdG8/Ci0JQW5vdGhlciBmaWVsZCBpbmRpY2F0ZXMgd2hpY2ggcHJvY2Vzc29yIHdpdGhpbgotCXRoZSBmYW1pbHkgaXMgaW4gdXNlLiAgVGhlIG1hY2hpbmUgZ2l2ZXMgYSBudW1iZXIgd2hpY2gKLQlkaXN0aW5ndWlzaGVzIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgYXJjaGl0ZWN0dXJlLAotCWNvbnRhaW5pbmcsIGZvciBleGFtcGxlLCAyIGFuZCAzIGZvciBJbnRlbCBpOTYwIEtBIGFuZCBpOTYwIEtCLAotCWFuZCA2ODAyMCBhbmQgNjgwMzAgZm9yIE1vdG9yb2xhIDY4MDIwIGFuZCA2ODAzMC4gCi0KLS5lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi0uewotLiAgYmZkX2FyY2hfdW5rbm93biwgICB7KiBGaWxlIGFyY2ggbm90IGtub3duICp9Ci0uICBiZmRfYXJjaF9vYnNjdXJlLCAgIHsqIEFyY2gga25vd24sIG5vdCBvbmUgb2YgdGhlc2UgKn0KLS4gIGJmZF9hcmNoX202OGssICAgICAgeyogTW90b3JvbGEgNjh4eHggKn0KLS4jZGVmaW5lIGJmZF9tYWNoX202ODAwMCAxCi0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMDggMgotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDEwIDMKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAyMCA0Ci0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMzAgNQotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDQwIDYKLS4jZGVmaW5lIGJmZF9tYWNoX202ODA2MCA3Ci0uI2RlZmluZSBiZmRfbWFjaF9jcHUzMiAgOAotLiAgYmZkX2FyY2hfdmF4LCAgICAgICB7KiBERUMgVmF4ICp9ICAgCi0uICBiZmRfYXJjaF9pOTYwLCAgICAgIHsqIEludGVsIDk2MCAqfQotLiAgICB7KiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCi0uICAgICAgIGxvd2VyIG51bWJlciBpbmRpY2F0ZXMgYSBtYWNoaW5lIHR5cGUgdGhhdCAKLS4gICAgICAgb25seSBhY2NlcHRzIGEgc3Vic2V0IG9mIHRoZSBpbnN0cnVjdGlvbnMKLS4gICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCi0uICAgICAgIFRoZSBleGNlcHRpb24gaXMgdGhlICJjYSIsIHdoaWNoIGlzCi0uICAgICAgIGluY29tcGF0aWJsZSB3aXRoIGFsbCBvdGhlciBtYWNoaW5lcyBleGNlcHQgCi0uICAgICAgICJjb3JlIi4gKn0KLS4KLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfY29yZSAgICAgIDEKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Jfc2IgICAgIDMKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfbWMgICAgICAgIDQKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfY2EgICAgICAgIDYKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfangJIDcKLS4jZGVmaW5lIGJmZF9tYWNoX2k5NjBfaHggICAgICAgIDgKLS4KLS4gIGJmZF9hcmNoX2EyOWssICAgICAgeyogQU1EIDI5MDAwICp9Ci0uICBiZmRfYXJjaF9zcGFyYywgICAgIHsqIFNQQVJDICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyYwkJCTEKLS57KiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHY4cGx1cyBhbmQgdjkgaXMgdGhhdCB2OSBpcyBhIHRydWUgNjQgYml0IGVudi4gICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldAkyCi0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUJMwotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjhwbHVzCQk0Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OHBsdXNhCQk1IHsqIHdpdGggdWx0cmFzcGFyYyBhZGQnbnMgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQk2Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OQkJNwotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlhCQk4IHsqIHdpdGggdWx0cmFzcGFyYyBhZGQnbnMgKn0KLS57KiBOb256ZXJvIGlmIE1BQ0ggaGFzIHRoZSB2OSBpbnN0cnVjdGlvbiBzZXQuICAqfQotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlfcChtYWNoKSBcCi0uICAoKG1hY2gpID49IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyAmJiAobWFjaCkgPD0gYmZkX21hY2hfc3BhcmNfdjlhKQotLiAgYmZkX2FyY2hfbWlwcywgICAgICB7KiBNSVBTIFJ4eHh4ICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9taXBzMzAwMAkJMzAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczM5MDAJCTM5MDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MDAwCQk0MDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDAxMAkJNDAxMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQxMDAJCTQxMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MTExCQk0MTExCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDMwMAkJNDMwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQ0MDAJCTQ0MDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0NjAwCQk0NjAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDY1MAkJNDY1MAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczUwMDAJCTUwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM2MDAwCQk2MDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzODAwMAkJODAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczEwMDAwCQkxMDAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczE2CQkxNgotLiAgYmZkX2FyY2hfaTM4NiwgICAgICB7KiBJbnRlbCAzODYgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4NiAwCi0uI2RlZmluZSBiZmRfbWFjaF9pMzg2X2k4MDg2IDEKLS4jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXggMgotLiAgYmZkX2FyY2hfd2UzMmssICAgICB7KiBBVCZUIFdFMzJ4eHggKn0KLS4gIGJmZF9hcmNoX3RhaG9lLCAgICAgeyogQ0NJL0hhcnJpcyBUYWhvZSAqfQotLiAgYmZkX2FyY2hfaTg2MCwgICAgICB7KiBJbnRlbCA4NjAgKn0KLS4gIGJmZF9hcmNoX2kzNzAsICAgICAgeyogSUJNIDM2MC8zNzAgTWFpbmZyYW1lcyAqfQotLiAgYmZkX2FyY2hfcm9tcCwgICAgICB7KiBJQk0gUk9NUCBQQy9SVCAqfQotLiAgYmZkX2FyY2hfYWxsaWFudCwgICB7KiBBbGxpYW50ICp9Ci0uICBiZmRfYXJjaF9jb252ZXgsICAgIHsqIENvbnZleCAqfQotLiAgYmZkX2FyY2hfbTg4aywgICAgICB7KiBNb3Rvcm9sYSA4OHh4eCAqfQotLiAgYmZkX2FyY2hfcHlyYW1pZCwgICB7KiBQeXJhbWlkIFRlY2hub2xvZ3kgKn0KLS4gIGJmZF9hcmNoX2g4MzAwLCAgICAgeyogSGl0YWNoaSBIOC8zMDAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2g4MzAwICAgMQotLiNkZWZpbmUgYmZkX21hY2hfaDgzMDBoICAyCi0uI2RlZmluZSBiZmRfbWFjaF9oODMwMHMgIDMKLS4gIGJmZF9hcmNoX3Bvd2VycGMsICAgeyogUG93ZXJQQyAqfQotLiAgYmZkX2FyY2hfcnM2MDAwLCAgICB7KiBJQk0gUlMvNjAwMCAqfQotLiAgYmZkX2FyY2hfaHBwYSwgICAgICB7KiBIUCBQQSBSSVNDICp9Ci0uICBiZmRfYXJjaF9kMTB2LCAgICAgIHsqIE1pdHN1YmlzaGkgRDEwViAqfQotLiNkZWZpbmUgYmZkX21hY2hfZDEwdgkJMAotLiNkZWZpbmUgYmZkX21hY2hfZDEwdl90czIJMgotLiNkZWZpbmUgYmZkX21hY2hfZDEwdl90czMJMwotLiAgYmZkX2FyY2hfZDMwdiwgICAgICB7KiBNaXRzdWJpc2hpIEQzMFYgKn0KLS4gIGJmZF9hcmNoX3o4aywgICAgICAgeyogWmlsb2cgWjgwMDAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3o4MDAxCQkxCi0uI2RlZmluZSBiZmRfbWFjaF96ODAwMgkJMgotLiAgYmZkX2FyY2hfaDg1MDAsICAgICB7KiBIaXRhY2hpIEg4LzUwMCAqfQotLiAgYmZkX2FyY2hfc2gsICAgICAgICB7KiBIaXRhY2hpIFNIICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zaCAgICAgICAgICAgIDAKLS4jZGVmaW5lIGJmZF9tYWNoX3NoMiAgICAgICAgMHgyMAotLiNkZWZpbmUgYmZkX21hY2hfc2hfZHNwICAgICAweDJkCi0uI2RlZmluZSBiZmRfbWFjaF9zaDMgICAgICAgIDB4MzAKLS4jZGVmaW5lIGJmZF9tYWNoX3NoM19kc3AgICAgMHgzZAotLiNkZWZpbmUgYmZkX21hY2hfc2gzZSAgICAgICAweDNlCi0uI2RlZmluZSBiZmRfbWFjaF9zaDQgICAgICAgIDB4NDAKLS4gIGJmZF9hcmNoX2FscGhhLCAgICAgeyogRGVjIEFscGhhICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjQgIDB4MTAKLS4jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAotLiNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY2ICAweDMwCi0uICBiZmRfYXJjaF9hcm0sICAgICAgIHsqIEFkdmFuY2VkIFJpc2MgTWFjaGluZXMgQVJNICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fMgkJMQotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzJhCTIKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8zCQkzCi0uI2RlZmluZSBiZmRfbWFjaF9hcm1fM00gCTQKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV80IAk1Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgCTYKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV81IAk3Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fNVQJOAotLiAgYmZkX2FyY2hfbnMzMmssICAgICB7KiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICp9Ci0uICBiZmRfYXJjaF93NjUsICAgICAgIHsqIFdEQyA2NTgxNiAqfQotLiAgYmZkX2FyY2hfdGljMzAsICAgICB7KiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKn0KLS4gIGJmZF9hcmNoX3RpYzgwLCAgICAgeyogVEkgVE1TMzIwYzgwIChNVlApICp9Ci0uICBiZmRfYXJjaF92ODUwLCAgICAgIHsqIE5FQyBWODUwICp9Ci0uI2RlZmluZSBiZmRfbWFjaF92ODUwICAgICAgICAgIDAKLS4jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlIAknRScKLS4jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlYQknQScKLS4gIGJmZF9hcmNoX2FyYywgICAgICAgeyogQXJnb25hdXQgUklTQyBDb3JlICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9hcmNfYmFzZSAwCi0uICBiZmRfYXJjaF9tMzJyLCAgICAgIHsqIE1pdHN1YmlzaGkgTTMyUi9EICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tMzJyCQkwIHsqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tMzJyeAkJJ3gnCi0uICBiZmRfYXJjaF9tbjEwMjAwLCAgIHsqIE1hdHN1c2hpdGEgTU4xMDIwMCAqfQotLiAgYmZkX2FyY2hfbW4xMDMwMCwgICB7KiBNYXRzdXNoaXRhIE1OMTAzMDAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX21uMTAzMDAJCTMwMAotLiNkZWZpbmUgYmZkX21hY2hfYW0zMwkJMzMwCi0uICBiZmRfYXJjaF9mcjMwLAotLiNkZWZpbmUgYmZkX21hY2hfZnIzMAkJMHg0NjUyMzMzMAotLiAgYmZkX2FyY2hfbWNvcmUsCi0uICBiZmRfYXJjaF9waiwKLS4gIGJmZF9hcmNoX2F2ciwgICAgICAgeyogQXRtZWwgQVZSIG1pY3JvY29udHJvbGxlcnMgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2F2cjEJCTEKLS4jZGVmaW5lIGJmZF9tYWNoX2F2cjIJCTIKLS4jZGVmaW5lIGJmZF9tYWNoX2F2cjMJCTMKLS4jZGVmaW5lIGJmZF9tYWNoX2F2cjQJCTQKLS4gIGJmZF9hcmNoX2xhc3QKLS4gIH07Ci0KLQotKi8KLQotLyoKLQotU1VCU0VDVElPTgotCWJmZF9hcmNoX2luZm8KLQotREVTQ1JJUFRJT04KLQlUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBhcmNoaXRlY3R1cmVzIGZvciB1c2UKLQl3aXRoaW4gQkZELgotCi0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLS57Ci0uICBpbnQgYml0c19wZXJfd29yZDsKLS4gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotLiAgaW50IGJpdHNfcGVyX2J5dGU7Ci0uICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLS4gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLS4gIGNvbnN0IGNoYXIgKmFyY2hfbmFtZTsKLS4gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lOwotLiAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0uIHsqIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICp9Ci0uICBib29sZWFuIHRoZV9kZWZhdWx0OwkKLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogKCpjb21wYXRpYmxlKQotLglQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLS4JICAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmIpKTsKLS4KLS4gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLS4KLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpuZXh0OwotLn0gYmZkX2FyY2hfaW5mb190eXBlOwotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYTI5a19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYWxwaGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJtX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDg1MDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzNzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k4NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX20zMnJfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX202OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX204OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21pcHNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAyMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfcGpfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NoX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zcGFyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljMzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzgwX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92YXhfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3dlMzJrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF96OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX25zMzJrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF93NjVfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Y4NTBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2ZyMzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21jb3JlX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hdnJfYXJjaDsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0IGJmZF9hcmNodXJlc19saXN0W10gPQotewotI2lmZGVmIFNFTEVDVF9BUkNISVRFQ1RVUkVTCi0gIFNFTEVDVF9BUkNISVRFQ1RVUkVTLAotI2Vsc2UKLSAgJmJmZF9hMjlrX2FyY2gsCi0gICZiZmRfYWxwaGFfYXJjaCwKLSAgJmJmZF9hcmNfYXJjaCwKLSAgJmJmZF9hcm1fYXJjaCwKLSAgJmJmZF9kMTB2X2FyY2gsCi0gICZiZmRfZDMwdl9hcmNoLAotICAmYmZkX2g4MzAwX2FyY2gsCi0gICZiZmRfaDg1MDBfYXJjaCwKLSAgJmJmZF9ocHBhX2FyY2gsCi0gICZiZmRfaTM3MF9hcmNoLAotICAmYmZkX2kzODZfYXJjaCwKLSAgJmJmZF9pODYwX2FyY2gsCi0gICZiZmRfaTk2MF9hcmNoLAotICAmYmZkX20zMnJfYXJjaCwKLSAgJmJmZF9tNjhrX2FyY2gsCi0gICZiZmRfbTg4a19hcmNoLAotICAmYmZkX21pcHNfYXJjaCwKLSAgJmJmZF9tbjEwMjAwX2FyY2gsCi0gICZiZmRfbW4xMDMwMF9hcmNoLAotICAmYmZkX3Bvd2VycGNfYXJjaCwKLSAgJmJmZF9yczYwMDBfYXJjaCwKLSAgJmJmZF9zaF9hcmNoLAotICAmYmZkX3NwYXJjX2FyY2gsCi0gICZiZmRfdGljMzBfYXJjaCwKLSAgJmJmZF90aWM4MF9hcmNoLAotICAmYmZkX3ZheF9hcmNoLAotICAmYmZkX3dlMzJrX2FyY2gsCi0gICZiZmRfejhrX2FyY2gsCi0gICZiZmRfbnMzMmtfYXJjaCwKLSAgJmJmZF93NjVfYXJjaCwKLSAgJmJmZF92ODUwX2FyY2gsCi0gICZiZmRfZnIzMF9hcmNoLAotICAmYmZkX21jb3JlX2FyY2gsCi0gICZiZmRfYXZyX2FyY2gsCi0jZW5kaWYKLSAgMAotfTsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX3ByaW50YWJsZV9uYW1lCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX3ByaW50YWJsZV9uYW1lKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcHJpbnRhYmxlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotCWZyb20gdGhlIHBvaW50ZXIgdG8gdGhlIGFyY2hpdGVjdHVyZSBpbmZvIHN0cnVjdHVyZS4KLQotKi8KLQotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX25hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+cHJpbnRhYmxlX25hbWU7Ci19Ci0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2Nhbl9hcmNoCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfc2Nhbl9hcmNoKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0KLURFU0NSSVBUSU9OCi0JRmlndXJlIG91dCBpZiBCRkQgc3VwcG9ydHMgYW55IGNwdSB3aGljaCBjb3VsZCBiZSBkZXNjcmliZWQgd2l0aAotCXRoZSBuYW1lIEB2YXJ7c3RyaW5nfS4gIFJldHVybiBhIHBvaW50ZXIgdG8gYW4gPDxhcmNoX2luZm8+PgotCXN0cnVjdHVyZSBpZiBhIG1hY2hpbmUgaXMgZm91bmQsIG90aGVyd2lzZSBOVUxMLgotCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX3NjYW5fYXJjaCAoc3RyaW5nKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHAsICphcDsKLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBpbnN0YWxsZWQgYXJjaGl0ZWN0dXJlcyAqLwotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIGlmIChhcC0+c2NhbiAoYXAsIHN0cmluZykpCi0JICAgIHJldHVybiBhcDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2FyY2hfbGlzdAotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKipiZmRfYXJjaF9saXN0KHZvaWQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIGZyZXNobHkgbWFsbG9jZWQgTlVMTC10ZXJtaW5hdGVkIHZlY3RvciBvZiB0aGUgbmFtZXMKLQlvZiBhbGwgdGhlIHZhbGlkIEJGRCBhcmNoaXRlY3R1cmVzLiAgRG8gbm90IG1vZGlmeSB0aGUgbmFtZXMuCi0KLSovCi0KLWNvbnN0IGNoYXIgKioKLWJmZF9hcmNoX2xpc3QgKCkKLXsKLSAgaW50IHZlY19sZW5ndGggPSAwOwotICBjb25zdCBjaGFyICoqbmFtZV9wdHI7Ci0gIGNvbnN0IGNoYXIgKipuYW1lX2xpc3Q7Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHA7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYXJjaGl0ZWN0dXJlcyAqLwotICB2ZWNfbGVuZ3RoID0gMDsKLSAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFwOwotICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCi0JewotCSAgdmVjX2xlbmd0aCsrOwotCX0KLSAgICB9Ci0KLSAgbmFtZV9saXN0ID0gKENPTlNUIGNoYXIgKiopCi0gICAgYmZkX21hbGxvYyAoKHZlY19sZW5ndGggKyAxKSAqIHNpemVvZiAoY2hhciAqKikpOwotICBpZiAobmFtZV9saXN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogUG9pbnQgdGhlIGxpc3QgYXQgZWFjaCBvZiB0aGUgbmFtZXMgKi8KLSAgbmFtZV9wdHIgPSBuYW1lX2xpc3Q7Ci0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcDsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgICpuYW1lX3B0ciA9IGFwLT5wcmludGFibGVfbmFtZTsKLQkgIG5hbWVfcHRyKys7Ci0JfQotICAgIH0KLSAgKm5hbWVfcHRyID0gTlVMTDsKLQotICByZXR1cm4gbmFtZV9saXN0OwotfQotCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9hcmNoX2dldF9jb21wYXRpYmxlKAotCQljb25zdCBiZmQgKmFiZmQsCi0JICAgICAgICBjb25zdCBiZmQgKmJiZmQpOwotCi1ERVNDUklQVElPTgotCURldGVybWluZSB3aGV0aGVyIHR3byBCRkRzJwotCWFyY2hpdGVjdHVyZXMgYW5kIG1hY2hpbmUgdHlwZXMgYXJlIGNvbXBhdGlibGUuICBDYWxjdWxhdGVzCi0JdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IgYmV0d2VlbiB0aGUgdHdvIGFyY2hpdGVjdHVyZXMKLQlhbmQgbWFjaGluZSB0eXBlcyBpbXBsaWVkIGJ5IHRoZSBCRkRzIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0bwotCWFuIDw8YXJjaF9pbmZvPj4gc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNvbXBhdGlibGUgbWFjaGluZS4KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfYXJjaF9nZXRfY29tcGF0aWJsZSAoYWJmZCwgYmJmZCkKLSAgICAgY29uc3QgYmZkICphYmZkOwotICAgICBjb25zdCBiZmQgKmJiZmQ7Ci17Ci0gIC8qIElmIGVpdGhlciBhcmNoaXRlY3R1cmUgaXMgdW5rbm93biwgdGhlbiBhbGwgd2UgY2FuIGRvIGlzIGFzc3VtZQotICAgICB0aGUgdXNlciBrbm93cyB3aGF0IGhlJ3MgZG9pbmcuICAqLwotICBpZiAoYWJmZC0+YXJjaF9pbmZvLT5hcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gIAlyZXR1cm4gYmJmZC0+YXJjaF9pbmZvOwotICBpZiAoYmJmZC0+YXJjaF9pbmZvLT5hcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gIAlyZXR1cm4gYWJmZC0+YXJjaF9pbmZvOwotCi0gIC8qIE90aGVyd2lzZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSBoYXMgdG8gZGVjaWRlLiAgKi8KLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+Y29tcGF0aWJsZSAoYWJmZC0+YXJjaF9pbmZvLCBiYmZkLT5hcmNoX2luZm8pOwotfQotCi0KLS8qCi1JTlRFUk5BTF9ERUZJTklUSU9OCi0JYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QKLQotREVTQ1JJUFRJT04KLQlUaGUgPDxiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdD4+IGlzIGFuIGl0ZW0gb2YKLQk8PGJmZF9hcmNoX2luZm9fdHlwZT4+IHdoaWNoIGhhcyBiZWVuIGluaXRpYWxpemVkIHRvIGEgZmFpcmx5Ci0JZ2VuZXJpYyBzdGF0ZS4gIEEgQkZEIHN0YXJ0cyBsaWZlIGJ5IHBvaW50aW5nIHRvIHRoaXMKLQlzdHJ1Y3R1cmUsIHVudGlsIHRoZSBjb3JyZWN0IGJhY2sgZW5kIGhhcyBkZXRlcm1pbmVkIHRoZSByZWFsCi0JYXJjaGl0ZWN0dXJlIG9mIHRoZSBmaWxlLgotCi0uZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLQotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0ID0KLXsKLSAgICAzMiwzMiw4LGJmZF9hcmNoX3Vua25vd24sMCwidW5rbm93biIsInVua25vd24iLDIsdHJ1ZSwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sIAotICAgIDAsCi19OwotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2FyY2hfaW5mbwotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9hcmNoX2luZm8oYmZkICphYmZkLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyZyk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBvZiBAdmFye2FiZmR9IHRvIEB2YXJ7YXJnfS4KLSovCi0KLXZvaWQKLWJmZF9zZXRfYXJjaF9pbmZvIChhYmZkLCBhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmc7Ci17Ci0gIGFiZmQtPmFyY2hfaW5mbyA9IGFyZzsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChiZmQgKmFiZmQsCi0JCWVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQl1bnNpZ25lZCBsb25nIG1hY2gpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgaW4gQkZEIEB2YXJ7YWJmZH0KLQl0byBAdmFye2FyY2h9IGFuZCBAdmFye21hY2h9LiAgRmluZCB0aGUgY29ycmVjdAotCXBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgYW5kIGluc2VydCBpdCBpbnRvIHRoZSA8PGFyY2hfaW5mbz4+Ci0JcG9pbnRlci4gCi0qLwotCi1ib29sZWFuCi1iZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHAsICphcDsKLQotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIGlmIChhcC0+YXJjaCA9PSBhcmNoCi0JICAgICAgJiYgKGFwLT5tYWNoID09IG1hY2gKLQkJICB8fCAobWFjaCA9PSAwICYmIGFwLT50aGVfZGVmYXVsdCkpKQotCSAgICB7Ci0JICAgICAgYWJmZC0+YXJjaF9pbmZvID0gYXA7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGFiZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2FyY2gKLQotU1lOT1BTSVMKLQllbnVtIGJmZF9hcmNoaXRlY3R1cmUgYmZkX2dldF9hcmNoKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBlbnVtZXJhdGVkIHR5cGUgd2hpY2ggZGVzY3JpYmVzIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JYXJjaGl0ZWN0dXJlLgotCi0qLwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUKLWJmZF9nZXRfYXJjaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAgIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmFyY2g7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfbWFjaAotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGxvbmcgYmZkX2dldF9tYWNoKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBsb25nIHR5cGUgd2hpY2ggZGVzY3JpYmVzIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JbWFjaGluZS4KLSovCi0KLXVuc2lnbmVkIGxvbmcgIAotYmZkX2dldF9tYWNoIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gICAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+bWFjaDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2FyY2hfYml0c19wZXJfYnl0ZQotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBvbmUgb2YgdGhlIEJGRCBAdmFye2FiZmR9J3MKLQlhcmNoaXRlY3R1cmUncyBieXRlcy4KLQotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmJpdHNfcGVyX2J5dGU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBpbnQgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyhiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gb25lIG9mIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JYXJjaGl0ZWN0dXJlJ3MgYWRkcmVzc2VzLgotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmJpdHNfcGVyX2FkZHJlc3M7Ci19Ci0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OIAotCWJmZF9kZWZhdWx0X2NvbXBhdGlibGUKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9kZWZhdWx0X2NvbXBhdGlibGUKLQkoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphLAotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYik7Ci0KLURFU0NSSVBUSU9OCi0JVGhlIGRlZmF1bHQgZnVuY3Rpb24gZm9yIHRlc3RpbmcgZm9yIGNvbXBhdGliaWxpdHkuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2RlZmF1bHRfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYS0+bWFjaCA+IGItPm1hY2gpCi0gICAgcmV0dXJuIGE7Ci0KLSAgaWYgKGItPm1hY2ggPiBhLT5tYWNoKQotICAgIHJldHVybiBiOwotCi0gIHJldHVybiBhOwotfQotCi0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9kZWZhdWx0X3NjYW4KLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9kZWZhdWx0X3NjYW4oY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0KLURFU0NSSVBUSU9OCi0JVGhlIGRlZmF1bHQgZnVuY3Rpb24gZm9yIHdvcmtpbmcgb3V0IHdoZXRoZXIgdGhpcyBpcyBhbgotCWFyY2hpdGVjdHVyZSBoaXQgYW5kIGEgbWFjaGluZSBoaXQuCi0qLwotCi1ib29sZWFuIAotYmZkX2RlZmF1bHRfc2NhbiAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBjaGFyICpwdHJfc3JjOwotICBjb25zdCBjaGFyICpwdHJfdHN0OwotICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lX2NvbG9uOwotCi0gIC8qIEV4YWN0IG1hdGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgbmFtZSAoQVJDSF9OQU1FKSBhbmQgYWxzbyB0aGUKLSAgICAgZGVmYXVsdCBhcmNoaXRlY3R1cmU/ICovCi0gIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPmFyY2hfbmFtZSkgPT0gMAotICAgICAgJiYgaW5mby0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRXhhY3QgbWF0Y2ggb2YgdGhlIG1hY2hpbmUgbmFtZSAoUFJJTlRBQkxFX05BTUUpPyAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgICAgCi0gIC8qIEdpdmVuIHRoYXQgcHJpbnRhYmxlX25hbWUgY29udGFpbnMgbm8gY29sb24sIGF0dGVtcHQgdG8gbWF0Y2g6Ci0gICAgIEFSQ0hfTkFNRSBbICI6IiBdIFBSSU5UQUJMRV9OQU1FPyAqLwotICBwcmludGFibGVfbmFtZV9jb2xvbiA9IHN0cmNociAoaW5mby0+cHJpbnRhYmxlX25hbWUsICc6Jyk7Ci0gIGlmIChwcmludGFibGVfbmFtZV9jb2xvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGludCBzdHJsZW5fYXJjaF9uYW1lID0gc3RybGVuIChpbmZvLT5hcmNoX25hbWUpOwotICAgICAgaWYgKHN0cm5jYXNlY21wIChzdHJpbmcsIGluZm8tPmFyY2hfbmFtZSwgc3RybGVuX2FyY2hfbmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoc3RyaW5nW3N0cmxlbl9hcmNoX25hbWVdID09ICc6JykKLQkgICAgewotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdHJpbmcgKyBzdHJsZW5fYXJjaF9uYW1lICsgMSwKLQkJCSAgICAgIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZyArIHN0cmxlbl9hcmNoX25hbWUsCi0JCQkgICAgICBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLQkJcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEdpdmVuIHRoYXQgUFJJTlRBQkxFX05BTUUgaGFzIHRoZSBmb3JtOiA8YXJjaD4gIjoiIDxtYWNoPjsKLSAgICAgQXR0ZW1wdCB0byBtYXRjaDogPGFyY2g+IDxtYWNoPj8gKi8KLSAgaWYgKHByaW50YWJsZV9uYW1lX2NvbG9uICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGNvbG9uX2luZGV4ID0gcHJpbnRhYmxlX25hbWVfY29sb24gLSBpbmZvLT5wcmludGFibGVfbmFtZTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSwgY29sb25faW5kZXgpID09IDAKLQkgICYmIHN0cmNhc2VjbXAgKHN0cmluZyArIGNvbG9uX2luZGV4LAotCQkJIGluZm8tPnByaW50YWJsZV9uYW1lICsgY29sb25faW5kZXggKyAxKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBHaXZlbiB0aGF0IFBSSU5UQUJMRV9OQU1FIGhhcyB0aGUgZm9ybTogPGFyY2g+ICI6IiA8bWFjaD47IERvIG5vdAotICAgICBhdHRlbXB0IHRvIG1hdGNoIGp1c3QgPG1hY2g+LCBpdCBjb3VsZCBiZSBhbWJpZ2lvdXMuICBUaGlzIHRlc3QKLSAgICAgaXMgbGVmdCB1bnRpbCBsYXRlci4gKi8KLQotICAvKiBOT1RFOiBUaGUgYmVsb3cgaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgb25seS4gUGxlYXNlIGRvIG5vdAotICAgICBhZGQgdG8gdGhpcyBjb2RlICovCi0KLSAgLyogU2VlIGhvdyBtdWNoIG9mIHRoZSBzdXBwbGllZCBzdHJpbmcgbWF0Y2hlcyB3aXRoIHRoZQotICAgICBhcmNoaXRlY3R1cmUsIGVnIHRoZSBzdHJpbmcgbTY4azo2ODAyMCB3b3VsZCBtYXRjaCB0aGUgNjhrIGVudHJ5Ci0gICAgIHVwIHRvIHRoZSA6LCB0aGVuIHdlIGdldCBsZWZ0IHdpdGggdGhlIG1hY2hpbmUgbnVtYmVyICovCi0KLSAgZm9yIChwdHJfc3JjID0gc3RyaW5nLCBwdHJfdHN0ID0gaW5mby0+YXJjaF9uYW1lOyAKLSAgICAgICAqcHRyX3NyYyAmJiAqcHRyX3RzdDsKLSAgICAgICBwdHJfc3JjKyssIHB0cl90c3QrKykgCi0gICAgewotICAgICAgaWYgKCpwdHJfc3JjICE9ICpwdHJfdHN0KSBicmVhazsKLSAgICB9Ci0KLSAgLyogQ2hld2VkIHVwIGFzIG11Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBhcyB3aWxsIG1hdGNoLCBza2lwIGFueQotICAgICBjb2xvbnMgKi8KLSAgaWYgKCpwdHJfc3JjID09ICc6JykKLSAgICBwdHJfc3JjKys7Ci0gIAotICBpZiAoKnB0cl9zcmMgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBub3RoaW5nIG1vcmUsIHRoZW4gb25seSBrZWVwIHRoaXMgb25lIGlmIGl0IGlzIHRoZSBkZWZhdWx0Ci0JIG1hY2hpbmUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCi0gICAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gICAgfQotCi0gIG51bWJlciA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnB0cl9zcmMpKQotICAgIHsKLSAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgKnB0cl9zcmMgIC0gJzAnOwotICAgICAgcHRyX3NyYysrOwotICAgIH0KLQotICAvKiBOT1RFOiBUaGUgYmVsb3cgaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgb25seS4KLSAgICAgUExFQVNFIERPIE5PVCBBREQgVE8gVEhJUyBDT0RFLiAqLwotCi0gIHN3aXRjaCAobnVtYmVyKSAKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhlc2UgYXJlIG5lZWRlZCB0byBwYXJzZSBJRUVFIG9iamVjdHMuICAqLwotICAgIGNhc2UgNjgwMDA6IAotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDEwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDIwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDMwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDQwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwNDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDYwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwNjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MzMyOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9jcHUzMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMjAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF93ZTMyazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9taXBzMzAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0MDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9taXBzNDAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA2MDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA3NDEwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NoOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfc2hfZHNwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDc3MDg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc2g7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9zaDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNzcyOToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zaDsKLSAgICAgIG51bWJlciA9IGJmZF9tYWNoX3NoM19kc3A7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNzc1MDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zaDsKLSAgICAgIG51bWJlciA9IGJmZF9tYWNoX3NoNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXJjaCAhPSBpbmZvLT5hcmNoKSAKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG51bWJlciAhPSBpbmZvLT5tYWNoKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2FyY2hfaW5mbwotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGJmZF9nZXRfYXJjaF9pbmZvKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBzdHJ1Y3QgaW4gQHZhcnthYmZkfS4KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9sb29rdXBfYXJjaAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYmZkX2xvb2t1cF9hcmNoCi0JCShlbnVtIGJmZF9hcmNoaXRlY3R1cmUKLQkJYXJjaCwKLQkJdW5zaWduZWQgbG9uZyBtYWNoaW5lKTsKLQotREVTQ1JJUFRJT04KLQlMb29rIGZvciB0aGUgYXJjaGl0ZWN1cmUgaW5mbyBzdHJ1Y3R1cmUgd2hpY2ggbWF0Y2hlcyB0aGUKLQlhcmd1bWVudHMgQHZhcnthcmNofSBhbmQgQHZhcnttYWNoaW5lfS4gQSBtYWNoaW5lIG9mIDAgbWF0Y2hlcyB0aGUKLQltYWNoaW5lL2FyY2hpdGVjdHVyZSBzdHJ1Y3R1cmUgd2hpY2ggbWFya3MgaXRzZWxmIGFzIHRoZQotCWRlZmF1bHQuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiAKLWJmZF9sb29rdXBfYXJjaCAoYXJjaCwgbWFjaGluZSkKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogY29uc3QgKmFwcCwgKmFwOwotCi0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCi0JewotCSAgaWYgKGFwLT5hcmNoID09IGFyY2gKLQkgICAgICAmJiAoYXAtPm1hY2ggPT0gbWFjaGluZQotCQkgIHx8IChtYWNoaW5lID09IDAgJiYgYXAtPnRoZV9kZWZhdWx0KSkpCi0JICAgIHJldHVybiBhcDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludGFibGVfYXJjaF9tYWNoCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX3ByaW50YWJsZV9hcmNoX21hY2gKLQkJKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHByaW50YWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhcmNoaXRlY3R1cmUgYW5kCi0JbWFjaGluZSB0eXBlLiAKLQotCVRoaXMgcm91dGluZSBpcyBkZXByZWNpYXRlZC4KLSovCi0KLWNvbnN0IGNoYXIgKgotYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGFyY2gsIG1hY2hpbmUpCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYXAgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2hpbmUpOwotCi0gICAgaWYgKGFwKQotICAgICAgcmV0dXJuIGFwLT5wcmludGFibGVfbmFtZTsKLSAgICByZXR1cm4gIlVOS05PV04hIjsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29jdGV0c19wZXJfYnl0ZQotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfb2N0ZXRzX3Blcl9ieXRlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2N0ZXRzICg4LWJpdCBxdWFudGl0aWVzKSBwZXIgdGFyZ2V0IGJ5dGUKLSAgICAgICAgKG1pbmltdW0gYWRkcmVzc2FibGUgdW5pdCkuICBJbiBtb3N0IGNhc2VzLCB0aGlzIHdpbGwgYmUgb25lLCBidXQgc29tZQotICAgICAgICBEU1AgdGFyZ2V0cyBoYXZlIDE2LCAzMiwgb3IgZXZlbiA0OCBiaXRzIHBlciBieXRlLgotCi0qLwotCi11bnNpZ25lZCBpbnQKLWJmZF9vY3RldHNfcGVyX2J5dGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gICAgcmV0dXJuIGJmZF9hcmNoX21hY2hfb2N0ZXRzX3Blcl9ieXRlIChiZmRfZ2V0X2FyY2ggKGFiZmQpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9nZXRfbWFjaCAoYWJmZCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZQotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZShlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSk7Ci0KLURFU0NSSVBUSU9OCi0JU2VlIGJmZF9vY3RldHNfcGVyX2J5dGUuCi0gICAgICAgIAotICAgICAgICBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgZm9yIHRob3NlIGNhc2VzIHdoZXJlIGEgYmZkICogaXMgbm90Ci0gICAgICAgIGF2YWlsYWJsZQotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSAoYXJjaCwgbWFjaCkKLSAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYXAgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOwotICAgIAotICAgIGlmIChhcCkKLSAgICAgIHJldHVybiBhcC0+Yml0c19wZXJfYnl0ZSAvIDg7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJtbmV0YnNkLmMgYi9iZmQvYXJtbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmVlNDcuLjAwMDAwMDAKLS0tIGEvYmZkL2FybW5ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvQVJNIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAkJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICQliZmRfYXJjaF9hcm0KLSNkZWZpbmUJREVGQVVMVF9NSUQgCQlNX0FSTTZfTkVUQlNECi0vKiNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fQVJNNl9ORVRCU0QpKi8KLQotI2RlZmluZSBNWShPUCkgCQkJQ0FUIChhcm1uZXRic2RfLCBPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgCQkiYS5vdXQtYXJtLW5ldGJzZCIKLQotI2lmIDAKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoYW91dGFybSxfMzJfLHkpCi0KLSNkZWZpbmUgYW91dGFybV8zMl9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFvdXRhcm1fYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpbmNsdWRlICJiZmQuaCIJCS8qIFRvIGVuc3VyZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gaXMgT0sgKi8KLQotQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCi1NWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICogYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2JmZC1pbi5oIGIvYmZkL2JmZC1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY3YzBjLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDc1MSArMCwwIEBACi0vKiBNYWluIGhlYWRlciBmaWxlIGZvciB0aGUgYmZkIGxpYnJhcnkgLS0gcG9ydGFibGUgYWNjZXNzIHRvIG9iamVjdCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBiZmQuaCBhbmQgYmZkLWluMi5oIGFyZSBHRU5FUkFURUQgZmlsZXMuICBEb24ndCBjaGFuZ2UgdGhlbTsKLSoqIGluc3RlYWQsIGNoYW5nZSBiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KLSoqIGdlbmVyYXRlIHRoZXNlIGZpbGVzLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIGJmZC5oIC0tIFRoZSBvbmx5IGhlYWRlciBmaWxlIHJlcXVpcmVkIGJ5IHVzZXJzIG9mIHRoZSBiZmQgbGlicmFyeSAKLQotVGhlIGJmZC5oIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gYmZkLWluLmggYW5kIHZhcmlvdXMgLmMgZmlsZXM7IGlmIHlvdQotY2hhbmdlIGl0LCB5b3VyIGNoYW5nZXMgd2lsbCBwcm9iYWJseSBiZSBsb3N0LgotCi1BbGwgdGhlIHByb3RvdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvbGxvd2luZyB0aGUgY29tbWVudCAiVEhFIEZPTExPV0lORwotSVMgRVhUUkFDVEVEIEZST00gVEhFIFNPVVJDRSIgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBzb3VyY2UgZmlsZXMgZm9yCi1CRkQuICBJZiB5b3UgY2hhbmdlIGl0LCBzb21lb25lIG9uZWRheSB3aWxsIGV4dHJhY3QgaXQgZnJvbSB0aGUgc291cmNlCi1hZ2FpbiwgYW5kIHlvdXIgY2hhbmdlcyB3aWxsIGJlIGxvc3QuICBUbyBzYXZlIHlvdXJzZWxmIGZyb20gdGhpcyBiaW5kLAotY2hhbmdlIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgc291cmNlIGluIHRoZSBiZmQgZGlyZWN0b3J5LiAgVHlwZSAibWFrZQotZG9jcyIgYW5kIHRoZW4gIm1ha2UgaGVhZGVycyIgaW4gdGhhdCBkaXJlY3RvcnksIGFuZCBtYWdpY2FsbHkgdGhpcyBmaWxlCi13aWxsIGNoYW5nZSB0byByZWZsZWN0IHlvdXIgY2hhbmdlcy4KLQotSWYgeW91IGRvbid0IGhhdmUgdGhlIHRvb2xzIHRvIHBlcmZvcm0gdGhlIGV4dHJhY3Rpb24sIHRoZW4geW91IGFyZQotc2FmZSBmcm9tIHNvbWVvbmUgb24geW91ciBzeXN0ZW0gdHJhbXBsaW5nIG92ZXIgeW91ciBoZWFkZXIgZmlsZXMuCi1Zb3Ugc2hvdWxkIHN0aWxsIG1haW50YWluIHRoZSBlcXVpdmFsZW5jZSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRoaXMKLWZpbGUgdGhvdWdoOyBldmVyeSBjaGFuZ2UgeW91IG1ha2UgdG8gdGhlIC5jIGZpbGUgc2hvdWxkIGJlIHJlZmxlY3RlZAotaGVyZS4gICovCi0KLSNpZm5kZWYgX19CRkRfSF9TRUVOX18KLSNkZWZpbmUgX19CRkRfSF9TRUVOX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogVGhlc2UgdHdvIGxpbmVzIGdldCBzdWJzdGl0dXRpb25zIGRvbmUgYnkgY29tbWFuZHMgaW4gTWFrZWZpbGUuaW4uICAqLwotI2RlZmluZSBCRkRfVkVSU0lPTiAgIkBWRVJTSU9OQCIKLSNkZWZpbmUgQkZEX0FSQ0hfU0laRSBAd29yZHNpemVACi0jZGVmaW5lIEJGRF9IT1NUXzY0QklUX0xPTkcgQEJGRF9IT1NUXzY0QklUX0xPTkdACi0jaWYgQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotI2RlZmluZSBCRkRfSE9TVF82NF9CSVQgQEJGRF9IT1NUXzY0X0JJVEAKLSNkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgQEJGRF9IT1NUX1VfNjRfQklUQAotI2VuZGlmCi0KLSNpZiBCRkRfQVJDSF9TSVpFID49IDY0Ci0jZGVmaW5lIEJGRDY0Ci0jZW5kaWYKLQotI2lmbmRlZiBJTkxJTkUKLSNpZiBfX0dOVUNfXyA+PSAyCi0jZGVmaW5lIElOTElORSBfX2lubGluZV9fCi0jZWxzZQotI2RlZmluZSBJTkxJTkUKLSNlbmRpZgotI2VuZGlmCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IF9iZmQgYmZkOwotCi0vKiBUbyBzcXVlbGNoIGVycm9uZW91cyBjb21waWxlciB3YXJuaW5ncyAoImlsbGVnYWwgcG9pbnRlcgotICAgY29tYmluYXRpb24iKSBmcm9tIHRoZSBTVlIzIGNvbXBpbGVyLCB3ZSB3b3VsZCBsaWtlIHRvIHR5cGVkZWYKLSAgIGJvb2xlYW4gdG8gaW50IChpdCBkb2Vzbid0IGxpa2UgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBib29sZWFuLgotICAgTWFraW5nIHN1cmUgdGhleSBhcmUgbmV2ZXIgaW1wbGljaXRseSBkZWNsYXJlZCB0byByZXR1cm4gaW50Ci0gICBkb2Vzbid0IHNlZW0gdG8gaGVscCkuICBCdXQgdGhpcyBmaWxlIGlzIG5vdCBjb25maWd1cmVkIGJhc2VkIG9uCi0gICB0aGUgaG9zdC4gICovCi0vKiBHZW5lcmFsIHJ1bGVzOiBmdW5jdGlvbnMgd2hpY2ggYXJlIGJvb2xlYW4gcmV0dXJuIHRydWUgb24gc3VjY2VzcwotICAgYW5kIGZhbHNlIG9uIGZhaWx1cmUgKHVubGVzcyB0aGV5J3JlIGEgcHJlZGljYXRlKS4gICAtLSBiZmQuZG9jICovCi0vKiBJJ20gc3VyZSB0aGlzIGlzIGdvaW5nIHRvIGJyZWFrIHNvbWV0aGluZyBhbmQgc29tZW9uZSBpcyBnb2luZyB0bwotICAgZm9yY2UgbWUgdG8gY2hhbmdlIGl0LiAqLwotLyogdHlwZWRlZiBlbnVtIGJvb2xlYW4ge2ZhbHNlLCB0cnVlfSBib29sZWFuOyAqLwotLyogWXVwLCBTVlI0IGhhcyBhICJ0eXBlZGVmIGVudW0gYm9vbGVhbiIgaW4gPHN5cy90eXBlcy5oPiAgLWZuZiAqLwotLyogSXQgZ2V0cyB3b3JzZSBpZiB0aGUgaG9zdCBhbHNvIGRlZmluZXMgYSB0cnVlL2ZhbHNlIGVudW0uLi4gLXN0cyAqLwotLyogQW5kIGV2ZW4gd29yc2UgaWYgeW91ciBjb21waWxlciBoYXMgYnVpbHQtaW4gYm9vbGVhbiB0eXBlcy4uLiAtbGF3ICovCi0jaWYgZGVmaW5lZCAoX19HTlVHX18pICYmIChfX0dOVUNfTUlOT1JfXyA+IDUpCi0jZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi0jZW5kaWYKLSNpZmRlZiBNUFcKLS8qIFByZS1lbXB0aXZlIHN0cmlrZSAtIGdldCB0aGUgZmlsZSB3aXRoIHRoZSBlbnVtLiAqLwotI2luY2x1ZGUgPFR5cGVzLmg+Ci0jZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi0jZW5kaWYgLyogTVBXICovCi0jaWZuZGVmIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2ZhbHNlLCB0cnVlfSBib29sZWFuOwotI2RlZmluZSBCRkRfVFJVRV9GQUxTRQotI2Vsc2UKLS8qIFVzZSBlbnVtIG5hbWVzIHRoYXQgd2lsbCBhcHBlYXIgbm93aGVyZSBlbHNlLiAgKi8KLXR5cGVkZWYgZW51bSBiZmRfYm9vbGVhbiB7YmZkX2ZmZmFsc2UsIGJmZF90dHRydWV9IGJvb2xlYW47Ci0jZW5kaWYKLQotLyogQSBwb2ludGVyIHRvIGEgcG9zaXRpb24gaW4gYSBmaWxlLiAgKi8KLS8qIEZJWE1FOiAgVGhpcyBzaG91bGQgYmUgdXNpbmcgb2ZmX3QgZnJvbSA8c3lzL3R5cGVzLmg+LgotICAgRm9yIG5vdywgdHJ5IHRvIGF2b2lkIGJyZWFraW5nIHN0dWZmIGJ5IG5vdCBpbmNsdWRpbmcgPHN5cy90eXBlcy5oPiBoZXJlLgotICAgVGhpcyB3aWxsIGJyZWFrIG9uIHN5c3RlbXMgd2l0aCA2NC1iaXQgZmlsZSBvZmZzZXRzIChlLmcuIDQuNEJTRCkuCi0gICBQcm9iYWJseSB0aGUgYmVzdCBsb25nLXRlcm0gYW5zd2VyIGlzIHRvIGF2b2lkIHVzaW5nIGZpbGVfcHRyIEFORCBvZmZfdCAKLSAgIGluIHRoaXMgaGVhZGVyIGZpbGUsIGFuZCB0byBoYW5kbGUgdGhpcyBpbiB0aGUgQkZEIGltcGxlbWVudGF0aW9uCi0gICByYXRoZXIgdGhhbiBpbiBpdHMgaW50ZXJmYWNlLiAgKi8KLS8qIHR5cGVkZWYgb2ZmX3QJZmlsZV9wdHI7ICovCi10eXBlZGVmIGxvbmcgaW50IGZpbGVfcHRyOwotCi0vKiBTdXBwb3J0IGZvciBkaWZmZXJlbnQgc2l6ZXMgb2YgdGFyZ2V0IGZvcm1hdCBpbnRzIGFuZCBhZGRyZXNzZXMuCi0gICBJZiB0aGUgdHlwZSBgbG9uZycgaXMgYXQgbGVhc3QgNjQgYml0cywgQkZEX0hPU1RfNjRCSVRfTE9ORyB3aWxsIGJlCi0gICBzZXQgdG8gMSBhYm92ZS4gIE90aGVyd2lzZSwgaWYgZ2NjIGlzIGJlaW5nIHVzZWQsIHRoaXMgY29kZSB3aWxsCi0gICB1c2UgZ2NjJ3MgImxvbmcgbG9uZyIgdHlwZS4gIE90aGVyd2lzZSwgQkZEX0hPU1RfNjRfQklUIG11c3QgYmUKLSAgIGRlZmluZWQgYWJvdmUuICAqLwotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotIyBpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0jICBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGxvbmcKLSMgIGRlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCB1bnNpZ25lZCBsb25nCi0jIGVsc2UKLSMgIGlmZGVmIF9fR05VQ19fCi0jICAgaWYgX19HTlVDX18gPj0gMgotIyAgICBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGxvbmcgbG9uZwotIyAgICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZyBsb25nCi0jICAgZW5kaWYgLyogX19HTlVDX18gPj0gMiAqLwotIyAgZW5kaWYgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KLSMgZW5kaWYgLyogISBCRkRfSE9TVF82NEJJVF9MT05HICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfSE9TVF82NF9CSVQpICovCi0KLSNpZmRlZiBCRkQ2NAotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotICNlcnJvciBObyA2NCBiaXQgaW50ZWdlciB0eXBlIGF2YWlsYWJsZQotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUXzY0X0JJVCBiZmRfc2lnbmVkX3ZtYTsKLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgYmZkX3NpemVfdHlwZTsKLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgc3ltdmFsdWU7Ci0KLSNpZm5kZWYgZnByaW50Zl92bWEKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZiAocywgIiUwMTZseCIsIHgpCi0jZGVmaW5lIGZwcmludGZfdm1hKGYseCkgZnByaW50ZiAoZiwgIiUwMTZseCIsIHgpCi0jZWxzZQotI2RlZmluZSBfYmZkX2ludDY0X2xvdyh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpICYgMHhmZmZmZmZmZikpKQotI2RlZmluZSBfYmZkX2ludDY0X2hpZ2goeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSA+PiAzMikgJiAweGZmZmZmZmZmKSkKLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBcCi0gIGZwcmludGYgKChzKSwgIiUwOGx4JTA4bHgiLCBfYmZkX2ludDY0X2hpZ2ggKHgpLCBfYmZkX2ludDY0X2xvdyAoeCkpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgXAotICBzcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2VuZGlmCi0jZW5kaWYKLQotI2Vsc2UgLyogbm90IEJGRDY0ICAqLwotCi0vKiBSZXByZXNlbnQgYSB0YXJnZXQgYWRkcmVzcy4gIEFsc28gdXNlZCBhcyBhIGdlbmVyaWMgdW5zaWduZWQgdHlwZQotICAgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55IGFyaXRobWV0aWMgdHlwZXMKLSAgIHdlIG5lZWQgdG8gZGVhbCB3aXRoLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfdm1hOwotCi0vKiBBIGdlbmVyaWMgc2lnbmVkIHR5cGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55Ci0gICBhcml0aG1ldGljIHR5cGVzIHdlIG5lZWQgdG8gZGVhbCB3aXRoLiAgQ2FuIGJlIGFzc3VtZWQgdG8gYmUgY29tcGF0aWJsZQotICAgd2l0aCBiZmRfdm1hIGluIHRoZSBzYW1lIHdheSB0aGF0IHNpZ25lZCBhbmQgdW5zaWduZWQgaW50cyBhcmUgY29tcGF0aWJsZQotICAgKGFzIHBhcmFtZXRlcnMsIGluIGFzc2lnbm1lbnQsIGV0YykuICAqLwotdHlwZWRlZiBsb25nIGJmZF9zaWduZWRfdm1hOwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltdmFsdWU7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3NpemVfdHlwZTsKLQotLyogUHJpbnQgYSBiZmRfdm1hIHggb24gc3RyZWFtIHMuICAqLwotI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIGZwcmludGYocywgIiUwOGx4IiwgeCkKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmKHMsICIlMDhseCIsIHgpCi0KLSNlbmRpZiAvKiBub3QgQkZENjQgICovCi0KLSNkZWZpbmUgcHJpbnRmX3ZtYSh4KSBmcHJpbnRmX3ZtYShzdGRvdXQseCkKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxhZ3dvcmQ7CS8qIDMyIGJpdHMgb2YgZmxhZ3MgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBiZmRfYnl0ZTsKLQwKLS8qKiBGaWxlIGZvcm1hdHMgKi8KLQotdHlwZWRlZiBlbnVtIGJmZF9mb3JtYXQgewotCSAgICAgIGJmZF91bmtub3duID0gMCwJLyogZmlsZSBmb3JtYXQgaXMgdW5rbm93biAqLwotCSAgICAgIGJmZF9vYmplY3QsCS8qIGxpbmtlci9hc3NlbWJlci9jb21waWxlciBvdXRwdXQgKi8KLQkgICAgICBiZmRfYXJjaGl2ZSwJLyogb2JqZWN0IGFyY2hpdmUgZmlsZSAqLwotCSAgICAgIGJmZF9jb3JlLAkJLyogY29yZSBkdW1wICovCi0JICAgICAgYmZkX3R5cGVfZW5kfQkvKiBtYXJrcyB0aGUgZW5kOyBkb24ndCB1c2UgaXQhICovCi0gICAgICAgICBiZmRfZm9ybWF0OwotCi0vKiBWYWx1ZXMgdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBmbGFncyBmaWVsZCBvZiBhIEJGRC4gIFRoZXNlIGFsc28KLSAgIGFwcGVhciBpbiB0aGUgb2JqZWN0X2ZsYWdzIGZpZWxkIG9mIHRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZSwgd2hlcmUKLSAgIHRoZXkgaW5kaWNhdGUgdGhlIHNldCBvZiBmbGFncyB1c2VkIGJ5IHRoYXQgYmFja2VuZCAobm90IGFsbCBmbGFncwotICAgYXJlIG1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzKSAoRklYTUU6IGF0IHRoZSBtb21lbnQsCi0gICB0aGUgb2JqZWN0X2ZsYWdzIHZhbHVlcyBoYXZlIG1vc3RseSBqdXN0IGJlZW4gY29waWVkIGZyb20gYmFja2VuZAotICAgdG8gYW5vdGhlciwgYW5kIGFyZSBub3QgbmVjZXNzYXJpbHkgY29ycmVjdCkuICAqLwotCi0vKiBObyBmbGFncy4gICovCi0jZGVmaW5lIEJGRF9OT19GTEFHUyAgIAkweDAwCi0KLS8qIEJGRCBjb250YWlucyByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotI2RlZmluZSBIQVNfUkVMT0MgICAJMHgwMQotCi0vKiBCRkQgaXMgZGlyZWN0bHkgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIEVYRUNfUCAgICAgIAkweDAyCi0KLS8qIEJGRCBoYXMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKGJhc2ljYWxseSB1c2VkIGZvciBGX0xOTk8gaW4gYQotICAgQ09GRiBoZWFkZXIpLiAgKi8KLSNkZWZpbmUgSEFTX0xJTkVOTyAgCTB4MDQKLQotLyogQkZEIGhhcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBIQVNfREVCVUcgICAJMHgwOAotCi0vKiBCRkQgaGFzIHN5bWJvbHMuICAqLwotI2RlZmluZSBIQVNfU1lNUyAgICAJMHgxMAotCi0vKiBCRkQgaGFzIGxvY2FsIHN5bWJvbHMgKGJhc2ljYWxseSB1c2VkIGZvciBGX0xTWU1TIGluIGEgQ09GRgotICAgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MT0NBTFMgIAkweDIwCi0KLS8qIEJGRCBpcyBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRFlOQU1JQyAgICAgCTB4NDAKLQotLyogVGV4dCBzZWN0aW9uIGlzIHdyaXRlIHByb3RlY3RlZCAoaWYgRF9QQUdFRCBpcyBub3Qgc2V0LCB0aGlzIGlzCi0gICBsaWtlIGFuIGEub3V0IE5NQUdJQyBmaWxlKSAodGhlIGxpbmtlciBzZXRzIHRoaXMgYnkgZGVmYXVsdCwgYnV0Ci0gICBjbGVhcnMgaXQgZm9yIC1yIG9yIC1OKS4gICovCi0jZGVmaW5lIFdQX1RFWFQgICAgIAkweDgwCi0KLS8qIEJGRCBpcyBkeW5hbWljYWxseSBwYWdlZCAodGhpcyBpcyBsaWtlIGFuIGEub3V0IFpNQUdJQyBmaWxlKSAodGhlCi0gICBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dCBjbGVhcnMgaXQgZm9yIC1yIG9yIC1uIG9yIC1OKS4gICovCi0jZGVmaW5lIERfUEFHRUQgICAgIAkweDEwMAotCi0vKiBCRkQgaXMgcmVsYXhhYmxlICh0aGlzIG1lYW5zIHRoYXQgYmZkX3JlbGF4X3NlY3Rpb24gbWF5IGJlIGFibGUgdG8KLSAgIGRvIHNvbWV0aGluZykgKHNvbWV0aW1lcyBiZmRfcmVsYXhfc2VjdGlvbiBjYW4gZG8gc29tZXRoaW5nIGV2ZW4gaWYKLSAgIHRoaXMgaXMgbm90IHNldCkuICAqLwotI2RlZmluZSBCRkRfSVNfUkVMQVhBQkxFIDB4MjAwCi0KLS8qIFRoaXMgbWF5IGJlIHNldCBiZWZvcmUgd3JpdGluZyBvdXQgYSBCRkQgdG8gcmVxdWVzdCB1c2luZyBhCi0gICB0cmFkaXRpb25hbCBmb3JtYXQuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyB1c2VkIHRvIHJlcXVlc3QgdGhhdCB3aGVuCi0gICB3cml0aW5nIG91dCBhbiBhLm91dCBvYmplY3QgdGhlIHN5bWJvbHMgbm90IGJlIGhhc2hlZCB0byBlbGltaW5hdGUKLSAgIGR1cGxpY2F0ZXMuICAqLwotI2RlZmluZSBCRkRfVFJBRElUSU9OQUxfRk9STUFUIDB4NDAwCi0KLS8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgQkZEIGNvbnRlbnRzIGFyZSBhY3R1YWxseSBjYWNoZWQgaW4KLSAgIG1lbW9yeS4gIElmIHRoaXMgaXMgc2V0LCBpb3N0cmVhbSBwb2ludHMgdG8gYSBiZmRfaW5fbWVtb3J5IHN0cnVjdC4gICovCi0jZGVmaW5lIEJGRF9JTl9NRU1PUlkgMHg4MDAKLQwKLS8qIHN5bWJvbHMgYW5kIHJlbG9jYXRpb24gKi8KLQotLyogQSBjb3VudCBvZiBjYXJzeW1zIChjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzKS4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltaW5kZXg7Ci0KLS8qIEhvdyB0byBwZXJmb3JtIGEgcmVsb2NhdGlvbi4gICovCi10eXBlZGVmIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgcmVsb2NfaG93dG9fdHlwZTsKLQotI2RlZmluZSBCRkRfTk9fTU9SRV9TWU1CT0xTICgoc3ltaW5kZXgpIH4wKQotCi0vKiBHZW5lcmFsIHB1cnBvc2UgcGFydCBvZiBhIHN5bWJvbCBYOwotICAgdGFyZ2V0IHNwZWNpZmljIHBhcnRzIGFyZSBpbiBsaWJjb2ZmLmgsIGxpYmFvdXQuaCwgZXRjLiAgKi8KLQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbikKLSNkZWZpbmUgYmZkX2dldF9vdXRwdXRfc2VjdGlvbih4KSAoKHgpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uKHgseSkgKCh4KS0+c2VjdGlvbikgPSAoeSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfYmFzZSh4KSAoKHgpLT5zZWN0aW9uLT52bWEpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX3ZhbHVlKHgpIChiZmRfYXN5bWJvbF9iYXNlKHgpICsgKHgpLT52YWx1ZSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfbmFtZSh4KSAoKHgpLT5uYW1lKQotLypQZXJoYXBzIGZ1dHVyZTogI2RlZmluZSBiZmRfYXN5bWJvbF9iZmQoeCkgKCh4KS0+c2VjdGlvbi0+b3duZXIpKi8KLSNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnRoZV9iZmQpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2ZsYXZvdXIoeCkgKGJmZF9hc3ltYm9sX2JmZCh4KS0+eHZlYy0+Zmxhdm91cikKLQotLyogQSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2wuICAqLwotLyogVGhpcyBpcyBhIHR5cGUgcHVuIHdpdGggc3RydWN0IHJhbmxpYiBvbiBwdXJwb3NlISAqLwotdHlwZWRlZiBzdHJ1Y3QgY2Fyc3ltIHsKLSAgY2hhciAqbmFtZTsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7CQkvKiBsb29rIGhlcmUgdG8gZmluZCB0aGUgZmlsZSAqLwotfSBjYXJzeW07CQkJLyogdG8gbWFrZSB0aGVzZSB5b3UgY2FsbCBhIGNhcnN5bW9nZW4gKi8KLQotICAKLS8qIFVzZWQgaW4gZ2VuZXJhdGluZyBhcm1hcHMgKGFyY2hpdmUgdGFibGVzIG9mIGNvbnRlbnRzKS4KLSAgIFBlcmhhcHMganVzdCBhIGZvcndhcmQgZGVmaW5pdGlvbiB3b3VsZCBkbz8gKi8KLXN0cnVjdCBvcmwgewkJCS8qIG91dHB1dCByYW5saWIgKi8KLSAgY2hhciAqKm5hbWU7CQkJLyogc3ltYm9sIG5hbWUgKi8gCi0gIGZpbGVfcHRyIHBvczsJCQkvKiBiZmQqIG9yIGZpbGUgcG9zaXRpb24gKi8KLSAgaW50IG5hbWlkeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSAqLwotfTsKLQwKLQotLyogTGluZW51bWJlciBzdHVmZiAqLwotdHlwZWRlZiBzdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5IHsKLSAgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyOwkvKiBMaW5lbnVtYmVyIGZyb20gc3RhcnQgb2YgZnVuY3Rpb24qLyAgCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW07IC8qIEZ1bmN0aW9uIG5hbWUgKi8KLSAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsJLyogT2Zmc2V0IGludG8gc2VjdGlvbiAqLwotICB9IHU7Ci19IGFsZW50OwotDAotLyogb2JqZWN0IGFuZCBjb3JlIGZpbGUgc2VjdGlvbnMgKi8KLQotI2RlZmluZQlhbGlnbl9wb3dlcihhZGRyLCBhbGlnbikJXAotCSggKChhZGRyKSArICgoMTw8KGFsaWduKSktMSkpICYgKC0xIDw8IChhbGlnbikpKQotCi10eXBlZGVmIHN0cnVjdCBzZWMgKnNlY19wdHI7Ci0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIgKyAwKQotI2RlZmluZSBiZmRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3NpemUoYmZkLCBwdHIpIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MocHRyKSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbG1hKGJmZCwgcHRyKSAoKHB0ciktPmxtYSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlcikKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGJmZCwgcHRyKSAoKHB0ciktPmZsYWdzICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhKGJmZCwgcHRyKSAoKHB0ciktPnVzZXJkYXRhKQotCi0jZGVmaW5lIGJmZF9pc19jb21fc2VjdGlvbihwdHIpICgoKHB0ciktPmZsYWdzICYgU0VDX0lTX0NPTU1PTikgIT0gMCkKLQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPnZtYSA9IChwdHIpLT5sbWE9ICh2YWwpKSwgKChwdHIpLT51c2VyX3NldF92bWEgPSAoYm9vbGVhbil0cnVlKSwgdHJ1ZSkKLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIgPSAodmFsKSksdHJ1ZSkKLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3VzZXJkYXRhKGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPnVzZXJkYXRhID0gKHZhbCkpLHRydWUpCi0KLXR5cGVkZWYgc3RydWN0IHN0YXQgc3RhdF90eXBlOyAKLQwKLXR5cGVkZWYgZW51bSBiZmRfcHJpbnRfc3ltYm9sCi17IAotICBiZmRfcHJpbnRfc3ltYm9sX25hbWUsCi0gIGJmZF9wcmludF9zeW1ib2xfbW9yZSwKLSAgYmZkX3ByaW50X3N5bWJvbF9hbGwKLX0gYmZkX3ByaW50X3N5bWJvbF90eXBlOwotICAgIAotLyogSW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wgdGhhdCBubSBuZWVkcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IF9zeW1ib2xfaW5mbwotewotICBzeW12YWx1ZSB2YWx1ZTsKLSAgY2hhciB0eXBlOwotICBDT05TVCBjaGFyICpuYW1lOyAgICAgICAgICAgIC8qIFN5bWJvbCBuYW1lLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzdGFiX3R5cGU7ICAgICAvKiBTdGFiIHR5cGUuICAqLwotICBjaGFyIHN0YWJfb3RoZXI7ICAgICAgICAgICAgIC8qIFN0YWIgb3RoZXIuICovCi0gIHNob3J0IHN0YWJfZGVzYzsgICAgICAgICAgICAgLyogU3RhYiBkZXNjLiAgKi8KLSAgQ09OU1QgY2hhciAqc3RhYl9uYW1lOyAgICAgICAvKiBTdHJpbmcgZm9yIHN0YWIgdHlwZS4gICovCi19IHN5bWJvbF9pbmZvOwotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSBzdGFicyB0eXBlIGNvZGUuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqYmZkX2dldF9zdGFiX25hbWUgUEFSQU1TICgoaW50KSk7Ci0MCi0vKiBIYXNoIHRhYmxlIHJvdXRpbmVzLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGZyZWUgdXAgYSBoYXNoIHRhYmxlLiAgKi8KLQotLyogQW4gZWxlbWVudCBpbiB0aGUgaGFzaCB0YWJsZS4gIE1vc3QgdXNlcyB3aWxsIGFjdHVhbGx5IHVzZSBhIGxhcmdlcgotICAgc3RydWN0dXJlLCBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBmaWVsZC4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeQotewotICAvKiBOZXh0IGVudHJ5IGZvciB0aGlzIGhhc2ggY29kZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogU3RyaW5nIGJlaW5nIGhhc2hlZC4gICovCi0gIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgLyogSGFzaCBjb2RlLiAgVGhpcyBpcyB0aGUgZnVsbCBoYXNoIGNvZGUsIG5vdCB0aGUgaW5kZXggaW50byB0aGUKLSAgICAgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci19OwotCi0vKiBBIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggYXJyYXkuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKip0YWJsZTsKLSAgLyogVGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBBIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIG5ldyBlbGVtZW50cyBpbiB0aGUgaGFzaCB0YWJsZS4gIFRoZQotICAgICBmaXJzdCBlbnRyeSBpcyBpdHNlbGYgYSBwb2ludGVyIHRvIGFuIGVsZW1lbnQuICBXaGVuIHRoaXMKLSAgICAgZnVuY3Rpb24gaXMgZmlyc3QgaW52b2tlZCwgdGhpcyBwb2ludGVyIHdpbGwgYmUgTlVMTC4gIEhvd2V2ZXIsCi0gICAgIGhhdmluZyB0aGUgcG9pbnRlciBwZXJtaXRzIGEgaGllcmFyY2h5IG9mIG1ldGhvZCBmdW5jdGlvbnMgdG8gYmUKLSAgICAgYnVpbHQgZWFjaCBvZiB3aGljaCBjYWxscyB0aGUgZnVuY3Rpb24gaW4gdGhlIHN1cGVyY2xhc3MuICBUaHVzCi0gICAgIGVhY2ggZnVuY3Rpb24gc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgb2YgbWVtb3J5Ci0gICAgIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIE5VTEwuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgICAgY29uc3QgY2hhciAqKSk7Ci0gICAvKiBBbiBvYmphbGxvYyBmb3IgdGhpcyBoYXNoIHRhYmxlLiAgVGhpcyBpcyBhIHN0cnVjdCBvYmphbGxvYyAqLAotICAgICBidXQgd2UgdXNlIFBUUiB0byBhdm9pZCByZXF1aXJpbmcgdGhlIGluY2x1c2lvbiBvZiBvYmphbGxvYy5oLiAgKi8KLSAgUFRSIG1lbW9yeTsKLX07Ci0KLS8qIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZSBzcGVjaWZ5aW5nIGEgc2l6ZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0X24KLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSwKLQkgICB1bnNpZ25lZCBpbnQgc2l6ZSkpOwotCi0vKiBGcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF90YWJsZV9mcmVlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSk7Ci0KLS8qIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlLiAgSWYgQ1JFQVRFIGlzIHRydWUsIGEgbmV3IGVudHJ5Ci0gICB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoaXMgc3RyaW5nIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiAgVGhlCi0gICBDT1BZIGFyZ3VtZW50IG11c3QgYmUgdHJ1ZSBpZiB0aGlzIHJvdXRpbmUgc2hvdWxkIGNvcHkgdGhlIHN0cmluZwotICAgaW50byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IHdoZW4gYWRkaW5nIGFuIGVudHJ5LiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmJmZF9oYXNoX2xvb2t1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGNyZWF0ZSwKLQkgICBib29sZWFuIGNvcHkpKTsKLQotLyogUmVwbGFjZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfcmVwbGFjZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpvbGQsCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpudykpOwotCi0vKiBCYXNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmJmZF9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIGNvbnN0IGNoYXIgKikpOwotCi0vKiBHcmFiIHNvbWUgc3BhY2UgZm9yIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gUFRSIGJmZF9oYXNoX2FsbG9jYXRlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCkpOwotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUgaW4gYSByYW5kb20gb3JkZXIsIGNhbGxpbmcgYSBmdW5jdGlvbiBvbiBlYWNoCi0gICBlbGVtZW50LiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZSB0cmF2ZXJzYWwgc3RvcHMuICBUaGUKLSAgIElORk8gYXJndW1lbnQgaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF90cmF2ZXJzZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgYm9vbGVhbiAoKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJICAgIFBUUiksCi0JCQkJICAgICAgIFBUUiBpbmZvKSk7Ci0MCi0vKiBTZW1pLXBvcnRhYmxlIHN0cmluZyBjb25jYXRlbmF0aW9uIGluIGNwcC4KLSAgIFRoZSBDQVQ0IGhhY2sgaXMgdG8gYXZvaWQgYSBwcm9ibGVtIHdpdGggc29tZSBzdHJpY3QgQU5TSSBDIHByZXByb2Nlc3NvcnMuCi0gICBUaGUgcHJvYmxlbSBpcywgIjMyXyIgaXMgbm90IGEgdmFsaWQgcHJlcHJvY2Vzc2luZyB0b2tlbiwgYW5kIHdlIGRvbid0Ci0gICB3YW50IGV4dHJhIHVuZGVyc2NvcmVzIChlLmcuLCAibmxtXzMyXyIpLiAgVGhlIFhDQVQyIG1hY3JvIHdpbGwgY2F1c2UgdGhlCi0gICBpbm5lciBDQVQgbWFjcm9zIHRvIGJlIGV2YWx1YXRlZCBmaXJzdCwgcHJvZHVjaW5nIHN0aWxsLXZhbGlkIHBwLXRva2Vucy4KLSAgIFRoZW4gdGhlIGZpbmFsIGNvbmNhdGVuYXRpb24gY2FuIGJlIGRvbmUuICAoU2lnaC4pICAqLwotI2lmbmRlZiBDQVQKLSNpZmRlZiBTQUJFUgotI2RlZmluZSBDQVQoYSxiKQlhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpCWEjI2IjI2MKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlhIyNiIyNjIyNkCi0jZWxzZQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi0jZGVmaW5lIENBVChhLGIpIGEjI2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykgYSMjYiMjYwotI2RlZmluZSBYQ0FUMihhLGIpCUNBVChhLGIpCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJWENBVDIoQ0FUKGEsYiksQ0FUKGMsZCkpCi0jZWxzZQotI2RlZmluZSBDQVQoYSxiKSBhLyoqL2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykgYS8qKi9iLyoqL2MKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlhLyoqL2IvKiovYy8qKi9kCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgQ09GRl9TV0FQX1RBQkxFIChQVFIpICZiZmRfY29mZl9zdGRfc3dhcF90YWJsZQotDAotLyogVXNlciBwcm9ncmFtIGFjY2VzcyB0byBCRkQgZmFjaWxpdGllcyAqLwotCi0vKiBEaXJlY3QgSS9PIHJvdXRpbmVzLCBmb3IgcHJvZ3JhbXMgd2hpY2gga25vdyBtb3JlIGFib3V0IHRoZSBvYmplY3QKLSAgIGZpbGUgdGhhbiBCRkQgZG9lcy4gIFVzZSBoaWdoZXIgbGV2ZWwgcm91dGluZXMgaWYgcG9zc2libGUuICAqLwotCi1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfcmVhZAotICBQQVJBTVMgKChQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3dyaXRlCi0gIFBBUkFNUyAoKGNvbnN0IFBUUiwgYmZkX3NpemVfdHlwZSBzaXplLCBiZmRfc2l6ZV90eXBlIG5pdGVtcywgYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9zZWVrIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmlsZV9wdHIgZnAsIGludCBkaXJlY3Rpb24pKTsKLWV4dGVybiBsb25nIGJmZF90ZWxsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfZmx1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9zdGF0IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IHN0YXQgKikpOwotCi0KLS8qIENhc3QgZnJvbSBjb25zdCBjaGFyICogdG8gY2hhciAqIHNvIHRoYXQgY2FsbGVyIGNhbiBhc3NpZ24gdG8KLSAgIGEgY2hhciAqIHdpdGhvdXQgYSB3YXJuaW5nLiAgKi8KLSNkZWZpbmUgYmZkX2dldF9maWxlbmFtZShhYmZkKSAoKGNoYXIgKikgKGFiZmQpLT5maWxlbmFtZSkKLSNkZWZpbmUgYmZkX2dldF9jYWNoZWFibGUoYWJmZCkgKChhYmZkKS0+Y2FjaGVhYmxlKQotI2RlZmluZSBiZmRfZ2V0X2Zvcm1hdChhYmZkKSAoKGFiZmQpLT5mb3JtYXQpCi0jZGVmaW5lIGJmZF9nZXRfdGFyZ2V0KGFiZmQpICgoYWJmZCktPnh2ZWMtPm5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfZmxhdm91cihhYmZkKSAoKGFiZmQpLT54dmVjLT5mbGF2b3VyKQotI2RlZmluZSBiZmRfYmlnX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9saXR0bGVfZW5kaWFuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmJ5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSNkZWZpbmUgYmZkX2hlYWRlcl9iaWdfZW5kaWFuKGFiZmQpIFwKLSAgKChhYmZkKS0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0JJRykKLSNkZWZpbmUgYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuKGFiZmQpIFwKLSAgKChhYmZkKS0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSNkZWZpbmUgYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPmZsYWdzKQotI2RlZmluZSBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPm9iamVjdF9mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5zZWN0aW9uX2ZsYWdzKQotI2RlZmluZSBiZmRfbXlfYXJjaGl2ZShhYmZkKSAoKGFiZmQpLT5teV9hcmNoaXZlKQotI2RlZmluZSBiZmRfaGFzX21hcChhYmZkKSAoKGFiZmQpLT5oYXNfYXJtYXApCi0KLSNkZWZpbmUgYmZkX3ZhbGlkX3JlbG9jX3R5cGVzKGFiZmQpICgoYWJmZCktPnh2ZWMtPnZhbGlkX3JlbG9jX3R5cGVzKQotI2RlZmluZSBiZmRfdXNyZGF0YShhYmZkKSAoKGFiZmQpLT51c3JkYXRhKQotCi0jZGVmaW5lIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyhhYmZkKSAoKGFiZmQpLT5zdGFydF9hZGRyZXNzKQotI2RlZmluZSBiZmRfZ2V0X3N5bWNvdW50KGFiZmQpICgoYWJmZCktPnN5bWNvdW50KQotI2RlZmluZSBiZmRfZ2V0X291dHN5bWJvbHMoYWJmZCkgKChhYmZkKS0+b3V0c3ltYm9scykKLSNkZWZpbmUgYmZkX2NvdW50X3NlY3Rpb25zKGFiZmQpICgoYWJmZCktPnNlY3Rpb25fY291bnQpCi0KLSNkZWZpbmUgYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKGFiZmQpICgoYWJmZCktPnh2ZWMtPnN5bWJvbF9sZWFkaW5nX2NoYXIpCi0KLSNkZWZpbmUgYmZkX3NldF9jYWNoZWFibGUoYWJmZCxib29sKSAoKChhYmZkKS0+Y2FjaGVhYmxlID0gKGJvb2xlYW4pKGJvb2wpKSwgdHJ1ZSkKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3JlY29yZF9waGRyCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLCBmbGFnd29yZCwgYm9vbGVhbiwgYmZkX3ZtYSwKLQkgICBib29sZWFuLCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBzZWMgKiopKTsKLQotLyogQnl0ZSBzd2FwcGluZyByb3V0aW5lcy4gICovCi0KLWJmZF92bWEJCWJmZF9nZXRiNjQJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hIAliZmRfZ2V0bDY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzY0IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzY0IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIzMgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMzIgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMzIgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0YjE2CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGwxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF8xNiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF8xNiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiNjQJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIzMgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjE2CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGwxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLQwKLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBFQ09GRiByb3V0aW5lcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGVjb2ZmX2RlYnVnX2luZm87Ci1zdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcDsKLXN0cnVjdCBlY29mZl9leHRyOwotc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeTsKLXN0cnVjdCBiZmRfbGlua19pbmZvOwotc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnk7Ci1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWU7Ci0jZW5kaWYKLWV4dGVybiBiZmRfdm1hIGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICogYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF92bWEgZ3BfdmFsdWUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfcmVnbWFza3MKLSAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBsb25nIGdwcm1hc2ssIHVuc2lnbmVkIGxvbmcgZnBybWFzaywKLQkgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrKSk7Ci1leHRlcm4gUFRSIGJmZF9lY29mZl9kZWJ1Z19pbml0Ci0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5wdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLQkgICBib29sZWFuICgqZ2V0X2V4dHIpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkJc3RydWN0IGVjb2ZmX2V4dHIgKiksCi0JICAgdm9pZCAoKnNldF9pbmRleCkgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLQkJCSAgICAgIGJmZF9zaXplX3R5cGUpKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBlY29mZl9leHRyICplc3ltKSk7Ci1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfZWNvZmZfZGVidWdfc2l6ZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLCBmaWxlX3B0ciB3aGVyZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBmaWxlX3B0ciB3aGVyZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqLCBzdHJ1Y3Qgc2VjICosCi0JICAgY2hhciAqKikpOwotCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUxGIHJvdXRpbmVzLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmV4dDsKLSAgYmZkICpieTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9lbGZfZ2V0X25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwKLQkgICBjb25zdCBjaGFyICogY29uc3QgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwKLQkgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwKLQkgICBjb25zdCBjaGFyICogY29uc3QgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwKLQkgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9lbGZfZ2V0X2R0X3NvbmFtZSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSZXR1cm4gYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhCi0gICBjb3B5IG9mIEFCRkQncyBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzLiAgUmV0dXJuIC0xIGlmIGFuIGVycm9yCi0gICBvY2N1cnM7IGJmZF9nZXRfZXJyb3Igd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgY29kZS4gICovCi1leHRlcm4gbG9uZyBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0vKiBDb3B5IEFCRkQncyBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIHRvICpQSERSUy4gIFRoZSBlbnRyaWVzCi0gICB3aWxsIGJlIHN0b3JlZCBhcyBhbiBhcnJheSBvZiBFbGZfSW50ZXJuYWxfUGhkciBzdHJ1Y3R1cmVzLCBhcwotICAgZGVmaW5lZCBpbiBpbmNsdWRlL2VsZi9pbnRlcm5hbC5oLiAgVG8gZmluZCBvdXQgaG93IGxhcmdlIHRoZQotICAgYnVmZmVyIG5lZWRzIHRvIGJlLCBjYWxsIGJmZF9nZXRfZWxmX3BoZHJfdXBwZXJfYm91bmQuCi0KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXMgcmVhZCwgb3IgLTEgaWYgYW4KLSAgIGVycm9yIG9jY3VyczsgYmZkX2dldF9lcnJvciB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSBjb2RlLiAgKi8KLWV4dGVybiBpbnQgYmZkX2dldF9lbGZfcGhkcnMgUEFSQU1TICgoYmZkICphYmZkLCB2b2lkICpwaGRycykpOwotCi0vKiBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwgc3RydWN0IHNlYyAqKiwKLQkgICBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIExpbnV4IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBiZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX202OGtsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zcGFyY2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBtbWFwIGhhY2tzICovCi0KLXN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbDsKLXR5cGVkZWYgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsIGJmZF93aW5kb3dfaW50ZXJuYWw7Ci0KLXR5cGVkZWYgc3RydWN0IF9iZmRfd2luZG93IHsKLSAgLyogV2hhdCB0aGUgdXNlciBhc2tlZCBmb3IuICAqLwotICBQVFIgZGF0YTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBUaGUgYWN0dWFsIHdpbmRvdyB1c2VkIGJ5IEJGRC4gIFNtYWxsIHVzZXItcmVxdWVzdGVkIHJlYWQtb25seQotICAgICByZWdpb25zIHNoYXJpbmcgYSBwYWdlIG1heSBzaGFyZSBhIHNpbmdsZSB3aW5kb3cgaW50byB0aGUgb2JqZWN0Ci0gICAgIGZpbGUuICBSZWFkLXdyaXRlIHZlcnNpb25zIHNob3VsZG4ndCB1bnRpbCBJJ3ZlIGZpeGVkIHRoaW5ncyB0bwotICAgICBrZWVwIHRyYWNrIG9mIHdoaWNoIHBvcnRpb25zIGhhdmUgYmVlbiBjbGFpbWVkIGJ5IHRoZQotICAgICBhcHBsaWNhdGlvbjsgZG9uJ3Qgd2FudCB0byBnaXZlIHRoZSBzYW1lIHJlZ2lvbiBiYWNrIHdoZW4gdGhlCi0gICAgIGFwcGxpY2F0aW9uIHdhbnRzIHR3byB3cml0YWJsZSBjb3BpZXMhICAqLwotICBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgKmk7Ci19IGJmZF93aW5kb3c7Ci0KLWV4dGVybiB2b2lkIGJmZF9pbml0X3dpbmRvdyBQQVJBTVMgKChiZmRfd2luZG93ICopKTsKLWV4dGVybiB2b2lkIGJmZF9mcmVlX3dpbmRvdyBQQVJBTVMgKChiZmRfd2luZG93ICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9nZXRfZmlsZV93aW5kb3cKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlLCBiZmRfd2luZG93ICosIGJvb2xlYW4pKTsKLQotLyogWENPRkYgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3NpemVfdHlwZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwKLQkgICBpbnQsIGJvb2xlYW4sIGJvb2xlYW4sIHN0cnVjdCBzZWMgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIENPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBpbnRlcm5hbF9zeW1lbnQ7Ci11bmlvbiBpbnRlcm5hbF9hdXhlbnQ7Ci0jZW5kaWYKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfZ2V0X3N5bWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfZ2V0X2F1eGVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBpbnQsIHVuaW9uIGludGVybmFsX2F1eGVudCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgaW50KSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFBFIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fcGVfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgaW50KSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEVMRiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBBbmQgbW9yZSBmcm9tIHRoZSBzb3VyY2UuICAqLwpkaWZmIC0tZ2l0IGEvYmZkL2JmZC1pbjIuaCBiL2JmZC9iZmQtaW4yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMWM1YjkuLjAwMDAwMDAKLS0tIGEvYmZkL2JmZC1pbjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMzEgKzAsMCBAQAotLyogTWFpbiBoZWFkZXIgZmlsZSBmb3IgdGhlIGJmZCBsaWJyYXJ5IC0tIHBvcnRhYmxlIGFjY2VzcyB0byBvYmplY3QgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogYmZkLmggYW5kIGJmZC1pbjIuaCBhcmUgR0VORVJBVEVEIGZpbGVzLiAgRG9uJ3QgY2hhbmdlIHRoZW07Ci0qKiBpbnN0ZWFkLCBjaGFuZ2UgYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGVzZSBmaWxlcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBiZmQuaCAtLSBUaGUgb25seSBoZWFkZXIgZmlsZSByZXF1aXJlZCBieSB1c2VycyBvZiB0aGUgYmZkIGxpYnJhcnkgCi0KLVRoZSBiZmQuaCBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGJmZC1pbi5oIGFuZCB2YXJpb3VzIC5jIGZpbGVzOyBpZiB5b3UKLWNoYW5nZSBpdCwgeW91ciBjaGFuZ2VzIHdpbGwgcHJvYmFibHkgYmUgbG9zdC4KLQotQWxsIHRoZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyBmb2xsb3dpbmcgdGhlIGNvbW1lbnQgIlRIRSBGT0xMT1dJTkcKLUlTIEVYVFJBQ1RFRCBGUk9NIFRIRSBTT1VSQ0UiIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGZpbGVzIGZvcgotQkZELiAgSWYgeW91IGNoYW5nZSBpdCwgc29tZW9uZSBvbmVkYXkgd2lsbCBleHRyYWN0IGl0IGZyb20gdGhlIHNvdXJjZQotYWdhaW4sIGFuZCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0LiAgVG8gc2F2ZSB5b3Vyc2VsZiBmcm9tIHRoaXMgYmluZCwKLWNoYW5nZSB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgYmZkIGRpcmVjdG9yeS4gIFR5cGUgIm1ha2UKLWRvY3MiIGFuZCB0aGVuICJtYWtlIGhlYWRlcnMiIGluIHRoYXQgZGlyZWN0b3J5LCBhbmQgbWFnaWNhbGx5IHRoaXMgZmlsZQotd2lsbCBjaGFuZ2UgdG8gcmVmbGVjdCB5b3VyIGNoYW5nZXMuCi0KLUlmIHlvdSBkb24ndCBoYXZlIHRoZSB0b29scyB0byBwZXJmb3JtIHRoZSBleHRyYWN0aW9uLCB0aGVuIHlvdSBhcmUKLXNhZmUgZnJvbSBzb21lb25lIG9uIHlvdXIgc3lzdGVtIHRyYW1wbGluZyBvdmVyIHlvdXIgaGVhZGVyIGZpbGVzLgotWW91IHNob3VsZCBzdGlsbCBtYWludGFpbiB0aGUgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0aGlzCi1maWxlIHRob3VnaDsgZXZlcnkgY2hhbmdlIHlvdSBtYWtlIHRvIHRoZSAuYyBmaWxlIHNob3VsZCBiZSByZWZsZWN0ZWQKLWhlcmUuICAqLwotCi0jaWZuZGVmIF9fQkZEX0hfU0VFTl9fCi0jZGVmaW5lIF9fQkZEX0hfU0VFTl9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHR3byBsaW5lcyBnZXQgc3Vic3RpdHV0aW9ucyBkb25lIGJ5IGNvbW1hbmRzIGluIE1ha2VmaWxlLmluLiAgKi8KLSNkZWZpbmUgQkZEX1ZFUlNJT04gICJAVkVSU0lPTkAiCi0jZGVmaW5lIEJGRF9BUkNIX1NJWkUgQHdvcmRzaXplQAotI2RlZmluZSBCRkRfSE9TVF82NEJJVF9MT05HIEBCRkRfSE9TVF82NEJJVF9MT05HQAotI2lmIEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLSNkZWZpbmUgQkZEX0hPU1RfNjRfQklUIEBCRkRfSE9TVF82NF9CSVRACi0jZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIEBCRkRfSE9TVF9VXzY0X0JJVEAKLSNlbmRpZgotCi0jaWYgQkZEX0FSQ0hfU0laRSA+PSA2NAotI2RlZmluZSBCRkQ2NAotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWYgX19HTlVDX18gPj0gMgotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBfYmZkIGJmZDsKLQotLyogVG8gc3F1ZWxjaCBlcnJvbmVvdXMgY29tcGlsZXIgd2FybmluZ3MgKCJpbGxlZ2FsIHBvaW50ZXIKLSAgIGNvbWJpbmF0aW9uIikgZnJvbSB0aGUgU1ZSMyBjb21waWxlciwgd2Ugd291bGQgbGlrZSB0byB0eXBlZGVmCi0gICBib29sZWFuIHRvIGludCAoaXQgZG9lc24ndCBsaWtlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYm9vbGVhbi4KLSAgIE1ha2luZyBzdXJlIHRoZXkgYXJlIG5ldmVyIGltcGxpY2l0bHkgZGVjbGFyZWQgdG8gcmV0dXJuIGludAotICAgZG9lc24ndCBzZWVtIHRvIGhlbHApLiAgQnV0IHRoaXMgZmlsZSBpcyBub3QgY29uZmlndXJlZCBiYXNlZCBvbgotICAgdGhlIGhvc3QuICAqLwotLyogR2VuZXJhbCBydWxlczogZnVuY3Rpb25zIHdoaWNoIGFyZSBib29sZWFuIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKLSAgIGFuZCBmYWxzZSBvbiBmYWlsdXJlICh1bmxlc3MgdGhleSdyZSBhIHByZWRpY2F0ZSkuICAgLS0gYmZkLmRvYyAqLwotLyogSSdtIHN1cmUgdGhpcyBpcyBnb2luZyB0byBicmVhayBzb21ldGhpbmcgYW5kIHNvbWVvbmUgaXMgZ29pbmcgdG8KLSAgIGZvcmNlIG1lIHRvIGNoYW5nZSBpdC4gKi8KLS8qIHR5cGVkZWYgZW51bSBib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsgKi8KLS8qIFl1cCwgU1ZSNCBoYXMgYSAidHlwZWRlZiBlbnVtIGJvb2xlYW4iIGluIDxzeXMvdHlwZXMuaD4gIC1mbmYgKi8KLS8qIEl0IGdldHMgd29yc2UgaWYgdGhlIGhvc3QgYWxzbyBkZWZpbmVzIGEgdHJ1ZS9mYWxzZSBlbnVtLi4uIC1zdHMgKi8KLS8qIEFuZCBldmVuIHdvcnNlIGlmIHlvdXIgY29tcGlsZXIgaGFzIGJ1aWx0LWluIGJvb2xlYW4gdHlwZXMuLi4gLWxhdyAqLwotI2lmIGRlZmluZWQgKF9fR05VR19fKSAmJiAoX19HTlVDX01JTk9SX18gPiA1KQotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmCi0jaWZkZWYgTVBXCi0vKiBQcmUtZW1wdGl2ZSBzdHJpa2UgLSBnZXQgdGhlIGZpbGUgd2l0aCB0aGUgZW51bS4gKi8KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmIC8qIE1QVyAqLwotI2lmbmRlZiBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsKLSNkZWZpbmUgQkZEX1RSVUVfRkFMU0UKLSNlbHNlCi0vKiBVc2UgZW51bSBuYW1lcyB0aGF0IHdpbGwgYXBwZWFyIG5vd2hlcmUgZWxzZS4gICovCi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2JmZF9mZmZhbHNlLCBiZmRfdHR0cnVlfSBib29sZWFuOwotI2VuZGlmCi0KLS8qIEEgcG9pbnRlciB0byBhIHBvc2l0aW9uIGluIGEgZmlsZS4gICovCi0vKiBGSVhNRTogIFRoaXMgc2hvdWxkIGJlIHVzaW5nIG9mZl90IGZyb20gPHN5cy90eXBlcy5oPi4KLSAgIEZvciBub3csIHRyeSB0byBhdm9pZCBicmVha2luZyBzdHVmZiBieSBub3QgaW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gaGVyZS4KLSAgIFRoaXMgd2lsbCBicmVhayBvbiBzeXN0ZW1zIHdpdGggNjQtYml0IGZpbGUgb2Zmc2V0cyAoZS5nLiA0LjRCU0QpLgotICAgUHJvYmFibHkgdGhlIGJlc3QgbG9uZy10ZXJtIGFuc3dlciBpcyB0byBhdm9pZCB1c2luZyBmaWxlX3B0ciBBTkQgb2ZmX3QgCi0gICBpbiB0aGlzIGhlYWRlciBmaWxlLCBhbmQgdG8gaGFuZGxlIHRoaXMgaW4gdGhlIEJGRCBpbXBsZW1lbnRhdGlvbgotICAgcmF0aGVyIHRoYW4gaW4gaXRzIGludGVyZmFjZS4gICovCi0vKiB0eXBlZGVmIG9mZl90CWZpbGVfcHRyOyAqLwotdHlwZWRlZiBsb25nIGludCBmaWxlX3B0cjsKLQotLyogU3VwcG9ydCBmb3IgZGlmZmVyZW50IHNpemVzIG9mIHRhcmdldCBmb3JtYXQgaW50cyBhbmQgYWRkcmVzc2VzLgotICAgSWYgdGhlIHR5cGUgYGxvbmcnIGlzIGF0IGxlYXN0IDY0IGJpdHMsIEJGRF9IT1NUXzY0QklUX0xPTkcgd2lsbCBiZQotICAgc2V0IHRvIDEgYWJvdmUuICBPdGhlcndpc2UsIGlmIGdjYyBpcyBiZWluZyB1c2VkLCB0aGlzIGNvZGUgd2lsbAotICAgdXNlIGdjYydzICJsb25nIGxvbmciIHR5cGUuICBPdGhlcndpc2UsIEJGRF9IT1NUXzY0X0JJVCBtdXN0IGJlCi0gICBkZWZpbmVkIGFib3ZlLiAgKi8KLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSMgaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotIyAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nCi0jICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZwotIyBlbHNlCi0jICBpZmRlZiBfX0dOVUNfXwotIyAgIGlmIF9fR05VQ19fID49IDIKLSMgICAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nIGxvbmcKLSMgICAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcgbG9uZwotIyAgIGVuZGlmIC8qIF9fR05VQ19fID49IDIgKi8KLSMgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19HTlVDX18pICovCi0jIGVuZGlmIC8qICEgQkZEX0hPU1RfNjRCSVRfTE9ORyAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi0jaWZkZWYgQkZENjQKLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSAjZXJyb3IgTm8gNjQgYml0IGludGVnZXIgdHlwZSBhdmFpbGFibGUKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgYmZkX3NpZ25lZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF9zaXplX3R5cGU7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIHN5bXZhbHVlOwotCi0jaWZuZGVmIGZwcmludGZfdm1hCi0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYgKHMsICIlMDE2bHgiLCB4KQotI2RlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KQotI2Vsc2UKLSNkZWZpbmUgX2JmZF9pbnQ2NF9sb3coeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSAmIDB4ZmZmZmZmZmYpKSkKLSNkZWZpbmUgX2JmZF9pbnQ2NF9oaWdoKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgPj4gMzIpICYgMHhmZmZmZmZmZikpCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgXAotICBmcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIFwKLSAgc3ByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbHNlIC8qIG5vdCBCRkQ2NCAgKi8KLQotLyogUmVwcmVzZW50IGEgdGFyZ2V0IGFkZHJlc3MuICBBbHNvIHVzZWQgYXMgYSBnZW5lcmljIHVuc2lnbmVkIHR5cGUKLSAgIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueSBhcml0aG1ldGljIHR5cGVzCi0gICB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3ZtYTsKLQotLyogQSBnZW5lcmljIHNpZ25lZCB0eXBlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueQotICAgYXJpdGhtZXRpYyB0eXBlcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gIENhbiBiZSBhc3N1bWVkIHRvIGJlIGNvbXBhdGlibGUKLSAgIHdpdGggYmZkX3ZtYSBpbiB0aGUgc2FtZSB3YXkgdGhhdCBzaWduZWQgYW5kIHVuc2lnbmVkIGludHMgYXJlIGNvbXBhdGlibGUKLSAgIChhcyBwYXJhbWV0ZXJzLCBpbiBhc3NpZ25tZW50LCBldGMpLiAgKi8KLXR5cGVkZWYgbG9uZyBiZmRfc2lnbmVkX3ZtYTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bXZhbHVlOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF9zaXplX3R5cGU7Ci0KLS8qIFByaW50IGEgYmZkX3ZtYSB4IG9uIHN0cmVhbSBzLiAgKi8KLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBmcHJpbnRmKHMsICIlMDhseCIsIHgpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZihzLCAiJTA4bHgiLCB4KQotCi0jZW5kaWYgLyogbm90IEJGRDY0ICAqLwotCi0jZGVmaW5lIHByaW50Zl92bWEoeCkgZnByaW50Zl92bWEoc3Rkb3V0LHgpCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IGZsYWd3b3JkOwkvKiAzMiBiaXRzIG9mIGZsYWdzICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYmZkX2J5dGU7Ci0MCi0vKiogRmlsZSBmb3JtYXRzICovCi0KLXR5cGVkZWYgZW51bSBiZmRfZm9ybWF0IHsKLQkgICAgICBiZmRfdW5rbm93biA9IDAsCS8qIGZpbGUgZm9ybWF0IGlzIHVua25vd24gKi8KLQkgICAgICBiZmRfb2JqZWN0LAkvKiBsaW5rZXIvYXNzZW1iZXIvY29tcGlsZXIgb3V0cHV0ICovCi0JICAgICAgYmZkX2FyY2hpdmUsCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLQkgICAgICBiZmRfY29yZSwJCS8qIGNvcmUgZHVtcCAqLwotCSAgICAgIGJmZF90eXBlX2VuZH0JLyogbWFya3MgdGhlIGVuZDsgZG9uJ3QgdXNlIGl0ISAqLwotICAgICAgICAgYmZkX2Zvcm1hdDsKLQotLyogVmFsdWVzIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBCRkQuICBUaGVzZSBhbHNvCi0gICBhcHBlYXIgaW4gdGhlIG9iamVjdF9mbGFncyBmaWVsZCBvZiB0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUsIHdoZXJlCi0gICB0aGV5IGluZGljYXRlIHRoZSBzZXQgb2YgZmxhZ3MgdXNlZCBieSB0aGF0IGJhY2tlbmQgKG5vdCBhbGwgZmxhZ3MKLSAgIGFyZSBtZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cykgKEZJWE1FOiBhdCB0aGUgbW9tZW50LAotICAgdGhlIG9iamVjdF9mbGFncyB2YWx1ZXMgaGF2ZSBtb3N0bHkganVzdCBiZWVuIGNvcGllZCBmcm9tIGJhY2tlbmQKLSAgIHRvIGFub3RoZXIsIGFuZCBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QpLiAgKi8KLQotLyogTm8gZmxhZ3MuICAqLwotI2RlZmluZSBCRkRfTk9fRkxBR1MgICAJMHgwMAotCi0vKiBCRkQgY29udGFpbnMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgSEFTX1JFTE9DICAgCTB4MDEKLQotLyogQkZEIGlzIGRpcmVjdGx5IGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBFWEVDX1AgICAgICAJMHgwMgotCi0vKiBCRkQgaGFzIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MTk5PIGluIGEKLSAgIENPRkYgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MSU5FTk8gIAkweDA0Ci0KLS8qIEJGRCBoYXMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgSEFTX0RFQlVHICAgCTB4MDgKLQotLyogQkZEIGhhcyBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgSEFTX1NZTVMgICAgCTB4MTAKLQotLyogQkZEIGhhcyBsb2NhbCBzeW1ib2xzIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MU1lNUyBpbiBhIENPRkYKLSAgIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTE9DQUxTICAJMHgyMAotCi0vKiBCRkQgaXMgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIERZTkFNSUMgICAgIAkweDQwCi0KLS8qIFRleHQgc2VjdGlvbiBpcyB3cml0ZSBwcm90ZWN0ZWQgKGlmIERfUEFHRUQgaXMgbm90IHNldCwgdGhpcyBpcwotICAgbGlrZSBhbiBhLm91dCBOTUFHSUMgZmlsZSkgKHRoZSBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dAotICAgY2xlYXJzIGl0IGZvciAtciBvciAtTikuICAqLwotI2RlZmluZSBXUF9URVhUICAgICAJMHg4MAotCi0vKiBCRkQgaXMgZHluYW1pY2FsbHkgcGFnZWQgKHRoaXMgaXMgbGlrZSBhbiBhLm91dCBaTUFHSUMgZmlsZSkgKHRoZQotICAgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQgY2xlYXJzIGl0IGZvciAtciBvciAtbiBvciAtTikuICAqLwotI2RlZmluZSBEX1BBR0VEICAgICAJMHgxMDAKLQotLyogQkZEIGlzIHJlbGF4YWJsZSAodGhpcyBtZWFucyB0aGF0IGJmZF9yZWxheF9zZWN0aW9uIG1heSBiZSBhYmxlIHRvCi0gICBkbyBzb21ldGhpbmcpIChzb21ldGltZXMgYmZkX3JlbGF4X3NlY3Rpb24gY2FuIGRvIHNvbWV0aGluZyBldmVuIGlmCi0gICB0aGlzIGlzIG5vdCBzZXQpLiAgKi8KLSNkZWZpbmUgQkZEX0lTX1JFTEFYQUJMRSAweDIwMAotCi0vKiBUaGlzIG1heSBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgb3V0IGEgQkZEIHRvIHJlcXVlc3QgdXNpbmcgYQotICAgdHJhZGl0aW9uYWwgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZCB0byByZXF1ZXN0IHRoYXQgd2hlbgotICAgd3JpdGluZyBvdXQgYW4gYS5vdXQgb2JqZWN0IHRoZSBzeW1ib2xzIG5vdCBiZSBoYXNoZWQgdG8gZWxpbWluYXRlCi0gICBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCAweDQwMAotCi0vKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIEJGRCBjb250ZW50cyBhcmUgYWN0dWFsbHkgY2FjaGVkIGluCi0gICBtZW1vcnkuICBJZiB0aGlzIGlzIHNldCwgaW9zdHJlYW0gcG9pbnRzIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotI2RlZmluZSBCRkRfSU5fTUVNT1JZIDB4ODAwCi0MCi0vKiBzeW1ib2xzIGFuZCByZWxvY2F0aW9uICovCi0KLS8qIEEgY291bnQgb2YgY2Fyc3ltcyAoY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scykuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWluZGV4OwotCi0vKiBIb3cgdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24uICAqLwotdHlwZWRlZiBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0IHJlbG9jX2hvd3RvX3R5cGU7Ci0KLSNkZWZpbmUgQkZEX05PX01PUkVfU1lNQk9MUyAoKHN5bWluZGV4KSB+MCkKLQotLyogR2VuZXJhbCBwdXJwb3NlIHBhcnQgb2YgYSBzeW1ib2wgWDsKLSAgIHRhcmdldCBzcGVjaWZpYyBwYXJ0cyBhcmUgaW4gbGliY29mZi5oLCBsaWJhb3V0LmgsIGV0Yy4gICovCi0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24pCi0jZGVmaW5lIGJmZF9nZXRfb3V0cHV0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbih4LHkpICgoeCktPnNlY3Rpb24pID0gKHkpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2Jhc2UoeCkgKCh4KS0+c2VjdGlvbi0+dm1hKQotI2RlZmluZSBiZmRfYXN5bWJvbF92YWx1ZSh4KSAoYmZkX2FzeW1ib2xfYmFzZSh4KSArICh4KS0+dmFsdWUpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX25hbWUoeCkgKCh4KS0+bmFtZSkKLS8qUGVyaGFwcyBmdXR1cmU6ICNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnNlY3Rpb24tPm93bmVyKSovCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT50aGVfYmZkKQotI2RlZmluZSBiZmRfYXN5bWJvbF9mbGF2b3VyKHgpIChiZmRfYXN5bWJvbF9iZmQoeCktPnh2ZWMtPmZsYXZvdXIpCi0KLS8qIEEgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9sLiAgKi8KLS8qIFRoaXMgaXMgYSB0eXBlIHB1biB3aXRoIHN0cnVjdCByYW5saWIgb24gcHVycG9zZSEgKi8KLXR5cGVkZWYgc3RydWN0IGNhcnN5bSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwkJLyogbG9vayBoZXJlIHRvIGZpbmQgdGhlIGZpbGUgKi8KLX0gY2Fyc3ltOwkJCS8qIHRvIG1ha2UgdGhlc2UgeW91IGNhbGwgYSBjYXJzeW1vZ2VuICovCi0KLSAgCi0vKiBVc2VkIGluIGdlbmVyYXRpbmcgYXJtYXBzIChhcmNoaXZlIHRhYmxlcyBvZiBjb250ZW50cykuCi0gICBQZXJoYXBzIGp1c3QgYSBmb3J3YXJkIGRlZmluaXRpb24gd291bGQgZG8/ICovCi1zdHJ1Y3Qgb3JsIHsJCQkvKiBvdXRwdXQgcmFubGliICovCi0gIGNoYXIgKipuYW1lOwkJCS8qIHN5bWJvbCBuYW1lICovIAotICBmaWxlX3B0ciBwb3M7CQkJLyogYmZkKiBvciBmaWxlIHBvc2l0aW9uICovCi0gIGludCBuYW1pZHg7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgKi8KLX07Ci0MCi0KLS8qIExpbmVudW1iZXIgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSB7Ci0gIHVuc2lnbmVkIGludCBsaW5lX251bWJlcjsJLyogTGluZW51bWJlciBmcm9tIHN0YXJ0IG9mIGZ1bmN0aW9uKi8gIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltOyAvKiBGdW5jdGlvbiBuYW1lICovCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHNlY3Rpb24gKi8KLSAgfSB1OwotfSBhbGVudDsKLQwKLS8qIG9iamVjdCBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLSNkZWZpbmUJYWxpZ25fcG93ZXIoYWRkciwgYWxpZ24pCVwKLQkoICgoYWRkcikgKyAoKDE8PChhbGlnbikpLTEpKSAmICgtMSA8PCAoYWxpZ24pKSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VjICpzZWNfcHRyOwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyICsgMCkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lKQotI2RlZmluZSBiZmRfc2VjdGlvbl9zaXplKGJmZCwgcHRyKSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHB0cikpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2xtYShiZmQsIHB0cikgKChwdHIpLT5sbWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhiZmQsIHB0cikgKChwdHIpLT5mbGFncyArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0cikgKChwdHIpLT51c2VyZGF0YSkKLQotI2RlZmluZSBiZmRfaXNfY29tX3NlY3Rpb24ocHRyKSAoKChwdHIpLT5mbGFncyAmIFNFQ19JU19DT01NT04pICE9IDApCi0KLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3ZtYShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT52bWEgPSAocHRyKS0+bG1hPSAodmFsKSksICgocHRyKS0+dXNlcl9zZXRfdm1hID0gKGJvb2xlYW4pdHJ1ZSksIHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+YWxpZ25tZW50X3Bvd2VyID0gKHZhbCkpLHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT51c2VyZGF0YSA9ICh2YWwpKSx0cnVlKQotCi10eXBlZGVmIHN0cnVjdCBzdGF0IHN0YXRfdHlwZTsgCi0MCi10eXBlZGVmIGVudW0gYmZkX3ByaW50X3N5bWJvbAoteyAKLSAgYmZkX3ByaW50X3N5bWJvbF9uYW1lLAotICBiZmRfcHJpbnRfc3ltYm9sX21vcmUsCi0gIGJmZF9wcmludF9zeW1ib2xfYWxsCi19IGJmZF9wcmludF9zeW1ib2xfdHlwZTsKLSAgICAKLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sIHRoYXQgbm0gbmVlZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfc3ltYm9sX2luZm8KLXsKLSAgc3ltdmFsdWUgdmFsdWU7Ci0gIGNoYXIgdHlwZTsKLSAgQ09OU1QgY2hhciAqbmFtZTsgICAgICAgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhYl90eXBlOyAgICAgLyogU3RhYiB0eXBlLiAgKi8KLSAgY2hhciBzdGFiX290aGVyOyAgICAgICAgICAgICAvKiBTdGFiIG90aGVyLiAqLwotICBzaG9ydCBzdGFiX2Rlc2M7ICAgICAgICAgICAgIC8qIFN0YWIgZGVzYy4gICovCi0gIENPTlNUIGNoYXIgKnN0YWJfbmFtZTsgICAgICAgLyogU3RyaW5nIGZvciBzdGFiIHR5cGUuICAqLwotfSBzeW1ib2xfaW5mbzsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3RhYnMgdHlwZSBjb2RlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9nZXRfc3RhYl9uYW1lIFBBUkFNUyAoKGludCkpOwotDAotLyogSGFzaCB0YWJsZSByb3V0aW5lcy4gIFRoZXJlIGlzIG5vIHdheSB0byBmcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi0KLS8qIEFuIGVsZW1lbnQgaW4gdGhlIGhhc2ggdGFibGUuICBNb3N0IHVzZXMgd2lsbCBhY3R1YWxseSB1c2UgYSBsYXJnZXIKLSAgIHN0cnVjdHVyZSwgYW5kIGFuIGluc3RhbmNlIG9mIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgZmllbGQuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIFN0cmluZyBiZWluZyBoYXNoZWQuICAqLwotICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gIC8qIEhhc2ggY29kZS4gIFRoaXMgaXMgdGhlIGZ1bGwgaGFzaCBjb2RlLCBub3QgdGhlIGluZGV4IGludG8gdGhlCi0gICAgIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoYXNoOwotfTsKLQotLyogQSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqdGFibGU7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogQSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBuZXcgZWxlbWVudHMgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZmlyc3QgZW50cnkgaXMgaXRzZWxmIGEgcG9pbnRlciB0byBhbiBlbGVtZW50LiAgV2hlbiB0aGlzCi0gICAgIGZ1bmN0aW9uIGlzIGZpcnN0IGludm9rZWQsIHRoaXMgcG9pbnRlciB3aWxsIGJlIE5VTEwuICBIb3dldmVyLAotICAgICBoYXZpbmcgdGhlIHBvaW50ZXIgcGVybWl0cyBhIGhpZXJhcmNoeSBvZiBtZXRob2QgZnVuY3Rpb25zIHRvIGJlCi0gICAgIGJ1aWx0IGVhY2ggb2Ygd2hpY2ggY2FsbHMgdGhlIGZ1bmN0aW9uIGluIHRoZSBzdXBlcmNsYXNzLiAgVGh1cwotICAgICBlYWNoIGZ1bmN0aW9uIHNob3VsZCBiZSB3cml0dGVuIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIG9mIG1lbW9yeQotICAgICBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOwotICAgLyogQW4gb2JqYWxsb2MgZm9yIHRoaXMgaGFzaCB0YWJsZS4gIFRoaXMgaXMgYSBzdHJ1Y3Qgb2JqYWxsb2MgKiwKLSAgICAgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2Ygb2JqYWxsb2MuaC4gICovCi0gIFBUUiBtZW1vcnk7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgc3BlY2lmeWluZyBhIHNpemUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiksCi0JICAgdW5zaWduZWQgaW50IHNpemUpKTsKLQotLyogRnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdGFibGVfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikpOwotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIElmIENSRUFURSBpcyB0cnVlLCBhIG5ldyBlbnRyeQotICAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHN0cmluZyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoZQotICAgQ09QWSBhcmd1bWVudCBtdXN0IGJlIHRydWUgaWYgdGhpcyByb3V0aW5lIHNob3VsZCBjb3B5IHRoZSBzdHJpbmcKLSAgIGludG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSB3aGVuIGFkZGluZyBhbiBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3JlcGxhY2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqb2xkLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbncpKTsKLQotLyogQmFzZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLQotLyogR3JhYiBzb21lIHNwYWNlIGZvciBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIFBUUiBiZmRfaGFzaF9hbGxvY2F0ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlIGluIGEgcmFuZG9tIG9yZGVyLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaAotICAgZWxlbWVudC4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgdHJhdmVyc2FsIHN0b3BzLiAgVGhlCi0gICBJTkZPIGFyZ3VtZW50IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdHJhdmVyc2UgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICBQVFIpLAotCQkJCSAgICAgICBQVFIgaW5mbykpOwotDAotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQyBwcmVwcm9jZXNzb3JzLgotICAgVGhlIHByb2JsZW0gaXMsICIzMl8iIGlzIG5vdCBhIHZhbGlkIHByZXByb2Nlc3NpbmcgdG9rZW4sIGFuZCB3ZSBkb24ndAotICAgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwgIm5sbV8zMl8iKS4gIFRoZSBYQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZQotICAgaW5uZXIgQ0FUIG1hY3JvcyB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuCi0gICBUaGVuIHRoZSBmaW5hbCBjb25jYXRlbmF0aW9uIGNhbiBiZSBkb25lLiAgKFNpZ2guKSAgKi8KLSNpZm5kZWYgQ0FUCi0jaWZkZWYgU0FCRVIKLSNkZWZpbmUgQ0FUKGEsYikJYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKQlhIyNiIyNjCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAotI2Vsc2UKLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotI2RlZmluZSBDQVQoYSxiKSBhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEjI2IjI2MKLSNkZWZpbmUgWENBVDIoYSxiKQlDQVQoYSxiKQotI2RlZmluZSBDQVQ0KGEsYixjLGQpCVhDQVQyKENBVChhLGIpLENBVChjLGQpKQotI2Vsc2UKLSNkZWZpbmUgQ0FUKGEsYikgYS8qKi9iCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEvKiovYi8qKi9jCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYS8qKi9iLyoqL2MvKiovZAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfU1dBUF9UQUJMRSAoUFRSKSAmYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUKLQwKLS8qIFVzZXIgcHJvZ3JhbSBhY2Nlc3MgdG8gQkZEIGZhY2lsaXRpZXMgKi8KLQotLyogRGlyZWN0IEkvTyByb3V0aW5lcywgZm9yIHByb2dyYW1zIHdoaWNoIGtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0Ci0gICBmaWxlIHRoYW4gQkZEIGRvZXMuICBVc2UgaGlnaGVyIGxldmVsIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAgKi8KLQotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3JlYWQKLSAgUEFSQU1TICgoUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF93cml0ZQotICBQQVJBTVMgKChjb25zdCBQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc2VlayBQQVJBTVMgKChiZmQgKmFiZmQsIGZpbGVfcHRyIGZwLCBpbnQgZGlyZWN0aW9uKSk7Ci1leHRlcm4gbG9uZyBiZmRfdGVsbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc3RhdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICopKTsKLQotCi0vKiBDYXN0IGZyb20gY29uc3QgY2hhciAqIHRvIGNoYXIgKiBzbyB0aGF0IGNhbGxlciBjYW4gYXNzaWduIHRvCi0gICBhIGNoYXIgKiB3aXRob3V0IGEgd2FybmluZy4gICovCi0jZGVmaW5lIGJmZF9nZXRfZmlsZW5hbWUoYWJmZCkgKChjaGFyICopIChhYmZkKS0+ZmlsZW5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfY2FjaGVhYmxlKGFiZmQpICgoYWJmZCktPmNhY2hlYWJsZSkKLSNkZWZpbmUgYmZkX2dldF9mb3JtYXQoYWJmZCkgKChhYmZkKS0+Zm9ybWF0KQotI2RlZmluZSBiZmRfZ2V0X3RhcmdldChhYmZkKSAoKGFiZmQpLT54dmVjLT5uYW1lKQotI2RlZmluZSBiZmRfZ2V0X2ZsYXZvdXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+Zmxhdm91cikKLSNkZWZpbmUgYmZkX2JpZ19lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfbGl0dGxlX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9oZWFkZXJfYmlnX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT5mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5vYmplY3RfZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+c2VjdGlvbl9mbGFncykKLSNkZWZpbmUgYmZkX215X2FyY2hpdmUoYWJmZCkgKChhYmZkKS0+bXlfYXJjaGl2ZSkKLSNkZWZpbmUgYmZkX2hhc19tYXAoYWJmZCkgKChhYmZkKS0+aGFzX2FybWFwKQotCi0jZGVmaW5lIGJmZF92YWxpZF9yZWxvY190eXBlcyhhYmZkKSAoKGFiZmQpLT54dmVjLT52YWxpZF9yZWxvY190eXBlcykKLSNkZWZpbmUgYmZkX3VzcmRhdGEoYWJmZCkgKChhYmZkKS0+dXNyZGF0YSkKLQotI2RlZmluZSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCkgKChhYmZkKS0+c3RhcnRfYWRkcmVzcykKLSNkZWZpbmUgYmZkX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLSNkZWZpbmUgYmZkX2dldF9vdXRzeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIGJmZF9jb3VudF9zZWN0aW9ucyhhYmZkKSAoKGFiZmQpLT5zZWN0aW9uX2NvdW50KQotCi0jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcihhYmZkKSAoKGFiZmQpLT54dmVjLT5zeW1ib2xfbGVhZGluZ19jaGFyKQotCi0jZGVmaW5lIGJmZF9zZXRfY2FjaGVhYmxlKGFiZmQsYm9vbCkgKCgoYWJmZCktPmNhY2hlYWJsZSA9IChib29sZWFuKShib29sKSksIHRydWUpCi0KLWV4dGVybiBib29sZWFuIGJmZF9yZWNvcmRfcGhkcgotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwgZmxhZ3dvcmQsIGJvb2xlYW4sIGJmZF92bWEsCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEJ5dGUgc3dhcHBpbmcgcm91dGluZXMuICAqLwotCi1iZmRfdm1hCQliZmRfZ2V0YjY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYSAJYmZkX2dldGw2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGw2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci0MCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUNPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvOwotc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXA7Ci1zdHJ1Y3QgZWNvZmZfZXh0cjsKLXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7Ci1zdHJ1Y3QgYmZkX2xpbmtfaW5mbzsKLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Owotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlOwotI2VuZGlmCi1leHRlcm4gYmZkX3ZtYSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfdm1hIGdwX3ZhbHVlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyBncHJtYXNrLCB1bnNpZ25lZCBsb25nIGZwcm1hc2ssCi0JICAgdW5zaWduZWQgbG9uZyAqY3BybWFzaykpOwotZXh0ZXJuIFBUUiBiZmRfZWNvZmZfZGVidWdfaW5pdAotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9lY29mZl9kZWJ1Z19mcmVlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlucHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsIGJmZCAqaW5wdXRfYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0JICAgYm9vbGVhbiAoKmdldF9leHRyKSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJCXN0cnVjdCBlY29mZl9leHRyICopLAotCSAgIHZvaWQgKCpzZXRfaW5kZXgpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkgICAgICBiZmRfc2l6ZV90eXBlKSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqZXN5bSkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX2Vjb2ZmX2RlYnVnX3NpemUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9kZWJ1ZwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZwotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiwgc3RydWN0IHNlYyAqLAotCSAgIGNoYXIgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVMRiByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdAotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5leHQ7Ci0gIGJmZCAqYnk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfZWxmX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZWxmX2dldF9kdF9zb25hbWUgUEFSQU1TICgoYmZkICopKTsKLQotLyogUmV0dXJuIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYQotICAgY29weSBvZiBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcy4gIFJldHVybiAtMSBpZiBhbiBlcnJvcgotICAgb2NjdXJzOyBiZmRfZ2V0X2Vycm9yIHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGNvZGUuICAqLwotZXh0ZXJuIGxvbmcgYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogQ29weSBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcyB0byAqUEhEUlMuICBUaGUgZW50cmllcwotICAgd2lsbCBiZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgRWxmX0ludGVybmFsX1BoZHIgc3RydWN0dXJlcywgYXMKLSAgIGRlZmluZWQgaW4gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4gIFRvIGZpbmQgb3V0IGhvdyBsYXJnZSB0aGUKLSAgIGJ1ZmZlciBuZWVkcyB0byBiZSwgY2FsbCBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIHJlYWQsIG9yIC0xIGlmIGFuCi0gICBlcnJvciBvY2N1cnM7IGJmZF9nZXRfZXJyb3Igd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgY29kZS4gICovCi1leHRlcm4gaW50IGJmZF9nZXRfZWxmX3BoZHJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqcGhkcnMpKTsKLQotLyogU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IHNlYyAqKikpOwotCi0vKiBMaW51eCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogbW1hcCBoYWNrcyAqLwotCi1zdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWw7Ci10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCBiZmRfd2luZG93X2ludGVybmFsOwotCi10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvdyB7Ci0gIC8qIFdoYXQgdGhlIHVzZXIgYXNrZWQgZm9yLiAgKi8KLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogVGhlIGFjdHVhbCB3aW5kb3cgdXNlZCBieSBCRkQuICBTbWFsbCB1c2VyLXJlcXVlc3RlZCByZWFkLW9ubHkKLSAgICAgcmVnaW9ucyBzaGFyaW5nIGEgcGFnZSBtYXkgc2hhcmUgYSBzaW5nbGUgd2luZG93IGludG8gdGhlIG9iamVjdAotICAgICBmaWxlLiAgUmVhZC13cml0ZSB2ZXJzaW9ucyBzaG91bGRuJ3QgdW50aWwgSSd2ZSBmaXhlZCB0aGluZ3MgdG8KLSAgICAga2VlcCB0cmFjayBvZiB3aGljaCBwb3J0aW9ucyBoYXZlIGJlZW4gY2xhaW1lZCBieSB0aGUKLSAgICAgYXBwbGljYXRpb247IGRvbid0IHdhbnQgdG8gZ2l2ZSB0aGUgc2FtZSByZWdpb24gYmFjayB3aGVuIHRoZQotICAgICBhcHBsaWNhdGlvbiB3YW50cyB0d28gd3JpdGFibGUgY29waWVzISAgKi8KLSAgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsICppOwotfSBiZmRfd2luZG93OwotCi1leHRlcm4gdm9pZCBiZmRfaW5pdF93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZnJlZV93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZ2V0X2ZpbGVfd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSwgYmZkX3dpbmRvdyAqLCBib29sZWFuKSk7Ci0KLS8qIFhDT0ZGIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9leHBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sCi0JICAgaW50LCBib29sZWFuLCBib29sZWFuLCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgaW50ZXJuYWxfc3ltZW50OwotdW5pb24gaW50ZXJuYWxfYXV4ZW50OwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9zeW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9hdXhlbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgaW50LCB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHVuc2lnbmVkIGludCkpOwotCi0vKiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBQRSBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3BlX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBFTEYgQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgZnJvbSB0aGUgc291cmNlLiAgKi8KLXZvaWQgCi1iZmRfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCkpOwotCi1iZmQgKgotYmZkX2Zkb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCwgaW50IGZkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnN0cmVhbXIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFBUUikpOwotCi1iZmQgKgotYmZkX29wZW53IFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZV9hbGxfZG9uZSBQQVJBTVMgKChiZmQgKikpOwotCi1iZmQgKgotYmZkX2NyZWF0ZSBQQVJBTVMgKChDT05TVCBjaGFyICpmaWxlbmFtZSwgYmZkICp0ZW1wbCkpOwotCi1ib29sZWFuIAotYmZkX21ha2Vfd3JpdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfbWFrZV9yZWFkYWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKi8KLQotI2RlZmluZSBiZmRfcHV0XzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICAoKHZvaWQpICgqKCh1bnNpZ25lZCBjaGFyICopKHB0cikpID0gKHVuc2lnbmVkIGNoYXIpKHZhbCkpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF84IFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOAotI2RlZmluZSBiZmRfZ2V0XzgoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgKCgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSBeIDB4ODApIC0gMHg4MCkKLQotI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHgxNiwgKCh2YWwpLChwdHIpKSkKLSNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMTYgXAotICAgICAgICAgICAgICAgIGJmZF9wdXRfMTYKLSNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDE2LCAocHRyKSkKLSNkZWZpbmUgYmZkX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQgKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MzIsICgodmFsKSwocHRyKSkpCi0jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzMyIFwKLSAgICAgICAgICAgICAgICBiZmRfcHV0XzMyCi0jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgzMiwgKHB0cikpCi0jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzMyKGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4NjQsICgodmFsKSwgKHB0cikpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCi0gICAgICAgICAgICAgICAgYmZkX3B1dF82NAotI2RlZmluZSBiZmRfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4NjQsIChwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9nZXQoYml0cywgYWJmZCwgcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX2dldF84IChhYmZkLCBwdHIpICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMTYgPyBiZmRfZ2V0XzE2IChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMzIgPyBiZmRfZ2V0XzMyIChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gNjQgPyBiZmRfZ2V0XzY0IChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksIChiZmRfdm1hKSAtIDEpKQotCi0jZGVmaW5lIGJmZF9wdXQoYml0cywgYWJmZCwgdmFsLCBwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMTYgPyBiZmRfcHV0XzE2IChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMzIgPyBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gNjQgPyBiZmRfcHV0XzY0IChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksICh2b2lkKSAwKSkKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIGZpbGUgaGVhZGVyIGRhdGEuICAqLwotCi0jZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgYmZkX2dldF84IChhYmZkLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIHB0cikKLQotI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MTYsKHZhbCxwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzE2IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfMTYKLSNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgxNiwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX2hfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDMyLCh2YWwscHRyKSkKLSNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCi0gICAgICAgICAgICAgICAgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MzIsKHB0cikpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9oX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzY0IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgYmZkX2hfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYSBjb21kYXQgc2VjdGlvbiwgYXMgaW4gUEUuICBBIGNvbWRhdAotICAgIHNlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBzeW1ib2wuICBXaGVuIHRoZSBsaW5rZXIKLSAgICBzZWVzIGEgY29tZGF0IHNlY3Rpb24sIGl0IGtlZXBzIG9ubHkgb25lIG9mIHRoZSBzZWN0aW9ucyB3aXRoIGEKLSAgICBnaXZlbiBuYW1lIGFuZCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBzeW1ib2wuICovCi0KLXN0cnVjdCBiZmRfY29tZGF0X2luZm8KLXsKLSAgIC8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgY29tZGF0IHNlY3Rpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAvKiBUaGUgbG9jYWwgc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEKLSAgICAgY29tZGF0IHNlY3Rpb24uICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICAgIHNwZWNpZmljIGNvZGU7IGl0IGlzIG5vdCBhbiBpbmRleCBpbnRvIHRoZSBsaXN0IHJldHVybmVkIGJ5Ci0gICAgIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLiAgKi8KLSAgbG9uZyBzeW1ib2w7Ci0KLSAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyBiZWluZyBkaXNjYXJkZWQsIHRoZSBsaW5rZXIgdXNlcyB0aGlzIGZpZWxkCi0gICAgIHRvIHBvaW50IHRvIHRoZSBpbnB1dCBzZWN0aW9uIHdoaWNoIGlzIGJlaW5nIGtlcHQuICAqLwotICBzdHJ1Y3Qgc2VjICpzZWM7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBzZWMKLXsKLSAgICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uOyB0aGUgbmFtZSBpc24ndCBhIGNvcHksIHRoZSBwb2ludGVyIGlzCi0gICAgICAgIHRoZSBzYW1lIGFzIHRoYXQgcGFzc2VkIHRvIGJmZF9tYWtlX3NlY3Rpb24uICovCi0KLSAgICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICAgICAvKiBXaGljaCBzZWN0aW9uIGlzIGl0OyAwLi5udGguICAgICAgKi8KLQotICAgaW50IGluZGV4OwotCi0gICAgICAgICAvKiBUaGUgbmV4dCBzZWN0aW9uIGluIHRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgQkZELCBvciBOVUxMLiAqLwotCi0gICAgc3RydWN0IHNlYyAqbmV4dDsKLQotICAgICAgICAgLyogVGhlIGZpZWxkIGZsYWdzIGNvbnRhaW5zIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24uIFNvbWUKLSAgICAgICAgICAgZmxhZ3MgYXJlIHJlYWQgaW4gZnJvbSB0aGUgb2JqZWN0IGZpbGUsIGFuZCBzb21lIGFyZQotICAgICAgICAgICBzeW50aGVzaXplZCBmcm9tIG90aGVyIGluZm9ybWF0aW9uLiAgKi8KLQotICAgIGZsYWd3b3JkIGZsYWdzOwotCi0jZGVmaW5lIFNFQ19OT19GTEFHUyAgIDB4MDAwCi0KLSAgICAgICAgIC8qIFRlbGxzIHRoZSBPUyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBzZWN0aW9uIHdoZW4gbG9hZGluZy4KLSAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSBzZWN0aW9uIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgb25seS4gKi8KLSNkZWZpbmUgU0VDX0FMTE9DICAgICAgMHgwMDEKLQotICAgICAgICAgLyogVGVsbHMgdGhlIE9TIHRvIGxvYWQgdGhlIHNlY3Rpb24gZnJvbSB0aGUgZmlsZSB3aGVuIGxvYWRpbmcuCi0gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgLmJzcyBzZWN0aW9uLiAqLwotI2RlZmluZSBTRUNfTE9BRCAgICAgICAweDAwMgotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIHN0aWxsIHRvIGJlIHJlbG9jYXRlZCwgc28gdGhlcmUgaXMKLSAgICAgICAgICAgc29tZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvby4gKi8KLSNkZWZpbmUgU0VDX1JFTE9DICAgICAgMHgwMDQKLQotI2lmIDAgICAgLyogT2Jzb2xldGUgPyAqLwotI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAotI2VuZGlmCi0KLSAgICAgICAgIC8qIEEgc2lnbmFsIHRvIHRoZSBPUyB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zIHJlYWQgb25seQotICAgICAgICAgIGRhdGEuICovCi0jZGVmaW5lIFNFQ19SRUFET05MWSAgIDB4MDEwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvZGUgb25seS4gKi8KLSNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBvbmx5LiAqLwotI2RlZmluZSBTRUNfREFUQSAgICAgICAweDA0MAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICovCi0jZGVmaW5lIFNFQ19ST00gICAgICAgIDB4MDgwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uLiBUaGlzIHNlY3Rpb24KLSAgICAgICAgICAgdHlwZSBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gY3JlYXRlIGxpc3RzIG9mIGNvbnN0cnVjdG9ycyBhbmQKLSAgICAgICAgICAgZGVzdHJ1Y3RvcnMgdXNlZCBieSA8PGcrKz4+LiBXaGVuIGEgYmFjayBlbmQgc2VlcyBhIHN5bWJvbAotICAgICAgICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGxpc3QsIGl0IGNyZWF0ZXMgYSBuZXcKLSAgICAgICAgICAgc2VjdGlvbiBmb3IgdGhlIHR5cGUgb2YgbmFtZSAoZS5nLiwgPDxfX0NUT1JfTElTVF9fPj4pLCBhdHRhY2hlcwotICAgICAgICAgICB0aGUgc3ltYm9sIHRvIGl0LCBhbmQgYnVpbGRzIGEgcmVsb2NhdGlvbi4gVG8gYnVpbGQgdGhlIGxpc3RzCi0gICAgICAgICAgIG9mIGNvbnN0cnVjdG9ycywgYWxsIHRoZSBsaW5rZXIgaGFzIHRvIGRvIGlzIGNhdGVuYXRlIGFsbCB0aGUKLSAgICAgICAgICAgc2VjdGlvbnMgY2FsbGVkIDw8X19DVE9SX0xJU1RfXz4+IGFuZCByZWxvY2F0ZSB0aGUgZGF0YQotICAgICAgICAgICBjb250YWluZWQgd2l0aGluIC0gZXhhY3RseSB0aGUgb3BlcmF0aW9ucyBpdCB3b3VsZCBwZWZvcm0gb24KLSAgICAgICAgICAgc3RhbmRhcmQgZGF0YS4gKi8KLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SIDB4MTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgY29uc3RydWN0b3IsIGFuZCBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZQotICAgICAgICAgIGVuZCBvZiB0aGUgdGV4dCwgZGF0YSwgb3IgYnNzIHNlY3Rpb24oPykuICovCi0jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAotI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfREFUQSAweDIxMDAKLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0JTUyAgMHgzMTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgZGF0YSBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0FMTE9DPj4gfCA8PFNFQ19IQVNfQ09OVEVOVFM+PjsgYSBkZWJ1ZyBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0hBU19DT05URU5UUz4+ICovCi0jZGVmaW5lIFNFQ19IQVNfQ09OVEVOVFMgMHgyMDAKLQotICAgICAgICAgLyogQW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGxpbmtlciB0byBub3Qgb3V0cHV0IHRoZSBzZWN0aW9uCi0gICAgICAgICAgIGV2ZW4gaWYgaXQgaGFzIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIHdyaXR0ZW4uICovCi0jZGVmaW5lIFNFQ19ORVZFUl9MT0FEIDB4NDAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgVGhpcyBmbGFnIGlzCi0gICAgICAgICAgIG9ubHkgZm9yIHRoZSBsaW5rZXIuICBJZiB0aGlzIHR5cGUgb2Ygc2VjdGlvbiBhcHBlYXJzIGluCi0gICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCB0aGUgbGlua2VyIG11c3QgY29weSBpdCB0byB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgdm1hIG9yIHNpemUuICBGSVhNRTogQWx0aG91Z2ggdGhpcwotICAgICAgICAgICB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBiZSBnZW5lcmFsLCBpdCByZWFsbHkgaXMgQ09GRgotICAgICAgICAgICBzcGVjaWZpYyAoYW5kIHRoZSBmbGFnIHdhcyByZW5hbWVkIHRvIGluZGljYXRlIHRoaXMpLiAgSXQKLSAgICAgICAgICAgbWlnaHQgYmUgY2xlYW5lciB0byBoYXZlIHNvbWUgbW9yZSBnZW5lcmFsIG1lY2hhbmlzbSB0bwotICAgICAgICAgICBhbGxvdyB0aGUgYmFjayBlbmQgdG8gY29udHJvbCB3aGF0IHRoZSBsaW5rZXIgZG9lcyB3aXRoCi0gICAgICAgICAgIHNlY3Rpb25zLiAqLwotI2RlZmluZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSAweDgwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBjb21tb24gc3ltYm9scyAoc3ltYm9scyBtYXkgYmUgZGVmaW5lZAotICAgICAgICAgICBtdWx0aXBsZSB0aW1lcywgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBhbW91bnQgb2YKLSAgICAgICAgICAgc3BhY2UgaXQgcmVxdWlyZXMsIGFuZCB0aGUgbGFyZ2VzdCBzeW1ib2wgdmFsdWUgaXMgdGhlIG9uZQotICAgICAgICAgICB1c2VkKS4gIE1vc3QgdGFyZ2V0cyBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZXNlICh3aGljaCB3ZQotICAgICAgICAgICB0cmFuc2xhdGUgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciksIGJ1dCBFQ09GRiBoYXMgdHdvLiAqLwotI2RlZmluZSBTRUNfSVNfQ09NTU9OIDB4ODAwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBvbmx5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZvcgotICAgICAgICAgICBleGFtcGxlLCB0aGlzIGlzIHNldCBmb3IgRUxGIC5kZWJ1ZyBhbmQgLnN0YWIgc2VjdGlvbnMuCi0gICAgICAgICAgIHN0cmlwIHRlc3RzIHRoaXMgZmxhZyB0byBzZWUgaWYgYSBzZWN0aW9uIGNhbiBiZQotICAgICAgICAgICBkaXNjYXJkZWQuICovCi0jZGVmaW5lIFNFQ19ERUJVR0dJTkcgMHgxMDAwMAotCi0gICAgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSBoZWxkIGluIG1lbW9yeSBwb2ludGVkIHRvCi0gICAgICAgICAgIGJ5IHRoZSBjb250ZW50cyBmaWVsZC4gIFRoaXMgaXMgY2hlY2tlZCBieQotICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbQotICAgICAgICAgICBtZW1vcnkgaWYgYXBwcm9wcmlhdGUuICAqLwotI2RlZmluZSBTRUNfSU5fTUVNT1JZIDB4MjAwMDAKLQotICAgICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgZXhjbHVkZWQgYnkgdGhlCi0gICAgICAgICAgIGxpbmtlciBmb3IgZXhlY3V0YWJsZSBhbmQgc2hhcmVkIG9iamVjdHMgdW5sZXNzIHRob3NlCi0gICAgICAgICAgIG9iamVjdHMgYXJlIHRvIGJlIGZ1cnRoZXIgcmVsb2NhdGVkLiAgKi8KLSNkZWZpbmUgU0VDX0VYQ0xVREUgMHg0MDAwMAotCi0gICAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIHNvcnRlZCBieSB0aGUKLSAgICAgICAgICBiYXNlZCBvbiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGFzc29jaWF0ZWQgc3ltYm9sCi0gICAgICAgICAgdGFibGUuICAqLwotI2RlZmluZSBTRUNfU09SVF9FTlRSSUVTIDB4ODAwMDAKLQotICAgICAgICAvKiBXaGVuIGxpbmtpbmcsIGR1cGxpY2F0ZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIHNob3VsZCBiZQotICAgICAgICAgIGRpc2NhcmRlZCwgcmF0aGVyIHRoYW4gYmVpbmcgY29tYmluZWQgaW50byBhIHNpbmdsZSBzZWN0aW9uIGFzCi0gICAgICAgICAgaXMgdXN1YWxseSBkb25lLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBjb21tb24gc3ltYm9scyBhcmUKLSAgICAgICAgICBoYW5kbGVkLiAgU2VlIFNFQ19MSU5LX0RVUExJQ0FURVMgYmVsb3cuICAqLwotI2RlZmluZSBTRUNfTElOS19PTkNFIDB4MTAwMDAwCi0KLSAgICAgICAgLyogSWYgU0VDX0xJTktfT05DRSBpcyBzZXQsIHRoaXMgYml0ZmllbGQgZGVzY3JpYmVzIGhvdyB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgc2VjdGlvbnMuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IGR1cGxpY2F0ZQotICAgICAgICAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBzaG91bGQgc2ltcGx5IGJlIGRpc2NhcmRlZC4gKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEIDB4MAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgdGhlcmUgYXJlIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMsIGFsdGhvdWdoCi0gICAgICAgICAgaXQgc2hvdWxkIHN0aWxsIG9ubHkgbGluayBvbmUgY29weS4gICovCi0jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkgMHgyMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotICAgICAgICAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGEgZGlmZmVyZW50IHNpemUuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSAweDQwMDAwMAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIgYXMgcGFydCBvZiBkeW5hbWljCi0gICAgICAgICAgcmVsb2NhdGlvbiBvciBvdGhlciBhcmNhbmUgcHJvY2Vzc2luZy4gIEl0IGlzIHNraXBwZWQgd2hlbgotICAgICAgICAgIGdvaW5nIHRocm91Z2ggdGhlIGZpcnN0LXBhc3Mgb3V0cHV0LCB0cnVzdGluZyB0aGF0IHNvbWVvbmUKLSAgICAgICAgICBlbHNlIHVwIHRoZSBsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktFUl9DUkVBVEVEIDB4ODAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHNob3VsZCBub3QgYmUgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotI2RlZmluZSBTRUNfS0VFUCAweDEwMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgInNob3J0IiBkYXRhLCBhbmQgc2hvdWxkIGJlIHBsYWNlZAotICAgICAgICAgICJuZWFyIiB0aGUgR1AuICAqLwotI2RlZmluZSBTRUNfU01BTExfREFUQSAweDIwMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGF0YSB3aGljaCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIKLSAgICAgICAgICBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cy4gICovCi0jZGVmaW5lIFNFQ19TSEFSRUQgMHg0MDAwMDAwCi0KLSAgICAgICAgLyogIEVuZCBvZiBzZWN0aW9uIGZsYWdzLiAgKi8KLQotICAgICAgICAvKiBTb21lIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICovCi0KLSAgICAgICAgLyogU2VlIHRoZSB2bWEgZmllbGQuICAqLwotICAgICAgIHVuc2lnbmVkIGludCB1c2VyX3NldF92bWEgOiAxOwotCi0gICAgICAgIC8qIFdoZXRoZXIgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gICovCi0gICAgICAgdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBvZiB0aGUgbGlua2VyIGJhY2tlbmRzLiAgKi8KLSAgICAgICB1bnNpZ25lZCBpbnQgbGlua2VyX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gICAgICAgdW5zaWduZWQgaW50IGdjX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEVuZCBvZiBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqLwotCi0gICAgICAgIC8qICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLSAgICAgICAgICAgYXQgcnVuIHRpbWUuICBUaGUgc3ltYm9scyBhcmUgcmVsb2NhdGVkIGFnYWluc3QgdGhpcy4gIFRoZQotICAgICAgICAgICB1c2VyX3NldF92bWEgZmxhZyBpcyBtYWludGFpbmVkIGJ5IGJmZDsgaWYgaXQncyBub3Qgc2V0LCB0aGUKLSAgICAgICAgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLSAgICAgICAgICAgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgPDwuZGF0YT4+IGlzIGRlcGVuZGVudCBvbiB0aGUgc3BlY2lmaWMKLSAgICAgICAgICAgdGFyZ2V0IGFuZCB2YXJpb3VzIGZsYWdzKS4gICovCi0KLSAgIGJmZF92bWEgdm1hOwotCi0gICAgICAgIC8qICBUaGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIC0gd2hlcmUgaXQgd291bGQgYmUgaW4gYQotICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLSAgICAgICAgICAgaW5mb3JtYXRpb24uICovCi0KLSAgIGJmZF92bWEgbG1hOwotCi0gICAgICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBpbiBvY3RldHMsIGFzIGl0IHdpbGwgYmUgb3V0cHV0LgotICAgICAgICAgICBDb250YWlucyBhIHZhbHVlIGV2ZW4gaWYgdGhlIHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIChlLmcuLCB0aGUKLSAgICAgICAgICAgc2l6ZSBvZiA8PC5ic3M+PikuICBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIGFmdGVyIHJlbG9jYXRpb24uICAqLwotCi0gICBiZmRfc2l6ZV90eXBlIF9jb29rZWRfc2l6ZTsKLQotICAgICAgICAgLyogVGhlIG9yaWdpbmFsIHNpemUgb24gZGlzayBvZiB0aGUgc2VjdGlvbiwgaW4gb2N0ZXRzLiAgTm9ybWFsbHkgdGhpcwotICAgICAgICAgICB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2l6ZSwgYnV0IGlmIHNvbWUgcmVsYXhpbmcgaGFzCi0gICAgICAgICAgIGJlZW4gZG9uZSwgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgYmlnZ2VyLiAgKi8KLQotICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0KLSAgICAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBvdXRwdXQsIHRoZW4gdGhpcyB2YWx1ZSBpcyB0aGUKLSAgICAgICAgICAgb2Zmc2V0IGluICpieXRlcyogaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlCi0gICAgICAgICAgIGlucHV0IHNlY3Rpb24gKGJ5dGUgPT0+IHNtYWxsZXN0IGFkZHJlc3NhYmxlIHVuaXQgb24gdGhlCi0gICAgICAgICAgIHRhcmdldCkuICBJbiBtb3N0IGNhc2VzLCBpZiB0aGlzIHdhcyBnb2luZyB0byBzdGFydCBhdCB0aGUKLSAgICAgICAgICAgMTAwdGggb2N0ZXQgKDgtYml0IHF1YW50aXR5KSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoaXMgdmFsdWUKLSAgICAgICAgICAgd291bGQgYmUgMTAwLiAgSG93ZXZlciwgaWYgdGhlIHRhcmdldCBieXRlIHNpemUgaXMgMTYgYml0cwotICAgICAgICAgICAoYmZkX29jdGV0c19wZXJfYnl0ZSBpcyAiMiIpLCB0aGlzIHZhbHVlIHdvdWxkIGJlIDUwLiAqLwotCi0gICBiZmRfdm1hIG91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgICAgIC8qIFRoZSBvdXRwdXQgc2VjdGlvbiB0aHJvdWdoIHdoaWNoIHRvIG1hcCBvbiBvdXRwdXQuICovCi0KLSAgIHN0cnVjdCBzZWMgKm91dHB1dF9zZWN0aW9uOwotCi0gICAgICAgICAvKiBUaGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIHRoZSBzZWN0aW9uLCBhcyBhbiBleHBvbmVudCBvZiAyIC0KLSAgICAgICAgICAgZS5nLiwgMyBhbGlnbnMgdG8gMl4zIChvciA4KS4gKi8KLQotICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLQotICAgICAgICAgLyogSWYgYW4gaW5wdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHJlbG9jYXRpb24KLSAgICAgICAgICAgcmVjb3JkcyBmb3IgdGhlIGRhdGEgaW4gdGhpcyBzZWN0aW9uLiAqLwotCi0gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKnJlbG9jYXRpb247Ci0KLSAgICAgICAgIC8qIElmIGFuIG91dHB1dCBzZWN0aW9uLCBhIHBvaW50ZXIgdG8gYSB2ZWN0b3Igb2YgcG9pbnRlcnMgdG8KLSAgICAgICAgICAgcmVsb2NhdGlvbiByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICovCi0KLSAgIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeSAqKm9yZWxvY2F0aW9uOwotCi0gICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gcmVjb3JkcyBpbiBvbmUgb2YgdGhlIGFib3ZlICAqLwotCi0gICB1bnNpZ25lZCByZWxvY19jb3VudDsKLQotICAgICAgICAgLyogSW5mb3JtYXRpb24gYmVsb3cgaXMgYmFjayBlbmQgc3BlY2lmaWMgLSBhbmQgbm90IGFsd2F5cyB1c2VkCi0gICAgICAgICAgIG9yIHVwZGF0ZWQuICAqLwotCi0gICAgICAgICAvKiBGaWxlIHBvc2l0aW9uIG9mIHNlY3Rpb24gZGF0YSAgICAqLwotCi0gICBmaWxlX3B0ciBmaWxlcG9zOwotCi0gICAgICAgICAvKiBGaWxlIHBvc2l0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyAqLwotCi0gICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLQotICAgICAgICAgLyogRmlsZSBwb3NpdGlvbiBvZiBsaW5lIGRhdGEgICAgICAgKi8KLQotICAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotCi0gICAgICAgICAvKiBQb2ludGVyIHRvIGRhdGEgZm9yIGFwcGxpY2F0aW9ucyAqLwotCi0gICBQVFIgdXNlcmRhdGE7Ci0KLSAgICAgICAgIC8qIElmIHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcgaXMgc2V0LCB0aGlzIHBvaW50cyB0byB0aGUgYWN0dWFsCi0gICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLSAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotCi0gICAgICAgICAvKiBBdHRhY2hlZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiAqLwotCi0gICBhbGVudCAqbGluZW5vOwotCi0gICAgICAgICAvKiBOdW1iZXIgb2YgbGluZSBudW1iZXIgcmVjb3JkcyAgICovCi0KLSAgIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0KLSAgICAgICAgIC8qIE9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgQ09NREFUIGVudHJ5OyBOVUxMIGlmIG5vdCBDT01EQVQgKi8KLQotICAgc3RydWN0IGJmZF9jb21kYXRfaW5mbyAqY29tZGF0OwotCi0gICAgICAgICAvKiBXaGVuIGEgc2VjdGlvbiBpcyBiZWluZyBvdXRwdXQsIHRoaXMgdmFsdWUgY2hhbmdlcyBhcyBtb3JlCi0gICAgICAgICAgIGxpbmVudW1iZXJzIGFyZSB3cml0dGVuIG91dCAqLwotCi0gICBmaWxlX3B0ciBtb3ZpbmdfbGluZV9maWxlcG9zOwotCi0gICAgICAgICAvKiBXaGF0IHRoZSBzZWN0aW9uIG51bWJlciBpcyBpbiB0aGUgdGFyZ2V0IHdvcmxkICAqLwotCi0gICBpbnQgdGFyZ2V0X2luZGV4OwotCi0gICBQVFIgdXNlZF9ieV9iZmQ7Ci0KLSAgICAgICAgIC8qIElmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciBzZWN0aW9uIHRoZW4gaGVyZSBpcyBhIGxpc3Qgb2YgdGhlCi0gICAgICAgICAgIHJlbG9jYXRpb25zIGNyZWF0ZWQgdG8gcmVsb2NhdGUgaXRlbXMgd2l0aGluIGl0LiAqLwotCi0gICBzdHJ1Y3QgcmVsZW50X2NoYWluICpjb25zdHJ1Y3Rvcl9jaGFpbjsKLQotICAgICAgICAgLyogVGhlIEJGRCB3aGljaCBvd25zIHRoZSBzZWN0aW9uLiAqLwotCi0gICBiZmQgKm93bmVyOwotCi0gICAgICAgICAvKiBBIHN5bWJvbCB3aGljaCBwb2ludHMgYXQgdGhpcyBzZWN0aW9uIG9ubHkgKi8KLSAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1ib2xfcHRyX3B0cjsKLQotICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX2hlYWQ7Ci0gICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXJfdGFpbDsKLX0gYXNlY3Rpb24gOwotCi0gICAgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnbG9iYWwsIGFuZCBhcmUgbWFuYWdlZCBieSBCRkQuICBUaGUgYXBwbGljYXRpb24KLSAgICAgICBhbmQgdGFyZ2V0IGJhY2sgZW5kIGFyZSBub3QgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgdmFsdWVzIGluCi0gICAgICAgdGhlc2Ugc2VjdGlvbnMuICBOZXcgY29kZSBzaG91bGQgdXNlIHRoZSBzZWN0aW9uX3B0ciBtYWNyb3MgcmF0aGVyCi0gICAgICAgdGhhbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIGNvbnN0IHNlY3Rpb25zLiAgVGhlIGNvbnN0IHNlY3Rpb25zCi0gICAgICAgbWF5IGV2ZW50dWFsbHkgdmFuaXNoLiAgKi8KLSNkZWZpbmUgQkZEX0FCU19TRUNUSU9OX05BTUUgIipBQlMqIgotI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCi0jZGVmaW5lIEJGRF9DT01fU0VDVElPTl9OQU1FICIqQ09NKiIKLSNkZWZpbmUgQkZEX0lORF9TRUNUSU9OX05BTUUgIipJTkQqIgotCi0gICAgIC8qIHRoZSBhYnNvbHV0ZSBzZWN0aW9uICovCi1leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX2Fic19zZWN0aW9uOwotI2RlZmluZSBiZmRfYWJzX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF9hYnNfc2VjdGlvbikKLSNkZWZpbmUgYmZkX2lzX2Fic19zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIHVuZGVmaW5lZCBzZWN0aW9uICovCi1leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX3VuZF9zZWN0aW9uOwotI2RlZmluZSBiZmRfdW5kX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF91bmRfc2VjdGlvbikKLSNkZWZpbmUgYmZkX2lzX3VuZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICovCi1leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX2NvbV9zZWN0aW9uOwotI2RlZmluZSBiZmRfY29tX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF9jb21fc2VjdGlvbikKLSAgICAgLyogUG9pbnRlciB0byB0aGUgaW5kaXJlY3Qgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9pbmRfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2luZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfaW5kX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc19pbmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfaW5kX3NlY3Rpb25fcHRyKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9hYnNfc3ltYm9sOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfY29tX3N5bWJvbDsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX3VuZF9zeW1ib2w7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9pbmRfc3ltYm9sOwotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2Moc2VjdGlvbikgXAotICAgICAoKHNlY3Rpb24pLT5yZWxvY19kb25lID8gKGFib3J0ICgpLCAoYmZkX3NpemVfdHlwZSkgMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHNlY3Rpb24pLT5fcmF3X3NpemUpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKChzZWN0aW9uKS0+cmVsb2NfZG9uZSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChhYm9ydCAoKSwgKGJmZF9zaXplX3R5cGUpIDEpKQotYXNlY3Rpb24gKgotYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpKTsKLQotYXNlY3Rpb24gKgotYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKm5hbWUpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGZsYWd3b3JkIGZsYWdzKSk7Ci0KLXZvaWQgCi1iZmRfbWFwX292ZXJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICphYmZkLAotICAgIHZvaWQgKCpmdW5jKShiZmQgKmFiZmQsCi0gICAgYXNlY3Rpb24gKnNlY3QsCi0gICAgUFRSIG9iaiksCi0gICAgUFRSIG9iaikpOwotCi1ib29sZWFuIAotYmZkX3NldF9zZWN0aW9uX3NpemUgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBiZmRfc2l6ZV90eXBlIHZhbCkpOwotCi1ib29sZWFuIAotYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWN0aW9uLAotICAgIFBUUiBkYXRhLAotICAgIGZpbGVfcHRyIG9mZnNldCwKLSAgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0KLWJvb2xlYW4gCi1iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgbG9jYXRpb24sCi0gICAgZmlsZV9wdHIgb2Zmc2V0LCBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGFzZWN0aW9uICppc2VjLCBiZmQgKm9iZmQsIGFzZWN0aW9uICpvc2VjKSk7Ci0KLSNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pKQotdm9pZCAKLV9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dAotIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi17Ci0gIGJmZF9hcmNoX3Vua25vd24sICAgIC8qIEZpbGUgYXJjaCBub3Qga25vd24gKi8KLSAgYmZkX2FyY2hfb2JzY3VyZSwgICAgLyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqLwotICBiZmRfYXJjaF9tNjhrLCAgICAgICAvKiBNb3Rvcm9sYSA2OHh4eCAqLwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDggMgotI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAotI2RlZmluZSBiZmRfbWFjaF9tNjgwMzAgNQotI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgotI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNwotI2RlZmluZSBiZmRfbWFjaF9jcHUzMiAgOAotICBiZmRfYXJjaF92YXgsICAgICAgICAvKiBERUMgVmF4ICovICAgCi0gIGJmZF9hcmNoX2k5NjAsICAgICAgIC8qIEludGVsIDk2MCAqLwotICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCi0gICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAotICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCi0gICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCi0gICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKLSAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAotICAgICAgICJjb3JlIi4gKi8KLQotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMwotI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4ICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfaHggICAgICAgIDgKLQotICBiZmRfYXJjaF9hMjlrLCAgICAgICAvKiBBTUQgMjkwMDAgKi8KLSAgYmZkX2FyY2hfc3BhcmMsICAgICAgLyogU1BBUkMgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmMgICAgICAgICAgICAgICAgIDEKLSAvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHY4cGx1cyBhbmQgdjkgaXMgdGhhdCB2OSBpcyBhIHRydWUgNjQgYml0IGVudi4gICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0ICAgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSAgICAgICAzCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyAgICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgICAgICAgICA1ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSAgICA2Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5ICAgICAgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YSAgICAgICAgICAgICA4ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0gLyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlfcChtYWNoKSBcCi0gICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCi0gIGJmZF9hcmNoX21pcHMsICAgICAgIC8qIE1JUFMgUnh4eHggKi8KLSNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAgICAgICAgICAgICAgIDMwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczM5MDAgICAgICAgICAgICAgIDM5MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAgICAgICAgICAgICAgIDQwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAgICAgICAgICAgICAgIDQwMTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMDAgICAgICAgICAgICAgIDQxMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEgICAgICAgICAgICAgIDQxMTEKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAgICAgICAgICAgICAgIDQzMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ0MDAgICAgICAgICAgICAgIDQ0MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAgICAgICAgICAgICAgIDQ2MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAgICAgICAgICAgICAgIDQ2NTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczUwMDAgICAgICAgICAgICAgIDUwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAgICAgICAgICAgICAgIDYwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczEwMDAwICAgICAgICAgICAgIDEwMDAwCi0jZGVmaW5lIGJmZF9tYWNoX21pcHMxNiAgICAgICAgICAgICAgICAxNgotICBiZmRfYXJjaF9pMzg2LCAgICAgICAvKiBJbnRlbCAzODYgKi8KLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCi0jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXggMgotICBiZmRfYXJjaF93ZTMyaywgICAgICAvKiBBVCZUIFdFMzJ4eHggKi8KLSAgYmZkX2FyY2hfdGFob2UsICAgICAgLyogQ0NJL0hhcnJpcyBUYWhvZSAqLwotICBiZmRfYXJjaF9pODYwLCAgICAgICAvKiBJbnRlbCA4NjAgKi8KLSAgYmZkX2FyY2hfaTM3MCwgICAgICAgLyogSUJNIDM2MC8zNzAgTWFpbmZyYW1lcyAqLwotICBiZmRfYXJjaF9yb21wLCAgICAgICAvKiBJQk0gUk9NUCBQQy9SVCAqLwotICBiZmRfYXJjaF9hbGxpYW50LCAgICAvKiBBbGxpYW50ICovCi0gIGJmZF9hcmNoX2NvbnZleCwgICAgIC8qIENvbnZleCAqLwotICBiZmRfYXJjaF9tODhrLCAgICAgICAvKiBNb3Rvcm9sYSA4OHh4eCAqLwotICBiZmRfYXJjaF9weXJhbWlkLCAgICAvKiBQeXJhbWlkIFRlY2hub2xvZ3kgKi8KLSAgYmZkX2FyY2hfaDgzMDAsICAgICAgLyogSGl0YWNoaSBIOC8zMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfaDgzMDAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2g4MzAwaCAgMgotI2RlZmluZSBiZmRfbWFjaF9oODMwMHMgIDMKLSAgYmZkX2FyY2hfcG93ZXJwYywgICAgLyogUG93ZXJQQyAqLwotICBiZmRfYXJjaF9yczYwMDAsICAgICAvKiBJQk0gUlMvNjAwMCAqLwotICBiZmRfYXJjaF9ocHBhLCAgICAgICAvKiBIUCBQQSBSSVNDICovCi0gIGJmZF9hcmNoX2QxMHYsICAgICAgIC8qIE1pdHN1YmlzaGkgRDEwViAqLwotI2RlZmluZSBiZmRfbWFjaF9kMTB2ICAgICAgICAgIDAKLSNkZWZpbmUgYmZkX21hY2hfZDEwdl90czIgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX2QxMHZfdHMzICAgICAgMwotICBiZmRfYXJjaF9kMzB2LCAgICAgICAvKiBNaXRzdWJpc2hpIEQzMFYgKi8KLSAgYmZkX2FyY2hfejhrLCAgICAgICAgLyogWmlsb2cgWjgwMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfejgwMDEgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX3o4MDAyICAgICAgICAgMgotICBiZmRfYXJjaF9oODUwMCwgICAgICAvKiBIaXRhY2hpIEg4LzUwMCAqLwotICBiZmRfYXJjaF9zaCwgICAgICAgICAvKiBIaXRhY2hpIFNIICovCi0jZGVmaW5lIGJmZF9tYWNoX3NoICAgICAgICAgICAgMAotI2RlZmluZSBiZmRfbWFjaF9zaDIgICAgICAgIDB4MjAKLSNkZWZpbmUgYmZkX21hY2hfc2hfZHNwICAgICAweDJkCi0jZGVmaW5lIGJmZF9tYWNoX3NoMyAgICAgICAgMHgzMAotI2RlZmluZSBiZmRfbWFjaF9zaDNfZHNwICAgIDB4M2QKLSNkZWZpbmUgYmZkX21hY2hfc2gzZSAgICAgICAweDNlCi0jZGVmaW5lIGJmZF9tYWNoX3NoNCAgICAgICAgMHg0MAotICBiZmRfYXJjaF9hbHBoYSwgICAgICAvKiBEZWMgQWxwaGEgKi8KLSNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY0ICAweDEwCi0jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAotI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjYgIDB4MzAKLSAgYmZkX2FyY2hfYXJtLCAgICAgICAgLyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJtXzIgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2FybV8yYSAgICAgICAgMgotI2RlZmluZSBiZmRfbWFjaF9hcm1fMyAgICAgICAgIDMKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzNNICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV80ICAgICAgICAgNQotI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgICAgICAgIDYKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzUgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV81VCAgICAgICAgOAotICBiZmRfYXJjaF9uczMyaywgICAgICAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICovCi0gIGJmZF9hcmNoX3c2NSwgICAgICAgIC8qIFdEQyA2NTgxNiAqLwotICBiZmRfYXJjaF90aWMzMCwgICAgICAvKiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKi8KLSAgYmZkX2FyY2hfdGljODAsICAgICAgLyogVEkgVE1TMzIwYzgwIChNVlApICovCi0gIGJmZF9hcmNoX3Y4NTAsICAgICAgIC8qIE5FQyBWODUwICovCi0jZGVmaW5lIGJmZF9tYWNoX3Y4NTAgICAgICAgICAgMAotI2RlZmluZSBiZmRfbWFjaF92ODUwZSAgICAgICAgICdFJwotI2RlZmluZSBiZmRfbWFjaF92ODUwZWEgICAgICAgICdBJwotICBiZmRfYXJjaF9hcmMsICAgICAgICAvKiBBcmdvbmF1dCBSSVNDIENvcmUgKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJjX2Jhc2UgMAotICBiZmRfYXJjaF9tMzJyLCAgICAgICAvKiBNaXRzdWJpc2hpIE0zMlIvRCAqLwotI2RlZmluZSBiZmRfbWFjaF9tMzJyICAgICAgICAgIDAgIC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIGJmZF9tYWNoX20zMnJ4ICAgICAgICAgJ3gnCi0gIGJmZF9hcmNoX21uMTAyMDAsICAgIC8qIE1hdHN1c2hpdGEgTU4xMDIwMCAqLwotICBiZmRfYXJjaF9tbjEwMzAwLCAgICAvKiBNYXRzdXNoaXRhIE1OMTAzMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfbW4xMDMwMCAgICAgICAgICAgICAgIDMwMAotI2RlZmluZSBiZmRfbWFjaF9hbTMzICAgICAgICAgIDMzMAotICBiZmRfYXJjaF9mcjMwLAotI2RlZmluZSBiZmRfbWFjaF9mcjMwICAgICAgICAgIDB4NDY1MjMzMzAKLSAgYmZkX2FyY2hfbWNvcmUsCi0gIGJmZF9hcmNoX3BqLAotICBiZmRfYXJjaF9hdnIsICAgICAgICAvKiBBdG1lbCBBVlIgbWljcm9jb250cm9sbGVycyAqLwotI2RlZmluZSBiZmRfbWFjaF9hdnIxICAgICAgICAgIDEKLSNkZWZpbmUgYmZkX21hY2hfYXZyMiAgICAgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX2F2cjMgICAgICAgICAgMwotI2RlZmluZSBiZmRfbWFjaF9hdnI0ICAgICAgICAgIDQKLSAgYmZkX2FyY2hfbGFzdAotICB9OwotCi10eXBlZGVmIHN0cnVjdCBiZmRfYXJjaF9pbmZvIAotewotICBpbnQgYml0c19wZXJfd29yZDsKLSAgaW50IGJpdHNfcGVyX2FkZHJlc3M7Ci0gIGludCBiaXRzX3Blcl9ieXRlOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgdW5zaWduZWQgbG9uZyBtYWNoOwotICBjb25zdCBjaGFyICphcmNoX25hbWU7Ci0gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lOwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9hbGlnbl9wb3dlcjsKLSAgLyogdHJ1ZSBpZiB0aGlzIGlzIHRoZSBkZWZhdWx0IG1hY2hpbmUgZm9yIHRoZSBhcmNoaXRlY3R1cmUgKi8KLSAgYm9vbGVhbiB0aGVfZGVmYXVsdDsgCi0gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogKCpjb21wYXRpYmxlKQotICAgICAgIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpiKSk7Ci0KLSAgYm9vbGVhbiAoKnNjYW4pIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICosIGNvbnN0IGNoYXIgKikpOwotCi0gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpuZXh0OwotfSBiZmRfYXJjaF9pbmZvX3R5cGU7Ci1jb25zdCBjaGFyICoKLWJmZF9wcmludGFibGVfbmFtZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9zY2FuX2FyY2ggUEFSQU1TICgoY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLWNvbnN0IGNoYXIgKioKLWJmZF9hcmNoX2xpc3QgUEFSQU1TICgodm9pZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgUEFSQU1TICgoCi0gICAgY29uc3QgYmZkICphYmZkLAotICAgIGNvbnN0IGJmZCAqYmJmZCkpOwotCi12b2lkIAotYmZkX3NldF9hcmNoX2luZm8gUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyZykpOwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi1iZmRfZ2V0X2FyY2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXVuc2lnbmVkIGxvbmcgCi1iZmRfZ2V0X21hY2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXVuc2lnbmVkIGludCAKLWJmZF9hcmNoX2JpdHNfcGVyX2J5dGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXVuc2lnbmVkIGludCAKLWJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIAotYmZkX2dldF9hcmNoX2luZm8gUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfbG9va3VwX2FyY2gKLSBQQVJBTVMgKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUKLSAgICBhcmNoLAotICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1jb25zdCBjaGFyICoKLWJmZF9wcmludGFibGVfYXJjaF9tYWNoCi0gUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfb2N0ZXRzX3Blcl9ieXRlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSBQQVJBTVMgKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLSAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotdHlwZWRlZiBlbnVtIGJmZF9yZWxvY19zdGF0dXMKLXsKLSAgICAgICAgLyogTm8gZXJyb3JzIGRldGVjdGVkICovCi0gIGJmZF9yZWxvY19vaywKLQotICAgICAgICAvKiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgdGhlcmUgd2FzIGFuIG92ZXJmbG93LiAqLwotICBiZmRfcmVsb2Nfb3ZlcmZsb3csCi0KLSAgICAgICAgLyogVGhlIGFkZHJlc3MgdG8gcmVsb2NhdGUgd2FzIG5vdCB3aXRoaW4gdGhlIHNlY3Rpb24gc3VwcGxpZWQuICovCi0gIGJmZF9yZWxvY19vdXRvZnJhbmdlLAotCi0gICAgICAgIC8qIFVzZWQgYnkgc3BlY2lhbCBmdW5jdGlvbnMgKi8KLSAgYmZkX3JlbG9jX2NvbnRpbnVlLAotCi0gICAgICAgIC8qIFVuc3VwcG9ydGVkIHJlbG9jYXRpb24gc2l6ZSByZXF1ZXN0ZWQuICovCi0gIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQsCi0KLSAgICAgICAgLyogVW51c2VkICovCi0gIGJmZF9yZWxvY19vdGhlciwKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIHRvIHJlbG9jYXRlIGFnYWluc3Qgd2FzIHVuZGVmaW5lZC4gKi8KLSAgYmZkX3JlbG9jX3VuZGVmaW5lZCwKLQotICAgICAgICAvKiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgbWF5IG5vdCBiZSBvayAtIHByZXNlbnRseQotICAgICAgICAgIGdlbmVyYXRlZCBvbmx5IHdoZW4gbGlua2luZyBpOTYwIGNvZmYgZmlsZXMgd2l0aCBpOTYwIGIub3V0Ci0gICAgICAgICAgc3ltYm9scy4gIElmIHRoaXMgdHlwZSBpcyByZXR1cm5lZCwgdGhlIGVycm9yX21lc3NhZ2UgYXJndW1lbnQKLSAgICAgICAgICB0byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHdpbGwgYmUgc2V0LiAgKi8KLSAgYmZkX3JlbG9jX2Rhbmdlcm91cwotIH0KLSBiZmRfcmVsb2Nfc3RhdHVzX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkKLXsKLSAgICAgICAgLyogQSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCB0YWJsZSBvZiBwb2ludGVycyAgKi8KLSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bV9wdHJfcHRyOwotCi0gICAgICAgIC8qIG9mZnNldCBpbiBzZWN0aW9uICovCi0gIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKLQotICAgICAgICAvKiBhZGRlbmQgZm9yIHJlbG9jYXRpb24gdmFsdWUgKi8KLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgICAgLyogUG9pbnRlciB0byBob3cgdG8gcGVyZm9ybSB0aGUgcmVxdWlyZWQgcmVsb2NhdGlvbiAqLwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotfSBhcmVsZW50OwotZW51bSBjb21wbGFpbl9vdmVyZmxvdwotewotICAgICAgICAvKiBEbyBub3QgY29tcGxhaW4gb24gb3ZlcmZsb3cuICovCi0gIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0KLSAgICAgICAgLyogQ29tcGxhaW4gaWYgdGhlIGJpdGZpZWxkIG92ZXJmbG93cywgd2hldGhlciBpdCBpcyBjb25zaWRlcmVkCi0gICAgICAgICAgYXMgc2lnbmVkIG9yIHVuc2lnbmVkLiAqLwotICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQotICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBzaWduZWQKLSAgICAgICAgICBudW1iZXIuICovCi0gIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQotICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBhbgotICAgICAgICAgIHVuc2lnbmVkIG51bWJlci4gKi8KLSAgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQKLX07Ci0KLXN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QKLXsKLSAgICAgICAgLyogIFRoZSB0eXBlIGZpZWxkIGhhcyBtYWlubHkgYSBkb2N1bWVudGFyeSB1c2UgLSB0aGUgYmFjayBlbmQgY2FuCi0gICAgICAgICAgIGRvIHdoYXQgaXQgd2FudHMgd2l0aCBpdCwgdGhvdWdoIG5vcm1hbGx5IHRoZSBiYWNrIGVuZCdzCi0gICAgICAgICAgIGV4dGVybmFsIGlkZWEgb2Ygd2hhdCBhIHJlbG9jIG51bWJlciBpcyBzdG9yZWQKLSAgICAgICAgICAgaW4gdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGUsIGEgUEMgcmVsYXRpdmUgd29yZCByZWxvY2F0aW9uCi0gICAgICAgICAgIGluIGEgY29mZiBlbnZpcm9ubWVudCBoYXMgdGhlIHR5cGUgMDIzIC0gYmVjYXVzZSB0aGF0J3MKLSAgICAgICAgICAgd2hhdCB0aGUgb3V0c2lkZSB3b3JsZCBjYWxscyBhIFJfUENSV09SRCByZWxvYy4gKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgICAgICAgLyogIFRoZSB2YWx1ZSB0aGUgZmluYWwgcmVsb2NhdGlvbiBpcyBzaGlmdGVkIHJpZ2h0IGJ5LiBUaGlzIGRyb3BzCi0gICAgICAgICAgIHVud2FudGVkIGRhdGEgZnJvbSB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotCi0gICAgICAgIC8qICBUaGUgc2l6ZSBvZiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzICpub3QqIGEKLSAgICAgICAgICAgcG93ZXItb2YtdHdvIG1lYXN1cmUuICBUbyBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBvcGVyYXRlZAotICAgICAgICAgICBvbiBieSBhIHR5cGUgb2YgcmVsb2NhdGlvbiwgdXNlIGJmZF9nZXRfcmVsb2Nfc2l6ZS4gICovCi0gIGludCBzaXplOwotCi0gICAgICAgIC8qICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyB1c2VkCi0gICAgICAgICAgIHdoZW4gZG9pbmcgb3ZlcmZsb3cgY2hlY2tpbmcuICAqLwotICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLQotICAgICAgICAvKiAgTm90ZXMgdGhhdCB0aGUgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlCi0gICAgICAgICAgIGRhdGEgc2VjdGlvbiBvZiB0aGUgYWRkZW5kLiBUaGUgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aWxsCi0gICAgICAgICAgIHN1YnRyYWN0IGZyb20gdGhlIHJlbG9jYXRpb24gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uCi0gICAgICAgICAgIGJlaW5nIHJlbG9jYXRlZC4gKi8KLSAgYm9vbGVhbiBwY19yZWxhdGl2ZTsKLQotICAgICAgICAvKiAgVGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgcmVsb2MgdmFsdWUgaW4gdGhlIGRlc3RpbmF0aW9uLgotICAgICAgICAgICBUaGUgcmVsb2NhdGVkIHZhbHVlIGlzIGxlZnQgc2hpZnRlZCBieSB0aGlzIGFtb3VudC4gKi8KLSAgdW5zaWduZWQgaW50IGJpdHBvczsKLQotICAgICAgICAvKiBXaGF0IHR5cGUgb2Ygb3ZlcmZsb3cgZXJyb3Igc2hvdWxkIGJlIGNoZWNrZWQgZm9yIHdoZW4KLSAgICAgICAgICByZWxvY2F0aW5nLiAqLwotICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGNvbXBsYWluX29uX292ZXJmbG93OwotCi0gICAgICAgIC8qIElmIHRoaXMgZmllbGQgaXMgbm9uIG51bGwsIHRoZW4gdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGlzCi0gICAgICAgICAgY2FsbGVkIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHJlYWxseQotICAgICAgICAgIHN0cmFuZ2UgcmVsb2NhdGlvbiBtZXRob2RzIHRvIGJlIGFjY29tb2RhdGVkIChlLmcuLCBpOTYwIGNhbGxqCi0gICAgICAgICAgaW5zdHJ1Y3Rpb25zKS4gKi8KLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlICgqc3BlY2lhbF9mdW5jdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLQotICAgICAgICAvKiBUaGUgdGV4dHVhbCBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUuICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgLyogU29tZSBmb3JtYXRzIHJlY29yZCBhIHJlbG9jYXRpb24gYWRkZW5kIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi0gICAgICAgICAgcmF0aGVyIHRoYW4gd2l0aCB0aGUgcmVsb2NhdGlvbi4gIEZvciBFTEYgZm9ybWF0cyB0aGlzIGlzIHRoZQotICAgICAgICAgIGRpc3RpbmN0aW9uIGJldHdlZW4gVVNFX1JFTCBhbmQgVVNFX1JFTEEgKHRob3VnaCB0aGUgY29kZSBjaGVja3MKLSAgICAgICAgICBmb3IgVVNFX1JFTCA9PSAxLzApLiAgVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgVFJVRSBpZiB0aGUKLSAgICAgICAgICBhZGRlbmQgaXMgcmVjb3JkZWQgd2l0aCB0aGUgc2VjdGlvbiBjb250ZW50czsgd2hlbiBwZXJmb3JtaW5nIGEKLSAgICAgICAgICBwYXJ0aWFsIGxpbmsgKGxkIC1yKSB0aGUgc2VjdGlvbiBjb250ZW50cyAodGhlIGRhdGEpIHdpbGwgYmUKLSAgICAgICAgICBtb2RpZmllZC4gIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIEZBTFNFIGlmIGFkZGVuZHMgYXJlCi0gICAgICAgICAgcmVjb3JkZWQgd2l0aCB0aGUgcmVsb2NhdGlvbiAoaW4gYXJlbGVudC5hZGRlbmQpOyB3aGVuIHBlcmZvcm1pbmcKLSAgICAgICAgICBhIHBhcnRpYWwgbGluayB0aGUgcmVsb2NhdGlvbiB3aWxsIGJlIG1vZGlmaWVkLgotICAgICAgICAgIEFsbCByZWxvY2F0aW9ucyBmb3IgYWxsIEVMRiBVU0VfUkVMQSB0YXJnZXRzIHNob3VsZCBzZXQgdGhpcyBmaWVsZAotICAgICAgICAgIHRvIEZBTFNFICh2YWx1ZXMgb2YgVFJVRSBzaG91bGQgYmUgbG9va2VkIG9uIHdpdGggc3VzcGljaW9uKS4KLSAgICAgICAgICBIb3dldmVyLCB0aGUgY29udmVyc2UgaXMgbm90IHRydWU6IG5vdCBhbGwgcmVsb2NhdGlvbnMgb2YgYWxsIEVMRgotICAgICAgICAgIFVTRV9SRUwgdGFyZ2V0cyBzZXQgdGhpcyBmaWVsZCB0byBUUlVFLiAgV2h5IHRoaXMgaXMgc28gaXMgcGVjdWxpYXIKLSAgICAgICAgICB0byBlYWNoIHBhcnRpY3VsYXIgdGFyZ2V0LiAgRm9yIHJlbG9jcyB0aGF0IGFyZW4ndCB1c2VkIGluIHBhcnRpYWwKLSAgICAgICAgICBsaW5rcyAoZS5nLiBHT1Qgc3R1ZmYpIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhpcyBpcyBzZXQgdG8uICAqLwotICBib29sZWFuIHBhcnRpYWxfaW5wbGFjZTsKLQotICAgICAgICAvKiBUaGUgc3JjX21hc2sgc2VsZWN0cyB3aGljaCBwYXJ0cyBvZiB0aGUgcmVhZCBpbiBkYXRhCi0gICAgICAgICAgYXJlIHRvIGJlIHVzZWQgaW4gdGhlIHJlbG9jYXRpb24gc3VtLiAgRS5nLiwgaWYgdGhpcyB3YXMgYW4gOCBiaXQKLSAgICAgICAgICBieXRlIG9mIGRhdGEgd2hpY2ggd2UgcmVhZCBhbmQgcmVsb2NhdGVkLCB0aGlzIHdvdWxkIGJlCi0gICAgICAgICAgMHgwMDAwMDBmZi4gV2hlbiB3ZSBoYXZlIHJlbG9jcyB3aGljaCBoYXZlIGFuIGFkZGVuZCwgc3VjaCBhcwotICAgICAgICAgIHN1bjQgZXh0ZW5kZWQgcmVsb2NzLCB0aGUgdmFsdWUgaW4gdGhlIG9mZnNldCBwYXJ0IG9mIGEKLSAgICAgICAgICByZWxvY2F0aW5nIGZpZWxkIGlzIGdhcmJhZ2Ugc28gd2UgbmV2ZXIgdXNlIGl0LiBJbiB0aGlzIGNhc2UKLSAgICAgICAgICB0aGUgbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAqLwotICBiZmRfdm1hIHNyY19tYXNrOwotCi0gICAgICAgIC8qIFRoZSBkc3RfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgcmVwbGFjZWQKLSAgICAgICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gSW4gbW9zdCBjYXNlcyBzcmNfbWFzayA9PSBkc3RfbWFzaywKLSAgICAgICAgICBleGNlcHQgaW4gdGhlIGFib3ZlIHNwZWNpYWwgY2FzZSwgd2hlcmUgZHN0X21hc2sgd291bGQgYmUKLSAgICAgICAgICAweDAwMDAwMGZmLCBhbmQgc3JjX21hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gICAqLwotICBiZmRfdm1hIGRzdF9tYXNrOwotCi0gICAgICAgIC8qIFdoZW4gc29tZSBmb3JtYXRzIGNyZWF0ZSBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMsIHRoZXkgbGVhdmUKLSAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBjIG9mIHRoZSBwbGFjZSBiZWluZyByZWxvY2F0ZWQgaW4gdGhlIG9mZnNldAotICAgICAgICAgIHNsb3Qgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB0aGF0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBjYW4KLSAgICAgICAgICBiZSBtYWRlIGp1c3QgYnkgYWRkaW5nIGluIGFuIG9yZGluYXJ5IG9mZnNldCAoZS5nLiwgc3VuMyBhLm91dCkuCi0gICAgICAgICAgU29tZSBmb3JtYXRzIGxlYXZlIHRoZSBkaXNwbGFjZW1lbnQgcGFydCBvZiBhbiBpbnN0cnVjdGlvbgotICAgICAgICAgIGVtcHR5IChlLmcuLCBtODhrIGJjcyk7IHRoaXMgZmxhZyBzaWduYWxzIHRoZSBmYWN0LiovCi0gIGJvb2xlYW4gcGNyZWxfb2Zmc2V0OwotCi19OwotI2RlZmluZSBIT1dUTyhDLCBSLFMsQiwgUCwgQkksIE8sIFNGLCBOQU1FLCBJTlBMQUNFLCBNQVNLU1JDLCBNQVNLRFNULCBQQykgXAotICB7KHVuc2lnbmVkKUMsUixTLEIsIFAsIEJJLCBPLFNGLE5BTUUsSU5QTEFDRSxNQVNLU1JDLE1BU0tEU1QsUEN9Ci0jZGVmaW5lIE5FV0hPV1RPKCBGVU5DVElPTiwgTkFNRSxTSVpFLFJFTCxJTikgSE9XVE8oMCwwLFNJWkUsMCxSRUwsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LEZVTkNUSU9OLCBOQU1FLGZhbHNlLDAsMCxJTikKLQotI2RlZmluZSBFTVBUWV9IT1dUTyhDKSBcCi0gIEhPV1RPKChDKSwwLDAsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsTlVMTCxOVUxMLGZhbHNlLDAsMCxmYWxzZSkKLQotI2RlZmluZSBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbCkgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHN5bWJvbCAhPSAoYXN5bWJvbCAqKU5VTEwpIHsgICAgICAgICAgICAgXAotICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpIHsgXAotICAgICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7ICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotdW5zaWduZWQgaW50IAotYmZkX2dldF9yZWxvY19zaXplICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICopKTsKLQotdHlwZWRlZiBzdHJ1Y3QgcmVsZW50X2NoYWluIHsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHN0cnVjdCAgIHJlbGVudF9jaGFpbiAqbmV4dDsKLX0gYXJlbGVudF9jaGFpbjsKLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotCi1iZmRfY2hlY2tfb3ZlcmZsb3cKLSBQQVJBTVMgKChlbnVtIGNvbXBsYWluX292ZXJmbG93IGhvdywKLSAgICB1bnNpZ25lZCBpbnQgYml0c2l6ZSwKLSAgICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdCwKLSAgICB1bnNpZ25lZCBpbnQgYWRkcnNpemUsCi0gICAgYmZkX3ZtYSByZWxvY2F0aW9uKSk7Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotCi1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgIFBUUiBkYXRhLAotICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX2luc3RhbGxfcmVsb2NhdGlvbgotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICBQVFIgZGF0YSwgYmZkX3ZtYSBkYXRhX3N0YXJ0LAotICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7Ci0KLWVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCB7Ci0gIF9kdW1teV9maXJzdF9iZmRfcmVsb2NfY29kZV9yZWFsLAotCi0KLS8qIEJhc2ljIGFic29sdXRlIHJlbG9jYXRpb25zIG9mIE4gYml0cy4gKi8KLSAgQkZEX1JFTE9DXzY0LAotICBCRkRfUkVMT0NfMzIsCi0gIEJGRF9SRUxPQ18yNiwKLSAgQkZEX1JFTE9DXzI0LAotICBCRkRfUkVMT0NfMTYsCi0gIEJGRF9SRUxPQ18xNCwKLSAgQkZEX1JFTE9DXzgsCi0KLS8qIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zLiAgU29tZXRpbWVzIHRoZXNlIGFyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcwotb2YgdGhlIHJlbG9jYXRpb24gaXRzZWxmOyBzb21ldGltZXMgdGhleSBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCi10aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSByZWxvY2F0aW9uLiAgSXQgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgdGFyZ2V0LgotCi1UaGUgMjQtYml0IHJlbG9jYXRpb24gaXMgdXNlZCBpbiBzb21lIEludGVsIDk2MCBjb25maWd1cmF0aW9ucy4gKi8KLSAgQkZEX1JFTE9DXzY0X1BDUkVMLAotICBCRkRfUkVMT0NfMzJfUENSRUwsCi0gIEJGRF9SRUxPQ18yNF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X1BDUkVMLAotICBCRkRfUkVMT0NfMTJfUENSRUwsCi0gIEJGRF9SRUxPQ184X1BDUkVMLAotCi0vKiBGb3IgRUxGLiAqLwotICBCRkRfUkVMT0NfMzJfR09UX1BDUkVMLAotICBCRkRfUkVMT0NfMTZfR09UX1BDUkVMLAotICBCRkRfUkVMT0NfOF9HT1RfUENSRUwsCi0gIEJGRF9SRUxPQ18zMl9HT1RPRkYsCi0gIEJGRF9SRUxPQ18xNl9HT1RPRkYsCi0gIEJGRF9SRUxPQ19MTzE2X0dPVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfR09UT0ZGLAotICBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiwKLSAgQkZEX1JFTE9DXzhfR09UT0ZGLAotICBCRkRfUkVMT0NfMzJfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfMjRfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfMTZfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfOF9QTFRfUENSRUwsCi0gIEJGRF9SRUxPQ18zMl9QTFRPRkYsCi0gIEJGRF9SRUxPQ18xNl9QTFRPRkYsCi0gIEJGRF9SRUxPQ19MTzE2X1BMVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfUExUT0ZGLAotICBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRiwKLSAgQkZEX1JFTE9DXzhfUExUT0ZGLAotCi0vKiBSZWxvY2F0aW9ucyB1c2VkIGJ5IDY4SyBFTEYuICovCi0gIEJGRF9SRUxPQ182OEtfR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ182OEtfSk1QX1NMT1QsCi0gIEJGRF9SRUxPQ182OEtfUkVMQVRJVkUsCi0KLS8qIExpbmthZ2UtdGFibGUgcmVsYXRpdmUuICovCi0gIEJGRF9SRUxPQ18zMl9CQVNFUkVMLAotICBCRkRfUkVMT0NfMTZfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMLAotICBCRkRfUkVMT0NfOF9CQVNFUkVMLAotICBCRkRfUkVMT0NfUlZBLAotCi0vKiBBYnNvbHV0ZSA4LWJpdCByZWxvY2F0aW9uLCBidXQgdXNlZCB0byBmb3JtIGFuIGFkZHJlc3MgbGlrZSAweEZGbm4uICovCi0gIEJGRF9SRUxPQ184X0ZGbm4sCi0KLS8qIFRoZXNlIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zIGFyZSBzdG9yZWQgYXMgd29yZCBkaXNwbGFjZW1lbnRzIC0tCi1pLmUuLCBieXRlIGRpc3BsYWNlbWVudHMgc2hpZnRlZCByaWdodCB0d28gYml0cy4gIFRoZSAzMC1iaXQgd29yZAotZGlzcGxhY2VtZW50ICg8PDMyX1BDUkVMX1MyPj4gLS0gMzIgYml0cywgc2hpZnRlZCAyKSBpcyB1c2VkIG9uIHRoZQotU1BBUkMuICAoU1BBUkMgdG9vbHMgZ2VuZXJhbGx5IHJlZmVyIHRvIHRoaXMgYXMgPDxXRElTUDMwPj4uKSAgVGhlCi1zaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBNSVBTLCBhbmQgdGhlIDIzLWJpdAotZGlzcGxhY2VtZW50IGlzIHVzZWQgb24gdGhlIEFscGhhLiAqLwotICBCRkRfUkVMT0NfMzJfUENSRUxfUzIsCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMiwKLSAgQkZEX1JFTE9DXzIzX1BDUkVMX1MyLAotCi0vKiBIaWdoIDIyIGJpdHMgYW5kIGxvdyAxMCBiaXRzIG9mIDMyLWJpdCB2YWx1ZSwgcGxhY2VkIGludG8gbG93ZXIgYml0cyBvZgotdGhlIHRhcmdldCB3b3JkLiAgVGhlc2UgYXJlIHVzZWQgb24gdGhlIFNQQVJDLiAqLwotICBCRkRfUkVMT0NfSEkyMiwKLSAgQkZEX1JFTE9DX0xPMTAsCi0KLS8qIEZvciBzeXN0ZW1zIHRoYXQgYWxsb2NhdGUgYSBHbG9iYWwgUG9pbnRlciByZWdpc3RlciwgdGhlc2UgYXJlCi1kaXNwbGFjZW1lbnRzIG9mZiB0aGF0IHJlZ2lzdGVyLiAgVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBhcmUKLWhhbmRsZWQgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZSB2YWx1ZSB0aGUgcmVnaXN0ZXIgd2lsbCBoYXZlIGlzCi1kZWNpZGVkIHJlbGF0aXZlbHkgbGF0ZS4gKi8KLSAgQkZEX1JFTE9DX0dQUkVMMTYsCi0gIEJGRF9SRUxPQ19HUFJFTDMyLAotCi0vKiBSZWxvYyB0eXBlcyB1c2VkIGZvciBpOTYwL2Iub3V0LiAqLwotICBCRkRfUkVMT0NfSTk2MF9DQUxMSiwKLQotLyogU1BBUkMgRUxGIHJlbG9jYXRpb25zLiAgVGhlcmUgaXMgcHJvYmFibHkgc29tZSBvdmVybGFwIHdpdGggb3RoZXIKLXJlbG9jYXRpb24gdHlwZXMgYWxyZWFkeSBkZWZpbmVkLiAqLwotICBCRkRfUkVMT0NfTk9ORSwKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsCi0gIEJGRF9SRUxPQ19TUEFSQzIyLAotICBCRkRfUkVMT0NfU1BBUkMxMywKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTMsCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzIyLAotICBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLAotICBCRkRfUkVMT0NfU1BBUkNfQ09QWSwKLSAgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULAotICBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSwKLSAgQkZEX1JFTE9DX1NQQVJDX1VBMzIsCi0KLS8qIEkgdGhpbmsgdGhlc2UgYXJlIHNwZWNpZmljIHRvIFNQQVJDIGEub3V0IChlLmcuLCBTdW4gNCkuICovCi0gIEJGRF9SRUxPQ19TUEFSQ19CQVNFMTMsCi0gIEJGRF9SRUxPQ19TUEFSQ19CQVNFMjIsCi0KLS8qIFNQQVJDNjQgcmVsb2NhdGlvbnMgKi8KLSNkZWZpbmUgQkZEX1JFTE9DX1NQQVJDXzY0IEJGRF9SRUxPQ182NAotICBCRkRfUkVMT0NfU1BBUkNfMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ18xMSwKLSAgQkZEX1JFTE9DX1NQQVJDX09MTzEwLAotICBCRkRfUkVMT0NfU1BBUkNfSEgyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX0hNMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19MTTIyLAotICBCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyLAotICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTksCi0gIEJGRF9SRUxPQ19TUEFSQ183LAotICBCRkRfUkVMT0NfU1BBUkNfNiwKLSAgQkZEX1JFTE9DX1NQQVJDXzUsCi0jZGVmaW5lIEJGRF9SRUxPQ19TUEFSQ19ESVNQNjQgQkZEX1JFTE9DXzY0X1BDUkVMCi0gIEJGRF9SRUxPQ19TUEFSQ19QTFQ2NCwKLSAgQkZEX1JFTE9DX1NQQVJDX0hJWDIyLAotICBCRkRfUkVMT0NfU1BBUkNfTE9YMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19INDQsCi0gIEJGRF9SRUxPQ19TUEFSQ19NNDQsCi0gIEJGRF9SRUxPQ19TUEFSQ19MNDQsCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUdJU1RFUiwKLQotLyogU1BBUkMgbGl0dGxlIGVuZGlhbiByZWxvY2F0aW9uICovCi0gIEJGRF9SRUxPQ19TUEFSQ19SRVYzMiwKLQotLyogQWxwaGEgRUNPRkYgYW5kIEVMRiByZWxvY2F0aW9ucy4gIFNvbWUgb2YgdGhlc2UgdHJlYXQgdGhlIHN5bWJvbCBvcgotImFkZGVuZCIgaW4gc29tZSBzcGVjaWFsIHdheS4KLUZvciBHUERJU1BfSEkxNiAoImdwZGlzcCIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGlnbm9yZWQgd2hlbgotd3JpdGluZzsgd2hlbiByZWFkaW5nLCBpdCB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gIFRoZQotYWRkZW5kIGlzIHRoZSBkaXNwbGFjZW1lbnQgaW4gYnl0ZXMgb2YgdGhlICJsZGEiIGluc3RydWN0aW9uIGZyb20KLXRoZSAibGRhaCIgaW5zdHJ1Y3Rpb24gKHdoaWNoIGlzIGF0IHRoZSBhZGRyZXNzIG9mIHRoaXMgcmVsb2MpLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYsCi0KLS8qIEZvciBHUERJU1BfTE8xNiAoImlnbm9yZSIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGhhbmRsZWQgYXMKLXdpdGggR1BESVNQX0hJMTYgcmVsb2NzLiAgVGhlIGFkZGVuZCBpcyBpZ25vcmVkIHdoZW4gd3JpdGluZyB0aGUKLXJlbG9jYXRpb25zIG91dCwgYW5kIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24KLXJlYWRpbmcsIGZvciBjb252ZW5pZW5jZS4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2LAotCi0vKiBUaGUgRUxGIEdQRElTUCByZWxvY2F0aW9uIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIEdQRElTUF9ISTE2Ci1yZWxvY2F0aW9uIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGFjY29tcGFueWluZyBHUERJU1BfTE8xNgotcmVsb2NhdGlvbi4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUCwKLQotLyogVGhlIEFscGhhIExJVEVSQUwvTElUVVNFIHJlbG9jcyBhcmUgcHJvZHVjZWQgYnkgYSBzeW1ib2wgcmVmZXJlbmNlOwotdGhlIGFzc2VtYmxlciB0dXJucyBpdCBpbnRvIGEgTERRIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YKLXRoZSBzeW1ib2wsIGFuZCB0aGVuIGZpbGxzIGluIGEgcmVnaXN0ZXIgaW4gdGhlIHJlYWwgaW5zdHJ1Y3Rpb24uCi0KLVRoZSBMSVRFUkFMIHJlbG9jLCBhdCB0aGUgTERRIGluc3RydWN0aW9uLCByZWZlcnMgdG8gdGhlIC5saXRhCi1zZWN0aW9uIHN5bWJvbC4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcsIGJ1dCBpcyBmaWxsZWQKLWluIHdpdGggdGhlIGZpbGUncyBHUCB2YWx1ZSBvbiByZWFkaW5nLCBmb3IgY29udmVuaWVuY2UsIGFzIHdpdGggdGhlCi1HUERJU1BfTE8xNiByZWxvYy4KLQotVGhlIEVMRl9MSVRFUkFMIHJlbG9jIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDE2X0dPVE9GRiBhbmQgR1BESVNQX0xPMTYuCi1JdCBzaG91bGQgcmVmZXIgdG8gdGhlIHN5bWJvbCB0byBiZSByZWZlcmVuY2VkLCBhcyB3aXRoIDE2X0dPVE9GRiwKLWJ1dCBpdCBnZW5lcmF0ZXMgb3V0cHV0IG5vdCBiYXNlZCBvbiB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSAuZ290Ci1zZWN0aW9uLCBidXQgcmVsYXRpdmUgdG8gdGhlIEdQIHZhbHVlIGNob3NlbiBmb3IgdGhlIGZpbGUgZHVyaW5nIHRoZQotZmluYWwgbGluayBzdGFnZS4KLQotVGhlIExJVFVTRSByZWxvYywgb24gdGhlIGluc3RydWN0aW9uIHVzaW5nIHRoZSBsb2FkZWQgYWRkcmVzcywgZ2l2ZXMKLWluZm9ybWF0aW9uIHRvIHRoZSBsaW5rZXIgdGhhdCBpdCBtaWdodCBiZSBhYmxlIHRvIHVzZSB0byBvcHRpbWl6ZQotYXdheSBzb21lIGxpdGVyYWwgc2VjdGlvbiByZWZlcmVuY2VzLiAgVGhlIHN5bWJvbCBpcyBpZ25vcmVkIChyZWFkCi1hcyB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wpLCBhbmQgdGhlICJhZGRlbmQiIGluZGljYXRlcyB0aGUgdHlwZQotb2YgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIHJlZ2lzdGVyOgotMSAtICJtZW1vcnkiIGZtdCBpbnNuCi0yIC0gYnl0ZS1tYW5pcHVsYXRpb24gKGJ5dGUgb2Zmc2V0IHJlZykKLTMgLSBqc3IgKHRhcmdldCBvZiBicmFuY2gpCi0KLVRoZSBHTlUgbGlua2VyIGN1cnJlbnRseSBkb2Vzbid0IGRvIGFueSBvZiB0aGlzIG9wdGltaXppbmcuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMLAotICBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0UsCi0KLS8qIFRoZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl8qIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgdG8KLXByb2Nlc3MgdGhlIGV4cGxpY2l0ICE8cmVsb2M+IXNlcXVlbmNlIHJlbG9jYXRpb25zLCBhbmQgYXJlIG1hcHBlZAotaW50byB0aGUgbm9ybWFsIHJlbG9jYXRpb25zIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZy4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTCwKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0UsCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYsCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1IsCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQRElTUCwKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdILAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVywKLQotLyogVGhlIEhJTlQgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgYSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBmaWxsZWQgaW50byB0aGUKLSJoaW50IiBmaWVsZCBvZiBhIGptcC9qc3IvcmV0IGluc3RydWN0aW9uLCBmb3IgcG9zc2libGUgYnJhbmNoLQotcHJlZGljdGlvbiBsb2dpYyB3aGljaCBtYXkgYmUgcHJvdmlkZWQgb24gc29tZSBwcm9jZXNzb3JzLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfSElOVCwKLQotLyogVGhlIExJTktBR0UgcmVsb2NhdGlvbiBvdXRwdXRzIGEgbGlua2FnZSBwYWlyIGluIHRoZSBvYmplY3QgZmlsZSwKLXdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRSwKLQotLyogVGhlIENPREVBRERSIHJlbG9jYXRpb24gb3V0cHV0cyBhIFNUT19DQSBpbiB0aGUgb2JqZWN0IGZpbGUsCi13aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSLAotCi0vKiBCaXRzIDI3Li4yIG9mIHRoZSByZWxvY2F0aW9uIGFkZHJlc3Mgc2hpZnRlZCByaWdodCAyIGJpdHM7Ci1zaW1wbGUgcmVsb2Mgb3RoZXJ3aXNlLiAqLwotICBCRkRfUkVMT0NfTUlQU19KTVAsCi0KLS8qIFRoZSBNSVBTMTYganVtcCBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01JUFMxNl9KTVAsCi0KLS8qIE1JUFMxNiBHUCByZWxhdGl2ZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX01JUFMxNl9HUFJFTCwKLQotLyogSGlnaCAxNiBiaXRzIG9mIDMyLWJpdCB2YWx1ZTsgc2ltcGxlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfSEkxNiwKLQotLyogSGlnaCAxNiBiaXRzIG9mIDMyLWJpdCB2YWx1ZSBidXQgdGhlIGxvdyAxNiBiaXRzIHdpbGwgYmUgc2lnbgotZXh0ZW5kZWQgYW5kIGFkZGVkIHRvIGZvcm0gdGhlIGZpbmFsIHJlc3VsdC4gIElmIHRoZSBsb3cgMTYKLWJpdHMgZm9ybSBhIG5lZ2F0aXZlIG51bWJlciwgd2UgbmVlZCB0byBhZGQgb25lIHRvIHRoZSBoaWdoIHZhbHVlCi10byBjb21wZW5zYXRlIGZvciB0aGUgYm9ycm93IHdoZW4gdGhlIGxvdyBiaXRzIGFyZSBhZGRlZC4gKi8KLSAgQkZEX1JFTE9DX0hJMTZfUywKLQotLyogTG93IDE2IGJpdHMuICovCi0gIEJGRF9SRUxPQ19MTzE2LAotCi0vKiBMaWtlIEJGRF9SRUxPQ19ISTE2X1MsIGJ1dCBQQyByZWxhdGl2ZS4gKi8KLSAgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUywKLQotLyogTGlrZSBCRkRfUkVMT0NfTE8xNiwgYnV0IFBDIHJlbGF0aXZlLiAqLwotICBCRkRfUkVMT0NfUENSRUxfTE8xNiwKLQotLyogUmVsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgZ2xvYmFsIHBvaW50ZXIuICovCi0jZGVmaW5lIEJGRF9SRUxPQ19NSVBTX0dQUkVMIEJGRF9SRUxPQ19HUFJFTDE2Ci0KLS8qIFJlbG9jYXRpb24gYWdhaW5zdCBhIE1JUFMgbGl0ZXJhbCBzZWN0aW9uLiAqLwotICBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLAotCi0vKiBNSVBTIEVMRiByZWxvY2F0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX01JUFNfR09UMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0NBTEwxNiwKLSNkZWZpbmUgQkZEX1JFTE9DX01JUFNfR1BSRUwzMiBCRkRfUkVMT0NfR1BSRUwzMgotICBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiwKLSAgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwKLSAgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LAotICBCRkRfUkVMT0NfTUlQU19TVUIsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9QQUdFLAotICBCRkRfUkVMT0NfTUlQU19HT1RfT0ZTVCwKLSAgQkZEX1JFTE9DX01JUFNfR09UX0RJU1AsCi0KLQotLyogaTM4Ni9lbGYgcmVsb2NhdGlvbnMgKi8KLSAgQkZEX1JFTE9DXzM4Nl9HT1QzMiwKLSAgQkZEX1JFTE9DXzM4Nl9QTFQzMiwKLSAgQkZEX1JFTE9DXzM4Nl9DT1BZLAotICBCRkRfUkVMT0NfMzg2X0dMT0JfREFULAotICBCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVCwKLSAgQkZEX1JFTE9DXzM4Nl9SRUxBVElWRSwKLSAgQkZEX1JFTE9DXzM4Nl9HT1RPRkYsCi0gIEJGRF9SRUxPQ18zODZfR09UUEMsCi0KLS8qIG5zMzJrIHJlbG9jYXRpb25zICovCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fOCwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMiwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF84LAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzIsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwKLQotLyogUGljb2phdmEgcmVsb2NzLiAgTm90IGFsbCBvZiB0aGVzZSBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLiAqLwotICBCRkRfUkVMT0NfUEpfQ09ERV9ISTE2LAotICBCRkRfUkVMT0NfUEpfQ09ERV9MTzE2LAotICBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfRElSMzIsCi0gIEJGRF9SRUxPQ19QSl9DT0RFX1JFTDE2LAotICBCRkRfUkVMT0NfUEpfQ09ERV9SRUwzMiwKLQotLyogUG93ZXIocnM2MDAwKSBhbmQgUG93ZXJQQyByZWxvY2F0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX1BQQ19CMjYsCi0gIEJGRF9SRUxPQ19QUENfQkEyNiwKLSAgQkZEX1JFTE9DX1BQQ19UT0MxNiwKLSAgQkZEX1JFTE9DX1BQQ19CMTYsCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4sCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0JBMTYsCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU4sCi0gIEJGRF9SRUxPQ19QUENfQ09QWSwKLSAgQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCwKLSAgQkZEX1JFTE9DX1BQQ19KTVBfU0xPVCwKLSAgQkZEX1JFTE9DX1BQQ19SRUxBVElWRSwKLSAgQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMsCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMzIsCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8sCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEksCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTCwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEsCi0gIEJGRF9SRUxPQ19QUENfRU1CX01SS1JFRiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPLAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEsCi0gIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQSwKLQotLyogSUJNIDM3MC8zOTAgcmVsb2NhdGlvbnMgKi8KLSAgQkZEX1JFTE9DX0kzNzBfRDEyLAotCi0vKiBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIHRvIGJ1aWxkIGEgY29udHJ1Y3RvciB0YWJsZSAtIGF0IHRoZSBtb21lbnQKLXByb2JhYmx5IGEgMzIgYml0IHdpZGUgYWJzb2x1dGUgcmVsb2NhdGlvbiwgYnV0IHRoZSB0YXJnZXQgY2FuIGNob29zZS4KLUl0IGdlbmVyYWxseSBkb2VzIG1hcCB0byBvbmUgb2YgdGhlIG90aGVyIHJlbG9jYXRpb24gdHlwZXMuICovCi0gIEJGRF9SRUxPQ19DVE9SLAotCi0vKiBBUk0gMjYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLW5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwKLQotLyogVGhlc2UgcmVsb2NzIGFyZSBvbmx5IHVzZWQgd2l0aGluIHRoZSBBUk0gYXNzZW1ibGVyLiAgVGhleSBhcmUgbm90Ci0oYXQgcHJlc2VudCkgd3JpdHRlbiB0byBhbnkgb2JqZWN0IGZpbGVzLiAqLwotICBCRkRfUkVMT0NfQVJNX0lNTUVESUFURSwKLSAgQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURSwKLSAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLAotICBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9TV0ksCi0gIEJGRF9SRUxPQ19BUk1fTVVMVEksCi0gIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9BRFJfSU1NLAotICBCRkRfUkVMT0NfQVJNX0xEUl9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fTElURVJBTCwKLSAgQkZEX1JFTE9DX0FSTV9JTl9QT09MLAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04LAotICBCRkRfUkVMT0NfQVJNX0hXTElURVJBTCwKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQsCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NLAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZULAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwKLSAgQkZEX1JFTE9DX0FSTV9HT1QxMiwKLSAgQkZEX1JFTE9DX0FSTV9HT1QzMiwKLSAgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsCi0gIEJGRF9SRUxPQ19BUk1fQ09QWSwKLSAgQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCwKLSAgQkZEX1JFTE9DX0FSTV9QTFQzMiwKLSAgQkZEX1JFTE9DX0FSTV9SRUxBVElWRSwKLSAgQkZEX1JFTE9DX0FSTV9HT1RPRkYsCi0gIEJGRF9SRUxPQ19BUk1fR09UUEMsCi0KLS8qIEhpdGFjaGkgU0ggcmVsb2NzLiAgTm90IGFsbCBvZiB0aGVzZSBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLiAqLwotICBCRkRfUkVMT0NfU0hfUENESVNQOEJZMiwKLSAgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyLAotICBCRkRfUkVMT0NfU0hfSU1NNCwKLSAgQkZEX1JFTE9DX1NIX0lNTTRCWTIsCi0gIEJGRF9SRUxPQ19TSF9JTU00Qlk0LAotICBCRkRfUkVMT0NfU0hfSU1NOCwKLSAgQkZEX1JFTE9DX1NIX0lNTThCWTIsCi0gIEJGRF9SRUxPQ19TSF9JTU04Qlk0LAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LAotICBCRkRfUkVMT0NfU0hfU1dJVENIMTYsCi0gIEJGRF9SRUxPQ19TSF9TV0lUQ0gzMiwKLSAgQkZEX1JFTE9DX1NIX1VTRVMsCi0gIEJGRF9SRUxPQ19TSF9DT1VOVCwKLSAgQkZEX1JFTE9DX1NIX0FMSUdOLAotICBCRkRfUkVMT0NfU0hfQ09ERSwKLSAgQkZEX1JFTE9DX1NIX0RBVEEsCi0gIEJGRF9SRUxPQ19TSF9MQUJFTCwKLQotLyogVGh1bWIgMjMtLCAxMi0gYW5kIDktYml0IHBjLXJlbGF0aXZlIGJyYW5jaGVzLiAgVGhlIGxvd2VzdCBiaXQgbXVzdAotYmUgemVybyBhbmQgaXMgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LAotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIsCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywKLQotLyogQXJnb25hdXQgUklTQyBDb3JlIChBUkMpIHJlbG9jcy4KLUFSQyAyMiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQotbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyMCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyNgotdGhyb3VnaCA3IG9mIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsCi0KLS8qIEFSQyAyNiBiaXQgYWJzb2x1dGUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZSBub3QKLXN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyNCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyMwotdGhyb3VnaCAwLiAqLwotICBCRkRfUkVMT0NfQVJDX0IyNiwKLQotLyogTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLVRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IsCi0KLS8qIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCi1UaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotYXNzdW1lZCB0byBiZSAwLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgcmVsb2MKLWV4Y2VwdCBpdCBpcyBpbiB0aGUgbGVmdCBjb250YWluZXIsIGkuZS4sCi1zaGlmdGVkIGxlZnQgMTUgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMTBWXzE4LAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLWFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwsCi0KLS8qIE1pdHN1YmlzaGkgRDMwViByZWxvY3MuCi1UaGlzIGlzIGEgNi1iaXQgYWJzb2x1dGUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19EMzBWXzYsCi0KLS8qIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi1hcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi1vZiB0aGUgY29udGFpbmVyLiAqLwotICBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IsCi0KLS8qIFRoaXMgaXMgYSAxMi1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCB0aGUKLXJpZ2h0IDMgYml0c2Fzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMTUsCi0KLS8qIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi1hcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi1vZiB0aGUgY29udGFpbmVyLiAqLwotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCBhYnNvbHV0ZSByZWxvYyB3aXRoCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMjEsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLWFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLW9mIHRoZSBjb250YWluZXIuICovCi0gIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IsCi0KLS8qIFRoaXMgaXMgYSAzMi1iaXQgYWJzb2x1dGUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19EMzBWXzMyLAotCi0vKiBUaGlzIGlzIGEgMzItYml0IHBjLXJlbGF0aXZlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTCwKLQotLyogTWl0c3ViaXNoaSBNMzJSIHJlbG9jcy4KLVRoaXMgaXMgYSAyNCBiaXQgYWJzb2x1dGUgYWRkcmVzcy4gKi8KLSAgQkZEX1JFTE9DX00zMlJfMjQsCi0KLS8qIFRoaXMgaXMgYSAxMC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfMTBfUENSRUwsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMjYtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGhpZ2ggMTYgYml0cyBvZiBhbiBhZGRyZXNzCi11c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgdW5zaWduZWQuICovCi0gIEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPLAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGhpZ2ggMTYgYml0cyBvZiBhbiBhZGRyZXNzCi11c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgc2lnbmVkLiAqLwotICBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBsb3dlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MuICovCi0gIEJGRF9SRUxPQ19NMzJSX0xPMTYsCi0KLS8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgc21hbGwgZGF0YSBhcmVhIG9mZnNldCBmb3IgdXNlIGluCi1hZGQzLCBsb2FkLCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLiAqLwotICBCRkRfUkVMT0NfTTMyUl9TREExNiwKLQotLyogVGhpcyBpcyBhIDktYml0IHJlbG9jICovCi0gIEJGRF9SRUxPQ19WODUwXzlfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAyMi1iaXQgcmVsb2MgKi8KLSAgQkZEX1JFTE9DX1Y4NTBfMjJfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi16ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGFuIDggYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA2IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi10aW55IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVCwKLQotLyogVGhpcyBpcyBhbiA4Yml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA3IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlIHRpbnkKLWRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDcgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDUgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA0IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlIHRpbnkKLWRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDQgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi1iaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQotYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVCwKLQotCi0vKiBUaGlzIGlzIGEgMzJiaXQgcGNyZWwgcmVsb2MgZm9yIHRoZSBtbjEwMzAwLCBvZmZzZXQgYnkgdHdvIGJ5dGVzIGluIHRoZQotaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzMyX1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTZiaXQgcGNyZWwgcmVsb2MgZm9yIHRoZSBtbjEwMzAwLCBvZmZzZXQgYnkgdHdvIGJ5dGVzIGluIHRoZQotaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzE2X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgOGJpdCBEUCByZWxvYyBmb3IgdGhlIHRtczMyMGMzMCwgd2hlcmUgdGhlIG1vc3QKLXNpZ25pZmljYW50IDggYml0cyBvZiBhIDI0IGJpdCB3b3JkIGFyZSBwbGFjZWQgaW50byB0aGUgbGVhc3QKLXNpZ25pZmljYW50IDggYml0cyBvZiB0aGUgb3Bjb2RlLiAqLwotICBCRkRfUkVMT0NfVElDMzBfTERQLAotCi0vKiBUaGlzIGlzIGEgNDggYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyAzMiBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF80OCwKLQotLyogVGhpcyBpcyBhIDMyIGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMjAgYml0cyBzcGxpdCB1cCBpbnRvCi10d28gc2VjdGlvbnMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzIwLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDYgYml0IHdvcmQgb2Zmc2V0IGluCi00IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzZfSU5fNCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYW4gOCBiaXQgYnl0ZSBvZmZzZXQKLWludG8gOCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF84X0lOXzgsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgOSBiaXQgc2hvcnQgb2Zmc2V0Ci1pbnRvIDggYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfOV9JTl84LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEwIGJpdCB3b3JkIG9mZnNldAotaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzEwX0lOXzgsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgOSBiaXQgcGMgcmVsYXRpdmUKLXNob3J0IG9mZnNldCBpbnRvIDggYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMiBiaXQgcGMgcmVsYXRpdmUKLXNob3J0IG9mZnNldCBpbnRvIDExIGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMLAotCi0vKiBNb3Rvcm9sYSBNY29yZSByZWxvY2F0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMiwKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF8zMiwKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMiwKLSAgQkZEX1JFTE9DX01DT1JFX1JWQSwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCBwYyByZWxhdGl2ZQotc2hvcnQgb2Zmc2V0IGludG8gNyBiaXRzLiAqLwotICBCRkRfUkVMT0NfQVZSXzdfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgMTMgYml0IHBjIHJlbGF0aXZlCi1zaG9ydCBvZmZzZXQgaW50byAxMiBiaXRzLiAqLwotICBCRkRfUkVMT0NfQVZSXzEzX1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDE3IGJpdCB2YWx1ZSAodXN1YWxseQotcHJvZ3JhbSBtZW1vcnkgYWRkcmVzcykgaW50byAxNiBiaXRzLiAqLwotICBCRkRfUkVMT0NfQVZSXzE2X1BNLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDggYml0IHZhbHVlICh1c3VhbGx5Ci1kYXRhIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9MTzhfTERJLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDggYml0IHZhbHVlIChoaWdoIDggYml0Ci1vZiBkYXRhIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9ISThfTERJLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDggYml0IHZhbHVlIChtb3N0IGhpZ2ggOCBiaXQKLW9mIHByb2dyYW0gbWVtb3J5IGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIExESSBpbnNuLiAqLwotICBCRkRfUkVMT0NfQVZSX0hIOF9MREksCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgbmVnYXRlZCA4IGJpdCB2YWx1ZQotKHVzdWFsbHkgZGF0YSBtZW1vcnkgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgU1VCSSBpbnNuLiAqLwotICBCRkRfUkVMT0NfQVZSX0xPOF9MRElfTkVHLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIG5lZ2F0ZWQgOCBiaXQgdmFsdWUKLShoaWdoIDggYml0IG9mIGRhdGEgbWVtb3J5IGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mCi1TVUJJIGluc24uICovCi0gIEJGRF9SRUxPQ19BVlJfSEk4X0xESV9ORUcsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgbmVnYXRlZCA4IGJpdCB2YWx1ZQotKG1vc3QgaGlnaCA4IGJpdCBvZiBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZQotb2YgTERJIG9yIFNVQkkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9ISDhfTERJX05FRywKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAodXN1YWxseQotY29tbWFuZCBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9MTzhfTERJX1BNLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDggYml0IHZhbHVlIChoaWdoIDggYml0Ci1vZiBjb21tYW5kIGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIExESSBpbnNuLiAqLwotICBCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE0sCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgOCBiaXQgdmFsdWUgKG1vc3QgaGlnaCA4IGJpdAotb2YgY29tbWFuZCBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9ISDhfTERJX1BNLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIG5lZ2F0ZWQgOCBiaXQgdmFsdWUKLSh1c3VhbGx5IGNvbW1hbmQgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgU1VCSSBpbnNuLiAqLwotICBCRkRfUkVMT0NfQVZSX0xPOF9MRElfUE1fTkVHLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIG5lZ2F0ZWQgOCBiaXQgdmFsdWUKLShoaWdoIDggYml0IG9mIDE2IGJpdCBjb21tYW5kIGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlCi1vZiBTVUJJIGluc24uICovCi0gIEJGRF9SRUxPQ19BVlJfSEk4X0xESV9QTV9ORUcsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgbmVnYXRlZCA4IGJpdCB2YWx1ZQotKGhpZ2ggNiBiaXQgb2YgMjIgYml0IGNvbW1hbmQgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUKLXZhbHVlIG9mIFNVQkkgaW5zbi4gKi8KLSAgQkZEX1JFTE9DX0FWUl9ISDhfTERJX1BNX05FRywKLQotLyogVGhpcyBpcyBhIDMyIGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyAyMyBiaXQgdmFsdWUKLWludG8gMjIgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0FWUl9DQUxMLAotCi0vKiBUaGVzZSB0d28gcmVsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGxpbmtlciB0byBkZXRlcm1pbmUgd2hpY2ggb2YKLXRoZSBlbnRyaWVzIGluIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgYXJlIGFjdHVhbGx5IHVzZWQuICBXaGVuCi10aGUgLS1nYy1zZWN0aW9ucyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBsaW5rZXIgd2lsbCB6ZXJvIG91dCB0aGUgZW50cmllcwotdGhhdCBhcmUgbm90IHVzZWQsIHNvIHRoYXQgdGhlIGNvZGUgZm9yIHRob3NlIGZ1bmN0aW9ucyBuZWVkIG5vdCBiZQotaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KLQotVlRBQkxFX0lOSEVSSVQgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdXNlZCB0byBkZXNjcmliZSB0byB0aGUKLWxpbmtlciB0aGUgaW5oZXJpdGVuY2UgdHJlZSBvZiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgVGhlCi1yZWxvY2F0aW9uJ3Mgc3ltYm9sIHNob3VsZCBiZSB0aGUgcGFyZW50IGNsYXNzJyB2dGFibGUsIGFuZCB0aGUKLXJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2F0ZWQgYXQgdGhlIGNoaWxkIHZ0YWJsZS4KLQotVlRBQkxFX0VOVFJZIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSB1c2Ugb2YgYQotdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBlbnRyeS4gIFRoZSByZWxvYydzIHN5bWJvbCBzaG91bGQgcmVmZXIgdG8gdGhlCi10YWJsZSBvZiB0aGUgY2xhc3MgbWVudGlvbmVkIGluIHRoZSBjb2RlLiAgT2ZmIG9mIHRoYXQgYmFzZSwgYW4gb2Zmc2V0Ci1kZXNjcmliZXMgdGhlIGVudHJ5IHRoYXQgaXMgYmVpbmcgdXNlZC4gIEZvciBSZWxhIGhvc3RzLCB0aGlzIG9mZnNldAotaXMgc3RvcmVkIGluIHRoZSByZWxvYydzIGFkZGVuZC4gIEZvciBSZWwgaG9zdHMsIHdlIGFyZSBmb3JjZWQgdG8gcHV0Ci10aGlzIG9mZnNldCBpbiB0aGUgcmVsb2MncyBzZWN0aW9uIG9mZnNldC4gKi8KLSAgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULAotICBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLAotICBCRkRfUkVMT0NfVU5VU0VEIH07Ci10eXBlZGVmIGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGU7Ci1yZWxvY19ob3d0b190eXBlICoKLQotYmZkX3JlbG9jX3R5cGVfbG9va3VwICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWNvbnN0IGNoYXIgKgotYmZkX2dldF9yZWxvY19jb2RlX25hbWUgIFBBUkFNUyAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLQotdHlwZWRlZiBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Ci17Ci0gICAgICAgIC8qIEEgcG9pbnRlciB0byB0aGUgQkZEIHdoaWNoIG93bnMgdGhlIHN5bWJvbC4gVGhpcyBpbmZvcm1hdGlvbgotICAgICAgICAgIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IGEgYmFjayBlbmQgY2FuIHdvcmsgb3V0IHdoYXQgYWRkaXRpb25hbAotICAgICAgICAgIGluZm9ybWF0aW9uIChpbnZpc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uIHdyaXRlcikgaXMgY2FycmllZAotICAgICAgICAgIHdpdGggdGhlIHN5bWJvbC4KLQotICAgICAgICAgIFRoaXMgZmllbGQgaXMgKmFsbW9zdCogcmVkdW5kYW50LCBzaW5jZSB5b3UgY2FuIHVzZSBzZWN0aW9uLT5vd25lcgotICAgICAgICAgIGluc3RlYWQsIGV4Y2VwdCB0aGF0IHNvbWUgc3ltYm9scyBwb2ludCB0byB0aGUgZ2xvYmFsIHNlY3Rpb25zCi0gICAgICAgICAgYmZkX3thYnMsY29tLHVuZH1fc2VjdGlvbi4gIFRoaXMgY291bGQgYmUgZml4ZWQgYnkgbWFraW5nCi0gICAgICAgICAgdGhlc2UgZ2xvYmFscyBiZSBwZXItYmZkIChvciBwZXItdGFyZ2V0LWZsYXZvcikuICBGSVhNRS4gKi8KLQotICBzdHJ1Y3QgX2JmZCAqdGhlX2JmZDsgIC8qIFVzZSBiZmRfYXN5bWJvbF9iZmQoc3ltKSB0byBhY2Nlc3MgdGhpcyBmaWVsZC4gKi8KLQotICAgICAgICAvKiBUaGUgdGV4dCBvZiB0aGUgc3ltYm9sLiBUaGUgbmFtZSBpcyBsZWZ0IGFsb25lLCBhbmQgbm90IGNvcGllZDsgdGhlCi0gICAgICAgICAgYXBwbGljYXRpb24gbWF5IG5vdCBhbHRlciBpdC4gKi8KLSAgQ09OU1QgY2hhciAqbmFtZTsKLQotICAgICAgICAvKiBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBhIHVuaW9uIG9mIGEKLSAgICAgICAgICBudW1lcmljIHZhbHVlIHdpdGggYSBwb2ludGVyLCBzaW5jZSBzb21lIGZsYWdzIGluZGljYXRlIHRoYXQKLSAgICAgICAgICBhIHBvaW50ZXIgdG8gYW5vdGhlciBzeW1ib2wgaXMgc3RvcmVkIGhlcmUuICAqLwotICBzeW12YWx1ZSB2YWx1ZTsKLQotICAgICAgICAvKiBBdHRyaWJ1dGVzIG9mIGEgc3ltYm9sOiAqLwotCi0jZGVmaW5lIEJTRl9OT19GTEFHUyAgICAweDAwCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBoYXMgbG9jYWwgc2NvcGU7IDw8c3RhdGljPj4gaW4gPDxDPj4uIFRoZSB2YWx1ZQotICAgICAgICAgIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKi8KLSNkZWZpbmUgQlNGX0xPQ0FMICAgICAgMHgwMQotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZTsgaW5pdGlhbGl6ZWQgZGF0YSBpbiA8PEM+Pi4gVGhlCi0gICAgICAgICAgdmFsdWUgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLwotI2RlZmluZSBCU0ZfR0xPQkFMICAgICAweDAyCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlIGFuZCBpcyBleHBvcnRlZC4gVGhlIHZhbHVlIGlzCi0gICAgICAgICAgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLwotI2RlZmluZSBCU0ZfRVhQT1JUICAgICBCU0ZfR0xPQkFMICAvKiBubyByZWFsIGRpZmZlcmVuY2UgKi8KLQotICAgICAgICAvKiBBIG5vcm1hbCBDIHN5bWJvbCB3b3VsZCBiZSBvbmUgb2Y6Ci0gICAgICAgICAgPDxCU0ZfTE9DQUw+PiwgPDxCU0ZfRk9SVF9DT01NPj4sICA8PEJTRl9VTkRFRklORUQ+PiBvcgotICAgICAgICAgIDw8QlNGX0dMT0JBTD4+ICovCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyByZWNvcmQuIFRoZSB2YWx1ZSBoYXMgYW4gYXJiaXRhcnkKLSAgICAgICAgICBtZWFuaW5nLCB1bmxlc3MgQlNGX0RFQlVHR0lOR19SRUxPQyBpcyBhbHNvIHNldC4gICovCi0jZGVmaW5lIEJTRl9ERUJVR0dJTkcgIDB4MDgKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludC4gIFVzZWQgaW4gRUxGLAotICAgICAgICAgIHBlcmhhcHMgb3RoZXJzIHNvbWVkYXkuICAqLwotI2RlZmluZSBCU0ZfRlVOQ1RJT04gICAgMHgxMAotCi0gICAgICAgIC8qIFVzZWQgYnkgdGhlIGxpbmtlci4gKi8KLSNkZWZpbmUgQlNGX0tFRVAgICAgICAgIDB4MjAKLSNkZWZpbmUgQlNGX0tFRVBfRyAgICAgIDB4NDAKLQotICAgICAgICAvKiBBIHdlYWsgZ2xvYmFsIHN5bWJvbCwgb3ZlcnJpZGFibGUgd2l0aG91dCB3YXJuaW5ncyBieQotICAgICAgICAgIGEgcmVndWxhciBnbG9iYWwgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICAqLwotI2RlZmluZSBCU0ZfV0VBSyAgICAgICAgMHg4MAotCi0gICAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIHRvIHBvaW50IHRvIGEgc2VjdGlvbiwgZS5nLiBFTEYncwotICAgICAgICAgIFNUVF9TRUNUSU9OIHN5bWJvbHMuICAqLwotI2RlZmluZSBCU0ZfU0VDVElPTl9TWU0gMHgxMDAKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIHVzZWQgdG8gYmUgYSBjb21tb24gc3ltYm9sLCBidXQgbm93IGl0IGlzCi0gICAgICAgICAgYWxsb2NhdGVkLiAqLwotI2RlZmluZSBCU0ZfT0xEX0NPTU1PTiAgMHgyMDAKLQotICAgICAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgY29tbW9uIGRhdGEuICovCi0jZGVmaW5lIEJGRF9GT1JUX0NPTU1fREVGQVVMVF9WQUxVRSAwCi0KLSAgICAgICAgLyogSW4gc29tZSBmaWxlcyB0aGUgdHlwZSBvZiBhIHN5bWJvbCBzb21ldGltZXMgYWx0ZXJzIGl0cwotICAgICAgICAgIGxvY2F0aW9uIGluIGFuIG91dHB1dCBmaWxlIC0gaWUgaW4gY29mZiBhIDw8SVNGQ04+PiBzeW1ib2wKLSAgICAgICAgICB3aGljaCBpcyBhbHNvIDw8Q19FWFQ+PiBzeW1ib2wgYXBwZWFycyB3aGVyZSBpdCB3YXMKLSAgICAgICAgICBkZWNsYXJlZCBhbmQgbm90IGF0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgVGhpcyBiaXQgaXMgc2V0Ci0gICAgICAgICAgYnkgdGhlIHRhcmdldCBCRkQgcGFydCB0byBjb252ZXkgdGhpcyBpbmZvcm1hdGlvbi4gKi8KLQotI2RlZmluZSBCU0ZfTk9UX0FUX0VORCAgICAweDQwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgdGhlIGxhYmVsIG9mIGNvbnN0cnVjdG9yIHNlY3Rpb24uICovCi0jZGVmaW5lIEJTRl9DT05TVFJVQ1RPUiAgIDB4ODAwCi0KLSAgICAgICAgLyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBhIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5hbWUgaXMgYQotICAgICAgICAgIHdhcm5pbmcuICBUaGUgbmFtZSBvZiB0aGUgbmV4dCBzeW1ib2wgaXMgdGhlIG9uZSB0byB3YXJuIGFib3V0OwotICAgICAgICAgIGlmIGEgcmVmZXJlbmNlIGlzIG1hZGUgdG8gYSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0Ci0gICAgICAgICAgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkIGJ5IHRoZSBsaW5rZXIuICovCi0jZGVmaW5lIEJTRl9XQVJOSU5HICAgICAgIDB4MTAwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgaW5kaXJlY3QuICBUaGlzIHN5bWJvbCBpcyBhbiBpbmRpcmVjdAotICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQgc3ltYm9sLiAqLwotI2RlZmluZSBCU0ZfSU5ESVJFQ1QgICAgICAweDIwMDAKLQotICAgICAgICAvKiBCU0ZfRklMRSBtYXJrcyBzeW1ib2xzIHRoYXQgY29udGFpbiBhIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZAotICAgICAgICAgIGZvciBFTEYgU1RUX0ZJTEUgc3ltYm9scy4gICovCi0jZGVmaW5lIEJTRl9GSUxFICAgICAgICAgIDB4NDAwMAotCi0gICAgICAgIC8qIFN5bWJvbCBpcyBmcm9tIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIEJTRl9EWU5BTUlDICAgICAgIDB4ODAwMAotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgZGVub3RlcyBhIGRhdGEgb2JqZWN0LiAgVXNlZCBpbiBFTEYsIGFuZCBwZXJoYXBzCi0gICAgICAgICAgb3RoZXJzIHNvbWVkYXkuICAqLwotI2RlZmluZSBCU0ZfT0JKRUNUICAgICAgICAweDEwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzeW1ib2wgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgVGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQKLSAgICAgICAgICBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAgQlNGX0RFQlVHR0lORyBzaG91bGQgYmUgc2V0Ci0gICAgICAgICAgYXMgd2VsbC4gICovCi0jZGVmaW5lIEJTRl9ERUJVR0dJTkdfUkVMT0MgMHgyMDAwMAotCi0gIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICAgIC8qIEEgcG9pbnRlciB0byB0aGUgc2VjdGlvbiB0byB3aGljaCB0aGlzIHN5bWJvbCBpcwotICAgICAgICAgIHJlbGF0aXZlLiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBub24gTlVMTCwgdGhlcmUgYXJlIHNwZWNpYWwKLSAgICAgICAgICBzZWN0aW9ucyBmb3IgdW5kZWZpbmVkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IHNlYyAqc2VjdGlvbjsKLQotICAgICAgICAvKiBCYWNrIGVuZCBzcGVjaWFsIGRhdGEuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIFBUUiBwOwotICAgICAgYmZkX3ZtYSBpOwotICAgIH0gdWRhdGE7Ci0KLX0gYXN5bWJvbDsKLSNkZWZpbmUgYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQoYWJmZCkgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi1ib29sZWFuIAotYmZkX2lzX2xvY2FsX2xhYmVsIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltKSk7Ci0KLWJvb2xlYW4gCi1iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKm5hbWUpKTsKLQotI2RlZmluZSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShhYmZkLCBuYW1lKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUsIChhYmZkLCBuYW1lKSkKLSNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIoYWJmZCwgbG9jYXRpb24pIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX3N5bXRhYixcCi0gICAgICAgICAgICAgICAgICAoYWJmZCwgbG9jYXRpb24pKQotYm9vbGVhbiAKLWJmZF9zZXRfc3ltdGFiICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKipsb2NhdGlvbiwgdW5zaWduZWQgaW50IGNvdW50KSk7Ci0KLXZvaWQgCi1iZmRfcHJpbnRfc3ltYm9sX3ZhbmRmIFBBUkFNUyAoKFBUUiBmaWxlLCBhc3ltYm9sICpzeW1ib2wpKTsKLQotI2RlZmluZSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCkgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9tYWtlX2VtcHR5X3N5bWJvbCwgKGFiZmQpKQotI2RlZmluZSBiZmRfbWFrZV9kZWJ1Z19zeW1ib2woYWJmZCxwdHIsc2l6ZSkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCwgKGFiZmQsIHB0ciwgc2l6ZSkpCi1pbnQgCi1iZmRfZGVjb2RlX3N5bWNsYXNzIFBBUkFNUyAoKGFzeW1ib2wgKnN5bWJvbCkpOwotCi1ib29sZWFuIAotYmZkX2lzX3VuZGVmaW5lZF9zeW1jbGFzcyAgUEFSQU1TICgoaW50IHN5bWNsYXNzKSk7Ci0KLXZvaWQgCi1iZmRfc3ltYm9sX2luZm8gUEFSQU1TICgoYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYXN5bWJvbCAqaXN5bSwgYmZkICpvYmZkLCBhc3ltYm9sICpvc3ltKSk7Ci0KLSNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSwgXAotICAgICAgICAgICAgICAgKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpKQotc3RydWN0IF9iZmQgCi17Ci0gICAgIC8qIFRoZSBmaWxlbmFtZSB0aGUgYXBwbGljYXRpb24gb3BlbmVkIHRoZSBCRkQgd2l0aC4gICovCi0gICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgIAotCi0gICAgIC8qIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGp1bXAgdGFibGUuICAgICAgICAgICAgICovCi0gICAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnh2ZWM7Ci0KLSAgICAgLyogVG8gYXZvaWQgZHJhZ2dpbmcgdG9vIG1hbnkgaGVhZGVyIGZpbGVzIGludG8gZXZlcnkgZmlsZSB0aGF0Ci0gICAgICAgaW5jbHVkZXMgYDw8YmZkLmg+PicsIElPU1RSRUFNIGhhcyBiZWVuIGRlY2xhcmVkIGFzIGEgImNoYXIKLSAgICAgICAqIiwgYW5kIE1USU1FIGFzIGEgImxvbmciLiAgVGhlaXIgY29ycmVjdCB0eXBlcywgdG8gd2hpY2ggdGhleQotICAgICAgIGFyZSBjYXN0IHdoZW4gdXNlZCwgYXJlICJGSUxFICoiIGFuZCAidGltZV90Ii4gICAgVGhlIGlvc3RyZWFtCi0gICAgICAgaXMgdGhlIHJlc3VsdCBvZiBhbiBmb3BlbiBvbiB0aGUgZmlsZW5hbWUuICBIb3dldmVyLCBpZiB0aGUKLSAgICAgICBCRkRfSU5fTUVNT1JZIGZsYWcgaXMgc2V0LCB0aGVuIGlvc3RyZWFtIGlzIGFjdHVhbGx5IGEgcG9pbnRlcgotICAgICAgIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotICAgIFBUUiBpb3N0cmVhbTsKLQotICAgICAvKiBJcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIGNhY2hlZD8gIFRoYXQgaXMsIGNhbiBpdCBiZSBjbG9zZWQgYXMKLSAgICAgICBuZWVkZWQsIGFuZCByZS1vcGVuZWQgd2hlbiBhY2Nlc3NlZCBsYXRlcj8gICovCi0KLSAgICBib29sZWFuIGNhY2hlYWJsZTsKLQotICAgICAvKiBNYXJrcyB3aGV0aGVyIHRoZXJlIHdhcyBhIGRlZmF1bHQgdGFyZ2V0IHNwZWNpZmllZCB3aGVuIHRoZQotICAgICAgIEJGRCB3YXMgb3BlbmVkLiBUaGlzIGlzIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG1hdGNoaW5nIGFsZ29yaXRobQotICAgICAgIHRvIHVzZSB0byBjaG9vc2UgdGhlIGJhY2sgZW5kLiAqLwotCi0gICAgYm9vbGVhbiB0YXJnZXRfZGVmYXVsdGVkOwotCi0gICAgIC8qIFRoZSBjYWNoaW5nIHJvdXRpbmVzIHVzZSB0aGVzZSB0byBtYWludGFpbiBhCi0gICAgICAgbGVhc3QtcmVjZW50bHktdXNlZCBsaXN0IG9mIEJGRHMgKi8KLQotICAgIHN0cnVjdCBfYmZkICpscnVfcHJldiwgKmxydV9uZXh0OwotCi0gICAgIC8qIFdoZW4gYSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgY2FjaGluZyByb3V0aW5lcywgQkZEIHJldGFpbnMKLSAgICAgICBzdGF0ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmlsZSBoZXJlOiAqLwotCi0gICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKLQotICAgICAvKiBhbmQgaGVyZTogKGBgb25jZScnIG1lYW5zIGF0IGxlYXN0IG9uY2UpICovCi0KLSAgICBib29sZWFuIG9wZW5lZF9vbmNlOwotCi0gICAgIC8qIFNldCBpZiB3ZSBoYXZlIGEgbG9jYWxseSBtYWludGFpbmVkIG10aW1lIHZhbHVlLCByYXRoZXIgdGhhbgotICAgICAgIGdldHRpbmcgaXQgZnJvbSB0aGUgZmlsZSBlYWNoIHRpbWU6ICovCi0KLSAgICBib29sZWFuIG10aW1lX3NldDsKLQotICAgICAvKiBGaWxlIG1vZGlmaWVkIHRpbWUsIGlmIG10aW1lX3NldCBpcyB0cnVlOiAqLwotCi0gICAgbG9uZyBtdGltZTsgICAgICAgICAgCi0KLSAgICAgLyogUmVzZXJ2ZWQgZm9yIGFuIHVuaW1wbGVtZW50ZWQgZmlsZSBsb2NraW5nIGV4dGVuc2lvbi4qLwotCi0gICAgaW50IGlmZDsKLQotICAgICAvKiBUaGUgZm9ybWF0IHdoaWNoIGJlbG9uZ3MgdG8gdGhlIEJGRC4gKG9iamVjdCwgY29yZSwgZXRjLikgKi8KLQotICAgIGJmZF9mb3JtYXQgZm9ybWF0OwotCi0gICAgIC8qIFRoZSBkaXJlY3Rpb24gdGhlIEJGRCB3YXMgb3BlbmVkIHdpdGgqLwotCi0gICAgZW51bSBiZmRfZGlyZWN0aW9uIHtub19kaXJlY3Rpb24gPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9kaXJlY3Rpb24gPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhfZGlyZWN0aW9uID0gM30gZGlyZWN0aW9uOwotCi0gICAgIC8qIEZvcm1hdF9zcGVjaWZpYyBmbGFncyovCi0KLSAgICBmbGFnd29yZCBmbGFnczsgICAgICAgICAgICAgIAotCi0gICAgIC8qIEN1cnJlbnRseSBteV9hcmNoaXZlIGlzIHRlc3RlZCBiZWZvcmUgYWRkaW5nIG9yaWdpbiB0bwotICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgotICAgICAgIG9yaWdpbiwgd2l0aCBvcmlnaW4gc2V0IHRvIDAgZm9yIG5vbiBhcmNoaXZlIGZpbGVzLiAgICovCi0KLSAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAotCi0gICAgIC8qIFJlbWVtYmVyIHdoZW4gb3V0cHV0IGhhcyBiZWd1biwgdG8gc3RvcCBzdHJhbmdlIHRoaW5ncwotICAgICAgIGZyb20gaGFwcGVuaW5nLiAqLwotICAgIGJvb2xlYW4gb3V0cHV0X2hhc19iZWd1bjsKLQotICAgICAvKiBQb2ludGVyIHRvIGxpbmtlZCBsaXN0IG9mIHNlY3Rpb25zKi8KLSAgICBzdHJ1Y3Qgc2VjICAqc2VjdGlvbnM7Ci0KLSAgICAgLyogVGhlIG51bWJlciBvZiBzZWN0aW9ucyAqLwotICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50OwotCi0gICAgIC8qIFN0dWZmIG9ubHkgdXNlZnVsIGZvciBvYmplY3QgZmlsZXM6IAotICAgICAgIFRoZSBzdGFydCBhZGRyZXNzLiAqLwotICAgIGJmZF92bWEgc3RhcnRfYWRkcmVzczsKLQotICAgICAvKiBVc2VkIGZvciBpbnB1dCBhbmQgb3V0cHV0Ki8KLSAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7Ci0KLSAgICAgLyogU3ltYm9sIHRhYmxlIGZvciBvdXRwdXQgQkZEICh3aXRoIHN5bWNvdW50IGVudHJpZXMpICovCi0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKipvdXRzeW1ib2xzOyAgICAgICAgICAgICAKLQotICAgICAvKiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qLwotICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcmNoX2luZm87Ci0KLSAgICAgLyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIGFyY2hpdmVzOiovCi0gICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKLSAgICBzdHJ1Y3QgX2JmZCAqbXlfYXJjaGl2ZTsgICAgICAvKiBUaGUgY29udGFpbmluZyBhcmNoaXZlIEJGRC4gICovCi0gICAgc3RydWN0IF9iZmQgKm5leHQ7ICAgICAgICAgICAgLyogVGhlIG5leHQgQkZEIGluIHRoZSBhcmNoaXZlLiAgKi8KLSAgICBzdHJ1Y3QgX2JmZCAqYXJjaGl2ZV9oZWFkOyAgICAvKiBUaGUgZmlyc3QgQkZEIGluIHRoZSBhcmNoaXZlLiAgKi8KLSAgICBib29sZWFuIGhhc19hcm1hcDsgICAgICAgICAgIAotCi0gICAgIC8qIEEgY2hhaW4gb2YgQkZEIHN0cnVjdHVyZXMgaW52b2x2ZWQgaW4gYSBsaW5rLiAgKi8KLSAgICBzdHJ1Y3QgX2JmZCAqbGlua19uZXh0OwotCi0gICAgIC8qIEEgZmllbGQgdXNlZCBieSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLiAgVGhpcyB3aWxsCi0gICAgICAgYmUgdXNlZCBvbmx5IGZvciBhcmNoaXZlIGVsZW1lbnRzLiAgKi8KLSAgICBpbnQgYXJjaGl2ZV9wYXNzOwotCi0gICAgIC8qIFVzZWQgYnkgdGhlIGJhY2sgZW5kIHRvIGhvbGQgcHJpdmF0ZSBkYXRhLiAqLwotCi0gICAgdW5pb24gCi0gICAgICB7Ci0gICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqYW91dF9kYXRhOwotICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKLSAgICAgIHN0cnVjdCBfb2FzeXNfZGF0YSAqb2FzeXNfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgKm9hc3lzX2FyX2RhdGE7Ci0gICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBwZV90ZGF0YSAqcGVfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmX29ial9kYXRhOwotICAgICAgc3RydWN0IGVjb2ZmX3RkYXRhICplY29mZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBpZWVlX2RhdGFfc3RydWN0ICppZWVlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaWVlZV9hcl9kYXRhX3N0cnVjdCAqaWVlZV9hcl9kYXRhOwotICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKLSAgICAgIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICppaGV4X2RhdGE7Ci0gICAgICBzdHJ1Y3QgdGVraGV4X2RhdGFfc3RydWN0ICp0ZWtoZXhfZGF0YTsKLSAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgbmxtX29ial90ZGF0YSAqbmxtX29ial9kYXRhOwotICAgICAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKmJvdXRfZGF0YTsKLSAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QgKnN1bl9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqc2NvNV9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqdHJhZF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICpzb21fZGF0YTsKLSAgICAgIHN0cnVjdCBocHV4X2NvcmVfc3RydWN0ICpocHV4X2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICpocHBhYnNkX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKnNnaV9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAqbHlueF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0ICpvc2ZfY29yZV9kYXRhOwotICAgICAgc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICpjaXNjb19jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgdmVyc2Fkb3NfZGF0YV9zdHJ1Y3QgKnZlcnNhZG9zX2RhdGE7Ci0gICAgICBzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICpuZXRic2RfY29yZV9kYXRhOwotICAgICAgUFRSIGFueTsKLSAgICAgIH0gdGRhdGE7Ci0gIAotICAgICAvKiBVc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBob2xkIHByaXZhdGUgZGF0YSovCi0gICAgUFRSIHVzcmRhdGE7Ci0KLSAgIC8qIFdoZXJlIGFsbCB0aGUgYWxsb2NhdGVkIHN0dWZmIHVuZGVyIHRoaXMgQkZEIGdvZXMuICBUaGlzIGlzIGEKLSAgICAgc3RydWN0IG9iamFsbG9jICosIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mCi0gICAgIG9iamFsbG9jLmguICAqLwotICAgIFBUUiBtZW1vcnk7Ci19OwotCi10eXBlZGVmIGVudW0gYmZkX2Vycm9yCi17Ci0gIGJmZF9lcnJvcl9ub19lcnJvciA9IDAsCi0gIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwKLSAgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotICBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LAotICBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24sCi0gIGJmZF9lcnJvcl9ub19tZW1vcnksCi0gIGJmZF9lcnJvcl9ub19zeW1ib2xzLAotICBiZmRfZXJyb3Jfbm9fYXJtYXAsCi0gIGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzLAotICBiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUsCi0gIGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkLAotICBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLAotICBiZmRfZXJyb3Jfbm9fY29udGVudHMsCi0gIGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sCi0gIGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uLAotICBiZmRfZXJyb3JfYmFkX3ZhbHVlLAotICBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsCi0gIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcsCi0gIGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGUKLX0gYmZkX2Vycm9yX3R5cGU7Ci0KLWJmZF9lcnJvcl90eXBlIAotYmZkX2dldF9lcnJvciAgUEFSQU1TICgodm9pZCkpOwotCi12b2lkIAotYmZkX3NldF9lcnJvciAgUEFSQU1TICgoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKSk7Ci0KLUNPTlNUIGNoYXIgKgotYmZkX2Vycm1zZyAgUEFSQU1TICgoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKSk7Ci0KLXZvaWQgCi1iZmRfcGVycm9yICBQQVJBTVMgKChDT05TVCBjaGFyICptZXNzYWdlKSk7Ci0KLXR5cGVkZWYgdm9pZCAoKmJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgCi1iZmRfc2V0X2Vycm9yX2hhbmRsZXIgIFBBUkFNUyAoKGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpKTsKLQotdm9pZCAKLWJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lICBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSAKLWJmZF9nZXRfZXJyb3JfaGFuZGxlciAgUEFSQU1TICgodm9pZCkpOwotCi1sb25nIAotYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0KSk7Ci0KLWxvbmcgCi1iZmRfY2Fub25pY2FsaXplX3JlbG9jCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWMsCi0gICAgYXJlbGVudCAqKmxvYywKLSAgICBhc3ltYm9sICoqc3ltcykpOwotCi12b2lkIAotYmZkX3NldF9yZWxvYwotIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYXJlbGVudCAqKnJlbCwgdW5zaWduZWQgaW50IGNvdW50KQotICAgIAotICAgICk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X2ZpbGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotCi1ib29sZWFuIAotYmZkX3NldF9zdGFydF9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3ZtYSB2bWEpKTsKLQotbG9uZyAKLWJmZF9nZXRfbXRpbWUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcgCi1iZmRfZ2V0X3NpemUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWludCAKLWJmZF9nZXRfZ3Bfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdm9pZCAKLWJmZF9zZXRfZ3Bfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpKSk7Ci0KLWJmZF92bWEgCi1iZmRfc2Nhbl92bWEgUEFSQU1TICgoQ09OU1QgY2hhciAqc3RyaW5nLCBDT05TVCBjaGFyICoqZW5kLCBpbnQgYmFzZSkpOwotCi1ib29sZWFuIAotYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOwotCi0jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBvYmZkKSkKLWJvb2xlYW4gCi1iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOwotCi0jZGVmaW5lIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKLSAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgXAotICAgICAgICAgICAgICAgKGliZmQsIG9iZmQpKQotYm9vbGVhbiAKLWJmZF9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKSk7Ci0KLSNkZWZpbmUgYmZkX3NldF9wcml2YXRlX2ZsYWdzKGFiZmQsIGZsYWdzKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NldF9wcml2YXRlX2ZsYWdzLCBcCi0gICAgICAgICAgICAgICAoYWJmZCwgZmxhZ3MpKQotI2RlZmluZSBiZmRfc2l6ZW9mX2hlYWRlcnMoYWJmZCwgcmVsb2MpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2l6ZW9mX2hlYWRlcnMsIChhYmZkLCByZWxvYykpCi0KLSNkZWZpbmUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmRfbmVhcmVzdF9saW5lLCAgKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSkKLQotICAgICAgICAvKiBEbyB0aGVzZSB0aHJlZSBkbyBhbnl0aGluZyB1c2VmdWwgYXQgYWxsLCBmb3IgYW55IGJhY2sgZW5kPyAgKi8KLSNkZWZpbmUgYmZkX2RlYnVnX2luZm9fc3RhcnQoYWJmZCkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2RlYnVnX2luZm9fZW5kKGFiZmQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19lbmQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKGFiZmQsIHNlY3Rpb24pIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLCAoYWJmZCwgc2VjdGlvbikpCi0KLQotI2RlZmluZSBiZmRfc3RhdF9hcmNoX2VsdChhYmZkLCBzdGF0KSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3N0YXRfYXJjaF9lbHQsKGFiZmQsIHN0YXQpKQotCi0jZGVmaW5lIGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKGFiZmQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGFyY2gsIG1hY2gpXAotICAgICAgICBCRkRfU0VORCAoIGFiZmQsIF9iZmRfc2V0X2FyY2hfbWFjaCwgKGFiZmQsIGFyY2gsIG1hY2gpKQotCi0jZGVmaW5lIGJmZF9yZWxheF9zZWN0aW9uKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWxheF9zZWN0aW9uLCAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikpCi0KLSNkZWZpbmUgYmZkX2djX3NlY3Rpb25zKGFiZmQsIGxpbmtfaW5mbykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2djX3NlY3Rpb25zLCAoYWJmZCwgbGlua19pbmZvKSkKLQotI2RlZmluZSBiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZShhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9saW5rX2FkZF9zeW1ib2xzKGFiZmQsIGluZm8pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2FkZF9zeW1ib2xzLCAoYWJmZCwgaW5mbykpCi0KLSNkZWZpbmUgYmZkX2ZpbmFsX2xpbmsoYWJmZCwgaW5mbykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmFsX2xpbmssIChhYmZkLCBpbmZvKSkKLQotI2RlZmluZSBiZmRfZnJlZV9jYWNoZWRfaW5mbyhhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZnJlZV9jYWNoZWRfaW5mbywgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQoYWJmZCkgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKGFiZmQsIGZpbGUpXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsIChhYmZkLCBmaWxlKSkKLQotI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKGFiZmQsIGFzeW1ib2xzKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLCAoYWJmZCwgYXN5bWJvbHMpKQotCi0jZGVmaW5lIGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZChhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MoYWJmZCwgYXJlbHMsIGFzeW1zKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MsIChhYmZkLCBhcmVscywgYXN5bXMpKQotCi1leHRlcm4gYmZkX2J5dGUgKmJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgICAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLSAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJmZF9ieXRlICosCi0gICAgICAgICAgICAgICAgIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLQotc3ltaW5kZXggCi1iZmRfZ2V0X25leHRfbWFwZW50IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3ltaW5kZXggcHJldmlvdXMsIGNhcnN5bSAqKnN5bSkpOwotCi1ib29sZWFuIAotYmZkX3NldF9hcmNoaXZlX2hlYWQgUEFSQU1TICgoYmZkICpvdXRwdXQsIGJmZCAqbmV3X2hlYWQpKTsKLQotYmZkICoKLWJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICphcmNoaXZlLCBiZmQgKnByZXZpb3VzKSk7Ci0KLUNPTlNUIGNoYXIgKgotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWludCAKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci0KLSNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICAgICAgICAgICAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KQotCi0jaWZkZWYgREVCVUdfQkZEX1NFTkQKLSN1bmRlZiBCRkRfU0VORAotI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLSAgKCgoYmZkKSAmJiAoYmZkKS0+eHZlYyAmJiAoYmZkKS0+eHZlYy0+bWVzc2FnZSkgPyBcCi0gICAgKCgqKChiZmQpLT54dmVjLT5tZXNzYWdlKSkgYXJnbGlzdCkgOiBcCi0gICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0jZW5kaWYKLSNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotICAgICAgICAgICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpCi0KLSNpZmRlZiBERUJVR19CRkRfU0VORAotI3VuZGVmIEJGRF9TRU5EX0ZNVAotI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpIDogXAotICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0jZW5kaWYKLWVudW0gYmZkX2ZsYXZvdXIgewotICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X29hc3lzX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9zb21fZmxhdm91ciwKLSAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfdmVyc2Fkb3NfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKLX07Ci0KLWVudW0gYmZkX2VuZGlhbiB7IEJGRF9FTkRJQU5fQklHLCBCRkRfRU5ESUFOX0xJVFRMRSwgQkZEX0VORElBTl9VTktOT1dOIH07Ci0KLSAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2luZm8gX2JmZF9saW5rX2luZm87Ci0KLXR5cGVkZWYgc3RydWN0IGJmZF90YXJnZXQKLXsKLSAgY2hhciAqbmFtZTsKLSAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOwotICBlbnVtIGJmZF9lbmRpYW4gYnl0ZW9yZGVyOwotICBlbnVtIGJmZF9lbmRpYW4gaGVhZGVyX2J5dGVvcmRlcjsKLSAgZmxhZ3dvcmQgb2JqZWN0X2ZsYWdzOyAgICAgICAKLSAgZmxhZ3dvcmQgc2VjdGlvbl9mbGFnczsKLSAgY2hhciBzeW1ib2xfbGVhZGluZ19jaGFyOwotICBjaGFyIGFyX3BhZF9jaGFyOyAgICAgICAgICAgIAotICB1bnNpZ25lZCBzaG9ydCBhcl9tYXhfbmFtZWxlbjsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHg2NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4MzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfNjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8xNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKigqX2JmZF9jaGVja19mb3JtYXRbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfc2V0X2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF93cml0ZV9jb250ZW50c1tiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi0gICAvKiBHZW5lcmljIGVudHJ5IHBvaW50cy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMoTkFNRSlcCi1DQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKLUNBVChOQU1FLF9iZmRfZnJlZV9jYWNoZWRfaW5mbyksXAotQ0FUKE5BTUUsX25ld19zZWN0aW9uX2hvb2spLFwKLUNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAotQ0FUKE5BTUUsX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKLQotICAgLyogQ2FsbGVkIHdoZW4gdGhlIEJGRCBpcyBiZWluZyBjbG9zZWQgdG8gZG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKLSAgIC8qIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAvKiBDYWxsZWQgd2hlbiBhIG5ldyBzZWN0aW9uIGlzIGNyZWF0ZWQuICAqLwotICBib29sZWFuICAgICAgICgqX25ld19zZWN0aW9uX2hvb2spIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci0gICAvKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotICAgLyogRW50cnkgcG9pbnRzIHRvIGNvcHkgcHJpdmF0ZSBkYXRhLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKLUNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKSxcCi1DQVQoTkFNRSxfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAotQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpLFwKLUNBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCi0gICAvKiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgICAgdG8gYW5vdGhlci4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0gICAvKiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICAgIHRvIGEgY29tbW9uIG91dHB1dCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICAgIHRvIGFub3RoZXIuICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOwotICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAotICAgICB0byBhbm90aGVyLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqLCBhc3ltYm9sICopKTsKLSAgIC8qIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9wcml2YXRlX2ZsYWdzKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLQotICAgLyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0gICAvKiBDb3JlIGZpbGUgZW50cnkgcG9pbnRzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKLUNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSxcCi1DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKSxcCi1DQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotICBjaGFyICogICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSBQQVJBTVMgKChiZmQgKikpOwotICBpbnQgICAgICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLSAgIC8qIEFyY2hpdmUgZW50cnkgcG9pbnRzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQVJDSElWRShOQU1FKVwKLUNBVChOQU1FLF9zbHVycF9hcm1hcCksXAotQ0FUKE5BTUUsX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpLFwKLUNBVChOQU1FLF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSksXAotQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAotQ0FUKE5BTUUsX3dyaXRlX2FybWFwKSxcCi1DQVQoTkFNRSxfcmVhZF9hcl9oZHIpLFwKLUNBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKLUNBVChOQU1FLF9nZXRfZWx0X2F0X2luZGV4KSxcCi1DQVQoTkFNRSxfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KSxcCi1DQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKLSAgYm9vbGVhbiAgKCpfYmZkX3NsdXJwX2FybWFwKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAoKl9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQotICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSAgdm9pZCAgICAgKCpfYmZkX3RydW5jYXRlX2FybmFtZSkgUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgY2hhciAqKSk7Ci0gIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcmwgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkeCkpOwotICBQVFIgKCpfYmZkX3JlYWRfYXJfaGRyX2ZuKSBQQVJBTVMgKChiZmQgKikpOwotICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKLSNkZWZpbmUgYmZkX2dldF9lbHRfYXRfaW5kZXgoYixpKSBCRkRfU0VORChiLCBfYmZkX2dldF9lbHRfYXRfaW5kZXgsIChiLGkpKQotICBiZmQgKiAgICAoKl9iZmRfZ2V0X2VsdF9hdF9pbmRleCkgUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci0gIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotICBib29sZWFuICAoKl9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkgUEFSQU1TICgoYmZkICopKTsKLQotICAgLyogRW50cnkgcG9pbnRzIHVzZWQgZm9yIHN5bWJvbHMuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAotQ0FUKE5BTUUsX2dldF9zeW10YWJfdXBwZXJfYm91bmQpLFwKLUNBVChOQU1FLF9nZXRfc3ltdGFiKSxcCi1DQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKLUNBVChOQU1FLF9wcmludF9zeW1ib2wpLFwKLUNBVChOQU1FLF9nZXRfc3ltYm9sX2luZm8pLFwKLUNBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAotQ0FUKE5BTUUsX2dldF9saW5lbm8pLFwKLUNBVChOQU1FLF9maW5kX25lYXJlc3RfbGluZSksXAotQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAotQ0FUKE5BTUUsX3JlYWRfbWluaXN5bWJvbHMpLFwKLUNBVChOQU1FLF9taW5pc3ltYm9sX3RvX3N5bWJvbCkKLSAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiKSBQQVJBTVMgKChiZmQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgotICAgICAgICAgICAgICAgICgqX2JmZF9tYWtlX2VtcHR5X3N5bWJvbCkgUEFSQU1TICgoYmZkICopKTsKLSAgdm9pZCAgICAgICAgICAoKl9iZmRfcHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgUFRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotI2RlZmluZSBiZmRfcHJpbnRfc3ltYm9sKGIscCxzLGUpIEJGRF9TRU5EKGIsIF9iZmRfcHJpbnRfc3ltYm9sLCAoYixwLHMsZSkpCi0gIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2luZm8gKikpOwotI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSkgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi0gIGFsZW50ICogICAgKCpfZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKikpOwotICBib29sZWFuICAgICgqX2JmZF9maW5kX25lYXJlc3RfbGluZSkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKLSAgICAgICAgICAgICAgICAgICAgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlLCBDT05TVCBjaGFyICoqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpsaW5lKSk7Ci0gIC8qIEJhY2stZG9vciB0byBhbGxvdyBmb3JtYXQtYXdhcmUgYXBwbGljYXRpb25zIHRvIGNyZWF0ZSBkZWJ1ZyBzeW1ib2xzCi0gICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0gICAgd2hlbiBjcmVhdGluZyBDT0ZGIGZpbGVzLiAgKi8KLSAgYXN5bWJvbCAqICAoKl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICB2b2lkICpwdHIsCi0gICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSk7Ci0jZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKLSAgQkZEX1NFTkQgKGIsIF9yZWFkX21pbmlzeW1ib2xzLCAoYiwgZCwgbSwgcykpCi0gIGxvbmcgICgqX3JlYWRfbWluaXN5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKLSNkZWZpbmUgYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sKGIsIGQsIG0sIGYpIFwKLSAgQkZEX1NFTkQgKGIsIF9taW5pc3ltYm9sX3RvX3N5bWJvbCwgKGIsIGQsIG0sIGYpKQotICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKikpOwotCi0gICAvKiBSb3V0aW5lcyBmb3IgcmVsb2NzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAotQ0FUKE5BTUUsX2dldF9yZWxvY191cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9yZWxvYyksXAotQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKLSAgbG9uZyAgKCpfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgYXJlbGVudCAqKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotICAgLyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqLwotICByZWxvY19ob3d0b190eXBlICoKLSAgICAgICAoKnJlbG9jX3R5cGVfbG9va3VwKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotICAgLyogUm91dGluZXMgdXNlZCB3aGVuIHdyaXRpbmcgYW4gb2JqZWN0IGZpbGUuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9XUklURShOQU1FKVwKLUNBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCi1DQVQoTkFNRSxfc2V0X3NlY3Rpb25fY29udGVudHMpCi0gIGJvb2xlYW4gICAgKCpfYmZkX3NldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgIC8qIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0xJTksoTkFNRSlcCi1DQVQoTkFNRSxfc2l6ZW9mX2hlYWRlcnMpLFwKLUNBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCi1DQVQoTkFNRSxfYmZkX3JlbGF4X3NlY3Rpb24pLFwKLUNBVChOQU1FLF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSksXAotQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCi1DQVQoTkFNRSxfYmZkX2ZpbmFsX2xpbmspLFwKLUNBVChOQU1FLF9iZmRfbGlua19zcGxpdF9zZWN0aW9uKSxcCi1DQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQotICBpbnQgICAgICAgICgqX2JmZF9zaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLSAgYmZkX2J5dGUgKiAoKl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0gICAgICAgICAgICAgICAgICAgIGJmZF9ieXRlICpkYXRhLCBib29sZWFuIHJlbG9jYXRlYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotCi0gIGJvb2xlYW4gICAgKCpfYmZkX3JlbGF4X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICosCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKmFnYWluKSk7Ci0KLSAgIC8qIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLSAgICAgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoaXMgdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCpfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgIC8qIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfbGlua19hZGRfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAgLyogRG8gYSBsaW5rIGJhc2VkIG9uIHRoZSBsaW5rX29yZGVyIHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaAotICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqLwotICBib29sZWFuICgqX2JmZF9maW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gICAvKiBTaG91bGQgdGhpcyBzZWN0aW9uIGJlIHNwbGl0IHVwIGludG8gc21hbGxlciBwaWVjZXMgZHVyaW5nIGxpbmtpbmcuICAqLwotICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLQotICAgLyogUmVtb3ZlIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGZyb20gdGhlIG91dHB1dC4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2djX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gICAvKiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDKE5BTUUpXAotQ0FUKE5BTUUsX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAotQ0FUKE5BTUUsX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSxcCi1DQVQoTkFNRSxfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCi0gICAvKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAqLwotICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYikKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotICAgLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLSAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCi0gICAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLQotICAvKiBPcHBvc2l0ZSBlbmRpYW4gdmVyc2lvbiBvZiB0aGlzIHRhcmdldC4gICovICAKLSBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqIGFsdGVybmF0aXZlX3RhcmdldDsKLSAKLSBQVFIgYmFja2VuZF9kYXRhOwotIAotfSBiZmRfdGFyZ2V0OwotYm9vbGVhbiAKLWJmZF9zZXRfZGVmYXVsdF90YXJnZXQgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLQotY29uc3QgYmZkX3RhcmdldCAqCi1iZmRfZmluZF90YXJnZXQgUEFSQU1TICgoQ09OU1QgY2hhciAqdGFyZ2V0X25hbWUsIGJmZCAqYWJmZCkpOwotCi1jb25zdCBjaGFyICoqCi1iZmRfdGFyZ2V0X2xpc3QgUEFSQU1TICgodm9pZCkpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICogCi1iZmRfc2VhcmNoX2Zvcl90YXJnZXQgIFBBUkFNUyAoKGludCAoKiBzZWFyY2hfZnVuYykoY29uc3QgYmZkX3RhcmdldCAqLCB2b2lkICopLCB2b2lkICopKTsKLQotYm9vbGVhbiAKLWJmZF9jaGVja19mb3JtYXQgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCkpOwotCi1ib29sZWFuIAotYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQsIGNoYXIgKioqbWF0Y2hpbmcpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfZm9ybWF0IFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpKTsKLQotQ09OU1QgY2hhciAqCi1iZmRfZm9ybWF0X3N0cmluZyBQQVJBTVMgKChiZmRfZm9ybWF0IGZvcm1hdCkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvYmZkLmMgYi9iZmQvYmZkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDE3MmYuLjAwMDAwMDAKLS0tIGEvYmZkL2JmZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MyArMCwwIEBACi0vKiBHZW5lcmljIEJGRCBsaWJyYXJ5IGludGVyZmFjZSBhbmQgc3VwcG9ydCByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQk8PHR5cGVkZWYgYmZkPj4KLQotCUEgQkZEIGhhcyB0eXBlIDw8YmZkPj47IG9iamVjdHMgb2YgdGhpcyB0eXBlIGFyZSB0aGUKLQljb3JuZXJzdG9uZSBvZiBhbnkgYXBwbGljYXRpb24gdXNpbmcgQkZELiBVc2luZyBCRkQKLQljb25zaXN0cyBvZiBtYWtpbmcgcmVmZXJlbmNlcyB0aG91Z2ggdGhlIEJGRCBhbmQgdG8gZGF0YSBpbiB0aGUgQkZELgotCi0JSGVyZSBpcyB0aGUgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyB0aGUgdHlwZSA8PGJmZD4+LiAgSXQKLQljb250YWlucyB0aGUgbWFqb3IgZGF0YSBhYm91dCB0aGUgZmlsZSBhbmQgcG9pbnRlcnMKLQl0byB0aGUgcmVzdCBvZiB0aGUgZGF0YS4KLQotQ09ERV9GUkFHTUVOVAotLgotLnN0cnVjdCBfYmZkIAotLnsKLS4gICAgeyogVGhlIGZpbGVuYW1lIHRoZSBhcHBsaWNhdGlvbiBvcGVuZWQgdGhlIEJGRCB3aXRoLiAgKn0KLS4gICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgIAotLgotLiAgICB7KiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBqdW1wIHRhYmxlLiAgICAgICAgICAgICAqfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqeHZlYzsKLS4KLS4gICAgeyogVG8gYXZvaWQgZHJhZ2dpbmcgdG9vIG1hbnkgaGVhZGVyIGZpbGVzIGludG8gZXZlcnkgZmlsZSB0aGF0Ci0uICAgICAgIGluY2x1ZGVzIGA8PGJmZC5oPj4nLCBJT1NUUkVBTSBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhICJjaGFyCi0uICAgICAgICoiLCBhbmQgTVRJTUUgYXMgYSAibG9uZyIuICBUaGVpciBjb3JyZWN0IHR5cGVzLCB0byB3aGljaCB0aGV5Ci0uICAgICAgIGFyZSBjYXN0IHdoZW4gdXNlZCwgYXJlICJGSUxFICoiIGFuZCAidGltZV90Ii4gICAgVGhlIGlvc3RyZWFtCi0uICAgICAgIGlzIHRoZSByZXN1bHQgb2YgYW4gZm9wZW4gb24gdGhlIGZpbGVuYW1lLiAgSG93ZXZlciwgaWYgdGhlCi0uICAgICAgIEJGRF9JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoZW4gaW9zdHJlYW0gaXMgYWN0dWFsbHkgYSBwb2ludGVyCi0uICAgICAgIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqfQotLiAgICBQVFIgaW9zdHJlYW07Ci0uCi0uICAgIHsqIElzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgY2FjaGVkPyAgVGhhdCBpcywgY2FuIGl0IGJlIGNsb3NlZCBhcwotLiAgICAgICBuZWVkZWQsIGFuZCByZS1vcGVuZWQgd2hlbiBhY2Nlc3NlZCBsYXRlcj8gICp9Ci0uCi0uICAgIGJvb2xlYW4gY2FjaGVhYmxlOwotLgotLiAgICB7KiBNYXJrcyB3aGV0aGVyIHRoZXJlIHdhcyBhIGRlZmF1bHQgdGFyZ2V0IHNwZWNpZmllZCB3aGVuIHRoZQotLiAgICAgICBCRkQgd2FzIG9wZW5lZC4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB3aGljaCBtYXRjaGluZyBhbGdvcml0aG0KLS4gICAgICAgdG8gdXNlIHRvIGNob29zZSB0aGUgYmFjayBlbmQuICp9Ci0uCi0uICAgIGJvb2xlYW4gdGFyZ2V0X2RlZmF1bHRlZDsKLS4KLS4gICAgeyogVGhlIGNhY2hpbmcgcm91dGluZXMgdXNlIHRoZXNlIHRvIG1haW50YWluIGEKLS4gICAgICAgbGVhc3QtcmVjZW50bHktdXNlZCBsaXN0IG9mIEJGRHMgKn0KLS4KLS4gICAgc3RydWN0IF9iZmQgKmxydV9wcmV2LCAqbHJ1X25leHQ7Ci0uCi0uICAgIHsqIFdoZW4gYSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgY2FjaGluZyByb3V0aW5lcywgQkZEIHJldGFpbnMKLS4gICAgICAgc3RhdGUgaW5mb3JtYXRpb24gb24gdGhlIGZpbGUgaGVyZTogKn0KLS4KLS4gICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogYW5kIGhlcmU6IChgYG9uY2UnJyBtZWFucyBhdCBsZWFzdCBvbmNlKSAqfQotLgotLiAgICBib29sZWFuIG9wZW5lZF9vbmNlOwotLgotLiAgICB7KiBTZXQgaWYgd2UgaGF2ZSBhIGxvY2FsbHkgbWFpbnRhaW5lZCBtdGltZSB2YWx1ZSwgcmF0aGVyIHRoYW4KLS4gICAgICAgZ2V0dGluZyBpdCBmcm9tIHRoZSBmaWxlIGVhY2ggdGltZTogKn0KLS4KLS4gICAgYm9vbGVhbiBtdGltZV9zZXQ7Ci0uCi0uICAgIHsqIEZpbGUgbW9kaWZpZWQgdGltZSwgaWYgbXRpbWVfc2V0IGlzIHRydWU6ICp9Ci0uCi0uICAgIGxvbmcgbXRpbWU7ICAgICAgICAgIAotLgotLiAgICB7KiBSZXNlcnZlZCBmb3IgYW4gdW5pbXBsZW1lbnRlZCBmaWxlIGxvY2tpbmcgZXh0ZW5zaW9uLip9Ci0uCi0uICAgIGludCBpZmQ7Ci0uCi0uICAgIHsqIFRoZSBmb3JtYXQgd2hpY2ggYmVsb25ncyB0byB0aGUgQkZELiAob2JqZWN0LCBjb3JlLCBldGMuKSAqfQotLgotLiAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLS4KLS4gICAgeyogVGhlIGRpcmVjdGlvbiB0aGUgQkZEIHdhcyBvcGVuZWQgd2l0aCp9Ci0uCi0uICAgIGVudW0gYmZkX2RpcmVjdGlvbiB7bm9fZGlyZWN0aW9uID0gMCwKLS4gICAgICAgICAgICAgICAgICAgICAgICByZWFkX2RpcmVjdGlvbiA9IDEsCi0uICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKLS4gICAgICAgICAgICAgICAgICAgICAgICBib3RoX2RpcmVjdGlvbiA9IDN9IGRpcmVjdGlvbjsKLS4KLS4gICAgeyogRm9ybWF0X3NwZWNpZmljIGZsYWdzKn0KLS4KLS4gICAgZmxhZ3dvcmQgZmxhZ3M7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogQ3VycmVudGx5IG15X2FyY2hpdmUgaXMgdGVzdGVkIGJlZm9yZSBhZGRpbmcgb3JpZ2luIHRvCi0uICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgotLiAgICAgICBvcmlnaW4sIHdpdGggb3JpZ2luIHNldCB0byAwIGZvciBub24gYXJjaGl2ZSBmaWxlcy4gICAqfQotLgotLiAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAotLgotLiAgICB7KiBSZW1lbWJlciB3aGVuIG91dHB1dCBoYXMgYmVndW4sIHRvIHN0b3Agc3RyYW5nZSB0aGluZ3MKLS4gICAgICAgZnJvbSBoYXBwZW5pbmcuICp9Ci0uICAgIGJvb2xlYW4gb3V0cHV0X2hhc19iZWd1bjsKLS4KLS4gICAgeyogUG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyp9Ci0uICAgIHN0cnVjdCBzZWMgICpzZWN0aW9uczsKLS4KLS4gICAgeyogVGhlIG51bWJlciBvZiBzZWN0aW9ucyAqfQotLiAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKLS4KLS4gICAgeyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIG9iamVjdCBmaWxlczogCi0uICAgICAgIFRoZSBzdGFydCBhZGRyZXNzLiAqfQotLiAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0uCi0uICAgIHsqIFVzZWQgZm9yIGlucHV0IGFuZCBvdXRwdXQqfQotLiAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7Ci0uCi0uICAgIHsqIFN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IEJGRCAod2l0aCBzeW1jb3VudCBlbnRyaWVzKSAqfQotLiAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqKm91dHN5bWJvbHM7ICAgICAgICAgICAgIAotLgotLiAgICB7KiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaF9pbmZvOwotLgotLiAgICB7KiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3IgYXJjaGl2ZXM6Kn0KLS4gICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKLS4gICAgc3RydWN0IF9iZmQgKm15X2FyY2hpdmU7ICAgICB7KiBUaGUgY29udGFpbmluZyBhcmNoaXZlIEJGRC4gICp9Ci0uICAgIHN0cnVjdCBfYmZkICpuZXh0OyAgICAgICAgICAgeyogVGhlIG5leHQgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgc3RydWN0IF9iZmQgKmFyY2hpdmVfaGVhZDsgICB7KiBUaGUgZmlyc3QgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgYm9vbGVhbiBoYXNfYXJtYXA7ICAgICAgICAgICAKLS4KLS4gICAgeyogQSBjaGFpbiBvZiBCRkQgc3RydWN0dXJlcyBpbnZvbHZlZCBpbiBhIGxpbmsuICAqfQotLiAgICBzdHJ1Y3QgX2JmZCAqbGlua19uZXh0OwotLgotLiAgICB7KiBBIGZpZWxkIHVzZWQgYnkgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gIFRoaXMgd2lsbAotLiAgICAgICBiZSB1c2VkIG9ubHkgZm9yIGFyY2hpdmUgZWxlbWVudHMuICAqfQotLiAgICBpbnQgYXJjaGl2ZV9wYXNzOwotLgotLiAgICB7KiBVc2VkIGJ5IHRoZSBiYWNrIGVuZCB0byBob2xkIHByaXZhdGUgZGF0YS4gKn0KLS4KLS4gICAgdW5pb24gCi0uICAgICAgewotLiAgICAgIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICphb3V0X2RhdGE7Ci0uICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgX29hc3lzX2RhdGEgKm9hc3lzX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCBfb2FzeXNfYXJfZGF0YSAqb2FzeXNfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgcGVfdGRhdGEgKnBlX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCB4Y29mZl90ZGF0YSAqeGNvZmZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IGVjb2ZmX3RkYXRhICplY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWVlZV9kYXRhX3N0cnVjdCAqaWVlZV9kYXRhOwotLiAgICAgIHN0cnVjdCBpZWVlX2FyX2RhdGFfc3RydWN0ICppZWVlX2FyX2RhdGE7Ci0uICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqaWhleF9kYXRhOwotLiAgICAgIHN0cnVjdCB0ZWtoZXhfZGF0YV9zdHJ1Y3QgKnRla2hleF9kYXRhOwotLiAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKm5sbV9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqYm91dF9kYXRhOwotLiAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QgKnN1bl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKnNjbzVfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICp0cmFkX2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICpzb21fZGF0YTsKLS4gICAgICBzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAqaHB1eF9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmhwcGFic2RfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKnNnaV9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKmx5bnhfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgKm9zZl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICpjaXNjb19jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0ICp2ZXJzYWRvc19kYXRhOwotLiAgICAgIHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QgKm5ldGJzZF9jb3JlX2RhdGE7Ci0uICAgICAgUFRSIGFueTsKLS4gICAgICB9IHRkYXRhOwotLiAgCi0uICAgIHsqIFVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGhvbGQgcHJpdmF0ZSBkYXRhKn0KLS4gICAgUFRSIHVzcmRhdGE7Ci0uCi0uICB7KiBXaGVyZSBhbGwgdGhlIGFsbG9jYXRlZCBzdHVmZiB1bmRlciB0aGlzIEJGRCBnb2VzLiAgVGhpcyBpcyBhCi0uICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKiwgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2YKLS4gICAgIG9iamFsbG9jLmguICAqfQotLiAgICBQVFIgbWVtb3J5OwotLn07Ci0uCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0jdW5kZWYgb2JqX3N5bWJvbHMKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotDAotLyogcHJvdmlkZSBzdG9yYWdlIGZvciBzdWJzeXN0ZW0sIHN0YWNrIGFuZCBoZWFwIGRhdGEgd2hpY2ggbWF5IGhhdmUgYmVlbgotICAgcGFzc2VkIGluIG9uIHRoZSBjb21tYW5kIGxpbmUuICBMZCBwdXRzIHRoaXMgZGF0YSBpbnRvIGEgYmZkX2xpbmtfaW5mbwotICAgc3RydWN0IHdoaWNoIHVsdGltYXRlbHkgZ2V0cyBwYXNzZWQgaW4gdG8gdGhlIGJmZC4gIFdoZW4gaXQgYXJyaXZlcywgY29weQotICAgaXQgdG8gdGhlIGZvbGxvd2luZyBzdHJ1Y3Qgc28gdGhhdCB0aGUgZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSBpbiBjb2ZmY29kZS5oCi0gICB3aGVyZSBpdCBpcyBuZWVkZWQuICBUaGUgdHlwZWRlZidzIHVzZWQgYXJlIGRlZmluZWQgaW4gYmZkLmggKi8KLQotCi0MCi0vKgotU0VDVElPTgotCUVycm9yIHJlcG9ydGluZwotCi0JTW9zdCBCRkQgZnVuY3Rpb25zIHJldHVybiBub256ZXJvIG9uIHN1Y2Nlc3MgKGNoZWNrIHRoZWlyCi0JaW5kaXZpZHVhbCBkb2N1bWVudGF0aW9uIGZvciBwcmVjaXNlIHNlbWFudGljcykuICBPbiBhbiBlcnJvciwKLQl0aGV5IGNhbGwgPDxiZmRfc2V0X2Vycm9yPj4gdG8gc2V0IGFuIGVycm9yIGNvbmRpdGlvbiB0aGF0IGNhbGxlcnMKLQljYW4gY2hlY2sgYnkgY2FsbGluZyA8PGJmZF9nZXRfZXJyb3I+Pi4KLSAgICAgICAgSWYgdGhhdCByZXR1cm5zIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4sIHRoZW4gY2hlY2sKLQk8PGVycm5vPj4uCi0KLQlUaGUgZWFzaWVzdCB3YXkgdG8gcmVwb3J0IGEgQkZEIGVycm9yIHRvIHRoZSB1c2VyIGlzIHRvCi0JdXNlIDw8YmZkX3BlcnJvcj4+LgotCi1TVUJTRUNUSU9OCi0JVHlwZSA8PGJmZF9lcnJvcl90eXBlPj4KLQotCVRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgPDxiZmRfZ2V0X2Vycm9yPj4gYXJlIGRlZmluZWQgYnkgdGhlCi0JZW51bWVyYXRlZCB0eXBlIDw8YmZkX2Vycm9yX3R5cGU+Pi4KLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgZW51bSBiZmRfZXJyb3IKLS57Ci0uICBiZmRfZXJyb3Jfbm9fZXJyb3IgPSAwLAotLiAgYmZkX2Vycm9yX3N5c3RlbV9jYWxsLAotLiAgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotLiAgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCwKLS4gIGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19tZW1vcnksCi0uICBiZmRfZXJyb3Jfbm9fc3ltYm9scywKLS4gIGJmZF9lcnJvcl9ub19hcm1hcCwKLS4gIGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzLAotLiAgYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlLAotLiAgYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQsCi0uICBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLAotLiAgYmZkX2Vycm9yX25vX2NvbnRlbnRzLAotLiAgYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uLAotLiAgYmZkX2Vycm9yX2JhZF92YWx1ZSwKLS4gIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCwKLS4gIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcsCi0uICBiZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlCi0ufSBiZmRfZXJyb3JfdHlwZTsKLS4KLSovCi0KLXN0YXRpYyBiZmRfZXJyb3JfdHlwZSBiZmRfZXJyb3IgPSBiZmRfZXJyb3Jfbm9fZXJyb3I7Ci0KLUNPTlNUIGNoYXIgKkNPTlNUIGJmZF9lcnJtc2dzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gZXJyb3IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJTeXN0ZW0gY2FsbCBlcnJvciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkludmFsaWQgYmZkIHRhcmdldCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgaW4gd3JvbmcgZm9ybWF0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiSW52YWxpZCBvcGVyYXRpb24iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJNZW1vcnkgZXhoYXVzdGVkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gc3ltYm9scyIpLAotCQkJTl8oIkFyY2hpdmUgaGFzIG5vIGluZGV4OyBydW4gcmFubGliIHRvIGFkZCBvbmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJObyBtb3JlIGFyY2hpdmVkIGZpbGVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTWFsZm9ybWVkIGFyY2hpdmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIlNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm9ucmVwcmVzZW50YWJsZSBzZWN0aW9uIG9uIG91dHB1dCIpLAotCQkJTl8oIlN5bWJvbCBuZWVkcyBkZWJ1ZyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGV4aXN0IiksCi0JCQlOXygiQmFkIHZhbHVlIiksCi0JCQlOXygiRmlsZSB0cnVuY2F0ZWQiKSwKLQkJCU5fKCJGaWxlIHRvbyBiaWciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCIjPEludmFsaWQgZXJyb3IgY29kZT4iKQotICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0JYmZkX2Vycm9yX3R5cGUgYmZkX2dldF9lcnJvciAodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBjdXJyZW50IEJGRCBlcnJvciBjb25kaXRpb24uCi0qLwotCi1iZmRfZXJyb3JfdHlwZQotYmZkX2dldF9lcnJvciAoKQotewotICByZXR1cm4gYmZkX2Vycm9yOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgQkZEIGVycm9yIGNvbmRpdGlvbiB0byBiZSBAdmFye2Vycm9yX3RhZ30uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yIChlcnJvcl90YWcpCi0gICAgIGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZzsKLXsKLSAgYmZkX2Vycm9yID0gZXJyb3JfdGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZXJybXNnCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2Vycm1zZyAoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgQHZhcntlcnJvcl90YWd9LCBvcgotCXRoZSBzeXN0ZW0gZXJyb3IgaWYgQHZhcntlcnJvcl90YWd9IGlzIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4uCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9lcnJtc2cgKGVycm9yX3RhZykKLSAgICAgYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnOwotewotI2lmbmRlZiBlcnJubwotICBleHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0gIGlmIChlcnJvcl90YWcgPT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgIHJldHVybiB4c3RyZXJyb3IgKGVycm5vKTsKLQotICBpZiAoKCgoaW50KWVycm9yX3RhZyA8KGludCkgYmZkX2Vycm9yX25vX2Vycm9yKSB8fAotICAgICAgICgoaW50KWVycm9yX3RhZyA+IChpbnQpYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZSkpKQotICAgIGVycm9yX3RhZyA9IGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGU7Lyogc2FuaXR5IGNoZWNrICovCi0KLSAgcmV0dXJuIF8oYmZkX2Vycm1zZ3MgWyhpbnQpZXJyb3JfdGFnXSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wZXJyb3IKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9wZXJyb3IgKENPTlNUIGNoYXIgKm1lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCVByaW50IHRvIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUKLQlsYXN0IEJGRCBlcnJvciB0aGF0IG9jY3VycmVkLCBvciB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaWYKLQl0aGUgbGFzdCBCRkQgZXJyb3Igd2FzIGEgc3lzdGVtIGNhbGwgZmFpbHVyZS4gIElmIEB2YXJ7bWVzc2FnZX0KLQlpcyBub24tTlVMTCBhbmQgbm9uLWVtcHR5LCB0aGUgZXJyb3Igc3RyaW5nIHByaW50ZWQgaXMgcHJlY2VkZWQKLQlieSBAdmFye21lc3NhZ2V9LCBhIGNvbG9uLCBhbmQgYSBzcGFjZS4gIEl0IGlzIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KLSovCi0KLXZvaWQKLWJmZF9wZXJyb3IgKG1lc3NhZ2UpCi0gICAgIENPTlNUIGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICBwZXJyb3IoKGNoYXIgKiltZXNzYWdlKTsgICAgICAgICAgICAvKiBtdXN0IGJlIHN5c3RlbSBlcnJvciB0aGVuLi4uICovCi0gIGVsc2UgewotICAgIGlmIChtZXNzYWdlID09IE5VTEwgfHwgKm1lc3NhZ2UgPT0gJ1wwJykKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBtZXNzYWdlLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIH0KLX0KLQotLyoKLVNVQlNFQ1RJT04KLQlCRkQgZXJyb3IgaGFuZGxlcgotCi0JU29tZSBCRkQgZnVuY3Rpb25zIHdhbnQgdG8gcHJpbnQgbWVzc2FnZXMgZGVzY3JpYmluZyB0aGUKLQlwcm9ibGVtLiAgVGhleSBjYWxsIGEgQkZEIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uICBUaGlzCi0JZnVuY3Rpb24gbWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgcHJvZ3JhbS4KLQotCVRoZSBCRkQgZXJyb3IgaGFuZGxlciBhY3RzIGxpa2UgcHJpbnRmLgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiB2b2lkICgqYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSkgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLS4KLSovCi0KLS8qIFRoZSBwcm9ncmFtIG5hbWUgdXNlZCB3aGVuIHByaW50aW5nIEJGRCBlcnJvciBtZXNzYWdlcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZTsKLQotLyogVGhpcyBpcyB0aGUgZGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBCRkQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0KLXN0YXRpYyB2b2lkIF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnMsIC4uLikpOwotCi1zdGF0aWMgdm9pZAotX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgKGNvbnN0IGNoYXIgKnMsIC4uLikKLXsKLSAgdmFfbGlzdCBwOwotCi0gIGlmIChfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJCRkQ6ICIpOwotCi0gIHZhX3N0YXJ0IChwLCBzKTsKLQotICB2ZnByaW50ZiAoc3RkZXJyLCBzLCBwKTsKLQotICB2YV9lbmQgKHApOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSAqLwotCi1zdGF0aWMgdm9pZCBfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciAoKTsKLQotc3RhdGljIHZvaWQKLV9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgcDsKLSAgY29uc3QgY2hhciAqczsKLQotICBpZiAoX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiQkZEOiAiKTsKLQotICB2YV9zdGFydCAocCk7Ci0KLSAgcyA9IHZhX2FyZyAocCwgY29uc3QgY2hhciAqKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgcywgcCk7Ci0KLSAgdmFfZW5kIChwKTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChBTlNJX1BST1RPVFlQRVMpICovCi0KLS8qIFRoaXMgaXMgYSBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSByb3V0aW5lIHdoaWNoIHNob3VsZCBoYW5kbGUgQkZECi0gICBlcnJvciBtZXNzYWdlcy4gIEl0IGlzIGNhbGxlZCB3aGVuIGEgQkZEIHJvdXRpbmUgZW5jb3VudGVycyBhbgotICAgZXJyb3IgZm9yIHdoaWNoIGl0IHdhbnRzIHRvIHByaW50IGEgbWVzc2FnZS4gIEdvaW5nIHRocm91Z2ggYQotICAgZnVuY3Rpb24gcG9pbnRlciBwZXJtaXRzIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBCRkQgdG8gaW50ZXJjZXB0Ci0gICB0aGUgbWVzc2FnZXMgYW5kIGRlYWwgd2l0aCB0aGVtIGl0c2VsZi4gICovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgX2JmZF9lcnJvcl9oYW5kbGVyID0gX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXI7Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX3NldF9lcnJvcl9oYW5kbGVyIChiZmRfZXJyb3JfaGFuZGxlcl90eXBlKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLiAgUmV0dXJucyB0aGUgcHJldmlvdXMKLQlmdW5jdGlvbi4KLSovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUKLWJmZF9zZXRfZXJyb3JfaGFuZGxlciAocG5ldykKLSAgICAgYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBwbmV3OwotewotICBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIHBvbGQ7Ci0KLSAgcG9sZCA9IF9iZmRfZXJyb3JfaGFuZGxlcjsKLSAgX2JmZF9lcnJvcl9oYW5kbGVyID0gcG5ldzsKLSAgcmV0dXJuIHBvbGQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAoY29uc3QgY2hhciAqKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIHByb2dyYW0gbmFtZSB0byB1c2Ugd2hlbiBwcmludGluZyBhIEJGRCBlcnJvci4gIFRoaXMKLQlpcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3IgbWVzc2FnZSBmb2xsb3dlZCBieSBhIGNvbG9uIGFuZAotCXNwYWNlLiAgVGhlIHN0cmluZyBtdXN0IG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGlzIHBhc3NlZCB0bwotCXRoaXMgZnVuY3Rpb24uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgPSBuYW1lOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX2dldF9lcnJvcl9oYW5kbGVyICh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLgotKi8KLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZQotYmZkX2dldF9lcnJvcl9oYW5kbGVyICgpCi17Ci0gIHJldHVybiBfYmZkX2Vycm9yX2hhbmRsZXI7Ci19Ci0MCi0vKgotU0VDVElPTgotCVN5bWJvbHMKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlCi0JcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbiBAdmFye3NlY3R9Ci0JYXR0YWNoZWQgdG8gYmZkIEB2YXJ7YWJmZH0uICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4KLQotKi8KLQotCi1sb25nCi1iZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2dldF9yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQsIGFzZWN0KSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9jYW5vbmljYWxpemVfcmVsb2MKLSAgICAgICAgCShiZmQgKmFiZmQsCi0JCWFzZWN0aW9uICpzZWMsCi0JCWFyZWxlbnQgKipsb2MsCi0JCWFzeW1ib2wJKipzeW1zKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsIHRoZSBiYWNrIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gQkZECi0JQHZhcnthYmZkfSBhbmQgdHJhbnNsYXRlIHRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSByZWxvY2F0aW9uCi0JaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gQHZhcntzZWN9IGludG8gdGhlIGludGVybmFsIGNhbm9uaWNhbAotCWZvcm0uICBQbGFjZSB0aGUgdGFibGUgaW50byBtZW1vcnkgYXQgQHZhcntsb2N9LCB3aGljaCBoYXMKLQliZWVuIHByZWFsbG9jYXRlZCwgdXN1YWxseSBieSBhIGNhbGwgdG8KLQk8PGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQ+Pi4gIFJldHVybnMgdGhlIG51bWJlciBvZiByZWxvY3MsIG9yCi0JLTEgb24gZXJyb3IuCi0KLQlUaGUgQHZhcntzeW1zfSB0YWJsZSBpcyBhbHNvIG5lZWRlZCBmb3IgaG9ycmlibGUgaW50ZXJuYWwgbWFnaWMKLQlyZWFzb25zLgotCi0KLSovCi1sb25nCi1iZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBhc2VjdCwgbG9jYXRpb24sIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXJlbGVudCAqKmxvY2F0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKLQkJICAgKGFiZmQsIGFzZWN0LCBsb2NhdGlvbiwgc3ltYm9scykpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3JlbG9jCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X3JlbG9jCi0JICAoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBhcmVsZW50ICoqcmVsLCB1bnNpZ25lZCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSByZWxvY2F0aW9uIHBvaW50ZXIgYW5kIGNvdW50IHdpdGhpbgotCXNlY3Rpb24gQHZhcntzZWN9IHRvIHRoZSB2YWx1ZXMgQHZhcntyZWx9IGFuZCBAdmFye2NvdW50fS4KLQlUaGUgYXJndW1lbnQgQHZhcnthYmZkfSBpcyBpZ25vcmVkLgotCi0qLwotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfc2V0X3JlbG9jIChpZ25vcmVfYWJmZCwgYXNlY3QsIGxvY2F0aW9uLCBjb3VudCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhcmVsZW50ICoqbG9jYXRpb247Ci0gICAgIHVuc2lnbmVkIGludCBjb3VudDsKLXsKLSAgYXNlY3QtPm9yZWxvY2F0aW9uID0gbG9jYXRpb247Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2ZpbGVfZmxhZ3MKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfZmlsZV9mbGFncyhiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGZsYWcgd29yZCBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlIHZhbHVlIEB2YXJ7ZmxhZ3N9LgotCi0JUG9zc2libGUgZXJyb3JzIGFyZToKLQlvIDw8YmZkX2Vycm9yX3dyb25nX2Zvcm1hdD4+IC0gVGhlIHRhcmdldCBiZmQgd2FzIG5vdCBvZiBvYmplY3QgZm9ybWF0LgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtIFRoZSB0YXJnZXQgYmZkIHdhcyBvcGVuIGZvciByZWFkaW5nLgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JVGhlIGZsYWcgd29yZCBjb250YWluZWQgYSBiaXQgd2hpY2ggd2FzIG5vdCBhcHBsaWNhYmxlIHRvIHRoZQotCXR5cGUgb2YgZmlsZS4gIEUuZy4sIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gc2V0IHRoZSA8PERfUEFHRUQ+PiBiaXQKLQlvbiBhIEJGRCBmb3JtYXQgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBkZW1hbmQgcGFnaW5nLgotCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2ZpbGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYmZkX3JlYWRfcCAoYWJmZCkpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgPSBmbGFnczsKLSAgaWYgKChmbGFncyAmIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MgKGFiZmQpKSAhPSBmbGFncykgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLXJldHVybiB0cnVlOwotfQotCi12b2lkCi1iZmRfYXNzZXJ0IChmaWxlLCBsaW5lKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBpbnQgbGluZTsKLXsKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJiZmQgYXNzZXJ0aW9uIGZhaWwgJXM6JWQiKSwgZmlsZSwgbGluZSk7Ci19Ci0KLS8qIEEgbW9yZSBvciBsZXNzIGZyaWVuZGx5IGFib3J0IG1lc3NhZ2UuICBJbiBsaWJiZmQuaCBhYm9ydCBpcwotICAgZGVmaW5lZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24uICAqLwotCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQotI2RlZmluZSBFWElUX0ZBSUxVUkUgMQotI2VuZGlmCi0KLXZvaWQKLV9iZmRfYWJvcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBpbnQgbGluZTsKLSAgICAgY29uc3QgY2hhciAqZm47Ci17Ci0gIGlmIChmbiAhPSBOVUxMKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgKF8oIkJGRCBpbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIiksCi0gICAgICAgZmlsZSwgbGluZSwgZm4pOwotICBlbHNlCi0gICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAoXygiQkZEIGludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkXG4iKSwKLSAgICAgICBmaWxlLCBsaW5lKTsKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zdGFydF9hZGRyZXNzCi0KLVNZTk9QU0lTCi0gCWJvb2xlYW4gYmZkX3NldF9zdGFydF9hZGRyZXNzKGJmZCAqYWJmZCwgYmZkX3ZtYSB2bWEpOwotCi1ERVNDUklQVElPTgotCU1ha2UgQHZhcnt2bWF9IHRoZSBlbnRyeSBwb2ludCBvZiBvdXRwdXQgQkZEIEB2YXJ7YWJmZH0uCi0KLVJFVFVSTlMKLQlSZXR1cm5zIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvdGhlcndpc2UuCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCwgdm1hKQotYmZkICphYmZkOwotYmZkX3ZtYSB2bWE7Ci17Ci0gIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSB2bWE7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfbXRpbWUKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfbXRpbWUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgKGFzIHJlYWQgZnJvbSB0aGUgZmlsZSBzeXN0ZW0sIG9yCi0JZnJvbSB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIGFyY2hpdmUgbWVtYmVycykuCi0KLSovCi0KLWxvbmcKLWJmZF9nZXRfbXRpbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRklMRSAqZnA7Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICBpZiAoYWJmZC0+bXRpbWVfc2V0KQotICAgIHJldHVybiBhYmZkLT5tdGltZTsKLQotICBmcCA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICBpZiAoMCAhPSBmc3RhdCAoZmlsZW5vIChmcCksICZidWYpKQotICAgIHJldHVybiAwOwotCi0gIGFiZmQtPm10aW1lID0gYnVmLnN0X210aW1lOwkJLyogU2F2ZSB2YWx1ZSBpbiBjYXNlIGFueW9uZSB3YW50cyBpdCAqLwotICByZXR1cm4gYnVmLnN0X210aW1lOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3NpemUKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfc2l6ZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgZmlsZSBzaXplIChhcyByZWFkIGZyb20gZmlsZSBzeXN0ZW0pIGZvciB0aGUgZmlsZQotCWFzc29jaWF0ZWQgd2l0aCBCRkQgQHZhcnthYmZkfS4KLQotCVRoZSBpbml0aWFsIG1vdGl2YXRpb24gZm9yLCBhbmQgdXNlIG9mLCB0aGlzIHJvdXRpbmUgaXMgbm90Ci0Jc28gd2UgY2FuIGdldCB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgb2JqZWN0IHRoZSBCRkQgYXBwbGllcyB0bywgc2luY2UKLQl0aGF0IG1pZ2h0IG5vdCBiZSBnZW5lcmFsbHkgcG9zc2libGUgKGFyY2hpdmUgbWVtYmVycyBmb3IgZXhhbXBsZSkuCi0JSXQgd291bGQgYmUgaWRlYWwgaWYgc29tZW9uZSBjb3VsZCBldmVudHVhbGx5IG1vZGlmeQotCWl0IHNvIHRoYXQgc3VjaCByZXN1bHRzIHdlcmUgZ3VhcmFudGVlZC4KLQotCUluc3RlYWQsIHdlIHdhbnQgdG8gYXNrIHF1ZXN0aW9ucyBsaWtlICJpcyB0aGlzIE5OTiBieXRlIHNpemVkCi0Jb2JqZWN0IEknbSBhYm91dCB0byB0cnkgcmVhZCBmcm9tIGZpbGUgb2Zmc2V0IFlZWSByZWFzb25hYmxlPyIKLQlBcyBhcyBleGFtcGxlIG9mIHdoZXJlIHdlIG1pZ2h0IGRvIHRoaXMsIHNvbWUgb2JqZWN0IGZvcm1hdHMKLQl1c2Ugc3RyaW5nIHRhYmxlcyBmb3Igd2hpY2ggdGhlIGZpcnN0IDw8c2l6ZW9mKGxvbmcpPj4gYnl0ZXMgb2YgdGhlCi0JdGFibGUgY29udGFpbiB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgaXRzZWxmLCBpbmNsdWRpbmcgdGhlIHNpemUgYnl0ZXMuCi0JSWYgYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gcmVhZCB3aGF0IGl0IHRoaW5rcyBpcyBvbmUgb2YgdGhlc2UKLQlzdHJpbmcgdGFibGVzLCB3aXRob3V0IHNvbWUgd2F5IHRvIHZhbGlkYXRlIHRoZSBzaXplLCBhbmQgZm9yCi0Jc29tZSByZWFzb24gdGhlIHNpemUgaXMgd3JvbmcgKGJ5dGUgc3dhcHBpbmcgZXJyb3IsIHdyb25nIGxvY2F0aW9uCi0JZm9yIHRoZSBzdHJpbmcgdGFibGUsIGV0Yy4pLCB0aGUgb25seSBjbHVlIGlzIGxpa2VseSB0byBiZSBhIHJlYWQKLQllcnJvciB3aGVuIGl0IHRyaWVzIHRvIHJlYWQgdGhlIHRhYmxlLCBvciBhICJ2aXJ0dWFsIG1lbW9yeQotCWV4aGF1c3RlZCIgZXJyb3Igd2hlbiBpdCB0cmllcyB0byBhbGxvY2F0ZSAxNSBiYXppbGxvbiBieXRlcwotCW9mIHNwYWNlIGZvciB0aGUgMTUgYmF6aWxsb24gYnl0ZSB0YWJsZSBpdCBpcyBhYm91dCB0byByZWFkLgotCVRoaXMgZnVuY3Rpb24gYXQgbGVhc3QgYWxsb3dzIHVzIHRvIGFuc3dlciB0aGUgcXVlc2lvbiwgImlzIHRoZQotCXNpemUgcmVhc29uYWJsZT8iLgotKi8KLQotbG9uZwotYmZkX2dldF9zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEZJTEUgKmZwOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuICgoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW0pLT5zaXplOwotCi0gIGZwID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGlmICgwICE9IGZzdGF0IChmaWxlbm8gKGZwKSwgJmJ1ZikpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIGJ1Zi5zdF9zaXplOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2dwX3NpemUKLQotU1lOT1BTSVMKLQlpbnQgYmZkX2dldF9ncF9zaXplKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQCi0JcmVnaXN0ZXIgdW5kZXIgTUlQUyBFQ09GRi4gIFRoaXMgaXMgdHlwaWNhbGx5IHNldCBieSB0aGUgPDwtRz4+Ci0JYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IgbGlua2VyLgotKi8KLQotaW50Ci1iZmRfZ2V0X2dwX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLQlyZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemU7Ci0gICAgICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JcmV0dXJuIGVsZl9ncF9zaXplIChhYmZkKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2dwX3NpemUKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9zZXRfZ3Bfc2l6ZShiZmQgKmFiZmQsIGludCBpKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIGJlIG9wdGltaXplZCB1c2luZyB0aGUgR1AKLQlyZWdpc3RlciB1bmRlciBFQ09GRiBvciBNSVBTIEVMRi4gIFRoaXMgaXMgdHlwaWNhbGx5IHNldCBieQotCXRoZSA8PC1HPj4gYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IgbGlua2VyLgotKi8KLQotdm9pZAotYmZkX3NldF9ncF9zaXplIChhYmZkLCBpKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpOwotewotICAvKiBEb24ndCB0cnkgdG8gc2V0IEdQIHNpemUgb24gYW4gYXJjaGl2ZSBvciBjb3JlIGZpbGUhICovCi0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm47Ci0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLSAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSA9IGk7Ci0gIGVsc2UgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICBlbGZfZ3Bfc2l6ZSAoYWJmZCkgPSBpOwotfQotCi0vKiBHZXQgdGhlIEdQIHZhbHVlLiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHNvbWUgb2YgdGhlCi0gICByZWxvY2F0aW9uIHNwZWNpYWxfZnVuY3Rpb24gcm91dGluZXMgb24gdGFyZ2V0cyB3aGljaCBzdXBwb3J0IGEgR1AKLSAgIHJlZ2lzdGVyLiAgKi8KLQotYmZkX3ZtYQotX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLQlyZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotICAgICAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXJldHVybiBlbGZfZ3AgKGFiZmQpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNldCB0aGUgR1AgdmFsdWUuICAqLwotCi12b2lkCi1fYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgdikKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHY7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm47Ci0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLSAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSB2OwotICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgZWxmX2dwIChhYmZkKSA9IHY7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zY2FuX3ZtYQotCi1TWU5PUFNJUwotCWJmZF92bWEgYmZkX3NjYW5fdm1hKENPTlNUIGNoYXIgKnN0cmluZywgQ09OU1QgY2hhciAqKmVuZCwgaW50IGJhc2UpOwotCi1ERVNDUklQVElPTgotCUNvbnZlcnQsIGxpa2UgPDxzdHJ0b3VsPj4sIGEgbnVtZXJpY2FsIGV4cHJlc3Npb24KLQlAdmFye3N0cmluZ30gaW50byBhIDw8YmZkX3ZtYT4+IGludGVnZXIsIGFuZCByZXR1cm4gdGhhdCBpbnRlZ2VyLgotCShUaG91Z2ggd2l0aG91dCBhcyBtYW55IGJlbGxzIGFuZCB3aGlzdGxlcyBhcyA8PHN0cnRvdWw+Pi4pCi0JVGhlIGV4cHJlc3Npb24gaXMgYXNzdW1lZCB0byBiZSB1bnNpZ25lZCAoaS5lLiwgcG9zaXRpdmUpLgotCUlmIGdpdmVuIGEgQHZhcntiYXNlfSwgaXQgaXMgdXNlZCBhcyB0aGUgYmFzZSBmb3IgY29udmVyc2lvbi4KLQlBIGJhc2Ugb2YgMCBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIGludGVycHJldCB0aGUgc3RyaW5nCi0JaW4gaGV4IGlmIGEgbGVhZGluZyAiMHgiIG9yICIwWCIgaXMgZm91bmQsIG90aGVyd2lzZQotCWluIG9jdGFsIGlmIGEgbGVhZGluZyB6ZXJvIGlzIGZvdW5kLCBvdGhlcndpc2UgaW4gZGVjaW1hbC4KLQotCU92ZXJmbG93IGlzIG5vdCBkZXRlY3RlZC4KLSovCi0KLWJmZF92bWEKLWJmZF9zY2FuX3ZtYSAoc3RyaW5nLCBlbmQsIGJhc2UpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLSAgICAgQ09OU1QgY2hhciAqKmVuZDsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGludCBkaWdpdDsKLQotICAvKiBMZXQgdGhlIGhvc3QgZG8gaXQgaWYgcG9zc2libGUuICAqLwotICBpZiAoc2l6ZW9mKGJmZF92bWEpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKLSAgICByZXR1cm4gKGJmZF92bWEpIHN0cnRvdWwgKHN0cmluZywgKGNoYXIgKiopIGVuZCwgYmFzZSk7Ci0KLSAgLyogQSBuZWdhdGl2ZSBiYXNlIG1ha2VzIG5vIHNlbnNlLCBhbmQgd2Ugb25seSBuZWVkIHRvIGdvIGFzIGhpZ2ggYXMgaGV4LiAgKi8KLSAgaWYgKChiYXNlIDwgMCkgfHwgKGJhc2UgPiAxNikpCi0gICAgcmV0dXJuIChiZmRfdm1hKSAwOwotCi0gIGlmIChiYXNlID09IDApCi0gICAgewotICAgICAgaWYgKHN0cmluZ1swXSA9PSAnMCcpCi0JewotCSAgaWYgKChzdHJpbmdbMV0gPT0gJ3gnKSB8fCAoc3RyaW5nWzFdID09ICdYJykpCi0JICAgIGJhc2UgPSAxNjsKLQkgIC8qIFhYWCBzaG91bGQgd2UgYWxzbyBhbGxvdyAiMGIiIG9yICIwQiIgdG8gc2V0IGJhc2UgdG8gMj8gKi8KLQkgIGVsc2UKLQkgICAgYmFzZSA9IDg7Ci0JfQotICAgICAgZWxzZQotCWJhc2UgPSAxMDsKLSAgICB9Ci0gIGlmICgoYmFzZSA9PSAxNikgJiYKLSAgICAgIChzdHJpbmdbMF0gPT0gJzAnKSAmJiAoKHN0cmluZ1sxXSA9PSAneCcpIHx8IChzdHJpbmdbMV0gPT0gJ1gnKSkpCi0gICAgc3RyaW5nICs9IDI7Ci0gIC8qIFhYWCBzaG91bGQgd2UgYWxzbyBza2lwIG92ZXIgIjBiIiBvciAiMEIiIGlmIGJhc2UgaXMgMj8gKi8KLSAgICAKLS8qIFNwZWVkIGNvdWxkIGJlIGltcHJvdmVkIHdpdGggYSB0YWJsZSBsaWtlIGhleF92YWx1ZVtdIGluIGdhcy4gICovCi0jZGVmaW5lIEhFWF9WQUxVRShjKSBcCi0gIChpc3hkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpCQkJCQlcCi0gICA/IChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykJCQkJXAotICAgICAgPyAoYyAtICcwJykJCQkJCQlcCi0gICAgICA6ICgxMCArIGMgLSAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGMpID8gJ2EnIDogJ0EnKSkpCVwKLSAgIDogNDIpCi0KLSAgZm9yICh2YWx1ZSA9IDA7IChkaWdpdCA9IEhFWF9WQUxVRSgqc3RyaW5nKSkgPCBiYXNlOyBzdHJpbmcrKykKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHZhbHVlICogYmFzZSArIGRpZ2l0OwotICAgIH0KLQotICBpZiAoZW5kKQotICAgICplbmQgPSBzdHJpbmc7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKGJmZCAqaWJmZCwgYmZkICpvYmZkKTsKLQotREVTQ1JJUFRJT04KLQlDb3B5IHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZSAKLQl0aGUgQkZEIEB2YXJ7b2JmZH0uICBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLgotCVBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uCi0KLS4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLCBcCi0uCQkoaWJmZCwgb2JmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShiZmQgKmliZmQsIGJmZCAqb2JmZCk7Ci0KLURFU0NSSVBUSU9OCi0JTWVyZ2UgcHJpdmF0ZSBCRkQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIEB2YXJ7aWJmZH0gdG8gdGhlIAotCXRoZSBvdXRwdXQgZmlsZSBCRkQgQHZhcntvYmZkfSB3aGVuIGxpbmtpbmcuICBSZXR1cm4gPDx0cnVlPj4KLQlvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgotCi0uI2RlZmluZSBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShpYmZkLCBvYmZkKSBcCi0uICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBcCi0uCQkoaWJmZCwgb2JmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfcHJpdmF0ZV9mbGFncwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9wcml2YXRlX2ZsYWdzKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpOwotCi1ERVNDUklQVElPTgotCVNldCBwcml2YXRlIEJGRCBmbGFnIGluZm9ybWF0aW9uIGluIHRoZSBCRkQgQHZhcnthYmZkfS4KLQlSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IKLQlyZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgotCi0uI2RlZmluZSBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MoYWJmZCwgZmxhZ3MpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NldF9wcml2YXRlX2ZsYWdzLCBcCi0uCQkoYWJmZCwgZmxhZ3MpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQlzdHVmZgotCi1ERVNDUklQVElPTgotCVN0dWZmIHdoaWNoIHNob3VsZCBiZSBkb2N1bWVudGVkOgotCi0uI2RlZmluZSBiZmRfc2l6ZW9mX2hlYWRlcnMoYWJmZCwgcmVsb2MpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NpemVvZl9oZWFkZXJzLCAoYWJmZCwgcmVsb2MpKQotLgotLiNkZWZpbmUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9maW5kX25lYXJlc3RfbGluZSwgIChhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkpCi0uCi0uICAgICAgIHsqIERvIHRoZXNlIHRocmVlIGRvIGFueXRoaW5nIHVzZWZ1bCBhdCBhbGwsIGZvciBhbnkgYmFjayBlbmQ/ICAqfQotLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fc3RhcnQoYWJmZCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19zdGFydCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fZW5kKGFiZmQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fZW5kLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKGFiZmQsIHNlY3Rpb24pIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSwgKGFiZmQsIHNlY3Rpb24pKQotLgotLgotLiNkZWZpbmUgYmZkX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc3RhdF9hcmNoX2VsdCwoYWJmZCwgc3RhdCkpCi0uCi0uI2RlZmluZSBiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcChhYmZkKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoKVwKLS4gICAgICAgIEJGRF9TRU5EICggYWJmZCwgX2JmZF9zZXRfYXJjaF9tYWNoLCAoYWJmZCwgYXJjaCwgbWFjaCkpCi0uCi0uI2RlZmluZSBiZmRfcmVsYXhfc2VjdGlvbihhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSBcCi0uICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlbGF4X3NlY3Rpb24sIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSkKLS4KLS4jZGVmaW5lIGJmZF9nY19zZWN0aW9ucyhhYmZkLCBsaW5rX2luZm8pIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2Nfc2VjdGlvbnMsIChhYmZkLCBsaW5rX2luZm8pKQotLgotLiNkZWZpbmUgYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoYWJmZCkgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfYWRkX3N5bWJvbHMsIChhYmZkLCBpbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9maW5hbF9saW5rKGFiZmQsIGluZm8pIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluYWxfbGluaywgKGFiZmQsIGluZm8pKQotLgotLiNkZWZpbmUgYmZkX2ZyZWVfY2FjaGVkX2luZm8oYWJmZCkgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9mcmVlX2NhY2hlZF9pbmZvLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YShhYmZkLCBmaWxlKVwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSwgKGFiZmQsIGZpbGUpKQotLgotLiNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYihhYmZkLCBhc3ltYm9scykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIsIChhYmZkLCBhc3ltYm9scykpCi0uCi0uI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoYWJmZCkgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKGFiZmQsIGFyZWxzLCBhc3ltcykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYywgKGFiZmQsIGFyZWxzLCBhc3ltcykpCi0uCi0uZXh0ZXJuIGJmZF9ieXRlICpiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0uCVBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotLgkJICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYmZkX2J5dGUgKiwKLS4JCSAgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotLgotCi0qLwotCi1iZmRfYnl0ZSAqCi1iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJICAgIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGJmZCAqYWJmZDI7Ci0gIGJmZF9ieXRlICooKmZuKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCQkJICAgYXN5bWJvbCAqKikpOwotCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotICAgIHsKLSAgICAgIGFiZmQyID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgICAgIGlmIChhYmZkMiA9PSAwKQotCWFiZmQyID0gYWJmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYmZkMiA9IGFiZmQ7Ci0gIGZuID0gYWJmZDItPnh2ZWMtPl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzOwotCi0gIHJldHVybiAoKmZuKSAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpOwotfQotCi0vKiBSZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUxGIHByb2dyYW0gaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX3JlY29yZF9waGRyIChhYmZkLCB0eXBlLCBmbGFnc192YWxpZCwgZmxhZ3MsIGF0X3ZhbGlkLCBhdCwKLQkJIGluY2x1ZGVzX2ZpbGVoZHIsIGluY2x1ZGVzX3BoZHJzLCBjb3VudCwgc2VjcykKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gICAgIGJvb2xlYW4gZmxhZ3NfdmFsaWQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBib29sZWFuIGF0X3ZhbGlkOwotICAgICBiZmRfdm1hIGF0OwotICAgICBib29sZWFuIGluY2x1ZGVzX2ZpbGVoZHI7Ci0gICAgIGJvb2xlYW4gaW5jbHVkZXNfcGhkcnM7Ci0gICAgIHVuc2lnbmVkIGludCBjb3VudDsKLSAgICAgYXNlY3Rpb24gKipzZWNzOwotewotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQotCQkgICArICgoc2l6ZV90KSBjb3VudCAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgaWYgKG0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbS0+bmV4dCA9IE5VTEw7Ci0gIG0tPnBfdHlwZSA9IHR5cGU7Ci0gIG0tPnBfZmxhZ3MgPSBmbGFnczsKLSAgbS0+cF9wYWRkciA9IGF0OwotICBtLT5wX2ZsYWdzX3ZhbGlkID0gZmxhZ3NfdmFsaWQ7Ci0gIG0tPnBfcGFkZHJfdmFsaWQgPSBhdF92YWxpZDsKLSAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IGluY2x1ZGVzX2ZpbGVoZHI7Ci0gIG0tPmluY2x1ZGVzX3BoZHJzID0gaW5jbHVkZXNfcGhkcnM7Ci0gIG0tPmNvdW50ID0gY291bnQ7Ci0gIGlmIChjb3VudCA+IDApCi0gICAgbWVtY3B5IChtLT5zZWN0aW9ucywgc2VjcywgY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQotICBmb3IgKHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyAqcG0gIT0gTlVMTDsgcG0gPSAmKCpwbSktPm5leHQpCi0gICAgOwotICAqcG0gPSBtOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2JpbmFyeS5jIGIvYmZkL2JpbmFyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk4MGIwLi4wMDAwMDAwCi0tLSBhL2JmZC9iaW5hcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGJpbmFyeSBvYmplY3RzLgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBCRkQgYmFja2VuZCB3aGljaCBtYXkgYmUgdXNlZCB0byB3cml0ZSBiaW5hcnkgb2JqZWN0cy4KLSAgIEl0IG1heSBvbmx5IGJlIHVzZWQgZm9yIG91dHB1dCwgbm90IGlucHV0LiAgVGhlIGludGVudGlvbiBpcyB0aGF0Ci0gICB0aGlzIG1heSBiZSB1c2VkIGFzIGFuIG91dHB1dCBmb3JtYXQgZm9yIG9iamNvcHkgaW4gb3JkZXIgdG8KLSAgIGdlbmVyYXRlIHJhdyBiaW5hcnkgZGF0YS4KLQotICAgVGhpcyBpcyB2ZXJ5IHNpbXBsZS4gIFRoZSBvbmx5IGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSByZWFsIGRhdGEKLSAgIHdpbGwgc3RhcnQgYXQgc29tZSBhZGRyZXNzIFgsIGFuZCBpbiBzb21lIGNhc2VzIHdlIHdpbGwgbm90IHdhbnQgdG8KLSAgIGluY2x1ZGUgWCB6ZXJvZXMganVzdCB0byBnZXQgdG8gdGhhdCBwb2ludC4gIFNpbmNlIHRoZSBzdGFydAotICAgYWRkcmVzcyBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQsIHdlIHVzZSBpdAotICAgaW5zdGVhZCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBzdGFydCBvZgotICAgdGhlIGZpbGUuICBvYmpjb3B5IGNvb3BlcmF0ZXMgYnkgc3BlY2lhbGx5IHNldHRpbmcgdGhlIHN0YXJ0Ci0gICBhZGRyZXNzIHRvIHplcm8gYnkgZGVmYXVsdC4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIEFueSBiZmQgd2UgY3JlYXRlIGJ5IHJlYWRpbmcgYSBiaW5hcnkgZmlsZSBoYXMgdGhyZWUgc3ltYm9sczoKLSAgIGEgc3RhcnQgc3ltYm9sLCBhbiBlbmQgc3ltYm9sLCBhbmQgYW4gYWJzb2x1dGUgbGVuZ3RoIHN5bWJvbC4gICovCi0jZGVmaW5lIEJJTl9TWU1TIDMKLQotc3RhdGljIGJvb2xlYW4gYmluYXJ5X21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYmluYXJ5X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBiaW5hcnlfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBsb25nIGJpbmFyeV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqbWFuZ2xlX25hbWUgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotc3RhdGljIGxvbmcgYmluYXJ5X2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBhc3ltYm9sICpiaW5hcnlfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIGJpbmFyeV9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgaW50IGJpbmFyeV9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi0vKiBDcmVhdGUgYSBiaW5hcnkgb2JqZWN0LiAgSW52b2tlZCB2aWEgYmZkX3NldF9mb3JtYXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmluYXJ5X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFueSBmaWxlIG1heSBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYmluYXJ5IGZpbGUsIHByb3ZpZGVkIHRoZSB0YXJnZXQKLSAgIHdhcyBub3QgZGVmYXVsdGVkLiAgVGhhdCBpcywgaXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBhcwotICAgYmVpbmcgYmluYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYmluYXJ5X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgPSBCSU5fU1lNUzsKLQotICAvKiBGaW5kIHRoZSBmaWxlIHNpemUuICAqLwotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPbmUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc2VjLT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWMtPnZtYSA9IDA7Ci0gIHNlYy0+X3Jhd19zaXplID0gc3RhdGJ1Zi5zdF9zaXplOwotICBzZWMtPmZpbGVwb3MgPSAwOwotCi0gIGFiZmQtPnRkYXRhLmFueSA9IChQVFIpIHNlYzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2RlZmluZSBiaW5hcnlfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGJpbmFyeV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgYmluYXJ5X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotLyogR2V0IGNvbnRlbnRzIG9mIHRoZSBvbmx5IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1iaW5hcnlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAoQklOX1NZTVMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotLyogQ3JlYXRlIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGJmZCdzIGZpbGVuYW1lLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbWFuZ2xlX25hbWUgKGFiZmQsIHN1ZmZpeCkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdWZmaXg7Ci17Ci0gIGludCBzaXplOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnA7Ci0KLSAgc2l6ZSA9IChzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCSAgKyBzdHJsZW4gKHN1ZmZpeCkKLQkgICsgc2l6ZW9mICJfYmluYXJ5X18iKTsKLQotICBidWYgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoYnVmID09IE5VTEwpCi0gICAgcmV0dXJuICIiOwotCi0gIHNwcmludGYgKGJ1ZiwgIl9iaW5hcnlfJXNfJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3VmZml4KTsKLQotICAvKiBDaGFuZ2UgYW55IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0byB1bmRlcnNjb3Jlcy4gICovCi0gIGZvciAocCA9IGJ1ZjsgKnA7IHArKykKLSAgICBpZiAoISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnApKQotICAgICAgKnAgPSAnXyc7Ci0KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogUmV0dXJuIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotYmluYXJ5X2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBhc2VjdGlvbiAqc2VjID0gKGFzZWN0aW9uICopIGFiZmQtPnRkYXRhLmFueTsKLSAgYXN5bWJvbCAqc3ltczsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3ltcyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgQklOX1NZTVMgKiBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3RhcnQgc3ltYm9sLiAgKi8KLSAgc3ltc1swXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1swXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJzdGFydCIpOwotICBzeW1zWzBdLnZhbHVlID0gMDsKLSAgc3ltc1swXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMF0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1swXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBFbmQgc3ltYm9sLiAgKi8KLSAgc3ltc1sxXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1sxXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJlbmQiKTsKLSAgc3ltc1sxXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICBzeW1zWzFdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1sxXS5zZWN0aW9uID0gc2VjOwotICBzeW1zWzFdLnVkYXRhLnAgPSBOVUxMOwotCi0gIC8qIFNpemUgc3ltYm9sLiAgKi8KLSAgc3ltc1syXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1syXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJzaXplIik7Ci0gIHN5bXNbMl0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1syXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMl0uc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIHN5bXNbMl0udWRhdGEucCA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJJTl9TWU1TOyBpKyspCi0gICAgKmFsb2NhdGlvbisrID0gc3ltcysrOwotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gQklOX1NZTVM7Ci19Ci0KLS8qIE1ha2UgYW4gZW1wdHkgc3ltYm9sLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotYmluYXJ5X21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotfQotCi0jZGVmaW5lIGJpbmFyeV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0KLS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1iaW5hcnlfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotI2RlZmluZSBiaW5hcnlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiaW5hcnlfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGJpbmFyeV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiaW5hcnlfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBiaW5hcnlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBiaW5hcnlfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgYmluYXJ5X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBiaW5hcnlfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIGJpbmFyeV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUgb2YgYSBiaW5hcnkgZmlsZS4gICovCi0jZGVmaW5lIGJpbmFyeV9zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLS8qIFdyaXRlIHNlY3Rpb24gY29udGVudHMgb2YgYSBiaW5hcnkgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBib29sZWFuIGZvdW5kX2xvdzsKLSAgICAgIGJmZF92bWEgbG93OwotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIFRoZSBsb3dlc3Qgc2VjdGlvbiBMTUEgc2V0cyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydAotICAgICAgICAgb2YgdGhlIGZpbGUuICBXZSB1c2UgdGhpcyB0byBzZXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgYWxsIHRoZQotICAgICAgICAgc2VjdGlvbnMuICAqLwotICAgICAgZm91bmRfbG93ID0gZmFsc2U7Ci0gICAgICBsb3cgPSAwOwotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JaWYgKCgocy0+ZmxhZ3MKLQkgICAgICAmIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfTkVWRVJfTE9BRCkpCi0JICAgICA9PSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLQkgICAgJiYgKCEgZm91bmRfbG93IHx8IHMtPmxtYSA8IGxvdykpCi0JICB7Ci0JICAgIGxvdyA9IHMtPmxtYTsKLQkgICAgZm91bmRfbG93ID0gdHJ1ZTsKLQkgIH0KLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgcy0+ZmlsZXBvcyA9IHMtPmxtYSAtIGxvdzsKLQotCSAgLyogU2tpcCBmb2xsb3dpbmcgd2FybmluZyBjaGVjayBmb3Igc2VjdGlvbnMgdGhhdCB3aWxsIG5vdAotCSAgICAgb2NjdXB5IGZpbGUgc3BhY2UuICAqLyAKLQkgIGlmICgocy0+ZmxhZ3MKLQkgICAgICAgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19ORVZFUl9MT0FEKSkKLQkgICAgICAhPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIGEgYmluYXJ5IGZpbGUgZnJvbSBhIGJmZCB3aXRoCi0JICAgICBMTUEncyBhbGwgb3ZlciB0aGUgcGxhY2UsIGh1Z2UgKHNwYXJzZT8pIGJpbmFyeSBmaWxlcyBtYXkKLQkgICAgIHJlc3VsdC4gIFRoaXMgY29uZGl0aW9uIGF0dGVtcHRzIHRvIGRldGVjdCB0aGlzIHNpdHVhdGlvbgotCSAgICAgYW5kIHByaW50IGEgd2FybmluZy4gIEJldHRlciBoZXVyaXN0aWNzIHdvdWxkIGJlIG5pY2UgdG8KLQkgICAgIGhhdmUuICovCi0KLQkgIGlmIChzLT5maWxlcG9zIDwgMCkKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgKF8oIldhcm5pbmc6IFdyaXRpbmcgc2VjdGlvbiBgJXMnIHRvIGh1Z2UgKGllIG5lZ2F0aXZlKSBmaWxlIG9mZnNldCAweCVseC4iKSwKLQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHMpLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgcy0+ZmlsZXBvcyk7Ci0JfQotCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgYW55dGhpbmcgZm9yIGEgc2VjdGlvbiB0aGF0IGlzIG5laXRoZXIKLSAgICAgbG9hZGVkIG5vciBhbGxvY2F0ZWQuICBUaGUgY29udGVudHMgb2Ygc3VjaCBhIHNlY3Rpb24gYXJlIG5vdAotICAgICBtZWFuaW5nZnVsIGluIHRoZSBiaW5hcnkgZm9ybWF0LiAgKi8KLSAgaWYgKChzZWMtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX05FVkVSX0xPQUQpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpOwotfQotCi0vKiBObyBzcGFjZSBpcyByZXF1aXJlZCBmb3IgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGludAotYmluYXJ5X3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBleGVjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lIGJpbmFyeV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJpbmFyeV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJpbmFyeV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgYmluYXJ5X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJpbmFyeV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBiaW5hcnlfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmluYXJ5X2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBiaW5hcnlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1jb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWMgPQotewotICAiYmluYXJ5IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAkvKiBmbGF2b3VyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIGJ5dGVvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiBoZWFkZXJfYnl0ZW9yZGVyICovCi0gIEVYRUNfUCwJCQkvKiBvYmplY3RfZmxhZ3MgKi8KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUyksIC8qIHNlY3Rpb25fZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLSAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgYmluYXJ5X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgYmZkX2ZhbHNlLAotICAgIGJpbmFyeV9ta29iamVjdCwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfdHJ1ZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGJpbmFyeSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGJpbmFyeSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9iZmQvYm91dC5jIGIvYmZkL2JvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzMGUxOC4uMDAwMDAwMAotLS0gYS9iZmQvYm91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0MiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDk2MCBiLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotI2luY2x1ZGUgImJvdXQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLQotc3RhdGljIGludCBhbGlnbmNvZGUgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGFyZWxlbnQgKnIsIHVuc2lnbmVkIGludCBzaHJpbmspKTsKLXN0YXRpYyB2b2lkIHBlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGJmZF92bWEgdmFsdWUpKTsKLXN0YXRpYyBib29sZWFuIGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpiX291dF9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjYWxsanhfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFyZWxlbnQgKiwgUFRSIHNyYywgUFRSIGRzdCwKLQkgICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNhbGxqX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhcmVsZW50ICosIFBUUiBkYXRhLAotCSAgIHVuc2lnbmVkIGludCBzcmNpZHgsIHVuc2lnbmVkIGludCBkc3RpZHgsIGFzZWN0aW9uICosIGJvb2xlYW4pKTsKLXN0YXRpYyBiZmRfdm1hIGdldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgaW50IGFiczMyY29kZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLAotCQkJICAgICAgdW5zaWduZWQgaW50LCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBiX291dF9iZmRfcmVsYXhfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCXN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQlib29sZWFuICopKTsKLXN0YXRpYyBiZmRfYnl0ZSAqYl9vdXRfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdyBieXRlCi0gICBzdHJlYW0gbWVtb3J5IGltYWdlLCBpbnRvIHRoZSBpbnRlcm5hbCBleGVjX2hlYWRlciBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1ib3V0X3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLSAgZXhlY3AtPmFfdGxvYWQgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Rsb2FkKTsKLSAgZXhlY3AtPmFfZGxvYWQgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgZXhlY3AtPmFfdGFsaWduID0gYnl0ZXMtPmVfdGFsaWduWzBdOwotICBleGVjcC0+YV9kYWxpZ24gPSBieXRlcy0+ZV9kYWxpZ25bMF07Ci0gIGV4ZWNwLT5hX2JhbGlnbiA9IGJ5dGVzLT5lX2JhbGlnblswXTsKLSAgZXhlY3AtPmFfcmVsYXhhYmxlID0gYnl0ZXMtPmVfcmVsYXhhYmxlWzBdOwotfQotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlIGludG8gdGhlCi0gICBzdXBwbGllZCBidWZmZXIgcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4gICovCi0KLVBST1RPKHZvaWQsIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQsCi0JICAoYmZkICphYmZkLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwKLQkgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzKSk7Ci12b2lkCi1ib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjcCwgcmF3X2J5dGVzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgcmF3IGRhdGEsIGZyb20gdGhlIGZpZWxkcyBpbiB0aGUgZXhlYyBzdHJ1Y3QuICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfaW5mbyAgLCBieXRlcy0+ZV9pbmZvKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3RleHQgICwgYnl0ZXMtPmVfdGV4dCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kYXRhICAsIGJ5dGVzLT5lX2RhdGEpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfYnNzICAgLCBieXRlcy0+ZV9ic3MpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfc3ltcyAgLCBieXRlcy0+ZV9zeW1zKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2VudHJ5ICwgYnl0ZXMtPmVfZW50cnkpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdHJzaXplLCBieXRlcy0+ZV90cnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGxvYWQgLCBieXRlcy0+ZV90bG9hZCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kbG9hZCAsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgYnl0ZXMtPmVfdGFsaWduWzBdID0gZXhlY3AtPmFfdGFsaWduOwotICBieXRlcy0+ZV9kYWxpZ25bMF0gPSBleGVjcC0+YV9kYWxpZ247Ci0gIGJ5dGVzLT5lX2JhbGlnblswXSA9IGV4ZWNwLT5hX2JhbGlnbjsKLSAgYnl0ZXMtPmVfcmVsYXhhYmxlWzBdID0gZXhlY3AtPmFfcmVsYXhhYmxlOwotfQotCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWJfb3V0X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGFuZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLQotICBpZiAoTl9CQURNQUcgKGFuZXhlYykpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgJmV4ZWNfYnl0ZXMsICZhbmV4ZWMpOwotICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZhbmV4ZWMsIGJfb3V0X2NhbGxiYWNrKTsKLX0KLQotCi0vKiBGaW5pc2ggdXAgdGhlIG9wZW5pbmcgb2YgYSBiLm91dCBmaWxlIGZvciByZWFkaW5nLiAgRmlsbCBpbiBhbGwgdGhlCi0gICBmaWVsZHMgdGhhdCBhcmUgbm90IGhhbmRsZWQgYnkgY29tbW9uIGNvZGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1iX291dF9jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGxvbmcgYnNzX3N0YXJ0OwotCi0gIC8qIEFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsCi0JCSAgICBiZmRfYXJjaF9pOTYwLCAvKiBCLm91dCBvbmx5IHVzZWQgb24gaTk2MCAqLwotCQkgICAgYmZkX21hY2hfaTk2MF9jb3JlIC8qIERlZmF1bHQgKi8KLQkJICAgICk7Ci0KLSAgLyogVGhlIHBvc2l0aW9ucyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gTl9TVFJPRkYgKCpleGVjcCk7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgYWxpZ25tZW50cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV90YWxpZ247Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfZGFsaWduOwotICBvYmpfYnNzc2VjICAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX2JhbGlnbjsKLQotICAvKiBUaGUgc3RhcnRpbmcgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gZXhlY3AtPmFfdGxvYWQ7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gZXhlY3AtPmFfZGxvYWQ7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5sbWEgPSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5sbWEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICAvKiBBbmQgcmVsb2FkIHRoZSBzaXplcywgc2luY2UgdGhlIGFvdXQgbW9kdWxlIHphcHMgdGhlbSAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX3RleHQ7Ci0KLSAgYnNzX3N0YXJ0ID0gZXhlY3AtPmFfZGxvYWQgKyBleGVjcC0+YV9kYXRhOyAvKiBCU1MgPSBlbmQgb2YgZGF0YSBzZWN0aW9uICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSBhbGlnbl9wb3dlciAoYnNzX3N0YXJ0LCBleGVjcC0+YV9iYWxpZ24pOwotCi0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9UWFRPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUk9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gIE5fRFJPRkYoKmV4ZWNwKTsKLQotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSAxOwkvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gMTsgLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICBpZiAoZXhlY3AtPmFfcmVsYXhhYmxlKQotICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0cnVjdCBib3V0X2RhdGFfc3RydWN0IHsKLSAgICBzdHJ1Y3QgYW91dGRhdGEgYTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5ib3V0X2RhdGEgPSByYXdwdHI7Ci0gIGV4ZWNfaGRyIChhYmZkKSA9ICZyYXdwdHItPmU7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2Jzc3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1iX291dF9zeW1ib2xfY21wIChhLCBiKQotICAgICBzdHJ1Y3QgYW91dF9zeW1ib2wgKiphLCAqKmI7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgYXYsIGJ2OwotCi0gIC8qIFByaW1hcnkga2V5IGlzIGFkZHJlc3MgKi8KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uICgmKCphKS0+c3ltYm9sKTsKLSAgYXYgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQgKyAoKmEpLT5zeW1ib2wudmFsdWU7Ci0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoJigqYiktPnN5bWJvbCk7Ci0gIGJ2ID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0ICsgKCpiKS0+c3ltYm9sLnZhbHVlOwotCi0gIGlmIChhdiA8IGJ2KQotICAgIHJldHVybiAtMTsKLSAgaWYgKGF2ID4gYnYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2Vjb25kYXJ5IGtleSBwdXRzIENBTExOQU1FIHN5bXMgbGFzdCBhbmQgQkFMTkFNRSBzeW1zIGZpcnN0LCBzbwotICAgICB0aGF0IHRoZXkgaGF2ZSB0aGUgYmVzdCBjaGFuY2Ugb2YgYmVpbmcgY29udGlndW91cy4gICovCi0gIGlmIChJU19CQUxOQU1FICgoKmEpLT5vdGhlcikgfHwgSVNfQ0FMTE5BTUUgKCgqYiktPm90aGVyKSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChJU19DQUxMTkFNRSAoKCphKS0+b3RoZXIpIHx8IElTX0JBTE5BTUUgKCgqYiktPm90aGVyKSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLQotICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfaW5mbyA9IEJNQUdJQzsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGV4dCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzID0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoc3RydWN0IG5saXN0KTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RhbGlnbiA9IG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotICBleGVjX2hkciAoYWJmZCktPmFfZGFsaWduID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9iYWxpZ24gPSBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90bG9hZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBleGVjX2hkciAoYWJmZCktPmFfZGxvYWQgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICBib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjX2hkciAoYWJmZCksICZzd2FwcGVkX2hkcik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmc3dhcHBlZF9oZHIsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLQkgICE9IEVYRUNfQllURVNfU0laRSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUge0NBTEwsQkFMfU5BTUUgc3ltYm9scyByZW1haW4gYWRqYWNlbnQgb24gb3V0cHV0Ci0JIGJ5IHNvcnRpbmcuICBUaGlzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgc3RhYnMgYXJlCi0JIGFsc28gb3JkZXJlZC4gIFNvbHZlIHRoaXMgYnkgc2hpZnRpbmcgYWxsIHN0YWJzIHRvIHRoZSBlbmQKLQkgaW4gb3JkZXIsIHRoZW4gc29ydGluZyB0aGUgcmVzdC4gICovCi0KLSAgICAgIGFzeW1ib2wgKipvdXRzeW1zLCAqKnAsICoqcTsKLQotICAgICAgb3V0c3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gICAgICBwID0gb3V0c3ltcyArIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gICAgICBmb3IgKHEgPSBwLS07IHAgPj0gb3V0c3ltczsgcC0tKQotCXsKLQkgIGlmICgoKnApLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0JICAgIHsKLQkgICAgICBhc3ltYm9sICp0ID0gKi0tcTsKLQkgICAgICAqcSA9ICpwOwotCSAgICAgICpwID0gdDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHEgPiBvdXRzeW1zKQotCXFzb3J0IChvdXRzeW1zLCBxIC0gb3V0c3ltcywgc2l6ZW9mKGFzeW1ib2wqKSwgYl9vdXRfc3ltYm9sX2NtcCk7Ci0KLSAgICAgIC8qIEJhY2sgdG8geW91ciByZWd1bGFybHkgc2NoZWR1bGVkIHByb2dyYW0uICAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGFvdXRfMzJfd3JpdGVfc3ltcyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUk9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9EUk9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiogU29tZSByZWxvYyBoYWNrZXJ5ICovCi0KLSNkZWZpbmUgQ0FMTFMJICAweDY2MDAzODAwCS8qIFRlbXBsYXRlIGZvciAnY2FsbHMnIGluc3RydWN0aW9uCSovCi0jZGVmaW5lIEJBTAkgIDB4MGIwMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWwnIGluc3RydWN0aW9uICovCi0jZGVmaW5lIEJBTF9NQVNLICAweDAwZmZmZmZmCi0jZGVmaW5lIEJBTFgJICAweDg1ZjAwMDAwCS8qIFRlbXBsYXRlIGZvciAnYmFseCcgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgQkFMWF9NQVNLIDB4MDAwN2ZmZmYKLSNkZWZpbmUgQ0FMTCAgICAgIDB4MDkwMDAwMDAKLSNkZWZpbmUgUENSRUwxM19NQVNLIDB4MWZmZgotCi0KLSNkZWZpbmUgb3V0cHV0X2FkZHIoc2VjKSAoKHNlYyktPm91dHB1dF9vZmZzZXQrKHNlYyktPm91dHB1dF9zZWN0aW9uLT52bWEpCi0KLS8qIE1hZ2ljIHRvIHR1cm4gY2FsbHggaW50byBjYWxsanggKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNhbGxqeF9jYWxsYmFjayAoYWJmZCwgbGlua19pbmZvLCByZWxvY19lbnRyeSwgc3JjLCBkc3QsIGlucHV0X3NlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotewotICBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYyk7Ci0gIGFzeW1ib2wgKnN5bWJvbF9pbiA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sID0gYW91dF9zeW1ib2wgKHN5bWJvbF9pbik7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jX2VudHJ5LCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gIGlmIChJU19DQUxMTkFNRSAoc3ltYm9sLT5vdGhlcikpCi0gICAgewotICAgICAgYW91dF9zeW1ib2xfdHlwZSAqYmFsc3ltID0gc3ltYm9sKzE7Ci0gICAgICBpbnQgaW5zdCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtNCk7Ci0gICAgICAvKiBUaGUgbmV4dCBzeW1ib2wgc2hvdWxkIGJlIGFuIE5fQkFMTkFNRSAqLwotICAgICAgQkZEX0FTU0VSVCAoSVNfQkFMTkFNRSAoYmFsc3ltLT5vdGhlcikpOwotICAgICAgaW5zdCAmPSBCQUxYX01BU0s7Ci0gICAgICBpbnN0IHw9IEJBTFg7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnN0LCAoYmZkX2J5dGUgKikgZHN0LTQpOwotICAgICAgc3ltYm9sID0gYmFsc3ltOwotICAgICAgdmFsdWUgPSAoc3ltYm9sLT5zeW1ib2wudmFsdWUKLQkgICAgICAgKyBvdXRwdXRfYWRkciAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbikpOwotICAgIH0KLQotICB3b3JkICs9IHZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBiZmRfcHV0XzMyKGFiZmQsIHdvcmQsIGRzdCk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotLyogTWFnaWMgdG8gdHVybiBjYWxsIGludG8gY2FsbGogKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNhbGxqX2NhbGxiYWNrIChhYmZkLCBsaW5rX2luZm8sIHJlbG9jX2VudHJ5LCAgZGF0YSwgc3JjaWR4LCBkc3RpZHgsCi0JCWlucHV0X3NlY3Rpb24sIHNocmlua2luZykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCBzcmNpZHg7Ci0gICAgIHVuc2lnbmVkIGludCBkc3RpZHg7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBib29sZWFuIHNocmlua2luZzsKLXsKLSAgaW50IHdvcmQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHNyY2lkeCk7Ci0gIGFzeW1ib2wgKnN5bWJvbF9pbiA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sID0gYW91dF9zeW1ib2wgKHN5bWJvbF9pbik7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jX2VudHJ5LCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gIGlmIChJU19PVEhFUihzeW1ib2wtPm90aGVyKSkKLSAgICB7Ci0gICAgICAvKiBDYWxsIHRvIGEgc3lzdGVtIHByb2NlZHVyZSAtIHJlcGxhY2UgY29kZSB3aXRoIHN5c3RlbQotCSBwcm9jZWR1cmUgbnVtYmVyLiAgKi8KLSAgICAgIHdvcmQgPSBDQUxMUyB8IChzeW1ib2wtPm90aGVyIC0gMSk7Ci0gICAgfQotICBlbHNlIGlmIChJU19DQUxMTkFNRShzeW1ib2wtPm90aGVyKSkKLSAgICB7Ci0gICAgICBhb3V0X3N5bWJvbF90eXBlICpiYWxzeW0gPSBzeW1ib2wrMTsKLQotICAgICAgLyogVGhlIG5leHQgc3ltYm9sIHNob3VsZCBiZSBhbiBOX0JBTE5BTUUuICAqLwotICAgICAgQkZEX0FTU0VSVChJU19CQUxOQU1FKGJhbHN5bS0+b3RoZXIpKTsKLSAgICAgIAotICAgICAgLyogV2UgYXJlIGNhbGxpbmcgYSBsZWFmLCBzbyByZXBsYWNlIHRoZSBjYWxsIGluc3RydWN0aW9uIHdpdGggYQotCSBiYWwuICAqLwotICAgICAgd29yZCA9IEJBTCB8ICgod29yZAotCQkgICAgICsgb3V0cHV0X2FkZHIgKGJhbHN5bS0+c3ltYm9sLnNlY3Rpb24pCi0JCSAgICAgKyBiYWxzeW0tPnN5bWJvbC52YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQKLQkJICAgICAtIGRzdGlkeAotCQkgICAgIC0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQotCQkgICAgJiBCQUxfTUFTSyk7Ci0gICAgfQotICBlbHNlIGlmICgoc3ltYm9sLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgLyogQSBjYWxsaiBhZ2FpbnN0IGEgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24gaXMgYSBmdWxseQotICAgICAgICAgcmVzb2x2ZWQgcmVsYXRpdmUgY2FsbC4gIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZS4KLSAgICAgICAgIElmIHRoZSBzeW1ib2wgaXMgbm90IGluIHRoZSBzYW1lIHNlY3Rpb24sIEknbSBub3Qgc3VyZSB3aGF0Ci0gICAgICAgICB0byBkbzsgZm9ydHVuYXRlbHksIHRoaXMgY2FzZSB3aWxsIHByb2JhYmx5IG5ldmVyIGFyaXNlLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKCEgc2hyaW5raW5nKTsKLSAgICAgIEJGRF9BU1NFUlQgKHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPT0gaW5wdXRfc2VjdGlvbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd29yZCA9IENBTEwgfCAoKCh3b3JkICYgQkFMX01BU0spCi0JCSAgICAgICsgdmFsdWUKLQkJICAgICAgKyByZWxvY19lbnRyeS0+YWRkZW5kCi0JCSAgICAgIC0gKHNocmlua2luZyA/IGRzdGlkeCA6IDApCi0JCSAgICAgIC0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQotCQkgICAgICYgQkFMX01BU0spOwotICAgIH0KLSAgYmZkX3B1dF8zMihhYmZkLCB3b3JkLCAoYmZkX2J5dGUgKikgZGF0YSArIGRzdGlkeCk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIHR5cGUgcnNoaWZ0IHNpemUgIGJpdHNpemUgIAlwY3JlbAliaXRwb3MgIGFic29sdXRlIG92ZXJmbG93IGNoZWNrKi8KLQotI2RlZmluZSBBQlMzMkNPREUgMAotI2RlZmluZSBBQlMzMkNPREVfU0hSVU5LIDEKLSNkZWZpbmUgUENSRUwyNCAyCi0jZGVmaW5lIENBTExKIDMKLSNkZWZpbmUgQUJTMzIgNAotI2RlZmluZSBQQ1JFTDEzIDUKLSNkZWZpbmUgQUJTMzJfTUFZQkVfUkVMQVhBQkxFIDEKLSNkZWZpbmUgQUJTMzJfV0FTX1JFTEFYQUJMRSAyCi0KLSNkZWZpbmUgQUxJR05FUiAxMAotI2RlZmluZSBBTElHTkRPTkUgMTEKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2NhbGxqID0KLUhPV1RPKENBTExKLCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCJjYWxsaiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsZmFsc2UpOwotc3RhdGljICByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyID0KLUhPV1RPKEFCUzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsImFiczMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX3BjcmVsMjQgPQotSE9XVE8oUENSRUwyNCwgMCwgMiwgMjQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJwY3JlbDI0IiwgdHJ1ZSwgMHgwMGZmZmZmZiwweDAwZmZmZmZmLGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfcGNyZWwxMyA9Ci1IT1dUTyhQQ1JFTDEzLCAwLCAyLCAxMywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsInBjcmVsMTMiLCB0cnVlLCAweDAwMDAxZmZmLDB4MDAwMDFmZmYsZmFsc2UpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyY29kZXNocnVuayA9Ci1IT1dUTyhBQlMzMkNPREVfU0hSVU5LLCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCJjYWxseC0+Y2FsbGoiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLGZhbHNlKTsKLQotc3RhdGljICByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyY29kZSA9Ci1IT1dUTyhBQlMzMkNPREUsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiY2FsbHgiLCB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19hbGlnbl90YWJsZVtdID0gewotICBIT1dUTyAoQUxJR05FUiwgMCwgMHgxLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMTYiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHgzLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMzIiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHg3LCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHhmLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMTI4IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2RvbmVfYWxpZ25fdGFibGVbXSA9IHsKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHgxLCAweDEsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduMTYiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05ET05FLCAweDMsIDB4MywgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24zMiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkRPTkUsIDB4NywgMHg3LCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImRvbmVhbGlnbjY0IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHhmLCAweGYsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduMTI4IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJfb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19jYWxsajsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19hYnMzMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfcGNyZWwyNDsKLSAgICB9Ci19Ci0KLS8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHJlbG9jIGVudHJpZXMsIHBsdXMgcG9pbnRlcnMgdG8gdGhlbSBhbGwgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgOwotICBhcmVsZW50ICpjYWNoZV9wdHIgOwotICBpbnQgZXh0ZXJuX21hc2ssIHBjcmVsX21hc2ssIGNhbGxqX21hc2ssIGxlbmd0aF9zaGlmdDsKLSAgaW50IGluY29kZV9tYXNrOwotICBpbnQgc2l6ZV9tYXNrOwotICBiZmRfdm1hIHByZXZfYWRkciA9IDA7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc2l6ZV90ICByZWxvY19zaXplOwotICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKCFhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfZHJzaXplOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfdHJzaXplOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkgewotICAgIHJlbG9jX3NpemUgPSAwOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotIGRvaXQ6Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShhc2VjdC0+cmVsX2ZpbGVwb3MpLCAgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb3VudCA9IHJlbG9jX3NpemUgLyBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotCi0gIHJlbG9jcyA9IChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jcyAmJiByZWxvY19zaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICByZWxvY19jYWNoZSA9IChhcmVsZW50ICopIGJmZF9tYWxsb2MgKChjb3VudCsxKSAqIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAoIXJlbG9jX2NhY2hlKSB7Ci0gICAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgICAgZnJlZSAoKGNoYXIqKXJlbG9jcyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByZWxvY3MsIDEsIHJlbG9jX3NpemUsIGFiZmQpICE9IHJlbG9jX3NpemUpIHsKLSAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgICAgZnJlZSAocmVsb2NzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICAvKiBiaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDgwOwotICAgIGV4dGVybl9tYXNrID0gMHgxMDsKLSAgICBpbmNvZGVfbWFzayA9IDB4MDg7Ci0gICAgY2FsbGpfbWFzayAgPSAweDAyOwotICAgIHNpemVfbWFzayA9ICAgMHgyMDsKLSAgICBsZW5ndGhfc2hpZnQgPSA1OwotICB9IGVsc2UgewotICAgIC8qIGxpdHRsZS1lbmRpYW4gYml0IGZpZWxkIGFsbG9jYXRpb24gb3JkZXIgKi8KLSAgICBwY3JlbF9tYXNrICA9IDB4MDE7Ci0gICAgZXh0ZXJuX21hc2sgPSAweDA4OwotICAgIGluY29kZV9tYXNrID0gMHgxMDsKLSAgICBjYWxsal9tYXNrICA9IDB4NDA7Ci0gICAgc2l6ZV9tYXNrICAgPSAweDAyOwotICAgIGxlbmd0aF9zaGlmdCA9IDE7Ci0gIH0KLQotICBmb3IgKHJwdHIgPSByZWxvY3MsIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlLCBjb3VudGVyID0gMDsKLSAgICAgICBjb3VudGVyIDwgY291bnQ7Ci0gICAgICAgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqcmF3ID0gKHVuc2lnbmVkIGNoYXIgKilycHRyOwotICAgIHVuc2lnbmVkIGludCBzeW1udW07Ci0gICAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXcgKyAwKTsKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gMDsKLSAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBzeW1udW0gPSAocmF3WzRdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNl07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzeW1udW0gPSAocmF3WzZdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNF07Ci0gICAgfQotCi0gICAgaWYgKHJhd1s3XSAmIGV4dGVybl9tYXNrKQotICAgIHsKLSAgICAgIC8qIGlmIHRoaXMgaXMgc2V0IHRoZW4gdGhlIHJfaW5kZXggaXMgYSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGU7Ci0gICAgICAgKiBpZiB0aGUgYml0IGlzIG5vdCBzZXQgdGhlbiByX2luZGV4IGNvbnRhaW5zIGEgc2VjdGlvbiBtYXAuCi0gICAgICAgKiB3ZSBlaXRoZXIgZmlsbCBpbiB0aGUgc3ltIGVudHJ5IHdpdGggYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wsCi0gICAgICAgKiBvciBwb2ludCB0byB0aGUgY29ycmVjdCBzZWN0aW9uCi0gICAgICAgKi8KLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgc3ltbnVtOwotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIC8qIGluIGEub3V0IHN5bWJvbHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgKiBmaWxlIHJhdGhlciB0aGFuIHNlY3Rpb25zID8KLSAgICAgICAqIChsb29rIGluIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpCi0gICAgICAgKiB0aGUgcmVsb2MgZW50cnkgYWRkZW5kIGhhcyBhZGRlZCB0byBpdCB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgICAgKiBmaWxlIG9mIHRoZSBkYXRhLCBzbyBzdWJ0cmFjdCB0aGUgYmFzZSB0byBtYWtlIHRoZSByZWxvYwotICAgICAgICogc2VjdGlvbiByZWxhdGl2ZSAqLwotICAgICAgaW50IHM7Ci0gICAgICB7Ci0JLyogc2lnbi1leHRlbmQgc3ltbnVtIGZyb20gMjQgYml0cyB0byB3aGF0ZXZlciBob3N0IHVzZXMgKi8KLQlzID0gc3ltbnVtOwotCWlmIChzICYgKDEgPDwgMjMpKQotCSAgcyB8PSAofjApIDw8IDI0OwotICAgICAgfQotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKU5VTEw7Ci0gICAgICBzd2l0Y2ggKHMpCi0gICAgICB7Ci0gICAgICAgY2FzZSBOX1RFWFQ6Ci0gICAgICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gLSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOwotCWJyZWFrOwotICAgICAgIGNhc2UgTl9EQVRBOgotICAgICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9kYXRhc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsKLQljYWNoZV9wdHItPmFkZGVuZCA9IC0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKLQlicmVhazsKLSAgICAgICBjYXNlIE5fQlNTOgotICAgICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKLQljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX2Jzc3NlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7Ci0JY2FjaGVfcHRyLT5hZGRlbmQgPSAgLSBvYmpfYnNzc2VjKGFiZmQpLT52bWE7Ci0JYnJlYWs7Ci0gICAgICAgY2FzZSBOX0FCUzoKLSAgICAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gMDsKLQlicmVhazsKLSAgICAgIGNhc2UgLTI6IC8qIC5hbGlnbiAqLwotCWlmIChyYXdbN10gJiBwY3JlbF9tYXNrKQotCSAgewotCSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX2FsaWduX3RhYmxlWyhyYXdbN10gPj4gbGVuZ3RoX3NoaWZ0KSAmIDNdOwotCSAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiAub3JnPyAqLwotCSAgICBhYm9ydCAoKTsKLQkgIH0KLQljYWNoZV9wdHItPmFkZGVuZCA9IDA7Ci0JYnJlYWs7Ci0gICAgICAgZGVmYXVsdDoKLQlCRkRfQVNTRVJUKDApOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgfQotCi0gICAgLyogdGhlIGk5NjAgb25seSBoYXMgYSBmZXcgcmVsb2NhdGlvbiB0eXBlczoKLSAgICAgICBhYnMgMzItYml0IGFuZCBwY3JlbCAyNGJpdC4gICBleGNlcHQgZm9yIGNhbGxqJ3MhICAqLwotICAgIGlmIChjYWNoZV9wdHItPmhvd3RvICE9IDApCi0gICAgICA7Ci0gICAgZWxzZSBpZiAocmF3WzddICYgY2FsbGpfbWFzaykKLSAgICB7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX2NhbGxqOwotICAgIH0KLSAgICBlbHNlIGlmICggcmF3WzddICYgcGNyZWxfbWFzaykKLSAgICB7Ci0gICAgICBpZiAocmF3WzddICYgc2l6ZV9tYXNrKQotICAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fcmVsb2NfcGNyZWwxMzsKLSAgICAgIGVsc2UKLSAgICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX3BjcmVsMjQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocmF3WzddICYgaW5jb2RlX21hc2spCi0gICAgICB7Ci0JY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMmNvZGU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNhY2hlX3B0ci0+YWRkcmVzcyA8IHByZXZfYWRkcikKLSAgICB7Ci0gICAgICAvKiBPdWNoISB0aGlzIHJlbG9jIGlzIG91dCBvZiBvcmRlciwgaW5zZXJ0IGludG8gdGhlIHJpZ2h0IHBsYWNlCi0gICAgICAgKi8KLSAgICAgIGFyZWxlbnQgdG1wOwotICAgICAgYXJlbGVudCAqY3Vyc29yID0gY2FjaGVfcHRyLTE7Ci0gICAgICBiZmRfdm1hIHN0b3AgPSBjYWNoZV9wdHItPmFkZHJlc3M7Ci0gICAgICB0bXAgID0gKmNhY2hlX3B0cjsKLSAgICAgIHdoaWxlIChjdXJzb3ItPmFkZHJlc3MgPiBzdG9wICYmIGN1cnNvciA+PSByZWxvY19jYWNoZSkKLSAgICAgIHsKLQljdXJzb3JbMV0gPSBjdXJzb3JbMF07Ci0JY3Vyc29yLS07Ci0gICAgICB9Ci0gICAgICBjdXJzb3JbMV0gPSB0bXA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwcmV2X2FkZHIgPSBjYWNoZV9wdHItPmFkZHJlc3M7Ci0gICAgfQotICB9Ci0KLQotICBpZiAocmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NzKTsKLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gY291bnQ7Ci0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICBpbnQgcl9leHRlcm4gPSAwOwotICBpbnQgcl9pZHg7Ci0gIGludCBpbmNvZGVfbWFzazsKLSAgaW50IGxlbl8xOwotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgbmF0c2l6ZSA9IGNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLSAgaW50IGV4dGVybl9tYXNrLCBwY3JlbF9tYXNrLCAgbGVuXzIsIGNhbGxqX21hc2s7Ci0gIGlmIChjb3VudCA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgZ2VuZXJpYyAgID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0gIG5hdGl2ZSA9ICgoc3RydWN0IHJlbG9jYXRpb25faW5mbyAqKSBiZmRfbWFsbG9jIChuYXRzaXplKSk7Ci0gIGlmICghbmF0aXZlICYmIG5hdHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gIHsKLSAgICAvKiBCaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDgwOwotICAgIGV4dGVybl9tYXNrID0gMHgxMDsKLSAgICBsZW5fMiAgICAgICA9IDB4NDA7Ci0gICAgbGVuXzEgICAgICAgPSAweDIwOwotICAgIGNhbGxqX21hc2sgID0gMHgwMjsKLSAgICBpbmNvZGVfbWFzayA9IDB4MDg7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgLyogTGl0dGxlLWVuZGlhbiBiaXQgZmllbGQgYWxsb2NhdGlvbiBvcmRlciAqLwotICAgIHBjcmVsX21hc2sgID0gMHgwMTsKLSAgICBleHRlcm5fbWFzayA9IDB4MDg7Ci0gICAgbGVuXzIgICAgICAgPSAweDA0OwotICAgIGxlbl8xICAgICAgID0gMHgwMjsKLSAgICBjYWxsal9tYXNrICA9IDB4NDA7Ci0gICAgaW5jb2RlX21hc2sgPSAweDEwOwotICB9Ci0KLSAgZm9yIChuYXRwdHIgPSBuYXRpdmU7IGNvdW50ID4gMDsgLS1jb3VudCwgKytuYXRwdHIsICsrZ2VuZXJpYykKLSAgewotICAgIGFyZWxlbnQgKmcgPSAqZ2VuZXJpYzsKLSAgICB1bnNpZ25lZCBjaGFyICpyYXcgPSAodW5zaWduZWQgY2hhciAqKW5hdHB0cjsKLSAgICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKLQotICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZy0+YWRkcmVzcywgcmF3KTsKLSAgICAvKiBGaW5kIGEgdHlwZSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB3aGljaCBtYXRjaGVzIHRoZSBpbnB1dCBob3d0byAtCi0gICAgICogYXQgdGhlIG1vbWVudCB3ZSBhc3N1bWUgaW5wdXQgZm9ybWF0ID09IG91dHB1dCBmb3JtYXQgRklYTUUhIQotICAgICAqLwotICAgIHJfaWR4ID0gMDsKLSAgICAvKiBGSVhNRTogIE5lZWQgY2FsbGogc3R1ZmYgaGVyZSwgYW5kIHRvIGNoZWNrIHRoZSBob3d0byBlbnRyaWVzIHRvCi0gICAgICAgYmUgc3VyZSB0aGV5IGFyZSByZWFsIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gICovCi0gICAgaWYgKGctPmhvd3RvPT0gJmhvd3RvX3JlbG9jX2NhbGxqKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IGNhbGxqX21hc2sgKyBwY3JlbF9tYXNrICsgbGVuXzI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID09ICZob3d0b19yZWxvY19wY3JlbDI0KQotICAgIHsKLSAgICAgIHJhd1s3XSA9IHBjcmVsX21hc2sgKyBsZW5fMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZy0+aG93dG8gPT0gJmhvd3RvX3JlbG9jX3BjcmVsMTMpCi0gICAgewotICAgICAgcmF3WzddID0gcGNyZWxfbWFzayArIGxlbl8xOwotICAgIH0KLSAgICBlbHNlIGlmIChnLT5ob3d0byA9PSAmaG93dG9fcmVsb2NfYWJzMzJjb2RlKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IGxlbl8yICsgaW5jb2RlX21hc2s7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID49IGhvd3RvX2FsaWduX3RhYmxlCi0JICAgICAmJiBnLT5ob3d0byA8PSAoaG93dG9fYWxpZ25fdGFibGUKLQkJCSAgICArIHNpemVvZiAoaG93dG9fYWxpZ25fdGFibGUpIC8gc2l6ZW9mIChob3d0b19hbGlnbl90YWJsZVswXSkKLQkJCSAgICAtIDEpKQotICAgICAgewotCS8qIHN5bW51bSA9PSAtMjsgZXh0ZXJuX21hc2sgbm90IHNldCwgcGNyZWxfbWFzayBzZXQgKi8KLQlyX2lkeCA9IC0yOwotCXJfZXh0ZXJuID0gMDsKLQlyYXdbN10gPSAocGNyZWxfbWFzawotCQkgIHwgKChnLT5ob3d0byAtIGhvd3RvX2FsaWduX3RhYmxlKSA8PCAxKSk7Ci0gICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByYXdbN10gPSBsZW5fMjsKLSAgICB9Ci0KLSAgICBpZiAocl9pZHggIT0gMCkKLSAgICAgIC8qIGFscmVhZHkgbXVja2VkIHdpdGggcl9leHRlcm4sIHJfaWR4ICovOwotICAgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0JICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCSAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotCi0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLSAgICAgIHsKLQkvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQlyX2lkeCA9IDA7Ci0Jcl9leHRlcm4gPSAwOwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkvKiBGaWxsIGluIHN5bWJvbCAqLwotCi0Jcl9leHRlcm4gPSAxOwotCXJfaWR4ID0gKCpnLT5zeW1fcHRyX3B0ciktPnVkYXRhLmk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaWR4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICAgIHJhd1s0XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHggPj4gMTYpOwotICAgICAgcmF3WzVdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCA+PiAgOCk7Ci0gICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOwotICAgIH0gZWxzZSB7Ci0gICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ID4+IDE2KTsKLSAgICAgIHJhd1s1XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHg+PiAgOCk7Ci0gICAgICByYXdbNF0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOwotICAgIH0KLSAgICBpZiAocl9leHRlcm4pCi0gICAgIHJhd1s3XSB8PSBleHRlcm5fbWFzazsKLSAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5hdGl2ZSwgMSwgbmF0c2l6ZSwgYWJmZCkgIT0gbmF0c2l6ZSkgewotICAgIGZyZWUoKFBUUiluYXRpdmUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmcmVlICgoUFRSKW5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotc3RhdGljIGxvbmcKLWJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgewotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gPT0gTlVMTAotCSAgJiYgISBiX291dF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCi0JcmV0dXJuIC0xOwotCi0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0JKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgfQotCi0gICpyZWxwdHIgPSBOVUxMOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotc3RhdGljIGxvbmcKLWJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiBzaXplb2YgKGFyZWxlbnQgKikgKiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCi0JICAgICgoZXhlY19oZHIoYWJmZCktPmFfZHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKLQkgICAgICsxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCi0JICAgICgoZXhlY19oZHIoYWJmZCktPmFfdHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKLQkgICAgICsxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiAwOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAtMTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1iX291dF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKSB7IC8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgaWYgKCEgYW91dF8zMl9tYWtlX3NlY3Rpb25zIChhYmZkKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci0gICAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgfQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApIHsKLSAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUilsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/dHJ1ZTpmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLQotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQkvKiBVbmtub3duIG1hY2hpbmUgYXJjaCBpcyBPSyAqLwotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF9pOTYwKQkvKiBpOTYwIGRlZmF1bHQgaXMgT0sgKi8KLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1iX291dF9zaXplb2ZfaGVhZGVycyAoaWdub3JlX2FiZmQsIGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYmZkX3ZtYQotZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQotICAvKiBBIHN5bWJvbCBob2xkcyBhIHBvaW50ZXIgdG8gYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0IGZyb20gdGhlCi0gICAgIGJhc2Ugb2YgdGhlIHNlY3Rpb24uICBUbyByZWxvY2F0ZSwgd2UgZmluZCB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsCi0gICAgIGxpdmUgaW4gdGhlIG91dHB1dCBhbmQgYWRkIHRoYXQgaW4gKi8KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIEJGRC4gIExvb2sgaXQgdXAgaW4gdGhlCi0JIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4KLQkgd2UgY29udmVydCBiLm91dCB0byB1c2UgYSBzcGVjaWZpYyBmaW5hbF9saW5rIGZ1bmN0aW9uIGFuZAotCSBjaGFuZ2UgdGhlIGludGVyZmFjZSB0byBiZmRfcmVsYXhfc2VjdGlvbiB0byBub3QgcmVxdWlyZSB0aGUKLQkgZ2VuZXJpYyBzeW1ib2xzLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChpbnB1dF9zZWN0aW9uLT5vd25lciwgbGlua19pbmZvLAotCQkJCQliZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkJCQlmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl2YWx1ZSA9IGgtPnUuZGVmLnZhbHVlICsgb3V0cHV0X2FkZHIgKGgtPnUuZGVmLnNlY3Rpb24pOwotICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXZhbHVlID0gaC0+dS5jLnNpemU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkgIGlucHV0X3NlY3Rpb24tPm93bmVyLCBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcywKLQkJICB0cnVlKSkpCi0JICAgIGFib3J0ICgpOwotCSAgdmFsdWUgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBvdXRwdXRfYWRkciAoc3ltYm9sLT5zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogQWRkIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlbG9jYXRpb24gKi8KLSAgdmFsdWUgKz0gcmVsb2MtPmFkZGVuZDsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wZXJmb3JtX3NsaXAgKGFiZmQsIHNsaXAsIGlucHV0X3NlY3Rpb24sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzbGlwOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYXN5bWJvbCAqKnM7Ci0KLSAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7Ci0KLSAgLyogRmluZCBhbGwgc3ltYm9scyBwYXN0IHRoaXMgcG9pbnQsIGFuZCBtYWtlIHRoZW0ga25vdwotICAgICB3aGF0J3MgaGFwcGVuZWQgKi8KLSAgd2hpbGUgKCpzKQotICB7Ci0gICAgYXN5bWJvbCAqcCA9ICpzOwotICAgIGlmIChwLT5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24pCi0gICAgewotICAgICAgLyogVGhpcyB3YXMgcG9pbnRpbmcgaW50byB0aGlzIHNlY3Rpb24sIHNvIG1hbmdsZSBpdCAqLwotICAgICAgaWYgKHAtPnZhbHVlID4gdmFsdWUpCi0gICAgICB7Ci0JcC0+dmFsdWUgLT1zbGlwOwotCWlmIChwLT51ZGF0YS5wICE9IE5VTEwpCi0JICB7Ci0JICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBwLT51ZGF0YS5wOwotCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKTsKLQkgICAgaC0+cm9vdC51LmRlZi52YWx1ZSAtPSBzbGlwOwotCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnUuZGVmLnZhbHVlID09IHAtPnZhbHVlKTsKLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcysrOwotCi0gIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIHdvcmtzIG91dCBpZiB0aGUgdGhpbmcgd2Ugd2FudCB0byBnZXQgdG8gY2FuIGJlCi0gICByZWFjaGVkIHdpdGggYSAyNGJpdCBvZmZzZXQgaW5zdGVhZCBvZiBhIDMyIGJpdCBvbmUuCi0gICBJZiBpdCBjYW4sIHRoZW4gaXQgY2hhbmdlcyB0aGUgYW1vZGUgKi8KLQotc3RhdGljIGludAotYWJzMzJjb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcjsKLSAgICAgdW5zaWduZWQgaW50IHNocmluazsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkX3ZtYSB2YWx1ZSA9IGdldF92YWx1ZSAociwgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLSAgYmZkX3ZtYSBkb3QgPSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikgKyByLT5hZGRyZXNzOwotICBiZmRfdm1hIGdhcDsKLQotICAvKiBTZWUgaWYgdGhlIGFkZHJlc3Mgd2UncmUgbG9va2luZyBhdCB3aXRoaW4gMl4yMyBieXRlcyBvZiB3aGVyZQotICAgICB3ZSBhcmUsIGlmIHNvIHRoZW4gd2UgY2FuIHVzZSBhIHNtYWxsIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUKLSAgICAganVtcCB3ZSB3ZXJlIGdvaW5nIHRvICovCi0KLSAgZ2FwID0gdmFsdWUgLSAoZG90IC0gc2hyaW5rKTsKLQotCi0gIGlmICgtMTw8MjMgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTw8MjMgKQotICB7Ci0gICAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMzJiaXRjb2RlIHBvc3NpYmxlIDI0LCB0byAyNGJpdAotICAgICAgIHBvc3NpYmxlIDMyICovCi0KLSAgICByLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMmNvZGVzaHJ1bms7Ci0gICAgLyogVGhlIHBsYWNlIHRvIHJlbGMgbW92ZXMgYmFjayBieSBmb3VyIGJ5dGVzICovCi0gICAgci0+YWRkcmVzcyAtPTQ7Ci0KLSAgICAvKiBUaGlzIHdpbGwgYmUgZm91ciBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLwotICAgIHNocmluayArPSA0IDsKLSAgICBwZXJmb3JtX3NsaXAgKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIHItPmFkZHJlc3Mtc2hyaW5rICsgNCk7Ci0gIH0KLSAgcmV0dXJuIHNocmluazsKLX0KLQotc3RhdGljIGludAotYWxpZ25jb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmspCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnI7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci17Ci0gIGJmZF92bWEgZG90ID0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pICsgci0+YWRkcmVzczsKLSAgYmZkX3ZtYSBnYXA7Ci0gIGJmZF92bWEgb2xkX2VuZDsKLSAgYmZkX3ZtYSBuZXdfZW5kOwotICBpbnQgc2hyaW5rX2RlbHRhOwotICBpbnQgc2l6ZSA9IHItPmhvd3RvLT5zaXplOwotCi0gIC8qIFJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgYWxpZ25tZW50IHNvIHRoYXQgaXQncyBzdGlsbCBhbGlnbmVkIGJ1dAotICAgICBzbWFsbGVyICAtIHRoZSBjdXJyZW50IHNpemUgaXMgYWxyZWFkeSB0aGUgc2FtZSBzaXplIGFzIG9yIGJpZ2dlcgotICAgICB0aGFuIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAqLwotCi0gIC8qIGNhbGN1bGF0ZSB0aGUgZmlyc3QgYnl0ZSBmb2xsb3dpbmcgdGhlIHBhZGRpbmcgYmVmb3JlIHdlIG9wdGltaXplICovCi0gIG9sZF9lbmQgPSAoKGRvdCArIHNpemUgKSAmIH5zaXplKSArIHNpemUrMTsKLSAgLyogd29yayBvdXQgd2hlcmUgdGhlIG5ldyBlbmQgd2lsbCBiZSAtIHJlbWVtYmVyIHRoYXQgd2UncmUgc21hbGxlcgotICAgICB0aGFuIHdlIHVzZWQgdG8gYmUgKi8KLSAgbmV3X2VuZCA9ICgoZG90IC0gc2hyaW5rICsgc2l6ZSkgJiB+c2l6ZSk7Ci0KLSAgLyogVGhpcyBpcyB0aGUgbmV3IGVuZCAqLwotICBnYXAgPSBvbGRfZW5kIC0gKChkb3QgKyBzaXplKSAmIH5zaXplKTsKLQotICBzaHJpbmtfZGVsdGEgPSAob2xkX2VuZCAtIG5ld19lbmQpIC0gc2hyaW5rOwotCi0gIGlmIChzaHJpbmtfZGVsdGEpCi0gIHsKLSAgICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHNvIHRoYXQgaXQga25vd3MgaG93IGZhciB0byBhbGlnbiB0byAqLwotICAgIHItPmhvd3RvID0gaG93dG9fZG9uZV9hbGlnbl90YWJsZSArIChyLT5ob3d0byAtIGhvd3RvX2FsaWduX3RhYmxlKTsKLQotICAgIC8qIEVuY29kZSB0aGUgc3R1ZmYgaW50byB0aGUgYWRkZW5kIC0gZm9yIGZ1dHVyZSB1c2Ugd2UgbmVlZCB0bwotICAgICAgIGtub3cgaG93IGJpZyB0aGUgcmVsb2MgdXNlZCB0byBiZSAqLwotICAgIHItPmFkZGVuZCA9IG9sZF9lbmQgLSBkb3QgKyByLT5hZGRyZXNzOwotCi0gICAgLyogVGhpcyB3aWxsIGJlIE4gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4sIGFkanVzdCBhbGwgdGhlIHN5bWJvbHMgKi8KLSAgICBwZXJmb3JtX3NsaXAgKGFiZmQsIHNocmlua19kZWx0YSwgaW5wdXRfc2VjdGlvbiwgci0+YWRkcmVzcyAtIHNocmluayk7Ci0gICAgc2hyaW5rICs9IHNocmlua19kZWx0YTsKLSAgfQotICByZXR1cm4gc2hyaW5rOwotfQotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfYmZkX3JlbGF4X3NlY3Rpb24gKGFiZmQsIGksIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmk7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGktPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGk7Ci0gIGludCBzaHJpbmsgPSAwIDsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQoaW5wdXRfYmZkLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uKTsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG9ubHkgcnVuIHRoaXMgcmVsYXhhdGlvbiBvbmNlLiAgSXQgbWlnaHQgd29yayB0byBydW4gaXQKLSAgICAgbXVsdGlwbGUgdGltZXMsIGJ1dCBpdCBoYXNuJ3QgYmVlbiB0ZXN0ZWQuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAocmVsb2Nfc2l6ZSkKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX2NvdW50OwotCi0gICAgICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gICAgICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBHZXQgdGhlIHJlbG9jcyBhbmQgdGhpbmsgYWJvdXQgdGhlbSAqLwotICAgICAgcmVsb2NfY291bnQgPQotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NfdmVjdG9yLAotCQkJCV9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpKTsKLSAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAocmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGFyZWxlbnQgKipwYXJlbnQ7Ci0JICBmb3IgKHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudDsgcGFyZW50KyspCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICpyID0gKnBhcmVudDsKLQkgICAgICBzd2l0Y2ggKHItPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgQUxJR05FUjoKLQkJICAvKiBBbiBhbGlnbm1lbnQgcmVsb2MgKi8KLQkJICBzaHJpbmsgPSBhbGlnbmNvZGUgKGFiZmQsIGlucHV0X3NlY3Rpb24sIHIsIHNocmluayk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzJDT0RFOgotCQkgIC8qIEEgMzJiaXQgcmVsb2MgaW4gYW4gYWRkcmVzc2luZyBtb2RlICovCi0JCSAgc2hyaW5rID0gYWJzMzJjb2RlIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHIsIHNocmluaywKLQkJCQkgICAgICBsaW5rX2luZm8pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERV9TSFJVTks6Ci0JCSAgc2hyaW5rKz00OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLSBzaHJpbms7Ci0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJmZF9ieXRlICoKLWJfb3V0X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBkb24ndCBib3RoZXIgdG8gcmVsYXguICAqLwotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLAotCQkJCQkJICAgICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IDE7Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBCRkRfQVNTRVJUICh0cnVlID09IGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLAotCQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJCWRhdGEsCi0JCQkJCQkwLAotCQkJCQkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0KLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudCA9IHJlbG9jX3ZlY3RvcjsKLSAgICAgIGFyZWxlbnQgKnJlbG9jIDsKLQotICAgICAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gMDsKLSAgICAgIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgcnVuOwotICAgICAgdW5zaWduZWQgaW50IGlkeDsKLQotICAgICAgLyogRmluZCBob3cgbG9uZyBhIHJ1biB3ZSBjYW4gZG8gKi8KLSAgICAgIHdoaWxlIChkc3RfYWRkcmVzcyA8IGxpbmtfb3JkZXItPnNpemUpCi0JewotCSAgcmVsb2MgPSAqcGFyZW50OwotCSAgaWYgKHJlbG9jKQotCSAgICB7Ci0JICAgICAgLyogTm90ZSB0aGF0IHRoZSByZWxheGluZyBkaWRuJ3QgdGllIHVwIHRoZSBhZGRyZXNzZXMgaW4gdGhlCi0JCSByZWxvY2F0aW9uLCBzbyB3ZSB1c2UgdGhlIG9yaWdpbmFsIGFkZHJlc3MgdG8gd29yayBvdXQgdGhlCi0JCSBydW4gb2Ygbm9uLXJlbG9jYXRlZCBkYXRhICovCi0JICAgICAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZHJlc3MgPj0gc3JjX2FkZHJlc3MpOwotCSAgICAgIHJ1biA9IHJlbG9jLT5hZGRyZXNzIC0gc3JjX2FkZHJlc3M7Ci0JICAgICAgcGFyZW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJ1biA9IGxpbmtfb3JkZXItPnNpemUgLSBkc3RfYWRkcmVzczsKLQkgICAgfQotCSAgLyogQ29weSB0aGUgYnl0ZXMgKi8KLQkgIGZvciAoaWR4ID0gMDsgaWR4IDwgcnVuOyBpZHgrKykKLQkgICAgewotCSAgICAgIGRhdGFbZHN0X2FkZHJlc3MrK10gPSBkYXRhW3NyY19hZGRyZXNzKytdOwotCSAgICB9Ci0KLQkgIC8qIE5vdyBkbyB0aGUgcmVsb2NhdGlvbiAqLwotCi0JICBpZiAocmVsb2MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIEFCUzMyQ09ERToKLQkJICBjYWxsanhfY2FsbGJhY2sgKGlucHV0X2JmZCwgbGlua19pbmZvLCByZWxvYywKLQkJCQkgICBzcmNfYWRkcmVzcyArIGRhdGEsIGRzdF9hZGRyZXNzICsgZGF0YSwKLQkJCQkgICBpbnB1dF9zZWN0aW9uKTsKLQkJICBzcmNfYWRkcmVzcys9NDsKLQkJICBkc3RfYWRkcmVzcys9NDsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMzMjoKLQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JCQkgICAgICAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgc3JjX2FkZHJlc3MpCi0JCQkgICAgICAgKyBnZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pKSwKLQkJCSAgICAgIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ0FMTEo6Ci0JCSAgY2FsbGpfY2FsbGJhY2sgKGlucHV0X2JmZCwgbGlua19pbmZvLCByZWxvYywgZGF0YSwKLQkJCQkgIHNyY19hZGRyZXNzLCBkc3RfYWRkcmVzcywgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIGZhbHNlKTsKLQkJICBzcmNfYWRkcmVzcys9NDsKLQkJICBkc3RfYWRkcmVzcys9NDsKLQkJICBicmVhazsKLQkJY2FzZSBBTElHTkRPTkU6Ci0JCSAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZGVuZCA+PSBzcmNfYWRkcmVzcyk7Ci0JCSAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZGVuZCA8PSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCQkgIHNyY19hZGRyZXNzID0gcmVsb2MtPmFkZGVuZDsKLQkJICBkc3RfYWRkcmVzcyA9ICgoZHN0X2FkZHJlc3MgKyByZWxvYy0+aG93dG8tPnNpemUpCi0JCQkJICYgfnJlbG9jLT5ob3d0by0+c2l6ZSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzJDT0RFX1NIUlVOSzoKLQkJICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjYWxseCwgYnV0IHdlJ3ZlIGZvdW5kIG91dCB0aGF0IGEKLQkJICAgICBjYWxsaiB3aWxsIHJlYWNoLCBzbyBkbyB0aGUgcmlnaHQgdGhpbmcuICAqLwotCQkgIGNhbGxqX2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsIGRhdGEsCi0JCQkJICBzcmNfYWRkcmVzcyArIDQsIGRzdF9hZGRyZXNzLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgdHJ1ZSk7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgc3JjX2FkZHJlc3MrPTg7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUENSRUwyNDoKLQkJICB7Ci0JCSAgICBsb25nIGludCB3b3JkID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCQkJZGF0YSArIHNyY19hZGRyZXNzKTsKLQkJICAgIGJmZF92bWEgdmFsdWU7Ci0KLQkJICAgIHZhbHVlID0gZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQkJICAgIHdvcmQgPSAoKHdvcmQgJiB+QkFMX01BU0spCi0JCQkgICAgfCAoKCh3b3JkICYgQkFMX01BU0spCi0JCQkJKyB2YWx1ZQotCQkJCS0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pCi0JCQkJKyByZWxvYy0+YWRkZW5kKQotCQkJICAgICAgICYgQkFMX01BU0spKTsKLQotCQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB3b3JkLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQkgICAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgICBzcmNfYWRkcmVzcys9NDsKLQotCQkgIH0KLQkJICBicmVhazsKLQotCQljYXNlIFBDUkVMMTM6Ci0JCSAgewotCQkgICAgbG9uZyBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJCWRhdGEgKyBzcmNfYWRkcmVzcyk7Ci0JCSAgICBiZmRfdm1hIHZhbHVlOwotCi0JCSAgICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCSAgICB3b3JkID0gKCh3b3JkICYgflBDUkVMMTNfTUFTSykKLQkJCSAgICB8ICgoKHdvcmQgJiBQQ1JFTDEzX01BU0spCi0JCQkJKyB2YWx1ZQotCQkJCSsgcmVsb2MtPmFkZGVuZAotCQkJCS0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQotCQkJICAgICAgICYgUENSRUwxM19NQVNLKSk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgd29yZCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkJICAgIGRzdF9hZGRyZXNzKz00OwotCQkgICAgc3JjX2FkZHJlc3MrPTQ7Ci0KLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhYm9ydCgpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEJ1aWxkIHRoZSB0cmFuc2ZlciB2ZWN0b3JzIGZvciBCaWcgYW5kIExpdHRsZS1FbmRpYW4gQi5PVVQgZmlsZXMuICAqLwotCi0jZGVmaW5lIGFvdXRfMzJfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBiX291dF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiX291dF9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBiX291dF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBiX291dF9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIGJfb3V0X2JmZF9nY19zZWN0aW9ucyAgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotI2RlZmluZSBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2xpdHRsZV9ob3N0OwotCi1jb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19iaWdfaG9zdCA9Ci17Ci0gICJiLm91dC5iaWciLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhkciBieXRlIG9yZGVyIGlzIGJpZyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSApLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gICdfJywJCQkJLyogc3ltYm9sIGxlYWRpbmcgY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotIHtfYmZkX2R1bW15X3RhcmdldCwgYl9vdXRfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGJfb3V0X21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBiX291dF93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgYl9vdXRfdmVjX2xpdHRsZV9ob3N0LAotICAKLSAgKFBUUikgMCwKLX07Ci0KLQotY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfbGl0dGxlX2hvc3QgPQotewotICAiYi5vdXQubGl0dGxlIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSApLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gICdfJywJCQkJLyogc3ltYm9sIGxlYWRpbmcgY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgYl9vdXRfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGJfb3V0X21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBiX291dF93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBiX291dF92ZWNfYmlnX2hvc3QsCi0gIAotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NhY2hlLmMgYi9iZmQvY2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4ZGU0Yi4uMDAwMDAwMAotLS0gYS9iZmQvY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSAtLSBjYWNoaW5nIG9mIGZpbGUgZGVzY3JpcHRvcnMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IChzdGV2ZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCUZpbGUgY2FjaGluZwotCi0JVGhlIGZpbGUgY2FjaGluZyBtZWNoYW5pc20gaXMgZW1iZWRkZWQgd2l0aGluIEJGRCBhbmQgYWxsb3dzCi0JdGhlIGFwcGxpY2F0aW9uIHRvIG9wZW4gYXMgbWFueSBCRkRzIGFzIGl0IHdhbnRzIHdpdGhvdXQKLQlyZWdhcmQgdG8gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSdzIGZpbGUgZGVzY3JpcHRvcgotCWxpbWl0IChvZnRlbiBhcyBsb3cgYXMgMjAgb3BlbiBmaWxlcykuICBUaGUgbW9kdWxlIGluCi0JPDxjYWNoZS5jPj4gbWFpbnRhaW5zIGEgbGVhc3QgcmVjZW50bHkgdXNlZCBsaXN0IG9mCi0JPDxCRkRfQ0FDSEVfTUFYX09QRU4+PiBmaWxlcywgYW5kIGV4cG9ydHMgdGhlIG5hbWUKLQk8PGJmZF9jYWNoZV9sb29rdXA+Piwgd2hpY2ggcnVucyBhcm91bmQgYW5kIG1ha2VzIHN1cmUgdGhhdAotCXRoZSByZXF1aXJlZCBCRkQgaXMgb3Blbi4gSWYgbm90LCB0aGVuIGl0IGNob29zZXMgYSBmaWxlIHRvCi0JY2xvc2UsIGNsb3NlcyBpdCBhbmQgb3BlbnMgdGhlIG9uZSB3YW50ZWQsIHJldHVybmluZyBpdHMgZmlsZQotCWhhbmRsZS4gCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIHZvaWQgaW5zZXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzbmlwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjbG9zZV9vbmUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gYmZkX2NhY2hlX2RlbGV0ZSBQQVJBTVMgKChiZmQgKikpOwotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQlCRkRfQ0FDSEVfTUFYX09QRU4gbWFjcm8KLQotREVTQ1JJUFRJT04KLQlUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgd2hpY2ggdGhlIGNhY2hlIHdpbGwga2VlcCBvcGVuIGF0Ci0Jb25lIHRpbWUuCi0KLS4jZGVmaW5lIEJGRF9DQUNIRV9NQVhfT1BFTiAxMAotCi0qLwotCi0vKiBUaGUgbnVtYmVyIG9mIEJGRCBmaWxlcyB3ZSBoYXZlIG9wZW4uICAqLwotCi1zdGF0aWMgaW50IG9wZW5fZmlsZXM7Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9sYXN0X2NhY2hlCi0KLVNZTk9QU0lTCi0JZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLURFU0NSSVBUSU9OCi0JWmVybywgb3IgYSBwb2ludGVyIHRvIHRoZSB0b3Btb3N0IEJGRCBvbiB0aGUgY2hhaW4uICBUaGlzIGlzCi0JdXNlZCBieSB0aGUgPDxiZmRfY2FjaGVfbG9va3VwPj4gbWFjcm8gaW4gQGZpbGV7bGliYmZkLmh9IHRvCi0JZGV0ZXJtaW5lIHdoZW4gaXQgY2FuIGF2b2lkIGEgZnVuY3Rpb24gY2FsbC4KLSovCi0KLWJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLS8qCi0gIElOVEVSTkFMX0ZVTkNUSU9OCi0gIAliZmRfY2FjaGVfbG9va3VwCi0gCi0gIERFU0NSSVBUSU9OCi0gCUNoZWNrIHRvIHNlZSBpZiB0aGUgcmVxdWlyZWQgQkZEIGlzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG9uZQotIAlsb29rZWQgdXAuIElmIHNvLCB0aGVuIGl0IGNhbiB1c2UgdGhlIHN0cmVhbSBpbiB0aGUgQkZEIHdpdGgKLSAJaW1wdW5pdHksIHNpbmNlIGl0IGNhbid0IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBsb29rdXA7Ci0gCW90aGVyd2lzZSwgaXQgaGFzIHRvIHBlcmZvcm0gdGhlIGNvbXBsaWNhdGVkIGxvb2t1cCBmdW5jdGlvbi4KLSAKLSAgLiNkZWZpbmUgYmZkX2NhY2hlX2xvb2t1cCh4KSBcCi0gIC4gICAgKCh4KT09YmZkX2xhc3RfY2FjaGU/IFwKLSAgLiAgICAgIChGSUxFKikoYmZkX2xhc3RfY2FjaGUtPmlvc3RyZWFtKTogXAotICAuICAgICAgIGJmZF9jYWNoZV9sb29rdXBfd29ya2VyKHgpKQotIAotIAotICovCi0KLS8qIEluc2VydCBhIEJGRCBpbnRvIHRoZSBjYWNoZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotaW5zZXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfbGFzdF9jYWNoZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFiZmQtPmxydV9uZXh0ID0gYWJmZDsKLSAgICAgIGFiZmQtPmxydV9wcmV2ID0gYWJmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhYmZkLT5scnVfbmV4dCA9IGJmZF9sYXN0X2NhY2hlOwotICAgICAgYWJmZC0+bHJ1X3ByZXYgPSBiZmRfbGFzdF9jYWNoZS0+bHJ1X3ByZXY7Ci0gICAgICBhYmZkLT5scnVfcHJldi0+bHJ1X25leHQgPSBhYmZkOwotICAgICAgYWJmZC0+bHJ1X25leHQtPmxydV9wcmV2ID0gYWJmZDsKLSAgICB9Ci0gIGJmZF9sYXN0X2NhY2hlID0gYWJmZDsKLX0KLQotLyogUmVtb3ZlIGEgQkZEIGZyb20gdGhlIGNhY2hlLiAgKi8KLQotc3RhdGljIElOTElORSB2b2lkCi1zbmlwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPmxydV9wcmV2LT5scnVfbmV4dCA9IGFiZmQtPmxydV9uZXh0OwotICBhYmZkLT5scnVfbmV4dC0+bHJ1X3ByZXYgPSBhYmZkLT5scnVfcHJldjsKLSAgaWYgKGFiZmQgPT0gYmZkX2xhc3RfY2FjaGUpCi0gICAgewotICAgICAgYmZkX2xhc3RfY2FjaGUgPSBhYmZkLT5scnVfbmV4dDsKLSAgICAgIGlmIChhYmZkID09IGJmZF9sYXN0X2NhY2hlKQotCWJmZF9sYXN0X2NhY2hlID0gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIFdlIG5lZWQgdG8gb3BlbiBhIG5ldyBmaWxlLCBhbmQgdGhlIGNhY2hlIGlzIGZ1bGwuICBGaW5kIHRoZSBsZWFzdAotICAgcmVjZW50bHkgdXNlZCBjYWNoZWFibGUgQkZEIGFuZCBjbG9zZSBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jbG9zZV9vbmUgKCkKLXsKLSAgcmVnaXN0ZXIgYmZkICpraWxsOwotCi0gIGlmIChiZmRfbGFzdF9jYWNoZSA9PSBOVUxMKQotICAgIGtpbGwgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgZm9yIChraWxsID0gYmZkX2xhc3RfY2FjaGUtPmxydV9wcmV2OwotCSAgICEga2lsbC0+Y2FjaGVhYmxlOwotCSAgIGtpbGwgPSBraWxsLT5scnVfcHJldikKLQl7Ci0JICBpZiAoa2lsbCA9PSBiZmRfbGFzdF9jYWNoZSkKLQkgICAgewotCSAgICAgIGtpbGwgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoa2lsbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBubyBvcGVuIGNhY2hlYWJsZSBCRkQncy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAga2lsbC0+d2hlcmUgPSBmdGVsbCAoKEZJTEUgKikga2lsbC0+aW9zdHJlYW0pOwotCi0gIHJldHVybiBiZmRfY2FjaGVfZGVsZXRlIChraWxsKTsKLX0KLQotLyogQ2xvc2UgYSBCRkQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBjYWNoZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iZmRfY2FjaGVfZGVsZXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmIChmY2xvc2UgKChGSUxFICopIGFiZmQtPmlvc3RyZWFtKSA9PSAwKQotICAgIHJldCA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXQgPSBmYWxzZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgfQotCi0gIHNuaXAgKGFiZmQpOwotCi0gIGFiZmQtPmlvc3RyZWFtID0gTlVMTDsKLSAgLS1vcGVuX2ZpbGVzOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9jYWNoZV9pbml0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2FjaGVfaW5pdCAoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlBZGQgYSBuZXdseSBvcGVuZWQgQkZEIHRvIHRoZSBjYWNoZS4KLSovCi0KLWJvb2xlYW4KLWJmZF9jYWNoZV9pbml0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEJGRF9BU1NFUlQgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwpOwotICBpZiAob3Blbl9maWxlcyA+PSBCRkRfQ0FDSEVfTUFYX09QRU4pCi0gICAgewotICAgICAgaWYgKCEgY2xvc2Vfb25lICgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGluc2VydCAoYWJmZCk7Ci0gICsrb3Blbl9maWxlczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9jYWNoZV9jbG9zZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NhY2hlX2Nsb3NlIChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJlbW92ZSB0aGUgQkZEIEB2YXJ7YWJmZH0gZnJvbSB0aGUgY2FjaGUuIElmIHRoZSBhdHRhY2hlZCBmaWxlIGlzIG9wZW4sCi0JdGhlbiBjbG9zZSBpdCB0b28uCi0KLVJFVFVSTlMKLQk8PGZhbHNlPj4gaXMgcmV0dXJuZWQgaWYgY2xvc2luZyB0aGUgZmlsZSBmYWlscywgPDx0cnVlPj4gaXMKLQlyZXR1cm5lZCBpZiBhbGwgaXMgd2VsbC4KLSovCi0KLWJvb2xlYW4KLWJmZF9jYWNoZV9jbG9zZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+aW9zdHJlYW0gPT0gTlVMTAotICAgICAgfHwgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gYmZkX2NhY2hlX2RlbGV0ZSAoYWJmZCk7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9vcGVuX2ZpbGUKLQotU1lOT1BTSVMKLQlGSUxFKiBiZmRfb3Blbl9maWxlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbCB0aGUgT1MgdG8gb3BlbiBhIGZpbGUgZm9yIEB2YXJ7YWJmZH0uICBSZXR1cm4gdGhlIDw8RklMRSAqPj4KLQkocG9zc2libHkgPDxOVUxMPj4pIHRoYXQgcmVzdWx0cyBmcm9tIHRoaXMgb3BlcmF0aW9uLiAgU2V0IHVwIHRoZQotCUJGRCBzbyB0aGF0IGZ1dHVyZSBhY2Nlc3NlcyBrbm93IHRoZSBmaWxlIGlzIG9wZW4uIElmIHRoZSA8PEZJTEUgKj4+Ci0JcmV0dXJuZWQgaXMgPDxOVUxMPj4sIHRoZW4gaXQgd29uJ3QgaGF2ZSBiZWVuIHB1dCBpbiB0aGUKLQljYWNoZSwgc28gaXQgd29uJ3QgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gaXQuCi0qLwotCi1GSUxFICoKLWJmZF9vcGVuX2ZpbGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWJmZC0+Y2FjaGVhYmxlID0gdHJ1ZTsJLyogQWxsb3cgaXQgdG8gYmUgY2xvc2VkIGxhdGVyLiAqLwotCi0gIGlmIChvcGVuX2ZpbGVzID49IEJGRF9DQUNIRV9NQVhfT1BFTikKLSAgICB7Ci0gICAgICBpZiAoISBjbG9zZV9vbmUgKCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN3aXRjaCAoYWJmZC0+ZGlyZWN0aW9uKQotICAgIHsKLSAgICBjYXNlIHJlYWRfZGlyZWN0aW9uOgotICAgIGNhc2Ugbm9fZGlyZWN0aW9uOgotICAgICAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1JCKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYm90aF9kaXJlY3Rpb246Ci0gICAgY2FzZSB3cml0ZV9kaXJlY3Rpb246Ci0gICAgICBpZiAoYWJmZC0+b3BlbmVkX29uY2UgPT0gdHJ1ZSkKLQl7Ci0JICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChhYmZkLT5maWxlbmFtZSwgRk9QRU5fUlVCKTsKLQkgIGlmIChhYmZkLT5pb3N0cmVhbSA9PSBOVUxMKQotCSAgICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChhYmZkLT5maWxlbmFtZSwgRk9QRU5fV1VCKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ3JlYXRlIHRoZSBmaWxlLiAgVW5saW5rIGl0IGZpcnN0LCBmb3IgdGhlIGNvbnZlbmllbmNlIG9mCi0gICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbXMgd2hpY2ggd29ycnkgYWJvdXQgb3ZlcndyaXRpbmcgcnVubmluZwotICAgICAgICAgICAgIGJpbmFyaWVzLiAgKi8KLQkgIHVubGluayAoYWJmZC0+ZmlsZW5hbWUpOwotCSAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1dCKTsKLQkgIGFiZmQtPm9wZW5lZF9vbmNlID0gdHJ1ZTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX2NhY2hlX2luaXQgKGFiZmQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKEZJTEUgKikgYWJmZC0+aW9zdHJlYW07Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyCi0KLVNZTk9QU0lTCi0JRklMRSAqYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsZWQgd2hlbiB0aGUgbWFjcm8gPDxiZmRfY2FjaGVfbG9va3VwPj4gZmFpbHMgdG8gZmluZCBhCi0JcXVpY2sgYW5zd2VyLiAgRmluZCBhIGZpbGUgZGVzY3JpcHRvciBmb3IgQHZhcnthYmZkfS4gIElmCi0JbmVjZXNzYXJ5LCBpdCBvcGVuIGl0LiAgSWYgdGhlcmUgYXJlIGFscmVhZHkgbW9yZSB0aGFuCi0JPDxCRkRfQ0FDSEVfTUFYX09QRU4+PiBmaWxlcyBvcGVuLCBpdCB0cmllcyB0byBjbG9zZSBvbmUgZmlyc3QsIHRvCi0JYXZvaWQgcnVubmluZyBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycy4gIAotKi8KLQotRklMRSAqCi1iZmRfY2FjaGVfbG9va3VwX3dvcmtlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSkgCi0gICAgYWJmZCA9IGFiZmQtPm15X2FyY2hpdmU7Ci0KLSAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwpCi0gICAgewotICAgICAgLyogTW92ZSB0aGUgZmlsZSB0byB0aGUgc3RhcnQgb2YgdGhlIGNhY2hlLiAgKi8KLSAgICAgIGlmIChhYmZkICE9IGJmZF9sYXN0X2NhY2hlKQotCXsKLQkgIHNuaXAgKGFiZmQpOwotCSAgaW5zZXJ0IChhYmZkKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJmZF9vcGVuX2ZpbGUgKGFiZmQpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBpZiAoZnNlZWsgKChGSUxFICopIGFiZmQtPmlvc3RyZWFtLCBhYmZkLT53aGVyZSwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoRklMRSAqKSBhYmZkLT5pb3N0cmVhbTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jZi1pMzg2bHlueC5jIGIvYmZkL2NmLWkzODZseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTRiZGUuLjAwMDAwMDAKLS0tIGEvYmZkL2NmLWkzODZseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQlpMzg2bHlueF9jb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1pMzg2LWx5bngiCi0KLSNkZWZpbmUgTFlOWE9TCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvY2YtbTY4a2x5bnguYyBiL2JmZC9jZi1tNjhrbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njc0ZjFiLi4wMDAwMDAwCi0tLSBhL2JmZC9jZi1tNjhrbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSBNNjhLIENPRkYgTHlueE9TIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQltNjhrbHlueF9jb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLWx5bngiCi0jZGVmaW5lIExZTlhPUwotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0jZGVmaW5lIFNUQVRJQ19SRUxPQ1MKLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jZi1zcGFyY2x5bnguYyBiL2JmZC9jZi1zcGFyY2x5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0YTA5OS4uMDAwMDAwMAotLS0gYS9iZmQvY2Ytc3BhcmNseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFNwYXJjIENPRkYgTHlueE9TIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQlzcGFyY2x5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtc3BhcmMtbHlueCIKLQotI2RlZmluZSBMWU5YT1MKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLSNpbmNsdWRlICJjb2ZmLXNwYXJjLmMiCmRpZmYgLS1naXQgYS9iZmQvY2lzY28tY29yZS5jIGIvYmZkL2Npc2NvLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5MmU3NS4uMDAwMDAwMAotLS0gYS9iZmQvY2lzY28tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQ0lTQ08gY3Jhc2ggZHVtcHMuCi0KLUNvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLS8qIGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCByZXR1cm5zIGEgaG9zdCBzaWduYWwgKHRoaXMgcHJvYmFibHkgc2hvdWxkCi0gICBiZSBmaXhlZCkuICAqLwotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBmb3IgTVNWQyBidWlsZHMgKi8KLSNpZm5kZWYgU0lHVFJBUAotIyBkZWZpbmUgU0lHVFJBUCA1Ci0jZW5kaWYKLSNpZm5kZWYgU0lHRU1UCi0jIGRlZmluZSBTSUdFTVQgNgotI2VuZGlmCi0jaWZuZGVmIFNJR0JVUwotIyBkZWZpbmUgU0lHQlVTIDEwCi0jZW5kaWYKLQwKLWludCBjcmFzaF9pbmZvX2xvY3NbXSA9IHsKLSAgMHgwMjUwLAkvKiBtaXBzLCBwcGMsIHg4NiwgaTk2MCAqLwotICAweDA0MDAsCS8qIG02OGssIG1pcHMsIHg4NiwgaTk2MCAqLwotICAweDBGRkMsCS8qIG02OGssIG1pcHMsIHBwYywgeDg2LCBpOTYwICovCi0gIDB4MzAwMCwJLyogcHBjICovCi0gIDB4NEZGQywJLyogbTY4ayAqLwotICAtMQotfTsKLQotI2RlZmluZSBDUkFTSF9NQUdJQwkweGRlYWQxMjM0Ci0jZGVmaW5lIE1BU0tfQUREUih4KQkoKHgpICYgMHgwZmZmZmZmZikJLyogTWFzayBjcmFzaCBpbmZvIGFkZHJlc3MgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBDUkFTSF9SRUFTT05fTk9UQ1JBU0hFRCA9IDAsCi0gICAgQ1JBU0hfUkVBU09OX0VYQ0VQVElPTiA9IDEsCi0gICAgQ1JBU0hfUkVBU09OX0NPUlJVUFQgPSAyLAotfSBjcmFzaHJlYXNvbjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyIG1hZ2ljWzRdOwkJLyogTWFnaWMgbnVtYmVyICovCi0gIGNoYXIgdmVyc2lvbls0XTsJCS8qIFZlcnNpb24gbnVtYmVyICovCi0gIGNoYXIgcmVhc29uWzRdOwkJLyogQ3Jhc2ggcmVhc29uICovCi0gIGNoYXIgY3B1X3ZlY3Rvcls0XTsJCS8qIENQVSB2ZWN0b3IgZm9yIGV4Y2VwdGlvbnMgKi8KLSAgY2hhciByZWdpc3RlcnNbNF07CQkvKiBQb2ludGVyIHRvIHNhdmVkIHJlZ2lzdGVycyAqLwotICBjaGFyIHJhbWJhc2VbNF07CQkvKiBCYXNlIG9mIFJBTSAobm90IGluIFYxIGNyYXNoIGluZm8pICovCi0gIGNoYXIgdGV4dGJhc2VbNF07CQkvKiBCYXNlIG9mIC50ZXh0IHNlY3Rpb24gKG5vdCBpbiBWMyBjcmFzaCBpbmZvKSAqLwotICBjaGFyIGRhdGFiYXNlWzRdOwkJLyogQmFzZSBvZiAuZGF0YSBzZWN0aW9uIChub3QgaW4gVjMgY3Jhc2ggaW5mbykgKi8KLSAgY2hhciBic3NiYXNlWzRdOwkJLyogQmFzZSBvZiAuYnNzIHNlY3Rpb24gKG5vdCBpbiBWMyBjcmFzaCBpbmZvKSAqLwotfSBjcmFzaGluZm9fZXh0ZXJuYWw7Ci0MCi1zdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QKLXsKLSAgaW50IHNpZzsKLX07Ci0MCi0vKiBFeGFtaW5lIHRoZSBmaWxlIGZvciBhIGNyYXNoIGluZm8gc3RydWN0IGF0IHRoZSBvZmZzZXQgZ2l2ZW4gYnkKLSAgIENSQVNIX0lORk9fTE9DLiAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1jaXNjb19jb3JlX2ZpbGVfdmFsaWRhdGUgKGFiZmQsIGNyYXNoX2luZm9fbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjcmFzaF9pbmZvX2xvYzsKLXsKLSAgY2hhciBidWZbNF07Ci0gIHVuc2lnbmVkIGludCBjcmFzaGluZm9fb2Zmc2V0OwotICBjcmFzaGluZm9fZXh0ZXJuYWwgY3Jhc2hpbmZvOwotICBpbnQgbnJlYWQ7Ci0gIHVuc2lnbmVkIGludCBtYWdpYzsKLSAgdW5zaWduZWQgaW50IHZlcnNpb247Ci0gIHVuc2lnbmVkIGludCByYW1iYXNlOwotICBzZWNfcHRyIGFzZWN0OwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3Jhc2hfaW5mb19sb2MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIG5yZWFkID0gYmZkX3JlYWQgKGJ1ZiwgMSwgNCwgYWJmZCk7Ci0gIGlmIChucmVhZCAhPSA0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgY3Jhc2hpbmZvX29mZnNldCA9IE1BU0tfQUREUiAoYmZkX2dldF8zMiAoYWJmZCwgYnVmKSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjcmFzaGluZm9fb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBNb3N0IGxpa2VseSB3ZSBmYWlsZWQgYmVjYXVzZSBvZiBhIGJvZ3VzIChodWdlKSBvZmZzZXQgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5yZWFkID0gYmZkX3JlYWQgKCZjcmFzaGluZm8sIDEsIHNpemVvZiAoY3Jhc2hpbmZvKSwgYWJmZCk7Ci0gIGlmIChucmVhZCAhPSBzaXplb2YgKGNyYXNoaW5mbykpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChiZmRfc3RhdCAoYWJmZCwgJnN0YXRidWYpIDwgMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG1hZ2ljID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLm1hZ2ljKTsKLSAgaWYgKG1hZ2ljICE9IENSQVNIX01BR0lDKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHZlcnNpb24gPSBiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8udmVyc2lvbik7Ci0gIGlmICh2ZXJzaW9uID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKHZlcnNpb24gPT0gMSkKLSAgICB7Ci0gICAgICAvKiBWMSBjb3JlIGR1bXBzIGRvbid0IHNwZWNpZnkgdGhlIGR1bXAgYmFzZSwgYXNzdW1lIDAgKi8KLSAgICAgIHJhbWJhc2UgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJhbWJhc2UgPSBiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8ucmFtYmFzZSk7Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZS4gICovCi0KLSAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhID0KLSAgICAoKHN0cnVjdCBjaXNjb19jb3JlX3N0cnVjdCAqKQotICAgICBiZmRfem1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QpKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzd2l0Y2ggKChjcmFzaHJlYXNvbikgYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnJlYXNvbikpCi0gICAgewotICAgIGNhc2UgQ1JBU0hfUkVBU09OX05PVENSQVNIRUQ6Ci0gICAgICAvKiBDcmFzaCBmaWxlIHByb2JhYmx5IGNhbWUgZnJvbSB3cml0ZSBjb3JlLiAgKi8KLSAgICAgIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1JBU0hfUkVBU09OX0NPUlJVUFQ6Ci0gICAgICAvKiBUaGUgY3Jhc2ggY29udGV4dCBhcmVhIHdhcyBjb3JydXB0IC0tIHByb2NlZWQgd2l0aCBjYXV0aW9uLgotCSBXZSBoYXZlIG5vIHdheSBvZiBwYXNzaW5nIHRoaXMgaW5mb3JtYXRpb24gYmFjayB0byB0aGUgY2FsbGVyLiAgKi8KLSAgICAgIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1JBU0hfUkVBU09OX0VYQ0VQVElPTjoKLSAgICAgIC8qIENyYXNoIG9jY3VyZWQgZHVlIHRvIENQVSBleGNlcHRpb24uICAqLwotCi0gICAgICAvKiBUaGlzIGlzIDY4ay1zcGVjaWZpYzsgZm9yIE1JUFMgd2UnbGwgbmVlZCB0byBpbnRlcnByZXQKLQkgY3B1X3ZlY3RvciBkaWZmZXJlbnRseSBiYXNlZCBvbiB0aGUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24KLQkgKHNpbmNlIENJU0NPIGNvcmUgZmlsZXMgZG9uJ3Qgc2VlbSB0byBoYXZlIHRoZSBwcm9jZXNzb3IKLQkgZW5jb2RlZCBpbiB0aGVtKS4gICovCi0KLSAgICAgIHN3aXRjaCAoYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLmNwdV92ZWN0b3IpKQotCXsKLQkgICAvKiBidXMgZXJyb3IgICAgICAgICAgICovCi0JY2FzZSAyIDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7IGJyZWFrOwotCSAgIC8qIGFkZHJlc3MgZXJyb3IgICAgICAgKi8KLQljYXNlIDMgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0JVUzsgYnJlYWs7Ci0JICAgLyogaWxsZWdhbCBpbnN0cnVjdGlvbiAqLwotCWNhc2UgNCA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0JICAgLyogemVybyBkaXZpZGUgICAgICAgICAqLwotCWNhc2UgNSA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAgLyogY2hrIGluc3RydWN0aW9uICAgICAqLwotCWNhc2UgNiA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyBicmVhazsKLQkgICAvKiB0cmFwdiBpbnN0cnVjdGlvbiAgICovCi0JY2FzZSA3IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7IGJyZWFrOwotCSAgIC8qIHByaXZpbGVnZSB2aW9sYXRpb24gKi8KLQljYXNlIDggOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR1NFR1Y7IGJyZWFrOwotCSAgIC8qIHRyYWNlIHRyYXAgICAgICAgICAgKi8KLQljYXNlIDkgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR1RSQVA7ICBicmVhazsKLQkgICAvKiBsaW5lIDEwMTAgZW11bGF0b3IgICovCi0JY2FzZSAxMDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdJTEw7ICBicmVhazsKLQkgICAvKiBsaW5lIDExMTEgZW11bGF0b3IgICovCi0JY2FzZSAxMTogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdJTEw7ICBicmVhazsKLQotCSAgLyogQ29wcm9jZXNzb3IgcHJvdG9jb2wgdmlvbGF0aW9uLiAgVXNpbmcgYSBzdGFuZGFyZCBNTVUgb3IgRlBVCi0JICAgICB0aGlzIGNhbm5vdCBiZSB0cmlnZ2VyZWQgYnkgc29mdHdhcmUuICBDYWxsIGl0IGEgU0lHQlVTLiAgKi8KLQljYXNlIDEzOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0JVUzsgIGJyZWFrOwotCi0JICAvKiBpbnRlcnJ1cHQgICAgICAgICAgICovCi0JY2FzZSAzMTogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdJTlQ7ICBicmVhazsKLQkgIC8qIGJyZWFrcG9pbnQgICAgICAgICAgKi8KLQljYXNlIDMzOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR1RSQVA7ICBicmVhazsKLQotCSAgLyogZmxvYXRpbmcgcG9pbnQgZXJyICAqLwotCWNhc2UgNDg6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiBmbG9hdGluZyBwb2ludCBlcnIgICovCi0JY2FzZSA0OTogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgIC8qIHplcm8gZGl2aWRlICAgICAgICAgKi8KLQljYXNlIDUwOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogdW5kZXJmbG93ICAgICAgICAgICAqLwotCWNhc2UgNTE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiBvcGVyYW5kIGVycm9yICAgICAgICovCi0JY2FzZSA1MjogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgICAvKiBvdmVyZmxvdyAgICAgICAgICAgICovCi0JY2FzZSA1MzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgIC8qIE5BTiAgICAgICAgICAgICAgICAgKi8KLQljYXNlIDU0OiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCWRlZmF1bHQ6Ci0jaWZuZGVmIFNJR0VNVAotI2RlZmluZSBTSUdFTVQgU0lHVFJBUAotI2VuZGlmCi0JICAvKiAic29mdHdhcmUgZ2VuZXJhdGVkIiovCi0JICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0VNVDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVW5rbm93biBjcmFzaCByZWFzb24uICAqLwotICAgICAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLSAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDA7Ci0KLSAgLyogQ3JlYXRlIGEgIi5yZWciIHNlY3Rpb24gdG8gYWxsb3cgYWNjZXNzIHRvIHRoZSBzYXZlZAotICAgICByZWdpc3RlcnMuICovCi0KLSAgYXNlY3QgPSAoYXNlY3Rpb24gKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGFzZWN0ID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGFzZWN0LT5uYW1lID0gIi5yZWciOwotICBhc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBhc2VjdC0+dm1hID0gMDsKLSAgYXNlY3QtPmZpbGVwb3MgPSBiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8ucmVnaXN0ZXJzKSAtIHJhbWJhc2U7Ci0gIC8qIFNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGV4YWN0IHNpemUgb2YgdGhlIHNhdmVkIHJlZ2lzdGVyIGluZm8sCi0gICAgIGNob29zZSBhIHJlZ2lzdGVyIHNlY3Rpb24gc2l6ZSB0aGF0IGlzIGVpdGhlciB0aGUgcmVtYWluaW5nIHBhcnQKLSAgICAgb2YgdGhlIGZpbGUsIG9yIDEwMjQsIHdoaWNoZXZlciBpcyBzbWFsbGVyLiAqLwotICBucmVhZCA9IHN0YXRidWYuc3Rfc2l6ZSAtIGFzZWN0LT5maWxlcG9zOwotICBhc2VjdC0+X3Jhd19zaXplID0gKG5yZWFkIDwgMTAyNCkgPyBucmVhZCA6IDEwMjQ7Ci0gIGFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0gIGFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0gICsrYWJmZC0+c2VjdGlvbl9jb3VudDsKLQotICAvKiBDcmVhdGUgYSAiLmNyYXNoIiBzZWN0aW9uIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgc2F2ZWQKLSAgICAgY3Jhc2ggaW5mb3JtYXRpb24uICovCi0KLSAgYXNlY3QgPSAoYXNlY3Rpb24gKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGFzZWN0ID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGFzZWN0LT5uYW1lID0gIi5jcmFzaCI7Ci0gIGFzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGFzZWN0LT52bWEgPSAwOwotICBhc2VjdC0+ZmlsZXBvcyA9IGNyYXNoaW5mb19vZmZzZXQ7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGNyYXNoaW5mbyk7Ci0gIGFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0gIGFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0gICsrYWJmZC0+c2VjdGlvbl9jb3VudDsKLQotICAvKiBDcmVhdGUgYSAiLmRhdGEiIHNlY3Rpb24gdGhhdCBtYXBzIHRoZSBlbnRpcmUgZmlsZSwgd2hpY2ggaXMKLSAgICAgZXNzZW50aWFsbHkgYSBkdW1wIG9mIHRoZSB0YXJnZXQgc3lzdGVtJ3MgUkFNLiAqLwotCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIuZGF0YSI7Ci0gIGFzZWN0LT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLSAgLyogVGhlIHNpemUgb2YgbWVtb3J5IGlzIHRoZSBzaXplIG9mIHRoZSBjb3JlIGZpbGUgaXRzZWxmLiAgKi8KLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHJhbWJhc2U7Ci0gIGFzZWN0LT5maWxlcG9zID0gMDsKLSAgYXNlY3QtPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKLSAgYWJmZC0+c2VjdGlvbnMgPSBhc2VjdDsKLSAgKythYmZkLT5zZWN0aW9uX2NvdW50OwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gIC8qIEdldCBoZXJlIGlmIHdlIGhhdmUgYWxyZWFkeSBzdGFydGVkIGZpbGxpbmcgb3V0IHRoZSBCRkQKLSAgICAgYW5kIHRoZXJlIGlzIGFuIGVycm9yIG9mIHNvbWUga2luZC4gKi8KLQotIGVycm9yX3JldHVybjoKLSAgewotICAgIHNlY19wdHIgbmV4dHNlY3Q7Ci0gICAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdCAhPSBOVUxMOykKLSAgICAgIHsKLQluZXh0c2VjdCA9IGFzZWN0LT5uZXh0OwotCWZyZWUgKGFzZWN0KTsKLQlhc2VjdCA9IG5leHRzZWN0OwotICAgICAgfQotICAgIGZyZWUgKGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY2lzY29fY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50ICpjcmFzaF9pbmZvX2xvY3A7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldCA9IE5VTEw7Ci0KLSAgZm9yIChjcmFzaF9pbmZvX2xvY3AgPSBjcmFzaF9pbmZvX2xvY3M7Ci0gICAgICAgKmNyYXNoX2luZm9fbG9jcCAhPSAtMSAgJiYgIHRhcmdldCA9PSBOVUxMOwotICAgICAgIGNyYXNoX2luZm9fbG9jcCsrKQotICAgIHsKLSAgICAgIHRhcmdldCA9IGNpc2NvX2NvcmVfZmlsZV92YWxpZGF0ZSAoYWJmZCwgKmNyYXNoX2luZm9fbG9jcCk7Ci0gICAgfQotICByZXR1cm4gKHRhcmdldCk7Ci19Ci0KLWNoYXIgKgotY2lzY29fY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gTlVMTDsKLX0KLQotaW50Ci1jaXNjb19jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnOwotfQotCi1ib29sZWFuCi1jaXNjb19jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZDsKLSAgICAgYmZkICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX2xpdHRsZV92ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgY2lzY29fY29yZV9iaWdfdmVjID0KLSAgewotICAgICJjaXNjby1pb3MtY29yZS1iaWciLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gICAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGNpc2NvX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY2lzY28pLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgJiBjaXNjb19jb3JlX2xpdHRsZV92ZWMsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKLQotY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX2xpdHRsZV92ZWMgPQotICB7Ci0gICAgImNpc2NvLWlvcy1jb3JlLWxpdHRsZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgY2lzY29fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChjaXNjbyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICAmY2lzY29fY29yZV9iaWdfdmVjLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hMjlrLmMgYi9iZmQvY29mZi1hMjlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzRiMjAuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtYTI5ay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQU1EIDI5MDAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBhdCBOZXcgWW9yayBVbml2ZXJzaXR5IDcvOC85MS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEEyOUsgMQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9hMjlrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGxvbmcgZ2V0X3N5bWJvbF92YWx1ZSBQQVJBTVMgKChhc3ltYm9sICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYTI5a19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hMjlrX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBib29sZWFuICopKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0KLSNkZWZpbmUgSU5TRVJUX0hXT1JEKFdPUkQsSFdPUkQpCVwKLSAgICAoKChXT1JEKSAmIDB4ZmYwMGZmMDApIHwgKCgoSFdPUkQpICYgMHhmZjAwKSA8PCA4KSB8ICgoSFdPUkQpJiAweGZmKSkKLSNkZWZpbmUgRVhUUkFDVF9IV09SRChXT1JEKSBcCi0gICAgKCgoKFdPUkQpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKFdPUkQpJiAweGZmKSkKLSNkZWZpbmUgU0lHTl9FWFRFTkRfSFdPUkQoSFdPUkQpIFwKLSAgICAoKEhXT1JEKSAmIDB4ODAwMCA/IChIV09SRCl8KH4weGZmZmZMKSA6IChIV09SRCkpCi0KLS8qIFByb3ZpZGVkIHRoZSBzeW1ib2wsIHJldHVybnMgdGhlIHZhbHVlIHJlZmZlZCAqLwotc3RhdGljIGxvbmcKLWdldF9zeW1ib2xfdmFsdWUgKHN5bWJvbCkgICAgICAgCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICB7Ci0gICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLSAgZWxzZSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWUgKwotICAgICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotICAgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHJldHVybihyZWxvY2F0aW9uKTsKLX0KLQotLyogdGhpcyBmdW5jdGlvbiBpcyBpbiBjaGFyZ2Ugb2YgcGVyZm9ybWluZyBhbGwgdGhlIDI5ayByZWxvY2F0aW9ucyAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hMjlrX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogdGhlIGNvbnN0aCByZWxvY2F0aW9uIGNvbWVzIGluIHR3byBwYXJ0cywgd2UgaGF2ZSB0byByZW1lbWJlcgotICAgICB0aGUgc3RhdGUgYmV0d2VlbiBjYWxscywgaW4gdGhlc2UgdmFyaWFibGVzICovCi0gIHN0YXRpYyBib29sZWFuIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFydDFfY29uc3RoX3ZhbHVlOwotCi0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyBzeW1fdmFsdWU7Ci0gIHVuc2lnbmVkIGxvbmcgdW5zaWduZWRfdmFsdWU7Ci0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKLSAgbG9uZyBzaWduZWRfdmFsdWU7Ci0KLSAgdW5zaWduZWQgbG9uZyBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3MgOyAvKisgaW5wdXRfc2VjdGlvbi0+dm1hKi8KLSAgYmZkX2J5dGUgICpoaXRfZGF0YSA9YWRkciArIChiZmRfYnl0ZSAqKShkYXRhKTsKLQkKLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkKSB7Ci0gICAgLyogUGFydGlhbCBsaW5raW5nIC0gZG8gbm90aGluZyAqLwotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICB9Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gIHsKLSAgICAvKiBLZWVwIHRoZSBzdGF0ZSBtYWNoaW5lIGhhcHB5IGluIGNhc2Ugd2UncmUgY2FsbGVkIGFnYWluICovCi0gICAgaWYgKHJfdHlwZSA9PSBSX0lISUhBTEYpIAotICAgIHsKLSAgICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSB0cnVlOwotICAgICAgcGFydDFfY29uc3RoX3ZhbHVlICA9IDA7Ci0gICAgfQotICAgIHJldHVybihiZmRfcmVsb2NfdW5kZWZpbmVkKTsKLSAgfQotCi0gIGlmICgocGFydDFfY29uc3RoX2FjdGl2ZSkgJiYgKHJfdHlwZSAhPSBSX0lIQ09OU1QpKSAKLSAgewotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIk1pc3NpbmcgSUhDT05TVCIpOwotICAgIHJldHVybihiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKLSAgfQotCi0KLSAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZShzeW1ib2xfaW4pOwotCi0gIHN3aXRjaCAocl90eXBlKSAKLSAgewotICAgY2FzZSBSX0lSRUw6IAkKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIC8qIFRha2UgdGhlIHZhbHVlIGluIHRoZSBmaWVsZCBhbmQgc2lnbiBleHRlbmQgaXQgKi8KLSAgICBzaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEKGluc24pOwotICAgIHNpZ25lZF92YWx1ZSA9IFNJR05fRVhURU5EX0hXT1JEKHNpZ25lZF92YWx1ZSk7Ci0gICAgc2lnbmVkX3ZhbHVlIDw8PSAyOwotCi0gICAgLyogU2VlIHRoZSBub3RlIG9uIHRoZSBSX0lSRUwgcmVsb2MgaW4gY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotICAgIGlmIChzaWduZWRfdmFsdWUgPT0gLSAobG9uZykgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0gICAgICBzaWduZWRfdmFsdWUgPSAwOwotCi0gICAgc2lnbmVkX3ZhbHVlICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgaWYgKChzaWduZWRfdmFsdWUgJiB+MHgzZmZmZikgPT0gMCkKLSAgICB7CQkJCS8qIEFic29sdXRlIGptcC9jYWxsICovCi0gICAgICBpbnNuIHw9ICgxPDwyNCk7CQkvKiBNYWtlIGl0IGFic29sdXRlICovCi0gICAgICAvKiBGSVhNRTogU2hvdWxkIHdlIGNoYW5nZSByX3R5cGUgdG8gUl9JQUJTICovCi0gICAgfSAKLSAgICBlbHNlIAotICAgIHsKLSAgICAgIC8qIFJlbGF0aXZlIGptcC9jYWxsLCBzbyBzdWJ0cmFjdCBmcm9tIHRoZSB2YWx1ZSB0aGUKLQkgYWRkcmVzcyBvZiB0aGUgcGxhY2Ugd2UncmUgY29taW5nIGZyb20gKi8KLSAgICAgIHNpZ25lZF92YWx1ZSAtPSAocmVsb2NfZW50cnktPmFkZHJlc3MKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChzaWduZWRfdmFsdWU+MHgxZmZmZiB8fCBzaWduZWRfdmFsdWU8LTB4MjAwMDApIAotICAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIH0KLSAgICBzaWduZWRfdmFsdWUgPj49IDI7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCBzaWduZWRfdmFsdWUpOwotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiAsaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9JTE9IQUxGOiAKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIHVuc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRChpbnNuKTsKLSAgICB1bnNpZ25lZF92YWx1ZSArPSAgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICBpbnNuID0gSU5TRVJUX0hXT1JEKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUhJSEFMRjoKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIC8qIGNvbnN0aCwgcGFydCAxIAotICAgICAgIEp1c3QgZ2V0IHRoZSBzeW1ib2wgdmFsdWUgdGhhdCBpcyByZWZlcmVuY2VkICovCi0gICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IHRydWU7Ci0gICAgcGFydDFfY29uc3RoX3ZhbHVlID0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAvKiBEb24ndCBtb2RpZnkgaW5zbiB1bnRpbCBSX0lIQ09OU1QgKi8KLSAgICBicmVhazsKLSAgIGNhc2UgUl9JSENPTlNUOgkKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIC8qIGNvbnN0aCwgcGFydCAyIAotICAgICAgIE5vdyByZWxvY2F0ZSB0aGUgcmVmZXJlbmNlICovCi0gICAgaWYgKHBhcnQxX2NvbnN0aF9hY3RpdmUgPT0gZmFsc2UpIHsKLSAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiTWlzc2luZyBJSElIQUxGIik7Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gICAgfQotICAgIC8qIHN5bV9wdHJfcHRyID0gcl9zeW1uZHgsIGluIGNvZmZfc2x1cnBfcmVsb2NfdGFibGUoKSAqLwotICAgIHVuc2lnbmVkX3ZhbHVlID0gMDsJCS8qRVhUUkFDVF9IV09SRChpbnNuKSA8PCAxNjsqLwotICAgIHVuc2lnbmVkX3ZhbHVlICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7IC8qIHJfc3ltbmR4ICovCi0gICAgdW5zaWduZWRfdmFsdWUgKz0gcGFydDFfY29uc3RoX3ZhbHVlOwotICAgIHVuc2lnbmVkX3ZhbHVlID0gdW5zaWduZWRfdmFsdWUgPj4gMTY7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7Ci0gICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOwotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9CWVRFOgotICAgIGluc24gPSBiZmRfZ2V0XzgoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICB1bnNpZ25lZF92YWx1ZSA9IGluc24gKyBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwkKLSAgICBpZiAodW5zaWduZWRfdmFsdWUgJiAweGZmZmZmZjAwKQotICAgICAgcmV0dXJuKGJmZF9yZWxvY19vdmVyZmxvdyk7Ci0gICAgYmZkX3B1dF84KGFiZmQsIHVuc2lnbmVkX3ZhbHVlLCBoaXRfZGF0YSk7IAotICAgIGJyZWFrOwotICAgY2FzZSBSX0hXT1JEOgotICAgIGluc24gPSBiZmRfZ2V0XzE2KGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgdW5zaWduZWRfdmFsdWUgPSBpbnNuICsgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsJCi0gICAgaWYgKHVuc2lnbmVkX3ZhbHVlICYgMHhmZmZmMDAwMCkKLSAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIGJmZF9wdXRfMTYoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9XT1JEOgotICAgIGluc24gPSBiZmRfZ2V0XzMyKGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOyAgCi0gICAgYmZkX3B1dF8zMihhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICplcnJvcl9tZXNzYWdlID0gXygiVW5yZWNvZ25pemVkIHJlbG9jIik7Ci0gICAgcmV0dXJuIChiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKLSAgfQotCi0KLSAgcmV0dXJuKGJmZF9yZWxvY19vayk7CQotfQotCi0vKiAgICAgIHR5cGUJICAgcmlnaHRzaGlmdAotCQkgICAgICAgc2l6ZQotCQkJICBiaXRzaXplCi0JCQkgICAgICAgcGMtcmVsYXRpdmUKLQkJCQkgICAgIGJpdHBvcwotCQkJCQkgYWJzb2x1dGUKLQkJCQkJICAgICBjb21wbGFpbl9vbl9vdmVyZmxvdwotCQkJCQkJICBzcGVjaWFsX2Z1bmN0aW9uCi0JCQkJCQkgICAgcmVsb2NhdGlvbiBuYW1lCi0JCQkJCQkJICAgICAgIHBhcnRpYWxfaW5wbGFjZSAKLQkJCQkJCQkJICAgICAgc3JjX21hc2sKLSovCi0KLS8qRklYTUU6IEknbSBub3QgcmVhbCBzdXJlIGFib3V0IHRoaXMgdGFibGUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAge1JfQUJTLCAgICAgMCwgMywgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxhMjlrX3JlbG9jLCJBQlMiLCAgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZX0sCi0gIEVNUFRZX0hPV1RPICgxKSwKLSAgRU1QVFlfSE9XVE8gKDIpLAotICBFTVBUWV9IT1dUTyAoMyksCi0gIEVNUFRZX0hPV1RPICg0KSwKLSAgRU1QVFlfSE9XVE8gKDUpLAotICBFTVBUWV9IT1dUTyAoNiksCi0gIEVNUFRZX0hPV1RPICg3KSwKLSAgRU1QVFlfSE9XVE8gKDgpLAotICBFTVBUWV9IT1dUTyAoOSksCi0gIEVNUFRZX0hPV1RPICgxMCksCi0gIEVNUFRZX0hPV1RPICgxMSksCi0gIEVNUFRZX0hPV1RPICgxMiksCi0gIEVNUFRZX0hPV1RPICgxMyksCi0gIEVNUFRZX0hPV1RPICgxNCksCi0gIEVNUFRZX0hPV1RPICgxNSksCi0gIEVNUFRZX0hPV1RPICgxNiksCi0gIEVNUFRZX0hPV1RPICgxNyksCi0gIEVNUFRZX0hPV1RPICgxOCksCi0gIEVNUFRZX0hPV1RPICgxOSksCi0gIEVNUFRZX0hPV1RPICgyMCksCi0gIEVNUFRZX0hPV1RPICgyMSksCi0gIEVNUFRZX0hPV1RPICgyMiksCi0gIEVNUFRZX0hPV1RPICgyMyksCi0gIHtSX0lSRUwsICAgIDAsIDMsIDMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLGEyOWtfcmVsb2MsIklSRUwiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge1JfSUFCUywgICAgMCwgMywgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiSUFCUyIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotICB7Ul9JTE9IQUxGLCAwLCAzLCAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgYTI5a19yZWxvYywiSUxPSEFMRiIsIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7Ul9JSElIQUxGLCAwLCAzLCAxNiwgdHJ1ZSwgIDE2LCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklISUhBTEYiLCB0cnVlLCAweGZmZmYwMDAwLDB4ZmZmZjAwMDAsIGZhbHNlfSwKLSAge1JfSUhDT05TVCwgMCwgMywgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklIQ09OU1QiLCB0cnVlLCAweGZmZmYwMDAwLDB4ZmZmZjAwMDAsIGZhbHNlfSwKLSAge1JfQllURSwgICAgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBhMjlrX3JlbG9jLCJCWVRFIiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZX0sCi0gIHtSX0hXT1JELCAgIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIkhXT1JEIiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge1JfV09SRCwgICAgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiV09SRCIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotfTsKLQotI2RlZmluZSBCQURNQUcoeCkgQTI5S0JBRE1BRyh4KQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCxyZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgICBzdGF0aWMgYmZkX3ZtYSBpaGloYWxmX3ZhZGRyID0gKGJmZF92bWEpIC0xOwotCi0gICAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7CQkKLSAgICByZWxlbnQtPmhvd3RvID0gaG93dG9fdGFibGUgKyByZWxvYy0+cl90eXBlOwotICAgIGlmIChyZWxvYy0+cl90eXBlID09IFJfSUhDT05TVCkgCi0gICAgewkJCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBSX0lIQ09OU1Qgc2hvdWxkIGFsd2F5cyBiZSB0aGUgYWRkcmVzcyBvZgotCSB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIFJfSUhJSEFMRi4gIHJlbG9jcyBnZW5lcmF0ZWQgYnkgZ2FzCi0JIGFyZSBjb3JyZWN0LCBidXQgcmVsb2NzIGdlbmVyYXRlZCBieSBIaWdoIEMgYXJlIGRpZmZlcmVudCAoSQotCSBjYW4ndCBmaWd1cmUgb3V0IHdoYXQgdGhlIGFkZHJlc3MgbWVhbnMgZm9yIEhpZ2ggQykuICBXZSBjYW4KLQkgaGFuZGxlIGJvdGggZ2FzIGFuZCBIaWdoIEMgYnkgaWdub3JpbmcgdGhlIGFkZHJlc3MgaGVyZSwgYW5kCi0JIHNpbXBseSByZXVzaW5nIHRoZSBhZGRyZXNzIHNhdmVkIGZvciBSX0lISUhBTEYuICAqLwotICAgICAgICBpZiAoaWhpaGFsZl92YWRkciA9PSAoYmZkX3ZtYSkgLTEpCi0JICBhYm9ydCAoKTsKLQlyZWxlbnQtPmFkZHJlc3MgPSBpaGloYWxmX3ZhZGRyOwotCWloaWhhbGZfdmFkZHIgPSAoYmZkX3ZtYSkgLTE7Ci0JcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9zeW1uZHg7CQkKLQlyZWxlbnQtPnN5bV9wdHJfcHRyPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwdHI7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0KGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0KLSAgICAgIHB0ciA9ICoocmVsZW50LT5zeW1fcHRyX3B0cik7Ci0KLSAgICAgIGlmIChwdHIgCi0JICAmJiBiZmRfYXN5bWJvbF9iZmQocHRyKSA9PSBhYmZkCQkKLQotCSAgJiYgKChwdHItPmZsYWdzICYgQlNGX09MRF9DT01NT04pPT0gMCkpCQotICAgICAgewkJCQkJCQotCSAgcmVsZW50LT5hZGRlbmQgPSAwOwotICAgICAgfQkJCQkJCQotICAgICAgZWxzZQotICAgICAgewkJCQkJCi0JICByZWxlbnQtPmFkZGVuZCA9IDA7CQkJCi0gICAgICB9CQkJCi0gICAgICByZWxlbnQtPmFkZHJlc3MtPSBzZWN0aW9uLT52bWE7Ci0gICAgICBpZiAocmVsb2MtPnJfdHlwZSA9PSBSX0lISUhBTEYpCi0JaWhpaGFsZl92YWRkciA9IHJlbGVudC0+YWRkcmVzczsKLSAgICAgIGVsc2UgaWYgKGloaWhhbGZfdmFkZHIgIT0gKGJmZF92bWEpIC0xKQotCWFib3J0ICgpOwotICB9Ci19Ci0KLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLQotICAvKiBJZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGEKLSAgICAgdGhpbmcuICBUaGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkanVzdGluZyB0aGUgcmVsb2MKLSAgICAgYWRkcmVzc2VzIGFuZCBzeW1ib2wgaW5kaWNlcy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaGloYWxmID0gZmFsc2U7Ci0gIGhpaGFsZl92YWwgPSAwOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgYmZkX2J5dGUgKmxvYzsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0gICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgICBsb25nIHNpZ25lZF92YWx1ZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdW5zaWduZWRfdmFsdWU7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0gICAgICBsb2MgPSBjb250ZW50cyArIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSB8fCByZWwtPnJfdHlwZSA9PSBSX0lIQ09OU1QpCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICB2YWwgPSAwOwotCi0gICAgICAvKiBBbiBSX0lIQ09OU1QgcmVsb2MgZG9lcyBub3QgaGF2ZSBhIHN5bWJvbC4gIEluc3RlYWQsIHRoZQotICAgICAgICAgc3ltYm9sIGluZGV4IGlzIGFuIGFkZGVuZC4gIFJfSUhDT05TVCBpcyBhbHdheXMgdXNlZCBpbgotICAgICAgICAgY29uanVuY3Rpb24gd2l0aCBSX0lISEFMRi4gICovCi0gICAgICBpZiAocmVsLT5yX3R5cGUgIT0gUl9JSENPTlNUKQotCXsKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc3ltbmR4ID09IC0xKQotCQlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JCSAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLQkJICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIHN5bS0+bl92YWx1ZQotCQkJIC0gc2VjLT52bWEpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJewotCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwgdHJ1ZSkpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGhpaGFsZikKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkgICAgIChpbmZvLCBfKCJtaXNzaW5nIElIQ09OU1QgcmVsb2MiKSwgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGhpaGFsZiA9IGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBvdmVyZmxvdyA9IGZhbHNlOwotCi0gICAgICBzd2l0Y2ggKHJlbC0+cl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0KLQljYXNlIFJfSVJFTDoKLQkgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvYyk7Ci0KLQkgIC8qIEV4dHJhY3QgdGhlIGFkZGVuZC4gICovCi0JICBzaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEIChpbnNuKTsKLQkgIHNpZ25lZF92YWx1ZSA9IFNJR05fRVhURU5EX0hXT1JEIChzaWduZWRfdmFsdWUpOwotCSAgc2lnbmVkX3ZhbHVlIDw8PSAyOwotCi0JICAvKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBDT0ZGCi0JICAgICBhMjlrLiAgSW4gdGhlIG9yaWdpbmFsIEFNRCB2ZXJzaW9uLCB0aGUgdmFsdWUgc3RvcmVkIGluCi0JICAgICB0aGUgZmllbGQgZm9yIHRoZSBSX0lSRUwgcmVsb2MgaXMgYSBzaW1wbGUgYWRkZW5kLiAgSW4KLQkgICAgIHRoZSBHTlUgdmVyc2lvbiwgdGhlIHZhbHVlIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgYWRkcmVzcwotCSAgICAgb2YgdGhlIHJlbG9jIHdpdGhpbiBzZWN0aW9uLiAgV2UgdHJ5IHRvIGNvcGUgaGVyZSBieQotCSAgICAgYXNzdW1pbmcgdGhlIEFNRCB2ZXJzaW9uLCB1bmxlc3MgdGhlIGFkZGVuZCBpcyBleGFjdGx5Ci0JICAgICB0aGUgbmVnYXRpdmUgb2YgdGhlIGFkZHJlc3M7IGluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBhc3N1bWUKLQkgICAgIHRoZSBHTlUgdmVyc2lvbi4gIFRoaXMgbWVhbnMgdGhhdCBzb21ldGhpbmcgbGlrZQotCSAgICAgICAgIC50ZXh0Ci0JCSBub3AKLQkJIGptcCBpLTQKLQkgICAgIHdpbGwgZmFpbCwgYmVjYXVzZSB0aGUgYWRkZW5kIG9mIC00IHdpbGwgaGFwcGVuIHRvIGVxdWFsCi0JICAgICB0aGUgbmVnYXRpdmUgb2YgdGhlIGFkZHJlc3Mgd2l0aGluIHRoZSBzZWN0aW9uLiAgVGhlCi0JICAgICBjb21waWxlciB3aWxsIG5ldmVyIGdlbmVyYXRlIGNvZGUgbGlrZSB0aGlzLgotCi0JICAgICBBdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgd2UgbWF5IHdhbnQgdG8gdGFrZSBvdXQgdGhpcwotCSAgICAgY2hlY2suICAqLwotCi0JICBpZiAoc2lnbmVkX3ZhbHVlID09IC0gKGxvbmcpIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKQotCSAgICBzaWduZWRfdmFsdWUgPSAwOwotCi0JICAvKiBEZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBqdW1wLiAgKi8KLQkgIHNpZ25lZF92YWx1ZSArPSB2YWw7Ci0KLQkgIGlmICgoc2lnbmVkX3ZhbHVlICYgfjB4M2ZmZmYpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4gdXNlIGFuIGFic29sdXRlIGp1bXAuICAqLwotCSAgICAgIGluc24gfD0gKDEgPDwgMjQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBNYWtlIHRoZSBkZXN0aW5hdGlvbiBQQyByZWxhdGl2ZS4gICovCi0JICAgICAgc2lnbmVkX3ZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICAgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7Ci0JICAgICAgaWYgKHNpZ25lZF92YWx1ZSA+IDB4MWZmZmYgfHwgc2lnbmVkX3ZhbHVlIDwgLSAweDIwMDAwKQotCQl7Ci0JCSAgb3ZlcmZsb3cgPSB0cnVlOwotCQkgIHNpZ25lZF92YWx1ZSA9IDA7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBQdXQgdGhlIGFkanVzdGVkIHZhbHVlIGJhY2sgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgc2lnbmVkX3ZhbHVlID4+PSAyOwotCSAgaW5zbiA9IElOU0VSVF9IV09SRCAoaW5zbiwgc2lnbmVkX3ZhbHVlKTsKLQotCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbiwgbG9jKTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUxPSEFMRjoKLQkgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvYyk7Ci0JICB1bnNpZ25lZF92YWx1ZSA9IEVYVFJBQ1RfSFdPUkQgKGluc24pOwotCSAgdW5zaWduZWRfdmFsdWUgKz0gdmFsOwotCSAgaW5zbiA9IElOU0VSVF9IV09SRCAoaW5zbiwgdW5zaWduZWRfdmFsdWUpOwotCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBsb2MpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUhJSEFMRjoKLQkgIC8qIFNhdmUgdGhlIHZhbHVlIGZvciB0aGUgUl9JSENPTlNUIHJlbG9jLiAgKi8KLQkgIGhpaGFsZiA9IHRydWU7Ci0JICBoaWhhbGZfdmFsID0gdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfSUhDT05TVDoKLQkgIGlmICghIGhpaGFsZikKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkgICAgIChpbmZvLCBfKCJtaXNzaW5nIElISUhBTEYgcmVsb2MiKSwgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGhpaGFsZl92YWwgPSAwOwotCSAgICB9Ci0KLQkgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvYyk7Ci0JICB1bnNpZ25lZF92YWx1ZSA9IHJlbC0+cl9zeW1uZHggKyBoaWhhbGZfdmFsOwotCSAgdW5zaWduZWRfdmFsdWUgPj49IDE2OwotCSAgaW5zbiA9IElOU0VSVF9IV09SRCAoaW5zbiwgdW5zaWduZWRfdmFsdWUpOwotCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbiwgbG9jKTsKLQotCSAgaGloYWxmID0gZmFsc2U7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0JZVEU6Ci0JY2FzZSBSX0hXT1JEOgotCWNhc2UgUl9XT1JEOgotCSAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0b190YWJsZSArIHJlbC0+cl90eXBlLAotCQkJCQkgIGlucHV0X2JmZCwgdmFsLCBsb2MpOwotCSAgaWYgKHJzdGF0ID09IGJmZF9yZWxvY19vdmVyZmxvdykKLQkgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgZWxzZSBpZiAocnN0YXQgIT0gYmZkX3JlbG9jX29rKQotCSAgICBhYm9ydCAoKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKG92ZXJmbG93KQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICBuYW1lID0gIipBQlMqIjsKLQkgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlIGlmIChzeW0gPT0gTlVMTCkKLQkgICAgbmFtZSA9ICIqdW5rbm93bioiOwotCSAgZWxzZSBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JCSAgICYmIHN5bS0+X24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgbmFtZSA9IG9ial9jb2ZmX3N0cmluZ3MgKGlucHV0X2JmZCkgKyBzeW0tPl9uLl9uX24uX25fb2Zmc2V0OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RybmNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLQkgICAgICBidWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkgICAgICBuYW1lID0gYnVmOwotCSAgICB9Ci0KLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywgbmFtZSwgaG93dG9fdGFibGVbcmVsLT5yX3R5cGVdLm5hbWUsIChiZmRfdm1hKSAwLAotCQkgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9ICAgICAKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24KLQotLyogV2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIHN5bW5keCBvZiBhIFJfSUhDT05TVCByZWxvYywgc2luY2UgaXQKLSAgIGlzIGFjdHVhbGx5IGFuIGFkZGVuZCwgbm90IGEgc3ltYm9sIGluZGV4IGF0IGFsbC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4IChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIGlyZWwsIGFkanVzdGVkcCkKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwOwotewotICBpZiAoaXJlbC0+cl90eXBlID09IFJfSUhDT05TVCkKLSAgICAqYWRqdXN0ZWRwID0gdHJ1ZTsKLSAgZWxzZQotICAgICphZGp1c3RlZHAgPSBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4IGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4Ci0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoYTI5a2NvZmZfYmlnX3ZlYywgImNvZmYtYTI5ay1iaWciLCAwLCBTRUNfUkVBRE9OTFksICdfJywgTlVMTCkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWFscGhhLmMgYi9iZmQvY29mZi1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJjMjc5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDA1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQUxQSEEgRXh0ZW5kZWQtQ29mZiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBNb2RpZmllZCBmcm9tIGNvZmYtbWlwcy5jIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4gYW5kCi0gICBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImNvZmYvYWxwaGEuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi0vKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmFscGhhX2Vjb2ZmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhbHBoYV9lY29mZl9iYWRfZm9ybWF0X2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZWhkcikpOwotc3RhdGljIFBUUiBhbHBoYV9lY29mZl9ta29iamVjdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZWhkciwgUFRSIGFvdXRoZHIpKTsKLXN0YXRpYyB2b2lkIGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLXN0YXRpYyB2b2lkIGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSAgICAgICBQVFIpKTsKLXN0YXRpYyB2b2lkIGFscGhhX2FkanVzdF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSAgIGFyZWxlbnQgKikpOwotc3RhdGljIHZvaWQgYWxwaGFfYWRqdXN0X3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgYXJlbGVudCAqLAotCQkJCQkgICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICphbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKmFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICpkYXRhLCBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyBiZmRfdm1hIGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgIGJmZF9ieXRlICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gYWxwaGFfYWRqdXN0X2hlYWRlcnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICosIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopKTsKLXN0YXRpYyBQVFIgYWxwaGFfZWNvZmZfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmQgKmFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIpKTsKLXN0YXRpYyBiZmQgKmFscGhhX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBiZmQgKmFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci0MCi0vKiBFQ09GRiBoYXMgQ09GRiBzZWN0aW9ucywgYnV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluCi0gICBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZvcm1hdC4gIEVDT0ZGIHRhcmdldHMgdXNlIHNvbWUgb2YgdGhlCi0gICBzd2FwcGluZyByb3V0aW5lcyBmcm9tIGNvZmZzd2FwLmgsIGFuZCBzb21lIG9mIHRoZSBnZW5lcmljIENPRkYKLSAgIHJvdXRpbmVzIGluIGNvZmZnZW4uYywgYnV0LCB1bmxpa2UgdGhlIHJlYWwgQ09GRiB0YXJnZXRzLCBkbyBub3QKLSAgIHVzZSBjb2ZmY29kZS5oIGl0c2VsZi4KLQotICAgR2V0IHRoZSBnZW5lcmljIENPRkYgc3dhcHBpbmcgcm91dGluZXMsIGV4Y2VwdCBmb3IgdGhlIHJlbG9jLAotICAgc3ltYm9sLCBhbmQgbGluZW5vIG9uZXMuICBHaXZlIHRoZW0gZWNvZmYgbmFtZXMuICBEZWZpbmUgc29tZQotICAgYWNjZXNzb3IgbWFjcm9zIGZvciB0aGUgbGFyZ2Ugc2l6ZXMgdXNlZCBmb3IgQWxwaGEgRUNPRkYuICAqLwotCi0jZGVmaW5lIEdFVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9UU0laRSBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfVFNJWkUgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX0RTSVpFIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9EU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfQlNJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX0JTSVpFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRU5UUlkgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfUEFERFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfUEFERFIgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfVkFERFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfVkFERFIgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfU0laRSBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9TSVpFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1NDTlBUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9TQ05QVFIgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfUkVMUFRSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1JFTFBUUiBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfcHV0XzY0Ci0KLSNkZWZpbmUgQUxQSEFFQ09GRgotCi0jZGVmaW5lIE5PX0NPRkZfUkVMT0NTCi0jZGVmaW5lIE5PX0NPRkZfU1lNQk9MUwotI2RlZmluZSBOT19DT0ZGX0xJTkVOT1MKLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfaW4gYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX2luCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX291dCBhbHBoYV9lY29mZl9zd2FwX2ZpbGVoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX2luIGFscGhhX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX2luIGFscGhhX2Vjb2ZmX3N3YXBfc2NuaGRyX2luCi0jZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfb3V0IGFscGhhX2Vjb2ZmX3N3YXBfc2NuaGRyX291dAotI2luY2x1ZGUgImNvZmZzd2FwLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2RlZmluZSBFQ09GRl82NAotI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgotDAotLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2MgdHlwZXMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yZWxvY19uaWwgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCSAgIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJlbG9jX25pbCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFJlbG9jIHR5cGUgMCBpcyBpZ25vcmVkIGJ5IGl0c2VsZi4gIEhvd2V2ZXIsIGl0IGFwcGVhcnMgYWZ0ZXIgYQotICAgICBHUERJU1AgcmVsb2MgdG8gaWRlbnRpZnkgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBsb3cgb3JkZXIgMTYgYml0cwotICAgICBvZiB0aGUgZ3AgcmVnaXN0ZXIgYXJlIGxvYWRlZC4gICovCi0gIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRkxPTkcsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGUVVBRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgR1AgcmVsYXRpdmUgb2Zmc2V0LiAgVGhpcyBpcyBqdXN0IGxpa2UgUkVGTE9ORyBleGNlcHQKLSAgICAgdGhhdCB3aGVuIHRoZSB2YWx1ZSBpcyB1c2VkIHRoZSB2YWx1ZSBvZiB0aGUgZ3AgcmVnaXN0ZXIgd2lsbCBiZQotICAgICBhZGRlZCBpbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUwzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVXNlZCBmb3IgYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZWZlcnMgdG8gbWVtb3J5IG9mZiB0aGUgR1AKLSAgICAgcmVnaXN0ZXIuICBUaGUgb2Zmc2V0IGlzIDE2IGJpdHMgb2YgdGhlIDMyIGJpdCBpbnN0cnVjdGlvbi4gIFRoaXMKLSAgICAgcmVsb2MgYWx3YXlzIHNlZW1zIHRvIGJlIGFnYWluc3QgdGhlIC5saXRhIHNlY3Rpb24uICAqLwotICBIT1dUTyAoQUxQSEFfUl9MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRFUkFMIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBvbmx5IGFwcGVhcnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGEgTElURVJBTCByZWxvYy4KLSAgICAgSXQgaWRlbnRpZmllcyBhIHVzZSBvZiB0aGUgbGl0ZXJhbC4gIEl0IHNlZW1zIHRoYXQgdGhlIGxpbmtlciBjYW4KLSAgICAgdXNlIHRoaXMgdG8gZWxpbWluYXRlIGEgcG9ydGlvbiBvZiB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoZSBzeW1ib2wKLSAgICAgaW5kZXggaXMgc3BlY2lhbDogMSBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSBiYXNlCi0gICAgIHJlZ2lzdGVyIG9mIGEgbWVtb3J5IGZvcm1hdCBpbnN0cnVjdGlvbjsgMiBtZWFucyB0aGUgbGl0ZXJhbAotICAgICBhZGRyZXNzIGlzIGluIHRoZSBieXRlIG9mZnNldCByZWdpc3RlciBvZiBhIGJ5dGUtbWFuaXB1bGF0aW9uCi0gICAgIGluc3RydWN0aW9uOyAzIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIHRhcmdldAotICAgICByZWdpc3RlciBvZiBhIGpzciBpbnN0cnVjdGlvbi4gIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgZG8gYW55Ci0gICAgIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoQUxQSEFfUl9MSVRVU0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElUVVNFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb2FkIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgaXMgYWx3YXlzIHVzZWQgZm9yIGEgbGRhaCBpbnN0cnVjdGlvbgotICAgICB3aGljaCBsb2FkcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgZ3AgcmVnaXN0ZXIuICBUaGUgbmV4dCByZWxvYwotICAgICB3aWxsIGJlIGFuIElHTk9SRSByZWxvYyB3aGljaCBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGRhCi0gICAgIGluc3RydWN0aW9uIHdoaWNoIGxvYWRzIHRoZSBsb3dlciAxNiBiaXRzLiAgVGhlIHN5bWJvbCBpbmRleCBvZgotICAgICB0aGUgR1BESVNQIGluc3RydWN0aW9uIGFwcGVhcnMgdG8gYWN0dWFsbHkgYmUgdGhlIG51bWJlciBvZiBieXRlcwotICAgICBiZXR3ZWVuIHRoZSBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBnaXZlcyB0d28gZGlmZmVyZW50Ci0gICAgIHdheXMgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBsZGEgaW5zdHJ1Y3Rpb24gaXM7IEkgZG9uJ3Qga25vdyB3aHkKLSAgICAgYm90aCBhcmUgdXNlZC4gIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSByZWxvY2F0aW9uIGlzIHRoZQotICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdQIHZhbHVlIGFuZCB0aGUgY3VycmVudCBsb2NhdGlvbjsgdGhlCi0gICAgIGxvYWQgd2lsbCBhbHdheXMgYmUgZG9uZSBhZ2FpbnN0IGEgcmVnaXN0ZXIgaG9sZGluZyB0aGUgY3VycmVudAotICAgICBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfR1BESVNQLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQRElTUCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjEgYml0IGJyYW5jaC4gIFRoZSBuYXRpdmUgYXNzZW1ibGVyIGdlbmVyYXRlcyB0aGVzZSBmb3IKLSAgICAgYnJhbmNoZXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFuZCBhbHNvIGZpbGxzIGluIHRoZSBQQwotICAgICByZWxhdGl2ZSBvZmZzZXQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfQlJBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkJSQUREUiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIGhpbnQgZm9yIGEganVtcCB0byBhIHJlZ2lzdGVyLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfSElOVCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMNjQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFVTSCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAgU3RvcmUgaXQgaW4KLSAgICAgYSBiaXRmaWVsZCBvZiBzaXplIHJfc2l6ZSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gcl9vZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9TVE9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1NUT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3VidHJhY3QgdGhlIHJlbG9jIGFkZHJlc3MgZnJvbSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BTVUIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BSU0hJRlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFkanVzdCB0aGUgR1AgdmFsdWUgZm9yIGEgbmV3IHJhbmdlIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQVkFMVUUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQVkFMVUUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIFJlY29nbml6ZSBhbiBBbHBoYSBFQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYWxwaGFfZWNvZmZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnJldDsKLQotICByZXQgPSBjb2ZmX29iamVjdF9wIChhYmZkKTsKLQotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgLyogQWxwaGEgRUNPRkYgaGFzIGEgLnBkYXRhIHNlY3Rpb24uICBUaGUgbG5ub3B0ciBmaWVsZCBvZiB0aGUKLQkgLnBkYXRhIHNlY3Rpb24gaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGl0IGNvbnRhaW5zLiAgRWFjaAotCSBlbnRyeSB0YWtlcyB1cCA4IGJ5dGVzLiAgVGhlIG51bWJlciBvZiBlbnRyaWVzIGlzIHJlcXVpcmVkCi0JIHNpbmNlIHRoZSBzZWN0aW9uIGlzIGFsaWduZWQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LiAgV2hlbiB3ZQotCSBsaW5rIC5wZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgd2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSB0aGUKLQkgYWxpZ25tZW50IGJ5dGVzLiAgV2UgaGFuZGxlIHRoaXMgb24gaW5wdXQgYnkgZmFraW5nIHRoZSBzaXplCi0JIG9mIHRoZSAucGRhdGEgc2VjdGlvbiB0byByZW1vdmUgdGhlIHVud2FudGVkIGFsaWdubWVudCBieXRlcy4KLQkgT24gb3V0cHV0IHdlIHdpbGwgc2V0IHRoZSBsbm5vcHRyIGZpZWxkIGFuZCBmb3JjZSB0aGUKLQkgYWxpZ25tZW50LiAgKi8KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBfUERBVEEpOwotICAgICAgaWYgKHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLQkgIHNpemUgPSBzZWMtPmxpbmVfZmlsZXBvcyAqIDg7Ci0JICBCRkRfQVNTRVJUIChzaXplID09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykKLQkJICAgICAgfHwgc2l6ZSArIDggPT0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSk7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBzaXplKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBTZWUgd2hldGhlciB0aGUgbWFnaWMgbnVtYmVyIG1hdGNoZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWxwaGFfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gIGlmIChBTFBIQV9FQ09GRl9CQURNQUcgKCppbnRlcm5hbF9mKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSBob29rIGNhbGxlZCBieSBjb2ZmX3JlYWxfb2JqZWN0X3AgdG8gY3JlYXRlIGFueSBiYWNrZW5kCi0gICBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBQVFIKLWFscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci0gICAgIFBUUiBhb3V0aGRyOwotewotICBQVFIgZWNvZmY7Ci0KLSAgZWNvZmYgPSBfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpOwotCi0gIGlmIChlY29mZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgICAgIC8qIFNldCBhZGRpdGlvbmFsIEJGRCBmbGFncyBhY2NvcmRpbmcgdG8gdGhlIG9iamVjdCB0eXBlIGZyb20gdGhlCi0JIG1hY2hpbmUgc3BlY2lmaWMgZmlsZSBoZWFkZXIgZmxhZ3MuICAqLwotICAgICAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9BTFBIQV9PQkpFQ1RfVFlQRV9NQVNLKQotCXsKLQljYXNlIEZfQUxQSEFfU0hBUkFCTEU6Ci0JICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCSAgYnJlYWs7Ci0JY2FzZSBGX0FMUEhBX0NBTExfU0hBUkVEOgotCSAgLyogQWx3YXlzIGV4ZWN1dGFibGUgaWYgdXNpbmcgc2hhcmVkIGxpYnJhcmllcyBhcyB0aGUgcnVuIHRpbWUKLQkgICAgIGxvYWRlciBtaWdodCByZXNvbHZlIHVuZGVmaW5lZCByZWZlcmVuY2VzLiAgKi8KLQkgIGFiZmQtPmZsYWdzIHw9IChEWU5BTUlDIHwgRVhFQ19QKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBlY29mZjsKLX0KLQwKLS8qIFJlbG9jIGhhbmRsaW5nLiAgKi8KLQotLyogU3dhcCBhIHJlbG9jIGluLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIGV4dF9wdHIsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci17Ci0gIGNvbnN0IFJFTE9DICpleHQgPSAoUkVMT0MgKikgZXh0X3B0cjsKLQotICBpbnRlcm4tPnJfdmFkZHIgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnJfdmFkZHIpOwotICBpbnRlcm4tPnJfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5yX3N5bW5keCk7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7Ci0KLSAgaW50ZXJuLT5yX3R5cGUgPSAoKGV4dC0+cl9iaXRzWzBdICYgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUpCi0JCSAgICA+PiBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRSk7Ci0gIGludGVybi0+cl9leHRlcm4gPSAoZXh0LT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFKSAhPSAwOwotICBpbnRlcm4tPnJfb2Zmc2V0ID0gKChleHQtPnJfYml0c1sxXSAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpCi0JCSAgICAgID4+IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpOwotICAvKiBJZ25vcmVkIHRoZSByZXNlcnZlZCBiaXRzLiAgKi8KLSAgaW50ZXJuLT5yX3NpemUgPSAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpCi0JCSAgICA+PiBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSk7Ci0KLSAgaWYgKGludGVybi0+cl90eXBlID09IEFMUEhBX1JfTElUVVNFCi0gICAgICB8fCBpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0dQRElTUCkKLSAgICB7Ci0gICAgICAvKiBIYW5kbGUgdGhlIExJVFVTRSBhbmQgR1BESVNQIHJlbG9jcyBzcGVjaWFsbHkuICBJdHMgc3ltbmR4Ci0JIHZhbHVlIGlzIG5vdCBhY3R1YWxseSBhIHN5bWJvbCBpbmRleCwgYnV0IGlzIGluc3RlYWQgYQotCSBzcGVjaWFsIGNvZGUuICBXZSBwdXQgdGhlIGNvZGUgaW4gdGhlIHJfc2l6ZSBmaWVsZCwgYW5kCi0JIGNsb2JiZXIgdGhlIHN5bW5keC4gICovCi0gICAgICBpZiAoaW50ZXJuLT5yX3NpemUgIT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIGludGVybi0+cl9zaXplID0gaW50ZXJuLT5yX3N5bW5keDsKLSAgICAgIGludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX05PTkU7Ci0gICAgfQotICBlbHNlIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0lHTk9SRSkKLSAgICB7Ci0gICAgICAvKiBUaGUgSUdOT1JFIHJlbG9jIGdlbmVyYWxseSBmb2xsb3dzIGEgR1BESVNQIHJlbG9jLCBhbmQgaXMKLQkgYWdhaW5zdCB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoZSBzZWN0aW9uIGlzIGlycmVsZXZhbnQuICAqLwotICAgICAgaWYgKCEgaW50ZXJuLT5yX2V4dGVybiAmJgotCSAgaW50ZXJuLT5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX0FCUykKLQlhYm9ydCAoKTsKLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4gJiYgaW50ZXJuLT5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX0xJVEEpCi0JaW50ZXJuLT5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQUJTOwotICAgIH0KLX0KLQotLyogU3dhcCBhIHJlbG9jIG91dC4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgaW50ZXJuLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIFJFTE9DICpleHQgPSAoUkVMT0MgKikgZHN0OwotICBsb25nIHN5bW5keDsKLSAgdW5zaWduZWQgY2hhciBzaXplOwotCi0gIC8qIFVuZG8gdGhlIGhhY2tlcnkgZG9uZSBpbiBzd2FwX3JlbG9jX2luLiAgKi8KLSAgaWYgKGludGVybi0+cl90eXBlID09IEFMUEhBX1JfTElUVVNFCi0gICAgICB8fCBpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0dQRElTUCkKLSAgICB7Ci0gICAgICBzeW1uZHggPSBpbnRlcm4tPnJfc2l6ZTsKLSAgICAgIHNpemUgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9JR05PUkUKLQkgICAmJiAhIGludGVybi0+cl9leHRlcm4KLQkgICAmJiBpbnRlcm4tPnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fQUJTKQotICAgIHsKLSAgICAgIHN5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUQTsKLSAgICAgIHNpemUgPSBpbnRlcm4tPnJfc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1uZHggPSBpbnRlcm4tPnJfc3ltbmR4OwotICAgICAgc2l6ZSA9IGludGVybi0+cl9zaXplOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfZXh0ZXJuCi0JICAgICAgfHwgKGludGVybi0+cl9zeW1uZHggPj0gMCAmJiBpbnRlcm4tPnJfc3ltbmR4IDw9IDE0KSk7Ci0KLSAgYmZkX2hfcHV0XzY0IChhYmZkLCBpbnRlcm4tPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSBleHQtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHN5bW5keCwgKGJmZF9ieXRlICopIGV4dC0+cl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOwotCi0gIGV4dC0+cl9iaXRzWzBdID0gKChpbnRlcm4tPnJfdHlwZSA8PCBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRSkKLQkJICAgICYgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUpOwotICBleHQtPnJfYml0c1sxXSA9ICgoaW50ZXJuLT5yX2V4dGVybiA/IFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUgOiAwKQotCQkgICAgfCAoKGludGVybi0+cl9vZmZzZXQgPDwgUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRSkKLQkJICAgICAgICYgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRSkpOwotICBleHQtPnJfYml0c1syXSA9IDA7Ci0gIGV4dC0+cl9iaXRzWzNdID0gKChzaXplIDw8IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKQotCQkgICAgJiBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRSk7Ci19Ci0KLS8qIEZpbmlzaCBjYW5vbmljYWxpemluZyBhIHJlbG9jLiAgUGFydCBvZiB0aGlzIGlzIGdlbmVyaWMgdG8gYWxsCi0gICBFQ09GRiB0YXJnZXRzLCBhbmQgdGhhdCBwYXJ0IGlzIGluIGVjb2ZmLmMuICBUaGUgcmVzdCBpcyBkb25lIGluCi0gICB0aGlzIGJhY2tlbmQgcm91dGluZS4gIEl0IG11c3QgZmlsbCBpbiB0aGUgaG93dG8gZmllbGQuICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfYWRqdXN0X3JlbG9jX2luIChhYmZkLCBpbnRlcm4sIHJwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci0gICAgIGFyZWxlbnQgKnJwdHI7Ci17Ci0gIGlmIChpbnRlcm4tPnJfdHlwZSA+IEFMUEhBX1JfR1BWQUxVRSkKLSAgICBhYm9ydCAoKTsKLQotICBzd2l0Y2ggKGludGVybi0+cl90eXBlKQotICAgIHsKLSAgICBjYXNlIEFMUEhBX1JfQlJBRERSOgotICAgIGNhc2UgQUxQSEFfUl9TUkVMMTY6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUwzMjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDY0OgotICAgICAgLyogVGhpcyByZWxvY3MgYXBwZWFyIHRvIGJlIGZ1bGx5IHJlc29sdmVkIHdoZW4gdGhleSBhcmUgYWdhaW5zdAotICAgICAgICAgaW50ZXJuYWwgc3ltYm9scy4gIEFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scywgQlJBRERSIGF0IGxlYXN0Ci0gICAgICAgICBhcHBlYXJzIHRvIGJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgaWYgKCEgaW50ZXJuLT5yX2V4dGVybikKLQlycHRyLT5hZGRlbmQgPSAwOwotICAgICAgZWxzZQotCXJwdHItPmFkZGVuZCA9IC0gKGludGVybi0+cl92YWRkciArIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfR1BSRUwzMjoKLSAgICBjYXNlIEFMUEhBX1JfTElURVJBTDoKLSAgICAgIC8qIENvcHkgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlIGludG8gdGhlIGFkZGVuZCwgdG8KLQkgZW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBjb25mdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4pCi0JcnB0ci0+YWRkZW5kICs9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0xJVFVTRToKLSAgICBjYXNlIEFMUEhBX1JfR1BESVNQOgotICAgICAgLyogVGhlIExJVFVTRSBhbmQgR1BESVNQIHJlbG9jcyBkbyBub3QgdXNlIGEgc3ltYm9sLCBvciBhbgotCSBhZGRlbmQsIGJ1dCB0aGV5IGRvIHVzZSBhIHNwZWNpYWwgY29kZS4gIFB1dCB0aGlzIGNvZGUgaW4gdGhlCi0JIGFkZGVuZCBmaWVsZC4gICovCi0gICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1NUT1JFOgotICAgICAgLyogVGhlIFNUT1JFIHJlbG9jIG5lZWRzIHRoZSBzaXplIGFuZCBvZmZzZXQgZmllbGRzLiAgV2Ugc3RvcmUKLQkgdGhlbSBpbiB0aGUgYWRkZW5kLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGludGVybi0+cl9vZmZzZXQgPD0gMjU2ICYmIGludGVybi0+cl9zaXplIDw9IDI1Nik7Ci0gICAgICBycHRyLT5hZGRlbmQgPSAoaW50ZXJuLT5yX29mZnNldCA8PCA4KSArIGludGVybi0+cl9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfUFVTSDoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFNVQjoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLSAgICAgIC8qIFRoZSBQVVNILCBQU1VCIGFuZCBQUlNISUZUIHJlbG9jcyBkbyBub3QgYWN0dWFsbHkgdXNlIGFuCi0JIGFkZHJlc3MuICBJIGJlbGlldmUgdGhhdCB0aGUgYWRkcmVzcyBzdXBwbGllZCBpcyByZWFsbHkgYW4KLQkgYWRkZW5kLiAgKi8KLSAgICAgIHJwdHItPmFkZGVuZCA9IGludGVybi0+cl92YWRkcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0dQVkFMVUU6Ci0gICAgICAvKiBTZXQgdGhlIGFkZGVuZCBmaWVsZCB0byB0aGUgbmV3IEdQIHZhbHVlLiAgKi8KLSAgICAgIHJwdHItPmFkZGVuZCA9IGludGVybi0+cl9zeW1uZHggKyBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9JR05PUkU6Ci0gICAgICAvKiBJZiB0aGUgdHlwZSBpcyBBTFBIQV9SX0lHTk9SRSwgbWFrZSBzdXJlIHRoaXMgaXMgYSByZWZlcmVuY2UKLQkgdG8gdGhlIGFic29sdXRlIHNlY3Rpb24gc28gdGhhdCB0aGUgcmVsb2MgaXMgaWdub3JlZC4gIEZvcgotCSBzb21lIHJlYXNvbiB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jIHR5cGUgaXMgbm90IGFkanVzdGVkIGJ5Ci0JIHRoZSBzZWN0aW9uIHZtYS4gIFdlIHJlY29yZCB0aGUgZ3AgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUKLQkgaGVyZSwgZm9yIGNvbnZlbmllbmNlIHdoZW4gZG9pbmcgdGhlIEdQRElTUCByZWxvY2F0aW9uLiAgKi8KLSAgICAgIHJwdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBycHRyLT5hZGRyZXNzID0gaW50ZXJuLT5yX3ZhZGRyOwotICAgICAgcnB0ci0+YWRkZW5kID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJwdHItPmhvd3RvID0gJmFscGhhX2hvd3RvX3RhYmxlW2ludGVybi0+cl90eXBlXTsKLX0KLQotLyogV2hlbiB3cml0aW5nIG91dCBhIHJlbG9jIHdlIG5lZWQgdG8gcHVsbCBzb21lIHZhbHVlcyBiYWNrIG91dCBvZgotICAgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSByZWxvYy4gIFRoaXMgaXMgcm91Z2hseSB0aGUgcmV2ZXJzZSBvZgotICAgYWxwaGFfYWRqdXN0X3JlbG9jX2luLCBleGNlcHQgdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbCBjaGFuZ2VzIHdlIGRvCi0gICBub3QgbmVlZCB0byB1bmRvLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX2FkanVzdF9yZWxvY19vdXQgKGFiZmQsIHJlbCwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGFyZWxlbnQgKnJlbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci17Ci0gIHN3aXRjaCAoaW50ZXJuLT5yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0gICAgY2FzZSBBTFBIQV9SX0dQRElTUDoKLSAgICAgIGludGVybi0+cl9zaXplID0gcmVsLT5hZGRlbmQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLSAgICAgIGludGVybi0+cl9zaXplID0gcmVsLT5hZGRlbmQgJiAweGZmOwotICAgICAgaW50ZXJuLT5yX29mZnNldCA9IChyZWwtPmFkZGVuZCA+PiA4KSAmIDB4ZmY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9QVVNIOgotICAgIGNhc2UgQUxQSEFfUl9PUF9QU1VCOgotICAgIGNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotICAgICAgaW50ZXJuLT5yX3ZhZGRyID0gcmVsLT5hZGRlbmQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9JR05PUkU6Ci0gICAgICBpbnRlcm4tPnJfdmFkZHIgPSByZWwtPmFkZHJlc3M7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBzdGFjayBmb3IgdGhlIHJlbG9jYXRpb24gZXZhbHVhdG9yLiAgKi8KLSNkZWZpbmUgUkVMT0NfU1RBQ0tTSVpFICgxMCkKLQotLyogQWxwaGEgRUNPRkYgcmVsb2NzIGhhdmUgYSBidWlsdCBpbiBleHByZXNzaW9uIGV2YWx1YXRvciBhcyB3ZWxsIGFzCi0gICBvdGhlciBpbnRlcmRlcGVuZGVuY2llcy4gIFJhdGhlciB0aGFuIHVzZSBhIGJ1bmNoIG9mIHNwZWNpYWwKLSAgIGZ1bmN0aW9ucyBhbmQgZ2xvYmFsIHZhcmlhYmxlcywgd2UgdXNlIGEgc2luZ2xlIHJvdXRpbmUgdG8gZG8gYWxsCi0gICB0aGUgcmVsb2NhdGlvbiBmb3IgYSBzZWN0aW9uLiAgSSBoYXZlbid0IHlldCB3b3JrZWQgb3V0IGhvdyB0aGUKLSAgIGFzc2VtYmxlciBpcyBnb2luZyB0byBoYW5kbGUgdGhpcy4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1hbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGJmZCAqaW5wdXRfYmZkID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotICBiZmQgKm91dHB1dF9iZmQgPSByZWxvY2F0ZWFibGUgPyBhYmZkIDogKGJmZCAqKSBOVUxMOwotICBiZmRfdm1hIGdwOwotICBib29sZWFuIGdwX3VuZGVmaW5lZDsKLSAgYmZkX3ZtYSBzdGFja1tSRUxPQ19TVEFDS1NJWkVdOwotICBpbnQgdG9zID0gMDsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgZGF0YSwKLQkJCQkgIChmaWxlX3B0cikgMCwgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgc2VjdGlvbiBzaXplIGlzIG5vdCBnb2luZyB0byBjaGFuZ2UuICAqLwotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSB0cnVlOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsIHN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAocmVsb2NfY291bnQgPT0gMCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgR1AgdmFsdWUgZm9yIHRoZSBvdXRwdXQgQkZELiAgKi8KLSAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpOwotICBpZiAoZ3AgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocmVsb2NhdGVhYmxlICE9IGZhbHNlKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBiZmRfdm1hIGxvOwotCi0JICAvKiBNYWtlIHVwIGEgdmFsdWUuICAqLwotCSAgbG8gPSAoYmZkX3ZtYSkgLTE7Ci0JICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHNlYy0+dm1hIDwgbG8KLQkJICAmJiAoc3RyY21wIChzZWMtPm5hbWUsICIuc2JzcyIpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChzZWMtPm5hbWUsICIuc2RhdGEiKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLmxpdDQiKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLmxpdDgiKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLmxpdGEiKSA9PSAwKSkKLQkJbG8gPSBzZWMtPnZtYTsKLQkgICAgfQotCSAgZ3AgPSBsbyArIDB4ODAwMDsKLQkgIF9iZmRfc2V0X2dwX3ZhbHVlIChhYmZkLCBncCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby0+aGFzaCwgIl9ncCIsIGZhbHNlLCBmYWxzZSwKLQkJCQkgICAgdHJ1ZSk7Ci0JICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgICBncF91bmRlZmluZWQgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZ3AgPSAoaC0+dS5kZWYudmFsdWUKLQkJICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3ApOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBmb3IgKDsgKnJlbG9jX3ZlY3RvciAhPSAoYXJlbGVudCAqKSBOVUxMOyByZWxvY192ZWN0b3IrKykKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWw7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgICAgIGNoYXIgKmVycjsKLQotICAgICAgcmVsID0gKnJlbG9jX3ZlY3RvcjsKLSAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICBzd2l0Y2ggKHJlbC0+aG93dG8tPnR5cGUpCi0JewotCWNhc2UgQUxQSEFfUl9JR05PUkU6Ci0JICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX1JFRkxPTkc6Ci0JY2FzZSBBTFBIQV9SX1JFRlFVQUQ6Ci0JY2FzZSBBTFBIQV9SX0JSQUREUjoKLQljYXNlIEFMUEhBX1JfSElOVDoKLQljYXNlIEFMUEhBX1JfU1JFTDE2OgotCWNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0JY2FzZSBBTFBIQV9SX1NSRUw2NDoKLQkgIGlmIChyZWxvY2F0ZWFibGUKLQkgICAgICAmJiAoKCpyZWwtPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JICAgIHsKLQkgICAgICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcmVsLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIG91dHB1dF9iZmQsICZlcnIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfR1BSRUwzMjoKLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBpcyB1c2VkIGluIGEgc3dpdGNoIHRhYmxlLiAgSXQgaXMgYSAzMgotCSAgICAgYml0IG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IEdQIHZhbHVlLiAgV2UgbXVzdCBhZGp1c3QgaXQKLQkgICAgIGJ5IHRoZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgb3JpZ2luYWwgR1AgdmFsdWUgYW5kIHRoZQotCSAgICAgY3VycmVudCBHUCB2YWx1ZS4gIFRoZSBvcmlnaW5hbCBHUCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlCi0JICAgICBhZGRlbmQuICBXZSBhZGp1c3QgdGhlIGFkZGVuZCBhbmQgbGV0Ci0JICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCB0aGUgam9iLiAgKi8KLQkgIHJlbC0+YWRkZW5kIC09IGdwOwotCSAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcmVsLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIG91dHB1dF9iZmQsICZlcnIpOwotCSAgaWYgKHIgPT0gYmZkX3JlbG9jX29rICYmIGdwX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIHIgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCSAgICAgIGVyciA9IChjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNlZCB3aGVuIEdQIG5vdCBkZWZpbmVkIik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0xJVEVSQUw6Ci0JICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgbGl0ZXJhbCB2YWx1ZSwgZ2VuZXJhbGx5Ci0JICAgICAoYWx3YXlzPykgaW4gdGhlIC5saXRhIHNlY3Rpb24uICBUaGlzIGlzIGEgMTYgYml0IEdQCi0JICAgICByZWxhdGl2ZSByZWxvY2F0aW9uLiAgU29tZXRpbWVzIHRoZSBzdWJzZXF1ZW50IHJlbG9jIGlzIGEKLQkgICAgIExJVFVTRSByZWxvYywgd2hpY2ggaW5kaWNhdGVzIGhvdyB0aGlzIHJlbG9jIGlzIHVzZWQuCi0JICAgICBUaGlzIHNvbWV0aW1lcyBwZXJtaXRzIHJld3JpdGluZyB0aGUgdHdvIGluc3RydWN0aW9ucwotCSAgICAgcmVmZXJyZWQgdG8gYnkgdGhlIExJVEVSQUwgYW5kIHRoZSBMSVRVU0UgaW50byBkaWZmZXJlbnQKLQkgICAgIGluc3RydWN0aW9ucyB3aGljaCBkbyBub3QgcmVmZXIgdG8gLmxpdGEuICBUaGlzIGNhbiBzYXZlCi0JICAgICBhIG1lbW9yeSByZWZlcmVuY2UsIGFuZCBwZXJtaXRzIHJlbW92aW5nIGEgdmFsdWUgZnJvbQotCSAgICAgLmxpdGEgdGh1cyBzYXZpbmcgR1AgcmVsYXRpdmUgc3BhY2UuCi0KLQkgICAgIFdlIGRvIG5vdCB0aGVzZSBvcHRpbWl6YXRpb25zLiAgVG8gZG8gdGhlbSB3ZSB3b3VsZCBuZWVkCi0JICAgICB0byBhcnJhbmdlIHRvIGxpbmsgdGhlIC5saXRhIHNlY3Rpb24gZmlyc3QsIHNvIHRoYXQgYnkKLQkgICAgIHRoZSB0aW1lIHdlIGdvdCBoZXJlIHdlIHdvdWxkIGtub3cgdGhlIGZpbmFsIHZhbHVlcyB0bwotCSAgICAgdXNlLiAgVGhpcyB3b3VsZCBub3QgYmUgcGFydGljdWxhcmx5IGRpZmZpY3VsdCwgYnV0IGl0IGlzCi0JICAgICBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiAgKi8KLQotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkgICAgLyogSSBiZWxpZXZlIHRoYXQgdGhlIExJVEVSQUwgcmVsb2Mgd2lsbCBvbmx5IGFwcGx5IHRvIGEKLQkgICAgICAgbGRxIG9yIGxkbCBpbnN0cnVjdGlvbiwgc28gY2hlY2sgbXkgYXNzdW1wdGlvbi4gICovCi0JICAgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGRhdGEgKyByZWwtPmFkZHJlc3MpOwotCSAgICBCRkRfQVNTRVJUICgoKGluc24gPj4gMjYpICYgMHgzZikgPT0gMHgyOQotCQkJfHwgKChpbnNuID4+IDI2KSAmIDB4M2YpID09IDB4MjgpOwotCi0JICAgIHJlbC0+YWRkZW5kIC09IGdwOwotCSAgICByID0gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLCByZWwsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkJCW91dHB1dF9iZmQsICZlcnIpOwotCSAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2sgJiYgZ3BfdW5kZWZpbmVkKQotCSAgICAgIHsKLQkJciA9IGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JCWVyciA9Ci0JCSAgKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiKTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0JICAvKiBTZWUgQUxQSEFfUl9MSVRFUkFMIGFib3ZlIGZvciB0aGUgdXNlcyBvZiB0aGlzIHJlbG9jLiAgSXQKLQkgICAgIGRvZXMgbm90IGNhdXNlIGFueXRoaW5nIHRvIGhhcHBlbiwgaXRzZWxmLiAgKi8KLQkgIHJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgYnJlYWs7Ci0JICAgIAotCWNhc2UgQUxQSEFfUl9HUERJU1A6Ci0JICAvKiBUaGlzIG1hcmtzIHRoZSBsZGFoIG9mIGFuIGxkYWgvbGRhIHBhaXIgd2hpY2ggbG9hZHMgdGhlCi0JICAgICBncCByZWdpc3RlciB3aXRoIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSBncCB2YWx1ZSBhbmQgdGhlCi0JICAgICBjdXJyZW50IGxvY2F0aW9uLiAgVGhlIHNlY29uZCBvZiB0aGUgcGFpciBpcyByX3NpemUgYnl0ZXMKLQkgICAgIGFoZWFkOyBpdCB1c2VkIHRvIGJlIG1hcmtlZCB3aXRoIGFuIEFMUEhBX1JfSUdOT1JFIHJlbG9jLAotCSAgICAgYnV0IHRoYXQgbm8gbG9uZ2VyIGhhcHBlbnMgaW4gT1NGLzEgMy4yLiAgKi8KLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpbnNuMSwgaW5zbjI7Ci0JICAgIGJmZF92bWEgYWRkZW5kOwotCi0JICAgIC8qIEdldCB0aGUgdHdvIGluc3RydWN0aW9ucy4gICovCi0JICAgIGluc24xID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgaW5zbjIgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGRhdGEgKyByZWwtPmFkZHJlc3MgKyByZWwtPmFkZGVuZCk7Ci0KLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuMSA+PiAyNikgJiAweDNmKSA9PSAweDA5KTsgLyogbGRhaCAqLwotCSAgICBCRkRfQVNTRVJUICgoKGluc24yID4+IDI2KSAmIDB4M2YpID09IDB4MDgpOyAvKiBsZGEgKi8KLQotCSAgICAvKiBHZXQgdGhlIGV4aXN0aW5nIGFkZGVuZC4gIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIHNpZ24KLQkgICAgICAgZXh0ZW5zaW9uIGRvbmUgYnkgbGRhIGFuZCBsZGFoLiAgKi8KLQkgICAgYWRkZW5kID0gKChpbnNuMSAmIDB4ZmZmZikgPDwgMTYpICsgKGluc24yICYgMHhmZmZmKTsKLQkgICAgaWYgKGluc24xICYgMHg4MDAwKQotCSAgICAgIHsKLQkJYWRkZW5kIC09IDB4ODAwMDAwMDA7Ci0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCSAgICAgIH0KLQkgICAgaWYgKGluc24yICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCAtPSAweDEwMDAwOwotCi0JICAgIC8qIFRoZSBleGlzdGluZyBhZGRlbmQgaW5jbHVkZXMgdGhlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZQotCSAgICAgICBncCBvZiB0aGUgaW5wdXQgQkZEIGFuZCB0aGUgYWRkcmVzcyBpbiB0aGUgaW5wdXQgQkZELgotCSAgICAgICBTdWJ0cmFjdCB0aGlzIG91dC4gICovCi0JICAgIGFkZGVuZCAtPSAoZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AKLQkJICAgICAgIC0gKGlucHV0X3NlY3Rpb24tPnZtYSArIHJlbC0+YWRkcmVzcykpOwotCi0JICAgIC8qIE5vdyBhZGQgaW4gdGhlIGZpbmFsIGdwIHZhbHVlLCBhbmQgc3VidHJhY3Qgb3V0IHRoZQotCSAgICAgICBmaW5hbCBhZGRyZXNzLiAgKi8KLQkgICAgYWRkZW5kICs9IChncAotCQkgICAgICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgKyByZWwtPmFkZHJlc3MpKTsKLQotCSAgICAvKiBDaGFuZ2UgdGhlIGluc3RydWN0aW9ucywgYWNjb3VudGluZyBmb3IgdGhlIHNpZ24KLQkgICAgICAgZXh0ZW5zaW9uLCBhbmQgd3JpdGUgdGhlbSBvdXQuICAqLwotCSAgICBpZiAoYWRkZW5kICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCArPSAweDEwMDAwOwotCSAgICBpbnNuMSA9IChpbnNuMSAmIDB4ZmZmZjAwMDApIHwgKChhZGRlbmQgPj4gMTYpICYgMHhmZmZmKTsKLQkgICAgaW5zbjIgPSAoaW5zbjIgJiAweGZmZmYwMDAwKSB8IChhZGRlbmQgJiAweGZmZmYpOwotCi0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24xLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbjIsCi0JCQlkYXRhICsgcmVsLT5hZGRyZXNzICsgcmVsLT5hZGRlbmQpOwotCi0JICAgIHJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEFMUEhBX1JfT1BfUFVTSDoKLQkgIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0JICB7Ci0JICAgIGFzeW1ib2wgKnN5bWJvbDsKLQkgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0JICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JICAgICAgewotCQlyZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIC8qIEZpZ3VyZSBvdXQgdGhlIHJlbG9jYXRpb24gb2YgdGhpcyBzeW1ib2wuICAqLwotCSAgICBzeW1ib2wgPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotCSAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICAgIHIgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0JICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+YWRkZW5kOwotCi0JICAgIGlmICh0b3MgPj0gUkVMT0NfU1RBQ0tTSVpFKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0YWNrW3RvcysrXSA9IHJlbG9jYXRpb247Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLQkgIC8qIFN0b3JlIGEgdmFsdWUgZnJvbSB0aGUgcmVsb2Mgc3RhY2sgaW50byBhIGJpdGZpZWxkLiAgKi8KLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWw7Ci0JICAgIGludCBvZmZzZXQsIHNpemU7Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKHRvcyA9PSAwKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIC8qIFRoZSBvZmZzZXQgYW5kIHNpemUgZm9yIHRoaXMgcmVsb2MgYXJlIGVuY29kZWQgaW50byB0aGUKLQkgICAgICAgYWRkZW5kIGZpZWxkIGJ5IGFscGhhX2FkanVzdF9yZWxvY19pbi4gICovCi0JICAgIG9mZnNldCA9IChyZWwtPmFkZGVuZCA+PiA4KSAmIDB4ZmY7Ci0JICAgIHNpemUgPSByZWwtPmFkZGVuZCAmIDB4ZmY7Ci0KLQkgICAgdmFsID0gYmZkX2dldF82NCAoYWJmZCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIHZhbCAmPX4gKCgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldCk7Ci0JICAgIHZhbCB8PSAoc3RhY2tbLS10b3NdICYgKCgxIDw8IHNpemUpIC0gMSkpIDw8IG9mZnNldDsKLQkgICAgYmZkX3B1dF82NCAoYWJmZCwgdmFsLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0JICAvKiBTdWJ0cmFjdCBhIHZhbHVlIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLwotCSAgewotCSAgICBhc3ltYm9sICpzeW1ib2w7Ci0JICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotCSAgICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICAgIHsKLQkJcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAvKiBGaWd1cmUgb3V0IHRoZSByZWxvY2F0aW9uIG9mIHRoaXMgc3ltYm9sLiAgKi8KLQkgICAgc3ltYm9sID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLQkgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotCSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICBlbHNlCi0JICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0JICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPmFkZGVuZDsKLQotCSAgICBpZiAodG9zID09IDApCi0JICAgICAgYWJvcnQgKCk7Ci0KLQkgICAgc3RhY2tbdG9zIC0gMV0gLT0gcmVsb2NhdGlvbjsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0JICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLwotCSAgewotCSAgICBhc3ltYm9sICpzeW1ib2w7Ci0JICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotCSAgICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICAgIHsKLQkJcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAvKiBGaWd1cmUgb3V0IHRoZSByZWxvY2F0aW9uIG9mIHRoaXMgc3ltYm9sLiAgKi8KLQkgICAgc3ltYm9sID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLQkgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotCSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICBlbHNlCi0JICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0JICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPmFkZGVuZDsKLQotCSAgICBpZiAodG9zID09IDApCi0JICAgICAgYWJvcnQgKCk7Ci0KLQkgICAgc3RhY2tbdG9zIC0gMV0gPj49IHJlbG9jYXRpb247Ci0JICB9Ci0JICBicmVhazsKLQkgICAgCi0JY2FzZSBBTFBIQV9SX0dQVkFMVUU6Ci0JICAvKiBJIHJlYWxseSBkb24ndCBrbm93IGlmIHRoaXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcuICAqLwotCSAgZ3AgPSByZWwtPmFkZGVuZDsKLQkgIGdwX3VuZGVmaW5lZCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIGFzZWN0aW9uICpvcyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0JICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzLiAgKi8KLQkgIG9zLT5vcmVsb2NhdGlvbltvcy0+cmVsb2NfY291bnRdID0gcmVsOwotCSAgb3MtPnJlbG9jX2NvdW50Kys7Ci0JfQotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spIAotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbC0+c3ltX3B0cl9wdHIpLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+YWRkcmVzcywgdHJ1ZSkpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOiAKLQkgICAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkgICAgIChsaW5rX2luZm8sIGVyciwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPmFkZHJlc3MpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsLT5zeW1fcHRyX3B0ciksCi0JCSAgICAgIHJlbC0+aG93dG8tPm5hbWUsIHJlbC0+YWRkZW5kLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+YWRkcmVzcykpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKHRvcyAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gc3VjY2Vzc2Z1bF9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHZXQgdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgYSBnZW5lcmljIHJlbG9jIHR5cGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1hbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGludCBhbHBoYV90eXBlOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZMT05HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1JFRlFVQUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfR1BSRUwzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9MSVRFUkFMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfTElUVVNFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9HUERJU1A7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0lHTk9SRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfQlJBRERSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0hJTlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjRfUENSRUw6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMNjQ7Ci0gICAgICBicmVhazsKLSNpZiAwCi0gICAgY2FzZSA/Pz86Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9PUF9QVVNIOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA/Pz86Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9PUF9TVE9SRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfUFNVQjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfUFJTSElGVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfR1BWQUxVRTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJmFscGhhX2hvd3RvX3RhYmxlW2FscGhhX3R5cGVdOwotfQotDAotLyogQSBoZWxwZXIgcm91dGluZSBmb3IgYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiB3aGljaCBjb252ZXJ0cyBhbgotICAgZXh0ZXJuYWwgcmVsb2Mgd2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBSZXR1cm5zIHRoZQotICAgcmVsb2NhdGlvbiBhbW91bnQuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBleHRfcmVsLCBoKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgQkZEX0FTU0VSVCAoaW5mby0+cmVsb2NhdGVhYmxlKTsKLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqaHNlYzsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIG91dHB1dC4gIENvbnZlcnQgdGhlIHJlbG9jIGZyb20KLQkgYmVpbmcgYWdhaW5zdCB0aGUgc3ltYm9sIHRvIGJlaW5nIGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotCi0gICAgICAvKiBDbGVhciB0aGUgcl9leHRlcm4gYml0LiAgKi8KLSAgICAgIGV4dF9yZWwtPnJfYml0c1sxXSAmPX4gUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRTsKLQotICAgICAgLyogQ29tcHV0ZSBhIG5ldyByX3N5bW5keCB2YWx1ZS4gICovCi0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBoc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0KLSAgICAgIHJfc3ltbmR4ID0gLTE7Ci0gICAgICBzd2l0Y2ggKG5hbWVbMV0pCi0JewotCWNhc2UgJ0EnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIipBQlMqIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQlNTOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9JTklUOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmxpdGEiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ0OwotCSAgYnJlYWs7Ci0JY2FzZSAncCc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLnBkYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1BEQVRBOwotCSAgYnJlYWs7Ci0JY2FzZSAncic6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JEQVRBOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJjb25zdCIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fVEVYVDsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi54ZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9YREFUQTsKLQkgIGJyZWFrOwotCX0KLQkJICAgICAgCi0gICAgICBpZiAocl9zeW1uZHggPT0gLTEpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIEFkZCB0aGUgc2VjdGlvbiBWTUEgYW5kIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQ2hhbmdlIHRoZSBzeW1uZHggdmFsdWUgdG8gdGhlIHJpZ2h0IG9uZSBmb3IKLQkgdGhlIG91dHB1dCBCRkQuICAqLwotICAgICAgcl9zeW1uZHggPSBoLT5pbmR4OwotICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQotCXsKLQkgIC8qIENhbGxlciBtdXN0IGdpdmUgYW4gZXJyb3IuICAqLwotCSAgcl9zeW1uZHggPSAwOwotCX0KLSAgICAgIHJlbG9jYXRpb24gPSAwOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIG5ldyByX3N5bW5keCB2YWx1ZS4gICovCi0gIGJmZF9oX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgcl9zeW1uZHgsCi0JCShiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3N5bW5keCk7Ci0KLSAgcmV0dXJuIHJlbG9jYXRpb247Ci19Ci0KLS8qIFJlbG9jYXRlIGEgc2VjdGlvbiB3aGlsZSBsaW5raW5nIGFuIEFscGhhIEVDT0ZGIGZpbGUuICBUaGlzIGlzCi0gICBxdWl0ZSBzaW1pbGFyIHRvIGdldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4gIFBlcmhhcHMgdGhleQotICAgY291bGQgYmUgY29tYmluZWQgc29tZWhvdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQljb250ZW50cywgZXh0ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgUFRSIGV4dGVybmFsX3JlbG9jczsKLXsKLSAgYXNlY3Rpb24gKipzeW1uZHhfdG9fc2VjdGlvbiwgKmxpdGFfc2VjOwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSBncDsKLSAgYm9vbGVhbiBncF91bmRlZmluZWQ7Ci0gIGJmZF92bWEgc3RhY2tbUkVMT0NfU1RBQ0tTSVpFXTsKLSAgaW50IHRvcyA9IDA7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsX2VuZDsKLQotICAvKiBXZSBrZWVwIGEgdGFibGUgbWFwcGluZyB0aGUgc3ltbmR4IGZvdW5kIGluIGFuIGludGVybmFsIHJlbG9jIHRvCi0gICAgIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBsb29raW5nIHVwIHRoZQotICAgICBzZWN0aW9uIGJ5IG5hbWUgZWFjaCB0aW1lLiAgKi8KLSAgc3ltbmR4X3RvX3NlY3Rpb24gPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbjsKLSAgaWYgKHN5bW5keF90b19zZWN0aW9uID09IChhc2VjdGlvbiAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbiA9ICgoYXNlY3Rpb24gKiopCi0JCQkgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAoTlVNX1JFTE9DX1NFQ1RJT05TCi0JCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgICAgIGlmICghc3ltbmR4X3RvX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX05PTkVdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fVEVYVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIudGV4dCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9SREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9TREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2RhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0JTU10gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2JzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9CU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmJzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9JTklUXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5pbml0Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDhdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDgiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUNF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0NCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9YREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIueGRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUERBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnBkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0ZJTkldID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmZpbmkiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9BQlNdID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUkNPTlNUXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5yY29uc3QiKTsKLQotICAgICAgZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltbmR4X3RvX3NlY3Rpb24gPSBzeW1uZHhfdG9fc2VjdGlvbjsKLSAgICB9Ci0KLSAgc3ltX2hhc2hlcyA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bV9oYXNoZXM7Ci0KLSAgLyogT24gdGhlIEFscGhhLCB0aGUgLmxpdGEgc2VjdGlvbiBtdXN0IGJlIGFkZHJlc3NhYmxlIGJ5IHRoZSBnbG9iYWwKLSAgICAgcG9pbnRlci4gIFRvIHN1cHBvcnQgbGFyZ2UgcHJvZ3JhbXMsIHdlIG5lZWQgdG8gYWxsb3cgbXVsdGlwbGUKLSAgICAgZ2xvYmFsIHBvaW50ZXJzLiAgVGhpcyB3b3JrcyBhcyBsb25nIGFzIGVhY2ggaW5wdXQgLmxpdGEgc2VjdGlvbgotICAgICBpcyA8NjRLQiBiaWcuICBUaGlzIGltcGxpZXMgdGhhdCB3aGVuIHByb2R1Y2luZyByZWxvY2F0YWJsZQotICAgICBvdXRwdXQsIHRoZSAubGl0YSBzZWN0aW9uIGlzIGxpbWl0ZWQgdG8gNjRLQi4gLiAqLwotCi0gIGxpdGFfc2VjID0gc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVRBXTsKLSAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSAmJiBsaXRhX3NlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICpsaXRhX3NlY19kYXRhOwotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHNlY3Rpb24gZGF0YSBzdHJ1Y3R1cmUgdG8gd2hpY2ggd2UgY2FuCi0JIGhhbmcgb24gdG8gdGhlIGdwIHZhbHVlIHdlIHBpY2sgZm9yIHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIGxpdGFfc2VjX2RhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgbGl0YV9zZWMpOwotICAgICAgaWYgKGxpdGFfc2VjX2RhdGEgPT0gTlVMTCkKLQl7Ci0JICBsaXRhX3NlY19kYXRhID0gKChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKQotCQkJICAgYmZkX3phbGxvYyAoaW5wdXRfYmZkLAotCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhKSkpOwotCSAgZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGxpdGFfc2VjKSA9IGxpdGFfc2VjX2RhdGE7Ci0JfQotCi0gICAgICBpZiAobGl0YV9zZWNfZGF0YS0+Z3AgIT0gMCkKLQl7Ci0JICAvKiBJZiB3ZSBhbHJlYWR5IGFzc2lnbmVkIGEgZ3AgdG8gdGhpcyBzZWN0aW9uLCB3ZSBiZXR0ZXIKLQkgICAgIHN0aWNrIHdpdGggdGhhdCB2YWx1ZS4gICovCi0JICBncCA9IGxpdGFfc2VjX2RhdGEtPmdwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfdm1hIGxpdGFfdm1hOwotCSAgYmZkX3NpemVfdHlwZSBsaXRhX3NpemU7Ci0KLQkgIGxpdGFfdm1hID0gbGl0YV9zZWMtPm91dHB1dF9vZmZzZXQgKyBsaXRhX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIGxpdGFfc2l6ZSA9IGxpdGFfc2VjLT5fY29va2VkX3NpemU7Ci0JICBpZiAobGl0YV9zaXplID09IDApCi0JICAgIGxpdGFfc2l6ZSA9IGxpdGFfc2VjLT5fcmF3X3NpemU7Ci0KLQkgIGlmIChncCA9PSAwCi0JICAgICAgfHwgbGl0YV92bWEgPCAgZ3AgLSAweDgwMDAKLQkgICAgICB8fCBsaXRhX3ZtYSArIGxpdGFfc2l6ZSA+PSBncCArIDB4ODAwMCkKLQkgICAgewotCSAgICAgIC8qIEVpdGhlciBncCBoYXNuJ3QgYmVlbiBzZXQgYXQgYWxsIG9yIHRoZSBjdXJyZW50IGdwCi0JCSBjYW5ub3QgYWRkcmVzcyB0aGlzIC5saXRhIHNlY3Rpb24uICBJbiBib3RoIGNhc2VzIHdlCi0JCSByZXNldCB0aGUgZ3AgdG8gcG9pbnQgaW50byB0aGUgIm1pZGRsZSIgb2YgdGhlCi0JCSBjdXJyZW50IGlucHV0IC5saXRhIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChncCAmJiAhZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nKQotCQl7Ci0JCSAgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpIChpbmZvLAotCQkJCQkgICAgICAgXygidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIiksCi0JCQkJCSAgICAgICAoY2hhciAqKSBOVUxMLCBvdXRwdXRfYmZkLAotCQkJCQkgICAgICAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKTsKLQkJICBlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+aXNzdWVkX211bHRpcGxlX2dwX3dhcm5pbmcgPSB0cnVlOwotCQl9Ci0JICAgICAgaWYgKGxpdGFfdm1hIDwgZ3AgLSAweDgwMDApCi0JCWdwID0gbGl0YV92bWEgKyBsaXRhX3NpemUgLSAweDgwMDA7Ci0JICAgICAgZWxzZQotCQlncCA9IGxpdGFfdm1hICsgMHg4MDAwOwotCi0JICAgIH0KLQotCSAgbGl0YV9zZWNfZGF0YS0+Z3AgPSBncDsKLQl9Ci0KLSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7Ci0gICAgfQotCi0gIGdwX3VuZGVmaW5lZCA9IChncCA9PSAwKTsKLQotICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKG91dHB1dF9iZmQpKTsKLSAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChpbnB1dF9iZmQpKTsKLQotICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBleHRlcm5hbF9yZWxvY3M7Ci0gIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgZXh0X3JlbCA8IGV4dF9yZWxfZW5kOyBleHRfcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSByX3ZhZGRyOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICBpbnQgcl9leHRlcm47Ci0gICAgICBpbnQgcl9vZmZzZXQ7Ci0gICAgICBpbnQgcl9zaXplOwotICAgICAgYm9vbGVhbiByZWxvY2F0ZXA7Ci0gICAgICBib29sZWFuIGFkanVzdF9hZGRycDsKLSAgICAgIGJvb2xlYW4gZ3BfdXNlZHA7Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLQotICAgICAgcl92YWRkciA9IGJmZF9oX2dldF82NCAoaW5wdXRfYmZkLCAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl92YWRkcik7Ci0gICAgICByX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoaW5wdXRfYmZkLCAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl9zeW1uZHgpOwotCi0gICAgICByX3R5cGUgPSAoKGV4dF9yZWwtPnJfYml0c1swXSAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKQotCQk+PiBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRSk7Ci0gICAgICByX2V4dGVybiA9IChleHRfcmVsLT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFKSAhPSAwOwotICAgICAgcl9vZmZzZXQgPSAoKGV4dF9yZWwtPnJfYml0c1sxXSAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpCi0JCSAgPj4gUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRSk7Ci0gICAgICAvKiBJZ25vcmVkIHRoZSByZXNlcnZlZCBiaXRzLiAgKi8KLSAgICAgIHJfc2l6ZSA9ICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpCi0JCT4+IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKTsKLQotICAgICAgcmVsb2NhdGVwID0gZmFsc2U7Ci0gICAgICBhZGp1c3RfYWRkcnAgPSB0cnVlOwotICAgICAgZ3BfdXNlZHAgPSBmYWxzZTsKLSAgICAgIGFkZGVuZCA9IDA7Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIEFMUEhBX1JfSUdOT1JFOgotCSAgLyogVGhpcyByZWxvYyBhcHBlYXJzIGFmdGVyIGEgR1BESVNQIHJlbG9jLiAgT24gZWFybGllcgotCSAgICAgdmVyc2lvbnMgb2YgT1NGLzEsIEl0IG1hcmtlZCB0aGUgcG9zaXRpb24gb2YgdGhlIHNlY29uZAotCSAgICAgaW5zdHJ1Y3Rpb24gdG8gYmUgYWx0ZXJlZCBieSB0aGUgR1BESVNQIHJlbG9jLCBidXQgaXQgaXMKLQkgICAgIG5vdCBvdGhlcndpc2UgdXNlZCBmb3IgYW55dGhpbmcuICBGb3Igc29tZSByZWFzb24sIHRoZQotCSAgICAgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiBkb2VzIG5vdCBhcHBlYXIgdG8gaW5jbHVkZSB0aGUKLQkgICAgIHNlY3Rpb24gVk1BLCB1bmxpa2UgdGhlIG90aGVyIHJlbG9jYXRpb24gdHlwZXMuICAqLwotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsCi0JCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyByX3ZhZGRyLAotCQkJICAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl92YWRkcik7Ci0JICBhZGp1c3RfYWRkcnAgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX1JFRkxPTkc6Ci0JY2FzZSBBTFBIQV9SX1JFRlFVQUQ6Ci0JY2FzZSBBTFBIQV9SX0hJTlQ6Ci0JICByZWxvY2F0ZXAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfQlJBRERSOgotCWNhc2UgQUxQSEFfUl9TUkVMMTY6Ci0JY2FzZSBBTFBIQV9SX1NSRUwzMjoKLQljYXNlIEFMUEhBX1JfU1JFTDY0OgotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICBhZGRlbmQgKz0gLSAocl92YWRkciArIDQpOwotCSAgcmVsb2NhdGVwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0JICAvKiBUaGlzIHJlbG9jYXRpb24gaXMgdXNlZCBpbiBhIHN3aXRjaCB0YWJsZS4gIEl0IGlzIGEgMzIKLQkgICAgIGJpdCBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBHUCB2YWx1ZS4gIFdlIG11c3QgYWRqdXN0IGl0Ci0JICAgICBieSB0aGUgZGlmZmVyZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIEdQIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgR1AgdmFsdWUuICAqLwotCSAgcmVsb2NhdGVwID0gdHJ1ZTsKLQkgIGFkZGVuZCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwIC0gZ3A7Ci0JICBncF91c2VkcCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9MSVRFUkFMOgotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdmFsdWUsIGdlbmVyYWxseQotCSAgICAgKGFsd2F5cz8pIGluIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCBHUAotCSAgICAgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFNvbWV0aW1lcyB0aGUgc3Vic2VxdWVudCByZWxvYyBpcyBhCi0JICAgICBMSVRVU0UgcmVsb2MsIHdoaWNoIGluZGljYXRlcyBob3cgdGhpcyByZWxvYyBpcyB1c2VkLgotCSAgICAgVGhpcyBzb21ldGltZXMgcGVybWl0cyByZXdyaXRpbmcgdGhlIHR3byBpbnN0cnVjdGlvbnMKLQkgICAgIHJlZmVycmVkIHRvIGJ5IHRoZSBMSVRFUkFMIGFuZCB0aGUgTElUVVNFIGludG8gZGlmZmVyZW50Ci0JICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggZG8gbm90IHJlZmVyIHRvIC5saXRhLiAgVGhpcyBjYW4gc2F2ZQotCSAgICAgYSBtZW1vcnkgcmVmZXJlbmNlLCBhbmQgcGVybWl0cyByZW1vdmluZyBhIHZhbHVlIGZyb20KLQkgICAgIC5saXRhIHRodXMgc2F2aW5nIEdQIHJlbGF0aXZlIHNwYWNlLgotCi0JICAgICBXZSBkbyBub3QgdGhlc2Ugb3B0aW1pemF0aW9ucy4gIFRvIGRvIHRoZW0gd2Ugd291bGQgbmVlZAotCSAgICAgdG8gYXJyYW5nZSB0byBsaW5rIHRoZSAubGl0YSBzZWN0aW9uIGZpcnN0LCBzbyB0aGF0IGJ5Ci0JICAgICB0aGUgdGltZSB3ZSBnb3QgaGVyZSB3ZSB3b3VsZCBrbm93IHRoZSBmaW5hbCB2YWx1ZXMgdG8KLQkgICAgIHVzZS4gIFRoaXMgd291bGQgbm90IGJlIHBhcnRpY3VsYXJseSBkaWZmaWN1bHQsIGJ1dCBpdCBpcwotCSAgICAgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gICovCi0KLQkgIC8qIEkgYmVsaWV2ZSB0aGF0IHRoZSBMSVRFUkFMIHJlbG9jIHdpbGwgb25seSBhcHBseSB0byBhIGxkcQotCSAgICAgb3IgbGRsIGluc3RydWN0aW9uLCBzbyBjaGVjayBteSBhc3N1bXB0aW9uLiAgKi8KLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0JICAgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkgICAgICAgY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuID4+IDI2KSAmIDB4M2YpID09IDB4MjkKLQkJCXx8ICgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI4KTsKLQkgIH0KLQotCSAgcmVsb2NhdGVwID0gdHJ1ZTsKLQkgIGFkZGVuZCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwIC0gZ3A7Ci0JICBncF91c2VkcCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0JICAvKiBTZWUgQUxQSEFfUl9MSVRFUkFMIGFib3ZlIGZvciB0aGUgdXNlcyBvZiB0aGlzIHJlbG9jLiAgSXQKLQkgICAgIGRvZXMgbm90IGNhdXNlIGFueXRoaW5nIHRvIGhhcHBlbiwgaXRzZWxmLiAgKi8KLQkgIGJyZWFrOwotCSAgICAKLQljYXNlIEFMUEhBX1JfR1BESVNQOgotCSAgLyogVGhpcyBtYXJrcyB0aGUgbGRhaCBvZiBhbiBsZGFoL2xkYSBwYWlyIHdoaWNoIGxvYWRzIHRoZQotCSAgICAgZ3AgcmVnaXN0ZXIgd2l0aCB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgZ3AgdmFsdWUgYW5kIHRoZQotCSAgICAgY3VycmVudCBsb2NhdGlvbi4gIFRoZSBzZWNvbmQgb2YgdGhlIHBhaXIgaXMgcl9zeW1uZHgKLQkgICAgIGJ5dGVzIGFoZWFkLiAgSXQgdXNlZCB0byBiZSBtYXJrZWQgd2l0aCBhbiBBTFBIQV9SX0lHTk9SRQotCSAgICAgcmVsb2MsIGJ1dCBPU0YvMSAzLjIgbm8gbG9uZ2VyIGRvZXMgdGhhdC4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotCi0JICAgIC8qIEdldCB0aGUgdHdvIGluc3RydWN0aW9ucy4gICovCi0JICAgIGluc24xID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCWNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgIGluc24yID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCShjb250ZW50cwotCQkJCSArIHJfdmFkZHIKLQkJCQkgLSBpbnB1dF9zZWN0aW9uLT52bWEKLQkJCQkgKyByX3N5bW5keCkpOwotCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjEgPj4gMjYpICYgMHgzZikgPT0gMHgwOSk7IC8qIGxkYWggKi8KLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuMiA+PiAyNikgJiAweDNmKSA9PSAweDA4KTsgLyogbGRhICovCi0KLQkgICAgLyogR2V0IHRoZSBleGlzdGluZyBhZGRlbmQuICBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiBkb25lIGJ5IGxkYSBhbmQgbGRhaC4gICovCi0JICAgIGFkZGVuZCA9ICgoaW5zbjEgJiAweGZmZmYpIDw8IDE2KSArIChpbnNuMiAmIDB4ZmZmZik7Ci0JICAgIGlmIChpbnNuMSAmIDB4ODAwMCkKLQkgICAgICB7Ci0JCS8qIFRoaXMgaXMgYWRkZW5kIC09IDB4MTAwMDAwMDAwIHdpdGhvdXQgY2F1c2luZyBhbgotCQkgICBpbnRlZ2VyIG92ZXJmbG93IG9uIGEgMzIgYml0IGhvc3QuICAqLwotCQlhZGRlbmQgLT0gMHg4MDAwMDAwMDsKLQkJYWRkZW5kIC09IDB4ODAwMDAwMDA7Ci0JICAgICAgfQotCSAgICBpZiAoaW5zbjIgJiAweDgwMDApCi0JICAgICAgYWRkZW5kIC09IDB4MTAwMDA7Ci0KLQkgICAgLyogVGhlIGV4aXN0aW5nIGFkZGVuZCBpbmNsdWRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQotCSAgICAgICBncCBvZiB0aGUgaW5wdXQgQkZEIGFuZCB0aGUgYWRkcmVzcyBpbiB0aGUgaW5wdXQgQkZELgotCSAgICAgICBXZSB3YW50IHRvIGNoYW5nZSB0aGlzIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCi0JICAgICAgIGZpbmFsIEdQIGFuZCB0aGUgZmluYWwgYWRkcmVzcy4gICovCi0JICAgIGFkZGVuZCArPSAoZ3AKLQkJICAgICAgIC0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCkpOwotCi0JICAgIC8qIENoYW5nZSB0aGUgaW5zdHJ1Y3Rpb25zLCBhY2NvdW50aW5nIGZvciB0aGUgc2lnbgotCSAgICAgICBleHRlbnNpb24sIGFuZCB3cml0ZSB0aGVtIG91dC4gICovCi0JICAgIGlmIChhZGRlbmQgJiAweDgwMDApCi0JICAgICAgYWRkZW5kICs9IDB4MTAwMDA7Ci0JICAgIGluc24xID0gKGluc24xICYgMHhmZmZmMDAwMCkgfCAoKGFkZGVuZCA+PiAxNikgJiAweGZmZmYpOwotCSAgICBpbnNuMiA9IChpbnNuMiAmIDB4ZmZmZjAwMDApIHwgKGFkZGVuZCAmIDB4ZmZmZik7Ci0KLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbjEsCi0JCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuMiwKLQkJCWNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSArIHJfc3ltbmR4KTsKLQotCSAgICBncF91c2VkcCA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgQUxQSEFfUl9PUF9QVVNIOgotCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotCSAgLyogTWFuaXB1bGF0ZSB2YWx1ZXMgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICBUaGUKLQkgICAgIHJfdmFkZHIgZmllbGQgaXMgbm90IGFuIGFkZHJlc3MgaW4gaW5wdXRfc2VjdGlvbiwgaXQgaXMKLQkgICAgIHRoZSBjdXJyZW50IHZhbHVlIChpbmNsdWRpbmcgYW55IGFkZGVuZCkgb2YgdGhlIG9iamVjdAotCSAgICAgYmVpbmcgdXNlZC4gICovCi0JICBpZiAoISByX2V4dGVybikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCi0JICAgICAgcyA9IHN5bW5keF90b19zZWN0aW9uW3Jfc3ltbmR4XTsKLQkgICAgICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJYWJvcnQgKCk7Ci0JICAgICAgYWRkZW5kID0gcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQgLSBzLT52bWE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keF07Ci0JICAgICAgaWYgKGggPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCXsKLQkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgYWRkZW5kID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBOb3RlIHRoYXQgd2UgcGFzcyB0aGUgYWRkcmVzcyBhcyAwLCBzaW5jZSB3ZQotCQkJIGRvIG5vdCBoYXZlIGEgbWVhbmluZ2Z1bCBudW1iZXIgZm9yIHRoZQotCQkJIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiB0aGF0IGlzIGJlaW5nCi0JCQkgcmVsb2NhdGVkLiAgKi8KLQkJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgKGJmZF92bWEpIDAsIHRydWUpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgYWRkZW5kID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICAgICAgJiYgaC0+aW5keCA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBzeW1ib2wgaXMgbm90IGJlaW5nIHdyaXR0ZW4gb3V0LiAgUGFzcwotCQkJIHRoZSBhZGRyZXNzIGFzIDAsIGFzIHdpdGggdW5kZWZpbmVkX3N5bWJvbCwKLQkJCSBhYm92ZS4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIChiZmRfdm1hKSAwKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBhZGRlbmQgPSBhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQkJCSBpbnB1dF9iZmQsCi0JCQkJCQkJIGV4dF9yZWwsIGgpOwotCQl9Ci0JICAgIH0KLQotCSAgYWRkZW5kICs9IHJfdmFkZHI7Ci0KLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICAvKiBBZGp1c3Qgcl92YWRkciBieSB0aGUgYWRkZW5kLiAgKi8KLQkgICAgICBiZmRfaF9wdXRfNjQgKGlucHV0X2JmZCwgYWRkZW5kLAotCQkJICAgIChiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3ZhZGRyKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyX3R5cGUpCi0JCXsKLQkJY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0JCSAgaWYgKHRvcyA+PSBSRUxPQ19TVEFDS1NJWkUpCi0JCSAgICBhYm9ydCAoKTsKLQkJICBzdGFja1t0b3MrK10gPSBhZGRlbmQ7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0JCSAgaWYgKHRvcyA9PSAwKQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgc3RhY2tbdG9zIC0gMV0gLT0gYWRkZW5kOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotCQkgIGlmICh0b3MgPT0gMCkKLQkJICAgIGFib3J0ICgpOwotCQkgIHN0YWNrW3RvcyAtIDFdID4+PSBhZGRlbmQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBhZGp1c3RfYWRkcnAgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX09QX1NUT1JFOgotCSAgLyogU3RvcmUgYSB2YWx1ZSBmcm9tIHRoZSByZWxvYyBzdGFjayBpbnRvIGEgYml0ZmllbGQuICBJZgotCSAgICAgd2UgYXJlIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYWxsIHdlIGRvIGlzCi0JICAgICBhZGp1c3QgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jLiAgKi8KLQkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgbWFzazsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIGlmICh0b3MgPT0gMCkKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICAvKiBHZXQgdGhlIHJlbG9jYXRpb24gbWFzay4gIFRoZSBzZXBhcmF0ZSBzdGVwcyBhbmQgdGhlCi0JCSBjYXN0cyB0byBiZmRfdm1hIGFyZSBhdHRlbXB0cyB0byBhdm9pZCBhIGJ1ZyBpbiB0aGUKLQkJIEFscGhhIE9TRiAxLjMgQyBjb21waWxlci4gIFNlZSByZWxvYy5jIGZvciBtb3JlCi0JCSBkZXRhaWxzLiAgKi8KLQkgICAgICBtYXNrID0gMTsKLQkgICAgICBtYXNrIDw8PSAoYmZkX3ZtYSkgcl9zaXplOwotCSAgICAgIG1hc2sgLT0gMTsKLQotCSAgICAgIC8qIEZJWE1FOiBJIGRvbid0IGtub3cgd2hhdCBraW5kIG9mIG92ZXJmbG93IGNoZWNraW5nLAotCQkgaWYgYW55LCBzaG91bGQgYmUgZG9uZSBoZXJlLiAgKi8KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzY0IChpbnB1dF9iZmQsCi0JCQkJY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgICB2YWwgJj1+IG1hc2sgPDwgKGJmZF92bWEpIHJfb2Zmc2V0OwotCSAgICAgIHZhbCB8PSAoc3RhY2tbLS10b3NdICYgbWFzaykgPDwgKGJmZF92bWEpIHJfb2Zmc2V0OwotCSAgICAgIGJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsLAotCQkJICBjb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9HUFZBTFVFOgotCSAgLyogSSByZWFsbHkgZG9uJ3Qga25vdyBpZiB0aGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkgIGdwID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AgKyByX3N5bW5keDsKLQkgIGdwX3VuZGVmaW5lZCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmVsb2NhdGVwKQotCXsKLQkgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0JICBhc2VjdGlvbiAqcyA9IE5VTEw7Ci0JICBiZmRfdm1hIHJlbG9jYXRpb247Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotCSAgLyogUGVyZm9ybSBhIHJlbG9jYXRpb24uICAqLwotCi0JICBob3d0byA9ICZhbHBoYV9ob3d0b190YWJsZVtyX3R5cGVdOwotCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keF07Ci0JICAgICAgLyogSWYgaCBpcyBOVUxMLCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSByZWxvYwotCQkgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wgd2hpY2ggd2UgdGhvdWdodCB3YXMganVzdAotCQkgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gICovCi0JICAgICAgaWYgKGggPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChyX3N5bW5keCA+PSBOVU1fUkVMT0NfU0VDVElPTlMpCi0JCXMgPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJcyA9IHN5bW5keF90b19zZWN0aW9uW3Jfc3ltbmR4XTsKLQotCSAgICAgIGlmIChzID09IChhc2VjdGlvbiAqKSBOVUxMKQotCQlhYm9ydCAoKTsKLQkgICAgfQotCi0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIG11c3QKLQkJIGNvbnZlcnQgdGhlIGV4aXN0aW5nIHJlbG9jLiAgKi8KLQkgICAgICBpZiAocl9leHRlcm4pCi0JCXsKLQkJICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgICAgICYmIGgtPmluZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIHJlbG9jYXRpb24gPSBhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jIChvdXRwdXRfYmZkLAotCQkJCQkJCSAgICAgaW5mbywKLQkJCQkJCQkgICAgIGlucHV0X2JmZCwKLQkJCQkJCQkgICAgIGV4dF9yZWwsCi0JCQkJCQkJICAgICBoKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgQWRqdXN0Ci0JCSAgICAgdGhlIHZhbHVlIGJ5IHRoZSBhbW91bnQgdGhlIHNlY3Rpb24gbW92ZWQuICAqLwotCQkgIHJlbG9jYXRpb24gPSAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgcy0+b3V0cHV0X29mZnNldAotCQkJCS0gcy0+dm1hKTsKLQkJfQotCi0JICAgICAgLyogSWYgdGhpcyBpcyBQQyByZWxhdGl2ZSwgdGhlIGV4aXN0aW5nIG9iamVjdCBmaWxlCi0JCSBhcHBlYXJzIHRvIGFscmVhZHkgaGF2ZSB0aGUgcmVsb2Mgd29ya2VkIG91dC4gIFdlCi0JCSBtdXN0IHN1YnRyYWN0IG91dCB0aGUgb2xkIHZhbHVlIGFuZCBhZGQgaW4gdGhlIG5ldwotCQkgb25lLiAgKi8KLQkgICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQlyZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAgICAgLyogUHV0IGluIGFueSBhZGRlbmQuICAqLwotCSAgICAgIHJlbG9jYXRpb24gKz0gYWRkZW5kOwotCi0JICAgICAgLyogQWRqdXN0IHRoZSBjb250ZW50cy4gICovCi0JICAgICAgciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCSAgKGNvbnRlbnRzCi0JCQkJCSAgICsgcl92YWRkcgotCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBhcmUgcHJvZHVjaW5nIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCi0JICAgICAgaWYgKHJfZXh0ZXJuKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wuICAqLwotCQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpoc2VjOwotCi0JCSAgICAgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSAgICArIGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgKyBoc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHMtPm91dHB1dF9vZmZzZXQKLQkJCQktIHMtPnZtYSk7Ci0KLQkJICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZQotCQkgICAgIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgc291cmNlIHNlY3Rpb24uICAqLwotCQkgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0JCSAgICByZWxvY2F0aW9uICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQkJfQotCi0JICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCi0JCQkJCSAgICBpbnB1dF9iZmQsCi0JCQkJCSAgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsCi0JCQkJCSAgICByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQkgICAgcmVsb2NhdGlvbiwKLQkJCQkJICAgIGFkZGVuZCk7Ci0JICAgIH0KLQotCSAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICAgIGlmIChyX2V4dGVybikKLQkJICAgICAgbmFtZSA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdLT5yb290LnJvb3Quc3RyaW5nOwotCQkgICAgZWxzZQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkgICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bcl9zeW1uZHhdKTsKLQkJICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCQkgICAoaW5mbywgbmFtZSwgYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLAotCQkJICAgIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgJiYgYWRqdXN0X2FkZHJwKQotCXsKLQkgIC8qIENoYW5nZSB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbi4gICovCi0JICBiZmRfaF9wdXRfNjQgKGlucHV0X2JmZCwKLQkJCShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgLSBpbnB1dF9zZWN0aW9uLT52bWEKLQkJCSArIHJfdmFkZHIpLAotCQkJKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotCX0KLQotICAgICAgaWYgKGdwX3VzZWRwICYmIGdwX3VuZGVmaW5lZCkKLQl7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJIChpbmZvLCBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiKSwKLQkJICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KLQkgIGdwID0gNDsKLQkgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7Ci0JICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmICh0b3MgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIHRoZSBmaWxlaGRyIGFuZCB0aGUgYW91dGhkci4gIFRoaXMgcm91dGluZQotICAgc2V0cyB0aGUgZHluYW1pYyBiaXRzIGluIHRoZSBmaWxlIGhlYWRlci4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWFscGhhX2FkanVzdF9oZWFkZXJzIChhYmZkLCBmaGRyLCBhaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaGRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYWhkcjsKLXsKLSAgaWYgKChhYmZkLT5mbGFncyAmIChEWU5BTUlDIHwgRVhFQ19QKSkgPT0gKERZTkFNSUMgfCBFWEVDX1ApKQotICAgIGZoZHItPmZfZmxhZ3MgfD0gRl9BTFBIQV9DQUxMX1NIQVJFRDsKLSAgZWxzZSBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICBmaGRyLT5mX2ZsYWdzIHw9IEZfQUxQSEFfU0hBUkFCTEU7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogQXJjaGl2ZSBoYW5kbGluZy4gIEluIE9TRi8xIChvciBEaWdpdGFsIFVuaXgpIHYzLjIsIERpZ2l0YWwKLSAgIGludHJvZHVjZWQgYXJjaGl2ZSBwYWNraW5nLCBpbiB3aGljaCB0aGUgZWxlbWVudHMgaW4gYW4gYXJjaGl2ZSBhcmUKLSAgIG9wdGlvbmFsbHkgY29tcHJlc3NlZCB1c2luZyBhIHNpbXBsZSBkaWN0aW9uYXJ5IHNjaGVtZS4gIFdlIGtub3cKLSAgIGhvdyB0byByZWFkIHN1Y2ggYXJjaGl2ZXMsIGJ1dCB3ZSBkb24ndCB3cml0ZSB0aGVtLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lY29mZl9zbHVycF9hcm1hcCBfYmZkX2Vjb2ZmX3NsdXJwX2FybWFwCi0jZGVmaW5lIGFscGhhX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgYWxwaGFfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIGFscGhhX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSBfYmZkX2Vjb2ZmX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBhbHBoYV9lY29mZl93cml0ZV9hcm1hcCBfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwCi0jZGVmaW5lIGFscGhhX2Vjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBfYmZkX2Vjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBhbHBoYV9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIF9iZmRfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotCi0vKiBBIGNvbXByZXNzZWQgZmlsZSB1c2VzIHRoaXMgaW5zdGVhZCBvZiBBUkZNQUcuICAqLwotCi0jZGVmaW5lIEFSRlpNQUcgIlpcMDEyIgotCi0vKiBSZWFkIGFuIGFyY2hpdmUgaGVhZGVyLiAgVGhpcyBpcyBsaWtlIHRoZSBzdGFuZGFyZCByb3V0aW5lLCBidXQgaXQKLSAgIGFsc28gYWNjZXB0cyBBUkZaTUFHLiAgKi8KLQotc3RhdGljIFBUUgotYWxwaGFfZWNvZmZfcmVhZF9hcl9oZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqcmV0OwotICBzdHJ1Y3QgYXJfaGRyICpoOwotCi0gIHJldCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgKGFiZmQsIEFSRlpNQUcpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaCA9IChzdHJ1Y3QgYXJfaGRyICopIHJldC0+YXJjaF9oZWFkZXI7Ci0gIGlmIChzdHJuY21wIChoLT5hcl9mbWFnLCBBUkZaTUFHLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGFiWzhdOwotCi0gICAgICAvKiBUaGlzIGlzIGEgY29tcHJlc3NlZCBmaWxlLiAgV2UgbXVzdCBzZXQgdGhlIHNpemUgY29ycmVjdGx5LgotICAgICAgICAgVGhlIHNpemUgaXMgdGhlIGVpZ2h0IGJ5dGVzIGFmdGVyIHRoZSBkdW1teSBmaWxlIGhlYWRlci4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIEZJTEhTWiwgU0VFS19DVVIpICE9IDAKLQkgIHx8IGJmZF9yZWFkIChhYiwgMSwgOCwgYWJmZCkgIT0gOAotCSAgfHwgYmZkX3NlZWsgKGFiZmQsIC0gKEZJTEhTWiArIDgpLCBTRUVLX0NVUikgIT0gMCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgcmV0LT5wYXJzZWRfc2l6ZSA9IGJmZF9oX2dldF82NCAoYWJmZCwgYWIpOwotICAgIH0KLQotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBHZXQgYW4gYXJjaGl2ZSBlbGVtZW50IGF0IGEgc3BlY2lmaWVkIGZpbGUgcG9zaXRpb24uICBUaGlzIGlzIHdoZXJlCi0gICB3ZSB1bmNvbXByZXNzIHRoZSBhcmNoaXZlIGVsZW1lbnQgaWYgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFyY2hpdmUsIGZpbGVwb3MpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgYmZkICpuYmZkID0gTlVMTDsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqdGRhdGE7Ci0gIHN0cnVjdCBhcl9oZHIgKmhkcjsKLSAgYmZkX2J5dGUgYWJbOF07Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgYmZkX2J5dGUgKmJ1ZiwgKnA7Ci0gIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICpiaW07Ci0KLSAgbmJmZCA9IF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlcG9zKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoKG5iZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGFscmVhZHkgZXhwYW5kZWQgdGhpcyBCRkQuICAqLwotICAgICAgcmV0dXJuIG5iZmQ7Ci0gICAgfQotCi0gIHRkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgbmJmZC0+YXJlbHRfZGF0YTsKLSAgaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgdGRhdGEtPmFyY2hfaGVhZGVyOwotICBpZiAoc3RybmNtcCAoaGRyLT5hcl9mbWFnLCBBUkZaTUFHLCAyKSAhPSAwKQotICAgIHJldHVybiBuYmZkOwotCi0gIC8qIFdlIG11c3QgdW5jb21wcmVzcyB0aGlzIGVsZW1lbnQuICBXZSBkbyB0aGlzIGJ5IGNvcHlpbmcgaXQgaW50byBhCi0gICAgIG1lbW9yeSBidWZmZXIsIGFuZCBtYWtpbmcgYmZkX3JlYWQgYW5kIGJmZF9zZWVrIHVzZSB0aGF0IGJ1ZmZlci4KLSAgICAgVGhpcyBjYW4gdXNlIGEgbG90IG9mIG1lbW9yeSwgYnV0IGl0J3Mgc2ltcGxlciB0aGFuIGdldHRpbmcgYQotICAgICB0ZW1wb3JhcnkgZmlsZSwgbWFraW5nIHRoYXQgd29yayB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IgY2FjaGluZwotICAgICBjb2RlLCBhbmQgbWFraW5nIHN1cmUgdGhhdCBpdCBpcyBkZWxldGVkIGF0IGFsbCBhcHByb3ByaWF0ZQotICAgICB0aW1lcy4gIEl0IGNhbiBiZSBjaGFuZ2VkIGlmIGl0IGV2ZXIgYmVjb21lcyBpbXBvcnRhbnQuICAqLwotCi0gIC8qIFRoZSBjb21wcmVzc2VkIGZpbGUgc3RhcnRzIHdpdGggYSBkdW1teSBFQ09GRiBmaWxlIGhlYWRlci4gICovCi0gIGlmIChiZmRfc2VlayAobmJmZCwgRklMSFNaLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgbmV4dCBlaWdodCBieXRlcyBhcmUgdGhlIHJlYWwgZmlsZSBzaXplLiAgKi8KLSAgaWYgKGJmZF9yZWFkIChhYiwgMSwgOCwgbmJmZCkgIT0gOCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgc2l6ZSA9IGJmZF9oX2dldF82NCAobmJmZCwgYWIpOwotCi0gIGlmIChzaXplID09IDApCi0gICAgYnVmID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgbGVmdDsKLSAgICAgIGJmZF9ieXRlIGRpY3RbNDA5Nl07Ci0gICAgICB1bnNpZ25lZCBpbnQgaDsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG5iZmQsIHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgcCA9IGJ1ZjsKLQotICAgICAgbGVmdCA9IHNpemU7Ci0KLSAgICAgIC8qIEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBuZXh0IGVpZ2h0IGJ5dGVzIGFyZSBmb3IuICovCi0gICAgICBpZiAoYmZkX3JlYWQgKGFiLCAxLCA4LCBuYmZkKSAhPSA4KQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBUaGlzIGlzIHRoZSB1bmNvbXByZXNzaW9uIGFsZ29yaXRobS4gIEl0J3MgYSBzaW1wbGUKLQkgZGljdGlvbmFyeSBiYXNlZCBzY2hlbWUgaW4gd2hpY2ggZWFjaCBjaGFyYWN0ZXIgaXMgcHJlZGljdGVkCi0JIGJ5IGEgaGFzaCBvZiB0aGUgcHJldmlvdXMgdGhyZWUgY2hhcmFjdGVycy4gIEEgY29udHJvbCBieXRlCi0JIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgcHJlZGljdGVkIG9yIHdoZXRoZXIgaXQKLQkgYXBwZWFycyBpbiB0aGUgaW5wdXQgc3RyZWFtOyBlYWNoIGNvbnRyb2wgYnl0ZSBtYW5hZ2VzIHRoZQotCSBuZXh0IGVpZ2h0IGJ5dGVzIGluIHRoZSBvdXRwdXQgc3RyZWFtLiAgKi8KLSAgICAgIG1lbXNldCAoZGljdCwgMCwgc2l6ZW9mIGRpY3QpOwotICAgICAgaCA9IDA7Ci0gICAgICB3aGlsZSAoYmZkX3JlYWQgKCZiLCAxLCAxLCBuYmZkKSA9PSAxKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBiID4+PSAxKQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgbjsKLQotCSAgICAgIGlmICgoYiAmIDEpID09IDApCi0JCW4gPSBkaWN0W2hdOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIGJmZF9yZWFkICgmbiwgMSwgMSwgbmJmZCkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBkaWN0W2hdID0gbjsKLQkJfQotCi0JICAgICAgKnArKyA9IG47Ci0KLQkgICAgICAtLWxlZnQ7Ci0JICAgICAgaWYgKGxlZnQgPT0gMCkKLQkJYnJlYWs7Ci0KLQkgICAgICBoIDw8PSA0OwotCSAgICAgIGggXj0gbjsKLQkgICAgICBoICY9IHNpemVvZiBkaWN0IC0gMTsKLQkgICAgfQotCi0JICBpZiAobGVmdCA9PSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgdW5jb21wcmVzc2VkIGZpbGUgY29udGVudHMgYXJlIGluIGJ1Zi4gICovCi0gIGJpbSA9ICgoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikKLQkgYmZkX2FsbG9jIChuYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfaW5fbWVtb3J5KSkpOwotICBpZiAoYmltID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGJpbS0+c2l6ZSA9IHNpemU7Ci0gIGJpbS0+YnVmZmVyID0gYnVmOwotCi0gIG5iZmQtPm10aW1lX3NldCA9IHRydWU7Ci0gIG5iZmQtPm10aW1lID0gc3RydG9sIChoZHItPmFyX2RhdGUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0KLSAgbmJmZC0+ZmxhZ3MgfD0gQkZEX0lOX01FTU9SWTsKLSAgbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBiaW07Ci0gIEJGRF9BU1NFUlQgKCEgbmJmZC0+Y2FjaGVhYmxlKTsKLQotICByZXR1cm4gbmJmZDsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKG5iZmQgIT0gTlVMTCkKLSAgICBiZmRfY2xvc2UgKG5iZmQpOwotICByZXR1cm4gTlVMTDsgIAotfQotCi0vKiBPcGVuIHRoZSBuZXh0IGFyY2hpdmVkIGZpbGUuICAqLwotCi1zdGF0aWMgYmZkICoKLWFscGhhX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBmaWxlX3B0ciBmaWxlc3RhcnQ7Ci0KLSAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMKQotICAgIGZpbGVzdGFydCA9IGJmZF9hcmRhdGEgKGFyY2hpdmUpLT5maXJzdF9maWxlX2ZpbGVwb3M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJlbHRkYXRhICp0OwotICAgICAgc3RydWN0IGFyX2hkciAqaDsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAgICAgLyogV2UgY2FuJ3QgdXNlIGFyZWx0X3NpemUgaGVyZSwgYmVjYXVzZSB0aGF0IHVzZXMgcGFyc2VkX3NpemUsCi0gICAgICAgICB3aGljaCBpcyB0aGUgdW5jb21wcmVzc2VkIHNpemUuICBXZSBuZWVkIHRoZSBjb21wcmVzc2VkIHNpemUuICAqLwotICAgICAgdCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGxhc3RfZmlsZS0+YXJlbHRfZGF0YTsKLSAgICAgIGggPSAoc3RydWN0IGFyX2hkciAqKSB0LT5hcmNoX2hlYWRlcjsKLSAgICAgIHNpemUgPSBzdHJ0b2wgKGgtPmFyX3NpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0KLSAgICAgIC8qIFBhZCB0byBhbiBldmVuIGJvdW5kYXJ5Li4uCi0JIE5vdGUgdGhhdCBsYXN0X2ZpbGUtPm9yaWdpbiBjYW4gYmUgb2RkIGluIHRoZSBjYXNlIG9mCi0JIEJTRC00LjQtc3R5bGUgZWxlbWVudCB3aXRoIGEgbG9uZyBvZGQgc2l6ZS4gKi8KLSAgICAgIGZpbGVzdGFydCA9IGxhc3RfZmlsZS0+b3JpZ2luICsgc2l6ZTsKLSAgICAgIGZpbGVzdGFydCArPSBmaWxlc3RhcnQgJSAyOwotICAgIH0KLQotICByZXR1cm4gYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlc3RhcnQpOwotfQotCi0vKiBPcGVuIHRoZSBhcmNoaXZlIGZpbGUgZ2l2ZW4gYW4gaW5kZXggaW50byB0aGUgYXJtYXAuICAqLwotCi1zdGF0aWMgYmZkICoKLWFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN5bWluZGV4IGluZGV4OwotewotICBjYXJzeW0gKmVudHJ5OwotCi0gIGVudHJ5ID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgKyBpbmRleDsKLSAgcmV0dXJuIGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyAoYWJmZCwgZW50cnktPmZpbGVfb2Zmc2V0KTsKLX0KLQwKLS8qIFRoaXMgaXMgdGhlIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhlIGJhY2tlbmQgZmllbGQgb2YgdGhlCi0gICB0YXJnZXQgdmVjdG9yIHBvaW50cyB0byB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhID0KLXsKLSAgLyogQ09GRiBiYWNrZW5kIHN0cnVjdHVyZS4gICovCi0gIHsKLSAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLGludCxpbnQsaW50LGludCxQVFIpKSkgYmZkX3ZvaWQsIC8qIGF1eF9pbiAqLwotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBzeW1faW4gKi8KLSAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogbGluZW5vX2luICovCi0gICAgKHVuc2lnbmVkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKWJmZF92b2lkLC8qYXV4X291dCovCi0gICAgKHVuc2lnbmVkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBzeW1fb3V0ICovCi0gICAgKHVuc2lnbmVkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9fb3V0ICovCi0gICAgKHVuc2lnbmVkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiByZWxvY19vdXQgKi8KLSAgICBhbHBoYV9lY29mZl9zd2FwX2ZpbGVoZHJfb3V0LCBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfb3V0LAotICAgIGFscGhhX2Vjb2ZmX3N3YXBfc2NuaGRyX291dCwKLSAgICBGSUxIU1osIEFPVVRTWiwgU0NOSFNaLCAwLCAwLCAwLCAwLCBGSUxOTUxFTiwgdHJ1ZSwgZmFsc2UsIDQsCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX2luLCBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfaW4sCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9zY25oZHJfaW4sIE5VTEwsCi0gICAgYWxwaGFfZWNvZmZfYmFkX2Zvcm1hdF9ob29rLCBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgICBhbHBoYV9lY29mZl9ta29iamVjdF9ob29rLCBfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzLAotICAgIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rLCBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwKLSAgfSwKLSAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCi0gIGJmZF9hcmNoX2FscGhhLAotICAvKiBJbml0aWFsIHBvcnRpb24gb2YgYXJtYXAgc3RyaW5nLiAgKi8KLSAgIl9fX19fX19fNjQiLAotICAvKiBUaGUgcGFnZSBib3VuZGFyeSB1c2VkIHRvIGFsaWduIHNlY3Rpb25zIGluIGEgZGVtYW5kLXBhZ2VkCi0gICAgIGV4ZWN1dGFibGUgZmlsZS4gIEUuZy4sIDB4MTAwMC4gICovCi0gIDB4MjAwMCwKLSAgLyogVHJ1ZSBpZiB0aGUgLnJkYXRhIHNlY3Rpb24gaXMgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LCBhcyBvbiB0aGUKLSAgICAgQWxwaGEuICBGYWxzZSBpZiAucmRhdGEgaXMgcGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LCBhcyBvbiB0aGUKLSAgICAgTUlQUy4gICovCi0gIHRydWUsCi0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIDY0LAotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICAmYWxwaGFfaG93dG9fdGFibGVbQUxQSEFfUl9SRUZRVUFEXSwKLSAgewotICAgIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICAgIG1hZ2ljU3ltMiwKLSAgICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gICAgOCwKLSAgICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gICAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gICAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9zeW1faW4sCi0gICAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gICAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gICAgZWNvZmZfc3dhcF9leHRfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICAgIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICAgIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gICAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KLSAgfSwKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIFJFTFNaLAotICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLwotICBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luLAotICBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCwKLSAgLyogQmFja2VuZCByZWxvYyB0d2Vha2luZy4gICovCi0gIGFscGhhX2FkanVzdF9yZWxvY19pbiwKLSAgYWxwaGFfYWRqdXN0X3JlbG9jX291dCwKLSAgLyogUmVsb2NhdGUgc2VjdGlvbiBjb250ZW50cyB3aGlsZSBsaW5raW5nLiAgKi8KLSAgYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiwKLSAgLyogRG8gZmluYWwgYWRqdXN0bWVudHMgdG8gZmlsZWhkciBhbmQgYW91dGhkci4gICovCi0gIGFscGhhX2FkanVzdF9oZWFkZXJzLAotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gICovCi0gIGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcwotfTsKLQotLyogTG9va2luZyB1cCBhIHJlbG9jIHR5cGUgaXMgQWxwaGEgc3BlY2lmaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogU28gaXMgZ2V0dGluZyByZWxvY2F0ZWQgc2VjdGlvbiBjb250ZW50cy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0vKiBIYW5kbGluZyBmaWxlIHdpbmRvd3MgaXMgZ2VuZXJpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0vKiBSZWxheGluZyBzZWN0aW9ucyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLWNvbnN0IGJmZF90YXJnZXQgZWNvZmZhbHBoYV9saXR0bGVfdmVjID0KLXsKLSAgImVjb2ZmLWxpdHRsZWFscGhhIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgYWxwaGFfZWNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl9ta29iamVjdCwgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChhbHBoYV9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpICZhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hcG9sbG8uYyBiL2JmZC9jb2ZmLWFwb2xsby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDc1ZDUyLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFwb2xsby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQXBvbGxvIDY4MDAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuZWR1LmF1KQotICAgQmFzZWQgb24gbTY4ayBzdGFuZGFyZCBDT0ZGIHZlcnNpb24gV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9hcG9sbG8uaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiByZWxvY19ob3d0b190eXBlIGFwb2xsb2NvZmZfaG93dG9fdGFibGVbXTsKLSNlbHNlCi1yZWxvY19ob3d0b190eXBlIGFwb2xsb2NvZmZfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1JFTEJZVEUsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTFdPUkQsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkcsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkJZVEUsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AxNiIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSTE9ORywJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkdfTkVHLAkgICAgICAgMCwgIC0yLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIi0zMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLSNlbmRpZiAvKiBub3QgT05MWV9ERUNMQVJFX1JFTE9DUyAqLwotCi0jaWZuZGVmIEJBRE1BRwotI2RlZmluZSBCQURNQUcoeCkgTTY4S0JBRE1BRyh4KQotI2VuZGlmCi0jZGVmaW5lIEFQT0xMT19NNjggMQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiB2b2lkIGFwb2xsb19ydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICppbnRlcm5hbCwgaW50IHJlbG9jZW50cnkpKTsKLWV4dGVybiBpbnQgYXBvbGxvX2hvd3RvMnJ0eXBlIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKikpOwotI2Vsc2UKLXZvaWQKLWFwb2xsb19ydHlwZTJob3d0byhpbnRlcm5hbCwgcmVsb2NlbnRyeSkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIGludCByZWxvY2VudHJ5OwotewotICBzd2l0Y2ggKHJlbG9jZW50cnkpIAotICB7Ci0gICBjYXNlIFJfUkVMQllURToJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDA7IGJyZWFrOwotICAgY2FzZSBSX1JFTFdPUkQ6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAxOyBicmVhazsKLSAgIGNhc2UgUl9SRUxMT05HOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgMjsgYnJlYWs7Ci0gICBjYXNlIFJfUENSQllURToJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDM7IGJyZWFrOwotICAgY2FzZSBSX1BDUldPUkQ6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyA0OyBicmVhazsKLSAgIGNhc2UgUl9QQ1JMT05HOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9OR19ORUc6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyA2OyBicmVhazsKLSAgfQotfQotCi1pbnQgCi1hcG9sbG9faG93dG8ycnR5cGUgKGludGVybmFsKQotICAgICByZWxvY19ob3d0b190eXBlICppbnRlcm5hbDsKLXsKLSAgaWYgKGludGVybmFsLT5wY19yZWxhdGl2ZSkgCi0gIHsKLSAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKSAKLSAgICB7Ci0gICAgIGNhc2UgMzI6IHJldHVybiBSX1BDUkxPTkc7Ci0gICAgIGNhc2UgMTY6IHJldHVybiBSX1BDUldPUkQ7Ci0gICAgIGNhc2UgODogcmV0dXJuIFJfUENSQllURTsKLSAgICB9Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkKLSAgICAgewotICAgICAgY2FzZSAzMjogcmV0dXJuIFJfUkVMTE9ORzsKLSAgICAgIGNhc2UgMTY6IHJldHVybiBSX1JFTFdPUkQ7Ci0gICAgICBjYXNlIDg6IHJldHVybiBSX1JFTEJZVEU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gUl9SRUxMT05HOyAgICAKLX0KLSNlbmRpZiAvKiBub3QgT05MWV9ERUNMQVJFX1JFTE9DUyAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBcCi0gIGFwb2xsb19ydHlwZTJob3d0byhpbnRlcm5hbCwgKHJlbG9jZW50cnkpLT5yX3R5cGUpCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGV4dGVybmFsLCBpbnRlcm5hbCkgXAotICBleHRlcm5hbC5yX3R5cGUgPSBhcG9sbG9faG93dG8ycnR5cGUoaW50ZXJuYWwpOwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI2lmbmRlZiBUQVJHRVRfU1lNCi0jZGVmaW5lIFRBUkdFVF9TWU0gYXBvbGxvY29mZl92ZWMKLSNlbmRpZgotCi0jaWZuZGVmIFRBUkdFVF9OQU1FCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJhcG9sbG8tbTY4ayIKLSNlbmRpZgotCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIDAsIDAsICdfJywgTlVMTCkKLSNlbHNlCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIDAsIDAsIDAsIE5VTEwpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWFybS5jIGIvYmZkL2NvZmYtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODliODQuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvYXJtLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogTWFjcm9zIGZvciBtYW5pcHVsYXRpb24gdGhlIGJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIHRoZSBjb2ZmIGRhdGEKLSAgIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIEFQQ1NfMjZfRkxBRyggICAgICAgYWJmZCApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfQVBDU18yNikKLSNkZWZpbmUgQVBDU19GTE9BVF9GTEFHKCAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX0ZMT0FUKQotI2RlZmluZSBQSUNfRkxBRyggICAgICAgICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX1BJQykKLSNkZWZpbmUgQVBDU19TRVQoICAgICAgICAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX1NFVCkKLSNkZWZpbmUgU0VUX0FQQ1NfRkxBR1MoICAgICBhYmZkLCBmbGdzKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgPSBcCi0JCQkJCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIH4gKEZfQVBDU18yNiB8IEZfQVBDU19GTE9BVCB8IEZfUElDKSkgXAotCQkJCQkgfCAoZmxncyB8IEZfQVBDU19TRVQpKQotI2RlZmluZSBJTlRFUldPUktfRkxBRyggICAgIGFiZmQgKSAJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9JTlRFUldPUkspCi0jZGVmaW5lIElOVEVSV09SS19TRVQoICAgICAgYWJmZCApIAkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0lOVEVSV09SS19TRVQpCi0jZGVmaW5lIFNFVF9JTlRFUldPUktfRkxBRyggYWJmZCwgZmxnICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzID0gXAotCQkJCQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiB+IEZfSU5URVJXT1JLKSBcCi0JCQkJCSB8IChmbGcgfCBGX0lOVEVSV09SS19TRVQpKQotCi0jaWZuZGVmIE5VTV9FTEVNCi0jZGVmaW5lIE5VTV9FTEVNKGEpICgoc2l6ZW9mIChhKSkgLyBzaXplb2YgKChhKVswXSkpCi0jZW5kaWYKLSAgICAgCi10eXBlZGVmIGVudW0ge2J1bmtub3duLCBiOSwgYjEyLCBiMjN9IHRodW1iX3BjcmVsX2JyYW5jaHR5cGU7Ci0vKiBzb21lIHR5cGVkZWZzIGZvciBob2xkaW5nIGluc3RydWN0aW9ucyAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBpbnNuMzI7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBpbnNuMTY7Ci0KLQotICAgICAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3Igc3R1cGlkIGNvbXBpbGVycy4gICovCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLSAgICAgICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYW91dGFybV9maXhfcGNyZWxfMjZfZG9uZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYW91dGFybV9maXhfcGNyZWxfMjYKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfdGh1bWJfcGNyZWxfMjMKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfdGh1bWJfcGNyZWxfMTIKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfdGh1bWJfcGNyZWxfOQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl9hcm1fcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9hZGp1c3Rfc3ltbmR4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkgICBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwJYm9vbGVhbiAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvIAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfdGh1bWJfcGNyZWxfY29tbW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKiwKLQkgICB0aHVtYl9wY3JlbF9icmFuY2h0eXBlKSk7Ci1zdGF0aWMgQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqIGNvZmZfYXJtX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqIGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnNuMzIgaW5zZXJ0X3RodW1iX2JyYW5jaAotICBQQVJBTVMgKChpbnNuMzIsIGludCkpOwotc3RhdGljIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGZpbmRfdGh1bWJfZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBDT05TVCBjaGFyICosIGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogZmluZF9hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBDT05TVCBjaGFyICosIGJmZCAqKSk7Ci0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotc3RhdGljIHZvaWQgcmVjb3JkX2FybV90b190aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLSNlbmRpZgotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOwotCi0vKiBUaGUgbGlua2VyIHNjcmlwdCBrbm93cyB0aGUgc2VjdGlvbiBuYW1lcyBmb3IgcGxhY2VtZW50LgotICAgVGhlIGVudHJ5X25hbWVzIGFyZSB1c2VkIHRvIGRvIHNpbXBsZSBuYW1lIG1hbmdsaW5nIG9uIHRoZSBzdHVicy4KLSAgIEdpdmVuIGEgZnVuY3Rpb24gbmFtZSwgYW5kIGl0cyB0eXBlLCB0aGUgc3R1YiBjYW4gYmUgZm91bmQuIFRoZQotICAgbmFtZSBjYW4gYmUgY2hhbmdlZC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhlICVzIGJlIHByZXNlbnQuCi0gICAqLwotICAgCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfN3QiCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUgICAiX18lc19mcm9tX3RodW1iIgotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfNyIKLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fYXJtIgotCi0vKiBVc2VkIGJ5IHRoZSBhc3NlbWJsZXIuICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX2FybV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW12YWx1ZSBkaWZmOwotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgICBpZiAoZGlmZiAhPSAwKQotICAgICAgewotCXJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLQlzd2l0Y2ggKGhvd3RvLT5zaXplKQotCSAgewotCSAgY2FzZSAwOgotCSAgICB7Ci0JICAgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDE6Ci0JICAgIHsKLQkgICAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgewotCSAgICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBJZiBVU0VSX0xBQkVMX1BSRUZJWCBpcyBkZWZpbmVkIGFzICJfIiAoc2VlIGNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUoKQotICAgaW4gdGhpcyBmaWxlKSwgdGhlbiBUQVJHRVRfVU5ERVJTQ09SRSBzaG91bGQgYmUgZGVmaW5lZCwgb3RoZXJ3aXNlIGl0Ci0gICBzaG91bGQgbm90LiAgKi8KLSNpZm5kZWYgVEFSR0VUX1VOREVSU0NPUkUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCi0jZW5kaWYKLQotI2lmbmRlZiBQQ1JFTE9GRlNFVAotI2RlZmluZSBQQ1JFTE9GRlNFVCB0cnVlCi0jZW5kaWYKLQotLyogVGhlc2UgbW9zdCBjZXJ0YWlubHkgYmVsb25nIHNvbWV3aGVyZSBlbHNlLiBKdXN0IGhhZCB0byBnZXQgcmlkIG9mCi0gICB0aGUgbWFuaWZlc3QgY29uc3RhbnRzIGluIHRoZSBjb2RlLiAgKi8KLSNkZWZpbmUgQVJNXzggICAgICAgIDAKLSNkZWZpbmUgQVJNXzE2ICAgICAgIDEKLSNkZWZpbmUgQVJNXzMyICAgICAgIDIKLSNkZWZpbmUgQVJNXzI2ICAgICAgIDMKLSNkZWZpbmUgQVJNX0RJU1A4ICAgIDQKLSNkZWZpbmUgQVJNX0RJU1AxNiAgIDUKLSNkZWZpbmUgQVJNX0RJU1AzMiAgIDYKLSNkZWZpbmUgQVJNXzI2RCAgICAgIDcKLS8qIDggaXMgdW51c2VkICovCi0jZGVmaW5lIEFSTV9ORUcxNiAgICA5Ci0jZGVmaW5lIEFSTV9ORUczMiAgIDEwCi0jZGVmaW5lIEFSTV9SVkEzMiAgIDExCi0jZGVmaW5lIEFSTV9USFVNQjkgIDEyCi0jZGVmaW5lIEFSTV9USFVNQjEyIDEzCi0jZGVmaW5lIEFSTV9USFVNQjIzIDE0Ci0KLSNpZmRlZiBBUk1fV0lOQ0UKLSN1bmRlZiAgQVJNXzMyCi0jdW5kZWYgIEFSTV9SVkEzMgotI3VuZGVmICBBUk1fMjYKLSN1bmRlZiAgQVJNX1RIVU1CMTIKLSN1bmRlZiAgQVJNXzI2RAotCi0jZGVmaW5lIEFSTV8zMiAgICAgICAxCi0jZGVmaW5lIEFSTV9SVkEzMiAgICAyCi0jZGVmaW5lIEFSTV8yNgkgICAgIDMKLSNkZWZpbmUgQVJNX1RIVU1CMTIgIDQKLSNkZWZpbmUgQVJNXzI2RCAgICAgIDUKLSNkZWZpbmUgQVJNX1NFQ1RJT04gIDE0Ci0jZGVmaW5lIEFSTV9TRUNSRUwgICAxNQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvW10gPSAKLXsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotI2lmZGVmIEFSTV9XSU5DRQotICBFTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTyAoQVJNXzMyLCAKLQkwLAotCTIsIAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV8zMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8gKEFSTV9SVkEzMiwgCi0JMCwKLQkyLCAKLQkzMiwKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fUlZBMzIiLAotICAgICAgICB0cnVlLAotCTB4ZmZmZmZmZmYsCi0JMHhmZmZmZmZmZiwKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPIChBUk1fMjYsCi0JMiwKLQkyLAotCTI0LAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JYW91dGFybV9maXhfcGNyZWxfMjYgLAotCSJBUk1fMjYiLAotCWZhbHNlLAotCTB4MDBmZmZmZmYsCi0JMHgwMGZmZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyAoQVJNX1RIVU1CMTIsCi0JMSwKLQkxLAotCTExLAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JY29mZl90aHVtYl9wY3JlbF8xMiAsCi0JIkFSTV9USFVNQjEyIiwKLQlmYWxzZSwKLQkweDAwMDAwN2ZmLAotCTB4MDAwMDA3ZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8gKEFSTV8yNkQsICAKLQkyLCAKLQkyLAotCTI0LAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQlhb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lLCAKLQkiQVJNXzI2RCIsCi0JdHJ1ZSwKLQkweDAwZmZmZmZmLAotCTB4MCwKLQlmYWxzZSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPIChBUk1fU0VDVElPTiwgIAotCTAsIAotCTEsIAotCTE2LCAKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fMTYiLCAKLQl0cnVlLAotCTB4MDAwMGZmZmYsCi0JMHgwMDAwZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyAoQVJNX1NFQ1JFTCwgCi0JMCwKLQkyLCAKLQkzMiwKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fMzIiLAotICAgICAgICB0cnVlLAotCTB4ZmZmZmZmZmYsCi0JMHhmZmZmZmZmZiwKLQlQQ1JFTE9GRlNFVCksCi0jZWxzZSAvKiBub3QgQVJNX1dJTkNFICovCi0gIEhPV1RPKEFSTV84LAkJCS8qIHR5cGUgKi8KLQkwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkwLAkJCS8qIHNpemUgKi8KLQk4LAkJCS8qIGJpdHNpemUgKi8KLQlmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCTAsCQkJLyogYml0cG9zICovCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JY29mZl9hcm1fcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JIkFSTV84IiwJCS8qIG5hbWUgKi8KLSAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQlQQ1JFTE9GRlNFVAkJLyogcGNyZWxfb2Zmc2V0ICovKSwKLSAgSE9XVE8oQVJNXzE2LCAgCi0JMCwgCi0JMSwgCi0JMTYsIAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV8xNiIsIAotCXRydWUsCi0JMHgwMDAwZmZmZiwKLQkweDAwMDBmZmZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKEFSTV8zMiwgCi0JMCwKLQkyLCAKLQkzMiwKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fMzIiLAotICAgICAgICB0cnVlLAotCTB4ZmZmZmZmZmYsCi0JMHhmZmZmZmZmZiwKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKEFSTV8yNiwKLQkyLAotCTIsCi0JMjQsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQlhb3V0YXJtX2ZpeF9wY3JlbF8yNiAsCi0JIkFSTV8yNiIsCi0JZmFsc2UsCi0JMHgwMGZmZmZmZiwKLQkweDAwZmZmZmZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKEFSTV9ESVNQOCwgICAgICAgIAotCTAsCi0JMCwKLQk4LCAKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX0RJU1A4IiwgIAotCXRydWUsCi0JMHgwMDAwMDBmZiwKLQkweDAwMDAwMGZmLAotCXRydWUpLAotICBIT1dUTyggQVJNX0RJU1AxNiwgCi0JMCwKLQkxLAotCTE2LAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fRElTUDE2IiwKLQl0cnVlLAotCTB4MDAwMGZmZmYsCi0JMHgwMDAwZmZmZiwKLQl0cnVlKSwKLSAgSE9XVE8oIEFSTV9ESVNQMzIsCi0JMCwKLQkyLAotCTMyLAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIAotIAljb2ZmX2FybV9yZWxvYywKLQkiQVJNX0RJU1AzMiIsCi0JdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JdHJ1ZSksCi0gIEhPV1RPKCBBUk1fMjZELCAgCi0JMiwgCi0JMiwKLQkyNCwKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JYW91dGFybV9maXhfcGNyZWxfMjZfZG9uZSwgCi0JIkFSTV8yNkQiLAotCXRydWUsCi0JMHgwMGZmZmZmZiwKLQkweDAsCi0JZmFsc2UpLAotICAvKiA4IGlzIHVudXNlZCAqLwotICBFTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTyggQVJNX05FRzE2LAotCTAsCi0JLTEsCi0JMTYsCi0JZmFsc2UsCi0JMCwgCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ORUcxNiIsCi0gICAgICAgIHRydWUsIAotCTB4MDAwMGZmZmYsCi0JMHgwMDAwZmZmZiwgCi0JZmFsc2UpLAotICBIT1dUTyggQVJNX05FRzMyLCAKLQkwLCAKLQktMiwKLQkzMiwKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fTkVHMzIiLAotICAgICAgICB0cnVlLAotCTB4ZmZmZmZmZmYsCi0JMHhmZmZmZmZmZiwKLQlmYWxzZSksCi0gIEhPV1RPKCBBUk1fUlZBMzIsIAotCTAsCi0JMiwgCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX1JWQTMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyggQVJNX1RIVU1COSwKLQkxLAotCTEsCi0JOCwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWNvZmZfdGh1bWJfcGNyZWxfOSAsCi0JIkFSTV9USFVNQjkiLAotCWZhbHNlLAotCTB4MDAwMDAwZmYsCi0JMHgwMDAwMDBmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyggQVJNX1RIVU1CMTIsCi0JMSwKLQkxLAotCTExLAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JY29mZl90aHVtYl9wY3JlbF8xMiAsCi0JIkFSTV9USFVNQjEyIiwKLQlmYWxzZSwKLQkweDAwMDAwN2ZmLAotCTB4MDAwMDA3ZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oIEFSTV9USFVNQjIzLAotCTEsCi0JMiwKLQkyMiwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWNvZmZfdGh1bWJfcGNyZWxfMjMgLAotCSJBUk1fVEhVTUIyMyIsCi0JZmFsc2UsCi0JMHgwN2ZmMDdmZiwKLQkweDA3ZmYwN2ZmLCAKLQlQQ1JFTE9GRlNFVCkKLSNlbmRpZiAvKiBub3QgQVJNX1dJTkNFICovCi19OwotCi0jZGVmaW5lIE5VTV9SRUxPQ1MgTlVNX0VMRU0gKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gc2hvdWxkCi0gICBhcHBlYXIgaW4gdGhlIG91dHB1dCAucmVsb2Mgc2VjdGlvbi4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWluX3JlbG9jX3AgKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLXsKLSAgcmV0dXJuICFob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnR5cGUgIT0gQVJNX1JWQTMyOwotfSAgICAgCi0jZW5kaWYKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkJCVwKLSAgKGNhY2hlX3B0ciktPmhvd3RvID0JCQkJXAotICAgIChkc3QpLT5yX3R5cGUgPCBOVU1fUkVMT0NTCQkJXAotICAgID8gYW91dGFybV9zdGRfcmVsb2NfaG93dG8gKyAoZHN0KS0+cl90eXBlCVwKLSAgICA6IE5VTEwKLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqIGhvd3RvOwotCi0gIGlmIChyZWwtPnJfdHlwZSA+PSBOVU1fUkVMT0NTKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgaG93dG8gPSBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byArIHJlbC0+cl90eXBlOwotCi0gIGlmIChyZWwtPnJfdHlwZSA9PSBBUk1fUlZBMzIpCi0gICAgKmFkZGVuZHAgLT0gcGVfZGF0YSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCi0gIHJldHVybiBob3d0bzsKLX0KLS8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYW91dGFybV9maXhfcGNyZWxfMjZfZG9uZSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVXNlZCBieSB0aGUgYXNzZW1ibGVyLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hb3V0YXJtX2ZpeF9wY3JlbF8yNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICAKLSAgaWYgKHJlbG9jYXRpb24gJiAzKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgMHgwMjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweDAzZmZmZmZmKSAhPSB+IChiZmRfdm1hKSAweDAzZmZmZmZmKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfjB4MDNmZmZmZmYpCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfjB4MDBmZmZmZmY7Ci0gIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmYW91dGFybV9zdGRfcmVsb2NfaG93dG9bQVJNXzI2RF07Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGJ0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB0aHVtYl9wY3JlbF9icmFuY2h0eXBlIGJ0eXBlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb24gPSAwOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB0YXJnZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSBkc3Rtc2s7Ci0gIGJmZF92bWEgb2ZmbXNrOwotICBiZmRfdm1hIHNpZ25iaXQ7Ci0KLSAgLyogTk9URTogVGhpcyByb3V0aW5lIGlzIGN1cnJlbnRseSB1c2VkIGJ5IEdBUywgYnV0IG5vdCBieSB0aGUgbGluawotICAgICBwaGFzZS4gICovCi0KLSAgc3dpdGNoIChidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBiOToKLSAgICAgIGRzdG1zayAgPSAweDAwMDAwMGZmOwotICAgICAgb2ZmbXNrICA9IDB4MDAwMDAxZmU7Ci0gICAgICBzaWduYml0ID0gMHgwMDAwMDEwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiMTI6Ci0gICAgICBkc3Rtc2sgID0gMHgwMDAwMDdmZjsKLSAgICAgIG9mZm1zayAgPSAweDAwMDAwZmZlOwotICAgICAgc2lnbmJpdCA9IDB4MDAwMDA4MDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYjIzOgotICAgICAgZHN0bXNrICA9IDB4MDdmZjA3ZmY7Ci0gICAgICBvZmZtc2sgID0gMHgwMDdmZmZmZjsKLSAgICAgIHNpZ25iaXQgPSAweDAwNDAwMDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHN3aXRjaCAoYnR5cGUpCi0gICAgewotICAgIGNhc2UgYjk6Ci0gICAgY2FzZSBiMTI6Ci0gICAgICByZWxvY2F0aW9uID0gKCh0YXJnZXQgJiBkc3Rtc2spIDw8IDEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGIyMzoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgMHg3ZmYpIDw8IDEpICB8ICgodGFyZ2V0ICYgMHgwN2ZmMDAwMCkgPj4gNCk7Ci0gICAgICBlbHNlCi0JcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgMHg3ZmYpIDw8IDEyKSB8ICgodGFyZ2V0ICYgMHgwN2ZmMDAwMCkgPj4gMTUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiBeIHNpZ25iaXQpIC0gc2lnbmJpdDsgLyogU2lnbiBleHRlbmQgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnZhbHVlOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcjsKLQotICBpZiAocmVsb2NhdGlvbiAmIDEpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgaWYgKHJlbG9jYXRpb24gJiBzaWduYml0KQotICAgIHsKLSAgICAgIGlmICgocmVsb2NhdGlvbiAmIH5vZmZtc2spICE9IH5vZmZtc2spCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+b2ZmbXNrKQotICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgdGFyZ2V0ICY9IH5kc3Rtc2s7Ci0gIHN3aXRjaCAoYnR5cGUpCi0gICB7Ci0gICBjYXNlIGI5OgotICAgY2FzZSBiMTI6Ci0gICAgIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAxKTsKLSAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgYjIzOgotICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgICAgIHRhcmdldCB8PSAoKHJlbG9jYXRpb24gJiAweGZmZikgPj4gMSkgIHwgKChyZWxvY2F0aW9uIDw8IDQpICAmIDB4MDdmZjAwMDApOwotICAgICBlbHNlCi0gICAgICAgdGFyZ2V0IHw9ICgocmVsb2NhdGlvbiAmIDB4ZmZlKSA8PCAxNSkgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpOwotICAgICBicmVhazsKLQotICAgZGVmYXVsdDoKLSAgICAgYWJvcnQgKCk7Ci0gICB9Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgotICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCi0gIHJlbG9jX2VudHJ5LT5ob3d0byA9ICYgYW91dGFybV9zdGRfcmVsb2NfaG93dG8gW0FSTV8yNkRdOwotICAKLSAgLyogVE9ETzogV2Ugc2hvdWxkIHBvc3NpYmx5IGhhdmUgRE9ORSBlbnRyaWVzIGZvciB0aGUgVEhVTUIgUENSRUwgcmVsb2NhdGlvbnMgKi8KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfMjMgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBiMjMpOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX3RodW1iX3BjcmVsXzEyIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjEyKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl90aHVtYl9wY3JlbF85IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjkpOwotfQotCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLWNvZmZfYXJtX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICAgYmZkICogYWJmZDsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotI2RlZmluZSBBU1REKGksaikgICAgICAgY2FzZSBpOiByZXR1cm4gYW91dGFybV9zdGRfcmVsb2NfaG93dG8gKyBqCi0gIAotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIDA7Ci0gICAgICB9Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSNpZmRlZiBBUk1fV0lOQ0UKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMiwgICAgICAgICAgICAgICAgICAgQVJNXzMyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19SVkEsICAgICAgICAgICAgICAgICAgQVJNX1JWQTMyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAgICAgQVJNXzI2KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiwgQVJNX1RIVU1CMTIpOwotI2Vsc2UKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ184LCAgICAgICAgICAgICAgICAgICAgQVJNXzgpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2LCAgICAgICAgICAgICAgICAgICBBUk1fMTYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBBUk1fMzIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsICAgICBBUk1fMjYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzhfUENSRUwsICAgICAgICAgICAgICBBUk1fRElTUDgpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCAgICAgICAgICAgICBBUk1fRElTUDE2KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgQVJNX0RJU1AzMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfUlZBLCAgICAgICAgICAgICAgICAgIEFSTV9SVkEzMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOSwgIEFSTV9USFVNQjkpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLCBBUk1fVEhVTUIxMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsIEFSTV9USFVNQjIzKTsKLSNlbmRpZiAgICAgIAotICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgIH0KLX0KLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIEFSTUJBRE1BRyh4KQotI2RlZmluZSBBUk0gMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgQVJNIHNwZWNpZmljIGZpZWxkcy4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCi1zdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBvcmlnaW5hbCBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUuICBNVVNUIGJlIGZpcnN0IGZpZWxkLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCXJvb3Q7Ci0gIAotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgVGh1bWItdG8tQVJNIGdsdWUuICAqLwotICBsb25nIGludCAJCQl0aHVtYl9nbHVlX3NpemU7Ci0gIAotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgQVJNLXRvLVRodW1iIGdsdWUuICAqLwotICBsb25nIGludCAJCQlhcm1fZ2x1ZV9zaXplOwotCi0gIC8qIEFuIGFyYml0YXJ5IGlucHV0IEJGRCBjaG9zZW4gdG8gaG9sZCB0aGUgZ2x1ZSBzZWN0aW9ucy4gICovCi0gIGJmZCAqCQkJCWJmZF9vZl9nbHVlX293bmVyOwotCi0gIC8qIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkLCBub24taW50ZXJ3b3JraW5nIGF3YXJlIEFSTSBjb2RlLiAqLwotICBpbnQgCQkJCXN1cHBvcnRfb2xkX2NvZGU7Ci19OwotCi0vKiBHZXQgdGhlIEFSTSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgY29mZl9hcm1faGFzaF90YWJsZShpbmZvKSBcCi0gICgoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSAoKGluZm8pLT5oYXNoKSkKLQotLyogQ3JlYXRlIGFuIEFSTSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiByZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gICAgICAoJiByZXQtPnJvb3QsIGFiZmQsIF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+dGh1bWJfZ2x1ZV9zaXplICAgPSAwOwotICByZXQtPmFybV9nbHVlX3NpemUgICAgID0gMDsKLSAgcmV0LT5iZmRfb2ZfZ2x1ZV9vd25lciA9IE5VTEw7Ci0KLSAgcmV0dXJuICYgcmV0LT5yb290LnJvb3Q7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jX29mZnNldCkKLSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgICBiZmRfdm1hIHJlbG9jX29mZnNldDsKLXsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2Nfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEKLSAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKLSAgICAgYWRkciAtPSBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICBmd3JpdGUgKCZhZGRyLCAxLCBzaXplb2YgKGFkZHIpLCAoRklMRSAqKSBpbmZvLT5iYXNlX2ZpbGUpOwotCi19Ci0MCi0vKiBUaGUgdGh1bWIgZm9ybSBvZiBhIGxvbmcgYnJhbmNoIGlzIGEgYml0IGZpbmlja3ksIGJlY2F1c2UgdGhlIG9mZnNldAotICAgZW5jb2RpbmcgaXMgc3BsaXQgb3ZlciB0d28gZmllbGRzLCBlYWNoIGluIGl0J3Mgb3duIGluc3RydWN0aW9uLiBUaGV5Ci0gICBjYW4gb2NjdXIgaW4gYW55IG9yZGVyLiBTbyBnaXZlbiBhIHRodW1iIGZvcm0gb2YgbG9uZyBicmFuY2gsIGFuZCBhbiAKLSAgIG9mZnNldCwgaW5zZXJ0IHRoZSBvZmZzZXQgaW50byB0aGUgdGh1bWIgYnJhbmNoIGFuZCByZXR1cm4gZmluaXNoZWQKLSAgIGluc3RydWN0aW9uLiAKLQotICAgSXQgdGFrZXMgdHdvIHRodW1iIGluc3RydWN0aW9ucyB0byBlbmNvZGUgdGhlIHRhcmdldCBhZGRyZXNzLiBFYWNoIGhhcyAKLSAgIDExIGJpdHMgdG8gaW52ZXN0LiBUaGUgdXBwZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIG9uZSAoaWRlbnRpZmVkIGJ5Ci0gICBILTAuLiBzZWUgYmVsb3cpLCB0aGUgbG93ZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIHRoZSBvdGhlciAoaWRlbnRpZmllZCAKLSAgIGJ5IEgtMSkuIAotCi0gICBDb21iaW5lIHRvZ2V0aGVyIGFuZCBzaGlmdGVkIGxlZnQgYnkgMSAoaXQncyBhIGhhbGYgd29yZCBhZGRyZXNzKSBhbmQgCi0gICB0aGVyZSB5b3UgaGF2ZSBpdC4KLQotICAgICBPcDogMTExMSA9IEYsCi0gICAgIEgtMCwgdXBwZXIgYWRkcmVzcy0wID0gMDAwCi0gICAgIE9wOiAxMTExID0gRiwKLSAgICAgSC0xLCBsb3dlciBhZGRyZXNzLTAgPSA4MDAKLQotICAgVGhleSBjYW4gYmUgb3JkZXJlZCBlaXRoZXIgd2F5LCBidXQgdGhlIGFybSB0b29scyBJJ3ZlIHNlZW4gYWx3YXlzIHB1dCAKLSAgIHRoZSBsb3dlciBvbmUgZmlyc3QuIEl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyLiBrcmtAY3lnbnVzLmNvbQotCi0gICBYWFg6ICBBY3R1YWxseSB0aGUgb3JkZXIgZG9lcyBtYXR0ZXIuICBUaGUgc2Vjb25kIGluc3RydWN0aW9uIChILTEpCi0gICBtb3ZlcyB0aGUgY29tcHV0ZWQgYWRkcmVzcyBpbnRvIHRoZSBQQywgc28gaXQgbXVzdCBiZSB0aGUgc2Vjb25kIG9uZQotICAgaW4gdGhlIHNlcXVlbmNlLiAgVGhlIHByb2JsZW0sIGhvd2V2ZXIgaXMgdGhhdCB3aGlsc3QgbGl0dGxlIGVuZGlhbiBjb2RlCi0gICBzdG9yZXMgdGhlIGluc3RydWN0aW9ucyBpbiBISSB0aGVuIExPVyBvcmRlciwgYmlnIGVuZGlhbiBjb2RlIGRvZXMgdGhlCi0gICByZXZlcnNlLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLQotI2RlZmluZSBMT1dfSElfT1JERVIgMHhGODAwRjAwMAotI2RlZmluZSBISV9MT1dfT1JERVIgMHhGMDAwRjgwMAotCi1zdGF0aWMgaW5zbjMyCi1pbnNlcnRfdGh1bWJfYnJhbmNoIChicl9pbnNuLCByZWxfb2ZmKQotICAgICBpbnNuMzIgYnJfaW5zbjsKLSAgICAgaW50IHJlbF9vZmY7Ci17Ci0gIHVuc2lnbmVkIGludCBsb3dfYml0czsKLSAgdW5zaWduZWQgaW50IGhpZ2hfYml0czsKLQotCi0gIEJGRF9BU1NFUlQoKHJlbF9vZmYgJiAxKSAhPSAxKTsKLQotICByZWxfb2ZmID4+PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbGYgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KLSAgbG93X2JpdHMgPSByZWxfb2ZmICYgMHgwMDAwMDdGRjsgICAgICAgICAgICAvKiB0aGUgYm90dG9tIDExIGJpdHMgKi8KLSAgaGlnaF9iaXRzID0gKHJlbF9vZmYgPj4gMTEpICYgMHgwMDAwMDdGRjsgICAvKiB0aGUgdG9wIDExIGJpdHMgKi8KLQotICBpZiAoKGJyX2luc24gJiBMT1dfSElfT1JERVIpID09IExPV19ISV9PUkRFUikKLSAgICBicl9pbnNuID0gTE9XX0hJX09SREVSIHwgKGxvd19iaXRzIDw8IDE2KSB8IGhpZ2hfYml0czsKLSAgZWxzZSBpZiAoKGJyX2luc24gJiBISV9MT1dfT1JERVIpID09IEhJX0xPV19PUkRFUikKLSAgICBicl9pbnNuID0gSElfTE9XX09SREVSIHwgKGhpZ2hfYml0cyA8PCAxNikgfCBsb3dfYml0czsKLSAgZWxzZQotICAgIGFib3J0KCk7IC8qIGVycm9yIC0gbm90IGEgdmFsaWQgYnJhbmNoIGluc3RydWN0aW9uIGZvcm0gKi8KLQotICAvKiBGSVhNRTogYWJvcnQgaXMgcHJvYmFibHkgbm90IHRoZSByaWdodCBjYWxsLiBrcmtAY3lnbnVzLmNvbSAqLwotCi0gIHJldHVybiBicl9pbnNuOwotfQotCi0MCi1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoKLWZpbmRfdGh1bWJfZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIENPTlNUIGNoYXIgKiAgICAgICAgICAgbmFtZTsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLQkgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLSAgCi0gIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAotICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgCi0gIGlmIChteWggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IHVuYWJsZSB0byBmaW5kIFRIVU1CIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotICAKLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBteWg7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF9hcm1fZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIENPTlNUIGNoYXIgKiAgICAgICAgICAgbmFtZTsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLQkgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotICAKLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IHVuYWJsZSB0byBmaW5kIEFSTSBnbHVlICclcycgZm9yIGAlcyciKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHRtcF9uYW1lLCBuYW1lKTsKLSAgCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICByZXR1cm4gbXloOwotfQotCi0vKgotICBBUk0tPlRodW1iIGdsdWU6Ci0KLSAgICAgICAuYXJtCi0gICAgICAgX19mdW5jX2Zyb21fYXJtOgotCSAgICAgbGRyIHIxMiwgX19mdW5jX2FkZHIKLQkgICAgIGJ4ICByMTIKLSAgICAgICBfX2Z1bmNfYWRkcjoKLSAgICAgICAgICAgIC53b3JkIGZ1bmMgICAgQCBiZWhhdmUgYXMgaWYgeW91IHNhdyBhIEFSTV8zMiByZWxvYwotKi8KLQotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9TSVpFIDEyCi1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDFfbGRyX2luc24gICAgICAgPSAweGU1OWZjMDAwOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQyX2J4X3IxMl9pbnNuICAgID0gMHhlMTJmZmYxYzsKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0M19mdW5jX2FkZHJfaW5zbiA9IDB4MDAwMDAwMDE7Ci0KLS8qCi0gICBUaHVtYi0+QVJNOgkJCQlUaHVtYi0+KG5vbi1pbnRlcndvcmtpbmcgYXdhcmUpIEFSTQotCi0gICAudGh1bWIJCQkJLnRodW1iCi0gICAuYWxpZ24gMgkJCQkuYWxpZ24gMgotICAgICAgX19mdW5jX2Zyb21fdGh1bWI6CQkgICBfX2Z1bmNfZnJvbV90aHVtYjoKLQkgICBieCBwYwkJCQlwdXNoIHtyNiwgbHJ9Ci0JICAgbm9wCQkJCQlsZHIgIHI2LCBfX2Z1bmNfYWRkcgotICAgLmFybQkJCQkJCW1vdiAgbHIsIHBjCi0gICAgICBfX2Z1bmNfY2hhbmdlX3RvX2FybToJCQlieCAgIHI2Ci0JICAgYiBmdW5jICAgCQkJLmFybQotCQkJCQkgICBfX2Z1bmNfYmFja190b190aHVtYjoKLSAgIAkJICAJCQkJbGRtaWEgcjEzISB7cjYsIGxyfQotICAgCQkJCQkgICAgICAgIGJ4ICAgIGxyCi0gICAJCQkJCSAgIF9fZnVuY19hZGRyOgotCQkJCQkgICAgICAgIC53b3JkCWZ1bmMgCi0qLwotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NJWkUgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyAyMCA6IDgpCi1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfYnhfcGNfaW5zbiA9IDB4NDc3ODsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9ub29wX2luc24gID0gMHg0NmMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmEzX2JfaW5zbiAgICAgPSAweGVhMDAwMDAwOwotCi1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfcHVzaF9pbnNuICA9IDB4YjU0MDsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9sZHJfaW5zbiAgID0gMHg0ZTAzOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEzX21vdl9pbnNuICAgPSAweDQ2ZmU7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTRfYnhfaW5zbiAgICA9IDB4NDczMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNV9wb3BfaW5zbiAgID0gMHhlOGJkNDA0MDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNl9ieF9pbnNuICAgID0gMHhlMTJmZmYxZTsKLQotLyogVE9ETzoKLSAgICAgV2Ugc2hvdWxkIHJlYWxseSBjcmVhdGUgbmV3IGxvY2FsIChzdGF0aWMpIHN5bWJvbHMgaW4gZGVzdGluYXRpb24KLSAgICAgb2JqZWN0IGZvciBlYWNoIHN0dWIgd2UgY3JlYXRlLiAgV2Ugc2hvdWxkIGFsc28gY3JlYXRlIGxvY2FsCi0gICAgIChzdGF0aWMpIHN5bWJvbHMgd2l0aGluIHRoZSBzdHVicyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIEFSTSBhbmQKLSAgICAgVGh1bWIgY29kZS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZGVidWdnZXIgYW5kIGRpc2Fzc2VtYmxlcgotICAgICBjYW4gcHJlc2VudCBhIGJldHRlciB2aWV3IG9mIHN0dWJzLgotCi0gICAgIFdlIGNhbiB0cmVhdCBzdHVicyBsaWtlIGxpdGVyYWwgc2VjdGlvbnMsIGFuZCBmb3IgdGhlIFRIVU1COSBvbmVzCi0gICAgIChzaG9ydCBhZGRyZXNzaW5nIHJhbmdlKSB3ZSBzaG91bGQgYmUgYWJsZSB0byBpbnNlcnQgdGhlIHN0dWJzCi0gICAgIGJldHdlZW4gc2VjdGlvbnMuIGkuZS4gdGhlIHNpbXBsZXN0IGFwcHJvYWNoIChzaW5jZSByZWxvY2F0aW9ucwotICAgICBhcmUgZG9uZSBvbiBhIHNlY3Rpb24gYmFzaXMpIGlzIHRvIGR1bXAgdGhlIHN0dWJzIGF0IHRoZSBlbmQgb2YKLSAgICAgcHJvY2Vzc2luZyBhIHNlY3Rpb24uIFRoYXQgd2F5IHdlIGNhbiBhbHdheXMgdHJ5IGFuZCBtaW5pbWlzZSB0aGUKLSAgICAgb2Zmc2V0IHRvIGFuZCBmcm9tIGEgc3R1Yi4gSG93ZXZlciwgdGhpcyBkb2VzIG5vdCBtYXAgd2VsbCBvbnRvCi0gICAgIHRoZSB3YXkgdGhhdCB0aGUgbGlua2VyL0JGRCBkb2VzIGl0cyB3b3JrOiBtYXBwaW5nIGFsbCBpbnB1dAotICAgICBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMgdmlhIHRoZSBsaW5rZXIgc2NyaXB0IGJlZm9yZSBkb2luZwotICAgICBhbGwgdGhlIHByb2Nlc3NpbmcuCi0KLSAgICAgVW5mb3J0dW5hdGVseSBpdCBtYXkgYmUgZWFzaWVyIHRvIGp1c3QgdG8gZGlzYWxsb3cgc2hvcnQgcmFuZ2UKLSAgICAgVGh1bWItPkFSTSBzdHVicyAoaS5lLiBubyBjb25kaXRpb25hbCBpbnRlci13b3JraW5nIGJyYW5jaGVzLAotICAgICBvbmx5IGJyYW5jaC1hbmQtbGluayAoQkwpIGNhbGxzLiAgVGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBwcm9jZXNzaW5nCi0gICAgIHNpbmNlIHdlIGNhbiB0aGVuIHB1dCBhbGwgb2YgdGhlIHN0dWJzIGludG8gdGhlaXIgb3duIHNlY3Rpb24uCi0KLSAgVE9ETzoKLSAgICAgT24gYSBkaWZmZXJlbnQgc3ViamVjdCwgcmF0aGVyIHRoYW4gY29tcGxhaW5pbmcgd2hlbiBhCi0gICAgIGJyYW5jaCBjYW5ub3QgZml0IGluIHRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgZm9yIHRoZQotICAgICBpbnN0cnVjdGlvbiB3ZSBzaG91bGQgZ2VuZXJhdGUgYSB0cmFtcG9saW5lIHN0dWIgKG5lZWRlZCB0bwotICAgICBhZGRyZXNzIHRoZSBjb21wbGV0ZSAzMmJpdCBhZGRyZXNzIHNwYWNlKS4gICovCi0KLS8qIFRoZSBzdGFuZGFyZCBDT0ZGIGJhY2tlbmQgbGlua2VyIGRvZXMgbm90IGNvcGUgd2l0aCB0aGUgc3BlY2lhbCAKLSAgIFRodW1iIEJSQU5DSDIzIHJlbG9jYXRpb24uICBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gc3BsaXQgdGhlCi0gICBCUkFOQ0gyMyBpbnRvIHNlcGVyYXRlIEhJMjMgYW5kIExPMjMgcmVsb2NhdGlvbnMuIEhvd2V2ZXIsIGl0IGlzIGEKLSAgIGJpdCBzaW1wbGVyIHNpbXBseSBwcm92aWRpbmcgb3VyIG93biByZWxvY2F0aW9uIGRyaXZlci4gKi8KLQotLyogVGhlIHJlbG9jIHByb2Nlc3Npbmcgcm91dGluZSBmb3IgdGhlIEFSTS9UaHVtYiBDT0ZGIGxpbmtlci4gIE5PVEU6Ci0gICBUaGlzIGNvZGUgaXMgYSB2ZXJ5IHNsaWdodGx5IG1vZGlmaWVkIGNvcHkgb2YKLSAgIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uICBJdCB3b3VsZCBiZSBhIG11Y2ggbW9yZQotICAgbWFpbnRhaW5hYmxlIHNvbHV0aW9uIHRvIGhhdmUgYSBNQUNSTyB0aGF0IGNvdWxkIGJlIGV4cGFuZGVkIHdpdGhpbgotICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiB0aGF0IHdvdWxkIG9ubHkgYmUgcHJvdmlkZWQgZm9yCi0gICBBUk0vVGh1bWIgYnVpbGRzLiAgSXQgaXMgb25seSB0aGUgY29kZSBtYXJrZWQgVEhVTUJFWFRFTlNJT04gdGhhdAotICAgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAwOwotICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICBoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqICAgICAgIHN5bTsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICAgIGhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICAgIHJzdGF0OwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGhfdmFsOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQotICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAotICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKLSAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLwotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotCi0gICAgICBob3d0byA9IGNvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAotCQkJCSAgICAgICBzeW0sICZhZGRlbmQpOwotICAgICAgaWYgKGhvd3RvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgcmVsb2NhdGlvbl9zZWN0aW9uIGZ1bmN0aW9uIHdpbGwgc2tpcCBwY3JlbF9vZmZzZXQgcmVsb2NzCi0gICAgICAgICB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBIb3dldmVyLCB3ZSB3YW50IHRvIGNvbnZlcnQKLSAgICAgICAgIEFSTTI2IHRvIEFSTTI2RCByZWxvY3MgaWYgcG9zc2libGUuICBXZSByZXR1cm4gYSBmYWtlIGhvd3RvIGluCi0gICAgICAgICB0aGlzIGNhc2Ugd2l0aG91dCBwY3JlbF9vZmZzZXQgc2V0LCBhbmQgYWRqdXN0IHRoZSBhZGRlbmQgdG8KLSAgICAgICAgIGNvbXBlbnNhdGUuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlID09IEFSTV8yNgotICAgICAgICAgICYmIGggIT0gTlVMTAotICAgICAgICAgICYmIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICAgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZmFrZV9hcm0yNl9yZWxvYyA9IAotCSAgICBIT1dUTyAoQVJNXzI2LAotICAgIAkgICAgICAgMiwKLSAgICAJICAgICAgIDIsCi0gICAgCSAgICAgICAyNCwKLSAgICAJICAgICAgIHRydWUsCi0gICAgCSAgICAgICAwLAotICAgIAkgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotICAgIAkgICAgICAgYW91dGFybV9maXhfcGNyZWxfMjYgLAotICAgIAkgICAgICAgIkFSTV8yNiIsCi0gICAgCSAgICAgICBmYWxzZSwKLSAgICAJICAgICAgIDB4MDBmZmZmZmYsCi0gICAgCSAgICAgICAweDAwZmZmZmZmLCAKLSAgICAJICAgICAgIGZhbHNlKTsKLQotICAgICAgICAgIGFkZGVuZCAtPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICAgICAgaG93dG8gPSAmZmFrZV9hcm0yNl9yZWxvYzsKLSAgICAgICAgfQotCi0jaWZkZWYgQVJNX1dJTkNFCi0gICAgICAvKiBNUyBBUk0tQ0UgbWFrZXMgdGhlIHJlbG9jIHJlbGF0aXZlIHRvIHRoZSBvcGNvZGUncyBwYywgbm90Ci0JIHRoZSBuZXh0IG9wY29kZSdzIHBjLCBzbyBpcyBvZmYgYnkgb25lLiAqLwotICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSAmJiAhaW5mby0+cmVsb2NhdGVhYmxlKQotCWFkZGVuZCAtPSA4OwotI2VuZGlmCi0gICAgICAKLSAgICAgIC8qIElmIHdlIGFyZSBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGVuIHdlIGNhbiBqdXN0IGlnbm9yZQotICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyB0aGF0IGlzIHBjcmVsX29mZnNldC4gIEl0IHdpbGwgYWxyZWFkeQotICAgICAgICAgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIElmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssCi0gICAgICAgICB0aGVuIHdlIHNob3VsZCBpZ25vcmUgdGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotICAgICAgICAgICAgYWRkZW5kICs9IHN5bS0+bl92YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotI2lmIDEgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgICAgICAvKiBXZSBkb24ndCBvdXRwdXQgdGhlIHN0dWJzIGlmIHdlIGFyZSBnZW5lcmF0aW5nIGEKLSAgICAgICAgICAgICByZWxvY2F0YWJsZSBvdXRwdXQgZmlsZSwgc2luY2Ugd2UgbWF5IGFzIHdlbGwgbGVhdmUgdGhlCi0gICAgICAgICAgICAgc3R1YiBnZW5lcmF0aW9uIHRvIHRoZSBmaW5hbCBsaW5rZXIgcGFzcy4gSWYgd2UgZmFpbCB0bwotCSAgICAgdmVyaWZ5IHRoYXQgdGhlIG5hbWUgaXMgZGVmaW5lZCwgd2UnbGwgdHJ5IHRvIGJ1aWxkIHN0dWJzCi0JICAgICBmb3IgYW4gdW5kZWZpbmVkIG5hbWUuLi4gKi8KLSAgICAgICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICAgICAmJiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgICAgICAgICAgewotCSAgICAgIGFzZWN0aW9uICogICBoX3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBjb25zdCBjaGFyICogbmFtZSAgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIAotCSAgICAgIC8qIGggbG9jYXRlcyB0aGUgc3ltYm9sIHJlZmVyZW5jZWQgaW4gdGhlIHJlbG9jLiAgKi8KLQkgICAgICBoX3ZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGhfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIGhfc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotICAgICAgICAgICAgICBpZiAoaG93dG8tPnR5cGUgPT0gQVJNXzI2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICggICBoLT5jbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMKLQkJICAgICAgfHwgaC0+Y2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEFybSBjb2RlIGNhbGxpbmcgYSBUaHVtYiBmdW5jdGlvbiAqLwotCQkgICAgICB1bnNpZ25lZCBsb25nIGludCAgICAgICAgICAgICAgICAgdG1wOwotCQkgICAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0OwotCQkgICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgICAgczsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF9vZmZzZXQ7Ci0JCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICAgICBteWg7IAotCQkgICAgICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQkJICAgICAgCi0JCSAgICAgIG15aCA9IGZpbmRfYXJtX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7Ci0JCSAgICAgIGlmIChteWggPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkgICAgICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0JCQkKLQkJICAgICAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICAKLQkJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgCi0JCQkJCQkgIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMtPmNvbnRlbnRzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKTsKLQotCQkgICAgICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0JCQl7Ci0JCQkgIGlmIChoX3NlYy0+b3duZXIgIT0gTlVMTAotCQkJICAgICAgJiYgSU5URVJXT1JLX1NFVCAoaF9zZWMtPm93bmVyKQotCQkJICAgICAgJiYgISBJTlRFUldPUktfRkxBRyAoaF9zZWMtPm93bmVyKSkKLQkJCSAgICB7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaF9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiBhcm0gY2FsbCB0byB0aHVtYiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCSAgICB9Ci0KLQkJCSAgLS1teV9vZmZzZXQ7Ci0JCQkgIG15aC0+cm9vdC51LmRlZi52YWx1ZSA9IG15X29mZnNldDsKLQotCQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQxX2xkcl9pbnNuLAotCQkJCSAgICAgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQkJCSAgCi0JCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDJfYnhfcjEyX2luc24sCi0JCQkJICAgICAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQkJCSAgCi0JCQkgIC8qIEl0J3MgYSB0aHVtYiBhZGRyZXNzLiAgQWRkIHRoZSBsb3cgb3JkZXIgYml0LiAgKi8KLQkJCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaF92YWwgfCBhMnQzX2Z1bmNfYWRkcl9pbnNuLAotCQkJCSAgICAgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0ICsgOCk7Ci0KLQkJCX0KLQotCQkgICAgICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0KLQkJICAgICAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCQktIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgICAgIAotCQkgICAgICB0bXAgPSB0bXAgJiAweEZGMDAwMDAwOwotCi0JCSAgICAgIC8qIFNvbWVob3cgdGhlc2UgYXJlIGJvdGggNCB0b28gZmFyLCBzbyBzdWJ0cmFjdCA4LiAqLwotCQkgICAgICByZXRfb2Zmc2V0ID0KLQkJCXMtPm91dHB1dF9vZmZzZXQKLQkJCSsgbXlfb2Zmc2V0IAotCQkJKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQktIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgCi0JCQkgICArIHJlbC0+cl92YWRkcikKLQkJCS0gODsKLQotCQkgICAgICB0bXAgPSB0bXAgfCAoKHJldF9vZmZzZXQgPj4gMikgJiAweDAwRkZGRkZGKTsKLQkJICAgICAgCi0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHRtcCwgY29udGVudHMgKyByZWwtPnJfdmFkZHIKLQkJCQkgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkJICAgICAgZG9uZSA9IDE7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgIAotI2lmbmRlZiBBUk1fV0lOQ0UKLQkgICAgICAvKiBOb3RlOiBXZSB1c2VkIHRvIGNoZWNrIGZvciBBUk1fVEhVTUI5IGFuZCBBUk1fVEhVTUIxMiAqLwotICAgICAgICAgICAgICBlbHNlIGlmIChob3d0by0+dHlwZSA9PSBBUk1fVEhVTUIyMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoICAgaC0+Y2xhc3MgPT0gQ19FWFQgCi0JCSAgICAgIHx8IGgtPmNsYXNzID09IENfU1RBVAotCQkgICAgICB8fCBoLT5jbGFzcyA9PSBDX0xBQkVMKQotCQkgICAgewotCQkgICAgICAvKiBUaHVtYiBjb2RlIGNhbGxpbmcgYW4gQVJNIGZ1bmN0aW9uICovCi0JCSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDA7Ci0JCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0OwotCQkgICAgICB1bnNpZ25lZCBsb25nIGludCAgICAgICAgICAgICAgICAgIHRtcDsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfb2Zmc2V0OwotCQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgIG15aDsKLQkJICAgICAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqICBnbG9iYWxzOwotCi0JCSAgICAgIG15aCA9IGZpbmRfdGh1bWJfZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKLQkJICAgICAgaWYgKG15aCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCSAgICAgIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQkJICAgICAgCi0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCQkgICAgICAKLQkJICAgICAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICAKLQkJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgCi0JCQkJCQkgICBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCQkgICAgICAKLQkJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCQkgICAgICAKLQkJICAgICAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotCQkJewotCQkJICBpZiAoaF9zZWMtPm93bmVyICE9IE5VTEwKLQkJCSAgICAgICYmIElOVEVSV09SS19TRVQgKGhfc2VjLT5vd25lcikKLQkJCSAgICAgICYmICEgSU5URVJXT1JLX0ZMQUcgKGhfc2VjLT5vd25lcikKLQkJCSAgICAgICYmICEgZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSkKLQkJCSAgICB7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaF9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiB0aHVtYiBjYWxsIHRvIGFybSIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCShfKCIgIGNvbnNpZGVyIHJlbGlua2luZyB3aXRoIC0tc3VwcG9ydC1vbGQtY29kZSBlbmFibGVkIikpOwotCQkJICAgIH0KLQkJCSAgCi0JCQkgIC0tIG15X29mZnNldDsKLQkJCSAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OwotCi0JCQkgIGlmIChnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlKQotCQkJICAgIHsKLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfcHVzaF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMl9sZHJfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOwotCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEzX21vdl9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0KLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTRfYnhfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDYpOwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB0MmE1X3BvcF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgOCk7Ci0JCQkgICAgICAKLQkJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHQyYTZfYnhfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDEyKTsKLQkJCSAgICAgIAotCQkJICAgICAgLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBsYXN0IHdvcmQgb2YgdGhlIHN0dWIuICAqLwotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaF92YWwsCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgcywgbXlfb2Zmc2V0ICsgMTYpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfYnhfcGNfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0JCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMl9ub29wX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAyKTsKLQkJICAgICAgCi0JCQkgICAgICByZXRfb2Zmc2V0ID0KLQkJCQkoKGJmZF9zaWduZWRfdm1hKSBoX3ZhbCkJLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBvZiB0aGUgc3R1YiAqLwotCQkJCS0gKChiZmRfc2lnbmVkX3ZtYSkKLQkJCQkgICAocy0+b3V0cHV0X29mZnNldCAJCS8qIE9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgc3R1YnMuICAqLwotCQkJCSAgICArIG15X29mZnNldAkJCS8qIE9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBzdHViIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JCQkJICAgICsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSkgCS8qIEFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotCQkJCSAgICsgNAkJCQkvKiBUaGUgYnJhbmNoIGluc3RydWN0aW9uIGlzIDQgYnl0ZXMgaW50byB0aGUgc3R1Yi4gICovCi0JCQkJICAgKyA4KTsJCQkvKiBBUk0gYnJhbmNoZXMgd29yayBmcm9tIHRoZSBwYyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKyA4LiAgKi8KLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCQkJICB0MmEzX2JfaW5zbiB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0KLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0KLQkJICAgICAgLyogTm93IGdvIGJhY2sgYW5kIGZpeCB1cCB0aGUgb3JpZ2luYWwgQkwgaW5zbiB0byBwb2ludAotCQkJIHRvIGhlcmUuICAqLwotCQkgICAgICByZXRfb2Zmc2V0ID0KLQkJCXMtPm91dHB1dF9vZmZzZXQKLQkJCSsgbXlfb2Zmc2V0Ci0JCQktIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIHJlbC0+cl92YWRkcikKLQkJCS00OwotCQkgICAgICAKLQkJICAgICAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCQktIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCQkgIGluc2VydF90aHVtYl9icmFuY2ggKHRtcCwgcmV0X29mZnNldCksCi0JCQkJICBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCSAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgICAKLQkJICAgICAgZG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLQkgIAotICAgICAgICAgIC8qIElmIHRoZSByZWxvY2F0aW9uIHR5cGUgYW5kIGRlc3RpbmF0aW9uIHN5bWJvbCBkb2VzIG5vdAotICAgICAgICAgICAgIGZhbGwgaW50byBvbmUgb2YgdGhlIGFib3ZlIGNhdGVnb3JpZXMsIHRoZW4gd2UgY2FuIGp1c3QKLSAgICAgICAgICAgICBwZXJmb3JtIGEgZGlyZWN0IGxpbmsuICovCi0KLQkgIGlmIChkb25lKQotCSAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLQkgIGVsc2UgCi0jZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8KLQkgICAgaWYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0JewotCSAgLyogRW1pdCBhIHJlbG9jIGlmIHRoZSBiYWNrZW5kIHRoaW5rcyBpdCBuZWVkcyBpdC4gKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YShvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcChvdXRwdXRfYmZkLCBob3d0bykpCi0gICAgICAgICAgICBhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkcik7Ci0JfQotICAKLSNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICBpZiAoZG9uZSkKLQlyc3RhdCA9IGJmZF9yZWxvY19vazsKLSNpZm5kZWYgQVJNX1dJTkNFCi0gICAgICAvKiBPbmx5IHBlcmZvcm0gdGhpcyBmaXggZHVyaW5nIHRoZSBmaW5hbCBsaW5rLCBub3QgYSByZWxvY2F0YWJsZSBsaW5rLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLSAgICAgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAgICAgICYmIGhvd3RvLT50eXBlID09IEFSTV9USFVNQjIzKQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBpcyBwcmV0dHkgbXVjaCBhIGNvcHkgb2Ygd2hhdCB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSBhbmQgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotICAgICAgICAgICAgIHJvdXRpbmVzIGRvIHRvIHBlcmZvcm0gYSByZWxvY2F0aW9uLCB3aXRoIHNwZWNpYWwKLSAgICAgICAgICAgICBwcm9jZXNzaW5nIGZvciB0aGUgc3BsaXQgYWRkcmVzc2luZyBvZiB0aGUgVGh1bWIgQkwKLSAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEFnYWluLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBzaW1wbGVyIGFkZGluZyBhCi0gICAgICAgICAgICAgVGh1bWJCUkFOQ0gyMyBzcGVjaWZpYyBtYWNybyBleHBhbnNpb24gaW50byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIGNvZGUuICAqLwotCSAgCi0gICAgICAgICAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgCi0gICAgICAgICAgaWYgKGFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgIHJzdGF0ID0gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBiZmRfdm1hICAgICAgICAgcmVsb2NhdGlvbiAgICAgICA9IHZhbCArIGFkZGVuZDsKLQkgICAgICBpbnQgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotCSAgICAgIGJvb2xlYW4gICAgICAgICBvdmVyZmxvdyAgICAgICAgID0gZmFsc2U7Ci0JICAgICAgYmZkX2J5dGUgKiAgICAgIGxvY2F0aW9uICAgICAgICAgPSBjb250ZW50cyArIGFkZHJlc3M7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIHggICAgICAgICAgICAgICAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLQkgICAgICBiZmRfdm1hICAgICAgICAgc3JjX21hc2sgICAgICAgICA9IDB4MDA3RkZGRkU7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIGNoZWNrOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICBzaWduZWRfY2hlY2s7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIGFkZDsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSAgc2lnbmVkX2FkZDsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHNpemUgPT0gNCk7Ci0JICAgICAgCi0gICAgICAgICAgICAgIC8qIGhvd3RvLT5wY19yZWxhdGl2ZSBzaG91bGQgYmUgVFJVRSBmb3IgdHlwZSAxNCBCUkFOQ0gyMyAqLwotICAgICAgICAgICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgCi0gICAgICAgICAgICAgIC8qIGhvd3RvLT5wY3JlbF9vZmZzZXQgc2hvdWxkIGJlIFRSVUUgZm9yIHR5cGUgMTQgQlJBTkNIMjMgKi8KLSAgICAgICAgICAgICAgcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotCSAgICAgIAotCSAgICAgIC8qIE5vIG5lZWQgdG8gbmVnYXRlIHRoZSByZWxvY2F0aW9uIHdpdGggQlJBTkNIMjMuICovCi0JICAgICAgLyogaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCBmb3IgQlJBTkNIMjMuICAqLwotCSAgICAgIC8qIGhvd3RvLT5yaWdodHNoaWZ0ID09IDEgKi8KLQkgICAgICAvKiBEcm9wIHVud2FudGVkIGJpdHMgZnJvbSB0aGUgdmFsdWUgd2UgYXJlIHJlbG9jYXRpbmcgdG8uICAqLwotCSAgICAgIAotCSAgICAgIGNoZWNrID0gcmVsb2NhdGlvbiA+PiBob3d0by0+cmlnaHRzaGlmdDsKLQkJCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHNpZ25lZCB2YWx1ZSwgdGhlIHJpZ2h0c2hpZnQganVzdCBkcm9wcGVkCi0JCSBsZWFkaW5nIDEgYml0cyAoYXNzdW1pbmcgdHdvcyBjb21wbGVtZW50KS4gICovCi0JICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCQlzaWduZWRfY2hlY2sgPSBjaGVjazsKLQkgICAgICBlbHNlCi0JCXNpZ25lZF9jaGVjayA9IChjaGVjawotCQkJCXwgKChiZmRfdm1hKSAtIDEKLQkJCQkgICAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKLQkgICAgICAKLQkgICAgICAvKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQkgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXsKLQkJICBhZGQgPSAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDQpIHwgKCgoeCkgJiAweDdmZikgPDwgMSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhZGQgPSAoKCgoeCkgJiAweDdmZikgPDwgMTIpIHwgKCgoeCkgJiAweDA3ZmYwMDAwKSA+PiAxNSkpOwotCQl9Ci0KLQkgICAgICAvKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlIHdpdGggYW4gYXBwcm9wcmlhdGUgc2lnbi4KLQkJIFRoZSBleHByZXNzaW9uIGludm9sdmluZyBob3d0by0+c3JjX21hc2sgaXNvbGF0ZXMgdGhlIHVwcGVyCi0JCSBiaXQgb2Ygc3JjX21hc2suICBJZiB0aGF0IGJpdCBpcyBzZXQgaW4gdGhlIHZhbHVlIHdlIGFyZQotCQkgYWRkaW5nLCBpdCBpcyBuZWdhdGl2ZSwgYW5kIHdlIHN1YnRyYWN0IG91dCB0aGF0IG51bWJlciB0aW1lcwotCQkgdHdvLiAgSWYgc3JjX21hc2sgaW5jbHVkZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgYml0LCB0aGVuIHdlCi0JCSBjYW4gbm90IGdldCB0aGUgdXBwZXIgYml0LCBidXQgdGhhdCBkb2VzIG5vdCBtYXR0ZXIgc2luY2UKLQkJIHNpZ25lZF9hZGQgbmVlZHMgbm8gYWRqdXN0bWVudCB0byBiZWNvbWUgbmVnYXRpdmUgaW4gdGhhdAotCQkgY2FzZS4gICovCi0JICAgICAgCi0JICAgICAgc2lnbmVkX2FkZCA9IGFkZDsKLQkgICAgICAKLQkgICAgICBpZiAoKGFkZCAmICgoKH4gc3JjX21hc2spID4+IDEpICYgc3JjX21hc2spKSAhPSAwKQotCQlzaWduZWRfYWRkIC09ICgoKH4gc3JjX21hc2spID4+IDEpICYgc3JjX21hc2spIDw8IDE7Ci0JICAgICAgCi0JICAgICAgLyogQWRkIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSwgc2hpZnRlZCBzbyB0aGF0IGl0IGlzIGEKLQkJIHN0cmFpZ2h0IG51bWJlci4gICovCi0JICAgICAgLyogaG93dG8tPmJpdHBvcyA9PSAwICovCi0JICAgICAgCi0JICAgICAgc2lnbmVkX2NoZWNrICs9IHNpZ25lZF9hZGQ7Ci0JICAgICAgcmVsb2NhdGlvbiArPSBzaWduZWRfYWRkOwotCi0JICAgICAgQkZEX0FTU0VSVCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCk7Ci0KLQkgICAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICAqLwotCSAgICAgIGlmICggICBzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4Ci0JCSAgfHwgc2lnbmVkX2NoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIAotCSAgICAgIC8qIFB1dCBSRUxPQ0FUSU9OIGludG8gdGhlIGNvcnJlY3QgYml0czogICovCi0JICAgICAgCi0JICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9ICgoKHJlbG9jYXRpb24gJiAweGZmZSkgPj4gMSkgIHwgKChyZWxvY2F0aW9uIDw8IDQpICYgMHgwN2ZmMDAwMCkpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9ICgoKHJlbG9jYXRpb24gJiAweGZmZSkgPDwgMTUpIHwgKChyZWxvY2F0aW9uID4+IDEyKSAmIDB4N2ZmKSk7Ci0JCX0KLQkgICAgICAKLQkgICAgICAvKiBBZGQgUkVMT0NBVElPTiB0byB0aGUgY29ycmVjdCBiaXRzIG9mIFg6ICAqLwotCSAgICAgIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8IHJlbG9jYXRpb24pOwotCi0JICAgICAgLyogUHV0IHRoZSByZWxvY2F0ZWQgdmFsdWUgYmFjayBpbiB0aGUgb2JqZWN0IGZpbGU6ICAqLwotCSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotCi0JICAgICAgcnN0YXQgPSBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0gICAgICBlbHNlCi0jZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgYWRkZW5kKTsKLSNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICAvKiBGSVhNRTogCi0JIElzIHRoaXMgdGhlIGJlc3Qgd2F5IHRvIGZpeCB1cCB0aHVtYiBhZGRyZXNzZXM/IGtya0BjeWdudXMuY29tCi0JIFByb2JhYmx5IG5vdCwgYnV0IGl0IHdvcmtzLCBhbmQgaWYgaXQgd29ya3MgaXQgZG9uJ3QgbmVlZCBmaXhpbmchICBuaWNrY0BjeWdudXMuY29tICovCi0gICAgICAvKiBPbmx5IHBlcmZvcm0gdGhpcyBmaXggZHVyaW5nIHRoZSBmaW5hbCBsaW5rLCBub3QgYSByZWxvY2F0YWJsZSBsaW5rLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLSAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotCSAgJiYgKHJlbC0+cl90eXBlID09IEFSTV8zMiB8fCByZWwtPnJfdHlwZSA9PSBBUk1fUlZBMzIpKQotCXsKLQkgIC8qIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHNldCB0aGUgYm90dG9tIGJpdCBvZiBhIHJlbG9jYXRlZCBhZGRyZXNzCi0JICAgICBiZWNhdXNlIHRoZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIGEgVGh1bWIgY29kZSBzeW1ib2wuICAqLwotCSAgICAgCi0JICBpbnQgcGF0Y2hpdCA9IGZhbHNlOwotCSAgCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgKCAgIGgtPmNsYXNzID09IENfVEhVTUJTVEFURlVOQwotCQkgIHx8IGgtPmNsYXNzID09IENfVEhVTUJFWFRGVU5DKSkKLQkgICAgewotCSAgICAgIHBhdGNoaXQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzeW0gIT0gTlVMTAotCQkgICAmJiBzeW0tPm5fc2NudW0gPiBOX1VOREVGKQotCSAgICB7Ci0JICAgICAgLyogTm8gaGFzaCBlbnRyeSAtIHVzZSB0aGUgc3ltYm9sIGluc3RlYWQuICAqLwotCi0JICAgICAgaWYgKCAgIHN5bS0+bl9zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DCi0JCSAgfHwgc3ltLT5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQykKLQkJcGF0Y2hpdCA9IHRydWU7Ci0JICAgIH0KLQotCSAgaWYgKHBhdGNoaXQpCi0JICAgIHsKLQkgICAgICBiZmRfYnl0ZSAqIGxvY2F0aW9uID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgICAgYmZkX3ZtYSAgICB4ICAgICAgICA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotCi0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4IHwgMSwgbG9jYXRpb24pOwotCSAgICB9Ci0JfQotI2VuZGlmIC8qIFRIVU1CRVhURU5TSU9OICovICAgICAgCi0gICAgICAKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX3ZhZGRyLAotCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotYm9vbGVhbgotYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKGluZm8pIAotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgICAgICBzOwotICBiZmRfYnl0ZSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9vOwotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLSNpZiAwCi0gIHN0YXRpYyBjaGFyICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NoYXIgPSAnMSc7Ci0jZW5kaWYKLQotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCi0gIGlmIChnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIAotICAgICAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYwotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0jaWYgMAotICAgICAgbWVtc2V0IChmb28sIHRlc3RfY2hhciwgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gZm9vOwotICAgIH0KLQotICBpZiAoZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIAotICAgICAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYwotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLSNpZiAwCi0gICAgICBtZW1zZXQgKGZvbywgdGVzdF9jaGFyLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOwotI2VuZGlmCi0gICAgICAKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gZm9vOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICAgaW5mbzsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICByZWdpc3RlciBhc2VjdGlvbiAqICAgICAgICAgICAgICAgczsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgbXloOwotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLQkgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotICAKLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAKLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsgLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIC8qIFRoZSBvbmx5IHRyaWNrIGhlcmUgaXMgdXNpbmcgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSBhcyB0aGUgdmFsdWUuIEV2ZW4KLSAgICAgdGhvdWdoIHRoZSBzZWN0aW9uIGlzbid0IGFsbG9jYXRlZCB5ZXQsIHRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBiZSBwdXR0aW5nCi0gICAgIGl0LiAgKi8KLQotICBiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkJQlNGX0dMT0JBTCwgCi0JCQkJcywgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArIDEsCi0JCQkJTlVMTCwgdHJ1ZSwgZmFsc2UsIAotCQkJCShzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJiBteWgpOwotICAKLSAgZnJlZSAodG1wX25hbWUpOwotICAKLSAgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArPSBBUk0yVEhVTUJfR0xVRV9TSVpFOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICAgaW5mbzsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzOwotICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgIG15aDsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqICBnbG9iYWxzOwotCi0gIAotICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLSAgICAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICB0bXBfbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIAotICBpZiAobXloICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAodG1wX25hbWUpOwotICAgICAgcmV0dXJuOyAvKiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBndXkgKi8KLSAgICB9Ci0KLSAgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCUJTRl9HTE9CQUwsIHMsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSArIDEsCi0JCQkJTlVMTCwgdHJ1ZSwgZmFsc2UsIAotCQkJCShzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJiBteWgpOwotICAKLSAgLyogSWYgd2UgbWFyayBpdCAndGh1bWInLCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgZG8gYSBiZXR0ZXIgam9iLiAgKi8KLSAgbXloLT5jbGFzcyA9IENfVEhVTUJFWFRGVU5DOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICAvKiBBbGxvY2F0ZSBhbm90aGVyIHN5bWJvbCB0byBtYXJrIHdoZXJlIHdlIHN3aXRjaCB0byBhcm0gbW9kZS4gICovCi0gICAgICAKLSNkZWZpbmUgQ0hBTkdFX1RPX0FSTSAiX18lc19jaGFuZ2VfdG9fYXJtIgotI2RlZmluZSBCQUNLX0ZST01fQVJNICJfXyVzX2JhY2tfZnJvbV9hcm0iCi0gIAotICB0bXBfbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKENIQU5HRV9UT19BUk0pICsgMSk7Ci0gIAotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0gIAotICBzcHJpbnRmICh0bXBfbmFtZSwgZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA/IEJBQ0tfRlJPTV9BUk0gOiBDSEFOR0VfVE9fQVJNLCBuYW1lKTsKLQotICBteWggPSBOVUxMOwotICAKLSAgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCUJTRl9MT0NBTCwgcywgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplCi0JCQkJKyAoZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA/IDggOiA0KSwKLQkJCQlOVUxMLCB0cnVlLCBmYWxzZSwgCi0JCQkJKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmIG15aCk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOyAgCi0gIAotICBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgKz0gVEhVTUIyQVJNX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLS8qIFNlbGVjdCBhIEJGRCB0byBiZSB1c2VkIHRvIGhvbGQgdGhlIHNlY3Rpb25zIHVzZWQgYnkgdGhlIGdsdWUgY29kZS4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGxpbmtlciBzY3JpcHRzIGluIGxkL2VtdWx0ZW1wbC8KLSAgIHthcm1jb2ZmL3BlfS5lbSAgKi8KLQotYm9vbGVhbgotYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqIAkJICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLXsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0gIGZsYWd3b3JkICAgCQkJICAgIGZsYWdzOwotICBhc2VjdGlvbiAqIAkJCSAgICBzZWM7Ci0gICAgCi0gIC8qIElmIHdlIGFyZSBvbmx5IHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmsgZG8gbm90IGJvdGhlcgotICAgICBnZXR0aW5nIGEgYmZkIHRvIGhvbGQgdGhlIGdsdWUuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotICAKLSAgaWYgKHNlYyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfQ09ERSB8IFNFQ19SRUFET05MWTsKLSAgICAgIAotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgICAgIAotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzZWMgPT0gTlVMTCkgCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0NPREUgfCBTRUNfUkVBRE9OTFk7Ci0gICAgICAKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gICAgICAKLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgCi0gIC8qIFNhdmUgdGhlIGJmZCBmb3IgbGF0ZXIgdXNlLiAgKi8KLSAgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgPSBhYmZkOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgaW5mbywgc3VwcG9ydF9vbGRfY29kZSkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKLSAgICAgaW50CQkgICAgIHN1cHBvcnRfb2xkX2NvZGU7Ci17Ci0gIGFzZWN0aW9uICogc2VjOwotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgdG8gY29uc3RydWN0IGFueSBnbHVlLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIC8qIEhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiAgV2UgaGF2ZSBhIGhvb2sKLSAgICAgdG8gZG8gcmVsb2MgcnVtbWFnaW5nLCBiZWZvcmUgc2VjdGlvbiBzaXplcyBhcmUgbmFpbGVkIGRvd24uICAqLwotCi0gIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCk7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA9IHN1cHBvcnRfb2xkX2NvZGU7Ci0gIAotICAvKiBSdW1tYWdlIGFyb3VuZCBhbGwgdGhlIHJlbG9jcyBhbmQgbWFwIHRoZSBnbHVlIHZlY3RvcnMuICAqLwotICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yICg7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICogaTsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbDsKLQotICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkgCi0JY29udGludWU7Ci0KLSAgICAgIC8qIExvYWQgdGhlIHJlbG9jcy4gICovCi0gICAgICAvKiBGSVhNRTogdGhlcmUgbWF5IGJlIGEgc3RvcmFnZSBsZWFrIGhlcmUuICovCi0gICAgICAKLSAgICAgIGkgPSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgMSwgMCwgMCwgMCk7Ci0gICAgCi0gICAgICBCRkRfQVNTRVJUIChpICE9IDApOwotCi0gICAgICBmb3IgKHJlbCA9IGk7IHJlbCA8IGkgKyBzZWMtPnJlbG9jX2NvdW50OyArK3JlbCkgCi0JewotCSAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgIHJfdHlwZSAgPSByZWwtPnJfdHlwZTsKLQkgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1uZHg7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgaDsKLQotCSAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgbm90IGFnYWluc3QgYSBzeW1ib2wgaXQgY2Fubm90IGNvbmNlcm4gdXMuICovCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhlIGluZGV4IGlzIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIG91ciB0YWJsZSwgc29tZXRoaW5nIGhhcyBnb25lIHdyb25nLiAgKi8KLQkgIGlmIChzeW1uZHggPj0gb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkpCi0JICAgIHsKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCBpbiByZWxvYzogJWQiKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzeW1uZHgpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKVtzeW1uZHhdOwotCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGEgc3RhdGljIHN5bWJvbCBpdCBtdXN0IGJlIHdpdGhpbgotCSAgICAgdGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgc28gY2Fubm90IGJlIGEgY3Jvc3MgQVJNL1RodW1iIHJlbG9jYXRpb24uICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIHN3aXRjaCAocl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgQVJNXzI2OgotCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIGFybSBjb2RlLiAgV2UgbmVlZCB0byBsb29rIHVwCi0JCSB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBhIHRodW1iIHRhcmdldCwgd2UKLQkJIGluc2VydCBnbHVlLiAgKi8KLQkgICAgICAKLQkgICAgICBpZiAoaC0+Y2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCi0JCXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAoaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0jaWZuZGVmIEFSTV9XSU5DRQotCSAgICBjYXNlIEFSTV9USFVNQjIzOgotCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIHRodW1iIGNvZGUuICBXZSB1c2VkIHRvIGxvb2sKLQkJIGZvciBBUk1fVEhVTUI5IGFuZCBBUk1fVEhVTUIxMiBhcyB3ZWxsLiAgV2UgbmVlZCB0byBsb29rCi0JCSB1cCB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBhbiBhcm0gdGFyZ2V0LCB3ZQotCQkgaW5zZXJ0IGdsdWUuICBJZiB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0IGl0IHdpbGwgYmUKLQkJIGdpdmVuIGEgY2xhc3Mgb2YgQ19FWFQgYW5kIHNvIHdlIHdpbGwgZ2VuZXJhdGUgYSBzdHViCi0JCSBmb3IgaXQuICBUaGlzIGlzIG5vdCByZWFsbHkgYSBwcm9ibGVtLCBzaW5jZSB0aGUgbGluawotCQkgaXMgZG9vbWVkIGFueXdheS4gICovCi0KLQkgICAgICBzd2l0Y2ggKGgtPmNsYXNzKQotCQl7Ci0JCWNhc2UgQ19FWFQ6Ci0JCWNhc2UgQ19TVEFUOgotCQljYXNlIENfTEFCRUw6Ci0JCSAgcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlIChpbmZvLCBoKTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICA7Ci0JCX0KLQkgICAgICBicmVhazsKLSNlbmRpZgotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoQ09GRl9JTUFHRV9XSVRIX1BFKSAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIAkJY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIAkJCWNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAJCWNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4CQkJY29mZl9hcm1fYWRqdXN0X3N5bW5keAotI2RlZmluZSBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biAJCWNvZmZfYXJtX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotI2RlZmluZSBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAkJY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0Ci0jZGVmaW5lIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEJCWNvZmZfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQkJY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyAgICAgICAgICAgICAgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgICAgICAgICAgY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUJCWNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotCi0vKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIHdhbnQgdG8gY29udmVydCBBUk0yNiByZWxvY3MKLSAgIGludG8gQVJNMjZEIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9hZGp1c3Rfc3ltbmR4IChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIGlyZWwsIGFkanVzdGVkcCkKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICBib29sZWFuICphZGp1c3RlZHA7Ci17Ci0gIGlmIChpcmVsLT5yX3R5cGUgPT0gMykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpYmZkKVtpcmVsLT5yX3N5bW5keF07Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IHNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JaXJlbC0+cl90eXBlID0gNzsKLSAgICB9Ci0gICphZGp1c3RlZHAgPSBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIG1lcmdpbmcgdGhlIHByaXZhdGUgZGF0YSBhcmVhcyBvZiB0d28gQkZEcy4KLSAgIFRoaXMgaXMgaW1wb3J0YW50IGFzIGl0IGFsbG93cyB1cyB0byBkZXRlY3QgaWYgd2UgYXJlCi0gICBhdHRlbXB0aW5nIHRvIG1lcmdlIGJpbmFyaWVzIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQgQVJNCi0gICB0YXJnZXRzLCBlZyBkaWZmZXJlbnQgQ1BVcyBvciBkaWZmZXJlbnRzIEFQQ1Mncy4gICAgICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiAgIGliZmQ7Ci0gICAgIGJmZCAqICAgb2JmZDsKLXsKLSAgQkZEX0FTU0VSVCAoaWJmZCAhPSBOVUxMICYmIG9iZmQgIT0gTlVMTCk7Ci0KLSAgaWYgKGliZmQgPT0gb2JmZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGUgdHdvIGZvcm1hdHMgYXJlIGRpZmZlcmVudCB3ZSBjYW5ub3QgbWVyZ2UgYW55dGhpbmcuCi0gICAgIFRoaXMgaXMgbm90IGFuIGVycm9yLCBzaW5jZSBpdCBpcyBwZXJtaXNzYWJsZSB0byBjaGFuZ2UgdGhlCi0gICAgIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cy4gICovCi0gIGlmICggICBpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFZlcmlmeSB0aGF0IHRoZSBBUENTIGlzIHRoZSBzYW1lIGZvciB0aGUgdHdvIEJGRHMgKi8KLSAgaWYgKEFQQ1NfU0VUIChpYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoQVBDU19TRVQgKG9iZmQpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgQVBDUyBmbGFnIGJpdHMgc2V0LCBmYWlsLiAgKi8KLQkgIGlmIChBUENTXzI2X0ZMQUcgKG9iZmQpICE9IEFQQ1NfMjZfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCShfKCIlczogRVJST1I6IGNvbXBpbGVkIGZvciBBUENTLSVkIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgQVBDUy0lZCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIEFQQ1NfMjZfRkxBRyAoaWJmZCkgPyAyNiA6IDMyLAotCQkgYmZkX2dldF9maWxlbmFtZSAob2JmZCksIEFQQ1NfMjZfRkxBRyAob2JmZCkgPyAyNiA6IDMyCi0JCSApOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAKLQkgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKG9iZmQpICE9IEFQQ1NfRkxPQVRfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICptc2c7Ci0KLQkgICAgICBpZiAoQVBDU19GTE9BVF9GTEFHIChpYmZkKSkKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBmbG9hdCByZWdpc3RlcnMgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBpbnRlZ2VyIHJlZ2lzdGVycyIpOwotCSAgICAgIGVsc2UKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGZsb2F0IHJlZ2lzdGVycyIpOwotCSAgICAgIAotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBpZiAoUElDX0ZMQUcgKG9iZmQpICE9IFBJQ19GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKiBtc2c7Ci0KLQkgICAgICBpZiAoUElDX0ZMQUcgKGliZmQpKQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBjb21waWxlZCBhcyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCB3aGVyZWFzIHRhcmdldCAlcyBpcyBhYnNvbHV0ZSBwb3NpdGlvbiIpOwotCSAgICAgIGVsc2UKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgYWJzb2x1dGUgcG9zaXRpb24gY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgcG9zaXRpb24gaW5kZXBlbmRlbnQiKTsKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU0VUX0FQQ1NfRkxBR1MgKG9iZmQsIEFQQ1NfMjZfRkxBRyAoaWJmZCkgfCBBUENTX0ZMT0FUX0ZMQUcgKGliZmQpIHwgUElDX0ZMQUcgKGliZmQpKTsKLQkgIAotCSAgLyogU2V0IHVwIHRoZSBhcmNoIGFuZCBmaWVsZHMgYXMgd2VsbCBhcyB0aGVzZSBhcmUgcHJvYmFibHkgd3JvbmcuICAqLwotCSAgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhlIGludGVyd29ya2luZyBzdXBwb3J0LiAgKi8KLSAgaWYgKElOVEVSV09SS19TRVQgKGliZmQpKQotICAgIHsKLSAgICAgIGlmIChJTlRFUldPUktfU0VUIChvYmZkKSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGRpZmZlciBpbiB0aGVpciBpbnRlcndvcmtpbmcgaXNzdWUgYSB3YXJuaW5nLiAgKi8KLQkgIGlmIChJTlRFUldPUktfRkxBRyAob2JmZCkgIT0gSU5URVJXT1JLX0ZMQUcgKGliZmQpKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqIG1zZzsKLQotCSAgICAgIGlmIChJTlRFUldPUktfRkxBRyAoaWJmZCkpCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIHN1cHBvcnRzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzIG5vdC4iKTsKLQkgICAgICBlbHNlCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzIGRvZXMuIik7Ci0JICAgICAgCi0JICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFNFVF9JTlRFUldPUktfRkxBRyAob2JmZCwgSU5URVJXT1JLX0ZMQUcgKGliZmQpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotICAKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICV4OiIpLCBjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyk7Ci0gIAotICBpZiAoQVBDU19TRVQgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OiBBUENTIGlzIEFSTSBQcm9kZWN1cmUgQ2FsbCBTdGFuZGFyZCwgaXQgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkLiAgKi8KLSAgICAgIGZwcmludGYgKGZpbGUsICIgW0FQQ1MtJWRdIiwgQVBDU18yNl9GTEFHIChhYmZkKSA/IDI2IDogMzIpOwotCi0gICAgICBpZiAoQVBDU19GTE9BVF9GTEFHIChhYmZkKSkKLQlmcHJpbnRmIChmaWxlLCBfKCIgW2Zsb2F0cyBwYXNzZWQgaW4gZmxvYXQgcmVnaXN0ZXJzXSIpKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChmaWxlLCBfKCIgW2Zsb2F0cyBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnNdIikpOwotCi0gICAgICBpZiAoUElDX0ZMQUcgKGFiZmQpKQotCWZwcmludGYgKGZpbGUsIF8oIiBbcG9zaXRpb24gaW5kZXBlbmRlbnRdIikpOwotICAgICAgZWxzZQotCWZwcmludGYgKGZpbGUsIF8oIiBbYWJzb2x1dGUgcG9zaXRpb25dIikpOwotICAgIH0KLSAgCi0gIGlmICghIElOVEVSV09SS19TRVQgKGFiZmQpKQotICAgIGZwcmludGYgKGZpbGUsIF8oIiBbaW50ZXJ3b3JraW5nIGZsYWcgbm90IGluaXRpYWxpc2VkXSIpKTsKLSAgZWxzZSBpZiAoSU5URVJXT1JLX0ZMQUcgKGFiZmQpKQotICAgIGZwcmludGYgKGZpbGUsIF8oIiBbaW50ZXJ3b3JraW5nIHN1cHBvcnRlZF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfKCIgW2ludGVyd29ya2luZyBub3Qgc3VwcG9ydGVkXSIpKTsKLSAgCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENvcGllcyB0aGUgZ2l2ZW4gZmxhZ3MgaW50byB0aGUgY29mZl90ZGF0YS5mbGFncyBmaWVsZC4KLSAgIFR5cGljYWxseSB0aGVzZSBmbGFncyBjb21lIGZyb20gdGhlIGZfZmxhZ3NbXSBmaWVsZCBvZgotICAgdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsIHdoaWNoIGNvbnRhaW5zIGltcG9ydGFudCwKLSAgIHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLSAgIE5vdGU6IEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgc3RhdGljLCBpdCBpcyBleHBsaWNpdGx5Ci0gICBjYWxsZWQgZnJvbSBib3RoIGNvZmZjb2RlLmggYW5kIHBlaWNvZGUuaC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1fYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLQliZmQgKgkgICBhYmZkOwotCWZsYWd3b3JkICAgZmxhZ3M7Ci17Ci0gIGZsYWd3b3JkIGZsYWc7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMKTsKLQotICBmbGFnID0gKGZsYWdzICYgRl9BUENTMjYpID8gRl9BUENTXzI2IDogMDsKLSAgCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBBUENTIGZpZWxkIGhhcyBub3QgYmVlbiBpbml0aWFsaXNlZCB0byB0aGUgb3Bwb3NpdGUKLSAgICAgdmFsdWUuICAqLwotICBpZiAoQVBDU19TRVQgKGFiZmQpCi0gICAgICAmJiAoICAgKEFQQ1NfMjZfRkxBRyAgICAoYWJmZCkgIT0gZmxhZykKLQkgIHx8IChBUENTX0ZMT0FUX0ZMQUcgKGFiZmQpICE9IChmbGFncyAmIEZfQVBDU19GTE9BVCkpCi0JICB8fCAoUElDX0ZMQUcgICAgICAgIChhYmZkKSAhPSAoZmxhZ3MgJiBGX1BJQykpCi0JICApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmbGFnIHw9IChmbGFncyAmIChGX0FQQ1NfRkxPQVQgfCBGX1BJQykpOwotICAKLSAgU0VUX0FQQ1NfRkxBR1MgKGFiZmQsIGZsYWcpOwotCi0gIGZsYWcgPSAoZmxhZ3MgJiBGX0lOVEVSV09SSyk7Ci0gIAotICAvKiBJZiB0aGUgQkZEIGhhcyBhbHJlYWR5IGhhZCBpdHMgaW50ZXJ3b3JraW5nIGZsYWcgc2V0LCBidXQgaXQKLSAgICAgaXMgZGlmZmVyZW50IGZyb20gdGhlIHZhbHVlIHRoYXQgd2UgaGF2ZSBiZWVuIGFza2VkIHRvIHNldCwKLSAgICAgdGhlbiBhc3N1bWUgdGhhdCB0aGF0IG1lcmdlZCBjb2RlIHdpbGwgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nCi0gICAgIGFuZCBzZXQgdGhlIGZsYWcgYWNjb3JkaW5nbHkuICAqLwotICBpZiAoSU5URVJXT1JLX1NFVCAoYWJmZCkgJiYgKElOVEVSV09SS19GTEFHIChhYmZkKSAhPSBmbGFnKSkKLSAgICB7Ci0gICAgICBpZiAoZmxhZykKLQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQlfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIldhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29ya2luZyBmbGFnIG9mICVzLCBzaW5jZSBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCBhcyBub24taW50ZXJ3b3JraW5nIiksCi0JCQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgZWxzZQotCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCV9iZmRfZXJyb3JfaGFuZGxlciAoXygiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBmbGFnID0gMDsKLSAgICB9Ci0KLSAgU0VUX0lOVEVSV09SS19GTEFHIChhYmZkLCBmbGFnKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDb3B5IHRoZSBpbXBvcnRhbnQgcGFydHMgb2YgdGhlIHRhcmdldCBzcGVjaWZpYyBkYXRhCi0gICBmcm9tIG9uZSBpbnN0YW5jZSBvZiBhIEJGRCB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoc3JjLCBkZXN0KQotICAgICBiZmQgKiAgc3JjOwotICAgICBiZmQgKiAgZGVzdDsKLXsKLSAgQkZEX0FTU0VSVCAoc3JjICE9IE5VTEwgJiYgZGVzdCAhPSBOVUxMKTsKLSAKLSAgaWYgKHNyYyA9PSBkZXN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBub3QgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBzb3VyY2UsIGRvIG5vdCBkbwotICAgICB0aGUgY29weS4gICovCi0gIGlmIChzcmMtPnh2ZWMgIT0gZGVzdC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBjb3B5IHRoZSBmbGFncyBmaWVsZCAqLwotICBpZiAoQVBDU19TRVQgKHNyYykpCi0gICAgewotICAgICAgaWYgKEFQQ1NfU0VUIChkZXN0KSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IEFQQ1MgZmxhZyBiaXRzIHNldCwgZmFpbC4gICovCi0JICBpZiAoQVBDU18yNl9GTEFHIChkZXN0KSAhPSBBUENTXzI2X0ZMQUcgKHNyYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIAotCSAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAoZGVzdCkgIT0gQVBDU19GTE9BVF9GTEFHIChzcmMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAKLQkgIGlmIChQSUNfRkxBRyAoZGVzdCkgIT0gUElDX0ZMQUcgKHNyYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JU0VUX0FQQ1NfRkxBR1MgKGRlc3QsIEFQQ1NfMjZfRkxBRyAoc3JjKSB8IEFQQ1NfRkxPQVRfRkxBRyAoc3JjKQotCQkJfCBQSUNfRkxBRyAoc3JjKSk7Ci0gICAgfQotCi0gIGlmIChJTlRFUldPUktfU0VUIChzcmMpKQotICAgIHsKLSAgICAgIGlmIChJTlRFUldPUktfU0VUIChkZXN0KSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IGludGVyd29ya2luZyBmbGFncyB0aGVuIHR1cm4KLQkgICAgIG9mZiB0aGUgaW50ZXJ3b3JraW5nIGJpdC4gICovCi0JICBpZiAoSU5URVJXT1JLX0ZMQUcgKGRlc3QpICE9IElOVEVSV09SS19GTEFHIChzcmMpKQotCSAgICB7Ci0JICAgICAgaWYgKElOVEVSV09SS19GTEFHIChkZXN0KSkKLQkJewotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgX2JmZF9lcnJvcl9oYW5kbGVyICgoIldhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmtpbmcgYml0IG9mICVzLCBiZWNhdXNlIHRoZSBub24taW50ZXJ3b3JraW5nIGNvZGUgaW4gJXMgaGFzIGJlZW4gY29waWVkIGludG8gaXQiKSwKLQkJCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChkZXN0KSwKLQkJCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzcmMpKTsKLQkJfQotCSAgICAgIAotCSAgICAgIFNFVF9JTlRFUldPUktfRkxBRyAoZGVzdCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU0VUX0lOVEVSV09SS19GTEFHIChkZXN0LCBJTlRFUldPUktfRkxBRyAoc3JjKSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTm90ZTogIHRoZSBkZWZpbml0aW9ucyBoZXJlIG9mIExPQ0FMX0xBQkVMX1BSRUZJWCBhbmQgVVNFUl9MQUJFTF9QUkVJRlgKLSAqbXVzdCogbWF0Y2ggdGhlIGRlZmluaXRpb25zIGluIGdjYy9jb25maWcvYXJtL2NvZmYuaCBhbmQgc2VtaS5oICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMX1BSRUZJWCAiLiIKLSNpZm5kZWYgVVNFUl9MQUJFTF9QUkVGSVgKLSNkZWZpbmUgVVNFUl9MQUJFTF9QUkVGSVggIl8iCi0jZW5kaWYKLQotLyogTGlrZSBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSwgYnV0Ci0gICBhKSB0ZXN0IGFnYWluc3QgVVNFUl9MQUJFTF9QUkVGSVgsIHRvIGF2b2lkIHN0cmlwcGluZyBsYWJlbHMga25vd24gdG8gYmUKLSAgICAgIG5vbi1sb2NhbC4KLSAgIGIpIEFsbG93IG90aGVyIHByZWZpeGVzIHRoYW4gIi4iLCBlLmcuIGFuIGVtcHR5IHByZWZpeCB3b3VsZCBjYXVzZSBhbGwKLSAgICAgIGxhYmVscyBvZiB0aGUgZm9ybSBMeHh4IHRvIGJlIHN0cmlwcGVkLiAgKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICogbmFtZTsKLXsKLSNpZmRlZiBVU0VSX0xBQkVMX1BSRUZJWAotICBpZiAoVVNFUl9MQUJFTF9QUkVGSVhbMF0gIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgVVNFUl9MQUJFTF9QUkVGSVgsIHN0cmxlbiAoVVNFUl9MQUJFTF9QUkVGSVgpKSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIExPQ0FMX0xBQkVMX1BSRUZJWAotICAvKiBJZiB0aGVyZSBpcyBhIHByZWZpeCBmb3IgbG9jYWwgbGFiZWxzIHRoZW4gbG9vayBmb3IgdGhpcy4KLSAgICAgSWYgdGhlIHByZWZpeCBleGlzdHMsIGJ1dCBpdCBpcyBlbXB0eSwgdGhlbiBpZ25vcmUgdGhlIHRlc3QuICovCi0gIAotICBpZiAoTE9DQUxfTEFCRUxfUFJFRklYWzBdICE9IDApCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoTE9DQUxfTEFCRUxfUFJFRklYKTsKLSAgICAgIAotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIExPQ0FMX0xBQkVMX1BSRUZJWCwgbGVuKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgLyogUGVyZm9ybSB0aGUgY2hlY2tzIGJlbG93IGZvciB0aGUgcmVzdCBvZiB0aGUgbmFtZS4gICovCi0gICAgICBuYW1lICs9IGxlbjsKLSAgICB9Ci0jZW5kaWYKLSAgCi0gIHJldHVybiBuYW1lWzBdID09ICdMJzsKLX0KLQotLyogVGhpcyBwaWVjZSBvZiBtYWNoaW5lcnkgZXhpc3RzIG9ubHkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJmZCB0aGF0IGhvbGRzCi0gICB0aGUgZ2x1ZSBzZWN0aW9uIGlzIHdyaXR0ZW4gbGFzdC4gCi0KLSAgIFRoaXMgZG9lcyBkZXBlbmQgb24gYmZkX21ha2Vfc2VjdGlvbiBhdHRhY2hpbmcgYSBuZXcgc2VjdGlvbiB0byB0aGUKLSAgIGVuZCBvZiB0aGUgc2VjdGlvbiBsaXN0IGZvciB0aGUgYmZkLiAKLQotICAga3JrQGN5Z251cy5jb20gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4gKHN1YiwgaW5mbykKLSAgICAgYmZkICogc3ViOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBpbmZvOwotewotICByZXR1cm4gKHN1Yi0+b3V0cHV0X2hhc19iZWd1bgotCSAgfHwgc3ViID09IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8tPmluZm8pLT5iZmRfb2ZfZ2x1ZV9vd25lcik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsIHBmaW5mbykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm87Ci17Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChwZmluZm8tPmluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgCi0gIGlmIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAocGZpbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lcikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lci0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNIGFybWNvZmZfbGl0dGxlX3ZlYwotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfTkFNRQotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgImNvZmYtYXJtLWxpdHRsZSIKLSNlbmRpZgotI2lmbmRlZiBUQVJHRVRfQklHX1NZTQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSBhcm1jb2ZmX2JpZ192ZWMKLSNlbmRpZgotI2lmbmRlZiBUQVJHRVRfQklHX05BTUUKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICJjb2ZmLWFybS1iaWciCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAwCi0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2RlZmluZSBFWFRSQV9TX0ZMQUdTIChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUykKLSNlbHNlCi0jZGVmaW5lIEVYVFJBX1NfRkxBR1MgMAotI2VuZGlmCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSBpbml0aWFsaXNpbmcgYWx0ZXJuYXRpdmVfdGFyZ2V0IGZpZWxkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9CSUdfU1lNIDsKLQotLyogVGFyZ2V0IHZlY3RvcnMuICAqLwotQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfTElUVExFX05BTUUsIERfUEFHRUQsIEVYVFJBX1NfRkxBR1MsIFRBUkdFVF9VTkRFUlNDT1JFLCAmIFRBUkdFVF9CSUdfU1lNKQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUsIERfUEFHRUQsIEVYVFJBX1NfRkxBR1MsIFRBUkdFVF9VTkRFUlNDT1JFLCAmIFRBUkdFVF9MSVRUTEVfU1lNKQotCmRpZmYgLS1naXQgYS9iZmQvY29mZi1hdXguYyBiL2JmZC9jb2ZmLWF1eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY2MzkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWF1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQXBwbGUgTTY4SyBDT0ZGIEEvVVggMy54IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQltNjhrYXV4X2NvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstYXV4IgotCi0jaWZuZGVmIFRBUkdfQVVYCi0jZGVmaW5lIFRBUkdfQVVYCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLS8qIDRrIHBhZ2VzICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBPbiBBVVgsIGEgU1RZUF9OT0xPQUR8U1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkIGxpYnJhcnkuICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0KLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotc3RhdGljIGJvb2xlYW4gY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCAKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLCAKLSAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotI2RlZmluZSBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCi0KLSNpbmNsdWRlICJjb2ZmL2F1eC1jb2ZmLmgiICAvKiBvdmVycmlkZSBjb2ZmL2ludGVybmFsLmggYW5kIGNvZmYvbTY4ay5oICovCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCi0KLS8qIFdlIG5lZWQgbm9uLWFic29sdXRlIHN5bWJvbHMgdG8gb3ZlcnJpZGUgYWJzb2x1dGUgc3ltYm9scy4gIFRoaXMKLSAgIG1pcnJvcnMgQXBwbGUncyAic29sdXRpb24iIHRvIGxldCBhIHN0YXRpYyBsaWJyYXJ5IHN5bWJvbCBvdmVycmlkZQotICAgYSBzaGFyZWQgbGlicmFyeSBzeW1ib2wuICBPbiB0aGUgd2hvbGUgbm90IGEgZ29vZCB0aGluZywgZ2l2ZW4gaG93Ci0gICBzaGFyZWQgbGlicmFyaWVzIHdvcmsgaGVyZSwgYnV0IGNhbiB3b3JrIGlmIHlvdSBhcmUgY2FyZWZ1bCB3aXRoCi0gICB3aGF0IHlvdSBpbmNsdWRlIGluIHRoZSBzaGFyZWQgb2JqZWN0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCQkJICAgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoKGZsYWdzICYgKEJTRl9XQVJOSU5HIHwgQlNGX0NPTlNUUlVDVE9SIHwgQlNGX1dFQUspKSA9PSAwICYmCi0gICAgICAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSAmJgotICAgICAgIWJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgewotICAgICAgLyogVGhlIG5ldyBzeW1ib2wgaXMgYSBkZWZpbml0aW9uIG9yIGFuIGluZGlyZWN0IGRlZmluaXRpb24gKi8KLQotICAgICAgLyogVGhpcyBiaXQgY29waWVkIGZyb20gbGlua2VyLmMgKi8KLSAgICAgIGlmIChoYXNocCAhPSBOVUxMICYmICpoYXNocCAhPSBOVUxMKQotCXsKLQkgIGggPSAqaGFzaHA7Ci0JICBCRkRfQVNTRVJUIChzdHJjbXAgKGgtPnJvb3Quc3RyaW5nLCBuYW1lKSA9PSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSk7Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGhhc2hwICE9IE5VTEwpCi0JCSpoYXNocCA9IE5VTEw7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+bm90aWNlX2hhc2ggIT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMCi0JICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCSAgICAgICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpCi0JewotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPm5vdGljZSkgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGhhc2hwICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkKLQkqaGFzaHAgPSBoOwotICAgICAgLyogZW5kIGR1cGxpY2F0aW9uIGZyb20gbGlua2VyLmMgKi8KLQotICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JewotCSAgYXNlY3Rpb24gKm1zZWM7Ci0KLQkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgICAgbXNlYyA9IGgtPnUuZGVmLnNlY3Rpb247Ci0JICBlbHNlCi0JICAgIG1zZWMgPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotCi0JICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChtc2VjKSAmJiAhYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKSkKLQkgICAgewotCSAgICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOwotCSAgICAgIGgtPnUuZGVmLnZhbHVlID0gdmFsdWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikgJiYgIWJmZF9pc19hYnNfc2VjdGlvbiAobXNlYykpCi0JICAgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGV4aXQgZWFybHksIGZpbmlzaCBwcm9jZXNzaW5nIGluIHRoZSBnZW5lcmljIHJvdXRpbmUgKi8KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLQkJCQkJICAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLQkJCQkJICAgaGFzaHApOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtZ28zMi5jIGIvYmZkL2NvZmYtZ28zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmIyOGUxLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWdvMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IENPRkYgZmlsZXMgKERKR1BQIHZhcmlhbnQpLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBESiBEZWxvcmllLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQkJZ28zMmNvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCQkiY29mZi1nbzMyIgotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRQknXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSNkZWZpbmUgQ09GRl9TVVBQT1JUX0dOVV9MSU5LT05DRQotCi0jZGVmaW5lIENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi50ZXh0IiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCA0IH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfUEFSVElBTF9NQVRDSCAoIi5nbnUubGlua29uY2UuZCIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuZ251LmxpbmtvbmNlLnQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLmdudS5saW5rb25jZS5yIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCA0IH0KLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaDgzMDAuYyBiL2JmZC9jb2ZmLWg4MzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTRmMjAuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtaDgzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNDkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIaXRhY2hpIEg4LzMwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotI2luY2x1ZGUgImNvZmYvaDgzMDAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLQotLyogV2UgZGVyaXZlIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBiYXNpYyBCRkQgaGFzaCB0YWJsZSB0bwotICAgaG9sZCBlbnRyaWVzIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IuICBBc2lkZSBmcm9tIHRoZSAKLSAgIGluZm8gc3RvcmVkIGJ5IHRoZSBiYXNpYyBoYXNoIHRhYmxlLCB3ZSBuZWVkIHRoZSBvZmZzZXQKLSAgIG9mIGEgcGFydGljdWxhciBlbnRyeSB3aXRoaW4gdGhlIGhhc2ggdGFibGUgYXMgd2VsbCBhcwotICAgdGhlIG9mZnNldCB3aGVyZSB3ZSdsbCBhZGQgdGhlIG5leHQgZW50cnkuICAqLwotCi1zdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5Ci17Ci0gIC8qIFRoZSBiYXNpYyBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogVGhlIG9mZnNldCB3aXRoaW4gdGhlIHZlY3RvcnMgc2VjdGlvbiB3aGVyZQotICAgICB0aGlzIGVudHJ5IGxpdmVzLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7Ci19OwotCi1zdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBiYXNpYyBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgYmZkICphYmZkOwotCi0gIC8qIE9mZnNldCBhdCB3aGljaCB3ZSdsbCBhZGQgdGhlIG5leHQgZW50cnkuICAqLwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1mdW5jdmVjX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZnVuY3ZlY19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqLCBiZmQgKiwKLSAgICAgICAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICopKSkpOwotCi0vKiBUbyBsb29rdXAgYSB2YWx1ZSBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotI2RlZmluZSBmdW5jdmVjX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBUaGUgZGVyaXZlZCBoODMwMCBDT0ZGIGxpbmtlciB0YWJsZS4gIE5vdGUgaXQncyBkZXJpdmVkIGZyb20KLSAgIHRoZSBnZW5lcmljIGxpbmtlciBoYXNoIHRhYmxlLCBub3QgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIgaGFzaAotICAgdGFibGUhICBXZSB1c2UgdGhpcyB0byBhdHRhY2ggYWRkaXRpb25hbCBkYXRhIHN0cnVjdHVyZXMgd2UKLSAgIG5lZWQgd2hpbGUgbGlua2luZyBvbiB0aGUgaDgzMDAuICAqLwotc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBtYWluIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBTZWN0aW9uIGZvciB0aGUgdmVjdG9ycyB0YWJsZS4gIFRoaXMgZ2V0cyBhdHRhY2hlZCB0byBhCi0gICAgIHJhbmRvbSBpbnB1dCBiZmQsIHdlIGtlZXAgaXQgaGVyZSBmb3IgZWFzeSBhY2Nlc3MuICAqLwotICBhc2VjdGlvbiAqdmVjdG9yc19zZWM7Ci0KLSAgLyogSGFzaCB0YWJsZSBvZiB0aGUgZnVuY3Rpb25zIHdlIG5lZWQgdG8gZW50ZXIgaW50byB0aGUgZnVuY3Rpb24KLSAgICAgdmVjdG9yLiAgKi8KLSAgc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqZnVuY3ZlY19oYXNoX3RhYmxlOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLQotLyogR2V0IHRoZSBIOC8zMDAgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgaDgzMDBfY29mZl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChjb2ZmX2hhc2hfdGFibGUgKHApKSkpCi0KLS8qIEluaXRpYWxpemUgZmllbGRzIHdpdGhpbiBhIGZ1bmN2ZWMgaGFzaCB0YWJsZSBlbnRyeS4gIENhbGxlZCB3aGVuZXZlcgotICAgYSBuZXcgZW50cnkgaXMgYWRkZWQgdG8gdGhlIGZ1bmN2ZWMgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZnVuY3ZlY19oYXNoX25ld2Z1bmMgKGVudHJ5LCBnZW5fdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICpnZW5fdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqcmV0OwotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICp0YWJsZTsKLQotICByZXQgPSAoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLSAgdGFibGUgPSAoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqKSBnZW5fdGFibGU7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKikKLSAgICAgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKGdlbl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopCi0gICAgICAgICBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgZ2VuX3RhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogTm90ZSB3aGVyZSB0aGlzIGVudHJ5IHdpbGwgcmVzaWRlIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgdGFibGUuICAqLwotICByZXQtPm9mZnNldCA9IHRhYmxlLT5vZmZzZXQ7Ci0KLSAgLyogQnVtcCB0aGUgb2Zmc2V0IGF0IHdoaWNoIHdlIHN0b3JlIGVudHJpZXMgaW4gdGhlIGZ1bmN0aW9uCi0gICAgIHZlY3Rvci4gIFdlJ2QgbGlrZSB0byBidW1wIHVwIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3JzIHNlY3Rpb24sCi0gICAgIGJ1dCBpdCdzIG5vdCBlYXNpbHkgYXZhaWxhYmxlIGhlcmUuICAqLwotICBpZiAoYmZkX2dldF9tYWNoICh0YWJsZS0+YWJmZCkgPT0gYmZkX21hY2hfaDgzMDApCi0gICAgdGFibGUtPm9mZnNldCArPSAyOwotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKHRhYmxlLT5hYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKLQkgICB8fCBiZmRfZ2V0X21hY2ggKHRhYmxlLT5hYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0gICAgdGFibGUtPm9mZnNldCArPSA0OwotICBlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogRXZlcnl0aGluZyB3ZW50IE9LLiAgKi8KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1mdW5jdmVjX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKSk7Ci17Ci0gIC8qIEluaXRpYWxpemUgb3VyIGxvY2FsIGZpZWxkcywgdGhlbiBjYWxsIHRoZSBnZW5lcmljIGluaXRpYWxpemF0aW9uCi0gICAgIHJvdXRpbmUuICAqLwotICB0YWJsZS0+b2Zmc2V0ID0gMDsKLSAgdGFibGUtPmFiZmQgPSBhYmZkOwotICByZXR1cm4gKGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgbmV3ZnVuYykpOwotfQotCi0vKiBDcmVhdGUgdGhlIGRlcml2ZWQgbGlua2VyIGhhc2ggdGFibGUuICBXZSB1c2UgYSBkZXJpdmVkIGhhc2ggdGFibGUKLSAgIGJhc2ljYWxseSB0byBob2xkICJzdGF0aWMiIGluZm9ybWF0aW9uIGR1cmluZyBhbiBoOC8zMDAgY29mZiBsaW5rCi0gICB3aXRob3V0IHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotICByZXQgPSAoKHN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotICAgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoIV9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3Qucm9vdCwgYWJmZCwgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJbml0aWFsaXplIG91ciBkYXRhLiAgKi8KLSAgcmV0LT52ZWN0b3JzX3NlYyA9IE5VTEw7Ci0gIHJldC0+ZnVuY3ZlY19oYXNoX3RhYmxlID0gTlVMTDsKLQotICAvKiBPSy4gIEV2ZXJ5dGhpbmcncyBpbnRpYWxpemVkLCByZXR1cm4gdGhlIGJhc2UgcG9pbnRlci4gICovCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEg4LzMwMCByZWxvY3MuCi0gICBXZSBvbmx5IGNvbWUgaGVyZSBmb3IgcGNyZWwgc3R1ZmYgYW5kIHJldHVybiBub3JtYWxseSBpZiBub3QgYW4gLXIgbGluay4KLSAgIFdoZW4gZG9pbmcgLXIsIHdlIGNhbid0IGRvIGFueSBhcml0aG1ldGljIGZvciB0aGUgcGNyZWwgc3R1ZmYsIGJlY2F1c2UKLSAgIHRoZSBjb2RlIGluIHJlbG9jLmMgYXNzdW1lcyB0aGF0IHdlIGNhbiBtYW5pcHVsYXRlIHRoZSB0YXJnZXRzIG9mCi0gICB0aGUgcGNyZWwgYnJhbmNoZXMuICBUaGlzIGlzbid0IHNvLCBzaW5jZSB0aGUgSDgvMzAwIGNhbiBkbyByZWxheGluZywgCi0gICB3aGljaCBtZWFucyB0aGF0IHRoZSBnYXAgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIG1heSBub3QgYmUgZW5vdWdoIHRvCi0gICBjb250YWluIHRoZSBvZmZzZXQgcmVxdWlyZWQgZm9yIHRoZSBicmFuY2gsIHNvIHdlIGhhdmUgdG8gdXNlIHRoZSBvbmx5Ci0gICB0aGUgYWRkZW5kIHVudGlsIHRoZSBmaW5hbCBsaW5rICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwZWNpYWwgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX1JFTEJZVEUsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjgiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9SRUxXT1JELCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMTYiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9SRUxMT05HLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMzIiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9QQ1JCWVRFLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQOCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8gKFJfUENSV09SRCwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRJU1AxNiIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKFJfUENSTE9ORywgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRJU1AzMiIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKFJfTU9WMTZCMSwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4YWJsZSBtb3YuYjoxNiIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX01PVjE2QjIsIDAsIDEsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4ZWQgbW92LmI6MTYiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9KTVAxLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMTYvcGNyZWwiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9KTVAyLCAwLCAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJwY3JlY2wvMTYiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9KTVBMMSwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjI0L3BjcmVsbCIsIGZhbHNlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUEwyLCAwLCAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJwYzgvMjQiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9NT1YyNEIxLCAwLCAxLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhhYmxlIG1vdi5iOjI0IiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfTU9WMjRCMiwgMCwgMSwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhlZCBtb3YuYjoyNCIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0KLSAgLyogQW4gaW5kaXJlY3QgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24uICBUaGlzIGNhdXNlcyB0aGUgZnVuY3Rpb24ncyBhZGRyZXNzCi0gICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaW4gbG8tbWVtIGFuZCBwdXRzIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBmdW5jdGlvbiB2ZWN0b3IncyBlbnRyeSBpbiB0aGUganNyIGluc3RydWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUVNX0lORElSRUNULCAwLCAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICI4L2luZGlyZWN0IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLQotICAvKiBJbnRlcm5hbCByZWxvYyBmb3IgcmVsYXhpbmcuICBUaGlzIGlzIGNyZWF0ZWQgd2hlbiBhIDE2Yml0IHBjLXJlbGF0aXZlCi0gICAgIGJyYW5jaCBpcyB0dXJuZWQgaW50byBhbiA4Yml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gICovCi0gIEhPV1RPIChSX1BDUldPUkRfQiwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGVkIGJDQzoxNiIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0KLSAgSE9XVE8gKFJfTU9WTDEsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsc3BlY2lhbCwgIjMyLzI0IHJlbGF4YWJsZSBtb3ZlIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLQotICBIT1dUTyAoUl9NT1ZMMiwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjMyLzI0IHJlbGF4ZWQgbW92ZSIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0KLSAgSE9XVE8gKFJfQkNDX0lOViwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDggaW52ZXJ0ZWQiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi0KLSAgSE9XVE8gKFJfSk1QX0RFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRGVsZXRlZCBqdW1wIiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotfTsKLQotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSBcCi0gIHsgeC5yX3R5cGUgPSBzZWxlY3RfcmVsb2MoaG93dG8pOyB9Ci0KLSNkZWZpbmUgQkFETUFHKHgpIChIODMwMEJBRE1BRyh4KSAmJiBIODMwMEhCQURNQUcoeCkgJiYgSDgzMDBTQkFETUFHKHgpKQotI2RlZmluZSBIODMwMCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLQotCi0vKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICAgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpIFwKLSAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOyBcCi0gIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsKLQotCi1zdGF0aWMgaW50Ci1zZWxlY3RfcmVsb2MgKGhvd3RvKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuIGhvd3RvLT50eXBlOwotfQotCi0vKiBDb2RlIHRvIHR1cm4gYSByX3R5cGUgaW50byBhIGhvd3RvIHB0ciwgdXNlcyB0aGUgYWJvdmUgaG93dG8gdGFibGUKLSAgICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoaW50ZXJuYWwsIGRzdCkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBzd2l0Y2ggKGRzdC0+cl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUkVMQllURToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9SRUxXT1JEOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1JFTExPTkc6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUENSQllURToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JXT1JEOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUkxPTkc6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YxNkIyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA3OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUDE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QTDI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDExOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVjI0QjE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVjI0QjI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDEzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01FTV9JTkRJUkVDVDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUENSV09SRF9COgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1ZMMToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WTDI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE3OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0JDQ19JTlY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUF9ERUw6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE5OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQotCi0KLS8qIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSBtYWdpYyB0byB0aGUgYWRkZW5kIGluIGEgcmVsb2MgZW50cnkgKi8KLQotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHN5bWJvbCwgZXh0X3JlbG9jLCBjYWNoZV9wdHIpIFwKLSBjYWNoZV9wdHItPmFkZGVuZCA9ICBleHRfcmVsb2Mucl9vZmZzZXQ7Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKiByZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmICgoKGludCkgcmVsb2MtPnJfc3ltbmR4KSA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0KLQotICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKLQotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotICAvKiAgcmVsZW50LT5zZWN0aW9uID0gMDsqLwotfQotCi1zdGF0aWMgYm9vbGVhbgotaDgzMDBfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBhc3ltYm9sICoqczsKLQotICBzID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpOwotICBCRkRfQVNTRVJUIChzICE9IChhc3ltYm9sICoqKSBOVUxMKTsKLQotICAvKiBTZWFyY2ggYWxsIHRoZSBzeW1ib2xzIGZvciBvbmUgaW4gSU5QVVRfU0VDVElPTiB3aXRoCi0gICAgIGFkZHJlc3MgQUREUkVTUy4gICovCi0gIHdoaWxlICgqcykgCi0gICAgewotICAgICAgYXN5bWJvbCAqcCA9ICpzOwotICAgICAgaWYgKHAtPnNlY3Rpb24gPT0gaW5wdXRfc2VjdGlvbgotCSAgJiYgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgICArIHAtPnZhbHVlKSA9PSBhZGRyZXNzKQotCXJldHVybiB0cnVlOwotICAgICAgcysrOwotICAgIH0gICAgCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBJZiBSRUxPQyByZXByZXNlbnRzIGEgcmVsYXhhYmxlIGluc3RydWN0aW9uL3JlbG9jLCBjaGFuZ2UgaXQgaW50bwotICAgdGhlIHJlbGF4ZWQgcmVsb2MsIG5vdGlmeSB0aGUgbGlua2VyIHRoYXQgc3ltYm9sIGFkZHJlc3NlcwotICAgaGF2ZSBjaGFuZ2VkIChiZmRfcGVyZm9ybV9zbGlwKSBhbmQgcmV0dXJuIGhvdyBtdWNoIHRoZSBjdXJyZW50Ci0gICBzZWN0aW9uIGhhcyBzaHJ1bmsgYnkuCi0KLSAgIEZJWE1FOiBNdWNoIG9mIHRoaXMgY29kZSBoYXMga25vd2xlZGdlIG9mIHRoZSBvcmRlcmluZyBvZiBlbnRyaWVzCi0gICBpbiB0aGUgaG93dG8gdGFibGUuICBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkLiAgKi8KLQotc3RhdGljIGludAotaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZShhYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBiZmRfdm1hIHZhbHVlOyAgCi0gIGJmZF92bWEgZG90OwotICBiZmRfdm1hIGdhcDsKLSAgc3RhdGljIGFzZWN0aW9uICpsYXN0X2lucHV0X3NlY3Rpb24gPSBOVUxMOwotICBzdGF0aWMgYXJlbGVudCAqbGFzdF9yZWxvYyA9IE5VTEw7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHRoaW5nIHRvIGJlIHJlbG9jYXRlZCB3aWxsIGhhdmUgbW92ZWQgYmFjayBieSAKLSAgICAgdGhlIHNpemUgb2YgdGhlIHNocmluayAtIGJ1dCB3ZSBkb24ndCBjaGFuZ2UgcmVsb2MtPmFkZHJlc3MgaGVyZSwKLSAgICAgc2luY2Ugd2UgbmVlZCBpdCB0byBrbm93IHdoZXJlIHRoZSByZWxvY2F0aW9uIGxpdmVzIGluIHRoZSBzb3VyY2UKLSAgICAgdW5jb29rZWQgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgYWRkcmVzcyA9IHJlbG9jLT5hZGRyZXNzIC0gc2hyaW5rOwotCi0gIGlmIChpbnB1dF9zZWN0aW9uICE9IGxhc3RfaW5wdXRfc2VjdGlvbikKLSAgICBsYXN0X3JlbG9jID0gTlVMTDsKLQotICAvKiBPbmx5IGV4YW1pbmUgdGhlIHJlbG9jcyB3aGljaCBtaWdodCBiZSByZWxheGFibGUuICAqLwotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7ICAgICAKLQotICAgIC8qIFRoaXMgaXMgdGhlIDE2LzI0IGJpdCBhYnNvbHV0ZSBicmFuY2ggd2hpY2ggY291bGQgYmVjb21lIGFuIDggYml0Ci0gICAgICAgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfSk1QMToKLSAgICBjYXNlIFJfSk1QTDE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzKTsKLQotICAgICAgLyogQWRqdXN0IGZvciBSX0pNUDEgdnMgUl9KTVBMMS4gICovCi0gICAgICBkb3QgKz0gKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0pNUDEgPyAxIDogMik7Ci0KLSAgICAgIC8qIENvbXB1dGUgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBpbnNuIHRvIHRoZSBicmFuY2ggdGFyZ2V0LiAgKi8KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotICAKLSAgICAgIC8qIElmIHRoZSBkaXN0YW5jZSBpcyB3aXRoaW4gLTEyOC4uKzEyOCBpbmNsdXNpdmUsIHRoZW4gd2UgY2FuIHJlbGF4Ci0JIHRoaXMganVtcC4gICsxMjggaXMgdmFsaWQgc2luY2UgdGhlIHRhcmdldCB3aWxsIG1vdmUgdHdvIGJ5dGVzCi0JIGNsb3NlciBpZiB3ZSBkbyByZWxheCB0aGlzIGJyYW5jaC4gICovCi0gICAgICBpZiAoKGludClnYXAgPj0gLTEyOCAmJiAoaW50KWdhcCA8PSAxMjggKQotCXsgCi0KLQkgIC8qIEl0J3MgcG9zc2libGUgd2UgbWF5IGJlIGFibGUgdG8gZWxpbWluYXRlIHRoaXMgYnJhbmNoIGVudGlyZWx5OwotCSAgICAgaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgYnJhbmNoIGFyb3VuZCB0aGlzIGluc3RydWN0aW9uLAotCSAgICAgYW5kIHRoZXJlJ3Mgbm8gbGFiZWwgYXQgdGhpcyBpbnN0cnVjdGlvbiwgdGhlbiB3ZSBjYW4gcmV2ZXJzZQotCSAgICAgdGhlIGNvbmRpdGlvbiBvbiB0aGUgcHJldmlvdXMgYnJhbmNoIGFuZCBlbGltaW5hdGUgdGhpcyBqdW1wLgotCi0JICAgICAgIG9yaWdpbmFsOgkJCW5ldzoKLQkJIGJDQyBsYWIxCQkJYkNDJyBsYWIyCi0JCSBqbXAgbGFiMgotCQlsYWIxOgkJCQlsYWIxOgotCQotCSAgICAgVGhpcyBzYXZlcyA0IGJ5dGVzIGluc3RlYWQgb2YgdHdvLCBhbmQgc2hvdWxkIGJlIHJlbGF0aXZlbHkKLQkgICAgIGNvbW1vbi4gICovCi0KLQkgIGlmIChnYXAgPD0gMTI2Ci0JICAgICAgJiYgbGFzdF9yZWxvYwotCSAgICAgICYmIGxhc3RfcmVsb2MtPmhvd3RvLT50eXBlID09IFJfUENSQllURSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgbGFzdF92YWx1ZTsKLQkgICAgICBsYXN0X3ZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKGxhc3RfcmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSArIDE7Ci0KLQkgICAgICBpZiAobGFzdF92YWx1ZSA9PSBkb3QgKyAyCi0JCSAgJiYgbGFzdF9yZWxvYy0+YWRkcmVzcyArIDEgPT0gcmVsb2MtPmFkZHJlc3MKLQkJICAmJiAhIGg4MzAwX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIGlucHV0X3NlY3Rpb24sIGRvdCAtIDIpKQotCQl7Ci0JCSAgcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxOTsKLQkJICBsYXN0X3JlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTg7Ci0JCSAgbGFzdF9yZWxvYy0+c3ltX3B0cl9wdHIgPSByZWxvYy0+c3ltX3B0cl9wdHI7Ci0JCSAgbGFzdF9yZWxvYy0+YWRkZW5kID0gcmVsb2MtPmFkZGVuZDsKLQkJICBzaHJpbmsgKz0gNDsKLQkJICBiZmRfcGVyZm9ybV9zbGlwIChhYmZkLCA0LCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZS4gICovCi0JICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwkgIAotCi0JICAvKiBUaGlzIHNocmlua3MgdGhpcyBzZWN0aW9uIGJ5IHR3byBieXRlcy4gICovCi0JICBzaHJpbmsgKz0gMjsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBUaGlzIGlzIHRoZSAxNiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoIHdoaWNoIGNvdWxkIGJlY29tZSBhbiA4IGJpdAotICAgICAgIHBjLXJlbGF0aXZlIGJyYW5jaC4gICovCi0gICAgY2FzZSBSX1BDUldPUkQ6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaCwgYWRkIG9uZSB0byB0aGUgdmFsdWUKLSAgICAgICAgIGJlY2F1c2UgdGhlIGFkZGVuZCBmaWVsZCBpbiBQQ3JlbCBqdW1wcyBpcyBvZmYgYnkgLTEuICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSArIDE7Ci0JCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaWYgd2Ugd2VyZSB0byByZWxheC4gICovCi0gICAgICBkb3QgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgYWRkcmVzczsKLSAgCi0gICAgICAvKiBDb21wdXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgaW5zbiB0byB0aGUgYnJhbmNoIHRhcmdldC4gICovCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogSWYgdGhlIGRpc3RhbmNlIGlzIHdpdGhpbiAtMTI4Li4rMTI4IGluY2x1c2l2ZSwgdGhlbiB3ZSBjYW4gcmVsYXgKLQkgdGhpcyBqdW1wLiAgKzEyOCBpcyB2YWxpZCBzaW5jZSB0aGUgdGFyZ2V0IHdpbGwgbW92ZSB0d28gYnl0ZXMKLQkgY2xvc2VyIGlmIHdlIGRvIHJlbGF4IHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIGlmICgoaW50KWdhcCA+PSAtMTI4ICYmIChpbnQpZ2FwIDw9IDEyOCApCi0JeyAKLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZS4gICovCi0JICByZWxvYy0+aG93dG8gPSBob3d0b190YWJsZSArIDE1OwotCi0JICAvKiBUaGlzIHNocmlua3MgdGhpcyBzZWN0aW9uIGJ5IHR3byBieXRlcy4gICovCi0JICBzaHJpbmsgKz0gMjsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBUaGlzIGlzIGEgMTYgYml0IGFic29sdXRlIGFkZHJlc3MgaW4gYSBtb3YuYiBpbnNuLCB3aGljaCBjYW4KLSAgICAgICBiZWNvbWUgYW4gOCBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpZiBpdCdzIGluIHRoZSByaWdodCByYW5nZS4gICovCi0gICAgY2FzZSBSX01PVjE2QjE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGlzIG1vdi5iIGluc24uICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogVGhlIGFkZHJlc3MgaXMgaW4gMHhmZjAwLi4weGZmZmYgaW5jbHVzaXZlIG9uIHRoZSBoODMwMCBvcgotCSAweGZmZmYwMC4uMHhmZmZmZmYgaW5jbHVzaXZlIG9uIHRoZSBoODMwMGgsIHRoZW4gd2UgY2FuCi0JIHJlbGF4IHRoaXMgbW92LmIgICovCi0gICAgICBpZiAoKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDAKLQkgICAmJiB2YWx1ZSA+PSAweGZmMDAKLQkgICAmJiB2YWx1ZSA8PSAweGZmZmYpCi0JICB8fCAoKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JICAgICAgIHx8IGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotCSAgICAgICYmIHZhbHVlID49IDB4ZmZmZjAwCi0JICAgICAgJiYgdmFsdWUgPD0gMHhmZmZmZmYpKQotCXsKLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZS4gICovCi0JICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwotCi0JICAvKiBUaGlzIHNocmlua3MgdGhpcyBzZWN0aW9uIGJ5IHR3byBieXRlcy4gICovCi0JICBzaHJpbmsgKz0gMjsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTaW1pbGFybHkgZm9yIGEgMjQgYml0IGFic29sdXRlIGFkZHJlc3MgaW4gYSBtb3YuYi4gIE5vdGUgdGhhdAotICAgICAgIGlmIHdlIGNhbid0IHJlbGF4IHRoaXMgaW50byBhbiA4IGJpdCBhYnNvbHV0ZSwgd2UnbGwgZmFsbCB0aHJvdWdoCi0gICAgICAgYW5kIHRyeSB0byByZWxheCBpdCBpbnRvIGEgMTZiaXQgYWJzb2x1dGUuICAqLwotICAgIGNhc2UgUl9NT1YyNEIxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhpcyBtb3YuYiBpbnNuLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFRoZSBhZGRyZXNzIGlzIGluIDB4ZmZmZjAwLi4weGZmZmZmZiBpbmNsdXNpdmUgb24gdGhlIGg4MzAwaCwKLQkgdGhlbiB3ZSBjYW4gcmVsYXggdGhpcyBtb3YuYiAgKi8KLSAgICAgIGlmICgoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKLQkgICB8fCBiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQkgICYmIHZhbHVlID49IDB4ZmZmZjAwCi0JICAmJiB2YWx1ZSA8PSAweGZmZmZmZikKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSBmb3VyIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSA0OwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCA0LCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQotCSAgLyogRG9uZSB3aXRoIHRoaXMgcmVsb2MuICAqLwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBGQUxMVEhST1VHSCBhbmQgdHJ5IHRvIHR1cm4gdGhlIDMyLzI0IGJpdCByZWxvYyBpbnRvIGEgMTYgYml0Ci0JIHJlbG9jLiAgKi8KLQotICAgIC8qIFRoaXMgaXMgYSAyNC8zMiBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpbiBhIG1vdiBpbnNuLCB3aGljaCBjYW4KLSAgICAgICBiZWNvbWUgYW4gMTYgYml0IGFic29sdXRlIGFkZHJlc3MgaWYgaXQncyBpbiB0aGUgcmlnaHQgcmFuZ2UuICAqLwotICAgIGNhc2UgUl9NT1ZMMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoaXMgbW92IGluc24uICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogSWYgdGhpcyBhZGRyZXNzIGlzIGluIDB4MDAwMC4uMHg3ZmZmIGluY2x1c2l2ZSBvcgotICAgICAgICAgMHhmZjgwMDAuLjB4ZmZmZmZmIGluY2x1c2l2ZSwgdGhlbiBpdCBjYW4gYmUgcmVsYXhlZC4gICovCi0gICAgICBpZiAodmFsdWUgPD0gMHg3ZmZmIHx8IHZhbHVlID49IDB4ZmY4MDAwKQotCXsKLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZS4gICovCi0JICByZWxvYy0+aG93dG8gPSBob3d0b190YWJsZSArIDE3OwotCi0JICAvKiBUaGlzIHNocmlua3MgdGhpcyBzZWN0aW9uIGJ5IHR3byBieXRlcy4gICovCi0JICBzaHJpbmsgKz0gMjsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE5vIG90aGVyIHJlbG9jIHR5cGVzIHJlcHJlc2VudCByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgfQotCi0gIGxhc3RfcmVsb2MgPSByZWxvYzsKLSAgbGFzdF9pbnB1dF9zZWN0aW9uID0gaW5wdXRfc2VjdGlvbjsKLSAgcmV0dXJuIHNocmluazsKLX0KLQotCi0vKiBIYW5kbGUgcmVsb2NhdGlvbnMgZm9yIHRoZSBIOC8zMDAsIGluY2x1ZGluZyByZWxvY3MgZm9yIHJlbGF4ZWQKLSAgIGluc3RydWN0aW9ucy4KLQotICAgRklYTUU6IE5vdCBhbGwgcmVsb2NhdGlvbnMgY2hlY2sgZm9yIG92ZXJmbG93ISAgKi8KLQotc3RhdGljIHZvaWQKLWg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsCi0JCQkgICBkc3RfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cjsKLXsKLSAgdW5zaWduZWQgaW50IHNyY19hZGRyZXNzID0gKnNyY19wdHI7Ci0gIHVuc2lnbmVkIGludCBkc3RfYWRkcmVzcyA9ICpkc3RfcHRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgYmZkX3ZtYSBkb3Q7Ci0gIGludCBnYXAsdG1wOwotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLQotICAgIC8qIEdlbmVyaWMgOGJpdCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfUENSQllURToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQgCi0JICAgICArIGRzdF9hZGRyZXNzIAotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChnYXAgPCAtMTI4IHx8IGdhcCA+IDEyNikKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEFwcGx5IHRoZSByZWxvY2F0aW9uIGFuZCB1cGRhdGUgdGhlCi0JIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcysrOwotICAgICAgc3JjX2FkZHJlc3MrKzsKLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBHZW5lcmljIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9QQ1JXT1JEOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHRoZSByZWxvYykuICAqLwotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICAgICsgZHN0X2FkZHJlc3MgCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDEpOwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChnYXAgPiAzMjc2NiB8fCBnYXAgPCAtMzI3NjgpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBBcHBseSB0aGUgcmVsb2NhdGlvbiBhbmQgdXBkYXRlIHRoZQotCSBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDI7Ci0gICAgICBzcmNfYWRkcmVzcyArPSAyOwotCi0gICAgICAvKiBBbGwgZG9uZS4gICovCi0gICAgICBicmVhazsKLQotICAgIC8qIEdlbmVyaWMgOGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfUkVMQllURToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgdGhpcyBpbnNuLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKHZhbHVlIDw9IDB4ZmYKLQkgIHx8ICh2YWx1ZSA+PSAweDAwMDBmZjAwICYmIHZhbHVlIDw9IDB4MDAwMGZmZmYpCi0gIAkgIHx8ICh2YWx1ZSA+PSAweDAwZmZmZjAwICYmIHZhbHVlIDw9IDB4MDBmZmZmZmYpCi0JICB8fCAodmFsdWUgPj0gMHhmZmZmZmYwMCAmJiB2YWx1ZSA8PSAweGZmZmZmZmZmKSkKLQl7Ci0JICAvKiBFdmVyeXRoaW5nIGxvb2tzIE9LLiAgQXBwbHkgdGhlIHJlbG9jYXRpb24gYW5kIHVwZGF0ZSB0aGUKLQkgICAgIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KLQotCSAgYmZkX3B1dF84IChhYmZkLCB2YWx1ZSAmIDB4ZmYsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JICBkc3RfYWRkcmVzcyArPSAxOwotCSAgc3JjX2FkZHJlc3MgKz0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgLyogVmFyaW91cyBzaW1wbGUgMTZiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbnMuICAqLwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgIGNhc2UgUl9KTVAxOgotICAgIGNhc2UgUl9SRUxXT1JEOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gMjsKLSAgICAgIHNyY19hZGRyZXNzICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFZhcmlvdXMgc2ltcGxlIDI0LzMyYml0IGFic29sdXRlIHJlbG9jYXRpb25zLiAgKi8KLSAgICBjYXNlIFJfTU9WMjRCMToKLSAgICBjYXNlIFJfTU9WTDE6Ci0gICAgY2FzZSBSX1JFTExPTkc6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gNDsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEFub3RoZXIgMjQvMzJiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIHZhbHVlID0gKCh2YWx1ZSAmIDB4MDBmZmZmZmYpCi0JICAgICAgIHwgKGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBzcmNfYWRkcmVzcykgJiAweGZmMDAwMDAwKSk7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDQ7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBIDE2Yml0IGFib2x1dGUgcmVsb2NhdGlvbiB0aGF0IHdhcyBmb3JtZXJsbHkgYSAyNC8zMmJpdAotICAgICAgIGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9NT1ZMMjoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKHZhbHVlIDw9IDB4N2ZmZiB8fCB2YWx1ZSA+PSAweGZmODAwMCkKLQl7Ci0JICAvKiBJbnNlcnQgdGhlIDE2Yml0IHZhbHVlIGludG8gdGhlIHByb3BlciBsb2NhdGlvbi4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQotCSAgLyogRml4IHRoZSBvcGNvZGUuICBGb3IgYWxsIHRoZSBtb3ZlIGluc25zLCB3ZSBzaW1wbHkKLQkgICAgIG5lZWQgdG8gdHVybiBvZmYgYml0IDB4MjAgaW4gdGhlIHByZXZpb3VzIGJ5dGUuICAqLwotICAgICAgICAgIGRhdGFbZHN0X2FkZHJlc3MgLSAxXSAmPSB+MHgyMDsKLQkgIGRzdF9hZGRyZXNzICs9IDI7Ci0JICBzcmNfYWRkcmVzcyArPSA0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIC8qIEEgMTZiaXQgYWJzb2x1dGUgYnJhbmNoIHRoYXQgaXMgbm93IGFuIDgtYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gICovCi0gICAgY2FzZSBSX0pNUDI6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBOb3cgZml4IHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuICAqLwotICAgICAgc3dpdGNoIChkYXRhW2RzdF9hZGRyZXNzIC0gMV0pCi0JewotCWNhc2UgMHg1ZToKLQkgIC8qIGpzciAtPiBic3IgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg1NSwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0JICBicmVhazsKLQljYXNlIDB4NWE6Ci0JICAvKiBqbXAgLT5icmEgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0MCwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgOGJpdCB2YWx1ZS4gICovCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQotICAgICAgZHN0X2FkZHJlc3MgKz0gMTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDM7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggdGhhdCBpcyBub3cgYW4gOC1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfUENSV09SRF9COgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hIC0gMSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBOb3cgZml4IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSkKLQl7Ci0JY2FzZSAweDU4OgotCSAgLyogYkNDOjE2IC0+IGJDQzo4ICovCi0JICAvKiBHZXQgdGhlIGNvbmRpdGlvbiBjb2RlIGZyb20gdGhlIG9yaWdpbmFsIGluc24uICAqLwotCSAgdG1wID0gZGF0YVtkc3RfYWRkcmVzcyAtIDFdOwotCSAgdG1wICY9IDB4ZjA7Ci0JICB0bXAgPj49IDQ7Ci0KLQkgIC8qIE5vdyBvciBpbiB0aGUgaGlnaCBuaWJibGUgb2YgdGhlIG9wY29kZS4gICovCi0JICB0bXAgfD0gMHg0MDsKLQotCSAgLyogV3JpdGUgaXQuICAqLwotCSAgYmZkX3B1dF84IChhYmZkLCB0bXAsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDIpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0JLyogT3V0cHV0IHRoZSB0YXJnZXQuICAqLwotCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQotCS8qIFdlIGRvbid0IGFkdmFuY2UgZHN0X2FkZHJlc3MgLS0gdGhlIDhiaXQgcmVsb2MgaXMgYXBwbGllZCBhdAotCSAgIGRzdF9hZGRyZXNzIC0gMSwgc28gdGhlIG5leHQgaW5zbiBzaG91bGQgYmVnaW4gYXQgZHN0X2FkZHJlc3MuICAqLwotCXNyY19hZGRyZXNzICs9IDI7Ci0KLQlicmVhazsKLSAgICAgIAotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNGJpdCBhYnNvbHV0ZSB0aGF0IGlzIG5vdyA4IGJpdHMuICAqLwotICAgIGNhc2UgUl9KTVBMMjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCi0gICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0Ci0JICAgICArIGRzdF9hZGRyZXNzCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDIpOwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogRml4IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3NdKQotCXsKLQljYXNlIDB4NWU6Ci0JICAvKiBqc3IgLT4gYnNyICovCi0JICBiZmRfcHV0XzggKGFiZmQsIDB4NTUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JICBicmVhazsKLQljYXNlIDB4NWE6Ci0JICAvKiBqbXAgLT5icmEgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0MCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MgKyAxKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDI7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotCi0gICAgICBicmVhazsKLQotICAgIC8qIEEgMTZiaXQgYWJzb2x1dGUgbW92LmIgdGhhdCBpcyBub3cgYW4gOGJpdCBhYnNvbHV0ZSBtb3YuYi4gICovCi0gICAgY2FzZSBSX01PVjE2QjI6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChkYXRhW2RzdF9hZGRyZXNzIC0gMl0gIT0gMHg2YSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogRml4IHVwIHRoZSBvcGNvZGUuICAqLwotICAgICAgc3dpdGNoIChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmMCkKLQl7Ci0JY2FzZSAweDAwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgyMDsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MDoKLQkgIGRhdGFbZHN0X2FkZHJlc3MgLSAyXSA9IChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmKSB8IDB4MzA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0gICAgICBzcmNfYWRkcmVzcyArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTaW1pbGFybHkgZm9yIGEgMjRiaXQgbW92LmIgICovCi0gICAgY2FzZSBSX01PVjI0QjI6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChkYXRhW2RzdF9hZGRyZXNzIC0gMl0gIT0gMHg2YSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogRml4IHVwIHRoZSBvcGNvZGUuICAqLwotICAgICAgc3dpdGNoIChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmMCkKLQl7Ci0JY2FzZSAweDIwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgyMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhhMDoKLQkgIGRhdGFbZHN0X2FkZHJlc3MgLSAyXSA9IChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmKSB8IDB4MzA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQkNDX0lOVjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQgCi0JICAgICArIGRzdF9hZGRyZXNzIAotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpICsgMTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBGaXggdGhlIGNvbmRpdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24sIGFwcGx5Ci0JIHRoZSByZWxvY2F0aW9uLCBhbmQgdXBkYXRlIHRoZSBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX2dldF84IChhYmZkLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKSBeIDEsCi0JCSBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MrKzsKLSAgICAgIHNyY19hZGRyZXNzKys7Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0pNUF9ERUw6Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBbiA4Yml0IG1lbW9yeSBpbmRpcmVjdCBpbnN0cnVjdGlvbiAoam1wL2pzcikuCi0KLSAgICAgICBUaGVyZSdzIHNldmVyYWwgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBkb25lIHRvIGhhbmRsZQotICAgICAgIHRoaXMgcmVsb2NhdGlvbi4KLQotICAgICAgIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzeW1ib2wsIHRoZW4KLSAgICAgICB3ZSBzaG91bGQgaGFuZGxlIGl0IGp1c3QgUl9SRUxCWVRFLiAgTGlrZXdpc2UgaWYgaXQncwotICAgICAgIGZvciBhIHN5bWJvbCB3aXRoIGEgdmFsdWUgZ2UgMCBhbmQgbGUgMHhmZi4KLQotICAgICAgIE90aGVyd2lzZSBpdCdzIGEganVtcC9jYWxsIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHZlY3RvciwKLSAgICAgICBhbmQgdGhlIGxpbmtlciBpcyBleHBlY3RlZCB0byBzZXQgdXAgdGhlIGZ1bmN0aW9uIHZlY3RvcgotICAgICAgIGFuZCBwdXQgdGhlIHJpZ2h0IHZhbHVlIGludG8gdGhlIGp1bXAvY2FsbCBpbnN0cnVjdGlvbi4gICovCi0gICAgY2FzZSBSX01FTV9JTkRJUkVDVDoKLSAgICAgIHsKLQkvKiBXZSBuZWVkIHRvIGZpbmQgdGhlIHN5bWJvbCBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGl0J3MKLQkgICBhZGRyZXNzIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgdGFibGUuICAqLwotCWFzeW1ib2wgKnN5bWJvbDsKLQliZmRfdm1hIHZhbHVlOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqaDsKLQlhc2VjdGlvbiAqdmVjdG9yc19zZWMgPSBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGxpbmtfaW5mbyktPnZlY3RvcnNfc2VjOwotCi0JLyogRmlyc3Qgc2VlIGlmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzeW1ib2wKLQkgICBvciBhZ2FpbnN0IGEgc3ltYm9sIHdpdGggYSBub25uZWdhdGl2ZSB2YWx1ZSA8PSAweGZmLiAgKi8KLQlzeW1ib2wgPSAqKHJlbG9jLT5zeW1fcHRyX3B0cik7Ci0JdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JaWYgKHN5bWJvbCA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wKLQkgICAgfHwgdmFsdWUgPD0gMHhmZikKLQkgIHsKLQkgICAgLyogVGhpcyBzaG91bGQgYmUgaGFuZGxlZCBpbiBhIG1hbm5lciB2ZXJ5IHNpbWlsYXIgdG8KLQkgICAgICAgUl9SRUxCWVRFUy4gICBJZiB0aGUgdmFsdWUgaXMgaW4gcmFuZ2UsIHRoZW4ganVzdCBzbGFtCi0JICAgICAgIHRoZSB2YWx1ZSBpbnRvIHRoZSByaWdodCBsb2NhdGlvbi4gIEVsc2UgdHJpZ2dlciBhCi0JICAgICAgIHJlbG9jIG92ZXJmbG93IGNhbGxiYWNrLiAgKi8KLQkgICAgaWYgKHZhbHVlIDw9IDB4ZmYpCi0JICAgICAgewotCQliZmRfcHV0XzggKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQlkc3RfYWRkcmVzcyArPSAxOwotCQlzcmNfYWRkcmVzcyArPSAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCQlyZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkJaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkJICBhYm9ydCAoKTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogVGhpcyBpcyBhIGp1bXAvY2FsbCB0aHJvdWdoIGEgZnVuY3Rpb24gdmVjdG9yLCBhbmQgd2UncmUKLQkgICBleHBlY3RlZCB0byBjcmVhdGUgdGhlIGZ1bmN0aW9uIHZlY3RvciBvdXJzZWx2ZXMuIAotCi0JICAgRmlyc3QgbG9vayB1cCB0aGlzIHN5bWJvbCBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUgLS0gd2UgbmVlZAotCSAgIHRoZSBkZXJpdmVkIGxpbmtlciBzeW1ib2wgd2hpY2ggaG9sZHMgdGhpcyBzeW1ib2wncyBpbmRleAotCSAgIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IuICAqLwotCW5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0JaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JICB7Ci0JICAgIGNoYXIgKm5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDkpOwotCSAgICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBzdHJjcHkgKG5ld19uYW1lLCBuYW1lKTsKLQkgICAgc3ByaW50ZiAobmV3X25hbWUgKyBzdHJsZW4gKG5hbWUpLCAiXyUwOHgiLAotCQkgICAgIChpbnQpc3ltYm9sLT5zZWN0aW9uKTsKLQkgICAgbmFtZSA9IG5ld19uYW1lOwotCSAgfQotCi0JaCA9IGZ1bmN2ZWNfaGFzaF9sb29rdXAgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAobGlua19pbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlLAotCQkJCSBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JLyogVGhpcyBzaG91bGRuJ3QgZXZlciBoYXBwZW4uICBJZiBpdCBkb2VzIHRoYXQgbWVhbnMgd2UndmUgZ290Ci0JICAgZGF0YSBjb3JydXB0aW9uIG9mIHNvbWUga2luZC4gIEFib3J0aW5nIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlCi0JICAgdGhpbmsgdG8gZG8gaGVyZS4gICovCi0JaWYgKGggPT0gTlVMTCB8fCB2ZWN0b3JzX3NlYyA9PSBOVUxMKQotCSAgYWJvcnQgKCk7Ci0KLQkvKiBQbGFjZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gdmVjdG9yIGVudHJ5IGludG8gdGhlCi0JICAgcmVsb2MncyBhZGRyZXNzLiAgKi8KLQliZmRfcHV0XzggKGFiZmQsCi0JCSAgIHZlY3RvcnNfc2VjLT5vdXRwdXRfb2Zmc2V0ICsgaC0+b2Zmc2V0LAotCQkgICBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0JZHN0X2FkZHJlc3MrKzsKLQlzcmNfYWRkcmVzcysrOwotCi0JLyogTm93IGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIGl0c2VsZi4gICovCi0JaWYgKGJmZF9nZXRfbWFjaCAoaW5wdXRfc2VjdGlvbi0+b3duZXIpID09IGJmZF9tYWNoX2g4MzAwKQotCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJICAgICAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLAotCQkJCQkJICBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pLAotCQkgICAgICB2ZWN0b3JzX3NlYy0+Y29udGVudHMgKyBoLT5vZmZzZXQpOwotCWVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoaW5wdXRfc2VjdGlvbi0+b3duZXIpID09IGJmZF9tYWNoX2g4MzAwaAotCQkgfHwgYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDBzKQotCSAgYmZkX3B1dF8zMiAoYWJmZCwKLQkJICAgICAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLAotCQkJCQkJICBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pLAotCQkgICAgICB2ZWN0b3JzX3NlYy0+Y29udGVudHMgKyBoLT5vZmZzZXQpOwotCWVsc2UKLQkgIGFib3J0ICgpOwotCi0JLyogR3Jvc3MuICBXZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZWN0b3Igc2VjdGlvbgotCSAgIGJlZm9yZSB3ZSBnZXQgaGVyZS4uLiAgU28gd2Ugd3JpdGUgaXQgYWdhaW4gd2l0aCB0aGUgbmV3IGRhdGEuICAqLwotCWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAodmVjdG9yc19zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciwKLQkJCQkgIHZlY3RvcnNfc2VjLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgIHZlY3RvcnNfc2VjLT5jb250ZW50cywKLQkJCQkgIHZlY3RvcnNfc2VjLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgdmVjdG9yc19zZWMtPl9yYXdfc2l6ZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLQotICAgIH0KLQotICAqc3JjX3B0ciA9IHNyY19hZGRyZXNzOwotICAqZHN0X3B0ciA9IGRzdF9hZGRyZXNzOwotfQotCi0KLS8qIFJvdXRpbmUgZm9yIHRoZSBoODMwMCBsaW5rZXIuCi0KLSAgIFRoaXMgcm91dGluZSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHRoZSBzcGVjaWFsIFJfTUVNX0lORElSRUNUCi0gICByZWxvY3Mgb24gdGhlIGg4MzAwLiAgSXQncyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhIHZlY3RvcnMKLSAgIHNlY3Rpb24gYW5kIGF0dGFjaGluZyBpdCB0byBhbiBpbnB1dCBiZmQgYXMgd2VsbCBhcyBzaXppbmcKLSAgIHRoZSB2ZWN0b3JzIHNlY3Rpb24uICBJdCBhbHNvIGNyZWF0ZXMgb3VyIHZlY3RvcnMgaGFzaCB0YWJsZS4KLQotICAgSXQgdXNlcyB0aGUgZ2VuZXJpYyBsaW5rZXIgcm91dGluZXMgdG8gYWN0dWFsbHkgYWRkIHRoZSBzeW1ib2xzLgotICAgZnJvbSB0aGlzIEJGRCB0byB0aGUgYmZkIGxpbmtlciBoYXNoIHRhYmxlLiAgSXQgbWF5IGFkZCBhIGZldwotICAgc2VsZWN0ZWQgc3RhdGljIHN5bWJvbHMgdG8gdGhlIGJmZCBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICpmdW5jdmVjX2hhc2hfdGFibGU7Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBjcmVhdGVkIGEgdmVjdG9ycyBzZWN0aW9uLCBkbyBzbyBub3cuICAqLwotICBpZiAoIWg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFyZSBzZXQsIGluY2x1ZGluZyBTRUNfSU5fTUVNT1JZLiAgKi8KLSAgICAgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JICAgICAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfUkVBRE9OTFkpOwotICAgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLAotCQkJCQkJCQkgICAgIi52ZWN0b3JzIik7Ci0KLSAgICAgIC8qIElmIHRoZSBzZWN0aW9uIHdhc24ndCBjcmVhdGVkLCBvciB3ZSBjb3VsZG4ndCBzZXQgdGhlIGZsYWdzLAotCSBxdWl0IHF1aWNrbHkgbm93LCByYXRoZXIgdGhhbiBkaWVpbmcgYSBwYWluZnVsIGRlYXRoIGxhdGVyLiAgKi8KLSAgICAgIGlmICghIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwKLQkJCQkgICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUoaW5mbyktPnZlY3RvcnNfc2VjLAotCQkJCSAgICAgIGZsYWdzKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFsc28gY3JlYXRlIHRoZSB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0gICAgICBmdW5jdmVjX2hhc2hfdGFibGUgPSAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKikKLQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSkpKTsKLQotICAgICAgaWYgKCFmdW5jdmVjX2hhc2hfdGFibGUpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGlmICghZnVuY3ZlY19oYXNoX3RhYmxlX2luaXQgKGZ1bmN2ZWNfaGFzaF90YWJsZSwgYWJmZCwKLQkJCQkgICAgZnVuY3ZlY19oYXNoX25ld2Z1bmMpKQotCXsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCBmdW5jdmVjX2hhc2hfdGFibGUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogU3RvcmUgYXdheSBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN2ZWMgaGFzaCB0YWJsZS4gICovCi0gICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUgPSBmdW5jdmVjX2hhc2hfdGFibGU7Ci0gICAgfQotCi0gIC8qIExvYWQgdXAgdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSAgZnVuY3ZlY19oYXNoX3RhYmxlID0gaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlOwotCi0gIC8qIEFkZCB0aGUgc3ltYm9scyB1c2luZyB0aGUgZ2VuZXJpYyBjb2RlLiAgKi8KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pOwotCi0gIC8qIE5vdyBzY2FuIHRoZSByZWxvY3MgZm9yIGFsbCB0aGUgc2VjdGlvbnMgaW4gdGhpcyBiZmQ7IGNyZWF0ZQotICAgICBhZGRpdGlvbmFsIHNwYWNlIGluIHRoZSAudmVjdG9ycyBzZWN0aW9uIGFzIG5lZWRlZC4gICovCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGxvbmcgcmVsb2Nfc2l6ZSwgcmVsb2NfY291bnQsIGk7Ci0gICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgIGFyZWxlbnQgKipyZWxvY3M7Ci0KLSAgICAgIC8qIFN1Y2sgaW4gdGhlIHJlbG9jcywgc3ltYm9scyAmIGNhbm9uaWNhbGl6ZSB0aGVtLiAgKi8KLSAgICAgIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICAgICAgaWYgKHJlbG9jX3NpemUgPD0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKiopYmZkX21hbGxvYyAoKHNpemVfdClyZWxvY19zaXplKTsKLSAgICAgIGlmICghcmVsb2NzKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIHN5bWJvbHMgc2hvdWxkIGhhdmUgYmVlbiByZWFkIGluIGJ5IF9iZmRfZ2VuZXJpYyBsaW5rX2FkZF9zeW1ib2xzCi0JIGNhbGwgYWJvdmVjLCBzbyB3ZSBjYW4gY2hlYXQgYW5kIHVzZSB0aGUgcG9pbnRlciB0byB0aGVtIHRoYXQgd2FzCi0JIHNhdmVkIGluIHRoZSBhYm92ZSBjYWxsLiAgKi8KLSAgICAgIHN5bWJvbHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyhhYmZkKTsKLSAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWxvY3MsIHN5bWJvbHMpOwotICAgICAgaWYgKHJlbG9jX2NvdW50IDw9IDApCi0JewotCSAgZnJlZSAocmVsb2NzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHdhbGsgdGhyb3VnaCBhbGwgdGhlIHJlbG9jYXRpb25zIGluIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykKLQl7Ci0JICBhcmVsZW50ICpyZWxvYyA9IHJlbG9jc1tpXTsKLQkgIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIC8qIFdlJ3ZlIGdvdCBhbiBpbmRpcmVjdCByZWxvYy4gIFNlZSBpZiB3ZSBuZWVkIHRvIGFkZCBpdAotCSAgICAgdG8gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlCi0JICAgICB0byBhZGQgYSBuZXcgZW50cnkgZm9yIGVhY2ggdW5pcXVlIHN5bWJvbCByZWZlcmVuY2VkCi0JICAgICBieSBhbiBSX01FTV9JTkRJUkVDVCByZWxvY2F0aW9uIGV4Y2VwdCBmb3IgYSByZWxvYwotCSAgICAgYWdhaW5zdCB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCSAgaWYgKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX01FTV9JTkRJUkVDVAotCSAgICAgICYmIHN5bWJvbCAhPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wpCi0KLQkgICAgewotCSAgICAgIHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBuYW1lID0gc3ltYm9sLT5uYW1lOwotCSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0xPQ0FMKQotCQl7Ci0JCSAgY2hhciAqbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgOSk7Ci0KLQkJICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLQkJICAgIGFib3J0ICgpOwotCi0JCSAgc3RyY3B5IChuZXdfbmFtZSwgbmFtZSk7Ci0JCSAgc3ByaW50ZiAobmV3X25hbWUgKyBzdHJsZW4gKG5hbWUpLCAiXyUwOHgiLAotCQkJICAgKGludClzeW1ib2wtPnNlY3Rpb24pOwotCQkgIG5hbWUgPSBuZXdfbmFtZTsKLQkJfQotCi0JICAgICAgLyogTG9vayB0aGlzIHN5bWJvbCB1cCBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGggPSBmdW5jdmVjX2hhc2hfbG9va3VwIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJICAgICAgIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLQotCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzbid0IGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUsIGFkZAotCQkgaXQgYW5kIGJ1bXAgdXAgdGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGlmIChoID09IE5VTEwpCi0JCXsKLQkJICBoID0gZnVuY3ZlY19oYXNoX2xvb2t1cCAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlLAotCQkJCQkgICBuYW1lLCB0cnVlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmcmVlIChyZWxvY3MpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBCdW1wIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3JzIHNlY3Rpb24uICBFYWNoIHZlY3RvcgotCQkgICAgIHRha2VzIDIgYnl0ZXMgb24gdGhlIGg4MzAwIGFuZCA0IGJ5dGVzIG9uIHRoZSBoODMwMGguICAqLwotCQkgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwKQotCQkgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSArPSAyOwotCQkgIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JCQkgICB8fCBiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQkJICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5fcmF3X3NpemUgKz0gNDsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIHJlbG9jYXRpb25zLCByZWxlYXNlIHRoZW0uICAqLwotICAgICAgZnJlZSAocmVsb2NzKTsKLSAgICB9Ci0KLSAgLyogTm93IGFjdHVhbGx5IGFsbG9jYXRlIHNvbWUgc3BhY2UgZm9yIHRoZSBmdW5jdGlvbiB2ZWN0b3IuICBJdCdzCi0gICAgIHdhc3RlZnVsIHRvIGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UsIGJ1dCB0aGlzIGlzIGVhc2llci4gICovCi0gIGlmIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgLyogRnJlZSB0aGUgb2xkIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+Y29udGVudHMpCi0JZnJlZSAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPmNvbnRlbnRzKTsKLQotICAgICAgLyogQWxsb2NhdGUgbmV3IGNvbnRlbnRzLiAgKi8KLSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5jb250ZW50cwotCT0gYmZkX21hbGxvYyAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBoODMwMF9yZWxvYzE2X2VzdGltYXRlCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi0KLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChoODMwMGNvZmZfdmVjLCAiY29mZi1oODMwMCIsIEJGRF9JU19SRUxBWEFCTEUsIDAsICdfJywgTlVMTCkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWg4NTAwLmMgYi9iZmQvY29mZi1oODUwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmVlYWE1Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWg4NTAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIaXRhY2hpIEg4LzUwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImNvZmYvaDg1MDAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW04ID0KLUhPV1RPIChSX0g4NTAwX0lNTTgsIDAsIDEsIDgsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW04IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTE2ID0KLUhPV1RPIChSX0g4NTAwX0lNTTE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTI0ID0KLUhPV1RPIChSX0g4NTAwX0lNTTI0LCAwLCAxLCAyNCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTI0IiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTMyID0KLUhPV1RPIChSX0g4NTAwX0lNTTMyLCAwLCAxLCAzMiwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaGlnaDggPQotSE9XVE8gKFJfSDg1MDBfSElHSDgsIDAsIDEsIDgsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJyX2hpZ2g4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2xvdzE2ID0KLUhPV1RPIChSX0g4NTAwX0xPVzE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfbG93MTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfcGNyZWw4ID0KLUhPV1RPIChSX0g4NTAwX1BDUkVMOCwgMCwgMSwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicl9wY3JlbDgiLCB0cnVlLCAwLCAwLCB0cnVlKTsKLQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX3BjcmVsMTYgPQotSE9XVE8gKFJfSDg1MDBfUENSRUwxNiwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgInJfcGNyZWwxNiIsIHRydWUsIDAsIDAsIHRydWUpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2hpZ2gxNiA9Ci1IT1dUTyAoUl9IODUwMF9ISUdIMTYsIDAsIDEsIDgsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJyX2hpZ2gxNiIsIHRydWUsIDB4MDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpOwotCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLXN0YXRpYyBpbnQgCi1jb2ZmX2g4NTAwX3NlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGU7Ci19Ci0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHgucl90eXBlID0gY29mZl9oODUwMF9zZWxlY3RfcmVsb2MoaG93dG8pCi0KLQotI2RlZmluZSBCQURNQUcoeCkgSDg1MDBCQURNQUcoeCkKLSNkZWZpbmUgSDg1MDAgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAotICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLSAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0vKiBDb2RlIHRvIHR1cm4gYSByX3R5cGUgaW50byBhIGhvd3RvIHB0ciwgdXNlcyB0aGUgYWJvdmUgaG93dG8gdGFibGUKLSAgICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byhpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICogaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBzd2l0Y2ggKGRzdC0+cl90eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NODoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0yNDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTMyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfUENSRUw4OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfcGNyZWw4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX1BDUkVMMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9wY3JlbDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0hJR0g4OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaGlnaDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSElHSDE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaGlnaDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0xPVzE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfbG93MTY7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZCByZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICogcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAocmVsb2MtPnJfc3ltbmR4ID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLQotICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLX0KLQotc3RhdGljIHZvaWQKLWV4dHJhX2Nhc2UgKGluX2FiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpCi0gICAgIGJmZCAqaW5fYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICBiZmRfYnl0ZSAqZCA9IGRhdGErKmRzdF9wdHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTg6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSBkKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMTsKLSAgICAgICgqc3JjX3B0cikgKz0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0g4NTAwX0hJR0g4OgotICAgICAgYmZkX3B1dF84IChpbl9hYmZkLAotCQkgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKQotCQkgID4+IDE2KSwKLQkJIGQgKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMTsKLSAgICAgICgqc3JjX3B0cikgKz0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0g4NTAwX0lNTTE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSAgZCAgKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMjsKLSAgICAgICgqc3JjX3B0cikgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0g4NTAwX0xPVzE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSAgZCk7Ci0KLSAgICAgICgqZHN0X3B0cikgKz0gMjsKLSAgICAgICgqc3JjX3B0cikgKz0gMjsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0g4NTAwX0hJR0gxNjoKLSAgICAgIGJmZF9wdXRfMTYgKGluX2FiZmQsCi0JCSAgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKQotCQkgICA+PjE2KSwKLQkJICBkKTsKLQotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSU1NMjQ6Ci0gICAgICB7Ci0JaW50IHYgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQlpbnQgbyA9IGJmZF9nZXRfMzIoaW5fYWJmZCwgZGF0YSsgKmRzdF9wdHIgLTEpOwotCXYgPSAodiAmIDB4MDBmZmZmZmYpIHwgKG8gJiAweGZmMDAwMDApOwotCWJmZF9wdXRfMzIgKGluX2FiZmQsIHYsIGRhdGEgICsgKmRzdF9wdHIgLTEpOwotCSgqZHN0X3B0cikgKz0zOwotCSgqc3JjX3B0cikrPTM7OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTMyOgotICAgICAgewotCWludCB2ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3B1dF8zMiAoaW5fYWJmZCwgdiwgZGF0YSAgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSArPTQ7Ci0JKCpzcmNfcHRyKSs9NDs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0g4NTAwX1BDUkVMODoKLSAgICAgIHsKLQliZmRfdm1hIGRzdCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldAotCSAgKyAqZHN0X3B0cgotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsgLyogLTEgc2luY2Ugd2VyZSBpbiB0aGUgb2RkIGJ5dGUgb2YgdGhlCi0JCQkJICAgIHdvcmQgYW5kIHRoZSBwYydzIGJlZW4gaW5jcmVtZW50ZWQgKi8KLQotCWlmIChnYXAgPiAxMjggfHwgZ2FwIDwgLTEyOCkKLQkgIHsKLQkgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICAgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICAgIGFib3J0ICgpOwotCSAgfQotCWJmZF9wdXRfOCAoaW5fYWJmZCwgZ2FwLCBkYXRhICsgKmRzdF9wdHIpOwotCSgqZHN0X3B0cikrKzsKLQkoKnNyY19wdHIpKys7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBSX0g4NTAwX1BDUkVMMTY6Ci0gICAgICB7Ci0JYmZkX3ZtYSBkc3QgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSBsaW5rX29yZGVyLT5vZmZzZXQKLQkgICsgKmRzdF9wdHIKLQkgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JaW50IGdhcCA9IGRzdCAtIGRvdCAtIDE7IC8qIC0xIHNpbmNlIHdlcmUgaW4gdGhlIG9kZCBieXRlIG9mIHRoZQotCQkJCSAgICB3b3JkIGFuZCB0aGUgcGMncyBiZWVuIGluY3JlbWVudGVkICovCi0KLQlpZiAoZ2FwID4gMzI3NjcgfHwgZ2FwIDwgLTMyNzY4KQotCSAgewotCSAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgICAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0JYmZkX3B1dF8xNiAoaW5fYWJmZCwgZ2FwLCBkYXRhICsgKmRzdF9wdHIpOwotCSgqZHN0X3B0cikrPTI7Ci0JKCpzcmNfcHRyKSs9MjsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGV4dHJhX2Nhc2UKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLQotI3VuZGVmICBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChoODUwMGNvZmZfdmVjLCAiY29mZi1oODUwMCIsIDAsIDAsICdfJywgTlVMTCkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWkzODYuYyBiL2JmZC9jb2ZmLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkNGQxNC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotI2lmZGVmIENPRkZfR08zMl9FWEUKLSNpbmNsdWRlICJjb2ZmL2dvMzJleGUuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTM4Nl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0vKiBUaGUgcGFnZSBzaXplIGlzIGEgZ3Vlc3MgYmFzZWQgb24gRUxGLiAgKi8KLQotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAKLQotLyogRm9yIHNvbWUgcmVhc29uIHdoZW4gdXNpbmcgaTM4NiBDT0ZGIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIC50ZXh0Ci0gICBzZWN0aW9uIGZvciBhIHJlZmVyZW5jZSB0byBhIGNvbW1vbiBzeW1ib2wgaXMgdGhlIHZhbHVlIGl0c2VsZiBwbHVzCi0gICBhbnkgZGVzaXJlZCBvZmZzZXQuICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4gICovCi0KLS8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgbmVlZCB0byBkbyBzb21lCi0gICBhZGp1c3RtZW50cyB0byB0aGUgb2JqZWN0IGZpbGUgdGhhdCBhcmUgbm90IGRvbmUgYnkgdGhlCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZXZlcnkKLSAgIHJlbG9jIHR5cGUgdG8gbWFrZSBhbnkgcmVxdWlyZWQgYWRqdXN0bWVudHMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX2kzODZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgLyogV2UgYXJlIHJlbG9jYXRpbmcgYSBjb21tb24gc3ltYm9sLiAgVGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlCi0JIG9iamVjdCBmaWxlIGlzIE9SSUcgKyBPRkZTRVQsIHdoZXJlIE9SSUcgaXMgdGhlIHZhbHVlIG9mIHRoZQotCSBjb21tb24gc3ltYm9sIGFzIHNlZW4gYnkgdGhlIG9iamVjdCBmaWxlIHdoZW4gaXQgd2FzIGNvbXBpbGVkCi0JICh0aGlzIG1heSBiZSB6ZXJvIGlmIHRoZSBzeW1ib2wgd2FzIHVuZGVmaW5lZCkgYW5kIE9GRlNFVCBpcwotCSB0aGUgb2Zmc2V0IGludG8gdGhlIGNvbW1vbiBzeW1ib2wgKG5vcm1hbGx5IHplcm8sIGJ1dCBtYXkgYmUKLQkgbm9uLXplcm8gd2hlbiByZWZlcnJpbmcgdG8gYSBmaWVsZCBpbiBhIGNvbW1vbiBzdHJ1Y3R1cmUpLgotCSBPUklHIGlzIHRoZSBuZWdhdGl2ZSBvZiByZWxvY19lbnRyeS0+YWRkZW5kLCB3aGljaCBpcyBzZXQgYnkKLQkgdGhlIENBTENfQURERU5EIG1hY3JvIGJlbG93LiAgV2Ugd2FudCB0byByZXBsYWNlIHRoZSB2YWx1ZSBpbgotCSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBORVcgKyBPRkZTRVQsIHdoZXJlIE5FVyBpcyB0aGUgdmFsdWUgb2YKLQkgdGhlIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHB1dCBpbiB0aGUgZmluYWwKLQkgb2JqZWN0IGZpbGUuICBORVcgaXMgc3ltYm9sLT52YWx1ZS4gICovCi0gICAgICBkaWZmID0gc3ltYm9sLT52YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZWxzZQotICAgICAgLyogSW4gUEUgbW9kZSwgd2UgZG8gbm90IG9mZnNldCB0aGUgY29tbW9uIHN5bWJvbC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGFsd2F5cyBlZmZlY3RpdmVseQotCSBpZ25vcmVzIHRoZSBhZGRlbmQgZm9yIGEgQ09GRiB0YXJnZXQgd2hlbiBwcm9kdWNpbmcKLQkgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoaXMgc2VlbXMgdG8gYmUgYWx3YXlzIHdyb25nIGZvciAzODYKLQkgQ09GRiwgc28gd2UgaGFuZGxlIHRoZSBhZGRlbmQgaGVyZSBpbnN0ZWFkLiAgKi8KLSAgICAgIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICAvKiBGSVhNRTogSG93IHNob3VsZCB0aGlzIGNhc2UgYmUgaGFuZGxlZD8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+aG93dG8tPnR5cGUgPT0gUl9JTUFHRUJBU0UpCi0gICAgZGlmZiAtPSBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSNlbmRpZgotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZCBhcHBlYXIgaW4gdGhlIG91dHB1dCAucmVsb2MKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbiBpbl9yZWxvY19wIFBBUkFNUyAoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICopKTsKLQotc3RhdGljIGJvb2xlYW4gaW5fcmVsb2NfcCAoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuICEgaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT50eXBlICE9IFJfSU1BR0VCQVNFOwotfQotCi0jZW5kaWYgLyogQ09GRl9XSVRIX1BFICovCi0KLSNpZm5kZWYgUENSRUxPRkZTRVQKLSNkZWZpbmUgUENSRUxPRkZTRVQgZmFsc2UKLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KLXsKLSAgRU1QVFlfSE9XVE8gKDApLAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEVNUFRZX0hPV1RPICgyKSwKLSAgRU1QVFlfSE9XVE8gKDMpLAotICBFTVBUWV9IT1dUTyAoNCksCi0gIEVNUFRZX0hPV1RPICg1KSwKLSAgSE9XVE8gKFJfRElSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgImRpcjMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogUEUgSU1BR0VfUkVMX0kzODZfRElSMzJOQiByZWxvY2F0aW9uICg3KS4JKi8KLSAgSE9XVE8gKFJfSU1BR0VCQVNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJydmEzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEVNUFRZX0hPV1RPICgwMTApLAotICBFTVBUWV9IT1dUTyAoMDExKSwKLSAgRU1QVFlfSE9XVE8gKDAxMiksCi0gIEVNUFRZX0hPV1RPICgwMTMpLAotICBFTVBUWV9IT1dUTyAoMDE0KSwKLSAgRU1QVFlfSE9XVE8gKDAxNSksCi0gIEVNUFRZX0hPV1RPICgwMTYpLAotICAvKiBCeXRlIHJlbG9jYXRpb24gKDAxNykuICAqLwotICBIT1dUTyAoUl9SRUxCWVRFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIjgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogMTYtYml0IHdvcmQgcmVsb2NhdGlvbiAoMDIwKS4gICovCi0gIEhPV1RPIChSX1JFTFdPUkQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIjE2IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIDMyLWJpdCBsb25nd29yZCByZWxvY2F0aW9uICgwMjEpLgkqLwotICBIT1dUTyAoUl9SRUxMT05HLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICIzMiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBCeXRlIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gKDAyMikuCSAqLwotICBIT1dUTyAoUl9QQ1JCWVRFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkRJU1A4IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogMTYtYml0IHdvcmQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiAoMDIzKS4JKi8KLSAgSE9XVE8gKFJfUENSV09SRCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiRElTUDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogMzItYml0IGxvbmd3b3JkIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gKDAyNCkuICAqLwotICBIT1dUTyAoUl9QQ1JMT05HLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIFBDUkVMT0ZGU0VUKQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jICBudW5tYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHsgeC5yX3R5cGUgPSBob3d0by0+dHlwZTsgfQotI2RlZmluZSBCQURNQUcoeCkgSTM4NkJBRE1BRyh4KQotI2RlZmluZSBJMzg2IDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KQkJCQkJXAotICAoKGNhY2hlX3B0ciktPmhvd3RvID0JCQkJCQkJXAotICAgKChkc3QpLT5yX3R5cGUgPCBzaXplb2YgKGhvd3RvX3RhYmxlKSAvIHNpemVvZiAoaG93dG9fdGFibGVbMF0pCVwKLSAgICA/IGhvd3RvX3RhYmxlICsgKGRzdCktPnJfdHlwZQkJCQkJXAotICAgIDogTlVMTCkpCi0KLS8qIEZvciAzODYgQ09GRiBhIFNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkCi0gICBsaWJyYXJ5LiAgT24gc29tZSBvdGhlciBDT0ZGIHRhcmdldHMgU1RZUF9CU1MgaXMgbm9ybWFsbHkKLSAgIFNUWVBfTk9MT0FELiAgKi8KLSNkZWZpbmUgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQotCi0vKiBDb21wdXRlIHRoZSBhZGRlbmQgb2YgYSByZWxvYy4gIElmIHRoZSByZWxvYyBpcyB0byBhIGNvbW1vbiBzeW1ib2wsCi0gICB0aGUgb2JqZWN0IGZpbGUgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgQnkgdGhlCi0gICB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgbGlua2VyIG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBzeW1ib2wKLSAgIGZyb20gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4gIFRoZXJlZm9yZSwgd2UKLSAgIGhhY2sgd2lsZGx5IHRvIGxvY2F0ZSB0aGUgb3JpZ2luYWwgc3ltYm9sIGZyb20gdGhpcyBmaWxlIHNvIHRoYXQgd2UKLSAgIGNhbiBtYWtlIHRoZSBjb3JyZWN0IGFkanVzdG1lbnQuICBUaGlzIG1hY3JvIHNldHMgY29mZnN5bSB0byB0aGUKLSAgIHN5bWJvbCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCBhbmQgdXNlcyBpdCB0byBzZXQgdGhlIGFkZGVuZCB2YWx1ZQotICAgY29ycmVjdGx5LiAgSWYgdGhpcyBpcyBub3QgYSBjb21tb24gc3ltYm9sLCB0aGUgdXN1YWwgYWRkZW5kCi0gICBjYWxjdWxhdGlvbiBpcyBkb25lLCBleGNlcHQgdGhhdCBhbiBhZGRpdGlvbmFsIHR3ZWFrIGlzIG5lZWRlZCBmb3IKLSAgIFBDIHJlbGF0aXZlIHJlbG9jcy4KLSAgIEZJWE1FOiBUaGlzIG1hY3JvIHJlZmVycyB0byBzeW1ib2xzIGFuZCBhc2VjdDsgdGhlc2UgYXJlIGZyb20gdGhlCi0gICBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgdGhlIG1hY3JvIGFyZ3VtZW50cy4gICovCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKQkJXAotICB7CQkJCQkJCQlcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7CVwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKQkJCVwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpCQkJCVwKLQkgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOwkJXAotICAgIGVsc2UgaWYgKHB0cikJCQkJCQlcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsJCQlcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAkJCVwKLQkmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7CVwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQJCVwKLQkgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsJXAotICAgIGVsc2UJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwkJCQkJXAotICAgIGlmIChwdHIgJiYgaG93dG9fdGFibGVbcmVsb2Mucl90eXBlXS5wY19yZWxhdGl2ZSkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotCi0vKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gIEZvciBub3JtYWwgaTM4NiBDT0ZGLCB3ZQotICAgY2FuIHVzZSB0aGUgZ2VuZXJpYyByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICBGb3IgUEUsIHdlIG5lZWQgb3VyCi0gICBvd24gcm91dGluZS4gICovCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KLQotI2Vsc2UgLyogQ09GRl9XSVRIX1BFICovCi0KLS8qIFRoZSBQRSByZWxvY2F0ZSBzZWN0aW9uIHJvdXRpbmUuICBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcwotICAgYW5kIHRoZSByZWd1bGFyIHJvdXRpbmUgaXMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nIGZvciBhCi0gICByZWxvY2F0ZWFibGUgbGluay4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAotCQkJICAgICAgIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCQkJICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJICAgICByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKTsKLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KLQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBDb252ZXJ0IGFuIHJ0eXBlIHRvIGhvd3RvIGZvciB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgaWYgKHJlbC0+cl90eXBlID4gc2l6ZW9mIChob3d0b190YWJsZSkgLyBzaXplb2YgKGhvd3RvX3RhYmxlWzBdKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBob3d0byA9IGhvd3RvX3RhYmxlICsgcmVsLT5yX3R5cGU7Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgLyogQ2FuY2VsIG91dCBjb2RlIGluIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotICAqYWRkZW5kcCA9IDA7Ci0jZW5kaWYKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgICphZGRlbmRwICs9IHNlYy0+dm1hOwotCi0gIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gPT0gMCAmJiBzeW0tPm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBzZWN0aW9uIGNvbnRlbnRzIGluY2x1ZGUgdGhlCi0JIHNpemUgKHN5bS0+bl92YWx1ZSkgYXMgYW4gYWRkZW5kLiAgVGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkgZnVuY3Rpb24gd2lsbCBiZSBhZGRpbmcgaW4gdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBXZQotCSBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBzaXplIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgY29ycmVjdCByZXN1bHQuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgLyogSSB0aGluayB3ZSAqZG8qIHdhbnQgdG8gYnlwYXNzIHRoaXMuICBJZiB3ZSBkb24ndCwgSSBoYXZlCi0JIHNlZW4gc29tZSBkYXRhIHBhcmFtZXRlcnMgZ2V0IHRoZSB3cm9uZyByZWxvY2F0aW9uIGFkZHJlc3MuCi0JIElmIEkgbGluayB0d28gdmVyc2lvbnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIHNlY3Rpb24gYnlwYXNzZWQKLQkgYW5kIHRoZW4gZG8gYSBiaW5hcnkgY29tcGFyaXNvbiwgdGhlIGFkZHJlc3NlcyB3aGljaCBhcmUKLQkgZGlmZmVyZW50IGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIG1hcC4gIFRoZSBjYXNlIGluIHdoaWNoCi0JIHRoaXMgc2VjdGlvbiBoYXMgYmVlbiBieXBhc3NlZCBoYXMgYWRkcmVzc2VzIHdoaWNoIGNvcnJlc3BvbmQKLQkgdG8gdmFsdWVzIEkgY2FuIGZpbmQgaW4gdGhlIG1hcC4gICovCi0gICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQotICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQotICAgICBjb21tb24gc3ltYm9sLiAgKi8KLSAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgKmFkZGVuZHAgKz0gaC0+cm9vdC51LmMuc2l6ZTsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgKmFkZGVuZHAgLT0gNDsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB0aGVuIHRoZSBnZW5lcmljIGNvZGUgaXMgZ29pbmcgdG8KLSAgICAgICAgIGFkZCBiYWNrIHRoZSBzeW1ib2wgdmFsdWUgaW4gb3JkZXIgdG8gY2FuY2VsIG91dCBhbgotICAgICAgICAgYWRqdXN0bWVudCBpdCBtYWRlIHRvIHRoZSBhZGRlbmQuICBIb3dldmVyLCB3ZSBzZXQgdGhlIGFkZGVuZAotICAgICAgICAgdG8gMCBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvbi4gIFdlIG5lZWQgdG8gYWRqdXN0IGhlcmUsCi0gICAgICAgICB0byBhdm9pZCB0aGUgYWRqdXN0bWVudCB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgbWFrZS4gIEZJWE1FOgotICAgICAgICAgVGhpcyBpcyBnZXR0aW5nIGEgYml0IGhhY2tpc2guICAqLwotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCSphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKLSAgICB9Ci0KLSAgaWYgKHJlbC0+cl90eXBlID09IFJfSU1BR0VCQVNFKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IHBlX2RhdGEoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiBob3d0bzsKLX0KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBjb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9JTUFHRUJBU0U7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX0RJUjMyOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9QQ1JMT05HOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9SRUxXT1JEOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9QQ1JXT1JEOwotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX1JFTEJZVEU7Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfUENSQllURTsKLSAgICBkZWZhdWx0OgotICAgICAgQkZEX0ZBSUwgKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8KLQotI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0KLS8qIElmIGkzODYgZ2NjIHVzZXMgdW5kZXJzY29yZXMgZm9yIHN5bWJvbCBuYW1lcywgdGhlbiBpdCBkb2VzIG5vdCB1c2UKLSAgIGEgbGVhZGluZyBkb3QgZm9yIGxvY2FsIGxhYmVscywgc28gaWYgVEFSR0VUX1VOREVSU0NPUkUgaXMgZGVmaW5lZAotICAgd2UgdHJlYXQgYWxsIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBMIGFzIGxvY2FsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJ0wnKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBjb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZQotCi0jZW5kaWYgLyogVEFSR0VUX1VOREVSU0NPUkUgKi8KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQKLSNpZmRlZiBUQVJHRVRfU1lNCi0gIFRBUkdFVF9TWU0gPQotI2Vsc2UKLSAgaTM4NmNvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImNvZmYtaTM4NiIsCQkJLyogbmFtZSAqLwotI2VuZGlmCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTCi0jZW5kaWYKLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotICBUQVJHRVRfVU5ERVJTQ09SRSwJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2Vsc2UKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZW5kaWYKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotLyogTm90ZSB0aGF0IHdlIGFsbG93IGFuIG9iamVjdCBmaWxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb3JlIGZpbGUgYXMgd2VsbC4gKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIGNvZmZfb2JqZWN0X3B9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLQotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1pODYwLmMgYi9iZmQvY29mZi1pODYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiM2JiNWYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtaTg2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgODYwIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENyZWF0ZWQgbW9zdGx5IGJ5IHN1YnN0aXR1dGluZyAiODYwIiBmb3IgIjM4NiIgaW4gY29mZi1pMzg2LmMKLSAgIEhhcnJ5IERvbGFuIDxkb2xhbkBzc2QuaW50ZWwuY29tPiwgT2N0b2JlciAxOTk1Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiY29mZi9pODYwLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl9pODYwX3JlbG9jIAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX2k4NjBfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0KLS8qIEZvciBzb21lIHJlYXNvbiB3aGVuIHVzaW5nIGk4NjAgQ09GRiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24gc3ltYm9sIGlzIHRoZSB2YWx1ZSBpdHNlbGYgcGx1cwotICAgYW55IGRlc2lyZWQgb2Zmc2V0LiAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl9pODYwX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgcmVsb2NhdGluZyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgY3VycmVudCB2YWx1ZSBpbiB0aGUKLQkgb2JqZWN0IGZpbGUgaXMgT1JJRyArIE9GRlNFVCwgd2hlcmUgT1JJRyBpcyB0aGUgdmFsdWUgb2YgdGhlCi0JIGNvbW1vbiBzeW1ib2wgYXMgc2VlbiBieSB0aGUgb2JqZWN0IGZpbGUgd2hlbiBpdCB3YXMgY29tcGlsZWQKLQkgKHRoaXMgbWF5IGJlIHplcm8gaWYgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkKSBhbmQgT0ZGU0VUIGlzCi0JIHRoZSBvZmZzZXQgaW50byB0aGUgY29tbW9uIHN5bWJvbCAobm9ybWFsbHkgemVybywgYnV0IG1heSBiZQotCSBub24temVybyB3aGVuIHJlZmVycmluZyB0byBhIGZpZWxkIGluIGEgY29tbW9uIHN0cnVjdHVyZSkuCi0JIE9SSUcgaXMgdGhlIG5lZ2F0aXZlIG9mIHJlbG9jX2VudHJ5LT5hZGRlbmQsIHdoaWNoIGlzIHNldCBieQotCSB0aGUgQ0FMQ19BRERFTkQgbWFjcm8gYmVsb3cuICBXZSB3YW50IHRvIHJlcGxhY2UgdGhlIHZhbHVlIGluCi0JIHRoZSBvYmplY3QgZmlsZSB3aXRoIE5FVyArIE9GRlNFVCwgd2hlcmUgTkVXIGlzIHRoZSB2YWx1ZSBvZgotCSB0aGUgY29tbW9uIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcHV0IGluIHRoZSBmaW5hbAotCSBvYmplY3QgZmlsZS4gIE5FVyBpcyBzeW1ib2wtPnZhbHVlLiAgKi8KLSAgICAgIGRpZmYgPSBzeW1ib2wtPnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgODYwCi0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgICBpZiAoZGlmZiAhPSAwKQotICAgICAgewotCXJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLQlzd2l0Y2ggKGhvd3RvLT5zaXplKQotCSAgewotCSAgY2FzZSAwOgotCSAgICB7Ci0JICAgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDE6Ci0JICAgIHsKLQkgICAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgewotCSAgICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIGZhbHNlCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAotewotICBFTVBUWV9IT1dUTyAoMCksCi0gIEVNUFRZX0hPV1RPICgxKSwKLSAgRU1QVFlfSE9XVE8gKDIpLAotICBFTVBUWV9IT1dUTyAoMyksCi0gIEVNUFRZX0hPV1RPICg0KSwKLSAgRU1QVFlfSE9XVE8gKDUpLAotICBIT1dUTyAoUl9ESVIzMiwgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgImRpcjMyIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAvKiB7N30sICovCi0gIEhPV1RPIChSX0lNQUdFQkFTRSwgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgInJ2YTMyIiwJICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgRU1QVFlfSE9XVE8gKDAxMCksCi0gIEVNUFRZX0hPV1RPICgwMTEpLAotICBFTVBUWV9IT1dUTyAoMDEyKSwKLSAgRU1QVFlfSE9XVE8gKDAxMyksCi0gIEVNUFRZX0hPV1RPICgwMTQpLAotICBFTVBUWV9IT1dUTyAoMDE1KSwKLSAgRU1QVFlfSE9XVE8gKDAxNiksCi0gIEhPV1RPIChSX1JFTEJZVEUsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgOCwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICI4IiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUkVMV09SRCwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICIxNiIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1JFTExPTkcsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiMzIiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JCWVRFLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDgsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDgiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1BDUldPUkQsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDE2IiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JMT05HLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1AzMiIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIEk4NjBCQURNQUcoeCkKLSNkZWZpbmUgSTg2MCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLS8qIEZvciA4NjAgQ09GRiBhIFNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkCi0gICBsaWJyYXJ5LiAgT24gc29tZSBvdGhlciBDT0ZGIHRhcmdldHMgU1RZUF9CU1MgaXMgbm9ybWFsbHkKLSAgIFNUWVBfTk9MT0FELiAgKi8KLSNkZWZpbmUgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQotCi0vKiBDb21wdXRlIHRoZSBhZGRlbmQgb2YgYSByZWxvYy4gIElmIHRoZSByZWxvYyBpcyB0byBhIGNvbW1vbiBzeW1ib2wsCi0gICB0aGUgb2JqZWN0IGZpbGUgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgQnkgdGhlCi0gICB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgbGlua2VyIG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBzeW1ib2wKLSAgIGZyb20gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4gIFRoZXJlZm9yZSwgd2UKLSAgIGhhY2sgd2lsZGx5IHRvIGxvY2F0ZSB0aGUgb3JpZ2luYWwgc3ltYm9sIGZyb20gdGhpcyBmaWxlIHNvIHRoYXQgd2UKLSAgIGNhbiBtYWtlIHRoZSBjb3JyZWN0IGFkanVzdG1lbnQuICBUaGlzIG1hY3JvIHNldHMgY29mZnN5bSB0byB0aGUKLSAgIHN5bWJvbCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCBhbmQgdXNlcyBpdCB0byBzZXQgdGhlIGFkZGVuZCB2YWx1ZQotICAgY29ycmVjdGx5LiAgSWYgdGhpcyBpcyBub3QgYSBjb21tb24gc3ltYm9sLCB0aGUgdXN1YWwgYWRkZW5kCi0gICBjYWxjdWxhdGlvbiBpcyBkb25lLCBleGNlcHQgdGhhdCBhbiBhZGRpdGlvbmFsIHR3ZWFrIGlzIG5lZWRlZCBmb3IKLSAgIFBDIHJlbGF0aXZlIHJlbG9jcy4KLSAgIEZJWE1FOiBUaGlzIG1hY3JvIHJlZmVycyB0byBzeW1ib2xzIGFuZCBhc2VjdDsgdGhlc2UgYXJlIGZyb20gdGhlCi0gICBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgdGhlIG1hY3JvIGFyZ3VtZW50cy4gICovCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKQkJXAotICB7CQkJCQkJCQlcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7CVwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKQkJCVwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpCQkJCVwKLQkgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOwkJXAotICAgIGVsc2UgaWYgKHB0cikJCQkJCQlcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsJCQlcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAkJCVwKLQkmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7CVwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQJCVwKLQkgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsJXAotICAgIGVsc2UJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwkJCQkJXAotICAgIGlmIChwdHIgJiYgaG93dG9fdGFibGVbcmVsb2Mucl90eXBlXS5wY19yZWxhdGl2ZSkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotCi0vKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTg2MF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLQotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICBob3d0byA9IGhvd3RvX3RhYmxlICsgcmVsLT5yX3R5cGU7Ci0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICAqYWRkZW5kcCArPSBzZWMtPnZtYTsKLQotICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtID09IDAgJiYgc3ltLT5uX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgc2VjdGlvbiBjb250ZW50cyBpbmNsdWRlIHRoZQotCSBzaXplIChzeW0tPm5fdmFsdWUpIGFzIGFuIGFkZGVuZC4gIFRoZSByZWxvY2F0ZV9zZWN0aW9uCi0JIGZ1bmN0aW9uIHdpbGwgYmUgYWRkaW5nIGluIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgV2UKLQkgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBvcmRlciB0byBnZXQgdGhlCi0JIGNvcnJlY3QgcmVzdWx0LiAgKi8KLSAKLSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLQotICAgICAgLyogSSB0aGluayB3ZSAqZG8qIHdhbnQgdG8gYnlwYXNzIHRoaXMuICBJZiB3ZSBkb24ndCwgSSBoYXZlIHNlZW4gc29tZSBkYXRhCi0JIHBhcmFtZXRlcnMgZ2V0IHRoZSB3cm9uZyByZWxjYXRpb24gYWRkcmVzcy4gIElmIEkgbGluayB0d28gdmVyc2lvbnMKLQkgd2l0aCBhbmQgd2l0aG91dCB0aGlzIHNlY3Rpb24gYnlwYXNzZWQgYW5kIHRoZW4gZG8gYSBiaW5hcnkgY29tcGFyaXNvbiwKLQkgdGhlIGFkZHJlc3NlcyB3aGljaCBhcmUgZGlmZmVyZW50IGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIG1hcC4gIFRoZSAKLQkgY2FzZSBpbiB3aGljaCB0aGlzIHNlY3Rpb24gaGFzIGJlZW4gYnlwYXNzZWQgaGFzIGFkZHJlc3NlcyB3aGljaCBjb3JyZXNwb25kCi0JIHRvIHZhbHVlcyBJIGNhbiBmaW5kIGluIHRoZSBtYXAgKi8KLSAgICAgICphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG91dHB1dCBzeW1ib2wgaXMgY29tbW9uIChpbiB3aGljaCBjYXNlIHRoaXMgbXVzdCBiZSBhCi0gICAgIHJlbG9jYXRlYWJsZSBsaW5rKSwgd2UgbmVlZCB0byBhZGQgaW4gdGhlIGZpbmFsIHNpemUgb2YgdGhlCi0gICAgIGNvbW1vbiBzeW1ib2wuICAqLwotICBpZiAoaCAhPSBOVUxMICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikgCi0gICAgKmFkZGVuZHAgKz0gaC0+cm9vdC51LmMuc2l6ZTsKLQotICByZXR1cm4gaG93dG87Ci19Ci0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBjb2ZmX2k4NjBfcnR5cGVfdG9faG93dG8KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWkzY29mZl9vYmplY3RfcChhKQotICAgICBiZmQgKmE7Ci17Ci0gIHJldHVybiBjb2ZmX29iamVjdF9wKGEpOwotfQotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIGk4NjBjb2ZmX3ZlYyA9Ci0jZW5kaWYKLXsKLSNpZmRlZiBUQVJHRVRfTkFNRQotICBUQVJHRVRfTkFNRSwKLSNlbHNlCi0gICJjb2ZmLWk4NjAiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLS8qIE5vdGUgdGhhdCB3ZSBhbGxvdyBhbiBvYmplY3QgZmlsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29yZSBmaWxlIGFzIHdlbGwuICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBpM2NvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIGkzY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgQ09GRl9TV0FQX1RBQkxFCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTk2MC5jIGIvYmZkL2NvZmYtaTk2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzM3ZmFiLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWk5NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDY2NiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDk2MCBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgSTk2MCAxCi0jZGVmaW5lIEJBRE1BRyh4KSBJOTYwQkFETUFHKHgpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2k5NjAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgkJLyogdG8gYWxsb3cgZWFzaWVyIGFic3RyYWN0aW9uLWJyZWFraW5nICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfaTk2MF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgb3B0Y2FsbF9jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl9pOTYwX3JlbG9jYXRlCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJvb2xlYW4gKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLSNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAxCi0KLSNkZWZpbmUgR0VUX1NDTkhEUl9BTElHTiBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgUFVUX1NDTkhEUl9BTElHTiBiZmRfaF9wdXRfMzIKLQotLyogVGhlIGk5NjAgZG9lcyBub3Qgc3VwcG9ydCBhbiBNTVUsIHNvIENPRkZfUEFHRV9TSVpFIGNhbiBiZQotICAgYXJiaXRyYXJpbHkgc21hbGwuICAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAxCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0vKiBUaGlzIHNldCBvZiBsb2NhbCBsYWJlbCBuYW1lcyBpcyB0YWtlbiBmcm9tIGdhcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAobmFtZVswXSA9PSAnTCcKLQkgIHx8IChuYW1lWzBdID09ICcuJwotCSAgICAgICYmIChuYW1lWzFdID09ICdDJwotCQkgIHx8IG5hbWVbMV0gPT0gJ0knCi0JCSAgfHwgbmFtZVsxXSA9PSAnLicpKSk7Ci19Ci0KLS8qIFRoaXMgaXMganVzdCBsaWtlIHRoZSB1c3VhbCBDQUxDX0FEREVORCwgYnV0IGl0IGluY2x1ZGVzIHRoZQotICAgc2VjdGlvbiBWTUEgZm9yIFBDIHJlbGF0aXZlIHJlbG9jcy4gICovCi0jaWZuZGVmIENBTENfQURERU5ECi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsgICAgICBcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOyAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChwdHIgJiYgKHJlbG9jLnJfdHlwZSA9PSAyNSB8fCByZWxvYy5yX3R5cGUgPT0gMjcpKQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCi0gIH0KLSNlbmRpZgotCi0jZGVmaW5lIENBTExTCSAweDY2MDAzODAwCS8qIFRlbXBsYXRlIGZvciAnY2FsbHMnIGluc3RydWN0aW9uCSovCi0jZGVmaW5lIEJBTAkgMHgwYjAwMDAwMAkvKiBUZW1wbGF0ZSBmb3IgJ2JhbCcgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgQkFMX01BU0sgMHgwMGZmZmZmZgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotb3B0Y2FsbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBUaGlzIGl0ZW0gaGFzIGFscmVhZHkgYmVlbiByZWxvY2F0ZWQgY29ycmVjdGx5LCBidXQgd2UgbWF5IGJlCi0gICAqIGFibGUgdG8gcGF0Y2ggaW4geWV0IGJldHRlciBjb2RlIC0gZG9uZSBieSBkaWdnaW5nIG91dCB0aGUKLSAgICogY29ycmVjdCBpbmZvIG9uIHRoaXMgc3ltYm9sICovCi0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXN1bHQ7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNzID0gY29mZnN5bWJvbChzeW1ib2xfaW4pOwotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIHdpdGggc3ltYm9scyB3aGljaCBhcmVuJ3QgdGllZCB1cCB5ZXQsCi0gICAgIGV4Y2VwdCBtb3ZlIHRoZSByZWxvYy4gKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoY3MtPnN5bWJvbC5zZWN0aW9uKSkgewotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgfQotICAgIAotICAvKiBTbyB0aGUgdGFyZ2V0IHN5bWJvbCBoYXMgdG8gYmUgb2YgY29mZiB0eXBlLCBhbmQgdGhlIHN5bWJvbCAKLSAgICAgaGFzIHRvIGhhdmUgdGhlIGNvcnJlY3QgbmF0aXZlIGluZm9ybWF0aW9uIHdpdGhpbiBpdCAqLwotICBpZiAoKGJmZF9hc3ltYm9sX2ZsYXZvdXIoJmNzLT5zeW1ib2wpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgICAgfHwgKGNzLT5uYXRpdmUgPT0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKilOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGludGVyZXN0aW5nLCBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB3ZSdyZSBvdXRwdXR0aW5nIGNvZmYKLQkgZnJvbSBhIG1peCBuIG1hdGNoIGlucHV0LCBsaW5raW5nIGZyb20gY29mZiB0byBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQkgYm91dCBmaWxlIHdpbGwgY2F1c2UgdGhpcyBtYXRjaCB0byBiZSB0cnVlLiBTaG91bGQgSSBjb21wbGFpbj8gIFRoaXMKLQkgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGJvdXQgc3ltYm9sIGlzIG5vbiBsZWFmLiAgKi8KLSAgICAgICplcnJvcl9tZXNzYWdlID0KLQkoY2hhciAqKSBfKCJ1bmNlcnRhaW4gY2FsbGluZyBjb252ZW50aW9uIGZvciBub24tQ09GRiBzeW1ib2wiKTsKLSAgICAgIHJlc3VsdCA9IGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgIHN3aXRjaCAoY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MpIAotICAgICAgewotICAgICAgY2FzZSBDX0xFQUZTVEFUOgotICAgICAgY2FzZSBDX0xFQUZFWFQ6Ci0gIAkvKiBUaGlzIGlzIGEgY2FsbCB0byBhIGxlYWYgcHJvY2VkdXJlLCByZXBsYWNlIGluc3RydWN0aW9uIHdpdGggYSBiYWwKLQkgICB0byB0aGUgY29ycmVjdCBsb2NhdGlvbi4gICovCi0JewotCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXggPSAmKChjcy0+bmF0aXZlKzIpLT51LmF1eGVudCk7Ci0JICBpbnQgd29yZCA9IGJmZF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQkgIGludCBvbGYgPSAoYXV4LT54X2JhbC54X2JhbG50cnkgLSBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgIEJGRF9BU1NFUlQoY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXg9PTIpOwotCi0JICAvKiBXZSByZXBsYWNlIHRoZSBvcmlnaW5hbCBjYWxsIGluc3RydWN0aW9uIHdpdGggYSBiYWwgdG8KLQkgICAgIHRoZSBiYWwgZW50cnkgcG9pbnQgLSB0aGUgb2Zmc2V0IG9mIHdoaWNoIGlzIGRlc2NyaWJlZCBpbgotCSAgICAgdGhlIDJuZCBhdXhlbnQgb2YgdGhlIG9yaWdpbmFsIHN5bWJvbC4gV2Uga2VlcCB0aGUgbmF0aXZlCi0JICAgICBzeW0gYW5kIGF1eGVudHMgdW50b3VjaGVkLCBzbyB0aGUgZGVsdGEgYmV0d2VlbiB0aGUgdHdvCi0JICAgICBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBiYWwgZW50cnkgcG9pbnQuICAqLwotCSAgd29yZCA9ICgod29yZCArICBvbGYpICAmIEJBTF9NQVNLKSB8IEJBTDsKLSAgCSAgYmZkX3B1dF8zMihhYmZkLCB3b3JkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgCX0KLQlyZXN1bHQgPSBiZmRfcmVsb2Nfb2s7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIENfU0NBTEw6Ci0JLyogVGhpcyBpcyBhIGNhbGwgdG8gYSBzeXN0ZW0gY2FsbCwgcmVwbGFjZSB3aXRoIGEgY2FsbHMgdG8gIyAqLwotCUJGRF9BU1NFUlQoMCk7Ci0JcmVzdWx0ID0gYmZkX3JlbG9jX29rOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlyZXN1bHQgPSBiZmRfcmVsb2Nfb2s7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogaTk2MCBDT0ZGIGlzIHVzZWQgYnkgVnhXb3JrcyA1LjEuICBIb3dldmVyLCBWeFdvcmtzIDUuMSBkb2VzIG5vdAotICAgYXBwZWFyIHRvIGNvcnJlY3RseSBoYW5kbGUgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlCi0gICBzYW1lIG9iamVjdCBmaWxlLiAgSXQgYXBwZWFycyB0byBzaW1wbHkgZGlzY2FyZCBzdWNoIHJlbG9jcywgcmF0aGVyCi0gICB0aGFuIGFkZGluZyB0aGVpciB2YWx1ZXMgaW50byB0aGUgb2JqZWN0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBoZXJlCi0gICBieSBjb252ZXJ0aW5nIGFsbCByZWxvY3MgYWdhaW5zdCBkZWZpbmVkIHN5bWJvbHMgaW50byByZWxvY3MKLSAgIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLCB3aGVuIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0Ci0gICBmaWxlLgotCi0gICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBDT0ZGCi0gICBzcGVjaWZpYyBiYWNrZW5kIGxpbmtlci4gIEl0IG9ubHkgZG9lcyBzb21ldGhpbmcgd2hlbiBkb2luZyBhCi0gICByZWxvY2F0ZWFibGUgbGluaywgd2hpY2ggd2lsbCBhbG1vc3QgY2VydGFpbmx5IGZhaWwgd2hlbiBub3QKLSAgIGdlbmVyYXRpbmcgQ09GRiBpOTYwIG91dHB1dCwgc28gdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBubyBsb25nZXIKLSAgIHVzZWZ1bC4gIEl0IHdhcyB1c2VkIGJlZm9yZSB0aGlzIHRhcmdldCB3YXMgY29udmVydGVkIHRvIHVzZSB0aGUKLSAgIENPRkYgc3BlY2lmaWMgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotY29mZl9pOTYwX3JlbG9jYXRlIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpvc2VjOwotCi0gIGlmIChvdXRwdXRfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm90IGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkpCi0gICAgewotICAgICAgLyogU3ltYm9sIGlzIG5vdCBkZWZpbmVkLCBzbyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0LiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkpCi0gICAgewotICAgICAgLyogSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoZSByaWdodCBhY3Rpb24gaXMgZm9yIGEgY29tbW9uCi0gICAgICAgICBzeW1ib2wuICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgLyogQ29udmVydCB0aGUgcmVsb2MgdG8gdXNlIHRoZSBzZWN0aW9uIHN5bWJvbC4gIEZJWE1FOiBUaGlzIG1ldGhvZAotICAgICBpcyByaWRpY3Vsb3VzLiAgKi8KLSAgb3NlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKS0+b3V0cHV0X3NlY3Rpb247Ci0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYykgIT0gTlVMTAotICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpLT50ZGF0YSAhPSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0ciA9Ci0gICAgICAoYXN5bWJvbCAqKikgY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpLT50ZGF0YTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY19uYW1lOwotICAgICAgYXN5bWJvbCAqKnN5bXMsICoqc3ltX2VuZDsKLQotICAgICAgc2VjX25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgb3NlYyk7Ci0gICAgICBzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKLSAgICAgIHN5bV9lbmQgPSBzeW1zICsgYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0gICAgICBmb3IgKDsgc3ltcyA8IHN5bV9lbmQ7IHN5bXMrKykKLQl7Ci0JICBpZiAoYmZkX2FzeW1ib2xfbmFtZSAoKnN5bXMpICE9IE5VTEwKLQkgICAgICAmJiAoKnN5bXMpLT52YWx1ZSA9PSAwCi0JICAgICAgJiYgc3RyY21wICgoKnN5bXMpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwKLQkJCSBzZWNfbmFtZSkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc3ltcyA+PSBzeW1fZW5kKQotCWFib3J0ICgpOwotCi0gICAgICByZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIgPSBzeW1zOwotCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpID09IE5VTEwpCi0JewotCSAgb3NlYy0+dXNlZF9ieV9iZmQgPQotCSAgICAoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICBpZiAob3NlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQl9Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYyktPnRkYXRhID0gKFBUUikgc3ltczsKLSAgICB9Ci0KLSAgLyogTGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZG8gaXRzIHRoaW5nLCB3aGljaCB3aWxsIGluY2x1ZGUKLSAgICAgc3R1ZmZpbmcgdGhlIHN5bWJvbCBhZGRlbmQgaW50byB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxsb25nID0KLSAgSE9XVE8gKCh1bnNpZ25lZCBpbnQpIFJfUkVMTE9ORywgMCwgMiwgMzIsZmFsc2UsIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBjb2ZmX2k5NjBfcmVsb2NhdGUsInJlbGxvbmciLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAwKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2lwcm1lZCA9Ci0gIEhPV1RPIChSX0lQUk1FRCwgMCwgMiwgMjQsdHJ1ZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIGNvZmZfaTk2MF9yZWxvY2F0ZSwgImlwcm1lZCAiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCAwKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX29wdGNhbGwgPQotICBIT1dUTyAoUl9PUFRDQUxMLCAwLDIsMjQsdHJ1ZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIG9wdGNhbGxfY2FsbGJhY2ssICJvcHRjYWxsIiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgMCk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuICZob3d0b19vcHRjYWxsOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICByZXR1cm4gJmhvd3RvX3JlbGxvbmc7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUENSRUw6Ci0gICAgICByZXR1cm4gJmhvd3RvX2lwcm1lZDsKLSAgICB9Ci19Ci0KLS8qIFRoZSByZWFsIGNvZGUgaXMgaW4gY29mZmNvZGUuaCAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi17CQkJCQkJCVwKLSAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvX3B0cjsJCQkJXAotICAgc3dpdGNoICgoZHN0KS0+cl90eXBlKSB7CQkJCVwKLSAgICAgY2FzZSAxNzogaG93dG9fcHRyID0gJmhvd3RvX3JlbGxvbmc7IGJyZWFrOwlcCi0gICAgIGNhc2UgMjU6IGhvd3RvX3B0ciA9ICZob3d0b19pcHJtZWQ7IGJyZWFrOwkJXAotICAgICBjYXNlIDI3OiBob3d0b19wdHIgPSAmaG93dG9fb3B0Y2FsbDsgYnJlYWs7CVwKLSAgICAgZGVmYXVsdDogaG93dG9fcHRyID0gMDsgYnJlYWs7CQkJXAotICAgICB9CQkJCQkJCVwKLSAgIChjYWNoZV9wdHIpLT5ob3d0byA9IGhvd3RvX3B0cjsJCQlcCi0gfQotCi0vKiBpOTYwIENPRkYgaXMgdXNlZCBieSBWeFdvcmtzIDUuMS4gIEhvd2V2ZXIsIFZ4V29ya3MgNS4xIGRvZXMgbm90Ci0gICBhcHBlYXIgdG8gY29ycmVjdGx5IGhhbmRsZSBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUKLSAgIHNhbWUgb2JqZWN0IGZpbGUuICBJdCBhcHBlYXJzIHRvIHNpbXBseSBkaXNjYXJkIHN1Y2ggcmVsb2NzLCByYXRoZXIKLSAgIHRoYW4gYWRkaW5nIHRoZWlyIHZhbHVlcyBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFdlIGhhbmRsZSB0aGlzIGJ5Ci0gICBjb252ZXJ0aW5nIGFsbCByZWxvY3MgYWdhaW5zdCBnbG9iYWwgc3ltYm9scyBpbnRvIHJlbG9jcyBhZ2FpbnN0Ci0gICBpbnRlcm5hbCBzeW1ib2xzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgcm91dGluZSBpcwotICAgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlua2luZyBwcm9jZXNzLCBhbmQgaXQgY3JlYXRlcyB0aGUKLSAgIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTk2MF9zdGFydF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGFzZWN0aW9uICpvOwotICBiZmRfYnl0ZSAqZXN5bTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzeW1lc3opOwotICBpZiAoZXN5bSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0KLSAgICAgIHN0cm5jcHkgKGlzeW0uX24uX25fbmFtZSwgby0+bmFtZSwgU1lNTk1MRU4pOwotICAgICAgaXN5bS5uX3ZhbHVlID0gMDsKLSAgICAgIGlzeW0ubl9zY251bSA9IG8tPnRhcmdldF9pbmRleDsKLSAgICAgIGlzeW0ubl90eXBlID0gVF9OVUxMOwotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfU1RBVDsKLSAgICAgIGlzeW0ubl9udW1hdXggPSAwOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZpc3ltLCAoUFRSKSBlc3ltKTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoZXN5bSwgc3ltZXN6LCAxLCBhYmZkKSAhPSBzeW1lc3opCi0JewotCSAgZnJlZSAoZXN5bSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKz0gMTsKLSAgICB9Ci0KLSAgZnJlZSAoZXN5bSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIGJvb2xlYW4gZG9uZTsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLSAgICAgIGVsc2UKLQlhZGRlbmQgPSAwOwotCi0gICAgICBzd2l0Y2ggKHJlbC0+cl90eXBlKQotCXsKLQljYXNlIDE3OiBob3d0byA9ICZob3d0b19yZWxsb25nOyBicmVhazsKLQljYXNlIDI1OiBob3d0byA9ICZob3d0b19pcHJtZWQ7IGJyZWFrOwotCWNhc2UgMjc6IGhvd3RvID0gJmhvd3RvX29wdGNhbGw7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUKLQkJICAgICAtIHNlYy0+dm1hKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGRvbmUgPSBmYWxzZTsKLQotICAgICAgaWYgKGhvd3RvLT50eXBlID09IFJfT1BUQ0FMTCAmJiAhIGluZm8tPnJlbG9jYXRlYWJsZSAmJiBzeW1uZHggIT0gLTEpCi0JewotCSAgaW50IGNsYXNzOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBjbGFzcyA9IGgtPmNsYXNzOwotCSAgZWxzZQotCSAgICBjbGFzcyA9IHN5bS0+bl9zY2xhc3M7Ci0KLQkgIHN3aXRjaCAoY2xhc3MpCi0JICAgIHsKLQkgICAgY2FzZSBDX05VTEw6Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgaXMgYXBwYXJlbnRseSBub3QgZnJvbSBhIENPRkYgaW5wdXQgZmlsZS4KLSAgICAgICAgICAgICAgICAgV2Ugd2FybiwgYW5kIHRoZW4gYXNzdW1lIHRoYXQgaXQgaXMgbm90IGEgbGVhZgotICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gICovCi0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAgICAgKGluZm8sCi0JCSAgICAgIF8oInVuY2VydGFpbiBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIG5vbi1DT0ZGIHN5bWJvbCIpLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ19MRUFGU1RBVDoKLQkgICAgY2FzZSBDX0xFQUZFWFQ6Ci0JICAgICAgLyogVGhpcyBpcyBhIGNhbGwgdG8gYSBsZWFmIHByb2NlZHVyZTsgdXNlIHRoZSBiYWwKLSAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIHsKLQkJbG9uZyBvbGY7Ci0JCXVuc2lnbmVkIGxvbmcgd29yZDsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIHsKLQkJICAgIEJGRF9BU1NFUlQgKGgtPm51bWF1eCA9PSAyKTsKLQkJICAgIG9sZiA9IGgtPmF1eFsxXS54X2JhbC54X2JhbG50cnk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgYmZkX2J5dGUgKmVzeW1zOwotCQkgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCQkgICAgQkZEX0FTU0VSVCAoc3ltLT5uX251bWF1eCA9PSAyKTsKLQkJICAgIGVzeW1zID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0JCSAgICBlc3ltcyArPSAoc3ltbmR4ICsgMikgKiBiZmRfY29mZl9zeW1lc3ogKGlucHV0X2JmZCk7Ci0JCSAgICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltcywgc3ltLT5uX3R5cGUsCi0JCQkJCSAgc3ltLT5uX3NjbGFzcywgMSwgc3ltLT5uX251bWF1eCwKLQkJCQkJICAoUFRSKSAmYXV4KTsKLQkJICAgIG9sZiA9IGF1eC54X2JhbC54X2JhbG50cnk7Ci0JCSAgfQotCi0JCXdvcmQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJICAgKGNvbnRlbnRzCi0JCQkJICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKTsKLQkJd29yZCA9ICgod29yZCArIG9sZiAtIHZhbCkgJiBCQUxfTUFTSykgfCBCQUw7Ci0JCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkJCSAgICB3b3JkLAotCQkJICAgIChjb250ZW50cwotCQkJICAgICArIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSk7Ci0JCWRvbmUgPSB0cnVlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDX1NDQUxMOgotCSAgICAgIEJGRF9BU1NFUlQgKDApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBkb25lKQotCXsKLQkgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0JICAgIGFkZGVuZCArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLAotCQkJCQkgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQkgICAgdmFsLCBhZGRlbmQpOwotCX0KLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgdGhlIHN5bWJvbCBpbmRleCBvZiBhbnkgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wgdG8KLSAgIGluc3RlYWQgYmUgYSByZWxvYyBhZ2FpbnN0IHRoZSBpbnRlcm5hbCBzeW1ib2wgd2UgY3JlYXRlZCBzcGVjaWFsbHkKLSAgIGZvciB0aGUgc2VjdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTk2MF9hZGp1c3Rfc3ltbmR4IChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIGlyZWwsIGFkanVzdGVkcCkKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgIGJvb2xlYW4gKmFkanVzdGVkcDsKLXsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICphZGp1c3RlZHAgPSBmYWxzZTsKLQotICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaWJmZClbaXJlbC0+cl9zeW1uZHhdOwotICBpZiAoaCA9PSBOVUxMCi0gICAgICB8fCAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaXJlbC0+cl9zeW1uZHggPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXggLSAxOwotICAqYWRqdXN0ZWRwID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGNvZmZfaTk2MF9pc19sb2NhbF9sYWJlbF9uYW1lCi0KLSNkZWZpbmUgY29mZl9zdGFydF9maW5hbF9saW5rIGNvZmZfaTk2MF9zdGFydF9maW5hbF9saW5rCi0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uCi0KLSNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4IGNvZmZfaTk2MF9hZGp1c3Rfc3ltbmR4Ci0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpY29mZl9iaWdfdmVjOwotCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAoaWNvZmZfbGl0dGxlX3ZlYywgImNvZmYtSW50ZWwtbGl0dGxlIiwgMCwgMCwgJ18nLCAmIGljb2ZmX2JpZ192ZWMpCi0KLWNvbnN0IGJmZF90YXJnZXQgaWNvZmZfYmlnX3ZlYyA9Ci17Ci0gICJjb2ZmLUludGVsLWJpZyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi1iZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi1iZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgaWNvZmZfbGl0dGxlX3ZlYywKLSAgCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW02OGsuYyBiL2JmZC9jb2ZmLW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxMzhjMC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA2ODAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvbTY4ay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoaXMgc291cmNlIGZpbGUgaXMgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHZhcmlvdXMgbTY4ayBDT0ZGCi0gICB2YXJpYW50cy4gIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNvbnRyb2wgaXRzIGJlaGF2aW91cjoKLQotICAgVEFSR0VUX1NZTQotICAgICBUaGUgQyBuYW1lIG9mIHRoZSBCRkQgdGFyZ2V0IHZlY3Rvci4gIFRoZSBkZWZhdWx0IGlzIG02OGtjb2ZmX3ZlYy4KLSAgIFRBUkdFVF9OQU1FCi0gICAgIFRoZSB1c2VyIHZpc2libGUgdGFyZ2V0IG5hbWUuICBUaGUgZGVmYXVsdCBpcyAiY29mZi1tNjhrIi4KLSAgIE5BTUVTX0hBVkVfVU5ERVJTQ09SRQotICAgICBXaGV0aGVyIHN5bWJvbCBuYW1lcyBoYXZlIGFuIHVuZGVyc2NvcmUuCi0gICBPTkxZX0RFQ0xBUkVfUkVMT0NTCi0gICAgIE9ubHkgZGVjbGFyZSB0aGUgcmVsb2NhdGlvbiBob3d0byBhcnJheS4gIERvbid0IGFjdHVhbGx5IGNvbXBpbGUKLSAgICAgaXQuICBUaGUgYWN0dWFsIGFycmF5IHdpbGwgYmUgcGlja2VkIHVwIGluIGFub3RoZXIgdmVyc2lvbiBvZiB0aGUKLSAgICAgZmlsZS4KLSAgIFNUQVRJQ19SRUxPQ1MKLSAgICAgTWFrZSB0aGUgcmVsb2NhdGlvbiBob3d0byBhcnJheSwgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb25zLCBzdGF0aWMuCi0gICBDT0ZGX0NPTU1PTl9BRERFTkQKLSAgICAgSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGVuLCBmb3IgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBjb21tb24KLSAgICAgc3ltYm9sLCB0aGUgb2JqZWN0IGZpbGUgaG9sZHMgdGhlIHZhbHVlICh0aGUgc2l6ZSkgb2YgdGhlIGNvbW1vbgotICAgICBzeW1ib2wuICBJZiB0aGlzIGlzIG5vdCBkZWZpbmVkLCB0aGVuLCBmb3IgYSByZWxvY2F0aW9uIGFnYWluc3QgYQotICAgICBjb21tb24gc3ltYm9sLCB0aGUgb2JqZWN0IGZpbGUgaG9sZHMgemVyby4gICovCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotCi0jaWZuZGVmIENPRkZfUEFHRV9TSVpFCi0vKiBUaGUgcGFnZSBzaXplIGlzIGEgZ3Vlc3MgYmFzZWQgb24gRUxGLiAgKi8KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgyMDAwCi0jZW5kaWYKLQotI2lmbmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKLSNkZWZpbmUgUkVMT0NfU1BFQ0lBTF9GTiAwCi0jZWxzZQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtNjhrY29mZl9jb21tb25fYWRkZW5kX3NwZWNpYWxfZm4KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQkgICBiZmRfdm1hICopKTsKLSNkZWZpbmUgUkVMT0NfU1BFQ0lBTF9GTiBtNjhrY29mZl9jb21tb25fYWRkZW5kX3NwZWNpYWxfZm4KLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBtNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIE9uIHRoZSBkZWx0YSwgYSBzeW1ib2wgc3RhcnRpbmcgd2l0aCBMJSBpcyBsb2NhbC4gIFdlIHdvbid0IHNlZQotICAgc3VjaCBhIHN5bWJvbCBvbiBvdGhlciBwbGF0Zm9ybXMsIHNvIGl0IHNob3VsZCBiZSBzYWZlIHRvIGFsd2F5cwotICAgY29uc2lkZXIgaXQgbG9jYWwgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnJScpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKLX0KLQotI2lmbmRlZiBTVEFUSUNfUkVMT0NTCi0vKiBDbGVhbiB1cCBuYW1lc3BhY2UuICAqLwotI2RlZmluZSBtNjhrY29mZl9ob3d0b190YWJsZQlfYmZkX202OGtjb2ZmX2hvd3RvX3RhYmxlCi0jZGVmaW5lIG02OGtfcnR5cGUyaG93dG8JX2JmZF9tNjhrY29mZl9ydHlwZTJob3d0bwotI2RlZmluZSBtNjhrX2hvd3RvMnJ0eXBlCV9iZmRfbTY4a2NvZmZfaG93dG8ycnR5cGUKLSNkZWZpbmUgbTY4a19yZWxvY190eXBlX2xvb2t1cAlfYmZkX202OGtjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZW5kaWYKLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiByZWxvY19ob3d0b190eXBlIG02OGtjb2ZmX2hvd3RvX3RhYmxlW107Ci0jZWxzZQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi1yZWxvY19ob3d0b190eXBlIG02OGtjb2ZmX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIFJFTE9DX1NQRUNJQUxfRk4sICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HX05FRywJICAgICAgIDAsICAtMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICItMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLX07Ci0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2lmbmRlZiBCQURNQUcKLSNkZWZpbmUgQkFETUFHKHgpIE02OEtCQURNQUcoeCkKLSNlbmRpZgotI2RlZmluZSBNNjggMQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLWV4dGVybiB2b2lkIG02OGtfcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqaW50ZXJuYWwsIGludCByZWxvY2VudHJ5KSk7Ci1leHRlcm4gaW50IG02OGtfaG93dG8ycnR5cGUgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqKSk7Ci1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqbTY4a19yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0jZWxzZQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi12b2lkCi1tNjhrX3J0eXBlMmhvd3RvKGludGVybmFsLCByZWxvY2VudHJ5KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgaW50IHJlbG9jZW50cnk7Ci17Ci0gIHN3aXRjaCAocmVsb2NlbnRyeSkgCi0gIHsKLSAgIGNhc2UgUl9SRUxCWVRFOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDA7IGJyZWFrOwotICAgY2FzZSBSX1JFTFdPUkQ6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAyOyBicmVhazsKLSAgIGNhc2UgUl9QQ1JCWVRFOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDM7IGJyZWFrOwotICAgY2FzZSBSX1BDUldPUkQ6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNDsgYnJlYWs7Ci0gICBjYXNlIFJfUENSTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA1OyBicmVhazsKLSAgIGNhc2UgUl9SRUxMT05HX05FRzoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA2OyBicmVhazsKLSAgfQotfQotCi0jaWZkZWYgU1RBVElDX1JFTE9DUwotc3RhdGljCi0jZW5kaWYKLWludCAKLW02OGtfaG93dG8ycnR5cGUgKGludGVybmFsKQotICAgICByZWxvY19ob3d0b190eXBlICppbnRlcm5hbDsKLXsKLSAgaWYgKGludGVybmFsLT5wY19yZWxhdGl2ZSkgCi0gIHsKLSAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKSAKLSAgICB7Ci0gICAgIGNhc2UgMzI6IHJldHVybiBSX1BDUkxPTkc7Ci0gICAgIGNhc2UgMTY6IHJldHVybiBSX1BDUldPUkQ7Ci0gICAgIGNhc2UgODogcmV0dXJuIFJfUENSQllURTsKLSAgICB9Ci0gIH0KLSAgZWxzZSAKLSAgewotICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpIAotICAgICB7Ci0gICAgICBjYXNlIDMyOiByZXR1cm4gUl9SRUxMT05HOwotICAgICAgY2FzZSAxNjogcmV0dXJuIFJfUkVMV09SRDsKLSAgICAgIGNhc2UgODogcmV0dXJuIFJfUkVMQllURTsKLSAgICAgfQotICB9Ci0gIHJldHVybiBSX1JFTExPTkc7ICAgIAotfQotCi0jaWZkZWYgU1RBVElDX1JFTE9DUwotc3RhdGljCi0jZW5kaWYKLXJlbG9jX2hvd3RvX3R5cGUgKgotbTY4a19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6CQkJcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoJCXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAxOwotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAyOwotICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDM7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDQ7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDU7Ci0gICAgICAvKiBGSVhNRTogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgY29kZSBmb3IgUl9SRUxMT05HX05FRy4gICovCi0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgXAotICBtNjhrX3J0eXBlMmhvd3RvKGludGVybmFsLCAocmVsb2NlbnRyeSktPnJfdHlwZSkKLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoZXh0ZXJuYWwsIGludGVybmFsKSBcCi0gIGV4dGVybmFsLnJfdHlwZSA9IG02OGtfaG93dG8ycnR5cGUgKGludGVybmFsKQotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG02OGtfcmVsb2NfdHlwZV9sb29rdXAKLQotI2lmbmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gbTY4a2NvZmZfcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIFJUWVBFMkhPV1RPICgmcmVsZW50LCByZWwpOwotCi0gIGhvd3RvID0gcmVsZW50Lmhvd3RvOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQ09GRl9DT01NT05fQURERU5EKSAqLwotDAotI2lmZGVmIENPRkZfQ09NTU9OX0FEREVORAotCi0vKiBJZiBDT0ZGX0NPTU1PTl9BRERFTkQgaXMgZGVmaW5lZCwgdGhlbiB3aGVuIHVzaW5nIG02OGsgQ09GRiB0aGUKLSAgIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24KLSAgIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMgYW55IGRlc2lyZWQgb2Zmc2V0LiAgKHRha2VuIGZyb20KLSAgIHdvcmsgZG9uZSBieSBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgZm9yIEkzODYgQ09GRikuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ltdmFsdWUgZGlmZjsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGFsd2F5cyBlZmZlY3RpdmVseQotCSBpZ25vcmVzIHRoZSBhZGRlbmQgZm9yIGEgQ09GRiB0YXJnZXQgd2hlbiBwcm9kdWNpbmcKLQkgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoaXMgc2VlbXMgdG8gYmUgYWx3YXlzIHdyb25nIGZvciAzODYKLQkgQ09GRiwgc28gd2UgaGFuZGxlIHRoZSBhZGRlbmQgaGVyZSBpbnN0ZWFkLiAgKi8KLSAgICAgIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIH0KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgaWYgKGRpZmYgIT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLSAgICAgIHN3aXRjaCAoaG93dG8tPnNpemUpCi0JewotCWNhc2UgMDoKLQkgIHsKLQkgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKLQkgICAgRE9JVCAoeCk7Ci0JICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgMToKLQkgIHsKLQkgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOwotCSAgICBET0lUICh4KTsKLQkgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgMjoKLQkgIHsKLQkgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgIERPSVQgKHgpOwotCSAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyogQ29tcHV0ZSB0aGUgYWRkZW5kIG9mIGEgcmVsb2MuICBJZiB0aGUgcmVsb2MgaXMgdG8gYSBjb21tb24gc3ltYm9sLAotICAgdGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIEJ5IHRoZQotICAgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIGxpbmtlciBtYXkgYmUgdXNpbmcgYSBkaWZmZXJlbnQgc3ltYm9sCi0gICBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuICBUaGVyZWZvcmUsIHdlCi0gICBoYWNrIHdpbGRseSB0byBsb2NhdGUgdGhlIG9yaWdpbmFsIHN5bWJvbCBmcm9tIHRoaXMgZmlsZSBzbyB0aGF0IHdlCi0gICBjYW4gbWFrZSB0aGUgY29ycmVjdCBhZGp1c3RtZW50LiAgVGhpcyBtYWNybyBzZXRzIGNvZmZzeW0gdG8gdGhlCi0gICBzeW1ib2wgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgYW5kIHVzZXMgaXQgdG8gc2V0IHRoZSBhZGRlbmQgdmFsdWUKLSAgIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgbm90IGEgY29tbW9uIHN5bWJvbCwgdGhlIHVzdWFsIGFkZGVuZAotICAgY2FsY3VsYXRpb24gaXMgZG9uZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCB0d2VhayBpcyBuZWVkZWQgZm9yCi0gICBQQyByZWxhdGl2ZSByZWxvY3MuCi0gICBGSVhNRTogVGhpcyBtYWNybyByZWZlcnMgdG8gc3ltYm9scyBhbmQgYXNlY3Q7IHRoZXNlIGFyZSBmcm9tIHRoZQotICAgY2FsbGluZyBmdW5jdGlvbiwgbm90IHRoZSBtYWNybyBhcmd1bWVudHMuICAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikJCVwKLSAgewkJCQkJCQkJXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwlcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkJCQlcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKQkJCQlcCi0JICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsJCVwKLSAgICBlbHNlIGlmIChwdHIpCQkJCQkJXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7CQkJXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwJCQlcCi0JJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwlcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkCQlcCi0JICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7CVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsJCQkJCVwKLSAgICBpZiAocHRyICYmIChyZWxvYy5yX3R5cGUgPT0gUl9QQ1JCWVRFCQkJXAotCQl8fCByZWxvYy5yX3R5cGUgPT0gUl9QQ1JXT1JECQkJXAotCQl8fCByZWxvYy5yX3R5cGUgPT0gUl9QQ1JMT05HKSkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCi0gIH0KLQotI2lmbmRlZiBjb2ZmX3J0eXBlX3RvX2hvd3RvCi0KLS8qIGNvZmYtbTY4ay5jIHVzZXMgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gIFdlIG5lZWQgdG8KLSAgIGFkanVzdCBjb21tb24gc3ltYm9scy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIFJUWVBFMkhPV1RPICgmcmVsZW50LCByZWwpOwotCi0gIGhvd3RvID0gcmVsZW50Lmhvd3RvOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotICAgICAgKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLQotICAvKiBJZiB0aGUgb3V0cHV0IHN5bWJvbCBpcyBjb21tb24gKGluIHdoaWNoIGNhc2UgdGhpcyBtdXN0IGJlIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmspLCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgICAgY29tbW9uIHN5bWJvbC4gICovCi0gIGlmIChoICE9IE5VTEwgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0bwotCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotCi0jZW5kaWYgLyogQ09GRl9DT01NT05fQURERU5EICovCi0MCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI2lmbmRlZiBUQVJHRVRfU1lNCi0jZGVmaW5lIFRBUkdFVF9TWU0gbTY4a2NvZmZfdmVjCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfTkFNRQotI2RlZmluZSBUQVJHRVRfTkFNRSAiY29mZi1tNjhrIgotI2VuZGlmCi0KLSNpZmRlZiBOQU1FU19IQVZFX1VOREVSU0NPUkUKLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgRF9QQUdFRCwgMCwgJ18nLCBOVUxMKQotI2Vsc2UKLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgRF9QQUdFRCwgMCwgMCwgTlVMTCkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtbTg4ay5jIGIvYmZkL2NvZmYtbTg4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzgzNzdhLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xhIDg4MDAwIENPRkYgIkJpbmFyeSBDb21wYXRhYmlsaXR5IFN0YW5kYXJkIiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgTTg4IDEJCS8qIEN1c3RvbWl6ZSB2YXJpb3VzIGluY2x1ZGUgZmlsZXMgKi8KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL204OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYm9vbGVhbiBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtODhrX3NwZWNpYWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCByZWxvY19wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGFyZWxlbnQgKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGFzeW1ib2wgKiosIGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfTlJFTE9DIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRfU0NOSERSX05MTk5PIGJmZF9oX2dldF8zMgotCi0vKiBPbiBjb2ZmLW04OGssIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICdAJy4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotc3RhdGljIGJvb2xlYW4KLW04OGtfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICdAJzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLW04OGtfc3BlY2lhbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCi0gIHN3aXRjaCAoaG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9IVlJUMTY6Ci0gICAgY2FzZSBSX0xWUlQxNjoKLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUKLQkgICAgIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4KLQkgICAgIE1vZGlmeSB0aGUgcmVsb2MgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKLQkgIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCSAgYmZkX3ZtYSB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQkgIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247Ci0JICBsb25nIHJlbG9jYXRpb24gPSAwOwotCi0JICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0JICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0KLQkgIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLQkgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotCSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0JICBpZiAob3V0cHV0X2JmZCkKLQkgICAgb3V0cHV0X2Jhc2UgPSAwOwotCSAgZWxzZQotCSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0JICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0JICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLQkgIHJlbG9jYXRpb24gKz0gKChyZWxvY19lbnRyeS0+YWRkZW5kIDw8IGhvd3RvLT5iaXRzaXplKSArIHgpOwotCi0JICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLQotCSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0JICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLwotCi0JICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgaG93dG8tPmJpdHBvczsKLQotCSAgaWYgKHJlbG9jYXRpb24pCi0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgcmVsb2NhdGlvbiwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIGFkZHIpOwotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgcmV0dXJuIGFuIGVycm9yIGlmCi0JIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQuICAqLwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlCi0JICAgICByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuCi0JICAgICBNb2RpZnkgdGhlIHJlbG9jIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8gKFJfUENSMTZMLAkJCS8qIHR5cGUgKi8KLQkgMDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBDUjE2TCIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUENSMjZMLAkJCS8qIHR5cGUgKi8KLQkgMDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBDUjI2TCIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDNmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwM2ZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfVlJUMTYsCQkJLyogdHlwZSAqLwotCSAwMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVlJUMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0hWUlQxNiwJCQkvKiB0eXBlICovCi0JIDE2LAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhWUlQxNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTFZSVDE2LAkJCS8qIHR5cGUgKi8KLQkgMDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTFZSVDE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9WUlQzMiwJCQkvKiB0eXBlICovCi0JIDAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJWUlQzMiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBDb2RlIHRvIHR1cm4gYW4gZXh0ZXJuYWwgcl90eXBlIGludG8gYSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZQotICAgYWJvdmUgaG93dG8gdGFibGUuICAqLwotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgaWYgKGRzdC0+cl90eXBlID49IFJfUENSMTZMICYmIGRzdC0+cl90eXBlIDw9IFJfVlJUMzIpCi0gICAgewotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgZHN0LT5yX3R5cGUgLSBSX1BDUjE2TDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICgwKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIHJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLQotCi0vKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jIG9mZnNldCAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgYmZkX2hfZ2V0XzE2Ci0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMTYKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKQlcCi0gIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKCgoaW50KSByZWxvYy0+cl9zeW1uZHgpID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci19Ci0KLSNkZWZpbmUgQkFETUFHKHgpIE1DODhCQURNQUcoeCkKLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jdW5kZWYgY29mZl93cml0ZV9hcm1hcAotCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAobTg4a2Jjc192ZWMsICJjb2ZmLW04OGtiY3MiLCAwLCAwLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi1tY29yZS5jIGIvYmZkL2NvZmYtbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljYmVhMS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgTUNvcmUgQ09GRi9QRQotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9tY29yZS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jaWZkZWYgQkFETUFHCi0jdW5kZWYgQkFETUFHCi0jZW5kaWYKLSNkZWZpbmUgQkFETUFHKHgpIE1DT1JFQkFETUFHKHgpCi0KLSNpZm5kZWYgTlVNX0VMRU0KLSNkZWZpbmUgTlVNX0VMRU0oQSkgKHNpemVvZiAoQSkgLyBzaXplb2YgKEEpWzBdKQotI2VuZGlmCi0KLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBtb3JlIHRoYW4gb25jZSwgYnV0IHdlIG9ubHkgY29tcGlsZSB0aGUKLSAgIGZpbmFsX2xpbmsgcm91dGluZSBvbmNlLiAgKi8KLWV4dGVybiBib29sZWFuIG1jb3JlX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogY29mZl9tY29yZV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICBtY29yZV9jb2ZmX3Vuc3VwcG9ydGVkX3JlbG9jIAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuICAgICAgICAgICAgICAgICAgICAgIGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgY29mZl9tY29yZV9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYmZkX3ZtYSAqKSk7Ci0MCi0vKiBUaGUgTlQgbG9hZGVyIHBvaW50cyB0aGUgdG9jIHJlZ2lzdGVyIHRvICZ0b2MgKyAzMjc2OCwgaW4gb3JkZXIgdG8KLSAgIHVzZSB0aGUgY29tcGxldGUgcmFuZ2Ugb2YgYSAxNi1iaXQgZGlzcGxhY2VtZW50LiBXZSBoYXZlIHRvIGFkanVzdAotICAgZm9yIHRoaXMgd2hlbiB3ZSBmaXggdXAgbG9hZHMgZGlzcGxhY2VkIG9mZiB0aGUgdG9jIHJlZy4gICovCi0jZGVmaW5lIFRPQ19MT0FEX0FESlVTVE1FTlQgKC0zMjc2OCkKLSNkZWZpbmUgVE9DX1NFQ1RJT05fTkFNRSAiLnByaXZhdGUudG9jIgotCi0vKiBUaGUgbWFpbiBib2R5IG9mIGNvZGUgaXMgaW4gY29mZmNvZGUuaC4gICovCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAyCi0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfQUJTT0xVVEUsLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogZG9udCBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUJTT0xVVEUiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMCwJIAkgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsICAgICAgICAJCSAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9BRERSMzIsLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTThCWTQiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogYnNyL2J0L2JmL2JyIGluc3RydWN0aW9uczsgMTEgYml0cyArIDEgemVybyBiaXQgCi0gICAgIFNwYW4gMmsgaW5zdHJ1Y3Rpb25zID09IDRrIGJ5dGVzLgotICAgICBPbmx5IHVzZWZ1bCBwaWVjZXMgYXQgdGhlIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSB0aGUgb3Bjb2RlICg1IGJpdHMpICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIsLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTTExQlkyIiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXRzICsgMSB6ZXJvIGJpdDsgJ2xvb3B0JyBpbnN0cnVjdGlvbiBvbmx5OyB1bnN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NNEJZMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHBjLXJlbGF0aXZlLiBFdmVudHVhbGx5IHRoaXMgd2lsbCBoZWxwIHN1cHBvcnQgUElDIGNvZGUuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIsLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSRUxfMzIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBQQ1JFTF9JTU0xMUJZMiwgdGhpcyByZWxvY2F0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKLSAgICAgJ2pzcmknIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSByZWxvY2F0aW9uCi0gICAgIGVudHJ5IGZvciB0aGUgbGl0ZXJhbCBwb29sIGVudHJ5IHRoYXQgaXQgcmVmZXJlbmNlcywgYnV0IHdlIAotICAgICBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUganNyaSB0byBhIGJzciBpZiB0aGUgdGFyZ2V0IHR1cm5zIG91dAotICAgICB0byBiZSBjbG9zZSBlbm91Z2ggW2V2ZW4gdGhvdWdoIHdlIHdvbid0IHJlY2xhaW0gdGhlIGxpdGVyYWwgcG9vbAotICAgICBlbnRyeSwgd2UnbGwgZ2V0IHNvbWUgcnVudGltZSBlZmZpY2llbmN5IGJhY2tdLiBOb3RlIHRoYXQgdGhpcwotICAgICBpcyBhIHJlbG9jYXRpb24gdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBzYWZlbHkgaWdub3JlLiAgKi8gCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCSAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJKU1JfSU1NMTFCWTIiLCAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9SVkEsICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTUNPUkVfUlZBIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgTSpDb3JlIHNwZWNpZmljIGZpZWxkcy4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCi10eXBlZGVmIHN0cnVjdCBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgb3JpZ2luYWwgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlLiAgTVVTVCBiZSBmaXJzdCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQlyb290OwotCi0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9vZl90b2Nfb3duZXI7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90b2Nfc2l6ZTsKLSAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3RhYmxlX3NpemU7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3RodW5rX2FkZHJlc3M7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIHRodW5rX3NpemU7Ci19Ci1tY29yZV9oYXNoX3RhYmxlOwotCi0vKiBHZXQgdGhlIE1Db3JlIGNvZmYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX21jb3JlX2hhc2hfdGFibGUoaW5mbykgXAotICAoKG1jb3JlX2hhc2hfdGFibGUgKikgKChpbmZvKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBNQ29yZSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1jb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIG1jb3JlX2hhc2hfdGFibGUgKiByZXQ7Ci0KLSAgcmV0ID0gKChtY29yZV9oYXNoX3RhYmxlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIHJldCkpKTsKLSAgaWYgKHJldCA9PSAobWNvcmVfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICAgICAgKCYgcmV0LT5yb290LCBhYmZkLCBfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmJmZF9vZl90b2Nfb3duZXIgPSBOVUxMOwotICByZXQtPmdsb2JhbF90b2Nfc2l6ZSAgPSAwOwotICByZXQtPmltcG9ydF90YWJsZV9zaXplID0gMDsKLSAgcmV0LT5maXJzdF90aHVua19hZGRyZXNzID0gMDsKLSAgcmV0LT50aHVua19zaXplID0gMDsKLQotICByZXR1cm4gJiByZXQtPnJvb3Qucm9vdDsKLX0KLQwKLS8qIEFkZCBhbiBlbnRyeSB0byB0aGUgYmFzZSBmaWxlLiAgKi8KLXN0YXRpYyB2b2lkCi1tY29yZV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2Nfb2Zmc2V0KQotICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICByZWxvY19vZmZzZXQ7Ci17Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX29mZnNldAotICAgICAgICAgICAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYQotICAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIGlmIChjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLSAgICAgYWRkciAtPSBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgCi0gIGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAoYWRkciksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci19Ci0MCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEJGRF9BU1NFUlQgKHJlbG9jX2VudHJ5LT5ob3d0byAhPSAocmVsb2NfaG93dG9fdHlwZSAqKTApOwotICAKLSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCi0JCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPm5hbWUsCi0JCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSk7Ci0gIAotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotDAotLyogQSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZS4gKi8KLSNkZWZpbmUgSE9XMk1BUChiZmRfcnR5cGUsIG1jb3JlX3J0eXBlKSAgXAotIGNhc2UgYmZkX3J0eXBlOiByZXR1cm4gJiBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlIFttY29yZV9ydHlwZV0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsgCi0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfQUREUjMyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0LCAgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU04Qlk0KTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMiwgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU0xMUJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMiwgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfMzJfUENSRUwsICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMiwgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfUlZBLCAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfUlZBKTsKLSAgIGRlZmF1bHQ6IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jdW5kZWYgSE9XMk1BUAotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi0gIChjYWNoZV9wdHIpLT5ob3d0byA9IG1jb3JlX2NvZmZfaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bTsKLSAgICAgYmZkX3ZtYSAqIGFkZGVuZHA7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLQotCi0gIGlmIChyZWwtPnJfdHlwZSA+PSBOVU1fRUxFTSAobWNvcmVfY29mZl9ob3d0b190YWJsZSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICBob3d0byA9IG1jb3JlX2NvZmZfaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZTsKLQotICBpZiAocmVsLT5yX3R5cGUgPT0gSU1BR0VfUkVMX01DT1JFX1JWQSkKLSAgICAqIGFkZGVuZHAgLT0gcGVfZGF0YSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAKLSAgZWxzZSBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgICogYWRkZW5kcCA9IHNlYy0+dm1hIC0gMjsgLyogWFhYIGd1ZXNzIC0gaXMgdGhpcyByaWdodCA/ICovCi0gICAgICAKLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCi0gICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KLSAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAotICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkqIGFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgICogYWRkZW5kcCA9IDA7Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQgaW4gcGVfbWtvYmplY3QgaW4gcGVpY29kZS5oLiAgKi8KLXN0YXRpYyBib29sZWFuCi1pbl9yZWxvY19wIChhYmZkLCBob3d0bykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfTUNPUkVfUlZBOwotfSAgICAgCi0KLQwKLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYmZkICogaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bXM7Ci0gICAgIGFzZWN0aW9uICoqIHNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgCi0gIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIGRvbid0IG5lZWQgdG8gZG8gYQotICAgICB0aGluZy4gIFRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvdXRwdXRfYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuLlxuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICAKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiAgICAgICBzeW07Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgICByc3RhdDsKLSAgICAgIGJmZF9ieXRlICogICAgICAgICAgICAgICAgICAgICBsb2M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgcl90eXBlID0gcmVsLT5yX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgICAgaG93dG8gPSBOVUxMOwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgbXlfbmFtZTsKLSAgCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICAKLSAgICAgIC8qIEdldCB0aGUgaG93dG8gYW5kIGluaXRpYWxpc2UgdGhlIGFkZGVuZC4gICovCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmIGFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbXlfbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgCi0JICAgICAgdmFsID0gKHN5bS0+bl92YWx1ZSAKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQkJbXlfbmFtZSA9ICIqdW5rbm93bioiOwotCSAgICAgIGVsc2UgaWYgKCAgIHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCQlteV9uYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgZWxzZSAKLQkJewotCQkgIHN0YXRpYyBjaGFyIGJ1ZiBbU1lNTk1MRU4gKyAxXTsKLQkJICAKLQkJICBzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQkgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCQkgIG15X25hbWUgPSBidWY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICAKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBteV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQl9CQotCi0gICAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgICAgLyogRWFjaCBjYXNlIG11c3QgZG8gaXRzIG93biByZWxvY2F0aW9uLCBzZXR0aW5nIHJzdGF0IGFwcHJvcHJpYXRlbHkuICAqLwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCByX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JICAKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURToKLQkgIGZwcmludGYgKHN0ZGVyciwgCi0JCSAgIF8oIldhcm5pbmc6IHVuc3VwcG9ydGVkIHJlbG9jICVzIDxmaWxlICVzLCBzZWN0aW9uICVzPlxuIiksIAotCQkgICBob3d0by0+bmFtZSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICAKLQkgIGZwcmludGYgKHN0ZGVyciwic3ltICVsZCAoJXMpLCByX3ZhZGRyICVsZCAoJWx4KVxuIiwgCi0JCSAgIHJlbC0+cl9zeW1uZHgsIG15X25hbWUsIChsb25nKSByZWwtPnJfdmFkZHIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICBicmVhazsKLQkgIAotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQ6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfQUREUjMyOgotCSAgLyogWFhYIGZpeG1lIC0gc2hvdWxkbid0IHRoaXMgYmUgbGlrZSB0aGUgY29kZSBmb3IgdGhlIFJWQSByZWxvYyA/ICovCi0JICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUlZBOgotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLQkgICAgKGhvd3RvLCBpbnB1dF9iZmQsCi0JICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCSAgICAgdmFsLCBhZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotCXsKLQkgIC8qIEVtaXQgYSByZWxvYyBpZiB0aGUgYmFja2VuZCB0aGlua3MgaXQgbmVlZHMgaXQuICAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhIChvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcCAob3V0cHV0X2JmZCwgaG93dG8pKQotICAgICAgICAgICAgbWNvcmVfZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkcik7Ci0JfQotICAKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIAotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JICAKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywgbXlfbmFtZSwgaG93dG8tPm5hbWUsIAotCQkgIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byAgICAgICAgICBjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGludGVybmFsLCBob3d0bykge2ludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlO30KLQotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAgICAgICAgICAgICAgIDB4MTAwMAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQwKLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gaW5pdGlhbGlzZSBhbHRlcmJhdGl2ZV90YXJnZXQgZmllbGQuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU07Ci0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3JzIHRoYXQgbGVhZCB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUsIERfUEFHRUQsIChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksIDAsICYgVEFSR0VUX0xJVFRMRV9TWU0pCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9MSVRUTEVfTkFNRSwgRF9QQUdFRCwgKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwgMCwgJiBUQVJHRVRfQklHX1NZTSkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW1pcHMuYyBiL2JmZC9jb2ZmLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0YjE1ZS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUlQUyBFeHRlbmRlZC1Db2ZmIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBPcmlnaW5hbCB2ZXJzaW9uIGJ5IFBlciBCb3RobmVyLgotICAgRnVsbCBzdXBwb3J0IGFkZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIGlhbkBjeWdudXMuY29tLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmL21pcHMuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLQwKLS8qIFByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBtaXBzX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIFBUUiBmaWxlaGRyKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJICAgICAgIFBUUikpOwotc3RhdGljIHZvaWQgbWlwc19hZGp1c3RfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosCi0JCQkJCSAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSAgYXJlbGVudCAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2FkanVzdF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19nZW5lcmljX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQkgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQkgUFRSIGRhdGEsCi0JCQkJCQkJIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCSBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlZmhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlZmxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX2dwcmVsX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlbGhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlbGxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3N3aXRjaF9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJCVBUUiBkYXRhLAotCQkJCQkJCWFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCWJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCQljaGFyICoqZXJyb3IpKTsKLXN0YXRpYyB2b2lkIG1pcHNfcmVsb2NhdGVfaGkgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3JlbG9jICpyZWZoaSwKLQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmxvLAotCQkJCSAgICAgIGJmZCAqaW5wdXRfYmZkLAotCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGJmZF9ieXRlICpjb250ZW50cywKLQkJCQkgICAgICBzaXplX3QgYWRqdXN0LAotCQkJCSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkJCQkgICAgICBib29sZWFuIHBjcmVsKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICAgICBiZmRfYnl0ZSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVhZF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVsYXhfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlbGF4X3BjcmVsMTYgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCi0JCQkJCSAgIGFzZWN0aW9uICosCi0JCQkJCSAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotDAotLyogRUNPRkYgaGFzIENPRkYgc2VjdGlvbnMsIGJ1dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbgotICAgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmb3JtYXQuICBFQ09GRiB0YXJnZXRzIHVzZSBzb21lIG9mIHRoZQotICAgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBjb2Zmc3dhcC5oLCBhbmQgc29tZSBvZiB0aGUgZ2VuZXJpYyBDT0ZGCi0gICByb3V0aW5lcyBpbiBjb2ZmZ2VuLmMsIGJ1dCwgdW5saWtlIHRoZSByZWFsIENPRkYgdGFyZ2V0cywgZG8gbm90Ci0gICB1c2UgY29mZmNvZGUuaCBpdHNlbGYuCi0KLSAgIEdldCB0aGUgZ2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBleGNlcHQgZm9yIHRoZSByZWxvYywKLSAgIHN5bWJvbCwgYW5kIGxpbmVubyBvbmVzLiAgR2l2ZSB0aGVtIEVDT0ZGIG5hbWVzLiAgKi8KLSNkZWZpbmUgTUlQU0VDT0ZGCi0jZGVmaW5lIE5PX0NPRkZfUkVMT0NTCi0jZGVmaW5lIE5PX0NPRkZfU1lNQk9MUwotI2RlZmluZSBOT19DT0ZGX0xJTkVOT1MKLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfaW4gbWlwc19lY29mZl9zd2FwX2ZpbGVoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9pbiBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfaW4gbWlwc19lY29mZl9zd2FwX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX291dCBtaXBzX2Vjb2ZmX3N3YXBfc2NuaGRyX291dAotI2luY2x1ZGUgImNvZmZzd2FwLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2RlZmluZSBFQ09GRl8zMgotI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgotDAotLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2NzIHR5cGVzLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19ob3d0b190YWJsZVtdID0KLXsKLSAgLyogUmVsb2MgdHlwZSAwIGlzIGlnbm9yZWQuICBUaGUgcmVsb2MgcmVhZGluZyBjb2RlIGVuc3VyZXMgdGhhdAotICAgICB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAuYWJzIHNlY3Rpb24sIHdoaWNoIHdpbGwgY2F1c2UKLSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB0byBkbyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9JR05PUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklHTk9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLCBub3JtYWxseSBmcm9tIGEgZGF0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZIQUxGLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkhBTEYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wsIG5vcm1hbGx5IGZyb20gYSBkYXRhIHNlY3Rpb24uICAqLwotICBIT1dUTyAoTUlQU19SX1JFRldPUkQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGV09SRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyNiBiaXQgYWJzb2x1dGUganVtcCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9KTVBBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkpNUEFERFIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCAxNiBiaXRzIG9mIGEgc3ltYm9sIHZhbHVlLiAgSGFuZGxlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgbWlwc19yZWZoaV9yZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGSEksCQkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGSEkiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgbG93IDE2IGJpdHMgb2YgYSBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoTUlQU19SX1JFRkxPLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlZmxvX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMTyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVmZXJlbmNlIHRvIGFuIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4gIEhhbmRsZWQgYnkgdGhlCi0gICAgIGZ1bmN0aW9uIG1pcHNfZ3ByZWxfcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX0dQUkVMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWZlcmVuY2UgdG8gYSBsaXRlcmFsIHVzaW5nIGFuIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4KLSAgICAgSGFuZGxlZCBieSB0aGUgZnVuY3Rpb24gbWlwc19ncHJlbF9yZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVEVSQUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBFTVBUWV9IT1dUTyAoOCksCi0gIEVNUFRZX0hPV1RPICg5KSwKLSAgRU1QVFlfSE9XVE8gKDEwKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhIDE2IGJpdCBQQwotICAgICByZWxhdGl2ZSByZWxvYyByaWdodHNoaWZ0ZWQgdHdpY2UgYXMgdXNlZCBpbiB0aGUgTUlQUyBicmFuY2gKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9QQ1JFTDE2LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBDUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyB0aGUgaGlnaCAxNgotICAgICBiaXRzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MuICBUaGUgbmV4dCByZWxvYyBtdXN0IGJlCi0gICAgIE1JUFNfUl9SRUxMTywgYW5kIHRoZSBhZGRlbmQgaXMgZm9ybWVkIGZyb20gdGhlIGFkZGVuZHMgb2YgdGhlCi0gICAgIHR3byBpbnN0cnVjdGlvbnMsIGp1c3QgYXMgaW4gTUlQU19SX1JFRkhJIGFuZCBNSVBTX1JfUkVGTE8uICBUaGUKLSAgICAgZmluYWwgdmFsdWUgaXMgYWN0dWFsbHkgUEMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIG5vdCB0aGUgTUlQU19SX1JFTEhJIHJlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUxISSwJCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVsaGlfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTEhJIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgdGhlIGxvdyAxNgotICAgICBiaXRzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX1JFTExPLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVsbG9fcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTExPIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDE1KSwKLSAgRU1QVFlfSE9XVE8gKDE2KSwKLSAgRU1QVFlfSE9XVE8gKDE3KSwKLSAgRU1QVFlfSE9XVE8gKDE4KSwKLSAgRU1QVFlfSE9XVE8gKDE5KSwKLSAgRU1QVFlfSE9XVE8gKDIwKSwKLSAgRU1QVFlfSE9XVE8gKDIxKSwKLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhbiBlbnRyeSBpbgotICAgICBhIHN3aXRjaCB0YWJsZSwgd2hpY2ggaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc3ltYm9scyBpbgotICAgICB0aGUgLnRleHQgc2VjdGlvbi4gIFRoZSBzeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBzdWJ0cmFoZW5kLiAgU2VlIGluY2x1ZGUvY29mZi9taXBzLmggZm9yCi0gICAgIG1vcmUgZGV0YWlscy4gICovCi0gIEhPV1RPIChNSVBTX1JfU1dJVENILAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfc3dpdGNoX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTV0lUQ0giLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0jZGVmaW5lIE1JUFNfSE9XVE9fQ09VTlQgXAotICAoc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSkKLQotLyogV2hlbiB0aGUgbGlua2VyIGlzIGRvaW5nIHJlbGF4aW5nLCBpdCBtYXkgY2hhbmdlIGEgZXh0ZXJuYWwgUENSRUwxNgotICAgcmVsb2MuICBUaGlzIHR5cGljYWxseSByZXByZXNlbnRzIGFuIGluc3RydWN0aW9uIGxpa2UKLSAgICAgICBiYWwgZm9vCi0gICBXZSBjaGFuZ2UgaXQgdG8KLSAgICAgICAuc2V0ICBub3Jlb3JkZXIKLSAgICAgICBiYWwgICAkTDEKLSAgICAgICBsdWkgICAkYXQsJWhpKGZvbyAtICRMMSkKLSAgICAgJEwxOgotICAgICAgIGFkZGl1ICRhdCwlbG8oZm9vIC0gJEwxKQotICAgICAgIGFkZHUgICRhdCwkYXQsJDMxCi0gICAgICAgamFsciAgJGF0Ci0gICBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhpcyBjaGFuZ2VzIHRoZQotICAgaW5zdHJ1Y3Rpb24gYnkuICAqLwotCi0jZGVmaW5lIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQgKDQgKiA0KQotDAotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBNSVBTX01BR0lDXzE6Ci0gICAgICAvKiBJIGRvbid0IGtub3cgd2hhdCBlbmRpYW5uZXNzIHRoaXMgaW1wbGllcy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgTUlQU19NQUdJQ19CSUc6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzI6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzM6Ci0gICAgICByZXR1cm4gYmZkX2JpZ19lbmRpYW4gKGFiZmQpOwotCi0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRToKLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMjoKLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMzoKLSAgICAgIHJldHVybiBiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCk7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQwKLS8qIFJlbG9jIGhhbmRsaW5nLiAgTUlQUyBFQ09GRiByZWxvY3MgYXJlIHBhY2tlZCBpbnRvIDggYnl0ZXMgaW4KLSAgIGV4dGVybmFsIGZvcm0uICBUaGV5IHVzZSBhIGJpdCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ltYm9sCi0gICBpcyBleHRlcm5hbC4gICovCi0KLS8qIFN3YXAgYSByZWxvYyBpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIGV4dF9wdHIsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci17Ci0gIGNvbnN0IFJFTE9DICpleHQgPSAoUkVMT0MgKikgZXh0X3B0cjsKLQotICBpbnRlcm4tPnJfdmFkZHIgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnJfdmFkZHIpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gKCgoaW50KSBleHQtPnJfYml0c1swXQotCQkJICAgPDwgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHKQotCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1sxXQotCQkJICAgICA8PCBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUcpCi0JCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzJdCi0JCQkgICAgIDw8IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRykpOwotICAgICAgaW50ZXJuLT5yX3R5cGUgPSAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCi0JCQk+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRyk7Ci0gICAgICBpbnRlcm4tPnJfZXh0ZXJuID0gKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0JJRykgIT0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gKCgoaW50KSBleHQtPnJfYml0c1swXQotCQkJICAgPDwgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFKQotCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1sxXQotCQkJICAgICA8PCBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEUpCi0JCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzJdCi0JCQkgICAgIDw8IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRSkpOwotICAgICAgaW50ZXJuLT5yX3R5cGUgPSAoKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQotCQkJID4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfTElUVExFKQotCQkJfCAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRSkKLQkJCSAgIDw8IFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUpKTsKLSAgICAgIGludGVybi0+cl9leHRlcm4gPSAoZXh0LT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFKSAhPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgTUlQU19SX1NXSVRDSCByZWxvYywgb3IgYW4gaW50ZXJuYWwgTUlQU19SX1JFTEhJIG9yCi0gICAgIE1JUFNfUl9SRUxMTyByZWxvYywgcl9zeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBiYXNlIG9mIHRoZSBkaWZmZXJlbmNlIChzZWUKLSAgICAgaW5jbHVkZS9jb2ZmL21pcHMuaCBmb3IgbW9yZSBkZXRhaWxzKS4gIFdlIGNvcHkgc3ltbmR4IGludG8gdGhlCi0gICAgIHJfb2Zmc2V0IGZpZWxkIHNvIGFzIG5vdCB0byBjb25mdXNlIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIGluCi0gICAgIGVjb2ZmLmMuICBJbiBhZGp1c3RfcmVsb2NfaW4gd2UgdGhlbiBjb3B5IHJfb2Zmc2V0IGludG8gdGhlIHJlbG9jCi0gICAgIGFkZGVuZC4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfU1dJVENICi0gICAgICB8fCAoISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTExPCi0JICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKSkpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoISBpbnRlcm4tPnJfZXh0ZXJuKTsKLSAgICAgIGludGVybi0+cl9vZmZzZXQgPSBpbnRlcm4tPnJfc3ltbmR4OwotICAgICAgaWYgKGludGVybi0+cl9vZmZzZXQgJiAweDgwMDAwMCkKLQlpbnRlcm4tPnJfb2Zmc2V0IC09IDB4MTAwMDAwMDsKLSAgICAgIGludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0gICAgfQotfQotCi0vKiBTd2FwIGEgcmVsb2Mgb3V0LiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIGludGVybiwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBQVFIgZHN0OwotewotICBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGRzdDsKLSAgbG9uZyByX3N5bW5keDsKLQotICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfZXh0ZXJuCi0JICAgICAgfHwgKGludGVybi0+cl9zeW1uZHggPj0gMCAmJiBpbnRlcm4tPnJfc3ltbmR4IDw9IDEyKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxMTyBvcgotICAgICBNSVBTX1JfUkVMSEkgcmVsb2MsIHdlIGFjdHVhbGx5IHdhbnQgdG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mCi0gICAgIHJfb2Zmc2V0IG91dCBhcyB0aGUgc3ltYm9sIGluZGV4LiAgVGhpcyB1bmRvZXMgdGhlIGNoYW5nZSBtYWRlIGJ5Ci0gICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSAhPSBNSVBTX1JfU1dJVENICi0gICAgICAmJiAoaW50ZXJuLT5yX2V4dGVybgotCSAgfHwgKGludGVybi0+cl90eXBlICE9IE1JUFNfUl9SRUxISQotCSAgICAgICYmIGludGVybi0+cl90eXBlICE9IE1JUFNfUl9SRUxMTykpKQotICAgIHJfc3ltbmR4ID0gaW50ZXJuLT5yX3N5bW5keDsKLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9URVhUKTsKLSAgICAgIHJfc3ltbmR4ID0gaW50ZXJuLT5yX29mZnNldCAmIDB4ZmZmZmZmOwotICAgIH0KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cl92YWRkciwgKGJmZF9ieXRlICopIGV4dC0+cl92YWRkcik7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGV4dC0+cl9iaXRzWzBdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5yX2JpdHNbMV0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPnJfYml0c1syXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRzsKLSAgICAgIGV4dC0+cl9iaXRzWzNdID0gKCgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzNfVFlQRV9TSF9CSUcpCi0JCQkgJiBSRUxPQ19CSVRTM19UWVBFX0JJRykKLQkJCXwgKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTM19FWFRFUk5fQklHIDogMCkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dC0+cl9iaXRzWzBdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFOwotICAgICAgZXh0LT5yX2JpdHNbMV0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPnJfYml0c1syXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+cl9iaXRzWzNdID0gKCgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUpCi0JCQkgJiBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRSkKLQkJCXwgKChpbnRlcm4tPnJfdHlwZSA+PiBSRUxPQ19CSVRTM19UWVBFSElfU0hfTElUVExFCi0JCQkgICAgJiBSRUxPQ19CSVRTM19UWVBFSElfTElUVExFKSkKLQkJCXwgKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFIDogMCkpOwotICAgIH0KLX0KLQotLyogRmluaXNoIGNhbm9uaWNhbGl6aW5nIGEgcmVsb2MuICBQYXJ0IG9mIHRoaXMgaXMgZ2VuZXJpYyB0byBhbGwKLSAgIEVDT0ZGIHRhcmdldHMsIGFuZCB0aGF0IHBhcnQgaXMgaW4gZWNvZmYuYy4gIFRoZSByZXN0IGlzIGRvbmUgaW4KLSAgIHRoaXMgYmFja2VuZCByb3V0aW5lLiAgSXQgbXVzdCBmaWxsIGluIHRoZSBob3d0byBmaWVsZC4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2FkanVzdF9yZWxvY19pbiAoYWJmZCwgaW50ZXJuLCBycHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBhcmVsZW50ICpycHRyOwotewotICBpZiAoaW50ZXJuLT5yX3R5cGUgPiBNSVBTX1JfU1dJVENIKQotICAgIGFib3J0ICgpOwotCi0gIGlmICghIGludGVybi0+cl9leHRlcm4KLSAgICAgICYmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfR1BSRUwKLQkgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9MSVRFUkFMKSkKLSAgICBycHRyLT5hZGRlbmQgKz0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotCi0gIC8qIElmIHRoZSB0eXBlIGlzIE1JUFNfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCi0gICAgIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX0lHTk9SRSkKLSAgICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCi0gIC8qIElmIHRoaXMgaXMgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMSEkgb3IKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCB3ZSB3YW50IHRoZSBhZGRlbmQgZmllbGQgb2YgdGhlIEJGRCByZWxvY3RvCi0gICAgIGhvbGQgdGhlIHZhbHVlIHdoaWNoIHdhcyBvcmlnaW5hbGx5IGluIHRoZSBzeW1uZHggZmllbGQgb2YgdGhlCi0gICAgIGludGVybmFsIE1JUFMgRUNPRkYgcmVsb2MuICBUaGlzIHZhbHVlIHdhcyBjb3BpZWQgaW50bwotICAgICBpbnRlcm4tPnJfb2Zmc2V0IGJ5IG1pcHNfc3dhcF9yZWxvY19pbiwgYW5kIGhlcmUgd2UgY29weSBpdCBpbnRvCi0gICAgIHRoZSBhZGRlbmQgZmllbGQuICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSAotICAgICAgfHwgKCEgaW50ZXJuLT5yX2V4dGVybgotCSAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxISQotCSAgICAgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxMTykpKQotICAgIHJwdHItPmFkZGVuZCA9IGludGVybi0+cl9vZmZzZXQ7Ci0KLSAgcnB0ci0+aG93dG8gPSAmbWlwc19ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Ci19Ci0KLS8qIE1ha2UgYW55IGFkanVzdG1lbnRzIG5lZWRlZCB0byBhIHJlbG9jIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIE5vbmUKLSAgIGFyZSBuZWVkZWQgZm9yIE1JUFMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGFyZWxlbnQgKnJlbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci17Ci0gIC8qIEZvciBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxISSBvcgotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIHdlIG11c3QgY29weSByZWwtPmFkZGVuZCBpbnRvCi0gICAgIGludGVybi0+cl9vZmZzZXQuICBUaGlzIHdpbGwgdGhlbiBiZSB3cml0dGVuIG91dCBhcyB0aGUgc3ltYm9sCi0gICAgIGluZGV4IGJ5IG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQuICBUaGlzIG9wZXJhdGlvbiBwYXJhbGxlbHMgdGhlCi0gICAgIGFjdGlvbiBvZiBtaXBzX2FkanVzdF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfU1dJVENICi0gICAgICB8fCAoISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTEhJCi0JICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTExPKSkpCi0gICAgaW50ZXJuLT5yX29mZnNldCA9IHJlbC0+YWRkZW5kOwotfQotCi0vKiBFQ09GRiByZWxvY3MgYXJlIGVpdGhlciBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMsIG9yIGFnYWluc3QKLSAgIHNlY3Rpb25zLiAgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgdGhlIHJlbG9jCi0gICBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIG5vdGhpbmcgaGFzIGdpdmVuIHVzIGFueQotICAgYWRkaXRpb25hbCBhZGRlbmQsIHRoZSByZXN1bHRpbmcgcmVsb2Mgd2lsbCBhbHNvIGJlIGFnYWluc3QgdGhlCi0gICBzYW1lIHN5bWJvbC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZwotICAgYWJvdXQgdGhlIHdheSB0aGUgcmVsb2MgaXMgaGFuZGxlZCwgc2luY2UgaXQgd2lsbCBhbGwgYmUgZG9uZSBhdAotICAgZmluYWwgbGluayB0aW1lLiAgUmF0aGVyIHRoYW4gcHV0IHNwZWNpYWwgY2FzZSBjb2RlIGludG8KLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFsbCB0aGUgcmVsb2MgdHlwZXMgdXNlIHRoaXMgaG93dG8KLSAgIGZ1bmN0aW9uLiAgSXQganVzdCBzaG9ydCBjaXJjdWl0cyB0aGUgcmVsb2MgaWYgcHJvZHVjaW5nCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19nZW5lcmljX3JlbG9jIChhYmZkLAotCQkgICAgcmVsb2NfZW50cnksCi0JCSAgICBzeW1ib2wsCi0JCSAgICBkYXRhLAotCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsCi0JCSAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBEbyBhIFJFRkhJIHJlbG9jYXRpb24uICBUaGlzIGhhcyB0byBiZSBkb25lIGluIGNvbWJpbmF0aW9uIHdpdGggYQotICAgUkVGTE8gcmVsb2MsIGJlY2F1c2UgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIHRoZSBSRUZMTyB0byB0aGUgUkVGSEkuCi0gICBIZXJlIHdlIGp1c3Qgc2F2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZDsgd2UgZG8gdGhlIGFjdHVhbAotICAgcmVsb2NhdGlvbiB3aGVuIHdlIHNlZSB0aGUgUkVGTE8uICBNSVBTIEVDT0ZGIHJlcXVpcmVzIHRoYXQgdGhlCi0gICBSRUZMTyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIFJFRkhJLiAgQXMgYSBHTlUgZXh0ZW5zaW9uLCB3ZSBwZXJtaXQKLSAgIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkgcmVsb2NzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBMTwotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpCi17Ci0gIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotICBiZmRfYnl0ZSAqYWRkcjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGEgc3RhdGljIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtaXBzX2hpICptaXBzX3JlZmhpX2xpc3Q7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBzdHJ1Y3QgbWlwc19oaSAqbjsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVGTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gIG1pcHNfcmVmaGlfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSRUZMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgaW5wbGFjZQotICAgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlIFJFRkhJCi0gICByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobWlwc19yZWZoaV9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkgKmw7Ci0KLSAgICAgIGwgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotCi0JICAvKiBEbyB0aGUgUkVGSEkgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAotCSAgICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBSRUZMTyBpdHNlbGYsIGV4Y2VwdAotCSAgICAgd2hlcmUgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlCi0JICAgICBSRUZISS4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7Ci0JICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotCQkgICAmIDB4ZmZmZik7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCi0JICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCi0JICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKLQkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCi0JICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KLQkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0JICAgIHZhbCAtPSAweDEwMDAwOwotCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0JICAgIHZhbCArPSAweDEwMDAwOwotCi0JICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKLQotCSAgbmV4dCA9IGwtPm5leHQ7Ci0JICBmcmVlIChsKTsKLQkgIGwgPSBuZXh0OwotCX0KLQotICAgICAgbWlwc19yZWZoaV9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBSRUZMTyByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIG1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBEbyBhIEdQUkVMIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgMTYgYml0IHZhbHVlIHdoaWNoIG11c3QgYmVjb21lCi0gICB0aGUgb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19ncHJlbF9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfdm1hIGdwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFQ09GRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiByZWxvY2F0ZWFibGUgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBncCB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVDT0ZGCi0gICAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMAotICAgICAgJiYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotCSAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApKQotICAgIHsKLSAgICAgIGlmIChyZWxvY2F0ZWFibGUgIT0gZmFsc2UpCi0JewotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgIGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgYXN5bWJvbCAqKnN5bTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCSAgc3ltID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKLQotCSAgaWYgKHN5bSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLQkgICAgaSA9IGNvdW50OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bSsrKQotCQl7Ci0JCSAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqc3ltKTsKLQkJICBpZiAoKm5hbWUgPT0gJ18nICYmIHN0cmNtcCAobmFtZSwgIl9ncCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOwotCQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpID49IGNvdW50KQotCSAgICB7Ci0JICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotCSAgICAgIGdwID0gNDsKLQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCSAgICAgICplcnJvcl9tZXNzYWdlID0KLQkJKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIpOwotCSAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgKyByZWxvY19lbnRyeS0+YWRkZW5kKSAmIDB4ZmZmZjsKLSAgaWYgKHZhbCAmIDB4ODAwMCkKLSAgICB2YWwgLT0gMHgxMDAwMDsKLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlICE9IGZhbHNlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIGl0IGZpdCBpbiAxNiBiaXRzLiAgKi8KLSAgaWYgKHZhbCA+PSAweDgwMDAgJiYgdmFsIDwgMHhmZmZmODAwMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUkVMSEkgcmVsb2NhdGlvbi4gIFdlIGRvIHRoaXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIFJFTExPCi0gICByZWxvYywganVzdCBhcyBSRUZISSBhbmQgUkVGTE8gYXJlIGRvbmUgdG9nZXRoZXIuICBSRUxISSBhbmQgUkVMTE8KLSAgIGFyZSBDeWdudXMgZXh0ZW5zaW9ucyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudAotICAgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gICovCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfaGkgKm1pcHNfcmVsaGlfbGlzdDsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19yZWxoaV9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHN0cnVjdCBtaXBzX2hpICpuOwotCi0gIC8qIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHRoZW4gaXQgaXMgY29ycmVjdAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gY2hhbmdlIHRoaXMgY2FzZSBpcwotICAgICB3aGVuIHdlIGFyZSByZWxheGluZywgYW5kIHRoYXQgaXMgaGFuZGxlZCBlbnRpcmVseSBieQotICAgICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gYW5kIG5ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24uICAqLwotICBpZiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gIElmIHdlJ3JlIHJlbG9jYXRpbmcsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVMTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX3JlbGhpX2xpc3Q7Ci0gIG1pcHNfcmVsaGlfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSRUxMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgUEMKLSAgIHJlbGF0aXZlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZSBSRUxISQotICAgcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3JlbGxvX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG1pcHNfcmVsaGlfbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX2hpICpsOwotCi0gICAgICBsID0gbWlwc19yZWxoaV9saXN0OwotICAgICAgd2hpbGUgKGwgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluc247Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0JICBzdHJ1Y3QgbWlwc19oaSAqbmV4dDsKLQotCSAgLyogRG8gdGhlIFJFTEhJIHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QKLQkgICAgIG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgUkVMTE8gaXRzZWxmLCBleGNlcHQKLQkgICAgIHdoZXJlIHRvIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZQotCSAgICAgUkVMSEkuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpOwotCSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyB2YWxsbzsKLQkgIHZhbCArPSBsLT5hZGRlbmQ7Ci0KLQkgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgbWFrZSB2YWwgUEMgcmVsYXRpdmUuICBJZiB0aGUKLQkgICAgIHN5bWJvbCBpcyBub3QgZGVmaW5lZCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMsIGJlY2F1c2UKLQkgICAgIHdlIGRvbid0IHdhbnQgdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZSB0byBpbmNvcnBvcmF0ZQotCSAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jLiAgKi8KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKQotCSAgICAgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpKQotCSAgICB2YWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLQkgIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIHZhbHVlLiAgVGhlcmVmb3JlLCBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSBsb3cgb3JkZXIgYml0cwotCSAgICAgcmVxdWlyZXMgYW4gYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZAotCSAgICAgdG8gbWFrZSB0aGlzIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlCi0JICAgICB0b29rIGZyb20gdGhlIGRhdGEsIGFuZCBvbmNlIGZvciB0aGUgYml0cyB3ZSBhcmUgcHV0dGluZwotCSAgICAgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0JICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgLT0gMHgxMDAwMDsKLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG1pcHNfcmVsaGlfbGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHRoZW4gaXQgaXMgY29ycmVjdAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gY2hhbmdlIHRoaXMgY2FzZSBpcwotICAgICB3aGVuIHdlIGFyZSByZWxheGluZywgYW5kIHRoYXQgaXMgaGFuZGxlZCBlbnRpcmVseSBieQotICAgICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gYW5kIG5ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24uICAqLwotICBpZiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGRvZXMgbm90IGhhbmRsZSBwY3JlbF9vZmZzZXQgcmVsb2NhdGlvbnMKLSAgICAgY29ycmVjdGx5IHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBmaWxlLCBzbyBoYW5kbGUgdGhlbQotICAgICBkaXJlY3RseSBoZXJlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBOb3cgZG8gdGhlIFJFTExPIHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuICAqLwotICByZXR1cm4gbWlwc19nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIHNwZWNpYWwgZnVuY3Rpb24gZm9yIHRoZSBNSVBTX1JfU1dJVENIIHJlbG9jLiAgVGhpcwotICAgc3BlY2lhbCByZWxvYyBpcyBub3JtYWxseSBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwgYW5kIG9ubHkKLSAgIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgd2hlbiByZWxheGluZy4gIFdlIGRvbid0IHdhbnQKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gdG8gdGFtcGVyIHdpdGggaXQgYXQgYWxsLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3N3aXRjaF9yZWxvYyAoYWJmZCwKLQkJICAgcmVsb2NfZW50cnksCi0JCSAgIHN5bWJvbCwKLQkJICAgZGF0YSwKLQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwKLQkJICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IG1pcHNfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhBTEY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRldPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9KTVBBRERSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhJOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZMTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfR1BSRUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1BDUkVMMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVMSEk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFTExPOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9TV0lUQ0g7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmbWlwc19ob3d0b190YWJsZVttaXBzX3R5cGVdOwotfQotDAotLyogQSBoZWxwZXIgcm91dGluZSBmb3IgbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoaWNoIGhhbmRsZXMgdGhlIFJFRkhJCi0gICBhbmQgUkVMSEkgcmVsb2NhdGlvbnMuICBUaGUgUkVGSEkgcmVsb2NhdGlvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEKLSAgIFJFRkxPIHJlbG9jYXRpb24gKGFuZCBSRUxISSBieSBhIFJFTExPKSwgYW5kIHRoZSBhZGRlbmQgdXNlZCBpcwotICAgZm9ybWVkIGZyb20gdGhlIGFkZGVuZHMgb2YgYm90aCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19yZWxvY2F0ZV9oaSAocmVmaGksIHJlZmxvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBhZGp1c3QsCi0JCSAgcmVsb2NhdGlvbiwgcGNyZWwpCi0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmaGk7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmbG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzaXplX3QgYWRqdXN0OwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJvb2xlYW4gcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0KLSAgaWYgKHJlZmhpID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJICAgICBjb250ZW50cyArIGFkanVzdCArIHJlZmhpLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLSAgaWYgKHJlZmxvID09IE5VTEwpCi0gICAgdmFsbG8gPSAwOwotICBlbHNlCi0gICAgdmFsbG8gPSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJIGNvbnRlbnRzICsgYWRqdXN0ICsgcmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpCi0JICAgICAmIDB4ZmZmZik7Ci0gCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0gIHZhbCArPSByZWxvY2F0aW9uOwotCi0gIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQgdmFsdWUuCi0gICAgIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMgcmVxdWlyZXMgYW4KLSAgICAgYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZCB0byBtYWtlIHRoaXMKLSAgICAgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UgdG9vayBmcm9tIHRoZSBkYXRhLAotICAgICBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0gIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0gICAgdmFsIC09IDB4MTAwMDA7Ci0KLSAgaWYgKHBjcmVsKQotICAgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgKyAocmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyBhZGp1c3QpKTsKLQotICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLSAgICB2YWwgKz0gMHgxMDAwMDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sCi0JICAgICAgY29udGVudHMgKyBhZGp1c3QgKyByZWZoaS0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgc2VjdGlvbiB3aGlsZSBsaW5raW5nIGEgTUlQUyBFQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgY29udGVudHMsIGV4dGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci17Ci0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb247Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hIGdwOwotICBib29sZWFuIGdwX3VuZGVmaW5lZDsKLSAgc2l6ZV90IGFkanVzdDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYm9vbGVhbiBnb3RfbG87Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBsb19pbnRfcmVsOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyKTsKLQotICAvKiBXZSBrZWVwIGEgdGFibGUgbWFwcGluZyB0aGUgc3ltbmR4IGZvdW5kIGluIGFuIGludGVybmFsIHJlbG9jIHRvCi0gICAgIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBsb29raW5nIHVwIHRoZQotICAgICBzZWN0aW9uIGJ5IG5hbWUgZWFjaCB0aW1lLiAgKi8KLSAgc3ltbmR4X3RvX3NlY3Rpb24gPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbjsKLSAgaWYgKHN5bW5keF90b19zZWN0aW9uID09IChhc2VjdGlvbiAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbiA9ICgoYXNlY3Rpb24gKiopCi0JCQkgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAoTlVNX1JFTE9DX1NFQ1RJT05TCi0JCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgICAgIGlmICghc3ltbmR4X3RvX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX05PTkVdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fVEVYVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIudGV4dCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9SREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9TREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2RhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0JTU10gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2JzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9CU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmJzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9JTklUXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5pbml0Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDhdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDgiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUNF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0NCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9YREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9QREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9GSU5JXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5maW5pIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQUJTXSA9IE5VTEw7Ci0KLSAgICAgIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uID0gc3ltbmR4X3RvX3NlY3Rpb247Ci0gICAgfQotCi0gIHN5bV9oYXNoZXMgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1faGFzaGVzOwotCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMCkKLSAgICBncF91bmRlZmluZWQgPSB0cnVlOwotICBlbHNlCi0gICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0KLSAgZ290X2xvID0gZmFsc2U7Ci0KLSAgYWRqdXN0ID0gMDsKLQotICBpZiAoZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pID09IE5VTEwpCi0gICAgb2Zmc2V0cyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBvZmZzZXRzID0gZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5vZmZzZXRzOwotCi0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIGV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBib29sZWFuIHVzZV9sbyA9IGZhbHNlOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotICAgICAgYXNlY3Rpb24gKnMgPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIGlmICghIGdvdF9sbykKLQltaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGlucHV0X2JmZCwgKFBUUikgZXh0X3JlbCwgJmludF9yZWwpOwotICAgICAgZWxzZQotCXsKLQkgIGludF9yZWwgPSBsb19pbnRfcmVsOwotCSAgZ290X2xvID0gZmFsc2U7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZQotCQkgIDwgc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSk7Ci0KLSAgICAgIC8qIFRoZSBSRUZISSBhbmQgUkVMSEkgcmVsb2NzIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcuICB0aGV5Ci0JIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBSRUZMTyBvciBSRUxMTyByZWxvYywgcmVzcGVjdGl2ZWx5LCBhbmQKLQkgdGhlIGFkZGVuZCBpcyBmb3JtZWQgZnJvbSBib3RoIHJlbG9jcy4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JewotCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpsb19leHRfcmVsOwotCi0JICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIHBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFJFRkhJCi0gICAgICAgICAgICAgb3IgUkVMSEkgcmVsb2NzIGJlZm9yZSB0aGUgUkVGTE8gb3IgUkVMTE8gcmVsb2MuICBUaGlzCi0gICAgICAgICAgICAgcGVybWl0cyBnY2MgdG8gZW1pdCB0aGUgSEkgYW5kIExPIHJlbG9jcyBpdHNlbGYuICAqLwotCSAgZm9yIChsb19leHRfcmVsID0gZXh0X3JlbCArIDE7Ci0JICAgICAgIGxvX2V4dF9yZWwgPCBleHRfcmVsX2VuZDsKLQkgICAgICAgbG9fZXh0X3JlbCsrKQotCSAgICB7Ci0JICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChpbnB1dF9iZmQsIChQVFIpIGxvX2V4dF9yZWwsCi0JCQkJCSZsb19pbnRfcmVsKTsKLQkgICAgICBpZiAobG9faW50X3JlbC5yX3R5cGUgIT0gaW50X3JlbC5yX3R5cGUpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChsb19leHRfcmVsIDwgZXh0X3JlbF9lbmQKLQkgICAgICAmJiAobG9faW50X3JlbC5yX3R5cGUKLQkJICA9PSAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JCSAgICAgID8gTUlQU19SX1JFRkxPCi0JCSAgICAgIDogTUlQU19SX1JFTExPKSkKLQkgICAgICAmJiBpbnRfcmVsLnJfZXh0ZXJuID09IGxvX2ludF9yZWwucl9leHRlcm4KLQkgICAgICAmJiBpbnRfcmVsLnJfc3ltbmR4ID09IGxvX2ludF9yZWwucl9zeW1uZHgpCi0JICAgIHsKLQkgICAgICB1c2VfbG8gPSB0cnVlOwotCSAgICAgIGlmIChsb19leHRfcmVsID09IGV4dF9yZWwgKyAxKQotCQlnb3RfbG8gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBob3d0byA9ICZtaXBzX2hvd3RvX3RhYmxlW2ludF9yZWwucl90eXBlXTsKLQotICAgICAgLyogVGhlIFNXSVRDSCByZWxvYyBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgVGhpcyByZWxvYyBpcwotCSBtYXJrcyB0aGUgbG9jYXRpb24gb2YgYSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvcnRpb25zIG9mIGFuCi0JIG9iamVjdCBmaWxlLiAgVGhlIHN5bWJvbCBpbmRleCBkb2VzIG5vdCByZWZlcmVuY2UgYSBzeW1ib2wsCi0JIGJ1dCBpcyBhY3R1YWxseSB0aGUgb2Zmc2V0IGZyb20gdGhlIHJlbG9jIHRvIHRoZSBzdWJ0cmFoZW5kCi0JIG9mIHRoZSBkaWZmZXJlbmNlLiAgVGhpcyByZWxvYyBpcyBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwKLQkgYW5kIG5lZWRzIG5vIGZ1cnRoZXIgYWRqdXN0bWVudCwgdW5sZXNzIHdlIGFyZSByZWxheGluZy4gIElmCi0JIHdlIGFyZSByZWxheGluZywgd2UgbWF5IGhhdmUgdG8gYWRkIGluIGFuIG9mZnNldC4gIFNpbmNlIG5vCi0JIHN5bWJvbHMgYXJlIGludm9sdmVkIGluIHRoaXMgcmVsb2MsIHdlIGhhbmRsZSBpdCBjb21wbGV0ZWx5Ci0JIGhlcmUuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9TV0lUQ0gpCi0JewotCSAgaWYgKG9mZnNldHMgIT0gTlVMTAotCSAgICAgICYmIG9mZnNldHNbaV0gIT0gMCkKLQkgICAgewotCSAgICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkgIChiZmRfdm1hKSBvZmZzZXRzW2ldLAotCQkJCQkgIChjb250ZW50cwotCQkJCQkgICArIGFkanVzdAotCQkJCQkgICArIGludF9yZWwucl92YWRkcgotCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIEJGRF9BU1NFUlQgKHIgPT0gYmZkX3JlbG9jX29rKTsKLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChpbnRfcmVsLnJfZXh0ZXJuKQotCXsKLQkgIGggPSBzeW1faGFzaGVzW2ludF9yZWwucl9zeW1uZHhdOwotCSAgLyogSWYgaCBpcyBOVUxMLCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IGFuCi0JICAgICBleHRlcm5hbCBzeW1ib2wgd2hpY2ggd2UgdGhvdWdodCB3YXMganVzdCBhIGRlYnVnZ2luZwotCSAgICAgc3ltYm9sLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gICovCi0JICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGludF9yZWwucl9zeW1uZHggPCAwIHx8IGludF9yZWwucl9zeW1uZHggPj0gTlVNX1JFTE9DX1NFQ1RJT05TKQotCSAgICBzID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgcyA9IHN5bW5keF90b19zZWN0aW9uW2ludF9yZWwucl9zeW1uZHhdOwotCi0JICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBUaGUgR1BSRUwgcmVsb2MgdXNlcyBhbiBhZGRlbmQ6IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBHUAotCSB2YWx1ZXMuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9HUFJFTAotCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX0xJVEVSQUwpCi0JYWRkZW5kID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZ3BfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAgICAgKGluZm8sIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBHUCBub3QgZGVmaW5lZCIpLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KLQkgICAgICBncCA9IDQ7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkgICAgICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCEgaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhlIGN1cnJlbnQKLQkJIGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkgSU5QVVRfU0VDVElPTi0+dm1hIGFuZCB0aGUgR1AgdmFsdWUgb2YgSU5QVVRfQkZELiAgV2UKLQkJIG11c3QgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkJIGZpbmFsIGRlZmluaXRpb24gKHdoaWNoIHdpbGwgZW5kIHVwIGluIFJFTE9DQVRJT04pCi0JCSBhbmQgdGhlIEdQIHZhbHVlIG9mIE9VVFBVVF9CRkQgKHdoaWNoIGlzIGluIEdQKS4gICovCi0JICAgICAgYWRkZW5kID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AgLSBncDsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sLiAgVGhlCi0JCSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgc2ltcGx5IHRoZQotCQkgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseSB6ZXJvKS4gIFdlCi0JCSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoaXMgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0JCSBkZWZpbmVkIHN5bWJvbCwgc28gd2Ugd2FudCB0aGUgaW5zdHJ1Y3Rpb24gdG8gaG9sZAotCQkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmluYWwgZGVmaW5pdGlvbiBvZiB0aGUKLQkJIHN5bWJvbCAod2hpY2ggd2lsbCBlbmQgdXAgaW4gUkVMT0NBVElPTikgYW5kIHRoZSBHUAotCQkgdmFsdWUgb2YgT1VUUFVUX0JGRCAod2hpY2ggaXMgaW4gR1ApLiAgKi8KLQkgICAgICBhZGRlbmQgPSAtIGdwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIHVuZGVmaW5lZCBvciBjb21tb24KLQkJIHN5bWJvbC4gIFRoZSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMKLQkJIHNpbXBseSB0aGUgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseQotCQkgemVybykuICBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2UKLQkJIGFyZW4ndCBnb2luZyB0byBkZWZpbmUgdGhpcyBzeW1ib2wsIHNvIHdlIGp1c3QgbGVhdmUKLQkJIHRoZSBpbnN0cnVjdGlvbiBhbG9uZS4gICovCi0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBtaXBzX3JlbGF4X3NlY3Rpb24gbWF5IGhhdmUgc2V0Ci0JIG9mZnNldHNbaV0gdG8gc29tZSB2YWx1ZS4gIEEgdmFsdWUgb2YgMSBtZWFucyB3ZSBtdXN0IGV4cGFuZAotCSBhIFBDIHJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gb2Ygc2VxdWVuY2UsCi0JIGFuZCBhbnkgb3RoZXIgdmFsdWUgaXMgYW4gYWRkZW5kLiAgKi8KLSAgICAgIGlmIChvZmZzZXRzICE9IE5VTEwKLQkgICYmIG9mZnNldHNbaV0gIT0gMCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0JICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUENSRUwxNgotCQkgICAgICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkKLQkJICAgICAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgIGlmIChvZmZzZXRzW2ldICE9IDEpCi0JICAgIGFkZGVuZCArPSBvZmZzZXRzW2ldOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgKmhlcmU7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfZXh0ZXJuCi0JCQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIE1vdmUgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyB1cC4gICovCi0JICAgICAgaGVyZSA9IChjb250ZW50cwotCQkgICAgICArIGFkanVzdAotCQkgICAgICArIGludF9yZWwucl92YWRkcgotCQkgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgbWVtbW92ZSAoaGVyZSArIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQsIGhlcmUsCi0JCSAgICAgICAoc2l6ZV90KSAoaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplCi0JCQkJIC0gKGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKTsKLQkJICAgICAgIAotCSAgICAgIC8qIEdlbmVyYXRlIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgICBpZiAoISBtaXBzX3JlbGF4X3BjcmVsMTYgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJaCwgaGVyZSwKLQkJCQkJKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJCQkgKyAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkKLQkJCQkJICsgYWRqdXN0KSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIFdlIG11c3QgYWRqdXN0IGV2ZXJ5dGhpbmcgZWxzZSB1cCBhIG5vdGNoLiAgKi8KLQkgICAgICBhZGp1c3QgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotCSAgICAgIC8qIG1pcHNfcmVsYXhfcGNyZWwxNiBoYW5kbGVzIGFsbCB0aGUgZGV0YWlscyBvZiB0aGlzCi0JCSByZWxvY2F0aW9uLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIC50ZXh0Ci0JIHNlZ21lbnQsIHdlIG1heSBuZWVkIHRvIGFkanVzdCBpdCBpZiBzb21lIGJyYW5jaGVzIGhhdmUgYmVlbgotCSBleHBhbmRlZC4gIFRoZSByZWxvYyB0eXBlcyB3aGljaCBhcmUgbGlrZWx5IHRvIG9jY3VyIGluIHRoZQotCSAudGV4dCBzZWN0aW9uIGFyZSBoYW5kbGVkIGVmZmljaWVudGx5IGJ5IG1pcHNfcmVsYXhfc2VjdGlvbiwKLQkgYW5kIHRodXMgZG8gbm90IG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlLiAgKi8KLSAgICAgIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdCAhPSBOVUxMCi0JICAmJiAhIGludF9yZWwucl9leHRlcm4KLQkgICYmIGludF9yZWwucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9URVhUCi0JICAmJiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkJICAgICAgIi50ZXh0IikgIT0gMAotCSAgICAgIHx8IChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUENSRUwxNgotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9TV0lUQ0gKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMSEkKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMTE8pKSkKLQl7Ci0JICBiZmRfdm1hIGFkcjsKLQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmE7Ci0KLQkgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBhZGRlbmQgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgd2UgbmVlZAotCSAgICAgdG8gYWRqdXN0IHRoZSBhZGRyZXNzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZXT1JEKTsKLQotCSAgYWRyID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJICAgIChjb250ZW50cwotCQkJICAgICArIGFkanVzdAotCQkJICAgICArIGludF9yZWwucl92YWRkcgotCQkJICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCi0JICBmb3IgKGEgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdDsKLQkgICAgICAgYSAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMOwotCSAgICAgICBhID0gYS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChhZHIgPj0gYS0+c3RhcnQgJiYgYWRyIDwgYS0+ZW5kKQotCQlhZGRlbmQgKz0gYS0+YWRqdXN0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCBtdXN0IGNvbnZlcnQKLQkgICAgIHRoZSBleGlzdGluZyByZWxvYy4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIG91dHB1dC4gIENvbnZlcnQKLQkJICAgICB0aGUgcmVsb2MgZnJvbSBiZWluZyBhZ2FpbnN0IHRoZSBzeW1ib2wgdG8gYmVpbmcKLQkJICAgICBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQotCQkgIC8qIENsZWFyIHRoZSByX2V4dGVybiBiaXQuICAqLwotCQkgIGludF9yZWwucl9leHRlcm4gPSAwOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX3N5bW5keCB2YWx1ZS4gICovCi0JCSAgcyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0KLQkJICBpbnRfcmVsLnJfc3ltbmR4ID0gLTE7Ci0JCSAgc3dpdGNoIChuYW1lWzFdKQotCQkgICAgewotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2knOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdsJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncyc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NCU1M7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAgICAgCi0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIC8qIEFkZCB0aGUgc2VjdGlvbiBWTUEgYW5kIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgcy0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAvKiBGb3IgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLCB0aGUgb2JqZWN0IGZpbGUKLQkJICAgICBjdXJyZW50bHkgaG9sZHMganVzdCB0aGUgYWRkZW5kLiAgV2UgbXVzdCBhZGp1c3QKLQkJICAgICBieSB0aGUgYWRkcmVzcyB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlLiAgKi8KLQkJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgewotCQkgICAgICByZWxvY2F0aW9uIC09IGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotCQkgICAgICAvKiBJZiB3ZSBhcmUgY29udmVydGluZyBhIFJFTEhJIG9yIFJFTExPIHJlbG9jCi0JCQkgZnJvbSBiZWluZyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB0bwotCQkJIGJlaW5nIGFnYWluc3QgYSBzZWN0aW9uLCB3ZSBtdXN0IHB1dCBhCi0JCQkgc3BlY2lhbCB2YWx1ZSBpbnRvIHRoZSByX29mZnNldCBmaWVsZC4gIFRoaXMKLQkJCSB2YWx1ZSBpcyB0aGUgb2xkIGFkZGVuZC4gIFRoZSByX29mZnNldCBmb3IKLQkJCSBib3RoIHRoZSBSRUxISSBhbmQgUkVMTE8gcmVsb2NzIGFyZSB0aGUgc2FtZSwKLQkJCSBhbmQgd2Ugc2V0IGJvdGggd2hlbiB3ZSBzZWUgUkVMSEkuICAqLwotCQkgICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCQkJewotCQkJICBsb25nIGFkZGhpLCBhZGRsbzsKLQotCQkJICBhZGRoaSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgKGNvbnRlbnRzCi0JCQkJCSAgICAgICArIGFkanVzdAotCQkJCQkgICAgICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJCQkJICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7Ci0JCQkgIGFkZGhpICY9IDB4ZmZmZjsKLQkJCSAgaWYgKGFkZGhpICYgMHg4MDAwKQotCQkJICAgIGFkZGhpIC09IDB4MTAwMDA7Ci0JCQkgIGFkZGhpIDw8PSAxNjsKLQotCQkJICBpZiAoISB1c2VfbG8pCi0JCQkgICAgYWRkbG8gPSAwOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCQkgIChjb250ZW50cwotCQkJCQkJICAgKyBhZGp1c3QKLQkJCQkJCSAgICsgbG9faW50X3JlbC5yX3ZhZGRyCi0JCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCQkJICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCQkJICAgICAgaWYgKGFkZGxvICYgMHg4MDAwKQotCQkJCWFkZGxvIC09IDB4MTAwMDA7Ci0KLQkJCSAgICAgIGxvX2ludF9yZWwucl9vZmZzZXQgPSBhZGRoaSArIGFkZGxvOwotCQkJICAgIH0KLQotCQkJICBpbnRfcmVsLnJfb2Zmc2V0ID0gYWRkaGkgKyBhZGRsbzsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGggPSBOVUxMOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2hhbmdlIHRoZSBzeW1uZHggdmFsdWUgdG8gdGhlIHJpZ2h0IG9uZSBmb3IgdGhlCi0JCSAgICAgb3V0cHV0IEJGRC4gICovCi0JCSAgaW50X3JlbC5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaW50X3JlbC5yX3N5bW5keCA9IDA7Ci0JCSAgICB9Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBBZGp1c3QgdGhlCi0JCSB2YWx1ZSBieSB0aGUgYW1vdW50IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkgICAgICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHMtPnZtYSk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiArPSBhZGRlbmQ7Ci0JICBhZGRlbmQgPSAwOwotCi0JICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UKLQkgICAgIHRvIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBzZWN0aW9uIGFuZCBpbmNsdWRpbmcgdGhlCi0JICAgICByZWZlcmVuY2UgdG8gdGhlIG5ldyBhZGRyZXNzLiAgSG93ZXZlciwgZXh0ZXJuYWwgUkVMSEkKLQkgICAgIGFuZCBSRUxMTyByZWxvY3MgYXJlIFBDIHJlbGF0aXZlLCBidXQgZG9uJ3QgaW5jbHVkZSBhbnkKLQkgICAgIHJlZmVyZW5jZSB0byB0aGUgYWRkcmVzcy4gIFRoZSBhZGRlbmQgaXMgbWVyZWx5IGFuCi0JICAgICBhZGRlbmQuICAqLwotCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZQotCSAgICAgICYmICghIGludF9yZWwucl9leHRlcm4KLQkJICB8fCAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJCi0JCSAgICAgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxMTykpKQotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgLyogQWRqdXN0IHRoZSBjb250ZW50cy4gICovCi0JICBpZiAocmVsb2NhdGlvbiA9PSAwKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUZISQotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSkKLQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCSAgICAoY29udGVudHMKLQkJCQkJICAgICArIGFkanVzdAotCQkJCQkgICAgICsgaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQkgICAgdXNlX2xvID8gJmxvX2ludF9yZWwgOiBOVUxMLAotCQkJCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgICBhZGp1c3QsIHJlbG9jYXRpb24sCi0JCQkJICAgIGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSk7Ci0JCSAgciA9IGJmZF9yZWxvY19vazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzcy4gICovCi0JICBpbnRfcmVsLnJfdmFkZHIgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAvKiBTYXZlIHRoZSBjaGFuZ2VkIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGlucHV0X2JmZCwgJmludF9yZWwsIChQVFIpIGV4dF9yZWwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhcmUgcHJvZHVjaW5nIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBhc2VjdGlvbiAqaHNlYzsKLQotCQkgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsIHRydWUpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uICAqLwotCSAgICAgIHJlbG9jYXRpb24gPSAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgcy0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gcy0+dm1hKTsKLQotCSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaXMgYWxyZWFkeSBjb3JyZWN0IGluIHRoZSBvYmplY3QKLQkJIGZpbGUuICBNYWtlIGl0IGxvb2sgbGlrZSBhIHBjcmVsX29mZnNldCByZWxvY2F0aW9uIGJ5Ci0JCSBhZGRpbmcgaW4gdGhlIHN0YXJ0IGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0JCXsKLQkJICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJIHx8ICEgdXNlX2xvKQotCQkgICAgcmVsb2NhdGlvbiArPSBpbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCSAgZWxzZQotCQkgICAgcmVsb2NhdGlvbiArPSBsb19pbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRkhJCi0JICAgICAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJKQotCSAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsCi0JCQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICBjb250ZW50cywKLQkJCQkJICAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSAgICsgYWRqdXN0KSwKLQkJCQkJICByZWxvY2F0aW9uLAotCQkJCQkgIGFkZGVuZCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQl1c2VfbG8gPyAmbG9faW50X3JlbCA6IE5VTEwsCi0JCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRqdXN0LAotCQkJCXJlbG9jYXRpb24sCi0JCQkJaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBNSVBTX1JfSk1QQUREUiByZXF1aXJlcyBwZWN1bGlhciBvdmVyZmxvdyBkZXRlY3Rpb24uICBUaGUKLQkgaW5zdHJ1Y3Rpb24gcHJvdmlkZXMgYSAyOCBiaXQgYWRkcmVzcyAodGhlIHR3byBsb3dlciBiaXRzIGFyZQotCSBpbXBsaWNpdCB6ZXJvZXMpIHdoaWNoIGlzIGNvbWJpbmVkIHdpdGggdGhlIHVwcGVyIGZvdXIgYml0cwotCSBvZiB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4gICovCi0gICAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2sKLQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9KTVBBRERSCi0JICAmJiAoKChyZWxvY2F0aW9uCi0JCSsgYWRkZW5kCi0JCSsgKGludF9yZWwucl9leHRlcm4gPyAwIDogcy0+dm1hKSkKLQkgICAgICAgJiAweGYwMDAwMDAwKQotCSAgICAgICE9ICgoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKQotCQkgICArIGFkanVzdCkKLQkJICAmIDB4ZjAwMDAwMDApKSkKLQlyID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaW50X3JlbC5yX2V4dGVybikKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCWludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCBpbiB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICpzZWN0aW9uX3RkYXRhOwotCi0gIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gIGlmIChzZWN0aW9uX3RkYXRhID09IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgICBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+b2Zmc2V0cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jc19zaXplOwotCi0gICAgICBleHRlcm5hbF9yZWxvY3Nfc2l6ZSA9IChlY29mZl9iYWNrZW5kIChhYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZQotCQkJICAgICAgKiBzZWMtPnJlbG9jX2NvdW50KTsKLQotICAgICAgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID0KLQkoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGV4dGVybmFsX3JlbG9jc19zaXplKTsKLSAgICAgIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBleHRlcm5hbF9yZWxvY3Nfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MsIDEsCi0JCQlleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgYWJmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsYXggYSBzZWN0aW9uIHdoZW4gbGlua2luZyBhIE1JUFMgRUNPRkYgZmlsZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGVtYmVkZGVkIFBJQyBjb2RlLCB3aGljaCBhbHdheXMgdXNlcyBQQyByZWxhdGl2ZSBicmFuY2hlcyB3aGljaAotICAgb25seSBoYXZlIGFuIDE4IGJpdCByYW5nZSBvbiBNSVBTLiAgSWYgYSBicmFuY2ggaXMgbm90IGluIHJhbmdlLCB3ZQotICAgZ2VuZXJhdGUgYSBsb25nIGluc3RydWN0aW9uIHNlcXVlbmNlIHRvIGNvbXBlbnNhdGUuICBFYWNoIHRpbWUgd2UKLSAgIGZpbmQgYSBicmFuY2ggdG8gZXhwYW5kLCB3ZSBoYXZlIHRvIGNoZWNrIGFsbCB0aGUgb3RoZXJzIGFnYWluIHRvCi0gICBtYWtlIHN1cmUgdGhleSBhcmUgc3RpbGwgaW4gcmFuZ2UuICBUaGlzIGlzIHNsb3csIGJ1dCBpdCBvbmx5IGhhcwotICAgdG8gYmUgZG9uZSB3aGVuIC1yZWxheCBpcyBwYXNzZWQgdG8gdGhlIGxpbmtlci4KLQotICAgVGhpcyByb3V0aW5lIGZpZ3VyZXMgb3V0IHdoaWNoIGJyYW5jaGVzIG5lZWQgdG8gZXhwYW5kOyB0aGUgYWN0dWFsCi0gICBleHBhbnNpb24gaXMgZG9uZSBpbiBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gd2hlbiB0aGUgc2VjdGlvbgotICAgY29udGVudHMgYXJlIHJlbG9jYXRlZC4gIFRoZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIG9mZnNldHMKLSAgIGZpZWxkIG9mIHRoZSBlY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gIEFuIG9mZnNldCBvZiAxIG1lYW5zCi0gICB0aGF0IHRoZSBicmFuY2ggbXVzdCBiZSBleHBhbmRlZCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gUEMKLSAgIHJlbGF0aXZlIGJyYW5jaCAoc3VjaCBhbiBvZmZzZXQgd2lsbCBvbmx5IG9jY3VyIGZvciBhIFBDIHJlbGF0aXZlCi0gICBicmFuY2ggdG8gYW4gZXh0ZXJuYWwgc3ltYm9sKS4gIEFueSBvdGhlciBvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlCi0gICBvZiBmb3VyLCBhbmQgaXMgdGhlIGFtb3VudCB0byBjaGFuZ2UgdGhlIGJyYW5jaCBieSAoc3VjaCBhbiBvZmZzZXQKLSAgIHdpbGwgb25seSBvY2N1ciBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2ggd2l0aGluIHRoZSBzYW1lIHNlY3Rpb24pLgotCi0gICBXZSBkbyBub3QgbW9kaWZ5IHRoZSBzZWN0aW9uIHJlbG9jcyBvciBjb250ZW50cyB0aGVtc2VsdmVzIHNvIHRoYXQKLSAgIGlmIG1lbW9yeSB1c2FnZSBiZWNvbWVzIGFuIGlzc3VlIHdlIGNhbiBkaXNjYXJkIHRoZW0gYW5kIHJlYWQgdGhlbQotICAgYWdhaW4uICBUaGUgb25seSBpbmZvcm1hdGlvbiB3ZSBtdXN0IHNhdmUgaW4gbWVtb3J5IGJldHdlZW4gdGhpcwotICAgcm91dGluZSBhbmQgdGhlIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lIGlzIHRoZSB0YWJsZSBvZgotICAgb2Zmc2V0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBBc3N1bWUgd2UgYXJlIG5vdCBnb2luZyB0byBuZWVkIGFub3RoZXIgcGFzcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIElmIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBhbiBFQ09GRiBmaWxlLCB0aGlzIGlzIG11Y2ggdG9vCi0gICAgIGNvbmZ1c2luZyB0byBkZWFsIHdpdGguICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWxvY3MsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gUEMgcmVsYXRpdmUgcmVsb2NzLCBhbmQgd2h5IHdvdWxkIHRoZXJlCi0gICAgIGV2ZXIgYmUgb25lIGZyb20gYW55dGhpbmcgYnV0IHRoZSAudGV4dCBzZWN0aW9uPyAgKi8KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIudGV4dCIpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZ290IHRoZW0uICAqLwotICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICBpZiAoc2VjdGlvbl90ZGF0YSA9PSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgfQotCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdlIG11c3QgaW5pdGlhbGl6ZSBfY29va2VkX3NpemUgb25seSB0aGUgZmlyc3QgdGltZSB3ZSBhcmUKLQkgY2FsbGVkLiAgKi8KLSAgICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotCi0gIGNvbnRlbnRzID0gc2VjdGlvbl90ZGF0YS0+Y29udGVudHM7Ci0gIG9mZnNldHMgPSBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzOwotCi0gIC8qIExvb2sgZm9yIGFueSBleHRlcm5hbCBQQyByZWxhdGl2ZSByZWxvY3MuICBJbnRlcm5hbCBQQyByZWxhdGl2ZQotICAgICByZWxvY3MgYXJlIGFscmVhZHkgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsIHNvIHRoZXkgY2VydGFpbmx5Ci0gICAgIGNhbiBub3Qgb3ZlcmZsb3cuICAqLwotICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7Ci0gIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jICphZGpfZXh0X3JlbDsKLSAgICAgIHVuc2lnbmVkIGludCBhZGpfaTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZXh0X2NvdW50OwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKmFkal9oX3B0cjsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiphZGpfaF9wdHJfZW5kOwotICAgICAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZXhwYW5kZWQgdGhpcyByZWxvYywgd2UgY2VydGFpbmx5IGRvbid0Ci0JIG5lZWQgdG8gZG8gaXQgYWdhaW4uICAqLwotICAgICAgaWYgKG9mZnNldHMgIT0gKGxvbmcgKikgTlVMTCAmJiBvZmZzZXRzW2ldID09IDEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFF1aWNrbHkgY2hlY2sgdGhhdCB0aGlzIHJlbG9jIGlzIGV4dGVybmFsIFBDUkVMMTYuICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgaWYgKChleHRfcmVsLT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fQklHKSA9PSAwCi0JICAgICAgfHwgKCgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCi0JCSAgID4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHKQotCQkgICE9IE1JUFNfUl9QQ1JFTDE2KSkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRSkgPT0gMAotCSAgICAgIHx8ICgoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQotCQkgICA+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRSkKLQkJICAhPSBNSVBTX1JfUENSRUwxNikpCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoUFRSKSBleHRfcmVsLCAmaW50X3JlbCk7Ci0KLSAgICAgIGggPSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlc1tpbnRfcmVsLnJfc3ltbmR4XTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgIC8qIEp1c3QgaWdub3JlIHVuZGVmaW5lZCBzeW1ib2xzLiAgVGhlc2Ugd2lsbCBwcmVzdW1hYmx5Ci0JICAgICBnZW5lcmF0ZSBhbiBlcnJvciBsYXRlciBpbiB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0KLSAgICAgIC8qIFN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBhZGRyZXNzLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpKTsKLQotICAgICAgLyogVGhlIGFkZGVuZCBpcyBzdG9yZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gdGhlIG5vcm1hbCBjYXNlCi0JIG9mIGBgYmFsIHN5bWJvbCcnLCB0aGUgYWRkZW5kIHdpbGwgYmUgLTQuICBJdCB3aWxsIG9ubHkgYmUKLQkgZGlmZmVyZW50IGluIHRoZSBjYXNlIG9mIGBgYmFsIHN5bWJvbCtjb25zdGFudCcnLiAgVG8gYXZvaWQKLQkgYWx3YXlzIHJlYWRpbmcgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIHdlIGRvbid0IGNoZWNrIHRoZQotCSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlICh3ZSBjb3VsZCBlYXNpbHkgY2hlY2sgdGhlIGNvbnRlbnRzCi0JIGlmIHdlIGhhcHBlbiB0byBoYXZlIGFscmVhZHkgcmVhZCB0aGVtIGluLCBidXQgSSBmZWFyIHRoYXQKLQkgdGhpcyBjb3VsZCBiZSBjb25mdXNpbmcpLiAgVGhpcyBtZWFucyB3ZSB3aWxsIHNjcmV3IHVwIGlmCi0JIHRoZXJlIGlzIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgaW4gcmFuZ2UsIGJ1dCBhZGRlZCB0bwotCSBhIGNvbnN0YW50IHdoaWNoIHB1dHMgaXQgb3V0IG9mIHJhbmdlOyBpbiBzdWNoIGEgY2FzZSB0aGUKLQkgbGluayB3aWxsIGZhaWwgd2l0aCBhIHJlbG9jIG92ZXJmbG93IGVycm9yLiAgU2luY2UgdGhlCi0JIGNvbXBpbGVyIHdpbGwgbmV2ZXIgZ2VuZXJhdGUgc3VjaCBjb2RlLCBpdCBzaG91bGQgYmUgZWFzeQotCSBlbm91Z2ggdG8gd29yayBhcm91bmQgaXQgYnkgY2hhbmdpbmcgdGhlIGFzc2VtYmx5IGNvZGUgaW4gdGhlCi0JIHNvdXJjZSBmaWxlLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gNDsKLQotICAgICAgLyogTm93IFJFTE9DQVRJT04gaXMgdGhlIG51bWJlciB3ZSB3YW50IHRvIHB1dCBpbiB0aGUgb2JqZWN0Ci0JIGZpbGUuICBTZWUgd2hldGhlciBpdCBmaXRzLiAgKi8KLSAgICAgIGlmIChyZWxvY2F0aW9uID49IC0weDIwMDAwICYmIHJlbG9jYXRpb24gPCAweDIwMDAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgcmVsb2MgbmVlZHMgd29yaywgd2hpY2ggd2lsbCByYXJlbHkKLQkgaGFwcGVuLCBnbyBhaGVhZCBhbmQgZ3JhYiB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JewotCSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNlYy0+X3Jhd19zaXplKTsKLQkgIGVsc2UKLQkgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc2VjLT5fcmF3X3NpemUpOwotCSAgaWYgKGNvbnRlbnRzID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCAoUFRSKSBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0JICAgIHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotCi0gICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgY2hhbmdpbmcgdGhlIGJhbCBpbnN0cnVjdGlvbi4gIEl0IHdvdWxkIGJlCi0JIHBvc3NpYmxlIHRvIGhhbmRsZSBvdGhlciBQQyByZWxhdGl2ZSBicmFuY2hlcywgYnV0IHNvbWUgb2YKLQkgdGhlbSAodGhlIGNvbmRpdGlvbmFsIGJyYW5jaGVzKSB3b3VsZCByZXF1aXJlIGEgZGlmZmVyZW50Ci0JIGxlbmd0aCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB3aGljaCB3b3VsZCBjb21wbGljYXRlIGJvdGggdGhpcwotCSByb3V0aW5lIGFuZCBtaXBzX3JlbGF4X3BjcmVsMTYuICBJdCBjb3VsZCBiZSB3cml0dGVuIGlmCi0JIHNvbWVib2R5IGZlbHQgaXQgd2VyZSBpbXBvcnRhbnQuICBJZ25vcmluZyB0aGlzIHJlbG9jIHdpbGwKLQkgcHJlc3VtYWJseSBjYXVzZSBhIHJlbG9jIG92ZXJmbG93IGVycm9yIGxhdGVyIG9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIGludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKQotCSAgIT0gMHgwNDExZmZmZikgLyogYmdlemFsICQwLC4gPT0gYmFsIC4gKi8KLQljb250aW51ZTsKLQotICAgICAgLyogQm90aGVyLiAgV2UgbmVlZCB0byBleHBhbmQgdGhpcyByZWxvYywgYW5kIHdlIHdpbGwgbmVlZCB0bwotCSBtYWtlIGFub3RoZXIgcmVsYXhhdGlvbiBwYXNzIHNpbmNlIHRoaXMgY2hhbmdlIG1heSBwdXQgb3RoZXIKLQkgcmVsb2NzIG91dCBvZiByYW5nZS4gIFdlIG5lZWQgdG8gZXhhbWluZSB0aGUgbG9jYWwgYnJhbmNoZXMKLQkgYW5kIHdlIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIG9mZnNldHMgd2UgbXVzdAotCSBhZGQgdG8gdGhlbS4gIFdlIGFsc28gbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlcyBvZiBhbGwKLQkgc3ltYm9scyBpbiB0aGUgb2JqZWN0IGZpbGUgZm9sbG93aW5nIHRoaXMgbG9jYXRpb24uICAqLwotCi0gICAgICBzZWMtPl9jb29rZWRfc2l6ZSArPSBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UOwotICAgICAgKmFnYWluID0gdHJ1ZTsKLQotICAgICAgaWYgKG9mZnNldHMgPT0gKGxvbmcgKikgTlVMTCkKLQl7Ci0JICBzaXplX3Qgc2l6ZTsKLQotCSAgc2l6ZSA9IHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGxvbmcpOwotCSAgb2Zmc2V0cyA9IChsb25nICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JICBpZiAob2Zmc2V0cyA9PSAobG9uZyAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG1lbXNldCAob2Zmc2V0cywgMCwgc2l6ZSk7Ci0JICBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzID0gb2Zmc2V0czsKLQl9Ci0KLSAgICAgIG9mZnNldHNbaV0gPSAxOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIFBDIHJlbGF0aXZlIHJlZmVyZW5jZXMgdGhhdCBjcm9zcyB0aGlzIHJlbG9jCi0JIGFuZCBhZGp1c3QgdGhlaXIgb2Zmc2V0cy4gICovCi0gICAgICBhZGpfZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yIChhZGpfaSA9IDA7IGFkal9leHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGFkal9leHRfcmVsKyssIGFkal9pKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jIGFkal9pbnRfcmVsOwotCSAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQkgIGludCBjaGFuZ2U7Ci0KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgYWRqX2V4dF9yZWwsICZhZGpfaW50X3JlbCk7Ci0KLQkgIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1BDUkVMMTYpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgbG9jYWwgcmVmZXJlbmNlcy4gIEV4dGVybmFsIG9uZXMKLQkJIHdpbGwgYmUgcmVsb2NhdGVkIGNvcnJlY3RseSBhbnlob3cuICAqLwotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2l0aGluCi0JCSB0aGlzIHNlY3Rpb24uICBGSVhNRTogQ3Jvc3Mgc2VjdGlvbiBQQyByZWxhdGl2ZQotCQkgcmVsb2NzIG1heSBub3QgYmUgaGFuZGxlZCBjb3JyZWN0bHk7IGRvZXMgYW55Ym9keQotCQkgY2FyZT8gICovCi0JICAgICAgaWYgKGFkal9pbnRfcmVsLnJfc3ltbmR4ICE9IFJFTE9DX1NFQ1RJT05fVEVYVCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHI7Ci0KLQkgICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwKLQkJCQkgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCi0JICAgICAgc3RvcCA9IChpbnNuICYgMHhmZmZmKSA8PCAyOwotCSAgICAgIGlmICgoc3RvcCAmIDB4MjAwMDApICE9IDApCi0JCXN0b3AgLT0gMHg0MDAwMDsKLQkgICAgICBzdG9wICs9IGFkal9pbnRfcmVsLnJfdmFkZHIgKyA0OwotCSAgICB9Ci0JICBlbHNlIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIHJlbGxvOwotCSAgICAgIGxvbmcgYWRkaGksIGFkZGxvOwotCi0JICAgICAgLyogVGhlIG5leHQgcmVsb2MgbXVzdCBiZSBNSVBTX1JfUkVMTE8sIGFuZCB3ZSBoYW5kbGUKLQkJIHRoZW0gdG9nZXRoZXIuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKGFkal9leHRfcmVsICsgMSA8IGV4dF9yZWxfZW5kKTsKLQotCSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgKGFkal9leHRfcmVsICsgMSksICZyZWxsbyk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChyZWxsby5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgICAgICAKLQkgICAgICBhZGRoaSA9IGJmZF9nZXRfMzIgKGFiZmQsCi0JCQkJICAgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCSAgICAgIGFkZGhpICY9IDB4ZmZmZjsKLQkgICAgICBpZiAoYWRkaGkgJiAweDgwMDApCi0JCWFkZGhpIC09IDB4MTAwMDA7Ci0JICAgICAgYWRkaGkgPDw9IDE2OwotCi0JICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHJlbGxvLnJfdmFkZHIgLSBzZWMtPnZtYSk7Ci0JICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCSAgICAgIGlmIChhZGRsbyAmIDB4ODAwMCkKLQkJYWRkbG8gLT0gMHgxMDAwMDsKLQotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJewotCQkgIC8qIFRoZSB2YWx1ZSB3ZSB3YW50IGhlcmUgaXMKLQkJICAgICAgIHN5bSAtIFJFTExPYWRkciArIGFkZGVuZAotCQkgICAgIHdoaWNoIHdlIGNhbiBleHByZXNzIGFzCi0JCSAgICAgICBzeW0gLSAoUkVMTE9hZGRyIC0gYWRkZW5kKQotCQkgICAgIFRoZXJlZm9yZSBpZiB3ZSBhcmUgZXhwYW5kaW5nIHRoZSBhcmVhIGJldHdlZW4KLQkJICAgICBSRUxMT2FkZHIgYW5kIFJFTExPYWRkciAtIGFkZGVuZCB3ZSBtdXN0IGFkanVzdAotCQkgICAgIHRoZSBhZGRlbmQuICBUaGlzIGlzIGFkbWl0dGVkbHkgYW1iaWd1b3VzLCBzaW5jZQotCQkgICAgIHdlIG1pZ2h0IG1lYW4gKHN5bSArIGFkZGVuZCkgLSBSRUxMT2FkZHIsIGJ1dCBpbgotCQkgICAgIHByYWN0aWNlIHdlIGRvbid0LCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZQotCQkgICAgIHRoYXQgY2FzZSBjb3JyZWN0bHkgc2luY2UgYXQgdGhpcyBwb2ludCB3ZSBoYXZlCi0JCSAgICAgbm8gaWRlYSB3aGV0aGVyIGFueSByZWxvYyBpcyBiZWluZyBleHBhbmRlZAotCQkgICAgIGJldHdlZW4gc3ltIGFuZCBzeW0gKyBhZGRlbmQuICAqLwotCQkgIHN0YXJ0ID0gcmVsbG8ucl92YWRkciAtIChhZGRoaSArIGFkZGxvKTsKLQkJICBzdG9wID0gcmVsbG8ucl92YWRkcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEFuIGludGVybmFsIFJFTEhJL1JFTExPIHBhaXIgcmVwcmVzZW50cyB0aGUKLQkJICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFkZHJlc3NlcywgJExDMCAtIGZvby4KLQkJICAgICBUaGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IHRoZSBkaWZmZXJlbmNlCi0JCSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgJExDMC4gIFRoaXMgbGV0cyB1cwotCQkgICAgIGNvbXB1dGUgJExDMCwgYW5kLCBieSBjb25zaWRlcmluZyB0aGUgYWRkZW5kLAotCQkgICAgIGZvby4gIElmIHRoZSByZWxvYyB3ZSBhcmUgZXhwYW5kaW5nIGZhbGxzIGJldHdlZW4KLQkJICAgICB0aG9zZSB0d28gcmVsb2NzLCB3ZSBtdXN0IGFkanVzdCB0aGUgYWRkZW5kLiAgQXQKLQkJICAgICB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGluIHRoZQotCQkgICAgIHJfb2Zmc2V0IGZpZWxkLCB3aGVyZSBpdCB3YXMgcHV0IGJ5Ci0JCSAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkJICBzdGFydCA9IHJlbGxvLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkJICBzdG9wID0gc3RhcnQgKyBhZGRoaSArIGFkZGxvOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfU1dJVENIKQotCSAgICB7Ci0JICAgICAgLyogQSBNSVBTX1JfU1dJVENIIHJlbG9jIHJlcHJlc2VudHMgYSB3b3JkIG9mIHRoZSBmb3JtCi0JCSAgIC53b3JkICRMMy0kTFMxMgotCQkgVGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZSBpcyBjb3JyZWN0LCBhc3N1bWluZyB0aGUKLQkJIG9yaWdpbmFsIHZhbHVlIG9mICRMMy4gIFRoZSBzeW1uZHggdmFsdWUgaXMgYWN0dWFsbHkKLQkJIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kICRMUzEyLgotCQkgVGhpcyBsZXRzIHVzIGNvbXB1dGUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMUzEyIGFzCi0JCSAgIHZhZGRyIC0gc3ltbmR4Ci0JCSBhbmQgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMyBhcwotCQkgICB2YWRkciAtIHN5bW5keCArIGFkZGVuZAotCQkgd2hlcmUgYWRkZW5kIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4gIEF0Ci0JCSB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGZvdW5kIGluIHRoZQotCQkgcl9vZmZzZXQgZmllbGQsIHNpbmNlIGl0IHdhcyBtb3ZlZCBieQotCQkgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkgICAgICBzdG9wID0gc3RhcnQgKyBiZmRfZ2V0XzMyIChhYmZkLAotCQkJCQkgKGNvbnRlbnRzCi0JCQkJCSAgKyBhZGpfaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgLSBzZWMtPnZtYSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGUgcmFuZ2UgZXhwcmVzc2VkIGJ5IHRoaXMgcmVsb2MsIHdoaWNoIGlzIHRoZQotCSAgICAgZGlzdGFuY2UgYmV0d2VlbiBTVEFSVCBhbmQgU1RPUCBjcm9zc2VzIHRoZSByZWxvYyB3ZSBhcmUKLQkgICAgIGV4cGFuZGluZywgd2UgbXVzdCBhZGp1c3QgdGhlIG9mZnNldC4gIFRoZSBzaWduIG9mIHRoZQotCSAgICAgYWRqdXN0bWVudCBkZXBlbmRzIHVwb24gdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgcmFuZ2UKLQkgICAgIGNyb3NzZXMgdGhlIHJlbG9jIGJlaW5nIGV4cGFuZGVkLiAgKi8KLQkgIGlmIChzdGFydCA8PSBpbnRfcmVsLnJfdmFkZHIgJiYgc3RvcCA+IGludF9yZWwucl92YWRkcikKLQkgICAgY2hhbmdlID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQkgIGVsc2UgaWYgKHN0YXJ0ID4gaW50X3JlbC5yX3ZhZGRyICYmIHN0b3AgPD0gaW50X3JlbC5yX3ZhZGRyKQotCSAgICBjaGFuZ2UgPSAtIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0JICBlbHNlCi0JICAgIGNoYW5nZSA9IDA7Ci0KLQkgIG9mZnNldHNbYWRqX2ldICs9IGNoYW5nZTsKLQotCSAgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JICAgIHsKLQkgICAgICBhZGpfZXh0X3JlbCsrOwotCSAgICAgIGFkal9pKys7Ci0JICAgICAgb2Zmc2V0c1thZGpfaV0gKz0gY2hhbmdlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIGluIHRoaXMgc2VjdGlvbiBkZWZpbmVkIGJ5IHRoaXMgb2JqZWN0IGZpbGUKLQkgYW5kIGFkanVzdCB0aGVpciB2YWx1ZXMuICBOb3RlIHRoYXQgd2UgZGVjaWRlIHdoZXRoZXIgdG8KLQkgYWRqdXN0IHRoZSB2YWx1ZSBiYXNlZCBvbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBFQ09GRiBFWFRSCi0JIHN0cnVjdHVyZSwgYmVjYXVzZSB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlIG1heQotCSBoYXZlIGJlZW4gY2hhbmdlZCBieSBhbiBlYXJsaWVyIGV4cGFuZGVkIHJlbG9jIGFuZCB0aHVzIG1heQotCSBubyBsb25nZXIgY29ycmVjdGx5IGluZGljYXRlIHdoZXRoZXIgdGhlIHN5bWJvbCBpcyBiZWZvcmUgb3IKLQkgYWZ0ZXIgdGhlIGV4cGFuZGVkIHJlbG9jLiAgKi8KLSAgICAgIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotICAgICAgYWRqX2hfcHRyID0gZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXM7Ci0gICAgICBhZGpfaF9wdHJfZW5kID0gYWRqX2hfcHRyICsgZXh0X2NvdW50OwotICAgICAgZm9yICg7IGFkal9oX3B0ciA8IGFkal9oX3B0cl9lbmQ7IGFkal9oX3B0cisrKQotCXsKLQkgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmFkal9oOwotCi0JICBhZGpfaCA9ICphZGpfaF9wdHI7Ci0JICBpZiAoYWRqX2ggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIChhZGpfaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGFkal9oLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICYmIGFkal9oLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAgICAgJiYgYWRqX2gtPmVzeW0uYXN5bS52YWx1ZSA+IGludF9yZWwucl92YWRkcikKLQkgICAgYWRqX2gtPnJvb3QudS5kZWYudmFsdWUgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQl9Ci0KLSAgICAgIC8qIEFkZCBhbiBlbnRyeSB0byB0aGUgc3ltYm9sIHZhbHVlIGFkanVzdCBsaXN0LiAgVGhpcyBpcyB1c2VkCi0JIGJ5IGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIHRvIGFkanVzdCB0aGUgdmFsdWVzIG9mCi0JIGludGVybmFsIHN5bWJvbHMgYW5kIEZEUidzLiAgKi8KLSAgICAgIGFkanVzdCA9ICgoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCkpKTsKLSAgICAgIGlmIChhZGp1c3QgPT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgYWRqdXN0LT5zdGFydCA9IGludF9yZWwucl92YWRkcjsKLSAgICAgIGFkanVzdC0+ZW5kID0gc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIGFkanVzdC0+YWRqdXN0ID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotICAgICAgYWRqdXN0LT5uZXh0ID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0OwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0ID0gYWRqdXN0OwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwgJiYgISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyAhPSAoYmZkX2J5dGUgKikgTlVMTCAmJiAhIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoZW4gYSBQQwotICAgcmVsYXRpdmUgcmVsb2MgbXVzdCBiZSBleHBhbmRlZCBpbnRvIHRoZSBmaXZlIGluc3RydWN0aW9uIHNlcXVlbmNlLgotICAgSXQgaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIGV4cGFuc2lvbiwgaW5jbHVkaW5nIHJlc29sdmluZwotICAgdGhlIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsYXhfcGNyZWwxNiAoaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoLCBsb2NhdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogMHgwNDExZmZmZiBpcyBiZ2V6YWwgJDAsLiA9PSBiYWwgLiAgKi8KLSAgQkZEX0FTU0VSVCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbikgPT0gMHgwNDExZmZmZik7Ci0KLSAgLyogV2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgYW5kIHRoZQotICAgICBjdXJyZW50IGFkZHJlc3MgcGx1cyBlaWdodC4gICovCi0gIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcmVzcyArIDg7Ci0KLSAgLyogSWYgdGhlIGxvd2VyIGhhbGYgaXMgbmVnYXRpdmUsIGluY3JlbWVudCB0aGUgdXBwZXIgMTYgaGFsZi4gICovCi0gIGlmICgocmVsb2NhdGlvbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZWxvY2F0aW9uICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDA0MTEwMDAxLCBsb2NhdGlvbik7IC8qIGJhbCAuKzggKi8KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIDB4M2MwMTAwMDAgfCAoKHJlbG9jYXRpb24gPj4gMTYpICYgMHhmZmZmKSwgLyogbHVpICRhdCxYWCAqLwotCSAgICAgIGxvY2F0aW9uICsgNCk7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkgICAgICAweDI0MjEwMDAwIHwgKHJlbG9jYXRpb24gJiAweGZmZmYpLCAvKiBhZGRpdSAkYXQsJGF0LFhYICovCi0JICAgICAgbG9jYXRpb24gKyA4KTsKLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDAwM2YwODIxLCBsb2NhdGlvbiArIDEyKTsgLyogYWRkdSAkYXQsJGF0LCRyYSAqLwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4MDAyMGY4MDksIGxvY2F0aW9uICsgMTYpOyAvKiBqYWxyICRhdCAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhIC5zZGF0YSBzZWN0aW9uIGFuZCBhIC5yZWwuc2RhdGEgaW4tbWVtb3J5IHNlY3Rpb24sIHN0b3JlCi0gICByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGludG8gdGhlIC5yZWwuc2RhdGEgc2VjdGlvbiB3aGljaCBjYW4gYmUKLSAgIHVzZWQgYXQgcnVudGltZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZQotICAgbGlua2VyIHdoZW4gdGhlIC0tZW1iZWRkZWQtcmVsb2NzIHN3aXRjaCBpcyB1c2VkLiAgVGhpcyBpcyBjYWxsZWQKLSAgIGFmdGVyIHRoZSBhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBoYXMgYmVlbiBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIG9iamVjdHMsIGFuZCBiZWZvcmUgdGhlIGZpbmFsX2xpbmsgZW50cnkgcG9pbnQgaXMgY2FsbGVkLiAgVGhpcwotICAgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgb2JqZWN0IHdhcyBjb21waWxlZCB1c2luZwotICAgLW1lbWJlZGRlZC1waWMuICAqLwotCi1ib29sZWFuCi1iZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCBpbmZvLCBkYXRhc2VjLCByZWxzZWMsIGVycm1zZykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gICAgIGFzZWN0aW9uICpyZWxzZWM7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICBiZmRfYnl0ZSAqcDsKLQotICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgKmVycm1zZyA9IE5VTEw7Ci0KLSAgaWYgKGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltX2hhc2hlcyA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOwotCi0gIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIGRhdGFzZWMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KTsKLSAgaWYgKHJlbHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcCA9IHJlbHNlYy0+Y29udGVudHM7Ci0KLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZGF0YXNlYyk7Ci0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgZGF0YXNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgcCArPSA0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgYm9vbGVhbiB0ZXh0X3JlbGF0aXZlOwotCi0gICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKLQotICAgICAgLyogV2UgYXJlIGdvaW5nIHRvIHdyaXRlIGEgZm91ciBieXRlIHdvcmQgaW50byB0aGUgcnVudGltZSByZWxvYwotCSBzZWN0aW9uLiAgVGhlIHdvcmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBpbiB0aGUgZGF0YSBzZWN0aW9uCi0JIHdoaWNoIG11c3QgYmUgcmVsb2NhdGVkLiAgVGhpcyBtdXN0IGJlIG9uIGEgd29yZCBib3VuZGFyeSwKLQkgd2hpY2ggbWVhbnMgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4gIFdlIHVzZSB0aGUKLQkgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIGluZGljYXRlIGhvdyB0aGUgdmFsdWUgaW4gdGhlIGRhdGEKLQkgc2VjdGlvbiBtdXN0IGJlIHJlbG9jYXRlZC4gIEEgMCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBpcwotCSByZWxhdGl2ZSB0byB0aGUgdGV4dCBzZWN0aW9uLCB3aGlsZSBhIDEgaW5kaWNhdGVzIHRoYXQgdGhlCi0JIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIHNlY3Rpb24uICBHaXZlbiB0aGF0IHdlIGFyZQotCSBhc3N1bWluZyB0aGUgY29kZSB3YXMgY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMsIHRoZXJlCi0JIHNob3VsZCBub3QgYmUgYW55IG90aGVyIHBvc3NpYmlsaXRpZXMuICAqLwotCi0gICAgICAvKiBXZSBjYW4gb25seSByZWxvY2F0ZSBSRUZXT1JEIHJlbG9jcyBhdCBydW4gdGltZS4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRldPUkQpCi0JewotCSAgKmVycm1zZyA9IF8oInVuc3VwcG9ydGVkIHJlbG9jIHR5cGUiKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JewotCSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IHN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07Ci0JICAvKiBJZiBoIGlzIE5VTEwsIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbCB3aGljaCB3ZSB0aG91Z2h0IHdhcyBqdXN0IGEgZGVidWdnaW5nCi0JICAgICBzeW1ib2wuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLQkgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkgICAgdGV4dF9yZWxhdGl2ZSA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHRleHRfcmVsYXRpdmUgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpbnRfcmVsLnJfc3ltbmR4KQotCSAgICB7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9URVhUOgotCSAgICAgIHRleHRfcmVsYXRpdmUgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TQlNTOgotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODoKLQkgICAgICB0ZXh0X3JlbGF0aXZlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogTm8gb3RoZXIgc2VjdGlvbnMgc2hvdWxkIGFwcGVhciBpbiAtbWVtYmVkZGVkLXBpYwotICAgICAgICAgICAgICAgICBjb2RlLiAgKi8KLQkgICAgICAqZXJybXNnID0gXygicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIik7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKGludF9yZWwucl9vZmZzZXQgJiAzKSAhPSAwKQotCXsKLQkgICplcnJtc2cgPSBfKCJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLAotCQkgIChpbnRfcmVsLnJfdmFkZHIgLSBkYXRhc2VjLT52bWEgKyBkYXRhc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKHRleHRfcmVsYXRpdmUgPyAwIDogMSkpLAotCQkgIHApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgdGhlIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhlIGJhY2tlbmQgZmllbGQgb2YgdGhlCi0gICB0YXJnZXQgdmVjdG9yIHBvaW50cyB0byB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgbWlwc19lY29mZl9iYWNrZW5kX2RhdGEgPQotewotICAvKiBDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgKi8KLSAgewotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKSBiZmRfdm9pZCwgLyogYXV4X2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9pbiAqLwotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9faW4gKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpYmZkX3ZvaWQsLyphdXhfb3V0Ki8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHJlbG9jX291dCAqLwotICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0LAotICAgIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0LAotICAgIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIDAsIDAsIDAsIDAsIEZJTE5NTEVOLCB0cnVlLCBmYWxzZSwgNCwKLSAgICBtaXBzX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbiwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfaW4sCi0gICAgbWlwc19lY29mZl9zd2FwX3Njbmhkcl9pbiwgTlVMTCwKLSAgICBtaXBzX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vaywgX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCi0gICAgX2JmZF9lY29mZl9ta29iamVjdF9ob29rLCBfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzLAotICAgIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rLCBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwKLSAgfSwKLSAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCi0gIGJmZF9hcmNoX21pcHMsCi0gIC8qIEluaXRpYWwgcG9ydGlvbiBvZiBhcm1hcCBzdHJpbmcuICAqLwotICAiX19fX19fX19fXyIsCi0gIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKLSAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KLSAgMHgxMDAwLAotICAvKiBUcnVlIGlmIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBBbHBoYS4gIEZhbHNlIGlmIC5yZGF0YSBpcyBwYXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBNSVBTLiAgKi8KLSAgZmFsc2UsCi0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIDMyLAotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICAmbWlwc19ob3d0b190YWJsZVtNSVBTX1JfUkVGV09SRF0sCi0gIHsKLSAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgICBtYWdpY1N5bSwKLSAgICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gICAgNCwKLSAgICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gICAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gICAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9zeW1faW4sCi0gICAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gICAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gICAgZWNvZmZfc3dhcF9leHRfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICAgIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICAgIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gICAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KLSAgfSwKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIFJFTFNaLAotICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLwotICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4sCi0gIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICBtaXBzX2FkanVzdF9yZWxvY19pbiwKLSAgbWlwc19hZGp1c3RfcmVsb2Nfb3V0LAotICAvKiBSZWxvY2F0ZSBzZWN0aW9uIGNvbnRlbnRzIHdoaWxlIGxpbmtpbmcuICAqLwotICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24sCi0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBOVUxMLAotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gICovCi0gIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zCi19OwotCi0vKiBMb29raW5nIHVwIGEgcmVsb2MgdHlwZSBpcyBNSVBTIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogR2V0dGluZyByZWxvY2F0ZWQgc2VjdGlvbiBjb250ZW50cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLS8qIEhhbmRsaW5nIGZpbGUgd2luZG93cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIFJlbGF4aW5nIHNlY3Rpb25zIGlzIE1JUFMgc3BlY2lmaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIG1pcHNfcmVsYXhfc2VjdGlvbgotCi0vKiBHQyBvZiBzZWN0aW9ucyBpcyBub3QgZG9uZS4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgZWNvZmZfbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1saXR0bGVtaXBzIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBlY29mZl9iaWdfdmVjLAotICAKLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWMgPQotewotICAiZWNvZmYtYmlnbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBlY29mZl9saXR0bGVfdmVjLAotICAKLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ2xpdHRsZV92ZWMgPQotewotICAiZWNvZmYtYmlnbGl0dGxlbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAmbWlwc19lY29mZl9iYWNrZW5kX2RhdGEKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1wbWFjLmMgYi9iZmQvY29mZi1wbWFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMzMyZDkuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtcG1hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBcHBsZSBldCBhbCBQb3dlclBDIE1hYyAiWENPRkYiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCXBtYWNfeGNvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJ4Y29mZi1wb3dlcm1hYyIKLQotLyogVHdlYWsgY29mZmNvZGUuaCBiYXNlZCBvbiB0aGlzIGJlaW5nIGEgUG93ZXJNYWMgaW5zdGVhZCBvZiBSUy82MDAwLiAqLwotCi0jZGVmaW5lIFBPV0VSTUFDCi0KLSNpbmNsdWRlICJjb2ZmLXJzNjAwMC5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcHBjLmMgYi9iZmQvY29mZi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlNjk1ZC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NjkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIE1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE9yaWdpbmFsIHZlcnNpb24gcGllY2VkIHRvZ2V0aGVyIGJ5IEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCi0KLSAgIFRoZXJlIGlzIG5vdGhpbmcgbmV3IHVuZGVyIHRoZSBzdW4uIFRoaXMgZmlsZSBkcmF3cyBhIGxvdCBvbiBvdGhlcgotICAgY29mZiBmaWxlcywgaW4gcGFydGljdWxhciwgdGhvc2UgZm9yIHRoZSBycy82MDAwLCBhbHBoYSwgbWlwcywgYW5kIAotICAgaW50ZWwgYmFja2VuZHMsIGFuZCB0aGUgUEUgd29yayBmb3IgdGhlIGFybS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQ3VycmVudCBTdGF0ZToKLSAgIC0gb2JqZHVtcCB3b3JrcwotICAgLSByZWxvY3MgZ2VuZXJhdGVkIGJ5IGdhcwotICAgLSBsZCB3aWxsIGxpbmsgZmlsZXMsIGJ1dCB0aGV5IGRvIG5vdCBydW4uCi0gICAtIGRsbHRvb2wgd2lsbCBub3QgcHJvZHVjZSBjb3JyZWN0IG91dHB1dCBpbiBzb21lIC5yZWxvYyBjYXNlcywgYW5kIHdpbGwgCi0gICAgIG5vdCBwcm9kdWNlIHRoZSByaWdodCBnbHVlIGNvZGUgZm9yIGRsbCBmdW5jdGlvbiBjYWxscy4KLSovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3Bvd2VycGMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0KLSNpZmRlZiBCQURNQUcKLSN1bmRlZiBCQURNQUcKLSNlbmRpZgotCi0jZGVmaW5lIEJBRE1BRyh4KSBQUENCQURNQUcoeCkKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgd2Ugb25seSBjb21waWxlIHRoZQotICAgZmluYWxfbGluayByb3V0aW5lIG9uY2UuICAqLwotZXh0ZXJuIGJvb2xlYW4gcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGR1bXBfdG9jIFBBUkFNUyAoKFBUUikpOwotCi0vKiBUaGUgdG9jIGlzIGEgc2V0IG9mIGJmZF92bWEgZmllbGRzLiBXZSB1c2UgdGhlIGZhY3QgdGhhdCB2YWxpZCAgICAgICAgICovCi0vKiBhZGRyZXNzZXMgYXJlIGV2ZW4gKGkuZS4gdGhlIGJpdCByZXByZXNlbnRpbmcgIjEiIGlzIG9mZikgdG8gYWxsb3cgICAgICovCi0vKiB1cyB0byBlbmNvZGUgYSBsaXR0bGUgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhlIGZpZWxkICAgICAgICAgICAgICAgICAgICovCi0vKiAtIFVuYWxsb2NhdGVkIGFkZHJlc3NlcyBhcmUgaW50aWFsaXplZCB0byAxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtIEFsbG9jYXRlZCBhZGRyZXNzZXMgYXJlIGV2ZW4gbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgZmlyc3QgdGltZSB3ZSBhY3R1YWxseSB3cml0ZSBhIHJlZmVyZW5jZSB0byB0aGUgdG9jIGluIHRoZSBiZmQsICAgICovCi0vKiB3ZSB3YW50IHRvIHJlY29yZCB0aGF0IGZhY3QgaW4gYSBmaXh1cCBmaWxlIChpZiBpdCBpcyBhc2tlZCBmb3IpLCBzbyAgICovCi0vKiB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IGFuIGFkZHJlc3MgaGFzIGJlZW4gd3JpdHRlbiBieSBtYXJraW5nICovCi0vKiB0aGUgbG93IG9yZGVyIGJpdCB3aXRoIGEgIjEiIHVwb24gd3JpdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgU0VUX1VOQUxMT0NBVEVEKHgpICAoKHgpID0gMSkKLSNkZWZpbmUgSVNfVU5BTExPQ0FURUQoeCkgICAoKHgpID09IDEpCi0KLSNkZWZpbmUgSVNfV1JJVFRFTih4KSAgICAgICAoKHgpICYgMSkKLSNkZWZpbmUgTUFSS19BU19XUklUVEVOKHgpICAoKHgpIHw9IDEpCi0jZGVmaW5lIE1BS0VfQUREUl9BR0FJTih4KSAgKCh4KSAmPSB+MSkKLQotCi0vKiBUdXJuIG9uIHRoaXMgY2hlY2sgaWYgeW91IHN1c3BlY3Qgc29tZXRoaW5nIGFtaXNzIGluIHRoZSBoYXNoIHRhYmxlcyAqLwotI2lmZGVmIERFQlVHX0hBU0gKLQotLyogTmVlZCBhIDcgY2hhciBzdHJpbmcgZm9yIGFuIGV5ZSBjYXRjaGVyICovCi0jZGVmaW5lIEVZRSAia3JranVuayIKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTCBjaGFyIGV5ZV9jYXRjaGVyWzhdOwotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KSAgICAgIHN0cmNweShyZXQtPmV5ZV9jYXRjaGVyLCBFWUUpCi0jZGVmaW5lIEhBU0hfQ0hFQ0soYWRkcikgXAotIGlmIChzdHJjbXAoYWRkci0+ZXllX2NhdGNoZXIsIEVZRSkgIT0gMCkgXAotICB7IFwKLSAgICBmcHJpbnRmKHN0ZGVycixcCi0gICAgXygiRmlsZSAlcywgbGluZSAlZCwgSGFzaCBjaGVjayBmYWlsdXJlLCBiYWQgZXllICU4c1xuIiksIFwKLSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGFkZHItPmV5ZV9jYXRjaGVyKTsgXAotICAgIGFib3J0KCk7IFwKLSB9Ci0KLQotI2Vsc2UKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTAotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KQotI2RlZmluZSBIQVNIX0NIRUNLKGFkZHIpCi0KLSNlbmRpZgotCi0vKiBJbiBvcmRlciBub3QgdG8gYWRkIGFuIGludCB0byBldmVyeSBoYXNoIHRhYmxlIGl0ZW0gZm9yIGV2ZXJ5IGNvZmYKLSAgIGxpbmtlciwgd2UgZGVmaW5lIG91ciBvd24gaGFzaCB0YWJsZSwgZGVyaXZlZCBmcm9tIHRoZSBjb2ZmIG9uZSAqLwotCi0vKiBQRSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgICovCi0KLSAgLyogQXMgd2Ugd29uZGVyIGFyb3VuZCB0aGUgcmVsb2NzLCB3ZSdsbCBrZWVwIHRoZSBhc3NpZ25lZCB0b2Nfb2Zmc2V0Ci0gICAgIGhlcmUgKi8KLSAgYmZkX3ZtYSB0b2Nfb2Zmc2V0OyAgICAgICAgICAgICAgIC8qIE91ciBhZGRpdGlvbiwgYXMgcmVxdWlyZWQgKi8KLSAgaW50IHN5bWJvbF9pc19nbHVlOwotICB1bnNpZ25lZCBsb25nIGludCBnbHVlX2luc247Ci0KLSAgSEFTSF9DSEVDS19EQ0wKLX07Ci0KLQotLyogUEUgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1wcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gCi0gICAgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCAKLQkJCSBzaXplb2YgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpKTsKLQotICBpZiAocmV0ID09IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgCi0JCQkJICAgICAgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIFNFVF9VTkFMTE9DQVRFRChyZXQtPnRvY19vZmZzZXQpOwotICAgICAgcmV0LT5zeW1ib2xfaXNfZ2x1ZSA9IDA7Ci0gICAgICByZXQtPmdsdWVfaW5zbiA9IDA7Ci0KLSAgICAgIEhBU0hfQ0hFQ0tfSU5JVChyZXQpOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBQRSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhIFBFIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoISBwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLAotCQkJCQlwcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBOb3csIHRhaWxvciBjb2ZmY29kZS5oIHRvIHVzZSBvdXIgaGFzaCBzdHVmZiAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0MCi0vKiBUaGUgbnQgbG9hZGVyIHBvaW50cyB0aGUgdG9jIHJlZ2lzdGVyIHRvICZ0b2MgKyAzMjc2OCwgaW4gb3JkZXIgdG8gKi8KLS8qIHVzZSB0aGUgY29tcGxldGUgcmFuZ2Ugb2YgYSAxNi1iaXQgZGlzcGxhY2VtZW50LiBXZSBoYXZlIHRvIGFkanVzdCAqLwotLyogZm9yIHRoaXMgd2hlbiB3ZSBmaXggdXAgbG9hZHMgZGlzcGxhY2VkIG9mZiB0aGUgdG9jIHJlZy4gICAgICAgICAgICovCi0jZGVmaW5lIFRPQ19MT0FEX0FESlVTVE1FTlQgKC0zMjc2OCkKLSNkZWZpbmUgVE9DX1NFQ1RJT05fTkFNRSAiLnByaXZhdGUudG9jIgotCi0vKiBUaGUgbWFpbiBib2R5IG9mIGNvZGUgaXMgaW4gY29mZmNvZGUuaC4gICovCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotLyogdGhlc2Ugc2hvdWxkIGRlZmluaXRlbHkgZ28gaW4gYSBoZWFkZXIgZmlsZSBzb21ld2hlcmUuLi4gKi8KLQotLyogTk9QICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgICAgICAgICAgMHgwMDAwCi0KLS8qIDY0LWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjY0ICAgICAgICAgICAgMHgwMDAxCi0KLS8qIDMyLWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyICAgICAgICAgICAgMHgwMDAyCi0KLS8qIDI2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIGFic29sdXRlKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIyNCAgICAgICAgICAgIDB4MDAwMwotCi0vKiAxNi1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNiAgICAgICAgICAgIDB4MDAwNAotCi0vKiAxNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMTQgICAgICAgICAgICAweDAwMDUKLQotLyogMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUwyNCAgICAgICAgICAgICAweDAwMDYKLQotLyogMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMTQgICAgICAgICAgICAgMHgwMDA3Ci0KLS8qIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2ICAgICAgICAgIDB4MDAwOAotCi0vKiAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgICAgICAgICAgMHgwMDA5Ci0KLS8qIDMyLWJpdCBhZGRyIHcvbyBpbWFnZSBiYXNlICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyTkIgICAgICAgICAgMHgwMDBBCi0KLS8qIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNSRUwgICAgICAgICAgICAweDAwMEIKLQotLyogc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNUSU9OICAgICAgICAgICAweDAwMEMKLQotLyogc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lGR0xVRSAgICAgICAgICAgIDB4MDAwRAotCi0vKiBzeW1ib2wgaXMgZ2x1ZSBjb2RlOyB2aXJ0dWFsIGFkZHJlc3MgaXMgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19JTUdMVUUgICAgICAgICAgICAweDAwMEUKLQotLyogdmEgb2YgY29udGFpbmluZyBzZWN0aW9uIChsaW1pdGVkIHRvIDE2IGJpdHMpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDUkVMMTYgICAgICAgICAgMHgwMDBGCi0KLS8qIHN0dWZmIHRvIGhhbmRsZSBpbW1lZGlhdGUgZGF0YSB3aGVuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgKi8KLS8qIGRhdGEgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaW1tZWRpYXRlIGZpZWxkICovCi0vKiBXZSBuZWVkIHRvIGRvICh1c3VhbGx5KSAzMiBiaXQgYXJpdGhtZXRpYyBvbiAxNiBiaXQgY2h1bmtzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGSEkgICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGTE8gICAgICAgICAgICAgMHgwMDExCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUEFJUiAgICAgICAgICAgICAgMHgwMDEyCi0KLS8qIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdG9jcmVsMTYsIHdpdGggVE9DREVGTiBhc3N1bWVkICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAgICAgMHgwMDEzCi0KLS8qICBGbGFnIGJpdHMgaW4gSU1BR0VfUkVMT0NBVElPTi5UWVBFICovCi0KLS8qIHN1YnRyYWN0IHJlbG9jIHZhbHVlIHJhdGhlciB0aGFuIGFkZGluZyBpdCAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX05FRyAgICAgICAgICAgICAgIDB4MDEwMAotCi0vKiBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJUQUtFTiAgICAgICAgICAgMHgwMjAwCi0KLS8qIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggbm90IHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gICAgICAgICAgMHgwNDAwCi0KLS8qIHRvYyBzbG90IGRlZmluZWQgaW4gZmlsZSAob3IsIGRhdGEgaW4gdG9jKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gICAgICAgICAgIDB4MDgwMAotCi0vKiBtYXNrcyB0byBpc29sYXRlIGFib3ZlIHZhbHVlcyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlR5cGUgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyAgICAgICAgICAweDAwRkYKLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19GTEFHTUFTSyAgICAgICAgICAweDBGMDAKLQotI2RlZmluZSBFWFRSQUNUX1RZUEUoeCkgICAgICAgICAgICAgICAgICgoeCkgJiBJTUFHRV9SRUxfUFBDX1RZUEVNQVNLKQotI2RlZmluZSBFWFRSQUNUX0ZMQUdTKHgpICgoeCkgJiBJTUFHRV9SRUxfUFBDX0ZMQUdNQVNLKQotI2RlZmluZSBFWFRSQUNUX0pVTksoeCkgIFwKLSAgICAgICAgICAgKCh4KSAmIH4oSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyB8IElNQUdFX1JFTF9QUENfRkxBR01BU0spKQotCi0MCi0vKiBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlIHJlbG9jYXRpb24gd29yayAqLwotLyogKFdvcmsgSW4gUHJvZ3Jlc3MpICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19wYWlyX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgIGNoYXIgKiplcnJvcikpOwotCi0MCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY190b2MxNl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICBjaGFyICoqZXJyb3IpKTsKLQotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2FkZHIzMm5iX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQkgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQkgUFRSIGRhdGEsCi0JCQkJCQkJIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCSBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWN0aW9uX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQlhcmVsZW50ICpyZWxvYywKLQkJCQkJCQlhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJUFRSIGRhdGEsCi0JCQkJCQkJYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkJYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCWNoYXIgKiplcnJvcikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWNyZWxfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2ltZ2x1ZV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLQotCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgUEFSQU1TKChiZmQgKmFiZmQsIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvKSk7Ci0KLQwKLS8qIEZJWE1FOiBJdCdsbCB0YWtlIGEgd2hpbGUgdG8gZ2V0IHRocm91Z2ggYWxsIG9mIHRoZXNlLiBJIG9ubHkgbmVlZCBhIGZldyB0bwotICAgZ2V0IHVzIHN0YXJ0ZWQsIHNvIHRob3NlIEknbGwgbWFrZSBzdXJlIHdvcmsuIFRob3NlIG1hcmtlZCBGSVhNRSBhcmUgZWl0aGVyCi0gICBjb21wbGV0ZWx5IHVudmVyaWZpZWQgb3IgaGF2ZSBhIHNwZWNpZmljIHVua25vd24gbWFya2VkIGluIHRoZSBjb21tZW50ICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJlbG9jYXRpb24gZW50cmllcyBmb3IgV2luZG93cy9OVCBvbiBQb3dlclBDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZyb20gdGhlIGRvY3VtZW50ICIiIHdlIGZpbmQgdGhlIGZvbGxvd2luZyBsaXN0ZWQgYXMgdXNlZCByZWxvY3M6ICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUJTT0xVVEUgICAgICAgOiBUaGUgbm9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUREUls2NHwzMnwxNl0gOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBkYXRhIGZpZWxkcyBvciB0aGUgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIG9uIGEgbG9hZC9zdG9yZS4gICAgICAgICAgICAgKi8KLS8qICAgQUREUlsyNHwxNF0gICAgOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBicmFuY2ggYW5kIGNvbmQgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBicmFuY2hlcy4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3Nlcy4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBUaGUgbG93IG9yZGVyIDIgYml0cyBhcmUgcHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgUkVMWzI0fDE0XSAgICAgOiBicmFuY2hlcyByZWxhdGl2ZSB0byB0aGUgSW5zdHJ1Y3Rpb24gQWRkcmVzcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICByZWdpc3Rlci4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3NlcywgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBhcyBiZWZvcmUuIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB3aWxsIGJlIHplcm8sIGFuZCAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgU1lNIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgbGluayB0aW1lLiAgKi8KLS8qICAgVE9DUkVMMTYgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIHJlZmVycmluZyB0byBhIHNsb3QgaW4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0b2MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVE9DUkVMMTQgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkLCBzaW1pbGFyIHRvIFJFTDE0IG9yIEFERFIxNC4gKi8KLS8qICAgQUREUjMyTkIgICAgICAgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAoT24gdGhlIGFscGhhLCB0aGlzIGlzIGFsd2F5cyBhIGxpbmtlciBnZW5lcmF0ZWQgdGh1bmspKi8KLS8qICAgICAgICAgICAgICAgICAgICAoaS5lLiAzMmJpdCBhZGRyIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBiYXNlKSAgICAgICAgICAgKi8KLS8qICAgU0VDUkVMICAgICAgICAgOiBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBzeW1ib2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgU0VDVElPTiAgICAgICAgOiBhY2Nlc3MgdG8gdGhlIGhlYWRlciBjb250YWluaW5nIHRoZSBpdGVtLiBTdXBwb3J0cyB0aGUgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb2RldmlldyBkZWJ1Z2dlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEluIHBhcnRpY3VsYXIsIG5vdGUgdGhhdCB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgICAgICAgICAgKi8KLS8qIHJlbG9jYXRpb25zIGxpc3RlZCBpbiB0aGUgaGVhZGVyIGZpbGUgYXJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcHBjX2NvZmZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgMHgwMDAwICAgTk9QICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUJTT0xVVEUsIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGRvbnQgY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFCU09MVVRFIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsCSAJICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwLCAgICAgICAgCQkgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfQUREUjY0IDB4MDAwMSAgNjQtYml0IGFkZHJlc3MgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyhJTUFHRV9SRUxfUFBDX0FERFI2NCwgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTMsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCTY0LAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAJIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkiQUREUjY0IiwgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JdHJ1ZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JTUlOVVNfT05FLAkgCSAvKiBzcmNfbWFzayAqLwotCU1JTlVTX09ORSwgICAgICAgIAkgLyogZHN0X21hc2sgKi8KLQlmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMiAweDAwMDIgIDMyLWJpdCBhZGRyZXNzICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIzMiwJLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMjQgMHgwMDAzICAyNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCBhYnNvbHV0ZSkgKi8KLSAgLyogdGhlIExJIGZpZWxkIGlzIGluIGJpdCA2IHRocm91Z2ggYml0IDI5IGlzIDI0IGJpdHMsICsgMiBmb3IgdGhlIHNoaWZ0ICovCi0gIC8qIE9mIGNvdXJzZSwgVGhhdCdzIHRoZSBJQk0gYXBwcm92ZWQgYml0IG51bWJlcmluZywgd2hpY2ggaXMgbm90IHdoYXQgKi8KLSAgLyogYW55b25lIGVsc2UgdXNlcy4uLi4gVGhlIGxpIGZpZWxkIGlzIGluIGJpdCAyIHRocnUgMjUgKi8gCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIyNCwgIC8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjI0IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwN2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDdmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMTYgMHgwMDA0ICAxNi1iaXQgYWRkcmVzcyAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMTYsICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIxNiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIxNCAweDAwMDUgKi8KLSAgLyogIDE2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBGSVhNRTogdGhlIG1hc2sgaXMgbGlrZWx5IHdyb25nLCBhbmQgdGhlIGJpdCBwb3NpdGlvbiBtYXkgYmUgYXMgd2VsbCAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIxNCwgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjE2IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMjQgMHgwMDA2ICovCi0gIC8qICAgMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfUkVMMjQsICAgLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVMMjQiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMTQgMHgwMDA3ICovCi0gIC8qICAgMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0gIC8qIEZJWE1FOiB0aGUgbWFzayBpcyBsaWtlbHkgd3JvbmcsIGFuZCB0aGUgYml0IHBvc2l0aW9uIG1heSBiZSBhcyB3ZWxsICovCi0gIC8qIEZJWE1FOiBob3cgZG9lcyBpdCBrbm93IGhvdyBmYXIgdG8gc2hpZnQ/ICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjE0LCAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBRERSMTYiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiAweDAwMDggKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfVE9DUkVMMTYsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3RvYzE2X3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJUT0NSRUwxNiIsICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgMHgwMDA5ICovCi0gIC8qICAgMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1RPQ1JFTDE0LC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTQiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMk5CIDB4MDAwQSAqLwotICAvKiAgIDMyLWJpdCBhZGRyIHcvIGltYWdlIGJhc2UgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMzJOQiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyTkIiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfU0VDUkVMIDB4MDAwQiAqLwotICAvKiAgIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfc2VjcmVsX3JlbG9jLCAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1NFQ1RJT04gMHgwMDBDICovCi0gIC8qICAgc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNUSU9OLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3NlY3Rpb25fcmVsb2MsICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJTRUNUSU9OIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JRkdMVUUgMHgwMDBEICovCi0gIC8qICAgc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19JRkdMVUUsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJJRkdMVUUiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JTUdMVUUgMHgwMDBFICovCi0gIC8qICAgc3ltYm9sIGlzIGdsdWUgY29kZTsgdmlydHVhbCBhZGRyZXNzIGlzIFRPQyByZXN0b3JlIGluc3RydWN0aW9uICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfSU1HTFVFLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19pbWdsdWVfcmVsb2MsICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiSU1HTFVFIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiAweDAwMEYgKi8KLSAgLyogICB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGxpbWl0ZWQgdG8gMTYgYml0cykgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTDE2IiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19SRUZISSAgICAgICAgICAgICAweDAwMTAgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19SRUZISSwgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVGSEkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1JFRkxPICAgICAgICAgICAgIDB4MDAxMSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1JFRkxPLCAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3JlZmhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSRUZMTyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19QQUlSICAgICAgICAgICAgICAweDAwMTIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19QQUlSLCAgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19wYWlyX3JlbG9jLCAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUEFJUiIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAweDAwMTMgKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHdpdGhvdXQgY2F1c2luZyBhIGRlZmluaXRpb24gKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKCAoSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiB8IElNQUdFX1JFTF9QUENfVE9DREVGTiksIC8qIHR5cGUgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTYsIFRPQ0RFRk4iLCAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLQotDAotCi0vKiBTb21lIHJlYWxseSBjaGVlenkgbWFjcm9zIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiB0byB0ZXN0IHN0ZGVyciA6LSkgKi8KLQotI2lmZGVmIERFQlVHX1JFTE9DCi0jZGVmaW5lIFVOX0lNUEwoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHN0YXRpYyBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBpZiAoaSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgZnByaW50ZihzdGRlcnIsXygiVW5pbXBsZW1lbnRlZCBSZWxvY2F0aW9uIC0tICVzXG4iKSx4KTsgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBEVU1QX1JFTE9DKG4scikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIGFkZHIgJWQsIGFkZGVuZCAlZFxuIiwgXAotCSAgIG4sICgqKHItPnN5bV9wdHJfcHRyKSktPm5hbWUsICAgICAgICAgICAgIFwKLQkgICByLT5hZGRyZXNzLCByLT5hZGRlbmQpOyAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qIEdpdmVuIGEgcmVsb2MgbmFtZSwgbiwgYW5kIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbF9yZWxvYywgCi0gICBkdW1wIG91dCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBvbiB0aGUgY29udGVudHMgCi0KLSNkZWZpbmUgbl9uYW1lCQlfbi5fbl9uYW1lCi0jZGVmaW5lIG5femVyb2VzCV9uLl9uX24uX25femVyb2VzCi0jZGVmaW5lIG5fb2Zmc2V0CV9uLl9uX24uX25fb2Zmc2V0Ci0KLSovCi0KLSNkZWZpbmUgRFVNUF9SRUxPQzIobixyKSAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIHJfdmFkZHIgJWQgJXNcbiIsIFwKLQkgICBuLCByLT5yX3N5bW5keCwgci0+cl92YWRkcixcCi0JICAgKCgoci0+cl90eXBlKSAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgPT0gMCkgXAotCSAgID8iICI6IiBUT0NERUZOIiAgKTsgICAgICBcCi19Ci0KLSNlbHNlCi0jZGVmaW5lIFVOX0lNUEwoeCkKLSNkZWZpbmUgRFVNUF9SRUxPQyhuLHIpCi0jZGVmaW5lIERVTVBfUkVMT0MyKG4scikKLSNlbmRpZgotCi0KLQwKLS8qIHRvYyBjb25zdHJ1Y3Rpb24gYW5kIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBhbmQgdGhlc2UgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIG9uZQotICAgb2YgdGhlIGNvbXBpbGF0aW9ucy4gIEZJWE1FOiBUaGlzIGlzIGNvbmZ1c2luZyBhbmQgd2VpcmQuICBBbHNvLAotICAgQkZEIHNob3VsZCBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuICAqLwotZXh0ZXJuIGJmZCogYmZkX29mX3RvY19vd25lcjsKLWV4dGVybiBsb25nIGludCBnbG9iYWxfdG9jX3NpemU7Ci0KLWV4dGVybiBsb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKLWV4dGVybiBsb25nIGludCBmaXJzdF90aHVua19hZGRyZXNzOwotZXh0ZXJuIGxvbmcgaW50IHRodW5rX3NpemU7Ci0KLWVudW0gdG9jX3R5cGUKLXsKLSAgZGVmYXVsdF90b2MsCi0gIHRvY18zMiwKLSAgdG9jXzY0Ci19OwotCi1lbnVtIHJlZl9jYXRlZ29yeQotewotICBwcml2LAotICBwdWIsCi0gIGRhdGEKLX07Ci0KLXN0cnVjdCBsaXN0X2VsZQotewotICBzdHJ1Y3QgbGlzdF9lbGUgKm5leHQ7Ci0gIGJmZF92bWEgYWRkcjsKLSAgZW51bSByZWZfY2F0ZWdvcnkgY2F0OwotICBpbnQgb2Zmc2V0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2VsZSAqaGVhZDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7Ci0KLXN0YXRpYyB2b2lkIHJlY29yZF90b2MKLSAgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBlbnVtIHJlZl9jYXRlZ29yeSwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdG9jICh0b2Nfc2VjdGlvbiwgb3VyX3RvY19vZmZzZXQsIGNhdCwgbmFtZSkKLSAgICAgYXNlY3Rpb24gKnRvY19zZWN0aW9uOwotICAgICBpbnQgb3VyX3RvY19vZmZzZXQ7Ci0gICAgIGVudW0gcmVmX2NhdGVnb3J5IGNhdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogYWRkIHRoaXMgZW50cnkgdG8gb3VyIHRvYyBhZGRyLW9mZnNldC1uYW1lIGxpc3QgKi8KLSAgc3RydWN0IGxpc3RfZWxlICp0OwotICB0ID0gKHN0cnVjdCBsaXN0X2VsZSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaXN0X2VsZSkpOwotICBpZiAodCA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotICB0LT5uZXh0ID0gMDsKLSAgdC0+b2Zmc2V0ID0gb3VyX3RvY19vZmZzZXQ7Ci0gIHQtPm5hbWUgPSBuYW1lOwotICB0LT5jYXQgPSBjYXQ7Ci0gIHQtPmFkZHIgPSB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OwotCi0gIGlmIChoZWFkID09IDApCi0gICAgewotICAgICAgaGVhZCA9IHQ7Ci0gICAgICB0YWlsID0gdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YWlsLT5uZXh0ID0gdDsKLSAgICAgIHRhaWwgPSB0OwotICAgIH0KLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi1zdGF0aWMgYm9vbGVhbiBwcGNfcmVjb3JkX3RvY19lbnRyeQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgaW50LCBlbnVtIHRvY190eXBlKSk7Ci1zdGF0aWMgdm9pZCBwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZQotICBQQVJBTVMgKChiZmQgKiwgaW50LCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotCi0vKiByZWNvcmQgYSB0b2Mgb2Zmc2V0IGFnYWluc3QgYSBzeW1ib2wgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfcmVjb3JkX3RvY19lbnRyeShhYmZkLCBpbmZvLCBzZWMsIHN5bSwgdG9jX2tpbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc3ltOwotICAgICBlbnVtIHRvY190eXBlIHRvY19raW5kIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaW50ICpsb2NhbF9zeW1zOwotCi0gIGggPSAwOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0gIGlmIChoICE9IDApCi0gICAgewotICAgICAgSEFTSF9DSEVDSyhoKTsKLSAgICB9Ci0KLSAgaWYgKGggPT0gMCkgCi0gICAgeyAKLSAgICAgIGxvY2FsX3N5bXMgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoYWJmZCk7Ci0gICAgICBpZiAobG9jYWxfc3ltcyA9PSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgLyogYWxsb2NhdGUgYSB0YWJsZSAqLwotCSAgbG9jYWxfc3ltcyA9IAotCSAgICAoaW50ICopIGJmZF96YWxsb2MgKGFiZmQsIAotCQkJCW9ial9yYXdfc3ltZW50X2NvdW50KGFiZmQpICogc2l6ZW9mKGludCkpOwotCSAgaWYgKGxvY2FsX3N5bXMgPT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGFiZmQpID0gbG9jYWxfc3ltczsKLQkgIGZvciAoaSA9IDA7IGkgPCBvYmpfcmF3X3N5bWVudF9jb3VudChhYmZkKTsgKytpKQotCSAgICB7Ci0JICAgICAgU0VUX1VOQUxMT0NBVEVEKGxvY2FsX3N5bXNbaV0pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoSVNfVU5BTExPQ0FURUQobG9jYWxfc3ltc1tzeW1dKSkgCi0JewotCSAgbG9jYWxfc3ltc1tzeW1dID0gZ2xvYmFsX3RvY19zaXplOwotCSAgZ2xvYmFsX3RvY19zaXplICs9IDQ7Ci0KLQkgIC8qIFRoZSBzaXplIG11c3QgZml0IGluIGEgMTZiaXQgZGlzcGxhY21lbnQgKi8KLQkgIGlmIChnbG9iYWxfdG9jX3NpemUgPiA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0gICAgICAvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhIHRvYyBzbG90IGFsbG9jYXRlZC4gSWYgbm90LCBkbyBpdAotCSBoZXJlLiBJdCB3aWxsIGJlIHVzZWQgaW4gcmVsb2NhdGVfc2VjdGlvbiAqLwotICAgICAgaWYgKElTX1VOQUxMT0NBVEVEKGgtPnRvY19vZmZzZXQpKQotCXsKLQkgIGgtPnRvY19vZmZzZXQgPSBnbG9iYWxfdG9jX3NpemU7Ci0JICBnbG9iYWxfdG9jX3NpemUgKz0gNDsKLQotCSAgLyogVGhlIHNpemUgbXVzdCBmaXQgaW4gYSAxNmJpdCBkaXNwbGFjbWVudCAqLwotCSAgaWYgKGdsb2JhbF90b2Nfc2l6ZSA+PSA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIHJlY29yZCBhIHRvYyBvZmZzZXQgYWdhaW5zdCBhIHN5bWJvbCAqLwotc3RhdGljIHZvaWQKLXBwY19tYXJrX3N5bWJvbF9hc19nbHVlKGFiZmQsIHN5bSwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzeW07Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotewotICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0KLSAgSEFTSF9DSEVDSyhoKTsKLQotICBoLT5zeW1ib2xfaXNfZ2x1ZSA9IDE7Ci0gIGgtPmdsdWVfaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSAmcmVsLT5yX3ZhZGRyKTsKLQotICByZXR1cm47Ci19Ci0KLSNlbmRpZiAvKiBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQwKLQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiAKLSAgICAoISBob3d0by0+cGNfcmVsYXRpdmUpIAotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfQUREUjMyTkIpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19UT0NSRUwxNikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lNR0xVRSkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lGR0xVRSkgCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNSRUwpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNUSU9OKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfU0VDUkVMMTYpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19SRUZISSkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1JFRkxPKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4pIDsKLX0gICAgIAotCi0jaWYgMAotCi0vKiB0aGlzIGZ1bmN0aW9uIGlzIGluIGNoYXJnZSBvZiBwZXJmb3JtaW5nIGFsbCB0aGUgcHBjIFBFIHJlbG9jYXRpb25zICovCi0vKiBEb24ndCB5ZXQga25vdyBpZiB3ZSB3YW50IHRvIGRvIHRoaXMgdGhpcyBwYXJ0aWN1bGFyIHdheSAuLi4gKGtyaykgICovCi0vKiBGSVhNRTogKGl0IGlzIG5vdCB5ZXQgZW5hYmxlZCkgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcGVfcHBjX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiB0aGUgY29uc3RoIHJlbG9jYXRpb24gY29tZXMgaW4gdHdvIHBhcnRzLCB3ZSBoYXZlIHRvIHJlbWVtYmVyCi0gICAgIHRoZSBzdGF0ZSBiZXR3ZWVuIGNhbGxzLCBpbiB0aGVzZSB2YXJpYWJsZXMgKi8KLSAgc3RhdGljIGJvb2xlYW4gcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJ0MV9jb25zdGhfdmFsdWU7Ci0KLSAgdW5zaWduZWQgbG9uZyBzeW1fdmFsdWU7Ci0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKLSAgdW5zaWduZWQgbG9uZyBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3MgOyAvKisgaW5wdXRfc2VjdGlvbi0+dm1hKi8KLQkKLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkKSAKLSAgICB7Ci0gICAgICAvKiBQYXJ0aWFsIGxpbmtpbmcgLSBkbyBub3RoaW5nICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsgCi0gICAgfQotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIEtlZXAgdGhlIHN0YXRlIG1hY2hpbmUgaGFwcHkgaW4gY2FzZSB3ZSdyZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19SRUZISSkgCi0JewotCSAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IHRydWU7Ci0JICBwYXJ0MV9jb25zdGhfdmFsdWUgID0gMDsKLQl9Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX3VuZGVmaW5lZCk7Ci0gICAgfQotICAKLSAgaWYgKChwYXJ0MV9jb25zdGhfYWN0aXZlKSAmJiAocl90eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikpIAotICAgIHsKLSAgICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiTWlzc2luZyBQQUlSIik7Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gICAgfQotCi0KLSAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZShzeW1ib2xfaW4pOwotICAKLSAgcmV0dXJuKGJmZF9yZWxvY19vayk7CQotfQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgYXNlY3Rpb24gKnRvY19zZWN0aW9uID0gMDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IDA7Ci0gIAotICAvKiBJZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGEKLSAgICAgdGhpbmcuICBUaGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkanVzdGluZyB0aGUgcmVsb2MKLSAgICAgYWRkcmVzc2VzIGFuZCBzeW1ib2wgaW5kaWNlcy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBoaWhhbGYgPSBmYWxzZTsKLSAgaGloYWxmX3ZhbCA9IDA7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0KLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBiZmRfYnl0ZSAqbG9jOwotCi0gICAgICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChyZWwtPnJfdHlwZSk7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0gIAotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLSAgICAgIGxvYyA9IGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBGSVhNRTogY2hlY2sgYm91bmRzIG9uIHJfdHlwZSAqLwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAKLQkgICAgKG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XSk7Ci0JICBpZiAoaCAhPSAwKSAKLQkgICAgewotCSAgICAgIEhBU0hfQ0hFQ0soaCk7Ci0JICAgIH0KLQotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19JTUdMVUUgJiYgaCA9PSAwKQotCXsKLQkgIC8qIEFuIElNR0xVRSByZWxvYyBtdXN0IGhhdmUgYSBuYW1lLiBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KLQkgIGFib3J0KCk7Ci0JfQotCi0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsID0gMDsKLQotICAgICAgLyogRklYTUU6IFBBSVIgdW5zdXBwb3J0ZWQgaW4gdGhlIGZvbGxvd2luZyBjb2RlICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotCSAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKG91dHB1dF9iZmQpKQotCQl2YWwgLT0gc2VjLT52bWE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgSEFTSF9DSEVDSyhoKTsKLQotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICAgIC8qIEVhY2ggY2FzZSBtdXN0IGRvIGl0cyBvd24gcmVsb2NhdGlvbiwgc2V0dGluZyByc3RhdCBhcHByb3ByaWF0ZWx5ICovCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIElNQUdFX1JFTF9QUENfVE9DUkVMMTY6Ci0JICB7Ci0JICAgIGJmZF92bWEgb3VyX3RvY19vZmZzZXQ7Ci0JICAgIGludCBmaXhpdDsKLQotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAodG9jX3NlY3Rpb24gPT0gMCkgCi0JICAgICAgewotCQl0b2Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChiZmRfb2ZfdG9jX293bmVyLCAKLQkJCQkJCSAgICAgICBUT0NfU0VDVElPTl9OQU1FKTsKLQotCQlpZiAoIHRvY19zZWN0aW9uID09IE5VTEwgKSAKLQkJICB7Ci0JCSAgICAvKiBUaGVyZSBpcyBubyB0b2Mgc2VjdGlvbi4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0JCSAgICBhYm9ydCgpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogCi0JICAgICAqICBBbWF6aW5nIGJpdCB0cmlja3MgcHJlc2VudC4gQXMgd2UgbWF5IGhhdmUgc2VlbiBlYXJsaWVyLCB3ZQotCSAgICAgKiAgdXNlIHRoZSAxIGJpdCB0byB0ZWxsIHVzIHdoZXRoZXIgb3Igbm90IGEgdG9jIG9mZnNldCBoYXMgYmVlbgotCSAgICAgKiAgYWxsb2NhdGVkLiBOb3cgdGhhdCB0aGV5J3ZlIGFsbCBiZWVuIGFsbG9jYXRlZCwgd2Ugd2lsbCB1c2UKLQkgICAgICogIHRoZSAxIGJpdCB0byB0ZWxsIHVzIGlmIHdlJ3ZlIHdyaXR0ZW4gdGhpcyBwYXJ0aWN1bGFyIHRvYwotCSAgICAgKiAgZW50cnkgb3V0LgotCSAgICAgKi8KLQkgICAgZml4aXQgPSBmYWxzZTsKLQkgICAgaWYgKGggPT0gMCkKLQkgICAgICB7IC8qIGl0IGlzIGEgZmlsZSBsb2NhbCBzeW1ib2wgKi8KLQkJaW50ICpsb2NhbF90b2NfdGFibGU7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJc3ltID0gc3ltcyArIHN5bW5keDsKLQkJbmFtZSA9IHN5bS0+X24uX25fbmFtZTsKLQotCQlsb2NhbF90b2NfdGFibGUgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoaW5wdXRfYmZkKTsKLQkJb3VyX3RvY19vZmZzZXQgPSBsb2NhbF90b2NfdGFibGVbc3ltbmR4XTsKLQotCQlpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCi0JCSAgewotCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKLQkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKLQkJICAgICAgIGFnYWluLgotCQkgICAgICovCi0JCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCi0JCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCAKLQkJCSAgICAgICBvdXJfdG9jX29mZnNldCwgCi0JCQkgICAgICAgcHJpdiwgCi0JCQkgICAgICAgc3RyZHVwKG5hbWUpKTsKLQotCQkgICAgYmZkX3B1dF8zMihvdXRwdXRfYmZkLAotCQkJICAgICAgIHZhbCwKLQkJCSAgICAgICB0b2Nfc2VjdGlvbi0+Y29udGVudHMgKyBvdXJfdG9jX29mZnNldCk7Ci0KLQkJICAgIE1BUktfQVNfV1JJVFRFTihsb2NhbF90b2NfdGFibGVbc3ltbmR4XSk7Ci0JCSAgICBmaXhpdCA9IHRydWU7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJb3VyX3RvY19vZmZzZXQgPSBoLT50b2Nfb2Zmc2V0OwotCi0JCWlmICgocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgCi0JCSAgICA9PSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gKQotCQkgIHsKLQkJICAgIC8qIFRoaXMgaXMgdW5iZWxpZXZhYmxlIGNoZWVzZS4gU29tZSBrbm93bGVkZ2FibGUgYXNtIAotCQkgICAgICAgaGFja2VyIGhhcyBkZWNpZGVkIHRvIHVzZSByMiBhcyBhIGJhc2UgZm9yIGxvYWRpbmcgCi0JCSAgICAgICBhIHZhbHVlLiBIZS9TaGUgZG9lcyB0aGlzIGJ5IHNldHRpbmcgdGhlIHRvY2RlZm4gYml0LCAKLQkJICAgICAgIGFuZCBub3Qgc3VwcGx5aW5nIGEgdG9jIGRlZmluaXRpb24uIFRoZSBiZWhhdmlvdXIgaXMgCi0JCSAgICAgICB0aGVuIHRvIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YWx1ZSBvZiB0aGUgCi0JCSAgICAgICBzeW1ib2wgYW5kIHRoZSBhY3R1YWwgbG9jYXRpb24gb2YgdGhlIHRvYyBhcyB0aGUgdG9jIAotCQkgICAgICAgaW5kZXguIAotCi0JCSAgICAgICBJbiBmYWN0LCB3aGF0IGlzIHVzdWFsbHkgaGFwcGVuaW5nIGlzLCBiZWNhdXNlIHRoZQotCQkgICAgICAgSW1wb3J0IEFkZHJlc3MgVGFibGUgaXMgbWFwcGVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZwotCQkgICAgICAgdGhlIHRvYywgc29tZSB0cmlwcHkgbGlicmFyeSBjb2RlIHRyeWluZyBmb3Igc3BlZWQgb24KLQkJICAgICAgIGRsbCBsaW5rYWdlLCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhhdCBhbmQgY29uc2lkZXJzIAotCQkgICAgICAgdGhlIElBVCB0byBiZSBwYXJ0IG9mIHRoZSB0b2MsIHRodXMgc2F2aW5nIGEgbG9hZC4KLQkJICAgICovCi0KLQkJICAgIG91cl90b2Nfb2Zmc2V0ID0gdmFsIC0gCi0JCSAgICAgICh0b2Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkgICAgICAgdG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgICAvKiBUaGUgc2l6ZSBtdXN0IHN0aWxsIGZpdCBpbiBhIDE2Yml0IGRpc3BsYWNtZW50ICovCi0JCSAgICBpZiAob3VyX3RvY19vZmZzZXQgPj0gNjU1MzUpCi0JCSAgICAgIHsKLQkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAoXygiJXM6IFJlbG9jYXRpb24gZm9yICVzIG9mICV4IGV4Y2VlZHMgVG9jIHNpemUgbGltaXQiKSwgCi0JCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBuYW1lLCBvdXJfdG9jX29mZnNldCk7Ci0JCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCi0JCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCBvdXJfdG9jX29mZnNldCwgcHViLCBzdHJkdXAobmFtZSkpOwotCQkgIH0KLQkJZWxzZSBpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCi0JCSAgewotCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKLQkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKLQkJICAgICAgIGFnYWluLgotCQkgICAgICovCi0JCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIHJlY29yZF90b2ModG9jX3NlY3Rpb24sIG91cl90b2Nfb2Zmc2V0LCBwdWIsIHN0cmR1cChuYW1lKSk7Ci0KLQkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCi0JCSAgICBiZmRfcHV0XzMyKG91dHB1dF9iZmQsCi0JCQkgICAgICAgdmFsLAotCQkJICAgICAgIHRvY19zZWN0aW9uLT5jb250ZW50cyArIG91cl90b2Nfb2Zmc2V0KTsKLQotCQkgICAgTUFSS19BU19XUklUVEVOKGgtPnRvY19vZmZzZXQpOwotCQkgICAgLyogVGhlIHRyaWNreSBwYXJ0IGlzIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyB0aGF0ICovCi0JCSAgICAvKiBuZWVkcyBhIC5yZWxvYyBlbnRyeSBmb3IgaXQgKi8KLQkJICAgIGZpeGl0ID0gdHJ1ZTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChmaXhpdCAmJiBpbmZvLT5iYXNlX2ZpbGUpIAotCSAgICAgIHsKLQkJLyogU28gaWYgdGhpcyBpcyBub24gcGNyZWxhdGl2ZSwgYW5kIGlzIHJlZmVyZW5jZWQKLQkJICAgdG8gYSBzZWN0aW9uIG9yIGEgY29tbW9uIHN5bWJvbCwgdGhlbiBpdCBuZWVkcyBhIHJlbG9jICovCi0KLQkJLyogcmVsb2NhdGlvbiB0byBhIHN5bWJvbCBpbiBhIHNlY3Rpb24gd2hpY2gKLQkJICAgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKLQkJICAgdG8gYSBmaWxlICovCi0KLQkJYmZkX3ZtYSBhZGRyID0gIHRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OwotCQkgICAgCi0JCWlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQotCQlmd3JpdGUgKCZhZGRyLCAxLDQsIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci0JICAgICAgfQotCi0KLQkgICAgLyogRklYTUU6IHRoaXMgdGVzdCBpcyBjb25zZXJ2YXRpdmUgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICYmCi0JCW91cl90b2Nfb2Zmc2V0ID4gdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogUmVsb2NhdGlvbiBleGNlZWRzIGFsbG9jYXRlZCBUT0MgKCV4KSIpLCAKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIC8qIE5vdyB3ZSBrbm93IHRoZSByZWxvY2F0aW9uIGZvciB0aGlzIHRvYyByZWZlcmVuY2UgKi8KLQkgICAgcmVsb2NhdGlvbiA9ICBvdXJfdG9jX29mZnNldCArIFRPQ19MT0FEX0FESlVTVE1FTlQ7Ci0JICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCSAgICBpbnB1dF9iZmQsIAotCQkJCQkgICAgcmVsb2NhdGlvbiwgCi0JCQkJCSAgICBsb2MpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0lGR0xVRToKLQkgIHsKLQkgICAgLyogVG8gc29sdmUgdGhpcywgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgKi8KLQkgICAgLyogYXBwZWFyaW5nIG9uIHRoZSBjYWxsIGluc3RydWN0aW9uIGlzIGEgZ2x1ZSBmdW5jdGlvbiBvciBub3QuICovCi0JICAgIC8qIEEgZ2x1ZSBmdW5jdGlvbiBtdXN0IGFubm91bmNlIGl0c2VsZiB2aWEgYSBJTUdMVUUgcmVsb2MsIGFuZCAqLwotCSAgICAvKiB0aGUgcmVsb2MgY29udGFpbnMgdGhlIHJlcXVpcmVkIHRvYyByZXN0b3JlIGluc3RydWN0aW9uICovCi0JICAKLQkgICAgYmZkX3ZtYSB4OwotCSAgICBjb25zdCBjaGFyICpteV9uYW1lOwotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAoaCAhPSAwKQotCSAgICAgIHsKLQkJbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJaWYgKGgtPnN5bWJvbF9pc19nbHVlID09IDEpIAotCQkgIHsKLQkJICAgIHggPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbG9jKTsKLQkJICAgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCBoLT5nbHVlX2luc24sIGxvYyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0JICAvKiBVbmltcGxlbWVudGVkOiBjb2RldmlldyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KLQkgIC8qIEZvciBmYXN0IGFjY2VzcyB0byB0aGUgaGVhZGVyIG9mIHRoZSBzZWN0aW9uIAotCSAgICAgY29udGFpbmluZyB0aGUgaXRlbS4gKi8KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotCSAgLyogVW5pbXBsZW1lbnRlZDogY29kZXZpZXcgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCi0JICAvKiBJcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSByZWxhdGl2ZQotCSAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotCSAgICAgc3ltYm9sICovCi0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfQUJTT0xVVEU6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIGlmIChoID09IDApCi0JCW15X25hbWUgPSAoc3ltcytzeW1uZHgpLT5fbi5fbl9uYW1lOwotCSAgICBlbHNlCi0JICAgICAgewotCQlteV9uYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIH0KLQotCSAgICBmcHJpbnRmKHN0ZGVyciwgCi0JCSAgICBfKCJXYXJuaW5nOiB1bnN1cHBvcnRlZCByZWxvYyAlcyA8ZmlsZSAlcywgc2VjdGlvbiAlcz5cbiIpLCAKLQkJICAgIGhvd3RvLT5uYW1lLAotCQkgICAgYmZkX2dldF9maWxlbmFtZShpbnB1dF9iZmQpLAotCQkgICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0KLQkgICAgZnByaW50ZihzdGRlcnIsInN5bSAlbGQgKCVzKSwgcl92YWRkciAlbGQgKCVseClcbiIsIAotCQkgICAgcmVsLT5yX3N5bW5keCwgbXlfbmFtZSwgKGxvbmcpIHJlbC0+cl92YWRkciwKLQkJICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICB9Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfSU1HTFVFOgotCSAgewotCSAgICAvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIG5vdy4gVGhpcyByZWxvYyB3YXMgbm90ZWQgaW4gdGhlIGZpcnN0Ci0JICAgICAgIHBhc3Mgb3ZlciB0aGUgcmVsb2NzLCBhbmQgdGhlIGdsdWUgaW5zdHJ1Y3Rpb24gZXh0cmFjdGVkICovCi0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIGlmIChoLT5zeW1ib2xfaXNfZ2x1ZSA9PSAxKSAKLQkgICAgICBicmVhazsKLQkgICAgbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAoXygiJXM6IE91dCBvZiBvcmRlciBJTUdMVUUgcmVsb2MgZm9yICVzIiksIAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBteV9uYW1lKTsKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpteWggPSAwOwotCSAgICBjb25zdCBjaGFyICpuYW1lID0gMDsKLQkgICAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7Ci0KLQkgICAgaWYgKHN0cm5jbXAoIi5pZGF0YSQyIixpbnB1dF9zZWN0aW9uLT5uYW1lLDgpID09IDAgJiYgZmlyc3RfdGh1bmtfYWRkcmVzcyA9PSAwKQotCSAgICAgIHsKLQkJLyogc2V0IG1hZ2ljIHZhbHVlcyAqLwotCQlpbnQgaWRhdGE1b2Zmc2V0OwotCQlzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKm15aCA9IDA7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTVfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkgICAgc2VjLT5vdXRwdXRfb2Zmc2V0IC0gCi0JCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JCQotCQlpZGF0YTVvZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTZfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJCi0JCXRodW5rX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgLSBpZGF0YTVvZmZzZXQ7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJaW1wb3J0X3RhYmxlX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JICAgICAgfQotCi0JICAgIGlmIChoID09IDApCi0JICAgICAgeyAvKiBpdCBpcyBhIGZpbGUgbG9jYWwgc3ltYm9sICovCi0JCXN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JCW5hbWUgPSBzeW0tPl9uLl9uX25hbWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQljaGFyICp0YXJnZXQgPSAwOwotCi0JCW5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWlmIChzdHJjbXAoIi5pZGF0YSQyIiwgbmFtZSkgPT0gMCkKLQkJICB0YXJnZXQgPSAiX19pZGF0YTJfbWFnaWNfXyI7Ci0JCWVsc2UgaWYgKHN0cmNtcCgiLmlkYXRhJDQiLCBuYW1lKSA9PSAwKQotCQkgIHRhcmdldCA9ICJfX2lkYXRhNF9tYWdpY19fIjsKLQkJZWxzZSBpZiAoc3RyY21wKCIuaWRhdGEkNSIsIG5hbWUpID09IDApCi0JCSAgdGFyZ2V0ID0gIl9faWRhdGE1X21hZ2ljX18iOwotCi0JCWlmICh0YXJnZXQgIT0gMCkKLQkJICB7Ci0JCSAgICBteWggPSAwOwotCi0JCSAgICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgdGFyZ2V0LAotCQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCSAgICBpZiAobXloID09IDApIAotCQkgICAgICB7Ci0JCQkvKiBNaXNzaW5nIG1hZ2ljIGNvb2tpZXMuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotCQkJYWJvcnQoKTsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICB2YWwgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgKyAKLQkJICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQkgICAgaWYgKGZpcnN0X3RodW5rX2FkZHJlc3MgPT0gMCkKLQkJICAgICAgewotCQkJaW50IGlkYXRhNW9mZnNldDsKLQkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIl9faWRhdGE1X21hZ2ljX18iLAotCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkJICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAKLQkJCSAgICBzZWMtPm91dHB1dF9vZmZzZXQgLSAKLQkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JCQkKLQkJCWlkYXRhNW9mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIl9faWRhdGE2X21hZ2ljX18iLAotCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJCi0JCQl0aHVua19zaXplID0gbXloLT5yb290LnUuZGVmLnZhbHVlIC0gaWRhdGE1b2Zmc2V0OwotCQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCi0JCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlpbXBvcnRfdGFibGVfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJICAgICAgCSAgICAgIGlucHV0X2JmZCwgCi0JCQkgICAgICB2YWwgLSAKLQkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UsCi0JCQkgICAgICBsb2MpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIElNQUdFX1JFTF9QUENfUkVMMjQ6Ci0JICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQkgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCSAgaW5wdXRfYmZkLCAKLQkJCQkJICB2YWwsIAotCQkJCQkgIGxvYyk7Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfQUREUjE2OgotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLQkgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCSAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsIAotCQkJCQkgIHZhbCwgCi0JCQkJCSAgbG9jKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCBpbmZvLT5iYXNlX2ZpbGUgKQotCXsKLQkgIC8qIFNvIGlmIHRoaXMgaXMgbm9uIHBjcmVsYXRpdmUsIGFuZCBpcyByZWZlcmVuY2VkCi0JICAgICB0byBhIHNlY3Rpb24gb3IgYSBjb21tb24gc3ltYm9sLCB0aGVuIGl0IG5lZWRzIGEgcmVsb2MgKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YShvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcChvdXRwdXRfYmZkLCBob3d0bykpCi0JICAgIHsKLQkgICAgICAvKiByZWxvY2F0aW9uIHRvIGEgc3ltYm9sIGluIGEgc2VjdGlvbiB3aGljaAotCQkgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKLQkJIHRvIGEgZmlsZSAqLwotCSAgICAgIGJmZF92bWEgYWRkciA9IHJlbC0+cl92YWRkciAKLQkJLSBpbnB1dF9zZWN0aW9uLT52bWEgCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgICAgICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKLQkJewotCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkJfQotCSAgICAgIGZ3cml0ZSAoJmFkZHIsIDEsNCwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UgaWYgKHN5bSA9PSBOVUxMKQotCSAgICAgIG5hbWUgPSAiKnVua25vd24qIjsKLQkgICAgZWxzZSBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JCSAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCSAgICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RybmNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLQkJYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JCW5hbWUgPSBidWY7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgCi0JCSAgICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgewotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCX0KLQotICAgIH0gICAgIAotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLS8qIEZJWE1FOiBCRkQgc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcy4gIFRoaXMgZmlsZSBpcyBjb21waWxlZAotICAgdHdpY2UsIGFuZCB0aGVzZSB2YXJpYWJsZXMgYXJlIHNoYXJlZC4gIFRoaXMgaXMgY29uZnVzaW5nIGFuZAotICAgd2VpcmQuICAqLwotCi1sb25nIGludCBnbG9iYWxfdG9jX3NpemUgPSA0OwotCi1iZmQqIGJmZF9vZl90b2Nfb3duZXIgPSAwOwotCi1sb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKLWxvbmcgaW50IGZpcnN0X3RodW5rX2FkZHJlc3M7Ci1sb25nIGludCB0aHVua19zaXplOwotCi1zdHJ1Y3QgbGlzdF9lbGUgKmhlYWQ7Ci1zdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7Ci0KLXN0YXRpYyBjaGFyICoKLWgxID0gTl8oIlxuXHRcdFx0VE9DIE1BUFBJTkdcblxuIik7Ci1zdGF0aWMgY2hhciAqCi1oMiA9IE5fKCIgVE9DICAgIGRpc2Fzc2VtYmx5ICBDb21tZW50cyAgICAgICBOYW1lXG4iKTsKLXN0YXRpYyBjaGFyICoKLWgzID0gTl8oIiBPZmZzZXQgIHNwZWxsaW5nICAgICAgICAgICAgICAgICAgIChpZiBwcmVzZW50KVxuIik7Ci0KLXZvaWQKLWR1bXBfdG9jICh2ZmlsZSkKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIHN0cnVjdCBsaXN0X2VsZSAqdDsKLQotICBmcHJpbnRmKGZpbGUsIF8oaDEpKTsKLSAgZnByaW50ZihmaWxlLCBfKGgyKSk7Ci0gIGZwcmludGYoZmlsZSwgXyhoMykpOwotCi0gIGZvcih0ID0gaGVhZDsgdCAhPSAwOyB0PXQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqY2F0ID0gIiI7Ci0KLSAgICAgIGlmICh0LT5jYXQgPT0gcHJpdikKLQljYXQgPSBfKCJwcml2YXRlICAgICAgICIpOwotICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IHB1YikKLQljYXQgPSBfKCJwdWJsaWMgICAgICAgICIpOwotICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IGRhdGEpCi0JY2F0ID0gXygiZGF0YS1pbi10b2MgICAiKTsKLQotICAgICAgaWYgKHQtPm9mZnNldCA+IGdsb2JhbF90b2Nfc2l6ZSkKLQl7Ci0JICBpZiAodC0+b2Zmc2V0IDw9IGdsb2JhbF90b2Nfc2l6ZSArIHRodW5rX3NpemUpCi0JICAgIGNhdCA9IF8oIklBVCByZWZlcmVuY2UgIik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmKGZpbGUsCi0JCSAgICAgIF8oIioqKiogZ2xvYmFsX3RvY19zaXplICVsZCglbHgpLCB0aHVua19zaXplICVsZCglbHgpXG4iKSwKLQkJICAgICAgZ2xvYmFsX3RvY19zaXplLCBnbG9iYWxfdG9jX3NpemUsIHRodW5rX3NpemUsIHRodW5rX3NpemUpOwotCSAgICAgIGNhdCA9IF8oIk91dCBvZiBib3VuZHMhIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICAiICUwNGx4ICAgICglZCkiLCAodW5zaWduZWQgbG9uZykgdC0+b2Zmc2V0LCB0LT5vZmZzZXQgLSAzMjc2OCk7Ci0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgIiAgICAlcyAlc1xuIiwKLQkgICAgICBjYXQsIHQtPm5hbWUpOwotCi0gICAgfQotCi0gIGZwcmludGYoZmlsZSwgIlxuIik7Ci19Ci0KLWJvb2xlYW4KLXBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoaW5mbykgCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZm9vOwotICBzdGF0aWMgY2hhciB0ZXN0X2NoYXIgPSAnMSc7Ci0KLSAgaWYgKCBnbG9iYWxfdG9jX3NpemUgPT0gMCApIC8qIEZJWE1FOiBkb2VzIHRoaXMgZ2V0IG1lIGluIHRyb3VibGU/ICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgb3duZXI/IFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lICggYmZkX29mX3RvY19vd25lciAsIFRPQ19TRUNUSU9OX05BTUUpOwotICBpZiAocyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgc2VjdGlvbj8gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0gICAgICBhYm9ydCgpOwotICAgIH0KLQotICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jKGJmZF9vZl90b2Nfb3duZXIsIGdsb2JhbF90b2Nfc2l6ZSk7Ci0gIG1lbXNldChmb28sIHRlc3RfY2hhciwgZ2xvYmFsX3RvY19zaXplKTsKLQotICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxfdG9jX3NpemU7Ci0gIHMtPmNvbnRlbnRzID0gZm9vOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1wcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppLCAqcmVsOwotCi0gIC8qIGhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiBXZSBoYXZlIGEgaG9vawotICAgICB0byBkbyByZWxvYyBydW1tYWdpbmcsIGJlZm9yZSBzZWN0aW9uIHNpemVzIGFyZSBuYWlsZWQgZG93bi4gKi8KLQotICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMoYWJmZCk7Ci0KLSAgLyogcnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgdG9jICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZm9yICg7IHNlYyAhPSAwOyBzZWMgPSBzZWMtPm5leHQpCi0gIHsKLSAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKSAKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLyogbG9hZCB0aGUgcmVsb2NzICovCi0gICAgLyogRklYTUU6IHRoZXJlIG1heSBiZSBhIHN0b3JhZ2UgbGVhayBoZXJlICovCi0gICAgaT1fYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MoYWJmZCxzZWMsMSwwLDAsMCk7Ci0gICAgCi0gICAgaWYgKGkgPT0gMCkKLSAgICAgIGFib3J0KCk7Ci0KLSAgICBmb3IgKHJlbD1pO3JlbDxpK3NlYy0+cmVsb2NfY291bnQ7KytyZWwpIAotICAgICAgewotCXVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLQl1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0JYm9vbGVhbiBvayA9IHRydWU7Ci0KLQlEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0KLQlzd2l0Y2gocl90eXBlKSAKLQkgIHsKLQkgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLQkgICAgLyogaWYgVE9DREVGTiBpcyBvbiwgaWdub3JlIGFzIHNvbWVvbmUgZWxzZSBoYXMgYWxsb2NhdGVkIHRoZQotCSAgICAgICB0b2MgZW50cnkgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICkKLQkgICAgICBvayA9IHBwY19yZWNvcmRfdG9jX2VudHJ5KGFiZmQsIGluZm8sIHNlYywgCi0JCQkJCXJlbC0+cl9zeW1uZHgsIGRlZmF1bHRfdG9jKTsKLQkgICAgaWYgKCFvaykKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLQkgICAgcHBjX21hcmtfc3ltYm9sX2FzX2dsdWUoYWJmZCwgcmVsLT5yX3N5bW5keCwgcmVsKTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJSRUZISSIpOwotICBEVU1QX1JFTE9DKCJSRUZISSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jaWYgMAotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJSRUZMTyIpOwotICBEVU1QX1JFTE9DKCJSRUZMTyIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jZW5kaWYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3BhaXJfcmVsb2MgKGFiZmQsCi0JCXJlbG9jX2VudHJ5LAotCQlzeW1ib2wsCi0JCWRhdGEsCi0JCWlucHV0X3NlY3Rpb24sCi0JCW91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJQQUlSIik7Ci0gIERVTVBfUkVMT0MoIlBBSVIiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotDAotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3RvYzE2X3JlbG9jIChhYmZkLAotCQkgcmVsb2NfZW50cnksCi0JCSBzeW1ib2wsCi0JCSBkYXRhLAotCQkgaW5wdXRfc2VjdGlvbiwKLQkJIG91dHB1dF9iZmQsCi0JCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgVU5fSU1QTCgiVE9DUkVMMTYiKTsKLSAgRFVNUF9SRUxPQygiVE9DUkVMMTYiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2lmIDAKLQotLyogQUREUjMyTkIgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgKE9uIHRoZSBhbHBoYSwgdGhpcyBpcyBhbHdheXMgYSBsaW5rZXIgZ2VuZXJhdGVkIHRodW5rKSovCi0vKiAgICAgICAgICAgIChpLmUuIDMyYml0IGFkZHIgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGJhc2UpICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19hZGRyMzJuYl9yZWxvYyAoYWJmZCwKLQkJICAgIHJlbG9jX2VudHJ5LAotCQkgICAgc3ltYm9sLAotCQkgICAgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLAotCQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIkFERFIzMk5CIik7Ci0gIERVTVBfUkVMT0MoIkFERFIzMk5CIixyZWxvY19lbnRyeSk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19zZWNyZWxfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJTRUNSRUwiKTsKLSAgRFVNUF9SRUxPQygiU0VDUkVMIixyZWxvY19lbnRyeSk7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3NlY3Rpb25fcmVsb2MgKGFiZmQsCi0JCSAgIHJlbG9jX2VudHJ5LAotCQkgICBzeW1ib2wsCi0JCSAgIGRhdGEsCi0JCSAgIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsCi0JCSAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJTRUNUSU9OIik7Ci0gIERVTVBfUkVMT0MoIlNFQ1RJT04iLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfaW1nbHVlX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgVU5fSU1QTCgiSU1HTFVFIik7Ci0gIERVTVBfUkVMT0MoIklNR0xVRSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLQotI2RlZmluZSBNQVhfUkVMT0NfSU5ERVggIFwKLSAgICAgIChzaXplb2YocHBjX2NvZmZfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHBwY19jb2ZmX2hvd3RvX3RhYmxlWzBdKSAtIDEpCi0KLQotLyogRklYTUU6IFRoZXJlIGlzIGEgcG9zc2libGl0eSB0aGF0IHdoZW4gd2UgcmVhZCBpbiBhIHJlbG9jIGZyb20gYSBmaWxlLAotICAgICAgICAgIHRoYXQgdGhlcmUgYXJlIHNvbWUgYml0cyBlbmNvZGVkIGluIHRoZSB1cHBlciBwb3J0aW9uIG9mIHRoZSAKLQkgIHR5cGUgZmllbGQuIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0qLwotc3RhdGljIHZvaWQgcHBjX2NvZmZfcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqcmVsZW50LAotCQkJCQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWwpKTsKLQotc3RhdGljIHZvaWQKLXBwY19jb2ZmX3J0eXBlMmhvd3RvIChyZWxlbnQsIGludGVybmFsKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWw7Ci17ICAKLQotICAvKiBXZSBjYW4gZW5jb2RlIG9uZSBvZiB0aHJlZSB0aGluZ3MgaW4gdGhlIHR5cGUgZmllbGQsIGFzaWRlIGZyb20gdGhlCi0gICAgIHR5cGU6Ci0gICAgIDEuIElNQUdFX1JFTF9QUENfTkVHIC0gaW5kaWNhdGVzIHRoZSB2YWx1ZSBmaWVsZCBpcyBhIHN1YnRyYWN0aW9uCi0gICAgICAgIHZhbHVlLCByYXRoZXIgdGhhbiBhbiBhZGRpdGlvbiB2YWx1ZQotICAgICAyLiBJTUFHRV9SRUxfUFBDX0JSVEFLRU4sIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gLSBpbmRpY2F0ZXMgdGhhdAotICAgICAgICB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuIG9yIG5vdC4KLSAgICAgMy4gSU1BR0VfUkVMX1BQQ19UT0NERUZOIC0gdG9jIHNsb3QgZGVmaW5pdGlvbiBpbiB0aGUgZmlsZQotICAgICBGb3Igbm93LCB3ZSBqdXN0IHN0cmlwIHRoaXMgc3R1ZmYgdG8gZmluZCB0aGUgdHlwZSwgYW5kIGlnbm9yZSBpdCBvdGhlcgotICAgICB0aGFuIHRoYXQuCi0gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChpbnRlcm5hbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MoaW50ZXJuYWwtPnJfdHlwZSk7Ci0gIHVuc2lnbmVkIHNob3J0IGp1bmsgICAgPSBFWFRSQUNUX0pVTksgKGludGVybmFsLT5yX3R5cGUpOwotCi0gIC8qIHRoZSBtYXNraW5nIHByb2Nlc3Mgb25seSBzbGljZXMgb2ZmIHRoZSBib3R0b20gYnl0ZSBmb3Igcl90eXBlLiAqLwotICBpZiAoIHJfdHlwZSA+IE1BWF9SRUxPQ19JTkRFWCApIAotICAgIGFib3J0KCk7Ci0KLSAgLyogY2hlY2sgZm9yIGFic29sdXRlIGNyYXAgKi8KLSAgaWYgKCBqdW5rICE9IDAgKQotICAgIGFib3J0KCk7Ci0KLSAgc3dpdGNoKHJfdHlwZSkgCi0gICAgewotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDVElPTjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDUkVMOgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCBpbnRlcm5hbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgCi0JICAgICAgXygiV2FybmluZzogVW5zdXBwb3J0ZWQgcmVsb2MgJXMgWyVkXSB1c2VkIC0tIGl0IG1heSBub3Qgd29yay5cbiIpLAotCSAgICAgIHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkgICAgICByX3R5cGUpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsgICAgICAKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJlbGVudC0+aG93dG8gPSBob3d0bzsKLSAgCi19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgLyogV2UgY2FuIGVuY29kZSBvbmUgb2YgdGhyZWUgdGhpbmdzIGluIHRoZSB0eXBlIGZpZWxkLCBhc2lkZSBmcm9tIHRoZQotICAgICB0eXBlOgotICAgICAxLiBJTUFHRV9SRUxfUFBDX05FRyAtIGluZGljYXRlcyB0aGUgdmFsdWUgZmllbGQgaXMgYSBzdWJ0cmFjdGlvbgotICAgICAgICB2YWx1ZSwgcmF0aGVyIHRoYW4gYW4gYWRkaXRpb24gdmFsdWUKLSAgICAgMi4gSU1BR0VfUkVMX1BQQ19CUlRBS0VOLCBJTUFHRV9SRUxfUFBDX0JSTlRBS0VOIC0gaW5kaWNhdGVzIHRoYXQKLSAgICAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbiBvciBub3QuCi0gICAgIDMuIElNQUdFX1JFTF9QUENfVE9DREVGTiAtIHRvYyBzbG90IGRlZmluaXRpb24gaW4gdGhlIGZpbGUKLSAgICAgRm9yIG5vdywgd2UganVzdCBzdHJpcCB0aGlzIHN0dWZmIHRvIGZpbmQgdGhlIHR5cGUsIGFuZCBpZ25vcmUgaXQgb3RoZXIKLSAgICAgdGhhbiB0aGF0LgotICAqLwotCi0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MocmVsLT5yX3R5cGUpOwotICB1bnNpZ25lZCBzaG9ydCBqdW5rICAgID0gRVhUUkFDVF9KVU5LIChyZWwtPnJfdHlwZSk7Ci0KLSAgLyogdGhlIG1hc2tpbmcgcHJvY2VzcyBvbmx5IHNsaWNlcyBvZmYgdGhlIGJvdHRvbSBieXRlIGZvciByX3R5cGUuICovCi0gIGlmICggcl90eXBlID4gTUFYX1JFTE9DX0lOREVYICkgCi0gICAgYWJvcnQoKTsKLSAgCi0gIC8qIGNoZWNrIGZvciBhYnNvbHV0ZSBjcmFwICovCi0gIGlmICgganVuayAhPSAwICkKLSAgICBhYm9ydCgpOwotICAgIAotICBzd2l0Y2gocl90eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5COgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0gICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsIAotCSAgICAgIF8oIldhcm5pbmc6IFVuc3VwcG9ydGVkIHJlbG9jICVzIFslZF0gdXNlZCAtLSBpdCBtYXkgbm90IHdvcmsuXG4iKSwKLQkgICAgICBwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsCi0JICAgICAgcl90eXBlKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLQotLyogYSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZSAqLwotI2RlZmluZSBIT1cyTUFQKGJmZF9ydHlwZSxwcGNfcnR5cGUpICBcCi0gY2FzZSBiZmRfcnR5cGU6IHJldHVybiAmcHBjX2NvZmZfaG93dG9fdGFibGVbcHBjX3J0eXBlXQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzMyX0dPVE9GRiwgICAgSU1BR0VfUkVMX1BQQ19JTUdMVUUpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMTZfR09UX1BDUkVMLCBJTUFHRV9SRUxfUFBDX0lGR0xVRSk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjE2KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19CMjYsICAgICAgSU1BR0VfUkVMX1BQQ19SRUwyNCk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19QUENfQkEyNiwgICAgIElNQUdFX1JFTF9QUENfQUREUjI0KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19UT0MxNiwgICAgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNl9HT1RPRkYsICAgIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18zMiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjMyKTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1JWQSwgICAgICAgICAgSU1BR0VfUkVMX1BQQ19BRERSMzJOQik7Ci0gICAgZGVmYXVsdDogCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLSN1bmRlZiBIT1cyTUFQCi0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgIHBwY19jb2ZmX3J0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYyB2b2lkIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZW5kaWYKLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gICAgICAgICAgY29mZl9wcGNfcnR5cGVfdG9faG93dG8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgICAgICAgICAgcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0vKiBGSVhNRTogVGhpcyBubyBsb25nZXIgd29ya3MuICAqLwotI2RlZmluZSBjb2ZmX3N3YXBfc3ltX2luX2hvb2sgICAgICAgIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sKLSNlbmRpZgotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhpbnRlcm5hbCwgaG93dG8pIHtpbnRlcm5hbC5yX3R5cGU9aG93dG8tPnR5cGU7fQotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKLQotLyogRklYTUU6IFRoaXMgY29udHJvbHMgc29tZSBjb2RlIHRoYXQgdXNlZCB0byBiZSBpbiBwZWljb2RlLmggYW5kIGlzCi0gICBub3cgaW4gcGVpZ2VuLmMuICBJdCB3aWxsIG5vdCBjb250cm9sIHRoZSBjb2RlIGluIHBlaWdlbi5jLiAgSWYKLSAgIGFueWJvZHkgd2FudHMgdG8gZ2V0IHRoaXMgd29ya2luZywgeW91IHdpbGwgbmVlZCB0byBmaXggdGhhdC4gICovCi0jZGVmaW5lIFBPV0VSUENfTEVfUEUKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5pZGF0YSQyIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAwIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuaWRhdGEkMyIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmlkYXRhJDQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5pZGF0YSQ1IiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuaWRhdGEkNiIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMSB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLnJlbG9jIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAxIH0KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLQwKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLS8qIEZJWE1FOgotICAgV2hhdCB3ZSdyZSB0cnlpbmcgdG8gZG8gaGVyZSBpcyBhbGxvY2F0ZSBhIHRvYyBzZWN0aW9uIChlYXJseSksIGFuZCBhdHRhY2ggCi0gICBpdCB0byB0aGUgbGFzdCBiZmQgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGF2b2lkcyB0aGUgcHJvYmxlbSBvZiBoYXZpbmcgYSB0b2MKLSAgIHdyaXR0ZW4gb3V0IGJlZm9yZSBhbGwgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcwotICAgYSB0b2Mgc2VjdGlvbiBmb3IgZXZlcnkgZmlsZSwgYW5kIHJlY29yZHMgdGhlIGxhc3Qgb25lIHNlZW4uIFRoZXJlIGFyZQotICAgYXQgbGVhc3QgdHdvIHByb2JsZW1zIHdpdGggdGhpcyBhcHByb2FjaDoKLSAgIDEuIFdlIGFsbG9jYXRlIHdob2xlIGJ1bmNoZXMgb2YgdG9jIHNlY3Rpb25zIHRoYXQgYXJlIGlnbm9yZWQsIGJ1dCBhdAotICAgICAgYXQgbGVhc3Qgd2Ugd2lsbCBub3QgYWxsb2NhdGUgYSB0b2MgaWYgbm8gLnRvYyBpcyBwcmVzZW50LgotICAgMi4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCBiZWluZyB0aGUgbGFzdCBiZmQgcmVhZCBuZWNlc3NhcmlseSBtZWFucwotICAgICAgdGhhdCB5b3UgYXJlIHRoZSBsYXN0IGJmZCBjbG9zZWQuCi0gICAzLiBEb2luZyBpdCBvbiBhICJzd2FwIGluIiBob29rIGRlcGVuZHMgb24gd2hlbiB0aGUgInN3YXAgaW4iIGlzIGNhbGxlZCwKLSAgICAgIGFuZCBob3cgb2Z0ZW4sIGV0Yy4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCB0aGVyZSBpc24ndCBhIGhvbGUgaGVyZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW4xOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgIT0gMCkgLyogd2UgYWxyZWFkeSBoYXZlIGEgdG9jLCBzbyBnbyBob21lICovCi0gICAgcmV0dXJuOwotCi0gIGlmIChzdHJjbXAoaW4tPl9uLl9uX25hbWUsICIudG9jIikgPT0gMCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKCBhYmZkICwgVE9DX1NFQ1RJT05fTkFNRSk7Ci0gICAgICBpZiAocyAhPSBOVUxMKSAKLQl7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgOwotCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVE9DX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXsKLQkgIC8qIEZJWE1FOiBzZXQgYXBwcm9wcmlhdGUgYmZkIGVycm9yICovCi0JICBhYm9ydCgpOwotCX0KLQotICAgICAgLyogc2F2ZSB0aGUgYmZkIGZvciBsYXRlciBhbGxvY2F0aW9uICovCi0gICAgICBiZmRfb2ZfdG9jX293bmVyID0gYWJmZDsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLXN0YXRpYyBib29sZWFuIHBwY19kb19sYXN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICpwcGNfZ2V0X2xhc3QgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2RvX2xhc3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQgPT0gYmZkX29mX3RvY19vd25lcikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJmZCAqCi1wcGNfZ2V0X2xhc3QoKQotewotICByZXR1cm4gYmZkX29mX3RvY19vd25lcjsKLX0KLQotLyogdGhpcyBwaWVjZSBvZiBtYWNoaW5lcnkgZXhpc3RzIG9ubHkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJmZCB0aGF0IGhvbGRzCi0gICB0aGUgdG9jIHNlY3Rpb24gaXMgd3JpdHRlbiBsYXN0LiAKLQotICAgVGhpcyBkb2VzIGRlcGVuZCBvbiBiZmRfbWFrZV9zZWN0aW9uIGF0dGFjaGluZyBhIG5ldyBzZWN0aW9uIHRvIHRoZQotICAgZW5kIG9mIHRoZSBzZWN0aW9uIGxpc3QgZm9yIHRoZSBiZmQuIAotCi0gICBUaGlzIGlzIG90aGVyd2lzZSBpbnRlbmRlZCB0byBiZSBmdW5jdGlvbmFsbHkgdGhlIHNhbWUgYXMgCi0gICBjb2ZmbGluay5jOl9iZmRfY29mZl9maW5hbF9saW5rKCkuIEl0IGlzIHNwZWNpZmljYWxseSBkaWZmZXJlbnQgb25seSAKLSAgIHdoZXJlIHRoZSBQT1dFUlBDX0xFX1BFIG1hY3JvIG1vZGlmaWVzIHRoZSBjb2RlLiBJdCBpcyBsZWZ0IGluIGFzIGEgCi0gICBwcmVjaXNlIGZvcm0gb2YgY29tbWVudC4ga3JrQGN5Z251cy5jb20KLSovCi0KLQotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLWJvb2xlYW4KLXBwY19iZmRfY29mZl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICBib29sZWFuIGRlYnVnX21lcmdlX2FsbG9jYXRlZDsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IHJlbHN6OwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCBsaW5lc3o7Ci0gIGJmZCAqc3ViOwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgY2hhciBzdHJidWZbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby5sYXN0X2JmX2luZGV4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbyA9IGluZm87Ci0KLSAgZmluZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0ICgmZmluZm8uZGVidWdfbWVyZ2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSB0cnVlOwotCi0gIC8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVycyBhbmQgcmVsb2NhdGlvbiBlbnRyaWVzIHJlcXVpcmVkIGZvciB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBTZXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgcmVsb2NzLiAgKi8KLSAgcmVsX2ZpbGVwb3MgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0gIG1heF9jb250ZW50c19zaXplID0gMDsKLSAgbWF4X2xpbmVub19jb3VudCA9IDA7Ci0gIG1heF9yZWxvY19jb3VudCA9IDA7Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0KLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgIHJlbF9maWxlcG9zICs9IG8tPnJlbG9jX2NvdW50ICogcmVsc3o7Ci0JfQotICAgIH0KLQotICAvKiBJZiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXJzIHdlCi0gICAgIG5lZWQgdG8ga2VlcC4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIC8qIFdlIHVzZSBzZWN0aW9uX2NvdW50ICsgMSwgcmF0aGVyIHRoYW4gc2VjdGlvbl9jb3VudCwgYmVjYXVzZQotICAgICAgICAgdGhlIHRhcmdldF9pbmRleCBmaWVsZHMgYXJlIDEgYmFzZWQuICAqLwotICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0KLQkoKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCi0JIGJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8pKSk7Ci0gICAgICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzID0gTlVMTDsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLwotICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMCkKLQlvLT5saW5lX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKLQkgIGxpbmVfZmlsZXBvcyArPSBvLT5saW5lbm9fY291bnQgKiBsaW5lc3o7Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgIT0gMCkKLQl7Ci0JICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKLSAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKLSAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQotICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KLSAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKLSAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgotCi0JICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KLQkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LAotCSAgICAgYnV0IG9ubHkgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCBpcyBub3QgdGhlCi0JICAgICBjb21tb24gY2FzZS4gICovCi0JICBCRkRfQVNTRVJUIChpbmZvLT5yZWxvY2F0ZWFibGUpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID0KLQkgICAgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID0KLQkgICAgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAotCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCi0JICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0KLSAgICAgIC8qIFJlc2V0IHRoZSByZWxvYyBhbmQgbGluZW5vIGNvdW50cywgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8KLQkgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgIH0KLQotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gbGluZV9maWxlcG9zOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYW4gaW5wdXQgQkZELiAgVGFrZQotICAgICB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYXIgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGRzIG9mIGFsbCB0aGUKLSAgICAgaW5wdXQgQkZEJ3MuICAqLwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgICAgIHN6ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCW1heF9zeW1fY291bnQgPSBzejsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBidWZmZXJzIHVzZWQgd2hpbGUgbGlua2luZy4gICovCi0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKLSAgZmluZm8uc2VjX3B0cnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkJICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKLQkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7Ci0gIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAotCQkJCSAgICAgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCQkJICAgICBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0gIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnNlY19wdHJzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc3ltX2luZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IGZpbmZvLm91dHN5bXMgPT0gTlVMTAotICAgICAgfHwgKGZpbmZvLmxpbmVub3MgPT0gTlVMTCAmJiBtYXhfbGluZW5vX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplID4gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NfY291bnQgPiAwKQotICAgICAgfHwgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAmJiBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAotCSAgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHBvc2l0aW9uIG9mIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIGV4Y2VwdCB0aGF0Ci0gICAgIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlcmVmb3JlIHdlIGRvbid0Ci0gICAgIGtub3cgd2hlcmUgdGhlIHN0cmluZyB0YWJsZSBzdGFydHMuICBXZSBqdXN0IGJ1aWxkIHRoZSBzdHJpbmcKLSAgICAgdGFibGUgaW4gbWVtb3J5IGFzIHdlIGdvIGFsb25nLiAgV2UgcHJvY2VzcyBhbGwgdGhlIHJlbG9jYXRpb25zCi0gICAgIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSAwOwotCi0gIGlmIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0jaWZkZWYgUE9XRVJQQ19MRV9QRQotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1biAmJiAhcHBjX2RvX2xhc3Qoc3ViKSkKLSNlbHNlCi0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotI2VuZGlmCi0JCXsKLQkJICBpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsICZmaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgewotICAgIGJmZCogbGFzdF9vbmUgPSBwcGNfZ2V0X2xhc3QoKTsKLSAgICBpZiAobGFzdF9vbmUpCi0gICAgICB7Ci0JaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIGxhc3Rfb25lKSkKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgfQotICAgIGxhc3Rfb25lLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgfQotI2VuZGlmCi0KLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IF9iZmRfY29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgICAgIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgICAgIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gICAgICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgICAgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiAgV3JpdGUgaXQgb3V0IGFnYWluIGlmCi0gICAgIG5lY2Vzc2FyeS4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmICh1bnNpZ25lZCBpbnQpIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlICE9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIGZpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0sCi0JCQkgICAoUFRSKSAmZmluZm8pOwotICBpZiAoZmluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBvdXRzeW1zIGJ1ZmZlciBpcyB1c2VkIGJ5IF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLiAgKi8KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdwotCSB0aGUgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuCi0JIGZpbmFsbHkgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKChiZmRfYnl0ZSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeikpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgIGJmZF9ieXRlICplcmVsOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzOwotCSAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfaGFzaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoKCpyZWxfaGFzaCktPmluZHggPj0gMCk7Ci0JCSAgaXJlbC0+cl9zeW1uZHggPSAoKnJlbF9oYXNoKS0+aW5keDsKLQkJfQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQkgICAgYWJmZCkgIT0gcmVsc3ogKiBvLT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSAgICAgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3opLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsCi0JCSAgICBfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zdHJ0YWIpICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzdHJidWYpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLSAgICAgIGlmIChiZmRfd3JpdGUgKHN0cmJ1ZiwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkgIT0gU1RSSU5HX1NJWkVfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotCi0gIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCi0gICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZGVidWdfbWVyZ2VfYWxsb2NhdGVkKQotICAgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOwotICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLnNlY19wdHJzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjX3B0cnMpOwotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0MCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSBieSBhbHRlcm5hdGl2ZV90YXJnZXQgZmllbGQuICAqLwotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTTsKLSNlbmRpZgotCi0vKiBUaGUgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IGxlYWQgdGhlIG91dHNpZGUgd29ybGQgdG8gYWxsIG9mIHRoZSBhYm92ZS4gKi8KLQotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNID0KLXsKLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAkJLyogbmFtZSBvciBjb2ZmLWFybS1saXR0bGUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogRklYTUU6IG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIAotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAKLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIC8qIF9iZmRfZHVtbXlfdGFyZ2V0ICovIGNvZmZfb2JqZWN0X3AgfSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0gIAotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIC8qIEFsdGVybmF0aXZlX3RhcmdldC4gICovCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLSAgJiBUQVJHRVRfQklHX1NZTSwKLSNlbHNlCi0gIE5VTEwsCi0jZW5kaWYKLSAgCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQotewotICBUQVJHRVRfQklHX05BTUUsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBGSVhNRTogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCAvKiBfYmZkX2R1bW15X3RhcmdldCAqLyBjb2ZmX29iamVjdF9wIH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLQotICAvKiBBbHRlcm5hdGl2ZV90YXJnZXQuICAqLwotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0gICYgVEFSR0VUX0xJVFRMRV9TWU0sCi0jZWxzZQotICBOVUxMLAotI2VuZGlmCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcnM2MDAwLmMgYi9iZmQvY29mZi1yczYwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4NTYzZi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1yczYwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMjcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJQk0gUlMvNjAwMCAiWENPRkYiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSwgCi0gICAgIGFuZCBKb2huIEdpbG1vcmUuCi0gICBBcmNoaXZlIHN1cHBvcnQgZnJvbSBEYW1vbiBBLiBQZXJtZXplbC4KLSAgIENvbnRyaWJ1dGVkIGJ5IElCTSBDb3Jwb3JhdGlvbiBhbmQgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW50ZXJuYWxjb2ZmLmggYW5kIGNvZmZjb2RlLmggbW9kaWZ5IHRoZW1zZWx2ZXMgYmFzZWQgb24gdGhpcyBmbGFnLiAgKi8KLSNkZWZpbmUgUlM2MDAwQ09GRl9DIDEKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3JzNjAwMC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotCi1zdGF0aWMgYm9vbGVhbiB4Y29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9ydHlwZTJob3d0bwotICBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp4Y29mZl9hcmNoaXZlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBQVFIgeGNvZmZfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmQgKnhjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBpbnQgeGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbm9ybWFsaXplX2ZpbGVuYW1lIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl93cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQwKLS8qIFdlIHVzZSBvdXIgb3duIHRkYXRhIHR5cGUuICBJdHMgZmlyc3QgZmllbGQgaXMgdGhlIENPRkYgdGRhdGEgdHlwZSwKLSAgIHNvIHRoZSBDT0ZGIHJvdXRpbmVzIGFyZSBjb21wYXRpYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID0KLSAgICAoKHN0cnVjdCB4Y29mZl90ZGF0YSAqKQotICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl90ZGF0YSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLSAgY29mZi0+c3ltYm9scyA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIGNvZmYtPmNvbnZlcnNpb25fdGFibGUgPSAodW5zaWduZWQgaW50ICopIE5VTEw7Ci0gIGNvZmYtPnJhd19zeW1lbnRzID0gKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikgTlVMTDsKLSAgY29mZi0+cmVsb2NiYXNlID0gMDsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+bW9kdHlwZSA9ICgnMScgPDwgOCkgfCAnTCc7Ci0KLSAgLyogV2Ugc2V0IGNwdXR5cGUgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgbm90IGJlZW4KLSAgICAgaW5pdGlhbGl6ZWQuICAqLwotICB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSA9IC0xOwotCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHMgPSBOVUxMOwotICB4Y29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5kaWNlcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgWENPRkYgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKml4LCAqb3g7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgaWYgKGliZmQtPnh2ZWMgIT0gb2JmZC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaXggPSB4Y29mZl9kYXRhIChpYmZkKTsKLSAgb3ggPSB4Y29mZl9kYXRhIChvYmZkKTsKLSAgb3gtPmZ1bGxfYW91dGhkciA9IGl4LT5mdWxsX2FvdXRoZHI7Ci0gIG94LT50b2MgPSBpeC0+dG9jOwotICBpZiAoaXgtPnNudG9jID09IDApCi0gICAgb3gtPnNudG9jID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaWJmZCwgaXgtPnNudG9jKTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQlveC0+c250b2MgPSAwOwotICAgICAgZWxzZQotCW94LT5zbnRvYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0gIGlmIChpeC0+c25lbnRyeSA9PSAwKQotICAgIG94LT5zbmVudHJ5ID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaWJmZCwgaXgtPnNuZW50cnkpOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCW94LT5zbmVudHJ5ID0gMDsKLSAgICAgIGVsc2UKLQlveC0+c25lbnRyeSA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0gIG94LT50ZXh0X2FsaWduX3Bvd2VyID0gaXgtPnRleHRfYWxpZ25fcG93ZXI7Ci0gIG94LT5kYXRhX2FsaWduX3Bvd2VyID0gaXgtPmRhdGFfYWxpZ25fcG93ZXI7Ci0gIG94LT5tb2R0eXBlID0gaXgtPm1vZHR5cGU7Ci0gIG94LT5jcHV0eXBlID0gaXgtPmNwdXR5cGU7Ci0gIG94LT5tYXhkYXRhID0gaXgtPm1heGRhdGE7Ci0gIG94LT5tYXhzdGFjayA9IGl4LT5tYXhzdGFjazsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEkgZG9uJ3QgdGhpbmsgWENPRkYgcmVhbGx5IGhhcyBhIG5vdGlvbiBvZiBsb2NhbCBsYWJlbHMgYmFzZWQgb24KLSAgIG5hbWUuICBUaGlzIHdpbGwgbWVhbiB0aGF0IGxkIC1YIGRvZXNuJ3QgYWN0dWFsbHkgc3RyaXAgYW55dGhpbmcuCi0gICBUaGUgQUlYIG5hdGl2ZSBsaW5rZXIgZG9lcyBub3QgaGF2ZSBhIC1YIG9wdGlvbiwgYW5kIGl0IGlnbm9yZXMgdGhlCi0gICAteCBvcHRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogVGhlIFhDT0ZGIHJlbG9jIHRhYmxlLiAgQWN0dWFsbHksIFhDT0ZGIHJlbG9jYXRpb25zIHNwZWNpZnkgdGhlCi0gICBiaXRzaXplIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHNpZ25lZCBvciBub3QsIGFsb25nIHdpdGggYQotICAgY29udmVudGlvbmFsIHR5cGUuICBUaGlzIHRhYmxlIGlzIGZvciB0aGUgdHlwZXMsIHdoaWNoIGFyZSB1c2VkIGZvcgotICAgZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIHB1dHRpbmcgaW4gdGhlIHJlbG9jLiAgTWFueSBvZiB0aGVzZQotICAgcmVsb2NzIG5lZWQgc3BlY2lhbF9mdW5jdGlvbiBlbnRyaWVzLCB3aGljaCBJIGhhdmUgbm90IHdyaXR0ZW4uICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KLSAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVE9DIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcyBpcy4gICovCi0gIEhPV1RPICg0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SVEIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRXh0ZXJuYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9HTCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvY2FsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVENMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoNyksCi0gIAotICAvKiBOb24gbW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQkEiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoOSksCi0KLSAgLyogTm9uIG1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4YSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQlIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoMHhiKSwKLQotICAvKiBJbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4YywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkwiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHhkLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STEEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEVNUFRZX0hPV1RPICgweGUpLAotICAKLSAgLyogTm9uLXJlbG9jYXRpbmcgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKDB4ZiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVGIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsICAgICAJICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEVNUFRZX0hPV1RPICgweDEwKSwKLSAgRU1QVFlfSE9XVE8gKDB4MTEpLAotICAKLSAgLyogVE9DIHJlbGF0aXZlIGluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHgxMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgbG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4MTMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTEEiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkkiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJBIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgYWJzb2x1dGUgaW5kaXJlY3QuICAqLwotICBIT1dUTyAoMHgxNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ0FJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxNywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTksCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQUMiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxYSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCUiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxYiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJSQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBUaGVzZSBhcmUgdGhlIGZpcnN0IHR3byBsaWtlIHRoZSBhYm92ZSBidXQgZm9yIDE2LWJpdCByZWxvY3MuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgeGNvZmZfaG93dG9fdGFibGVfMTZbXSA9Ci17Ci0gIC8qIFN0YW5kYXJkIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDAsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1BPU18xNiIsICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24sIGJ1dCBzdG9yZSBuZWdhdGl2ZSB2YWx1ZS4gICovCi0gIEhPV1RPICgxLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAtMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfTkVHXzE2IiwgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPICgyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUxfMTYiLCAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotfTsKLSAgCi1zdGF0aWMgdm9pZAoteGNvZmZfcnR5cGUyaG93dG8gKHJlbGVudCwgaW50ZXJuYWwpCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbDsKLXsKLSAgcmVsZW50LT5ob3d0byA9IHhjb2ZmX2hvd3RvX3RhYmxlICsgaW50ZXJuYWwtPnJfdHlwZTsKLQotICBpZiAocmVsZW50LT5ob3d0by0+Yml0c2l6ZSAhPSAoKHVuc2lnbmVkIGludCkgaW50ZXJuYWwtPnJfc2l6ZSAmIDB4MWYpICsgMQotICAgICAgJiYgKGludGVybmFsLT5yX3R5cGUgCi0JICA8IHNpemVvZih4Y29mZl9ob3d0b190YWJsZV8xNikvc2l6ZW9mKHhjb2ZmX2hvd3RvX3RhYmxlXzE2WzBdKSkpCi0gICAgcmVsZW50LT5ob3d0byA9IHhjb2ZmX2hvd3RvX3RhYmxlXzE2ICsgaW50ZXJuYWwtPnJfdHlwZTsKLQotICAvKiBUaGUgcl9zaXplIGZpZWxkIG9mIGFuIFhDT0ZGIHJlbG9jIGVuY29kZXMgdGhlIGJpdHNpemUgb2YgdGhlCi0gICAgIHJlbG9jYXRpb24sIGFzIHdlbGwgYXMgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGlzIHNpZ25lZCBvciBub3QuCi0gICAgIERvdWJsZWNoZWNrIHRoYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUKLSAgICAgdHlwZSBtYXRjaGVzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAocmVsZW50LT5ob3d0by0+Yml0c2l6ZSAhPSAoKHVuc2lnbmVkIGludCkgaW50ZXJuYWwtPnJfc2l6ZSAmIDB4MWYpICsgMSkKLSAgICBhYm9ydCAoKTsKLSNpZiAwCi0gIGlmICgoaW50ZXJuYWwtPnJfc2l6ZSAmIDB4ODApICE9IDAKLSAgICAgID8gKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLSAgICAgIDogKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi14Y29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CMjY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzB4YV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMjY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzhdOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoKLSAgICAgIHJldHVybiAmeGNvZmZfaG93dG9fdGFibGVbM107Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiAmeGNvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoaW50ZXJuYWwsIGhvd3RvKQkJCQkJXAotICB7CQkJCQkJCQkJXAotICAgIGludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlOwkJCQkJXAotICAgIGludGVybmFsLnJfc2l6ZSA9CQkJCQkJCVwKLSAgICAgICgoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZAkJXAotCT8gMHg4MAkJCQkJCQkJXAotCTogMCkJCQkJCQkJCVwKLSAgICAgICB8IChob3d0by0+Yml0c2l6ZSAtIDEpKTsJCQkJCQlcCi0gIH0KLQwKLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgeGNvZmZfcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotCi0jZGVmaW5lIGNvZmZfbWtvYmplY3QgeGNvZmZfbWtvYmplY3QKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0MCi0vKiBYQ09GRiBhcmNoaXZlIHN1cHBvcnQuICBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIGNvZGUgd2FzIGJ5Ci0gICBEYW1vbiBBLiBQZXJtZXplbC4gIEl0IHdhcyBlbmhhbmNlZCB0byBwZXJtaXQgY3Jvc3Mgc3VwcG9ydCwgYW5kCi0gICB3cml0aW5nIGFyY2hpdmUgZmlsZXMsIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBYQ09GRiB1c2VzIGl0cyBvd24gYXJjaGl2ZSBmb3JtYXQuICBFdmVyeXRoaW5nIGlzIGhvb2tlZCB0b2dldGhlcgotICAgd2l0aCBmaWxlIG9mZnNldCBsaW5rcywgc28gaXQgaXMgcG9zc2libGUgdG8gcmFwaWRseSB1cGRhdGUgYW4KLSAgIGFyY2hpdmUgaW4gcGxhY2UuICBPZiBjb3Vyc2UsIHdlIGRvbid0IGRvIHRoYXQuICBBbiBYQ09GRiBhcmNoaXZlCi0gICBoYXMgYSByZWFsIGZpbGUgaGVhZGVyLCBub3QganVzdCBhbiBBUk1BRyBzdHJpbmcuICBUaGUgc3RydWN0dXJlIG9mCi0gICB0aGUgZmlsZSBoZWFkZXIgYW5kIG9mIGVhY2ggYXJjaGl2ZSBoZWFkZXIgYXBwZWFyIGJlbG93LgotCi0gICBBbiBYQ09GRiBhcmNoaXZlIGFsc28gaGFzIGEgbWVtYmVyIHRhYmxlLCB3aGljaCBpcyBhIGxpc3Qgb2YKLSAgIGVsZW1lbnRzIGluIHRoZSBhcmNoaXZlICh5b3UgY2FuIGdldCB0aGF0IGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUKLSAgIGxpbmtlZCBsaXN0LCBidXQgeW91IGhhdmUgdG8gcmVhZCBhIGxvdCBtb3JlIG9mIHRoZSBmaWxlKS4gIFRoZQotICAgbWVtYmVyIHRhYmxlIGhhcyBhIG5vcm1hbCBhcmNoaXZlIGhlYWRlciB3aXRoIGFuIGVtcHR5IG5hbWUuICBJdCBpcwotICAgbm9ybWFsbHkgKGFuZCBwZXJoYXBzIG11c3QgYmUpIHRoZSBzZWNvbmQgdG8gbGFzdCBlbnRyeSBpbiB0aGUKLSAgIGFyY2hpdmUuICBUaGUgbWVtYmVyIHRhYmxlIGRhdGEgaXMgYWxtb3N0IHByaW50YWJsZSBBU0NJSS4gIEl0Ci0gICBzdGFydHMgd2l0aCBhIDEyIGNoYXJhY3RlciBkZWNpbWFsIHN0cmluZyB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCi0gICBlbnRyaWVzIGluIHRoZSB0YWJsZS4gIEZvciBlYWNoIGVudHJ5IGl0IGhhcyBhIDEyIGNoYXJhY3RlciBkZWNpbWFsCi0gICBzdHJpbmcgd2hpY2ggaXMgdGhlIG9mZnNldCBpbiB0aGUgYXJjaGl2ZSBvZiB0aGF0IG1lbWJlci4gIFRoZXNlCi0gICBlbnRyaWVzIGFyZSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyB3aGljaAotICAgYXJlIHRoZSBtZW1iZXIgbmFtZXMgZm9yIGVhY2ggZW50cnkuCi0KLSAgIEZpbmFsbHksIGFuIFhDT0ZGIGFyY2hpdmUgaGFzIGEgZ2xvYmFsIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMgd2hhdAotICAgd2UgY2FsbCB0aGUgYXJtYXAuICBUaGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSBoYXMgYSBub3JtYWwgYXJjaGl2ZQotICAgaGVhZGVyIHdpdGggYW4gZW1wdHkgbmFtZS4gIEl0IGlzIG5vcm1hbGx5IChhbmQgcGVyaGFwcyBtdXN0IGJlKQotICAgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFyY2hpdmUuICBUaGUgY29udGVudHMgc3RhcnQgd2l0aCBhIGZvdXIgYnl0ZQotICAgYmluYXJ5IG51bWJlciB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICBUaGlzIGlzIGZvbGxvd2VkIGJ5Ci0gICBhIHRoYXQgbWFueSBmb3VyIGJ5dGUgYmluYXJ5IG51bWJlcnM7IGVhY2ggaXMgdGhlIGZpbGUgb2Zmc2V0IG9mIGFuCi0gICBlbnRyeSBpbiB0aGUgYXJjaGl2ZS4gIFRoZXNlIG51bWJlcnMgYXJlIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mCi0gICBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgd2hpY2ggYXJlIHN5bWJvbCBuYW1lcy4KLQotICAgQUlYIDQuMyBpbnRyb2R1Y2VkIGEgbmV3IGFyY2hpdmUgZm9ybWF0IHdoaWNoIGNhbiBoYW5kbGUgbGFyZ2VyCi0gICBmaWxlcyBhbmQgYWxzbyAzMi0gYW5kIDY0LWJpdCBvYmplY3RzIGluIHRoZSBzYW1lIGFyY2hpdmUuICBUaGUKLSAgIHRoaW5ncyBzYWlkIGFib3ZlIHJlbWFpbiB0cnVlIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vdyBtb3JlIHRoYW4KLSAgIG9uZSBnbG9iYWwgc3ltYm9sIHRhYmxlLiAgVGhlIG9uZSBpcyB1c2VkIHRvIGluZGV4IDMyLWJpdCBvYmplY3RzLAotICAgdGhlIG90aGVyIGZvciA2NC1iaXQgb2JqZWN0cy4KLQotICAgVGhlIG5ldyBhcmNoaXZlcyAocmVjb2duaXphYmxlIGJ5IHRoZSBuZXcgQVJNQUcgc3RyaW5nKSBoYXMgbGFyZ2VyCi0gICBmaWVsZCBsZW5ndGhzIHNvIHRoYXQgd2UgY2Fubm90IHJlYWxseSBzaGFyZSBhbnkgY29kZS4gIEFsc28gd2UgaGF2ZQotICAgdG8gdGFrZSBjYXJlIHRoYXQgd2UgYXJlIG5vdCBnZW5lcmF0aW5nIHRoZSBuZXcgZm9ybSBvZiBhcmNoaXZlcwotICAgb24gQUlYIDQuMiBvciBlYXJsaWVyIHN5c3RlbXMuICAqLwotCi0vKiBYQ09GRiBhcmNoaXZlcyB1c2UgdGhpcyBhcyBhIG1hZ2ljIHN0cmluZy4gIE5vdGUgdGhhdCBib3RoIHN0cmluZ3MKLSAgIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLiAgKi8KLQotI2RlZmluZSBYQ09GRkFSTUFHICAgICI8YWlhZmY+XDAxMiIKLSNkZWZpbmUgWENPRkZBUk1BR0JJRyAiPGJpZ2FmPlwwMTIiCi0jZGVmaW5lIFNYQ09GRkFSTUFHICAgOAotCi0vKiBUaGlzIHRlcm1pbmF0ZXMgYW4gWENPRkYgYXJjaGl2ZSBtZW1iZXIgbmFtZS4gICovCi0KLSNkZWZpbmUgWENPRkZBUkZNQUcgImBcMDEyIgotI2RlZmluZSBTWENPRkZBUkZNQUcgMgotCi0vKiBYQ09GRiBhcmNoaXZlcyBzdGFydCB3aXRoIHRoaXMgKHByaW50YWJsZSkgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyCi17Ci0gIC8qIE1hZ2ljIHN0cmluZy4gICovCi0gIGNoYXIgbWFnaWNbU1hDT0ZGQVJNQUddOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbWVtYmVyIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHN5bW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZmlyc3RtZW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbGFzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbGFzdG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgb24gdGhlIGZyZWUgbGlzdCAoZGVjaW1hbCBBU0NJSQotICAgICBzdHJpbmcpLiAgKi8KLSAgY2hhciBmcmVlb2ZmWzEyXTsKLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0ZJTEVfSERSICg1ICogMTIgKyBTWENPRkZBUk1BRykKLQotLyogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIGJpZyBhcmNoaXZlIGZvcm1hdC4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9maWxlX2hkcl9iaWcKLXsKLSAgLyogTWFnaWMgc3RyaW5nLiAgKi8KLSAgY2hhciBtYWdpY1tTWENPRkZBUk1BR107Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBtZW1iZXIgdGFibGUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbWVtb2ZmWzIwXTsKLQotICAvKiBPZmZzZXQgb2YgdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUgZm9yIDMyLWJpdCBvYmplY3RzIChkZWNpbWFsIEFTQ0lJCi0gICAgIHN0cmluZykuICAqLwotICBjaGFyIHN5bW9mZlsyMF07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGZvciA2NC1iaXQgb2JqZWN0cyAoZGVjaW1hbCBBU0NJSQotICAgICBzdHJpbmcpLiAgKi8KLSAgY2hhciBzeW1vZmY2NFsyMF07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZmlyc3RtZW1vZmZbMjBdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbGFzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbGFzdG1lbW9mZlsyMF07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgb24gdGhlIGZyZWUgbGlzdCAoZGVjaW1hbCBBU0NJSQotICAgICBzdHJpbmcpLiAgKi8KLSAgY2hhciBmcmVlb2ZmWzIwXTsKLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0ZJTEVfSERSX0JJRyAoNiAqIDIwICsgU1hDT0ZGQVJNQUcpCi0KLQotLyogRWFjaCBYQ09GRiBhcmNoaXZlIG1lbWJlciBzdGFydHMgd2l0aCB0aGlzIChwcmludGFibGUpIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9oZHIKLXsKLSAgLyogRmlsZSBzaXplIG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBzaXplWzEyXTsKLQotICAvKiBGaWxlIG9mZnNldCBvZiBuZXh0IGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG5leHRvZmZbMTJdOwotCi0gIC8qIEZpbGUgb2Zmc2V0IG9mIHByZXZpb3VzIGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHByZXZvZmZbMTJdOwotCi0gIC8qIEZpbGUgbXRpbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZGF0ZVsxMl07Ci0KLSAgLyogRmlsZSBVSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgdWlkWzEyXTsKLQotICAvKiBGaWxlIEdJRCAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBnaWRbMTJdOwotCi0gIC8qIEZpbGUgbW9kZSAob2N0YWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbW9kZVsxMl07Ci0KLSAgLyogTGVuZ3RoIG9mIGZpbGUgbmFtZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBuYW1sZW5bNF07Ci0KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgZm9sbG93ZWQgYnkgdGhlIGZpbGUgbmFtZS4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICAgIG5hbWUgaXMgZ2l2ZW4gaW4gdGhlIG5hbWxlbiBmaWVsZC4gIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMKLSAgICAgb2RkLCB0aGUgbmFtZSBpcyBmb2xsb3dlZCBieSBhIG51bGwgYnl0ZS4gIFRoZSBuYW1lIGFuZCBvcHRpb25hbAotICAgICBudWxsIGJ5dGUgYXJlIGZvbGxvd2VkIGJ5IFhDT0ZGQVJGTUFHLCB3aGljaCBpcyBub3QgaW5jbHVkZWQgaW4KLSAgICAgbmFtbGVuLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlIG1lbWJlciBmb2xsb3c7IHRoZSBudW1iZXIgb2YKLSAgICAgYnl0ZXMgaXMgZ2l2ZW4gaW4gdGhlIHNpemUgZmllbGQuICAqLwotfTsKLQotI2RlZmluZSBTSVpFT0ZfQVJfSERSICg3ICogMTIgKyA0KQotCi0vKiBUaGUgZXF1aXZhbGVudCBmb3IgdGhlIGJpZyBhcmNoaXZlIGZvcm1hdC4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9oZHJfYmlnCi17Ci0gIC8qIEZpbGUgc2l6ZSBub3QgaW5jbHVkaW5nIHRoZSBoZWFkZXIgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgc2l6ZVsyMF07Ci0KLSAgLyogRmlsZSBvZmZzZXQgb2YgbmV4dCBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBuZXh0b2ZmWzIwXTsKLQotICAvKiBGaWxlIG9mZnNldCBvZiBwcmV2aW91cyBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBwcmV2b2ZmWzIwXTsKLQotICAvKiBGaWxlIG10aW1lIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIGRhdGVbMTJdOwotCi0gIC8qIEZpbGUgVUlEIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHVpZFsxMl07Ci0KLSAgLyogRmlsZSBHSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZ2lkWzEyXTsKLQotICAvKiBGaWxlIG1vZGUgKG9jdGFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG1vZGVbMTJdOwotCi0gIC8qIExlbmd0aCBvZiBmaWxlIG5hbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbmFtbGVuWzRdOwotCi0gIC8qIFRoaXMgc3RydWN0dXJlIGlzIGZvbGxvd2VkIGJ5IHRoZSBmaWxlIG5hbWUuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgICBuYW1lIGlzIGdpdmVuIGluIHRoZSBuYW1sZW4gZmllbGQuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGlzCi0gICAgIG9kZCwgdGhlIG5hbWUgaXMgZm9sbG93ZWQgYnkgYSBudWxsIGJ5dGUuICBUaGUgbmFtZSBhbmQgb3B0aW9uYWwKLSAgICAgbnVsbCBieXRlIGFyZSBmb2xsb3dlZCBieSBYQ09GRkFSRk1BRywgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluCi0gICAgIG5hbWxlbi4gIFRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBtZW1iZXIgZm9sbG93OyB0aGUgbnVtYmVyIG9mCi0gICAgIGJ5dGVzIGlzIGdpdmVuIGluIHRoZSBzaXplIGZpZWxkLiAgKi8KLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0hEUl9CSUcgKDMgKiAyMCArIDQgKiAxMiArIDQpCi0KLQotLyogV2Ugb2Z0ZW4gaGF2ZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBvbGQgYW5kIGJpZyBmaWxlIGZvcm1hdC4KLSAgIE1ha2UgaXQgYSBiaXQgY2xlYW5lci4gIFdlIGNhbiB1c2UgYHhjb2ZmX2FyZGF0YScgaGVyZSBiZWNhdXNlIHRoZQotICAgYGhkcicgbWVtYmVyIGhhcyB0aGUgc2FtZSBzaXplIGFuZCBwb3NpdGlvbiBpbiBib3RoIGZvcm1hdHMuICAqLwotI2RlZmluZSB4Y29mZl9iaWdfZm9ybWF0X3AoYWJmZCkgXAotICAoeGNvZmZfYXJkYXRhIChhYmZkKS0+bWFnaWNbMV0gPT0gJ2InKQotCi0vKiBXZSBzdG9yZSBhIGNvcHkgb2YgdGhlIHhjb2ZmX2FyX2ZpbGVfaGRyIGluIHRoZSB0ZGF0YSBmaWVsZCBvZiB0aGUKLSAgIGFydGRhdGEgc3RydWN0dXJlLiAgU2ltaWxhciBmb3IgdGhlIGJpZyBhcmNoaXZlLiAgKi8KLSNkZWZpbmUgeGNvZmZfYXJkYXRhKGFiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhKQotI2RlZmluZSB4Y29mZl9hcmRhdGFfYmlnKGFiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHJfYmlnICopIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSkKLQotLyogV2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSB4Y29mZl9hcl9oZHIgaW4gdGhlIGFyZWx0X2RhdGEgZmllbGQgb2YgYW4KLSAgIGFyY2hpdmUgZWxlbWVudC4gIFNpbWlsYXIgZm9yIHRoZSBiaWcgYXJjaGl2ZS4gICovCi0jZGVmaW5lIGFyY2hfZWx0ZGF0YShiZmQpICgoc3RydWN0IGFyZWx0ZGF0YSAqKSAoKGJmZCktPmFyZWx0X2RhdGEpKQotI2RlZmluZSBhcmNoX3hoZHIoYmZkKSBcCi0gICgoc3RydWN0IHhjb2ZmX2FyX2hkciAqKSBhcmNoX2VsdGRhdGEgKGJmZCktPmFyY2hfaGVhZGVyKQotI2RlZmluZSBhcmNoX3hoZHJfYmlnKGJmZCkgXAotICAoKHN0cnVjdCB4Y29mZl9hcl9oZHJfYmlnICopIGFyY2hfZWx0ZGF0YSAoYmZkKS0+YXJjaF9oZWFkZXIpCi0KLS8qIFhDT0ZGIGFyY2hpdmVzIGRvIG5vdCBoYXZlIGFueXRoaW5nIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuCi0gICBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotI2RlZmluZSB4Y29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQotI2RlZmluZSB4Y29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIHhjb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLQotLyogV2UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgZ2V0X2VsdF9hdF9pbmRleCByb3V0aW5lLiAgKi8KLQotI2RlZmluZSB4Y29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0KLS8qIFhDT0ZGIGFyY2hpdmVzIGRvIG5vdCBoYXZlIGEgdGltZXN0YW1wLiAgKi8KLQotI2RlZmluZSB4Y29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLS8qIFJlYWQgaW4gdGhlIGFybWFwIG9mIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgb2ZmOwotICBzaXplX3QgbmFtbGVuOwotICBiZmRfc2l6ZV90eXBlIHN6OwotICBiZmRfYnl0ZSAqY29udGVudHMsICpjZW5kOwotICB1bnNpZ25lZCBpbnQgYywgaTsKLSAgY2Fyc3ltICphcnN5bTsKLSAgYmZkX2J5dGUgKnA7Ci0KLSAgaWYgKHhjb2ZmX2FyZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9iaWdfZm9ybWF0X3AgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgZm9yIHRoZSBvbGQgZm9ybWF0LiAgKi8KLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHIgaGRyOwotCi0gICAgICBvZmYgPSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YSAoYWJmZCktPnN5bW9mZiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIGlmIChvZmYgPT0gMCkKLQl7Ci0JICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmYsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIHN5bWJvbCB0YWJsZSBzdGFydHMgd2l0aCBhIG5vcm1hbCBhcmNoaXZlIGhlYWRlci4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTa2lwIHRoZSBuYW1lIChub3JtYWxseSBlbXB0eSkuICAqLwotICAgICAgbmFtbGVuID0gc3RydG9sIChoZHIubmFtbGVuLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoKG5hbWxlbiArIDEpICYgfjEpICsgU1hDT0ZGQVJGTUFHLCBTRUVLX0NVUikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN6ID0gc3RydG9sIChoZHIuc2l6ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGZvciB0aGUgbmV3IGZvcm1hdC4gICovCi0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyX2JpZyBoZHI7Ci0KLSAgICAgIG9mZiA9IHN0cnRvbCAoeGNvZmZfYXJkYXRhX2JpZyAoYWJmZCktPnN5bW9mZiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIGlmIChvZmYgPT0gMCkKLQl7Ci0JICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmYsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIHN5bWJvbCB0YWJsZSBzdGFydHMgd2l0aCBhIG5vcm1hbCBhcmNoaXZlIGhlYWRlci4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFJfQklHLCAxLCBhYmZkKQotCSAgIT0gU0laRU9GX0FSX0hEUl9CSUcpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTa2lwIHRoZSBuYW1lIChub3JtYWxseSBlbXB0eSkuICAqLwotICAgICAgbmFtbGVuID0gc3RydG9sIChoZHIubmFtbGVuLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoKG5hbWxlbiArIDEpICYgfjEpICsgU1hDT0ZGQVJGTUFHLCBTRUVLX0NVUikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFhYWCBUaGlzIGFjdHVhbGx5IGhhcyB0byBiZSBhIGNhbGwgdG8gc3RydG9sbCAoYXQgbGVhc3Qgb24gMzItYml0Ci0JIG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGQgd2lkdGggaXMgMjAgYW5kIHRoZXJlIG51bWJlcnMgd2l0aCBtb3JlCi0JIHRoYW4gMzIgYml0cyBjYW4gYmUgcmVwcmVzZW50ZWQuICAqLwotICAgICAgc3ogPSBzdHJ0b2wgKGhkci5zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgIH0KLQotICAvKiBSZWFkIGluIHRoZSBlbnRpcmUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzeik7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBjb250ZW50cywgMSwgc3osIGFiZmQpICE9IHN6KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3ltYm9sIHRhYmxlIHN0YXJ0cyB3aXRoIGEgZm91ciBieXRlIGNvdW50LiAgKi8KLSAgYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgY29udGVudHMpOwotCi0gIGlmIChjICogNCA+PSBzeikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSAoKGNhcnN5bSAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwgYyAqIHNpemVvZiAoY2Fyc3ltKSkpOwotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQWZ0ZXIgdGhlIGNvdW50IGNvbWVzIGEgbGlzdCBvZiBmb3VyIGJ5dGUgZmlsZSBvZmZzZXRzLiAgKi8KLSAgZm9yIChpID0gMCwgYXJzeW0gPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcywgcCA9IGNvbnRlbnRzICsgNDsKLSAgICAgICBpIDwgYzsKLSAgICAgICArK2ksICsrYXJzeW0sIHAgKz0gNCkKLSAgICBhcnN5bS0+ZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCi0gIC8qIEFmdGVyIHRoZSBmaWxlIG9mZnNldHMgY29tZSBudWxsIHRlcm1pbmF0ZWQgc3ltYm9sIG5hbWVzLiAgKi8KLSAgY2VuZCA9IGNvbnRlbnRzICsgc3o7Ci0gIGZvciAoaSA9IDAsIGFyc3ltID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7Ci0gICAgICAgaSA8IGM7Ci0gICAgICAgKytpLCArK2Fyc3ltLCBwICs9IHN0cmxlbiAoKGNoYXIgKikgcCkgKyAxKQotICAgIHsKLSAgICAgIGlmIChwID49IGNlbmQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYXJzeW0tPm5hbWUgPSAoY2hhciAqKSBwOwotICAgIH0KLQotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50ID0gYzsKLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIHRoaXMgaXMgYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXhjb2ZmX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG1hZ2ljW1NYQ09GRkFSTUFHXTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIG1hZ2ljLCBTWENPRkZBUk1BRywgMSwgYWJmZCkgIT0gU1hDT0ZGQVJNQUcpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChzdHJuY21wIChtYWdpYywgWENPRkZBUk1BRywgU1hDT0ZGQVJNQUcpICE9IDAKLSAgICAgICYmIHN0cm5jbXAgKG1hZ2ljLCBYQ09GRkFSTUFHQklHLCBTWENPRkZBUk1BRykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBhcmUgc2V0dGluZyBiZmRfYXJkYXRhKGFiZmQpIGhlcmUsIGJ1dCBzaW5jZSBiZmRfYXJkYXRhCi0gICAgIGludm9sdmVzIGEgY2FzdCwgd2UgY2FuJ3QgZG8gaXQgYXMgdGhlIGxlZnQgb3BlcmFuZCBvZgotICAgICBhc3NpZ25tZW50LiAgKi8KLSAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0KLSAgICAoc3RydWN0IGFydGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSAoc3RydWN0IGFydGRhdGEgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotCi0gIC8qIE5vdyBoYW5kbGUgdGhlIHR3byBmb3JtYXRzLiAgKi8KLSAgaWYgKG1hZ2ljWzFdICE9ICdiJykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIHRoZSBvbGQgZm9ybWF0LiAgKi8KLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9maWxlX2hkciBoZHI7Ci0KLSAgICAgIC8qIENvcHkgb3ZlciB0aGUgbWFnaWMgc3RyaW5nLiAgKi8KLSAgICAgIG1lbWNweSAoaGRyLm1hZ2ljLCBtYWdpYywgU1hDT0ZGQVJNQUcpOwotCi0gICAgICAvKiBOb3cgcmVhZCB0aGUgcmVzdCBvZiB0aGUgZmlsZSBoZWFkZXIuICAqLwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLm1lbW9mZiwgU0laRU9GX0FSX0ZJTEVfSERSIC0gU1hDT0ZGQVJNQUcsIDEsCi0JCSAgICBhYmZkKSAhPSBTSVpFT0ZfQVJfRklMRV9IRFIgLSBTWENPRkZBUk1BRykKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gc3RydG9sIChoZHIuZmlyc3RtZW1vZmYsCi0JCQkJCQkgICAgICAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBiZmRfemFsbG9jIChhYmZkLCBTSVpFT0ZfQVJfRklMRV9IRFIpOwotICAgICAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBtZW1jcHkgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSwgJmhkciwgU0laRU9GX0FSX0ZJTEVfSERSKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIHRoZSBuZXcgZm9ybWF0LiAgKi8KLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9maWxlX2hkcl9iaWcgaGRyOwotCi0gICAgICAvKiBDb3B5IG92ZXIgdGhlIG1hZ2ljIHN0cmluZy4gICovCi0gICAgICBtZW1jcHkgKGhkci5tYWdpYywgbWFnaWMsIFNYQ09GRkFSTUFHKTsKLQotICAgICAgLyogTm93IHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgaGVhZGVyLiAgKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJmhkci5tZW1vZmYsIFNJWkVPRl9BUl9GSUxFX0hEUl9CSUcgLSBTWENPRkZBUk1BRywgMSwKLQkJICAgIGFiZmQpICE9IFNJWkVPRl9BUl9GSUxFX0hEUl9CSUcgLSBTWENPRkZBUk1BRykKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICAvKiBYWFggVGhpcyBhY3R1YWxseSBoYXMgdG8gYmUgYSBjYWxsIHRvIHN0cnRvbGwgKGF0IGxlYXN0IG9uIDMyLWJpdAotCSBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGggbW9yZQotCSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBzdHJ0b2wgKGhkci5maXJzdG1lbW9mZiwKLQkJCQkJCSAgICAgIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IGJmZF96YWxsb2MgKGFiZmQsIFNJWkVPRl9BUl9GSUxFX0hEUl9CSUcpOwotICAgICAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBtZW1jcHkgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSwgJmhkciwgU0laRU9GX0FSX0ZJTEVfSERSX0JJRyk7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX3NsdXJwX2FybWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEw7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgdGhlIGFyY2hpdmUgaGVhZGVyIGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgUFRSCi14Y29mZl9yZWFkX2FyX2hkciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzaXplX3QgbmFtbGVuOwotICBzdHJ1Y3QgYXJlbHRkYXRhICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIHhjb2ZmX2JpZ19mb3JtYXRfcCAoYWJmZCkpCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyICpoZHJwOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIpCi0JewotCSAgZnJlZSAocmV0KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgbmFtbGVuID0gc3RydG9sIChoZHIubmFtbGVuLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgaGRycCA9IChzdHJ1Y3QgeGNvZmZfYXJfaGRyICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJCVNJWkVPRl9BUl9IRFIgKyBuYW1sZW4gKyAxKTsKLSAgICAgIGlmIChoZHJwID09IE5VTEwpCi0JewotCSAgZnJlZSAocmV0KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIG1lbWNweSAoaGRycCwgJmhkciwgU0laRU9GX0FSX0hEUik7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChjaGFyICopIGhkcnAgKyBTSVpFT0ZfQVJfSERSLCAxLCBuYW1sZW4sIGFiZmQpICE9IG5hbWxlbikKLQl7Ci0JICBmcmVlIChyZXQpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgKChjaGFyICopIGhkcnApW1NJWkVPRl9BUl9IRFIgKyBuYW1sZW5dID0gJ1wwJzsKLQotICAgICAgcmV0LT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcnA7Ci0gICAgICByZXQtPnBhcnNlZF9zaXplID0gc3RydG9sIChoZHIuc2l6ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIHJldC0+ZmlsZW5hbWUgPSAoY2hhciAqKSBoZHJwICsgU0laRU9GX0FSX0hEUjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyX2JpZyBoZHI7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyX2JpZyAqaGRycDsKLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLCBTSVpFT0ZfQVJfSERSX0JJRywgMSwgYWJmZCkKLQkgICE9IFNJWkVPRl9BUl9IRFJfQklHKQotCXsKLQkgIGZyZWUgKHJldCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIG5hbWxlbiA9IHN0cnRvbCAoaGRyLm5hbWxlbiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIGhkcnAgPSAoc3RydWN0IHhjb2ZmX2FyX2hkcl9iaWcgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkJICAgIFNJWkVPRl9BUl9IRFJfQklHCi0JCQkJCQkgICAgKyBuYW1sZW4gKyAxKTsKLSAgICAgIGlmIChoZHJwID09IE5VTEwpCi0JewotCSAgZnJlZSAocmV0KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIG1lbWNweSAoaGRycCwgJmhkciwgU0laRU9GX0FSX0hEUl9CSUcpOwotICAgICAgaWYgKGJmZF9yZWFkICgoY2hhciAqKSBoZHJwICsgU0laRU9GX0FSX0hEUl9CSUcsIDEsIG5hbWxlbiwgYWJmZCkgIT0gbmFtbGVuKQotCXsKLQkgIGZyZWUgKHJldCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICAoKGNoYXIgKikgaGRycClbU0laRU9GX0FSX0hEUl9CSUcgKyBuYW1sZW5dID0gJ1wwJzsKLQotICAgICAgcmV0LT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcnA7Ci0gICAgICAvKiBYWFggVGhpcyBhY3R1YWxseSBoYXMgdG8gYmUgYSBjYWxsIHRvIHN0cnRvbGwgKGF0IGxlYXN0IG9uIDMyLWJpdAotCSBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGggbW9yZQotCSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgICAgIHJldC0+cGFyc2VkX3NpemUgPSBzdHJ0b2wgKGhkci5zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgcmV0LT5maWxlbmFtZSA9IChjaGFyICopIGhkcnAgKyBTSVpFT0ZfQVJfSERSX0JJRzsKLSAgICB9Ci0KLSAgLyogU2tpcCBvdmVyIHRoZSBYQ09GRkFSRk1BRyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChuYW1sZW4gJiAxKSArIFNYQ09GRkFSRk1BRywgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogT3BlbiB0aGUgbmV4dCBlbGVtZW50IGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYmZkICoKLXhjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBmaWxlX3B0ciBmaWxlc3RhcnQ7Ci0KLSAgaWYgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2JpZ19mb3JtYXRfcCAoYXJjaGl2ZSkpCi0gICAgewotICAgICAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMKQotCWZpbGVzdGFydCA9IGJmZF9hcmRhdGEgKGFyY2hpdmUpLT5maXJzdF9maWxlX2ZpbGVwb3M7Ci0gICAgICBlbHNlCi0JZmlsZXN0YXJ0ID0gc3RydG9sIChhcmNoX3hoZHIgKGxhc3RfZmlsZSktPm5leHRvZmYsIChjaGFyICoqKSBOVUxMLAotCQkJICAgIDEwKTsKLQotICAgICAgaWYgKGZpbGVzdGFydCA9PSAwCi0JICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5tZW1vZmYsCi0JCQkJICAoY2hhciAqKikgTlVMTCwgMTApCi0JICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5zeW1vZmYsCi0JCQkJICAoY2hhciAqKikgTlVMTCwgMTApKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGFzdF9maWxlID09IE5VTEwpCi0JZmlsZXN0YXJ0ID0gYmZkX2FyZGF0YSAoYXJjaGl2ZSktPmZpcnN0X2ZpbGVfZmlsZXBvczsKLSAgICAgIGVsc2UKLQkvKiBYWFggVGhlc2UgYWN0dWFsbHkgaGF2ZSB0byBiZSBhIGNhbGxzIHRvIHN0cnRvbGwgKGF0IGxlYXN0Ci0JICAgb24gMzItYml0IG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGRzJ3Mgd2lkdGggaXMgMjAgYW5kCi0JICAgdGhlcmUgbnVtYmVycyB3aXRoIG1vcmUgdGhhbiAzMiBiaXRzIGNhbiBiZSByZXByZXNlbnRlZC4gICovCi0JZmlsZXN0YXJ0ID0gc3RydG9sIChhcmNoX3hoZHJfYmlnIChsYXN0X2ZpbGUpLT5uZXh0b2ZmLCAoY2hhciAqKikgTlVMTCwKLQkJCSAgICAxMCk7Ci0KLSAgICAgIC8qIFhYWCBUaGVzZSBhY3R1YWxseSBoYXZlIHRvIGJlIGNhbGxzIHRvIHN0cnRvbGwgKGF0IGxlYXN0IG9uIDMyLWJpdAotCSBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkcydzIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGggbW9yZQotCSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgICAgIGlmIChmaWxlc3RhcnQgPT0gMAotCSAgfHwgZmlsZXN0YXJ0ID09IHN0cnRvbCAoeGNvZmZfYXJkYXRhX2JpZyAoYXJjaGl2ZSktPm1lbW9mZiwKLQkJCQkgIChjaGFyICoqKSBOVUxMLCAxMCkKLQkgIHx8IGZpbGVzdGFydCA9PSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YV9iaWcgKGFyY2hpdmUpLT5zeW1vZmYsCi0JCQkJICAoY2hhciAqKikgTlVMTCwgMTApKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlc3RhcnQpOwotfQotCi0vKiBTdGF0IGFuIGVsZW1lbnQgaW4gYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBpbnQKLXhjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqczsKLXsKLSAgaWYgKGFiZmQtPmFyZWx0X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9iaWdfZm9ybWF0X3AgKGFiZmQpKQotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmhkcnAgPSBhcmNoX3hoZHIgKGFiZmQpOwotCi0gICAgICBzLT5zdF9tdGltZSA9IHN0cnRvbCAoaGRycC0+ZGF0ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIHMtPnN0X3VpZCA9IHN0cnRvbCAoaGRycC0+dWlkLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgcy0+c3RfZ2lkID0gc3RydG9sIChoZHJwLT5naWQsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gICAgICBzLT5zdF9tb2RlID0gc3RydG9sIChoZHJwLT5tb2RlLCAoY2hhciAqKikgTlVMTCwgOCk7Ci0gICAgICBzLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX2FyX2hkcl9iaWcgKmhkcnAgPSBhcmNoX3hoZHJfYmlnIChhYmZkKTsKLQotICAgICAgcy0+c3RfbXRpbWUgPSBzdHJ0b2wgKGhkcnAtPmRhdGUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gICAgICBzLT5zdF91aWQgPSBzdHJ0b2wgKGhkcnAtPnVpZCwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgICAgIHMtPnN0X2dpZCA9IHN0cnRvbCAoaGRycC0+Z2lkLCAoY2hhciAqKikgTlVMTCwgMTApOwotICAgICAgcy0+c3RfbW9kZSA9IHN0cnRvbCAoaGRycC0+bW9kZSwgKGNoYXIgKiopIE5VTEwsIDgpOwotICAgICAgcy0+c3Rfc2l6ZSA9IGFyY2hfZWx0ZGF0YSAoYWJmZCktPnBhcnNlZF9zaXplOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogTm9ybWFsaXplIGEgZmlsZSBuYW1lIGZvciBpbmNsdXNpb24gaW4gYW4gYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZV9maWxlbmFtZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBjaGFyICpmaWxlOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotICBmaWxlID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gIGZpbGVuYW1lID0gc3RycmNociAoZmlsZSwgJy8nKTsKLSAgaWYgKGZpbGVuYW1lICE9IE5VTEwpCi0gICAgZmlsZW5hbWUrKzsKLSAgZWxzZQotICAgIGZpbGVuYW1lID0gZmlsZTsKLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gWENPRkYgYXJtYXAuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9hcm1hcF9vbGQgKGFiZmQsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLSAgY2hhciAqcDsKLSAgdW5zaWduZWQgY2hhciBidWZbNF07Ci0gIGJmZCAqc3ViOwotICBmaWxlX3B0ciBmaWxlb2ZmOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBtZW1zZXQgKCZoZHIsIDAsIHNpemVvZiBoZHIpOwotICBzcHJpbnRmIChoZHIuc2l6ZSwgIiVsZCIsIChsb25nKSAoNCArIG9ybF9jb3VudCAqIDQgKyBzdHJpZHgpKTsKLSAgc3ByaW50ZiAoaGRyLm5leHRvZmYsICIlZCIsIDApOwotICBtZW1jcHkgKGhkci5wcmV2b2ZmLCB4Y29mZl9hcmRhdGEgKGFiZmQpLT5tZW1vZmYsIDEyKTsKLSAgc3ByaW50ZiAoaGRyLmRhdGUsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIudWlkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLmdpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5tb2RlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLm5hbWxlbiwgIiVkIiwgMCk7Ci0KLSAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgZm9yIChwID0gKGNoYXIgKikgJmhkcjsgcCA8IChjaGFyICopICZoZHIgKyBTSVpFT0ZfQVJfSERSOyBwKyspCi0gICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAqcCA9ICcgJzsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCBTSVpFT0ZfQVJfSERSLCAxLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSCi0gICAgICB8fCBiZmRfd3JpdGUgKFhDT0ZGQVJGTUFHLCAxLCBTWENPRkZBUkZNQUcsIGFiZmQpICE9IFNYQ09GRkFSRk1BRykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBvcmxfY291bnQsIGJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotICBmaWxlb2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSOwotICBpID0gMDsKLSAgd2hpbGUgKHN1YiAhPSBOVUxMICYmIGkgPCBvcmxfY291bnQpCi0gICAgewotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgd2hpbGUgKCgoYmZkICopIChtYXBbaV0pLnBvcykgPT0gc3ViKQotCXsKLQkgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZmlsZW9mZiwgYnVmKTsKLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKytpOwotCX0KLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpKTsKLSAgICAgIG5hbWxlbiA9IChuYW1sZW4gKyAxKSAmfiAxOwotICAgICAgZmlsZW9mZiArPSAoU0laRU9GX0FSX0hEUgotCQkgICsgbmFtbGVuCi0JCSAgKyBTWENPRkZBUkZNQUcKLQkJICArIGFyZWx0X3NpemUgKHN1YikpOwotICAgICAgZmlsZW9mZiA9IChmaWxlb2ZmICsgMSkgJn4gMTsKLSAgICAgIHN1YiA9IHN1Yi0+bmV4dDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG9ybF9jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzaXplX3QgbmFtbGVuOwotCi0gICAgICBuYW1lID0gKm1hcFtpXS5uYW1lOwotICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKG5hbWUsIDEsIG5hbWxlbiArIDEsIGFiZmQpICE9IG5hbWxlbiArIDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKHN0cmlkeCAmIDEpICE9IDApCi0gICAgewotICAgICAgY2hhciBiOwotCi0gICAgICBiID0gJ1wwJzsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3dyaXRlX2FybWFwX2JpZyAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHJfYmlnIGhkcjsKLSAgY2hhciAqcDsKLSAgdW5zaWduZWQgY2hhciBidWZbNF07Ci0gIGJmZCAqc3ViOwotICBmaWxlX3B0ciBmaWxlb2ZmOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBtZW1zZXQgKCZoZHIsIDAsIHNpemVvZiBoZHIpOwotICAvKiBYWFggVGhpcyBjYWxsIGFjdHVhbGx5IHNob3VsZCB1c2UgJWxsZCAoYXQgbGVhc3Qgb24gMzItYml0Ci0gICAgIG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGRzJ3Mgd2lkdGggaXMgMjAgYW5kIHRoZXJlIG51bWJlcnMgd2l0aAotICAgICBtb3JlIHRoYW4gMzIgYml0cyBjYW4gYmUgcmVwcmVzZW50ZWQuICAqLwotICBzcHJpbnRmIChoZHIuc2l6ZSwgIiVsZCIsIChsb25nKSAoNCArIG9ybF9jb3VudCAqIDQgKyBzdHJpZHgpKTsKLSAgc3ByaW50ZiAoaGRyLm5leHRvZmYsICIlZCIsIDApOwotICBtZW1jcHkgKGhkci5wcmV2b2ZmLCB4Y29mZl9hcmRhdGEgKGFiZmQpLT5tZW1vZmYsIDEyKTsKLSAgc3ByaW50ZiAoaGRyLmRhdGUsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIudWlkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLmdpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5tb2RlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLm5hbWxlbiwgIiVkIiwgMCk7Ci0KLSAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgZm9yIChwID0gKGNoYXIgKikgJmhkcjsgcCA8IChjaGFyICopICZoZHIgKyBTSVpFT0ZfQVJfSERSX0JJRzsgcCsrKQotICAgIGlmICgqcCA9PSAnXDAnKQotICAgICAgKnAgPSAnICc7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgU0laRU9GX0FSX0hEUl9CSUcsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFJfQklHCi0gICAgICB8fCBiZmRfd3JpdGUgKFhDT0ZGQVJGTUFHLCAxLCBTWENPRkZBUkZNQUcsIGFiZmQpICE9IFNYQ09GRkFSRk1BRykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBvcmxfY291bnQsIGJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotICBmaWxlb2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSX0JJRzsKLSAgaSA9IDA7Ci0gIHdoaWxlIChzdWIgIT0gTlVMTCAmJiBpIDwgb3JsX2NvdW50KQotICAgIHsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2ldKS5wb3MpID09IHN1YikKLQl7Ci0JICBiZmRfaF9wdXRfMzIgKGFiZmQsIGZpbGVvZmYsIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICsraTsKLQl9Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKSk7Ci0gICAgICBuYW1sZW4gPSAobmFtbGVuICsgMSkgJn4gMTsKLSAgICAgIGZpbGVvZmYgKz0gKFNJWkVPRl9BUl9IRFJfQklHCi0JCSAgKyBuYW1sZW4KLQkJICArIFNYQ09GRkFSRk1BRwotCQkgICsgYXJlbHRfc2l6ZSAoc3ViKSk7Ci0gICAgICBmaWxlb2ZmID0gKGZpbGVvZmYgKyAxKSAmfiAxOwotICAgICAgc3ViID0gc3ViLT5uZXh0OwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIG5hbWUgPSAqbWFwW2ldLm5hbWU7Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgaWYgKGJmZF93cml0ZSAobmFtZSwgMSwgbmFtbGVuICsgMSwgYWJmZCkgIT0gbmFtbGVuICsgMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICgoc3RyaWR4ICYgMSkgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIGI7Ci0KLSAgICAgIGIgPSAnXDAnOwotICAgICAgaWYgKGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfd3JpdGVfYXJtYXAgKGFiZmQsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBpZiAoISB4Y29mZl9iaWdfZm9ybWF0X3AgKGFiZmQpKQotICAgIHJldHVybiB4Y29mZl93cml0ZV9hcm1hcF9vbGQgKGFiZmQsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpOwotICBlbHNlCi0gICAgcmV0dXJuIHhjb2ZmX3dyaXRlX2FybWFwX2JpZyAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBYQ09GRiBhcmNoaXZlLiAgV2UgYWx3YXlzIHdyaXRlIGFuIGVudGlyZSBhcmNoaXZlLAotICAgcmF0aGVyIHRoYW4gZnVzc2luZyB3aXRoIHRoZSBmcmVlbGlzdCBhbmQgc28gZm9ydGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50c19vbGQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyIGZoZHI7Ci0gIHNpemVfdCBjb3VudDsKLSAgc2l6ZV90IHRvdGFsX25hbWxlbjsKLSAgZmlsZV9wdHIgKm9mZnNldHM7Ci0gIGJvb2xlYW4gbWFrZW1hcDsKLSAgYm9vbGVhbiBoYXNvYmplY3RzOwotICBmaWxlX3B0ciBwcmV2b2ZmLCBuZXh0b2ZmOwotICBiZmQgKnN1YjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgYWhkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBjaGFyICpwOwotICBjaGFyIGRlY2J1ZlsxM107Ci0KLSAgbWVtc2V0ICgmZmhkciwgMCwgc2l6ZW9mIGZoZHIpOwotICBzdHJuY3B5IChmaGRyLm1hZ2ljLCBYQ09GRkFSTUFHLCBTWENPRkZBUk1BRyk7Ci0gIHNwcmludGYgKGZoZHIuZmlyc3RtZW1vZmYsICIlZCIsIFNJWkVPRl9BUl9GSUxFX0hEUik7Ci0gIHNwcmludGYgKGZoZHIuZnJlZW9mZiwgIiVkIiwgMCk7Ci0KLSAgY291bnQgPSAwOwotICB0b3RhbF9uYW1sZW4gPSAwOwotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCkKLSAgICB7Ci0gICAgICArK2NvdW50OwotICAgICAgdG90YWxfbmFtbGVuICs9IHN0cmxlbiAobm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpKSArIDE7Ci0gICAgfQotICBvZmZzZXRzID0gKGZpbGVfcHRyICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGZpbGVfcHRyKSk7Ci0gIGlmIChvZmZzZXRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgU0laRU9GX0FSX0ZJTEVfSERSLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbWFrZW1hcCA9IGJmZF9oYXNfbWFwIChhYmZkKTsKLSAgaGFzb2JqZWN0cyA9IGZhbHNlOwotICBwcmV2b2ZmID0gMDsKLSAgbmV4dG9mZiA9IFNJWkVPRl9BUl9GSUxFX0hEUjsKLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQsIGkgPSAwOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5uZXh0LCBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyICphaGRycDsKLSAgICAgIGJmZF9zaXplX3R5cGUgcmVtYWluaW5nOwotCi0gICAgICBpZiAobWFrZW1hcCAmJiAhIGhhc29iamVjdHMpCi0JewotCSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHN1YiwgYmZkX29iamVjdCkpCi0JICAgIGhhc29iamVjdHMgPSB0cnVlOwotCX0KLQotICAgICAgbmFtZSA9IG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgICAgIGlmIChzdWItPmFyZWx0X2RhdGEgIT0gTlVMTCkKLQlhaGRycCA9IGFyY2hfeGhkciAoc3ViKTsKLSAgICAgIGVsc2UKLQlhaGRycCA9IE5VTEw7Ci0KLSAgICAgIGlmIChhaGRycCA9PSBOVUxMKQotCXsKLQkgIHN0cnVjdCBzdGF0IHM7Ci0KLQkgIG1lbXNldCAoJmFoZHIsIDAsIHNpemVvZiBhaGRyKTsKLQkgIGFoZHJwID0gJmFoZHI7Ci0JICBpZiAoc3RhdCAoYmZkX2dldF9maWxlbmFtZSAoc3ViKSwgJnMpICE9IDApCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzcHJpbnRmIChhaGRycC0+c2l6ZSwgIiVsZCIsIChsb25nKSBzLnN0X3NpemUpOwotCSAgc3ByaW50ZiAoYWhkcnAtPmRhdGUsICIlbGQiLCAobG9uZykgcy5zdF9tdGltZSk7Ci0JICBzcHJpbnRmIChhaGRycC0+dWlkLCAiJWxkIiwgKGxvbmcpIHMuc3RfdWlkKTsKLQkgIHNwcmludGYgKGFoZHJwLT5naWQsICIlbGQiLCAobG9uZykgcy5zdF9naWQpOwotCSAgc3ByaW50ZiAoYWhkcnAtPm1vZGUsICIlbyIsICh1bnNpZ25lZCBpbnQpIHMuc3RfbW9kZSk7Ci0KLQkgIGlmIChzdWItPmFyZWx0X2RhdGEgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN1Yi0+YXJlbHRfZGF0YSA9IGJmZF9hbGxvYyAoc3ViLCBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLQkgICAgICBpZiAoc3ViLT5hcmVsdF9kYXRhID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBhcmNoX2VsdGRhdGEgKHN1YiktPnBhcnNlZF9zaXplID0gcy5zdF9zaXplOwotCX0KLQotICAgICAgc3ByaW50ZiAoYWhkcnAtPnByZXZvZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0gICAgICBzcHJpbnRmIChhaGRycC0+bmFtbGVuLCAiJWxkIiwgKGxvbmcpIG5hbWxlbik7Ci0KLSAgICAgIC8qIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMgb2RkLCB3ZSB3cml0ZSBvdXQgdGhlIG51bGwgYnl0ZQotICAgICAgICAgYWZ0ZXIgdGhlIG5hbWUgYXMgd2VsbC4gICovCi0gICAgICBuYW1sZW4gPSAobmFtbGVuICsgMSkgJn4gMTsKLQotICAgICAgcmVtYWluaW5nID0gYXJlbHRfc2l6ZSAoc3ViKTsKLSAgICAgIHNpemUgPSAoU0laRU9GX0FSX0hEUgotCSAgICAgICsgbmFtbGVuCi0JICAgICAgKyBTWENPRkZBUkZNQUcKLQkgICAgICArIHJlbWFpbmluZyk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKG5leHRvZmYgPT0gYmZkX3RlbGwgKGFiZmQpKTsKLQotICAgICAgb2Zmc2V0c1tpXSA9IG5leHRvZmY7Ci0KLSAgICAgIHByZXZvZmYgPSBuZXh0b2ZmOwotICAgICAgbmV4dG9mZiArPSBzaXplICsgKHNpemUgJiAxKTsKLQotICAgICAgc3ByaW50ZiAoYWhkcnAtPm5leHRvZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0KLSAgICAgIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gICAgICBmb3IgKHAgPSAoY2hhciAqKSBhaGRycDsgcCA8IChjaGFyICopIGFoZHJwICsgU0laRU9GX0FSX0hEUjsgcCsrKQotCWlmICgqcCA9PSAnXDAnKQotCSAgKnAgPSAnICc7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGFoZHJwLCAxLCBTSVpFT0ZfQVJfSERSLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSCi0JICB8fCBiZmRfd3JpdGUgKChQVFIpIG5hbWUsIDEsIG5hbWxlbiwgYWJmZCkgIT0gbmFtbGVuCi0JICB8fCAoYmZkX3dyaXRlICgoUFRSKSBYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKQotCSAgICAgICE9IFNYQ09GRkFSRk1BRykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKHN1YiwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB3aGlsZSAocmVtYWluaW5nICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBhbXQ7Ci0JICBiZmRfYnl0ZSBidWZmZXJbREVGQVVMVF9CVUZGRVJTSVpFXTsKLQotCSAgYW10ID0gc2l6ZW9mIGJ1ZmZlcjsKLQkgIGlmIChhbXQgPiByZW1haW5pbmcpCi0JICAgIGFtdCA9IHJlbWFpbmluZzsKLQkgIGlmIChiZmRfcmVhZCAoYnVmZmVyLCAxLCBhbXQsIHN1YikgIT0gYW10Ci0JICAgICAgfHwgYmZkX3dyaXRlIChidWZmZXIsIDEsIGFtdCwgYWJmZCkgIT0gYW10KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICByZW1haW5pbmcgLT0gYW10OwotCX0KLQotICAgICAgaWYgKChzaXplICYgMSkgIT0gMCkKLQl7Ci0JICBiZmRfYnl0ZSBiOwotCi0JICBiID0gJ1wwJzsKLQkgIGlmIChiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBzcHJpbnRmIChmaGRyLmxhc3RtZW1vZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBtZW1iZXIgdGFibGUuICAqLwotCi0gIEJGRF9BU1NFUlQgKG5leHRvZmYgPT0gYmZkX3RlbGwgKGFiZmQpKTsKLSAgc3ByaW50ZiAoZmhkci5tZW1vZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0KLSAgbWVtc2V0ICgmYWhkciwgMCwgc2l6ZW9mIGFoZHIpOwotICBzcHJpbnRmIChhaGRyLnNpemUsICIlbGQiLCAobG9uZykgKDEyICsgY291bnQgKiAxMiArIHRvdGFsX25hbWxlbikpOwotICBzcHJpbnRmIChhaGRyLnByZXZvZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0gIHNwcmludGYgKGFoZHIuZGF0ZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIudWlkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci5naWQsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLm1vZGUsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLm5hbWxlbiwgIiVkIiwgMCk7Ci0KLSAgc2l6ZSA9IChTSVpFT0ZfQVJfSERSCi0JICArIDEyCi0JICArIGNvdW50ICogMTIKLQkgICsgdG90YWxfbmFtbGVuCi0JICArIFNYQ09GRkFSRk1BRyk7Ci0KLSAgcHJldm9mZiA9IG5leHRvZmY7Ci0gIG5leHRvZmYgKz0gc2l6ZSArIChzaXplICYgMSk7Ci0KLSAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKLSAgICBzcHJpbnRmIChhaGRyLm5leHRvZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChhaGRyLm5leHRvZmYsICIlZCIsIDApOwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZhaGRyOyBwIDwgKGNoYXIgKikgJmFoZHIgKyBTSVpFT0ZfQVJfSERSOyBwKyspCi0gICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAqcCA9ICcgJzsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYWhkciwgMSwgU0laRU9GX0FSX0hEUiwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUgotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgWENPRkZBUkZNQUcsIDEsIFNYQ09GRkFSRk1BRywgYWJmZCkKLQkgICE9IFNYQ09GRkFSRk1BRykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNwcmludGYgKGRlY2J1ZiwgIiUtMTJsZCIsIChsb25nKSBjb3VudCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGRlY2J1ZiwgMSwgMTIsIGFiZmQpICE9IDEyKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgc3ByaW50ZiAoZGVjYnVmLCAiJS0xMmxkIiwgKGxvbmcpIG9mZnNldHNbaV0pOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVjYnVmLCAxLCAxMiwgYWJmZCkgIT0gMTIpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIG5hbWUgPSBub3JtYWxpemVfZmlsZW5hbWUgKHN1Yik7Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmFtZSwgMSwgbmFtbGVuICsgMSwgYWJmZCkgIT0gbmFtbGVuICsgMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKHNpemUgJiAxKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGIgPSAnXDAnOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGFybWFwLCBpZiBhcHByb3ByaWF0ZS4gICovCi0KLSAgaWYgKCEgbWFrZW1hcCB8fCAhIGhhc29iamVjdHMpCi0gICAgc3ByaW50ZiAoZmhkci5zeW1vZmYsICIlZCIsIDApOwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotICAgICAgc3ByaW50ZiAoZmhkci5zeW1vZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSAoUFRSKSAmZmhkcjsKLSAgICAgIGlmICghIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgKGFiZmQsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBhcmNoaXZlIGZpbGUgaGVhZGVyLiAgKi8KLQotICAvKiBXZSBuZWVkIHNwYWNlcywgbm90IG51bGwgYnl0ZXMsIGluIHRoZSBoZWFkZXIuICAqLwotICBmb3IgKHAgPSAoY2hhciAqKSAmZmhkcjsgcCA8IChjaGFyICopICZmaGRyICsgU0laRU9GX0FSX0ZJTEVfSERSOyBwKyspCi0gICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAqcCA9ICcgJzsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZmaGRyLCBTSVpFT0ZfQVJfRklMRV9IRFIsIDEsIGFiZmQpICE9Ci0JICBTSVpFT0ZfQVJfRklMRV9IRFIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHNfYmlnIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCB4Y29mZl9hcl9maWxlX2hkcl9iaWcgZmhkcjsKLSAgc2l6ZV90IGNvdW50OwotICBzaXplX3QgdG90YWxfbmFtbGVuOwotICBmaWxlX3B0ciAqb2Zmc2V0czsKLSAgYm9vbGVhbiBtYWtlbWFwOwotICBib29sZWFuIGhhc29iamVjdHM7Ci0gIGZpbGVfcHRyIHByZXZvZmYsIG5leHRvZmY7Ci0gIGJmZCAqc3ViOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkcl9iaWcgYWhkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBjaGFyICpwOwotICBjaGFyIGRlY2J1ZlsxM107Ci0KLSAgbWVtc2V0ICgmZmhkciwgMCwgc2l6ZW9mIGZoZHIpOwotICBzdHJuY3B5IChmaGRyLm1hZ2ljLCBYQ09GRkFSTUFHQklHLCBTWENPRkZBUk1BRyk7Ci0gIHNwcmludGYgKGZoZHIuZmlyc3RtZW1vZmYsICIlZCIsIFNJWkVPRl9BUl9GSUxFX0hEUl9CSUcpOwotICBzcHJpbnRmIChmaGRyLmZyZWVvZmYsICIlZCIsIDApOwotCi0gIGNvdW50ID0gMDsKLSAgdG90YWxfbmFtbGVuID0gMDsKLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQpCi0gICAgewotICAgICAgKytjb3VudDsKLSAgICAgIHRvdGFsX25hbWxlbiArPSBzdHJsZW4gKG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKSkgKyAxOwotICAgIH0KLSAgb2Zmc2V0cyA9IChmaWxlX3B0ciAqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChmaWxlX3B0cikpOwotICBpZiAob2Zmc2V0cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIFNJWkVPRl9BUl9GSUxFX0hEUl9CSUcsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFiZmQpOwotICBoYXNvYmplY3RzID0gZmFsc2U7Ci0gIHByZXZvZmYgPSAwOwotICBuZXh0b2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSX0JJRzsKLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQsIGkgPSAwOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5uZXh0LCBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyX2JpZyAqYWhkcnA7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHJlbWFpbmluZzsKLQotICAgICAgaWYgKG1ha2VtYXAgJiYgISBoYXNvYmplY3RzKQotCXsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChzdWIsIGJmZF9vYmplY3QpKQotCSAgICBoYXNvYmplY3RzID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBub3JtYWxpemVfZmlsZW5hbWUgKHN1Yik7Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5hbWUpOwotCi0gICAgICBpZiAoc3ViLT5hcmVsdF9kYXRhICE9IE5VTEwpCi0JYWhkcnAgPSBhcmNoX3hoZHJfYmlnIChzdWIpOwotICAgICAgZWxzZQotCWFoZHJwID0gTlVMTDsKLQotICAgICAgaWYgKGFoZHJwID09IE5VTEwpCi0JewotCSAgc3RydWN0IHN0YXQgczsKLQotCSAgbWVtc2V0ICgmYWhkciwgMCwgc2l6ZW9mIGFoZHIpOwotCSAgYWhkcnAgPSAmYWhkcjsKLQkgIC8qIFhYWCBUaGlzIHNob3VsZCBhY3R1YWxseSBiZSBhIGNhbGwgdG8gc3RhdDY0IChhdCBsZWFzdCBvbgotCSAgICAgMzItYml0IG1hY2hpbmVzKS4gICovCi0JICBpZiAoc3RhdCAoYmZkX2dldF9maWxlbmFtZSAoc3ViKSwgJnMpICE9IDApCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBYWFggVGhpcyBjYWxsIGFjdHVhbGx5IHNob3VsZCB1c2UgJWxsZCAoYXQgbGVhc3Qgb24gMzItYml0Ci0JICAgICBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkcydzIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGgKLQkgICAgIG1vcmUgdGhhbiAzMiBiaXRzIGNhbiBiZSByZXByZXNlbnRlZC4gICovCi0JICBzcHJpbnRmIChhaGRycC0+c2l6ZSwgIiVsZCIsIChsb25nKSBzLnN0X3NpemUpOwotCSAgc3ByaW50ZiAoYWhkcnAtPmRhdGUsICIlbGQiLCAobG9uZykgcy5zdF9tdGltZSk7Ci0JICBzcHJpbnRmIChhaGRycC0+dWlkLCAiJWxkIiwgKGxvbmcpIHMuc3RfdWlkKTsKLQkgIHNwcmludGYgKGFoZHJwLT5naWQsICIlbGQiLCAobG9uZykgcy5zdF9naWQpOwotCSAgc3ByaW50ZiAoYWhkcnAtPm1vZGUsICIlbyIsICh1bnNpZ25lZCBpbnQpIHMuc3RfbW9kZSk7Ci0KLQkgIGlmIChzdWItPmFyZWx0X2RhdGEgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN1Yi0+YXJlbHRfZGF0YSA9IGJmZF9hbGxvYyAoc3ViLCBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLQkgICAgICBpZiAoc3ViLT5hcmVsdF9kYXRhID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBhcmNoX2VsdGRhdGEgKHN1YiktPnBhcnNlZF9zaXplID0gcy5zdF9zaXplOwotCX0KLQotICAgICAgLyogWFhYIFRoZXNlIGNhbGxzIGFjdHVhbGx5IHNob3VsZCB1c2UgJWxsZCAoYXQgbGVhc3Qgb24gMzItYml0Ci0JIG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGRzJ3Mgd2lkdGggaXMgMjAgYW5kIHRoZXJlIG51bWJlcnMgd2l0aAotCSBtb3JlIHRoYW4gMzIgYml0cyBjYW4gYmUgcmVwcmVzZW50ZWQuICAqLwotICAgICAgc3ByaW50ZiAoYWhkcnAtPnByZXZvZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0gICAgICBzcHJpbnRmIChhaGRycC0+bmFtbGVuLCAiJWxkIiwgKGxvbmcpIG5hbWxlbik7Ci0KLSAgICAgIC8qIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMgb2RkLCB3ZSB3cml0ZSBvdXQgdGhlIG51bGwgYnl0ZQotICAgICAgICAgYWZ0ZXIgdGhlIG5hbWUgYXMgd2VsbC4gICovCi0gICAgICBuYW1sZW4gPSAobmFtbGVuICsgMSkgJn4gMTsKLQotICAgICAgcmVtYWluaW5nID0gYXJlbHRfc2l6ZSAoc3ViKTsKLSAgICAgIHNpemUgPSAoU0laRU9GX0FSX0hEUl9CSUcKLQkgICAgICArIG5hbWxlbgotCSAgICAgICsgU1hDT0ZGQVJGTUFHCi0JICAgICAgKyByZW1haW5pbmcpOwotCi0gICAgICBCRkRfQVNTRVJUIChuZXh0b2ZmID09IGJmZF90ZWxsIChhYmZkKSk7Ci0KLSAgICAgIG9mZnNldHNbaV0gPSBuZXh0b2ZmOwotCi0gICAgICBwcmV2b2ZmID0gbmV4dG9mZjsKLSAgICAgIG5leHRvZmYgKz0gc2l6ZSArIChzaXplICYgMSk7Ci0KLSAgICAgIHNwcmludGYgKGFoZHJwLT5uZXh0b2ZmLCAiJWxkIiwgKGxvbmcpIG5leHRvZmYpOwotCi0gICAgICAvKiBXZSBuZWVkIHNwYWNlcywgbm90IG51bGwgYnl0ZXMsIGluIHRoZSBoZWFkZXIuICAqLwotICAgICAgZm9yIChwID0gKGNoYXIgKikgYWhkcnA7IHAgPCAoY2hhciAqKSBhaGRycCArIFNJWkVPRl9BUl9IRFJfQklHOyBwKyspCi0JaWYgKCpwID09ICdcMCcpCi0JICAqcCA9ICcgJzsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYWhkcnAsIDEsIFNJWkVPRl9BUl9IRFJfQklHLCBhYmZkKQotCSAgIT0gU0laRU9GX0FSX0hEUl9CSUcKLQkgIHx8IGJmZF93cml0ZSAoKFBUUikgbmFtZSwgMSwgbmFtbGVuLCBhYmZkKSAhPSBuYW1sZW4KLQkgIHx8IChiZmRfd3JpdGUgKChQVFIpIFhDT0ZGQVJGTUFHLCAxLCBTWENPRkZBUkZNQUcsIGFiZmQpCi0JICAgICAgIT0gU1hDT0ZGQVJGTUFHKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoc3ViLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHdoaWxlIChyZW1haW5pbmcgIT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGFtdDsKLQkgIGJmZF9ieXRlIGJ1ZmZlcltERUZBVUxUX0JVRkZFUlNJWkVdOwotCi0JICBhbXQgPSBzaXplb2YgYnVmZmVyOwotCSAgaWYgKGFtdCA+IHJlbWFpbmluZykKLQkgICAgYW10ID0gcmVtYWluaW5nOwotCSAgaWYgKGJmZF9yZWFkIChidWZmZXIsIDEsIGFtdCwgc3ViKSAhPSBhbXQKLQkgICAgICB8fCBiZmRfd3JpdGUgKGJ1ZmZlciwgMSwgYW10LCBhYmZkKSAhPSBhbXQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbWFpbmluZyAtPSBhbXQ7Ci0JfQotCi0gICAgICBpZiAoKHNpemUgJiAxKSAhPSAwKQotCXsKLQkgIGJmZF9ieXRlIGI7Ci0KLQkgIGIgPSAnXDAnOwotCSAgaWYgKGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFhYWCBUaGlzIGNhbGwgYWN0dWFsbHkgc2hvdWxkIHVzZSAlbGxkIChhdCBsZWFzdCBvbiAzMi1iaXQKLSAgICAgbWFjaGluZXMpIHNpbmNlIHRoZSBmaWVsZHMncyB3aWR0aCBpcyAyMCBhbmQgdGhlcmUgbnVtYmVycyB3aXRoCi0gICAgIG1vcmUgdGhhbiAzMiBiaXRzIGNhbiBiZSByZXByZXNlbnRlZC4gICovCi0gIHNwcmludGYgKGZoZHIubGFzdG1lbW9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIG1lbWJlciB0YWJsZS4gICovCi0KLSAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotICAvKiBYWFggVGhpcyBjYWxsIGFjdHVhbGx5IHNob3VsZCB1c2UgJWxsZCAoYXQgbGVhc3Qgb24gMzItYml0Ci0gICAgIG1hY2hpbmVzKSBzaW5jZSB0aGUgZmllbGRzJ3Mgd2lkdGggaXMgMjAgYW5kIHRoZXJlIG51bWJlcnMgd2l0aAotICAgICBtb3JlIHRoYW4gMzIgYml0cyBjYW4gYmUgcmVwcmVzZW50ZWQuICAqLwotICBzcHJpbnRmIChmaGRyLm1lbW9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLQotICBtZW1zZXQgKCZhaGRyLCAwLCBzaXplb2YgYWhkcik7Ci0gIC8qIFhYWCBUaGUgbmV4dCB0d28gY2FsbHMgYWN0dWFsbHkgc2hvdWxkIHVzZSAlbGxkIChhdCBsZWFzdCBvbiAzMi1iaXQKLSAgICAgbWFjaGluZXMpIHNpbmNlIHRoZSBmaWVsZHMncyB3aWR0aCBpcyAyMCBhbmQgdGhlcmUgbnVtYmVycyB3aXRoCi0gICAgIG1vcmUgdGhhbiAzMiBiaXRzIGNhbiBiZSByZXByZXNlbnRlZC4gICovCi0gIHNwcmludGYgKGFoZHIuc2l6ZSwgIiVsZCIsIChsb25nKSAoMTIgKyBjb3VudCAqIDEyICsgdG90YWxfbmFtbGVuKSk7Ci0gIHNwcmludGYgKGFoZHIucHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLSAgc3ByaW50ZiAoYWhkci5kYXRlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci51aWQsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLmdpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIubW9kZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIubmFtbGVuLCAiJWQiLCAwKTsKLQotICBzaXplID0gKFNJWkVPRl9BUl9IRFJfQklHCi0JICArIDEyCi0JICArIGNvdW50ICogMTIKLQkgICsgdG90YWxfbmFtbGVuCi0JICArIFNYQ09GRkFSRk1BRyk7Ci0KLSAgcHJldm9mZiA9IG5leHRvZmY7Ci0gIG5leHRvZmYgKz0gc2l6ZSArIChzaXplICYgMSk7Ci0KLSAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKLSAgICAvKiBYWFggVGhpcyBjYWxsIGFjdHVhbGx5IHNob3VsZCB1c2UgJWxsZCAoYXQgbGVhc3Qgb24gMzItYml0Ci0gICAgICAgbWFjaGluZXMpIHNpbmNlIHRoZSBmaWVsZHMncyB3aWR0aCBpcyAyMCBhbmQgdGhlcmUgbnVtYmVycyB3aXRoCi0gICAgICAgbW9yZSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgICBzcHJpbnRmIChhaGRyLm5leHRvZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChhaGRyLm5leHRvZmYsICIlZCIsIDApOwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZhaGRyOyBwIDwgKGNoYXIgKikgJmFoZHIgKyBTSVpFT0ZfQVJfSERSX0JJRzsgcCsrKQotICAgIGlmICgqcCA9PSAnXDAnKQotICAgICAgKnAgPSAnICc7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmFoZHIsIDEsIFNJWkVPRl9BUl9IRFJfQklHLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSX0JJRwotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgWENPRkZBUkZNQUcsIDEsIFNYQ09GRkFSRk1BRywgYWJmZCkKLQkgICE9IFNYQ09GRkFSRk1BRykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNwcmludGYgKGRlY2J1ZiwgIiUtMTJsZCIsIChsb25nKSBjb3VudCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGRlY2J1ZiwgMSwgMTIsIGFiZmQpICE9IDEyKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgc3ByaW50ZiAoZGVjYnVmLCAiJS0xMmxkIiwgKGxvbmcpIG9mZnNldHNbaV0pOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVjYnVmLCAxLCAxMiwgYWJmZCkgIT0gMTIpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIG5hbWUgPSBub3JtYWxpemVfZmlsZW5hbWUgKHN1Yik7Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmFtZSwgMSwgbmFtbGVuICsgMSwgYWJmZCkgIT0gbmFtbGVuICsgMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKHNpemUgJiAxKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGIgPSAnXDAnOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGFybWFwLCBpZiBhcHByb3ByaWF0ZS4gICovCi0KLSAgaWYgKCEgbWFrZW1hcCB8fCAhIGhhc29iamVjdHMpCi0gICAgc3ByaW50ZiAoZmhkci5zeW1vZmYsICIlZCIsIDApOwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotICAgICAgLyogWFhYIFRoaXMgY2FsbCBhY3R1YWxseSBzaG91bGQgdXNlICVsbGQgKGF0IGxlYXN0IG9uIDMyLWJpdAotCSBtYWNoaW5lcykgc2luY2UgdGhlIGZpZWxkcydzIHdpZHRoIGlzIDIwIGFuZCB0aGVyZSBudW1iZXJzIHdpdGgKLQkgbW9yZSB0aGFuIDMyIGJpdHMgY2FuIGJlIHJlcHJlc2VudGVkLiAgKi8KLSAgICAgIHNwcmludGYgKGZoZHIuc3ltb2ZmLCAiJWxkIiwgKGxvbmcpIG5leHRvZmYpOwotICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gKFBUUikgJmZoZHI7Ci0gICAgICBpZiAoISBfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIChhYmZkLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgYXJjaGl2ZSBmaWxlIGhlYWRlci4gICovCi0KLSAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgZm9yIChwID0gKGNoYXIgKikgJmZoZHI7IHAgPCAoY2hhciAqKSAmZmhkciArIFNJWkVPRl9BUl9GSUxFX0hEUl9CSUc7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJmZoZHIsIFNJWkVPRl9BUl9GSUxFX0hEUl9CSUcsIDEsIGFiZmQpICE9Ci0JICBTSVpFT0ZfQVJfRklMRV9IRFJfQklHKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghIHhjb2ZmX2JpZ19mb3JtYXRfcCAoYWJmZCkpCi0gICAgcmV0dXJuIHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHNfb2xkIChhYmZkKTsKLSAgZWxzZQotICAgIHJldHVybiB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzX2JpZyAoYWJmZCk7Ci19Ci0MCi0vKiBXZSBjYW4ndCB1c2UgdGhlIHVzdWFsIGNvZmZfc2l6ZW9mX2hlYWRlcnMgcm91dGluZSwgYmVjYXVzZSBBSVgKLSAgIGFsd2F5cyB1c2VzIGFuIGEub3V0IGhlYWRlci4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotX2JmZF94Y29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgc2l6ZTsKLQotICBzaXplID0gRklMSFNaOwotICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKLSAgICBzaXplICs9IEFPVVRTWjsKLSAgZWxzZQotICAgIHNpemUgKz0gU01BTExfQU9VVFNaOwotICBzaXplICs9IGFiZmQtPnNlY3Rpb25fY291bnQgKiBTQ05IU1o7Ci0gIHJldHVybiBzaXplOwotfQotDAotI2RlZmluZSBDT1JFX0ZJTEVfUCBfYmZkX2R1bW15X3RhcmdldAotCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBcCi0gIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi0jaWZkZWYgQUlYX0NPUkUKLSN1bmRlZiBDT1JFX0ZJTEVfUAotI2RlZmluZSBDT1JFX0ZJTEVfUCByczYwMDBjb2ZmX2NvcmVfcAotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKiByczYwMDBjb2ZmX2NvcmVfcCAoKTsKLWV4dGVybiBib29sZWFuIHJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKCk7Ci1leHRlcm4gYm9vbGVhbiByczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoKTsKLQotI3VuZGVmCWNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICBcCi0JCQkJICAgICByczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi1leHRlcm4gY2hhciAqcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI3VuZGVmIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0KLWV4dGVybiBpbnQgcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLQotI3VuZGVmCWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUJY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwlyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYgLyogQUlYX0NPUkUgKi8KLQotI2lmZGVmIExZTlhfQ09SRQotCi0jdW5kZWYgQ09SRV9GSUxFX1AKLSNkZWZpbmUgQ09SRV9GSUxFX1AgbHlueF9jb3JlX2ZpbGVfcAotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmx5bnhfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWV4dGVybiBib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsCi0JCQkJCQkJICAgIGJmZCAqZXhlY19iZmQpKTsKLSN1bmRlZgljb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi1leHRlcm4gY2hhciAqbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI3VuZGVmIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0KLWV4dGVybiBpbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotCi0jZGVmaW5lIF9iZmRfeGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgX2JmZF94Y29mZl9iZmRfZ2Nfc2VjdGlvbnMgY29mZl9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgX2JmZF94Y29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uIGNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0vKiBUaGUgdHJhbnNmZXIgdmVjdG9yIHRoYXQgbGVhZHMgdGhlIG91dHNpZGUgd29ybGQgdG8gYWxsIG9mIHRoZSBhYm92ZS4gKi8KLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9TWU0KLSAgVEFSR0VUX1NZTSA9Ci0jZWxzZQotICByczYwMDBjb2ZmX3ZlYyA9Ci0jZW5kaWYKLXsKLSNpZmRlZiBUQVJHRVRfTkFNRQotICBUQVJHRVRfTkFNRSwKLSNlbHNlCi0gICJhaXhjb2ZmLXJzNjAwMCIsCQkvKiBuYW1lICovCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgRFlOQU1JQyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIHhjb2ZmX2FyY2hpdmVfcCwgQ09SRV9GSUxFX1B9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHhjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF94Y29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfeGNvZmYpLAotCi0gIE5VTEwsCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1zaC5jIGIvYmZkL2NvZmYtc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxZmVjZC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMxMCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgU3VwZXItSCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KLSAgIFJlbGF4aW5nIGNvZGUgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi9zaC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2luY2x1ZGUgImNvZmYvcGUuaCIKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYyBib29sZWFuIHNoX2FsaWduX2xvYWRfc3BhbiAKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgYm9vbGVhbiAoKikgKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpLAotCSAgIFBUUiwgYmZkX3ZtYSAqKiwgYmZkX3ZtYSAqLCBiZmRfdm1hLCBiZmRfdm1hLCBib29sZWFuICopKTsKLQotI2RlZmluZSBfYmZkX3NoX2FsaWduX2xvYWRfc3BhbiBzaF9hbGlnbl9sb2FkX3NwYW4KLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIEludGVybmFsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZ2V0X3N5bWJvbF92YWx1ZSBQQVJBTVMgKChhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIHNoX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfcmVsYXhfZGVsZXRlX2J5dGVzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqc2hfaW5zbl9pbmZvIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotI2VuZGlmCi1zdGF0aWMgYm9vbGVhbiBzaF9hbGlnbl9sb2FkcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF9ieXRlICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfc3dhcF9pbnNucwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9ieXRlICpzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0vKiBDYW4ndCBidWlsZCBpbXBvcnQgdGFibGVzIHdpdGggMioqNCBhbGlnbm1lbnQuICAqLwotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIJMgotI2Vsc2UKLS8qIERlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgdG8gMioqNC4gICovCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUgk0Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotLyogQWxpZ24gUEUgZXhlY3V0YWJsZXMuICAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAKLSNlbmRpZgotCi0vKiBHZW5lcmF0ZSBsb25nIGZpbGUgbmFtZXMuICAqLwotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQKLSAgIGFwcGVhciBpbiB0aGUgb3V0cHV0IC5yZWxvYyBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLXsKLSAgcmV0dXJuICEgaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT50eXBlICE9IFJfU0hfSU1BR0VCQVNFOwotfSAgICAgCi0jZW5kaWYKLQotLyogVGhlIHN1cHBvcnRlZCByZWxvY2F0aW9ucy4gIFRoZXJlIGFyZSBhIGxvdCBvZiByZWxvY2F0aW9ucyBkZWZpbmVkCi0gICBpbiBjb2ZmL2ludGVybmFsLmggd2hpY2ggd2UgZG8gbm90IGV4cGVjdCB0byBldmVyIHNlZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzaF9jb2ZmX2hvd3Rvc1tdID0KLXsKLSAgRU1QVFlfSE9XVE8gKDApLAotICBFTVBUWV9IT1dUTyAoMSksCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIC8qIFdpbmRvd3MgQ0UgKi8KLSAgSE9XVE8gKFJfU0hfSU1NMzJDRSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9pbW0zMmNlIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSNlbHNlCi0gIEVNUFRZX0hPV1RPICgyKSwKLSNlbmRpZgotICBFTVBUWV9IT1dUTyAoMyksIC8qIFJfU0hfUENSRUw4ICovCi0gIEVNUFRZX0hPV1RPICg0KSwgLyogUl9TSF9QQ1JFTDE2ICovCi0gIEVNUFRZX0hPV1RPICg1KSwgLyogUl9TSF9ISUdIOCAqLwotICBFTVBUWV9IT1dUTyAoNiksIC8qIFJfU0hfSU1NMjQgKi8KLSAgRU1QVFlfSE9XVE8gKDcpLCAvKiBSX1NIX0xPVzE2ICovCi0gIEVNUFRZX0hPV1RPICg4KSwKLSAgRU1QVFlfSE9XVE8gKDkpLCAvKiBSX1NIX1BDRElTUDhCWTQgKi8KLQotICBIT1dUTyAoUl9TSF9QQ0RJU1A4QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9wY2Rpc3A4YnkyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDExKSwgLyogUl9TSF9QQ0RJU1A4ICovCi0KLSAgSE9XVE8gKFJfU0hfUENESVNQLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjZGlzcDEyYnkyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBFTVBUWV9IT1dUTyAoMTMpLAotCi0gIEhPV1RPIChSX1NIX0lNTTMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2ltbTMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBFTVBUWV9IT1dUTyAoMTUpLAotI2lmZGVmIENPRkZfV0lUSF9QRQotICBIT1dUTyAoUl9TSF9JTUFHRUJBU0UsICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywgICAgICAgCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgInJ2YTMyIiwJICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSNlbHNlCi0gIEVNUFRZX0hPV1RPICgxNiksIC8qIFJfU0hfSU1NOCAqLwotI2VuZGlmCi0gIEVNUFRZX0hPV1RPICgxNyksIC8qIFJfU0hfSU1NOEJZMiAqLwotICBFTVBUWV9IT1dUTyAoMTgpLCAvKiBSX1NIX0lNTThCWTQgKi8KLSAgRU1QVFlfSE9XVE8gKDE5KSwgLyogUl9TSF9JTU00ICovCi0gIEVNUFRZX0hPV1RPICgyMCksIC8qIFJfU0hfSU1NNEJZMiAqLwotICBFTVBUWV9IT1dUTyAoMjEpLCAvKiBSX1NIX0lNTTRCWTQgKi8KLQotICBIT1dUTyAoUl9TSF9QQ1JFTElNTThCWTIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfcGNyZWxpbW04YnkyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfUENSRUxJTU04Qlk0LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjcmVsaW1tOGJ5NCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0lNTTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2ltbTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfU1dJVENIMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfc3dpdGNoMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9zd2l0Y2gzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfVVNFUywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl91c2VzIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfY291bnQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0FMSUdOLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2FsaWduIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2NvZGUiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfZGF0YSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfbGFiZWwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1NXSVRDSDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9zd2l0Y2g4IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2RlZmluZSBTSF9DT0ZGX0hPV1RPX0NPVU5UIChzaXplb2Ygc2hfY29mZl9ob3d0b3MgLyBzaXplb2Ygc2hfY29mZl9ob3d0b3NbMF0pCi0KLS8qIENoZWNrIGZvciBhIGJhZCBtYWdpYyBudW1iZXIuICAqLwotI2RlZmluZSBCQURNQUcoeCkgU0hCQURNQUcoeCkKLQotLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKHRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkKS4gICovCi0jZGVmaW5lIFNIIDEKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgaGVyZS4gICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotLyogU3dhcCB0aGUgcl9vZmZzZXQgZmllbGQgaW4gYW5kIG91dC4gICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotCi0vKiBTd2FwIG91dCBleHRyYSBpbmZvcm1hdGlvbiBpbiB0aGUgcmVsb2Mgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpCVwKLSAgZG8JCQkJCQlcCi0gICAgewkJCQkJCVwKLSAgICAgIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsJCQlcCi0gICAgICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7CQkJXAotICAgIH0JCQkJCQlcCi0gIHdoaWxlICgwKQotI2VuZGlmCi0KLS8qIEdldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgbG9uZwotZ2V0X3N5bWJvbF92YWx1ZSAoc3ltYm9sKSAgICAgICAKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSAKLSAgICByZWxvY2F0aW9uID0gKHN5bWJvbC0+dmFsdWUgKwotCQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotICByZXR1cm4gcmVsb2NhdGlvbjsKLX0KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotLyogQ29udmVydCBhbiBydHlwZSB0byBob3d0byBmb3IgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuCi0gICBDb3BpZWQgZnJvbSBjb2ZmLWkzODYuICAqLwotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfc2hfcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9zaF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqIHNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICogc3ltOwotICAgICBiZmRfdm1hICogYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqIGhvd3RvOwotCi0gIGhvd3RvID0gc2hfY29mZl9ob3d0b3MgKyByZWwtPnJfdHlwZTsKLQotICAqYWRkZW5kcCA9IDA7Ci0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICAqYWRkZW5kcCArPSBzZWMtPnZtYTsKLQotICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtID09IDAgJiYgc3ltLT5uX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgc2VjdGlvbiBjb250ZW50cyBpbmNsdWRlIHRoZQotCSBzaXplIChzeW0tPm5fdmFsdWUpIGFzIGFuIGFkZGVuZC4gIFRoZSByZWxvY2F0ZV9zZWN0aW9uCi0JIGZ1bmN0aW9uIHdpbGwgYmUgYWRkaW5nIGluIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgV2UKLQkgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBvcmRlciB0byBnZXQgdGhlCi0JIGNvcnJlY3QgcmVzdWx0LiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0gICAgfQotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgKmFkZGVuZHAgLT0gNDsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB0aGVuIHRoZSBnZW5lcmljIGNvZGUgaXMgZ29pbmcgdG8KLSAgICAgICAgIGFkZCBiYWNrIHRoZSBzeW1ib2wgdmFsdWUgaW4gb3JkZXIgdG8gY2FuY2VsIG91dCBhbgotICAgICAgICAgYWRqdXN0bWVudCBpdCBtYWRlIHRvIHRoZSBhZGRlbmQuICBIb3dldmVyLCB3ZSBzZXQgdGhlIGFkZGVuZAotICAgICAgICAgdG8gMCBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvbi4gIFdlIG5lZWQgdG8gYWRqdXN0IGhlcmUsCi0gICAgICAgICB0byBhdm9pZCB0aGUgYWRqdXN0bWVudCB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgbWFrZS4gIEZJWE1FOgotICAgICAgICAgVGhpcyBpcyBnZXR0aW5nIGEgYml0IGhhY2tpc2guICAqLwotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCSphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKLSAgICB9Ci0KLSAgaWYgKHJlbC0+cl90eXBlID09IFJfU0hfSU1BR0VCQVNFKQotICAgICphZGRlbmRwIC09IHBlX2RhdGEgKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQotICByZXR1cm4gaG93dG87Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFwIEJGRCByZWxvYyBjb2RlcyB0byBTSCBQRSByZWxvY3MuICAqLwotc3RydWN0IHNoY29mZl9yZWxvY19tYXAKLXsKLSAgdW5zaWduZWQgY2hhciBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIHNoY29mZl9yZWxvY192YWw7Ci19OwotCi0vKiBBbiBhcnJheSBtYXBwaW5nIEJGRCByZWxvYyBjb2RlcyB0byBTSCBQRSByZWxvY3MuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzaGNvZmZfcmVsb2NfbWFwIHNoX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU0hfSU1NMzJDRSB9LAotICB7IEJGRF9SRUxPQ19SVkEsIFJfU0hfSU1BR0VCQVNFIH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU0hfSU1NMzJDRSB9LAotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgY29kZSwgcmV0dXJuIHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIHRoZQotICAgY29ycmVzcG9uZGluZyBTSCBQRSByZWxvYy4gICovCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCXNoX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotc2hfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc2hfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IHNoY29mZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKHNoX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZzaF9jb2ZmX2hvd3Rvc1soaW50KSBzaF9yZWxvY19tYXBbaV0uc2hjb2ZmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIGZwcmludGYgKHN0ZGVyciwgIlNIIEVycm9yOiB1bmtub3duIHJlbG9jIHR5cGUgJWRcbiIsIGNvZGUpOwotICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIGluIGNvZmZjb2RlLmggdG8gZ2V0IHRoZSBob3d0byBjb3JyZXNwb25kaW5nIHRvCi0gICBhbiBpbnRlcm5hbCByZWxvYy4gICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8ocmVsZW50LCBpbnRlcm5hbCkJCVwKLSAgKChyZWxlbnQpLT5ob3d0byA9CQkJCVwKLSAgICgoaW50ZXJuYWwpLT5yX3R5cGUgPCBTSF9DT0ZGX0hPV1RPX0NPVU5UCVwKLSAgICA/ICZzaF9jb2ZmX2hvd3Rvc1soaW50ZXJuYWwpLT5yX3R5cGVdCVwKLSAgICA6IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpKQotCi0vKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBtYWNybyBpbiBjb2ZmY29kZS5oLCBleGNlcHQgdGhhdCBpdCBjb3BpZXMKLSAgIHJfb2Zmc2V0IGludG8gcmVsb2NfZW50cnktPmFkZGVuZCBmb3Igc29tZSByZWxvY3MuICAqLwotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9TV0lUQ0g4CQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX1NXSVRDSDE2CQkJXAotCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfU1dJVENIMzIJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9VU0VTCQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0NPVU5UCQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0FMSUdOKQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gKHJlbG9jKS5yX29mZnNldDsJCQlcCi0gIH0KLQotLyogVGhpcyBpcyB0aGUgaG93dG8gZnVuY3Rpb24gZm9yIHRoZSBTSCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNoX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfdm1hIHN5bV92YWx1ZTsKLSAgdW5zaWduZWQgc2hvcnQgcl90eXBlOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gYWRkciArIChiZmRfYnl0ZSAqKSBkYXRhOwotCi0gIHJfdHlwZSA9IHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFBhcnRpYWwgbGlua2luZy0tZG8gbm90aGluZy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogQWxtb3N0IGFsbCByZWxvY3MgaGF2ZSB0byBkbyB3aXRoIHJlbGF4aW5nLiAgSWYgYW55IHdvcmsgbXVzdCBiZQotICAgICBkb25lIGZvciB0aGVtLCBpdCBoYXMgYmVlbiBkb25lIGluIHNoX3JlbGF4X3NlY3Rpb24uICAqLwotICBpZiAocl90eXBlICE9IFJfU0hfSU1NMzIKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgICYmIHJfdHlwZSAhPSBSX1NIX0lNTTMyQ0UKLSAgICAgICYmIHJfdHlwZSAhPSBSX1NIX0lNQUdFQkFTRQotI2VuZGlmCi0gICAgICAmJiAocl90eXBlICE9IFJfU0hfUENESVNQCi0JICB8fCAoc3ltYm9sX2luLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICBpZiAoc3ltYm9sX2luICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBzeW1fdmFsdWUgPSBnZXRfc3ltYm9sX3ZhbHVlIChzeW1ib2xfaW4pOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfU0hfSU1NMzI6Ci0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgY2FzZSBSX1NIX0lNTTMyQ0U6Ci0jZW5kaWYKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICBjYXNlIFJfU0hfSU1BR0VCQVNFOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gKHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQKLQkgICAgICAgLSBwZV9kYXRhIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgY2FzZSBSX1NIX1BDRElTUDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBzeW1fdmFsdWUgKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIHN5bV92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIGFkZHIKLQkJICAgICsgNCk7Ci0gICAgICBzeW1fdmFsdWUgKz0gKGluc24gJiAweGZmZikgPDwgMTsKLSAgICAgIGlmIChpbnNuICYgMHg4MDApCi0Jc3ltX3ZhbHVlIC09IDB4MTAwMDsKLSAgICAgIGluc24gPSAoaW5zbiAmIDB4ZjAwMCkgfCAoc3ltX3ZhbHVlICYgMHhmZmYpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgICAgaWYgKHN5bV92YWx1ZSA8IChiZmRfdm1hKSAtMHgxMDAwIHx8IHN5bV92YWx1ZSA+PSAweDEwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gKLQotLyogV2UgY2FuIGRvIHJlbGF4aW5nLiAgKi8KLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBzaF9yZWxheF9zZWN0aW9uCi0KLS8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIHNoX3JlbG9jYXRlX3NlY3Rpb24KLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byB1c2Ugc3BlY2lhbCBjb2RlIHRvIGdldCB0aGUgcmVsb2NhdGVkCi0gICBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0MCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgb24gdGhlIFNILgotCi0gICBGdW5jdGlvbiBjYWxscyBvbiB0aGUgU0ggbG9vayBsaWtlIHRoaXM6Ci0KLSAgICAgICBtb3ZsICBMMSxyMAotICAgICAgIC4uLgotICAgICAgIGpzciAgIEByMAotICAgICAgIC4uLgotICAgICBMMToKLSAgICAgICAubG9uZyBmdW5jdGlvbgotCi0gICBUaGUgY29tcGlsZXIgYW5kIGFzc2VtYmxlciB3aWxsIGNvb3BlcmF0ZSB0byBjcmVhdGUgUl9TSF9VU0VTCi0gICByZWxvY3Mgb24gdGhlIGpzciBpbnN0cnVjdGlvbnMuICBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlCi0gICBSX1NIX1VTRVMgcmVsb2MgaXMgdGhlIFBDIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2gKLSAgIGxvYWRzIHRoZSByZWdpc3RlciAodGhlIHJfb2Zmc2V0IGZpZWxkIGlzIGNvbXB1dGVkIGFzIHRob3VnaCBpdAotICAgd2VyZSBhIGp1bXAgaW5zdHJ1Y3Rpb24sIHNvIHRoZSBvZmZzZXQgdmFsdWUgaXMgYWN0dWFsbHkgZnJvbSBmb3VyCi0gICBieXRlcyBwYXN0IHRoZSBpbnN0cnVjdGlvbikuICBUaGUgbGlua2VyIGNhbiB1c2UgdGhpcyByZWxvYyB0bwotICAgZGV0ZXJtaW5lIGp1c3Qgd2hpY2ggZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkLCBhbmQgdGh1cyBkZWNpZGUKLSAgIHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdG8gcmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuCi0KLSAgIElmIG11bHRpcGxlIGZ1bmN0aW9uIGNhbGxzIGFyZSBhbGwgYmFzZWQgb24gYSBzaW5nbGUgcmVnaXN0ZXIgbG9hZAotICAgKGkuZS4sIHRoZSBzYW1lIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyksIHRoZSBjb21waWxlcgotICAgZ3VhcmFudGVlcyB0aGF0IGVhY2ggZnVuY3Rpb24gY2FsbCB3aWxsIGhhdmUgYW4gUl9TSF9VU0VTIHJlbG9jLgotICAgVGhlcmVmb3JlLCBpZiB0aGUgbGlua2VyIGlzIGFibGUgdG8gY29udmVydCBlYWNoIFJfU0hfVVNFUyByZWxvYwotICAgd2hpY2ggcmVmZXJzIHRvIHRoYXQgYWRkcmVzcywgaXQgY2FuIHNhZmVseSBlbGltaW5hdGUgdGhlIHJlZ2lzdGVyCi0gICBsb2FkLgotCi0gICBXaGVuIHRoZSBhc3NlbWJsZXIgY3JlYXRlcyBhbiBSX1NIX1VTRVMgcmVsb2MsIGl0IGV4YW1pbmVzIGl0IHRvCi0gICBkZXRlcm1pbmUgd2hpY2ggYWRkcmVzcyBpcyBiZWluZyBsb2FkZWQgKEwxIGluIHRoZSBhYm92ZSBleGFtcGxlKS4KLSAgIEl0IHRoZW4gY291bnRzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byB0aGF0IGFkZHJlc3MsIGFuZAotICAgY3JlYXRlcyBhbiBSX1NIX0NPVU5UIHJlbG9jIGF0IHRoYXQgYWRkcmVzcy4gIFRoZSByX29mZnNldCBmaWVsZCBvZgotICAgdGhlIFJfU0hfQ09VTlQgcmVsb2Mgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMuICBJZiB0aGUKLSAgIGxpbmtlciBpcyBhYmxlIHRvIGVsaW1pbmF0ZSBhIHJlZ2lzdGVyIGxvYWQsIGl0IGNhbiB1c2UgdGhlCi0gICBSX1NIX0NPVU5UIHJlbG9jIHRvIHNlZSB3aGV0aGVyIGl0IGNhbiBhbHNvIGVsaW1pbmF0ZSB0aGUgZnVuY3Rpb24KLSAgIGFkZHJlc3MuCi0KLSAgIFNIIHJlbGF4aW5nIGFsc28gaGFuZGxlcyBhbm90aGVyLCB1bnJlbGF0ZWQsIG1hdHRlci4gIE9uIHRoZSBTSCwgaWYKLSAgIGEgbG9hZCBvciBzdG9yZSBpbnN0cnVjdGlvbiBpcyBub3QgYWxpZ25lZCBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeSwKLSAgIHRoZSBtZW1vcnkgY3ljbGUgaW50ZXJmZXJlcyB3aXRoIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24gZmV0Y2gsCi0gICBjYXVzaW5nIGEgb25lIGN5Y2xlIGJ1YmJsZSBpbiB0aGUgcGlwZWxpbmUuICBUaGVyZWZvcmUsIHdlIHRyeSB0bwotICAgYWxpZ24gbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIG9uIGZvdXIgYnl0ZSBib3VuZGFyaWVzIGlmIHdlCi0gICBjYW4sIGJ5IHN3YXBwaW5nIHRoZW0gd2l0aCBvbmUgb2YgdGhlIGFkamFjZW50IGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuIAotc2hfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIGJvb2xlYW4gaGF2ZV9jb2RlOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIGxpbmtfaW5mby0+a2VlcF9tZW1vcnksCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBOVUxMLCBmYWxzZSwKLQkJICAgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBoYXZlX2NvZGUgPSBmYWxzZTsKLQotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgbGFkZHIsIHBhZGRyLCBzeW12YWw7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBpbnNuOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZm4sICppcmVsc2NhbiwgKmlyZWxjb3VudDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgYmZkX3NpZ25lZF92bWEgZm9mZjsKLQotICAgICAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0NPREUpCi0JaGF2ZV9jb2RlID0gdHJ1ZTsKLQotICAgICAgaWYgKGlyZWwtPnJfdHlwZSAhPSBSX1NIX1VTRVMpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTAotCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUgUl9TSF9VU0VTIHJlbG9jIHdpbGwgcG9pbnQgdXMgdG8KLSAgICAgICAgIHRoZSByZWdpc3RlciBsb2FkLiAgVGhlIDQgaXMgYmVjYXVzZSB0aGUgcl9vZmZzZXQgZmllbGQgaXMKLSAgICAgICAgIGNvbXB1dGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEganVtcCBvZmZzZXQsIHdoaWNoIGFyZSBiYXNlZAotICAgICAgICAgZnJvbSA0IGJ5dGVzIGFmdGVyIHRoZSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGxhZGRyID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hICsgNDsKLSAgICAgIC8qIENhcmVmdWwgdG8gc2lnbiBleHRlbmQgdGhlIDMyLWJpdCBvZmZzZXQuICAqLwotICAgICAgbGFkZHIgKz0gKChpcmVsLT5yX29mZnNldCAmIDB4ZmZmZmZmZmYpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwOwotICAgICAgaWYgKGxhZGRyID49IHNlYy0+X3Jhd19zaXplKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBvZmZzZXQiLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbGFkZHIpOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IG1vdi5sIE5OLHJOLCB3ZSBkb24ndCBrbm93IHdoYXQgdG8gZG8uICAqLwotICAgICAgaWYgKChpbnNuICYgMHhmMDAwKSAhPSAweGQwMDApCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBSX1NIX1VTRVMgcG9pbnRzIHRvIHVucmVjb2duaXplZCBpbnNuIDB4JXgiLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIsIGluc24pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzIGJlaW5nIGxvYWRlZC4gIFRoZQotICAgICAgCSBkaXNwbGFjZW1lbnQgaW4gdGhlIG1vdi5sIGluc3RydWN0aW9uIGlzIHF1YWRydXBsZWQuICBJdCBpcyBhCi0gICAgICAJIGRpc3BsYWNlbWVudCBmcm9tIGZvdXIgYnl0ZXMgYWZ0ZXIgdGhlIG1vdmwgaW5zdHJ1Y3Rpb24sIGJ1dCwKLSAgICAgIAkgYmVmb3JlIGFkZGluZyBpbiB0aGUgUEMgYWRkcmVzcywgdHdvIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKLSAgICAgIAkgb2YgdGhlIFBDIGFyZSBjbGVhcmVkLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlY3Rpb24gaXMgYWxpZ25lZAotICAgICAgCSBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0gICAgICBwYWRkciA9IGluc24gJiAweGZmOwotICAgICAgcGFkZHIgKj0gNDsKLSAgICAgIHBhZGRyICs9IChsYWRkciArIDQpICZ+IDM7Ci0gICAgICBpZiAocGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIGxvYWQgb2Zmc2V0IiwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgcmVsb2MgZm9yIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzCi0gICAgICAgICBiZWluZyBsb2FkZWQuICBUaGlzIHJlbG9jIHdpbGwgdGVsbCB1cyB3aGljaCBmdW5jdGlvbiBpcwotICAgICAgICAgYWN0dWFsbHkgYmVpbmcgY2FsbGVkLiAgKi8KLSAgICAgIHBhZGRyICs9IHNlYy0+dm1hOwotICAgICAgZm9yIChpcmVsZm4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxmbiA8IGlyZWxlbmQ7IGlyZWxmbisrKQotCWlmIChpcmVsZm4tPnJfdmFkZHIgPT0gcGFkZHIKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQkgICAgJiYgKGlyZWxmbi0+cl90eXBlID09IFJfU0hfSU1NMzIKLQkJfHwgaXJlbGZuLT5yX3R5cGUgPT0gUl9TSF9JTU0zMkNFCi0JCXx8IGlyZWxmbi0+cl90eXBlID09IFJfU0hfSU1BR0VCQVNFKSkKLQotI2Vsc2UKLQkgICAgJiYgaXJlbGZuLT5yX3R5cGUgPT0gUl9TSF9JTU0zMikKLSNlbmRpZgotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbGZuID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCByZWxvYyIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkgICAgKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJICAgICArIChpcmVsZm4tPnJfc3ltbmR4Ci0JCQkJKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkgICAgJnN5bSk7Ci0gICAgICBpZiAoc3ltLm5fc2NudW0gIT0gMCAmJiBzeW0ubl9zY251bSAhPSBzZWMtPnRhcmdldF9pbmRleCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IHN5bWJvbCBpbiB1bmV4cGVjdGVkIHNlY3Rpb24iLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQpCi0JewotCSAgc3ltdmFsID0gKHN5bS5uX3ZhbHVlCi0JCSAgICAtIHNlYy0+dm1hCi0JCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKVtpcmVsZm4tPnJfc3ltbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIHN5bXZhbCArPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHBhZGRyIC0gc2VjLT52bWEpOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxsIGNhbiBiZSBzaG9ydGVuZWQuICAqLwotICAgICAgZm9mZiA9IChzeW12YWwKLQkgICAgICAtIChpcmVsLT5yX3ZhZGRyCi0JCSAtIHNlYy0+dm1hCi0JCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICsgNCkpOwotICAgICAgaWYgKGZvZmYgPCAtMHgxMDAwIHx8IGZvZmYgPj0gMHgxMDAwKQotCXsKLQkgIC8qIEFmdGVyIGFsbCB0aGF0IHdvcmssIHdlIGNhbid0IHNob3J0ZW4gdGhpcyBmdW5jdGlvbiBjYWxsLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogU2hvcnRlbiB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JewotCSAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JICAgICgoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9yZWxvY3MgPSB0cnVlOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBjb250ZW50czsKLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0gICAgICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0gdHJ1ZTsKLQotICAgICAgLyogUmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotCi0gICAgICAvKiBDaGFuZ2UgdGhlIFJfU0hfVVNFUyByZWxvYyBpbnRvIGFuIFJfU0hfUENESVNQIHJlbG9jLCBhbmQKLSAgICAgICAgIHJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLSAgICAgIGlyZWwtPnJfdHlwZSA9IFJfU0hfUENESVNQOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSBpcmVsZm4tPnJfc3ltbmR4OwotICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCkKLQl7Ci0JICAvKiBJZiB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgYmVjYXVzZSBvZiBmdXR1cmUgcmVsYXhpbmcsCi0gICAgICAgICAgICAgaXQgd2lsbCBiZSBoYW5kbGVkIGhlcmUgbGlrZSBvdGhlciBpbnRlcm5hbCBQQ0RJU1AKLSAgICAgICAgICAgICByZWxvY3MuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJICAgICAgMHhiMDAwIHwgKChmb2ZmID4+IDEpICYgMHhmZmYpLAotCQkgICAgICBjb250ZW50cyArIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGNhbid0IGZ1bGx5IHJlc29sdmUgdGhpcyB5ZXQsIGJlY2F1c2UgdGhlIGV4dGVybmFsCi0gICAgICAgICAgICAgc3ltYm9sIHZhbHVlIG1heSBiZSBjaGFuZ2VkIGJ5IGZ1dHVyZSByZWxheGluZy4gIFdlIGxldAotICAgICAgICAgICAgIHRoZSBmaW5hbCBsaW5rIHBoYXNlIGhhbmRsZSBpdC4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLCAweGIwMDAsIGNvbnRlbnRzICsgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hKTsKLQl9Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIFJfU0hfVVNFUyByZWxvYyByZWZlcnJpbmcgdG8gdGhlIHNhbWUKLSAgICAgICAgIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsZW5kOyBpcmVsc2NhbisrKQotCWlmIChpcmVsc2Nhbi0+cl90eXBlID09IFJfU0hfVVNFUwotCSAgICAmJiBsYWRkciA9PSBpcmVsc2Nhbi0+cl92YWRkciAtIHNlYy0+dm1hICsgNCArIGlyZWxzY2FuLT5yX29mZnNldCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxzY2FuIDwgaXJlbGVuZCkKLQl7Ci0JICAvKiBTb21lIG90aGVyIGZ1bmN0aW9uIGNhbGwgZGVwZW5kcyB1cG9uIHRoaXMgcmVnaXN0ZXIgbG9hZCwKLQkgICAgIGFuZCB3ZSBoYXZlIG5vdCB5ZXQgY29udmVydGVkIHRoYXQgZnVuY3Rpb24gY2FsbC4KLQkgICAgIEluZGVlZCwgd2UgbWF5IG5ldmVyIGJlIGFibGUgdG8gY29udmVydCBpdC4gIFRoZXJlIGlzCi0JICAgICBub3RoaW5nIGVsc2Ugd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciBhIFJfU0hfQ09VTlQgcmVsb2Mgb24gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZQotICAgICAgICAgZnVuY3Rpb24gYWRkcmVzcyBpcyBzdG9yZWQuICBEbyB0aGlzIGJlZm9yZSBkZWxldGluZyBhbnkKLSAgICAgICAgIGJ5dGVzLCB0byBhdm9pZCBjb25mdXNpb24gYWJvdXQgdGhlIGFkZHJlc3MuICAqLwotICAgICAgZm9yIChpcmVsY291bnQgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxjb3VudCA8IGlyZWxlbmQ7IGlyZWxjb3VudCsrKQotCWlmIChpcmVsY291bnQtPnJfdmFkZHIgPT0gcGFkZHIKLQkgICAgJiYgaXJlbGNvdW50LT5yX3R5cGUgPT0gUl9TSF9DT1VOVCkKLQkgIGJyZWFrOwotCi0gICAgICAvKiBEZWxldGUgdGhlIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgaWYgKCEgc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGxhZGRyLCAyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCBqdXN0IGluIGNhc2UgaXQgcGVybWl0cyBzb21lCi0gICAgICAgICBvdGhlciBmdW5jdGlvbiBjYWxsIHRvIGNvbWUgd2l0aGluIHJhbmdlLCB3ZSBzaG91bGQgcmVsYXgKLSAgICAgICAgIGFnYWluLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotICAgICAgKmFnYWluID0gdHJ1ZTsKLQotICAgICAgLyogTm93IGNoZWNrIHdoZXRoZXIgd2UgZ290IGEgQ09VTlQgcmVsb2MuICAqLwotICAgICAgaWYgKGlyZWxjb3VudCA+PSBpcmVsZW5kKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgQ09VTlQgcmVsb2MiLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBudW1iZXIgb2YgdXNlcyBpcyBzdG9yZWQgaW4gdGhlIHJfb2Zmc2V0IGZpZWxkLiAgV2UndmUKLSAgICAgICAgIGp1c3QgZGVsZXRlZCBvbmUuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgY291bnQiLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLS1pcmVsY291bnQtPnJfb2Zmc2V0OwotCi0gICAgICAvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSB1c2VzLCB3ZSBjYW4gZGVsZXRlIHRoZSBhZGRyZXNzLiAgUmVsb2FkCi0gICAgICAgICB0aGUgYWRkcmVzcyBmcm9tIGlyZWxmbiwgaW4gY2FzZSBpdCB3YXMgY2hhbmdlZCBieSB0aGUKLSAgICAgICAgIHByZXZpb3VzIGNhbGwgdG8gc2hfcmVsYXhfZGVsZXRlX2J5dGVzLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfb2Zmc2V0ID09IDApCi0JewotCSAgaWYgKCEgc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJICAgICAgIGlyZWxmbi0+cl92YWRkciAtIHNlYy0+dm1hLCA0KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBXZSd2ZSBkb25lIGFsbCB3ZSBjYW4gd2l0aCB0aGF0IGZ1bmN0aW9uIGNhbGwuICAqLwotICAgIH0KLQotICAvKiBMb29rIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCB3ZSBjYW4gYWxpZ24gb24gZm91cgotICAgICBieXRlIGJvdW5kYXJpZXMuICAqLwotICBpZiAoaGF2ZV9jb2RlKQotICAgIHsKLSAgICAgIGJvb2xlYW4gc3dhcHBlZDsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgc2hfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywgJnN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc3dhcHBlZCkKLQl7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQotCQkoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOwotCSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9yZWxvY3MgPSB0cnVlOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBjb250ZW50czsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBjb2ZmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JCSgoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IE5VTEw7Ci0JICAgIH0KLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBiZmRfYnl0ZSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9BTElHTgotCSAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID4gYWRkcgotCSAgJiYgY291bnQgPCAoMSA8PCBpcmVsLT5yX29mZnNldCkpCi0JewotCSAgaXJlbGFsaWduID0gaXJlbDsKLQkgIHRvYWRkciA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIGlmIChpcmVsYWxpZ24gPT0gTlVMTCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0jZGVmaW5lIE5PUF9PUENPREUgKDB4MDAwOSkKLQotICAgICAgQkZEX0FTU0VSVCAoKGNvdW50ICYgMSkgPT0gMCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMikKLQliZmRfcHV0XzE2IChhYmZkLCBOT1BfT1BDT0RFLCBjb250ZW50cyArIHRvYWRkciAtIGNvdW50ICsgaSk7Ci0gICAgfQotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBucmFkZHIsIHN0b3A7Ci0gICAgICBiZmRfdm1hIHN0YXJ0ID0gMDsKLSAgICAgIGludCBpbnNuID0gMDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgaW50IG9mZiwgYWRqdXN0LCBvaW5zbjsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHZvZmYgPSAwOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBucmFkZHIgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0gICAgICBpZiAoKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPCB0b2FkZHIpCi0JICB8fCAoaXJlbC0+cl90eXBlID09IFJfU0hfQUxJR04KLQkgICAgICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPT0gdG9hZGRyKSkKLQlucmFkZHIgLT0gY291bnQ7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIHdhcyBmb3IgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZCwgaW4gd2hpY2gKLQkgY2FzZSB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCBpdC4gIERvbid0IGRlbGV0ZSByZWxvY3Mgd2hpY2gKLQkgcmVwcmVzZW50IGFkZHJlc3NlcywgdGhvdWdoLiAgKi8KLSAgICAgIGlmIChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPj0gYWRkcgotCSAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hIDwgYWRkciArIGNvdW50Ci0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9BTElHTgotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfQ09ERQotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfREFUQQotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfTEFCRUwpCi0JaXJlbC0+cl90eXBlID0gUl9TSF9VTlVTRUQ7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgc2VlIGlmIHRoZSByYW5nZSBpdCBjb3ZlcnMKLSAgICAgICAgIGluY2x1ZGVzIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQuICAqLwotICAgICAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCWNhc2UgUl9TSF9QQ0RJU1A6Ci0JY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKLQljYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9JTU0zMjoKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQljYXNlIFJfU0hfSU1NMzJDRToKLQljYXNlIFJfU0hfSU1BR0VCQVNFOgotI2VuZGlmCi0JICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGlzCi0gICAgICAgICAgICAgc2VjdGlvbiwgYW5kIHRoZSBzeW1ib2wgd2lsbCBub3QgYmUgYWRqdXN0ZWQgYmVsb3csIHdlCi0gICAgICAgICAgICAgbXVzdCBjaGVjayB0aGUgYWRkZW5kIHRvIHNlZSBpdCB3aWxsIHB1dCB0aGUgdmFsdWUgaW4KLSAgICAgICAgICAgICByYW5nZSB0byBiZSBhZGp1c3RlZCwgYW5kIGhlbmNlIG11c3QgYmUgY2hhbmdlZC4gICovCi0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKLQkJCQkoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkJICsgKGlyZWwtPnJfc3ltbmR4Ci0JCQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAotCQkJCSZzeW0pOwotCSAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCSAgICAgICYmIHN5bS5uX3NjbnVtID09IHNlYy0+dGFyZ2V0X2luZGV4Ci0JICAgICAgJiYgKChiZmRfdm1hKSBzeW0ubl92YWx1ZSA8PSBhZGRyCi0JCSAgfHwgKGJmZF92bWEpIHN5bS5uX3ZhbHVlID49IHRvYWRkcikpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICB2YWwgKz0gc3ltLm5fdmFsdWU7Ci0JICAgICAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQliZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICB9Ci0JICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENESVNQOEJZMjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgaWYgKG9mZiAmIDB4ODApCi0JICAgIG9mZiAtPSAweDEwMDsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ0RJU1A6Ci0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKLQkJCQkoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkJICsgKGlyZWwtPnJfc3ltbmR4Ci0JCQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAotCQkJCSZzeW0pOwotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9mZiA9IGluc24gJiAweGZmZjsKLQkgICAgICBpZiAob2ZmICYgMHg4MDApCi0JCW9mZiAtPSAweDEwMDA7Ci0JICAgICAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBzdG9wID0gc3RhcnQgKyA0ICsgb2ZmICogMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDUkVMSU1NOEJZNDoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IChzdGFydCAmfiAoYmZkX3ZtYSkgMykgKyA0ICsgb2ZmICogNDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1NXSVRDSDg6Ci0JY2FzZSBSX1NIX1NXSVRDSDE2OgotCWNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgIC8qIFRoZXNlIHJlbG9jcyB0eXBlcyByZXByZXNlbnQKLQkgICAgICAgLndvcmQgTDItTDEKLQkgICAgIFRoZSByX29mZnNldCBmaWVsZCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYwotCSAgICAgYWRkcmVzcyBhbmQgTDEuICBUaGF0IGlzIHRoZSBzdGFydCBvZiB0aGUgcmVsb2MsIGFuZAotCSAgICAgYWRkaW5nIGluIHRoZSBjb250ZW50cyBnaXZlcyB1cyB0aGUgdG9wLiAgV2UgbXVzdCBhZGp1c3QKLQkgICAgIGJvdGggdGhlIHJfb2Zmc2V0IGZpZWxkIGFuZCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0KLQkgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCAtIChsb25nKSBpcmVsLT5yX29mZnNldCk7Ci0KLQkgIGlmIChzdGFydCA+IGFkZHIKLQkgICAgICAmJiBzdGFydCA8IHRvYWRkcgotCSAgICAgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCSAgICBpcmVsLT5yX29mZnNldCArPSBjb3VudDsKLQkgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JCSAgICYmIHN0b3AgPCB0b2FkZHIKLQkJICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7Ci0KLQkgIHN0YXJ0ID0gc3RvcDsKLQotCSAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX1NXSVRDSDE2KQotCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIGVsc2UgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX1NXSVRDSDgpCi0JICAgIHZvZmYgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIGVsc2UKLQkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgdm9mZik7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1VTRVM6Ci0JICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQKLQkJCSAgICArIChsb25nKSBpcmVsLT5yX29mZnNldAotCQkJICAgICsgNCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzdGFydCA+IGFkZHIKLQkgICYmIHN0YXJ0IDwgdG9hZGRyCi0JICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSBjb3VudDsKLSAgICAgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JICAgICAgICYmIHN0b3AgPCB0b2FkZHIKLQkgICAgICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSAtIGNvdW50OwotICAgICAgZWxzZQotCWFkanVzdCA9IDA7Ci0KLSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQl7Ci0JICBvaW5zbiA9IGluc247Ci0JICBvdmVyZmxvdyA9IGZhbHNlOwotCSAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENESVNQOEJZMjoKLQkgICAgY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A6Ci0JICAgICAgaW5zbiArPSBhZGp1c3QgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgICAgIEJGRF9BU1NFUlQgKGFkanVzdCA9PSBjb3VudCB8fCBjb3VudCA+PSA0KTsKLQkgICAgICBpZiAoY291bnQgPj0gNCkKLQkJaW5zbiArPSBhZGp1c3QgLyA0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgoaXJlbC0+cl92YWRkciAmIDMpID09IDApCi0JCSAgICArK2luc247Ci0JCX0KLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDg6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgaWYgKHZvZmYgPCAwIHx8IHZvZmYgPj0gMHhmZikKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gxNjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAodm9mZiA8IC0gMHg4MDAwIHx8IHZvZmYgPj0gMHg4MDAwKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMTYgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIMzI6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfVVNFUzoKLQkgICAgICBpcmVsLT5yX29mZnNldCArPSBhZGp1c3Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG92ZXJmbG93KQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpcmVsLT5yX3ZhZGRyID0gbnJhZGRyICsgc2VjLT52bWE7Ci0gICAgfQotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIG90aGVyIHNlY3Rpb25zLiAgSWYgdGhlcmUgY29udGFpbiBhbnkgSU1NMzIKLSAgICAgcmVsb2NzIGFnYWluc3QgaW50ZXJuYWwgc3ltYm9scyB3aGljaCB3ZSBhcmUgbm90IGdvaW5nIHRvIGFkanVzdAotICAgICBiZWxvdywgd2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBhZGRlbmRzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxzY2FuLCAqaXJlbHNjYW5lbmQ7Ci0gICAgICBiZmRfYnl0ZSAqb2NvbnRlbnRzOwotCi0gICAgICBpZiAobyA9PSBzZWMKLQkgIHx8IChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgfHwgby0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSByZWxvY3MuICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcwotICAgICAgICAgZmFsc2UsIHdlIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sIHdoZW4gd2UKLSAgICAgICAgIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCQkgKGFiZmQsIG8sIHRydWUsIChiZmRfYnl0ZSAqKSBOVUxMLCBmYWxzZSwKLQkJCSAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBvY29udGVudHMgPSBOVUxMOwotICAgICAgaXJlbHNjYW5lbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBvLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbHNjYW5lbmQ7IGlyZWxzY2FuKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQkgIGlmIChpcmVsc2Nhbi0+cl90eXBlICE9IFJfU0hfSU1NMzIKLQkgICAgICAmJiBpcmVsc2Nhbi0+cl90eXBlICE9IFJfU0hfSU1BR0VCQVNFCi0JICAgICAgJiYgaXJlbHNjYW4tPnJfdHlwZSAhPSBSX1NIX0lNTTMyQ0UpCi0jZWxzZQotCSAgaWYgKGlyZWxzY2FuLT5yX3R5cGUgIT0gUl9TSF9JTU0zMikKLSNlbmRpZgotCSAgICBjb250aW51ZTsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkJKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJCSArIChpcmVsc2Nhbi0+cl9zeW1uZHgKLQkJCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkJJnN5bSk7Ci0JICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JICAgICAgJiYgc3ltLm5fc2NudW0gPT0gc2VjLT50YXJnZXRfaW5kZXgKLQkgICAgICAmJiAoKGJmZF92bWEpIHN5bS5uX3ZhbHVlIDw9IGFkZHIKLQkJICB8fCAoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPj0gdG9hZGRyKSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+Y29udGVudHMgIT0gTlVMTCkKLQkJICAgIG9jb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+Y29udGVudHM7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdlIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0JCSAgICAgIG9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5fcmF3X3NpemUpOwotCQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbywgb2NvbnRlbnRzLAotCQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5jb250ZW50cyA9IG9jb250ZW50czsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfdmFkZHIgLSBvLT52bWEpOwotCSAgICAgIHZhbCArPSBzeW0ubl92YWx1ZTsKLQkgICAgICBpZiAodmFsID4gYWRkciAmJiB2YWwgPCB0b2FkZHIpCi0JCWJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LAotCQkJICAgIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX3ZhZGRyIC0gby0+dm1hKTsKLQotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+a2VlcF9jb250ZW50cyA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFkanVzdGluZyB0aGUgaW50ZXJuYWwgc3ltYm9scyB3aWxsIG5vdCB3b3JrIGlmIHNvbWV0aGluZyBoYXMKLSAgICAgYWxyZWFkeSByZXRyaWV2ZWQgdGhlIGdlbmVyaWMgc3ltYm9scy4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvCi0gICAgIG1ha2UgdGhpcyB3b3JrIGJ5IGFkanVzdGluZyB0aGUgZ2VuZXJpYyBzeW1ib2xzIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgIEhvd2V2ZXIsIHRoaXMgY2FzZSBzaG91bGQgbm90IGFyaXNlIGluIG5vcm1hbCB1c2FnZS4gICovCi0gIGlmIChvYmpfc3ltYm9scyAoYWJmZCkgIT0gTlVMTAotICAgICAgfHwgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSAhPSBOVUxMKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoIiVzOiBmYXRhbDogZ2VuZXJpYyBzeW1ib2xzIHJldHJpZXZlZCBiZWZvcmUgcmVsYXhpbmciLAotCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBBZGp1c3QgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgc3ltX2hhc2ggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgZXN5bWVuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLm5fc2NudW0gPT0gc2VjLT50YXJnZXRfaW5kZXgKLQkgICYmIChiZmRfdm1hKSBpc3ltLm5fdmFsdWUgPiBhZGRyCi0JICAmJiAoYmZkX3ZtYSkgaXN5bS5uX3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0ubl92YWx1ZSAtPSBjb3VudDsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZXN5bSk7Ci0KLQkgIGlmICgqc3ltX2hhc2ggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLQkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+PSBhZGRyCi0JCQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKTsKLQkgICAgICAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoaXN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgICAgc3ltX2hhc2ggKz0gaXN5bS5uX251bWF1eCArIDE7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiB3ZSBjYW4gbW92ZSB0aGUgQUxJR04gcmVsb2MgZm9yd2FyZC4gIFdlIGhhdmUgYWRqdXN0ZWQKLSAgICAgcl92YWRkciBmb3IgaXQgYWxyZWFkeS4gICovCi0gIGlmIChpcmVsYWxpZ24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFsaWdudG8sIGFsaWduYWRkcjsKLQotICAgICAgYWxpZ250byA9IEJGRF9BTElHTiAodG9hZGRyLCAxIDw8IGlyZWxhbGlnbi0+cl9vZmZzZXQpOwotICAgICAgYWxpZ25hZGRyID0gQkZEX0FMSUdOIChpcmVsYWxpZ24tPnJfdmFkZHIgLSBzZWMtPnZtYSwKLQkJCSAgICAgMSA8PCBpcmVsYWxpZ24tPnJfb2Zmc2V0KTsKLSAgICAgIGlmIChhbGlnbnRvICE9IGFsaWduYWRkcikKLQl7Ci0JICAvKiBUYWlsIHJlY3Vyc2lvbi4gICovCi0JICByZXR1cm4gc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFsaWduYWRkciwKLQkJCQkJYWxpZ250byAtIGFsaWduYWRkcik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgeWV0IGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgU0ggb3Bjb2RlIHRhYmxlLCB1c2VkIHRvIHJhcGlkbHkKLSAgIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24uICAqLwotCi0vKiBUaGUgb3Bjb2RlIG1hcCBpcyByZXByZXNlbnRlZCBieSBhbiBhcnJheSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgVGhlCi0gICBhcnJheSBpcyBpbmRleGVkIGJ5IHRoZSBoaWdoIG9yZGVyIGZvdXIgYml0cyBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdHJ1Y3Qgc2hfbWFqb3Jfb3Bjb2RlCi17Ci0gIC8qIEEgcG9pbnRlciB0byB0aGUgaW5zdHJ1Y3Rpb24gbGlzdC4gIFRoaXMgaXMgYW4gYXJyYXkgd2hpY2gKLSAgICAgY29udGFpbnMgYWxsIHRoZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGlzIG1ham9yIG9wY29kZS4gICovCi0gIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgKm1pbm9yX29wY29kZXM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gbWlub3Jfb3Bjb2Rlcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNvdW50OwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgc2V0IG9mIFNIIG9wY29kZXMuICBUaGUKLSAgIGluc3RydWN0aW9uIGNvZGUgaXMgYW5kZWQgd2l0aCB0aGUgbWFzayB2YWx1ZSwgYW5kIHRoZSByZXN1bHRpbmcKLSAgIHZhbHVlIGlzIHVzZWQgdG8gc2VhcmNoIHRoZSBvcmRlciBvcGNvZGUgbGlzdC4gICovCi0KLXN0cnVjdCBzaF9taW5vcl9vcGNvZGUKLXsKLSAgLyogVGhlIHNvcnRlZCBvcGNvZGUgbGlzdC4gICovCi0gIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wY29kZXM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gb3Bjb2Rlcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNvdW50OwotICAvKiBUaGUgbWFzayB2YWx1ZSB0byB1c2Ugd2hlbiBzZWFyY2hpbmcgdGhlIG9wY29kZSBsaXN0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWFzazsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhbiBTSCBpbnN0cnVjdGlvbi4gIEFuIGFycmF5Ci0gICBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHNvcnRlZCBpbiBvcmRlciBieSBvcGNvZGUuICAqLwotCi1zdHJ1Y3Qgc2hfb3Bjb2RlCi17Ci0gIC8qIFRoZSBjb2RlIGZvciB0aGlzIGluc3RydWN0aW9uLCBhZnRlciBpdCBoYXMgYmVlbiBhbmRlZCB3aXRoIHRoZQotICAgICBtYXNrIHZhbHVlIGluIHRoZSBzaF9tYWpvcl9vcGNvZGUgc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwotICAvKiBGbGFncyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci19OwotCi0vKiBGbGFnIHdoaWNoIGFwcGVhciBpbiB0aGUgc2hfb3Bjb2RlIHN0cnVjdHVyZS4gICovCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gbG9hZHMgYSB2YWx1ZSBmcm9tIG1lbW9yeS4gICovCi0jZGVmaW5lIExPQUQgKDB4MSkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzdG9yZXMgYSB2YWx1ZSB0byBtZW1vcnkuICAqLwotI2RlZmluZSBTVE9SRSAoMHgyKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIGlzIGEgYnJhbmNoLiAgKi8KLSNkZWZpbmUgQlJBTkNIICgweDQpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGEgZGVsYXkgc2xvdC4gICovCi0jZGVmaW5lIERFTEFZICgweDgpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVVNFUzEgKDB4MTApCi0jZGVmaW5lIFVTRVMxX1JFRyh4KSAoKHggJiAweDBmMDApID4+IDgpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDAwZjAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVVNFUzIgKDB4MjApCi0jZGVmaW5lIFVTRVMyX1JFRyh4KSAoKHggJiAweDAwZjApID4+IDQpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgdmFsdWUgaW4gcmVnaXN0ZXIgMC4gICovCi0jZGVmaW5lIFVTRVNSMCAoMHg0MCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTRVRTMSAoMHg4MCkKLSNkZWZpbmUgU0VUUzFfUkVHKHgpICgoeCAmIDB4MGYwMCkgPj4gOCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MDBmMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTRVRTMiAoMHgxMDApCi0jZGVmaW5lIFNFVFMyX1JFRyh4KSAoKHggJiAweDAwZjApID4+IDQpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyByZWdpc3RlciAwLiAgKi8KLSNkZWZpbmUgU0VUU1IwICgweDIwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIGEgc3BlY2lhbCByZWdpc3Rlci4gICovCi0jZGVmaW5lIFNFVFNTUCAoMHg0MDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyBhIHNwZWNpYWwgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBVU0VTU1AgKDB4ODAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVVNFU0YxICgweDEwMDApCi0jZGVmaW5lIFVTRVNGMV9SRUcoeCkgKCh4ICYgMHgwZjAwKSA+PiA4KQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDAwZjAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVVNFU0YyICgweDIwMDApCi0jZGVmaW5lIFVTRVNGMl9SRUcoeCkgKCh4ICYgMHgwMGYwKSA+PiA0KQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgMC4gICovCi0jZGVmaW5lIFVTRVNGMCAoMHg0MDAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VUU0YxICgweDgwMDApCi0jZGVmaW5lIFNFVFNGMV9SRUcoeCkgKCh4ICYgMHgwZjAwKSA+PiA4KQotCi0jZGVmaW5lIFVTRVNBUyAoMHgxMDAwMCkKLSNkZWZpbmUgVVNFU0FTX1JFRyh4KSAoKCgoKHgpID4+IDgpIC0gMikgJiAzKSArIDIpCi0jZGVmaW5lIFVTRVNSOCAoMHgyMDAwMCkKLSNkZWZpbmUgU0VUU0FTICgweDQwMDAwKQotI2RlZmluZSBTRVRTQVNfUkVHKHgpIFVTRVNBU19SRUcgKHgpCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMgYm9vbGVhbiBzaF9pbnNuX3VzZXNfcmVnCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2luc25fc2V0c19yZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbl91c2VzX29yX3NldHNfcmVnCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2luc25fdXNlc19mcmVnCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2luc25fc2V0c19mcmVnCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2luc25fdXNlc19vcl9zZXRzX2ZyZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbnNfY29uZmxpY3QKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCwKLQkgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2xvYWRfdXNlCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQsCi0JICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqKSk7Ci0jZW5kaWYKLS8qIFRoZSBvcGNvZGUgbWFwcy4gICovCi0KLSNkZWZpbmUgTUFQKGEpIGEsIHNpemVvZiBhIC8gc2l6ZW9mIGFbMF0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMDBbXSA9Ci17Ci0gIHsgMHgwMDA4LCBTRVRTU1AgfSwJCQkvKiBjbHJ0ICovCi0gIHsgMHgwMDA5LCAwIH0sCQkJLyogbm9wICovCi0gIHsgMHgwMDBiLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVNTUCB9LAkvKiBydHMgKi8KLSAgeyAweDAwMTgsIFNFVFNTUCB9LAkJCS8qIHNldHQgKi8KLSAgeyAweDAwMTksIFNFVFNTUCB9LAkJCS8qIGRpdjB1ICovCi0gIHsgMHgwMDFiLCAwIH0sCQkJLyogc2xlZXAgKi8KLSAgeyAweDAwMjgsIFNFVFNTUCB9LAkJCS8qIGNscm1hYyAqLwotICB7IDB4MDAyYiwgQlJBTkNIIHwgREVMQVkgfCBTRVRTU1AgfSwJLyogcnRlICovCi0gIHsgMHgwMDM4LCBVU0VTU1AgfCBTRVRTU1AgfSwJCS8qIGxkdGxiICovCi0gIHsgMHgwMDQ4LCBTRVRTU1AgfSwJCQkvKiBjbHJzICovCi0gIHsgMHgwMDU4LCBTRVRTU1AgfQkJCS8qIHNldHMgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTAxW10gPQotewotICB7IDB4MDAwMywgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB8IFNFVFNTUCB9LAkvKiBic3JmIHJuICovCi0gIHsgMHgwMDBhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBtYWNoLHJuICovCi0gIHsgMHgwMDFhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBtYWNsLHJuICovCi0gIHsgMHgwMDIzLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIH0sCQkvKiBicmFmIHJuICovCi0gIHsgMHgwMDI5LCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIG1vdnQgcm4gKi8KLSAgeyAweDAwMmEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIHByLHJuICovCi0gIHsgMHgwMDVhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBmcHVsLHJuICovCi0gIHsgMHgwMDZhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBmcHNjcixybiAvIHN0cyBkc3Iscm4gKi8KLSAgeyAweDAwODMsIExPQUQgfCBVU0VTMSB9LAkJCS8qIHByZWYgQHJuICovCi0gIHsgMHgwMDdhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBhMCxybiAqLwotICB7IDB4MDA4YSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgeDAscm4gKi8KLSAgeyAweDAwOWEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIHgxLHJuICovCi0gIHsgMHgwMGFhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyB5MCxybiAqLwotICB7IDB4MDBiYSwgU0VUUzEgfCBVU0VTU1AgfQkJCS8qIHN0cyB5MSxybiAqLwotfTsKLQotLyogVGhlc2Ugc2l4dGVlbiBpbnN0cnVjdGlvbnMgY2FuIGJlIGhhbmRsZWQgd2l0aCBvbmUgdGFibGUgZW50cnkgYmVsb3cuICAqLwotI2lmIDAKLSAgeyAweDAwMDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHNyLHJuICovCi0gIHsgMHgwMDEyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBnYnIscm4gKi8KLSAgeyAweDAwMjIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHZicixybiAqLwotICB7IDB4MDAzMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgc3NyLHJuICovCi0gIHsgMHgwMDQyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBzcGMscm4gKi8KLSAgeyAweDAwNTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIG1vZCxybiAqLwotICB7IDB4MDA2MiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcnMscm4gKi8KLSAgeyAweDAwNzIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHJlLHJuICovCi0gIHsgMHgwMDgyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByMF9iYW5rLHJuICovCi0gIHsgMHgwMDkyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByMV9iYW5rLHJuICovCi0gIHsgMHgwMGEyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByMl9iYW5rLHJuICovCi0gIHsgMHgwMGIyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByM19iYW5rLHJuICovCi0gIHsgMHgwMGMyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByNF9iYW5rLHJuICovCi0gIHsgMHgwMGQyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByNV9iYW5rLHJuICovCi0gIHsgMHgwMGUyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByNl9iYW5rLHJuICovCi0gIHsgMHgwMGYyLCBTRVRTMSB8IFVTRVNTUCB9CQkJLyogc3RjIHI3X2Jhbmsscm4gKi8KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUwMltdID0KLXsKLSAgeyAweDAwMDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIDxzcGVjaWFsX3JlZz4scm4gKi8KLSAgeyAweDAwMDQsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YuYiBybSxAKHIwLHJuKSAqLwotICB7IDB4MDAwNSwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi53IHJtLEAocjAscm4pICovCi0gIHsgMHgwMDA2LCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92Lmwgcm0sQChyMCxybikgKi8KLSAgeyAweDAwMDcsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG11bC5sIHJtLHJuICovCi0gIHsgMHgwMDBjLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YuYiBAKHIwLHJtKSxybiAqLwotICB7IDB4MDAwZCwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LncgQChyMCxybSkscm4gKi8KLSAgeyAweDAwMGUsIExPQUQgfCBTRVRTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5sIEAocjAscm0pLHJuICovCi0gIHsgMHgwMDBmLCBMT0FEfFNFVFMxfFNFVFMyfFNFVFNTUHxVU0VTMXxVU0VTMnxVU0VTU1AgfSwgLyogbWFjLmwgQHJtKyxAcm4rICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUwW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMDApLCAweGZmZmYgfSwKLSAgeyBNQVAgKHNoX29wY29kZTAxKSwgMHhmMGZmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUwMiksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUxMFtdID0KLXsKLSAgeyAweDEwMDAsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9CS8qIG1vdi5sIHJtLEAoZGlzcCxybikgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTFbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUxMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUyMFtdID0KLXsKLSAgeyAweDIwMDAsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbW92LmIgcm0sQHJuICovCi0gIHsgMHgyMDAxLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG1vdi53IHJtLEBybiAqLwotICB7IDB4MjAwMiwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtb3YubCBybSxAcm4gKi8KLSAgeyAweDIwMDQsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIG1vdi5iIHJtLEAtcm4gKi8KLSAgeyAweDIwMDUsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIG1vdi53IHJtLEAtcm4gKi8KLSAgeyAweDIwMDYsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIG1vdi5sIHJtLEAtcm4gKi8KLSAgeyAweDIwMDcsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTU1AgfSwJLyogZGl2MHMgKi8KLSAgeyAweDIwMDgsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHRzdCBybSxybiAqLwotICB7IDB4MjAwOSwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBhbmQgcm0scm4gKi8KLSAgeyAweDIwMGEsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogeG9yIHJtLHJuICovCi0gIHsgMHgyMDBiLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG9yIHJtLHJuICovCi0gIHsgMHgyMDBjLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvc3RyIHJtLHJuICovCi0gIHsgMHgyMDBkLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHh0cmN0IHJtLHJuICovCi0gIHsgMHgyMDBlLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtdWx1Lncgcm0scm4gKi8KLSAgeyAweDIwMGYsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfQkJLyogbXVscy53IHJtLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUyW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMjApLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMzBbXSA9Ci17Ci0gIHsgMHgzMDAwLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvZXEgcm0scm4gKi8KLSAgeyAweDMwMDIsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9ocyBybSxybiAqLwotICB7IDB4MzAwMywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2dlIHJtLHJuICovCi0gIHsgMHgzMDA0LCBTRVRTU1AgfCBVU0VTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIGRpdjEgcm0scm4gKi8KLSAgeyAweDMwMDUsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGRtdWx1Lmwgcm0scm4gKi8KLSAgeyAweDMwMDYsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9oaSBybSxybiAqLwotICB7IDB4MzAwNywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2d0IHJtLHJuICovCi0gIHsgMHgzMDA4LCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHN1YiBybSxybiAqLwotICB7IDB4MzAwYSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1NQIH0sIC8qIHN1YmMgcm0scm4gKi8KLSAgeyAweDMwMGIsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBzdWJ2IHJtLHJuICovCi0gIHsgMHgzMDBjLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGFkZCBybSxybiAqLwotICB7IDB4MzAwZCwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogZG11bHMubCBybSxybiAqLwotICB7IDB4MzAwZSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1NQIH0sIC8qIGFkZGMgcm0scm4gKi8KLSAgeyAweDMwMGYsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9CS8qIGFkZHYgcm0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTNbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUzMCksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU0MFtdID0KLXsKLSAgeyAweDQwMDAsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNobGwgcm4gKi8KLSAgeyAweDQwMDEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNobHIgcm4gKi8KLSAgeyAweDQwMDIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBtYWNoLEAtcm4gKi8KLSAgeyAweDQwMDQsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHJvdGwgcm4gKi8KLSAgeyAweDQwMDUsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHJvdHIgcm4gKi8KLSAgeyAweDQwMDYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssbWFjaCAqLwotICB7IDB4NDAwOCwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobGwyIHJuICovCi0gIHsgMHg0MDA5LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hscjIgcm4gKi8KLSAgeyAweDQwMGEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzIHJtLG1hY2ggKi8KLSAgeyAweDQwMGIsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfSwJCS8qIGpzciBAcm4gKi8KLSAgeyAweDQwMTAsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIGR0IHJuICovCi0gIHsgMHg0MDExLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGNtcC9weiBybiAqLwotICB7IDB4NDAxMiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIG1hY2wsQC1ybiAqLwotICB7IDB4NDAxNCwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBzZXRyYyBybSAqLwotICB7IDB4NDAxNSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBjbXAvcGwgcm4gKi8KLSAgeyAweDQwMTYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssbWFjbCAqLwotICB7IDB4NDAxOCwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobGw4IHJuICovCi0gIHsgMHg0MDE5LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hscjggcm4gKi8KLSAgeyAweDQwMWEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzIHJtLG1hY2wgKi8KLSAgeyAweDQwMWIsIExPQUQgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogdGFzLmIgQHJuICovCi0gIHsgMHg0MDIwLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGFsIHJuICovCi0gIHsgMHg0MDIxLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGFyIHJuICovCi0gIHsgMHg0MDIyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgcHIsQC1ybiAqLwotICB7IDB4NDAyNCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiByb3RjbCBybiAqLwotICB7IDB4NDAyNSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiByb3RjciBybiAqLwotICB7IDB4NDAyNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxwciAqLwotICB7IDB4NDAyOCwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobGwxNiBybiAqLwotICB7IDB4NDAyOSwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobHIxNiBybiAqLwotICB7IDB4NDAyYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0scHIgKi8KLSAgeyAweDQwMmIsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfSwJCS8qIGptcCBAcm4gKi8KLSAgeyAweDQwNTIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBmcHVsLEAtcm4gKi8KLSAgeyAweDQwNTYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssZnB1bCAqLwotICB7IDB4NDA1YSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMubCBybSxmcHVsICovCi0gIHsgMHg0MDYyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgZnBzY3IgLyBkc3IsQC1ybiAqLwotICB7IDB4NDA2NiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxmcHNjciAvIGRzciAqLwotICB7IDB4NDA2YSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0sZnBzY3IgLyBsZHMgcm0sZHNyICovCi0gIHsgMHg0MDcyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgYTAsQC1ybiAqLwotICB7IDB4NDA3NiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxhMCAqLwotICB7IDB4NDA3YSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMubCBybSxhMCAqLwotICB7IDB4NDA4MiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIHgwLEAtcm4gKi8KLSAgeyAweDQwODYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSsseDAgKi8KLSAgeyAweDQwOGEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzLmwgcm0seDAgKi8KLSAgeyAweDQwOTIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCB4MSxALXJuICovCi0gIHsgMHg0MDk2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLHgxICovCi0gIHsgMHg0MDlhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcy5sIHJtLHgxICovCi0gIHsgMHg0MGEyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgeTAsQC1ybiAqLwotICB7IDB4NDBhNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyx5MCAqLwotICB7IDB4NDBhYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMubCBybSx5MCAqLwotICB7IDB4NDBiMiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIHkxLEAtcm4gKi8KLSAgeyAweDQwYjYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSsseTEgKi8KLSAgeyAweDQwYmEsIFNFVFNTUCB8IFVTRVMxIH0JCQkvKiBsZHMubCBybSx5MSAqLwotI2lmIDAgLyogVGhlc2UgZ3JvdXBzIHNpeHRlZW4gaW5zbnMgY2FuIGJlCi0gICAgICAgICBoYW5kbGVkIHdpdGggb25lIHRhYmxlIGVudHJ5IGVhY2ggYmVsb3cuICAqLwotICB7IDB4NDAwMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHNyLEAtcm4gKi8KLSAgeyAweDQwMTMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBnYnIsQC1ybiAqLwotICB7IDB4NDAyMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHZicixALXJuICovCi0gIHsgMHg0MDMzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgc3NyLEAtcm4gKi8KLSAgeyAweDQwNDMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBzcGMsQC1ybiAqLwotICB7IDB4NDA1MywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIG1vZCxALXJuICovCi0gIHsgMHg0MDYzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgcnMsQC1ybiAqLwotICB7IDB4NDA3MywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHJlLEAtcm4gKi8KLSAgeyAweDQwODMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCByMF9iYW5rLEAtcm4gKi8KLSAgLi4KLSAgeyAweDQwZjMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCByN19iYW5rLEAtcm4gKi8KLQotICB7IDB4NDAwNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxzciAqLwotICB7IDB4NDAxNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxnYnIgKi8KLSAgeyAweDQwMjcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssdmJyICovCi0gIHsgMHg0MDM3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHNzciAqLwotICB7IDB4NDA0NywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxzcGMgKi8KLSAgeyAweDQwNTcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssbW9kICovCi0gIHsgMHg0MDY3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHJzICovCi0gIHsgMHg0MDc3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHJlICovCi0gIHsgMHg0MDg3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHIwX2JhbmsgKi8KLSAgLi4KLSAgeyAweDQwZjcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSsscjdfYmFuayAqLwotCi0gIHsgMHg0MDBlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxzciAqLwotICB7IDB4NDAxZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sZ2JyICovCi0gIHsgMHg0MDJlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSx2YnIgKi8KLSAgeyAweDQwM2UsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHNzciAqLwotICB7IDB4NDA0ZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sc3BjICovCi0gIHsgMHg0MDVlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxtb2QgKi8KLSAgeyAweDQwNmUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHJzICovCi0gIHsgMHg0MDdlLCBTRVRTU1AgfCBVU0VTMSB9CQkJLyogbGRjIHJtLHJlICovCi0gIHsgMHg0MDhlLCBTRVRTU1AgfCBVU0VTMSB9CQkJLyogbGRjIHJtLHIwX2JhbmsgKi8KLSAgLi4KLSAgeyAweDQwZmUsIFNFVFNTUCB8IFVTRVMxIH0JCQkvKiBsZGMgcm0scjdfYmFuayAqLwotI2VuZGlmCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU0MVtdID0KLXsKLSAgeyAweDQwMDMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCA8c3BlY2lhbF9yZWc+LEAtcm4gKi8KLSAgeyAweDQwMDcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssPHNwZWNpYWxfcmVnPiAqLwotICB7IDB4NDAwYywgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBzaGFkIHJtLHJuICovCi0gIHsgMHg0MDBkLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHNobGQgcm0scm4gKi8KLSAgeyAweDQwMGUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLDxzcGVjaWFsX3JlZz4gKi8KLSAgeyAweDQwMGYsIExPQUR8U0VUUzF8U0VUUzJ8U0VUU1NQfFVTRVMxfFVTRVMyfFVTRVNTUCB9LCAvKiBtYWMudyBAcm0rLEBybisgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTRbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU0MCksIDB4ZjBmZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNDEpLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNTBbXSA9Ci17Ci0gIHsgMHg1MDAwLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB9CS8qIG1vdi5sIEAoZGlzcCxybSkscm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTVbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU1MCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU2MFtdID0KLXsKLSAgeyAweDYwMDAsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0sCQkvKiBtb3YuYiBAcm0scm4gKi8KLSAgeyAweDYwMDEsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0sCQkvKiBtb3YudyBAcm0scm4gKi8KLSAgeyAweDYwMDIsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0sCQkvKiBtb3YubCBAcm0scm4gKi8KLSAgeyAweDYwMDMsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBtb3Ygcm0scm4gKi8KLSAgeyAweDYwMDQsIExPQUQgfCBTRVRTMSB8IFNFVFMyIHwgVVNFUzIgfSwJLyogbW92LmIgQHJtKyxybiAqLwotICB7IDB4NjAwNSwgTE9BRCB8IFNFVFMxIHwgU0VUUzIgfCBVU0VTMiB9LAkvKiBtb3YudyBAcm0rLHJuICovCi0gIHsgMHg2MDA2LCBMT0FEIHwgU0VUUzEgfCBTRVRTMiB8IFVTRVMyIH0sCS8qIG1vdi5sIEBybSsscm4gKi8KLSAgeyAweDYwMDcsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBub3Qgcm0scm4gKi8KLSAgeyAweDYwMDgsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBzd2FwLmIgcm0scm4gKi8KLSAgeyAweDYwMDksIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBzd2FwLncgcm0scm4gKi8KLSAgeyAweDYwMGEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzIgfCBVU0VTU1AgfSwJLyogbmVnYyBybSxybiAqLwotICB7IDB4NjAwYiwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIG5lZyBybSxybiAqLwotICB7IDB4NjAwYywgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIGV4dHUuYiBybSxybiAqLwotICB7IDB4NjAwZCwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIGV4dHUudyBybSxybiAqLwotICB7IDB4NjAwZSwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIGV4dHMuYiBybSxybiAqLwotICB7IDB4NjAwZiwgU0VUUzEgfCBVU0VTMiB9CQkJLyogZXh0cy53IHJtLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU2W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlNjApLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNzBbXSA9Ci17Ci0gIHsgMHg3MDAwLCBTRVRTMSB8IFVTRVMxIH0JCS8qIGFkZCAjaW1tLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU3W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlNzApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlODBbXSA9Ci17Ci0gIHsgMHg4MDAwLCBTVE9SRSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5iIHIwLEAoZGlzcCxybikgKi8KLSAgeyAweDgxMDAsIFNUT1JFIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LncgcjAsQChkaXNwLHJuKSAqLwotICB7IDB4ODIwMCwgU0VUU1NQIH0sCQkJLyogc2V0cmMgI2ltbSAqLwotICB7IDB4ODQwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVMyIH0sCS8qIG1vdi5iIEAoZGlzcCxybSkscjAgKi8KLSAgeyAweDg1MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTMiB9LAkvKiBtb3YudyBAKGRpc3Ascm4pLHIwICovCi0gIHsgMHg4ODAwLCBTRVRTU1AgfCBVU0VTUjAgfSwJCS8qIGNtcC9lcSAjaW1tLHIwICovCi0gIHsgMHg4OTAwLCBCUkFOQ0ggfCBVU0VTU1AgfSwJCS8qIGJ0IGxhYmVsICovCi0gIHsgMHg4YjAwLCBCUkFOQ0ggfCBVU0VTU1AgfSwJCS8qIGJmIGxhYmVsICovCi0gIHsgMHg4YzAwLCBTRVRTU1AgfSwJCQkvKiBsZHJzIEAoZGlzcCxwYykgKi8KLSAgeyAweDhkMDAsIEJSQU5DSCB8IERFTEFZIHwgVVNFU1NQIH0sCS8qIGJ0L3MgbGFiZWwgKi8KLSAgeyAweDhlMDAsIFNFVFNTUCB9LAkJCS8qIGxkcmUgQChkaXNwLHBjKSAqLwotICB7IDB4OGYwMCwgQlJBTkNIIHwgREVMQVkgfCBVU0VTU1AgfQkvKiBiZi9zIGxhYmVsICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU4W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlODApLCAweGZmMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlOTBbXSA9Ci17Ci0gIHsgMHg5MDAwLCBMT0FEIHwgU0VUUzEgfQkvKiBtb3YudyBAKGRpc3AscGMpLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU5W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlOTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlYTBbXSA9Ci17Ci0gIHsgMHhhMDAwLCBCUkFOQ0ggfCBERUxBWSB9CS8qIGJyYSBsYWJlbCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlYVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWEwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWIwW10gPQotewotICB7IDB4YjAwMCwgQlJBTkNIIHwgREVMQVkgfQkvKiBic3IgbGFiZWwgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWJbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGViMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVjMFtdID0KLXsKLSAgeyAweGMwMDAsIFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YuYiByMCxAKGRpc3AsZ2JyKSAqLwotICB7IDB4YzEwMCwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi53IHIwLEAoZGlzcCxnYnIpICovCi0gIHsgMHhjMjAwLCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmwgcjAsQChkaXNwLGdicikgKi8KLSAgeyAweGMzMDAsIEJSQU5DSCB8IFVTRVNTUCB9LAkJCS8qIHRyYXBhICNpbW0gKi8KLSAgeyAweGM0MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5iIEAoZGlzcCxnYnIpLHIwICovCi0gIHsgMHhjNTAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YudyBAKGRpc3AsZ2JyKSxyMCAqLwotICB7IDB4YzYwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmwgQChkaXNwLGdicikscjAgKi8KLSAgeyAweGM3MDAsIFNFVFNSMCB9LAkJCQkvKiBtb3ZhIEAoZGlzcCxwYykscjAgKi8KLSAgeyAweGM4MDAsIFNFVFNTUCB8IFVTRVNSMCB9LAkJCS8qIHRzdCAjaW1tLHIwICovCi0gIHsgMHhjOTAwLCBTRVRTUjAgfCBVU0VTUjAgfSwJCQkvKiBhbmQgI2ltbSxyMCAqLwotICB7IDB4Y2EwMCwgU0VUU1IwIHwgVVNFU1IwIH0sCQkJLyogeG9yICNpbW0scjAgKi8KLSAgeyAweGNiMDAsIFNFVFNSMCB8IFVTRVNSMCB9LAkJCS8qIG9yICNpbW0scjAgKi8KLSAgeyAweGNjMDAsIExPQUQgfCBTRVRTU1AgfCBVU0VTUjAgfCBVU0VTU1AgfSwJLyogdHN0LmIgI2ltbSxAKHIwLGdicikgKi8KLSAgeyAweGNkMDAsIExPQUQgfCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkvKiBhbmQuYiAjaW1tLEAocjAsZ2JyKSAqLwotICB7IDB4Y2UwMCwgTE9BRCB8IFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCS8qIHhvci5iICNpbW0sQChyMCxnYnIpICovCi0gIHsgMHhjZjAwLCBMT0FEIHwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfQkvKiBvci5iICNpbW0sQChyMCxnYnIpICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVjW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlYzApLCAweGZmMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZDBbXSA9Ci17Ci0gIHsgMHhkMDAwLCBMT0FEIHwgU0VUUzEgfQkJLyogbW92LmwgQChkaXNwLHBjKSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlZFtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWQwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWUwW10gPQotewotICB7IDB4ZTAwMCwgU0VUUzEgfQkJLyogbW92ICNpbW0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWVbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGVlMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVmMFtdID0KLXsKLSAgeyAweGYwMDAsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmFkZCBmbSxmbiAqLwotICB7IDB4ZjAwMSwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmc3ViIGZtLGZuICovCi0gIHsgMHhmMDAyLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZtdWwgZm0sZm4gKi8KLSAgeyAweGYwMDMsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmRpdiBmbSxmbiAqLwotICB7IDB4ZjAwNCwgU0VUU1NQIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmY21wL2VxIGZtLGZuICovCi0gIHsgMHhmMDA1LCBTRVRTU1AgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZjbXAvZ3QgZm0sZm4gKi8KLSAgeyAweGYwMDYsIExPQUQgfCBTRVRTRjEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBmbW92LnMgQChyMCxybSksZm4gKi8KLSAgeyAweGYwMDcsIFNUT1JFIHwgVVNFUzEgfCBVU0VTRjIgfCBVU0VTUjAgfSwJLyogZm1vdi5zIGZtLEAocjAscm4pICovCi0gIHsgMHhmMDA4LCBMT0FEIHwgU0VUU0YxIHwgVVNFUzIgfSwJCS8qIGZtb3YucyBAcm0sZm4gKi8KLSAgeyAweGYwMDksIExPQUQgfCBTRVRTMiB8IFNFVFNGMSB8IFVTRVMyIH0sCS8qIGZtb3YucyBAcm0rLGZuICovCi0gIHsgMHhmMDBhLCBTVE9SRSB8IFVTRVMxIHwgVVNFU0YyIH0sCQkvKiBmbW92LnMgZm0sQHJuICovCi0gIHsgMHhmMDBiLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTRjIgfSwJLyogZm1vdi5zIGZtLEAtcm4gKi8KLSAgeyAweGYwMGMsIFNFVFNGMSB8IFVTRVNGMiB9LAkJCS8qIGZtb3YgZm0sZm4gKi8KLSAgeyAweGYwMGUsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB8IFVTRVNGMCB9CS8qIGZtYWMgZjAsZm0sZm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWYxW10gPQotewotICB7IDB4ZjAwZCwgU0VUU0YxIHwgVVNFU1NQIH0sCS8qIGZzdHMgZnB1bCxmbiAqLwotICB7IDB4ZjAxZCwgU0VUU1NQIHwgVVNFU0YxIH0sCS8qIGZsZHMgZm4sZnB1bCAqLwotICB7IDB4ZjAyZCwgU0VUU0YxIHwgVVNFU1NQIH0sCS8qIGZsb2F0IGZwdWwsZm4gKi8KLSAgeyAweGYwM2QsIFNFVFNTUCB8IFVTRVNGMSB9LAkvKiBmdHJjIGZuLGZwdWwgKi8KLSAgeyAweGYwNGQsIFNFVFNGMSB8IFVTRVNGMSB9LAkvKiBmbmVnIGZuICovCi0gIHsgMHhmMDVkLCBTRVRTRjEgfCBVU0VTRjEgfSwJLyogZmFicyBmbiAqLwotICB7IDB4ZjA2ZCwgU0VUU0YxIHwgVVNFU0YxIH0sCS8qIGZzcXJ0IGZuICovCi0gIHsgMHhmMDdkLCBTRVRTU1AgfCBVU0VTRjEgfSwJLyogZnRzdC9uYW4gZm4gKi8KLSAgeyAweGYwOGQsIFNFVFNGMSB9LAkJLyogZmxkaTAgZm4gKi8KLSAgeyAweGYwOWQsIFNFVFNGMSB9CQkvKiBmbGRpMSBmbiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlZltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWYwKSwgMHhmMDBmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVmMSksIDB4ZjBmZiB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHNoX21ham9yX29wY29kZSBzaF9vcGNvZGVzW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTEpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUyKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMykgfSwKLSAgeyBNQVAgKHNoX29wY29kZTQpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU1KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNikgfSwKLSAgeyBNQVAgKHNoX29wY29kZTcpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU4KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlOSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWEpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGViKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlYykgfSwKLSAgeyBNQVAgKHNoX29wY29kZWQpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVlKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlZikgfQotfTsKLQotLyogVGhlIGRvdWJsZSBkYXRhIHRyYW5zZmVyIC8gcGFyYWxsZWwgcHJvY2Vzc2luZyBpbnNucyBhcmUgbm90Ci0gICBkZXNjcmliZWQgaGVyZS4gIFRoaXMgd2lsbCBjYXVzZSBzaF9hbGlnbl9sb2FkX3NwYW4gdG8gbGVhdmUgdGhlbSBhbG9uZS4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX2RzcF9vcGNvZGVmMFtdID0KLXsKLSAgeyAweGY0MDAsIFVTRVNBUyB8IFNFVFNBUyB8IExPQUQgfCBTRVRTU1AgfSwJLyogbW92cy54IEAtYXMsZHMgKi8KLSAgeyAweGY0MDEsIFVTRVNBUyB8IFNFVFNBUyB8IFNUT1JFIHwgVVNFU1NQIH0sCS8qIG1vdnMueCBkcyxALWFzICovCi0gIHsgMHhmNDA0LCBVU0VTQVMgfCBMT0FEIHwgU0VUU1NQIH0sCQkvKiBtb3ZzLnggQGFzLGRzICovCi0gIHsgMHhmNDA1LCBVU0VTQVMgfCBTVE9SRSB8IFVTRVNTUCB9LAkJLyogbW92cy54IGRzLEBhcyAqLwotICB7IDB4ZjQwOCwgVVNFU0FTIHwgU0VUU0FTIHwgTE9BRCB8IFNFVFNTUCB9LAkvKiBtb3ZzLnggQGFzKyxkcyAqLwotICB7IDB4ZjQwOSwgVVNFU0FTIHwgU0VUU0FTIHwgU1RPUkUgfCBVU0VTU1AgfSwJLyogbW92cy54IGRzLEBhcysgKi8KLSAgeyAweGY0MGMsIFVTRVNBUyB8IFNFVFNBUyB8IExPQUQgfCBTRVRTU1AgfCBVU0VTUjggfSwJLyogbW92cy54IEBhcytyOCxkcyAqLwotICB7IDB4ZjQwZCwgVVNFU0FTIHwgU0VUU0FTIHwgU1RPUkUgfCBVU0VTU1AgfCBVU0VTUjggfQkvKiBtb3ZzLnggZHMsQGFzK3I4ICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9kc3Bfb3Bjb2RlZltdID0KLXsKLSAgeyBNQVAgKHNoX2RzcF9vcGNvZGVmMCksIDB4ZmMwZCB9Ci19OwotCi0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotLyogR2l2ZW4gYW4gaW5zdHJ1Y3Rpb24sIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLSAgIHNoX29wY29kZSBzdHJ1Y3R1cmUuICBSZXR1cm4gTlVMTCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90Ci0gICByZWNvZ25pemVkLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKgotc2hfaW5zbl9pbmZvIChpbnNuKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLXsKLSAgY29uc3Qgc3RydWN0IHNoX21ham9yX29wY29kZSAqbWFqOwotICBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlICptaW4sICptaW5lbmQ7Ci0KLSAgbWFqID0gJnNoX29wY29kZXNbKGluc24gJiAweGYwMDApID4+IDEyXTsKLSAgbWluID0gbWFqLT5taW5vcl9vcGNvZGVzOwotICBtaW5lbmQgPSBtaW4gKyBtYWotPmNvdW50OwotICBmb3IgKDsgbWluIDwgbWluZW5kOyBtaW4rKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbDsKLSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wLCAqb3BlbmQ7Ci0KLSAgICAgIGwgPSBpbnNuICYgbWluLT5tYXNrOwotICAgICAgb3AgPSBtaW4tPm9wY29kZXM7Ci0gICAgICBvcGVuZCA9IG9wICsgbWluLT5jb3VudDsKLQotICAgICAgLyogU2luY2UgdGhlIG9wY29kZXMgdGFibGVzIGFyZSBzb3J0ZWQsIHdlIGNvdWxkIHVzZSBhIGJpbmFyeQotICAgICAgICAgc2VhcmNoIGhlcmUgaWYgdGhlIGNvdW50IHdlcmUgYWJvdmUgc29tZSBjdXRvZmYgdmFsdWUuICAqLwotICAgICAgZm9yICg7IG9wIDwgb3BlbmQ7IG9wKyspCi0JaWYgKG9wLT5vcGNvZGUgPT0gbCkKLQkgIHJldHVybiBvcDsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7ICAKLX0KLQotLyogU2VlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gdXNlcyBvciBzZXRzIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuX3VzZXNfb3Jfc2V0c19yZWcgKGluc24sIG9wLCByZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLXsKLSAgaWYgKHNoX2luc25fdXNlc19yZWcgKGluc24sIG9wLCByZWcpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBzaF9pbnNuX3NldHNfcmVnIChpbnNuLCBvcCwgcmVnKTsKLX0KLQotLyogU2VlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gdXNlcyBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuX3VzZXNfcmVnIChpbnNuLCBvcCwgcmVnKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgIHVuc2lnbmVkIGludCByZWc7Ci17Ci0gIHVuc2lnbmVkIGludCBmOwotCi0gIGYgPSBvcC0+ZmxhZ3M7Ci0KLSAgaWYgKChmICYgVVNFUzEpICE9IDAKLSAgICAgICYmIFVTRVMxX1JFRyAoaW5zbikgPT0gcmVnKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTMikgIT0gMAotICAgICAgJiYgVVNFUzJfUkVHIChpbnNuKSA9PSByZWcpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNSMCkgIT0gMAotICAgICAgJiYgcmVnID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNBUykgJiYgcmVnID09IFVTRVNBU19SRUcgKGluc24pKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTUjgpICYmIHJlZyA9PSA4KQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gc2V0cyBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuX3NldHNfcmVnIChpbnNuLCBvcCwgcmVnKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgIHVuc2lnbmVkIGludCByZWc7Ci17Ci0gIHVuc2lnbmVkIGludCBmOwotCi0gIGYgPSBvcC0+ZmxhZ3M7Ci0KLSAgaWYgKChmICYgU0VUUzEpICE9IDAKLSAgICAgICYmIFNFVFMxX1JFRyAoaW5zbikgPT0gcmVnKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBTRVRTMikgIT0gMAotICAgICAgJiYgU0VUUzJfUkVHIChpbnNuKSA9PSByZWcpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFNFVFNSMCkgIT0gMAotICAgICAgJiYgcmVnID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFNFVFNBUykgJiYgcmVnID09IFNFVFNBU19SRUcgKGluc24pKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gdXNlcyBvciBzZXRzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25fdXNlc19vcl9zZXRzX2ZyZWcgKGluc24sIG9wLCByZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLXsKLSAgaWYgKHNoX2luc25fdXNlc19mcmVnIChpbnNuLCBvcCwgcmVnKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gc2hfaW5zbl9zZXRzX2ZyZWcgKGluc24sIG9wLCByZWcpOwotfQotCi0vKiBTZWUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiB1c2VzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfaW5zbl91c2VzX2ZyZWcgKGluc24sIG9wLCBmcmVnKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgIHVuc2lnbmVkIGludCBmcmVnOwotewotICB1bnNpZ25lZCBpbnQgZjsKLQotICBmID0gb3AtPmZsYWdzOwotCi0gIC8qIFdlIGNhbid0IHRlbGwgaWYgdGhpcyBpcyBhIGRvdWJsZS1wcmVjaXNpb24gaW5zbiwgc28ganVzdCBwbGF5IHNhZmUKLSAgICAgYW5kIGFzc3VtZSB0aGF0IGl0IG1pZ2h0IGJlLiAgU28gbm90IG9ubHkgaGF2ZSB3ZSB0ZXN0IEZSRUcgYWdhaW5zdAotICAgICBpdHNlbGYsIGJ1dCBhbHNvIGV2ZW4gRlJFRyBhZ2FpbnN0IEZSRUcrMSAtIGlmIHRoZSB1c2luZyBpbnNuIHVzZXMKLSAgICAganVzdCB0aGUgbG93IHBhcnQgb2YgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIC0gYnV0IGFsc28gYW4gb2RkCi0gICAgIEZSRUcgYWdhaW5zdCBGUkVHLTEgLSAgaWYgdGhlIHNldHRpbmcgaW5zbiBzZXRzIGp1c3QgdGhlIGxvdyBwYXJ0Ci0gICAgIG9mIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZS4KLSAgICAgU28gd2hhdCB0aGlzIGFsbCBib2lscyBkb3duIHRvIGlzIHRoYXQgd2UgaGF2ZSB0byBpZ25vcmUgdGhlIGxvd2VzdAotICAgICBiaXQgb2YgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gICAgIAotICBpZiAoKGYgJiBVU0VTRjEpICE9IDAKLSAgICAgICYmIChVU0VTRjFfUkVHIChpbnNuKSAmIDB4ZSkgPT0gKGZyZWcgJiAweGUpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTRjIpICE9IDAKLSAgICAgICYmIChVU0VTRjJfUkVHIChpbnNuKSAmIDB4ZSkgPT0gKGZyZWcgJiAweGUpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTRjApICE9IDAKLSAgICAgICYmIGZyZWcgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGFuIGluc3RydWN0aW9uIHNldHMgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuX3NldHNfZnJlZyAoaW5zbiwgb3AsIGZyZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IGZyZWc7Ci17Ci0gIHVuc2lnbmVkIGludCBmOwotCi0gIGYgPSBvcC0+ZmxhZ3M7Ci0KLSAgLyogV2UgY2FuJ3QgdGVsbCBpZiB0aGlzIGlzIGEgZG91YmxlLXByZWNpc2lvbiBpbnNuLCBzbyBqdXN0IHBsYXkgc2FmZQotICAgICBhbmQgYXNzdW1lIHRoYXQgaXQgbWlnaHQgYmUuICBTbyBub3Qgb25seSBoYXZlIHdlIHRlc3QgRlJFRyBhZ2FpbnN0Ci0gICAgIGl0c2VsZiwgYnV0IGFsc28gZXZlbiBGUkVHIGFnYWluc3QgRlJFRysxIC0gaWYgdGhlIHVzaW5nIGluc24gdXNlcwotICAgICBqdXN0IHRoZSBsb3cgcGFydCBvZiBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgLSBidXQgYWxzbyBhbiBvZGQKLSAgICAgRlJFRyBhZ2FpbnN0IEZSRUctMSAtICBpZiB0aGUgc2V0dGluZyBpbnNuIHNldHMganVzdCB0aGUgbG93IHBhcnQKLSAgICAgb2YgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlLgotICAgICBTbyB3aGF0IHRoaXMgYWxsIGJvaWxzIGRvd24gdG8gaXMgdGhhdCB3ZSBoYXZlIHRvIGlnbm9yZSB0aGUgbG93ZXN0Ci0gICAgIGJpdCBvZiB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgCi0gIGlmICgoZiAmIFNFVFNGMSkgIT0gMAotICAgICAgJiYgKFNFVFNGMV9SRUcgKGluc24pICYgMHhlKSA9PSAoZnJlZyAmIDB4ZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTZWUgd2hldGhlciBpbnN0cnVjdGlvbnMgSTEgYW5kIEkyIGNvbmZsaWN0LCBhc3N1bWluZyBJMSBjb21lcwotICAgYmVmb3JlIEkyLiAgT1AxIGFuZCBPUDIgYXJlIHRoZSBjb3JyZXNwb25kaW5nIHNoX29wY29kZSBzdHJ1Y3R1cmVzLgotICAgVGhpcyBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBjb25mbGljdCwgb3IgZmFsc2UgaWYgdGhlCi0gICBpbnN0cnVjdGlvbnMgY2FuIGJlIHN3YXBwZWQgc2FmZWx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25zX2NvbmZsaWN0IChpMSwgb3AxLCBpMiwgb3AyKQotICAgICB1bnNpZ25lZCBpbnQgaTE7Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMTsKLSAgICAgdW5zaWduZWQgaW50IGkyOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDI7Ci17Ci0gIHVuc2lnbmVkIGludCBmMSwgZjI7Ci0KLSAgZjEgPSBvcDEtPmZsYWdzOwotICBmMiA9IG9wMi0+ZmxhZ3M7Ci0KLSAgLyogTG9hZCBvZiBmcHNjciBjb25mbGljdHMgd2l0aCBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLgotICAgICBGSVhNRTogc2hvdWxkbid0IHRlc3QgcmF3IG9wY29kZXMgaGVyZS4gICovCi0gIGlmICgoKGkxICYgMHhmMGZmKSA9PSAweDQwNjYgJiYgKGkyICYgMHhmMDAwKSA9PSAweGYwMDApCi0gICAgICB8fCAoKGkyICYgMHhmMGZmKSA9PSAweDQwNjYgJiYgKGkxICYgMHhmMDAwKSA9PSAweGYwMDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjEgJiAoQlJBTkNIIHwgREVMQVkpKSAhPSAwCi0gICAgICB8fCAoZjIgJiAoQlJBTkNIIHwgREVMQVkpKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoKGYxIHwgZjIpICYgU0VUU1NQKQotICAgICAgJiYgKGYxICYgKFNFVFNTUCB8IFVTRVNTUCkpCi0gICAgICAmJiAoZjIgJiAoU0VUU1NQIHwgVVNFU1NQKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIFNFVFMxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfb3Jfc2V0c19yZWcgKGkyLCBvcDIsIFNFVFMxX1JFRyAoaTEpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMSAmIFNFVFMyKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfb3Jfc2V0c19yZWcgKGkyLCBvcDIsIFNFVFMyX1JFRyAoaTEpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMSAmIFNFVFNSMCkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX29yX3NldHNfcmVnIChpMiwgb3AyLCAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMSAmIFNFVFNBUykKLSAgICAgICYmIHNoX2luc25fdXNlc19vcl9zZXRzX3JlZyAoaTIsIG9wMiwgU0VUU0FTX1JFRyAoaTEpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMSAmIFNFVFNGMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX29yX3NldHNfZnJlZyAoaTIsIG9wMiwgU0VUU0YxX1JFRyAoaTEpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYyICYgU0VUUzEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19vcl9zZXRzX3JlZyAoaTEsIG9wMSwgU0VUUzFfUkVHIChpMikpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUUzIpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19vcl9zZXRzX3JlZyAoaTEsIG9wMSwgU0VUUzJfUkVHIChpMikpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUU1IwKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfb3Jfc2V0c19yZWcgKGkxLCBvcDEsIDApKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUU0FTKQotICAgICAgJiYgc2hfaW5zbl91c2VzX29yX3NldHNfcmVnIChpMSwgb3AxLCBTRVRTQVNfUkVHIChpMikpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfb3Jfc2V0c19mcmVnIChpMSwgb3AxLCBTRVRTRjFfUkVHIChpMikpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgZG8gbm90IGNvbmZsaWN0LiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBJMSBpcyBhIGxvYWQgaW5zdHJ1Y3Rpb24sIGFuZCBJMiBpcyBzb21lIG90aGVyIGluc3RydWN0aW9uLiAgUmV0dXJuCi0gICB0cnVlIGlmIEkxIGxvYWRzIGEgcmVnaXN0ZXIgd2hpY2ggSTIgdXNlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9sb2FkX3VzZSAoaTEsIG9wMSwgaTIsIG9wMikKLSAgICAgdW5zaWduZWQgaW50IGkxOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDE7Ci0gICAgIHVuc2lnbmVkIGludCBpMjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AyOwotewotICB1bnNpZ25lZCBpbnQgZjE7Ci0KLSAgZjEgPSBvcDEtPmZsYWdzOwotCi0gIGlmICgoZjEgJiBMT0FEKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiBib3RoIFNFVFMxIGFuZCBTRVRTU1AgYXJlIHNldCwgdGhhdCBtZWFucyBhIGxvYWQgdG8gYSBzcGVjaWFsCi0gICAgIHJlZ2lzdGVyIHVzaW5nIHBvc3RpbmNyZW1lbnQgYWRkcmVzc2luZyBtb2RlLCB3aGljaCB3ZSBkb24ndCBjYXJlCi0gICAgIGFib3V0IGhlcmUuICAqLwotICBpZiAoKGYxICYgU0VUUzEpICE9IDAKLSAgICAgICYmIChmMSAmIFNFVFNTUCkgPT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUU1IwKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfZnJlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRyeSB0byBhbGlnbiBsb2FkcyBhbmQgc3RvcmVzIHdpdGhpbiBhIHNwYW4gb2YgbWVtb3J5LiAgVGhpcyBpcwotICAgY2FsbGVkIGJ5IGJvdGggdGhlIEVMRiBhbmQgdGhlIENPRkYgc2ggdGFyZ2V0cy4gIEFCRkQgYW5kIFNFQyBhcmUKLSAgIHRoZSBCRkQgYW5kIHNlY3Rpb24gd2UgYXJlIGV4YW1pbmluZy4gIENPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZgotICAgdGhlIHNlY3Rpb24uICBTV0FQIGlzIHRoZSByb3V0aW5lIHRvIGNhbGwgdG8gc3dhcCB0d28gaW5zdHJ1Y3Rpb25zLgotICAgUkVMT0NTIGlzIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgdG8gYmUKLSAgIHBhc3NlZCB0byBTV0FQLiAgUExBQkVMIGlzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBsYWJlbCBpbiBhCi0gICBzb3J0ZWQgbGlzdCBvZiBsYWJlbHM7IExBQkVMX0VORCBpcyB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgU1RBUlQgYW5kCi0gICBTVE9QIGFyZSB0aGUgcmFuZ2Ugb2YgbWVtb3J5IHRvIGV4YW1pbmUuICBJZiBhIHN3YXAgaXMgbWFkZSwKLSAgICpQU1dBUFBFRCBpcyBzZXQgdG8gdHJ1ZS4gICovCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1ib29sZWFuCi1fYmZkX3NoX2FsaWduX2xvYWRfc3BhbiAoYWJmZCwgc2VjLCBjb250ZW50cywgc3dhcCwgcmVsb2NzLAotCQkJIHBsYWJlbCwgbGFiZWxfZW5kLCBzdGFydCwgc3RvcCwgcHN3YXBwZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuICgqc3dhcCkgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotICAgICBQVFIgcmVsb2NzOwotICAgICBiZmRfdm1hICoqcGxhYmVsOwotICAgICBiZmRfdm1hICpsYWJlbF9lbmQ7Ci0gICAgIGJmZF92bWEgc3RhcnQ7Ci0gICAgIGJmZF92bWEgc3RvcDsKLSAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Ci17Ci0gIGludCBkc3AgPSAoYWJmZC0+YXJjaF9pbmZvLT5tYWNoID09IGJmZF9tYWNoX3NoX2RzcAotCSAgICAgfHwgYWJmZC0+YXJjaF9pbmZvLT5tYWNoID09IGJmZF9tYWNoX3NoM19kc3ApOwotICBiZmRfdm1hIGk7Ci0KLSAgLyogVGhlIFNINCBoYXMgYSBIYXJ2YXJkIGFyY2hpdGVjdHVyZSwgaGVuY2UgYWxpZ25pbmcgbG9hZHMgaXMgbm90Ci0gICAgIGRlc2lyYWJsZS4gIEluIGZhY3QsIGl0IGlzIGNvdW50ZXItcHJvZHVjdGl2ZSwgc2luY2UgaXQgaW50ZXJmZXJlcwotICAgICB3aXRoIHRoZSBzY2hlZHVsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlci4gICovCi0gIGlmIChhYmZkLT5hcmNoX2luZm8tPm1hY2ggPT0gYmZkX21hY2hfc2g0KQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHdlIGFyZSBsaW5raW5nIHNoWzNdLWRzcCBjb2RlLCBzd2FwIHRoZSBGUFUgaW5zdHJ1Y3Rpb25zIGZvciBEU1AKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgaWYgKGRzcCkKLSAgICB7Ci0gICAgICBzaF9vcGNvZGVzWzB4Zl0ubWlub3Jfb3Bjb2RlcyA9IHNoX2RzcF9vcGNvZGVmOwotICAgICAgc2hfb3Bjb2Rlc1sweGZdLmNvdW50ID0gc2l6ZW9mIHNoX2RzcF9vcGNvZGVmIC8gc2l6ZW9mIHNoX2RzcF9vcGNvZGVmOwotICAgIH0KLQotICAvKiBJbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGFsaWduZWQgb24gMiBieXRlIGJvdW5kYXJpZXMuICAqLwotICBpZiAoKHN0YXJ0ICYgMSkgPT0gMSkKLSAgICArK3N0YXJ0OwotCi0gIC8qIE5vdyBsb29rIHRocm91Z2ggdGhlIHVuYWxpZ25lZCBhZGRyZXNzZXMuICAqLwotICBpID0gc3RhcnQ7Ci0gIGlmICgoaSAmIDIpID09IDApCi0gICAgaSArPSAyOwotICBmb3IgKDsgaSA8IHN0b3A7IGkgKz0gNCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOwotICAgICAgdW5zaWduZWQgaW50IHByZXZfaW5zbiA9IDA7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpwcmV2X29wID0gTlVMTDsKLQotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSk7Ci0gICAgICBvcCA9IHNoX2luc25faW5mbyAoaW5zbik7Ci0gICAgICBpZiAob3AgPT0gTlVMTAotCSAgfHwgKG9wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBUaGlzIGlzIGEgbG9hZCBvciBzdG9yZSB3aGljaCBpcyBub3Qgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotCi0gICAgICB3aGlsZSAoKnBsYWJlbCA8IGxhYmVsX2VuZCAmJiAqKnBsYWJlbCA8IGkpCi0JKysqcGxhYmVsOwotCi0gICAgICBpZiAoaSA+IHN0YXJ0KQotCXsKLQkgIHByZXZfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSAtIDIpOwotCSAgLyogSWYgSU5TTiBpcyB0aGUgZmllbGQgYiBvZiBhIHBhcmFsbGVsIHByb2Nlc3NpbmcgaW5zbiwgaXQgaXMgbm90Ci0JICAgICBhIGxvYWQgLyBzdG9yZSBhZnRlciBhbGwuICBOb3RlIHRoYXQgdGhlIHRlc3QgaGVyZSBtaWdodCBtaXN0YWtlCi0JICAgICB0aGUgZmllbGRfYiBvZiBhIHBjb3B5IGluc24gZm9yIHRoZSBzdGFydGluZyBjb2RlIG9mIGEgcGFyYWxsZWwKLQkgICAgIHByb2Nlc3NpbmcgaW5zbjsgdGhpcyBtaWdodCBtaXNzIGEgc3dhcHBpbmcgb3Bwb3J0dW5pdHksIGJ1dCBhdAotCSAgICAgbGVhc3Qgd2UncmUgb24gdGhlIHNhZmUgc2lkZS4gICovCi0JICBpZiAoZHNwICYmIChwcmV2X2luc24gJiAweGZjMDApID09IDB4ZjgwMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIENoZWNrIGlmIHByZXZfaW5zbiBpcyBhY3R1YWxseSB0aGUgZmllbGQgYiBvZiBhIHBhcmFsbGVsCi0JICAgICBwcm9jZXNzaW5nIGluc24uICBBZ2FpbiwgdGhpcyBjYW4gZ2l2ZSBhIHNwdXJpb3VzIG1hdGNoCi0JICAgICBhZnRlciBhIHBjb3B5LiAgKi8KLQkgIGlmIChkc3AgJiYgaSAtIDIgPiBzdGFydCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIHBwcmV2X2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgLSA0KTsKLQkKLQkgICAgICBpZiAoKHBwcmV2X2luc24gJiAweGZjMDApID09IDB4ZjgwMCkKLQkJcHJldl9vcCA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQlwcmV2X29wID0gc2hfaW5zbl9pbmZvIChwcmV2X2luc24pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHByZXZfb3AgPSBzaF9pbnNuX2luZm8gKHByZXZfaW5zbik7Ci0KLQkgIC8qIElmIHRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIGlzIGluIGEgZGVsYXkgc2xvdCwgd2UKLQkgICAgIGNhbid0IHN3YXAuICAqLwotCSAgaWYgKHByZXZfb3AgPT0gTlVMTAotCSAgICAgIHx8IChwcmV2X29wLT5mbGFncyAmIERFTEFZKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoaSA+IHN0YXJ0Ci0JICAmJiAoKnBsYWJlbCA+PSBsYWJlbF9lbmQgfHwgKipwbGFiZWwgIT0gaSkKLQkgICYmIHByZXZfb3AgIT0gTlVMTAotCSAgJiYgKHByZXZfb3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDAKLQkgICYmICEgc2hfaW5zbnNfY29uZmxpY3QgKHByZXZfaW5zbiwgcHJldl9vcCwgaW5zbiwgb3ApKQotCXsKLQkgIGJvb2xlYW4gb2s7Ci0KLQkgIC8qIFRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIGRvZXMgbm90IGhhdmUgYSBsYWJlbCwgYW5kCi0JICAgICB0aGVyZSBpcyBhIHByZXZpb3VzIGluc3RydWN0aW9uOyBQUkVWX0lOU04gaXMgbm90Ci0JICAgICBpdHNlbGYgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLCBhbmQgUFJFVl9JTlNOIGFuZAotCSAgICAgSU5TTiBkbyBub3QgY29uZmxpY3QuICAqLwotCi0JICBvayA9IHRydWU7Ci0KLQkgIGlmIChpID49IHN0YXJ0ICsgNCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBwcmV2Ml9pbnNuOwotCSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKnByZXYyX29wOwotCi0JICAgICAgcHJldjJfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSAtIDQpOwotCSAgICAgIHByZXYyX29wID0gc2hfaW5zbl9pbmZvIChwcmV2Ml9pbnNuKTsKLQotCSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBiZWZvcmUgUFJFVl9JTlNOIGhhcyBhIGRlbGF5Ci0JCSBzbG90LS10aGF0IGlzLCBQUkVWX0lOU04gaXMgaW4gYSBkZWxheSBzbG90LS13ZQotCQkgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICBpZiAocHJldjJfb3AgPT0gTlVMTAotCQkgIHx8IChwcmV2Ml9vcC0+ZmxhZ3MgJiBERUxBWSkgIT0gMCkKLQkJb2sgPSBmYWxzZTsKLQotCSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBiZWZvcmUgUFJFVl9JTlNOIGlzIGEgbG9hZCwKLQkJIGFuZCBpdCBzZXRzIGEgcmVnaXN0ZXIgd2hpY2ggSU5TTiB1c2VzLCB0aGVuCi0JCSBwdXR0aW5nIElOU04gaW1tZWRpYXRlbHkgYWZ0ZXIgUFJFVl9JTlNOIHdpbGwKLQkJIGNhdXNlIGEgcGlwZWxpbmUgYnViYmxlLCBzbyB0aGVyZSBpcyBubyBwb2ludCB0bwotCQkgbWFraW5nIHRoZSBzd2FwLiAgKi8KLQkgICAgICBpZiAob2sKLQkJICAmJiAocHJldjJfb3AtPmZsYWdzICYgTE9BRCkgIT0gMAotCQkgICYmIHNoX2xvYWRfdXNlIChwcmV2Ml9pbnNuLCBwcmV2Ml9vcCwgaW5zbiwgb3ApKQotCQlvayA9IGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChvaykKLQkgICAgewotCSAgICAgIGlmICghICgqc3dhcCkgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgaSAtIDIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBzd2FwcGVkID0gdHJ1ZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgd2hpbGUgKCpwbGFiZWwgPCBsYWJlbF9lbmQgJiYgKipwbGFiZWwgPCBpICsgMikKLQkrKypwbGFiZWw7Ci0KLSAgICAgIGlmIChpICsgMiA8IHN0b3AKLQkgICYmICgqcGxhYmVsID49IGxhYmVsX2VuZCB8fCAqKnBsYWJlbCAhPSBpICsgMikpCi0JewotCSAgdW5zaWduZWQgaW50IG5leHRfaW5zbjsKLQkgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm5leHRfb3A7Ci0KLQkgIC8qIFRoZXJlIGlzIGFuIGluc3RydWN0aW9uIGFmdGVyIHRoZSBsb2FkL3N0b3JlCi0JICAgICBpbnN0cnVjdGlvbiwgYW5kIGl0IGRvZXMgbm90IGhhdmUgYSBsYWJlbC4gICovCi0JICBuZXh0X2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgKyAyKTsKLQkgIG5leHRfb3AgPSBzaF9pbnNuX2luZm8gKG5leHRfaW5zbik7Ci0JICBpZiAobmV4dF9vcCAhPSBOVUxMCi0JICAgICAgJiYgKG5leHRfb3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDAKLQkgICAgICAmJiAhIHNoX2luc25zX2NvbmZsaWN0IChpbnNuLCBvcCwgbmV4dF9pbnNuLCBuZXh0X29wKSkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gb2s7Ci0KLQkgICAgICAvKiBORVhUX0lOU04gaXMgbm90IGl0c2VsZiBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24sCi0JCSBhbmQgaXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBJTlNOLiAgKi8KLQotCSAgICAgIG9rID0gdHJ1ZTsKLQotCSAgICAgIC8qIElmIFBSRVZfSU5TTiBpcyBhIGxvYWQsIGFuZCBpdCBzZXRzIGEgcmVnaXN0ZXIKLQkJIHdoaWNoIE5FWFRfSU5TTiB1c2VzLCB0aGVuIHB1dHRpbmcgTkVYVF9JTlNOCi0JCSBpbW1lZGlhdGVseSBhZnRlciBQUkVWX0lOU04gd2lsbCBjYXVzZSBhIHBpcGVsaW5lCi0JCSBidWJibGUsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBtYWtlIHRoaXMgc3dhcC4gICovCi0JICAgICAgaWYgKHByZXZfb3AgIT0gTlVMTAotCQkgICYmIChwcmV2X29wLT5mbGFncyAmIExPQUQpICE9IDAKLQkJICAmJiBzaF9sb2FkX3VzZSAocHJldl9pbnNuLCBwcmV2X29wLCBuZXh0X2luc24sIG5leHRfb3ApKQotCQlvayA9IGZhbHNlOwotCi0JICAgICAgLyogSWYgSU5TTiBpcyBhIGxvYWQsIGFuZCBpdCBzZXRzIGEgcmVnaXN0ZXIgd2hpY2gKLQkJIHRoZSBpbnNuIGFmdGVyIE5FWFRfSU5TTiB1c2VzLCB0aGVuIGRvaW5nIHRoZQotCQkgc3dhcCB3aWxsIGNhdXNlIGEgcGlwZWxpbmUgYnViYmxlLCBzbyB0aGVyZSBpcyBubwotCQkgcmVhc29uIHRvIG1ha2UgdGhlIHN3YXAuICBIb3dldmVyLCBpZiB0aGUgaW5zbgotCQkgYWZ0ZXIgTkVYVF9JTlNOIGlzIGl0c2VsZiBhIGxvYWQgb3Igc3RvcmUKLQkJIGluc3RydWN0aW9uLCB0aGVuIGl0IGlzIG1pc2FsaWduZWQsIHNvCi0JCSBvcHRpbWlzdGljYWxseSBob3BlIHRoYXQgaXQgd2lsbCBiZSBzd2FwcGVkCi0JCSBpdHNlbGYsIGFuZCBqdXN0IGxpdmUgd2l0aCB0aGUgcGlwZWxpbmUgYnViYmxlIGlmCi0JCSBpdCBpc24ndC4gICovCi0JICAgICAgaWYgKG9rCi0JCSAgJiYgaSArIDQgPCBzdG9wCi0JCSAgJiYgKG9wLT5mbGFncyAmIExPQUQpICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgbmV4dDJfaW5zbjsKLQkJICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpuZXh0Ml9vcDsKLQotCQkgIG5leHQyX2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgKyA0KTsKLQkJICBuZXh0Ml9vcCA9IHNoX2luc25faW5mbyAobmV4dDJfaW5zbik7Ci0JCSAgaWYgKChuZXh0Ml9vcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMAotCQkgICAgICAmJiBzaF9sb2FkX3VzZSAoaW5zbiwgb3AsIG5leHQyX2luc24sIG5leHQyX29wKSkKLQkJICAgIG9rID0gZmFsc2U7Ci0JCX0KLQotCSAgICAgIGlmIChvaykKLQkJewotCQkgIGlmICghICgqc3dhcCkgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgaSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgKnBzd2FwcGVkID0gdHJ1ZTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBub3QgQ09GRl9JTUFHRV9XSVRIX1BFICovCi0KLS8qIExvb2sgZm9yIGxvYWRzIGFuZCBzdG9yZXMgd2hpY2ggd2UgY2FuIGFsaWduIHRvIGZvdXIgYnl0ZQotICAgYm91bmRhcmllcy4gIFNlZSB0aGUgbG9uZ2VyIGNvbW1lbnQgYWJvdmUgc2hfcmVsYXhfc2VjdGlvbiBmb3Igd2h5Ci0gICB0aGlzIGlzIGRlc2lyYWJsZS4gIFRoaXMgc2V0cyAqUFNXQVBQRUQgaWYgc29tZSBpbnN0cnVjdGlvbiB3YXMKLSAgIHN3YXBwZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywgcHN3YXBwZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF92bWEgKmxhYmVscyA9IE5VTEw7Ci0gIGJmZF92bWEgKmxhYmVsLCAqbGFiZWxfZW5kOwotCi0gICpwc3dhcHBlZCA9IGZhbHNlOwotCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEdldCBhbGwgdGhlIGFkZHJlc3NlcyB3aXRoIGxhYmVscyBvbiB0aGVtLiAgKi8KLSAgbGFiZWxzID0gKGJmZF92bWEgKikgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYmZkX3ZtYSkpOwotICBpZiAobGFiZWxzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGxhYmVsX2VuZCA9IGxhYmVsczsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9MQUJFTCkKLQl7Ci0JICAqbGFiZWxfZW5kID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgKytsYWJlbF9lbmQ7Ci0JfQotICAgIH0KLQotICAvKiBOb3RlIHRoYXQgdGhlIGFzc2VtYmxlciBjdXJyZW50bHkgYWx3YXlzIG91dHB1dHMgcmVsb2NzIGluCi0gICAgIGFkZHJlc3Mgb3JkZXIuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwgbmVlZCB0byBzb3J0Ci0gICAgIHRoZSBsYWJlbCB2YWx1ZXMgYW5kIHRoZSByZWxvY3MuICAqLwotCi0gIGxhYmVsID0gbGFiZWxzOwotCi0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN0YXJ0LCBzdG9wOwotCi0gICAgICBpZiAoaXJlbC0+cl90eXBlICE9IFJfU0hfQ09ERSkKLQljb250aW51ZTsKLQotICAgICAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0KLSAgICAgIGZvciAoaXJlbCsrOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCWlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9EQVRBKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbCA8IGlyZWxlbmQpCi0Jc3RvcCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLSAgICAgIGVsc2UKLQlzdG9wID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgICAgIGlmICghIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuIChhYmZkLCBzZWMsIGNvbnRlbnRzLCBzaF9zd2FwX2luc25zLAotCQkJCSAgICAgKFBUUikgaW50ZXJuYWxfcmVsb2NzLCAmbGFiZWwsCi0JCQkJICAgICBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZyZWUgKGxhYmVscyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChsYWJlbHMgIT0gTlVMTCkKLSAgICBmcmVlIChsYWJlbHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFN3YXAgdHdvIFNIIGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9zd2FwX2luc25zIChhYmZkLCBzZWMsIHJlbG9jcywgY29udGVudHMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHJlbG9jczsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSByZWxvY3M7Ci0gIHVuc2lnbmVkIHNob3J0IGkxLCBpMjsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLQotICAvKiBTd2FwIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4gICovCi0gIGkxID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKLSAgaTIgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgaTIsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkxLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLQotICAvKiBBZGp1c3QgYWxsIHJlbG9jIGFkZHJlc3Nlcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaW50IHR5cGUsIGFkZDsKLQotICAgICAgLyogVGhlcmUgYXJlIGEgZmV3IHNwZWNpYWwgdHlwZXMgb2YgcmVsb2NzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgYWRqdXN0LiAgVGhlc2UgcmVsb2NzIGRvIG5vdCBhcHBseSB0byB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLAotICAgICAgICAgYnV0IGFyZSBvbmx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRkcmVzcy4gICovCi0gICAgICB0eXBlID0gaXJlbC0+cl90eXBlOwotICAgICAgaWYgKHR5cGUgPT0gUl9TSF9BTElHTgotCSAgfHwgdHlwZSA9PSBSX1NIX0NPREUKLQkgIHx8IHR5cGUgPT0gUl9TSF9EQVRBCi0JICB8fCB0eXBlID09IFJfU0hfTEFCRUwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIGFuIFJfU0hfVVNFUyByZWxvYyBwb2ludHMgdG8gb25lIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcKLSAgICAgICAgIHN3YXBwZWQsIHdlIG11c3QgYWRqdXN0IGl0LiAgSXQgd291bGQgYmUgaW5jb3JyZWN0IHRvIGRvIHRoaXMKLSAgICAgICAgIGZvciBhIGp1bXAsIHRob3VnaCwgc2luY2Ugd2Ugd2FudCB0byBleGVjdXRlIGJvdGgKLSAgICAgICAgIGluc3RydWN0aW9ucyBhZnRlciB0aGUganVtcC4gIChXZSBoYXZlIGF2b2lkZWQgc3dhcHBpbmcKLSAgICAgICAgIGFyb3VuZCBhIGxhYmVsLCBzbyB0aGUganVtcCB3aWxsIG5vdCB3aW5kIHVwIGV4ZWN1dGluZyBhbgotICAgICAgICAgaW5zdHJ1Y3Rpb24gaXQgc2hvdWxkbid0KS4gICovCi0gICAgICBpZiAodHlwZSA9PSBSX1NIX1VTRVMpCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIG9mZiA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSArIDQgKyBpcmVsLT5yX29mZnNldDsKLQkgIGlmIChvZmYgPT0gYWRkcikKLQkgICAgaXJlbC0+cl9vZmZzZXQgKz0gMjsKLQkgIGVsc2UgaWYgKG9mZiA9PSBhZGRyICsgMikKLQkgICAgaXJlbC0+cl9vZmZzZXQgLT0gMjsKLQl9Ci0KLSAgICAgIGlmIChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPT0gYWRkcikKLQl7Ci0JICBpcmVsLT5yX3ZhZGRyICs9IDI7Ci0JICBhZGQgPSAtMjsKLQl9Ci0gICAgICBlbHNlIGlmIChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPT0gYWRkciArIDIpCi0JewotCSAgaXJlbC0+cl92YWRkciAtPSAyOwotCSAgYWRkID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JYWRkID0gMDsKLQotICAgICAgaWYgKGFkZCAhPSAwKQotCXsKLQkgIGJmZF9ieXRlICpsb2M7Ci0JICB1bnNpZ25lZCBzaG9ydCBpbnNuLCBvaW5zbjsKLQkgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLQkgIGxvYyA9IGNvbnRlbnRzICsgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAodHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENESVNQOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgICAgIC8qIFRoaXMgcmVsb2MgaWdub3JlcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMyBiaXRzIG9mCi0gICAgICAgICAgICAgICAgIHRoZSBwcm9ncmFtIGNvdW50ZXIgYmVmb3JlIGFkZGluZyBpbiB0aGUgb2Zmc2V0LgotICAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgaWYgQUREUiBpcyBhdCBhbiBldmVuIGFkZHJlc3MsIHRoZQotICAgICAgICAgICAgICAgICBzd2FwIHdpbGwgbm90IGFmZmVjdCB0aGUgb2Zmc2V0LiAgSWYgQUREUiBpcyBhbiBhdCBhbgotICAgICAgICAgICAgICAgICBvZGQgYWRkcmVzcywgdGhlbiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBjcm9zc2luZyBhCi0gICAgICAgICAgICAgICAgIGZvdXIgYnl0ZSBib3VuZGFyeSwgYW5kIG11c3QgYmUgYWRqdXN0ZWQuICAqLwotCSAgICAgIGlmICgoYWRkciAmIDMpICE9IDApCi0JCXsKLQkJICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkJICBvaW5zbiA9IGluc247Ci0JCSAgaW5zbiArPSBhZGQgLyAyOwotCQkgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgICgiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyBpcyBhIG1vZGlmaWNhdGlvbiBvZiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLCB3aGljaAotICAgd2lsbCBoYW5kbGUgU0ggcmVsYXhpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJICAgICByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICAvKiBBbG1vc3QgYWxsIHJlbG9jcyBoYXZlIHRvIGRvIHdpdGggcmVsYXhpbmcuICBJZiBhbnkgd29yayBtdXN0Ci0gICAgICAgICBiZSBkb25lIGZvciB0aGVtLCBpdCBoYXMgYmVlbiBkb25lIGluIHNoX3JlbGF4X3NlY3Rpb24uICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlICE9IFJfU0hfSU1NMzIKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQkgICYmIHJlbC0+cl90eXBlICE9IFJfU0hfSU1NMzJDRQotCSAgJiYgcmVsLT5yX3R5cGUgIT0gUl9TSF9JTUFHRUJBU0UKLSNlbmRpZgotCSAgJiYgcmVsLT5yX3R5cGUgIT0gUl9TSF9QQ0RJU1ApCi0JY29udGludWU7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaWYgKHN5bW5keCA8IDAKLQkgICAgICB8fCAodW5zaWduZWQgbG9uZykgc3ltbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSgiJXM6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiByZWxvY3MiLAotCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgc3ltbmR4KTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLSAgICAgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1NIX1BDRElTUCkKLQlhZGRlbmQgLT0gNDsKLQotICAgICAgaWYgKHJlbC0+cl90eXBlID49IFNIX0NPRkZfSE9XVE9fQ09VTlQpCi0JaG93dG8gPSBOVUxMOwotICAgICAgZWxzZQotCWhvd3RvID0gJnNoX2NvZmZfaG93dG9zW3JlbC0+cl90eXBlXTsKLQotICAgICAgaWYgKGhvd3RvID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPT0gUl9TSF9JTUFHRUJBU0UpCi0JYWRkZW5kIC09IHBlX2RhdGEgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICAvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGZvciBhbiBpbnRlcm5hbCBQQ0RJU1AgcmVsb2MuICAqLwotCSAgaWYgKHJlbC0+cl90eXBlID09IFJfU0hfUENESVNQKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUKLQkJICAgICAtIHNlYy0+dm1hKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywKLQkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQl2YWwsIGFkZGVuZCk7Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZSBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JCSAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCSAgICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgZWxzZQotCSAgICAgIHsKLSAJCXN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0JCWJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCQluYW1lID0gYnVmOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICB3aGljaCB1c2VzIHNoX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmludGVybmFsX3N5bXMgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCi0gICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUKLSAgICAgIHx8IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pID09IE5VTEwKLSAgICAgIHx8IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICBtZW1jcHkgKGRhdGEsIGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5jb250ZW50cywKLQkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOwotICAgICAgYmZkX2J5dGUgKmVzeW0sICplc3ltZW5kOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXN5bXA7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotCi0gICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBmYWxzZSwgKGJmZF9ieXRlICopIE5VTEwsCi0JCQkgIGZhbHNlLCAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQotCQkgICAgICAgYmZkX21hbGxvYyAob2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkKLQkJCQkgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKQotCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKLSAgICAgIHNlY3BwID0gc2VjdGlvbnM7Ci0gICAgICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogc3ltZXN6OwotICAgICAgd2hpbGUgKGVzeW0gPCBlc3ltZW5kKQotCXsKLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIChQVFIpIGlzeW1wKTsKLQotCSAgaWYgKGlzeW1wLT5uX3NjbnVtICE9IDApCi0JICAgICpzZWNwcCA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+bl9zY251bSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaXN5bXAtPm5fdmFsdWUgPT0gMCkKLQkJKnNlY3BwID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgICAgICBlbHNlCi0JCSpzZWNwcCA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgIH0KLQotCSAgZXN5bSArPSAoaXN5bXAtPm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0JICBzZWNwcCArPSBpc3ltcC0+bl9udW1hdXggKyAxOwotCSAgaXN5bXAgKz0gaXN5bXAtPm5fbnVtYXV4ICsgMTsKLQl9Ci0KLSAgICAgIGlmICghIHNoX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZnJlZSAoc2VjdGlvbnMpOwotICAgICAgc2VjdGlvbnMgPSBOVUxMOwotICAgICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFRoZSB0YXJnZXQgdmVjdG9ycy4gICovCi0KLSNpZm5kZWYgVEFSR0VUX1NITF9TWU0KLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDIChzaGNvZmZfdmVjLCAiY29mZi1zaCIsIEJGRF9JU19SRUxBWEFCTEUsIDAsICdfJywgTlVMTCkKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1NITF9TWU0KLSNkZWZpbmUgVEFSR0VUX1NZTSBUQVJHRVRfU0hMX1NZTQotI2Vsc2UKLSNkZWZpbmUgVEFSR0VUX1NZTSBzaGxjb2ZmX3ZlYwotI2VuZGlmCi0gICAgIAotI2lmbmRlZiBUQVJHRVRfU0hMX05BTUUKLSNkZWZpbmUgVEFSR0VUX1NITF9OQU1FICJjb2ZmLXNobCIKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX1NITF9OQU1FLCBCRkRfSVNfUkVMQVhBQkxFLAotCQkJICAgICAgIFNFQ19DT0RFIHwgU0VDX0RBVEEsICdfJywgTlVMTCk7Ci0jZWxzZQotQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9TWU0sIFRBUkdFVF9TSExfTkFNRSwgQkZEX0lTX1JFTEFYQUJMRSwKLQkJCSAgICAgICAwLCAnXycsIE5VTEwpCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfU0hMX1NZTQotLyogU29tZSBwZW9wbGUgd2FudCB2ZXJzaW9ucyBvZiB0aGUgU0ggQ09GRiB0YXJnZXQgd2hpY2ggZG8gbm90IGFsaWduCi0gICB0byAxNiBieXRlIGJvdW5kYXJpZXMuICBXZSBpbXBsZW1lbnQgdGhhdCBieSBhZGRpbmcgYSBjb3VwbGUgb2YgbmV3Ci0gICB0YXJnZXQgdmVjdG9ycy4gIFRoZXNlIGFyZSBqdXN0IGxpa2UgdGhlIG9uZXMgYWJvdmUsIGJ1dCB0aGV5Ci0gICBjaGFuZ2UgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQuICBUbyBnZW5lcmF0ZSB0aGVtIGluIHRoZQotICAgYXNzZW1ibGVyLCB1c2UgLXNtYWxsLiAgVG8gdXNlIHRoZW0gaW4gdGhlIGxpbmtlciwgdXNlIC1iCi0gICBjb2ZmLXNoe2x9LXNtYWxsIGFuZCAtb2Zvcm1hdCBjb2ZmLXNoe2x9LXNtYWxsLgotCi0gICBZZXMsIHRoaXMgaXMgYSBob3JyaWJsZSBoYWNrLiAgQSBnZW5lcmFsIHNvbHV0aW9uIGZvciBzZXR0aW5nCi0gICBzZWN0aW9uIGFsaWdubWVudCBpbiBDT0ZGIGlzIHJhdGhlciBjb21wbGV4LiAgRUxGIGhhbmRsZXMgdGhpcwotICAgY29ycmVjdGx5LiAgKi8KLQotLyogT25seSByZWNvZ25pemUgdGhlIHNtYWxsIHZlcnNpb25zIGlmIHRoZSB0YXJnZXQgd2FzIG5vdCBkZWZhdWx0ZWQuCi0gICBPdGhlcndpc2Ugd2Ugd29uJ3QgcmVjb2duaXplIHRoZSBub24gZGVmYXVsdCBlbmRpYW5uZXNzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY29mZl9zbWFsbF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuIGNvZmZfb2JqZWN0X3AgKGFiZmQpOwotfQotCi0vKiBTZXQgdGhlIHNlY3Rpb24gYWxpZ25tZW50IGZvciB0aGUgc21hbGwgdmVyc2lvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbWFsbF9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBpZiAoISBjb2ZmX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBtdXN0IGFsaWduIHRvIGF0IGxlYXN0IGEgZm91ciBieXRlIGJvdW5kYXJ5LCBiZWNhdXNlIGxvbmd3b3JkCi0gICAgIGFjY2Vzc2VzIG11c3QgYmUgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotICBpZiAoc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID09IENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUikKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNvcGllZCBmcm9tIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlIHNvIHRoYXQgd2UgY2FuIGNoYW5nZQotICAgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUgPQotewotICBjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfc3ltX2luLCBjb2ZmX3N3YXBfbGluZW5vX2luLAotICBjb2ZmX3N3YXBfYXV4X291dCwgY29mZl9zd2FwX3N5bV9vdXQsCi0gIGNvZmZfc3dhcF9saW5lbm9fb3V0LCBjb2ZmX3N3YXBfcmVsb2Nfb3V0LAotICBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQsIGNvZmZfc3dhcF9hb3V0aGRyX291dCwKLSAgY29mZl9zd2FwX3Njbmhkcl9vdXQsCi0gIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIFNZTUVTWiwgQVVYRVNaLCBSRUxTWiwgTElORVNaLCBGSUxOTUxFTiwKLSNpZmRlZiBDT0ZGX0xPTkdfRklMRU5BTUVTCi0gIHRydWUsCi0jZWxzZQotICBmYWxzZSwKLSNlbmRpZgotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIHRydWUsCi0jZWxzZQotICBmYWxzZSwKLSNlbmRpZgotICAyLAotICBjb2ZmX3N3YXBfZmlsZWhkcl9pbiwgY29mZl9zd2FwX2FvdXRoZHJfaW4sIGNvZmZfc3dhcF9zY25oZHJfaW4sCi0gIGNvZmZfc3dhcF9yZWxvY19pbiwgY29mZl9iYWRfZm9ybWF0X2hvb2ssIGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAotICBjb2ZmX21rb2JqZWN0X2hvb2ssIHN0eXBfdG9fc2VjX2ZsYWdzLCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywKLSAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUsIHN5bW5hbWVfaW5fZGVidWdfaG9vaywgY29mZl9wb2ludGVyaXplX2F1eF9ob29rLAotICBjb2ZmX3ByaW50X2F1eCwgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUsCi0gIGNvZmZfY2xhc3NpZnlfc3ltYm9sLCBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLSAgY29mZl9zdGFydF9maW5hbF9saW5rLCBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24sIGNvZmZfcnR5cGVfdG9faG93dG8sCi0gIGNvZmZfYWRqdXN0X3N5bW5keCwgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLAotICBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biwgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLX07Ci0KLSNkZWZpbmUgY29mZl9zbWFsbF9jbG9zZV9hbmRfY2xlYW51cCBcCi0gIGNvZmZfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgY29mZl9zbWFsbF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBcCi0gIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGxjb2ZmX3NtYWxsX3ZlYzsKLQotY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfc21hbGxfdmVjID0KLXsKLSAgImNvZmYtc2gtc21hbGwiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAotICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX3NtYWxsX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmX3NtYWxsKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgc2hsY29mZl9zbWFsbF92ZWMsCi0gIAotICAoUFRSKSAmYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZQotfTsKLQotY29uc3QgYmZkX3RhcmdldCBzaGxjb2ZmX3NtYWxsX3ZlYyA9Ci17Ci0gICJjb2ZmLXNobC1zbWFsbCIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgZW5kaWFuIHRvbyovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAotICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX3NtYWxsX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LCAgIAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmX3NtYWxsKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgc2hjb2ZmX3NtYWxsX3ZlYywKLSAgCi0gIChQVFIpICZiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvY29mZi1zcGFyYy5jIGIvYmZkL2NvZmYtc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5MTlkYS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgU3BhcmMgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9zcGFyYy5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIEJBRE1BRyh4KSAoKHgpLmZfbWFnaWMgIT0gU1BBUkNNQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBMWU5YQ09GRk1BR0lDKQotCi0vKiBUaGUgcGFnZSBzaXplIGlzIGEgZ3Vlc3MgYmFzZWQgb24gRUxGLiAgKi8KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwMAotCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIFJfU1BBUkNfTk9ORSA9IDAsCi0gICAgUl9TUEFSQ184LAkJUl9TUEFSQ18xNiwJCVJfU1BBUkNfMzIsIAotICAgIFJfU1BBUkNfRElTUDgsCVJfU1BBUkNfRElTUDE2LAkJUl9TUEFSQ19ESVNQMzIsIAotICAgIFJfU1BBUkNfV0RJU1AzMCwJUl9TUEFSQ19XRElTUDIyLAotICAgIFJfU1BBUkNfSEkyMiwJUl9TUEFSQ18yMiwKLSAgICBSX1NQQVJDXzEzLAkJUl9TUEFSQ19MTzEwLAotICAgIFJfU1BBUkNfR09UMTAsCVJfU1BBUkNfR09UMTMsCQlSX1NQQVJDX0dPVDIyLAotICAgIFJfU1BBUkNfUEMxMCwJUl9TUEFSQ19QQzIyLAotICAgIFJfU1BBUkNfV1BMVDMwLAotICAgIFJfU1BBUkNfQ09QWSwKLSAgICBSX1NQQVJDX0dMT0JfREFULAlSX1NQQVJDX0pNUF9TTE9ULAotICAgIFJfU1BBUkNfUkVMQVRJVkUsCi0gICAgUl9TUEFSQ19VQTMyLAotICAgIFJfU1BBUkNfbWF4Ci0gIH07Ci0KLSNpZiAwCi1zdGF0aWMgQ09OU1QgY2hhciAqQ09OU1QgcmVsb2NfdHlwZV9uYW1lc1tdID0KLXsKLSAgIlJfU1BBUkNfTk9ORSIsCi0gICJSX1NQQVJDXzgiLAkJIlJfU1BBUkNfMTYiLAkJIlJfU1BBUkNfMzIiLAotICAiUl9TUEFSQ19ESVNQOCIsCSJSX1NQQVJDX0RJU1AxNiIsCSJSX1NQQVJDX0RJU1AzMiIsCi0gICJSX1NQQVJDX1dESVNQMzAiLAkiUl9TUEFSQ19XRElTUDIyIiwKLSAgIlJfU1BBUkNfSEkyMiIsCSJSX1NQQVJDXzIyIiwKLSAgIlJfU1BBUkNfMTMiLAkJIlJfU1BBUkNfTE8xMCIsCi0gICJSX1NQQVJDX0dPVDEwIiwJIlJfU1BBUkNfR09UMTMiLAkiUl9TUEFSQ19HT1QyMiIsCi0gICJSX1NQQVJDX1BDMTAiLAkiUl9TUEFSQ19QQzIyIiwKLSAgIlJfU1BBUkNfV1BMVDMwIiwKLSAgIlJfU1BBUkNfQ09QWSIsCi0gICJSX1NQQVJDX0dMT0JfREFUIiwJIlJfU1BBUkNfSk1QX1NMT1QiLAotICAiUl9TUEFSQ19SRUxBVElWRSIsCi0gICJSX1NQQVJDX1VBMzIiLAotfTsKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHN0b2xlbiBwcmV0dHkgZGlyZWN0bHkgZnJvbSBlbGYuYy4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfY29mZl9nZW5lcmljX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJCWFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQlvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgY29mZl9zcGFyY19ob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzgsICAgICAgIDAsMCwgOCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfOCIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xNiwgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMzIsICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18zMiIsICAgICAgZmFsc2UsMCwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1A4LCAgIDAsMCwgOCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfRElTUDgiLCAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMTYsICAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0RJU1AxNiIsICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDMyLCAgMCwyLDMyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ESVNQMzIiLCAgZmFsc2UsMCwweDAwZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMzAsIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfV0RJU1AzMCIsIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDIyLCAyLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1dESVNQMjIiLCBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEkyMiwgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ISTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzIyLCAgICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMjIiLCAgICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMywgICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzEzIiwgICAgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE8xMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19MTzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEwLCAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR09UMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMywgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dPVDEzIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMjIsICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HT1QyMiIsICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfUEMxMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzIyLCAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1BDMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV1BMVDMwLCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19XUExUMzAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0NPUFksICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfQ09QWSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HTE9CX0RBVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dMT0JfREFUIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSk1QX1NMT1QsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19KTVBfU0xPVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFTEFUSVZFLDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfUkVMQVRJVkUiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTMyLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1VBMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi19OwotCi1zdHJ1Y3QgY29mZl9yZWxvY19tYXAgewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBjb2ZmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgY29mZl9yZWxvY19tYXAgc3BhcmNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX1NQQVJDX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX1NQQVJDXzE2LCB9LAotICB7IEJGRF9SRUxPQ184LCBSX1NQQVJDXzggfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TUEFSQ19ESVNQOCB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NQQVJDXzMyIH0sIC8qIEBAIEFzc3VtZXMgMzIgYml0cy4gICovCi0gIHsgQkZEX1JFTE9DXzMyLCBSX1NQQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NQQVJDX0RJU1AzMiB9LAotICB7IEJGRF9SRUxPQ19ISTIyLCBSX1NQQVJDX0hJMjIgfSwKLSAgeyBCRkRfUkVMT0NfTE8xMCwgUl9TUEFSQ19MTzEwLCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgUl9TUEFSQ19XRElTUDMwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDMjIsIFJfU1BBUkNfMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMxMywgUl9TUEFSQ18xMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgUl9TUEFSQ19HT1QxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMywgUl9TUEFSQ19HT1QxMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgUl9TUEFSQ19HT1QyMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzEwLCBSX1NQQVJDX1BDMTAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUEMyMiwgUl9TUEFSQ19QQzIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgUl9TUEFSQ19XUExUMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfQ09QWSwgUl9TUEFSQ19DT1BZIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULCBSX1NQQVJDX0dMT0JfREFUIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULCBSX1NQQVJDX0pNUF9TTE9UIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFLCBSX1NQQVJDX1JFTEFUSVZFIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIFJfU1BBUkNfV0RJU1AyMiB9LAotICAvKiAgeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNwYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBjb2ZmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3BhcmNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmNvZmZfc3BhcmNfaG93dG9fdGFibGVbKGludCkgc3BhcmNfcmVsb2NfbWFwW2ldLmNvZmZfcmVsb2NfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cAljb2ZmX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIEJGRF9BU1NFUlQgKGRzdC0+cl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9TUEFSQ19tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmNvZmZfc3BhcmNfaG93dG9fdGFibGVbZHN0LT5yX3R5cGVdOwotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQotCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUCWJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQJYmZkX2hfcHV0XzMyCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgXAotICBjYWNoZV9wdHItPmFkZGVuZCA9IHJlbG9jLnJfb2Zmc2V0OwotCi0vKiBDbGVhciB0aGUgcl9zcGFyZSBmaWVsZCBpbiByZWxvY3MuICAqLwotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHNyYyxkc3QpIFwKLSAgZG8geyBcCi0gICAgICAgZHN0LT5yX3NwYXJlWzBdID0gMDsgXAotICAgICAgIGRzdC0+cl9zcGFyZVsxXSA9IDA7IFwKLSAgICAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogRW5hYmxlIFNwYXJjLXNwZWNpZmljIGhhY2tzIGluIGNvZmZjb2RlLmguICovCi0KLSNkZWZpbmUgQ09GRl9TUEFSQwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI2lmbmRlZiBUQVJHRVRfU1lNCi0jZGVmaW5lIFRBUkdFVF9TWU0gc3BhcmNjb2ZmX3ZlYwotI2VuZGlmCi0KLSNpZm5kZWYgVEFSR0VUX05BTUUKLSNkZWZpbmUgVEFSR0VUX05BTUUgImNvZmYtc3BhcmMiCi0jZW5kaWYKLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9TWU0sIFRBUkdFVF9OQU1FLCBEX1BBR0VELCAwLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi1zdGdvMzIuYyBiL2JmZC9jb2ZmLXN0Z28zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRiYTQwLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXN0Z28zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IENPRkYgZmlsZXMgKGdvMzIgdmFyaWFudCB3aXRoIGEgc3R1YikuCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUm9iZXJ0IEhvZWhuZS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaGFuZGxlcyBub3cgYWxzbyBzdHViYmVkIGNvZmYgaW1hZ2VzLiBUaGUgc3R1YiBpcyBhIHNtYWxsCi0gICBET1MgZXhlY3V0YWJsZSBwcm9ncmFtIGJlZm9yZSB0aGUgY29mZiBpbWFnZSB0byBsb2FkIGl0IGluIG1lbW9yeQotICAgYW5kIGV4ZWN1dGUgaXQuIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIERPUyBjYW5ub3QgcnVuIGNvZmYgZmlsZXMuCi0KLSAgIEFsbCB0aGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zCi0gICBmcm9tIGNvZmZzd2FwLmguCi0gICBUaGUgb25seSB0aGluZyB3aGF0IHRoZXkgZG8gaXMgdG8gYWRqdXN0IHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4KLSAgIHRoZSBDT0ZGIGZpbGUgd2hpY2ggYXJlIG9mZnNldCBpbnRvIHRoZSBmaWxlLgotICAgVGhpcyBpcyBuZWVkZWQsIGJlY2F1c2UgREpHUFAgdXNlcyBhIHZlcnkgc3BlY2lhbCB3YXkgdG8gbG9hZCBhbmQgcnVuCi0gICB0aGUgY29mZiBpbWFnZS4gSXQgbG9hZHMgdGhlIGltYWdlIGluIG1lbW9yeSBhbmQgYXNzdW1lcyB0aGVuLCB0aGF0IHRoZQotICAgaW1hZ2UgaGFkIG5vIHN0dWIgYnkgdXNpbmcgdGhlIGZpbGVwb2ludGVycyBhcyBwb2ludGVycyBpbiB0aGUgY29mZgotICAgaW1hZ2UgYW5kIE5PVCBpbiB0aGUgZmlsZS4KLQotICAgVG8gYmUgY29tcGF0aWJsZSB3aXRoIGFueSBleGlzdGluZyBleGVjdXRhYmxlcyBJIGhhdmUgZml4ZWQgdGhpcwotICAgaGVyZSBhbmQgTk9UIGluIHRoZSBESkdQUCBzdGFydHVwIGNvZGUuCi0gKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCQlnbzMyc3R1YmJlZGNvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCQkiY29mZi1nbzMyLWV4ZSIKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUJJ18nCi0jZGVmaW5lIENPRkZfR08zMl9FWEUKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSNkZWZpbmUgQ09GRl9TVVBQT1JUX0dOVV9MSU5LT05DRQotCi0jZGVmaW5lIENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi50ZXh0IiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCA0IH0KLQotI2luY2x1ZGUgImJmZC5oIgotCi0vKiBBdCBmaXJzdCB0aGUgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfaW5fcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgc3JjLCBQVFIgZHN0KSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3ByZSBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW4sIFBUUiBvdXQpKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9vdXRfcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW4sIFBUUiBvdXQpKTsKLQotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfaW5fcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgZXh0LCBQVFIgaW4pKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9vdXRfcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW4sIFBUUiBvdXQpKTsKLQotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfaW5fcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgZXh0MSwgaW50IHR5cGUsIGludCBjbGFzcywgaW50IGluZHgsCi0JCQkgICAgaW50IG51bWF1eCwgUFRSIGluMSkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfb3V0X3ByZSBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW5wLCBpbnQgdHlwZSwgaW50IGNsYXNzLCBpbnQgaW5keCwKLQkJCSAgICBpbnQgbnVtYXV4LCBQVFIgZXh0cCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGlucCwgaW50IHR5cGUsIGludCBjbGFzcywgaW50IGluZHgsCi0JCQkgICAgIGludCBudW1hdXgsIFBUUiBleHRwKSk7Ci0KLXN0YXRpYyB2b2lkCi1jcmVhdGVfZ28zMl9zdHViIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLQotLyoKLSAgIEFsbCB0aGF0IC4uLl9QUkUgYW5kIC4uLlBPU1QgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZwotICAgY29mZl9zd2FwLi4uIGZ1bmN0aW9ucy4gVGhlIC4uLlBSRSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nCi0gICBvZiB0aGUgZnVuY3Rpb24gYW5kIHRoZSAuLi5QT1NUIGZ1bmN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBzd2FwIHJvdXRpbmVzLgotICovCi0KLSNkZWZpbmUgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QT1NUIGFkanVzdF9maWxlaGRyX2luX3Bvc3QKLSNkZWZpbmUgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUFJFIGFkanVzdF9maWxlaGRyX291dF9wcmUKLSNkZWZpbmUgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVCBhZGp1c3RfZmlsZWhkcl9vdXRfcG9zdAotCi0jZGVmaW5lIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QT1NUIGFkanVzdF9zY25oZHJfaW5fcG9zdAotI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRSBhZGp1c3Rfc2NuaGRyX291dF9wcmUKLSNkZWZpbmUgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUIGFkanVzdF9zY25oZHJfb3V0X3Bvc3QKLQotI2RlZmluZSBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVCBhZGp1c3RfYXV4X2luX3Bvc3QKLSNkZWZpbmUgQ09GRl9BREpVU1RfQVVYX09VVF9QUkUgYWRqdXN0X2F1eF9vdXRfcHJlCi0jZGVmaW5lIENPRkZfQURKVVNUX0FVWF9PVVRfUE9TVCBhZGp1c3RfYXV4X291dF9wb3N0Ci0KLXN0YXRpYyBib29sZWFuCi0gIGdvMzJfc3R1YmJlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICogaWJmZCwgYmZkICogb2JmZCkpOwotCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBnbzMyX3N0dWJiZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKLQotLyogSSBob2xkIGluIHRoZSB1c3JkYXRhIHRoZSBzdHViICovCi0jZGVmaW5lIGJmZF9jb2ZmX2dvMzJzdHViIGJmZF91c3JkYXRhCi0KLS8qIFRoaXMgbWFjcm8gaXMgdXNlZCwgYmVjYXVzZSBJIGNhbm5vdCBhc3N1bWUgdGhlIGVuZGlhbmVzcyBvZiB0aGUKLSAgIGhvc3Qgc3lzdGVtICovCi0jZGVmaW5lIF9IKGluZGV4KSAoYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKShoZWFkZXIraW5kZXgqMikpKQotCi0vKiBUaGVzZSBieXRlcyBhcmUgYSAyMDQ4LWJ5dGUgRE9TIGV4ZWN1dGFibGUsIHdoaWNoIGxvYWRzIHRoZSBDT0ZGCi0gICBpbWFnZSBpbnRvIG1lbW9yeSBhbmQgdGhlbiBydW5zIGl0LiBJdCBpcyBjYWxsZWQgJ3N0dWInICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN0dWJfYnl0ZXNbU1RVQlNJWkVdID0KLXsKLSNpbmNsdWRlICJnbzMyc3R1Yi5oIgotfTsKLQotLyoKLSAgIEkgaGF2ZSBub3QgY29tbWVudGVkIGVhY2ggc3dhcCBmdW5jdGlvbiBiZWxvdywgYmVjYXVzZSB0aGUKLSAgIHRlY2huaXF1ZSBpcyBpbiBhbnkgZnVuY3Rpb24gdGhlIHNhbWUuIEZvciB0aGUgLi4uaW4gZnVuY3Rpb24sCi0gICBhbGwgdGhlIHBvaW50ZXJzIGFyZSBhZGp1c3RlZCBieSBhZGRpbmcgU1RVQlNJWkUgYW5kIGZvciB0aGUKLSAgIC4uLm91dCBmdW5jdGlvbiwgaXQgaXMgc3VidHJhY3RlZCBmaXJzdCBhbmQgYWZ0ZXIgY2FsbGluZyB0aGUKLSAgIHN0YW5kYXJkIHN3YXAgZnVuY3Rpb24gaXQgaXMgcmVzZXQgdG8gdGhlIG9sZCB2YWx1ZSAqLwotCi0vKiBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGFkanVzdGluZyB0aGUgZmlsZXBvaW50ZXJzLCB3aGljaAotICAgaXMgZG9uZSBvbmx5LCBpZiB0aGUgcG9pbnRlciBpcyBub256ZXJvICovCi0KLSNkZWZpbmUgQURKVVNUX1ZBTCh2YWwsZGlmZikgXAotICBpZiAodmFsICE9IDApIHZhbCArPSBkaWZmCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9pbl9wb3N0ICAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgRklMSERSICpmaWxlaGRyX3NyYyA9IChGSUxIRFIgKikgc3JjOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9kc3QgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZHN0OwotCi0gIEFESlVTVF9WQUwgKGZpbGVoZHJfZHN0LT5mX3N5bXB0ciwgU1RVQlNJWkUpOwotCi0gIC8qIFNhdmUgbm93IHRoZSBzdHViIHRvIGJlIHVzZWQgbGF0ZXIgKi8KLSAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBTVFVCU0laRSk7Ci0KLSAgLyogU2luY2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vIHN0YXR1cywgSSBkbyBub3Qgc2V0IGhlcmUKLSAgICAgYW55IGJmZF9lcnJvcl8uLi4KLSAgICAgVGhhdCBtZWFucywgYmVmb3JlIHRoZSB1c2Ugb2YgYmZkX2NvZmZfZ28zMnN0dWIgKCksIHRoaXMgdmFsdWUKLSAgICAgc2hvdWxkIGJlIGNoZWNrZWQgaWYgaXQgaXMgIT0gTlVMTCAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBtZW1jcHkgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgZmlsZWhkcl9zcmMtPnN0dWIsIFNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX291dF9wcmUgIChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgaW47Ci0gIEZJTEhEUiAqZmlsZWhkcl9vdXQgPSAoRklMSERSICopIG91dDsKLQotICAvKiBHZW5lcmF0ZSB0aGUgc3R1YiAqLwotICBjcmVhdGVfZ28zMl9zdHViIChhYmZkKTsKLQotICAvKiBDb3B5IHRoZSBzdHViIHRvIHRoZSBmaWxlIGhlYWRlciAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpICE9IE5VTEwpCi0gICAgbWVtY3B5IChmaWxlaGRyX291dC0+c3R1YiwgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpLCBTVFVCU0laRSk7Ci0gIGVsc2UKLSAgICAvKiB1c2UgdGhlIGRlZmF1bHQgKi8KLSAgICBtZW1jcHkgKGZpbGVoZHJfb3V0LT5zdHViLCBzdHViX2J5dGVzLCBTVFVCU0laRSk7Ci0KLSAgQURKVVNUX1ZBTCAoZmlsZWhkcl9pbi0+Zl9zeW1wdHIsIC1TVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9vdXRfcG9zdCAgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW47Ci0gICAgIFBUUiBvdXQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgaW47Ci0gIC8qIHVuZG8gdGhlIGFib3ZlIGNoYW5nZSAqLwotICBBREpVU1RfVkFMIChmaWxlaGRyX2luLT5mX3N5bXB0ciwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9pbl9wb3N0ICAoYWJmZCwgZXh0LCBpbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBleHQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGluOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19zY25wdHIsIFNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19yZWxwdHIsIFNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19sbm5vcHRyLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX291dF9wcmUgIChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGluOwotICAgICBQVFIgb3V0IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKLQotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3NjbnB0ciwgLVNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19yZWxwdHIsIC1TVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwgLVNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3Bvc3QgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW47Ci0gICAgIFBUUiBvdXQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfc2NucHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9pbl9wb3N0ICAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGV4dDEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBjbGFzczsKLSAgICAgaW50IGluZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW4xOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbjE7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgU1RVQlNJWkUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9hdXhfb3V0X3ByZSAgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbnA7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgY2xhc3M7Ci0gICAgIGludCBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBudW1hdXggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGV4dHAgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikgaW5wOwotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIEFESlVTVF9WQUwgKGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIC1TVFVCU0laRSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9vdXRfcG9zdCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGlucDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBjbGFzczsKLSAgICAgaW50IGluZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZXh0cCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbnA7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgU1RVQlNJWkUpOwotICAgIH0KLX0KLQotLyoKLSAgIFRoYXQncyB0aGUgZnVuY3Rpb24sIHdoaWNoIGNyZWF0ZXMgdGhlIHN0dWIuIFRoZXJlIGFyZQotICAgZGlmZmVyZW50IGNhc2VzIGZyb20gd2hlcmUgdGhlIHN0dWIgaXMgdGFrZW4uCi0gICBBdCBmaXJzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChHTzMyU1RVQikgaXMgY2hlY2tlZCBhbmQgdGhlbgotICAgJChTVFVCKSBpZiBpdCB3YXMgbm90IHNldC4KLSAgIElmIGl0IGV4aXN0cyBhbmQgcG9pbnRzIHRvIGEgdmFsaWQgc3R1YiB0aGUgc3R1YiBpcyB0YWtlbiBmcm9tCi0gICB0aGF0IGZpbGUuIFRoaXMgZmlsZSBjYW4gYmUgYWxzbyBhIHdob2xlIGV4ZWN1dGFibGUgZmlsZSwgYmVjYXVzZQotICAgdGhlIHN0dWIgaXMgY29tcHV0ZWQgZnJvbSB0aGUgZXhlIGluZm9ybWF0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGF0Ci0gICBmaWxlLgotCi0gICBJZiB0aGVyZSB3YXMgYW55IGVycm9yLCB0aGUgc3RhbmRhcmQgc3R1YiAoY29tcGlsZWQgaW4gdGhpcyBmaWxlKQotICAgaXMgdGFrZW4uCi0gKi8KLQotc3RhdGljIHZvaWQKLWNyZWF0ZV9nbzMyX3N0dWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogRG8gaXQgb25seSBvbmNlICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzdHViOwotICAgICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgICBpbnQgZjsKLSAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyWzEwXTsKLSAgICAgIGNoYXIgbWFnaWNbOF07Ci0gICAgICB1bnNpZ25lZCBsb25nIGNvZmZfc3RhcnQsIGV4ZV9zdGFydDsKLQotICAgICAgLyogQ2hlY2sgYXQgZmlyc3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICQoR08zMlNUVUIpICovCi0gICAgICBzdHViID0gZ2V0ZW52ICgiR08zMlNUVUIiKTsKLSAgICAgIC8qIE5vdyBjaGVjayB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChTVFVCKSAqLwotICAgICAgaWYgKHN0dWIgPT0gTlVMTCkKLQlzdHViID0gZ2V0ZW52ICgiU1RVQiIpOwotICAgICAgaWYgKHN0dWIgPT0gTlVMTCkKLQlnb3RvIHN0dWJfZW5kOwotICAgICAgaWYgKHN0YXQgKHN0dWIsICZzdCkgIT0gMCkKLQlnb3RvIHN0dWJfZW5kOwotI2lmZGVmIE9fQklOQVJZCi0gICAgICBmID0gb3BlbiAoc3R1YiwgT19SRE9OTFkgfCBPX0JJTkFSWSk7Ci0jZWxzZQotICAgICAgZiA9IG9wZW4gKHN0dWIsIE9fUkRPTkxZKTsKLSNlbmRpZgotICAgICAgaWYgKGYgPCAwKQotCWdvdG8gc3R1Yl9lbmQ7Ci0gICAgICBpZiAocmVhZCAoZiwgJmhlYWRlciwgc2l6ZW9mIChoZWFkZXIpKSA8IDApCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBpZiAoX0ggKDApICE9IDB4NWE0ZCkJLyogaXQgaXMgbm90IGFuIGV4ZSBmaWxlICovCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzdHViIChpdCBpcyBldmVyeSB0aGluZyB1cAotICAgICAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29mZiBpbWFnZSkgKi8KLSAgICAgIGNvZmZfc3RhcnQgPSAobG9uZykgX0ggKDIpICogNTEyTDsKLSAgICAgIGlmIChfSCAoMSkpCi0JY29mZl9zdGFydCArPSAobG9uZykgX0ggKDEpIC0gNTEyTDsKLQotICAgICAgLyogQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgYSBmaXhlZCBzdHViIHNpemUgb2YgMjA0OCBieXRlcwotICAgICAgICAgc3VwcG9ydGVkICovCi0gICAgICBpZiAoY29mZl9zdGFydCAhPSAyMDQ4KQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgZXhlX3N0YXJ0ID0gX0ggKDQpICogMTY7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGxzZWVrIChmLCBleGVfc3RhcnQsIFNFRUtfU0VUKSAhPSBleGVfc3RhcnQpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBpZiAocmVhZCAoZiwgJm1hZ2ljLCA4KSAhPSA4KQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgaWYgKG1lbWNtcCAobWFnaWMsICJnbzMyc3R1YiIsIDgpICE9IDApCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICAvKiBOb3cgd2UgZm91bmQgYSBjb3JyZWN0IHN0dWIgKGhvcGVmdWxseSkgKi8KLSAgICAgIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgY29mZl9zdGFydCk7Ci0gICAgICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxzZWVrIChmLCAwTCwgU0VFS19TRVQpOwotICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSByZWFkIChmLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIGNvZmZfc3RhcnQpCi0JICAhPSBjb2ZmX3N0YXJ0KQotCXsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkpOwotCSAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gTlVMTDsKLQl9Ci0gICAgICBjbG9zZSAoZik7Ci0gICAgfQotc3R1Yl9lbmQ6Ci0gIC8qIFRoZXJlIHdhcyBzb21ldGhpbmcgd3JvbmcgYWJvdmUsIHNvIHVzZSBub3cgdGhlIHN0YW5kYXJkIGJ1aWx0aW4KLSAgICAgc3R1YiAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBTVFVCU0laRSk7Ci0gICAgICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0JewotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIHN0dWJfYnl0ZXMsIFNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLS8qIElmIGliZmQgd2FzIGEgc3R1YmJlZCBjb2ZmIGltYWdlLCBjb3B5IHRoZSBzdHViIGZyb20gdGhhdCBiZmQKLSAgIHRvIHRoZSBuZXcgb2JmZC4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICAvKiBjaGVjayBpZiBib3RoIGFyZSB0aGUgc2FtZSB0YXJnZXRzICovCi0gIGlmIChpYmZkLT54dmVjICE9IG9iZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogY2hlY2sgaWYgYm90aCBoYXZlIGEgdmFsaWQgc3R1YiAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGliZmQpID09IE5VTEwKLSAgICAgIHx8IGJmZF9jb2ZmX2dvMzJzdHViIChvYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE5vdyBjb3B5IHRoZSBzdHViICovCi0gIG1lbWNweSAoYmZkX2NvZmZfZ28zMnN0dWIgKG9iZmQpLCBiZmRfY29mZl9nbzMyc3R1YiAoaWJmZCksIFNUVUJTSVpFKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXN2bTY4ay5jIGIvYmZkL2NvZmYtc3ZtNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmE1YTcuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtc3ZtNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xhIHN5c3Y2OAotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCW02OGtzeXN2Y29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay1zeXN2IgotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi10aWMzMC5jIGIvYmZkL2NvZmYtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3MWY3Ni4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgVE1TMzIwQzMwIGNvZmYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImNvZmYvdGljMzAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLQotcmVsb2NfaG93dG9fdHlwZSB0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9USUMzMF9BQlMxNiwgMiwgMSwgMTYsIGZhbHNlLCAwLCAwLCBOVUxMLAotCSAiMTYiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9BQlMyNCwgMiwgMiwgMjQsIGZhbHNlLCA4LCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIjI0IiwgZmFsc2UsIDB4RkZGRkZGMDAsIDB4RkZGRkZGMDAsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVElDMzBfTERQLCAxOCwgMCwgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIkxEUCIsIGZhbHNlLCAweDAwRkYwMDAwLCAweDAwMDAwMEZGLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX0FCUzMyLCAyLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiMzIiLCBmYWxzZSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9QQzE2LCAyLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBOVUxMLAotCSAiUENSRUwiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICBFTVBUWV9IT1dUTyAoLTEpCi19OwotCi0jaWZuZGVmIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHRpYzMwX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogRm9yIHRoZSBjYXNlIHN0YXRlbWVudCB1c2UgdGhlIGNvZGUgdmFsdWVzIHVzZWQgaW4gdGNfZ2VuX3JlbG9jIHRvCi0gICBtYXAgdG8gdGhlIGhvd3RvIHRhYmxlIGVudHJpZXMgdGhhdCBtYXRjaCB0aG9zZSBpbiBib3RoIHRoZSBhb3V0Ci0gICBhbmQgY29mZiBpbXBsZW1lbnRhdGlvbnMuICovCi1yZWxvY19ob3d0b190eXBlICoKLXRpYzMwX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgIGNhc2UgQkZEX1JFTE9DX1RJQzMwX0xEUDoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVsyXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVswXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNDoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVsxXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVs0XTsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIHJldHVybiAmdGljMzBfY29mZl9ob3d0b190YWJsZVszXTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotCi0jZW5kaWYKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludAotY29mZl90aWMzMF9zZWxlY3RfcmVsb2MgKGhvd3RvKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuIGhvd3RvLT50eXBlOwotfQotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB4LnJfdHlwZSA9IGNvZmZfdGljMzBfc2VsZWN0X3JlbG9jKGhvd3RvKQotCi0KLSNkZWZpbmUgQkFETUFHKHgpIFRJQzMwQkFETUFHKHgpCi0jZGVmaW5lIFRJQzMwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0vKiBDb2RlIHRvIHR1cm4gYSByX3R5cGUgaW50byBhIGhvd3RvIHB0ciwgdXNlcyB0aGUgYWJvdmUgaG93dG8gdGFibGUuICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoaW50ZXJuYWwsIGRzdCkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBzd2l0Y2ggKGRzdC0+cl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfVElDMzBfQUJTMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVswXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9USUMzMF9BQlMyNDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX0FCUzMyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbM107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVElDMzBfTERQOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMl07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVElDMzBfUEMxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzRdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAocmVsb2MtPnJfc3ltbmR4ID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldCB0aWMzMF9jb2ZmX3ZlYyA9Ci17Ci0gICJjb2ZmLXRpYzMwIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi10aWM4MC5jIGIvYmZkL2NvZmYtdGljODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhZGUzMy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzgwIE11bHRpbWVkaWEgVmlkZW8gUHJvY2Vzc29yIChNVlApLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkKLQotICAgVGhlcmUgaXMgbm90aGluZyBuZXcgdW5kZXIgdGhlIHN1bi4gVGhpcyBmaWxlIGRyYXdzIGEgbG90IG9uIG90aGVyCi0gICBjb2ZmIGZpbGVzLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvdGljODAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLSNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAxCi0jZGVmaW5lIENPRkZfQUxJR05fSU5fU0ZMQUdTIDEKLQotI2RlZmluZSBHRVRfU0NOSERSX0ZMQUdTIGJmZF9oX2dldF8xNgotI2RlZmluZSBQVVRfU0NOSERSX0ZMQUdTIGJmZF9oX3B1dF8xNgotCi1zdGF0aWMgdm9pZCBydHlwZTJob3d0bwotICBQQVJBTVMgKChhcmVsZW50ICpjYWNoZV9wdHIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0KSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwYmFzZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ2xvYjE1X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBnbG9iMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGxvY2FsMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHRpYzgwX2hvd3RvX3RhYmxlW10gPQotewotCi0gIEhPV1RPIChSX1JFTExPTkcsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxMT05HIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01QUENSLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTVBQQ1IiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQUJTLAkJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkFCUyIsCQkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQQkFTRSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBiYXNlX3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQQkFTRSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExCQVNFLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGJhc2VfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMQkFTRSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE1VywJCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTVILAkJCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFAxNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1VywJCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTDE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMMTZCLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTDE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTjE1VyIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTVIIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTjE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNkIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1VyIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTE4xNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTE4xNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTE4xNkIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpCQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIFNwZWNpYWwgcmVsb2NhdGlvbiBmdW5jdGlvbnMsIHVzZWQgd2hlbiB0aGUgb3V0cHV0IGZpbGUgaXMgbm90Ci0gICBpdHNlbGYgYSBDT0ZGIFRJYzgwIGZpbGUuICAqLwotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGJhc2UgYWRkcmVzcyB0eXBlCi0gICByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwYmFzZV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGdsb2JhbCAxNSBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1nbG9iMTVfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBnbG9iYWwgMTYgYml0IHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZ2xvYjE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2xfaW4gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgbG9jYWwgMTYgYml0IHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbG9jYWwxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotDAotLyogQ29kZSB0byB0dXJuIGFuIGV4dGVybmFsIHJfdHlwZSBpbnRvIGEgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgaG93dG9fdGFibGUuCi0gICBJZiBwYXNzZWQgYW4gcl90eXBlIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgYWJvcnQgcmF0aGVyIHRoYW4gc2lsZW50bHkgZmFpbGluZwotICAgdG8gZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUuICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdGljODBfaG93dG9fdGFibGUgLyBzaXplb2YgdGljODBfaG93dG9fdGFibGVbMF07IGkrKykKLSAgICB7Ci0gICAgICBpZiAodGljODBfaG93dG9fdGFibGVbaV0udHlwZSA9PSBkc3QtPnJfdHlwZSkKLQl7Ci0JICBjYWNoZV9wdHItPmhvd3RvID0gdGljODBfaG93dG9fdGFibGUgKyBpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbnJlY29nbml6ZWQgcmVsb2MgdHlwZSAweCV4IiksCi0JCQkgKHVuc2lnbmVkIGludCkgZHN0LT5yX3R5cGUpOwotICBjYWNoZV9wdHItPmhvd3RvID0gdGljODBfaG93dG9fdGFibGUgKyAwOwotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl90aWM4MF9ydHlwZV90b19ob3d0bwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX3RpYzgwX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCBnZW5yZWw7Ci0KLSAgaWYgKHJlbCAtPiByX3N5bW5keCA9PSAtMSAmJiBhZGRlbmRwICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFRJICJpbnRlcm5hbCByZWxvY2F0aW9uIiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVsb2NhdGlvbgotCSBhbW91bnQgaXMgdGhlIGFtb3VudCBieSB3aGljaCB0aGUgY3VycmVudCBzZWN0aW9uIGlzIGJlaW5nIHJlbG9jYXRlZAotCSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICovCi0gICAgICAqYWRkZW5kcCA9IChzZWMgLT4gb3V0cHV0X3NlY3Rpb24gLT4gdm1hICsgc2VjIC0+IG91dHB1dF9vZmZzZXQpIC0gc2VjIC0+IHZtYTsKLSAgICB9Ci0gIFJUWVBFMkhPV1RPICgmZ2VucmVsLCByZWwpOwotICByZXR1cm4gZ2VucmVsLmhvd3RvOwotfQotCi0jaWZuZGVmIEJBRE1BRwotI2RlZmluZSBCQURNQUcoeCkgVElDODBCQURNQUcoeCkKLSNlbmRpZgotDAotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdlIG5lZWQgYSBzcGVjaWFsIHJlbG9jYXRpb24gcm91dGluZSB0byBoYW5kbGUgdGhlIFBQIHJlbG9jcy4gIE1vc3QKLSAgIG9mIHRoaXMgaXMgYSBjb3B5IG9mIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsCi0JCQkgICAgIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF92bWEgYWRkcjsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIENPRkYgdHJlYXRzIGNvbW1vbiBzeW1ib2xzIGluIG9uZSBvZiB0d28gd2F5cy4gIEVpdGhlciB0aGUKLSAgICAgICAgIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgb3IgaXQKLSAgICAgICAgIGlzIG5vdC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzaXplIGlzIG5vdCBpbmNsdWRlZCwgYW5kIGZvcmNlCi0gICAgICAgICB0aGUgcnR5cGVfdG9faG93dG8gZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBhZGRlbmQgYXMgbmVlZGVkLiAgKi8KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLSAgICAgIGhvd3RvID0gYmZkX2NvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAotCQkJCSAgICAgICBzeW0sICZhZGRlbmQpOwotICAgICAgaWYgKGhvd3RvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKG91dHB1dF9iZmQpKQotCQl2YWwgLT0gc2VjLT52bWE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgYWRkciA9IHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgLyogRklYTUU6IFRoaXMgY29kZSBhc3N1bWVzIGxpdHRsZSBlbmRpYW4sIGJ1dCB0aGUgUFAgY2FuCi0gICAgICAgICBhcHBhcmVudGx5IGJlIGJpLWVuZGlhbi4gIEkgZG9uJ3Qga25vdyBpZiB0aGUgYmktZW5kaWFubmVzcwotICAgICAgICAgYXBwbGllcyB0byB0aGUgaW5zdHJ1Y3Rpb24gc2V0IG9yIGp1c3QgdG8gdGhlIGRhdGEuICAqLwotICAgICAgc3dpdGNoIChob3d0by0+dHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIFJfQUJTOgotCWNhc2UgUl9SRUxMT05HWDoKLQljYXNlIFJfUFBMMTU6Ci0JY2FzZSBSX1BQTDE1VzoKLQljYXNlIFJfUFBMMTVIOgotCWNhc2UgUl9QUExOMTU6Ci0JY2FzZSBSX1BQTE4xNVc6Ci0JY2FzZSBSX1BQTE4xNUg6Ci0JICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLCBhZGRyLCB2YWwsIGFkZGVuZCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QUDE1OgotCWNhc2UgUl9QUDE1VzoKLQljYXNlIFJfUFAxNUg6Ci0JY2FzZSBSX1BQTjE1OgotCWNhc2UgUl9QUE4xNVc6Ci0JY2FzZSBSX1BQTjE1SDoKLQkgIC8qIE9mZnNldCB0aGUgYWRkcmVzcyBzbyB0aGF0IHdlIGNhbiB1c2UgNCBieXRlIHJlbG9jYXRpb25zLiAgKi8KLQkgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMgKyAyLCBhZGRyLCB2YWwsIGFkZGVuZCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QUDE2QjoKLQljYXNlIFJfUFBOMTZCOgotCSAgewotCSAgICAvKiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgc3RvcmVkIGluIGJpdCA2LiAgKi8KLQkgICAgYmZkX2J5dGUgaG9sZDsKLQotCSAgICBob2xkID0gY29udGVudHNbYWRkciArIDRdOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gJj1+IDB4MjA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyA0XSB8PSAoY29udGVudHNbYWRkcl0gPj4gMSkgJiAweDIwOwotCSAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMgKyAyLCBhZGRyLAotCQkJCQkgICAgICB2YWwsIGFkZGVuZCk7Ci0JICAgIGNvbnRlbnRzW2FkZHJdICY9fiAweDQwOwotCSAgICBjb250ZW50c1thZGRyXSB8PSAoY29udGVudHNbYWRkciArIDRdIDw8IDEpICYgMHg0MDsKLQkgICAgY29udGVudHNbYWRkciArIDRdICY9fiAweDIwOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gfD0gaG9sZCAmIDB4MjA7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBSX1BQTDE2QjoKLQljYXNlIFJfUFBMTjE2QjoKLQkgIHsKLQkgICAgLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHN0b3JlZCBpbiBiaXQgMjguICAqLwotCSAgICBiZmRfYnl0ZSBob2xkOwotCi0JICAgIGhvbGQgPSBjb250ZW50c1thZGRyICsgMV07Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSAmPX4gMHg4MDsKLQkgICAgY29udGVudHNbYWRkciArIDFdIHw9IChjb250ZW50c1thZGRyICsgM10gPDwgMykgJiAweDgwOwotCSAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMsIGFkZHIsCi0JCQkJCSAgICAgIHZhbCwgYWRkZW5kKTsKLQkgICAgY29udGVudHNbYWRkciArIDNdICY9IH4weDEwOwotCSAgICBjb250ZW50c1thZGRyICsgM10gfD0gKGNvbnRlbnRzW2FkZHIgKyAxXSA+PiAzKSAmIDB4MTA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSAmPX4gMHg4MDsKLQkgICAgY29udGVudHNbYWRkciArIDFdIHw9IGhvbGQgJiAweDgwOwotCSAgICBicmVhazsKLQkgIH0KLQkKLQljYXNlIFJfUFBCQVNFOgotCSAgLyogUGFyYW1ldGVyIFJBTSBpcyBmcm9tIDB4MTAwMDAwMCB0byAweDEwMDA4MDAuICAqLwotCSAgY29udGVudHNbYWRkcl0gJj1+IDB4MzsKLQkgIGlmICh2YWwgPj0gMHgxMDAwMDAwICYmIHZhbCA8IDB4MTAwMDgwMCkKLQkgICAgY29udGVudHNbYWRkcl0gfD0gMHgzOwotCSAgZWxzZQotCSAgICBjb250ZW50c1thZGRyXSB8PSAweDI7Ci0JICByc3RhdCA9IGJmZF9yZWxvY19vazsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQTEJBU0U6Ci0JICAvKiBQYXJhbWV0ZXIgUkFNIGlzIGZyb20gMHgxMDAwMDAwIHRvIDB4MTAwMDgwMC4gICovCi0JICBjb250ZW50c1thZGRyICsgMl0gJj0gfjB4YzA7Ci0JICBpZiAodmFsID49IDB4MTAwMDAwMCAmJiB2YWwgPCAweDEwMDA4MDApCi0JICAgIGNvbnRlbnRzW2FkZHIgKyAyXSB8PSAweGMwOwotCSAgZWxzZQotCSAgICBjb250ZW50c1thZGRyICsgMl0gfD0gMHg4MDsKLQkgIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkciwKLQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotI2RlZmluZSBUSUM4MENPRkYgMQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSN1bmRlZiBDX0FVVE9BUkcJCS8qIENsYXNoZXMgd2l0aCBUSWM4MCdzIENfVUVYVCAqLwotI3VuZGVmIENfTEFTVEVOVAkJLyogQ2xhc2hlcyB3aXRoIFRJYzgwJ3MgQ19TVEFUTEFCICovCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMgKHRpYzgwY29mZl92ZWMsICJjb2ZmLXRpYzgwIiwgRF9QQUdFRCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtdTY4ay5jIGIvYmZkL2NvZmYtdTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2VhNzNmLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXU2OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgNjgwMDAgQ09GRiBiaW5hcmllcyBoYXZpbmcgdW5kZXJzY29yZSB3aXRoIG5hbWUuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCW02OGtjb2ZmdW5fdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstdW4iCi0KLSNkZWZpbmUgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0KLS8qIGRlZmluZSB0aGlzIHRvIG5vdCBoYXZlIG11bHRpcGxlIGNvcHkgb2YgbTY4a19ydHlwZTJob3d0bwotICAgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZSAqLwotI2RlZmluZSBPTkxZX0RFQ0xBUkVfUkVMT0NTCi0KLS8qIFRoaXMgbWFnaWMgbnVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lcyBoYXZlIHVuZGVyc2NvcmVzLgotICAgT3RoZXIgNjhrIG1hZ2ljIG51bWJlcnMgaW5kaWNhdGUgdGhhdCB0aGUgbmFtZXMgZG8gbm90IGhhdmUKLSAgIHVuZGVyc2NvcmVzLiAgKi8KLSNkZWZpbmUgQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBNQzY4S0JDU01BR0lDKQotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi13NjUuYyBiL2JmZC9jb2ZmLXc2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzc5YmZiLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXc2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgV0RDIDY1ODE2IENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi93NjUuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9XNjVfQUJTOCwgICAgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9BQlMxNiwgICAxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTMjQsICAgMCwgIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJhYnMyNCIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzhTOCwgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI+YWJzOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzhTMTYsIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJeYWJzOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzE2UzgsIDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiPmFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTMTZTMTYsMSwgIDAsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJeYWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9QQ1I4LCAgICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicGNyZWw4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX1c2NV9QQ1IxNiwgICAxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInBjcmVsMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKFJfVzY1X0RQLCAgICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiZHAiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0KLX07Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgXAotICB7IHgucl90eXBlID0gc2VsZWN0X3JlbG9jKGhvd3RvKTsgfQotCi0jZGVmaW5lIEJBRE1BRyh4KSAoVzY1QkFETUFHKHgpKQotI2RlZmluZSBXNjUgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAotICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLSAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0KLXN0YXRpYyBpbnQKLXNlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGUgOwotfQotCi0vKiBDb2RlIHRvIHR1cm4gYSByX3R5cGUgaW50byBhIGhvd3RvIHB0ciwgdXNlcyB0aGUgYWJvdmUgaG93dG8gdGFibGUKLSAgICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoaW50ZXJuYWwsIGRzdCkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyBkc3QtPnJfdHlwZSAtIDE7Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqIHJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKCgoaW50KSByZWxvYy0+cl9zeW1uZHgpID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikmKGJmZF9hYnNfc3ltYm9sKTsKLSAgICB9Ci0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotCi0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci0gIC8qICByZWxlbnQtPnNlY3Rpb24gPSAwOyovCi19Ci0KLQotc3RhdGljIGludAotaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZShhYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBiZmRfdm1hIHZhbHVlOyAgCi0gIGJmZF92bWEgZG90OwotICBiZmRfdm1hIGdhcDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgdGhpbmcgdG8gYmUgcmVsb2NhdGVkIHdpbGwgaGF2ZSBtb3ZlZCBiYWNrIGJ5IAotICAgdGhlIHNpemUgb2YgdGhlIHNocmluayAgLSBidXQgd2UgZG9uJ3QgY2hhbmdlIHJlbG9jLT5hZGRyZXNzIGhlcmUsCi0gICBzaW5jZSB3ZSBuZWVkIGl0IHRvIGtub3cgd2hlcmUgdGhlIHJlbG9jYXRpb24gbGl2ZXMgaW4gdGhlIHNvdXJjZQotICAgdW5jb29rZWQgc2VjdGlvbiAqLwotCi0gIC8qICByZWxvYy0+YWRkcmVzcyAtPSBzaHJpbms7ICAgY29uY2VwdHVhbCAqLwotCi0gIGJmZF92bWEgYWRkcmVzcyA9IHJlbG9jLT5hZGRyZXNzIC0gc2hyaW5rOwotICAKLQotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7ICAgICAKLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICBjYXNlIFJfSk1QMjoKLSAgICAgIHNocmluays9MjsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBUaGluZyBpcyBhIG1vdmUgb25lIGJ5dGUgKi8KLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIGlmICh2YWx1ZSA+PSAweGZmMDApCi0JeyAKLQotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMTZiaXQsIHBvc3NpYmxlIDggdG8gOGJpdAotCSAgICAgcG9zc2libGUgMTYgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCi0JICAvKiBUaGUgcGxhY2UgdG8gcmVsYyBtb3ZlcyBiYWNrIGJ5IG9uZSAqLwotCSAgLyogVGhpcyB3aWxsIGJlIHR3byBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLwotCSAgc2hyaW5rICs9MiA7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0gICAgICAKLQotICAgICAgYnJlYWs7Ci0gICAgICAvKiBUaGlzIGlzIHRoZSAyNCBiaXQgYnJhbmNoIHdoaWNoIGNvdWxkIGJlY29tZSBhbiA4IGJpdHRlciwgCi0gICAgICAgdGhlIHJlbG9jYXRpb24gcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBpbnNuLCBub3QgdGhlCi0gICAgICAgYWN0dWFsIGRhdGEgKi8KLQotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCi0gICAgICBkb3QgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgYWRkcmVzczsKLSAgCi0gICAgICAvKiBTZWUgaWYgdGhlIGFkZHJlc3Mgd2UncmUgbG9va2luZyBhdCB3aXRoaW4gMTI3IGJ5dGVzIG9mIHdoZXJlCi0JIHdlIGFyZSwgaWYgc28gdGhlbiB3ZSBjYW4gdXNlIGEgc21hbGwgYnJhbmNoIHJhdGhlciB0aGFuIHRoZQotCSBqdW1wIHdlIHdlcmUgZ29pbmcgdG8gKi8KLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3QgOwotICAKLSAgICAgIGlmICgtMTIwIDwgKGxvbmcpZ2FwICYmIChsb25nKWdhcCA8IDEyMCApCi0JeyAKLQotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMjRiaXQsIHBvc3NpYmxlIDggdG8gOGJpdAotCSAgICAgcG9zc2libGUgMzIgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCi0JICAvKiBUaGlzIHdpbGwgYmUgdHdvIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuICovCi0JICBzaHJpbmsgKz0yIDsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSk1QMToKLQotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQkKLSAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOwotICAKLSAgICAgIC8qIFNlZSBpZiB0aGUgYWRkcmVzcyB3ZSdyZSBsb29raW5nIGF0IHdpdGhpbiAxMjcgYnl0ZXMgb2Ygd2hlcmUKLQkgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0JIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIChkb3QgLSBzaHJpbmspOwotICAKLQotICAgICAgaWYgKC0xMjAgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTIwICkKLQl7IAotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgZnJvbSAxNmJpdCwgcG9zc2libGUgOCB0byA4Yml0Ci0JICAgICBwb3NzaWJsZSAxNiAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQkgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgb25lICovCi0KLQkgIC8qIFRoaXMgd2lsbCBiZSB0d28gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLQkgIHNocmluayArPTIgOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgCi0gIHJldHVybiBzaHJpbms7Ci19Ci0KLQotLyogRmlyc3QgcGhhc2Ugb2YgYSByZWxheGluZyBsaW5rICovCi0KLS8qIFJlbG9jIHR5cGVzCi0gICBsYXJnZQkJc21hbGwKLSAgIFJfTU9WMTZCMQkJUl9NT1YxNkIyCW1vdi5iIHdpdGggMTZiaXQgb3IgOCBiaXQgYWRkcmVzcwotICAgUl9KTVAxCQlSX0pNUDIJCWptcCBvciBwY3JlbCBicmFuY2gKLSAgIFJfSk1QTDEJCVJfSk1QTF9COAkyNGptcCBvciBwY3JlbCBicmFuY2gKLSAgIFJfTU9WMjRCMQkJUl9NT1YyNEIyCTI0IG9yIDggYml0IHJlbG9jIGZvciBtb3YuYgotCi0qLwotCi1zdGF0aWMgdm9pZAotaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKLQkJCSAgIGRzdF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAqc3JjX3B0cjsKLSAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gKmRzdF9wdHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfVzY1X0FCUzg6Ci0gICAgY2FzZSBSX1c2NV9EUDoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMTsKLQlzcmNfYWRkcmVzcyArPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzhTODoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JZ2FwID4+PSA4OwotCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDE7Ci0Jc3JjX2FkZHJlc3MgKz0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1c2NV9BQlM4UzE2OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQlnYXAgPj49MTY7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMTsKLQlzcmNfYWRkcmVzcyArPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzE2OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAyOwotCXNyY19hZGRyZXNzICs9IDI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0FCUzE2Uzg6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCWdhcCA+Pj0gODsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMjsKLQlzcmNfYWRkcmVzcyArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9BQlMxNlMxNjoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JZ2FwID4+PSAxNjsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMjsKLQlzcmNfYWRkcmVzcyArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzI0OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXA+PjE2LCBkYXRhK2RzdF9hZGRyZXNzKzIpOwotCWRzdF9hZGRyZXNzICs9IDM7Ci0Jc3JjX2FkZHJlc3MgKz0gMzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1c2NV9QQ1I4OgotICAgICAgewotCWludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSBsaW5rX29yZGVyLT5vZmZzZXQgCi0JICArIGRzdF9hZGRyZXNzIAotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCWdhcCAtPSBkb3QgKyAxOwotCWlmIChnYXAgPCAtMTI4IHx8IGdhcCA+IDEyNykgewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCgpOwotCX0KLQliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAxOwotCXNyY19hZGRyZXNzICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfUENSMTY6Ci0gICAgICB7Ci0JYmZkX3ZtYSBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSBsaW5rX29yZGVyLT5vZmZzZXQgCi0JICArIGRzdF9hZGRyZXNzIAotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCi0JLyogVGhpcyB3cmFwcyB3aXRoaW4gdGhlIHBhZ2UsIHNvIGlnbm9yZSB0aGUgcmVsYXRpdmVuZXNzLCBsb29rIGF0IHRoZQotCSAgIGhpZ2ggcGFydCAqLwotCWlmICgoZ2FwICYgMHhmMDAwMCkgIT0gKGRvdCAmIDB4ZjAwMDApKSB7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0KCk7Ci0JfQotCi0JZ2FwIC09IGRvdCArIDI7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDI7Ci0Jc3JjX2FkZHJlc3MgKz0gMjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYoXygiaWdub3JpbmcgcmVsb2MgJXNcbiIpLCByZWxvYy0+aG93dG8tPm5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gICpzcmNfcHRyID0gc3JjX2FkZHJlc3M7Ci0gICpkc3RfcHRyID0gZHN0X2FkZHJlc3M7Ci0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcwotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUgaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAodzY1X3ZlYywgImNvZmYtdzk1IiwgQkZEX0lTX1JFTEFYQUJMRSwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtd2UzMmsuYyBiL2JmZC9jb2ZmLXdlMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTlhZDcuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtd2UzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igd2UzMmsgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGNzLndpZGVuZXIuZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi93ZTMyay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gICAgRU1QVFlfSE9XVE8gKDApLAotICAgIEVNUFRZX0hPV1RPICgxKSwKLSAgICBFTVBUWV9IT1dUTyAoMiksCi0gICAgRU1QVFlfSE9XVE8gKDMpLAotICAgIEVNUFRZX0hPV1RPICg0KSwKLSAgICBFTVBUWV9IT1dUTyAoNSksCi0gIEhPV1RPKFJfRElSMzIsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImRpcjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gICAgRU1QVFlfSE9XVE8gKDcpLAotICAgIEVNUFRZX0hPV1RPICgwMTApLAotICAgIEVNUFRZX0hPV1RPICgwMTEpLAotICAgIEVNUFRZX0hPV1RPICgwMTIpLAotICAgIEVNUFRZX0hPV1RPICgwMTMpLAotICAgIEVNUFRZX0hPV1RPICgwMTQpLAotICAgIEVNUFRZX0hPV1RPICgwMTUpLAotICAgIEVNUFRZX0hPV1RPICgwMTYpLAotICBIT1dUTyhSX1JFTEJZVEUsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTFdPUkQsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkcsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkJZVEUsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AxNiIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSTE9ORywJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIFdFMzJLQkFETUFHKHgpCi0jZGVmaW5lIFdFMzJLCTEKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jZGVmaW5lIGNvZmZfd3JpdGVfYXJtYXAgYnNkX3dyaXRlX2FybWFwCi0KLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDICh3ZTMya2NvZmZfdmVjLCAiY29mZi13ZTMyayIsIDAsIDAsIDAsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi16OGsuYyBiL2JmZC9jb2ZmLXo4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWYyOWE4Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXo4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgWmlsb2cgWjgwMG4gQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi96OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0zMiA9Ci1IT1dUTyAoUl9JTU0zMiwgMCwgMSwgMzIsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0zMiIsIHRydWUsIDB4ZmZmZmZmZmYsCi0gICAgICAgMHhmZmZmZmZmZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTRsID0KLUhPV1RPIChSX0lNTTRMLCAwLCAxLCA0LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tNGwiLCB0cnVlLCAweGYsIDB4ZiwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2RhID0KLUhPV1RPIChSX0lNTTE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2RhIiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwKLSAgICAgICBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tOCA9Ci1IT1dUTyAoUl9JTU04LCAwLCAxLCA4LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCi0gICAgICAgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2pyID0KLUhPV1RPIChSX0pSLCAwLCAxLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsCi0gICAgICAgInJfanIiLCB0cnVlLCAwLCAwLCB0cnVlKTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludCAKLWNvZmZfejhrX3NlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGU7Ci19Ci0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHgucl90eXBlID0gY29mZl96OGtfc2VsZWN0X3JlbG9jKGhvd3RvKQotCi0KLSNkZWZpbmUgQkFETUFHKHgpIFo4S0JBRE1BRyh4KQotI2RlZmluZSBaOEsgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICogaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBzd2l0Y2ggKGRzdC0+cl90eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NODoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTg7Ci0gICAgICBicmVhazsKLSAgICAgY2FzZSBSX0lNTTE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfZGE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSlI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9qcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU0zMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTRMOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tNGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZCAKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKiByZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi1zdGF0aWMgdm9pZAotZXh0cmFfY2FzZSAoaW5fYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSU1NODoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDE7Ci0gICAgICAoKnNyY19wdHIpICs9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU0zMjoKLSAgICAgIGJmZF9wdXRfMzIgKGluX2FiZmQsCi0JCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDQ7Ci0gICAgICAoKnNyY19wdHIpICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU00TDoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJICgoYmZkX2dldF84IChpbl9hYmZkLCBkYXRhICsgKmRzdF9wdHIpICYgMHhmMCkgCi0JCSAgfCAoMHgwZgotCQkgICAgICYgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICBpbnB1dF9zZWN0aW9uKSkpLAotCQkgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMTsKLSAgICAgICgqc3JjX3B0cikgKz0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lNTTE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSAgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMjsKLSAgICAgICgqc3JjX3B0cikgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0pSOgotICAgICAgewotCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pOwotCWJmZF92bWEgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCQkgICAgICAgKyAqZHN0X3B0cgotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKLQkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLwotCi0JaWYgKGdhcCAmIDEpCi0JICBhYm9ydCAoKTsKLQlnYXAgLz0gMjsKLQlpZiAoZ2FwID4gMTI4IHx8IGdhcCA8IC0xMjgpCi0JICB7Ci0JICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLQliZmRfcHV0XzggKGluX2FiZmQsIGdhcCwgZGF0YSArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpKys7Ci0JKCpzcmNfcHRyKSsrOwotCWJyZWFrOwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGV4dHJhX2Nhc2UKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLQotI3VuZGVmICBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLUNSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDICh6OGtjb2ZmX3ZlYywgImNvZmYtejhrIiwgMCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmZjb2RlLmggYi9iZmQvY29mZmNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5M2EyMS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZmNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwNjEgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgbW9zdCBDT0ZGIHZhcmlhbnRzLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbQotKi8KLS8qCi0KLVNFQ1RJT04KLQljb2ZmIGJhY2tlbmRzCi0KLQlCRkQgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGZsYXZvdXJzIG9mIGNvZmYgZm9ybWF0LgotCVRoZSBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGZvcm1hdHMgYXJlIHRoZSBzaXplcyBhbmQKLQlhbGlnbm1lbnRzIG9mIGZpZWxkcyBpbiBzdHJ1Y3R1cmVzIG9uIGRpc2ssIGFuZCB0aGUgb2NjYXNpb25hbAotCWV4dHJhIGZpZWxkLgotCi0JQ29mZiBpbiBhbGwgaXRzIHZhcmlldGllcyBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgZmV3IGNvbW1vbgotCWZpbGVzIGFuZCBhIG51bWJlciBvZiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBmaWxlcy4gRm9yCi0JZXhhbXBsZSwgVGhlIDg4ayBiY3MgY29mZiBmb3JtYXQgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIGZpbGUKLQlAZmlsZXtjb2ZmLW04OGsuY30uIFRoaXMgZmlsZSBAY29kZXsjaW5jbHVkZX1zCi0JQGZpbGV7Y29mZi9tODhrLmh9IHdoaWNoIGRlZmluZXMgdGhlIGV4dGVybmFsIHN0cnVjdHVyZSBvZiB0aGUKLQljb2ZmIGZvcm1hdCBmb3IgdGhlIDg4aywgYW5kIEBmaWxle2NvZmYvaW50ZXJuYWwuaH0gd2hpY2gKLQlkZWZpbmVzIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUuIEBmaWxle2NvZmYtbTg4ay5jfSBhbHNvCi0JZGVmaW5lcyB0aGUgcmVsb2NhdGlvbnMgdXNlZCBieSB0aGUgODhrIGZvcm1hdAotCUB4cmVme1JlbG9jYXRpb25zfS4KLQotCVRoZSBJbnRlbCBpOTYwIHByb2Nlc3NvciB2ZXJzaW9uIG9mIGNvZmYgaXMgaW1wbGVtZW50ZWQgaW4KLQlAZmlsZXtjb2ZmLWk5NjAuY30uIFRoaXMgZmlsZSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzCi0JQGZpbGV7Y29mZi1tODhrLmN9LCBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBAZmlsZXtjb2ZmL2k5NjAuaH0KLQlyYXRoZXIgdGhhbiBAZmlsZXtjb2ZmLW04OGsuaH0uCi0KLVNVQlNFQ1RJT04KLQlQb3J0aW5nIHRvIGEgbmV3IHZlcnNpb24gb2YgY29mZgotCi0JVGhlIHJlY29tbWVuZGVkIG1ldGhvZCBpcyB0byBzZWxlY3QgZnJvbSB0aGUgZXhpc3RpbmcKLQlpbXBsZW1lbnRhdGlvbnMgdGhlIHZlcnNpb24gb2YgY29mZiB3aGljaCBpcyBtb3N0IGxpa2UgdGhlIG9uZQotCXlvdSB3YW50IHRvIHVzZS4gIEZvciBleGFtcGxlLCB3ZSdsbCBzYXkgdGhhdCBpMzg2IGNvZmYgaXMKLQl0aGUgb25lIHlvdSBzZWxlY3QsIGFuZCB0aGF0IHlvdXIgY29mZiBmbGF2b3VyIGlzIGNhbGxlZCBmb28uCi0JQ29weSBAZmlsZXtpMzg2Y29mZi5jfSB0byBAZmlsZXtmb29jb2ZmLmN9LCBjb3B5Ci0JQGZpbGV7Li4vaW5jbHVkZS9jb2ZmL2kzODYuaH0gdG8gQGZpbGV7Li4vaW5jbHVkZS9jb2ZmL2Zvby5ofSwKLQlhbmQgYWRkIHRoZSBsaW5lcyB0byBAZmlsZXt0YXJnZXRzLmN9IGFuZCBAZmlsZXtNYWtlZmlsZS5pbn0KLQlzbyB0aGF0IHlvdXIgbmV3IGJhY2sgZW5kIGlzIHVzZWQuIEFsdGVyIHRoZSBzaGFwZXMgb2YgdGhlCi0Jc3RydWN0dXJlcyBpbiBAZmlsZXsuLi9pbmNsdWRlL2NvZmYvZm9vLmh9IHNvIHRoYXQgdGhleSBtYXRjaAotCXdoYXQgeW91IG5lZWQuIFlvdSB3aWxsIHByb2JhYmx5IGFsc28gaGF2ZSB0byBhZGQKLQlAY29kZXsjaWZkZWZ9cyB0byB0aGUgY29kZSBpbiBAZmlsZXtjb2ZmL2ludGVybmFsLmh9IGFuZAotCUBmaWxle2NvZmZjb2RlLmh9IGlmIHlvdXIgdmVyc2lvbiBvZiBjb2ZmIGlzIHRvbyB3aWxkLgotCi0JWW91IGNhbiB2ZXJpZnkgdGhhdCB5b3VyIG5ldyBCRkQgYmFja2VuZCB3b3JrcyBxdWl0ZSBzaW1wbHkgYnkKLQlidWlsZGluZyBAZmlsZXtvYmpkdW1wfSBmcm9tIHRoZSBAZmlsZXtiaW51dGlsc30gZGlyZWN0b3J5LAotCWFuZCBtYWtpbmcgc3VyZSB0aGF0IGl0cyB2ZXJzaW9uIG9mIHdoYXQncyBnb2luZyBvbiBhbmQgeW91cgotCWhvc3Qgc3lzdGVtJ3MgaWRlYSAoYXNzdW1pbmcgaXQgaGFzIHRoZSBwcmV0dHkgc3RhbmRhcmQgY29mZgotCWR1bXAgdXRpbGl0eSwgdXN1YWxseSBjYWxsZWQgQGNvZGV7YXR0LWR1bXB9IG9yIGp1c3QKLQlAY29kZXtkdW1wfSkgYXJlIHRoZSBzYW1lLiAgVGhlbiBjbGVhbiB1cCB5b3VyIGNvZGUsIGFuZCBzZW5kCi0Jd2hhdCB5b3UndmUgZG9uZSB0byBDeWdudXMuIFRoZW4geW91ciBzdHVmZiB3aWxsIGJlIGluIHRoZQotCW5leHQgcmVsZWFzZSwgYW5kIHlvdSB3b24ndCBoYXZlIHRvIGtlZXAgaW50ZWdyYXRpbmcgaXQuCi0KLVNVQlNFQ1RJT04KLQlIb3cgdGhlIGNvZmYgYmFja2VuZCB3b3JrcwotCi1TVUJTVUJTRUNUSU9OCi0JRmlsZSBsYXlvdXQKLQotCVRoZSBDb2ZmIGJhY2tlbmQgaXMgc3BsaXQgaW50byBnZW5lcmljIHJvdXRpbmVzIHRoYXQgYXJlCi0JYXBwbGljYWJsZSB0byBhbnkgQ29mZiB0YXJnZXQgYW5kIHJvdXRpbmVzIHRoYXQgYXJlIHNwZWNpZmljCi0JdG8gYSBwYXJ0aWN1bGFyIHRhcmdldC4gIFRoZSB0YXJnZXQtc3BlY2lmaWMgcm91dGluZXMgYXJlCi0JZnVydGhlciBzcGxpdCBpbnRvIG9uZXMgd2hpY2ggYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBmb3IgYWxsCi0JQ29mZiB0YXJnZXRzIGV4Y2VwdCB0aGF0IHRoZXkgdXNlIHRoZSBleHRlcm5hbCBzeW1ib2wgZm9ybWF0Ci0Jb3IgdXNlIGRpZmZlcmVudCB2YWx1ZXMgZm9yIGNlcnRhaW4gY29uc3RhbnRzLgotCi0JVGhlIGdlbmVyaWMgcm91dGluZXMgYXJlIGluIEBmaWxle2NvZmZnZW4uY30uICBUaGVzZSByb3V0aW5lcwotCXdvcmsgZm9yIGFueSBDb2ZmIHRhcmdldC4gIFRoZXkgdXNlIHNvbWUgaG9va3MgaW50byB0aGUgdGFyZ2V0Ci0Jc3BlY2lmaWMgY29kZTsgdGhlIGhvb2tzIGFyZSBpbiBhIEBjb2Rle2JmZF9jb2ZmX2JhY2tlbmRfZGF0YX0KLQlzdHJ1Y3R1cmUsIG9uZSBvZiB3aGljaCBleGlzdHMgZm9yIGVhY2ggdGFyZ2V0LgotCi0JVGhlIGVzc2VudGlhbGx5IHNpbWlsYXIgdGFyZ2V0LXNwZWNpZmljIHJvdXRpbmVzIGFyZSBpbgotCUBmaWxle2NvZmZjb2RlLmh9LiAgVGhpcyBoZWFkZXIgZmlsZSBpbmNsdWRlcyBleGVjdXRhYmxlIEMgY29kZS4KLQlUaGUgdmFyaW91cyBDb2ZmIHRhcmdldHMgZmlyc3QgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgQ29mZgotCWhlYWRlciBmaWxlLCBtYWtlIGFueSBzcGVjaWFsIGRlZmluZXMgdGhhdCBhcmUgbmVlZGVkLCBhbmQKLQl0aGVuIGluY2x1ZGUgQGZpbGV7Y29mZmNvZGUuaH0uCi0KLQlTb21lIG9mIHRoZSBDb2ZmIHRhcmdldHMgdGhlbiBhbHNvIGhhdmUgYWRkaXRpb25hbCByb3V0aW5lcyBpbgotCXRoZSB0YXJnZXQgc291cmNlIGZpbGUgaXRzZWxmLgotCi0JRm9yIGV4YW1wbGUsIEBmaWxle2NvZmYtaTk2MC5jfSBpbmNsdWRlcwotCUBmaWxle2NvZmYvaW50ZXJuYWwuaH0gYW5kIEBmaWxle2NvZmYvaTk2MC5ofS4gIEl0IHRoZW4KLQlkZWZpbmVzIGEgZmV3IGNvbnN0YW50cywgc3VjaCBhcyBAY29kZXtJOTYwfSwgYW5kIGluY2x1ZGVzCi0JQGZpbGV7Y29mZmNvZGUuaH0uICBTaW5jZSB0aGUgaTk2MCBoYXMgY29tcGxleCByZWxvY2F0aW9uCi0JdHlwZXMsIEBmaWxle2NvZmYtaTk2MC5jfSBhbHNvIGluY2x1ZGVzIHNvbWUgY29kZSB0bwotCW1hbmlwdWxhdGUgdGhlIGk5NjAgcmVsb2NzLiAgVGhpcyBjb2RlIGlzIG5vdCBpbgotCUBmaWxle2NvZmZjb2RlLmh9IGJlY2F1c2UgaXQgd291bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyCi0JdGFyZ2V0LgotCi1TVUJTVUJTRUNUSU9OCi0JQml0IHR3aWRkbGluZwotCi0JRWFjaCBmbGF2b3VyIG9mIGNvZmYgc3VwcG9ydGVkIGluIEJGRCBoYXMgaXRzIG93biBoZWFkZXIgZmlsZQotCWRlc2NyaWJpbmcgdGhlIGV4dGVybmFsIGxheW91dCBvZiB0aGUgc3RydWN0dXJlcy4gVGhlcmUgaXMgYWxzbwotCWFuIGludGVybmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2ZmIGxheW91dCwgaW4KLQlAZmlsZXtjb2ZmL2ludGVybmFsLmh9LiBBIG1ham9yIGZ1bmN0aW9uIG9mIHRoZQotCWNvZmYgYmFja2VuZCBpcyBzd2FwcGluZyB0aGUgYnl0ZXMgYW5kIHR3aWRkbGluZyB0aGUgYml0cyB0bwotCXRyYW5zbGF0ZSB0aGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgc3RydWN0dXJlcyBpbnRvIHRoZSBub3JtYWwKLQlpbnRlcm5hbCBmb3JtLiBUaGlzIGlzIGFsbCBwZXJmb3JtZWQgaW4gdGhlCi0JQGNvZGV7YmZkX3N3YXB9X0Bpe3RoaW5nfV9AaXtkaXJlY3Rpb259IHJvdXRpbmVzLiBTb21lCi0JZWxlbWVudHMgYXJlIGRpZmZlcmVudCBzaXplcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZgotCWNvZmY7IGl0IGlzIHRoZSBkdXR5IG9mIHRoZSBjb2ZmIHZlcnNpb24gc3BlY2lmaWMgaW5jbHVkZSBmaWxlCi0JdG8gb3ZlcnJpZGUgdGhlIGRlZmluaXRpb25zIG9mIHZhcmlvdXMgcGFja2luZyByb3V0aW5lcyBpbgotCUBmaWxle2NvZmZjb2RlLmh9LiBFLmcuLCB0aGUgc2l6ZSBvZiBsaW5lIG51bWJlciBlbnRyeSBpbiBjb2ZmIGlzCi0Jc29tZXRpbWVzIDE2IGJpdHMsIGFuZCBzb21ldGltZXMgMzIgYml0cy4gQGNvZGV7I2RlZmluZX1pbmcKLQlAY29kZXtQVVRfTE5TWl9MTk5PfSBhbmQgQGNvZGV7R0VUX0xOU1pfTE5OT30gd2lsbCBzZWxlY3QgdGhlCi0JY29ycmVjdCBvbmUuIE5vIGRvdWJ0LCBzb21lIGRheSBzb21lb25lIHdpbGwgZmluZCBhIHZlcnNpb24gb2YKLQljb2ZmIHdoaWNoIGhhcyBhIHZhcnlpbmcgZmllbGQgc2l6ZSBub3QgY2F0ZXJlZCB0byBhdCB0aGUKLQltb21lbnQuIFRvIHBvcnQgQkZELCB0aGF0IHBlcnNvbiB3aWxsIGhhdmUgdG8gYWRkIG1vcmUgQGNvZGV7I2RlZmluZXN9LgotCVRocmVlIG9mIHRoZSBiaXQgdHdpZGRsaW5nIHJvdXRpbmVzIGFyZSBleHBvcnRlZCB0bwotCUBjb2Rle2dkYn07IEBjb2Rle2NvZmZfc3dhcF9hdXhfaW59LCBAY29kZXtjb2ZmX3N3YXBfc3ltX2lufQotCWFuZCBAY29kZXtjb2ZmX3N3YXBfbGluZW5vX2lufS4gQGNvZGV7R0RCfSByZWFkcyB0aGUgc3ltYm9sCi0JdGFibGUgb24gaXRzIG93biwgYnV0IHVzZXMgQkZEIHRvIGZpeCB0aGluZ3MgdXAuICBNb3JlIG9mIHRoZQotCWJpdCB0d2lkZGxlcnMgYXJlIGV4cG9ydGVkIGZvciBAY29kZXtnYXN9OwotCUBjb2Rle2NvZmZfc3dhcF9hdXhfb3V0fSwgQGNvZGV7Y29mZl9zd2FwX3N5bV9vdXR9LAotCUBjb2Rle2NvZmZfc3dhcF9saW5lbm9fb3V0fSwgQGNvZGV7Y29mZl9zd2FwX3JlbG9jX291dH0sCi0JQGNvZGV7Y29mZl9zd2FwX2ZpbGVoZHJfb3V0fSwgQGNvZGV7Y29mZl9zd2FwX2FvdXRoZHJfb3V0fSwKLQlAY29kZXtjb2ZmX3N3YXBfc2NuaGRyX291dH0uIEBjb2Rle0dhc30gY3VycmVudGx5IGtlZXBzIHRyYWNrCi0Jb2YgYWxsIHRoZSBzeW1ib2wgdGFibGUgYW5kIHJlbG9jIGRydWRnZXJ5IGl0c2VsZiwgdGhlcmVieQotCXNhdmluZyB0aGUgaW50ZXJuYWwgQkZEIG92ZXJoZWFkLCBidXQgdXNlcyBCRkQgdG8gc3dhcCB0aGluZ3MKLQlvbiB0aGUgd2F5IG91dCwgbWFraW5nIGNyb3NzIHBvcnRzIG11Y2ggc2FmZXIuICBEb2luZyBzbyBhbHNvCi0JYWxsb3dzIEJGRCAoYW5kIHRodXMgdGhlIGxpbmtlcikgdG8gdXNlIHRoZSBzYW1lIGhlYWRlciBmaWxlcwotCWFzIEBjb2Rle2dhc30sIHdoaWNoIG1ha2VzIG9uZSBhdmVudWUgdG8gZGlzYXN0ZXIgZGlzYXBwZWFyLgotCi1TVUJTVUJTRUNUSU9OCi0JU3ltYm9sIHJlYWRpbmcKLQotCVRoZSBzaW1wbGUgY2Fub25pY2FsIGZvcm0gZm9yIHN5bWJvbHMgdXNlZCBieSBCRkQgaXMgbm90IHJpY2gKLQllbm91Z2ggdG8ga2VlcCBhbGwgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiBhIGNvZmYgc3ltYm9sCi0JdGFibGUuIFRoZSBiYWNrIGVuZCBnZXRzIGFyb3VuZCB0aGlzIHByb2JsZW0gYnkga2VlcGluZyB0aGUgb3JpZ2luYWwKLQlzeW1ib2wgdGFibGUgYXJvdW5kLCAiYmVoaW5kIHRoZSBzY2VuZXMiLgotCi0JV2hlbiBhIHN5bWJvbCB0YWJsZSBpcyByZXF1ZXN0ZWQgKHRocm91Z2ggYSBjYWxsIHRvCi0JQGNvZGV7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9KSwgYSByZXF1ZXN0IGdldHMgdGhyb3VnaCB0bwotCUBjb2Rle2NvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFifS4gVGhpcyByZWFkcyB0aGUgc3ltYm9sIHRhYmxlIGZyb20KLQl0aGUgY29mZiBmaWxlIGFuZCBzd2FwcyBhbGwgdGhlIHN0cnVjdHVyZXMgaW5zaWRlIGludG8gdGhlCi0JaW50ZXJuYWwgZm9ybS4gSXQgYWxzbyBmaXhlcyB1cCBhbGwgdGhlIHBvaW50ZXJzIGluIHRoZSB0YWJsZQotCShyZXByZXNlbnRlZCBpbiB0aGUgZmlsZSBieSBvZmZzZXRzIGZyb20gdGhlIGZpcnN0IHN5bWJvbCBpbgotCXRoZSB0YWJsZSkgaW50byBwaHlzaWNhbCBwb2ludGVycyB0byBlbGVtZW50cyBpbiB0aGUgbmV3Ci0JaW50ZXJuYWwgdGFibGUuIFRoaXMgaW52b2x2ZXMgc29tZSB3b3JrIHNpbmNlIHRoZSBtZWFuaW5ncyBvZgotCWZpZWxkcyBjaGFuZ2UgZGVwZW5kaW5nIHVwb24gY29udGV4dDogYSBmaWVsZCB0aGF0IGlzIGEKLQlwb2ludGVyIHRvIGFub3RoZXIgc3RydWN0dXJlIGluIHRoZSBzeW1ib2wgdGFibGUgYXQgb25lIG1vbWVudAotCW1heSBiZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIHN0cnVjdHVyZSBhdCB0aGUgbmV4dC4gIEFub3RoZXIKLQlwYXNzIGlzIG1hZGUgb3ZlciB0aGUgdGFibGUuIEFsbCBzeW1ib2xzIHdoaWNoIG1hcmsgZmlsZSBuYW1lcwotCSg8PENfRklMRT4+IHN5bWJvbHMpIGFyZSBtb2RpZmllZCBzbyB0aGF0IHRoZSBpbnRlcm5hbAotCXN0cmluZyBwb2ludHMgdG8gdGhlIHZhbHVlIGluIHRoZSBhdXhlbnQgKHRoZSByZWFsIGZpbGVuYW1lKQotCXJhdGhlciB0aGFuIHRoZSBub3JtYWwgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbAotCShAY29kZXsiLmZpbGUifSkuCi0KLQlBdCB0aGlzIHRpbWUgdGhlIHN5bWJvbCBuYW1lcyBhcmUgbW92ZWQgYXJvdW5kLiBDb2ZmIHN0b3JlcwotCWFsbCBzeW1ib2xzIGxlc3MgdGhhbiBuaW5lIGNoYXJhY3RlcnMgbG9uZyBwaHlzaWNhbGx5Ci0Jd2l0aGluIHRoZSBzeW1ib2wgdGFibGU7IGxvbmdlciBzdHJpbmdzIGFyZSBrZXB0IGF0IHRoZSBlbmQgb2YKLQl0aGUgZmlsZSBpbiB0aGUgc3RyaW5nIAl0YWJsZS4gVGhpcyBwYXNzIG1vdmVzIGFsbCBzdHJpbmdzCi0JaW50byBtZW1vcnkgYW5kIHJlcGxhY2VzIHRoZW0gd2l0aCBwb2ludGVycyB0byB0aGUgc3RyaW5ncy4KLQotCi0JVGhlIHN5bWJvbCB0YWJsZSBpcyBtYXNzYWdlZCBvbmNlIGFnYWluLCB0aGlzIHRpbWUgdG8gY3JlYXRlCi0JdGhlIGNhbm9uaWNhbCB0YWJsZSB1c2VkIGJ5IHRoZSBCRkQgYXBwbGljYXRpb24uIEVhY2ggc3ltYm9sCi0JaXMgaW5zcGVjdGVkIGluIHR1cm4sIGFuZCBhIGRlY2lzaW9uIG1hZGUgKHVzaW5nIHRoZQotCUBjb2Rle3NjbGFzc30gZmllbGQpIGFib3V0IHRoZSB2YXJpb3VzIGZsYWdzIHRvIHNldCBpbiB0aGUKLQlAY29kZXthc3ltYm9sfS4gIEB4cmVme1N5bWJvbHN9LiBUaGUgZ2VuZXJhdGVkIGNhbm9uaWNhbCB0YWJsZQotCXNoYXJlcyBzdHJpbmdzIHdpdGggdGhlIGhpZGRlbiBpbnRlcm5hbCBzeW1ib2wgdGFibGUuCi0KLQlBbnkgbGluZW51bWJlcnMgYXJlIHJlYWQgZnJvbSB0aGUgY29mZiBmaWxlIHRvbywgYW5kIGF0dGFjaGVkCi0JdG8gdGhlIHN5bWJvbHMgd2hpY2ggb3duIHRoZSBmdW5jdGlvbnMgdGhlIGxpbmVudW1iZXJzIGJlbG9uZyB0by4KLQotU1VCU1VCU0VDVElPTgotCVN5bWJvbCB3cml0aW5nCi0KLQlXcml0aW5nIGEgc3ltYm9sIHRvIGEgY29mZiBmaWxlIHdoaWNoIGRpZG4ndCBjb21lIGZyb20gYSBjb2ZmCi0JZmlsZSB3aWxsIGxvc2UgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhlIEBjb2Rle2FzeW1ib2x9Ci0Jc3RydWN0dXJlIHJlbWVtYmVycyB0aGUgQkZEIGZyb20gd2hpY2ggdGhlIHN5bWJvbCB3YXMgdGFrZW4sIGFuZCBvbgotCW91dHB1dCB0aGUgYmFjayBlbmQgbWFrZXMgc3VyZSB0aGF0IHRoZSBzYW1lIGRlc3RpbmF0aW9uIHRhcmdldCBhcwotCXNvdXJjZSB0YXJnZXQgaXMgcHJlc2VudC4KLQotCVdoZW4gdGhlIHN5bWJvbHMgaGF2ZSBjb21lIGZyb20gYSBjb2ZmIGZpbGUgdGhlbiBhbGwgdGhlCi0JZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHByZXNlcnZlZC4KLQotCVN5bWJvbCB0YWJsZXMgYXJlIHByb3ZpZGVkIGZvciB3cml0aW5nIHRvIHRoZSBiYWNrIGVuZCBpbiBhCi0JdmVjdG9yIG9mIHBvaW50ZXJzIHRvIHBvaW50ZXJzLiBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMgbGlrZQotCXRoZSBsaW5rZXIgdG8gYWNjdW11bGF0ZSBhbmQgb3V0cHV0IGxhcmdlIHN5bWJvbCB0YWJsZXMKLQl3aXRob3V0IGhhdmluZyB0byBkbyB0b28gbXVjaCBieXRlIGNvcHlpbmcuCi0KLQlUaGlzIGZ1bmN0aW9uIHJ1bnMgdGhyb3VnaCB0aGUgcHJvdmlkZWQgc3ltYm9sIHRhYmxlIGFuZAotCXBhdGNoZXMgZWFjaCBzeW1ib2wgbWFya2VkIGFzIGEgZmlsZSBwbGFjZSBob2xkZXIKLQkoQGNvZGV7Q19GSUxFfSkgdG8gcG9pbnQgdG8gdGhlIG5leHQgZmlsZSBwbGFjZSBob2xkZXIgaW4gdGhlCi0JbGlzdC4gSXQgYWxzbyBtYXJrcyBlYWNoIEBjb2Rle29mZnNldH0gZmllbGQgaW4gdGhlIGxpc3Qgd2l0aAotCXRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIG9mIHRoZSBjdXJyZW50IHN5bWJvbC4KLQotCUFub3RoZXIgZnVuY3Rpb24gb2YgdGhpcyBwcm9jZWR1cmUgaXMgdG8gdHVybiB0aGUgY2Fub25pY2FsCi0JdmFsdWUgZm9ybSBvZiBCRkQgaW50byB0aGUgZm9ybSB1c2VkIGJ5IGNvZmYuIEludGVybmFsbHksIEJGRAotCWV4cGVjdHMgc3ltYm9sIHZhbHVlcyB0byBiZSBvZmZzZXRzIGZyb20gYSBzZWN0aW9uIGJhc2U7IHNvIGEKLQlzeW1ib2wgcGh5c2ljYWxseSBhdCAweDEyMCwgYnV0IGluIGEgc2VjdGlvbiBzdGFydGluZyBhdAotCTB4MTAwLCB3b3VsZCBoYXZlIHRoZSB2YWx1ZSAweDIwLiBDb2ZmIGV4cGVjdHMgc3ltYm9scyB0bwotCWNvbnRhaW4gdGhlaXIgZmluYWwgdmFsdWUsIHNvIHN5bWJvbHMgaGF2ZSB0aGVpciB2YWx1ZXMKLQljaGFuZ2VkIGF0IHRoaXMgcG9pbnQgdG8gcmVmbGVjdCB0aGVpciBzdW0gd2l0aCB0aGVpciBvd25pbmcKLQlzZWN0aW9uLiAgVGhpcyB0cmFuc2Zvcm1hdGlvbiB1c2VzIHRoZQotCTw8b3V0cHV0X3NlY3Rpb24+PiBmaWVsZCBvZiB0aGUgQGNvZGV7YXN5bWJvbH0ncwotCUBjb2Rle2FzZWN0aW9ufSBAeHJlZntTZWN0aW9uc30uCi0KLQlvIDw8Y29mZl9tYW5nbGVfc3ltYm9scz4+Ci0KLQlUaGlzIHJvdXRpbmUgcnVucyB0aG91Z2ggdGhlIHByb3ZpZGVkIHN5bWJvbCB0YWJsZSBhbmQgdXNlcwotCXRoZSBvZmZzZXRzIGdlbmVyYXRlZCBieSB0aGUgcHJldmlvdXMgcGFzcyBhbmQgdGhlIHBvaW50ZXJzCi0JZ2VuZXJhdGVkIHdoZW4gdGhlIHN5bWJvbCB0YWJsZSB3YXMgcmVhZCBpbiB0byBjcmVhdGUgdGhlCi0Jc3RydWN0dXJlZCBoaWVyYWNoeSByZXF1aXJlZCBieSBjb2ZmLiBJdCBjaGFuZ2VzIGVhY2ggcG9pbnRlcgotCXRvIGEgc3ltYm9sIGludG8gdGhlIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgYXN5bWJvbC4KLQotCW8gPDxjb2ZmX3dyaXRlX3N5bWJvbHM+PgotCi0JVGhpcyByb3V0aW5lIHJ1bnMgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGFuZCBwYXRjaGVzIHVwIHRoZQotCXN5bWJvbHMgZnJvbSB0aGVpciBpbnRlcm5hbCBmb3JtIGludG8gdGhlIGNvZmYgd2F5LCBjYWxscyB0aGUKLQliaXQgdHdpZGRsZXJzLCBhbmQgd3JpdGVzIG91dCB0aGUgdGFibGUgdG8gdGhlIGZpbGUuCi0KLSovCi0KLS8qCi1JTlRFUk5BTF9ERUZJTklUSU9OCi0JY29mZl9zeW1ib2xfdHlwZQotCi1ERVNDUklQVElPTgotCVRoZSBoaWRkZW4gaW5mb3JtYXRpb24gZm9yIGFuIDw8YXN5bWJvbD4+IGlzIGRlc2NyaWJlZCBpbiBhCi0JPDxjb21iaW5lZF9lbnRyeV90eXBlPj46Ci0KLUNPREVfRlJBR01FTlQKLS4KLS50eXBlZGVmIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QKLS57Ci0uCi0uICAgICAgIHsqIFJlbWVtYmVycyB0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgZmlsZSBmb3IKLS4gICAgICAgICAgdGhpcyBzeW1ib2wuIEdlbmVyYXRlZCBieSBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMuICp9Ci0udW5zaWduZWQgaW50IG9mZnNldDsKLS4KLS4gICAgICAgeyogU2hvdWxkIHRoZSB2YWx1ZSBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLiAgVXNlZCBmb3IKLS4gICAgICAgICAgWENPRkYgQ19CU1RBVCBzeW1ib2xzLiAgU2V0IGJ5IGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKn0KLS51bnNpZ25lZCBpbnQgZml4X3ZhbHVlIDogMTsKLS4KLS4gICAgICAgeyogU2hvdWxkIHRoZSB0YWcgZmllbGQgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4KLS4gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqfQotLnVuc2lnbmVkIGludCBmaXhfdGFnIDogMTsKLS4KLS4gICAgICAgeyogU2hvdWxkIHRoZSBlbmRpZHggZmllbGQgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4KLS4gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqfQotLnVuc2lnbmVkIGludCBmaXhfZW5kIDogMTsKLS4KLS4gICAgICAgeyogU2hvdWxkIHRoZSB4X2NzZWN0Lnhfc2NubGVuIGZpZWxkIGJlIHJlbnVtYmVyZWQuCi0uICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKn0KLS51bnNpZ25lZCBpbnQgZml4X3NjbmxlbiA6IDE7Ci0uCi0uICAgICAgIHsqIEZpeCB1cCBhbiBYQ09GRiBDX0JJTkNML0NfRUlOQ0wgc3ltYm9sLiAgVGhlIHZhbHVlIGlzIHRoZQotLiAgICAgICAgICBpbmRleCBpbnRvIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzLiAgU2V0IGJ5Ci0uICAgICAgICAgIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKn0KLS51bnNpZ25lZCBpbnQgZml4X2xpbmUgOiAxOwotLgotLiAgICAgICB7KiBUaGUgY29udGFpbmVyIGZvciB0aGUgc3ltYm9sIHN0cnVjdHVyZSBhcyByZWFkIGFuZCB0cmFuc2xhdGVkCi0uICAgICAgICAgICBmcm9tIHRoZSBmaWxlLiAqfQotLgotLnVuaW9uIHsKLS4gICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4ZW50OwotLiAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltZW50OwotLiB9IHU7Ci0ufSBjb21iaW5lZF9lbnRyeV90eXBlOwotLgotLgotLnsqIEVhY2ggY2Fub25pY2FsIGFzeW1ib2wgcmVhbGx5IGxvb2tzIGxpa2UgdGhpczogKn0KLS4KLS50eXBlZGVmIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QKLS57Ci0uICAgeyogVGhlIGFjdHVhbCBzeW1ib2wgd2hpY2ggdGhlIHJlc3Qgb2YgQkZEIHdvcmtzIHdpdGggKn0KLS5hc3ltYm9sIHN5bWJvbDsKLS4KLS4gICB7KiBBIHBvaW50ZXIgdG8gdGhlIGhpZGRlbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wgKn0KLS5jb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0uCi0uICAgeyogQSBwb2ludGVyIHRvIHRoZSBsaW5lbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqfQotLnN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgKmxpbmVubzsKLS4KLS4gICB7KiBIYXZlIHRoZSBsaW5lIG51bWJlcnMgYmVlbiByZWxvY2F0ZWQgeWV0ID8gKn0KLS5ib29sZWFuIGRvbmVfbGluZW5vOwotLn0gY29mZl9zeW1ib2xfdHlwZTsKLQotCi0qLwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jaW5jbHVkZSAicGVpY29kZS5oIgotI2Vsc2UKLSNpbmNsdWRlICJjb2Zmc3dhcC5oIgotI2VuZGlmCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotc3RhdGljIGxvbmcgc2VjX3RvX3N0eXBfZmxhZ3MgUEFSQU1TICgoY29uc3QgY2hhciAqLCBmbGFnd29yZCkpOwotc3RhdGljIGZsYWd3b3JkIHN0eXBfdG9fc2VjX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGNvbnN0IGNoYXIgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9iYWRfZm9ybWF0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zZXRfY3VzdG9tX3NlY3Rpb25fYWxpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBjb25zdCBzdHJ1Y3QgY29mZl9zZWN0aW9uX2FsaWdubWVudF9lbnRyeSAqLAotCSAgIGNvbnN0IHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9uZXdfc2VjdGlvbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9hcmNoX21hY2hfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIHNob3J0ICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBQVFIgYnV5X2FuZF9yZWFkIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgaW50LCBzaXplX3QpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2x1cnBfbGluZV90YWJsZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zbHVycF9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uIGNvZmZfY2xhc3NpZnlfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2x1cnBfcmVsb2NfdGFibGUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBsb25nIGNvZmZfY2Fub25pY2FsaXplX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci0jaWZuZGVmIGNvZmZfbWtvYmplY3RfaG9vawotc3RhdGljIFBUUiBjb2ZmX21rb2JqZWN0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgIFBUUikpOwotI2VuZGlmCi0MCi0vKiB2b2lkIHdhcm5pbmcoKTsgKi8KLQotLyogUmV0dXJuIGEgd29yZCB3aXRoIFNUWVBfKiAoc2NuaGRyLnNfZmxhZ3MpIGZsYWdzIHNldCB0byByZXByZXNlbnQKLSAgIHRoZSBpbmNvbWluZyBTRUNfKiBmbGFncy4gIFRoZSBpbnZlcnNlIG9mIHRoaXMgZnVuY3Rpb24gaXMKLSAgIHN0eXBfdG9fc2VjX2ZsYWdzKCkuICBOT1RFOiBJZiB5b3UgYWRkIHRvL2NoYW5nZSB0aGlzIHJvdXRpbmUsIHlvdQotICAgc2hvdWxkIHByb2JhYmx5IG1pcnJvciB0aGUgY2hhbmdlcyBpbiBzdHlwX3RvX3NlY19mbGFncygpLiAgKi8KLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLQotc3RhdGljIGxvbmcKLXNlY190b19zdHlwX2ZsYWdzIChzZWNfbmFtZSwgc2VjX2ZsYWdzKQotICAgICBDT05TVCBjaGFyICpzZWNfbmFtZTsKLSAgICAgZmxhZ3dvcmQgc2VjX2ZsYWdzOwotewotICBsb25nIHN0eXBfZmxhZ3MgPSAwOwotCi0gIGlmICghc3RyY21wIChzZWNfbmFtZSwgX1RFWFQpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0RBVEEpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0RBVEE7Ci0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0JTUykpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfQlNTOwotI2lmZGVmIF9DT01NRU5UCi0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0NPTU1FTlQpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0lORk87Ci0jZW5kaWYgLyogX0NPTU1FTlQgKi8KLSNpZmRlZiBfTElCCi0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0xJQikpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTElCOwotI2VuZGlmIC8qIF9MSUIgKi8KLSNpZmRlZiBfTElUCi0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0xJVCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTElUOwotI2VuZGlmIC8qIF9MSVQgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCAiLmRlYnVnIikpCi0gICAgewotI2lmZGVmIFNUWVBfREVCVUcKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0RFQlVHOwotI2Vsc2UKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0lORk87Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJuY21wIChzZWNfbmFtZSwgIi5zdGFiIiwgNSkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfSU5GTzsKLSAgICB9Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfUEFEKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9QQUQ7Ci0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0xPQURFUikpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTE9BREVSOwotICAgIH0KLSNlbmRpZgotICAvKiBUcnkgYW5kIGZpZ3VyZSBvdXQgd2hhdCBpdCBzaG91bGQgYmUgKi8KLSAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX0NPREUpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfVEVYVDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19EQVRBKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0RBVEE7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfUkVBRE9OTFkpCi0gICAgewotI2lmZGVmIFNUWVBfTElUCQkJLyogMjlrIHJlYWRvbmx5IHRleHQvZGF0YSBzZWN0aW9uICovCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9MSVQ7Ci0jZWxzZQotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfVEVYVDsKLSNlbmRpZiAvKiBTVFlQX0xJVCAqLwotICAgIH0KLSAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX0xPQUQpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfVEVYVDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19BTExPQykKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9CU1M7Ci0gICAgfQotCi0jaWZkZWYgU1RZUF9OT0xPQUQKLSAgaWYgKChzZWNfZmxhZ3MgJiAoU0VDX05FVkVSX0xPQUQgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSkpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBTVFlQX05PTE9BRDsKLSNlbmRpZgotCi0gIHJldHVybiBzdHlwX2ZsYWdzOwotfQotCi0jZWxzZSAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotLyogVGhlIFBFIHZlcnNpb247IHNlZSBhYm92ZSBmb3IgdGhlIGdlbmVyYWwgY29tbWVudHMuICBUaGUgbm9uLVBFCi0gICBjYXNlIHNlZW1zIHRvIGJlIG1vcmUgZ3Vlc3NpbmcsIGFuZCBicmVha3MgUEUgZm9ybWF0OyBzcGVjaWZpY2FsbHksCi0gICAucmRhdGEgaXMgcmVhZG9ubHksIGJ1dCBpdCBzdXJlIGFpbid0IHRleHQuICBSZWFsbHksIGFsbCB0aGlzCi0gICBzaG91bGQgYmUgc2V0IHVwIHByb3Blcmx5IGluIGdhcyAob3Igd2hhdGV2ZXIgYXNzZW1ibGVyIGlzIGluIHVzZSksCi0gICBhbmQgaG9ub3Igd2hhdGV2ZXIgb2JqY29weS9zdHJpcCwgZXRjLiBzZW50IHVzIGFzIGlucHV0LiAgKi8KLQotc3RhdGljIGxvbmcKLXNlY190b19zdHlwX2ZsYWdzIChzZWNfbmFtZSwgc2VjX2ZsYWdzKQotICAgICBjb25zdCBjaGFyICpzZWNfbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmbGFnd29yZCBzZWNfZmxhZ3M7Ci17Ci0gIGxvbmcgc3R5cF9mbGFncyA9IDA7Ci0KLSAgLyogY2F1dGlvbjogdGhlcmUgYXJlIGF0IGxlYXN0IHRocmVlIGdyb3VwcyBvZiBzeW1ib2xzIHRoYXQgaGF2ZQotICAgICB2ZXJ5IHNpbWlsYXIgYml0cyBhbmQgbWVhbmluZ3M6IElNQUdFX1NDTiosIFNFQ18qLCBhbmQgU1RZUF8qLgotICAgICBTRUNfKiBhcmUgdGhlIEJGRCBpbnRlcm5hbCBmbGFncywgdXNlZCBmb3IgZ2VuZXJpYyBCRkQKLSAgICAgaW5mb3JtYXRpb24uICBTVFlQXyogYXJlIHRoZSBDT0ZGIHNlY3Rpb24gZmxhZ3Mgd2hpY2ggYXBwZWFyIGluCi0gICAgIENPRkYgZmlsZXMuICBJTUFHRV9TQ05fKiBhcmUgdGhlIFBFIHNlY3Rpb24gZmxhZ3Mgd2hpY2ggYXBwZWFyIGluCi0gICAgIFBFIGZpbGVzLiAgVGhlIFNUWVBfKiBmbGFncyBhbmQgdGhlIElNQUdFX1NDTl8qIGZsYWdzIG92ZXJsYXAsCi0gICAgIGJ1dCB0aGVyZSBhcmUgbW9yZSBJTUFHRV9TQ05fKiBmbGFncy4gICovCi0KLSAgLyogc2tpcCBMT0FEICovCi0gIC8qIFJFQURPTkxZIGxhdGVyICovCi0gIC8qIHNraXAgUkVMT0MgKi8KLSAgaWYgKChzZWNfZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9DTlRfQ09ERTsKLSAgaWYgKChzZWNfZmxhZ3MgJiBTRUNfREFUQSkgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQTsKLSAgaWYgKChzZWNfZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAgJiYgKHNlY19mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEE7ICAvKiA9PVNUWVBfQlNTICovCi0gIC8qIHNraXAgUk9NICovCi0gIC8qIHNraXAgQ09OU1RSVUNUT1IgKi8KLSAgLyogc2tpcCBDT05URU5UUyAqLwotI2lmZGVmIFNUWVBfTk9MT0FECi0gIGlmICgoc2VjX2ZsYWdzICYgKFNFQ19ORVZFUl9MT0FEIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLSAgaWYgKChzZWNfZmxhZ3MgJiBTRUNfSVNfQ09NTU9OKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX0xOS19DT01EQVQ7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEU7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0VYQ0xVREUpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTE5LX1JFTU9WRTsKLSAgaWYgKChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfUkVNT1ZFOwotICAvKiBza2lwIElOX01FTU9SWSAqLwotICAvKiBza2lwIFNPUlQgKi8KLSAgaWYgKHNlY19mbGFncyAmIFNFQ19MSU5LX09OQ0UpIAotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX0xOS19DT01EQVQ7IAotICAvKiBza2lwIExJTktfRFVQTElDQVRFUyAqLwotICAvKiBza2lwIExJTktFUl9DUkVBVEVEICovCi0KLSAgLyogRm9yIG5vdywgdGhlIHJlYWQvd3JpdGUgYml0cyBhcmUgbWFwcGVkIG9udG8gU0VDX1JFQURPTkxZLCBldmVuCi0gICAgIHRob3VnaCB0aGUgc2VtYW50aWNzIGRvbid0IHF1aXRlIG1hdGNoLiAgVGhlIGJpdHMgZnJvbSB0aGUgaW5wdXQKLSAgICAgYXJlIHJldGFpbmVkIGluIHBlaV9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjdGlvbiktPnBlX2ZsYWdzICovCi0KLSAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTUVNX1JFQUQ7ICAgICAgIC8qIGFsd2F5cyByZWFkYWJsZS4gKi8KLSAgaWYgKChzZWNfZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTUVNX1dSSVRFOyAgICAvKiBJbnZlcnQgUkVBRE9OTFkgZm9yIHdyaXRlICovCi0gIGlmIChzZWNfZmxhZ3MgJiBTRUNfQ09ERSkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9NRU1fRVhFQ1VURTsgIC8qIENPREUtPkVYRUNVVEUgKi8KLSAgaWYgKHNlY19mbGFncyAmIFNFQ19TSEFSRUQpCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTUVNX1NIQVJFRDsgICAvKiBTaGFyZWQgcmVtYWlucyBtZWFuaW5nZnVsICovCi0KLSAgcmV0dXJuIHN0eXBfZmxhZ3M7IAotfQotCi0jZW5kaWYgLyogQ09GRl9XSVRIX1BFICovCi0KLS8qIFJldHVybiBhIHdvcmQgd2l0aCBTRUNfKiBmbGFncyBzZXQgdG8gcmVwcmVzZW50IHRoZSBpbmNvbWluZyBTVFlQXyoKLSAgIGZsYWdzIChmcm9tIHNjbmhkci5zX2ZsYWdzKS4gIFRoZSBpbnZlcnNlIG9mIHRoaXMgZnVuY3Rpb24gaXMKLSAgIHNlY190b19zdHlwX2ZsYWdzKCkuICBOT1RFOiBJZiB5b3UgYWRkIHRvL2NoYW5nZSB0aGlzIHJvdXRpbmUsIHlvdQotICAgc2hvdWxkIHByb2JhYmx5IG1pcnJvciB0aGUgY2hhbmdlcyBpbiBzZWNfdG9fc3R5cF9mbGFncygpLiAgKi8KLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLQotc3RhdGljIGZsYWd3b3JkCi1zdHlwX3RvX3NlY19mbGFncyAoYWJmZCwgaGRyLCBuYW1lLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGhkcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaW50ZXJuYWxfcyA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGhkcjsKLSAgbG9uZyBzdHlwX2ZsYWdzID0gaW50ZXJuYWxfcy0+c19mbGFnczsKLSAgZmxhZ3dvcmQgc2VjX2ZsYWdzID0gMDsKLQotI2lmZGVmIFNUWVBfTk9MT0FECi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9OT0xPQUQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX05PTE9BRCAqLwotCi0gIC8qIEZvciAzODYgQ09GRiwgYXQgbGVhc3QsIGFuIHVubG9hZGFibGUgdGV4dCBvciBkYXRhIHNlY3Rpb24gaXMKLSAgICAgYWN0dWFsbHkgYSBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX1RFWFQpCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfREFUQSkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9CU1MpCi0gICAgewotI2lmZGVmIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfSU5GTykKLSAgICB7Ci0gICAgICAvKiBXZSBtYXJrIHRoZXNlIGFzIFNFQ19ERUJVR0dJTkcsIGJ1dCBvbmx5IGlmIENPRkZfUEFHRV9TSVpFIGlzCi0JIGRlZmluZWQuICBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyB1c2VzCi0JIENPRkZfUEFHRV9TSVpFIHRvIGVuc3VyZSB0aGF0IHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUKLQkgc2VjdGlvbiBWTUEgYW5kIHRoZSBmaWxlIG9mZnNldCBtYXRjaC4gIElmIHdlIGRvbid0IGtub3cKLQkgQ09GRl9QQUdFX1NJWkUsIHdlIGNhbid0IGVuc3VyZSB0aGUgY29ycmVjdCBjb3JyZXNwb25kZW5jZSwKLQkgYW5kIGRlbWFuZCBwYWdlIGxvYWRpbmcgb2YgdGhlIGZpbGUgd2lsbCBmYWlsLiAgKi8KLSNpZiBkZWZpbmVkIChDT0ZGX1BBR0VfU0laRSkgJiYgIWRlZmluZWQgKENPRkZfQUxJR05fSU5fU19GTEFHUykKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9QQUQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfREFUQSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0gICAgewotI2lmZGVmIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRlYnVnIikgPT0gMAotI2lmZGVmIF9DT01NRU5UCi0JICAgfHwgc3RyY21wIChuYW1lLCBfQ09NTUVOVCkgPT0gMAotI2VuZGlmCi0JICAgfHwgc3RybmNtcCAobmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICB7Ci0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotI2VuZGlmCi0gICAgfQotI2lmZGVmIF9MSUIKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElCKSA9PSAwKQotICAgIDsKLSNlbmRpZgotI2lmZGVmIF9MSVQKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUKSA9PSAwKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZOwotICAgIH0KLSNlbmRpZgotICBlbHNlCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICAgIH0KLQotI2lmZGVmIFNUWVBfTElUCQkJLyogQTI5ayByZWFkb25seSB0ZXh0L2RhdGEgc2VjdGlvbiB0eXBlICovCi0gIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfTElUKSA9PSBTVFlQX0xJVCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSAoU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFkpOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX0xJVCAqLwotI2lmZGVmIFNUWVBfT1RIRVJfTE9BRAkJLyogT3RoZXIgbG9hZGVkIHNlY3Rpb25zICovCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9PVEhFUl9MT0FEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IChTRUNfTE9BRCB8IFNFQ19BTExPQyk7Ci0gICAgfQotI2VuZGlmIC8qIFNUWVBfU0RBVEEgKi8KLQotI2lmIGRlZmluZWQgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKSAmJiBkZWZpbmVkIChDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFKQotICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIGlmIHRoZSBuYW1lIGJlZ2lucyB3aXRoIC5nbnUubGlua29uY2UsIHdlCi0gICAgIG9ubHkgbGluayBhIHNpbmdsZSBjb3B5IG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQKLSAgICAgZysrLiAgZysrIHdpbGwgZW1pdCBlYWNoIHRlbXBsYXRlIGV4cGFuc2lvbiBpbiBpdHMgb3duIHNlY3Rpb24uCi0gICAgIFRoZSBzeW1ib2xzIHdpbGwgYmUgZGVmaW5lZCBhcyB3ZWFrLCBzbyB0aGF0IG11bHRpcGxlIGRlZmluaXRpb25zCi0gICAgIGFyZSBwZXJtaXR0ZWQuICBUaGUgR05VIGxpbmtlciBleHRlbnNpb24gaXMgdG8gYWN0dWFsbHkgZGlzY2FyZAotICAgICBhbGwgYnV0IG9uZSBvZiB0aGUgc2VjdGlvbnMuICAqLwotICBpZiAoc3RybmNtcCAobmFtZSwgIi5nbnUubGlua29uY2UiLCBzaXplb2YgIi5nbnUubGlua29uY2UiIC0gMSkgPT0gMCkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLSNlbmRpZgotCi0gIHJldHVybiBzZWNfZmxhZ3M7Ci19Ci0KLSNlbHNlIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBUaGUgUEUgdmVyc2lvbjsgc2VlIGFib3ZlIGZvciB0aGUgZ2VuZXJhbCBjb21tZW50cy4KLQotICAgU2luY2UgdG8gc2V0IHRoZSBTRUNfTElOS19PTkNFIGFuZCBhc3NvY2lhdGVkIGZsYWdzLCB3ZSBoYXZlIHRvCi0gICBsb29rIGF0IHRoZSBzeW1ib2wgdGFibGUgYW55d2F5LCB3ZSByZXR1cm4gdGhlIHN5bWJvbCB0YWJsZSBpbmRleAotICAgb2YgdGhlIHN5bWJvbCBiZWluZyB1c2VkIGFzIHRoZSBDT01EQVQgc3ltYm9sLiAgVGhpcyBpcyBhZG1pdHRlZGx5Ci0gICB1Z2x5LCBidXQgdGhlcmUncyByZWFsbHkgbm93aGVyZSBlbHNlIHRoYXQgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhlCi0gICByZXF1aXJlZCBpbmZvcm1hdGlvbi4gIEZJWE1FOiBJcyB0aGUgQ09NREFUIHN5bWJvbCBpbmRleCB1c2VkIGZvcgotICAgYW55IHB1cnBvc2Ugb3RoZXIgdGhhbiBvYmpkdW1wPyAgKi8KLQotc3RhdGljIGZsYWd3b3JkCi1zdHlwX3RvX3NlY19mbGFncyAoYWJmZCwgaGRyLCBuYW1lLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGhkcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmludGVybmFsX3MgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBoZHI7Ci0gIGxvbmcgc3R5cF9mbGFncyA9IGludGVybmFsX3MtPnNfZmxhZ3M7Ci0gIGZsYWd3b3JkIHNlY19mbGFncyA9IDA7Ci0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0RTRUNUKQotICAgIGFib3J0ICgpOyAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0jaWZkZWYgU0VDX05FVkVSX0xPQUQKLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX05PTE9BRCkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX05FVkVSX0xPQUQ7Ci0jZW5kaWYKLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0dST1VQKQotICAgIGFib3J0ICgpOyAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0gIC8qIHNraXAgSU1BR0VfU0NOX1RZUEVfTk9fUEFEICovCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9DT1BZKQotICAgIGFib3J0ICgpOyAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0NOVF9DT0RFKQotICAgIHNlY19mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9MTktfT1RIRVIpCi0gICAgYWJvcnQgKCk7ICAvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX0lORk8pCi0gICAgewotICAgICAgLyogV2UgbWFyayB0aGVzZSBhcyBTRUNfREVCVUdHSU5HLCBidXQgb25seSBpZiBDT0ZGX1BBR0VfU0laRSBpcwotCSBkZWZpbmVkLiAgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgdXNlcwotCSBDT0ZGX1BBR0VfU0laRSB0byBlbnN1cmUgdGhhdCB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlCi0JIHNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBvZmZzZXQgbWF0Y2guICBJZiB3ZSBkb24ndCBrbm93Ci0JIENPRkZfUEFHRV9TSVpFLCB3ZSBjYW4ndCBlbnN1cmUgdGhlIGNvcnJlY3QgY29ycmVzcG9uZGVuY2UsCi0JIGFuZCBkZW1hbmQgcGFnZSBsb2FkaW5nIG9mIHRoZSBmaWxlIHdpbGwgZmFpbC4gICovCi0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotI2VuZGlmCi0gICAgfQotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfT1ZFUikKLSAgICBhYm9ydCAoKTsgIC8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9MTktfUkVNT1ZFKQotICAgIHNlY19mbGFncyB8PSBTRUNfRVhDTFVERTsKLQotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fU0hBUkVEKQotICAgIHNlY19mbGFncyB8PSBTRUNfU0hBUkVEOwotICAvKiBDT01EQVQ6IHNlZSBiZWxvdyAqLwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7Ci0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX01FTV9OT1RfQ0FDSEVEKQotICAgIGFib3J0ICgpOy8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fTk9UX1BBR0VEKQotICAgIGFib3J0ICgpOyAvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KLQotICAvKiBXZSBpbmZlciBmcm9tIHRoZSBkaXN0aW5jdCByZWFkL3dyaXRlL2V4ZWN1dGUgYml0cyB0aGUgc2V0dGluZ3MKLSAgICAgb2Ygc29tZSBvZiB0aGUgYmZkIGZsYWdzOyB0aGUgYWN0dWFsIHZhbHVlcywgc2hvdWxkIHdlIG5lZWQgdGhlbSwKLSAgICAgYXJlIGFsc28gaW4gcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnBlX2ZsYWdzLiAgKi8KLQotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fRVhFQ1VURSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPREU7ICAgLyogUHJvYmFibHkgcmVkdW5kYW50ICovCi0gIC8qIElNQUdFX1NDTl9NRU1fUkVBRCBpcyBzaW1wbHkgaWdub3JlZCwgYXNzdW1pbmcgaXQgYWx3YXlzIHRvIGJlIHRydWUuICovCi0gIGlmICgoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fV1JJVEUpID09IDApCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQotICAvKiBDT01EQVQgZ2V0cyB2ZXJ5IHNwZWNpYWwgdHJlYXRtZW50LiAgKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX0NPTURBVCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfT05DRTsKLQotICAgICAgLyogVW5mb3J0dW5hdGVseSwgdGhlIFBFIGZvcm1hdCBzdG9yZXMgZXNzZW50aWFsIGluZm9ybWF0aW9uIGluCi0gICAgICAgICB0aGUgc3ltYm9sIHRhYmxlLCBvZiBhbGwgcGxhY2VzLiAgV2UgbmVlZCB0byBleHRyYWN0IHRoYXQKLSAgICAgICAgIGluZm9ybWF0aW9uIG5vdywgc28gdGhhdCBvYmpkdW1wIGFuZCB0aGUgbGlua2VyIHdpbGwga25vdyBob3cKLSAgICAgICAgIHRvIGhhbmRsZSB0aGUgc2VjdGlvbiB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHRoZSBzeW1ib2xzLiAgV2UKLSAgICAgICAgIGNhbid0IGNhbGwgc2x1cnBfc3ltdGFiLCBiZWNhdXNlIHRoZSBsaW5rZXIgZG9lc24ndCB3YW50IHRoZQotICAgICAgICAgc3dhcHBlZCBzeW1ib2xzLiAgKi8KLQotICAgICAgLyogQ09NREFUIHNlY3Rpb25zIGFyZSBzcGVjaWFsLiAgVGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgc2VjdGlvbgotCSBzeW1ib2wsIHdoaWNoIHRlbGxzIHdoYXQga2luZCBvZiBDT01EQVQgc2VjdGlvbiBpdCBpcy4gIFRoZQotCSBzZWNvbmQgc3ltYm9sIGlzIHRoZSAiY29tZGF0IHN5bWJvbCIgLSB0aGUgb25lIHdpdGggdGhlCi0JIHVuaXF1ZSBuYW1lLiAgR05VIHVzZXMgdGhlIHNlY3Rpb24gc3ltYm9sIGZvciB0aGUgdW5pcXVlCi0JIG5hbWU7IE1TIHVzZXMgIi50ZXh0IiBmb3IgZXZlcnkgY29tZGF0IHNlY3Rpb24uICBTaWdoLiAgLSBESiAqLwotCi0gICAgICAvKiBUaGlzIGlzIG5vdCBtaXJyb3JlZCBpbiBzZWNfdG9fc3R5cF9mbGFncygpLCBidXQgdGhlcmUKLQkgZG9lc24ndCBzZWVtIHRvIGJlIGEgbmVlZCB0bywgZWl0aGVyLCBhbmQgaXQgd291bGQgYXQgYmVzdCBiZQotCSByYXRoZXIgbWVzc3kuICAqLwotCi0gICAgICBpZiAoX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLQl7Ci0JICBiZmRfYnl0ZSAqZXN5bXN0YXJ0LCAqZXN5bSwgKmVzeW1lbmQ7Ci0JICBpbnQgc2Vlbl9zdGF0ZSA9IDA7Ci0JICBjaGFyICp0YXJnZXRfbmFtZSA9IE5VTEw7Ci0KLQkgIGVzeW1zdGFydCA9IGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0JICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0KLQkgIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLQkgICAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWU7Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJmlzeW0pOwotCi0JICAgICAgaWYgKHNpemVvZiAoaW50ZXJuYWxfcy0+c19uYW1lKSA+IFNZTU5NTEVOKQotCQl7Ci0JCSAgLyogVGhpcyBjYXNlIGltcGxpZXMgdGhhdCB0aGUgbWF0Y2hpbmcgc3ltYm9sIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlmIChpc3ltLm5fc2NudW0gPT0gc2VjdGlvbi0+dGFyZ2V0X2luZGV4KQotCQl7Ci0JCSAgLyogQWNjb3JkaW5nIHRvIHRoZSBNU1ZDIGRvY3VtZW50YXRpb24sIHRoZSBmaXJzdAotCQkgICAgIFRXTyBlbnRyaWVzIHdpdGggdGhlIHNlY3Rpb24gIyBhcmUgYm90aCBvZgotCQkgICAgIGludGVyZXN0IHRvIHVzLiAgVGhlIGZpcnN0IG9uZSBpcyB0aGUgInNlY3Rpb24KLQkJICAgICBzeW1ib2wiIChzZWN0aW9uIG5hbWUpLiAgVGhlIHNlY29uZCBpcyB0aGUgY29tZGF0Ci0JCSAgICAgc3ltYm9sIG5hbWUuICBIZXJlLCB3ZSd2ZSBmb3VuZCB0aGUgZmlyc3QKLQkJICAgICBxdWFsaWZ5aW5nIGVudHJ5OyB3ZSBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZQotCQkgICAgIHNlY29uZCB3aXRoIGEgc3RhdGUgZmxhZy4KLQotCQkgICAgIEluIHRoZSBjYXNlIG9mIGdhcy1nZW5lcmF0ZWQgKGF0IGxlYXN0IHVudGlsIHRoYXQKLQkJICAgICBpcyBmaXhlZCkgLm8gZmlsZXMsIGl0IGlzbid0IG5lY2Vzc2FyaWx5IHRoZQotCQkgICAgIHNlY29uZCBvbmUuICBJdCBtYXkgYmUgc29tZSBvdGhlciBsYXRlciBzeW1ib2wuCi0KLQkJICAgICBTaW5jZSBnYXMgYWxzbyBkb2Vzbid0IGZvbGxvdyBNUyBjb252ZW50aW9ucyBhbmQKLQkJICAgICBlbWl0cyB0aGUgc2VjdGlvbiBzaW1pbGFyIHRvIC50ZXh0JDxuYW1lPiwgd2hlcmUKLQkJICAgICA8c29tZXRoaW5nPiBpcyB0aGUgbmFtZSB3ZSdyZSBsb29raW5nIGZvciwgd2UKLQkJICAgICBkaXN0aW5ndWlzaCB0aGUgdHdvIGFzIGZvbGxvd3M6Ci0KLQkJICAgICBJZiB0aGUgc2VjdGlvbiBuYW1lIGlzIHNpbXBseSBhIHNlY3Rpb24gbmFtZSAobm8KLQkJICAgICAkKSB3ZSBwcmVzdW1lIGl0J3MgTVMtZ2VuZXJhdGVkLCBhbmQgbG9vayBhdAotCQkgICAgIHByZWNpc2VseSB0aGUgc2Vjb25kIHN5bWJvbCBmb3IgdGhlIGNvbWRhdCBuYW1lLgotCQkgICAgIElmIHRoZSBzZWN0aW9uIG5hbWUgaGFzIGEgJCwgd2UgYXNzdW1lIGl0J3MKLQkJICAgICBnYXMtZ2VuZXJhdGVkLCBhbmQgbG9vayBmb3IgPHNvbWV0aGluZz4gKHdoYXRldmVyCi0JCSAgICAgZm9sbG93cyB0aGUgJCkgYXMgdGhlIGNvbWRhdCBzeW1ib2wuICAqLwotCi0JCSAgLyogQWxsIDMgYnJhbmNoZXMgdXNlIHRoaXMgKi8KLQkJICBzeW1uYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmaXN5bSwgYnVmKTsKLQotCQkgIGlmIChzeW1uYW1lID09IE5VTEwpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIHN3aXRjaCAoc2Vlbl9zdGF0ZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgewotCQkJLyogVGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGUgc3ltYm9sLiAgKi8KLQkJCXVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLQkJCXNlZW5fc3RhdGUgPSAxOwotCi0JCQkvKiBJZiBpdCBpc24ndCB0aGUgc3R1ZmYgd2UncmUgZXhwZWN0aW5nLCBkaWU7Ci0JCQkgICBUaGUgTVMgZG9jdW1lbnRhdGlvbiBpcyB2YWd1ZSwgYnV0IGl0Ci0JCQkgICBhcHBlYXJzIHRoYXQgdGhlIHNlY29uZCBlbnRyeSBzZXJ2ZXMgQk9USAotCQkJICAgYXMgdGhlIGNvbWRhdCBzeW1ib2wgYW5kIHRoZSBkZWZpbmluZwotCQkJICAgc3ltYm9sIHJlY29yZCAoZWl0aGVyIENfU1RBVCBvciBDX0VYVCwKLQkJCSAgIHBvc3NpYmx5IHdpdGggYW4gYXV4IGVudHJ5IHdpdGggZGVidWcKLQkJCSAgIGluZm9ybWF0aW9uIGlmIGl0J3MgYSBmdW5jdGlvbi4pICBJdAotCQkJICAgYXBwZWFycyB0aGUgb25seSB3YXkgdG8gZmluZCB0aGUgc2Vjb25kIG9uZQotCQkJICAgaXMgdG8gY291bnQuICAoT24gSW50ZWwsIHRoZXkgYXBwZWFyIHRvIGJlCi0JCQkgICBhZGphY2VudCwgYnV0IG9uIEFscGhhLCB0aGV5IGhhdmUgYmVlbgotCQkJICAgZm91bmQgc2VwYXJhdGVkLikKLQotCQkJICAgSGVyZSwgd2UgdGhpbmsgd2UndmUgZm91bmQgdGhlIGZpcnN0IG9uZSwKLQkJCSAgIGJ1dCB0aGVyZSdzIHNvbWUgY2hlY2tpbmcgd2UgY2FuIGRvIHRvIGJlCi0JCQkgICBzdXJlLiAgKi8KLQotCQkJaWYgKCEgKGlzeW0ubl9zY2xhc3MgPT0gQ19TVEFUCi0JCQkgICAgICAgJiYgaXN5bS5uX3R5cGUgPT0gVF9OVUxMCi0JCQkgICAgICAgJiYgaXN5bS5uX3ZhbHVlID09IDApKQotCQkJICBhYm9ydCAoKTsKLQotCQkJLyogRklYTUUgTEFURVI6IE1TVkMgZ2VuZXJhdGVzIHNlY3Rpb24gbmFtZXMKLQkJCSAgIGxpa2UgLnRleHQgZm9yIGNvbWRhdHMuICBHYXMgZ2VuZXJhdGVzCi0JCQkgICBuYW1lcyBsaWtlIC50ZXh0JGZvb19fRnYgKGluIHRoZSBjYXNlIG9mIGEKLQkJCSAgIGZ1bmN0aW9uKS4gIFNlZSBjb21tZW50IGFib3ZlIGZvciBtb3JlLiAgKi8KLQotCQkJaWYgKHN0cmNtcCAobmFtZSwgc3ltbmFtZSkgIT0gMCkKLQkJCSAgYWJvcnQgKCk7Ci0gIAotCQkJLyogVGhpcyBpcyB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCi0JCQliZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgKGVzeW0gKyBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSwKLQkJCQkJICAgICAgaXN5bS5uX3R5cGUsIGlzeW0ubl9zY2xhc3MsCi0JCQkJCSAgICAgIDAsIGlzeW0ubl9udW1hdXgsIChQVFIpICZhdXgpOwotCi0JCQl0YXJnZXRfbmFtZSA9IHN0cmNociAobmFtZSwgJyQnKTsKLQkJCWlmICh0YXJnZXRfbmFtZSAhPSBOVUxMKQotCQkJICB7Ci0JCQkgICAgLyogR2FzIG1vZGUuICAqLwotCQkJICAgIHNlZW5fc3RhdGUgPSAyOwotCQkJICAgIC8qIFNraXAgdGhlIGAkJy4gICovCi0JCQkgICAgdGFyZ2V0X25hbWUgKz0gMTsKLQkJCSAgfQotCi0JCQkvKiBGSVhNRTogTWljcm9zb2Z0IHVzZXMgTk9EVVBMSUNBVEVTIGFuZAotCQkJICAgQVNTT0NJQVRJVkUsIGJ1dCBnbnUgdXNlcyBBTlkgYW5kCi0JCQkgICBTQU1FX1NJWkUuICBVbmZvcnR1bmF0ZWx5LCBnbnUgZG9lc24ndCBkbwotCQkJICAgdGhlIGNvbWRhdCBzeW1ib2xzIHJpZ2h0LiAgU28sIHVudGlsIHdlIGNhbgotCQkJICAgZml4IGl0IHRvIGRvIHRoZSByaWdodCB0aGluZywgd2UgYXJlCi0JCQkgICB0ZW1wb3JhcmlseSBkaXNhYmxpbmcgY29tZGF0cyBmb3IgdGhlIE1TCi0JCQkgICB0eXBlcyAodGhleSdyZSB1c2VkIGluIERMTHMgYW5kIEMrKywgYnV0IHdlCi0JCQkgICBkb24ndCBzdXBwb3J0ICp0aGVpciogQysrIGxpYnJhcmllcyBhbnl3YXkKLQkJCSAgIC0gREouICAqLwotCi0JCQkvKiBDeWd3aW4gZG9lcyBub3QgZm9sbG93IHRoZSBNUyBzdHlsZSwgYW5kCi0JCQkgICB1c2VzIEFOWSBhbmQgU0FNRV9TSVpFIHdoZXJlIE5PRFVQTElDQVRFUwotCQkJICAgYW5kIEFTU09DSUFUSVZFIHNob3VsZCBiZSB1c2VkLiAgRm9yCi0JCQkgICBJbnRlcml4LCB3ZSBqdXN0IGRvIHRoZSByaWdodCB0aGluZyB1cAotCQkJICAgZnJvbnQuICAqLwotCi0JCQlzd2l0Y2ggKGF1eC54X3Njbi54X2NvbWRhdCkKLQkJCSAgewotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTOgotI2lmZGVmIFNUUklDVF9QRV9GT1JNQVQgCi0JCQkgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk7Ci0jZWxzZQotCQkJICAgIHNlY19mbGFncyAmPSB+U0VDX0xJTktfT05DRTsKLSNlbmRpZgotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgSU1BR0VfQ09NREFUX1NFTEVDVF9BTlk6Ci0JCQkgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfU0FNRV9TSVpFOgotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRTsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0g6Ci0JCQkgICAgLyogTm90IHlldCBmdWxseSBpbXBsZW1lbnRlZCA/Pz8gKi8KLQkJCSAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIC8qIGRlYnVnJFMgZ2V0cyB0aGlzIGNhc2U7IG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2F0aW9ucyA/Pz8gKi8KLQotCQkJICAvKiBUaGVyZSBtYXkgYmUgbm8gc3ltYm9sLi4uIHdlJ2xsIHNlYXJjaAotCQkJICAgICB0aGUgd2hvbGUgdGFibGUuLi4gSXMgdGhpcyB0aGUgcmlnaHQKLQkJCSAgICAgcGxhY2UgdG8gcGxheSB0aGlzIGdhbWU/IE9yIHNob3VsZCB3ZSBkbwotCQkJICAgICBpdCB3aGVuIHJlYWRpbmcgaXQgaW4uICAqLwotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkU6Ci0jaWZkZWYgU1RSSUNUX1BFX0ZPUk1BVAotCQkJICAgIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuICAqLwotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0jZWxzZQotCQkJICAgIHNlY19mbGFncyAmPSB+U0VDX0xJTktfT05DRTsKLSNlbmRpZgotCQkJICAgIGJyZWFrOwotCi0JCQkgIGRlZmF1bHQ6ICAvKiAwIG1lYW5zICJubyBzeW1ib2wiICovCi0JCQkgICAgLyogZGVidWckRiBnZXRzIHRoaXMgY2FzZTsgb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNhdGlvbnMgPz8/ICovCi0JCQkgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCSAJICAgICAgfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAyOgotCQkgICAgICAvKiBHYXMgbW9kZTogdGhlIGZpcnN0IG1hdGNoaW5nIG9uIHBhcnRpYWwgbmFtZS4gICovCi0KLSNpZm5kZWYgVEFSR0VUX1VOREVSU0NPUkUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgMAotI2VuZGlmCi0JCSAgICAgIC8qIElzIHRoaXMgdGhlIG5hbWUgd2UncmUgbG9va2luZyBmb3I/ICovCi0JCSAgICAgIGlmIChzdHJjbXAgKHRhcmdldF9uYW1lLCAKLQkJCQkgIHN5bW5hbWUgKyAoVEFSR0VUX1VOREVSU0NPUkUgPyAxIDogMCkpICE9IDApCi0JCQl7Ci0JCQkgICAgLyogTm90IHRoZSBuYW1lIHdlJ3JlIGxvb2tpbmcgZm9yICovCi0JICAgICAgICAgICAgICAgICAgICBlc3ltICs9IChpc3ltLm5fbnVtYXV4ICsgMSkgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotCQkJICAgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCQkgICAgY2FzZSAxOiAKLQkJICAgICAgLyogTVNWQyBtb2RlOiB0aGUgbGV4aWNhbGx5IHNlY29uZCBzeW1ib2wgKG9yCi0JCQkgZHJvcCB0aHJvdWdoIGZyb20gdGhlIGFib3ZlKS4gICovCi0JCSAgICAgIHsKLQkJICAgICAgICBjaGFyICpuZXduYW1lOwotCi0JCQkvKiBUaGlzIG11c3QgdGhlIHRoZSBzZWNvbmQgc3ltYm9sIHdpdGggdGhlCi0JCQkgICBzZWN0aW9uICMuICBJdCBpcyB0aGUgYWN0dWFsIHN5bWJvbCBuYW1lLgotCQkJICAgSW50ZWwgcHV0cyB0aGUgdHdvIGFkamFjZW50LCBidXQgQWxwaGEgKGF0Ci0JCQkgICBsZWFzdCkgc3ByZWFkcyB0aGVtIG91dC4gICovCi0KLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQgPSAKLQkJCSAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfY29tZGF0X2luZm8pKTsKLQkJICAgICAgICBpZiAoc2VjdGlvbi0+Y29tZGF0ID09IE5VTEwpCi0JCSAgICAgICAgICBhYm9ydCAoKTsKLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQtPnN5bWJvbCA9Ci0JCQkgIChlc3ltIC0gZXN5bXN0YXJ0KSAvIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0KLQkJICAgICAgICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN5bW5hbWUpICsgMSk7Ci0JCSAgICAgICAgaWYgKG5ld25hbWUgPT0gTlVMTCkKLQkJICAgICAgICAgIGFib3J0ICgpOwotCi0JCSAgICAgICAgc3RyY3B5IChuZXduYW1lLCBzeW1uYW1lKTsKLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQtPm5hbWUgPSBuZXduYW1lOwotCi0JCSAgICAgIH0KLQotCQkgICAgICBnb3RvIGJyZWFrbG9vcDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZXN5bSArPSAoaXN5bS5uX251bWF1eCArIDEpICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQkgICAgfQotCSAgYnJlYWtsb29wOgotCX0KLSAgICB9Ci0KLSNpZiBkZWZpbmVkIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUykgJiYgZGVmaW5lZCAoQ09GRl9TVVBQT1JUX0dOVV9MSU5LT05DRSkKLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBpZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCAuZ251LmxpbmtvbmNlLCB3ZQotICAgICBvbmx5IGxpbmsgYSBzaW5nbGUgY29weSBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0Ci0gICAgIGcrKy4gIGcrKyB3aWxsIGVtaXQgZWFjaCB0ZW1wbGF0ZSBleHBhbnNpb24gaW4gaXRzIG93biBzZWN0aW9uLgotICAgICBUaGUgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgYXMgd2Vhaywgc28gdGhhdCBtdWx0aXBsZSBkZWZpbml0aW9ucwotICAgICBhcmUgcGVybWl0dGVkLiAgVGhlIEdOVSBsaW5rZXIgZXh0ZW5zaW9uIGlzIHRvIGFjdHVhbGx5IGRpc2NhcmQKLSAgICAgYWxsIGJ1dCBvbmUgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251LmxpbmtvbmNlIiwgc2l6ZW9mICIuZ251LmxpbmtvbmNlIiAtIDEpID09IDApCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0jZW5kaWYKLQotICByZXR1cm4gc2VjX2ZsYWdzOwotfQotCi0jZW5kaWYgLyogQ09GRl9XSVRIX1BFICovCi0KLSNkZWZpbmUJZ2V0X2luZGV4KHN5bWJvbCkJKChzeW1ib2wpLT51ZGF0YS5pKQotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWJmZF9jb2ZmX2JhY2tlbmRfZGF0YQotCi1DT0RFX0ZSQUdNRU5UCi0KLS57KiBDT0ZGIHN5bWJvbCBjbGFzc2lmaWNhdGlvbnMuICAqfQotLgotLmVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24KLS57Ci0uICB7KiBHbG9iYWwgc3ltYm9sLiAgKn0KLS4gIENPRkZfU1lNQk9MX0dMT0JBTCwKLS4gIHsqIENvbW1vbiBzeW1ib2wuICAqfQotLiAgQ09GRl9TWU1CT0xfQ09NTU9OLAotLiAgeyogVW5kZWZpbmVkIHN5bWJvbC4gICp9Ci0uICBDT0ZGX1NZTUJPTF9VTkRFRklORUQsCi0uICB7KiBMb2NhbCBzeW1ib2wuICAqfQotLiAgQ09GRl9TWU1CT0xfTE9DQUwsCi0uICB7KiBQRSBzZWN0aW9uIHN5bWJvbC4gICp9Ci0uICBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OCi0ufTsKLS4KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnZGIgdG8gc3dhcCBpbiBjb2ZmIHN5bWJvbCB0YWJsZSBwYXJ0czoKLS50eXBlZGVmIHN0cnVjdAotLnsKLS4gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLS4gICAgICAgaW50ICAgICAgICAgICAgIHR5cGUsCi0uICAgICAgIGludCAgICAgICAgICAgICBjbGFzcywKLS4gICAgICAgaW50ICAgICAgICAgICAgIGluZGF1eCwKLS4gICAgICAgaW50ICAgICAgICAgICAgIG51bWF1eCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0uCi0uICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc3ltX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQgLAotLiAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotLiAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLS4KLS4gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICAgICAgICAgZXh0LAotLiAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLS4KLQotU3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIGdhcyB0byBzd2FwIG91dCBjb2ZmIHBhcnRzOgotCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAJKmFiZmQsCi0uICAgICAgIFBUUglpbiwKLS4gICAgICAgaW50ICAgIAl0eXBlLAotLiAgICAgICBpbnQgICAgCWNsYXNzLAotLiAgICAgICBpbnQgICAgIGluZGF1eCwKLS4gICAgICAgaW50ICAgICBudW1hdXgsCi0uICAgICAgIFBUUiAgICAJZXh0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIFBBUkFNUyAoKAotLiAgICAgIGJmZCAgICAgICphYmZkLAotLiAgICAgIFBUUglpbiwKLS4gICAgICBQVFIJZXh0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgICAJKmFiZmQsCi0uICAgICAgCVBUUglpbiwKLS4JUFRSCWV4dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgICAgICphYmZkLAotLiAgICAgCVBUUglzcmMsCi0uCVBUUglkc3QpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgIAkqYWJmZCwKLS4JUFRSIAlpbiwKLS4JUFRSIAlvdXQpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgCSphYmZkLAotLglQVFIgCWluLAotLglQVFIJb3V0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgIAkqYWJmZCwKLS4gICAgICAJUFRSCWluLAotLglQVFIJb3V0KSk7Ci0uCi0KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnZW5lcmljIENPRkYgcm91dGluZXMgdG8gY2FsbCB0YXJnZXQKLWRlcGVuZGVudCBDT0ZGIHJvdXRpbmVzOgotCi0uIHVuc2lnbmVkIGludCBfYmZkX2ZpbGhzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfYW91dHN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9zY25oc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX3N5bWVzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfYXV4ZXN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9yZWxzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfbGluZXN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9maWxubWxlbjsKLS4gYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19maWxlbmFtZXM7Ci0uIGJvb2xlYW4gX2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lczsKLS4gdW5zaWduZWQgaW50IF9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgZXh0LAotLiAgICAgICBQVFIgICAgIGluKSk7Ci0uIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgaW4pKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgZXh0LAotLiAgICAgICBQVFIgICAgIGluKSk7Ci0uIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgZXh0LAotLiAgICAgICBQVFIgICAgIGluKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7Ci0uIFBUUiAoKl9iZmRfY29mZl9ta29iamVjdF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX2FvdXRoZHIpKTsKLS4gZmxhZ3dvcmQgKCpfYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX3NjbmhkciwKLS4gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLS4gICAgICAgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLS4gdm9pZCAoKl9iZmRfc2V0X2FsaWdubWVudF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgYXNlY3Rpb24gKnNlYywKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIpKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2UsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbCwKLS4gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4KSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfcHJpbnRfYXV4KSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBGSUxFICpmaWxlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCwKLS4gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCkpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0uICAgICAgIGFyZWxlbnQgKnJlbG9jLAotLiAgICAgICBiZmRfYnl0ZSAqZGF0YSwKLS4gICAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyLAotLiAgICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHIpKTsKLS4gaW50ICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotLiAgICAgICBhcmVsZW50ICpyLAotLiAgICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7Ci0uIGVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24gKCpfYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQpKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICpvdXRwdXRfYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotLiAgICAgICBiZmQgKmlucHV0X2JmZCwKLS4gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0uICAgICAgIGJmZF9ieXRlICpjb250ZW50cywKLS4gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3MsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXMsCi0uICAgICAgIGFzZWN0aW9uICoqc2VjdGlvbnMpKTsKLS4gcmVsb2NfaG93dG9fdHlwZSAqKCpfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGFzZWN0aW9uICpzZWMsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLAotLiAgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmgsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSwKLS4gICAgICAgYmZkX3ZtYSAqYWRkZW5kcCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKm9iZmQsCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotLiAgICAgICBiZmQgKmliZmQsCi0uICAgICAgIGFzZWN0aW9uICpzZWMsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2MsCi0uICAgICAgIGJvb2xlYW4gKmFkanVzdGVkcCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpIFBBUkFNUyAoKAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBjb25zdCBjaGFyICpuYW1lLAotLiAgICAgICBmbGFnd29yZCBmbGFncywgCi0uICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotLiAgICAgICBiZmRfdm1hIHZhbHVlLAotLiAgICAgICBjb25zdCBjaGFyICpzdHJpbmcsCi0uICAgICAgIGJvb2xlYW4gY29weSwKLS4gICAgICAgYm9vbGVhbiBjb2xsZWN0LCAKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocCkpOwotLgotLiBib29sZWFuICgqX2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgUEFSQU1TICgoCi0uCWJmZCAqIGFiZmQsCi0uICAgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgUEFSQU1TICgoCi0uCWJmZCAqIGFiZmQsCi0uCXN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOwotLgotLn0gYmZkX2NvZmZfYmFja2VuZF9kYXRhOwotLgotLiNkZWZpbmUgY29mZl9iYWNrZW5kX2luZm8oYWJmZCkgKChiZmRfY29mZl9iYWNrZW5kX2RhdGEgKikgKGFiZmQpLT54dmVjLT5iYWNrZW5kX2RhdGEpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9pbihhLGUsdCxjLGluZCxudW0saSkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX2F1eF9pbikgKGEsZSx0LGMsaW5kLG51bSxpKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX2luKGEsZSxpKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfc3ltX2luKSAoYSxlLGkpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4oYSxlLGkpIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKCBhKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSAoYSxlLGkpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQoYWJmZCwgaSwgbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KGFiZmQsIGksIG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9vdXQoYSxpLHQsYyxpbmQsbnVtLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSAoYSxpLHQsYyxpbmQsbnVtLG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1fb3V0KGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9maWxoc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9maWxoc3opCi0uI2RlZmluZSBiZmRfY29mZl9hb3V0c3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9hb3V0c3opCi0uI2RlZmluZSBiZmRfY29mZl9zY25oc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zY25oc3opCi0uI2RlZmluZSBiZmRfY29mZl9zeW1lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zeW1lc3opCi0uI2RlZmluZSBiZmRfY29mZl9hdXhlc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9hdXhlc3opCi0uI2RlZmluZSBiZmRfY29mZl9yZWxzeihhYmZkKSAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9yZWxzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX2xpbmVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2xpbmVzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX2ZpbG5tbGVuKGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfZmlsbm1sZW4pCi0uI2RlZmluZSBiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyhhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMpCi0uI2RlZmluZSBiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMoYWJmZCkgXAotLiAgICAgICAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcykKLS4jZGVmaW5lIGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIoYWJmZCkgXAotLgkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIpCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4oYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19pbihhYmZkLCBpLCBvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vayhhYmZkLCBmaWxlaGRyKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgKGFiZmQsIGZpbGVoZHIpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKGFiZmQsIGZpbGVoZHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX21rb2JqZWN0X2hvb2soYWJmZCwgZmlsZWhkciwgYW91dGhkcilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2soYWJmZCwgc2NuaGRyLCBuYW1lLCBzZWN0aW9uKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spXAotLiAgICAgICAgIChhYmZkLCBzY25oZHIsIG5hbWUsIHNlY3Rpb24pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc2V0X2FsaWdubWVudF9ob29rKGFiZmQsIHNlYywgc2NuaGRyKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgKGFiZmQsIHNlYywgc2NuaGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZShhYmZkKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKGFiZmQsIHN5bSlcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIChhYmZkLCBzeW0pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfcHJpbnRfYXV4KGFiZmQsIGZpbGUsIGJhc2UsIHN5bWJvbCwgYXV4LCBpbmRhdXgpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9wcmludF9hdXgpXAotLiAgICAgICAgIChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpXAotLiAgICAgICAgIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSlcCi0uICAgICAgICAgKGFiZmQsIHNlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2woYWJmZCwgc3ltKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKVwKLS4gICAgICAgICAoYWJmZCwgc3ltKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyhhYmZkKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKVwKLS4gICAgICAgICAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rKG9iZmQsIGluZm8pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAob2JmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKVwKLS4gICAgICAgICAob2JmZCwgaW5mbykpCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKG9iZmQsaW5mbyxpYmZkLG8sY29uLHJlbCxpc3ltcyxzZWNzKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGliZmQpLT5fYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbilcCi0uICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIG8sIGNvbiwgcmVsLCBpc3ltcywgc2VjcykpCi0uI2RlZmluZSBiZmRfY29mZl9ydHlwZV90b19ob3d0byhhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pXAotLiAgICAgICAgIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX2FkanVzdF9zeW1uZHgob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpXAotLiAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2woaW5mbyxhYmZkLG5hbWUsZmxhZ3Msc2VjdGlvbix2YWx1ZSxzdHJpbmcsY3AsY29sbCxoYXNocClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpXAotLiAgICAgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywgY3AsIGNvbGwsIGhhc2hwKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bihhLHApIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSAoYSxwKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdChhLHApIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KSAoYSxwKSkKLS4KLSovCi0KLS8qIFNlZSB3aGV0aGVyIHRoZSBtYWdpYyBudW1iZXIgbWF0Y2hlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBpZiAoQkFETUFHICgqaW50ZXJuYWxfZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGlmIHRoZSBvcHRpb25hbCBoZWFkZXIgaXMgTlVMTCBvciBub3QgdGhlIGNvcnJlY3Qgc2l6ZSB0aGVuCi0gICAgIHF1aXQ7IHRoZSBvbmx5IGRpZmZlcmVuY2UgSSBjYW4gc2VlIGJldHdlZW4gbTg4ayBkZ3V4IGhlYWRlcnMgKE1DODhETUFHSUMpCi0gICAgIGFuZCBJbnRlbCA5NjAgcmVhZHdyaXRlIGhlYWRlcnMgKEk5NjBXUk1BR0lDKSBpcyB0aGF0IHRoZQotICAgICBvcHRpb25hbCBoZWFkZXIgaXMgb2YgYSBkaWZmZXJlbnQgc2l6ZS4KLQotICAgICBCdXQgdGhlIG1pcHMga2VlcHMgZXh0cmEgc3R1ZmYgaW4gaXQncyBvcHRoZHIsIHNvIGRvbnQgY2hlY2sKLSAgICAgd2hlbiBkb2luZyB0aGF0Ci0gICAgICovCi0KLSNpZiBkZWZpbmVkKE04OCkgfHwgZGVmaW5lZChJOTYwKQotICBpZiAoaW50ZXJuYWxfZi0+Zl9vcHRoZHIgIT0gMCAmJiBiZmRfY29mZl9hb3V0c3ogKGFiZmQpICE9IGludGVybmFsX2YtPmZfb3B0aGRyKQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGVjayB3aGV0aGVyIHRoaXMgc2VjdGlvbiB1c2VzIGFuIGFsaWdubWVudCBvdGhlciB0aGFuIHRoZQotICAgZGVmYXVsdC4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlY3Rpb24sIGFsaWdubWVudF90YWJsZSwgdGFibGVfc2l6ZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBjb25zdCBzdHJ1Y3QgY29mZl9zZWN0aW9uX2FsaWdubWVudF9lbnRyeSAqYWxpZ25tZW50X3RhYmxlOwotICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdGFibGVfc2l6ZTsKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IGRlZmF1bHRfYWxpZ25tZW50ID0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgdGFibGVfc2l6ZTsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBpZiAoYWxpZ25tZW50X3RhYmxlW2ldLmNvbXBhcmlzb25fbGVuZ3RoID09ICh1bnNpZ25lZCBpbnQpIC0xCi0JICA/IHN0cmNtcCAoYWxpZ25tZW50X3RhYmxlW2ldLm5hbWUsIHNlY25hbWUpID09IDAKLQkgIDogc3RybmNtcCAoYWxpZ25tZW50X3RhYmxlW2ldLm5hbWUsIHNlY25hbWUsCi0JCSAgICAgYWxpZ25tZW50X3RhYmxlW2ldLmNvbXBhcmlzb25fbGVuZ3RoKSA9PSAwKQotCWJyZWFrOwotICAgIH0KLSAgaWYgKGkgPj0gdGFibGVfc2l6ZSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGFsaWdubWVudF90YWJsZVtpXS5kZWZhdWx0X2FsaWdubWVudF9taW4gIT0gQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFkKLSAgICAgICYmIGRlZmF1bHRfYWxpZ25tZW50IDwgYWxpZ25tZW50X3RhYmxlW2ldLmRlZmF1bHRfYWxpZ25tZW50X21pbikKLSAgICByZXR1cm47Ci0KLSAgaWYgKGFsaWdubWVudF90YWJsZVtpXS5kZWZhdWx0X2FsaWdubWVudF9tYXggIT0gQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFkKLSAgICAgICYmIGRlZmF1bHRfYWxpZ25tZW50ID4gYWxpZ25tZW50X3RhYmxlW2ldLmRlZmF1bHRfYWxpZ25tZW50X21heCkKLSAgICByZXR1cm47Ci0KLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ25tZW50X3RhYmxlW2ldLmFsaWdubWVudF9wb3dlcjsKLX0KLQotLyogQ3VzdG9tIHNlY3Rpb24gYWxpZ25tZW50IHJlY29yZHMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfZW50cnkKLWNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfdGFibGVbXSA9Ci17Ci0jaWZkZWYgQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTCi0gIENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUywKLSNlbmRpZgotICAvKiBUaGVyZSBtdXN0IG5vdCBiZSBhbnkgZ2FwcyBiZXR3ZWVuIC5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgeyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLnN0YWJzdHIiKSwKLSAgICAxLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMCB9LAotICAvKiBUaGUgLnN0YWIgc2VjdGlvbiBtdXN0IGJlIGFsaWduZWQgdG8gMioqMiBhdCBtb3N0LCB0byBhdm9pZCBnYXBzLiAgKi8KLSAgeyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLnN0YWIiKSwKLSAgICAzLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9LAotICAvKiBTaW1pbGFybHkgZm9yIHRoZSAuY3RvcnMgYW5kIC5kdG9ycyBzZWN0aW9ucy4gICovCi0gIHsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuY3RvcnMiKSwKLSAgICAzLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9LAotICB7IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmR0b3JzIiksCi0gICAgMywgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlX3NpemUgPQotICBzaXplb2YgY29mZl9zZWN0aW9uX2FsaWdubWVudF90YWJsZSAvIHNpemVvZiBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlWzBdOwotCi0vKiBJbml0aWFsaXplIGEgc2VjdGlvbiBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBwZWN1bGlhciB0byB0aGlzCi0gICBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIENPRkYuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0KLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+dGV4dF9hbGlnbl9wb3dlciAhPSAwCi0gICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKSwgIi50ZXh0IikgPT0gMCkKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB4Y29mZl9kYXRhIChhYmZkKS0+dGV4dF9hbGlnbl9wb3dlcjsKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5kYXRhX2FsaWduX3Bvd2VyICE9IDAKLSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pLCAiLmRhdGEiKSA9PSAwKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5kYXRhX2FsaWduX3Bvd2VyOwotI2VuZGlmCi0KLSAgLyogQWxsb2NhdGUgYXV4IHJlY29yZHMgZm9yIHNlY3Rpb24gc3ltYm9scywgdG8gc3RvcmUgc2l6ZSBhbmQKLSAgICAgcmVsYXRlZCBpbmZvLgotCi0gICAgIEBAIFRoZSAxMCBpcyBhIGd1ZXNzIGF0IGEgcGxhdXNpYmxlIG1heGltdW0gbnVtYmVyIG9mIGF1eCBlbnRyaWVzCi0gICAgIChidXQgc2hvdWxkbid0IGJlIGEgY29uc3RhbnQpLiAgKi8KLSAgbmF0aXZlID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopCi0JICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSkgKiAxMCkpOwotICBpZiAobmF0aXZlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIGRvbid0IG5lZWQgdG8gc2V0IHVwIG5fbmFtZSwgbl92YWx1ZSwgb3Igbl9zY251bSBpbiB0aGUgbmF0aXZlCi0gICAgIHN5bWJvbCBpbmZvcm1hdGlvbiwgc2luY2UgdGhleSdsbCBiZSBvdmVycmlkZW4gYnkgdGhlIEJGRCBzeW1ib2wKLSAgICAgYW55aG93LiAgSG93ZXZlciwgd2UgZG8gbmVlZCB0byBzZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UgY2xhc3MsCi0gICAgIGluIGNhc2UgdGhpcyBzeW1ib2wgd2luZHMgdXAgZ2V0dGluZyB3cml0dGVuIG91dC4gIFRoZSB2YWx1ZSAwCi0gICAgIGZvciBuX251bWF1eCBpcyBhbHJlYWR5IGNvcnJlY3QuICAqLwotCi0gIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gVF9OVUxMOwotICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotCi0gIGNvZmZzeW1ib2wgKHNlY3Rpb24tPnN5bWJvbCktPm5hdGl2ZSA9IG5hdGl2ZTsKLQotICBjb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlY3Rpb24sCi0JCQkJICAgICBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlLAotCQkJCSAgICAgY29mZl9zZWN0aW9uX2FsaWdubWVudF90YWJsZV9zaXplKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIKLQotLyogU2V0IHRoZSBhbGlnbm1lbnQgb2YgYSBCRkQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWNvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCBzZWN0aW9uLCBzY25oZHIpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotICAgICBQVFIgc2NuaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHIgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBzY25oZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jaWZkZWYgSTk2MAotICAvKiBFeHRyYWN0IEFMSUdOIGZyb20gMioqQUxJR04gc3RvcmVkIGluIHNlY3Rpb24gaGVhZGVyICovCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgIGlmICgoMSA8PCBpKSA+PSBoZHItPnNfYWxpZ24pCi0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFRJQzgwQ09GRgotICAvKiBUSSB0b29scyBoaWphY2sgYml0cyA4LTExIGZvciB0aGUgYWxpZ25tZW50ICovCi0gIGkgPSAoaGRyLT5zX2ZsYWdzID4+IDgpICYgMHhGIDsKLSNlbmRpZgotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBpOwotfQotCi0jZWxzZSAvKiAhIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgKi8KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQotLyogYSBjb3VwbGUgb2YgbWFjcm9zIHRvIGhlbHAgc2V0dGluZyB0aGUgYWxpZ25tZW50IHBvd2VyIGZpZWxkICovCi0jZGVmaW5lIEFMSUdOX1NFVChmaWVsZCx4LHkpIFwKLSAgaWYgKCgoZmllbGQpICYgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMpID09IHggKVwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotI2RlZmluZSBFTElGQUxJR05fU0VUKGZpZWxkLHgseSkgXAotICBlbHNlIGlmICgoIChmaWVsZCkgJiBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUykgPT0geCApIFwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotc3RhdGljIHZvaWQgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHNlY3Rpb24sIHNjbmhkcikKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIFBUUiBzY25oZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkciA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIHNjbmhkcjsKLQotICBBTElHTl9TRVQgICAgIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl82NEJZVEVTLCA2KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8zMkJZVEVTLCA1KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTLCA0KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl84QllURVMsICAzKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl80QllURVMsICAyKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8yQllURVMsICAxKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xQllURVMsICAwKQotCi0gIC8qIEluIGEgUEUgaW1hZ2UgZmlsZSwgdGhlIHNfcGFkZHIgZmllbGQgaG9sZHMgdGhlIHZpcnR1YWwgc2l6ZSBvZiBhCi0gICAgIHNlY3Rpb24sIHdoaWxlIHRoZSBzX3NpemUgZmllbGQgaG9sZHMgdGhlIHJhdyBzaXplLiAgV2UgYWxzbyBrZWVwCi0gICAgIHRoZSBvcmlnaW5hbCBzZWN0aW9uIGZsYWcgdmFsdWUsIHNpbmNlIG5vdCBldmVyeSBiaXQgY2FuIGJlCi0gICAgIG1hcHBlZCBvbnRvIGEgZ2VuZXJpYyBCRkQgc2VjdGlvbiBiaXQuICAqLwotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JewotCSAgLyogRklYTUU6IFJldHVybiBlcnJvci4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnRkYXRhID0KLQkoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dGRhdGEgPT0gTlVMTCkKLQl7Ci0JICAvKiBGSVhNRTogUmV0dXJuIGVycm9yLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT52aXJ0X3NpemUgPSBoZHItPnNfcGFkZHI7Ci0gIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT5wZV9mbGFncyA9IGhkci0+c19mbGFnczsKLQotICBzZWN0aW9uLT5sbWEgPSBoZHItPnNfdmFkZHI7Ci19Ci0jdW5kZWYgQUxJR05fU0VUCi0jdW5kZWYgRUxJRkFMSUdOX1NFVAotCi0jZWxzZSAvKiAhIENPRkZfV0lUSF9QRSAqLwotI2lmZGVmIFJTNjAwMENPRkZfQwotCi0vKiBXZSBncm9zc2x5IGFidXNlIHRoaXMgZnVuY3Rpb24gdG8gaGFuZGxlIFhDT0ZGIG92ZXJmbG93IGhlYWRlcnMuCi0gICBXaGVuIHdlIHNlZSBvbmUsIHdlIGNvcnJlY3QgdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudHMgaW4gdGhlCi0gICByZWFsIGhlYWRlciwgYW5kIHJlbW92ZSB0aGUgc2VjdGlvbiB3ZSBqdXN0IGNyZWF0ZWQuICAqLwotCi1zdGF0aWMgdm9pZCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayAoYWJmZCwgc2VjdGlvbiwgc2NuaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgc2NuaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHIgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBzY25oZHI7Ci0gIGFzZWN0aW9uICpyZWFsX3NlYzsKLSAgYXNlY3Rpb24gKipwczsKLQotICBpZiAoKGhkci0+c19mbGFncyAmIFNUWVBfT1ZSRkxPKSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWFsX3NlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgaGRyLT5zX25yZWxvYyk7Ci0gIGlmIChyZWFsX3NlYyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICByZWFsX3NlYy0+cmVsb2NfY291bnQgPSBoZHItPnNfcGFkZHI7Ci0gIHJlYWxfc2VjLT5saW5lbm9fY291bnQgPSBoZHItPnNfdmFkZHI7Ci0KLSAgZm9yIChwcyA9ICZhYmZkLT5zZWN0aW9uczsgKnBzICE9IE5VTEw7IHBzID0gJigqcHMpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgqcHMgPT0gc2VjdGlvbikKLQl7Ci0JICAqcHMgPSAoKnBzKS0+bmV4dDsKLQkgIC0tYWJmZC0+c2VjdGlvbl9jb3VudDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLSNlbHNlIC8qICEgUlM2MDAwQ09GRl9DICovCi0KLSNkZWZpbmUgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKSkgYmZkX3ZvaWQpCi0KLSNlbmRpZiAvKiAhIFJTNjAwMENPRkZfQyAqLwotI2VuZGlmIC8qICEgQ09GRl9XSVRIX1BFICovCi0jZW5kaWYgLyogISBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSICovCi0KLSNpZm5kZWYgY29mZl9ta29iamVjdAotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBjb2ZmX2RhdGFfdHlwZSAqY29mZjsKLQotICBhYmZkLT50ZGF0YS5jb2ZmX29ial9kYXRhID0gKHN0cnVjdCBjb2ZmX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9kYXRhX3R5cGUpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmNvZmZfb2JqX2RhdGEgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGNvZmYgPSBjb2ZmX2RhdGEgKGFiZmQpOwotICBjb2ZmLT5zeW1ib2xzID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgY29mZi0+Y29udmVyc2lvbl90YWJsZSA9ICh1bnNpZ25lZCBpbnQgKikgTlVMTDsKLSAgY29mZi0+cmF3X3N5bWVudHMgPSAoc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqKSBOVUxMOwotICBjb2ZmLT5yZWxvY2Jhc2UgPSAwOwotICBjb2ZmLT5sb2NhbF90b2Nfc3ltX21hcCA9IDA7Ci0KLS8qICBtYWtlX2Fic19zZWN0aW9uKGFiZmQpOyovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYKLQotLyogQ3JlYXRlIHRoZSBDT0ZGIGJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotI2lmbmRlZiBjb2ZmX21rb2JqZWN0X2hvb2sKLXN0YXRpYyBQVFIKLWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci0gICAgIFBUUiBhb3V0aGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGlmIChjb2ZmX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLQotICBjb2ZmLT5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJwotICAgICB1bmZvcnR1bmF0ZWx5IHZhcnkgYW1vbmcgY29mZiBpbXBsZW1lbnRhdGlvbnMuLi4gICovCi0gIGNvZmYtPmxvY2FsX25fYnRtYXNrID0gTl9CVE1BU0s7Ci0gIGNvZmYtPmxvY2FsX25fYnRzaGZ0ID0gTl9CVFNIRlQ7Ci0gIGNvZmYtPmxvY2FsX25fdG1hc2sgPSBOX1RNQVNLOwotICBjb2ZmLT5sb2NhbF9uX3RzaGlmdCA9IE5fVFNISUZUOwotICBjb2ZmLT5sb2NhbF9zeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBjb2ZmLT5sb2NhbF9hdXhlc3ogPSBiZmRfY29mZl9hdXhlc3ogKGFiZmQpOwotICBjb2ZmLT5sb2NhbF9saW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotCi0gIGNvZmYtPnRpbWVzdGFtcCA9IGludGVybmFsX2YtPmZfdGltZGF0OwotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9Ci0gICAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkgPQotICAgICAgaW50ZXJuYWxfZi0+Zl9uc3ltczsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX1NIUk9CSikgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotICBpZiAoYW91dGhkciAhPSBOVUxMICYmIGludGVybmFsX2YtPmZfb3B0aGRyID49IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCkpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmludGVybmFsX2EgPQotCShzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSBhb3V0aGRyOwotICAgICAgc3RydWN0IHhjb2ZmX3RkYXRhICp4Y29mZjsKLQotICAgICAgeGNvZmYgPSB4Y29mZl9kYXRhIChhYmZkKTsKLSAgICAgIHhjb2ZmLT5mdWxsX2FvdXRoZHIgPSB0cnVlOwotICAgICAgeGNvZmYtPnRvYyA9IGludGVybmFsX2EtPm9fdG9jOwotICAgICAgeGNvZmYtPnNudG9jID0gaW50ZXJuYWxfYS0+b19zbnRvYzsKLSAgICAgIHhjb2ZmLT5zbmVudHJ5ID0gaW50ZXJuYWxfYS0+b19zbmVudHJ5OwotICAgICAgeGNvZmYtPnRleHRfYWxpZ25fcG93ZXIgPSBpbnRlcm5hbF9hLT5vX2FsZ250ZXh0OwotICAgICAgeGNvZmYtPmRhdGFfYWxpZ25fcG93ZXIgPSBpbnRlcm5hbF9hLT5vX2FsZ25kYXRhOwotICAgICAgeGNvZmYtPm1vZHR5cGUgPSBpbnRlcm5hbF9hLT5vX21vZHR5cGU7Ci0gICAgICB4Y29mZi0+Y3B1dHlwZSA9IGludGVybmFsX2EtPm9fY3B1dHlwZTsKLSAgICAgIHhjb2ZmLT5tYXhkYXRhID0gaW50ZXJuYWxfYS0+b19tYXhkYXRhOwotICAgICAgeGNvZmYtPm1heHN0YWNrID0gaW50ZXJuYWxfYS0+b19tYXhzdGFjazsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIEFSTSAKLSAgLyogU2V0IHRoZSBmbGFncyBmaWVsZCBmcm9tIHRoZSBDT0ZGIGhlYWRlciByZWFkIGluICovCi0gIGlmICghIF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGludGVybmFsX2YtPmZfZmxhZ3MpKQotICAgIGNvZmYtPmZsYWdzID0gMDsKLSNlbmRpZgotICAKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgLyogRklYTUU6IEknbSBub3Qgc3VyZSB0aGlzIGlzIGV2ZXIgZXhlY3V0ZWQsIHNpbmNlIHBlaWNvZGUuaAotICAgICBkZWZpbmVzIGNvZmZfbWtvYmplY3RfaG9vay4gICovCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQpID09IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0RFQlVHOwotI2VuZGlmCi0KLSAgcmV0dXJuIChQVFIpIGNvZmY7Ci19Ci0jZW5kaWYKLQotLyogRGV0ZXJtaW5lIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgdHlwZS4gIEZJWE1FOiBUaGlzIGlzIHRhcmdldAotICAgZGVwZW5kZW50IGJlY2F1c2UgdGhlIG1hZ2ljIG51bWJlcnMgYXJlIGRlZmluZWQgaW4gdGhlIHRhcmdldAotICAgZGVwZW5kZW50IGhlYWRlciBmaWxlcy4gIEJ1dCB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyIG5lZWQgZm9yIHRoaXMuCi0gICBJZiB0aGUgbWFnaWMgbnVtYmVycyB3ZXJlIG1vdmVkIHRvIGEgc2VwYXJhdGUgZmlsZSwgdGhpcyBmdW5jdGlvbgotICAgd291bGQgYmUgdGFyZ2V0IGluZGVwZW5kZW50IGFuZCB3b3VsZCBhbHNvIGJlIG11Y2ggbW9yZSBzdWNjZXNzZnVsCi0gICBhdCBsaW5raW5nIHRvZ2V0aGVyIENPRkYgZmlsZXMgZm9yIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBsb25nIG1hY2hpbmU7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gIG1hY2hpbmUgPSAwOwotICBzd2l0Y2ggKGludGVybmFsX2YtPmZfbWFnaWMpCi0gICAgewotI2lmZGVmIFBQQ01BR0lDCi0gICAgY2FzZSBQUENNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotICAgICAgbWFjaGluZSA9IDA7IC8qIHdoYXQgZG9lcyB0aGlzIG1lYW4/IChrcmspICovCi0gICAgICBicmVhazsgCi0jZW5kaWYKLSNpZmRlZiBJMzg2TUFHSUMKLSAgICBjYXNlIEkzODZNQUdJQzoKLSAgICBjYXNlIEkzODZQVFhNQUdJQzoKLSAgICBjYXNlIEkzODZBSVhNQUdJQzoJCS8qIERhbmJ1cnkgUFMvMiBBSVggQyBDb21waWxlciAqLwotICAgIGNhc2UgTFlOWENPRkZNQUdJQzoJLyogc2hhZG93cyB0aGUgbTY4ayBMeW54IG51bWJlciBiZWxvdywgc2lnaCAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX2kzODY7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQTI5S19NQUdJQ19CSUcKLSAgICBjYXNlIEEyOUtfTUFHSUNfQklHOgotICAgIGNhc2UgQTI5S19NQUdJQ19MSVRUTEU6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfYTI5azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUk1NQUdJQwotICAgIGNhc2UgQVJNTUFHSUM6Ci0gICAgY2FzZSBBUk1QRU1BR0lDOgotICAgIGNhc2UgVEhVTUJQRU1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2FybTsKLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfQVJNX0FSQ0hJVEVDVFVSRV9NQVNLKQotCXsKLSAgICAgICAgY2FzZSBGX0FSTV8yOiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV8yOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fMmE6IG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fMmE7IGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzM6ICBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzM7ICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSBGX0FSTV8zTTogbWFjaGluZSA9IGJmZF9tYWNoX2FybV8zTTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fNDogIG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fNDsgIGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzRUOiBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzRUOyBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV81OiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV81OyAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNQzY4TUFHSUMKLSAgICBjYXNlIE1DNjhNQUdJQzoKLSAgICBjYXNlIE02OE1BR0lDOgotI2lmZGVmIE1DNjhLQkNTTUFHSUMKLSAgICBjYXNlIE1DNjhLQkNTTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBBUE9MTE9NNjhLTUFHSUMKLSAgICBjYXNlIEFQT0xMT002OEtNQUdJQzoKLSNlbmRpZgotI2lmZGVmIExZTlhDT0ZGTUFHSUMKLSAgICBjYXNlIExZTlhDT0ZGTUFHSUM6Ci0jZW5kaWYKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAyMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTUM4OE1BR0lDCi0gICAgY2FzZSBNQzg4TUFHSUM6Ci0gICAgY2FzZSBNQzg4RE1BR0lDOgotICAgIGNhc2UgTUM4OE9NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tODhrOwotICAgICAgbWFjaGluZSA9IDg4MTAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBaOEtNQUdJQwotICAgIGNhc2UgWjhLTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfejhrOwotICAgICAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9NQUNITUFTSykKLQl7Ci0JY2FzZSBGX1o4MDAxOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAxOwotCSAgYnJlYWs7Ci0JY2FzZSBGX1o4MDAyOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEk4NjAKLSAgICBjYXNlIEk4NjBNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pODYwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJOTYwCi0jaWZkZWYgSTk2MFJPTUFHSUMKLSAgICBjYXNlIEk5NjBST01BR0lDOgotICAgIGNhc2UgSTk2MFJXTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTk2MDsKLSAgICAgIHN3aXRjaCAoRl9JOTYwVFlQRSAmIGludGVybmFsX2YtPmZfZmxhZ3MpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBGX0k5NjBDT1JFOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwS0I6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwTUM6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9tYzsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwWEE6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF94YTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwQ0E6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jYTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwS0E6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwSlg6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9qeDsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwSFg6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9oeDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgIGNhc2UgVTgwMlJPTUFHSUM6Ci0gICAgY2FzZSBVODAyV1JNQUdJQzoKLSAgICBjYXNlIFU4MDJUT0NNQUdJQzoKLSAgICAgIHsKLQlpbnQgY3B1dHlwZTsKLQotCWlmICh4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAhPSAtMSkKLQkgIGNwdXR5cGUgPSB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAmIDB4ZmY7Ci0JZWxzZQotCSAgewotCSAgICAvKiBXZSBkaWQgbm90IGdldCBhIHZhbHVlIGZyb20gdGhlIGEub3V0IGhlYWRlci4gIElmIHRoZQotCSAgICAgICBmaWxlIGhhcyBub3QgYmVlbiBzdHJpcHBlZCwgd2UgbWF5IGJlIGFibGUgdG8gZ2V0IHRoZQotCSAgICAgICBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlyc3Qgc3ltYm9sLCBpZiBpdAotCSAgICAgICBpcyBhIC5maWxlIHN5bWJvbC4gICovCi0JICAgIGlmIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPT0gMCkKLQkgICAgICBjcHV0eXBlID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYmZkX2J5dGUgKmJ1ZjsKLQkJc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLQkJYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpOwotCQlpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0JCSAgICB8fCAoYmZkX3JlYWQgKGJ1ZiwgMSwgYmZkX2NvZmZfc3ltZXN6IChhYmZkKSwgYWJmZCkgCi0JCQkhPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSkKLQkJICB7Ci0JCSAgICBmcmVlIChidWYpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgYnVmLCAoUFRSKSAmc3ltKTsKLQkJaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JCSAgY3B1dHlwZSA9IHN5bS5uX3R5cGUgJiAweGZmOwotCQllbHNlCi0JCSAgY3B1dHlwZSA9IDA7Ci0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgfQotCSAgfQotCi0JLyogRklYTUU6IFdlIGRvbid0IGhhbmRsZSBhbGwgY2FzZXMgaGVyZS4gICovCi0Jc3dpdGNoIChjcHV0eXBlKQotCSAgewotCSAgZGVmYXVsdDoKLQkgIGNhc2UgMDoKLSNpZmRlZiBQT1dFUk1BQwotCSAgICAvKiBQb3dlclBDIE1hY3MgdXNlIHRoZSBzYW1lIG1hZ2ljIG51bWJlcnMgYXMgUlMvNjAwMAotCSAgICAgICAoYmVjYXVzZSB0aGF0J3MgaG93IHRoZXkgd2VyZSBib290c3RyYXBwZWQgb3JpZ2luYWxseSksCi0JICAgICAgIGJ1dCB0aGV5IGFyZSBhbHdheXMgUG93ZXJQQyBhcmNoaXRlY3R1cmUuICAqLwotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDA7Ci0jZWxzZQotCSAgICBhcmNoID0gYmZkX2FyY2hfcnM2MDAwOwotCSAgICBtYWNoaW5lID0gNjAwMDsKLSNlbmRpZiAvKiBQT1dFUk1BQyAqLwotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDYwMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6IC8qIDY0IGJpdCBQb3dlclBDICovCi0JICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCSAgICBtYWNoaW5lID0gNjIwOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0JICAgIG1hY2hpbmUgPSAwOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLQkgICAgbWFjaGluZSA9IDYwMDA7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFdFMzJLTUFHSUMKLSAgICBjYXNlIFdFMzJLTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfd2UzMms7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODMwME1BR0lDCi0gICAgY2FzZSBIODMwME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwOwotICAgICAgLyogISEgRklYTUUgdGhpcyBwcm9iYWJseSBpc24ndCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgKi8KLSAgICAgIGFiZmQtPmZsYWdzIHw9IEJGRF9JU19SRUxBWEFCTEU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgSDgzMDBITUFHSUMKLSAgICBjYXNlIEg4MzAwSE1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwaDsKLSAgICAgIC8qICEhIEZJWE1FIHRoaXMgcHJvYmFibHkgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzICovCi0gICAgICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4MzAwU01BR0lDCi0gICAgY2FzZSBIODMwMFNNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODMwMDsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9oODMwMHM7Ci0gICAgICAvKiAhISBGSVhNRSB0aGlzIHByb2JhYmx5IGlzbid0IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBTSF9BUkNIX01BR0lDX0JJRwotICAgIGNhc2UgU0hfQVJDSF9NQUdJQ19CSUc6Ci0gICAgY2FzZSBTSF9BUkNIX01BR0lDX0xJVFRMRToKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICBjYXNlIFNIX0FSQ0hfTUFHSUNfV0lOQ0U6Ci0jZW5kaWYKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zaDsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1JUFNfQVJDSF9NQUdJQ19XSU5DRQotICAgIGNhc2UgTUlQU19BUkNIX01BR0lDX1dJTkNFOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODUwME1BR0lDCi0gICAgY2FzZSBIODUwME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4NTAwOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU1BBUkNNQUdJQwotICAgIGNhc2UgU1BBUkNNQUdJQzoKLSNpZmRlZiBMWU5YQ09GRk1BR0lDCi0gICAgY2FzZSBMWU5YQ09GRk1BR0lDOgotI2VuZGlmCi0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUSUMzME1BR0lDCi0gICAgY2FzZSBUSUMzME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3RpYzMwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFRJQzgwX0FSQ0hfTUFHSUMKLSAgICBjYXNlIFRJQzgwX0FSQ0hfTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfdGljODA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgTUNPUkVNQUdJQwotICAgIGNhc2UgTUNPUkVNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tY29yZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoJCQkvKiBVbnJlYWRhYmxlIGlucHV0IGZpbGUgdHlwZSAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgU1lNTkFNRV9JTl9ERUJVRwotCi1zdGF0aWMgYm9vbGVhbiBzeW1uYW1lX2luX2RlYnVnX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotc3ltbmFtZV9pbl9kZWJ1Z19ob29rIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotewotICByZXR1cm4gU1lNTkFNRV9JTl9ERUJVRyAoc3ltKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotI2Vsc2UKLQotI2RlZmluZSBzeW1uYW1lX2luX2RlYnVnX2hvb2sgXAotICAoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpKSBiZmRfZmFsc2UKLQotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQotLyogSGFuZGxlIHRoZSBjc2VjdCBhdXhlbnQgb2YgYSBDX0VYVCBvciBDX0hJREVYVCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIHVuc2lnbmVkIGludCwgY29tYmluZWRfZW50cnlfdHlwZSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2U7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotewotICBpbnQgY2xhc3MgPSBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzOwotCi0gIGlmICgoY2xhc3MgPT0gQ19FWFQgfHwgY2xhc3MgPT0gQ19ISURFWFQpCi0gICAgICAmJiBpbmRhdXggKyAxID09IHN5bWJvbC0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgaWYgKFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCkgPT0gWFRZX0xEKQotCXsKLQkgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5wID0KLQkgICAgdGFibGVfYmFzZSArIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgYXV4LT5maXhfc2NubGVuID0gMTsKLQl9Ci0KLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgbm90IGRvIGFueQotICAgICAgICAgZnVydGhlciB3b3JrIG9uIHRoaXMgYXV4ZW50LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGF1eGVudCBzaG91bGQgYmUgaGFuZGxlZCBieQotICAgICB0aGUgY2FsbGVyLiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jZWxzZQotI2lmZGVmIEk5NjAKLQotLyogV2UgZG9uJ3Qgd2FudCB0byBwb2ludGVyaXplIGJhbCBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29mZl9wb2ludGVyaXplX2F1eF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKLQkgICB1bnNpZ25lZCBpbnQsIGNvbWJpbmVkX2VudHJ5X3R5cGUgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFJldHVybiB0cnVlIGlmIHdlIGRvbid0IHdhbnQgdG8gcG9pbnRlcml6ZSB0aGlzIGF1eCBlbnRyeSwgd2hpY2gKLSAgICAgaXMgdGhlIGNhc2UgZm9yIHRoZSBsYXN0Zmlyc3QgYXV4IGVudHJ5IGZvciBhIENfTEVBRlBST0Mgc3ltYm9sLiAgKi8KLSAgcmV0dXJuIChpbmRhdXggPT0gMQotCSAgJiYgKHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGUFJPQwotCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGU1RBVAotCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGRVhUKSk7Ci19Ci0KLSNlbHNlIC8qICEgSTk2MCAqLwotCi0jZGVmaW5lIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAwCi0KLSNlbmRpZiAvKiAhIEk5NjAgKi8KLSNlbmRpZiAvKiAhIFJTNjAwMENPRkZfQyAqLwotCi0vKiBQcmludCBhbiBhdXggZW50cnkuICBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBoYXMgcHJpbnRlZCBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcHJpbnRfYXV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBGSUxFICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgdW5zaWduZWQgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3ByaW50X2F1eCAoYWJmZCwgZmlsZSwgdGFibGVfYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEZJTEUgKmZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKChzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRVhUCi0gICAgICAgfHwgc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLSAgICAgICYmIGluZGF1eCArIDEgPT0gc3ltYm9sLT51LnN5bWVudC5uX251bWF1eCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY3NlY3QgZW50cnkuICAqLwotICAgICAgZnByaW50ZiAoZmlsZSwgIkFVWCAiKTsKLSAgICAgIGlmIChTTVRZUF9TTVRZUCAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApICE9IFhUWV9MRCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIGF1eC0+Zml4X3Njbmxlbik7Ci0JICBmcHJpbnRmIChmaWxlLCAidmFsICU1bGQiLCBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKGZpbGUsICJpbmR4ICIpOwotCSAgaWYgKCEgYXV4LT5maXhfc2NubGVuKQotCSAgICBmcHJpbnRmIChmaWxlLCAiJTRsZCIsIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkgIGVsc2UKLQkgICAgZnByaW50ZiAoZmlsZSwgIiU0bGQiLAotCQkgICAgIChsb25nKSAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLnAgLSB0YWJsZV9iYXNlKSk7Ci0JfQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgIiBwcm1oc2ggJWxkIHNuaHNoICV1IHR5cCAlZCBhbGduICVkIGNsc3MgJXUgc3RiICVsZCBzbnN0YiAldSIsCi0JICAgICAgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Bhcm1oYXNoLAotCSAgICAgICAodW5zaWduZWQgaW50KSBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbmhhc2gsCi0JICAgICAgIFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCi0JICAgICAgIFNNVFlQX0FMSUdOIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtY2xhcywKLQkgICAgICAgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc3RhYiwKLQkgICAgICAgKHVuc2lnbmVkIGludCkgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc25zdGFiKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IG5vIHNwZWNpYWwgYWN0aW9uIHdhcyB0YWtlbi4gICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQlXcml0aW5nIHJlbG9jYXRpb25zCi0KLQlUbyB3cml0ZSByZWxvY2F0aW9ucywgdGhlIGJhY2sgZW5kIHN0ZXBzIHRob3VnaCB0aGUKLQljYW5vbmljYWwgcmVsb2NhdGlvbiB0YWJsZSBhbmQgY3JlYXRlIGFuCi0JQGNvZGV7aW50ZXJuYWxfcmVsb2N9LiBUaGUgc3ltYm9sIGluZGV4IHRvIHVzZSBpcyByZW1vdmVkIGZyb20KLQl0aGUgQGNvZGV7b2Zmc2V0fSBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIHN1cHBsaWVkLiAgVGhlCi0JYWRkcmVzcyBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBzdW0gb2YgdGhlIHNlY3Rpb24gYmFzZQotCWFkZHJlc3MgYW5kIHRoZSByZWxvY2F0aW9uIG9mZnNldDsgdGhlIHR5cGUgaXMgZHVnIGRpcmVjdGx5Ci0JZnJvbSB0aGUgaG93dG8gZmllbGQuICBUaGVuIHRoZSBAY29kZXtpbnRlcm5hbF9yZWxvY30gaXMKLQlzd2FwcGVkIGludG8gdGhlIHNoYXBlIG9mIGFuIEBjb2Rle2V4dGVybmFsX3JlbG9jfSBhbmQgd3JpdHRlbgotCW91dCB0byBkaXNrLgotCi0qLwotCi0jaWZkZWYgVEFSR19BVVgKLQotc3RhdGljIGludCBjb21wYXJlX2FyZWxlbnRfcHRyIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLS8qIEFVWCdzIGxkIHdhbnRzIHJlbG9jYXRpb25zIHRvIGJlIHNvcnRlZCAqLwotc3RhdGljIGludAotY29tcGFyZV9hcmVsZW50X3B0ciAoeCwgeSkKLSAgICAgY29uc3QgUFRSIHg7Ci0gICAgIGNvbnN0IFBUUiB5OwotewotICBjb25zdCBhcmVsZW50ICoqYSA9IChjb25zdCBhcmVsZW50ICoqKSB4OwotICBjb25zdCBhcmVsZW50ICoqYiA9IChjb25zdCBhcmVsZW50ICoqKSB5OwotICBiZmRfc2l6ZV90eXBlIGFhZHIgPSAoKmEpLT5hZGRyZXNzOwotICBiZmRfc2l6ZV90eXBlIGJhZHIgPSAoKmIpLT5hZGRyZXNzOwotCi0gIHJldHVybiAoYWFkciA8IGJhZHIgPyAtMSA6IGJhZHIgPCBhYWRyID8gMSA6IDApOwotfQotCi0jZW5kaWYgLyogVEFSR19BVVggKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfcmVsb2NzIChhYmZkLCBmaXJzdF91bmRlZikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgaW50IGZpcnN0X3VuZGVmOwotewotICBhc2VjdGlvbiAqczsKLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgZHN0OwotICAgICAgYXJlbGVudCAqKnA7Ci0KLSNpZm5kZWYgVEFSR19BVVgKLSAgICAgIHAgPSBzLT5vcmVsb2NhdGlvbjsKLSNlbHNlCi0gICAgICAvKiBzb3J0IHJlbG9jYXRpb25zIGJlZm9yZSB3ZSB3cml0ZSB0aGVtIG91dCAqLwotICAgICAgcCA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICAgICBpZiAocCA9PSBOVUxMICYmIHMtPnJlbG9jX2NvdW50ID4gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1jcHkgKHAsIHMtPm9yZWxvY2F0aW9uLCBzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICAgICBxc29ydCAocCwgcy0+cmVsb2NfY291bnQsIHNpemVvZiAoYXJlbGVudCAqKSwgY29tcGFyZV9hcmVsZW50X3B0cik7Ci0jZW5kaWYKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnJlbG9jX2NvdW50OyBpKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jIG47Ci0JICBhcmVsZW50ICpxID0gcFtpXTsKLQkgIG1lbXNldCAoKFBUUikgJiBuLCAwLCBzaXplb2YgKG4pKTsKLQotCSAgLyogTm93IHdlJ3ZlIHJlbnVtYmVyZWQgdGhlIHN5bWJvbHMgd2Uga25vdyB3aGVyZSB0aGUKLQkgICAgIHVuZGVmaW5lZCBzeW1ib2xzIGxpdmUgaW4gdGhlIHRhYmxlLiAgQ2hlY2sgdGhlIHJlbG9jCi0JICAgICBlbnRyaWVzIGZvciBzeW1ib2xzIHdobydzIG91dHB1dCBiZmQgaXNuJ3QgdGhlIHJpZ2h0IG9uZS4KLQkgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQgKHdoaWNoIG1lYW5zCi0JICAgICB0aGF0IGFsbCB0aGUgcG9pbnRlcnMgYXJlIG5ldmVyIG1hZGUgdG8gcG9pbnQgdG8gdGhlIHNhbWUKLQkgICAgIHBsYWNlKS4gVGhpcyBpcyBhIGJhZCB0aGluZywnY2F1c2UgdGhlIHN5bWJvbHMgYXR0YWNoZWQKLQkgICAgIHRvIHRoZSBvdXRwdXQgYmZkIGFyZSBpbmRleGVkLCBzbyB0aGF0IHRoZSByZWxvY2F0aW9uCi0JICAgICBlbnRyaWVzIGtub3cgd2hpY2ggc3ltYm9sIGluZGV4IHRoZXkgcG9pbnQgdG8uICBTbyB3ZQotCSAgICAgaGF2ZSB0byBsb29rIHVwIHRoZSBvdXRwdXQgc3ltYm9sIGhlcmUuICovCi0KLQkgIGlmIChxLT5zeW1fcHRyX3B0clswXS0+dGhlX2JmZCAhPSBhYmZkKQotCSAgICB7Ci0JICAgICAgaW50IGk7Ci0JICAgICAgY29uc3QgY2hhciAqc25hbWUgPSBxLT5zeW1fcHRyX3B0clswXS0+bmFtZTsKLQkgICAgICBhc3ltYm9sICoqb3V0c3ltcyA9IGFiZmQtPm91dHN5bWJvbHM7Ci0JICAgICAgZm9yIChpID0gZmlyc3RfdW5kZWY7IG91dHN5bXNbaV07IGkrKykKLQkJewotCQkgIGNvbnN0IGNoYXIgKmludGFibGUgPSBvdXRzeW1zW2ldLT5uYW1lOwotCQkgIGlmIChzdHJjbXAgKGludGFibGUsIHNuYW1lKSA9PSAwKSB7Ci0JCSAgICAvKiBnb3QgYSBoaXQsIHNvIHJlcG9pbnQgdGhlIHJlbG9jICovCi0JCSAgICBxLT5zeW1fcHRyX3B0ciA9IG91dHN5bXMgKyBpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQl9Ci0JICAgIH0KLQotCSAgbi5yX3ZhZGRyID0gcS0+YWRkcmVzcyArIHMtPnZtYTsKLQotI2lmZGVmIFJfSUhDT05TVAotCSAgLyogVGhlIDI5ayBjb25zdC9jb25zdGggcmVsb2MgcGFpciBpcyBhIHJlYWwga2x1ZGdlLiAgVGhlIGNvbnN0aAotCSAgICAgcGFydCBkb2Vzbid0IGhhdmUgYSBzeW1ib2w7IGl0IGhhcyBhbiBvZmZzZXQuICBTbyByZWJ1aWx0Ci0JICAgICB0aGF0IGhlcmUuICAqLwotCSAgaWYgKHEtPmhvd3RvLT50eXBlID09IFJfSUhDT05TVCkKLQkgICAgbi5yX3N5bW5keCA9IHEtPmFkZGVuZDsKLQkgIGVsc2UKLSNlbmRpZgotCSAgICBpZiAocS0+c3ltX3B0cl9wdHIpCi0JICAgICAgewotI2lmZGVmIFNFQ1RJT05fUkVMQVRJVkVfQUJTT0xVVEVfU1lNQk9MX1AKLSAgICAgICAgICAgICAgICBpZiAoU0VDVElPTl9SRUxBVElWRV9BQlNPTFVURV9TWU1CT0xfUCAocSxzKSkKLSNlbHNlCi0JCWlmIChxLT5zeW1fcHRyX3B0ciA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cikKLSNlbmRpZgotCQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBhYnNvbHV0ZSBzeW1ib2wuICAqLwotCQkgIG4ucl9zeW1uZHggPSAtMTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG4ucl9zeW1uZHggPSBnZXRfaW5kZXggKCgqKHEtPnN5bV9wdHJfcHRyKSkpOwotCQkgICAgLyogVGFrZSBub3RpY2UgaWYgdGhlIHN5bWJvbCByZWxvYyBwb2ludHMgdG8gYSBzeW1ib2wKLQkJICAgICAgIHdlIGRvbid0IGhhdmUgaW4gb3VyIHN5bWJvbCB0YWJsZS4gIFdoYXQgc2hvdWxkIHdlCi0JCSAgICAgICBkbyBmb3IgdGhpcz8/ICAqLwotCQkgICAgaWYgKG4ucl9zeW1uZHggPiBvYmpfY29udl90YWJsZV9zaXplIChhYmZkKSkKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgfQotCSAgICAgIH0KLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotCSAgbi5yX29mZnNldCA9IHEtPmFkZGVuZDsKLSNlbmRpZgotCi0jaWZkZWYgU0VMRUNUX1JFTE9DCi0JICAvKiBXb3JrIG91dCByZWxvYyB0eXBlIGZyb20gd2hhdCBpcyByZXF1aXJlZCAqLwotCSAgU0VMRUNUX1JFTE9DIChuLCBxLT5ob3d0byk7Ci0jZWxzZQotCSAgbi5yX3R5cGUgPSBxLT5ob3d0by0+dHlwZTsKLSNlbmRpZgotCSAgY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJm4sICZkc3QpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBkc3QsIDEsIGJmZF9jb2ZmX3JlbHN6IChhYmZkKSwgYWJmZCkKLQkgICAgICAhPSBiZmRfY29mZl9yZWxzeiAoYWJmZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSNpZmRlZiBUQVJHX0FVWAotICAgICAgaWYgKHAgIT0gTlVMTCkKLQlmcmVlIChwKTsKLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IGZsYWdzIGFuZCBtYWdpYyBudW1iZXIgb2YgYSBjb2ZmIGZpbGUgZnJvbSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUKLSAgIHR5cGUuICBSZXN1bHQgaXMgdHJ1ZSBpZiB3ZSBjYW4gcmVwcmVzZW50IHRoZSBhcmNoJnR5cGUsIGZhbHNlIGlmIG5vdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NldF9mbGFncyAoYWJmZCwgbWFnaWNwLCBmbGFnc3ApCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCAqbWFnaWNwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIHNob3J0ICpmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSNpZmRlZiBaOEtNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfejhrOgotICAgICAgKm1hZ2ljcCA9IFo4S01BR0lDOwotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX3o4MDAxOgotCSAgKmZsYWdzcCA9IEZfWjgwMDE7Ci0JICBicmVhazsKLQljYXNlIGJmZF9tYWNoX3o4MDAyOgotCSAgKmZsYWdzcCA9IEZfWjgwMDI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0jaWZkZWYgSTk2MFJPTUFHSUMKLQotICAgIGNhc2UgYmZkX2FyY2hfaTk2MDoKLQotICAgICAgewotCXVuc2lnbmVkIGZsYWdzOwotCSptYWdpY3AgPSBJOTYwUk9NQUdJQzsKLQkvKgotCSAgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgJiBXUF9URVhUKSA/IEk5NjBST01BR0lDIDoKLQkgIEk5NjBSV01BR0lDKTsgICBGSVhNRT8/PwotCSAgKi8KLQlzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JICB7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKLQkgICAgZmxhZ3MgPSBGX0k5NjBDT1JFOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9rYl9zYjoKLQkgICAgZmxhZ3MgPSBGX0k5NjBLQjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfbWM6Ci0JICAgIGZsYWdzID0gRl9JOTYwTUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX3hhOgotCSAgICBmbGFncyA9IEZfSTk2MFhBOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9jYToKLQkgICAgZmxhZ3MgPSBGX0k5NjBDQTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Ffc2E6Ci0JICAgIGZsYWdzID0gRl9JOTYwS0E7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2p4OgotCSAgICBmbGFncyA9IEZfSTk2MEpYOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9oeDoKLQkgICAgZmxhZ3MgPSBGX0k5NjBIWDsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JKmZsYWdzcCA9IGZsYWdzOwotCXJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFRJQzMwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzMwOgotICAgICAgKm1hZ2ljcCA9IFRJQzMwTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIFRJQzgwX0FSQ0hfTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzgwOgotICAgICAgKm1hZ2ljcCA9IFRJQzgwX0FSQ0hfTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIEFSTU1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9hcm06Ci0jaWZkZWYgQVJNX1dJTkNFCi0gICAgICAqIG1hZ2ljcCA9IEFSTVBFTUFHSUM7Ci0jZWxzZQotICAgICAgKiBtYWdpY3AgPSBBUk1NQUdJQzsKLSNlbmRpZgotICAgICAgKiBmbGFnc3AgPSAwOwotICAgICAgaWYgKEFQQ1NfU0VUIChhYmZkKSkKLQl7Ci0JICBpZiAoQVBDU18yNl9GTEFHIChhYmZkKSkKLQkgICAgKiBmbGFnc3AgfD0gRl9BUENTMjY7Ci0JICAKLQkgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGFiZmQpKQotCSAgICAqIGZsYWdzcCB8PSBGX0FQQ1NfRkxPQVQ7Ci0JICAKLQkgIGlmIChQSUNfRkxBRyAoYWJmZCkpCi0JICAgICogZmxhZ3NwIHw9IEZfUElDOwotCX0KLSAgICAgIGlmIChJTlRFUldPUktfU0VUIChhYmZkKSAmJiBJTlRFUldPUktfRkxBRyAoYWJmZCkpCi0JKiBmbGFnc3AgfD0gRl9JTlRFUldPUks7Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfYXJtXzI6ICAqIGZsYWdzcCB8PSBGX0FSTV8yOyAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fMmE6ICogZmxhZ3NwIHw9IEZfQVJNXzJhOyBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV8zOiAgKiBmbGFnc3AgfD0gRl9BUk1fMzsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzNNOiAqIGZsYWdzcCB8PSBGX0FSTV8zTTsgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fNDogICogZmxhZ3NwIHw9IEZfQVJNXzQ7ICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV80VDogKiBmbGFnc3AgfD0gRl9BUk1fNFQ7IGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzU6ICAqIGZsYWdzcCB8PSBGX0FSTV81OyAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fNVQ6ICogZmxhZ3NwIHw9IEZfQVJNXzU7ICBicmVhazsgLyogWFhYIC0gd2UgZG8gbm90IGhhdmUgYW4gRl9BUk1fNVQgKi8KLQl9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIFBQQ01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgKm1hZ2ljcCA9IFBQQ01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEkzODZNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgICptYWdpY3AgPSBJMzg2TUFHSUM7Ci0jaWZkZWYgTFlOWE9TCi0gICAgICAvKiBKdXN0IG92ZXJ3cml0ZSB0aGUgdXN1YWwgdmFsdWUgaWYgd2UncmUgZG9pbmcgTHlueC4gKi8KLSAgICAgICptYWdpY3AgPSBMWU5YQ09GRk1BR0lDOwotI2VuZGlmCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSTg2ME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9pODYwOgotICAgICAgKm1hZ2ljcCA9IEk4NjBNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNQzY4TUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0jaWZkZWYgQVBPTExPTTY4S01BR0lDCi0gICAgICAqbWFnaWNwID0gQVBPTExPX0NPRkZfVkVSU0lPTl9OVU1CRVI7Ci0jZWxzZQotICAgICAgLyogTkFNRVNfSEFWRV9VTkRFUlNDT1JFIG1heSBiZSBkZWZpbmVkIGJ5IGNvZmYtdTY4ay5jLiAgKi8KLSNpZmRlZiBOQU1FU19IQVZFX1VOREVSU0NPUkUKLSAgICAgICptYWdpY3AgPSBNQzY4S0JDU01BR0lDOwotI2Vsc2UKLSAgICAgICptYWdpY3AgPSBNQzY4TUFHSUM7Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIExZTlhPUwotICAgICAgLyogSnVzdCBvdmVyd3JpdGUgdGhlIHVzdWFsIHZhbHVlIGlmIHdlJ3JlIGRvaW5nIEx5bnguICovCi0gICAgICAqbWFnaWNwID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgTUM4OE1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9tODhrOgotICAgICAgKm1hZ2ljcCA9IE1DODhPTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSDgzMDBNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfaDgzMDA6Ci0JICAqbWFnaWNwID0gSDgzMDBNQUdJQzsKLQkgIHJldHVybiB0cnVlOwotCWNhc2UgYmZkX21hY2hfaDgzMDBoOgotCSAgKm1hZ2ljcCA9IEg4MzAwSE1BR0lDOwotCSAgcmV0dXJuIHRydWU7Ci0JY2FzZSBiZmRfbWFjaF9oODMwMHM6Ci0JICAqbWFnaWNwID0gSDgzMDBTTUFHSUM7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU0hfQVJDSF9NQUdJQ19CSUcKLSAgICBjYXNlIGJmZF9hcmNoX3NoOgotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgKm1hZ2ljcCA9IFNIX0FSQ0hfTUFHSUNfV0lOQ0U7Ci0jZWxzZQotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQkqbWFnaWNwID0gU0hfQVJDSF9NQUdJQ19CSUc7Ci0gICAgICBlbHNlCi0JKm1hZ2ljcCA9IFNIX0FSQ0hfTUFHSUNfTElUVExFOwotI2VuZGlmCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBNSVBTX0FSQ0hfTUFHSUNfV0lOQ0UKLSAgICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgICAqbWFnaWNwID0gTUlQU19BUkNIX01BR0lDX1dJTkNFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU1BBUkNNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICAqbWFnaWNwID0gU1BBUkNNQUdJQzsKLSNpZmRlZiBMWU5YT1MKLSAgICAgIC8qIEp1c3Qgb3ZlcndyaXRlIHRoZSB1c3VhbCB2YWx1ZSBpZiB3ZSdyZSBkb2luZyBMeW54LiAqLwotICAgICAgKm1hZ2ljcCA9IExZTlhDT0ZGTUFHSUM7Ci0jZW5kaWYKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4NTAwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgotICAgICAgKm1hZ2ljcCA9IEg4NTAwTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQTI5S19NQUdJQ19CSUcKLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCSptYWdpY3AgPSBBMjlLX01BR0lDX0JJRzsKLSAgICAgIGVsc2UKLQkqbWFnaWNwID0gQTI5S19NQUdJQ19MSVRUTEU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBXRTMyS01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF93ZTMyazoKLSAgICAgICptYWdpY3AgPSBXRTMyS01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgVTgwMlRPQ01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0jaWZuZGVmIFBQQ01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotI2VuZGlmCi0gICAgICAqbWFnaWNwID0gVTgwMlRPQ01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgTUNPUkVNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICAqIG1hZ2ljcCA9IE1DT1JFTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotICAgICAgCi0gICAgZGVmYXVsdDoJCQkvKiBVbmtub3duIGFyY2hpdGVjdHVyZSAqLwotICAgICAgLyogcmV0dXJuIGZhbHNlOyAgLS0gZmFsbCB0aHJvdWdoIHRvICJyZXR1cm4gZmFsc2UiIGJlbG93LCB0byBhdm9pZAotICAgICAgICJzdGF0ZW1lbnQgbmV2ZXIgcmVhY2hlZCIgZXJyb3JzIG9uIHRoZSBvbmUgYmVsb3cuICovCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIHVuc2lnbmVkIGR1bW15MTsKLSAgdW5zaWduZWQgc2hvcnQgZHVtbXkyOwotCi0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duICYmCi0gICAgICBjb2ZmX3NldF9mbGFncyAoYWJmZCwgJmR1bW15MSwgJmR1bW15MikgIT0gdHJ1ZSkKLSAgICByZXR1cm4gZmFsc2U7CQkvKiBXZSBjYW4ndCByZXByZXNlbnQgdGhpcyB0eXBlICovCi0KLSAgcmV0dXJuIHRydWU7CQkJLyogV2UncmUgZWFzeSAuLi4gKi8KLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi0vKiBUaGlzIGlzIHVzZWQgdG8gc29ydCBzZWN0aW9ucyBieSBWTUEsIGFzIHJlcXVpcmVkIGJ5IFBFIGltYWdlCi0gICBmaWxlcy4gICovCi0KLXN0YXRpYyBpbnQgc29ydF9ieV9zZWNhZGRyIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLXNvcnRfYnlfc2VjYWRkciAoYXJnMSwgYXJnMikKLSAgICAgY29uc3QgUFRSIGFyZzE7Ci0gICAgIGNvbnN0IFBUUiBhcmcyOwotewotICBjb25zdCBhc2VjdGlvbiAqYSA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzE7Ci0gIGNvbnN0IGFzZWN0aW9uICpiID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMjsKLQotICBpZiAoYS0+dm1hIDwgYi0+dm1hKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoYS0+dm1hID4gYi0+dm1hKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQotLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9uIGZvciBlYWNoIHNlY3Rpb24uICovCi0KLSNpZm5kZWYgSTk2MAotI2RlZmluZSBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0jZW5kaWYKLSNpZmRlZiBUSUM4MENPRkYKLSN1bmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgYXNlY3Rpb24gKnByZXZpb3VzID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGZpbGVfcHRyIHNvZmFyID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgYm9vbGVhbiBhbGlnbl9hZGp1c3Q7Ci0jaWZkZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotICBmaWxlX3B0ciBvbGRfc29mYXI7Ci0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAvKiBPbiBYQ09GRiwgaWYgd2UgaGF2ZSBzeW1ib2xzLCBzZXQgdXAgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN6OwotICAgICAgYmZkX3NpemVfdHlwZSBpLCBzeW1jb3VudDsKLSAgICAgIGFzeW1ib2wgKipzeW1wOwotCi0gICAgICBzeiA9IDA7Ci0gICAgICBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICAgICAgZm9yIChzeW1wID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBzeW1jb3VudDsgc3ltcCsrLCBpKyspCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSAqY2Y7Ci0KLQkgIGNmID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgKnN5bXApOwotCSAgaWYgKGNmICE9IE5VTEwKLQkgICAgICAmJiBjZi0+bmF0aXZlICE9IE5VTEwKLQkgICAgICAmJiBTWU1OQU1FX0lOX0RFQlVHICgmY2YtPm5hdGl2ZS0+dS5zeW1lbnQpKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoKnN5bXApKTsKLQkgICAgICBpZiAobGVuID4gU1lNTk1MRU4pCi0JCXN6ICs9IGxlbiArIDM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3ogPiAwKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRlYnVnIik7Ci0JICBpZiAoZHNlYyA9PSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQkgIGRzZWMtPl9yYXdfc2l6ZSA9IHN6OwotCSAgZHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgaW50IHBhZ2Vfc2l6ZTsKLSAgaWYgKGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbykgCi0gICAgewotICAgICAgcGFnZV9zaXplID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5GaWxlQWxpZ25tZW50OwotICAgIH0KLSAgZWxzZQotICAgIHBhZ2Vfc2l6ZSA9IFBFX0RFRl9GSUxFX0FMSUdOTUVOVDsKLSNlbHNlCi0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgaW50IHBhZ2Vfc2l6ZSA9IENPRkZfUEFHRV9TSVpFOwotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiAgQSBzdGFydCBhZGRyZXNzIG1heSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIG9yaWdpbmFsIGZpbGUuIEluIHRoaXMKLQkgIGNhc2UgaXQgd2lsbCBuZWVkIGFuIG9wdGlvbmFsIGhlYWRlciB0byByZWNvcmQgaXQuICAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgc29mYXIgKz0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgZWxzZSBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKLSAgICBzb2ZhciArPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICBlbHNlCi0gICAgc29mYXIgKz0gU01BTExfQU9VVFNaOwotI2VuZGlmCi0KLSAgc29mYXIgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKLSAgICAgYnkgYWxsb2NhdGluZyBhIG5ldyBzZWN0aW9uIGhlYWRlciB0byBob2xkIHRoZSBjb3JyZWN0IGNvdW50cy4gICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLSAgICAgIHNvZmFyICs9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICB7Ci0gICAgLyogUEUgcmVxdWlyZXMgdGhlIHNlY3Rpb25zIHRvIGJlIGluIG1lbW9yeSBvcmRlciB3aGVuIGxpc3RlZCBpbgotICAgICAgIHRoZSBzZWN0aW9uIGhlYWRlcnMuICBJdCBhbHNvIGRvZXMgbm90IGxpa2UgZW1wdHkgbG9hZGFibGUKLSAgICAgICBzZWN0aW9ucy4gIFRoZSBzZWN0aW9ucyBhcHBhcmVudGx5IGRvIG5vdCBoYXZlIHRvIGJlIGluIHRoZQotICAgICAgIHJpZ2h0IG9yZGVyIGluIHRoZSBpbWFnZSBmaWxlIGl0c2VsZiwgYnV0IHdlIGRvIG5lZWQgdG8gZ2V0IHRoZQotICAgICAgIHRhcmdldF9pbmRleCB2YWx1ZXMgcmlnaHQuICAqLwotCi0gICAgaW50IGNvdW50OwotICAgIGFzZWN0aW9uICoqc2VjdGlvbl9saXN0OwotICAgIGludCBpOwotICAgIGludCB0YXJnZXRfaW5kZXg7Ci0KLSAgICBjb3VudCA9IDA7Ci0gICAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgICArK2NvdW50OwotCi0gICAgLyogV2UgYWxsb2NhdGUgYW4gZXh0cmEgY2VsbCB0byBzaW1wbGlmeSB0aGUgZmluYWwgbG9vcC4gICovCi0gICAgc2VjdGlvbl9saXN0ID0gYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYXNlY3Rpb24gKikgKiAoY291bnQgKyAxKSk7Ci0gICAgaWYgKHNlY3Rpb25fbGlzdCA9PSBOVUxMKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaSA9IDA7Ci0gICAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgICB7Ci0Jc2VjdGlvbl9saXN0W2ldID0gY3VycmVudDsKLQkrK2k7Ci0gICAgICB9Ci0gICAgc2VjdGlvbl9saXN0W2ldID0gTlVMTDsKLQotICAgIHFzb3J0IChzZWN0aW9uX2xpc3QsIGNvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLCBzb3J0X2J5X3NlY2FkZHIpOwotCi0gICAgLyogUmV0aHJlYWQgdGhlIGxpbmtlZCBsaXN0IGludG8gc29ydGVkIG9yZGVyOyBhdCB0aGUgc2FtZSB0aW1lLAotICAgICAgIGFzc2lnbiB0YXJnZXRfaW5kZXggdmFsdWVzLiAgKi8KLSAgICB0YXJnZXRfaW5kZXggPSAxOwotICAgIGFiZmQtPnNlY3Rpb25zID0gc2VjdGlvbl9saXN0WzBdOwotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgewotCWN1cnJlbnQgPSBzZWN0aW9uX2xpc3RbaV07Ci0JY3VycmVudC0+bmV4dCA9IHNlY3Rpb25fbGlzdFtpICsgMV07Ci0KLQkvKiBMYXRlciwgaWYgdGhlIHNlY3Rpb24gaGFzIHplcm8gc2l6ZSwgd2UnbGwgYmUgdGhyb3dpbmcgaXQKLQkgICBhd2F5LCBzbyB3ZSBkb24ndCB3YW50IHRvIG51bWJlciBpdCBub3cuICBOb3RlIHRoYXQgaGF2aW5nCi0JICAgYSB6ZXJvIHNpemUgYW5kIGhhdmluZyByZWFsIGNvbnRlbnRzIGFyZSBkaWZmZXJlbnQKLQkgICBjb25jZXB0czogLmJzcyBoYXMgbm8gY29udGVudHMsIGJ1dCAodXN1YWxseSkgbm9uLXplcm8KLQkgICBzaXplLiAgKi8KLQlpZiAoY3VycmVudC0+X3Jhd19zaXplID09IDApCi0JICB7Ci0JICAgIC8qIERpc2NhcmQuICBIb3dldmVyLCBpdCBzdGlsbCBtaWdodCBoYXZlICh2YWxpZCkgc3ltYm9scwotCSAgICAgICBpbiBpdCwgc28gYXJiaXRyYXJpbHkgc2V0IGl0IHRvIHNlY3Rpb24gMSAoaW5kZXhpbmcgaXMKLQkgICAgICAgMS1iYXNlZCBoZXJlOyB1c3VhbGx5IC50ZXh0KS4gIF9fZW5kX18gYW5kIG90aGVyCi0JICAgICAgIGNvbnRlbnRzIG9mIC5lbmRzZWN0aW9uIHJlYWxseSBoYXZlIHRoaXMgaGFwcGVuLgotCSAgICAgICBGSVhNRTogVGhpcyBzZWVtcyBzb21ld2hhdCBkdWJpb3VzLiAgKi8KLQkgICAgY3VycmVudC0+dGFyZ2V0X2luZGV4ID0gMTsKLQkgIH0KLQllbHNlCi0JICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSB0YXJnZXRfaW5kZXgrKzsKLSAgICAgIH0KLQotICAgIGZyZWUgKHNlY3Rpb25fbGlzdCk7Ci0gIH0KLSNlbHNlIC8qICEgQ09GRl9JTUFHRV9XSVRIX1BFICovCi0gIHsKLSAgICAvKiBTZXQgdGhlIHRhcmdldF9pbmRleCBmaWVsZC4gICovCi0gICAgaW50IHRhcmdldF9pbmRleDsKLQotICAgIHRhcmdldF9pbmRleCA9IDE7Ci0gICAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSB0YXJnZXRfaW5kZXgrKzsKLSAgfQotI2VuZGlmIC8qICEgQ09GRl9JTUFHRV9XSVRIX1BFICovCi0KLSAgYWxpZ25fYWRqdXN0ID0gZmFsc2U7Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogV2l0aCBQRSB3ZSBoYXZlIHRvIHBhZCBlYWNoIHNlY3Rpb24gdG8gYmUgYSBtdWx0aXBsZSBvZiBpdHMKLQkgcGFnZSBzaXplIHRvbywgYW5kIHJlbWVtYmVyIGJvdGggc2l6ZXMuICAqLwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSA9PSBOVUxMKQotCXsKLQkgIGN1cnJlbnQtPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY3VycmVudC0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSA9PSBOVUxMKQotCXsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dGRhdGEgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dmlydF9zaXplID09IDApCi0JcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZSA9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLSNlbmRpZgotCi0gICAgICAvKiBPbmx5IGRlYWwgd2l0aCBzZWN0aW9ucyB3aGljaCBoYXZlIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmICghKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykpCi0JY29udGludWU7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBza2lwIGVtcHR5IHNlY3Rpb25zIGluIGEgUEUgaW1hZ2UuICAqLwotICAgICAgaWYgKGN1cnJlbnQtPl9yYXdfc2l6ZSA9PSAwKQotCWNvbnRpbnVlOwotI2VuZGlmCi0KLSAgICAgIC8qIEFsaWduIHRoZSBzZWN0aW9ucyBpbiB0aGUgZmlsZSB0byB0aGUgc2FtZSBib3VuZGFyeSBvbgotCSB3aGljaCB0aGV5IGFyZSBhbGlnbmVkIGluIHZpcnR1YWwgbWVtb3J5LiAgSTk2MCBkb2Vzbid0Ci0JIGRvIHRoaXMgKEZJWE1FKSBzbyB3ZSBjYW4gc3RheSBpbiBzeW5jIHdpdGggSW50ZWwuICA5NjAKLQkgZG9lc24ndCB5ZXQgcGFnZSBmcm9tIGZpbGVzLi4uICovCi0jaWZkZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLQl7Ci0JICAvKiBtYWtlIHN1cmUgdGhpcyBzZWN0aW9uIGlzIGFsaWduZWQgb24gdGhlIHJpZ2h0IGJvdW5kYXJ5IC0gYnkKLQkgICAgIHBhZGRpbmcgdGhlIHByZXZpb3VzIHNlY3Rpb24gdXAgaWYgbmVjZXNzYXJ5ICovCi0KLQkgIG9sZF9zb2ZhciA9IHNvZmFyOwotCSAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcik7Ci0JICBpZiAocHJldmlvdXMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmV2aW91cy0+X3Jhd19zaXplICs9IHNvZmFyIC0gb2xkX3NvZmFyOwotCSAgICB9Ci0JfQotCi0jZW5kaWYKLQotICAgICAgLyogSW4gZGVtYW5kIHBhZ2VkIGZpbGVzIHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUgZmlsZSBvZmZzZXQKLQkgbXVzdCBtYXRjaCB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlIHZpcnR1YWwgYWRkcmVzcy4gICovCi0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0Jc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIHNvZmFyKSAlIHBhZ2Vfc2l6ZTsKLSNlbmRpZgotICAgICAgY3VycmVudC0+ZmlsZXBvcyA9IHNvZmFyOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICAvKiBTZXQgdGhlIHBhZGRlZCBzaXplLiAgKi8KLSAgICAgIGN1cnJlbnQtPl9yYXdfc2l6ZSA9IChjdXJyZW50LT5fcmF3X3NpemUgKyBwYWdlX3NpemUgLTEpICYgLXBhZ2Vfc2l6ZTsKLSNlbmRpZgotCi0gICAgICBzb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSNpZmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0gICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0aGlzIHNlY3Rpb24gaXMgb2YgdGhlIHJpZ2h0IHNpemUgdG9vICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSA9PSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgb2xkX3NpemU7Ci0KLQkgIG9sZF9zaXplID0gY3VycmVudC0+X3Jhd19zaXplOwotCSAgY3VycmVudC0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChjdXJyZW50LT5fcmF3X3NpemUsCi0JCQkJCSAgMSA8PCBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIpOwotCSAgYWxpZ25fYWRqdXN0ID0gY3VycmVudC0+X3Jhd19zaXplICE9IG9sZF9zaXplOwotCSAgc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplIC0gb2xkX3NpemU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9sZF9zb2ZhciA9IHNvZmFyOwotCSAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcik7Ci0JICBhbGlnbl9hZGp1c3QgPSBzb2ZhciAhPSBvbGRfc29mYXI7Ci0JICBjdXJyZW50LT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7Ci0JfQotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIEZvciBQRSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBwYWQgb3V0IHRvIHRoZSBhbGlnbmVkCi0gICAgICAgICBfcmF3X3NpemUsIGluIGNhc2UgdGhlIGNhbGxlciBvbmx5IHdyaXRlcyBvdXQgZGF0YSB0byB0aGUKLSAgICAgICAgIHVuYWxpZ25lZCBfcmF3X3NpemUuICAqLwotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemUgPCBjdXJyZW50LT5fcmF3X3NpemUpCi0JYWxpZ25fYWRqdXN0ID0gdHJ1ZTsKLSNlbmRpZgotCi0jaWZkZWYgX0xJQgotICAgICAgLyogRm9yY2UgLmxpYiBzZWN0aW9ucyB0byBzdGFydCBhdCB6ZXJvLiAgVGhlIHZtYSBpcyB0aGVuCi0JIGluY3JlbWVudGVkIGluIGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMuICBUaGlzIGlzIHJpZ2h0IGZvcgotCSBTVlIzLjIuICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQliZmRfc2V0X3NlY3Rpb25fdm1hIChhYmZkLCBjdXJyZW50LCAwKTsKLSNlbmRpZgotCi0gICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0gICAgfQotCi0gIC8qIEl0IGlzIG5vdyBzYWZlIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgZmlsZS4gIElmIHdlIG5lZWRlZCBhbgotICAgICBhbGlnbm1lbnQgYWRqdXN0bWVudCBmb3IgdGhlIGxhc3Qgc2VjdGlvbiwgdGhlbiBtYWtlIHN1cmUgdGhhdAotICAgICB0aGVyZSBpcyBhIGJ5dGUgYXQgb2Zmc2V0IHNvZmFyLiAgSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMgYW5kIG5vCi0gICAgIHJlbG9jcywgdGhlbiBub3RoaW5nIGZvbGxvd3MgdGhlIGxhc3Qgc2VjdGlvbi4gIElmIHdlIGRvbid0IGZvcmNlCi0gICAgIHRoZSBsYXN0IGJ5dGUgb3V0LCB0aGVuIHRoZSBmaWxlIG1heSBhcHBlYXIgdG8gYmUgdHJ1bmNhdGVkLiAgKi8KLSAgaWYgKGFsaWduX2FkanVzdCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICBiID0gMDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc29mYXIgLSAxLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgcmVsb2NhdGlvbnMgYXJlIGFsaWduZWQuICBXZSBkb24ndCBuZWVkIHRvIG1ha2UKLSAgICAgc3VyZSB0aGF0IHRoaXMgYnl0ZSBleGlzdHMsIGJlY2F1c2UgaXQgd2lsbCBvbmx5IG1hdHRlciBpZiB0aGVyZQotICAgICByZWFsbHkgYXJlIHJlbG9jcy4gICovCi0gIHNvZmFyID0gQkZEX0FMSUdOIChzb2ZhciwgMSA8PCBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOwotCi0gIG9ial9yZWxvY2Jhc2UgKGFiZmQpID0gc29mYXI7Ci0gIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGNhbiBuZXZlciB3b3JrLCBiZWNhdXNlIGl0IGlzIGNhbGxlZCB0b28gbGF0ZS0tYWZ0ZXIgdGhlCi0gICBzZWN0aW9uIHBvc2l0aW9ucyBoYXZlIGJlZW4gc2V0LiAgSSBjYW4ndCBmaWd1cmUgb3V0IHdoYXQgaXQgaXMKLSAgIGZvciwgc28gSSBhbSBnb2luZyB0byBkaXNhYmxlIGl0LS1JYW4gVGF5bG9yIDIwIE1hcmNoIDE5OTYuICAqLwotCi0vKiBJZiAuZmlsZSwgLnRleHQsIC5kYXRhLCAuYnNzIHN5bWJvbHMgYXJlIG1pc3NpbmcsIGFkZCB0aGVtLiAgKi8KLS8qIEBAIFNob3VsZCB3ZSBvbmx5IGJlIGFkZGluZyBtaXNzaW5nIHN5bWJvbHMsIG9yIG92ZXJyaWRpbmcgdGhlIGF1eAotICAgdmFsdWVzIGZvciBleGlzdGluZyBzZWN0aW9uIHN5bWJvbHM/ICAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgbnN5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgYXN5bWJvbCAqKnN5bXBwID0gYWJmZC0+b3V0c3ltYm9sczsKLSAgYXN5bWJvbCAqKnN5bXBwMjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBuZWVkX3RleHQgPSAxLCBuZWVkX2RhdGEgPSAxLCBuZWVkX2JzcyA9IDEsIG5lZWRfZmlsZSA9IDE7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5zeW1zOyBpKyspCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bXBwW2ldKTsKLSAgICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgICBpZiAoY3N5bSkKLQl7Ci0JICAvKiBvbmx5IGRvIHRoaXMgaWYgdGhlcmUgaXMgYSBjb2ZmIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dAotCSAgIHN5bWJvbCAqLwotCSAgaWYgKGNzeW0tPm5hdGl2ZSAmJiBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRSkKLQkgICAgewotCSAgICAgIG5lZWRfZmlsZSA9IDA7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIG5hbWUgPSBjc3ltLT5zeW1ib2wubmFtZTsKLQkgIGlmICghbmFtZSkKLQkgICAgY29udGludWU7Ci0JICBpZiAoIXN0cmNtcCAobmFtZSwgX1RFWFQpKQotCSAgICBuZWVkX3RleHQgPSAwOwotI2lmZGVmIEFQT0xMT19NNjgKLQkgIGVsc2UgaWYgKCFzdHJjbXAgKG5hbWUsICIud3RleHQiKSkKLQkgICAgbmVlZF90ZXh0ID0gMDsKLSNlbmRpZgotCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgX0RBVEEpKQotCSAgICBuZWVkX2RhdGEgPSAwOwotCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgX0JTUykpCi0JICAgIG5lZWRfYnNzID0gMDsKLQl9Ci0gICAgfQotICAvKiBOb3cgaSA9PSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKS4gICovCi0gIC8qIEBAIEZvciBub3csIGRvbid0IGRlYWwgd2l0aCAuZmlsZSBzeW1ib2wuICAqLwotICBuZWVkX2ZpbGUgPSAwOwotCi0gIGlmICghbmVlZF90ZXh0ICYmICFuZWVkX2RhdGEgJiYgIW5lZWRfYnNzICYmICFuZWVkX2ZpbGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIG5zeW1zICs9IG5lZWRfdGV4dCArIG5lZWRfZGF0YSArIG5lZWRfYnNzICsgbmVlZF9maWxlOwotICBzeW1wcDIgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChhYmZkLCBuc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIGlmICghc3ltcHAyKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtY3B5IChzeW1wcDIsIHN5bXBwLCBpICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWYgKG5lZWRfZmlsZSkKLSAgICB7Ci0gICAgICAvKiBAQCBHZW5lcmF0ZSBmYWtlIC5maWxlIHN5bWJvbCwgaW4gc3ltcHAyW2ldLCBhbmQgaW5jcmVtZW50IGkuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBpZiAobmVlZF90ZXh0KQotICAgIHN5bXBwMltpKytdID0gY29mZl9zZWN0aW9uX3N5bWJvbCAoYWJmZCwgX1RFWFQpOwotICBpZiAobmVlZF9kYXRhKQotICAgIHN5bXBwMltpKytdID0gY29mZl9zZWN0aW9uX3N5bWJvbCAoYWJmZCwgX0RBVEEpOwotICBpZiAobmVlZF9ic3MpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfQlNTKTsKLSAgQkZEX0FTU0VSVCAoaSA9PSBuc3ltcyk7Ci0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW1wcDIsIG5zeW1zKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFNVUFBSRVNTIDU1OCAqLwotLyogU1VQUFJFU1MgNTI5ICovCi1zdGF0aWMgYm9vbGVhbgotY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICBib29sZWFuIGhhc3JlbG9jcyA9IGZhbHNlOwotICBib29sZWFuIGhhc2xpbm5vID0gZmFsc2U7Ci0gIGJvb2xlYW4gaGFzZGVidWcgPSBmYWxzZTsKLSAgZmlsZV9wdHIgc2NuX2Jhc2U7Ci0gIGZpbGVfcHRyIHJlbG9jX2Jhc2U7Ci0gIGZpbGVfcHRyIGxpbmVub19iYXNlOwotICBmaWxlX3B0ciBzeW1fYmFzZTsKLSAgdW5zaWduZWQgbG9uZyByZWxvY19zaXplID0gMDsKLSAgdW5zaWduZWQgbG9uZyBsbm5vX3NpemUgPSAwOwotICBib29sZWFuIGxvbmdfc2VjdGlvbl9uYW1lczsKLSAgYXNlY3Rpb24gKnRleHRfc2VjID0gTlVMTDsKLSAgYXNlY3Rpb24gKmRhdGFfc2VjID0gTlVMTDsKLSAgYXNlY3Rpb24gKmJzc19zZWMgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBpbnRlcm5hbF9mOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBpbnRlcm5hbF9hOwotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIHNpemVfdCBzdHJpbmdfc2l6ZSA9IFNUUklOR19TSVpFX1NJWkU7Ci0jZW5kaWYKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCi0gIC8qIE1ha2UgYSBwYXNzIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSB0byBjb3VudCBsaW5lIG51bWJlciBlbnRyaWVzIGFuZAotICAgICBwdXQgdGhlbSBpbnRvIHRoZSBjb3JyZWN0IGFzZWN0aW9ucyAqLwotCi0gIGxubm9fc2l6ZSA9IGNvZmZfY291bnRfbGluZW51bWJlcnMgKGFiZmQpICogYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZWxvY19iYXNlID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0KLSAgLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIHJlbG9jIGFuZCBsaW5ubyBhcmVhcyAqLwotCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgcmVsb2Nfc2l6ZSArPSBjdXJyZW50LT5yZWxvY19jb3VudCAqIGJmZF9jb2ZmX3JlbHN6IChhYmZkKTsKLQotICBsaW5lbm9fYmFzZSA9IHJlbG9jX2Jhc2UgKyByZWxvY19zaXplOwotICBzeW1fYmFzZSA9IGxpbmVub19iYXNlICsgbG5ub19zaXplOwotCi0gIC8qIEluZGljYXRlIGluIGVhY2ggc2VjdGlvbi0+bGluZV9maWxlcG9zIGl0cyBhY3R1YWwgZmlsZSBhZGRyZXNzICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnQtPmxpbmVub19jb3VudCkKLQl7Ci0JICBjdXJyZW50LT5saW5lX2ZpbGVwb3MgPSBsaW5lbm9fYmFzZTsKLQkgIGN1cnJlbnQtPm1vdmluZ19saW5lX2ZpbGVwb3MgPSBsaW5lbm9fYmFzZTsKLQkgIGxpbmVub19iYXNlICs9IGN1cnJlbnQtPmxpbmVub19jb3VudCAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGN1cnJlbnQtPmxpbmVfZmlsZXBvcyA9IDA7Ci0JfQotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50KQotCXsKLQkgIGN1cnJlbnQtPnJlbF9maWxlcG9zID0gcmVsb2NfYmFzZTsKLQkgIHJlbG9jX2Jhc2UgKz0gY3VycmVudC0+cmVsb2NfY291bnQgKiBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGN1cnJlbnQtPnJlbF9maWxlcG9zID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIHNlY3Rpb24gaGVhZGVycyB0byB0aGUgZmlsZS4gICovCi0gIGludGVybmFsX2YuZl9uc2NucyA9IDA7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLSAgICBzY25fYmFzZSA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkgKyBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICBlbHNlCi0gICAgewotICAgICAgc2NuX2Jhc2UgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0Jc2NuX2Jhc2UgKz0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSAgICAgIGVsc2UKLQlzY25fYmFzZSArPSBTTUFMTF9BT1VUU1o7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzY25fYmFzZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxvbmdfc2VjdGlvbl9uYW1lcyA9IGZhbHNlOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciBzZWN0aW9uOwotICAgICAgYm9vbGVhbiBpc19yZWxvY19zZWN0aW9uID0gZmFsc2U7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsICIucmVsb2MiKSA9PSAwKQotCXsKLQkgIGlzX3JlbG9jX3NlY3Rpb24gPSB0cnVlOwotCSAgaGFzcmVsb2NzID0gdHJ1ZTsKLQkgIHBlX2RhdGEgKGFiZmQpLT5oYXNfcmVsb2Nfc2VjdGlvbiA9IDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGludGVybmFsX2YuZl9uc2NucysrOwotCi0gICAgICBzdHJuY3B5IChzZWN0aW9uLnNfbmFtZSwgY3VycmVudC0+bmFtZSwgU0NOTk1MRU4pOwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgICAgIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMgYXMgaW4gUEUuICBUaGlzIG11c3QgYmUgY29tcGF0aWJsZQotICAgICAgICAgd2l0aCB0aGUgY29kZSBpbiBjb2ZmX3dyaXRlX3N5bWJvbHMgYW5kIF9iZmRfY29mZl9maW5hbF9saW5rLiAgKi8KLSAgICAgIHsKLQlzaXplX3QgbGVuOwotCi0JbGVuID0gc3RybGVuIChjdXJyZW50LT5uYW1lKTsKLQlpZiAobGVuID4gU0NOTk1MRU4pCi0JICB7Ci0JICAgIG1lbXNldCAoc2VjdGlvbi5zX25hbWUsIDAsIFNDTk5NTEVOKTsKLQkgICAgc3ByaW50ZiAoc2VjdGlvbi5zX25hbWUsICIvJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHN0cmluZ19zaXplKTsKLQkgICAgc3RyaW5nX3NpemUgKz0gbGVuICsgMTsKLQkgICAgbG9uZ19zZWN0aW9uX25hbWVzID0gdHJ1ZTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgX0xJQgotICAgICAgLyogQWx3YXlzIHNldCBzX3ZhZGRyIG9mIC5saWIgdG8gMC4gIFRoaXMgaXMgcmlnaHQgZm9yIFNWUjMuMgotCSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQlzZWN0aW9uLnNfdmFkZHIgPSAwOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICBzZWN0aW9uLnNfdmFkZHIgPSBjdXJyZW50LT52bWE7Ci0gICAgICBzZWN0aW9uLnNfcGFkZHIgPSBjdXJyZW50LT5sbWE7Ci0gICAgICBzZWN0aW9uLnNfc2l6ZSA9ICBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFJlbWluZGVyOiBzX3BhZGRyIGhvbGRzIHRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMCi0JICAmJiBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMKQotCXNlY3Rpb24uc19wYWRkciA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemU7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3BhZGRyID0gMDsKLSNlbmRpZgotCi0gICAgICAvKgotCSBJZiB0aGlzIHNlY3Rpb24gaGFzIG5vIHNpemUgb3IgaXMgdW5sb2FkYWJsZSB0aGVuIHRoZSBzY25wdHIKLQkgd2lsbCBiZSAwIHRvbwotCSAqLwotICAgICAgaWYgKGN1cnJlbnQtPl9yYXdfc2l6ZSA9PSAwIHx8Ci0JICAoY3VycmVudC0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKSkgPT0gMCkKLQl7Ci0JICBzZWN0aW9uLnNfc2NucHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2VjdGlvbi5zX3NjbnB0ciA9IGN1cnJlbnQtPmZpbGVwb3M7Ci0JfQotICAgICAgc2VjdGlvbi5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7Ci0gICAgICBzZWN0aW9uLnNfbnJlbG9jID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0gICAgICBzZWN0aW9uLnNfbmxubm8gPSBjdXJyZW50LT5saW5lbm9fY291bnQ7Ci0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogSW4gUEVJLCByZWxvY3MgY29tZSBpbiB0aGUgLnJlbG9jIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ICE9IDApCi0JaGFzcmVsb2NzID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgaWYgKGN1cnJlbnQtPmxpbmVub19jb3VudCAhPSAwKQotCWhhc2xpbm5vID0gdHJ1ZTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0JICAmJiAhIGlzX3JlbG9jX3NlY3Rpb24pCi0JaGFzZGVidWcgPSB0cnVlOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgICAvKiBJbmRpY2F0ZSB0aGUgdXNlIG9mIGFuIFhDT0ZGIG92ZXJmbG93IHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLQl7Ci0JICBzZWN0aW9uLnNfbnJlbG9jID0gMHhmZmZmOwotCSAgc2VjdGlvbi5zX25sbm5vID0gMHhmZmZmOwotCX0KLSNlbmRpZgotCi0gICAgICBzZWN0aW9uLnNfZmxhZ3MgPSBzZWNfdG9fc3R5cF9mbGFncyAoY3VycmVudC0+bmFtZSwgY3VycmVudC0+ZmxhZ3MpOwotCi0gICAgICBpZiAoIXN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1RFWFQpKQotCXsKLQkgIHRleHRfc2VjID0gY3VycmVudDsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChjdXJyZW50LT5uYW1lLCBfREFUQSkpCi0JewotCSAgZGF0YV9zZWMgPSBjdXJyZW50OwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9CU1MpKQotCXsKLQkgIGJzc19zZWMgPSBjdXJyZW50OwotCX0KLQotI2lmZGVmIEk5NjAKLSAgICAgIHNlY3Rpb24uc19hbGlnbiA9IChjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIKLQkJCSA/IDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyCi0JCQkgOiAwKTsKLSNlbHNlCi0jaWZkZWYgVElDODBDT0ZGCi0gICAgICBzZWN0aW9uLnNfZmxhZ3MgfD0gKGN1cnJlbnQtPmFsaWdubWVudF9wb3dlciAmIDB4RikgPDwgODsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFN1cHByZXNzIG91dHB1dCBvZiB0aGUgc2VjdGlvbnMgaWYgdGhleSBhcmUgbnVsbC4gIGxkCi0JIGluY2x1ZGVzIHRoZSBic3MgYW5kIGRhdGEgc2VjdGlvbnMgZXZlbiBpZiB0aGVyZSBpcyBubyBzaXplCi0JIGFzc2lnbmVkIHRvIHRoZW0uICBOVCBsb2FkZXIgZG9lc24ndCBsaWtlIGl0IGlmIHRoZXNlIHNlY3Rpb24KLQkgaGVhZGVycyBhcmUgaW5jbHVkZWQgaWYgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMgYXJlIG5vdAotCSBuZWVkZWQuICBTZWUgYWxzbyBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gICovCi0gICAgICBpZiAoc2VjdGlvbi5zX3NpemUgPT0gMCkKLQlpbnRlcm5hbF9mLmZfbnNjbnMtLTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCXsKLQkgIFNDTkhEUiBidWZmOwotCSAgaWYgKGNvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAmc2VjdGlvbiwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICgmYnVmZiksIDEsIGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCksIGFiZmQpCi0JICAgICAgICAgICAhPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICAvKiBQRSBzdG9yZXMgQ09NREFUIHNlY3Rpb24gaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIElmCi0gICAgICAgICB0aGlzIHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gaGF2ZSBzb21lIENPTURBVCBpbmZvLCB0cmFjayBkb3duCi0gICAgICAgICB0aGUgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIG1vZGlmeSBpdC4gICovCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0xJTktfT05DRSkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaSwgY291bnQ7Ci0JICBhc3ltYm9sICoqcHN5bTsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW0gPSBOVUxMOwotCSAgYXN5bWJvbCAqKnBzeW1zZWM7Ci0KLQkgIHBzeW1zZWMgPSBOVUxMOwotCSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGZvciAoaSA9IDAsIHBzeW0gPSBhYmZkLT5vdXRzeW1ib2xzOyBpIDwgY291bnQ7IGkrKywgcHN5bSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCgqcHN5bSktPnNlY3Rpb24gIT0gY3VycmVudCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChwc3ltc2VjID09IE5VTEwpCi0JCXBzeW1zZWMgPSBwc3ltOwotCi0JICAgICAgLyogU2VlIGlmIHRoaXMgaXMgdGhlIHNlY3Rpb24gc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoc3RyY21wICgoKnBzeW0pLT5uYW1lLCBjdXJyZW50LT5uYW1lKSA9PSAwKQotCQl7Ci0JCSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsICpwc3ltKTsKLQkJICBpZiAoY3N5bSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPCAxCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgIT0gQ19TVEFUCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlICE9IFRfTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgLyogSGVyZSAqUFNZTSBpcyB0aGUgc2VjdGlvbiBzeW1ib2wgZm9yIENVUlJFTlQuICAqLwotCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBEaWQgd2UgZmluZCBpdD8KLQkgICAgIE5vdGUgdGhhdCB3ZSBtaWdodCBub3QgaWYgd2UncmUgY29udmVydGluZyB0aGUgZmlsZSBmcm9tCi0JICAgICBzb21lIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdC4gICovCi0JICBpZiAoaSA8IGNvdW50KQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotCi0JICAgICAgLyogV2UgZG9uJ3QgdG91Y2ggdGhlIHhfY2hlY2tzdW0gZmllbGQuICBUaGUKLQkJIHhfYXNzb2NpYXRlZCBmaWVsZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gICovCi0KLQkgICAgICBhdXggPSBjc3ltLT5uYXRpdmUgKyAxOwotCSAgICAgIHN3aXRjaCAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfTElOS19EVVBMSUNBVEVTKQotCQl7Ci0JCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWTsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPQotCQkgICAgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFM6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBUaGUgQ09NREFUIHN5bWJvbCBtdXN0IGJlIHRoZSBmaXJzdCBzeW1ib2wgZnJvbSB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEluIG9yZGVyIHRvIG1ha2UgdGhpcwotICAgICAgICAgICAgICAgICB3b3JrLCB3ZSBtb3ZlIHRoZSBDT01EQVQgc3ltYm9sIGJlZm9yZSB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgc3ltYm9sIHdlIGZvdW5kIGluIHRoZSBzZWFyY2ggYWJvdmUuICBJdCdzIE9LIHRvCi0gICAgICAgICAgICAgICAgIHJlYXJyYW5nZSB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgY29mZl9yZW51bWJlcl9zeW1ib2xzIGlzIGdvaW5nIHRvIHJlYXJyYW5nZSBpdAotICAgICAgICAgICAgICAgICBmdXJ0aGVyIGFuZCBmaXggdXAgYWxsIHRoZSBhdXggZW50cmllcy4gICovCi0JICAgICAgaWYgKHBzeW0gIT0gcHN5bXNlYykKLQkJewotCQkgIGFzeW1ib2wgKmhvbGQ7Ci0JCSAgYXN5bWJvbCAqKnBjb3B5OwotCi0JCSAgaG9sZCA9ICpwc3ltOwotCQkgIGZvciAocGNvcHkgPSBwc3ltOyBwY29weSA+IHBzeW1zZWM7IHBjb3B5LS0pCi0JCSAgICBwY29weVswXSA9IHBjb3B5Wy0xXTsKLQkJICAqcHN5bXNlYyA9IGhvbGQ7Ci0JCX0KLQkgICAgfQotCX0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLSAgICB9Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKLSAgICAgYnkgY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiBoZWFkZXIgdG8gaG9sZCB0aGUgY29ycmVjdCB2YWx1ZXMuICAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IGN1cnJlbnQtPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciBzY25oZHI7Ci0JICBTQ05IRFIgYnVmZjsKLQotCSAgaW50ZXJuYWxfZi5mX25zY25zKys7Ci0JICBzdHJuY3B5ICgmKHNjbmhkci5zX25hbWVbMF0pLCBjdXJyZW50LT5uYW1lLCA4KTsKLQkgIHNjbmhkci5zX3BhZGRyID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0JICBzY25oZHIuc192YWRkciA9IGN1cnJlbnQtPmxpbmVub19jb3VudDsKLQkgIHNjbmhkci5zX3NpemUgPSAwOwotCSAgc2NuaGRyLnNfc2NucHRyID0gMDsKLQkgIHNjbmhkci5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotCSAgc2NuaGRyLnNfbG5ub3B0ciA9IGN1cnJlbnQtPmxpbmVfZmlsZXBvczsKLQkgIHNjbmhkci5zX25yZWxvYyA9IGN1cnJlbnQtPnRhcmdldF9pbmRleDsKLQkgIHNjbmhkci5zX25sbm5vID0gY3VycmVudC0+dGFyZ2V0X2luZGV4OwotCSAgc2NuaGRyLnNfZmxhZ3MgPSBTVFlQX09WUkZMTzsKLQkgIGlmIChjb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgJnNjbmhkciwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICZidWZmLCAxLCBiZmRfY29mZl9zY25oc3ogKGFiZmQpLCBhYmZkKQotCSAgICAgICAgICAgIT0gYmZkX2NvZmZfc2NuaHN6IChhYmZkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAvKiBPSywgbm93IHNldCB1cCB0aGUgZmlsZWhkci4uLiAqLwotCi0gIC8qIERvbid0IGluY2x1ZGUgdGhlIGludGVybmFsIGFicyBzZWN0aW9uIGluIHRoZSBzZWN0aW9uIGNvdW50ICovCi0KLSAgLyoKLSAgICAgV2Ugd2lsbCBOT1QgcHV0IGEgZnVja2luZyB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBoZXJlLiBFdmVyeSB0aW1lIHlvdQotICAgICBwdXQgaXQgYmFjaywgSSB3aWxsIGNvbWUgaW4gYW5kIHRha2UgaXQgb3V0IGFnYWluLiAgSSdtIHNvcnJ5LiAgVGhpcwotICAgICBmaWVsZCBkb2VzIG5vdCBiZWxvbmcgaGVyZS4gIFdlIGZpbGwgaXQgd2l0aCBhIDAgc28gaXQgY29tcGFyZXMgdGhlCi0gICAgIHNhbWUgYnV0IGlzIG5vdCBhIHJlYXNvbmFibGUgdGltZS4gLS0gZ251QGN5Z251cy5jb20KLSAgICAgKi8KLSAgaW50ZXJuYWxfZi5mX3RpbWRhdCA9IDA7Ci0KLSAgaW50ZXJuYWxfZi5mX2ZsYWdzID0gMDsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX29wdGhkciA9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9mLmZfb3B0aGRyID0gMDsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCWludGVybmFsX2YuZl9vcHRoZHIgPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICAgICAgZWxzZQotCWludGVybmFsX2YuZl9vcHRoZHIgPSBTTUFMTF9BT1VUU1o7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCFoYXNyZWxvY3MpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfUkVMRkxHOwotICBpZiAoIWhhc2xpbm5vKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xOTk87Ci0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9FWEVDOwotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICBpZiAoISBoYXNkZWJ1ZykKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRDsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXUjsKLSAgZWxzZQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXOwotI2VuZGlmCi0KLSNpZmRlZiBUSUM4MF9UQVJHRVRfSUQKLSAgaW50ZXJuYWxfZi5mX3RhcmdldF9pZCA9IFRJQzgwX1RBUkdFVF9JRDsKLSNlbmRpZgotCi0gIC8qCi0gICAgIEZJWE1FLCBzaG91bGQgZG8gc29tZXRoaW5nIGFib3V0IHRoZSBvdGhlciBieXRlIG9yZGVycyBhbmQKLSAgICAgYXJjaGl0ZWN0dXJlcy4KLSAgICAgKi8KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9TSFJPQko7Ci0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgX0xPQURFUikgIT0gTlVMTCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9EWU5MT0FEOwotI2VuZGlmCi0KLSAgbWVtc2V0ICgmaW50ZXJuYWxfYSwgMCwgc2l6ZW9mIGludGVybmFsX2EpOwotCi0gIC8qIFNldCB1cCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHN0dWZmICovCi0KLSAgewotICAgIHVuc2lnbmVkIGludCBtYWdpYyA9IDA7Ci0gICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSAwOwotICAgIGNvZmZfc2V0X2ZsYWdzIChhYmZkLCAmbWFnaWMsICZmbGFncyk7Ci0gICAgaW50ZXJuYWxfZi5mX21hZ2ljID0gbWFnaWM7Ci0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IGZsYWdzOwotICAgIC8qIC4uLmFuZCB0aGUgIm9wdCJoZHIuLi4gKi8KLQotI2lmZGVmIEEyOUsKLSNpZmRlZiBVTFRSQTMJCQkvKiBOWVUncyBtYWNoaW5lICovCi0gICAgLyogRklYTUU6IFRoaXMgaXMgYSBib2d1cyBjaGVjay4gIEkgcmVhbGx5IHdhbnQgdG8gc2VlIGlmIHRoZXJlCi0gICAgICogaXMgYSAuc2hic3Mgb3IgYSAuc2hkYXRhIHNlY3Rpb24sIGlmIHNvIHRoZW4gc2V0IHRoZSBtYWdpYwotICAgICAqIG51bWJlciB0byBpbmRpY2F0ZSBhIHNoYXJlZCBkYXRhIGV4ZWN1dGFibGUuCi0gICAgICovCi0gICAgaWYgKGludGVybmFsX2YuZl9uc2NucyA+PSA3KQotICAgICAgaW50ZXJuYWxfYS5tYWdpYyA9IFNITUFHSUM7IC8qIFNoYXJlZCBtYWdpYyAqLwotICAgIGVsc2UKLSNlbmRpZiAvKiBVTFRSQTMgKi8KLSAgICAgIGludGVybmFsX2EubWFnaWMgPSBOTUFHSUM7IC8qIEFzc3VtZSBzZXBhcmF0ZSBpL2QgKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogQTI5SyAqLwotI2lmZGVmIFRJQzgwQ09GRgotICAgIGludGVybmFsX2EubWFnaWMgPSBUSUM4MF9BUkNIX01BR0lDOwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNlbmRpZiAvKiBUSUM4MCAqLwotI2lmZGVmIEk4NjAKLSAgICAvKiBGSVhNRTogV2hhdCBhcmUgdGhlIGEub3V0IG1hZ2ljIG51bWJlcnMgZm9yIHRoZSBpODYwPyAgKi8KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gMDsKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogSTg2MCAqLwotI2lmZGVmIEk5NjAKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gKG1hZ2ljID09IEk5NjBST01BR0lDID8gTk1BR0lDIDogT01BR0lDKTsKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogSTk2MCAqLwotI2lmIE04OAotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gUEFHRU1BR0lDQkNTOwotI2VuZGlmIC8qIE04OCAqLwotCi0jaWYgQVBPTExPX002OAotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gQVBPTExPX0NPRkZfVkVSU0lPTl9OVU1CRVI7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoTTY4KSB8fCBkZWZpbmVkKFdFMzJLKSB8fCBkZWZpbmVkKE02OEspCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2lmIGRlZmluZWQoTFlOWE9TKQotICAgIGludGVybmFsX2EubWFnaWMgPSBMWU5YQ09GRk1BR0lDOwotI2Vsc2UKLSNpZiBkZWZpbmVkKFRBUkdfQVVYKQotICAgIGludGVybmFsX2EubWFnaWMgPSAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEID8gUEFHRU1BR0lDUEVYRUNQQUdFRCA6Ci0JCQlhYmZkLT5mbGFncyAmIFdQX1RFWFQgPyBQQUdFTUFHSUNQRVhFQ1NXQVBQRUQgOgotCQkJUEFHRU1BR0lDRVhFQ1NXQVBQRUQpOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChQQUdFTUFHSUNQRVhFQ1BBR0VEKQotICAgIGludGVybmFsX2EubWFnaWMgPSBQQUdFTUFHSUNQRVhFQ1BBR0VEOwotI2VuZGlmCi0jZW5kaWYgLyogVEFSR19BVVggKi8KLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBNNjggfHwgV0UzMksgfHwgTTY4SyAqLwotCi0jaWYgZGVmaW5lZChBUk0pCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBaTUFHSUM7Ci0jZW5kaWYgCi0KLSNpZiBkZWZpbmVkKFBQQ19QRSkKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQzsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBNQ09SRV9QRQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDOwotI2VuZGlmIAotCi0jaWYgZGVmaW5lZChJMzg2KQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbHNlICAvKiBMWU5YT1MgKi8KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gWk1BR0lDOwotI2VuZGlmIC8qIExZTlhPUyAqLwotI2VuZGlmIC8qIEkzODYgKi8KLQotI2lmIGRlZmluZWQoU1BBUkMpCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2lmIGRlZmluZWQoTFlOWE9TKQotICAgIGludGVybmFsX2EubWFnaWMgPSBMWU5YQ09GRk1BR0lDOwotI2VuZGlmIC8qIExZTlhPUyAqLwotI2VuZGlmIC8qIFNQQVJDICovCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IChhYmZkLT5mbGFncyAmIERfUEFHRUQpID8gUlM2S19BT1VUSERSX1pNQUdJQyA6Ci0gICAgKGFiZmQtPmZsYWdzICYgV1BfVEVYVCkgPyBSUzZLX0FPVVRIRFJfTk1BR0lDIDoKLSAgICBSUzZLX0FPVVRIRFJfT01BR0lDOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFNIKSAmJiBkZWZpbmVkKENPRkZfV0lUSF9QRSkKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFNIX1BFX01BR0lDOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE1JUFMpICYmIGRlZmluZWQoQ09GRl9XSVRIX1BFKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTUlQU19QRV9NQUdJQzsKLSNlbmRpZgotCi0jaWZuZGVmIF9fQV9NQUdJQ19TRVRfXwotI2luY2x1ZGUgIllvdXIgYW91dGhkciBtYWdpYyBudW1iZXIgaXMgbm90IGJlaW5nIHNldCEiCi0jZWxzZQotI3VuZGVmIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmCi0gIH0KLQotICAvKiBGSVhNRTogRG9lcyBhbnlib2R5IGV2ZXIgc2V0IHRoaXMgdG8gYW5vdGhlciB2YWx1ZT8gICovCi0gIGludGVybmFsX2EudnN0YW1wID0gMDsKLQotICAvKiBOb3cgc2hvdWxkIHdyaXRlIHJlbG9jcywgc3RyaW5ncywgc3ltcyAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gc3ltX2Jhc2U7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaW50IGZpcnN0dW5kZWY7Ci0jaWYgMAotICAgICAgaWYgKCFjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgICAgaWYgKCFjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgKGFiZmQsICZmaXJzdHVuZGVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBjb2ZmX21hbmdsZV9zeW1ib2xzIChhYmZkKTsKLSAgICAgIGlmICghIGNvZmZfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgY29mZl93cml0ZV9saW5lbnVtYmVycyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgY29mZl93cml0ZV9yZWxvY3MgKGFiZmQsIGZpcnN0dW5kZWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgZWxzZSBpZiAobG9uZ19zZWN0aW9uX25hbWVzKQotICAgIHsKLSAgICAgIC8qIElmIHdlIGhhdmUgbG9uZyBzZWN0aW9uIG5hbWVzIHdlIGhhdmUgdG8gd3JpdGUgb3V0IHRoZSBzdHJpbmcKLSAgICAgICAgIHRhYmxlIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgY29mZl93cml0ZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0jaWZkZWYgUFBDX1BFCi0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICAvKiBQb3dlclBDIFBFIGFwcGVhcnMgdG8gcmVxdWlyZSB0aGF0IGFsbCBleGVjdXRhYmxlIGZpbGVzIGJlCi0gICAgICAgICByb3VuZGVkIHVwIHRvIHRoZSBwYWdlIHNpemUuICAqLwotICAgICAgYiA9IDA7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBCRkRfQUxJR04gKHN5bV9iYXNlLCBDT0ZGX1BBR0VfU0laRSkgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotI2VuZGlmCi0KLSAgLyogSWYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCwgdGhlbiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBDT0ZGCi0gICAgIGJhY2tlbmQgbGlua2VyLCBhbmQgb2JqX3Jhd19zeW1lbnRfY291bnQgaXMgbm90IHZhbGlkIHVudGlsIGFmdGVyCi0gICAgIGNvZmZfd3JpdGVfc3ltYm9scyBpcyBjYWxsZWQuICAqLwotICBpZiAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IHN5bV9iYXNlOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgLyogQUlYIGFwcGVhcnMgdG8gcmVxdWlyZSB0aGF0IEZfUkVMRkxHIG5vdCBiZSBzZXQgaWYgdGhlcmUgYXJlCi0gICAgICAgICBsb2NhbCBzeW1ib2xzIGJ1dCBubyByZWxvY2F0aW9ucy4gICovCi0gICAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgJj1+IEZfUkVMRkxHOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxvbmdfc2VjdGlvbl9uYW1lcykKLQlpbnRlcm5hbF9mLmZfc3ltcHRyID0gc3ltX2Jhc2U7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfZi5mX3N5bXB0ciA9IDA7Ci0gICAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9MU1lNUzsKLSAgICB9Ci0KLSAgaWYgKHRleHRfc2VjKQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHRleHRfc2VjKTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IGludGVybmFsX2EudHNpemUgPyB0ZXh0X3NlYy0+dm1hIDogMDsKLSAgICB9Ci0gIGlmIChkYXRhX3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChkYXRhX3NlYyk7Ci0gICAgICBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBpbnRlcm5hbF9hLmRzaXplID8gZGF0YV9zZWMtPnZtYSA6IDA7Ci0gICAgfQotICBpZiAoYnNzX3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLmJzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChic3Nfc2VjKTsKLSAgICAgIGlmIChpbnRlcm5hbF9hLmJzaXplICYmIGJzc19zZWMtPnZtYSA8IGludGVybmFsX2EuZGF0YV9zdGFydCkKLQlpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBic3Nfc2VjLT52bWE7Ci0gICAgfQotCi0gIGludGVybmFsX2EuZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBpbnRlcm5hbF9mLmZfbnN5bXMgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0gICAgewotICAgICAgYmZkX3ZtYSB0b2M7Ci0gICAgICBhc2VjdGlvbiAqbG9hZGVyX3NlYzsKLQotICAgICAgaW50ZXJuYWxfYS52c3RhbXAgPSAxOwotCi0gICAgICBpbnRlcm5hbF9hLm9fc25lbnRyeSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5zbmVudHJ5OwotICAgICAgaWYgKGludGVybmFsX2Eub19zbmVudHJ5ID09IDApCi0JaW50ZXJuYWxfYS5lbnRyeSA9IChiZmRfdm1hKSAtMTsKLQotICAgICAgaWYgKHRleHRfc2VjICE9IE5VTEwpCi0JewotCSAgaW50ZXJuYWxfYS5vX3NudGV4dCA9IHRleHRfc2VjLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbnRleHQgPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCB0ZXh0X3NlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludGVybmFsX2Eub19zbnRleHQgPSAwOwotCSAgaW50ZXJuYWxfYS5vX2FsZ250ZXh0ID0gMDsKLQl9Ci0gICAgICBpZiAoZGF0YV9zZWMgIT0gTlVMTCkKLQl7Ci0JICBpbnRlcm5hbF9hLm9fc25kYXRhID0gZGF0YV9zZWMtPnRhcmdldF9pbmRleDsKLQkgIGludGVybmFsX2Eub19hbGduZGF0YSA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIGRhdGFfc2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50ZXJuYWxfYS5vX3NuZGF0YSA9IDA7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbmRhdGEgPSAwOwotCX0KLSAgICAgIGxvYWRlcl9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgICAgIGlmIChsb2FkZXJfc2VjICE9IE5VTEwpCi0JaW50ZXJuYWxfYS5vX3NubG9hZGVyID0gbG9hZGVyX3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgZWxzZQotCWludGVybmFsX2Eub19zbmxvYWRlciA9IDA7Ci0gICAgICBpZiAoYnNzX3NlYyAhPSBOVUxMKQotCWludGVybmFsX2Eub19zbmJzcyA9IGJzc19zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9hLm9fc25ic3MgPSAwOwotCi0gICAgICB0b2MgPSB4Y29mZl9kYXRhIChhYmZkKS0+dG9jOwotICAgICAgaW50ZXJuYWxfYS5vX3RvYyA9IHRvYzsKLSAgICAgIGludGVybmFsX2Eub19zbnRvYyA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5zbnRvYzsKLQotICAgICAgaW50ZXJuYWxfYS5vX21vZHR5cGUgPSB4Y29mZl9kYXRhIChhYmZkKS0+bW9kdHlwZTsKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAhPSAtMSkKLQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlOwotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLQkgICAgICBpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLQkgICAgICBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSAwKQotCQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDM7Ci0JICAgICAgZWxzZQotCQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBpbnRlcm5hbF9hLm9fbWF4c3RhY2sgPSB4Y29mZl9kYXRhIChhYmZkKS0+bWF4c3RhY2s7Ci0gICAgICBpbnRlcm5hbF9hLm9fbWF4ZGF0YSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5tYXhkYXRhOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIG5vdyB3cml0ZSB0aGVtICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICB7Ci0gICAgY2hhciAqIGJ1ZmY7Ci0gICAgYmZkX3NpemVfdHlwZSBhbW91bnQ7Ci0gICAgCi0gICAgYnVmZiA9IGJmZF9tYWxsb2MgKGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkpOwotICAgIGlmIChidWZmID09IE5VTEwpIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGNvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgKFBUUikgJiBpbnRlcm5hbF9mLCAoUFRSKSBidWZmKTsKLSAgICBhbW91bnQgPSBiZmRfd3JpdGUgKChQVFIpIGJ1ZmYsIDEsIGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCksIGFiZmQpOwotICAgIAotICAgIGZyZWUgKGJ1ZmYpOwotICAgIAotICAgIGlmIChhbW91bnQgIT0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBwZWljb2RlLmggZmlsbHMgaW4gYSBQRUFPVVRIRFIsIG5vdCBhbiBBT1VUSERSLiAKLQkgaW5jbHVkZS9jb2ZmL3BlLmggc2V0cyBBT1VUU1ogPT0gc2l6ZW9mKFBFQU9VVEhEUikpICovCi0gICAgICBjaGFyICogYnVmZjsKLSAgICAgIGJmZF9zaXplX3R5cGUgYW1vdW50OwotCi0gICAgICBidWZmID0gYmZkX21hbGxvYyAoYmZkX2NvZmZfYW91dHN6IChhYmZkKSk7Ci0gICAgICBpZiAoYnVmZiA9PSBOVUxMKSAKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIGNvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJiBpbnRlcm5hbF9hLCAoUFRSKSBidWZmKTsKLSAgICAgIGFtb3VudCA9IGJmZF93cml0ZSAoKFBUUikgYnVmZiwgMSwgYmZkX2NvZmZfYW91dHN6IChhYmZkKSwgYWJmZCk7Ci0gICAgICAKLSAgICAgIGZyZWUgKGJ1ZmYpOwotICAgICAgCi0gICAgICBpZiAoYW1vdW50ICE9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgZWxzZQotICAgIHsKLSAgICAgIEFPVVRIRFIgYnVmZjsKLSAgICAgIHNpemVfdCBzaXplOwotCi0gICAgICAvKiBYQ09GRiBzZWVtcyB0byBhbHdheXMgd3JpdGUgYXQgbGVhc3QgYSBzbWFsbCBhLm91dCBoZWFkZXIuICAqLwotICAgICAgY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCAoUFRSKSAmaW50ZXJuYWxfYSwgKFBUUikgJmJ1ZmYpOwotICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0Jc2l6ZSA9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0gICAgICBlbHNlCi0Jc2l6ZSA9IFNNQUxMX0FPVVRTWjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZidWZmLCAxLCBzaXplLCBhYmZkKSAhPSBzaXplKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkJLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIGRlZmluZWQoX0xJQikgJiYgIWRlZmluZWQoVEFSR19BVVgpCi0KLSAgIC8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIGZpZWxkIG9mIGEgLmxpYiBzZWN0aW9uIGlzIHVzZWQgdG8gaG9sZCB0aGUKLSAgICAgIG51bWJlciBvZiBzaGFyZWQgbGlicmFyaWVzIGluIHRoZSBzZWN0aW9uLiAgVGhpcyBjb2RlIGNvdW50cyB0aGUKLSAgICAgIG51bWJlciBvZiBzZWN0aW9ucyBiZWluZyB3cml0dGVuLCBhbmQgaW5jcmVtZW50cyB0aGUgbG1hIGZpZWxkCi0gICAgICB3aXRoIHRoZSBudW1iZXIuCi0KLSAgICAgIEkgaGF2ZSBmb3VuZCBubyBkb2N1bWVudGF0aW9uIG9uIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uCi0gICAgICBFeHBlcmltZW50YXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgemVybyBvciBtb3JlCi0gICAgICByZWNvcmRzLCBlYWNoIG9mIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLQotICAgICAgLSBhIChmb3VyIGJ5dGUpIHdvcmQgaG9sZGluZyB0aGUgbGVuZ3RoIG9mIHRoaXMgcmVjb3JkLCBpbiB3b3JkcywKLSAgICAgIC0gYSB3b3JkIHRoYXQgYWx3YXlzIHNlZW1zIHRvIGJlIHNldCB0byAiMiIsCi0gICAgICAtIHRoZSBwYXRoIHRvIGEgc2hhcmVkIGxpYnJhcnksIG51bGwtdGVybWluYXRlZCBhbmQgdGhlbiBwYWRkZWQKLSAgICAgICAgdG8gYSB3aG9sZSB3b3JkIGJvdW5kYXJ5LgotCi0gICAgICBiZmRfYXNzZXJ0IGNhbGxzIGhhdmUgYmVlbiBhZGRlZCB0byBhbGVydCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUKLSAgICAgIHRvIHdyaXRlIGEgc2VjdGlvbiB3aGljaCBkb2Vzbid0IGZvbGxvdyB0aGVzZSBhc3N1bXB0aW9ucy4gIFRoZQotICAgICAgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgb24gSVNDIDQuMSBieSBtZSwgYW5kIG9uIFNDTyBieSBSb2JlcnQgTGlwZQotICAgICAgPHJvYmVydGxAYXJuZXQuY29tPiAoVGhhbmtzISkuCi0gIAotICAgICAgR3ZyYW4gVWRkZWJvcmcgPGd2cmFuQHVkZGVib3JnLnBwLnNlPiAqLwotCi0gICAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICAgIHsKLQliZmRfYnl0ZSAqcmVjLCAqcmVjZW5kOwotCi0JcmVjID0gKGJmZF9ieXRlICopIGxvY2F0aW9uOwotCXJlY2VuZCA9IHJlYyArIGNvdW50OwotCXdoaWxlIChyZWMgPCByZWNlbmQpCi0JICB7Ci0JICAgICsrc2VjdGlvbi0+bG1hOwotCSAgICByZWMgKz0gYmZkX2dldF8zMiAoYWJmZCwgcmVjKSAqIDQ7Ci0JICB9Ci0KLQlCRkRfQVNTRVJUIChyZWMgPT0gcmVjZW5kKTsKLSAgICAgIH0KLQotI2VuZGlmCi0KLSAgLyogRG9uJ3Qgd3JpdGUgb3V0IGJzcyBzZWN0aW9ucyAtIG9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0bwotICAgICAgIHNlZSBpZiB0aGUgZmlsZXBvcyBoYXMgbm90IGJlZW4gc2V0LiAqLwotICBpZiAoc2VjdGlvbi0+ZmlsZXBvcyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLSNpZiAwCi1zdGF0aWMgYm9vbGVhbgotY29mZl9jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpKQotICAgIHN3aXRjaCAoYWJmZC0+Zm9ybWF0KQotICAgICAgewotICAgICAgY2FzZSBiZmRfYXJjaGl2ZToKLQlpZiAoIV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9vYmplY3Q6Ci0JaWYgKCFjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gIC8qIFdlIGRlcGVuZCBvbiBiZmRfY2xvc2UgdG8gZnJlZSBhbGwgdGhlIG1lbW9yeSBvbiB0aGUgb2JqYWxsb2MuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBQVFIKLWJ1eV9hbmRfcmVhZCAoYWJmZCwgd2hlcmUsIHNlZWtfZGlyZWN0aW9uLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotICAgICBpbnQgc2Vla19kaXJlY3Rpb247Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgYXJlYSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmICghYXJlYSkKLSAgICByZXR1cm4gKE5VTEwpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBzZWVrX2RpcmVjdGlvbikgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGFyZWEsIDEsIHNpemUsIGFiZmQpICE9IHNpemUpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgcmV0dXJuIChhcmVhKTsKLX0JCQkJLyogYnV5X2FuZF9yZWFkKCkgKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQlSZWFkaW5nIGxpbmVudW1iZXJzCi0KLQlDcmVhdGluZyB0aGUgbGluZW51bWJlciB0YWJsZSBpcyBkb25lIGJ5IHJlYWRpbmcgaW4gdGhlIGVudGlyZQotCWNvZmYgbGluZW51bWJlciB0YWJsZSwgYW5kIGNyZWF0aW5nIGFub3RoZXIgdGFibGUgZm9yIGludGVybmFsIHVzZS4KLQotCUEgY29mZiBsaW5lbnVtYmVyIHRhYmxlIGlzIHN0cnVjdHVyZWQgc28gdGhhdCBlYWNoIGZ1bmN0aW9uCi0JaXMgbWFya2VkIGFzIGhhdmluZyBhIGxpbmUgbnVtYmVyIG9mIDAuIEVhY2ggbGluZSB3aXRoaW4gdGhlCi0JZnVuY3Rpb24gaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGZpcnN0IGxpbmUgaW4gdGhlIGZ1bmN0aW9uLiBUaGUKLQliYXNlIG9mIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhYmxlIGlzIHN0b3JlZCBpbgotCXRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbi4KLQotCU5vdGU6IFRoZSBQRSBmb3JtYXQgdXNlcyBsaW5lIG51bWJlciAwIGZvciBhIGZsYWcgaW5kaWNhdGluZyBhCi0JbmV3IHNvdXJjZSBmaWxlLgotCi0JVGhlIGluZm9ybWF0aW9uIGlzIGNvcGllZCBmcm9tIHRoZSBleHRlcm5hbCB0byB0aGUgaW50ZXJuYWwKLQl0YWJsZSwgYW5kIGVhY2ggc3ltYm9sIHdoaWNoIG1hcmtzIGEgZnVuY3Rpb24gaXMgbWFya2VkIGJ5Ci0JcG9pbnRpbmcgaXRzLi4uCi0KLQlIb3cgZG9lcyB0aGlzIHdvcmsgPwotCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbHVycF9saW5lX3RhYmxlIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci17Ci0gIExJTkVOTyAqbmF0aXZlX2xpbmVubzsKLSAgYWxlbnQgKmxpbmVub19jYWNoZTsKLQotICBCRkRfQVNTRVJUIChhc2VjdC0+bGluZW5vID09IChhbGVudCAqKSBOVUxMKTsKLQotICBuYXRpdmVfbGluZW5vID0gKExJTkVOTyAqKSBidXlfYW5kX3JlYWQgKGFiZmQsCi0JCQkJCSAgIGFzZWN0LT5saW5lX2ZpbGVwb3MsCi0JCQkJCSAgIFNFRUtfU0VULAotCQkJCQkgICAoc2l6ZV90KSAoYmZkX2NvZmZfbGluZXN6IChhYmZkKSAqCi0JCQkJCQkgICAgIGFzZWN0LT5saW5lbm9fY291bnQpKTsKLSAgbGluZW5vX2NhY2hlID0KLSAgICAoYWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLCAoc2l6ZV90KSAoKGFzZWN0LT5saW5lbm9fY291bnQgKyAxKSAqIHNpemVvZiAoYWxlbnQpKSk7Ci0gIGlmIChsaW5lbm9fY2FjaGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gICAgICBhbGVudCAqY2FjaGVfcHRyID0gbGluZW5vX2NhY2hlOwotICAgICAgTElORU5PICpzcmMgPSBuYXRpdmVfbGluZW5vOwotCi0gICAgICB3aGlsZSAoY291bnRlciA8IGFzZWN0LT5saW5lbm9fY291bnQpCi0JewotCSAgc3RydWN0IGludGVybmFsX2xpbmVubyBkc3Q7Ci0JICBjb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCBzcmMsICZkc3QpOwotCSAgY2FjaGVfcHRyLT5saW5lX251bWJlciA9IGRzdC5sX2xubm87Ci0KLQkgIGlmIChjYWNoZV9wdHItPmxpbmVfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICBib29sZWFuIHdhcm5lZDsKLQkgICAgICBsb25nIHN5bW5keDsKLQkgICAgICBjb2ZmX3N5bWJvbF90eXBlICpzeW07Ci0KLQkgICAgICB3YXJuZWQgPSBmYWxzZTsKLQkgICAgICBzeW1uZHggPSBkc3QubF9hZGRyLmxfc3ltbmR4OwotCSAgICAgIGlmIChzeW1uZHggPCAwCi0JCSAgfHwgKHVuc2lnbmVkIGxvbmcpIHN5bW5keCA+PSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIGxpbmUgbnVtYmVycyIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBkc3QubF9hZGRyLmxfc3ltbmR4KTsKLQkJICBzeW1uZHggPSAwOwotCQkgIHdhcm5lZCA9IHRydWU7Ci0JCX0KLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIG5vdCBiZSBjYXN0aW5nIGJldHdlZW4gaW50cyBhbmQKLSAgICAgICAgICAgICAgICAgcG9pbnRlcnMgbGlrZSB0aGlzLiAgKi8KLQkgICAgICBzeW0gPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKLQkJICAgICAoKHN5bW5keCArIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpCi0JCSAgICAgIC0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMpKTsKLQkgICAgICBjYWNoZV9wdHItPnUuc3ltID0gKGFzeW1ib2wgKikgc3ltOwotCSAgICAgIGlmIChzeW0tPmxpbmVubyAhPSBOVUxMICYmICEgd2FybmVkKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IHdhcm5pbmc6IGR1cGxpY2F0ZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgYCVzJyIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgICAgIGJmZF9hc3ltYm9sX25hbWUgKCZzeW0tPnN5bWJvbCkpOwotCQl9Ci0JICAgICAgc3ltLT5saW5lbm8gPSBjYWNoZV9wdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNhY2hlX3B0ci0+dS5vZmZzZXQgPSBkc3QubF9hZGRyLmxfcGFkZHIKLQkJLSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIGFzZWN0KTsKLQkgICAgfQkJCS8qIElmIG5vIGxpbmVudW1iZXIgZXhwZWN0IGEgc3ltYm9sIGluZGV4ICovCi0KLQkgIGNhY2hlX3B0cisrOwotCSAgc3JjKys7Ci0JICBjb3VudGVyKys7Ci0JfQotICAgICAgY2FjaGVfcHRyLT5saW5lX251bWJlciA9IDA7Ci0KLSAgICB9Ci0gIGFzZWN0LT5saW5lbm8gPSBsaW5lbm9fY2FjaGU7Ci0gIC8qIEZJWE1FLCBmcmVlIG5hdGl2ZV9saW5lbm8gaGVyZSwgb3IgdXNlIGFsbG9jYSBvciBzb21ldGhpbmcuICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTbHVycCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBjb252ZXJ0aW5nIGl0IHRvIGdlbmVyaWMgZm9ybS4gIE5vdGUKLSAgIHRoYXQgaWYgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzIGRlZmluZWQsIHRoZSBsaW5rZXIgd2lsbCByZWFkCi0gICBzeW1ib2xzIHZpYSBjb2ZmX2xpbmtfYWRkX3N5bWJvbHMsIHJhdGhlciB0aGFuIHZpYSB0aGlzIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZV9zeW1ib2xzOwotICBjb2ZmX3N5bWJvbF90eXBlICpjYWNoZWRfYXJlYTsKLSAgdW5zaWduZWQgaW50ICp0YWJsZV9wdHI7Ci0KLSAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9zeW1ib2xzID0gMDsKLQotICBpZiAob2JqX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFJlYWQgaW4gdGhlIHN5bWJvbCB0YWJsZSAqLwotICBpZiAoKG5hdGl2ZV9zeW1ib2xzID0gY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIgKGFiZmQpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiAoZmFsc2UpOwotICAgIH0JCQkJLyogb24gZXJyb3IgKi8KLQotICAvKiBBbGxvY2F0ZSBlbm91Z2ggcm9vbSBmb3IgYWxsIHRoZSBzeW1ib2xzIGluIGNhY2hlZCBmb3JtICovCi0gIGNhY2hlZF9hcmVhID0gKChjb2ZmX3N5bWJvbF90eXBlICopCi0JCSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgICAgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCQkJICAgICAqIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpKSk7Ci0KLSAgaWYgKGNhY2hlZF9hcmVhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICB0YWJsZV9wdHIgPSAoKHVuc2lnbmVkIGludCAqKQotCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkKLQkJCSAgICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSkpOwotCi0gIGlmICh0YWJsZV9wdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpkc3QgPSBjYWNoZWRfYXJlYTsKLSAgICAgIHVuc2lnbmVkIGludCBsYXN0X25hdGl2ZV9pbmRleCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIHVuc2lnbmVkIGludCB0aGlzX2luZGV4ID0gMDsKLSAgICAgIHdoaWxlICh0aGlzX2luZGV4IDwgbGFzdF9uYXRpdmVfaW5kZXgpCi0JewotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqc3JjID0gbmF0aXZlX3N5bWJvbHMgKyB0aGlzX2luZGV4OwotCSAgdGFibGVfcHRyW3RoaXNfaW5kZXhdID0gbnVtYmVyX29mX3N5bWJvbHM7Ci0JICBkc3QtPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotCSAgZHN0LT5zeW1ib2wubmFtZSA9IChjaGFyICopIChzcmMtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KTsKLQkgIC8qIFdlIHVzZSB0aGUgbmF0aXZlIG5hbWUgZmllbGQgdG8gcG9pbnQgdG8gdGhlIGNhY2hlZCBmaWVsZC4gICovCi0JICBzcmMtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gKGxvbmcpIGRzdDsKLQkgIGRzdC0+c3ltYm9sLnNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsCi0JCQkJCQkgICAgIHNyYy0+dS5zeW1lbnQubl9zY251bSk7Ci0JICBkc3QtPnN5bWJvbC5mbGFncyA9IDA7Ci0JICBkc3QtPmRvbmVfbGluZW5vID0gZmFsc2U7Ci0KLQkgIHN3aXRjaCAoc3JjLT51LnN5bWVudC5uX3NjbGFzcykKLQkgICAgewotI2lmZGVmIEk5NjAKLQkgICAgY2FzZSBDX0xFQUZFWFQ6Ci0jaWYgMAotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQgfCBCU0ZfRlVOQ1RJT047Ci0jZW5kaWYKLQkgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gbmV4dCBjYXNlICovCi0KLSNlbmRpZgotCi0JICAgIGNhc2UgQ19FWFQ6Ci0JICAgIGNhc2UgQ19XRUFLRVhUOgotI2lmIGRlZmluZWQgQVJNCi0gICAgICAgICAgICBjYXNlIENfVEhVTUJFWFQ6Ci0gICAgICAgICAgICBjYXNlIENfVEhVTUJFWFRGVU5DOgotI2VuZGlmCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0JICAgIGNhc2UgQ19ISURFWFQ6Ci0jZW5kaWYKLSNpZmRlZiBDX1NZU1RFTQotCSAgICBjYXNlIENfU1lTVEVNOgkvKiBTeXN0ZW0gV2lkZSB2YXJpYWJsZSAqLwotI2VuZGlmCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICAgICAgICAvKiBJbiBQRSwgMHg2OCAoMTA0KSBkZW5vdGVzIGEgc2VjdGlvbiBzeW1ib2wgKi8KLSAgICAgICAgICAgIGNhc2UgQ19TRUNUSU9OOgotCSAgICAvKiBJbiBQRSwgMHg2OSAoMTA1KSBkZW5vdGVzIGEgd2VhayBleHRlcm5hbCBzeW1ib2wuICAqLwotCSAgICBjYXNlIENfTlRfV0VBSzoKLSNlbmRpZgotCSAgICAgIHN3aXRjaCAoY29mZl9jbGFzc2lmeV9zeW1ib2wgKGFiZmQsICZzcmMtPnUuc3ltZW50KSkKLQkJewotCQljYXNlIENPRkZfU1lNQk9MX0dMT0JBTDoKLQkJICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JCSAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCSAgICAgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkJICBpZiAoSVNGQ04gKChzcmMtPnUuc3ltZW50Lm5fdHlwZSkpKQotCQkgICAgewotCQkgICAgICAvKiBBIGZ1bmN0aW9uIGV4dCBkb2VzIG5vdCBnbyBhdCB0aGUgZW5kIG9mIGEKLQkJCSBmaWxlLiAgKi8KLQkJICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQgfCBCU0ZfRlVOQ1RJT047Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBDT0ZGX1NZTUJPTF9DT01NT046Ci0JCSAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBDT0ZGX1NZTUJPTF9VTkRFRklORUQ6Ci0JCSAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAwOwotCQkgIGJyZWFrOyAKLQotCQljYXNlIENPRkZfU1lNQk9MX1BFX1NFQ1RJT046Ci0JCSAgZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0VYUE9SVCB8IEJTRl9TRUNUSU9OX1NZTTsKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBDT0ZGX1NZTUJPTF9MT0NBTDoKLQkJICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLSNpZiBkZWZpbmVkIENPRkZfV0lUSF9QRQotCQkgIC8qIFBFIHNldHMgdGhlIHN5bWJvbCB0byBhIHZhbHVlIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICAqLwotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlOwotI2Vsc2UKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJCQkgICAgICAgLSBkc3QtPnN5bWJvbC5zZWN0aW9uLT52bWEpOwotI2VuZGlmCi0JCSAgaWYgKElTRkNOICgoc3JjLT51LnN5bWVudC5uX3R5cGUpKSkKLQkJICAgIGRzdC0+c3ltYm9sLmZsYWdzIHw9IEJTRl9OT1RfQVRfRU5EIHwgQlNGX0ZVTkNUSU9OOwotCQkgIGJyZWFrOwotCQl9Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgICAvKiBBIHN5bWJvbCB3aXRoIGEgY3NlY3QgZW50cnkgc2hvdWxkIG5vdCBnbyBhdCB0aGUgZW5kLiAgKi8KLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0JCWRzdC0+c3ltYm9sLmZsYWdzIHw9IEJTRl9OT1RfQVRfRU5EOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX05UX1dFQUspCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19TRUNUSU9OCi0JCSAgJiYgc3JjLT51LnN5bWVudC5uX3NjbnVtID4gMCkKLQkJewotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCQl9Ci0jZW5kaWYKLQotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfV0VBS0VYVCkKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ19TVEFUOgkvKiBzdGF0aWMJCQkgKi8KLSNpZmRlZiBJOTYwCi0JICAgIGNhc2UgQ19MRUFGU1RBVDoJLyogc3RhdGljIGxlYWYgcHJvY2VkdXJlICAgICAgICAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZCBBUk0gCi0gICAgICAgICAgICBjYXNlIENfVEhVTUJTVEFUOiAgIC8qIFRodW1iIHN0YXRpYyAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjYXNlIENfVEhVTUJMQUJFTDogIC8qIFRodW1iIGxhYmVsICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjYXNlIENfVEhVTUJTVEFURlVOQzovKiBUaHVtYiBzdGF0aWMgZnVuY3Rpb24gICAgICAgICovCi0jZW5kaWYKLQkgICAgY2FzZSBDX0xBQkVMOgkvKiBsYWJlbAkJCSAqLwotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NudW0gPT0gTl9ERUJVRykKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGVsc2UKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0KLQkgICAgICAvKiBCYXNlIHRoZSB2YWx1ZSBhcyBhbiBpbmRleCBmcm9tIHRoZSBiYXNlIG9mIHRoZQotCQkgc2VjdGlvbiwgaWYgdGhlcmUgaXMgb25lLiAgKi8KLQkgICAgICBpZiAoZHN0LT5zeW1ib2wuc2VjdGlvbikKLQkJewotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JCSAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCSAgICAgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGVsc2UKLQkJZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX01PUzoJLyogbWVtYmVyIG9mIHN0cnVjdHVyZQkgKi8KLQkgICAgY2FzZSBDX0VPUzoJLyogZW5kIG9mIHN0cnVjdHVyZQkJICovCi0jaWZkZWYgTk9UREVGCQkJLyogQ19BVVRPQVJHIGhhcyB0aGUgc2FtZSB2YWx1ZSAqLwotI2lmZGVmIENfR0xCTFJFRwotCSAgICBjYXNlIENfR0xCTFJFRzoJLyogQTI5ay1zcGVjaWZpYyBzdG9yYWdlIGNsYXNzICovCi0jZW5kaWYKLSNlbmRpZgotCSAgICBjYXNlIENfUkVHUEFSTToJLyogcmVnaXN0ZXIgcGFyYW1ldGVyCQkgKi8KLQkgICAgY2FzZSBDX1JFRzoJLyogcmVnaXN0ZXIgdmFyaWFibGUJCSAqLwotI2lmbmRlZiBUSUM4MENPRkYKLSNpZmRlZiBDX0FVVE9BUkcKLQkgICAgY2FzZSBDX0FVVE9BUkc6CS8qIDk2MC1zcGVjaWZpYyBzdG9yYWdlIGNsYXNzICovCi0jZW5kaWYKLSNlbmRpZgotCSAgICBjYXNlIENfVFBERUY6CS8qIHR5cGUgZGVmaW5pdGlvbgkJICovCi0JICAgIGNhc2UgQ19BUkc6Ci0JICAgIGNhc2UgQ19BVVRPOgkvKiBhdXRvbWF0aWMgdmFyaWFibGUgKi8KLQkgICAgY2FzZSBDX0ZJRUxEOgkvKiBiaXQgZmllbGQgKi8KLQkgICAgY2FzZSBDX0VOVEFHOgkvKiBlbnVtZXJhdGlvbiB0YWcJCSAqLwotCSAgICBjYXNlIENfTU9FOgkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24JICovCi0JICAgIGNhc2UgQ19NT1U6CS8qIG1lbWJlciBvZiB1bmlvbgkJICovCi0JICAgIGNhc2UgQ19VTlRBRzoJLyogdW5pb24gdGFnCQkJICovCi0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX0ZJTEU6CS8qIGZpbGUgbmFtZQkJCSAqLwotCSAgICBjYXNlIENfU1RSVEFHOgkvKiBzdHJ1Y3R1cmUgdGFnCQkgKi8KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgY2FzZSBDX0dTWU06Ci0JICAgIGNhc2UgQ19MU1lNOgotCSAgICBjYXNlIENfUFNZTToKLQkgICAgY2FzZSBDX1JTWU06Ci0JICAgIGNhc2UgQ19SUFNZTToKLQkgICAgY2FzZSBDX1NUU1lNOgotCSAgICBjYXNlIENfQkNPTU06Ci0JICAgIGNhc2UgQ19FQ09NTToKLQkgICAgY2FzZSBDX0RFQ0w6Ci0JICAgIGNhc2UgQ19FTlRSWToKLQkgICAgY2FzZSBDX0ZVTjoKLQkgICAgY2FzZSBDX0VTVEFUOgotI2VuZGlmCi0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgY2FzZSBDX0JJTkNMOgkvKiBiZWdpbm5pbmcgb2YgaW5jbHVkZSBmaWxlICAgICAqLwotCSAgICBjYXNlIENfRUlOQ0w6CS8qIGVuZGluZyBvZiBpbmNsdWRlIGZpbGUgICAgICAgICovCi0JICAgICAgLyogVGhlIHZhbHVlIGlzIGFjdHVhbGx5IGEgcG9pbnRlciBpbnRvIHRoZSBsaW5lIG51bWJlcnMKLSAgICAgICAgICAgICAgICAgb2YgdGhlIGZpbGUuICBXZSBsb2NhdGUgdGhlIGxpbmUgbnVtYmVyIGVudHJ5LCBhbmQKLSAgICAgICAgICAgICAgICAgc2V0IHRoZSBzZWN0aW9uIHRvIHRoZSBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIGl0LCBhbmQKLSAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRoZSBpbmRleCBpbiB0aGF0IHNlY3Rpb24uICAqLwotCSAgICAgIHsKLQkJYXNlY3Rpb24gKnNlYzsKLQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JCWZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0JCSAgaWYgKHNlYy0+bGluZV9maWxlcG9zIDw9IChmaWxlX3B0cikgc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCSAgICAgICYmICgoZmlsZV9wdHIpIChzZWMtPmxpbmVfZmlsZXBvcwotCQkJCSAgICAgICsgc2VjLT5saW5lbm9fY291bnQgKiBiZmRfY29mZl9saW5lc3ogKGFiZmQpKQotCQkJICA+IChmaWxlX3B0cikgc3JjLT51LnN5bWVudC5uX3ZhbHVlKSkKLQkJICAgIGJyZWFrOwotCQlpZiAoc2VjID09IE5VTEwpCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAwOwotCQllbHNlCi0JCSAgewotCQkgICAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IHNlYzsKLQkJICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJCQkJICAtIHNlYy0+bGluZV9maWxlcG9zKQotCQkJCQkgLyBiZmRfY29mZl9saW5lc3ogKGFiZmQpKTsKLQkJICAgIHNyYy0+Zml4X2xpbmUgPSAxOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX0JTVEFUOgotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQotCSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBhY3R1YWxseSBhIHN5bWJvbCBpbmRleC4gIFNhdmUgYSBwb2ludGVyCi0JCSB0byB0aGUgc3ltYm9sIGluc3RlYWQgb2YgdGhlIGluZGV4LiAgRklYTUU6IFRoaXMKLQkJIHNob3VsZCB1c2UgYSB1bmlvbi4gICovCi0JICAgICAgc3JjLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKGxvbmcpIChuYXRpdmVfc3ltYm9scyArIHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgICAgc3JjLT5maXhfdmFsdWUgPSAxOwotCSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLQkgICAgY2FzZSBDX0JMT0NLOgkvKiAiLmJiIiBvciAiLmViIgkJICovCi0JICAgIGNhc2UgQ19GQ046CQkvKiAiLmJmIiBvciAiLmVmIiAob3IgUEUgIi5sZiIpCSAqLwotCSAgICBjYXNlIENfRUZDTjoJLyogcGh5c2ljYWwgZW5kIG9mIGZ1bmN0aW9uCSAqLwotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JICAgICAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0Ci0JCSBvZiB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoZHN0LT5zeW1ib2wubmFtZSwgIi5iZiIpICE9IDApCi0JCXsKLQkJICAvKiBQRSB1c2VzIGZ1bm55IHZhbHVlcyBmb3IgLmVmIGFuZCAubGY7IGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICByZWxvY2F0ZSB0aGVtLiAgKi8KLQkJICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORyB8IEJTRl9ERUJVR0dJTkdfUkVMT0M7Ci0jZWxzZQotCSAgICAgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCi0JCSBzZWN0aW9uLiAgKi8KLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJCQkgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgICAvKiBQRSBETExzIHNvbWV0aW1lcyBoYXZlIHplcm9lZCBvdXQgc3ltYm9scyBmb3Igc29tZQotICAgICAgICAgICAgICAgICByZWFzb24uICBKdXN0IGlnbm9yZSB0aGVtIHdpdGhvdXQgYSB3YXJuaW5nLiAgKi8KLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3R5cGUgPT0gMAotCQkgICYmIHNyYy0+dS5zeW1lbnQubl92YWx1ZSA9PSAwCi0JCSAgJiYgc3JjLT51LnN5bWVudC5uX3NjbnVtID09IDApCi0JCWJyZWFrOwotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2UgQ19FWFRERUY6CS8qIGV4dGVybmFsIGRlZmluaXRpb24JCSAqLwotCSAgICBjYXNlIENfVUxBQkVMOgkvKiB1bmRlZmluZWQgbGFiZWwJCSAqLwotCSAgICBjYXNlIENfVVNUQVRJQzoJLyogdW5kZWZpbmVkIHN0YXRpYwkJICovCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgICAgICAgLyogQ19MSU5FIGluIHJlZ3VsYXIgY29mZiBpcyAweDY4LiAgTlQgaGFzIHRha2VuIG92ZXIgdGhpcyBzdG9yYWdlCi0gICAgICAgICAgICAgICBjbGFzcyB0byByZXByZXNlbnQgYSBzZWN0aW9uIHN5bWJvbCAqLwotCSAgICBjYXNlIENfTElORToJLyogbGluZSAjIHJlZm9ybWF0dGVkIGFzIHN5bWJvbCB0YWJsZSBlbnRyeSAqLwotCSAgICAgIC8qIE5UIHVzZXMgMHg2NyBmb3IgYSB3ZWFrIHN5bWJvbCwgbm90IENfQUxJQVMuICAqLwotCSAgICBjYXNlIENfQUxJQVM6CS8qIGR1cGxpY2F0ZSB0YWcJCSAqLwotI2VuZGlmCi0JICAgICAgLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgVEljODAgKi8KLSNpZmRlZiBUSUM4MENPRkYKLQkgICAgY2FzZSBDX1VFWFQ6CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCi0jZW5kaWYKLQkgICAgY2FzZSBDX1NUQVRMQUI6CS8qIFN0YXRpYyBsb2FkIHRpbWUgbGFiZWwgKi8KLQkgICAgY2FzZSBDX0VYVExBQjoJLyogRXh0ZXJuYWwgbG9hZCB0aW1lIGxhYmVsICovCi0JICAgIGNhc2UgQ19ISURERU46CS8qIGV4dCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYiAqLwotCSAgICBkZWZhdWx0OgotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IFVucmVjb2duaXplZCBzdG9yYWdlIGNsYXNzICVkIGZvciAlcyBzeW1ib2wgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNyYy0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCSBkc3QtPnN5bWJvbC5zZWN0aW9uLT5uYW1lLCBkc3QtPnN5bWJvbC5uYW1lKTsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0vKiAgICAgIEJGRF9BU1NFUlQoZHN0LT5zeW1ib2wuZmxhZ3MgIT0gMCk7Ki8KLQotCSAgZHN0LT5uYXRpdmUgPSBzcmM7Ci0KLQkgIGRzdC0+c3ltYm9sLnVkYXRhLmkgPSAwOwotCSAgZHN0LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLQkgIHRoaXNfaW5kZXggKz0gKHNyYy0+dS5zeW1lbnQubl9udW1hdXgpICsgMTsKLQkgIGRzdCsrOwotCSAgbnVtYmVyX29mX3N5bWJvbHMrKzsKLQl9CQkJLyogd2FsayB0aGUgbmF0aXZlIHN5bXRhYiAqLwotICAgIH0JCQkJLyogYmZkaXplIHRoZSBuYXRpdmUgc3ltdGFiICovCi0KLSAgb2JqX3N5bWJvbHMgKGFiZmQpID0gY2FjaGVkX2FyZWE7Ci0gIG9ial9yYXdfc3ltZW50cyAoYWJmZCkgPSBuYXRpdmVfc3ltYm9sczsKLQotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IG51bWJlcl9vZl9zeW1ib2xzOwotICBvYmpfY29udmVydCAoYWJmZCkgPSB0YWJsZV9wdHI7Ci0gIC8qIFNsdXJwIHRoZSBsaW5lIHRhYmxlcyBmb3IgZWFjaCBzZWN0aW9uIHRvbyAqLwotICB7Ci0gICAgYXNlY3Rpb24gKnA7Ci0gICAgcCA9IGFiZmQtPnNlY3Rpb25zOwotICAgIHdoaWxlIChwKQotICAgICAgewotCWNvZmZfc2x1cnBfbGluZV90YWJsZSAoYWJmZCwgcCk7Ci0JcCA9IHAtPm5leHQ7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19CQkJCS8qIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKCkgKi8KLQotLyogQ2xhc3NpZnkgYSBDT0ZGIHN5bWJvbC4gIEEgY291cGxlIG9mIHRhcmdldHMgaGF2ZSBnbG9iYWxseSB2aXNpYmxlCi0gICBzeW1ib2xzIHdoaWNoIGFyZSBub3QgY2xhc3MgQ19FWFQsIGFuZCB0aGlzIGhhbmRsZXMgdGhvc2UuICBJdCBhbHNvCi0gICByZWNvZ25pemVzIHNvbWUgc3BlY2lhbCBQRSBjYXNlcy4gICovCi0KLXN0YXRpYyBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uCi1jb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgc3ltZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bWVudDsKLXsKLSAgLyogRklYTUU6IFRoaXMgcGFydGlhbGx5IGR1cGxpY2F0ZXMgdGhlIHN3aXRjaCBpbgotICAgICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCi0gIHN3aXRjaCAoc3ltZW50LT5uX3NjbGFzcykKLSAgICB7Ci0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBJOTYwCi0gICAgY2FzZSBDX0xFQUZFWFQ6Ci0jZW5kaWYKLSNpZmRlZiBBUk0KLSAgICBjYXNlIENfVEhVTUJFWFQ6Ci0gICAgY2FzZSBDX1RIVU1CRVhURlVOQzoKLSNlbmRpZgotI2lmZGVmIENfU1lTVEVNCi0gICAgY2FzZSBDX1NZU1RFTToKLSNlbmRpZgotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JewotCSAgaWYgKHN5bWVudC0+bl92YWx1ZSA9PSAwKQotCSAgICByZXR1cm4gQ09GRl9TWU1CT0xfVU5ERUZJTkVEOwotCSAgZWxzZQotCSAgICByZXR1cm4gQ09GRl9TWU1CT0xfQ09NTU9OOwotCX0KLSAgICAgIHJldHVybiBDT0ZGX1NZTUJPTF9HTE9CQUw7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIGlmIChzeW1lbnQtPm5fc2NsYXNzID09IENfU1RBVCkKLSAgICB7Ci0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JewotCSAgLyogVGhlIE1pY3Jvc29mdCBjb21waWxlciBzb21ldGltZXMgZ2VuZXJhdGVzIHRoZXNlIGlmIGEKLSAgICAgICAgICAgICBzbWFsbCBzdGF0aWMgZnVuY3Rpb24gaXMgaW5saW5lZCBldmVyeSB0aW1lIGl0IGlzIHVzZWQuCi0gICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIGRpc2NhcmRlZCwgYnV0IHRoZSBzeW1ib2wgdGFibGUgZW50cnkKLSAgICAgICAgICAgICByZW1haW5zLiAgKi8KLQkgIHJldHVybiBDT0ZGX1NZTUJPTF9MT0NBTDsKLQl9Ci0KLSNpZmRlZiBTVFJJQ1RfUEVfRk9STUFUCi0gICAgICAvKiBUaGlzIGlzIGNvcnJlY3QgZm9yIE1pY3Jvc29mdCBnZW5lcmF0ZWQgb2JqZWN0cywgYnV0IGl0Ci0gICAgICAgICBicmVha3MgZ2FzIGdlbmVyYXRlZCBvYmplY3RzLiAgKi8KLQotICAgICAgaWYgKHN5bWVudC0+bl92YWx1ZSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bWVudC0+bl9zY251bSk7Ci0JICBpZiAoc2VjICE9IE5VTEwKLQkgICAgICAmJiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCSAgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW1lbnQsIGJ1ZikpCi0JCSAgPT0gMCkpCi0JICAgIHJldHVybiBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOwotCX0KLSNlbmRpZgotCi0gICAgICByZXR1cm4gQ09GRl9TWU1CT0xfTE9DQUw7Ci0gICAgfQotCi0gIGlmIChzeW1lbnQtPm5fc2NsYXNzID09IENfU0VDVElPTikKLSAgICB7Ci0gICAgICAvKiBJbiBzb21lIGNhc2VzIGluIGEgRExMIGdlbmVyYXRlZCBieSB0aGUgTWljcm9zb2Z0IGxpbmtlciwgdGhlCi0gICAgICAgICBuX3ZhbHVlIGZpZWxkIHdpbGwgY29udGFpbiBnYXJiYWdlLiAgRklYTUU6IFRoaXMgc2hvdWxkCi0gICAgICAgICBwcm9iYWJseSBiZSBoYW5kbGVkIGJ5IHRoZSBzd2FwcGluZyBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IDA7Ci0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JcmV0dXJuIENPRkZfU1lNQk9MX1VOREVGSU5FRDsKLSAgICAgIHJldHVybiBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOwotICAgIH0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotICAvKiBJZiBpdCBpcyBub3QgYSBnbG9iYWwgc3ltYm9sLCB3ZSBwcmVzdW1lIGl0IGlzIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQotICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0gICAgewotICAgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIndhcm5pbmc6ICVzOiBsb2NhbCBzeW1ib2wgYCVzJyBoYXMgbm8gc2VjdGlvbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW1lbnQsIGJ1ZikpOwotICAgIH0KLQotICByZXR1cm4gQ09GRl9TWU1CT0xfTE9DQUw7Ci19Ci0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JUmVhZGluZyByZWxvY2F0aW9ucwotCi0JQ29mZiByZWxvY2F0aW9ucyBhcmUgZWFzaWx5IHRyYW5zZm9ybWVkIGludG8gdGhlIGludGVybmFsIEJGRCBmb3JtCi0JKEBjb2Rle2FyZWxlbnR9KS4KLQotCVJlYWRpbmcgYSBjb2ZmIHJlbG9jYXRpb24gdGFibGUgaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHN0YWdlczoKLQotCW8gUmVhZCB0aGUgZW50aXJlIGNvZmYgcmVsb2NhdGlvbiB0YWJsZSBpbnRvIG1lbW9yeS4KLQotCW8gUHJvY2VzcyBlYWNoIHJlbG9jYXRpb24gaW4gdHVybjsgZmlyc3Qgc3dhcCBpdCBmcm9tIHRoZQotCWV4dGVybmFsIHRvIHRoZSBpbnRlcm5hbCBmb3JtLgotCi0JbyBUdXJuIHRoZSBzeW1ib2wgcmVmZXJlbmNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHN5bWJvbCBpbmRleAotCWludG8gYSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUuCi0JVGhpcyB0YWJsZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJldHVybmVkIGJ5IGEgY2FsbCB0bwotCUBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4gVGhlIGJhY2sgZW5kIHdpbGwgY2FsbCB0aGF0Ci0Jcm91dGluZSBhbmQgc2F2ZSB0aGUgcmVzdWx0IGlmIGEgY2Fub25pY2FsaXphdGlvbiBoYXNuJ3QgYmVlbiBkb25lLgotCi0JbyBUaGUgcmVsb2MgaW5kZXggaXMgdHVybmVkIGludG8gYSBwb2ludGVyIHRvIGEgaG93dG8KLQlzdHJ1Y3R1cmUsIGluIGEgYmFjayBlbmQgc3BlY2lmaWMgd2F5LiBGb3IgaW5zdGFuY2UsIHRoZSAzODYKLQlhbmQgOTYwIHVzZSB0aGUgQGNvZGV7cl90eXBlfSB0byBkaXJlY3RseSBwcm9kdWNlIGFuIGluZGV4Ci0JaW50byBhIGhvd3RvIHRhYmxlIHZlY3RvcjsgdGhlIDg4ayBzdWJ0cmFjdHMgYSBudW1iZXIgZnJvbSB0aGUKLQlAY29kZXtyX3R5cGV9IGZpZWxkIGFuZCBjcmVhdGVzIGFuIGFkZGVuZCBmaWVsZC4KLQotCi0qLwotCi0jaWZuZGVmIENBTENfQURERU5ECi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsgICAgICBcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOyAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci17Ci0gIFJFTE9DICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmF0aXZlX3JlbG9jcyA9Ci0gICAgKFJFTE9DICopIGJ1eV9hbmRfcmVhZCAoYWJmZCwKLQkJCSAgICBhc2VjdC0+cmVsX2ZpbGVwb3MsCi0JCQkgICAgU0VFS19TRVQsCi0JCQkgICAgKHNpemVfdCkgKGJmZF9jb2ZmX3JlbHN6IChhYmZkKSAqCi0JCQkJICAgICAgYXNlY3QtPnJlbG9jX2NvdW50KSk7Ci0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIChzaXplX3QpIChhc2VjdC0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0KLSAgaWYgKHJlbG9jX2NhY2hlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0KLSAgZm9yIChpZHggPSAwOyBpZHggPCBhc2VjdC0+cmVsb2NfY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBkc3Q7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnNyYzsKLSNpZm5kZWYgUkVMT0NfUFJPQ0VTU0lORwotICAgICAgYXN5bWJvbCAqcHRyOwotI2VuZGlmCi0KLSAgICAgIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlICsgaWR4OwotICAgICAgc3JjID0gbmF0aXZlX3JlbG9jcyArIGlkeDsKLQotICAgICAgY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsICZkc3QpOwotCi0jaWZkZWYgUkVMT0NfUFJPQ0VTU0lORwotICAgICAgUkVMT0NfUFJPQ0VTU0lORyAoY2FjaGVfcHRyLCAmZHN0LCBzeW1ib2xzLCBhYmZkLCBhc2VjdCk7Ci0jZWxzZQotICAgICAgY2FjaGVfcHRyLT5hZGRyZXNzID0gZHN0LnJfdmFkZHI7Ci0KLSAgICAgIGlmIChkc3Qucl9zeW1uZHggIT0gLTEpCi0JewotCSAgaWYgKGRzdC5yX3N5bW5keCA8IDAgfHwgZHN0LnJfc3ltbmR4ID49IG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5yX3N5bW5keCk7Ci0JICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgICAgIHB0ciA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSAoc3ltYm9scwotCQkJCQkrIG9ial9jb252ZXJ0IChhYmZkKVtkc3Qucl9zeW1uZHhdKTsKLQkgICAgICBwdHIgPSAqKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHB0ciA9IE5VTEw7Ci0JfQotCi0gICAgICAvKiBUaGUgc3ltYm9scyBkZWZpbml0aW9ucyB0aGF0IHdlIGhhdmUgcmVhZCBpbiBoYXZlIGJlZW4KLQkgcmVsb2NhdGVkIGFzIGlmIHRoZWlyIHNlY3Rpb25zIHN0YXJ0ZWQgYXQgMC4gQnV0IHRoZSBvZmZzZXRzCi0JIHJlZmVyaW5nIHRvIHRoZSBzeW1ib2xzIGluIHRoZSByYXcgZGF0YSBoYXZlIG5vdCBiZWVuCi0JIG1vZGlmaWVkLCBzbyB3ZSBoYXZlIHRvIGhhdmUgYSBuZWdhdGl2ZSBhZGRlbmQgdG8gY29tcGVuc2F0ZS4KLQotCSBOb3RlIHRoYXQgc3ltYm9scyB3aGljaCB1c2VkIHRvIGJlIGNvbW1vbiBtdXN0IGJlIGxlZnQgYWxvbmUgKi8KLQotICAgICAgLyogQ2FsY3VsYXRlIGFueSByZWxvYyBhZGRlbmQgYnkgbG9va2luZyBhdCB0aGUgc3ltYm9sICovCi0gICAgICBDQUxDX0FEREVORCAoYWJmZCwgcHRyLCBkc3QsIGNhY2hlX3B0cik7Ci0KLSAgICAgIGNhY2hlX3B0ci0+YWRkcmVzcyAtPSBhc2VjdC0+dm1hOwotLyogISEgICAgIGNhY2hlX3B0ci0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOyovCi0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGNhY2hlX3B0ci0+aG93dG8gZmllbGQgZnJvbSBkc3Qucl90eXBlICovCi0gICAgICBSVFlQRTJIT1dUTyAoY2FjaGVfcHRyLCAmZHN0KTsKLSNlbmRpZgkvKiBSRUxPQ19QUk9DRVNTSU5HICovCi0KLSAgICAgIGlmIChjYWNoZV9wdHItPmhvd3RvID09IE5VTEwpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogaWxsZWdhbCByZWxvY2F0aW9uIHR5cGUgJWQgYXQgYWRkcmVzcyAweCVseCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5yX3R5cGUsIChsb25nKSBkc3Qucl92YWRkcik7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZuZGVmIGNvZmZfcnR5cGVfdG9faG93dG8KLSNpZmRlZiBSVFlQRTJIT1dUTwotCi0vKiBHZXQgdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgYSByZWxvYy4gIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBmaWxlCi0gICBpbmNsdWRpbmcgdGhpcyBvbmUgZGVmaW5lcyBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gdG8gYmUKLSAgIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24sIHNvIGl0IGlzIE9LIGlmIGl0IGRvZXMgbm90Ci0gICBhbHdheXMgd29yay4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgaW5jbHVkaW5nIGZpbGUgdG8KLSAgIG1ha2Ugc3VyZSBpdCBpcyByZWFzb25hYmxlIGlmIGl0IGlzIG5lZWRlZC4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgKmFkZGVuZHAgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYXJlbGVudCBnZW5yZWw7Ci0KLSAgUlRZUEUySE9XVE8gKCZnZW5yZWwsIHJlbCk7Ci0gIHJldHVybiBnZW5yZWwuaG93dG87Ci19Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoUlRZUEUySE9XVE8pICovCi0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBOVUxMCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFJUWVBFMkhPV1RPKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9ydHlwZV90b19ob3d0bykgKi8KLQotLyogVGhpcyBpcyBzdHVwaWQuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBhIGJvb2xlYW4gcHJlZGljYXRlLiAgKi8KLXN0YXRpYyBsb25nCi1jb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKiogcmVscHRyOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgewotICAgICAgLyogdGhpcyBzZWN0aW9uIGhhcyByZWxvY3MgbWFkZSB1cCBieSB1cywgdGhleSBhcmUgbm90IGluIHRoZQotICAgICAgIGZpbGUsIHNvIHRha2UgdGhlbSBvdXQgb2YgdGhlaXIgY2hhaW4gYW5kIHBsYWNlIHRoZW0gaW50bwotICAgICAgIHRoZSBkYXRhIGFyZWEgcHJvdmlkZWQgKi8KLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgY29mZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCi0JcmV0dXJuIC0xOwotCi0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLQkqcmVscHRyKysgPSB0YmxwdHIrKzsKLQotCi0gICAgfQotICAqcmVscHRyID0gMDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi0jaWZkZWYgR05VOTYwCi1maWxlX3B0cgotY29mZl9zeW1fZmlsZXBvcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gb2JqX3N5bV9maWxlcG9zIChhYmZkKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUgZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZQotCi1zdGF0aWMgaW50IGR1bW15X3JlbG9jMTZfZXN0aW1hdGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiwgdW5zaWduZWQgaW50LAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGludAotZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2MgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50IHNocmluayBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMKLQotLyogVGhpcyB3b3JrcyBldmVuIGlmIGFib3J0IGlzIG5vdCBkZWNsYXJlZCBpbiBhbnkgaGVhZGVyIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZCBkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYXJlbGVudCAqLAotCSAgIGJmZF9ieXRlICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1zdGF0aWMgdm9pZAotZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKLQkJCSAgIGRzdF9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfYnl0ZSAqZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFib3J0ICgpOwotfQotI2VuZGlmCi0KLS8qIElmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBpcyBkZWZpbmVkLCB3ZSBjYW4gdXNlIHRoZSBvcHRpbWl6ZWQgQ09GRgotICAgYmFja2VuZCBsaW5rZXIuICBPdGhlcndpc2Ugd2UgbXVzdCBjb250aW51ZSB0byB1c2UgdGhlIG9sZCBsaW5rZXIuICAqLwotI2lmZGVmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbgotI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX2JmZF9maW5hbF9saW5rCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSNlbmRpZgotI2Vsc2UgLyogISBkZWZpbmVkIChjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pICovCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBOVUxMCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNlbmRpZiAvKiAhIGRlZmluZWQgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbikgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotI2lmbmRlZiBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsKLSNkZWZpbmUgY29mZl9zdGFydF9maW5hbF9saW5rIE5VTEwKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYWRqdXN0X3N5bW5keAotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHggTlVMTAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4KLQotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biAoYWJmZCwgaW5mbykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gYWJmZC0+b3V0cHV0X2hhc19iZWd1bjsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci0KLXN0YXRpYyBib29sZWFuIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsIHBmaW5mbykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX1NXQVBfYXV4X2luCi0jZGVmaW5lIGNvZmZfU1dBUF9hdXhfaW4gY29mZl9zd2FwX2F1eF9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zeW1faW4KLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9pbiBjb2ZmX3N3YXBfc3ltX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2xpbmVub19pbgotI2RlZmluZSBjb2ZmX1NXQVBfbGluZW5vX2luIGNvZmZfc3dhcF9saW5lbm9faW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfYXV4X291dAotI2RlZmluZSBjb2ZmX1NXQVBfYXV4X291dCBjb2ZmX3N3YXBfYXV4X291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zeW1fb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9zeW1fb3V0IGNvZmZfc3dhcF9zeW1fb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2xpbmVub19vdXQKLSNkZWZpbmUgY29mZl9TV0FQX2xpbmVub19vdXQgY29mZl9zd2FwX2xpbmVub19vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfcmVsb2Nfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9yZWxvY19vdXQgY29mZl9zd2FwX3JlbG9jX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX1NXQVBfZmlsZWhkcl9vdXQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2FvdXRoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9hb3V0aGRyX291dCBjb2ZmX3N3YXBfYW91dGhkcl9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfc2NuaGRyX291dAotI2RlZmluZSBjb2ZmX1NXQVBfc2NuaGRyX291dCBjb2ZmX3N3YXBfc2NuaGRyX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9yZWxvY19pbgotI2RlZmluZSBjb2ZmX1NXQVBfcmVsb2NfaW4gY29mZl9zd2FwX3JlbG9jX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2ZpbGVoZHJfaW4KLSNkZWZpbmUgY29mZl9TV0FQX2ZpbGVoZHJfaW4gY29mZl9zd2FwX2ZpbGVoZHJfaW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfYW91dGhkcl9pbgotI2RlZmluZSBjb2ZmX1NXQVBfYW91dGhkcl9pbiBjb2ZmX3N3YXBfYW91dGhkcl9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zY25oZHJfaW4KLSNkZWZpbmUgY29mZl9TV0FQX3Njbmhkcl9pbiBjb2ZmX3N3YXBfc2NuaGRyX2luCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSBiZmRfY29mZl9zdGRfc3dhcF90YWJsZSA9Ci17Ci0gIGNvZmZfU1dBUF9hdXhfaW4sIGNvZmZfU1dBUF9zeW1faW4sIGNvZmZfU1dBUF9saW5lbm9faW4sCi0gIGNvZmZfU1dBUF9hdXhfb3V0LCBjb2ZmX1NXQVBfc3ltX291dCwKLSAgY29mZl9TV0FQX2xpbmVub19vdXQsIGNvZmZfU1dBUF9yZWxvY19vdXQsCi0gIGNvZmZfU1dBUF9maWxlaGRyX291dCwgY29mZl9TV0FQX2FvdXRoZHJfb3V0LAotICBjb2ZmX1NXQVBfc2NuaGRyX291dCwKLSAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgU1lNRVNaLCBBVVhFU1osIFJFTFNaLCBMSU5FU1osIEZJTE5NTEVOLAotI2lmZGVmIENPRkZfTE9OR19GSUxFTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0gIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiwKLSAgY29mZl9TV0FQX2ZpbGVoZHJfaW4sIGNvZmZfU1dBUF9hb3V0aGRyX2luLCBjb2ZmX1NXQVBfc2NuaGRyX2luLAotICBjb2ZmX1NXQVBfcmVsb2NfaW4sIGNvZmZfYmFkX2Zvcm1hdF9ob29rLCBjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgY29mZl9ta29iamVjdF9ob29rLCBzdHlwX3RvX3NlY19mbGFncywgY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssCi0gIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLCBzeW1uYW1lX2luX2RlYnVnX2hvb2ssIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaywKLSAgY29mZl9wcmludF9hdXgsIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcywgY29mZl9yZWxvYzE2X2VzdGltYXRlLAotICBjb2ZmX2NsYXNzaWZ5X3N5bWJvbCwgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0gIGNvZmZfc3RhcnRfZmluYWxfbGluaywgY29mZl9yZWxvY2F0ZV9zZWN0aW9uLCBjb2ZmX3J0eXBlX3RvX2hvd3RvLAotICBjb2ZmX2FkanVzdF9zeW1uZHgsIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCwKLSAgY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4sIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci19OwotCi0jaWZuZGVmIGNvZmZfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUJY29mZl9jbG9zZV9hbmRfY2xlYW51cCAgICAgICAgICAgICAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8gICAgICAgICAgIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZQljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzICAgICAgICAgICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhICAgICAgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAgICAgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyAgICAgICAgICBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIAotI2RlZmluZSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhICAgICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQkgICAgX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBjb2ZmX3JlYWRfbWluaXN5bWJvbHMJCSAgICBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBjb2ZmX21pbmlzeW1ib2xfdG9fc3ltYm9sCSAgICBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSNlbmRpZgotCi0vKiBUaGUgcmVsb2MgbG9va3VwIHJvdXRpbmUgbXVzdCBiZSBzdXBwbGllZCBieSBlYWNoIGluZGl2aWR1YWwgQ09GRgotICAgYmFja2VuZC4gICovCi0jaWZuZGVmIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCSAgICBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCQkgICAgYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgY29mZl9iZmRfZ2Nfc2VjdGlvbnMJCSAgICBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2VuZGlmCi0KLSNkZWZpbmUgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMoVkFSLCBOQU1FLCBFWFRSQV9PX0ZMQUdTLCBFWFRSQV9TX0ZMQUdTLCBVTkRFUiwgQUxURVJOQVRJVkUpCVwKLWNvbnN0IGJmZF90YXJnZXQgVkFSID0JCQkJCQkJXAotewkJCQkJCQkJCVwKLSAgTkFNRSAsCQkJCQkJCQlcCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkJCQkJCVwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCQlcCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCQlcCi0gIC8qIG9iamVjdCBmbGFncyAqLwkJCQkJCQlcCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwJCQlcCi0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRVhUUkFfT19GTEFHUyksCQkJXAotICAvKiBzZWN0aW9uIGZsYWdzICovCQkJCQkJCVwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IEVYVFJBX1NfRkxBR1MpLFwKLSAgVU5ERVIsCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwkJXAotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCQkJXAotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8JCQlcCi0gIAkJCQkJCQkJCVwKLSAgLyogRGF0YSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCQkJCQlcCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwJCQkJXAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCQkJCVwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkJCQlcCi0gIAkJCQkJCQkJCVwKLSAgLyogSGVhZGVyIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgKi8JCQkJCVwKLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAkJCQlcCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwJCQkJXAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCQkJCVwKLQkJCQkJCQkJCVwKLQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCQkJCQkJXAotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCQlcCi0gICAgX2JmZF9kdW1teV90YXJnZXQgfSwJCQkJCQlcCi0JLyogYmZkX3NldF9mb3JtYXQgKi8JCQkJCQlcCi0gIHsgYmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2UgfSwJXAotCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwkJCQkJXAotICB7IGJmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywJXAotICAgIGJmZF9mYWxzZSB9LAkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCQkJCVwKLSAgCQkJCQkJCQkJXAotICBBTFRFUk5BVElWRSwJCQkJCQkJCVwKLSAgCQkJCQkJCQkJXAotICBDT0ZGX1NXQVBfVEFCTEUJCQkJCQkJXAotfTsKLQotI2RlZmluZSBDUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyhWQVIsIE5BTUUsIEVYVFJBX09fRkxBR1MsIEVYVFJBX1NfRkxBR1MsIFVOREVSLCBBTFRFUk5BVElWRSkJXAotY29uc3QgYmZkX3RhcmdldCBWQVIgPQkJCQkJCQlcCi17CQkJCQkJCQkJXAotICBOQU1FICwJCQkJCQkJCVwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCQkJCQkJXAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8JCVwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8JXAotCS8qIG9iamVjdCBmbGFncyAqLwkJCQkJCVwKLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAkJCVwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBFWFRSQV9PX0ZMQUdTKSwJCQlcCi0JLyogc2VjdGlvbiBmbGFncyAqLwkJCQkJCVwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IEVYVFJBX1NfRkxBR1MpLFwKLSAgVU5ERVIsCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwkJXAotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCQkJXAotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8JCQlcCi0JCQkJCQkJCQlcCi0gIC8qIERhdGEgY29udmVyc2lvbiBmdW5jdGlvbnMuICAqLwkJCQkJXAotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCQkJCVwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAkJCQlcCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJCQkJXAotICAvKiBIZWFkZXIgY29udmVyc2lvbiBmdW5jdGlvbnMuICAqLwkJCQkJXAotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCQkJCVwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAkJCQlcCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJCQkJXAotCS8qIGJmZF9jaGVja19mb3JtYXQgKi8JCQkJCQlcCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJCVwKLSAgICBfYmZkX2R1bW15X3RhcmdldCB9LAkJCQkJCVwKLSAgICAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwkJCQkJCVwKLSAgeyBiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZSB9LAlcCi0JLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCQkJCQlcCi0gIHsgYmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAlcCi0gICAgYmZkX2ZhbHNlIH0sCQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwJCQkJXAotCQkJCQkJCQkJXAotICBBTFRFUk5BVElWRSwJCQkJCQkJCVwKLSAgCQkJCQkJCQkJXAotICBDT0ZGX1NXQVBfVEFCTEUJCQkJCQkJXAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmZ2VuLmMgYi9iZmQvY29mZmdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQxMGQ5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMzICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIENPRkYsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sIHNhY0BjeWdudXMuY29tLgotICAgU3BsaXQgb3V0IG9mIGNvZmZjb2RlLmggYnkgSWFuIFRheWxvciwgaWFuQGN5Z251cy5jb20uICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgQ09GRiBjb2RlIHRoYXQgaXMgbm90IGRlcGVuZGVudCBvbiBhbnkKLSAgIHBhcnRpY3VsYXIgQ09GRiB0YXJnZXQuICBUaGVyZSBpcyBvbmx5IG9uZSB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbgotICAgbGliYmZkLmEsIHNvIG5vIHRhcmdldCBzcGVjaWZpYyBjb2RlIG1heSBiZSBwdXQgaW4gaGVyZS4gIE9yLCB0bwotICAgcHV0IGl0IGFub3RoZXIgd2F5LAotCi0gICAqKioqKioqKioqIERPIE5PVCBQVVQgVEFSR0VUIFNQRUNJRklDIENPREUgSU4gVEhJUyBGSUxFICoqKioqKioqKioKLQotICAgSWYgeW91IG5lZWQgdG8gYWRkIHNvbWUgdGFyZ2V0IHNwZWNpZmljIGJlaGF2aW91ciwgYWRkIGEgbmV3IGhvb2sKLSAgIGZ1bmN0aW9uIHRvIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YS4KLQotICAgU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGFsc28gY2FsbGVkIGJ5IHRoZSBFQ09GRiByb3V0aW5lcy4KLSAgIFRob3NlIGZ1bmN0aW9ucyBtYXkgbm90IHVzZSBhbnkgQ09GRiBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgc3VjaCBhcwotICAgY29mZl9kYXRhIChhYmZkKS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgdm9pZCBjb2ZmX2ZpeF9zeW1ib2xfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGJmZF9zaXplX3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIHVuc2lnbmVkIGludCAqLAotCSAgIGJmZF9zaXplX3R5cGUgKiwgYXNlY3Rpb24gKiosIGJmZF9zaXplX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9hbGllbl9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgdW5zaWduZWQgaW50ICosIGJmZF9zaXplX3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGNvZmZfc3ltYm9sX3R5cGUgKiwgdW5zaWduZWQgaW50ICosIGJmZF9zaXplX3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3BvaW50ZXJpemVfYXV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKLQkgICB1bnNpZ25lZCBpbnQsIGNvbWJpbmVkX2VudHJ5X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gbWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfcmVhbF9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQsIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICosIAotCSAgIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopKTsKLXN0YXRpYyB2b2lkIGZpeHVwX3N5bWJvbF92YWx1ZQotICBQQVJBTVMgKChiZmQgKiwgY29mZl9zeW1ib2xfdHlwZSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLXN0YXRpYyBjaGFyICpidWlsZF9kZWJ1Z19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqY29weV9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIGludCkpOwotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLS8qIFRha2UgYSBzZWN0aW9uIGhlYWRlciByZWFkIGZyb20gYSBjb2ZmIGZpbGUgKGluIEhPU1QgYnl0ZSBvcmRlciksCi0gICBhbmQgbWFrZSBhIEJGRCAic2VjdGlvbiIgb3V0IG9mIGl0LiAgVGhpcyBpcyB1c2VkIGJ5IEVDT0ZGLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUgKGFiZmQsIGhkciwgdGFyZ2V0X2luZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkcjsKLSAgICAgdW5zaWduZWQgaW50IHRhcmdldF9pbmRleDsKLXsKLSAgYXNlY3Rpb24gKnJldHVybl9zZWN0aW9uOwotICBjaGFyICpuYW1lOwotCi0gIG5hbWUgPSBOVUxMOwotCi0gIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMgYXMgaW4gUEUuICAqLwotICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKQotICAgICAgJiYgaGRyLT5zX25hbWVbMF0gPT0gJy8nKQotICAgIHsKLSAgICAgIGNoYXIgYnVmW1NDTk5NTEVOXTsKLSAgICAgIGxvbmcgc3RyaW5kZXg7Ci0gICAgICBjaGFyICpwOwotICAgICAgY29uc3QgY2hhciAqc3RyaW5nczsKLQotICAgICAgbWVtY3B5IChidWYsIGhkci0+c19uYW1lICsgMSwgU0NOTk1MRU4gLSAxKTsKLSAgICAgIGJ1ZltTQ05OTUxFTiAtIDFdID0gJ1wwJzsKLSAgICAgIHN0cmluZGV4ID0gc3RydG9sIChidWYsICZwLCAxMCk7Ci0gICAgICBpZiAoKnAgPT0gJ1wwJyAmJiBzdHJpbmRleCA+PSAwKQotCXsKLQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRklYTUU6IEZvciBleHRyYSBzYWZldHksIHdlIHNob3VsZCBtYWtlIHN1cmUgdGhhdAotICAgICAgICAgICAgIHN0cmluZGV4IGRvZXMgbm90IHJ1biB1cyBwYXN0IHRoZSBlbmQsIGJ1dCByaWdodCBub3cgd2UKLSAgICAgICAgICAgICBkb24ndCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICBzdHJpbmdzICs9IHN0cmluZGV4OwotCSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzdHJpbmdzKSArIDEpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3RyY3B5IChuYW1lLCBzdHJpbmdzKTsKLQl9Ci0gICAgfQotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgLyogQXNzb3J0ZWQgd2FzdGFnZSB0byBudWxsLXRlcm1pbmF0ZSB0aGUgbmFtZSwgdGhhbmtzIEFUJlQhICovCi0gICAgICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGhkci0+c19uYW1lKSArIDEpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJuY3B5IChuYW1lLCAoY2hhciAqKSAmaGRyLT5zX25hbWVbMF0sIHNpemVvZiAoaGRyLT5zX25hbWUpKTsKLSAgICAgIG5hbWVbc2l6ZW9mIChoZHItPnNfbmFtZSldID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmIChyZXR1cm5fc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm5fc2VjdGlvbi0+dm1hID0gaGRyLT5zX3ZhZGRyOwotICByZXR1cm5fc2VjdGlvbi0+bG1hID0gaGRyLT5zX3BhZGRyOwotICByZXR1cm5fc2VjdGlvbi0+X3Jhd19zaXplID0gaGRyLT5zX3NpemU7Ci0gIHJldHVybl9zZWN0aW9uLT5maWxlcG9zID0gaGRyLT5zX3NjbnB0cjsKLSAgcmV0dXJuX3NlY3Rpb24tPnJlbF9maWxlcG9zID0gaGRyLT5zX3JlbHB0cjsKLSAgcmV0dXJuX3NlY3Rpb24tPnJlbG9jX2NvdW50ID0gaGRyLT5zX25yZWxvYzsKLQotICBiZmRfY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHJldHVybl9zZWN0aW9uLCBoZHIpOwotCi0gIHJldHVybl9zZWN0aW9uLT5saW5lX2ZpbGVwb3MgPSBoZHItPnNfbG5ub3B0cjsKLQotICByZXR1cm5fc2VjdGlvbi0+bGluZW5vX2NvdW50ID0gaGRyLT5zX25sbm5vOwotICByZXR1cm5fc2VjdGlvbi0+dXNlcmRhdGEgPSBOVUxMOwotICByZXR1cm5fc2VjdGlvbi0+bmV4dCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICByZXR1cm5fc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdGFyZ2V0X2luZGV4OwotICByZXR1cm5fc2VjdGlvbi0+ZmxhZ3MgPSBiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rIChhYmZkLCBoZHIsIG5hbWUsCi0JCQkJCQkJICAgcmV0dXJuX3NlY3Rpb24pOwotCi0gIC8qIEF0IGxlYXN0IG9uIGkzODYtY29mZiwgdGhlIGxpbmUgbnVtYmVyIGNvdW50IGZvciBhIHNoYXJlZCBsaWJyYXJ5Ci0gICAgIHNlY3Rpb24gbXVzdCBiZSBpZ25vcmVkLiAgKi8KLSAgaWYgKChyZXR1cm5fc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSkgIT0gMCkKLSAgICByZXR1cm5fc2VjdGlvbi0+bGluZW5vX2NvdW50ID0gMDsKLQotICBpZiAoaGRyLT5zX25yZWxvYyAhPSAwKQotICAgIHJldHVybl9zZWN0aW9uLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0gIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBjaGVjayAnaGRyLT5zX3NpemUgPiAwJyAqLwotICBpZiAoaGRyLT5zX3NjbnB0ciAhPSAwKQotICAgIHJldHVybl9zZWN0aW9uLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiBhIENPRkYgb2JqZWN0IGFuZCBtYWtlIGl0IGludG8gYSBCRkQuICBUaGlzIGlzIHVzZWQgYnkKLSAgIEVDT0ZGIGFzIHdlbGwuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1jb2ZmX3JlYWxfb2JqZWN0X3AgKGFiZmQsIG5zY25zLCBpbnRlcm5hbF9mLCBpbnRlcm5hbF9hKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIG5zY25zOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZjsKLSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmludGVybmFsX2E7Ci17Ci0gIGZsYWd3b3JkIG9mbGFncyA9IGFiZmQtPmZsYWdzOwotICBiZmRfdm1hIG9zdGFydCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIFBUUiB0ZGF0YTsKLSAgc2l6ZV90IHJlYWRzaXplOwkJLyogbGVuZ3RoIG9mIGZpbGVfaW5mbyAqLwotICB1bnNpZ25lZCBpbnQgc2NuaHN6OwotICBjaGFyICpleHRlcm5hbF9zZWN0aW9uczsKLQotICBpZiAoIShpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9SRUxGTEcpKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9FWEVDKSkKLSAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0xOTk8pKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk87Ci0gIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0xTWU1TKSkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfTE9DQUxTOwotCi0gIC8qIEZJWE1FOiBIb3cgY2FuIHdlIHNldCBEX1BBR0VEIGNvcnJlY3RseT8gICovCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRVhFQykgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gaW50ZXJuYWxfZi0+Zl9uc3ltczsKLSAgaWYgKGludGVybmFsX2YtPmZfbnN5bXMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCi0gICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGludGVybmFsX2EtPmVudHJ5OwotICBlbHNlCi0gICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IDA7Ci0KLSAgLyogU2V0IHVwIHRoZSB0ZGF0YSBhcmVhLiAgRUNPRkYgdXNlcyBpdHMgb3duIHJvdXRpbmUsIGFuZCBvdmVycmlkZXMKLSAgICAgYWJmZC0+ZmxhZ3MuICAqLwotICB0ZGF0YSA9IGJmZF9jb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIChQVFIpIGludGVybmFsX2YsIChQVFIpIGludGVybmFsX2EpOwotICBpZiAodGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBzY25oc3ogPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotICByZWFkc2l6ZSA9IG5zY25zICogc2NuaHN6OwotICBleHRlcm5hbF9zZWN0aW9ucyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgcmVhZHNpemUpOwotICBpZiAoIWV4dGVybmFsX3NlY3Rpb25zKQotICAgIGdvdG8gZmFpbDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGV4dGVybmFsX3NlY3Rpb25zLCAxLCByZWFkc2l6ZSwgYWJmZCkgIT0gcmVhZHNpemUpCi0gICAgZ290byBmYWlsOwotCi0gIC8qIFNldCB0aGUgYXJjaC9tYWNoICpiZWZvcmUqIHN3YXBwaW5nIGluIHNlY3Rpb25zOyBzZWN0aW9uIGhlYWRlciBzd2FwcGluZwotICAgICBtYXkgZGVwZW5kIG9uIGFyY2gvbWFjaCBpbmZvLiAqLwotICBpZiAoYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rIChhYmZkLCAoUFRSKSBpbnRlcm5hbF9mKSA9PSBmYWxzZSkKLSAgICBnb3RvIGZhaWw7Ci0KLSAgLyogTm93IGNvcHkgZGF0YSBhcyByZXF1aXJlZDsgY29uc3RydWN0IGFsbCBhc2VjdGlvbnMgZXRjICovCi0gIGlmIChuc2NucyAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5zY25zOyBpKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciB0bXA7Ci0JICBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwKLQkJCQkgICAoUFRSKSAoZXh0ZXJuYWxfc2VjdGlvbnMgKyBpICogc2NuaHN6KSwKLQkJCQkgICAoUFRSKSAmIHRtcCk7Ci0JICBpZiAoISBtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUgKGFiZmQsICZ0bXAsIGkgKyAxKSkKLQkgICAgZ290byBmYWlsOwotCX0KLSAgICB9Ci0KLSAgLyogIG1ha2VfYWJzX3NlY3Rpb24gKGFiZmQpOyAqLwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gZmFpbDoKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHRkYXRhKTsKLSAgYWJmZC0+ZmxhZ3MgPSBvZmxhZ3M7Ci0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBvc3RhcnQ7Ci0gIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotfQotCi0vKiBUdXJuIGEgQ09GRiBmaWxlIGludG8gYSBCRkQsIGJ1dCBmYWlsIHdpdGggYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCBpZiBpdCBpcwotICAgbm90IGEgQ09GRiBmaWxlLiAgVGhpcyBpcyBhbHNvIHVzZWQgYnkgRUNPRkYuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWNvZmZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGZpbGhzejsKLSAgdW5zaWduZWQgaW50IGFvdXRzejsKLSAgaW50IG5zY25zOwotICBQVFIgZmlsZWhkcjsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgaW50ZXJuYWxfZjsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgaW50ZXJuYWxfYTsKLQotICAvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIHRvIHJlYWQgKi8KLSAgZmlsaHN6ID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgYW91dHN6ID0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLQotICBmaWxlaGRyID0gYmZkX2FsbG9jIChhYmZkLCBmaWxoc3opOwotICBpZiAoZmlsZWhkciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBpZiAoYmZkX3JlYWQgKGZpbGVoZHIsIDEsIGZpbGhzeiwgYWJmZCkgIT0gZmlsaHN6KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luIChhYmZkLCBmaWxlaGRyLCAmaW50ZXJuYWxfZik7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCBmaWxlaGRyKTsKLQotICBpZiAoYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCAmaW50ZXJuYWxfZikgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIG5zY25zID0gaW50ZXJuYWxfZi5mX25zY25zOwotCi0gIGlmIChpbnRlcm5hbF9mLmZfb3B0aGRyKQotICAgIHsKLSAgICAgIFBUUiBvcHRoZHI7Ci0KLSAgICAgIG9wdGhkciA9IGJmZF9hbGxvYyAoYWJmZCwgYW91dHN6KTsKLSAgICAgIGlmIChvcHRoZHIgPT0gTlVMTCkKLQlyZXR1cm4gMDs7Ci0gICAgICBpZiAoYmZkX3JlYWQgKG9wdGhkciwgMSwgaW50ZXJuYWxfZi5mX29wdGhkciwgYWJmZCkKLQkgICE9IGludGVybmFsX2YuZl9vcHRoZHIpCi0JewotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBvcHRoZHIsIChQVFIpICZpbnRlcm5hbF9hKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNvZmZfcmVhbF9vYmplY3RfcCAoYWJmZCwgbnNjbnMsICZpbnRlcm5hbF9mLAotCQkJICAgICAoaW50ZXJuYWxfZi5mX29wdGhkciAhPSAwCi0JCQkgICAgICA/ICZpbnRlcm5hbF9hCi0JCQkgICAgICA6IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSBOVUxMKSk7Ci19Ci0KLS8qIEdldCB0aGUgQkZEIHNlY3Rpb24gZnJvbSBhIENPRkYgc3ltYm9sIHNlY3Rpb24gbnVtYmVyLiAgKi8KLQotYXNlY3Rpb24gKgotY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaW5kZXg7Ci17Ci0gIHN0cnVjdCBzZWMgKmFuc3dlciA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChpbmRleCA9PSBOX0FCUykKLSAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgaWYgKGluZGV4ID09IE5fVU5ERUYpCi0gICAgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIGlmIChpbmRleCA9PSBOX0RFQlVHKQotICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0gIHdoaWxlIChhbnN3ZXIpCi0gICAgewotICAgICAgaWYgKGFuc3dlci0+dGFyZ2V0X2luZGV4ID09IGluZGV4KQotCXJldHVybiBhbnN3ZXI7Ci0gICAgICBhbnN3ZXIgPSBhbnN3ZXItPm5leHQ7Ci0gICAgfQotCi0gIC8qIFdlIHNob3VsZCBub3QgcmVhY2ggdGhpcyBwb2ludCwgYnV0IHRoZSBTQ08gMy4ydjQgL2xpYi9saWJjX3MuYQotICAgICBoYXMgYSBiYWQgc3ltYm9sIHRhYmxlIGluIGJpZ2xpdHBvdy5vLiAgKi8KLSAgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHI7Ci19Ci0KLS8qIEdldCB0aGUgdXBwZXIgYm91bmQgb2YgYSBDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0KLWxvbmcKLWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIWJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIChzaXplb2YgKGNvZmZfc3ltYm9sX3R5cGUgKikpOwotfQotCi0KLS8qIENhbm9uaWNhbGl6ZSBhIENPRkYgc3ltYm9sIHRhYmxlLiAgKi8KLQotbG9uZwotY29mZl9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKipsb2NhdGlvbiA9IChjb2ZmX3N5bWJvbF90eXBlICoqKSBhbG9jYXRpb247Ci0KLSAgaWYgKCFiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBzeW1iYXNlID0gb2JqX3N5bWJvbHMgKGFiZmQpOwotICBjb3VudGVyID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHdoaWxlIChjb3VudGVyLS0gPiAwKQotICAgICpsb2NhdGlvbisrID0gc3ltYmFzZSsrOwotCi0gICpsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSBzeW1ib2wuICBUaGUgY2FsbGVyIG11c3QgcGFzcyBpbiBhIGJ1ZmZlciBvZiBzaXplCi0gICA+PSBTWU1OTUxFTiArIDEuICAqLwotCi1jb25zdCBjaGFyICoKLV9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgc3ltLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBjaGFyICpidWY7Ci17Ci0gIC8qIEZJWE1FOiBJdCdzIG5vdCBjbGVhciB0aGlzIHdpbGwgd29yayBjb3JyZWN0bHkgaWYgc2l6ZW9mCi0gICAgIChfbl96ZXJvZXMpICE9IDQuICAqLwotICBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCi0gICAgICB8fCBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ID09IDApCi0gICAgewotICAgICAgbWVtY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotICAgICAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0gICAgICByZXR1cm4gYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHN5bS0+X24uX25fbi5fbl9vZmZzZXQgPj0gU1RSSU5HX1NJWkVfU0laRSk7Ci0gICAgICBzdHJpbmdzID0gb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCk7Ci0gICAgICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCXsKLQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgcmV0dXJuIHN0cmluZ3MgKyBzeW0tPl9uLl9uX24uX25fb2Zmc2V0OwotICAgIH0KLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgcmVsb2NzLiAgVGhpcyByZXR1cm5zIGEgYnVmZmVyIGhvbGRpbmcgdGhlCi0gICByZWxvY3MgZm9yIHNlY3Rpb24gU0VDIGluIGZpbGUgQUJGRC4gIElmIENBQ0hFIGlzIHRydWUgYW5kCi0gICBJTlRFUk5BTF9SRUxPQ1MgaXMgTlVMTCwgdGhlIHJlbG9jcyByZWFkIGluIHdpbGwgYmUgc2F2ZWQgaW4gY2FzZQotICAgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZ2Fpbi4gIElmIEVYVEVSTkFMX1JFTE9DUyBpcyBub3QgTlVMTCwgaXQKLSAgIGlzIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSB1bnN3YXBwZWQgcmVsb2NzLiAgSWYKLSAgIElOVEVSTkFMX1JFTE9DUyBpcyBub3QgTlVMTCwgaXQgaXMgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQKLSAgIHRoZSBzd2FwcGVkIHJlbG9jcy4gIElmIFJFUVVJUkVfSU5URVJOQUwgaXMgdHJ1ZSwgdGhlbiB0aGUgcmV0dXJuCi0gICB2YWx1ZSBtdXN0IGJlIElOVEVSTkFMX1JFTE9DUy4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIE5VTEwgb24gZXJyb3IuICAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKgotX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIGNhY2hlLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJcmVxdWlyZV9pbnRlcm5hbCwgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJvb2xlYW4gY2FjaGU7Ci0gICAgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9pbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIGJmZF9zaXplX3R5cGUgcmVsc3o7Ci0gIGJmZF9ieXRlICpmcmVlX2V4dGVybmFsID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpmcmVlX2ludGVybmFsID0gTlVMTDsKLSAgYmZkX2J5dGUgKmVyZWw7Ci0gIGJmZF9ieXRlICplcmVsX2VuZDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgcmVxdWlyZV9pbnRlcm5hbCkKLQlyZXR1cm4gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jczsKLSAgICAgIG1lbWNweSAoaW50ZXJuYWxfcmVsb2NzLCBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzLAotCSAgICAgIHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOwotICAgICAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLSAgICB9Ci0KLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0KLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWVfZXh0ZXJuYWwgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgICAgIGlmIChmcmVlX2V4dGVybmFsID09IE5VTEwgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSBmcmVlX2V4dGVybmFsOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlYy0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgcmVsc3osIHNlYy0+cmVsb2NfY291bnQsIGFiZmQpCi0JICAhPSByZWxzeiAqIHNlYy0+cmVsb2NfY291bnQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlX2ludGVybmFsID0gKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQKLQkJCQkgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotICAgICAgaWYgKGZyZWVfaW50ZXJuYWwgPT0gTlVMTCAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IGZyZWVfaW50ZXJuYWw7Ci0gICAgfQotCi0gIC8qIFN3YXAgaW4gdGhlIHJlbG9jcy4gICovCi0gIGVyZWwgPSBleHRlcm5hbF9yZWxvY3M7Ci0gIGVyZWxfZW5kID0gZXJlbCArIHJlbHN6ICogc2VjLT5yZWxvY19jb3VudDsKLSAgaXJlbCA9IGludGVybmFsX3JlbG9jczsKLSAgZm9yICg7IGVyZWwgPCBlcmVsX2VuZDsgZXJlbCArPSByZWxzeiwgaXJlbCsrKQotICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGVyZWwsIChQVFIpIGlyZWwpOwotCi0gIGlmIChmcmVlX2V4dGVybmFsICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9leHRlcm5hbCk7Ci0gICAgICBmcmVlX2V4dGVybmFsID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGNhY2hlICYmIGZyZWVfaW50ZXJuYWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQl7Ci0JICBzZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBOVUxMOwotCX0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBmcmVlX2ludGVybmFsOwotICAgIH0KLQotICByZXR1cm4gaW50ZXJuYWxfcmVsb2NzOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9leHRlcm5hbCAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0ZXJuYWwpOwotICBpZiAoZnJlZV9pbnRlcm5hbCAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfaW50ZXJuYWwpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IGxpbmVub19jb3VudCBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucyBvZiBhIENPRkYgZmlsZS4gICovCi0KLWludAotY29mZl9jb3VudF9saW5lbnVtYmVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgbGltaXQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCB0b3RhbCA9IDA7Ci0gIGFzeW1ib2wgKipwOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAobGltaXQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG1heSBiZSBmcm9tIHRoZSBiYWNrZW5kIGxpbmtlciwgaW4gd2hpY2ggY2FzZSB0aGUKLSAgICAgICAgIGxpbmVub19jb3VudCBpbiB0aGUgc2VjdGlvbnMgaXMgY29ycmVjdC4gICovCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl0b3RhbCArPSBzLT5saW5lbm9fY291bnQ7Ci0gICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIEJGRF9BU1NFUlQgKHMtPmxpbmVub19jb3VudCA9PSAwKTsKLQotICBmb3IgKHAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsgaSA8IGxpbWl0OyBpKyssIHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpxX21heWJlID0gKnA7Ci0KLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChxX21heWJlKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLQl7Ci0JICBjb2ZmX3N5bWJvbF90eXBlICpxID0gY29mZnN5bWJvbCAocV9tYXliZSk7Ci0KLQkgIC8qIFRoZSBBSVggNC4xIGNvbXBpbGVyIGNhbiBzb21ldGltZXMgZ2VuZXJhdGUgbGluZSBudW1iZXJzCi0gICAgICAgICAgICAgYXR0YWNoZWQgdG8gZGVidWdnaW5nIHN5bWJvbHMuICBXZSB0cnkgdG8gc2ltcGx5IGlnbm9yZQotICAgICAgICAgICAgIHRob3NlIGhlcmUuICAqLwotCSAgaWYgKHEtPmxpbmVubyAhPSBOVUxMCi0JICAgICAgJiYgcS0+c3ltYm9sLnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgbGluZSBudW1iZXJzLiAgSW5jcmVtZW50IHRoZSBvd25pbmcKLQkgICAgICAgICBzZWN0aW9uJ3MgbGluZW51bWJlciBjb3VudC4gICovCi0JICAgICAgYWxlbnQgKmwgPSBxLT5saW5lbm87Ci0KLQkgICAgICArK3EtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50OwotCSAgICAgICsrdG90YWw7Ci0JICAgICAgKytsOwotCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlciAhPSAwKQotCQl7Ci0JCSAgKyt0b3RhbDsKLQkJICArK3EtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50OwotCQkgICsrbDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdG90YWw7Ci19Ci0KLS8qIFRha2VzIGEgYmZkIGFuZCBhIHN5bWJvbCwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvZmYgc3BlY2lmaWMKLSAgIGFyZWEgb2YgdGhlIHN5bWJvbCBpZiB0aGVyZSBpcyBvbmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLWNvZmZfc3ltYm9sX3R5cGUgKgotY29mZl9zeW1ib2xfZnJvbSAoaWdub3JlX2FiZmQsIHN5bWJvbCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW1ib2wpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCi0gIGlmIChiZmRfYXN5bWJvbF9iZmQgKHN5bWJvbCktPnRkYXRhLmNvZmZfb2JqX2RhdGEgPT0gKGNvZmZfZGF0YV90eXBlICopIE5VTEwpCi0gICAgcmV0dXJuIChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0KLSAgcmV0dXJuIChjb2ZmX3N5bWJvbF90eXBlICopIHN5bWJvbDsKLX0KLQotc3RhdGljIHZvaWQKLWZpeHVwX3N5bWJvbF92YWx1ZSAoYWJmZCwgY29mZl9zeW1ib2xfcHRyLCBzeW1lbnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1lbnQ7Ci17Ci0KLSAgLyogTm9ybWFsaXplIHRoZSBzeW1ib2wgZmxhZ3MgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikpCi0gICAgewotICAgICAgLyogYSBjb21tb24gc3ltYm9sIGlzIHVuZGVmaW5lZCB3aXRoIGEgdmFsdWUgKi8KLSAgICAgIHN5bWVudC0+bl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDAKLQkgICAmJiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfREVCVUdHSU5HX1JFTE9DKSA9PSAwKQotICAgIHsKLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBzeW1lbnQtPm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgc3ltZW50LT5uX3ZhbHVlID0gMDsKLSAgICB9Ci0gIC8qIEZJWE1FOiBEbyB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBoZXJlPyAgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uKQotCXsKLQkgIHN5bWVudC0+bl9zY251bSA9Ci0JICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0KLQkgIHN5bWVudC0+bl92YWx1ZSA9IChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZQotCQkJICAgICArIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQkgICAgc3ltZW50LT5uX3ZhbHVlICs9Ci0JICAgICAgY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAoMCk7Ci0JICAvKiBUaGlzIGNhbiBoYXBwZW4sIGJ1dCBJIGRvbid0IGtub3cgd2h5IHlldCAoc3RldmVAY3lnbnVzLmNvbSkgKi8KLQkgIHN5bWVudC0+bl9zY251bSA9IE5fQUJTOwotCSAgc3ltZW50LT5uX3ZhbHVlID0gY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wudmFsdWU7Ci0JfQotICAgIH0KLX0KLQotLyogUnVuIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIHdvcmsgb3V0IHdoYXQKLSAgIHRoZWlyIGluZGV4ZXMgaW50byB0aGUgc3ltYm9sIHRhYmxlIHdpbGwgYmUgd2hlbiBvdXRwdXQuCi0KLSAgIENvZmYgcmVxdWlyZXMgdGhhdCBlYWNoIENfRklMRSBzeW1ib2wgcG9pbnRzIHRvIHRoZSBuZXh0IG9uZSBpbiB0aGUKLSAgIGNoYWluLCBhbmQgdGhhdCB0aGUgbGFzdCBvbmUgcG9pbnRzIHRvIHRoZSBmaXJzdCBleHRlcm5hbCBzeW1ib2wuIFdlCi0gICBkbyB0aGF0IGhlcmUgdG9vLiAgKi8KLQotYm9vbGVhbgotY29mZl9yZW51bWJlcl9zeW1ib2xzIChiZmRfcHRyLCBmaXJzdF91bmRlZikKLSAgICAgYmZkICpiZmRfcHRyOwotICAgICBpbnQgKmZpcnN0X3VuZGVmOwotewotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYmZkX3B0cik7Ci0gIGFzeW1ib2wgKipzeW1ib2xfcHRyX3B0ciA9IGJmZF9wdHItPm91dHN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBuYXRpdmVfaW5kZXggPSAwOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpsYXN0X2ZpbGUgPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKSBOVUxMOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2luZGV4OwotCi0gIC8qIENPRkYgZGVtYW5kcyB0aGF0IHVuZGVmaW5lZCBzeW1ib2xzIGNvbWUgYWZ0ZXIgYWxsIG90aGVyIHN5bWJvbHMuCi0gICAgIFNpbmNlIHdlIGRvbid0IG5lZWQgdG8gaW1wb3NlIHRoaXMgZXh0cmEga25vd2xlZGdlIG9uIGFsbCBvdXIKLSAgICAgY2xpZW50IHByb2dyYW1zLCBkZWFsIHdpdGggdGhhdCBoZXJlLiAgU29ydCB0aGUgc3ltYm9sIHRhYmxlOwotICAgICBqdXN0IG1vdmUgdGhlIHVuZGVmaW5lZCBzeW1ib2xzIHRvIHRoZSBlbmQsIGxlYXZpbmcgdGhlIHJlc3QKLSAgICAgYWxvbmUuICBUaGUgTydSZWlsbHkgYm9vayBzYXlzIHRoYXQgZGVmaW5lZCBnbG9iYWwgc3ltYm9scyBjb21lCi0gICAgIGF0IHRoZSBlbmQgYmVmb3JlIHRoZSB1bmRlZmluZWQgc3ltYm9scywgc28gd2UgZG8gdGhhdCBoZXJlIGFzCi0gICAgIHdlbGwuICAqLwotICAvKiBAQCBEbyB3ZSBoYXZlIHNvbWUgY29uZGl0aW9uIHdlIGNvdWxkIHRlc3QgZm9yLCBzbyB3ZSBkb24ndCBhbHdheXMKLSAgICAgaGF2ZSB0byBkbyB0aGlzPyAgSSBkb24ndCB0aGluayByZWxvY2F0YWJpbGl0eSBpcyBxdWl0ZSByaWdodCwgYnV0Ci0gICAgIEknbSBub3QgY2VydGFpbi4gIFtyYWVidXJuOjE5OTIwNTA4LjE3MTFFU1RdICAqLwotICB7Ci0gICAgYXN5bWJvbCAqKm5ld3N5bXM7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBuZXdzeW1zID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAoYmZkX3B0ciwKLQkJCQkgICAgICBzaXplb2YgKGFzeW1ib2wgKikgKiAoc3ltYm9sX2NvdW50ICsgMSkpOwotICAgIGlmICghbmV3c3ltcykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBiZmRfcHRyLT5vdXRzeW1ib2xzID0gbmV3c3ltczsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9sX2NvdW50OyBpKyspCi0gICAgICBpZiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSAhPSAwCi0JICB8fCAoIWJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pCi0JICAgICAgJiYgIWJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pCi0JICAgICAgJiYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IDAKLQkJICB8fCAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKQotCQkgICAgICA9PSAwKSkpKQotCSpuZXdzeW1zKysgPSBzeW1ib2xfcHRyX3B0cltpXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xfY291bnQ7IGkrKykKLSAgICAgIGlmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpID09IDAKLQkgICYmICFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgJiYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pCi0JICAgICAgfHwgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pID09IDAKLQkJICAmJiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKQotCQkgICAgICAhPSAwKSkpKQotCSpuZXdzeW1zKysgPSBzeW1ib2xfcHRyX3B0cltpXTsKLQotICAgICpmaXJzdF91bmRlZiA9IG5ld3N5bXMgLSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbF9jb3VudDsgaSsrKQotICAgICAgaWYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgPT0gMAotCSAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikpCi0JKm5ld3N5bXMrKyA9IHN5bWJvbF9wdHJfcHRyW2ldOwotICAgICpuZXdzeW1zID0gKGFzeW1ib2wgKikgTlVMTDsKLSAgICBzeW1ib2xfcHRyX3B0ciA9IGJmZF9wdHItPm91dHN5bWJvbHM7Ci0gIH0KLQotICBmb3IgKHN5bWJvbF9pbmRleCA9IDA7IHN5bWJvbF9pbmRleCA8IHN5bWJvbF9jb3VudDsgc3ltYm9sX2luZGV4KyspCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyID0gY29mZl9zeW1ib2xfZnJvbSAoYmZkX3B0ciwgc3ltYm9sX3B0cl9wdHJbc3ltYm9sX2luZGV4XSk7Ci0gICAgICBzeW1ib2xfcHRyX3B0cltzeW1ib2xfaW5kZXhdLT51ZGF0YS5pID0gc3ltYm9sX2luZGV4OyAKLSAgICAgIGlmIChjb2ZmX3N5bWJvbF9wdHIgJiYgY29mZl9zeW1ib2xfcHRyLT5uYXRpdmUpCi0JewotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlOwotCSAgaW50IGk7Ci0KLQkgIGlmIChzLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgIHsKLQkgICAgICBpZiAobGFzdF9maWxlICE9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopIE5VTEwpCi0JCWxhc3RfZmlsZS0+bl92YWx1ZSA9IG5hdGl2ZV9pbmRleDsKLQkgICAgICBsYXN0X2ZpbGUgPSAmKHMtPnUuc3ltZW50KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0KLQkgICAgICAvKiBNb2RpZnkgdGhlIHN5bWJvbCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZWlyIHNlY3Rpb24gYW5kCi0JICAgICAgICAgdHlwZSAqLwotCi0JICAgICAgZml4dXBfc3ltYm9sX3ZhbHVlIChiZmRfcHRyLCBjb2ZmX3N5bWJvbF9wdHIsICYocy0+dS5zeW1lbnQpKTsKLQkgICAgfQotCSAgZm9yIChpID0gMDsgaSA8IHMtPnUuc3ltZW50Lm5fbnVtYXV4ICsgMTsgaSsrKQotCSAgICBzW2ldLm9mZnNldCA9IG5hdGl2ZV9pbmRleCsrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuYXRpdmVfaW5kZXgrKzsKLQl9Ci0gICAgfQotICBvYmpfY29udl90YWJsZV9zaXplIChiZmRfcHRyKSA9IG5hdGl2ZV9pbmRleDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUnVuIHRob3JvdWdoIHRoZSBzeW1ib2wgdGFibGUgYWdhaW4sIGFuZCBmaXggaXQgc28gdGhhdCBhbGwKLSAgIHBvaW50ZXJzIHRvIGVudHJpZXMgYXJlIGNoYW5nZWQgdG8gdGhlIGVudHJpZXMnIGluZGV4IGluIHRoZSBvdXRwdXQKLSAgIHN5bWJvbCB0YWJsZS4gICovCi0KLXZvaWQKLWNvZmZfbWFuZ2xlX3N5bWJvbHMgKGJmZF9wdHIpCi0gICAgIGJmZCAqYmZkX3B0cjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGJmZF9wdHIpOwotICBhc3ltYm9sICoqc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2luZGV4OwotCi0gIGZvciAoc3ltYm9sX2luZGV4ID0gMDsgc3ltYm9sX2luZGV4IDwgc3ltYm9sX2NvdW50OyBzeW1ib2xfaW5kZXgrKykKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2ZmX3N5bWJvbF9wdHIgPQotICAgICAgY29mZl9zeW1ib2xfZnJvbSAoYmZkX3B0ciwgc3ltYm9sX3B0cl9wdHJbc3ltYm9sX2luZGV4XSk7Ci0KLSAgICAgIGlmIChjb2ZmX3N5bWJvbF9wdHIgJiYgY29mZl9zeW1ib2xfcHRyLT5uYXRpdmUpCi0JewotCSAgaW50IGk7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpzID0gY29mZl9zeW1ib2xfcHRyLT5uYXRpdmU7Ci0KLQkgIGlmIChzLT5maXhfdmFsdWUpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHVzZSBhIHVuaW9uIGhlcmUuICAqLwotCSAgICAgIHMtPnUuc3ltZW50Lm5fdmFsdWUgPQotCQkoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcy0+dS5zeW1lbnQubl92YWx1ZSktPm9mZnNldDsKLQkgICAgICBzLT5maXhfdmFsdWUgPSAwOwotCSAgICB9Ci0JICBpZiAocy0+Zml4X2xpbmUpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgdmFsdWUgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzCi0gICAgICAgICAgICAgICAgIGZvciB0aGUgc3ltYm9sJ3Mgc2VjdGlvbi4gIE9uIG91dHB1dCwgdGhlIHN5bWJvbCdzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24gc2hvdWxkIGJlIE5fREVCVUcuICAqLwotCSAgICAgIHMtPnUuc3ltZW50Lm5fdmFsdWUgPQotCQkoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxpbmVfZmlsZXBvcwotCQkgKyBzLT51LnN5bWVudC5uX3ZhbHVlICogYmZkX2NvZmZfbGluZXN6IChiZmRfcHRyKSk7Ci0JICAgICAgY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbiA9Ci0JCWNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYmZkX3B0ciwgTl9ERUJVRyk7Ci0JICAgICAgQkZEX0FTU0VSVCAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKTsKLQkgICAgfQotCSAgZm9yIChpID0gMDsgaSA8IHMtPnUuc3ltZW50Lm5fbnVtYXV4OyBpKyspCi0JICAgIHsKLQkgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphID0gcyArIGkgKyAxOwotCSAgICAgIGlmIChhLT5maXhfdGFnKQotCQl7Ci0JCSAgYS0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubCA9Ci0JCSAgICBhLT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wLT5vZmZzZXQ7Ci0JCSAgYS0+Zml4X3RhZyA9IDA7Ci0JCX0KLQkgICAgICBpZiAoYS0+Zml4X2VuZCkKLQkJewotCQkgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPQotCQkgICAgYS0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF9lbmQgPSAwOwotCQl9Ci0JICAgICAgaWYgKGEtPmZpeF9zY25sZW4pCi0JCXsKLQkJICBhLT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLmwgPQotCQkgICAgYS0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5wLT5vZmZzZXQ7Ci0JCSAgYS0+Zml4X3NjbmxlbiA9IDA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX2ZpeF9zeW1ib2xfbmFtZSAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHN0cmluZ19zaXplX3AsCi0JCSAgICAgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7Ci0gICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKLXsKLSAgdW5zaWduZWQgaW50IG5hbWVfbGVuZ3RoOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eGVudDsKLSAgY2hhciAqbmFtZSA9IChjaGFyICopIChzeW1ib2wtPm5hbWUpOwotCi0gIGlmIChuYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgLyogY29mZiBzeW1ib2xzIGFsd2F5cyBoYXZlIG5hbWVzLCBzbyB3ZSdsbCBtYWtlIG9uZSB1cCAqLwotICAgICAgc3ltYm9sLT5uYW1lID0gInN0cmFuZ2UiOwotICAgICAgbmFtZSA9IChjaGFyICopIHN5bWJvbC0+bmFtZTsKLSAgICB9Ci0gIG5hbWVfbGVuZ3RoID0gc3RybGVuIChuYW1lKTsKLQotICBpZiAobmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUKLSAgICAgICYmIG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPiAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBmaWxubWxlbjsKLQotICAgICAgc3RybmNweSAobmF0aXZlLT51LnN5bWVudC5fbi5fbl9uYW1lLCAiLmZpbGUiLCBTWU1OTUxFTik7Ci0gICAgICBhdXhlbnQgPSAmKG5hdGl2ZSArIDEpLT51LmF1eGVudDsKLQotICAgICAgZmlsbm1sZW4gPSBiZmRfY29mZl9maWxubWxlbiAoYWJmZCk7Ci0KLSAgICAgIGlmIChiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyAoYWJmZCkpCi0JewotCSAgaWYgKG5hbWVfbGVuZ3RoIDw9IGZpbG5tbGVuKQotCSAgICB7Ci0JICAgICAgc3RybmNweSAoYXV4ZW50LT54X2ZpbGUueF9mbmFtZSwgbmFtZSwgZmlsbm1sZW4pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhdXhlbnQtPnhfZmlsZS54X24ueF9vZmZzZXQgPSAqc3RyaW5nX3NpemVfcCArIFNUUklOR19TSVpFX1NJWkU7Ci0JICAgICAgYXV4ZW50LT54X2ZpbGUueF9uLnhfemVyb2VzID0gMDsKLQkgICAgICAqc3RyaW5nX3NpemVfcCArPSBuYW1lX2xlbmd0aCArIDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RybmNweSAoYXV4ZW50LT54X2ZpbGUueF9mbmFtZSwgbmFtZSwgZmlsbm1sZW4pOwotCSAgaWYgKG5hbWVfbGVuZ3RoID4gZmlsbm1sZW4pCi0JICAgIG5hbWVbZmlsbm1sZW5dID0gJ1wwJzsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG5hbWVfbGVuZ3RoIDw9IFNZTU5NTEVOKQotCXsKLQkgIC8qIFRoaXMgbmFtZSB3aWxsIGZpdCBpbnRvIHRoZSBzeW1ib2wgbmVhdGx5ICovCi0JICBzdHJuY3B5IChuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX25hbWUsIHN5bWJvbC0+bmFtZSwgU1lNTk1MRU4pOwotCX0KLSAgICAgIGVsc2UgaWYgKCFiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIChhYmZkLCAmbmF0aXZlLT51LnN5bWVudCkpCi0JewotCSAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9ICgqc3RyaW5nX3NpemVfcAotCQkJCQkJKyBTVFJJTkdfU0laRV9TSVpFKTsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgKnN0cmluZ19zaXplX3AgKz0gbmFtZV9sZW5ndGggKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGZpbGVwb3M7Ci0JICBiZmRfYnl0ZSBidWZbMl07Ci0KLQkgIC8qIFRoaXMgbmFtZSBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIHRoZSAuZGVidWcgc2VjdGlvbi4gIEZvcgotCSAgICAgc29tZSByZWFzb24gZWFjaCBuYW1lIGlzIHByZWNlZGVkIGJ5IGEgdHdvIGJ5dGUgbGVuZ3RoCi0JICAgICBhbmQgYWxzbyBmb2xsb3dlZCBieSBhIG51bGwgYnl0ZS4gIEZJWE1FOiBXZSBhc3N1bWUgdGhhdAotCSAgICAgdGhlIC5kZWJ1ZyBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kIHRoYXQgaXQKLQkgICAgIGlzIGxhcmdlIGVub3VnaC4gICovCi0JICBpZiAoKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgICpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWciKTsKLQkgIGZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0JICBiZmRfcHV0XzE2IChhYmZkLCBuYW1lX2xlbmd0aCArIDEsIGJ1Zik7Ci0JICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCQkJICpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLAotCQkJCQkgKFBUUikgYnVmLAotCQkJCQkgKGZpbGVfcHRyKSAqZGVidWdfc3RyaW5nX3NpemVfcCwKLQkJCQkJIChiZmRfc2l6ZV90eXBlKSAyKQotCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkJCSAgICAqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQkJCQkJICAgIChQVFIpIHN5bWJvbC0+bmFtZSwKLQkJCQkJICAgICgoZmlsZV9wdHIpICpkZWJ1Z19zdHJpbmdfc2l6ZV9wCi0JCQkJCSAgICAgKyAyKSwKLQkJCQkJICAgIChiZmRfc2l6ZV90eXBlKSBuYW1lX2xlbmd0aCArIDEpKQotCSAgICBhYm9ydCAoKTsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JICAgIGFib3J0ICgpOwotCSAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9ICpkZWJ1Z19zdHJpbmdfc2l6ZV9wICsgMjsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgKmRlYnVnX3N0cmluZ19zaXplX3AgKz0gbmFtZV9sZW5ndGggKyAzOwotCX0KLSAgICB9Ci19Ci0KLS8qIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3ltYm9sIGluZGV4IHNvIHRoYXQgd2hlbiB3ZSB3cml0ZSBvdXQKLSAgIHRoZSByZWxvY3Mgd2UgY2FuIGdldCB0aGUgaW5kZXggZm9yIGEgc3ltYm9sLiAgVGhpcyBtZXRob2QgaXMgYQotICAgaGFjay4gIEZJWE1FLiAgKi8KLQotI2RlZmluZSBzZXRfaW5kZXgoc3ltYm9sLCBpZHgpCSgoc3ltYm9sKS0+dWRhdGEuaSA9IChpZHgpKQotCi0vKiBXcml0ZSBhIHN5bWJvbCBvdXQgdG8gYSBDT0ZGIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl93cml0ZV9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAotCQkgICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotICAgICB1bnNpZ25lZCBpbnQgKndyaXR0ZW47Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7Ci0gICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKLXsKLSAgdW5zaWduZWQgaW50IG51bWF1eCA9IG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXg7Ci0gIGludCB0eXBlID0gbmF0aXZlLT51LnN5bWVudC5uX3R5cGU7Ci0gIGludCBjbGFzcyA9IG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3M7Ci0gIFBUUiBidWY7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotCi0gIGlmIChuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRSkKLSAgICBzeW1ib2wtPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HCi0gICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9ERUJVRzsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX0FCUzsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9Ci0Jc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICBjb2ZmX2ZpeF9zeW1ib2xfbmFtZSAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHN0cmluZ19zaXplX3AsCi0JCQlkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBidWYgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWVzeik7Ci0gIGlmICghYnVmKQotICAgIHJldHVybiBmYWxzZTsKLSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAmbmF0aXZlLT51LnN5bWVudCwgYnVmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCBzeW1lc3osIGFiZmQpICE9IHN5bWVzeikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCBidWYpOwotCi0gIGlmIChuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGF1eGVzejsKLSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICBhdXhlc3ogPSBiZmRfY29mZl9hdXhlc3ogKGFiZmQpOwotICAgICAgYnVmID0gYmZkX2FsbG9jIChhYmZkLCBhdXhlc3opOwotICAgICAgaWYgKCFidWYpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm9yIChqID0gMDsgaiA8IG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXg7IGorKykKLQl7Ci0JICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKGFiZmQsCi0JCQkJICYoKG5hdGl2ZSArIGogKyAxKS0+dS5hdXhlbnQpLAotCQkJCSB0eXBlLAotCQkJCSBjbGFzcywKLQkJCQkgaiwKLQkJCQkgbmF0aXZlLT51LnN5bWVudC5uX251bWF1eCwKLQkJCQkgYnVmKTsKLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgYXV4ZXN6LCBhYmZkKSAhPSBhdXhlc3opCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYnVmKTsKLSAgICB9Ci0KLSAgLyogU3RvcmUgdGhlIGluZGV4IGZvciB1c2Ugd2hlbiB3ZSB3cml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0gIHNldF9pbmRleCAoc3ltYm9sLCAqd3JpdHRlbik7Ci0KLSAgKndyaXR0ZW4gKz0gbnVtYXV4ICsgMTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN5bWJvbCB0byBhIENPRkYgZmlsZSB0aGF0IGRvZXMgbm90IGNvbWUgZnJvbSBhIENPRkYKLSAgIGZpbGUgb3JpZ2luYWxseS4gIFRoaXMgc3ltYm9sIG1heSBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgbGlua2VyLAotICAgb3Igd2UgbWF5IGJlIGxpbmtpbmcgYSBub24gQ09GRiBmaWxlIHRvIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sIChhYmZkLCBzeW1ib2wsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCi0JCQkgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCAqd3JpdHRlbjsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKLSAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOwotICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgZHVtbXk7Ci0KLSAgbmF0aXZlID0gJmR1bW15OwotICBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSA9IFRfTlVMTDsKLSAgbmF0aXZlLT51LnN5bWVudC5uX2ZsYWdzID0gMDsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGlzbid0IG11Y2ggcG9pbnQgdG8gd3JpdGluZyBvdXQgYSBkZWJ1Z2dpbmcgc3ltYm9sCi0gICAgICAgICB1bmxlc3Mgd2UgYXJlIHByZXBhcmVkIHRvIGNvbnZlcnQgaXQgaW50byBDT0ZGIGRlYnVnZ2luZwotICAgICAgICAgZm9ybWF0LiAgU28sIHdlIGp1c3QgaWdub3JlIHRoZW0uICBXZSBtdXN0IGNsb2JiZXIgdGhlIHN5bWJvbAotICAgICAgICAgbmFtZSB0byBrZWVwIGl0IGZyb20gYmVpbmcgcHV0IGluIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICAgICAgc3ltYm9sLT5uYW1lID0gIiI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPQotCXN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IChzeW1ib2wtPnZhbHVlCi0JCQkJICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoISBvYmpfcGUgKGFiZmQpKQotCW5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIC8qIENvcHkgdGhlIGFueSBmbGFncyBmcm9tIHRoZSB0aGUgZmlsZSBoZWFkZXIgaW50byB0aGUgc3ltYm9sLgotICAgICAgICAgRklYTUU6IFdoeT8gICovCi0gICAgICB7Ci0JY29mZl9zeW1ib2xfdHlwZSAqYyA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0JaWYgKGMgIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCkKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IGJmZF9hc3ltYm9sX2JmZCAoJmMtPnN5bWJvbCktPmZsYWdzOwotICAgICAgfQotICAgIH0KLQotICBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSA9IDA7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0xPQ0FMKQotICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykKLSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gb2JqX3BlIChhYmZkKSA/IENfTlRfV0VBSyA6IENfV0VBS0VYVDsKLSAgZWxzZQotICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBDX0VYVDsKLSAgbmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA9IDA7Ci0KLSAgcmV0dXJuIGNvZmZfd3JpdGVfc3ltYm9sIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJCSAgICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKTsKLX0KLQotLyogV3JpdGUgYSBuYXRpdmUgc3ltYm9sIHRvIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAotCQkJICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvZmZfc3ltYm9sX3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50ICp3cml0dGVuOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZSA9IHN5bWJvbC0+bmF0aXZlOwotICBhbGVudCAqbGluZW5vID0gc3ltYm9sLT5saW5lbm87Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaGFzIGFuIGFzc29jaWF0ZWQgbGluZSBudW1iZXIsIHdlIG11c3Qgc3RvcmUgdGhlCi0gICAgIHN5bWJvbCBpbmRleCBpbiB0aGUgbGluZSBudW1iZXIgZmllbGQuICBXZSBhbHNvIHRhZyB0aGUgYXV4ZW50IHRvCi0gICAgIHBvaW50IHRvIHRoZSByaWdodCBwbGFjZSBpbiB0aGUgbGluZW5vIHRhYmxlLiAgKi8KLSAgaWYgKGxpbmVubyAmJiAhc3ltYm9sLT5kb25lX2xpbmVubyAmJiBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vd25lciAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0gICAgICBsaW5lbm9bY291bnRdLnUub2Zmc2V0ID0gKndyaXR0ZW47Ci0gICAgICBpZiAobmF0aXZlLT51LnN5bWVudC5uX251bWF1eCkKLQl7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmEgPSAmKChuYXRpdmUgKyAxKS0+dS5hdXhlbnQpOwotCi0JICBhLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPQotCSAgICBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bW92aW5nX2xpbmVfZmlsZXBvczsKLQl9Ci0KLSAgICAgIC8qIENvdW50IGFuZCByZWxvY2F0ZSBhbGwgb3RoZXIgbGluZW51bWJlcnMuICAqLwotICAgICAgY291bnQrKzsKLSAgICAgIHdoaWxlIChsaW5lbm9bY291bnRdLmxpbmVfbnVtYmVyICE9IDApCi0JewotI2lmIDAKLQkgIC8qIDEzIGFwcmlsIDkyLiBzYWMgCi0JICAgICBJJ3ZlIGJlZW4gdG9sZCB0aGlzLCBidXQgc3RpbGwgbmVlZCBwcm9vZjoKLQkgICAgID4gVGhlIHNlY29uZCBidWcgaXMgYWxzbyBpbiBgYmZkL2NvZmZjb2RlLmgnLiAgVGhpcyBidWcKLQkgICAgID4gY2F1c2VzIHRoZSBsaW5rZXIgdG8gc2NyZXcgdXAgdGhlIHBjLXJlbG9jYXRpb25zIGZvcgotCSAgICAgPiBhbGwgdGhlIGxpbmUgbnVtYmVycyBpbiBDT0ZGIGNvZGUuICBUaGlzIGJ1ZyBpc24ndCBvbmx5Ci0JICAgICA+IHNwZWNpZmljIHRvIEEyOUsgaW1wbGVtZW50YXRpb25zLCBidXQgYWZmZWN0cyBhbGwKLQkgICAgID4gc3lzdGVtcyB1c2luZyBDT0ZGIGZvcm1hdCBiaW5hcmllcy4gIE5vdGUgdGhhdCBpbiBDT0ZGCi0JICAgICA+IG9iamVjdCBmaWxlcywgdGhlIGxpbmUgbnVtYmVyIGNvcmUgb2Zmc2V0cyBvdXRwdXQgYnkKLQkgICAgID4gdGhlIGFzc2VtYmxlciBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIGVhY2gKLQkgICAgID4gcHJvY2VkdXJlLCBub3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhpcwotCSAgICAgPiBwYXRjaCByZWxvY2F0ZXMgdGhlIGxpbmUgbnVtYmVycyByZWxhdGl2ZSB0byB0aGUKLQkgICAgID4gYG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZScgaW5zdGVhZCBvZiB0aGUgc2VjdGlvbgotCSAgICAgPiB2aXJ0dWFsIGFkZHJlc3MuCi0JICAgICA+IG1vZHVsYXIhb2xzb25AY3MuYXJpem9uYS5lZHUgKEpvbiBPbHNvbikKLQkgICAqLwotCSAgbGluZW5vW2NvdW50XS51Lm9mZnNldCArPSBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCSAgbGluZW5vW2NvdW50XS51Lm9mZnNldCArPQotCSAgICAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgKyBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCSAgY291bnQrKzsKLQl9Ci0gICAgICBzeW1ib2wtPmRvbmVfbGluZW5vID0gdHJ1ZTsKLQotICAgICAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm1vdmluZ19saW5lX2ZpbGVwb3MgKz0KLQljb3VudCAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gICAgfQotCi0gIHJldHVybiBjb2ZmX3dyaXRlX3N5bWJvbCAoYWJmZCwgJihzeW1ib2wtPnN5bWJvbCksIG5hdGl2ZSwgd3JpdHRlbiwKLQkJCSAgICBzdHJpbmdfc2l6ZV9wLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLAotCQkJICAgIGRlYnVnX3N0cmluZ19zaXplX3ApOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIENPRkYgc3ltYm9scy4gICovCi0KLWJvb2xlYW4KLWNvZmZfd3JpdGVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfc2l6ZV90eXBlIHN0cmluZ19zaXplOwotICBhc2VjdGlvbiAqZGVidWdfc3RyaW5nX3NlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgZGVidWdfc3RyaW5nX3NpemU7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgbGltaXQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgdW5zaWduZWQgaW50IHdyaXR0ZW4gPSAwOwotICBhc3ltYm9sICoqcDsKLQotICBzdHJpbmdfc2l6ZSA9IDA7Ci0gIGRlYnVnX3N0cmluZ19zZWN0aW9uID0gTlVMTDsKLSAgZGVidWdfc3RyaW5nX3NpemUgPSAwOwotCi0gIC8qIElmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIGxvbmcgc2VjdGlvbiBuYW1lcywgdGhleSBtdXN0IGJlIHB1dCBpbnRvCi0gICAgIHRoZSBzdHJpbmcgdGFibGUuICBUaGlzIGlzIHN1cHBvcnRlZCBieSBQRS4gIFRoaXMgY29kZSBtdXN0Ci0gICAgIGhhbmRsZSBzZWN0aW9uIG5hbWVzIGp1c3QgYXMgdGhleSBhcmUgaGFuZGxlZCBpbgotICAgICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cy4gICovCi0gIGlmIChiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgKGFiZmQpKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpvOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzaXplX3QgbGVuOwotCi0JICBsZW4gPSBzdHJsZW4gKG8tPm5hbWUpOwotCSAgaWYgKGxlbiA+IFNDTk5NTEVOKQotCSAgICBzdHJpbmdfc2l6ZSArPSBsZW4gKyAxOwotCX0KLSAgICB9Ci0KLSAgLyogU2VlayB0byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT3V0cHV0IGFsbCB0aGUgc3ltYm9scyB3ZSBoYXZlICovCi0KLSAgd3JpdHRlbiA9IDA7Ci0gIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHMsIGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgcCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bWJvbCA9ICpwOwotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY19zeW1ib2wgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotCi0gICAgICBpZiAoY19zeW1ib2wgPT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAotCSAgfHwgY19zeW1ib2wtPm5hdGl2ZSA9PSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBOVUxMKQotCXsKLQkgIGlmICghY29mZl93cml0ZV9hbGllbl9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgJndyaXR0ZW4sICZzdHJpbmdfc2l6ZSwKLQkJCQkJJmRlYnVnX3N0cmluZ19zZWN0aW9uLAotCQkJCQkmZGVidWdfc3RyaW5nX3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sIChhYmZkLCBjX3N5bWJvbCwgJndyaXR0ZW4sCi0JCQkJCSAmc3RyaW5nX3NpemUsICZkZWJ1Z19zdHJpbmdfc2VjdGlvbiwKLQkJCQkJICZkZWJ1Z19zdHJpbmdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9IHdyaXR0ZW47Ci0KLSAgLyogTm93IHdyaXRlIG91dCBzdHJpbmdzICovCi0KLSAgaWYgKHN0cmluZ19zaXplICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBzdHJpbmdfc2l6ZSArIFNUUklOR19TSVpFX1NJWkU7Ci0gICAgICBiZmRfYnl0ZSBidWZmZXJbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgc2l6ZSwgYnVmZmVyKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpICE9IHNpemVvZiAoYnVmZmVyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuICBUaGlzIGNvZGUgbXVzdCBoYW5kbGUgc2VjdGlvbgotCSBuYW1lcyBqdXN0IGFzIHRoZXkgYXJlIGhhbmRsZWQgaW4gY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuICAqLwotICAgICAgaWYgKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyAoYWJmZCkpCi0JewotCSAgYXNlY3Rpb24gKm87Ci0KLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoby0+bmFtZSk7Ci0JICAgICAgaWYgKGxlbiA+IFNDTk5NTEVOKQotCQl7Ci0JCSAgaWYgKGJmZF93cml0ZSAoby0+bmFtZSwgMSwgbGVuICsgMSwgYWJmZCkgIT0gbGVuICsgMSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBmb3IgKHAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsKLQkgICBpIDwgbGltaXQ7Ci0JICAgaSsrLCBwKyspCi0JewotCSAgYXN5bWJvbCAqcSA9ICpwOwotCSAgc2l6ZV90IG5hbWVfbGVuZ3RoID0gc3RybGVuIChxLT5uYW1lKTsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKmNfc3ltYm9sID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcSk7Ci0JICBzaXplX3QgbWF4bGVuOwotCi0JICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHN5bWJvbCBuYW1lIHNob3VsZCBnbyBpbiB0aGUgc3RyaW5nCi0JICAgICB0YWJsZS4gIFN5bWJvbCBuYW1lcyB0aGF0IGFyZSBzaG9ydCBlbm91Z2ggYXJlIHN0b3JlZAotCSAgICAgZGlyZWN0bHkgaW4gdGhlIHN5bWVudCBzdHJ1Y3R1cmUuICBGaWxlIG5hbWVzIHBlcm1pdCBhCi0JICAgICBkaWZmZXJlbnQsIGxvbmdlciwgbGVuZ3RoIGluIHRoZSBzeW1lbnQgc3RydWN0dXJlLiAgT24KLQkgICAgIFhDT0ZGLCBzb21lIHN5bWJvbCBuYW1lcyBhcmUgc3RvcmVkIGluIHRoZSAuZGVidWcgc2VjdGlvbgotCSAgICAgcmF0aGVyIHRoYW4gaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0KLQkgIGlmIChjX3N5bWJvbCA9PSBOVUxMCi0JICAgICAgfHwgY19zeW1ib2wtPm5hdGl2ZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBub3QgYSBDT0ZGIHN5bWJvbCwgc28gaXQgY2VydGFpbmx5IGlzIG5vdCBhCi0JICAgICAgICAgZmlsZSBuYW1lLCBub3IgZG9lcyBpdCBnbyBpbiB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotCSAgICAgIG1heGxlbiA9IFNZTU5NTEVOOwotCSAgICB9Ci0JICBlbHNlIGlmIChiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIChhYmZkLAotCQkJCQkgICAgICAmY19zeW1ib2wtPm5hdGl2ZS0+dS5zeW1lbnQpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgbmFtZSBpcyBpbiB0aGUgWENPRkYgLmRlYnVnIHNlY3Rpb24uCi0JICAgICAgICAgRG9uJ3Qgd3JpdGUgaXQgaW50byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgICAgICBtYXhsZW4gPSBuYW1lX2xlbmd0aDsKLQkgICAgfQotCSAgZWxzZSBpZiAoY19zeW1ib2wtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFCi0JCSAgICYmIGNfc3ltYm9sLT5uYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkgICAgbWF4bGVuID0gYmZkX2NvZmZfZmlsbm1sZW4gKGFiZmQpOwotCSAgZWxzZQotCSAgICBtYXhsZW4gPSBTWU1OTUxFTjsKLQotCSAgaWYgKG5hbWVfbGVuZ3RoID4gbWF4bGVuKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgKHEtPm5hbWUpLCAxLCBuYW1lX2xlbmd0aCArIDEsIGFiZmQpCi0JCSAgIT0gbmFtZV9sZW5ndGggKyAxKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2Ugd291bGQgbm9ybWFsbHkgbm90IHdyaXRlIGFueXRoaW5nIGhlcmUsIGJ1dCB3ZSdsbCB3cml0ZQotICAgICAgICAgb3V0IDQgc28gdGhhdCBhbnkgc3R1cGlkIGNvZmYgcmVhZGVyIHdoaWNoIHRyaWVzIHRvIHJlYWQgdGhlCi0gICAgICAgICBzdHJpbmcgdGFibGUgZXZlbiB3aGVuIHRoZXJlIGlzbid0IG9uZSB3b24ndCBjcm9hay4gICovCi0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IFNUUklOR19TSVpFX1NJWkU7Ci0gICAgICBiZmRfYnl0ZSBidWZmZXJbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgc2l6ZSwgYnVmZmVyKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCBTVFJJTkdfU0laRV9TSVpFLCBhYmZkKQotCSAgIT0gU1RSSU5HX1NJWkVfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgLmRlYnVnIHNlY3Rpb24gd2FzIGNyZWF0ZWQgdG8gYmUgdGhlIGNvcnJlY3Qgc2l6ZS4KLSAgICAgV2Ugc2hvdWxkIGNyZWF0ZSBpdCBvdXJzZWx2ZXMgb24gdGhlIGZseSwgYnV0IHdlIGRvbid0IGJlY2F1c2UKLSAgICAgQkZEIHdvbid0IGxldCB1cyB3cml0ZSB0byBhbnkgc2VjdGlvbiB1bnRpbCB3ZSBrbm93IGhvdyBsYXJnZSBhbGwKLSAgICAgdGhlIHNlY3Rpb25zIGFyZS4gIFdlIGNvdWxkIHN0aWxsIGRvIGl0IGJ5IG1ha2luZyBhbm90aGVyIHBhc3MKLSAgICAgb3ZlciB0aGUgc3ltYm9scy4gIEZJWE1FLiAgKi8KLSAgQkZEX0FTU0VSVCAoZGVidWdfc3RyaW5nX3NpemUgPT0gMAotCSAgICAgIHx8IChkZWJ1Z19zdHJpbmdfc2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTAotCQkgICYmIChCRkRfQUxJR04gKGRlYnVnX3N0cmluZ19zaXplLAotCQkJCSAxIDw8IGRlYnVnX3N0cmluZ19zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpCi0JCSAgICAgID09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRlYnVnX3N0cmluZ19zZWN0aW9uKSkpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotY29mZl93cml0ZV9saW5lbnVtYmVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIFBUUiBidWZmOwotCi0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIGJ1ZmYgPSBiZmRfYWxsb2MgKGFiZmQsIGxpbmVzeik7Ci0gIGlmICghYnVmZikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAocy0+bGluZW5vX2NvdW50KQotCXsKLQkgIGFzeW1ib2wgKipxID0gYWJmZC0+b3V0c3ltYm9sczsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgcy0+bGluZV9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRmluZCBhbGwgdGhlIGxpbmVudW1iZXJzIGluIHRoaXMgc2VjdGlvbiAqLwotCSAgd2hpbGUgKCpxKQotCSAgICB7Ci0JICAgICAgYXN5bWJvbCAqcCA9ICpxOwotCSAgICAgIGlmIChwLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBzKQotCQl7Ci0JCSAgYWxlbnQgKmwgPQotCQkgIEJGRF9TRU5EIChiZmRfYXN5bWJvbF9iZmQgKHApLCBfZ2V0X2xpbmVubywKLQkJCSAgICAoYmZkX2FzeW1ib2xfYmZkIChwKSwgcCkpOwotCQkgIGlmIChsKQotCQkgICAgewotCQkgICAgICAvKiBGb3VuZCBhIGxpbmVudW1iZXIgZW50cnksIG91dHB1dCAqLwotCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIG91dDsKLQkJICAgICAgbWVtc2V0ICgoUFRSKSAmIG91dCwgMCwgc2l6ZW9mIChvdXQpKTsKLQkJICAgICAgb3V0LmxfbG5ubyA9IDA7Ci0JCSAgICAgIG91dC5sX2FkZHIubF9zeW1uZHggPSBsLT51Lm9mZnNldDsKLQkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0IChhYmZkLCAmb3V0LCBidWZmKTsKLQkJICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgbGluZXN6LCBhYmZkKSAhPSBsaW5lc3opCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGwrKzsKLQkJICAgICAgd2hpbGUgKGwtPmxpbmVfbnVtYmVyKQotCQkJewotCQkJICBvdXQubF9sbm5vID0gbC0+bGluZV9udW1iZXI7Ci0JCQkgIG91dC5sX2FkZHIubF9zeW1uZHggPSBsLT51Lm9mZnNldDsKLQkJCSAgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0IChhYmZkLCAmb3V0LCBidWZmKTsKLQkJCSAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgbGluZXN6LCBhYmZkKSAhPSBsaW5lc3opCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICBsKys7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBxKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBiZmRfcmVsZWFzZSAoYWJmZCwgYnVmZik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKkFSR1NVU0VEICovCi1hbGVudCAqCi1jb2ZmX2dldF9saW5lbm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICByZXR1cm4gY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzLCB3aGljaCBoYXMgYmVlbgotICAgZGlzYWJsZWQuICAqLwotCi1hc3ltYm9sICoKLWNvZmZfc2VjdGlvbl9zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgbmFtZSk7Ci0gIGFzeW1ib2wgKnN5bTsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqY3N5bTsKLQotICBzeW0gPSBzZWMtPnN5bWJvbDsKLSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bSktPm5hdGl2ZTsKLSAgLyogTWFrZSBzdXJlIGJhY2stZW5kIENPRkYgc3R1ZmYgaXMgdGhlcmUuICAqLwotICBpZiAoY3N5bSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBmb28KLQl7Ci0JICBjb2ZmX3N5bWJvbF90eXBlIHN5bTsKLQkgIC8qIEBARklYTUUgVGhpcyBzaG91bGRuJ3QgdXNlIGEgZml4ZWQgc2l6ZSEhICAqLwotCSAgY29tYmluZWRfZW50cnlfdHlwZSBlWzEwXTsKLQl9OwotICAgICAgc3RydWN0IGZvbyAqZjsKLSAgICAgIGYgPSAoc3RydWN0IGZvbyAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKmYpKTsKLSAgICAgIGlmICghZikKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgbWVtc2V0ICgoY2hhciAqKSBmLCAwLCBzaXplb2YgKCpmKSk7Ci0gICAgICBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW0pLT5uYXRpdmUgPSBjc3ltID0gZi0+ZTsKLSAgICB9Ci0gIGNzeW1bMF0udS5zeW1lbnQubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gIGNzeW1bMF0udS5zeW1lbnQubl9udW1hdXggPSAxOwotLyogIFNGX1NFVF9TVEFUSUNTIChzeW0pOyAgICAgICBAQCA/Pz8gKi8KLSAgY3N5bVsxXS51LmF1eGVudC54X3Njbi54X3NjbmxlbiA9IHNlYy0+X3Jhd19zaXplOwotICBjc3ltWzFdLnUuYXV4ZW50Lnhfc2NuLnhfbnJlbG9jID0gc2VjLT5yZWxvY19jb3VudDsKLSAgY3N5bVsxXS51LmF1eGVudC54X3Njbi54X25saW5ubyA9IHNlYy0+bGluZW5vX2NvdW50OwotCi0gIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNlYzsKLSAgICAgIHNlYy0+b3V0cHV0X29mZnNldCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiBzeW07Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgb2Zmc2V0cyBpbnRvIHRoZSBzeW1ib2wgdGFibGUgaW50bwotICAgcG9pbnRlcnMgdG8gc3ltZW50cy4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3BvaW50ZXJpemVfYXV4IChhYmZkLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGluZGF1eCwgYXV4ZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2U7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4ZW50OwotewotICB1bnNpZ25lZCBpbnQgdHlwZSA9IHN5bWJvbC0+dS5zeW1lbnQubl90eXBlOwotICB1bnNpZ25lZCBpbnQgY2xhc3MgPSBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzOwotCi0gIGlmIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKQotICAgIHsKLSAgICAgIGlmICgoKmNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spCi0JICAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eGVudCkpCi0JcmV0dXJuOwotICAgIH0KLQotICAvKiBEb24ndCBib3RoZXIgaWYgdGhpcyBpcyBhIGZpbGUgb3IgYSBzZWN0aW9uICovCi0gIGlmIChjbGFzcyA9PSBDX1NUQVQgJiYgdHlwZSA9PSBUX05VTEwpCi0gICAgcmV0dXJuOwotICBpZiAoY2xhc3MgPT0gQ19GSUxFKQotICAgIHJldHVybjsKLQotICAvKiBPdGhlcndpc2UgcGF0Y2ggdXAgKi8KLSNkZWZpbmUgTl9UTUFTSyBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX3RtYXNrCi0jZGVmaW5lIE5fQlRTSEZUIGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0Ci0gIGlmICgoSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykgfHwgY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTikKLSAgICAgICYmIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA+IDApCi0gICAgewotICAgICAgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wID0KLQl0YWJsZV9iYXNlICsgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotICAgICAgYXV4ZW50LT5maXhfZW5kID0gMTsKLSAgICB9Ci0gIC8qIEEgbmVnYXRpdmUgdGFnbmR4IGlzIG1lYW5pbmdsZXNzLCBidXQgdGhlIFNDTyAzLjJ2NCBjYyBjYW4KLSAgICAgZ2VuZXJhdGUgb25lLCBzbyB3ZSBtdXN0IGJlIGNhcmVmdWwgdG8gaWdub3JlIGl0LiAgKi8KLSAgaWYgKGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubCA+IDApCi0gICAgewotICAgICAgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wID0KLQl0YWJsZV9iYXNlICsgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X3RhZ25keC5sOwotICAgICAgYXV4ZW50LT5maXhfdGFnID0gMTsKLSAgICB9Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgIi5kZWJ1ZyIgc2VjdGlvbiwgYW5kIHJlYWQgaXQuCi0gICBXZSBkaWQgbm90IHJlYWQgdGhlIGRlYnVnIHNlY3Rpb24gdW50aWwgbm93LCBiZWNhdXNlCi0gICB3ZSBkaWRuJ3Qgd2FudCB0byBnbyB0byB0aGUgdHJvdWJsZSB1bnRpbCBzb21lb25lIG5lZWRlZCBpdC4gKi8KLQotc3RhdGljIGNoYXIgKgotYnVpbGRfZGVidWdfc2VjdGlvbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpkZWJ1Z19zZWN0aW9uOwotICBsb25nIHBvc2l0aW9uOwotCi0gIGFzZWN0aW9uICpzZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWciKTsKLQotICBpZiAoIXNlY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2RlYnVnX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGRlYnVnX3NlY3Rpb24gPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KSk7Ci0gIGlmIChkZWJ1Z19zZWN0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBgLmRlYnVnJyBzZWN0aW9uIGFuZCByZWFkIGl0LiAKLSAgICAgU2F2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBmaXJzdDsgaXQgaXMgbmVlZGVkIGJ5IG91ciBjYWxsZXIuCi0gICAgIFRoZW4gcmVhZCBkZWJ1ZyBzZWN0aW9uIGFuZCByZXNldCB0aGUgZmlsZSBwb2ludGVyLiAgKi8KLQotICBwb3NpdGlvbiA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0LT5maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChkZWJ1Z19zZWN0aW9uLAotCQkgICAgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KSwgMSwgYWJmZCkKLQkgICE9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCkpCi0gICAgICB8fCBiZmRfc2VlayAoYWJmZCwgcG9zaXRpb24sIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gZGVidWdfc2VjdGlvbjsKLX0KLQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbWFsbG9jJ2QgY29weSBvZiAnbmFtZScuICAnbmFtZScgbWF5IG5vdCBiZQotICAgXDAtdGVybWluYXRlZCwgYnV0IHdpbGwgbm90IGV4Y2VlZCAnbWF4bGVuJyBjaGFyYWN0ZXJzLiAgVGhlIGNvcHkgKndpbGwqCi0gICBiZSBcMC10ZXJtaW5hdGVkLiAgKi8KLXN0YXRpYyBjaGFyICoKLWNvcHlfbmFtZSAoYWJmZCwgbmFtZSwgbWF4bGVuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBtYXhsZW47Ci17Ci0gIGludCBsZW47Ci0gIGNoYXIgKm5ld25hbWU7Ci0KLSAgZm9yIChsZW4gPSAwOyBsZW4gPCBtYXhsZW47ICsrbGVuKQotICAgIHsKLSAgICAgIGlmIChuYW1lW2xlbl0gPT0gJ1wwJykKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmICgobmV3bmFtZSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSkpID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgc3RybmNweSAobmV3bmFtZSwgbmFtZSwgbGVuKTsKLSAgbmV3bmFtZVtsZW5dID0gJ1wwJzsKLSAgcmV0dXJuIG5ld25hbWU7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHNpemVfdCBzaXplOwotICBQVFIgc3ltczsKLQotICBpZiAob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotCi0gIHNpemUgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0KLSAgc3ltcyA9IChQVFIpIGJmZF9tYWxsb2MgKHNpemUpOwotICBpZiAoc3ltcyA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKHN5bXMsIHNpemUsIDEsIGFiZmQpICE9IHNpemUpCi0gICAgewotICAgICAgaWYgKHN5bXMgIT0gTlVMTCkKLQlmcmVlIChzeW1zKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBzeW1zOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzdHJpbmdzLiAgVGhlIHN0cmluZ3MgYXJlIG5vdCBsb2FkZWQgdW50aWwKLSAgIHRoZXkgYXJlIG5lZWRlZC4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBoYXZlIG5vIHNpbXBsZSB3YXkgb2YKLSAgIGRldGVjdGluZyBhIG1pc3Npbmcgc3RyaW5nIHRhYmxlIGluIGFuIGFyY2hpdmUuICAqLwotCi1jb25zdCBjaGFyICoKLV9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIGV4dHN0cnNpemVbU1RSSU5HX1NJWkVfU0laRV07Ci0gIHNpemVfdCBzdHJzaXplOwotICBjaGFyICpzdHJpbmdzOwotCi0gIGlmIChvYmpfY29mZl9zdHJpbmdzIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiBvYmpfY29mZl9zdHJpbmdzIChhYmZkKTsKLQotICBpZiAob2JqX3N5bV9maWxlcG9zIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpLAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgICAKLSAgaWYgKGJmZF9yZWFkIChleHRzdHJzaXplLCBzaXplb2YgZXh0c3Ryc2l6ZSwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dHN0cnNpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKQotCXJldHVybiBOVUxMOwotCi0gICAgICAvKiBUaGVyZSBpcyBubyBzdHJpbmcgdGFibGUuICAqLwotICAgICAgc3Ryc2l6ZSA9IFNUUklOR19TSVpFX1NJWkU7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgc3Ryc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dHN0cnNpemUpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX2dldF8zMgotI2VuZGlmCi0gICAgfQotCi0gIGlmIChzdHJzaXplIDwgU1RSSU5HX1NJWkVfU0laRSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGJhZCBzdHJpbmcgdGFibGUgc2l6ZSAlbHUiKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JICh1bnNpZ25lZCBsb25nKSBzdHJzaXplKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN0cmluZ3MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJzaXplKTsKLSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYmZkX3JlYWQgKHN0cmluZ3MgKyBTVFJJTkdfU0laRV9TSVpFLAotCQlzdHJzaXplIC0gU1RSSU5HX1NJWkVfU0laRSwgMSwgYWJmZCkKLSAgICAgICE9IHN0cnNpemUgLSBTVFJJTkdfU0laRV9TSVpFKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZ3MpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpID0gc3RyaW5nczsKLQotICByZXR1cm4gc3RyaW5nczsKLX0KLQotLyogRnJlZSB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhbmQgc3RyaW5ncyByZWFkIGZyb20gYSBDT0ZGIGZpbGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSBOVUxMCi0gICAgICAmJiAhIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkpCi0gICAgewotICAgICAgZnJlZSAob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotICAgICAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOwotICAgIH0KLSAgaWYgKG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpICE9IE5VTEwKLSAgICAgICYmICEgb2JqX2NvZmZfa2VlcF9zdHJpbmdzIChhYmZkKSkKLSAgICB7Ci0gICAgICBmcmVlIChvYmpfY29mZl9zdHJpbmdzIChhYmZkKSk7Ci0gICAgICBvYmpfY29mZl9zdHJpbmdzIChhYmZkKSA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIHN5bWJvbCB0YWJsZSBpbnRvIGZyZXNobHkgYmZkX2FsbG9jYXRlZCBtZW1vcnksIHN3YXAgaXQsIGFuZAotICAga25pdCB0aGUgc3ltYm9sIG5hbWVzIGludG8gYSBub3JtYWxpemVkIGZvcm0uICBCeSBub3JtYWxpemVkIGhlcmUgSQotICAgbWVhbiB0aGF0IGFsbCBzeW1ib2xzIGhhdmUgYW4gbl9vZmZzZXQgcG9pbnRlciB0aGF0IHBvaW50cyB0byBhIG51bGwtCi0gICB0ZXJtaW5hdGVkIHN0cmluZy4gICovCi0KLWNvbWJpbmVkX2VudHJ5X3R5cGUgKgotY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqaW50ZXJuYWw7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsX3B0cjsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sX3B0cjsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqaW50ZXJuYWxfZW5kOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgY2hhciAqcmF3X3NyYzsKLSAgY2hhciAqcmF3X2VuZDsKLSAgY29uc3QgY2hhciAqc3RyaW5nX3RhYmxlID0gTlVMTDsKLSAgY2hhciAqZGVidWdfc2VjdGlvbiA9IE5VTEw7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotICBpZiAob2JqX3Jhd19zeW1lbnRzIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiBvYmpfcmF3X3N5bWVudHMgKGFiZmQpOwotCi0gIHNpemUgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzaXplb2YgKGNvbWJpbmVkX2VudHJ5X3R5cGUpOwotICBpbnRlcm5hbCA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoaW50ZXJuYWwgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGludGVybmFsX2VuZCA9IGludGVybmFsICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotCi0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmF3X3NyYyA9IChjaGFyICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotCi0gIC8qIG1hcmsgdGhlIGVuZCBvZiB0aGUgc3ltYm9scyAqLwotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICByYXdfZW5kID0gKGNoYXIgKikgcmF3X3NyYyArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKLQotICAvKiBGSVhNRSBTT01FREFZLiAgQSBzdHJpbmcgdGFibGUgc2l6ZSBvZiB6ZXJvIGlzIHZlcnkgd2VpcmQsIGJ1dAotICAgICBwcm9iYWJseSBwb3NzaWJsZS4gIElmIG9uZSBzaG93cyB1cCwgaXQgd2lsbCBwcm9iYWJseSBraWxsIHVzLiAgKi8KLQotICAvKiBTd2FwIGFsbCB0aGUgcmF3IGVudHJpZXMgKi8KLSAgZm9yIChpbnRlcm5hbF9wdHIgPSBpbnRlcm5hbDsKLSAgICAgICByYXdfc3JjIDwgcmF3X2VuZDsKLSAgICAgICByYXdfc3JjICs9IHN5bWVzeiwgaW50ZXJuYWxfcHRyKyspCi0gICAgewotCi0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSByYXdfc3JjLAotCQkJICAgIChQVFIpICYgaW50ZXJuYWxfcHRyLT51LnN5bWVudCk7Ci0gICAgICBzeW1ib2xfcHRyID0gaW50ZXJuYWxfcHRyOwotCi0gICAgICBmb3IgKGkgPSAwOwotCSAgIGkgPCBzeW1ib2xfcHRyLT51LnN5bWVudC5uX251bWF1eDsKLQkgICBpKyspCi0JewotCSAgaW50ZXJuYWxfcHRyKys7Ci0JICByYXdfc3JjICs9IHN5bWVzejsKLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSByYXdfc3JjLAotCQkJCXN5bWJvbF9wdHItPnUuc3ltZW50Lm5fdHlwZSwKLQkJCQlzeW1ib2xfcHRyLT51LnN5bWVudC5uX3NjbGFzcywKLQkJCQlpLCBzeW1ib2xfcHRyLT51LnN5bWVudC5uX251bWF1eCwKLQkJCQkmKGludGVybmFsX3B0ci0+dS5hdXhlbnQpKTsKLQkgIGNvZmZfcG9pbnRlcml6ZV9hdXggKGFiZmQsIGludGVybmFsLCBzeW1ib2xfcHRyLCBpLAotCQkJICAgICAgIGludGVybmFsX3B0cik7Ci0JfQotICAgIH0KLQotICAvKiBGcmVlIHRoZSByYXcgc3ltYm9scywgYnV0IG5vdCB0aGUgc3RyaW5ncyAoaWYgd2UgaGF2ZSB0aGVtKS4gICovCi0gIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyAoYWJmZCkgPSB0cnVlOwotICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKGludGVybmFsX3B0ciA9IGludGVybmFsOyBpbnRlcm5hbF9wdHIgPCBpbnRlcm5hbF9lbmQ7Ci0gICAgICAgaW50ZXJuYWxfcHRyKyspCi0gICAgewotICAgICAgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFCi0JICAmJiBpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQl7Ci0JICAvKiBtYWtlIGEgZmlsZSBzeW1ib2wgcG9pbnQgdG8gdGhlIG5hbWUgaW4gdGhlIGF1eGVudCwgc2luY2UKLQkgICAgIHRoZSB0ZXh0ICIuZmlsZSIgaXMgcmVkdW5kYW50ICovCi0JICBpZiAoKGludGVybmFsX3B0ciArIDEpLT51LmF1eGVudC54X2ZpbGUueF9uLnhfemVyb2VzID09IDApCi0JICAgIHsKLQkgICAgICAvKiB0aGUgZmlsZW5hbWUgaXMgYSBsb25nIG9uZSwgcG9pbnQgaW50byB0aGUgc3RyaW5nIHRhYmxlICovCi0JICAgICAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQl7Ci0JCSAgc3RyaW5nX3RhYmxlID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKTsKLQkJICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCi0JCSAgICByZXR1cm4gTlVMTDsKLQkJfQotCi0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9Ci0JCSgobG9uZykKLQkJIChzdHJpbmdfdGFibGUKLQkJICArIChpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfbi54X29mZnNldCkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBPcmRpbmFyeSBzaG9ydCBmaWxlbmFtZSwgcHV0IGludG8gbWVtb3J5IGFueXdheS4gIFRoZQotICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgUEUgdG9vbHMgc29tZXRpbWVzIHN0b3JlIGEgZmlsZW5hbWUgaW4KLSAgICAgICAgICAgICAgICAgbXVsdGlwbGUgQVVYIGVudHJpZXMuICAqLwotCSAgICAgIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4ID4gMQotCQkgICYmIGNvZmZfZGF0YSAoYWJmZCktPnBlKQotCQl7Ci0JCSAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9Ci0JCSAgICAoKGxvbmcpCi0JCSAgICAgY29weV9uYW1lIChhYmZkLAotCQkJCShpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfZm5hbWUsCi0JCQkJaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCAqIHN5bWVzeikpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9Ci0JCSAgICAoKGxvbmcpCi0JCSAgICAgY29weV9uYW1lIChhYmZkLAotCQkJCShpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfZm5hbWUsCi0JCQkJYmZkX2NvZmZfZmlsbm1sZW4gKGFiZmQpKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhICJzaG9ydCIgbmFtZS4gIE1ha2UgaXQgbG9uZy4gICovCi0JICAgICAgdW5zaWduZWQgbG9uZyBpID0gMDsKLQkgICAgICBjaGFyICpuZXdzdHJpbmcgPSBOVUxMOwotCi0JICAgICAgLyogZmluZCB0aGUgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nIHdpdGhvdXQgd2Fsa2luZyBpbnRvIG1lbW9yeQotCSAgICAgICAgIHRoYXQgaXNuJ3Qgb3Vycy4gICovCi0JICAgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKLQkJewotCQkgIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX25hbWVbaV0gPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9CQkvKiBpZiBlbmQgb2Ygc3RyaW5nICovCi0JCX0JCS8qIHBvc3NpYmxlIGxlbmd0aHMgb2YgdGhpcyBzdHJpbmcuICovCi0KLQkgICAgICBpZiAoKG5ld3N0cmluZyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgKytpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQkgICAgICBtZW1zZXQgKG5ld3N0cmluZywgMCwgaSk7Ci0JICAgICAgc3RybmNweSAobmV3c3RyaW5nLCBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX25hbWUsIGkgLSAxKTsKLQkgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKGxvbmcgaW50KSBuZXdzdHJpbmc7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkgIiI7Ci0JICBlbHNlIGlmICghYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoYWJmZCwgJmludGVybmFsX3B0ci0+dS5zeW1lbnQpKQotCSAgICB7Ci0JICAgICAgLyogTG9uZyBuYW1lIGFscmVhZHkuICBQb2ludCBzeW1ib2wgYXQgdGhlIHN0cmluZyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgdGFibGUuICAqLwotCSAgICAgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJewotCQkgIHN0cmluZ190YWJsZSA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JCSAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIE5VTEw7Ci0JCX0KLQkgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0KLQkJKChsb25nIGludCkKLQkJIChzdHJpbmdfdGFibGUKLQkJICArIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTG9uZyBuYW1lIGluIGRlYnVnIHNlY3Rpb24uICBWZXJ5IHNpbWlsYXIuICAqLwotCSAgICAgIGlmIChkZWJ1Z19zZWN0aW9uID09IE5VTEwpCi0JCWRlYnVnX3NlY3Rpb24gPSBidWlsZF9kZWJ1Z19zZWN0aW9uIChhYmZkKTsKLQkgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKGxvbmcgaW50KQotCQkoZGVidWdfc2VjdGlvbiArIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQpOwotCSAgICB9Ci0JfQotICAgICAgaW50ZXJuYWxfcHRyICs9IGludGVybmFsX3B0ci0+dS5zeW1lbnQubl9udW1hdXg7Ci0gICAgfQotCi0gIG9ial9yYXdfc3ltZW50cyAoYWJmZCkgPSBpbnRlcm5hbDsKLSAgQkZEX0FTU0VSVCAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpCi0JICAgICAgPT0gKHVuc2lnbmVkIGludCkgKGludGVybmFsX3B0ciAtIGludGVybmFsKSk7Ci0KLSAgcmV0dXJuIChpbnRlcm5hbCk7Ci19CQkJCS8qIGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKCkgKi8KLQotbG9uZwotY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotYXN5bWJvbCAqCi1jb2ZmX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKm5ldyA9IChjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcgPT0gTlVMTCkKLSAgICByZXR1cm4gKE5VTEwpOwotICBtZW1zZXQgKG5ldywgMCwgc2l6ZW9mICpuZXcpOwotICBuZXctPnN5bWJvbC5zZWN0aW9uID0gMDsKLSAgbmV3LT5uYXRpdmUgPSAwOwotICBuZXctPmxpbmVubyA9IChhbGVudCAqKSBOVUxMOwotICBuZXctPmRvbmVfbGluZW5vID0gZmFsc2U7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBNYWtlIGEgZGVidWdnaW5nIHN5bWJvbC4gICovCi0KLWFzeW1ib2wgKgotY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgKGFiZmQsIHB0ciwgc3opCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHB0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBsb25nIHN6IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKm5ldyA9IChjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcgPT0gTlVMTCkKLSAgICByZXR1cm4gKE5VTEwpOwotICAvKiBAQCBUaGUgMTAgaXMgYSBndWVzcyBhdCBhIHBsYXVzaWJsZSBtYXhpbXVtIG51bWJlciBvZiBhdXggZW50cmllcwotICAgICAoYnV0IHNob3VsZG4ndCBiZSBhIGNvbnN0YW50KS4gICovCi0gIG5ldy0+bmF0aXZlID0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKSAqIDEwKTsKLSAgaWYgKCFuZXctPm5hdGl2ZSkKLSAgICByZXR1cm4gKE5VTEwpOwotICBuZXctPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgbmV3LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICBuZXctPmxpbmVubyA9IChhbGVudCAqKSBOVUxMOwotICBuZXctPmRvbmVfbGluZW5vID0gZmFsc2U7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKkFSR1NVU0VEICovCi12b2lkCi1jb2ZmX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLSAgaWYgKGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSAhPSBOVUxMCi0gICAgICAmJiBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUtPmZpeF92YWx1ZSkKLSAgICB7Ci0gICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpwc3ltOwotCi0gICAgICBwc3ltID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopCi0JICAgICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlKTsKLSAgICAgIHJldC0+dmFsdWUgPSAoYmZkX3ZtYSkgKHBzeW0gLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0aGUgQ09GRiBzeW1lbnQgZm9yIGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltYm9sLCBwc3ltZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqcHN5bWVudDsKLXsKLSAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bTsKLQotICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLSAgaWYgKGNzeW0gPT0gTlVMTCB8fCBjc3ltLT5uYXRpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAqcHN5bWVudCA9IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQ7Ci0KLSAgaWYgKGNzeW0tPm5hdGl2ZS0+Zml4X3ZhbHVlKQotICAgIHBzeW1lbnQtPm5fdmFsdWUgPSAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcHN5bWVudC0+bl92YWx1ZQotCQkJLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICAvKiBGSVhNRTogV2Ugc2hvdWxkIGhhbmRsZSBmaXhfbGluZSBoZXJlLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBDT0ZGIGF1eGVudCBmb3IgYSBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1iZmRfY29mZl9nZXRfYXV4ZW50IChhYmZkLCBzeW1ib2wsIGluZHgsIHBhdXhlbnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBpbnQgaW5keDsKLSAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICpwYXV4ZW50OwotewotICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltOwotICBjb21iaW5lZF9lbnRyeV90eXBlICplbnQ7Ci0KLSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0KLSAgaWYgKGNzeW0gPT0gTlVMTAotICAgICAgfHwgY3N5bS0+bmF0aXZlID09IE5VTEwKLSAgICAgIHx8IGluZHggPj0gY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnQgPSBjc3ltLT5uYXRpdmUgKyBpbmR4ICsgMTsKLQotICAqcGF1eGVudCA9IGVudC0+dS5hdXhlbnQ7Ci0KLSAgaWYgKGVudC0+Zml4X3RhZykKLSAgICBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sID0KLSAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICBpZiAoZW50LT5maXhfZW5kKQotICAgIHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPQotICAgICAgKChjb21iaW5lZF9lbnRyeV90eXBlICopIHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAKLSAgICAgICAtIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpOwotCi0gIGlmIChlbnQtPmZpeF9zY25sZW4pCi0gICAgcGF1eGVudC0+eF9jc2VjdC54X3Njbmxlbi5sID0KLSAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X2NzZWN0Lnhfc2NubGVuLnAKLSAgICAgICAtIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgQ09GRiBzeW1ib2wuICAqLwotCi12b2lkCi1jb2ZmX3ByaW50X3N5bWJvbCAoYWJmZCwgZmlsZXAsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlcDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgZmlsZXA7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiY29mZiAlcyAlcyIsCi0JICAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSA/ICJuIiA6ICJnIiwKLQkgICAgICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vID8gImwiIDogIiAiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIGlmIChjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUpCi0JewotCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICB1bnNpZ25lZCBpbnQgYXV4OwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqY29tYmluZWQgPSBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmU7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpyb290ID0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKLQkgIHN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgKmwgPSBjb2Zmc3ltYm9sIChzeW1ib2wpLT5saW5lbm87Ci0KLQkgIGZwcmludGYgKGZpbGUsICJbJTNsZF0iLCAobG9uZykgKGNvbWJpbmVkIC0gcm9vdCkpOwotCi0JICBpZiAoISBjb21iaW5lZC0+Zml4X3ZhbHVlKQotCSAgICB2YWwgPSAodW5zaWduZWQgbG9uZykgY29tYmluZWQtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICBlbHNlCi0JICAgIHZhbCA9ICgodW5zaWduZWQgbG9uZykKLQkJICAgKChjb21iaW5lZF9lbnRyeV90eXBlICopIGNvbWJpbmVkLT51LnN5bWVudC5uX3ZhbHVlCi0JCSAgICAtIHJvb3QpKTsKLQotCSAgZnByaW50ZiAoZmlsZSwKLQkJICAgIihzZWMgJTJkKShmbCAweCUwMngpKHR5ICUzeCkoc2NsICUzZCkgKG54ICVkKSAweCUwOGx4ICVzIiwKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fc2NudW0sCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX2ZsYWdzLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl90eXBlLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX251bWF1eCwKLQkJICAgdmFsLAotCQkgICBzeW1ib2wtPm5hbWUpOwotCi0JICBmb3IgKGF1eCA9IDA7IGF1eCA8IGNvbWJpbmVkLT51LnN5bWVudC5uX251bWF1eDsgYXV4KyspCi0JICAgIHsKLQkgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXhwID0gY29tYmluZWQgKyBhdXggKyAxOwotCSAgICAgIGxvbmcgdGFnbmR4OwotCi0JICAgICAgaWYgKGF1eHAtPmZpeF90YWcpCi0JCXRhZ25keCA9IGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAgLSByb290OwotCSAgICAgIGVsc2UKLQkJdGFnbmR4ID0gYXV4cC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubDsKLQotCSAgICAgIGZwcmludGYgKGZpbGUsICJcbiIpOwotCi0JICAgICAgaWYgKGJmZF9jb2ZmX3ByaW50X2F1eCAoYWJmZCwgZmlsZSwgcm9vdCwgY29tYmluZWQsIGF1eHAsIGF1eCkpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgc3dpdGNoIChjb21iaW5lZC0+dS5zeW1lbnQubl9zY2xhc3MpCi0JCXsKLQkJY2FzZSBDX0ZJTEU6Ci0JCSAgZnByaW50ZiAoZmlsZSwgIkZpbGUgIik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBDX1NUQVQ6Ci0JCSAgaWYgKGNvbWJpbmVkLT51LnN5bWVudC5uX3R5cGUgPT0gVF9OVUxMKQotCQkgICAgLyogcHJvYmFibHkgYSBzZWN0aW9uIHN5bWJvbD8gKi8KLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZmlsZSwgIkFVWCBzY25sZW4gMHglbHggbnJlbG9jICVkIG5sbm5vICVkIiwKLQkJCSAgICAgICAobG9uZykgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9zY25sZW4sCi0JCQkgICAgICAgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9ucmVsb2MsCi0JCQkgICAgICAgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9ubGlubm8pOwotCQkgICAgICBpZiAoYXV4cC0+dS5hdXhlbnQueF9zY24ueF9jaGVja3N1bSAhPSAwCi0JCQkgIHx8IGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfYXNzb2NpYXRlZCAhPSAwCi0JCQkgIHx8IGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0ICE9IDApCi0JCQlmcHJpbnRmIChmaWxlLCAiIGNoZWNrc3VtIDB4JWx4IGFzc29jICVkIGNvbWRhdCAlZCIsCi0JCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY2hlY2tzdW0sCi0JCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfYXNzb2NpYXRlZCwKLQkJCQkgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAgIC8qIGVsc2UgZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgQ19FWFQ6Ci0JCSAgaWYgKElTRkNOIChjb21iaW5lZC0+dS5zeW1lbnQubl90eXBlKSkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZmlsZSwKLQkJCSAgICAgICBfKCJBVVggdGFnbmR4ICVsZCB0dGxzaXogMHglbHggbG5ub3MgJWxkIG5leHQgJWxkIiksCi0JCQkgICAgICAgdGFnbmR4LAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2ZzaXplLAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwKLQkJCSAgICAgICAoYXV4cC0+Zml4X2VuZAotCQkJCT8gKChsb25nKQotCQkJCSAgIChhdXhwLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wCi0JCQkJICAgIC0gcm9vdCkpCi0JCQkJOiBhdXhwLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qIGVsc2UgZmFsbCB0aHJvdWdoICovCi0JCWRlZmF1bHQ6Ci0JCSAgZnByaW50ZiAoZmlsZSwgIkFVWCBsbm5vICVkIHNpemUgMHgleCB0YWduZHggJWxkIiwKLQkJCSAgIGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vLAotCQkJICAgYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsCi0JCQkgICB0YWduZHgpOwotCQkgIGlmIChhdXhwLT5maXhfZW5kKQotCQkgICAgZnByaW50ZiAoZmlsZSwgIiBlbmRuZHggJWxkIiwKLQkJCSAgICAgKChsb25nKQotCQkJICAgICAgKGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAKLQkJCSAgICAgICAtIHJvb3QpKSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKGZpbGUsICJcbiVzIDoiLCBsLT51LnN5bS0+bmFtZSk7Ci0JICAgICAgbCsrOwotCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlcikKLQkJewotCQkgIGZwcmludGYgKGZpbGUsICJcbiU0ZCA6IDB4JWx4IiwKLQkJCSAgIGwtPmxpbmVfbnVtYmVyLAotCQkJICAgKCh1bnNpZ25lZCBsb25nKQotCQkJICAgIChsLT51Lm9mZnNldCArIHN5bWJvbC0+c2VjdGlvbi0+dm1hKSkpOwotCQkgIGwrKzsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0JICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMgJXMgJXMiLAotCQkgICBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsCi0JCSAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSA/ICJuIiA6ICJnIiwKLQkJICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vID8gImwiIDogIiAiLAotCQkgICBzeW1ib2wtPm5hbWUpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIG5hbWUgaW1wbGllcyBhIGxvY2FsIHN5bWJvbC4gIEluIENPRkYsCi0gICBsb2NhbCBzeW1ib2xzIGdlbmVyYWxseSBzdGFydCB3aXRoIGBgLkwnJy4gIE1vc3QgdGFyZ2V0cyB1c2UgdGhpcwotICAgZnVuY3Rpb24gZm9yIHRoZSBpc19sb2NhbF9sYWJlbF9uYW1lIGVudHJ5IHBvaW50LCBidXQgc29tZSBtYXkKLSAgIG92ZXJyaWRlIGl0LiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnTCc7Ci19Ci0KLS8qIFByb3ZpZGVkIGEgQkZELCBhIHNlY3Rpb24gYW5kIGFuIG9mZnNldCAoaW4gYnl0ZXMsIG5vdCBvY3RldHMpIGludG8gdGhlCi0gICBzZWN0aW9uLCBjYWxjdWxhdGUgYW5kIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lCi0gICBuZWFyZXN0IHRvIHRoZSB3YW50ZWQgbG9jYXRpb24uICAqLwotLypBUkdTVVNFRCovCi1ib29sZWFuCi1jb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwKLQkJCWZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBib29sZWFuIGZvdW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGxpbmVfYmFzZTsKLSAgY29mZl9kYXRhX3R5cGUgKmNvZiA9IGNvZmZfZGF0YSAoYWJmZCk7Ci0gIC8qIFJ1biB0aHJvdWdoIHRoZSByYXcgc3ltZW50cyBpZiBhdmFpbGFibGUgKi8KLSAgY29tYmluZWRfZW50cnlfdHlwZSAqcDsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqcGVuZDsKLSAgYWxlbnQgKmw7Ci0gIHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY19kYXRhOwotCi0gIC8qIEJlZm9yZSBsb29raW5nIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSwgdHJ5IHRvIHVzZSBhIC5zdGFiCi0gICAgIHNlY3Rpb24gdG8gZmluZCB0aGUgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc3ltYm9scywgc2VjdGlvbiwgb2Zmc2V0LAotCQkJCQkgICAgICZmb3VuZCwgZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyLAotCQkJCQkgICAgICZjb2ZmX2RhdGEgKGFiZmQpLT5saW5lX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0cnVlOwotCi0gICpmaWxlbmFtZV9wdHIgPSAwOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IDA7Ci0gICpsaW5lX3B0ciA9IDA7Ci0KLSAgLyogRG9uJ3QgdHJ5IGFuZCBmaW5kIGxpbmUgbnVtYmVycyBpbiBhIG5vbiBjb2ZmIGZpbGUgKi8KLSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb2YgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmluZCB0aGUgZmlyc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHAgPSBjb2YtPnJhd19zeW1lbnRzOwotICBpZiAoIXApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBlbmQgPSBwICsgY29mLT5yYXdfc3ltZW50X2NvdW50OwotICB3aGlsZSAocCA8IHBlbmQpCi0gICAgewotICAgICAgaWYgKHAtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRSkKLQlicmVhazsKLSAgICAgIHAgKz0gMSArIHAtPnUuc3ltZW50Lm5fbnVtYXV4OwotICAgIH0KLQotICBpZiAocCA8IHBlbmQpCi0gICAgewotICAgICAgYmZkX3ZtYSBzZWNfdm1hOwotICAgICAgYmZkX3ZtYSBtYXhkaWZmOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIENfRklMRSBzeW1ib2xzIHRvIGZpbmQgdGhlIGJlc3Qgb25lLiAgKi8KLSAgICAgIHNlY192bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgICpmaWxlbmFtZV9wdHIgPSAoY2hhciAqKSBwLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldDsKLSAgICAgIG1heGRpZmYgPSAoYmZkX3ZtYSkgMCAtIChiZmRfdm1hKSAxOwotICAgICAgd2hpbGUgKDEpCi0JewotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcDI7Ci0KLQkgIGZvciAocDIgPSBwICsgMSArIHAtPnUuc3ltZW50Lm5fbnVtYXV4OwotCSAgICAgICBwMiA8IHBlbmQ7Ci0JICAgICAgIHAyICs9IDEgKyBwMi0+dS5zeW1lbnQubl9udW1hdXgpCi0JICAgIHsKLQkgICAgICBpZiAocDItPnUuc3ltZW50Lm5fc2NudW0gPiAwCi0JCSAgJiYgKHNlY3Rpb24KLQkJICAgICAgPT0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLAotCQkJCQkJICAgICAgcDItPnUuc3ltZW50Lm5fc2NudW0pKSkKLQkJYnJlYWs7Ci0JICAgICAgaWYgKHAyLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JCXsKLQkJICBwMiA9IHBlbmQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBXZSB1c2UgPD0gTUFYRElGRiBoZXJlIHNvIHRoYXQgaWYgd2UgZ2V0IGEgemVybyBsZW5ndGgKLSAgICAgICAgICAgICBmaWxlLCB3ZSBhY3R1YWxseSB1c2UgdGhlIG5leHQgZmlsZSBlbnRyeS4gICovCi0JICBpZiAocDIgPCBwZW5kCi0JICAgICAgJiYgb2Zmc2V0ICsgc2VjX3ZtYSA+PSAoYmZkX3ZtYSkgcDItPnUuc3ltZW50Lm5fdmFsdWUKLQkgICAgICAmJiBvZmZzZXQgKyBzZWNfdm1hIC0gKGJmZF92bWEpIHAyLT51LnN5bWVudC5uX3ZhbHVlIDw9IG1heGRpZmYpCi0JICAgIHsKLQkgICAgICAqZmlsZW5hbWVfcHRyID0gKGNoYXIgKikgcC0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgbWF4ZGlmZiA9IG9mZnNldCArIHNlY192bWEgLSBwMi0+dS5zeW1lbnQubl92YWx1ZTsKLQkgICAgfQotCi0JICAvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIG9uIGVycm9uZW91cyBmaWxlcyBieSBlbnN1cmluZyB0aGF0Ci0JICAgICB3ZSBhbHdheXMgbW92ZSBmb3J3YXJkIGluIHRoZSBmaWxlLiAgKi8KLQkgIGlmIChwIC0gY29mLT5yYXdfc3ltZW50cyA+PSBwLT51LnN5bWVudC5uX3ZhbHVlKQotCSAgICBicmVhazsKLQotCSAgcCA9IGNvZi0+cmF3X3N5bWVudHMgKyBwLT51LnN5bWVudC5uX3ZhbHVlOwotCSAgaWYgKHAgPiBwZW5kIHx8IHAtPnUuc3ltZW50Lm5fc2NsYXNzICE9IENfRklMRSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgd2FuZGVyIHRob3VnaCB0aGUgcmF3IGxpbmVudW1iZXJzIG9mIHRoZSBzZWN0aW9uICovCi0gIC8qIElmIHdlIGhhdmUgYmVlbiBjYWxsZWQgb24gdGhpcyBzZWN0aW9uIGJlZm9yZSwgYW5kIHRoZSBvZmZzZXQgd2UKLSAgICAgd2FudCBpcyBmdXJ0aGVyIGRvd24gdGhlbiB3ZSBjYW4gcHJpbWUgdGhlIGxvb2t1cCBsb29wLiAgKi8KLSAgc2VjX2RhdGEgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbik7Ci0gIGlmIChzZWNfZGF0YSAhPSBOVUxMCi0gICAgICAmJiBzZWNfZGF0YS0+aSA+IDAKLSAgICAgICYmIG9mZnNldCA+PSBzZWNfZGF0YS0+b2Zmc2V0KQotICAgIHsKLSAgICAgIGkgPSBzZWNfZGF0YS0+aTsKLSAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gc2VjX2RhdGEtPmZ1bmN0aW9uOwotICAgICAgbGluZV9iYXNlID0gc2VjX2RhdGEtPmxpbmVfYmFzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpID0gMDsKLSAgICAgIGxpbmVfYmFzZSA9IDA7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uLT5saW5lbm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxhc3RfdmFsdWUgPSAwOwotCi0gICAgICBsID0gJnNlY3Rpb24tPmxpbmVub1tpXTsKLQotICAgICAgZm9yICg7IGkgPCBzZWN0aW9uLT5saW5lbm9fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAobC0+bGluZV9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEdldCB0aGUgc3ltYm9sIHRoaXMgbGluZSBudW1iZXIgcG9pbnRzIGF0ICovCi0JICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZiA9IChjb2ZmX3N5bWJvbF90eXBlICopIChsLT51LnN5bSk7Ci0JICAgICAgaWYgKGNvZmYtPnN5bWJvbC52YWx1ZSA+IG9mZnNldCkKLQkJYnJlYWs7Ci0JICAgICAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBjb2ZmLT5zeW1ib2wubmFtZTsKLQkgICAgICBsYXN0X3ZhbHVlID0gY29mZi0+c3ltYm9sLnZhbHVlOwotCSAgICAgIGlmIChjb2ZmLT5uYXRpdmUpCi0JCXsKLQkJICBjb21iaW5lZF9lbnRyeV90eXBlICpzID0gY29mZi0+bmF0aXZlOwotCQkgIHMgPSBzICsgMSArIHMtPnUuc3ltZW50Lm5fbnVtYXV4OwotCi0JCSAgLyogSW4gWENPRkYgYSBkZWJ1Z2dpbmcgc3ltYm9sIGNhbiBmb2xsb3cgdGhlCi0JCSAgICAgZnVuY3Rpb24gc3ltYm9sLiAgKi8KLQkJICBpZiAocy0+dS5zeW1lbnQubl9zY251bSA9PSBOX0RFQlVHKQotCQkgICAgcyA9IHMgKyAxICsgcy0+dS5zeW1lbnQubl9udW1hdXg7Ci0KLQkJICAvKiBTIHNob3VsZCBub3cgcG9pbnQgdG8gdGhlIC5iZiBvZiB0aGUgZnVuY3Rpb24uICAqLwotCQkgIGlmIChzLT51LnN5bWVudC5uX251bWF1eCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGxpbmVudW1iZXIgaXMgc3RvcmVkIGluIHRoZSBhdXhlbnQuICAqLwotCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmEgPSAmKChzICsgMSktPnUuYXV4ZW50KTsKLQkJICAgICAgbGluZV9iYXNlID0gYS0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm87Ci0JCSAgICAgICpsaW5lX3B0ciA9IGxpbmVfYmFzZTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobC0+dS5vZmZzZXQgPiBvZmZzZXQpCi0JCWJyZWFrOwotCSAgICAgICpsaW5lX3B0ciA9IGwtPmxpbmVfbnVtYmVyICsgbGluZV9iYXNlIC0gMTsKLQkgICAgfQotCSAgbCsrOwotCX0KLQotICAgICAgLyogSWYgd2UgZmVsbCBvZmYgdGhlIGVuZCBvZiB0aGUgbG9vcCwgdGhlbiBhc3N1bWUgdGhhdCB0aGlzCi0JIHN5bWJvbCBoYXMgbm8gbGluZSBudW1iZXIgaW5mby4gIE90aGVyd2lzZSwgc3ltYm9scyB3aXRoIG5vCi0JIGxpbmUgbnVtYmVyIGluZm8gZ2V0IHJlcG9ydGVkIHdpdGggdGhlIGxpbmUgbnVtYmVyIG9mIHRoZQotCSBsYXN0IGxpbmUgb2YgdGhlIGxhc3Qgc3ltYm9sIHdoaWNoIGRvZXMgaGF2ZSBsaW5lIG51bWJlcgotCSBpbmZvLiAgV2UgdXNlIDB4MTAwIGFzIGEgc2xvcCB0byBhY2NvdW50IGZvciBjYXNlcyB3aGVyZSB0aGUKLQkgbGFzdCBsaW5lIGhhcyBleGVjdXRhYmxlIGNvZGUuICAqLwotICAgICAgaWYgKGkgPj0gc2VjdGlvbi0+bGluZW5vX2NvdW50Ci0JICAmJiBsYXN0X3ZhbHVlICE9IDAKLQkgICYmIG9mZnNldCAtIGxhc3RfdmFsdWUgPiAweDEwMCkKLQl7Ci0JICAqZnVuY3Rpb25uYW1lX3B0ciA9IE5VTEw7Ci0JICAqbGluZV9wdHIgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogQ2FjaGUgdGhlIHJlc3VsdHMgZm9yIHRoZSBuZXh0IGNhbGwuICAqLwotICBpZiAoc2VjX2RhdGEgPT0gTlVMTCAmJiBzZWN0aW9uLT5vd25lciA9PSBhYmZkKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0KLQkoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCSAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLSAgICAgIHNlY19kYXRhID0gKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQ7Ci0gICAgfQotICBpZiAoc2VjX2RhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWNfZGF0YS0+b2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgc2VjX2RhdGEtPmkgPSBpOwotICAgICAgc2VjX2RhdGEtPmZ1bmN0aW9uID0gKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgICBzZWNfZGF0YS0+bGluZV9iYXNlID0gbGluZV9iYXNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50Ci1jb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jOwotewotICBzaXplX3Qgc2l6ZTsKLQotICBpZiAocmVsb2MgPT0gZmFsc2UpCi0gICAgewotICAgICAgc2l6ZSA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkgKyBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemUgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpOwotICAgIH0KLQotICBzaXplICs9IGFiZmQtPnNlY3Rpb25fY291bnQgKiBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogQ2hhbmdlIHRoZSBjbGFzcyBvZiBhIGNvZmYgc3ltYm9sIGhlbGQgYnkgQkZELiAgKi8KLWJvb2xlYW4KLWJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MgKGFiZmQsIHN5bWJvbCwgY2xhc3MpCi0gICAgIGJmZCAqICAgICAgICAgYWJmZDsKLSAgICAgYXN5bWJvbCAqICAgICBzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCAgY2xhc3M7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKiBjc3ltOwotCi0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotICBpZiAoY3N5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChjc3ltLT5uYXRpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIGFsaWVuIHN5bWJvbCB3aGljaCBubyBuYXRpdmUgY29mZiBiYWNrZW5kIGRhdGEuCi0JIFdlIGNoZWF0IGhlcmUgYnkgY3JlYXRpbmcgYSBmYWtlIG5hdGl2ZSBlbnRyeSBmb3IgaXQgYW5kCi0JIHRoZW4gZmlsbGluZyBpbiB0aGUgY2xhc3MuICBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhhdCBpbgotCSBjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCgpLiAgKi8KLSAgICAgIAotICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqIG5hdGl2ZTsKLQotICAgICAgbmF0aXZlID0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCogbmF0aXZlKSk7Ci0gICAgICBpZiAobmF0aXZlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBtZW1zZXQgKG5hdGl2ZSwgMCwgc2l6ZW9mICgqIG5hdGl2ZSkpOwotICAgICAgCi0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSAgID0gVF9OVUxMOwotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IGNsYXNzOwotICAgICAgCi0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSBzeW1ib2wtPnZhbHVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQl7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotCSAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0KLQkgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gKHN5bWJvbC0+dmFsdWUKLQkJCQkgICAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICBpZiAoISBvYmpfcGUgKGFiZmQpKQotCSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgCi0JICAvKiBDb3B5IHRoZSBhbnkgZmxhZ3MgZnJvbSB0aGUgdGhlIGZpbGUgaGVhZGVyIGludG8gdGhlIHN5bWJvbC4KLQkgICAgIEZJWE1FOiBXaHk/ICAqLwotCSAgbmF0aXZlLT51LnN5bWVudC5uX2ZsYWdzID0gYmZkX2FzeW1ib2xfYmZkICgmIGNzeW0tPnN5bWJvbCktPmZsYWdzOwotCX0KLSAgICAgIAotICAgICAgY3N5bS0+bmF0aXZlID0gbmF0aXZlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBjbGFzczsKLSAgICB9Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmZsaW5rLmMgYi9iZmQvY29mZmxpbmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5ZjY2NS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDMwMTAgKzAsMCBAQAotLyogQ09GRiBzcGVjaWZpYyBsaW5rZXIgY29kZS4KLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIgY29kZS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBjaGFyICpkb3Jlc19jb20gUEFSQU1TICgoY2hhciAqLCBiZmQgKiwgaW50KSk7Ci1zdGF0aWMgY2hhciAqZ2V0X25hbWUgUEFSQU1TICgoY2hhciAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBtYXJrX3JlbG9jcyBQQVJBTVMgKChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLQotLyogRGVmaW5lIG1hY3JvcyBzbyB0aGF0IHRoZSBJU0ZDTiwgZXQuIGFsLiwgbWFjcm9zIHdvcmsgY29ycmVjdGx5LgotICAgVGhlc2UgbWFjcm9zIGFyZSBkZWZpbmVkIGluIGluY2x1ZGUvY29mZi9pbnRlcm5hbC5oIGluIHRlcm1zIG9mCi0gICBOX1RNQVNLLCBldGMuICBUaGVzZSBkZWZpbml0aW9ucyByZXF1aXJlIGEgdXNlciB0byBkZWZpbmUgbG9jYWwKLSAgIHZhcmlhYmxlcyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBuYW1lcywgYW5kIHdpdGggdmFsdWVzIGZyb20gdGhlCi0gICBjb2ZmX2RhdGEgKGFiZmQpIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgTl9UTUFTSyBuX3RtYXNrCi0jZGVmaW5lIE5fQlRTSEZUIG5fYnRzaGZ0Ci0jZGVmaW5lIE5fQlRNQVNLIG5fYnRtYXNrCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmluZHggPSAtMTsKLSAgICAgIHJldC0+dHlwZSA9IFRfTlVMTDsKLSAgICAgIHJldC0+Y2xhc3MgPSBDX05VTEw7Ci0gICAgICByZXQtPm51bWF1eCA9IDA7Ci0gICAgICByZXQtPmF1eGJmZCA9IE5VTEw7Ci0gICAgICByZXQtPmF1eCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHRhYmxlLT5zdGFiX2luZm8gPSBOVUxMOwotICByZXR1cm4gX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBhYmZkLCBuZXdmdW5jKTsKLX0KLQotLyogQ3JlYXRlIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLV9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0IChyZXQsIGFiZmQsCi0JCQkJCV9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50eXBlcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogR2l2ZW4gYSBDT0ZGIEJGRCwgYWRkIHN5bWJvbHMgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGFzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXR1cm4gKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQkgICAgICAoYWJmZCwgaW5mbywgY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCkpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYSBDT0ZGIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hlY2sgYSBzaW5nbGUgYXJjaGl2ZSBlbGVtZW50IHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGluY2x1ZGUgaXQgaW4KLSAgIHRoZSBsaW5rLiAgKlBORUVERUQgaXMgc2V0IGFjY29yZGluZyB0byB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcwotICAgbmVlZGVkIGluIHRoZSBsaW5rIG9yIG5vdC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgISAqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgb2JqZWN0IGZpbGUgc2hvdWxkIGJlCi0gICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0gICAgICBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJnN5bSk7Ci0KLSAgICAgIGNsYXNzaWZpY2F0aW9uID0gYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sIChhYmZkLCAmc3ltKTsKLSAgICAgIGlmIChjbGFzc2lmaWNhdGlvbiA9PSBDT0ZGX1NZTUJPTF9HTE9CQUwKLQkgIHx8IGNsYXNzaWZpY2F0aW9uID09IENPRkZfU1lNQk9MX0NPTU1PTikKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUsIGFuZCBpcyBkZWZpbmVkIGJ5IHRoaXMKLSAgICAgICAgICAgICBvYmplY3QgZmlsZS4gICovCi0KLQkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZzeW0sIGJ1Zik7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLQkgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc3ltYm9scyB0aGF0IGFyZSBjdXJyZW50bHkKLQkgICAgIHVuZGVmaW5lZC4gIElmIGEgc3ltYm9sIGlzIGN1cnJlbnRseSBrbm93biB0byBiZSBjb21tb24sCi0JICAgICBDT0ZGIGxpbmtlcnMgZG8gbm90IGJyaW5nIGluIGFuIG9iamVjdCBmaWxlIHdoaWNoIGRlZmluZXMKLQkgICAgIGl0LiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBuX3RtYXNrID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzazsKLSAgdW5zaWduZWQgaW50IG5fYnRzaGZ0ID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl9idHNoZnQ7Ci0gIHVuc2lnbmVkIGludCBuX2J0bWFzayA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRtYXNrOwotICBib29sZWFuIGtlZXBfc3ltczsKLSAgYm9vbGVhbiBkZWZhdWx0X2NvcHk7Ci0gIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLQotICAvKiBLZWVwIHRoZSBzeW1ib2xzIGR1cmluZyB0aGlzIGZ1bmN0aW9uLCBpbiBjYXNlIHRoZSBsaW5rZXIgbmVlZHMKLSAgICAgdG8gcmVhZCB0aGUgZ2VuZXJpYyBzeW1ib2xzIGluIG9yZGVyIHRvIHJlcG9ydCBhbiBlcnJvciBtZXNzYWdlLiAgKi8KLSAga2VlcF9zeW1zID0gb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKTsKLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7Ci0KLSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotICAgIGRlZmF1bHRfY29weSA9IGZhbHNlOwotICBlbHNlCi0gICAgZGVmYXVsdF9jb3B5ID0gdHJ1ZTsKLQotICBzeW1jb3VudCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLQotICAvKiBXZSBrZWVwIGEgbGlzdCBvZiB0aGUgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgdG8gcGFydGljdWxhciBzeW1ib2xzLiAgKi8KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgKChzaXplX3QpIHN5bWNvdW50Ci0JCQkgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpID0gc3ltX2hhc2g7Ci0gIG1lbXNldCAoc3ltX2hhc2gsIDAsCi0JICAoc2l6ZV90KSBzeW1jb3VudCAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBCRkRfQVNTRVJUIChzeW1lc3ogPT0gYmZkX2NvZmZfYXV4ZXN6IChhYmZkKSk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIHN5bWNvdW50ICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbjsKLSAgICAgIGJvb2xlYW4gY29weTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICBjbGFzc2lmaWNhdGlvbiA9IGJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0gICAgICBpZiAoY2xhc3NpZmljYXRpb24gIT0gQ09GRl9TWU1CT0xfTE9DQUwpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBmbGFnd29yZCBmbGFnczsKLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCSAgYmZkX3ZtYSB2YWx1ZTsKLQkgIGJvb2xlYW4gYWRkaXQ7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGV4dGVybmFsbHkgdmlzaWJsZS4gICovCi0KLQkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZzeW0sIGJ1Zik7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogV2UgbXVzdCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5IGlmIHdlIGdvdCBpdCBmcm9tIHRoZQotICAgICAgICAgICAgIHN5bWVudCBpdHNlbGYsIHJhdGhlciB0aGFuIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgY29weSA9IGRlZmF1bHRfY29weTsKLQkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgIT0gMAotCSAgICAgIHx8IHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotCSAgICBjb3B5ID0gdHJ1ZTsKLQotCSAgdmFsdWUgPSBzeW0ubl92YWx1ZTsKLQotCSAgc3dpdGNoIChjbGFzc2lmaWNhdGlvbikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIGNhc2UgQ09GRl9TWU1CT0xfR0xPQkFMOgotCSAgICAgIGZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0JICAgICAgc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgICAgIGlmICghIG9ial9wZSAoYWJmZCkpCi0JCXZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENPRkZfU1lNQk9MX1VOREVGSU5FRDoKLQkgICAgICBmbGFncyA9IDA7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9DT01NT046Ci0JICAgICAgZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgICAgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQkgICAgICBmbGFncyA9IEJTRl9TRUNUSU9OX1NZTSB8IEJTRl9HTE9CQUw7Ci0JICAgICAgc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19XRUFLRVhUCi0JICAgICAgfHwgKG9ial9wZSAoYWJmZCkgJiYgc3ltLm5fc2NsYXNzID09IENfTlRfV0VBSykpCi0JICAgIGZsYWdzID0gQlNGX1dFQUs7Ci0KLQkgIGFkZGl0ID0gdHJ1ZTsKLQotCSAgLyogSW4gdGhlIFBFIGZvcm1hdCwgc2VjdGlvbiBzeW1ib2xzIGFjdHVhbGx5IHJlZmVyIHRvIHRoZQotICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gIFdlIGhhbmRsZSB0aGVtIHNwZWNpYWxseQotICAgICAgICAgICAgIGhlcmUuICAqLwotCSAgaWYgKG9ial9wZSAoYWJmZCkgJiYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotCSAgICB7Ci0JICAgICAgKnN5bV9oYXNoID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJIG5hbWUsIGZhbHNlLCBjb3B5LCBmYWxzZSk7Ci0JICAgICAgaWYgKCpzeW1faGFzaCAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKCgoKnN5bV9oYXNoKS0+Y29mZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgQ09GRl9MSU5LX0hBU0hfUEVfU0VDVElPTl9TWU1CT0wpID09IDAKLQkJICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAgICgiV2FybmluZzogc3ltYm9sIGAlcycgaXMgYm90aCBzZWN0aW9uIGFuZCBub24tc2VjdGlvbiIsCi0JCSAgICAgICBuYW1lKTsKLQotCQkgIGFkZGl0ID0gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBUaGUgTWljcm9zb2Z0IFZpc3VhbCBDIGNvbXBpbGVyIGRvZXMgc3RyaW5nIHBvb2xpbmcgYnkKLQkgICAgIGhhc2hpbmcgdGhlIGNvbnN0YW50cyB0byBhbiBpbnRlcm5hbCBzeW1ib2wgbmFtZSwgYW5kCi0JICAgICByZWx5aW5nIG9uIHRoZSB0aGUgbGlua2VyIGNvbWRhdCBzdXBwb3J0IHRvIGRpc2NhcmQKLQkgICAgIGR1cGxpY2F0ZSBuYW1lcy4gIEhvd2V2ZXIsIGlmIG9uZSBzdHJpbmcgaXMgYSBsaXRlcmFsIGFuZAotCSAgICAgb25lIGlzIGEgZGF0YSBpbml0aWFsaXplciwgb25lIHdpbGwgZW5kIHVwIGluIHRoZSAuZGF0YQotCSAgICAgc2VjdGlvbiBhbmQgb25lIHdpbGwgZW5kIHVwIGluIHRoZSAucmRhdGEgc2VjdGlvbi4gIFRoZQotCSAgICAgTWljcm9zb2Z0IGxpbmtlciB3aWxsIGNvbWJpbmUgdGhlbSBpbnRvIHRoZSAuZGF0YQotCSAgICAgc2VjdGlvbiwgd2hpY2ggc2VlbXMgdG8gYmUgd3Jvbmcgc2luY2UgaXQgbWlnaHQgY2F1c2UgdGhlCi0JICAgICBsaXRlcmFsIHRvIGNoYW5nZS4KLQotCSAgICAgQXMgbG9uZyBhcyB0aGVyZSBhcmUgbm8gZXh0ZXJuYWwgcmVmZXJlbmNlcyB0byB0aGUKLQkgICAgIHN5bWJvbHMsIHdoaWNoIHRoZXJlIHNob3VsZG4ndCBiZSwgd2UgY2FuIHRyZWF0IHRoZSAuZGF0YQotCSAgICAgYW5kIC5yZGF0YSBpbnN0YW5jZXMgYXMgc2VwYXJhdGUgc3ltYm9scy4gIFRoZSBjb21kYXQKLQkgICAgIGNvZGUgaW4gdGhlIGxpbmtlciB3aWxsIGRvIHRoZSBhcHByb3ByaWF0ZSBtZXJnaW5nLiAgSGVyZQotCSAgICAgd2UgYXZvaWQgZ2V0dGluZyBhIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3IgZm9yIG9uZSBvZgotCSAgICAgdGhlc2Ugc3BlY2lhbCBzeW1ib2xzLgotCi0JICAgICBGSVhNRTogSSBkb24ndCB0aGluayB0aGlzIHdpbGwgd29yayBpbiB0aGUgY2FzZSB3aGVyZQotCSAgICAgdGhlcmUgYXJlIHR3byBvYmplY3QgZmlsZXMgd2hpY2ggdXNlIHRoZSBjb25zdGFudHMgYXMgYQotCSAgICAgbGl0ZXJhbCBhbmQgdHdvIG9iamVjdCBmaWxlcyB3aGljaCB1c2UgaXQgYXMgYSBkYXRhCi0JICAgICBpbml0aWFsaXplci4gIE9uZSBvciB0aGUgb3RoZXIgb2YgdGhlIHNlY29uZCBvYmplY3QgZmlsZXMKLQkgICAgIGlzIGdvaW5nIHRvIHdpbmQgdXAgd2l0aCBhbiBpbmFwcHJvcHJpYXRlIHJlZmVyZW5jZS4gICovCi0JICBpZiAob2JqX3BlIChhYmZkKQotCSAgICAgICYmIChjbGFzc2lmaWNhdGlvbiA9PSBDT0ZGX1NZTUJPTF9HTE9CQUwKLQkJICB8fCBjbGFzc2lmaWNhdGlvbiA9PSBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OKQotCSAgICAgICYmIHNlY3Rpb24tPmNvbWRhdCAhPSBOVUxMCi0JICAgICAgJiYgc3RybmNtcCAobmFtZSwgIj8/XyIsIDMpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKG5hbWUsIHNlY3Rpb24tPmNvbWRhdC0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICgqc3ltX2hhc2ggPT0gTlVMTCkKLQkJKnN5bV9oYXNoID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgbmFtZSwgZmFsc2UsIGNvcHksIGZhbHNlKTsKLQkgICAgICBpZiAoKnN5bV9oYXNoICE9IE5VTEwKLQkJICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPmNvbWRhdCAhPSBOVUxMCi0JCSAgJiYgc3RyY21wICgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5jb21kYXQtPm5hbWUsCi0JCQkgICAgIHNlY3Rpb24tPmNvbWRhdC0+bmFtZSkgPT0gMCkKLQkJYWRkaXQgPSBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoYWRkaXQpCi0JICAgIHsKLQkgICAgICBpZiAoISAoYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbAotCQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwsIGNvcHksIGZhbHNlLAotCQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIGlmIChvYmpfcGUgKGFiZmQpICYmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQkgICAgKCpzeW1faGFzaCktPmNvZmZfbGlua19oYXNoX2ZsYWdzIHw9Ci0JICAgICAgQ09GRl9MSU5LX0hBU0hfUEVfU0VDVElPTl9TWU1CT0w7Ci0KLQkgIC8qIExpbWl0IHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sIHRvIHRoZSBwb3NzaWJsZQotICAgICAgICAgICAgIGFsaWdubWVudCBvZiBhIHNlY3Rpb24uICBUaGVyZSBpcyBubyBwb2ludCB0byBwZXJtaXR0aW5nCi0gICAgICAgICAgICAgYSBoaWdoZXIgYWxpZ25tZW50IGZvciBhIGNvbW1vbiBzeW1ib2w6IHdlIGNhbiBub3QKLSAgICAgICAgICAgICBndWFyYW50ZWUgaXQsIGFuZCBpdCBtYXkgY2F1c2UgdXMgdG8gYWxsb2NhdGUgZXh0cmEgc3BhY2UKLSAgICAgICAgICAgICBpbiB0aGUgY29tbW9uIHNlY3Rpb24uICAqLwotCSAgaWYgKHNlY3Rpb24gPT0gYmZkX2NvbV9zZWN0aW9uX3B0cgotCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAmJiAoKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgotCQkgID4gYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlciAoYWJmZCkpKQotCSAgICAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyCi0JICAgICAgPSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyIChhYmZkKTsKLQotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKSkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW55IHN5bWJvbCBpbmZvcm1hdGlvbiBjdXJyZW50bHkgaW4KLSAgICAgICAgICAgICAgICAgdGhlIGhhc2ggdGFibGUsIG9yIGlmIHdlIGFyZSBsb29raW5nIGF0IGEgc3ltYm9sCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIHRoZW4gdXBkYXRlIHRoZSBzeW1ib2wgY2xhc3MgYW5kIHR5cGUgaW4KLSAgICAgICAgICAgICAgICAgdGhlIGhhc2ggdGFibGUuICAqLwotICAJICAgICAgaWYgKCgoKnN5bV9oYXNoKS0+Y2xhc3MgPT0gQ19OVUxMCi0gIAkJICAgJiYgKCpzeW1faGFzaCktPnR5cGUgPT0gVF9OVUxMKQotICAJCSAgfHwgc3ltLm5fc2NudW0gIT0gMAotICAJCSAgfHwgKHN5bS5uX3ZhbHVlICE9IDAKLSAgCQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAJCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgCQl7Ci0gIAkJICAoKnN5bV9oYXNoKS0+Y2xhc3MgPSBzeW0ubl9zY2xhc3M7Ci0gIAkJICBpZiAoc3ltLm5fdHlwZSAhPSBUX05VTEwpCi0gIAkJICAgIHsKLSAgCQkgICAgICAvKiBXZSB3YW50IHRvIHdhcm4gaWYgdGhlIHR5cGUgY2hhbmdlZCwgYnV0IG5vdAotICAJCQkgaWYgaXQgY2hhbmdlZCBmcm9tIGFuIHVuc3BlY2lmaWVkIHR5cGUuCi0gIAkJCSBUZXN0aW5nIHRoZSB3aG9sZSB0eXBlIGJ5dGUgbWF5IHdvcmssIGJ1dCB0aGUKLSAgCQkJIGNoYW5nZSBmcm9tIChlLmcuKSBhIGZ1bmN0aW9uIG9mIHVuc3BlY2lmaWVkCi0gIAkJCSB0eXBlIHRvIGZ1bmN0aW9uIG9mIGtub3duIHR5cGUgYWxzbyB3YW50cyB0bwotICAJCQkgc2tpcCB0aGUgd2FybmluZy4gICovCi0gIAkJICAgICAgaWYgKCgqc3ltX2hhc2gpLT50eXBlICE9IFRfTlVMTAotICAJCQkgICYmICgqc3ltX2hhc2gpLT50eXBlICE9IHN5bS5uX3R5cGUKLSAgCQkgICAgICAgICAgJiYgIShEVFlQRSAoKCpzeW1faGFzaCktPnR5cGUpID09IERUWVBFIChzeW0ubl90eXBlKQotICAJCSAgICAgICAgICAgICAgICYmIChCVFlQRSAoKCpzeW1faGFzaCktPnR5cGUpID09IFRfTlVMTAotICAJCSAgICAgICAgICAgICAgICAgICB8fCBCVFlQRSAoc3ltLm5fdHlwZSkgPT0gVF9OVUxMKSkpCi0gIAkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAJCQkgIChfKCJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIpLAotICAJCQkgICBuYW1lLCAoKnN5bV9oYXNoKS0+dHlwZSwgc3ltLm5fdHlwZSwKLSAgCQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIAkJICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgZnJvbSBhIG1lYW5pbmdmdWwKLSAgCQkJIGJhc2UgdHlwZSB0byBhIG51bGwgb25lLCBidXQgaWYgd2Uga25vdwotICAJCQkgbm90aGluZywgdGFrZSB3aGF0IGxpdHRsZSB3ZSBtaWdodCBub3cga25vdy4gICovCi0gIAkJICAgICAgaWYgKEJUWVBFIChzeW0ubl90eXBlKSAhPSBUX05VTEwKLSAgCQkJICB8fCAoKnN5bV9oYXNoKS0+dHlwZSA9PSBUX05VTEwpCi0JCQkoKnN5bV9oYXNoKS0+dHlwZSA9IHN5bS5uX3R5cGU7Ci0gIAkJICAgIH0KLSAgCQkgICgqc3ltX2hhc2gpLT5hdXhiZmQgPSBhYmZkOwotCQkgIGlmIChzeW0ubl9udW1hdXggIT0gMCkKLQkJICAgIHsKLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphbGxvYzsKLQkJICAgICAgdW5zaWduZWQgaW50IGk7Ci0JCSAgICAgIGJmZF9ieXRlICplYXV4OwotCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmlhdXg7Ci0KLQkJICAgICAgKCpzeW1faGFzaCktPm51bWF1eCA9IHN5bS5uX251bWF1eDsKLQkJICAgICAgYWxsb2MgPSAoKHVuaW9uIGludGVybmFsX2F1eGVudCAqKQotCQkJICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCQkgIChzeW0ubl9udW1hdXgKLQkJCQkJCSAgICogc2l6ZW9mICgqYWxsb2MpKSkpOwotCQkgICAgICBpZiAoYWxsb2MgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBmb3IgKGkgPSAwLCBlYXV4ID0gZXN5bSArIHN5bWVzeiwgaWF1eCA9IGFsbG9jOwotCQkJICAgaSA8IHN5bS5uX251bWF1eDsKLQkJCSAgIGkrKywgZWF1eCArPSBzeW1lc3osIGlhdXgrKykKLQkJCWJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSBlYXV4LCBzeW0ubl90eXBlLAotCQkJCQkgICAgICBzeW0ubl9zY2xhc3MsIGksIHN5bS5uX251bWF1eCwKLQkJCQkJICAgICAgKFBUUikgaWF1eCk7Ci0JCSAgICAgICgqc3ltX2hhc2gpLT5hdXggPSBhbGxvYzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChjbGFzc2lmaWNhdGlvbiA9PSBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OCi0JICAgICAgJiYgKCpzeW1faGFzaCktPm51bWF1eCAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogU29tZSBQRSBzZWN0aW9ucyAoc3VjaCBhcyAuYnNzKSBoYXZlIGEgemVybyBzaXplIGluCi0gICAgICAgICAgICAgICAgIHRoZSBzZWN0aW9uIGhlYWRlciwgYnV0IGEgbm9uLXplcm8gc2l6ZSBpbiB0aGUgQVVYCi0gICAgICAgICAgICAgICAgIHJlY29yZC4gIENvcnJlY3QgdGhhdCBoZXJlLgotCi0JCSBGSVhNRTogVGhpcyBpcyBub3QgYXQgYWxsIHRoZSByaWdodCBwbGFjZSB0byBkbyB0aGlzLgotCQkgRm9yIGV4YW1wbGUsIGl0IHdvbid0IGhlbHAgb2JqZHVtcC4gIFRoaXMgbmVlZHMgdG8gYmUKLQkJIGRvbmUgd2hlbiB3ZSBzd2FwIGluIHRoZSBzZWN0aW9uIGhlYWRlci4gICovCi0KLQkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+bnVtYXV4ID09IDEpOwotCSAgICAgIGlmIChzZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKLQkJc2VjdGlvbi0+X3Jhd19zaXplID0gKCpzeW1faGFzaCktPmF1eFswXS54X3Njbi54X3NjbmxlbjsKLQotCSAgICAgIC8qIEZJWE1FOiBXZSBjb3VsZCB0ZXN0IHdoZXRoZXIgdGhlIHNlY3Rpb24gc2l6ZXMKLSAgICAgICAgICAgICAgICAgbWF0Y2hlcyB0aGUgc2l6ZSBpbiB0aGUgYXV4IGVudHJ5LCBidXQgYXBwYXJlbnRseQotICAgICAgICAgICAgICAgICB0aGF0IHNvbWV0aW1lcyBmYWlscyB1bmV4cGVjdGVkbHkuICAqLwotCSAgICB9Ci0JfQotCi0gICAgICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICAgIHN5bV9oYXNoICs9IHN5bS5uX251bWF1eCArIDE7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBub24tdHJhZGl0aW9uYWwsIG5vbi1yZWxvY2F0ZWFibGUgbGluaywgdHJ5IHRvCi0gICAgIG9wdGltaXplIHRoZSBoYW5kbGluZyBvZiBhbnkgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgaW5mby0+dHJhZGl0aW9uYWxfZm9ybWF0Ci0gICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkKLSAgICAgICYmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfZGVidWdnZXIpKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdGFiLCAqc3RhYnN0cjsKLQotICAgICAgc3RhYiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKLSAgICAgIGlmIChzdGFiICE9IE5VTEwpCi0JewotCSAgc3RhYnN0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKLQotCSAgaWYgKHN0YWJzdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0JICAgICAgc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjZGF0YTsKLQotCSAgICAgIHNlY2RhdGEgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc3RhYik7Ci0JICAgICAgaWYgKHNlY2RhdGEgPT0gTlVMTCkKLQkJewotCQkgIHN0YWItPnVzZWRfYnlfYmZkID0KLQkJICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JCSAgaWYgKHN0YWItPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzZWNkYXRhID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHN0YWIpOwotCQl9Ci0KLQkgICAgICB0YWJsZSA9IGNvZmZfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLQkgICAgICBpZiAoISBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyAoYWJmZCwgJnRhYmxlLT5zdGFiX2luZm8sCi0JCQkJCSAgICAgc3RhYiwgc3RhYnN0ciwKLQkJCQkJICAgICAmc2VjZGF0YS0+c3RhYl9pbmZvKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSBrZWVwX3N5bXM7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSBrZWVwX3N5bXM7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIERvIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyBmaW5mbzsKLSAgYm9vbGVhbiBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQ7Ci0gIGJvb2xlYW4gbG9uZ19zZWN0aW9uX25hbWVzOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzaXplX3QgbWF4X3N5bV9jb3VudDsKLSAgc2l6ZV90IG1heF9saW5lbm9fY291bnQ7Ci0gIHNpemVfdCBtYXhfcmVsb2NfY291bnQ7Ci0gIHNpemVfdCBtYXhfb3V0cHV0X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X2NvbnRlbnRzX3NpemU7Ci0gIGZpbGVfcHRyIHJlbF9maWxlcG9zOwotICB1bnNpZ25lZCBpbnQgcmVsc3o7Ci0gIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IGxpbmVzejsKLSAgYmZkICpzdWI7Ci0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBjaGFyIHN0cmJ1ZltTVFJJTkdfU0laRV9TSVpFXTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotCi0gIGZpbmZvLmluZm8gPSBpbmZvOwotICBmaW5mby5vdXRwdXRfYmZkID0gYWJmZDsKLSAgZmluZm8uc3RydGFiID0gTlVMTDsKLSAgZmluZm8uc2VjdGlvbl9pbmZvID0gTlVMTDsKLSAgZmluZm8ubGFzdF9maWxlX2luZGV4ID0gLTE7Ci0gIGZpbmZvLmxhc3RfYmZfaW5kZXggPSAtMTsKLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKLSAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOwotICBmaW5mby5vdXRzeW1zID0gTlVMTDsKLSAgZmluZm8ubGluZW5vcyA9IE5VTEw7Ci0gIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgZmluZm8uZ2xvYmFsX3RvX3N0YXRpYyA9IGZhbHNlOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSBmYWxzZTsKLQotICBjb2ZmX2RhdGEgKGFiZmQpLT5saW5rX2luZm8gPSBpbmZvOwotCi0gIGZpbmZvLnN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChmaW5mby5zdHJ0YWIgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCAoJmZpbmZvLmRlYnVnX21lcmdlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgZGVidWdfbWVyZ2VfYWxsb2NhdGVkID0gdHJ1ZTsKLQotICAvKiBDb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVycyBhbmQgcmVsb2NhdGlvbiBlbnRyaWVzIHJlcXVpcmVkIGZvciB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBTZXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgcmVsb2NzLiAgKi8KLSAgcmVsX2ZpbGVwb3MgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0gIG1heF9jb250ZW50c19zaXplID0gMDsKLSAgbWF4X2xpbmVub19jb3VudCA9IDA7Ci0gIG1heF9yZWxvY19jb3VudCA9IDA7Ci0KLSAgbG9uZ19zZWN0aW9uX25hbWVzID0gZmFsc2U7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JICAgICAgLyogTWFyayBhbGwgc2VjdGlvbnMgd2hpY2ggYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZQotCQkgbGluay4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBldmVyeSBzZWN0aW9uLiAgV2UgbmVlZAotCQkgdG8gZG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBpZGVudGlmeSBhbnkgc2VjdGlvbnMgd2hpY2gKLQkJIHRoZSBsaW5rZXIgaGFzIGRlY2lkZWQgdG8gbm90IGluY2x1ZGUuICAqLwotCSAgICAgIHNlYy0+bGlua2VyX21hcmsgPSB0cnVlOwotCi0JICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUKLQkJICB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCQlvLT5saW5lbm9fY291bnQgKz0gc2VjLT5saW5lbm9fY291bnQ7Ci0KLQkgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCQlvLT5yZWxvY19jb3VudCArPSBzZWMtPnJlbG9jX2NvdW50OwotCi0JICAgICAgaWYgKHNlYy0+X3Jhd19zaXplID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JCW1heF9jb250ZW50c19zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0JICAgICAgaWYgKHNlYy0+bGluZW5vX2NvdW50ID4gbWF4X2xpbmVub19jb3VudCkKLQkJbWF4X2xpbmVub19jb3VudCA9IHNlYy0+bGluZW5vX2NvdW50OwotCSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID4gbWF4X3JlbG9jX2NvdW50KQotCQltYXhfcmVsb2NfY291bnQgPSBzZWMtPnJlbG9jX2NvdW50OwotCSAgICB9Ci0JICBlbHNlIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAgJiYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpKQotCSAgICArK28tPnJlbG9jX2NvdW50OwotCX0KLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCA9PSAwKQotCW8tPnJlbF9maWxlcG9zID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JICBvLT5yZWxfZmlsZXBvcyA9IHJlbF9maWxlcG9zOwotCSAgcmVsX2ZpbGVwb3MgKz0gby0+cmVsb2NfY291bnQgKiByZWxzejsKLQl9Ci0KLSAgICAgIGlmIChiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgKGFiZmQpCi0JICAmJiBzdHJsZW4gKG8tPm5hbWUpID4gU0NOTk1MRU4pCi0JewotCSAgLyogVGhpcyBzZWN0aW9uIGhhcyBhIGxvbmcgbmFtZSB3aGljaCBtdXN0IGdvIGluIHRoZSBzdHJpbmcKLSAgICAgICAgICAgICB0YWJsZS4gIFRoaXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBjb2RlIGluCi0gICAgICAgICAgICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgd2hpY2ggcHV0cyB0aGUgc3RyaW5nIGluZGV4Ci0gICAgICAgICAgICAgaW50byB0aGUgc19uYW1lIGZpZWxkIG9mIHRoZSBzZWN0aW9uIGhlYWRlci4gIFRoYXQgaXMgd2h5Ci0gICAgICAgICAgICAgd2UgcGFzcyBoYXNoIGFzIGZhbHNlLiAgKi8KLQkgIGlmIChfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLnN0cnRhYiwgby0+bmFtZSwgZmFsc2UsIGZhbHNlKQotCSAgICAgID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBsb25nX3NlY3Rpb25fbmFtZXMgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwb2ludGVycyB3ZQotICAgICBuZWVkIHRvIGtlZXAuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICAvKiBXZSB1c2Ugc2VjdGlvbl9jb3VudCArIDEsIHJhdGhlciB0aGFuIHNlY3Rpb25fY291bnQsIGJlY2F1c2UKLSAgICAgICAgIHRoZSB0YXJnZXRfaW5kZXggZmllbGRzIGFyZSAxIGJhc2VkLiAgKi8KLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9Ci0JKChzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqKQotCSBiZmRfbWFsbG9jICgoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpCi0JCSAgICAgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvKSkpOwotICAgICAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZm9yIChpID0gMDsgaSA8PSBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyA9IE5VTEw7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICAvKiBXZSBub3cga25vdyB0aGUgc2l6ZSBvZiB0aGUgcmVsb2NzLCBzbyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBmaWxlCi0gICAgIHBvc2l0aW9ucyBvZiB0aGUgbGluZSBudW1iZXJzLiAgKi8KLSAgbGluZV9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSAwOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoby0+bGluZW5vX2NvdW50ID09IDApCi0Jby0+bGluZV9maWxlcG9zID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvLT5saW5lX2ZpbGVwb3MgPSBsaW5lX2ZpbGVwb3M7Ci0JICBsaW5lX2ZpbGVwb3MgKz0gby0+bGluZW5vX2NvdW50ICogbGluZXN6OwotCX0KLQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ICE9IDApCi0JewotCSAgLyogV2UgZG9uJ3Qga25vdyB0aGUgaW5kaWNlcyBvZiBnbG9iYWwgc3ltYm9scyB1bnRpbCB3ZSBoYXZlCi0gICAgICAgICAgICAgd3JpdHRlbiBvdXQgYWxsIHRoZSBsb2NhbCBzeW1ib2xzLiAgRm9yIGVhY2ggc2VjdGlvbiBpbgotICAgICAgICAgICAgIHRoZSBvdXRwdXQgZmlsZSwgd2Uga2VlcCBhbiBhcnJheSBvZiBwb2ludGVycyB0byBoYXNoCi0gICAgICAgICAgICAgdGFibGUgZW50cmllcy4gIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGEKLSAgICAgICAgICAgICByZWxvYy4gIFdoZW4gd2UgZmluZCBhIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCB3ZQotICAgICAgICAgICAgIHNldCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGlzIGFycmF5IHNvIHRoYXQgd2UgY2FuCi0gICAgICAgICAgICAgZml4IHVwIHRoZSBzeW1ib2wgaW5kZXggYWZ0ZXIgd2UgaGF2ZSB3cml0dGVuIG91dCBhbGwgdGhlCi0gICAgICAgICAgICAgbG9jYWwgc3ltYm9scy4KLQotCSAgICAgQmVjYXVzZSBvZiB0aGlzIHByb2JsZW0sIHdlIGFsc28ga2VlcCB0aGUgcmVsb2NzIGluCi0JICAgICBtZW1vcnkgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluay4gIFRoaXMgd2FzdGVzIG1lbW9yeSwKLQkgICAgIGJ1dCBvbmx5IHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2hpY2ggaXMgbm90IHRoZQotCSAgICAgY29tbW9uIGNhc2UuICAqLwotCSAgQkZEX0FTU0VSVCAoaW5mby0+cmVsb2NhdGVhYmxlKTsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9Ci0JICAgICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9Ci0JICAgICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID09IE5VTEwKLQkgICAgICB8fCBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50KQotCSAgICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gby0+cmVsb2NfY291bnQ7Ci0JfQotCi0gICAgICAvKiBSZXNldCB0aGUgcmVsb2MgYW5kIGxpbmVubyBjb3VudHMsIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIHRvCi0JIGNvdW50IHRoZSBudW1iZXIgb2YgZW50cmllcyB3ZSBoYXZlIG91dHB1dCBzbyBmYXIuICAqLwotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IGxpbmVfZmlsZXBvczsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBsYXJnZXN0IG51bWJlciBvZiBzeW1ib2xzIGluIGFuIGlucHV0IEJGRC4gIFRha2UKLSAgICAgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFyIHRoZSBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkcyBvZiBhbGwgdGhlCi0gICAgIGlucHV0IEJGRCdzLiAgKi8KLSAgbWF4X3N5bV9jb3VudCA9IDA7Ci0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIHNpemVfdCBzejsKLQotICAgICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gICAgICBzeiA9IG9ial9yYXdfc3ltZW50X2NvdW50IChzdWIpOwotICAgICAgaWYgKHN6ID4gbWF4X3N5bV9jb3VudCkKLQltYXhfc3ltX2NvdW50ID0gc3o7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNvbWUgYnVmZmVycyB1c2VkIHdoaWxlIGxpbmtpbmcuICAqLwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gKChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpKSk7Ci0gIGZpbmZvLnNlY19wdHJzID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJCSAgICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgZmluZm8uc3ltX2luZGljZXMgPSAobG9uZyAqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChsb25nKSk7Ci0gIGZpbmZvLm91dHN5bXMgPSAoKGJmZF9ieXRlICopCi0JCSAgIGJmZF9tYWxsb2MgKChzaXplX3QpICgobWF4X3N5bV9jb3VudCArIDEpICogc3ltZXN6KSkpOwotICBmaW5mby5saW5lbm9zID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9saW5lbm9fY291bnQKLQkJCQkgICAgICAgKiBiZmRfY29mZl9saW5lc3ogKGFiZmQpKTsKLSAgZmluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2NvbnRlbnRzX3NpemUpOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X3JlbG9jX2NvdW50ICogcmVsc3opOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkJCSAgICAgYmZkX21hbGxvYyAobWF4X3JlbG9jX2NvdW50Ci0JCQkJCSAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotICBpZiAoKGZpbmZvLmludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5zZWNfcHRycyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnN5bV9pbmRpY2VzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCBmaW5mby5vdXRzeW1zID09IE5VTEwKLSAgICAgIHx8IChmaW5mby5saW5lbm9zID09IE5VTEwgJiYgbWF4X2xpbmVub19jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSA+IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkKLSAgICAgIHx8ICghIGluZm8tPnJlbG9jYXRlYWJsZQotCSAgJiYgZmluZm8uaW50ZXJuYWxfcmVsb2NzID09IE5VTEwKLQkgICYmIG1heF9yZWxvY19jb3VudCA+IDApKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBwb3NpdGlvbiBvZiBldmVyeXRoaW5nIGluIHRoZSBmaWxlLCBleGNlcHQgdGhhdAotICAgICB3ZSBkb24ndCBrbm93IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdGFibGUgYW5kIHRoZXJlZm9yZSB3ZSBkb24ndAotICAgICBrbm93IHdoZXJlIHRoZSBzdHJpbmcgdGFibGUgc3RhcnRzLiAgV2UganVzdCBidWlsZCB0aGUgc3RyaW5nCi0gICAgIHRhYmxlIGluIG1lbW9yeSBhcyB3ZSBnbyBhbG9uZy4gIFdlIHByb2Nlc3MgYWxsIHRoZSByZWxvY2F0aW9ucwotICAgICBmb3IgYSBzaW5nbGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gMDsKLQotICBpZiAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaykKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBzdWIgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGlmICghIGJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biAoc3ViLCAmIGZpbmZvKSkKLQkJewotCQkgIGlmICghIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBzdWIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgJmZpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICghIGJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCAoYWJmZCwgJiBmaW5mbykpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIAotICAvKiBGcmVlIHVwIHRoZSBidWZmZXJzIHVzZWQgYnkgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQotICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSAoJmZpbmZvLmRlYnVnX21lcmdlKTsKLSAgZGVidWdfbWVyZ2VfYWxsb2NhdGVkID0gZmFsc2U7Ci0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgICAgIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLnNlY19wdHJzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uc2VjX3B0cnMpOwotICAgICAgZmluZm8uc2VjX3B0cnMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICAgICAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKLSAgICAgIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICAgICAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gICAgICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3JlbG9jcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc3ltYm9sCi0gICAgIGluZGV4IG9mIHRoZSBmaXJzdCBleHRlcm5hbCBzeW1ib2wuICBXcml0ZSBpdCBvdXQgYWdhaW4gaWYKLSAgICAgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGZpbmZvLmxhc3RfZmlsZV9pbmRleCAhPSAtMQotICAgICAgJiYgKHVuc2lnbmVkIGludCkgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgIT0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpKQotICAgIHsKLSAgICAgIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmZmluZm8ubGFzdF9maWxlLAotCQkJICAgICAoUFRSKSBmaW5mby5vdXRzeW1zKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSAgICAgKyBmaW5mby5sYXN0X2ZpbGVfaW5kZXggKiBzeW1lc3opLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoZmluZm8ub3V0c3ltcywgc3ltZXN6LCAxLCBhYmZkKSAhPSBzeW1lc3opCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiBkb2luZyB0YXNrIGxpbmtpbmcgKGxkIC0tdGFzay1saW5rKSB0aGVuIG1ha2UgYSBwYXNzIHRocm91Z2ggdGhlCi0gICAgIGdsb2JhbCBzeW1ib2xzLCB3cml0aW5nIG91dCBhbnkgdGhhdCBhcmUgZGVmaW5lZCwgYW5kIG1ha2luZyB0aGVtCi0gICAgIHN0YXRpYy4gKi8KLSAgaWYgKGluZm8tPnRhc2tfbGluaykKLSAgICB7Ci0gICAgICBmaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgICAgIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzLAotCQkJICAgICAgIChQVFIpICZmaW5mbyk7Ci0gICAgICBpZiAoZmluZm8uZmFpbGVkKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGdsb2JhbCBzeW1ib2xzLiAgKi8KLSAgZmluZm8uZmFpbGVkID0gZmFsc2U7Ci0gIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSwKLQkJCSAgIChQVFIpICZmaW5mbyk7Ci0gIGlmIChmaW5mby5mYWlsZWQpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIG91dHN5bXMgYnVmZmVyIGlzIHVzZWQgYnkgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0uICAqLwotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICAgICAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgJiYgbWF4X291dHB1dF9yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgLyogTm93IHRoYXQgd2UgaGF2ZSB3cml0dGVuIG91dCBhbGwgdGhlIGdsb2JhbCBzeW1ib2xzLCB3ZSBrbm93Ci0JIHRoZSBzeW1ib2wgaW5kaWNlcyB0byB1c2UgZm9yIHJlbG9jcyBhZ2FpbnN0IHRoZW0sIGFuZCB3ZSBjYW4KLQkgZmluYWxseSB3cml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0gICAgICBleHRlcm5hbF9yZWxvY3MgPSAoKGJmZF9ieXRlICopCi0JCQkgYmZkX21hbGxvYyAobWF4X291dHB1dF9yZWxvY19jb3VudCAqIHJlbHN6KSk7Ci0gICAgICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbGVuZDsKLQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotCSAgYmZkX2J5dGUgKmVyZWw7Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgaXJlbCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLQkgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0JICByZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXM7Ci0JICBlcmVsID0gZXh0ZXJuYWxfcmVsb2NzOwotCSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyssIHJlbF9oYXNoKyssIGVyZWwgKz0gcmVsc3opCi0JICAgIHsKLQkgICAgICBpZiAoKnJlbF9oYXNoICE9IE5VTEwpCi0JCXsKLQkJICBCRkRfQVNTRVJUICgoKnJlbF9oYXNoKS0+aW5keCA+PSAwKTsKLQkJICBpcmVsLT5yX3N5bW5keCA9ICgqcmVsX2hhc2gpLT5pbmR4OwotCQl9Ci0JICAgICAgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIChQVFIpIGlyZWwsIChQVFIpIGVyZWwpOwotCSAgICB9Ci0KLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgby0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3dyaXRlICgoUFRSKSBleHRlcm5hbF9yZWxvY3MsIHJlbHN6LCBvLT5yZWxvY19jb3VudCwKLQkJCSAgICBhYmZkKSAhPSByZWxzeiAqIG8tPnJlbG9jX2NvdW50KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICAvKiBGcmVlIHVwIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBvcHRpbWl6ZWQgc3RhYnMgc3RyaW5ncywgb3V0cHV0IHRoZW0uICAqLwotICBpZiAoY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgKGFiZmQsICZjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICE9IDAgfHwgbG9uZ19zZWN0aW9uX25hbWVzKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSAgICAgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3opLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsCi0JCSAgICBfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zdHJ0YWIpICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzdHJidWYpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLSAgICAgIGlmIChiZmRfd3JpdGUgKHN0cmJ1ZiwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkgIT0gU1RSSU5HX1NJWkVfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotCi0gIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCi0gICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZGVidWdfbWVyZ2VfYWxsb2NhdGVkKQotICAgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOwotICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLnNlY19wdHJzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjX3B0cnMpOwotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBwYXJzZSBvdXQgYSAtaGVhcCA8cmVzZXJ2ZWQ+LDxjb21taXQ+IGxpbmUgKi8KLQotc3RhdGljIGNoYXIgKgotZG9yZXNfY29tIChwdHIsIG91dHB1dF9iZmQsIGhlYXApCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBpbnQgaGVhcDsKLXsKLSAgaWYgKGNvZmZfZGF0YShvdXRwdXRfYmZkKS0+cGUpIAotICAgIHsKLSAgICAgIGludCB2YWwgPSBzdHJ0b3VsIChwdHIsICZwdHIsIDApOwotICAgICAgaWYgKGhlYXApCi0JcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLlNpemVPZkhlYXBSZXNlcnZlID12YWw7Ci0gICAgICBlbHNlCi0JcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLlNpemVPZlN0YWNrUmVzZXJ2ZSA9dmFsOwotCi0gICAgICBpZiAocHRyWzBdID09ICcsJykgCi0JewotCSAgaW50IHZhbCA9IHN0cnRvdWwgKHB0cisxLCAmcHRyLCAwKTsKLQkgIGlmIChoZWFwKQotCSAgICBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuU2l6ZU9mSGVhcENvbW1pdCA9dmFsOwotCSAgZWxzZQotCSAgICBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuU2l6ZU9mU3RhY2tDb21taXQgPXZhbDsKLQl9Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi1zdGF0aWMgY2hhciAqZ2V0X25hbWUocHRyLCBkc3QpCi1jaGFyICpwdHI7Ci1jaGFyICoqZHN0OwotewotICB3aGlsZSAoKnB0ciA9PSAnICcpCi0gICAgcHRyKys7Ci0gICpkc3QgPSBwdHI7Ci0gIHdoaWxlICgqcHRyICYmICpwdHIgIT0gJyAnKQotICAgIHB0cisrOwotICAqcHRyID0gMDsKLSAgcmV0dXJuIHB0cisxOwotfQotCi0vKiBQcm9jZXNzIGFueSBtYWdpYyBlbWJlZGRlZCBjb21tYW5kcyBpbiBhIHNlY3Rpb24gY2FsbGVkIC5kcmVjdHZlICovCi0JCQkKLXN0YXRpYyBpbnQKLXByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMgKG91dHB1dF9iZmQsIGluZm8sICBhYmZkKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRyZWN0dmUiKTsKLSAgY2hhciAqczsKLSAgY2hhciAqZTsKLSAgY2hhciAqY29weTsKLSAgaWYgKCFzZWMpIAotICAgIHJldHVybiAxOwotICAKLSAgY29weSA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHNlYy0+X3Jhd19zaXplKTsKLSAgaWYgKCFjb3B5KSAKLSAgICByZXR1cm4gMDsKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKGFiZmQsIHNlYywgY29weSwgMCwgc2VjLT5fcmF3X3NpemUpKSAKLSAgICB7Ci0gICAgICBmcmVlIChjb3B5KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZSA9IGNvcHkgKyBzZWMtPl9yYXdfc2l6ZTsKLSAgZm9yIChzID0gY29weTsgIHMgPCBlIDsgKSAKLSAgICB7Ci0gICAgICBpZiAoc1swXSE9ICctJykgewotCXMrKzsKLQljb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChzdHJuY21wIChzLCItYXR0ciIsIDUpID09IDApCi0JewotCSAgY2hhciAqbmFtZTsKLQkgIGNoYXIgKmF0dHJpYnM7Ci0JICBhc2VjdGlvbiAqYXNlYzsKLQotCSAgaW50IGxvb3AgPSAxOwotCSAgaW50IGhhZF93cml0ZSA9IDA7Ci0JICBpbnQgaGFkX3JlYWQgPSAwOwotCSAgaW50IGhhZF9leGVjPSAwOwotCSAgaW50IGhhZF9zaGFyZWQ9IDA7Ci0JICBzICs9IDU7Ci0JICBzID0gZ2V0X25hbWUocywgJm5hbWUpOwotCSAgcyA9IGdldF9uYW1lKHMsICZhdHRyaWJzKTsKLQkgIHdoaWxlIChsb29wKSB7Ci0JICAgIHN3aXRjaCAoKmF0dHJpYnMrKykgCi0JICAgICAgewotCSAgICAgIGNhc2UgJ1cnOgotCQloYWRfd3JpdGUgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICdSJzoKLQkJaGFkX3JlYWQgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICdTJzoKLQkJaGFkX3NoYXJlZCA9IDE7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJ1gnOgotCQloYWRfZXhlYyA9IDE7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWxvb3AgPSAwOwotCSAgICAgIH0KLQkgIH0KLQkgIGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoYXNlYykgewotCSAgICBpZiAoaGFkX2V4ZWMpCi0JICAgICAgYXNlYy0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JICAgIGlmICghaGFkX3dyaXRlKQotCSAgICAgIGFzZWMtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQkgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChzLCItaGVhcCIsIDUpID09IDApCi0JewotCSAgcyA9IGRvcmVzX2NvbSAocys1LCBvdXRwdXRfYmZkLCAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChzLCItc3RhY2siLCA2KSA9PSAwKQotCXsKLQkgIHMgPSBkb3Jlc19jb20gKHMrNiwgb3V0cHV0X2JmZCwgMCk7Ci0JfQotICAgICAgZWxzZSAKLQlzKys7Ci0gICAgfQotICBmcmVlIChjb3B5KTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFBsYWNlIGEgbWFya2VyIGFnYWluc3QgYWxsIHN5bWJvbHMgd2hpY2ggYXJlIHVzZWQgYnkgcmVsb2NhdGlvbnMuCi0gICBUaGlzIG1hcmtlciBjYW4gYmUgcGlja2VkIHVwIGJ5IHRoZSAnZG8gd2Ugc2tpcCB0aGlzIHN5bWJvbCA/JwotICAgbG9vcCBpbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQoKSBhbmQgdXNlZCB0byBwcmV2ZW50IHNraXBwaW5nCi0gICB0aGF0IHN5bWJvbC4gCi0gICAqLwotCi1zdGF0aWMgdm9pZAotbWFya19yZWxvY3MgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqCWZpbmZvOwotICAgICBiZmQgKiAJCQkJaW5wdXRfYmZkOwotewotICBhc2VjdGlvbiAqIGE7Ci0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGlucHV0X2JmZCkgJiBIQVNfU1lNUykgPT0gMCkKLSAgICByZXR1cm47Ci0gIAotICBmb3IgKGEgPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBhICE9IChhc2VjdGlvbiAqKSBOVUxMOyBhID0gYS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKglpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKglpcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaXJlbGVuZDsKLQotICAgICAgCi0gICAgICBpZiAoKGEtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwIHx8IGEtPnJlbG9jX2NvdW50ICA8IDEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFJlYWQgaW4gdGhlIHJlbG9jcy4gICovCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkoaW5wdXRfYmZkLCBhLCBmYWxzZSwKLQkgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKLQkgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSwKLQkgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKLQkgID8gKGZpbmZvLT5zZWN0aW9uX2luZm9bIGEtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXggXS5yZWxvY3MgKyBhLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpCi0JICA6IGZpbmZvLT5pbnRlcm5hbF9yZWxvY3MpCi0JKTsKLSAgICAgIAotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBpcmVsICAgICA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGlyZWxlbmQgID0gaXJlbCArIGEtPnJlbG9jX2NvdW50OwotCi0gICAgICAvKiBQbGFjZSBhIG1hcmsgaW4gdGhlIHN5bV9pbmRpY2VzIGFycmF5ICh3aG9zZSBlbnRyaWVzIGhhdmUKLQkgYmVlbiBpbml0aWFsaXNlZCB0byAwKSBmb3IgYWxsIG9mIHRoZSBzeW1ib2xzIHRoYXQgYXJlIHVzZWQKLQkgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUuICBUaGlzIHdpbGwgdGhlbiBiZSBwaWNrZWQgdXAgaW4gdGhlCi0JIHNraXAvZG9uJ3QgcGFzcyAqLwotICAgICAgCi0gICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQl7Ci0JICBmaW5mby0+c3ltX2luZGljZXNbIGlyZWwtPnJfc3ltbmR4IF0gPSAtMTsKLQl9Ci0gICAgfQotfQotCi0vKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgotICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgdW5zaWduZWQgaW50IG5fdG1hc2sgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdCA9IGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfbl9idHNoZnQ7Ci0jaWYgMAotICB1bnNpZ25lZCBpbnQgbl9idG1hc2sgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fYnRtYXNrOwotI2VuZGlmCi0gIGJvb2xlYW4gKCphZGp1c3Rfc3ltbmR4KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCi0JCQkJICAgIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCSAgICBib29sZWFuICopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBiZmRfc2l6ZV90eXBlIHN5bWVudF9iYXNlOwotICBib29sZWFuIGNvcHksIGhhc2g7Ci0gIGJmZF9zaXplX3R5cGUgaXN5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBvc3ltZXN6OwotICBiZmRfc2l6ZV90eXBlIGxpbmVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXN5bXA7Ci0gIGFzZWN0aW9uICoqc2VjcHA7Ci0gIGxvbmcgKmluZGV4cDsKLSAgdW5zaWduZWQgbG9uZyBvdXRwdXRfaW5kZXg7Ci0gIGJmZF9ieXRlICpvdXRzeW07Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBhc2VjdGlvbiAqbzsKLQotICAvKiBNb3ZlIGFsbCB0aGUgc3ltYm9scyB0byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgc3RyaW5ncyA9IE5VTEw7Ci0gIHN5bWVudF9iYXNlID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotICBpc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOwotICBvc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChpbnB1dF9iZmQpOwotICBCRkRfQVNTRVJUIChsaW5lc3ogPT0gYmZkX2NvZmZfbGluZXN6IChvdXRwdXRfYmZkKSk7Ci0KLSAgY29weSA9IGZhbHNlOwotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgY29weSA9IHRydWU7Ci0gIGhhc2ggPSB0cnVlOwotICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLSAgICBoYXNoID0gZmFsc2U7Ci0KLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChpbnB1dF9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogaXN5bWVzejsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgc2VjcHAgPSBmaW5mby0+c2VjX3B0cnM7Ci0gIGluZGV4cCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLSAgb3V0cHV0X2luZGV4ID0gc3ltZW50X2Jhc2U7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotCi0gIGlmIChjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLSAgICB7Ci0gICAgICBpZiAoISBwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywgaW5wdXRfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBwZXJmb3JtIHJlbG9jYXRpb25zIGFuZCBhbHNvIHN0cmlwL2Rpc2NhcmQgc29tZSBzeW1ib2xzCi0gICAgIHRoZW4gd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3Qgc3RyaXAvZGlzY2FyZCB0aG9zZSBzeW1ib2xzIHRoYXQgYXJlCi0gICAgIGdvaW5nIHRvIGJlIGludm9sdmVkIGluIHRoZSByZWxvY2F0aW9ucyAqLwotICBpZiAoKCAgIGZpbmZvLT5pbmZvLT5zdHJpcCAgICE9IHN0cmlwX25vbmUKLSAgICAgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCAhPSBkaXNjYXJkX25vbmUpCi0gICAgICAmJiBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIG1hcmsgdGhlIHN5bWJvbCBhcnJheSBhcyAnbm90LXVzZWQnICovCi0gICAgICBtZW1zZXQgKGluZGV4cCwgMCwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBzaXplb2YgKiBpbmRleHApOyAKLSAgICAgICAKLSAgICAgIG1hcmtfcmVsb2NzIChmaW5mbywgaW5wdXRfYmZkKTsKLSAgICB9Ci0KLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0gICAgICBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uOwotICAgICAgYm9vbGVhbiBza2lwOwotICAgICAgYm9vbGVhbiBnbG9iYWw7Ci0gICAgICBib29sZWFuIGRvbnRfc2tpcF9zeW1ib2w7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7Ci0KLSAgICAgIC8qIE1ha2UgYSBjb3B5IG9mICppc3ltcCBzbyB0aGF0IHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uCi0JIGFsd2F5cyBzZWVzIHRoZSBvcmlnaW5hbCB2YWx1ZXMuICBUaGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbgotCSBhbHdheXMgcmVjb21wdXRpbmcgdGhlIHN5bWJvbCB2YWx1ZSBldmVuIGlmIHdlIGFyZSBzdHJpcHBpbmcKLQkgdGhlIHN5bWJvbC4gICovCi0gICAgICBpc3ltID0gKmlzeW1wOwotCi0gICAgICBjbGFzc2lmaWNhdGlvbiA9IGJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoaW5wdXRfYmZkLCAmaXN5bSk7Ci0gICAgICBzd2l0Y2ggKGNsYXNzaWZpY2F0aW9uKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBDT0ZGX1NZTUJPTF9HTE9CQUw6Ci0JY2FzZSBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOgotCWNhc2UgQ09GRl9TWU1CT0xfTE9DQUw6Ci0JICAqc2VjcHAgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGlucHV0X2JmZCwgaXN5bS5uX3NjbnVtKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09GRl9TWU1CT0xfQ09NTU9OOgotCSAgKnNlY3BwID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgQ09GRl9TWU1CT0xfVU5ERUZJTkVEOgotCSAgKnNlY3BwID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogRXh0cmFjdCB0aGUgZmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgc3ltYm9sIGlzIHVzZWQgYnkgYQotICAgICAgICAgcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoKGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9ub25lCi0JICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgIT0gZGlzY2FyZF9ub25lKQotCSAgJiYgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQlkb250X3NraXBfc3ltYm9sID0gKmluZGV4cDsKLSAgICAgIGVsc2UKLQlkb250X3NraXBfc3ltYm9sID0gZmFsc2U7Ci0gICAgICAKLSAgICAgICppbmRleHAgPSAtMTsKLQotICAgICAgc2tpcCA9IGZhbHNlOwotICAgICAgZ2xvYmFsID0gZmFsc2U7Ci0gICAgICBhZGQgPSAxICsgaXN5bS5uX251bWF1eDsKLQotICAgICAgLyogSWYgd2UgYXJlIHN0cmlwcGluZyBhbGwgc3ltYm9scywgd2Ugd2FudCB0byBza2lwIHRoaXMgb25lLiAgKi8KLSAgICAgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsICYmICEgZG9udF9za2lwX3N5bWJvbCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgaWYgKCEgc2tpcCkKLQl7Ci0JICBzd2l0Y2ggKGNsYXNzaWZpY2F0aW9uKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgQ09GRl9TWU1CT0xfR0xPQkFMOgotCSAgICBjYXNlIENPRkZfU1lNQk9MX0NPTU1PTjoKLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOgotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgc3ltYm9sLiAgR2xvYmFsIHN5bWJvbHMgY29tZSBhdCB0aGUKLQkJIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLCBzbyBza2lwIHRoZW0gZm9yIG5vdy4KLQkJIExvY2FsbHkgZGVmaW5lZCBmdW5jdGlvbiBzeW1ib2xzLCBob3dldmVyLCBhcmUgYW4KLQkJIGV4Y2VwdGlvbiwgYW5kIGFyZSBub3QgbW92ZWQgdG8gdGhlIGVuZC4gICovCi0JICAgICAgZ2xvYmFsID0gdHJ1ZTsKLQkgICAgICBpZiAoISBJU0ZDTiAoaXN5bS5uX3R5cGUpKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENPRkZfU1lNQk9MX1VOREVGSU5FRDoKLQkgICAgICAvKiBVbmRlZmluZWQgc3ltYm9scyBhcmUgbGVmdCBmb3IgdGhlIGVuZC4gICovCi0JICAgICAgZ2xvYmFsID0gdHJ1ZTsKLQkgICAgICBza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENPRkZfU1lNQk9MX0xPQ0FMOgotCSAgICAgIC8qIFRoaXMgaXMgYSBsb2NhbCBzeW1ib2wuICBTa2lwIGl0IGlmIHdlIGFyZSBkaXNjYXJkaW5nCi0gICAgICAgICAgICAgICAgIGxvY2FsIHN5bWJvbHMuICAqLwotCSAgICAgIGlmIChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2FsbCAmJiAhIGRvbnRfc2tpcF9zeW1ib2wpCi0JCXNraXAgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBzdHJpcHBpbmcgZGVidWdnaW5nIHN5bWJvbHMsIGFuZCB0aGlzIGlzIGEgZGVidWdnaW5nCi0gICAgICAgICBzeW1ib2wsIHRoZW4gc2tpcCBpdC4gIEZJWE1FOiBnYXMgc2V0cyB0aGUgc2VjdGlvbiB0byBOX0FCUwotICAgICAgICAgZm9yIHNvbWUgdHlwZXMgb2YgZGVidWdnaW5nIHN5bWJvbHM7IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0gICAgICAgICBhIGJ1ZyBvciBub3QuICBJbiBhbnkgY2FzZSwgd2UgaGFuZGxlIGl0IGhlcmUuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyCi0JICAmJiAhIGRvbnRfc2tpcF9zeW1ib2wKLQkgICYmIChpc3ltLm5fc2NudW0gPT0gTl9ERUJVRwotCSAgICAgIHx8IChpc3ltLm5fc2NudW0gPT0gTl9BQlMKLQkJICAmJiAoaXN5bS5uX3NjbGFzcyA9PSBDX0FVVE8KLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1JFRwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfTU9TCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19NT0UKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX01PVQotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfQVJHCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19SRUdQQVJNCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19GSUVMRAotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRU9TKSkpKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBJZiBzb21lIHN5bWJvbHMgYXJlIHN0cmlwcGVkIGJhc2VkIG9uIHRoZSBuYW1lLCB3b3JrIG91dCB0aGUKLQkgbmFtZSBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gc2tpcCB0aGlzIHN5bWJvbC4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoISBkb250X3NraXBfc3ltYm9sCi0JICAgICAgJiYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCQkgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwKLQkJCQkgICAgZmFsc2UpID09IE5VTEwpKQotCQkgICB8fCAoISBnbG9iYWwKLQkJICAgICAgICYmIGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbAotCQkgICAgICAgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGlucHV0X2JmZCwgbmFtZSkpKSkKLQkgICAgc2tpcCA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIGVudW0sIHN0cnVjdCwgb3IgdW5pb24gdGFnLCBzZWUgaWYgd2UgaGF2ZQotICAgICAgICAgYWxyZWFkeSBvdXRwdXQgYW4gaWRlbnRpY2FsIHR5cGUuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgKGZpbmZvLT5vdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpID09IDAKLQkgICYmIChpc3ltLm5fc2NsYXNzID09IENfRU5UQUcKLQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfU1RSVEFHCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1VOVEFHKQotCSAgJiYgaXN5bS5uX251bWF1eCA9PSAxKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqbWg7Ci0JICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICptdDsKLQkgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0JICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICoqZXBwOwotCSAgYmZkX2J5dGUgKmVzbCwgKmVzbGVuZDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzbHA7Ci0KLQkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgJmlzeW0sIGJ1Zik7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIElnbm9yZSBmYWtlIG5hbWVzIGludmVudGVkIGJ5IGNvbXBpbGVyOyB0cmVhdCB0aGVtIGFsbCBhcwotICAgICAgICAgICAgIHRoZSBzYW1lIG5hbWUuICAqLwotCSAgaWYgKCpuYW1lID09ICd+JyB8fCAqbmFtZSA9PSAnLicgfHwgKm5hbWUgPT0gJyQnCi0JICAgICAgfHwgKCpuYW1lID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoaW5wdXRfYmZkKQotCQkgICYmIChuYW1lWzFdID09ICd+JyB8fCBuYW1lWzFdID09ICcuJyB8fCBuYW1lWzFdID09ICckJykpKQotCSAgICBuYW1lID0gIiI7Ci0KLQkgIG1oID0gY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2xvb2t1cCAoJmZpbmZvLT5kZWJ1Z19tZXJnZSwgbmFtZSwKLQkJCQkJICAgICB0cnVlLCB0cnVlKTsKLQkgIGlmIChtaCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHR5cGUgaW5mb3JtYXRpb24uICBJZiB0aGlzIHR1cm5zCi0gICAgICAgICAgICAgb3V0IHRvIGJlIGEgZHVwbGljYXRlLCB3ZSBwYXNzIHRoaXMgYWRkcmVzcyB0bwotICAgICAgICAgICAgIGJmZF9yZWxlYXNlLiAgKi8KLQkgIG10ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICopCi0JCWJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlKSkpOwotCSAgaWYgKG10ID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG10LT5jbGFzcyA9IGlzeW0ubl9zY2xhc3M7Ci0KLQkgIC8qIFBpY2sgdXAgdGhlIGF1eCBlbnRyeSwgd2hpY2ggcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIHRhZwotICAgICAgICAgICAgIGVudHJpZXMuICAqLwotCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgKGVzeW0gKyBpc3ltZXN6KSwKLQkJCQlpc3ltLm5fdHlwZSwgaXN5bS5uX3NjbGFzcywgMCwgaXN5bS5uX251bWF1eCwKLQkJCQkoUFRSKSAmYXV4KTsKLQotCSAgLyogR2F0aGVyIHRoZSBlbGVtZW50cy4gICovCi0JICBlcHAgPSAmbXQtPmVsZW1lbnRzOwotCSAgbXQtPmVsZW1lbnRzID0gTlVMTDsKLQkgIGlzbHAgPSBpc3ltcCArIDI7Ci0JICBlc2wgPSBlc3ltICsgMiAqIGlzeW1lc3o7Ci0JICBlc2xlbmQgPSAoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkKLQkJICAgICsgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgKiBpc3ltZXN6KTsKLQkgIHdoaWxlIChlc2wgPCBlc2xlbmQpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICplbGVuYW1lOwotCSAgICAgIGNoYXIgZWxlYnVmW1NZTU5NTEVOICsgMV07Ci0JICAgICAgY2hhciAqbmFtZV9jb3B5OwotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGlucHV0X2JmZCwgKFBUUikgZXNsLCAoUFRSKSBpc2xwKTsKLQotCSAgICAgICplcHAgPSAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQgKikKLQkJICAgICAgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJIHNpemVvZiAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCkpKTsKLQkgICAgICBpZiAoKmVwcCA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBlbGVuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIGlzbHAsCi0JCQkJCQkJZWxlYnVmKTsKLQkgICAgICBpZiAoZWxlbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBuYW1lX2NvcHkgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgc3RybGVuIChlbGVuYW1lKSArIDEpOwotCSAgICAgIGlmIChuYW1lX2NvcHkgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHN0cmNweSAobmFtZV9jb3B5LCBlbGVuYW1lKTsKLQotCSAgICAgICgqZXBwKS0+bmFtZSA9IG5hbWVfY29weTsKLQkgICAgICAoKmVwcCktPnR5cGUgPSBpc2xwLT5uX3R5cGU7Ci0JICAgICAgKCplcHApLT50YWduZHggPSAwOwotCSAgICAgIGlmIChpc2xwLT5uX251bWF1eCA+PSAxCi0JCSAgJiYgaXNscC0+bl90eXBlICE9IFRfTlVMTAotCQkgICYmIGlzbHAtPm5fc2NsYXNzICE9IENfRU9TKQotCQl7Ci0JCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGVsZWF1eDsKLQkJICBsb25nIGluZHg7Ci0KLQkJICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLCAoUFRSKSAoZXNsICsgaXN5bWVzeiksCi0JCQkJCWlzbHAtPm5fdHlwZSwgaXNscC0+bl9zY2xhc3MsIDAsCi0JCQkJCWlzbHAtPm5fbnVtYXV4LCAoUFRSKSAmZWxlYXV4KTsKLQkJICBpbmR4ID0gZWxlYXV4Lnhfc3ltLnhfdGFnbmR4Lmw7Ci0KLQkJICAvKiBGSVhNRTogSWYgdGhpcyB0YWduZHggZW50cnkgcmVmZXJzIHRvIGEgc3ltYm9sCi0JCSAgICAgZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGUsIHdlIGp1c3QgaWdub3JlIGl0LgotCQkgICAgIEhhbmRsaW5nIHRoaXMgY29ycmVjdGx5IHdvdWxkIGJlIHRlZGlvdXMsIGFuZCBtYXkKLQkJICAgICBub3QgYmUgcmVxdWlyZWQuICAqLwotCi0JCSAgaWYgKGluZHggPiAwCi0JCSAgICAgICYmIChpbmR4Ci0JCQkgIDwgKChlc3ltIC0KLQkJCSAgICAgIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKQotCQkJICAgICAvIChsb25nKSBpc3ltZXN6KSkpCi0JCSAgICB7Ci0JCSAgICAgICgqZXBwKS0+dGFnbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgICAgICBpZiAoKCplcHApLT50YWduZHggPCAwKQotCQkJKCplcHApLT50YWduZHggPSAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZXBwID0gJigqZXBwKS0+bmV4dDsKLQkgICAgICAqZXBwID0gTlVMTDsKLQotCSAgICAgIGVzbCArPSAoaXNscC0+bl9udW1hdXggKyAxKSAqIGlzeW1lc3o7Ci0JICAgICAgaXNscCArPSBpc2xwLT5uX251bWF1eCArIDE7Ci0JICAgIH0KLQotCSAgLyogU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGRlZmluaXRpb24gd2hpY2ggbWF0Y2hlcyB0aGlzCi0gICAgICAgICAgICAgdHlwZS4gIFdlIGFsd2F5cyBvdXRwdXQgdGhlIHR5cGUgaWYgaXQgaGFzIG5vIGVsZW1lbnRzLAotICAgICAgICAgICAgIGZvciBzaW1wbGljaXR5LiAgKi8KLQkgIGlmIChtdC0+ZWxlbWVudHMgPT0gTlVMTCkKLQkgICAgYmZkX3JlbGVhc2UgKGlucHV0X2JmZCwgKFBUUikgbXQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbXRsOwotCi0JICAgICAgZm9yIChtdGwgPSBtaC0+dHlwZXM7IG10bCAhPSBOVUxMOyBtdGwgPSBtdGwtPm5leHQpCi0JCXsKLQkJICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICptZSwgKm1lbDsKLQotCQkgIGlmIChtdGwtPmNsYXNzICE9IG10LT5jbGFzcykKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgZm9yIChtZSA9IG10LT5lbGVtZW50cywgbWVsID0gbXRsLT5lbGVtZW50czsKLQkJICAgICAgIG1lICE9IE5VTEwgJiYgbWVsICE9IE5VTEw7Ci0JCSAgICAgICBtZSA9IG1lLT5uZXh0LCBtZWwgPSBtZWwtPm5leHQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzdHJjbXAgKG1lLT5uYW1lLCBtZWwtPm5hbWUpICE9IDAKLQkJCSAgfHwgbWUtPnR5cGUgIT0gbWVsLT50eXBlCi0JCQkgIHx8IG1lLT50YWduZHggIT0gbWVsLT50YWduZHgpCi0JCQlicmVhazsKLQkJICAgIH0KLQotCQkgIGlmIChtZSA9PSBOVUxMICYmIG1lbCA9PSBOVUxMKQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChtdGwgPT0gTlVMTCB8fCAoYmZkX3NpemVfdHlwZSkgbXRsLT5pbmR4ID49IHN5bWVudF9iYXNlKQotCQl7Ci0JCSAgLyogVGhpcyBpcyB0aGUgZmlyc3QgZGVmaW5pdGlvbiBvZiB0aGlzIHR5cGUuICAqLwotCQkgIG10LT5pbmR4ID0gb3V0cHV0X2luZGV4OwotCQkgIG10LT5uZXh0ID0gbWgtPnR5cGVzOwotCQkgIG1oLT50eXBlcyA9IG10OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHJlZGVmaW5pdGlvbiB3aGljaCBjYW4gYmUgbWVyZ2VkLiAgKi8KLQkJICBiZmRfcmVsZWFzZSAoaW5wdXRfYmZkLCAoUFRSKSBtdCk7Ci0JCSAgKmluZGV4cCA9IG10bC0+aW5keDsKLQkJICBhZGQgPSAoZXNsZW5kIC0gZXN5bSkgLyBpc3ltZXN6OwotCQkgIHNraXAgPSB0cnVlOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlIG5vdyBrbm93IHdoZXRoZXIgd2UgYXJlIHRvIHNraXAgdGhpcyBzeW1ib2wgb3Igbm90LiAgKi8KLSAgICAgIGlmICghIHNraXApCi0JewotCSAgLyogQWRqdXN0IHRoZSBzeW1ib2wgaW4gb3JkZXIgdG8gb3V0cHV0IGl0LiAgKi8KLQotCSAgaWYgKGlzeW0uX24uX25fbi5fbl96ZXJvZXMgPT0gMAotCSAgICAgICYmIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGEgbG9uZyBuYW1lLiAgRW50ZXIgaXQgaW4gdGhlIHN0cmluZwotCQkgdGFibGUgd2UgYXJlIGJ1aWxkaW5nLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBjaGVjawotCQkgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1Zy4gIFRoYXQgaXMgb25seSB0cnVlIGZvcgotCQkgWENPRkYsIGFuZCBYQ09GRiByZXF1aXJlcyBkaWZmZXJlbnQgbGlua2luZyBjb2RlCi0JCSBhbnlob3cuICAqLwotCSAgICAgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgJmlzeW0sCi0JCQkJCQkgICAgIChjaGFyICopIE5VTEwpOwotCSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBuYW1lLCBoYXNoLCBjb3B5KTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChpc3ltLm5fc2NsYXNzKQotCSAgICB7Ci0JICAgIGNhc2UgQ19BVVRPOgotCSAgICBjYXNlIENfTU9TOgotCSAgICBjYXNlIENfRU9TOgotCSAgICBjYXNlIENfTU9FOgotCSAgICBjYXNlIENfTU9VOgotCSAgICBjYXNlIENfVU5UQUc6Ci0JICAgIGNhc2UgQ19TVFJUQUc6Ci0JICAgIGNhc2UgQ19FTlRBRzoKLQkgICAgY2FzZSBDX1RQREVGOgotCSAgICBjYXNlIENfQVJHOgotCSAgICBjYXNlIENfVVNUQVRJQzoKLQkgICAgY2FzZSBDX1JFRzoKLQkgICAgY2FzZSBDX1JFR1BBUk06Ci0JICAgIGNhc2UgQ19GSUVMRDoKLQkgICAgICAvKiBUaGUgc3ltYm9sIHZhbHVlIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuICAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ19GQ046Ci0JICAgICAgaWYgKG9ial9wZSAoaW5wdXRfYmZkKQotCQkgICYmIHN0cmNtcCAoaXN5bS5uX25hbWUsICIuYmYiKSAhPSAwCi0JCSAgJiYgaXN5bS5uX3NjbnVtID4gMCkKLQkJewotCQkgIC8qIEZvciBQRSwgLmxmIGFuZCAuZWYgZ2V0IHRoZWlyIHZhbHVlIGxlZnQgYWxvbmUsCi0JCSAgICAgd2hpbGUgLmJmIGdldHMgcmVsb2NhdGVkLiAgSG93ZXZlciwgdGhleSBhbGwgaGF2ZQotCQkgICAgICJyZWFsIiBzZWN0aW9uIG51bWJlcnMsIGFuZCBuZWVkIHRvIGJlIG1vdmVkIGludG8KLQkJICAgICB0aGUgbmV3IHNlY3Rpb24uICAqLwotCQkgIGlzeW0ubl9zY251bSA9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBDX0xBQkVMOiAgLyogTm90IGNvbXBsZXRlbHkgc3VyZSBhYm91dCB0aGVzZSAyICovCi0JICAgIGNhc2UgQ19FWFRERUY6Ci0JICAgIGNhc2UgQ19CTE9DSzoKLQkgICAgY2FzZSBDX0VGQ046Ci0JICAgIGNhc2UgQ19OVUxMOgotCSAgICBjYXNlIENfRVhUOgotCSAgICBjYXNlIENfU1RBVDoKLQkgICAgY2FzZSBDX1NFQ1RJT046Ci0JICAgIGNhc2UgQ19OVF9XRUFLOgotCSAgICAgIC8qIENvbXB1dGUgbmV3IHN5bWJvbCBsb2NhdGlvbi4gICovCi0JICAgIGlmIChpc3ltLm5fc2NudW0gPiAwKQotCSAgICAgIHsKLQkJaXN5bS5uX3NjbnVtID0gKCpzZWNwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JCWlzeW0ubl92YWx1ZSArPSAoKnNlY3BwKS0+b3V0cHV0X29mZnNldDsKLQkJaWYgKCEgb2JqX3BlIChpbnB1dF9iZmQpKQotCQkgIGlzeW0ubl92YWx1ZSAtPSAoKnNlY3BwKS0+dm1hOwotCQlpZiAoISBvYmpfcGUgKGZpbmZvLT5vdXRwdXRfYmZkKSkKLQkJICBpc3ltLm5fdmFsdWUgKz0gKCpzZWNwcCktPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQotCSAgICBjYXNlIENfRklMRToKLQkgICAgICAvKiBUaGUgdmFsdWUgb2YgYSBDX0ZJTEUgc3ltYm9sIGlzIHRoZSBzeW1ib2wgaW5kZXggb2YKLQkJIHRoZSBuZXh0IENfRklMRSBzeW1ib2wuICBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFCi0JCSBzeW1ib2wgaXMgdGhlIHN5bWJvbCBpbmRleCB0byB0aGUgZmlyc3QgZXh0ZXJuYWwKLQkJIHN5bWJvbCAoYWN0dWFsbHksIGNvZmZfcmVudW1iZXJfc3ltYm9scyBkb2VzIG5vdCBnZXQKLQkJIHRoaXMgcmlnaHQtLWl0IGp1c3Qgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFCi0JCSBzeW1ib2wgdG8gemVyby0tYW5kIG5vYm9keSBoYXMgZXZlciBjb21wbGFpbmVkIGFib3V0Ci0JCSBpdCkuICBXZSB0cnkgdG8gZ2V0IHRoaXMgcmlnaHQsIGJlbG93LCBqdXN0IGJlZm9yZSB3ZQotCQkgd3JpdGUgdGhlIHN5bWJvbHMgb3V0LCBidXQgaW4gdGhlIGdlbmVyYWwgY2FzZSB3ZSBtYXkKLQkJIGhhdmUgdG8gd3JpdGUgdGhlIHN5bWJvbCBvdXQgdHdpY2UuICAqLwotCi0JICAgICAgaWYgKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLQkJICAmJiBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgIT0gKGxvbmcpIG91dHB1dF9pbmRleCkKLQkJewotCQkgIC8qIFdlIG11c3QgY29ycmVjdCB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFCi0gICAgICAgICAgICAgICAgICAgICBlbnRyeS4gICovCi0JCSAgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlID0gb3V0cHV0X2luZGV4OwotCQkgIGlmICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBpbiB0aGlzIGlucHV0IGZpbGUuICAqLwotCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkJCSAgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCQkgICAgKyAoKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXgKLQkJCQkJCQktIHN5bWVudF9iYXNlKQotCQkJCQkJICAgICAgICogb3N5bWVzeikpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCB0aGUgbGFzdCBDX0ZJTEUKLQkJCSBzeW1ib2wuICBXZSBuZWVkIHRvIHdyaXRlIGl0IG91dCBhZ2Fpbi4gIFdlCi0JCQkgYm9ycm93ICpvdXRzeW0gdGVtcG9yYXJpbHkuICAqLwotCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLQkJICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJCSAgICAgKyBmaW5mby0+bGFzdF9maWxlX2luZGV4ICogb3N5bWVzeiksCi0JCQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JCQkgIHx8IChiZmRfd3JpdGUgKG91dHN5bSwgb3N5bWVzeiwgMSwgb3V0cHV0X2JmZCkKLQkJCSAgICAgICE9IG9zeW1lc3opKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmaW5mby0+bGFzdF9maWxlX2luZGV4ID0gb3V0cHV0X2luZGV4OwotCSAgICAgIGZpbmZvLT5sYXN0X2ZpbGUgPSBpc3ltOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIElmIGRvaW5nIHRhc2sgbGlua2luZywgY29udmVydCBub3JtYWwgZ2xvYmFsIGZ1bmN0aW9uIHN5bWJvbHMgdG8KLQkgICAgIHN0YXRpYyBmdW5jdGlvbnMuICovCi0KLQkgIGlmIChmaW5mby0+aW5mby0+dGFza19saW5rCi0JICAgICAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQKLQkJICB8fCBpc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAotCQkgIHx8IChvYmpfcGUgKGlucHV0X2JmZCkgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspKSkKLQkgICAgaXN5bS5uX3NjbGFzcyA9IENfU1RBVDsKLQotCSAgLyogT3V0cHV0IHRoZSBzeW1ib2wuICAqLwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOwotCi0JICAqaW5kZXhwID0gb3V0cHV0X2luZGV4OwotCi0JICBpZiAoZ2xvYmFsKQotCSAgICB7Ci0JICAgICAgbG9uZyBpbmR4OwotCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGluZHggPSAoKGVzeW0gLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJICAgICAgLyBpc3ltZXN6KTsKLQkgICAgICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQl7Ci0JCSAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlIHdlcmUgZXJyb3JzIGVhcmxpZXIgaW4KLSAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rLiAgKi8KLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBoLT5pbmR4ID0gb3V0cHV0X2luZGV4OwotCSAgICB9Ci0KLQkgIG91dHB1dF9pbmRleCArPSBhZGQ7Ci0JICBvdXRzeW0gKz0gYWRkICogb3N5bWVzejsKLQl9Ci0KLSAgICAgIGVzeW0gKz0gYWRkICogaXN5bWVzejsKLSAgICAgIGlzeW1wICs9IGFkZDsKLSAgICAgICsrc2VjcHA7Ci0gICAgICArK2luZGV4cDsKLSAgICAgIGZvciAoLS1hZGQ7IGFkZCA+IDA7IC0tYWRkKQotCXsKLQkgICpzZWNwcCsrID0gTlVMTDsKLQkgICppbmRleHArKyA9IC0xOwotCX0KLSAgICB9Ci0KLSAgLyogRml4IHVwIHRoZSBhdXggZW50cmllcy4gIFRoaXMgbXVzdCBiZSBkb25lIGluIGEgc2VwYXJhdGUgcGFzcywKLSAgICAgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBjb3JyZWN0IHN5bWJvbCBpbmRpY2VzIHVudGlsIHdlIGhhdmUKLSAgICAgYWxyZWFkeSBkZWNpZGVkIHdoaWNoIHN5bWJvbHMgd2UgYXJlIGdvaW5nIHRvIGtlZXAuICAqLwotCi0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBpc3ltZXN6OwotICBpc3ltcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0gIHN5bV9oYXNoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgaW50IGFkZDsKLQotICAgICAgYWRkID0gMSArIGlzeW1wLT5uX251bWF1eDsKLQotICAgICAgaWYgKCgqaW5kZXhwIDwgMAotCSAgIHx8IChiZmRfc2l6ZV90eXBlKSAqaW5kZXhwIDwgc3ltZW50X2Jhc2UpCi0JICAmJiAoKnN5bV9oYXNoID09IE5VTEwKLQkgICAgICB8fCAoKnN5bV9oYXNoKS0+YXV4YmZkICE9IGlucHV0X2JmZCkpCi0JZXN5bSArPSBhZGQgKiBpc3ltZXN6OwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIGludCBpOwotCi0JICBoID0gTlVMTDsKLQkgIGlmICgqaW5kZXhwIDwgMCkKLQkgICAgewotCSAgICAgIGggPSAqc3ltX2hhc2g7Ci0KLQkgICAgICAvKiBUaGUgbTY4ay1tb3Rvcm9sYS1zeXN2IGFzc2VtYmxlciB3aWxsIHNvbWV0aW1lcwotICAgICAgICAgICAgICAgICBnZW5lcmF0ZSB0d28gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUsIGJ1dCBvbmx5IG9uZQotICAgICAgICAgICAgICAgICB3aWxsIGhhdmUgYXV4IGVudHJpZXMuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKGlzeW1wLT5uX251bWF1eCA9PSAwCi0JCQkgIHx8IGgtPm51bWF1eCA9PSBpc3ltcC0+bl9udW1hdXgpOwotCSAgICB9Ci0KLQkgIGVzeW0gKz0gaXN5bWVzejsKLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgb3V0c3ltICs9IG9zeW1lc3o7Ci0KLQkgIC8qIEhhbmRsZSB0aGUgYXV4IGVudHJpZXMuICBUaGlzIGhhbmRsaW5nIGlzIGJhc2VkIG9uCi0JICAgICBjb2ZmX3BvaW50ZXJpemVfYXV4LiAgSSBkb24ndCBrbm93IGlmIGl0IGFsd2F5cyBjb3JyZWN0LiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCBpc3ltcC0+bl9udW1hdXggJiYgZXN5bSA8IGVzeW1fZW5kOyBpKyspCi0JICAgIHsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4cDsKLQotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCWF1eHAgPSBoLT5hdXggKyBpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIGlzeW1wLT5uX3R5cGUsCi0JCQkJCWlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCQkoUFRSKSAmYXV4KTsKLQkJICBhdXhwID0gJmF1eDsKLQkJfQotCi0JICAgICAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JCXsKLQkJICAvKiBJZiB0aGlzIGlzIGEgbG9uZyBmaWxlbmFtZSwgd2UgbXVzdCBwdXQgaXQgaW4gdGhlCi0JCSAgICAgc3RyaW5nIHRhYmxlLiAgKi8KLQkJICBpZiAoYXV4cC0+eF9maWxlLnhfbi54X3plcm9lcyA9PSAwCi0JCSAgICAgICYmIGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCQkgICAgICBCRkRfQVNTRVJUIChhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0Ci0JCQkJICA+PSBTVFJJTkdfU0laRV9TSVpFKTsKLQkJICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkJCXsKLQkJCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoaW5wdXRfYmZkKTsKLQkJCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGZpbGVuYW1lID0gc3RyaW5ncyArIGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQ7Ci0JCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGZpbGVuYW1lLAotCQkJCQkJIGhhc2gsIGNvcHkpOwotCQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGlzeW1wLT5uX3NjbGFzcyAhPSBDX1NUQVQgfHwgaXN5bXAtPm5fdHlwZSAhPSBUX05VTEwpCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGluZHg7Ci0KLQkJICBpZiAoSVNGQ04gKGlzeW1wLT5uX3R5cGUpCi0JCSAgICAgIHx8IElTVEFHIChpc3ltcC0+bl9zY2xhc3MpCi0JCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0JMT0NLCi0JCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZDTikKLQkJICAgIHsKLQkJICAgICAgaW5keCA9IGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw7Ci0JCSAgICAgIGlmIChpbmR4ID4gMAotCQkJICAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQl7Ci0JCQkgIC8qIFdlIGxvb2sgZm9yd2FyZCB0aHJvdWdoIHRoZSBzeW1ib2wgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzeW1ib2wgd2UgYXJlIGdvaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluY2x1ZGUuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmVseSByaWdodC4gICovCi0JCQkgIHdoaWxlICgoZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdIDwgMAotCQkJCSAgfHwgKChiZmRfc2l6ZV90eXBlKSBmaW5mby0+c3ltX2luZGljZXNbaW5keF0KLQkJCQkgICAgICA8IHN5bWVudF9iYXNlKSkKLQkJCQkgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJICAgICsraW5keDsKLQkJCSAgaWYgKGluZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQkgICAgaW5keCA9IG91dHB1dF9pbmRleDsKLQkJCSAgZWxzZQotCQkJICAgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCQkgIGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBpbmR4OwotCQkJfQotCQkgICAgfQotCi0JCSAgaW5keCA9IGF1eHAtPnhfc3ltLnhfdGFnbmR4Lmw7Ci0JCSAgaWYgKGluZHggPiAwICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJICAgIHsKLQkJICAgICAgbG9uZyBzeW1pbmR4OwotCi0JCSAgICAgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCSAgICAgIGlmIChzeW1pbmR4IDwgMCkKLQkJCWF1eHAtPnhfc3ltLnhfdGFnbmR4LmwgPSAwOwotCQkgICAgICBlbHNlCi0JCQlhdXhwLT54X3N5bS54X3RhZ25keC5sID0gc3ltaW5keDsKLQkJICAgIH0KLQotCQkgIC8qIFRoZSAuYmYgc3ltYm9scyBhcmUgc3VwcG9zZWQgdG8gYmUgbGlua2VkIHRocm91Z2gKLQkJICAgICB0aGUgZW5kbmR4IGZpZWxkLiAgV2UgbmVlZCB0byBjYXJyeSB0aGlzIGxpc3QKLQkJICAgICBhY3Jvc3Mgb2JqZWN0IGZpbGVzLiAgKi8KLQkJICBpZiAoaSA9PSAwCi0JCSAgICAgICYmIGggPT0gTlVMTAotCQkgICAgICAmJiBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04KLQkJICAgICAgJiYgKGlzeW1wLT5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCi0JCQkgIHx8IGlzeW1wLT5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVswXSA9PSAnLicKLQkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbMV0gPT0gJ2InCi0JCSAgICAgICYmIGlzeW1wLT5fbi5fbl9uYW1lWzJdID09ICdmJwotCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVszXSA9PSAnXDAnKQotCQkgICAgewotCQkgICAgICBpZiAoZmluZm8tPmxhc3RfYmZfaW5kZXggIT0gLTEpCi0JCQl7Ci0JCQkgIGZpbmZvLT5sYXN0X2JmLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPQotCQkJICAgICppbmRleHA7Ci0KLQkJCSAgaWYgKChiZmRfc2l6ZV90eXBlKSBmaW5mby0+bGFzdF9iZl9pbmRleAotCQkJICAgICAgPj0gc3ltZW50X2Jhc2UpCi0JCQkgICAgewotCQkJICAgICAgUFRSIGF1eG91dDsKLQotCQkJICAgICAgLyogVGhlIGxhc3QgLmJmIHN5bWJvbCBpcyBpbiB0aGlzIGlucHV0Ci0JCQkJIGZpbGUuICBUaGlzIHdpbGwgb25seSBoYXBwZW4gaWYgdGhlCi0JCQkJIGFzc2VtYmxlciBkaWQgbm90IHNldCB1cCB0aGUgLmJmCi0JCQkJIGVuZG5keCBzeW1ib2xzIGNvcnJlY3RseS4gICovCi0JCQkgICAgICBhdXhvdXQgPSAoUFRSKSAoZmluZm8tPm91dHN5bXMKLQkJCQkJICAgICAgKyAoKGZpbmZvLT5sYXN0X2JmX2luZGV4Ci0JCQkJCQkgIC0gc3ltZW50X2Jhc2UpCi0JCQkJCQkgKiBvc3ltZXN6KSk7Ci0JCQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9iZiwKLQkJCQkJCSAgICAgaXN5bXAtPm5fdHlwZSwKLQkJCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLAotCQkJCQkJICAgICAwLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJCQkgICAgIGF1eG91dCk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IHRoZSBsYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmYgYXV4IGVudHJ5LiAgV2UgbmVlZCB0byB3cml0ZSBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IGFnYWluLiAgV2UgYm9ycm93ICpvdXRzeW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyaWx5LiAgRklYTUU6IFRoaXMgY2FzZSBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIG1hZGUgZmFzdGVyLiAgKi8KLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2JmLAotCQkJCQkJICAgICBpc3ltcC0+bl90eXBlLAotCQkJCQkJICAgICBpc3ltcC0+bl9zY2xhc3MsCi0JCQkJCQkgICAgIDAsIGlzeW1wLT5uX251bWF1eCwKLQkJCQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLQkJCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCQkJCSAgICAgKyBmaW5mby0+bGFzdF9iZl9pbmRleCAqIG9zeW1lc3opLAotCQkJCQkgICAgU0VFS19TRVQpICE9IDAKLQkJCQkgIHx8IGJmZF93cml0ZSAob3V0c3ltLCBvc3ltZXN6LCAxLAotCQkJCQkJb3V0cHV0X2JmZCkgIT0gb3N5bWVzeikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIGlmIChhdXhwLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sICE9IDApCi0JCQlmaW5mby0+bGFzdF9iZl9pbmRleCA9IC0xOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIFRoZSBlbmRuZHggZmllbGQgb2YgdGhpcyBhdXggZW50cnkgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1cGRhdGVkIHdpdGggdGhlIHN5bWJvbCBudW1iZXIgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLmJmIHN5bWJvbC4gICovCi0JCQkgIGZpbmZvLT5sYXN0X2JmID0gKmF1eHA7Ci0JCQkgIGZpbmZvLT5sYXN0X2JmX2luZGV4ID0gKCgob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpCi0JCQkJCQkgICAvIG9zeW1lc3opCi0JCQkJCQkgICsgc3ltZW50X2Jhc2UpOwotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQl7Ci0JCSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSBhdXhwLCBpc3ltcC0+bl90eXBlLAotCQkJCQkgaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJCSAoUFRSKSBvdXRzeW0pOwotCQkgIG91dHN5bSArPSBvc3ltZXN6OwotCQl9Ci0KLQkgICAgICBlc3ltICs9IGlzeW1lc3o7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluZGV4cCArPSBhZGQ7Ci0gICAgICBpc3ltcCArPSBhZGQ7Ci0gICAgICBzeW1faGFzaCArPSBhZGQ7Ci0gICAgfQotCi0gIC8qIFJlbG9jYXRlIHRoZSBsaW5lIG51bWJlcnMsIHVubGVzcyB3ZSBhcmUgc3RyaXBwaW5nIHRoZW0uICAqLwotICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX25vbmUKLSAgICAgIHx8IGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotICAgIHsKLSAgICAgIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgYmZkX3ZtYSBvZmZzZXQ7Ci0JICBiZmRfYnl0ZSAqZWxpbmU7Ci0JICBiZmRfYnl0ZSAqZWxpbmVlbmQ7Ci0JICBiZmRfYnl0ZSAqb2VsaW5lOwotCSAgYm9vbGVhbiBza2lwcGluZzsKLQotCSAgLyogRklYTUU6IElmIFNFQ19IQVNfQ09OVEVOVFMgaXMgbm90IGZvciB0aGUgc2VjdGlvbiwgdGhlbgotCSAgICAgYnVpbGRfbGlua19vcmRlciBpbiBsZHdyaXRlLmMgd2lsbCBub3QgaGF2ZSBjcmVhdGVkIGEKLQkgICAgIGxpbmsgb3JkZXIsIHdoaWNoIG1lYW5zIHRoYXQgd2Ugd2lsbCBub3QgaGF2ZSBzZWVuIHRoaXMKLQkgICAgIGlucHV0IHNlY3Rpb24gaW4gX2JmZF9jb2ZmX2ZpbmFsX2xpbmssIHdoaWNoIG1lYW5zIHRoYXQKLQkgICAgIHdlIHdpbGwgbm90IGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgbGluZSBudW1iZXJzIG9mCi0JICAgICB0aGlzIHNlY3Rpb24uICBJIGRvbid0IHRoaW5rIGxpbmUgbnVtYmVycyBjYW4gYmUKLQkgICAgIG1lYW5pbmdmdWwgZm9yIGEgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBoYXZlCi0JICAgICBTRUNfSEFTX0NPTlRFTlRTIHNldCwgYnV0LCBpZiB0aGV5IGRvLCB0aGlzIG11c3QgYmUKLQkgICAgIGNoYW5nZWQuICAqLwotCSAgaWYgKG8tPmxpbmVub19jb3VudCA9PSAwCi0JICAgICAgfHwgKG8tPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgby0+bGluZV9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChmaW5mby0+bGluZW5vcywgbGluZXN6LCBvLT5saW5lbm9fY291bnQsCi0JCQkgICBpbnB1dF9iZmQpICE9IGxpbmVzeiAqIG8tPmxpbmVub19jb3VudCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBvZmZzZXQgPSBvLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgby0+b3V0cHV0X29mZnNldCAtIG8tPnZtYTsKLQkgIGVsaW5lID0gZmluZm8tPmxpbmVub3M7Ci0JICBvZWxpbmUgPSBmaW5mby0+bGluZW5vczsKLQkgIGVsaW5lZW5kID0gZWxpbmUgKyBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQ7Ci0JICBza2lwcGluZyA9IGZhbHNlOwotCSAgZm9yICg7IGVsaW5lIDwgZWxpbmVlbmQ7IGVsaW5lICs9IGxpbmVzeikKLQkgICAgewotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gaWxpbmU7Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX2xpbmVub19pbiAoaW5wdXRfYmZkLCAoUFRSKSBlbGluZSwgKFBUUikgJmlsaW5lKTsKLQotCSAgICAgIGlmIChpbGluZS5sX2xubm8gIT0gMCkKLQkJaWxpbmUubF9hZGRyLmxfcGFkZHIgKz0gb2Zmc2V0OwotCSAgICAgIGVsc2UgaWYgKGlsaW5lLmxfYWRkci5sX3N5bW5keCA+PSAwCi0JCSAgICAgICAmJiAoKHVuc2lnbmVkIGxvbmcpIGlsaW5lLmxfYWRkci5sX3N5bW5keAotCQkJICAgPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkpCi0JCXsKLQkJICBsb25nIGluZHg7Ci0KLQkJICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2lsaW5lLmxfYWRkci5sX3N5bW5keF07Ci0KLQkJICBpZiAoaW5keCA8IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZXNlIGxpbmUgbnVtYmVycyBhcmUgYXR0YWNoZWQgdG8gYSBzeW1ib2wKLQkJCSB3aGljaCB3ZSBhcmUgc3RyaXBwaW5nLiAgV2UgbXVzdCBkaXNjYXJkIHRoZQotCQkJIGxpbmUgbnVtYmVycyBiZWNhdXNlIHJlYWRpbmcgdGhlbSBiYWNrIHdpdGgKLQkJCSBubyBhc3NvY2lhdGVkIHN5bWJvbCAob3IgYXNzb2NpYXRpbmcgdGhlbSBhbGwKLQkJCSB3aXRoIHN5bWJvbCAjMCkgd2lsbCBmYWlsLiAgV2UgY2FuJ3QgcmVnYWluCi0JCQkgdGhlIHNwYWNlIGluIHRoZSBvdXRwdXQgZmlsZSwgYnV0IGF0IGxlYXN0Ci0JCQkgdGhleSdyZSBkZW5zZS4gICovCi0JCSAgICAgIHNraXBwaW5nID0gdHJ1ZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXM7Ci0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBpYTsKLQotCQkgICAgICAvKiBGaXggdXAgdGhlIGxubm9wdHIgZmllbGQgaW4gdGhlIGF1eCBlbnRyeSBvZgotCQkJIHRoZSBzeW1ib2wuICBJdCB0dXJucyBvdXQgdGhhdCB3ZSBjYW4ndCBkbwotCQkJIHRoaXMgd2hlbiB3ZSBtb2RpZnkgdGhlIHN5bWJvbCBhdXggZW50cmllcywKLQkJCSBiZWNhdXNlIGdhcyBzb21ldGltZXMgc2NyZXdzIHVwIHRoZSBsbm5vcHRyCi0JCQkgZmllbGQgYW5kIG1ha2VzIGl0IGFuIG9mZnNldCBmcm9tIHRoZSBzdGFydAotCQkJIG9mIHRoZSBsaW5lIG51bWJlcnMgcmF0aGVyIHRoYW4gYW4gYWJzb2x1dGUKLQkJCSBmaWxlIGluZGV4LiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKG91dHB1dF9iZmQsCi0JCQkJCSAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLQkJCQkJCSAgICsgKChpbmR4IC0gc3ltZW50X2Jhc2UpCi0JCQkJCQkgICAgICAqIG9zeW1lc3opKSwKLQkJCQkJICAgIChQVFIpICZpcyk7Ci0JCSAgICAgIGlmICgoSVNGQ04gKGlzLm5fdHlwZSkKLQkJCSAgIHx8IGlzLm5fc2NsYXNzID09IENfQkxPQ0spCi0JCQkgICYmIGlzLm5fbnVtYXV4ID49IDEpCi0JCQl7Ci0JCQkgIFBUUiBhdXhwdHI7Ci0KLQkJCSAgYXV4cHRyID0gKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCSAgKyAoKGluZHggLSBzeW1lbnRfYmFzZSArIDEpCi0JCQkJCSAgICAgKiBvc3ltZXN6KSk7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChvdXRwdXRfYmZkLCBhdXhwdHIsCi0JCQkJCQlpcy5uX3R5cGUsIGlzLm5fc2NsYXNzLAotCQkJCQkJMCwgaXMubl9udW1hdXgsIChQVFIpICZpYSk7Ci0JCQkgIGlhLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9Ci0JCQkgICAgKG8tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJCSAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6Ci0JCQkgICAgICsgZWxpbmUgLSBmaW5mby0+bGluZW5vcyk7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlhLAotCQkJCQkJIGlzLm5fdHlwZSwgaXMubl9zY2xhc3MsIDAsCi0JCQkJCQkgaXMubl9udW1hdXgsIGF1eHB0cik7Ci0JCQl9Ci0KLQkJCXNraXBwaW5nID0gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBpbGluZS5sX2FkZHIubF9zeW1uZHggPSBpbmR4OwotCQl9Ci0KLQkgICAgICBpZiAoIXNraXBwaW5nKQotCSAgICAgICAgewotCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlsaW5lLAotCQkJCQkgICAgKFBUUikgb2VsaW5lKTsKLQkJICBvZWxpbmUgKz0gbGluZXN6OwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJKG8tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJCSArIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKiBsaW5lc3opLAotCQkJU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3dyaXRlIChmaW5mby0+bGluZW5vcywgMSwgb2VsaW5lIC0gZmluZm8tPmxpbmVub3MsCi0JCQkgICAgIG91dHB1dF9iZmQpCi0JCSAgIT0gKGJmZF9zaXplX3R5cGUpIChvZWxpbmUgLSBmaW5mby0+bGluZW5vcykpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKz0KLQkgICAgKG9lbGluZSAtIGZpbmZvLT5saW5lbm9zKSAvIGxpbmVzejsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIHN3YXBwZWQgb3V0IGEgQ19GSUxFIHN5bWJvbCwgZ3Vlc3MgdGhhdCB0aGUgbmV4dCBDX0ZJTEUKLSAgICAgc3ltYm9sIHdpbGwgYmUgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgbmV4dCBpbnB1dCBmaWxlLiAgSW4gdGhlCi0gICAgIG5vcm1hbCBjYXNlLCB0aGlzIHdpbGwgc2F2ZSB1cyBmcm9tIHdyaXRpbmcgb3V0IHRoZSBDX0ZJTEUgc3ltYm9sCi0gICAgIGFnYWluLiAgKi8KLSAgaWYgKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmIChiZmRfc2l6ZV90eXBlKSBmaW5mby0+bGFzdF9maWxlX2luZGV4ID49IHN5bWVudF9iYXNlKQotICAgIHsKLSAgICAgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotIAkJCQkgICAgKyAoKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggLSBzeW1lbnRfYmFzZSkKLSAJCQkJICAgICAgICogb3N5bWVzeikpKTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgdGhlIG1vZGlmaWVkIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKG91dHN5bSA+IGZpbmZvLT5vdXRzeW1zKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJICAgIG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkgKyBzeW1lbnRfYmFzZSAqIG9zeW1lc3osCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zLCAxLAotCQkJb3V0cHV0X2JmZCkKLQkgICAgICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBCRkRfQVNTRVJUICgob2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpCi0JCSAgICsgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSAvIG9zeW1lc3opCi0JCSAgPT0gb3V0cHV0X2luZGV4KTsKLQotICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpID0gb3V0cHV0X2luZGV4OwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgY29udGVudHMgb2YgZWFjaCBzZWN0aW9uLiAgKi8KLSAgYWRqdXN0X3N5bW5keCA9IGNvZmZfYmFja2VuZF9pbmZvIChpbnB1dF9iZmQpLT5fYmZkX2NvZmZfYWRqdXN0X3N5bW5keDsKLSAgZm9yIChvID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICpzZWNkYXRhOwotCi0gICAgICBpZiAoISBvLT5saW5rZXJfbWFyaykKLQl7Ci0JICAvKiBUaGlzIHNlY3Rpb24gd2FzIG9taXR0ZWQgZnJvbSB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICB8fCAoby0+X3Jhd19zaXplID09IDAgJiYgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKSkKLQl7Ci0JICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAgICAgJiYgby0+cmVsb2NfY291bnQgIT0gMCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY3MgaW4gc2VjdGlvbiBgJXMnLCBidXQgaXQgaGFzIG5vIGNvbnRlbnRzIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCWJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIG8pKSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBzZWNkYXRhID0gY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgbyk7Ci0gICAgICBpZiAoc2VjZGF0YSAhPSBOVUxMICYmIHNlY2RhdGEtPmNvbnRlbnRzICE9IE5VTEwpCi0JY29udGVudHMgPSBzZWNkYXRhLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgbywgZmluZm8tPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwgby0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgY29udGVudHMgPSBmaW5mby0+Y29udGVudHM7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGludCB0YXJnZXRfaW5kZXg7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLQotCSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLiAgKi8KLQkgIHRhcmdldF9pbmRleCA9IG8tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCQkgICAgIChpbnB1dF9iZmQsIG8sIGZhbHNlLCBmaW5mby0+ZXh0ZXJuYWxfcmVsb2NzLAotCQkJICAgICAgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSwKLQkJCSAgICAgIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JCQkgICAgICAgPyAoZmluZm8tPnNlY3Rpb25faW5mb1t0YXJnZXRfaW5kZXhdLnJlbG9jcwotCQkJCSAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpCi0JCQkgICAgICAgOiBmaW5mby0+aW50ZXJuYWxfcmVsb2NzKSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIENhbGwgcHJvY2Vzc29yIHNwZWNpZmljIGNvZGUgdG8gcmVsb2NhdGUgdGhlIHNlY3Rpb24KLSAgICAgICAgICAgICBjb250ZW50cy4gICovCi0JICBpZiAoISBiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkJICAgaW5wdXRfYmZkLCBvLAotCQkJCQkgICBjb250ZW50cywKLQkJCQkJICAgaW50ZXJuYWxfcmVsb2NzLAotCQkJCQkgICBmaW5mby0+aW50ZXJuYWxfc3ltcywKLQkJCQkJICAgZmluZm8tPnNlY19wdHJzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2Zmc2V0OwotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbGVuZDsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQotCSAgICAgIG9mZnNldCA9IG8tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBvLT5vdXRwdXRfb2Zmc2V0IC0gby0+dm1hOwotCSAgICAgIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLQkgICAgICByZWxfaGFzaCA9IChmaW5mby0+c2VjdGlvbl9pbmZvW3RhcmdldF9pbmRleF0ucmVsX2hhc2hlcwotCQkJICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0JICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyssIHJlbF9oYXNoKyspCi0JCXsKLQkJICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JCSAgYm9vbGVhbiBhZGp1c3RlZDsKLQotCQkgICpyZWxfaGFzaCA9IE5VTEw7Ci0KLQkJICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3MgYW5kIHN5bWJvbCBpbmRleC4gICovCi0KLQkJICBpcmVsLT5yX3ZhZGRyICs9IG9mZnNldDsKLQotCQkgIGlmIChpcmVsLT5yX3N5bW5keCA9PSAtMSkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKGFkanVzdF9zeW1uZHgpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghICgqYWRqdXN0X3N5bW5keCkgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCQkgICAgICBpbnB1dF9iZmQsIG8sIGlyZWwsCi0JCQkJCSAgICAgICZhZGp1c3RlZCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmIChhZGp1c3RlZCkKLQkJCWNvbnRpbnVlOwotCQkgICAgfQotCi0JCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaXJlbC0+cl9zeW1uZHhdOwotCQkgIGlmIChoICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgc3ltYm9sLiAgKi8KLQkJICAgICAgaWYgKGgtPmluZHggPj0gMCkKLQkJCWlyZWwtPnJfc3ltbmR4ID0gaC0+aW5keDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBUaGlzIHN5bWJvbCBpcyBiZWluZyB3cml0dGVuIGF0IHRoZSBlbmQKLQkJCSAgICAgb2YgdGhlIGZpbGUsIGFuZCB3ZSBkbyBub3QgeWV0IGtub3cgdGhlCi0JCQkgICAgIHN5bWJvbCBpbmRleC4gIFdlIHNhdmUgdGhlIHBvaW50ZXIgdG8gdGhlCi0JCQkgICAgIGhhc2ggdGFibGUgZW50cnkgaW4gdGhlIHJlbF9oYXNoIGxpc3QuCi0JCQkgICAgIFdlIHNldCB0aGUgaW5keCBmaWVsZCB0byAtMiB0byBpbmRpY2F0ZQotCQkJICAgICB0aGF0IHRoaXMgc3ltYm9sIG11c3Qgbm90IGJlIHN0cmlwcGVkLiAgKi8KLQkJCSAgKnJlbF9oYXNoID0gaDsKLQkJCSAgaC0+aW5keCA9IC0yOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaXJlbC0+cl9zeW1uZHhdOwotCQkgICAgICBpZiAoaW5keCAhPSAtMSkKLQkJCWlyZWwtPnJfc3ltbmR4ID0gaW5keDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppczsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCQkJICAvKiBUaGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwcGluZy4gIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkCi0JCQkgICAgIGJ5IHRoZSAnZG9udF9za2lwX3N5bWJvbCcgY29kZSBpbiB0aGUgd2hpbGUKLQkJCSAgICAgbG9vcCBhdCB0aGUgdG9wIG9mIHRoaXMgZnVuY3Rpb24uICovCi0JCQkgIAotCQkJICBpcyA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zICsgaXJlbC0+cl9zeW1uZHg7Ci0KLQkJCSAgbmFtZSA9IChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLQkJCQkgIChpbnB1dF9iZmQsIGlzLCBidWYpKTsKLQkJCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCQkgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG8sCi0JCQkJICBpcmVsLT5yX3ZhZGRyKSkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKz0gby0+cmVsb2NfY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbW9kaWZpZWQgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoc2VjZGF0YSA9PSBOVUxMIHx8IHNlY2RhdGEtPnN0YWJfaW5mbyA9PSBOVUxMKQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJCSAgY29udGVudHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVfcHRyKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvLT5vdXRwdXRfb2Zmc2V0ICogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX29jdGV0c19wZXJfYnl0ZSAob3V0cHV0X2JmZCkpLAotCQkJCQkgIChvLT5fY29va2VkX3NpemUgIT0gMAotCQkJCQkgICA/IG8tPl9jb29rZWRfc2l6ZQotCQkJCQkgICA6IG8tPl9yYXdfc2l6ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLQkJIChvdXRwdXRfYmZkLCAmY29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnN0YWJfaW5mbywKLQkJICBvLCAmc2VjZGF0YS0+c3RhYl9pbmZvLCBjb250ZW50cykpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoaW5wdXRfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBnbG9iYWwgc3ltYm9sLiAgQ2FsbGVkIHZpYSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvID0gKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSBkYXRhOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLQotICBpZiAoaC0+aW5keCA+PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLCBmYWxzZSwgZmFsc2UpCi0JCSAgPT0gTlVMTCkpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3ZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICB7Ci0JYXNlY3Rpb24gKnNlYzsKLQotCXNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkgIGlzeW0ubl9zY251bSA9IE5fQUJTOwotCWVsc2UKLQkgIGlzeW0ubl9zY251bSA9IHNlYy0+dGFyZ2V0X2luZGV4OwotCWlzeW0ubl92YWx1ZSA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JaWYgKCEgb2JqX3BlIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JICBpc3ltLm5fdmFsdWUgKz0gc2VjLT52bWE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3ZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogSnVzdCBpZ25vcmUgdGhlc2UuICBUaGV5IGNhbid0IGJlIGhhbmRsZWQgYW55aG93LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKSA8PSBTWU1OTUxFTikKLSAgICBzdHJuY3B5IChpc3ltLl9uLl9uX25hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJvb2xlYW4gaGFzaDsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotICAgICAgaGFzaCA9IHRydWU7Ci0gICAgICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLQloYXNoID0gZmFsc2U7Ci0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoYXNoLAotCQkJCSBmYWxzZSk7Ci0gICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JewotCSAgZmluZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaXN5bS5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gICAgICBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0gICAgfQotCi0gIGlzeW0ubl9zY2xhc3MgPSBoLT5jbGFzczsKLSAgaXN5bS5uX3R5cGUgPSBoLT50eXBlOwotCi0gIGlmIChpc3ltLm5fc2NsYXNzID09IENfTlVMTCkKLSAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0KLSAgLyogSWYgZG9pbmcgdGFzayBsaW5raW5nIGFuZCB0aGlzIGlzIHRoZSBwYXNzIHdoZXJlIHdlIGNvbnZlcnQKLSAgICAgZGVmaW5lZCBnbG9iYWxzIHRvIHN0YXRpY3MsIHRoZW4gZG8gdGhhdCBjb252ZXJzaW9uIG5vdy4gIElmIHRoZQotICAgICBzeW1ib2wgaXMgbm90IGJlaW5nIGNvbnZlcnRlZCwganVzdCBpZ25vcmUgaXQgYW5kIGl0IHdpbGwgYmUKLSAgICAgb3V0cHV0IGR1cmluZyBhIGxhdGVyIHBhc3MuICovCi0gIGlmIChmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYykKLSAgICB7Ci0gICAgICBpZiAoaXN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCSAgJiYgaXN5bS5uX3NjbGFzcyAhPSBDX1dFQUtFWFQKLQkgICYmICghIG9ial9wZSAob3V0cHV0X2JmZCkgfHwgaXN5bS5uX3NjbGFzcyAhPSBDX05UX1dFQUspKQotCXsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gICAgfQotCi0gIGlzeW0ubl9udW1hdXggPSBoLT5udW1hdXg7Ci0gIAotICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBmaW5mby0+b3V0c3ltcyk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSAqIHN5bWVzeiksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBzeW1lc3osIDEsIG91dHB1dF9iZmQpICE9IHN5bWVzeikKLSAgICB7Ci0gICAgICBmaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaC0+aW5keCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICArK29ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgYW55IGFzc29jaWF0ZWQgYXV4IGVudHJpZXMuICBNb3N0IG9mIHRoZSBhdXggZW50cmllcwotICAgICB3aWxsIGhhdmUgYmVlbiBtb2RpZmllZCBpbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQuICBXZSBoYXZlIHRvCi0gICAgIGhhbmRsZSBzZWN0aW9uIGF1eCBlbnRyaWVzIGhlcmUsIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGZpbmFsCi0gICAgIHJlbG9jYXRpb24gYW5kIGxpbmUgbnVtYmVyIGNvdW50cy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBpc3ltLm5fbnVtYXV4OyBpKyspCi0gICAgewotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXhwOwotCi0gICAgICBhdXhwID0gaC0+YXV4ICsgaTsKLQotICAgICAgLyogTG9vayBmb3IgYSBzZWN0aW9uIGF1eCBlbnRyeSBoZXJlIHVzaW5nIHRoZSBzYW1lIHRlc3RzIHRoYXQKLSAgICAgICAgIGNvZmZfc3dhcF9hdXhfb3V0IHVzZXMuICAqLwotICAgICAgaWYgKGkgPT0gMAotCSAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19TVEFUCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0hJRERFTikKLQkgICYmIGlzeW0ubl90eXBlID09IFRfTlVMTAotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9zY25sZW4gPSAoc2VjLT5fY29va2VkX3NpemUgIT0gMAotCQkJCSAgICAgID8gc2VjLT5fY29va2VkX3NpemUKLQkJCQkgICAgICA6IHNlYy0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIEZvciBQRSwgYW4gb3ZlcmZsb3cgb24gdGhlIGZpbmFsIGxpbmsgcmVwb3J0ZWRseSBkb2VzCi0gICAgICAgICAgICAgICAgIG5vdCBtYXR0ZXIuICBGSVhNRTogV2h5IG5vdD8gICovCi0KLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IDB4ZmZmZgotCQkgICYmICghIG9ial9wZSAob3V0cHV0X2JmZCkKLQkJICAgICAgfHwgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkpCi0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogJXM6IHJlbG9jIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlYyksCi0JCSAgIHNlYy0+cmVsb2NfY291bnQpOwotCi0JICAgICAgaWYgKHNlYy0+bGluZW5vX2NvdW50ID4gMHhmZmZmCi0JCSAgJiYgKCEgb2JqX3BlIChvdXRwdXRfYmZkKQotCQkgICAgICB8fCBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKSkKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiB3YXJuaW5nOiAlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAotCQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgc2VjKSwKLQkJICAgc2VjLT5saW5lbm9fY291bnQpOwotCi0JICAgICAgYXV4cC0+eF9zY24ueF9ucmVsb2MgPSBzZWMtPnJlbG9jX2NvdW50OwotCSAgICAgIGF1eHAtPnhfc2NuLnhfbmxpbm5vID0gc2VjLT5saW5lbm9fY291bnQ7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9jaGVja3N1bSA9IDA7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9hc3NvY2lhdGVkID0gMDsKLQkgICAgICBhdXhwLT54X3Njbi54X2NvbWRhdCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgYXV4cCwgaXN5bS5uX3R5cGUsCi0JCQkgICAgIGlzeW0ubl9zY2xhc3MsIGksIGlzeW0ubl9udW1hdXgsCi0JCQkgICAgIChQVFIpIGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBzeW1lc3osIDEsIG91dHB1dF9iZmQpICE9IHN5bWVzeikKLQl7Ci0JICBmaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArK29ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0YXNrIGdsb2JhbCBzeW1ib2xzLCBjb252ZXJ0aW5nIHRoZW0gdG8gc3RhdGljcy4gIENhbGxlZAotICAgdmlhIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlLiAgQ2FsbHMgYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSB0byBkbwotICAgdGhlIGRpcnR5IHdvcmssIGlmIHRoZSBzeW1ib2wgd2UgYXJlIHByb2Nlc3NpbmcgbmVlZHMgY29udmVyc2lvbi4gKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKLSAgYm9vbGVhbiBydG52YWwgPSB0cnVlOwotICBib29sZWFuIHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKLQotICBpZiAoaC0+aW5keCA8IDApCi0gICAgewotICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JewotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgc2F2ZV9nbG9iYWxfdG9fc3RhdGljID0gZmluZm8tPmdsb2JhbF90b19zdGF0aWM7Ci0JICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHRydWU7Ci0JICBydG52YWwgPSBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSAoaCwgZGF0YSk7Ci0JICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHJ0bnZhbCk7Ci19Ci0KLS8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBmaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKLQotICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsCi0JCQkJICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoZmluZm8tPmluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQotCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKLQkJICBob3d0by0+bmFtZSwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsCi0JCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmtfb3JkZXItPm9mZnNldCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9vY3RldHNfcGVyX2J5dGUgKG91dHB1dF9iZmQpKSwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTdG9yZSB0aGUgcmVsb2MgaW5mb3JtYXRpb24gaW4gdGhlIHJpZ2h0IHBsYWNlLiAgSXQgd2lsbCBnZXQKLSAgICAgc3dhcHBlZCBhbmQgd3JpdHRlbiBvdXQgYXQgdGhlIGVuZCBvZiB0aGUgZmluYWxfbGluayByb3V0aW5lLiAgKi8KLQotICBpcmVsID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsb2NzCi0JICArIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0gIHJlbF9oYXNoX3B0ciA9IChmaW5mby0+c2VjdGlvbl9pbmZvW291dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMKLQkJICArIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0KLSAgbWVtc2V0IChpcmVsLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOwotICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLQotICBpcmVsLT5yX3ZhZGRyID0gb3V0cHV0X3NlY3Rpb24tPnZtYSArIGxpbmtfb3JkZXItPm9mZnNldDsKLQotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gc29tZWhvdyBsb2NhdGUgYSBzeW1ib2wgaW4gdGhlIHJpZ2h0IHNlY3Rpb24uICBUaGUKLSAgICAgICAgIHN5bWJvbCBtdXN0IGVpdGhlciBoYXZlIGEgdmFsdWUgb2YgemVybywgb3Igd2UgbXVzdCBhZGp1c3QKLSAgICAgICAgIHRoZSBhZGRlbmQgYnkgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBGSVhNRTogV3JpdGUgdGhpcwotICAgICAgICAgd2hlbiB3ZSBuZWVkIGl0LiAgVGhlIG9sZCBsaW5rZXIgY291bGRuJ3QgaGFuZGxlIHRoaXMgYW55aG93LiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgICAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkJIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMKQotCXsKLQkgIGlmIChoLT5pbmR4ID49IDApCi0JICAgIGlyZWwtPnJfc3ltbmR4ID0gaC0+aW5keDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNldCB0aGUgaW5kZXggdG8gLTIgdG8gZm9yY2UgdGhpcyBzeW1ib2wgdG8gZ2V0Ci0JCSB3cml0dGVuIG91dC4gICovCi0JICAgICAgaC0+aW5keCA9IC0yOwotCSAgICAgICpyZWxfaGFzaF9wdHIgPSBoOwotCSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGZpbmZvLT5pbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwgKGJmZCAqKSBOVUxMLAotCQkgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpcmVsLT5yX3N5bW5keCA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBGSVhNRTogSXMgdGhpcyBhbHdheXMgcmlnaHQ/ICAqLwotICBpcmVsLT5yX3R5cGUgPSBob3d0by0+dHlwZTsKLQotICAvKiByX3NpemUgaXMgb25seSB1c2VkIG9uIHRoZSBSUy82MDAwLCB3aGljaCBuZWVkcyBpdHMgb3duIGxpbmtlcgotICAgICByb3V0aW5lcyBhbnlob3cuICByX2V4dGVybiBpcyBvbmx5IHVzZWQgZm9yIEVDT0ZGLiAgKi8KLQotICAvKiBGSVhNRTogV2hhdCBpcyB0aGUgcmlnaHQgdmFsdWUgZm9yIHJfb2Zmc2V0PyAgSXMgemVybyBPSz8gICovCi0KLSAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEEgYmFzaWMgcmVsb2MgaGFuZGxpbmcgcm91dGluZSB3aGljaCBtYXkgYmUgdXNlZCBieSBwcm9jZXNzb3JzIHdpdGgKLSAgIHNpbXBsZSByZWxvY3MuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsCi0JCQkJICAgIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltbmR4IDwgMAotCSAgICAgICB8fCAodW5zaWduZWQgbG9uZykgc3ltbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoIiVzOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIiwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHN5bW5keCk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIENPRkYgdHJlYXRzIGNvbW1vbiBzeW1ib2xzIGluIG9uZSBvZiB0d28gd2F5cy4gIEVpdGhlciB0aGUKLSAgICAgICAgIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgb3IgaXQKLSAgICAgICAgIGlzIG5vdC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzaXplIGlzIG5vdCBpbmNsdWRlZCwgYW5kIGZvcmNlCi0gICAgICAgICB0aGUgcnR5cGVfdG9faG93dG8gZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBhZGRlbmQgYXMgbmVlZGVkLiAgKi8KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLQotICAgICAgaG93dG8gPSBiZmRfY29mZl9ydHlwZV90b19ob3d0byAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwsIGgsCi0JCQkJICAgICAgIHN5bSwgJmFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGVuIHdlIGNhbiBqdXN0IGlnbm9yZQotICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyB0aGF0IGlzIHBjcmVsX29mZnNldC4gIEl0IHdpbGwgYWxyZWFkeQotICAgICAgICAgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIElmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssCi0gICAgICAgICB0aGVuIHdlIHNob3VsZCBpZ25vcmUgdGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JewotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgY29udGludWU7Ci0JICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JICAgIGFkZGVuZCArPSBzeW0tPm5fdmFsdWU7Ci0JfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKGlucHV0X2JmZCkpCi0JCXZhbCAtPSBzZWMtPnZtYTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotCXsKLQkgIC8qIEVtaXQgYSByZWxvYyBpZiB0aGUgYmFja2VuZCB0aGlua3MgaXQgbmVlZHMgaXQuICovCi0JICBpZiAoc3ltICYmIHBlX2RhdGEgKG91dHB1dF9iZmQpLT5pbl9yZWxvY19wIChvdXRwdXRfYmZkLCBob3d0bykpCi0JICAgIHsKLQkgICAgICAvKiBSZWxvY2F0aW9uIHRvIGEgc3ltYm9sIGluIGEgc2VjdGlvbiB3aGljaCBpc24ndAotCQkgYWJzb2x1dGUuICBXZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSB0byBhIGZpbGUuCi0JCSBUaGlzIGZpbGUgaXMgdGhlbiByZWFkIGJ5IGRsbHRvb2wgd2hlbiBnZW5lcmF0aW5nIHRoZQotCQkgcmVsb2Mgc2VjdGlvbi4gIE5vdGUgdGhhdCB0aGUgYmFzZSBmaWxlIGlzIG5vdAotCQkgcG9ydGFibGUgYmV0d2VlbiBzeXN0ZW1zLiAgV2Ugd3JpdGUgb3V0IGEgbG9uZyBoZXJlLAotCQkgYW5kIGRsbHRvb2wgcmVhZHMgaW4gYSBsb25nLiAgKi8KLQkgICAgICBsb25nIGFkZHIgPSAocmVsLT5yX3ZhZGRyIAotCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEgCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgICAgIGlmIChjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLQkJYWRkciAtPSBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCSAgICAgIGlmIChmd3JpdGUgKCZhZGRyLCAxLCBzaXplb2YgKGxvbmcpLCAoRklMRSAqKSBpbmZvLT5iYXNlX2ZpbGUpCi0JCSAgIT0gc2l6ZW9mIChsb25nKSkKLQkJewotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQl9Ci0gIAotICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLAotCQkJCQlyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0JCQkJCXZhbCwgYWRkZW5kKTsKLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGJhZCByZWxvYyBhZGRyZXNzIDB4JWx4IGluIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIsCi0JICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmZzd2FwLmggYi9iZmQvY29mZnN3YXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkMDkwZi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZnN3YXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyMCArMCwwIEBACi0vKiBHZW5lcmljIENPRkYgc3dhcHBpbmcgcm91dGluZXMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHVzZWQgdG8gc3dhcCBDT0ZGIGRhdGEuICBJdCBpcyBhIGhlYWRlcgotICAgZmlsZSBiZWNhdXNlIHRoZSBkZXRhaWxzIG9mIHN3YXBwaW5nIGRlcGVuZCBvbiB0aGUgZGV0YWlscyBvZiB0aGUKLSAgIHN0cnVjdHVyZXMgdXNlZCBieSBlYWNoIENPRkYgaW1wbGVtZW50YXRpb24uICBUaGlzIGlzIGluY2x1ZGVkIGJ5Ci0gICBjb2ZmY29kZS5oLCBhcyB3ZWxsIGFzIGJ5IHRoZSBFQ09GRiBiYWNrZW5kLgotCi0gICBBbnkgZmlsZSB3aGljaCB1c2VzIHRoaXMgbXVzdCBmaXJzdCBpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiIGFuZAotICAgImNvZmYvQ1BVLmgiLiAgVGhlIGZ1bmN0aW9ucyB3aWxsIHRoZW4gYmUgY29ycmVjdCBmb3IgdGhhdCBDUFUuICAqLwotCi0jZGVmaW5lIFBVVFdPUkQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFBVVEhBTEYgYmZkX2hfcHV0XzE2Ci0jZGVmaW5lCVBVVEJZVEUgYmZkX2hfcHV0XzgKLQotI2lmbmRlZiBHRVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgR0VUX0ZDTl9MTk5PUFRSKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLQotI2lmbmRlZiBHRVRfRkNOX0VORE5EWAotI2RlZmluZSBHRVRfRkNOX0VORE5EWChhYmZkLCBleHQpICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLQotI2lmbmRlZiBQVVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsIGluLCBleHQpICBQVVRXT1JEKGFiZmQsICBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9GQ05fRU5ETkRYCi0jZGVmaW5lIFBVVF9GQ05fRU5ETkRYKGFiZmQsIGluLCBleHQpIFBVVFdPUkQoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2VuZGlmCi0jaWZuZGVmIEdFVF9MTlNaX0xOTk8KLSNkZWZpbmUgR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9TSVpFCi0jZGVmaW5lIEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfTE5OTwotI2RlZmluZSBQVVRfTE5TWl9MTk5PKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNlbmRpZgotI2lmbmRlZiBQVVRfTE5TWl9TSVpFCi0jZGVmaW5lIFBVVF9MTlNaX1NJWkUoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05fU0NOTEVOCi0jZGVmaW5lIEdFVF9TQ05fU0NOTEVOKGFiZmQsICBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX05SRUxPQwotI2RlZmluZSBHRVRfU0NOX05SRUxPQyhhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX05MSU5OTwotI2RlZmluZSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpICBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25saW5ubykKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOX1NDTkxFTgotI2RlZmluZSBQVVRfU0NOX1NDTkxFTihhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9OUkVMT0MKLSNkZWZpbmUgUFVUX1NDTl9OUkVMT0MoYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9OTElOTk8KLSNkZWZpbmUgUFVUX1NDTl9OTElOTk8oYWJmZCxpbiwgZXh0KSAgYmZkX2hfcHV0XzE2KGFiZmQsaW4sIChiZmRfYnl0ZSAgKikgZXh0LT54X3Njbi54X25saW5ubykKLSNlbmRpZgotI2lmbmRlZiBHRVRfTElORU5PX0xOTk8KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNlbmRpZgotI2lmbmRlZiBQVVRfTElORU5PX0xOTk8KLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNlbmRpZgotCi0vKiBUaGUgZl9zeW1wdHIgZmllbGQgaW4gdGhlIGZpbGVoZHIgaXMgc29tZXRpbWVzIDY0IGJpdHMuICAqLwotI2lmbmRlZiBHRVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgR0VUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9GSUxFSERSX1NZTVBUUgotI2RlZmluZSBQVVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotLyogU29tZSBmaWVsZHMgaW4gdGhlIGFvdXRoZHIgYXJlIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0FPVVRIRFJfVFNJWkUKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVFNJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfVFNJWkUKLSNkZWZpbmUgUFVUX0FPVVRIRFJfVFNJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfRFNJWkUKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRFNJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfRFNJWkUKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRFNJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfQlNJWkUKLSNkZWZpbmUgR0VUX0FPVVRIRFJfQlNJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfQlNJWkUKLSNkZWZpbmUgUFVUX0FPVVRIRFJfQlNJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfRU5UUlkKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRU5UUlkgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfRU5UUlkKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRU5UUlkgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBzY25oZHIgYXJlIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX1NDTkhEUl9QQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1BBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9QQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1ZBRERSCi0jZGVmaW5lIEdFVF9TQ05IRFJfVkFERFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9WQUREUgotI2RlZmluZSBQVVRfU0NOSERSX1ZBRERSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfU0laRQotI2RlZmluZSBHRVRfU0NOSERSX1NJWkUgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TSVpFCi0jZGVmaW5lIFBVVF9TQ05IRFJfU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NDTlBUUgotI2RlZmluZSBHRVRfU0NOSERSX1NDTlBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1NDTlBUUgotI2RlZmluZSBQVVRfU0NOSERSX1NDTlBUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1JFTFBUUgotI2RlZmluZSBHRVRfU0NOSERSX1JFTFBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1JFTFBUUgotI2RlZmluZSBQVVRfU0NOSERSX1JFTFBUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfTE5OT1BUUgotI2RlZmluZSBQVVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9OUkVMT0MKLSNkZWZpbmUgR0VUX1NDTkhEUl9OUkVMT0MgYmZkX2hfZ2V0XzE2Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9OUkVMT0MKLSNkZWZpbmUgUFVUX1NDTkhEUl9OUkVMT0MgYmZkX2hfcHV0XzE2Ci0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9OTE5OTwotI2RlZmluZSBHRVRfU0NOSERSX05MTk5PIGJmZF9oX2dldF8xNgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfTkxOTk8KLSNkZWZpbmUgUFVUX1NDTkhEUl9OTE5OTyBiZmRfaF9wdXRfMTYKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX0ZMQUdTCi0jZGVmaW5lIEdFVF9TQ05IRFJfRkxBR1MgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9GTEFHUwotI2RlZmluZSBQVVRfU0NOSERSX0ZMQUdTIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQgY29mZl9zd2FwX2FvdXRoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9hb3V0aGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9zY25oZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9zY25oZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2ZpbGVoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9maWxlaGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNpZm5kZWYgTk9fQ09GRl9SRUxPQ1MKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNlbmRpZiAvKiBOT19DT0ZGX1JFTE9DUyAqLwotI2lmbmRlZiBOT19DT0ZGX1NZTUJPTFMKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9zeW1fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2F1eF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfYXV4X291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBpbnQsIGludCwgaW50LCBpbnQsIFBUUikpOwotI2VuZGlmIC8qIE5PX0NPRkZfU1lNQk9MUyAqLwotI2lmbmRlZiBOT19DT0ZGX0xJTkVOT1MKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9saW5lbm9faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9saW5lbm9fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2VuZGlmIC8qIE5PX0NPRkZfTElORU5PUyAqLwotCi0jaWZuZGVmIE5PX0NPRkZfUkVMT0NTCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIFJFTE9DICpyZWxvY19zcmMgPSAoUkVMT0MgKikgc3JjOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgZHN0OwotCi0gIHJlbG9jX2RzdC0+cl92YWRkciA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilyZWxvY19zcmMtPnJfdmFkZHIpOwotICByZWxvY19kc3QtPnJfc3ltbmR4ID0gYmZkX2hfZ2V0X3NpZ25lZF8zMihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3N5bW5keCk7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgcmVsb2NfZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfOChhYmZkLCByZWxvY19zcmMtPnJfdHlwZSk7Ci0gIHJlbG9jX2RzdC0+cl9zaXplID0gYmZkX2hfZ2V0XzgoYWJmZCwgcmVsb2Nfc3JjLT5yX3NpemUpOwotI2Vsc2UKLSAgcmVsb2NfZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl90eXBlKTsKLSNlbmRpZgotCi0jaWZkZWYgU1dBUF9JTl9SRUxPQ19PRkZTRVQKLSAgcmVsb2NfZHN0LT5yX29mZnNldCA9IFNXQVBfSU5fUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQkJCSAgICAgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9vZmZzZXQpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglzcmM7Ci0gICAgIFBUUglkc3Q7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2Nfc3JjID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKXNyYzsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpyZWxvY19kc3QgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopZHN0OwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3ZhZGRyLCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3ZhZGRyKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIHJlbG9jX3NyYy0+cl9zeW1uZHgsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfc3ltbmR4KTsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBiZmRfaF9wdXRfOCAoYWJmZCwgcmVsb2Nfc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdHlwZSk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCByZWxvY19zcmMtPnJfc2l6ZSwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zaXplKTsKLSNlbHNlCi0gIGJmZF9oX3B1dF8xNihhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopCi0JICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLSNlbmRpZgotCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCi0gIFNXQVBfT1VUX1JFTE9DX09GRlNFVChhYmZkLAotCQkJcmVsb2Nfc3JjLT5yX29mZnNldCwKLQkJCShiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfb2Zmc2V0KTsKLSNlbmRpZgotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX0VYVFJBCi0gIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQscmVsb2Nfc3JjLCByZWxvY19kc3QpOwotI2VuZGlmCi0KLSAgcmV0dXJuIGJmZF9jb2ZmX3JlbHN6IChhYmZkKTsKLX0KLQotI2VuZGlmIC8qIE5PX0NPRkZfUkVMT0NTICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfZmlsZWhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIJICAgICBzcmM7Ci0gICAgIFBUUgkgICAgIGRzdDsKLXsKLSAgRklMSERSICpmaWxlaGRyX3NyYyA9IChGSUxIRFIgKikgc3JjOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9kc3QgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZHN0OwotI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUFJFCi0gIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUFJFIChhYmZkLCBzcmMsIGRzdCk7Ci0jZW5kaWYKLSAgZmlsZWhkcl9kc3QtPmZfbWFnaWMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfc3JjLT5mX21hZ2ljKTsKLSAgZmlsZWhkcl9kc3QtPmZfbnNjbnMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX25zY25zKTsKLSAgZmlsZWhkcl9kc3QtPmZfdGltZGF0ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl90aW1kYXQpOwotICBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPQotICAgIEdFVF9GSUxFSERSX1NZTVBUUiAoYWJmZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfc3JjLT5mX3N5bXB0cik7Ci0gIGZpbGVoZHJfZHN0LT5mX25zeW1zID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc3ltcyk7Ci0gIGZpbGVoZHJfZHN0LT5mX29wdGhkciA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfb3B0aGRyKTsKLSAgZmlsZWhkcl9kc3QtPmZfZmxhZ3MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX2ZsYWdzKTsKLSNpZmRlZiBUSUM4MF9UQVJHRVRfSUQKLSAgZmlsZWhkcl9kc3QtPmZfdGFyZ2V0X2lkID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl90YXJnZXRfaWQpOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QKLSAgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QT1NUIChhYmZkLCBzcmMsIGRzdCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljICB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopaW47Ci0gIEZJTEhEUiAqZmlsZWhkcl9vdXQgPSAoRklMSERSICopb3V0OwotCi0jaWZkZWYgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUFJFCi0gIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRSAoYWJmZCwgaW4sIG91dCk7Ci0jZW5kaWYKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbWFnaWMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9tYWdpYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX25zY25zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnNjbnMpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl90aW1kYXQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl90aW1kYXQpOwotICBQVVRfRklMRUhEUl9TWU1QVFIgKGFiZmQsIChiZmRfdm1hKSBmaWxlaGRyX2luLT5mX3N5bXB0ciwKLQkJICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3N5bXB0cik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX25zeW1zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnN5bXMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9vcHRoZHIsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9vcHRoZHIpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9mbGFncywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX2ZsYWdzKTsKLSNpZmRlZiBUSUM4MF9UQVJHRVRfSUQKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfdGFyZ2V0X2lkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGFyZ2V0X2lkKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVAotICBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QT1NUIChhYmZkLCBpbiwgb3V0KTsKLSNlbmRpZgotICByZXR1cm4gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLX0KLQotCi0jaWZuZGVmIE5PX0NPRkZfU1lNQk9MUwotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIFNZTUVOVCAqZXh0ID0gKFNZTUVOVCAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWluMTsKLQotICBpZiggZXh0LT5lLmVfbmFtZVswXSA9PSAwKSB7Ci0gICAgaW4tPl9uLl9uX24uX25femVyb2VzID0gMDsKLSAgICBpbi0+X24uX25fbi5fbl9vZmZzZXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKLSAgfQotICBlbHNlIHsKLSNpZiBTWU1OTUxFTiAhPSBFX1NZTU5NTEVOCi0gICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOwotI2Vsc2UKLSAgICBtZW1jcHkoaW4tPl9uLl9uX25hbWUsIGV4dC0+ZS5lX25hbWUsIFNZTU5NTEVOKTsKLSNlbmRpZgotICB9Ci0gIGluLT5uX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOyAKLSAgaW4tPm5fc2NudW0gPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpewotICAgIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgaW4tPm5fc2NsYXNzID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX3NjbGFzcyk7Ci0gIGluLT5uX251bWF1eCA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9udW1hdXgpOwotI2lmZGVmIENPRkZfQURKVVNUX1NZTV9JTl9QT1NUCi0gIENPRkZfQURKVVNUX1NZTV9JTl9QT1NUIChhYmZkLCBleHQxLCBpbjEpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnAsIGV4dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbnA7Ci0gIFNZTUVOVCAqZXh0ID0oU1lNRU5UICopZXh0cDsKLSAgaWYoaW4tPl9uLl9uX25hbWVbMF0gPT0gMCkgewotICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV96ZXJvZXMpOwotICAgIGJmZF9oX3B1dF8zMihhYmZkLCBpbi0+X24uX25fbi5fbl9vZmZzZXQsIChiZmRfYnl0ZSAqKSAgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotI2lmIFNZTU5NTEVOICE9IEVfU1lNTk1MRU4KLSAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOwotI2Vsc2UKLSAgICBtZW1jcHkoZXh0LT5lLmVfbmFtZSwgaW4tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLSNlbmRpZgotICB9Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4tPm5fdmFsdWUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl9zY251bSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKQotICAgICAgewotCWJmZF9oX3B1dF8xNihhYmZkLCAgaW4tPm5fdHlwZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gICAgICB9Ci0gIGVsc2UKLSAgICAgIHsKLQliZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgICAgfQotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fc2NsYXNzICwgZXh0LT5lX3NjbGFzcyk7Ci0gIGJmZF9oX3B1dF84KGFiZmQsICBpbi0+bl9udW1hdXggLCBleHQtPmVfbnVtYXV4KTsKLSNpZmRlZiBDT0ZGX0FESlVTVF9TWU1fT1VUX1BPU1QKLSAgQ09GRl9BREpVU1RfU1lNX09VVF9QT1NUIChhYmZkLCBpbnAsIGV4dHApOwotI2VuZGlmCi0gIHJldHVybiBTWU1FU1o7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgCSAgICAgIGV4dDE7Ci0gICAgIGludCAgICAgICAgICAgICB0eXBlOwotICAgICBpbnQgICAgICAgICAgICAgY2xhc3M7Ci0gICAgIGludAkgICAgICBpbmR4OwotICAgICBpbnQJICAgICAgbnVtYXV4OwotICAgICBQVFIgCSAgICAgIGluMTsKLXsKLSAgQVVYRU5UICAgICpleHQgPSAoQVVYRU5UICopZXh0MTsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbjE7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfSU5fUFJFCi0gIENPRkZfQURKVVNUX0FVWF9JTl9QUkUgKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSk7Ci0jZW5kaWYKLSAgc3dpdGNoIChjbGFzcykgewotICAgIGNhc2UgQ19GSUxFOgotICAgICAgaWYgKGV4dC0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgewotCSAgaW4tPnhfZmlsZS54X24ueF96ZXJvZXMgPSAwOwotCSAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQgPSAKLQkgICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7Ci0JfSBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0JICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBGSUxOTUxFTiE7Ci0jZWxzZQotCSAgICBpZiAobnVtYXV4ID4gMSkKLQkgICAgICB7Ci0JCWlmIChpbmR4ID09IDApCi0JCSAgbWVtY3B5IChpbi0+eF9maWxlLnhfZm5hbWUsIGV4dC0+eF9maWxlLnhfZm5hbWUsCi0JCQkgIG51bWF1eCAqIHNpemVvZiAoQVVYRU5UKSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQltZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotCSAgICAgIH0KLSNlbmRpZgotCSAgfQotICAgICAgZ290byBlbmQ7Ci0KLSAgICAgIC8qIFJTLzYwMDAgImNzZWN0IiBhdXhlbnRzICovCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfSElERVhUOgotICAgICAgaWYgKGluZHggKyAxID09IG51bWF1eCkKLQl7Ci0JICBpbi0+eF9jc2VjdC54X3Njbmxlbi5sID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPnhfY3NlY3QueF9zY25sZW4pOwotCSAgaW4tPnhfY3NlY3QueF9wYXJtaGFzaCA9IGJmZF9oX2dldF8zMiAoYWJmZCwKLQkJCQkJCSBleHQtPnhfY3NlY3QueF9wYXJtaGFzaCk7Ci0JICBpbi0+eF9jc2VjdC54X3NuaGFzaCAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPnhfY3NlY3QueF9zbmhhc2gpOwotCSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBoYWNrIGJpdGZpZWxkcyBpbiB4X3NtdHlwIGJlY2F1c2UgaXQncwotCSAgICAgZGVmaW5lZCBieSBzaGlmdHMtYW5kLWFuZHMsIHdoaWNoIGFyZSBlcXVpdmFsZW50IG9uIGFsbAotCSAgICAgYnl0ZSBvcmRlcnMuICAqLwotCSAgaW4tPnhfY3NlY3QueF9zbXR5cCAgICA9IGJmZF9oX2dldF84ICAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc210eXApOwotCSAgaW4tPnhfY3NlY3QueF9zbWNsYXMgICA9IGJmZF9oX2dldF84ICAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc21jbGFzKTsKLQkgIGluLT54X2NzZWN0Lnhfc3RhYiAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3N0YWIpOwotCSAgaW4tPnhfY3NlY3QueF9zbnN0YWIgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc25zdGFiKTsKLQkgIGdvdG8gZW5kOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIENfU1RBVDoKLSNpZmRlZiBDX0xFQUZTVEFUCi0gICAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gICAgY2FzZSBDX0hJRERFTjoKLSAgICAgIGlmICh0eXBlID09IFRfTlVMTCkgewotCSAgaW4tPnhfc2NuLnhfc2NubGVuID0gR0VUX1NDTl9TQ05MRU4oYWJmZCwgZXh0KTsKLQkgIGluLT54X3Njbi54X25yZWxvYyA9IEdFVF9TQ05fTlJFTE9DKGFiZmQsIGV4dCk7Ci0JICBpbi0+eF9zY24ueF9ubGlubm8gPSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpOwotCi0JICAvKiBQRSBkZWZpbmVzIHNvbWUgZXh0cmEgZmllbGRzOyB3ZSB6ZXJvIHRoZW0gb3V0IGZvcgotICAgICAgICAgICAgIHNhZmV0eS4gICovCi0JICBpbi0+eF9zY24ueF9jaGVja3N1bSA9IDA7Ci0JICBpbi0+eF9zY24ueF9hc3NvY2lhdGVkID0gMDsKLQkgIGluLT54X3Njbi54X2NvbWRhdCA9IDA7Ci0KLQkgIGdvdG8gZW5kOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpbi0+eF9zeW0ueF90YWduZHgubCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7Ci0jaWZuZGVmIE5PX1RWTkRYCi0gIGluLT54X3N5bS54X3R2bmR4ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOwotI2VuZGlmCi0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9IEdFVF9GQ05fTE5OT1BUUiAoYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gR0VUX0ZDTl9FTkRORFggKGFiZmQsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotCi0gIGlmIChJU0ZDTih0eXBlKSkgewotICAgIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vID0gR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpOwotICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSA9IEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KTsKLSAgfQotCi1lbmQ6IDsKLSAgLyogdGhlIHNlbWljb2xvbiBpcyBiZWNhdXNlIE1TVkMgZG9lc24ndCBsaWtlIGxhYmVscyBhdAotICAgICBlbmQgb2YgYmxvY2suICovCi0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVCAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYXV4X291dCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQotICAgICBiZmQgICAqYWJmZDsKLSAgICAgUFRSIAlpbnA7Ci0gICAgIGludCAgIHR5cGU7Ci0gICAgIGludCAgIGNsYXNzOwotICAgICBpbnQgICBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCAgIG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIJZXh0cDsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbnA7Ci0gIEFVWEVOVCAqZXh0ID0gKEFVWEVOVCAqKWV4dHA7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRQotICBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRSAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKTsKLSNlbmRpZgotICBtZW1zZXQoKFBUUilleHQsIDAsIEFVWEVTWik7Ci0gIHN3aXRjaCAoY2xhc3MpIHsKLSAgY2FzZSBDX0ZJTEU6Ci0gICAgaWYgKGluLT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7Ci0gICAgICBQVVRXT1JEKGFiZmQsIDAsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF96ZXJvZXMpOwotICAgICAgUFVUV09SRChhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0gICAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRklMTk1MRU4hOwotI2Vsc2UKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZ290byBlbmQ7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogUlMvNjAwMCAiY3NlY3QiIGF1eGVudHMgKi8KLSAgY2FzZSBDX0VYVDoKLSAgY2FzZSBDX0hJREVYVDoKLSAgICBpZiAoaW5keCArIDEgPT0gbnVtYXV4KQotICAgICAgewotCVBVVFdPUkQgKGFiZmQsIGluLT54X2NzZWN0Lnhfc2NubGVuLmwsCWV4dC0+eF9jc2VjdC54X3Njbmxlbik7Ci0JUFVUV09SRCAoYWJmZCwgaW4tPnhfY3NlY3QueF9wYXJtaGFzaCwJZXh0LT54X2NzZWN0LnhfcGFybWhhc2gpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25oYXNoLAlleHQtPnhfY3NlY3QueF9zbmhhc2gpOwotCS8qIFdlIGRvbid0IGhhdmUgdG8gaGFjayBiaXRmaWVsZHMgaW4geF9zbXR5cCBiZWNhdXNlIGl0J3MKLQkgICBkZWZpbmVkIGJ5IHNoaWZ0cy1hbmQtYW5kcywgd2hpY2ggYXJlIGVxdWl2YWxlbnQgb24gYWxsCi0JICAgYnl0ZSBvcmRlcnMuICAqLwotCVBVVEJZVEUgKGFiZmQsIGluLT54X2NzZWN0Lnhfc210eXAsCWV4dC0+eF9jc2VjdC54X3NtdHlwKTsKLQlQVVRCWVRFIChhYmZkLCBpbi0+eF9jc2VjdC54X3NtY2xhcywJZXh0LT54X2NzZWN0Lnhfc21jbGFzKTsKLQlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3N0YWIsCWV4dC0+eF9jc2VjdC54X3N0YWIpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25zdGFiLAlleHQtPnhfY3NlY3QueF9zbnN0YWIpOwotCWdvdG8gZW5kOwotICAgICAgfQotICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgY2FzZSBDX1NUQVQ6Ci0jaWZkZWYgQ19MRUFGU1RBVAotICBjYXNlIENfTEVBRlNUQVQ6Ci0jZW5kaWYKLSAgY2FzZSBDX0hJRERFTjoKLSAgICBpZiAodHlwZSA9PSBUX05VTEwpIHsKLSAgICAgIFBVVF9TQ05fU0NOTEVOKGFiZmQsIGluLT54X3Njbi54X3NjbmxlbiwgZXh0KTsKLSAgICAgIFBVVF9TQ05fTlJFTE9DKGFiZmQsIGluLT54X3Njbi54X25yZWxvYywgZXh0KTsKLSAgICAgIFBVVF9TQ05fTkxJTk5PKGFiZmQsIGluLT54X3Njbi54X25saW5ubywgZXh0KTsKLSAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIFBVVFdPUkQoYWJmZCwgaW4tPnhfc3ltLnhfdGFnbmR4LmwsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGluLT54X3N5bS54X3R2bmR4ICwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIGV4dCk7Ci0gICAgICBQVVRfRkNOX0VORE5EWChhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04gKHR5cGUpKQotICAgIFBVVFdPUkQgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSwKLQkgICAgIChiZmRfYnl0ZSAqKSAgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQVVRfTE5TWl9MTk5PIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8sIGV4dCk7Ci0gICAgICBQVVRfTE5TWl9TSVpFIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsIGV4dCk7Ci0gICAgfQotCi1lbmQ6Ci0jaWZkZWYgQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUCi0gIENPRkZfQURKVVNUX0FVWF9PVVRfUE9TVCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKTsKLSNlbmRpZgotICByZXR1cm4gQVVYRVNaOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9TWU1CT0xTICovCi0KLSNpZm5kZWYgTk9fQ09GRl9MSU5FTk9TCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgTElORU5PICpleHQgPSAoTElORU5PICopZXh0MTsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW4xOwotCi0gIGluLT5sX2FkZHIubF9zeW1uZHggPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLSAgaW4tPmxfbG5ubyA9IEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgaW5wLCBvdXRwKQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbnA7Ci0gICAgIFBUUglvdXRwOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW5wOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICpleHQgPSAoc3RydWN0IGV4dGVybmFsX2xpbmVubyAqKW91dHA7Ci0gIFBVVFdPUkQoYWJmZCwgaW4tPmxfYWRkci5sX3N5bW5keCwgKGJmZF9ieXRlICopCi0JICBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0KLSAgUFVUX0xJTkVOT19MTk5PIChhYmZkLCBpbi0+bF9sbm5vLCBleHQpOwotICByZXR1cm4gTElORVNaOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9MSU5FTk9TICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfYW91dGhkcl9pbiAoYWJmZCwgYW91dGhkcl9leHQxLCBhb3V0aGRyX2ludDEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgYW91dGhkcl9leHQxOwotICAgICBQVFIgYW91dGhkcl9pbnQxOwotewotICBBT1VUSERSICAgICAgICAqYW91dGhkcl9leHQgPSAoQU9VVEhEUiAqKSBhb3V0aGRyX2V4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICphb3V0aGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHJfaW50MTsKLQotICBhb3V0aGRyX2ludC0+bWFnaWMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5tYWdpYyk7Ci0gIGFvdXRoZHJfaW50LT52c3RhbXAgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT52c3RhbXApOwotICBhb3V0aGRyX2ludC0+dHNpemUgPQotICAgIEdFVF9BT1VUSERSX1RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRzaXplKTsKLSAgYW91dGhkcl9pbnQtPmRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kc2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5ic2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+YnNpemUpOwotICBhb3V0aGRyX2ludC0+ZW50cnkgPQotICAgIEdFVF9BT1VUSERSX0VOVFJZIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmVudHJ5KTsKLSAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgPQotICAgIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dGV4dF9zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRhdGFfc3RhcnQpOwotCi0jaWZkZWYgSTk2MAotICBhb3V0aGRyX2ludC0+dGFnZW50cmllcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRhZ2VudHJpZXMpOwotI2VuZGlmCi0KLSNpZmRlZiBBUE9MTE9fTTY4Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+b19pbmxpYiwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5vX2lubGliKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT5vX3NyaSwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5vX3NyaSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+dmlkWzBdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZpZCk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+dmlkWzFdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZpZCArIDQpOwotI2VuZGlmCi0KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBhb3V0aGRyX2ludC0+b190b2MgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fdG9jKTsKLSAgYW91dGhkcl9pbnQtPm9fc25lbnRyeSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmVudHJ5KTsKLSAgYW91dGhkcl9pbnQtPm9fc250ZXh0ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NudGV4dCk7Ci0gIGFvdXRoZHJfaW50LT5vX3NuZGF0YSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmRhdGEpOwotICBhb3V0aGRyX2ludC0+b19zbnRvYyA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbnRvYyk7Ci0gIGFvdXRoZHJfaW50LT5vX3NubG9hZGVyID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NubG9hZGVyKTsKLSAgYW91dGhkcl9pbnQtPm9fc25ic3MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25ic3MpOwotICBhb3V0aGRyX2ludC0+b19hbGdudGV4dCA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19hbGdudGV4dCk7Ci0gIGFvdXRoZHJfaW50LT5vX2FsZ25kYXRhID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX2FsZ25kYXRhKTsKLSAgYW91dGhkcl9pbnQtPm9fbW9kdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19tb2R0eXBlKTsKLSAgYW91dGhkcl9pbnQtPm9fY3B1dHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19jcHV0eXBlKTsKLSAgYW91dGhkcl9pbnQtPm9fbWF4c3RhY2sgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fbWF4c3RhY2spOwotICBhb3V0aGRyX2ludC0+b19tYXhkYXRhID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5vX21heGRhdGEpOwotI2VuZGlmCi0KLSNpZmRlZiBNSVBTRUNPRkYKLSAgYW91dGhkcl9pbnQtPmJzc19zdGFydCA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+YnNzX3N0YXJ0KTsKLSAgYW91dGhkcl9pbnQtPmdwX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ncF92YWx1ZSk7Ci0gIGFvdXRoZHJfaW50LT5ncHJtYXNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ncHJtYXNrKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbMF0pOwotICBhb3V0aGRyX2ludC0+Y3BybWFza1sxXSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Y3BybWFza1sxXSk7Ci0gIGFvdXRoZHJfaW50LT5jcHJtYXNrWzJdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzJdKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbM10pOwotI2VuZGlmCi0KLSNpZmRlZiBBTFBIQUVDT0ZGCi0gIGFvdXRoZHJfaW50LT5ic3Nfc3RhcnQgPSBiZmRfaF9nZXRfNjQoYWJmZCwgYW91dGhkcl9leHQtPmJzc19zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5ncF92YWx1ZSA9IGJmZF9oX2dldF82NChhYmZkLCBhb3V0aGRyX2V4dC0+Z3BfdmFsdWUpOwotICBhb3V0aGRyX2ludC0+Z3BybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BybWFzayk7Ci0gIGFvdXRoZHJfaW50LT5mcHJtYXNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5mcHJtYXNrKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWluOwotICBBT1VUSERSICphb3V0aGRyX291dCA9IChBT1VUSERSICopb3V0OwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT5tYWdpYywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5tYWdpYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT52c3RhbXAsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dnN0YW1wKTsKLSAgUFVUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPnRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnRzaXplKTsKLSAgUFVUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmRzaXplKTsKLSAgUFVUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmJzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzaXplKTsKLSAgUFVUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIGFvdXRoZHJfaW4tPmVudHJ5LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmVudHJ5KTsKLSAgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+dGV4dF9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT50ZXh0X3N0YXJ0KTsKLSAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5kYXRhX3N0YXJ0KTsKLQotI2lmZGVmIEk5NjAKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPnRhZ2VudHJpZXMsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dGFnZW50cmllcyk7Ci0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fdG9jLCBhb3V0aGRyX291dC0+b190b2MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25lbnRyeSwgYW91dGhkcl9vdXQtPm9fc25lbnRyeSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbnRleHQsIGFvdXRoZHJfb3V0LT5vX3NudGV4dCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmRhdGEsIGFvdXRoZHJfb3V0LT5vX3NuZGF0YSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbnRvYywgYW91dGhkcl9vdXQtPm9fc250b2MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25sb2FkZXIsIGFvdXRoZHJfb3V0LT5vX3NubG9hZGVyKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NuYnNzLCBhb3V0aGRyX291dC0+b19zbmJzcyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19hbGdudGV4dCwgYW91dGhkcl9vdXQtPm9fYWxnbnRleHQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fYWxnbmRhdGEsIGFvdXRoZHJfb3V0LT5vX2FsZ25kYXRhKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX21vZHR5cGUsIGFvdXRoZHJfb3V0LT5vX21vZHR5cGUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fY3B1dHlwZSwgYW91dGhkcl9vdXQtPm9fY3B1dHlwZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYW91dGhkcl9pbi0+b19tYXhzdGFjaywgYW91dGhkcl9vdXQtPm9fbWF4c3RhY2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbWF4ZGF0YSwgYW91dGhkcl9vdXQtPm9fbWF4ZGF0YSk7Ci0gIG1lbXNldCAoYW91dGhkcl9vdXQtPm9fcmVzdjIsIDAsIHNpemVvZiBhb3V0aGRyX291dC0+b19yZXN2Mik7Ci0jZW5kaWYKLQotI2lmZGVmIE1JUFNFQ09GRgotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+YnNzX3N0YXJ0LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzc19zdGFydCk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncF92YWx1ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncF92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncHJtYXNrLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmdwcm1hc2spOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1swXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzBdKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbMV0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1sxXSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5jcHJtYXNrWzJdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmNwcm1hc2tbMl0pOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1szXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzNdKTsKLSNlbmRpZgotCi0jaWZkZWYgQUxQSEFFQ09GRgotICAvKiBGSVhNRTogV2hhdCBkb2VzIGJsZHJldiBtZWFuPyAgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIChiZmRfdm1hKSAyLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJsZHJldik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAoYmZkX3ZtYSkgMCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5wYWRkaW5nKTsKLSAgYmZkX2hfcHV0XzY0KGFiZmQsIGFvdXRoZHJfaW4tPmJzc19zdGFydCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic3Nfc3RhcnQpOwotICBiZmRfaF9wdXRfNjQoYWJmZCwgYW91dGhkcl9pbi0+Z3BfdmFsdWUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Z3BybWFzaywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncHJtYXNrKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmZwcm1hc2ssIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZnBybWFzayk7Ci0jZW5kaWYKLQotICByZXR1cm4gQU9VVFNaOwotfQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwgZXh0LCBpbikKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIGV4dDsKLSAgICAgUFRSCSAgICAgaW47Ci17Ci0gIFNDTkhEUiAqc2NuaGRyX2V4dCA9IChTQ05IRFIgKikgZXh0OwotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUFJFCi0gIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QUkUgKGFiZmQsIGV4dCwgaW4pOwotI2VuZGlmCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0gIHNjbmhkcl9pbnQtPnNfc2NucHRyID0KLSAgICBHRVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgc2NuaGRyX2ludC0+c19yZWxwdHIgPQotICAgIEdFVF9TQ05IRFJfUkVMUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19yZWxwdHIpOwotICBzY25oZHJfaW50LT5zX2xubm9wdHIgPQotICAgIEdFVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbG5ub3B0cik7Ci0gIHNjbmhkcl9pbnQtPnNfZmxhZ3MgPQotICAgIEdFVF9TQ05IRFJfRkxBR1MgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSAgc2NuaGRyX2ludC0+c19ucmVsb2MgPQotICAgIEdFVF9TQ05IRFJfTlJFTE9DIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBzY25oZHJfaW50LT5zX25sbm5vID0KLSAgICBHRVRfU0NOSERSX05MTk5PIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0jaWZkZWYgSTk2MAotICBzY25oZHJfaW50LT5zX2FsaWduID0KLSAgICBHRVRfU0NOSERSX0FMSUdOIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19hbGlnbik7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCAoYWJmZCwgZXh0LCBpbik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKilpbjsKLSAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKW91dDsKLSAgdW5zaWduZWQgaW50IHJldCA9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRQotICBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRSAoYWJmZCwgaW4sIG91dCk7Ci0jZW5kaWYKLSAgbWVtY3B5KHNjbmhkcl9leHQtPnNfbmFtZSwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2Yoc2NuaGRyX2ludC0+c19uYW1lKSk7Ci0KLSAgUFVUX1NDTkhEUl9WQUREUiAoYWJmZCwgc2NuaGRyX2ludC0+c192YWRkciwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLQotCi0gIFBVVF9TQ05IRFJfUEFERFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcGFkZHIsCi0JCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7Ci0gIFBVVF9TQ05IRFJfU0laRSAoYWJmZCwgc2NuaGRyX2ludC0+c19zaXplLAotCQkgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKLQotICBQVVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19zY25wdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgUFVUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcmVscHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIFBVVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19sbm5vcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLSAgUFVUX1NDTkhEUl9GTEFHUyAoYWJmZCwgc2NuaGRyX2ludC0+c19mbGFncywKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSNpZiBkZWZpbmVkKE04OCkKLSAgUFVUV09SRChhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gIFBVVFdPUkQoYWJmZCwgc2NuaGRyX2ludC0+c19ucmVsb2MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0jZWxzZQotICBpZiAoc2NuaGRyX2ludC0+c19ubG5ubyA8PSAweGZmZmYpCi0gICAgUFVUSEFMRihhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkgKyAxXTsKLQotICAgICAgbWVtY3B5IChidWYsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpKTsKLSAgICAgIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSldID0gJ1wwJzsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogd2FybmluZzogJXM6IGxpbmUgbnVtYmVyIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgYnVmLCBzY25oZHJfaW50LT5zX25sbm5vKTsKLSAgICAgIFBVVEhBTEYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICAgIH0KLSAgaWYgKHNjbmhkcl9pbnQtPnNfbnJlbG9jIDw9IDB4ZmZmZikKLSAgICBQVVRIQUxGKGFiZmQsIHNjbmhkcl9pbnQtPnNfbnJlbG9jLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpICsgMV07Ci0KLSAgICAgIG1lbWNweSAoYnVmLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKSk7Ci0gICAgICBidWZbc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpXSA9ICdcMCc7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiAlczogcmVsb2Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJICAgICBidWYsIHNjbmhkcl9pbnQtPnNfbnJlbG9jKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICBQVVRIQUxGIChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gICAgICByZXQgPSAwOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgSTk2MAotICBQVVRfU0NOSERSX0FMSUdOIChhYmZkLCBzY25oZHJfaW50LT5zX2FsaWduLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19hbGlnbik7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QKLSAgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUIChhYmZkLCBpbiwgb3V0KTsKLSNlbmRpZgotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZy5iZmQgYi9iZmQvY29uZmlnLmJmZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmOTFkMi4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlnLmJmZAorKysgL2Rldi9udWxsCkBAIC0xLDgxMiArMCwwIEBACi0jIGNvbmZpZy5iZmQKLSMgQ29udmVydCBhIGNhbm9uaWNhbCBob3N0IHR5cGUgaW50byBhIEJGRCBob3N0IHR5cGUuCi0jIFNldCBzaGVsbCB2YXJpYWJsZSB0YXJnIHRvIGNhbm9uaWNhbCB0YXJnZXQgbmFtZSwgYW5kIHJ1bgotIyB1c2luZyBgYC4gY29uZmlnLmJmZCcnLgotIyBTZXRzIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgotIyAgdGFyZ19kZWZ2ZWMJCURlZmF1bHQgdmVjdG9yIGZvciB0aGlzIHRhcmdldAotIyAgdGFyZ19zZWx2ZWNzCQlWZWN0b3JzIHRvIGJ1aWxkIGZvciB0aGlzIHRhcmdldAotIyAgdGFyZ19hcmNocwkJQXJjaGl0ZWN0dXJlcyBmb3IgdGhpcyB0YXJnZXQKLSMgIHRhcmdfY2ZsYWdzCQkkKENGTEFHUykgZm9yIHRoaXMgdGFyZ2V0IChGSVhNRTogcHJldHR5IGJvZ3VzKQotIyAgdGFyZ191bmRlcnNjb3JlCVdoZXRoZXIgdW5kZXJzY29yZXMgYXJlIHVzZWQ6IHllcyBvciBubwotCi0jIFBhcnQgb2YgdGhpcyBmaWxlIGlzIHByb2Nlc3NlZCBieSB0YXJnbWF0Y2guc2VkIHRvIGdlbmVyYXRlIHRoZQotIyB0YXJnbWF0Y2guaCBmaWxlLiAgVGhlICNpZmRlZiBhbmQgI2VuZGlmIGxpbmVzIHRoYXQgYXBwZWFyIGJlbG93IGFyZQotIyBjb3BpZWQgZGlyZWN0bHkgaW50byB0YXJnbWF0Y2guaC4KLQotIyBUaGUgYmludXRpbHMgYysrZmlsdCBwcm9ncmFtIHdhbnRzIHRvIGtub3cgd2hldGhlciB1bmRlcnNjb3JlcyBhcmUKLSMgc3RyaXBwZWQgb3Igbm90LiAgVGhhdCBpcyB3aHkgd2Ugc2V0IHRhcmdfdW5kZXJzY29yZS4gIGMrK2ZpbHQgdXNlcwotIyB0aGlzIGluZm9ybWF0aW9uIHRvIGNob29zZSBhIGRlZmF1bHQuICBUaGlzIGluZm9ybWF0aW9uIGlzCi0jIGR1cGxpY2F0ZWQgaW4gdGhlIHN5bWJvbF9sZWFkaW5nX2NoYXIgZmllbGQgb2YgdGhlIEJGRCB0YXJnZXQKLSMgdmVjdG9yLCBidXQgYysrZmlsdCBkb2VzIG5vdCBkZWFsIHdpdGggb2JqZWN0IGZpbGVzIGFuZCBpcyBub3QKLSMgbGlua2VkIGFnYWluc3QgbGliYmZkLmEuICBJdCBpcyBub3QgdGVycmlibHkgaW1wb3J0YW50IHRoYXQgYysrZmlsdAotIyBnZXQgdGhpcyByaWdodDsgaXQgaXMganVzdCBjb252ZW5pZW50LgotCi10YXJnX2RlZnZlYz0KLXRhcmdfc2VsdmVjcz0KLXRhcmdfY2ZsYWdzPQotdGFyZ191bmRlcnNjb3JlPW5vCi0KLXRhcmdfY3B1PWBlY2hvICR0YXJnIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWNhc2UgIiR7dGFyZ19jcHV9IiBpbgotYWxwaGEqKSB0YXJnX2FyY2hzPWJmZF9hbHBoYV9hcmNoIDs7Ci1hcm0qKQl0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7Owotc3Ryb25nYXJtKikgdGFyZ19hcmNocz1iZmRfYXJtX2FyY2ggOzsKLXRodW1iKikJdGFyZ19hcmNocz1iZmRfYXJtX2FyY2ggOzsKLWMzMCopCXRhcmdfYXJjaHM9YmZkX3RpYzMwX2FyY2ggOzsKLWhwcGEqKQl0YXJnX2FyY2hzPWJmZF9ocHBhX2FyY2ggOzsKLWlbMzQ1Nl04NikgdGFyZ19hcmNocz1iZmRfaTM4Nl9hcmNoIDs7Ci1pMzcwKSAgIHRhcmdfYXJjaHM9YmZkX2kzNzBfYXJjaCA7OwotbTY4KikJdGFyZ19hcmNocz1iZmRfbTY4a19hcmNoIDs7Ci1tODgqKQl0YXJnX2FyY2hzPWJmZF9tODhrX2FyY2ggOzsKLW1pcHMqKQl0YXJnX2FyY2hzPWJmZF9taXBzX2FyY2ggOzsKLXBqKikJdGFyZ19hcmNocz0iYmZkX3BqX2FyY2ggYmZkX2kzODZfYXJjaCI7OwotcG93ZXJwYyopIHRhcmdfYXJjaHM9ImJmZF9yczYwMDBfYXJjaCBiZmRfcG93ZXJwY19hcmNoIiA7OwotcnM2MDAwKQl0YXJnX2FyY2hzPSJiZmRfcnM2MDAwX2FyY2ggYmZkX3Bvd2VycGNfYXJjaCIgOzsKLXNwYXJjKikgdGFyZ19hcmNocz1iZmRfc3BhcmNfYXJjaCA7Owotdjg1MCopCXRhcmdfYXJjaHM9YmZkX3Y4NTBfYXJjaCA7OwotejhrKikJdGFyZ19hcmNocz1iZmRfejhrX2FyY2ggOzsKLSopCXRhcmdfYXJjaHM9YmZkXyR7dGFyZ19jcHV9X2FyY2ggOzsKLWVzYWMKLQotCi0jIFdIRU4gQURESU5HIEVOVFJJRVMgVE8gVEhJUyBNQVRSSVg6Ci0jICBNYWtlIHN1cmUgdGhhdCB0aGUgbGVmdCBzaWRlIGFsd2F5cyBoYXMgdHdvIGRhc2hlcy4gIE90aGVyd2lzZSB5b3UKLSMgIGNhbiBnZXQgc3B1cmlvdXMgbWF0Y2hlcy4gIEV2ZW4gZm9yIHVuYW1iaWd1b3VzIGNhc2VzLCBkbyB0aGlzIGFzIGEKLSMgIGNvbnZlbnRpb24sIGVsc2UgdGhlIHRhYmxlIGJlY29tZXMgYSByZWFsIG1lc3MgdG8gdW5kZXJzdGFuZCBhbmQgbWFpbnRhaW4uCi0KLWNhc2UgIiR7dGFyZ30iIGluCi0jIFNUQVJUIE9GIHRhcmdtYXRjaC5oCi0jaWZkZWYgQkZENjQKLSAgYWxwaGEqLSotbmV0YnNkKiB8IGFscGhhKi0qLWZyZWVic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9hbHBoYV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSAgYWxwaGEqLSotbmV0d2FyZSopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPW5sbTMyX2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLWxpbnV4ZWNvZmYqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmNjRfYWxwaGFfdmVjCi0gICAgOzsKLSAgYWxwaGEqLSotbGludXgtZ251KiB8IGFscGhhKi0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X2FscGhhX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZmFscGhhX2xpdHRsZV92ZWMKLSAgICA7OwotICBhbHBoYSotKi0qdm1zKikKLSAgICB0YXJnX2RlZnZlYz12bXNfYWxwaGFfdmVjCi0gICAgOzsKLSAgYWxwaGEqLSotKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZmFscGhhX2xpdHRsZV92ZWMKLSAgICA7OwotI2VuZGlmIC8qIEJGRDY0ICovCi0KLSAgYXJjLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJjX3ZlYwotICAgIDs7Ci0KLSAgYXJtLSotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1hcm1uZXRic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGFybS0qLXJpc2NpeCopCi0gICAgdGFyZ19kZWZ2ZWM9cmlzY2l4X3ZlYwotICAgIDs7Ci0gIGFybS1lcG9jLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1fZXBvY19wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1fZXBvY19wZV9saXR0bGVfdmVjIGFybV9lcG9jX3BlX2JpZ192ZWMgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPW5vCi0gICAgOzsKLSAgYXJtLXdpbmNlLXBlIHwgYXJtLSotd2luY2UpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtcGVfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYXJtcGVfbGl0dGxlX3ZlYyBhcm1wZV9iaWdfdmVjIGFybXBlaV9saXR0bGVfdmVjIGFybXBlaV9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT1ubwotICAgIHRhcmdfY2ZsYWdzPS1EQVJNX1dJTkNFCi0gICAgOzsKLSAgYXJtLSotcGUqKQotICAgIHRhcmdfZGVmdmVjPWFybXBlX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImFybXBlX2xpdHRsZV92ZWMgYXJtcGVfYmlnX3ZlYyBhcm1wZWlfbGl0dGxlX3ZlYyBhcm1wZWlfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYXJtLSotYW91dCB8IGFybWVsLSotYW91dCkJCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9hcm1fbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hb3V0X2FybV9iaWdfdmVjCi0gICAgOzsKLSAgYXJtZWItKi1hb3V0KQotICAgIHRhcmdfZGVmdmVjPWFvdXRfYXJtX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9YW91dF9hcm1fbGl0dGxlX3ZlYwotICAgIDs7Ci0gIGFybS0qLWNvZmYpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFybWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBhcm0tKi1lbGYgfCBhcm0qLSotbGludXgtZ251KiB8IGFybSotKi1jb25peCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV92ZWMKLSAgICA7OwotICBhcm0tKi1vYWJpKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYwotICAgIDs7Ci0KLSAgdGh1bWItKi1jb2ZmKQotICAgIHRhcmdfZGVmdmVjPWFybWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hcm1jb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgdGh1bWItKi1vYWJpKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYwotICAgIDs7Ci0gIHRodW1iLSotZWxmKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fdmVjCi0gICAgOzsKLSAgdGh1bWItZXBvYy1wZSopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZV9iaWdfdmVjIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjIGFybV9lcG9jX3BlaV9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT1ubwotICAgIDs7Ci0gIHRodW1iLSotcGUqKQotICAgIHRhcmdfZGVmdmVjPWFybXBlX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImFybXBlX2xpdHRsZV92ZWMgYXJtcGVfYmlnX3ZlYyBhcm1wZWlfbGl0dGxlX3ZlYyBhcm1wZWlfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3Ryb25nYXJtLSotZWxmKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fdmVjCi0gICAgOzsKLSAgc3Ryb25nYXJtLSotY29mZikKLSAgICB0YXJnX2RlZnZlYz1hcm1jb2ZmX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YXJtY29mZl9iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgYTI5ay0qLWVibW9uKiB8IGEyOWstKi11ZGkqIHwgYTI5ay0qLWNvZmYqIHwgYTI5ay0qLXN5bTEqIHwgXAotICBhMjlrLSotdnh3b3JrcyogfCBhMjlrLSotc3lzdiopCi0gICAgdGFyZ19kZWZ2ZWM9YTI5a2NvZmZfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGEyOWstKi1hb3V0KiB8IGEyOWstKi1ic2QqIHwgYTI5ay0qLXZzdGEqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBhdnItKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9hdnJfdmVjCi0gICAgOzsKLQotICBjMzAtKi0qYW91dCogfCB0aWMzMC0qLSphb3V0KikKLSAgICB0YXJnX2RlZnZlYz10aWMzMF9hb3V0X3ZlYwotICAgIDs7Ci0gIGMzMC0qLSpjb2ZmKiB8IHRpYzMwLSotKmNvZmYqKQotICAgIHRhcmdfZGVmdmVjPXRpYzMwX2NvZmZfdmVjCi0gICAgOzsKLQotICBkMTB2LSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfZDEwdl92ZWMKLSAgICA7OwotCi0gIGQzMHYtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9kMzB2X3ZlYwotICAgIDs7Ci0KLSAgZnIzMC0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfZnIzMF92ZWMKLSAgICA7OwotCi0KLSAgaDgzMDAqLSotKikKLSAgICB0YXJnX2RlZnZlYz1oODMwMGNvZmZfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgaDg1MDAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWg4NTAwY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotI2lmIDAgLyogSFBQQSBFTEYgZG9lcyBub3Qgd29yayBjdXJyZW50bHkuICAqLwotICBocHBhKi0qLSplbGYqIHwgaHBwYSotKi1saW51eC1nbnUqIHwgaHBwYSotKi1saXRlcyogfCBocHBhKi0qLXN5c3Y0KiB8IGhwcGEqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9ocHBhX3ZlYwotICAgIDs7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCi0jaWYgMCAvKiBIUFBBIEVMRiBkb2VzIG5vdCB3b3JrIGN1cnJlbnRseS4gICovCi0gIGhwcGEqLSotYnNkKikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9ocHBhX3ZlYwotICAgIDs7Ci0jZW5kaWYKLSAgaHBwYSotKi1ocHV4KiB8IGhwcGEqLSotaGl1eCogfCBocHBhKi0qLW1wZWl4KikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgOzsKLSNpZiAwIC8qIEhQUEEgRUxGIGRvZXMgbm90IHdvcmsgY3VycmVudGx5LiAgKi8KLSAgaHBwYSotKi1vc2YqKQotICAgIHRhcmdfZGVmdmVjPXNvbV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2hwcGFfdmVjCi0gICAgOzsKLSNlbmRpZgotI2VuZGlmIC8qIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKSAqLwotCi0gIGkzNzAtKi0qKSAKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM3MF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9pMzcwX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28zLjJ2NSpjb2ZmKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2NCogfCBpWzM0NTZdODYtKi11bml4d2FyZSogfCBpWzM0NTZdODYtKi1zb2xhcmlzMiogfCBcCi0gIGlbMzQ1Nl04Ni0qLWVsZiB8IGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KiB8IFwKLSAgaVszNDU2XTg2LSotZGd1eCogfCBpWzM0NTZdODYtKi1zeXN2NSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZjb2ZmX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXJ0ZW1zZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZjb2ZmX3ZlYyBpMzg2YW91dF92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbXNkb3NkamdwcCogfCBpWzM0NTZdKi0qLWdvMzIqIHwgaVszNDU2XTg2LWdvMzItcnRlbXMqICkKLSAgICB0YXJnX2RlZnZlYz1nbzMyY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImdvMzJzdHViYmVkY29mZl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXN5c3YqIHwgaVszNDU2XTg2LSotaXNjKiB8IGlbMzQ1Nl04Ni0qLXNjbyogfCBpWzM0NTZdODYtKi1jb2ZmIHwgXAotICBpWzM0NTZdODYtKi1haXgqKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04NiotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmNvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfaTM4Nl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2ZHluaXhfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZnJlZWJzZGFvdXQqIHwgaVszNDU2XTg2LSotZnJlZWJzZFsxMl0uKiB8IFwKLSAgaVszNDU2XTg2LSotZnJlZWJzZFsxMl0pCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmZyZWVic2RfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXRic2QqIHwgaVszNDU2XTg2LSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4Nm5ldGJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4NmJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbmV0d2FyZSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJubG0zMl9pMzg2X3ZlYyBpMzg2Y29mZl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPWkzODZsaW51eF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZsaW51eF92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1seW54b3MqKQotICAgIHRhcmdfZGVmdmVjPWkzODZseW54X2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZseW54X2FvdXRfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tYWNoKiB8IGlbMzQ1Nl04Ni0qLW9zZjFtayopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4Nm1hY2gzX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1vczlrKQotICAgIHRhcmdfZGVmdmVjPWkzODZvczlrX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1zZG9zKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YW91dF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4Nm1zZG9zX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1vc3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4Nm1zZG9zX3ZlYyBpMzg2YW91dF92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotYmVvc3BlKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2cGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2cGVfdmVjIGkzODZwZWlfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3NlbGYqIHwgaVszNDU2XTg2LSotYmVvcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2cGVfdmVjIGkzODZwZWlfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWludGVyaXgqKQotICAgIHRhcmdfZGVmdmVjPWkzODZwZWlfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2cGVfdmVjIgotICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgY2hlY2tlZCBhdCBydW50aW1lLgotICAgIHRhcmdfY2ZsYWdzPS1EU1RSSUNUX1BFX0ZPUk1BVAotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1pbmd3MzIqIHwgaVszNDU2XTg2LSotY3lnd2luKiB8IGlbMzQ1Nl04Ni0qLXdpbm50IHwgaVszNDU2XTg2LSotcGUpCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NnBlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyBiZmRfZWxmMzJfaTM4Nl92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LW5vbmUtKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1hb3V0KiB8IGlbMzQ1Nl04NiotKi12c3RhKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YW91dF92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi12eHdvcmtzKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqIHwgaTg2MC0qLWNvZmYqKQotICAgIHRhcmdfZGVmdmVjPWk4NjBjb2ZmX3ZlYwotICAgIDs7Ci0gIGk4NjAtKi1zeXN2NCogfCBpODYwLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTg2MF92ZWMKLSAgICA7OwotCi0gIGk5NjAtKi12eHdvcmtzNCogfCBpOTYwLSotdnh3b3JrczUuMCkKLSAgICB0YXJnX2RlZnZlYz1iX291dF92ZWNfbGl0dGxlX2hvc3QKLSAgICB0YXJnX3NlbHZlY3M9ImJfb3V0X3ZlY19iaWdfaG9zdCBpY29mZl9saXR0bGVfdmVjIGljb2ZmX2JpZ192ZWMgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGk5NjAtKi12eHdvcmtzNS4qIHwgaTk2MC0qLWNvZmYqIHwgaTk2MC0qLXN5c3YqIHwgaTk2MC0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1pY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpY29mZl9iaWdfdmVjIGJfb3V0X3ZlY19saXR0bGVfaG9zdCBiX291dF92ZWNfYmlnX2hvc3QgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGk5NjAtKi12eHdvcmtzKiB8IGk5NjAtKi1hb3V0KiB8IGk5NjAtKi1ib3V0KiB8IGk5NjAtKi1uaW5keSopCi0gICAgdGFyZ19kZWZ2ZWM9Yl9vdXRfdmVjX2xpdHRsZV9ob3N0Ci0gICAgdGFyZ19zZWx2ZWNzPSJiX291dF92ZWNfYmlnX2hvc3QgaWNvZmZfbGl0dGxlX3ZlYyBpY29mZl9iaWdfdmVjIGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpOTYwLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTk2MF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Imljb2ZmX2xpdHRsZV92ZWMgaWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotCi0gIG0zMnItKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tMzJyX3ZlYwotICAgIDs7Ci0KLSAgbTY4Ki1hcG9sbG8tKikKLSAgICB0YXJnX2RlZnZlYz1hcG9sbG9jb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotYnVsbC1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZnVuX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLW1vdG9yb2xhLXN5c3YqKQotICAgIHRhcmdfZGVmdmVjPW02OGtzeXN2Y29mZl92ZWMKLSAgICA7OwotICBtNjgqLWhwLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aHAzMDBic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1hb3V0KikKLSAgICB0YXJnX2RlZnZlYz1hb3V0MF9iaWdfdmVjCi0gICAgIyBXZSBpbmNsdWRlIGNpc2NvX2NvcmVfYmlnX3ZlYyBoZXJlLCByYXRoZXIgdGhhbiBtYWtpbmcgYSBzZXBhcmF0ZSBjaXNjbwotICAgICMgY29uZmlndXJhdGlvbiwgc28gdGhhdCBjaXNjby1jb3JlLmMgZ2V0cyByb3V0aW5lbHkgdGVzdGVkIGF0Ci0gICAgIyBsZWFzdCBmb3IgY29tcGlsYXRpb24uCi0gICAgdGFyZ19zZWx2ZWNzPSJjaXNjb19jb3JlX2JpZ192ZWMgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1lbGYqIHwgbTY4Ki0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyBpZWVlX3ZlYyIKLSAgICA7OwotICBtNjgqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPW02OGtjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyBpZWVlX3ZlYyBhb3V0MF9iaWdfdmVjIgotICAgIDs7Ci0gIG02OCotKi1jb2ZmKiB8IG02OCotKi1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyB2ZXJzYWRvc192ZWMgaWVlZV92ZWMiCi0gICAgOzsKLSAgbTY4Ki0qLWhwdXgqKQotICAgIHRhcmdfZGVmdmVjPWhwMzAwaHB1eF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPW02OGtsaW51eF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tNjhrbGludXhfdmVjCi0gICAgOzsKLSAgbTY4Ki0qLWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgIyB0YXJnX3NlbHZlY3M9bTY4a21hY2gzX3ZlYwotICAgICMgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbTY4Ki0qLWx5bnhvcyopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2x5bnhfY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9bTY4a2x5bnhfYW91dF92ZWMKLSAgICA7OwotICBtNjgqLWhwKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPW02OGs0a25ldGJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtuZXRic2RfdmVjIGhwMzAwYnNkX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrbmV0YnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4azRrbmV0YnNkX3ZlYyBocDMwMGJzZF92ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLXN1bm9zKiB8IG02OCotKi1vczY4ayogfCBtNjgqLSotdnh3b3JrcyogfCBtNjgqLW5ldHgtKiB8IFwKLSAgbTY4Ki0qLWJzZCogfCBtNjgqLSotdnN0YSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLWVyaWNzc29uLSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyB0ZWtoZXhfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLWNibS0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tNjhrY29mZl92ZWMKLSAgICA7OwotICBtNjgqLWFwcGxlLWF1eCopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2F1eF9jb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotKi1wc29zKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9aWVlZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBtODgqLWhhcnJpcy1jeHV4KiB8IG04OCotKi1kZ3V4KiB8IG04OCotKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX204OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPW04OGtiY3NfdmVjCi0gICAgOzsKLSAgbTg4Ki0qLW1hY2gzKikKLSAgICB0YXJnX2RlZnZlYz1tODhrbWFjaDNfdmVjCi0gICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbTg4Ki0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9bTg4a2Jjc192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBtY29yZS0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWNvcmUtKi1wZSkKLSAgICB0YXJnX2RlZnZlYz1tY29yZV9wZV9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtY29yZV9wZV9iaWdfdmVjIG1jb3JlX3BlX2xpdHRsZV92ZWMgbWNvcmVfcGVpX2JpZ192ZWMgbWNvcmVfcGVpX2xpdHRsZV92ZWMiCi0gICAgOzsKLQotICBtaXBzKi1iaWctKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzLWRlYy1uZXRic2QqIHwgbWlwcyplbCotKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGVjb2ZmX2xpdHRsZV92ZWMgZWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotIG1pcHMqLSotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotZGVjLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbWlwcyotZGVjLW1hY2gzKikKLSAgICB0YXJnX2RlZnZlYz1hb3V0X21pcHNfbGl0dGxlX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIDs7Ci0gIG1pcHMqLWRlYy0qIHwgbWlwcyplbC0qLWVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2JpZ192ZWMKLSAgICA7OwotICBtaXBzKi0qLWVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKi0qLWlyaXg2KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotaXJpeDUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKLSAgICA7OwotICBtaXBzKi1zZ2ktKiB8IG1pcHMqLSotYnNkKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKi0qLWxuZXdzKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdsaXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1tYWNoMyopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICA7OwotICBtaXBzKi0qLXBlKikKLSAgICB0YXJnX2RlZnZlYz1taXBzbHBlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibWlwc2xwZWlfdmVjIG1pcHNscGVpX3ZlYyBlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG1pcHMqLSotc3lzdjQqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLXN5c3YqIHwgbWlwcyotKi1yaXNjb3MqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIG1pcHMqZWwtKi1lbGYqIHwgbWlwcyplbC0qLXJ0ZW1zKiB8IG1pcHMqZWwtKi12eHdvcmtzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotZWxmKiB8IG1pcHMqLSotcnRlbXMqIHwgbWlwcyotKi12eHdvcmtzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotbm9uZSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqZWwqLSotbGludXgtZ251KiB8IG1pcHMqZWwqLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyBlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1saW51eC1nbnUqIHwgbWlwcyotKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKLSAgICA7OwotCi0gIG1uMTAyMDAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tbjEwMjAwX3ZlYwotICAgIDs7Ci0KLSAgbW4xMDMwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX21uMTAzMDBfdmVjCi0gICAgOzsKLQotICBuczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikKLSAgICB0YXJnX2RlZnZlYz1wYzUzMm1hY2hhb3V0X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBuczMyay0qLW5ldGJzZCogfCBuczMyay0qLWxpdGVzKiB8IG5zMzJrLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9cGM1MzJuZXRic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgcGotKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wal92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9wal92ZWMgYmZkX2VsZjMyX3BqbF92ZWMiCi0gICAgOzsKLQotICBwamwtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wamxfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfcGpsX3ZlYyBiZmRfZWxmMzJfcGpfdmVjIGJmZF9lbGYzMl9pMzg2X3ZlYyIKLSAgICA7OwotCi0gIHBvd2VycGMtKi1haXgqIHwgcG93ZXJwYy0qLWJlb3MqKQotICAgIHRhcmdfZGVmdmVjPXJzNjAwMGNvZmZfdmVjCi0gICAgOzsKLSAgcG93ZXJwYy0qLSpic2QqIHwgcG93ZXJwYy0qLWVsZiogfCBwb3dlcnBjLSotc3lzdjQqIHwgcG93ZXJwYy0qLWVhYmkqIHwgXAotICBwb3dlcnBjLSotc29sYXJpczIqIHwgcG93ZXJwYy0qLWxpbnV4LWdudSogfCBwb3dlcnBjLSotcnRlbXMqIHwgXAotICBwb3dlcnBjLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Bvd2VycGNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJyczYwMDBjb2ZmX3ZlYyBiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYyBwcGNib290X3ZlYyIKLSAgICA7OwotICBwb3dlcnBjLSotbWFjb3MqIHwgcG93ZXJwYy0qLW1wdyopCi0gICAgdGFyZ19kZWZ2ZWM9cG1hY194Y29mZl92ZWMKLSAgICA7OwotICBwb3dlcnBjLSotbmV0d2FyZSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Bvd2VycGNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJubG0zMl9wb3dlcnBjX3ZlYyByczYwMDBjb2ZmX3ZlYyIKLSAgICA7OwotICBwb3dlcnBjbGUtKi1lbGYqIHwgcG93ZXJwY2xlLSotc3lzdjQqIHwgcG93ZXJwY2xlLSotZWFiaSogfCBcCi0gIHBvd2VycGNsZS0qLXNvbGFyaXMyKiB8IHBvd2VycGNsZS0qLWxpbnV4LWdudSogfCBwb3dlcnBjbGUtKi12eHdvcmtzKiB8XAotICBwb3dlcnBjbGUtKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9InJzNjAwMGNvZmZfdmVjIGJmZF9lbGYzMl9wb3dlcnBjX3ZlYyBwcGNib290X3ZlYyIKLSAgICA7OwotCi0gIHBvd2VycGNsZS0qLXBlIHwgcG93ZXJwY2xlLSotd2lubnQqIHwgcG93ZXJwY2xlLSotY3lnd2luKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfcG93ZXJwY2xlX3BlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX3Bvd2VycGNsZV9wZWlfdmVjIGJmZF9wb3dlcnBjX3BlaV92ZWMgYmZkX3Bvd2VycGNsZV9wZV92ZWMgYmZkX3Bvd2VycGNfcGVfdmVjIgotICAgIDs7Ci0KLSAgcnM2MDAwLSotKikKLSAgICB0YXJnX2RlZnZlYz1yczYwMDBjb2ZmX3ZlYwotICAgIDs7Ci0KLSAgc2gtKi1lbGYqIHwgc2gtKi1ydGVtc2VsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NoX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NobF92ZWMgc2hjb2ZmX3ZlYyBzaGxjb2ZmX3ZlYyBzaGNvZmZfc21hbGxfdmVjIHNobGNvZmZfc21hbGxfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzaC0qLXBlKQotICAgIHRhcmdfZGVmdmVjPXNobHBlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ic2hscGVfdmVjIHNobHBlaV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNoLSotKiB8IHNoLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPXNoY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9InNoY29mZl92ZWMgc2hsY29mZl92ZWMgc2hjb2ZmX3NtYWxsX3ZlYyBzaGxjb2ZmX3NtYWxsX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBzcGFyY2xldC0qLWFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3BhcmNsZV9hb3V0X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYzg2eC0qLWFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3BhcmNsaXRlLSotZWxmKiB8IHNwYXJjODZ4LSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1saW51eCphb3V0KikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY2xpbnV4X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NwYXJjX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYy0qLWxpbnV4LWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ic3BhcmNsaW51eF92ZWMgYmZkX2VsZjY0X3NwYXJjX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIDs7Ci0gIHNwYXJjLSotbHlueG9zKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY2x5bnhfY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3BhcmNseW54X2FvdXRfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1uZXRic2RlbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3BhcmNuZXRic2RfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1uZXRic2Rhb3V0KiB8IHNwYXJjLSotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY25ldGJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYy0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjbmV0YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYy0qLWVsZiogfCBzcGFyYy0qLXNvbGFyaXMyLlswLTZdIHwgc3BhcmMtKi1zb2xhcmlzMi5bMC02XS4qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3Vub3NfYmlnX3ZlYwotICAgIDs7Ci0jaWZkZWYgQkZENjQKLSAgc3BhcmMtKi1zb2xhcmlzMiogfCBzcGFyY3Y5LSotc29sYXJpczIqIHwgc3BhcmM2NC0qLXNvbGFyaXMyKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmNjRfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgOzsKLSNlbmRpZgotICBzcGFyYy0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1uZXR3YXJlKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJubG0zMl9zcGFyY192ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICA7OwotI2lmZGVmIEJGRDY0Ci0gIHNwYXJjNjQtKi1hb3V0KikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjNjQtKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9zcGFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9zcGFyY192ZWMgc3BhcmNsaW51eF92ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICA7OwotICBzcGFyYzY0LSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICA7OyAgICAKLSNlbmRpZiAvKiBCRkQ2NCAqLwotICBzcGFyYyotKi1jb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY2NvZmZfdmVjCi0gICAgOzsKLSAgc3BhcmMqLSotKiB8IHNwYXJjKi0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSNpZiBIQVZFX2hvc3RfYW91dF92ZWMKLSAgdGFob2UtKi0qKQotICAgIHRhcmdfZGVmdmVjPWhvc3RfYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSNlbmRpZgotCi0gIHRpYzgwKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9dGljODBjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0KLSAgdjg1MC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Y4NTBfdmVjCi0gICAgOzsKLSAgdjg1MGUtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl92ODUwX3ZlYwotICAgIDs7Ci0gIHY4NTBlYS0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Y4NTBfdmVjCi0gICAgOzsKLSNpZiBIQVZFX2hvc3RfYW91dF92ZWMKLSAgdmF4LSotYnNkKiB8IHZheC0qLXVsdHJpeCopCi0gICAgdGFyZ19kZWZ2ZWM9aG9zdF9hb3V0X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotI2VuZGlmCi0KLSAgdmF4Ki0qLSp2bXMqKQotICAgIHRhcmdfZGVmdmVjPXZtc192YXhfdmVjCi0gICAgOzsKLQotICB3ZTMyay0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9d2UzMmtjb2ZmX3ZlYwotICAgIDs7Ci0KLSAgdzY1LSotKikKLSAgICB0YXJnX2RlZnZlYz13NjVfdmVjCi0gICAgOzsKLQotICB6OGsqLSotKikKLSAgICB0YXJnX2RlZnZlYz16OGtjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gICotKi1pZWVlKikKLSAgICB0YXJnX2RlZnZlYz1pZWVlX3ZlYwotICAgIDs7Ci0KLSAgKi1hZG9iZS0qKQotICAgIHRhcmdfZGVmdmVjPWFfb3V0X2Fkb2JlX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gICotc29ueS0qKQotICAgIHRhcmdfZGVmdmVjPW5ld3NvczNfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgKi10YW5kZW0tKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aWVlZV92ZWMKLSAgICA7OwotIyBFTkQgT0YgdGFyZ21hdGNoLmgKLSAgKikKLSAgICBlY2hvIDE+JjIgIioqKiBCRkQgZG9lcyBub3Qgc3VwcG9ydCB0YXJnZXQgJHt0YXJnfS4iCi0gICAgZWNobyAxPiYyICIqKiogTG9vayBpbiBiZmQvY29uZmlnLmJmZCBmb3Igc3VwcG9ydGVkIHRhcmdldHMuIgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLSMgSWYgd2Ugc3VwcG9ydCBhbnkgRUxGIHRhcmdldCwgdGhlbiBhdXRvbWF0aWNhbGx5IGFkZCBzdXBwb3J0IGZvciB0aGUKLSMgZ2VuZXJpYyBFTEYgdGFyZ2V0cy4gIFRoaXMgcGVybWl0cyBhbiBvYmpkdW1wIHdpdGggc29tZSBFTEYgc3VwcG9ydAotIyB0byBiZSB1c2VkIG9uIGFuIGFyYml0cmFyeSBFTEYgZmlsZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbgotIyByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotY2FzZSAiJHt0YXJnX2RlZnZlY30gJHt0YXJnX3NlbHZlY3N9IiBpbgotICAqYmZkX2VsZjY0KikKLSAgICB0YXJnX3NlbHZlY3M9IiR7dGFyZ19zZWx2ZWNzfSBiZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjIGJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYyBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjIgotICAgIDs7Ci0gICpiZmRfZWxmMzIqKQotICAgIHRhcmdfc2VsdmVjcz0iJHt0YXJnX3NlbHZlY3N9IGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYyIKLSAgICA7OwotZXNhYwpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZy5pbiBiL2JmZC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczODM2NTYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gICovCi0jdW5kZWYgVElNRV9XSVRIX1NZU19USU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjbnRsIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmRvcGVuIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0ZET1BFTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRnaWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUR0lECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXR1aWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUVUlECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWFkdmlzZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NQURWSVNFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXByb3RlY3QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVBST1RFQ1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRpdGltZXIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUSVRJTUVSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzY29uZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TWVNDT05GCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9ESVJFTlRfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURERFRl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcHJvY2ZzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QUk9DRlNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gKi8KLSN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIG1hbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBEZWZpbmUgaWYgcmVhbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MKLQotLyogRGVmaW5lIGlmIGZyZWUgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi0KLS8qIERlZmluZSBpZiBnZXRlbnYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcnN0YXR1c190LiAqLwotI3VuZGVmIEhBVkVfUFJTVEFUVVNfVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHByc3RhdHVzX3QucHJfd2hvLiAqLwotI3VuZGVmIEhBVkVfUFJTVEFUVVNfVF9QUl9XSE8KLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwc3RhdHVzX3QuICovCi0jdW5kZWYgSEFWRV9QU1RBVFVTX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcnBzaW5mb190LiAqLwotI3VuZGVmIEhBVkVfUFJQU0lORk9fVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHBzaW5mb190LiAqLwotI3VuZGVmIEhBVkVfUFNJTkZPX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBsd3BzdGF0dXNfdC4gKi8KLSN1bmRlZiBIQVZFX0xXUFNUQVRVU19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgbHdwc3RhdHVzX3QucHJfY29udGV4dC4gKi8KLSN1bmRlZiBIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBsd3BzdGF0dXNfdC5wcl9yZWcuICovCi0jdW5kZWYgSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyB3aW4zMl9wc3RhdHVzX3QuICovCi0jdW5kZWYgSEFWRV9XSU4zMl9QU1RBVFVTX1QKLQotLyogTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuICovCi0jdW5kZWYgVFJBRF9IRUFERVIKLQotLyogVXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/ICovCi0jdW5kZWYgVVNFX01NQVAKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZSBiL2JmZC9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlY2Q0YTkuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDYxNDcgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMy4xIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtNjQtYml0LWJmZCAgICAgNjQtYml0IHN1cHBvcnQgKG9uIGhvc3RzIHdpdGggbmFycm93ZXIgd29yZCBzaXplcykiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtbW1hcCAgICAgICAgICAgICB0cnkgdXNpbmcgbW1hcCBmb3IgQkZEIGlucHV0IGZpbGVzIGlmIGF2YWlsYWJsZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMuMSIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1saWJiZmQuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgICB0ZXN0IC1mICIkY2FjaGVfZmlsZSIgJiYgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiCi1hY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIKLWFjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU3MjogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hvc3QiID0gIngiIHx8ICh0ZXN0ICJ4JGhvc3QiICE9ICJ4Tk9ORSIgJiYgdGVzdCAieCRob3N0IiAhPSAieCRhY19jdl9ob3N0X2FsaWFzIik7IHRoZW4KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLQotICBhY19jdl9ob3N0X2FsaWFzPSRob3N0Ci0gIGNhc2UgIiRhY19jdl9ob3N0X2FsaWFzIiBpbgotICBOT05FKQotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgIE5PTkUpCi0gICAgICBpZiBhY19jdl9ob3N0X2FsaWFzPWAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgIGZpIDs7Ci0gICAgKikgYWNfY3ZfaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgCi0gIGFjX2N2X2hvc3RfY3B1PWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLSAgYWNfY3ZfaG9zdF92ZW5kb3I9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl9ob3N0X29zPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVsc2UKLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaG9zdCIgMT4mNgotCi1ob3N0PSRhY19jdl9ob3N0Ci1ob3N0X2FsaWFzPSRhY19jdl9ob3N0X2FsaWFzCi1ob3N0X2NwdT0kYWNfY3ZfaG9zdF9jcHUKLWhvc3RfdmVuZG9yPSRhY19jdl9ob3N0X3ZlbmRvcgotaG9zdF9vcz0kYWNfY3ZfaG9zdF9vcwotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjEzOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotaWYgdGVzdCAieCRhY19jdl90YXJnZXQiID0gIngiIHx8ICh0ZXN0ICJ4JHRhcmdldCIgIT0gInhOT05FIiAmJiB0ZXN0ICJ4JHRhcmdldCIgIT0gIngkYWNfY3ZfdGFyZ2V0X2FsaWFzIik7IHRoZW4KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLQotICBhY19jdl90YXJnZXRfYWxpYXM9JHRhcmdldAotICBjYXNlICIkYWNfY3ZfdGFyZ2V0X2FsaWFzIiBpbgotICBOT05FKQotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgIE5PTkUpCi0gICAgICBhY19jdl90YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLQotICAgICopIGFjX2N2X3RhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfdGFyZ2V0PWAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzYAotICBhY19jdl90YXJnZXRfY3B1PWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotICBhY19jdl90YXJnZXRfdmVuZG9yPWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl90YXJnZXRfb3M9YGVjaG8gJGFjX2N2X3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lbHNlCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3RhcmdldCIgMT4mNgotCi10YXJnZXQ9JGFjX2N2X3RhcmdldAotdGFyZ2V0X2FsaWFzPSRhY19jdl90YXJnZXRfYWxpYXMKLXRhcmdldF9jcHU9JGFjX2N2X3RhcmdldF9jcHUKLXRhcmdldF92ZW5kb3I9JGFjX2N2X3RhcmdldF92ZW5kb3IKLXRhcmdldF9vcz0kYWNfY3ZfdGFyZ2V0X29zCi0KLQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY1MzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotaWYgdGVzdCAieCRhY19jdl9idWlsZCIgPSAieCIgfHwgKHRlc3QgIngkYnVpbGQiICE9ICJ4Tk9ORSIgJiYgdGVzdCAieCRidWlsZCIgIT0gIngkYWNfY3ZfYnVpbGRfYWxpYXMiKTsgdGhlbgotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0gIGlmICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotCi0gIGFjX2N2X2J1aWxkX2FsaWFzPSRidWlsZAotICBjYXNlICIkYWNfY3ZfYnVpbGRfYWxpYXMiIGluCi0gIE5PTkUpCi0gICAgY2FzZSAkbm9ub3B0IGluCi0gICAgTk9ORSkKLSAgICAgIGFjX2N2X2J1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0KLSAgICAqKSBhY19jdl9idWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfYnVpbGQ9YCRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhc2AKLSAgYWNfY3ZfYnVpbGRfY3B1PWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0gIGFjX2N2X2J1aWxkX3ZlbmRvcj1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl9idWlsZF9vcz1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWxzZQotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9idWlsZCIgMT4mNgotCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWJ1aWxkX2FsaWFzPSRhY19jdl9idWlsZF9hbGlhcwotYnVpbGRfY3B1PSRhY19jdl9idWlsZF9jcHUKLWJ1aWxkX3ZlbmRvcj0kYWNfY3ZfYnVpbGRfdmVuZG9yCi1idWlsZF9vcz0kYWNfY3ZfYnVpbGRfb3MKLQotCi0KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfQ0Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DQytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiogfCAqQ1lHV0lOKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgwMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzMzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDg0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODc1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg4MDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfZ2NjK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkwODogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX2NjX2crc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk0MDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTczOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDMwOiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiInllcyIgMT4mNgotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDg3OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1iZmQKLQotVkVSU0lPTj0yLjkuNQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMzM6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE0NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTU5OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE3MjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTg1OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19BUitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX1JBTkxJQitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI3MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX1JBTkxJQitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPW5vCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX1JBTkxJQitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDE3OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDQxOiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NDQ6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLWZpCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9MRCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0Nzk6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX2dudV9sZCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0OTU6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9OTStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubSB8fCB0ZXN0IC1mICRhY19kaXIvbm0kYWNfZXhlZXh0IDsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUzMTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19MTl9TK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3RkYXRhCi1pZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAotdGhlbgotICBybSAtZiBjb25mdGVzdGRhdGEKLSAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi1maQotZmkKLUxOX1M9IiRhY19jdl9wcm9nX0xOX1MiCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotY2FzZSAiJHRhcmdldCIgaW4KLU5PTkUpIGx0X3RhcmdldD0iJGhvc3QiIDs7Ci0qKSBsdF90YXJnZXQ9IiR0YXJnZXQiIDs7Ci1lc2FjCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICA6Ci1maQotCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siID0geG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotdGVzdCB4IiRzaWxlbnQiID0geHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDE1ODAgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1ODE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYwMjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7bHRfY3ZfY2NfbmVlZHNfYmVsZitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0KLWVzYWMKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTERGTEFHUz0iJExERkxBR1MiIExJQlM9IiRMSUJTIiBcCi1MTl9TPSIkTE5fUyIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgT0JKRFVNUD0iJE9CSkRVTVAiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkbHRfdGFyZ2V0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgICB0ZXN0IC1mICIkY2FjaGVfZmlsZSIgJiYgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTY0LWJpdC1iZmQgb3IgLS1kaXNhYmxlLTY0LWJpdC1iZmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfNjRfYml0X2JmZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfNjRfYml0X2JmZCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50NjQ9ZmFsc2UKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbW1hcCBvciAtLXdpdGhvdXQtbW1hcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbW1hcCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9tbWFwIgotICBjYXNlICIke3dpdGh2YWx9IiBpbgotICB5ZXMpICB3YW50X21tYXA9dHJ1ZSA7OwotICBubykgICB3YW50X21tYXA9ZmFsc2UgOzsKLSAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgQkZEIHdpdGgtbW1hcCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50X21tYXA9ZmFsc2UKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4NjogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MDk6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2N5Z3dpbitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4MTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4MjU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODQxOiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfbWluZ3czMitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4NDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODUzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgRU1YIE9TLzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Njk6IGNoZWNraW5nIGZvciBFTVggT1MvMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZW14b3MyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg3NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fRU1YX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg4MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2VteG9zMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZW14b3MyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2VteG9zMiIgMT4mNgotRU1YT1MyPQotdGVzdCAiJGFjX2N2X2VteG9zMiIgPSB5ZXMgJiYgRU1YT1MyPXllcwotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTAwOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2V4ZWV4dCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllcyB8fCB0ZXN0ICIkRU1YT1MyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICouQyB8ICoubyB8ICoub2JqIHwgKi54Y29mZikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1ob3N0NjQ9ZmFsc2UKLXRhcmdldDY0PWZhbHNlCi0KLSMgaG9zdCBzdHVmZjoKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTM5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfQ0Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTY5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfQ0Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqIHwgKkNZR1dJTiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfQ0Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA1MjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDIwNjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDk0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwOTk6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX2djYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEyNzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX2NjX2crc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTYxOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DUFArc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxODI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxOTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxOTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNDE6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfc3RkYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjg5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzQ1OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfY19jb25zdCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM5OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDIwOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9jX2lubGluZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGludCBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQzNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NjA6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfdHlwZV9vZmZfdCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl90eXBlX29mZl90PXllcyIKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl90eXBlX29mZl90PW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfdHlwZV8nb2ZmX3RgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDk1OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl90eXBlX3NpemVfdCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfdHlwZV9zaXplX3Q9eWVzIgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X3R5cGVfc2l6ZV90PW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfdHlwZV8nc2l6ZV90YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTMyOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyX2FsbG9jYV9oK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU2NTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY19hbGxvY2Ffd29ya3Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1OTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjMwOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9vc19jcmF5K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NjA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY18kYWNfZnVuYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotY2hhciAoKmYpKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi1mID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2ODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxNjogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfY19zdGFja19kaXJlY3Rpb24rc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzY4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyXyRhY19zYWZlK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc3ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODA3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODM2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODYxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODY5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDA5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAzNzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl8kYWNfc2FmZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNDc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDc3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTM1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxOTg6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YW1fY3ZfdmFsX0xDX01FU1NBR0VTK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjMxOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNTE6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI3MDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyXyRhY19zYWZlK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI3NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjgwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI5NzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7Z3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzAyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzA5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMjU6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLTolX19wX18lJ2AKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9saWJfJGFjX2xpYl92YXIrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzYwOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHtndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzNjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX01TR0ZNVCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQzNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jXyRhY19mdW5jK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQzOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci1jaGFyICgqZikoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLWYgPSAkYWNfZnVuYzsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ2MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ5MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX0dNU0dGTVQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MjY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9YR0VUVEVYVCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9NU0dGTVQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjMyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfR01TR0ZNVCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY2ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX1hHRVRURVhUK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc1ODogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc4NjogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyXyRhY19zYWZlK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzc5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotIyBQZXJtaXQgaG9zdCBzcGVjaWZpYyBzZXR0aW5ncy4KLS4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0Ci0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODc0OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLQkgICAgZ3JlcCBwd3BsdXMgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1CRkRfSE9TVF82NEJJVF9MT05HPTAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEPTAKLUJGRF9IT1NUXzY0X0JJVD0KLUJGRF9IT1NUX1VfNjRfQklUPQotaWYgdGVzdCAieCR7SE9TVF82NEJJVF9UWVBFfSIgPSAieGxvbmciOyB0aGVuCi0gIEJGRF9IT1NUXzY0QklUX0xPTkc9MQotZWxpZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiAhPSAieCI7IHRoZW4KLSAgQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MQotICBCRkRfSE9TVF82NF9CSVQ9JHtIT1NUXzY0QklUX1RZUEV9Ci0gIEJGRF9IT1NUX1VfNjRfQklUPSR7SE9TVF9VXzY0QklUX1RZUEV9Ci1maQotCi0KLQotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCi0gIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSckKENDKScKLSAgZWxzZQotICAgIENDX0ZPUl9CVUlMRD1nY2MKLSAgZmkKLWZpCi0KLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk2MTogY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2J1aWxkX2V4ZWV4dCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ubwotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfYnVpbGRfZXhlZXh0IiAxPiY2Ci0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi0KLQotZm9yIGFjX2hkciBpbiBzdGRkZWYuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdGltZS5oIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk4OTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl8kYWNfc2FmZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5OTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM5OTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl8kYWNfc2FmZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQwMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA2NjogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl90aW1lK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci1pbnQgbWFpbigpIHsKLXN0cnVjdCB0bSAqdHA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA4MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl90aW1lPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfdGltZT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfdGltZSIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi1FT0YKLQotZmkKLQotYWNfaGVhZGVyX2RpcmVudD1ubwotZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMDU6IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IG1haW4oKSB7Ci1ESVIgKmRpcnAgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfZGlyZW50XyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSBhY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLSMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KLWlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNDM6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGlyJ18nb3BlbmRpciB8IHNlZCAneSUuLystOiVfX3BfXyUnYAotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2xpYl8kYWNfbGliX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRpciAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTUxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1sZGlyIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE4NDogY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8geCdfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLTolX19wX18lJ2AKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9saWJfJGFjX2xpYl92YXIrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWx4ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxOTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBvcGVuZGlyKCk7Ci0KLWludCBtYWluKCkgewotb3BlbmRpcigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDIwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTElCUz0iJExJQlMgLWx4IgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIGZjbnRsIGdldHBhZ2VzaXplIHNldGl0aW1lciBzeXNjb25mIGZkb3BlbiBnZXR1aWQgZ2V0Z2lkCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjI4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKikKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9CSU5BUllfRk9QRU4gMQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI5MjogY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0citzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyOTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3Ryc3RyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMxODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzMzk6IGNoZWNraW5nIHdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2JmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIG1hbGxvYwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzNjU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2M9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fTUFMTE9DIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM4NjogY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2JmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSByZWFsbG9jCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQxMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYyIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fUkVBTExPQyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0MzM6IGNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHtiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0MzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZnJlZQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZT1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZT15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0ODA6IGNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2JmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGdldGVudgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1MDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fR0VURU5WIDEKLUVPRgotCi1maQotCi0KLSMgSWYgd2UgYXJlIGNvbmZpZ3VyZWQgbmF0aXZlLCBwaWNrIGEgY29yZSBmaWxlIHN1cHBvcnQgZmlsZS4KLUNPUkVGSUxFPQotQ09SRUZMQUc9Ci1UUkFEX0hFQURFUj0KLWlmIHRlc3QgIiR7dGFyZ2V0fSIgPSAiJHtob3N0fSI7IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgYWxwaGEqLSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2FscGhhbGludXguaCInCi0JOzsKLSAgYWxwaGEqLSotbmV0YnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgYWxwaGEqLSotKikJCUNPUkVGSUxFPW9zZi1jb3JlLmxvIDs7Ci0gIGFybS0qLXJpc2NpeCkJCUNPUkVGSUxFPXRyYWQtY29yZS5sbyA7OwotICBocHBhKi0qLWhwdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgaHBwYSotKi1oaXV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotbXBlaXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgaHBwYSotKi1ic2QqKQkJQ09SRUZJTEU9ImhwdXgtY29yZS5sbyBocHBhYnNkLWNvcmUubG8iCi0JCQlDT1JFRkxBRz0iLURIUFVYX0NPUkUgLURIUFBBQlNEX0NPUkUiIDs7Ci0gIGkzNzAtKi0qKQkJCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzcwbGludXguaCInCi0JOzsKLQotICBpWzM0NTZdODYtc2VxdWVudC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvc3ltbWV0cnkuaCInCi0JOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdjQqKSA7OwotICBpWzM0NTZdODYtc2VxdWVudC1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLWJzZCogfCBpWzM0NTZdODYtKi1mcmVlYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZic2QuaCInCi0JOzsKLSAgaVszNDU2XTg2LSotbmV0YnNkKiB8IGlbMzQ1Nl04Ni0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgaVszNDU2XTg2LWVzaXgtc3lzdjMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZXNpeC5oIicKLQk7OwotICBpWzM0NTZdODYtKi1zY28zLjJ2NSopCi0JQ09SRUZJTEU9c2NvNS1jb3JlLmxvCi0JOzsKLSAgaVszNDU2XTg2LSotc2NvKiB8IGlbMzQ1Nl04Ni0qLWlzYyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2c2NvLmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZtYWNoMy5oIicKLQk7OwotICBpWzM0NTZdODYtKi1saW51eC1nbnUqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NmxpbnV4LmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLWlzYyopCUNPUkVGSUxFPXRyYWQtY29yZS5sbyA7OwotICBpWzM0NTZdODYtKi1haXgqKQlDT1JFRklMRT1haXgzODYtY29yZS5sbyA7OwotICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTg2MG1hY2gzLmgiJwotCTs7Ci0gIG1pcHMtZGVjLWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzYnNkLmgiJwotCTs7Ci0gIG1pcHMtZGVjLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotbmV0YnNkKiB8IG1pcHMqLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICBtaXBzLWRlYy0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZGVjc3RhdGlvbi5oIicKLQk7OwotICBtaXBzLXNnaS1pcml4NCopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLXNnaS1pcml4NSopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLXNnaS1pcml4NiopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJwotCTs7Ci0gIG1pcHMtKi1zeXN2NCopCTs7Ci0gIG1pcHMtKi1zeXN2KiB8IG1pcHMtKi1yaXNjb3MqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvcmlzY29zLmgiJwotCTs7Ci0gIG1pcHMtc29ueS1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy1taXBzLmgiJwotCTs7Ci0gIG02OCotYnVsbCotc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kcHgyLmgiJwotCTs7Ci0gIG02OCotaHAtaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBtNjgqLWhwLWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9ocDMwMGJzZC5oIicKLQk7OwotICBtNjgqLSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL202OGtsaW51eC5oIicKLQk7OwotICBtNjgqLW1vdG9yb2xhLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZGVsdGE2OC5oIicKLQk7OwotICBtNjgqLXNvbnktKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MuaCInCi0JOzsKLSAgbTY4Ki0qLW5ldGJzZCogfCBtNjgqLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICBtNjgqLWFwcGxlLWF1eCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrYXV4LmgiJwotCTs7Ci0gIG04OCotKi1zeXN2NCopCTs7Ci0gIG04OCotbW90b3JvbGEtc3lzdiopCUNPUkVGSUxFPXB0cmFjZS1jb3JlLmxvIDs7Ci0gIG04OCotKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tODhrbWFjaDMuaCInCi0JOzsKLSAgbnMzMmstcGM1MzItbWFjaCkKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3BjNTMybWFjaC5oIicKLQk7OwotICBuczMyay0qLW5ldGJzZCogfCBuczMyay0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgcnM2MDAwLSotbHlueCopCUNPUkVGSUxFPWx5bngtY29yZS5sbyA7OwotICByczYwMDAtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcnM2MDAwLSotKikJCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi0qYnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYWl4KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWJlb3MqKQk7OwotICBwb3dlcnBjLSotbmV0YnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgc3BhcmMtKi1uZXRic2QqIHwgc3BhcmMtKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHRhaG9lLSotKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3RhaG9lLmgiJwotCTs7Ci0gIHZheC0qLXVsdHJpeDIqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKLQk7OwotICB2YXgtKi11bHRyaXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKLQk7OwotICB2YXgtKi0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4YnNkLmgiJwotCTs7Ci0gIGVzYWMKLQotICBjYXNlICIkQ09SRUZJTEUiIGluCi0gIGFpeDM4Ni1jb3JlLmxvKQlDT1JFRkxBRz0tREFJWDM4Nl9DT1JFIDs7Ci0gIGhwcGFic2QtY29yZS5sbykJQ09SRUZMQUc9LURIUFBBQlNEX0NPUkUgOzsKLSAgaHB1eC1jb3JlLmxvKQkJQ09SRUZMQUc9LURIUFVYX0NPUkUgOzsKLSAgaXJpeC1jb3JlLmxvKQkJQ09SRUZMQUc9LURJUklYX0NPUkUgOzsKLSAgbHlueC1jb3JlLmxvKQkJQ09SRUZMQUc9LURMWU5YX0NPUkUgOzsKLSAgbmV0YnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ETkVUQlNEX0NPUkUgOzsKLSAgb3NmLWNvcmUubG8pCQlDT1JFRkxBRz0tRE9TRl9DT1JFIDs7Ci0gIHB0cmFjZS1jb3JlLmxvKQlDT1JFRkxBRz0tRFBUUkFDRV9DT1JFIDs7Ci0gIHJzNjAwMC1jb3JlLmxvKQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EQUlYX0NPUkUiIDs7Ci0gIHNjbzUtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURTQ081X0NPUkUiIDs7Ci0gIHRyYWQtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURUUkFEX0NPUkUiIDs7Ci0gIGVzYWMKLQotICAjIEVMRiBjb3JlZmlsZSBzdXBwb3J0IGhhcyBzZXZlcmFsIGZsYXZvcnMsIGJ1dCBhbGwgb2YKLSAgIyB0aGVtIHVzZSBzb21ldGhpbmcgY2FsbGVkIDxzeXMvcHJvY2ZzLmg+Ci0gIGZvciBhY19oZHIgaW4gc3lzL3Byb2Nmcy5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDcxMjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl8kYWNfc2FmZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3MTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQ3MjI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Byb2Nmc19oIiA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcnN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc1MDogY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3Qrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXByc3RhdHVzX3QgYXZhcgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3NjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QUlNUQVRVU19UIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJzdGF0dXNfdC5wcl93aG8gaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Nzg0OiBjaGVja2luZyBmb3IgcHJzdGF0dXNfdC5wcl93aG8gaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9wcnN0YXR1c190X3ByX3dobytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3ODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotcHJzdGF0dXNfdCBhdmFyOyB2b2lkKiBhcmVmID0gKHZvaWQqKSAmYXZhci5wcl93aG8KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Nzk2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9wcnN0YXR1c190X3ByX3dobz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9wcnN0YXR1c190X3ByX3dobz1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9wcnN0YXR1c190X3ByX3dobyA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJTVEFUVVNfVF9QUl9XSE8gMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9wcnN0YXR1c190X3ByX3dobyIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4MTg6IGNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzdGF0dXNfdCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotcHN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODMwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzdGF0dXNfdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzdGF0dXNfdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFNUQVRVU19UIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcnBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDg1MjogY2hlY2tpbmcgZm9yIHBycHNpbmZvX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3Qrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODU3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXBycHNpbmZvX3QgYXZhcgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4NjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QUlBTSU5GT19UIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHNpbmZvX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODg2OiBjaGVja2luZyBmb3IgcHNpbmZvX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDg5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wc2luZm9fdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg5ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BTSU5GT19UIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDkyMDogY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcIlwke2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotbHdwc3RhdHVzX3QgYXZhcgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5MzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3QiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9jb250ZXh0IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDk1NDogY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190LnByX2NvbnRleHQgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDk1OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1sd3BzdGF0dXNfdCBhdmFyOyB2b2lkKiBhcmVmID0gKHZvaWQqKSAmYXZhci5wcl9jb250ZXh0Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk2NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfcmVnIGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDk4ODogY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190LnByX3JlZyBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJcJHtiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotbHdwc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfcmVnCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTAwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZz1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWcgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xXUFNUQVRVU19UX1BSX1JFRyAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZyIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdpbjMyX3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwMjI6IGNoZWNraW5nIGZvciB3aW4zMl9wc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3dpbjMyX3BzdGF0dXNfdCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwMjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotd2luMzJfcHN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDM0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3dpbjMyX3BzdGF0dXNfdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3dpbjMyX3BzdGF0dXNfdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3dpbjMyX3BzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfV0lOMzJfUFNUQVRVU19UIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV93aW4zMl9wc3RhdHVzX3QiIDE+JjYKLQotICBmaQotZmkKLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUUkFEX0hFQURFUiAkVFJBRF9IRUFERVIKLUVPRgotCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIC1sa2VybmVsMzIiCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLQotCi0jIHRhcmdldCBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotZGVmdmVjPQotc2VsdmVjcz0KLXNlbGFyY2hzPQotVERFRklORVM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvY29uZmlnLmJmZAotCWlmIHRlc3QgIngkdGFyZyIgPSAieCR0YXJnZXQiOyB0aGVuCi0JICAgIGRlZnZlYz0kdGFyZ19kZWZ2ZWMKLQlmaQotCXNlbHZlY3M9IiRzZWx2ZWNzICR0YXJnX2RlZnZlYyAkdGFyZ19zZWx2ZWNzIgotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0JVERFRklORVM9IiRUREVGSU5FUyAkdGFyZ19jZmxhZ3MiCi0gICAgZmkKLWRvbmUKLQotCi0jIFRoaXMgcHJvY2Vzc2luZyBzdGlsbCBuZWVkcyB0byBiZSBkb25lIGlmIHdlJ3JlIHRvIGRlY2lkZSBwcm9wZXJseSB3aGV0aGVyCi0jIDY0LWJpdCBzdXBwb3J0IG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLiAgQ3VycmVudGx5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGlmCi0jIHRoZSBkZWZhdWx0IG9yIGFueSBvdGhlciBleHBsaWNpdGx5IHJlcXVlc3RlZCB0YXJnZXQgcmVxdWlyZXMgaXQ7IGl0Ci0jIHdpbGwgbm90IGJlIGluY2x1ZGVkIG9uIGEgMzItYml0IGhvc3QgaWYgbm8gNjQtYml0IHRhcmdldCBpcyByZXF1ZXN0ZWQsIGFuZAotIyBubyAiLS13aXRoLTY0LWJpdC1iZmQiIG9wdGlvbiBpcyBnaXZlbiwgZXZlbiBpZiAiLS1lbmFibGUtdGFyZ2V0cz1hbGwiIGlzCi0jIHVzZWQuCi0KLSMgdW5pcSB0aGUgZGVmYXVsdCBhbmQgc2VsZWN0ZWQgdmVjdG9ycyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWx2ZWNzIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXNlbHZlY3M9IiRmIgotCi0KLSMgdW5pcSB0aGUgYXJjaGl0ZWN0dXJlcyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWxhcmNocyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWxhcmNocz0iJGYiCi0KLSMgVGFyZ2V0IGJhY2tlbmQgLm8gZmlsZXMuCi10Yj0KLQotZWxmPSJlbGYubG8gZWxmbGluay5sbyBkd2FyZjIubG8gZHdhcmYxLmxvIgotCi1mb3IgdmVjIGluICRzZWx2ZWNzCi1kbwotICAgIGNhc2UgIiR2ZWMiIGluCi0gICAgIyBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzeSB0byBjb21wYXJlCi0gICAgIyB3aXRoIHRoZSB0d28gdmVjdG9yIGxpc3RzIGluIHRhcmdldHMuYy4KLSAgICBhMjlrY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWEyOWsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYV9vdXRfYWRvYmVfdmVjKQkJdGI9IiR0YiBhb3V0LWFkb2JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhcm1jb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1jb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1uZXRic2RfdmVjKQkJdGI9IiR0YiBhcm1uZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFybXBlX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVpX2JpZ192ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9iaWdfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFvdXQwX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQwLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fbGl0dGxlX3ZlYykJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2JpZ192ZWMpCQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19saXR0bGVfdmVjKQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFwb2xsb2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWFwb2xsby5sbyIgOzsKLSAgICBiX291dF92ZWNfYmlnX2hvc3QpCQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJfb3V0X3ZlY19saXR0bGVfaG9zdCkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYWxwaGFfdmVjKQl0Yj0iJHRiIGVsZjY0LWFscGhhLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9hdnJfdmVjKQkJdGI9IiR0YiBlbGYzMi1hdnIubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1hcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYykJdGI9IiR0YiBlbGZhcm0tbmFiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMpIHRiPSIkdGIgZWxmYXJtLW9hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1hcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnYXJtX3ZlYykJdGI9IiR0YiBlbGZhcm0tbmFiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMpCXRiPSIkdGIgZWxmYXJtLW9hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjKSAJdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2JpZ21pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9kMTB2X3ZlYykJCXRiPSIkdGIgZWxmMzItZDEwdi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9kMzB2X3ZlYykJCXRiPSIkdGIgZWxmMzItZDMwdi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9mcjMwX3ZlYykJCXRiPSIkdGIgZWxmMzItZnIzMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9ocHBhX3ZlYykJCXRiPSIkdGIgZWxmMzItaHBwYS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9pMzcwX3ZlYykJCXRiPSIkdGIgZWxmMzItaTM3MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9pMzg2X3ZlYykJCXRiPSIkdGIgZWxmMzItaTM4Ni5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9pODYwX3ZlYykJCXRiPSIkdGIgZWxmMzItaTg2MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9pOTYwX3ZlYykJCXRiPSIkdGIgZWxmMzItaTk2MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMpIHRiPSIkdGIgZWxmMzItZ2VuLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYykgCXRiPSIkdGIgZWxmNjQtbWlwcy5sbyBlbGY2NC5sbyBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmMzJfbTMycl92ZWMpCQl0Yj0iJHRiIGVsZjMyLW0zMnIubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbTY4a192ZWMpCQl0Yj0iJHRiIGVsZjMyLW02OGsubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbTg4a192ZWMpCQl0Yj0iJHRiIGVsZjMyLW04OGsubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYykJdGI9IiR0YiBlbGYzMi1tY29yZS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21uMTAyMDBfdmVjKQl0Yj0iJHRiIGVsZi1tMTAyMDAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDMwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDMwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9wal92ZWMpICAgICAgICAgICB0Yj0iJHRiIGVsZjMyLXBqLmxvIGVsZjMyLmxvICRlbGYiOzsKLSAgICBiZmRfZWxmMzJfcGpsX3ZlYykgICAgICAgICAgdGI9IiR0YiBlbGYzMi1wai5sbyBlbGYzMi5sbyAkZWxmIjs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9zaF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKLSAgICBiZmRfZWxmMzJfc2hsX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zcGFyY192ZWMpCXRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfdjg1MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXY4NTAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjKSAJdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X3NwYXJjX3ZlYykJdGI9IiR0YiBlbGY2NC1zcGFyYy5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBjaXNjb19jb3JlX2JpZ192ZWMpCQl0Yj0iJHRiIGNpc2NvLWNvcmUubG8iIDs7Ci0gICAgY2lzY29fY29yZV9saXR0bGVfdmVjKQl0Yj0iJHRiIGNpc2NvLWNvcmUubG8iIDs7Ci0gICAgZGVtb182NF92ZWMpCQl0Yj0iJHRiIGRlbW82NC5sbyBhb3V0NjQubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGVjb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7Ci0gICAgZWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9iaWdsaXR0bGVfdmVjKQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7Ci0gICAgZWNvZmZhbHBoYV9saXR0bGVfdmVjKQl0Yj0iJHRiIGNvZmYtYWxwaGEubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBnbzMyY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtZ28zMi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBnbzMyc3R1YmJlZGNvZmZfdmVjKQl0Yj0iJHRiIGNvZmYtc3RnbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGg4MzAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDgzMDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBoODUwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWg4NTAwLmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgaG9zdF9hb3V0X3ZlYykJCXRiPSIkdGIgaG9zdC1hb3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBocDMwMGJzZF92ZWMpCQl0Yj0iJHRiIGhwMzAwYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBocDMwMGhwdXhfdmVjKQkJdGI9IiR0YiBocDMwMGhwdXgubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZhb3V0X3ZlYykJCXRiPSIkdGIgaTM4NmFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZic2RfdmVjKQkJdGI9IiR0YiBpMzg2YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaTM4Ni5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpMzg2ZHluaXhfdmVjKQkJdGI9IiR0YiBpMzg2ZHluaXgubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZmcmVlYnNkX3ZlYykJCXRiPSIkdGIgaTM4NmZyZWVic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZtc2Rvc192ZWMpCQl0Yj0iJHRiIGkzODZtc2Rvcy5sbyIgOzsKLSAgICBpMzg2cGVfdmVjKQkJCXRiPSIkdGIgcGUtaTM4Ni5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NnBlaV92ZWMpCQl0Yj0iJHRiIHBlaS1pMzg2LmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpMzg2bGludXhfdmVjKQkJdGI9IiR0YiBpMzg2bGludXgubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBpMzg2bHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1pMzg2bHlueC5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgaTM4Nm1hY2gzX3ZlYykJCXRiPSIkdGIgaTM4Nm1hY2gzLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bmV0YnNkX3ZlYykJCXRiPSIkdGIgaTM4Nm5ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm9zOWtfdmVjKQkJdGI9IiR0YiBpMzg2b3M5ay5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTg2MGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWk4NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1pOTYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGljb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpZWVlX3ZlYykJCQl0Yj0iJHRiIGllZWUubG8iIDs7Ci0gICAgbTY4a2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbTY4a2NvZmZ1bl92ZWMpCQl0Yj0iJHRiIGNvZmYtdTY4ay5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbTY4a2xpbnV4X3ZlYykJCXRiPSIkdGIgbTY4a2xpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrbHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgbTY4a2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrbHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtbTY4a2x5bngubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBtNjhrbmV0YnNkX3ZlYykJCXRiPSIkdGIgbTY4a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4azRrbmV0YnNkX3ZlYykJCXRiPSIkdGIgbTY4azRrbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrYXV4X2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWF1eC5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbTY4a3N5c3Zjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zdm02OGsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbTg4a2Jjc192ZWMpCQl0Yj0iJHRiIGNvZmYtbTg4ay5sbyIgOzsKLSAgICBtaXBzbHBlX3ZlYykJCXRiPSIkdGIgcGUtbWlwcy5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtaXBzbHBlaV92ZWMpCQl0Yj0iJHRiIHBlaS1taXBzLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZWktbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG5ld3NvczNfdmVjKQkJdGI9IiR0YiBuZXdzb3MzLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBubG0zMl9pMzg2X3ZlYykJCXRiPSIkdGIgbmxtMzItaTM4Ni5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgbmxtMzJfc3BhcmNfdmVjKQkJdGI9IiR0YiBubG0zMi1zcGFyYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgbmxtMzJfYWxwaGFfdmVjKQkJdGI9IiR0YiBubG0zMi1hbHBoYS5sbyBubG0zMi5sbyBubG0ubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHJpc2NpeF92ZWMpCQkJdGI9IiR0YiBhb3V0MzIubG8gcmlzY2l4LmxvIiA7OwotICAgIG5sbTMyX3Bvd2VycGNfdmVjKQkJdGI9IiR0YiBubG0zMi1wcGMubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIHBjNTMybmV0YnNkX3ZlYykJCXRiPSIkdGIgbnMzMmtuZXRic2QubG8gYW91dC1uczMyay5sbyIgOzsKLSAgICBwYzUzMm1hY2hhb3V0X3ZlYykJCXRiPSIkdGIgcGM1MzItbWFjaC5sbyBhb3V0LW5zMzJrLmxvIiA7OwotICAgIHBtYWNfeGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXBtYWMubG8geGNvZmZsaW5rLmxvIiA7OwotICAgIHJzNjAwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXJzNjAwMC5sbyB4Y29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX3Bvd2VycGNfcGVfdmVjKSAgICAgICAgIHRiPSIkdGIgcGUtcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjKSAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7ICAKLSAgICBiZmRfcG93ZXJwY19wZWlfdmVjKSAgICAgICAgdGI9IiR0YiBwZWktcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfcG93ZXJwY2xlX3BlaV92ZWMpICAgICAgdGI9IiR0YiBwZWktcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBwcGNib290X3ZlYykJCXRiPSIkdGIgcHBjYm9vdC5sbyIgOzsKLSAgICBzaGNvZmZfdmVjKQkJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobHBlX3ZlYykJCQl0Yj0iJHRiIHBlLXNoLmxvIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hscGVpX3ZlYykJCQl0Yj0iJHRiIHBlaS1zaC5sbyBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNvbV92ZWMpCQkJdGI9IiR0YiBzb20ubG8iIDs7Ci0gICAgc3BhcmNsZV9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC1zcGFyY2xlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2xpbnV4X3ZlYykJCXRiPSIkdGIgc3BhcmNsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBzcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLXNwYXJjbHlueC5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgc3BhcmNuZXRic2RfdmVjKQkJdGI9IiR0YiBzcGFyY25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zcGFyYy5sbyIgOzsKLSAgICBzcmVjX3ZlYykJCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgc3Vub3NfYmlnX3ZlYykJCXRiPSIkdGIgc3Vub3MubG8gYW91dDMyLmxvIiA7OwotICAgIHN5bWJvbHNyZWNfdmVjKQkJdGI9IiR0YiBzcmVjLmxvIiA7OwotICAgIHRla2hleF92ZWMpCQkJdGI9IiR0YiB0ZWtoZXgubG8iIDs7Ci0gICAgdGljMzBfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtdGljMzAubG8iIDs7Ci0gICAgdGljMzBfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljMzAubG8iIDs7Ci0gICAgdGljODBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWM4MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICB2ZXJzYWRvc192ZWMpCQl0Yj0iJHRiIHZlcnNhZG9zLmxvIiA7OwotICAgIHZtc19hbHBoYV92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIKLSAJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHZtc192YXhfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iIDs7Ci0gICAgdzY1X3ZlYykJCQl0Yj0iJHRiIGNvZmYtdzY1LmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgd2UzMmtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi13ZTMyay5sbyIgOzsKLSAgICB6OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi16OGsubG8gcmVsb2MxNi5sbyIgOzsKLQotICAgICIiKQkJCTs7Ci0gICAgKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAqKiogdW5rbm93biB0YXJnZXQgdmVjdG9yICR2ZWMiIDE+JjI7IGV4aXQgMTsgfSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotIyBBIGNvdXBsZSBvZiBDUFVzIHVzZSBzaG9ydGVyIGZpbGUgbmFtZXMgdG8gYXZvaWQgcHJvYmxlbXMgb24gRE9TCi0jIGZpbGVzeXN0ZW1zLgotdGE9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lIHMvYmZkXy9jcHUtL2cgLWUgcy9fYXJjaC8ubG8vZyAtZSBzL21uMTAyMDAvbTEwMjAwLyAtZSBzL21uMTAzMDAvbTEwMzAwL2AKLQotIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi1mPSIiCi1mb3IgaSBpbiAkdGIgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGI9IiRmIgotCi1mPSIiCi1mb3IgaSBpbiAkdGEgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGE9IiRmIgotCi1iZmRfYmFja2VuZHM9IiR0YiIKLWJmZF9tYWNoaW5lcz0iJHRhIgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlIDsgdGhlbgotICBiZmRfYmFja2VuZHM9IiR7YmZkX2JhY2tlbmRzfSInICQoQUxMX0JBQ0tFTkRTKScKLSAgYmZkX21hY2hpbmVzPSIke2JmZF9tYWNoaW5lc30iJyAkKEFMTF9NQUNISU5FUyknCi0gIHNlbHZlY3M9Ci0gIGhhdmV2ZWNzPQotICBzZWxhcmNocz0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICMgT25seSBzZXQgdGhlc2UgaWYgdGhleSB3aWxsIGJlIG5vbmVtcHR5LCBmb3IgdGhlIGNsZXZlciBlY2hvLgotICBoYXZldmVjcz0KLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgaGF2ZXZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi8tREhBVkVfLycgLWUgJ3MvIFwoLlwpLyAtREhBVkVfXDEvZydgCi0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIHNlbHZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbGFyY2hzIiAmJgotICAgIHNlbGFyY2hzPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotZmkJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0KLWNhc2UgJHtob3N0NjR9LSR7dGFyZ2V0NjR9LSR7d2FudDY0fSBpbgotICAqdHJ1ZSopCi0gICAgd29yZHNpemU9NjQKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZENjRfQkFDS0VORFMpICQoQkZEMzJfQkFDS0VORFMpJwotICAgIGlmIHRlc3QgLXogIiRHQ0MiICYmIHRlc3QgIiRCRkRfSE9TVF82NEJJVF9MT05HIiA9ICIwIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRfQklUX0RFRklORUQiID0gIjAiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IFlvdSBoYXZlIHJlcXVlc3RlZCBhIDY0IGJpdCBCRkQgY29uZmlndXJhdGlvbiwgYnV0IiAxPiYyCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IHlvdXIgY29tcGlsZXIgbWF5IG5vdCBoYXZlIGEgNjQgYml0IGludGVncmFsIHR5cGUiIDE+JjIKLSAgICBmaQotICAgIDs7Ci0gIGZhbHNlLWZhbHNlLWZhbHNlKQotICAgIHdvcmRzaXplPTMyCi0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDMyX0JBQ0tFTkRTKScKLSAgICA7OwotZXNhYwotCi0KLQotCi0KLQotdGRlZmF1bHRzPSIiCi10ZXN0IC1uICIke2RlZnZlY30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EREVGQVVMVF9WRUNUT1I9JHtkZWZ2ZWN9IgotdGVzdCAtbiAiJHtzZWx2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfVkVDUz0nJHtzZWx2ZWNzfSciCi10ZXN0IC1uICIke3NlbGFyY2hzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfQVJDSElURUNUVVJFUz0nJHtzZWxhcmNoc30nIgotdGVzdCAtbiAiJHtoYXZldmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9ICR7aGF2ZXZlY3N9IgotCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1Mzk0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyXyRhY19zYWZlK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTM5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQwNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NDMzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NDM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NDg3OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NDk1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gbWFkdmlzZSBtcHJvdGVjdAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTY2MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jXyRhY19mdW5jK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTY2NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci1jaGFyICgqZikoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLWYgPSAkYWNfZnVuYzsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTY4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotY2FzZSAke3dhbnRfbW1hcH0rJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkfSBpbgotICB0cnVlK3llcyApICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNFX01NQVAgMQotRU9GCi0gOzsKLWVzYWMKLQotcm0gLWYgZG9jL2NvbmZpZy5zdGF0dXMKLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMuMSIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEJGRF9IT1NUXzY0QklUX0xPTkdAJSRCRkRfSE9TVF82NEJJVF9MT05HJWcKLXMlQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCUkQkZEX0hPU1RfNjRfQklUX0RFRklORUQlZwotcyVAQkZEX0hPU1RfNjRfQklUQCUkQkZEX0hPU1RfNjRfQklUJWcKLXMlQEJGRF9IT1NUX1VfNjRfQklUQCUkQkZEX0hPU1RfVV82NF9CSVQlZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEVYRUVYVF9GT1JfQlVJTERAJSRFWEVFWFRfRk9SX0JVSUxEJWcKLXMlQENPUkVGSUxFQCUkQ09SRUZJTEUlZwotcyVAQ09SRUZMQUdAJSRDT1JFRkxBRyVnCi1zJUBXSU4zMkxERkxBR1NAJSRXSU4zMkxERkxBR1MlZwotcyVAV0lOMzJMSUJBRERAJSRXSU4zMkxJQkFERCVnCi1zJUBUREVGSU5FU0AlJFRERUZJTkVTJWcKLXMlQHdvcmRzaXplQCUkd29yZHNpemUlZwotcyVAYWxsX2JhY2tlbmRzQCUkYWxsX2JhY2tlbmRzJWcKLXMlQGJmZF9iYWNrZW5kc0AlJGJmZF9iYWNrZW5kcyVnCi1zJUBiZmRfbWFjaGluZXNAJSRiZmRfbWFjaGluZXMlZwotcyVAdGRlZmF1bHRzQCUkdGRlZmF1bHRzJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAkU0hFTEwgJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2JmZC9jb25maWd1cmUuY29tIGIvYmZkL2NvbmZpZ3VyZS5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTk3N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZS5jb20KKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotJCEKLSQhIFRoaXMgZmlsZSBjb25maWd1cmVzIHRoZSBiZmQgbGlicmFyeSBmb3IgdXNlIHdpdGggb3BlblZNUyAoQWxwaGEgYW5kIFZheCkKLSQhCi0kISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCi0kISB0byBleGVjdXRlIGl0LgotJCEKLSQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLSQhCi0kYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpICAgICAgISB2YXg9PTEsIGFscGhhPT0yCi0kYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIQotJGlmIGFyY2ggLmVxcy4gIkFscGhhIgotJHRoZW4KLSQgd3JpdGUgc3lzJG91dHB1dCAiQ29uZmlndXJpbmcgZm9yIEFscGhhIHRhcmdldCIKLSQgdGFyZ2V0ID0gImFscGhhIgotJCEKLSQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKLSQhCi0kIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KLSAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCi0kREVDSwotIQotISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCi0hCi0hCi0gICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRih2ZmlsZSksIEVORF9PRih2ZmlsZSkpOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7Ci0gICBFTFNFOwotICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKLSAgIEVORElGOwotCi0gICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7Ci0KLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQodmVycyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHdvcmRzaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCc2NCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCcwJyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKLSAgICAgIFNQTElUX0xJTkU7Ci0gICAgICBDT1BZX1RFWFQoJyNpbmNsdWRlIDxpbnRzLmg+Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnaW50NjQnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ3VpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwotICAgUVVJVAotJCAgRU9ECi0kCi0kZWxzZQotJAotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBmb3IgVmF4IHRhcmdldCIKLSQgdGFyZ2V0ID0gInZheCIKLSQhCi0kISBjb3B5IGJmZC1pbjIuaCB0byBiZmQuaCwgcmVwbGFjaW5nIEAgbWFjcm9zCi0kIQotJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCi0gICAgICAgIFtdYmZkLWluMi5oIC9vdXRwdXQ9W11iZmQuaAotJERFQ0sKLSEKLSEgIENvcHkgZmlsZSwgY2hhbmdpbmcgbGluZXMgd2l0aCBtYWNyb3MgKEBAKQotIQotIQotICAgdmZpbGUgOj0gQ1JFQVRFX0JVRkZFUigidmZpbGUiLCAiQ09ORklHVVJFLklOIik7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YodmZpbGUpLCBFTkRfT0YodmZpbGUpKTsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiZmQsICcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgdmVycyA6PSBDVVJSRU5UX0xJTkUtIikiOwotICAgRUxTRTsKLSAgICAgdmVycyA6PSAidW5rbm93biI7Ci0gICBFTkRJRjsKLQotICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOwotICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwotCi0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKHZlcnMpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0B3b3Jkc2l6ZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnMzInKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRCSVRfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnMCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnX19ERUNDJyk7Ci0gICAgICBTUExJVF9MSU5FOwotICAgICAgQ09QWV9URVhUKCcjaW5jbHVkZSA8aW50cy5oPicpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ2ludDY0Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX1VfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCd1aW50NjQnKTsKLSAgIEVORElGOwotICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKLSAgIFFVSVQKLSQgIEVPRAotJGVuZGlmCi0kCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgYmZkLmgnIGZyb20gYGJmZC1pbjIuaCcuIgotJCEKLSQhCi0kISBjcmVhdGUgdGFyZ21hdGNoLmgKLSQhCi0kIG9wZW4vd3JpdGUgdGZpbGUgW110YXJnbWF0Y2guaAotJCB3cml0ZSB0ZmlsZSAieyAiIiIgKyB0YXJnZXQgKyAiLSotKnZtcyoiIiIgKyAiLCIKLSQgd3JpdGUgdGZpbGUgIiNpZiBkZWZpbmVkIChTRUxFQ1RfVkVDUykiCi0kIHdyaXRlIHRmaWxlICJTRUxFQ1RfVkVDUyIKLSQgd3JpdGUgdGZpbGUgIiNlbHNlIgotJCB3cml0ZSB0ZmlsZSAiVU5TVVBQT1JURURfVEFSR0VUIgotJCB3cml0ZSB0ZmlsZSAiI2VuZGlmIgotJCB3cml0ZSB0ZmlsZSAifSwiCi0kIGNsb3NlIHRmaWxlCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgdGFyZ21hdGNoLmgnIgotJCEKLSQhCi0kISBjcmVhdGUgY29uZmlnLmgKLSQhCi0kIGNyZWF0ZSBbXWNvbmZpZy5oCi0vKiBjb25maWcuaC12bXMuICBHZW5lcmF0ZWQgYnkgaGFuZCBieSBLbGF1cyBL5G1wZiwga2thZW1wZkBkaWR5bXVzLnJtaS5kZS4gICovCi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLS8qIFdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KLS8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAqLwotLyogV2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KLS8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgKi8KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLS8qICNkZWZpbmUgSEFWRV9NTUFQIDEgKi8KLS8qIERvIHdlIG5lZWQgdG8gdXNlIHRoZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICAqLwotLyogI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4gKi8KLS8qIE5hbWUgb2YgaG9zdCBzcGVjaWZpYyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIHRyYWQtY29yZS5jLiAgKi8KLS8qICN1bmRlZiBUUkFEX0hFQURFUiAqLwotLyogRGVmaW5lIG9ubHkgaWYgPHN5cy9wcm9jZnMuaD4gaXMgYXZhaWxhYmxlICphbmQqIGl0IGRlZmluZXMgcHJzdGF0dXNfdC4gICovCi0vKiAjdW5kZWYgSEFWRV9TWVNfUFJPQ0ZTX0ggKi8KLS8qIERvIHdlIHJlYWxseSB3YW50IHRvIHVzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlPyAgKi8KLS8qICN1bmRlZiBVU0VfTU1BUCAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfRkNOVEwgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfR0VUUEFHRVNJWkUgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtYWR2aXNlIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9NQURWSVNFIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXByb3RlY3QgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX01QUk9URUNUIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGRlZi5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1REREVGX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1lTX0ZJTEVfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9USU1FX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi0kIQotJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGNvbmZpZy5oJyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5ob3N0IGIvYmZkL2NvbmZpZ3VyZS5ob3N0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjRjZDYwLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWd1cmUuaG9zdAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgb3ZlcnJpZGVzIHNvbWUgb2YgdGhlIHRvb2xzIGFuZAotIyBmbGFncyB1c2VkIG9uIGEgaG9zdCBzcGVjaWZpYyBiYXNpcy4KLQotIyBTaW5jZSB0aGUgImJmZC9ob3N0cyIgZGlyZWN0b3J5IGlzIHNoYXJlZCBieSB0aGUgYmZkLCBvcGNvZGVzLCBhbmQKLSMgYmludXRpbHMgZGlyZWN0b3JpZXMgKGF0IGxlYXN0KSwgdGhlIGluZGV4IHRvIGl0IGlzIGFsc28gc2hhcmVkLgotIyBUaGlzIGlzIHRoYXQgaW5kZXguICBFYWNoIGNvbmZpZ3VyZS5pbiBmaWxlIHNob3VsZCBzb3VyY2UgdGhpcyBmaWxlCi0jIGluIGl0cyBwZXItaG9zdCBwYXJ0LgotCi0jIFRoaXMgc2V0cyB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKLSMgIEhERUZJTkVTCQlob3N0IHNwZWNpZmljIGNvbXBpbGVyIG9wdGlvbnMKLSMgIGhvc3Q2NAkJc2V0IHRvIHRydWUgaWYgNjQgYml0IHR5cGVzIGFyZSBhcyBmYXN0IGFzIDMyIGJpdAotIyAgSE9TVF82NEJJVF9UWVBFCWhvc3QgNjQgYml0IHR5cGUKLSMgIEhPU1RfVV82NEJJVF9UWVBFCXVuc2lnbmVkIDY0IGJpdCB0eXBlIChub3QgbmVlZGVkIGlmIDY0QklUX1RZUEUgaXMgbG9uZykKLQotSERFRklORVM9Ci1ob3N0NjQ9ZmFsc2UKLUhPU1RfNjRCSVRfVFlQRT0KLUhPU1RfVV82NEJJVF9UWVBFPQotCi1jYXNlICIke2hvc3R9IiBpbgotCi1hbHBoYSotKi0qKQkJaG9zdDY0PXRydWU7IEhPU1RfNjRCSVRfVFlQRT1sb25nIDs7Ci0KLWhwcGEqLSotaHB1eCopCQlIREVGSU5FUz0tREhPU1RfSFBQQUhQVVggOzsKLWhwcGEqLSotaGl1eCopCQlIREVGSU5FUz0tREhPU1RfSFBQQUhQVVggOzsKLWhwcGEqLSotbXBlaXgqKQkJSERFRklORVM9LURIT1NUX0hQUEFNUEVJWCA7OwotaHBwYSotKi1ic2QqKQkJSERFRklORVM9LURIT1NUX0hQUEFCU0QgOzsKLWhwcGEqLSotb3NmKikJCUhERUZJTkVTPS1ESE9TVF9IUFBBT1NGIDs7Ci0KLWlbMzQ1Nl04Ni1zZXF1ZW50LWJzZCopCUhERUZJTkVTPS1Ec2hhcmVkPWdlbnNoYXJlZCA7OwotaVszNDU2XTg2LXNlcXVlbnQtc3lzdjQqKSA7OwotaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCUhERUZJTkVTPS1Ec2hhcmVkPWdlbnNoYXJlZCA7OwotCi1taXBzKi1kZWMtbmV0YnNkKikJOzsKLW1pcHMqLSotb3BlbmJzZCopCTs7Ci1taXBzKi1kZWMtKikJCUhERUZJTkVTPSItRyA0Igk7OwotbWlwcyotc2dpLWlyaXgzKikJSERFRklORVM9Ii1HIDQiIDs7Ci1taXBzKi1zZ2ktaXJpeDQqKQlIREVGSU5FUz0iLUcgNCIgOzsKLW1pcHMqLXNnaS1pcml4NiopCWhvc3Q2ND10cnVlCi0JCQlIT1NUXzY0QklUX1RZUEU9ImxvbmcgbG9uZyI7Ci0JCQlIT1NUX1VfNjRCSVRfVFlQRT0idW5zaWduZWQgbG9uZyBsb25nIjsKLQkJCTs7Ci1taXBzKi0qLXN5c3Y0KikJCTs7Ci1taXBzKi0qLXN5c3YqKQkJSERFRklORVM9Ii1HIDQiIDs7Ci1taXBzKi0qLXJpc2NvcyopCUhERUZJTkVTPSItRyA0IiA7OwotCi1tNjgqLWhwLWhwdXgqKQkJSERFRklORVM9LURIT1NUX0hQMzAwSFBVWCA7OwotCi0qLSotc29sYXJpcyopCQlIT1NUXzY0QklUX1RZUEU9ImxvbmcgbG9uZyIKLQkJCUhPU1RfVV82NEJJVF9UWVBFPSJ1bnNpZ25lZCBsb25nIGxvbmciCi0JCQk7OwotCi0qLSotd2luZG93cyopCi0JCQlIT1NUXzY0QklUX1RZUEU9X19pbnQ2NAotCQkJSE9TVF9VXzY0QklUX1RZUEU9InVuc2lnbmVkIF9faW50NjQiCi0jIFRoZSBmb2xsb3dpbmcga3JvY2sgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgY2FuJ3QgcnVuIHRoZSBidWlsZCBjb21waWxlcgotIyAoTVNWQykgb24gdGhlIGNvbmZpZ3VyZSBob3N0LCBzbyB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSB2YWx1ZXMgaGVyZS4KLSMgTm90ZSB0aGF0IHRoaXMgZmlsZSBpcyBuZXZlciBydW4gdGhyb3VnaCBhdXRvY29uZiwgc28gd2UgY2FuJ3QgdXNlIGFueQotIyBhdXRvY29uZiBtYWNyb3MgaGVyZS4gIEJlY2F1c2Ugb2YgdGhpcywgd2UgaGF2ZSB0byBtdWNrIHdpdGggYXV0b2NvbmYKLSMgdmFyaWFibGVzIGV4cGxpY2l0bHkuCi0JCQlhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi0JCQlhY19jdl9oZWFkZXJfdGltZT1ubwotCQkJYWNfY3ZfZnVuY19nZXRwYWdlc2l6ZT1ubwotCQkJYWNfY3ZfZnVuY19tYWR2aXNlPW5vCi0JCQlhY19jdl9mdW5jX21wcm90ZWN0PW5vCi0JCQlhY19jdl9mdW5jX2dldHVpZD1ubwotCQkJYWNfY3ZfZnVuY19nZXRnaWQ9bm8KLQkJCWFjX2N2X2hlYWRlcl9zeXNfZmlsZV9oPW5vCi0JCQlhY19jdl9oZWFkZXJfc3lzX3RpbWVfaD1ubwotCQkJYWNfY3ZfaGVhZGVyX3VuaXN0ZF9oPW5vCi0JCQk7OwotZXNhYwpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5pbiBiL2JmZC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMmI2MTMuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY2NSArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLWRubAotCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQobGliYmZkLmMpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLUFDX0lTQ19QT1NJWAotCi1BTV9JTklUX0FVVE9NQUtFKGJmZCwgMi45LjUpCi0KLWRubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50Ci1kbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgotQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotCi1kbmwgRGVmYXVsdCB0byBhIG5vbiBzaGFyZWQgbGlicmFyeS4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlCi1kbmwgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1zaGFyZWQuCi1BTV9ESVNBQkxFX1NIQVJFRAotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSg2NC1iaXQtYmZkLAotWyAgLS1lbmFibGUtNjQtYml0LWJmZCAgICAgNjQtYml0IHN1cHBvcnQgKG9uIGhvc3RzIHdpdGggbmFycm93ZXIgd29yZCBzaXplcyldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSAgd2FudDY0PXRydWUgIDs7Ci0gIG5vKSAgIHdhbnQ2ND1mYWxzZSA7OwotICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24pIDs7Ci1lc2FjXSxbd2FudDY0PWZhbHNlXSlkbmwKLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9uc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoY29tbW9uYmZkbGliLAotWyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotQUNfQVJHX1dJVEgobW1hcCwKLVsgIC0td2l0aC1tbWFwICAgICAgICAgICAgIHRyeSB1c2luZyBtbWFwIGZvciBCRkQgaW5wdXQgZmlsZXMgaWYgYXZhaWxhYmxlXSwKLVtjYXNlICIke3dpdGh2YWx9IiBpbgotICB5ZXMpICB3YW50X21tYXA9dHJ1ZSA7OwotICBubykgICB3YW50X21tYXA9ZmFsc2UgOzsKLSAgKikgICAgQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciBCRkQgd2l0aC1tbWFwIG9wdGlvbikgOzsKLWVzYWNdLFt3YW50X21tYXA9ZmFsc2VdKWRubAotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi1BQ19BUkdfUFJPR1JBTQotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi1ob3N0NjQ9ZmFsc2UKLXRhcmdldDY0PWZhbHNlCi0KLSMgaG9zdCBzdHVmZjoKLQotQUNfUFJPR19DQwotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLSMgUGVybWl0IGhvc3Qgc3BlY2lmaWMgc2V0dGluZ3MuCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi1BQ19TVUJTVChIREVGSU5FUykKLUFDX1BST0dfSU5TVEFMTAotCi1CRkRfSE9TVF82NEJJVF9MT05HPTAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEPTAKLUJGRF9IT1NUXzY0X0JJVD0KLUJGRF9IT1NUX1VfNjRfQklUPQotaWYgdGVzdCAieCR7SE9TVF82NEJJVF9UWVBFfSIgPSAieGxvbmciOyB0aGVuCi0gIEJGRF9IT1NUXzY0QklUX0xPTkc9MQotZWxpZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiAhPSAieCI7IHRoZW4KLSAgQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MQotICBCRkRfSE9TVF82NF9CSVQ9JHtIT1NUXzY0QklUX1RZUEV9Ci0gIEJGRF9IT1NUX1VfNjRfQklUPSR7SE9TVF9VXzY0QklUX1RZUEV9Ci1maQotQUNfU1VCU1QoQkZEX0hPU1RfNjRCSVRfTE9ORykKLUFDX1NVQlNUKEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEKQotQUNfU1VCU1QoQkZEX0hPU1RfNjRfQklUKQotQUNfU1VCU1QoQkZEX0hPU1RfVV82NF9CSVQpCi0KLUJGRF9DQ19GT1JfQlVJTEQKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdGRkZWYuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdGltZS5oIHVuaXN0ZC5oKQotQUNfQ0hFQ0tfSEVBREVSUyhmY250bC5oIHN5cy9maWxlLmggc3lzL3RpbWUuaCkKLUFDX0hFQURFUl9USU1FCi1BQ19IRUFERVJfRElSRU5UCi1BQ19DSEVDS19GVU5DUyhmY250bCBnZXRwYWdlc2l6ZSBzZXRpdGltZXIgc3lzY29uZiBmZG9wZW4gZ2V0dWlkIGdldGdpZCkKLQotQkZEX0JJTkFSWV9GT1BFTgotCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihtYWxsb2MpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihyZWFsbG9jKQotQkZEX05FRURfREVDTEFSQVRJT04oZnJlZSkKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKLQotIyBJZiB3ZSBhcmUgY29uZmlndXJlZCBuYXRpdmUsIHBpY2sgYSBjb3JlIGZpbGUgc3VwcG9ydCBmaWxlLgotQ09SRUZJTEU9Ci1DT1JFRkxBRz0KLVRSQURfSEVBREVSPQotaWYgdGVzdCAiJHt0YXJnZXR9IiA9ICIke2hvc3R9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotICBhbHBoYSotKi1saW51eC1nbnUqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvYWxwaGFsaW51eC5oIicKLQk7OwotICBhbHBoYSotKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBhbHBoYSotKi0qKQkJQ09SRUZJTEU9b3NmLWNvcmUubG8gOzsKLSAgYXJtLSotcmlzY2l4KQkJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLWhpdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgaHBwYSotKi1tcGVpeCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLWJzZCopCQlDT1JFRklMRT0iaHB1eC1jb3JlLmxvIGhwcGFic2QtY29yZS5sbyIKLQkJCUNPUkVGTEFHPSItREhQVVhfQ09SRSAtREhQUEFCU0RfQ09SRSIgOzsKLSAgaTM3MC0qLSopCQkKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzNzBsaW51eC5oIicKLQk7OwotCi1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtc2VxdWVudC1ic2QqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvc3ltbWV0cnkuaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotYnNkKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NmJzZC5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotbmV0YnNkKiB8IGlbMzQ1Nl04Ni0qLW9wZW5ic2QqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni1lc2l4LXN5c3YzKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2VzaXguaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT1zY281LWNvcmUubG8KLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotc2NvKiB8IGlbMzQ1Nl04Ni0qLWlzYyopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2c2NvLmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1tYWNoMyopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bWFjaDMuaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bGludXguaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLWlzYyopCUNPUkVGSUxFPXRyYWQtY29yZS5sbyA7OwotICBpWzM0NTZdODYtKi1haXgqKQlDT1JFRklMRT1haXgzODYtY29yZS5sbyA7OwotY2hhbmdlcXVvdGUoWyxdKWRubAotICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTg2MG1hY2gzLmgiJwotCTs7Ci0gIG1pcHMtZGVjLWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzYnNkLmgiJwotCTs7Ci0gIG1pcHMtZGVjLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotbmV0YnNkKiB8IG1pcHMqLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICBtaXBzLWRlYy0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZGVjc3RhdGlvbi5oIicKLQk7OwotICBtaXBzLXNnaS1pcml4NCopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLXNnaS1pcml4NSopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLXNnaS1pcml4NiopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJwotCTs7Ci0gIG1pcHMtKi1zeXN2NCopCTs7Ci0gIG1pcHMtKi1zeXN2KiB8IG1pcHMtKi1yaXNjb3MqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvcmlzY29zLmgiJwotCTs7Ci0gIG1pcHMtc29ueS1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy1taXBzLmgiJwotCTs7Ci0gIG02OCotYnVsbCotc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kcHgyLmgiJwotCTs7Ci0gIG02OCotaHAtaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBtNjgqLWhwLWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9ocDMwMGJzZC5oIicKLQk7OwotICBtNjgqLSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL202OGtsaW51eC5oIicKLQk7OwotICBtNjgqLW1vdG9yb2xhLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZGVsdGE2OC5oIicKLQk7OwotICBtNjgqLXNvbnktKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MuaCInCi0JOzsKLSAgbTY4Ki0qLW5ldGJzZCogfCBtNjgqLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICBtNjgqLWFwcGxlLWF1eCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrYXV4LmgiJwotCTs7Ci0gIG04OCotKi1zeXN2NCopCTs7Ci0gIG04OCotbW90b3JvbGEtc3lzdiopCUNPUkVGSUxFPXB0cmFjZS1jb3JlLmxvIDs7Ci0gIG04OCotKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tODhrbWFjaDMuaCInCi0JOzsKLSAgbnMzMmstcGM1MzItbWFjaCkKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3BjNTMybWFjaC5oIicKLQk7OwotICBuczMyay0qLW5ldGJzZCogfCBuczMyay0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgcnM2MDAwLSotbHlueCopCUNPUkVGSUxFPWx5bngtY29yZS5sbyA7OwotICByczYwMDAtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcnM2MDAwLSotKikJCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi0qYnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYWl4KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWJlb3MqKQk7OwotICBwb3dlcnBjLSotbmV0YnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgc3BhcmMtKi1uZXRic2QqIHwgc3BhcmMtKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHRhaG9lLSotKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3RhaG9lLmgiJwotCTs7Ci0gIHZheC0qLXVsdHJpeDIqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKLQk7OwotICB2YXgtKi11bHRyaXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKLQk7OwotICB2YXgtKi0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4YnNkLmgiJwotCTs7Ci0gIGVzYWMKLQotICBjYXNlICIkQ09SRUZJTEUiIGluCi0gIGFpeDM4Ni1jb3JlLmxvKQlDT1JFRkxBRz0tREFJWDM4Nl9DT1JFIDs7Ci0gIGhwcGFic2QtY29yZS5sbykJQ09SRUZMQUc9LURIUFBBQlNEX0NPUkUgOzsKLSAgaHB1eC1jb3JlLmxvKQkJQ09SRUZMQUc9LURIUFVYX0NPUkUgOzsKLSAgaXJpeC1jb3JlLmxvKQkJQ09SRUZMQUc9LURJUklYX0NPUkUgOzsKLSAgbHlueC1jb3JlLmxvKQkJQ09SRUZMQUc9LURMWU5YX0NPUkUgOzsKLSAgbmV0YnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ETkVUQlNEX0NPUkUgOzsKLSAgb3NmLWNvcmUubG8pCQlDT1JFRkxBRz0tRE9TRl9DT1JFIDs7Ci0gIHB0cmFjZS1jb3JlLmxvKQlDT1JFRkxBRz0tRFBUUkFDRV9DT1JFIDs7Ci0gIHJzNjAwMC1jb3JlLmxvKQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EQUlYX0NPUkUiIDs7Ci0gIHNjbzUtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURTQ081X0NPUkUiIDs7Ci0gIHRyYWQtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURUUkFEX0NPUkUiIDs7Ci0gIGVzYWMKLQotICAjIEVMRiBjb3JlZmlsZSBzdXBwb3J0IGhhcyBzZXZlcmFsIGZsYXZvcnMsIGJ1dCBhbGwgb2YKLSAgIyB0aGVtIHVzZSBzb21ldGhpbmcgY2FsbGVkIDxzeXMvcHJvY2ZzLmg+Ci0gIEFDX0NIRUNLX0hFQURFUlMoc3lzL3Byb2Nmcy5oKQotICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUocHJzdGF0dXNfdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKHByc3RhdHVzX3QsIHByX3dobykKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUocHN0YXR1c190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwcnBzaW5mb190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwc2luZm9fdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUobHdwc3RhdHVzX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUihsd3BzdGF0dXNfdCwgcHJfY29udGV4dCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKGx3cHN0YXR1c190LCBwcl9yZWcpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHdpbjMyX3BzdGF0dXNfdCkKLSAgZmkKLWZpCi1BQ19TVUJTVChDT1JFRklMRSkKLUFDX1NVQlNUKENPUkVGTEFHKQotQUNfREVGSU5FX1VOUVVPVEVEKFRSQURfSEVBREVSLCAkVFJBRF9IRUFERVIsCi0gIFtOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy5dKQotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiAtbGtlcm5lbDMyIgotICBmaQotICA7OwotZXNhYwotQUNfU1VCU1QoV0lOMzJMREZMQUdTKQotQUNfU1VCU1QoV0lOMzJMSUJBREQpCi0KLSMgdGFyZ2V0IHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1kZWZ2ZWM9Ci1zZWx2ZWNzPQotc2VsYXJjaHM9Ci1UREVGSU5FUz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0gICAgZWxzZQotCS4gJHNyY2Rpci9jb25maWcuYmZkCi0JaWYgdGVzdCAieCR0YXJnIiA9ICJ4JHRhcmdldCI7IHRoZW4KLQkgICAgZGVmdmVjPSR0YXJnX2RlZnZlYwotCWZpCi0Jc2VsdmVjcz0iJHNlbHZlY3MgJHRhcmdfZGVmdmVjICR0YXJnX3NlbHZlY3MiCi0Jc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKLQlUREVGSU5FUz0iJFRERUZJTkVTICR0YXJnX2NmbGFncyIKLSAgICBmaQotZG9uZQotQUNfU1VCU1QoVERFRklORVMpCi0KLSMgVGhpcyBwcm9jZXNzaW5nIHN0aWxsIG5lZWRzIHRvIGJlIGRvbmUgaWYgd2UncmUgdG8gZGVjaWRlIHByb3Blcmx5IHdoZXRoZXIKLSMgNjQtYml0IHN1cHBvcnQgbmVlZHMgdG8gYmUgY29tcGlsZWQgaW4uICBDdXJyZW50bHksIGl0IHdpbGwgYmUgaW5jbHVkZWQgaWYKLSMgdGhlIGRlZmF1bHQgb3IgYW55IG90aGVyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHRhcmdldCByZXF1aXJlcyBpdDsgaXQKLSMgd2lsbCBub3QgYmUgaW5jbHVkZWQgb24gYSAzMi1iaXQgaG9zdCBpZiBubyA2NC1iaXQgdGFyZ2V0IGlzIHJlcXVlc3RlZCwgYW5kCi0jIG5vICItLXdpdGgtNjQtYml0LWJmZCIgb3B0aW9uIGlzIGdpdmVuLCBldmVuIGlmICItLWVuYWJsZS10YXJnZXRzPWFsbCIgaXMKLSMgdXNlZC4KLQotIyB1bmlxIHRoZSBkZWZhdWx0IGFuZCBzZWxlY3RlZCB2ZWN0b3JzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgotZj0iIgotZm9yIGkgaW4gJHNlbHZlY3MgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotc2VsdmVjcz0iJGYiCi0KLQotIyB1bmlxIHRoZSBhcmNoaXRlY3R1cmVzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgotZj0iIgotZm9yIGkgaW4gJHNlbGFyY2hzIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXNlbGFyY2hzPSIkZiIKLQotIyBUYXJnZXQgYmFja2VuZCAubyBmaWxlcy4KLXRiPQotCi1lbGY9ImVsZi5sbyBlbGZsaW5rLmxvIGR3YXJmMi5sbyBkd2FyZjEubG8iCi0KLWZvciB2ZWMgaW4gJHNlbHZlY3MKLWRvCi0gICAgY2FzZSAiJHZlYyIgaW4KLSAgICAjIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGNvbXBhcmUKLSAgICAjIHdpdGggdGhlIHR3byB2ZWN0b3IgbGlzdHMgaW4gdGFyZ2V0cy5jLgotICAgIGEyOWtjb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYTI5ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBhX291dF9hZG9iZV92ZWMpCQl0Yj0iJHRiIGFvdXQtYWRvYmUubG8gYW91dDMyLmxvIiA7OwotICAgIGFybWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybW5ldGJzZF92ZWMpCQl0Yj0iJHRiIGFybW5ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXJtcGVfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVpX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZV9iaWdfdmVjKQl0Yj0iJHRiIGVwb2MtcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2JpZ192ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYW91dDBfYmlnX3ZlYykJCXRiPSIkdGIgYW91dDAubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfYXJtX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQtYXJtLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9saXR0bGVfdmVjKQl0Yj0iJHRiIGFvdXQtYXJtLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X21pcHNfYmlnX3ZlYykJCXRiPSIkdGIgbWlwc2JzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2xpdHRsZV92ZWMpCXRiPSIkdGIgbWlwc2JzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXBvbGxvY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXBvbGxvLmxvIiA7OwotICAgIGJfb3V0X3ZlY19iaWdfaG9zdCkJCXRiPSIkdGIgYm91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYl9vdXRfdmVjX2xpdHRsZV9ob3N0KQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJmZF9lbGY2NF9hbHBoYV92ZWMpCXRiPSIkdGIgZWxmNjQtYWxwaGEubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2F2cl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWF2ci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYykgdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYykJdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2QxMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMTB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2QzMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMzB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2ZyMzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1mcjMwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2hwcGFfdmVjKQkJdGI9IiR0YiBlbGYzMi1ocHBhLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzNzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzcwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzODZfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzg2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k4NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pODYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k5NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pOTYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9tMzJyX3ZlYykJCXRiPSIkdGIgZWxmMzItbTMyci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tNjhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTY4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tODhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTg4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDIwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDIwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMzAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMzAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3BqX3ZlYykgICAgICAgICAgIHRiPSIkdGIgZWxmMzItcGoubG8gZWxmMzIubG8gJGVsZiI7OwotICAgIGJmZF9lbGYzMl9wamxfdmVjKSAgICAgICAgICB0Yj0iJHRiIGVsZjMyLXBqLmxvIGVsZjMyLmxvICRlbGYiOzsKLSAgICBiZmRfZWxmMzJfcG93ZXJwY192ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3NoX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zaGxfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NwYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1zcGFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl92ODUwX3ZlYykJCXRiPSIkdGIgZWxmMzItdjg1MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjKSB0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjY0LXNwYXJjLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGNpc2NvX2NvcmVfYmlnX3ZlYykJCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBjaXNjb19jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBkZW1vXzY0X3ZlYykJCXRiPSIkdGIgZGVtbzY0LmxvIGFvdXQ2NC5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2JpZ2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZmFscGhhX2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1hbHBoYS5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGdvMzJjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1nbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGdvMzJzdHViYmVkY29mZl92ZWMpCXRiPSIkdGIgY29mZi1zdGdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaDgzMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODMwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGg4NTAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDg1MDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBob3N0X2FvdXRfdmVjKQkJdGI9IiR0YiBob3N0LWFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwYnNkX3ZlYykJCXRiPSIkdGIgaHAzMDBic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwaHB1eF92ZWMpCQl0Yj0iJHRiIGhwMzAwaHB1eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmFvdXRfdmVjKQkJdGI9IiR0YiBpMzg2YW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmJzZF92ZWMpCQl0Yj0iJHRiIGkzODZic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZkeW5peF92ZWMpCQl0Yj0iJHRiIGkzODZkeW5peC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmZyZWVic2RfdmVjKQkJdGI9IiR0YiBpMzg2ZnJlZWJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm1zZG9zX3ZlYykJCXRiPSIkdGIgaTM4Nm1zZG9zLmxvIiA7OwotICAgIGkzODZwZV92ZWMpCQkJdGI9IiR0YiBwZS1pMzg2LmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpMzg2cGVpX3ZlYykJCXRiPSIkdGIgcGVpLWkzODYubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZsaW51eF92ZWMpCQl0Yj0iJHRiIGkzODZsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIGkzODZseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLWkzODZseW54LmxvIGNvZmZsaW5rLmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBpMzg2bWFjaDNfdmVjKQkJdGI9IiR0YiBpMzg2bWFjaDMubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZuZXRic2RfdmVjKQkJdGI9IiR0YiBpMzg2bmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2b3M5a192ZWMpCQl0Yj0iJHRiIGkzODZvczlrLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpODYwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaTg2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1pOTYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGllZWVfdmVjKQkJCXRiPSIkdGIgaWVlZS5sbyIgOzsKLSAgICBtNjhrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrY29mZnVuX3ZlYykJCXRiPSIkdGIgY29mZi11NjhrLmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrbGludXhfdmVjKQkJdGI9IiR0YiBtNjhrbGludXgubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBtNjhrbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1tNjhrbHlueC5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIG02OGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrNGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrNGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGthdXhfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXV4LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrc3lzdmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXN2bTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtODhrYmNzX3ZlYykJCXRiPSIkdGIgY29mZi1tODhrLmxvIiA7OwotICAgIG1pcHNscGVfdmVjKQkJdGI9IiR0YiBwZS1taXBzLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1pcHNscGVpX3ZlYykJCXRiPSIkdGIgcGVpLW1pcHMubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgcGUtbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9iaWdfdmVjKQkJdGI9IiR0YiBwZWktbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbmV3c29zM192ZWMpCQl0Yj0iJHRiIG5ld3NvczMubG8gYW91dDMyLmxvIiA7OwotICAgIG5sbTMyX2kzODZfdmVjKQkJdGI9IiR0YiBubG0zMi1pMzg2LmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBubG0zMl9zcGFyY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXNwYXJjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBubG0zMl9hbHBoYV92ZWMpCQl0Yj0iJHRiIG5sbTMyLWFscGhhLmxvIG5sbTMyLmxvIG5sbS5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgcmlzY2l4X3ZlYykJCQl0Yj0iJHRiIGFvdXQzMi5sbyByaXNjaXgubG8iIDs7Ci0gICAgbmxtMzJfcG93ZXJwY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXBwYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgcGM1MzJuZXRic2RfdmVjKQkJdGI9IiR0YiBuczMya25ldGJzZC5sbyBhb3V0LW5zMzJrLmxvIiA7OwotICAgIHBjNTMybWFjaGFvdXRfdmVjKQkJdGI9IiR0YiBwYzUzMi1tYWNoLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcG1hY194Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcG1hYy5sbyB4Y29mZmxpbmsubG8iIDs7Ci0gICAgcnM2MDAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcnM2MDAwLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfcG93ZXJwY19wZV92ZWMpICAgICAgICAgdGI9IiR0YiBwZS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OyAgCi0gICAgYmZkX3Bvd2VycGNsZV9wZV92ZWMpICAgICAgIHRiPSIkdGIgcGUtcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMpICAgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYykgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHBwY2Jvb3RfdmVjKQkJdGI9IiR0YiBwcGNib290LmxvIiA7OwotICAgIHNoY29mZl92ZWMpCQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNoY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hsY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hscGVfdmVjKQkJCXRiPSIkdGIgcGUtc2gubG8gY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxwZWlfdmVjKQkJCXRiPSIkdGIgcGVpLXNoLmxvIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc29tX3ZlYykJCQl0Yj0iJHRiIHNvbS5sbyIgOzsKLSAgICBzcGFyY2xlX2FvdXRfdmVjKQkJdGI9IiR0YiBhb3V0LXNwYXJjbGUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbGludXhfdmVjKQkJdGI9IiR0YiBzcGFyY2xpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIHNwYXJjbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2Ytc3BhcmNseW54LmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBzcGFyY25ldGJzZF92ZWMpCQl0Yj0iJHRiIHNwYXJjbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNwYXJjLmxvIiA7OwotICAgIHNyZWNfdmVjKQkJCXRiPSIkdGIgc3JlYy5sbyIgOzsKLSAgICBzdW5vc19iaWdfdmVjKQkJdGI9IiR0YiBzdW5vcy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3ltYm9sc3JlY192ZWMpCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgdGVraGV4X3ZlYykJCQl0Yj0iJHRiIHRla2hleC5sbyIgOzsKLSAgICB0aWMzMF9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC10aWMzMC5sbyIgOzsKLSAgICB0aWMzMF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWMzMC5sbyIgOzsKLSAgICB0aWM4MGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzgwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHZlcnNhZG9zX3ZlYykJCXRiPSIkdGIgdmVyc2Fkb3MubG8iIDs7Ci0gICAgdm1zX2FscGhhX3ZlYykJCXRiPSIkdGIgdm1zLmxvIHZtcy1oZHIubG8gdm1zLWdzZC5sbyB2bXMtdGlyLmxvIHZtcy1taXNjLmxvIgotIAkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgdm1zX3ZheF92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIgOzsKLSAgICB3NjVfdmVjKQkJCXRiPSIkdGIgY29mZi13NjUubG8gcmVsb2MxNi5sbyIgOzsKLSAgICB3ZTMya2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXdlMzJrLmxvIiA7OwotICAgIHo4a2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXo4ay5sbyByZWxvYzE2LmxvIiA7OwotCi0gICAgIiIpCQkJOzsKLSAgICAqKSBBQ19NU0dfRVJST1IoKioqIHVua25vd24gdGFyZ2V0IHZlY3RvciAkdmVjKSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotIyBBIGNvdXBsZSBvZiBDUFVzIHVzZSBzaG9ydGVyIGZpbGUgbmFtZXMgdG8gYXZvaWQgcHJvYmxlbXMgb24gRE9TCi0jIGZpbGVzeXN0ZW1zLgotdGE9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lIHMvYmZkXy9jcHUtL2cgLWUgcy9fYXJjaC8ubG8vZyAtZSBzL21uMTAyMDAvbTEwMjAwLyAtZSBzL21uMTAzMDAvbTEwMzAwL2AKLQotIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi1mPSIiCi1mb3IgaSBpbiAkdGIgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGI9IiRmIgotCi1mPSIiCi1mb3IgaSBpbiAkdGEgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGE9IiRmIgotCi1iZmRfYmFja2VuZHM9IiR0YiIKLWJmZF9tYWNoaW5lcz0iJHRhIgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlIDsgdGhlbgotICBiZmRfYmFja2VuZHM9IiR7YmZkX2JhY2tlbmRzfSInICQoQUxMX0JBQ0tFTkRTKScKLSAgYmZkX21hY2hpbmVzPSIke2JmZF9tYWNoaW5lc30iJyAkKEFMTF9NQUNISU5FUyknCi0gIHNlbHZlY3M9Ci0gIGhhdmV2ZWNzPQotICBzZWxhcmNocz0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICMgT25seSBzZXQgdGhlc2UgaWYgdGhleSB3aWxsIGJlIG5vbmVtcHR5LCBmb3IgdGhlIGNsZXZlciBlY2hvLgotICBoYXZldmVjcz0KLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgaGF2ZXZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi8tREhBVkVfLycgLWUgJ3MvIFwoLlwpLyAtREhBVkVfXDEvZydgCi0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIHNlbHZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbGFyY2hzIiAmJgotICAgIHNlbGFyY2hzPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotZmkJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0KLWNhc2UgJHtob3N0NjR9LSR7dGFyZ2V0NjR9LSR7d2FudDY0fSBpbgotICAqdHJ1ZSopCi0gICAgd29yZHNpemU9NjQKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZENjRfQkFDS0VORFMpICQoQkZEMzJfQkFDS0VORFMpJwotICAgIGlmIHRlc3QgLXogIiRHQ0MiICYmIHRlc3QgIiRCRkRfSE9TVF82NEJJVF9MT05HIiA9ICIwIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRfQklUX0RFRklORUQiID0gIjAiOyB0aGVuCi0gICAgICBBQ19NU0dfV0FSTihbWW91IGhhdmUgcmVxdWVzdGVkIGEgNjQgYml0IEJGRCBjb25maWd1cmF0aW9uLCBidXRdKQotICAgICAgQUNfTVNHX1dBUk4oW3lvdXIgY29tcGlsZXIgbWF5IG5vdCBoYXZlIGEgNjQgYml0IGludGVncmFsIHR5cGVdKQotICAgIGZpCi0gICAgOzsKLSAgZmFsc2UtZmFsc2UtZmFsc2UpCi0gICAgd29yZHNpemU9MzIKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZEMzJfQkFDS0VORFMpJwotICAgIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKHdvcmRzaXplKQotQUNfU1VCU1QoYWxsX2JhY2tlbmRzKQotQUNfU1VCU1QoYmZkX2JhY2tlbmRzKQotQUNfU1VCU1QoYmZkX21hY2hpbmVzKQotCi10ZGVmYXVsdHM9IiIKLXRlc3QgLW4gIiR7ZGVmdmVjfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURERUZBVUxUX1ZFQ1RPUj0ke2RlZnZlY30iCi10ZXN0IC1uICIke3NlbHZlY3N9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9WRUNTPScke3NlbHZlY3N9JyIKLXRlc3QgLW4gIiR7c2VsYXJjaHN9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9BUkNISVRFQ1RVUkVTPScke3NlbGFyY2hzfSciCi10ZXN0IC1uICIke2hhdmV2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gJHtoYXZldmVjc30iCi1BQ19TVUJTVCh0ZGVmYXVsdHMpCi0KLWRubCBBQ19DSEVDS19IRUFERVJTKHN5cy9tbWFuLmgpCi1BQ19GVU5DX01NQVAKLUFDX0NIRUNLX0ZVTkNTKG1hZHZpc2UgbXByb3RlY3QpCi1jYXNlICR7d2FudF9tbWFwfSske2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWR9IGluCi0gIHRydWUreWVzICkgIEFDX0RFRklORShVU0VfTU1BUCwgMSwgW1VzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlP10pIDs7Ci1lc2FjCi0KLXJtIC1mIGRvYy9jb25maWcuc3RhdHVzCi1BQ19PVVRQVVQoTWFrZWZpbGUgZG9jL01ha2VmaWxlIGJmZC1pbjMuaDpiZmQtaW4yLmggcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGVdKQpkaWZmIC0tZ2l0IGEvYmZkL2NvcmVmaWxlLmMgYi9iZmQvY29yZWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyZjUxOS4uMDAwMDAwMAotLS0gYS9iZmQvY29yZWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBDb3JlIGZpbGUgZ2VuZXJpYyBpbnRlcmZhY2Ugcm91dGluZXMgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JQ29yZSBmaWxlcwotCi1ERVNDUklQVElPTgotCVRoZXNlIGFyZSBmdW5jdGlvbnMgcGVydGFpbmluZyB0byBjb3JlIGZpbGVzLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSByZWFkLW9ubHkgc3RyaW5nIGV4cGxhaW5pbmcgd2hpY2ggcHJvZ3JhbSB3YXMgcnVubmluZwotCXdoZW4gaXQgZmFpbGVkIGFuZCBwcm9kdWNlZCB0aGUgY29yZSBmaWxlIEB2YXJ7YWJmZH0uCi0KLSovCi0KLUNPTlNUIGNoYXIgKgotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwgKGFiZmQpKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi1TWU5PUFNJUwotCWludCBiZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBjYXVzZWQgdGhlIGNvcmUgZHVtcCB3aGljaAotCWdlbmVyYXRlZCB0aGUgZmlsZSB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMgYXR0YWNoZWQgdG8uCi0qLwotCi1pbnQKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLCAoYWJmZCkpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi1TWU5PUFNJUwotCWJvb2xlYW4gY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0JCShiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gPDx0cnVlPj4gaWYgdGhlIGNvcmUgZmlsZSBhdHRhY2hlZCB0byBAdmFye2NvcmVfYmZkfQotCXdhcyBnZW5lcmF0ZWQgYnkgYSBydW4gb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhdHRhY2hlZCB0bwotCUB2YXJ7ZXhlY19iZmR9LCA8PGZhbHNlPj4gb3RoZXJ3aXNlLgotKi8KLWJvb2xlYW4KLWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gICAgaWYgKChjb3JlX2JmZC0+Zm9ybWF0ICE9IGJmZF9jb3JlKSB8fCAoZXhlY19iZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSkgewotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIHJldHVybiBCRkRfU0VORCAoY29yZV9iZmQsIF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AsCi0JCSAgICAgKGNvcmVfYmZkLCBleGVjX2JmZCkpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hMjlrLmMgYi9iZmQvY3B1LWEyOWsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMjVhNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQU1EIDI5MDAwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hMjlrX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9hMjlrLAotICAgIDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgImEyOWsiLAotICAgICJhMjlrIiwKLSAgICA0LAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hbHBoYS5jIGIvYmZkL2NwdS1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODk5MDBiLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQWxwaGEgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE4oQklUU19XT1JELCBCSVRTX0FERFIsIE5VTUJFUiwgUFJJTlQsIERFRkFVTFQsIE5FWFQpIFwKLSAgewkJCQkJCQlcCi0gICAgQklUU19XT1JELCAvKiBiaXRzIGluIGEgd29yZCAqLwkJCVwKLSAgICBCSVRTX0FERFIsIC8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkJCVwKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkJCVwKLSAgICBiZmRfYXJjaF9hbHBoYSwJCQkJCVwKLSAgICBOVU1CRVIsCQkJCQkJXAotICAgICJhbHBoYSIsCQkJCQkJXAotICAgIFBSSU5ULAkJCQkJCVwKLSAgICAzLAkJCQkJCQlcCi0gICAgREVGQVVMVCwJCQkJCQlcCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAkJCQkJXAotICAgIE5FWFQsCQkJCQkJXAotICB9Ci0KLSNkZWZpbmUgTk4oaW5kZXgpICgmYXJjaF9pbmZvX3N0cnVjdFtpbmRleF0pCi0KLS8qIFRoZXNlIGV4aXN0IG9ubHkgc28gdGhhdCB3ZSBjYW4gcmVzb25hYmx5IGRpc2Fzc2VtYmxlIFBBTGNvZGUuICAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9hbHBoYV9ldjQsICJhbHBoYTpldjQiLCBmYWxzZSwgTk4oMSkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX2FscGhhX2V2NSwgImFscGhhOmV2NSIsIGZhbHNlLCBOTigyKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfYWxwaGFfZXY2LCAiYWxwaGE6ZXY2IiwgZmFsc2UsIDApLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hbHBoYV9hcmNoID0KLSAgTiAoNjQsIDY0LCAwLCAiYWxwaGEiLCB0cnVlLCBOTigwKSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LWFyYy5jIGIvYmZkL2NwdS1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlNTlkNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBUkMgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgQVJDKG1hY2gsIHByaW50X25hbWUsIGRlZmF1bHRfcCwgbmV4dCkgXAotewkJCQkJXAotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwkJXAotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JXAotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCVwKLSAgICBiZmRfYXJjaF9hcmMsCQkJXAotICAgIG1hY2gsCQkJCVwKLSAgICAiYXJjIiwJCQkJXAotICAgIHByaW50X25hbWUsCQkJCVwKLSAgICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwlcCi0gICAgZGVmYXVsdF9wLAkJCQlcCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQlcCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwJCQlcCi0gICAgbmV4dCwJCQkJXAotICB9Ci0KLSNpZiAwIC8qID8/PyBOb3QgY3VycmVudGx5IG5lZWRlZCwgYnV0IGtlZXAgaW4gZm9yIGZ1dHVyZSByZWZlcmVuY2UuICAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQotewotICBBUkMgKGJmZF9tYWNoX2FyY19mb28sICJhcmMtZm9vIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgQVJDIChiZmRfbWFjaF9hcmNfYmFyLCAiYXJjLWJhciIsIGZhbHNlLCAwKSwKLX07Ci0jZW5kaWYKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hcmNfYXJjaCA9Ci0gIEFSQyAoYmZkX21hY2hfYXJjX2Jhc2UsICJhcmMtYmFzZSIsIHRydWUsIDAgLyomYXJjaF9pbmZvX3N0cnVjdFswXSovKTsKLQwKLS8qIFV0aWxpdHkgcm91dGluZXMuICAqLwotCi0vKiBHaXZlbiBjcHUgdHlwZSBOQU1FLCByZXR1cm4gaXRzIGJmZF9tYWNoX2FyY194eHggdmFsdWUuCi0gICBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotYXJjX2dldF9tYWNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnA7Ci0KLSAgZm9yIChwID0gJmJmZF9hcmNfYXJjaDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiArNDogc2tpcCBvdmVyICJhcmMtIiAqLwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgcC0+cHJpbnRhYmxlX25hbWUgKyA0KSA9PSAwKQotCXJldHVybiBwLT5tYWNoOwotICAgIH0KLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hcm0uYyBiL2JmZC9jcHUtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTljNDQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFSTSBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHNjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHdoaWNoIEFSTQotICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKLSAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYjsKLXsKLSAgLyogSWYgYSAmIGIgYXJlIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlIHdlIGNhbiBkbyBub3RoaW5nICovCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2gpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBhICYgYiBhcmUgZm9yIHRoZSBzYW1lIG1hY2hpbmUgdGhlbiBhbGwgaXMgd2VsbCAqLwotICBpZiAoYS0+bWFjaCA9PSBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIC8qIE90aGVyd2lzZSBpZiBlaXRoZXIgYSBvciBiIGlzIHRoZSAnZGVmYXVsdCcgbWFjaGluZSB0aGVuCi0gICAgIGl0IGNhbiBiZSBwb2x5bW9ycGhlZCBpbnRvIHRoZSBvdGhlciAqLwotICBpZiAoYS0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGI7Ci0gIAotICBpZiAoYi0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGE7Ci0KLSAgLyogU28gZmFyIGFsbCBuZXdlciBBUk0gYXJjaGl0ZWN0dXJlIGNvcmVzIGFyZSBzdXBlcnNldHMgb2YgcHJldmlvdXMgY29yZXMgKi8KLSAgaWYgKGEtPm1hY2ggPCBiLT5tYWNoKQotICAgIHJldHVybiBiOwotICBlbHNlIGlmIChhLT5tYWNoID4gYi0+bWFjaCkKLSAgICByZXR1cm4gYTsKLQotICAvKiBOZXZlciByZWFjaGVkISAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdAotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgY2hhciAqICAgICAgICAgICAgICAgIG5hbWU7Ci19Ci1wcm9jZXNzb3JzW10gPQotewotICB7IGJmZF9tYWNoX2FybV8yLCAgImFybTIiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTI1MCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTMiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTciICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTcxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTc1MDAiICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkaSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbWkiICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTd0ZG1pIiB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTkiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTkyMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTkyMHQiICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTl0ZG1pIiB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInNhMSIgICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInN0cm9uZ2FybSJ9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInN0cm9uZ2FybTExMCIgfSwKLSAgeyBiZmRfbWFjaF9hcm1fNCwgICJzdHJvbmdhcm0xMTAwIiB9LAotfTsKLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqIHN0cmluZzsKLXsKLSAgaW50ICBpOwotCi0gIC8qIEZpcnN0IHRlc3QgZm9yIGFuIGV4YWN0IG1hdGNoICovCi0gIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE5leHQgY2hlY2sgZm9yIGEgcHJvY2Vzc29yIG5hbWUgaW5zdGVhZCBvZiBhbiBBcmNoaXRlY3R1cmUgbmFtZSAqLwotICBmb3IgKGkgPSBzaXplb2YgKHByb2Nlc3NvcnMpIC8gc2l6ZW9mIChwcm9jZXNzb3JzWzBdKTsgaS0tOykKLSAgICB7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBwcm9jZXNzb3JzWyBpIF0ubmFtZSkgPT0gMCkKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKGkgIT0gLTEgJiYgaW5mby0+YXJjaCA9PSBwcm9jZXNzb3JzWyBpIF0uYXJjaCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaW5hbGx5IGNoZWNrIGZvciB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgImFybSIpID09IDApCi0gICAgcmV0dXJuIGluZm8tPnRoZV9kZWZhdWx0OwotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLSNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9hcm0sIG51bWJlciwgImFybSIsIHByaW50LCA0LCBkZWZhdWx0LCBjb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTiggYmZkX21hY2hfYXJtXzIsICAiYXJtdjIiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFsxXSApLAotICBOKCBiZmRfbWFjaF9hcm1fMmEsICJhcm12MmEiLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzJdICksCi0gIE4oIGJmZF9tYWNoX2FybV8zLCAgImFybXYzIiwgIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbM10gKSwKLSAgTiggYmZkX21hY2hfYXJtXzNNLCAiYXJtdjNtIiwgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs0XSApLAotICBOKCBiZmRfbWFjaF9hcm1fNCwgICJhcm12NCIsICBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzVdICksCi0gIE4oIGJmZF9tYWNoX2FybV80VCwgImFybXY0dCIsIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbNl0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzUsICAiYXJtdjUiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs3XSApLAotICBOKCBiZmRfbWFjaF9hcm1fNVQsICJhcm12NXQiLCBmYWxzZSwgTlVMTCApCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FybV9hcmNoID0KLSAgTiggMCwgImFybSIsIHRydWUsICYgYXJjaF9pbmZvX3N0cnVjdFswXSApOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hdnIuYyBiL2JmZC9jcHUtYXZyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzN2IxM2YuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hdnIuYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBBVlIgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGVuaXMgQ2hlcnR5a292IDxkZW5pc2NAb3ZlcnRhLnJ1PgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpjb21wYXRpYmxlCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKikpOwotCi0KLSNkZWZpbmUgTihhZGRyX2JpdHMsIG1hY2hpbmUsIHByaW50LCBkZWZhdWx0LCBuZXh0KQkJXAotewkJCQkJCQkJXAotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSB3b3JkICovCQlcCi0gIGFkZHJfYml0cywJCQkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JXAotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCQlcCi0gIGJmZF9hcmNoX2F2ciwJCQkJCQkJXAotICBtYWNoaW5lLAkJCS8qIG1hY2hpbmUgKi8JCQlcCi0gICJhdnIiLAkJCS8qIGFyY2hfbmFtZSAgKi8JCVwKLSAgcHJpbnQsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8JCVwKLSAgMSwJCQkJLyogc2VjdGlvbiBhbGlnbiBwb3dlciAqLwlcCi0gIGRlZmF1bHQsCQkJLyogdGhlIGRlZmF1bHQgbWFjaGluZSAqLwlcCi0gIGNvbXBhdGlibGUsCQkJCQkJCVwKLSAgYmZkX2RlZmF1bHRfc2NhbiwJCQkJCQlcCi0gIG5leHQJCQkJCQkJCVwKLX0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQotewotICAvKiBBVDkwUzEyMDAgKi8KLSAgTiAoMTYsIGJmZF9tYWNoX2F2cjEsICJhdnI6MSIsIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbMV0pLAotCi0gIC8qIEFUOTBTMnh4eCwgQVQ5MFM0eHh4LCBBVDkwUzgxeHgsIEFUdGlueTIyICovCi0gIE4gKDE2LCBiZmRfbWFjaF9hdnIyLCAiYXZyOjIiLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzJdKSwKLQotICAvKiBBVG1lZ2ExMDMsIEFUbWVnYTYwMyAqLwotICBOICgyMiwgYmZkX21hY2hfYXZyMywgImF2cjozIiwgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFszXSksCi0KLSAgLyogQVRtZWdhMTYxICovCi0gIE4gKDE2LCBiZmRfbWFjaF9hdnI0LCAiYXZyOjQiLCBmYWxzZSwgTlVMTCkKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXZyX2FyY2ggPQotICBOICgxNiwgYmZkX21hY2hfYXZyMiwgImF2ciIsIHRydWUsICYgYXJjaF9pbmZvX3N0cnVjdFswXSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHdoaWNoIEFWUgotICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKLSAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBhOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBiOwotewotICAvKiBJZiBhICYgYiBhcmUgZm9yIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzIHdlIGNhbiBkbyBub3RoaW5nLiAgKi8KLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTcGVjaWFsIGNhc2UgZm9yIEFUbWVnYVsxNl0wMyAoYXZyOjMpIGFuZCBBVG1lZ2ExNjEgKGF2cjo0KS4gICovCi0gIGlmICgoYS0+bWFjaCA9PSAzICYmIGItPm1hY2ggPT0gNCkKLSAgICAgIHx8IChhLT5tYWNoID09IDQgJiYgYi0+bWFjaCA9PSAzKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTbyBmYXIgYWxsIG5ld2VyIEFWUiBhcmNoaXRlY3R1cmUgY29yZXMgYXJlIHN1cGVyc2V0cyBvZiBwcmV2aW91cwotICAgICBjb3Jlcy4gICovCi0gIGlmIChhLT5tYWNoIDw9IGItPm1hY2gpCi0gICAgcmV0dXJuIGI7Ci0KLSAgLyogTmV2ZXIgcmVhY2hlZCEgICovCi0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1kMTB2LmMgYi9iZmQvY3B1LWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2YzNiNy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWQxMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgRDEwViBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGQxMHZfdHMzX2luZm8gPSAKLXsJCQkJCQotICAxNiwJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8JCQotICAxNiwJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCQotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkKLSAgYmZkX2FyY2hfZDEwdiwKLSAgYmZkX21hY2hfZDEwdl90czMsCQkKLSAgImQxMHYiLAkJCQkKLSAgImQxMHY6dHMzIiwJCQkJCi0gIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCQotICBmYWxzZSwJCQkJCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkJCi0gIDAsCQkJCQotfTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBkMTB2X3RzMl9pbmZvID0gCi17Ci0gIDE2LAkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwkJCi0gIDE2LAkvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCQotICBiZmRfYXJjaF9kMTB2LAotICBiZmRfbWFjaF9kMTB2X3RzMiwJCQotICAiZDEwdiIsCQkJCQotICAiZDEwdjp0czIiLAkJCQkKLSAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8JCi0gIGZhbHNlLAkJCQkKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkKLSAgYmZkX2RlZmF1bHRfc2NhbiwJCQkKLSAgJmQxMHZfdHMzX2luZm8sCQkJCQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2ggPSAKLXsJCQkJCQotICAxNiwJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8JCQotICAxNiwJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCQotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkKLSAgYmZkX2FyY2hfZDEwdiwKLSAgYmZkX21hY2hfZDEwdiwJCQotICAiZDEwdiIsCQkJCQotICAiZDEwdiIsCQkJCQotICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwkKLSAgdHJ1ZSwJCQkJCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkJCi0gICZkMTB2X3RzMl9pbmZvLAkJCQkKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWQzMHYuYyBiL2JmZC9jcHUtZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWFkZmVlLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtZDMwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNaXRzdWJpc2hpIEQzMFYgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2ggPQotewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX2QzMHYsCi0gICAgMCwKLSAgICAiZDMwdiIsCi0gICAgImQzMHYiLAotICAgIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCi0gICAgdHJ1ZSwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWZyMzAuYyBiL2JmZC9jcHUtZnIzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzIwOGY4Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBGUjMwIHByb2Nlc3Nvci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZnIzMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIGJpdHMgcGVyIHdvcmQgKi8KLSAgMzIsCQkJCS8qIGJpdHMgcGVyIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogYml0cyBwZXIgYnl0ZSAqLwotICBiZmRfYXJjaF9mcjMwLAkJLyogYXJjaGl0ZWN0dXJlICovCi0gIGJmZF9tYWNoX2ZyMzAsCQkvKiBtYWNoaW5lICovCi0gICJmcjMwIiwJCQkvKiBhcmNoaXRlY3R1cmUgbmFtZSAqLwotICAiZnIzMCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgNCwJCQkJLyogc2VjdGlvbiBhbGlnbiBwb3dlciAqLwotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCA/ICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCS8qIGFyY2hpdGVjdHVyZSBjb21wYXJpc29uIGZuICovCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkvKiBzdHJpbmcgdG8gYXJjaGl0ZWN0dXJlIGNvbnZlcnQgZm4gKi8KLSAgTlVMTAkJCQkvKiBuZXh0IGluIGxpc3QgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWg4MzAwLmMgYi9iZmQvY3B1LWg4MzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2I3ZGYuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1oODMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIaXRhY2hpIEg4LzMwMCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2ggKCk7Ci0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmICgqc3RyaW5nICE9ICdoJyAmJiAqc3RyaW5nICE9ICdIJykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICc4JykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nID09ICcvJykKLSAgICBzdHJpbmcrKzsKLQotICBpZiAoKnN0cmluZyAhPSAnMycpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgIT0gJzAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICcwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyA9PSAnLScpCi0gICAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nID09ICdoJyB8fCAqc3RyaW5nID09ICdIJykKLSAgICB7Ci0gICAgICByZXR1cm4gKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaDgzMDBoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCpzdHJpbmcgPT0gJ3MnIHx8ICpzdHJpbmcgPT0gJ1MnKQotICAgIHsKLSAgICAgIHJldHVybiAoaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9oODMwMHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBpbmZvLT5tYWNoID09IGJmZF9tYWNoX2g4MzAwOwotICAgIH0KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHdvcmtzIG91dCB0aGUgCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoaW4sIG91dCkKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogaW47Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIG91dDsKLXsKLSAgLyogSXQncyByZWFsbHkgbm90IGEgZ29vZCBpZGVhIHRvIG1peCBhbmQgbWF0Y2ggbW9kZXMuICAqLwotICBpZiAoaW4tPm1hY2ggIT0gb3V0LT5tYWNoKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluOwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGg4MzAwX2luZm9fc3RydWN0ID0KLXsKLSAgMTYsCQkJCS8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gIDE2LAkJCQkvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDAsCi0gICJoODMwMCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAiaDgzMDAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgMCwKLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgaDgzMDBoX2luZm9fc3RydWN0ID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDBoLAotICAiaDgzMDBoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODMwMGgiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIGZhbHNlLAkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgJmg4MzAwX2luZm9fc3RydWN0LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDBzLAotICAiaDgzMDBzIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODMwMHMiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIGZhbHNlLAkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgJmg4MzAwaF9pbmZvX3N0cnVjdCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWg4NTAwLmMgYi9iZmQvY3B1LWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTQyZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1oODUwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIOC81MDAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmIDAKLQotLyogCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvMTZfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0KLSAgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzE2KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84KGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLQotICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOChhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9GRm5uX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgICAgICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIGFib3J0KCk7Ci0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIGFib3J0KCk7Ci0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2Ci0gID0gTkVXSE9XVE8oaG93dG8xNl9jYWxsYmFjaywiYWJzMTYiLDEsZmFsc2UsZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAotICA9IE5FV0hPV1RPKGhvd3RvOF9jYWxsYmFjaywiYWJzOCIsMCxmYWxzZSxmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgotICA9IE5FV0hPV1RPKGhvd3RvOF9GRm5uX2NhbGxiYWNrLCJmZjAwK2FiczgiLDAsZmFsc2UsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCi0gID0gTkVXSE9XVE8oaG93dG84X3BjcmVsX2NhbGxiYWNrLCJwY3JlbDgiLDAsZmFsc2UsdHJ1ZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkgewotICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICByZXR1cm4gJmhvd3RvXzE2OwotICBjYXNlIEJGRF9SRUxPQ184X0ZGbm46Ci0gICAgcmV0dXJuICZob3d0b184X0ZGbm47Ci0gIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgcmV0dXJuICZob3d0b184OwotICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKLSAgfQotICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOwotfQotI2VuZGlmCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcChzdHJpbmcsImg4LzUwMCIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywiSDgvNTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJoODUwMCIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywiSDg1MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLSNpZiAwIC8qIG5vdCB1c2VkIGN1cnJlbnRseSAqLwotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCB8fCBhLT5tYWNoICE9IGItPm1hY2gpCi0gICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGE7Ci19Ci0jZW5kaWYKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODUwMF9hcmNoID0KLXsKLSAgMTYsCQkJCS8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gIDI0LAkJCQkvKiAyNCBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODUwMCwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgImg4NTAwIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODUwMCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgMSwKLSAgdHJ1ZSwJCQkJLyogdGhlIGRlZmF1bHQgbWFjaGluZSAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICBzY2FuX21hY2gsCi0gIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1ocHBhLmMgYi9iZmQvY3B1LWhwcGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxNzc0My4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWhwcGEuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgSFAgUHJlY2lzaW9uIEFyY2hpdGVjdHVyZSBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGExMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9ocHBhLAotICAxMCwJCQkJLyogQnkgY29udmVudGlvbiBQQTEuMCA9IDEwICovCi0gICJocHBhIiwKLSAgImhwcGExLjAiLAotICAzLAotICB0cnVlLAkJCQkvKiBVbmxlc3Mgd2UgdXNlIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gIDAsCi19OwotCi0vKiBQQTIuMCBpbiBuYXJyb3cgbW9kZSAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTIwX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2hwcGEsCi0gIDIwLAkJCQkvKiBCeSBjb252ZW50aW9uIFBBMS4wID0gMTAgKi8KLSAgImhwcGEiLAotICAiaHBwYTIuMCIsCi0gIDMsCi0gIGZhbHNlLAkJCS8qIFVubGVzcyB3ZSB1c2UgMS4xIHNwZWNpZmljIGZlYXR1cmVzICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgJmJmZF9ocHBhMTBfYXJjaCwKLX07Ci0KLS8qIFBBMi4wIGluIHdpZGUgbW9kZSAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTIwd19hcmNoID0KLXsKLSAgNjQsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDY0LAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9ocHBhLAotICAyNSwJCQkJLyogPz8/IEhvdyBiZXN0IHRvIGRlc2NyaWJlIHdpZGUgbW9kZSBoZXJlPyAgKi8KLSAgImhwcGEiLAotICAiaHBwYTIuMHciLAotICAzLAotICBmYWxzZSwJCQkvKiBVbmxlc3Mgd2UgdXNlIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICZiZmRfaHBwYTIwX2FyY2gsCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaHBwYSwKLSAgMTEsCQkJCS8qIEJ5IGNvbnZlbnRpb24gUEExLjEgPSAxMSAqLwotICAiaHBwYSIsCi0gICJocHBhMS4xIiwKLSAgMywKLSAgZmFsc2UsCQkJLyogMS4xIHNwZWNpZmljIGZlYXR1cmVzIHVzZWQgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2hwcGEyMHdfYXJjaCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWkzNzAuYyBiL2JmZC9jcHUtaTM3MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzMxZWVmLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaTM3MC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogQkZEIGkzNzAgQ1BVIGRlZmluaXRpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5OCwgOTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLSAgIEhhY2tlZCBieSBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+IGluIDE5OTgsIDE5OTkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFRoZSBjb21tb24gaTM2MC8zNzAgYXJjaGl0ZWN0dXJlIGNvbWVzIGluIG1hbnkgZm9ybXMgICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmkzNzBfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1pMzcwX2NvbXBhdGlibGUgKGEsIGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotICBCRkRfQVNTRVJUIChhLT5hcmNoID09IGJmZF9hcmNoX2kzNzApOwotICBzd2l0Y2ggKGItPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIGJmZF9hcmNoX2kzNzA6Ci0gICAgICByZXR1cm4gYmZkX2RlZmF1bHRfY29tcGF0aWJsZSAoYSwgYik7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIC8qIGhhY2sgYWxlcnQ6IG9sZCBvbGQgbWFjaGluZXMgYXJlIHJlYWxseSAxNiBhbmQgMjQgYml0IGFyY2ggLi4uICovCi0gIHsKLSAgICAzMiwgLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9pMzcwLAotICAgIDM2MCwgLyogZm9yIHRoZSAzNjAgKi8KLSAgICAiaTM3MCIsCi0gICAgImkzNzA6MzYwIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBpMzcwX2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFsxXQotICB9LAotICB7Ci0gICAgMzIsIC8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsIC8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsICAvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfaTM3MCwKLSAgICAzNzAsIC8qIGZvciB0aGUgMzcwICovCi0gICAgImkzNzAiLAotICAgICJpMzcwOjM3MCIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgaTM3MF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMAotICB9LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pMzcwX2FyY2ggPQotICB7Ci0gICAgMzIsIC8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsIC8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsICAvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfaTM3MCwKLSAgICAwLCAgLyogZm9yIHRoZSAzNjAvMzcwIGNvbW1vbiBhcmNoaXRlY3R1cmUgKi8KLSAgICAiaTM3MCIsCi0gICAgImkzNzA6Y29tbW9uIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBkZWZhdWx0ICovCi0gICAgaTM3MF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMF0KLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTM4Ni5jIGIvYmZkL2NwdS1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjliMTguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEludGVsIDM4NiBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiwgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pMzg2X2FyY2hfaW50ZWxfc3ludGF4ID0KLXsKLSAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4LAotICAiaTM4NjppbnRlbCIsCi0gICJpMzg2OmludGVsIiwKLSAgMywKLSAgdHJ1ZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAwLAotfTsKLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgaTgwODZfYXJjaCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICh3ZWxsLCBub3QgcmVhbGx5KSAqLwotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2kzODYsCi0gIGJmZF9tYWNoX2kzODZfaTgwODYsCi0gICJpODA4NiIsCi0gICJpODA4NiIsCi0gIDMsCi0gIGZhbHNlLAotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICZiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTM4Nl9hcmNoID0KLXsKLSAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICBiZmRfbWFjaF9pMzg2X2kzODYsCi0gICJpMzg2IiwKLSAgImkzODYiLAotICAzLAotICB0cnVlLAotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICZpODA4Nl9hcmNoLAotfTsKLQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1pODYwLmMgYi9iZmQvY3B1LWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjODY3Yy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWk4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgSW50ZWwgODYwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ3JlYXRlZCBtb3N0bHkgYnkgc3Vic3RpdHV0aW5nICI4NjAiIGZvciAiMzg2IiBpbiBjcHUtaTM4Ni5jCi0gICBIYXJyeSBEb2xhbiA8ZG9sYW5Ac3NkLmludGVsLmNvbT4sIE9jdG9iZXIgMTk5NQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pODYwX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9pODYwLAotICAgIDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgImk4NjAiLAotICAgICJpODYwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1pOTYwLmMgYi9iZmQvY3B1LWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiMmM3ZS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWk5NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgaTk2MCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgYSBzdHJpbmcsIGFuZCB0cmllcyB0byB3b3JrIG91dCBpZiBpdAotICAgY291bGQgcG9zc2libHkgcmVmZXIgdG8gdGhlIGk5NjAgbWFjaGluZSBwb2ludGVkIGF0IGluIHRoZQotICAgaW5mb19zdHJ1Y3QgcG9pbnRlciAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2Nhbl85NjBfbWFjaCAoYXAsIHN0cmluZykKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcDsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci0KLSAgLyogTG9vayBmb3IgdGhlIHN0cmluZyBpOTYwLCBvciBzb21lc3VjaCBhdCB0aGUgZnJvbnQgb2YgdGhlIHN0cmluZyAgKi8KLQotICBpZiAoc3RybmNtcCgiaTk2MCIsc3RyaW5nLDQpID09IDApIHsKLSAgICBzdHJpbmcrPTQ7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogbm8gbWF0Y2gsIGNhbiBiZSB1cyAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoc3RyaW5nWzBdID09IDApIHsKLSAgICAvKiBpOTYwIG9uIGl0J3Mgb3duIG1lYW5zIGNvcmUgdG8gdXMqLwotICAgIGlmIChhcC0+bWFjaCA9PSBiZmRfbWFjaF9pOTYwX2NvcmUpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChzdHJpbmdbMF0gIT0gJzonKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN0cmluZysrOwotICBpZiAoc3RyaW5nWzBdID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoc3RyaW5nWzBdID09ICdjJyAmJiBzdHJpbmdbMV0gPT0gJ28nICYmIHN0cmluZ1syXSA9PSAncicgJiYKLSAgICAgIHN0cmluZ1szXSA9PSAnZScgJiYgc3RyaW5nWzRdID09ICdcMCcpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLSAgZWxzZSBpZiAoc3RyY21wIChzdHJpbmcsICJrYV9zYSIpID09IDApCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Ffc2E7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc3RyaW5nLCAia2Jfc2IiKSA9PSAwKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOwotICBlbHNlIGlmIChzdHJpbmdbMV0gPT0gJ1wwJyB8fCBzdHJpbmdbMl0gIT0gJ1wwJykgLyogcmVzdCBhcmUgMi1jaGFyICovCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2snICYmIHN0cmluZ1sxXSA9PSAnYicpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAncycgJiYgc3RyaW5nWzFdID09ICdiJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdtJyAmJiBzdHJpbmdbMV0gPT0gJ2MnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX21jOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ3gnICYmIHN0cmluZ1sxXSA9PSAnYScpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfeGE7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnYycgJiYgc3RyaW5nWzFdID09ICdhJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jYTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdrJyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ3MnICYmIHN0cmluZ1sxXSA9PSAnYScpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Ffc2E7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaicgJiYgc3RyaW5nWzFdID09ICd4JykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9qeDsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdoJyAmJiBzdHJpbmdbMV0gPT0gJ3gnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2h4OwotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobWFjaGluZSA9PSBhcC0+bWFjaCkgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCB3b3JrcyBvdXQgdGhlIGk5NjAKLSAgIG1hY2hpbmUgd2hpY2ggd291bGQgYmUgY29tcGF0aWJsZSB3aXRoIGJvdGggYW5kIHJldHVybnMgYSBwb2ludGVyCi0gICB0byBpdHMgaW5mbyBzdHJ1Y3R1cmUgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1jb21wYXRpYmxlIChhLGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotCi0gIC8qIFRoZSBpOTYwIGhhcyBkaXN0aW5jdCBzdWJzcGVjaWVzIHdoaWNoIG1heSBub3QgaW50ZXJicmVlZDoKLQlDT1JFIENBICAgICAgICAgIAotCUNPUkUgS0EgS0IgTUMgWEEKLQlDT1JFIEhYIEpYCi0gICAgIEFueSBhcmNoaXRlY3R1cmUgb24gdGhlIHNhbWUgbGluZSBpcyBjb21wYXRpYmxlLCB0aGUgb25lIG9uCi0gICAgIHRoZSByaWdodCBpcyB0aGUgbGVhc3QgcmVzdHJpY3RpdmUuICAKLSAgICAgCi0gICAgIFdlIHJlcHJlc2VudCB0aGlzIGluZm9ybWF0aW9uIGluIGFuIGFycmF5LCBlYWNoIG1hY2hpbmUgdG8gYSBzaWRlICovCi0KLSNkZWZpbmUgRVJST1IJMAotI2RlZmluZSBDT1JFCWJmZF9tYWNoX2k5NjBfY29yZSAgLyoxKi8gIAotI2RlZmluZSBLQSAJYmZkX21hY2hfaTk2MF9rYV9zYSAvKjIqLyAKLSNkZWZpbmUgS0IgCWJmZF9tYWNoX2k5NjBfa2Jfc2IgLyozKi8KLSNkZWZpbmUgTUMgCWJmZF9tYWNoX2k5NjBfbWMgICAgLyo0Ki8KLSNkZWZpbmUgWEEgCWJmZF9tYWNoX2k5NjBfeGEgICAgLyo1Ki8KLSNkZWZpbmUgQ0EgCWJmZF9tYWNoX2k5NjBfY2EgICAgLyo2Ki8KLSNkZWZpbmUgSlgJYmZkX21hY2hfaTk2MF9qeCAgICAvKjcqLwotI2RlZmluZSBIWAliZmRfbWFjaF9pOTYwX2h4ICAgIC8qOCovCi0jZGVmaW5lIE1BWF9BUkNIICgoaW50KUhYKQotCi0gIHN0YXRpYyBDT05TVCB1bnNpZ25lZCBsb25nIG1hdHJpeFtNQVhfQVJDSCsxXVtNQVhfQVJDSCsxXSA9IAotICAgIHsKLSAgICAgIHsgRVJST1IsCUNPUkUsCUtBLAlLQiwJTUMsCVhBLAlDQSwJSlgsCUhYIH0sCi0gICAgICB7IENPUkUsCUNPUkUsCUtBLAlLQiwJTUMsCVhBLAlDQSwJSlgsCUhYIH0sCi0gICAgICB7IEtBLAlLQSwJS0EsCUtCLAlNQywJWEEsCUVSUk9SLAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBLQiwJS0IsCUtCLAlLQiwJTUMsCVhBLAlFUlJPUiwgCUVSUk9SLAlFUlJPUn0sCi0gICAgICB7IE1DLAlNQywJTUMsCU1DLAlNQywJWEEsCUVSUk9SLAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBYQSwJWEEsCVhBLAlYQSwJWEEsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgQ0EsCUNBLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwJQ0EsCUVSUk9SLAlFUlJPUn0sCi0gICAgICB7IEpYLAlKWCwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLCAgSlgsCUhYIH0sCi0gICAgICB7IEhYLAlIWCwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlIWCwJSFggfSwKLSAgICB9OwotCi0KLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCB8fCBtYXRyaXhbYS0+bWFjaF1bYi0+bWFjaF0gPT0gRVJST1IpIAotICAgIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgIHJldHVybiAoYS0+bWFjaCAgPT0gIG1hdHJpeFthLT5tYWNoXVtiLT5tYWNoXSkgPyAgYSA6IGI7Ci0gICAgfQotfQotCi0KLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2goKTsKLSNkZWZpbmUgTihhLGIsZCxuKSBcCi17IDMyLCAzMiwgOCxiZmRfYXJjaF9pOTYwLGEsImk5NjAiLGIsMyxkLGNvbXBhdGlibGUsc2Nhbl85NjBfbWFjaCxuLH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsgCi0gIE4oYmZkX21hY2hfaTk2MF9rYV9zYSwiaTk2MDprYV9zYSIsZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTihiZmRfbWFjaF9pOTYwX2tiX3NiLCJpOTYwOmtiX3NiIixmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMl0pLAotICBOKGJmZF9tYWNoX2k5NjBfbWMsICAgImk5NjA6bWMiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFszXSksCi0gIE4oYmZkX21hY2hfaTk2MF94YSwgICAiaTk2MDp4YSIsICAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzRdKSwKLSAgTihiZmRfbWFjaF9pOTYwX2NhLCAgICJpOTYwOmNhIiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbNV0pLAotICBOKGJmZF9tYWNoX2k5NjBfangsICAgImk5NjA6angiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs2XSksCi0gIE4oYmZkX21hY2hfaTk2MF9oeCwJImk5NjA6aHgiLCAgIGZhbHNlLCAwKSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTk2MF9hcmNoID0KLSAgTihiZmRfbWFjaF9pOTYwX2NvcmUsICJpOTYwOmNvcmUiLCB0cnVlLCAmYXJjaF9pbmZvX3N0cnVjdFswXSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0xMDIwMC5jIGIvYmZkL2NwdS1tMTAyMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4YTY3OC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMjAwIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAyMDBfYXJjaCA9Ci0gIHsKLSAgICAxNiwgLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAyNCwgLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9tbjEwMjAwLAotICAgIDIwMCwKLSAgICAibW4xMDIwMCIsCi0gICAgIm1uMTAyMDAiLAotICAgIDIsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTEwMzAwLmMgYi9iZmQvY3B1LW0xMDMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0MjhlLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbTEwMzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIE1hdHN1c2hpdGEgMTAzMDAgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYW0zM19hcmNoID0KLSAgewotICAgIDMyLCAvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLCAvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LCAgLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX21uMTAzMDAsCi0gICAgMzMwLAotICAgICJhbTMzIiwKLSAgICAiYW0zMyIsCi0gICAgMiwKLSAgICBmYWxzZSwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMCwKLSAgfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tbjEwMzAwX2FyY2ggPQotICB7Ci0gICAgMzIsIC8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsIC8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsICAvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbW4xMDMwMCwKLSAgICAzMDAsCi0gICAgIm1uMTAzMDAiLAotICAgICJtbjEwMzAwIiwKLSAgICAyLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmJmZF9hbTMzX2FyY2gsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0zMnIuYyBiL2JmZC9jcHUtbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVhZDQxLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbTMyci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNMzJSIHByb2Nlc3Nvci4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9tMzJyLCBudW1iZXIsICJtMzJyIiwgcHJpbnQsIDQsIGRlZmF1bHQsIFwKLSAgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgYmZkX2RlZmF1bHRfc2NhbiwgbmV4dCB9Ci0KLSNkZWZpbmUgTkVYVCBOVUxMCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17Ci0gIE4gKGJmZF9tYWNoX20zMnJ4LCAibTMycngiLCBmYWxzZSwgTlVMTCkKLX07Ci0KLSN1bmRlZiBORVhUCi0jZGVmaW5lIE5FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbMF0KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tMzJyX2FyY2ggPQotICBOIChiZmRfbWFjaF9tMzJyLCAibTMyciIsIHRydWUsIE5FWFQpOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tNjhrLmMgYi9iZmQvY3B1LW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0MTgyZC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIGFyY2hpdGVjdHVyZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBOKG5hbWUsIHByaW50LGQsbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfbTY4aywgbmFtZSwgIm02OGsiLHByaW50LDIsZCxiZmRfZGVmYXVsdF9jb21wYXRpYmxlLGJmZF9kZWZhdWx0X3NjYW4sIG5leHQsIH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTihiZmRfbWFjaF9tNjgwMDAsICJtNjhrOjY4MDAwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTihiZmRfbWFjaF9tNjgwMDgsICJtNjhrOjY4MDA4IiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzJdKSwKLSAgTihiZmRfbWFjaF9tNjgwMTAsICJtNjhrOjY4MDEwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzNdKSwKLSAgTihiZmRfbWFjaF9tNjgwMjAsICJtNjhrOjY4MDIwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzRdKSwKLSAgTihiZmRfbWFjaF9tNjgwMzAsICJtNjhrOjY4MDMwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzVdKSwKLSAgTihiZmRfbWFjaF9tNjgwNDAsICJtNjhrOjY4MDQwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzZdKSwKLSAgTihiZmRfbWFjaF9jcHUzMiwgICJtNjhrOmNwdTMyIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzddKSwKLSAgTihiZmRfbWFjaF9tNjgwNjAsICJtNjhrOjY4MDYwIiwgZmFsc2UsIDApLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tNjhrX2FyY2ggPQotICBOKDAsICJtNjhrIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tODhrLmMgYi9iZmQvY3B1LW04OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MTZjNS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgbTg4ayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTg4a19hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbTg4aywKLSAgICA4ODEwMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAibTg4ayIsCi0gICAgIm04OGs6ODgxMDAiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW1jb3JlLmMgYi9iZmQvY3B1LW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MGJjZGUuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgTW90b3JvbGEncyBNQ29yZSBhcmNoaXRlY3R1cmUKLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWNvcmVfYXJjaCA9Ci17Ci0gIDMyLAkJICAJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJICAJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJICAJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfbWNvcmUsIAkJLyogQXJjaGl0ZWN0dXJlICovCi0gIDAsCQkgIAkJLyogTWFjaGluZSBudW1iZXIgLSAwIGZvciBub3cgKi8KLSAgIk1Db3JlIiwJICAJCS8qIEFyY2hpdGVjdHVyZSBuYW1lICovCi0gICJNQ29yZSIsCSAgCQkvKiBQcmludGFibGUgbmFtZSAqLwotICAzLAkJICAJCS8qIFNlY3Rpb24gYWxpZ24gcG93ZXIgKi8KLSAgdHJ1ZSwJCSAgCQkvKiBJcyB0aGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSA/ICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCS8qIEFyY2hpdGVjdHVyZSBjb21wYXJpc29uIGZ1bmN0aW9uICovCi0gIGJmZF9kZWZhdWx0X3NjYW4sCSAgIAkvKiBTdHJpbmcgdG8gYXJjaGl0ZWN0dXJlIGNvbnZlcnNpb24gKi8KLSAgTlVMTAkJCSAgIAkvKiBOZXh0IGluIGxpc3QgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW1pcHMuYyBiL2JmZC9jcHUtbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTMzYjhjLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciBtaXBzIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBOKEJJVFNfV09SRCwgQklUU19BRERSLCBOVU1CRVIsIFBSSU5ULCBERUZBVUxULCBORVhUKQkJXAotICB7CQkJCQkJCVwKLSAgICBCSVRTX1dPUkQsIC8qICBiaXRzIGluIGEgd29yZCAqLwkJCVwKLSAgICBCSVRTX0FERFIsIC8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkJCVwKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkJCVwKLSAgICBiZmRfYXJjaF9taXBzLAkJCQkJXAotICAgIE5VTUJFUiwJCQkJCQlcCi0gICAgIm1pcHMiLAkJCQkJCVwKLSAgICBQUklOVCwJCQkJCQlcCi0gICAgMywJCQkJCQkJXAotICAgIERFRkFVTFQsCQkJCQkJXAotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCQlcCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwJCQkJCVwKLSAgICBORVhULAkJCQkJCVwKLSAgfQotCi1lbnVtIHsKLUlfbWlwczMwMDAsIAotSV9taXBzMzkwMCwgCi1JX21pcHM0MDAwLCAKLUlfbWlwczQwMTAsIAotSV9taXBzNDEwMCwgCi1JX21pcHM0MTExLAotSV9taXBzNDMwMCwgCi1JX21pcHM0NDAwLCAKLUlfbWlwczQ2MDAsIAotSV9taXBzNDY1MCwgCi1JX21pcHM1MDAwLCAKLUlfbWlwczYwMDAsIAotSV9taXBzODAwMCwgCi1JX21pcHMxMDAwMCwKLUlfbWlwczE2Ci19OwotCi0KLSNkZWZpbmUgTk4oaW5kZXgpICgmYXJjaF9pbmZvX3N0cnVjdFsoaW5kZXgpKzFdKQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICBOICgzMiwgMzIsIGJmZF9tYWNoX21pcHMzMDAwLCAibWlwczozMDAwIiwgZmFsc2UsIE5OKElfbWlwczMwMDApKSwKLSAgTiAoMzIsIDMyLCBiZmRfbWFjaF9taXBzMzkwMCwgIm1pcHM6MzkwMCIsIGZhbHNlLCBOTihJX21pcHMzOTAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQwMDAsICJtaXBzOjQwMDAiLCBmYWxzZSwgTk4oSV9taXBzNDAwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MDEwLCAibWlwczo0MDEwIiwgZmFsc2UsIE5OKElfbWlwczQwMTApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDEwMCwgIm1pcHM6NDEwMCIsIGZhbHNlLCBOTihJX21pcHM0MTAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQxMTEsICJtaXBzOjQxMTEiLCBmYWxzZSwgTk4oSV9taXBzNDExMSkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MzAwLCAibWlwczo0MzAwIiwgZmFsc2UsIE5OKElfbWlwczQzMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDQwMCwgIm1pcHM6NDQwMCIsIGZhbHNlLCBOTihJX21pcHM0NDAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQ2MDAsICJtaXBzOjQ2MDAiLCBmYWxzZSwgTk4oSV9taXBzNDYwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0NjUwLCAibWlwczo0NjUwIiwgZmFsc2UsIE5OKElfbWlwczQ2NTApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNTAwMCwgIm1pcHM6NTAwMCIsIGZhbHNlLCBOTihJX21pcHM1MDAwKSksCi0gIE4gKDMyLCAzMiwgYmZkX21hY2hfbWlwczYwMDAsICJtaXBzOjYwMDAiLCBmYWxzZSwgTk4oSV9taXBzNjAwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM4MDAwLCAibWlwczo4MDAwIiwgZmFsc2UsIE5OKElfbWlwczgwMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzMTAwMDAsICJtaXBzOjEwMDAwIiwgZmFsc2UsIE5OKElfbWlwczEwMDAwKSksCi0KLQotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHMxNiwgICAibWlwczoxNiIsICAgZmFsc2UsIDApLAotfTsKLQotLyogVGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGlzIG1pcHM6MzAwMCwgYnV0IHdpdGggYSBtYWNoaW5lIG51bWJlciBvZgotICAgemVyby4gIFRoaXMgbGV0cyB0aGUgbGlua2VyIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBkZWZhdWx0IHNldHRpbmcKLSAgIG9mIG1pcHMsIGFuZCBhbiBleHBsaWNpdCBzZXR0aW5nIG9mIG1pcHM6MzAwMC4gICovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWlwc19hcmNoID0KLU4gKDMyLCAzMiwgMCwgIm1pcHMiLCB0cnVlLCAmYXJjaF9pbmZvX3N0cnVjdFswXSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LW5zMzJrLmMgYi9iZmQvY3B1LW5zMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NGUyNWIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1uczMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsODQ2ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgbnMzMmsgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTQsIDk1LCA5NiwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBBbG1vc3QgdG90YWxseSByZXdyaXR0ZW4gYnkgSWFuIERhbGwgZnJvbSBpbml0aWFsIHdvcmsKLSAgIGJ5IEFuZHJldyBDYWduZXkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgIm5zMzJrLmgiCi0KLSNkZWZpbmUgTihtYWNoaW5lLCBwcmludGFibGUsIGQsIG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX25zMzJrLCBtYWNoaW5lLCAibnMzMmsiLHByaW50YWJsZSwzLGQsYmZkX2RlZmF1bHRfY29tcGF0aWJsZSxiZmRfZGVmYXVsdF9zY2FuLCBuZXh0LCB9Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsgCi0gIE4oMzI1MzIsIm5zMzJrOjMyNTMyIix0cnVlLCAwKSwgLyogdGhlIHdvcmQgbnMzMmsgd2lsbCBtYXRjaCB0aGlzIHRvbyAqLwotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9uczMya19hcmNoID0KLSAgTigzMjAzMiwibnMzMms6MzIwMzIiLGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFswXSk7Ci0KLXN0YXRpYyBsb25nCi1uczMya19zaWduX2V4dGVuZCh2YWx1ZSwgYml0cykKLSAgICAgaW50IHZhbHVlOwotICAgICBpbnQgYml0czsKLXsKLSAgdmFsdWUgPSB2YWx1ZSAmICgoMSA8PCBiaXRzKSAtIDEpOwotICByZXR1cm4gKHZhbHVlICYgKDEgPDwgKGJpdHMtMSkpCi0JICA/IHZhbHVlIHwgKH4oKDEgPDwgYml0cykgLSAxKSkKLQkgIDogdmFsdWUpOwotfQotCi1sb25nCi1fYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQoYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGxvbmcgdmFsdWU7Ci0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCAoKmJ1ZmZlciwgNyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB2YWx1ZSA9IG5zMzJrX3NpZ25fZXh0ZW5kKCpidWZmZXIrKywgNik7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgweGZmICYgKmJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICB2YWx1ZSA9IG5zMzJrX3NpZ25fZXh0ZW5kKCpidWZmZXIrKywgNik7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgweGZmICYgKmJ1ZmZlcisrKTsKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKyspOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWludAotX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50KHZhbHVlLCBidWZmZXIsIG9mZnNldCwgc2l6ZSkKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGxvbmcgc2l6ZTsKLXsKLSAgYnVmZmVyICs9IG9mZnNldDsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAodmFsdWUgPCAtNjQgfHwgdmFsdWUgPiA2MykKLQlyZXR1cm4gLTE7Ci0gICAgICB2YWx1ZSY9MHg3ZjsKLSAgICAgICpidWZmZXIrKz12YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGlmICh2YWx1ZSA8IC04MTkyIHx8IHZhbHVlID4gODE5MSkKLQlyZXR1cm4gLTE7Ci0gICAgICB2YWx1ZSY9MHgzZmZmOwotICAgICAgdmFsdWV8PTB4ODAwMDsKLSAgICAgICpidWZmZXIrKz0odmFsdWU+PjgpOwotICAgICAgKmJ1ZmZlcisrPXZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaWYgKHZhbHVlIDwgLTB4MWYwMDAwMDAgfHwgdmFsdWUgPj0gMHgyMDAwMDAwMCkKLQlyZXR1cm4gLTE7Ci0gICAgICB2YWx1ZXw9MHhjMDAwMDAwMDsKLSAgICAgICpidWZmZXIrKz0odmFsdWU+PjI0KTsKLSAgICAgICpidWZmZXIrKz0odmFsdWU+PjE2KTsKLSAgICAgICpidWZmZXIrKz0odmFsdWU+PjgpOwotICAgICAgKmJ1ZmZlcisrPXZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotbG9uZwotX2JmZF9uczMya19nZXRfaW1tZWRpYXRlIChidWZmZXIsIG9mZnNldCwgc2l6ZSkKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGxvbmcgc2l6ZTsKLXsKLSAgbG9uZyB2YWx1ZSA9IDA7Ci0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoKmJ1ZmZlcisrICYgMHhmZik7Ci0gICAgY2FzZSAzOgotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoKmJ1ZmZlcisrICYgMHhmZik7Ci0gICAgY2FzZSAyOgotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoKmJ1ZmZlcisrICYgMHhmZik7Ci0gICAgY2FzZSAxOgotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoKmJ1ZmZlcisrICYgMHhmZik7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWludAotX2JmZF9uczMya19wdXRfaW1tZWRpYXRlICh2YWx1ZSwgYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGJ1ZmZlciArPSBvZmZzZXQgKyBzaXplIC0gMTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICAqYnVmZmVyLS0gPSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7Ci0gICAgY2FzZSAzOgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIGNhc2UgMjoKLSAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKLSAgICBjYXNlIDE6Ci0gICAgICAqYnVmZmVyLS0gPSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyBqdXN0IGxpa2UgdGhlIHN0YW5kYXJkIHBlcmZvcm1fcmVsb2NhdGlvbiBleGNlcHQgd2UKLSAqIHVzZSBnZXRfZGF0YSBhbmQgcHV0X2RhdGEgd2hpY2gga25vdyBhYm91dCB0aGUgbnMzMmsKLSAqIHN0b3JhZ2UgbWV0aG9kcy4KLSAqIFRoaXMgaXMgcHJvYmFibHkgYSBsb3QgbW9yZSBjb21wbGljYXRlZCB0aGFuIGl0IG5lZWRzIHRvIGJlIQotICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1kb19uczMya19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJZXJyb3JfbWVzc2FnZSwgZ2V0X2RhdGEsIHB1dF9kYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBsb25nICgqZ2V0X2RhdGEpKCk7Ci0gICAgIGludCAoKnB1dF9kYXRhKSgpOwotewotICBpbnQgb3ZlcmZsb3cgPSAwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotCi0gIGlmICgoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgcmV0dXJuIGFuIGVycm9yIGlmCi0gICAgIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQuICBBbiB1bmRlZmluZWQgd2VhayBzeW1ib2wgaXMKLSAgICAgY29uc2lkZXJlZCB0byBoYXZlIGEgdmFsdWUgb2YgemVybyAoU1ZSNCBBQkksIHAuIDQtMjcpLiAgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICBXZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OCi0JIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYW5kIHRoZQotCSBsb2NhdGlvbi4gIFJFTE9DQVRJT04gaXMgYWxyZWFkeSB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLgotCi0JIFdlIHN0YXJ0IGJ5IHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcKLQkgdGhlIGxvY2F0aW9uLgotCi0JIElmIHBjcmVsX29mZnNldCBpcyBzZXQsIHdlIG11c3QgZnVydGhlciBzdWJ0cmFjdCB0aGUgcG9zaXRpb24KLQkgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFNvbWUgdGFyZ2V0cyBhcnJhbmdlIGZvcgotCSB0aGUgYWRkZW5kIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uCi0JIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIGV4YW1wbGUsIGkzODYtYW91dCBkb2VzIHRoaXMuICBGb3IKLQkgaTM4Ni1hb3V0LCBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBTb21lIG90aGVyIHRhcmdldHMgZG8gbm90Ci0JIGluY2x1ZGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbjsgZm9yIGV4YW1wbGUsIG04OGtiY3MsCi0JIG9yIEVMRi4gIEZvciB0aG9zZSB0YXJnZXRzLCBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4KLQotCSBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZW4gd2UgbXVzdCBlbnN1cmUKLQkgdGhhdCB0aGlzIHJlbG9jIHdpbGwgYmUgY29ycmVjdGx5IGNvbXB1dGVkIHdoZW4gdGhlIGZpbmFsCi0JIHJlbG9jYXRpb24gaXMgZG9uZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSB3YW50IHRvIHdpbmQKLQkgdXAgd2l0aCB0aGUgbmVnYXRpdmUgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwKLQkgd2hpY2ggbWVhbnMgd2UgbXVzdCBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBieSB0aGUgY2hhbmdlCi0JIGluIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBJZiBwY3JlbF9vZmZzZXQgaXMgdHJ1ZQotCSB3ZSBkbyBub3Qgd2FudCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBhdCBhbGwuCi0KLQkgRklYTUU6IFRoaXMgc2VlbXMgbG9naWNhbCB0byBtZSwgYnV0IGZvciB0aGUgY2FzZSBvZgotCSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBpdCBpcyBub3Qgd2hhdCB0aGUgY29kZQotCSBhY3R1YWxseSBkb2VzLiAgSSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdCwgYmVjYXVzZSBpdCBzZWVtcwotCSBmYXIgdG9vIGxpa2VseSB0aGF0IHNvbWV0aGluZyB3aWxsIGJyZWFrLiAgKi8KLQotICAgICAgcmVsb2NhdGlvbiAtPQotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUgcmVsb2NhdGlvbgotCSAgICAgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSAgICAgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGZsYWc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGJ1dCBpbnBsYWNlLCBzbyBtb2RpZnkgdGhlCi0JICAgICByZWxvYyByZWNvcmQgYSBiaXQuCi0KLQkgICAgIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgICAgIGludG8gYSByZWYgdG8gdGhlIHNlY3Rpb24gYmVsb25naW5nIHRvIHRoZSBzeW1ib2wuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0JICAvKiBXVEY/PyAqLwotCSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhaXhjb2ZmLXJzNjAwMCIpICE9IDApCi0JICAgIHsKLSNpZiAxCi0JICAgICAgLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKLQkJIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAotCQkgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KLQotSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKLXdoaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KLQotSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKLWxpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCi1TQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKLXByb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQotY29kZSB3b3JrcyBhcyBpdCBkb2VzLgotCi1IbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHNob3VsZAotbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQotZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKLWlzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKLXJlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQotaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KLQotQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgotdGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKLXJlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKLWxvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCi0KLUJGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCi12YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKLW5vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCi1kaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCi12YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCi0KLVNvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KLXdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Ci13aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCi1wYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAotcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bwotYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAotd2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgotZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCi10aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KLQotV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCi1pbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0Ci1saW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKLWZ1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgotc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0Ci1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCi1jb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCi10cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgotCi1UaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQotd29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKLXdheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQotc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzawotc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgotICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKLSAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCi0gICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAotICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgotICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCi0gICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKLSAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKLSAgICA1KSByZXBlYXQgc3RlcCAyCi0gICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAotICAgICAgIG1hZGUgaXQgbm8gd29yc2UKLSAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCi0gICAgICAgcmlnaHQKLSovCi0JICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotICAgIH0KLQotICAvKiBGSVhNRTogVGhpcyBvdmVyZmxvdyBjaGVja2luZyBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICBtaWdodCBoYXZlIG92ZXJmbG93ZWQgYmVmb3JlIHdlIGdldCBoZXJlLiAgRm9yIGEgY29ycmVjdCBjaGVjayB3ZQotICAgICBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIGluIGEgc2l6ZSBsYXJnZXIgdGhhbiBiaXRzaXplLCBidXQgd2UKLSAgICAgY2FuJ3QgcmVhc29uYWJseSBkbyB0aGF0IGZvciBhIHJlbG9jIHRoZSBzYW1lIHNpemUgYXMgYSBob3N0Ci0gICAgIG1hY2hpbmUgd29yZC4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGRvIG92ZXJmbG93IGNoZWNraW5nIG9uIHRoZSByZXN1bHQgYWZ0ZXIKLSAgICAgYWRkaW5nIGluIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KQotICAgIHsKLSAgICAgIGJmZF92bWEgY2hlY2s7Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSByZWxvY2F0aW9uLCBidXQKLQkgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHplcm8uICAqLwotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID4gaG93dG8tPmJpdHBvcykKLQljaGVjayA9IHJlbG9jYXRpb24gPj4gKGhvd3RvLT5yaWdodHNoaWZ0IC0gaG93dG8tPmJpdHBvcyk7Ci0gICAgICBlbHNlCi0JY2hlY2sgPSByZWxvY2F0aW9uIDw8IChob3d0by0+Yml0cG9zIC0gaG93dG8tPnJpZ2h0c2hpZnQpOwotICAgICAgc3dpdGNoIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cpCi0JewotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICAqLwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMTsKLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21pbiA9IH5yZWxvY19zaWduZWRfbWF4OwotCi0JICAgIC8qIFRoZSBhYm92ZSByaWdodCBzaGlmdCBpcyBpbmNvcnJlY3QgZm9yIGEgc2lnbmVkIHZhbHVlLgotCSAgICAgICBGaXggaXQgdXAgYnkgZm9yY2luZyBvbiB0aGUgdXBwZXIgYml0cy4gICovCi0JICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA+IGhvd3RvLT5iaXRwb3MKLQkJJiYgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgMCkKLQkgICAgICBjaGVjayB8PSAoKGJmZF92bWEpIC0gMQotCQkJJiB+KChiZmRfdm1hKSAtIDEKLQkJCSAgICA+PiAoaG93dG8tPnJpZ2h0c2hpZnQgLSBob3d0by0+Yml0cG9zKSkpOwotCSAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSBjaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkJfHwgKGJmZF9zaWduZWRfdm1hKSBjaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JICAgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gIFRoaXMgZXhwcmVzc2lvbiBhdm9pZHMKLQkgICAgICAgb3ZlcmZsb3cgaWYgaG93dG8tPmJpdHNpemUgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCi0JICAgICAgIGJmZF92bWEuICAqLwotCSAgICBiZmRfdm1hIHJlbG9jX3Vuc2lnbmVkX21heCA9Ci0JICAgICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0JICAgIGlmICgoYmZkX3ZtYSkgY2hlY2sgPiByZWxvY191bnNpZ25lZF9tYXgpCi0JICAgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gIFRoaXMgZXhwcmVzc2lvbiBhdm9pZHMKLQkgICAgICAgb3ZlcmZsb3cgaWYgaG93dG8tPmJpdHNpemUgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCi0JICAgICAgIGJmZF92bWEuICAqLwotCSAgICBiZmRfdm1hIHJlbG9jX2JpdHMgPSAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotCSAgICBpZiAoKChiZmRfdm1hKSBjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAwCi0JCSYmICgoYmZkX3ZtYSkgY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gKC0xICYgfnJlbG9jX2JpdHMpKQotCSAgICAgIHsKLQkJLyogVGhlIGFib3ZlIHJpZ2h0IHNoaWZ0IGlzIGluY29ycmVjdCBmb3IgYSBzaWduZWQKLQkJICAgdmFsdWUuICBTZWUgaWYgdHVybmluZyBvbiB0aGUgdXBwZXIgYml0cyBmaXhlcyB0aGUKLQkJICAgb3ZlcmZsb3cuICAqLwotCQlpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPiBob3d0by0+Yml0cG9zCi0JCSAgICAmJiAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAwKQotCQkgIHsKLQkJICAgIGNoZWNrIHw9ICgoYmZkX3ZtYSkgLSAxCi0JCQkgICAgICAmIH4oKGJmZF92bWEpIC0gMQotCQkJCSAgPj4gKGhvd3RvLT5yaWdodHNoaWZ0IC0gaG93dG8tPmJpdHBvcykpKTsKLQkJICAgIGlmICgoKGJmZF92bWEpIGNoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkKLQkJICAgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkJICB9Ci0JCWVsc2UKLQkJICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAgRWl0aGVyIHdlIGFyZSByZWxvY2F0aW5nIGFsbCB0aGUgd2F5LCBvciB3ZSBkb24ndCB3YW50IHRvIGFwcGx5Ci0gICAgdGhlIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IChwcm9iYWJseSBiZWNhdXNlIHRoZXJlIGlzbid0Ci0gICAgYW55IHJvb20gaW4gdGhlIG91dHB1dCBmb3JtYXQgdG8gZGVzY3JpYmUgYWRkZW5kcyB0byByZWxvY3MpCi0gICAgKi8KLQotICAvKiBUaGUgY2FzdCB0byBiZmRfdm1hIGF2b2lkcyBhIGJ1ZyBpbiB0aGUgQWxwaGEgT1NGLzEgQyBjb21waWxlcgotICAgICAoT1NGIHZlcnNpb24gMS4zLCBjb21waWxlciB2ZXJzaW9uIDMuMTEpLiAgSXQgbWlzY29tcGlsZXMgdGhlCi0gICAgIGZvbGxvd2luZyBwcm9ncmFtOgotCi0gICAgIHN0cnVjdCBzdHIKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGludCBpMDsKLSAgICAgfSBzID0geyAwIH07Ci0KLSAgICAgaW50Ci0gICAgIG1haW4gKCkKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKLQotICAgICAgIHggPSAweDEwMDAwMDAwMDsKLSAgICAgICB4IDw8PSAodW5zaWduZWQgbG9uZykgcy5pMDsKLSAgICAgICBpZiAoeCA9PSAwKQotCSBwcmludGYgKCJmYWlsZWRcbiIpOwotICAgICAgIGVsc2UKLQkgcHJpbnRmICgic3VjY2VlZGVkICglbHgpXG4iLCB4KTsKLSAgICAgfQotICAgICAqLwotCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLwotCi0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIFdhaXQgZm9yIHRoZSBkYXkgd2hlbiBhbGwgaGF2ZSB0aGUgbWFzayBpbiB0aGVtICovCi0KLSAgLyogV2hhdCB3ZSBkbzoKLSAgICAgaSBpbnN0cnVjdGlvbiB0byBiZSBsZWZ0IGFsb25lCi0gICAgIG8gb2Zmc2V0IHdpdGhpbiBpbnN0cnVjdGlvbgotICAgICByIHJlbG9jYXRpb24gb2Zmc2V0IHRvIGFwcGx5Ci0gICAgIFMgc3JjIG1hc2sKLSAgICAgRCBkc3QgbWFzawotICAgICBOIH5kc3QgbWFzawotICAgICBBIHBhcnQgMQotICAgICBCIHBhcnQgMgotICAgICBSIHJlc3VsdAotCi0gICAgIERvIHRoaXM6Ci0gICAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gICAgICAgIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUyAgICB0byBnZXQgdGhlIHNpemUgb2Zmc2V0IHdlIHdhbnQKLSAgICAgKyAgIHIgciByIHIgciByIHIgciByIHIgIHRvIGdldCB0aGUgZmluYWwgdmFsdWUgdG8gcGxhY2UKLSAgICAgYW5kICAgICAgICAgICBEIEQgRCBEIEQgIHRvIGNob3AgdG8gcmlnaHQgc2l6ZQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBBIEEgQSBBIEEKLSAgICAgQW5kIHRoaXM6Ci0gICAgIC4uLiAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICBOIE4gTiBOIE4gICAgICAgICAgICBnZXQgaW5zdHJ1Y3Rpb24KLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgLi4uICAgQiBCIEIgQiBCCi0KLSAgICAgQW5kIHRoZW46Ci0gICAgIEIgQiBCIEIgQgotICAgICBvciAgICAgICAgICAgICAgQSBBIEEgQSBBCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIFIgUiBSIFIgUiBSIFIgUiBSIFIgICAgICAgIHB1dCBpbnRvIGJmZF9wdXQ8c2l6ZT4KLSAgICAgKi8KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICggKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICB7Ci0JY2hhciB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDEpOwotCURPSVQgKHgpOwotCW92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSwgYWRkciwgMSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIGlmIChyZWxvY2F0aW9uKQotCXsKLQkgIHNob3J0IHggPSBnZXRfZGF0YSAoZGF0YSwgYWRkciwgMik7Ci0JICBET0lUICh4KTsKLQkgIG92ZXJmbG93ID0gcHV0X2RhdGEoeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSwgYWRkciwgMik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHJlbG9jYXRpb24pCi0JewotCSAgbG9uZyB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDQpOwotCSAgRE9JVCAoeCk7Ci0JICBvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEsIGFkZHIsIDQpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgLTI6Ci0gICAgICB7Ci0JbG9uZyAgeCA9IGdldF9kYXRhKGRhdGEsIGFkZHIsIDQpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUKHgpOwotCW92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSAsIGFkZHIsIDQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBEbyBub3RoaW5nICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSNpZmRlZiBCRkQ2NAotICAgICAgaWYgKHJlbG9jYXRpb24pCi0JewotCSAgYmZkX3ZtYSB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDgpOwotCSAgRE9JVCAoeCk7Ci0JICBvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEsIGFkZHIsIDgpOwotCX0KLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgfQotICBpZiAoKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KSAmJiBvdmVyZmxvdykKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKiBSZWxvY2F0ZSBhIGdpdmVuIGxvY2F0aW9uIHVzaW5nIGEgZ2l2ZW4gdmFsdWUgYW5kIGhvd3RvLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzICggaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24sCi0JCQkgICAgICBnZXRfZGF0YSwgcHV0X2RhdGEpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgICAgbG9uZyAoKmdldF9kYXRhKSgpOwotICAgICBpbnQgKCpwdXRfZGF0YSkoKTsKLXsKLSAgaW50IHNpemU7Ci0gIGJmZF92bWEgeDsKLSAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICAvKiBJZiB0aGUgc2l6ZSBpcyBuZWdhdGl2ZSwgbmVnYXRlIFJFTE9DQVRJT04uICBUaGlzIGlzbid0IHZlcnkKLSAgICAgZ2VuZXJhbC4gICovCi0gIGlmIChob3d0by0+c2l6ZSA8IDApCi0gICAgcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCi0gIC8qIEdldCB0aGUgdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHJlbG9jYXRlLiAgKi8KLSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDQ6Ci0jaWZkZWYgQkZENjQKLSAgICBjYXNlIDg6Ci0jZW5kaWYKLSAgICAgIHggPSBnZXRfZGF0YSAobG9jYXRpb24sIDAsIHNpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdy4gIEZJWE1FOiBXZSBtYXkgZHJvcCBiaXRzIGR1cmluZyB0aGUgYWRkaXRpb24KLSAgICAgd2hpY2ggd2UgZG9uJ3QgY2hlY2sgZm9yLiAgV2UgbXVzdCBlaXRoZXIgY2hlY2sgYXQgZXZlcnkgc2luZ2xlCi0gICAgIG9wZXJhdGlvbiwgd2hpY2ggd291bGQgYmUgdGVkaW91cywgb3Igd2UgbXVzdCBkbyB0aGUgY29tcHV0YXRpb25zCi0gICAgIGluIGEgdHlwZSBsYXJnZXIgdGhhbiBiZmRfdm1hLCB3aGljaCB3b3VsZCBiZSBpbmVmZmljaWVudC4gICovCi0gIG92ZXJmbG93ID0gZmFsc2U7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGNoZWNrOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2NoZWNrOwotICAgICAgYmZkX3ZtYSBhZGQ7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBzaWduZWRfYWRkOwotCi0gICAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPT0gMCkKLQl7Ci0JICBjaGVjayA9IHJlbG9jYXRpb247Ci0JICBzaWduZWRfY2hlY2sgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERyb3AgdW53YW50ZWQgYml0cyBmcm9tIHRoZSB2YWx1ZSB3ZSBhcmUgcmVsb2NhdGluZyB0by4gICovCi0JICBjaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBzaWduZWQgdmFsdWUsIHRoZSByaWdodHNoaWZ0IGp1c3QgZHJvcHBlZAotCSAgICAgbGVhZGluZyAxIGJpdHMgKGFzc3VtaW5nIHR3b3MgY29tcGxlbWVudCkuICAqLwotCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCSAgICBzaWduZWRfY2hlY2sgPSBjaGVjazsKLQkgIGVsc2UKLQkgICAgc2lnbmVkX2NoZWNrID0gKGNoZWNrCi0JCQkgICAgfCAoKGJmZF92bWEpIC0gMQotCQkJICAgICAgICYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5yaWdodHNoaWZ0KSkpOwotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4gICovCi0gICAgICBhZGQgPSB4ICYgaG93dG8tPnNyY19tYXNrOwotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlIHdpdGggYW4gYXBwcm9wcmlhdGUgc2lnbi4KLQkgVGhlIGV4cHJlc3Npb24gaW52b2x2aW5nIGhvd3RvLT5zcmNfbWFzayBpc29sYXRlcyB0aGUgdXBwZXIKLQkgYml0IG9mIHNyY19tYXNrLiAgSWYgdGhhdCBiaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSB3ZSBhcmUKLQkgYWRkaW5nLCBpdCBpcyBuZWdhdGl2ZSwgYW5kIHdlIHN1YnRyYWN0IG91dCB0aGF0IG51bWJlciB0aW1lcwotCSB0d28uICBJZiBzcmNfbWFzayBpbmNsdWRlcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBiaXQsIHRoZW4gd2UKLQkgY2FuIG5vdCBnZXQgdGhlIHVwcGVyIGJpdCwgYnV0IHRoYXQgZG9lcyBub3QgbWF0dGVyIHNpbmNlCi0JIHNpZ25lZF9hZGQgbmVlZHMgbm8gYWRqdXN0bWVudCB0byBiZWNvbWUgbmVnYXRpdmUgaW4gdGhhdAotCSBjYXNlLiAgKi8KLSAgICAgIHNpZ25lZF9hZGQgPSBhZGQ7Ci0gICAgICBpZiAoKGFkZCAmICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSkgIT0gMCkKLQlzaWduZWRfYWRkIC09ICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSA8PCAxOwotCi0gICAgICAvKiBBZGQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLCBzaGlmdGVkIHNvIHRoYXQgaXQgaXMgYQotCSBzdHJhaWdodCBudW1iZXIuICAqLwotICAgICAgaWYgKGhvd3RvLT5iaXRwb3MgPT0gMCkKLQl7Ci0JICBjaGVjayArPSBhZGQ7Ci0JICBzaWduZWRfY2hlY2sgKz0gc2lnbmVkX2FkZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7Ci0KLQkgIC8qIEZvciB0aGUgc2lnbmVkIGNhc2Ugd2UgdXNlIEFERCwgcmF0aGVyIHRoYW4gU0lHTkVEX0FERCwKLQkgICAgIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4gIFRoaXMgaXMgT0sgc2luY2Ugd2UKLQkgICAgIGV4cGxpY3RseSBoYW5kbGUgdGhlIHNpZ24gYml0cy4gICovCi0JICBpZiAoc2lnbmVkX2FkZCA+PSAwKQotCSAgICBzaWduZWRfY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7Ci0JICBlbHNlCi0JICAgIHNpZ25lZF9jaGVjayArPSAoKGFkZCA+PiBob3d0by0+Yml0cG9zKQotCQkJICAgICB8ICgoYmZkX3ZtYSkgLSAxCi0JCQkJJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPmJpdHBvcykpKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93KQotCXsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKLQotCSAgICBpZiAoc2lnbmVkX2NoZWNrID4gcmVsb2Nfc2lnbmVkX21heAotCQl8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gIFRoaXMgZXhwcmVzc2lvbiBhdm9pZHMKLQkgICAgICAgb3ZlcmZsb3cgaWYgaG93dG8tPmJpdHNpemUgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCi0JICAgICAgIGJmZF92bWEuICAqLwotCSAgICBiZmRfdm1hIHJlbG9jX3Vuc2lnbmVkX21heCA9Ci0JICAgICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0JICAgIGlmIChjaGVjayA+IHJlbG9jX3Vuc2lnbmVkX21heCkKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY19iaXRzID0gKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLQkgICAgaWYgKChjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAwCi0JCSYmICgoKGJmZF92bWEpIHNpZ25lZF9jaGVjayAmIH5yZWxvY19iaXRzKQotCQkgICAgIT0gKC0xICYgfnJlbG9jX2JpdHMpKSkKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICAvKiBQdXQgUkVMT0NBVElPTiBpbiB0aGUgcmlnaHQgYml0cy4gICovCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogQWRkIFJFTE9DQVRJT04gdG8gdGhlIHJpZ2h0IGJpdHMgb2YgWC4gICovCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKQotICAgICAgIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpOwotCi0gIC8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgY2FzZSA4OgotI2VuZGlmCi0gICAgICBwdXRfZGF0YSh4LCBsb2NhdGlvbiwgMCwgc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotfQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbnMzMmtfcmVsb2NfZGlzcCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwKLQkJCSBfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQsCi0JCQkgX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50KTsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX3JlbG9jX2ltbSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBkb19uczMya19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBfYmZkX25zMzJrX2dldF9pbW1lZGlhdGUsCi0JCQkgX2JmZF9uczMya19wdXRfaW1tZWRpYXRlKTsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCWFkZHJlc3MsIHZhbHVlLCBhZGRlbmQpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCi0gIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgYmFzaWMgcmVsb2NhdGlvbgotICAgICBhZ2FpbnN0IGEgc3ltYm9sLiAgV2Ugd2FudCB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHRvCi0gICAgIHJlbG9jYXRlIHRvLiAgVGhpcyBpcyBqdXN0IFZBTFVFLCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgcGx1cwotICAgICBBRERFTkQsIGFueSBhZGRlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxvYy4gICovCi0gIHJlbG9jYXRpb24gPSB2YWx1ZSArIGFkZGVuZDsKLQotICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBQQyByZWxhdGl2ZSwgd2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTiB0bwotICAgICB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIChjdXJyZW50bHkgaW4gUkVMT0NBVElPTikgYW5kIHRoZQotICAgICBsb2NhdGlvbiB3ZSBhcmUgcmVsb2NhdGluZy4gIFNvbWUgdGFyZ2V0cyAoZS5nLiwgaTM4Ni1hb3V0KQotICAgICBhcnJhbmdlIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZQotICAgICBvZmZzZXQgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIHN1Y2ggdGFyZ2V0cwotICAgICBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBPdGhlciB0YXJnZXRzIChlLmcuLCBtODhrYmNzIG9yIEVMRikKLSAgICAgc2ltcGx5IGxlYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcyB6ZXJvOyBmb3Igc3VjaAotICAgICB0YXJnZXRzIHBjcmVsX29mZnNldCBpcyB0cnVlLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIGRvIG5vdAotICAgICBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlCi0gICAgIHNlY3Rpb24gKHdoaWNoIGlzIGp1c3QgQUREUkVTUykuICAqLwotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgICAgICAgY29udGVudHMgKyBhZGRyZXNzKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtcGouYyBiL2JmZC9jcHUtcGouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkZGQzMy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXBqLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgUGljbyBKYXZhIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBUcmFuc21ldGEuIHNhY0Bwb2JveC5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuX21hY2ggKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNhc2VjbXAgKGluZm8tPnByaW50YWJsZV9uYW1lLCBzdHJpbmcpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0jaWYgMAotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCB8fCBhLT5tYWNoICE9IGItPm1hY2gpCi0gICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGE7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9waiwKLSAgICAwLAotICAgICJwaiIsCQkJLyogYXJjaF9uYW1lICAqLwotICAgICJwaiIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAxLAotICAgIGZhbHNlLAkJCS8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgc2Nhbl9tYWNoLAotICAgIDAsCi0gIH0sCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3BqX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3BqLAotICAwLAotICAicGoiLAkJCQkvKiBhcmNoX25hbWUgICovCi0gICJwaiIsCQkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgc2Nhbl9tYWNoLAotICAmYXJjaF9pbmZvX3N0cnVjdCBbMF0KLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXBvd2VycGMuYyBiL2JmZC9jcHUtcG93ZXJwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWYwZjgwLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtcG93ZXJwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qIEJGRCBQb3dlclBDIENQVSBkZWZpbml0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFRoZSBjb21tb24gUG93ZXJQQyBhcmNoaXRlY3R1cmUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBSUy82MDAwLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqcG93ZXJwY19jb21wYXRpYmxlCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLXBvd2VycGNfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgQkZEX0FTU0VSVCAoYS0+YXJjaCA9PSBiZmRfYXJjaF9wb3dlcnBjKTsKLSAgc3dpdGNoIChiLT5hcmNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgcmV0dXJuIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsIGIpOwotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotICAgICAgaWYgKGEtPm1hY2ggPT0gMCkKLQlyZXR1cm4gYTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQotewotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDYwMywgLyogZm9yIHRoZSBtcGM2MDMgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NjAzIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMV0KLSAgfSwKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA2MDQsIC8qIGZvciB0aGUgbXBjNjA0ICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjYwNCIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzJdCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgNDAzLCAvKiBmb3IgdGhlIDQwMyAqLwotICAgICJwb3dlcnBjIiwKLSAgICAicG93ZXJwYzo0MDMiLAotICAgIDMsCi0gICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFszXQotICB9LAotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDYwMSwgLyogZm9yIHRoZSBtcGM2MDEgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NjAxIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMAotICB9Ci19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgMCwgLyogZm9yIHRoZSBQT1dFUi9Qb3dlclBDIGNvbW1vbiBhcmNoaXRlY3R1cmUgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6Y29tbW9uIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzBdCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXJzNjAwMC5jIGIvYmZkL2NwdS1yczYwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MmFlOS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXJzNjAwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciByczYwMDAgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/Ci0gICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAotICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0Ci0gICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgotICAgV3JpdHRlbiBieSBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1IG9mIElCTQotICAgYW5kIEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFRoZSBSUy82MDAwIGFyY2hpdGVjdHVyZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFBvd2VyUEMgY29tbW9uCi0gICBhcmNoaXRlY3R1cmUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpyczYwMDBfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1yczYwMDBfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgQkZEX0FTU0VSVCAoYS0+YXJjaCA9PSBiZmRfYXJjaF9yczYwMDApOwotICBzd2l0Y2ggKGItPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLSAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICBpZiAoYi0+bWFjaCA9PSAwKQotCXJldHVybiBiOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcnM2MDAwLAotICAgIDYwMDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgInJzNjAwMCIsCi0gICAgInJzNjAwMDo2MDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICByczYwMDBfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXNoLmMgYi9iZmQvY3B1LXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTRlN2QuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIaXRhY2hpLVNIIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTcsIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjYXNlY21wIChpbmZvLT5wcmludGFibGVfbmFtZSwgc3RyaW5nKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAKLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgcmV0dXJucyB3aGV0aGVyCi0gICB0aGV5J2QgYmUgY29tcGF0aWJsZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBhOwotfQotI2VuZGlmCi0KLSNkZWZpbmUgU0hfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFswXQotI2RlZmluZSBTSDJfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFsxXQotI2RlZmluZSBTSF9EU1BfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFsyXQotI2RlZmluZSBTSDNfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFszXQotI2RlZmluZSBTSDNfRFNQX05FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbNF0KLSNkZWZpbmUgU0gzRV9ORVhUICZhcmNoX2luZm9fc3RydWN0WzVdCi0jZGVmaW5lIFNINF9ORVhUIE5VTEwKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc2gsCi0gICAgYmZkX21hY2hfc2gyLAotICAgICJzaCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAgICJzaDIiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMSwKLSAgICBmYWxzZSwJCQkvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIHNjYW5fbWFjaCwKLSAgICBTSDJfTkVYVAotICB9LAotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zaCwKLSAgICBiZmRfbWFjaF9zaF9kc3AsCi0gICAgInNoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICAgInNoLWRzcCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAxLAotICAgIGZhbHNlLAkJCS8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgc2Nhbl9tYWNoLAotICAgIFNIX0RTUF9ORVhUCi0gIH0sCi0gIHsKLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NoLAotICAgIGJmZF9tYWNoX3NoMywKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2gzIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDEsCi0gICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBzY2FuX21hY2gsCi0gICAgU0gzX05FWFQKLSAgfSwKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc2gsCi0gICAgYmZkX21hY2hfc2gzX2RzcCwKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2gzLWRzcCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAxLAotICAgIGZhbHNlLAkJCS8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgc2Nhbl9tYWNoLAotICAgIFNIM19EU1BfTkVYVAotICB9LAotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zaCwKLSAgICBiZmRfbWFjaF9zaDNlLAotICAgICJzaCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAgICJzaDNlIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDEsCi0gICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBzY2FuX21hY2gsCi0gICAgU0gzRV9ORVhUCi0gIH0sCi0gIHsKLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NoLAotICAgIGJmZF9tYWNoX3NoNCwKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2g0IiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDEsCi0gICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBzY2FuX21hY2gsCi0gICAgU0g0X05FWFQKLSAgfSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc2hfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfc2gsCi0gIGJmZF9tYWNoX3NoLAotICAic2giLAkJCQkvKiBhcmNoX25hbWUgICovCi0gICJzaCIsCQkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgc2Nhbl9tYWNoLAotICBTSF9ORVhUCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1zcGFyYy5jIGIvYmZkL2NwdS1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRiZDkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIERvbid0IG1peCAzMiBiaXQgYW5kIDY0IGJpdCBmaWxlcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnNwYXJjX2NvbXBhdGlibGUKLSAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotc3BhcmNfY29tcGF0aWJsZSAoYSwgYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5iaXRzX3Blcl93b3JkICE9IGItPmJpdHNfcGVyX3dvcmQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsIGIpOwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzpzcGFyY2xldCIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzFdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnNwYXJjbGl0ZSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzJdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY4cGx1cyIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzNdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OHBsdXNhIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNF0sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6c3BhcmNsaXRlX2xlIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNV0sCi0gIH0sCi0gIHsKLSAgICA2NCwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICA2NCwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzZdLAotICB9LAotICB7Ci0gICAgNjQsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgNjQsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjlhLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY5YSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi0gIH0KLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc3BhcmNfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyYywKLSAgICAic3BhcmMiLAotICAgICJzcGFyYyIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgZGVmYXVsdCAqLwotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMF0sCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzMwLmMgYi9iZmQvY3B1LXRpYzMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNzIzZjcuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWMzMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF90aWMzMCwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInRpYzMwIiwKLSAgInRtczMyMGMzMCIsCi0gIDIsCi0gIHRydWUsCQkJCS8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzgwLmMgYi9iZmQvY3B1LXRpYzgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjg2NmUuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciBUSSBUTVMzMjBDODAgKE1WUCkgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIHN1cHBvcnQgKGZuZkBjeWdudXMuY29tKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWM4MF9hcmNoID0KLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfdGljODAsCQkvKiBiZmRfYXJjaGl0ZWN0dXJlIGVudW0gKi8KLSAgICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ0aWM4MCIsCQkJLyogYXJjaGl0ZWN0dXJlIG5hbWUgKi8KLSAgICAidGljODAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMiwJCQkJLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8KLSAgICB0cnVlLAkJCS8qIGRlZmF1bHQgbWFjaGluZSBmb3IgYXJjaGl0ZWN0dXJlICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICBOVUxMLAkJCQkvKiBQb2ludGVyIHRvIG5leHQgaW4gY2hhaW4gKi8KLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdjg1MC5jIGIvYmZkL2NwdS12ODUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOTQxM2QuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS12ODUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBORUMgVjg1MCBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLXN0YXRpYyBib29sZWFuIAotc2NhbiAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqIGluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiBzdHJpbmc7Ci17Ci0gIGNvbnN0IGNoYXIgKnB0cl9zcmM7Ci0gIGNvbnN0IGNoYXIgKnB0cl90c3Q7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiBGaXJzdCB0ZXN0IGZvciBhbiBleGFjdCBtYXRjaCAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWUgaG93IG11Y2ggb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBtYXRjaGVzIHdpdGggdGhlCi0gICAgIGFyY2hpdGVjdHVyZSwgZWcgdGhlIHN0cmluZyBtNjhrOjY4MDIwIHdvdWxkIG1hdGNoIHRoZSBtNjhrIGVudHJ5Ci0gICAgIHVwIHRvIHRoZSA6LCB0aGVuIHdlIGdldCBsZWZ0IHdpdGggdGhlIG1hY2hpbmUgbnVtYmVyICovCi0KLSAgZm9yIChwdHJfc3JjID0gc3RyaW5nLCBwdHJfdHN0ID0gaW5mby0+YXJjaF9uYW1lOyAKLSAgICAgICAqcHRyX3NyYyAmJiAqcHRyX3RzdDsKLSAgICAgICBwdHJfc3JjKyssIHB0cl90c3QrKykgCi0gICAgewotICAgICAgaWYgKCpwdHJfc3JjICE9ICpwdHJfdHN0KSBicmVhazsKLSAgICB9Ci0KLSAgLyogQ2hld2VkIHVwIGFzIG11Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBhcyB3aWxsIG1hdGNoLCBza2lwIGFueQotICAgICBjb2xvbnMgKi8KLSAgaWYgKCpwdHJfc3JjID09ICc6JykKLSAgICBwdHJfc3JjKys7Ci0gIAotICBpZiAoKnB0cl9zcmMgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBub3RoaW5nIG1vcmUsIHRoZW4gb25seSBrZWVwIHRoaXMgb25lIGlmIGl0IGlzIHRoZSBkZWZhdWx0Ci0JIG1hY2hpbmUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCi0gICAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gICAgfQotCi0gIG51bWJlciA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnB0cl9zcmMpKQotICAgIHsKLSAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgKiBwdHJfc3JjICAtICcwJzsKLSAgICAgIHB0cl9zcmMrKzsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW1iZXIpIAotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgYXJjaCA9IGJmZF9hcmNoX3Y4NTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiBhcmNoID0gYmZkX2FyY2hfdjg1MDsgYnJlYWs7Ci0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXJjaCAhPSBpbmZvLT5hcmNoKSAKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG51bWJlciAhPSBpbmZvLT5tYWNoKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBOKG51bWJlciwgcHJpbnQsIGRlZmF1bHQsIG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX3Y4NTAsIG51bWJlciwgInY4NTAiLCBwcmludCwgMiwgZGVmYXVsdCwgXAotICAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KLQotI2RlZmluZSBORVhUIE5VTEwKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoYmZkX21hY2hfdjg1MGUsICAidjg1MGUiLCAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTiAoYmZkX21hY2hfdjg1MGVhLCAidjg1MGVhIiwgZmFsc2UsIE5VTEwpCi19OwotCi0jdW5kZWYgTkVYVAotI2RlZmluZSBORVhUICZhcmNoX2luZm9fc3RydWN0WzBdCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdjg1MF9hcmNoID0KLSAgTiAoYmZkX21hY2hfdjg1MCwgInY4NTAiLCB0cnVlLCBORVhUKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdmF4LmMgYi9iZmQvY3B1LXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM2ZDM5Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtdmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIHZheCBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdmF4X2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF92YXgsCi0gICAgMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAidmF4IiwKLSAgICAidmF4IiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS13NjUuYyBiL2JmZC9jcHUtdzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjY4YjMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBXREMgNjU4MTYgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1YmxpdzY1ZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3UgdzY1b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcChzdHJpbmcsInc2NSIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywidzY1ODE2IikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdzY1X2FyY2ggPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMjQsCQkJCS8qIDI0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3c2NSwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInc2NSIsCQkJLyogYXJjaF9uYW1lICAqLwotICAidzY1IiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXdlMzJrLmMgYi9iZmQvY3B1LXdlMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGNiYzEuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13ZTMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciB3ZTMyayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGNzLndpZGVuZXIuZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfd2UzMmtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3dlMzJrLAotICAgIDMyMDAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ3ZTMyayIsCi0gICAgIndlMzJrOjMyMDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS16OGsuYyBiL2JmZC9jcHUtejhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2U4ZWIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS16OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgWjgwMG4gYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0jaWYgMAkJCQkvKiBub3QgdXNlZCBjdXJyZW50bHkgKi8KLS8qCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG8xNl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ob3d0bzhfRkZubl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotICBsb25nIHggPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGFib3J0ICgpOwotICBIT1dUT19QUkVQQVJFIChyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzggKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYWJvcnQgKCk7Ci0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2Ci09IE5FV0hPV1RPIChob3d0bzE2X2NhbGxiYWNrLCAiYWJzMTYiLCAxLCBmYWxzZSwgZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAotPSBORVdIT1dUTyAoaG93dG84X2NhbGxiYWNrLCAiYWJzOCIsIDAsIGZhbHNlLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgotPSBORVdIT1dUTyAoaG93dG84X0ZGbm5fY2FsbGJhY2ssICJmZjAwK2FiczgiLCAwLCBmYWxzZSwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCi09IE5FV0hPV1RPIChob3d0bzhfcGNyZWxfY2FsbGJhY2ssICJwY3JlbDgiLCAwLCBmYWxzZSwgdHJ1ZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJmhvd3RvXzE2OwotICAgIGNhc2UgQkZEX1JFTE9DXzhfRkZubjoKLSAgICAgIHJldHVybiAmaG93dG9fOF9GRm5uOwotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICByZXR1cm4gJmhvd3RvXzg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotI2VuZGlmCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoICgpOwotCi1zdGF0aWMgYm9vbGVhbgotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjbXAgKHN0cmluZywgIno4MDAxIikgPT0gMCB8fCBzdHJjbXAgKHN0cmluZywgIno4ayIpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAxID09IGluZm8tPm1hY2g7Ci0gICAgfQotICBpZiAoc3RyY21wIChzdHJpbmcsICJ6ODAwMiIpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAyID09IGluZm8tPm1hY2g7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSwgYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gYTsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIHszMiwgMzIsIDgsIGJmZF9hcmNoX3o4aywgYmZkX21hY2hfejgwMDEsICJ6OGsiLCAiejgwMDEiLCAxLCBmYWxzZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAwLH0sCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3o4a19hcmNoID0KLXsKLSAgMzIsIDE2LCA4LCBiZmRfYXJjaF96OGssIGJmZF9tYWNoX3o4MDAyLCAiejhrIiwgIno4MDAyIiwgMSwgdHJ1ZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAmYXJjaF9pbmZvX3N0cnVjdFswXSwKLX07CmRpZmYgLS1naXQgYS9iZmQvZGVtbzY0LmMgYi9iZmQvZGVtbzY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTM4MWQuLjAwMDAwMDAKLS0tIGEvYmZkL2RlbW82NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGRlbW9uc3RyYXRpb24gNjQtYml0IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLSNkZWZpbmUgTVkoT1ApIENBVChkZW1vXzY0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAgImRlbW82NCIKLSNpbmNsdWRlICJhb3V0ZjEuaCIKZGlmZiAtLWdpdCBhL2JmZC9kZXAtaW4uc2VkIGIvYmZkL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGRkZTAuLjAwMDAwMDAKLS0tIGEvYmZkL2RlcC1pbi5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi06bG9vcAotL1xcJC9OCi1zL1xcXG4gKi8gL2cKLXQgbG9vcAotCi1zIVwubzohLmxvOiEKLXMhIEBCRkRfSEAhIWcKLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQFNSQ0RJUkAvISFnCi1zIWhvc3RzL1teIF0qXC5oICEgIWcKLXMvIHN5c2RlcC5oLy9nCi1zISBcLlwuL2JmZC9zeXNkZXAuaCEhZwotcy8gbGliYmZkLmgvL2cKLXMvIGNvbmZpZy5oLy9nCi1zISBcJChJTkNESVIpL2ZvcGVuLVteIF0qXC5oISFnCi1zISBcJChJTkNESVIpL2Fuc2lkZWNsXC5oISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLXMvICo6LzovZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2JmZC9kb2MvQ2hhbmdlTG9nIGIvYmZkL2RvYy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllODIwN2EuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotVGh1IEZlYiAgNCAyMzoyMTozNiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggY3VycmVudCBhdXRvY29uZi9hdXRvbWFrZS4KLQotVGh1IEp1bCAyMyAwOTozNjo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmRpbnQudGV4aSAoQkZEIEVMRiBwcm9jZXNzb3IgcmVxdWlyZWQpOiBBZGQgcGFyYWdyYXBoCi0JZGVzY3JpYmluZyB0aGUgbmVjZXNzaXR5IHRvIGNyZWF0ZSAiaW5jbHVkZS9lbGYvQ1BVLmgiLgotCi1UaHUgTWF5ICA3IDE0OjQ1OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZXcubyk6IEFkZCAtSSBvcHRpb25zIGZvciBpbnRsIHNyY2RpciBhbmQKLQlvYmpkaXIuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAyNyAyMDoxOToyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGludC50ZXhpOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfVEVYSU5GT1MpOiBOZXcgdmFyaWFibGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAxMyAxNjo0ODo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByICA2IDE0OjA2OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFNUQUdFU1RVRkYpOiBSZW1vdmUgdmFyaWFibGUuCi0JKENMRUFORklMRVMpOiBEb24ndCByZW1vdmUgJChTVEFHRVNUVUZGKS4KLQkoRElTVENMRUFORklMRVMsIE1BSU5UQUlORVJDTEVBTkZJTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDE2OjI1OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2hldy5jIChza2lwX3doaXRlX2FuZF9zdGFydHMpOiBSZW1vdmUgdW51c2VkIGRlY2xhcmF0aW9uLgotCShza2lwX3doaXRlX2FuZF9zdGFycyk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkoc2tpcF90cmFpbGluZ19uZXdsaW5lcywgcGFyYW1zdHVmZiwgY291cmllcml6ZSk6IExpa2V3aXNlLgotCShidWxsZXRpemUsIGRvX2ZhbmN5X3N0dWZmLCBpc2NvbW1hbmQpOiBMaWtld2lzZS4KLQkoa2lsbF9ib2d1c19saW5lcywgbmV4dHdvcmQsIG1haW4pOiBMaWtld2lzZS4KLQkobWFuZ2xlY29tbWVudHMpOiBDb21tZW50IG91dC4KLQkob3V0cHV0ZG90cywga2lsbF9ib2d1c19saW5lcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCShwZXJmb3JtLCBjb21waWxlKTogTGlrZXdpc2UuCi0JKGNvdXJpZXJpemUpOiBGdWxseSBwYXJlbnRoZXNpemUgZXhwcmVzc2lvbi4KLQkoY29weV9wYXN0X25ld2xpbmUpOiBEZWNsYXJlIHJldHVybiB2YWx1ZS4KLQkocHJpbnQpOiBDaGFuZ2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKG1haW4pOiBDYWxsIHVzYWdlIGZvciBhbiB1bnJlY29nbml6ZWQgb3B0aW9uLgotCi1GcmkgRmViIDEzIDE0OjM3OjE0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEphbiAyNiAxNTozODozNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZG9jLnN0ciAoYm9keXRleHQpOiBEb24ndCBvdXRwdXQgQCogYXQgdGhlIGVuZC4KLQkqIGNoZXcuYyAoa2lsbF9ib2d1c19saW5lcyk6IE1ha2Ugc3VyZSB0aGF0IGEgcGVyaW9kIGF0IHRoZQotCWJlZ2lubmluZyBpcyByZWNvZ25pemVkLgotCShpbmRlbnQpOiBEb24ndCBwdXQgaW5kZW50YXRpb24gYXQgdGhlIGVuZC4KLQkoY29weV9wYXN0X25ld2xpbmUpOiBFeHBhbmQgdGFicy4KLQkqIE1ha2VmaWxlLmFtIChzLXJlbG9jLCBzLXN5bXMpOiBEZXBlbmQgb24gZG9jLnN0ci4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgT2N0ICAxIDE0OjQxOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZC5oKTogRG9uJ3QgdXNlIGNwdS1oODMwMC5jLCBjcHUtaTk2MC5jLCBvcgotCWVsZmNvZGUuaCBhcyBpbnB1dCBmaWxlczsgdGhleSBkb24ndCBjb250cmlidXRlIGFueXRoaW5nLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgMTUgMDQ6NTU6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBJbnZva2UgJChNS0RPQykgYXMgLi8kKE1LRE9DKS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXVnICAxIDEyOjU5OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENDX0ZPUl9CVUlMRCk6IERvbid0IHNldCBleHBsaWNpdGx5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKdWwgMzEgMjA6MDA6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQotVHVlIEp1bCAyMiAxNDo0NDowMCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2Ugc3RhbXAtKiBmaWxlcyB0byBzLSogZmlsZXMuICBVc2UgYmZkdC50ZXhpCi0JcmF0aGVyIHRoYW4gYmZkLnRleGkuCi0gCShET0NGSUxFUyk6IENoYW5nZSBiZmQudGV4aSB0byBiZmR0LnRleGkuCi0JKiBiZmQudGV4aW5mbzogSW5jbHVkZSBiZmR0LnRleGksIG5vdCBiZmQudGV4aS4KLQotTW9uIEp1biAxNiAxNTozMzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQywgQ0ZMQUdTKTogU3Vic3RpdHV0ZSBmcm9tIGNvbmZpZ3VyZSBzY3JpcHQuCi0JRnJvbSBKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgotCi1UdWUgQXByIDE1IDEyOjM3OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFVzZSBta2luc3RhbGxkaXJzIHRvIGJ1aWxkCi0JJChpbmZvZGlyKS4KLQotVHVlIEFwciAgOCAxMjo0OTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBQZXJtaXQgaW5mbyBmaWxlcyB0byBiZSBpbiBzcmNkaXIuCi0JKHN0YW1wLSopOiBBZGQgYSBzdGFtcC1YIHRhcmdldCBmb3IgZWFjaCBYLnRleGkgdGFyZ2V0LgotCSgqLnRleGkpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLVguCi0JKGNsZWFuKTogUmVtb3ZlIHN0YW1wLSouCi0JKGRpc3RjbGVhbik6IERlcGVuZCB1cG9uIG1vc3RseWNsZWFuLiAgUmVtb3ZlIHN0YW1wLSouICBEb24ndAotCXJlbW92ZSAkKERPQ0ZJTEVTKS4KLQotTW9uIEFwciAgNyAxNToyMzoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgKi5pbmZvIGZpbGVzLgotCi1UaHUgRmViIDEzIDIwOjUwOjAyIDE5OTcgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAcHJvZ2lzLmRlKQotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCi1UdWUgSnVuIDE4IDE4OjMyOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2hldy5jIChraWxsX2JvZ3VzX2xpbmVzKTogUmVzZXQgc2wgd2hlbiBub3QgYXQgdGhlIHN0YXJ0IG9mIGEKLQlsaW5lLiAgRnJvbSBVd2UgT2hzZSA8dXdlQHRpcmthLmd1bi5kZT4uCi0KLVR1ZSBKYW4gMzAgMTQ6MTA6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogRGVwZW5kIHVwb24gcHJvdG8uc3RyLgotCShsaWJjb2ZmLmgsIGJmZC5oKTogTGlrZXdpc2UuCi0KLUZyaSBOb3YgIDMgMTQ6NDY6NDggMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTUkNET0MsIFNSQ1BST1QsIGNvcmUudGV4aSwgYmZkLmgpOiAgVXNlIGNvcmVmaWxlLmMsIAotCXJlbmFtZWQgZnJvbSBjb3JlLmMuCi0KLVdlZCBOb3YgIDEgMTQ6Mjg6MjMgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNoZXcuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0KLUZyaSBPY3QgIDYgMTY6MjM6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBPbmx5IHJlbWFrZSB0aGlzIE1ha2VmaWxlLgotCi1XZWQgT2N0ICA0IDE1OjUxOjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjaGV3LmM6IEluY2x1ZGUgPHN0ZGlvLmg+LgotCi1UdWUgU2VwIDEyIDE4OjE0OjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCi1UaHUgQXVnIDMxIDEyOjE4OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogQWRkIGFkZGl0aW9uYWwgI2VuZGlmIGF0IGVuZCBvZiBiZmQuaCBpZgotCV9fY3BsdXNwbHVzIGlzIGRlZmluZWQuCi0KLVR1ZSBOb3YgMjkgMTY6MTM6MzQgMTk5NCAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2hldy5jICh3cml0ZV9idWZmZXIpOiBOZXcgYXJndW1lbnQgYGYnLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgotCShzdGRvdXQsIHN0ZGVyciwgcHJpbnQsIGRyb3AsIGlkcm9wKTogTmV3IGZvcnRoIHdvcmRzLgotCSogcHJvdG8uc3RyIChDT01NRU5UKTogTmV3IGNvbW1hbmQuCi0JKiBkb2Muc3RyIChDT01NRU5UKTogTGlrZXdpc2UuCi0KLU1vbiBTZXAgMTIgMTE6NDQ6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBSZW1vdmUgY3Rvci50ZXhpLgotCShJUFJPVE9TKTogUmVtb3ZlIGN0b3IuaXAuCi0JKFNSQ0lQUk9UKTogUmVtb3ZlICQoc3JjZGlyKS8uLi9jdG9yLmMuCi0JKGN0b3IudGV4aSk6IFJlbW92ZSB0YXJnZXQuCi0JKGxpYmJmZC5oKTogUmVtb3ZlIGRlcGVuZGVuY3kgb24gJChzcmNkaXIpLy4uL2N0b3IuYy4gIFJlbW92ZQotCSQoTUtET0MpIHJ1biBvbiAkKHNyY2RpcikvLi4vY3Rvci5jLgotCSogYmZkLnRleGluZm8gKENvbnN0cnVjdG9ycyk6IFJlbW92ZSBzZWN0aW9uLgotCi1GcmkgU2VwICAyIDEzOjMzOjQ0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogSW5jbHVkZSBhc3NlcnQuaC4gIEFkZGVkIHByb3RvdHlwZXMgZm9yIG1vc3QgZnVuY3Rpb25zLgotCUNoYW5nZWQgbW9zdCB1c2VzIG9mIGludCB0byBsb25nLiAgRG8gYm91bmRzIGNoZWNraW5nIG9uIHRoZQotCXN0YWNrcy4gIEFkZGVkIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBkb2N1bWVudGluZyBtb3N0IG9mIHRoZQotCWludHJpbnNpY3MuICBMb3RzIG9mIHdoaXRlc3BhY2UgY2hhbmdlcy4gIFJlLW9yZGVyZWQgc29tZQotCWZ1bmN0aW9ucy4KLQkoZGllLCBjaGVja19yYW5nZSwgaWNoZWNrX3JhbmdlKTogTmV3IGZ1bmN0aW9ucy4KLQkoc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMsIHByaW50X3N0YWNrX2xldmVsKTogTmV3IGZ1bmN0aW9ucy4KLQkodHJhbnNsYXRlY29tbWVudHMpOiBEb24ndCBpbnNlcnQgdGFiIGJlZm9yZSAiLyoiLgotCShpc2NvbW1hbmQpOiBNaW5pbXVtIGNvbW1hbmQgbGVuZ3RoIGlzIG5vdyA0LgotCShuZXh0d29yZCk6IEhhbmRsZSBzb21lIFwtc2VxdWVuY2VzLgotCShwdXNoX2FkZHIpOiBEZWxldGVkLgotCShtYWluKTogQWRkIG5ldyBpbnRyaW5zaWNzIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIGFuZAotCXByaW50X3N0YWNrX2xldmVsLiAgQ29tcGxhaW4gYXQgZW5kIGlmIHN0YWNrIGNvbnRhaW5zIG1vcmUgdGhhbgotCW9uZSBlbGVtZW50LCBvciBsZXNzLgotCShyZW1jaGFyKTogTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5IGJlZm9yZSBjaG9wcGluZyBvZmYgYQotCWNoYXJhY3Rlci4KLQotCSogZG9jLnN0ciwgcHJvdG8uc3RyOiBIYW5kbGUgbmV3IGNvbW1hbmRzIFNFTlVNLCBFTlVNLCBFTlVNWCwKLQlFTlVNRVEsIEVOVU1FUVgsIEVOVU1ET0MuCi0KLVdlZCBKYW4gMTIgMTg6Mzc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogQWRkZWQgTGlua2VyIEZ1bmN0aW9ucyBub2RlLgotCSogZG9jL01ha2VmaWxlLmluIChET0NGSUxFUyk6IEFkZGVkIGxpbmtlci50ZXhpLgotCShTUkNET0MpOiBBZGRlZCBsaW5rZXIuYy4KLQkobGlua2VyLnRleGkpOiBOZXcgdGFyZ2V0LgotCi1UdWUgSmFuICA0IDEwOjUyOjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiBEb24ndCByZWx5IG9uIGEgY29ycmVjdCBkZWNsYXJhdGlvbiBvZiBleGl0LgotCShjaGV3X2V4aXQpOiBOZXcgZnVuY3Rpb24gd2hpY2gganVzdCBjYWxscyBleGl0LgotCShtYWluKTogVXNlIGl0LgotCi1Nb24gSmFuICAzIDExOjQwOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IEFkZGVkIEhhc2ggVGFibGVzIG5vZGUuCi0JKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBBZGRlZCBoYXNoLnRleGkuCi0JKFNSQ0RPQyk6IEFkZGVkIGhhc2guYy4KLQkoaGFzaC50ZXhpKTogTmV3IHRhcmdldC4KLQotVGh1IERlYyAzMCAxNjo1NzowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRGVsZXRlIGFsbCByZWZlcmVuY2VzIHRvIHNlY2xldC5jLCBzaW5jZSBpdCdzIGp1c3QKLQliZWVuIGRlbGV0ZWQuICBEb24ndCBtZW50aW9uIGhhc2guYywgbGlua2VyLmMsIG9yIGdlbmxpbmsuaCB5ZXQsCi0Jc2luY2UgdGhleSBkb24ndCBjb250YWluIGRvY3VtZW50YXRpb24geWV0IChoaW50LCBoaW50ISkuCi0KLUZyaSBOb3YgIDUgMTA6NTg6NTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogU21hbGwgY2xlYW51cHMuCi0KLUZyaSBOb3YgMTkgMDM6NDY6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXJjaHVyZXMudGV4aSk6IERlcGVuZHMgb24gJChNS0RPQykuCi0KLVR1ZSBBdWcgMTAgMTQ6MjI6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbyAoQkZEIGJhY2sgZW5kKTogRG9uJ3QgaW5jbHVkZSBlbGZjb2RlLnRleGksIHNpbmNlCi0JaXQncyBlbXB0eSBub3cgYW5kIHRoYXQgdHJpZ2dlcnMgYSBtYWtlaW5mbyBidWcuCi0KLU1vbiBBdWcgIDkgMTY6Mjc6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbyAoQkZEIGJhY2sgZW5kKTogTmV3IHNlY3Rpb24gb24gRUxGLCBpbmNsdWRlcwotCWVsZi50ZXhpIGFuZCBlbGZjb2RlLnRleGkuCi0JKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBJbmNsdWRlIGVsZi50ZXhpLCBlbGZjb2RlLnRleGkuCi0JKFNSQ0RPQyk6IEluY2x1ZGUgZWxmY29kZS5oLCBlbGYuYy4KLQkoZWxmLnRleGksIGVsZmNvZGUudGV4aSk6IE5ldyBpbnRlcm1lZGlhdGUgdGFyZ2V0cy4KLQotVGh1IEp1biAyNCAxMzo0ODoxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICguYy5vLCBjaGV3Lm8pOiBQdXQgQ0ZMQUdTIGxhc3QuCi0JKiBiZmRzdW1tLnRleGk6IE5ldyBmaWxlLCBicm9rZW4gb3V0IG9mIGJmZC50ZXhpbmZvLCB0byBzaGFyZQotCXdpdGggbGQudGV4aW5mby4KLQotTW9uIEp1biAxNCAxMjowNzowNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiByZW1vdmUgcGFyZW50ZGlyIGNydWZ0LCAKLQotV2VkIEp1biAgOSAxNjowMDozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNoZXcuby4KLQotVHVlIE1heSAyNSAxNDo0Njo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsaWJiZmQuaCk6IFVzZSBlbGZjb2RlLmgsIG5vdCBlbGYzMi5jLgotCi1Nb24gTWF5IDI0IDE1OjUwOjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjaGV3LmMgKGNvbXBpbGUpOiBBZGQgYSBjb3VwbGUgb2YgbWlzc2luZyBjYXN0cy4KLQotV2VkIE1heSAxMiAxNDo0NToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUsIGRlZmluZSB0byBiZSAkKENDKS4KLQkoY2hldy5vLCAkKE1LRE9DKSk6IEJ1aWxkIHVzaW5nIENDX0ZPUl9CVUlMRCByYXRoZXIgdGhhbiBDQywgc2luY2UKLQlpdCBtdXN0IHJ1biBvbiB0aGUgYnVpbGQgbWFjaGluZS4KLQotVHVlIEFwciAgNiAyMjozODoxMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZXcpOiAgRG9uJ3QgY29tcGlsZSBmcm9tIC5jIHRvIGV4ZWN1dGFibGUgaW4gYQotCXNpbmdsZSBzdGVwOyBpdCBwdXRzIGEgdGVtcG9yYXJ5IC5vIGZpbGVuYW1lIGludG8gdGhlIGV4ZWN1dGFibGUsCi0Jd2hpY2ggbWFrZXMgbXVsdGktc3RhZ2UgY29tcGFyaXNvbnMgZmFpbC4gIENvbXBpbGUgY2hldy5jIHRvCi0JY2hldy5vLCBhbmQgbGluayB0aGF0LCB3aGljaCBtYWtlcyBpZGVudGljYWwgZXhlY3V0YWJsZXMgZXZlcnkgdGltZS4KLQotV2VkIE1hciAyNCAxNzoyNjoyOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCB0eXBvIChiZmQudGV4aW5mbyBub3QgYmZkLnRleGlubykKLQotRnJpIE1hciAxOSAwMToxMzowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IFNpbmNlIEJGRCB2ZXJzaW9uIG51bWJlciBoYXMgYmVlbiBidW1wZWQsIGRvIHNhbWUKLQl0byAidmVyc2lvbiBudW1iZXIiIG9uIHRpdGxlIHBhZ2UsIGFuZCBlbHNld2hlcmUuICBTaG91bGQgYmUKLQlmaXhlZCB0byBleHRyYWN0IHJlYWwgdmVyc2lvbiBudW1iZXIuCi0KLVR1ZSBNYXIgMTYgMTI6MTU6MTMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCAqY2xlYW4gcnVsZXMuCi0KLU1vbiBKYW4gMTEgMTg6NDM6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGliYmZkLmgpOiBSZW1vdmVkIGR1cGxpY2F0ZSBpbml0LmMgYW5kIGxpYmJmZC5jLgotCUFkZGVkIHNlY2xldC5jLgotCShiZmQuaCk6IEFkZGVkIGRlcGVuZGVuY3kgb24gYmZkLmMgYW5kIHNlY2xldC5jLiAgQWRkZWQgc2VjbGV0LmMKLQl0byBidWlsZC4KLQotVGh1IERlYyAxNyAxOTozNTo0MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdmkgdGFyZ2V0LCBkZWZpbmUgYW5kIHVzZSAkKFRFWEkyRFZJKQotCi1UaHUgRGVjICAzIDE3OjQyOjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRFWElESVIpOiBOZXcgdmFyaWFibGUuCi0JKGJmZC5kdmkpOiBMb29rIGZvciBiZmQudGV4aW5mbyBpbiAkKHNyY2RpcikuICBHZW5lcmF0ZSBpbmRleC4KLQotCSogYmZkLnRleGluZm86IE1pbm9yIGRvYyBmaXhlcy4KLQotVGh1IE5vdiAgNSAwMzoxMzo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNsZWFudXA6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcywgd2l0aCBQQVJBTVMuCi0KLSAJKiBkb2MvY2hldy5jIChleGZ1bnN0dWZmKTogIEVsaW1pbmF0ZS4KLQkocGFyYW1zdHVmZik6ICBSZXBsYWNlIGV4ZnVuc3R1ZmYgd2l0aCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBQQVJBTVMuCi0JKiBkb2MvcHJvdG8uc3RyOiAgVXNlIHBhcmFtc3R1ZmYgcmF0aGVyIHRoYW4gZXhmdW5zdHVmZi4KLQotTW9uIEF1ZyAxNyAxMjo0MDozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiB2YXJpb3VzIHBhdGNoZXMgcHJvdmlkZWQgYnkgSG93YXJkIENodS4KLQotRnJpIEp1biAxOSAxODo1OTo1NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogIEFkZCBlbGYuYyBhcyBhIHNvdXJjZSBvZiBwcm90b3R5cGVzLgotCi1Nb24gTWF5IDExIDE4OjU1OjU5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjaGV3LmM6ICBleGl0KCkgc2hvdWxkIGJlIGRlY2xhcmVkIGJ5IGNvbmZpZyBmaWxlcywgbm90IGJ5Ci0JcG9ydGFibGUgc291cmNlIGNvZGUuICBJdHMgdHlwZSBjb3VsZCBiZSBpbnQgb3Igdm9pZCBmdW5jdGlvbi4JCi0KLU1vbiBNYXkgIDQgMTM6NDU6NTcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYW5vdGhlciBDRkxBR1MgY29ycmVjdGlvbi4KLQotVHVlIEFwciAyOCAxMDoyMTozMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBEbyB0aGUgQ0ZMQUdTIHRoaW5nLgotCi1GcmkgQXByIDEwIDIyOjM0OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBBZGQgbWFjcm8gYW5kIGRlZmF1bHQgdG8gLWcuCi0KLUZyaSBNYXIgIDYgMTg6NTM6MTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogbm93IGhhcyAtdyBzd2l0Y2ggdHVybiBvbiB3YXJuaW5ncwotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotVHVlIERlYyAxMCAyMjoxMTowNSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBidWlsZCBjaGV3IGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQ29tcGxldGUKLQkgIHRoZSBNS0RPQyBtYWNybyB0cmFuc2l0aW9uLgotCi1UdWUgRGVjIDEwIDA4OjI2OjI4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IGRvbid0IGNvcmUgZHVtcCB3aGVuIGNhbid0IG9wZW4gZmlsZQotCSogTWFrZWZpbGUuaW46IGdldCBwcm90by5zdHIgZnJvbSB0aGUgcmlnaHQgcGxhY2Ugd2hlbiBidWlsdCBpbgotCW9kZCBkaXJlY3RvcmllcwotCi1UdWUgRGVjIDEwIDA0OjA3OjI1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1TYXQgRGVjICA3IDE3OjAxOjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IE11Y2ggbW9kaWZpZWQKLQkqIHByb3RvLnN0ciwgZG9jLnN0cjogTmV3IGZpbGVzIGZvciBleHRyYWN0aW5nIHRvIHByb2R1Y3QKLQlwcm90b3R5cGVzIGFuZCBkb2N1bWVudHMgcmVzcGVjdGl2ZWx5LgotCi0KLUZyaSBEZWMgIDYgMjI6NTc6MTIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydCwgaG9zdC9zaXRlL3RhcmdldAotCSAgaW5jbHVzaW9uIGhvb2tzLCBpbnN0YWxsIHVzaW5nIElOU1RBTExfREFUQSByYXRoZXIgdGhhbiBjcCwKLQkgIGRvbid0IGVjaG8gb24gaW5zdGFsbC4KLQotVGh1IERlYyAgNSAyMjo0NjoxNyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9kb2MvTWFrZWZpbGUuYW0gYi9iZmQvZG9jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDUyNjhlLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLURPQ0ZJTEVTID0gYW91dHgudGV4aSAgYXJjaGl2ZS50ZXhpIGFyY2h1cmVzLnRleGkgXAotCWJmZHQudGV4aSAgY2FjaGUudGV4aSBjb2ZmY29kZS50ZXhpIFwKLQljb3JlLnRleGkgZWxmLnRleGkgZWxmY29kZS50ZXhpICBmb3JtYXQudGV4aSAgbGliYmZkLnRleGkgIFwKLQlvcG5jbHMudGV4aSAgcmVsb2MudGV4aSAgc2VjdGlvbi50ZXhpICBcCi0Jc3ltcy50ZXhpICB0YXJnZXRzLnRleGkgaW5pdC50ZXhpIGhhc2gudGV4aSBsaW5rZXIudGV4aQotCi1QUk9UT1MgPSBhcmNoaXZlLnAgYXJjaHVyZXMucCBiZmQucCBcCi0JIGNvcmUucCBmb3JtYXQucCBcCi0JbGliYmZkLnAgb3BuY2xzLnAgcmVsb2MucCBcCi0Jc2VjdGlvbi5wIHN5bXMucCB0YXJnZXRzLnAgIFwKLQlmb3JtYXQucCAgY29yZS5wIGluaXQucAotCi1JUFJPVE9TID0gY2FjaGUuaXAgbGliYmZkLmlwIHJlbG9jLmlwIGluaXQuaXAgYXJjaHVyZXMuaXAgY29mZmNvZGUuaXAKLQotIyBTUkNET0MsIFNSQ1BST1QsIFNSQ0lQUk9UIG9ubHkgdXNlZCB0byBzaWRlc3RlcCBTdW4gTWFrZSBidWcgaW4gaW50ZXJhY3Rpb24gCi0jIGJldHdlZW4gVlBBVEggYW5kIHN1ZmZpeCBydWxlcy4gIElmIHlvdSB1c2UgR05VIE1ha2UsIHBlcmhhcHMgb3RoZXIgTWFrZXMsCi0jIHlvdSBkb24ndCBuZWVkIHRoZXNlIHRocmVlOgotU1JDRE9DID0gJChzcmNkaXIpLy4uL2FvdXR4LmggICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jICQoc3JjZGlyKS8uLi9iZmQuYyBcCi0JJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggXAotCSQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jICQoc3JjZGlyKS8uLi9lbGYuYyBcCi0JJChzcmNkaXIpLy4uL2VsZmNvZGUuaCAgJChzcmNkaXIpLy4uL2Zvcm1hdC5jIFwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMgJChzcmNkaXIpLy4uL29wbmNscy5jIFwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYyAgJChzcmNkaXIpLy4uL3NlY3Rpb24uYyBcCi0JJChzcmNkaXIpLy4uL3N5bXMuYyAgJChzcmNkaXIpLy4uL3RhcmdldHMuYyBcCi0JJChzcmNkaXIpLy4uL2hhc2guYyAkKHNyY2RpcikvLi4vbGlua2VyLmMKLQotU1JDUFJPVCA9ICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgXAotCSQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyBcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS8uLi9yZWxvYy5jIFwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS8uLi9zeW1zLmMgXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpLy4uL2luaXQuYwotCi1TUkNJUFJPVCA9ICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpLy4uL2NwdS1oODMwMC5jIFwKLQkkKHNyY2RpcikvLi4vY3B1LWk5NjAuYyAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyBcCi0JJChzcmNkaXIpLy4uL2luaXQuYwotCi1URVhJRElSID0gJChzcmNkaXIpLy4uLy4uL3RleGluZm8vZnNmCi0KLWluZm9fVEVYSU5GT1MgPSBiZmQudGV4aW5mbwotCi1NS0RPQyA9IGNoZXckKEVYRUVYVF9GT1JfQlVJTEQpCi0KLSQoTUtET0MpOiBjaGV3Lm8KLQkkKENDX0ZPUl9CVUlMRCkgLW8gJChNS0RPQykgY2hldy5vICQoTE9BRExJQkVTKSAkKExERkxBR1MpCi0KLWNoZXcubzogY2hldy5jCi0JJChDQ19GT1JfQlVJTEQpIC1jIC1JLi4gLUkkKHNyY2RpcikvLi4gLUkkKHNyY2RpcikvLi4vLi4vaW5jbHVkZSAtSSQoc3JjZGlyKS8uLi8uLi9pbnRsIC1JLi4vLi4vaW50bCAkKEhfQ0ZMQUdTKSAkKENGTEFHUykgJChzcmNkaXIpL2NoZXcuYwotCi1wcm90b3M6IGxpYmJmZC5oIGxpYmNvZmYuaCBiZmQuaAotCi1iZmQuaW5mbyBiZmQuZHZpOiAkKERPQ0ZJTEVTKSBiZmRzdW1tLnRleGkgYmZkLnRleGluZm8KLQotIyBXZSBjYW4ndCByZXBsYWNlIHRoZXNlIHJ1bGVzIHdpdGggYW4gaW1wbGljaXQgcnVsZSwgYmVjYXVzZQotIyBtYWtlcyB3aXRob3V0IFZQQVRIIHN1cHBvcnQgY291bGRuJ3QgZmluZCB0aGUgLmggZmlsZXMgaW4gYC4uJy4KLQotIyBXZSB1c2Ugcy1YWFggdGFyZ2V0cyBzbyB0aGF0IHdlIGNhbiBkaXN0cmlidXRlIHRoZSBpbmZvIGZpbGVzLAotIyBhbmQgcGVybWl0IHBlb3BsZSB0byByZWJ1aWxkIHRoZW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBtYWtlaW5mbwotIyBwcm9ncmFtLiAgSWYgc29tZWJvZHkgdHJpZXMgdG8gcmVidWlsZCBpbmZvLCBidXQgbm9uZSBvZiB0aGUgLnRleGkKLSMgZmlsZXMgaGF2ZSBjaGFuZ2VkLCB0aGVuIHRoaXMgTWFrZWZpbGUgd2lsbCBidWlsZCBjaGV3LCBhbmQgd2lsbAotIyBidWlsZCBhbGwgb2YgdGhlIHN0YW1wIGZpbGVzLCBidXQgd2lsbCBub3QgYWN0dWFsbHkgaGF2ZSB0byByZWJ1aWxkCi0jIGJmZC5pbmZvLgotCi1zLWFvdXR4OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYW91dHguaCAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9hb3V0eC5oID5hb3V0eC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYW91dHgudG1wIGFvdXR4LnRleGkKLQl0b3VjaCBzLWFvdXR4Ci1hb3V0eC50ZXhpOiBzLWFvdXR4Ci0KLXMtYXJjaGl2ZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2FyY2hpdmUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgPmFyY2hpdmUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFyY2hpdmUudG1wIGFyY2hpdmUudGV4aQotCXRvdWNoIHMtYXJjaGl2ZQotYXJjaGl2ZS50ZXhpOiBzLWFyY2hpdmUKLQotcy1hcmNodXJlczogJChNS0RPQykgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPmFyY2h1cmVzLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhcmNodXJlcy50bXAgYXJjaHVyZXMudGV4aQotCXRvdWNoIHMtYXJjaHVyZXMKLWFyY2h1cmVzLnRleGk6IHMtYXJjaHVyZXMKLQotIyBXZSB1c2UgYmZkdC50ZXhpLCByYXRoZXIgdGhhbiBiZmQudGV4aSwgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aAotIyBiZmQudGV4aW5mbyBvbiBhbiA4LjMgZmlsZXN5c3RlbS4KLXMtYmZkOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYmZkLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2JmZC5jID5iZmQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGJmZC50bXAgYmZkdC50ZXhpCi0JdG91Y2ggcy1iZmQKLWJmZHQudGV4aTogcy1iZmQKLQotcy1jYWNoZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2NhY2hlLmMgPmNhY2hlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjYWNoZS50bXAgY2FjaGUudGV4aQotCXRvdWNoIHMtY2FjaGUKLWNhY2hlLnRleGk6IHMtY2FjaGUKLQotcy1jb2ZmY29kZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vY29mZmNvZGUuaCA+Y29mZmNvZGUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNvZmZjb2RlLnRtcCBjb2ZmY29kZS50ZXhpCi0JdG91Y2ggcy1jb2ZmY29kZQotY29mZmNvZGUudGV4aTogcy1jb2ZmY29kZQotCi1zLWNvcmU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgPmNvcmUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNvcmUudG1wIGNvcmUudGV4aQotCXRvdWNoIHMtY29yZQotY29yZS50ZXhpOiBzLWNvcmUKLQotcy1lbGY6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9lbGYuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9lbGYuYyA+ZWxmLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBlbGYudG1wIGVsZi50ZXhpCi0JdG91Y2ggcy1lbGYKLWVsZi50ZXhpOiBzLWVsZgotCi1zLWVsZmNvZGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9lbGZjb2RlLmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZWxmY29kZS5oID5lbGZjb2RlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBlbGZjb2RlLnRtcCBlbGZjb2RlLnRleGkKLQl0b3VjaCBzLWVsZmNvZGUKLWVsZmNvZGUudGV4aTogcy1lbGZjb2RlCi0KLXMtZm9ybWF0OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZm9ybWF0LmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZm9ybWF0LmMgPmZvcm1hdC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZm9ybWF0LnRtcCBmb3JtYXQudGV4aQotCXRvdWNoIHMtZm9ybWF0Ci1mb3JtYXQudGV4aTogcy1mb3JtYXQKLQotcy1saWJiZmQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9saWJiZmQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vbGliYmZkLmMgPmxpYmJmZC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQudGV4aQotCXRvdWNoIHMtbGliYmZkCi1saWJiZmQudGV4aTogcy1saWJiZmQKLQotcy1vcG5jbHM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9vcG5jbHMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgIDwkKHNyY2RpcikvLi4vb3BuY2xzLmMgPm9wbmNscy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugb3BuY2xzLnRtcCBvcG5jbHMudGV4aQotCXRvdWNoIHMtb3BuY2xzCi1vcG5jbHMudGV4aTogcy1vcG5jbHMKLQotcy1yZWxvYzogJChNS0RPQykgJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vcmVsb2MuYyA+cmVsb2MudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHJlbG9jLnRtcCByZWxvYy50ZXhpCi0JdG91Y2ggcy1yZWxvYwotcmVsb2MudGV4aTogcy1yZWxvYwotCi1zLXNlY3Rpb246ICQoTUtET0MpICQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vc2VjdGlvbi5jID5zZWN0aW9uLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBzZWN0aW9uLnRtcCBzZWN0aW9uLnRleGkKLQl0b3VjaCBzLXNlY3Rpb24KLXNlY3Rpb24udGV4aTogcy1zZWN0aW9uCi0KLXMtc3ltczogJChNS0RPQykgJChzcmNkaXIpLy4uL3N5bXMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9zeW1zLmMgPnN5bXMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHN5bXMudG1wIHN5bXMudGV4aQotCXRvdWNoIHMtc3ltcwotc3ltcy50ZXhpOiBzLXN5bXMKLQotcy10YXJnZXRzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vdGFyZ2V0cy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3RhcmdldHMuYyA+dGFyZ2V0cy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdGFyZ2V0cy50bXAgdGFyZ2V0cy50ZXhpCi0JdG91Y2ggcy10YXJnZXRzCi10YXJnZXRzLnRleGk6IHMtdGFyZ2V0cwotCi1zLWluaXQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9pbml0LmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vaW5pdC5jID5pbml0LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBpbml0LnRtcCBpbml0LnRleGkKLQl0b3VjaCBzLWluaXQKLWluaXQudGV4aTogcy1pbml0Ci0KLXMtaGFzaDogJChNS0RPQykgJChzcmNkaXIpLy4uL2hhc2guYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9oYXNoLmMgPmhhc2gudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGhhc2gudG1wIGhhc2gudGV4aQotCXRvdWNoIHMtaGFzaAotaGFzaC50ZXhpOiBzLWhhc2gKLQotcy1saW5rZXI6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9saW5rZXIuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9saW5rZXIuYyA+bGlua2VyLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBsaW5rZXIudG1wIGxpbmtlci50ZXhpCi0JdG91Y2ggcy1saW5rZXIKLWxpbmtlci50ZXhpOiBzLWxpbmtlcgotCi1saWJiZmQuaDogJChzcmNkaXIpLy4uL2xpYmJmZC1pbi5oCVwKLQkkKHNyY2RpcikvLi4vaW5pdC5jCQlcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jCQlcCi0JJChzcmNkaXIpLy4uL2NhY2hlLmMJCVwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYwkJXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jCQlcCi0JJChzcmNkaXIpL3Byb3RvLnN0cgkJXAotCSQoTUtET0MpCi0JY2F0ICQoc3JjZGlyKS8uLi9saWJiZmQtaW4uaCA+bGliYmZkLmggCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9pbml0LmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vbGliYmZkLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vY2FjaGUuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9yZWxvYy5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vZWxmLmMgPj5saWJiZmQuaAotCi1saWJjb2ZmLmg6ICQoc3JjZGlyKS8uLi9saWJjb2ZmLWluLmgJXAotCSQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oCQlcCi0JJChzcmNkaXIpL3Byb3RvLnN0cgkJXAotCSQoTUtET0MpCi0JY2F0ICQoc3JjZGlyKS8uLi9saWJjb2ZmLWluLmggPmxpYmNvZmYuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCA+PmxpYmNvZmYuaAotCi1iZmQuaDogJChzcmNkaXIpLy4uL2JmZC1pbi5oIAkJXAotCSQoc3JjZGlyKS8uLi9pbml0LmMgCQlcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jIAkJXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYyAJCVwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jIAkJXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jCQlcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMJCVwKLQkkKHNyY2RpcikvLi4vc3ltcy5jCQlcCi0JJChzcmNkaXIpLy4uL2JmZC5jCQlcCi0JJChzcmNkaXIpLy4uL2FyY2hpdmUuYwkJXAotCSQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jCQlcCi0JJChzcmNkaXIpLy4uL3RhcmdldHMuYwkJXAotCSQoc3JjZGlyKS8uLi9mb3JtYXQuYwkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vYmZkLWluLmggPmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9pbml0LmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vb3BuY2xzLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vbGliYmZkLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vc2VjdGlvbi5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vcmVsb2MuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9zeW1zLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYmZkLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYXJjaGl2ZS5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vdGFyZ2V0cy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2Zvcm1hdC5jID4+YmZkLmgJCi0JZWNobyAiI2lmZGVmIF9fY3BsdXNwbHVzIiA+PmJmZC5oCi0JZWNobyAifSIgPj5iZmQuaAotCWVjaG8gIiNlbmRpZiIgPj5iZmQuaAotCWVjaG8gIiNlbmRpZiIgPj5iZmQuaAotCi1ub2luc3RfVEVYSU5GT1MgPSBiZmRpbnQudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChNS0RPQykgKi5vCi0KLUNMRUFORklMRVMgPSBzLSogKi5wICouaXAKLQotRElTVENMRUFORklMRVMgPSBiZmQuPz8gYmZkLj8/PyBiZmQuaCBsaWJiZmQuaCBsaWJjb2ZmLmggdGV4cHV0LmxvZwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoRE9DRklMRVMpCmRpZmYgLS1naXQgYS9iZmQvZG9jL01ha2VmaWxlLmluIGIvYmZkL2RvYy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzY2FiMS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLi4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQkZEX0hPU1RfNjRCSVRfTE9ORyA9IEBCRkRfSE9TVF82NEJJVF9MT05HQAotQkZEX0hPU1RfNjRfQklUID0gQEJGRF9IT1NUXzY0X0JJVEAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEID0gQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotQkZEX0hPU1RfVV82NF9CSVQgPSBAQkZEX0hPU1RfVV82NF9CSVRACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1DT1JFRklMRSA9IEBDT1JFRklMRUAKLUNPUkVGTEFHID0gQENPUkVGTEFHQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVERFRklORVMgPSBAVERFRklORVNACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACi1XSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKLWFsbF9iYWNrZW5kcyA9IEBhbGxfYmFja2VuZHNACi1iZmRfYmFja2VuZHMgPSBAYmZkX2JhY2tlbmRzQAotYmZkX21hY2hpbmVzID0gQGJmZF9tYWNoaW5lc0AKLWwgPSBAbEAKLXRkZWZhdWx0cyA9IEB0ZGVmYXVsdHNACi13b3Jkc2l6ZSA9IEB3b3Jkc2l6ZUAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1ET0NGSUxFUyA9IGFvdXR4LnRleGkgIGFyY2hpdmUudGV4aSBhcmNodXJlcy50ZXhpIFwKLQliZmR0LnRleGkgIGNhY2hlLnRleGkgY29mZmNvZGUudGV4aSBcCi0JY29yZS50ZXhpIGVsZi50ZXhpIGVsZmNvZGUudGV4aSAgZm9ybWF0LnRleGkgIGxpYmJmZC50ZXhpICBcCi0Jb3BuY2xzLnRleGkgIHJlbG9jLnRleGkgIHNlY3Rpb24udGV4aSAgXAotCXN5bXMudGV4aSAgdGFyZ2V0cy50ZXhpIGluaXQudGV4aSBoYXNoLnRleGkgbGlua2VyLnRleGkKLQotCi1QUk9UT1MgPSBhcmNoaXZlLnAgYXJjaHVyZXMucCBiZmQucCBcCi0JIGNvcmUucCBmb3JtYXQucCBcCi0JbGliYmZkLnAgb3BuY2xzLnAgcmVsb2MucCBcCi0Jc2VjdGlvbi5wIHN5bXMucCB0YXJnZXRzLnAgIFwKLQlmb3JtYXQucCAgY29yZS5wIGluaXQucAotCi0KLUlQUk9UT1MgPSBjYWNoZS5pcCBsaWJiZmQuaXAgcmVsb2MuaXAgaW5pdC5pcCBhcmNodXJlcy5pcCBjb2ZmY29kZS5pcAotCi0jIFNSQ0RPQywgU1JDUFJPVCwgU1JDSVBST1Qgb25seSB1c2VkIHRvIHNpZGVzdGVwIFN1biBNYWtlIGJ1ZyBpbiBpbnRlcmFjdGlvbiAKLSMgYmV0d2VlbiBWUEFUSCBhbmQgc3VmZml4IHJ1bGVzLiAgSWYgeW91IHVzZSBHTlUgTWFrZSwgcGVyaGFwcyBvdGhlciBNYWtlcywKLSMgeW91IGRvbid0IG5lZWQgdGhlc2UgdGhyZWU6Ci1TUkNET0MgPSAkKHNyY2RpcikvLi4vYW91dHguaCAgJChzcmNkaXIpLy4uL2FyY2hpdmUuYyBcCi0JJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgJChzcmNkaXIpLy4uL2JmZC5jIFwKLQkkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCBcCi0JJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgJChzcmNkaXIpLy4uL2VsZi5jIFwKLQkkKHNyY2RpcikvLi4vZWxmY29kZS5oICAkKHNyY2RpcikvLi4vZm9ybWF0LmMgXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYyAkKHNyY2RpcikvLi4vb3BuY2xzLmMgXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jICAkKHNyY2RpcikvLi4vc2VjdGlvbi5jIFwKLQkkKHNyY2RpcikvLi4vc3ltcy5jICAkKHNyY2RpcikvLi4vdGFyZ2V0cy5jIFwKLQkkKHNyY2RpcikvLi4vaGFzaC5jICQoc3JjZGlyKS8uLi9saW5rZXIuYwotCi0KLVNSQ1BST1QgPSAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKLQkkKHNyY2RpcikvLi4vYmZkLmMgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgXAotCSQoc3JjZGlyKS8uLi9mb3JtYXQuYyAkKHNyY2RpcikvLi4vbGliYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9vcG5jbHMuYyAkKHNyY2RpcikvLi4vcmVsb2MuYyBcCi0JJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAkKHNyY2RpcikvLi4vc3ltcy5jIFwKLQkkKHNyY2RpcikvLi4vdGFyZ2V0cy5jICQoc3JjZGlyKS8uLi9pbml0LmMKLQotCi1TUkNJUFJPVCA9ICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpLy4uL2NwdS1oODMwMC5jIFwKLQkkKHNyY2RpcikvLi4vY3B1LWk5NjAuYyAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyBcCi0JJChzcmNkaXIpLy4uL2luaXQuYwotCi0KLVRFWElESVIgPSAkKHNyY2RpcikvLi4vLi4vdGV4aW5mby9mc2YKLQotaW5mb19URVhJTkZPUyA9IGJmZC50ZXhpbmZvCi0KLU1LRE9DID0gY2hldyQoRVhFRVhUX0ZPUl9CVUlMRCkKLQotbm9pbnN0X1RFWElORk9TID0gYmZkaW50LnRleGkKLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoTUtET0MpICoubwotCi1DTEVBTkZJTEVTID0gcy0qICoucCAqLmlwCi0KLURJU1RDTEVBTkZJTEVTID0gYmZkLj8/IGJmZC4/Pz8gYmZkLmggbGliYmZkLmggbGliY29mZi5oIHRleHB1dC5sb2cKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSAkKERPQ0ZJTEVTKQotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IC4uL2NvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLVRFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4Ci1JTkZPX0RFUFMgPSBiZmQuaW5mbwotRFZJUyA9IGJmZC5kdmkKLVRFWElORk9TID0gYmZkLnRleGluZm8KLURJU1RfQ09NTU9OID0gIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbgotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IGd0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuZHZpIC5pbmZvIC5wcyAudGV4aSAudGV4aW5mbyAudHhpCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIGRvYy9NYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotCi1iZmQuaW5mbzogYmZkLnRleGluZm8KLWJmZC5kdmk6IGJmZC50ZXhpbmZvCi0KLQotRFZJUFMgPSBkdmlwcwotCi0udGV4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50ZXhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50eGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotLmR2aS5wczoKLQkkKERWSVBTKSAkPCAtbyAkQAotCi1pbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5mb2RpcikKLQlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGlmaWxlIGluIGBjZCAkJGQgJiYgZWNobyAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldYDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZC8kJGlmaWxlOyB0aGVuIFwKLQkgICAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGUiOyBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGU7IFwKLQkgICAgZWxzZSA6IDsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JQCQoUE9TVF9JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIjtcCi0JICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSB8fCA6O1wKLQkgIGRvbmU7IFwKLQllbHNlIDogOyBmaQotCi11bmluc3RhbGwtaW5mbzoKLQkkKFBSRV9VTklOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaWk9eWVzOyBcCi0JZWxzZSBpaT07IGZpOyBcCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAteiAiJGlpIiBcCi0JICAgIHx8IGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIC0tcmVtb3ZlICQkZmlsZTsgXAotCWRvbmUKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIChjZCAkKERFU1RESVIpJChpbmZvZGlyKSAmJiBybSAtZiAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldKTsgXAotCWRvbmUKLQotZGlzdC1pbmZvOiAkKElORk9fREVQUykKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgZmlsZSBpbiBgY2QgJCRkICYmIGV2YWwgZWNobyAkJGJhc2UqYDsgZG8gXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1tb3N0bHljbGVhbi1hbWluZm86Ci0JLXJtIC1mIGJmZC5hdXggYmZkLmNwIGJmZC5jcHMgYmZkLmR2aSBiZmQuZm4gYmZkLmZucyBiZmQua3kgYmZkLmt5cyBcCi0JICBiZmQucHMgYmZkLmxvZyBiZmQucGcgYmZkLnRvYyBiZmQudHAgYmZkLnRwcyBiZmQudnIgYmZkLnZycyBcCi0JICBiZmQub3AgYmZkLnRyIGJmZC5jdiBiZmQuY24KLQotY2xlYW4tYW1pbmZvOgotCi1kaXN0Y2xlYW4tYW1pbmZvOgotCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKLQlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKLQkgIHJtIC1mICQkaTsgXAotCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCi0JICAgIHJtIC1mICQkaS1bMC05XSo7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCi10YWdzOiBUQUdTCi1UQUdTOgotCi0KLWRpc3RkaXIgPSAkKHRvcF9idWlsZGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotCi1zdWJkaXIgPSBkb2MKLQotZGlzdGRpcjogJChESVNURklMRVMpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tYW0KLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktYW0KLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLWFtCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi1pbnN0YWxsLWV4ZWMtYW06Ci1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotCi1pbnN0YWxsLWRhdGEtYW06Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1hbQotdW5pbnN0YWxsLWFtOgotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLWFsbC1hbTogTWFrZWZpbGUKLWFsbC1yZWRpcmVjdDogYWxsLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczoKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1jbGVhbi1hbTogIGNsZWFuLWFtaW5mbyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1hbQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0KLS5QSE9OWTogaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIG1vc3RseWNsZWFuLWFtaW5mbyBcCi1kaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyB0YWdzIGRpc3RkaXIgXAotaW5mby1hbSBpbmZvIGR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBcCi1pbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAotaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBcCi1hbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotJChNS0RPQyk6IGNoZXcubwotCSQoQ0NfRk9SX0JVSUxEKSAtbyAkKE1LRE9DKSBjaGV3Lm8gJChMT0FETElCRVMpICQoTERGTEFHUykKLQotY2hldy5vOiBjaGV3LmMKLQkkKENDX0ZPUl9CVUlMRCkgLWMgLUkuLiAtSSQoc3JjZGlyKS8uLiAtSSQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlIC1JJChzcmNkaXIpLy4uLy4uL2ludGwgLUkuLi8uLi9pbnRsICQoSF9DRkxBR1MpICQoQ0ZMQUdTKSAkKHNyY2RpcikvY2hldy5jCi0KLXByb3RvczogbGliYmZkLmggbGliY29mZi5oIGJmZC5oCi0KLWJmZC5pbmZvIGJmZC5kdmk6ICQoRE9DRklMRVMpIGJmZHN1bW0udGV4aSBiZmQudGV4aW5mbwotCi0jIFdlIGNhbid0IHJlcGxhY2UgdGhlc2UgcnVsZXMgd2l0aCBhbiBpbXBsaWNpdCBydWxlLCBiZWNhdXNlCi0jIG1ha2VzIHdpdGhvdXQgVlBBVEggc3VwcG9ydCBjb3VsZG4ndCBmaW5kIHRoZSAuaCBmaWxlcyBpbiBgLi4nLgotCi0jIFdlIHVzZSBzLVhYWCB0YXJnZXRzIHNvIHRoYXQgd2UgY2FuIGRpc3RyaWJ1dGUgdGhlIGluZm8gZmlsZXMsCi0jIGFuZCBwZXJtaXQgcGVvcGxlIHRvIHJlYnVpbGQgdGhlbSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIG1ha2VpbmZvCi0jIHByb2dyYW0uICBJZiBzb21lYm9keSB0cmllcyB0byByZWJ1aWxkIGluZm8sIGJ1dCBub25lIG9mIHRoZSAudGV4aQotIyBmaWxlcyBoYXZlIGNoYW5nZWQsIHRoZW4gdGhpcyBNYWtlZmlsZSB3aWxsIGJ1aWxkIGNoZXcsIGFuZCB3aWxsCi0jIGJ1aWxkIGFsbCBvZiB0aGUgc3RhbXAgZmlsZXMsIGJ1dCB3aWxsIG5vdCBhY3R1YWxseSBoYXZlIHRvIHJlYnVpbGQKLSMgYmZkLmluZm8uCi0KLXMtYW91dHg6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hb3V0eC5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FvdXR4LmggPmFvdXR4LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhb3V0eC50bXAgYW91dHgudGV4aQotCXRvdWNoIHMtYW91dHgKLWFvdXR4LnRleGk6IHMtYW91dHgKLQotcy1hcmNoaXZlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+YXJjaGl2ZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYXJjaGl2ZS50bXAgYXJjaGl2ZS50ZXhpCi0JdG91Y2ggcy1hcmNoaXZlCi1hcmNoaXZlLnRleGk6IHMtYXJjaGl2ZQotCi1zLWFyY2h1cmVzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+YXJjaHVyZXMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFyY2h1cmVzLnRtcCBhcmNodXJlcy50ZXhpCi0JdG91Y2ggcy1hcmNodXJlcwotYXJjaHVyZXMudGV4aTogcy1hcmNodXJlcwotCi0jIFdlIHVzZSBiZmR0LnRleGksIHJhdGhlciB0aGFuIGJmZC50ZXhpLCB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoCi0jIGJmZC50ZXhpbmZvIG9uIGFuIDguMyBmaWxlc3lzdGVtLgotcy1iZmQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vYmZkLmMgPmJmZC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLnRtcCBiZmR0LnRleGkKLQl0b3VjaCBzLWJmZAotYmZkdC50ZXhpOiBzLWJmZAotCi1zLWNhY2hlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vY2FjaGUuYyA+Y2FjaGUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNhY2hlLnRtcCBjYWNoZS50ZXhpCi0JdG91Y2ggcy1jYWNoZQotY2FjaGUudGV4aTogcy1jYWNoZQotCi1zLWNvZmZjb2RlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oID5jb2ZmY29kZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY29mZmNvZGUudG1wIGNvZmZjb2RlLnRleGkKLQl0b3VjaCBzLWNvZmZjb2RlCi1jb2ZmY29kZS50ZXhpOiBzLWNvZmZjb2RlCi0KLXMtY29yZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vY29yZWZpbGUuYyA+Y29yZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY29yZS50bXAgY29yZS50ZXhpCi0JdG91Y2ggcy1jb3JlCi1jb3JlLnRleGk6IHMtY29yZQotCi1zLWVsZjogJChNS0RPQykgJChzcmNkaXIpLy4uL2VsZi5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2VsZi5jID5lbGYudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGVsZi50bXAgZWxmLnRleGkKLQl0b3VjaCBzLWVsZgotZWxmLnRleGk6IHMtZWxmCi0KLXMtZWxmY29kZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2VsZmNvZGUuaCAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9lbGZjb2RlLmggPmVsZmNvZGUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGVsZmNvZGUudG1wIGVsZmNvZGUudGV4aQotCXRvdWNoIHMtZWxmY29kZQotZWxmY29kZS50ZXhpOiBzLWVsZmNvZGUKLQotcy1mb3JtYXQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9mb3JtYXQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9mb3JtYXQuYyA+Zm9ybWF0LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBmb3JtYXQudG1wIGZvcm1hdC50ZXhpCi0JdG91Y2ggcy1mb3JtYXQKLWZvcm1hdC50ZXhpOiBzLWZvcm1hdAotCi1zLWxpYmJmZDogJChNS0RPQykgJChzcmNkaXIpLy4uL2xpYmJmZC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9saWJiZmQuYyA+bGliYmZkLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQudG1wIGxpYmJmZC50ZXhpCi0JdG91Y2ggcy1saWJiZmQKLWxpYmJmZC50ZXhpOiBzLWxpYmJmZAotCi1zLW9wbmNsczogJChNS0RPQykgJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciAgPCQoc3JjZGlyKS8uLi9vcG5jbHMuYyA+b3BuY2xzLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBvcG5jbHMudG1wIG9wbmNscy50ZXhpCi0JdG91Y2ggcy1vcG5jbHMKLW9wbmNscy50ZXhpOiBzLW9wbmNscwotCi1zLXJlbG9jOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9yZWxvYy5jID5yZWxvYy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgcmVsb2MudG1wIHJlbG9jLnRleGkKLQl0b3VjaCBzLXJlbG9jCi1yZWxvYy50ZXhpOiBzLXJlbG9jCi0KLXMtc2VjdGlvbjogJChNS0RPQykgJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgPnNlY3Rpb24udG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHNlY3Rpb24udG1wIHNlY3Rpb24udGV4aQotCXRvdWNoIHMtc2VjdGlvbgotc2VjdGlvbi50ZXhpOiBzLXNlY3Rpb24KLQotcy1zeW1zOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vc3ltcy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3N5bXMuYyA+c3ltcy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugc3ltcy50bXAgc3ltcy50ZXhpCi0JdG91Y2ggcy1zeW1zCi1zeW1zLnRleGk6IHMtc3ltcwotCi1zLXRhcmdldHM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vdGFyZ2V0cy5jID50YXJnZXRzLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0YXJnZXRzLnRtcCB0YXJnZXRzLnRleGkKLQl0b3VjaCBzLXRhcmdldHMKLXRhcmdldHMudGV4aTogcy10YXJnZXRzCi0KLXMtaW5pdDogJChNS0RPQykgJChzcmNkaXIpLy4uL2luaXQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9pbml0LmMgPmluaXQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGluaXQudG1wIGluaXQudGV4aQotCXRvdWNoIHMtaW5pdAotaW5pdC50ZXhpOiBzLWluaXQKLQotcy1oYXNoOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vaGFzaC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2hhc2guYyA+aGFzaC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgaGFzaC50bXAgaGFzaC50ZXhpCi0JdG91Y2ggcy1oYXNoCi1oYXNoLnRleGk6IHMtaGFzaAotCi1zLWxpbmtlcjogJChNS0RPQykgJChzcmNkaXIpLy4uL2xpbmtlci5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2xpbmtlci5jID5saW5rZXIudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGxpbmtlci50bXAgbGlua2VyLnRleGkKLQl0b3VjaCBzLWxpbmtlcgotbGlua2VyLnRleGk6IHMtbGlua2VyCi0KLWxpYmJmZC5oOiAkKHNyY2RpcikvLi4vbGliYmZkLWluLmgJXAotCSQoc3JjZGlyKS8uLi9pbml0LmMJCVwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMJCVwKLQkkKHNyY2RpcikvLi4vY2FjaGUuYwkJXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jCQlcCi0JJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2xpYmJmZC1pbi5oID5saWJiZmQuaCAKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2luaXQuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9saWJiZmQuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9jYWNoZS5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL3JlbG9jLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9lbGYuYyA+PmxpYmJmZC5oCi0KLWxpYmNvZmYuaDogJChzcmNkaXIpLy4uL2xpYmNvZmYtaW4uaAlcCi0JJChzcmNkaXIpLy4uL2NvZmZjb2RlLmgJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2xpYmNvZmYtaW4uaCA+bGliY29mZi5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oID4+bGliY29mZi5oCi0KLWJmZC5oOiAkKHNyY2RpcikvLi4vYmZkLWluLmggCQlcCi0JJChzcmNkaXIpLy4uL2luaXQuYyAJCVwKLQkkKHNyY2RpcikvLi4vb3BuY2xzLmMgCQlcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jIAkJXAotCSQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgCQlcCi0JJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMJCVwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYwkJXAotCSQoc3JjZGlyKS8uLi9zeW1zLmMJCVwKLQkkKHNyY2RpcikvLi4vYmZkLmMJCVwKLQkkKHNyY2RpcikvLi4vYXJjaGl2ZS5jCQlcCi0JJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMJCVwKLQkkKHNyY2RpcikvLi4vdGFyZ2V0cy5jCQlcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jCQlcCi0JJChzcmNkaXIpL3Byb3RvLnN0cgkJXAotCSQoTUtET0MpCi0JY2F0ICQoc3JjZGlyKS8uLi9iZmQtaW4uaCA+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2luaXQuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9vcG5jbHMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9saWJiZmQuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9yZWxvYy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3N5bXMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9iZmQuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vY29yZWZpbGUuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi90YXJnZXRzLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vZm9ybWF0LmMgPj5iZmQuaAkKLQllY2hvICIjaWZkZWYgX19jcGx1c3BsdXMiID4+YmZkLmgKLQllY2hvICJ9IiA+PmJmZC5oCi0JZWNobyAiI2VuZGlmIiA+PmJmZC5oCi0JZWNobyAiI2VuZGlmIiA+PmJmZC5oCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JmZC9kb2MvYmZkLnRleGluZm8gYi9iZmQvZG9jL2JmZC50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRmODdjLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvYmZkLnRleGluZm8KKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotXGlucHV0IHRleGluZm8udGV4Ci1Ac2V0ZmlsZW5hbWUgYmZkLmluZm8KLUBjICRJZCQKLUB0ZXgKLSUgTk9URSBMT0NBTCBLTFVHRSBUTyBBVk9JRCBUT08gTVVDSCBXSElURVNQQUNFCi1cZ2xvYmFsXGxvbmdcZGVmXGV4YW1wbGV7JQotXGJlZ2luZ3JvdXAKLVxsZXRcYWJvdmVlbnZicmVhaz1ccGFyCi1cbGV0XGFmdGVyZW52YnJlYWs9XHBhcgotXHBhcnNraXA9MHB0Ci1cbGlzcH0KLVxnbG9iYWxcbG9uZ1xkZWZcRWV4YW1wbGV7JQotXEVsaXNwCi1cZW5kZ3JvdXAKLVx2c2tpcCAtXHBhcnNraXAlIHRvIGNhbmNlbCBvdXQgZWZmZWN0IG9mIGZvbGxvd2luZyBccGFyCi19Ci1AZW5kIHRleAotQHN5bmluZGV4IGZuIGNwCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIEJmZDogKGJmZCkuICAgICAgICAgICAgICAgICAgIFRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBCRkQgbGlicmFyeS4KLQotQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIGlmaW5mbwotQGlmdGV4Ci1AY0BmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9uCi1AY0BzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXR0aXRsZSBMSUIgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBMaWJyYXJ5Ci1AdGl0bGVwYWdlCi1AdGl0bGV7bGliYmZkfQotQHN1YnRpdGxle1RoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIExpYnJhcnl9Ci1Ac3AgMQotQHN1YnRpdGxlIEZpcnN0IEVkaXRpb24tLS1CRkQgdmVyc2lvbiA8IDMuMAotQHN1YnRpdGxlIEFwcmlsIDE5OTEKLUBhdXRob3Ige1N0ZXZlIENoYW1iZXJsYWlufQotQGF1dGhvciB7Q3lnbnVzIFN1cHBvcnR9Ci1AcGFnZQotCi1AdGV4Ci1cZGVmXCQjMSR7eyMxfX0gICUgS2x1Z2U6IGNvbGxlY3QgUkNTIHJldmlzaW9uIGluZm8gd2l0aG91dCAkLi4uJAotXHhkZWZcbWFudmVyc3tcJFJldmlzaW9uJH0gICUgRm9yIHVzZSBpbiBoZWFkZXJzLCBmb290ZXJzIHRvbwote1xwYXJza2lwPTBwdAotXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhcgotXGhmaWxsIHNhY1xAY3lnbnVzLmNvbVxwYXIKLVxoZmlsbCB7XGl0IEJGRH0sIFxtYW52ZXJzXHBhcgotXGhmaWxsIFxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhcgotfQotXGdsb2JhbFxwYXJpbmRlbnQ9MHB0ICUgU3RldmUgbGlrZXMgaXQgdGhpcyB3YXkKLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIHRpdGxlcGFnZQotQGVuZCBpZnRleAotCi1Abm9kZSBUb3AsIE92ZXJ2aWV3LCAoZGlyKSwgKGRpcikKLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGJpbmFyeSBmaWxlIGRlc2NyaXB0b3IgbGlicmFyeSBsaWJiZmQuCi1AZW5kIGlmaW5mbwotCi1AbWVudQotKiBPdmVydmlldzo6CQkJT3ZlcnZpZXcgb2YgQkZECi0qIEJGRCBmcm9udCBlbmQ6OgkJQkZEIGZyb250IGVuZAotKiBCRkQgYmFjayBlbmRzOjoJCUJGRCBiYWNrIGVuZHMKLSogSW5kZXg6OgkJCUluZGV4Ci1AZW5kIG1lbnUKLQotQG5vZGUgT3ZlcnZpZXcsIEJGRCBmcm9udCBlbmQsIFRvcCwgVG9wCi1AY2hhcHRlciBJbnRyb2R1Y3Rpb24KLUBjaW5kZXggQkZECi1AY2luZGV4IHdoYXQgaXMgaXQ/Ci1CRkQgaXMgYSBwYWNrYWdlIHdoaWNoIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gdXNlIHRoZQotc2FtZSByb3V0aW5lcyB0byBvcGVyYXRlIG9uIG9iamVjdCBmaWxlcyB3aGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUKLWZvcm1hdC4gIEEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCBjYW4gYmUgc3VwcG9ydGVkIHNpbXBseSBieQotY3JlYXRpbmcgYSBuZXcgQkZEIGJhY2sgZW5kIGFuZCBhZGRpbmcgaXQgdG8gdGhlIGxpYnJhcnkuCi0KLUJGRCBpcyBzcGxpdCBpbnRvIHR3byBwYXJ0czogdGhlIGZyb250IGVuZCwgYW5kIHRoZSBiYWNrIGVuZHMgKG9uZSBmb3IKLWVhY2ggb2JqZWN0IGZpbGUgZm9ybWF0KS4KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtIFRoZSBmcm9udCBlbmQgb2YgQkZEIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHVzZXIuIEl0IG1hbmFnZXMKLW1lbW9yeSBhbmQgdmFyaW91cyBjYW5vbmljYWwgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgZnJvbnQgZW5kIGFsc28KLWRlY2lkZXMgd2hpY2ggYmFjayBlbmQgdG8gdXNlIGFuZCB3aGVuIHRvIGNhbGwgYmFjayBlbmQgcm91dGluZXMuCi1AaXRlbSBUaGUgYmFjayBlbmRzIHByb3ZpZGUgQkZEIGl0cyB2aWV3IG9mIHRoZSByZWFsIHdvcmxkLiBFYWNoIGJhY2sKLWVuZCBwcm92aWRlcyBhIHNldCBvZiBjYWxscyB3aGljaCB0aGUgQkZEIGZyb250IGVuZCBjYW4gdXNlIHRvIG1haW50YWluCi1pdHMgY2Fub25pY2FsIGZvcm0uIFRoZSBiYWNrIGVuZHMgYWxzbyBtYXkga2VlcCBhcm91bmQgaW5mb3JtYXRpb24gZm9yCi10aGVpciBvd24gdXNlLCBmb3IgZ3JlYXRlciBlZmZpY2llbmN5LgotQGVuZCBpdGVtaXplCi1AbWVudQotKiBIaXN0b3J5OjoJCQlIaXN0b3J5Ci0qIEhvdyBJdCBXb3Jrczo6CQlIb3cgSXQgV29ya3MKLSogV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbzo6CVdoYXQgQkZEIFZlcnNpb24gMiBDYW4gRG8KLUBlbmQgbWVudQotCi1Abm9kZSBIaXN0b3J5LCBIb3cgSXQgV29ya3MsIE92ZXJ2aWV3LCBPdmVydmlldwotQHNlY3Rpb24gSGlzdG9yeQotCi1PbmUgc3B1ciBiZWhpbmQgQkZEIHdhcyB0aGUgZGVzaXJlLCBvbiB0aGUgcGFydCBvZiB0aGUgR05VIDk2MCB0ZWFtIGF0Ci1JbnRlbCBPcmVnb24sIGZvciBpbnRlcm9wZXJhYmlsaXR5IG9mIGFwcGxpY2F0aW9ucyBvbiB0aGVpciBDT0ZGIGFuZAotYi5vdXQgZmlsZSBmb3JtYXRzLiAgQ3lnbnVzIHdhcyBwcm92aWRpbmcgR05VIHN1cHBvcnQgZm9yIHRoZSB0ZWFtLCBhbmQKLXdhcyBjb250cmFjdGVkIHRvIHByb3ZpZGUgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkuCi0KLVRoZSBuYW1lIGNhbWUgZnJvbSBhIGNvbnZlcnNhdGlvbiBEYXZpZCBXYWxsYWNlIHdhcyBoYXZpbmcgd2l0aCBSaWNoYXJkCi1TdGFsbG1hbiBhYm91dCB0aGUgbGlicmFyeTogUk1TIHNhaWQgdGhhdCBpdCB3b3VsZCBiZSBxdWl0ZSBoYXJkLS0tRGF2aWQKLXNhaWQgYGBCRkQnJy4gIFN0YWxsbWFuIHdhcyByaWdodCwgYnV0IHRoZSBuYW1lIHN0dWNrLgotCi1BdCB0aGUgc2FtZSB0aW1lLCBSZWFkeSBTeXN0ZW1zIHdhbnRlZCBtdWNoIHRoZSBzYW1lIHRoaW5nLCBidXQgZm9yCi1kaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0czogSUVFRS02OTUsIE9hc3lzLCBTcmVjb3JkcywgYS5vdXQgYW5kIDY4awotY29mZi4KLQotQkZEIHdhcyBmaXJzdCBpbXBsZW1lbnRlZCBieSBtZW1iZXJzIG9mIEN5Z251cyBTdXBwb3J0OyBTdGV2ZQotQ2hhbWJlcmxhaW4gKEBjb2Rle3NhY0BAY3lnbnVzLmNvbX0pLCBKb2huIEdpbG1vcmUKLShAY29kZXtnbnVAQGN5Z251cy5jb219KSwgSy4gIFJpY2hhcmQgUGl4bGV5IChAY29kZXtyaWNoQEBjeWdudXMuY29tfSkKLWFuZCBEYXZpZCBIZW5rZWwtV2FsbGFjZSAoQGNvZGV7Z3VtYnlAQGN5Z251cy5jb219KS4KLQotCi0KLUBub2RlIEhvdyBJdCBXb3JrcywgV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbywgSGlzdG9yeSwgT3ZlcnZpZXcKLUBzZWN0aW9uIEhvdyBUbyBVc2UgQkZECi0KLVRvIHVzZSB0aGUgbGlicmFyeSwgaW5jbHVkZSBAZmlsZXtiZmQuaH0gYW5kIGxpbmsgd2l0aCBAZmlsZXtsaWJiZmQuYX0uCQotCi1CRkQgcHJvdmlkZXMgYSBjb21tb24gaW50ZXJmYWNlIHRvIHRoZSBwYXJ0cyBvZiBhbiBvYmplY3QgZmlsZQotZm9yIGEgY2FsbGluZyBhcHBsaWNhdGlvbi4gCi0KLVdoZW4gYW4gYXBwbGljYXRpb24gc3VjZXNzZnVsbHkgb3BlbnMgYSB0YXJnZXQgZmlsZSAob2JqZWN0LCBhcmNoaXZlLCBvcgotd2hhdGV2ZXIpLCBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgc3RydWN0dXJlIGlzIHJldHVybmVkLiBUaGlzIHBvaW50ZXIKLXBvaW50cyB0byBhIHN0cnVjdHVyZSBjYWxsZWQgQGNvZGV7YmZkfSwgZGVzY3JpYmVkIGluCi1AZmlsZXtiZmQuaH0uICBPdXIgY29udmVudGlvbiBpcyB0byBjYWxsIHRoaXMgcG9pbnRlciBhIEJGRCwgYW5kCi1pbnN0YW5jZXMgb2YgaXQgd2l0aGluIGNvZGUgQGNvZGV7YWJmZH0uICBBbGwgb3BlcmF0aW9ucyBvbgotdGhlIHRhcmdldCBvYmplY3QgZmlsZSBhcmUgYXBwbGllZCBhcyBtZXRob2RzIHRvIHRoZSBCRkQuICBUaGUgbWFwcGluZyBpcwotZGVmaW5lZCB3aXRoaW4gQGNvZGV7YmZkLmh9IGluIGEgc2V0IG9mIG1hY3JvcywgYWxsIGJlZ2lubmluZwotd2l0aCBAc2FtcHtiZmRffSB0byByZWR1Y2UgbmFtZXNwYWNlIHBvbGx1dGlvbi4KLQotRm9yIGV4YW1wbGUsIHRoaXMgc2VxdWVuY2UgZG9lcyB3aGF0IHlvdSB3b3VsZCBwcm9iYWJseSBleHBlY3Q6Ci1yZXR1cm4gdGhlIG51bWJlciBvZiBzZWN0aW9ucyBpbiBhbiBvYmplY3QgZmlsZSBhdHRhY2hlZCB0byBhIEJGRAotQGNvZGV7YWJmZH0uIAotCi1AbGlzcAotQGMgQGNhcnRvdWNoZQotI2luY2x1ZGUgImJmZC5oIgotCi11bnNpZ25lZCBpbnQgbnVtYmVyX29mX3NlY3Rpb25zKGFiZmQpCi1iZmQgKmFiZmQ7Ci1AewotICByZXR1cm4gYmZkX2NvdW50X3NlY3Rpb25zKGFiZmQpOwotQH0KLUBjIEBlbmQgY2FydG91Y2hlCi1AZW5kIGxpc3AKLQotVGhlIGFic3RyYWN0aW9uIHVzZWQgd2l0aGluIEJGRCBpcyB0aGF0IGFuIG9iamVjdCBmaWxlIGhhczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLWEgaGVhZGVyLAotQGl0ZW0KLWEgbnVtYmVyIG9mIHNlY3Rpb25zIGNvbnRhaW5pbmcgcmF3IGRhdGEgKEBweHJlZntTZWN0aW9uc30pLAotQGl0ZW0KLWEgc2V0IG9mIHJlbG9jYXRpb25zIChAcHhyZWZ7UmVsb2NhdGlvbnN9KSwgYW5kCi1AaXRlbQotc29tZSBzeW1ib2wgaW5mb3JtYXRpb24gKEBweHJlZntTeW1ib2xzfSkuCi1AZW5kIGl0ZW1pemUKLUBub2luZGVudAotQWxzbywgQkZEcyBvcGVuZWQgZm9yIGFyY2hpdmVzIGhhdmUgdGhlIGFkZGl0aW9uYWwgYXR0cmlidXRlIG9mIGFuIGluZGV4Ci1hbmQgY29udGFpbiBzdWJvcmRpbmF0ZSBCRkRzLiBUaGlzIGFwcHJvYWNoIGlzIGZpbmUgZm9yIGEub3V0IGFuZCBjb2ZmLAotYnV0IGxvc2VzIGVmZmljaWVuY3kgd2hlbiBhcHBsaWVkIHRvIGZvcm1hdHMgc3VjaCBhcyBTLXJlY29yZHMgYW5kCi1JRUVFLTY5NS4KLQotQG5vZGUgV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbywgICwgSG93IEl0IFdvcmtzLCBPdmVydmlldwotQHNlY3Rpb24gV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbwotQGluY2x1ZGUgYmZkc3VtbS50ZXhpCi0KLUBub2RlIEJGRCBmcm9udCBlbmQsIEJGRCBiYWNrIGVuZHMsIE92ZXJ2aWV3LCBUb3AKLUBjaGFwdGVyIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlIGJmZHQudGV4aQotCi1AbWVudQotKiBNZW1vcnkgVXNhZ2U6OgotKiBJbml0aWFsaXphdGlvbjo6Ci0qIFNlY3Rpb25zOjoKLSogU3ltYm9sczo6Ci0qIEFyY2hpdmVzOjoKLSogRm9ybWF0czo6Ci0qIFJlbG9jYXRpb25zOjoKLSogQ29yZSBGaWxlczo6Ci0qIFRhcmdldHM6OgotKiBBcmNoaXRlY3R1cmVzOjoKLSogT3BlbmluZyBhbmQgQ2xvc2luZzo6Ci0qIEludGVybmFsOjoKLSogRmlsZSBDYWNoaW5nOjoKLSogTGlua2VyIEZ1bmN0aW9uczo6Ci0qIEhhc2ggVGFibGVzOjoKLUBlbmQgbWVudQotCi1Abm9kZSBNZW1vcnkgVXNhZ2UsIEluaXRpYWxpemF0aW9uLCBCRkQgZnJvbnQgZW5kLCBCRkQgZnJvbnQgZW5kCi1Ac2VjdGlvbiBNZW1vcnkgdXNhZ2UKLUJGRCBrZWVwcyBhbGwgb2YgaXRzIGludGVybmFsIHN0cnVjdHVyZXMgaW4gb2JzdGFja3MuIFRoZXJlIGlzIG9uZSBvYnN0YWNrCi1wZXIgb3BlbiBCRkQgZmlsZSwgaW50byB3aGljaCB0aGUgY3VycmVudCBzdGF0ZSBpcyBzdG9yZWQuIFdoZW4gYSBCRkQgaXMKLWNsb3NlZCwgdGhlIG9ic3RhY2sgaXMgZGVsZXRlZCwgYW5kIHNvIGV2ZXJ5dGhpbmcgd2hpY2ggaGFzIGJlZW4KLWFsbG9jYXRlZCBieSBCRkQgZm9yIHRoZSBjbG9zaW5nIGZpbGUgaXMgdGhyb3duIGF3YXkuCi0KLUJGRCBkb2VzIG5vdCBmcmVlIGFueXRoaW5nIGNyZWF0ZWQgYnkgYW4gYXBwbGljYXRpb24sIGJ1dCBwb2ludGVycyBpbnRvCi1AY29kZXtiZmR9IHN0cnVjdHVyZXMgYmVjb21lIGludmFsaWQgb24gYSBAY29kZXtiZmRfY2xvc2V9OyBmb3IgZXhhbXBsZSwKLWFmdGVyIGEgQGNvZGV7YmZkX2Nsb3NlfSB0aGUgdmVjdG9yIHBhc3NlZCB0bwotQGNvZGV7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9IGlzIHN0aWxsIGFyb3VuZCwgc2luY2UgaXQgaGFzIGJlZW4KLWFsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24sIGJ1dCB0aGUgZGF0YSB0aGF0IGl0IHBvaW50ZWQgdG8gYXJlCi1sb3N0LgotCi1UaGUgZ2VuZXJhbCBydWxlIGlzIHRvIG5vdCBjbG9zZSBhIEJGRCB1bnRpbCBhbGwgb3BlcmF0aW9ucyBkZXBlbmRlbnQKLXVwb24gZGF0YSBmcm9tIHRoZSBCRkQgaGF2ZSBiZWVuIGNvbXBsZXRlZCwgb3IgYWxsIHRoZSBkYXRhIGZyb20gd2l0aGluCi10aGUgZmlsZSBoYXMgYmVlbiBjb3BpZWQuIFRvIGhlbHAgd2l0aCB0aGUgbWFuYWdlbWVudCBvZiBtZW1vcnksIHRoZXJlCi1pcyBhIGZ1bmN0aW9uIChAY29kZXtiZmRfYWxsb2Nfc2l6ZX0pIHdoaWNoIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcwotaW4gb2JzdGFja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdXBwbGllZCBCRkQuIFRoaXMgY291bGQgYmUgdXNlZCB0bwotc2VsZWN0IHRoZSBncmVlZGllc3Qgb3BlbiBCRkQsIGNsb3NlIGl0IHRvIHJlY2xhaW0gdGhlIG1lbW9yeSwgcGVyZm9ybQotc29tZSBvcGVyYXRpb24gYW5kIHJlb3BlbiB0aGUgQkZEIGFnYWluLCB0byBnZXQgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhCi1zdHJ1Y3R1cmVzLgotCi1Abm9kZSBJbml0aWFsaXphdGlvbiwgU2VjdGlvbnMsIE1lbW9yeSBVc2FnZSwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGluaXQudGV4aQotCi1Abm9kZSBTZWN0aW9ucywgU3ltYm9scywgSW5pdGlhbGl6YXRpb24sIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBzZWN0aW9uLnRleGkKLQotQG5vZGUgU3ltYm9scywgQXJjaGl2ZXMsIFNlY3Rpb25zLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgc3ltcy50ZXhpCi0KLUBub2RlIEFyY2hpdmVzLCBGb3JtYXRzLCBTeW1ib2xzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgYXJjaGl2ZS50ZXhpCi0KLUBub2RlIEZvcm1hdHMsIFJlbG9jYXRpb25zLCBBcmNoaXZlcywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGZvcm1hdC50ZXhpCi0KLUBub2RlIFJlbG9jYXRpb25zLCBDb3JlIEZpbGVzLCBGb3JtYXRzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgcmVsb2MudGV4aQotCi1Abm9kZSBDb3JlIEZpbGVzLCBUYXJnZXRzLCBSZWxvY2F0aW9ucywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGNvcmUudGV4aQotCi1Abm9kZSBUYXJnZXRzLCBBcmNoaXRlY3R1cmVzLCBDb3JlIEZpbGVzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgdGFyZ2V0cy50ZXhpCi0KLUBub2RlIEFyY2hpdGVjdHVyZXMsIE9wZW5pbmcgYW5kIENsb3NpbmcsIFRhcmdldHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBhcmNodXJlcy50ZXhpCi0KLUBub2RlIE9wZW5pbmcgYW5kIENsb3NpbmcsIEludGVybmFsLCBBcmNoaXRlY3R1cmVzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgb3BuY2xzLnRleGkKLQotQG5vZGUgSW50ZXJuYWwsIEZpbGUgQ2FjaGluZywgT3BlbmluZyBhbmQgQ2xvc2luZywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGxpYmJmZC50ZXhpCi0KLUBub2RlIEZpbGUgQ2FjaGluZywgTGlua2VyIEZ1bmN0aW9ucywgSW50ZXJuYWwsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBjYWNoZS50ZXhpCi0KLUBub2RlIExpbmtlciBGdW5jdGlvbnMsIEhhc2ggVGFibGVzLCBGaWxlIENhY2hpbmcsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBsaW5rZXIudGV4aQotCi1Abm9kZSBIYXNoIFRhYmxlcywgLCBMaW5rZXIgRnVuY3Rpb25zLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgaGFzaC50ZXhpCi0KLUBub2RlIEJGRCBiYWNrIGVuZHMsIEluZGV4LCBCRkQgZnJvbnQgZW5kLCBUb3AKLUBjaGFwdGVyIEJGRCBiYWNrIGVuZHMKLUBtZW51Ci0qIFdoYXQgdG8gUHV0IFdoZXJlOjoKLSogYW91dCA6OglhLm91dCBiYWNrZW5kcwotKiBjb2ZmIDo6CWNvZmYgYmFja2VuZHMKLSogZWxmICA6OgllbGYgYmFja2VuZHMKLUBpZ25vcmUKLSogb2FzeXMgOjoJb2FzeXMgYmFja2VuZHMKLSogaWVlZSA6OglpZWVlIGJhY2tlbmQKLSogc3JlY29yZCA6OglzLXJlY29yZCBiYWNrZW5kCi1AZW5kIGlnbm9yZQotQGVuZCBtZW51Ci1Abm9kZSBXaGF0IHRvIFB1dCBXaGVyZSwgYW91dCwgQkZEIGJhY2sgZW5kcywgQkZEIGJhY2sgZW5kcwotQWxsIG9mIEJGRCBsaXZlcyBpbiBvbmUgZGlyZWN0b3J5LgotCi1Abm9kZSBhb3V0LCBjb2ZmLCBXaGF0IHRvIFB1dCBXaGVyZSwgQkZEIGJhY2sgZW5kcwotQGluY2x1ZGUgIGFvdXR4LnRleGkKLQotQG5vZGUgY29mZiwgZWxmLCBhb3V0LCBCRkQgYmFjayBlbmRzCi1AaW5jbHVkZSAgY29mZmNvZGUudGV4aQotCi1Abm9kZSBlbGYsICAsIGNvZmYsIEJGRCBiYWNrIGVuZHMKLUBpbmNsdWRlICBlbGYudGV4aQotQGMgTGVhdmUgdGhpcyBvdXQgdW50aWwgdGhlIGZpbGUgaGFzIHNvbWUgYWN0dWFsIGNvbnRlbnRzLi4uCi1AYyBAaW5jbHVkZSAgZWxmY29kZS50ZXhpCi0KLUBub2RlIEluZGV4LCAgLCBCRkQgYmFjayBlbmRzICwgVG9wCi1AdW5udW1iZXJlZCBJbmRleAotQHByaW50aW5kZXggY3AKLQotQHRleAotJSBJIHRoaW5rIHNvbWV0aGluZyBsaWtlIEBjb2xvcGhvbiBzaG91bGQgYmUgaW4gdGV4aW5mby4gIEluIHRoZQotJSBtZWFudGltZToKLVxsb25nXGRlZlxjb2xvcGhvbntcaGJveCB0bzBwdHt9XHZmaWxsCi1cY2VudGVybGluZXtUaGUgYm9keSBvZiB0aGlzIG1hbnVhbCBpcyBzZXQgaW59Ci1cY2VudGVybGluZXtcZm9udG5hbWVcdGVucm0sfQotXGNlbnRlcmxpbmV7d2l0aCBoZWFkaW5ncyBpbiB7XGJmXGZvbnRuYW1lXHRlbmJmfX0KLVxjZW50ZXJsaW5le2FuZCBleGFtcGxlcyBpbiB7XHR0XGZvbnRuYW1lXHRlbnR0fS59Ci1cY2VudGVybGluZXt7XGl0XGZvbnRuYW1lXHRlbml0XC99IGFuZH0KLVxjZW50ZXJsaW5le3tcc2xcZm9udG5hbWVcdGVuc2xcL319Ci1cY2VudGVybGluZXthcmUgdXNlZCBmb3IgZW1waGFzaXMufVx2ZmlsbH0KLVxwYWdlXGNvbG9waG9uCi0lIEJsYW1lOiBkb2NAY3lnbnVzLmNvbSwgMjhtYXI5MS4KLUBlbmQgdGV4Ci0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmRpbnQudGV4aSBiL2JmZC9kb2MvYmZkaW50LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMDliMzQuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9iZmRpbnQudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE4ODUgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBiZmRpbnQuaW5mbwotCi1Ac2V0dGl0bGUgQkZEIEludGVybmFscwotQGlmdGV4Ci1AdGl0bGVwYWdlCi1AdGl0bGV7QkZEIEludGVybmFsc30KLUBhdXRob3J7SWFuIExhbmNlIFRheWxvcn0KLUBhdXRob3J7Q3lnbnVzIFNvbHV0aW9uc30KLUBwYWdlCi1AZW5kIGlmdGV4Ci0KLUBub2RlIFRvcAotQHRvcCBCRkQgSW50ZXJuYWxzCi1AcmFpc2VzZWN0aW9ucwotQGNpbmRleCBiZmQgaW50ZXJuYWxzCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHNvbWUgQkZEIGludGVybmFsIGluZm9ybWF0aW9uIHdoaWNoIG1heSBiZQotaGVscGZ1bCB3aGVuIHdvcmtpbmcgb24gQkZELiAgSXQgaXMgdmVyeSBpbmNvbXBsZXRlLgotCi1UaGlzIGRvY3VtZW50IGlzIG5vdCB1cGRhdGVkIHJlZ3VsYXJseSwgYW5kIG1heSBiZSBvdXQgb2YgZGF0ZS4gIEl0IHdhcwotbGFzdCBtb2RpZmllZCBvbiAkRGF0ZSQuCi0KLVRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCB3YXMgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yCi1AZW1haWx7aWFuQEBjeWdudXMuY29tfS4KLQotQG1lbnUKLSogQkZEIG92ZXJ2aWV3OjoJCUJGRCBvdmVydmlldwotKiBCRkQgZ3VpZGVsaW5lczo6CQlCRkQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lcwotKiBCRkQgdGFyZ2V0IHZlY3Rvcjo6CQlCRkQgdGFyZ2V0IHZlY3RvcgotKiBCRkQgZ2VuZXJhdGVkIGZpbGVzOjoJCUJGRCBnZW5lcmF0ZWQgZmlsZXMKLSogQkZEIG11bHRpcGxlIGNvbXBpbGF0aW9uczo6CUZpbGVzIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzIGluIEJGRAotKiBCRkQgcmVsb2NhdGlvbiBoYW5kbGluZzo6CUJGRCByZWxvY2F0aW9uIGhhbmRsaW5nCi0qIEJGRCBFTEYgc3VwcG9ydDo6CQlCRkQgRUxGIHN1cHBvcnQKLSogQkZEIGdsb3NzYXJ5OjoJCUdsb3NzYXJ5Ci0qIEluZGV4OjoJCQlJbmRleAotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBvdmVydmlldwotQHNlY3Rpb24gQkZEIG92ZXJ2aWV3Ci0KLUJGRCBpcyBhIGxpYnJhcnkgd2hpY2ggcHJvdmlkZXMgYSBzaW5nbGUgaW50ZXJmYWNlIHRvIHJlYWQgYW5kIHdyaXRlCi1vYmplY3QgZmlsZXMsIGV4ZWN1dGFibGVzLCBhcmNoaXZlIGZpbGVzLCBhbmQgY29yZSBmaWxlcyBpbiBhbnkgZm9ybWF0LgotCi1AbWVudQotKiBCRkQgbGlicmFyeSBpbnRlcmZhY2VzOjoJQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotKiBCRkQgbGlicmFyeSB1c2Vyczo6CQlCRkQgbGlicmFyeSB1c2VycwotKiBCRkQgdmlldzo6CQkJVGhlIEJGRCB2aWV3IG9mIGEgZmlsZQotKiBCRkQgYmxpbmRuZXNzOjoJCUJGRCBsb3NlcyBpbmZvcm1hdGlvbgotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBsaWJyYXJ5IGludGVyZmFjZXMKLUBzdWJzZWN0aW9uIEJGRCBsaWJyYXJ5IGludGVyZmFjZXMKLQotT25lIHdheSB0byBsb29rIGF0IHRoZSBCRkQgbGlicmFyeSBpcyB0byBkaXZpZGUgaXQgaW50byBmb3VyIHBhcnRzIGJ5Ci10eXBlIG9mIGludGVyZmFjZS4KLQotVGhlIGZpcnN0IGludGVyZmFjZSBpcyB0aGUgc2V0IG9mIGdlbmVyaWMgZnVuY3Rpb25zIHdoaWNoIHByb2dyYW1zIHVzaW5nCi10aGUgQkZEIGxpYnJhcnkgd2lsbCBjYWxsLiAgVGhlc2UgZ2VuZXJpYyBmdW5jdGlvbiBub3JtYWxseSB0cmFuc2xhdGUKLWRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW50byBjYWxscyB0byByb3V0aW5lcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gYQotcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQuICBNYW55IG9mIHRoZXNlIGdlbmVyaWMgZnVuY3Rpb25zIGFyZQotYWN0dWFsbHkgZGVmaW5lZCBhcyBtYWNyb3MgaW4gQGZpbGV7YmZkLmh9LiAgVGhlc2UgZnVuY3Rpb25zIGNvbXByaXNlCi10aGUgb2ZmaWNpYWwgQkZEIGludGVyZmFjZS4KLQotVGhlIHNlY29uZCBpbnRlcmZhY2UgaXMgdGhlIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIHRoZSB0YXJnZXQKLXZlY3RvcnMuICBUaGlzIGlzIHRoZSBidWxrIG9mIHRoZSBjb2RlIGluIEJGRC4gIEEgdGFyZ2V0IHZlY3RvciBpcyBhIHNldAotb2YgZnVuY3Rpb24gcG9pbnRlcnMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZQotdGFyZ2V0IHZlY3RvciBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgZ2VuZXJpYyBCRkQgZnVuY3Rpb25zLiAgVGhlc2UKLWZ1bmN0aW9ucyBhcmUgYWx3YXlzIGNhbGxlZCB0aHJvdWdoIHRoZSB0YXJnZXQgdmVjdG9yLCBhbmQgYXJlIG5ldmVyCi1jYWxsZWQgZGlyZWN0bHkuICBUaGUgdGFyZ2V0IHZlY3RvciBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGluIEByZWZ7QkZECi10YXJnZXQgdmVjdG9yfS4gIFRoZSBzZXQgb2YgZnVuY3Rpb25zIHdoaWNoIGFwcGVhciBpbiBhIHBhcnRpY3VsYXIKLXRhcmdldCB2ZWN0b3IgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYSBCRkQgYmFja2VuZC4KLQotVGhlIHRoaXJkIGludGVyZmFjZSBpcyBhIHNldCBvZiBvZGRiYWxsIGZ1bmN0aW9ucyB3aGljaCBhcmUgdHlwaWNhbGx5Ci1zcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LCBhcmUgbm90IGdlbmVyaWMgZnVuY3Rpb25zLAotYW5kIGFyZSBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBCRkQgbGlicmFyeS4gIFRoZXNlIGFyZSB1c2VkIGFzIGhvb2tzCi1ieSB0aGUgbGlua2VyIGFuZCB0aGUgYXNzZW1ibGVyIHdoZW4gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdAotcmVxdWlyZXMgc29tZSBhY3Rpb24gd2hpY2ggdGhlIEJGRCBnZW5lcmljIGludGVyZmFjZSBkb2VzIG5vdCBwcm92aWRlLgotVGhlc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgZGVjbGFyZWQgaW4gQGZpbGV7YmZkLmh9LCBidXQgaW4gbWFueQotY2FzZXMgdGhleSBhcmUgb25seSBwcm92aWRlZCB3aGVuIEJGRCBpcyBjb25maWd1cmVkIHdpdGggc3VwcG9ydCBmb3IgYQotcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGVzZSBmdW5jdGlvbnMgbGl2ZSBpbiBhIGdyZXkgYXJlYSwgYW5kCi1hcmUgbm90IHJlYWxseSBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlLgotCi1UaGUgZm91cnRoIGludGVyZmFjZSBpcyB0aGUgc2V0IG9mIEJGRCBzdXBwb3J0IGZ1bmN0aW9ucyB3aGljaCBhcmUKLWNhbGxlZCBieSB0aGUgb3RoZXIgQkZEIGZ1bmN0aW9ucy4gIFRoZXNlIG1hbmFnZSBpc3N1ZXMgbGlrZSBtZW1vcnkKLWFsbG9jYXRpb24sIGVycm9yIGhhbmRsaW5nLCBmaWxlIGFjY2VzcywgaGFzaCB0YWJsZXMsIHN3YXBwaW5nLCBhbmQgdGhlCi1saWtlLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBuZXZlciBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBCRkQgbGlicmFyeS4KLQotQG5vZGUgQkZEIGxpYnJhcnkgdXNlcnMKLUBzdWJzZWN0aW9uIEJGRCBsaWJyYXJ5IHVzZXJzCi0KLUFub3RoZXIgd2F5IHRvIGxvb2sgYXQgdGhlIEJGRCBsaWJyYXJ5IGlzIHRvIGRpdmlkZSBpdCBpbnRvIHRocmVlIHBhcnRzCi1ieSB0aGUgbWFubmVyIGluIHdoaWNoIGl0IGlzIHVzZWQuCi0KLVRoZSBmaXJzdCB1c2UgaXMgdG8gcmVhZCBhbiBvYmplY3QgZmlsZS4gIFRoZSBvYmplY3QgZmlsZSByZWFkZXJzIGFyZQotcHJvZ3JhbXMgbGlrZSBAc2FtcHtnZGJ9LCBAc2FtcHtubX0sIEBzYW1we29iamR1bXB9LCBhbmQgQHNhbXB7b2JqY29weX0uCi1UaGVzZSBwcm9ncmFtcyB1c2UgQkZEIHRvIHZpZXcgYW4gb2JqZWN0IGZpbGUgaW4gYSBnZW5lcmljIGZvcm0uICBUaGUKLW9mZmljaWFsIEJGRCBpbnRlcmZhY2UgaXMgbm9ybWFsbHkgZnVsbHkgYWRlcXVhdGUgZm9yIHRoZXNlIHByb2dyYW1zLgotCi1UaGUgc2Vjb25kIHVzZSBpcyB0byB3cml0ZSBhbiBvYmplY3QgZmlsZS4gIFRoZSBvYmplY3QgZmlsZSB3cml0ZXJzIGFyZQotcHJvZ3JhbXMgbGlrZSBAc2FtcHtnYXN9IGFuZCBAc2FtcHtvYmpjb3B5fS4gIFRoZXNlIHByb2dyYW1zIHVzZSBCRkQgdG8KLWNyZWF0ZSBhbiBvYmplY3QgZmlsZS4gIFRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlIGlzIG5vcm1hbGx5IGFkZXF1YXRlCi1mb3IgdGhlc2UgcHJvZ3JhbXMsIGJ1dCBmb3Igc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIHRoZSBhc3NlbWJsZXIgbmVlZHMKLXNvbWUgYWRkaXRpb25hbCBob29rcyBpbiBvcmRlciB0byBzZXQgcGFydGljdWxhciBmbGFncyBvciBvdGhlcgotaW5mb3JtYXRpb24uICBUaGUgb2ZmaWNpYWwgQkZEIGludGVyZmFjZSBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gY29weQotcHJpdmF0ZSBpbmZvcm1hdGlvbiBmcm9tIG9uZSBvYmplY3QgZmlsZSB0byBhbm90aGVyLCBhbmQgdGhlc2UgZnVuY3Rpb25zCi1hcmUgdXNlZCBieSBAc2FtcHtvYmpjb3B5fSB0byBhdm9pZCBpbmZvcm1hdGlvbiBsb3NzLgotCi1UaGUgdGhpcmQgdXNlIGlzIHRvIGxpbmsgb2JqZWN0IGZpbGVzLiAgVGhlcmUgaXMgb25seSBvbmUgb2JqZWN0IGZpbGUKLWxpbmtlciwgQHNhbXB7bGR9LiAgT3JpZ2luYWxseSwgQHNhbXB7bGR9IHdhcyBhbiBvYmplY3QgZmlsZSByZWFkZXIgYW5kCi1hbiBvYmplY3QgZmlsZSB3cml0ZXIsIGFuZCBpdCBkaWQgdGhlIGxpbmsgb3BlcmF0aW9uIHVzaW5nIHRoZSBnZW5lcmljCi1CRkQgc3RydWN0dXJlcy4gIEhvd2V2ZXIsIHRoaXMgdHVybmVkIG91dCB0byBiZSB0b28gc2xvdyBhbmQgdG9vIG1lbW9yeQotaW50ZW5zaXZlLgotCi1UaGUgb2ZmaWNpYWwgQkZEIGxpbmtlciBmdW5jdGlvbnMgd2VyZSB3cml0dGVuIHRvIHBlcm1pdCBzcGVjaWZpYyBCRkQKLWJhY2tlbmRzIHRvIHBlcmZvcm0gdGhlIGxpbmsgd2l0aG91dCB0cmFuc2xhdGluZyB0aHJvdWdoIHRoZSBnZW5lcmljCi1zdHJ1Y3R1cmVzLCBpbiB0aGUgbm9ybWFsIGNhc2Ugd2hlcmUgYWxsIHRoZSBpbnB1dCBmaWxlcyBhbmQgb3V0cHV0IGZpbGUKLWhhdmUgdGhlIHNhbWUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgTm90IGFsbCBvZiB0aGUgYmFja2VuZHMgY3VycmVudGx5Ci1pbXBsZW1lbnQgdGhlIG5ldyBpbnRlcmZhY2UsIGFuZCB0aGVyZSBhcmUgZGVmYXVsdCBsaW5raW5nIGZ1bmN0aW9ucwotd2l0aGluIEJGRCB3aGljaCB1c2UgdGhlIGdlbmVyaWMgc3RydWN0dXJlcyBhbmQgd2hpY2ggd29yayB3aXRoIGFsbAotYmFja2VuZHMuCi0KLUZvciBzZXZlcmFsIG9iamVjdCBmaWxlIGZvcm1hdHMgdGhlIGxpbmtlciBuZWVkcyBhZGRpdGlvbmFsIGhvb2tzIHdoaWNoCi1hcmUgbm90IHByb3ZpZGVkIGJ5IHRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlLCBwYXJ0aWN1bGFybHkgZm9yIGR5bmFtaWMKLWxpbmtpbmcgc3VwcG9ydC4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIKLWVtdWxhdGlvbiB0ZW1wbGF0ZS4KLQotQG5vZGUgQkZEIHZpZXcKLUBzdWJzZWN0aW9uIFRoZSBCRkQgdmlldyBvZiBhIGZpbGUKLQotQkZEIHVzZXMgZ2VuZXJpYyBzdHJ1Y3R1cmVzIHRvIG1hbmFnZSBpbmZvcm1hdGlvbi4gIEl0IHRyYW5zbGF0ZXMgZGF0YQotaW50byB0aGUgZ2VuZXJpYyBmb3JtIHdoZW4gcmVhZGluZyBmaWxlcywgYW5kIG91dCBvZiB0aGUgZ2VuZXJpYyBmb3JtCi13aGVuIHdyaXRpbmcgZmlsZXMuCi0KLUJGRCBkZXNjcmliZXMgYSBmaWxlIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YmZkfSB0eXBlLiAgQSBAc2FtcHtiZmR9Ci1pcyBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzLiAgVGhlIEJGRCBpbmZvcm1hdGlvbiBjYW4gYmUKLWRpc3BsYXllZCB1c2luZyB0aGUgQHNhbXB7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoIHZhcmlvdXMgb3B0aW9ucy4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBnZW5lcmFsIGluZm9ybWF0aW9uCi1UaGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhIGZldyBnZW5lcmFsIGZsYWdzLCB0aGUgc3RhcnQgYWRkcmVzcy4KLUBpdGVtIGFyY2hpdGVjdHVyZQotVGhlIGFyY2hpdGVjdHVyZSwgaW5jbHVkaW5nIGJvdGggYSBnZW5lcmFsIHByb2Nlc3NvciB0eXBlIChtNjhrLCBNSVBTCi1ldGMuKSBhbmQgYSBzcGVjaWZpYyBtYWNoaW5lIG51bWJlciAobTY4MDAwLCBSNDAwMCwgZXRjLikuCi1AaXRlbSBzZWN0aW9ucwotQSBsaXN0IG9mIHNlY3Rpb25zLgotQGl0ZW0gc3ltYm9scwotQSBzeW1ib2wgdGFibGUuCi1AZW5kIHRhYmxlCi0KLUJGRCByZXByZXNlbnRzIGEgc2VjdGlvbiBhcyBhIHBvaW50ZXIgdG8gdGhlIEBzYW1we2FzZWN0aW9ufSB0eXBlLiAgRWFjaAotc2VjdGlvbiBoYXMgYSBuYW1lIGFuZCBhIHNpemUuICBNb3N0IHNlY3Rpb25zIGFsc28gaGF2ZSBhbiBhc3NvY2lhdGVkCi1ibG9jayBvZiBkYXRhLCBrbm93biBhcyB0aGUgc2VjdGlvbiBjb250ZW50cy4gIFNlY3Rpb25zIGFsc28gaGF2ZQotYXNzb2NpYXRlZCBmbGFncywgYSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzLCBhIGxvYWQgbWVtb3J5IGFkZHJlc3MsIGEKLXJlcXVpcmVkIGFsaWdubWVudCwgYSBsaXN0IG9mIHJlbG9jYXRpb25zLCBhbmQgb3RoZXIgbWlzY2VsbGFuZW91cwotaW5mb3JtYXRpb24uCi0KLUJGRCByZXByZXNlbnRzIGEgcmVsb2NhdGlvbiBhcyBhIHBvaW50ZXIgdG8gdGhlIEBzYW1we2FyZWxlbnR9IHR5cGUuICBBCi1yZWxvY2F0aW9uIGRlc2NyaWJlcyBhbiBhY3Rpb24gd2hpY2ggdGhlIGxpbmtlciBtdXN0IHRha2UgdG8gbW9kaWZ5IHRoZQotc2VjdGlvbiBjb250ZW50cy4gIFJlbG9jYXRpb25zIGhhdmUgYSBzeW1ib2wsIGFuIGFkZHJlc3MsIGFuIGFkZGVuZCwgYW5kCi1hIHBvaW50ZXIgdG8gYSBob3d0byBzdHJ1Y3R1cmUgd2hpY2ggZGVzY3JpYmVzIGhvdyB0byBwZXJmb3JtIHRoZQotcmVsb2NhdGlvbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQHJlZntCRkQgcmVsb2NhdGlvbiBoYW5kbGluZ30uCi0KLUJGRCByZXByZXNlbnRzIGEgc3ltYm9sIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXN5bWJvbH0gdHlwZS4gIEEKLXN5bWJvbCBoYXMgYSBuYW1lLCBhIHBvaW50ZXIgdG8gYSBzZWN0aW9uLCBhbiBvZmZzZXQgd2l0aGluIHRoYXQKLXNlY3Rpb24sIGFuZCBzb21lIGZsYWdzLgotCi1BcmNoaXZlIGZpbGVzIGRvIG5vdCBoYXZlIGFueSBzZWN0aW9ucyBvciBzeW1ib2xzLiAgSW5zdGVhZCwgQkZECi1yZXByZXNlbnRzIGFuIGFyY2hpdmUgZmlsZSBhcyBhIGZpbGUgd2hpY2ggY29udGFpbnMgYSBsaXN0IG9mCi1Ac2FtcHtiZmR9cy4gIEJGRCBhbHNvIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYXJjaGl2ZSBzeW1ib2wgbWFwLCBhcyBhCi1saXN0IG9mIHN5bWJvbCBuYW1lcy4gIEJGRCBwcm92aWRlcyBhIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgQHNhbXB7YmZkfQotd2l0aGluIHRoZSBhcmNoaXZlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBlbnRyeSBpbiB0aGUKLWFyY2hpdmUgc3ltYm9sIG1hcC4KLQotQG5vZGUgQkZEIGJsaW5kbmVzcwotQHN1YnNlY3Rpb24gQkZEIGxvc2VzIGluZm9ybWF0aW9uCi0KLU1vc3Qgb2JqZWN0IGZpbGUgZm9ybWF0cyBoYXZlIGluZm9ybWF0aW9uIHdoaWNoIEJGRCBjYW4gbm90IHJlcHJlc2VudCBpbgotaXRzIGdlbmVyaWMgZm9ybSwgYXQgbGVhc3QgYXMgY3VycmVudGx5IGRlZmluZWQuCi0KLVRoZXJlIGlzIG9mdGVuIGV4cGxpY2l0IGluZm9ybWF0aW9uIHdoaWNoIEJGRCBjYW4gbm90IHJlcHJlc2VudC4gIEZvcgotZXhhbXBsZSwgdGhlIENPRkYgdmVyc2lvbiBzdGFtcCwgb3IgdGhlIEVMRiBwcm9ncmFtIHNlZ21lbnRzLiAgQkZECi1wcm92aWRlcyBzcGVjaWFsIGhvb2tzIHRvIGhhbmRsZSB0aGlzIGluZm9ybWF0aW9uIHdoZW4gY29weWluZywKLXByaW50aW5nLCBvciBsaW5raW5nIGFuIG9iamVjdCBmaWxlLiAgVGhlIEJGRCBzdXBwb3J0IGZvciBhIHBhcnRpY3VsYXIKLW9iamVjdCBmaWxlIGZvcm1hdCB3aWxsIG5vcm1hbGx5IHN0b3JlIHRoaXMgaW5mb3JtYXRpb24gaW4gcHJpdmF0ZSBkYXRhCi1hbmQgaGFuZGxlIGl0IHVzaW5nIHRoZSBzcGVjaWFsIGhvb2tzLgotCi1JbiBzb21lIGNhc2VzIHRoZXJlIGlzIGFsc28gaW1wbGljaXQgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QKLXJlcHJlc2VudC4gIEZvciBleGFtcGxlLCB0aGUgTUlQUyBwcm9jZXNzb3IgZGlzdGluZ3Vpc2hlcyBzbWFsbCBhbmQKLWxhcmdlIHN5bWJvbHMsIGFuZCByZXF1aXJlcyB0aGF0IGFsbCBzbWFsbCBzeW1ibHMgYmUgd2l0aGluIDMySyBvZiB0aGUKLUdQIHJlZ2lzdGVyLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBNSVBTIGFzc2VtYmxlciBtdXN0IGJlIGFibGUgdG8gbWFyawotdmFyaWFibGVzIGFzIGVpdGhlciBzbWFsbCBvciBsYXJnZSwgYW5kIHRoZSBNSVBTIGxpbmtlciBtdXN0IGtub3cgdG8gcHV0Ci1zbWFsbCBzeW1ib2xzIHdpdGhpbiByYW5nZSBvZiB0aGUgR1AgcmVnaXN0ZXIuICBTaW5jZSBCRkQgY2FuIG5vdAotcmVwcmVzZW50IHRoaXMgaW5mb3JtYXRpb24sIHRoaXMgbWVhbnMgdGhhdCB0aGUgYXNzZW1ibGVyIGFuZCBsaW5rZXIKLW11c3QgaGF2ZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBvYmplY3QgZmlsZQotZm9ybWF0IHdoaWNoIGlzIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LgotCi1UaGlzIGxvc3Mgb2YgaW5mb3JtYXRpb24gaW5kaWNhdGVzIGFyZWFzIHdoZXJlIHRoZSBCRkQgcGFyYWRpZ20gYnJlYWtzCi1kb3duLiAgSXQgaXMgbm90IGFjdHVhbGx5IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUgbXlyaWFkIGRpZmZlcmVuY2VzCi1hbW9uZyBvYmplY3QgZmlsZSBmb3JtYXRzIHVzaW5nIGEgc2luZ2xlIGdlbmVyaWMgaW50ZXJmYWNlLCBhdCBsZWFzdCBub3QKLWluIHRoZSBtYW5uZXIgd2hpY2ggQkZEIGRvZXMgaXQgdG9kYXkuCi0KLU5ldmVydGhlbGVzcywgdGhlIEJGRCBsaWJyYXJ5IGRvZXMgZ3JlYXRseSBzaW1wbGlmeSB0aGUgdGFzayBvZiBkZWFsaW5nCi13aXRoIG9iamVjdCBmaWxlcywgYW5kIHBhcnRpY3VsYXIgcHJvYmxlbXMgY2F1c2VkIGJ5IGluZm9ybWF0aW9uIGxvc3MKLWNhbiBub3JtYWxseSBiZSBzb2x2ZWQgdXNpbmcgc29tZSBzb3J0IG9mIHJlbGF0aXZlbHkgY29uc3RyYWluZWQgaG9vawotaW50byB0aGUgbGlicmFyeS4KLQotCi0KLUBub2RlIEJGRCBndWlkZWxpbmVzCi1Ac2VjdGlvbiBCRkQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lcwotQGNpbmRleCBiZmQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lcwotQGNpbmRleCBwcm9ncmFtbWluZyBndWlkZWxpbmVzIGZvciBiZmQKLUBjaW5kZXggZ3VpZGVsaW5lcywgYmZkIHByb2dyYW1taW5nCi0KLVRoZXJlIGlzIGEgbG90IG9mIHBvb3JseSB3cml0dGVuIGFuZCBjb25mdXNpbmcgY29kZSBpbiBCRkQuICBOZXcgQkZECi1jb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvIGEgaGlnaGVyIHN0YW5kYXJkLiAgTWVyZWx5IGJlY2F1c2Ugc29tZSBCRkQKLWNvZGUgaXMgd3JpdHRlbiBpbiBhIHBhcnRpY3VsYXIgbWFubmVyIGRvZXMgbm90IG1lYW4gdGhhdCB5b3Ugc2hvdWxkCi1lbXVsYXRlIGl0LgotCi1IZXJlIGFyZSBzb21lIGdlbmVyYWwgQkZEIHByb2dyYW1taW5nIGd1aWRlbGluZXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Gb2xsb3cgdGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1AaXRlbQotQXZvaWQgZ2xvYmFsIHZhcmlhYmxlcy4gIFdlIGlkZWFsbHkgd2FudCBCRkQgdG8gYmUgZnVsbHkgcmVlbnRyYW50LCBzbwotdGhhdCBpdCBjYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB0aHJlYWRzLiAgQWxsIHVzZXMgb2YgZ2xvYmFsIG9yIHN0YXRpYwotdmFyaWFibGVzIGludGVyZmVyZSB3aXRoIHRoYXQuICBJbml0aWFsaXplZCBjb25zdGFudCB2YXJpYWJsZXMgYXJlIE9LLAotYW5kIHRoZXkgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbWFya2VkIHdpdGggY29uc3QuICBJbnN0ZWFkIG9mIGdsb2JhbAotdmFyaWFibGVzLCB1c2UgZGF0YSBhdHRhY2hlZCB0byBhIEJGRCBvciB0byBhIGxpbmtlciBoYXNoIHRhYmxlLgotCi1AaXRlbQotQWxsIGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbnMgc2hvdWxkIGhhdmUgbmFtZXMgd2hpY2ggc3RhcnQgd2l0aAotQHNhbXB7YmZkX30uICBBbGwgc3VjaCBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIGluIHNvbWUgaGVhZGVyIGZpbGUsCi10eXBpY2FsbHkgQGZpbGV7YmZkLmh9LiAgU2VlLCBmb3IgZXhhbXBsZSwgdGhlIHZhcmlvdXMgZGVjbGFyYXRpb25zIG5lYXIKLXRoZSBlbmQgb2YgQGZpbGV7YmZkLWluLmh9LCB3aGljaCBtb3N0bHkgZGVjbGFyZSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkKLXNwZWNpZmljIGxpbmtlciBlbXVsYXRpb25zLgotCi1AaXRlbQotQWxsIGZ1bmN0aW9ucyB3aGljaCBuZWVkIHRvIGJlIHZpc2libGUgZnJvbSBvbmUgZmlsZSB0byBhbm90aGVyIHdpdGhpbgotQkZELCBidXQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIG91dHNpZGUgb2YgQkZELCBzaG91bGQgc3RhcnQgd2l0aAotQHNhbXB7X2JmZF99LiAgQWx0aG91Z2ggZXh0ZXJuYWwgbmFtZXMgYmVnaW5uaW5nIHdpdGggQHNhbXB7X30gYXJlCi1wcm9oaWJpdGVkIGJ5IHRoZSBBTlNJIHN0YW5kYXJkLCBpbiBwcmFjdGljZSB0aGlzIHVzYWdlIHdpbGwgYWx3YXlzCi13b3JrLCBhbmQgaXQgaXMgcmVxdWlyZWQgYnkgdGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1AaXRlbQotQWx3YXlzIHJlbWVtYmVyIHRoYXQgcGVvcGxlIGNhbiBjb21waWxlIHVzaW5nIEBzYW1wey0tZW5hYmxlLXRhcmdldHN9IHRvCi1idWlsZCBzZXZlcmFsLCBvciBhbGwsIHRhcmdldHMgYXQgb25jZS4gIEl0IG11c3QgYmUgcG9zc2libGUgdG8gbGluawotdG9nZXRoZXIgdGhlIGZpbGVzIGZvciBhbGwgdGFyZ2V0cy4KLQotQGl0ZW0KLUJGRCBjb2RlIHNob3VsZCBjb21waWxlIHdpdGggZmV3IG9yIG5vIHdhcm5pbmdzIHVzaW5nIEBzYW1we2djYyAtV2FsbH0uCi1Tb21lIHdhcm5pbmdzIGFyZSBPSywgbGlrZSB0aGUgYWJzZW5jZSBvZiBjZXJ0YWluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gIFdhcm5pbmdzIGFib3V0Ci1hbWJpZ3VvdXMgZXhwcmVzc2lvbnMgYW5kIHRoZSBsaWtlIHNob3VsZCBhbHdheXMgYmUgZml4ZWQuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IKLUBzZWN0aW9uIEJGRCB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IGJmZCB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IHRhcmdldCB2ZWN0b3IgaW4gYmZkCi0KLUJGRCBzdXBwb3J0cyBtdWx0aXBsZSBvYmplY3QgZmlsZSBmb3JtYXRzIGJ5IHVzaW5nIHRoZSBAZGZue3RhcmdldAotdmVjdG9yfS4gIFRoaXMgaXMgc2ltcGx5IGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGltcGxlbWVudAotYmVoYXZpb3VyIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4KLQotSW4gdGhpcyBzZWN0aW9uIEkgbGlzdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4gdGhlIHRhcmdldCB2ZWN0b3IgYW5kCi1kZXNjcmliZSB3aGF0IHRoZXkgZG8uCi0KLUBtZW51Ci0qIEJGRCB0YXJnZXQgdmVjdG9yIG1pc2NlbGxhbmVvdXM6OglNaXNjZWxsYW5lb3VzIGNvbnN0YW50cwotKiBCRkQgdGFyZ2V0IHZlY3RvciBzd2FwOjoJCVN3YXBwaW5nIGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBmb3JtYXQ6OgkJRm9ybWF0IHR5cGUgZGVwZW5kZW50IGZ1bmN0aW9ucwotKiBCRkRfSlVNUF9UQUJMRSBtYWNyb3M6OgkJQkZEX0pVTVBfVEFCTEUgbWFjcm9zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGdlbmVyaWM6OgkJR2VuZXJpYyBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3IgY29weTo6CQlDb3B5IGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBjb3JlOjoJCUNvcmUgZmlsZSBzdXBwb3J0IGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBhcmNoaXZlOjoJCUFyY2hpdmUgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHN5bWJvbHM6OgkJU3ltYm9sIHRhYmxlIGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciByZWxvY3M6OgkJUmVsb2NhdGlvbiBzdXBwb3J0Ci0qIEJGRCB0YXJnZXQgdmVjdG9yIHdyaXRlOjoJCU91dHB1dCBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3IgbGluazo6CQlMaW5rZXIgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGR5bmFtaWM6OgkJRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGZ1bmN0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIG1pc2NlbGxhbmVvdXMKLUBzdWJzZWN0aW9uIE1pc2NlbGxhbmVvdXMgY29uc3RhbnRzCi0KLVRoZSB0YXJnZXQgdmVjdG9yIHN0YXJ0cyB3aXRoIGEgc2V0IG9mIGNvbnN0YW50cy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBuYW1lCi1UaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHZlY3Rvci4gIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IHN0cmluZy4gIFRoaXMgaXMKLWhvdyB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBpbiBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgdG9vbHMgd2hpY2gKLXVzZSBCRkQsIHN1Y2ggYXMgdGhlIEBzYW1wey1vZm9ybWF0fSBsaW5rZXIgb3B0aW9uLgotCi1AaXRlbSBmbGF2b3VyCi1BIGdlbmVyYWwgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgdGFyZ2V0LiAgVGhlIGZvbGxvd2luZyBmbGF2b3VycyBhcmUKLWN1cnJlbnRseSBkZWZpbmVkOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyCi1VbmRlZmluZWQgb3IgdW5rbm93bi4KLUBpdGVtIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi1hLm91dC4KLUBpdGVtIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi1DT0ZGLgotQGl0ZW0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi1FQ09GRi4KLUBpdGVtIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLUVMRi4KLUBpdGVtIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyCi1JRUVFLTY5NS4KLUBpdGVtIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIKLU5MTS4KLUBpdGVtIGJmZF90YXJnZXRfb2FzeXNfZmxhdm91cgotT0FTWVMuCi1AaXRlbSBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyCi1UZWt0cm9uaXggaGV4IGZvcm1hdC4KLUBpdGVtIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyCi1Nb3Rvcm9sYSBTLXJlY29yZCBmb3JtYXQuCi1AaXRlbSBiZmRfdGFyZ2V0X2loZXhfZmxhdm91cgotSW50ZWwgaGV4IGZvcm1hdC4KLUBpdGVtIGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKLVNPTSAodXNlZCBvbiBIUC9VWCkuCi1AaXRlbSBiZmRfdGFyZ2V0X29zOWtfZmxhdm91cgotb3M5MDAwLgotQGl0ZW0gYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyCi1WRVJTQWRvcy4KLUBpdGVtIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91cgotTVMtRE9TLgotQGl0ZW0gYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKLW9wZW5WTVMuCi1AZW5kIHRhYmxlCi0KLUBpdGVtIGJ5dGVvcmRlcgotVGhlIGJ5dGUgb3JkZXIgb2YgZGF0YSBpbiB0aGUgb2JqZWN0IGZpbGUuICBPbmUgb2YKLUBzYW1we0JGRF9FTkRJQU5fQklHfSwgQHNhbXB7QkZEX0VORElBTl9MSVRUTEV9LCBvcgotQHNhbXB7QkZEX0VORElBTl9VTktOT1dOfS4gIFRoZSBsYXR0ZXIgd291bGQgYmUgdXNlZCBmb3IgYSBmb3JtYXQgc3VjaAotYXMgUy1yZWNvcmRzIHdoaWNoIGRvIG5vdCByZWNvcmQgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgZGF0YS4KLQotQGl0ZW0gaGVhZGVyX2J5dGVvcmRlcgotVGhlIGJ5dGUgb3JkZXIgb2YgaGVhZGVyIGluZm9ybWF0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4gIE5vcm1hbGx5IHRoZQotc2FtZSBhcyB0aGUgQHNhbXB7Ynl0ZW9yZGVyfSBmaWVsZCwgYnV0IHRoZXJlIGFyZSBjZXJ0YWluIGNhc2VzIHdoZXJlIGl0Ci1tYXkgYmUgZGlmZmVyZW50LgotCi1AaXRlbSBvYmplY3RfZmxhZ3MKLUZsYWdzIHdoaWNoIG1heSBhcHBlYXIgaW4gdGhlIEBzYW1we2ZsYWdzfSBmaWVsZCBvZiBhIEJGRCB3aXRoIHRoaXMKLWZvcm1hdC4KLQotQGl0ZW0gc2VjdGlvbl9mbGFncwotRmxhZ3Mgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUgQHNhbXB7ZmxhZ3N9IGZpZWxkIG9mIGEgc2VjdGlvbiB3aXRoaW4gYQotQkZEIHdpdGggdGhpcyBmb3JtYXQuCi0KLUBpdGVtIHN5bWJvbF9sZWFkaW5nX2NoYXIKLUEgY2hhcmFjdGVyIHdoaWNoIHRoZSBDIGNvbXBpbGVyIG5vcm1hbGx5IHB1dHMgYmVmb3JlIGEgc3ltYm9sLiAgRm9yCi1leGFtcGxlLCBhbiBhLm91dCBjb21waWxlciB3aWxsIHR5cGljYWxseSBnZW5lcmF0ZSB0aGUgc3ltYm9sCi1Ac2FtcHtfZm9vfSBmb3IgYSBmdW5jdGlvbiBuYW1lZCBAc2FtcHtmb299IGluIHRoZSBDIHNvdXJjZSwgaW4gd2hpY2gKLWNhc2UgdGhpcyBmaWVsZCB3b3VsZCBiZSBAc2FtcHtffS4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggY2hhcmFjdGVyLCB0aGlzCi1maWVsZCB3aWxsIGJlIEBzYW1wezB9LgotCi1AaXRlbSBhcl9wYWRfY2hhcgotVGhlIHBhZGRpbmcgY2hhcmFjdGVyIHRvIHVzZSBhdCB0aGUgZW5kIG9mIGFuIGFyY2hpdmUgbmFtZS4gIE5vcm1hbGx5Ci1Ac2FtcHsvfS4KLQotQGl0ZW0gYXJfbWF4X25hbWVsZW4KLVRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHNob3J0IG5hbWUgaW4gYW4gYXJjaGl2ZS4gIE5vcm1hbGx5IEBzYW1wezE0fS4KLQotQGl0ZW0gYmFja2VuZF9kYXRhCi1BIHBvaW50ZXIgdG8gY29uc3RhbnQgYmFja2VuZCBkYXRhLiAgVGhpcyBpcyB1c2VkIGJ5IGJhY2tlbmRzIHRvIHN0b3JlCi13aGF0ZXZlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoZXkgbmVlZCB0byBkaXN0aW5ndWlzaCBzaW1pbGFyIHRhcmdldAotdmVjdG9ycyB3aGljaCB1c2UgdGhlIHNhbWUgc2V0cyBvZiBmdW5jdGlvbnMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHN3YXAKLUBzdWJzZWN0aW9uIFN3YXBwaW5nIGZ1bmN0aW9ucwotCi1FdmVyeSB0YXJnZXQgdmVjdG9yIGhhcyBmdWN0aW9uIHBvaW50ZXJzIHVzZWQgZm9yIHN3YXBwaW5nIGluZm9ybWF0aW9uCi1pbiBhbmQgb3V0IG9mIHRoZSB0YXJnZXQgcmVwcmVzZW50YXRpb24uICBUaGVyZSBhcmUgdHdvIHNldHMgb2YKLWZ1bmN0aW9uczogb25lIGZvciBkYXRhIGluZm9ybWF0aW9uLCBhbmQgb25lIGZvciBoZWFkZXIgaW5mb3JtYXRpb24uCi1FYWNoIHNldCBoYXMgdGhyZWUgc2l6ZXM6IDY0LWJpdCwgMzItYml0LCBhbmQgMTYtYml0LiAgRWFjaCBzaXplIGhhcwotdGhyZWUgYWN0dWFsIGZ1bmN0aW9uczogcHV0LCBnZXQgdW5zaWduZWQsIGFuZCBnZXQgc2lnbmVkLgotCi1UaGVzZSAxOCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29udmVydCBkYXRhIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRhcmdldAotcmVwcmVzZW50YXRpb25zLgotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBmb3JtYXQKLUBzdWJzZWN0aW9uIEZvcm1hdCB0eXBlIGRlcGVuZGVudCBmdW5jdGlvbnMKLQotRXZlcnkgdGFyZ2V0IHZlY3RvciBoYXMgdGhyZWUgYXJyYXlzIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGFyZQotaW5kZXhlZCBieSB0aGUgQkZEIGZvcm1hdCB0eXBlLiAgVGhlIEJGRCBmb3JtYXQgdHlwZXMgYXJlIGFzIGZvbGxvd3M6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmZkX3Vua25vd24KLVVua25vd24gZm9ybWF0LiAgTm90IHVzZWQgZm9yIGFueXRoaW5nIHVzZWZ1bC4KLUBpdGVtIGJmZF9vYmplY3QKLU9iamVjdCBmaWxlLgotQGl0ZW0gYmZkX2FyY2hpdmUKLUFyY2hpdmUgZmlsZS4KLUBpdGVtIGJmZF9jb3JlCi1Db3JlIGZpbGUuCi1AZW5kIHRhYmxlCi0KLVRoZSB0aHJlZSBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgYXJlIGFzIGZvbGxvd3M6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmZkX2NoZWNrX2Zvcm1hdAotQ2hlY2sgd2hldGhlciB0aGUgQkZEIGlzIG9mIGEgcGFydGljdWxhciBmb3JtYXQgKG9iamVjdCBmaWxlLCBhcmNoaXZlCi1maWxlLCBvciBjb3JlIGZpbGUpIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyBjYWxsZWQKLWJ5IHRoZSBAc2FtcHtiZmRfY2hlY2tfZm9ybWF0fSBmdW5jdGlvbiB3aGVuIGV4YW1pbmluZyBhbiBleGlzdGluZyBCRkQuCi1JZiB0aGUgQkZEIG1hdGNoZXMgdGhlIGRlc2lyZWQgZm9ybWF0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSBhbnkKLWZvcm1hdCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBAc2FtcHt0ZGF0YX0gZmllbGQgb2YgdGhlIEJGRC4KLVRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBCRkQgdGFyZ2V0IHZlY3RvciBmdW5jdGlvbgotb24gYSBmaWxlIG9wZW5lZCBmb3IgcmVhZGluZy4KLQotQGl0ZW0gYmZkX3NldF9mb3JtYXQKLVNldCB0aGUgZm9ybWF0IG9mIGEgQkZEIHdoaWNoIHdhcyBjcmVhdGVkIGZvciBvdXRwdXQuICBUaGlzIGlzIGNhbGxlZCBieQotdGhlIEBzYW1we2JmZF9zZXRfZm9ybWF0fSBmdW5jdGlvbiBhZnRlciBjcmVhdGluZyB0aGUgQkZEIHdpdGggYQotZnVuY3Rpb24gc3VjaCBhcyBAc2FtcHtiZmRfb3Blbnd9LiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgZm9ybWF0Ci1zcGVjaWZpYyBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byB3cml0ZSBvdXQgYW4gb2JqZWN0IGZpbGUgb3Igd2hhdGV2ZXIgb2YKLXRoZSBnaXZlbiBmb3JtYXQuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgQkZECi10YXJnZXQgdmVjdG9yIGZ1bmN0aW9uIG9uIGEgZmlsZSBvcGVuZWQgZm9yIHdyaXRpbmcuCi0KLUBpdGVtIGJmZF93cml0ZV9jb250ZW50cwotV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgQkZEIGluIHRoZSBnaXZlbiBmb3JtYXQuICBUaGlzIGlzIGNhbGxlZAotYnkgQHNhbXB7YmZkX2Nsb3NlfSBmdW5jdGlvbiBmb3IgYSBCRkQgb3BlbmVkIGZvciB3cml0aW5nLiAgVGhpcyByZWFsbHkKLXNob3VsZCBub3QgYmUgYW4gYXJyYXkgc2VsZWN0ZWQgYnkgZm9ybWF0IHR5cGUsIGFzIHRoZQotQHNhbXB7YmZkX3NldF9mb3JtYXR9IGZ1bmN0aW9uIHByb3ZpZGVzIGFsbCB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24uCi1JbiBmYWN0LCBCRkQgd2lsbCBmYWlsIGlmIGEgZGlmZmVyZW50IGZvcm1hdCBpcyB1c2VkIHdoZW4gY2FsbGluZwotdGhyb3VnaCB0aGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGFuZCB0aGUgQHNhbXB7YmZkX3dyaXRlX2NvbnRlbnRzfQotYXJyYXlzOyBmb3J0dW5hdGVseSwgc2luY2UgQHNhbXB7YmZkX2Nsb3NlfSBnZXRzIGl0IHJpZ2h0LCB0aGlzIGlzIGEKLWRpZmZpY3VsdCBlcnJvciB0byBtYWtlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkRfSlVNUF9UQUJMRSBtYWNyb3MKLUBzdWJzZWN0aW9uIEBzYW1we0JGRF9KVU1QX1RBQkxFfSBtYWNyb3MKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEV9Ci0KLU1vc3QgdGFyZ2V0IHZlY3RvcnMgYXJlIGRlZmluZWQgdXNpbmcgQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3Jvcy4KLVRoZXNlIG1hY3JvcyB0YWtlIGEgc2luZ2xlIGFyZ3VtZW50LCB3aGljaCBpcyBhIHByZWZpeCBhcHBsaWVkIHRvIGEgc2V0Ci1vZiBmdW5jdGlvbnMuICBUaGUgbWFjcm9zIGFyZSB0aGVuIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoZQotdGFyZ2V0IHZlY3Rvci4KLQotRm9yIGV4YW1wbGUsIHRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1N9IG1hY3JvIGRlZmluZXMgdGhyZWUKLWZ1bmN0aW9uczogQHNhbXB7X2dldF9yZWxvY191cHBlcl9ib3VuZH0sIEBzYW1we19jYW5vbmljYWxpemVfcmVsb2N9LAotYW5kIEBzYW1we19iZmRfcmVsb2NfdHlwZV9sb29rdXB9LiAgQSByZWZlcmVuY2UgbGlrZQotQHNhbXB7QkZEX0pVTVBfVEFCTEVfUkVMT0NTIChmb28pfSB3aWxsIGV4cGFuZCBpbnRvIHRocmVlIGZ1bmN0aW9ucwotcHJlZml4ZWQgd2l0aCBAc2FtcHtmb299OiBAc2FtcHtmb29fZ2V0X3JlbG9jX3VwcGVyX2ZvdW5kfSwgZXRjLiAgVGhlCi1Ac2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1N9IG1hY3JvIHdpbGwgYmUgcGxhY2VkIHN1Y2ggdGhhdCB0aG9zZSB0aHJlZQotZnVuY3Rpb25zIGluaXRpYWxpemUgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBpbiB0aGUgQkZEIHRhcmdldCB2ZWN0b3IuCi0KLVRoaXMgaXMgZG9uZSBiZWNhdXNlIGl0IHR1cm5zIG91dCB0aGF0IG1hbnkgZGlmZmVyZW50IHRhcmdldCB2ZWN0b3JzIGNhbgotc2hhcmUgY2VydGFpbiBjbGFzc2VzIG9mIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBhcmNoaXZlcyBhcmUgc2ltaWxhcgotb24gbW9zdCBwbGF0Zm9ybXMsIHNvIG1vc3QgdGFyZ2V0IHZlY3RvcnMgY2FuIHVzZSB0aGUgc2FtZSBhcmNoaXZlCi1mdW5jdGlvbnMuICBUaG9zZSB0YXJnZXQgdmVjdG9ycyBhbGwgdXNlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9Ci13aXRoIHRoZSBzYW1lIGFyZ3VtZW50LCBjYWxsaW5nIGEgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBpcyBkZWZpbmVkIGluCi1AZmlsZXthcmNoaXZlLmN9LgotCi1FYWNoIG9mIHRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRX0gbWFjcm9zIGlzIG1lbnRpb25lZCBiZWxvdyBhbG9uZyB3aXRoCi10aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGl0IGRlZmluZXMuICBUaGUgZnVuY3Rpb24KLXBvaW50ZXJzIHdpbGwgYmUgZGVzY3JpYmVkIHVzaW5nIHRoZSBuYW1lIHdpdGhvdXQgdGhlIHByZWZpeCB3aGljaCB0aGUKLUBzYW1we0JGRF9KVU1QX1RBQkxFfSBtYWNybyBkZWZpbmVzLiAgVGhpcyBuYW1lIGlzIG5vcm1hbGx5IHRoZSBzYW1lIGFzCi10aGUgbmFtZSBvZiB0aGUgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3Igc3RydWN0dXJlLiAgQW55IGRpZmZlcmVuY2VzCi13aWxsIGJlIG5vdGVkLgotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBnZW5lcmljCi1Ac3Vic2VjdGlvbiBHZW5lcmljIGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9HRU5FUklDfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfR0VORVJJQ30gbWFjcm8gaXMgdXNlZCBmb3Igc29tZSBjYXRjaCBhbGwKLWZ1bmN0aW9ucyB3aGljaCBkb24ndCBlYXNpbHkgZml0IGludG8gb3RoZXIgY2F0ZWdvcmllcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfY2xvc2VfYW5kX2NsZWFudXAKLUZyZWUgYW55IHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEJGRC4gIFRoaXMgaXMKLWNhbGxlZCB3aGVuIGFueSBCRkQgaXMgY2xvc2VkICh0aGUgQHNhbXB7YmZkX3dyaXRlX2NvbnRlbnRzfSBmdW5jdGlvbgotbWVudGlvbmVkIGVhcmxpZXIgaXMgb25seSBjYWxsZWQgZm9yIGEgQkZEIG9wZW5lZCBmb3Igd3JpdGluZykuICBNb3N0Ci10YXJnZXRzIHVzZSBAc2FtcHtiZmRfYWxsb2N9IHRvIGFsbG9jYXRlIGFsbCB0YXJnZXQgc3BlY2lmaWMKLWluZm9ybWF0aW9uLCBhbmQgdGhlcmVmb3JlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLVRoaXMgZnVuY3Rpb24gcG9pbnRlciBpcyB0eXBpY2FsbHkgc2V0IHRvCi1Ac2FtcHtfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXB9LCB3aGljaCBzaW1wbHkgcmV0dXJucyB0cnVlLgotCi1AaXRlbSBfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLUZyZWUgYW55IGNhY2hlZCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEJGRCB3aGljaCBjYW4gYmUKLXJlY3JlYXRlZCBsYXRlciBpZiBuZWNlc3NhcnkuICBUaGlzIGlzIHVzZWQgdG8gcmVkdWNlIHRoZSBtZW1vcnkKLWNvbnN1bXB0aW9uIHJlcXVpcmVkIGJ5IHByb2dyYW1zIHVzaW5nIEJGRC4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIHZpYQotdGhlIEBzYW1we2JmZF9mcmVlX2NhY2hlZF9pbmZvfSBtYWNyby4gIEl0IGlzIHVzZWQgYnkgdGhlIGRlZmF1bHQKLWFyY2hpdmUgcm91dGluZXMgd2hlbiBjb21wdXRpbmcgdGhlIGFyY2hpdmUgbWFwLiAgTW9zdCB0YXJnZXRzIGRvIG5vdAotZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBlbnRyeSBwb2ludCwgYW5kIGp1c3Qgc2V0IGl0IHRvCi1Ac2FtcHtfYmZkX2dlbmVyaWNfZnJlZV9jYWNoZWRfaW5mb30sIHdoaWNoIHNpbXBseSByZXR1cm5zIHRydWUuCi0KLUBpdGVtIF9uZXdfc2VjdGlvbl9ob29rCi1UaGlzIGlzIGNhbGxlZCBmcm9tIEBzYW1we2JmZF9tYWtlX3NlY3Rpb25fYW55d2F5fSB3aGVuZXZlciBhIG5ldwotc2VjdGlvbiBpcyBjcmVhdGVkLiAgTW9zdCB0YXJnZXRzIHVzZSBpdCB0byBpbml0aWFsaXplIHNlY3Rpb24gc3BlY2lmaWMKLWluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hldGhlciBvciBub3QgdGhlIHNlY3Rpb24KLWNvcnJlc3BvbmRzIHRvIGFuIGFjdHVhbCBzZWN0aW9uIGluIGFuIGFjdHVhbCBCRkQuCi0KLUBpdGVtIF9nZXRfc2VjdGlvbl9jb250ZW50cwotR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBmcm9tCi1Ac2FtcHtiZmRfZ2V0X3NlY3Rpb25fY29udGVudHN9LiAgTW9zdCB0YXJnZXRzIHNldCB0aGlzIHRvCi1Ac2FtcHtfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHN9LCB3aGljaCBkb2VzIGEgQHNhbXB7YmZkX3NlZWt9Ci1iYXNlZCBvbiB0aGUgc2VjdGlvbidzIEBzYW1we2ZpbGVwb3N9IGZpZWxkIGFuZCBhIEBzYW1we2JmZF9yZWFkfS4gIFRoZQotY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c30uCi0KLUBpdGVtIF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLVNldCBhIEBzYW1we2JmZF93aW5kb3d9IHRvIGhvbGQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRoaXMgaXMKLWNhbGxlZCBmcm9tIEBzYW1we2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3d9LiAgVGhlCi1Ac2FtcHtiZmRfd2luZG93fSBpZGVhIG5ldmVyIHJlYWxseSBjYXVnaHQgb24sIGFuZCBJIGRvbid0IHRoaW5rIHRoaXMgaXMKLWV2ZXIgY2FsbGVkLiAgUHJldHR5IG11Y2ggYWxsIHRhcmdldHMgaW1wbGVtZW50IHRoaXMgYXMKLUBzYW1we2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvd30sIHdoaWNoIHVzZXMKLUBzYW1we2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c30gdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvd30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGNvcHkKLUBzdWJzZWN0aW9uIENvcHkgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUFl9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9DT1BZfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggYXJlCi1jYWxsZWQgd2hlbiBjb3B5aW5nIEJGRHMsIGFuZCBmb3IgYSBjb3VwbGUgb2YgZnVuY3Rpb25zIHdoaWNoIGRlYWwgd2l0aAotaW50ZXJuYWwgQkZEIGluZm9ybWF0aW9uLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi1UaGlzIGlzIGNhbGxlZCB3aGVuIGNvcHlpbmcgYSBCRkQsIHZpYSBAc2FtcHtiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhfS4KLUlmIHRoZSBpbnB1dCBhbmQgb3V0cHV0IEJGRHMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQsIHRoaXMgd2lsbCBjb3B5IGFueQotcHJpdmF0ZSBpbmZvcm1hdGlvbiBvdmVyLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi1oYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IGZpbGUuICBPbmx5IGEgZmV3IHRhcmdldHMgZG8gYW55dGhpbmcgaW4KLXRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotVGhpcyBpcyBjYWxsZWQgd2hlbiBsaW5raW5nLCB2aWEgQHNhbXB7YmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGF9LiAgSXQKLWdpdmVzIHRoZSBiYWNrZW5kIGxpbmtlciBjb2RlIGEgY2hhbmNlIHRvIHNldCBhbnkgc3BlY2lhbCBmbGFncyBpbiB0aGUKLW91dHB1dCBmaWxlIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgZmlsZS4gIE9ubHkgYSBmZXcgdGFyZ2V0cwotZG8gYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi1UaGlzIGlzIHNpbWlsYXIgdG8gQHNhbXB7X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGF9LCBidXQgaXQgaXMgY2FsbGVkCi1mb3IgZWFjaCBzZWN0aW9uLCB2aWEgQHNhbXB7YmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGF9LiAgVGhpcwotZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBhbnkgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gd3JpdHRlbi4gIE9ubHkKLWEgZmV3IHRhcmdldHMgZG8gYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLVRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhfSwgYnV0IEkgZG9uJ3QKLXRoaW5rIGFueXRoaW5nIGFjdHVhbGx5IGNhbGxzIGl0LiAgSWYgaXQgd2VyZSBkZWZpbmVkLCBpdCBjb3VsZCBiZSB1c2VkCi10byBjb3B5IHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgQkZEIHRvIGFub3RoZXIuICBIb3dldmVyLCBtb3N0IEJGRHMKLXN0b3JlIGV4dHJhIHN5bWJvbCBpbmZvcm1hdGlvbiBieSBhbGxvY2F0aW5nIHNwYWNlIHdoaWNoIGlzIGxhcmdlciB0aGFuCi10aGUgQHNhbXB7YXN5bWJvbH0gc3RydWN0dXJlIGFuZCBzdG9yaW5nIHByaXZhdGUgaW5mb3JtYXRpb24gaW4gdGhlCi1leHRyYSBzcGFjZS4gIFNpbmNlIEBzYW1we29iamNvcHl9IGFuZCBvdGhlciBwcm9ncmFtcyBjb3B5IHN5bWJvbAotaW5mb3JtYXRpb24gYnkgY29weWluZyBwb2ludGVycyB0byBAc2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmVzLCB0aGUKLXByaXZhdGUgc3ltYm9sIGluZm9ybWF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgY29waWVkIGFzIHdlbGwuICBNb3N0Ci10YXJnZXRzIGRvIG5vdCBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi1UaGlzIGlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX3NldF9wcml2YXRlX2ZsYWdzfS4gIEl0IGlzIGJhc2ljYWxseSBhIGhvb2sKLWZvciB0aGUgYXNzZW1ibGVyIHRvIHNldCBtYWdpYyBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCB0aGUgUG93ZXJQQwotRUxGIGFzc2VtYmxlciB1c2VzIGl0IHRvIHNldCBmbGFncyB3aGljaCBhcHBlYXIgaW4gdGhlIGVfZmxhZ3MgZmllbGQgb2YKLXRoZSBFTEYgaGVhZGVyLiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLVRoaXMgaXMgY2FsbGVkIGJ5IEBzYW1we29iamR1bXB9IHdoZW4gdGhlIEBzYW1wey1wfSBvcHRpb24gaXMgdXNlZC4gIEl0Ci1pcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9wcmludF9wcml2YXRlX2RhdGF9LiAgSXQgcHJpbnRzIGFueSBpbnRlcmVzdGluZwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJGRCB3aGljaCBjYW4gbm90IGJlIG90aGVyd2lzZSByZXByZXNlbnRlZCBieSBCRkQKLWFuZCB0aHVzIGNhbiBub3QgYmUgcHJpbnRlZCBieSBAc2FtcHtvYmpkdW1wfS4gIE1vc3QgdGFyZ2V0cyBkbyBub3QgZG8KLWFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGNvcmUKLUBzdWJzZWN0aW9uIENvcmUgZmlsZSBzdXBwb3J0IGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9DT1JFfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfQ09SRX0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggY29yZSBmaWxlcy4gIE9idmlvdXNseSwgdGhlc2UgZnVuY3Rpb25zIG9ubHkgZG8gc29tZXRoaW5nCi1pbnRlcmVzdGluZyBmb3IgdGFyZ2V0cyB3aGljaCBoYXZlIGNvcmUgZmlsZSBzdXBwb3J0LgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi1HaXZlbiBhIGNvcmUgZmlsZSwgdGhpcyByZXR1cm5zIHRoZSBjb21tYW5kIHdoaWNoIHdhcyBydW4gdG8gcHJvZHVjZSB0aGUKLWNvcmUgZmlsZS4KLQotQGl0ZW0gX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotR2l2ZW4gYSBjb3JlIGZpbGUsIHRoaXMgcmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBwcm9kdWNlZCB0aGUKLWNvcmUgZmlsZS4KLQotQGl0ZW0gX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotR2l2ZW4gYSBjb3JlIGZpbGUgYW5kIGEgQkZEIGZvciBhbiBleGVjdXRhYmxlLCB0aGlzIHJldHVybnMgd2hldGhlciB0aGUKLWNvcmUgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRhYmxlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBhcmNoaXZlCi1Ac3Vic2VjdGlvbiBBcmNoaXZlIGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9BUkNISVZFfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfQVJDSElWRX0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggYXJjaGl2ZSBmaWxlcy4gIE1vc3QgdGFyZ2V0cyB1c2UgQ09GRiBzdHlsZSBhcmNoaXZlIGZpbGVzCi0oaW5jbHVkaW5nIEVMRiB0YXJnZXRzKSwgYW5kIHRoZXNlIHVzZSBAc2FtcHtfYmZkX2FyY2hpdmVfY29mZn0gYXMgdGhlCi1hcmd1bWVudCB0byBAc2FtcHtCRkRfSlVNUF9UQUJMRV9BUkNISVZFfS4gIFNvbWUgdGFyZ2V0cyB1c2UgQlNEL2Eub3V0Ci1zdHlsZSBhcmNoaXZlcywgYW5kIHRoZXNlIHVzZSBAc2FtcHtfYmZkX2FyY2hpdmVfYnNkfS4gIChUaGUgbWFpbgotZGlmZmVyZW5jZSBiZXR3ZWVuIEJTRCBhbmQgQ09GRiBhcmNoaXZlcyBpcyB0aGUgZm9ybWF0IG9mIHRoZSBhcmNoaXZlCi1zeW1ib2wgdGFibGUpLiAgVGFyZ2V0cyB3aXRoIG5vIGFyY2hpdmUgc3VwcG9ydCB1c2UKLUBzYW1we19iZmRfbm9hcmNoaXZlfS4gIEZpbmFsbHksIGEgZmV3IHRhcmdldHMgaGF2ZSB1bnVzdWFsIGFyY2hpdmUKLWhhbmRsaW5nLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9zbHVycF9hcm1hcAotUmVhZCBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUsIHN0b3JpbmcgaXQgaW4gcHJpdmF0ZSBCRkQgZGF0YS4gIFRoaXMKLWlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we2NoZWNrX2Zvcm1hdH0gcm91dGluZS4gIFRoZQotY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9zbHVycF9hcm1hcH0uCi0KLUBpdGVtIF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi1SZWFkIGluIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIGZyb20gdGhlIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSwKLXN0b3JpbmcgaXQgaW4gcHJpdmF0ZSBCRkQgZGF0YS4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlCi1hcmNoaXZlIEBzYW1we2NoZWNrX2Zvcm1hdH0gcm91dGluZS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGV9LgotCi1AaXRlbSBjb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotQnVpbGQgYW5kIHJldHVybiBhbiBleHRlbmRlZCBuYW1lIHRhYmxlIGlmIG9uZSBpcyBuZWVkZWQgdG8gd3JpdGUgb3V0Ci10aGUgYXJjaGl2ZS4gIFRoaXMgYWxzbyBhZGp1c3RzIHRoZSBhcmNoaXZlIGhlYWRlcnMgdG8gcmVmZXIgdG8gdGhlCi1leHRlbmRlZCBuYW1lIHRhYmxlIGFwcHJvcHJpYXRlbHkuICBUaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZQotYXJjaGl2ZSBAc2FtcHt3cml0ZV9jb250ZW50c30gcm91dGluZS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlfS4KLQotQGl0ZW0gX3RydW5jYXRlX2FybmFtZQotVGhpcyBjb3BpZXMgYSBmaWxlIG5hbWUgaW50byBhbiBhcmNoaXZlIGhlYWRlciwgdHJ1bmNhdGluZyBpdCBhcwotcmVxdWlyZWQuICBJdCBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUgYXJjaGl2ZSBAc2FtcHt3cml0ZV9jb250ZW50c30KLXJvdXRpbmUuICBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgaW50ZXJlc3RpbmcgaW4gdGFyZ2V0cyB3aGljaCBkbyBub3QKLXN1cHBvcnQgZXh0ZW5kZWQgbmFtZSB0YWJsZXMsIGJ1dCBJIHRoaW5rIHRoZSBHTlUgQHNhbXB7YXJ9IHByb2dyYW0KLWFsd2F5cyB1c2VzIGV4dGVuZGVkIG5hbWUgdGFibGVzIGFueWhvdy4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX3RydW5jYXRlX2FybmFtZX0uCi0KLUBpdGVtIF93cml0ZV9hcm1hcAotV3JpdGUgb3V0IHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSB1c2luZyBjYWxscyB0byBAc2FtcHtiZmRfd3JpdGV9LgotVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUgYXJjaGl2ZSBAc2FtcHt3cml0ZV9jb250ZW50c30gcm91dGluZS4KLVRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we3dyaXRlX2FybWFwfQotKG5vIGxlYWRpbmcgdW5kZXJzY29yZSkuCi0KLUBpdGVtIF9yZWFkX2FyX2hkcgotUmVhZCBhbmQgcGFyc2UgYW4gYXJjaGl2ZSBoZWFkZXIuICBUaGlzIGhhbmRsZXMgZXhwYW5kaW5nIHRoZSBhcmNoaXZlCi1oZWFkZXIgbmFtZSBpbnRvIHRoZSByZWFsIGZpbGUgbmFtZSB1c2luZyB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gIFRoaXMKLWlzIGNhbGxlZCBieSByb3V0aW5lcyB3aGljaCByZWFkIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBvciB0aGUgYXJjaGl2ZQotaXRzZWxmLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfcmVhZF9hcl9oZHJfZm59LgotCi1AaXRlbSBfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi1HaXZlbiBhbiBhcmNoaXZlIGFuZCBhIEJGRCByZXByZXNlbnRpbmcgYSBmaWxlIHN0b3JlZCB3aXRoaW4gdGhlCi1hcmNoaXZlLCByZXR1cm4gYSBCRkQgZm9yIHRoZSBuZXh0IGZpbGUgaW4gdGhlIGFyY2hpdmUuICBUaGlzIGlzIGNhbGxlZAotdmlhIEBzYW1we2JmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGV9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZX0gKG5vIGxlYWRpbmcKLXVuZGVyc2NvcmUpLgotCi1AaXRlbSBfZ2V0X2VsdF9hdF9pbmRleAotR2l2ZW4gYW4gYXJjaGl2ZSBhbmQgYW4gaW5kZXgsIHJldHVybiBhIEJGRCBmb3IgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUKLWNvcnJlc3BvbmRpbmcgdG8gdGhhdCBlbnRyeSBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGNhbGxlZAotdmlhIEBzYW1we2JmZF9nZXRfZWx0X2F0X2luZGV4fS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9lbHRfYXRfaW5kZXh9LgotCi1AaXRlbSBfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci1EbyBhIHN0YXQgb24gYW4gZWxlbWVudCBvZiBhbiBhcmNoaXZlLCByZXR1cm5pbmcgaW5mb3JtYXRpb24gcmVhZCBmcm9tCi10aGUgYXJjaGl2ZSBoZWFkZXIgKG1vZGlmaWNhdGlvbiB0aW1lLCB1aWQsIGdpZCwgZmlsZSBtb2RlLCBzaXplKS4gIFRoaXMKLWlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX3N0YXRfYXJjaF9lbHR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc3RhdF9hcmNoX2VsdH0uCi0KLUBpdGVtIF91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi1BZnRlciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0LCB1cGRhdGUKLXRoZSB0aW1lc3RhbXAgb2YgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIHRvIGJlIG5ld2VyIHRoYW4gdGhhdCBvZiB0aGUKLWZpbGUuICBUaGlzIGlzIHJlcXVpcmVkIGZvciBhLm91dCBzdHlsZSBhcmNoaXZlcy4gIFRoaXMgaXMgbm9ybWFsbHkKLWNhbGxlZCBieSB0aGUgYXJjaGl2ZSBAc2FtcHt3cml0ZV9jb250ZW50c30gcm91dGluZS4gIFRoZSBjb3JyZXNwb25kaW5nCi1maWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXB9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBzeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgdGFibGUgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX1NZTUJPTFN9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9TWU1CT0xTfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBzeW1ib2xzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICBJbiBwcmFjdGljZSBtb3N0IHRhcmdldHMgcmV0dXJuIHRoZQotYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIEBzYW1we2FzeW1ib2x9IHBvaW50ZXJzIGZvciBhbGwgdGhlCi1zeW1ib2xzIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kIHN0b3JlIHRoZSBhY3R1YWwgc3ltYm9sCi1pbmZvcm1hdGlvbiBpbiBCRkQgcHJpdmF0ZSBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kfS4KLQotQGl0ZW0gX2dldF9zeW10YWIKLVJlYWQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY2Fub25pY2FsaXplX3N5bXRhYn0uCi0KLUBpdGVtIF9tYWtlX2VtcHR5X3N5bWJvbAotQ3JlYXRlIGFuIGVtcHR5IHN5bWJvbCBmb3IgdGhlIEJGRC4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgbW9zdCB0YXJnZXRzCi1zdG9yZSBleHRyYSBpbmZvcm1hdGlvbiB3aXRoIGVhY2ggc3ltYm9sIGJ5IGFsbG9jYXRpbmcgYSBzdHJ1Y3R1cmUKLWxhcmdlciB0aGFuIGFuIEBzYW1we2FzeW1ib2x9IGFuZCBzdG9yaW5nIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBhdCB0aGUKLWVuZC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSB0aGUgcmlnaHQgYW1vdW50IG9mIG1lbW9yeSwgYW5kIHJldHVybgotd2hhdCBsb29rcyBsaWtlIGEgcG9pbnRlciB0byBhbiBlbXB0eSBAc2FtcHthc3ltYm9sfS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX21ha2VfZW1wdHlfc3ltYm9sfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX21ha2VfZW1wdHlfc3ltYm9sfS4KLQotQGl0ZW0gX3ByaW50X3N5bWJvbAotUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3ByaW50X3N5bWJvbH0uICBPbmUgb2YgdGhlIGFyZ3VtZW50cyBpbmRpY2F0ZXMgd2hhdCBzb3J0IG9mCi1pbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJpbnRlZDoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfcHJpbnRfc3ltYm9sX25hbWUKLUp1c3QgcHJpbnQgdGhlIHN5bWJvbCBuYW1lLgotQGl0ZW0gYmZkX3ByaW50X3N5bWJvbF9tb3JlCi1QcmludCB0aGUgc3ltYm9sIG5hbWUgYW5kIHNvbWUgaW50ZXJlc3RpbmcgZmxhZ3MuICBJIGRvbid0IHRoaW5rCi1hbnl0aGluZyBhY3R1YWxseSB1c2VzIHRoaXMuCi1AaXRlbSBiZmRfcHJpbnRfc3ltYm9sX2FsbAotUHJpbnQgYWxsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeW1ib2wuICBUaGlzIGlzIHVzZWQgYnkgQHNhbXB7b2JqZHVtcH0KLXdoZW4gcnVuIHdpdGggdGhlIEBzYW1wey10fSBvcHRpb24uCi1AZW5kIHRhYmxlCi1UaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9wcmludF9zeW1ib2x9LgotCi1AaXRlbSBfZ2V0X3N5bWJvbF9pbmZvCi1SZXR1cm4gYSBzdGFuZGFyZCBzZXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX3N5bWJvbF9pbmZvfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9zeW1ib2xfaW5mb30uCi0KLUBpdGVtIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHN0cmluZyB3b3VsZCBub3JtYWxseSByZXByZXNlbnQgdGhlIG5hbWUgb2YgYQotbG9jYWwgbGFiZWwuICBUaGlzIGlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX2lzX2xvY2FsX2xhYmVsfSBhbmQKLUBzYW1we2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lfS4gIExvY2FsIGxhYmVscyBhcmUgbm9ybWFsbHkgZGlzY2FyZGVkIGJ5Ci10aGUgYXNzZW1ibGVyLiAgSW4gdGhlIGxpbmtlciwgdGhpcyBkZWZpbmVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCi1Ac2FtcHsteH0gYW5kIEBzYW1wey1YfSBvcHRpb25zLgotCi1AaXRlbSBfZ2V0X2xpbmVubwotUmV0dXJuIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsCi1mb3IgYSBDT0ZGIHRhcmdldC4gIFRoaXMgaXMgY2FsbGVkIHdoZW4gd3JpdGluZyBvdXQgQ09GRiBsaW5lIG51bWJlcnMuCi0KLUBpdGVtIF9maW5kX25lYXJlc3RfbGluZQotR2l2ZW4gYW4gYWRkcmVzcyB3aXRoaW4gYSBzZWN0aW9uLCB1c2UgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBmaW5kCi10aGUgbWF0Y2hpbmcgZmlsZSBuYW1lLCBmdW5jdGlvbiBuYW1lLCBhbmQgbGluZSBudW1iZXIsIGlmIGFueS4gIFRoaXMgaXMKLWNhbGxlZCB2aWEgQHNhbXB7YmZkX2ZpbmRfbmVhcmVzdF9saW5lfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2ZpbmRfbmVhcmVzdF9saW5lfS4KLQotQGl0ZW0gX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotTWFrZSBhIGRlYnVnZ2luZyBzeW1ib2wuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBDT0ZGIHRhcmdldCwKLXdoZXJlIGl0IHNpbXBseSByZXR1cm5zIGEgc3ltYm9sIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGluIHRoZQotQHNhbXB7Tl9ERUJVR30gc2VjdGlvbiB3aGVuIGl0IGlzIHdyaXR0ZW4gb3V0LiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfbWFrZV9kZWJ1Z19zeW1ib2x9LgotCi1AaXRlbSBfcmVhZF9taW5pc3ltYm9scwotTWluaXN5bWJvbHMgYXJlIHVzZWQgdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIG9mIHByb2dyYW1zIGxpa2UKLUBzYW1we25tfS4gIEEgbWluaXN5bWJvbCBpcyBhIGNvb2tpZSBwb2ludGluZyB0byBpbnRlcm5hbCBzeW1ib2wKLWluZm9ybWF0aW9uIHdoaWNoIHRoZSBjYWxsZXIgY2FuIHVzZSB0byBleHRyYWN0IGNvbXBsZXRlIHN5bWJvbAotaW5mb3JtYXRpb24uICBUaGlzIHBlcm1pdHMgQkZEIHRvIG5vdCBjb252ZXJ0IGFsbCB0aGUgc3ltYm9scyBpbnRvCi1nZW5lcmljIGZvcm0sIGJ1dCB0byBpbnN0ZWFkIGNvbnZlcnQgdGhlbSBvbmUgYXQgYSB0aW1lLiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfcmVhZF9taW5pc3ltYm9sc30uICBNb3N0IHRhcmdldHMgZG8gbm90IGltcGxlbWVudCB0aGlzLAotYW5kIGp1c3QgdXNlIGdlbmVyaWMgc3VwcG9ydCB3aGljaCBpcyBiYXNlZCBvbiB1c2luZyBzdGFuZGFyZAotQHNhbXB7YXN5bWJvbH0gc3RydWN0dXJlcy4KLQotQGl0ZW0gX21pbmlzeW1ib2xfdG9fc3ltYm9sCi1Db252ZXJ0IGEgbWluaXN5bWJvbCB0byBhIHN0YW5kYXJkIEBzYW1we2FzeW1ib2x9LiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfbWluaXN5bWJvbF90b19zeW1ib2x9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciByZWxvY3MKLUBzdWJzZWN0aW9uIFJlbG9jYXRpb24gc3VwcG9ydAotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1N9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1N9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZWFsCi13aXRoIHJlbG9jYXRpb25zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLVJldHVybiBhIHNlbnNpYmxlIHVwcGVyIGJvdW5kIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHdoaWNoIHdpbGwgYmUKLXJlcXVpcmVkIHRvIHJlYWQgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uICBJbiBwcmFjdGljZSBtb3N0Ci10YXJnZXRzIHJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIEBzYW1we2FyZWxlbnR9Ci1wb2ludGVycyBmb3IgYWxsIHRoZSByZWxvY2F0aW9ucyBwbHVzIGEgdHJhaWxpbmcgQHNhbXB7TlVMTH0gZW50cnksIGFuZAotc3RvcmUgdGhlIGFjdHVhbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzCi1jYWxsZWQgdmlhIEBzYW1we2JmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfY2Fub25pY2FsaXplX3JlbG9jCi1SZXR1cm4gdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX2Nhbm9uaWNhbGl6ZV9yZWxvY30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfcmVsb2N9LgotCi1AaXRlbSBfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi1HaXZlbiBhIHJlbG9jYXRpb24gY29kZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGhvd3RvIHN0cnVjdHVyZQotKEBweHJlZntCRkQgcmVsb2NhdGlvbiBjb2Rlc30pLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfcmVsb2NfdHlwZV9sb29rdXB9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we3JlbG9jX3R5cGVfbG9va3VwfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3Igd3JpdGUKLUBzdWJzZWN0aW9uIE91dHB1dCBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfV1JJVEV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9XUklURX0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggd3JpdGluZyBvdXQgYSBCRkQuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NldF9hcmNoX21hY2gKLVNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIG51bWJlciBmb3IgYSBCRkQuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9zZXRfYXJjaF9tYWNofS4gIE1vc3QgdGFyZ2V0cyBpbXBsZW1lbnQgdGhpcyBieSBjYWxsaW5nCi1Ac2FtcHtiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNofS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX3NldF9hcmNoX21hY2h9LgotCi1AaXRlbSBfc2V0X3NlY3Rpb25fY29udGVudHMKLVdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfc2V0X3NlY3Rpb25fY29udGVudHN9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2V0X3NlY3Rpb25fY29udGVudHN9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBsaW5rCi1Ac3Vic2VjdGlvbiBMaW5rZXIgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0xJTkt9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9MSU5LfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZQotbGlua2VyLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9zaXplb2ZfaGVhZGVycwotUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIGEgQkZELiAgVGhpcyBpcwotdXNlZCB0byBpbXBsZW1lbnQgdGhlIEBzYW1we1NJWkVPRl9IRUFERVJTfSBsaW5rZXIgc2NyaXB0IGZ1bmN0aW9uLiAgSXQKLWlzIG5vcm1hbGx5IHVzZWQgdG8gYWxpZ24gdGhlIGZpcnN0IHNlY3Rpb24gYXQgYW4gZWZmaWNpZW50IHBvc2l0aW9uIG9uCi10aGUgcGFnZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc2l6ZW9mX2hlYWRlcnN9LiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3NpemVvZl9oZWFkZXJzfS4KLQotQGl0ZW0gX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLVJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBhbmQgYXBwbHkgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCi1UaGlzIGhhbmRsZXMgYm90aCBhIGZpbmFsIGxpbmsgYW5kIGEgcmVsb2NhdGVhYmxlIGxpbms7IGluIHRoZSBsYXR0ZXIKLWNhc2UsIGl0IGFkanVzdCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhcyB3ZWxsLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfS4gIE1vc3QgdGFyZ2V0cyBpbXBsZW1lbnQgaXQgYnkKLWNhbGxpbmcgQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfS4KLQotQGl0ZW0gX2JmZF9yZWxheF9zZWN0aW9uCi1UcnkgdG8gdXNlIHJlbGF4YXRpb24gdG8gc2hyaW5rIHRoZSBzaXplIG9mIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkCi1ieSB0aGUgbGlua2VyIHdoZW4gdGhlIEBzYW1wey1yZWxheH0gb3B0aW9uIGlzIHVzZWQuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9yZWxheF9zZWN0aW9ufS4gIE1vc3QgdGFyZ2V0cyBkbyBub3Qgc3VwcG9ydCBhbnkgc29ydCBvZgotcmVsYXhhdGlvbi4KLQotQGl0ZW0gX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi1DcmVhdGUgdGhlIHN5bWJvbCBoYXNoIHRhYmxlIHRvIHVzZSBmb3IgdGhlIGxpbmtlci4gIFRoaXMgbGlua2VyIGhvb2sKLXBlcm1pdHMgdGhlIGJhY2tlbmQgdG8gY29udHJvbCB0aGUgc2l6ZSBhbmQgaW5mb3JtYXRpb24gb2YgdGhlIGVsZW1lbnRzCi1pbiB0aGUgbGlua2VyIHN5bWJvbCBoYXNoIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZX0uCi0KLUBpdGVtIF9iZmRfbGlua19hZGRfc3ltYm9scwotR2l2ZW4gYW4gb2JqZWN0IGZpbGUgb3IgYW4gYXJjaGl2ZSwgYWRkIGFsbCBzeW1ib2xzIGludG8gdGhlIGxpbmtlcgotc3ltYm9sIGhhc2ggdGFibGUuICBVc2UgY2FsbGJhY2tzIHRvIHRoZSBsaW5rZXIgdG8gaW5jbHVkZSBhcmNoaXZlCi1lbGVtZW50cyBpbiB0aGUgbGluay4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfbGlua19hZGRfc3ltYm9sc30uCi0KLUBpdGVtIF9iZmRfZmluYWxfbGluawotRmluaXNoIHRoZSBsaW5raW5nIHByb2Nlc3MuICBUaGUgbGlua2VyIGNhbGxzIHRoaXMgaG9vayBhZnRlciBhbGwgb2YgdGhlCi1pbnB1dCBmaWxlcyBoYXZlIGJlZW4gcmVhZCwgd2hlbiBpdCBpcyByZWFkeSB0byBmaW5pc2ggdGhlIGxpbmsgYW5kCi1nZW5lcmF0ZSB0aGUgb3V0cHV0IGZpbGUuICBUaGlzIGlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX2ZpbmFsX2xpbmt9LgotCi1AaXRlbSBfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotSSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBmb3IuICBOb3RoaW5nIHNlZW1zIHRvIGNhbGwgaXQuICBUaGUgb25seQotbm9uLXRyaXZpYWwgZGVmaW5pdGlvbiBpcyBpbiBAZmlsZXtzb20uY30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGR5bmFtaWMKLUBzdWJzZWN0aW9uIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfRFlOQU1JQ30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0RZTkFNSUN9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCByZWFkCi1keW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotUmV0dXJuIGEgc2Vuc2libGUgdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZQotcmVxdWlyZWQgdG8gcmVhZCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBJbiBwcmFjdGljZSBtb3N0IHRhcmdldHMKLXJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIEBzYW1we2FzeW1ib2x9IHBvaW50ZXJzIGZvcgotYWxsIHRoZSBzeW1ib2xzIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kIHN0b3JlIHRoZSBhY3R1YWwKLXN5bWJvbCBpbmZvcm1hdGlvbiBpbiBCRkQgcHJpdmF0ZSBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluCi10aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZH0uCi0KLUBpdGVtIF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLVJlYWQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFifS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYn0uCi0KLUBpdGVtIF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotUmV0dXJuIGEgc2Vuc2libGUgdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZQotcmVxdWlyZWQgdG8gcmVhZCB0aGUgZHluYW1pYyByZWxvY2F0aW9ucy4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cwotcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXJlbGVudH0gcG9pbnRlcnMgZm9yCi1hbGwgdGhlIHJlbG9jYXRpb25zIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kIHN0b3JlIHRoZQotYWN0dWFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gQkZEIHByaXZhdGUgZGF0YS4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluCi10aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kfS4KLQotQGl0ZW0gX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi1SZWFkIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2N9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2N9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgZ2VuZXJhdGVkIGZpbGVzCi1Ac2VjdGlvbiBCRkQgZ2VuZXJhdGVkIGZpbGVzCi1AY2luZGV4IGdlbmVyYXRlZCBmaWxlcyBpbiBiZmQKLUBjaW5kZXggYmZkIGdlbmVyYXRlZCBmaWxlcwotCi1CRkQgY29udGFpbnMgc2V2ZXJhbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlcy4gIFRoaXMgc2VjdGlvbgotZGVzY3JpYmVzIHRoZW0uICBTb21lIGZpbGVzIGFyZSBjcmVhdGVkIGF0IGNvbmZpZ3VyZSB0aW1lLCB3aGVuIHlvdQotY29uZmlndXJlIEJGRC4gIFNvbWUgZmlsZXMgYXJlIGNyZWF0ZWQgYXQgbWFrZSB0aW1lLCB3aGVuIHlvdSBidWlsZAotdGltZS4gIFNvbWUgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgcmVidWlsdCBhdCBtYWtlIHRpbWUsIGJ1dCBvbmx5IGlmCi15b3UgY29uZmlndXJlIHdpdGggdGhlIEBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLiAgU29tZQotZmlsZXMgbGl2ZSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeS0tLXRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB5b3UgcnVuCi1jb25maWd1cmUtLS1hbmQgc29tZSBsaXZlIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQWxsIGZpbGVzIHRoYXQgbGl2ZQotaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlIGNoZWNrZWQgaW50byB0aGUgQ1ZTIHJlcG9zaXRvcnkuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gYmZkLmgKLUBjaW5kZXggQGZpbGV7YmZkLmh9Ci1AY2luZGV4IEBmaWxle2JmZC1pbjMuaH0KLUxpdmVzIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LiAgQ3JlYXRlZCBhdCBtYWtlIHRpbWUgZnJvbQotQGZpbGV7YmZkLWluMi5ofSB2aWEgQGZpbGV7YmZkLWluMy5ofS4gIEBmaWxle2JmZC1pbjMuaH0gaXMgY3JlYXRlZCBhdAotY29uZmlndXJlIHRpbWUgZnJvbSBAZmlsZXtiZmQtaW4yLmh9LiAgVGhlcmUgYXJlIGF1dG9tYXRpYyBkZXBlbmRlbmNpZXMKLXRvIHJlYnVpbGQgQGZpbGV7YmZkLWluMy5ofSBhbmQgaGVuY2UgQGZpbGV7YmZkLmh9IGlmIEBmaWxle2JmZC1pbjIuaH0KLWNoYW5nZXMsIHNvIHlvdSBjYW4gbm9ybWFsbHkgaWdub3JlIEBmaWxle2JmZC1pbjMuaH0sIGFuZCBqdXN0IHRoaW5rCi1hYm91dCBAZmlsZXtiZmQtaW4yLmh9IGFuZCBAZmlsZXtiZmQuaH0uCi0KLUBmaWxle2JmZC5ofSBpcyBidWlsdCBieSByZXBsYWNpbmcgYSBmZXcgc3RyaW5ncyBpbiBAZmlsZXtiZmQtaW4yLmh9LgotVG8gc2VlIHRoZW0sIHNlYXJjaCBmb3IgQHNhbXB7QEB9IGluIEBmaWxle2JmZC1pbjIuaH0uICBUaGV5IG1haW5seQotY29udHJvbCB3aGV0aGVyIEJGRCBpcyBidWlsdCBmb3IgYSAzMiBiaXQgdGFyZ2V0IG9yIGEgNjQgYml0IHRhcmdldC4KLQotQGl0ZW0gYmZkLWluMi5oCi1AY2luZGV4IEBmaWxle2JmZC1pbjIuaH0KLUxpdmVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2JmZC1pbi5ofSBhbmQgc2V2ZXJhbAotb3RoZXIgQkZEIHNvdXJjZSBmaWxlcy4gIElmIHlvdSBjb25maWd1cmUgd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLCBAZmlsZXtiZmQtaW4yLmh9IGlzIHJlYnVpbHQKLWF1dG9tYXRpY2FsbHkgd2hlbiBhIHNvdXJjZSBmaWxlIGNoYW5nZXMuCi0KLUBpdGVtIGVsZjMyLXRhcmdldC5oCi1AaXRlbXggZWxmNjQtdGFyZ2V0LmgKLUBjaW5kZXggQGZpbGV7ZWxmMzItdGFyZ2V0Lmh9Ci1AY2luZGV4IEBmaWxle2VsZjY0LXRhcmdldC5ofQotTGl2ZSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeS4gIENyZWF0ZWQgZnJvbSBAZmlsZXtlbGZ4eC10YXJnZXQuaH0uCi1UaGVzZSBmaWxlcyBhcmUgdmVyc2lvbnMgb2YgQGZpbGV7ZWxmeHgtdGFyZ2V0Lmh9IGN1c3RvbWl6ZWQgZm9yIGVpdGhlcgotYSAzMiBiaXQgRUxGIHRhcmdldCBvciBhIDY0IGJpdCBFTEYgdGFyZ2V0LgotCi1AaXRlbSBsaWJiZmQuaAotQGNpbmRleCBAZmlsZXtsaWJiZmQuaH0KLUxpdmVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2xpYmJmZC1pbi5ofSBhbmQKLXNldmVyYWwgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcy4gIElmIHlvdSBjb25maWd1cmUgd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLCBAZmlsZXtsaWJiZmQuaH0gaXMgcmVidWlsdAotYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KLQotQGl0ZW0gbGliY29mZi5oCi1AY2luZGV4IEBmaWxle2xpYmNvZmYuaH0KLUxpdmVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2xpYmNvZmYtaW4uaH0gYW5kCi1AZmlsZXtjb2ZmY29kZS5ofS4gIElmIHlvdSBjb25maWd1cmUgd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLCBAZmlsZXtsaWJjb2ZmLmh9IGlzIHJlYnVpbHQKLWF1dG9tYXRpY2FsbHkgd2hlbiBhIHNvdXJjZSBmaWxlIGNoYW5nZXMuCi0KLUBpdGVtIHRhcmdtYXRjaC5oCi1AY2luZGV4IEBmaWxle3RhcmdtYXRjaC5ofQotTGl2ZXMgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnkuICBDcmVhdGVkIGF0IG1ha2UgdGltZSBmcm9tCi1AZmlsZXtjb25maWcuYmZkfS4gIFRoaXMgZmlsZSBpcyB1c2VkIHRvIG1hcCBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGludG8KLUJGRCB0YXJnZXQgdmVjdG9yIHZhcmlhYmxlIG5hbWVzIGF0IHJ1biB0aW1lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgbXVsdGlwbGUgY29tcGlsYXRpb25zCi1Ac2VjdGlvbiBGaWxlcyBjb21waWxlZCBtdWx0aXBsZSB0aW1lcyBpbiBCRkQKLVNldmVyYWwgZmlsZXMgaW4gQkZEIGFyZSBjb21waWxlZCBtdWx0aXBsZSB0aW1lcy4gIEJ5IHRoaXMgSSBtZWFuIHRoYXQKLXRoZXJlIGFyZSBoZWFkZXIgZmlsZXMgd2hpY2ggY29udGFpbiBmdW5jdGlvbiBkZWZpbml0aW9ucy4gIFRoZXNlIGhlYWRlcgotZmlsZXMgYXJlIGluY2x1ZGVkIGJ5IG90aGVyIGZpbGVzLCBhbmQgdGh1cyB0aGUgZnVuY3Rpb25zIGFyZSBjb21waWxlZAotb25jZSBwZXIgZmlsZSB3aGljaCBpbmNsdWRlcyB0aGVtLgotCi1QcmVwcm9jZXNzb3IgbWFjcm9zIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGNvbXBpbGF0aW9uLCBzbyB0aGF0IGVhY2gKLXRpbWUgdGhlIGZpbGVzIGFyZSBjb21waWxlZCB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9ucyBhcmUgc2xpZ2h0bHkKLWRpZmZlcmVudC4gIE5hdHVyYWxseSwgaWYgdGhleSB3ZXJlbid0IGRpZmZlcmVudCwgdGhlcmUgd291bGQgYmUgbm8KLXJlYXNvbiB0byBjb21waWxlIHRoZW0gbXVsdGlwbGUgdGltZXMuCi0KLVRoaXMgaXMgYSBub3QgYSBwYXJ0aWN1bGFybHkgZ29vZCBwcm9ncmFtbWluZyB0ZWNobmlxdWUsIGFuZCBmdXR1cmUgQkZECi13b3JrIHNob3VsZCBhdm9pZCBpdC4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVNpbmNlIHRoaXMgdGVjaG5pcXVlIGlzIHJhcmVseSB1c2VkLCBldmVuIGV4cGVyaWVuY2VkIEMgcHJvZ3JhbW1lcnMgZmluZAotaXQgY29uZnVzaW5nLgotCi1AaXRlbQotSXQgaXMgZGlmZmljdWx0IHRvIGRlYnVnIHByb2dyYW1zIHdoaWNoIHVzZSBCRkQsIHNpbmNlIHRoZXJlIGlzIG5vIHdheQotdG8gZGVzY3JpYmUgd2hpY2ggdmVyc2lvbiBvZiBhIHBhcnRpY3VsYXIgZnVuY3Rpb24geW91IGFyZSBsb29raW5nIGF0LgotCi1AaXRlbQotUHJvZ3JhbXMgd2hpY2ggdXNlIEJGRCB3aW5kIHVwIGluY29ycG9yYXRpbmcgdHdvIG9yIG1vcmUgc2xpZ2h0bHkKLWRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBmdW5jdGlvbiwgd2hpY2ggd2FzdGVzIHNwYWNlIGluIHRoZQotZXhlY3V0YWJsZS4KLQotQGl0ZW0KLVRoaXMgdGVjaG5pcXVlIGlzIG5ldmVyIHJlcXVpcmVkIG5vciBpcyBpdCBlc3BlY2lhbGx5IGVmZmljaWVudC4gIEl0IGlzCi1hbHdheXMgcG9zc2libGUgdG8gdXNlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgc3RydWN0dXJlcyBob2xkaW5nCi1mdW5jdGlvbiBwb2ludGVycyBhbmQgbWFnaWMgY29uc3RhbnRzIGluc3RlYWQuCi1AZW5kIGl0ZW1pemUKLQotVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdGhlIGZpbGVzIHdoaWNoIGFyZSBjb21waWxlZCBtdWx0aXBsZSB0aW1lcy4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBhb3V0LXRhcmdldC5oCi1AY2luZGV4IEBmaWxle2FvdXQtdGFyZ2V0Lmh9Ci1EZXNjcmliZXMgYSBmZXcgZnVuY3Rpb25zIGFuZCB0aGUgdGFyZ2V0IHZlY3RvciBmb3IgYS5vdXQgdGFyZ2V0cy4gIFRoaXMKLWlzIHVzZWQgYnkgaW5kaXZpZHVhbCBhLm91dCB0YXJnZXRzIHdpdGggZGlmZmVyZW50IGRlZmluaXRpb25zIG9mCi1Ac2FtcHtOX1RYVEFERFJ9IGFuZCBzaW1pbGFyIGEub3V0IG1hY3Jvcy4KLQotQGl0ZW0gYW91dGYxLmgKLUBjaW5kZXggQGZpbGV7YW91dGYxLmh9Ci1JbXBsZW1lbnRzIHN0YW5kYXJkIFN1bk9TIGEub3V0IGZpbGVzLiAgSW4gcHJpbmNpcGxlIGl0IHN1cHBvcnRzIDY0IGJpdAotYS5vdXQgdGFyZ2V0cyBiYXNlZCBvbiB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvIEBzYW1we0FSQ0hfU0laRX0sIGJ1dAotc2luY2UgYWxsIGtub3duIGEub3V0IHRhcmdldHMgYXJlIDMyIGJpdHMsIHRoaXMgY29kZSBtYXkgb3IgbWF5IG5vdAotd29yay4gIFRoaXMgZmlsZSBpcyBvbmx5IGluY2x1ZGVkIGJ5IGEgZmV3IG90aGVyIGZpbGVzLCBhbmQgaXQgaXMKLWRpZmZpY3VsdCB0byBqdXN0aWZ5IGl0cyBleGlzdGVuY2UuCi0KLUBpdGVtIGFvdXR4LmgKLUBjaW5kZXggQGZpbGV7YW91dHguaH0KLUltcGxlbWVudHMgYmFzaWMgYS5vdXQgc3VwcG9ydCByb3V0aW5lcy4gIFRoaXMgZmlsZSBjYW4gYmUgY29tcGlsZWQgZm9yCi1laXRoZXIgMzIgb3IgNjQgYml0IHN1cHBvcnQuICBTaW5jZSBhbGwga25vd24gYS5vdXQgdGFyZ2V0cyBhcmUgMzIgYml0cywKLXRoZSA2NCBiaXQgc3VwcG9ydCBtYXkgb3IgbWF5IG5vdCB3b3JrLiAgSSBiZWxpZXZlIHRoZSBvcmlnaW5hbAotaW50ZW50aW9uIHdhcyB0aGF0IHRoaXMgZmlsZSB3b3VsZCBvbmx5IGJlIGluY2x1ZGVkIGJ5IEBzYW1we2FvdXQzMi5jfQotYW5kIEBzYW1we2FvdXQ2NC5jfSwgYW5kIHRoYXQgb3RoZXIgYS5vdXQgdGFyZ2V0cyB3b3VsZCBzaW1wbHkgcmVmZXIgdG8KLXRoZSBmdW5jdGlvbnMgaXQgZGVmaW5lZC4gIFVuZm9ydHVuYXRlbHksIHNvbWUgb3RoZXIgYS5vdXQgdGFyZ2V0cwotc3RhcnRlZCBpbmNsdWRpbmcgaXQgZGlyZWN0bHksIGxlYWRpbmcgdG8gYSBzb21ld2hhdCBjb25mdXNlZCBzdGF0ZSBvZgotYWZmYWlycy4KLQotQGl0ZW0gY29mZmNvZGUuaAotQGNpbmRleCBAZmlsZXtjb2ZmY29kZS5ofQotSW1wbGVtZW50cyBiYXNpYyBDT0ZGIHN1cHBvcnQgcm91dGluZXMuICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgZXZlcnkKLUNPRkYgdGFyZ2V0LiAgSXQgaW1wbGVtZW50cyBjb2RlIHdoaWNoIGhhbmRsZXMgQ09GRiBtYWdpYyBudW1iZXJzIGFzCi13ZWxsIGFzIHZhcmlvdXMgaG9vayBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZSBnZW5lcmljIENPRkYgZnVuY3Rpb25zIGluCi1AZmlsZXtjb2ZmZ2VuLmN9LiAgVGhpcyBmaWxlIGlzIGNvbnRyb2xsZWQgYnkgYSBudW1iZXIgb2YgZGlmZmVyZW50Ci1tYWNyb3MsIGFuZCBtb3JlIGFyZSBhZGRlZCByZWd1bGFybHkuCi0KLUBpdGVtIGNvZmZzd2FwLmgKLUBjaW5kZXggQGZpbGV7Y29mZnN3YXAuaH0KLUltcGxlbWVudHMgQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieQotQGZpbGV7Y29mZmNvZGUuaH0sIGFuZCB0aHVzIGJ5IGV2ZXJ5IENPRkYgdGFyZ2V0LiAgSXQgaW1wbGVtZW50cyB0aGUKLXJvdXRpbmVzIHdoaWNoIHN3YXAgQ09GRiBzdHJ1Y3R1cmVzIGJldHdlZW4gaW50ZXJuYWwgYW5kIGV4dGVybmFsCi1mb3JtYXQuICBUaGUgbWFpbiBjb250cm9sIGZvciB0aGlzIGZpbGUgaXMgdGhlIGV4dGVybmFsIHN0cnVjdHVyZQotZGVmaW5pdGlvbnMgaW4gdGhlIGZpbGVzIGluIHRoZSBAZmlsZXtpbmNsdWRlL2NvZmZ9IGRpcmVjdG9yeS4gIEEgQ09GRgotdGFyZ2V0IGZpbGUgd2lsbCBpbmNsdWRlIG9uZSBvZiB0aG9zZSBmaWxlcyBiZWZvcmUgaW5jbHVkaW5nCi1AZmlsZXtjb2ZmY29kZS5ofSBhbmQgdGh1cyBAZmlsZXtjb2Zmc3dhcC5ofS4gIFRoZXJlIGFyZSBhIGZldyBvdGhlcgotbWFjcm9zIHdoaWNoIGFmZmVjdCBAZmlsZXtjb2Zmc3dhcC5ofSBhcyB3ZWxsLCBtb3N0bHkgZGVzY3JpYmluZyB3aGV0aGVyCi1jZXJ0YWluIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlcy4KLQotQGl0ZW0gZWNvZmZzd2FwLmgKLUBjaW5kZXggQGZpbGV7ZWNvZmZzd2FwLmh9Ci1JbXBsZW1lbnRzIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhpcyBpcyBsaWtlIEBmaWxle2NvZmZzd2FwLmh9LCBidXQKLWZvciBFQ09GRi4gIEl0IGlzIGluY2x1ZGVkIGJ5IHRoZSBFQ09GRiB0YXJnZXQgZmlsZXMgKG9mIHdoaWNoIHRoZXJlIGFyZQotb25seSB0d28pLiAgVGhlIGNvbnRyb2wgaXMgdGhlIHByZXByb2Nlc3NvciBtYWNybyBAc2FtcHtFQ09GRl8zMn0gb3IKLUBzYW1we0VDT0ZGXzY0fS4KLQotQGl0ZW0gZWxmY29kZS5oCi1AY2luZGV4IEBmaWxle2VsZmNvZGUuaH0KLUltcGxlbWVudHMgRUxGIGZ1bmN0aW9ucyB0aGF0IHVzZSBleHRlcm5hbCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICBUaGlzCi1maWxlIGlzIGluY2x1ZGVkIGJ5IHR3byBvdGhlciBmaWxlczogQGZpbGV7ZWxmMzIuY30gYW5kIEBmaWxle2VsZjY0LmN9LgotSXQgaXMgY29udHJvbGxlZCBieSB0aGUgQHNhbXB7QVJDSF9TSVpFfSBtYWNybyB3aGljaCBpcyBkZWZpbmVkIHRvIGJlCi1Ac2FtcHszMn0gb3IgQHNhbXB7NjR9IGJlZm9yZSBpbmNsdWRpbmcgaXQuICBUaGUgQHNhbXB7TkFNRX0gbWFjcm8gaXMKLXVzZWQgaW50ZXJuYWxseSB0byBnaXZlIHRoZSBmdW5jdGlvbnMgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgdHdvIHRhcmdldAotc2l6ZXMuCi0KLUBpdGVtIGVsZmNvcmUuaAotQGNpbmRleCBAZmlsZXtlbGZjb3JlLmh9Ci1MaWtlIEBmaWxle2VsZmNvZGUuaH0sIGJ1dCBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIEVMRiBjb3JlCi1maWxlcy4gIFRoaXMgaXMgaW5jbHVkZWQgb25seSBieSBAZmlsZXtlbGZjb2RlLmh9LgotCi1AaXRlbSBlbGZsaW5rLmgKLUBjaW5kZXggQGZpbGV7ZWxmbGluay5ofQotTGlrZSBAZmlsZXtlbGZjb2RlLmh9LCBidXQgZm9yIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBFTEYgbGlua2VyLiAgVGhpcwotaXMgaW5jbHVkZWQgb25seSBieSBAZmlsZXtlbGZjb2RlLmh9LgotCi1AaXRlbSBlbGZ4eC10YXJnZXQuaAotQGNpbmRleCBAZmlsZXtlbGZ4eC10YXJnZXQuaH0KLVRoaXMgZmlsZSBpcyB0aGUgc291cmNlIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzIEBmaWxle2VsZjMyLXRhcmdldC5ofQotYW5kIEBmaWxle2VsZjY0LXRhcmdldC5ofSwgb25lIG9mIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IGV2ZXJ5IEVMRiB0YXJnZXQuCi1JdCBkZWZpbmVzIHRoZSBFTEYgdGFyZ2V0IHZlY3Rvci4KLQotQGl0ZW0gZnJlZWJzZC5oCi1AY2luZGV4IEBmaWxle2ZyZWVic2QuaH0KLVByZXN1bWFibHkgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgYWxsIEZyZWVCU0QgdGFyZ2V0cywgYnV0IGluIGZhY3QKLXRoZXJlIGlzIG9ubHkgb25lIHN1Y2ggdGFyZ2V0LCBAc2FtcHtpMzg2LWZyZWVic2R9LiAgVGhpcyBkZWZpbmVzIGEKLWZ1bmN0aW9uIHVzZWQgdG8gc2V0IHRoZSByaWdodCBtYWdpYyBudW1iZXIgZm9yIEZyZWVCU0QsIGFzIHdlbGwgYXMKLXZhcmlvdXMgbWFjcm9zLCBhbmQgaW5jbHVkZXMgQGZpbGV7YW91dC10YXJnZXQuaH0uCi0KLUBpdGVtIG5ldGJzZC5oCi1AY2luZGV4IEBmaWxle25ldGJzZC5ofQotTGlrZSBAZmlsZXtmcmVlYnNkLmh9LCBleGNlcHQgdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbCBmaWxlcyB3aGljaCBpbmNsdWRlCi1pdC4KLQotQGl0ZW0gbmxtLXRhcmdldC5oCi1AY2luZGV4IEBmaWxle25sbS10YXJnZXQuaH0KLURlZmluZXMgdGhlIHRhcmdldCB2ZWN0b3IgZm9yIGEgc3RhbmRhcmQgTkxNIHRhcmdldC4KLQotQGl0ZW0gbmxtY29kZS5oCi1AY2luZGV4IEBmaWxle25sbWNvZGUuaH0KLUxpa2UgQGZpbGV7ZWxmY29kZS5ofSwgYnV0IGZvciBOTE0gdGFyZ2V0cy4gIFRoaXMgaXMgb25seSBpbmNsdWRlZCBieQotQGZpbGV7bmxtMzIuY30gYW5kIEBmaWxle25sbTY0LmN9LCBib3RoIG9mIHdoaWNoIGRlZmluZSB0aGUgbWFjcm8KLUBzYW1we0FSQ0hfU0laRX0gdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUuICBUaGVyZSBhcmUgbm8gNjQgYml0IE5MTQotdGFyZ2V0cyBhbnlob3csIHNvIHRoaXMgaXMgc29ydCBvZiB1c2VsZXNzLgotCi1AaXRlbSBubG1zd2FwLmgKLUBjaW5kZXggQGZpbGV7bmxtc3dhcC5ofQotTGlrZSBAZmlsZXtjb2Zmc3dhcC5ofSwgYnV0IGZvciBOTE0gdGFyZ2V0cy4gIFRoaXMgaXMgaW5jbHVkZWQgYnkgZWFjaAotTkxNIHRhcmdldCwgYnV0IEkgdGhpbmsgaXQgd2luZHMgdXAgY29tcGlsaW5nIHRvIHRoZSBleGFjdCBzYW1lIGNvZGUgZm9yCi1ldmVyeSB0YXJnZXQsIGFuZCBhcyBzdWNoIGlzIGZhaXJseSB1c2VsZXNzLgotCi1AaXRlbSBwZWljb2RlLmgKLUBjaW5kZXggQGZpbGV7cGVpY29kZS5ofQotUHJvdmlkZXMgc3dhcHBpbmcgcm91dGluZXMgYW5kIG90aGVyIGhvb2tzIGZvciBQRSB0YXJnZXRzLgotQGZpbGV7Y29mZmNvZGUuaH0gd2lsbCBpbmNsdWRlIHRoaXMgcmF0aGVyIHRoYW4gQGZpbGV7Y29mZnN3YXAuaH0gZm9yIGEKLVBFIHRhcmdldC4gIFRoaXMgZGVmaW5lcyBQRSBzcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGUgQ09GRiBzd2FwcGluZwotcm91dGluZXMsIGFuZCBhbHNvIGRlZmluZXMgc29tZSBtYWNyb3Mgd2hpY2ggY29udHJvbCBAZmlsZXtjb2ZmY29kZS5ofQotaXRzZWxmLgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgcmVsb2NhdGlvbiBoYW5kbGluZwotQHNlY3Rpb24gQkZEIHJlbG9jYXRpb24gaGFuZGxpbmcKLUBjaW5kZXggYmZkIHJlbG9jYXRpb24gaGFuZGxpbmcKLUBjaW5kZXggcmVsb2NhdGlvbnMgaW4gYmZkCi0KLVRoZSBoYW5kbGluZyBvZiByZWxvY2F0aW9ucyBpcyBvbmUgb2YgdGhlIG1vcmUgY29uZnVzaW5nIGFzcGVjdHMgb2YgQkZELgotUmVsb2NhdGlvbiBoYW5kbGluZyBoYXMgYmVlbiBpbXBsZW1lbnRlZCBpbiB2YXJpb3VzIGRpZmZlcmVudCB3YXlzLCBhbGwKLXNvbWV3aGF0IGluY29tcGF0aWJsZSwgbm9uZSBwZXJmZWN0LgotCi1AbWVudQotKiBCRkQgcmVsb2NhdGlvbiBjb25jZXB0czo6CUJGRCByZWxvY2F0aW9uIGNvbmNlcHRzCi0qIEJGRCByZWxvY2F0aW9uIGZ1bmN0aW9uczo6CUJGRCByZWxvY2F0aW9uIGZ1bmN0aW9ucwotKiBCRkQgcmVsb2NhdGlvbiBjb2Rlczo6CUJGRCByZWxvY2F0aW9uIGNvZGVzCi0qIEJGRCByZWxvY2F0aW9uIGZ1dHVyZTo6CUJGRCByZWxvY2F0aW9uIGZ1dHVyZQotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzCi1Ac3Vic2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBjb25jZXB0cwotCi1BIHJlbG9jYXRpb24gaXMgYW4gYWN0aW9uIHdoaWNoIHRoZSBsaW5rZXIgbXVzdCB0YWtlIHdoZW4gbGlua2luZy4gIEl0Ci1kZXNjcmliZXMgYSBjaGFuZ2UgdG8gdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRoZSBjaGFuZ2UgaXMgbm9ybWFsbHkKLWJhc2VkIG9uIHRoZSBmaW5hbCB2YWx1ZSBvZiBvbmUgb3IgbW9yZSBzeW1ib2xzLiAgUmVsb2NhdGlvbnMgYXJlCi1jcmVhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgd2hlbiBpdCBjcmVhdGVzIGFuIG9iamVjdCBmaWxlLgotCi1Nb3N0IHJlbG9jYXRpb25zIGFyZSBzaW1wbGUuICBBIHR5cGljYWwgc2ltcGxlIHJlbG9jYXRpb24gaXMgdG8gc2V0IDMyCi1iaXRzIGF0IGEgZ2l2ZW4gb2Zmc2V0IGluIGEgc2VjdGlvbiB0byB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuICBUaGlzIHR5cGUKLW9mIHJlbG9jYXRpb24gd291bGQgYmUgZ2VuZXJhdGVkIGZvciBjb2RlIGxpa2UgQGNvZGV7aW50ICpwID0gJmk7fSB3aGVyZQotQHNhbXB7cH0gYW5kIEBzYW1we2l9IGFyZSBnbG9iYWwgdmFyaWFibGVzLiAgQSByZWxvY2F0aW9uIGZvciB0aGUgc3ltYm9sCi1Ac2FtcHtpfSB3b3VsZCBiZSBnZW5lcmF0ZWQgc3VjaCB0aGF0IHRoZSBsaW5rZXIgd291bGQgaW5pdGlhbGl6ZSB0aGUKLWFyZWEgb2YgbWVtb3J5IHdoaWNoIGhvbGRzIHRoZSB2YWx1ZSBvZiBAc2FtcHtwfSB0byB0aGUgdmFsdWUgb2YgdGhlCi1zeW1ib2wgQHNhbXB7aX0uCi0KLVNsaWdodGx5IG1vcmUgY29tcGxleCByZWxvY2F0aW9ucyBtYXkgaW5jbHVkZSBhbiBhZGRlbmQsIHdoaWNoIGlzIGEKLWNvbnN0YW50IHRvIGFkZCB0byB0aGUgc3ltYm9sIHZhbHVlIGJlZm9yZSB1c2luZyBpdC4gIEluIHNvbWUgY2FzZXMgYQotcmVsb2NhdGlvbiB3aWxsIHJlcXVpcmUgYWRkaW5nIHRoZSBzeW1ib2wgdmFsdWUgdG8gdGhlIGV4aXN0aW5nIGNvbnRlbnRzCi1vZiB0aGUgc2VjdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUuICBJbiBvdGhlcnMgdGhlIHJlbG9jYXRpb24gd2lsbCBzaW1wbHkKLXJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHdpdGggdGhlIHN5bWJvbCB2YWx1ZS4gIFNvbWUKLXJlbG9jYXRpb25zIGFyZSBQQyByZWxhdGl2ZSwgc28gdGhhdCB0aGUgdmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZQotc2VjdGlvbiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBhbmQgdGhlIGZpbmFsCi1hZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotCi1JbiBnZW5lcmFsLCByZWxvY2F0aW9ucyBjYW4gYmUgYXJiaXRyYXJpbHkgY29tcGxleC4gIEZvciBleGFtcGxlLAotcmVsb2NhdGlvbnMgdXNlZCBpbiBkeW5hbWljIGxpbmtpbmcgc3lzdGVtcyBvZnRlbiByZXF1aXJlIHRoZSBsaW5rZXIgdG8KLWFsbG9jYXRlIHNwYWNlIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gYW5kIHVzZSB0aGUgb2Zmc2V0IHdpdGhpbiB0aGF0Ci1zZWN0aW9uIGFzIHRoZSB2YWx1ZSB0byBzdG9yZS4gIEluIHRoZSBJRUVFIG9iamVjdCBmaWxlIGZvcm1hdCwKLXJlbG9jYXRpb25zIG1heSBpbnZvbHZlIGFyYml0cmFyeSBleHByZXNzaW9ucy4KLQotV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGUgbGlua2VyIG1heSBvciBtYXkgbm90IGhhdmUgdG8gZG8KLWFueXRoaW5nIHdpdGggYSByZWxvY2F0aW9uLCBkZXBlbmRpbmcgdXBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLXJlbG9jYXRpb24uICBTaW1wbGUgcmVsb2NhdGlvbnMgZ2VuZXJhbGx5IGRvIG5vdCByZXF1aXJlIGFueSBzcGVjaWFsCi1hY3Rpb24uCi0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGZ1bmN0aW9ucwotQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCi0KLUluIEJGRCwgZWFjaCBzZWN0aW9uIGhhcyBhbiBhcnJheSBvZiBAc2FtcHthcmVsZW50fSBzdHJ1Y3R1cmVzLiAgRWFjaAotc3RydWN0dXJlIGhhcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wsIGFuIGFkZHJlc3Mgd2l0aGluIHRoZSBzZWN0aW9uLCBhbgotYWRkZW5kLCBhbmQgYSBwb2ludGVyIHRvIGEgQHNhbXB7cmVsb2NfaG93dG9fc3RydWN0fSBzdHJ1Y3R1cmUuICBUaGUKLWhvd3RvIHN0cnVjdHVyZSBoYXMgYSBidW5jaCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgcmVsb2MsIGluY2x1ZGluZyBhCi10eXBlIGZpZWxkLiAgVGhlIHR5cGUgZmllbGQgaXMgc3BlY2lmaWMgdG8gdGhlIG9iamVjdCBmaWxlIGZvcm1hdAotYmFja2VuZDsgbm9uZSBvZiB0aGUgZ2VuZXJpYyBjb2RlIGluIEJGRCBleGFtaW5lcyBpdC4KLQotT3JpZ2luYWxseSwgdGhlIGZ1bmN0aW9uIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHdhcyBzdXBwb3NlZCB0bwotaGFuZGxlIGFsbCByZWxvY2F0aW9ucy4gIEluIHRoZW9yeSwgbWFueSByZWxvY2F0aW9ucyB3b3VsZCBiZSBzaW1wbGUKLWVub3VnaCB0byBiZSBkZXNjcmliZWQgYnkgdGhlIGZpZWxkcyBpbiB0aGUgaG93dG8gc3RydWN0dXJlLiAgRm9yIHRob3NlCi10aGF0IHdlcmVuJ3QsIHRoZSBob3d0byBzdHJ1Y3R1cmUgaW5jbHVkZWQgYSBAc2FtcHtzcGVjaWFsX2Z1bmN0aW9ufQotZmllbGQgdG8gdXNlIGFzIGFuIGVzY2FwZS4KLQotV2hpbGUgdGhpcyBzZWVtcyBwbGF1c2libGUsIGEgbG9vayBhdCBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufQotc2hvd3MgdGhhdCBpdCBmYWlsZWQuICBUaGUgZnVuY3Rpb24gaGFzIG9kZCBzcGVjaWFsIGNhc2VzLiAgU29tZSBvZiB0aGUKLWZpZWxkcyBpbiB0aGUgaG93dG8gc3RydWN0dXJlLCBzdWNoIGFzIEBzYW1we3BjcmVsX29mZnNldH0sIHdlcmUgbm90Ci1hZGVxdWF0ZWx5IGRvY3VtZW50ZWQuCi0KLVRoZSBsaW5rZXIgdXNlcyBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSB0byBkbyBhbGwgcmVsb2NhdGlvbnMgd2hlbgotdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBoYXZlIGRpZmZlcmVudCBmb3JtYXRzIChlLmcuLCB3aGVuIGdlbmVyYXRpbmcKLVMtcmVjb3JkcykuICBUaGUgZ2VuZXJpYyBsaW5rZXIgY29kZSwgd2hpY2ggaXMgdXNlZCBieSBhbGwgdGFyZ2V0cyB3aGljaAotZG8gbm90IGRlZmluZSB0aGVpciBvd24gc3BlY2lhbCBwdXJwb3NlIGxpbmtlciwgdXNlcwotQHNhbXB7YmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50c30sIHdoaWNoIGZvciBtb3N0IHRhcmdldHMgdHVybnMKLWludG8gYSBjYWxsIHRvIEBzYW1we2JmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50c30sIHdoaWNoCi1jYWxscyBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufS4gIFNvIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259Ci1pcyBzdGlsbCB3aWRlbHkgdXNlZCwgd2hpY2ggbWFrZXMgaXQgZGlmZmljdWx0IHRvIGNoYW5nZSwgc2luY2UgaXQgaXMKLWRpZmZpY3VsdCB0byB0ZXN0IGFsbCBwb3NzaWJsZSBjYXNlcy4KLQotVGhlIGFzc2VtYmxlciB1c2VkIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IGZvciBhIHdoaWxlLiAgVGhpcwotdHVybmVkIG91dCB0byBiZSB0aGUgd3JvbmcgdGhpbmcgdG8gZG8sIHNpbmNlCi1Ac2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSB3YXMgd3JpdHRlbiB0byBoYW5kbGUgcmVsb2NhdGlvbnMgb24gYW4KLWV4aXN0aW5nIG9iamVjdCBmaWxlLCB3aGlsZSB0aGUgYXNzZW1ibGVyIG5lZWRlZCB0byBjcmVhdGUgcmVsb2NhdGlvbnMKLWluIGEgbmV3IG9iamVjdCBmaWxlLiAgVGhlIGFzc2VtYmxlciB3YXMgY2hhbmdlZCB0byB1c2UgdGhlIG5ldyBmdW5jdGlvbgotQHNhbXB7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0gaW5zdGVhZCwgYW5kIEBzYW1we2JmZF9pbnN0YWxsX3JlbG9jYXRpb259Ci13YXMgY3JlYXRlZCBhcyBhIGNvcHkgb2YgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0uCi0KLVVuZm9ydHVuYXRlbHksIHRoZSB3b3JrIGRpZCBub3QgcHJvZ3Jlc3MgYW55IGZhcnRoZXIsIHNvCi1Ac2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSByZW1haW5zIGEgc2ltcGxlIGNvcHkgb2YKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LCB3aXRoIGFsbCB0aGUgb2RkIHNwZWNpYWwgY2FzZXMgYW5kCi1jb25mdXNpbmcgY29kZS4gIFRoaXMgYWdhaW4gaXMgZGlmZmljdWx0IHRvIGNoYW5nZSwgYmVjYXVzZSBhZ2FpbiBhbnkKLWNoYW5nZSBjYW4gYWZmZWN0IGFueSBhc3NlbWJsZXIgdGFyZ2V0LCBhbmQgc28gaXMgZGlmZmljdWx0IHRvIHRlc3QuCi0KLVRoZSBuZXcgbGlua2VyLCB3aGVuIHVzaW5nIHRoZSBzYW1lIG9iamVjdCBmaWxlIGZvcm1hdCBmb3IgYWxsIGlucHV0Ci1maWxlcyBhbmQgdGhlIG91dHB1dCBmaWxlLCBkb2VzIG5vdCBjb252ZXJ0IHJlbG9jYXRpb25zIGludG8KLUBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZXMsIHNvIGl0IGNhbiBub3QgdXNlCi1Ac2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSBhdCBhbGwuICBJbnN0ZWFkLCB1c2VycyBvZiB0aGUgbmV3IGxpbmtlcgotYXJlIGV4cGVjdGVkIHRvIHdyaXRlIGEgQHNhbXB7cmVsb2NhdGVfc2VjdGlvbn0gZnVuY3Rpb24gd2hpY2ggd2lsbAotaGFuZGxlIHJlbG9jYXRpb25zIGluIGEgdGFyZ2V0IHNwZWNpZmljIGZhc2hpb24uCi0KLVRoZXJlIGFyZSB0d28gaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb246Ci1Ac2FtcHtfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGV9IGFuZCBAc2FtcHtfYmZkX3JlbG9jYXRlX2NvbnRlbnRzfS4KLVRoZXNlIGZ1bmN0aW9ucyB1c2UgYSBob3d0byBzdHJ1Y3R1cmUsIGJ1dCB0aGV5IEBlbXBoe2RvIG5vdH0gdXNlIHRoZQotQHNhbXB7c3BlY2lhbF9mdW5jdGlvbn0gZmllbGQuICBTaW5jZSB0aGUgZnVuY3Rpb25zIGFyZSBub3JtYWxseSBjYWxsZWQKLWZyb20gdGFyZ2V0IHNwZWNpZmljIGNvZGUsIHRoZSBAc2FtcHtzcGVjaWFsX2Z1bmN0aW9ufSBmaWVsZCBhZGRzCi1saXR0bGU7IGFueSByZWxvY2F0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgY2FuIGJlIGhhbmRsZWQKLXdpdGhvdXQgY2FsbGluZyB0aG9zZSBmdW5jdGlvbnMuCi0KLVNvLCBpZiB5b3Ugd2FudCB0byBhZGQgYSBuZXcgdGFyZ2V0LCBvciBhZGQgYSBuZXcgcmVsb2NhdGlvbiB0byBhbgotZXhpc3RpbmcgdGFyZ2V0LCB5b3UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotTWFrZSBzdXJlIHlvdSBjbGVhcmx5IHVuZGVyc3RhbmQgd2hhdCB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gc2hvdWxkCi1sb29rIGxpa2UgYWZ0ZXIgYXNzZW1ibHksIGFmdGVyIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuZCBhZnRlciBhIGZpbmFsCi1saW5rLiAgTWFrZSBzdXJlIHlvdSBjbGVhcmx5IHVuZGVyc3RhbmQgdGhlIG9wZXJhdGlvbnMgdGhlIGxpbmtlciBtdXN0Ci1wZXJmb3JtIGR1cmluZyBhIHJlbG9jYXRlYWJsZSBsaW5rIGFuZCBkdXJpbmcgYSBmaW5hbCBsaW5rLgotCi1AaXRlbQotV3JpdGUgYSBob3d0byBzdHJ1Y3R1cmUgZm9yIHRoZSByZWxvY2F0aW9uLiAgVGhlIGhvd3RvIHN0cnVjdHVyZSBpcwotZmxleGlibGUgZW5vdWdoIHRvIHJlcHJlc2VudCBhbnkgcmVsb2NhdGlvbiB3aGljaCBzaG91bGQgYmUgaGFuZGxlZCBieQotc2V0dGluZyBhIGNvbnRpZ3VvdXMgYml0ZmllbGQgaW4gdGhlIGRlc3RpbmF0aW9uIHRvIHRoZSB2YWx1ZSBvZiBhCi1zeW1ib2wsIHBvc3NpYmx5IHdpdGggYW4gYWRkZW5kLCBwb3NzaWJseSBhZGRpbmcgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUKLXZhbHVlIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgZGVzdGluYXRpb24uCi0KLUBpdGVtCi1DaGFuZ2UgdGhlIGFzc2VtYmxlciB0byBnZW5lcmF0ZSB5b3VyIHJlbG9jYXRpb24uICBUaGUgYXNzZW1ibGVyIHdpbGwKLWNhbGwgQHNhbXB7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0sIHNvIHlvdXIgaG93dG8gc3RydWN0dXJlIGhhcyB0byBiZQotYWJsZSB0byBoYW5kbGUgdGhhdC4gIFlvdSBtYXkgbmVlZCB0byBzZXQgdGhlIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259Ci1maWVsZCB0byBoYW5kbGUgYXNzZW1ibHkgY29ycmVjdGx5LiAgQmUgY2FyZWZ1bCB0byBlbnN1cmUgdGhhdCBhbnkgY29kZQoteW91IHdyaXRlIHRvIGhhbmRsZSB0aGUgYXNzZW1ibGVyIHdpbGwgYWxzbyB3b3JrIGNvcnJlY3RseSB3aGVuIGRvaW5nIGEKLXJlbG9jYXRlYWJsZSBsaW5rLiAgRm9yIGV4YW1wbGUsIHNlZSBAc2FtcHtiZmRfZWxmX2dlbmVyaWNfcmVsb2N9LgotCi1AaXRlbQotVGVzdCB0aGUgYXNzZW1ibGVyLiAgQ29uc2lkZXIgdGhlIGNhc2VzIG9mIHJlbG9jYXRpb24gYWdhaW5zdCBhbgotdW5kZWZpbmVkIHN5bWJvbCwgYSBjb21tb24gc3ltYm9sLCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBvYmplY3QgZmlsZQotaW4gdGhlIHNhbWUgc2VjdGlvbiwgYW5kIGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlIG9iamVjdCBmaWxlIGluIGEKLWRpZmZlcmVudCBzZWN0aW9uLiAgVGhlc2UgY2FzZXMgbWF5IG5vdCBhbGwgYmUgYXBwbGljYWJsZSBmb3IgeW91cgotcmVsb2MuCi0KLUBpdGVtCi1JZiB5b3VyIHRhcmdldCB1c2VzIHRoZSBuZXcgbGlua2VyLCB3aGljaCBpcyByZWNvbW1lbmRlZCwgYWRkIGFueQotcmVxdWlyZWQgaGFuZGxpbmcgdG8gdGhlIHRhcmdldCBzcGVjaWZpYyByZWxvY2F0aW9uIGZ1bmN0aW9uLiAgSW4gc2ltcGxlCi1jYXNlcyB0aGlzIHdpbGwganVzdCBpbnZvbHZlIGEgY2FsbCB0byBAc2FtcHtfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGV9Ci1vciBAc2FtcHtfYmZkX3JlbG9jYXRlX2NvbnRlbnRzfSwgZGVwZW5kaW5nIHVwb24gdGhlIGRlZmluaXRpb24gb2YgdGhlCi1yZWxvY2F0aW9uIGFuZCB3aGV0aGVyIHRoZSBsaW5rIGlzIHJlbG9jYXRlYWJsZSBvciBub3QuCi0KLUBpdGVtCi1UZXN0IHRoZSBsaW5rZXIuICBUZXN0IHRoZSBjYXNlIG9mIGEgZmluYWwgbGluay4gIElmIHRoZSByZWxvY2F0aW9uIGNhbgotb3ZlcmZsb3csIHVzZSBhIGxpbmtlciBzY3JpcHQgdG8gZm9yY2UgYW4gb3ZlcmZsb3cgYW5kIG1ha2Ugc3VyZSB0aGUKLWVycm9yIGlzIHJlcG9ydGVkIGNvcnJlY3RseS4gIFRlc3QgYSByZWxvY2F0ZWFibGUgbGluaywgd2hldGhlciB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkIG9yIHVuZGVmaW5lZCBpbiB0aGUgcmVsb2NhdGVhYmxlIG91dHB1dC4gIEZvciBib3RoIHRoZQotZmluYWwgYW5kIHJlbG9jYXRlYWJsZSBsaW5rLCB0ZXN0IHRoZSBjYXNlIHdoZW4gdGhlIHN5bWJvbCBpcyBhIGNvbW1vbgotc3ltYm9sLCB3aGVuIHRoZSBzeW1ib2wgbG9va2VkIGxpa2UgYSBjb21tb24gc3ltYm9sIGJ1dCBiZWNhbWUgYSBkZWZpbmVkCi1zeW1ib2wsIHdoZW4gdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlLCBhbmQgd2hlbgotdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBzYW1lIG9iamVjdCBmaWxlLgotCi1AaXRlbQotSW4gb3JkZXIgZm9yIGxpbmtpbmcgdG8gYW5vdGhlciBvYmplY3QgZmlsZSBmb3JtYXQsIHN1Y2ggYXMgUy1yZWNvcmRzLAotdG8gd29yayBjb3JyZWN0bHksIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IGhhcyB0byBkbyB0aGUgcmlnaHQKLXRoaW5nIGZvciB0aGUgcmVsb2NhdGlvbi4gIFlvdSBtYXkgbmVlZCB0byBzZXQgdGhlCi1Ac2FtcHtzcGVjaWFsX2Z1bmN0aW9ufSBmaWVsZCB0byBoYW5kbGUgdGhpcyBjb3JyZWN0bHkuICBUZXN0IHRoaXMgYnkKLWRvaW5nIGEgbGluayBpbiB3aGljaCB0aGUgb3V0cHV0IG9iamVjdCBmaWxlIGZvcm1hdCBpcyBTLXJlY29yZHMuCi0KLUBpdGVtCi1Vc2luZyB0aGUgbGlua2VyIHRvIGdlbmVyYXRlIHJlbG9jYXRlYWJsZSBvdXRwdXQgaW4gYSBkaWZmZXJlbnQgb2JqZWN0Ci1maWxlIGZvcm1hdCBpcyBpbXBvc3NpYmxlIGluIHRoZSBnZW5lcmFsIGNhc2UsIHNvIHlvdSBnZW5lcmFsbHkgZG9uJ3QKLWhhdmUgdG8gd29ycnkgYWJvdXQgdGhhdC4gIExpbmtpbmcgaW5wdXQgZmlsZXMgb2YgZGlmZmVyZW50IG9iamVjdCBmaWxlCi1mb3JtYXRzIHRvZ2V0aGVyIGlzIHF1aXRlIHVudXN1YWwsIGJ1dCBpZiB5b3UncmUgcmVhbGx5IGRlZGljYXRlZCB5b3UKLW1heSB3YW50IHRvIGNvbnNpZGVyIHRlc3RpbmcgdGhpcyBjYXNlLCBib3RoIHdoZW4gdGhlIG91dHB1dCBvYmplY3QgZmlsZQotZm9ybWF0IGlzIHRoZSBzYW1lIGFzIHlvdXIgZm9ybWF0LCBhbmQgd2hlbiBpdCBpcyBkaWZmZXJlbnQuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gY29kZXMKLUBzdWJzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGNvZGVzCi0KLUJGRCBoYXMgYW5vdGhlciB3YXkgb2YgZGVzY3JpYmluZyByZWxvY2F0aW9ucyBiZXNpZGVzIHRoZSBob3d0bwotc3RydWN0dXJlcyBkZXNjcmliZWQgYWJvdmU6IHRoZSBlbnVtIEBzYW1we2JmZF9yZWxvY19jb2RlX3JlYWxfdHlwZX0uCi0KLUV2ZXJ5IGtub3duIHJlbG9jYXRpb24gdHlwZSBjYW4gYmUgZGVzY3JpYmVkIGFzIGEgdmFsdWUgaW4gdGhpcwotZW51bWVyYXRpb24uICBUaGUgZW51bWVyYXRpb24gY29udGFpbnMgbWFueSB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbnMsCi1idXQgd2hlcmUgdHdvIG9yIG1vcmUgdGFyZ2V0cyBoYXZlIHRoZSBzYW1lIHJlbG9jYXRpb24sIGEgc2luZ2xlIGNvZGUgaXMKLXVzZWQuICBGb3IgZXhhbXBsZSwgdGhlIHNpbmdsZSB2YWx1ZSBAc2FtcHtCRkRfUkVMT0NfMzJ9IGlzIHVzZWQgZm9yIGFsbAotc2ltcGxlIDMyIGJpdCByZWxvY2F0aW9uIHR5cGVzLgotCi1UaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgcmVsb2NhdGlvbiBjb2RlIGlzIHRvIGdpdmUgdGhlIGFzc2VtYmxlciBzb21lCi1tZWNoYW5pc20gdG8gY3JlYXRlIEBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZXMuICBJbiBvcmRlciBmb3IgdGhlCi1hc3NlbWJsZXIgdG8gY3JlYXRlIGFuIEBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZSwgaXQgaGFzIHRvIGJlIGFibGUgdG8KLW9idGFpbiBhIGhvd3RvIHN0cnVjdHVyZS4gIFRoZSBmdW5jdGlvbiBAc2FtcHtiZmRfcmVsb2NfdHlwZV9sb29rdXB9LAotd2hpY2ggc2ltcGx5IGNhbGxzIHRoZSB0YXJnZXQgdmVjdG9yIGVudHJ5IHBvaW50Ci1Ac2FtcHtyZWxvY190eXBlX2xvb2t1cH0sIHRha2VzIGEgcmVsb2NhdGlvbiBjb2RlIGFuZCByZXR1cm5zIGEgaG93dG8KLXN0cnVjdHVyZS4KLQotVGhlIGZ1bmN0aW9uIEBzYW1we2JmZF9nZXRfcmVsb2NfY29kZV9uYW1lfSByZXR1cm5zIHRoZSBuYW1lIG9mIGEKLXJlbG9jYXRpb24gY29kZS4gIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMuCi0KLVVzaW5nIGJvdGggaG93dG8gc3RydWN0dXJlcyBhbmQgcmVsb2NhdGlvbiBjb2RlcyBjYW4gYmUgc29tZXdoYXQKLWNvbmZ1c2luZy4gIFRoZXJlIGFyZSBtYW55IHByb2Nlc3NvciBzcGVjaWZpYyByZWxvY2F0aW9uIGNvZGVzLgotSG93ZXZlciwgdGhlIHJlbG9jYXRpb24gaXMgb25seSBmdWxseSBkZWZpbmVkIGJ5IHRoZSBob3d0byBzdHJ1Y3R1cmUuCi1UaGUgc2FtZSByZWxvY2F0aW9uIGNvZGUgd2lsbCBtYXAgdG8gZGlmZmVyZW50IGhvd3RvIHN0cnVjdHVyZXMgaW4KLWRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIGV4YW1wbGUsIHRoZSBhZGRlbmQgaGFuZGxpbmcgbWF5IGJlCi1kaWZmZXJlbnQuCi0KLU1vc3Qgb2YgdGhlIHJlbG9jYXRpb24gY29kZXMgYXJlIG5vdCByZWFsbHkgZ2VuZXJhbC4gIFRoZSBhc3NlbWJsZXIgY2FuCi1ub3QgdXNlIHRoZW0gd2l0aG91dCBhbHJlYWR5IHVuZGVyc3RhbmRpbmcgd2hhdCBzb3J0cyBvZiByZWxvY2F0aW9ucyBjYW4KLWJlIHVzZWQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQuICBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byByZXBsYWNlIHRoZQotcmVsb2NhdGlvbiBjb2RlcyB3aXRoIHNvbWV0aGluZyBzaW1wbGVyLgotCi1Abm9kZSBCRkQgcmVsb2NhdGlvbiBmdXR1cmUKLUBzdWJzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGZ1dHVyZQotCi1DbGVhcmx5IHRoZSBjdXJyZW50IEJGRCByZWxvY2F0aW9uIHN1cHBvcnQgaXMgaW4gYmFkIHNoYXBlLiAgQQotd2hvbGVzY2FsZSByZXdyaXRlIHdvdWxkIGJlIHZlcnkgZGlmZmljdWx0LCBiZWNhdXNlIGl0IHdvdWxkIHJlcXVpcmUKLXRob3JvdWdoIHRlc3Rpbmcgb2YgZXZlcnkgQkZEIHRhcmdldC4gIFNvIHNvbWUgc29ydCBvZiBpbmNyZW1lbnRhbAotY2hhbmdlIGlzIHJlcXVpcmVkLgotCi1NeSB2YWd1ZSB0aG91Z2h0cyBvbiB0aGlzIHdvdWxkIGludm9sdmUgZGVmaW5pbmcgYSBuZXcsIGNsZWFybHkgZGVmaW5lZCwKLWhvd3RvIHN0cnVjdHVyZS4gIFNvbWUgbWVjaGFuaXNtIHdvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHR5cGUKLW9mIGhvd3RvIHN0cnVjdHVyZSB3YXMgYmVpbmcgdXNlZCBieSBhIHBhcnRpY3VsYXIgZm9ybWF0LgotCi1UaGUgbmV3IGhvd3RvIHN0cnVjdHVyZSB3b3VsZCBjbGVhcmx5IGRlZmluZSB0aGUgcmVsb2NhdGlvbiBiZWhhdmlvdXIgaW4KLXRoZSBjYXNlIG9mIGFuIGFzc2VtYmx5LCBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbmQgYSBmaW5hbCBsaW5rLiAgQXQKLWxlYXN0IG9uZSBzcGVjaWFsIGZ1bmN0aW9uIHdvdWxkIGJlIGRlZmluZWQgYXMgYW4gZXNjYXBlLCBhbmQgaXQgbWlnaHQKLW1ha2Ugc2Vuc2UgdG8gZGVmaW5lIG1vcmUuCi0KLU9uZSBvciBtb3JlIGdlbmVyaWMgZnVuY3Rpb25zIHNpbWlsYXIgdG8gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0KLXdvdWxkIGJlIHdyaXR0ZW4gdG8gaGFuZGxlIHRoZSBuZXcgaG93dG8gc3RydWN0dXJlLgotCi1UaGlzIHNob3VsZCBtYWtlIGl0IHBvc3NpYmxlIHRvIHdyaXRlIGEgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSByZWxvY2F0ZQotc2VjdGlvbiBmdW5jdGlvbnMgdXNlZCBieSB0aGUgbmV3IGxpbmtlci4gIFRoZSB0YXJnZXQgc3BlY2lmaWMgY29kZQotd291bGQgcHJvdmlkZSBzb21lIG1lY2hhbmlzbSAoYSBmdW5jdGlvbiBwb2ludGVyIG9yIGFuIGluaXRpYWwKLWNvbnZlcnNpb24pIHRvIGNvbnZlcnQgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb25zIGludG8gaG93dG8KLXN0cnVjdHVyZXMuCi0KLUlkZWFsbHkgaXQgd291bGQgYmUgcG9zc2libGUgdG8gdXNlIHRoaXMgZ2VuZXJpYyByZWxvY2F0ZSBzZWN0aW9uCi1mdW5jdGlvbiBmb3IgdGhlIGdlbmVyaWMgbGlua2VyIGFzIHdlbGwuICBUaGF0IGlzLCBpdCB3b3VsZCByZXBsYWNlIHRoZQotQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSBmdW5jdGlvbiB3aGljaCBpcwotY3VycmVudGx5IG5vcm1hbGx5IHVzZWQuCi0KLUZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIEVMRiBkeW5hbWljIGxpbmtpbmcsIG1vcmUgY29uc2lkZXJhdGlvbiBuZWVkcyB0bwotYmUgZ2l2ZW4gdG8gd3JpdGluZyBFTEYgc3BlY2lmaWMgYnV0IEVMRiB0YXJnZXQgZ2VuZXJpYyBjb2RlIHRvIGhhbmRsZQotc3BlY2lhbCByZWxvY2F0aW9uIHR5cGVzIHN1Y2ggYXMgR09UIGFuZCBQTFQuCi0KLUBub2RlIEJGRCBFTEYgc3VwcG9ydAotQHNlY3Rpb24gQkZEIEVMRiBzdXBwb3J0Ci1AY2luZGV4IGVsZiBzdXBwb3J0IGluIGJmZAotQGNpbmRleCBiZmQgZWxmIHN1cHBvcnQKLQotVGhlIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiB0d28gcGFydHM6IGEgZ2VuZXJpYyBBQkkgYW5kIGEKLXByb2Nlc3NvciBzcGVjaWZpYyBzdXBwbGVtZW50LiAgVGhlIEVMRiBzdXBwb3J0IGluIEJGRCBpcyBzcGxpdCBpbiBhCi1zaW1pbGFyIGZhc2hpb24uICBUaGUgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgaXMgbGFyZ2VseSBrZXB0IHdpdGhpbgotYSBzaW5nbGUgZmlsZS4gIFRoZSBnZW5lcmljIHN1cHBvcnQgaXMgcHJvdmlkZWQgYnkgc2V2ZXJhbCBvdGhlciBmaWxlcy4KLVRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycyBhbmQKLWNvbnN0YW50cyB1c2VkIGJ5IHRoZSBnZW5lcmljIHN1cHBvcnQuCi0KLUBtZW51Ci0qIEJGRCBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzOjoJRUxGIHNlY3Rpb25zIGFuZCBzZWdtZW50cwotKiBCRkQgRUxGIGdlbmVyaWMgc3VwcG9ydDo6CQlCRkQgRUxGIGdlbmVyaWMgc3VwcG9ydAotKiBCRkQgRUxGIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0OjoJQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotKiBCRkQgRUxGIGNvcmUgZmlsZXM6OgkJCUJGRCBFTEYgY29yZSBmaWxlcwotKiBCRkQgRUxGIGZ1dHVyZTo6CQkJQkZEIEVMRiBmdXR1cmUKLUBlbmQgbWVudQotCi1Abm9kZSBCRkQgRUxGIHNlY3Rpb25zIGFuZCBzZWdtZW50cwotQHN1YnNlY3Rpb24gRUxGIHNlY3Rpb25zIGFuZCBzZWdtZW50cwotCi1UaGUgRUxGIEFCSSBwZXJtaXRzIGEgZmlsZSB0byBoYXZlIGVpdGhlciBzZWN0aW9ucyBvciBzZWdtZW50cyBvciBib3RoLgotUmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlcyBjb252ZW50aW9uYWxseSBoYXZlIG9ubHkgc2VjdGlvbnMuCi1FeGVjdXRhYmxlcyBjb252ZW50aW9uYWxseSBoYXZlIGJvdGguICBDb3JlIGZpbGVzIGNvbnZlbnRpb25hbGx5IGhhdmUKLW9ubHkgcHJvZ3JhbSBzZWdtZW50cy4KLQotRUxGIHNlY3Rpb25zIGFyZSBzaW1pbGFyIHRvIHNlY3Rpb25zIGluIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHM6IHRoZXkKLWhhdmUgYSBuYW1lLCBhIFZNQSwgZmlsZSBjb250ZW50cywgZmxhZ3MsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzCi1pbmZvcm1hdGlvbi4gIEVMRiByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGluIHNlY3Rpb25zIG9mIGEgcGFydGljdWxhcgotdHlwZTsgQkZEIGF1dG9tYXRpY2FsbHkgY29udmVydHMgdGhlc2Ugc2VjdGlvbnMgaW50byBpbnRlcm5hbCByZWxvY2F0aW9uCi1pbmZvcm1hdGlvbi4KLQotRUxGIHByb2dyYW0gc2VnbWVudHMgYXJlIGludGVuZGVkIGZvciBmYXN0IGludGVycHJldGF0aW9uIGJ5IGEgc3lzdGVtCi1sb2FkZXIuICBUaGV5IGhhdmUgYSB0eXBlLCBhIFZNQSwgYW4gTE1BLCBmaWxlIGNvbnRlbnRzLCBhbmQgYSBjb3VwbGUgb2YKLW90aGVyIGZpZWxkcy4gIFdoZW4gYW4gRUxGIGV4ZWN1dGFibGUgaXMgcnVuIG9uIGEgVW5peCBzeXN0ZW0sIHRoZQotc3lzdGVtIGxvYWRlciB3aWxsIGV4YW1pbmUgdGhlIHByb2dyYW0gc2VnbWVudHMgdG8gZGVjaWRlIGhvdyB0byBsb2FkCi1pdC4gIFRoZSBsb2FkZXIgd2lsbCBpZ25vcmUgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBMb2FkYWJsZSBwcm9ncmFtCi1zZWdtZW50cyAodHlwZSBAc2FtcHtQVF9MT0FEfSkgYXJlIGRpcmVjdGx5IGxvYWRlZCBpbnRvIG1lbW9yeS4gIE90aGVyCi1wcm9ncmFtIHNlZ21lbnRzIGFyZSBpbnRlcnByZXRlZCBieSB0aGUgbG9hZGVyLCBhbmQgZ2VuZXJhbGx5IHByb3ZpZGUKLWR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4KLQotV2hlbiBhbiBFTEYgZmlsZSBoYXMgYm90aCBwcm9ncmFtIHNlZ21lbnRzIGFuZCBzZWN0aW9ucywgYW4gRUxGIHByb2dyYW0KLXNlZ21lbnQgbWF5IGVuY29tcGFzcyBvbmUgb3IgbW9yZSBFTEYgc2VjdGlvbnMsIGluIHRoZSBzZW5zZSB0aGF0IHRoZQotcG9ydGlvbiBvZiB0aGUgZmlsZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgcHJvZ3JhbSBzZWdtZW50IG1heSBpbmNsdWRlCi10aGUgcG9ydGlvbnMgb2YgdGhlIGZpbGUgY29ycmVzcG9uZGluZyB0byBvbmUgb3IgbW9yZSBzZWN0aW9ucy4gIFdoZW4KLXRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBpbiBhIGxvYWRhYmxlIHByb2dyYW0gc2VnbWVudCwgdGhlCi1yZWxhdGl2ZSBwb3NpdGlvbnMgb2YgdGhlIHNlY3Rpb24gY29udGVudHMgaW4gdGhlIGZpbGUgbXVzdCBjb3JyZXNwb25kCi10byB0aGUgcmVsYXRpdmUgcG9zaXRpb25zIHRoZXkgc2hvdWxkIGhvbGQgd2hlbiB0aGUgcHJvZ3JhbSBzZWdtZW50IGlzCi1sb2FkZWQuICBUaGlzIHJlcXVpcmVtZW50IHNob3VsZCBiZSBvYnZpb3VzIGlmIHlvdSBjb25zaWRlciB0aGF0IHRoZQotc3lzdGVtIGxvYWRlciB3aWxsIGxvYWQgYW4gZW50aXJlIHByb2dyYW0gc2VnbWVudCBhdCBhIHRpbWUuCi0KLU9uIGEgc3lzdGVtIHdoaWNoIHN1cHBvcnRzIGR5bmFtaWMgcGFnaW5nLCBzdWNoIGFzIGFueSBuYXRpdmUgVW5peAotc3lzdGVtLCB0aGUgY29udGVudHMgb2YgYSBsb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgbXVzdCBiZSBhdCB0aGUgc2FtZQotb2Zmc2V0IGluIHRoZSBmaWxlIGFzIGluIG1lbW9yeSwgbW9kdWxvIHRoZSBtZW1vcnkgcGFnZSBzaXplIHVzZWQgb24gdGhlCi1zeXN0ZW0uICBUaGlzIGlzIGJlY2F1c2UgdGhlIHN5c3RlbSBsb2FkZXIgd2lsbCBtYXAgdGhlIGZpbGUgaW50byBtZW1vcnkKLXN0YXJ0aW5nIGF0IHRoZSBzdGFydCBvZiBhIHBhZ2UuICBUaGUgc3lzdGVtIGxvYWRlciBjYW4gZWFzaWx5IHJlbWFwCi1lbnRpcmUgcGFnZXMgdG8gdGhlIGNvcnJlY3QgbG9hZCBhZGRyZXNzLiAgSG93ZXZlciwgaWYgdGhlIGNvbnRlbnRzIG9mCi10aGUgZmlsZSB3ZXJlIG5vdCBjb3JyZWN0bHkgYWxpZ25lZCB3aXRoaW4gdGhlIHBhZ2UsIHRoZSBzeXN0ZW0gbG9hZGVyCi13b3VsZCBoYXZlIHRvIHNoaWZ0IHRoZSBjb250ZW50cyBhcm91bmQgd2l0aGluIHRoZSBwYWdlLCB3aGljaCBpcyB0b28KLWV4cGVuc2l2ZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgTE1BIG9mIGEgbG9hZGFibGUgcHJvZ3JhbSBzZWdtZW50IGlzCi1Ac2FtcHsweDQwMDgwfSBhbmQgdGhlIHBhZ2Ugc2l6ZSBpcyBAc2FtcHsweDEwMDB9LCB0aGVuIHRoZSBwb3NpdGlvbiBvZgotdGhlIHNlZ21lbnQgY29udGVudHMgd2l0aGluIHRoZSBmaWxlIG11c3QgZXF1YWwgQHNhbXB7MHg4MH0gbW9kdWxvCi1Ac2FtcHsweDEwMDB9LgotCi1CRkQgaGFzIG9ubHkgYSBzaW5nbGUgc2V0IG9mIHNlY3Rpb25zLiAgSXQgZG9lcyBub3QgcHJvdmlkZSBhbnkgZ2VuZXJpYwotd2F5IHRvIGV4YW1pbmUgYm90aCBzZWN0aW9ucyBhbmQgc2VnbWVudHMuICBXaGVuIEJGRCBpcyB1c2VkIHRvIG9wZW4gYW4KLW9iamVjdCBmaWxlIG9yIGV4ZWN1dGFibGUsIHRoZSBCRkQgc2VjdGlvbnMgd2lsbCByZXByZXNlbnQgRUxGIHNlY3Rpb25zLgotV2hlbiBCRkQgaXMgdXNlZCB0byBvcGVuIGEgY29yZSBmaWxlLCB0aGUgQkZEIHNlY3Rpb25zIHdpbGwgcmVwcmVzZW50Ci1FTEYgcHJvZ3JhbSBzZWdtZW50cy4KLQotV2hlbiBCRkQgaXMgdXNlZCB0byBleGFtaW5lIGFuIG9iamVjdCBmaWxlIG9yIGV4ZWN1dGFibGUsIGFueSBwcm9ncmFtCi1zZWdtZW50cyB3aWxsIGJlIHJlYWQgdG8gc2V0IHRoZSBMTUEgb2YgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyBiZWNhdXNlCi1FTEYgc2VjdGlvbnMgb25seSBoYXZlIGEgVk1BLCB3aGlsZSBFTEYgcHJvZ3JhbSBzZWdtZW50cyBoYXZlIGJvdGggYSBWTUEKLWFuZCBhbiBMTUEuICBBbnkgcHJvZ3JhbSBzZWdtZW50cyB3aWxsIGJlIGNvcGllZCBieSB0aGUKLUBzYW1we2NvcHlfcHJpdmF0ZX0gZW50cnkgcG9pbnRzLiAgVGhleSB3aWxsIGJlIHByaW50ZWQgYnkgdGhlCi1Ac2FtcHtwcmludF9wcml2YXRlfSBlbnRyeSBwb2ludC4gIE90aGVyd2lzZSwgdGhlIHByb2dyYW0gc2VnbWVudHMgYXJlCi1pZ25vcmVkLiAgSW4gcGFydGljdWxhciwgcHJvZ3JhbXMgd2hpY2ggdXNlIEJGRCBjdXJyZW50bHkgaGF2ZSBubyBkaXJlY3QKLWFjY2VzcyB0byB0aGUgcHJvZ3JhbSBzZWdtZW50cy4KLQotV2hlbiBCRkQgaXMgdXNlZCB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSwgdGhlIHByb2dyYW0gc2VnbWVudHMgd2lsbCBiZQotY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBkb25lIGluCi10aGUgZnVuY3Rpb24gQHNhbXB7YXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50c30gaW4gQGZpbGV7ZWxmLmN9LgotVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiB0d2Vha2VkIG1hbnkgdGltZXMsIGFuZCBwcm9iYWJseSBzdGlsbCBoYXMKLXByb2JsZW1zIHRoYXQgYXJpc2UgaW4gcGFydGljdWxhciBjYXNlcy4KLQotVGhlcmUgaXMgYSBob29rIHdoaWNoIG1heSBiZSB1c2VkIHRvIGV4cGxpY2l0bHkgZGVmaW5lIHRoZSBwcm9ncmFtCi1zZWdtZW50cyB3aGVuIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGU6IHRoZSBAc2FtcHtiZmRfcmVjb3JkX3BoZHJ9Ci1mdW5jdGlvbiBpbiBAZmlsZXtiZmQuY30uICBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgQkZEIHdpbGwgbm90Ci1jcmVhdGUgcHJvZ3JhbSBzZWdtZW50cyBpdHNlbGYsIGJ1dCB3aWxsIG9ubHkgY3JlYXRlIHRoZSBwcm9ncmFtCi1zZWdtZW50cyBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlci4gIFRoZSBsaW5rZXIgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvCi1pbXBsZW1lbnQgdGhlIEBzYW1we1BIRFJTfSBsaW5rZXIgc2NyaXB0IGNvbW1hbmQuCi0KLUBub2RlIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0Ci1Ac3Vic2VjdGlvbiBCRkQgRUxGIGdlbmVyaWMgc3VwcG9ydAotCi1JbiBnZW5lcmFsLCBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IHJlYWQgZXh0ZXJuYWwgZGF0YSBmcm9tIHRoZSBFTEYgZmlsZQotYXJlIGZvdW5kIGluIEBmaWxle2VsZi5jfS4gIFRoZXkgb3BlcmF0ZSBvbiB0aGUgaW50ZXJuYWwgZm9ybXMgb2YgdGhlCi1FTEYgc3RydWN0dXJlcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gQGZpbGV7aW5jbHVkZS9lbGYvaW50ZXJuYWwuaH0uICBUaGUKLWludGVybmFsIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgQHNhbXB7YmZkX3ZtYX0sIGFuZCBzbyBtYXkKLWJlIHVzZWQgZm9yIGJvdGggMzIgYml0IGFuZCA2NCBiaXQgRUxGIHRhcmdldHMuCi0KLVRoZSBmaWxlIEBmaWxle2VsZmNvZGUuaH0gY29udGFpbnMgZnVuY3Rpb25zIHdoaWNoIG9wZXJhdGUgb24gdGhlCi1leHRlcm5hbCBkYXRhLiAgQGZpbGV7ZWxmY29kZS5ofSBpcyBjb21waWxlZCB0d2ljZSwgb25jZSB2aWEKLUBmaWxle2VsZjMyLmN9IHdpdGggQHNhbXB7QVJDSF9TSVpFfSBkZWZpbmVkIGFzIEBzYW1wezMyfSwgYW5kIG9uY2UgdmlhCi1AZmlsZXtlbGY2NC5jfSB3aXRoIEBzYW1we0FSQ0hfU0laRX0gZGVmaW5lZCBhcyBAc2FtcHs2NH0uCi1AZmlsZXtlbGZjb2RlLmh9IGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBzd2FwIHRoZSBFTEYgc3RydWN0dXJlcyBpbiBhbmQKLW91dCBvZiBleHRlcm5hbCBmb3JtLCBhcyB3ZWxsIGFzIGEgZmV3IG1vcmUgY29tcGxleCBmdW5jdGlvbnMuCi0KLUxpbmtlciBzdXBwb3J0IGlzIGZvdW5kIGluIEBmaWxle2VsZmxpbmsuY30gYW5kIEBmaWxle2VsZmxpbmsuaH0uICBUaGUKLWxhdHRlciBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBmb3IgYm90aCAzMiBhbmQgNjQgYml0IHN1cHBvcnQuICBUaGUKLWxpbmtlciBzdXBwb3J0IGlzIG9ubHkgdXNlZCBpZiB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIGZpbGUgZGVmaW5lcwotQHNhbXB7ZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbn0sIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHJlbG9jYXRlIHRoZQotc2VjdGlvbiBjb250ZW50cy4gIElmIHRoYXQgbWFjcm8gaXMgbm90IGRlZmluZWQsIHRoZSBnZW5lcmljIGxpbmtlciBjb2RlCi1pcyB1c2VkLCBhbmQgcmVsb2NhdGlvbnMgYXJlIGhhbmRsZWQgdmlhIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LgotCi1UaGUgY29yZSBmaWxlIHN1cHBvcnQgaXMgaW4gQGZpbGV7ZWxmY29yZS5ofSwgd2hpY2ggaXMgY29tcGlsZWQgdHdpY2UsCi1mb3IgYm90aCAzMiBhbmQgNjQgYml0IHN1cHBvcnQuICBUaGUgbW9yZSBpbnRlcmVzdGluZyBjYXNlcyBvZiBjb3JlIGZpbGUKLXN1cHBvcnQgb25seSB3b3JrIG9uIGEgbmF0aXZlIHN5c3RlbSB3aGljaCBoYXMgdGhlIEBmaWxle3N5cy9wcm9jZnMuaH0KLWhlYWRlciBmaWxlLiAgV2l0aG91dCB0aGF0IGZpbGUsIHRoZSBjb3JlIGZpbGUgc3VwcG9ydCBkb2VzIGxpdHRsZSBtb3JlCi10aGFuIHJlYWQgdGhlIEVMRiBwcm9ncmFtIHNlZ21lbnRzIGFzIEJGRCBzZWN0aW9ucy4KLQotVGhlIEJGRCBpbnRlcm5hbCBoZWFkZXIgZmlsZSBAZmlsZXtlbGYtYmZkLmh9IGlzIHVzZWQgZm9yIGNvbW11bmljYXRpb24KLWFtb25nIHRoZXNlIGZpbGVzIGFuZCB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIGZpbGVzLgotCi1UaGUgZGVmYXVsdCBlbnRyaWVzIGZvciB0aGUgQkZEIEVMRiB0YXJnZXQgdmVjdG9yIGFyZSBmb3VuZCBtYWlubHkgaW4KLUBmaWxle2VsZi5jfS4gIFNvbWUgZnVuY3Rpb25zIGFyZSBmb3VuZCBpbiBAZmlsZXtlbGZjb2RlLmh9LgotCi1UaGUgcHJvY2Vzc29yIHNwZWNpZmljIGZpbGVzIG1heSBvdmVycmlkZSBwYXJ0aWN1bGFyIGVudHJpZXMgaW4gdGhlCi10YXJnZXQgdmVjdG9yLCBidXQgbW9zdCBkbyBub3QsIHdpdGggb25lIGV4Y2VwdGlvbjogdGhlCi1Ac2FtcHtiZmRfcmVsb2NfdHlwZV9sb29rdXB9IGVudHJ5IHBvaW50IGlzIGFsd2F5cyBwcm9jZXNzb3Igc3BlY2lmaWMuCi0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLUBzdWJzZWN0aW9uIEJGRCBFTEYgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLQotQnkgY29udmVudGlvbiwgdGhlIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IGZvciBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yCi13aWxsIGJlIGZvdW5kIGluIEBmaWxle2VsZkB2YXJ7bm59LUB2YXJ7Y3B1fS5jfSwgd2hlcmUgQHZhcntubn0gaXMKLWVpdGhlciAzMiBvciA2NCwgYW5kIEB2YXJ7Y3B1fSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvY2Vzc29yLgotCi1AbWVudQotKiBCRkQgRUxGIHByb2Nlc3NvciByZXF1aXJlZDo6CVJlcXVpcmVkIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIGxpbmtlcjo6CVByb2Nlc3NvciBzcGVjaWZpYyBsaW5rZXIgc3VwcG9ydAotKiBCRkQgRUxGIHByb2Nlc3NvciBvdGhlcjo6CU90aGVyIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IG9wdGlvbnMKLUBlbmQgbWVudQotCi1Abm9kZSBCRkQgRUxGIHByb2Nlc3NvciByZXF1aXJlZAotQHN1YnN1YnNlY3Rpb24gUmVxdWlyZWQgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLQotV2hlbiB3cml0aW5nIGEgQGZpbGV7ZWxmQHZhcntubn0tQHZhcntjcHV9LmN9IGZpbGUsIHlvdSBtdXN0IGRvIHRoZQotZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotRGVmaW5lIGVpdGhlciBAc2FtcHtUQVJHRVRfQklHX1NZTX0gb3IgQHNhbXB7VEFSR0VUX0xJVFRMRV9TWU19LCBvcgotYm90aCwgdG8gYSB1bmlxdWUgQyBuYW1lIHRvIHVzZSBmb3IgdGhlIHRhcmdldCB2ZWN0b3IuICBUaGlzIG5hbWUgc2hvdWxkCi1hcHBlYXIgaW4gdGhlIGxpc3Qgb2YgdGFyZ2V0IHZlY3RvcnMgaW4gQGZpbGV7dGFyZ2V0cy5jfSwgYW5kIHdpbGwgYWxzbwotaGF2ZSB0byBhcHBlYXIgaW4gQGZpbGV7Y29uZmlnLmJmZH0gYW5kIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBEZWZpbmUKLUBzYW1we1RBUkdFVF9CSUdfU1lNfSBmb3IgYSBiaWctZW5kaWFuIHByb2Nlc3NvciwKLUBzYW1we1RBUkdFVF9MSVRUTEVfU1lNfSBmb3IgYSBsaXR0bGUtZW5kaWFuIHByb2Nlc3NvciwgYW5kIGRlZmluZSBib3RoCi1mb3IgYSBiaS1lbmRpYW4gcHJvY2Vzc29yLgotQGl0ZW0KLURlZmluZSBlaXRoZXIgQHNhbXB7VEFSR0VUX0JJR19OQU1FfSBvciBAc2FtcHtUQVJHRVRfTElUVExFX05BTUV9LCBvcgotYm90aCwgdG8gYSBzdHJpbmcgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHZlY3Rvci4gIFRoaXMgaXMgdGhlCi1uYW1lIHdoaWNoIGEgdXNlciBvZiB0aGUgQkZEIHRvb2wgd291bGQgdXNlIHRvIHNwZWNpZnkgdGhlIG9iamVjdCBmaWxlCi1mb3JtYXQuICBJdCB3b3VsZCBub3JtYWxseSBhcHBlYXIgaW4gYSBsaW5rZXIgZW11bGF0aW9uIHBhcmFtZXRlcnMKLWZpbGUuCi1AaXRlbQotRGVmaW5lIEBzYW1we0VMRl9BUkNIfSB0byB0aGUgQkZEIGFyY2hpdGVjdHVyZSAoYW4gZWxlbWVudCBvZiB0aGUKLUBzYW1we2JmZF9hcmNoaXRlY3R1cmV9IGVudW0sIHR5cGljYWxseSBAc2FtcHtiZmRfYXJjaF9AdmFye2NwdX19KS4KLUBpdGVtCi1EZWZpbmUgQHNhbXB7RUxGX01BQ0hJTkVfQ09ERX0gdG8gdGhlIG1hZ2ljIG51bWJlciB3aGljaCBzaG91bGQgYXBwZWFyCi1pbiB0aGUgQHNhbXB7ZV9tYWNoaW5lfSBmaWVsZCBvZiB0aGUgRUxGIGhlYWRlci4gIEFzIG9mIHRoaXMgd3JpdGluZywKLXRoZXNlIG1hZ2ljIG51bWJlcnMgYXJlIGFzc2lnbmVkIGJ5IFNDTzsgaWYgeW91IHdhbnQgdG8gZ2V0IGEgbWFnaWMKLW51bWJlciBmb3IgYSBwYXJ0aWN1bGFyIHByb2Nlc3NvciwgdHJ5IHNlbmRpbmcgYSBub3RlIHRvCi1AZW1haWx7cmVnaXN0cnlAQHNjby5jb219LiAgSW4gdGhlIEJGRCBzb3VyY2VzLCB0aGUgbWFnaWMgbnVtYmVycyBhcmUKLWZvdW5kIGluIEBmaWxle2luY2x1ZGUvZWxmL2NvbW1vbi5ofTsgdGhleSBoYXZlIG5hbWVzIGJlZ2lubmluZyB3aXRoCi1Ac2FtcHtFTV99LgotQGl0ZW0KLURlZmluZSBAc2FtcHtFTEZfTUFYUEFHRVNJWkV9IHRvIHRoZSBtYXhpbXVtIHNpemUgb2YgYSB2aXJ0dWFsIHBhZ2UgaW4KLW1lbW9yeS4gIFRoaXMgY2FuIG5vcm1hbGx5IGJlIGZvdW5kIGF0IHRoZSBzdGFydCBvZiBjaGFwdGVyIDUgaW4gdGhlCi1wcm9jZXNzb3Igc3BlY2lmaWMgc3VwcGxlbWVudC4gIEZvciBhIHByb2Nlc3NvciB3aGljaCB3aWxsIG9ubHkgYmUgdXNlZAotaW4gYW4gZW1iZWRkZWQgc3lzdGVtLCBvciB3aGljaCBoYXMgbm8gbWVtb3J5IG1hbmFnZW1lbnQgaGFyZHdhcmUsIHRoaXMKLWNhbiBzaW1wbHkgYmUgQHNhbXB7MX0uCi1AaXRlbQotSWYgdGhlIGZvcm1hdCBzaG91bGQgdXNlIEBzYW1we1JlbH0gcmF0aGVyIHRoYW4gQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMsCi1kZWZpbmUgQHNhbXB7VVNFX1JFTH0uICBUaGlzIGlzIG5vcm1hbGx5IGRlZmluZWQgaW4gY2hhcHRlciA0IG9mIHRoZQotcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBsZW1lbnQuCi0KLUluIHRoZSBhYnNlbmNlIG9mIGEgc3VwcGxlbWVudCwgaXQncyBlYXNpZXIgdG8gd29yayB3aXRoIEBzYW1we1JlbGF9Ci1yZWxvY2F0aW9ucy4gIEBzYW1we1JlbGF9IHJlbG9jYXRpb25zIHdpbGwgcmVxdWlyZSBtb3JlIHNwYWNlIGluIG9iamVjdAotZmlsZXMgKGJ1dCBub3QgaW4gZXhlY3V0YWJsZXMsIGV4Y2VwdCB3aGVuIHVzaW5nIGR5bmFtaWMgbGlua2luZykuCi1Ib3dldmVyLCB0aGlzIGlzIG91dHdlaWdoZWQgYnkgdGhlIHNpbXBsaWNpdHkgb2YgYWRkZW5kIGhhbmRsaW5nIHdoZW4KLXVzaW5nIEBzYW1we1JlbGF9IHJlbG9jYXRpb25zLiAgV2l0aCBAc2FtcHtSZWx9IHJlbG9jYXRpb25zLCB0aGUgYWRkZW5kCi1tdXN0IGJlIHN0b3JlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgd2hpY2ggbWFrZXMgcmVsb2NhdGVhYmxlIGxpbmtzCi1tb3JlIGNvbXBsZXguCi0KLUZvciBleGFtcGxlLCBjb25zaWRlciBDIGNvZGUgbGlrZSBAY29kZXtpID0gYVsxMDAwXTt9IHdoZXJlIEBzYW1we2F9IGlzCi1hIGdsb2JhbCBhcnJheS4gIFRoZSBpbnN0cnVjdGlvbnMgd2hpY2ggbG9hZCB0aGUgdmFsdWUgb2YgQHNhbXB7YVsxMDAwXX0KLXdpbGwgbW9zdCBsaWtlbHkgdXNlIGEgcmVsb2NhdGlvbiB3aGljaCByZWZlcnMgdG8gdGhlIHN5bWJvbAotcmVwcmVzZW50aW5nIEBzYW1we2F9LCB3aXRoIGFuIGFkZGVuZCB0aGF0IGdpdmVzIHRoZSBvZmZzZXQgZnJvbSB0aGUKLXN0YXJ0IG9mIEBzYW1we2F9IHRvIGVsZW1lbnQgQHNhbXB7MTAwMH0uICBXaGVuIHVzaW5nIEBzYW1we1JlbH0KLXJlbG9jYXRpb25zLCB0aGF0IGFkZGVuZCBtdXN0IGJlIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuCi1JZiB5b3UgYXJlIGFkZGluZyBzdXBwb3J0IGZvciBhIFJJU0MgY2hpcCB3aGljaCB1c2VzIHR3byBvciBtb3JlCi1pbnN0cnVjdGlvbnMgdG8gbG9hZCBhbiBhZGRyZXNzLCB0aGVuIHRoZSBhZGRlbmQgbWF5IG5vdCBmaXQgaW4gYSBzaW5nbGUKLWluc3RydWN0aW9uLCBhbmQgd2lsbCBoYXZlIHRvIGJlIHNvbWVob3cgc3BsaXQgYW1vbmcgdGhlIGluc3RydWN0aW9ucy4KLVRoaXMgbWFrZXMgbGlua2luZyBhd2t3YXJkLCBwYXJ0aWN1bGFybHkgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rCi1pbiB3aGljaCB0aGUgYWRkZW5kIG1heSBoYXZlIHRvIGJlIHVwZGF0ZWQuICBJdCBjYW4gYmUgZG9uZS0tLXRoZSBNSVBTCi1FTEYgc3VwcG9ydCBkb2VzIGl0LS0tYnV0IGl0IHNob3VsZCBiZSBhdm9pZGVkIHdoZW4gcG9zc2libGUuCi0KLUl0IGlzIHBvc3NpYmxlLCB0aG91Z2ggc29tZXdoYXQgYXdrd2FyZCwgdG8gc3VwcG9ydCBib3RoIEBzYW1we1JlbH0gYW5kCi1Ac2FtcHtSZWxhfSByZWxvY2F0aW9ucyBmb3IgYSBzaW5nbGUgdGFyZ2V0OyBAZmlsZXtlbGY2NC1taXBzLmN9IGRvZXMgaXQKLWJ5IG92ZXJyaWRpbmcgdGhlIHJlbG9jYXRpb24gcmVhZGluZyBhbmQgd3JpdGluZyByb3V0aW5lcy4KLUBpdGVtCi1EZWZpbmUgaG93dG8gc3RydWN0dXJlcyBmb3IgYWxsIHRoZSByZWxvY2F0aW9uIHR5cGVzLgotQGl0ZW0KLURlZmluZSBhIEBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0gcm91dGluZS4gIFRoaXMgbXVzdCBiZSBuYW1lZAotQHNhbXB7YmZkX2VsZkB2YXJ7bm59X2JmZF9yZWxvY190eXBlX2xvb2t1cH0sIGFuZCBtYXkgYmUgZWl0aGVyIGEKLWZ1bmN0aW9uIG9yIGEgbWFjcm8uICBJdCBtdXN0IHRyYW5zbGF0ZSBhIEJGRCByZWxvY2F0aW9uIGNvZGUgaW50byBhCi1ob3d0byBzdHJ1Y3R1cmUuICBUaGlzIGlzIG5vcm1hbGx5IGEgdGFibGUgbG9va3VwIG9yIGEgc2ltcGxlIHN3aXRjaC4KLUBpdGVtCi1JZiB1c2luZyBAc2FtcHtSZWx9IHJlbG9jYXRpb25zLCBkZWZpbmUgQHNhbXB7ZWxmX2luZm9fdG9faG93dG9fcmVsfS4KLUlmIHVzaW5nIEBzYW1we1JlbGF9IHJlbG9jYXRpb25zLCBkZWZpbmUgQHNhbXB7ZWxmX2luZm9fdG9faG93dG99LgotRWl0aGVyIHdheSwgdGhpcyBpcyBhIG1hY3JvIGRlZmluZWQgYXMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB3aGljaAotdGFrZXMgYW4gQHNhbXB7YXJlbGVudH0gYW5kIGEgQHNhbXB7UmVsfSBvciBAc2FtcHtSZWxhfSBzdHJ1Y3R1cmUsIGFuZAotc2V0cyB0aGUgQHNhbXB7aG93dG99IGZpZWxkIG9mIHRoZSBAc2FtcHthcmVsZW50fSBiYXNlZCBvbiB0aGUKLUBzYW1we1JlbH0gb3IgQHNhbXB7UmVsYX0gc3RydWN0dXJlLiAgVGhpcyBpcyBub3JtYWxseSB1c2VzCi1Ac2FtcHtFTEZAdmFye25ufV9SX1RZUEV9IHRvIGdldCB0aGUgRUxGIHJlbG9jYXRpb24gdHlwZSBhbmQgdXNlcyBpdCBhcwotYW4gaW5kZXggaW50byBhIHRhYmxlIG9mIGhvd3RvIHN0cnVjdHVyZXMuCi1AZW5kIGl0ZW1pemUKLQotWW91IG11c3QgYWxzbyBhZGQgdGhlIG1hZ2ljIG51bWJlciBmb3IgdGhpcyBwcm9jZXNzb3IgdG8gdGhlCi1Ac2FtcHtwcmVwX2hlYWRlcnN9IGZ1bmN0aW9uIGluIEBmaWxle2VsZi5jfS4KLQotWW91IG11c3QgYWxzbyBjcmVhdGUgYSBoZWFkZXIgZmlsZSBpbiB0aGUgQGZpbGV7aW5jbHVkZS9lbGZ9IGRpcmVjdG9yeQotY2FsbGVkIEBmaWxle0B2YXJ7Y3B1fS5ofS4gIFRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIGFueSB0YXJnZXQgc3BlY2lmaWMgCi1pbmZvcm1hdGlvbiB3aGljaCBtYXkgYmUgbmVlZGVkIG91dHNpZGUgb2YgdGhlIEJGRCBjb2RlLiAgSW4gcGFydGljdWxhcgotaXQgc2hvdWxkIHVzZSB0aGUgQHNhbXB7U1RBUlRfUkVMT0NfTlVNQkVSU30sIEBzYW1we1JFTE9DX05VTUJFUn0sCi1Ac2FtcHtGQUtFX1JFTE9DfSwgQHNhbXB7RU1QVFlfUkVMT0N9IGFuZCBAc2FtcHtFTkRfUkVMT0NfTlVNQkVSU30KLW1hY3JvcyB0byBjcmVhdGUgYSB0YWJsZSBtYXBwaW5nIHRoZSBudW1iZXIgdXNlZCB0byBpbmRlbnRpZnkgYQotcmVsb2NhdGlvbiB0byBhIG5hbWUgZGVzY3JpYmluZyB0aGF0IHJlbG9jYXRpb24uCi0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIGxpbmtlcgotQHN1YnN1YnNlY3Rpb24gUHJvY2Vzc29yIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0Ci0KLVRoZSBsaW5rZXIgd2lsbCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IGlmIHlvdSBkZWZpbmUgYSByZWxvY2F0ZSBzZWN0aW9uCi1mdW5jdGlvbi4gIFRoaXMgd2lsbCBwZXJtaXQgQkZEIHRvIHVzZSB0aGUgRUxGIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0LgotCi1JZiB5b3UgZG8gbm90IGRlZmluZSBhIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb24sIEJGRCBtdXN0IHVzZSB0aGUKLWdlbmVyaWMgbGlua2VyIHN1cHBvcnQsIHdoaWNoIHJlcXVpcmVzIGNvbnZlcnRpbmcgYWxsIHN5bWJvbHMgYW5kCi1yZWxvY2F0aW9ucyBpbnRvIEJGRCBAc2FtcHthc3ltYm9sfSBhbmQgQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcy4gIEluCi10aGlzIGNhc2UsIHJlbG9jYXRpb25zIHdpbGwgYmUgaGFuZGxlZCBieSBjYWxsaW5nCi1Ac2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSwgd2hpY2ggd2lsbCB1c2UgdGhlIGhvd3RvIHN0cnVjdHVyZXMgeW91Ci1oYXZlIGRlZmluZWQuICBAeHJlZntCRkQgcmVsb2NhdGlvbiBoYW5kbGluZ30uCi0KLUluIG9yZGVyIHRvIHN1cHBvcnQgbGlua2luZyBpbnRvIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdCwgc3VjaCBhcwotUy1yZWNvcmRzLCBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSBtdXN0IHdvcmsgY29ycmVjdGx5IHdpdGggeW91cgotaG93dG8gc3RydWN0dXJlcywgc28geW91IGNhbid0IHNraXAgdGhhdCBzdGVwLiAgSG93ZXZlciwgaWYgeW91IGRlZmluZQotdGhlIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb24sIHRoZW4gaW4gdGhlIG5vcm1hbCBjYXNlIG9mIGxpbmtpbmcgaW50bwotYW4gRUxGIGZpbGUgdGhlIGxpbmtlciB3aWxsIG5vdCBuZWVkIHRvIGNvbnZlcnQgc3ltYm9scyBhbmQgcmVsb2NhdGlvbnMsCi1hbmQgd2lsbCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50LgotCi1UbyB1c2UgYSByZWxvY2F0aW9uIHNlY3Rpb24gZnVuY3Rpb24sIGRlZmluZSB0aGUgbWFjcm8KLUBzYW1we2VsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb259IGFzIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gd2hpY2ggd2lsbAotdGFrZSB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLCBhcyB3ZWxsIGFzIHJlbG9jYXRpb24sIHN5bWJvbCwgYW5kIG90aGVyCi1pbmZvcm1hdGlvbiwgYW5kIG1vZGlmeSB0aGUgc2VjdGlvbiBjb250ZW50cyBhY2NvcmRpbmcgdG8gdGhlIHJlbG9jYXRpb24KLWluZm9ybWF0aW9uLiAgSW4gc2ltcGxlIGNhc2VzLCB0aGlzIGlzIGxpdHRsZSBtb3JlIHRoYW4gYSBsb29wIG92ZXIgdGhlCi1yZWxvY2F0aW9ucyB3aGljaCBjb21wdXRlcyB0aGUgdmFsdWUgb2YgZWFjaCByZWxvY2F0aW9uIGFuZCBjYWxscwotQHNhbXB7X2JmZF9maW5hbF9saW5rX3JlbG9jYXRlfS4gIFRoZSBmdW5jdGlvbiBtdXN0IGNoZWNrIGZvciBhCi1yZWxvY2F0ZWFibGUgbGluaywgYW5kIGluIHRoYXQgY2FzZSBub3JtYWxseSBuZWVkcyB0byBkbyBub3RoaW5nIG90aGVyCi10aGFuIGFkanVzdCB0aGUgYWRkZW5kIGZvciByZWxvY2F0aW9ucyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wuCi0KLVRoZSBjb21wbGV4IGNhc2VzIGdlbmVyYWxseSBoYXZlIHRvIGRvIHdpdGggZHluYW1pYyBsaW5rZXIgc3VwcG9ydC4gIEdPVAotYW5kIFBMVCByZWxvY2F0aW9ucyBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LCBhbmQgdGhlIGxpbmtlciBub3JtYWxseQotYXJyYW5nZXMgdG8gc2V0IHVwIHRoZSBHT1QgYW5kIFBMVCBzZWN0aW9ucyB3aGlsZSBoYW5kbGluZyByZWxvY2F0aW9ucy4KLVdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCByYW5kb20gcmVsb2NhdGlvbnMgbXVzdCBub3JtYWxseSBiZQotY29waWVkIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LCBvciBjb252ZXJ0ZWQgdG8gUkVMQVRJVkUgcmVsb2NhdGlvbnMKLXdoZW4gcG9zc2libGUuCi0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIG90aGVyCi1Ac3Vic3Vic2VjdGlvbiBPdGhlciBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBvcHRpb25zCi0KLVRoZXJlIGFyZSBtYW55IG90aGVyIG1hY3JvcyB3aGljaCBtYXkgYmUgZGVmaW5lZCBpbgotQGZpbGV7ZWxmQHZhcntubn0tQHZhcntjcHV9LmN9LiAgVGhlc2UgbWFjcm9zIG1heSBiZSBmb3VuZCBpbgotQGZpbGV7ZWxmeHgtdGFyZ2V0Lmh9LgotCi1NYWNyb3MgbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgc29tZSBvZiB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0IHZlY3RvcgotZnVuY3Rpb25zLgotCi1TZXZlcmFsIHByb2Nlc3NvciBzcGVjaWZpYyBob29rIGZ1bmN0aW9ucyB3aGljaCBtYXkgYmUgZGVmaW5lZCBhcwotbWFjcm9zLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3VuZCBhcyBmdW5jdGlvbiBwb2ludGVycyBpbiB0aGUKLUBzYW1we2VsZl9iYWNrZW5kX2RhdGF9IHN0cnVjdHVyZSBkZWZpbmVkIGluIEBmaWxle2VsZi1iZmQuaH0uICBJbgotZ2VuZXJhbCwgYSBob29rIGZ1bmN0aW9uIGlzIHNldCBieSBkZWZpbmluZyBhIG1hY3JvCi1Ac2FtcHtlbGZfYmFja2VuZF9AdmFye25hbWV9fS4KLQotVGhlcmUgYXJlIGEgZmV3IHByb2Nlc3NvciBzcGVjaWZpYyBjb25zdGFudHMgd2hpY2ggbWF5IGFsc28gYmUgZGVmaW5lZC4KLVRoZXNlIGFyZSBhZ2FpbiBmb3VuZCBpbiB0aGUgQHNhbXB7ZWxmX2JhY2tlbmRfZGF0YX0gc3RydWN0dXJlLgotCi1JIHdpbGwgbm90IGRlZmluZSB0aGUgdmFyaW91cyBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cyBoZXJlOyBzZWUgdGhlCi1jb21tZW50cyBpbiBAZmlsZXtlbGYtYmZkLmh9LgotCi1Ob3JtYWxseSBhbnkgb2RkIGNoYXJhY3RlcmlzdGljIG9mIGEgcGFydGljdWxhciBFTEYgcHJvY2Vzc29yIGlzIGhhbmRsZWQKLXZpYSBhIGhvb2sgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgdGhlIHNwZWNpYWwgQHNhbXB7U0hOX01JUFNfU0NPTU1PTn0KLXNlY3Rpb24gbnVtYmVyIGZvdW5kIGluIE1JUFMgRUxGIGlzIGhhbmRsZWQgdmlhIHRoZSBob29rcwotQHNhbXB7c2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9ufSwgQHNhbXB7c3ltYm9sX3Byb2Nlc3Npbmd9LAotQHNhbXB7YWRkX3N5bWJvbF9ob29rfSwgYW5kIEBzYW1we291dHB1dF9zeW1ib2xfaG9va30uCi0KLUR5bmFtaWMgbGlua2luZyBzdXBwb3J0LCB3aGljaCBpbnZvbHZlcyBwcm9jZXNzb3Igc3BlY2lmaWMgcmVsb2NhdGlvbnMKLXJlcXVpcmluZyBzcGVjaWFsIGhhbmRsaW5nLCBpcyBhbHNvIGltcGxlbWVudGVkIHZpYSBob29rIGZ1bmN0aW9ucy4KLQotQG5vZGUgQkZEIEVMRiBjb3JlIGZpbGVzCi1Ac3Vic2VjdGlvbiBCRkQgRUxGIGNvcmUgZmlsZXMKLUBjaW5kZXggZWxmIGNvcmUgZmlsZXMKLQotT24gbmF0aXZlIEVMRiBVbml4IHN5c3RlbXMsIGNvcmUgZmlsZXMgYXJlIGdlbmVyYXRlZCB3aXRob3V0IGFueQotc2VjdGlvbnMuICBJbnN0ZWFkLCB0aGV5IG9ubHkgaGF2ZSBwcm9ncmFtIHNlZ21lbnRzLgotCi1XaGVuIEJGRCBpcyB1c2VkIHRvIHJlYWQgYW4gRUxGIGNvcmUgZmlsZSwgdGhlIEJGRCBzZWN0aW9ucyB3aWxsCi1hY3R1YWxseSByZXByZXNlbnQgcHJvZ3JhbSBzZWdtZW50cy4gIFNpbmNlIEVMRiBwcm9ncmFtIHNlZ21lbnRzIGRvIG5vdAotaGF2ZSBuYW1lcywgQkZEIHdpbGwgaW52ZW50IG5hbWVzIGxpa2UgQHNhbXB7c2VnbWVudEB2YXJ7bn19IHdoZXJlCi1AdmFye259IGlzIGEgbnVtYmVyLgotCi1BIHNpbmdsZSBFTEYgcHJvZ3JhbSBzZWdtZW50IG1heSBpbmNsdWRlIGJvdGggYW4gaW5pdGlhbGl6ZWQgcGFydCBhbmQgYW4KLXVuaW5pdGlhbGl6ZWQgcGFydC4gIFRoZSBzaXplIG9mIHRoZSBpbml0aWFsaXplZCBwYXJ0IGlzIGdpdmVuIGJ5IHRoZQotQHNhbXB7cF9maWxlc3p9IGZpZWxkLiAgVGhlIHRvdGFsIHNpemUgb2YgdGhlIHNlZ21lbnQgaXMgZ2l2ZW4gYnkgdGhlCi1Ac2FtcHtwX21lbXN6fSBmaWVsZC4gIElmIEBzYW1we3BfbWVtc3p9IGlzIGxhcmdlciB0aGFuIEBzYW1we3BfZmlsZXN6fSwKLXRoZW4gdGhlIGV4dHJhIHNwYWNlIGlzIHVuaW5pdGlhbGl6ZWQsIG9yLCBtb3JlIHByZWNpc2VseSwgaW5pdGlhbGl6ZWQKLXRvIHplcm8uCi0KLUJGRCB3aWxsIHJlcHJlc2VudCBzdWNoIGEgcHJvZ3JhbSBzZWdtZW50IGFzIHR3byBkaWZmZXJlbnQgc2VjdGlvbnMuCi1UaGUgZmlyc3QsIG5hbWVkIEBzYW1we3NlZ21lbnRAdmFye259YX0sIHdpbGwgcmVwcmVzZW50IHRoZSBpbml0aWFsaXplZAotcGFydCBvZiB0aGUgcHJvZ3JhbSBzZWdtZW50LiAgVGhlIHNlY29uZCwgbmFtZWQgQHNhbXB7c2VnbWVudEB2YXJ7bn1ifSwKLXdpbGwgcmVwcmVzZW50IHRoZSB1bmluaXRpYWxpemVkIHBhcnQuCi0KLUVMRiBjb3JlIGZpbGVzIHN0b3JlIHNwZWNpYWwgaW5mb3JtYXRpb24gc3VjaCBhcyByZWdpc3RlciB2YWx1ZXMgaW4KLXByb2dyYW0gc2VnbWVudHMgd2l0aCB0aGUgdHlwZSBAc2FtcHtQVF9OT1RFfS4gIEJGRCB3aWxsIGF0dGVtcHQgdG8KLWludGVycHJldCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlc2Ugc2VnbWVudHMsIGFuZCB3aWxsIGNyZWF0ZSBhZGRpdGlvbmFsCi1zZWN0aW9ucyBob2xkaW5nIHRoZSBpbmZvcm1hdGlvbi4gIFNvbWUgb2YgdGhpcyBpbnRlcnByZXRhdGlvbiByZXF1aXJlcwotaW5mb3JtYXRpb24gZm91bmQgaW4gdGhlIGhvc3QgaGVhZGVyIGZpbGUgQGZpbGV7c3lzL3Byb2Nmcy5ofSwgYW5kIHNvCi13aWxsIG9ubHkgd29yayB3aGVuIEJGRCBpcyBidWlsdCBvbiBhIG5hdGl2ZSBzeXN0ZW0uCi0KLUJGRCBkb2VzIG5vdCBjdXJyZW50bHkgcHJvdmlkZSBhbnkgd2F5IHRvIGNyZWF0ZSBhbiBFTEYgY29yZSBmaWxlLiAgSW4KLWdlbmVyYWwsIEJGRCBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIGNyZWF0ZSBjb3JlIGZpbGVzLiAgVGhlIHdheSB0bwotaW1wbGVtZW50IHRoaXMgd291bGQgYmUgdG8gd3JpdGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGFuZAotQHNhbXB7YmZkX3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lcyBmb3IgdGhlIEBzYW1we2JmZF9jb3JlfSB0eXBlOyBzZWUKLUByZWZ7QkZEIHRhcmdldCB2ZWN0b3IgZm9ybWF0fS4KLQotQG5vZGUgQkZEIEVMRiBmdXR1cmUKLUBzdWJzZWN0aW9uIEJGRCBFTEYgZnV0dXJlCi0KLVRoZSBjdXJyZW50IGR5bmFtaWMgbGlua2luZyBzdXBwb3J0IGhhcyB0b28gbXVjaCBjb2RlIGR1cGxpY2F0aW9uLgotV2hpbGUgZWFjaCBwcm9jZXNzb3IgaGFzIHBhcnRpY3VsYXIgZGlmZmVyZW5jZXMsIG11Y2ggb2YgdGhlIGR5bmFtaWMKLWxpbmtpbmcgc3VwcG9ydCBpcyBxdWl0ZSBzaW1pbGFyIGZvciBlYWNoIHByb2Nlc3Nvci4gIFRoZSBHT1QgYW5kIFBMVAotYXJlIGhhbmRsZWQgaW4gZmFpcmx5IHNpbWlsYXIgd2F5cywgdGhlIGRldGFpbHMgb2YgLUJzeW1ib2xpYyBsaW5raW5nCi1hcmUgZ2VuZXJhbGx5IHNpbWlsYXIsIGV0Yy4gIFRoaXMgY29kZSBzaG91bGQgYmUgcmV3b3JrZWQgdG8gdXNlIG1vcmUKLWdlbmVyaWMgZnVuY3Rpb25zLCBlbGltaW5hdGluZyB0aGUgZHVwbGljYXRpb24uCi0KLVNpbWlsYXJseSwgdGhlIHJlbG9jYXRpb24gaGFuZGxpbmcgaGFzIHRvbyBtdWNoIGR1cGxpY2F0aW9uLiAgTWFueSBvZgotdGhlIEBzYW1we3JlbG9jX3R5cGVfbG9va3VwfSBhbmQgQHNhbXB7aW5mb190b19ob3d0b30gZnVuY3Rpb25zIGFyZQotcXVpdGUgc2ltaWxhci4gIFRoZSByZWxvY2F0ZSBzZWN0aW9uIGZ1bmN0aW9ucyBhcmUgYWxzbyBvZnRlbiBxdWl0ZQotc2ltaWxhciwgYm90aCBpbiB0aGUgc3RhbmRhcmQgbGlua2VyIGhhbmRsaW5nIGFuZCB0aGUgZHluYW1pYyBsaW5rZXIKLWhhbmRsaW5nLiAgTWFueSBvZiB0aGUgQ09GRiBwcm9jZXNzb3Igc3BlY2lmaWMgYmFja2VuZHMgc2hhcmUgYSBzaW5nbGUKLXJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb24gKEBzYW1we19iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb259KSwKLWFuZCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcyBmb3IgdGhlIEVMRiB0YXJnZXRzCi1hcyB3ZWxsLgotCi1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIG1hZ2ljIG51bWJlciBpbgotQHNhbXB7cHJlcF9oZWFkZXJzfSBpbiBAZmlsZXtlbGYuY30gaXMgc29tZXdoYXQgYm9ndXMuICBJdCBzaG91bGQgYmUKLXBvc3NpYmxlIHRvIGFkZCBzdXBwb3J0IGZvciBhIG5ldyBwcm9jZXNzb3Igd2l0aG91dCBjaGFuZ2luZyB0aGUgZ2VuZXJpYwotc3VwcG9ydC4KLQotVGhlIHByb2Nlc3NvciBmdW5jdGlvbiBob29rcyBhbmQgY29uc3RhbnRzIGFyZSBhZCBob2MgYW5kIG5lZWQgYmV0dGVyCi1kb2N1bWVudGF0aW9uLgotCi1XaGVuIGEgbGlua2VyIHNjcmlwdCB1c2VzIEBzYW1we1NJWkVPRl9IRUFERVJTfSwgdGhlIEVMRiBiYWNrZW5kIG11c3QKLWd1ZXNzIGF0IHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBzZWdtZW50cyB3aGljaCB3aWxsIGJlIHJlcXVpcmVkLCBpbgotQHNhbXB7Z2V0X3Byb2dyYW1faGVhZGVyX3NpemV9LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBsaW5rZXIgY2FsbHMKLUBzYW1we2JmZF9zaXplb2ZfaGVhZGVyc30gYmVmb3JlIGl0IGtub3dzIGFsbCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgYW5kCi1zaXplcy4gIFRoZSBFTEYgYmFja2VuZCBtYXkgbGF0ZXIgZGlzY292ZXIsIHdoZW4gY3JlYXRpbmcgcHJvZ3JhbQotc2VnbWVudHMsIHRoYXQgbW9yZSBwcm9ncmFtIHNlZ21lbnRzIGFyZSByZXF1aXJlZC4gIFRoaXMgaXMgY3VycmVudGx5Ci1yZXBvcnRlZCBhcyBhbiBlcnJvciBpbiBAc2FtcHthc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzfS4KLQotSW4gcHJhY3RpY2UgdGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gdXNlIEBzYW1we1NJWkVPRl9IRUFERVJTfSBleGNlcHQKLXdpdGggYSBjYXJlZnVsbHkgZGVmaW5lZCBsaW5rZXIgc2NyaXB0LiAgVW5mb3J0dW5hdGVseSwKLUBzYW1we1NJWkVPRl9IRUFERVJTfSBpcyByZXF1aXJlZCBmb3IgZmFzdCBwcm9ncmFtIGxvYWRpbmcgb24gYSBuYXRpdmUKLXN5c3RlbSwgc2luY2UgaXQgcGVybWl0cyB0aGUgaW5pdGlhbCBjb2RlIHNlY3Rpb24gdG8gYXBwZWFyIG9uIHRoZSBzYW1lCi1wYWdlIGFzIHRoZSBwcm9ncmFtIHNlZ21lbnRzLCBzYXZpbmcgYSBwYWdlIHJlYWQgd2hlbiB0aGUgcHJvZ3JhbSBzdGFydHMKLXJ1bm5pbmcuICBGb3J0dW5hdGVseSwgbmF0aXZlIHN5c3RlbXMgcGVybWl0IGNhcmVmdWwgZGVmaW5pdGlvbiBvZiB0aGUKLWxpbmtlciBzY3JpcHQuICBTdGlsbCwgaWRlYWxseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgcmVsYXhhdGlvbiB0bwotY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHByb2dyYW0gc2VnbWVudHMuCi0KLUBub2RlIEJGRCBnbG9zc2FyeQotQHNlY3Rpb24gQkZEIGdsb3NzYXJ5Ci1AY2luZGV4IGdsb3NzYXJ5IGZvciBiZmQKLUBjaW5kZXggYmZkIGdsb3NzYXJ5Ci0KLVRoaXMgaXMgYSBzaG9ydCBnbG9zc2FyeSBvZiBzb21lIEJGRCB0ZXJtcy4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBhLm91dAotVGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZSBvcmlnaW5hbCBVbml4IG9iamVjdCBmaWxlIGZvcm1hdC4KLVN0aWxsIHVzZWQgb24gU3VuT1MsIHRob3VnaCBub3QgU29sYXJpcy4gIFN1cHBvcnRzIG9ubHkgdGhyZWUgc2VjdGlvbnMuCi0KLUBpdGVtIGFyY2hpdmUKLUEgY29sbGVjdGlvbiBvZiBvYmplY3QgZmlsZXMgcHJvZHVjZWQgYW5kIG1hbmlwdWxhdGVkIGJ5IHRoZSBAc2FtcHthcn0KLXByb2dyYW0uCi0KLUBpdGVtIGJhY2tlbmQKLVRoZSBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gQkZEIG9mIGEgcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUKLXNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIGEgcGFydGljdWxhciB0YXJnZXQgdmVjdG9yLgotCi1AaXRlbSBCRkQKLVRoZSBCRkQgbGlicmFyeSBpdHNlbGYuICBBbHNvLCBlYWNoIG9iamVjdCBmaWxlLCBhcmNoaXZlLCBvciBleGVjdGFibGUKLW9wZW5lZCBieSB0aGUgQkZEIGxpYnJhcnkgaGFzIHRoZSB0eXBlIEBzYW1we2JmZCAqfSwgYW5kIGlzIHNvbWV0aW1lcwotcmVmZXJyZWQgdG8gYXMgYSBiZmQuCi0KLUBpdGVtIENPRkYKLVRoZSBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBVbml4IFNWUjMuICBVc2VkIGJ5IHNvbWUKLWVtYmVkZGVkIHRhcmdldHMsIGFsdGhvdWdoIEVMRiBpcyBub3JtYWxseSBiZXR0ZXIuCi0KLUBpdGVtIERMTAotQSBzaGFyZWQgbGlicmFyeSBvbiBXaW5kb3dzLgotCi1AaXRlbSBkeW5hbWljIGxpbmtlcgotV2hlbiBhIHByb2dyYW0gbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSBpcyBydW4sIHRoZSBkeW5hbWljCi1saW5rZXIgd2lsbCBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHNoYXJlZCBsaWJyYXJ5IGFuZCBhcnJhbmdlIHRvIHNvbWVob3cKLWluY2x1ZGUgaXQgaW4gdGhlIHJ1bm5pbmcgaW1hZ2UuCi0KLUBpdGVtIGR5bmFtaWMgb2JqZWN0Ci1Bbm90aGVyIG5hbWUgZm9yIGFuIEVMRiBzaGFyZWQgbGlicmFyeS4KLQotQGl0ZW0gRUNPRkYKLVRoZSBFeHRlbmRlZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBBbHBoYSBEaWdpdGFsIFVuaXgKLShmb3JtZXJseSBPU0YvMSksIGFzIHdlbGwgYXMgVWx0cml4IGFuZCBJcml4IDQuICBBIHZhcmlhbnQgb2YgQ09GRi4KLQotQGl0ZW0gRUxGCi1UaGUgRXhlY3V0YWJsZSBhbmQgTGlua2luZyBGb3JtYXQuICBUaGUgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZWQgb24gbW9zdAotbW9kZXJuIFVuaXggc3lzdGVtcywgaW5jbHVkaW5nIEdOVS9MaW51eCwgU29sYXJpcywgSXJpeCwgYW5kIFNWUjQuICBBbHNvCi11c2VkIG9uIG1hbnkgZW1iZWRkZWQgc3lzdGVtcy4KLQotQGl0ZW0gZXhlY3V0YWJsZQotQSBwcm9ncmFtLCB3aXRoIGluc3RydWN0aW9ucyBhbmQgc3ltYm9scywgYW5kIHBlcmhhcHMgZHluYW1pYyBsaW5raW5nCi1pbmZvcm1hdGlvbi4gIE5vcm1hbGx5IHByb2R1Y2VkIGJ5IGEgbGlua2VyLgotCi1AaXRlbSBMTUEKLUxvYWQgTWVtb3J5IEFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIGEgc2VjdGlvbiB3aWxsIGJlCi1sb2FkZWQuICBDb21wYXJlIHdpdGggVk1BLCBiZWxvdy4KLQotQGl0ZW0gTkxNCi1OZXRXYXJlIExvYWRhYmxlIE1vZHVsZS4gIFVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBhbiBvYmplY3Qgd2hpY2gKLWJlIGxvYWRlZCBpbnRvIE5ldFdhcmUsIHdoaWNoIGlzIHNvbWUga2luZCBvZiBQQyBiYXNlZCBuZXR3b3JrIHNlcnZlcgotcHJvZ3JhbS4KLQotQGl0ZW0gb2JqZWN0IGZpbGUKLUEgYmluYXJ5IGZpbGUgaW5jbHVkaW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbgotaW5mb3JtYXRpb24uICBOb3JtYWxseSBwcm9kdWNlZCBieSBhbiBhc3NlbWJsZXIuCi0KLUBpdGVtIG9iamVjdCBmaWxlIGZvcm1hdAotVGhlIGZvcm1hdCBvZiBhbiBvYmplY3QgZmlsZS4gIFR5cGljYWxseSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzCi1mb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbSBhcmUgaW4gdGhlIHNhbWUgZm9ybWF0LCBhbHRob3VnaCBleGVjdXRhYmxlcwotd2lsbCBub3QgY29udGFpbiBhbnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gUEUKLVRoZSBQb3J0YWJsZSBFeGVjdXRhYmxlIGZvcm1hdC4gIFRoaXMgaXMgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCB1c2VkIGZvcgotV2luZG93cyAoc3BlY2lmaWNhbGx5LCBXaW4zMikgb2JqZWN0IGZpbGVzLiAgSXQgaXMgYmFzZWQgY2xvc2VseSBvbgotQ09GRiwgYnV0IGhhcyBhIGZldyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcy4KLQotQGl0ZW0gUEVJCi1UaGUgUG9ydGFibGUgRXhlY3V0YWJsZSBJbWFnZSBmb3JtYXQuICBUaGlzIGlzIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQKLXVzZWQgZm9yIFdpbmRvd3MgKHNwZWNpZmljYWxseSwgV2luMzIpIGV4ZWN1dGFibGVzLiAgSXQgaXMgdmVyeSBzaW1pbGFyCi10byBQRSwgYnV0IGluY2x1ZGVzIHNvbWUgYWRkaXRpb25hbCBoZWFkZXIgaW5mb3JtYXRpb24uCi0KLUBpdGVtIHJlbG9jYXRpb25zCi1JbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gYWRqdXN0IHNlY3Rpb24gY29udGVudHMuICBBbHNvIGNhbGxlZAotcmVsb2NzLgotCi1AaXRlbSBzZWN0aW9uCi1PYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGUgYXJlIGNvbXBvc2VkIG9mIHNlY3Rpb25zLiAgU2VjdGlvbnMgaGF2ZQotb3B0aW9uYWwgZGF0YSBhbmQgb3B0aW9uYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gc2hhcmVkIGxpYnJhcnkKLUEgbGlicmFyeSBvZiBmdW5jdGlvbnMgd2hpY2ggbWF5IGJlIHVzZWQgYnkgbWFueSBleGVjdXRhYmxlcyB3aXRob3V0Ci1hY3R1YWxseSBiZWluZyBsaW5rZWQgaW50byBlYWNoIGV4ZWN1dGFibGUuICBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQKLWltcGxlbWVudGF0aW9ucyBvZiBzaGFyZWQgbGlicmFyaWVzLCBlYWNoIGhhdmluZyBzbGlnaHRseSBkaWZmZXJlbnQKLWZlYXR1cmVzLgotCi1AaXRlbSBzeW1ib2wKLUVhY2ggb2JqZWN0IGZpbGUgYW5kIGV4ZWN1dGFibGUgbWF5IGhhdmUgYSBsaXN0IG9mIHN5bWJvbHMsIG9mdGVuCi1yZWZlcnJlZCB0byBhcyB0aGUgc3ltYm9sIHRhYmxlLiAgQSBzeW1ib2wgaXMgYmFzaWNhbGx5IGEgbmFtZSBhbmQgYW4KLWFkZHJlc3MuICBUaGVyZSBtYXkgYWxzbyBiZSBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGlrZSB0aGUgdHlwZSBvZgotc3ltYm9sLCBhbHRob3VnaCB0aGUgdHlwZSBvZiBhIHN5bWJvbCBpcyBub3JtYWxseSBzb21ldGhpbmcgc2ltcGxlIGxpa2UKLWZ1bmN0aW9uIG9yIG9iamVjdCwgYW5kIHNob3VsZCBiZSBjb25mdXNlZCB3aXRoIHRoZSBtb3JlIGNvbXBsZXggQwotbm90aW9uIG9mIHR5cGUuICBUeXBpY2FsbHkgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBpbiBhIEMKLXByb2dyYW0gd2lsbCBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sLgotCi1AaXRlbSB0YXJnZXQgdmVjdG9yCi1BIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggaW1wbGVtZW50IHN1cHBvcnQgZm9yIGEgcGFydGljdWxhciBvYmplY3QgZmlsZQotZm9ybWF0LiAgVGhlIEBzYW1we2JmZF90YXJnZXR9IHN0cnVjdHVyZS4KLQotQGl0ZW0gV2luMzIKLVRoZSBjdXJyZW50IFdpbmRvd3MgQVBJLCBpbXBsZW1lbnRlZCBieSBXaW5kb3dzIDk1IGFuZCBsYXRlciBhbmQgV2luZG93cwotTlQgMy41MSBhbmQgbGF0ZXIsIGJ1dCBub3QgYnkgV2luZG93cyAzLjEuCi0KLUBpdGVtIFhDT0ZGCi1UaGUgZVh0ZW5kZWQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdC4gIFVzZWQgb24gQUlYLiAgQSB2YXJpYW50IG9mCi1DT0ZGLCB3aXRoIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc3ltYm9sIHRhYmxlIGltcGxlbWVudGF0aW9uLgotCi1AaXRlbSBWTUEKLVZpcnR1YWwgTWVtb3J5IEFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGEgc2VjdGlvbiB3aWxsIGhhdmUgd2hlbgotYW4gZXhlY3V0YWJsZSBpcyBydW4uICBDb21wYXJlIHdpdGggTE1BLCBhYm92ZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkc2VjIEluZGV4Ci1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2JmZC9kb2MvYmZkc3VtbS50ZXhpIGIvYmZkL2RvYy9iZmRzdW1tLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDUzMWEuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9iZmRzdW1tLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotQGMgVGhpcyBzdW1tYXJ5IG9mIEJGRCBpcyBzaGFyZWQgYnkgdGhlIEJGRCBhbmQgTEQgZG9jcy4KLVdoZW4gYW4gb2JqZWN0IGZpbGUgaXMgb3BlbmVkLCBCRkQgc3Vicm91dGluZXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmUKLXRoZSBmb3JtYXQgb2YgdGhlIGlucHV0IG9iamVjdCBmaWxlLiAgVGhleSB0aGVuIGJ1aWxkIGEgZGVzY3JpcHRvciBpbgotbWVtb3J5IHdpdGggcG9pbnRlcnMgdG8gcm91dGluZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWNjZXNzIGVsZW1lbnRzIG9mCi10aGUgb2JqZWN0IGZpbGUncyBkYXRhIHN0cnVjdHVyZXMuCi0KLUFzIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0aGUgb2JqZWN0IGZpbGVzIGlzIHJlcXVpcmVkLAotQkZEIHJlYWRzIGZyb20gZGlmZmVyZW50IHNlY3Rpb25zIG9mIHRoZSBmaWxlIGFuZCBwcm9jZXNzZXMgdGhlbS4KLUZvciBleGFtcGxlLCBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbiBmb3IgdGhlIGxpbmtlciBpcyBwcm9jZXNzaW5nIHN5bWJvbAotdGFibGVzLiAgRWFjaCBCRkQgYmFjayBlbmQgcHJvdmlkZXMgYSByb3V0aW5lIGZvciBjb252ZXJ0aW5nCi1iZXR3ZWVuIHRoZSBvYmplY3QgZmlsZSdzIHJlcHJlc2VudGF0aW9uIG9mIHN5bWJvbHMgYW5kIGFuIGludGVybmFsCi1jYW5vbmljYWwgZm9ybWF0LiBXaGVuIHRoZSBsaW5rZXIgYXNrcyBmb3IgdGhlIHN5bWJvbCB0YWJsZSBvZiBhbiBvYmplY3QKLWZpbGUsIGl0IGNhbGxzIHRocm91Z2ggYSBtZW1vcnkgcG9pbnRlciB0byB0aGUgcm91dGluZSBmcm9tIHRoZQotcmVsZXZhbnQgQkZEIGJhY2sgZW5kIHdoaWNoIHJlYWRzIGFuZCBjb252ZXJ0cyB0aGUgdGFibGUgaW50byBhIGNhbm9uaWNhbAotZm9ybS4gIFRoZSBsaW5rZXIgdGhlbiBvcGVyYXRlcyB1cG9uIHRoZSBjYW5vbmljYWwgZm9ybS4gV2hlbiB0aGUgbGluayBpcwotZmluaXNoZWQgYW5kIHRoZSBsaW5rZXIgd3JpdGVzIHRoZSBvdXRwdXQgZmlsZSdzIHN5bWJvbCB0YWJsZSwKLWFub3RoZXIgQkZEIGJhY2sgZW5kIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHRha2UgdGhlIG5ld2x5Ci1jcmVhdGVkIHN5bWJvbCB0YWJsZSBhbmQgY29udmVydCBpdCBpbnRvIHRoZSBjaG9zZW4gb3V0cHV0IGZvcm1hdC4KLQotQG1lbnUKLSogQkZEIGluZm9ybWF0aW9uIGxvc3M6OglJbmZvcm1hdGlvbiBMb3NzCi0qIENhbm9uaWNhbCBmb3JtYXQ6OgkJVGhlIEJGRAljYW5vbmljYWwgb2JqZWN0LWZpbGUgZm9ybWF0IAotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBpbmZvcm1hdGlvbiBsb3NzCi1Ac3Vic2VjdGlvbiBJbmZvcm1hdGlvbiBMb3NzCi0KLUBlbXBoe0luZm9ybWF0aW9uIGNhbiBiZSBsb3N0IGR1cmluZyBvdXRwdXQufSBUaGUgb3V0cHV0IGZvcm1hdHMKLXN1cHBvcnRlZCBieSBCRkQgZG8gbm90IHByb3ZpZGUgaWRlbnRpY2FsIGZhY2lsaXRpZXMsIGFuZAotaW5mb3JtYXRpb24gd2hpY2ggY2FuIGJlIGRlc2NyaWJlZCBpbiBvbmUgZm9ybSBoYXMgbm93aGVyZSB0byBnbyBpbgotYW5vdGhlciBmb3JtYXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMgYWxpZ25tZW50IGluZm9ybWF0aW9uIGluCi1AY29kZXtiLm91dH0uIFRoZXJlIGlzIG5vd2hlcmUgaW4gYW4gQGNvZGV7YS5vdXR9IGZvcm1hdCBmaWxlIHRvIHN0b3JlCi1hbGlnbm1lbnQgaW5mb3JtYXRpb24gb24gdGhlIGNvbnRhaW5lZCBkYXRhLCBzbyB3aGVuIGEgZmlsZSBpcyBsaW5rZWQKLWZyb20gQGNvZGV7Yi5vdXR9IGFuZCBhbiBAY29kZXthLm91dH0gaW1hZ2UgaXMgcHJvZHVjZWQsIGFsaWdubWVudAotaW5mb3JtYXRpb24gd2lsbCBub3QgcHJvcGFnYXRlIHRvIHRoZSBvdXRwdXQgZmlsZS4gKFRoZSBsaW5rZXIgd2lsbAotc3RpbGwgdXNlIHRoZSBhbGlnbm1lbnQgaW5mb3JtYXRpb24gaW50ZXJuYWxseSwgc28gdGhlIGxpbmsgaXMgcGVyZm9ybWVkCi1jb3JyZWN0bHkpLgotCi1Bbm90aGVyIGV4YW1wbGUgaXMgQ09GRiBzZWN0aW9uIG5hbWVzLiBDT0ZGIGZpbGVzIG1heSBjb250YWluIGFuCi11bmxpbWl0ZWQgbnVtYmVyIG9mIHNlY3Rpb25zLCBlYWNoIG9uZSB3aXRoIGEgdGV4dHVhbCBzZWN0aW9uIG5hbWUuIElmCi10aGUgdGFyZ2V0IG9mIHRoZSBsaW5rIGlzIGEgZm9ybWF0IHdoaWNoIGRvZXMgbm90IGhhdmUgbWFueSBzZWN0aW9ucyAoZS5nLiwKLUBjb2Rle2Eub3V0fSkgb3IgaGFzIHNlY3Rpb25zIHdpdGhvdXQgbmFtZXMgKGUuZy4sIHRoZSBPYXN5cyBmb3JtYXQpLCB0aGUKLWxpbmsgY2Fubm90IGJlIGRvbmUgc2ltcGx5LiBZb3UgY2FuIGNpcmN1bXZlbnQgdGhpcyBwcm9ibGVtIGJ5Ci1kZXNjcmliaW5nIHRoZSBkZXNpcmVkIGlucHV0LXRvLW91dHB1dCBzZWN0aW9uIG1hcHBpbmcgd2l0aCB0aGUgbGlua2VyIGNvbW1hbmQKLWxhbmd1YWdlLgotCi1AZW1waHtJbmZvcm1hdGlvbiBjYW4gYmUgbG9zdCBkdXJpbmcgY2Fub25pY2FsaXphdGlvbi59IFRoZSBCRkQKLWludGVybmFsIGNhbm9uaWNhbCBmb3JtIG9mIHRoZSBleHRlcm5hbCBmb3JtYXRzIGlzIG5vdCBleGhhdXN0aXZlOyB0aGVyZQotYXJlIHN0cnVjdHVyZXMgaW4gaW5wdXQgZm9ybWF0cyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gZGlyZWN0Ci1yZXByZXNlbnRhdGlvbiBpbnRlcm5hbGx5LiAgVGhpcyBtZWFucyB0aGF0IHRoZSBCRkQgYmFjayBlbmRzCi1jYW5ub3QgbWFpbnRhaW4gYWxsIHBvc3NpYmxlIGRhdGEgcmljaG5lc3MgdGhyb3VnaCB0aGUgdHJhbnNmb3JtYXRpb24KLWJldHdlZW4gZXh0ZXJuYWwgdG8gaW50ZXJuYWwgYW5kIGJhY2sgdG8gZXh0ZXJuYWwgZm9ybWF0cy4KLQotVGhpcyBsaW1pdGF0aW9uIGlzIG9ubHkgYSBwcm9ibGVtIHdoZW4gYW4gYXBwbGljYXRpb24gcmVhZHMgb25lCi1mb3JtYXQgYW5kIHdyaXRlcyBhbm90aGVyLiAgRWFjaCBCRkQgYmFjayBlbmQgaXMgcmVzcG9uc2libGUgZm9yCi1tYWludGFpbmluZyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCB0aGUgaW50ZXJuYWwgQkZECi1jYW5vbmljYWwgZm9ybSBoYXMgc3RydWN0dXJlcyB3aGljaCBhcmUgb3BhcXVlIHRvIHRoZSBCRkQgY29yZSwKLWFuZCBleHBvcnRlZCBvbmx5IHRvIHRoZSBiYWNrIGVuZHMuIFdoZW4gYSBmaWxlIGlzIHJlYWQgaW4gb25lIGZvcm1hdCwKLXRoZSBjYW5vbmljYWwgZm9ybSBpcyBnZW5lcmF0ZWQgZm9yIEJGRCBhbmQgdGhlIGFwcGxpY2F0aW9uLiBBdCB0aGUKLXNhbWUgdGltZSwgdGhlIGJhY2sgZW5kIHNhdmVzIGF3YXkgYW55IGluZm9ybWF0aW9uIHdoaWNoIG1heSBvdGhlcndpc2UKLWJlIGxvc3QuIElmIHRoZSBkYXRhIGlzIHRoZW4gd3JpdHRlbiBiYWNrIGluIHRoZSBzYW1lIGZvcm1hdCwgdGhlIGJhY2sKLWVuZCByb3V0aW5lIHdpbGwgYmUgYWJsZSB0byB1c2UgdGhlIGNhbm9uaWNhbCBmb3JtIHByb3ZpZGVkIGJ5IHRoZQotQkZEIGNvcmUgYXMgd2VsbCBhcyB0aGUgaW5mb3JtYXRpb24gaXQgcHJlcGFyZWQgZWFybGllci4gIFNpbmNlCi10aGVyZSBpcyBhIGdyZWF0IGRlYWwgb2YgY29tbW9uYWxpdHkgYmV0d2VlbiBiYWNrIGVuZHMsCi10aGVyZSBpcyBubyBpbmZvcm1hdGlvbiBsb3N0IHdoZW4KLWxpbmtpbmcgb3IgY29weWluZyBiaWcgZW5kaWFuIENPRkYgdG8gbGl0dGxlIGVuZGlhbiBDT0ZGLCBvciBAY29kZXthLm91dH0gdG8KLUBjb2Rle2Iub3V0fS4gIFdoZW4gYSBtaXh0dXJlIG9mIGZvcm1hdHMgaXMgbGlua2VkLCB0aGUgaW5mb3JtYXRpb24gaXMKLW9ubHkgbG9zdCBmcm9tIHRoZSBmaWxlcyB3aG9zZSBmb3JtYXQgZGlmZmVycyBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KLQotQG5vZGUgQ2Fub25pY2FsIGZvcm1hdAotQHN1YnNlY3Rpb24gVGhlIEJGRCBjYW5vbmljYWwgb2JqZWN0LWZpbGUgZm9ybWF0Ci0KLVRoZSBncmVhdGVzdCBwb3RlbnRpYWwgZm9yIGxvc3Mgb2YgaW5mb3JtYXRpb24gb2NjdXJzIHdoZW4gdGhlcmUgaXMgdGhlIGxlYXN0Ci1vdmVybGFwIGJldHdlZW4gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2UgZm9ybWF0LCB0aGF0Ci1zdG9yZWQgYnkgdGhlIGNhbm9uaWNhbCBmb3JtYXQsIGFuZCB0aGF0IG5lZWRlZCBieSB0aGUKLWRlc3RpbmF0aW9uIGZvcm1hdC4gQSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgY2Fub25pY2FsIGZvcm0gbWF5IGhlbHAKLXlvdSB1bmRlcnN0YW5kIHdoaWNoIGtpbmRzIG9mIGRhdGEgeW91IGNhbiBjb3VudCBvbiBwcmVzZXJ2aW5nIGFjcm9zcwotY29udmVyc2lvbnMuCi1AY2luZGV4IEJGRCBjYW5vbmljYWwgZm9ybWF0Ci1AY2luZGV4IGludGVybmFsIG9iamVjdC1maWxlIGZvcm1hdAotCi1AdGFibGUgQGVtcGgKLUBpdGVtIGZpbGVzCi1JbmZvcm1hdGlvbiBzdG9yZWQgb24gYSBwZXItZmlsZSBiYXNpcyBpbmNsdWRlcyB0YXJnZXQgbWFjaGluZQotYXJjaGl0ZWN0dXJlLCBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIGZvcm1hdCB0eXBlLCBhIGRlbWFuZCBwYWdlYWJsZQotYml0LCBhbmQgYSB3cml0ZSBwcm90ZWN0ZWQgYml0LiAgSW5mb3JtYXRpb24gbGlrZSBVbml4IG1hZ2ljIG51bWJlcnMgaXMKLW5vdCBzdG9yZWQgaGVyZS0tLW9ubHkgdGhlIG1hZ2ljIG51bWJlcnMnIG1lYW5pbmcsIHNvIGEgQGNvZGV7Wk1BR0lDfQotZmlsZSB3b3VsZCBoYXZlIGJvdGggdGhlIGRlbWFuZCBwYWdlYWJsZSBiaXQgYW5kIHRoZSB3cml0ZSBwcm90ZWN0ZWQKLXRleHQgYml0IHNldC4gIFRoZSBieXRlIG9yZGVyIG9mIHRoZSB0YXJnZXQgaXMgc3RvcmVkIG9uIGEgcGVyLWZpbGUKLWJhc2lzLCBzbyB0aGF0IGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gb2JqZWN0IGZpbGVzIG1heSBiZSB1c2VkIHdpdGggb25lCi1hbm90aGVyLgotCi1AaXRlbSBzZWN0aW9ucwotRWFjaCBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uLCB0aGUKLXNlY3Rpb24ncyBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBvYmplY3QgZmlsZSwgc2l6ZSBhbmQgYWxpZ25tZW50Ci1pbmZvcm1hdGlvbiwgdmFyaW91cyBmbGFncywgYW5kIHBvaW50ZXJzIGludG8gb3RoZXIgQkZEIGRhdGEKLXN0cnVjdHVyZXMuCi0KLUBpdGVtIHN5bWJvbHMKLUVhY2ggc3ltYm9sIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBvYmplY3QgZmlsZQotd2hpY2ggb3JpZ2luYWxseSBkZWZpbmVkIGl0LCBpdHMgbmFtZSwgaXRzIHZhbHVlLCBhbmQgdmFyaW91cyBmbGFnCi1iaXRzLiAgV2hlbiBhIEJGRCBiYWNrIGVuZCByZWFkcyBpbiBhIHN5bWJvbCB0YWJsZSwgaXQgcmVsb2NhdGVzIGFsbAotc3ltYm9scyB0byBtYWtlIHRoZW0gcmVsYXRpdmUgdG8gdGhlIGJhc2Ugb2YgdGhlIHNlY3Rpb24gd2hlcmUgdGhleSB3ZXJlCi1kZWZpbmVkLiAgRG9pbmcgdGhpcyBlbnN1cmVzIHRoYXQgZWFjaCBzeW1ib2wgcG9pbnRzIHRvIGl0cyBjb250YWluaW5nCi1zZWN0aW9uLiAgRWFjaCBzeW1ib2wgYWxzbyBoYXMgYSB2YXJ5aW5nIGFtb3VudCBvZiBoaWRkZW4gcHJpdmF0ZSBkYXRhCi1mb3IgdGhlIEJGRCBiYWNrIGVuZC4gIFNpbmNlIHRoZSBzeW1ib2wgcG9pbnRzIHRvIHRoZSBvcmlnaW5hbCBmaWxlLCB0aGUKLXByaXZhdGUgZGF0YSBmb3JtYXQgZm9yIHRoYXQgc3ltYm9sIGlzIGFjY2Vzc2libGUuICBAY29kZXtsZH0gY2FuCi1vcGVyYXRlIG9uIGEgY29sbGVjdGlvbiBvZiBzeW1ib2xzIG9mIHdpbGRseSBkaWZmZXJlbnQgZm9ybWF0cyB3aXRob3V0Ci1wcm9ibGVtcy4KLQotTm9ybWFsIGdsb2JhbCBhbmQgc2ltcGxlIGxvY2FsIHN5bWJvbHMgYXJlIG1haW50YWluZWQgb24gb3V0cHV0LCBzbyBhbgotb3V0cHV0IGZpbGUgKG5vIG1hdHRlciBpdHMgZm9ybWF0KSB3aWxsIHJldGFpbiBzeW1ib2xzIHBvaW50aW5nIHRvCi1mdW5jdGlvbnMgYW5kIHRvIGdsb2JhbCwgc3RhdGljLCBhbmQgY29tbW9uIHZhcmlhYmxlcy4gIFNvbWUgc3ltYm9sCi1pbmZvcm1hdGlvbiBpcyBub3Qgd29ydGggcmV0YWluaW5nOyBpbiBAY29kZXthLm91dH0sIHR5cGUgaW5mb3JtYXRpb24gaXMKLXN0b3JlZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGFzIGxvbmcgc3ltYm9sIG5hbWVzLiAgVGhpcyBpbmZvcm1hdGlvbiB3b3VsZAotYmUgdXNlbGVzcyB0byBtb3N0IENPRkYgZGVidWdnZXJzOyB0aGUgbGlua2VyIGhhcyBjb21tYW5kIGxpbmUgc3dpdGNoZXMKLXRvIGFsbG93IHVzZXJzIHRvIHRocm93IGl0IGF3YXkuCi0KLVRoZXJlIGlzIG9uZSB3b3JkIG9mIHR5cGUgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBzeW1ib2wsIHNvIGlmIHRoZQotZm9ybWF0IHN1cHBvcnRzIHN5bWJvbCB0eXBlIGluZm9ybWF0aW9uIHdpdGhpbiBzeW1ib2xzIChmb3IgZXhhbXBsZSwgQ09GRiwKLUlFRUUsIE9hc3lzKSBhbmQgdGhlIHR5cGUgaXMgc2ltcGxlIGVub3VnaCB0byBmaXQgd2l0aGluIG9uZSB3b3JkCi0obmVhcmx5IGV2ZXJ5dGhpbmcgYnV0IGFnZ3JlZ2F0ZXMpLCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBwcmVzZXJ2ZWQuCi0KLUBpdGVtIHJlbG9jYXRpb24gbGV2ZWwKLUVhY2ggY2Fub25pY2FsIEJGRCByZWxvY2F0aW9uIHJlY29yZCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB0bwotcmVsb2NhdGUgdG8sIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVsb2NhdGUsIHRoZSBzZWN0aW9uIHRoZSBkYXRhCi1pcyBpbiwgYW5kIGEgcG9pbnRlciB0byBhIHJlbG9jYXRpb24gdHlwZSBkZXNjcmlwdG9yLiBSZWxvY2F0aW9uIGlzCi1wZXJmb3JtZWQgYnkgcGFzc2luZyBtZXNzYWdlcyB0aHJvdWdoIHRoZSByZWxvY2F0aW9uIHR5cGUKLWRlc2NyaXB0b3IgYW5kIHRoZSBzeW1ib2wgcG9pbnRlci4gVGhlcmVmb3JlLCByZWxvY2F0aW9ucyBjYW4gYmUgcGVyZm9ybWVkCi1vbiBvdXRwdXQgZGF0YSB1c2luZyBhIHJlbG9jYXRpb24gbWV0aG9kIHRoYXQgaXMgb25seSBhdmFpbGFibGUgaW4gb25lIG9mIHRoZQotaW5wdXQgZm9ybWF0cy4gRm9yIGluc3RhbmNlLCBPYXN5cyBwcm92aWRlcyBhIGJ5dGUgcmVsb2NhdGlvbiBmb3JtYXQuCi1BIHJlbG9jYXRpb24gcmVjb3JkIHJlcXVlc3RpbmcgdGhpcyByZWxvY2F0aW9uIHR5cGUgd291bGQgcG9pbnQKLWluZGlyZWN0bHkgdG8gYSByb3V0aW5lIHRvIHBlcmZvcm0gdGhpcywgc28gdGhlIHJlbG9jYXRpb24gbWF5IGJlCi1wZXJmb3JtZWQgb24gYSBieXRlIGJlaW5nIHdyaXR0ZW4gdG8gYSA2OGsgQ09GRiBmaWxlLCBldmVuIHRob3VnaCA2OGsgQ09GRgotaGFzIG5vIHN1Y2ggcmVsb2NhdGlvbiB0eXBlLgotCi1AaXRlbSBsaW5lIG51bWJlcnMKLU9iamVjdCBmb3JtYXRzIGNhbiBjb250YWluLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBzb21lIGZvcm0gb2YgbWFwcGluZwotYmV0d2VlbiBzeW1ib2xzLCBzb3VyY2UgbGluZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQgZmlsZS4KLVRoZXNlIGFkZHJlc3NlcyBoYXZlIHRvIGJlIHJlbG9jYXRlZCBhbG9uZyB3aXRoIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24uCi1FYWNoIHN5bWJvbCB3aXRoIGFuIGFzc29jaWF0ZWQgbGlzdCBvZiBsaW5lIG51bWJlciByZWNvcmRzIHBvaW50cyB0byB0aGUKLWZpcnN0IHJlY29yZCBvZiB0aGUgbGlzdC4gIFRoZSBoZWFkIG9mIGEgbGluZSBudW1iZXIgbGlzdCBjb25zaXN0cyBvZiBhCi1wb2ludGVyIHRvIHRoZSBzeW1ib2wsIHdoaWNoIGFsbG93cyBmaW5kaW5nIG91dCB0aGUgYWRkcmVzcyBvZiB0aGUKLWZ1bmN0aW9uIHdob3NlIGxpbmUgbnVtYmVyIGlzIGJlaW5nIGRlc2NyaWJlZC4gVGhlIHJlc3Qgb2YgdGhlIGxpc3QgaXMKLW1hZGUgdXAgb2YgcGFpcnM6IG9mZnNldHMgaW50byB0aGUgc2VjdGlvbiBhbmQgbGluZSBudW1iZXJzLiBBbnkgZm9ybWF0Ci13aGljaCBjYW4gc2ltcGx5IGRlcml2ZSB0aGlzIGluZm9ybWF0aW9uIGNhbiBwYXNzIGl0IHN1Y2Nlc3NmdWxseQotYmV0d2VlbiBmb3JtYXRzIChDT0ZGLCBJRUVFIGFuZCBPYXN5cykuCi1AZW5kIHRhYmxlCmRpZmYgLS1naXQgYS9iZmQvZG9jL2NoZXcuYyBiL2JmZC9kb2MvY2hldy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmE2OWMyLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvY2hldy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3OSArMCwwIEBACi0vKiBjaGV3Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgc3RldmUgY2hhbWJlcmxhaW4gQGN5Z251cwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFlldCBhbm90aGVyIHdheSBvZiBleHRyYWN0aW5nIGRvY3VtZW50YXRpb24gZnJvbSBzb3VyY2UuCi0gICBObywgSSBoYXZlbid0IGZpbmlzaGVkIGl0IHlldCwgYnV0IEkgaG9wZSB5b3UgcGVvcGxlIGxpa2UgaXQgYmV0dGVyCi0gICB0aGFuIHRoZSBvbGQgd2F5Ci0gIAotICAgc2FjCi0KLSAgIEJhc2ljYWxseSwgdGhpcyBpcyBhIHNvcnQgb2Ygc3RyaW5nIGZvcnRoLCBtYXliZSB3ZSBzaG91bGQgY2FsbCBpdAotICAgc3RydXRoPwotCi0gICBZb3UgZGVmaW5lIG5ldyB3b3JkcyB0aHVzOgotICAgOiA8bmV3d29yZD4gPG9sZHdvcmRzPiA7Ci0KLSovCi0KLS8qIFByaW1pdGl2ZXMgcHJvdmlkZWQgYnkgdGhlIHByb2dyYW06Ci0KLSAgIFR3byBzdGFja3MgYXJlIHByb3ZpZGVkLCBhIHN0cmluZyBzdGFjayBhbmQgYW4gaW50ZWdlciBzdGFjay4KLQotICAgSW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzOgotCWludGVybmFsX3dhbnRlZCAtIGluZGljYXRlcyB3aGV0aGVyIGAtaScgd2FzIHBhc3NlZAotCWludGVybmFsX21vZGUgLSB1c2VyLXNldHRhYmxlCi0KLSAgIENvbW1hbmRzOgotCXB1c2hfdGV4dAotCSEgLSBwb3AgdG9wIG9mIGludGVnZXIgc3RhY2sgZm9yIGFkZHJlc3MsIHBvcCBuZXh0IGZvciB2YWx1ZTsgc3RvcmUKLQlAIC0gdHJlYXQgdmFsdWUgb24gaW50ZWdlciBzdGFjayBhcyB0aGUgYWRkcmVzcyBvZiBhbiBpbnRlZ2VyOyBwdXNoCi0JCXRoYXQgaW50ZWdlciBvbiB0aGUgaW50ZWdlciBzdGFjayBhZnRlciBwb3BwaW5nIHRoZSAiYWRkcmVzcyIKLQloZWxsbyAtIHByaW50ICJoZWxsb1xuIiB0byBzdGRvdXQKLQlzdGRvdXQgLSBwdXQgc3Rkb3V0IG1hcmtlciBvbiBUT1MKLQlzdGRlcnIgLSBwdXQgc3RkZXJyIG1hcmtlciBvbiBUT1MKLQlwcmludCAtIHByaW50IFRPUy0xIG9uIFRPUyAoZWc6ICJoZWxsb1xuIiBzdGRvdXQgcHJpbnQpCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljYXRzdHIgLSBmbiBpY2F0c3RyCi0JY29weV9wYXN0X25ld2xpbmUgLSBhcHBlbmQgaW5wdXQsIHVwIHRvIGFuZCBpbmNsdWRpbmcgbmV3bGluZSBpbnRvIFRPUwotCWR1cCAtIGZuIG90aGVyX2R1cAotCWRyb3AgLSBkaXNjYXJkIFRPUwotCWlkcm9wIC0gZGl0dG8KLQlyZW1jaGFyIC0gZGVsZXRlIGxhc3QgY2hhcmFjdGVyIGZyb20gVE9TCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlkb19mYW5jeV9zdHVmZiAtIHRyYW5zbGF0ZSA8PGZvbz4+IHRvIEBjb2Rle2Zvb30gaW4gVE9TCi0JYnVsbGV0aXplIC0gaWYgIm8iIGxpbmVzIGZvdW5kLCBwcmVwZW5kIEBpdGVtaXplIEBidWxsZXQgdG8gVE9TCi0JCWFuZCBAaXRlbSB0byBlYWNoICJvIiBsaW5lOyBhcHBlbmQgQGVuZCBpdGVtaXplCi0JY291cmllcml6ZSAtIHB1dCBAZXhhbXBsZSBhcm91bmQgLiBhbmQgfCBsaW5lcywgdHJhbnNsYXRlIHsqICp9IHsgfQotCWV4aXQgLSBmbiBjaGV3X2V4aXQKLQlzd2FwCi0Jb3V0cHV0ZG90cyAtIHN0cmlwIG91dCBsaW5lcyB3aXRob3V0IGxlYWRpbmcgZG90cwotCXBhcmFtc3R1ZmYgLSBjb252ZXJ0IGZ1bGwgZGVjbGFyYXRpb24gaW50byAiUEFSQU1TIiBmb3JtIGlmIG5vdCBhbHJlYWR5Ci0JbWF5YmVjYXRzdHIgLSBkbyBjYXRzdHIgaWYgaW50ZXJuYWxfbW9kZSA9PSBpbnRlcm5hbF93YW50ZWQsIGRpc2NhcmQKLQkJdmFsdWUgaW4gYW55IGNhc2UKLQl0cmFuc2xhdGVjb21tZW50cyAtIHR1cm4geyogYW5kICp9IGludG8gY29tbWVudCBkZWxpbWl0ZXJzCi0Ja2lsbF9ib2d1c19saW5lcyAtIGdldCByaWQgb2YgZXh0cmEgbmV3bGluZXMKLQlpbmRlbnQKLQlpbnRlcm5hbG1vZGUgLSBwb3AgZnJvbSBpbnRlZ2VyIHN0YWNrLCBzZXQgYGludGVybmFsbW9kZScgdG8gdGhhdCB2YWx1ZQotCXByaW50X3N0YWNrX2xldmVsIC0gcHJpbnQgY3VycmVudCBzdGFjayBkZXB0aCB0byBzdGRlcnIKLQlzdHJpcF90cmFpbGluZ19uZXdsaW5lcyAtIGdvIGFoZWFkLCBndWVzcy4uLgotCVtxdW90ZWQgc3RyaW5nXSAtIHB1c2ggc3RyaW5nIG9udG8gc3RyaW5nIHN0YWNrCi0JW3dvcmQgc3RhcnRpbmcgd2l0aCBkaWdpdF0gLSBwdXNoIGF0b2woc3RyKSBvbnRvIGludGVnZXIgc3RhY2sKLQotICAgQSBjb21tYW5kIG11c3QgYmUgYWxsIHVwcGVyLWNhc2UsIGFuZCBhbG9uZSBvbiBhIGxpbmUuCi0KLSAgIEZvby4gICovCi0KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jZGVmaW5lIERFRl9TSVpFIDUwMDAKLSNkZWZpbmUgU1RBQ0sgNTAKLQotaW50IGludGVybmFsX3dhbnRlZDsKLWludCBpbnRlcm5hbF9tb2RlOwotCi1pbnQgd2FybmluZzsKLQotLyogSGVyZSBpcyBhIHN0cmluZyB0eXBlIC4uLiAqLwotCi10eXBlZGVmIHN0cnVjdCBidWZmZXIgCi17Ci0gIGNoYXIgKnB0cjsKLSAgdW5zaWduZWQgbG9uZyB3cml0ZV9pZHg7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLX0gc3RyaW5nX3R5cGU7Ci0KLQotI2lmZGVmIF9fU1REQ19fCi1zdGF0aWMgdm9pZCBpbml0X3N0cmluZ193aXRoX3NpemUgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBpbml0X3N0cmluZyAoc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgaW50IGZpbmQgKHN0cmluZ190eXBlICosIGNoYXIgKik7Ci1zdGF0aWMgdm9pZCB3cml0ZV9idWZmZXIgKHN0cmluZ190eXBlICosIEZJTEUgKik7Ci1zdGF0aWMgdm9pZCBkZWxldGVfc3RyaW5nIChzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyBjaGFyICphZGRyIChzdHJpbmdfdHlwZSAqLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIGNoYXIgYXQgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBjYXRjaGFyIChzdHJpbmdfdHlwZSAqLCBpbnQpOwotc3RhdGljIHZvaWQgb3ZlcndyaXRlX3N0cmluZyAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgdm9pZCBjYXRidWYgKHN0cmluZ190eXBlICosIGNoYXIgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGNhdHRleHQgKHN0cmluZ190eXBlICosIGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBjYXRzdHIgKHN0cmluZ190eXBlICosIHN0cmluZ190eXBlICopOwotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQgREVGVU4oaW5pdF9zdHJpbmdfd2l0aF9zaXplLChidWZmZXIsIHNpemUpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgdW5zaWduZWQgaW50IHNpemUgKQotewotICAgIGJ1ZmZlci0+d3JpdGVfaWR4ID0gMDsKLSAgICBidWZmZXItPnNpemUgPSBzaXplOwotICAgIGJ1ZmZlci0+cHRyID0gbWFsbG9jKHNpemUpOwotfQotCi1zdGF0aWMgdm9pZCBERUZVTihpbml0X3N0cmluZywoYnVmZmVyKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyKQotewotICAgIGluaXRfc3RyaW5nX3dpdGhfc2l6ZShidWZmZXIsIERFRl9TSVpFKTsKLQotfQotCi1zdGF0aWMgaW50IERFRlVOKGZpbmQsIChzdHIsIHdoYXQpLAotCSAgc3RyaW5nX3R5cGUgKnN0ciBBTkQKLQkgIGNoYXIgKndoYXQpCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgY2hhciAqcDsKLSAgICBwID0gd2hhdDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLT53cml0ZV9pZHggJiYgKnA7IGkrKykgCi0gICAgewotCWlmICgqcCA9PSBzdHItPnB0cltpXSkKLQkgcCsrOwotCWVsc2UKLQkgcCA9IHdoYXQ7Ci0gICAgfQotICAgIHJldHVybiAoKnAgPT0gMCk7Ci0gICAgCi19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKHdyaXRlX2J1ZmZlciwoYnVmZmVyLCBmKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIEZJTEUgKmYpCi17Ci0gICAgZndyaXRlKGJ1ZmZlci0+cHRyLCBidWZmZXItPndyaXRlX2lkeCwgMSwgZik7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU4oZGVsZXRlX3N0cmluZywoYnVmZmVyKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyKQotewotICAgIGZyZWUoYnVmZmVyLT5wdHIpOwotfQotCi0KLXN0YXRpYyBjaGFyICpERUZVTihhZGRyLCAoYnVmZmVyLCBpZHgpLAotCSAgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICAgIHJldHVybiBidWZmZXItPnB0ciArIGlkeDsKLX0KLQotc3RhdGljIGNoYXIgREVGVU4oYXQsKGJ1ZmZlciwgcG9zKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIHVuc2lnbmVkIGludCBwb3MpIAotewotICBpZiAocG9zID49IGJ1ZmZlci0+d3JpdGVfaWR4KSAKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGJ1ZmZlci0+cHRyW3Bvc107Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdGNoYXIsKGJ1ZmZlciwgY2gpLCAKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIGludCBjaCkKLXsKLSAgaWYgKGJ1ZmZlci0+d3JpdGVfaWR4ID09IGJ1ZmZlci0+c2l6ZSkgCi0gICAgewotICAgICAgYnVmZmVyLT5zaXplICo9MjsKLSAgICAgIGJ1ZmZlci0+cHRyID0gcmVhbGxvYyhidWZmZXItPnB0ciwgYnVmZmVyLT5zaXplKTsKLSAgICB9Ci0KLSAgYnVmZmVyLT5wdHJbYnVmZmVyLT53cml0ZV9pZHggKysgXSA9IGNoOwotfQotCi0KLXN0YXRpYyB2b2lkIERFRlVOKG92ZXJ3cml0ZV9zdHJpbmcsKGRzdCwgICBzcmMpLAotCSAgIHN0cmluZ190eXBlICpkc3QgQU5ECi0JICAgc3RyaW5nX3R5cGUgKnNyYykKLXsKLSAgICBmcmVlKGRzdC0+cHRyKTsKLSAgICBkc3QtPnNpemUgPSBzcmMtPnNpemU7Ci0gICAgZHN0LT53cml0ZV9pZHggPSBzcmMtPndyaXRlX2lkeDsKLSAgICBkc3QtPnB0ciA9IHNyYy0+cHRyOwotfQotCi1zdGF0aWMgdm9pZCBERUZVTihjYXRidWYsKGJ1ZmZlciwgYnVmLCBsZW4pLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgY2hhciAqYnVmIEFORAotCSAgIHVuc2lnbmVkIGludCBsZW4pCi17Ci0gIGlmIChidWZmZXItPndyaXRlX2lkeCArIGxlbiA+PSBidWZmZXItPnNpemUpCi0gICAgewotICAgICAgd2hpbGUgKGJ1ZmZlci0+d3JpdGVfaWR4ICsgbGVuID49IGJ1ZmZlci0+c2l6ZSkKLQlidWZmZXItPnNpemUgKj0gMjsKLSAgICAgIGJ1ZmZlci0+cHRyID0gcmVhbGxvYyAoYnVmZmVyLT5wdHIsIGJ1ZmZlci0+c2l6ZSk7Ci0gICAgfQotICBtZW1jcHkgKGJ1ZmZlci0+cHRyICsgYnVmZmVyLT53cml0ZV9pZHgsIGJ1ZiwgbGVuKTsKLSAgYnVmZmVyLT53cml0ZV9pZHggKz0gbGVuOwotfQotCi1zdGF0aWMgdm9pZCBERUZVTihjYXR0ZXh0LChidWZmZXIsIHN0cmluZyksCi0JICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKLQkgICBjaGFyICpzdHJpbmcpCi17Ci0gIGNhdGJ1ZiAoYnVmZmVyLCBzdHJpbmcsICh1bnNpZ25lZCBpbnQpIHN0cmxlbiAoc3RyaW5nKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdHN0ciwoZHN0LCBzcmMpLAotCSAgIHN0cmluZ190eXBlICpkc3QgQU5ECi0JICAgc3RyaW5nX3R5cGUgKnNyYykKLXsKLSAgY2F0YnVmIChkc3QsIHNyYy0+cHRyLCBzcmMtPndyaXRlX2lkeCk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCAKLURFRlVOKHNraXBfd2hpdGVfYW5kX3N0YXJzLChzcmMsIGlkeCksCi0gICAgICBzdHJpbmdfdHlwZSAqc3JjIEFORAotICAgICAgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgY2hhciBjOwotICB3aGlsZSAoKGMgPSBhdChzcmMsaWR4KSksCi0JIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjKQotCSB8fCAoYyA9PSAnKicKLQkgICAgIC8qIERvbid0IHNraXAgcGFzdCBlbmQtb2YtY29tbWVudCBvciBzdGFyIGFzIGZpcnN0Ci0JCWNoYXJhY3RlciBvbiBpdHMgbGluZS4gICovCi0JICAgICAmJiBhdChzcmMsaWR4ICsxKSAhPSAnLycKLQkgICAgICYmIGF0KHNyYyxpZHggLTEpICE9ICdcbicpKSAKLSAgICBpZHgrKzsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cmluZ190eXBlIHN0YWNrW1NUQUNLXTsKLXN0cmluZ190eXBlICp0b3M7Ci0KLXVuc2lnbmVkIGludCBpZHggPSAwOyAvKiBQb3MgaW4gaW5wdXQgYnVmZmVyICovCi1zdHJpbmdfdHlwZSAqcHRyOyAvKiBhbmQgdGhlIGJ1ZmZlciAqLwotdHlwZWRlZiB2b2lkICgqc3RpbnN0X3R5cGUpKCk7Ci1zdGluc3RfdHlwZSAqcGM7Ci1zdGluc3RfdHlwZSBzc3RhY2tbU1RBQ0tdOwotc3RpbnN0X3R5cGUgKnNzcCA9ICZzc3RhY2tbMF07Ci1sb25nIGlzdGFja1tTVEFDS107Ci1sb25nICppc3AgPSAmaXN0YWNrWzBdOwotCi10eXBlZGVmIGludCAqd29yZF90eXBlOwotCi0KLQotc3RydWN0IGRpY3Rfc3RydWN0Ci17Ci0gICAgY2hhciAqd29yZDsKLSAgICBzdHJ1Y3QgZGljdF9zdHJ1Y3QgKm5leHQ7Ci0gICAgc3RpbnN0X3R5cGUgKmNvZGU7Ci0gICAgaW50IGNvZGVfbGVuZ3RoOwotICAgIGludCBjb2RlX2VuZDsKLSAgICBpbnQgdmFyOwotICAgIAotfTsKLXR5cGVkZWYgc3RydWN0IGRpY3Rfc3RydWN0IGRpY3RfdHlwZTsKLSNkZWZpbmUgV09SRCh4KSBzdGF0aWMgdm9pZCB4KCkKLQotc3RhdGljIHZvaWQKLWRpZSAobXNnKQotICAgICBjaGFyICptc2c7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBtc2cpOwotICBleGl0ICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3JhbmdlICgpCi17Ci0gIGlmICh0b3MgPCBzdGFjaykKLSAgICBkaWUgKCJ1bmRlcmZsb3cgaW4gc3RyaW5nIHN0YWNrIik7Ci0gIGlmICh0b3MgPj0gc3RhY2sgKyBTVEFDSykKLSAgICBkaWUgKCJvdmVyZmxvdyBpbiBzdHJpbmcgc3RhY2siKTsKLX0KLQotc3RhdGljIHZvaWQKLWljaGVja19yYW5nZSAoKQotewotICBpZiAoaXNwIDwgaXN0YWNrKQotICAgIGRpZSAoInVuZGVyZmxvdyBpbiBpbnRlZ2VyIHN0YWNrIik7Ci0gIGlmIChpc3AgPj0gaXN0YWNrICsgU1RBQ0spCi0gICAgZGllICgib3ZlcmZsb3cgaW4gaW50ZWdlciBzdGFjayIpOwotfQotCi0jaWZkZWYgX19TVERDX18KLXN0YXRpYyB2b2lkIGV4ZWMgKGRpY3RfdHlwZSAqKTsKLXN0YXRpYyB2b2lkIGNhbGwgKHZvaWQpOwotc3RhdGljIHZvaWQgcmVtY2hhciAodm9pZCksIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzICh2b2lkKSwgcHVzaF9udW1iZXIgKHZvaWQpOwotc3RhdGljIHZvaWQgcHVzaF90ZXh0ICh2b2lkKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9ub25jb21tZW50cyAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGFja19sZXZlbCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBwYXJhbXN0dWZmICh2b2lkKSwgdHJhbnNsYXRlY29tbWVudHMgKHZvaWQpOwotc3RhdGljIHZvaWQgb3V0cHV0ZG90cyAodm9pZCksIGNvdXJpZXJpemUgKHZvaWQpLCBidWxsZXRpemUgKHZvaWQpOwotc3RhdGljIHZvaWQgZG9fZmFuY3lfc3R1ZmYgKHZvaWQpOwotc3RhdGljIGludCBpc2NvbW1hbmQgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgaW50IGNvcHlfcGFzdF9uZXdsaW5lIChzdHJpbmdfdHlwZSAqLCB1bnNpZ25lZCBpbnQsIHN0cmluZ190eXBlICopOwotc3RhdGljIHZvaWQgaWNvcHlfcGFzdF9uZXdsaW5lICh2b2lkKSwga2lsbF9ib2d1c19saW5lcyAodm9pZCksIGluZGVudCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBnZXRfc3R1ZmZfaW5fY29tbWFuZCAodm9pZCksIHN3YXAgKHZvaWQpLCBvdGhlcl9kdXAgKHZvaWQpOwotc3RhdGljIHZvaWQgZHJvcCAodm9pZCksIGlkcm9wICh2b2lkKTsKLXN0YXRpYyB2b2lkIGljYXRzdHIgKHZvaWQpLCBza2lwX3Bhc3RfbmV3bGluZSAodm9pZCksIGludGVybmFsbW9kZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBtYXliZWNhdHN0ciAodm9pZCk7Ci1zdGF0aWMgY2hhciAqbmV4dHdvcmQgKGNoYXIgKiwgY2hhciAqKik7Ci1kaWN0X3R5cGUgKmxvb2t1cF93b3JkIChjaGFyICopOwotc3RhdGljIHZvaWQgcGVyZm9ybSAodm9pZCk7Ci1kaWN0X3R5cGUgKm5ld2VudHJ5IChjaGFyICopOwotdW5zaWduZWQgaW50IGFkZF90b19kZWZpbml0aW9uIChkaWN0X3R5cGUgKiwgc3RpbnN0X3R5cGUpOwotdm9pZCBhZGRfaW50cmluc2ljIChjaGFyICosIHZvaWQgKCopKCkpOwotdm9pZCBhZGRfdmFyIChjaGFyICopOwotdm9pZCBjb21waWxlIChjaGFyICopOwotc3RhdGljIHZvaWQgYmFuZyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBhdHNpZ24gKHZvaWQpOwotc3RhdGljIHZvaWQgaGVsbG8gKHZvaWQpOwotc3RhdGljIHZvaWQgc3Rkb3V0XyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBzdGRlcnJfICh2b2lkKTsKLXN0YXRpYyB2b2lkIHByaW50ICh2b2lkKTsKLXN0YXRpYyB2b2lkIHJlYWRfaW4gKHN0cmluZ190eXBlICosIEZJTEUgKik7Ci1zdGF0aWMgdm9pZCB1c2FnZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBjaGV3X2V4aXQgKHZvaWQpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIERFRlVOKGV4ZWMsKHdvcmQpLAotCQkgIGRpY3RfdHlwZSAqd29yZCkKLXsKLSAgcGMgPSB3b3JkLT5jb2RlOwotICB3aGlsZSAoKnBjKSAKLSAgICAoKnBjKSgpOwotfQotV09SRChjYWxsKQotewotICAgIHN0aW5zdF90eXBlICpvbGRwYyA9IHBjOwotICAgIGRpY3RfdHlwZSAqZTsKLSAgICBlID0gIChkaWN0X3R5cGUgKikocGMgWzFdKTsKLSAgICBleGVjKGUpOwotICAgIHBjID0gb2xkcGMgKyAyOwotICAgIAotfQotCi1XT1JEKHJlbWNoYXIpCi17Ci0gIGlmICh0b3MtPndyaXRlX2lkeCkKLSAgICB0b3MtPndyaXRlX2lkeC0tOyAgICAKLSAgcGMrKzsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzICgpCi17Ci0gIHdoaWxlICgoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGF0ICh0b3MsIHRvcy0+d3JpdGVfaWR4IC0gMSkpCi0JICB8fCBhdCAodG9zLCB0b3MtPndyaXRlX2lkeCAtIDEpID09ICdcbicpCi0JICYmIHRvcy0+d3JpdGVfaWR4ID4gMCkKLSAgICB0b3MtPndyaXRlX2lkeC0tOwotICBwYysrOwotfQotCi1XT1JEKHB1c2hfbnVtYmVyKQotewotICAgIGlzcCsrOwotICAgIGljaGVja19yYW5nZSAoKTsKLSAgICBwYysrOwotICAgICppc3AgPSAobG9uZykoKnBjKTsKLSAgICBwYysrOwotfQotCi1XT1JEKHB1c2hfdGV4dCkKLXsKLSAgICB0b3MrKzsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBpbml0X3N0cmluZyh0b3MpOwotICAgIHBjKys7Ci0gICAgY2F0dGV4dCh0b3MsKigoY2hhciAqKilwYykpOwotICAgIHBjKys7Ci0gICAgCi19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGV2ZXJ5dGhpbmcgbm90IGluc2lkZSBjb21tZW50cyBzdGFydGluZyBvbgotICAgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIGxpbmUgZnJvbSB0aGUgIHN0cmluZywgYWxzbyB3aGVuIGNvcHlpbmcKLSAgIGNvbW1lbnRzLCByZW1vdmVzIGJsYW5rIHNwYWNlIGFuZCBsZWFkaW5nIConcy4KLSAgIEJsYW5rIGxpbmVzIGFyZSB0dXJuZWQgaW50byBvbmUgYmxhbmsgbGluZS4gICovCi0KLXN0YXRpYyB2b2lkIAotREVGVU4ocmVtb3ZlX25vbmNvbW1lbnRzLChzcmMsZHN0KSwKLQkgICBzdHJpbmdfdHlwZSAqc3JjIEFORAotCSAgIHN0cmluZ190eXBlICpkc3QpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHNyYyxpZHgpKSAKLSAgICB7Ci0JLyogTm93IHNlZSBpZiB3ZSBoYXZlIGEgY29tbWVudCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgKi8KLQlpZiAoYXQoc3JjLGlkeCkgPT0gJ1xuJyAKLQkgICAgJiYgYXQoc3JjLGlkeCsxKSA9PSAgJy8nIAotCSAgICAmJiBhdChzcmMsaWR4KzIpID09ICcqJykgCi0JewotCSAgICBpZHgrPTM7Ci0JICAgIAotCSAgICBpZHggPSBza2lwX3doaXRlX2FuZF9zdGFycyhzcmMsaWR4KTsKLQotCSAgICAvKiBSZW1vdmUgbGVhZGluZyBkb3QgKi8KLQkgICAgaWYgKGF0KHNyYywgaWR4KSA9PSAnLicpCi0JICAgICBpZHgrKzsKLQkgICAgCi0JICAgIC8qIENvcHkgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgb3IgdGlsbCB0aGUgZW5kIG9mIHRoZQotCSAgICAgICBjb21tZW50ICovCi0JICAgIHdoaWxlIChhdChzcmMsIGlkeCkpCi0JICAgIHsKLQkJaWYgKGF0KHNyYywgaWR4KSA9PSAnXG4nKSAKLQkJewotCQkgICAgLyogZW5kIG9mIGxpbmUsIGVjaG8gYW5kIHNjcmFwZSBvZiBsZWFkaW5nIGJsYW5rcyAgKi8KLQkJICAgIGlmIChhdChzcmMsaWR4ICsxKSA9PSAnXG4nKQotCQkgICAgIGNhdGNoYXIoZHN0LCdcbicpOwotCQkgICAgY2F0Y2hhcihkc3QsJ1xuJyk7Ci0JCSAgICBpZHgrKzsKLQkJICAgIGlkeCA9ICAgc2tpcF93aGl0ZV9hbmRfc3RhcnMoc3JjLCBpZHgpOwotCQl9Ci0JCWVsc2UgaWYgKGF0KHNyYywgaWR4KSA9PSAnKicgJiYgYXQoc3JjLGlkeCsxKSA9PSAnLycpIAotCQl7Ci0JCSAgICBpZHggKz0yIDsKLQkJICAgIGNhdHRleHQoZHN0LCJcbkVOREREXG4iKTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWVsc2UgCi0JCXsKLQkJICAgIGNhdGNoYXIoZHN0LCBhdChzcmMsIGlkeCkpOwotCQkgICAgaWR4Kys7Ci0JCX0KLQkgICAgfQotCX0KLQllbHNlIGlkeCsrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N0YWNrX2xldmVsICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImN1cnJlbnQgc3RyaW5nIHN0YWNrIGRlcHRoID0gJWQsICIsIHRvcyAtIHN0YWNrKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiY3VycmVudCBpbnRlZ2VyIHN0YWNrIGRlcHRoID0gJWRcbiIsIGlzcCAtIGlzdGFjayk7Ci0gIHBjKys7Ci19Ci0KLS8qIHR1cm46Ci0gICAgIGZvb2JhciBuYW1lKHN0dWZmKTsKLSAgIGludG86Ci0gICAgIGZvb2JhcgotICAgICBuYW1lIFBBUkFNUyAoKHN0dWZmKSk7Ci0gICBhbmQgYSBibGFuayBsaW5lLgotICovCi0KLXN0YXRpYyB2b2lkCi1ERUZVTl9WT0lEKHBhcmFtc3R1ZmYpCi17Ci0gICAgdW5zaWduZWQgaW50IG9wZW5wOwotICAgIHVuc2lnbmVkIGludCBmbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgaWR4OwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLQotICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGl0J3Mgbm90IGFscmVhZHkgcGFyYW0nZCBvciBwcm90bydkICovCi0gICAgaWYoZmluZCh0b3MsIlBBUkFNUyIpIHx8IGZpbmQodG9zLCJQUk9UTyIpIHx8ICFmaW5kKHRvcywiKCIpKSB7Ci0JICAgIGNhdHN0cigmb3V0LHRvcyk7Ci0JfQotICAgIGVsc2UgCi0gICAgewotCS8qIEZpbmQgdGhlIG9wZW4gcGFyZW4gKi8KLQlmb3IgKG9wZW5wID0gMDsgYXQodG9zLCBvcGVucCkgIT0gJygnICAmJiBhdCh0b3Msb3BlbnApOyBvcGVucCsrKQotCSA7Ci0KLQlmbmFtZSA9IG9wZW5wOwotCS8qIFN0ZXAgYmFjayB0byB0aGUgZm5hbWUgKi8KLQlmbmFtZS0tOwotCXdoaWxlIChmbmFtZSAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsIGZuYW1lKSkpCi0JIGZuYW1lIC0tOwotCXdoaWxlIChmbmFtZQotCSAgICAgICAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGZuYW1lKSkKLQkgICAgICAgJiYgYXQodG9zLGZuYW1lKSAhPSAnKicpCi0JIGZuYW1lLS07Ci0KLQlmbmFtZSsrOwotCQotCWZvciAoaWR4ID0gMDsgaWR4IDwgZm5hbWU7IGlkeCsrKSAJLyogT3V0cHV0IHR5cGUgKi8KLQl7Ci0JICAgIGNhdGNoYXIoJm91dCwgYXQodG9zLGlkeCkpOwotCX0KLSAgICAKLSAgICAgICAgY2F0dGV4dCgmb3V0LCAiXG4iKTsJLyogSW5zZXJ0IGEgbmV3bGluZSBiZXR3ZWVuIHR5cGUgYW5kIGZubmFtZSAqLwotCi0JZm9yIChpZHggPSBmbmFtZTsgaWR4IDwgb3BlbnA7IGlkeCsrKSAJCS8qIE91dHB1dCBmbm5hbWUgKi8KLQl7Ci0JICAgIGNhdGNoYXIoJm91dCwgYXQodG9zLGlkeCkpOwotCX0KLQotCWNhdHRleHQoJm91dCwiIFBBUkFNUyAoIik7Ci0KLQl3aGlsZSAoYXQodG9zLGlkeCkgJiYgYXQodG9zLGlkeCkgIT0nOycpIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0JY2F0dGV4dCgmb3V0LCIpO1xuXG4iKTsKLSAgICB9Ci0gICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOyAgICAKLSAgICBwYysrOwotICAgIAotfQotCi0KLQotLyogdHVybiB7KgotICAgYW5kICp9IGludG8gY29tbWVudHMgKi8KLQotV09SRCh0cmFuc2xhdGVjb21tZW50cykKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsaWR4KSA9PSAneycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCi0JewotCSAgICBjYXR0ZXh0KCZvdXQsIi8qIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOwotCSAgICBpZHgrPTI7Ci0JfQotCWVsc2UgIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQotCi0KLSAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7Ci0gICAgCi0gICAgcGMrKzsKLSAgICAKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi0vKiB0dXJuIGV2ZXJ5dGhpbmcgbm90IHN0YXJ0aW5nIHdpdGggYSAuIGludG8gYSBjb21tZW50ICovCi0KLVdPUkQobWFuZ2xlY29tbWVudHMpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIAotICAgIHdoaWxlIChhdCh0b3MsIGlkeCkpIAotICAgIHsKLQlpZiAoYXQodG9zLGlkeCkgPT0gJ1xuJyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKLQl7Ci0JICAgIGNhdHRleHQoJm91dCwiCS8qIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOwotCSAgICBpZHgrPTI7Ci0JfQotCWVsc2UgIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQotCi0KLSAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7Ci0gICAgCi0gICAgcGMrKzsKLSAgICAKLX0KLQotI2VuZGlmCi0KLS8qIE1vZCB0b3Mgc28gdGhhdCBvbmx5IGxpbmVzIHdpdGggbGVhZGluZyBkb3RzIHJlbWFpbiAqLwotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQob3V0cHV0ZG90cykKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsIGlkeCkgPT0gJ1xuJyAmJiBhdCh0b3MsIGlkeCsxKSA9PSAnLicpIAotCXsKLQkgIGNoYXIgYzsKLQkgIGlkeCArPSAyOwotCSAgICAKLQkgICAgd2hpbGUgKChjID0gYXQodG9zLCBpZHgpKSAmJiBjICE9ICdcbicpCi0JICAgIHsKLQkgICAgICBpZiAoYyA9PSAneycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwiIC8qIik7Ci0JCSAgICBpZHgrPTI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChjID09ICcqJyAmJiBhdCh0b3MsaWR4KzEpID09J30nKSAKLQkJewotCQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOwotCQkgICAgaWR4Kz0yOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgICBjYXRjaGFyKCZvdXQsIGMpOwotCQkgICAgaWR4Kys7Ci0JCX0KLQkgICAgfQotCSAgICBjYXRjaGFyKCZvdXQsJ1xuJyk7Ci0JfQotCWVsc2UgCi0JewotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQkKLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICBwYysrOwotICAgIAotfQotCi0vKiBGaW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggLiBhbmQgfCBhbmQgcHV0IGV4YW1wbGUgYXJvdW5kIHRoZW0gb24gdG9zICovCi1XT1JEKGNvdXJpZXJpemUpCi17Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIGludCBjb21tYW5kID0gMDsKLSAgICAKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nIAotCSAgICAmJiAoYXQodG9zLCBpZHggKzEgKSA9PSAnLicKLQkJfHwgYXQodG9zLGlkeCsxKSA9PSAnfCcpKSAKLQl7Ci0JICAgIGNhdHRleHQoJm91dCwiXG5AZXhhbXBsZVxuIik7Ci0JICAgIGRvIAotCSAgICB7Ci0JCWlkeCArPSAyOwotCQkKLQkJd2hpbGUgKGF0KHRvcywgaWR4KSAmJiBhdCh0b3MsIGlkeCkhPSdcbicpCi0JCXsKLQkJICAgIGlmIChhdCh0b3MsaWR4KT09J3snICYmIGF0KHRvcyxpZHgrMSkgPT0nKicpIAotCQkgICAgewotCQkJY2F0dGV4dCgmb3V0LCIgLyoiKTsKLQkJCWlkeCs9MjsKLQkJICAgIH0KLQkJICAgIGVsc2UgaWYgKGF0KHRvcyxpZHgpPT0nKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIiovIik7Ci0JCQlpZHgrPTI7Ci0JCSAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJ3snICYmICFjb21tYW5kKQotCQkgICAgewotCQkJY2F0dGV4dCgmb3V0LCJAeyIpOwotCQkJaWR4Kys7Ci0JCSAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJ30nICYmICFjb21tYW5kKQotCQkgICAgewotCQkJY2F0dGV4dCgmb3V0LCJAfSIpOwotCQkJaWR4Kys7Ci0JCSAgICB9Ci0JCSAgICBlbHNlIAotCQkgICAgewotCQkJaWYgKGF0KHRvcyxpZHgpID09ICdAJykKLQkJCSAgICBjb21tYW5kID0gMTsKLQkJCWVsc2UgaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcyxpZHgpKQotCQkJCSB8fCBhdCh0b3MsaWR4KSA9PSAnfScpCi0JCQkgICAgY29tbWFuZCA9IDA7Ci0JCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JCQlpZHgrKzsKLQkJICAgIH0KLQkJICAgIAotCQl9Ci0JCWNhdGNoYXIoJm91dCwnXG4nKTsKLQkgICAgfSAgCi0JICAgIHdoaWxlIChhdCh0b3MsIGlkeCkgPT0gJ1xuJyAKLQkJICAgJiYgKChhdCh0b3MsIGlkeCsxKSA9PSAnLicpCi0JCSAgICAgICB8fCAoYXQodG9zLGlkeCsxKSA9PSAnfCcpKSkKLQkgICAgICA7Ci0JICAgIGNhdHRleHQoJm91dCwiQGVuZCBleGFtcGxlIik7Ci0JfQotCWVsc2UgCi0JeyAgICAKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfSAgICAKLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICBwYysrOwotCi0gICAgCi19Ci0KLS8qIEZpbmRzIGFueSBsaW5lcyBzdGFydGluZyB3aXRoICJvICIsIGlmIHRoZXJlIGFyZSBhbnksIHRoZW4gdHVybnMKLSAgIG9uIEBpdGVtaXplIEBidWxsZXQsIGFuZCBAaXRlbXMgZWFjaCBvZiB0aGVtLiBUaGVuIGVuZHMgd2l0aCBAZW5kCi0gICBpdGVtaXplLCBpbnBsYWNlIGF0IFRPUyovCi0KLQotV09SRChidWxsZXRpemUpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgaW50IG9uID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgewotCWlmIChhdCh0b3MsIGlkeCkgPT0gJ0AnICYmCi0JICAgIGF0KHRvcywgaWR4KzEpID09ICcqJykgCi0JewotCSAgY2F0dGV4dCgmb3V0LCIqIik7Ci0JICBpZHgrPTI7Ci0JfQotCQotCWVsc2UKLQkgICAgaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nICYmCi0JCWF0KHRvcywgaWR4KzEpID09ICdvJyAmJgotCQlpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsIGlkeCArMikpKQotCSAgICB7Ci0JCWlmICghb24pIAotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsIlxuQGl0ZW1pemUgQGJ1bGxldFxuIik7Ci0JCSAgICBvbiA9IDE7Ci0JCSAgICAKLQkJfQotCQljYXR0ZXh0KCZvdXQsIlxuQGl0ZW1cbiIpOwotCQlpZHgrPTM7Ci0JICAgIH0KLQkgICAgZWxzZSAKLQkgICAgewotCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JCWlmIChvbiAmJiBhdCh0b3MsIGlkeCkgPT0gJ1xuJyAmJgotCQkgICAgYXQodG9zLCBpZHgrMSkgPT0gJ1xuJyAmJgotCQkgICAgYXQodG9zLCBpZHgrMikgIT0gJ28nKQotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsICJAZW5kIGl0ZW1pemUiKTsKLQkJICAgIG9uID0gMDsKLQkJfQotCQlpZHgrKzsKLQkJCi0JICAgIH0KLQl9Ci0gICAgaWYgKG9uKSAKLSAgICB7Ci0JY2F0dGV4dCgmb3V0LCJAZW5kIGl0ZW1pemVcbiIpOwotICAgIH0JCi0KLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgKnRvcyA9IG91dDsKLSAgICBwYysrOwotICAgIAotfQotCi0vKiBUdXJuIDw8Zm9vPj4gaW50byBAY29kZXtmb299IGluIHBsYWNlIGF0IFRPUyovCi0gICAKLQotV09SRChkb19mYW5jeV9zdHVmZikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsIGlkeCkgPT0gJzwnIAotCSAgICAmJiBhdCh0b3MsIGlkeCsxKSA9PSAnPCcKLQkgICAgJiYgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcyxpZHggKyAyKSkpIAotCXsKLQkgICAgLyogVGhpcyBxdWFsaWZpZXMgYXMgYSA8PCBzdGFydHVwICovCi0JICAgIGlkeCArPTI7Ci0JICAgIGNhdHRleHQoJm91dCwiQGNvZGV7Iik7Ci0JICAgIHdoaWxlKGF0KHRvcyxpZHgpICYmCi0JCSAgYXQodG9zLGlkeCkgIT0gJz4nICkKLQkgICAgewotCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JCWlkeCsrOwotCQkKLQkgICAgfQotCSAgICBjYXR0ZXh0KCZvdXQsIn0iKTsKLQkgICAgaWR4Kz0yOwotCX0KLQllbHNlIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQotICAgIGRlbGV0ZV9zdHJpbmcodG9zKTsKLSAgICAqdG9zID0gb3V0OwotICAgIHBjKys7Ci0gICAgCi19Ci0vKiBBIGNvbW1hbmQgaXMgYWxsIHVwcGVyIGNhc2UsYW5kIGFsb25lIG9uIGEgbGluZSAqLwotc3RhdGljIGludCAKLURFRlVOKCBpc2NvbW1hbmQsKHB0ciwgaWR4KSwKLSAgICAgIHN0cmluZ190eXBlICpwdHIgQU5ECi0gICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICAgIHVuc2lnbmVkIGludCBsZW4gPSAwOwotICAgIHdoaWxlIChhdChwdHIsaWR4KSkgewotCSAgICBpZiAoaXN1cHBlcigodW5zaWduZWQgY2hhcikgYXQocHRyLGlkeCkpIHx8IGF0KHB0cixpZHgpID09ICcgJyB8fAotCQlhdChwdHIsaWR4KSA9PSAnXycpIAotCSAgICB7Ci0JICAgICBsZW4rKzsKLQkgICAgIGlkeCsrOwotCSB9Ci0JICAgIGVsc2UgaWYoYXQocHRyLGlkeCkgPT0gJ1xuJykKLQkgICAgewotCQlpZiAobGVuID4gMykgcmV0dXJuIDE7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JICAgIGVsc2UgcmV0dXJuIDA7Ci0JfQotICAgIHJldHVybiAwOwotCi19Ci0KLQotc3RhdGljIGludAotREVGVU4oY29weV9wYXN0X25ld2xpbmUsKHB0ciwgaWR4LCBkc3QpLAotICAgICAgc3RyaW5nX3R5cGUgKnB0ciBBTkQKLSAgICAgIHVuc2lnbmVkIGludCBpZHggQU5ECi0gICAgICBzdHJpbmdfdHlwZSAqZHN0KQotewotICAgIGludCBjb2x1bW4gPSAwOwotCi0gICAgd2hpbGUgKGF0KHB0ciwgaWR4KSAmJiBhdChwdHIsIGlkeCkgIT0gJ1xuJykgCi0gICAgewotCWlmIChhdCAocHRyLCBpZHgpID09ICdcdCcpCi0JICB7Ci0JICAgIC8qIEV4cGFuZCB0YWJzLiAgTmVpdGhlciBtYWtlaW5mbyBub3IgVGVYIGNhbiBjb3BlIHdlbGwgd2l0aAotCSAgICAgICB0aGVtLiAgKi8KLQkgICAgZG8KLQkgICAgICBjYXRjaGFyIChkc3QsICcgJyk7Ci0JICAgIHdoaWxlICgrK2NvbHVtbiAmIDcpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgY2F0Y2hhcihkc3QsIGF0KHB0ciwgaWR4KSk7Ci0JICAgIGNvbHVtbisrOwotCSAgfQotCWlkeCsrOwotCQotICAgIH0gICAgCi0gICAgY2F0Y2hhcihkc3QsIGF0KHB0ciwgaWR4KSk7Ci0gICAgaWR4Kys7Ci0gICAgcmV0dXJuIGlkeDsKLQotfQotCi1XT1JEKGljb3B5X3Bhc3RfbmV3bGluZSkKLXsKLSAgICB0b3MrKzsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBpbml0X3N0cmluZyh0b3MpOwotICAgIGlkeCA9IGNvcHlfcGFzdF9uZXdsaW5lKHB0ciwgaWR4LCB0b3MpOwotICAgIHBjKys7CQotfQotCi0vKiBpbmRlbnQKLSAgIFRha2UgdGhlIHN0cmluZyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywgZG8gc29tZSBwcmV0dHlpbmcgKi8KLQotCi1XT1JEKGtpbGxfYm9ndXNfbGluZXMpCi17Ci0gICAgaW50IHNsIDsKLSAgICAKLSAgICBpbnQgaWR4ID0gMDsKLSAgICBpbnQgYzsKLSAgICBpbnQgZG90ID0gMCAgICA7Ci0gICAgCi0gICAgc3RyaW5nX3R5cGUgb3V0OyAgICAKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAvKiBEcm9wIGxlYWRpbmcgbmwgKi8KLSAgICB3aGlsZSAoYXQodG9zLGlkeCkgPT0gJ1xuJykKLSAgICB7Ci0JaWR4Kys7Ci0gICAgfQotICAgIGMgPSBpZHg7Ci0gICAgCi0gICAgLyogSWYgdGhlIGZpcnN0IGNoYXIgaXMgYSAnLicgcHJlcGVuZCBhIG5ld2xpbmUgc28gdGhhdCBpdCBpcwotICAgICAgIHJlY29nbml6ZWQgcHJvcGVybHkgbGF0ZXIuICAqLwotICAgIGlmIChhdCAodG9zLCBpZHgpID09ICcuJykKLSAgICAgIGNhdGNoYXIgKCZvdXQsICdcbicpOwotCi0gICAgLyogRmluZCB0aGUgbGFzdCBjaGFyICovCi0gICAgd2hpbGUgKGF0KHRvcyxpZHgpKQotICAgIHsKLQlpZHgrKzsKLSAgICB9Ci0gICAgCi0gICAgLyogZmluZCB0aGUgbGFzdCBub24gd2hpdGUgYmVmb3JlIHRoZSBubCAqLwotICAgIGlkeC0tOwotICAgIAotICAgIHdoaWxlIChpZHggJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCkpKQotICAgICBpZHgtLTsKLSAgICBpZHgrKzsKLSAgICAKLSAgICAvKiBDb3B5IGJ1ZmZlciB1cHRvIGxhc3QgY2hhciwgYnV0IGJsYW5rIGxpbmVzIGJlZm9yZSBhbmQgYWZ0ZXIKLSAgICAgICBkb3RzIGRvbid0IGNvdW50ICovCi0gICAgc2wgPSAxOwotCi0gICAgd2hpbGUgKGMgPCBpZHgpCi0gICAgewotCWlmIChhdCh0b3MsYykgPT0gJ1xuJyAKLQkgICAgJiYgYXQodG9zLGMrMSkgPT0gJ1xuJwotCSAgICAmJiBhdCh0b3MsYysyKSA9PSAnLicpIAotCXsKLQkgICAgLyogSWdub3JlIHR3byBuZXdsaW5lcyBiZWZvcmUgYSBkb3QqLwotCSAgICBjKys7Ci0JfQotCWVsc2UgaWYgKGF0KHRvcyxjKSA9PSAnLicgJiYgc2wpCi0JewotCSAgICAvKiByZW1lbWJlciB0aGF0IHRoaXMgbGluZSBzdGFydGVkIHdpdGggYSBkb3QgKi8KLQkgICAgZG90PTI7Ci0JfQotCWVsc2UgaWYgKGF0KHRvcyxjKSA9PSAnXG4nIAotCQkgJiYgYXQodG9zLGMrMSkgPT0gJ1xuJwotCQkgJiYgZG90KQotCXsKLQkgICAgYysrOwotCSAgICAvKiBJZ25vcmUgdHdvIG5ld2xpbmVzIHdoZW4gbGFzdCBsaW5lIHdhcyBkb3QgKi8KLQl9Ci0KLQljYXRjaGFyKCZvdXQsIGF0KHRvcyxjKSk7Ci0JaWYgKGF0KHRvcyxjKSA9PSAnXG4nKQotCXsKLQkgICAgc2wgPSAxOwotCSAgICAKLQkgICAgaWYgKGRvdCA9PSAyKWRvdD0xO2Vsc2UgZG90ID0gMDsKLQl9Ci0JZWxzZQotCSAgc2wgPSAwOwotCQotCWMrKzsJCi0KLSAgICB9Ci0gICAgCi0gICAgLyogQXBwZW5kIG5sKi8KLSAgICBjYXRjaGFyKCZvdXQsICdcbicpOwotICAgIHBjKys7Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgICp0b3MgPSBvdXQ7Ci0gICAgCi0gICAgCi19Ci0KLVdPUkQoaW5kZW50KQotewotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbnQgdGFiID0gMDsKLSAgICBpbnQgaWR4ID0gMDsKLSAgICBpbnQgb2wgPTA7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgd2hpbGUgKGF0KHRvcyxpZHgpKSB7Ci0JICAgIHN3aXRjaCAoYXQodG9zLGlkeCkpIAotCSAgICB7Ci0JICAgICAgY2FzZSAnXG4nOgotCQljYXR0ZXh0KCZvdXQsIlxuIik7Ci0JCWlkeCsrOwotCQlpZiAodGFiICYmIGF0KHRvcyxpZHgpKQotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsIiAgICAiKTsKLQkJfQotCQlvbCA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJygnOgotCQl0YWIrKzsKLQkJaWYgKG9sID09IDApCi0JCSAgICBjYXR0ZXh0KCZvdXQsIiAgICIpOwotCQlpZHgrKzsKLQkJY2F0dGV4dCgmb3V0LCIoIik7Ci0JCW9sID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnKSc6Ci0JCXRhYi0tOwotCQljYXR0ZXh0KCZvdXQsIikiKTsKLQkJaWR4Kys7Ci0JCW9sPTE7Ci0JCQotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQljYXRjaGFyKCZvdXQsYXQodG9zLGlkeCkpOwotCQlvbD0xOwotCQkKLQkJaWR4Kys7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQkKLQotICAgIHBjKys7Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgICp0b3MgPSBvdXQ7Ci0KLX0KLQotCi1XT1JEKGdldF9zdHVmZl9pbl9jb21tYW5kKQotewotICAgIHRvcysrOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGluaXRfc3RyaW5nKHRvcyk7Ci0KLSAgICB3aGlsZSAoYXQocHRyLCBpZHgpKSB7Ci0JICAgIGlmIChpc2NvbW1hbmQocHRyLCBpZHgpKSAgYnJlYWs7Ci0JICAgIGlkeCA9ICAgY29weV9wYXN0X25ld2xpbmUocHRyLCBpZHgsIHRvcyk7Ci0JfQotICAgIHBjKys7ICAgIAotfQotCi1XT1JEKHN3YXApCi17Ci0gICAgc3RyaW5nX3R5cGUgdDsKLSAgICAKLSAgICB0ID0gdG9zWzBdOwotICAgIHRvc1swXSA9IHRvc1stMV07Ci0gICAgdG9zWy0xXSA9dDsgCi0gICAgcGMrKzsKLSAgICAKLX0KLQotV09SRChvdGhlcl9kdXApCi17Ci0gICAgdG9zKys7Ci0gICAgY2hlY2tfcmFuZ2UgKCk7Ci0gICAgaW5pdF9zdHJpbmcodG9zKTsKLSAgICBjYXRzdHIodG9zLCB0b3MtMSk7Ci0gICAgcGMrKzsKLX0KLQotV09SRChkcm9wKQotewotICB0b3MtLTsKLSAgY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLVdPUkQoaWRyb3ApCi17Ci0gIGlzcC0tOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLVdPUkQoaWNhdHN0cikKLXsKLSAgICB0b3MtLTsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBjYXRzdHIodG9zLCB0b3MrMSk7Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MrMSk7Ci0gICAgcGMrKzsKLX0KLQotV09SRChza2lwX3Bhc3RfbmV3bGluZSkKLXsKLSAgICB3aGlsZSAoYXQocHRyLGlkeCkgCi0JICAgJiYgYXQocHRyLGlkeCkgIT0gJ1xuJykKLSAgICAgaWR4Kys7Ci0gICAgaWR4Kys7Ci0gICAgcGMrKzsKLX0KLQotCi1XT1JEKGludGVybmFsbW9kZSkKLXsKLSAgICBpbnRlcm5hbF9tb2RlID0gKihpc3ApOwotICAgIGlzcC0tOwotICAgIGljaGVja19yYW5nZSAoKTsKLSAgICBwYysrOwotfQotCi1XT1JEKG1heWJlY2F0c3RyKQotewotICAgIGlmIChpbnRlcm5hbF93YW50ZWQgPT0gaW50ZXJuYWxfbW9kZSkgCi0gICAgewotCWNhdHN0cih0b3MtMSwgdG9zKTsKLSAgICB9Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgIHRvcy0tOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIHBjKys7Ci19Ci0KLWNoYXIgKgotREVGVU4obmV4dHdvcmQsKHN0cmluZywgd29yZCksCi0gICAgICBjaGFyICpzdHJpbmcgQU5ECi0gICAgICBjaGFyICoqd29yZCkKLXsKLSAgICBjaGFyICp3b3JkX3N0YXJ0OwotICAgIGludCBpZHg7Ci0gICAgY2hhciAqZHN0OwotICAgIGNoYXIgKnNyYzsKLSAgICAKLSAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAKLSAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykgfHwgKnN0cmluZyA9PSAnLScpIHsKLQkgICAgaWYgKCpzdHJpbmcgPT0gJy0nKSAKLQkgICAgewotCQl3aGlsZSAoKnN0cmluZyAmJiAqc3RyaW5nICE9ICdcbicpIAotCQkgc3RyaW5nKys7Ci0JCQotCSAgICB9Ci0JICAgIGVsc2UgewotCQkgICAgc3RyaW5nKys7Ci0JCX0KLQl9Ci0gICAgaWYgKCEqc3RyaW5nKSByZXR1cm4gMDsKLSAgICAKLSAgICB3b3JkX3N0YXJ0ID0gc3RyaW5nOwotICAgIGlmICgqc3RyaW5nID09ICciJykgCi0gICAgICB7Ci0JZG8KLQkgIHsKLQkgICAgc3RyaW5nKys7Ci0JICAgIGxlbmd0aCsrOwotCSAgICBpZiAoKnN0cmluZyA9PSAnXFwnKQotCSAgICAgIHsKLQkJc3RyaW5nICs9IDI7Ci0JCWxlbmd0aCArPSAyOwotCSAgICAgIH0KLQkgIH0KLQl3aGlsZSAoKnN0cmluZyAhPSAnIicpOwotICAgICAgfQotICAgIGVsc2UgICAgIAotICAgICAgewotCXdoaWxlICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykpIAotCXsKLQkgICAgc3RyaW5nKys7Ci0JICAgIGxlbmd0aCsrOwotCQotCX0KLSAgICB9Ci0gICAgCi0gICAgKndvcmQgPSBtYWxsb2MobGVuZ3RoICsgMSk7Ci0KLSAgICBkc3QgPSAqd29yZDsKLSAgICBzcmMgPSB3b3JkX3N0YXJ0OwotCi0KLSAgICBmb3IgKGlkeD0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykgCi0gICAgICB7Ci0JaWYgKHNyY1tpZHhdID09ICdcXCcpCi0JICBzd2l0Y2ggKHNyY1tpZHgrMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKmRzdCsrID0gJ1xuJzsKLQkgICAgICBpZHgrKzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnIic6Ci0JICAgIGNhc2UgJ1xcJzoKLQkgICAgICAqZHN0KysgPSBzcmNbaWR4KzFdOwotCSAgICAgIGlkeCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgICpkc3QrKyA9ICdcXCc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQllbHNlCi0JICAqZHN0KysgPSBzcmNbaWR4XTsKLSAgICB9Ci0gICAgKmRzdCsrID0gMDsKLQotCi0KLQotCi0gICAgaWYoKnN0cmluZykgICAgCi0gICAgIHJldHVybiBzdHJpbmcgKyAxOwotICAgIGVsc2UgCi0gICAgIHJldHVybiAwOwotICAgIAotfQotZGljdF90eXBlICpyb290OwotZGljdF90eXBlICoKLURFRlVOKGxvb2t1cF93b3JkLCh3b3JkKSwKLSAgICAgIGNoYXIgKndvcmQpCi17Ci0gIGRpY3RfdHlwZSAqcHRyID0gcm9vdDsKLSAgd2hpbGUgKHB0cikgewotICAgICAgaWYgKHN0cmNtcChwdHItPndvcmQsIHdvcmQpID09IDApIHJldHVybiBwdHI7Ci0gICAgICBwdHIgPSBwdHItPm5leHQ7Ci0JICAgIAotICAgIH0KLSAgaWYgKHdhcm5pbmcpCi0gICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3QgZmluZCAlc1xuIix3b3JkKTsKLSAgcmV0dXJuIDA7Ci0gICAgCi0gICAgCi19Ci0KLXN0YXRpYyB2b2lkIERFRlVOX1ZPSUQocGVyZm9ybSkKLXsKLSAgdG9zID0gc3RhY2s7Ci0gICAgCi0gIHdoaWxlIChhdChwdHIsIGlkeCkpIHsKLSAgICAgIC8qIEl0J3Mgd29ydGggbG9va2luZyB0aHJvdWdoIHRoZSBjb21tYW5kIGxpc3QgKi8KLSAgICAgIGlmIChpc2NvbW1hbmQocHRyLCBpZHgpKQotICAgICAgewotCWNoYXIgKm5leHQ7Ci0JZGljdF90eXBlICp3b3JkIDsKLQkJCi0JKHZvaWQpCQluZXh0d29yZChhZGRyKHB0ciwgaWR4KSwgJm5leHQpOwotCi0KLQl3b3JkID0gbG9va3VwX3dvcmQobmV4dCk7Ci0KLQotCQkKLQotCWlmICh3b3JkKSAKLQl7Ci0JICBleGVjKHdvcmQpOwotCX0KLQllbHNlCi0JewotCSAgaWYgKHdhcm5pbmcpCi0JICAgZnByaW50ZihzdGRlcnIsIndhcm5pbmcsICVzIGlzIG5vdCByZWNvZ25pc2VkXG4iLCAgbmV4dCk7Ci0JICBza2lwX3Bhc3RfbmV3bGluZSgpOwotCX0KLQkJCi0gICAgICB9Ci0gICAgICBlbHNlIHNraXBfcGFzdF9uZXdsaW5lKCk7Ci0KLSAgICB9Ci19Ci0KLWRpY3RfdHlwZSAqCi1ERUZVTihuZXdlbnRyeSwod29yZCksCi0gICAgICBjaGFyICp3b3JkKQotewotICAgIGRpY3RfdHlwZSAqbmV3ID0gKGRpY3RfdHlwZSAqKW1hbGxvYyhzaXplb2YoZGljdF90eXBlKSk7Ci0gICAgbmV3LT53b3JkID0gd29yZDsKLSAgICBuZXctPm5leHQgPSByb290OwotICAgIHJvb3QgPSBuZXc7Ci0gICAgbmV3LT5jb2RlID0gKHN0aW5zdF90eXBlICopbWFsbG9jKHNpemVvZihzdGluc3RfdHlwZSApKTsKLSAgICBuZXctPmNvZGVfbGVuZ3RoID0gMTsKLSAgICBuZXctPmNvZGVfZW5kID0gMDsKLSAgICByZXR1cm4gbmV3OwotICAgIAotfQotCi0KLXVuc2lnbmVkIGludAotREVGVU4oYWRkX3RvX2RlZmluaXRpb24sKGVudHJ5LCB3b3JkKSwgCi0gICAgICBkaWN0X3R5cGUgKmVudHJ5IEFORAotICAgICAgc3RpbnN0X3R5cGUgd29yZCkKLXsKLSAgICBpZiAoZW50cnktPmNvZGVfZW5kID09IGVudHJ5LT5jb2RlX2xlbmd0aCkgCi0gICAgewotCWVudHJ5LT5jb2RlX2xlbmd0aCArPSAyOwotCWVudHJ5LT5jb2RlID0KLQkgKHN0aW5zdF90eXBlICopIHJlYWxsb2MoKGNoYXIgKikoZW50cnktPmNvZGUpLAotCQkJICAgICAgIGVudHJ5LT5jb2RlX2xlbmd0aCAqc2l6ZW9mKHdvcmRfdHlwZSkpOwotICAgIH0KLSAgICBlbnRyeS0+Y29kZVtlbnRyeS0+Y29kZV9lbmRdID0gd29yZDsKLSAgICAKLXJldHVybiAgICAgZW50cnktPmNvZGVfZW5kKys7ICAKLX0KLQotCi0KLQotCi0KLQotdm9pZAotREVGVU4oYWRkX2ludHJpbnNpYywobmFtZSwgZnVuYyksCi0gICAgICBjaGFyICpuYW1lIEFORAotICAgICAgdm9pZCAoKmZ1bmMpKCkpCi17Ci0gICAgZGljdF90eXBlICpuZXcgPSBuZXdlbnRyeShuYW1lKTsKLSAgICBhZGRfdG9fZGVmaW5pdGlvbihuZXcsIGZ1bmMpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgMCk7Ci19Ci0KLXZvaWQKLURFRlVOKGFkZF92YXIsKG5hbWUpLAotICAgICAgY2hhciAqbmFtZSkKLXsKLSAgICBkaWN0X3R5cGUgKm5ldyA9IG5ld2VudHJ5KG5hbWUpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgcHVzaF9udW1iZXIpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgKHN0aW5zdF90eXBlKSgmKG5ldy0+dmFyKSkpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywwKTsKLX0KLQotCi12b2lkIAotREVGVU4oY29tcGlsZSwgKHN0cmluZyksIAotICAgICAgY2hhciAqc3RyaW5nKQotewotICAgIC8qIGFkZCB3b3JkcyB0byB0aGUgZGljdGlvbmFyeSAqLwotICAgIGNoYXIgKndvcmQ7Ci0gICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0gICAgd2hpbGUgKHN0cmluZyAmJiAqc3RyaW5nICYmIHdvcmRbMF0pIAotICAgIHsKLQlpZiAoc3RyY21wKHdvcmQsInZhciIpPT0wKSAKLQl7Ci0gc3RyaW5nPW5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCSAgCi0JICBhZGRfdmFyKHdvcmQpOwotIHN0cmluZz1uZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKLQl9Ci1lbHNlCQotCSAgICAKLQlpZiAod29yZFswXSA9PSAnOicpCi0JewotCSAgICBkaWN0X3R5cGUgKnB0cjsKLQkgICAgLyogQ29tcGlsZSBhIHdvcmQgYW5kIGFkZCB0byBkaWN0aW9uYXJ5ICovCi0JICAgIHN0cmluZyA9IG5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCSAgICAKLQkgICAgcHRyID0gbmV3ZW50cnkod29yZCk7Ci0JICAgIHN0cmluZyA9IG5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCSAgICB3aGlsZSAod29yZFswXSAhPSAnOycgKSAKLQkgICAgewotCQkgc3dpdGNoICh3b3JkWzBdKSAKLQkJIHsKLQkJICAgY2FzZSAnIic6Ci0JCSAgICAgLyogZ290IGEgc3RyaW5nLCBlbWJlZCBtYWdpYyBwdXNoIHN0cmluZwotCQkJZnVuY3Rpb24gKi8KLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIHB1c2hfdGV4dCk7Ci0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCAoc3RpbnN0X3R5cGUpKHdvcmQrMSkpOwotCQkgICAgIGJyZWFrOwotCQkgICBjYXNlICcwJzoKLQkJICAgY2FzZSAnMSc6Ci0JCSAgIGNhc2UgJzInOgotCQkgICBjYXNlICczJzoKLQkJICAgY2FzZSAnNCc6Ci0JCSAgIGNhc2UgJzUnOgotCQkgICBjYXNlICc2JzoKLQkJICAgY2FzZSAnNyc6Ci0JCSAgIGNhc2UgJzgnOgotCQkgICBjYXNlICc5JzoKLQkJICAgICAvKiBHb3QgYSBudW1iZXIsIGVtYmVkZCB0aGUgbWFnaWMgcHVzaCBudW1iZXIKLQkJCWZ1bmN0aW9uICovCi0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCBwdXNoX251bWJlcik7Ci0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCAoc3RpbnN0X3R5cGUpYXRvbCh3b3JkKSk7Ci0JCSAgICAgYnJlYWs7Ci0JCSAgIGRlZmF1bHQ6Ci0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCBjYWxsKTsKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSlsb29rdXBfd29yZCh3b3JkKSk7Ci0JCSB9Ci0KLQkJc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7CQkgICAgIAotCSAgICB9Ci0JICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwwKTsKLQkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JfQotCWVsc2UgCi0JewotCSAgICBmcHJpbnRmKHN0ZGVyciwic3ludGF4IGVycm9yIGF0ICVzXG4iLHN0cmluZy0xKTsKLQl9CSAgICAKLSAgICB9Ci0KLX0KLQotIAotc3RhdGljIHZvaWQgREVGVU5fVk9JRChiYW5nKQotewotICAqKGxvbmcgKikoKGlzcFswXSkpID0gaXNwWy0xXTsKLSAgaXNwLT0yOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLVdPUkQoYXRzaWduKQotewotICAgIGlzcFswXSA9ICoobG9uZyAqKShpc3BbMF0pOwotICAgIHBjKys7Ci19Ci0KLVdPUkQoaGVsbG8pCi17Ci0gIHByaW50ZigiaGVsbG9cbiIpOwotICBwYysrOyAgICAKLX0KLQotV09SRChzdGRvdXRfKQotewotICBpc3ArKzsKLSAgaWNoZWNrX3JhbmdlICgpOwotICAqaXNwID0gMTsKLSAgcGMrKzsKLX0KLQotV09SRChzdGRlcnJfKQotewotICBpc3ArKzsKLSAgaWNoZWNrX3JhbmdlICgpOwotICAqaXNwID0gMjsKLSAgcGMrKzsKLX0KLQotV09SRChwcmludCkKLXsKLSAgaWYgKCppc3AgPT0gMSkKLSAgICB3cml0ZV9idWZmZXIgKHRvcywgc3Rkb3V0KTsKLSAgZWxzZSBpZiAoKmlzcCA9PSAyKQotICAgIHdyaXRlX2J1ZmZlciAodG9zLCBzdGRlcnIpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAicHJpbnQ6IGlsbGVnYWwgcHJpbnQgZGVzdGluYXRpb24gYCVsZCdcbiIsICppc3ApOwotICBpc3AtLTsKLSAgdG9zLS07Ci0gIGljaGVja19yYW5nZSAoKTsKLSAgY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU4ocmVhZF9pbiwgKHN0ciwgZmlsZSksIAotCSAgIHN0cmluZ190eXBlICpzdHIgQU5ECi0JCSAgRklMRSAqZmlsZSkKLXsKLSAgICBjaGFyIGJ1ZmZbMTAwMDBdOyAgICAKLSAgICB1bnNpZ25lZCBpbnQgcjsKLSAgICBkbyAKLSAgICB7Ci0JciA9IGZyZWFkKGJ1ZmYsIDEsIHNpemVvZihidWZmKSwgZmlsZSk7Ci0JY2F0YnVmKHN0ciwgYnVmZiwgcik7Ci0gICAgfQotICAgIHdoaWxlIChyKTsKLSAgICBidWZmWzBdID0gMDsKLSAgICAKLSAgICBjYXRidWYoc3RyLCBidWZmLDEpOwotfQotCi0KLXN0YXRpYyB2b2lkIERFRlVOX1ZPSUQodXNhZ2UpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsInVzYWdlOiAtW2R8aXxnXSA8ZmlsZSA+ZmlsZVxuIik7Ci0gICAgZXhpdCgzMyk7ICAgIAotfQotCi0vKiBUaGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gZGVjbGFyZSBleGl0LiAgU29tZXRpbWVzIGl0IHJldHVybnMKLSAgIGludCwgYW5kIHNvbWV0aW1lcyBpdCByZXR1cm5zIHZvaWQuICBTb21ldGltZXMgaXQgY2hhbmdlcyBiZXR3ZWVuCi0gICBPUyByZWxlYXNlcy4gIFRyeWluZyB0byBnZXQgaXQgZGVjbGFyZWQgY29ycmVjdGx5IGluIHRoZSBob3N0cyBmaWxlCi0gICBpcyBhIHBvaW50bGVzcyB3YXN0ZSBvZiB0aW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZXdfZXhpdCAoKQotewotICBleGl0ICgwKTsKLX0KLQotaW50IERFRlVOKG1haW4sKGFjLGF2KSwKLWludCBhYyBBTkQKLWNoYXIgKmF2W10pCi17Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdHJpbmdfdHlwZSBidWZmZXI7Ci0gIHN0cmluZ190eXBlIHBwdHI7Ci0KLSAgaW5pdF9zdHJpbmcoJmJ1ZmZlcik7Ci0gIGluaXRfc3RyaW5nKCZwcHRyKTsKLSAgaW5pdF9zdHJpbmcoc3RhY2srMCk7Ci0gIHRvcz1zdGFjaysxOwotICBwdHIgPSAmcHB0cjsKLSAgICAKLSAgYWRkX2ludHJpbnNpYygicHVzaF90ZXh0IiwgcHVzaF90ZXh0KTsKLSAgYWRkX2ludHJpbnNpYygiISIsIGJhbmcpOwotICBhZGRfaW50cmluc2ljKCJAIiwgYXRzaWduKTsKLSAgYWRkX2ludHJpbnNpYygiaGVsbG8iLGhlbGxvKTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInN0ZG91dCIsc3Rkb3V0Xyk7ICAgIAotICBhZGRfaW50cmluc2ljKCJzdGRlcnIiLHN0ZGVycl8pOyAgICAKLSAgYWRkX2ludHJpbnNpYygicHJpbnQiLHByaW50KTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInNraXBfcGFzdF9uZXdsaW5lIiwgc2tpcF9wYXN0X25ld2xpbmUgKTsKLSAgYWRkX2ludHJpbnNpYygiY2F0c3RyIiwgaWNhdHN0ciApOwotICBhZGRfaW50cmluc2ljKCJjb3B5X3Bhc3RfbmV3bGluZSIsIGljb3B5X3Bhc3RfbmV3bGluZSApOwotICBhZGRfaW50cmluc2ljKCJkdXAiLCBvdGhlcl9kdXAgKTsKLSAgYWRkX2ludHJpbnNpYygiZHJvcCIsIGRyb3ApOwotICBhZGRfaW50cmluc2ljKCJpZHJvcCIsIGlkcm9wKTsKLSAgYWRkX2ludHJpbnNpYygicmVtY2hhciIsIHJlbWNoYXIgKTsKLSAgYWRkX2ludHJpbnNpYygiZ2V0X3N0dWZmX2luX2NvbW1hbmQiLCBnZXRfc3R1ZmZfaW5fY29tbWFuZCApOwotICBhZGRfaW50cmluc2ljKCJkb19mYW5jeV9zdHVmZiIsIGRvX2ZhbmN5X3N0dWZmICk7Ci0gIGFkZF9pbnRyaW5zaWMoImJ1bGxldGl6ZSIsIGJ1bGxldGl6ZSApOwotICBhZGRfaW50cmluc2ljKCJjb3VyaWVyaXplIiwgY291cmllcml6ZSApOwotICAvKiBJZiB0aGUgZm9sbG93aW5nIGxpbmUgZ2l2ZXMgYW4gZXJyb3IsIGV4aXQoKSBpcyBub3QgZGVjbGFyZWQgaW4gdGhlCi0gICAgIC4uL2hvc3RzL2Zvby5oIGZpbGUgZm9yIHRoaXMgaG9zdC4gIEZpeCBpdCB0aGVyZSwgbm90IGhlcmUhICAqLwotICAvKiBObywgZG9uJ3QgZml4IGl0IGFueXdoZXJlOyBzZWUgY29tbWVudCBvbiBjaGV3X2V4aXQtLUlhbiBUYXlsb3IuICAqLwotICBhZGRfaW50cmluc2ljKCJleGl0IiwgY2hld19leGl0ICk7Ci0gIGFkZF9pbnRyaW5zaWMoInN3YXAiLCBzd2FwICk7Ci0gIGFkZF9pbnRyaW5zaWMoIm91dHB1dGRvdHMiLCBvdXRwdXRkb3RzICk7Ci0gIGFkZF9pbnRyaW5zaWMoInBhcmFtc3R1ZmYiLCBwYXJhbXN0dWZmICk7Ci0gIGFkZF9pbnRyaW5zaWMoIm1heWJlY2F0c3RyIiwgbWF5YmVjYXRzdHIgKTsKLSAgYWRkX2ludHJpbnNpYygidHJhbnNsYXRlY29tbWVudHMiLCB0cmFuc2xhdGVjb21tZW50cyApOwotICBhZGRfaW50cmluc2ljKCJraWxsX2JvZ3VzX2xpbmVzIiwga2lsbF9ib2d1c19saW5lcyk7Ci0gIGFkZF9pbnRyaW5zaWMoImluZGVudCIsIGluZGVudCk7Ci0gIGFkZF9pbnRyaW5zaWMoImludGVybmFsbW9kZSIsIGludGVybmFsbW9kZSk7Ci0gIGFkZF9pbnRyaW5zaWMoInByaW50X3N0YWNrX2xldmVsIiwgcHJpbnRfc3RhY2tfbGV2ZWwpOwotICBhZGRfaW50cmluc2ljKCJzdHJpcF90cmFpbGluZ19uZXdsaW5lcyIsIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzKTsKLSAgICAKLSAgLyogUHV0IGEgbmwgYXQgdGhlIHN0YXJ0ICovCi0gIGNhdGNoYXIoJmJ1ZmZlciwnXG4nKTsKLQotICByZWFkX2luKCZidWZmZXIsIHN0ZGluKTsgCi0gIHJlbW92ZV9ub25jb21tZW50cygmYnVmZmVyLCBwdHIpOwotICBmb3IgKGk9IDE7IGkgPCAodW5zaWduZWQgaW50KSBhYzsgaSsrKSAKLSAgewotICAgIGlmIChhdltpXVswXSA9PSAnLScpCi0gICAgewotICAgICAgaWYgKGF2W2ldWzFdID09ICdmJykKLSAgICAgIHsKLQlzdHJpbmdfdHlwZSBiOwotCUZJTEUgKmY7Ci0JaW5pdF9zdHJpbmcoJmIpOwotCi0JZiAgPSBmb3BlbihhdltpKzFdLCJyIik7Ci0JaWYgKCFmKSAKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3Qgb3BlbiB0aGUgaW5wdXQgZmlsZSAlc1xuIixhdltpKzFdKTsKLQkgIHJldHVybiAzMzsKLQl9Ci0KLQlyZWFkX2luKCZiLCBmKTsKLQljb21waWxlKGIucHRyKTsKLQlwZXJmb3JtKCk7CQotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ2knKSAKLSAgICAgIHsKLQlpbnRlcm5hbF93YW50ZWQgPSAxOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ3cnKSAKLSAgICAgIHsKLQl3YXJuaW5nID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLQl1c2FnZSAoKTsKLSAgICB9Ci0gIH0gICAgICAKLSAgd3JpdGVfYnVmZmVyKHN0YWNrKzAsIHN0ZG91dCk7Ci0gIGlmICh0b3MgIT0gc3RhY2spCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZmluaXNoaW5nIHdpdGggY3VycmVudCBzdGFjayBsZXZlbCAlZFxuIiwgdG9zIC0gc3RhY2spOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9kb2MvZG9jLnN0ciBiL2JmZC9kb2MvZG9jLnN0cgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyNzZmZS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2RvYy5zdHIKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotOiBET0NERAotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQga2lsbF9ib2d1c19saW5lcyBjYXRzdHIKLQk7Ci0KLTogRU5EREQKLQlza2lwX3Bhc3RfbmV3bGluZQotCTsKLQotOiBFWEFNUExFCi0Jc2tpcF9wYXN0X25ld2xpbmUJCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQga2lsbF9ib2d1c19saW5lcyBkb19mYW5jeV9zdHVmZiB0cmFuc2xhdGVjb21tZW50cyAKLQljb3VyaWVyaXplIGNhdHN0cgotCi0JOwotCi06IElOT0RFIAotCSJAbm9kZSAiIGNhdHN0ciBza2lwX3Bhc3RfbmV3bGluZSBjb3B5X3Bhc3RfbmV3bGluZSBjYXRzdHIgCi0JOwotCi06IENPREVfRlJBR01FTlQKLQlFWEFNUExFIAotCTsKLQotOiBDT01NRU5UCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCWRyb3AKLQk7Ci0KLTogU1lOT1BTSVMKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAc3Ryb25ne1N5bm9wc2lzfVxuIiBjYXRzdHIKLQkiQGV4YW1wbGVcbiIgY2F0c3RyCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQgIAotCWtpbGxfYm9ndXNfbGluZXMKLQlpbmRlbnQKLQljYXRzdHIKLQkiQGVuZCBleGFtcGxlXG4iIGNhdHN0cgotCi0JOwotCi06IGZ1bmMKLQkiQGZpbmRleCAiCS0gYQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlkdXAJCS0gYSB4IHggCi0JIkBzdWJzdWJzZWN0aW9uIEBjb2RleyIgLSBhIHggeCBiIAotCXN3YXAKLQlyZW1jaGFyCi0JIn1cbiIgLSBhIHggYiB4IGMKLQljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAKLQk7Ci0KLTogRlVOQ1RJT04KLQkiQGZpbmRleCAiCS0gYQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlkdXAJCS0gYSB4IHggCi0JIkBzdWJzdWJzZWN0aW9uIEBjb2RleyIgLSBhIHggeCBiIAotCXN3YXAKLQlyZW1jaGFyCi0JIn1cbiIgLSBhIHggYiB4IGMKLQljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAKLQk7Ci0KLTogYm9keXRleHQKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCAKLQlidWxsZXRpemUKLQlraWxsX2JvZ3VzX2xpbmVzCi0JZG9fZmFuY3lfc3R1ZmYKLQljb3VyaWVyaXplCi0JY2F0c3RyCi0JIlxuIiBjYXRzdHIKLQk7Ci0KLTogYXNlY3Rpb24KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNhdHN0cgotCWNvcHlfcGFzdF9uZXdsaW5lIAkKLQlkb19mYW5jeV9zdHVmZiBjYXRzdHIgCQotCWJvZHl0ZXh0CQotCTsKLQotOiBTRUNUSU9OIAotCSJAc2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogU1VCU0VDVElPTgotCSJAc3Vic2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogU1VCU1VCU0VDVElPTgotCSJAc3Vic3Vic2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogc3ViaGVhZAotCXNraXBfcGFzdF9uZXdsaW5lCi0JYm9keXRleHQKLQk7Ci0KLQotCi0JCi06IERFU0NSSVBUSU9OIAotCSJAc3Ryb25ne0Rlc2NyaXB0aW9ufUAqXG4iIGNhdHN0ciBzdWJoZWFkIDsKLQotOiBSRVRVUk5TCi0JIkBzdHJvbmd7UmV0dXJuc31AKlxuIiBjYXRzdHIgc3ViaGVhZCA7Ci0KLTogSU5URVJOQUxfRlVOQ1RJT04KLQlmdW5jIDsKLQotCi06IElOVEVSTkFMX0RFRklOSVRJT04gCi0JZnVuYyA7Ci0KLQotOiBJTlRFUk5BTAotCWZ1bmMgOwotCi06IFRZUEVERUYKLQlGVU5DVElPTiA7Ci0KLTogU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCSJIZXJlIGFyZSB0aGUgcG9zc2libGUgdmFsdWVzIGZvciBAY29kZXtlbnVtICIKLQljb3B5X3Bhc3RfbmV3bGluZSByZW1jaGFyIGNhdHN0cgotCSJ9OlxuXG4iIGNhdHN0ciBjYXRzdHIKLQk7Ci06IEVOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm4ge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciBjYXRzdHIKLQk7Ci06IEVOVU1YCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiQGRlZmZueCB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyCi0JY2F0c3RyCi0JOwotOiBFTlVNRVEKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm4ge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciBjYXRzdHIKLQlza2lwX3Bhc3RfbmV3bGluZQotCTsKLTogRU5VTUVRWAotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbngge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0cgotCWNhdHN0cgotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotOiBFTlVNRE9DCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzCi0JY2F0c3RyCi0JIlxuQGVuZCBkZWZmblxuIiBjYXRzdHIKLQk7CmRpZmYgLS1naXQgYS9iZmQvZG9jL21ha2VmaWxlLnZtcyBiL2JmZC9kb2MvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg1N2MwLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1DRkxBR1MgPSAvbm9vcHQvaW5jbHVkZT0oW10sWy1dLFstLi0uaW5jbHVkZV0pCi1MREZMQUdTID0gL25vbWFwCi1MRExJQlMgPSAsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotCi1hbGw6IGNoZXcuZXhlCmRpZmYgLS1naXQgYS9iZmQvZG9jL3Byb3RvLnN0ciBiL2JmZC9kb2MvcHJvdG8uc3RyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDMxYzE2Li4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvcHJvdG8uc3RyCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLQotOiBTWU5PUFNJUwotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQJCi0JcGFyYW1zdHVmZgotCWluZGVudAotCW1heWJlY2F0c3RyCi07Ci0KLTogaWdub3JlCi0Jc2tpcF9wYXN0X25ld2xpbmUgCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlvdXRwdXRkb3RzCi0JbWF5YmVjYXRzdHIKLQk7Ci0KLTogQ09ERV9GUkFHTUVOVAotCWlnbm9yZSA7Ci0KLTogZXh0ZXJuYWwKLQkwIGludGVybmFsbW9kZSBpZ25vcmUgOwotCi06IGludGVybmFsIAotCTEgaW50ZXJuYWxtb2RlIGlnbm9yZSA7Ci0KLS0gaW5wdXQgc3RhY2sgeyBhIGIgfSBvdXRwdXQgYiBpZiBpbnRlcm5hbCwgYSBpZiBleHRlcm5hbAotOiBpZmludGVybmFsCi0JIiIgc3dhcCAxIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCXN3YXAKLQkiIiBzd2FwIDAgaW50ZXJuYWxtb2RlIG1heWJlY2F0c3RyCi0JY2F0c3RyCi0JOwotCi0tIFB1dCBub3RlIGluIG91dHB1dCBzdHJpbmcsIHJlZ2FyZGxlc3Mgb2YgaW50ZXJuYWwgbW9kZS4KLTogQ09NTUVOVAotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQl0cmFuc2xhdGVjb21tZW50cwotCWNhdHN0cgotCTsKLQotLSBTRU5VTSAgICBlbnVtLXR5cGUtbmFtZQotLSBFTlVNICAgICBlbnVtLW5hbWUKLS0gRU5VTVggICAgYWRkbC1lbnVtLW5hbWUKLS0gRU5VTURPQyAgZG9jIGZvciBwcmVjZWRpbmcgZW51bXMKLS0gRU5EU0VOVU0gbWF4LWVudW0tbmFtZQotCi06IG1ha2VfZW51bV9oZWFkZXIKLQlkdXAKLQkiZW51bSAiIHN3YXAgY2F0c3RyCi0JIiB7XG4iIGNhdHN0cgotCXN3YXAgIiAgX2R1bW15X2ZpcnN0XyIgc3dhcCBjYXRzdHIgY2F0c3RyCi0JIixcbiIgY2F0c3RyCi0JOwotOiBtYWtlX3N0cmluZ190YWJsZV9oZWFkZXIKLQlkdXAKLQkiI2lmZGVmIF9CRkRfTUFLRV9UQUJMRV8iIHN3YXAgY2F0c3RyIHN3YXAKLQkiXG5cbnN0YXRpYyBjb25zdCBjaGFyICpjb25zdCAiIHN3YXAgY2F0c3RyIGNhdHN0cgotCSJfbmFtZXNbXSA9IHsgXCJAQHVuaW5pdGlhbGl6ZWRAQFwiLFxuIiBjYXRzdHIKLQk7Ci06IFNFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCXJlbWNoYXIKLQlkdXAKLQltYWtlX2VudW1faGVhZGVyCi0Jc3dhcAotCW1ha2Vfc3RyaW5nX3RhYmxlX2hlYWRlcgotCWlmaW50ZXJuYWwKLQljYXRzdHIKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBjYXRzdHIKLQl0cmFuc2xhdGVjb21tZW50cyA7Ci06IEVORFNFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZSBzdHJpcF90cmFpbGluZ19uZXdsaW5lcwotCWR1cAotCSIgICIgc3dhcCBjYXRzdHIgIiB9O1xuIiBjYXRzdHIJc3dhcAotCSIgXCJAQG92ZXJmbG93OiAiIHN3YXAgY2F0c3RyICJAQFwiLFxufTtcbiNlbmRpZlxuXG4iIGNhdHN0cgotCWlmaW50ZXJuYWwKLQljYXRzdHIKLQk7Ci06IG1ha2VfZW51bWVyYXRvcgotCSIgICIgc3dhcCBjYXRzdHIKLQkiLFxuIiBjYXRzdHIKLQk7Ci06IG1ha2VfZW51bWVyYXRvcl9zdHJpbmcKLQkiICBcIiIgc3dhcCBjYXRzdHIKLQkiXCIsXG4iIGNhdHN0cgotCTsKLTogRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlyZW1jaGFyCi0JZHVwCi0JbWFrZV9lbnVtZXJhdG9yCi0Jc3dhcAotCW1ha2VfZW51bWVyYXRvcl9zdHJpbmcKLQlpZmludGVybmFsCi0JOwotOiBFTlVNWCBFTlVNIGNhdHN0ciA7Ci06IEVOVU1FUQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIiNkZWZpbmUgIgotCWNvcHlfcGFzdF9uZXdsaW5lIHJlbWNoYXIKLQljYXRzdHIKLQkiICIKLQljYXRzdHIKLQljb3B5X3Bhc3RfbmV3bGluZQotCWNhdHN0cgotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQk7Ci06IEVOVU1FUVggRU5VTUVRIGNhdHN0ciA7Ci06IEVOVU1ET0MKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0Jc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMKLQkiXG57KiAiIHN3YXAgY2F0c3RyICIgKn1cbiIgY2F0c3RyCi0JdHJhbnNsYXRlY29tbWVudHMKLQktIGRpc2NhcmQgaXQgaWYgd2UncmUgZG9pbmcgaW50ZXJuYWwgbW9kZQotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQlzd2FwCi0JY2F0c3RyIGNhdHN0cgotCTsKLTogRU5EREQgZXh0ZXJuYWwgOwotOiBTRUNUSU9OIGlnbm9yZSA7Ci06IFNVQlNFQ1RJT04gaWdub3JlIDsKLTogU1VCU1VCU0VDVElPTiBpZ25vcmUgOwotOiBJTlRFUk5BTF9ERUZJTklUSU9OIGludGVybmFsIDsKLTogREVTQ1JJUFRJT04gaWdub3JlIDsKLTogRlVOQ1RJT04gZXh0ZXJuYWwgOwotOiBSRVRVUk5TIGlnbm9yZSA7Ci06IFRZUEVERUYgZXh0ZXJuYWwgOwotOiBJTlRFUk5BTF9GVU5DVElPTiBpbnRlcm5hbCA7Ci06IElOVEVSTkFMIGludGVybmFsIDsKLTogSU5PREUgaWdub3JlIDsKZGlmZiAtLWdpdCBhL2JmZC9kd2FyZjEuYyBiL2JmZC9kd2FyZjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExODRjYy4uMDAwMDAwMAotLS0gYS9iZmQvZHdhcmYxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLyogRFdBUkYgMSBmaW5kIG5lYXJlc3QgbGluZSAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUpLgotICAgQ29weXJpZ2h0IDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVdyaXR0ZW4gYnkgR2F2aW4gUm9taWctS29jaCBvZiBDeWdudXMgU29sdXRpb25zIChnYXZpbkBjeWdudXMuY29tKS4gIAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2R3YXJmLmgiCi0KLS8qIGR3YXJmMV9kZWJ1ZyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGFsbCBkd2FyZjEgaW5mby4gKi8KLQotc3RydWN0IGR3YXJmMV9kZWJ1ZyB7Ci0KLSAgLyogVGhlIGJmZCB3ZSBhcmUgd29ya2luZyB3aXRoLiAqLwotICBiZmQqIGFiZmQ7Ci0KLSAgLyogTGlzdCBvZiBhbHJlYWR5IHBhcnNlZCBjb21waWxhdGlvbiB1bml0cy4gKi8KLSAgc3RydWN0IGR3YXJmMV91bml0KiBsYXN0VW5pdDsKLQotICAvKiBUaGUgYnVmZmVyIGZvciB0aGUgLmRlYnVnIHNlY3Rpb24uIAotICAgICBaZXJvIGluZGljYXRlcyB0aGF0IHRoZSAuZGVidWcgc2VjdGlvbiBmYWlsZWQgdG8gbG9hZC4gKi8KLSAgY2hhciogZGVidWdfc2VjdGlvbjsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gbWVtb3J5IGJ1ZmZlci4gKi8KLSAgY2hhciogZGVidWdfc2VjdGlvbl9lbmQ7Ci0KLSAgLyogVGhlIGJ1ZmZlciBmb3IgdGhlIC5saW5lIHNlY3Rpb24uICovCi0gIGNoYXIqIGxpbmVfc2VjdGlvbjsKLQotICAvKiBFbmQgb2YgdGhhdCBidWZmZXIuICovCi0gIGNoYXIqIGxpbmVfc2VjdGlvbl9lbmQ7Ci0KLSAgLyogVGhlIGN1cnJlbnQgb3IgbmV4dCB1bnJlYWQgZGllIHdpdGhpbiB0aGUgLmRlYnVnIHNlY3Rpb24uICovCi0gIGNoYXIqIGN1cnJlbnREaWU7Ci19OwotCi0vKiBPbmUgZHdhcmYxX3VuaXQgZm9yIGVhY2ggcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXQgZGllLiAqLwotCi1zdHJ1Y3QgZHdhcmYxX3VuaXQgewotICAvKiBMaW5rZWQgc3RhcnRpbmcgZnJvbSBzdGFzaC0+bGFzdFVuaXQuICovCi0gIHN0cnVjdCBkd2FyZjFfdW5pdCogcHJldjsKLQotICAvKiBOYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICBjaGFyKiBuYW1lOwotCi0gIC8qIFRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYWRkcmVzcyB1c2VkIGluIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvd19wYzsKLSAgdW5zaWduZWQgbG9uZyBoaWdoX3BjOwotCi0gIC8qIERvZXMgdGhpcyB1bml0IGhhdmUgYSBzdGF0ZW1lbnQgbGlzdD8gKi8KLSAgaW50IGhhc19zdG10X2xpc3Q7Ci0KLSAgLyogSWYgYW55LCB0aGUgb2Zmc2V0IG9mIHRoZSBsaW5lIG51bWJlciB0YWJsZSBpbiB0aGUgLmxpbmUgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgbG9uZyBzdG10X2xpc3Rfb2Zmc2V0OwotCi0gIC8qIElmIG5vbi16ZXJvLCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgdW5pdC4gKi8KLSAgY2hhciogZmlyc3RfY2hpbGQ7Ci0KLSAgLyogSG93IG1hbnkgbGluZSBlbnRyaWVzPyAqLwotICB1bnNpZ25lZCBsb25nIGxpbmVfY291bnQ7Ci0KLSAgLyogVGhlIGRlY29kZWQgbGluZSBudW1iZXIgdGFibGUgKGxpbmVfY291bnQgZW50cmllcykuICovCi0gIHN0cnVjdCBsaW5lbnVtYmVyKiBsaW5lbnVtYmVyX3RhYmxlOwotCi0gIC8qIFRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBpbiB0aGlzIHVuaXQuICovCi0gIHN0cnVjdCBkd2FyZjFfZnVuYyogZnVuY19saXN0OwotfTsKLQotCi0KLS8qIE9uZSBkd2FyZjFfZnVuYyBmb3IgZWFjaCBwYXJzZWQgZnVuY3Rpb24gZGllLiAgKi8KLQotc3RydWN0IGR3YXJmMV9mdW5jIHsKLSAgLyogTGlua2VkIHN0YXJ0aW5nIGZyb20gYVVuaXQtPmZ1bmNfbGlzdC4gKi8KLSAgc3RydWN0IGR3YXJmMV9mdW5jKiBwcmV2OwotICAKLSAgLyogTmFtZSBvZiBmdW5jdGlvbi4gKi8KLSAgY2hhciogbmFtZTsKLSAgCi0gIC8qIFRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYWRkcmVzcyB1c2VkIGluIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvd19wYzsKLSAgdW5zaWduZWQgbG9uZyBoaWdoX3BjOwotfTsKLQotCi0vKiBVc2VkIHRvIHJldHVybiBpbmZvIGFib3V0IGEgcGFyc2VkIGRpZS4gKi8KLXN0cnVjdCBkaWVfaW5mbyB7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICB1bnNpZ25lZCBsb25nIHNpYmxpbmc7Ci0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci0gIHVuc2lnbmVkIGxvbmcgc3RtdF9saXN0X29mZnNldDsKLSAgCi0gIGNoYXIqIG5hbWU7IAotICAKLSAgaW50IGhhc19zdG10X2xpc3Q7Ci0KLSAgdW5zaWduZWQgc2hvcnQgdGFnOwotfTsKLQotCi0vKiBQYXJzZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICovCi1zdHJ1Y3QgbGluZW51bWJlciB7Ci0gIC8qIEZpcnN0IGFkZHJlc3MgaW4gdGhlIGxpbmUuICovCi0gIHVuc2lnbmVkIGxvbmcgYWRkcjsKLQotICAvKiBUaGUgbGluZSBudW1iZXIuICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZW51bWJlcjsKLX07Ci0KLQotLyogRmluZCB0aGUgZm9ybSBvZiBhbiBhdHRyLCBmcm9tIHRoZSBhdHRyIGZpZWxkLiAqLwotI2RlZmluZSBGT1JNX0ZST01fQVRUUihhdHRyKQkoKGF0dHIpICYgMHhGKQkvKiBJbXBsaWNpdGx5IHNwZWNpZmllZCAqLwotCi0KLS8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBkd2FyZjFfdW5pdC4gIEl0IHNob3VsZCBiZSBjbGVhcmVkIGFuZAotICAgdGhlbiBhdHRhY2hlZCBpbnRvIHRoZSAnc3Rhc2gnIGF0ICdzdGFzaC0+bGFzdFVuaXQnLiAqLwotCi1zdGF0aWMgc3RydWN0IGR3YXJmMV91bml0KgotYWxsb2NfZHdhcmYxX3VuaXQgKHN0YXNoKQotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLXsKLSAgc3RydWN0IGR3YXJmMV91bml0KiB4ID0gCi0gICAgKHN0cnVjdCBkd2FyZjFfdW5pdCopIGJmZF96YWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBkd2FyZjFfdW5pdCkpOwotICB4LT5wcmV2ID0gc3Rhc2gtPmxhc3RVbml0OwotICBzdGFzaC0+bGFzdFVuaXQgPSB4OwotCi0gIHJldHVybiB4OwotfQotCi0vKiBSZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgZHdhcmYxX2Z1bmMuICBJdCBtdXN0IGJlIGNsZWFyZWQgYW5kCi0gICBhdHRhY2hlZCBpbnRvICdhVW5pdCcgYXQgJ2FVbml0LT5mdW5jX2xpc3QnLiAqLwotCi1zdGF0aWMgc3RydWN0IGR3YXJmMV9mdW5jKgotYWxsb2NfZHdhcmYxX2Z1bmMgKHN0YXNoLCBhVW5pdCkKLSAgICAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gICAgIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci17Ci0gIHN0cnVjdCBkd2FyZjFfZnVuYyogeCA9IAotICAgIChzdHJ1Y3QgZHdhcmYxX2Z1bmMqKSBiZmRfemFsbG9jIChzdGFzaC0+YWJmZCwgCi0JCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYxX2Z1bmMpKTsKLSAgeC0+cHJldiA9IGFVbml0LT5mdW5jX2xpc3Q7Ci0gIGFVbml0LT5mdW5jX2xpc3QgPSB4OwotICAKLSAgcmV0dXJuIHg7Ci19Ci0KLS8qIHBhcnNlX2RpZSAtIHBhcnNlIGEgRHdhcmYxIGRpZS4KLSAgIFBhcnNlIHRoZSBkaWUgc3RhcnRpbmcgYXQgJ2FEaWVQdHInIGludG8gJ2FEaWVJbmZvJy4KLSAgICdhYmZkJyBtdXN0IGJlIHRoZSBiZmQgZnJvbSB3aGljaCB0aGUgc2VjdGlvbiB0aGF0ICdhRGllUHRyJwotICAgcG9pbnRzIHRvIHdhcyBwdWxsZWQgZnJvbS4gCi0KLSAgIFJldHVybiBmYWxzZSBpZiB0aGUgZGllIGlzIGludmFsaWRseSBmb3JtYXR0ZWQ7IHRydWUgb3RoZXJ3aXNlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfZGllIChhYmZkLCBhRGllSW5mbywgYURpZVB0cikKLSAgICAgYmZkKiBhYmZkOwotICAgICBzdHJ1Y3QgZGllX2luZm8qIGFEaWVJbmZvOwotICAgICBjaGFyKiAgICAgICAgICAgIGFEaWVQdHI7Ci17Ci0gIGNoYXIqIHRoaXNfZGllID0gYURpZVB0cjsKLSAgY2hhciogeHB0ciA9IHRoaXNfZGllOwotCi0gIG1lbXNldCAoYURpZUluZm8sMCxzaXplb2YoKmFEaWVJbmZvKSk7Ci0KLSAgLyogRmlyc3QgY29tZXMgdGhlIGxlbmd0aC4gKi8KLSAgYURpZUluZm8tPmxlbmd0aCA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotICB4cHRyICs9IDQ7Ci0gIGlmIChhRGllSW5mby0+bGVuZ3RoID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYURpZUluZm8tPmxlbmd0aCA8IDYpCi0gICAgewotICAgICAgLyogSnVzdCBwYWRkaW5nIGJ5dGVzLiAqLwotICAgICAgYURpZUluZm8tPnRhZyA9IFRBR19wYWRkaW5nOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoZW4gdGhlIHRhZy4gKi8KLSAgYURpZUluZm8tPnRhZyA9IGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOwotICB4cHRyICs9IDI7Ci0gICAgICAKLSAgLyogVGhlbiB0aGUgYXR0cmlidXRlcy4gKi8KLSAgd2hpbGUgKHhwdHIgPCAodGhpc19kaWUgKyBhRGllSW5mby0+bGVuZ3RoKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBhdHRyOwotICAgICAgCi0gICAgICAvKiBQYXJzZSB0aGUgYXR0cmlidXRlIGJhc2VkIG9uIGl0cyBmb3JtLiAgVGhpcyBzZWN0aW9uIAotICAgICAgICAgbXVzdCBoYW5kbGUgYWxsIGR3YXJmMSBmb3JtcywgYnV0IG5lZWQgb25seSBoYW5kbGUgdGhlCi0JIGFjdHVhbCBhdHRyaWJ1dGVzIHRoYXQgd2UgY2FyZSBhYm91dC4gKi8KLQotICAgICAgYXR0ciA9IGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOwotICAgICAgeHB0ciArPSAyOwotICAgICAgCi0gICAgICBzd2l0Y2ggKEZPUk1fRlJPTV9BVFRSIChhdHRyKSkKLQl7Ci0JY2FzZSBGT1JNX0RBVEEyOgotCSAgeHB0ciArPSAyOwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0RBVEE0OgotCWNhc2UgRk9STV9SRUY6Ci0JICBpZiAoYXR0ciA9PSBBVF9zaWJsaW5nKQotCSAgICBhRGllSW5mby0+c2libGluZyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgZWxzZSBpZiAoYXR0ciA9PSBBVF9zdG10X2xpc3QpCi0JICAgIHsKLQkgICAgICBhRGllSW5mby0+c3RtdF9saXN0X29mZnNldCA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgICAgIGFEaWVJbmZvLT5oYXNfc3RtdF9saXN0ID0gMTsKLQkgICAgfQotCSAgeHB0ciArPSA0OwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0RBVEE4OgotCSAgeHB0ciArPSA4OwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0FERFI6Ci0JICBpZiAoYXR0ciA9PSBBVF9sb3dfcGMpCi0JICAgIGFEaWVJbmZvLT5sb3dfcGMgPSBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIGVsc2UgaWYgKGF0dHIgPT0gQVRfaGlnaF9wYykKLQkgICAgYURpZUluZm8tPmhpZ2hfcGMgPSBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIHhwdHIgKz0gNDsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9CTE9DSzI6Ci0JICB4cHRyICs9IDIgKyBiZmRfZ2V0XzE2IChhYmZkLCB4cHRyKTsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9CTE9DSzQ6Ci0JICB4cHRyICs9IDQgKyBiZmRfZ2V0XzMyIChhYmZkLCB4cHRyKTsKLQkgIGJyZWFrOwotCWNhc2UgRk9STV9TVFJJTkc6Ci0JICBpZiAoYXR0ciA9PSBBVF9uYW1lKQotCSAgICBhRGllSW5mby0+bmFtZSA9IHhwdHI7Ci0JICB4cHRyICs9IHN0cmxlbiAoeHB0cikgKyAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYSBkd2FyZjEgbGluZSBudW1iZXIgdGFibGUgZm9yICdhVW5pdC0+c3RtdF9saXN0X29mZnNldCcKLSAgIGludG8gJ2FVbml0LT5saW5lbnVtYmVyX3RhYmxlJy4gIFJldHVybiBmYWxzZSBpZiBhbiBlcnJvciAKLSAgIG9jY3VyczsgdHJ1ZSBvdGhlcndpc2UuICovCi0gIAotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2xpbmVfdGFibGUgKHN0YXNoLCBhVW5pdCkKLSAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci17Ci0gIGNoYXIqIHhwdHI7Ci0KLSAgLyogTG9hZCB0aGUgIi5saW5lIiBzZWN0aW9uIGZyb20gdGhlIGJmZCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuICovIAotICBpZiAoc3Rhc2gtPmxpbmVfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0YXNoLT5hYmZkLCAiLmxpbmUiKTsKLSAgICAgIGlmICghIG1zZWMpCi0JcmV0dXJuIGZhbHNlOwotCSAgCi0gICAgICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChtc2VjKTsKLSAgICAgIHN0YXNoLT5saW5lX3NlY3Rpb24gPSAodW5zaWduZWQgY2hhciopIGJmZF9hbGxvYyAoc3Rhc2gtPmFiZmQsIHNpemUpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaC0+bGluZV9zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChzdGFzaC0+YWJmZCwgbXNlYywgc3Rhc2gtPmxpbmVfc2VjdGlvbiwgMCwgc2l6ZSkpCi0JewotCSAgc3Rhc2gtPmxpbmVfc2VjdGlvbiA9IDA7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdGFzaC0+bGluZV9zZWN0aW9uX2VuZCA9IHN0YXNoLT5saW5lX3NlY3Rpb24gKyBzaXplOwotICAgIH0KLQotICB4cHRyID0gc3Rhc2gtPmxpbmVfc2VjdGlvbiArIGFVbml0LT5zdG10X2xpc3Rfb2Zmc2V0OwotICBpZiAoeHB0ciA8IHN0YXNoLT5saW5lX3NlY3Rpb25fZW5kKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZWFjaExpbmU7Ci0KLSAgICAgIGNoYXIqIHRibGVuZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZTsKLQotICAgICAgLyogRmlyc3QgY29tZXMgdGhlIGxlbmd0aC4gKi8KLSAgICAgIHRibGVuZCA9IGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKSArIHhwdHI7Ci0gICAgICB4cHRyICs9IDQ7Ci0KLSAgICAgIC8qIFRoZW4gdGhlIGJhc2UgYWRkcmVzcyBmb3IgZWFjaCBhZGRyZXNzIGluIHRoZSB0YWJsZS4gKi8KLSAgICAgIGJhc2UgPSBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cik7Ci0gICAgICB4cHRyICs9IDQ7Ci0KLSAgICAgIC8qIEhvdyBtYW55IGxpbmUgZW50cnlzPwotCSAxMCA9IDQgKGxpbmUgbnVtYmVyKSArIDIgKHBvcyBpbiBsaW5lKSArIDQgKGFkZHJlc3MgaW4gbGluZSkgKi8KLSAgICAgIGFVbml0LT5saW5lX2NvdW50ID0gKHRibGVuZCAtIHhwdHIpIC8gMTA7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIGFuIGFycmF5IGZvciB0aGUgZW50cmllcy4gKi8KLSAgICAgIGFVbml0LT5saW5lbnVtYmVyX3RhYmxlID0gKHN0cnVjdCBsaW5lbnVtYmVyKikKLQliZmRfYWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJICAgc2l6ZW9mIChzdHJ1Y3QgbGluZW51bWJlcikgKiBhVW5pdC0+bGluZV9jb3VudCk7Ci0JCi0gICAgICBmb3IgKGVhY2hMaW5lID0gMDsgZWFjaExpbmUgPCBhVW5pdC0+bGluZV9jb3VudDsgZWFjaExpbmUrKykKLQl7Ci0JICAvKiBBIGxpbmUgbnVtYmVyLiAqLwotCSAgYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbZWFjaExpbmVdLmxpbmVudW1iZXIKLQkgICAgPSBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cik7Ci0JICB4cHRyICs9IDQ7Ci0KLQkgIC8qIFNraXAgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgbGluZS4gKi8KLQkgIHhwdHIgKz0gMjsKLQotCSAgLyogQW5kIGZpbmFsbHkgdGhlIGFkZHJlc3MuICovCi0JICBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtlYWNoTGluZV0uYWRkciAKLQkgICAgPSBiYXNlICsgYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpOwotCSAgeHB0ciArPSA0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGVhY2ggZnVuY3Rpb24gZGllIGluIGEgY29tcGlsYXRpb24gdW5pdCAnYVVuaXQnLgotICAgVGhlIGZpcnN0IGNoaWxkIGRpZSBvZiAnYVVuaXQnIHNob3VsZCBiZSBpbiAnYVVuaXQtPmZpcnN0X2NoaWxkJywKLSAgIHRoZSByZXN1bHQgaXMgcGxhY2VkIGluICdhVW5pdC0+ZnVuY19saXN0Jy4KLSAgIFJldHVybiBmYWxzZSBpZiBlcnJvcjsgdHJ1ZSBvdGhlcndpc2UuICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9mdW5jdGlvbnNfaW5fdW5pdCAoc3Rhc2gsIGFVbml0KQotICAgICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgICAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLXsKLSAgY2hhciogZWFjaERpZTsKLQotICBpZiAoYVVuaXQtPmZpcnN0X2NoaWxkKQotICAgIGZvciAoZWFjaERpZSA9IGFVbml0LT5maXJzdF9jaGlsZDsKLQkgZWFjaERpZSA8IHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZDsKLQkgKQotICAgICAgewotCXN0cnVjdCBkaWVfaW5mbyBlYWNoRGllSW5mbzsKLQkKLQlpZiAoISBwYXJzZV9kaWUgKHN0YXNoLT5hYmZkLCAmZWFjaERpZUluZm8sIGVhY2hEaWUpKQotCSAgcmV0dXJuIGZhbHNlOwotCQotCWlmIChlYWNoRGllSW5mby50YWcgPT0gVEFHX2dsb2JhbF9zdWJyb3V0aW5lCi0JICAgIHx8IGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfc3Vicm91dGluZQotCSAgICB8fCBlYWNoRGllSW5mby50YWcgPT0gVEFHX2lubGluZWRfc3Vicm91dGluZQotCSAgICB8fCBlYWNoRGllSW5mby50YWcgPT0gVEFHX2VudHJ5X3BvaW50KQotCSAgewotCSAgICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIGFGdW5jID0gYWxsb2NfZHdhcmYxX2Z1bmMgKHN0YXNoLGFVbml0KTsKLQkgICAgCi0JICAgIGFGdW5jLT5uYW1lID0gZWFjaERpZUluZm8ubmFtZTsKLQkgICAgYUZ1bmMtPmxvd19wYyA9IGVhY2hEaWVJbmZvLmxvd19wYzsKLQkgICAgYUZ1bmMtPmhpZ2hfcGMgPSBlYWNoRGllSW5mby5oaWdoX3BjOwotCSAgfQotCQotCS8qIE1vdmUgdG8gbmV4dCBzaWJsaW5nLCBpZiBub25lLCBlbmQgbG9vcCAqLwotCWlmIChlYWNoRGllSW5mby5zaWJsaW5nKQotCSAgZWFjaERpZSA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgZWFjaERpZUluZm8uc2libGluZzsKLQllbHNlCi0JICBicmVhazsKLSAgICAgIH0KLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdG8gJ2FkZHInIGluICdhVW5pdCcuCi0gICBSZXR1cm4gd2hldGhlciB3ZSBmb3VuZCB0aGUgbGluZSAob3IgYSBmdW5jdGlvbikgd2l0aG91dCBlcnJvci4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWR3YXJmMV91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChzdGFzaCwgYVVuaXQsIGFkZHIsIAotCQkgICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkgICAgICAgbGluZW51bWJlcl9wdHIpCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0OwotICB1bnNpZ25lZCBsb25nIGFkZHI7Ci0gIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBpbnQgbGluZV9wID0gZmFsc2U7Ci0gIGludCBmdW5jX3AgPSBmYWxzZTsKLQotICBpZiAoYVVuaXQtPmxvd19wYyA8PSBhZGRyICYmIGFkZHIgPCBhVW5pdC0+aGlnaF9wYykKLSAgICB7Ci0gICAgICBpZiAoYVVuaXQtPmhhc19zdG10X2xpc3QpCi0JewotCSAgdW5zaWduZWQgbG9uZyBpOwotCSAgc3RydWN0IGR3YXJmMV9mdW5jKiBlYWNoRnVuYzsKLQotCSAgaWYgKCEgYVVuaXQtPmxpbmVudW1iZXJfdGFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISBwYXJzZV9saW5lX3RhYmxlIChzdGFzaCwgYVVuaXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKCEgYVVuaXQtPmZ1bmNfbGlzdCkKLQkgICAgewotCSAgICAgIGlmICghIHBhcnNlX2Z1bmN0aW9uc19pbl91bml0IChzdGFzaCwgYVVuaXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IGFVbml0LT5saW5lX2NvdW50OyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbaV0uYWRkciA8PSBhZGRyCi0JCSAgJiYgYWRkciA8IGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2krMV0uYWRkcikKLQkJewotCQkgICpmaWxlbmFtZV9wdHIgPSBhVW5pdC0+bmFtZTsKLQkJICAqbGluZW51bWJlcl9wdHIgPSBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtpXS5saW5lbnVtYmVyOwotCQkgIGxpbmVfcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBmb3IgKGVhY2hGdW5jID0gYVVuaXQtPmZ1bmNfbGlzdDsgCi0JICAgICAgIGVhY2hGdW5jOyAKLQkgICAgICAgZWFjaEZ1bmMgPSBlYWNoRnVuYy0+cHJldikKLQkgICAgewotCSAgICAgIGlmIChlYWNoRnVuYy0+bG93X3BjIDw9IGFkZHIKLQkJICAmJiBhZGRyIDwgZWFjaEZ1bmMtPmhpZ2hfcGMpCi0JCXsKLQkJICAqZnVuY3Rpb25uYW1lX3B0ciA9IGVhY2hGdW5jLT5uYW1lOwotCQkgIGZ1bmNfcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGxpbmVfcCB8fCBmdW5jX3A7Ci19Ci0KLQotCi0KLS8qIFRoZSBEV0FSRiAxIHZlcnNpb24gb2YgZmluZF9uZWFyZXN0IGxpbmUuCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZSBpcyBmb3VuZCB3aXRob3V0IGVycm9yLiAqLwotCi1ib29sZWFuCi1fYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lbnVtYmVyX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnICpzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMV9maW5kX2xpbmVfaW5mbzsKLQotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGVhY2hVbml0OwotCi0gIC8qIFdoYXQgYWRkcmVzcyBhcmUgd2UgbG9va2luZyBmb3I/ICovCi0gIGJmZF92bWEgYWRkciA9IG9mZnNldCArIHNlY3Rpb24tPnZtYTsKLQotICAqZmlsZW5hbWVfcHRyID0gTlVMTDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBOVUxMOwotICAqbGluZW51bWJlcl9wdHIgPSAwOwotICAKLQotICBpZiAoISBzdGFzaCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbXNlYzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICAgIAotICAgICAgc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjFfZmluZF9saW5lX2luZm8gPQotCShzdHJ1Y3QgZHdhcmYxX2RlYnVnKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYxX2RlYnVnKSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0gICAgICBpZiAoISBtc2VjKQotCXsKLQkgIC8qIE5vIGR3YXJmMSBpbmZvLiAgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHN0YXNoCi0JICAgICBoYXMgYmVlbiBhbGxvY2F0ZWQsIGJ1dCBjb250YWlucyB6ZXJvcywgdGhpcyBsZXRzCi0JICAgICBmdXR1cmUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBmYWlsIHF1aWNrZXIuICovCi0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChtc2VjKTsKLSAgICAgIHN0YXNoLT5kZWJ1Z19zZWN0aW9uID0gKHVuc2lnbmVkIGNoYXIqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaC0+ZGVidWdfc2VjdGlvbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbXNlYywgc3Rhc2gtPmRlYnVnX3NlY3Rpb24sIDAsIHNpemUpKQotCXsKLQkgIHN0YXNoLT5kZWJ1Z19zZWN0aW9uID0gMDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZCA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgc2l6ZTsKLSAgICAgIHN0YXNoLT5jdXJyZW50RGllID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb247Ci0gICAgICBzdGFzaC0+YWJmZCA9IGFiZmQ7Ci0gICAgfQotCi0gIC8qIEEgbnVsbCBkZWJ1Z19zZWN0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBubyBkd2FyZjEgaW5mbwotICAgICBvciB0aGF0IGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgc2V0dGluZyB1cCB0aGUgc3Rhc2guICovCi0KLSAgaWYgKCEgc3Rhc2gtPmRlYnVnX3NlY3Rpb24pCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLQotICAvKiBMb29rIGF0IHRoZSBwcmV2aW91c2x5IHBhcnNlZCB1bml0cyB0byBzZWUgaWYgYW55IGNvbnRhaW4KLSAgICAgdGhlIGFkZHIuICovCi0gIGZvciAoZWFjaFVuaXQgPSBzdGFzaC0+bGFzdFVuaXQ7IGVhY2hVbml0OyBlYWNoVW5pdCA9IGVhY2hVbml0LT5wcmV2KQotICAgIHsKLSAgICAgIGlmIChlYWNoVW5pdC0+bG93X3BjIDw9IGFkZHIgJiYgYWRkciA8IGVhY2hVbml0LT5oaWdoX3BjKQotCXJldHVybiBkd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoc3Rhc2gsIGVhY2hVbml0LCBhZGRyLAotCQkJCQkgICAgICBmaWxlbmFtZV9wdHIsIAotCQkJCQkgICAgICBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkJICAgICAgbGluZW51bWJlcl9wdHIpOwotICAgIH0KLQotICB3aGlsZSAoc3Rhc2gtPmN1cnJlbnREaWUgPCBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGRpZV9pbmZvIGFEaWVJbmZvOwotCi0gICAgICBpZiAoISBwYXJzZV9kaWUgKHN0YXNoLT5hYmZkLCAmYURpZUluZm8sIHN0YXNoLT5jdXJyZW50RGllKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIGlmIChhRGllSW5mby50YWcgPT0gVEFHX2NvbXBpbGVfdW5pdCkKLQl7Ci0JICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0Ci0JICAgID0gYWxsb2NfZHdhcmYxX3VuaXQgKHN0YXNoKTsKLQkgIAotCSAgYVVuaXQtPm5hbWUgPSBhRGllSW5mby5uYW1lOwotCSAgYVVuaXQtPmxvd19wYyA9IGFEaWVJbmZvLmxvd19wYzsKLQkgIGFVbml0LT5oaWdoX3BjID0gYURpZUluZm8uaGlnaF9wYzsKLQkgIGFVbml0LT5oYXNfc3RtdF9saXN0ID0gYURpZUluZm8uaGFzX3N0bXRfbGlzdDsKLQkgIGFVbml0LT5zdG10X2xpc3Rfb2Zmc2V0ID0gYURpZUluZm8uc3RtdF9saXN0X29mZnNldDsKLQkgIAotCSAgLyogQSBkaWUgaGFzIGEgY2hpbGQgaWYgaXQncyBmb2xsb3dlZCBieSBhIGRpZSB0aGF0IGlzCi0JICAgICBub3QgaXQncyBzaWJsaW5nLiAqLwotCSAgaWYgKGFEaWVJbmZvLnNpYmxpbmcgCi0JICAgICAgJiYgc3Rhc2gtPmN1cnJlbnREaWUgKyBhRGllSW5mby5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgIDwgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kCi0JICAgICAgJiYgc3Rhc2gtPmN1cnJlbnREaWUgKyBhRGllSW5mby5sZW5ndGggCi0JICAgICAgICAgICAgIT0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBhRGllSW5mby5zaWJsaW5nKQotCSAgICBhVW5pdC0+Zmlyc3RfY2hpbGQgPSBzdGFzaC0+Y3VycmVudERpZSArIGFEaWVJbmZvLmxlbmd0aDsKLQkgIGVsc2UKLQkgICAgYVVuaXQtPmZpcnN0X2NoaWxkID0gMDsKLQotCSAgaWYgKGFVbml0LT5sb3dfcGMgPD0gYWRkciAmJiBhZGRyIDwgYVVuaXQtPmhpZ2hfcGMpCi0JICAgIHJldHVybiBkd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoc3Rhc2gsIGFVbml0LCBhZGRyLCAKLQkJCQkJCSAgZmlsZW5hbWVfcHRyLCAKLQkJCQkJCSAgZnVuY3Rpb25uYW1lX3B0ciwgCi0JCQkJCQkgIGxpbmVudW1iZXJfcHRyKTsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChhRGllSW5mby5zaWJsaW5nICE9IDApCi0Jc3Rhc2gtPmN1cnJlbnREaWUgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIGFEaWVJbmZvLnNpYmxpbmc7Ci0gICAgICBlbHNlCi0Jc3Rhc2gtPmN1cnJlbnREaWUgKz0gYURpZUluZm8ubGVuZ3RoOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogRU9GICovCmRpZmYgLS1naXQgYS9iZmQvZHdhcmYyLmMgYi9iZmQvZHdhcmYyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTBkMWEuLjAwMDAwMDAKLS0tIGEvYmZkL2R3YXJmMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYyMSArMCwwIEBACi0vKiBEV0FSRiAyIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBBZGFwdGVkIGZyb20gZ2RiL2R3YXJmMnJlYWQuYyBieSBHYXZpbiBLb2NoIG9mIEN5Z251cyBTb2x1dGlvbnMKLSAgIChnYXZpbkBjeWdudXMuY29tKS4KLQotICAgRnJvbSB0aGUgZHdhcmYycmVhZC5jIGhlYWRlcjoKLSAgIEFkYXB0ZWQgYnkgR2FyeSBGdW5jayAoZ2FyeUBpbnRyZXBpZC5jb20pLCBJbnRyZXBpZCBUZWNobm9sb2d5LAotICAgSW5jLiAgd2l0aCBzdXBwb3J0IGZyb20gRmxvcmlkYSBTdGF0ZSBVbml2ZXJzaXR5ICh1bmRlciBjb250cmFjdAotICAgd2l0aCB0aGUgQWRhIEpvaW50IFByb2dyYW0gT2ZmaWNlKSwgYW5kIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAgIEluaXRpYWwgY29udHJpYnV0aW9uIGJ5IEJyZW50IEJlbnNvbiwgSGFycmlzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4sCi0gICBiYXNlZCBvbiBGcmVkIEZpc2gncyAoQ3lnbnVzIFN1cHBvcnQpIGltcGxlbWVudGF0aW9uIG9mIERXQVJGIDEKLSAgIHN1cHBvcnQgaW4gZHdhcmZyZWFkLmMKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAoteW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9kd2FyZjIuaCIKLQotLyogVGhlIGRhdGEgaW4gdGhlIC5kZWJ1Z19saW5lIHN0YXRlbWVudCBwcm9sb2d1ZSBsb29rcyBsaWtlIHRoaXMuICAqLwotc3RydWN0IGxpbmVfaGVhZAotICB7Ci0gICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aDsKLSAgICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwotICAgIHVuc2lnbmVkIGludCBwcm9sb2d1ZV9sZW5ndGg7Ci0gICAgdW5zaWduZWQgY2hhciBtaW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aDsKLSAgICB1bnNpZ25lZCBjaGFyIGRlZmF1bHRfaXNfc3RtdDsKLSAgICBpbnQgbGluZV9iYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgbGluZV9yYW5nZTsKLSAgICB1bnNpZ25lZCBjaGFyIG9wY29kZV9iYXNlOwotICAgIHVuc2lnbmVkIGNoYXIgKnN0YW5kYXJkX29wY29kZV9sZW5ndGhzOwotICB9OwotCi0vKiBBdHRyaWJ1dGVzIGhhdmUgYSBuYW1lIGFuZCBhIHZhbHVlICovCi1zdHJ1Y3QgYXR0cmlidXRlCi0gIHsKLSAgICBlbnVtIGR3YXJmX2F0dHJpYnV0ZSBuYW1lOwotICAgIGVudW0gZHdhcmZfZm9ybSBmb3JtOwotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqc3RyOwotCXN0cnVjdCBkd2FyZl9ibG9jayAqYmxrOwotCXVuc2lnbmVkIGludCB1bnNuZDsKLQlpbnQgc25kOwotCWJmZF92bWEgYWRkcjsKLSAgICAgIH0KLSAgICB1OwotICB9OwotCi0vKiBHZXQgYXQgcGFydHMgb2YgYW4gYXR0cmlidXRlIHN0cnVjdHVyZSAqLwotCi0jZGVmaW5lIERXX1NUUklORyhhdHRyKSAgICAoKGF0dHIpLT51LnN0cikKLSNkZWZpbmUgRFdfVU5TTkQoYXR0cikgICAgICgoYXR0ciktPnUudW5zbmQpCi0jZGVmaW5lIERXX0JMT0NLKGF0dHIpICAgICAoKGF0dHIpLT51LmJsaykKLSNkZWZpbmUgRFdfU05EKGF0dHIpICAgICAgICgoYXR0ciktPnUuc25kKQotI2RlZmluZSBEV19BRERSKGF0dHIpCSAgICgoYXR0ciktPnUuYWRkcikKLQotLyogQmxvY2tzIGFyZSBhIGJ1bmNoIG9mIHVudHlwZWQgYnl0ZXMuICovCi1zdHJ1Y3QgZHdhcmZfYmxvY2sKLSAgewotICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgIGNoYXIgKmRhdGE7Ci0gIH07Ci0KLQotc3RydWN0IGR3YXJmMl9kZWJ1ZyB7Ci0KLSAgLyogQSBsaXN0IG9mIGFsbCBwcmV2aW91c2x5IHJlYWQgY29tcF91bml0cy4gKi8KLSAgc3RydWN0IGNvbXBfdW5pdCogYWxsX2NvbXBfdW5pdHM7Ci0KLSAgLyogVGhlIG5leHQgdW5yZWFkIGNvbXBpbGF0aW9uIHVuaXQgd2l0aGluIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLgotICAgICBaZXJvIGluZGljYXRlcyB0aGF0IHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIGhhcyBub3QgYmVlbiBsb2FkZWQKLSAgICAgaW50byBhIGJ1ZmZlciB5ZXQuKi8KLSAgY2hhciogaW5mb19wdHI7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIG1lbW9yeSBidWZmZXIuICovCi0gIGNoYXIqIGluZm9fcHRyX2VuZDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSAuZGVidWdfYWJicmV2IHNlY3Rpb24gbG9hZGVkIGludG8gbWVtb3J5LiAqLwotICBjaGFyKiBkd2FyZl9hYmJyZXZfYnVmZmVyOwotCi0gIC8qIExlbmd0aCBvZiB0aGUgbG9hZGVkIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgbG9uZyBkd2FyZl9hYmJyZXZfc2l6ZTsKLQotICAvKiBCdWZmZXIgZm9yIGRlY29kZV9saW5lX2luZm8uICAqLwotICBjaGFyICpkd2FyZl9saW5lX2J1ZmZlcjsKLX07Ci0KLXN0cnVjdCBhcmFuZ2UgewotICBzdHJ1Y3QgYXJhbmdlICpuZXh0OwotICBiZmRfdm1hIGxvdzsKLSAgYmZkX3ZtYSBoaWdoOwotfTsKLQotCi0vKiBBIG1pbmltYWwgZGVjb2Rpbmcgb2YgRFdBUkYyIGNvbXBpbGF0aW9uIHVuaXRzLiAgV2Ugb25seSBkZWNvZGUKLSAgIHdoYXQncyBuZWVkZWQgdG8gZ2V0IHRvIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gKi8KLQotc3RydWN0IGNvbXBfdW5pdCB7Ci0KLSAgLyogQ2hhaW4gdGhlIHByZXZpb3VzbHkgcmVhZCBjb21waWxhdGlvbiB1bml0cy4gKi8KLSAgc3RydWN0IGNvbXBfdW5pdCogbmV4dF91bml0OwotCi0gIC8qIEtlZXAgdGhlIGJkZiBjb252ZW5pZW50IChmb3IgbWVtb3J5IGFsbG9jYXRpb24pLiAqLwotICBiZmQqIGFiZmQ7Ci0KLSAgLyogVGhlIGxvd2VzdCBhbmQgaGlnZXN0IGFkZHJlc3NlcyBjb250YWluZWQgaW4gdGhpcyBjb21waWxhdGlvbgotICAgICB1bml0IGFzIHNwZWNpZmllZCBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoZWFkZXIuICovCi0gIHN0cnVjdCBhcmFuZ2UgYXJhbmdlOwotCi0gIC8qIFRoZSBEV19BVF9uYW1lIGF0dHJpYnV0ZSAoZm9yIGVycm9yIG1lc3NhZ2VzKS4gKi8KLSAgY2hhciogbmFtZTsKLQotICAvKiBUaGUgYWJicmV2IGhhc2ggdGFibGUuICovCi0gIHN0cnVjdCBhYmJyZXZfaW5mbyoqIGFiYnJldnM7Ci0KLSAgLyogTm90ZSB0aGF0IGFuIGVycm9yIHdhcyBmb3VuZCBieSBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUuICovCi0gIGludCBlcnJvcjsKLQotICAvKiBUaGUgRFdfQVRfY29tcF9kaXIgYXR0cmlidXRlICovCi0gIGNoYXIqIGNvbXBfZGlyOwotCi0gIC8qIFRydWUgaWYgdGhlcmUgaXMgYSBsaW5lIG51bWJlciB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wLiB1bml0LiAqLwotICBpbnQgc3RtdGxpc3Q7Ci0gIAotICAvKiBUaGUgb2Zmc2V0IGludG8gLmRlYnVnX2xpbmUgb2YgdGhlIGxpbmUgbnVtYmVyIHRhYmxlLiAqLwotICB1bnNpZ25lZCBsb25nIGxpbmVfb2Zmc2V0OwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoaWxkIGRpZSBmb3IgdGhlIGNvbXAgdW5pdC4gKi8KLSAgY2hhciAqZmlyc3RfY2hpbGRfZGllX3B0cjsKLQotICAvKiBUaGUgZW5kIG9mIHRoZSBjb21wIHVuaXQuICovCi0gIGNoYXIgKmVuZF9wdHI7Ci0KLSAgLyogVGhlIGRlY29kZWQgbGluZSBudW1iZXIsIE5VTEwgaWYgbm90IHlldCBkZWNvZGVkLiAqLwotICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiBsaW5lX3RhYmxlOwotCi0gIC8qIEEgbGlzdCBvZiB0aGUgZnVuY3Rpb25zIGZvdW5kIGluIHRoaXMgY29tcC4gdW5pdC4gKi8KLSAgc3RydWN0IGZ1bmNpbmZvKiBmdW5jdGlvbl90YWJsZTsgCi0KLSAgLyogQWRkcmVzcyBzaXplIGZvciB0aGlzIHVuaXQgLSBmcm9tIHVuaXQgaGVhZGVyICovCi0gIHVuc2lnbmVkIGNoYXIgYWRkcl9zaXplOwotfTsKLQotCi0KLS8qIFZFUkJBVElNIAotICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiB1cCB0byB0aGUgRU5EIFZFUkJBVElNIG1hcmsgYXJlIAotICAgY29waWVkIGRpcmVjdGx5IGZyb20gZHdhcmYycmVhZC5jLiAqLwotCi0vKiByZWFkIGR3YXJmIGluZm9ybWF0aW9uIGZyb20gYSBidWZmZXIgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcmVhZF8xX2J5dGUgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlYWRfMV9zaWduZWRfYnl0ZSAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqYnVmOwotewotICByZXR1cm4gYmZkX2dldF9zaWduZWRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfMl9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCB1c2VkLiAgKi8KLQotc3RhdGljIGludAotcmVhZF8yX3NpZ25lZF9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfNF9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCB1c2VkLiAgKi8KLQotc3RhdGljIGludAotcmVhZF80X3NpZ25lZF9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfOF9ieXRlcyAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFkX25fYnl0ZXMgKGFiZmQsIGJ1Ziwgc2l6ZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdW5zaWduZWQgaW50IHNpemUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogSWYgdGhlIHNpemUgb2YgYSBob3N0IGNoYXIgaXMgOCBiaXRzLCB3ZSBjYW4gcmV0dXJuIGEgcG9pbnRlcgotICAgICB0byB0aGUgYnVmZmVyLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byBjb3B5IHRoZSBkYXRhIHRvIGEgYnVmZmVyCi0gICAgIGFsbG9jYXRlZCBvbiB0aGUgdGVtcG9yYXJ5IG9ic3RhY2suICAqLwotICByZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFkX3N0cmluZyAoYWJmZCwgYnVmLCBieXRlc19yZWFkX3B0cikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdW5zaWduZWQgaW50ICpieXRlc19yZWFkX3B0cjsKLXsKLSAgLyogSWYgdGhlIHNpemUgb2YgYSBob3N0IGNoYXIgaXMgOCBiaXRzLCB3ZSBjYW4gcmV0dXJuIGEgcG9pbnRlcgotICAgICB0byB0aGUgc3RyaW5nLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byBjb3B5IHRoZSBzdHJpbmcgdG8gYSBidWZmZXIKLSAgICAgYWxsb2NhdGVkIG9uIHRoZSB0ZW1wb3Jhcnkgb2JzdGFjay4gICovCi0gIGlmICgqYnVmID09ICdcMCcpCi0gICAgewotICAgICAgKmJ5dGVzX3JlYWRfcHRyID0gMTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgKmJ5dGVzX3JlYWRfcHRyID0gc3RybGVuIChidWYpICsgMTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCAgcmVzdWx0OwotICB1bnNpZ25lZCBpbnQgIG51bV9yZWFkOwotICBpbnQgICAgICAgICAgIHNoaWZ0OwotICB1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0KLSAgcmVzdWx0ICAgPSAwOwotICBzaGlmdCAgICA9IDA7Ci0gIG51bV9yZWFkID0gMDsKLSAgCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgICBidWYgKys7Ci0gICAgICBudW1fcmVhZCArKzsKLSAgICAgIHJlc3VsdCB8PSAoKGJ5dGUgJiAweDdmKSA8PCBzaGlmdCk7Ci0gICAgICBzaGlmdCArPSA3OwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLSAgCi0gICogYnl0ZXNfcmVhZF9wdHIgPSBudW1fcmVhZDsKLSAgCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlYWRfc2lnbmVkX2xlYjEyOCAoYWJmZCwgYnVmLCBieXRlc19yZWFkX3B0cikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdW5zaWduZWQgaW50ICogYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIGludCAgICAgICAgICAgcmVzdWx0OwotICBpbnQgICAgICAgICAgIHNoaWZ0OwotICBpbnQgICAgICAgICAgIG51bV9yZWFkOwotICB1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0KLSAgcmVzdWx0ID0gMDsKLSAgc2hpZnQgPSAwOwotICBudW1fcmVhZCA9IDA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLSAgICAgIGJ1ZiArKzsKLSAgICAgIG51bV9yZWFkICsrOwotICAgICAgcmVzdWx0IHw9ICgoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0KTsKLSAgICAgIHNoaWZ0ICs9IDc7Ci0gICAgfQotICB3aGlsZSAoYnl0ZSAmIDB4ODApOwotICAKLSAgaWYgKChzaGlmdCA8IDMyKSAmJiAoYnl0ZSAmIDB4NDApKQotICAgIHJlc3VsdCB8PSAtKDEgPDwgc2hpZnQpOwotCi0gICogYnl0ZXNfcmVhZF9wdHIgPSBudW1fcmVhZDsKLSAgCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEVORCBWRVJCQVRJTSAqLwotCi1zdGF0aWMgYmZkX3ZtYQotcmVhZF9hZGRyZXNzICh1bml0LCBidWYpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgc3dpdGNoICh1bml0LT5hZGRyX3NpemUpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiBiZmRfZ2V0XzY0ICh1bml0LT5hYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gYmZkX2dldF8zMiAodW5pdC0+YWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIGJmZF9nZXRfMTYgKHVuaXQtPmFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLQotCi0KLQotLyogVGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgYW4gYWJicmV2LiAqLwotc3RydWN0IGFiYnJldl9pbmZvCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbnVtYmVyOwkvKiBudW1iZXIgaWRlbnRpZnlpbmcgYWJicmV2ICovCi0gICAgZW51bSBkd2FyZl90YWcgdGFnOwkJLyogZHdhcmYgdGFnICovCi0gICAgaW50IGhhc19jaGlsZHJlbjsJCS8qIGJvb2xlYW4gKi8KLSAgICB1bnNpZ25lZCBpbnQgbnVtX2F0dHJzOwkvKiBudW1iZXIgb2YgYXR0cmlidXRlcyAqLwotICAgIHN0cnVjdCBhdHRyX2FiYnJldiAqYXR0cnM7CS8qIGFuIGFycmF5IG9mIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbnMgKi8KLSAgICBzdHJ1Y3QgYWJicmV2X2luZm8gKm5leHQ7CS8qIG5leHQgaW4gY2hhaW4gKi8KLSAgfTsKLQotc3RydWN0IGF0dHJfYWJicmV2Ci0gIHsKLSAgICBlbnVtIGR3YXJmX2F0dHJpYnV0ZSBuYW1lOwotICAgIGVudW0gZHdhcmZfZm9ybSBmb3JtOwotICB9OwotCi0jaWZuZGVmIEFCQlJFVl9IQVNIX1NJWkUKLSNkZWZpbmUgQUJCUkVWX0hBU0hfU0laRSAxMjEKLSNlbmRpZgotI2lmbmRlZiBBVFRSX0FMTE9DX0NIVU5LCi0jZGVmaW5lIEFUVFJfQUxMT0NfQ0hVTksgNAotI2VuZGlmCi0KLS8qIExvb2t1cCBhbiBhYmJyZXZfaW5mbyBzdHJ1Y3R1cmUgaW4gdGhlIGFiYnJldiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBhYmJyZXZfaW5mbyAqCi1sb29rdXBfYWJicmV2IChudW1iZXIsYWJicmV2cykKLSAgICAgdW5zaWduZWQgaW50IG51bWJlcjsKLSAgICAgc3RydWN0IGFiYnJldl9pbmZvICoqYWJicmV2czsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2hfbnVtYmVyOwotICBzdHJ1Y3QgYWJicmV2X2luZm8gKmFiYnJldjsKLQotICBoYXNoX251bWJlciA9IG51bWJlciAlIEFCQlJFVl9IQVNIX1NJWkU7Ci0gIGFiYnJldiA9IGFiYnJldnNbaGFzaF9udW1iZXJdOwotCi0gIHdoaWxlIChhYmJyZXYpCi0gICAgewotICAgICAgaWYgKGFiYnJldi0+bnVtYmVyID09IG51bWJlcikKLQlyZXR1cm4gYWJicmV2OwotICAgICAgZWxzZQotCWFiYnJldiA9IGFiYnJldi0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBJbiBEV0FSRiB2ZXJzaW9uIDIsIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzCi0gICBzdG9yZWQgaW4gYSBzZXBhcmF0ZSAuZGVidWdfYWJicmV2IHNlY3Rpb24uICBCZWZvcmUgd2UgcmVhZCBhbnkKLSAgIGRpZXMgZnJvbSBhIHNlY3Rpb24gd2UgcmVhZCBpbiBhbGwgYWJicmV2aWF0aW9ucyBhbmQgaW5zdGFsbCB0aGVtCi0gICBpbiBhIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGFiYnJldl9pbmZvKioKLXJlYWRfYWJicmV2cyAoYWJmZCwgb2Zmc2V0KQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotewotICBzdHJ1Y3QgYWJicmV2X2luZm8gKiphYmJyZXZzOwotICBjaGFyICphYmJyZXZfcHRyOwotICBzdHJ1Y3QgYWJicmV2X2luZm8gKmN1cl9hYmJyZXY7Ci0gIHVuc2lnbmVkIGludCBhYmJyZXZfbnVtYmVyLCBieXRlc19yZWFkLCBhYmJyZXZfbmFtZTsKLSAgdW5zaWduZWQgaW50IGFiYnJldl9mb3JtLCBoYXNoX251bWJlcjsKLSAgc3RydWN0IGR3YXJmMl9kZWJ1ZyAqc3Rhc2g7Ci0KLSAgc3Rhc2ggPSBlbGZfdGRhdGEoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICBpZiAoISBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlcikKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbXNlYzsKLQotICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnX2FiYnJldiIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4iKSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIAotICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplID0gbXNlYy0+X3Jhd19zaXplOwotICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIgPSAoY2hhciopIGJmZF9hbGxvYyAoYWJmZCwgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKTsKLSAgICAgIGlmICghIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyKQotCSAgcmV0dXJuIDA7Ci0gICAgICAKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbXNlYywgCi0JCQkJICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIsIDAsCi0JCQkJICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKG9mZnNldCA+IHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBBYmJyZXYgb2Zmc2V0ICgldSkgYmlnZ2VyIHRoYW4gYWJicmV2IHNpemUgKCV1KS4iKSwgCi0JCQkgICAgIG9mZnNldCwgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhYmJyZXZzID0gKHN0cnVjdCBhYmJyZXZfaW5mbyoqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2Yoc3RydWN0IGFiYnJldl9pbmZvKikgKiBBQkJSRVZfSEFTSF9TSVpFKTsKLQotICBhYmJyZXZfcHRyID0gc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIgKyBvZmZzZXQ7Ci0gIGFiYnJldl9udW1iZXIgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgLyogbG9vcCB1bnRpbCB3ZSByZWFjaCBhbiBhYmJyZXYgbnVtYmVyIG9mIDAgKi8KLSAgd2hpbGUgKGFiYnJldl9udW1iZXIpCi0gICAgewotICAgICAgY3VyX2FiYnJldiA9IChzdHJ1Y3QgYWJicmV2X2luZm8qKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFiYnJldl9pbmZvKSk7Ci0KLSAgICAgIC8qIHJlYWQgaW4gYWJicmV2IGhlYWRlciAqLwotICAgICAgY3VyX2FiYnJldi0+bnVtYmVyID0gYWJicmV2X251bWJlcjsKLSAgICAgIGN1cl9hYmJyZXYtPnRhZyA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBjdXJfYWJicmV2LT5oYXNfY2hpbGRyZW4gPSByZWFkXzFfYnl0ZSAoYWJmZCwgYWJicmV2X3B0cik7Ci0gICAgICBhYmJyZXZfcHRyICs9IDE7Ci0KLSAgICAgIC8qIG5vdyByZWFkIGluIGRlY2xhcmF0aW9ucyAqLwotICAgICAgYWJicmV2X25hbWUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYWJicmV2X2Zvcm0gPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgd2hpbGUgKGFiYnJldl9uYW1lKQotCXsKLQkgIGlmICgoY3VyX2FiYnJldi0+bnVtX2F0dHJzICUgQVRUUl9BTExPQ19DSFVOSykgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cl9hYmJyZXYtPmF0dHJzID0gKHN0cnVjdCBhdHRyX2FiYnJldiAqKQotCQliZmRfcmVhbGxvYyAoY3VyX2FiYnJldi0+YXR0cnMsCi0JCQkgICAgIChjdXJfYWJicmV2LT5udW1fYXR0cnMgKyBBVFRSX0FMTE9DX0NIVU5LKQotCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGF0dHJfYWJicmV2KSk7Ci0JICAgICAgaWYgKCEgY3VyX2FiYnJldi0+YXR0cnMpCi0JCXJldHVybiAwOwotCSAgICB9Ci0JICBjdXJfYWJicmV2LT5hdHRyc1tjdXJfYWJicmV2LT5udW1fYXR0cnNdLm5hbWUgPSBhYmJyZXZfbmFtZTsKLQkgIGN1cl9hYmJyZXYtPmF0dHJzW2N1cl9hYmJyZXYtPm51bV9hdHRycysrXS5mb3JtID0gYWJicmV2X2Zvcm07Ci0JICBhYmJyZXZfbmFtZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JICBhYmJyZXZfZm9ybSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JfQotCi0gICAgICBoYXNoX251bWJlciA9IGFiYnJldl9udW1iZXIgJSBBQkJSRVZfSEFTSF9TSVpFOwotICAgICAgY3VyX2FiYnJldi0+bmV4dCA9IGFiYnJldnNbaGFzaF9udW1iZXJdOwotICAgICAgYWJicmV2c1toYXNoX251bWJlcl0gPSBjdXJfYWJicmV2OwotCi0gICAgICAvKiBHZXQgbmV4dCBhYmJyZXZpYXRpb24uCi0gICAgICAgICBVbmRlciBJcml4NiB0aGUgYWJicmV2aWF0aW9ucyBmb3IgYSBjb21waWxhdGlvbiB1bml0IGFyZSBub3QKLQkgYWx3YXlzIHByb3Blcmx5IHRlcm1pbmF0ZWQgd2l0aCBhbiBhYmJyZXYgbnVtYmVyIG9mIDAuCi0JIEV4aXQgbG9vcCBpZiB3ZSBlbmNvdW50ZXIgYW4gYWJicmV2aWF0aW9uIHdoaWNoIHdlIGhhdmUKLQkgYWxyZWFkeSByZWFkICh3aGljaCBtZWFucyB3ZSBhcmUgYWJvdXQgdG8gcmVhZCB0aGUgYWJicmV2aWF0aW9ucwotCSBmb3IgdGhlIG5leHQgY29tcGlsZSB1bml0KSBvciBpZiB0aGUgZW5kIG9mIHRoZSBhYmJyZXZpYXRpb24KLQkgdGFibGUgaXMgcmVhY2hlZC4gICovCi0gICAgICBpZiAoKHVuc2lnbmVkIGludCkgKGFiYnJldl9wdHIgLSBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlcikKLQkgICAgPj0gc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKQotCWJyZWFrOwotICAgICAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBpZiAobG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlcixhYmJyZXZzKSAhPSBOVUxMKQotCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYWJicmV2czsKLX0KLQotLyogUmVhZCBhbiBhdHRyaWJ1dGUgZGVzY3JpYmVkIGJ5IGFuIGFiYnJldmlhdGVkIGF0dHJpYnV0ZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLXJlYWRfYXR0cmlidXRlIChhdHRyLCBhYmJyZXYsIHVuaXQsIGluZm9fcHRyKQotICAgICBzdHJ1Y3QgYXR0cmlidXRlICAgKmF0dHI7Ci0gICAgIHN0cnVjdCBhdHRyX2FiYnJldiAqYWJicmV2OwotICAgICBzdHJ1Y3QgY29tcF91bml0ICAgKnVuaXQ7Ci0gICAgIGNoYXIgICAgICAgICAgICAgICAqaW5mb19wdHI7Ci17Ci0gIGJmZCAqYWJmZCA9IHVuaXQtPmFiZmQ7Ci0gIHVuc2lnbmVkIGludCBieXRlc19yZWFkOwotICBzdHJ1Y3QgZHdhcmZfYmxvY2sgKmJsazsKLQotICBhdHRyLT5uYW1lID0gYWJicmV2LT5uYW1lOwotICBhdHRyLT5mb3JtID0gYWJicmV2LT5mb3JtOwotICBzd2l0Y2ggKGFiYnJldi0+Zm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX2FkZHI6Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgotICAgICAgRFdfQUREUiAoYXR0cikgPSByZWFkX2FkZHJlc3MgKHVuaXQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IHVuaXQtPmFkZHJfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMjsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDQ7Ci0gICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOwotICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOwotICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGEyOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE0OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE4OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF84X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3N0cmluZzoKLSAgICAgIERXX1NUUklORyAoYXR0cikgPSByZWFkX3N0cmluZyAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTE6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9mbGFnOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fc2RhdGE6Ci0gICAgICBEV19TTkQgKGF0dHIpID0gcmVhZF9zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV91ZGF0YToKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWYxOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmMjoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWY0OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjg6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzhfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3N0cnA6Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OgotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBJbnZhbGlkIG9yIHVuaGFuZGxlZCBGT1JNIHZhbHVlOiAlZC4iKSwKLQkJCSAgICAgYWJicmV2LT5mb3JtKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLSAgcmV0dXJuIGluZm9fcHRyOwotfQotCi0KLS8qIFNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHRhYmxlIHJvdXRpbmVzLiAqLwotCi0jZGVmaW5lIEZJTEVfQUxMT0NfQ0hVTksgNQotI2RlZmluZSBESVJfQUxMT0NfQ0hVTksgNQotCi1zdHJ1Y3QgbGluZV9pbmZvIHsKLSAgc3RydWN0IGxpbmVfaW5mbyogcHJldl9saW5lOwotCi0gIGJmZF92bWEgYWRkcmVzczsKLSAgY2hhciogZmlsZW5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICBpbnQgZW5kX3NlcXVlbmNlOwkJLyogZW5kIG9mIChzZXF1ZW50aWFsKSBjb2RlIHNlcXVlbmNlICovCi19OwotCi1zdHJ1Y3QgZmlsZWluZm8gewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZGlyOwotICB1bnNpZ25lZCBpbnQgdGltZTsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi1zdHJ1Y3QgbGluZV9pbmZvX3RhYmxlIHsKLSAgYmZkKiBhYmZkOwotCi0gIHVuc2lnbmVkIGludCBudW1fZmlsZXM7Ci0gIHVuc2lnbmVkIGludCBudW1fZGlyczsKLQotICBjaGFyKiBjb21wX2RpcjsKLSAgY2hhcioqIGRpcnM7Ci0gIHN0cnVjdCBmaWxlaW5mbyogZmlsZXM7Ci0gIHN0cnVjdCBsaW5lX2luZm8qIGxhc3RfbGluZTsKLX07Ci0KLXN0YXRpYyB2b2lkIAotYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIGVuZF9zZXF1ZW5jZSkKLSAgICAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgY2hhciogZmlsZW5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICAgICBpbnQgZW5kX3NlcXVlbmNlOwotewotICBzdHJ1Y3QgbGluZV9pbmZvKiBpbmZvID0gKHN0cnVjdCBsaW5lX2luZm8qKQotICAgIGJmZF9hbGxvYyAodGFibGUtPmFiZmQsIHNpemVvZiAoc3RydWN0IGxpbmVfaW5mbykpOwotCi0gIGluZm8tPnByZXZfbGluZSA9IHRhYmxlLT5sYXN0X2xpbmU7Ci0gIHRhYmxlLT5sYXN0X2xpbmUgPSBpbmZvOwotCi0gIGluZm8tPmFkZHJlc3MgPSBhZGRyZXNzOwotICBpbmZvLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBpbmZvLT5saW5lID0gbGluZTsKLSAgaW5mby0+Y29sdW1uID0gY29sdW1uOwotICBpbmZvLT5lbmRfc2VxdWVuY2UgPSBlbmRfc2VxdWVuY2U7Ci19Ci0KLXN0YXRpYyBjaGFyKiAKLWNvbmNhdF9maWxlbmFtZSAodGFibGUsIGZpbGUpCi0gICAgIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOwotICAgICB1bnNpZ25lZCBpbnQgZmlsZTsKLXsKLSAgY2hhciogZmlsZW5hbWU7Ci0KLSAgaWYgKGZpbGUgLSAxID49IHRhYmxlLT5udW1fZmlsZXMpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciAiCi0JCQkgICAgICAgInNlY3Rpb24gKGJhZCBmaWxlIG51bWJlcikuIikpOwotICAgICAgcmV0dXJuICI8dW5rbm93bj4iOwotICAgIH0KLQotICBmaWxlbmFtZSA9IHRhYmxlLT5maWxlc1tmaWxlIC0gMV0ubmFtZTsKLSAgaWYgKCpmaWxlbmFtZSA9PSAnLycpCi0gICAgcmV0dXJuIGZpbGVuYW1lOwotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyKiBkaXJuYW1lID0gKHRhYmxlLT5maWxlc1tmaWxlIC0gMV0uZGlyCi0JCSAgICAgICA/IHRhYmxlLT5kaXJzW3RhYmxlLT5maWxlc1tmaWxlIC0gMV0uZGlyIC0gMV0KLQkJICAgICAgIDogdGFibGUtPmNvbXBfZGlyKTsKLSAgICAgIHJldHVybiAoY2hhciopIGNvbmNhdCAoZGlybmFtZSwgIi8iLCBmaWxlbmFtZSwgTlVMTCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotYXJhbmdlX2FkZCAodW5pdCwgbG93X3BjLCBoaWdoX3BjKQotICAgICBzdHJ1Y3QgY29tcF91bml0ICp1bml0OwotICAgICBiZmRfdm1hIGxvd19wYzsKLSAgICAgYmZkX3ZtYSBoaWdoX3BjOwotewotICBzdHJ1Y3QgYXJhbmdlICphcmFuZ2U7Ci0KLSAgLyogZmlyc3Qgc2VlIGlmIHdlIGNhbiBjaGVhcGx5IGV4dGVuZCBhbiBleGlzdGluZyByYW5nZTogKi8KLSAgYXJhbmdlID0gJnVuaXQtPmFyYW5nZTsKLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobG93X3BjID09IGFyYW5nZS0+aGlnaCkKLQl7Ci0JICBhcmFuZ2UtPmhpZ2ggPSBoaWdoX3BjOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChoaWdoX3BjID09IGFyYW5nZS0+bG93KQotCXsKLQkgIGFyYW5nZS0+bG93ID0gbG93X3BjOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGFyYW5nZSA9IGFyYW5nZS0+bmV4dDsKLSAgICB9Ci0gIHdoaWxlIChhcmFuZ2UpOwotCi0gIGlmICh1bml0LT5hcmFuZ2UuaGlnaCA9PSAwKQotICAgIHsKLSAgICAgIC8qIHRoaXMgaXMgdGhlIGZpcnN0IGFkZHJlc3MgcmFuZ2U6IHN0b3JlIGl0IGluIHVuaXQtPmFyYW5nZTogKi8KLSAgICAgIHVuaXQtPmFyYW5nZS5uZXh0ID0gMDsKLSAgICAgIHVuaXQtPmFyYW5nZS5sb3cgPSBsb3dfcGM7Ci0gICAgICB1bml0LT5hcmFuZ2UuaGlnaCA9IGhpZ2hfcGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYXJhbmdlIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgYXJhbmdlIGxpc3Q6ICovCi0gIGFyYW5nZSA9IGJmZF96YWxsb2MgKHVuaXQtPmFiZmQsIHNpemVvZiAoKmFyYW5nZSkpOwotICBhcmFuZ2UtPmxvdyA9IGxvd19wYzsKLSAgYXJhbmdlLT5oaWdoID0gaGlnaF9wYzsKLQotICBhcmFuZ2UtPm5leHQgPSB1bml0LT5hcmFuZ2UubmV4dDsKLSAgdW5pdC0+YXJhbmdlLm5leHQgPSBhcmFuZ2U7Ci19Ci0KLS8qIERlY29kZSB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIFVOSVQuICovCi0KLXN0YXRpYyBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKgotZGVjb2RlX2xpbmVfaW5mbyAodW5pdCkKLSAgICAgc3RydWN0IGNvbXBfdW5pdCAqdW5pdDsKLXsKLSAgYmZkICphYmZkID0gdW5pdC0+YWJmZDsKLQotICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpzdGFzaDsKLQotICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiB0YWJsZTsKLQotICBjaGFyICpsaW5lX3B0cjsKLSAgY2hhciAqbGluZV9lbmQ7Ci0gIHN0cnVjdCBsaW5lX2hlYWQgbGg7Ci0gIHVuc2lnbmVkIGludCBpLCBieXRlc19yZWFkOwotICBjaGFyICpjdXJfZmlsZSwgKmN1cl9kaXI7Ci0gIHVuc2lnbmVkIGNoYXIgb3BfY29kZSwgZXh0ZW5kZWRfb3AsIGFkal9vcGNvZGU7Ci0KLSAgc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm87Ci0KLSAgaWYgKCEgc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfbGluZSIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19saW5lIHNlY3Rpb24uIikpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIHNpemUgPSBtc2VjLT5fcmF3X3NpemU7Ci0gICAgICBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgaWYgKCEgc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyKQotCXJldHVybiAwOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG1zZWMsIAotCQkJCSAgICAgIHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlciwgMCwKLQkJCQkgICAgICBzaXplKSkKLQlyZXR1cm4gMDsKLQotICAgICAgLyogRklYTUU6IFdlIG91Z2h0IHRvIGFwcGx5IHRoZSByZWxvY3MgYWdhaW5zdCB0aGlzIHNlY3Rpb24gYmVmb3JlCi0JIHdlIHByb2Nlc3MgaXQuLi4uICovCi0gICAgfQotCi0gIHRhYmxlID0gKHN0cnVjdCBsaW5lX2luZm9fdGFibGUqKSBiZmRfYWxsb2MgKGFiZmQsIAotCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKSk7Ci0gIHRhYmxlLT5hYmZkID0gYWJmZDsKLSAgdGFibGUtPmNvbXBfZGlyID0gdW5pdC0+Y29tcF9kaXI7Ci0KLSAgdGFibGUtPm51bV9maWxlcyA9IDA7Ci0gIHRhYmxlLT5maWxlcyA9IE5VTEw7Ci0KLSAgdGFibGUtPm51bV9kaXJzID0gMDsKLSAgdGFibGUtPmRpcnMgPSBOVUxMOwotCi0gIHRhYmxlLT5maWxlcyA9IE5VTEw7Ci0gIHRhYmxlLT5sYXN0X2xpbmUgPSBOVUxMOwotCi0gIGxpbmVfcHRyID0gc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyICsgdW5pdC0+bGluZV9vZmZzZXQ7Ci0KLSAgLyogcmVhZCBpbiB0aGUgcHJvbG9ndWUgKi8KLSAgbGgudG90YWxfbGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDQ7Ci0gIGxpbmVfZW5kID0gbGluZV9wdHIgKyBsaC50b3RhbF9sZW5ndGg7Ci0gIGxoLnZlcnNpb24gPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMjsKLSAgbGgucHJvbG9ndWVfbGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDQ7Ci0gIGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGguZGVmYXVsdF9pc19zdG10ID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGgubGluZV9iYXNlID0gcmVhZF8xX3NpZ25lZF9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLmxpbmVfcmFuZ2UgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5vcGNvZGVfYmFzZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLnN0YW5kYXJkX29wY29kZV9sZW5ndGhzID0gKHVuc2lnbmVkIGNoYXIgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIGxoLm9wY29kZV9iYXNlICogc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0KLSAgbGguc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbMF0gPSAxOwotICBmb3IgKGkgPSAxOyBpIDwgbGgub3Bjb2RlX2Jhc2U7ICsraSkKLSAgICB7Ci0gICAgICBsaC5zdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tpXSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gICAgICBsaW5lX3B0ciArPSAxOwotICAgIH0KLQotICAvKiBSZWFkIGRpcmVjdG9yeSB0YWJsZSAgKi8KLSAgd2hpbGUgKChjdXJfZGlyID0gcmVhZF9zdHJpbmcgKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCkpICE9IE5VTEwpCi0gICAgewotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGlmICgodGFibGUtPm51bV9kaXJzICUgRElSX0FMTE9DX0NIVU5LKSA9PSAwKQotCXsKLQkgIHRhYmxlLT5kaXJzID0gKGNoYXIgKiopCi0JICAgIGJmZF9yZWFsbG9jICh0YWJsZS0+ZGlycywKLQkJCSAodGFibGUtPm51bV9kaXJzICsgRElSX0FMTE9DX0NIVU5LKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICBpZiAoISB0YWJsZS0+ZGlycykKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgICAgdGFibGUtPmRpcnNbdGFibGUtPm51bV9kaXJzKytdID0gY3VyX2RpcjsKLSAgICB9Ci0gIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgLyogUmVhZCBmaWxlIG5hbWUgdGFibGUgKi8KLSAgd2hpbGUgKChjdXJfZmlsZSA9IHJlYWRfc3RyaW5nIChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBpZiAoKHRhYmxlLT5udW1fZmlsZXMgJSBGSUxFX0FMTE9DX0NIVU5LKSA9PSAwKQotCXsKLQkgIHRhYmxlLT5maWxlcyA9IChzdHJ1Y3QgZmlsZWluZm8gKikKLQkgICAgYmZkX3JlYWxsb2MgKHRhYmxlLT5maWxlcywKLQkJCSAodGFibGUtPm51bV9maWxlcyArIEZJTEVfQUxMT0NfQ0hVTkspCi0JCQkgKiBzaXplb2YgKHN0cnVjdCBmaWxlaW5mbykpOwotCSAgaWYgKCEgdGFibGUtPmZpbGVzKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10ubmFtZSA9IGN1cl9maWxlOwotICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLmRpciA9Ci0JcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnRpbWUgPQotCXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5zaXplID0KLQlyZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICB0YWJsZS0+bnVtX2ZpbGVzKys7Ci0gICAgfQotICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCi0gIC8qIFJlYWQgdGhlIHN0YXRlbWVudCBzZXF1ZW5jZXMgdW50aWwgdGhlcmUncyBub3RoaW5nIGxlZnQuICAqLwotICB3aGlsZSAobGluZV9wdHIgPCBsaW5lX2VuZCkKLSAgICB7Ci0gICAgICAvKiBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAgKi8KLSAgICAgIGJmZF92bWEgYWRkcmVzcyA9IDA7Ci0gICAgICBjaGFyKiBmaWxlbmFtZSA9IGNvbmNhdF9maWxlbmFtZSAodGFibGUsIDEpOwotICAgICAgdW5zaWduZWQgaW50IGxpbmUgPSAxOwotICAgICAgdW5zaWduZWQgaW50IGNvbHVtbiA9IDA7Ci0gICAgICBpbnQgaXNfc3RtdCA9IGxoLmRlZmF1bHRfaXNfc3RtdDsKLSAgICAgIGludCBiYXNpY19ibG9jayA9IDA7Ci0gICAgICBpbnQgZW5kX3NlcXVlbmNlID0gMCwgbmVlZF9sb3dfcGMgPSAxOwotICAgICAgYmZkX3ZtYSBsb3dfcGMgPSAwOwotCi0gICAgICAvKiBEZWNvZGUgdGhlIHRhYmxlLiAqLwotICAgICAgd2hpbGUgKCEgZW5kX3NlcXVlbmNlKQotCXsKLQkgIG9wX2NvZGUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotCSAgbGluZV9wdHIgKz0gMTsKLQkgIHN3aXRjaCAob3BfY29kZSkKLQkgICAgewotCSAgICBjYXNlIERXX0xOU19leHRlbmRlZF9vcDoKLQkgICAgICBsaW5lX3B0ciArPSAxOwkvKiBpZ25vcmUgbGVuZ3RoICovCi0JICAgICAgZXh0ZW5kZWRfb3AgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotCSAgICAgIGxpbmVfcHRyICs9IDE7Ci0JICAgICAgc3dpdGNoIChleHRlbmRlZF9vcCkKLQkJewotCQljYXNlIERXX0xORV9lbmRfc2VxdWVuY2U6Ci0JCSAgZW5kX3NlcXVlbmNlID0gMTsKLQkJICBhZGRfbGluZV9pbmZvICh0YWJsZSwgYWRkcmVzcywgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwKLQkJCQkgZW5kX3NlcXVlbmNlKTsKLQkJICBpZiAobmVlZF9sb3dfcGMpCi0JCSAgICB7Ci0JCSAgICAgIG5lZWRfbG93X3BjID0gMDsKLQkJICAgICAgbG93X3BjID0gYWRkcmVzczsKLQkJICAgIH0KLQkJICBhcmFuZ2VfYWRkICh1bml0LCBsb3dfcGMsIGFkZHJlc3MpOwotCQkgIGJyZWFrOwotCQljYXNlIERXX0xORV9zZXRfYWRkcmVzczoKLQkJICBhZGRyZXNzID0gcmVhZF9hZGRyZXNzICh1bml0LCBsaW5lX3B0cik7Ci0JCSAgbGluZV9wdHIgKz0gdW5pdC0+YWRkcl9zaXplOwotCQkgIGJyZWFrOwotCQljYXNlIERXX0xORV9kZWZpbmVfZmlsZToKLQkJICBjdXJfZmlsZSA9IHJlYWRfc3RyaW5nIChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCSAgaWYgKCh0YWJsZS0+bnVtX2ZpbGVzICUgRklMRV9BTExPQ19DSFVOSykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdGFibGUtPmZpbGVzID0gKHN0cnVjdCBmaWxlaW5mbyAqKQotCQkJYmZkX3JlYWxsb2MgKHRhYmxlLT5maWxlcywKLQkJCQkgICAgICh0YWJsZS0+bnVtX2ZpbGVzICsgRklMRV9BTExPQ19DSFVOSykKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgZmlsZWluZm8pKTsKLQkJICAgICAgaWYgKCEgdGFibGUtPmZpbGVzKQotCQkJcmV0dXJuIDA7Ci0JCSAgICB9Ci0JCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLm5hbWUgPSBjdXJfZmlsZTsKLQkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uZGlyID0KLQkJICAgIHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnRpbWUgPQotCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uc2l6ZSA9Ci0JCSAgICByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkJICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQkgIHRhYmxlLT5udW1fZmlsZXMrKzsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBtYW5nbGVkIGxpbmUgbnVtYmVyIHNlY3Rpb24uIikpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX2NvcHk6Ci0JICAgICAgYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIDApOwotCSAgICAgIGJhc2ljX2Jsb2NrID0gMDsKLQkgICAgICBpZiAobmVlZF9sb3dfcGMpCi0JCXsKLQkJICBuZWVkX2xvd19wYyA9IDA7Ci0JCSAgbG93X3BjID0gYWRkcmVzczsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX3BjOgotCSAgICAgIGFkZHJlc3MgKz0gbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGgKLQkJKiByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX2xpbmU6Ci0JICAgICAgbGluZSArPSByZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6Ci0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgZmlsZTsKLQotCQkvKiBUaGUgZmlsZSBhbmQgZGlyZWN0b3J5IHRhYmxlcyBhcmUgMCBiYXNlZCwgdGhlIHJlZmVyZW5jZXMKLQkJICAgYXJlIDEgYmFzZWQuICAqLwotCQlmaWxlID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCWxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCWZpbGVuYW1lID0gY29uY2F0X2ZpbGVuYW1lICh0YWJsZSwgZmlsZSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgY2FzZSBEV19MTlNfc2V0X2NvbHVtbjoKLQkgICAgICBjb2x1bW4gPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19uZWdhdGVfc3RtdDoKLQkgICAgICBpc19zdG10ID0gKCFpc19zdG10KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgotCSAgICAgIGJhc2ljX2Jsb2NrID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfY29uc3RfYWRkX3BjOgotCSAgICAgIGFkZHJlc3MgKz0gbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGgKLQkJICAgICAgKiAoKDI1NSAtIGxoLm9wY29kZV9iYXNlKSAvIGxoLmxpbmVfcmFuZ2UpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOgotCSAgICAgIGFkZHJlc3MgKz0gcmVhZF8yX2J5dGVzIChhYmZkLCBsaW5lX3B0cik7Ci0JICAgICAgbGluZV9wdHIgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoJCS8qIHNwZWNpYWwgb3BlcmFuZCAqLwotCSAgICAgIGFkal9vcGNvZGUgPSBvcF9jb2RlIC0gbGgub3Bjb2RlX2Jhc2U7Ci0JICAgICAgYWRkcmVzcyArPSAoYWRqX29wY29kZSAvIGxoLmxpbmVfcmFuZ2UpCi0JCSogbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGg7Ci0JICAgICAgbGluZSArPSBsaC5saW5lX2Jhc2UgKyAoYWRqX29wY29kZSAlIGxoLmxpbmVfcmFuZ2UpOwotCSAgICAgIC8qIGFwcGVuZCByb3cgdG8gbWF0cml4IHVzaW5nIGN1cnJlbnQgdmFsdWVzICovCi0JICAgICAgYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIDApOwotCSAgICAgIGJhc2ljX2Jsb2NrID0gMTsKLQkgICAgICBpZiAobmVlZF9sb3dfcGMpCi0JCXsKLQkJICBuZWVkX2xvd19wYyA9IDA7Ci0JCSAgbG93X3BjID0gYWRkcmVzczsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdGFibGU7Ci19Ci0KLQotLyogSWYgQUREUiBpcyB3aXRoaW4gVEFCTEUgc2V0IHRoZSBvdXRwdXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRydWUsCi0gICBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLiAgVGhlIG91dHB1dCBwYXJhbWV0ZXJzLCBGSUxFTkFNRV9QVFIgYW5kCi0gICBMSU5FTlVNQkVSX1BUUiwgYXJlIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzIHRvIGJlIGZpbGxlZCBpbi4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWxvb2t1cF9hZGRyZXNzX2luX2xpbmVfaW5mb190YWJsZSAodGFibGUsIAotCQkJCSAgIGFkZHIsCi0JCQkJICAgZmlsZW5hbWVfcHRyLCAKLQkJCQkgICBsaW5lbnVtYmVyX3B0cikKLSAgICAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKLXsKLSAgc3RydWN0IGxpbmVfaW5mbyogbmV4dF9saW5lID0gdGFibGUtPmxhc3RfbGluZTsKLSAgc3RydWN0IGxpbmVfaW5mbyogZWFjaF9saW5lOwotICAKLSAgaWYgKCFuZXh0X2xpbmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVhY2hfbGluZSA9IG5leHRfbGluZS0+cHJldl9saW5lOwotCi0gIHdoaWxlIChlYWNoX2xpbmUgJiYgbmV4dF9saW5lKQotICAgIHsKLSAgICAgIGlmICghZWFjaF9saW5lLT5lbmRfc2VxdWVuY2UKLQkgICYmIGFkZHIgPj0gZWFjaF9saW5lLT5hZGRyZXNzICYmIGFkZHIgPCBuZXh0X2xpbmUtPmFkZHJlc3MpCi0JewotCSAgKmZpbGVuYW1lX3B0ciA9IGVhY2hfbGluZS0+ZmlsZW5hbWU7Ci0JICAqbGluZW51bWJlcl9wdHIgPSBlYWNoX2xpbmUtPmxpbmU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBuZXh0X2xpbmUgPSBlYWNoX2xpbmU7Ci0gICAgICBlYWNoX2xpbmUgPSBlYWNoX2xpbmUtPnByZXZfbGluZTsKLSAgICB9Ci0gIAotICByZXR1cm4gZmFsc2U7Ci19Ci0gIAotCi0KLQotLyogRnVuY3Rpb24gdGFibGUgZnVuY3Rpb25zLiAqLwotCi1zdHJ1Y3QgZnVuY2luZm8gewotICBzdHJ1Y3QgZnVuY2luZm8gKnByZXZfZnVuYzsKLQotICBjaGFyKiBuYW1lOwotICBiZmRfdm1hIGxvdzsKLSAgYmZkX3ZtYSBoaWdoOwotfTsKLQotCi0vKiBJZiBBRERSIGlzIHdpdGhpbiBUQUJMRSwgc2V0IEZVTkNUSU9OTkFNRV9QVFIsIGFuZCByZXR1cm4gdHJ1ZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWxvb2t1cF9hZGRyZXNzX2luX2Z1bmN0aW9uX3RhYmxlICh0YWJsZSwgCi0JCQkJICBhZGRyLAotCQkJCSAgZnVuY3Rpb25uYW1lX3B0cikKLSAgICAgc3RydWN0IGZ1bmNpbmZvKiB0YWJsZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLXsKLSAgc3RydWN0IGZ1bmNpbmZvKiBlYWNoX2Z1bmM7Ci0KLSAgZm9yIChlYWNoX2Z1bmMgPSB0YWJsZTsKLSAgICAgICBlYWNoX2Z1bmM7Ci0gICAgICAgZWFjaF9mdW5jID0gZWFjaF9mdW5jLT5wcmV2X2Z1bmMpCi0gICAgewotICAgICAgaWYgKGFkZHIgPj0gZWFjaF9mdW5jLT5sb3cgJiYgYWRkciA8IGVhY2hfZnVuYy0+aGlnaCkKLQl7Ci0JICAqZnVuY3Rpb25uYW1lX3B0ciA9IGVhY2hfZnVuYy0+bmFtZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotCi0KLS8qIERXQVJGMiBDb21waWxhdGlvbiB1bml0IGZ1bmN0aW9ucy4gKi8KLQotCi0vKiBTY2FuIG92ZXIgZWFjaCBkaWUgaW4gYSBjb21wLiB1bml0IGxvb2tpbmcgZm9yIGZ1bmN0aW9ucyB0byBhZGQKLSAgIHRvIHRoZSBmdW5jdGlvbiB0YWJsZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLXNjYW5fdW5pdF9mb3JfZnVuY3Rpb25zICh1bml0KQotICAgICBzdHJ1Y3QgY29tcF91bml0ICp1bml0OwotewotICBiZmQgKmFiZmQgPSB1bml0LT5hYmZkOwotICBjaGFyICppbmZvX3B0ciA9IHVuaXQtPmZpcnN0X2NoaWxkX2RpZV9wdHI7Ci0gIGludCBuZXN0aW5nX2xldmVsID0gMTsKLQotICB3aGlsZSAobmVzdGluZ19sZXZlbCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWJicmV2X251bWJlciwgYnl0ZXNfcmVhZCwgaTsKLSAgICAgIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OwotICAgICAgc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotICAgICAgc3RydWN0IGZ1bmNpbmZvICpmdW5jOwotICAgICAgY2hhciogbmFtZSA9IDA7Ci0KLSAgICAgIGFiYnJldl9udW1iZXIgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgICAgIGlmICghIGFiYnJldl9udW1iZXIpCi0JewotCSAgbmVzdGluZ19sZXZlbC0tOwotCSAgY29udGludWU7Ci0JfQotICAgICAgCi0gICAgICBhYmJyZXYgPSBsb29rdXBfYWJicmV2IChhYmJyZXZfbnVtYmVyLHVuaXQtPmFiYnJldnMpOwotICAgICAgaWYgKCEgYWJicmV2KQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IENvdWxkIG5vdCBmaW5kIGFiYnJldiBudW1iZXIgJWQuIiksIAotCQkJICAgICBhYmJyZXZfbnVtYmVyKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIAotICAgICAgaWYgKGFiYnJldi0+dGFnID09IERXX1RBR19zdWJwcm9ncmFtKQotCXsKLQkgIGZ1bmMgPSAoc3RydWN0IGZ1bmNpbmZvKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZnVuY2luZm8pKTsKLQkgIGZ1bmMtPnByZXZfZnVuYyA9IHVuaXQtPmZ1bmN0aW9uX3RhYmxlOwotCSAgdW5pdC0+ZnVuY3Rpb25fdGFibGUgPSBmdW5jOwotCX0KLSAgICAgIGVsc2UKLQlmdW5jID0gTlVMTDsKLSAgCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJicmV2LT5udW1fYXR0cnM7ICsraSkKLQl7Ci0JICBpbmZvX3B0ciA9IHJlYWRfYXR0cmlidXRlICgmYXR0ciwgJmFiYnJldi0+YXR0cnNbaV0sIHVuaXQsIGluZm9fcHRyKTsKLQkgIAotCSAgaWYgKGZ1bmMpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGF0dHIubmFtZSkKLQkJewotCQljYXNlIERXX0FUX25hbWU6Ci0JCSAgCi0JCSAgbmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCi0JCSAgLyogUHJlZmVyIERXX0FUX01JUFNfbGlua2FnZV9uYW1lIG92ZXIgRFdfQVRfbmFtZS4gICovCi0JCSAgaWYgKGZ1bmMtPm5hbWUgPT0gTlVMTCkKLQkJICAgIGZ1bmMtPm5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZToKLQkJICBmdW5jLT5uYW1lID0gRFdfU1RSSU5HICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBEV19BVF9sb3dfcGM6Ci0JCSAgZnVuYy0+bG93ID0gRFdfQUREUiAoJmF0dHIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRFdfQVRfaGlnaF9wYzoKLQkJICBmdW5jLT5oaWdoID0gRFdfQUREUiAoJmF0dHIpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChhdHRyLm5hbWUpCi0JCXsKLQkJY2FzZSBEV19BVF9uYW1lOgotCQkgIG5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkJICBicmVhazsKLQkJICAKLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoYWJicmV2LT5oYXNfY2hpbGRyZW4pCi0JbmVzdGluZ19sZXZlbCsrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLQotCi0KLS8qIFBhcnNlIGEgRFdBUkYyIGNvbXBpbGF0aW9uIHVuaXQgc3RhcnRpbmcgYXQgSU5GT19QVFIuICBUaGlzCi0gICBpbmNsdWRlcyB0aGUgY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgdGhhdCBwcm9jZWVkcyB0aGUgRElFJ3MsIGJ1dAotICAgZG9lcyBub3QgaW5jbHVkZSB0aGUgbGVuZ3RoIGZpZWxkIHRoYXQgcHJlY2VlZHMgZWFjaCBjb21waWxhdGlvbgotICAgdW5pdCBoZWFkZXIuICBFTkRfUFRSIHBvaW50cyBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoaXMgY29tcCB1bml0LgotICAgSWYgQUJCUkVWX0xFTkdUSCBpcyAwLCB0aGVuIHRoZSBsZW5ndGggb2YgdGhlIGFiYnJldmlhdGlvbiBvZmZzZXQKLSAgIGlzIGFzc3VtZWQgdG8gYmUgZm91ciBieXRlcy4gIE90aGVyd2lzZSwgaXQgaXQgaXMgdGhlIHNpemUgZ2l2ZW4uCi0KLSAgIFRoaXMgcm91dGluZSBkb2VzIG5vdCByZWFkIHRoZSB3aG9sZSBjb21waWxhdGlvbiB1bml0OyBvbmx5IGVub3VnaAotICAgdG8gZ2V0IHRvIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgc3RydWN0IGNvbXBfdW5pdCAqCi1wYXJzZV9jb21wX3VuaXQgKGFiZmQsIGluZm9fcHRyLCBlbmRfcHRyLCBhYmJyZXZfbGVuZ3RoKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIGNoYXIqIGluZm9fcHRyOwotICAgICBjaGFyKiBlbmRfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgYWJicmV2X2xlbmd0aDsKLXsKLSAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKLQotICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwotICB1bnNpZ25lZCBpbnQgYWJicmV2X29mZnNldCA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgYWRkcl9zaXplOwotICBzdHJ1Y3QgYWJicmV2X2luZm8qKiBhYmJyZXZzOwotCi0gIHVuc2lnbmVkIGludCBhYmJyZXZfbnVtYmVyLCBieXRlc19yZWFkLCBpOwotICBzdHJ1Y3QgYWJicmV2X2luZm8gKmFiYnJldjsKLSAgc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCi0gIHZlcnNpb24gPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgaW5mb19wdHIgKz0gMjsKLSAgQkZEX0FTU0VSVCAoYWJicmV2X2xlbmd0aCA9PSAwCi0JICAgICAgfHwgYWJicmV2X2xlbmd0aCA9PSA0Ci0JICAgICAgfHwgYWJicmV2X2xlbmd0aCA9PSA4KTsKLSAgaWYgKGFiYnJldl9sZW5ndGggPT0gMCB8fCBhYmJyZXZfbGVuZ3RoID09IDQpCi0gICAgYWJicmV2X29mZnNldCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICBlbHNlIGlmIChhYmJyZXZfbGVuZ3RoID09IDgpCi0gICAgYWJicmV2X29mZnNldCA9IHJlYWRfOF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICBpbmZvX3B0ciArPSBhYmJyZXZfbGVuZ3RoOwotICBhZGRyX3NpemUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICBpbmZvX3B0ciArPSAxOwotCi0gIGlmICh2ZXJzaW9uICE9IDIpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogZm91bmQgZHdhcmYgdmVyc2lvbiAnJWh1JywgdGhpcyByZWFkZXIgb25seSBoYW5kbGVzIHZlcnNpb24gMiBpbmZvcm1hdGlvbi4iKSwgdmVyc2lvbiApOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGFkZHJfc2l6ZSA+IHNpemVvZiAoYmZkX3ZtYSkpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogZm91bmQgYWRkcmVzcyBzaXplICcldScsIHRoaXMgcmVhZGVyIGNhbiBub3QgaGFuZGxlIHNpemVzIGdyZWF0ZXIgdGhhbiAnJXUnLiIpLAotCQkJIGFkZHJfc2l6ZSwKLQkJCSBzaXplb2YgKGJmZF92bWEpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChhZGRyX3NpemUgIT0gMiAmJiBhZGRyX3NpemUgIT0gNCAmJiBhZGRyX3NpemUgIT0gOCkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJEd2FyZiBFcnJvcjogZm91bmQgYWRkcmVzcyBzaXplICcldScsIHRoaXMgcmVhZGVyIGNhbiBvbmx5IGhhbmRsZSBhZGRyZXNzIHNpemVzICcyJywgJzQnIGFuZCAnOCcuIiwgYWRkcl9zaXplICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBhYmJyZXZzIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaW50byBhIHRhYmxlICovCi0gIGFiYnJldnMgPSByZWFkX2FiYnJldnMgKGFiZmQsIGFiYnJldl9vZmZzZXQpOwotICBpZiAoISBhYmJyZXZzKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICBpZiAoISBhYmJyZXZfbnVtYmVyKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IEJhZCBhYmJyZXYgbnVtYmVyOiAlZC4iKSwKLQkJCSBhYmJyZXZfbnVtYmVyKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFiYnJldiA9IGxvb2t1cF9hYmJyZXYgKGFiYnJldl9udW1iZXIsIGFiYnJldnMpOwotICBpZiAoISBhYmJyZXYpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ291bGQgbm90IGZpbmQgYWJicmV2IG51bWJlciAlZC4iKSwKLQkJCSBhYmJyZXZfbnVtYmVyKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgdW5pdCA9IChzdHJ1Y3QgY29tcF91bml0KikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29tcF91bml0KSk7Ci0gIHVuaXQtPmFiZmQgPSBhYmZkOwotICB1bml0LT5hZGRyX3NpemUgPSBhZGRyX3NpemU7IAotICB1bml0LT5hYmJyZXZzID0gYWJicmV2czsKLSAgdW5pdC0+ZW5kX3B0ciA9IGVuZF9wdHI7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGFiYnJldi0+bnVtX2F0dHJzOyArK2kpCi0gICAgewotICAgICAgaW5mb19wdHIgPSByZWFkX2F0dHJpYnV0ZSAoJmF0dHIsICZhYmJyZXYtPmF0dHJzW2ldLCB1bml0LCBpbmZvX3B0cik7Ci0KLSAgICAgIC8qIFN0b3JlIHRoZSBkYXRhIGlmIGl0IGlzIG9mIGFuIGF0dHJpYnV0ZSB3ZSB3YW50IHRvIGtlZXAgaW4gYQotCSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBzd2l0Y2ggKGF0dHIubmFtZSkKLQl7Ci0JY2FzZSBEV19BVF9zdG10X2xpc3Q6Ci0JICB1bml0LT5zdG10bGlzdCA9IDE7Ci0JICB1bml0LT5saW5lX29mZnNldCA9IERXX1VOU05EICgmYXR0cik7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfQVRfbmFtZToKLQkgIHVuaXQtPm5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9sb3dfcGM6Ci0JICB1bml0LT5hcmFuZ2UubG93ID0gRFdfQUREUiAoJmF0dHIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FUX2hpZ2hfcGM6Ci0JICB1bml0LT5hcmFuZ2UuaGlnaCA9IERXX0FERFIgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9jb21wX2RpcjoKLQkgIHsKLQkgICAgY2hhciogY29tcF9kaXIgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkgICAgaWYgKGNvbXBfZGlyKQotCSAgICAgIHsKLQkJLyogSXJpeCA2LjIgbmF0aXZlIGNjIHByZXBlbmRzIDxtYWNoaW5lPi46IHRvIHRoZSBjb21waWxhdGlvbgotCQkgICBkaXJlY3RvcnksIGdldCByaWQgb2YgaXQuICAqLwotCQljaGFyICpjcCA9IChjaGFyKikgc3RyY2hyIChjb21wX2RpciwgJzonKTsKLQotCQlpZiAoY3AgJiYgY3AgIT0gY29tcF9kaXIgJiYgY3BbLTFdID09ICcuJyAmJiBjcFsxXSA9PSAnLycpCi0JCSAgY29tcF9kaXIgPSBjcCArIDE7Ci0JICAgICAgfQotCSAgICB1bml0LT5jb21wX2RpciA9IGNvbXBfZGlyOwotCSAgICBicmVhazsKLQkgIH0KLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHVuaXQtPmZpcnN0X2NoaWxkX2RpZV9wdHIgPSBpbmZvX3B0cjsKLSAgcmV0dXJuIHVuaXQ7Ci19Ci0KLQotCi0KLQotLyogUmV0dXJuIHRydWUgaWYgVU5JVCBjb250YWlucyB0aGUgYWRkcmVzcyBnaXZlbiBieSBBRERSLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MgKHVuaXQsIGFkZHIpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGFyYW5nZSAqYXJhbmdlOwotCi0gIGlmICh1bml0LT5lcnJvcikKLSAgICByZXR1cm4gMDsKLQotICBhcmFuZ2UgPSAmdW5pdC0+YXJhbmdlOwotICBkbwotICAgIHsKLSAgICAgIGlmIChhZGRyID49IGFyYW5nZS0+bG93ICYmIGFkZHIgPCBhcmFuZ2UtPmhpZ2gpCi0JcmV0dXJuIDE7Ci0gICAgICBhcmFuZ2UgPSBhcmFuZ2UtPm5leHQ7Ci0gICAgfQotICB3aGlsZSAoYXJhbmdlKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogSWYgVU5JVCBjb250YWlucyBBRERSLCBzZXQgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIHRvIHRoZSB2YWx1ZXMgZm9yCi0gICB0aGUgbGluZSBjb250YWluaW5nIEFERFIuICBUaGUgb3V0cHV0IHBhcmFtZXRlcnMsIEZJTEVOQU1FX1BUUiwKLSAgIEZVTkNUSU9OTkFNRV9QVFIsIGFuZCBMSU5FTlVNQkVSX1BUUiwgYXJlIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzCi0gICB0byBiZSBmaWxsZWQgaW4uICAKLQotICAgUmV0dXJuIHRydWUgb2YgVU5JVCBjb250YWlucyBBRERSLCBhbmQgbm8gZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQ7Ci0gICBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lICh1bml0LCBhZGRyLAotCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKQotICAgICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBib29sZWFuIGxpbmVfcDsKLSAgYm9vbGVhbiBmdW5jX3A7Ci0gIAotICBpZiAodW5pdC0+ZXJyb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHVuaXQtPmxpbmVfdGFibGUpCi0gICAgewotICAgICAgaWYgKCEgdW5pdC0+c3RtdGxpc3QpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgCi0gICAgICB1bml0LT5saW5lX3RhYmxlID0gZGVjb2RlX2xpbmVfaW5mbyAodW5pdCk7Ci0KLSAgICAgIGlmICghIHVuaXQtPmxpbmVfdGFibGUpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIAotICAgICAgaWYgKCEgc2Nhbl91bml0X2Zvcl9mdW5jdGlvbnMgKHVuaXQpKQotCXsKLQkgIHVuaXQtPmVycm9yID0gMTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGxpbmVfcCA9IGxvb2t1cF9hZGRyZXNzX2luX2xpbmVfaW5mb190YWJsZSAodW5pdC0+bGluZV90YWJsZSwKLQkJCQkJICAgICAgYWRkciwKLQkJCQkJICAgICAgZmlsZW5hbWVfcHRyLCAKLQkJCQkJICAgICAgbGluZW51bWJlcl9wdHIpOwotICBmdW5jX3AgPSBsb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSAodW5pdC0+ZnVuY3Rpb25fdGFibGUsIAotCQkJCQkgICAgIGFkZHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0cik7Ci0gIHJldHVybiBsaW5lX3AgfHwgZnVuY19wOwotfQotCi0vKiBUaGUgRFdBUkYyIHZlcnNpb24gb2YgZmluZF9uZWFyZXN0IGxpbmUuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZQotICAgaXMgZm91bmQgd2l0aG91dCBlcnJvci4gIEFERFJfU0laRSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgaW5pdGlhbCAuZGVidWdfaW5mbyBsZW5ndGggZmllbGQgYW5kIGluIHRoZSBhYmJyZXZpYXRpb24gb2Zmc2V0LgotICAgWW91IG1heSB1c2UgemVybyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZQotICAgdXNlZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkgICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJICAgICAgIGxpbmVudW1iZXJfcHRyLAotCQkJICAgICAgIGFkZHJfc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgYWRkcl9zaXplOwotewotICAvKiBSZWFkIGVhY2ggY29tcGlsYXRpb24gdW5pdCBmcm9tIHRoZSBzZWN0aW9uIC5kZWJ1Z19pbmZvLCBhbmQgY2hlY2sKLSAgICAgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIHRoZSBhZGRyZXNzIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiAgSWYgeWVzLAotICAgICBsb29rdXAgdGhlIGFkZHJlc3MsIGFuZCByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGluZm8uICBJZiBubywgZ28KLSAgICAgb24gdG8gdGhlIG5leHQgY29tcGlsYXRpb24gdW5pdC4gIAotCi0gICAgIFdlIGtlZXAgYSBsaXN0IG9mIGFsbCB0aGUgcHJldmlvdXNseSByZWFkIGNvbXBpbGF0aW9uIHVuaXRzLCBhbmQKLSAgICAgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHVuLXJlYWQgY29tcGlsYXRpb24gdW5pdC4gIENoZWNrIHRoZSAKLSAgICAgcHJldmlvdXNseSByZWFkIHVuaXRzIGJlZm9yZSByZWFkaW5nIG1vcmUuCi0gICAgICovCi0KLSAgc3RydWN0IGR3YXJmMl9kZWJ1ZyAqc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm87Ci0KLSAgLyogV2hhdCBhZGRyZXNzIGFyZSB3ZSBsb29raW5nIGZvcj8gKi8KLSAgYmZkX3ZtYSBhZGRyID0gb2Zmc2V0ICsgc2VjdGlvbi0+dm1hOwotCi0gIHN0cnVjdCBjb21wX3VuaXQqIGVhY2g7Ci0gIAotICAqZmlsZW5hbWVfcHRyID0gTlVMTDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBOVUxMOwotICAqbGluZW51bWJlcl9wdHIgPSAwOwotCi0gIC8qIFRoZSBEV0FSRjIgc3BlYyBzYXlzIHRoYXQgdGhlIGluaXRpYWwgbGVuZ3RoIGZpZWxkLCBhbmQgdGhlCi0gICAgIG9mZnNldCBvZiB0aGUgYWJicmV2aWF0aW9uIHRhYmxlLCBzaG91bGQgYm90aCBiZSA0LWJ5dGUgdmFsdWVzLgotICAgICBIb3dldmVyLCBzb21lIGNvbXBpbGVycyBkbyB0aGluZ3MgZGlmZmVyZW50bHkuICAqLwotICBpZiAoYWRkcl9zaXplID09IDApCi0gICAgYWRkcl9zaXplID0gNDsKLSAgQkZEX0FTU0VSVCAoYWRkcl9zaXplID09IDQgfHwgYWRkcl9zaXplID09IDgpOwotICAgIAotICBpZiAoISBzdGFzaCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbXNlYzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICAgIAotICAgICAgc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm8gPQotCShzdHJ1Y3QgZHdhcmYyX2RlYnVnKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYyX2RlYnVnKSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnX2luZm8iKTsKLSAgICAgIGlmICghIG1zZWMpCi0JewotCSAgLyogTm8gZHdhcmYyIGluZm8uICBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgc3Rhc2gKLQkgICAgIGhhcyBiZWVuIGFsbG9jYXRlZCwgYnV0IGNvbnRhaW5zIHplcm9zLCB0aGlzIGxldHMKLQkgICAgIGZ1dHVyZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGZhaWwgcXVpY2tlci4gKi8KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHNpemUgPSBtc2VjLT5fcmF3X3NpemU7Ci0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgc3Rhc2gtPmluZm9fcHRyID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gtPmluZm9fcHRyKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCBzdGFzaC0+aW5mb19wdHIsIDAsIHNpemUpKQotCXsKLQkgIHN0YXNoLT5pbmZvX3B0ciA9IDA7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdGFzaC0+aW5mb19wdHJfZW5kID0gc3Rhc2gtPmluZm9fcHRyICsgc2l6ZTsKLQotICAgICAgLyogRklYTUU6IFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUKLQkgLmRlYnVnX2luZm8gc2VjdGlvbi4gIFRoZSAnbG93JyBhbmQgJ2hpZ2gnIGFkZHJlc3NlcyBvZiB0aGUKLQkgY29tcF91bml0cyBhcmUgY29tcHV0ZWQgYnkgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBpbiB0aGUKLQkgLnRleHQgc2VnbWVudC4gIFdlIG5lZWQgdGhlc2UgYWRkcmVzc2VzIGluIG9yZGVyIHRvIGRldGVybWluZQotCSB0aGUgbmVhcmVzdCBsaW5lIG51bWJlciwgYW5kIHNvIHdlIGhhdmUgdG8gcmVzb2x2ZSB0aGUKLQkgcmVsb2NzLiAgVGhlcmUgaXMgYSBzaW1pbGFyIHByb2JsZW0gd2hlbiB0aGUgLmRlYnVnX2xpbmUKLQkgc2VjdGlvbiBpcyBwcm9jZXNzZWQgYXMgd2VsbCAoZS5nLiwgdGhlcmUgbWF5IGJlIHJlbG9jcwotCSBhZ2FpbnN0IHRoZSBvcGVyYW5kIG9mIHRoZSBEV19MTkVfc2V0X2FkZHJlc3Mgb3BlcmF0b3IpLgotCSAKLQkgVW5mb3J0dW5hdGVseSBnZXR0aW5nIGhvbGQgb2YgdGhlIHJlbG9jIGluZm9ybWF0aW9uIGlzIGhhcmQuLi4KLQotCSBGb3Igbm93LCB0aGlzIG1lYW5zIHRoYXQgZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgKGFzCi0JIG9wcG9zZWQgdG8gZnVsbHkgZXhlY3V0YWJsZXMpIGRvZXMgbm90IGFsd2F5cyB3b3JrIGFzIHdlbGwgYXMKLQkgd2Ugd291bGQgbGlrZS4gICovCi0gICAgfQotICAKLSAgLyogQSBudWxsIGluZm9fcHRyIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGR3YXJmMiBpbmZvIAotICAgICAob3IgdGhhdCBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHNldHRpbmcgdXAgdGhlIHN0YXNoKS4gKi8KLQotICBpZiAoISBzdGFzaC0+aW5mb19wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENoZWNrIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcC4gdW5pdHMgZmlyc3QuICovCi0KLSAgZm9yIChlYWNoID0gc3Rhc2gtPmFsbF9jb21wX3VuaXRzOyBlYWNoOyBlYWNoID0gZWFjaC0+bmV4dF91bml0KQotICAgIGlmIChjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAoZWFjaCwgYWRkcikpCi0gICAgICByZXR1cm4gY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChlYWNoLCBhZGRyLCBmaWxlbmFtZV9wdHIsIAotCQkJCQkgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKTsKLQotICAvKiBSZWFkIGVhY2ggcmVtYWluaW5nIGNvbXAuIHVuaXRzIGNoZWNraW5nIGVhY2ggYXMgdGhleSBhcmUgcmVhZC4gKi8KLSAgd2hpbGUgKHN0YXNoLT5pbmZvX3B0ciA8IHN0YXNoLT5pbmZvX3B0cl9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGNvbXBfdW5pdCogZWFjaDsKLSAgICAgIGJmZF92bWEgbGVuZ3RoOwotICAgICAgYm9vbGVhbiBmb3VuZDsKLQotICAgICAgaWYgKGFkZHJfc2l6ZSA9PSA0KQotCWxlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgc3Rhc2gtPmluZm9fcHRyKTsKLSAgICAgIGVsc2UKLQlsZW5ndGggPSByZWFkXzhfYnl0ZXMgKGFiZmQsIHN0YXNoLT5pbmZvX3B0cik7Ci0gICAgICBzdGFzaC0+aW5mb19wdHIgKz0gYWRkcl9zaXplOwotCi0gICAgICBpZiAobGVuZ3RoID4gMCkKLSAgICAgICAgewotCSAgZWFjaCA9IHBhcnNlX2NvbXBfdW5pdCAoYWJmZCwgc3Rhc2gtPmluZm9fcHRyLCAKLQkJCQkgIHN0YXNoLT5pbmZvX3B0ciArIGxlbmd0aCwKLQkJCQkgIGFkZHJfc2l6ZSk7Ci0JICBzdGFzaC0+aW5mb19wdHIgKz0gbGVuZ3RoOwotCi0JICBpZiAoZWFjaCkKLQkgICAgewotCSAgICAgIGVhY2gtPm5leHRfdW5pdCA9IHN0YXNoLT5hbGxfY29tcF91bml0czsKLQkgICAgICBzdGFzaC0+YWxsX2NvbXBfdW5pdHMgPSBlYWNoOwotCi0JICAgICAgLyogRFdfQVRfbG93X3BjIGFuZCBEV19BVF9oaWdoX3BjIGFyZSBvcHRpb25hbCBmb3IKLQkJIGNvbXBpbGF0aW9uIHVuaXRzLiAgSWYgd2UgZG9uJ3QgaGF2ZSB0aGVtIChpLmUuLAotCQkgdW5pdC0+aGlnaCA9PSAwKSwgd2UgbmVlZCB0byBjb25zdWx0IHRoZSBsaW5lIGluZm8KLQkJIHRhYmxlIHRvIHNlZSBpZiBhIGNvbXBpbGF0aW9uIHVuaXQgY29udGFpbnMgdGhlIGdpdmVuCi0JCSBhZGRyZXNzLiAqLwotCSAgICAgIGlmIChlYWNoLT5hcmFuZ2UuaGlnaCA+IDApCi0JCXsKLQkJICBpZiAoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MgKGVhY2gsIGFkZHIpKQotCQkgICAgcmV0dXJuIGNvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoZWFjaCwgYWRkciwKLQkJCQkJCSAgICAgICBmaWxlbmFtZV9wdHIsCi0JCQkJCQkgICAgICAgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJCSAgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmb3VuZCA9IGNvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoZWFjaCwgYWRkciwKLQkJCQkJCSAgICAgICBmaWxlbmFtZV9wdHIsCi0JCQkJCQkgICAgICAgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJCSAgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0JCSAgaWYgKGZvdW5kKQotCQkgICAgcmV0dXJuIHRydWU7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBlbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2ZmLmMgYi9iZmQvZWNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxMzZlZS4uMDAwMDAwMAotLS0gYS9iZmQvZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4NDkgKzAsMCBAQAotLyogR2VuZXJpYyBFQ09GRiAoRXh0ZW5kZWQtQ09GRikgcm91dGluZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIE9yaWdpbmFsIHZlcnNpb24gYnkgUGVyIEJvdGhuZXIuCi0gICBGdWxsIHN1cHBvcnQgYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgaWFuQGN5Z251cy5jb20uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLS8qIEZJWE1FOiBXZSBuZWVkIHRoZSBkZWZpbml0aW9ucyBvZiBOX1NFVFtBRFRCXSwgYnV0IGFvdXQ2NC5oIGRlZmluZXMKLSAgIHNvbWUgb3RoZXIgc3R1ZmYgd2hpY2ggd2UgZG9uJ3Qgd2FudCBhbmQgd2hpY2ggY29uZmxpY3RzIHdpdGggc3R1ZmYKLSAgIHdlIGRvIHdhbnQuICAqLwotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI3VuZGVmIE5fQUJTCi0jdW5kZWYgZXhlY19oZHIKLSN1bmRlZiBvYmpfc3ltX2ZpbGVwb3MKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi0vKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGludCBlY29mZl9nZXRfbWFnaWMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyBlY29mZl9zZWNfdG9fc3R5cF9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgIGZsYWd3b3JkIGZsYWdzKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICphYmZkLCBTWU1SICplY29mZl9zeW0sCi0JCQkJCSAgIGFzeW1ib2wgKmFzeW0sIGludCBleHQsIGludCB3ZWFrKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSBQQVJBTVMgKChiZmQgKmFiZmQsIEZEUiAqZmRyLAotCQkJCQkgIGNoYXIgKnN0cmluZywKLQkJCQkJICBSTkRYUiAqcm5keCwgbG9uZyBpc3ltLAotCQkJCQkgIGNvbnN0IGNoYXIgKndoaWNoKSk7Ci1zdGF0aWMgY2hhciAqZWNvZmZfdHlwZV90b19zdHJpbmcgUEFSQU1TICgoYmZkICphYmZkLCBGRFIgKmZkciwKLQkJCQkJICAgdW5zaWduZWQgaW50IGluZHgpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQlhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGludCBlY29mZl9zb3J0X2hkcnMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9nZXRfZXh0ciBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHVuc2lnbmVkIGludCBlY29mZl9hcm1hcF9oYXNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKnMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCAqcmVoYXNoLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50IGhsb2cpKTsKLQwKLS8qIFRoaXMgc3R1ZmYgaXMgc29tZXdoYXQgY29waWVkIGZyb20gY29mZmNvZGUuaC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiBiZmRfZGVidWdfc2VjdGlvbiA9Ci17Ci0gIC8qIG5hbWUsICAgaW5kZXgsIG5leHQsIGZsYWdzLCBzZXRfdm1hLCByZWxvY19kb25lLCBsaW5rZXJfbWFyaywgZ2NfbWFyayAqLwotICAiKkRFQlVHKiIsIDAsICAgICAwLCAgICAwLCAgICAgMCwgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgIDAsCi0gIC8qIHZtYSwgbG1hLCBfY29va2VkX3NpemUsIF9yYXdfc2l6ZSwgb3V0cHV0X29mZnNldCwgb3V0cHV0X3NlY3Rpb24sICovCi0gIDAsICAgICAgMCwgICAwLCAgICAgICAgICAgIDAsICAgICAgICAgMCwgICAgICAgICAgICAgTlVMTCwKLSAgLyogYWxpZywgcmVsb2MuLi4sIG9yZWwuLi4sIHJlbG9jX2NvdW50LCBmaWxlcG9zLCByZWxfLi4uLCBsaW5lXy4uLiAqLwotICAwLCAgICAgICAwLCAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgIDAsICAgICAgIDAsIAkgICAwLAotICAvKiB1c2VyZGF0YSwgY29udGVudHMsIGxpbmVubywgbGluZW5vX2NvdW50ICovCi0gIDAsICAgICAgICAgICAwLCAgICAgICAgMCwgICAgICAwLAotICAvKiBjb21kYXRfaW5mbywgbW92aW5nX2xpbmVfZmlsZXBvcywgdGFyZ2V0X2luZGV4LCB1c2VkX2J5X2JmZCwgICovCi0gIE5VTEwsICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgIDAsCi0gIC8qIGNvbnMsIG93bmVyLCBzeW1ib2wgKi8KLSAgMCwgICAgICAgMCwgICAgIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopIE5VTEwsCi0gIC8qIHN5bWJvbF9wdHJfcHRyLCAgICAgICAgICAgICAgICAgICBsaW5rX29yZGVyX2hlYWQsIC4uLl90YWlsICovCi0gIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSBOVUxMLCBOVUxMLCAgICAgICAgICAgIE5VTEwKLX07Ci0KLS8qIENyZWF0ZSBhbiBFQ09GRiBvYmplY3QuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID0gKChzdHJ1Y3QgZWNvZmZfdGRhdGEgKikKLQkJCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGVjb2ZmX2RhdGFfdHlwZSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAotICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotCi1QVFIKLV9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICppbnRlcm5hbF9hID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7Ci0gIGVjb2ZmX2RhdGFfdHlwZSAqZWNvZmY7Ci0KLSAgaWYgKF9iZmRfZWNvZmZfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBOVUxMOwotCi0gIGVjb2ZmID0gZWNvZmZfZGF0YSAoYWJmZCk7Ci0gIGVjb2ZmLT5ncF9zaXplID0gODsKLSAgZWNvZmYtPnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7Ci0KLSAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGVjb2ZmLT50ZXh0X3N0YXJ0ID0gaW50ZXJuYWxfYS0+dGV4dF9zdGFydDsKLSAgICAgIGVjb2ZmLT50ZXh0X2VuZCA9IGludGVybmFsX2EtPnRleHRfc3RhcnQgKyBpbnRlcm5hbF9hLT50c2l6ZTsKLSAgICAgIGVjb2ZmLT5ncCA9IGludGVybmFsX2EtPmdwX3ZhbHVlOwotICAgICAgZWNvZmYtPmdwcm1hc2sgPSBpbnRlcm5hbF9hLT5ncHJtYXNrOwotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQllY29mZi0+Y3BybWFza1tpXSA9IGludGVybmFsX2EtPmNwcm1hc2tbaV07Ci0gICAgICBlY29mZi0+ZnBybWFzayA9IGludGVybmFsX2EtPmZwcm1hc2s7Ci0gICAgICBpZiAoaW50ZXJuYWxfYS0+bWFnaWMgPT0gRUNPRkZfQU9VVF9aTUFHSUMpCi0JYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKLSAgICAgIGVsc2UKLQlhYmZkLT5mbGFncyAmPX4gRF9QQUdFRDsKLSAgICB9Ci0KLSAgLyogSXQgdHVybnMgb3V0IHRoYXQgbm8gc3BlY2lhbCBhY3Rpb24gaXMgcmVxdWlyZWQgYnkgdGhlIE1JUFMgb3IKLSAgICAgQWxwaGEgRUNPRkYgYmFja2VuZHMuICBUaGV5IGhhdmUgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoZQotICAgICBhLm91dCBoZWFkZXIsIGJ1dCB3ZSBqdXN0IGNvcHkgaXQgYWxsIChlLmcuLCBncHJtYXNrLCBjcHJtYXNrIGFuZAotICAgICBmcHJtYXNrKSBhbmQgbGV0IHRoZSBzd2FwcGluZyByb3V0aW5lcyBlbnN1cmUgdGhhdCBvbmx5IHJlbGV2YW50Ci0gICAgIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLQotICByZXR1cm4gKFBUUikgZWNvZmY7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBuZXcgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSA0OwotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9URVhUKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9JTklUKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9GSU5JKSA9PSAwKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0RBVEEpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9TREFUQSkgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9SREFUQSkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJVDgpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSVQ0KSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfUkNPTlNUKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfUERBVEEpID09IDApCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfQlNTKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfU0JTUykgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBBbiBJcml4IDQgc2hhcmVkIGxpYmFyeS4gICovCi0gICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICB9Ci0KLSAgLyogUHJvYmFibHkgYW55IG90aGVyIHNlY3Rpb24gbmFtZSBpcyBTRUNfTkVWRVJfTE9BRCwgYnV0IEknbQotICAgICB1bmNlcnRhaW4gYWJvdXQgLmluaXQgb24gc29tZSBzeXN0ZW1zIGFuZCBJIGRvbid0IGtub3cgaG93IHNoYXJlZAotICAgICBsaWJyYXJpZXMgd29yay4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIHR5cGUuICBUaGlzIGlzIGNhbGxlZCBmcm9tCi0gICB0aGUgZ2VuZXJpYyBDT0ZGIHJvdXRpbmVzLiAgSXQgaXMgdGhlIGludmVyc2Ugb2YgZWNvZmZfZ2V0X21hZ2ljLAotICAgYmVsb3cuICBUaGlzIGNvdWxkIGJlIGFuIEVDT0ZGIGJhY2tlbmQgcm91dGluZSwgd2l0aCBvbmUgdmVyc2lvbgotICAgZm9yIGVhY2ggdGFyZ2V0LCBidXQgdGhlcmUgYXJlbid0IGFsbCB0aGF0IG1hbnkgRUNPRkYgdGFyZ2V0cy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgdW5zaWduZWQgbG9uZyBtYWNoOwotCi0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBNSVBTX01BR0lDXzE6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRToKLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBtYWNoID0gMzAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRTI6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzI6Ci0gICAgICAvKiBNSVBTIElTQSBsZXZlbCAyOiB0aGUgcjYwMDAgKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbWFjaCA9IDYwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEUzOgotICAgIGNhc2UgTUlQU19NQUdJQ19CSUczOgotICAgICAgLyogTUlQUyBJU0EgbGV2ZWwgMzogdGhlIHI0MDAwICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICAgIG1hY2ggPSA0MDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2FscGhhOwotICAgICAgbWFjaCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIG1hY2ggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKTsKLX0KLQotLyogR2V0IHRoZSBtYWdpYyBudW1iZXIgdG8gdXNlIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUuCi0gICBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLCBhYm92ZS4gICovCi0KLXN0YXRpYyBpbnQKLWVjb2ZmX2dldF9tYWdpYyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgYmlnLCBsaXR0bGU7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSAwOgotCWNhc2UgMzAwMDoKLQkgIGJpZyA9IE1JUFNfTUFHSUNfQklHOwotCSAgbGl0dGxlID0gTUlQU19NQUdJQ19MSVRUTEU7Ci0JICBicmVhazsKLQotCWNhc2UgNjAwMDoKLQkgIGJpZyA9IE1JUFNfTUFHSUNfQklHMjsKLQkgIGxpdHRsZSA9IE1JUFNfTUFHSUNfTElUVExFMjsKLQkgIGJyZWFrOwotCi0JY2FzZSA0MDAwOgotCSAgYmlnID0gTUlQU19NQUdJQ19CSUczOwotCSAgbGl0dGxlID0gTUlQU19NQUdJQ19MSVRUTEUzOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICByZXR1cm4gYmZkX2JpZ19lbmRpYW4gKGFiZmQpID8gYmlnIDogbGl0dGxlOwotCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIHJldHVybiBBTFBIQV9NQUdJQzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogR2V0IHRoZSBzZWN0aW9uIHNfZmxhZ3MgdG8gdXNlIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgbG9uZwotZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MgKG5hbWUsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgbG9uZyBzdHlwOwotCi0gIHN0eXAgPSAwOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsIF9URVhUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1RFWFQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0RBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfU0RBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JEQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1JEQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVDgpID09IDApCi0gICAgc3R5cCA9IFNUWVBfTElUODsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUNCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9MSVQ0OwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0gICAgc3R5cCA9IFNUWVBfQlNTOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9TQlNTKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1NCU1M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0lOSVQpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRUNPRkZfSU5JVDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRklOSSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9FQ09GRl9GSU5JOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9QREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9QREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfWERBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfWERBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJQikgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9FQ09GRl9MSUI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0dPVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9HT1Q7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0hBU0gpID09IDApCi0gICAgc3R5cCA9IFNUWVBfSEFTSDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRFlOQU1JQykgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9EWU5BTUlDOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSUJMSVNUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJQkxJU1Q7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JFTERZTikgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9SRUxEWU47Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0NPTkZMSUMpID09IDApCi0gICAgc3R5cCA9IFNUWVBfQ09ORkxJQzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRFlOU1RSKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RZTlNUUjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRFlOU1lNKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RZTlNZTTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQ09NTUVOVCkgPT0gMCkKLSAgICB7Ci0gICAgICBzdHlwID0gU1RZUF9DT01NRU5UOwotICAgICAgZmxhZ3MgJj1+IFNFQ19ORVZFUl9MT0FEOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkNPTlNUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1JDT05TVDsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfQ09ERSkgCi0gICAgc3R5cCA9IFNUWVBfVEVYVDsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfREFUQSkgCi0gICAgc3R5cCA9IFNUWVBfREFUQTsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfUkVBRE9OTFkpCi0gICAgc3R5cCA9IFNUWVBfUkRBVEE7Ci0gIGVsc2UgaWYgKGZsYWdzICYgU0VDX0xPQUQpCi0gICAgc3R5cCA9IFNUWVBfUkVHOwotICBlbHNlCi0gICAgc3R5cCA9IFNUWVBfQlNTOwotCi0gIGlmIChmbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotICAgIHN0eXAgfD0gU1RZUF9OT0xPQUQ7Ci0KLSAgcmV0dXJuIHN0eXA7Ci19Ci0KLS8qIEdldCB0aGUgQkZEIGZsYWdzIHRvIHVzZSBmb3IgYSBzZWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1mbGFnd29yZAotX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyAoYWJmZCwgaGRyLCBuYW1lLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGhkcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICppbnRlcm5hbF9zID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaGRyOwotICBsb25nIHN0eXBfZmxhZ3MgPSBpbnRlcm5hbF9zLT5zX2ZsYWdzOwotICBmbGFnd29yZCBzZWNfZmxhZ3M9MDsKLQotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQotICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLQotICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCi0gICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCi0gIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfVEVYVCkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOQU1JQykKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSUJMSVNUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1JFTERZTikKLSAgICAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT05GTElDCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOU1RSKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0RZTlNZTSkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9IQVNIKSkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfREFUQSkKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfUkRBVEEpCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1NEQVRBKQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9QREFUQQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9YREFUQQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9HT1QpCi0JICAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1JDT05TVCkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX1JEQVRBKQotCSAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1BEQVRBCi0JICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfUkNPTlNUKQotCXNlY19mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9TQlNTKSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9MSVRBKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ4KQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ0KSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICAgIH0KLQotICByZXR1cm4gc2VjX2ZsYWdzOwotfQotDAotLyogUmVhZCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyIGZvciBhbiBFQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgUFRSIHJhdyA9IE5VTEw7Ci0gIEhEUlIgKmludGVybmFsX3N5bWhkcjsKLQotICAvKiBTZWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIGl0IGluLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5tYWdpYyA9PSAKLSAgICAgIGJhY2tlbmQtPmRlYnVnX3N3YXAuc3ltX21hZ2ljKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSB3aGV0aGVyIHRoZXJlIGlzIGEgc3ltYm9saWMgaGVhZGVyLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpIGhvbGRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scwotICAgICBhcyByZWFkIGZyb20gdGhlIGZpbGUgaGVhZGVyLCBidXQgb24gRUNPRkYgdGhpcyBpcyBhbHdheXMgdGhlCi0gICAgIHNpemUgb2YgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8KLSAgICAgaGFuZGxlIHRoaXMgd2hlbiB3ZSBmaXJzdCByZWFkIHRoZSBmaWxlIGluIGNvZmZnZW4uYy4gICovCi0gIGV4dGVybmFsX2hkcl9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IGV4dGVybmFsX2hkcl9zaXplKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBoZWFkZXIuICAqLwotICByYXcgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChyYXcgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcywgU0VFS19TRVQpID09IC0xCi0gICAgICB8fCAoYmZkX3JlYWQgKHJhdywgZXh0ZXJuYWxfaGRyX3NpemUsIDEsIGFiZmQpCi0JICAhPSBleHRlcm5hbF9oZHJfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGludGVybmFsX3N5bWhkciA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0gICgqYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2hkcl9pbikgKGFiZmQsIHJhdywgaW50ZXJuYWxfc3ltaGRyKTsKLQotICBpZiAoaW50ZXJuYWxfc3ltaGRyLT5tYWdpYyAhPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN5bV9tYWdpYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBOb3cgd2UgY2FuIGdldCB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gKGludGVybmFsX3N5bWhkci0+aXN5bU1heAotCQkJICAgICArIGludGVybmFsX3N5bWhkci0+aWV4dE1heCk7Ci0KLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgaW1wb3J0YW50IHN5bWJvbGljIGluZm9ybWF0aW9uIGZvciBhbiBFQ09GRgotICAgb2JqZWN0IGZpbGUuICBUaGlzIGlzIGNhbGxlZCBieSBnZGIgdmlhIHRoZSByZWFkX2RlYnVnX2luZm8gZW50cnkKLSAgIHBvaW50IGluIHRoZSBiYWNrZW5kIHN0cnVjdHVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCBpZ25vcmUsIGRlYnVnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBIRFJSICppbnRlcm5hbF9zeW1oZHI7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X2Jhc2U7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X3NpemU7Ci0gIFBUUiByYXc7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGNoYXIgKmZyYXdfc3JjOwotICBjaGFyICpmcmF3X2VuZDsKLSAgc3RydWN0IGZkciAqZmRyX3B0cjsKLSAgYmZkX3NpemVfdHlwZSByYXdfZW5kOwotICBiZmRfc2l6ZV90eXBlIGNiX2VuZDsKLQotICBCRkRfQVNTRVJUIChkZWJ1ZyA9PSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgd2UndmUgYWxyZWFkeSBnb3R0ZW4gaXQsIGFuZCB3aGV0aGVyIHRoZXJlJ3MgYW55IHRvCi0gICAgIGdldC4gICovCi0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+cmF3X3N5bWVudHMgIT0gKFBUUikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoISBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnRlcm5hbF9zeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLQotICAvKiBSZWFkIGFsbCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gYXQgb25jZS4gICovCi0gIHJhd19iYXNlID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcwotCSAgICAgICsgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0KLSAgLyogQWxwaGEgZWNvZmYgbWFrZXMgdGhlIGRldGVybWluYXRpb24gb2YgcmF3X3NpemUgZGlmZmljdWx0LiBJdCBoYXMKLSAgICAgYW4gdW5kb2N1bWVudGVkIGRlYnVnIGRhdGEgc2VjdGlvbiBiZXR3ZWVuIHRoZSBzeW1oZHIgYW5kIHRoZSBmaXJzdAotICAgICBkb2N1bWVudGVkIHNlY3Rpb24uIEFuZCB0aGUgb3JkZXJpbmcgb2YgdGhlIHNlY3Rpb25zIHZhcmllcyBiZXR3ZWVuCi0gICAgIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcy4KLSAgICAgSWYgYmZkIHN1cHBvcnRzIFNFRUtfRU5EIHNvbWVkYXksIHRoaXMgY29kZSBjb3VsZCBiZSBzaW1wbGlmaWVkLiAgKi8KLQotICByYXdfZW5kID0gMDsKLQotI2RlZmluZSBVUERBVEVfUkFXX0VORChzdGFydCwgY291bnQsIHNpemUpIFwKLSAgY2JfZW5kID0gaW50ZXJuYWxfc3ltaGRyLT5zdGFydCArIGludGVybmFsX3N5bWhkci0+Y291bnQgKiAoc2l6ZSk7IFwKLSAgaWYgKGNiX2VuZCA+IHJhd19lbmQpIFwKLSAgICByYXdfZW5kID0gY2JfZW5kCi0KLSAgVVBEQVRFX1JBV19FTkQgKGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiRG5PZmZzZXQsIGlkbk1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9kbnJfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlBkT2Zmc2V0LCBpcGRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfcGRyX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JTeW1PZmZzZXQsIGlzeW1NYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfc3ltX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JPcHRPZmZzZXQsIGlvcHRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfb3B0X3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBVUERBVEVfUkFXX0VORCAoY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYkZkT2Zmc2V0LCBpZmRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZmRyX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JSZmRPZmZzZXQsIGNyZmQsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfcmZkX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JFeHRPZmZzZXQsIGlleHRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemUpOwotCi0jdW5kZWYgVVBEQVRFX1JBV19FTkQKLQotICByYXdfc2l6ZSA9IHJhd19lbmQgLSByYXdfYmFzZTsKLSAgaWYgKHJhd19zaXplID09IDApCi0gICAgewotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmF3ID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByYXdfc2l6ZSk7Ci0gIGlmIChyYXcgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcwotCQkgKyBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplKSwKLQkJU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChyYXcsIHJhd19zaXplLCAxLCBhYmZkKSAhPSByYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmF3KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnJhd19zeW1lbnRzID0gcmF3OwotCi0gIC8qIEdldCBwb2ludGVycyBmb3IgdGhlIG51bWVyaWMgb2Zmc2V0cyBpbiB0aGUgSERSUiBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBGSVgob2ZmMSwgb2ZmMiwgdHlwZSkgXAotICBpZiAoaW50ZXJuYWxfc3ltaGRyLT5vZmYxID09IDApIFwKLSAgICBkZWJ1Zy0+b2ZmMiA9ICh0eXBlKSBOVUxMOyBcCi0gIGVsc2UgXAotICAgIGRlYnVnLT5vZmYyID0gKHR5cGUpICgoY2hhciAqKSByYXcgXAotCQkJICArIChpbnRlcm5hbF9zeW1oZHItPm9mZjEgXAotCQkJICAgICAtIHJhd19iYXNlKSkKLSAgRklYIChjYkxpbmVPZmZzZXQsIGxpbmUsIHVuc2lnbmVkIGNoYXIgKik7Ci0gIEZJWCAoY2JEbk9mZnNldCwgZXh0ZXJuYWxfZG5yLCBQVFIpOwotICBGSVggKGNiUGRPZmZzZXQsIGV4dGVybmFsX3BkciwgUFRSKTsKLSAgRklYIChjYlN5bU9mZnNldCwgZXh0ZXJuYWxfc3ltLCBQVFIpOwotICBGSVggKGNiT3B0T2Zmc2V0LCBleHRlcm5hbF9vcHQsIFBUUik7Ci0gIEZJWCAoY2JBdXhPZmZzZXQsIGV4dGVybmFsX2F1eCwgdW5pb24gYXV4X2V4dCAqKTsKLSAgRklYIChjYlNzT2Zmc2V0LCBzcywgY2hhciAqKTsKLSAgRklYIChjYlNzRXh0T2Zmc2V0LCBzc2V4dCwgY2hhciAqKTsKLSAgRklYIChjYkZkT2Zmc2V0LCBleHRlcm5hbF9mZHIsIFBUUik7Ci0gIEZJWCAoY2JSZmRPZmZzZXQsIGV4dGVybmFsX3JmZCwgUFRSKTsKLSAgRklYIChjYkV4dE9mZnNldCwgZXh0ZXJuYWxfZXh0LCBQVFIpOwotI3VuZGVmIEZJWAotCi0gIC8qIEkgZG9uJ3Qgd2FudCB0byBhbHdheXMgc3dhcCBhbGwgdGhlIGRhdGEsIGJlY2F1c2UgaXQgd2lsbCBqdXN0Ci0gICAgIHdhc3RlIHRpbWUgYW5kIG1vc3QgcHJvZ3JhbXMgd2lsbCBuZXZlciBsb29rIGF0IGl0LiAgVGhlIG9ubHkKLSAgICAgdGltZSB0aGUgbGlua2VyIG5lZWRzIG1vc3Qgb2YgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBzd2FwcGVkCi0gICAgIGlzIHdoZW4gbGlua2luZyBiaWctZW5kaWFuIGFuZCBsaXR0bGUtZW5kaWFuIE1JUFMgb2JqZWN0IGZpbGVzCi0gICAgIHRvZ2V0aGVyLCB3aGljaCBpcyBub3QgYSBjb21tb24gb2NjdXJyZW5jZS4KLQotICAgICBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIGZkciB0byBkZWFsIHdpdGggYSBsb3Qgb2YgaW5mb3JtYXRpb24gaW4KLSAgICAgdGhlIHN5bWJvbHMsIHNvIHdlIHN3YXAgdGhlbSBoZXJlLiAgKi8KLSAgZGVidWctPmZkciA9IChzdHJ1Y3QgZmRyICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJIChpbnRlcm5hbF9zeW1oZHItPmlmZE1heCAqCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgZmRyKSkpOwotICBpZiAoZGVidWctPmZkciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZXh0ZXJuYWxfZmRyX3NpemUgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2Zkcl9zaXplOwotICBmZHJfcHRyID0gZGVidWctPmZkcjsKLSAgZnJhd19zcmMgPSAoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfZmRyOwotICBmcmF3X2VuZCA9IGZyYXdfc3JjICsgaW50ZXJuYWxfc3ltaGRyLT5pZmRNYXggKiBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgZm9yICg7IGZyYXdfc3JjIDwgZnJhd19lbmQ7IGZyYXdfc3JjICs9IGV4dGVybmFsX2Zkcl9zaXplLCBmZHJfcHRyKyspCi0gICAgKCpiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfZmRyX2luKSAoYWJmZCwgKFBUUikgZnJhd19zcmMsIGZkcl9wdHIpOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgc3ltYm9sIHRhYmxlIHJvdXRpbmVzLiAgVGhlIEVDT0ZGIHN5bWJvbCB0YWJsZSBpcyBkZXNjcmliZWQKLSAgIGluIGdjYy9taXBzLXRmaWxlLmMuICAqLwotCi0vKiBFQ09GRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZQotICAgb3RoZXIgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQKLSAgIHRvZ2V0aGVyLCBhbmQgdGhlbiByZWZlcmVuY2VkIHZpYSB0aGUgZ3AgcG9pbnRlciwgd2hpY2ggeWllbGRzCi0gICBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzIGlzIHdoYXQgd2UgdXNlIGZvciB0aGUgc21hbGwgY29tbW9uCi0gICBzZWN0aW9uLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBlY29mZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBlY29mZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICplY29mZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIENyZWF0ZSBhbiBlbXB0eSBzeW1ib2wuICAqLwotCi1hc3ltYm9sICoKLV9iZmRfZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKm5ldzsKLQotICBuZXcgPSAoZWNvZmZfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVjb2ZmX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcgPT0gKGVjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwpCi0gICAgcmV0dXJuIChhc3ltYm9sICopIE5VTEw7Ci0gIG1lbXNldCAoKFBUUikgbmV3LCAwLCBzaXplb2YgKm5ldyk7Ci0gIG5ldy0+c3ltYm9sLnNlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgbmV3LT5mZHIgPSAoRkRSICopIE5VTEw7Ci0gIG5ldy0+bG9jYWwgPSBmYWxzZTsKLSAgbmV3LT5uYXRpdmUgPSBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLyogU2V0IHRoZSBCRkQgZmxhZ3MgYW5kIHNlY3Rpb24gZm9yIGFuIEVDT0ZGIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9zZXRfc3ltYm9sX2luZm8gKGFiZmQsIGVjb2ZmX3N5bSwgYXN5bSwgZXh0LCB3ZWFrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFNZTVIgKmVjb2ZmX3N5bTsKLSAgICAgYXN5bWJvbCAqYXN5bTsKLSAgICAgaW50IGV4dDsKLSAgICAgaW50IHdlYWs7Ci17Ci0gIGFzeW0tPnRoZV9iZmQgPSBhYmZkOwotICBhc3ltLT52YWx1ZSA9IGVjb2ZmX3N5bS0+dmFsdWU7Ci0gIGFzeW0tPnNlY3Rpb24gPSAmYmZkX2RlYnVnX3NlY3Rpb247Ci0gIGFzeW0tPnVkYXRhLmkgPSAwOwotCi0gIC8qIE1vc3Qgc3ltYm9sIHR5cGVzIGFyZSBqdXN0IGZvciBkZWJ1Z2dpbmcuICAqLwotICBzd2l0Y2ggKGVjb2ZmX3N5bS0+c3QpCi0gICAgewotICAgIGNhc2Ugc3RHbG9iYWw6Ci0gICAgY2FzZSBzdFN0YXRpYzoKLSAgICBjYXNlIHN0TGFiZWw6Ci0gICAgY2FzZSBzdFByb2M6Ci0gICAgY2FzZSBzdFN0YXRpY1Byb2M6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHN0TmlsOgotICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKGVjb2ZmX3N5bSkpCi0JewotCSAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAod2VhaykKLSAgICBhc3ltLT5mbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfV0VBSzsKLSAgZWxzZSBpZiAoZXh0KQotICAgIGFzeW0tPmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKLSAgICAgIC8qIE5vcm1hbGx5LCBhIGxvY2FsIHN0UHJvYyBzeW1ib2wgd2lsbCBoYXZlIGEgY29ycmVzcG9uZGluZwotICAgICAgICAgZXh0ZXJuYWwgc3ltYm9sLiAgV2UgbWFyayB0aGUgbG9jYWwgc3ltYm9sIGFzIGEgZGVidWdnaW5nCi0gICAgICAgICBzeW1ib2wsIGluIG9yZGVyIHRvIHByZXZlbnQgbm0gZnJvbSBwcmludGluZyBib3RoIG91dC4KLSAgICAgICAgIFNpbWlsYXJseSwgd2UgbWFyayBzdExhYmVsIGFuZCBzdGFicyBzeW1ib2xzIGFzIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9scy4gIEluIGJvdGggY2FzZXMsIHdlIGRvIHdhbnQgdG8gc2V0IHRoZSB2YWx1ZQotICAgICAgICAgY29ycmVjdGx5IGJhc2VkIG9uIHRoZSBzeW1ib2wgY2xhc3MuICAqLwotICAgICAgaWYgKGVjb2ZmX3N5bS0+c3QgPT0gc3RQcm9jCi0JICB8fCBlY29mZl9zeW0tPnN0ID09IHN0TGFiZWwKLQkgIHx8IEVDT0ZGX0lTX1NUQUIgKGVjb2ZmX3N5bSkpCi0JYXN5bS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgICB9Ci0gIHN3aXRjaCAoZWNvZmZfc3ltLT5zYykKLSAgICB7Ci0gICAgY2FzZSBzY05pbDoKLSAgICAgIC8qIFVzZWQgZm9yIGNvbXBpbGVyIGdlbmVyYXRlZCBsYWJlbHMuICBMZWF2ZSB0aGVtIGluIHRoZQotCSBkZWJ1Z2dpbmcgc2VjdGlvbiwgYW5kIG1hcmsgdGhlbSBhcyBsb2NhbC4gIElmIEJTRl9ERUJVR0dJTkcKLQkgaXMgc2V0LCB0aGVuIG5tIGRvZXMgbm90IGRpc3BsYXkgdGhlbSBmb3Igc29tZSByZWFzb24uICBJZiBubwotCSBmbGFncyBhcmUgc2V0IHRoZW4gdGhlIGxpbmtlciB3aGluZXMgYWJvdXQgdGhlbS4gICovCi0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NUZXh0OgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50ZXh0Iik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjRGF0YToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZGF0YSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0JzczoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuYnNzIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjUmVnaXN0ZXI6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQWJzOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjVW5kZWZpbmVkOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBhc3ltLT5mbGFncyA9IDA7Ci0gICAgICBhc3ltLT52YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQ2RiTG9jYWw6Ci0gICAgY2FzZSBzY0JpdHM6Ci0gICAgY2FzZSBzY0NkYlN5c3RlbToKLSAgICBjYXNlIHNjUmVnSW1hZ2U6Ci0gICAgY2FzZSBzY0luZm86Ci0gICAgY2FzZSBzY1VzZXJTdHJ1Y3Q6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjU0RhdGE6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNkYXRhIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjU0JzczoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2JzcyIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1JEYXRhOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5yZGF0YSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1ZhcjoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NDb21tb246Ci0gICAgICBpZiAoYXN5bS0+dmFsdWUgPiBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSkKLQl7Ci0JICBhc3ltLT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGFzeW0tPmZsYWdzID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBzY1NDb21tb246Ci0gICAgICBpZiAoZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBlY29mZl9zY29tX3NlY3Rpb24ubmFtZSA9IFNDT01NT047Ci0JICBlY29mZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmZWNvZmZfc2NvbV9zeW1ib2xfcHRyOwotCSAgZWNvZmZfc2NvbV9zeW1ib2wubmFtZSA9IFNDT01NT047Ci0JICBlY29mZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIGVjb2ZmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgZWNvZmZfc2NvbV9zeW1ib2xfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+ZmxhZ3MgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1ZhclJlZ2lzdGVyOgotICAgIGNhc2Ugc2NWYXJpYW50OgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1NVbmRlZmluZWQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGFzeW0tPmZsYWdzID0gMDsKLSAgICAgIGFzeW0tPnZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NJbml0OgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5pbml0Iik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQmFzZWRWYXI6Ci0gICAgY2FzZSBzY1hEYXRhOgotICAgIGNhc2Ugc2NQRGF0YToKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NGaW5pOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5maW5pIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjUkNvbnN0OgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5yY29uc3QiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3Igc3BlY2lhbCBjb25zdHJ1Y3RvcnMgc3ltYm9scyBhbmQgbWFrZSByZWxvY2F0aW9uIGVudHJpZXMKLSAgICAgaW4gYSBzcGVjaWFsIGNvbnN0cnVjdGlvbiBzZWN0aW9uLiAgVGhlc2UgYXJlIHByb2R1Y2VkIGJ5IHRoZQotICAgICAtZmdudS1saW5rZXIgYXJndW1lbnQgdG8gZysrLiAgKi8KLSAgaWYgKEVDT0ZGX0lTX1NUQUIgKGVjb2ZmX3N5bSkpCi0gICAgewotICAgICAgc3dpdGNoIChFQ09GRl9VTk1BUktfU1RBQiAoZWNvZmZfc3ltLT5pbmRleCkpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgTl9TRVRBOgotCWNhc2UgTl9TRVRUOgotCWNhc2UgTl9TRVREOgotCWNhc2UgTl9TRVRCOgotCSAgewotCSAgICAvKiBUaGlzIGNvZGUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIEl0IHVzZWQgdG8gYmUgdXNlZCB0bwotCSAgICAgICBtYWtlIHRoZSBsaW5rZXIgaGFuZGxlIHNldCBzeW1ib2xzLCBidXQgdGhleSBhcmUgbm93Ci0JICAgICAgIGhhbmRsZWQgaW4gdGhlIGFkZF9zeW1ib2xzIHJvdXRpbmUgaW5zdGVhZC4gICovCi0jaWYgMAotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkgICAgYXJlbGVudF9jaGFpbiAqcmVsb2NfY2hhaW47Ci0JICAgIHVuc2lnbmVkIGludCBiaXRzaXplOwotCi0JICAgIC8qIEdldCBhIHNlY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzeW1ib2wgKHVzdWFsbHkKLQkgICAgICAgX19DVE9SX0xJU1RfXyBvciBfX0RUT1JfTElTVF9fKS4gIEZJWE1FOiBnY2MgdXNlcyB0aGUKLQkgICAgICAgbmFtZSBfX19DVE9SX0xJU1QgKHRocmVlIHVuZGVyc2NvcmVzKS4gIFdlIG5lZWQKLQkgICAgICAgX19DVE9SX0xJU1QgKHR3byB1bmRlcnNjb3JlcyksIHNpbmNlIEVDT0ZGIGRvZXNuJ3QgdXNlCi0JICAgICAgIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgVGhpcyBzaG91bGQgYmUgaGFuZGxlZCBieSBnY2MsCi0JICAgICAgIGJ1dCBpbnN0ZWFkIHdlIGRvIGl0IGhlcmUuICBBY3R1YWxseSwgdGhpcyBzaG91bGQgYWxsCi0JICAgICAgIGJlIGRvbmUgZGlmZmVyZW50bHkgYW55aG93LiAgKi8KLQkgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKGFzeW0pOwotCSAgICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnXycgJiYgbmFtZVsyXSA9PSAnXycpCi0JICAgICAgewotCQkrK25hbWU7Ci0JCWFzeW0tPm5hbWUgPSBuYW1lOwotCSAgICAgIH0KLQkgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgICAgaWYgKHNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgICAgewotCQljaGFyICpjb3B5OwotCi0JCWNvcHkgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZSkgKyAxKTsKLQkJaWYgKCFjb3B5KQotCQkgIHJldHVybiBmYWxzZTsKLQkJc3RyY3B5IChjb3B5LCBuYW1lKTsKLQkJc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGNvcHkpOwotCSAgICAgIH0KLQotCSAgICAvKiBCdWlsZCBhIHJlbG9jIHBvaW50aW5nIHRvIHRoaXMgY29uc3RydWN0b3IuICAqLwotCSAgICByZWxvY19jaGFpbiA9Ci0JICAgICAgKGFyZWxlbnRfY2hhaW4gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnRfY2hhaW4pKTsKLQkgICAgaWYgKCFyZWxvY19jaGFpbikKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICAgIGJmZF9nZXRfc2VjdGlvbiAoYXN5bSktPnN5bWJvbF9wdHJfcHRyOwotCSAgICByZWxvY19jaGFpbi0+cmVsZW50LmFkZHJlc3MgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuYWRkZW5kID0gYXN5bS0+dmFsdWU7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuaG93dG8gPQotCSAgICAgIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5jb25zdHJ1Y3Rvcl9yZWxvYzsKLQotCSAgICAvKiBTZXQgdXAgdGhlIGNvbnN0cnVjdG9yIHNlY3Rpb24gdG8gaG9sZCB0aGUgcmVsb2MuICAqLwotCSAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19DT05TVFJVQ1RPUjsKLQkgICAgKytzZWN0aW9uLT5yZWxvY19jb3VudDsKLQotCSAgICAvKiBDb25zdHJ1Y3RvciBzZWN0aW9ucyBtdXN0IGJlIHJvdW5kZWQgdG8gYSBib3VuZGFyeQotCSAgICAgICBiYXNlZCBvbiB0aGUgYml0c2l6ZS4gIFRoZXNlIGFyZSBub3QgcmVhbCBzZWN0aW9ucy0tCi0JICAgICAgIHRoZXkgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IHRoZSBsaW5rZXItLXNvIHRoZSBFQ09GRgotCSAgICAgICAxNiBieXRlIGFsaWdubWVudCByZXN0cmljdGlvbiBkb2VzIG5vdCBhcHBseS4gICovCi0JICAgIGJpdHNpemUgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+Y29uc3RydWN0b3JfYml0c2l6ZTsKLQkgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMTsKLQkgICAgd2hpbGUgKCgxIDw8IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcikgPCBiaXRzaXplIC8gOCkKLQkgICAgICArK3NlY3Rpb24tPmFsaWdubWVudF9wb3dlcjsKLQotCSAgICByZWxvY19jaGFpbi0+bmV4dCA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotCSAgICBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbiA9IHJlbG9jX2NoYWluOwotCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgKz0gYml0c2l6ZSAvIDg7Ci0KLSNlbmRpZiAvKiAwICovCi0KLQkgICAgLyogTWFyayB0aGUgc3ltYm9sIGFzIGEgY29uc3RydWN0b3IuICAqLwotCSAgICBhc3ltLT5mbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbiBFQ09GRiBzeW1ib2wgdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3N5bV9zaXplOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSkKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9zeW1faW47Ci0gIGJmZF9zaXplX3R5cGUgaW50ZXJuYWxfc2l6ZTsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmludGVybmFsOwotICBlY29mZl9zeW1ib2xfdHlwZSAqaW50ZXJuYWxfcHRyOwotICBjaGFyICplcmF3X3NyYzsKLSAgY2hhciAqZXJhd19lbmQ7Ci0gIEZEUiAqZmRyX3B0cjsKLSAgRkRSICpmZHJfZW5kOwotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgcmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBkbyBub3RoaW5nLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5jYW5vbmljYWxfc3ltYm9scyAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEdldCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW50ZXJuYWxfc2l6ZSA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChlY29mZl9zeW1ib2xfdHlwZSk7Ci0gIGludGVybmFsID0gKGVjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgaW50ZXJuYWxfc2l6ZSk7Ci0gIGlmIChpbnRlcm5hbCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnRlcm5hbF9wdHIgPSBpbnRlcm5hbDsKLSAgZXJhd19zcmMgPSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9leHQ7Ci0gIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JICAgICAgKyAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgKLQkJICogZXh0ZXJuYWxfZXh0X3NpemUpKTsKLSAgZm9yICg7IGVyYXdfc3JjIDwgZXJhd19lbmQ7IGVyYXdfc3JjICs9IGV4dGVybmFsX2V4dF9zaXplLCBpbnRlcm5hbF9wdHIrKykKLSAgICB7Ci0gICAgICBFWFRSIGludGVybmFsX2VzeW07Ci0KLSAgICAgICgqc3dhcF9leHRfaW4pIChhYmZkLCAoUFRSKSBlcmF3X3NyYywgJmludGVybmFsX2VzeW0pOwotICAgICAgaW50ZXJuYWxfcHRyLT5zeW1ib2wubmFtZSA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zc2V4dAotCQkJCSAgICsgaW50ZXJuYWxfZXN5bS5hc3ltLmlzcyk7Ci0gICAgICBpZiAoIWVjb2ZmX3NldF9zeW1ib2xfaW5mbyAoYWJmZCwgJmludGVybmFsX2VzeW0uYXN5bSwKLQkJCQkgICZpbnRlcm5hbF9wdHItPnN5bWJvbCwgMSwKLQkJCQkgIGludGVybmFsX2VzeW0ud2Vha2V4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLyogVGhlIGFscGhhIHVzZXMgYSBuZWdhdGl2ZSBpZmQgZmllbGQgZm9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoaW50ZXJuYWxfZXN5bS5pZmQgPj0gMCkKLQlpbnRlcm5hbF9wdHItPmZkciA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5mZHIKLQkJCSAgICAgKyBpbnRlcm5hbF9lc3ltLmlmZCk7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfcHRyLT5mZHIgPSBOVUxMOwotICAgICAgaW50ZXJuYWxfcHRyLT5sb2NhbCA9IGZhbHNlOwotICAgICAgaW50ZXJuYWxfcHRyLT5uYXRpdmUgPSAoUFRSKSBlcmF3X3NyYzsKLSAgICB9Ci0KLSAgLyogVGhlIGxvY2FsIHN5bWJvbHMgbXVzdCBiZSBhY2Nlc3NlZCB2aWEgdGhlIGZkcidzLCBiZWNhdXNlIHRoZQotICAgICBzdHJpbmcgYW5kIGF1eCBpbmRpY2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgZmRyIGluZm9ybWF0aW9uLiAgKi8KLSAgZmRyX3B0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmZkcjsKLSAgZmRyX2VuZCA9IGZkcl9wdHIgKyBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWZkTWF4OwotICBmb3IgKDsgZmRyX3B0ciA8IGZkcl9lbmQ7IGZkcl9wdHIrKykKLSAgICB7Ci0gICAgICBjaGFyICpscmF3X3NyYzsKLSAgICAgIGNoYXIgKmxyYXdfZW5kOwotCi0gICAgICBscmF3X3NyYyA9ICgoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9zeW0KLQkJICArIGZkcl9wdHItPmlzeW1CYXNlICogZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgbHJhd19lbmQgPSBscmF3X3NyYyArIGZkcl9wdHItPmNzeW0gKiBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGZvciAoOwotCSAgIGxyYXdfc3JjIDwgbHJhd19lbmQ7Ci0JICAgbHJhd19zcmMgKz0gZXh0ZXJuYWxfc3ltX3NpemUsIGludGVybmFsX3B0cisrKQotCXsKLQkgIFNZTVIgaW50ZXJuYWxfc3ltOwotCi0JICAoKnN3YXBfc3ltX2luKSAoYWJmZCwgKFBUUikgbHJhd19zcmMsICZpbnRlcm5hbF9zeW0pOwotCSAgaW50ZXJuYWxfcHRyLT5zeW1ib2wubmFtZSA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zcwotCQkJCSAgICAgICArIGZkcl9wdHItPmlzc0Jhc2UKLQkJCQkgICAgICAgKyBpbnRlcm5hbF9zeW0uaXNzKTsKLQkgIGlmICghZWNvZmZfc2V0X3N5bWJvbF9pbmZvIChhYmZkLCAmaW50ZXJuYWxfc3ltLAotCQkJCSAgICAgICZpbnRlcm5hbF9wdHItPnN5bWJvbCwgMCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGludGVybmFsX3B0ci0+ZmRyID0gZmRyX3B0cjsKLQkgIGludGVybmFsX3B0ci0+bG9jYWwgPSB0cnVlOwotCSAgaW50ZXJuYWxfcHRyLT5uYXRpdmUgPSAoUFRSKSBscmF3X3NyYzsKLQl9Ci0gICAgfQotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5jYW5vbmljYWxfc3ltYm9scyA9IGludGVybmFsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRoZSBjYW5vbmljYWwgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoISBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChlY29mZl9zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLS8qIEdldCB0aGUgY2Fub25pY2FsIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX2Vjb2ZmX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICpzeW1iYXNlOwotICBlY29mZl9zeW1ib2xfdHlwZSAqKmxvY2F0aW9uID0gKGVjb2ZmX3N5bWJvbF90eXBlICoqKSBhbG9jYXRpb247Ci0KLSAgaWYgKF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHN5bWJhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+Y2Fub25pY2FsX3N5bWJvbHM7Ci0gIHdoaWxlIChjb3VudGVyIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpCi0gICAgewotICAgICAgKihsb2NhdGlvbisrKSA9IHN5bWJhc2UrKzsKLSAgICAgIGNvdW50ZXIrKzsKLSAgICB9Ci0gICpsb2NhdGlvbisrID0gKGVjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogVHVybiBFQ09GRiB0eXBlIGluZm9ybWF0aW9uIGludG8gYSBwcmludGFibGUgc3RyaW5nLgotICAgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgYW5kIGVjb2ZmX3R5cGVfdG9fc3RyaW5nIGFyZSBmcm9tCi0gICBnY2MvbWlwcy10ZHVtcC5jLCB3aXRoIHN3YXBwaW5nIGFkZGVkIGFuZCB1c2VkX3B0ciByZW1vdmVkLiAgKi8KLQotLyogV3JpdGUgYWdncmVnYXRlIGluZm9ybWF0aW9uIHRvIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHN0cmluZywgcm5keCwgaXN5bSwgd2hpY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRkRSICpmZHI7Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgUk5EWFIgKnJuZHg7Ci0gICAgIGxvbmcgaXN5bTsKLSAgICAgY29uc3QgY2hhciAqd2hpY2g7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcCA9Ci0gICAgJmVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm8gPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIHVuc2lnbmVkIGludCBpZmQgPSBybmR4LT5yZmQ7Ci0gIHVuc2lnbmVkIGludCBpbmR4ID0gcm5keC0+aW5kZXg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIAotICBpZiAoaWZkID09IDB4ZmZmKQotICAgIGlmZCA9IGlzeW07Ci0KLSAgLyogQW4gaWZkIG9mIC0xIGlzIGFuIG9wYXF1ZSB0eXBlLiAgQW4gZXNjYXBlZCBpbmRleCBvZiAwIGlzIGEKLSAgICAgc3RydWN0IHJldHVybiB0eXBlIG9mIGEgcHJvY2VkdXJlIGNvbXBpbGVkIHdpdGhvdXQgLWcuICAqLwotICBpZiAoaWZkID09IDB4ZmZmZmZmZmYKLSAgICAgIHx8IChybmR4LT5yZmQgPT0gMHhmZmYgJiYgaW5keCA9PSAwKSkKLSAgICBuYW1lID0gIjx1bmRlZmluZWQ+IjsKLSAgZWxzZSBpZiAoaW5keCA9PSBpbmRleE5pbCkKLSAgICBuYW1lID0gIjxubyBuYW1lPiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTWU1SIHN5bTsKLQotICAgICAgaWYgKGRlYnVnX2luZm8tPmV4dGVybmFsX3JmZCA9PSBOVUxMKQotCWZkciA9IGRlYnVnX2luZm8tPmZkciArIGlmZDsKLSAgICAgIGVsc2UKLQl7Ci0JICBSRkRUIHJmZDsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3JmZF9pbikgKGFiZmQsCi0JCQkJICAgICAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3JmZAotCQkJCSAgICAgICArICgoZmRyLT5yZmRCYXNlICsgaWZkKQotCQkJCQkgICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpKSwKLQkJCQkgICAgICAmcmZkKTsKLQkgIGZkciA9IGRlYnVnX2luZm8tPmZkciArIHJmZDsKLQl9Ci0KLSAgICAgIGluZHggKz0gZmRyLT5pc3ltQmFzZTsKLQotICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsCi0JCQkJICAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCQkJICAgKyBpbmR4ICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpLAotCQkJCSAgJnN5bSk7Ci0KLSAgICAgIG5hbWUgPSBkZWJ1Z19pbmZvLT5zcyArIGZkci0+aXNzQmFzZSArIHN5bS5pc3M7Ci0gICAgfQotCi0gIHNwcmludGYgKHN0cmluZywKLQkgICAiJXMgJXMgeyBpZmQgPSAldSwgaW5kZXggPSAlbHUgfSIsCi0JICAgd2hpY2gsIG5hbWUsIGlmZCwKLQkgICAoKGxvbmcpIGluZHgKLQkgICAgKyBkZWJ1Z19pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpOwotfQotCi0vKiBDb252ZXJ0IHRoZSB0eXBlIGluZm9ybWF0aW9uIHRvIHN0cmluZyBmb3JtYXQuICAqLwotCi1zdGF0aWMgY2hhciAqCi1lY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEZEUiAqZmRyOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLXsKLSAgdW5pb24gYXV4X2V4dCAqYXV4X3B0cjsKLSAgaW50IGJpZ2VuZGlhbjsKLSAgQVVYVSB1OwotICBzdHJ1Y3QgcXVhbCB7Ci0gICAgdW5zaWduZWQgaW50ICB0eXBlOwotICAgIGludCAgbG93X2JvdW5kOwotICAgIGludCAgaGlnaF9ib3VuZDsKLSAgICBpbnQgIHN0cmlkZTsKLSAgfSBxdWFsaWZpZXJzWzddOwotICB1bnNpZ25lZCBpbnQgYmFzaWNfdHlwZTsKLSAgaW50IGk7Ci0gIGNoYXIgYnVmZmVyMVsxMDI0XTsKLSAgc3RhdGljIGNoYXIgYnVmZmVyMlsxMDI0XTsKLSAgY2hhciAqcDEgPSBidWZmZXIxOwotICBjaGFyICpwMiA9IGJ1ZmZlcjI7Ci0gIFJORFhSIHJuZHg7Ci0KLSAgYXV4X3B0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2F1eCArIGZkci0+aWF1eEJhc2U7Ci0gIGJpZ2VuZGlhbiA9IGZkci0+ZkJpZ2VuZGlhbjsKLQotICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotICAgIHsKLSAgICAgIHF1YWxpZmllcnNbaV0ubG93X2JvdW5kID0gMDsKLSAgICAgIHF1YWxpZmllcnNbaV0uaGlnaF9ib3VuZCA9IDA7Ci0gICAgICBxdWFsaWZpZXJzW2ldLnN0cmlkZSA9IDA7Ci0gICAgfQotCi0gIGlmIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0pID09IChiZmRfdm1hKSAtMSkKLSAgICByZXR1cm4gIi0xIChubyB0eXBlKSI7Ci0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsrXS5hX3RpLCAmdS50aSk7Ci0KLSAgYmFzaWNfdHlwZSA9IHUudGkuYnQ7Ci0gIHF1YWxpZmllcnNbMF0udHlwZSA9IHUudGkudHEwOwotICBxdWFsaWZpZXJzWzFdLnR5cGUgPSB1LnRpLnRxMTsKLSAgcXVhbGlmaWVyc1syXS50eXBlID0gdS50aS50cTI7Ci0gIHF1YWxpZmllcnNbM10udHlwZSA9IHUudGkudHEzOwotICBxdWFsaWZpZXJzWzRdLnR5cGUgPSB1LnRpLnRxNDsKLSAgcXVhbGlmaWVyc1s1XS50eXBlID0gdS50aS50cTU7Ci0gIHF1YWxpZmllcnNbNl0udHlwZSA9IHRxTmlsOwotCi0gIC8qCi0gICAqIEdvIGdldCB0aGUgYmFzaWMgdHlwZS4KLSAgICovCi0gIHN3aXRjaCAoYmFzaWNfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBidE5pbDoJCQkvKiB1bmRlZmluZWQgKi8KLSAgICAgIHN0cmNweSAocDEsICJuaWwiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEFkcjoJCQkvKiBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcG9pbnRlciAqLwotICAgICAgc3RyY3B5IChwMSwgImFkZHJlc3MiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidENoYXI6CQkvKiBjaGFyYWN0ZXIgKi8KLSAgICAgIHN0cmNweSAocDEsICJjaGFyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVQ2hhcjoJCS8qIHVuc2lnbmVkIGNoYXJhY3RlciAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIGNoYXIiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFNob3J0OgkJLyogc2hvcnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJzaG9ydCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VVNob3J0OgkJLyogdW5zaWduZWQgc2hvcnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBzaG9ydCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0SW50OgkJCS8qIGludCAqLwotICAgICAgc3RyY3B5IChwMSwgImludCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VUludDoJCS8qIHVuc2lnbmVkIGludCAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIGludCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0TG9uZzoJCS8qIGxvbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJsb25nIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVTG9uZzoJCS8qIHVuc2lnbmVkIGxvbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBsb25nIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRGbG9hdDoJCS8qIGZsb2F0IChyZWFsKSAqLwotICAgICAgc3RyY3B5IChwMSwgImZsb2F0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnREb3VibGU6CQkvKiBEb3VibGUgKHJlYWwpICovCi0gICAgICBzdHJjcHkgKHAxLCAiZG91YmxlIik7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogU3RydWN0dXJlcyBhZGQgMS0yIGF1eCB3b3JkczoKLQkgMXN0IHdvcmQgaXMgW1NUX1JGREVTQ0FQRSwgb2Zmc2V0XSBwb2ludGVyIHRvIHN0cnVjdCBkZWY7Ci0JIDJuZCB3b3JkIGlzIGZpbGUgaW5kZXggaWYgMXN0IHdvcmQgcmZkIGlzIFNUX1JGREVTQ0FQRS4gICovCi0KLSAgICBjYXNlIGJ0U3RydWN0OgkJLyogU3RydWN0dXJlIChSZWNvcmQpICovCi0gICAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XS5hX3JuZHgsICZybmR4KTsKLSAgICAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHAxLCAmcm5keCwKLQkJCSAgICAobG9uZykgQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMV0pLAotCQkJICAgICJzdHJ1Y3QiKTsKLSAgICAgIGluZHgrKzsJCQkvKiBza2lwIGF1eCB3b3JkcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFVuaW9ucyBhZGQgMS0yIGF1eCB3b3JkczoKLQkgMXN0IHdvcmQgaXMgW1NUX1JGREVTQ0FQRSwgb2Zmc2V0XSBwb2ludGVyIHRvIHVuaW9uIGRlZjsKLQkgMm5kIHdvcmQgaXMgZmlsZSBpbmRleCBpZiAxc3Qgd29yZCByZmQgaXMgU1RfUkZERVNDQVBFLiAgKi8KLQotICAgIGNhc2UgYnRVbmlvbjoJCS8qIFVuaW9uICovCi0gICAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XS5hX3JuZHgsICZybmR4KTsKLSAgICAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHAxLCAmcm5keCwKLQkJCSAgICAobG9uZykgQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMV0pLAotCQkJICAgICJ1bmlvbiIpOwotICAgICAgaW5keCsrOwkJCS8qIHNraXAgYXV4IHdvcmRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogRW51bWVyYXRpb25zIGFkZCAxLTIgYXV4IHdvcmRzOgotCSAxc3Qgd29yZCBpcyBbU1RfUkZERVNDQVBFLCBvZmZzZXRdIHBvaW50ZXIgdG8gZW51bSBkZWY7Ci0JIDJuZCB3b3JkIGlzIGZpbGUgaW5kZXggaWYgMXN0IHdvcmQgcmZkIGlzIFNUX1JGREVTQ0FQRS4gICovCi0KLSAgICBjYXNlIGJ0RW51bToJCS8qIEVudW1lcmF0aW9uICovCi0gICAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XS5hX3JuZHgsICZybmR4KTsKLSAgICAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHAxLCAmcm5keCwKLQkJCSAgICAobG9uZykgQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMV0pLAotCQkJICAgICJlbnVtIik7Ci0gICAgICBpbmR4Kys7CQkJLyogc2tpcCBhdXggd29yZHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFR5cGVkZWY6CQkvKiBkZWZpbmVkIHZpYSBhIHR5cGVkZWYsIGlzeW1SZWYgcG9pbnRzICovCi0gICAgICBzdHJjcHkgKHAxLCAidHlwZWRlZiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0UmFuZ2U6CQkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJzdWJyYW5nZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0U2V0OgkJCS8qIHBhc2NhbCBzZXRzICovCi0gICAgICBzdHJjcHkgKHAxLCAic2V0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRDb21wbGV4OgkJLyogZm9ydHJhbiBjb21wbGV4ICovCi0gICAgICBzdHJjcHkgKHAxLCAiY29tcGxleCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0RENvbXBsZXg6CQkvKiBmb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCi0gICAgICBzdHJjcHkgKHAxLCAiZG91YmxlIGNvbXBsZXgiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEluZGlyZWN0OgkJLyogZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYgKi8KLSAgICAgIHN0cmNweSAocDEsICJmb3J3YXJkL3VuYW1lZCB0eXBlZGVmIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRGaXhlZERlYzoJCS8qIEZpeGVkIERlY2ltYWwgKi8KLSAgICAgIHN0cmNweSAocDEsICJmaXhlZCBkZWNpbWFsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRGbG9hdERlYzoJCS8qIEZsb2F0IERlY2ltYWwgKi8KLSAgICAgIHN0cmNweSAocDEsICJmbG9hdCBkZWNpbWFsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRTdHJpbmc6CQkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCi0gICAgICBzdHJjcHkgKHAxLCAic3RyaW5nIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRCaXQ6CQkJLyogQWxpZ25lZCBCaXQgU3RyaW5nICovCi0gICAgICBzdHJjcHkgKHAxLCAiYml0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRQaWN0dXJlOgkJLyogUGljdHVyZSAqLwotICAgICAgc3RyY3B5IChwMSwgInBpY3R1cmUiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFZvaWQ6CQkvKiBWb2lkICovCi0gICAgICBzdHJjcHkgKHAxLCAidm9pZCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3ByaW50ZiAocDEsIF8oIlVua25vd24gYmFzaWMgdHlwZSAlZCIpLCAoaW50KSBiYXNpY190eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBwMSArPSBzdHJsZW4gKGJ1ZmZlcjEpOwotCi0gIC8qCi0gICAqIElmIHRoaXMgaXMgYSBiaXRmaWVsZCwgZ2V0IHRoZSBiaXRzaXplLgotICAgKi8KLSAgaWYgKHUudGkuZkJpdGZpZWxkKQotICAgIHsKLSAgICAgIGludCBiaXRzaXplOwotCi0gICAgICBiaXRzaXplID0gQVVYX0dFVF9XSURUSCAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KytdKTsKLSAgICAgIHNwcmludGYgKHAxLCAiIDogJWQiLCBiaXRzaXplKTsKLSAgICAgIHAxICs9IHN0cmxlbiAoYnVmZmVyMSk7Ci0gICAgfQotCi0KLSAgLyoKLSAgICogRGVhbCB3aXRoIGFueSBxdWFsaWZpZXJzLgotICAgKi8KLSAgaWYgKHF1YWxpZmllcnNbMF0udHlwZSAhPSB0cU5pbCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogU25hcmYgdXAgYW55IGFycmF5IGJvdW5kcyBpbiB0aGUgY29ycmVjdCBvcmRlci4gIEFycmF5cwotICAgICAgICogc3RvcmUgNSBzdWNjZXNzaXZlIHdvcmRzIGluIHRoZSBhdXguIHRhYmxlOgotICAgICAgICoJd29yZCAwCVJORFhSIHRvIHR5cGUgb2YgdGhlIGJvdW5kcyAoaWUsIGludCkKLSAgICAgICAqCXdvcmQgMQlDdXJyZW50IGZpbGUgZGVzY3JpcHRvciBpbmRleAotICAgICAgICoJd29yZCAyCWxvdyBib3VuZAotICAgICAgICoJd29yZCAzCWhpZ2ggYm91bmQgKG9yIC0xIGlmIFtdKQotICAgICAgICoJd29yZCA0CXN0cmlkZSBzaXplIGluIGJpdHMKLSAgICAgICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLQl7Ci0JICBpZiAocXVhbGlmaWVyc1tpXS50eXBlID09IHRxQXJyYXkpCi0JICAgIHsKLQkgICAgICBxdWFsaWZpZXJzW2ldLmxvd19ib3VuZCA9Ci0JCUFVWF9HRVRfRE5MT1cgKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsyXSk7Ci0JICAgICAgcXVhbGlmaWVyc1tpXS5oaWdoX2JvdW5kID0KLQkJQVVYX0dFVF9ETkhJR0ggKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCszXSk7Ci0JICAgICAgcXVhbGlmaWVyc1tpXS5zdHJpZGUgPQotCQlBVVhfR0VUX1dJRFRIIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrNF0pOwotCSAgICAgIGluZHggKz0gNTsKLQkgICAgfQotCX0KLQotICAgICAgLyoKLSAgICAgICAqIE5vdyBwcmludCBvdXQgdGhlIHF1YWxpZmllcnMuCi0gICAgICAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCSAgc3dpdGNoIChxdWFsaWZpZXJzW2ldLnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSB0cU5pbDoKLQkgICAgY2FzZSB0cU1heDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxUHRyOgotCSAgICAgIHN0cmNweSAocDIsICJwdHIgdG8gIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgicHRyIHRvICIpLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cVZvbDoKLQkgICAgICBzdHJjcHkgKHAyLCAidm9sYXRpbGUgIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgidm9sYXRpbGUgIiktMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxRmFyOgotCSAgICAgIHN0cmNweSAocDIsICJmYXIgIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgiZmFyICIpLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cVByb2M6Ci0JICAgICAgc3RyY3B5IChwMiwgImZ1bmMuIHJldC4gIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgiZnVuYy4gcmV0LiAiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxQXJyYXk6Ci0JICAgICAgewotCQlpbnQgZmlyc3RfYXJyYXkgPSBpOwotCQlpbnQgajsKLQotCQkvKiBQcmludCBhcnJheSBib3VuZHMgcmV2ZXJzZWQgKGllLCBpbiB0aGUgb3JkZXIgdGhlIEMKLQkJICAgcHJvZ3JhbW1lciB3cml0ZXMgdGhlbSkuICBDIGlzIHN1Y2ggYSBmdW4gbGFuZ3VhZ2UuLi4uICovCi0KLQkJd2hpbGUgKGkgPCA1ICYmIHF1YWxpZmllcnNbaSsxXS50eXBlID09IHRxQXJyYXkpCi0JCSAgaSsrOwotCi0JCWZvciAoaiA9IGk7IGogPj0gZmlyc3RfYXJyYXk7IGotLSkKLQkJICB7Ci0JCSAgICBzdHJjcHkgKHAyLCAiYXJyYXkgWyIpOwotCQkgICAgcDIgKz0gc2l6ZW9mICgiYXJyYXkgWyIpLTE7Ci0JCSAgICBpZiAocXVhbGlmaWVyc1tqXS5sb3dfYm91bmQgIT0gMCkKLQkJICAgICAgc3ByaW50ZiAocDIsCi0JCQkgICAgICAgIiVsZDolbGQgeyVsZCBiaXRzfSIsCi0JCQkgICAgICAgKGxvbmcpIHF1YWxpZmllcnNbal0ubG93X2JvdW5kLAotCQkJICAgICAgIChsb25nKSBxdWFsaWZpZXJzW2pdLmhpZ2hfYm91bmQsCi0JCQkgICAgICAgKGxvbmcpIHF1YWxpZmllcnNbal0uc3RyaWRlKTsKLQotCQkgICAgZWxzZSBpZiAocXVhbGlmaWVyc1tqXS5oaWdoX2JvdW5kICE9IC0xKQotCQkgICAgICBzcHJpbnRmIChwMiwKLQkJCSAgICAgICAiJWxkIHslbGQgYml0c30iLAotCQkJICAgICAgIChsb25nKSAocXVhbGlmaWVyc1tqXS5oaWdoX2JvdW5kICsgMSksCi0JCQkgICAgICAgKGxvbmcpIChxdWFsaWZpZXJzW2pdLnN0cmlkZSkpOwotCi0JCSAgICBlbHNlCi0JCSAgICAgIHNwcmludGYgKHAyLCAiIHslbGQgYml0c30iLCAobG9uZykgKHF1YWxpZmllcnNbal0uc3RyaWRlKSk7Ci0KLQkJICAgIHAyICs9IHN0cmxlbiAocDIpOwotCQkgICAgc3RyY3B5IChwMiwgIl0gb2YgIik7Ci0JCSAgICBwMiArPSBzaXplb2YgKCJdIG9mICIpLTE7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc3RyY3B5IChwMiwgYnVmZmVyMSk7Ci0gIHJldHVybiBidWZmZXIyOwotfQotCi0vKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgRUNPRkYgc3ltYm9sIFNZTUJPTCBpbiBSRVQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLV9iZmRfZWNvZmZfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBsb2NhbCBsYWJlbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICckJzsKLX0KLQotLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUNPRkYgc3ltYm9sLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKWZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JewotCSAgU1lNUiBlY29mZl9zeW07Ci0JCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSwKLQkJCQkgICAgICAmZWNvZmZfc3ltKTsKLQkgIGZwcmludGYgKGZpbGUsICJlY29mZiBsb2NhbCAiKTsKLQkgIGZwcmludGZfdm1hIChmaWxlLCAoYmZkX3ZtYSkgZWNvZmZfc3ltLnZhbHVlKTsKLQkgIGZwcmludGYgKGZpbGUsICIgJXggJXgiLCAodW5zaWduZWQpIGVjb2ZmX3N5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9zeW0uc2MpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFWFRSIGVjb2ZmX2V4dDsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJICAgICAgJmVjb2ZmX2V4dCk7Ci0JICBmcHJpbnRmIChmaWxlLCAiZWNvZmYgZXh0ZXJuICIpOwotCSAgZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JICBmcHJpbnRmIChmaWxlLCAiICV4ICV4IiwgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYyk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIC8qIFByaW50IG91dCB0aGUgc3ltYm9scyBpbiBhIHJlYXNvbmFibGUgd2F5ICovCi0gICAgICB7Ci0JY2hhciB0eXBlOwotCWludCBwb3M7Ci0JRVhUUiBlY29mZl9leHQ7Ci0JY2hhciBqbXB0Ymw7Ci0JY2hhciBjb2JvbF9tYWluOwotCWNoYXIgd2Vha2V4dDsKLQotCWlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JICB7Ci0JICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLAotCQkJCQkmZWNvZmZfZXh0LmFzeW0pOwotCSAgICB0eXBlID0gJ2wnOwotCSAgICBwb3MgPSAoKCgoY2hhciAqKSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlCi0JCSAgICAgLSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9zeW0pCi0JCSAgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKQotCQkgICArIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KTsKLQkgICAgam1wdGJsID0gJyAnOwotCSAgICBjb2JvbF9tYWluID0gJyAnOwotCSAgICB3ZWFrZXh0ID0gJyAnOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJCSZlY29mZl9leHQpOwotCSAgICB0eXBlID0gJ2UnOwotCSAgICBwb3MgPSAoKChjaGFyICopIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUKLQkJICAgIC0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfZXh0KQotCQkgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLQkgICAgam1wdGJsID0gZWNvZmZfZXh0LmptcHRibCA/ICdqJyA6ICcgJzsKLQkgICAgY29ib2xfbWFpbiA9IGVjb2ZmX2V4dC5jb2JvbF9tYWluID8gJ2MnIDogJyAnOwotCSAgICB3ZWFrZXh0ID0gZWNvZmZfZXh0LndlYWtleHQgPyAndycgOiAnICc7Ci0JICB9Ci0KLQlmcHJpbnRmIChmaWxlLCAiWyUzZF0gJWMgIiwKLQkJIHBvcywgdHlwZSk7Ci0JZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JZnByaW50ZiAoZmlsZSwgIiBzdCAleCBzYyAleCBpbmR4ICV4ICVjJWMlYyAlcyIsCi0JCSAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLnN0LAotCQkgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYywKLQkJICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uaW5kZXgsCi0JCSBqbXB0YmwsIGNvYm9sX21haW4sIHdlYWtleHQsCi0JCSBzeW1ib2wtPm5hbWUpOwotCi0JaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5mZHIgIT0gTlVMTAotCSAgICAmJiBlY29mZl9leHQuYXN5bS5pbmRleCAhPSBpbmRleE5pbCkKLQkgIHsKLQkgICAgRkRSICpmZHI7Ci0JICAgIHVuc2lnbmVkIGludCBpbmR4OwotCSAgICBpbnQgYmlnZW5kaWFuOwotCSAgICBiZmRfc2l6ZV90eXBlIHN5bV9iYXNlOwotCSAgICB1bmlvbiBhdXhfZXh0ICphdXhfYmFzZTsKLQotCSAgICBmZHIgPSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+ZmRyOwotCSAgICBpbmR4ID0gZWNvZmZfZXh0LmFzeW0uaW5kZXg7Ci0KLQkgICAgLyogc3ltX2Jhc2UgaXMgdXNlZCB0byBtYXAgdGhlIGZkciByZWxhdGl2ZSBpbmRpY2VzIHdoaWNoCi0JICAgICAgIGFwcGVhciBpbiB0aGUgZmlsZSB0byB0aGUgcG9zaXRpb24gbnVtYmVyIHdoaWNoIHdlIGFyZQotCSAgICAgICB1c2luZy4gICovCi0JICAgIHN5bV9iYXNlID0gZmRyLT5pc3ltQmFzZTsKLQkgICAgaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5sb2NhbCkKLQkgICAgICBzeW1fYmFzZSArPQotCQllY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLQotCSAgICAvKiBhdXhfYmFzZSBpcyB0aGUgc3RhcnQgb2YgdGhlIGF1eCBlbnRyaWVzIGZvciB0aGlzIGZpbGU7Ci0JICAgICAgIGFzeW0uaW5kZXggaXMgYW4gb2Zmc2V0IGZyb20gdGhpcy4gICovCi0JICAgIGF1eF9iYXNlID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2F1eAotCQkJKyBmZHItPmlhdXhCYXNlKTsKLQotCSAgICAvKiBUaGUgYXV4IGVudHJpZXMgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXI7IHRoZQotCSAgICAgICBvcmRlciBpcyBpbmRpY2F0ZWQgYnkgYSBiaXQgaW4gdGhlIGZkci4gICovCi0JICAgIGJpZ2VuZGlhbiA9IGZkci0+ZkJpZ2VuZGlhbjsKLQotCSAgICAvKiBUaGlzIHN3aXRjaCBpcyBiYXNpY2FsbHkgZnJvbSBnY2MvbWlwcy10ZHVtcC5jICAqLwotCSAgICBzd2l0Y2ggKGVjb2ZmX2V4dC5hc3ltLnN0KQotCSAgICAgIHsKLQkgICAgICBjYXNlIHN0TmlsOgotCSAgICAgIGNhc2Ugc3RMYWJlbDoKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RmlsZToKLQkgICAgICBjYXNlIHN0QmxvY2s6Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlbGQiKSwKLQkJCSAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RFbmQ6Ci0JCWlmIChlY29mZl9leHQuYXN5bS5zYyA9PSBzY1RleHQKLQkJICAgIHx8IGVjb2ZmX2V4dC5hc3ltLnNjID09IHNjSW5mbykKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIiksCi0JCQkgICAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBGaXJzdCBzeW1ib2w6ICVsZCIpLCAKLQkJCSAgICgobG9uZykKLQkJCSAgICAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sCi0JCQkJCSAgICZhdXhfYmFzZVtlY29mZl9leHQuYXN5bS5pbmRleF0pCi0JCQkgICAgICsgc3ltX2Jhc2UpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFByb2M6Ci0JICAgICAgY2FzZSBzdFN0YXRpY1Byb2M6Ci0JCWlmIChFQ09GRl9JU19TVEFCICgmZWNvZmZfZXh0LmFzeW0pKQotCQkgIDsKLQkJZWxzZSBpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmxvY2FsKQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIpLAotCQkJICAgKChsb25nKQotCQkJICAgIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwKLQkJCQkJICAgJmF1eF9iYXNlW2Vjb2ZmX2V4dC5hc3ltLmluZGV4XSkKLQkJCSAgICAgKyBzeW1fYmFzZSkpLAotCQkJICAgZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCArIDEpKTsKLQkJZWxzZQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgTG9jYWwgc3ltYm9sOiAlbGQiKSwKLQkJCSAgICgobG9uZykgaW5keAotCQkJICAgICsgKGxvbmcpIHN5bV9iYXNlCi0JCQkgICAgKyAoZWNvZmZfZGF0YSAoYWJmZCkKLQkJCSAgICAgICAtPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFN0cnVjdDoKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBzdHJ1Y3Q7IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0VW5pb246Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgdW5pb247IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RW51bToKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBlbnVtOyBFbmQrMSBzeW1ib2w6ICVsZCIpLAotCQkJIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJaWYgKCEgRUNPRkZfSVNfU1RBQiAoJmVjb2ZmX2V4dC5hc3ltKSkKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIFR5cGU6ICVzIiksCi0JCQkgICBlY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4KSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qIFJlYWQgaW4gdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2NzX3NpemU7Ci0gIGNoYXIgKmV4dGVybmFsX3JlbG9jczsKLSAgYXJlbGVudCAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gIT0gKGFyZWxlbnQgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaW50ZXJuYWxfcmVsb2NzID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoc2l6ZW9mIChhcmVsZW50KQotCQkJCQkgICAgKiBzZWN0aW9uLT5yZWxvY19jb3VudCkpOwotICBleHRlcm5hbF9yZWxvY19zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSBleHRlcm5hbF9yZWxvY19zaXplICogc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGV4dGVybmFsX3JlbG9jcyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgZXh0ZXJuYWxfcmVsb2NzX3NpemUpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IChhcmVsZW50ICopIE5VTEwKLSAgICAgIHx8IGV4dGVybmFsX3JlbG9jcyA9PSAoY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGFiZmQpCi0gICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMCwgcnB0ciA9IGludGVybmFsX3JlbG9jczsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyssIHJwdHIrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW50ZXJuOwotCi0gICAgICAoKmJhY2tlbmQtPnN3YXBfcmVsb2NfaW4pIChhYmZkLAotCQkJCSBleHRlcm5hbF9yZWxvY3MgKyBpICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwKLQkJCQkgJmludGVybik7Ci0KLSAgICAgIGlmIChpbnRlcm4ucl9leHRlcm4pCi0JewotCSAgLyogcl9zeW1uZHggaXMgYW4gaW5kZXggaW50byB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0JICBCRkRfQVNTRVJUIChpbnRlcm4ucl9zeW1uZHggPj0gMAotCQkgICAgICAmJiAoaW50ZXJuLnJfc3ltbmR4Ci0JCQkgIDwgKGVjb2ZmX2RhdGEgKGFiZmQpCi0JCQkgICAgIC0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpKTsKLQkgIHJwdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIGludGVybi5yX3N5bW5keDsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW50ZXJuLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fTk9ORQotCSAgICAgICB8fCBpbnRlcm4ucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0JewotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIENPTlNUIGNoYXIgKnNlY19uYW1lOwotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogcl9zeW1uZHggaXMgYSBzZWN0aW9uIGtleS4gICovCi0JICBzd2l0Y2ggKGludGVybi5yX3N5bW5keCkKLQkgICAgewotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fVEVYVDogIHNlY19uYW1lID0gIi50ZXh0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUkRBVEE6IHNlY19uYW1lID0gIi5yZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fREFUQTogIHNlY19uYW1lID0gIi5kYXRhIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6IHNlY19uYW1lID0gIi5zZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0JTUzogIHNlY19uYW1lID0gIi5zYnNzIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fQlNTOiAgIHNlY19uYW1lID0gIi5ic3MiOyAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fSU5JVDogIHNlY19uYW1lID0gIi5pbml0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODogIHNlY19uYW1lID0gIi5saXQ4IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUNDogIHNlY19uYW1lID0gIi5saXQ0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fWERBVEE6IHNlY19uYW1lID0gIi54ZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUERBVEE6IHNlY19uYW1lID0gIi5wZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fRklOSTogIHNlY19uYW1lID0gIi5maW5pIjsgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9MSVRBOiAgc2VjX25hbWUgPSAiLmxpdGEiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9SQ09OU1Q6IHNlY19uYW1lID0gIi5yY29uc3QiOyBicmVhazsKLQkgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlY19uYW1lKTsKLQkgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotCi0JICBycHRyLT5hZGRlbmQgPSAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0JfQotCi0gICAgICBycHRyLT5hZGRyZXNzID0gaW50ZXJuLnJfdmFkZHIgLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQotICAgICAgLyogTGV0IHRoZSBiYWNrZW5kIHNlbGVjdCB0aGUgaG93dG8gZmllbGQgYW5kIGRvIGFueSBvdGhlcgotCSByZXF1aXJlZCBwcm9jZXNzaW5nLiAgKi8KLSAgICAgICgqYmFja2VuZC0+YWRqdXN0X3JlbG9jX2luKSAoYWJmZCwgJmludGVybiwgcnB0cik7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCBleHRlcm5hbF9yZWxvY3MpOwotCi0gIHNlY3Rpb24tPnJlbG9jYXRpb24gPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCBhIGNhbm9uaWNhbCBsaXN0IG9mIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbjsKLQotICAgICAgLyogVGhpcyBzZWN0aW9uIGhhcyByZWxvY3MgbWFkZSB1cCBieSB1cywgbm90IHRoZSBmaWxlLCBzbyB0YWtlCi0JIHRoZW0gb3V0IG9mIHRoZWlyIGNoYWluIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGRhdGEgYXJlYQotCSBwcm92aWRlZC4gICovCi0gICAgICBmb3IgKGNvdW50ID0gMCwgY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQkgICBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgIGNvdW50KyssIGNoYWluID0gY2hhaW4tPm5leHQpCi0JKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgeyAKLSAgICAgIGFyZWxlbnQgKnRibHB0cjsKLQotICAgICAgaWYgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSA9PSBmYWxzZSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0MCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSAgIHdhbnRlZCBsb2NhdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgaWdub3JlX3N5bWJvbHMsIG9mZnNldCwKLQkJCSAgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKippZ25vcmVfc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqcmV0bGluZV9wdHI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcAotICAgID0gJmVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm8gPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgRkRSJ3MuICAqLwotICBpZiAoISBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCBkZWJ1Z19pbmZvKQotICAgICAgfHwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9Ci0JKChzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSkpKTsKLSAgICAgIGlmIChlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBsaW5lX2luZm8gPSBlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm87Ci0KLSAgcmV0dXJuIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgZGVidWdfaW5mbywKLQkJCQkgZGVidWdfc3dhcCwgbGluZV9pbmZvLCBmaWxlbmFtZV9wdHIsCi0JCQkJIGZ1bmN0aW9ubmFtZV9wdHIsIHJldGxpbmVfcHRyKTsKLX0KLQwKLS8qIENvcHkgcHJpdmF0ZSBCRkQgZGF0YS4gIFRoaXMgaXMgY2FsbGVkIGJ5IG9iamNvcHkgYW5kIHN0cmlwLiAgV2UKLSAgIHVzZSBpdCB0byBjb3B5IHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBvbmUgQkZEIHRvIHRoZQotICAgb3RoZXIuICBJdCB3b3VsZCBiZSB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUgRUNPRkYKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSG93ZXZlciwgaXQgd291bGQgYmUgYQotICAgbG90IG9mIHdvcmssIGFuZCB0aGVyZSB3b3VsZCBiZSBsaXR0bGUgZ2FpbiAoZ2FzLCBnZGIsIGFuZCBsZAotICAgYWxyZWFkeSBhY2Nlc3MgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB2aWEgdGhlCi0gICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZSwgYW5kIHRoYXQgc3RydWN0dXJlIHdvdWxkIGhhdmUgdG8gYmUKLSAgIHJldGFpbmVkIGluIG9yZGVyIHRvIHN1cHBvcnQgRUNPRkYgZGVidWdnaW5nIGluIE1JUFMgRUxGKS4KLQotICAgVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIEVDT0ZGIGV4dGVybmFsIHN5bWJvbHMgY29tZXMgZnJvbQotICAgdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhpcyBmdW5jdGlvbiBvbmx5IGhhbmRsZXMgdGhlIG90aGVyIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaWluZm8gPSAmZWNvZmZfZGF0YSAoaWJmZCktPmRlYnVnX2luZm87Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvaW5mbyA9ICZlY29mZl9kYXRhIChvYmZkKS0+ZGVidWdfaW5mbzsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGFzeW1ib2wgKipzeW1fcHRyX3B0cjsKLSAgc2l6ZV90IGM7Ci0gIGJvb2xlYW4gbG9jYWw7Ci0KLSAgLyogV2Ugb25seSB3YW50IHRvIGNvcHkgaW5mb3JtYXRpb24gb3ZlciBpZiBib3RoIEJGRCdzIHVzZSBFQ09GRgotICAgICBmb3JtYXQuICAqLwotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENvcHkgdGhlIEdQIHZhbHVlIGFuZCB0aGUgcmVnaXN0ZXIgbWFza3MuICAqLwotICBlY29mZl9kYXRhIChvYmZkKS0+Z3AgPSBlY29mZl9kYXRhIChpYmZkKS0+Z3A7Ci0gIGVjb2ZmX2RhdGEgKG9iZmQpLT5ncHJtYXNrID0gZWNvZmZfZGF0YSAoaWJmZCktPmdwcm1hc2s7Ci0gIGVjb2ZmX2RhdGEgKG9iZmQpLT5mcHJtYXNrID0gZWNvZmZfZGF0YSAoaWJmZCktPmZwcm1hc2s7Ci0gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgZWNvZmZfZGF0YSAob2JmZCktPmNwcm1hc2tbaV0gPSBlY29mZl9kYXRhIChpYmZkKS0+Y3BybWFza1tpXTsKLQotICAvKiBDb3B5IHRoZSB2ZXJzaW9uIHN0YW1wLiAgKi8KLSAgb2luZm8tPnN5bWJvbGljX2hlYWRlci52c3RhbXAgPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLnZzdGFtcDsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scywgZG9uJ3QgY29weSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgYyA9IGJmZF9nZXRfc3ltY291bnQgKG9iZmQpOwotICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAob2JmZCk7Ci0gIGlmIChjID09IDAgfHwgc3ltX3B0cl9wdHIgPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlIGlmIHRoZXJlIGFyZSBhbnkgbG9jYWwgc3ltYm9scy4gICovCi0gIGxvY2FsID0gZmFsc2U7Ci0gIGZvciAoOyBjID4gMDsgYy0tLCBzeW1fcHRyX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChlY29mZnN5bWJvbCAoKnN5bV9wdHJfcHRyKS0+bG9jYWwpCi0JewotCSAgbG9jYWwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobG9jYWwpCi0gICAgewotICAgICAgLyogVGhlcmUgYXJlIHNvbWUgbG9jYWwgc3ltYm9scy4gIFdlIGp1c3QgYnJpbmcgb3ZlciBhbGwgdGhlCi0JIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZJWE1FOiBUaGlzIGlzIG5vdCBxdWl0ZSB0aGUgcmlnaHQKLQkgdGhpbmcgdG8gZG8uICBJZiB0aGUgdXNlciBoYXMgYXNrZWQgdXMgdG8gZGlzY2FyZCBhbGwKLQkgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGVuIHdlIGFyZSBwcm9iYWJseSBnb2luZyB0byB3aW5kIHVwCi0JIGtlZXBpbmcgaXQgYmVjYXVzZSB0aGVyZSB3aWxsIHByb2JhYmx5IGJlIHNvbWUgbG9jYWwgc3ltYm9sCi0JIHdoaWNoIG9iamNvcHkgZGlkIG5vdCBkaXNjYXJkLiAgV2Ugc2hvdWxkIGFjdHVhbGx5IGJyZWFrCi0JIGFwYXJ0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIG9ubHkga2VlcCB0aGF0IHdoaWNoCi0JIGFwcGxpZXMgdG8gdGhlIHN5bWJvbHMgd2Ugd2FudCB0byBrZWVwLiAgKi8KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWxpbmVNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlsaW5lTWF4OwotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5jYkxpbmUgPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmNiTGluZTsKLSAgICAgIG9pbmZvLT5saW5lID0gaWluZm8tPmxpbmU7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWRuTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pZG5NYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfZG5yID0gaWluZm8tPmV4dGVybmFsX2RucjsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pcGRNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlwZE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9wZHIgPSBpaW5mby0+ZXh0ZXJuYWxfcGRyOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzeW1NYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzeW1NYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfc3ltID0gaWluZm8tPmV4dGVybmFsX3N5bTsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pb3B0TWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pb3B0TWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX29wdCA9IGlpbmZvLT5leHRlcm5hbF9vcHQ7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWF1eE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWF1eE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9hdXggPSBpaW5mby0+ZXh0ZXJuYWxfYXV4OwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzc01heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaXNzTWF4OwotICAgICAgb2luZm8tPnNzID0gaWluZm8tPnNzOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX2ZkciA9IGlpbmZvLT5leHRlcm5hbF9mZHI7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuY3JmZCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuY3JmZDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9yZmQgPSBpaW5mby0+ZXh0ZXJuYWxfcmZkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSBkaXNjYXJkaW5nIGFsbCB0aGUgbG9jYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgTG9vawotCSB0aHJvdWdoIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gRkRSCi0JIG9yIGF1eCBpbmZvcm1hdGlvbi4gICovCi0gICAgICBjID0gYmZkX2dldF9zeW1jb3VudCAob2JmZCk7Ci0gICAgICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAob2JmZCk7Ci0gICAgICBmb3IgKDsgYyA+IDA7IGMtLSwgc3ltX3B0cl9wdHIrKykKLQl7Ci0JICBFWFRSIGVzeW07Ci0KLQkgICgqKGVjb2ZmX2JhY2tlbmQgKG9iZmQpLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luKSkKLQkgICAgKG9iZmQsIGVjb2Zmc3ltYm9sICgqc3ltX3B0cl9wdHIpLT5uYXRpdmUsICZlc3ltKTsKLQkgIGVzeW0uaWZkID0gaWZkTmlsOwotCSAgZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0JICAoKihlY29mZl9iYWNrZW5kIChvYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9vdXQpKQotCSAgICAob2JmZCwgJmVzeW0sIGVjb2Zmc3ltYm9sICgqc3ltX3B0cl9wdHIpLT5uYXRpdmUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZS4gIFRoZSBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIGlzIHN0b3JlZCBpbiB0aGUKLSAgIGJhY2tlbmQgcG9pbnRlci4gIFdlIGFsd2F5cyBzZXQgdGhlIGFyY2hpdGVjdHVyZSBhbnlob3csIHNpbmNlIG1hbnkKLSAgIGNhbGxlcnMgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci0gIHJldHVybiBhcmNoID09IGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5hcmNoOwotfQotCi0vKiBHZXQgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1fYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICBpbnQgYzsKLSAgaW50IHJldDsKLQotICBjID0gMDsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgKytjOwotCi0gIHJldCA9IChiZmRfY29mZl9maWxoc3ogKGFiZmQpCi0JICsgYmZkX2NvZmZfYW91dHN6IChhYmZkKQotCSArIGMgKiBiZmRfY29mZl9zY25oc3ogKGFiZmQpKTsKLSAgcmV0dXJuIEJGRF9BTElHTiAocmV0LCAxNik7Ci19Ci0KLS8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICByZXR1cm4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwKLQkJCQkJICAgIG9mZnNldCwgY291bnQpOwotfQotCi0vKiBTb3J0IHNlY3Rpb25zIGJ5IFZNQSwgYnV0IHB1dCBTRUNfQUxMT0Mgc2VjdGlvbnMgZmlyc3QuICBUaGlzIGlzCi0gICBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotZWNvZmZfc29ydF9oZHJzIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci17Ci0gIGNvbnN0IGFzZWN0aW9uICpoZHIxID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMTsKLSAgY29uc3QgYXNlY3Rpb24gKmhkcjIgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcyOwotCi0gIGlmICgoaGRyMS0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgaWYgKChoZHIyLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChoZHIyLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChoZHIxLT52bWEgPCBoZHIyLT52bWEpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChoZHIxLT52bWEgPiBoZHIyLT52bWEpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9uIGZvciBlYWNoIHNlY3Rpb24sIGFuZCBzZXQKLSAgIHJlbG9jX2ZpbGVwb3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIHNvZmFyLCBmaWxlX3NvZmFyOwotICBhc2VjdGlvbiAqKnNvcnRlZF9oZHJzOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZpbGVfcHRyIG9sZF9zb2ZhcjsKLSAgYm9vbGVhbiByZGF0YV9pbl90ZXh0OwotICBib29sZWFuIGZpcnN0X2RhdGEsIGZpcnN0X25vbmFsbG9jOwotICBjb25zdCBiZmRfdm1hIHJvdW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPnJvdW5kOwotCi0gIHNvZmFyID0gX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZmFsc2UpOwotICBmaWxlX3NvZmFyID0gc29mYXI7Ci0KLSAgLyogU29ydCB0aGUgc2VjdGlvbnMgYnkgVk1BLiAgKi8KLSAgc29ydGVkX2hkcnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKGFiZmQtPnNlY3Rpb25fY291bnQKLQkJCQkJICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBpZiAoc29ydGVkX2hkcnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zLCBpID0gMDsKLSAgICAgICBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsIGkrKykKLSAgICBzb3J0ZWRfaGRyc1tpXSA9IGN1cnJlbnQ7Ci0gIEJGRF9BU1NFUlQgKGkgPT0gYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0KLSAgcXNvcnQgKHNvcnRlZF9oZHJzLCBhYmZkLT5zZWN0aW9uX2NvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLAotCSBlY29mZl9zb3J0X2hkcnMpOwotCi0gIC8qIFNvbWUgdmVyc2lvbnMgb2YgdGhlIE9TRiBsaW5rZXIgcHV0IHRoZSAucmRhdGEgc2VjdGlvbiBpbiB0aGUKLSAgICAgdGV4dCBzZWdtZW50LCBhbmQgc29tZSBkbyBub3QuICAqLwotICByZGF0YV9pbl90ZXh0ID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPnJkYXRhX2luX3RleHQ7Ci0gIGlmIChyZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgY3VycmVudCA9IHNvcnRlZF9oZHJzW2ldOwotCSAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JEQVRBKSA9PSAwKQotCSAgICBicmVhazsKLQkgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkNPTlNUKSAhPSAwKQotCSAgICB7Ci0JICAgICAgcmRhdGFfaW5fdGV4dCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnJkYXRhX2luX3RleHQgPSByZGF0YV9pbl90ZXh0OwotCi0gIGZpcnN0X2RhdGEgPSB0cnVlOwotICBmaXJzdF9ub25hbGxvYyA9IHRydWU7Ci0gIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLQotICAgICAgY3VycmVudCA9IHNvcnRlZF9oZHJzW2ldOwotCi0gICAgICAvKiBGb3IgdGhlIEFscGhhIEVDT0ZGIC5wZGF0YSBzZWN0aW9uIHRoZSBsbm5vcHRyIGZpZWxkIGlzCi0JIHN1cHBvc2VkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgLnBkYXRhIGVudHJpZXMgdGhhdCBhcmUKLQkgcmVhbGx5IGluIHRoZSBzZWN0aW9uLiAgRWFjaCBlbnRyeSBpcyA4IGJ5dGVzLiAgV2Ugc3RvcmUgdGhpcwotCSBhd2F5IGluIGxpbmVfZmlsZXBvcyBiZWZvcmUgaW5jcmVhc2luZyB0aGUgc2VjdGlvbiBzaXplLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9QREFUQSkgPT0gMCkKLQljdXJyZW50LT5saW5lX2ZpbGVwb3MgPSBjdXJyZW50LT5fcmF3X3NpemUgLyA4OwotCi0gICAgICBhbGlnbm1lbnRfcG93ZXIgPSBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgICAgIC8qIE9uIFVsdHJpeCwgdGhlIGRhdGEgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBmaWxlIG11c3QgYmUKLQkgYWxpZ25lZCB0byBhIHBhZ2UgYm91bmRhcnkgd2l0aGluIHRoZSBmaWxlLiAgVGhpcyBkb2VzIG5vdAotCSBhZmZlY3QgdGhlIHNlY3Rpb24gc2l6ZSwgdGhvdWdoLiAgRklYTUU6IERvZXMgdGhpcyB3b3JrIGZvcgotCSBvdGhlciBwbGF0Zm9ybXM/ICBJdCByZXF1aXJlcyBzb21lIG1vZGlmaWNhdGlvbiBmb3IgdGhlCi0JIEFscGhhLCBiZWNhdXNlIC5yZGF0YSBvbiB0aGUgQWxwaGEgZ29lcyB3aXRoIHRoZSB0ZXh0LCBub3QKLQkgdGhlIGRhdGEuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMAotCSAgJiYgISBmaXJzdF9kYXRhCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgJiYgKCEgcmRhdGFfaW5fdGV4dAotCSAgICAgIHx8IHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JEQVRBKSAhPSAwKQotCSAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDAKLQkgICYmIHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JDT05TVCkgIT0gMCkKLQl7Ci0JICBzb2ZhciA9IChzb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaWxlX3NvZmFyID0gKGZpbGVfc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCSAgZmlyc3RfZGF0YSA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQl7Ci0JICAvKiBPbiBJcml4IDQsIHRoZSBsb2NhdGlvbiBvZiBjb250ZW50cyBvZiB0aGUgLmxpYiBzZWN0aW9uCi0JICAgICBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiBpcyBhbHNvIHJvdW5kZWQgdXAgdG8gYQotCSAgICAgcGFnZSBib3VuZGFyeS4gICovCi0KLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoZmlyc3Rfbm9uYWxsb2MKLQkgICAgICAgJiYgKGN1cnJlbnQtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCi0JICAgICAgICYmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0JewotCSAgLyogU2tpcCB1cCB0byB0aGUgbmV4dCBwYWdlIGZvciBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLCBzdWNoCi0gICAgICAgICAgICAgYXMgdGhlIC5jb21tZW50IHNlY3Rpb24gb24gdGhlIEFscGhhLiAgVGhpcyBsZWF2ZXMgcm9vbQotICAgICAgICAgICAgIGZvciB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLQkgIGZpcnN0X25vbmFsbG9jID0gZmFsc2U7Ci0JICBzb2ZhciA9IChzb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaWxlX3NvZmFyID0gKGZpbGVfc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCX0KLQotICAgICAgLyogQWxpZ24gdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5IG9uCi0JIHdoaWNoIHRoZXkgYXJlIGFsaWduZWQgaW4gdmlydHVhbCBtZW1vcnkuICAqLwotICAgICAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQlmaWxlX3NvZmFyID0gQkZEX0FMSUdOIChmaWxlX3NvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JewotCSAgc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIHNvZmFyKSAlIHJvdW5kOwotCSAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICAgIGZpbGVfc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIGZpbGVfc29mYXIpICUgcm91bmQ7Ci0JfQotCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCkpICE9IDApCi0JY3VycmVudC0+ZmlsZXBvcyA9IGZpbGVfc29mYXI7Ci0KLSAgICAgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCWZpbGVfc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplOwotCi0gICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0aGlzIHNlY3Rpb24gaXMgb2YgdGhlIHJpZ2h0IHNpemUgdG9vICovCi0gICAgICBvbGRfc29mYXIgPSBzb2ZhcjsKLSAgICAgIHNvZmFyID0gQkZEX0FMSUdOIChzb2ZhciwgMSA8PCBhbGlnbm1lbnRfcG93ZXIpOwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JZmlsZV9zb2ZhciA9IEJGRF9BTElHTiAoZmlsZV9zb2ZhciwgMSA8PCBhbGlnbm1lbnRfcG93ZXIpOwotICAgICAgY3VycmVudC0+X3Jhd19zaXplICs9IHNvZmFyIC0gb2xkX3NvZmFyOwotICAgIH0KLQotICBmcmVlIChzb3J0ZWRfaGRycyk7Ci0gIHNvcnRlZF9oZHJzID0gTlVMTDsKLQotICBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvcyA9IGZpbGVfc29mYXI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlbG9jcyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGUKLSAgIG91dHB1dCBmaWxlLCBhcyB3ZWxsIGFzIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9saWMgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlCi1lY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9Ci0gICAgZWNvZmZfYmFja2VuZCAoYWJmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGZpbGVfcHRyIHJlbG9jX2Jhc2U7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGZpbGVfcHRyIHN5bV9iYXNlOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlhYm9ydCAoKTsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLSAgCi0gIHJlbG9jX2Jhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvczsKLQotICByZWxvY19zaXplID0gMDsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgewotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID09IDApCi0JY3VycmVudC0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zaXplX3R5cGUgcmVsc2l6ZTsKLQotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSByZWxvY19iYXNlOwotCSAgcmVsc2l6ZSA9IGN1cnJlbnQtPnJlbG9jX2NvdW50ICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLQkgIHJlbG9jX3NpemUgKz0gcmVsc2l6ZTsKLQkgIHJlbG9jX2Jhc2UgKz0gcmVsc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHN5bV9iYXNlID0gZWNvZmZfZGF0YSAoYWJmZCktPnJlbG9jX2ZpbGVwb3MgKyByZWxvY19zaXplOwotCi0gIC8qIEF0IGxlYXN0IG9uIFVsdHJpeCwgdGhlIHN5bWJvbCB0YWJsZSBvZiBhbiBleGVjdXRhYmxlIGZpbGUgbXVzdAotICAgICBiZSBhbGlnbmVkIHRvIGEgcGFnZSBib3VuZGFyeS4gIEZJWE1FOiBJcyB0aGlzIHRydWUgb24gb3RoZXIKLSAgICAgcGxhdGZvcm1zPyAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICBzeW1fYmFzZSA9ICgoc3ltX2Jhc2UgKyBlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQgLSAxKQotCQkmfiAoZWNvZmZfYmFja2VuZCAoYWJmZCktPnJvdW5kIC0gMSkpOwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9IHN5bV9iYXNlOwotCi0gIHJldHVybiByZWxvY19zaXplOwotfQotCi0vKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgLyogVGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QsIGJlY2F1c2UgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGlzCi0gICAgIGdvaW5nIHRvIHNldCBvdXRwdXRfaGFzX2JlZ3VuIHRvIHRydWUuICAqLwotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoISBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSAubGliIHNlY3Rpb24gc3BlY2lhbGx5IHNvIHRoYXQgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMKLSAgICAgd29yayBvdXQuICBTZWUgY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyBpbiBjb2ZmY29kZS5oLiAgKi8KLSAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqcmVjLCAqcmVjZW5kOwotCi0gICAgICByZWMgPSAoYmZkX2J5dGUgKikgbG9jYXRpb247Ci0gICAgICByZWNlbmQgPSByZWMgKyBjb3VudDsKLSAgICAgIHdoaWxlIChyZWMgPCByZWNlbmQpCi0JewotCSAgKytzZWN0aW9uLT5sbWE7Ci0JICByZWMgKz0gYmZkX2dldF8zMiAoYWJmZCwgcmVjKSAqIDQ7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChyZWMgPT0gcmVjZW5kKTsKLSAgICB9Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgR1AgdmFsdWUgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5Ci0gICBubG1jb252LiAgKi8KLQotYmZkX3ZtYQotYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICByZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotfQotCi0vKiBTZXQgdGhlIEdQIHZhbHVlIGZvciBhbiBFQ09GRiBmaWxlLiAgVGhpcyBpcyBhIGhvb2sgdXNlZCBieSB0aGUKLSAgIGFzc2VtYmxlci4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwX3ZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgZ3BfdmFsdWU7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gZ3BfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgcmVnaXN0ZXIgbWFza3MgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5Ci0gICB0aGUgYXNzZW1ibGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyAoYWJmZCwgZ3BybWFzaywgZnBybWFzaywgY3BybWFzaykKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZnBybWFzazsKLSAgICAgdW5zaWduZWQgbG9uZyAqY3BybWFzazsKLXsKLSAgZWNvZmZfZGF0YV90eXBlICp0ZGF0YTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHRkYXRhID0gZWNvZmZfZGF0YSAoYWJmZCk7Ci0gIHRkYXRhLT5ncHJtYXNrID0gZ3BybWFzazsKLSAgdGRhdGEtPmZwcm1hc2sgPSBmcHJtYXNrOwotICBpZiAoY3BybWFzayAhPSAodW5zaWduZWQgbG9uZyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCXRkYXRhLT5jcHJtYXNrW2ldID0gY3BybWFza1tpXTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCBFQ09GRiBFWFRSIGluZm9ybWF0aW9uIGZvciBhbiBleHRlcm5hbCBzeW1ib2wuICBUaGlzIGZ1bmN0aW9uCi0gICBpcyBwYXNzZWQgdG8gYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9nZXRfZXh0ciAoc3ltLCBlc3ltKQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIEVYVFIgKmVzeW07Ci17Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICplY29mZl9zeW1fcHRyOwotICBiZmQgKmlucHV0X2JmZDsKLQotICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGVjb2Zmc3ltYm9sIChzeW0pLT5uYXRpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBpbmNsdWRlIGRlYnVnZ2luZywgbG9jYWwsIG9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMAotCSAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBlc3ltLT5qbXB0YmwgPSAwOwotICAgICAgZXN5bS0+Y29ib2xfbWFpbiA9IDA7Ci0gICAgICBlc3ltLT53ZWFrZXh0ID0gKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMDsKLSAgICAgIGVzeW0tPnJlc2VydmVkID0gMDsKLSAgICAgIGVzeW0tPmlmZCA9IGlmZE5pbDsKLSAgICAgIC8qIEZJWE1FOiB3ZSBjYW4gZG8gYmV0dGVyIHRoYW4gdGhpcyBmb3Igc3QgYW5kIHNjLiAgKi8KLSAgICAgIGVzeW0tPmFzeW0uc3QgPSBzdEdsb2JhbDsKLSAgICAgIGVzeW0tPmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVzeW0tPmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgZXN5bS0+YXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGVjb2ZmX3N5bV9wdHIgPSBlY29mZnN5bWJvbCAoc3ltKTsKLQotICBpZiAoZWNvZmZfc3ltX3B0ci0+bG9jYWwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlucHV0X2JmZCA9IGJmZF9hc3ltYm9sX2JmZCAoc3ltKTsKLSAgKCooZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbikpCi0gICAgKGlucHV0X2JmZCwgZWNvZmZfc3ltX3B0ci0+bmF0aXZlLCBlc3ltKTsKLQotICAvKiBJZiB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIsIHRoZW4gZXN5bSB3aWxsIGJlCi0gICAgIHVuZGVmaW5lZCBidXQgc3ltIHdpbGwgbm90IGJlLiAgR2V0IGEgYmV0dGVyIGNsYXNzIGZvciBzdWNoIGEKLSAgICAgc3ltYm9sLiAgKi8KLSAgaWYgKChlc3ltLT5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0gICAgICAgfHwgZXN5bS0+YXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0gICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICBlc3ltLT5hc3ltLnNjID0gc2NBYnM7Ci0KLSAgLyogQWRqdXN0IHRoZSBGRFIgaW5kZXggZm9yIHRoZSBzeW1ib2wgYnkgdGhhdCB1c2VkIGZvciB0aGUgaW5wdXQKLSAgICAgQkZELiAgKi8KLSAgaWYgKGVzeW0tPmlmZCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5wdXRfZGVidWc7Ci0KLSAgICAgIGlucHV0X2RlYnVnID0gJmVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm87Ci0gICAgICBCRkRfQVNTRVJUIChlc3ltLT5pZmQgPCBpbnB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCk7Ci0gICAgICBpZiAoaW5wdXRfZGVidWctPmlmZG1hcCAhPSAoUkZEVCAqKSBOVUxMKQotCWVzeW0tPmlmZCA9IGlucHV0X2RlYnVnLT5pZmRtYXBbZXN5bS0+aWZkXTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZGV4LiAgVGhpcyByb3V0aW5lIGlzIHBhc3NlZCB0bwotICAgYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zZXRfaW5kZXggKHN5bSwgaW5keCkKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci17Ci0gIGVjb2ZmX3NldF9zeW1faW5kZXggKHN5bSwgaW5keCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBFQ09GRiBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgY29uc3QgYmZkX3ZtYSByb3VuZCA9IGJhY2tlbmQtPnJvdW5kOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGZpbGhzeiA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgYW91dHN6ID0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBzY25oc3ogPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2hkcl9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9yZWxvY19zaXplOwotICB2b2lkICgqIGNvbnN0IGFkanVzdF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICBjb25zdCBhcmVsZW50ICosCi0JCQkJCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSkKLSAgICA9IGJhY2tlbmQtPmFkanVzdF9yZWxvY19vdXQ7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9yZWxvY19vdXQ7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWcgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsKLSAgYmZkX3ZtYSB0ZXh0X3N0YXJ0OwotICBib29sZWFuIHNldF90ZXh0X3N0YXJ0OwotICBiZmRfc2l6ZV90eXBlIGRhdGFfc2l6ZTsKLSAgYmZkX3ZtYSBkYXRhX3N0YXJ0OwotICBib29sZWFuIHNldF9kYXRhX3N0YXJ0OwotICBiZmRfc2l6ZV90eXBlIGJzc19zaXplOwotICBQVFIgYnVmZiA9IE5VTEw7Ci0gIFBUUiByZWxvY19idWZmID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgaW50ZXJuYWxfZjsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgaW50ZXJuYWxfYTsKLSAgaW50IGk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoZXJlIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NzIHdpbGwgZ28gaW4gdGhlIG91dHB1dAotICAgICBmaWxlLiAgKi8KLSAgcmVsb2Nfc2l6ZSA9IGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpOwotCi0gIGNvdW50ID0gMTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgewotICAgICAgY3VycmVudC0+dGFyZ2V0X2luZGV4ID0gY291bnQ7Ci0gICAgICArK2NvdW50OwotICAgIH0KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICB0ZXh0X3NpemUgPSBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCBmYWxzZSk7Ci0gIGVsc2UKLSAgICB0ZXh0X3NpemUgPSAwOwotICB0ZXh0X3N0YXJ0ID0gMDsKLSAgc2V0X3RleHRfc3RhcnQgPSBmYWxzZTsKLSAgZGF0YV9zaXplID0gMDsKLSAgZGF0YV9zdGFydCA9IDA7Ci0gIHNldF9kYXRhX3N0YXJ0ID0gZmFsc2U7Ci0gIGJzc19zaXplID0gMDsKLQotICAvKiBXcml0ZSBzZWN0aW9uIGhlYWRlcnMgdG8gdGhlIGZpbGUuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJ1ZmYgYmlnIGVub3VnaCB0byBob2xkIGEgc2VjdGlvbiBoZWFkZXIsCi0gICAgIGZpbGUgaGVhZGVyLCBvciBhLm91dCBoZWFkZXIuICAqLwotICB7Ci0gICAgYmZkX3NpemVfdHlwZSBzaXo7Ci0gICAgc2l6ID0gc2NuaHN6OwotICAgIGlmIChzaXogPCBmaWxoc3opCi0gICAgICBzaXogPSBmaWxoc3o7Ci0gICAgaWYgKHNpeiA8IGFvdXRzeikKLSAgICAgIHNpeiA9IGFvdXRzejsKLSAgICBidWZmID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgc2l6KTsKLSAgICBpZiAoYnVmZiA9PSBOVUxMKQotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIH0KLQotICBpbnRlcm5hbF9mLmZfbnNjbnMgPSAwOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKGZpbGhzeiArIGFvdXRzeiksIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgdm1hOwotCi0gICAgICArK2ludGVybmFsX2YuZl9uc2NuczsKLQotICAgICAgc3RybmNweSAoc2VjdGlvbi5zX25hbWUsIGN1cnJlbnQtPm5hbWUsIHNpemVvZiBzZWN0aW9uLnNfbmFtZSk7Ci0KLSAgICAgIC8qIFRoaXMgc2VlbXMgdG8gYmUgY29ycmVjdCBmb3IgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotICAgICAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY3VycmVudCk7Ci0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCXNlY3Rpb24uc192YWRkciA9IDA7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3ZhZGRyID0gdm1hOwotCi0gICAgICBzZWN0aW9uLnNfcGFkZHIgPSBjdXJyZW50LT5sbWE7Ci0gICAgICBzZWN0aW9uLnNfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyB1bmxvYWRhYmxlIHRoZW4gdGhlIHNjbnB0ciB3aWxsIGJlIDAuICAqLwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpKSA9PSAwKQotCXNlY3Rpb24uc19zY25wdHIgPSAwOwotICAgICAgZWxzZQotCXNlY3Rpb24uc19zY25wdHIgPSBjdXJyZW50LT5maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotCi0gICAgICAvKiBGSVhNRTogdGhlIGxubm9wdHIgb2YgdGhlIC5zYnNzIG9yIC5zZGF0YSBzZWN0aW9uIG9mIGFuCi0JIG9iamVjdCBmaWxlIHByb2R1Y2VkIGJ5IHRoZSBhc3NlbWJsZXIgaXMgc3VwcG9zZWQgdG8gcG9pbnQgdG8KLQkgaW5mb3JtYXRpb24gYWJvdXQgaG93IG11Y2ggcm9vbSBpcyByZXF1aXJlZCBieSBvYmplY3RzIG9mCi0JIHZhcmlvdXMgZGlmZmVyZW50IHNpemVzLiAgSSB0aGluayB0aGlzIG9ubHkgbWF0dGVycyBpZiB3ZQotCSB3YW50IHRoZSBsaW5rZXIgdG8gY29tcHV0ZSB0aGUgYmVzdCBzaXplIHRvIHVzZSwgb3IKLQkgc29tZXRoaW5nLiAgSSBkb24ndCBrbm93IHdoYXQgaGFwcGVucyBpZiB0aGUgaW5mb3JtYXRpb24gaXMKLQkgbm90IHByZXNlbnQuICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSAhPSAwKQotCXNlY3Rpb24uc19sbm5vcHRyID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgQWxwaGEgRUNPRkYgLnBkYXRhIHNlY3Rpb24gdXNlcyB0aGUgbG5ub3B0ciBmaWVsZCB0bwotCSAgICAgaG9sZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlY3Rpb24gKGVhY2ggZW50cnkgaXMKLQkgICAgIDggYnl0ZXMpLiAgV2Ugc3RvcmVkIHRoaXMgaW4gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZCBpbgotCSAgICAgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgKi8KLQkgIHNlY3Rpb24uc19sbm5vcHRyID0gY3VycmVudC0+bGluZV9maWxlcG9zOwotCX0KLQotICAgICAgc2VjdGlvbi5zX25yZWxvYyA9IGN1cnJlbnQtPnJlbG9jX2NvdW50OwotICAgICAgc2VjdGlvbi5zX25sbm5vID0gMDsKLSAgICAgIHNlY3Rpb24uc19mbGFncyA9IGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzIChjdXJyZW50LT5uYW1lLAotCQkJCQkJIGN1cnJlbnQtPmZsYWdzKTsKLQotICAgICAgaWYgKGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgKFBUUikgJnNlY3Rpb24sIGJ1ZmYpID09IDAKLQkgIHx8IGJmZF93cml0ZSAoYnVmZiwgMSwgc2NuaHN6LCBhYmZkKSAhPSBzY25oc3opCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9URVhUKSAhPSAwCi0JICB8fCAoKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfUkRBVEEpICE9IDAKLQkgICAgICAmJiBlY29mZl9kYXRhIChhYmZkKS0+cmRhdGFfaW5fdGV4dCkKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1BEQVRBCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EWU5BTUlDKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSUJMSVNUKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SRUxEWU4pICE9IDAKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX0NPTkZMSUMKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RZTlNUUikgIT0gMAotCSAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfRFlOU1lNKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9IQVNIKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9GSU5JKSAhPSAwCi0JICB8fCBzZWN0aW9uLnNfZmxhZ3MgPT0gU1RZUF9SQ09OU1QpCi0JewotCSAgdGV4dF9zaXplICs9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0JICBpZiAoISBzZXRfdGV4dF9zdGFydCB8fCB0ZXh0X3N0YXJ0ID4gdm1hKQotCSAgICB7Ci0JICAgICAgdGV4dF9zdGFydCA9IHZtYTsKLQkgICAgICBzZXRfdGV4dF9zdGFydCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SREFUQSkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EQVRBKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJVEEpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfTElUOCkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSVQ0KSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1NEQVRBKSAhPSAwCi0JICAgICAgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1hEQVRBCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0dPVCkgIT0gMCkKLQl7Ci0JICBkYXRhX3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQkgIGlmICghIHNldF9kYXRhX3N0YXJ0IHx8IGRhdGFfc3RhcnQgPiB2bWEpCi0JICAgIHsKLQkgICAgICBkYXRhX3N0YXJ0ID0gdm1hOwotCSAgICAgIHNldF9kYXRhX3N0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0JTUykgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9TQlNTKSAhPSAwKQotCWJzc19zaXplICs9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0gICAgICBlbHNlIGlmIChzZWN0aW9uLnNfZmxhZ3MgPT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9MSUIpICE9IDAKLQkgICAgICAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfQ09NTUVOVCkKLQkvKiBEbyBub3RoaW5nICovIDsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9CQotCi0gIC8qIFNldCB1cCB0aGUgZmlsZSBoZWFkZXIuICAqLwotCi0gIGludGVybmFsX2YuZl9tYWdpYyA9IGVjb2ZmX2dldF9tYWdpYyAoYWJmZCk7Ci0KLSAgLyogV2Ugd2lsbCBOT1QgcHV0IGEgZnVja2luZyB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBoZXJlLiBFdmVyeQotICAgICB0aW1lIHlvdSBwdXQgaXQgYmFjaywgSSB3aWxsIGNvbWUgaW4gYW5kIHRha2UgaXQgb3V0IGFnYWluLiAgSSdtCi0gICAgIHNvcnJ5LiAgVGhpcyBmaWVsZCBkb2VzIG5vdCBiZWxvbmcgaGVyZS4gIFdlIGZpbGwgaXQgd2l0aCBhIDAgc28KLSAgICAgaXQgY29tcGFyZXMgdGhlIHNhbWUgYnV0IGlzIG5vdCBhIHJlYXNvbmFibGUgdGltZS4gLS0KLSAgICAgZ251QGN5Z251cy5jb20uICAqLwotICBpbnRlcm5hbF9mLmZfdGltZGF0ID0gMDsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgRUNPRkYgZl9uc3ltcyBmaWVsZCBpcyBub3QgYWN0dWFsbHkgdGhlIG51bWJlciBvZgotCSBzeW1ib2xzLCBpdCdzIHRoZSBzaXplIG9mIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gICovCi0gICAgICBpbnRlcm5hbF9mLmZfbnN5bXMgPSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuYWxfZi5mX25zeW1zID0gMDsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSAwOwotICAgIH0KLQotICBpbnRlcm5hbF9mLmZfb3B0aGRyID0gYW91dHN6OwotCi0gIGludGVybmFsX2YuZl9mbGFncyA9IEZfTE5OTzsKLSAgaWYgKHJlbG9jX3NpemUgPT0gMCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9SRUxGTEc7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xTWU1TOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRVhFQzsKLQotICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXUjsKLSAgZWxzZQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXOwotCi0gIC8qIFNldCB1cCB0aGUgYGBvcHRpb25hbCcnIGhlYWRlci4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIGludGVybmFsX2EubWFnaWMgPSBFQ09GRl9BT1VUX1pNQUdJQzsKLSAgZWxzZQotICAgIGludGVybmFsX2EubWFnaWMgPSBFQ09GRl9BT1VUX09NQUdJQzsKLQotICAvKiBGSVhNRTogSXMgdGhpcyByZWFsbHkgY29ycmVjdD8gICovCi0gIGludGVybmFsX2EudnN0YW1wID0gc3ltaGRyLT52c3RhbXA7Ci0KLSAgLyogQXQgbGVhc3Qgb24gVWx0cml4LCB0aGVzZSBoYXZlIHRvIGJlIHJvdW5kZWQgdG8gcGFnZSBib3VuZGFyaWVzLgotICAgICBGSVhNRTogSXMgdGhpcyB0cnVlIG9uIG90aGVyIHBsYXRmb3Jtcz8gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSAodGV4dF9zaXplICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IHRleHRfc3RhcnQgJn4gKHJvdW5kIC0gMSk7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gKGRhdGFfc2l6ZSArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0gICAgICBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBkYXRhX3N0YXJ0ICZ+IChyb3VuZCAtIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSB0ZXh0X3NpemU7Ci0gICAgICBpbnRlcm5hbF9hLnRleHRfc3RhcnQgPSB0ZXh0X3N0YXJ0OwotICAgICAgaW50ZXJuYWxfYS5kc2l6ZSA9IGRhdGFfc2l6ZTsKLSAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGRhdGFfc3RhcnQ7Ci0gICAgfQotCi0gIC8qIE9uIFVsdHJpeCwgdGhlIGluaXRpYWwgcG9ydGlvbnMgb2YgdGhlIC5zYnNzIGFuZCAuYnNzIHNlZ21lbnRzCi0gICAgIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIHNlY3Rpb24uICBUaGUgYnNpemUgZmllbGQgaW4gdGhlCi0gICAgIG9wdGlvbmFsIGhlYWRlciByZWNvcmRzIGhvdyBtYW55IGJzcyBieXRlcyBhcmUgcmVxdWlyZWQgYmV5b25kCi0gICAgIHRob3NlIGluIHRoZSBkYXRhIHNlY3Rpb24uICBUaGUgdmFsdWUgaXMgbm90IHJvdW5kZWQgdG8gYSBwYWdlCi0gICAgIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGJzc19zaXplIDwgaW50ZXJuYWxfYS5kc2l6ZSAtIGRhdGFfc2l6ZSkKLSAgICBic3Nfc2l6ZSA9IDA7Ci0gIGVsc2UKLSAgICBic3Nfc2l6ZSAtPSBpbnRlcm5hbF9hLmRzaXplIC0gZGF0YV9zaXplOwotICBpbnRlcm5hbF9hLmJzaXplID0gYnNzX3NpemU7Ci0gIGludGVybmFsX2EuYnNzX3N0YXJ0ID0gaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ICsgaW50ZXJuYWxfYS5kc2l6ZTsKLQotICBpbnRlcm5hbF9hLmVudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICBpbnRlcm5hbF9hLmdwX3ZhbHVlID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotCi0gIGludGVybmFsX2EuZ3BybWFzayA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncHJtYXNrOwotICBpbnRlcm5hbF9hLmZwcm1hc2sgPSBlY29mZl9kYXRhIChhYmZkKS0+ZnBybWFzazsKLSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICBpbnRlcm5hbF9hLmNwcm1hc2tbaV0gPSBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1tpXTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgYWRqdXN0IHRoZSBoZWFkZXJzIGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChiYWNrZW5kLT5hZGp1c3RfaGVhZGVycykKLSAgICB7Ci0gICAgICBpZiAoISAoKmJhY2tlbmQtPmFkanVzdF9oZWFkZXJzKSAoYWJmZCwgJmludGVybmFsX2YsICZpbnRlcm5hbF9hKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBmaWxlIGhlYWRlciBhbmQgdGhlIG9wdGlvbmFsIGhlYWRlci4gICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIChQVFIpICZpbnRlcm5hbF9mLCBidWZmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgZmlsaHN6LCBhYmZkKSAhPSBmaWxoc3opCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2EsIGJ1ZmYpOwotICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBhb3V0c3osIGFiZmQpICE9IGFvdXRzeikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCi0gICAgIHdyaXRpbmcgb3V0IHRoZSByZWxvY3Mgc28gdGhhdCB3ZSBrbm93IHRoZSBzeW1ib2wgaW5kaWNlcy4gIFdlCi0gICAgIGRvbid0IGRvIHRoaXMgaWYgdGhpcyBCRkQgd2FzIGNyZWF0ZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyLAotICAgICBzaW5jZSBpdCB3aWxsIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBzeW1ib2xzIGFuZCByZWxvY3MuICAqLwotICBpZiAoISBlY29mZl9kYXRhIChhYmZkKS0+bGlua2VyKQotICAgIHsKLSAgICAgIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0gICAgICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ID0gZGVidWctPmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotICAgICAgZGVidWctPnNzZXh0ID0gZGVidWctPnNzZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBpZiAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCSAgICAgKCgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApID09IDApCi0JCQkJICAgICAgPyB0cnVlIDogZmFsc2UpLAotCQkJCSAgICAgZWNvZmZfZ2V0X2V4dHIsIGVjb2ZmX3NldF9pbmRleCkKLQkgID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0gICAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLQkgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotCXsKLQkgIGFyZWxlbnQgKipyZWxvY19wdHJfcHRyOwotCSAgYXJlbGVudCAqKnJlbG9jX2VuZDsKLQkgIGNoYXIgKm91dF9wdHI7Ci0KLQkgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgcmVsb2NfYnVmZiA9Ci0JICAgIGJmZF9hbGxvYyAoYWJmZCwgY3VycmVudC0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKTsKLQkgIGlmIChyZWxvY19idWZmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICByZWxvY19wdHJfcHRyID0gY3VycmVudC0+b3JlbG9jYXRpb247Ci0JICByZWxvY19lbmQgPSByZWxvY19wdHJfcHRyICsgY3VycmVudC0+cmVsb2NfY291bnQ7Ci0JICBvdXRfcHRyID0gKGNoYXIgKikgcmVsb2NfYnVmZjsKLQkgIGZvciAoOwotCSAgICAgICByZWxvY19wdHJfcHRyIDwgcmVsb2NfZW5kOwotCSAgICAgICByZWxvY19wdHJfcHRyKyssIG91dF9wdHIgKz0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSkKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKnJlbG9jOwotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW47Ci0JICAKLQkgICAgICBtZW1zZXQgKChQVFIpICZpbiwgMCwgc2l6ZW9mIGluKTsKLQotCSAgICAgIHJlbG9jID0gKnJlbG9jX3B0cl9wdHI7Ci0JICAgICAgc3ltID0gKnJlbG9jLT5zeW1fcHRyX3B0cjsKLQotCSAgICAgIGluLnJfdmFkZHIgPSAocmVsb2MtPmFkZHJlc3MKLQkJCSAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGN1cnJlbnQpKTsKLQkgICAgICBpbi5yX3R5cGUgPSByZWxvYy0+aG93dG8tPnR5cGU7Ci0KLQkgICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JCXsKLQkJICBpbi5yX3N5bW5keCA9IGVjb2ZmX2dldF9zeW1faW5kZXggKCpyZWxvYy0+c3ltX3B0cl9wdHIpOwotCQkgIGluLnJfZXh0ZXJuID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENPTlNUIGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7Ci0JCSAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0JTUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9CU1M7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0lOSVQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnhkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9YREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1BEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIipBQlMqIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9BQlM7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJjb25zdCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkNPTlNUOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIGluLnJfZXh0ZXJuID0gMDsKLQkJfQotCi0JICAgICAgKCphZGp1c3RfcmVsb2Nfb3V0KSAoYWJmZCwgcmVsb2MsICZpbik7Ci0KLQkgICAgICAoKnN3YXBfcmVsb2Nfb3V0KSAoYWJmZCwgJmluLCAoUFRSKSBvdXRfcHRyKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnQtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3dyaXRlIChyZWxvY19idWZmLAotCQkJIGV4dGVybmFsX3JlbG9jX3NpemUsIGN1cnJlbnQtPnJlbG9jX2NvdW50LCBhYmZkKQotCSAgICAgICE9IGV4dGVybmFsX3JlbG9jX3NpemUgKiBjdXJyZW50LT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0JICByZWxvY19idWZmID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0JewotCSAgLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKGJmZF9lY29mZl93cml0ZV9kZWJ1ZyAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCSAgICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zKQotCSAgICAgID09IGZhbHNlKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSAuYnNzIHNlY3Rpb24gb2YgYSBkZW1hbmQgcGFnZWQgZXhlY3V0YWJsZSBtdXN0IHJlY2VpdmUgYW4KLSAgICAgZW50aXJlIHBhZ2UuICBJZiB0aGVyZSBhcmUgc3ltYm9scywgdGhlIHN5bWJvbHMgd2lsbCBzdGFydCBvbiB0aGUKLSAgICAgbmV4dCBwYWdlLiAgSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIG11c3QgZmlsbCBvdXQgdGhlIHBhZ2UgYnkKLSAgICAgaGFuZC4gICovCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDAKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgewotICAgICAgY2hhciBjOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zIC0gMSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgPT0gMCkKLQljID0gMDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2J1ZmYgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX2J1ZmYgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEFyY2hpdmUgaGFuZGxpbmcuICBFQ09GRiB1c2VzIHdoYXQgYXBwZWFycyB0byBiZSBhIHVuaXF1ZSB0eXBlIG9mCi0gICBhcmNoaXZlIGhlYWRlciAoYXJtYXApLiAgVGhlIGJ5dGUgb3JkZXJpbmcgb2YgdGhlIGFybWFwIGFuZCB0aGUKLSAgIGNvbnRlbnRzIGFyZSBlbmNvZGVkIGluIHRoZSBuYW1lIG9mIHRoZSBhcm1hcCBpdHNlbGYuICBBdCBsZWFzdCBmb3IKLSAgIG5vdywgd2Ugb25seSBzdXBwb3J0IGFyY2hpdmVzIHdpdGggdGhlIHNhbWUgYnl0ZSBvcmRlcmluZyBpbiB0aGUKLSAgIGFybWFwIGFuZCB0aGUgY29udGVudHMuCi0KLSAgIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIGluIHRoZSBhcm1hcCBhcmUgdGhlIG51bWJlciBvZiBzeW1ib2wKLSAgIGRlZmluaXRpb25zLiAgVGhpcyBpcyBhbHdheXMgYSBwb3dlciBvZiB0d28uCi0KLSAgIFRoaXMgaXMgZm9sbG93ZWQgYnkgdGhlIHN5bWJvbCBkZWZpbml0aW9ucy4gIEVhY2ggc3ltYm9sIGRlZmluaXRpb24KLSAgIG9jY3VwaWVzIDggYnl0ZXMuICBUaGUgZmlyc3QgZm91ciBieXRlcyBhcmUgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgc3RhcnQgb2YgdGhlIGFybWFwIHN0cmluZ3MgdG8gdGhlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgbmFtaW5nCi0gICB0aGlzIHN5bWJvbC4gIFRoZSBzZWNvbmQgZm91ciBieXRlcyBhcmUgdGhlIGZpbGUgb2Zmc2V0IHRvIHRoZQotICAgYXJjaGl2ZSBtZW1iZXIgd2hpY2ggZGVmaW5lcyB0aGlzIHN5bWJvbC4gIElmIHRoZSBzZWNvbmQgZm91ciBieXRlcwotICAgYXJlIDAsIHRoZW4gdGhpcyBpcyBub3QgYWN0dWFsbHkgYSBzeW1ib2wgZGVmaW5pdGlvbiwgYW5kIGl0IHNob3VsZAotICAgYmUgaWdub3JlZC4KLQotICAgVGhlIHN5bWJvbHMgYXJlIGhhc2hlZCBpbnRvIHRoZSBhcm1hcCB3aXRoIGEgY2xvc2VkIGhhc2hpbmcgc2NoZW1lLgotICAgU2VlIHRoZSBmdW5jdGlvbnMgYmVsb3cgZm9yIHRoZSBkZXRhaWxzIG9mIHRoZSBhbGdvcml0aG0uCi0KLSAgIEFmdGVyIHRoZSBzeW1ib2wgZGVmaW5pdGlvbnMgY29tZXMgZm91ciBieXRlcyBob2xkaW5nIHRoZSBzaXplIG9mCi0gICB0aGUgc3RyaW5nIHRhYmxlLCBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIHRhYmxlIGl0c2VsZi4gICovCi0KLS8qIFRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgaGVhZGVycyBsb29rcyBsaWtlIHRoaXM6Ci0gICBfX19fX19fX19fRVtCTF1FW0JMXV8gKHdpdGggYSB0cmFpbGluZyBzcGFjZSkuCi0gICBUaGUgdHJhaWxpbmcgc3BhY2UgaXMgY2hhbmdlZCB0byBhbiBYIGlmIHRoZSBhcmNoaXZlIGlzIGNoYW5nZWQgdG8KLSAgIGluZGljYXRlIHRoYXQgdGhlIGFybWFwIGlzIG91dCBvZiBkYXRlLgotCi0gICBUaGUgQWxwaGEgc2VlbXMgdG8gdXNlIF9fX19fX19fNjRFW0JMXUVbQkxdXy4gICovCi0KLSNkZWZpbmUgQVJNQVBfQklHX0VORElBTiAnQicKLSNkZWZpbmUgQVJNQVBfTElUVExFX0VORElBTiAnTCcKLSNkZWZpbmUgQVJNQVBfTUFSS0VSICdFJwotI2RlZmluZSBBUk1BUF9TVEFSVF9MRU5HVEggMTAKLSNkZWZpbmUgQVJNQVBfSEVBREVSX01BUktFUl9JTkRFWCAxMAotI2RlZmluZSBBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYIDExCi0jZGVmaW5lIEFSTUFQX09CSkVDVF9NQVJLRVJfSU5ERVggMTIKLSNkZWZpbmUgQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWCAxMwotI2RlZmluZSBBUk1BUF9FTkRfSU5ERVggMTQKLSNkZWZpbmUgQVJNQVBfRU5EICJfICIKLQotLyogVGhpcyBpcyBhIG1hZ2ljIG51bWJlciB1c2VkIGluIHRoZSBoYXNoaW5nIGFsZ29yaXRobS4gICovCi0jZGVmaW5lIEFSTUFQX0hBU0hfTUFHSUMgMHg5ZGQ2OGFiNQotCi0vKiBUaGlzIHJldHVybnMgdGhlIGhhc2ggdmFsdWUgdG8gdXNlIGZvciBhIHN0cmluZy4gIEl0IGFsc28gc2V0cwotICAgKlJFSEFTSCB0byB0aGUgcmVoYXNoIGFkanVzdG1lbnQgaWYgdGhlIGZpcnN0IHNsb3QgaXMgdGFrZW4uICBTSVpFCi0gICBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIGFuZCBITE9HIGlzIHRoZSBsb2cKLSAgIGJhc2UgMiBvZiBTSVpFLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZWNvZmZfYXJtYXBfaGFzaCAocywgcmVoYXNoLCBzaXplLCBobG9nKQotICAgICBDT05TVCBjaGFyICpzOwotICAgICB1bnNpZ25lZCBpbnQgKnJlaGFzaDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHVuc2lnbmVkIGludCBobG9nOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoaGxvZyA9PSAwKQotICAgIHJldHVybiAwOwotICBoYXNoID0gKnMrKzsKLSAgd2hpbGUgKCpzICE9ICdcMCcpCi0gICAgaGFzaCA9ICgoaGFzaCA+PiAyNykgfCAoaGFzaCA8PCA1KSkgKyAqcysrOwotICBoYXNoICo9IEFSTUFQX0hBU0hfTUFHSUM7Ci0gICpyZWhhc2ggPSAoaGFzaCAmIChzaXplIC0gMSkpIHwgMTsKLSAgcmV0dXJuIGhhc2ggPj4gKDMyIC0gaGxvZyk7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGFybWFwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgcGFyc2VkX3NpemU7Ci0gIGNoYXIgKnJhd19hcm1hcDsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBjaGFyICpyYXdfcHRyOwotICBzdHJ1Y3Qgc3ltZGVmICpzeW1kZWZfcHRyOwotICBjaGFyICpzdHJpbmdiYXNlOwotICAKLSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBlbGVtZW50LiAgKi8KLSAgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotICBpZiAoaSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtMTYsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJcml4IDQuMC41RiBhcHBhcmVudGx5IGNhbiB1c2UgZWl0aGVyIGFuIEVDT0ZGIGFybWFwIG9yIGEKLSAgICAgc3RhbmRhcmQgQ09GRiBhcm1hcC4gIFdlIGNvdWxkIG1vdmUgdGhlIEVDT0ZGIGFybWFwIHN0dWZmIGludG8KLSAgICAgYmZkX3NsdXJwX2FybWFwLCBidXQgdGhhdCBzZWVtcyBpbmFwcHJvcHJpYXRlIHNpbmNlIG5vIG90aGVyCi0gICAgIHRhcmdldCB1c2VzIHRoaXMgZm9ybWF0LiAgSW5zdGVhZCwgd2UgY2hlY2sgZGlyZWN0bHkgZm9yIGEgQ09GRgotICAgICBhcm1hcC4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikgPT0gMCkKLSAgICByZXR1cm4gYmZkX3NsdXJwX2FybWFwIChhYmZkKTsKLQotICAvKiBTZWUgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJtYXAuICAqLwotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5hcm1hcF9zdGFydCwKLQkgICAgICAgQVJNQVBfU1RBUlRfTEVOR1RIKSAhPSAwCi0gICAgICB8fCBuZXh0bmFtZVtBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYXSAhPSBBUk1BUF9NQVJLRVIKLSAgICAgIHx8IChuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9CSUdfRU5ESUFOCi0JICAmJiBuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9MSVRUTEVfRU5ESUFOKQotICAgICAgfHwgbmV4dG5hbWVbQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWF0gIT0gQVJNQVBfTUFSS0VSCi0gICAgICB8fCAobmV4dG5hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gIT0gQVJNQVBfQklHX0VORElBTgotCSAgJiYgbmV4dG5hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gIT0gQVJNQVBfTElUVExFX0VORElBTikKLSAgICAgIHx8IHN0cm5jbXAgKG5leHRuYW1lICsgQVJNQVBfRU5EX0lOREVYLAotCQkgIEFSTUFQX0VORCwgc2l6ZW9mIEFSTUFQX0VORCAtIDEpICE9IDApCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGJ5dGUgb3JkZXJpbmcuICAqLwotICBpZiAoKChuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSA9PSBBUk1BUF9CSUdfRU5ESUFOKQotICAgICAgIF4gKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpKQotICAgICAgfHwgKChuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSA9PSBBUk1BUF9CSUdfRU5ESUFOKQotCSAgXiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIGFybWFwLiAgKi8KLSAgYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gKHN0cnVjdCBhcmVsdGRhdGEgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsKLSAgICAKLSAgcmF3X2FybWFwID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBwYXJzZWRfc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gKGNoYXIgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmF3X2FybWFwLCAxLCBwYXJzZWRfc2l6ZSwgYWJmZCkgIT0gcGFyc2VkX3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gIGFyZGF0YS0+dGRhdGEgPSAoUFRSKSByYXdfYXJtYXA7Ci0KLSAgY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSAwOwotICBhcmRhdGEtPmNhY2hlID0gKHN0cnVjdCBhcl9jYWNoZSAqKSBOVUxMOwotCi0gIC8qIFRoaXMgY29kZSB1c2VkIHRvIG92ZXJsYXkgdGhlIHN5bWRlZnMgb3ZlciB0aGUgcmF3IGFyY2hpdmUgZGF0YSwKLSAgICAgYnV0IHRoYXQgZG9lc24ndCB3b3JrIG9uIGEgNjQgYml0IGhvc3QuICAqLwotCi0gIHN0cmluZ2Jhc2UgPSByYXdfYXJtYXAgKyBjb3VudCAqIDggKyA4OwotCi0jaWZkZWYgQ0hFQ0tfQVJNQVBfSEFTSAotICB7Ci0gICAgdW5zaWduZWQgaW50IGhsb2c7Ci0KLSAgICAvKiBEb3VibGUgY2hlY2sgdGhhdCBJIGhhdmUgdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHJpZ2h0IGJ5IG1ha2luZwotICAgICAgIHN1cmUgdGhhdCBldmVyeSBzeW1ib2wgY2FuIGJlIGxvb2tlZCB1cCBzdWNjZXNzZnVsbHkuICAqLwotICAgIGhsb2cgPSAwOwotICAgIGZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSA8PD0gMSkKLSAgICAgIGhsb2crKzsKLSAgICBCRkRfQVNTRVJUIChpID09IGNvdW50KTsKLQotICAgIHJhd19wdHIgPSByYXdfYXJtYXAgKyA0OwotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IG5hbWVfb2Zmc2V0LCBmaWxlX29mZnNldDsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoLCBzcmNoOwotICAgICAgCi0JbmFtZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIHJhd19wdHIpOwotCWZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAocmF3X3B0ciArIDQpKTsKLQlpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQkgIGNvbnRpbnVlOwotCWhhc2ggPSBlY29mZl9hcm1hcF9oYXNoIChzdHJpbmdiYXNlICsgbmFtZV9vZmZzZXQsICZyZWhhc2gsIGNvdW50LAotCQkJCSBobG9nKTsKLQlpZiAoaGFzaCA9PSBpKQotCSAgY29udGludWU7Ci0KLQkvKiBTZWUgaWYgd2UgY2FuIHJlaGFzaCB0byB0aGlzIGxvY2F0aW9uLiAgKi8KLQlmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoY291bnQgLSAxKTsKLQkgICAgIHNyY2ggIT0gaGFzaCAmJiBzcmNoICE9IGk7Ci0JICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGNvdW50IC0gMSkpCi0JICBCRkRfQVNTRVJUIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfYXJtYXAgKyA4ICsgc3JjaCAqIDgpKQotCQkgICAgICAhPSAwKTsKLQlCRkRfQVNTRVJUIChzcmNoID09IGkpOwotICAgICAgfQotICB9Ci0KLSNlbmRpZiAvKiBDSEVDS19BUk1BUF9IQVNIICovCi0KLSAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19wdHIgKyA0KSkgIT0gMCkKLSAgICAgICsrYXJkYXRhLT5zeW1kZWZfY291bnQ7Ci0KLSAgc3ltZGVmX3B0ciA9ICgoc3RydWN0IHN5bWRlZiAqKQotCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkgICBhcmRhdGEtPnN5bWRlZl9jb3VudCAqIHNpemVvZiAoc3RydWN0IHN5bWRlZikpKTsKLSAgaWYgKCFzeW1kZWZfcHRyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIHN5bWRlZl9wdHI7Ci0KLSAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5hbWVfb2Zmc2V0LCBmaWxlX29mZnNldDsKLQotICAgICAgZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfcHRyICsgNCkpOwotICAgICAgaWYgKGZpbGVfb2Zmc2V0ID09IDApCi0JY29udGludWU7Ci0gICAgICBuYW1lX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X3B0cik7Ci0gICAgICBzeW1kZWZfcHRyLT5zLm5hbWUgPSBzdHJpbmdiYXNlICsgbmFtZV9vZmZzZXQ7Ci0gICAgICBzeW1kZWZfcHRyLT5maWxlX29mZnNldCA9IGZpbGVfb2Zmc2V0OwotICAgICAgKytzeW1kZWZfcHRyOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkuICAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyAlIDI7Ci0KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGFybWFwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICB1bnNpZ25lZCBpbnQgaGFzaHNpemUsIGhhc2hsb2c7Ci0gIHVuc2lnbmVkIGludCBzeW1kZWZzaXplOwotICBpbnQgcGFkaXQ7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZTsKLSAgZmlsZV9wdHIgZmlyc3RyZWFsOwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIGJmZF9ieXRlICpoYXNodGFibGU7Ci0gIGJmZCAqY3VycmVudDsKLSAgYmZkICpsYXN0X2VsdDsKLQotICAvKiBVbHRyaXggYXBwZWFycyB0byB1c2UgYXMgYSBoYXNoIHRhYmxlIHNpemUgdGhlIGxlYXN0IHBvd2VyIG9mIHR3bwotICAgICBncmVhdGVyIHRoYW4gdHdpY2UgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KLSAgZm9yIChoYXNobG9nID0gMDsgKCh1bnNpZ25lZCBpbnQpIDEgPDwgaGFzaGxvZykgPD0gMiAqIG9ybF9jb3VudDsgaGFzaGxvZysrKQotICAgIDsKLSAgaGFzaHNpemUgPSAxIDw8IGhhc2hsb2c7Ci0KLSAgc3ltZGVmc2l6ZSA9IGhhc2hzaXplICogODsKLSAgcGFkaXQgPSBzdHJpZHggJSAyOwotICBzdHJpbmdzaXplID0gc3RyaWR4ICsgcGFkaXQ7Ci0KLSAgLyogSW5jbHVkZSA4IGJ5dGVzIHRvIHN0b3JlIHN5bWRlZnNpemUgYW5kIHN0cmluZ3NpemUgaW4gb3V0cHV0LiAqLwotICBtYXBzaXplID0gc3ltZGVmc2l6ZSArIHN0cmluZ3NpemUgKyA4OwotCi0gIGZpcnN0cmVhbCA9IFNBUk1BRyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBtYXBzaXplICsgZWxlbmd0aDsKLQotICBtZW1zZXQgKChQVFIpICZoZHIsIDAsIHNpemVvZiBoZHIpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBFQ09GRiBhcm1hcCBuYW1lLiAgKi8KLSAgc3RyY3B5IChoZHIuYXJfbmFtZSwgZWNvZmZfYmFja2VuZCAoYWJmZCktPmFybWFwX3N0YXJ0KTsKLSAgaGRyLmFyX25hbWVbQVJNQVBfSEVBREVSX01BUktFUl9JTkRFWF0gPSBBUk1BUF9NQVJLRVI7Ci0gIGhkci5hcl9uYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdID0KLSAgICAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKQotICAgICA/IEFSTUFQX0JJR19FTkRJQU4KLSAgICAgOiBBUk1BUF9MSVRUTEVfRU5ESUFOKTsKLSAgaGRyLmFyX25hbWVbQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWF0gPSBBUk1BUF9NQVJLRVI7Ci0gIGhkci5hcl9uYW1lW0FSTUFQX09CSkVDVF9FTkRJQU5fSU5ERVhdID0KLSAgICBiZmRfYmlnX2VuZGlhbiAoYWJmZCkgPyBBUk1BUF9CSUdfRU5ESUFOIDogQVJNQVBfTElUVExFX0VORElBTjsKLSAgbWVtY3B5IChoZHIuYXJfbmFtZSArIEFSTUFQX0VORF9JTkRFWCwgQVJNQVBfRU5ELCBzaXplb2YgQVJNQVBfRU5EIC0gMSk7Ci0KLSAgLyogV3JpdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgdG8gYmUganVzdCBhIGxpdHRsZSBiaXQKLSAgICAgbGF0ZXIgdGhhbiB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaWxlLCBvdGhlcndpc2UgdGhlIGxpbmtlciB3aWxsCi0gICAgIGNvbXBsYWluIHRoYXQgdGhlIGluZGV4IGlzIG91dCBvZiBkYXRlLiAgQWN0dWFsbHksIHRoZSBVbHRyaXgKLSAgICAgbGlua2VyIGp1c3QgY2hlY2tzIHRoZSBhcmNoaXZlIG5hbWU7IHRoZSBHTlUgbGlua2VyIG1heSBjaGVjayB0aGUKLSAgICAgZGF0ZS4gICovCi0gIHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmc3RhdGJ1Zik7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIChzdGF0YnVmLnN0X210aW1lICsgNjApKTsKLQotICAvKiBUaGUgREVDc3RhdGlvbiB1c2VzIHplcm9lcyBmb3IgdGhlIHVpZCwgZ2lkIGFuZCBtb2RlIG9mIHRoZQotICAgICBhcm1hcC4gICovCi0gIGhkci5hcl91aWRbMF0gPSAnMCc7Ci0gIGhkci5hcl9naWRbMF0gPSAnMCc7Ci0jaWYgMAotICBoZHIuYXJfbW9kZVswXSA9ICcwJzsKLSNlbHNlCi0gIC8qIEJ1aWxkaW5nIGdjYyBlbmRzIHVwIGV4dHJhY3RpbmcgdGhlIGFybWFwIGFzIGEgZmlsZSAtIHR3aWNlLiAqLwotICBoZHIuYXJfbW9kZVswXSA9ICc2JzsKLSAgaGRyLmFyX21vZGVbMV0gPSAnNCc7Ci0gIGhkci5hcl9tb2RlWzJdID0gJzQnOwotI2VuZGlmCi0KLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotCi0gIGhkci5hcl9mbWFnWzBdID0gJ2AnOwotICBoZHIuYXJfZm1hZ1sxXSA9ICdcMDEyJzsKLQotICAvKiBUdXJuIGFsbCBudWxsIGJ5dGVzIGluIHRoZSBoZWFkZXIgaW50byBzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgaWYgKCgoY2hhciAqKSgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgKCgoY2hhciAqKSgmaGRyKSlbaV0pID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBoYXNoc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaGFzaHRhYmxlID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHN5bWRlZnNpemUpOwotICBpZiAoIWhhc2h0YWJsZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY3VycmVudCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgbGFzdF9lbHQgPSBjdXJyZW50OwotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKLQotICAgICAgLyogQWR2YW5jZSBmaXJzdHJlYWwgdG8gdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhpcyBhcmNoaXZlCi0JIGVsZW1lbnQuICAqLwotICAgICAgaWYgKCgoYmZkICopIG1hcFtpXS5wb3MpICE9IGxhc3RfZWx0KQotCXsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBmaXJzdHJlYWwgKz0gYXJlbHRfc2l6ZSAoY3VycmVudCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCSAgICAgIGZpcnN0cmVhbCArPSBmaXJzdHJlYWwgJSAyOwotCSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIG1hcFtpXS5wb3MpOwotCX0KLQotICAgICAgbGFzdF9lbHQgPSBjdXJyZW50OwotCi0gICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoKm1hcFtpXS5uYW1lLCAmcmVoYXNoLCBoYXNoc2l6ZSwgaGFzaGxvZyk7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKGhhc2ggKiA4KSArIDQpKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBzcmNoOwotCi0JICAvKiBUaGUgZGVzaXJlZCBzbG90IGlzIGFscmVhZHkgdGFrZW4uICAqLwotCSAgZm9yIChzcmNoID0gKGhhc2ggKyByZWhhc2gpICYgKGhhc2hzaXplIC0gMSk7Ci0JICAgICAgIHNyY2ggIT0gaGFzaDsKLQkgICAgICAgc3JjaCA9IChzcmNoICsgcmVoYXNoKSAmIChoYXNoc2l6ZSAtIDEpKQotCSAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpKSA9PSAwKQotCSAgICAgIGJyZWFrOwotCi0JICBCRkRfQVNTRVJUIChzcmNoICE9IGhhc2gpOwotCi0JICBoYXNoID0gc3JjaDsKLQl9Ci0JCi0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBtYXBbaV0ubmFtaWR4LAotCQkgICAgKFBUUikgKGhhc2h0YWJsZSArIGhhc2ggKiA4KSk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBmaXJzdHJlYWwsCi0JCSAgICAoUFRSKSAoaGFzaHRhYmxlICsgaGFzaCAqIDggKyA0KSk7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGhhc2h0YWJsZSwgMSwgc3ltZGVmc2l6ZSwgYWJmZCkgIT0gc3ltZGVmc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGhhc2h0YWJsZSk7Ci0KLSAgLyogTm93IHdyaXRlIHRoZSBzdHJpbmdzLiAgKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3RyaW5nc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsZW47Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoKm1hcFtpXS5uYW1lKSArIDE7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoKm1hcFtpXS5uYW1lKSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBERUNzdGF0aW9uIGFyIHdlIHVzZSBhIG51bGwuICAqLwotICBpZiAocGFkaXQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgdGhpcyBCRkQgaXMgYW4gYXJjaGl2ZS4gIElmIGl0IGlzLCByZWFkIGluIHRoZSBhcm1hcAotICAgYW5kIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1fYmZkX2Vjb2ZmX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqdGRhdGFfaG9sZDsKLSAgY2hhciBhcm1hZ1tTQVJNQUcgKyAxXTsKLQotICB0ZGF0YV9ob2xkID0gYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgYXJtYWcsIDEsIFNBUk1BRywgYWJmZCkgIT0gU0FSTUFHKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotICAgIH0KLQotICBpZiAoc3RybmNtcCAoYXJtYWcsIEFSTUFHLCBTQVJNQUcpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQotICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YKLSAgICAgYXNzaWdubWVudC4gICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9Ci0gICAgKHN0cnVjdCBhcnRkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKTsKLQotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEwpCi0gICAgewotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLSAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotICAgIH0KLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gU0FSTUFHOwotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOwotICAKLSAgaWYgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXAgKGFiZmQpID09IGZhbHNlCi0gICAgICB8fCBfYmZkX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmQgKmZpcnN0OwotCi0gICAgICAvKiBUaGlzIGFyY2hpdmUgaGFzIGEgbWFwLCBzbyB3ZSBtYXkgcHJlc3VtZSB0aGF0IHRoZSBjb250ZW50cwotCSBhcmUgb2JqZWN0IGZpbGVzLiAgTWFrZSBzdXJlIHRoYXQgaWYgdGhlIGZpcnN0IGZpbGUgaW4gdGhlCi0JIGFyY2hpdmUgY2FuIGJlIHJlY29nbml6ZWQgYXMgYW4gb2JqZWN0IGZpbGUsIGl0IGlzIGZvciB0aGlzCi0JIHRhcmdldC4gIElmIG5vdCwgYXNzdW1lIHRoYXQgdGhpcyBpcyB0aGUgd3JvbmcgZm9ybWF0LiAgSWYKLQkgdGhlIGZpcnN0IGZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlLCBzb21lYm9keSBpcyBkb2luZwotCSBzb21ldGhpbmcgd2VpcmQsIGFuZCB3ZSBwZXJtaXQgaXQgc28gdGhhdCBhciAtdCB3aWxsIHdvcmsuICAqLwotCi0gICAgICBmaXJzdCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7Ci0gICAgICBpZiAoZmlyc3QgIT0gTlVMTCkKLQl7Ci0JICBib29sZWFuIGZhaWw7Ci0KLQkgIGZpcnN0LT50YXJnZXRfZGVmYXVsdGVkID0gZmFsc2U7Ci0JICBmYWlsID0gZmFsc2U7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlyc3QsIGJmZF9vYmplY3QpCi0JICAgICAgJiYgZmlyc3QtPnh2ZWMgIT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGZpcnN0KTsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotCSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgLyogV2Ugb3VnaHQgdG8gY2xvc2UgZmlyc3QgaGVyZSwgYnV0IHdlIGNhbid0LCBiZWNhdXNlIHdlCi0gICAgICAgICAgICAgaGF2ZSBubyB3YXkgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFyY2hpdmUgY2FjaGUuICBGSVhNRS4gICovCi0JfQotICAgIH0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQwKLS8qIEVDT0ZGIGxpbmtlciBjb2RlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWNvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgUFRSLCBjaGFyICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT5hYmZkID0gTlVMTDsKLSAgICAgIHJldC0+d3JpdHRlbiA9IDA7Ci0gICAgICByZXQtPnNtYWxsID0gMDsKLSAgICB9Ci0gIG1lbXNldCAoKFBUUikgJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIHJldC0+ZXN5bSk7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9lY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBFQ09GRiBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgZWNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEdpdmVuIGFuIEVDT0ZGIEJGRCwgYWRkIHN5bWJvbHMgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGFzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlIGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLgotICAgVGhpcyBsb29rcyB0aHJvdWdoIHRoZSB1bmRlZmluZWQgc3ltYm9scywgbG9va3MgZWFjaCBvbmUgdXAgaW4gdGhlCi0gICBhcmNoaXZlIGhhc2ggdGFibGUsIGFuZCBhZGRzIGFueSBhc3NvY2lhdGVkIG9iamVjdCBmaWxlLiAgV2UgZG8gbm90Ci0gICB1c2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyBiZWNhdXNlIEVDT0ZGIGFyY2hpdmVzCi0gICBhbHJlYWR5IGhhdmUgYSBoYXNoIHRhYmxlLCBzbyB0aGVyZSBpcyBubyByZWFzb24gdG8gY29uc3RydWN0Ci0gICBhbm90aGVyIG9uZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9ieXRlICpyYXdfYXJtYXA7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqcHVuZGVmOwotICB1bnNpZ25lZCBpbnQgYXJtYXBfY291bnQ7Ci0gIHVuc2lnbmVkIGludCBhcm1hcF9sb2c7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBiZmRfYnl0ZSAqaGFzaHRhYmxlOwotICBjb25zdCBjaGFyICpzdHJpbmdiYXNlOwotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KLSAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSByYXcgZGF0YSBmb3IgdGhpcyBhcmNoaXZlLCBhcyBjYW4gaGFwcGVuIG9uCi0gICAgIElyaXggNC4wLjVGLCB3ZSBjYWxsIHRoZSBnZW5lcmljIHJvdXRpbmUuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYmUgbW9yZSBjbGV2ZXIgYWJvdXQgdGhpcywgc2luY2Ugc29tZWRheSB0ZGF0YQotICAgICBtYXkgZ2V0IHRvIHNvbWV0aGluZyBmb3IgYSBnZW5lcmljIGFyY2hpdmUuICAqLwotICByYXdfYXJtYXAgPSAoY29uc3QgYmZkX2J5dGUgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhOwotICBpZiAocmF3X2FybWFwID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHJldHVybiAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCSAgICAoYWJmZCwgaW5mbywgZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpKTsKLQotICBhcm1hcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3X2FybWFwKTsKLQotICBhcm1hcF9sb2cgPSAwOwotICBmb3IgKGkgPSAxOyBpIDwgYXJtYXBfY291bnQ7IGkgPDw9IDEpCi0gICAgYXJtYXBfbG9nKys7Ci0gIEJGRF9BU1NFUlQgKGkgPT0gYXJtYXBfY291bnQpOwotCi0gIGhhc2h0YWJsZSA9IHJhd19hcm1hcCArIDQ7Ci0gIHN0cmluZ2Jhc2UgPSAoY29uc3QgY2hhciAqKSByYXdfYXJtYXAgKyBhcm1hcF9jb3VudCAqIDggKyA4OwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scy4gICovCi0gIHB1bmRlZiA9ICZpbmZvLT5oYXNoLT51bmRlZnM7Ci0gIHdoaWxlICgqcHVuZGVmICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKLSAgICAgIHVuc2lnbmVkIGludCBmaWxlX29mZnNldDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmQgKmVsZW1lbnQ7Ci0KLSAgICAgIGggPSAqcHVuZGVmOwotCi0gICAgICAvKiBXaGVuIGEgc3ltYm9sIGlzIGRlZmluZWQsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20KLQkgdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgLyogUmVtb3ZlIHRoaXMgZW50cnkgZnJvbSB0aGUgbGlzdCwgZm9yIGdlbmVyYWwgY2xlYW5saW5lc3MKLQkgICAgIGFuZCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIGxpc3QgYWdhaW4KLQkgICAgIGlmIHdlIHNlYXJjaCBhbnkgbW9yZSBsaWJyYXJpZXMuICBXZSBjYW4ndCByZW1vdmUgdGhlCi0JICAgICBlbnRyeSBpZiBpdCBpcyB0aGUgdGFpbCwgYmVjYXVzZSB0aGF0IHdvdWxkIGxvc2UgYW55Ci0JICAgICBlbnRyaWVzIHdlIGFkZCB0byB0aGUgbGlzdCBsYXRlciBvbi4gICovCi0JICBpZiAoKnB1bmRlZiAhPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCkKLQkgICAgKnB1bmRlZiA9ICgqcHVuZGVmKS0+bmV4dDsKLQkgIGVsc2UKLQkgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTmF0aXZlIEVDT0ZGIGxpbmtlcnMgZG8gbm90IHB1bGwgaW4gYXJjaGl2ZSBlbGVtZW50cyBtZXJlbHkKLQkgdG8gc2F0aXNmeSBjb21tb24gZGVmaW5pdGlvbnMsIHNvIG5laXRoZXIgZG8gd2UuICBXZSBsZWF2ZQotCSB0aGVtIG9uIHRoZSBsaXN0LCB0aG91Z2gsIGluIGNhc2Ugd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBzb21lCi0JIG90aGVyIG9iamVjdCBmb3JtYXQuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0gICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoaC0+cm9vdC5zdHJpbmcsICZyZWhhc2gsIGFybWFwX2NvdW50LAotCQkJICAgICAgIGFybWFwX2xvZyk7Ci0KLSAgICAgIGZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoaGFzaCAqIDgpICsgNCk7Ci0gICAgICBpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQl7Ci0JICAvKiBOb3RoaW5nIGluIHRoaXMgc2xvdC4gICovCi0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKGhhc2ggKiA4KSk7Ci0gICAgICBpZiAobmFtZVswXSAhPSBoLT5yb290LnN0cmluZ1swXQotCSAgfHwgc3RyY21wIChuYW1lLCBoLT5yb290LnN0cmluZykgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgc3JjaDsKLQkgIGJvb2xlYW4gZm91bmQ7Ci0KLQkgIC8qIFRoYXQgd2FzIHRoZSB3cm9uZyBzeW1ib2wuICBUcnkgcmVoYXNoaW5nLiAgKi8KLQkgIGZvdW5kID0gZmFsc2U7Ci0JICBmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoYXJtYXBfY291bnQgLSAxKTsKLQkgICAgICAgc3JjaCAhPSBoYXNoOwotCSAgICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGFybWFwX2NvdW50IC0gMSkpCi0JICAgIHsKLQkgICAgICBmaWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpOwotCSAgICAgIGlmIChmaWxlX29mZnNldCA9PSAwKQotCQlicmVhazsKLQkgICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSk7Ci0JICAgICAgaWYgKG5hbWVbMF0gPT0gaC0+cm9vdC5zdHJpbmdbMF0KLQkJICAmJiBzdHJjbXAgKG5hbWUsIGgtPnJvb3Quc3RyaW5nKSA9PSAwKQotCQl7Ci0JCSAgZm91bmQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZm91bmQpCi0JICAgIHsKLQkgICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGhhc2ggPSBzcmNoOwotCX0KLQotICAgICAgZWxlbWVudCA9ICgqYmFja2VuZC0+Z2V0X2VsdF9hdF9maWxlcG9zKSAoYWJmZCwgZmlsZV9vZmZzZXQpOwotICAgICAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBVbmxpa2UgdGhlIGdlbmVyaWMgbGlua2VyLCB3ZSBrbm93IHRoYXQgdGhpcyBlbGVtZW50IHByb3ZpZGVzCi0JIGEgZGVmaW5pdGlvbiBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCBhbmQgd2Uga25vdyB0aGF0IHdlIHdhbnQKLQkgdG8gaW5jbHVkZSBpdC4gIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYW55dGhpbmcuICAqLwotICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBlbGVtZW50LCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoZWxlbWVudCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgaWYgd2UgdXNlZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gICBiZWNhdXNlIHdlIHdlcmUgbm90IGRlYWxpbmcgd2l0aCBhbiBFQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgSERSUiAqc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOwotICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKLSAgc2l6ZV90IGVzaXplOwotICBjaGFyICpzc2V4dCA9IE5VTEw7Ci0gIGNoYXIgKmV4dF9wdHI7Ci0gIGNoYXIgKmV4dF9lbmQ7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICBpZiAoISBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICBzeW1oZHIgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIGV4dGVybmFsIHN0cmluZ3MuICAqLwotICBleHRlcm5hbF9leHRfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGVzaXplID0gc3ltaGRyLT5pZXh0TWF4ICogZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGV4dGVybmFsX2V4dCA9IChQVFIpIGJmZF9tYWxsb2MgKGVzaXplKTsKLSAgaWYgKGV4dGVybmFsX2V4dCA9PSBOVUxMICYmIGVzaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGV4dGVybmFsX2V4dCwgMSwgZXNpemUsIGFiZmQpICE9IGVzaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHNzZXh0ID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3ltaGRyLT5pc3NFeHRNYXgpOwotICBpZiAoc3NleHQgPT0gTlVMTCAmJiBzeW1oZHItPmlzc0V4dE1heCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltaGRyLT5jYlNzRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChzc2V4dCwgMSwgc3ltaGRyLT5pc3NFeHRNYXgsIGFiZmQpICE9Ci0JICAoYmZkX3NpemVfdHlwZSkgc3ltaGRyLT5pc3NFeHRNYXgpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scyB0byBzZWUgaWYgdGhleSBkZWZpbmUgc29tZQotICAgICBzeW1ib2wgdGhhdCBpcyBjdXJyZW50bHkgdW5kZWZpbmVkLiAgKi8KLSAgZXh0X3B0ciA9IChjaGFyICopIGV4dGVybmFsX2V4dDsKLSAgZXh0X2VuZCA9IGV4dF9wdHIgKyBlc2l6ZTsKLSAgZm9yICg7IGV4dF9wdHIgPCBleHRfZW5kOyBleHRfcHRyICs9IGV4dGVybmFsX2V4dF9zaXplKQotICAgIHsKLSAgICAgIEVYVFIgZXN5bTsKLSAgICAgIGJvb2xlYW4gZGVmOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXh0X3B0ciwgJmVzeW0pOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBzeW1ib2wgZGVmaW5lcyBzb21ldGhpbmcuICAqLwotICAgICAgaWYgKGVzeW0uYXN5bS5zdCAhPSBzdEdsb2JhbAotCSAgJiYgZXN5bS5hc3ltLnN0ICE9IHN0TGFiZWwKLQkgICYmIGVzeW0uYXN5bS5zdCAhPSBzdFByb2MpCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoZXN5bS5hc3ltLnNjKQotCXsKLQljYXNlIHNjVGV4dDoKLQljYXNlIHNjRGF0YToKLQljYXNlIHNjQnNzOgotCWNhc2Ugc2NBYnM6Ci0JY2FzZSBzY1NEYXRhOgotCWNhc2Ugc2NTQnNzOgotCWNhc2Ugc2NSRGF0YToKLQljYXNlIHNjQ29tbW9uOgotCWNhc2Ugc2NTQ29tbW9uOgotCWNhc2Ugc2NJbml0OgotCWNhc2Ugc2NGaW5pOgotCWNhc2Ugc2NSQ29uc3Q6Ci0JICBkZWYgPSB0cnVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGRlZiA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoISBkZWYpCi0JY29udGludWU7Ci0KLSAgICAgIG5hbWUgPSBzc2V4dCArIGVzeW0uYXN5bS5pc3M7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIFVubGlrZSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHdlIGRvIG5vdCBwdWxsIGluIGVsZW1lbnRzIGJlY2F1c2UKLQkgb2YgY29tbW9uIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEluY2x1ZGUgdGhpcyBlbGVtZW50LiAgKi8KLSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAqcG5lZWRlZCA9IHRydWU7Ci0gICAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotICAgIH0KLQotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAoZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfZXh0KTsKLSAgaWYgKHNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoc3NleHQpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFQ09GRiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOwotICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKLSAgc2l6ZV90IGVzaXplOwotICBjaGFyICpzc2V4dCA9IE5VTEw7Ci0gIGJvb2xlYW4gcmVzdWx0OwotCi0gIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltaGRyID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlcjsKLQotICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBleHRlcm5hbCBzdHJpbmdzLiAgKi8KLSAgZXh0ZXJuYWxfZXh0X3NpemUgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKLSAgZXNpemUgPSBzeW1oZHItPmlleHRNYXggKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZXh0ZXJuYWxfZXh0ID0gKFBUUikgYmZkX21hbGxvYyAoZXNpemUpOwotICBpZiAoZXh0ZXJuYWxfZXh0ID09IE5VTEwgJiYgZXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfZXh0LCAxLCBlc2l6ZSwgYWJmZCkgIT0gZXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3NleHQgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzeW1oZHItPmlzc0V4dE1heCk7Ci0gIGlmIChzc2V4dCA9PSBOVUxMICYmIHN5bWhkci0+aXNzRXh0TWF4ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiU3NFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKHNzZXh0LCAxLCBzeW1oZHItPmlzc0V4dE1heCwgYWJmZCkKLQkgICE9IChiZmRfc2l6ZV90eXBlKSBzeW1oZHItPmlzc0V4dE1heCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcmVzdWx0ID0gZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KTsKLQotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICByZXR1cm4gcmVzdWx0OwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBvZiBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlcgotICAgaGFzaCB0YWJsZS4gIFRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBzdHJpbmdzIHdlIGFyZSBwYXNzZWQgYXJlCi0gICBqdXN0IGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGFuZCB3aWxsIGJlIGRpc2NhcmRlZC4gIFdlIG11c3QKLSAgIGV4cGxpY2l0bHkgc2F2ZSBhbnkgaW5mb3JtYXRpb24gd2UgbWF5IG5lZWQgbGF0ZXIgb24gaW4gdGhlIGxpbmsuCi0gICBXZSBkbyBub3Qgd2FudCB0byByZWFkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gYWdhaW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBQVFIgZXh0ZXJuYWxfZXh0OwotICAgICBjaGFyICpzc2V4dDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSkKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9leHRfaW47Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICB1bnNpZ25lZCBsb25nIGV4dF9jb3VudDsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBjaGFyICpleHRfcHRyOwotICBjaGFyICpleHRfZW5kOwotCi0gIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSBleHRfY291bnQgKiBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0gIGlmICghc3ltX2hhc2gpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlcyA9IHN5bV9oYXNoOwotCi0gIGV4dF9wdHIgPSAoY2hhciAqKSBleHRlcm5hbF9leHQ7Ci0gIGV4dF9lbmQgPSBleHRfcHRyICsgZXh0X2NvdW50ICogZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGZvciAoOyBleHRfcHRyIDwgZXh0X2VuZDsgZXh0X3B0ciArPSBleHRlcm5hbF9leHRfc2l6ZSwgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBFWFRSIGVzeW07Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgKnN5bV9oYXNoID0gTlVMTDsKLQotICAgICAgKCpzd2FwX2V4dF9pbikgKGFiZmQsIChQVFIpIGV4dF9wdHIsICZlc3ltKTsKLQotICAgICAgLyogU2tpcCBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCi0gICAgICBza2lwID0gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKGVzeW0uYXN5bS5zdCkKLQl7Ci0JY2FzZSBzdEdsb2JhbDoKLQljYXNlIHN0U3RhdGljOgotCWNhc2Ugc3RMYWJlbDoKLQljYXNlIHN0UHJvYzoKLQljYXNlIHN0U3RhdGljUHJvYzoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBza2lwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHNraXApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIHZhbHVlID0gZXN5bS5hc3ltLnZhbHVlOwotICAgICAgc3dpdGNoIChlc3ltLmFzeW0uc2MpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBzY05pbDoKLQljYXNlIHNjUmVnaXN0ZXI6Ci0JY2FzZSBzY0NkYkxvY2FsOgotCWNhc2Ugc2NCaXRzOgotCWNhc2Ugc2NDZGJTeXN0ZW06Ci0JY2FzZSBzY1JlZ0ltYWdlOgotCWNhc2Ugc2NJbmZvOgotCWNhc2Ugc2NVc2VyU3RydWN0OgotCWNhc2Ugc2NWYXI6Ci0JY2FzZSBzY1ZhclJlZ2lzdGVyOgotCWNhc2Ugc2NWYXJpYW50OgotCWNhc2Ugc2NCYXNlZFZhcjoKLQljYXNlIHNjWERhdGE6Ci0JY2FzZSBzY1BEYXRhOgotCSAgc2VjdGlvbiA9IE5VTEw7Ci0JICBicmVhazsKLQljYXNlIHNjVGV4dDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGV4dCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0RhdGE6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRhdGEiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NCc3M6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmJzcyIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0FiczoKLQkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1VuZGVmaW5lZDoKLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NEYXRhOgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NCc3M6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNic3MiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NSRGF0YToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmRhdGEiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NDb21tb246Ci0JICBpZiAodmFsdWUgPiBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSkKLQkgICAgewotCSAgICAgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2Ugc2NTQ29tbW9uOgotCSAgaWYgKGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPSBTQ09NTU9OOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbF9wdHI7Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wubmFtZSA9IFNDT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2xfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgICB9Ci0JICBzZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgIGJyZWFrOwotCWNhc2Ugc2NTVW5kZWZpbmVkOgotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjSW5pdDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuaW5pdCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0Zpbmk6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmZpbmkiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NSQ29uc3Q6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnJjb25zdCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IHNzZXh0ICsgZXN5bS5hc3ltLmlzczsKLQotICAgICAgaCA9IE5VTEw7Ci0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLAotCSAgICAgIGVzeW0ud2Vha2V4dCA/IEJTRl9XRUFLIDogQlNGX0dMT0JBTCwKLQkgICAgICBzZWN0aW9uLCB2YWx1ZSwgKGNvbnN0IGNoYXIgKikgTlVMTCwgdHJ1ZSwgdHJ1ZSwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAqc3ltX2hhc2ggPSBoOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4gRUNPRkYgaGFzaCB0YWJsZSwgc2F2ZSB0aGUgZXh0ZXJuYWwKLQkgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkpCi0JewotCSAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMCi0JICAgICAgfHwgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKQotCQkgICYmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikKLQkJICAgICAgfHwgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpKSkKLQkgICAgewotCSAgICAgIGgtPmFiZmQgPSBhYmZkOwotCSAgICAgIGgtPmVzeW0gPSBlc3ltOwotCSAgICB9Ci0KLQkgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhpcyBzeW1ib2wgd2FzIHNtYWxsIHVuZGVmaW5lZC4gICovCi0JICBpZiAoZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQkgICAgaC0+c21hbGwgPSAxOwotCi0JICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgZXZlciBzbWFsbCB1bmRlZmluZWQsIGl0IG5lZWRzIHRvIHdpbmQKLQkgICAgIHVwIGluIGEgR1AgcmVsYXRpdmUgc2VjdGlvbi4gIFdlIGNhbid0IGNvbnRyb2wgdGhlCi0JICAgICBzZWN0aW9uIG9mIGEgZGVmaW5lZCBzeW1ib2wsIGJ1dCB3ZSBjYW4gY29udHJvbCB0aGUKLQkgICAgIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sLiAgVGhpcyBjYXNlIGlzIGFjdHVhbGx5IG5lZWRlZAotCSAgICAgb24gVWx0cml4IDQuMiB0byBoYW5kbGUgdGhlIHN5bWJvbCBjcmVkIGluIC1sY2tyYi4gICovCi0JICBpZiAoaC0+c21hbGwKLQkgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm5hbWUsIFNDT01NT04pICE9IDApCi0JICAgIHsKLQkgICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLAotCQkJCQkJCQkgU0NPTU1PTik7Ci0JICAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQ29tbW9uOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIGZpbmFsIGxpbmsgcm91dGluZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBQVFIgaGFuZGxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gZWNvZmZfbGlua193cml0ZV9leHRlcm5hbC4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotLyogRUNPRkYgZmluYWwgbGluayByb3V0aW5lLiAgVGhpcyBsb29rcyB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgQkZEcwotICAgYW5kIGdhdGhlcnMgdG9nZXRoZXIgYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGFuZCB0aGVuCi0gICBwcm9jZXNzZXMgYWxsIHRoZSBsaW5rIG9yZGVyIGluZm9ybWF0aW9uLiAgVGhpcyBtYXkgY2F1c2UgaXQgdG8KLSAgIGNsb3NlIGFuZCByZW9wZW4gc29tZSBpbnB1dCBCRkRzOyBJJ2xsIHNlZSBob3cgYmFkIHRoaXMgaXMuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOwotICBIRFJSICpzeW1oZHI7Ci0gIFBUUiBoYW5kbGU7Ci0gIHJlZ2lzdGVyIGJmZCAqaW5wdXRfYmZkOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzdHJ1Y3QgZXh0c3ltX2luZm8gZWluZm87Ci0KLSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGNvdW50cyBpbiB0aGUgc3ltYm9saWMKLSAgICAgaGVhZGVyLiAgKi8KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIHN5bWhkci0+dnN0YW1wID0gMDsKLSAgc3ltaGRyLT5pbGluZU1heCA9IDA7Ci0gIHN5bWhkci0+Y2JMaW5lID0gMDsKLSAgc3ltaGRyLT5pZG5NYXggPSAwOwotICBzeW1oZHItPmlwZE1heCA9IDA7Ci0gIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0gIHN5bWhkci0+aW9wdE1heCA9IDA7Ci0gIHN5bWhkci0+aWF1eE1heCA9IDA7Ci0gIHN5bWhkci0+aXNzTWF4ID0gMDsKLSAgc3ltaGRyLT5pc3NFeHRNYXggPSAwOwotICBzeW1oZHItPmlmZE1heCA9IDA7Ci0gIHN5bWhkci0+Y3JmZCA9IDA7Ci0gIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0KLSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGl0c2VsZiBpbiB0aGUgZGVidWdfaW5mbwotICAgICBzdHJ1Y3R1cmUuICAqLwotICBkZWJ1Zy0+bGluZSA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfcGRyID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLSAgZGVidWctPnNzID0gTlVMTDsKLSAgZGVidWctPnNzZXh0ID0gZGVidWctPnNzZXh0X2VuZCA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9mZHIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2V4dCA9IGRlYnVnLT5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKLQotICBoYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLCBpbmZvKTsKLSAgaWYgKGhhbmRsZSA9PSAoUFRSKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIGVhY2ggaW5wdXQgQkZELiAgKi8KLSAgZm9yIChpbnB1dF9iZmQgPSBpbmZvLT5pbnB1dF9iZmRzOwotICAgICAgIGlucHV0X2JmZCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYm9vbGVhbiByZXQ7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGlucHV0X2JmZCkgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotCXsKLQkgIC8qIEFiaXRyYXJpbHkgc2V0IHRoZSBzeW1ib2xpYyBoZWFkZXIgdnN0YW1wIHRvIHRoZSB2c3RhbXAKLQkgICAgIG9mIHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbiB0aGUgbGluay4gICovCi0JICBpZiAoc3ltaGRyLT52c3RhbXAgPT0gMCkKLQkgICAgc3ltaGRyLT52c3RhbXAKLQkgICAgICA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLnZzdGFtcDsKLQkgIHJldCA9IGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSAoYWJmZCwgaW5wdXRfYmZkLCBpbmZvLAotCQkJCQkJICAgaGFuZGxlKTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0ID0gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIgKGhhbmRsZSwgYWJmZCwKLQkJCQkJCWRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwKLQkJCQkJCWlucHV0X2JmZCwgaW5mbyk7Ci0gICAgICBpZiAoISByZXQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDb21iaW5lIHRoZSByZWdpc3RlciBtYXNrcy4gICovCi0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3BybWFzayB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncHJtYXNrOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmZwcm1hc2sgfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZnBybWFzazsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzBdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbMF07Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1sxXSB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5jcHJtYXNrWzFdOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbMl0gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1syXTsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzNdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbM107Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gIGVpbmZvLmFiZmQgPSBhYmZkOwotICBlaW5mby5pbmZvID0gaW5mbzsKLSAgZWNvZmZfbGlua19oYXNoX3RyYXZlcnNlIChlY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLAotCQkJICAgIChQVFIpICZlaW5mbyk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIG1ha2UgYSBwYXNzIG92ZXIgdGhlIGxpbmtfb3JkZXJzIHRvIGNvdW50IHVwIHRoZQotCSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgd2Ugd2lsbCBuZWVkIHRvIG91dHB1dCwgc28gdGhhdCB3ZSBrbm93Ci0JIGhvdyBtdWNoIHNwYWNlIHRoZXkgd2lsbCB0YWtlIHVwLiAgKi8KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgICAgby0+cmVsb2NfY291bnQgKz0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5yZWxvY19jb3VudDsKLQkgICAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIENvbXB1dGUgdGhlIHJlbG9jIGFuZCBzeW1ib2wgZmlsZSBwb3NpdGlvbnMuICAqLwotICBlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIChhYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAoaGFuZGxlLCBhYmZkLCBkZWJ1ZywKLQkJCQkJICAgJmJhY2tlbmQtPmRlYnVnX3N3YXAsIGluZm8sCi0JCQkJCSAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9lY29mZl9kZWJ1Z19mcmVlIChoYW5kbGUsIGFiZmQsIGRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwgaW5mbyk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBOb3cgcmVzZXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0Ci0JIEJGRCB0byAwLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55Ci0JIHJlbG9jcyB3ZSBoYXZlIG91dHB1dCB0aHVzIGZhci4gICovCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0Jby0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBHZXQgYSB2YWx1ZSBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9IChoLT51LmRlZi52YWx1ZQotCQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBiZmRfdm1hIGxvOwotCi0JICAvKiBNYWtlIHVwIGEgdmFsdWUuICAqLwotCSAgbG8gPSAoYmZkX3ZtYSkgLTE7Ci0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoby0+dm1hIDwgbG8KLQkJICAmJiAoc3RyY21wIChvLT5uYW1lLCBfU0JTUykgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9TREFUQSkgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9MSVQ0KSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX0xJVDgpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCBfTElUQSkgPT0gMCkpCi0JCWxvID0gby0+dm1hOwotCSAgICB9Ci0JICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSBsbyArIDB4ODAwMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSWYgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSByZWxvYwotCSAgICAgaW52b2x2aW5nIHRoZSBHUCB2YWx1ZSwgaXQgc2hvdWxkIG1ha2UgYSByZWxvY19kYW5nZXJvdXMKLQkgICAgIGNhbGxiYWNrIHRvIHdhcm4gdGhhdCBHUCBpcyBub3QgZGVmaW5lZC4gICovCi0JfQotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgIHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZWNvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltaGRyLT5pZXh0TWF4ICsgc3ltaGRyLT5pc3ltTWF4OwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5saW5rZXIgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGFuIGlucHV0IEJGRCBpbnRvIHRoZQotICAgb3V0cHV0IEJGRC4gIFRoaXMgbXVzdCByZWFkIGluIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBvZiB0aGUKLSAgIGlucHV0IEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywgaGFuZGxlKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgUFRSIGhhbmRsZTsKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1ZyA9ICZlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotICAgICZlY29mZl9iYWNrZW5kIChpbnB1dF9iZmQpLT5kZWJ1Z19zd2FwOwotICBIRFJSICpzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYm9vbGVhbiByZXQ7Ci0KLSNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCi0gICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAotICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCi0JewkJCQkJCQkJXAotICAgICAgICAgIHJldCA9IGZhbHNlOwkJCQkJCQlcCi0gICAgICAgICAgZ290byByZXR1cm5fc29tZXRoaW5nOwkJCQkJXAotCX0JCQkJCQkJCVwKLSAgICAgIGlmICgoYmZkX3NlZWsgKGlucHV0X2JmZCwgKGZpbGVfcHRyKSBzeW1oZHItPm9mZnNldCwgU0VFS19TRVQpCVwKLQkgICAhPSAwKQkJCQkJCQlcCi0JICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCi0JCQlpbnB1dF9iZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCVwKLQl7CQkJCQkJCQlcCi0gICAgICAgICAgcmV0ID0gZmFsc2U7CQkJCQkJCVwKLSAgICAgICAgICBnb3RvIHJldHVybl9zb21ldGhpbmc7CQkJCQlcCi0JfQkJCQkJCQkJXAotICAgIH0KLQotICAvKiBJZiByYXdfc3ltZW50cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgZGF0YSB3YXMgYWxyZWFkeSBieSByZWFkIGJ5Ci0gICAgIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mby4gICovCi0gIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgIFJFQUQgKGxpbmUsIGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLAotCSAgICB1bnNpZ25lZCBjaGFyICopOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgICAgIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JICAgIHVuaW9uIGF1eF9leHQgKik7Ci0gICAgICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIFBUUik7Ci0gICAgfQotI3VuZGVmIFJFQUQKLQotICAvKiBXZSBkbyBub3QgcmVhZCB0aGUgZXh0ZXJuYWwgc3RyaW5ncyBvciB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0KLSAgcmV0ID0gKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0JIChoYW5kbGUsIG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKLQkgICZlY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+ZGVidWdfc3dhcCwKLQkgIGlucHV0X2JmZCwgZGVidWcsIHN3YXAsIGluZm8pKTsKLQotIHJldHVybl9zb21ldGhpbmc6Ci0gIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+bGluZSAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5saW5lKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9zeW0gIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOwotICAgICAgaWYgKGRlYnVnLT5zcyAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5zcyk7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2ZkciAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9mZHIpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGFjY2lkZW50YWxseSBmb2xsb3cgb25lIG9mIHRoZXNlIHBvaW50ZXJzCi0JIGludG8gZnJlZWQgbWVtb3J5LiAgKi8KLSAgICAgIGRlYnVnLT5saW5lID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX3BkciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfc3ltID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2F1eCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+c3MgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUHV0IG91dCBpbmZvcm1hdGlvbiBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgVGhlc2UgY29tZSBvbmx5IGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOwotICBiZmQgKm91dHB1dF9iZmQgPSBlaW5mby0+YWJmZDsKLSAgYm9vbGVhbiBzdHJpcDsKLQotICAvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIGJlaW5nIHN0cmlwcGVkLiAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0gICAgc3RyaXAgPSBmYWxzZTsKLSAgZWxzZSBpZiAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgIHx8IChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGVpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgaWYgKHN0cmlwIHx8IGgtPndyaXR0ZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGgtPmVzeW0uam1wdGJsID0gMDsKLSAgICAgIGgtPmVzeW0uY29ib2xfbWFpbiA9IDA7Ci0gICAgICBoLT5lc3ltLndlYWtleHQgPSAwOwotICAgICAgaC0+ZXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGlmZE5pbDsKLSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdEdsb2JhbDsKLQotICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICBlbHNlCi0JewotCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgb3V0cHV0X3NlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOwotCQotCSAgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVGV4dDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NEQVRBKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkRBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0JTUykgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfSU5JVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRklOSSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUERBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUERhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9YREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NYRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JDT05TVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSQ29uc3Q7Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCX0KLQotICAgICAgaC0+ZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+ZXN5bS5pZmQgIT0gLTEpCi0gICAgewotICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIEZEUiBpbmRleCBmb3IgdGhlIHN5bWJvbCBieSB0aGF0IHVzZWQgZm9yIHRoZQotCSBpbnB1dCBCRkQuICAqLwotICAgICAgZGVidWcgPSAmZWNvZmZfZGF0YSAoaC0+YWJmZCktPmRlYnVnX2luZm87Ci0gICAgICBCRkRfQVNTRVJUIChoLT5lc3ltLmlmZCA+PSAwCi0JCSAgJiYgaC0+ZXN5bS5pZmQgPCBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCk7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGRlYnVnLT5pZmRtYXBbaC0+ZXN5bS5pZmRdOwotICAgIH0KLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyAhPSBzY1VuZGVmaW5lZAotCSAgJiYgaC0+ZXN5bS5hc3ltLnNjICE9IHNjU1VuZGVmaW5lZCkKLQloLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCSAgfHwgaC0+ZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjICE9IHNjQ29tbW9uCi0JICAmJiBoLT5lc3ltLmFzeW0uc2MgIT0gc2NTQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQ29tbW9uOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgdXNlcyBpZXh0TWF4IHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIHN5bWJvbCBudW1iZXIuICAqLwotICBoLT5pbmR4ID0gZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXg7Ci0gIGgtPndyaXR0ZW4gPSAxOwotCi0gIHJldHVybiAoYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotCSAgKG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKLQkgICAmZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmRlYnVnX3N3YXAsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JICAgJmgtPmVzeW0pKTsKLX0KLQotLyogUmVsb2NhdGUgYW5kIHdyaXRlIGFuIEVDT0ZGIHNlY3Rpb24gaW50byBhbiBFQ09GRiBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9pbmRpcmVjdF9saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZDsKLSAgc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY3Rpb25fdGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgY29va2VkX3NpemU7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY3Nfc2l6ZTsKLSAgUFRSIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0KLSAgQkZEX0FTU0VSVCAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOwotCi0gIGlmIChsaW5rX29yZGVyLT5zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0KLSAgcmF3X3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGNvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotICBpZiAoY29va2VkX3NpemUgPT0gMCkKLSAgICBjb29rZWRfc2l6ZSA9IHJhd19zaXplOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9PSBsaW5rX29yZGVyLT5vZmZzZXQpOwotICBCRkRfQVNTRVJUIChjb29rZWRfc2l6ZSA9PSBsaW5rX29yZGVyLT5zaXplKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICBXZSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBsYXJnZXIgb2YKLSAgICAgdGhlIHNpemUgYmVmb3JlIHJlbG9jYXRpbmcgYW5kIHRoZSBzaXplIGFmdGVyIHJlbG9jYXRpbmcuICAqLwotICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChyYXdfc2l6ZSA+PSBjb29rZWRfc2l6ZQotCQkJCSAgICAgID8gKHNpemVfdCkgcmF3X3NpemUKLQkJCQkgICAgICA6IChzaXplX3QpIGNvb2tlZF9zaXplKTsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwgJiYgcmF3X3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJZiB3ZSBhcmUgcmVsYXhpbmcsIHRoZSBjb250ZW50cyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvCi0gICAgIG1lbW9yeSwgaW4gd2hpY2ggY2FzZSB3ZSBjb3B5IHRoZW0gaW50byBvdXIgbmV3IGJ1ZmZlci4gIFdlIGRvbid0Ci0gICAgIHNpbXBseSByZXVzZSB0aGUgb2xkIGJ1ZmZlciBpbiBjYXNlIGNvb2tlZF9zaXplID4gcmF3X3NpemUuICAqLwotICBpZiAoc2VjdGlvbl90ZGF0YSAhPSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAotICAgICAgJiYgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgbWVtY3B5IChjb250ZW50cywgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMsIChzaXplX3QpIHJhd19zaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIChQVFIpIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgcmF3X3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHJlbG9jcy4gIElmIHdlIGFyZSByZWxheGluZyBNSVBTIGNvZGUsIHRoZXkgd2lsbCBhbHJlYWR5Ci0gICAgIGhhdmUgYmVlbiByZWFkIGluLiAgT3RoZXJ3aXNlLCB3ZSByZWFkIHRoZW0gaW4gbm93LiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGV4dGVybmFsX3JlbG9jc19zaXplID0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIGlmIChzZWN0aW9uX3RkYXRhICE9IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMCi0gICAgICAmJiBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBleHRlcm5hbF9yZWxvY3MgPSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSk7Ci0gICAgICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgZXh0ZXJuYWxfcmVsb2NzX3NpemUgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGV4dGVybmFsX3JlbG9jc19zaXplLCBpbnB1dF9iZmQpCi0JICAgICAgIT0gZXh0ZXJuYWxfcmVsb2NzX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghICgoKmVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPnJlbG9jYXRlX3NlY3Rpb24pCi0JIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCSAgZXh0ZXJuYWxfcmVsb2NzKSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0ZWQgc2VjdGlvbi4gICovCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwKLQkJCQkgIG91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgY29udGVudHMsCi0JCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgY29va2VkX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIHJlbG9jcyB3ZXJlCi0gICAgIG1vZGlmaWVkLCBhbmQgd2Ugd3JpdGUgdGhlbSBvdXQgbm93LiAgV2UgdXNlIHRoZSByZWxvY19jb3VudAotICAgICBmaWVsZCBvZiBvdXRwdXRfc2VjdGlvbiB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHdlCi0gICAgIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgICAgKG91dHB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcyArCi0JCSAgICAgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF93cml0ZSAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgb3V0cHV0X2JmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKz0gaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMICYmIHNlY3Rpb25fdGRhdGEgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwgJiYgc2VjdGlvbl90ZGF0YSA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyB3aGVuIGxpbmtpbmcgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSByZWxvYwotICAgcmVxdWVzdGVkIGJ5IHRoZSBsaW5rZXIsIGFuZCBkb2VzIGNvbWUgZnJvbSBhbnkgaW5wdXQgZmlsZS4gIFRoaXMKLSAgIGlzIHVzZWQgdG8gYnVpbGQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzIHdoZW4gbGlua2luZwotICAgd2l0aCAtVXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUgdHlwZTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGJmZF92bWEgYWRkZW5kOwotICBhcmVsZW50IHJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jIGluOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGJmZF9ieXRlICpyYnVmOwotICBib29sZWFuIG9rOwotCi0gIHR5cGUgPSBsaW5rX29yZGVyLT50eXBlOwotICBzZWN0aW9uID0gTlVMTDsKLSAgYWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7Ci0KLSAgLyogV2Ugc2V0IHVwIGFuIGFyZWxlbnQgdG8gcGFzcyB0byB0aGUgYmFja2VuZCBhZGp1c3RfcmVsb2Nfb3V0Ci0gICAgIHJvdXRpbmUuICAqLwotICByZWwuYWRkcmVzcyA9IGxpbmtfb3JkZXItPm9mZnNldDsKLQotICByZWwuaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAocmVsLmhvd3RvID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICh0eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uOwotICAgICAgcmVsLnN5bV9wdHJfcHRyID0gc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sIGFzIHRob3VnaCBpdCB3ZXJlCi0gICAgICAgICBhY3R1YWxseSBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgdHlwZSA9IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI7Ci0JICBzZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JICAvKiBJdCBzZWVtcyB0aGF0IHdlIG91Z2h0IHRvIGFkZCB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotICAgICAgICAgICAgIGFkZGVuZCBoZXJlLCBidXQgaW4gcHJhY3RpY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgICAgICAgIGJlY2F1c2UgaXQgd2FzIHBhc3NlZCB0byBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4gICovCi0JICBhZGRlbmQgKz0gc2VjdGlvbi0+dm1hICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3Qgc2V0IHVwIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBjb3JyZWN0bHksCi0JICAgICBiZWNhdXNlIHdlIGhhdmUgbm8gYXN5bWJvbCBzdHJ1Y3R1cmUuICBDdXJyZW50bHkgbm8KLQkgICAgIGFkanVzdF9yZWxvY19vdXQgcm91dGluZSBjYXJlcy4gICovCi0JICByZWwuc3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIEFsbCBFQ09GRiByZWxvY3MgYXJlIGluLXBsYWNlLiAgUHV0IHRoZSBhZGRlbmQgaW50byB0aGUgb2JqZWN0Ci0gICAgIGZpbGUuICAqLwotCi0gIEJGRF9BU1NFUlQgKHJlbC5ob3d0by0+cGFydGlhbF9pbnBsYWNlKTsKLSAgaWYgKGFkZGVuZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWwuaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChyZWwuaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlY3Rpb24pCi0JCSAgIDogbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUpLAotCQkgIHJlbC5ob3d0by0+bmFtZSwgYWRkZW5kLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZWwuYWRkZW5kID0gMDsKLQotICAvKiBNb3ZlIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGEgaW50ZXJuYWxfcmVsb2Mgc3RydWN0dXJlLiAgKi8KLSAgaW4ucl92YWRkciA9IChyZWwuYWRkcmVzcwotCQkrIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKSk7Ci0gIGluLnJfdHlwZSA9IHJlbC5ob3d0by0+dHlwZTsKLQotICBpZiAodHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9ICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+aW5keCAhPSAtMSkKLQlpbi5yX3N5bW5keCA9IGgtPmluZHg7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGluLnJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICBpbi5yX2V4dGVybiA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQ09OU1QgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBzZWN0aW9uKTsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi54ZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqQUJTKiIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yY29uc3QiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgICBpbi5yX2V4dGVybiA9IDA7Ci0gICAgfQotCi0gIC8qIExldCB0aGUgQkZEIGJhY2tlbmQgYWRqdXN0IHRoZSByZWxvYy4gICovCi0gICgqZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmFkanVzdF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmcmVsLCAmaW4pOwotCi0gIC8qIEdldCBzb21lIG1lbW9yeSBhbmQgc3dhcCBvdXQgdGhlIHJlbG9jLiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5leHRlcm5hbF9yZWxvY19zaXplOwotICByYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGV4dGVybmFsX3JlbG9jX3NpemUpOwotICBpZiAocmJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKCplY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+c3dhcF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmaW4sIChQVFIpIHJidWYpOwotCi0gIG9rID0gKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgIChvdXRwdXRfc2VjdGlvbi0+cmVsX2ZpbGVwb3MgKwotCQkgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKSwKLQkJICBTRUVLX1NFVCkgPT0gMAotCSYmIChiZmRfd3JpdGUgKChQVFIpIHJidWYsIDEsIGV4dGVybmFsX3JlbG9jX3NpemUsIG91dHB1dF9iZmQpCi0JICAgID09IGV4dGVybmFsX3JlbG9jX3NpemUpKTsKLQotICBpZiAob2spCi0gICAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZnJlZSAocmJ1Zik7Ci0KLSAgcmV0dXJuIG9rOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2ZmbGluay5jIGIvYmZkL2Vjb2ZmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWZjOTY2Li4wMDAwMDAwCi0tLSBhL2JmZC9lY29mZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OTkgKzAsMCBAQAotLyogUm91dGluZXMgdG8gbGluayBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAib2JqYWxsb2MuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLQwKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2FkZF9ieXRlcyBQQVJBTVMgKChjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCQkJCQlzaXplX3QgbmVlZCkpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RyaW5nX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9hbGlnbl9kZWJ1ZyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJICAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3dyaXRlX3N5bWhkciBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiwKLQkJCQkJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiwKLQkJCQkJICAgZmlsZV9wdHIgd2hlcmUpKTsKLXN0YXRpYyBpbnQgY21wX2ZkcnRhYl9lbnRyeSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGJvb2xlYW4gbWtfZmRydGFiIFBBUkFNUyAoKGJmZCAqLAotCQkJCSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsCi0JCQkJICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICopKTsKLXN0YXRpYyBsb25nIGZkcnRhYl9sb29rdXAgUEFSQU1TICgoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBsb29rdXBfbGluZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LCBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICopKTsKLQwKLS8qIFJvdXRpbmVzIHRvIHN3YXAgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGluIGFuZCBvdXQuICBJIGFtIGFzc3VtaW5nCi0gICB0aGF0IHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gZm9ybWF0IGlzIGFsd2F5cyBnb2luZyB0byBiZSB0YXJnZXQKLSAgIGluZGVwZW5kZW50LiAgKi8KLQotLyogU3dhcCBpbiBhIHR5cGUgaW5mb3JtYXRpb24gcmVjb3JkLgotICAgQklHRU5EIHNheXMgd2hldGhlciBBVVggc3ltYm9scyBhcmUgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuOyB0aGlzCi0gICBpbmZvIGNvbWVzIGZyb20gdGhlIGZpbGUgaGVhZGVyIHJlY29yZCAoZmgtZkJpZ2VuZGlhbikuICAqLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfdGlyX2luIChiaWdlbmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGludCBiaWdlbmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCB0aXJfZXh0ICpleHRfY29weTsKLSAgICAgVElSICppbnRlcm47Ci17Ci0gIHN0cnVjdCB0aXJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKmV4dF9jb3B5OwkJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiaWdlbmQpIHsKLSAgICBpbnRlcm4tPmZCaXRmaWVsZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0ZCSVRGSUVMRF9CSUcpOwotICAgIGludGVybi0+Y29udGludWVkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQ09OVElOVUVEX0JJRyk7Ci0gICAgaW50ZXJuLT5idCAgICAgICAgICA9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQlRfQklHKQotCQkJPj4JCSAgICBUSVJfQklUUzFfQlRfU0hfQklHOwotICAgIGludGVybi0+dHE0ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTRfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTRfU0hfQklHOwotICAgIGludGVybi0+dHE1ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTVfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTVfU0hfQklHOwotICAgIGludGVybi0+dHEwICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTBfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTBfU0hfQklHOwotICAgIGludGVybi0+dHExICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTFfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTFfU0hfQklHOwotICAgIGludGVybi0+dHEyICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTJfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTJfU0hfQklHOwotICAgIGludGVybi0+dHEzICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTNfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTNfU0hfQklHOwotICB9IGVsc2UgewotICAgIGludGVybi0+ZkJpdGZpZWxkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfRkJJVEZJRUxEX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5jb250aW51ZWQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9DT05USU5VRURfTElUVExFKTsKLSAgICBpbnRlcm4tPmJ0ICAgICAgICAgID0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9CVF9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTMV9CVF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTQgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNF9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTUgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNV9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNV9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTAgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMF9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTEgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMV9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMV9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTIgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRMl9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMl9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTMgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRM19MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRM19TSF9MSVRUTEU7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSB0eXBlIGluZm9ybWF0aW9uIHJlY29yZC4KLSAgIEJJR0VORCBzYXlzIHdoZXRoZXIgQVVYIHN5bWJvbHMgYXJlIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbjsgdGhpcwotICAgaW5mbyBjb21lcyBmcm9tIHRoZSBmaWxlIGhlYWRlciByZWNvcmQgKGZoLWZCaWdlbmRpYW4pLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQgKGJpZ2VuZCwgaW50ZXJuX2NvcHksIGV4dCkKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3QgVElSICppbnRlcm5fY29weTsKLSAgICAgc3RydWN0IHRpcl9leHQgKmV4dDsKLXsKLSAgVElSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGV4dC0+dF9iaXRzMVswXSA9ICgoaW50ZXJuLT5mQml0ZmllbGQgPyBUSVJfQklUUzFfRkJJVEZJRUxEX0JJRyA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmNvbnRpbnVlZCA/IFRJUl9CSVRTMV9DT05USU5VRURfQklHIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmJ0IDw8IFRJUl9CSVRTMV9CVF9TSF9CSUcpCi0JCQkgICYgVElSX0JJVFMxX0JUX0JJRykpOwotICAgIGV4dC0+dF90cTQ1WzBdID0gKCgoaW50ZXJuLT50cTQgPDwgVElSX0JJVFNfVFE0X1NIX0JJRykKLQkJICAgICAgICYgVElSX0JJVFNfVFE0X0JJRykKLQkJICAgICAgfCAoKGludGVybi0+dHE1IDw8IFRJUl9CSVRTX1RRNV9TSF9CSUcpCi0JCQkgJiBUSVJfQklUU19UUTVfQklHKSk7Ci0gICAgZXh0LT50X3RxMDFbMF0gPSAoKChpbnRlcm4tPnRxMCA8PCBUSVJfQklUU19UUTBfU0hfQklHKQotCQkgICAgICAgJiBUSVJfQklUU19UUTBfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTEgPDwgVElSX0JJVFNfVFExX1NIX0JJRykKLQkJCSAmIFRJUl9CSVRTX1RRMV9CSUcpKTsKLSAgICBleHQtPnRfdHEyM1swXSA9ICgoKGludGVybi0+dHEyIDw8IFRJUl9CSVRTX1RRMl9TSF9CSUcpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMl9CSUcpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMyA8PCBUSVJfQklUU19UUTNfU0hfQklHKQotCQkJICYgVElSX0JJVFNfVFEzX0JJRykpOwotICB9IGVsc2UgewotICAgIGV4dC0+dF9iaXRzMVswXSA9ICgoaW50ZXJuLT5mQml0ZmllbGQgPyBUSVJfQklUUzFfRkJJVEZJRUxEX0xJVFRMRSA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmNvbnRpbnVlZCA/IFRJUl9CSVRTMV9DT05USU5VRURfTElUVExFIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmJ0IDw8IFRJUl9CSVRTMV9CVF9TSF9MSVRUTEUpCi0JCQkgICYgVElSX0JJVFMxX0JUX0xJVFRMRSkpOwotICAgIGV4dC0+dF90cTQ1WzBdID0gKCgoaW50ZXJuLT50cTQgPDwgVElSX0JJVFNfVFE0X1NIX0xJVFRMRSkKLQkJICAgICAgICYgVElSX0JJVFNfVFE0X0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+dHE1IDw8IFRJUl9CSVRTX1RRNV9TSF9MSVRUTEUpCi0JCQkgJiBUSVJfQklUU19UUTVfTElUVExFKSk7Ci0gICAgZXh0LT50X3RxMDFbMF0gPSAoKChpbnRlcm4tPnRxMCA8PCBUSVJfQklUU19UUTBfU0hfTElUVExFKQotCQkgICAgICAgJiBUSVJfQklUU19UUTBfTElUVExFKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTEgPDwgVElSX0JJVFNfVFExX1NIX0xJVFRMRSkKLQkJCSAmIFRJUl9CSVRTX1RRMV9MSVRUTEUpKTsKLSAgICBleHQtPnRfdHEyM1swXSA9ICgoKGludGVybi0+dHEyIDw8IFRJUl9CSVRTX1RRMl9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMl9MSVRUTEUpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMyA8PCBUSVJfQklUU19UUTNfU0hfTElUVExFKQotCQkJICYgVElSX0JJVFNfVFEzX0xJVFRMRSkpOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYSByZWxhdGl2ZSBzeW1ib2wgcmVjb3JkLiAgQklHRU5EIHNheXMgd2hldGhlciBpdCBpcyBpbgotICAgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGZvcm1hdC4qLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kLCBleHRfY29weSwgaW50ZXJuKQotICAgICBpbnQgYmlnZW5kOwotICAgICBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKmV4dF9jb3B5OwotICAgICBSTkRYUiAqaW50ZXJuOwotewotICBzdHJ1Y3Qgcm5keF9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqZXh0X2NvcHk7CQkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGludGVybi0+cmZkICAgPSAoZXh0LT5yX2JpdHNbMF0gPDwgUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9CSUcpCi0JCSAgfCAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9SRkRfQklHKQotCQkgICAgCQkgICAgPj4gUk5EWF9CSVRTMV9SRkRfU0hfQklHKTsKLSAgICBpbnRlcm4tPmluZGV4ID0gKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfSU5ERVhfQklHKQotCQkgICAgCQkgICAgPDwgUk5EWF9CSVRTMV9JTkRFWF9TSF9MRUZUX0JJRykKLQkJICB8IChleHQtPnJfYml0c1syXSA8PCBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHKQotCQkgIHwgKGV4dC0+cl9iaXRzWzNdIDw8IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcpOwotICB9IGVsc2UgewotICAgIGludGVybi0+cmZkICAgPSAoZXh0LT5yX2JpdHNbMF0gPDwgUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9MSVRUTEUpCi0JCSAgfCAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9SRkRfTElUVExFKQotCQkgICAgCQkgICAgPDwgUk5EWF9CSVRTMV9SRkRfU0hfTEVGVF9MSVRUTEUpOwotICAgIGludGVybi0+aW5kZXggPSAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9JTkRFWF9MSVRUTEUpCi0JCSAgICAJCSAgICA+PiBSTkRYX0JJVFMxX0lOREVYX1NIX0xJVFRMRSkKLQkJICB8IChleHQtPnJfYml0c1syXSA8PCBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfTElUVExFKQotCQkgIHwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+cl9iaXRzWzNdCi0JCSAgICAgPDwgUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRSk7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSByZWxhdGl2ZSBzeW1ib2wgcmVjb3JkLiAgQklHRU5EIHNheXMgd2hldGhlciBpdCBpcyBpbgotICAgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGZvcm1hdC4qLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQgKGJpZ2VuZCwgaW50ZXJuX2NvcHksIGV4dCkKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3QgUk5EWFIgKmludGVybl9jb3B5OwotICAgICBzdHJ1Y3Qgcm5keF9leHQgKmV4dDsKLXsKLSAgUk5EWFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmlnZW5kKSB7Ci0gICAgZXh0LT5yX2JpdHNbMF0gPSBpbnRlcm4tPnJmZCA+PiBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0JJRzsKLSAgICBleHQtPnJfYml0c1sxXSA9ICgoKGludGVybi0+cmZkIDw8IFJORFhfQklUUzFfUkZEX1NIX0JJRykKLQkJICAgICAgICYgUk5EWF9CSVRTMV9SRkRfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMxX0lOREVYX1NIX0xFRlRfQklHKQotCQkJICYgUk5EWF9CSVRTMV9JTkRFWF9CSUcpKTsKLSAgICBleHQtPnJfYml0c1syXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRzsKLSAgICBleHQtPnJfYml0c1szXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRzsKLSAgfSBlbHNlIHsKLSAgICBleHQtPnJfYml0c1swXSA9IGludGVybi0+cmZkID4+IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfTElUVExFOwotICAgIGV4dC0+cl9iaXRzWzFdID0gKCgoaW50ZXJuLT5yZmQgPj4gUk5EWF9CSVRTMV9SRkRfU0hfTEVGVF9MSVRUTEUpCi0JCSAgICAgICAmIFJORFhfQklUUzFfUkZEX0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+aW5kZXggPDwgUk5EWF9CSVRTMV9JTkRFWF9TSF9MSVRUTEUpCi0JCQkgJiBSTkRYX0JJVFMxX0lOREVYX0xJVFRMRSkpOwotICAgIGV4dC0+cl9iaXRzWzJdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfTElUVExFOwotICAgIGV4dC0+cl9iaXRzWzNdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0MCi0vKiBUaGUgbWluaW11bSBhbW91bnQgb2YgZGF0YSB0byBhbGxvY2F0ZS4gICovCi0jZGVmaW5lIEFMTE9DX1NJWkUgKDQwNjQpCi0KLS8qIEFkZCBieXRlcyB0byBhIGJ1ZmZlci4gIFJldHVybiBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIG5lZWQpCi0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHNpemVfdCBuZWVkOwotewotICBzaXplX3QgaGF2ZTsKLSAgc2l6ZV90IHdhbnQ7Ci0gIGNoYXIgKm5ld2J1ZjsKLQotICBoYXZlID0gKmJ1ZmVuZCAtICpidWY7Ci0gIGlmIChoYXZlID4gbmVlZCkKLSAgICB3YW50ID0gQUxMT0NfU0laRTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHdhbnQgPSBuZWVkIC0gaGF2ZTsKLSAgICAgIGlmICh3YW50IDwgQUxMT0NfU0laRSkKLQl3YW50ID0gQUxMT0NfU0laRTsKLSAgICB9Ci0gIG5ld2J1ZiA9IChjaGFyICopIGJmZF9yZWFsbG9jICgqYnVmLCBoYXZlICsgd2FudCk7Ci0gIGlmIChuZXdidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpidWYgPSBuZXdidWY7Ci0gICpidWZlbmQgPSAqYnVmICsgaGF2ZSArIHdhbnQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBrZWVwIGEgaGFzaCB0YWJsZSB3aGljaCBtYXBzIHN0cmluZ3MgdG8gbnVtYmVycy4gIFdlIHVzZSBpdCB0bwotICAgbWFwIEZEUiBuYW1lcyB0byBpbmRpY2VzIGluIHRoZSBvdXRwdXQgZmlsZSwgYW5kIHRvIG1hcCBsb2NhbAotICAgc3RyaW5ncyB3aGVuIGNvbWJpbmluZyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEZEUiBpbmRleCBvciBzdHJpbmcgdGFibGUgb2Zmc2V0LiAgKi8KLSAgbG9uZyB2YWw7Ci0gIC8qIE5leHQgZW50cnkgaW4gc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpuZXh0OwotfTsKLQotc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLX07Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGEgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0cmluZ19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT52YWwgPSAtMTsKLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3RyaW5nX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogV2UgY2FuJ3QgYWZmb3JkIHRvIHJlYWQgaW4gYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hlbiB3ZSBkbwotICAgYSBsaW5rLiAgSW5zdGVhZCwgd2UgYnVpbGQgYSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgdG8gc2hvdyBob3cKLSAgIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgaW5wdXQgZmlsZSBtYXAgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RydWN0IHNodWZmbGUKLXsKLSAgLyogVGhlIG5leHQgZW50cnkgaW4gdGhpcyBsaW5rZWQgbGlzdC4gICovCi0gIHN0cnVjdCBzaHVmZmxlICpuZXh0OwotICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgLyogV2hldGhlciB0aGlzIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gYSBmaWxlIG9yIG5vdC4gICovCi0gIGJvb2xlYW4gZmlsZXA7Ci0gIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0JewotCSAgLyogVGhlIEJGRCB0aGUgZGF0YSBjb21lcyBmcm9tLiAgKi8KLQkgIGJmZCAqaW5wdXRfYmZkOwotCSAgLyogVGhlIG9mZnNldCB3aXRoaW4gaW5wdXRfYmZkLiAgKi8KLQkgIGZpbGVfcHRyIG9mZnNldDsKLQl9IGZpbGU7Ci0gICAgICAvKiBUaGUgZGF0YSB0byBiZSB3cml0dGVuIG91dC4gICovCi0gICAgICBQVFIgbWVtb3J5OwotICAgIH0gdTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFjcm9zcyBjYWxscyB0bwotICAgYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUuICAqLwotCi1zdHJ1Y3QgYWNjdW11bGF0ZQotewotICAvKiBUaGUgRkRSIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgZmRyX2hhc2g7Ci0gIC8qIFRoZSBzdHJpbmdzIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgc3RyX2hhc2g7Ci0gIC8qIExpbmtlZCBsaXN0cyBkZXNjcmliaW5nIGhvdyB0byBzaHVmZmxlIHRoZSBpbnB1dCBkZWJ1ZwotICAgICBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGtlZXAgYSBwb2ludGVyIHRvIGJvdGggdGhlCi0gICAgIGhlYWQgYW5kIHRoZSB0YWlsLiAgKi8KLSAgc3RydWN0IHNodWZmbGUgKmxpbmU7Ci0gIHN0cnVjdCBzaHVmZmxlICpsaW5lX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnBkcjsKLSAgc3RydWN0IHNodWZmbGUgKnBkcl9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpzeW07Ci0gIHN0cnVjdCBzaHVmZmxlICpzeW1fZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqb3B0OwotICBzdHJ1Y3Qgc2h1ZmZsZSAqb3B0X2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKmF1eDsKLSAgc3RydWN0IHNodWZmbGUgKmF1eF9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpzczsKLSAgc3RydWN0IHNodWZmbGUgKnNzX2VuZDsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzc19oYXNoOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNzX2hhc2hfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqZmRyOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqZmRyX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnJmZDsKLSAgc3RydWN0IHNodWZmbGUgKnJmZF9lbmQ7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGZpbGUgc2h1ZmZsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGFyZ2VzdF9maWxlX3NodWZmbGU7Ci0gIC8qIEFuIG9iamFsbG9jIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3Qgb2JqYWxsb2MgKm1lbW9yeTsKLX07Ci0KLS8qIEFkZCBhIGZpbGUgZW50cnkgdG8gYSBzaHVmZmxlIGxpc3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBhZGRfZmlsZV9zaHVmZmxlIFBBUkFNUyAoKHN0cnVjdCBhY2N1bXVsYXRlICosCi0JCQkJICAgICAgc3RydWN0IHNodWZmbGUgKiosCi0JCQkJICAgICAgc3RydWN0IHNodWZmbGUgKiosIGJmZCAqLCBmaWxlX3B0ciwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1hZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgaGVhZCwgdGFpbCwgaW5wdXRfYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbzsKLSAgICAgc3RydWN0IHNodWZmbGUgKipoZWFkOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKnRhaWw7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLXsKLSAgc3RydWN0IHNodWZmbGUgKm47Ci0KLSAgaWYgKCp0YWlsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMCi0gICAgICAmJiAoKnRhaWwpLT5maWxlcAotICAgICAgJiYgKCp0YWlsKS0+dS5maWxlLmlucHV0X2JmZCA9PSBpbnB1dF9iZmQKLSAgICAgICYmICgqdGFpbCktPnUuZmlsZS5vZmZzZXQgKyAoKnRhaWwpLT5zaXplID09ICh1bnNpZ25lZCBsb25nKSBvZmZzZXQpCi0gICAgewotICAgICAgLyogSnVzdCBtZXJnZSB0aGlzIGVudHJ5IG9udG8gdGhlIGV4aXN0aW5nIG9uZS4gICovCi0gICAgICAoKnRhaWwpLT5zaXplICs9IHNpemU7Ci0gICAgICBpZiAoKCp0YWlsKS0+c2l6ZSA+IGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSkKLQlhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSAoKnRhaWwpLT5zaXplOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG4gPSAoc3RydWN0IHNodWZmbGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBzaHVmZmxlKSk7Ci0gIGlmICghbikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5zaXplID0gc2l6ZTsKLSAgbi0+ZmlsZXAgPSB0cnVlOwotICBuLT51LmZpbGUuaW5wdXRfYmZkID0gaW5wdXRfYmZkOwotICBuLT51LmZpbGUub2Zmc2V0ID0gb2Zmc2V0OwotICBpZiAoKmhlYWQgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKmhlYWQgPSBuOwotICBpZiAoKnRhaWwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKCp0YWlsKS0+bmV4dCA9IG47Ci0gICp0YWlsID0gbjsKLSAgaWYgKHNpemUgPiBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUpCi0gICAgYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlID0gc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIG1lbW9yeSBlbnRyeSB0byBhIHNodWZmbGUgbGlzdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGFkZF9tZW1vcnlfc2h1ZmZsZSBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAotCQkJCQkgICBzdHJ1Y3Qgc2h1ZmZsZSAqKmhlYWQsCi0JCQkJCSAgIHN0cnVjdCBzaHVmZmxlICoqdGFpbCwKLQkJCQkJICAgYmZkX2J5dGUgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkpOwotCi1zdGF0aWMgYm9vbGVhbgotYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgaGVhZCwgdGFpbCwgZGF0YSwgc2l6ZSkKLSAgICAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKmhlYWQ7Ci0gICAgIHN0cnVjdCBzaHVmZmxlICoqdGFpbDsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLXsKLSAgc3RydWN0IHNodWZmbGUgKm47Ci0gICAgIAotICBuID0gKHN0cnVjdCBzaHVmZmxlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LAotCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2h1ZmZsZSkpOwotICBpZiAoIW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBuLT5uZXh0ID0gTlVMTDsKLSAgbi0+c2l6ZSA9IHNpemU7Ci0gIG4tPmZpbGVwID0gZmFsc2U7Ci0gIG4tPnUubWVtb3J5ID0gKFBUUikgZGF0YTsKLSAgaWYgKCpoZWFkID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICpoZWFkID0gbjsKLSAgaWYgKCp0YWlsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICgqdGFpbCktPm5leHQgPSBuOwotICAqdGFpbCA9IG47Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBGRFIgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBhIGhhbmRsZSB3aGljaCBpcyB0aGVuCi0gICBwYXNzZWQgaW4gdG8gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUsIGV0LiBhbC4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1iZmRfZWNvZmZfZGVidWdfaW5pdCAob3V0cHV0X2JmZCwgb3V0cHV0X2RlYnVnLCBvdXRwdXRfc3dhcCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotCi0gIGFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGFjY3VtdWxhdGUpKTsKLSAgaWYgKCFhaW5mbykKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jLAotCQkJICAgICAgIDEwMjEpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFpbmZvLT5saW5lID0gTlVMTDsKLSAgYWluZm8tPmxpbmVfZW5kID0gTlVMTDsKLSAgYWluZm8tPnBkciA9IE5VTEw7Ci0gIGFpbmZvLT5wZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnN5bSA9IE5VTEw7Ci0gIGFpbmZvLT5zeW1fZW5kID0gTlVMTDsKLSAgYWluZm8tPm9wdCA9IE5VTEw7Ci0gIGFpbmZvLT5vcHRfZW5kID0gTlVMTDsKLSAgYWluZm8tPmF1eCA9IE5VTEw7Ci0gIGFpbmZvLT5hdXhfZW5kID0gTlVMTDsKLSAgYWluZm8tPnNzID0gTlVMTDsKLSAgYWluZm8tPnNzX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5zc19oYXNoID0gTlVMTDsKLSAgYWluZm8tPnNzX2hhc2hfZW5kID0gTlVMTDsKLSAgYWluZm8tPmZkciA9IE5VTEw7Ci0gIGFpbmZvLT5mZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnJmZCA9IE5VTEw7Ci0gIGFpbmZvLT5yZmRfZW5kID0gTlVMTDsKLQotICBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSAwOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmYWluZm8tPnN0cl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzdHJpbmcgdGFibGUgaXMgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gICAgICBvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NNYXggPSAxOwotICAgIH0KLQotICBhaW5mby0+bWVtb3J5ID0gb2JqYWxsb2NfY3JlYXRlICgpOwotICBpZiAoYWluZm8tPm1lbW9yeSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoUFRSKSBhaW5mbzsKLX0KLQotLyogRnJlZSB0aGUgYWNjdW11bGF0ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfZWNvZmZfZGVidWdfZnJlZSAoaGFuZGxlLCBvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsIG91dHB1dF9zd2FwLCBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIAotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlKTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFpbmZvLT5zdHJfaGFzaC50YWJsZSk7Ci0KLSAgb2JqYWxsb2NfZnJlZSAoYWluZm8tPm1lbW9yeSk7Ci0KLSAgZnJlZSAoYWluZm8pOwotfQotCi0vKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBJTlBVVF9CRkQgaW50bwotICAgT1VUUFVUX0JGRC4gIFRoZSBJTlBVVF9ERUJVRyBhcmd1bWVudCBwb2ludHMgdG8gc29tZSBFQ09GRgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIHdlIHdhbnQgdG8gbGluayBpbnRvIHRoZSBpbmZvcm1hdGlvbgotICAgcG9pbnRlZCB0byBieSB0aGUgT1VUUFVUX0RFQlVHIGFyZ3VtZW50LiAgT1VUUFVUX1NXQVAgYW5kCi0gICBJTlBVVF9TV0FQIHBvaW50IHRvIHRoZSBzd2FwcGluZyBpbmZvcm1hdGlvbiBuZWVkZWQuICBJTkZPIGlzIHRoZQotICAgbGlua2VyIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIEhBTkRMRSBpcyByZXR1cm5lZCBieQotICAgYmZkX2Vjb2ZmX2RlYnVnX2luaXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsCi0JCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9kZWJ1ZywgaW5wdXRfc3dhcCwKLQkJCSAgICBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKQotICAgID0gaW5wdXRfc3dhcC0+c3dhcF9zeW1faW47Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9yZmRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFJGRFQgKikpCi0gICAgPSBpbnB1dF9zd2FwLT5zd2FwX3JmZF9pbjsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpCi0gICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9zeW1fb3V0OwotICB2b2lkICgqIGNvbnN0IHN3YXBfZmRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKQotICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfZmRyX291dDsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3JmZF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSRkRUICosIFBUUikpCi0gICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9yZmRfb3V0OwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX29wdF9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX29wdF9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JmZF9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3JmZF9zaXplOwotICBIRFJSICogY29uc3Qgb3V0cHV0X3N5bWhkciA9ICZvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgSERSUiAqIGNvbnN0IGlucHV0X3N5bWhkciA9ICZpbnB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBiZmRfdm1hIHNlY3Rpb25fYWRqdXN0W3NjTWF4XTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX2J5dGUgKmZkcl9zdGFydDsKLSAgYmZkX2J5dGUgKmZkcl9wdHI7Ci0gIGJmZF9ieXRlICpmZHJfZW5kOwotICBiZmRfc2l6ZV90eXBlIGZkcl9hZGQ7Ci0gIHVuc2lnbmVkIGludCBjb3BpZWQ7Ci0gIFJGRFQgaTsKLSAgdW5zaWduZWQgbG9uZyBzejsKLSAgYmZkX2J5dGUgKnJmZF9vdXQ7Ci0gIGJmZF9ieXRlICpyZmRfaW47Ci0gIGJmZF9ieXRlICpyZmRfZW5kOwotICBsb25nIG5ld3JmZGJhc2UgPSAwOwotICBsb25nIG9sZHJmZGJhc2UgPSAwOwotICBiZmRfYnl0ZSAqZmRyX291dDsKLQotICAvKiBVc2Ugc2VjdGlvbl9hZGp1c3QgdG8gaG9sZCB0aGUgdmFsdWUgdG8gYWRkIHRvIGEgc3ltYm9sIGluIGEKLSAgICAgcGFydGljdWxhciBzZWN0aW9uLiAgKi8KLSAgbWVtc2V0ICgoUFRSKSBzZWN0aW9uX2FkanVzdCwgMCwgc2l6ZW9mIHNlY3Rpb25fYWRqdXN0KTsKLQotI2RlZmluZSBTRVQobmFtZSwgaW5keCkgXAotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKTsgXAotICBpZiAoc2VjICE9IE5VTEwpIFwKLSAgICBzZWN0aW9uX2FkanVzdFtpbmR4XSA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgXAotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0IFwKLQkJCSAgICAtIHNlYy0+dm1hKTsKLQotICBTRVQgKCIudGV4dCIsIHNjVGV4dCk7Ci0gIFNFVCAoIi5kYXRhIiwgc2NEYXRhKTsKLSAgU0VUICgiLmJzcyIsIHNjQnNzKTsKLSAgU0VUICgiLnNkYXRhIiwgc2NTRGF0YSk7Ci0gIFNFVCAoIi5zYnNzIiwgc2NTQnNzKTsKLSAgLyogc2NSZGF0YSBzZWN0aW9uIG1heSBiZSBlaXRoZXIgLnJkYXRhIG9yIC5yb2RhdGEuICAqLwotICBTRVQgKCIucmRhdGEiLCBzY1JEYXRhKTsKLSAgU0VUICgiLnJvZGF0YSIsIHNjUkRhdGEpOwotICBTRVQgKCIuaW5pdCIsIHNjSW5pdCk7Ci0gIFNFVCAoIi5maW5pIiwgc2NGaW5pKTsKLSAgU0VUICgiLnJjb25zdCIsIHNjUkNvbnN0KTsKLQotI3VuZGVmIFNFVAotCi0gIC8qIEZpbmQgYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIEZEUidzLiAgV2UgbmVlZAotICAgICB0byBoYW5kbGUgdGhlbSB3aGV0aGVyIHRoZXkgYXJlIHN3YXBwZWQgb3Igbm90LiAgKi8KLSAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZkcl9zdGFydCA9IChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZmRyOwotICAgICAgZmRyX2FkZCA9IHNpemVvZiAoRkRSKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmZHJfc3RhcnQgPSAoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX2ZkcjsKLSAgICAgIGZkcl9hZGQgPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZTsKLSAgICB9Ci0gIGZkcl9lbmQgPSBmZHJfc3RhcnQgKyBpbnB1dF9zeW1oZHItPmlmZE1heCAqIGZkcl9hZGQ7Ci0KLSAgaW5wdXRfZGVidWctPmlmZG1hcCA9IChSRkRUICopIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJCQkgICAgKGlucHV0X3N5bWhkci0+aWZkTWF4Ci0JCQkJCSAgICAgKiBzaXplb2YgKFJGRFQpKSk7Ci0KLSAgc3ogPSAoaW5wdXRfc3ltaGRyLT5jcmZkICsgaW5wdXRfc3ltaGRyLT5pZmRNYXgpICogZXh0ZXJuYWxfcmZkX3NpemU7Ci0gIHJmZF9vdXQgPSAoYmZkX2J5dGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksIHN6KTsKLSAgaWYgKCFpbnB1dF9kZWJ1Zy0+aWZkbWFwIHx8ICFyZmRfb3V0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnJmZCwgJmFpbmZvLT5yZmRfZW5kLCByZmRfb3V0LCBzeikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvcGllZCA9IDA7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBGRFIncyB0byBzZWUgd2hpY2ggb25lcyB3ZSBhcmUgZ29pbmcgdG8gaW5jbHVkZQotICAgICBpbiB0aGUgZmluYWwgb3V0cHV0LiAgV2UgZG8gbm90IHdhbnQgZHVwbGljYXRlIEZEUiBpbmZvcm1hdGlvbgotICAgICBmb3IgaGVhZGVyIGZpbGVzLCBiZWNhdXNlIEVDT0ZGIGRlYnVnZ2luZyBpcyBvZnRlbiB2ZXJ5IGxhcmdlLgotICAgICBXaGVuIHdlIGZpbmQgYW4gRkRSIHdpdGggbm8gbGluZSBpbmZvcm1hdGlvbiB3aGljaCBjYW4gYmUgbWVyZ2VkLAotICAgICB3ZSBsb29rIGl0IHVwIGluIGEgaGFzaCB0YWJsZSB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IGluY2x1ZGUgaXQKLSAgICAgb25jZS4gIFdlIGtlZXAgYSB0YWJsZSBtYXBwaW5nIEZEUiBudW1iZXJzIHRvIHRoZSBmaW5hbCBudW1iZXIKLSAgICAgdGhleSBnZXQgd2l0aCB0aGUgQkZELCBzbyB0aGF0IHdlIGNhbiByZWZlciB0byBpdCB3aGVuIHdlIHdyaXRlCi0gICAgIG91dCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gIGZvciAoZmRyX3B0ciA9IGZkcl9zdGFydCwgaSA9IDA7Ci0gICAgICAgZmRyX3B0ciA8IGZkcl9lbmQ7Ci0gICAgICAgZmRyX3B0ciArPSBmZHJfYWRkLCBpKyssIHJmZF9vdXQgKz0gZXh0ZXJuYWxfcmZkX3NpemUpCi0gICAgewotICAgICAgRkRSIGZkcjsKLQotICAgICAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQotCWZkciA9ICooRkRSICopIGZkcl9wdHI7Ci0gICAgICBlbHNlCi0JKCppbnB1dF9zd2FwLT5zd2FwX2Zkcl9pbikgKGlucHV0X2JmZCwgKFBUUikgZmRyX3B0ciwgJmZkcik7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIEZEUiBjYW4gYmUgbWVyZ2VkIHdpdGggYW4gZXhpc3Rpbmcgb25lLiAgKi8KLSAgICAgIGlmIChmZHIuY2JMaW5lID09IDAgJiYgZmRyLnJzcyAhPSAtMSAmJiBmZHIuZk1lcmdlKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyICpsb29rdXA7Ci0JICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmZoOwotCi0JICAvKiBXZSBsb29rIHVwIGEgc3RyaW5nIGZvcm1lZCBmcm9tIHRoZSBmaWxlIG5hbWUgYW5kIHRoZQotCSAgICAgbnVtYmVyIG9mIHN5bWJvbHMgYW5kIGF1eCBlbnRyaWVzLiAgU29tZXRpbWVzIGFuIGluY2x1ZGUKLQkgICAgIGZpbGUgd2lsbCBjb25kaXRpb25hbGx5IGRlZmluZSBhIHR5cGVkZWYgb3Igc29tZXRoaW5nCi0JICAgICBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgaW5jbHVkZSBmaWxlcy4gIFVzaW5nIHRoZSBudW1iZXIgb2YKLQkgICAgIHN5bWJvbHMgYW5kIGF1eCBlbnRyaWVzIGFzIGEgaGFzaCByZWR1Y2VzIHRoZSBjaGFuY2UgdGhhdAotCSAgICAgd2Ugd2lsbCBtZXJnZSBzeW1ib2wgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgbm90IGJlCi0JICAgICBtZXJnZWQuICAqLwotCSAgbmFtZSA9IGlucHV0X2RlYnVnLT5zcyArIGZkci5pc3NCYXNlICsgZmRyLnJzczsKLQotCSAgbG9va3VwID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDIwKTsKLQkgIGlmIChsb29rdXAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3ByaW50ZiAobG9va3VwLCAiJXMgJWx4ICVseCIsIG5hbWUsIGZkci5jc3ltLCBmZHIuY2F1eCk7Ci0KLQkgIGZoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmYWluZm8tPmZkcl9oYXNoLCBsb29rdXAsIHRydWUsIHRydWUpOwotCSAgZnJlZSAobG9va3VwKTsKLQkgIGlmIChmaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGZoLT52YWwgIT0gLTEpCi0JICAgIHsKLQkgICAgICBpbnB1dF9kZWJ1Zy0+aWZkbWFwW2ldID0gZmgtPnZhbDsKLQkgICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsIGlucHV0X2RlYnVnLT5pZmRtYXAgKyBpLAotCQkJICAgICAgIChQVFIpIHJmZF9vdXQpOwotCi0JICAgICAgLyogRG9uJ3QgY29weSB0aGlzIEZEUi4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgZmgtPnZhbCA9IG91dHB1dF9zeW1oZHItPmlmZE1heCArIGNvcGllZDsKLQl9Ci0KLSAgICAgIGlucHV0X2RlYnVnLT5pZmRtYXBbaV0gPSBvdXRwdXRfc3ltaGRyLT5pZmRNYXggKyBjb3BpZWQ7Ci0gICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsIGlucHV0X2RlYnVnLT5pZmRtYXAgKyBpLCAoUFRSKSByZmRfb3V0KTsKLSAgICAgICsrY29waWVkOwotICAgIH0KLQotICBuZXdyZmRiYXNlID0gb3V0cHV0X3N5bWhkci0+Y3JmZDsKLSAgb3V0cHV0X3N5bWhkci0+Y3JmZCArPSBpbnB1dF9zeW1oZHItPmlmZE1heDsKLQotICAvKiBDb3B5IG92ZXIgYW55IGV4aXN0aW5nIFJGRCdzLiAgUkZEJ3MgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUKLSAgICAgbGlua2VyLCBzbyB0aGlzIHdpbGwgb25seSBoYXBwZW4gZm9yIGlucHV0IGZpbGVzIHdoaWNoIGFyZSB0aGUKLSAgICAgcmVzdWx0IG9mIGEgcGFydGlhbCBsaW5rLiAgKi8KLSAgcmZkX2luID0gKGJmZF9ieXRlICopIGlucHV0X2RlYnVnLT5leHRlcm5hbF9yZmQ7Ci0gIHJmZF9lbmQgPSByZmRfaW4gKyBpbnB1dF9zeW1oZHItPmNyZmQgKiBpbnB1dF9zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZTsKLSAgZm9yICg7Ci0gICAgICAgcmZkX2luIDwgcmZkX2VuZDsKLSAgICAgICByZmRfaW4gKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpCi0gICAgewotICAgICAgUkZEVCByZmQ7Ci0KLSAgICAgICgqc3dhcF9yZmRfaW4pIChpbnB1dF9iZmQsIChQVFIpIHJmZF9pbiwgJnJmZCk7Ci0gICAgICBCRkRfQVNTRVJUIChyZmQgPj0gMCAmJiByZmQgPCBpbnB1dF9zeW1oZHItPmlmZE1heCk7Ci0gICAgICByZmQgPSBpbnB1dF9kZWJ1Zy0+aWZkbWFwW3JmZF07Ci0gICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsICZyZmQsIChQVFIpIHJmZF9vdXQpOwotICAgICAgcmZkX291dCArPSBleHRlcm5hbF9yZmRfc2l6ZTsKLSAgICB9Ci0KLSAgb2xkcmZkYmFzZSA9IG91dHB1dF9zeW1oZHItPmNyZmQ7Ci0gIG91dHB1dF9zeW1oZHItPmNyZmQgKz0gaW5wdXRfc3ltaGRyLT5jcmZkOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgRkRSJ3MgYW5kIGNvcHkgb3ZlciBhbGwgYXNzb2NpYXRlZCBkZWJ1Z2dpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBzeiA9IGNvcGllZCAqIGV4dGVybmFsX2Zkcl9zaXplOwotICBmZHJfb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0gIGlmICghZmRyX291dCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5mZHIsICZhaW5mby0+ZmRyX2VuZCwgZmRyX291dCwgc3opKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChmZHJfcHRyID0gZmRyX3N0YXJ0LCBpID0gMDsKLSAgICAgICBmZHJfcHRyIDwgZmRyX2VuZDsKLSAgICAgICBmZHJfcHRyICs9IGZkcl9hZGQsIGkrKykKLSAgICB7Ci0gICAgICBGRFIgZmRyOwotICAgICAgYmZkX3ZtYSBmZHJfYWRyOwotICAgICAgYmZkX2J5dGUgKnN5bV9vdXQ7Ci0gICAgICBiZmRfYnl0ZSAqbHJhd19zcmM7Ci0gICAgICBiZmRfYnl0ZSAqbHJhd19lbmQ7Ci0gICAgICBib29sZWFuIGZnb3RmaWxlbmFtZTsKLQotICAgICAgaWYgKGlucHV0X2RlYnVnLT5pZmRtYXBbaV0gPCBvdXRwdXRfc3ltaGRyLT5pZmRNYXgpCi0JewotCSAgLyogV2UgYXJlIG5vdCBjb3B5aW5nIHRoaXMgRkRSLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQotCWZkciA9ICooRkRSICopIGZkcl9wdHI7Ci0gICAgICBlbHNlCi0JKCppbnB1dF9zd2FwLT5zd2FwX2Zkcl9pbikgKGlucHV0X2JmZCwgKFBUUikgZmRyX3B0ciwgJmZkcik7Ci0KLSAgICAgIGZkcl9hZHIgPSBmZHIuYWRyOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIEZEUiBhZGRyZXNzIGZvciBhbnkgY2hhbmdlcyB0aGF0IG1heSBoYXZlIGJlZW4KLQkgbWFkZSBieSByZWxheGluZy4gICovCi0gICAgICBpZiAoaW5wdXRfZGVidWctPmFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCXsKLQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLQotCSAgZm9yIChhZGp1c3QgPSBpbnB1dF9kZWJ1Zy0+YWRqdXN0OwotCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkgICAgICAgYWRqdXN0ID0gYWRqdXN0LT5uZXh0KQotCSAgICBpZiAoZmRyX2FkciA+PSBhZGp1c3QtPnN0YXJ0Ci0JCSYmIGZkcl9hZHIgPCBhZGp1c3QtPmVuZCkKLQkgICAgICBmZHIuYWRyICs9IGFkanVzdC0+YWRqdXN0OwotCX0KLQotICAgICAgLyogRklYTUU6IEl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgdGhpcyBGRFIgcG9pbnRzIHRvIHRoZSAuaW5pdCBvcgotCSAuZmluaSBzZWN0aW9uLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCBub3QgZG8gdGhlIHJpZ2h0Ci0JIHRoaW5nLiAgKi8KLSAgICAgIGZkci5hZHIgKz0gc2VjdGlvbl9hZGp1c3Rbc2NUZXh0XTsKLQotICAgICAgLyogU3dhcCBpbiB0aGUgbG9jYWwgc3ltYm9scywgYWRqdXN0IHRoZWlyIHZhbHVlcywgYW5kIHN3YXAgdGhlbQotCSBvdXQgYWdhaW4uICAqLwotICAgICAgZmdvdGZpbGVuYW1lID0gZmFsc2U7Ci0gICAgICBzeiA9IGZkci5jc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBzeW1fb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0gICAgICBpZiAoIXN5bV9vdXQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnN5bSwgJmFpbmZvLT5zeW1fZW5kLCBzeW1fb3V0LAotCQkJICAgICAgIHN6KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBscmF3X3NyYyA9ICgoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX3N5bQotCQkgICsgZmRyLmlzeW1CYXNlICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgbHJhd19lbmQgPSBscmF3X3NyYyArIGZkci5jc3ltICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBmb3IgKDsgIGxyYXdfc3JjIDwgbHJhd19lbmQ7ICBscmF3X3NyYyArPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSkKLQl7Ci0JICBTWU1SIGludGVybmFsX3N5bTsKLQotCSAgKCpzd2FwX3N5bV9pbikgKGlucHV0X2JmZCwgKFBUUikgbHJhd19zcmMsICZpbnRlcm5hbF9zeW0pOwotCi0JICBCRkRfQVNTRVJUIChpbnRlcm5hbF9zeW0uc2MgIT0gc2NDb21tb24KLQkJICAgICAgJiYgaW50ZXJuYWxfc3ltLnNjICE9IHNjU0NvbW1vbik7Ci0KLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgIHN3aXRjaCAoaW50ZXJuYWxfc3ltLnN0KQotCSAgICB7Ci0JICAgIGNhc2Ugc3ROaWw6Ci0JICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZpbnRlcm5hbF9zeW0pKQotCQlicmVhazsKLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIHN0R2xvYmFsOgotCSAgICBjYXNlIHN0U3RhdGljOgotCSAgICBjYXNlIHN0TGFiZWw6Ci0JICAgIGNhc2Ugc3RQcm9jOgotCSAgICBjYXNlIHN0U3RhdGljUHJvYzoKLQkgICAgICBpZiAoaW5wdXRfZGVidWctPmFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCQl7Ci0JCSAgYmZkX3ZtYSB2YWx1ZTsKLQkJICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7Ci0KLQkJICB2YWx1ZSA9IGludGVybmFsX3N5bS52YWx1ZTsKLQkJICBmb3IgKGFkanVzdCA9IGlucHV0X2RlYnVnLT5hZGp1c3Q7Ci0JCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkJICAgICAgIGFkanVzdCA9IGFkanVzdC0+bmV4dCkKLQkJICAgIGlmICh2YWx1ZSA+PSBhZGp1c3QtPnN0YXJ0Ci0JCQkmJiB2YWx1ZSA8IGFkanVzdC0+ZW5kKQotCQkgICAgICBpbnRlcm5hbF9zeW0udmFsdWUgKz0gYWRqdXN0LT5hZGp1c3Q7Ci0JCX0KLQkgICAgICBpbnRlcm5hbF9zeW0udmFsdWUgKz0gc2VjdGlvbl9hZGp1c3RbaW50ZXJuYWxfc3ltLnNjXTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBkb2luZyBhIGZpbmFsIGxpbmssIHdlIGhhc2ggYWxsIHRoZSBzdHJpbmdzIGluCi0JICAgICB0aGUgbG9jYWwgc3ltYm9sIHRhYmxlIHRvZ2V0aGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQKLQkgICAgIG9mIHNwYWNlIHJlcXVpcmVkIGJ5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdlIGRvbid0IGRvCi0JICAgICB0aGlzIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rIGJlY2F1c2UgaXQgd291bGQKLQkgICAgIHByZXZlbnQgdXMgZnJvbSBlYXNpbHkgbWVyZ2luZyBkaWZmZXJlbnQgRkRSJ3MuICAqLwotCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBmZmlsZW5hbWU7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIGlmICghIGZnb3RmaWxlbmFtZSAmJiBpbnRlcm5hbF9zeW0uaXNzID09IGZkci5yc3MpCi0JCWZmaWxlbmFtZSA9IHRydWU7Ci0JICAgICAgZWxzZQotCQlmZmlsZW5hbWUgPSBmYWxzZTsKLQotCSAgICAgIC8qIEhhc2ggdGhlIG5hbWUgaW50byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgICAgICBuYW1lID0gaW5wdXRfZGVidWctPnNzICsgZmRyLmlzc0Jhc2UgKyBpbnRlcm5hbF9zeW0uaXNzOwotCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQlpbnRlcm5hbF9zeW0uaXNzID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNoOwotCi0JCSAgc2ggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZhaW5mby0+c3RyX2hhc2gsIG5hbWUsIHRydWUsIHRydWUpOwotCQkgIGlmIChzaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaWYgKHNoLT52YWwgPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIHNoLT52YWwgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7Ci0JCSAgICAgIG91dHB1dF9zeW1oZHItPmlzc01heCArPSBzdHJsZW4gKG5hbWUpICsgMTsKLQkJICAgICAgaWYgKGFpbmZvLT5zc19oYXNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJCWFpbmZvLT5zc19oYXNoID0gc2g7Ci0JCSAgICAgIGlmIChhaW5mby0+c3NfaGFzaF9lbmQKLQkJCSAgIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQkJYWluZm8tPnNzX2hhc2hfZW5kLT5uZXh0ID0gc2g7Ci0JCSAgICAgIGFpbmZvLT5zc19oYXNoX2VuZCA9IHNoOwotCQkgICAgfQotCQkgIGludGVybmFsX3N5bS5pc3MgPSBzaC0+dmFsOwotCQl9Ci0KLQkgICAgICBpZiAoZmZpbGVuYW1lKQotCQl7Ci0JCSAgZmRyLnJzcyA9IGludGVybmFsX3N5bS5pc3M7Ci0JCSAgZmdvdGZpbGVuYW1lID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0KLQkgICgqc3dhcF9zeW1fb3V0KSAob3V0cHV0X2JmZCwgJmludGVybmFsX3N5bSwgc3ltX291dCk7Ci0JICBzeW1fb3V0ICs9IGV4dGVybmFsX3N5bV9zaXplOwotCX0KLQotICAgICAgZmRyLmlzeW1CYXNlID0gb3V0cHV0X3N5bWhkci0+aXN5bU1heDsKLSAgICAgIG91dHB1dF9zeW1oZHItPmlzeW1NYXggKz0gZmRyLmNzeW07Ci0KLSAgICAgIC8qIENvcHkgdGhlIGluZm9ybWF0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCBzd2FwcGluZy4gICovCi0KLSAgICAgIC8qIEZJWE1FOiBJZiB3ZSBhcmUgcmVsYXhpbmcsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBsaW5lCi0JIG51bWJlcnMuICBGcmFua2x5LCBmb3JnZXQgaXQuICBBbnlib2R5IHVzaW5nIHN0YWJzIGRlYnVnZ2luZwotCSBpbmZvcm1hdGlvbiB3aWxsIG5vdCB1c2UgdGhpcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiwgYW5kCi0JIHN0YWJzIGFyZSBhZGp1c3RlZCBjb3JyZWN0bHkuICAqLwotICAgICAgaWYgKGZkci5jYkxpbmUgPiAwKQotCXsKLQkgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+bGluZSwgJmFpbmZvLT5saW5lX2VuZCwKLQkJCQkgaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zeW1oZHItPmNiTGluZU9mZnNldCArIGZkci5jYkxpbmVPZmZzZXQsCi0JCQkJIGZkci5jYkxpbmUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmZHIuaWxpbmVCYXNlID0gb3V0cHV0X3N5bWhkci0+aWxpbmVNYXg7Ci0JICBmZHIuY2JMaW5lT2Zmc2V0ID0gb3V0cHV0X3N5bWhkci0+Y2JMaW5lOwotCSAgb3V0cHV0X3N5bWhkci0+aWxpbmVNYXggKz0gZmRyLmNsaW5lOwotCSAgb3V0cHV0X3N5bWhkci0+Y2JMaW5lICs9IGZkci5jYkxpbmU7Ci0JfQotICAgICAgaWYgKGZkci5jYXV4ID4gMCkKLQl7Ci0JICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPmF1eCwgJmFpbmZvLT5hdXhfZW5kLAotCQkJCSBpbnB1dF9iZmQsCi0JCQkJIChpbnB1dF9zeW1oZHItPmNiQXV4T2Zmc2V0Ci0JCQkJICArIGZkci5pYXV4QmFzZSAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpLAotCQkJCSBmZHIuY2F1eCAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmZHIuaWF1eEJhc2UgPSBvdXRwdXRfc3ltaGRyLT5pYXV4TWF4OwotCSAgb3V0cHV0X3N5bWhkci0+aWF1eE1heCArPSBmZHIuY2F1eDsKLQl9Ci0gICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCi0JICAvKiBXaGVuIGFyZSBhcmUgaGFzaGluZyBzdHJpbmdzLCB3ZSBsaWUgYWJvdXQgdGhlIG51bWJlciBvZgotCSAgICAgc3RyaW5ncyBhdHRhY2hlZCB0byBlYWNoIEZEUi4gIFdlIG5lZWQgdG8gc2V0IGNiU3MKLQkgICAgIGJlY2F1c2Ugc29tZSB2ZXJzaW9ucyBvZiBkYnggYXBwYXJlbnRseSB1c2UgaXQgdG8gZGVjaWRlCi0JICAgICBob3cgbXVjaCBvZiB0aGUgc3RyaW5nIHRhYmxlIHRvIHJlYWQgaW4uICAqLwotCSAgZmRyLmlzc0Jhc2UgPSAwOwotCSAgZmRyLmNiU3MgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7Ci0JfQotICAgICAgZWxzZSBpZiAoZmRyLmNiU3MgPiAwKQotCXsKLQkgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3MsICZhaW5mby0+c3NfZW5kLAotCQkJCSBpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3N5bWhkci0+Y2JTc09mZnNldCArIGZkci5pc3NCYXNlLAotCQkJCSBmZHIuY2JTcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGZkci5pc3NCYXNlID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OwotCSAgb3V0cHV0X3N5bWhkci0+aXNzTWF4ICs9IGZkci5jYlNzOwotCX0KLQotICAgICAgaWYgKChvdXRwdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyCi0JICAgPT0gaW5wdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyKQotCSAgJiYgaW5wdXRfZGVidWctPmFkanVzdCA9PSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCXsKLQkgIC8qIFRoZSB0d28gQkZEJ3MgaGF2ZSB0aGUgc2FtZSBlbmRpYW5uZXNzLCBhbmQgd2UgZG9uJ3QgaGF2ZQotCSAgICAgdG8gYWRqdXN0IHRoZSBQRFIgYWRkcmVzc2VzLCBzbyBzaW1wbHkgY29weWluZyB0aGUKLQkgICAgIGluZm9ybWF0aW9uIHdpbGwgc3VmZmljZS4gICovCi0JICBCRkRfQVNTRVJUIChleHRlcm5hbF9wZHJfc2l6ZSA9PSBpbnB1dF9zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0JICBpZiAoZmRyLmNwZCA+IDApCi0JICAgIHsKLQkgICAgICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnBkciwgJmFpbmZvLT5wZHJfZW5kLAotCQkJCSAgICAgaW5wdXRfYmZkLAotCQkJCSAgICAgKGlucHV0X3N5bWhkci0+Y2JQZE9mZnNldAotCQkJCSAgICAgICsgZmRyLmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpLAotCQkJCSAgICAgZmRyLmNwZCAqIGV4dGVybmFsX3Bkcl9zaXplKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBCRkRfQVNTRVJUIChleHRlcm5hbF9vcHRfc2l6ZSA9PSBpbnB1dF9zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0JICBpZiAoZmRyLmNvcHQgPiAwKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5vcHQsICZhaW5mby0+b3B0X2VuZCwKLQkJCQkgICAgIGlucHV0X2JmZCwKLQkJCQkgICAgIChpbnB1dF9zeW1oZHItPmNiT3B0T2Zmc2V0Ci0JCQkJICAgICAgKyBmZHIuaW9wdEJhc2UgKiBleHRlcm5hbF9vcHRfc2l6ZSksCi0JCQkJICAgICBmZHIuY29wdCAqIGV4dGVybmFsX29wdF9zaXplKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zaXplX3R5cGUgb3V0c3osIGluc3o7Ci0JICBiZmRfYnl0ZSAqaW47Ci0JICBiZmRfYnl0ZSAqZW5kOwotCSAgYmZkX2J5dGUgKm91dDsKLQotCSAgLyogVGhlIHR3byBCRkQncyBoYXZlIGRpZmZlcmVudCBlbmRpYW5uZXNzLCBzbyB3ZSBtdXN0IHN3YXAKLQkgICAgIGV2ZXJ5dGhpbmcgaW4gYW5kIG91dC4gIFRoaXMgY29kZSB3b3VsZCBhbHdheXMgd29yaywgYnV0Ci0JICAgICBpdCB3b3VsZCBiZSB1bm5lY2Vzc2FyaWx5IHNsb3cgaW4gdGhlIG5vcm1hbCBjYXNlLiAgKi8KLQkgIG91dHN6ID0gZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICBpbnN6ID0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICBpbiA9ICgoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX3BkcgotCQkrIGZkci5pcGRGaXJzdCAqIGluc3opOwotCSAgZW5kID0gaW4gKyBmZHIuY3BkICogaW5zejsKLQkgIHN6ID0gZmRyLmNwZCAqIG91dHN6OwotCSAgb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0JICBpZiAoIW91dCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnBkciwgJmFpbmZvLT5wZHJfZW5kLCBvdXQsCi0JCQkJICAgc3opKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmb3IgKDsgaW4gPCBlbmQ7IGluICs9IGluc3osIG91dCArPSBvdXRzeikKLQkgICAgewotCSAgICAgIFBEUiBwZHI7Ci0KLQkgICAgICAoKmlucHV0X3N3YXAtPnN3YXBfcGRyX2luKSAoaW5wdXRfYmZkLCAoUFRSKSBpbiwgJnBkcik7Ci0KLQkgICAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gcmVsYXhpbmcsIHdlIG1heSBoYXZlIHRvIGFkanVzdCB0aGUKLQkJIGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+YWRqdXN0ICE9IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCi0JCXsKLQkJICBiZmRfdm1hIGFkcjsKLQkJICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7Ci0KLQkJICBhZHIgPSBmZHJfYWRyICsgcGRyLmFkcjsKLQkJICBmb3IgKGFkanVzdCA9IGlucHV0X2RlYnVnLT5hZGp1c3Q7Ci0JCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkJICAgICAgIGFkanVzdCA9IGFkanVzdC0+bmV4dCkKLQkJICAgIGlmIChhZHIgPj0gYWRqdXN0LT5zdGFydAotCQkJJiYgYWRyIDwgYWRqdXN0LT5lbmQpCi0JCSAgICAgIHBkci5hZHIgKz0gYWRqdXN0LT5hZGp1c3Q7Ci0JCX0KLQotCSAgICAgICgqb3V0cHV0X3N3YXAtPnN3YXBfcGRyX291dCkgKG91dHB1dF9iZmQsICZwZHIsIChQVFIpIG91dCk7Ci0JICAgIH0KLQotCSAgLyogU3dhcCBvdmVyIHRoZSBvcHRpbWl6YXRpb24gaW5mb3JtYXRpb24uICAqLwotCSAgb3V0c3ogPSBleHRlcm5hbF9vcHRfc2l6ZTsKLQkgIGluc3ogPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZTsKLQkgIGluID0gKChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZXh0ZXJuYWxfb3B0Ci0JCSsgZmRyLmlvcHRCYXNlICogaW5zeik7Ci0JICBlbmQgPSBpbiArIGZkci5jb3B0ICogaW5zejsKLQkgIHN6ID0gZmRyLmNvcHQgKiBvdXRzejsKLQkgIG91dCA9IChiZmRfYnl0ZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwgc3opOwotCSAgaWYgKCFvdXQpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5vcHQsICZhaW5mby0+b3B0X2VuZCwgb3V0LAotCQkJCSAgIHN6KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZm9yICg7IGluIDwgZW5kOyBpbiArPSBpbnN6LCBvdXQgKz0gb3V0c3opCi0JICAgIHsKLQkgICAgICBPUFRSIG9wdDsKLQotCSAgICAgICgqaW5wdXRfc3dhcC0+c3dhcF9vcHRfaW4pIChpbnB1dF9iZmQsIChQVFIpIGluLCAmb3B0KTsKLQkgICAgICAoKm91dHB1dF9zd2FwLT5zd2FwX29wdF9vdXQpIChvdXRwdXRfYmZkLCAmb3B0LCAoUFRSKSBvdXQpOwotCSAgICB9Ci0JfQotCi0gICAgICBmZHIuaXBkRmlyc3QgPSBvdXRwdXRfc3ltaGRyLT5pcGRNYXg7Ci0gICAgICBvdXRwdXRfc3ltaGRyLT5pcGRNYXggKz0gZmRyLmNwZDsKLSAgICAgIGZkci5pb3B0QmFzZSA9IG91dHB1dF9zeW1oZHItPmlvcHRNYXg7Ci0gICAgICBvdXRwdXRfc3ltaGRyLT5pb3B0TWF4ICs9IGZkci5jb3B0OwotCi0gICAgICBpZiAoZmRyLmNyZmQgPD0gMCkKLQl7Ci0JICAvKiBQb2ludCB0aGlzIEZEUiBhdCB0aGUgdGFibGUgb2YgUkZEJ3Mgd2UgY3JlYXRlZC4gICovCi0JICBmZHIucmZkQmFzZSA9IG5ld3JmZGJhc2U7Ci0JICBmZHIuY3JmZCA9IGlucHV0X3N5bWhkci0+aWZkTWF4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQb2ludCB0aGlzIEZEUiBhdCB0aGUgcmVtYXBwZWQgUkZEJ3MuICAqLwotCSAgZmRyLnJmZEJhc2UgKz0gb2xkcmZkYmFzZTsKLQl9Ci0KLSAgICAgICgqc3dhcF9mZHJfb3V0KSAob3V0cHV0X2JmZCwgJmZkciwgZmRyX291dCk7Ci0gICAgICBmZHJfb3V0ICs9IGV4dGVybmFsX2Zkcl9zaXplOwotICAgICAgKytvdXRwdXRfc3ltaGRyLT5pZmRNYXg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBzdHJpbmcgdG8gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3ZSBhcmUgYWNjdW11bGF0aW5nLgotICAgUmV0dXJuIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmRyIHN0cmluZyBiYXNlLiAgKi8KLQotc3RhdGljIGxvbmcgZWNvZmZfYWRkX3N0cmluZyBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAotCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiwKLQkJCQkgICAgICBGRFIgKmZkciwgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLXN0YXRpYyBsb25nCi1lY29mZl9hZGRfc3RyaW5nIChhaW5mbywgaW5mbywgZGVidWcsIGZkciwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIEZEUiAqZmRyOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIEhEUlIgKnN5bWhkcjsKLSAgc2l6ZV90IGxlbjsKLSAgYmZkX3NpemVfdHlwZSByZXQ7Ci0KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoIWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3MsICZhaW5mby0+c3NfZW5kLCAoUFRSKSBzdHJpbmcsCi0JCQkgICAgICAgbGVuICsgMSkpCi0JcmV0dXJuIC0xOwotICAgICAgcmV0ID0gc3ltaGRyLT5pc3NNYXg7Ci0gICAgICBzeW1oZHItPmlzc01heCArPSBsZW4gKyAxOwotICAgICAgZmRyLT5jYlNzICs9IGxlbiArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLQotICAgICAgc2ggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZhaW5mby0+c3RyX2hhc2gsIHN0cmluZywgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICBpZiAoc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChzaC0+dmFsID09IC0xKQotCXsKLQkgIHNoLT52YWwgPSBzeW1oZHItPmlzc01heDsKLQkgIHN5bWhkci0+aXNzTWF4ICs9IGxlbiArIDE7Ci0JICBpZiAoYWluZm8tPnNzX2hhc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBhaW5mby0+c3NfaGFzaCA9IHNoOwotCSAgaWYgKGFpbmZvLT5zc19oYXNoX2VuZAotCSAgICAgICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgYWluZm8tPnNzX2hhc2hfZW5kLT5uZXh0ID0gc2g7Ci0JICBhaW5mby0+c3NfaGFzaF9lbmQgPSBzaDsKLQl9Ci0gICAgICByZXQgPSBzaC0+dmFsOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBZGQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBub24tRUNPRkYgZmlsZS4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1ZywKLQkJCQkgIG91dHB1dF9zd2FwLCBpbnB1dF9iZmQsIGluZm8pCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKQotICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfc3ltX291dDsKLSAgSERSUiAqb3V0cHV0X3N5bWhkciA9ICZvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgRkRSIGZkcjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gIGFzeW1ib2wgKipzeW1fcHRyOwotICBhc3ltYm9sICoqc3ltX2VuZDsKLSAgbG9uZyBzeW1zaXplOwotICBsb25nIHN5bWNvdW50OwotICBQVFIgZXh0ZXJuYWxfZmRyOwotCi0gIG1lbXNldCAoKFBUUikgJmZkciwgMCwgc2l6ZW9mIGZkcik7Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi50ZXh0Iik7Ci0gIGlmIChzZWMgIT0gTlVMTCkKLSAgICBmZHIuYWRyID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUU6IFdoYXQgYWJvdXQgLmluaXQgb3IgLmZpbmk/ICAqLwotICAgICAgZmRyLmFkciA9IDA7Ci0gICAgfQotCi0gIGZkci5pc3NCYXNlID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OwotICBmZHIuY2JTcyA9IDA7Ci0gIGZkci5yc3MgPSBlY29mZl9hZGRfc3RyaW5nIChhaW5mbywgaW5mbywgb3V0cHV0X2RlYnVnLCAmZmRyLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0gIGlmIChmZHIucnNzID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgZmRyLmlzeW1CYXNlID0gb3V0cHV0X3N5bWhkci0+aXN5bU1heDsKLQotICAvKiBHZXQgdGhlIGxvY2FsIHN5bWJvbHMgZnJvbSB0aGUgaW5wdXQgQkZELiAgKi8KLSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQpOwotICBpZiAoc3ltc2l6ZSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW1ib2xzID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc3ltc2l6ZSk7Ci0gIGlmIChzeW1ib2xzID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaW5wdXRfYmZkLCBzeW1ib2xzKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bV9lbmQgPSBzeW1ib2xzICsgc3ltY291bnQ7Ci0KLSAgLyogSGFuZGxlIHRoZSBsb2NhbCBzeW1ib2xzLiAgQW55IGV4dGVybmFsIHN5bWJvbHMgYXJlIGhhbmRsZWQKLSAgICAgc2VwYXJhdGVseS4gICovCi0gIGZkci5jc3ltID0gMDsKLSAgZm9yIChzeW1fcHRyID0gc3ltYm9sczsgc3ltX3B0ciAhPSBzeW1fZW5kOyBzeW1fcHRyKyspCi0gICAgewotICAgICAgU1lNUiBpbnRlcm5hbF9zeW07Ci0gICAgICBQVFIgZXh0ZXJuYWxfc3ltOwotCi0gICAgICBpZiAoKCgqc3ltX3B0ciktPmZsYWdzICYgQlNGX0VYUE9SVCkgIT0gMCkKLQljb250aW51ZTsKLSAgICAgIG1lbXNldCAoKFBUUikgJmludGVybmFsX3N5bSwgMCwgc2l6ZW9mIGludGVybmFsX3N5bSk7Ci0gICAgICBpbnRlcm5hbF9zeW0uaXNzID0gZWNvZmZfYWRkX3N0cmluZyAoYWluZm8sIGluZm8sIG91dHB1dF9kZWJ1ZywgJmZkciwKLQkJCQkJICAgKCpzeW1fcHRyKS0+bmFtZSk7Ci0KLSAgICAgIGlmIChpbnRlcm5hbF9zeW0uaXNzID09IC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKCgqc3ltX3B0ciktPnNlY3Rpb24pCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKCgqc3ltX3B0ciktPnNlY3Rpb24pKQotCWludGVybmFsX3N5bS52YWx1ZSA9ICgqc3ltX3B0ciktPnZhbHVlOwotICAgICAgZWxzZQotCWludGVybmFsX3N5bS52YWx1ZSA9ICgoKnN5bV9wdHIpLT52YWx1ZQotCQkJICAgICAgKyAoKnN5bV9wdHIpLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICArICgqc3ltX3B0ciktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgaW50ZXJuYWxfc3ltLnN0ID0gc3ROaWw7Ci0gICAgICBpbnRlcm5hbF9zeW0uc2MgPSBzY1VuZGVmaW5lZDsKLSAgICAgIGludGVybmFsX3N5bS5pbmRleCA9IGluZGV4TmlsOwotCi0gICAgICBleHRlcm5hbF9zeW0gPSAoUFRSKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKLQkJCQkJICAgb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgIGlmICghZXh0ZXJuYWxfc3ltKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICgqc3dhcF9zeW1fb3V0KSAob3V0cHV0X2JmZCwgJmludGVybmFsX3N5bSwgZXh0ZXJuYWxfc3ltKTsKLSAgICAgIGFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3ltLCAmYWluZm8tPnN5bV9lbmQsCi0JCQkgIGV4dGVybmFsX3N5bSwgb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgICsrZmRyLmNzeW07Ci0gICAgICArK291dHB1dF9zeW1oZHItPmlzeW1NYXg7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChvdXRwdXRfYmZkLCAoUFRSKSBzeW1ib2xzKTsKLQotICAvKiBMZWF2ZSBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIEZEUiB6ZXJvZWQgb3V0LiAgVGhpcyB3aWxsIGNhdXNlCi0gICAgIHRoZSBsYW5nIGZpZWxkIHRvIGJlIGxhbmdDLiAgVGhlIGZCaWdlbmRpYW4gZmllbGQgd2lsbAotICAgICBpbmRpY2F0ZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UKLSAgICAgaXQgb25seSBhcHBsaWVzIHRvIGF1eCBmaWVsZHMgYW5kIHRoZXJlIGFyZSBub25lLiAgKi8KLSAgZXh0ZXJuYWxfZmRyID0gKFBUUikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCi0JCQkJICAgICAgIG91dHB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIGlmICghZXh0ZXJuYWxfZmRyKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKCpvdXRwdXRfc3dhcC0+c3dhcF9mZHJfb3V0KSAob3V0cHV0X2JmZCwgJmZkciwgZXh0ZXJuYWxfZmRyKTsKLSAgYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5mZHIsICZhaW5mby0+ZmRyX2VuZCwKLQkJICAgICAgZXh0ZXJuYWxfZmRyLCBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOwotCi0gICsrb3V0cHV0X3N5bWhkci0+aWZkTWF4OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdXAgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgc3ltYm9scy4KLSAgIEZJWE1FOiBUaGlzIGlzIGRvbmUgdXNpbmcgYSBtZW1vcnkgYnVmZmVyLCBidXQgaXQgc2hvdWxkIGJlCi0gICBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvIHVzZSBhIHNodWZmbGUgc3RydWN0dXJlLiAgVGhlIGFzc2VtYmxlciB1c2VzCi0gICB0aGlzIGludGVyZmFjZSwgc28gdGhhdCBtdXN0IGJlIGNoYW5nZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UuICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChhYmZkLCBkZWJ1Zywgc3dhcCwgcmVsb2NhdGVhYmxlLCBnZXRfZXh0ciwKLQkJCSAgIHNldF9pbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYm9vbGVhbiAoKmdldF9leHRyKSBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOwotICAgICB2b2lkICgqc2V0X2luZGV4KSBQQVJBTVMgKChhc3ltYm9sICosIGJmZF9zaXplX3R5cGUpKTsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBhc3ltYm9sICoqc3ltX3B0cl9wdHI7Ci0gIHNpemVfdCBjOwotCi0gIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgaWYgKHN5bV9wdHJfcHRyID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChjID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7IGMgPiAwOyBjLS0sIHN5bV9wdHJfcHRyKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltX3B0cjsKLSAgICAgIEVYVFIgZXN5bTsKLQotICAgICAgc3ltX3B0ciA9ICpzeW1fcHRyX3B0cjsKLQotICAgICAgLyogR2V0IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCgqZ2V0X2V4dHIpIChzeW1fcHRyLCAmZXN5bSkgPT0gZmFsc2UpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlJ3JlIHByb2R1Y2luZyBhbiBleGVjdXRhYmxlLCBtb3ZlIGNvbW1vbiBzeW1ib2xzIGludG8KLQkgYnNzLiAgKi8KLSAgICAgIGlmIChyZWxvY2F0ZWFibGUgPT0gZmFsc2UpCi0JewotCSAgaWYgKGVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQkgICAgZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0JICBlbHNlIGlmIChlc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotCSAgICBlc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0JfQotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1fcHRyLT5zZWN0aW9uKQotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1fcHRyLT5zZWN0aW9uKQotCSAgfHwgc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgLyogRklYTUU6IGdhcyBkb2VzIG5vdCBrZWVwIHRoZSB2YWx1ZSBvZiBhIHNtYWxsIHVuZGVmaW5lZAotCSAgICAgc3ltYm9sIGluIHRoZSBzeW1ib2wgaXRzZWxmLCBiZWNhdXNlIG9mIHJlbG9jYXRpb24KLQkgICAgIHByb2JsZW1zLiAgKi8KLQkgIGlmIChlc3ltLmFzeW0uc2MgIT0gc2NTVW5kZWZpbmVkCi0JICAgICAgfHwgZXN5bS5hc3ltLnZhbHVlID09IDAKLQkgICAgICB8fCBzeW1fcHRyLT52YWx1ZSAhPSAwKQotCSAgICBlc3ltLmFzeW0udmFsdWUgPSBzeW1fcHRyLT52YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JZXN5bS5hc3ltLnZhbHVlID0gKHN5bV9wdHItPnZhbHVlCi0JCQkgICArIHN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgICAgIGlmIChzZXRfaW5kZXgpCi0JKCpzZXRfaW5kZXgpIChzeW1fcHRyLCAoYmZkX3NpemVfdHlwZSkgc3ltaGRyLT5pZXh0TWF4KTsKLQotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgZGVidWcsIHN3YXAsCi0JCQkJCSAgc3ltX3B0ci0+bmFtZSwgJmVzeW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHNpbmdsZSBleHRlcm5hbCBzeW1ib2wgdG8gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGFiZmQsIGRlYnVnLCBzd2FwLCBuYW1lLCBlc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVYVFIgKmVzeW07Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpCi0gICAgPSBzd2FwLT5zd2FwX2V4dF9vdXQ7Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgc2l6ZV90IG5hbWVsZW47Ci0KLSAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgaWYgKChzaXplX3QpIChkZWJ1Zy0+c3NleHRfZW5kIC0gZGVidWctPnNzZXh0KQotICAgICAgPCBzeW1oZHItPmlzc0V4dE1heCArIG5hbWVsZW4gKyAxKQotICAgIHsKLSAgICAgIGlmIChlY29mZl9hZGRfYnl0ZXMgKChjaGFyICoqKSAmZGVidWctPnNzZXh0LAotCQkJICAgKGNoYXIgKiopICZkZWJ1Zy0+c3NleHRfZW5kLAotCQkJICAgc3ltaGRyLT5pc3NFeHRNYXggKyBuYW1lbGVuICsgMSkKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoc2l6ZV90KSAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dF9lbmQKLQkJLSAoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KQotICAgICAgPCAoc3ltaGRyLT5pZXh0TWF4ICsgMSkgKiBleHRlcm5hbF9leHRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoZWNvZmZfYWRkX2J5dGVzICgoY2hhciAqKikgJmRlYnVnLT5leHRlcm5hbF9leHQsCi0JCQkgICAoY2hhciAqKikgJmRlYnVnLT5leHRlcm5hbF9leHRfZW5kLAotCQkJICAgKHN5bWhkci0+aWV4dE1heCArIDEpICogZXh0ZXJuYWxfZXh0X3NpemUpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVzeW0tPmFzeW0uaXNzID0gc3ltaGRyLT5pc3NFeHRNYXg7Ci0KLSAgKCpzd2FwX2V4dF9vdXQpIChhYmZkLCBlc3ltLAotCQkgICAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dAotCQkgICAgKyBzeW1oZHItPmlleHRNYXggKiBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpOwotCi0gICsrc3ltaGRyLT5pZXh0TWF4OwotCi0gIHN0cmNweSAoZGVidWctPnNzZXh0ICsgc3ltaGRyLT5pc3NFeHRNYXgsIG5hbWUpOwotICBzeW1oZHItPmlzc0V4dE1heCArPSBuYW1lbGVuICsgMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxpZ24gdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci17Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYmZkX3NpemVfdHlwZSBkZWJ1Z19hbGlnbiwgYXV4X2FsaWduLCByZmRfYWxpZ247Ci0gIHNpemVfdCBhZGQ7Ci0KLSAgLyogQWRqdXN0IHRoZSBjb3VudHMgc28gdGhhdCBzdHJ1Y3R1cmVzIGFyZSBhbGlnbmVkLiAgKi8KLSAgZGVidWdfYWxpZ24gPSBzd2FwLT5kZWJ1Z19hbGlnbjsKLSAgYXV4X2FsaWduID0gZGVidWdfYWxpZ24gLyBzaXplb2YgKHVuaW9uIGF1eF9leHQpOwotICByZmRfYWxpZ24gPSBkZWJ1Z19hbGlnbiAvIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplOwotCi0gIGFkZCA9IGRlYnVnX2FsaWduIC0gKHN5bWhkci0+Y2JMaW5lICYgKGRlYnVnX2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IGRlYnVnX2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+bGluZSAhPSAodW5zaWduZWQgY2hhciAqKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKGRlYnVnLT5saW5lICsgc3ltaGRyLT5jYkxpbmUpLCAwLCBhZGQpOwotICAgICAgc3ltaGRyLT5jYkxpbmUgKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSBkZWJ1Z19hbGlnbiAtIChzeW1oZHItPmlzc01heCAmIChkZWJ1Z19hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBkZWJ1Z19hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPnNzICE9IChjaGFyICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPnNzICsgc3ltaGRyLT5pc3NNYXgpLCAwLCBhZGQpOwotICAgICAgc3ltaGRyLT5pc3NNYXggKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSBkZWJ1Z19hbGlnbiAtIChzeW1oZHItPmlzc0V4dE1heCAmIChkZWJ1Z19hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBkZWJ1Z19hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPnNzZXh0ICE9IChjaGFyICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPnNzZXh0ICsgc3ltaGRyLT5pc3NFeHRNYXgpLCAwLCBhZGQpOwotICAgICAgc3ltaGRyLT5pc3NFeHRNYXggKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSBhdXhfYWxpZ24gLSAoc3ltaGRyLT5pYXV4TWF4ICYgKGF1eF9hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBhdXhfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9hdXggIT0gKHVuaW9uIGF1eF9leHQgKikgTlVMTCkKLQltZW1zZXQgKChQVFIpIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICsgc3ltaGRyLT5pYXV4TWF4KSwgMCwKLQkJYWRkICogc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gICAgICBzeW1oZHItPmlhdXhNYXggKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSByZmRfYWxpZ24gLSAoc3ltaGRyLT5jcmZkICYgKHJmZF9hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSByZmRfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gKFBUUikgTlVMTCkKLQltZW1zZXQgKChQVFIpICgoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkCi0JCSAgICAgICArIHN5bWhkci0+Y3JmZCAqIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKSwKLQkJMCwgKHNpemVfdCkgKGFkZCAqIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKSk7Ci0gICAgICBzeW1oZHItPmNyZmQgKz0gYWRkOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRoZSBzaXplIHJlcXVpcmVkIGJ5IHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1iZmRfc2l6ZV90eXBlCi1iZmRfZWNvZmZfZGVidWdfc2l6ZSAoYWJmZCwgZGVidWcsIHN3YXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLXsKLSAgYmZkX3NpemVfdHlwZSB0b3Q7Ci0KLSAgZWNvZmZfYWxpZ25fZGVidWcgKGFiZmQsIGRlYnVnLCBzd2FwKTsKLSAgdG90ID0gc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemU7Ci0KLSNkZWZpbmUgQUREKGNvdW50LCBzaXplKSBcCi0gIHRvdCArPSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmNvdW50ICogc2l6ZQotCi0gIEFERCAoY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgQUREIChpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplKTsKLSAgQUREIChpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgQUREIChpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gIEFERCAoaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUpOwotICBBREQgKGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBBREQgKGlzc01heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIEFERCAoaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgQUREIChpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgQUREIChjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSk7Ci0gIEFERCAoaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotCi0jdW5kZWYgQURECi0KLSAgcmV0dXJuIHRvdDsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBFQ09GRiBzeW1ib2xpYyBoZWFkZXIsIGdpdmVuIHRoZSBmaWxlIHBvc2l0aW9uIGl0IGlzCi0gICBnb2luZyB0byBiZSBwbGFjZWQgYXQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY291bnRzIGFyZSBzZXQKLSAgIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl93cml0ZV9zeW1oZHIgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBmaWxlX3B0ciB3aGVyZTsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBjaGFyICpidWZmID0gTlVMTDsKLQotICBlY29mZl9hbGlnbl9kZWJ1ZyAoYWJmZCwgZGVidWcsIHN3YXApOwotCi0gIC8qIEdvIHRvIHRoZSByaWdodCBsb2NhdGlvbiBpbiB0aGUgZmlsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgd2hlcmUsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICB3aGVyZSArPSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZTsKLQotICBzeW1oZHItPm1hZ2ljID0gc3dhcC0+c3ltX21hZ2ljOwotCi0gIC8qIEZpbGwgaW4gdGhlIGZpbGUgb2Zmc2V0cy4gICovCi0jZGVmaW5lIFNFVChvZmZzZXQsIGNvdW50LCBzaXplKSBcCi0gIGlmIChzeW1oZHItPmNvdW50ID09IDApIFwKLSAgICBzeW1oZHItPm9mZnNldCA9IDA7IFwKLSAgZWxzZSBcCi0gICAgeyBcCi0gICAgICBzeW1oZHItPm9mZnNldCA9IHdoZXJlOyBcCi0gICAgICB3aGVyZSArPSBzeW1oZHItPmNvdW50ICogc2l6ZTsgXAotICAgIH0KLQotICBTRVQgKGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgU0VUIChjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplKTsKLSAgU0VUIChjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgU0VUIChjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICBTRVQgKGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIFNFVCAoY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBTRVQgKGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgU0VUIChjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgU0VUIChjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpOwotICBTRVQgKGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7Ci0jdW5kZWYgU0VUCi0KLSAgYnVmZiA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplKTsKLSAgaWYgKGJ1ZmYgPT0gTlVMTCAmJiBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICgqc3dhcC0+c3dhcF9oZHJfb3V0KSAoYWJmZCwgc3ltaGRyLCBidWZmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUsIGFiZmQpCi0gICAgICAhPSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYnVmZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1ZmYpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMKLSAgIHRoYXQgdGhlIGluZm9ybWF0aW9uICh0aGUgcG9pbnRlcnMgYW5kIGNvdW50cykgaW4gKkRFQlVHIGhhdmUgYmVlbgotICAgc2V0IGNvcnJlY3RseS4gIFdIRVJFIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byB3cml0ZSB0aGUKLSAgIGluZm9ybWF0aW9uIHRvLiAgVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgZmlsZSBvZmZzZXRzIGluIHRoZQotICAgc3ltYm9saWMgaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgZmlsZV9wdHIgd2hlcmU7Ci17Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLQotICBpZiAoISBlY29mZl93cml0ZV9zeW1oZHIgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0jZGVmaW5lIFdSSVRFKHB0ciwgY291bnQsIHNpemUsIG9mZnNldCkgXAotICBCRkRfQVNTRVJUIChzeW1oZHItPm9mZnNldCA9PSAwIFwKLQkgICAgICB8fCAoYmZkX3ZtYSkgYmZkX3RlbGwgKGFiZmQpID09IHN5bWhkci0+b2Zmc2V0KTsgXAotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBkZWJ1Zy0+cHRyLCBzaXplLCBzeW1oZHItPmNvdW50LCBhYmZkKSBcCi0gICAgICAhPSBzaXplICogc3ltaGRyLT5jb3VudCkgXAotICAgIHJldHVybiBmYWxzZTsKLQotICBXUklURSAobGluZSwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLCBjYkxpbmVPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfZG5yLCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBjYkRuT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX3BkciwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSwgY2JQZE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9zeW0sIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplLCBjYlN5bU9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9vcHQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBjYk9wdE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9hdXgsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksIGNiQXV4T2Zmc2V0KTsKLSAgV1JJVEUgKHNzLCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNiU3NPZmZzZXQpOwotICBXUklURSAoc3NleHQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSwgY2JTc0V4dE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9mZHIsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIGNiRmRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfcmZkLCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgY2JSZmRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfZXh0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwgY2JFeHRPZmZzZXQpOwotI3VuZGVmIFdSSVRFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHNodWZmbGUgbGlzdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGVjb2ZmX3dyaXRlX3NodWZmbGUgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqLAotCQkJCQkgICAgc3RydWN0IHNodWZmbGUgKiwgUFRSIHNwYWNlKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBzaHVmZmxlLCBzcGFjZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgc3RydWN0IHNodWZmbGUgKnNodWZmbGU7Ci0gICAgIFBUUiBzcGFjZTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHNodWZmbGUgKmw7Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0KLSAgdG90YWwgPSAwOwotICBmb3IgKGwgPSBzaHVmZmxlOyBsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBsLT5maWxlcCkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlIChsLT51Lm1lbW9yeSwgMSwgbC0+c2l6ZSwgYWJmZCkgIT0gbC0+c2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGwtPnUuZmlsZS5pbnB1dF9iZmQsIGwtPnUuZmlsZS5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3JlYWQgKHNwYWNlLCAxLCBsLT5zaXplLCBsLT51LmZpbGUuaW5wdXRfYmZkKSAhPSBsLT5zaXplCi0JICAgICAgfHwgYmZkX3dyaXRlIChzcGFjZSwgMSwgbC0+c2l6ZSwgYWJmZCkgIT0gbC0+c2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHRvdGFsICs9IGwtPnNpemU7Ci0gICAgfQotCi0gIGlmICgodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGJmZF9ieXRlICpzOwotCi0gICAgICBpID0gc3dhcC0+ZGVidWdfYWxpZ24gLSAodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSk7Ci0gICAgICBzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGkpOwotICAgICAgaWYgKHMgPT0gTlVMTCAmJiBpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBtZW1zZXQgKChQVFIpIHMsIDAsIGkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgcywgMSwgaSwgYWJmZCkgIT0gaSkKLQl7Ci0JICBmcmVlIChzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBmcmVlIChzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdXNpbmcgYWNjdW11bGF0ZWQgbGlua2VyCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAoaGFuZGxlLCBhYmZkLCBkZWJ1Zywgc3dhcCwgaW5mbywgd2hlcmUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICBQVFIgc3BhY2UgPSBOVUxMOwotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3N5bWhkciAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzcGFjZSA9IChQVFIpIGJmZF9tYWxsb2MgKGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSk7Ci0gIGlmIChzcGFjZSA9PSBOVUxMICYmIGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5saW5lLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnBkciwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5zeW0sIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+b3B0LCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPmF1eCwgc3BhY2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUgaXMgd3JpdHRlbiBvdXQgZnJvbSB0aGUgaGFzaCB0YWJsZSBpZiB0aGlzIGlzIGEKLSAgICAgZmluYWwgbGluay4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYWluZm8tPnNzX2hhc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKTsKLSAgICAgIGlmICghIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5zcywgc3BhY2UpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0gICAgICBiZmRfYnl0ZSBudWxsOwotICAgICAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLQotICAgICAgQkZEX0FTU0VSVCAoYWluZm8tPnNzID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKTsKLSAgICAgIG51bGwgPSAwOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJm51bGwsIDEsIDEsIGFiZmQpICE9IDEpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICB0b3RhbCA9IDE7Ci0gICAgICBCRkRfQVNTRVJUIChhaW5mby0+c3NfaGFzaCA9PSBOVUxMIHx8IGFpbmZvLT5zc19oYXNoLT52YWwgPT0gMSk7Ci0gICAgICBmb3IgKHNoID0gYWluZm8tPnNzX2hhc2g7Ci0JICAgc2ggIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMOwotCSAgIHNoID0gc2gtPm5leHQpCi0JewotCSAgc2l6ZV90IGxlbjsKLQotCSAgbGVuID0gc3RybGVuIChzaC0+cm9vdC5zdHJpbmcpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc2gtPnJvb3Quc3RyaW5nLCAxLCBsZW4gKyAxLCBhYmZkKSAhPSBsZW4gKyAxKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHRvdGFsICs9IGxlbiArIDE7Ci0JfQotCi0gICAgICBpZiAoKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpICE9IDApCi0JewotCSAgdW5zaWduZWQgaW50IGk7Ci0JICBiZmRfYnl0ZSAqczsKLQotCSAgaSA9IHN3YXAtPmRlYnVnX2FsaWduIC0gKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpOwotCSAgcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpKTsKLQkgIGlmIChzID09IE5VTEwgJiYgaSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG1lbXNldCAoKFBUUikgcywgMCwgaSk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLCAxLCBpLCBhYmZkKSAhPSBpKQotCSAgICB7Ci0JICAgICAgZnJlZSAocyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGZyZWUgKHMpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGV4dGVybmFsIHN0cmluZ3MgYW5kIHN5bWJvbCBhcmUgbm90IGNvbnZlcnRlZCBvdmVyIHRvIHVzaW5nCi0gICAgIHNodWZmbGVzLiAgRklYTUU6IFRoZXkgcHJvYmFibHkgc2hvdWxkIGJlLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoZGVidWctPnNzZXh0LCAxLCBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCwgYWJmZCkKLSAgICAgICE9IChiZmRfc2l6ZV90eXBlKSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgYmZkX2J5dGUgKnM7Ci0KLSAgICAgIGkgPSAoc3dhcC0+ZGVidWdfYWxpZ24KLQkgICAtIChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSk7Ci0gICAgICBzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGkpOwotICAgICAgaWYgKHMgPT0gTlVMTCAmJiBpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBtZW1zZXQgKChQVFIpIHMsIDAsIGkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgcywgMSwgaSwgYWJmZCkgIT0gaSkKLQl7Ci0JICBmcmVlIChzKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICAgIGZyZWUgKHMpOwotICAgIH0KLQotICBpZiAoISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+ZmRyLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnJmZCwgc3BhY2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIEJGRF9BU1NFUlQgKGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuY2JFeHRPZmZzZXQgPT0gMAotCSAgICAgIHx8IChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmNiRXh0T2Zmc2V0Ci0JCSAgPT0gKGJmZF92bWEpIGJmZF90ZWxsIChhYmZkKSkpOwotCi0gIGlmIChiZmRfd3JpdGUgKGRlYnVnLT5leHRlcm5hbF9leHQsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplLAotCQkgZGVidWctPnN5bWJvbGljX2hlYWRlci5pZXh0TWF4LCBhYmZkKQotICAgICAgIT0gZGVidWctPnN5bWJvbGljX2hlYWRlci5pZXh0TWF4ICogc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKHNwYWNlICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2UpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHNwYWNlICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2UpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBIYW5kbGUgdGhlIGZpbmRfbmVhcmVzdF9saW5lIGZ1bmN0aW9uIGZvciBib3RoIEVDT0ZGIGFuZCBNSVBTIEVMRgotICAgZmlsZXMuICAqLwotCi0vKiBDb21wYXJlIEZEUiBlbnRyaWVzLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotY21wX2ZkcnRhYl9lbnRyeSAobGVmdHAsIHJpZ2h0cCkKLSAgICAgY29uc3QgUFRSIGxlZnRwOwotICAgICBjb25zdCBQVFIgcmlnaHRwOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICpscCA9Ci0gICAgKGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKikgbGVmdHA7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnJwID0KLSAgICAoY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqKSByaWdodHA7Ci0KLSAgaWYgKGxwLT5iYXNlX2FkZHIgPCBycC0+YmFzZV9hZGRyKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGxwLT5iYXNlX2FkZHIgPiBycC0+YmFzZV9hZGRyKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotLyogRWFjaCBmaWxlIGRlc2NyaXB0b3IgKEZEUikgaGFzIGEgbWVtb3J5IGFkZHJlc3MsIHRvIHNpbXBsaWZ5Ci0gICBsb29raW5nIHVwIGFuIEZEUiBieSBhZGRyZXNzLCB3ZSBidWlsZCBhIHRhYmxlIGNvdmVyaW5nIGFsbCBGRFJzCi0gICB0aGF0IGhhdmUgYSBsZWFzdCBvbmUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgaW4gdGhlbS4gIFRoZSBmaW5hbAotICAgdGFibGUgd2lsbCBiZSBzb3J0ZWQgYnkgYWRkcmVzcyBzbyB3ZSBjYW4gbG9vayBpdCB1cCB2aWEgYmluYXJ5Ci0gICBzZWFyY2guICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWtfZmRydGFiIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXA7Ci0gICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLXsKLSAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqdGFiOwotICBGRFIgKmZkcl9wdHI7Ci0gIEZEUiAqZmRyX3N0YXJ0OwotICBGRFIgKmZkcl9lbmQ7Ci0gIGJvb2xlYW4gc3RhYnM7Ci0gIGxvbmcgbGVuOwotCi0gIGZkcl9zdGFydCA9IGRlYnVnX2luZm8tPmZkcjsKLSAgZmRyX2VuZCA9IGZkcl9zdGFydCArIGRlYnVnX2luZm8tPnN5bWJvbGljX2hlYWRlci5pZmRNYXg7Ci0KLSAgLyogRmlyc3QsIGxldCdzIHNlZSBob3cgbG9uZyB0aGUgdGFibGUgbmVlZHMgdG8gYmU6ICovCi0gIGZvciAobGVuID0gMCwgZmRyX3B0ciA9IGZkcl9zdGFydDsgZmRyX3B0ciA8IGZkcl9lbmQ7IGZkcl9wdHIrKykKLSAgICB7Ci0gICAgICBpZiAoZmRyX3B0ci0+Y3BkID09IDApCS8qIHNraXAgRkRScyB0aGF0IGhhdmUgbm8gUERScyAqLwotCWNvbnRpbnVlOwotICAgICAgKytsZW47Ci0gICAgfQotCi0gIC8qIE5vdywgY3JlYXRlIGFuZCBmaWxsIGluIHRoZSB0YWJsZTogKi8KLQotICBsaW5lX2luZm8tPmZkcnRhYiA9ICgoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSopCi0JCSAgICAgICBiZmRfemFsbG9jIChhYmZkLAotCQkJCSAgIGxlbiAqIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSkpKTsKLSAgaWYgKGxpbmVfaW5mby0+ZmRydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBsaW5lX2luZm8tPmZkcnRhYl9sZW4gPSBsZW47Ci0KLSAgdGFiID0gbGluZV9pbmZvLT5mZHJ0YWI7Ci0gIGZvciAoZmRyX3B0ciA9IGZkcl9zdGFydDsgZmRyX3B0ciA8IGZkcl9lbmQ7IGZkcl9wdHIrKykKLSAgICB7Ci0gICAgICBpZiAoZmRyX3B0ci0+Y3BkID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBmaWxlIGhhcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJbgotCSBhIGZpbGUgd2l0aCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZSBzZWNvbmQgbG9jYWwKLQkgc3ltYm9sIGlzIG5hbWVkIEBzdGFicy4gICovCi0gICAgICBzdGFicyA9IGZhbHNlOwotICAgICAgaWYgKGZkcl9wdHItPmNzeW0gPj0gMikKLQl7Ci0JICBjaGFyICpzeW1fcHRyOwotCSAgU1lNUiBzeW07Ci0KLQkgIHN5bV9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCSAgICAgKyAoZmRyX3B0ci0+aXN5bUJhc2UgKyAxKSpkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgc3ltX3B0ciwgJnN5bSk7Ci0JICBpZiAoc3RyY21wIChkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzLAotCQkgICAgICBTVEFCU19TWU1CT0wpID09IDApCi0JICAgIHN0YWJzID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmICghc3RhYnMpCi0JewotCSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZTsKLQkgIGNoYXIgKnBkcl9wdHI7Ci0JICBQRFIgcGRyOwotCi0JICBleHRlcm5hbF9wZHJfc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotCi0JICBwZHJfcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3BkcgotCQkgICAgICsgZmRyX3B0ci0+aXBkRmlyc3QgKiBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgcGRyX3B0ciwgJnBkcik7Ci0JICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgUERSIGlzIHRoZSBvZmZzZXQgb2YgdGhhdAotCSAgICAgcHJvY2VkdXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlsZSBGRFIuICAqLwotCSAgdGFiLT5iYXNlX2FkZHIgPSBmZHJfcHRyLT5hZHIgLSBwZHIuYWRyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBYWFggSSBkb24ndCBrbm93IGFib3V0IHN0YWJzLCBzbyB0aGlzIGlzIGEgZ3Vlc3MKLQkgICAgIChkYXZpZG1AY3MuYXJpem9uYS5lZHUpOiAqLwotCSAgdGFiLT5iYXNlX2FkZHIgPSBmZHJfcHRyLT5hZHI7Ci0JfQotICAgICAgdGFiLT5mZHIgPSBmZHJfcHRyOwotICAgICAgKyt0YWI7Ci0gICAgfQotCi0gIC8qIEZpbmFsbHksIHRoZSB0YWJsZSBpcyBzb3J0ZWQgaW4gaW5jcmVhc2luZyBtZW1vcnktYWRkcmVzcyBvcmRlci4KLSAgICAgVGhlIHRhYmxlIGlzIG1vc3RseSBzb3J0ZWQgYWxyZWFkeSwgYnV0IHRoZXJlIGFyZSBjYXNlcyAoZS5nLiwKLSAgICAgc3RhdGljIGZ1bmN0aW9ucyBpbiBpbmNsdWRlIGZpbGVzKSwgd2hlcmUgdGhpcyBkb2VzIG5vdCBob2xkLgotICAgICBVc2UgIm9kdW1wIC1QRnYiIHRvIHZlcmlmeS4uLiAgKi8KLSAgcXNvcnQgKChQVFIpIGxpbmVfaW5mby0+ZmRydGFiLCBsZW4sCi0JIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSksIGNtcF9mZHJ0YWJfZW50cnkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gaW5kZXggb2YgZmlyc3QgRkRSIHRoYXQgY292ZXJzIHRvIE9GRlNFVC4gICovCi0KLXN0YXRpYyBsb25nCi1mZHJ0YWJfbG9va3VwIChsaW5lX2luZm8sIG9mZnNldCkKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotICAgICBiZmRfdm1hIG9mZnNldDsKLXsKLSAgbG9uZyBsb3csIGhpZ2gsIGxlbjsKLSAgbG9uZyBtaWQgPSAtMTsKLSAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqdGFiOwotCi0gIGxlbiA9IGxpbmVfaW5mby0+ZmRydGFiX2xlbjsKLSAgaWYgKGxlbiA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICB0YWIgPSBsaW5lX2luZm8tPmZkcnRhYjsKLSAgZm9yIChsb3cgPSAwLCBoaWdoID0gbGVuIC0gMSA7IGxvdyAhPSBoaWdoIDspCi0gICAgewotICAgICAgbWlkID0gKGhpZ2ggKyBsb3cpIC8gMjsKLSAgICAgIGlmIChvZmZzZXQgPj0gdGFiW21pZF0uYmFzZV9hZGRyICYmIG9mZnNldCA8IHRhYlttaWQgKyAxXS5iYXNlX2FkZHIpCi0JZ290byBmaW5kX21pbjsKLQotICAgICAgaWYgKHRhYlttaWRdLmJhc2VfYWRkciA+IG9mZnNldCkKLQloaWdoID0gbWlkOwotICAgICAgZWxzZQotCWxvdyA9IG1pZCArIDE7Ci0gICAgfQotICArK21pZDsKLQotICAvKiBsYXN0IGVudHJ5IGlzIGNhdGNoLWFsbCBmb3IgYWxsIGhpZ2hlciBhZGRyZXNzZXM6ICovCi0gIGlmIChvZmZzZXQgPCB0YWJbbWlkXS5iYXNlX2FkZHIpCi0gICAgcmV0dXJuIC0xOwotCi0gZmluZF9taW46Ci0KLSAgd2hpbGUgKG1pZCA+IDAgJiYgdGFiW21pZCAtIDFdLmJhc2VfYWRkciA9PSB0YWJbbWlkXS5iYXNlX2FkZHIpCi0gICAgLS1taWQ7Ci0KLSAgcmV0dXJuIG1pZDsKLX0KLQotLyogTG9vayB1cCBhIGxpbmUgZ2l2ZW4gYW4gYWRkcmVzcywgc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gaW4KLSAgIExJTkVfSU5GTy0+Y2FjaGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbG9va3VwX2xpbmUgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcDsKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotewotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICp0YWI7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBib29sZWFuIHN0YWJzOwotICBGRFIgKmZkcl9wdHI7Ci0gIGludCBpOwotICAKLSAgb2Zmc2V0ID0gbGluZV9pbmZvLT5jYWNoZS5zdGFydDsKLSAgICAgCi0gIC8qIEJ1aWxkIEZEUiB0YWJsZSAoc29ydGVkIGJ5IG9iamVjdCBmaWxlJ3MgYmFzZS1hZGRyZXNzKSBpZiB3ZQotICAgICBkb24ndCBoYXZlIGl0IGFscmVhZHkuICAqLwotICBpZiAobGluZV9pbmZvLT5mZHJ0YWIgPT0gTlVMTAotICAgICAgJiYgIW1rX2ZkcnRhYiAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdGFiID0gbGluZV9pbmZvLT5mZHJ0YWI7Ci0KLSAgLyogZmluZCBmaXJzdCBGRFIgZm9yIGFkZHJlc3MgT0ZGU0VUICovCi0gIGkgPSBmZHJ0YWJfbG9va3VwIChsaW5lX2luZm8sIG9mZnNldCk7Ci0gIGlmIChpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7CQkvKiBubyBGRFIsIG5vIGZ1bi4uLiAqLwotICBmZHJfcHRyID0gdGFiW2ldLmZkcjsKLQotICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgZmlsZSBoYXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSW4gYQotICAgICBmaWxlIHdpdGggc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGUgc2Vjb25kIGxvY2FsIHN5bWJvbCBpcwotICAgICBuYW1lZCBAc3RhYnMuICAqLwotICBzdGFicyA9IGZhbHNlOwotICBpZiAoZmRyX3B0ci0+Y3N5bSA+PSAyKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bV9wdHI7Ci0gICAgICBTWU1SIHN5bTsKLQotICAgICAgc3ltX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkJICsgKGZkcl9wdHItPmlzeW1CYXNlICsgMSkgKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgc3ltX3B0ciwgJnN5bSk7Ci0gICAgICBpZiAoc3RyY21wIChkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzLAotCQkgIFNUQUJTX1NZTUJPTCkgPT0gMCkKLQlzdGFicyA9IHRydWU7Ci0gICAgfQotCi0gIGlmICghc3RhYnMpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZTsKLSAgICAgIGNoYXIgKnBkcl9wdHI7Ci0gICAgICBjaGFyICpiZXN0X3BkciA9IE5VTEw7Ci0gICAgICBGRFIgKmJlc3RfZmRyOwotICAgICAgYmZkX3ZtYSBiZXN0X2Rpc3QgPSB+MDsKLSAgICAgIFBEUiBwZHI7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpsaW5lX3B0cjsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmxpbmVfZW5kOwotICAgICAgaW50IGxpbmVubzsKLSAgICAgIC8qIFRoaXMgZmlsZSB1c2VzIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEVhY2ggRkRSIGhhcyBhCi0gICAgICAgICBsaXN0IG9mIHByb2NlZHVyZSBkZXNjcmlwdG9ycyAoUERSKS4gIFRoZSBhZGRyZXNzIGluIHRoZSBGRFIKLSAgICAgICAgIGlzIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwcm9jZWR1cmUuICBUaGUgYWRkcmVzcwotICAgICAgICAgaW4gdGhlIGZpcnN0IFBEUiBnaXZlcyB0aGUgb2Zmc2V0IG9mIHRoYXQgcHJvY2VkdXJlIHJlbGF0aXZlCi0gICAgICAgICB0byB0aGUgb2JqZWN0IGZpbGUncyBiYXNlLWFkZHJlc3MuICBUaGUgYWRkcmVzc2VzIGluCi0gICAgICAgICBzdWJzZXF1ZW50IFBEUnMgc3BlY2lmeSBlYWNoIHByb2NlZHVyZSdzIGFkZHJlc3MgcmVsYXRpdmUgdG8KLSAgICAgICAgIHRoZSBvYmplY3QgZmlsZSdzIGJhc2UtYWRkcmVzcy4gIFRvIG1ha2UgdGhpbmdzIG1vcmUganVpY3ksCi0gICAgICAgICB3aGVuZXZlciB0aGUgUFJPRiBiaXQgaW4gdGhlIFBEUiBpcyBzZXQsIHRoZSByZWFsIGVudHJ5IHBvaW50Ci0gICAgICAgICBvZiB0aGUgcHJvY2VkdXJlIG1heSBiZSAxNiBieXRlcyBiZWxvdyB3aGF0IHdvdWxkIG5vcm1hbGx5IGJlCi0gICAgICAgICB0aGUgcHJvY2VkdXJlJ3MgZW50cnkgcG9pbnQuICBJbnN0ZWFkLCBERUMgY2FtZSB1cCB3aXRoIGEKLSAgICAgICAgIHdpY2tlZCBzY2hlbWUgdG8gY3JlYXRlIHByb2ZpbGVkIGxpYnJhcmllcyAib24gdGhlIGZseSI6Ci0gICAgICAgICBpbnN0ZWFkIG9mIHNoaXBwaW5nIGEgcmVndWxhciBhbmQgYSBwcm9maWxlZCB2ZXJzaW9uIG9mIGVhY2gKLSAgICAgICAgIGxpYnJhcnksIHRoZXkgaW5zZXJ0IDE2IGJ5dGVzIG9mIHVudXNlZCBzcGFjZSBpbiBmcm9udCBvZgotICAgICAgICAgZWFjaCBwcm9jZWR1cmUgYW5kIHNldCB0aGUgInByb2YiIGJpdCBpbiB0aGUgUERSIHRvIGluZGljYXRlCi0gICAgICAgICB0aGF0IHRoZXJlIGlzIGEgZ2FwIHRoZXJlICh0aGlzIGlzIGRvbmUgYXV0b21hZ2ljYWxseSBieSAiYXMiCi0gICAgICAgICB3aGVuIG9wdGlvbiAiLXBnIiBpcyBzcGVjaWZpZWQpLiAgVGh1cywgbm9ybWFsbHksIHlvdSBsaW5rCi0gICAgICAgICBhZ2FpbnN0IHN1Y2ggYSBsaWJyYXJ5IGFuZCwgZXhjZXB0IGZvciBsb3RzIG9mIDE2IGJ5dGUgZ2FwcwotICAgICAgICAgYmV0d2VlbiBmdW5jdGlvbnMsIHRoaW5ncyB3aWxsIGJlaGF2ZSBhcyB1c3VhbC4gIEhvd2V2ZXIsCi0gICAgICAgICB3aGVuIGludm9raW5nICJsZCIgd2l0aCBvcHRpb24gIi1wZyIsIGl0IHdpbGwgZmlsbCB0aG9zZSBnYXBzCi0gICAgICAgICB3aXRoIGNvZGUgdGhhdCBjYWxscyBtY291bnQoKS4gIEl0IHRoZW4gbW92ZXMgdGhlIGZ1bmN0aW9uJ3MKLSAgICAgICAgIGVudHJ5IHBvaW50IGRvd24gYnkgMTYgYnl0ZXMsIGFuZCBvdXQgcG9wcyBhIGJpbmFyeSB0aGF0IGhhcwotICAgICAgICAgYWxsIGZ1bmN0aW9ucyBwcm9maWxlZC4KLQotICAgICAgICAgTk9URTogTmVpdGhlciBGRFJzIG5vciBQRFJzIGFyZSBzdHJpY3RseSBzb3J0ZWQgaW4gbWVtb3J5Ci0gICAgICAgICAgICAgICBvcmRlci4gIEZvciBleGFtcGxlLCB3aGVuIGluY2x1ZGluZyBoZWFkZXItZmlsZXMgdGhhdAotICAgICAgICAgICAgICAgZGVmaW5lIGZ1bmN0aW9ucywgdGhlIEZEUnMgZm9sbG93IGJlaGluZCB0aGUgaW5jbHVkaW5nCi0gICAgICAgICAgICAgICBmaWxlLCBldmVuIHRob3VnaCB0aGVpciBjb2RlIG1heSBoYXZlIGJlZW4gZ2VuZXJhdGVkIGF0Ci0gICAgICAgICAgICAgICBhIGxvd2VyIGFkZHJlc3MuICBGaWxlIGNvZmYtYWxwaGEuYyBmcm9tIGxpYmJmZAotICAgICAgICAgICAgICAgaWxsdXN0cmF0ZXMgdGhpcyAodXNlICJvZHVtcCAtUEZ2IiB0byBsb29rIGF0IGEgZmlsZSdzCi0gICAgICAgICAgICAgICBGRFIvUERSKS4gIFNpbWlsYXJseSwgUERScyBhcmUgc29tZXRpbWVzIG91dCBvZiBvcmRlcgotICAgICAgICAgICAgICAgYXMgd2VsbC4gIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyBPU0YvMSB2My4wIGxpYmMncwotICAgICAgICAgICAgICAgbWFsbG9jLmMuICBJJ20gbm90IHN1cmUgd2h5IHRoaXMgaGFwcGVucywgYnV0IGl0IGNvdWxkCi0gICAgICAgICAgICAgICBiZSBkdWUgdG8gb3B0aW1pemF0aW9ucyB0aGF0IHJlb3JkZXIgYSBmdW5jdGlvbidzCi0gICAgICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gYW4gb2JqZWN0LWZpbGUuCi0gICAgICAgIAotICAgICAgICAgU3RyYXRlZ3k6Ci0gICAgICAgICAKLSAgICAgICAgIE9uIHRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIHdlIGJ1aWxkIGEgdGFibGUgb2YgRkRScwotICAgICAgICAgdGhhdCBpcyBzb3J0ZWQgYnkgdGhlIGJhc2UtYWRkcmVzcyBvZiB0aGUgb2JqZWN0LWZpbGUgdGhlIEZEUgotICAgICAgICAgaXMgcmVmZXJyaW5nIHRvLiAgTm90aWNlIHRoYXQgZWFjaCBvYmplY3QtZmlsZSBtYXkgY29udGFpbgotICAgICAgICAgY29kZSBmcm9tIG11bHRpcGxlIHNvdXJjZSBmaWxlcyAoZS5nLiwgZHVlIHRvIGNvZGUgZGVmaW5lZCBpbgotICAgICAgICAgaW5jbHVkZSBmaWxlcykuICBUaHVzLCBmb3IgYW55IGdpdmVuIGJhc2UtYWRkcmVzcywgdGhlcmUgbWF5Ci0gICAgICAgICBiZSBtdWx0aXBsZSBGRFJzIChidXQgdGhpcyBjYXNlIGlzLCBmb3J0dW5hdGVseSwgdW5jb21tb24pLgotICAgICAgICAgbG9va3VwKGFkZHIpIGd1YXJhbnRlZXMgdG8gcmV0dXJuIHRoZSBmaXJzdCBGRFIgdGhhdCBhcHBsaWVzCi0gICAgICAgICB0byBhZGRyZXNzIEFERFIuICBUaHVzLCBhZnRlciBpbnZva2luZyBsb29rdXAoKSwgd2UgaGF2ZSBhCi0gICAgICAgICBsaXN0IG9mIEZEUnMgdGhhdCBtYXkgY29udGFpbiB0aGUgUERSIGZvciBBRERSLiAgTmV4dCwgd2UKLSAgICAgICAgIHdhbGsgdGhyb3VnaCB0aGUgUERScyBvZiB0aGVzZSBGRFJzIGFuZCBsb2NhdGUgdGhlIG9uZSB0aGF0Ci0gICAgICAgICBpcyBjbG9zZXN0IHRvIEFERFIgKGkuZS4sIGZvciB3aGljaCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gICAgICAgICBBRERSIGFuZCB0aGUgUERSJ3MgZW50cnkgcG9pbnQgaXMgcG9zaXRpdmUgYW5kIG1pbmltYWwpLgotICAgICAgICAgT25jZSwgdGhlIHJpZ2h0IEZEUiBhbmQgUERSIGFyZSBsb2NhdGVkLCB3ZSBzaW1wbHkgd2FsawotICAgICAgICAgdGhyb3VnaCB0aGUgbGluZS1udW1iZXIgdGFibGUgdG8gbG9va3VwIHRoZSBsaW5lLW51bWJlciB0aGF0Ci0gICAgICAgICBiZXN0IG1hdGNoZXMgQUREUi4gIE9idmlvdXNseSwgdGhpbmdzIGNvdWxkIGJlIHNwZWQgdXAgYnkKLSAgICAgICAgIGtlZXBpbmcgYSBzb3J0ZWQgbGlzdCBvZiBQRFJzIGluc3RlYWQgb2YgYSBzb3J0ZWQgbGlzdCBvZgotICAgICAgICAgRkRScy4gIEhvd2V2ZXIsIHRoaXMgd291bGQgaW5jcmVhc2Ugc3BhY2UgcmVxdWlyZW1lbnRzCi0gICAgICAgICBjb25zaWRlcmFibHksIHdoaWNoIGlzIHVuZGVzaXJhYmxlLiAgKi8KLSAgICAgIGV4dGVybmFsX3Bkcl9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugb2Zmc2V0IHJlbGF0aXZlIHRvIG9iamVjdCBmaWxlJ3Mgc3RhcnQtYWRkcmVzczogKi8KLSAgICAgIG9mZnNldCAtPSB0YWJbaV0uYmFzZV9hZGRyOwotICAgICAgLyogU2VhcmNoIEZEUiBsaXN0IHN0YXJ0aW5nIGF0IHRhYltpXSBmb3IgdGhlIFBEUiB0aGF0IGJlc3QgbWF0Y2hlcwotICAgICAgICAgT0ZGU0VULiAgTm9ybWFsbHksIHRoZSBGRFIgbGlzdCBpcyBvbmx5IG9uZSBlbnRyeSBsb25nLiAgKi8KLSAgICAgIGJlc3RfZmRyID0gTlVMTDsKLSAgICAgIGRvCi0JewotCSAgYmZkX3ZtYSBkaXN0LCBtaW5fZGlzdCA9IDA7Ci0JICBjaGFyICpwZHJfaG9sZDsKLQkgIGNoYXIgKnBkcl9lbmQ7Ci0JICAKLQkgIGZkcl9wdHIgPSB0YWJbaV0uZmRyOwotCSAgCi0JICBwZHJfcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3BkcgotCQkgICAgICsgZmRyX3B0ci0+aXBkRmlyc3QgKiBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0JICBwZHJfZW5kID0gcGRyX3B0ciArIGZkcl9wdHItPmNwZCAqIGV4dGVybmFsX3Bkcl9zaXplOwotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpOwotCSAgLyogRmluZCBQRFIgdGhhdCBpcyBjbG9zZXN0IHRvIE9GRlNFVC4gIElmIHBkci5wcm9mIGlzIHNldCwKLQkgICAgIHRoZSBwcm9jZWR1cmUgZW50cnktcG9pbnQgKm1heSogYmUgMHgxMCBiZWxvdyBwZHIuYWRyLiAgV2UKLQkgICAgIHNpbXBseSBwcmV0ZW5kIHRoYXQgcGRyLnByb2YgKmltcGxpZXMqIGEgbG93ZXIgZW50cnktcG9pbnQuCi0JICAgICBUaGlzIGlzIHNhZmUgYmVjYXVzZSBpdCBqdXN0IG1lYW5zIHRoYXQgbWF5IGlkZW50aWZ5IDQgTk9QcwotCSAgICAgaW4gZnJvbnQgb2YgdGhlIGZ1bmN0aW9uIGFzIGJlbG9uZ2luZyB0byB0aGUgZnVuY3Rpb24uICAqLwotCSAgZm9yIChwZHJfaG9sZCA9IE5VTEw7Ci0JICAgICAgIHBkcl9wdHIgPCBwZHJfZW5kOwotCSAgICAgICAocGRyX3B0ciArPSBleHRlcm5hbF9wZHJfc2l6ZSwKLQkJKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpKSkKLQkgICAgewotCSAgICAgIGlmIChvZmZzZXQgPj0gKHBkci5hZHIgLSAweDEwICogcGRyLnByb2YpKQotCQl7Ci0JCSAgZGlzdCA9IG9mZnNldCAtIChwZHIuYWRyIC0gMHgxMCAqIHBkci5wcm9mKTsKLQkJICBpZiAoIXBkcl9ob2xkIHx8IGRpc3QgPCBtaW5fZGlzdCkKLQkJICAgIHsKLQkJICAgICAgbWluX2Rpc3QgPSBkaXN0OwotCQkgICAgICBwZHJfaG9sZCA9IHBkcl9wdHI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgCi0JICBpZiAoIWJlc3RfcGRyIHx8IG1pbl9kaXN0IDwgYmVzdF9kaXN0KQotCSAgICB7Ci0JICAgICAgYmVzdF9kaXN0ID0gbWluX2Rpc3Q7Ci0JICAgICAgYmVzdF9mZHIgPSBmZHJfcHRyOwotCSAgICAgIGJlc3RfcGRyID0gcGRyX2hvbGQ7Ci0JICAgIH0KLQkgIC8qIGNvbnRpbnVlIGxvb3BpbmcgdW50aWwgYmFzZV9hZGRyIG9mIG5leHQgZW50cnkgaXMgZGlmZmVyZW50OiAqLwotCX0KLSAgICAgIHdoaWxlICgrK2kgPCBsaW5lX2luZm8tPmZkcnRhYl9sZW4KLQkgICAgICYmIHRhYltpXS5iYXNlX2FkZHIgPT0gdGFiW2kgLSAxXS5iYXNlX2FkZHIpOwotCi0gICAgICBpZiAoIWJlc3RfZmRyIHx8ICFiZXN0X3BkcikKLQlyZXR1cm4gZmFsc2U7CQkJLyogc2hvdWxkbid0IGhhcHBlbi4uLiAqLwotCi0gICAgICAvKiBwaGV3LCBmaW5hbGx5IHdlIGdvdCBzb21ldGhpbmcgdGhhdCB3ZSBjYW4gaG9sZCBvbnRvOiAqLwotICAgICAgZmRyX3B0ciA9IGJlc3RfZmRyOwotICAgICAgcGRyX3B0ciA9IGJlc3RfcGRyOwotICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpOwotICAgICAgLyogTm93IHdlIGNhbiBsb29rIGZvciB0aGUgYWN0dWFsIGxpbmUgbnVtYmVyLiAgVGhlIGxpbmUgbnVtYmVycwotICAgICAgICAgYXJlIHN0b3JlZCBpbiBhIHZlcnkgZnVua3kgZm9ybWF0LCB3aGljaCBJIHdvbid0IHRyeSB0bwotICAgICAgICAgZGVzY3JpYmUuICBUaGUgc2VhcmNoIGlzIGJvdW5kZWQgYnkgdGhlIGVuZCBvZiB0aGUgRkRScyBsaW5lCi0gICAgICAgICBudW1iZXIgZW50cmllcy4gICovCi0gICAgICBsaW5lX2VuZCA9IGRlYnVnX2luZm8tPmxpbmUgKyBmZHJfcHRyLT5jYkxpbmVPZmZzZXQgKyBmZHJfcHRyLT5jYkxpbmU7Ci0KLSAgICAgIC8qIE1ha2Ugb2Zmc2V0IHJlbGF0aXZlIHRvIHByb2NlZHVyZSBlbnRyeTogKi8KLSAgICAgIG9mZnNldCAtPSBwZHIuYWRyIC0gMHgxMCAqIHBkci5wcm9mOwotICAgICAgbGluZW5vID0gcGRyLmxuTG93OwotICAgICAgbGluZV9wdHIgPSBkZWJ1Z19pbmZvLT5saW5lICsgZmRyX3B0ci0+Y2JMaW5lT2Zmc2V0ICsgcGRyLmNiTGluZU9mZnNldDsKLSAgICAgIHdoaWxlIChsaW5lX3B0ciA8IGxpbmVfZW5kKQotCXsKLQkgIGludCBkZWx0YTsKLQkgIHVuc2lnbmVkIGludCBjb3VudDsKLQotCSAgZGVsdGEgPSAqbGluZV9wdHIgPj4gNDsKLQkgIGlmIChkZWx0YSA+PSAweDgpCi0JICAgIGRlbHRhIC09IDB4MTA7Ci0JICBjb3VudCA9ICgqbGluZV9wdHIgJiAweGYpICsgMTsKLQkgICsrbGluZV9wdHI7Ci0JICBpZiAoZGVsdGEgPT0gLTgpCi0JICAgIHsKLQkgICAgICBkZWx0YSA9ICgoKGxpbmVfcHRyWzBdKSAmIDB4ZmYpIDw8IDgpICsgKChsaW5lX3B0clsxXSkgJiAweGZmKTsKLQkgICAgICBpZiAoZGVsdGEgPj0gMHg4MDAwKQotCQlkZWx0YSAtPSAweDEwMDAwOwotCSAgICAgIGxpbmVfcHRyICs9IDI7Ci0JICAgIH0KLQkgIGxpbmVubyArPSBkZWx0YTsKLQkgIGlmIChvZmZzZXQgPCBjb3VudCAqIDQpCi0JICAgIHsKLQkgICAgICBsaW5lX2luZm8tPmNhY2hlLnN0b3AgKz0gY291bnQgKiA0IC0gb2Zmc2V0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvZmZzZXQgLT0gY291bnQgKiA0OwotCX0KLQotICAgICAgLyogSWYgZmRyX3B0ci0+cnNzIGlzIC0xLCB0aGVuIHRoaXMgZmlsZSBkb2VzIG5vdCBoYXZlIGZ1bGwKLSAgICAgICAgIHN5bWJvbHMsIGF0IGxlYXN0IGFjY29yZGluZyB0byBnZGIvbWlwc3JlYWQuYy4gICovCi0gICAgICBpZiAoZmRyX3B0ci0+cnNzID09IC0xKQotCXsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBOVUxMOwotCSAgaWYgKHBkci5pc3ltID09IC0xKQotCSAgICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBFWFRSIHByb2NfZXh0OwotCi0JICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikKLQkJKGFiZmQsCi0JCSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfZXh0Ci0JCSAgKyBwZHIuaXN5bSAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKSwKLQkJICZwcm9jX2V4dCk7Ci0JICAgICAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSAoZGVidWdfaW5mby0+c3NleHQKLQkJCQkJICAgICAgICsgcHJvY19leHQuYXN5bS5pc3MpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFNZTVIgcHJvY19zeW07Ci0KLQkgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSAoZGVidWdfaW5mby0+c3MKLQkJCQkgICAgICAgKyBmZHJfcHRyLT5pc3NCYXNlCi0JCQkJICAgICAgICsgZmRyX3B0ci0+cnNzKTsKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pCi0JICAgIChhYmZkLAotCSAgICAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCSAgICAgICsgKChmZHJfcHRyLT5pc3ltQmFzZSArIHBkci5pc3ltKQotCQkgKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSkpLAotCSAgICAgJnByb2Nfc3ltKTsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gKGRlYnVnX2luZm8tPnNzCi0JCQkJCSAgICsgZmRyX3B0ci0+aXNzQmFzZQotCQkJCQkgICArIHByb2Nfc3ltLmlzcyk7Ci0JfQotICAgICAgaWYgKGxpbmVubyA9PSBpbGluZU5pbCkKLQlsaW5lbm8gPSAwOwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5saW5lX251bSA9IGxpbmVubzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplOwotICAgICAgY29uc3QgY2hhciAqZGlyZWN0b3J5X25hbWU7Ci0gICAgICBjb25zdCBjaGFyICptYWluX2ZpbGVfbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmN1cnJlbnRfZmlsZV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmxpbmVfZmlsZV9uYW1lOwotICAgICAgYmZkX3ZtYSBsb3dfZnVuY192bWE7Ci0gICAgICBiZmRfdm1hIGxvd19saW5lX3ZtYTsKLSAgICAgIGJvb2xlYW4gcGFzdF9saW5lOwotICAgICAgYm9vbGVhbiBwYXN0X2ZuOwotICAgICAgY2hhciAqc3ltX3B0ciwgKnN5bV9wdHJfZW5kOwotICAgICAgc2l6ZV90IGxlbiwgZnVuY2xlbjsKLSAgICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgIC8qIFRoaXMgZmlsZSB1c2VzIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdoZW4gZ2NjIGlzIG5vdAotCSBvcHRpbWl6aW5nLCBpdCB3aWxsIHB1dCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gYmVmb3JlCi0JIHRoZSBmdW5jdGlvbiBuYW1lIHN0YWJzIGVudHJ5LiAgV2hlbiBnY2MgaXMgb3B0aW1pemluZywgaXQKLQkgd2lsbCBwdXQgdGhlIHN0YWJzIGVudHJ5IGZvciBhbGwgdGhlIGZ1bmN0aW9uIGZpcnN0LCBmb2xsb3dlZAotCSBieSB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAoVGhpcyBhcHBlYXJzIHRvIGhhcHBlbgotCSBiZWNhdXNlIG9mIHRoZSB0d28gb3V0cHV0IGZpbGVzIHVzZWQgYnkgdGhlIC1tZ3BvcHQgc3dpdGNoLAotCSB3aGljaCBpcyBpbXBsaWVkIGJ5IC1PKS4gIFRoaXMgbWVhbnMgdGhhdCB3ZSBtdXN0IGtlZXAKLQkgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2xzIHVudGlsIHdlIGZpbmQgYm90aCBhIGxpbmUgbnVtYmVyCi0JIGFuZCBhIGZ1bmN0aW9uIG5hbWUgd2hpY2ggYXJlIGJleW9uZCB0aGUgYWRkcmVzcyB3ZSB3YW50LiAgKi8KLQotICAgICAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IE5VTEw7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IE5VTEw7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtID0gMDsKLQotICAgICAgZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotICAgICAgbWFpbl9maWxlX25hbWUgPSBOVUxMOwotICAgICAgY3VycmVudF9maWxlX25hbWUgPSBOVUxMOwotICAgICAgZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0gICAgICBsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBsb3dfZnVuY192bWEgPSAwOwotICAgICAgbG93X2xpbmVfdm1hID0gMDsKLSAgICAgIHBhc3RfbGluZSA9IGZhbHNlOwotICAgICAgcGFzdF9mbiA9IGZhbHNlOwotCi0gICAgICBleHRlcm5hbF9zeW1fc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotCi0gICAgICBzeW1fcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCQkgKyAoZmRyX3B0ci0+aXN5bUJhc2UgKyAyKSAqIGV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgIHN5bV9wdHJfZW5kID0gc3ltX3B0ciArIChmZHJfcHRyLT5jc3ltIC0gMikgKiBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGZvciAoOwotCSAgIHN5bV9wdHIgPCBzeW1fcHRyX2VuZCAmJiAoISBwYXN0X2xpbmUgfHwgISBwYXN0X2ZuKTsKLQkgICBzeW1fcHRyICs9IGV4dGVybmFsX3N5bV9zaXplKQotCXsKLQkgIFNZTVIgc3ltOwotCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgc3ltX3B0ciwgJnN5bSk7Ci0KLQkgIGlmIChFQ09GRl9JU19TVEFCICgmc3ltKSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoRUNPRkZfVU5NQVJLX1NUQUIgKHN5bS5pbmRleCkpCi0JCXsKLQkJY2FzZSBOX1NPOgotCQkgIG1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPQotCQkgICAgZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzczsKLQotCQkgIC8qIENoZWNrIHRoZSBuZXh0IHN5bWJvbCB0byBzZWUgaWYgaXQgaXMgYWxzbyBhbgotICAgICAgICAgICAgICAgICAgICAgTl9TTyBzeW1ib2wuICAqLwotCQkgIGlmIChzeW1fcHRyICsgZXh0ZXJuYWxfc3ltX3NpemUgPCBzeW1fcHRyX2VuZCkKLQkJICAgIHsKLQkJICAgICAgU1lNUiBuZXh0c3ltOwotCi0JCSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLAotCQkJCQkJICBzeW1fcHRyICsgZXh0ZXJuYWxfc3ltX3NpemUsCi0JCQkJCQkgICZuZXh0c3ltKTsKLQkJICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZuZXh0c3ltKQotCQkJICAmJiBFQ09GRl9VTk1BUktfU1RBQiAobmV4dHN5bS5pbmRleCkgPT0gTl9TTykKLQkJCXsKLSAJCQkgIGRpcmVjdG9yeV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JCQkgIG1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPQotCQkJICAgIGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIG5leHRzeW0uaXNzOwotCQkJICBzeW1fcHRyICs9IGV4dGVybmFsX3N5bV9zaXplOwotCQkJfQotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgTl9TT0w6Ci0JCSAgY3VycmVudF9maWxlX25hbWUgPQotCQkgICAgZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzczsKLQkJICBicmVhazsKLQotCQljYXNlIE5fRlVOOgotCQkgIGlmIChzeW0udmFsdWUgPiBvZmZzZXQpCi0JCSAgICBwYXN0X2ZuID0gdHJ1ZTsKLQkJICBlbHNlIGlmIChzeW0udmFsdWUgPj0gbG93X2Z1bmNfdm1hKQotCQkgICAgewotCQkgICAgICBsb3dfZnVuY192bWEgPSBzeW0udmFsdWU7Ci0JCSAgICAgIGZ1bmN0aW9uX25hbWUgPQotCQkJZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzczsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzeW0uc3QgPT0gc3RMYWJlbCAmJiBzeW0uaW5kZXggIT0gaW5kZXhOaWwpCi0JICAgIHsKLQkgICAgICBpZiAoc3ltLnZhbHVlID4gb2Zmc2V0KQotCQlwYXN0X2xpbmUgPSB0cnVlOwotCSAgICAgIGVsc2UgaWYgKHN5bS52YWx1ZSA+PSBsb3dfbGluZV92bWEpCi0JCXsKLQkJICBsb3dfbGluZV92bWEgPSBzeW0udmFsdWU7Ci0JCSAgbGluZV9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKLQkJICBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtID0gc3ltLmluZGV4OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtICE9IDApCi0JbWFpbl9maWxlX25hbWUgPSBsaW5lX2ZpbGVfbmFtZTsKLQotICAgICAgLyogV2UgbmVlZCB0byByZW1vdmUgdGhlIHN0dWZmIGFmdGVyIHRoZSBjb2xvbiBpbiB0aGUgZnVuY3Rpb24KLSAgICAgICAgIG5hbWUuICBXZSBhbHNvIG5lZWQgdG8gcHV0IHRoZSBkaXJlY3RvcnkgbmFtZSBhbmQgdGhlIGZpbGUKLSAgICAgICAgIG5hbWUgdG9nZXRoZXIuICAqLwotICAgICAgaWYgKGZ1bmN0aW9uX25hbWUgPT0gTlVMTCkKLQlsZW4gPSBmdW5jbGVuID0gMDsKLSAgICAgIGVsc2UKLQlsZW4gPSBmdW5jbGVuID0gc3RybGVuIChmdW5jdGlvbl9uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChtYWluX2ZpbGVfbmFtZSAhPSBOVUxMCi0JICAmJiBkaXJlY3RvcnlfbmFtZSAhPSBOVUxMCi0JICAmJiBtYWluX2ZpbGVfbmFtZVswXSAhPSAnLycpCi0JbGVuICs9IHN0cmxlbiAoZGlyZWN0b3J5X25hbWUpICsgc3RybGVuIChtYWluX2ZpbGVfbmFtZSkgKyAxOwotCi0gICAgICBpZiAobGVuICE9IDApCi0JewotCSAgaWYgKGxpbmVfaW5mby0+ZmluZF9idWZmZXIgIT0gTlVMTCkKLQkgICAgZnJlZSAobGluZV9pbmZvLT5maW5kX2J1ZmZlcik7Ci0JICBidWZmZXIgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChsZW4pOwotCSAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBsaW5lX2luZm8tPmZpbmRfYnVmZmVyID0gYnVmZmVyOwotCX0KLQotICAgICAgaWYgKGZ1bmN0aW9uX25hbWUgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpjb2xvbjsKLQotCSAgc3RyY3B5IChidWZmZXIsIGZ1bmN0aW9uX25hbWUpOwotCSAgY29sb24gPSBzdHJjaHIgKGJ1ZmZlciwgJzonKTsKLQkgIGlmIChjb2xvbiAhPSBOVUxMKQotCSAgICAqY29sb24gPSAnXDAnOwotCSAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSBidWZmZXI7Ci0JfQotCi0gICAgICBpZiAobWFpbl9maWxlX25hbWUgIT0gTlVMTCkKLQl7Ci0JICBpZiAoZGlyZWN0b3J5X25hbWUgPT0gTlVMTCB8fCBtYWluX2ZpbGVfbmFtZVswXSA9PSAnLycpCi0JICAgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBtYWluX2ZpbGVfbmFtZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNwcmludGYgKGJ1ZmZlciArIGZ1bmNsZW4sICIlcyVzIiwgZGlyZWN0b3J5X25hbWUsCi0JCSAgICAgICBtYWluX2ZpbGVfbmFtZSk7Ci0JICAgICAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IGJ1ZmZlciArIGZ1bmNsZW47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEbyB0aGUgd29yayBvZiBmaW5kX25lYXJlc3RfbGluZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwKLQkJCWxpbmVfaW5mbywgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCByZXRsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwOwotICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyOwotewotICBvZmZzZXQgKz0gc2VjdGlvbi0+dm1hOwotCi0gIGlmIChsaW5lX2luZm8tPmNhY2hlLnNlY3QgPT0gTlVMTAotICAgICAgfHwgbGluZV9pbmZvLT5jYWNoZS5zZWN0ICE9IHNlY3Rpb24KLSAgICAgIHx8IG9mZnNldCA8IGxpbmVfaW5mby0+Y2FjaGUuc3RhcnQKLSAgICAgIHx8IG9mZnNldCA+PSBsaW5lX2luZm8tPmNhY2hlLnN0b3ApCi0gICAgewotICAgICAgbGluZV9pbmZvLT5jYWNoZS5zZWN0ID0gc2VjdGlvbjsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc3RhcnQgPSBvZmZzZXQ7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLnN0b3AgPSBvZmZzZXQ7Ci0gICAgICBpZiAoISBsb29rdXBfbGluZSAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKSkKLQl7Ci0JICBsaW5lX2luZm8tPmNhY2hlLnNlY3QgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWU7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWU7Ci0gICpyZXRsaW5lX3B0ciA9IGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGVzZSByb3V0aW5lcyBjb3B5IHN5bWJvbGljIGluZm9ybWF0aW9uIGludG8gYSBtZW1vcnkgYnVmZmVyLgotCi0gICBGSVhNRTogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBzaHVmZmxlIGNvZGUgaXMgdG8gYXZvaWQgc3RvcmluZwotICAgZXZlcnl0aGluZyBpbiBtZW1vcnksIHNpbmNlIHRoZSBsaW5rZXIgaXMgc3VjaCBhIG1lbW9yeSBob2cuICBUaGlzCi0gICBjb2RlIG1ha2VzIHRoYXQgZWZmb3J0IHVzZWxlc3MuICBJdCBpcyBvbmx5IGNhbGxlZCBieSB0aGUgTUlQUyBFTEYKLSAgIGNvZGUgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHNvIGl0IGlzIG5vdCB0aGF0IGJpZyBhCi0gICBkZWFsLCBidXQgaXQgc2hvdWxkIGJlIGZpeGVkIGV2ZW50dWFsbHkuICAqLwotCi0vKiBDb2xsZWN0IGEgc2h1ZmZsZSBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCi0KLXN0YXRpYyBib29sZWFuIGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSBQQVJBTVMgKChzdHJ1Y3Qgc2h1ZmZsZSAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9jb2xsZWN0X3NodWZmbGUgKGwsIGJ1ZmYpCi0gICAgIHN0cnVjdCBzaHVmZmxlICpsOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLQotICB0b3RhbCA9IDA7Ci0gIGZvciAoOyBsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBsLT5maWxlcCkKLQltZW1jcHkgKGJ1ZmYsIGwtPnUubWVtb3J5LCBsLT5zaXplKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGwtPnUuZmlsZS5pbnB1dF9iZmQsIGwtPnUuZmlsZS5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3JlYWQgKGJ1ZmYsIDEsIGwtPnNpemUsIGwtPnUuZmlsZS5pbnB1dF9iZmQpICE9IGwtPnNpemUpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICB0b3RhbCArPSBsLT5zaXplOwotICAgICAgYnVmZiArPSBsLT5zaXplOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBQRFIgaW5mb3JtYXRpb24gaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgKGhhbmRsZSwgYnVmZikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmY7Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSAoYWluZm8tPnBkciwgYnVmZik7Ci19Ci0KLS8qIENvcHkgc3ltYm9sIGluZm9ybWF0aW9uIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIChoYW5kbGUsIGJ1ZmYpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF9ieXRlICpidWZmOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBlY29mZl9jb2xsZWN0X3NodWZmbGUgKGFpbmZvLT5zeW0sIGJ1ZmYpOwotfQotCi0vKiBDb3B5IHRoZSBzdHJpbmcgdGFibGUgaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyAoaGFuZGxlLCBidWZmKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLSAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIGlzIHdyaXR0ZW4gb3V0IGZyb20gdGhlIGhhc2ggdGFibGUgaWYgdGhpcyBpcyBhCi0gICAgIGZpbmFsIGxpbmsuICAqLwotICBCRkRfQVNTRVJUIChhaW5mby0+c3MgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpOwotICAqYnVmZisrID0gJ1wwJzsKLSAgdG90YWwgPSAxOwotICBCRkRfQVNTRVJUIChhaW5mby0+c3NfaGFzaCA9PSBOVUxMIHx8IGFpbmZvLT5zc19oYXNoLT52YWwgPT0gMSk7Ci0gIGZvciAoc2ggPSBhaW5mby0+c3NfaGFzaDsKLSAgICAgICBzaCAhPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEw7Ci0gICAgICAgc2ggPSBzaC0+bmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKHNoLT5yb290LnN0cmluZyk7Ci0gICAgICBtZW1jcHkgKGJ1ZmYsIChQVFIpIHNoLT5yb290LnN0cmluZywgbGVuICsgMSk7Ci0gICAgICB0b3RhbCArPSBsZW4gKyAxOwotICAgICAgYnVmZiArPSBsZW4gKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lY29mZnN3YXAuaCBiL2JmZC9lY29mZnN3YXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyOGQxNi4uMDAwMDAwMAotLS0gYS9iZmQvZWNvZmZzd2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NTMgKzAsMCBAQAotLyogR2VuZXJpYyBFQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGEgaGVhZGVyIGZpbGUsIGJ1dCBpdCBjb250YWlucyBleGVjdXRhYmxlIHJvdXRpbmVzLgotICAgVGhpcyBpcyBkb25lIHRoaXMgd2F5IGJlY2F1c2UgdGhlc2Ugcm91dGluZXMgYXJlIHN1YnN0YW50aWFsbHkKLSAgIHNpbWlsYXIsIGJ1dCBhcmUgbm90IGlkZW50aWNhbCwgZm9yIGFsbCBFQ09GRiB0YXJnZXRzLgotCi0gICBUaGVzZSBhcmUgcm91dGluZXMgdG8gc3dhcCB0aGUgRUNPRkYgc3ltYm9saWMgaW5mb3JtYXRpb24gaW4gYW5kCi0gICBvdXQuICBUaGUgcm91dGluZXMgYXJlIGRlZmluZWQgc3RhdGljYWxseS4gIFlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzCi0gICBvbiB0aGVtIGluIGdkYiBieSBuYW1pbmcgdGhlIGluY2x1ZGluZyBzb3VyY2UgZmlsZTsgZS5nLiwKLSAgICdjb2ZmLW1pcHMuYyc6ZWNvZmZfc3dhcF9oZHJfaW4uCi0KLSAgIEJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZSwgb25lIG9mIEVDT0ZGXzMyIG9yIEVDT0ZGXzY0IG11c3QKLSAgIGJlIGRlZmluZWQuICBUaGVzZSBhcmUgY2hlY2tlZCB3aGVuIHN3YXBwaW5nIGluZm9ybWF0aW9uIHRoYXQKLSAgIGRlcGVuZHMgdXBvbiB0aGUgdGFyZ2V0IHNpemUuICBUaGlzIGNvZGUgd29ya3MgZm9yIDMyIGJpdCBhbmQgNjQKLSAgIGJpdCBFQ09GRiwgYnV0IG1heSBuZWVkIHRvIGJlIGdlbmVyYWxpemVkIGluIHRoZSBmdXR1cmUuCi0KLSAgIFNvbWUgaGVhZGVyIGZpbGUgd2hpY2ggZGVmaW5lcyB0aGUgZXh0ZXJuYWwgZm9ybXMgb2YgdGhlc2UKLSAgIHN0cnVjdHVyZXMgbXVzdCBhbHNvIGJlIGluY2x1ZGVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZS4KLSAgIEN1cnJlbnRseSB0aGlzIGlzIGVpdGhlciBjb2ZmL21pcHMuaCBvciBjb2ZmL2FscGhhLmguCi0KLSAgIElmIHRoZSBzeW1ib2wgVEVTVCBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLCBhCi0gICBjb21wYXJpc29uIGlzIG1hZGUgdG8gZW5zdXJlIHRoYXQsIGluIGZhY3QsIHRoZSBvdXRwdXQgaXMKLSAgIGJpdC1mb3ItYml0IHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4gIE9mIGNvdXJzZSwgdGhpcyBzeW1ib2wgc2hvdWxkCi0gICBvbmx5IGJlIGRlZmluZWQgd2hlbiBkZWxpYmVyYXRlbHkgdGVzdGluZyB0aGUgY29kZSBvbiBhIG1hY2hpbmUKLSAgIHdpdGggdGhlIHByb3BlciBieXRlIHNleCBhbmQgc3VjaC4gICovCi0KLSNpZmRlZiBFQ09GRl8zMgotI2RlZmluZSBlY29mZl9nZXRfb2ZmIGJmZF9oX2dldF8zMgotI2RlZmluZSBlY29mZl9wdXRfb2ZmIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSNkZWZpbmUgZWNvZmZfZ2V0X29mZiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgZWNvZmZfcHV0X29mZiBiZmRfaF9wdXRfNjQKLSNlbmRpZgotCi0vKiBFQ09GRiBhdXhpbGlhcnkgaW5mb3JtYXRpb24gc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdGhlIHNhbWUKLSAgIGZvciBhbGwgRUNPRkYgdGFyZ2V0cywgc28gdGhleSBhcmUgZGVmaW5lZCBpbiBlY29mZmxpbmsuYy4gICovCi0KLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4KLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqLCBUSVIgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQKLSAgUEFSQU1TICgoaW50LCBjb25zdCBUSVIgKiwgc3RydWN0IHRpcl9leHQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4KLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKiwgUk5EWFIgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgUk5EWFIgKiwgc3RydWN0IHJuZHhfZXh0ICopKTsKLQotLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9oZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgSERSUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2hkcl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEhEUlIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Zkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBGRFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9mZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3Bkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQRFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9wZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQRFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfc3ltX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZXh0X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9leHRfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9yZmRfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3JmZF9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IFJGRFQgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX29wdF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBPUFRSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfb3B0X291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgT1BUUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZG5yX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEROUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Rucl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEROUiAqLCBQVFIpKTsKLQotLyogU3dhcCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfaGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgSERSUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgaGRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGhkcl9leHQgKikgZXh0X2NvcHk7Ci0KLSAgaW50ZXJuLT5tYWdpYyAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX21hZ2ljKTsKLSAgaW50ZXJuLT52c3RhbXAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX3ZzdGFtcCk7Ci0gIGludGVybi0+aWxpbmVNYXggICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lsaW5lTWF4KTsKLSAgaW50ZXJuLT5jYkxpbmUgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZSk7Ci0gIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmVPZmZzZXQpOwotICBpbnRlcm4tPmlkbk1heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZG5NYXgpOwotICBpbnRlcm4tPmNiRG5PZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JEbk9mZnNldCk7Ci0gIGludGVybi0+aXBkTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lwZE1heCk7Ci0gIGludGVybi0+Y2JQZE9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlBkT2Zmc2V0KTsKLSAgaW50ZXJuLT5pc3ltTWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXN5bU1heCk7Ci0gIGludGVybi0+Y2JTeW1PZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlN5bU9mZnNldCk7Ci0gIGludGVybi0+aW9wdE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lvcHRNYXgpOwotICBpbnRlcm4tPmNiT3B0T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JPcHRPZmZzZXQpOwotICBpbnRlcm4tPmlhdXhNYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pYXV4TWF4KTsKLSAgaW50ZXJuLT5jYkF1eE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiQXV4T2Zmc2V0KTsKLSAgaW50ZXJuLT5pc3NNYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXNzTWF4KTsKLSAgaW50ZXJuLT5jYlNzT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NPZmZzZXQpOwotICBpbnRlcm4tPmlzc0V4dE1heCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NFeHRNYXgpOwotICBpbnRlcm4tPmNiU3NFeHRPZmZzZXQgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc0V4dE9mZnNldCk7Ci0gIGludGVybi0+aWZkTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lmZE1heCk7Ci0gIGludGVybi0+Y2JGZE9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkZkT2Zmc2V0KTsKLSAgaW50ZXJuLT5jcmZkICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY3JmZCk7Ci0gIGludGVybi0+Y2JSZmRPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlJmZE9mZnNldCk7Ci0gIGludGVybi0+aWV4dE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lleHRNYXgpOwotICBpbnRlcm4tPmNiRXh0T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JFeHRPZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCB0aGUgc3ltYm9saWMgaGVhZGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfaGRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgSERSUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgaGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBoZHJfZXh0ICopIGV4dF9wdHI7Ci0gIEhEUlIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7Ci0KLSAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT5tYWdpYywgKGJmZF9ieXRlICopZXh0LT5oX21hZ2ljKTsKLSAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT52c3RhbXAsIChiZmRfYnl0ZSAqKWV4dC0+aF92c3RhbXApOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmVNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pbGluZU1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lLCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmVPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWRuTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWRuTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkRuT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JEbk9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pcGRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pcGRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiUGRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlBkT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW1NYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3ltTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlN5bU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3ltT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pb3B0TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYk9wdE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiT3B0T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlhdXhNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pYXV4TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkF1eE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiQXV4T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc01heCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc01heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTc09mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzRXh0TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXNzRXh0TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzRXh0T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc0V4dE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pZmRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZmRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiRmRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkZkT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNyZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jcmZkKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlJmZE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUmZkT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlleHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZXh0TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkV4dE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRXh0T2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Zkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEZEUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgZmRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGZkcl9leHQgKikgZXh0X2NvcHk7Ci0gIAotICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfYWRyKTsKLSAgaW50ZXJuLT5yc3MgICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfcnNzKTsKLSNpZmRlZiBFQ09GRl82NAotICBpZiAoaW50ZXJuLT5yc3MgPT0gMHhmZmZmZmZmZikKLSAgICBpbnRlcm4tPnJzcyA9IC0xOwotI2VuZGlmCi0gIGludGVybi0+aXNzQmFzZSAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lzc0Jhc2UpOwotICBpbnRlcm4tPmNiU3MgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JTcyk7Ci0gIGludGVybi0+aXN5bUJhc2UgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lzeW1CYXNlKTsKLSAgaW50ZXJuLT5jc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3N5bSk7Ci0gIGludGVybi0+aWxpbmVCYXNlICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lsaW5lQmFzZSk7Ci0gIGludGVybi0+Y2xpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NsaW5lKTsKLSAgaW50ZXJuLT5pb3B0QmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaW9wdEJhc2UpOwotICBpbnRlcm4tPmNvcHQgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jb3B0KTsKLSNpZmRlZiBFQ09GRl8zMgotICBpbnRlcm4tPmlwZEZpcnN0ICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGludGVybi0+Y3BkICAgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBpbnRlcm4tPmlwZEZpcnN0ICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGludGVybi0+Y3BkICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSAgaW50ZXJuLT5pYXV4QmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaWF1eEJhc2UpOwotICBpbnRlcm4tPmNhdXggICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYXV4KTsKLSAgaW50ZXJuLT5yZmRCYXNlICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfcmZkQmFzZSk7Ci0gIGludGVybi0+Y3JmZCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NyZmQpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgaW50ZXJuLT5sYW5nICAgICAgICA9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfTEFOR19CSUcpCi0JCQkJCT4+IEZEUl9CSVRTMV9MQU5HX1NIX0JJRzsKLSAgICBpbnRlcm4tPmZNZXJnZSAgICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZNRVJHRV9CSUcpOwotICAgIGludGVybi0+ZlJlYWRpbiAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRlJFQURJTl9CSUcpOwotICAgIGludGVybi0+ZkJpZ2VuZGlhbiAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRkJJR0VORElBTl9CSUcpOwotICAgIGludGVybi0+Z2xldmVsICAgICAgPSAoZXh0LT5mX2JpdHMyWzBdICYgRkRSX0JJVFMyX0dMRVZFTF9CSUcpCi0JCQkJCT4+IEZEUl9CSVRTMl9HTEVWRUxfU0hfQklHOwotICB9IGVsc2UgewotICAgIGludGVybi0+bGFuZyAgICAgICAgPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0xBTkdfTElUVExFKQotCQkJCQk+PiBGRFJfQklUUzFfTEFOR19TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT5mTWVyZ2UgICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GTUVSR0VfTElUVExFKTsKLSAgICBpbnRlcm4tPmZSZWFkaW4gICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFKTsKLSAgICBpbnRlcm4tPmZCaWdlbmRpYW4gID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFKTsKLSAgICBpbnRlcm4tPmdsZXZlbCAgICAgID0gKGV4dC0+Zl9iaXRzMlswXSAmIEZEUl9CSVRTMl9HTEVWRUxfTElUVExFKQotCQkJCQk+PiBGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRTsKLSAgfQotICBpbnRlcm4tPnJlc2VydmVkID0gMDsKLQotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lT2Zmc2V0KTsKLSAgaW50ZXJuLT5jYkxpbmUgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZmRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRkRSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBmZHJfZXh0ICpleHQgPSAoc3RydWN0IGZkcl9leHQgKikgZXh0X3B0cjsKLSAgRkRSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5hZHIsIChiZmRfYnl0ZSAqKWV4dC0+Zl9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cnNzLCAoYmZkX2J5dGUgKilleHQtPmZfcnNzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc0Jhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3NCYXNlKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzLCAoYmZkX2J5dGUgKilleHQtPmZfY2JTcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lzeW1CYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNzeW0sIChiZmRfYnl0ZSAqKWV4dC0+Zl9jc3ltKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lsaW5lQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jbGluZSwgKGJmZF9ieXRlICopZXh0LT5mX2NsaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHRCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaW9wdEJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y29wdCwgKGJmZF9ieXRlICopZXh0LT5mX2NvcHQpOwotI2lmZGVmIEVDT0ZGXzMyCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5pcGRGaXJzdCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmNwZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXBkRmlyc3QsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jcGQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOwotI2VuZGlmCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pYXV4QmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lhdXhCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNhdXgsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJmZEJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yZmRCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNyZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcmZkKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGV4dC0+Zl9iaXRzMVswXSA9ICgoKGludGVybi0+bGFuZyA8PCBGRFJfQklUUzFfTEFOR19TSF9CSUcpCi0JCQkmIEZEUl9CSVRTMV9MQU5HX0JJRykKLQkJICAgICAgIHwgKGludGVybi0+Zk1lcmdlID8gRkRSX0JJVFMxX0ZNRVJHRV9CSUcgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mUmVhZGluID8gRkRSX0JJVFMxX0ZSRUFESU5fQklHIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZkJpZ2VuZGlhbiA/IEZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRyA6IDApKTsKLSAgICBleHQtPmZfYml0czJbMF0gPSAoKGludGVybi0+Z2xldmVsIDw8IEZEUl9CSVRTMl9HTEVWRUxfU0hfQklHKQotCQkgICAgICAgJiBGRFJfQklUUzJfR0xFVkVMX0JJRyk7Ci0gICAgZXh0LT5mX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmZfYml0czJbMl0gPSAwOwotICB9IGVsc2UgewotICAgIGV4dC0+Zl9iaXRzMVswXSA9ICgoKGludGVybi0+bGFuZyA8PCBGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUpCi0JCQkmIEZEUl9CSVRTMV9MQU5HX0xJVFRMRSkKLQkJICAgICAgIHwgKGludGVybi0+Zk1lcmdlID8gRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mUmVhZGluID8gRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZkJpZ2VuZGlhbiA/IEZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRSA6IDApKTsKLSAgICBleHQtPmZfYml0czJbMF0gPSAoKGludGVybi0+Z2xldmVsIDw8IEZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFKQotCQkgICAgICAgJiBGRFJfQklUUzJfR0xFVkVMX0xJVFRMRSk7Ci0gICAgZXh0LT5mX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmZfYml0czJbMl0gPSAwOwotICB9Ci0KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmVPZmZzZXQpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZSwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLSNpZm5kZWYgTVBXX0MKLQotLyogU3dhcCBpbiB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgUERSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBwZHJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfY29weTsKLQotICBtZW1zZXQgKChQVFIpIGludGVybiwgMCwgc2l6ZW9mICgqaW50ZXJuKSk7Ci0KLSAgaW50ZXJuLT5hZHIgICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGludGVybi0+aXN5bSAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOwotICBpbnRlcm4tPmlsaW5lICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7Ci0gIGludGVybi0+cmVnbWFzayAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBpbnRlcm4tPnJlZ29mZnNldCAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGludGVybi0+aW9wdCAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgaW50ZXJuLT5mcmVnbWFzayAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBpbnRlcm4tPmZyZWdvZmZzZXQgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lb2Zmc2V0ICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKLSAgaW50ZXJuLT5mcmFtZXJlZyAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOwotICBpbnRlcm4tPnBjcmVnICAgICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7Ci0gIGludGVybi0+bG5Mb3cgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKLSAgaW50ZXJuLT5sbkhpZ2ggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBFQ09GRl82NAotICBpbnRlcm4tPmdwX3Byb2xvZ3VlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnBfZ3BfcHJvbG9ndWUpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBpbnRlcm4tPmdwX3VzZWQgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfR1BfVVNFRF9CSUcpOwotICAgICAgaW50ZXJuLT5yZWdfZnJhbWUgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRyk7Ci0gICAgICBpbnRlcm4tPnByb2YgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUFJPRl9CSUcpOwotICAgICAgaW50ZXJuLT5yZXNlcnZlZCA9ICgoKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRVNFUlZFRF9CSUcpCi0JCQkgICA8PCBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcpCi0JCQkgIHwgKChleHQtPnBfYml0czJbMF0gJiBQRFJfQklUUzJfUkVTRVJWRURfQklHKQotCQkJICAgICA+PiBQRFJfQklUUzJfUkVTRVJWRURfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuLT5ncF91c2VkID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX0dQX1VTRURfTElUVExFKTsKLSAgICAgIGludGVybi0+cmVnX2ZyYW1lID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFR19GUkFNRV9MSVRUTEUpOwotICAgICAgaW50ZXJuLT5wcm9mID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1BST0ZfTElUVExFKTsKLSAgICAgIGludGVybi0+cmVzZXJ2ZWQgPSAoKChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFKQotCQkJICAgPj4gUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRSkKLQkJCSAgfCAoKGV4dC0+cF9iaXRzMlswXSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9MSVRUTEUpCi0JCQkgICAgIDw8IFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRSkpOwotICAgIH0KLSAgaW50ZXJuLT5sb2NhbG9mZiA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5wX2xvY2Fsb2ZmKTsKLSNlbmRpZiAgCi0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9wZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBQRFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IHBkcl9leHQgKmV4dCA9IChzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfcHRyOwotICBQRFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmFkciwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZSwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0LCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyYW1lb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+ZnJhbWVyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5wY3JlZywgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuTG93LCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5IaWdoLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOwotCi0jaWZkZWYgRUNPRkZfNjQKLSAgYmZkX2hfcHV0XzggKGFiZmQsIGludGVybi0+Z3BfcHJvbG9ndWUsIChiZmRfYnl0ZSAqKSBleHQtPnBfZ3BfcHJvbG9ndWUpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBleHQtPnBfYml0czFbMF0gPSAoKGludGVybi0+Z3BfdXNlZCA/IFBEUl9CSVRTMV9HUF9VU0VEX0JJRyA6IDApCi0JCQkgfCAoaW50ZXJuLT5yZWdfZnJhbWUgPyBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRyA6IDApCi0JCQkgfCAoaW50ZXJuLT5wcm9mID8gUERSX0JJVFMxX1BST0ZfQklHIDogMCkKLQkJCSB8ICgoaW50ZXJuLT5yZXNlcnZlZAotCQkJICAgICA+PiBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcpCi0JCQkgICAgJiBQRFJfQklUUzFfUkVTRVJWRURfQklHKSk7Ci0gICAgICBleHQtPnBfYml0czJbMF0gPSAoKGludGVybi0+cmVzZXJ2ZWQgPDwgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0JJRykKLQkJCSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dC0+cF9iaXRzMVswXSA9ICgoaW50ZXJuLT5ncF91c2VkID8gUERSX0JJVFMxX0dQX1VTRURfTElUVExFIDogMCkKLQkJCSB8IChpbnRlcm4tPnJlZ19mcmFtZSA/IFBEUl9CSVRTMV9SRUdfRlJBTUVfTElUVExFIDogMCkKLQkJCSB8IChpbnRlcm4tPnByb2YgPyBQRFJfQklUUzFfUFJPRl9MSVRUTEUgOiAwKQotCQkJIHwgKChpbnRlcm4tPnJlc2VydmVkIDw8IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUpCi0JCQkgICAgJiBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFKSk7Ci0gICAgICBleHQtPnBfYml0czJbMF0gPSAoKGludGVybi0+cmVzZXJ2ZWQgPj4KLQkJCSAgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFKQotCQkJICYgUERSX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSk7Ci0gICAgfQotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW50ZXJuLT5sb2NhbG9mZiwgKGJmZF9ieXRlICopIGV4dC0+cF9sb2NhbG9mZik7Ci0jZW5kaWYgIAotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0jZWxzZSAvKiBNUFdfQyAqLwotLyogU2FtZSByb3V0aW5lcywgYnV0IHdpdGggRUNPRkZfNjQgY29kZSByZW1vdmVkLCBzbyBeJiUkIyYhIE1QVyBDIGRvZXNuJ3QKLSAgIGNvcnJ1cHQgaXRzZWxmIGFuZCB0aGVuIGZyZWFrIG91dC4gKi8KLS8qIFN3YXAgaW4gdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIFBEUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgcGRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IHBkcl9leHQgKikgZXh0X2NvcHk7Ci0gIAotICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgaW50ZXJuLT5pc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGludGVybi0+aWxpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgaW50ZXJuLT5yZWdtYXNrICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7Ci0gIGludGVybi0+cmVnb2Zmc2V0ICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgaW50ZXJuLT5pb3B0ICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOwotICBpbnRlcm4tPmZyZWdtYXNrICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7Ci0gIGludGVybi0+ZnJlZ29mZnNldCAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7Ci0gIGludGVybi0+ZnJhbWVvZmZzZXQgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lcmVnICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGludGVybi0+cGNyZWcgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgaW50ZXJuLT5sbkxvdyAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBpbnRlcm4tPmxuSGlnaCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFBEUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgcGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9wdHI7Ci0gIFBEUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+YWRyLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW0sIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJhbWVvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5mcmFtZXJlZywgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPnBjcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5Mb3csIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkhpZ2gsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0jZW5kaWYgLyogTVBXX0MgKi8KLQotLyogU3dhcCBpbiBhIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBTWU1SICppbnRlcm47Ci17Ci0gIHN0cnVjdCBzeW1fZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3Qgc3ltX2V4dCAqKSBleHRfY29weTsKLSAgCi0gIGludGVybi0+aXNzICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5zX2lzcyk7Ci0gIGludGVybi0+dmFsdWUgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+c192YWx1ZSk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBpbnRlcm4tPnN0ICAgICAgICAgID0gIChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU1RfQklHKQotCQkJCQkgICA+PiBTWU1fQklUUzFfU1RfU0hfQklHOwotICAgIGludGVybi0+c2MgICAgICAgICAgPSAoKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TQ19CSUcpCi0JCQkJCSAgIDw8IFNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRykKLQkJCXwgKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfU0NfQklHKQotCQkJCQkgICA+PiBTWU1fQklUUzJfU0NfU0hfQklHKTsKLSAgICBpbnRlcm4tPnJlc2VydmVkICAgID0gMCAhPSAoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1JFU0VSVkVEX0JJRyk7Ci0gICAgaW50ZXJuLT5pbmRleCAgICAgICA9ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX0lOREVYX0JJRykKLQkJCQkJICAgPDwgU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHKQotCQkJfCAoZXh0LT5zX2JpdHMzWzBdIDw8IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRykKLQkJCXwgKGV4dC0+c19iaXRzNFswXSA8PCBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcpOwotICB9IGVsc2UgewotICAgIGludGVybi0+c3QgICAgICAgICAgPSAgKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TVF9MSVRUTEUpCi0JCQkJCSAgID4+IFNZTV9CSVRTMV9TVF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT5zYyAgICAgICAgICA9ICgoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NDX0xJVFRMRSkKLQkJCQkJICAgPj4gU1lNX0JJVFMxX1NDX1NIX0xJVFRMRSkKLQkJCXwgKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfU0NfTElUVExFKQotCQkJCQkgICA8PCBTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUpOwotICAgIGludGVybi0+cmVzZXJ2ZWQgICAgPSAwICE9IChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfUkVTRVJWRURfTElUVExFKTsKLSAgICBpbnRlcm4tPmluZGV4ICAgICAgID0gKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfSU5ERVhfTElUVExFKQotCQkJCQkgICA+PiBTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFKQotCQkJfCAoZXh0LT5zX2JpdHMzWzBdIDw8IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRSkKLQkJCXwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+c19iaXRzNFswXQotCQkJICAgPDwgU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFKTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBTWU1SICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBzeW1fZXh0ICpleHQgPSAoc3RydWN0IHN5bV9leHQgKikgZXh0X3B0cjsKLSAgU1lNUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3MsIChiZmRfYnl0ZSAqKWV4dC0+c19pc3MpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPnZhbHVlLCAoYmZkX2J5dGUgKilleHQtPnNfdmFsdWUpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgZXh0LT5zX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5zdCA8PCBTWU1fQklUUzFfU1RfU0hfQklHKQotCQkJJiBTWU1fQklUUzFfU1RfQklHKQotCQkgICAgICAgfCAoKGludGVybi0+c2MgPj4gU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHKQotCQkJICAmIFNZTV9CSVRTMV9TQ19CSUcpKTsKLSAgICBleHQtPnNfYml0czJbMF0gPSAoKChpbnRlcm4tPnNjIDw8IFNZTV9CSVRTMl9TQ19TSF9CSUcpCi0JCQkmIFNZTV9CSVRTMl9TQ19CSUcpCi0JCSAgICAgICB8IChpbnRlcm4tPnJlc2VydmVkID8gU1lNX0JJVFMyX1JFU0VSVkVEX0JJRyA6IDApCi0JCSAgICAgICB8ICgoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCQkgICYgU1lNX0JJVFMyX0lOREVYX0JJRykpOwotICAgIGV4dC0+c19iaXRzM1swXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRykgJiAweGZmOwotICAgIGV4dC0+c19iaXRzNFswXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRykgJiAweGZmOwotICB9IGVsc2UgewotICAgIGV4dC0+c19iaXRzMVswXSA9ICgoKGludGVybi0+c3QgPDwgU1lNX0JJVFMxX1NUX1NIX0xJVFRMRSkKLQkJCSYgU1lNX0JJVFMxX1NUX0xJVFRMRSkKLQkJICAgICAgIHwgKChpbnRlcm4tPnNjIDw8IFNZTV9CSVRTMV9TQ19TSF9MSVRUTEUpCi0JCQkgICYgU1lNX0JJVFMxX1NDX0xJVFRMRSkpOwotICAgIGV4dC0+c19iaXRzMlswXSA9ICgoKGludGVybi0+c2MgPj4gU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFKQotCQkJJiBTWU1fQklUUzJfU0NfTElUVExFKQotCQkgICAgICAgfCAoaW50ZXJuLT5yZXNlcnZlZCA/IFNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoKGludGVybi0+aW5kZXggPDwgU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRSkKLQkJCSAgJiBTWU1fQklUUzJfSU5ERVhfTElUVExFKSk7Ci0gICAgZXh0LT5zX2JpdHMzWzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFKSAmIDB4ZmY7Ci0gICAgZXh0LT5zX2JpdHM0WzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFKSAmIDB4ZmY7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhbiBleHRlcm5hbCBzeW1ib2wgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZXh0X2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgRVhUUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgZXh0X2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGV4dF9leHQgKikgZXh0X2NvcHk7Ci0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGludGVybi0+am1wdGJsICAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0pNUFRCTF9CSUcpOwotICAgIGludGVybi0+Y29ib2xfbWFpbiAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHKTsKLSAgICBpbnRlcm4tPndlYWtleHQgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9XRUFLRVhUX0JJRyk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5qbXB0YmwgICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfSk1QVEJMX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5jb2JvbF9tYWluICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUpOwotICAgIGludGVybi0+d2Vha2V4dCAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFKTsKLSAgfQotICBpbnRlcm4tPnJlc2VydmVkID0gMDsKLQotI2lmZGVmIEVDT0ZGXzMyCi0gIGludGVybi0+aWZkICAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0gIGludGVybi0+aWZkICAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotCi0gIGVjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAmZXh0LT5lc19hc3ltLCAmaW50ZXJuLT5hc3ltKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYW4gZXh0ZXJuYWwgc3ltYm9sIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2V4dF9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVYVFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IGV4dF9leHQgKmV4dCA9IChzdHJ1Y3QgZXh0X2V4dCAqKSBleHRfcHRyOwotICBFWFRSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBleHQtPmVzX2JpdHMxWzBdID0gKChpbnRlcm4tPmptcHRibCA/IEVYVF9CSVRTMV9KTVBUQkxfQklHIDogMCkKLQkJCXwgKGludGVybi0+Y29ib2xfbWFpbiA/IEVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRyA6IDApCi0JCQl8IChpbnRlcm4tPndlYWtleHQgPyBFWFRfQklUUzFfV0VBS0VYVF9CSUcgOiAwKSk7Ci0gICAgZXh0LT5lc19iaXRzMlswXSA9IDA7Ci0jaWZkZWYgRUNPRkZfNjQKLSAgICBleHQtPmVzX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmVzX2JpdHMyWzJdID0gMDsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIGV4dC0+ZXNfYml0czFbMF0gPSAoKGludGVybi0+am1wdGJsID8gRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUgOiAwKQotCQkJfCAoaW50ZXJuLT5jb2JvbF9tYWluID8gRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFIDogMCkKLQkJCXwgKGludGVybi0+d2Vha2V4dCA/IEVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRSA6IDApKTsKLSAgICBleHQtPmVzX2JpdHMyWzBdID0gMDsKLSNpZmRlZiBFQ09GRl82NAotICAgIGV4dC0+ZXNfYml0czJbMV0gPSAwOwotICAgIGV4dC0+ZXNfYml0czJbMl0gPSAwOwotI2VuZGlmCi0gIH0KLQotI2lmZGVmIEVDT0ZGXzMyCi0gIGJmZF9oX3B1dF9zaWduZWRfMTYgKGFiZmQsIGludGVybi0+aWZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBiZmRfaF9wdXRfc2lnbmVkXzMyIChhYmZkLCBpbnRlcm4tPmlmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOwotI2VuZGlmCi0KLSAgZWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAmaW50ZXJuLT5hc3ltLCAmZXh0LT5lc19hc3ltKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3JmZF9pbiAoYWJmZCwgZXh0X3B0ciwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfcHRyOwotICAgICBSRkRUICppbnRlcm47Ci17Ci0gIHN0cnVjdCByZmRfZXh0ICpleHQgPSAoc3RydWN0IHJmZF9leHQgKikgZXh0X3B0cjsKLQotICAqaW50ZXJuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnJmZCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcmZkX291dCAoYWJmZCwgaW50ZXJuLCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFJGRFQgKmludGVybjsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCByZmRfZXh0ICpleHQgPSAoc3RydWN0IHJmZF9leHQgKikgZXh0X3B0cjsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsICppbnRlcm4sIChiZmRfYnl0ZSAqKWV4dC0+cmZkKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhbiBvcHRpbWl6YXRpb24gc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfb3B0X2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgT1BUUiAqaW50ZXJuOwotewotICBzdHJ1Y3Qgb3B0X2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IG9wdF9leHQgKikgZXh0X2NvcHk7Ci0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgaW50ZXJuLT5vdCA9IGV4dC0+b19iaXRzMVswXTsKLSAgICAgIGludGVybi0+dmFsdWUgPSAoKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzMlswXQotCQkJPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHKQotCQkgICAgICAgfCAoKHVuc2lnbmVkIGludCkgZXh0LT5vX2JpdHMzWzBdCi0JCQkgIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRykKLQkJICAgICAgIHwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzNFswXQotCQkJICA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm4tPm90ID0gZXh0LT5vX2JpdHMxWzBdOwotICAgICAgaW50ZXJuLT52YWx1ZSA9ICgoZXh0LT5vX2JpdHMyWzBdIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRSkKLQkJICAgICAgIHwgKGV4dC0+b19iaXRzM1swXSA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUpCi0JCSAgICAgICB8IChleHQtPm9fYml0czRbMF0gPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFKSk7Ci0gICAgfQotCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpLAotCQkJICAgJmV4dC0+b19ybmR4LCAmaW50ZXJuLT5ybmR4KTsKLQotICBpbnRlcm4tPm9mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+b19vZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhbiBvcHRpbWl6YXRpb24gc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfb3B0X291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgT1BUUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3Qgb3B0X2V4dCAqZXh0ID0gKHN0cnVjdCBvcHRfZXh0ICopIGV4dF9wdHI7Ci0gIE9QVFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0LT5vX2JpdHMxWzBdID0gaW50ZXJuLT5vdDsKLSAgICAgIGV4dC0+b19iaXRzMlswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5vX2JpdHMzWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPm9fYml0czRbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0JJRzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHQtPm9fYml0czFbMF0gPSBpbnRlcm4tPm90OwotICAgICAgZXh0LT5vX2JpdHMyWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPm9fYml0czNbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+b19iaXRzNFswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFOwotICAgIH0KLQotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCksCi0JCQkgICAgJmludGVybi0+cm5keCwgJmV4dC0+b19ybmR4KTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+dmFsdWUsIChiZmRfYnl0ZSAqKSBleHQtPm9fb2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhIGRlbnNlIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Rucl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEROUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgZG5yX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGRucl9leHQgKikgZXh0X2NvcHk7Ci0KLSAgaW50ZXJuLT5yZmQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfcmZkKTsKLSAgaW50ZXJuLT5pbmRleCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZF9pbmRleCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgZGVuc2UgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZG5yX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRE5SICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBkbnJfZXh0ICpleHQgPSAoc3RydWN0IGRucl9leHQgKikgZXh0X3B0cjsKLSAgRE5SIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfcmZkKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmluZGV4LCAoYmZkX2J5dGUgKikgZXh0LT5kX2luZGV4KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGYtYmZkLmggYi9iZmQvZWxmLWJmZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNlY2RmLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYtYmZkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIEVMRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQkVMRl9IXwotI2RlZmluZSBfTElCRUxGX0hfIDEKLQotI2luY2x1ZGUgImVsZi9jb21tb24uaCIKLSNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvZXh0ZXJuYWwuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIElmIHNpemUgaXNuJ3Qgc3BlY2lmaWVkIGFzIDY0IG9yIDMyLCBOQU1FIG1hY3JvIHNob3VsZCBmYWlsLiAgKi8KLSNpZm5kZWYgTkFNRQotI2lmIEFSQ0hfU0laRT09NjQKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDQoeCw2NCxfLHkpCi0jZW5kaWYKLSNpZiBBUkNIX1NJWkU9PTMyCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsMzIsXyx5KQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBOQU1FCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsTk9TSVpFLF8seSkKLSNlbmRpZgotCi0jZGVmaW5lIEVsZk5BTUUoWCkJTkFNRShFbGYsWCkKLSNkZWZpbmUgZWxmTkFNRShYKQlOQU1FKGVsZixYKQotCi0vKiBJbmZvcm1hdGlvbiBoZWxkIGZvciBhbiBFTEYgc3ltYm9sLiAgVGhlIGZpcnN0IGZpZWxkIGlzIHRoZQotICAgY29ycmVzcG9uZGluZyBhc3ltYm9sLiAgRXZlcnkgc3ltYm9sIGlzIGFuIEVMRiBmaWxlIGlzIGFjdHVhbGx5IGEKLSAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFsdGhvdWdoIGl0IGlzIG9mdGVuIGhhbmRsZWQgYXMgYQotICAgcG9pbnRlciB0byBhbiBhc3ltYm9sLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlIEJGRCBzeW1ib2wuICAqLwotICBhc3ltYm9sIHN5bWJvbDsKLSAgLyogRUxGIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVsZl9JbnRlcm5hbF9TeW0gaW50ZXJuYWxfZWxmX3N5bTsKLSAgLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhwcGFfYXJnX3JlbG9jOwotICAgICAgUFRSIG1pcHNfZXh0cjsKLSAgICAgIFBUUiBhbnk7Ci0gICAgfQotICB0Y19kYXRhOwotCi0gIC8qIFZlcnNpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIGZyb20gYW4gRWxmX0ludGVybmFsX1ZlcnN5bQotICAgICBzdHJ1Y3R1cmUgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgSXQgaXMgemVybyBpZiB0aGVyZSBpcyBubwotICAgICB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLQotfSBlbGZfc3ltYm9sX3R5cGU7Ci0MCi0vKiBFTEYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBpbml0aWFsaXplZCB0byAtMS4gIEl0IGlzCi0gICAgIHNldCB0byAtMiBpZiB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYy4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBTeW1ib2wgc2l6ZS4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAvKiBTeW1ib2wgaW5kZXggYXMgYSBkeW5hbWljIHN5bWJvbC4gIEluaXRpYWxpemVkIHRvIC0xLCBhbmQgcmVtYWlucwotICAgICAtMSBpZiB0aGlzIGlzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgLyogPz8/IE5vdGUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnRseSB1c2VkIGFzIGEgc3lub255bSBmb3IgdGVzdHMKLSAgICAgYWdhaW5zdCB3aGV0aGVyIHdlIGNhbiBwZXJmb3JtIHZhcmlvdXMgc2ltcGxpZnlpbmcgdHJhbnNmb3JtYXRpb25zCi0gICAgIHRvIHRoZSBjb2RlLiAgKEUuZy4gY2hhbmdpbmcgYSBwYy1yZWxhdGl2ZSBqdW1wIHRvIGEgUExUIGVudHJ5Ci0gICAgIGludG8gYSBwYy1yZWxhdGl2ZSBqdW1wIHRvIHRoZSB0YXJnZXQgZnVuY3Rpb24uKSAgVGhhdCB0ZXN0LCB3aGljaAotICAgICBpcyBvZnRlbiByZWxhdGl2ZWx5IGNvbXBsZXgsIGFuZCBzb21lcGxhY2VzIHdyb25nIG9yIGluY29tcGxldGUsCi0gICAgIHNob3VsZCByZWFsbHkgYmUgcmVwbGFjZWQgYnkgYSBwcmVkaWNhdGUgaW4gZWxmbGluay5jLgotCi0gICAgIEVuZCByZXN1bHQ6IHRoaXMgZmllbGQgLTEgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgc3ltYm9sIGlzCi0gICAgIG5vdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCByYXRoZXIgdGhhdCB0aGUgc3ltYm9sIGlzCi0gICAgIG5vdCB2aXNpYmxlIG91dHNpZGUgdGhpcyBEU08uICAqLwotICBsb25nIGR5bmluZHg7Ci0KLSAgLyogU3RyaW5nIHRhYmxlIGluZGV4IGluIC5keW5zdHIgaWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5zdHJfaW5kZXg7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGlzCi0gICAgIGZpZWxkIHBvaW50cyB0byBhIGRlZmluZWQgc3ltYm9sIHdpdGggdGhlIHNhbWUgdmFsdWUsIGlmIHRoZXJlIGlzCi0gICAgIG9uZS4gIE90aGVyd2lzZSBpdCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtkZWY7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgcmVxdWlyZXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHRoZQotICAgICBwcm9jZXNzb3Igc3BlY2lmaWMgYmFja2VuZCB1c2VzIHRoaXMgZmllbGQgdG8gdHJhY2sgdXNhZ2UgYW5kCi0gICAgIGZpbmFsIG9mZnNldC4gIFdlIHVzZSBhIHVuaW9uIGFuZCB0d28gbmFtZXMgcHJpbWFyaWx5IHRvIGRvY3VtZW50Ci0gICAgIHRoZSBpbnRlbnQgb2YgYW55IHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZS4gIFRoZSBmaWVsZCBzaG91bGQgYmUKLSAgICAgdXNlZCBhcyBhIGNvdW50IHVudGlsIHNpemVfZHluYW1pY19zZWN0aW9ucywgYXQgd2hpY2ggcG9pbnQgdGhlCi0gICAgIGNvbnRlbnRzIG9mIHRoZSAuZ290IGlzIGZpeGVkLiAgQWZ0ZXJ3YXJkLCBpZiB0aGlzIGZpZWxkIGlzIC0xLAotICAgICB0aGVuIHRoZSBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHJlZmNvdW50OwotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgfSBnb3Q7Ci0KLSAgLyogU2FtZSwgYnV0IHRyYWNrcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWZjb3VudDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0OwotICAgIH0gcGx0OwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gdGhlIGxpbmtlciBjcmVhdGVkIHNlY3Rpb25zLCB0aGUgcHJvY2Vzc29yCi0gICAgIHNwZWNpZmljIGJhY2tlbmQgdXNlcyB0aGlzIGZpZWxkIHRvIG1hcCB0aGUgZmllbGQgaW50byB0aGUgb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXI7Ci0KLSAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gIHsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIGEKLSAgICAgICByZWd1bGFyIG9iamVjdC4gIEl0IHBvaW50cyB0byB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiByZWFkIGluCi0gICAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QuICAqLwotICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnZlcmRlZjsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYSByZWd1bGFyCi0gICAgICAgb2JqZWN0LiAgSXQgaXMgc2V0IHVwIGluIHNpemVfZHluYW1pY19zZWN0aW9ucy4gIEl0IHBvaW50cyB0bwotICAgICAgIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHdlIHNob3VsZCB3cml0ZSBvdXQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnRyZWU7Ci0gIH0gdmVyaW5mbzsKLQotICAvKiBWaXJ0dWFsIHRhYmxlIGVudHJ5IHVzZSBpbmZvcm1hdGlvbi4gIFRoaXMgYXJyYXkgaXMgbm9taW5hbGx5IG9mIHNpemUKLSAgICAgc2l6ZS9zaXplb2YodGFyZ2V0X3ZvaWRfcG9pbnRlciksIHRob3VnaCB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gYXNzdW1lCi0gICAgIGFuZCB0cmFjayBhIHNpemUgd2hpbGUgdGhlIHN5bWJvbCBpcyBzdGlsbCB1bmRlZmluZWQuICBJdCBpcyBpbmRleGVkCi0gICAgIHZpYSBvZmZzZXQvc2l6ZW9mKHRhcmdldF92b2lkX3BvaW50ZXIpLiAgKi8KLSAgc2l6ZV90IHZ0YWJsZV9lbnRyaWVzX3NpemU7Ci0gIGJvb2xlYW4gKnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0KLSAgLyogVmlydHVhbCB0YWJsZSBkZXJpdmF0aW9uIGluZm8uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqdnRhYmxlX3BhcmVudDsKLQotICAvKiBTeW1ib2wgdHlwZSAoU1RUX05PVFlQRSwgU1RUX09CSkVDVCwgZXRjLikuICAqLwotICBjaGFyIHR5cGU7Ci0KLSAgLyogU3ltYm9sIHN0X290aGVyIHZhbHVlLCBzeW1ib2wgdmlzaWJpbGl0eS4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3RoZXI7Ci0KLSAgLyogSGFzaCB2YWx1ZSBvZiB0aGUgbmFtZSBjb21wdXRlZCB1c2luZyB0aGUgRUxGIGhhc2ggZnVuY3Rpb24uICAqLwotICB1bnNpZ25lZCBsb25nIGVsZl9oYXNoX3ZhbHVlOwotCi0gIC8qIFNvbWUgZmxhZ3M7IGxlZ2FsIHZhbHVlcyBmb2xsb3cuICAqLwotICB1bnNpZ25lZCBzaG9ydCBlbGZfbGlua19oYXNoX2ZsYWdzOwotICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIG5vbi1zaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUiAwMQotICAvKiBTeW1ib2wgaXMgZGVmaW5lZCBieSBhIG5vbi1zaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiAwMgotICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIHNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDIDA0Ci0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgc2hhcmVkIG9iamVjdC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMgMDEwCi0gIC8qIFN5bWJvbCBoYXMgYSBub24td2VhayByZWZlcmVuY2UgZnJvbSBhIG5vbi1zaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLIDAyMAotICAvKiBEeW5hbWljIHN5bWJvbCBoYXMgYmVlbiBhZGp1c3RkLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9EWU5BTUlDX0FESlVTVEVEIDA0MAotICAvKiBTeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZIDAxMDAKLSAgLyogU3ltYm9sIG5lZWRzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX05FRURTX1BMVCAwMjAwCi0gIC8qIFN5bWJvbCBhcHBlYXJzIGluIGEgbm9uLUVMRiBpbnB1dCBmaWxlLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfTk9OX0VMRiAwNDAwCi0gIC8qIFN5bWJvbCBzaG91bGQgYmUgbWFya2VkIGFzIGhpZGRlbiBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hJRERFTiAwMTAwMAotICAvKiBTeW1ib2wgd2FzIGZvcmNlZCB0byBsb2NhbCBzY29wZSBkdWUgdG8gYSB2ZXJzaW9uIHNjcmlwdCBmaWxlLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMIDAyMDAwCi0gIC8qIFN5bWJvbCB3YXMgbWFya2VkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX01BUksgMDQwMDAKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSBub24tR09UL25vbi1QTFQgcmVsb2NhdGlvbi4gIFRoaXMgaXMKLSAgICAgbm90IGN1cnJlbnRseSBzZXQgYnkgYWxsIHRoZSBiYWNrZW5kcy4gICovCi0jZGVmaW5lIEVMRl9MSU5LX05PTl9HT1RfUkVGIDAxMDAwMAotfTsKLQotLyogUmVjb3JkcyBsb2NhbCBzeW1ib2xzIHRvIGJlIGVtaXR0ZWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKm5leHQ7Ci0KLSAgLyogVGhlIGlucHV0IGJmZCB0aGlzIHN5bWJvbCBjYW1lIGZyb20uICAqLwotICBiZmQgKmlucHV0X2JmZDsKLQotICAvKiBUaGUgaW5kZXggb2YgdGhlIGxvY2FsIHN5bWJvbCBiZWluZyBjb3BpZWQuICAqLwotICBsb25nIGlucHV0X2luZHg7Ci0KLSAgLyogVGhlIGluZGV4IGluIHRoZSBvdXRnb2luZyBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi0gIGxvbmcgZHluaW5keDsKLSAgCi0gIC8qIEEgY29weSBvZiB0aGUgaW5wdXQgc3ltYm9sLiAgKi8KLSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotfTsKLQotLyogRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogV2hldGhlciB3ZSBoYXZlIGNyZWF0ZWQgdGhlIHNwZWNpYWwgZHluYW1pYyBzZWN0aW9ucyByZXF1aXJlZAotICAgICB3aGVuIGxpbmtpbmcgYWdhaW5zdCBvciBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gICovCi0gIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotICAvKiBUaGUgQkZEIHVzZWQgdG8gaG9sZCBzcGVjaWFsIHNlY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4KLSAgICAgVGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBCRkQgZm91bmQgd2hpY2ggcmVxdWlyZXMgdGhlc2Ugc2VjdGlvbnMgdG8KLSAgICAgYmUgY3JlYXRlZC4gICovCi0gIGJmZCAqZHlub2JqOwotICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgZm91bmQgaW4gdGhlIGxpbmsgd2hpY2ggbXVzdCBiZSBwdXQgaW50bwotICAgICB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBkeW5zeW1jb3VudDsKLSAgLyogVGhlIHN0cmluZyB0YWJsZSBvZiBkeW5hbWljIHN5bWJvbHMsIHdoaWNoIGJlY29tZXMgdGhlIC5keW5zdHIKLSAgICAgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmR5bnN0cjsKLSAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlIGluIHRoZSAuaGFzaCBzZWN0aW9uLgotICAgICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBidWNrZXRjb3VudDsKLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBEVF9ORUVERUQgbmFtZXMgZm91bmQgaW4gZHluYW1pYyBvYmplY3RzCi0gICAgIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0gIC8qIFRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhnb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotICAvKiBBIGxpbmtlZCBsaXN0IG9mIGxvY2FsIHN5bWJvbHMgdG8gYmUgYWRkZWQgdG8gLmR5bnN5bS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICpkeW5sb2NhbDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotDAotLyogQ29uc3RhbnQgaW5mb3JtYXRpb24gaGVsZCBmb3IgYW4gRUxGIGJhY2tlbmQuICAqLwotCi1zdHJ1Y3QgZWxmX3NpemVfaW5mbyB7Ci0gIHVuc2lnbmVkIGNoYXIgc2l6ZW9mX2VoZHIsIHNpemVvZl9waGRyLCBzaXplb2Zfc2hkcjsKLSAgdW5zaWduZWQgY2hhciBzaXplb2ZfcmVsLCBzaXplb2ZfcmVsYSwgc2l6ZW9mX3N5bSwgc2l6ZW9mX2R5biwgc2l6ZW9mX25vdGU7Ci0KLSAgLyogVGhlIHNpemUgb2YgZW50cmllcyBpbiB0aGUgLmhhc2ggc2VjdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2l6ZW9mX2hhc2hfZW50cnk7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBpbnRlcm5hbCByZWxvY2F0aW9ucyB0byBhbGxvY2F0ZSBwZXIgZXh0ZXJuYWwKLSAgICAgcmVsb2NhdGlvbiBlbnRyeS4gICovCi0gIHVuc2lnbmVkIGNoYXIgaW50X3JlbHNfcGVyX2V4dF9yZWw7Ci0KLSAgdW5zaWduZWQgY2hhciBhcmNoX3NpemUsIGZpbGVfYWxpZ247Ci0gIHVuc2lnbmVkIGNoYXIgZWxmY2xhc3MsIGV2X2N1cnJlbnQ7Ci0gIGludCAoKndyaXRlX291dF9waGRycykgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotICBib29sZWFuICgqd3JpdGVfc2hkcnNfYW5kX2VoZHIpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIHZvaWQgKCp3cml0ZV9yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfc3ltYm9sX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7Ci0gIGJvb2xlYW4gKCpzbHVycF9yZWxvY190YWJsZSkKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotICBsb25nICgqc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotICB2b2lkICgqc3dhcF9keW5faW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQVFIsIEVsZl9JbnRlcm5hbF9EeW4gKikpOwotICB2b2lkICgqc3dhcF9keW5fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX0R5biAqLCBQVFIpKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgdG8gc3dhcCBpbiBhIFJFTAotICAgICByZWxvY2F0aW9uLiAgSWYgYW4gZXh0ZXJuYWwgcmVsb2NhdGlvbiBjb3JyZXNwb25kcyB0byBtb3JlIHRoYW4KLSAgICAgb25lIGludGVybmFsIHJlbG9jYXRpb24sIHRoZW4gYWxsIHJlbG9jYXRpb25zIGFyZSBzd2FwcGVkIGluIGF0Ci0gICAgIG9uY2UuICAqLwotICB2b2lkICgqc3dhcF9yZWxvY19pbikKLSAgICBQQVJBTVMgKChiZmQgKiwgY29uc3QgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbCAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIHRvIHN3YXAgb3V0IGEgUkVMCi0gICAgIHJlbG9jYXRpb24uICAqLwotICB2b2lkICgqc3dhcF9yZWxvY19vdXQpCi0gICAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWwgKiwgYmZkX2J5dGUgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCB0byBzd2FwIGluIGEgUkVMQQotICAgICByZWxvY2F0aW9uLiAgSWYgYW4gZXh0ZXJuYWwgcmVsb2NhdGlvbiBjb3JyZXNwb25kcyB0byBtb3JlIHRoYW4KLSAgICAgb25lIGludGVybmFsIHJlbG9jYXRpb24sIHRoZW4gYWxsIHJlbG9jYXRpb25zIGFyZSBzd2FwcGVkIGluIGF0Ci0gICAgIG9uY2UuICAqLwotICB2b2lkICgqc3dhcF9yZWxvY2FfaW4pCi0gICAgUEFSQU1TICgoYmZkICosIGNvbnN0IGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgdG8gc3dhcCBvdXQgYSBSRUxBCi0gICAgIHJlbG9jYXRpb24uICAqLwotICB2b2lkICgqc3dhcF9yZWxvY2Ffb3V0KQotICAgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqKSk7Ci0KLX07Ci0KLSNkZWZpbmUgZWxmX3N5bWJvbF9mcm9tKEFCRkQsUykgXAotCSgoKFMpLT50aGVfYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIgXAotCSAgJiYgKFMpLT50aGVfYmZkLT50ZGF0YS5lbGZfb2JqX2RhdGEgIT0gMCkgXAotCSA/IChlbGZfc3ltYm9sX3R5cGUgKikgKFMpIFwKLQkgOiAwKQotCi1zdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YQotewotICAvKiBUaGUgYXJjaGl0ZWN0dXJlIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiBUaGUgRUxGIG1hY2hpbmUgY29kZSAoRU1feHh4eCkgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGludCBlbGZfbWFjaGluZV9jb2RlOwotCi0gIC8qIFRoZSBtYXhpbXVtIHBhZ2Ugc2l6ZSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgYmZkX3ZtYSBtYXhwYWdlc2l6ZTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBhbiBFTEYgUkVMQSByZWxvY2F0aW9uIHRvIGEgQkZEIGFyZWxlbnQKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdm9pZCAoKmVsZl9pbmZvX3RvX2hvd3RvKSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAotCQkJCSAgICAgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gdHJhbnNsYXRlIGFuIEVMRiBSRUwgcmVsb2NhdGlvbiB0byBhIEJGRCBhcmVsZW50Ci0gICAgIHN0cnVjdHVyZS4gICovCi0gIHZvaWQgKCplbGZfaW5mb190b19ob3d0b19yZWwpIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJCSBFbGZfSW50ZXJuYWxfUmVsICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGdsb2JhbCB3aGVuCi0gICAgIHBhcnRpdGlvbmluZyB0aGUgc3ltYm9sIHRhYmxlIGludG8gbG9jYWwgYW5kIGdsb2JhbCBzeW1ib2xzLgotICAgICBUaGlzIHNob3VsZCBiZSBOVUxMIGZvciBtb3N0IHRhcmdldHMsIGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlY3QKLSAgICAgdGhpbmcgd2lsbCBiZSBkb25lLiAgTUlQUyBFTEYsIGF0IGxlYXN0IG9uIHRoZSBJcml4IDUsIGhhcwotICAgICBzcGVjaWFsIHJlcXVpcmVtZW50cy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgYXJlIGhvb2tzIHdoaWNoIGFyZSBjYWxsZWQgb25seSBpZiB0aGV5Ci0gICAgIGFyZSBub3QgTlVMTC4gICovCi0KLSAgLyogQSBmdW5jdGlvbiB0byBwZXJtaXQgYSBiYWNrZW5kIHNwZWNpZmljIGNoZWNrIG9uIHdoZXRoZXIgYQotICAgICBwYXJ0aWN1bGFyIEJGRCBmb3JtYXQgaXMgcmVsZXZhbnQgZm9yIGFuIG9iamVjdCBmaWxlLCBhbmQgdG8KLSAgICAgcGVybWl0IHRoZSBiYWNrZW5kIHRvIHNldCBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIGl0IHdpc2hlcy4gIFdoZW4KLSAgICAgdGhpcyBpcyBjYWxsZWQgZWxmX2VsZmhlYWRlciBpcyBzZXQsIGJ1dCBhbnl0aGluZyBlbHNlIHNob3VsZCBiZQotICAgICB1c2VkIHdpdGggY2F1dGlvbi4gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIGNoZWNrX2Zvcm1hdAotICAgICByb3V0aW5lIHdpbGwgcmV0dXJuIGEgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCBlcnJvci4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgc3ltYm9sIHByb2Nlc3Npbmcgd2hlbiByZWFkaW5nIHRoZQotICAgICBFTEYgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyB3aGVyZSBhbnkgcHJvY2Vzc29yLXNwZWNpZmljIHNwZWNpYWwKLSAgICAgc2VjdGlvbiBpbmRpY2VzIGFyZSBoYW5kbGVkLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBkbyBhZGRpdGlvbmFsIHN5bWJvbCBwcm9jZXNzaW5nIGFmdGVyIHJlYWRpbmcgdGhlCi0gICAgIGVudGlyZSBFTEYgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkgIGVsZl9zeW1ib2xfdHlwZSAqLAotCQkJCQkJCSAgdW5zaWduZWQgaW50KSk7Ci0KLSAgIC8qIEEgZnVuY3Rpb24gdG8gc2V0IHRoZSB0eXBlIG9mIHRoZSBpbmZvIGZpZWxkLiAgUHJvY2Vzc29yLXNwZWNpZmljCi0gICAgIHR5cGVzIHNob3VsZCBiZSBoYW5kbGVkIGhlcmUuICovCi0gIGludCAoKmVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSkgUEFSQU1TICgoIEVsZl9JbnRlcm5hbF9TeW0gKiwgaW50KSk7IAotIAotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBvbiB0aGUgRUxGIHNlY3Rpb24gaGVhZGVyCi0gICAgIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgZmxhZ3MgYW5kCi0gICAgIHR5cGUgZmllbGRzIGZvciBzb21lIHNlY3Rpb25zLCBvciB0byBhY3R1YWxseSB3cml0ZSBvdXQgZGF0YSBmb3IKLSAgICAgdW51c3VhbCBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGhhbmRsZSB1bnVzdWFsIHNlY3Rpb24gdHlwZXMgd2hlbiBjcmVhdGluZyBCRkQKLSAgICAgc2VjdGlvbnMgZnJvbSBFTEYgc2VjdGlvbnMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCSAgICBjaGFyICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGhhbmRsZSB1bnVzdWFsIHByb2dyYW0gc2VnbWVudCB0eXBlcyB3aGVuIGNyZWF0aW5nIEJGRAotICAgICBzZWN0aW9ucyBmcm9tIEVMRiBwcm9ncmFtIHNlZ21lbnRzLiAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgIEVsZjMyX0ludGVybmFsX1BoZHIgKiwKLQkJCQkJCSAgICBpbnQpKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIHNldCB1cCB0aGUgRUxGIHNlY3Rpb24gaGVhZGVyIGZvciBhIEJGRCBzZWN0aW9uIGluCi0gICAgIHByZXBhcmF0aW9uIGZvciB3cml0aW5nIGl0IG91dC4gIFRoaXMgaXMgd2hlcmUgdGhlIGZsYWdzIGFuZCB0eXBlCi0gICAgIGZpZWxkcyBhcmUgc2V0IGZvciB1bnVzdWFsIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosCi0JCQkJCQlhc2VjdGlvbiAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBnZXQgdGhlIEVMRiBzZWN0aW9uIGluZGV4IGZvciBhIEJGRCBzZWN0aW9uLiAgSWYKLSAgICAgdGhpcyByZXR1cm5zIHRydWUsIHRoZSBzZWN0aW9uIHdhcyBmb3VuZC4gIElmIGl0IGlzIGEgbm9ybWFsIEVMRgotICAgICBzZWN0aW9uLCAqUkVUVkFMIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZC4gIElmIGl0IGlzIG5vdCBhIG5vcm1hbAotICAgICBFTEYgc2VjdGlvbiAqUkVUVkFMIHNob3VsZCBiZSBzZXQgdG8gdGhlIFNITl94eHh4IGluZGV4LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbikKLSAgICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKnJldHZhbCkpOwotCi0gIC8qIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIGl0IGlzIGNhbGxlZCBieSB0aGUgYWRkX3N5bWJvbHMgcGhhc2UKLSAgICAgb2YgYSBsaW5rIGp1c3QgYmVmb3JlIGFkZGluZyBhIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoCi0gICAgIHRhYmxlLiAgSXQgbWF5IG1vZGlmeSBhbnkgb2YgdGhlIGZpZWxkcyBhcyBpdCB3aXNoZXMuICBJZiAqTkFNRQotICAgICBpcyBzZXQgdG8gTlVMTCwgdGhlIHN5bWJvbCB3aWxsIGJlIHNraXBwZWQgcmF0aGVyIHRoYW4gYmVpbmcKLSAgICAgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgICBoYW5kbGluZyBhbGwgcHJvY2Vzc29yIGRlcGVuZGVudCBzeW1ib2wgYmluZGluZ3MgYW5kIHNlY3Rpb24KLSAgICAgaW5kaWNlcywgYW5kIG11c3Qgc2V0IGF0IGxlYXN0ICpGTEFHUyBhbmQgKlNFQyBmb3IgZWFjaCBwcm9jZXNzb3IKLSAgICAgZGVwZW5kZW50IGNhc2U7IGZhaWx1cmUgdG8gZG8gc28gd2lsbCBjYXVzZSBhIGxpbmsgZXJyb3IuICAqLwotICBib29sZWFuICgqZWxmX2FkZF9zeW1ib2xfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBjb25zdCBjaGFyICoqbmFtZSwKLQkgICAgIGZsYWd3b3JkICpmbGFncywgYXNlY3Rpb24gKipzZWMsIGJmZF92bWEgKnZhbHVlKSk7Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgaXQgaXMgY2FsbGVkIGJ5IHRoZSBlbGZfbGlua19vdXRwdXRfc3ltCi0gICAgIHBoYXNlIG9mIGEgbGluayBmb3IgZWFjaCBzeW1ib2wgd2hpY2ggd2lsbCBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqLAotCSAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci0KLSAgLyogVGhlIENSRUFURV9EWU5BTUlDX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIHRoZSBmaXJzdCB0aW1lIGl0IGVuY291bnRlcnMgYSBkeW5hbWljIG9iamVjdCBpbiB0aGUgbGluay4KLSAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGNyZWF0ZSBhbnkgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMKLSAgICAgbGlua2luZy4gIFRoZSBBQkZEIGFyZ3VtZW50IGlzIGEgZHluYW1pYyBvYmplY3QuICBUaGUgLmludGVycCwKLSAgICAgLmR5bmFtaWMsIC5keW5zeW0sIC5keW5zdHIsIGFuZCAuaGFzaCBmdW5jdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgICAgY3JlYXRlZCwgYW5kIHRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgc2VjdGlvbiBmbGFncyBpZgotICAgICBkZXNpcmVkLiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vcm1hbGx5IGNyZWF0ZSB0aGUgLmdvdCBhbmQgLnBsdAotICAgICBzZWN0aW9ucywgYnV0IGRpZmZlcmVudCBiYWNrZW5kcyBoYXZlIGRpZmZlcmVudCByZXF1aXJlbWVudHMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpCi0gICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi0gIC8qIFRoZSBDSEVDS19SRUxPQ1MgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhZGRfc3ltYm9scyBwaGFzZSBvZgotICAgICB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgSXQgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggc2VjdGlvbiB3aXRoCi0gICAgIHJlbG9jcyBvZiBhbiBvYmplY3QgZmlsZSwganVzdCBhZnRlciB0aGUgc3ltYm9scyBmb3IgdGhlIG9iamVjdAotICAgICBmaWxlIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhlCi0gICAgIGZ1bmN0aW9uIG11c3QgbG9vayB0aHJvdWdoIHRoZSByZWxvY3MgYW5kIGRvIGFueSBzcGVjaWFsIGhhbmRsaW5nCi0gICAgIHJlcXVpcmVkLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgYWxsb2NhdGluZyBzcGFjZSBpbiB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZSwgYW5kIHBlcmhhcHMgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSByZWxvYy4gIFRoZQotICAgICByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgICAgemVyby4gICovCi0gIGJvb2xlYW4gKCpjaGVja19yZWxvY3MpCi0gICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKm8sCi0JICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci0KLSAgLyogVGhlIEFESlVTVF9EWU5BTUlDX1NZTUJPTCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBmb3IgZXZlcnkgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQKLSAgICAgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZQotICAgICBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiwgYnV0IGJlZm9yZSB0aGUgU0laRV9EWU5BTUlDX1NFQ1RJT05TCi0gICAgIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZC4gIFRoZSBoYXNoIHRhYmxlIGVudHJ5IHNob3VsZCBiZQotICAgICBiZmRfbGlua19oYXNoX2RlZmluZWQgb3JlIGJmZF9saW5rX2hhc2hfZGVmd2VhaywgYW5kIGl0IHNob3VsZCBiZQotICAgICBkZWZpbmVkIGluIGEgc2VjdGlvbiBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBEeW5hbWljIG9iamVjdAotICAgICBzZWN0aW9ucyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBmaW5hbCBsaW5rLCBhbmQgdGhpcyBmdW5jdGlvbiBpcwotICAgICByZXNwb25zaWJsZSBmb3IgY2hhbmdpbmcgdGhlIHZhbHVlIHRvIHNvbWV0aGluZyB3aGljaCB0aGUgcmVzdCBvZgotICAgICB0aGUgbGluayBjYW4gZGVhbCB3aXRoLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGludm9sdmUgYWRkaW5nIGFuCi0gICAgIGVudHJ5IHRvIHRoZSAucGx0IG9yIC5nb3Qgb3Igc29tZSBzdWNoIHNlY3Rpb24sIGFuZCBzZXR0aW5nIHRoZQotICAgICBzeW1ib2wgdG8gcG9pbnQgdG8gdGhhdC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpCi0gICAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoKSk7Ci0KLSAgLyogVGhlIEFMV0FZU19TSVpFX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIKLSAgICAgYWZ0ZXIgYWxsIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHNlZW4gYnV0IGJlZm9yZSB0aGUKLSAgICAgc2VjdGlvbiBzaXplcyBoYXZlIGJlZW4gc2V0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKLSAgICAgQURKVVNUX0RZTkFNSUNfU1lNQk9MLCBidXQgYmVmb3JlIFNJWkVfRFlOQU1JQ19TRUNUSU9OUy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogVGhlIFNJWkVfRFlOQU1JQ19TRUNUSU9OUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBhZnRlciBhbGwgdGhlIGxpbmtlciBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiBidXQgYmVmb3JlCi0gICAgIHRoZSBzZWN0aW9ucyBzaXplcyBoYXZlIGJlZW4gc2V0LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKLSAgICAgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGhhcyBiZWVuIGNhbGxlZCBvbiBhbGwgYXBwcm9wcmlhdGUgc3ltYm9scy4KLSAgICAgSXQgaXMgb25seSBjYWxsZWQgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gIEl0IG11c3QKLSAgICAgc2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucywgYW5kIG1heSBmaWxsIGluIHRoZWlyCi0gICAgIGNvbnRlbnRzIGFzIHdlbGwuICBUaGUgZ2VuZXJpYyBFTEYgbGlua2VyIGNhbiBoYW5kbGUgdGhlIC5keW5zeW0sCi0gICAgIC5keW5zdHIgYW5kIC5oYXNoIHNlY3Rpb25zLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZSB0aGUKLSAgICAgLmludGVycCBzZWN0aW9uIGFuZCBhbnkgc2VjdGlvbnMgY3JlYXRlZCBieSB0aGUKLSAgICAgQ1JFQVRFX0RZTkFNSUNfU0VDVElPTlMgZW50cnkgcG9pbnQuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlcgotICAgICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgICB6ZXJvLgotCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICAgIG5lY2Vzc2FyeS4KLQotICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgICBhY2NvcmRpbmdseS4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgICBiZmQgKmlucHV0X2JmZCwgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGJmZF9ieXRlICpjb250ZW50cywKLQkgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MsIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zKSk7Ci0KLSAgLyogVGhlIEZJTklTSF9EWU5BTUlDX1NZTUJPTCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBqdXN0IGJlZm9yZSBpdCB3cml0ZXMgYSBzeW1ib2wgb3V0IHRvIHRoZSAuZHluc3ltIHNlY3Rpb24uCi0gICAgIFRoZSBwcm9jZXNzb3IgYmFja2VuZCBtYXkgbWFrZSBhbnkgcmVxdWlyZWQgYWRqdXN0bWVudCB0byB0aGUKLSAgICAgc3ltYm9sLiAgSXQgbWF5IGFsc28gdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gc2V0IGNvbnRlbnRzIG9mIHRoZQotICAgICBkeW5hbWljIHNlY3Rpb25zLiAgTm90ZSB0aGF0IEZJTklTSF9EWU5BTUlDX1NZTUJPTCBpcyBjYWxsZWQgb24KLSAgICAgYWxsIC5keW5zeW0gc3ltYm9scywgd2hpbGUgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGlzIG9ubHkgY2FsbGVkCi0gICAgIG9uIHRob3NlIHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBFbGZfSW50ZXJuYWxfU3ltICpzeW0pKTsKLQotICAvKiBUaGUgRklOSVNIX0RZTkFNSUNfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAotICAgICBsaW5rZXIganVzdCBiZWZvcmUgaXQgd3JpdGVzIGFsbCB0aGUgZHluYW1pYyBzZWN0aW9ucyBvdXQgdG8gdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgVGhlIEZJTklTSF9EWU5BTUlDX1NZTUJPTCB3aWxsIGhhdmUgYmVlbiBjYWxsZWQgb24KLSAgICAgYWxsIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byBkbyBhbnkgYmVnaW5uaW5nIHByb2Nlc3NpbmcgbmVlZGVkIGZvciB0aGUgRUxGIGZpbGUKLSAgICAgYmVmb3JlIGJ1aWxkaW5nIHRoZSBFTEYgaGVhZGVycyBhbmQgY29tcHV0aW5nIGZpbGUgcG9zaXRpb25zLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFueSBmaW5hbCBwcm9jZXNzaW5nIG5lZWRlZCBmb3IgdGhlIEVMRiBmaWxlCi0gICAgIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFRoZSBMSU5LRVIgYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIEJGRAotICAgICB3YXMgY3JlYXRlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gbGlua2VyKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuICBJdCBzaG91bGQKLSAgICAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwcm9ncmFtIHNlZ21lbnRzIHdoaWNoIHRoaXMgQkZECi0gICAgIHdpbGwgbmVlZC4gIEl0IHNob3VsZCByZXR1cm4gLTEgb24gZXJyb3IuICAqLwotICBpbnQgKCplbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycykgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBtb2RpZnkgYW4gZXhpc3Rpbmcgc2VnbWVudCBtYXAgaW4gYQotICAgICBiYWNrZW5kIHNwZWNpZmljIGZhc2hpb24uICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzZWN0aW9uIGdjIHRvIGRpc2NvdmVyIHRoZSBzZWN0aW9uIGEKLSAgICAgcGFydGljdWxhciByZWxvY2F0aW9uIHJlZmVycyB0by4gIEl0IG5lZWQgbm90IGJlIGRlZmluZWQgZm9yIGhvc3RzCi0gICAgIHRoYXQgaGF2ZSBubyBxdWVlciByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIGR1cmluZyB0aGUgc3dlZXAgcGhhc2Ugb2YgZ2MKLSAgICAgaW4gb3JkZXIgdGhhdCBhIGJhY2tlbmQgbWlnaHQgdXBkYXRlIGFueSBkYXRhIHN0cnVjdHVyZXMgaXQgbWlnaHQKLSAgICAgYmUgbWFpbnRhaW5pbmcuICAqLwotICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIEVMRiBoZWFkZXJzIGhhdmUKLSAgICAgYmVlbiBjcmVhdGVkLiAgVGhpcyBhbGxvd3MgZm9yIHRoaW5ncyBsaWtlIHRoZSBPUyBhbmQgQUJJIHZlcnNpb25zCi0gICAgIHRvIGJlIGNoYW5nZWQuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBwcmludHMgYSBzeW1ib2wgdG8gZmlsZSBhbmQgcmV0dXJucyB0aGUKLSAgICAgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIGJlIHByaW50ZWQuICBJdCBzaG91bGQgcmV0dXJuIE5VTEwgdG8gZmFsbAotICAgICBiYWNrIHRvIGRlZmF1bHQgc3ltYm9sIHByaW50aW5nLiAgKi8KLSAgY29uc3QgY2hhciAqKCplbGZfYmFja2VuZF9wcmludF9zeW1ib2xfYWxsKQotICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCBhZnRlciBhbGwgbG9jYWwgc3ltYm9scyBhbmQKLSAgICAgZ2xvYmFsIHN5bWJvbHMgY29udmVydGVkIHRvIGxvY2FscyBhcmUgZW1pdGVkIGludG8gdGhlIHN5bXRhYgotICAgICBzZWN0aW9uLiAgSXQgYWxsb3dzIHRoZSBiYWNrZW5kIHRvIGVtaXQgc3BlY2lhbCBnbG9iYWwgc3ltYm9scwotICAgICBub3QgaGFuZGxlZCBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zKQotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBQVFIsCi0JICAgIGJvb2xlYW4gKCopIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotICAgICAgICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpKSk7Ci0KLSAgLyogQ29weSBhbnkgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBkeW5hbWljIGxpbmtpbmcgZnJvbSBhIHByZS1leGlzdGluZwotICAgICBzeW1ib2wgSU5EIHRvIGEgbmV3bHkgY3JlYXRlZCBzeW1ib2wgRElSLiAgKi8KLSAgdm9pZCAoKmVsZl9iYWNrZW5kX2NvcHlfaW5kaXJlY3Rfc3ltYm9sKQotICAgIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotICAvKiBNb2RpZnkgYW55IGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZHluYW1pYyBsaW5raW5nIHN1Y2ggdGhhdCB0aGUKLSAgICAgc3ltYm9sIGlzIG5vdCBleHBvcnRlZC4gICovCi0gIHZvaWQgKCplbGZfYmFja2VuZF9oaWRlX3N5bWJvbCkKLSAgICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLSAgLyogVGhlIHN3YXBwaW5nIHRhYmxlIHRvIHVzZSB3aGVuIGRlYWxpbmcgd2l0aCBFQ09GRiBpbmZvcm1hdGlvbi4KLSAgICAgVXNlZCBmb3IgdGhlIE1JUFMgRUxGIC5tZGVidWcgc2VjdGlvbi4gICovCi0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICplbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotCi0gIC8qIEFsdGVybmF0ZSBFTV94eHh4IG1hY2hpbmUgY29kZXMgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGludCBlbGZfbWFjaGluZV9hbHQxOwotICBpbnQgZWxmX21hY2hpbmVfYWx0MjsKLQotICBjb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyAqczsKLQotICAvKiBvZmZzZXQgb2YgdGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIC5nb3Qgc2VjdGlvbiAqLwotICBiZmRfdm1hIGdvdF9zeW1ib2xfb2Zmc2V0OwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBoZWFkZXJzIGZvciB0aGUgR09UIGFuZCBQTFQuICBUaGlzIGluY2x1ZGVzCi0gICAgIHRoZSBzby1jYWxsZWQgcmVzZXJ2ZWQgZW50cmllcyBvbiBzb21lIHN5c3RlbXMuICAqLwotICBiZmRfdm1hIGdvdF9oZWFkZXJfc2l6ZTsKLSAgYmZkX3ZtYSBwbHRfaGVhZGVyX3NpemU7Ci0KLSAgLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBsaW5rZXIgc2hvdWxkIGFjdCBsaWtlIGNvbGxlY3QgYW5kIGdhdGhlcgotICAgICBnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLiAgVGhpcyBpcyB0cnVlIGZvcgotICAgICBNSVBTIEVMRiBiZWNhdXNlIHRoZSBJcml4IDUgdG9vbHMgY2FuIG5vdCBoYW5kbGUgdGhlIC5pbml0Ci0gICAgIHNlY3Rpb24uICAqLwotICB1bnNpZ25lZCBjb2xsZWN0IDogMTsKLQotICAvKiBUaGlzIGlzIHRydWUgaWYgdGhlIGxpbmtlciBzaG91bGQgaWdub3JlIGNoYW5nZXMgdG8gdGhlIHR5cGUgb2YgYQotICAgICBzeW1ib2wuICBUaGlzIGlzIHRydWUgZm9yIE1JUFMgRUxGIGJlY2F1c2Ugc29tZSBJcml4IDUgb2JqZWN0cwotICAgICByZWNvcmQgdW5kZWZpbmVkIGZ1bmN0aW9ucyBhcyBTVFRfT0JKRUNUIGFsdGhvdWdoIHRoZSBkZWZpbml0aW9ucwotICAgICBhcmUgU1RUX0ZVTkMuICAqLwotICB1bnNpZ25lZCB0eXBlX2NoYW5nZV9vayA6IDE7Ci0KLSAgLyogV2hldGhlciB0aGUgYmFja2VuZCBtYXkgdXNlIFJFTCByZWxvY2F0aW9ucy4gIChTb21lIGJhY2tlbmRzIHVzZQotICAgICBib3RoIFJFTCBhbmQgUkVMQSByZWxvY2F0aW9ucywgYW5kIHRoaXMgZmxhZyBpcyBzZXQgZm9yIHRob3NlCi0gICAgIGJhY2tlbmRzLikgICovCi0gIHVuc2lnbmVkIG1heV91c2VfcmVsX3AgOiAxOwotICAgIAotICAvKiBXaGV0aGVyIHRoZSBiYWNrZW5kIG1heSB1c2UgUkVMQSByZWxvY2F0aW9ucy4gIChTb21lIGJhY2tlbmRzIHVzZQotICAgICBib3RoIFJFTCBhbmQgUkVMQSByZWxvY2F0aW9ucywgYW5kIHRoaXMgZmxhZyBpcyBzZXQgZm9yIHRob3NlCi0gICAgIGJhY2tlbmRzLikgICovCi0gIHVuc2lnbmVkIG1heV91c2VfcmVsYV9wIDogMTsKLQotICAvKiBXaGV0aGVyIHRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBpcyBSRUxBLiAgSWYgYSBiYWNrZW5kIHdpdGgKLSAgICAgdGhpcyBmbGFnIHNldCB3YW50cyBSRUwgcmVsb2NhdGlvbnMgZm9yIGEgcGFydGljdWxhciBzZWN0aW9uLAotICAgICBpdCBtdXN0IG5vdGUgdGhhdCBleHBsaWNpdGx5LiAgU2ltaWxhcmx5LCBpZiB0aGlzIGZsYWcgaXMgY2xlYXIsCi0gICAgIGFuZCB0aGUgYmFja2VuZCB3YW50cyBSRUxBIHJlbG9jYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgCi0gICAgIHNlY3Rpb24uICAqLyAgIAotICB1bnNpZ25lZCBkZWZhdWx0X3VzZV9yZWxhX3AgOiAxOwotCi0gIC8qIFRydWUgaWYgYWRkcmVzc2VzICJuYXR1cmFsbHkiIHNpZ24gZXh0ZW5kLiAgVGhpcyBpcyB1c2VkIHdoZW4KLSAgICAgc3dhcHBpbmcgaW4gZnJvbSBFbGYzMiB3aGVuIEJGRDY0LiAgKi8KLSAgdW5zaWduZWQgc2lnbl9leHRlbmRfdm1hIDogMTsKLQotICB1bnNpZ25lZCB3YW50X2dvdF9wbHQgOiAxOwotICB1bnNpZ25lZCBwbHRfcmVhZG9ubHkgOiAxOwotICB1bnNpZ25lZCB3YW50X3BsdF9zeW0gOiAxOwotICB1bnNpZ25lZCBwbHRfbm90X2xvYWRlZCA6IDE7Ci0gIHVuc2lnbmVkIHBsdF9hbGlnbm1lbnQgOiA0OwotICB1bnNpZ25lZCBjYW5fZ2Nfc2VjdGlvbnMgOiAxOwotICB1bnNpZ25lZCB3YW50X2R5bmJzcyA6IDE7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBzdG9yZWQgZm9yIGVhY2ggQkZEIHNlY3Rpb24gaW4gYW4gRUxGIGZpbGUuICBUaGlzCi0gICBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IGVsZl9uZXdfc2VjdGlvbl9ob29rLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhCi17Ci0gIC8qIFRoZSBFTEYgaGVhZGVyIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBFbGZfSW50ZXJuYWxfU2hkciB0aGlzX2hkcjsKLSAgLyogVGhlIEVMRiBoZWFkZXIgZm9yIHRoZSByZWxvYyBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgIHNlY3Rpb24sIGlmIGFueS4gICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyIHJlbF9oZHI7Ci0gIC8qIElmIHRoZXJlIGlzIGEgc2Vjb25kIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VjdGlvbiwKLSAgICAgYXMgY2FuIGhhcHBlbiBvbiBJcml4IDYsIHRoaXMgZmllbGQgcG9pbnRzIHRvIHRoZSBoZWFkZXIuICAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjI7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgY3VycmVudGx5IGFzc2lnbmVkIHRvIFJFTF9IRFIuICAqLwotICB1bnNpZ25lZCBpbnQgcmVsX2NvdW50OwotICAvKiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIGN1cnJlbnRseSBhc3NpZ25lZCB0byBSRUxfSERSMi4gICovCi0gIHVuc2lnbmVkIGludCByZWxfY291bnQyOwotICAvKiBUaGUgRUxGIHNlY3Rpb24gbnVtYmVyIG9mIHRoaXMgc2VjdGlvbi4gIE9ubHkgdXNlZCBmb3IgYW4gb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICBpbnQgdGhpc19pZHg7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHJlbG9jIHNlY3Rpb24gaW5kaWNhdGVkIGJ5Ci0gICAgIFJFTF9IRFIgaWYgYW55LiAgT25seSB1c2VkIGZvciBhbiBvdXRwdXQgZmlsZS4gICovCi0gIGludCByZWxfaWR4OwotICAvKiBUaGUgRUxGIHNlY3Rpb24gbnVtYmVyIG9mIHRoZSByZWxvYyBzZWN0aW9uIGluZGljYXRlZCBieQotICAgICBSRUxfSERSMiBpZiBhbnkuICBPbmx5IHVzZWQgZm9yIGFuIG91dHB1dCBmaWxlLiAgKi8KLSAgaW50IHJlbF9pZHgyOwotICAvKiBVc2VkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlciB0byBzdG9yZSB0aGUgc3ltYm9sIGhhc2ggdGFibGUgZW50cmllcwotICAgICBhc3NvY2lhdGVkIHdpdGggcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci0gIC8qIEEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCByZWxvY3MuICBJZiB0aGUgc2VjdGlvbiB1c2VzIFJFTCByZWxvY3MsCi0gICAgIHJhdGhlciB0aGFuIFJFTEEsIGFsbCB0aGUgcl9hZGRlbmQgZmllbGRzIHdpbGwgYmUgemVyby4gIFRoaXMKLSAgICAgcG9pbnRlciBtYXkgYmUgTlVMTC4gIEl0IGlzIHVzZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgLyogVXNlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgdG8KLSAgICAgcmVjb3JkIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBmb3IgYSBzZWN0aW9uIHN5bWJvbAotICAgICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2VjdGlvbi4gIEEgdmFsdWUgb2YgMCBtZWFucyB0aGF0IHRoZXJlIGlzCi0gICAgIG5vIGR5bmFtaWMgc3ltYm9sIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBsb25nIGR5bmluZHg7Ci0gIC8qIEEgcG9pbnRlciB1c2VkIGZvciAuc3RhYiBsaW5raW5nIG9wdGltaXphdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotICAvKiBBIHBvaW50ZXIgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIEVMRiBiYWNrZW5kLiAgKi8KLSAgUFRSIHRkYXRhOwotICAvKiBOb256ZXJvIGlmIHRoaXMgc2VjdGlvbiB1c2VzIFJFTEEgcmVsb2NhdGlvbnMsIHJhdGhlciB0aGFuIFJFTC4gICovCi0gIHVuc2lnbmVkIGludCB1c2VfcmVsYV9wOjE7Ci19OwotCi0jZGVmaW5lIGVsZl9zZWN0aW9uX2RhdGEoc2VjKSAgKChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEqKXNlYy0+dXNlZF9ieV9iZmQpCi0KLSNkZWZpbmUgZ2V0X2VsZl9iYWNrZW5kX2RhdGEoYWJmZCkgXAotICAoKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi0vKiBFbnVtZXJhdGlvbiB0byBzcGVjaWZ5IHRoZSBzcGVjaWFsIHNlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtCi17Ci0gIExJTktFUl9TRUNUSU9OX1VOS05PV04sCQkvKiBub3QgdXNlZCAqLwotICBMSU5LRVJfU0VDVElPTl9HT1QsCQkJLyogLmdvdCBzZWN0aW9uIGZvciBnbG9iYWwgb2Zmc2V0IHBvaW50ZXJzICovCi0gIExJTktFUl9TRUNUSU9OX1BMVCwJCQkvKiAucGx0IHNlY3Rpb24gZm9yIGdlbmVyYXRlZCBwcm9jZWR1cmUgc3R1YnMgKi8KLSAgTElOS0VSX1NFQ1RJT05fU0RBVEEsCQkJLyogLnNkYXRhLy5zYnNzIHNlY3Rpb24gZm9yIFBvd2VyUEMgKi8KLSAgTElOS0VSX1NFQ1RJT05fU0RBVEEyLAkJLyogLnNkYXRhMi8uc2JzczIgc2VjdGlvbiBmb3IgUG93ZXJQQyAqLwotICBMSU5LRVJfU0VDVElPTl9NQVgJCQkvKiAjIG9mIGxpbmtlciBzZWN0aW9ucyAqLwotfSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90OwotCi0vKiBTZWN0aW9ucyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb24KLXsKLSAgY2hhciAqbmFtZTsJCQkJLyogbmFtZSBvZiB0aGUgc2VjdGlvbiAqLwotICBjaGFyICpyZWxfbmFtZTsJCQkvKiBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIC5yZWx7LGF9LiBzZWN0aW9uICovCi0gIGNoYXIgKmJzc19uYW1lOwkJCS8qIG5hbWUgb2YgYSByZWxhdGVkIC5ic3Mgc2VjdGlvbiAqLwotICBjaGFyICpzeW1fbmFtZTsJCQkvKiBuYW1lIG9mIHN5bWJvbCB0byByZWZlcmVuY2UgdGhpcyBzZWN0aW9uICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwkJCS8qIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gKi8KLSAgYXNlY3Rpb24gKmJzc19zZWN0aW9uOwkJLyogcG9pbnRlciB0byB0aGUgYnNzIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgKi8KLSAgYXNlY3Rpb24gKnJlbF9zZWN0aW9uOwkJLyogcG9pbnRlciB0byB0aGUgcmVsb2NhdGlvbnMgbmVlZGVkIGZvciB0aGlzIHNlY3Rpb24gKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwkvKiBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIHN5bWJvbCBoYXNoIHZhbHVlICovCi0gIGJmZF92bWEgaW5pdGlhbF9zaXplOwkJCS8qIGluaXRpYWwgc2l6ZSBiZWZvcmUgYW55IGxpbmtlciBnZW5lcmF0ZWQgYWxsb2NhdGlvbnMgKi8KLSAgYmZkX3ZtYSBzeW1fb2Zmc2V0OwkJCS8qIG9mZnNldCBvZiBzeW1ib2wgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLwotICBiZmRfdm1hIGhvbGVfc2l6ZTsJCQkvKiBzaXplIG9mIHJlc2VydmVkIGFkZHJlc3MgaG9sZSBpbiBhbGxvY2F0aW9uICovCi0gIGJmZF92bWEgaG9sZV9vZmZzZXQ7CQkJLyogY3VycmVudCBvZmZzZXQgZm9yIHRoZSBob2xlICovCi0gIGJmZF92bWEgbWF4X2hvbGVfb2Zmc2V0OwkJLyogbWF4aW11bSBvZmZzZXQgZm9yIHRoZSBob2xlICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7CS8qIHdoaWNoIHNlY3Rpb24gdGhpcyBpcyAqLwotICBib29sZWFuIGhvbGVfd3JpdHRlbl9wOwkJLyogd2hldGhlciB0aGUgaG9sZSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50OwkJLyogYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbiAqLwotICBmbGFnd29yZCBmbGFnczsJCQkvKiBmbGFncyB0byB1c2UgdG8gY3JlYXRlIHRoZSBzZWN0aW9uICovCi19IGVsZl9saW5rZXJfc2VjdGlvbl90OwotCi0vKiBMaW5rZWQgbGlzdCBvZiBhbGxvY2F0ZWQgcG9pbnRlciBlbnRyaWVzLiAgVGhpcyBoYW5ncyBvZmYgb2YgdGhlIHN5bWJvbCBsaXN0cywgYW5kCi0gICBwcm92aWRlcyBhbGxvd3MgdXMgdG8gcmV0dXJuIGRpZmZlcmVudCBwb2ludGVycywgYmFzZWQgb24gZGlmZmVyZW50IGFkZGVuZCdzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzCi17Ci0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKm5leHQ7CS8qIG5leHQgYWxsb2NhdGVkIHBvaW50ZXIgZm9yIHRoaXMgc3ltYm9sICovCi0gIGJmZF92bWEgb2Zmc2V0OwkJCQkvKiBvZmZzZXQgb2YgcG9pbnRlciBmcm9tIGJlZ2lubmluZyBvZiBzZWN0aW9uICovCi0gIGJmZF9zaWduZWRfdm1hIGFkZGVuZDsJCQkvKiBhZGRlbmQgdXNlZCAqLwotICBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90IHdoaWNoOwkJLyogd2hpY2ggbGlua2VyIHNlY3Rpb24gdGhpcyBpcyAqLwotICBib29sZWFuIHdyaXR0ZW5fYWRkcmVzc19wOwkJCS8qIHdoZXRoZXIgYWRkcmVzcyB3YXMgd3JpdHRlbiB5ZXQgKi8KLX0gZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3Q7Ci0KLS8qIFNvbWUgcHJpdmF0ZSBkYXRhIGlzIHN0YXNoZWQgYXdheSBmb3IgZnV0dXJlIHVzZSB1c2luZyB0aGUgdGRhdGEgcG9pbnRlcgotICAgaW4gdGhlIGJmZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZWxmX29ial90ZGF0YQotewotICBFbGZfSW50ZXJuYWxfRWhkciBlbGZfaGVhZGVyWzFdOwkvKiBBY3R1YWwgZGF0YSwgYnV0IHJlZiBsaWtlIHB0ciAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmVsZl9zZWN0X3B0cjsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKnNlZ21lbnRfbWFwOwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWJfcHRyOwotICBpbnQgbnVtX2xvY2FsczsKLSAgaW50IG51bV9nbG9iYWxzOwotICBhc3ltYm9sICoqc2VjdGlvbl9zeW1zOwkJLyogU1RUX1NFQ1RJT04gc3ltYm9scyBmb3IgZWFjaCBzZWN0aW9uICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyIHN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyIHNoc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHluc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHluc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVyc3ltX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVycmVmX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVyZGVmX2hkcjsKLSAgdW5zaWduZWQgaW50IHN5bXRhYl9zZWN0aW9uLCBzaHN0cnRhYl9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgc3RydGFiX3NlY3Rpb24sIGR5bnN5bXRhYl9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgZHludmVyc3ltX3NlY3Rpb24sIGR5bnZlcmRlZl9zZWN0aW9uLCBkeW52ZXJyZWZfc2VjdGlvbjsKLSAgZmlsZV9wdHIgbmV4dF9maWxlX3BvczsKLSNpZiAwCi0gIC8qIHdlIGRvbid0IG5lZWQgdGhlc2UgaW5zaWRlIGJmZCBhbnltb3JlLCBhbmQgSSB0aGluawotICAgICB0aGVzZSB3ZXJlbid0IHVzZWQgb3V0c2lkZSBiZmQuICovCi0gIHZvaWQgKnByc3RhdHVzOwkJCS8qIFRoZSByYXcgL3Byb2MgcHJzdGF0dXMgc3RydWN0dXJlICovCi0gIHZvaWQgKnBycHNpbmZvOwkJCS8qIFRoZSByYXcgL3Byb2MgcHJwc2luZm8gc3RydWN0dXJlICovCi0jZW5kaWYKLSAgYmZkX3ZtYSBncDsJCQkJLyogVGhlIGdwIHZhbHVlIChNSVBTIG9ubHksIGZvciBub3cpICovCi0gIHVuc2lnbmVkIGludCBncF9zaXplOwkJCS8qIFRoZSBncCBzaXplIChNSVBTIG9ubHksIGZvciBub3cpICovCi0KLSAgLyogSW5mb3JtYXRpb24gZ3JhYmJlZCBmcm9tIGFuIGVsZiBjb3JlIGZpbGUuICovCi0gIGludCBjb3JlX3NpZ25hbDsKLSAgaW50IGNvcmVfcGlkOwotICBpbnQgY29yZV9sd3BpZDsKLSAgY2hhciogY29yZV9wcm9ncmFtOwotICBjaGFyKiBjb3JlX2NvbW1hbmQ7Ci0KLSAgLyogVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkIGJ5IHRoZSBiYWNrZW5kCi0gICAgIGxpbmtlci4gICovCi0gIGJvb2xlYW4gbGlua2VyOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGV4dGVybmFsIHN5bWJvbHMgdG8gZW50cmllcyBpbiB0aGUgbGlua2VyIGhhc2gKLSAgICAgdGFibGUsIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhpcyBpcyBpbmRleGVkIGJ5IHRoZSBzeW1ib2wgaW5kZXgKLSAgICAgbWludXMgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIHN5bWJvbCB0YWJsZSBoZWFkZXIuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0KLSAgLyogQSBtYXBwaW5nIGZyb20gbG9jYWwgc3ltYm9scyB0byBvZmZzZXRzIGludG8gdGhlIGdsb2JhbCBvZmZzZXQKLSAgICAgdGFibGUsIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhpcyBpcyBpbmRleGVkIGJ5IHRoZSBzeW1ib2wgaW5kZXguCi0gICAgIExpa2UgZm9yIHRoZSBnbG9iYWxzLCB3ZSB1c2UgYSB1bmlvbiBhbmQgdHdvIG5hbWVzIHByaW1hcmlseSB0bwotICAgICBkb2N1bWVudCB0aGUgaW50ZW50IG9mIGFueSBwYXJ0aWN1bGFyIHBpZWNlIG9mIGNvZGUuICBUaGUgZmllbGQKLSAgICAgc2hvdWxkIGJlIHVzZWQgYXMgYSBjb3VudCB1bnRpbCBzaXplX2R5bmFtaWNfc2VjdGlvbnMsIGF0IHdoaWNoCi0gICAgIHBvaW50IHRoZSBjb250ZW50cyBvZiB0aGUgLmdvdCBpcyBmaXhlZC4gIEFmdGVyd2FyZCwgaWYgYW4gZW50cnkKLSAgICAgaXMgLTEsIHRoZW4gdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSAqcmVmY291bnRzOwotICAgICAgYmZkX3ZtYSAqb2Zmc2V0czsKLSAgICB9IGxvY2FsX2dvdDsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIG9mZnNldHMgaW50byB0aGUgdmFyaW91cyBsaW5rZXIKLSAgICAgc2VjdGlvbnMgYWRkZWQuICBUaGlzIGlzIGluZGV4IGJ5IHRoZSBzeW1ib2wgaW5kZXguICAqLwotICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzOwotCi0gIC8qIFRoZSBsaW5rZXIgRUxGIGVtdWxhdGlvbiBjb2RlIG5lZWRzIHRvIGxldCB0aGUgYmFja2VuZCBFTEYgbGlua2VyCi0gICAgIGtub3cgd2hhdCBmaWxlbmFtZSBzaG91bGQgYmUgdXNlZCBmb3IgYSBkeW5hbWljIG9iamVjdCBpZiB0aGUKLSAgICAgZHluYW1pYyBvYmplY3QgaXMgZm91bmQgdXNpbmcgYSBzZWFyY2guICBUaGUgZW11bGF0aW9uIGNvZGUgdGhlbgotICAgICBzb21ldGltZXMgbmVlZHMgdG8ga25vdyB3aGF0IG5hbWUgd2FzIGFjdHVhbGx5IHVzZWQuICBVbnRpbCB0aGUKLSAgICAgZmlsZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbGlua2VyIHN5bWJvbCB0YWJsZSwgdGhpcyBmaWVsZCBob2xkcwotICAgICB0aGUgbmFtZSB0aGUgbGlua2VyIHdhbnRzLiAgQWZ0ZXIgaXQgaGFzIGJlZW4gYWRkZWQsIGl0IGhvbGRzIHRoZQotICAgICBuYW1lIGFjdHVhbGx5IHVzZWQsIHdoaWNoIHdpbGwgYmUgdGhlIERUX1NPTkFNRSBlbnRyeSBpZiB0aGVyZSBpcwotICAgICBvbmUuICAqLwotICBjb25zdCBjaGFyICpkdF9uYW1lOwotCi0gIC8qIElyaXggNSBvZnRlbiBzY3Jld3MgdXAgdGhlIHN5bWJvbCB0YWJsZSwgc29ydGluZyBsb2NhbCBzeW1ib2xzCi0gICAgIGFmdGVyIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBmbGFnIGlzIHNldCBpZiB0aGUgc3ltYm9sIHRhYmxlIGluCi0gICAgIHRoaXMgQkZEIGFwcGVhcnMgdG8gYmUgc2NyZXdlZCB1cC4gIElmIGl0IGlzLCB3ZSBpZ25vcmUgdGhlCi0gICAgIHNoX2luZm8gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBoZWFkZXIsIGFuZCBhbHdheXMgcmVhZCBhbGwgdGhlCi0gICAgIHN5bWJvbHMuICAqLwotICBib29sZWFuIGJhZF9zeW10YWI7Ci0KLSAgLyogUmVjb3JkcyB0aGUgcmVzdWx0IG9mIGBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZScuICAqLwotICBiZmRfc2l6ZV90eXBlIHByb2dyYW1faGVhZGVyX3NpemU7Ci0KLSAgLyogVXNlZCBieSBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogVXNlZCBieSBNSVBTIEVMRiBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gIFRoZSBzdHJ1Y3R1cmUKLSAgICAgY291bGQgYmUgaW5jbHVkZWQgZGlyZWN0bHkgaW4gdGhpcyBvbmUsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IHRvCi0gICAgIHdhc3RpbmcgdGhlIG1lbW9yeSBqdXN0IGZvciB0aGUgaW5mcmVxdWVudGx5IGNhbGxlZAotICAgICBmaW5kX25lYXJlc3RfbGluZS4gICovCi0gIHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKmZpbmRfbGluZV9pbmZvOwotCi0gIC8qIEEgcGxhY2UgdG8gc3Rhc2ggZHdhcmYxIGluZm8gZm9yIHRoaXMgYmZkLiAqLwotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnICpkd2FyZjFfZmluZF9saW5lX2luZm87Ci0KLSAgLyogQSBwbGFjZSB0byBzdGFzaCBkd2FyZjIgaW5mbyBmb3IgdGhpcyBiZmQuICovCi0gIHN0cnVjdCBkd2FyZjJfZGVidWcgKmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBBbiBhcnJheSBvZiBzdHViIHNlY3Rpb25zIGluZGV4ZWQgYnkgc3ltYm9sIG51bWJlciwgdXNlZCBieSB0aGUKLSAgICAgTUlQUyBFTEYgbGlua2VyLiAgRklYTUU6IFdlIHNob3VsZCBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIG9ubHkKLSAgICAgaW5jbHVkZSB0aGlzIGZpZWxkIGZvciBhIE1JUFMgRUxGIHRhcmdldC4gICovCi0gIGFzZWN0aW9uICoqbG9jYWxfc3R1YnM7Ci0KLSAgLyogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVfZmxhZ3MgZmllbGQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgYm9vbGVhbiBmbGFnc19pbml0OwotCi0gIC8qIE51bWJlciBvZiBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9ucyB3ZSBhcmUgYWJvdXQgdG8gZW1pdC4gICovCi0gIHVuc2lnbmVkIGludCBjdmVyZGVmczsKLQotICAvKiBOdW1iZXIgb2Ygc3ltYm9sIHZlcnNpb24gcmVmZXJlbmNlcyB3ZSBhcmUgYWJvdXQgdG8gZW1pdC4gICovCi0gIHVuc2lnbmVkIGludCBjdmVycmVmczsKLQotICAvKiBTeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9ucyBpbiBleHRlcm5hbCBvYmplY3RzLiAgKi8KLSAgRWxmX0ludGVybmFsX1ZlcmRlZiAqdmVyZGVmOwotCi0gIC8qIFN5bWJvbCB2ZXJzaW9uIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgb2JqZWN0cy4gICovCi0gIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp2ZXJyZWY7Ci0KLSAgLyogTGlua2VyIHNlY3Rpb25zIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uICpsaW5rZXJfc2VjdGlvblsgKGludClMSU5LRVJfU0VDVElPTl9NQVggXTsKLX07Ci0KLSNkZWZpbmUgZWxmX3RkYXRhKGJmZCkJCSgoYmZkKSAtPiB0ZGF0YS5lbGZfb2JqX2RhdGEpCi0jZGVmaW5lIGVsZl9lbGZoZWFkZXIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZWxmX2hlYWRlcikKLSNkZWZpbmUgZWxmX2VsZnNlY3Rpb25zKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGVsZl9zZWN0X3B0cikKLSNkZWZpbmUgZWxmX3Noc3RydGFiKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHN0cnRhYl9wdHIpCi0jZGVmaW5lIGVsZl9vbmVzeW10YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3ltdGFiX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW5zeW10YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHluc3ltdGFiX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJzeW0oYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVyc3ltX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJkZWYoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVyZGVmX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJyZWYoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVycmVmX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9udW1fbG9jYWxzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IG51bV9sb2NhbHMpCi0jZGVmaW5lIGVsZl9udW1fZ2xvYmFscyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBudW1fZ2xvYmFscykKLSNkZWZpbmUgZWxmX3NlY3Rpb25fc3ltcyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBzZWN0aW9uX3N5bXMpCi0jZGVmaW5lIGNvcmVfcHJwc2luZm8oYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gcHJwc2luZm8pCi0jZGVmaW5lIGNvcmVfcHJzdGF0dXMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gcHJzdGF0dXMpCi0jZGVmaW5lIGVsZl9ncChiZmQpCQkoZWxmX3RkYXRhKGJmZCkgLT4gZ3ApCi0jZGVmaW5lIGVsZl9ncF9zaXplKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGdwX3NpemUpCi0jZGVmaW5lIGVsZl9zeW1faGFzaGVzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHN5bV9oYXNoZXMpCi0jZGVmaW5lIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxvY2FsX2dvdC5yZWZjb3VudHMpCi0jZGVmaW5lIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyhiZmQpIChlbGZfdGRhdGEoYmZkKSAtPiBsb2NhbF9nb3Qub2Zmc2V0cykKLSNkZWZpbmUgZWxmX2xvY2FsX3B0cl9vZmZzZXRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzKQotI2RlZmluZSBlbGZfZHRfbmFtZShiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkdF9uYW1lKQotI2RlZmluZSBlbGZfYmFkX3N5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBiYWRfc3ltdGFiKQotI2RlZmluZSBlbGZfZmxhZ3NfaW5pdChiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBmbGFnc19pbml0KQotI2RlZmluZSBlbGZfbGlua2VyX3NlY3Rpb24oYmZkLG4pIChlbGZfdGRhdGEoYmZkKSAtPiBsaW5rZXJfc2VjdGlvblsoaW50KW5dKQotDAotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkZWYgKiwgRWxmX0ludGVybmFsX1ZlcmRlZiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkZWYgKiwgRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkYXV4ICosIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkYXV4ICosIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiwgRWxmX0ludGVybmFsX1Zlcm5lZWQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5lZWQgKiwgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqLCBFbGZfSW50ZXJuYWxfVmVybmF1eCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmF1eCAqLCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcnN5bSAqLCBFbGZfSW50ZXJuYWxfVmVyc3ltICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcnN5bSAqLCBFbGZfRXh0ZXJuYWxfVmVyc3ltICopKTsKLQotZXh0ZXJuIGludCBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBjaGFyICpiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpKTsKLWV4dGVybiBjaGFyICpiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosCi0JCQkJCSAgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci0jZGVmaW5lIGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiKGFiZmQsc3RyaW5kZXgpIFwKLSAgICAgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbihhYmZkLGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgsc3RyaW5kZXgpCi0KLSNkZWZpbmUgYmZkX2VsZjMyX3ByaW50X3N5bWJvbAliZmRfZWxmX3ByaW50X3N5bWJvbAotI2RlZmluZSBiZmRfZWxmNjRfcHJpbnRfc3ltYm9sCWJmZF9lbGZfcHJpbnRfc3ltYm9sCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGJmZF9lbGZfaGFzaCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJICAgIGFyZWxlbnQgKiwKLQkJCQkJCQkgICAgYXN5bWJvbCAqLAotCQkJCQkJCSAgICBQVFIsCi0JCQkJCQkJICAgIGFzZWN0aW9uICosCi0JCQkJCQkJICAgIGJmZCAqLAotCQkJCQkJCSAgICBjaGFyICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX21rY29yZWZpbGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBFbGZfSW50ZXJuYWxfU2hkciAqYmZkX2VsZl9maW5kX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIsIGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIKLSAgUEFSQU1TICgoYmZkICphYmZkLCBFbGZfSW50ZXJuYWxfUGhkciAqaGRyLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKnR5cGVuYW1lKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9saW5rX2hhc2hfY29weV9pbmRpcmVjdAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9saW5rX2hhc2hfaGlkZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJICAgICAgIGZpbGVfcHRyLAotCQkJCQkJICAgICAgIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLQkJCQkJCSAgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLAotCQkJCQkJCSBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9lbGZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkgICAgICAgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYWxlbnQgKl9iZmRfZWxmX2dldF9saW5lbm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkJdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCQkgICAgYXN5bWJvbCAqKiwKLQkJCQkJCSAgICBiZmRfdm1hLCBDT05TVCBjaGFyICoqLAotCQkJCQkJICAgIENPTlNUIGNoYXIgKiosCi0JCQkJCQkgICAgdW5zaWduZWQgaW50ICopKTsKLSNkZWZpbmUgX2JmZF9lbGZfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBfYmZkX2VsZl9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLWV4dGVybiBpbnQgX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciAKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGJvb2xlYW4pKTsKLQotLyogSWYgdGhlIHRhcmdldCBkb2Vzbid0IGhhdmUgcmVsb2MgaGFuZGxpbmcgd3JpdHRlbiB5ZXQ6ICAqLwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfbm9faW5mb190b19ob3d0byBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAotCQkJCQkgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCBzaGluZGV4KSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc2VjdGlvbl9mcm9tX3BoZHIgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotCi1leHRlcm4gaW50IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLQotYXNlY3Rpb24gKmJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQpKTsKLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfZWxmX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLWJvb2xlYW4KLV9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotbG9uZwotX2JmZF9lbGZfbGlua19sb29rdXBfbG9jYWxfZHluaW5keCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgYmZkICosIGxvbmcpKTsKLWJvb2xlYW4KLV9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci12b2lkIF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzIFBBUkFNUyAoKGJmZCAqKSk7Ci1maWxlX3B0ciBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiBQQVJBTVMgKChFbGZfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJCSAgICBmaWxlX3B0ciwKLQkJCQkJCQkgICAgYm9vbGVhbikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXVuc2lnbmVkIGxvbmcgX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1lbGZfbGlua2VyX3NlY3Rpb25fdCAqX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpkZWZhdWx0cykpOwotCi1lbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfcG9pbnRlcnMsCi0JICAgYmZkX3NpZ25lZF92bWEgYWRkZW5kLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2gpKTsKLQotYm9vbGVhbiBiZmRfZWxmMzJfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLQkgICBjb25zdCBFbGYzMl9JbnRlcm5hbF9SZWxhICpyZWwpKTsKLQotYmZkX3ZtYSBiZmRfZWxmMzJfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYWJmZCwKLQkgICBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgYmZkX3ZtYSByZWxvY2F0aW9uLAotCSAgIGNvbnN0IEVsZjMyX0ludGVybmFsX1JlbGEgKnJlbCwKLQkgICBpbnQgcmVsYXRpdmVfcmVsb2MpKTsKLQotYm9vbGVhbiBiZmRfZWxmNjRfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLQkgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWxhICpyZWwpKTsKLQotYmZkX3ZtYSBiZmRfZWxmNjRfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYWJmZCwKLQkgICBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgYmZkX3ZtYSByZWxvY2F0aW9uLAotCSAgIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlbGEgKnJlbCwKLQkgICBpbnQgcmVsYXRpdmVfcmVsb2MpKTsKLQotYm9vbGVhbiBfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEKLSAgUEFSQU1TICgoYmZkICpkeW5vYmosCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIGludCBhbGlnbm1lbnQpKTsKLQotYm9vbGVhbiBfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjMyX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjMyX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY2hhciAqYmZkX2VsZjMyX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgYmZkX2VsZjMyX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkJIGJmZCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfU3ltICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBQVFIpKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9SZWwgKiwgRWxmX0ludGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWwgKiwgRWxmMzJfRXh0ZXJuYWxfUmVsICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGYzMl9FeHRlcm5hbF9SZWxhICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3BoZHJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1BoZHIgKiwgRWxmX0ludGVybmFsX1BoZHIgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcGhkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIEVsZjMyX0V4dGVybmFsX1BoZHIgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfZHluX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQVFIsIEVsZl9JbnRlcm5hbF9EeW4gKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfZHluX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX0R5biAqLCBQVFIpKTsKLWV4dGVybiBsb25nIGJmZF9lbGYzMl9zbHVycF9zeW1ib2xfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl93cml0ZV9zaGRyc19hbmRfZWhkciBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBiZmRfZWxmMzJfd3JpdGVfb3V0X3BoZHJzCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIEVsZl9JbnRlcm5hbF9SZWxhICpfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYm9vbGVhbikpOwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjY0X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjY0X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY2hhciAqYmZkX2VsZjY0X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgYmZkX2VsZjY0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkJIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1N5bSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9yZWxvY19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVsICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICosIEVsZjY0X0V4dGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9waGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9QaGRyICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3BoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBFbGY2NF9FeHRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX2R5bl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9EeW4gKiwgUFRSKSk7Ci1leHRlcm4gbG9uZyBiZmRfZWxmNjRfc2x1cnBfc3ltYm9sX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgYmZkX2VsZjY0X3dyaXRlX291dF9waGRycwotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBFbGZfSW50ZXJuYWxfUmVsYSAqX2JmZF9lbGY2NF9saW5rX3JlYWRfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIEVsZl9JbnRlcm5hbF9SZWxhICosIGJvb2xlYW4pKTsKLQotI2RlZmluZSBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgXAotICBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgXAotICBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotCi1ib29sZWFuIF9iZmRfZWxmMzJfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGxvbmcpKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9saW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgbG9uZykpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgUFRSLAotICAgICAgICAgICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1ib29sZWFuIF9iZmRfZWxmMzJfZ2Nfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci1ib29sZWFuIF9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWJvb2xlYW4gX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Ci1ib29sZWFuIF9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKLQotYm9vbGVhbiBfYmZkX2VsZjY0X2djX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2djX2NvbW1vbl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfZ2NfcmVjb3JkX3Z0aW5oZXJpdAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2djX3JlY29yZF92dGVudHJ5Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Ci0KLS8qIE1JUFMgRUxGIHNwZWNpZmljIHJvdXRpbmVzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICopKTsKLWV4dGVybiB2b2lkIF9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLWV4dGVybiB2b2lkIF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGFzZWN0aW9uICogX2JmZF9taXBzX2VsZl9nY19tYXJrX2hvb2sgCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9nY19zd2VlcF9ob29rIAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGludCBfYmZkX21pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0KLS8qIFNIIEVMRiBzcGVjaWZpYyByb3V0aW5lLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX3NoX2VsZl9zZXRfbWFjaF9mcm9tX2ZsYWdzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSNlbmRpZiAvKiBfTElCRUxGX0hfICovCmRpZmYgLS1naXQgYS9iZmQvZWxmLWhwcGEuaCBiL2JmZC9lbGYtaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTVlMWM0Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYtaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg4NCArMCwwIEBACi0vKiBDb21tb24gY29kZSBmb3IgUEEgRUxGIGltcGxlbWVudGF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEVMRl9IT1dUT19UQUJMRV9TSVpFICAgICAgIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQgKyAxCi0KLS8qIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBtdWx0aXBsZSBQQSBFTEYgQkZEIGJhY2tlbmRzIHdpdGggZGlmZmVyZW50Ci0gICBzaXplcy4KLQotICAgTW9zdCBvZiB0aGUgcm91dGluZXMgYXJlIHdyaXR0ZW4gdG8gYmUgc2l6ZSBpbmRlcGVuZGVudCwgYnV0IHNvbWV0aW1lcwotICAgZXh0ZXJuYWwgY29uc3RyYWludHMgcmVxdWlyZSAzMiBvciA2NCBiaXQgc3BlY2lmaWMgY29kZS4gIFdlIHJlbWFwCi0gICB0aGUgZGVmaW5pdGlvbnMvZnVuY3Rpb25zIGFzIG5lY2Vzc2FyeSBoZXJlLiAgKi8KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgRUxGX1JfVFlQRShYKSAgIEVMRjY0X1JfVFlQRShYKQotI2RlZmluZSBFTEZfUl9TWU0oWCkgICBFTEY2NF9SX1NZTShYKQotI2RlZmluZSBfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlIF9iZmRfZWxmNjRfaHBwYV9nZW5fcmVsb2NfdHlwZQotI2RlZmluZSBlbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uIGVsZjY0X2hwcGFfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmX2JmZF9maW5hbF9saW5rIGJmZF9lbGY2NF9iZmRfZmluYWxfbGluawotI2RlZmluZSBlbGZfaHBwYV9maW5hbF9saW5rIGVsZjY0X2hwcGFfZmluYWxfbGluawotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIEVMRl9SX1RZUEUoWCkgICBFTEYzMl9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGX1JfU1lNKFgpICAgRUxGMzJfUl9TWU0oWCkKLSNkZWZpbmUgX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSBfYmZkX2VsZjMyX2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSNkZWZpbmUgZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbiBlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZl9iZmRfZmluYWxfbGluayBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsKLSNkZWZpbmUgZWxmX2hwcGFfZmluYWxfbGluayBlbGYzMl9ocHBhX2ZpbmFsX2xpbmsKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0gICAgICAgICAgIGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLSAgICAgICAgICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9ocHBhX3JlbG9jYXRlX2luc24KLSAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgdW5zaWduZWQgbG9uZykpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfaHBwYV9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9ocHBhX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2hwcGFfdW5tYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfaHBwYV9yZW1hcmtfdXNlbGVzc19keW5hbWljX3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkIGVsZl9ocHBhX3JlY29yZF9zZWdtZW50X2FkZHJzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotLyogRUxGL1BBIHJlbG9jYXRpb24gaG93dG8gZW50cmllcy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9ocHBhX2hvd3RvX3RhYmxlW0VMRl9IT1dUT19UQUJMRV9TSVpFXSA9Ci17Ci0gIHtSX1BBUklTQ19OT05FLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX05PTkUifSwKLQotICAvKiBUaGUgdmFsdWVzIGluIERJUjMyIGFyZSB0byBwbGFjYXRlIHRoZSBjaGVjayBpbgotICAgICBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIHtSX1BBUklTQ19ESVIzMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMzIiLCBmYWxzZSwgMCwgMHhmZmZmZmZmZiwgZmFsc2V9LAotICB7Ul9QQVJJU0NfRElSMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIyMUwifSwKLSAge1JfUEFSSVNDX0RJUjE3UiwgMCwgMCwgMTcsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTdSIn0sCi0gIHtSX1BBUklTQ19ESVIxN0YsIDAsIDAsIDE3LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE3RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ESVIxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE0UiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1BDUkVMMzIsIDAsIDAsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwzMiJ9LAotCi0gIHtSX1BBUklTQ19QQ1JFTDIxTCwgMCwgMCwgMjEsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDIxTCJ9LAotICB7Ul9QQVJJU0NfUENSRUwxN1IsIDAsIDAsIDE3LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxN1IifSwKLSAge1JfUEFSSVNDX1BDUkVMMTdGLCAwLCAwLCAxNywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTdGIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE3QywgMCwgMCwgMTcsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE3QyJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNFIsIDAsIDAsIDE0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNFIifSwKLSAge1JfUEFSSVNDX1BDUkVMMTRGLCAwLCAwLCAxNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTRGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRFBSRUwyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RQUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19EUFJFTDE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwxNFdSIn0sCi0KLSAge1JfUEFSSVNDX0RQUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19EUFJFTDE0RFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRFBSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RQUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19EUFJFTDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwxNEYifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ETFRSRUwyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19ETFRSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDE0UiJ9LAotICB7Ul9QQVJJU0NfRExUUkVMMTRGLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwxNEYifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ETFRJTkQyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVElORDIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQxNFIifSwKLSAge1JfUEFSSVNDX0RMVElORDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUSU5EMTRGIn0sCi0KLSAge1JfUEFSSVNDX1NFVEJBU0UsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VUQkFTRSJ9LAotICB7Ul9QQVJJU0NfU0VDUkVMMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VDUkVMMzIifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwyMUwifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxN1IsIDAsIDAsIDE3LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxN1IifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxN0YsIDAsIDAsIDE3LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxN0YifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDE0UiJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDE0RiJ9LAotICB7Ul9QQVJJU0NfU0VHQkFTRSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19TRUdCQVNFIn0sCi0gIHtSX1BBUklTQ19TRUdSRUwzMiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19TRUdSRUwzMiJ9LAotCi0gIHtSX1BBUklTQ19QTFRPRkYyMUwsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMTRSIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNEYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMTRGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIzMiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9GUFRSMzIifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIyMUwsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRlBUUjY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0ZQVFI2NCJ9LAotICB7Ul9QQVJJU0NfUExBQkVMMzIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMQUJFTDMyIn0sCi0gIHtSX1BBUklTQ19QTEFCRUwyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMQUJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19QTEFCRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMQUJFTDE0UiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMNjQifSwKLSAge1JfUEFSSVNDX1BDUkVMMjJDLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMjJDIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDIyRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDIyRiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTRXUiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTREUiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNkYifSwKLSAge1JfUEFSSVNDX1BDUkVMMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE2V0YifSwKLSAge1JfUEFSSVNDX1BDUkVMMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE2REYifSwKLQotICB7Ul9QQVJJU0NfRElSNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSNjQifSwKLSAge1JfUEFSSVNDX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTk9ORSJ9LAotICB7Ul9QQVJJU0NfTk9ORSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19OT05FIn0sCi0gIHtSX1BBUklTQ19ESVIxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE0V1IifSwKLSAge1JfUEFSSVNDX0RJUjE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTREUiJ9LAotICB7Ul9QQVJJU0NfRElSMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE2RiJ9LAotICB7Ul9QQVJJU0NfRElSMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNldGIn0sCi0gIHtSX1BBUklTQ19ESVIxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE2REYifSwKLSAge1JfUEFSSVNDX0dQUkVMNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfR1BSRUw2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwxNFdSIn0sCi0gIHtSX1BBUklTQ19ETFRSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDE0RFIifSwKLSAge1JfUEFSSVNDX0dQUkVMMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0dQUkVMMTZGIn0sCi0gIHtSX1BBUklTQ19HUFJFTDE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfR1BSRUwxNldGIn0sCi0gIHtSX1BBUklTQ19HUFJFTDE2REYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfR1BSRUwxNkRGIn0sCi0gIHtSX1BBUklTQ19MVE9GRjY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGNjQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ETFRJTkQxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVElORDE0V1IifSwKLQotICB7Ul9QQVJJU0NfRExUSU5EMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQxNERSIn0sCi0gIHtSX1BBUklTQ19MVE9GRjE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRjE2RiJ9LAotICB7Ul9QQVJJU0NfTFRPRkYxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGMTZERiJ9LAotICB7Ul9QQVJJU0NfTFRPRkYxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGMTZERiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JTRVJFTDE0V1IifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfU0VHUkVMNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VHUkVMNjQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE0V1IifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMTREUiJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE2RiJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNldGIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE2REYifSwKLQotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9GUFRSMTRXUiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE2RiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0NPUFksIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfQ09QWSJ9LAotICB7Ul9QQVJJU0NfSVBMVCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19JUExUIn0sCi0KLSAge1JfUEFSSVNDX0VQTFQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRVBMVCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUwzMiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19UUFJFTDMyIn0sCi0gIHtSX1BBUklTQ19UUFJFTDIxTCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19UUFJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVFBSRUwxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAyMUwsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfVFAyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTRGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUw2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19UUFJFTDY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTRXUiJ9LAotCi0gIHtSX1BBUklTQ19UUFJFTDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVFBSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19UUFJFTDE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19UUFJFTDE2RiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTZXRiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1RQUkVMMTZERiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFA2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTRXUiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTREUiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfTFRPRkZfVFAxNkYifSwKLQotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTZXRiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMTZERiJ9LAotfTsKLQotI2RlZmluZSBPRkZTRVRfMTRSX0ZST01fMjFMIDQKLSNkZWZpbmUgT0ZGU0VUXzE0Rl9GUk9NXzIxTCA1Ci0KLS8qIFJldHVybiBvbmUgKG9yIG1vcmUpIEJGRCByZWxvY2F0aW9ucyB3aGljaCBpbXBsZW1lbnQgdGhlIGJhc2UKLSAgIHJlbG9jYXRpb24gd2l0aCBtb2RpZmljYXRpb25zIGJhc2VkIG9uIGZvcm1hdCBhbmQgZmllbGQuICAqLwotCi1lbGZfaHBwYV9yZWxvY190eXBlICoqCi1fYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlIChhYmZkLCBiYXNlX3R5cGUsIGZvcm1hdCwgZmllbGQsIGlnbm9yZSwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVsZl9ocHBhX3JlbG9jX3R5cGUgYmFzZV90eXBlOwotICAgICBpbnQgZm9ybWF0OwotICAgICBpbnQgZmllbGQ7Ci0gICAgIGludCBpZ25vcmU7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgZWxmX2hwcGFfcmVsb2NfdHlwZSAqZmluYWx0eXBlOwotICBlbGZfaHBwYV9yZWxvY190eXBlICoqZmluYWxfdHlwZXM7Ci0KLSAgLyogQWxsb2NhdGUgc2xvdHMgZm9yIHRoZSBCRkQgcmVsb2NhdGlvbi4gICovCi0gIGZpbmFsX3R5cGVzID0gKChlbGZfaHBwYV9yZWxvY190eXBlICoqKQotCQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9ocHBhX3JlbG9jX3R5cGUgKikgKiAyKSk7Ci0gIGlmIChmaW5hbF90eXBlcyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmVsb2NhdGlvbiBpdHNlbGYuICAqLwotICBmaW5hbHR5cGUgPSAoKGVsZl9ocHBhX3JlbG9jX3R5cGUgKikKLQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9ocHBhX3JlbG9jX3R5cGUpKSk7Ci0gIGlmIChmaW5hbHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTb21lIHJlYXNvbmFibGUgZGVmYXVsdHMuICAqLwotICBmaW5hbF90eXBlc1swXSA9IGZpbmFsdHlwZTsKLSAgZmluYWxfdHlwZXNbMV0gPSBOVUxMOwotCi0jZGVmaW5lIGZpbmFsX3R5cGUgZmluYWx0eXBlWzBdCi0KLSAgZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQotICAvKiBKdXN0IGEgdGFuZ2xlIG9mIG5lc3RlZCBzd2l0Y2ggc3RhdGVtZW50cyB0byBkZWFsIHdpdGggdGhlIGJyYWluZGFtYWdlCi0gICAgIHRoYXQgYSBkaWZmZXJlbnQgZmllbGQgc2VsZWN0b3IgbWVhbnMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCByZWxvY2F0aW9uCi0gICAgIGZvciBQQSBFTEYuICAqLwotICBzd2l0Y2ggKGJhc2VfdHlwZSkKLSAgICB7Ci0gICAgLyogV2UgaGF2ZSBiZWVuIHVzaW5nIGdlbmVyaWMgcmVsb2NhdGlvbiB0eXBlcy4gIEhvd2V2ZXIsIHRoYXQgbWF5IG5vdAotICAgICAgIHJlYWxseSBtYWtlIHNlbnNlLiAgQW55d2F5LCB3ZSBuZWVkIHRvIHN1cHBvcnQgYm90aCBSX1BBUklTQ19ESVI2NAotICAgICAgIGFuZCBSX1BBUklTQ19ESVIzMiBoZXJlLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RJUjMyOgotICAgIGNhc2UgUl9QQVJJU0NfRElSNjQ6Ci0gICAgY2FzZSBSX0hQUEFfQUJTX0NBTEw6Ci0gICAgICBzd2l0Y2ggKGZvcm1hdCkKLQl7Ci0JY2FzZSAxNDoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMTRSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnRzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RMVElORDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3J0cHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV90c2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ETFRJTkQxNEY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9ycHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUExBQkVMMTRSOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMTc6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9mc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIxN0Y7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjE3UjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDIxOgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfbHNlbDoKLQkgICAgY2FzZSBlX2xyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9sdHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRExUSU5EMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfbHRwc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19MVE9GRl9GUFRSMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfbHBzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BMQUJFTDIxTDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDMyOgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMzI7Ci0JICAgICAgLyogV2hlbiBpbiA2NGJpdCBtb2RlLCBhIDMyYml0IHJlbG9jYXRpb24gaXMgc3VwcG9zZWQgdG8KLQkJIGJlIGEgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAgRHdhcmYyIChmb3IgZXhhbXBsZSkKLQkJIHVzZXMgMzJiaXQgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9ucy4gICovCi0JICAgICAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcyAhPSAzMikKLQkgICAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19TRUNSRUwzMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3BzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BMQUJFTDMyOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgNjQ6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9mc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVI2NDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3BzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0ZQVFI2NDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgUl9IUFBBX0dPVE9GRjoKLSAgICAgIHN3aXRjaCAoZm9ybWF0KQotCXsKLQljYXNlIDE0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBiYXNlX3R5cGUgKyBPRkZTRVRfMTRSX0ZST01fMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gYmFzZV90eXBlICsgT0ZGU0VUXzE0Rl9GUk9NXzIxTDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDIxOgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfbHJzZWw6Ci0JICAgIGNhc2UgZV9sc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSFBQQV9QQ1JFTF9DQUxMOgotICAgICAgc3dpdGNoIChmb3JtYXQpCi0JewotCWNhc2UgMTQ6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTRSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxNEY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAxNzoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxN1I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9mc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE3RjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDIyOgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwyMkY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xzZWw6Ci0JICAgIGNhc2UgZV9scnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1BBUklTQ19TRUdSRUwzMjoKLSAgICBjYXNlIFJfUEFSSVNDX1NFR0JBU0U6Ci0gICAgICAvKiBUaGUgZGVmYXVsdHMgYXJlIGZpbmUgZm9yIHRoZXNlIGNhc2VzLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZmluYWxfdHlwZXM7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBmcm9tIGFuIGVsZiBpbnRvIGZpZWxkIGludG8gYSBob3d0byByZWxvY2F0aW9uIHBvaW50ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2hwcGFfaW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZWxmX3JlbG9jOwotewotICBCRkRfQVNTRVJUIChFTEZfUl9UWVBFKGVsZl9yZWxvYy0+cl9pbmZvKQotCSAgICAgIDwgKHVuc2lnbmVkIGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCk7Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZWxmX2hwcGFfaG93dG9fdGFibGVbRUxGX1JfVFlQRSAoZWxmX3JlbG9jLT5yX2luZm8pXTsKLX0KLQotLyogVHJhbnNsYXRlIGZyb20gYW4gZWxmIGludG8gZmllbGQgaW50byBhIGhvd3RvIHJlbG9jYXRpb24gcG9pbnRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfaHBwYV9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGZfSW50ZXJuYWxfUmVsICplbGZfcmVsb2M7Ci17Ci0gIEJGRF9BU1NFUlQgKEVMRl9SX1RZUEUoZWxmX3JlbG9jLT5yX2luZm8pCi0JICAgICAgPCAodW5zaWduZWQgaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKTsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZlbGZfaHBwYV9ob3d0b190YWJsZVtFTEZfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbyldOwotfQotCi0vKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGhvd3RvIHRhYmxlIGVudHJ5IHRvIHBlcmZvcm0gdGhlIENPREUKLSAgIHJlbG9jYXRpb24gZm9yIGFuIEFSQ0ggbWFjaGluZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpZiAoKGludCkgY29kZSA8IChpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoKGludCkgZWxmX2hwcGFfaG93dG9fdGFibGVbKGludCkgY29kZV0udHlwZSA9PSAoaW50KSBjb2RlKTsKLSAgICAgIHJldHVybiAmZWxmX2hwcGFfaG93dG9fdGFibGVbKGludCkgY29kZV07Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlcjsKLXsKLSAgaW50IG1hY2ggPSBiZmRfZ2V0X21hY2ggKGFiZmQpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9IH4oRUZfUEFSSVNDX0FSQ0ggfCBFRl9QQVJJU0NfVFJBUE5JTAotCQkJCSAgICAgfCBFRl9QQVJJU0NfRVhUIHwgRUZfUEFSSVNDX0xTQgotCQkJCSAgICAgfCBFRl9QQVJJU0NfV0lERSB8IEVGX1BBUklTQ19OT19LQUJQCi0JCQkJICAgICB8IEVGX1BBUklTQ19MQVpZU1dBUCk7Ci0KLSAgaWYgKG1hY2ggPT0gMTApCi0gICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZBX1BBUklTQ18xXzA7Ci0gIGVsc2UgaWYgKG1hY2ggPT0gMTEpCi0gICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZBX1BBUklTQ18xXzE7Ci0gIGVsc2UgaWYgKG1hY2ggPT0gMjApCi0gICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZBX1BBUklTQ18yXzA7Ci0gIGVsc2UgaWYgKG1hY2ggPT0gMjUpCi0gICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gKEVGX1BBUklTQ19XSURFCi0JCQkJICAgICAgfCBFRkFfUEFSSVNDXzJfMAotCQkJCSAgICAgIC8qIFRoZSBHTlUgdG9vbHMgaGF2ZSB0cmFwcGVkIHdpdGhvdXQKLQkJCQkJIG9wdGlvbiBzaW5jZSAxOTkzLCBzbyBuZWVkIHRvIHRha2UKLQkJCQkJIGEgc3RlcCBiYWNrd2FyZHMgd2l0aCB0aGUgRUxGCi0JCQkJCSBiYXNlZCB0b29sY2hhaW5zLiAgKi8KLQkJCQkgICAgICB8IEVGX1BBUklTQ19UUkFQTklMKTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgU1lNIHJlcHJlc2VudHMgYSBsb2NhbCBsYWJlbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2hwcGFfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnJCcpOwotfQotCi0vKiBTZXQgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYW4gRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQotICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjY0X0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5QQVJJU0MudW53aW5kIikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgaW5keDsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTE9QUk9DICsgMTsKLSAgICAgIC8qID8hPyBIb3cgYXJlIHVud2luZHMgc3VwcG9zZWQgdG8gd29yayBmb3Igc3ltYm9scyBpbiBhcmJpdHJhcnkKLQkgc2VjdGlvbnM/ICBPciB3aGF0IGlmIHdlIGhhdmUgbXVsdGlwbGUgLnRleHQgc2VjdGlvbnMgaW4gYSBzaW5nbGUKLQkgLm8gZmlsZT8gIEhQIHJlYWxseSBtZXNzZWQgdXAgb24gdGhpcyBvbmUuCi0KLQkgVWdoLiAgV2UgY2FuIG5vdCB1c2UgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHggYXQgdGhpcwotCSBwb2ludCBiZWNhdXNlIGl0IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuCi0KLQkgU28gd2UgKGdhc3ApIHJlY29tcHV0ZSBpdCBoZXJlLiAgSG9wZWZ1bGx5IG5vYm9keSBldmVyIGNoYW5nZXMgdGhlCi0JIHdheSBzZWN0aW9ucyBhcmUgbnVtYmVyZWQgaW4gZWxmLmMhICAqLwotICAgICAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9ucywgaW5keCA9IDE7IHNlYzsgc2VjID0gc2VjLT5uZXh0LCBpbmR4KyspCi0JewotCSAgaWYgKHNlYy0+bmFtZSAmJiBzdHJjbXAgKHNlYy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLQkgICAgewotCSAgICAgIGhkci0+c2hfaW5mbyA9IGluZHg7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEkgaGF2ZSBubyBpZGVhIGlmIHRoaXMgaXMgcmVhbGx5IG5lY2Vzc2FyeSBvciB3aGF0IGl0IG1lYW5zLiAgKi8KLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDQ7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIEhQJ3MgbGlicmFyaWVzIGRlZmluZSBzeW1ib2xzIHdpdGggSFAgc3BlY2lmaWMgc2VjdGlvbgotICAgaW5kaWNlcywgd2hpY2ggd2UgaGF2ZSB0byBoYW5kbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2hwcGFfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGludCBpbmRleCA9IHN5bS0+c3Rfc2huZHg7Ci0KLSAgc3dpdGNoIChpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fUEFSSVNDX0FOU0lfQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuUEFSSVNDLmFuc2kuY29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX1BBUklTQ19IVUdFX0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLlBBUklTQy5odWdlLmNvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2hwcGFfdW5tYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopZGF0YTsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIHN5bWJvbCBpcwotICAgICByZWZlcmVuY2VkIGJ5IGEgc2hhcmVkIGxpYnJhcnkgYnV0IGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLCB0aGVuCi0gICAgIHRoZSBnZW5lcmljIGNvZGUgd2lsbCB3YXJuIHRoYXQgaXQgaXMgdW5kZWZpbmVkLgotCi0gICAgIFRoaXMgYmVoYXZpb3IgaXMgdW5kZXNpcmFibGUgb24gSFBzIHNpbmNlIHRoZSBzdGFuZGFyZCBzaGFyZWQKLSAgICAgbGlicmFyaWVzIGNvbnRhaW4gcmVlcmVuY2VzIHRvIHVuZGVmaW5lZCBzeW1ib2xzLgotCi0gICAgIFNvIHdlIHR3aWRkbGUgdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBzdWNoIHN5bWJvbHMgc28gdGhhdCB0aGV5Ci0gICAgIHdpbGwgbm90IHRyaWdnZXIgdGhlIHdhcm5pbmcuICA/IT8gRklYTUUuICBUaGlzIGlzIGhvcnJpYmx5IGZyYWdsaWUuCi0KLSAgICAgVWx0aW1hdGVseSB3ZSBzaG91bGQgaGF2ZSBiZXR0ZXIgY29udHJvbHMgb3ZlciB0aGUgZ2VuZXJpYyBFTEYgQkZECi0gICAgIGxpbmtlciBjb2RlLiAgKi8KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIChpbmZvLT5zaGFyZWQKLQkgICAgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQzsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gMHg4MDAwOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopZGF0YTsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIHN5bWJvbCBpcwotICAgICByZWZlcmVuY2VkIGJ5IGEgc2hhcmVkIGxpYnJhcnkgYnV0IGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLCB0aGVuCi0gICAgIHRoZSBnZW5lcmljIGNvZGUgd2lsbCB3YXJuIHRoYXQgaXQgaXMgdW5kZWZpbmVkLgotCi0gICAgIFRoaXMgYmVoYXZpb3IgaXMgdW5kZXNpcmFibGUgb24gSFBzIHNpbmNlIHRoZSBzdGFuZGFyZCBzaGFyZWQKLSAgICAgbGlicmFyaWVzIGNvbnRhaW4gcmVlcmVuY2VzIHRvIHVuZGVmaW5lZCBzeW1ib2xzLgotCi0gICAgIFNvIHdlIHR3aWRkbGUgdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBzdWNoIHN5bWJvbHMgc28gdGhhdCB0aGV5Ci0gICAgIHdpbGwgbm90IHRyaWdnZXIgdGhlIHdhcm5pbmcuICA/IT8gRklYTUUuICBUaGlzIGlzIGhvcnJpYmx5IGZyYWdpbGUuCi0KLSAgICAgVWx0aW1hdGVseSB3ZSBzaG91bGQgaGF2ZSBiZXR0ZXIgY29udHJvbHMgb3ZlciB0aGUgZ2VuZXJpYyBFTEYgQkZECi0gICAgIGxpbmtlciBjb2RlLiAgKi8KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIChpbmZvLT5zaGFyZWQKLQkgICAgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgMHg4MDAwKSAhPSAwKQotICAgIHsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQzsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfjB4ODAwMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCB0aGUgbG93ZXN0IGFkZHJlc3MgZm9yIHRoZSBkYXRhIGFuZCB0ZXh0IHNlZ21lbnRzLiAgKi8KLXN0YXRpYyB2b2lkCi1lbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycyAoYWJmZCwgc2VjdGlvbiwgZGF0YSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICpocHBhX2luZm87Ci0gIGJmZF92bWEgdmFsdWU7Ci0gCi0gIGhwcGFfaW5mbyA9IChzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKilkYXRhOwotCi0gIHZhbHVlID0gc2VjdGlvbi0+dm1hIC0gc2VjdGlvbi0+ZmlsZXBvczsKLQotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZKQotICAgICAgID09IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSkpCi0gICAgICAmJiB2YWx1ZSA8IGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2UpCi0gICAgaHBwYV9pbmZvLT50ZXh0X3NlZ21lbnRfYmFzZSA9IHZhbHVlOwotICBlbHNlIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkpCi0gICAgICAgPT0gKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkKLSAgICAgICYmIHZhbHVlIDwgaHBwYV9pbmZvLT5kYXRhX3NlZ21lbnRfYmFzZSkKLSAgICBocHBhX2luZm8tPmRhdGFfc2VnbWVudF9iYXNlID0gdmFsdWU7Ci19Ci0KLS8qIENhbGxlZCBhZnRlciB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBpbnB1dCBmaWxlcy9zZWN0aW9ucywgYnV0IGJlZm9yZQotICAgZmluYWwgc3ltYm9sIHJlc29sdXRpb24gYW5kIHNlY3Rpb24gcGxhY2VtZW50IGhhcyBiZWVuIGRldGVybWluZWQuCi0KLSAgIFdlIHVzZSB0aGlzIGhvb2sgdG8gKHBvc3NpYmx5KSBwcm92aWRlIGEgdmFsdWUgZm9yIF9fZ3AsIHRoZW4gd2UKLSAgIGZhbGwgYmFjayB0byB0aGUgZ2VuZXJpYyBFTEYgZmluYWwgbGluayByb3V0aW5lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gcmV0dmFsOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZ3A7Ci0gICAgICBiZmRfdm1hIGdwX3ZhbDsKLSAgICAgIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotCi0gICAgICBocHBhX2luZm8gPSBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pOwotCi0gICAgICAvKiBUaGUgbGlua2VyIHNjcmlwdCBkZWZpbmVzIGEgdmFsdWUgZm9yIF9fZ3AgaWZmIGl0IHdhcyByZWZlcmVuY2VkCi0JIGJ5IG9uZSBvZiB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQuICBGaXJzdCB0cnkgdG8gZmluZCB0aGUgc3ltYm9sCi0JIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgdGhhdCBmYWlscywganVzdCBjb21wdXRlIHRoZSB2YWx1ZSBfX2dwCi0JIHNob3VsZCBoYXZlIGhhZC4gICovCi0gICAgICBncCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksICJfX2dwIiwgZmFsc2UsCi0JCQkJIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIGlmIChncCkKLQl7Ci0KLQkgIC8qIEFkanVzdCB0aGUgdmFsdWUgb2YgX19ncCBhcyB3ZSBtYXkgd2FudCB0byBzbGlkZSBpdCBpbnRvIHRoZQotCSAgICAgLnBsdCBzZWN0aW9uIHNvIHRoYXQgdGhlIHN0dWJzIGNhbiBhY2Nlc3MgUExUIGVudHJpZXMgd2l0aG91dAotCSAgICAgdXNpbmcgYW4gYWRkaWwgc2VxdWVuY2UuICAqLwotCSAgZ3AtPnJvb3QudS5kZWYudmFsdWUgKz0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z3Bfb2Zmc2V0OwotCi0JICBncF92YWwgPSAoZ3AtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBncC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIGdwLT5yb290LnUuZGVmLnZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLSAgCi0KLQkgIC8qIEZpcnN0IGxvb2sgZm9yIGEgLnBsdCBzZWN0aW9uLiAgSWYgZm91bmQsIHRoZW4gX19ncCBpcyB0aGUKLQkgICAgIGFkZHJlc3Mgb2YgdGhlIC5wbHQgKyBncF9vZmZzZXQuCi0KLQkgICAgIElmIG5vIC5wbHQgaXMgZm91bmQsIHRoZW4gbG9vayBmb3IgLmRsdCwgLm9wZCBhbmQgLmRhdGEgKGluCi0JICAgICB0aGF0IG9yZGVyKSBhbmQgc2V0IF9fZ3AgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB3aGljaGV2ZXIgc2VjdGlvbgotCSAgICBpcyBmb3VuZCBmaXJzdC4gICovCi0KLQkgIHNlYyA9IGhwcGFfaW5mby0+cGx0X3NlYzsKLQkgIGlmIChzZWMpCi0JICAgIGdwX3ZhbCA9IChzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBocHBhX2luZm8tPmdwX29mZnNldCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBocHBhX2luZm8tPmRsdF9zZWM7Ci0JICAgICAgaWYgKCFzZWMpCi0JCXNlYyA9IGhwcGFfaW5mby0+b3BkX3NlYzsKLQkgICAgICBpZiAoIXNlYykKLQkJc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGF0YSIpOwotCSAgICAgIGlmICghc2VjKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBncF92YWwgPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEluc3RhbGwgd2hhdGV2ZXIgdmFsdWUgd2UgZm91bmQvY29tcHV0ZWQgZm9yIF9fZ3AuICAqLwotICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwX3ZhbCk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8ga25vdyB0aGUgYmFzZSBvZiB0aGUgdGV4dCBhbmQgZGF0YSBzZWdtZW50cyBzbyB0aGF0IHdlCi0gICAgIGNhbiBwZXJmb3JtIFNFR1JFTCByZWxvY2F0aW9ucy4gIFdlIHdpbGwgcmVjb3JlIHRoZSBiYXNlIGFkZHJlc3NlcwotICAgICB3aGVuIHdlIGVuY291bnRlciB0aGUgZmlyc3QgU0VHUkVMIHJlbG9jYXRpb24uICAqLwotICBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT50ZXh0X3NlZ21lbnRfYmFzZSA9IChiZmRfdm1hKS0xOwotICBlbGY2NF9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5kYXRhX3NlZ21lbnRfYmFzZSA9IChiZmRfdm1hKS0xOwotCi0gIC8qIEhQJ3Mgc2hhcmVkIGxpYnJhcmllcyBoYXZlIHJlZmVyZW5jZXMgdG8gc3ltYm9scyB0aGF0IGFyZSBub3QKLSAgICAgZGVmaW5lZCBhbnl3aGVyZS4gIFRoZSBnZW5lcmljIEVMRiBCRkQgbGlua2VyIGNvZGUgd2lsbCBjb21wbGFpbQotICAgICBhYm91dCBzdWNoIHN5bWJvbHMuCi0KLSAgICAgU28gd2UgZGV0ZWN0IHRoZSBsb3NpbmcgY2FzZSBhbmQgYXJyYW5nZSBmb3IgdGhlIGZsYWdzIG9uIHRoZSBzeW1ib2wKLSAgICAgdG8gaW5kaWNhdGUgdGhhdCBpdCB3YXMgbmV2ZXIgcmVmZXJlbmNlZC4gIFRoaXMga2VlcHMgdGhlIGdlbmVyaWMKLSAgICAgRUxGIEJGRCBsaW5rIGNvZGUgaGFwcHkgYW5kIGFwcGVhcnMgdG8gbm90IGNyZWF0ZSBhbnkgc2Vjb25kYXJ5Ci0gICAgIHByb2JsZW1zLiAgVWx0aW1hdGVseSB3ZSBuZWVkIGEgd2F5IHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZQotICAgICBnZW5lcmljIEVMRiBCRkQgbGluayBjb2RlIGJldHRlci4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2hwcGFfdW5tYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzLAotCQkJICBpbmZvKTsKLQotICAvKiBJbnZva2UgdGhlIHJlZ3VsYXIgRUxGIGJhY2tlbmQgbGlua2VyIHRvIGRvIGFsbCB0aGUgd29yay4gICovCi0gIHJldHZhbCA9IGJmZF9lbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pOwotCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzLAotCQkJICBpbmZvKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBIUFBBIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSBlbGZfaHBwYV9ob3d0b190YWJsZSArIEVMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLSAgICAgIGNoYXIgKmR5bl9uYW1lOwotICAgICAgY2hhciAqZHluaF9idWYgPSBOVUxMOwotICAgICAgc2l6ZV90IGR5bmhfYnVmbGVuID0gMDsKLSAgICAgIHN0cnVjdCBlbGY2NF9ocHBhX2R5bl9oYXNoX2VudHJ5ICpkeW5faCA9IE5VTEw7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzeW1fc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc3ltX3NlYy0+b3V0cHV0X29mZnNldDsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc3ltX3NlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OCi0JCQkgICA/IDAgOiBzeW0tPnN0X3ZhbHVlKQotCQkJICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAotCQkJICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUEE2NCBkeW5hbWljIGhhc2gKLQkgICAgIHRhYmxlLCB0aGVuIGdldCBpdC4gICovCi0JICBkeW5fbmFtZSA9IGdldF9keW5fbmFtZSAoaW5wdXRfYmZkLCBoLCByZWwsCi0JCQkJICAgJmR5bmhfYnVmLCAmZHluaF9idWZsZW4pOwotCSAgZHluX2ggPSBlbGY2NF9ocHBhX2R5bl9oYXNoX2xvb2t1cCAoJmhwcGFfaW5mby0+ZHluX2hhc2hfdGFibGUsCi0JCQkJCSAgICAgIGR5bl9uYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgbm90IGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIGxvbmcgaW5keDsKLQotCSAgaW5keCA9IHJfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc3ltX3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUEE2NCBkeW5hbWljIGhhc2gKLQkJIHRhYmxlLCB0aGVuIGdldCBpdC4gICovCi0JICAgICAgZHluX25hbWUgPSBnZXRfZHluX25hbWUgKGlucHV0X2JmZCwgaCwgcmVsLAotCQkJCSAgICAgICAmZHluaF9idWYsICZkeW5oX2J1Zmxlbik7Ci0JICAgICAgZHluX2ggPSBlbGY2NF9ocHBhX2R5bl9oYXNoX2xvb2t1cCAoJmhwcGFfaW5mby0+ZHluX2hhc2hfdGFibGUsCi0JCQkJCQkgIGR5bl9uYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JICAgICAgLyogSWYgd2UgaGF2ZSBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQkJIHNoYXJlZCBsaWJyYXJ5IGFuZCB3ZSBoYXZlIG5vdCBjcmVhdGVkIGFuIGVudHJ5IGluIHRoZQotCQkgUEE2NCBkeW5hbWljIHN5bWJvbCBoYXNoIHRhYmxlIGZvciBpdCwgdGhlbiB3ZSBsb3NlLiAgKi8KLQkgICAgICBpZiAoc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCAmJiBkeW5faCA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbikKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgLyogVmFsdWUgd2lsbCBiZSBwcm92aWRlZCB2aWEgb25lIG9mIHRoZSBvZmZzZXRzIGluIHRoZQotCQkgZHluX2ggaGFzaCB0YWJsZSBlbnRyeS4gICovCi0JICAgICAgZWxzZQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCSAgLyogQWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMgaW4gc2hhcmVkIGxpYnJhcmllcy4gICovCi0gICAgICAgICAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoaW5mby0+c3ltYm9saWMpCi0JCSgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsIGZhbHNlKTsKLQotCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUEE2NCBkeW5hbWljIGhhc2gKLQkJIHRhYmxlLCB0aGVuIGdldCBpdC4gICovCi0JICAgICAgZHluX25hbWUgPSBnZXRfZHluX25hbWUgKGlucHV0X2JmZCwgaCwgcmVsLAotCQkJCSAgICAgICAmZHluaF9idWYsICZkeW5oX2J1Zmxlbik7Ci0JICAgICAgZHluX2ggPSBlbGY2NF9ocHBhX2R5bl9oYXNoX2xvb2t1cCAoJmhwcGFfaW5mby0+ZHluX2hhc2hfdGFibGUsCi0JCQkJCQkgIGR5bl9uYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JICAgICAgaWYgKGR5bl9oID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCXN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCSAgaWYgKHN5bV9uYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICgqc3ltX25hbWUgPT0gJ1wwJykKLQkgICAgc3ltX25hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHN5bV9zZWMpOwotCX0KLQotICAgICAgciA9IGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKHJlbCwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJcmVsb2NhdGlvbiwgaW5mbywgc3ltX3NlYywKLQkJCQkJaCwgZHluX2gpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAoaW5mbywgc3ltX25hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDb21wdXRlIHRoZSB2YWx1ZSBmb3IgYSByZWxvY2F0aW9uIChSRUwpIGR1cmluZyBhIGZpbmFsIGxpbmsgc3RhZ2UsCi0gICB0aGVuIGluc2VydCB0aGUgdmFsdWUgaW50byB0aGUgcHJvcGVyIGxvY2F0aW9uIGluIENPTlRFTlRTLiAKLQotICAgVkFMVUUgaXMgYSB0ZW50YXRpdmUgdmFsdWUgZm9yIHRoZSByZWxvY2F0aW9uIGFuZCBtYXkgYmUgb3ZlcnJpZGRlbgotICAgYW5kIG1vZGlmaWVkIGhlcmUgYmFzZWQgb24gdGhlIHNwZWNpZmljIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotCi0gICBGb3IgZXhhbXBsZSB3ZSBkbyBjb252ZXJzaW9ucyBmb3IgUEMtcmVsYXRpdmUgYnJhbmNoZXMgaW4gdGhpcyByb3V0aW5lCi0gICBvciByZWRpcmVjdGlvbiBvZiBjYWxscyB0byBleHRlcm5hbCByb3V0aW5lcyB0byBzdHVicy4gCi0KLSAgIFRoZSB3b3JrIG9mIGFjdHVhbGx5IGFwcGx5aW5nIHRoZSByZWxvY2F0aW9uIGlzIGxlZnQgdG8gYSBoZWxwZXIKLSAgIHJvdXRpbmUgaW4gYW4gYXR0ZW1wdCB0byByZWR1Y2UgdGhlIGNvbXBsZXhpdHkgYW5kIHNpemUgb2YgdGhpcwotICAgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlIChyZWwsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCB2YWx1ZSwKLQkJCSAgICAgIGluZm8sIHN5bV9zZWMsIGgsIGR5bl9oKQotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBvZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICBiZmRfdm1hIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gZWxmX2hwcGFfaG93dG9fdGFibGUgKyBFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gIHVuc2lnbmVkIGxvbmcgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgcl9maWVsZCA9IGVfZnNlbDsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9QQVJJU0NfTk9ORToKLSAgICAgIGJyZWFrOwotCi0gICAgLyogUmFuZG9tIFBDIHJlbGF0aXZlIHJlbG9jcy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZERjoKLSAgICAgIHsKLQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMjFMKQotCSAgcl9maWVsZCA9IGVfbHNlbDsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE2RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTZXRgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTZERikKLQkgIHJfZmllbGQgPSBlX2ZzZWw7Ci0JZWxzZQotCSAgcl9maWVsZCA9IGVfcnNlbDsKLQotCS8qIElmIHRoaXMgaXMgYSBjYWxsIHRvIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhbm90aGVyIGR5bmFtaWMKLQkgICBsaWJyYXJ5LCB0aGVuIHJlZGlyZWN0IHRoZSBjYWxsIHRvIHRoZSBsb2NhbCBzdHViIGZvciB0aGlzCi0JICAgZnVuY3Rpb24uICAqLwotCWlmIChzeW1fc2VjID09IE5VTEwgfHwgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgIHZhbHVlID0gKGR5bl9oLT5zdHViX29mZnNldCArIGhwcGFfaW5mby0+c3R1Yl9zZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgCi0JLyogVHVybiBWQUxVRSBpbnRvIGEgcHJvcGVyIFBDIHJlbGF0aXZlIGFkZHJlc3MuICAqLwotCXZhbHVlIC09IChvZmZzZXQgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCS8qIEFkanVzdCBmb3IgYW55IGZpZWxkIHNlbGVjdG9ycy4gICovCi0JdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIC04ICsgYWRkZW5kLCByX2ZpZWxkKTsKLQotCS8qIEFwcGx5IHRoZSByZWxvY2F0aW9uIHRvIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgLyogQmFzaWMgZnVuY3Rpb24gY2FsbCBzdXBwb3J0LiAgSSdtIG5vdCBlbnRpcmVseSBzdXJlIGlmIFBDUkVMMTRGIGlzCi0gICAgICAgYWN0dWFsbHkgbmVlZGVkIG9yIGV2ZW4gaGFuZGxlZCBjb3JyZWN0bHkuCi0KLSAgICAgICBOb3RlIGZvciBhIGNhbGwgdG8gYSBmdW5jdGlvbiBkZWZpbmVkIGluIGFub3RoZXIgZHluYW1pYyBsaWJyYXJ5Ci0gICAgICAgd2Ugd2FudCB0byByZWRpcmVjdCB0aGUgY2FsbCB0byBhIHN0dWIuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwyMkY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjJDOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN0M6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3UjoKLSAgICAgIHsKLQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdSKQotCSAgcl9maWVsZCA9IGVfcnNlbDsKLQllbHNlCi0JICByX2ZpZWxkID0gZV9mc2VsOwotCi0JLyogSWYgdGhpcyBpcyBhIGNhbGwgdG8gYSBmdW5jdGlvbiBkZWZpbmVkIGluIGFub3RoZXIgZHluYW1pYwotCSAgIGxpYnJhcnksIHRoZW4gcmVkaXJlY3QgdGhlIGNhbGwgdG8gdGhlIGxvY2FsIHN0dWIgZm9yIHRoaXMKLQkgICBmdW5jdGlvbi4gICovCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCB8fCBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgdmFsdWUgPSAoZHluX2gtPnN0dWJfb2Zmc2V0ICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X29mZnNldAotCQkgICArIGhwcGFfaW5mby0+c3R1Yl9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAKLQkvKiBUdXJuIFZBTFVFIGludG8gYSBwcm9wZXIgUEMgcmVsYXRpdmUgYWRkcmVzcy4gICovCi0JdmFsdWUgLT0gKG9mZnNldCArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JLyogQWRqdXN0IGZvciBhbnkgZmllbGQgc2VsZWN0b3JzLiAgKi8KLQl2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgLTggKyBhZGRlbmQsIGVfZnNlbCk7Ci0KLQkvKiBBbGwgYnJhbmNoZXMgYXJlIGltcGxpY2l0bHkgc2hpZnRlZCBieSAyIHBsYWNlcy4gICovCi0JdmFsdWUgPj49IDI7Ci0KLQkvKiBBcHBseSB0aGUgcmVsb2NhdGlvbiB0byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICAqLwotCWluc24gPSBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuIChpbnNuLCB2YWx1ZSwgcl90eXBlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIC8qIEluZGlyZWN0IHJlZmVyZW5jZXMgdG8gZGF0YSB0aHJvdWdoIHRoZSBETFQuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTRGOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVElORDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNkRGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkYxNkY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2V0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogSWYgdGhpcyByZWxvY2F0aW9uIHdhcyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCB0aGVuIHdlIHN0aWxsCi0JICAgaGF2ZSBub3Qgc2V0IHVwIHRoZSBETFQgZW50cnkgKGl0J3Mgbm90IGNvbnZpZW5lbnQgdG8gZG8gc28KLQkgICBpbiB0aGUgImZpbmFsaXplX2RsdCIgcm91dGluZSBiZWNhdXNlIGl0IGlzIGRpZmZpY3VsdCB0byBnZXQKLQkgICB0byB0aGUgbG9jYWwgc3ltYm9sJ3MgdmFsdWUpLgotCi0JICAgU28sIGlmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wgKGggPT0gTlVMTCksIHRoZW4gd2UgbmVlZCB0bwotCSAgIGZpbGwgaW4gaXRzIERMVCBlbnRyeS4gCi0KLQkgICBTaW1pbGFybHkgd2UgbWF5IHN0aWxsIG5lZWQgdG8gc2V0IHVwIGFuIGVudHJ5IGluIC5vcGQgZm9yCi0JICAgYSBsb2NhbCBmdW5jdGlvbiB3aGljaCBoYWQgaXRzIGFkZHJlc3MgdGFrZW4uICAqLwotCWlmIChkeW5faC0+aCA9PSBOVUxMKQotCSAgewotCSAgICBiZmRfcHV0XzY0IChocHBhX2luZm8tPmRsdF9zZWMtPm93bmVyLAotCQkJdmFsdWUsCi0JCQlocHBhX2luZm8tPmRsdF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPmRsdF9vZmZzZXQpOwotCi0JICAgIC8qIE5vdyBoYW5kbGUgLm9wZCBjcmVhdGlvbiBpZiBuZWVkZWQuICAqLwotCSAgICBpZiAocl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIKLQkJfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSCi0JCXx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUgotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjIxTAotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2RgotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YKLQkJfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkRGKQotCSAgICAgIHsKLQkJLyogVGhlIGZpcnN0IHR3byB3b3JkcyBvZiBhbiAub3BkIGVudHJ5IGFyZSB6ZXJvLiAgKi8KLQkJbWVtc2V0IChocHBhX2luZm8tPm9wZF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPm9wZF9vZmZzZXQsCi0JCQkwLCAxNik7Ci0KLQkJLyogVGhlIG5leHQgd29yZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24uICAqLwotCQliZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCSAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICAgICArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMTYpKTsKLQotCQkvKiBUaGUgbGFzdCB3b3JkIGlzIG91ciBsb2NhbCBfX2dwIHZhbHVlLiAgKi8KLQkJdmFsdWUgPSBfYmZkX2dldF9ncF92YWx1ZQotCQkJICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpOwotCQliZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCSAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICAgICArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpKTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBXZSB3YW50IHRoZSB2YWx1ZSBvZiB0aGUgRExUIG9mZnNldCBmb3IgdGhpcyBzeW1ib2wsIG5vdAotCSAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gIE5vdGUgdGhhdCBfX2dwIG1heSBub3QgcG9pbnQKLQkgICB0byB0aGUgc3RhcnQgb2YgdGhlIERMVCwgc28gd2UgaGF2ZSB0byBjb21wdXRlIHRoZSBhYnNvbHV0ZQotCSAgIGFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLQl2YWx1ZSA9IChkeW5faC0+ZGx0X29mZnNldAotCQkgKyBocHBhX2luZm8tPmRsdF9zZWMtPm91dHB1dF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQl2YWx1ZSAtPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0KLQotCS8qIEFsbCBETFRJTkQgcmVsb2NhdGlvbnMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhdCB0aGlzIHBvaW50LAotCSAgIGV4Y2VwdCB0aGF0IHdlIG5lZWQgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9ycyBmb3IgdGhlIDIxYml0Ci0JICAgdmVyc2lvbiB2cyB0aGUgMTRiaXQgdmVyc2lvbnMuICAqLwotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRExUSU5EMjFMCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMjFMCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9UUDIxTCkKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfbHJzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19ETFRJTkQxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkYxNkRGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkYxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfVFAxNkYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9UUDE2V0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9UUDE2REYpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2ZzZWwpOwotCWVsc2UKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfcnJzZWwpOwotCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfRExUUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFdSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUwxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUwxNkRGOgotICAgICAgewotCS8qIFN1YnRyYWN0IG91dCB0aGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWUgdG8gbWFrZSB2YWx1ZSBhIERMVAotCSAgIHJlbGF0aXZlIGFkZHJlc3MuICAqLwotCXZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotCS8qIEFsbCBETFRSRUwgcmVsb2NhdGlvbnMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhdCB0aGlzIHBvaW50LAotCSAgIGV4Y2VwdCB0aGF0IHdlIG5lZWQgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9ycyBmb3IgdGhlIDIxYml0Ci0JICAgdmVyc2lvbiB2cyB0aGUgMTRiaXQgdmVyc2lvbnMuICAqLwotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRExUUkVMMjFMCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19EUFJFTDIxTCkKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfbHJzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19ETFRSRUwxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19EUFJFTDE0RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0dQUkVMMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfR1BSRUwxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfR1BSRUwxNkRGKQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9mc2VsKTsKLQllbHNlCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX3Jyc2VsKTsKLQotCWluc24gPSBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuIChpbnNuLCB2YWx1ZSwgcl90eXBlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9QQVJJU0NfRElSMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxNkY6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZERjoKLSAgICAgIHsKLQkvKiBBbGwgRElSIHJlbG9jYXRpb25zIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgYXQgdGhpcyBwb2ludCwKLQkgICBleGNlcHQgdGhhdCB3ZSBuZWVkIGRpZmZlcmVudCBmaWVsZCBzZWxlY3RvcnMgZm9yIHRoZSAyMWJpdAotCSAgIHZlcnNpb24gdnMgdGhlIDE0Yml0IHZlcnNpb25zLiAgKi8KLQlpZiAocl90eXBlID09IFJfUEFSSVNDX0RJUjIxTCkKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfbHJzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxN0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxNkYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfRElSMTZERikKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfZnNlbCk7Ci0JZWxzZQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9ycnNlbCk7Ci0KLQlpbnNuID0gZWxmX2hwcGFfcmVsb2NhdGVfaW5zbiAoaW5zbiwgdmFsdWUsIHJfdHlwZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIFBMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPnBsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5wbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+cGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCi0JLyogQWxsIFBMVE9GRiByZWxvY2F0aW9ucyBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGF0IHRoaXMgcG9pbnQsCi0JICAgZXhjZXB0IHRoYXQgd2UgbmVlZCBkaWZmZXJlbnQgZmllbGQgc2VsZWN0b3JzIGZvciB0aGUgMjFiaXQKLQkgICB2ZXJzaW9uIHZzIHRoZSAxNGJpdCB2ZXJzaW9ucy4gICovCi0JaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTFRPRkYyMUwpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2xyc2VsKTsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTRGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTZXRgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BMVE9GRjE2REYpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2ZzZWwpOwotCWVsc2UKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfcnJzZWwpOwotCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMzI6Ci0gICAgICB7Ci0JLyogV2UgbWF5IHN0aWxsIG5lZWQgdG8gY3JlYXRlIHRoZSBGUFRSIGl0c2VsZiBpZiBpdCB3YXMgZm9yCi0JICAgYSBsb2NhbCBzeW1ib2wuICAqLwotCWlmIChkeW5faC0+aCA9PSBOVUxMKQotCSAgewotCSAgICAvKiBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGFuIC5vcGQgZW50cnkgYXJlIHplcm8uICAqLwotCSAgICBtZW1zZXQgKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCwgMCwgMTYpOwotCi0JICAgIC8qIFRoZSBuZXh0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgYmZkX3B1dF82NCAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vd25lciwgdmFsdWUsCi0JCQkoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICsgZHluX2gtPm9wZF9vZmZzZXQgKyAxNikpOwotCi0JICAgIC8qIFRoZSBsYXN0IHdvcmQgaXMgb3VyIGxvY2FsIF9fZ3AgdmFsdWUuICAqLwotCSAgICB2YWx1ZSA9IF9iZmRfZ2V0X2dwX3ZhbHVlCi0JCSAgICAgIChocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lcik7Ci0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cyArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpOwotCSAgfQotCi0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIERMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPmRsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+ZGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSNjQ6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDY0OgotICAgICAgewotCS8qIFdlIG1heSBzdGlsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgRlBUUiBpdHNlbGYgaWYgaXQgd2FzIGZvcgotCSAgIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQlpZiAoZHluX2gtPmggPT0gTlVMTCAmJiByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjY0KQotCSAgewotCSAgICAvKiBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGFuIC5vcGQgZW50cnkgYXJlIHplcm8uICAqLwotCSAgICBtZW1zZXQgKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCwgMCwgMTYpOwotCi0JICAgIC8qIFRoZSBuZXh0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgYmZkX3B1dF82NCAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vd25lciwgdmFsdWUsCi0JCQkoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICsgZHluX2gtPm9wZF9vZmZzZXQgKyAxNikpOwotCi0JICAgIC8qIFRoZSBsYXN0IHdvcmQgaXMgb3VyIGxvY2FsIF9fZ3AgdmFsdWUuICAqLwotCSAgICB2YWx1ZSA9IF9iZmRfZ2V0X2dwX3ZhbHVlCi0JCSAgICAgIChocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lcik7Ci0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cyArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpOwotCSAgfQotCi0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIERMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPmRsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+ZGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCWJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19ESVIzMjoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUgKyBhZGRlbmQsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfUEFSSVNDX0RJUjY0OgotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUw2NDoKLSAgICAgIC8qIFN1YnRyYWN0IG91dCB0aGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWUgdG8gbWFrZSB2YWx1ZSBhIERMVAotCSByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLSAgICAgIHZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkY2NDoKLQkvKiBXZSB3YW50IHRoZSB2YWx1ZSBvZiB0aGUgRExUIG9mZnNldCBmb3IgdGhpcyBzeW1ib2wsIG5vdAotCSAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gIE5vdGUgdGhhdCBfX2dwIG1heSBub3QgcG9pbnQKLQkgICB0byB0aGUgc3RhcnQgb2YgdGhlIERMVCwgc28gd2UgaGF2ZSB0byBjb21wdXRlIHRoZSBhYnNvbHV0ZQotCSAgIGFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLSAgICAgIHZhbHVlID0gKGR5bl9oLT5kbHRfb2Zmc2V0Ci0JICAgICAgICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIHZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwzMjoKLSAgICAgIHsKLQkvKiBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYW5vdGhlciBkeW5hbWljCi0JICAgbGlicmFyeSwgdGhlbiByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgbG9jYWwgc3R1YiBmb3IgdGhpcwotCSAgIGZ1bmN0aW9uLiAgKi8KLQlpZiAoc3ltX3NlYyA9PSBOVUxMIHx8IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICB2YWx1ZSA9IChkeW5faC0+c3R1Yl9vZmZzZXQgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gIAotCS8qIFR1cm4gVkFMVUUgaW50byBhIHByb3BlciBQQyByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLQl2YWx1ZSAtPSAob2Zmc2V0ICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQl2YWx1ZSArPSBhZGRlbmQ7Ci0JdmFsdWUgLT0gODsKLQliZmRfcHV0XzY0IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0JcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9QQVJJU0NfUENSRUw2NDoKLSAgICAgIHsKLQkvKiBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYW5vdGhlciBkeW5hbWljCi0JICAgbGlicmFyeSwgdGhlbiByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgbG9jYWwgc3R1YiBmb3IgdGhpcwotCSAgIGZ1bmN0aW9uLiAgKi8KLQlpZiAoc3ltX3NlYyA9PSBOVUxMIHx8IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICB2YWx1ZSA9IChkeW5faC0+c3R1Yl9vZmZzZXQgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gIAotICAKLQkvKiBUdXJuIFZBTFVFIGludG8gYSBwcm9wZXIgUEMgcmVsYXRpdmUgYWRkcmVzcy4gICovCi0JdmFsdWUgLT0gKG9mZnNldCArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JdmFsdWUgKz0gYWRkZW5kOwotCXZhbHVlIC09IDg7Ci0JYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotCXJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICB9Ci0KLQotICAgIGNhc2UgUl9QQVJJU0NfRlBUUjY0OgotICAgICAgewotCS8qIFdlIG1heSBzdGlsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgRlBUUiBpdHNlbGYgaWYgaXQgd2FzIGZvcgotCSAgIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQlpZiAoZHluX2gtPmggPT0gTlVMTCkKLQkgIHsKLQkgICAgLyogVGhlIGZpcnN0IHR3byB3b3JkcyBvZiBhbiAub3BkIGVudHJ5IGFyZSB6ZXJvLiAgKi8KLQkgICAgbWVtc2V0IChocHBhX2luZm8tPm9wZF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPm9wZF9vZmZzZXQsIDAsIDE2KTsKLQotCSAgICAvKiBUaGUgbmV4dCB3b3JkIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gICovCi0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMKLQkJCSArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMTYpKTsKLQotCSAgICAvKiBUaGUgbGFzdCB3b3JkIGlzIG91ciBsb2NhbCBfX2dwIHZhbHVlLiAgKi8KLQkgICAgdmFsdWUgPSBfYmZkX2dldF9ncF92YWx1ZQotCQkgICAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpOwotCSAgICBiZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCWhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCArIDI0KTsKLQkgIH0KLQotCS8qIFdlIHdhbnQgdGhlIHZhbHVlIG9mIHRoZSBPUEQgb2Zmc2V0IGZvciB0aGlzIHN5bWJvbCwgbm90Ci0gICAgICAgICAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gICovCi0JdmFsdWUgPSAoZHluX2gtPm9wZF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+b3BkX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgIAotCWJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsdWUgKyBhZGRlbmQsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19TRUNSRUwzMjoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkJICAodmFsdWUgKyBhZGRlbmQKLQkJICAgLSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSwKLQkJICBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX1BBUklTQ19TRUdSRUwzMjoKLSAgICBjYXNlIFJfUEFSSVNDX1NFR1JFTDY0OgotICAgICAgewotCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IFNFR1JFTCByZWxvY2F0aW9uLCB0aGVuIGluaXRpYWxpemUKLQkgICB0aGUgc2VnbWVudCBiYXNlIHZhbHVlcy4gICovCi0JaWYgKGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2UgPT0gKGJmZF92bWEpIC0xKQotCSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBlbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycywKLQkJCQkgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKSk7Ci0KLQkvKiBWQUxVRSBob2xkcyB0aGUgYWJzb2x1dGUgYWRkcmVzcy4gIFdlIHdhbnQgdG8gaW5jbHVkZSB0aGUKLQkgICBhZGRlbmQsIHRoZW4gdHVybiBpdCBpbnRvIGEgc2VnbWVudCByZWxhdGl2ZSBhZGRyZXNzLgotCi0JICAgVGhlIHNlZ21lbnQgaXMgZGVyaXZlZCBmcm9tIFNZTV9TRUMuICBXZSBhc3N1bWUgdGhhdCB0aGVyZSBhcmUKLQkgICBvbmx5IHR3byBzZWdtZW50cyBvZiBub3RlIGluIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZS9zaGxpYi4KLQkgICBBIHJlYWRvbmx5IHNlZ21lbnQgKC50ZXh0KSBhbmQgYSByZWFkd3JpdGUgc2VnbWVudCAoLmRhdGEpLiAgKi8KLQl2YWx1ZSArPSBhZGRlbmQ7Ci0KLQlpZiAoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgIHZhbHVlIC09IGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2U7Ci0JZWxzZQotCSAgdmFsdWUgLT0gaHBwYV9pbmZvLT5kYXRhX3NlZ21lbnRfYmFzZTsKLQotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfU0VHUkVMMzIpCi0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0JZWxzZQotCSAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotICAgICAgCi0KLSAgICAvKiBTb21ldGhpbmcgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEpOwotICByZXR1cm4gKGJmZF9yZWxvY19vayk7Ci19Ci0KLS8qIFJlbG9jYXRlIHRoZSBnaXZlbiBJTlNOLiAgVkFMVUUgc2hvdWxkIGJlIHRoZSBhY3R1YWwgdmFsdWUgd2Ugd2FudAotICAgdG8gaW5zZXJ0IGludG8gdGhlIGluc3RydWN0aW9uLCBpZSBieSB0aGlzIHBvaW50IHdlIHNob3VsZCBub3QgYmUKLSAgIGNvbmNlcm5lZCB3aXRoIGNvbXB1dGluZyBhbiBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIERMVCwgUEMsIGV0Yy4KLSAgIEluc3RlYWQgdGhpcyByb3V0aW5lIGlzIG1lYW50IHRvIGhhbmRsZSB0aGUgYml0IG1hbmlwdWxhdGlvbnMgbmVlZGVkCi0gICB0byBpbnNlcnQgdGhlIHJlbG9jYXRpb24gaW50byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWxmX2hwcGFfcmVsb2NhdGVfaW5zbiAoaW5zbiwgc3ltX3ZhbHVlLCByX3R5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyBzeW1fdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl90eXBlOwotewotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgLyogVGhpcyBpcyBhbnkgMjJiaXQgYnJhbmNoLiAgSW4gUEEyLjAgc3ludGF4IGl0IGNvcnJlc3BvbmRzIHRvCi0gICAgICAgdGhlICJCIiBpbnN0cnVjdGlvbi4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIyRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjJDOgotICAgICAgewotCXVuc2lnbmVkIGludCB3MywgdzIsIHcxLCB3OwotCi0JLyogVGhlc2UgYXJlIDIyIGJpdCBicmFuY2hlcy4gIE1hc2sgb2ZmIGJpdHMgd2UgZG8gbm90IGNhcmUKLQkgICBhYm91dC4gICovCi0Jc3ltX3ZhbHVlICY9IDB4M2ZmZmZmOwotCi0JLyogTm93IGV4dHJhY3QgdGhlIFcxLCBXMiwgVzMgYW5kIFcgZmllbGRzIGZyb20gdGhlIHZhbHVlLiAgKi8KLQlkaXNfYXNzZW1ibGVfMjIgKHN5bV92YWx1ZSwgJnczLCAmdzEsICZ3MiwgJncpOwotCi0JLyogTWFzayBvdXQgYml0cyBmb3IgdGhlIHZhbHVlIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiAmPSAweGZjMDBlMDAyOwotCi0JLyogSW5zZXJ0IHRoZSBiaXRzIGZvciB0aGUgVzEsIFcyIGFuZCBXIGZpZWxkcyBpbnRvIHRoZQotCSAgIGluc3RydWN0aW9uLiAgKi8KLQlpbnNuIHw9ICh3MyA8PCAyMSkgfCAodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdzsKLQlyZXR1cm4gaW5zbjsKLSAgICAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIGFueSAxN2JpdCBicmFuY2guICBJbiBQQTIuMCBzeW50YXggaXQgYWxzbyBjb3JyZXNwb25kcyB0bwotICAgICAgIHRoZSAiQiIgaW5zdHJ1Y3Rpb24gYXMgd2VsbCBhcyBCRS4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdDOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN1I6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHcyLCB3MSwgdzsKLQotCS8qIFRoZXNlIGFyZSAxNyBiaXQgYnJhbmNoZXMuICBNYXNrIG9mZiBiaXRzIHdlIGRvIG5vdCBjYXJlCi0JICAgYWJvdXQuICAqLwotCXN5bV92YWx1ZSAmPSAweDFmZmZmOwotCi0JLyogTm93IGV4dHJhY3QgdGhlIFcxLCBXMiBhbmQgVyBmaWVsZHMgZnJvbSB0aGUgdmFsdWUuICAqLwotCWRpc19hc3NlbWJsZV8xNyAoc3ltX3ZhbHVlLCAmdzEsICZ3MiwgJncpOwotCi0JLyogTWFzayBvdXQgYml0cyBmb3IgdGhlIHZhbHVlIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiAmPSAweGZmZTBlMDAyOwotCi0JLyogSW5zZXJ0IHRoZSBiaXRzIGZvciB0aGUgVzEsIFcyIGFuZCBXIGZpZWxkcyBpbnRvIHRoZQotCSAgIGluc3RydWN0aW9uLiAgKi8KLQlpbnNuIHw9ICh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3OwotCXJldHVybiBpbnNuOwotICAgICAgfQotCi0gICAgLyogQURESUwgb3IgTERJTCBpbnN0cnVjdGlvbnMuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRExUUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjIxTDoKLSAgICAgIHsKLSAgICAgICAgaW50IHc7Ci0KLQkvKiBNYXNrIG9mZiBiaXRzIGluIElOU04gd2UgZG8gbm90IHdhbnQuICAqLwotCWluc24gJj0gMHhmZmUwMDAwMDsKLQotCS8qIFR1cm4gdGhlIDIxYml0IHZhbHVlIGludG8gdGhlIHByb3BlciBmb3JtYXQuICAqLwotCWRpc19hc3NlbWJsZV8yMSAoc3ltX3ZhbHVlLCAmdyk7Ci0KLQkvKiBBbmQgaW5zZXJ0IHRoZSBwcm9wZXIgYml0cyBpbnRvIElOU04uICAqLwotICAgICAgICByZXR1cm4gaW5zbiB8IHc7Ci0gICAgICB9Ci0KLSAgICAvKiBMRE8gYW5kIGludGVnZXIgbG9hZHMvc3RvcmVzIHdpdGggMTRiaXQgZGlzcGxhY2VtZW50cy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19HUFJFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGMTZGOgotICAgICAgewotICAgICAgICBpbnQgdzsKLQotCS8qIE1hc2sgb2ZmIGJpdHMgaW4gSU5TTiB3ZSBkbyBub3Qgd2FudC4gICovCi0JaW5zbiAmPSAweGZmZmZjMDAwOwotCi0JLyogVHVybiB0aGUgMTRiaXQgdmFsdWUgaW50byB0aGUgcHJvcGVyIGZvcm1hdC4gICovCi0JbG93X3NpZ25fdW5leHQgKHN5bV92YWx1ZSwgMTQsICZ3KTsKLQotCS8qIEFuZCBpbnNlcnQgdGhlIHByb3BlciBiaXRzIGludG8gSU5TTi4gICovCi0gICAgICAgIHJldHVybiBpbnNuIHwgdzsKLSAgICAgIH0KLQotICAgIC8qIERvdWJsZXdvcmQgbG9hZHMgYW5kIHN0b3JlcyB3aXRoIGEgMTRiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNkRGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE2REY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogTWFzayBvZmYgYml0cyBpbiBJTlNOIHdlIGRvIG5vdCB3YW50LiAgKi8KLQlpbnNuICY9IDB4ZmZmZmMwMGU7Ci0KLQkvKiBUaGUgc2lnbiBiaXQgYXQgMTQgbW92ZXMgaW50byBiaXQgemVybyBpbiB0aGUgZGVzdGluYXRpb24uICAqLwotICAgICAgICBpbnNuIHw9ICgoc3ltX3ZhbHVlICYgMHgyMDAwKSA+PiAxMyk7Ci0KLQkvKiBUdXJuIG9mZiB0aGUgYml0cyBpbiBzeW1fdmFsdWUgd2UgZG8gbm90IGNhcmUgYWJvdXQuICAqLwotCXN5bV92YWx1ZSAmPSAweDFmZjg7Ci0KLQkvKiBOb3cgc2hpZnQgaXQgb25lIGJpdCBwb3NpdGlvbiBsZWZ0IHNvIHRoYXQgaXQgbGluZXMgdXAgd2l0aCB0aGUKLQkgICBkZXN0aW5hdGlvbiBmaWVsZCBpbiBJTlNOLiAgKi8KLQlzeW1fdmFsdWUgPDw9IDE7Ci0KLQlyZXR1cm4gaW5zbiB8IHN5bV92YWx1ZTsKLSAgICAgIH0KLQotICAgIC8qIEZsb2F0aW5nIHBvaW50IHNpbmdsZSB3b3JkIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNFdSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2V0Y6Ci0gICAgICB7Ci0JLyogTWFzayBvZmYgYml0cyBpbiBJTlNOIHdlIGRvIG5vdCB3YW50LiAgKi8KLQlpbnNuICY9IDB4ZmZmZmMwMDY7Ci0KLQkvKiBUaGUgc2lnbiBiaXQgYXQgMTQgbW92ZXMgaW50byBiaXQgemVybyBpbiB0aGUgZGVzdGluYXRpb24uICAqLwotICAgICAgICBpbnNuIHw9ICgoc3ltX3ZhbHVlICYgMHgyMDAwKSA+PiAxMyk7Ci0KLQkvKiBUdXJuIG9mZiB0aGUgYml0cyBpbiBzeW1fdmFsdWUgd2UgZG8gbm90IGNhcmUgYWJvdXQuICAqLwotCXN5bV92YWx1ZSAmPSAweDFmZmM7Ci0KLQkvKiBOb3cgc2hpZnQgaXQgb25lIGJpdCBwb3NpdGlvbiBsZWZ0IHNvIHRoYXQgaXQgbGluZXMgdXAgd2l0aCB0aGUKLQkgICBkZXN0aW5hdGlvbiBmaWVsZCBpbiBJTlNOLiAgKi8KLQlzeW1fdmFsdWUgPDw9IDE7Ci0KLQlyZXR1cm4gaW5zbiB8IHN5bV92YWx1ZTsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gaW5zbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDIwMC5jIGIvYmZkL2VsZi1tMTAyMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzOTYzNS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyNSArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMjAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBtbjEwMjAwX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX01OMTAyMDBfTk9ORSA9IDAsCi0gIFJfTU4xMDIwMF8zMiwKLSAgUl9NTjEwMjAwXzE2LAotICBSX01OMTAyMDBfOCwKLSAgUl9NTjEwMjAwXzI0LAotICBSX01OMTAyMDBfUENSRUw4LAotICBSX01OMTAyMDBfUENSRUwxNiwKLSAgUl9NTjEwMjAwX1BDUkVMMjQsCi0gIFJfTU4xMDIwMF9NQVgKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBEdW1teSByZWxvY2F0aW9uLiAgRG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDIwMF9OT05FLAotCSAwLAotCSAyLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfTk9ORSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8zMiIsCi0JIGZhbHNlLAotCSAweGZmZmZmZmZmLAotCSAweGZmZmZmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDE2IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMTYsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8xNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCA4IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDI0IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMjQsCi0JIDAsCi0JIDIsCi0JIDI0LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8yNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU2ltcGxlIDggcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF9QQ1JFTDgiLAotCSBmYWxzZSwKLQkgMHhmZiwKLQkgMHhmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAxNiBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwxNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwxNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIGEgMSBieXRlIGFkanVzdG1lbnQKLSAgICAgdG8gZ2V0IHRoZSBwYy1yZWxhdGl2ZSBvZmZzZXQgY29ycmVjdC4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwyNCwKLQkgMCwKLQkgMiwKLQkgMjQsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwyNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIHRydWUpLAotfTsKLQotc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwIG1uMTAyMDBfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX01OMTAyMDBfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTU4xMDIwMF8zMiwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTU4xMDIwMF8xNiwgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl9NTjEwMjAwXzgsIH0sCi0gIHsgQkZEX1JFTE9DXzI0LCBSX01OMTAyMDBfMjQsIH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDgsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAyMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfMjRfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDI0LCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKG1uMTAyMDBfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKG1uMTAyMDBfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW21uMTAyMDBfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBNTjEwMjAwIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMjAwX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTU4xMDIwMF9NQVgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBpc19sb2NhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF9OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzMyOgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzE2OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF84OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmIHx8IChsb25nKXZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfMjQ6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2ZmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIHZhbHVlICY9IDB4ZmZmZmZmOwotICAgICAgdmFsdWUgfD0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmZjAwMDAwMCk7Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUw4OgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IChvZmZzZXQgKyAxKTsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHhmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUwxNjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMik7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUwyNDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMyk7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4MTAwMDAwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgdmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGZmMDAwMDAwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotfQotCi0MCi0vKiBSZWxvY2F0ZSBhbiBNTjEwMjAwIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaG93dG8gPSBlbGZfbW4xMDIwMF9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgciA9IG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kLAotCQkJCQkgICBpbmZvLCBzZWMsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY29uc3QgY2hhciAqbXNnID0gKGNvbnN0IGNoYXIgKikwOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIG1uMTAyMDAuCi0KLSAgIFRoZXJlJ3MgcXVpdGUgYSBmZXcgcmVsYXhpbmcgb3Bwb3J0dW5pdGVzIGF2YWlsYWJsZSBvbiB0aGUgbW4xMDIwMDoKLQotCSoganNyOjI0IC0+IGpzcjoxNiAJCQkJCSAgIDIgYnl0ZXMKLQotCSogam1wOjI0IC0+IGptcDoxNgkJCQkJICAgMiBieXRlcwotCSogam1wOjE2IC0+IGJyYTo4CQkJCQkgICAxIGJ5dGUKLQotCQkqIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaAotCQlhcm91bmQgdGhlIGp1bXAvYnJhLCB3ZSBtYXkgYmUgYWJsZSB0byByZXZlcnNlIGl0cyBjb25kaXRpb24KLQkJYW5kIGNoYW5nZSBpdHMgdGFyZ2V0IHRvIHRoZSBqdW1wJ3MgdGFyZ2V0LiAgVGhlIGp1bXAvYnJhCi0JCWNhbiB0aGVuIGJlIGRlbGV0ZWQuCQkJCSAgIDIgYnl0ZXMKLQotCSogbW92IGFiczI0IC0+IG1vdiBhYnMxNgkyIGJ5dGUgc2F2aW5ncwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMjQgY2FuIHJlbGF4IHRvIGltbTE2ICAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMTYgY2FuIHJlbGF4IHRvIGltbTggICAxIGJ5dGUKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGQyNCBjYW4gcmVsYXggdG8gZDE2CSAgIDIgYnl0ZXMKLQktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBkMTYgY2FuIHJlbGF4IHRvIGQ4CSAgIDEgYnl0ZQotCi0JYWJzMjQsIGltbTI0LCBkMjQgYWxsIGxvb2sgdGhlIHNhbWUgYXQgdGhlIHJlbG9jIGxldmVsLiAgSXQKLQltaWdodCBtYWtlIHRoZSBjb2RlIHNpbXBsZXIgaWYgd2UgaGFkIGRpZmZlcmVudCByZWxvY3MgZm9yCi0JdGhlIHZhcmlvdXMgcmVsYXhhYmxlIG9wZXJhbmQgdHlwZXMuCi0gICAKLQlXZSBkb24ndCBoYW5kbGUgaW1tMTYtPmltbTggb3IgZDE2LT5kOCBhcyB0aGV5J3JlIHZlcnkgcmFyZQotCWFuZCBzb21ld2hhdCBtb3JlIGRpZmZpY3VsdCB0byBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1tbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIC8qIEFzc3VtZSBub3RoaW5nIGNoYW5nZXMuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgotICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKLSAgICAgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogV2FsayB0aHJvdWdoIHRoZW0gbG9va2luZyBmb3IgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzeW12YWw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlbGF4ZWQsIHRoZW4gaWdub3JlCi0JIHRoaXMgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfTk9ORQotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF84Ci0JICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX01BWCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBzeW1fc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOwotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDI0Yml0IHBjLXJlbGF0aXZlIGJyYW5jaC9jYWxsIGludG8gYSAxNmJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2gvY2FsbC4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDI0KQotCXsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gKGlyZWwtPnJfb2Zmc2V0ICsgMyk7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmZmYgKyAyIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSB0d28gYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQotCSAgICAgYWJsZSB0byByZWxheC4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwMDEgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZTAgJiYgY29kZSAhPSAweGUxKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhlMCkKLQkJYmZkX3B1dF84IChhYmZkLCAweGZjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGUxKQotCQliZmRfcHV0XzggKGFiZmQsIDB4ZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDIwMF9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUgb2Zmc2V0LiAgKi8KLQkgICAgICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JICAgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgOGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2guICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfUENSRUwxNikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDIpOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gOCBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmICsgMSBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgb25lIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKLQkgICAgIGFibGUgdG8gcmVsYXguICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MCAmJiAobG9uZyl2YWx1ZSA+IC0weDgwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZmMpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZWEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDIwMF9QQ1JFTDgpOwotCi0JICAgICAgLyogRGVsZXRlIG9uZSBieXRlIG9mIGRhdGEuICAqLwotCSAgICAgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICBpcmVsLT5yX29mZnNldCArIDEsIDEpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRyeSB0byBlbGltaW5hdGUgYW4gdW5jb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2gKLQkgd2hpY2ggaW1tZWRpYXRlbHkgZm9sbG93cyBhIGNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlCi0JIGJyYW5jaCBhcm91bmQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLgotCi0JICAgIG9yaWdpbmFsOgkJbmV3OgotCSAgICBiQ0MgbGFiMQkJYkNDJyBsYWIyCi0JICAgIGJyYSBsYWIyCi0JICAgbGFiMToJICAgICAgIGxhYjE6Ci0KLQotCSBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgYkNDIGNhbid0IHJlYWNoIGxhYjIgYXQgYXNzZW1ibHkgdGltZSwKLQkgYnV0IGR1ZSB0byBvdGhlciByZWxheGF0aW9ucyBpdCBjYW4gcmVhY2ggYXQgbGluayB0aW1lLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX1BDUkVMOCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0JICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gKGlyZWwtPnJfb2Zmc2V0ICsgMSk7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogRG8gbm90aGluZyBpZiB0aGlzIHJlbG9jIGlzIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IHNlYy0+X2Nvb2tlZF9zaXplKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2VlIGlmIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGFuIHVuY29uZGl0aW9uYWwgcGMtcmVsYXRpdmUKLQkgICAgIGJyYW5jaCwgbW9yZSBvZnRlbiB0aGFuIG5vdCB0aGlzIHRlc3Qgd2lsbCBmYWlsLCBzbyB3ZQotCSAgICAgdGVzdCBpdCBmaXJzdCB0byBzcGVlZCB0aGluZ3MgdXAuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhlYSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEFsc28gbWFrZSBzdXJlIHRoZSBuZXh0IHJlbG9jYXRpb24gYXBwbGllcyB0byB0aGUgbmV4dAotCSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoYXQgaXQncyBhIHBjLXJlbGF0aXZlIDggYml0IGJyYW5jaC4gICovCi0JICBucmVsID0gaXJlbCArIDE7Ci0JICBpZiAobnJlbCA9PSBpcmVsZW5kCi0JICAgICAgfHwgaXJlbC0+cl9vZmZzZXQgKyAyICE9IG5yZWwtPnJfb2Zmc2V0Ci0JICAgICAgfHwgRUxGMzJfUl9UWVBFIChucmVsLT5yX2luZm8pICE9IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDgpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBNYWtlIHN1cmUgb3VyIGRlc3RpbmF0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlCi0JICAgICB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0JICBpZiAoc3ltdmFsICE9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIGlyZWwtPnJfb2Zmc2V0ICsgMykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3cgbWFrZSBzdXJlIHdlIGFyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaC4gIFRoaXMgbWF5IG5vdAotCSAgICAgYmUgbmVjZXNzYXJ5LCBidXQgd2h5IHRha2UgdGhlIGNoYW5jZS4gCi0KLQkgICAgIE5vdGUgdGhlc2UgY2hlY2tzIGFzc3VtZSB0aGF0IFJfTU4xMDIwMF9QQ1JFTDggcmVsb2NzCi0JICAgICBvbmx5IG9jY3VyIG9uIGJDQyBhbmQgYkNDeCBpbnNucy4gIElmIHRoZXkgb2NjdXJlZAotCSAgICAgZWxzZXdoZXJlLCB3ZSdkIG5lZWQgdG8ga25vdyB0aGUgc3RhcnQgb2YgdGhpcyBpbnNuCi0JICAgICBmb3IgdGhpcyBjaGVjayB0byBiZSBhY2N1cmF0ZS4gICovCi0JICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICBpZiAoY29kZSAhPSAweGUwICYmIGNvZGUgIT0gMHhlMSAmJiBjb2RlICE9IDB4ZTIKLQkgICAgICAmJiBjb2RlICE9IDB4ZTMgJiYgY29kZSAhPSAweGU0ICYmIGNvZGUgIT0gMHhlNQotCSAgICAgICYmIGNvZGUgIT0gMHhlNiAmJiBjb2RlICE9IDB4ZTcgJiYgY29kZSAhPSAweGU4Ci0JICAgICAgJiYgY29kZSAhPSAweGU5ICYmIGNvZGUgIT0gMHhlYyAmJiBjb2RlICE9IDB4ZWQKLQkgICAgICAmJiBjb2RlICE9IDB4ZWUgJiYgY29kZSAhPSAweGVmICYmIGNvZGUgIT0gMHhmYwotCSAgICAgICYmIGNvZGUgIT0gMHhmZCAmJiBjb2RlICE9IDB4ZmUgJiYgY29kZSAhPSAweGZmKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogV2UgYWxzbyBoYXZlIHRvIGJlIHN1cmUgdGhlcmUgaXMgbm8gc3ltYm9sL2xhYmVsCi0JICAgICBhdCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotCSAgaWYgKG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIHNlYywgZXh0c3ltcywKLQkJCQkJICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0JICBzd2l0Y2ggKGNvZGUpCi0JICAgIHsKLQkgICAgICBjYXNlIDB4ZmM6Ci0JCWNvZGUgPSAweGZkOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmQ6Ci0JCWNvZGUgPSAweGZjOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmU6Ci0JCWNvZGUgPSAweGZmOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmY6Ci0JCWNvZGUgPSAweGZlOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTg6Ci0JCWNvZGUgPSAweGU5OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTk6Ci0JCWNvZGUgPSAweGU4OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTA6Ci0JCWNvZGUgPSAweGUyOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTI6Ci0JCWNvZGUgPSAweGUwOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTM6Ci0JCWNvZGUgPSAweGUxOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTE6Ci0JCWNvZGUgPSAweGUzOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTQ6Ci0JCWNvZGUgPSAweGU2OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTY6Ci0JCWNvZGUgPSAweGU0OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTc6Ci0JCWNvZGUgPSAweGU1OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTU6Ci0JCWNvZGUgPSAweGU3OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWM6Ci0JCWNvZGUgPSAweGVkOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWQ6Ci0JCWNvZGUgPSAweGVjOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWU6Ci0JCWNvZGUgPSAweGVmOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWY6Ci0JCWNvZGUgPSAweGVlOwotCQlicmVhazsKLQkgICAgfQotCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICAKLQkgIC8qIFNldCB0aGUgcmVsb2MgdHlwZSBhbmQgc3ltYm9sIGZvciB0aGUgZmlyc3QgYnJhbmNoCi0JICAgICBmcm9tIHRoZSBzZWNvbmQgYnJhbmNoLiAgKi8KLQkgIGlyZWwtPnJfaW5mbyA9IG5yZWwtPnJfaW5mbzsKLQotCSAgLyogTWFrZSB0aGUgcmVsb2MgZm9yIHRoZSBzZWNvbmQgYnJhbmNoIGEgbnVsbCByZWxvYy4gICovCi0JICBucmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAotCQkJCSAgICAgICBSX01OMTAyMDBfTk9ORSk7Ci0KLQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgKmFnYWluID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMjRiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcwotCSBpbnRvIGEgMTZiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF8yNCkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMuIAotCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAotCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBBbGwgaW5zbnMgd2hpY2ggaGF2ZSAyNGJpdCBvcGVyYW5kcyBhcmUgNSBieXRlcyBsb25nLAotCQkgdGhlIGZpcnN0IGJ5dGUgd2lsbCBhbHdheXMgYmUgMHhmNCwgYnV0IHdlIGRvdWJsZSBjaGVjawotCQkgaXQganVzdCBpbiBjYXNlLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGY0KQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgc3dpdGNoIChjb2RlICYgMHhmYykKLQkJewotCQkvKiBtb3YgaW1tMjQsZG4gLT4gbW92IGltbTE2LGRuICovCi0JCWNhc2UgMHg3MDoKLQkJICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gICovCi0JCSAgaWYgKHZhbHVlICYgMHg4MDAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZjggKyAoY29kZSAmIDB4MDMpLAotCQkJICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgUl9NTjEwMjAwXzE2KTsKLQotCQkgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUKLQkJICAgICBvZmZzZXQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogbW92IGltbTI0LGFuIC0+IG1vdiBpbW0xNixhbiAKLQkJICAgY21wIGltbTI0LGFuIC0+IGNtcCBpbW0xNixhbgotCQkgICBtb3YgKGFiczI0KSxkbiAtPiBtb3YgKGFiczE2KSxkbgotCQkgICBtb3YgZG4sKGFiczI0KSAtPiBtb3YgZG4sKGFiczE2KQotCQkgICBtb3ZiIGRuLChhYnMyNCkgLT4gbW92YiBkbiwoYWJzMTYpCi0JCSAgIG1vdmJ1IChhYnMyNCksZG4gLT4gbW92YnUgKGFiczE2KSxkbiAqLwotCQljYXNlIDB4NzQ6Ci0JCWNhc2UgMHg3YzoKLQkJY2FzZSAweGMwOgotCQljYXNlIDB4NDA6Ci0JCWNhc2UgMHg0NDoKLQkJY2FzZSAweGM4OgotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxkZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgaWYgKChjb2RlICYgMHhmYykgPT0gMHg3NCkKLQkJICAgIGNvZGUgPSAweGRjICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4N2MpCi0JCSAgICBjb2RlID0gMHhlYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGMwKQotCQkgICAgY29kZSA9IDB4YzggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg0MCkKLQkJICAgIGNvZGUgPSAweGMwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NDQpCi0JCSAgICBjb2RlID0gMHhjNCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGM4KQotCQkgICAgY29kZSA9IDB4Y2MgKyAoY29kZSAmIDB4MDMpOwotCi0JCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlCi0JCSAgICAgb2Zmc2V0LiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIGNtcCBpbW0yNCxkbiAtPiBjbXAgaW1tMTYsZG4KLQkJICAgbW92IChhYnMyNCksYW4gLT4gbW92IChhYnMxNiksYW4KLQkJICAgbW92IGFuLChhYnMyNCkgLT4gbW92IGFuLChhYnMxNikKLQkJICAgYWRkIGltbTI0LGRuIC0+IGFkZCBpbW0xNixkbgotCQkgICBhZGQgaW1tMjQsYW4gLT4gYWRkIGltbTE2LGFuCi0JCSAgIHN1YiBpbW0yNCxkbiAtPiBzdWIgaW1tMTYsZG4KLQkJICAgc3ViIGltbTI0LGFuIC0+IHN1YiBpbW0xNixhbiAKLQkJICAgQW5kIGFsbCBkMjQtPmQxNiBpbiBtZW1vcnkgb3BzLiAgKi8KLQkJY2FzZSAweDc4OgotCQljYXNlIDB4ZDA6Ci0JCWNhc2UgMHg1MDoKLQkJY2FzZSAweDYwOgotCQljYXNlIDB4NjQ6Ci0JCWNhc2UgMHg2ODoKLQkJY2FzZSAweDZjOgotCQljYXNlIDB4ODA6Ci0JCWNhc2UgMHhmMDoKLQkJY2FzZSAweDAwOgotCQljYXNlIDB4MTA6Ci0JCWNhc2UgMHhiMDoKLQkJY2FzZSAweDMwOgotCQljYXNlIDB4YTA6Ci0JCWNhc2UgMHgyMDoKLQkJY2FzZSAweDkwOgotCQkgIC8qIE5vdCBzYWZlIGlmIHRoZSBoaWdoIGJpdCBpcyBvbiBhcyByZWxheGluZyBtYXkKLQkJICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgKi8KLQkJICBpZiAoKChjb2RlICYgMHhmYykgPT0gMHg3OAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDYwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4NjQKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2OAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDZjCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4ODAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHhmMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDAwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4MTAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHhiMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDMwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4YTAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgyMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDkwKQotCQkgICAgICAgJiYgKHZhbHVlICYgMHg4MDAwKSAhPSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZjcsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NzgpCi0JCSAgICBjb2RlID0gMHg0OCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGQwKQotCQkgICAgY29kZSA9IDB4MzAgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg1MCkKLQkJICAgIGNvZGUgPSAweDIwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NjApCi0JCSAgICBjb2RlID0gMHgxOCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDY0KQotCQkgICAgY29kZSA9IDB4MDggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg2OCkKLQkJICAgIGNvZGUgPSAweDFjICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NmMpCi0JCSAgICBjb2RlID0gMHgwYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDgwKQotCQkgICAgY29kZSA9IDB4YzAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhmMCkKLQkJICAgIGNvZGUgPSAweGIwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MDApCi0JCSAgICBjb2RlID0gMHg4MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDEwKQotCQkgICAgY29kZSA9IDB4YTAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhiMCkKLQkJICAgIGNvZGUgPSAweDcwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MzApCi0JCSAgICBjb2RlID0gMHg2MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGEwKQotCQkgICAgY29kZSA9IDB4ZDAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHgyMCkKLQkJICAgIGNvZGUgPSAweDkwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4OTApCi0JCSAgICBjb2RlID0gMHg1MCArIChjb2RlICYgMHgwNyk7Ci0KLQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOwotCi0JCSAgLyogRGVsZXRlIG9uZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIG1vdmIgKGFiczI0KSxkbiAtPm1vdmJ1IChhYnMxNiksZG4gZXh0eGIgYm4gKi8KLQkJY2FzZSAweGM0OgotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxkZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGNjICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGI4ICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgcmVsb2Mgd2lsbCBiZSBhcHBsaWVkIG9uZSBieXRlIGluIGZyb250IG9mIGl0cwotCQkgICAgIGN1cnJlbnQgbG9jYXRpb24uICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAvKiBEZWxldGUgb25lIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAyLCAxKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgaW50IHNobmR4LCBpbmRleDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpKQotCWlyZWwtPnJfb2Zmc2V0IC09IGNvdW50OwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIGEgc3ltYm9sIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgZWxzZSByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBpbnQgc2huZHg7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2gsICoqc3ltX2hhc2hfZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgLyogRXhhbWluZSBhbGwgdGhlIHN5bWJvbHMuICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hfZW5kID0gKHN5bV9oYXNoCi0JCSAgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKQotCQkgICAgIC0gc3ltdGFiX2hkci0+c2hfaW5mbykpOwotICBmb3IgKDsgc3ltX2hhc2ggPCBzeW1faGFzaF9lbmQ7IHN5bV9oYXNoKyspCi0gICAgewotICAgICAgaWYgKCgoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID09IGFkZHIpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLW1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQkgICAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmludGVybmFsX3N5bXMgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCi0gICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUKLSAgICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBtZW1jcHkgKGRhdGEsIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cywKLQkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0KLSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCWV4dGVybmFsX3N5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGV4dGVybmFsX3N5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpOwotCSAgaWYgKGV4dGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIHN5bXRhYl9oZHItPnNoX2luZm8sIGlucHV0X2JmZCkKLQkJICAhPSAoc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgZmFsc2UpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoRWxmX0ludGVybmFsX1N5bSAqKQotCQkgICAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSkpOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IGV4dGVybmFsX3N5bXM7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7ICsrZXN5bSwgKytpc3ltcCwgKytzZWNwcCkKLQl7Ci0JICBhc2VjdGlvbiAqaXNlYzsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW1wKTsKLQotCSAgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID4gMCAmJiBpc3ltcC0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdobyBrbm93cz8gICovCi0JICAgICAgaXNlYyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnNlY3BwID0gaXNlYzsKLQl9Ci0KLSAgICAgIGlmICghIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX21uMTAyMDBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbW4xMDIwMCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21uMTAyMDAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfTU4xMDIwMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCW1uMTAyMDBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJMAotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCW1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCW1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDMwMC5jIGIvYmZkL2VsZi1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4ZjUzOC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk4MSArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMzAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tbjEwMzAwLmgiCi0KLXN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeQotewotICAvKiBUaGUgYmFzaWMgZWxmIGxpbmsgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcwotICAgICBjYWxsZWQgZGlyZWN0bHkgKGllIGJ5IG5hbWUpLiAgKi8KLSAgdW5zaWduZWQgaW50IGRpcmVjdF9jYWxsczsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgdGhlIHNpemUgb2YgdGhpcyBmdW5jdGlvbidzIHN0YWNrCi0gICAgIChpZiA8PSAyNTUgYnl0ZXMpLiAgV2Ugc3R1ZmYgdGhpcyBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMKLSAgICAgdG8gdGhpcyB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLgotCi0gICAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBzdGFjayBhbGxvY2F0ZWQgYnkgbW92bSEgICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhY2tfc2l6ZTsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgYXJndW1lbnRzIChpZiBhbnkpIGZvciBtb3ZtIGluc3RydWN0aW9uCi0gICAgIGluIHRoZSBwcm9sb2d1ZS4gIFdlIHN0dWZmIHRoaXMgdmFsdWUgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zCi0gICAgIHRvIHRoZSB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX2FyZ3M7Ci0KLSAgLyogRm9yIGZ1bnRpb24gc3ltYm9scywgdGhlIGFtb3VudCBvZiBzdGFjayBzcGFjZSB0aGF0IHdvdWxkIGJlIGFsbG9jYXRlZAotICAgICBieSB0aGUgbW92bSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggbW92bV9hcmdzLCBidXQgd2UKLSAgICAgYWRkIGl0IHRvIHRoZSBoYXNoIHRhYmxlIHRvIGF2b2lkIGNvbXB1dGluZyBpdCBvdmVyIGFuZCBvdmVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX3N0YWNrX3NpemU7Ci0KLS8qIFdoZW4gc2V0LCBjb252ZXJ0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvIHRoaXMgdGFyZ2V0IGludG8gImNhbGxzIgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMgMHgxCi0KLS8qIFVzZWQgdG8gbWFyayBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBoYWQgcmVkdW5kYW50IHBhcnRzIG9mIHRoZWlyCi0gICBwcm9sb2d1ZSBkZWxldGVkLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTIDB4MgotICB1bnNpZ25lZCBjaGFyIGZsYWdzOwotfTsKLQotLyogV2UgZGVyaXZlIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBtYWluIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBzbwotICAgd2UgY2FuIHN0b3JlIHN0YXRlIHZhcmlhYmxlcyBhbmQgYSBzZWNvbmRhcnkgaGFzaCB0YWJsZSB3aXRob3V0Ci0gICByZXNvcnRpbmcgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gICovCi1zdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogQSBoYXNoIHRhYmxlIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgV2UgY291bGQgZGVyaXZlIGEgbmV3IGhhc2ggdGFibGUKLSAgICAgaW5zdGVhZCBvZiB1c2luZyB0aGUgZnVsbCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSBpZiB3ZSB3YW50ZWQKLSAgICAgdG8gc2F2ZSBzb21lIG1lbW9yeS4gICovCi0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqc3RhdGljX2hhc2hfdGFibGU7Ci0KLSAgLyogUmFuZG9tIGxpbmtlciBzdGF0ZSBmbGFncy4gICovCi0jZGVmaW5lIE1OMTAzMDBfSEFTSF9FTlRSSUVTX0lOSVRJQUxJWkVEIDB4MQotICBjaGFyIGZsYWdzOwotfTsKLQotLyogRm9yIE1OMTAzMDAgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBHZXQgdGhlIE1OMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG1uMTAzMDBfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIG1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKm1uMTAzMDBfZWxmX2djX21hcmtfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgY29tcHV0ZV9mdW5jdGlvbl9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21uMTAzMDBfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIER1bW15IHJlbG9jYXRpb24uICBEb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX05PTkUsCi0JIDAsCi0JIDIsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9OT05FIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8zMiwKLQkgMCwKLQkgMiwKLQkgMzIsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzMyIiwKLQkgZmFsc2UsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMTYgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8xNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDggYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF84LAotCSAwLAotCSAwLAotCSA4LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF84IiwKLQkgZmFsc2UsCi0JIDB4ZmYsCi0JIDB4ZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX1BDUkVMMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMMzIiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmZmZiwKLQkgMHhmZmZmZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFN0YW5kYXJkIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9QQ1JFTDE2LAotCSAwLAotCSAxLAotCSAxNiwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9QQ1JFTDE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSB0cnVlKSwKLSAgLyogU3RhbmRhcmQgOCBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfUENSRUw4LAotCSAwLAotCSAwLAotCSA4LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSB0cnVlKSwKLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX01OMTAzMDBfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRFTlRSWSIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdGFuZGFyZCAyNCBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwXzI0LAotCSAwLAotCSAyLAotCSAyNCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfMjQiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmYsCi0JIDB4ZmZmZmZmLAotCSBmYWxzZSksCi0KLX07Ci0KLXN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcCBtbjEwMzAwX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NTjEwMzAwX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01OMTAzMDBfMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01OMTAzMDBfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfTU4xMDMwMF84LCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAzMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMOCwgfSwKLSAgeyBCRkRfUkVMT0NfMjQsIFJfTU4xMDMwMF8yNCwgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9NTjEwMzAwX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAobW4xMDMwMF9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgbW4xMDMwMF9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAobW4xMDMwMF9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX21uMTAzMDBfaG93dG9fdGFibGVbbW4xMDMwMF9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIE1OMTAzMDAgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1uMTAzMDBfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NTjEwMzAwX01BWCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21uMTAzMDBfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQkvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1uMTAzMDBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBpc19sb2NhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01OMTAzMDBfTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8zMjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8yNDoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlICYgMHhmZiwgaGl0X2RhdGEpOwotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsICh2YWx1ZSA+PiA4KSAmIDB4ZmYsIGhpdF9kYXRhICsgMSk7Ci0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgKHZhbHVlID4+IDE2KSAmIDB4ZmYsIGhpdF9kYXRhICsgMik7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfMTY6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2ZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwXzg6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2YgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9QQ1JFTDg6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmIHx8IChsb25nKXZhbHVlIDwgLTB4MTAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwX1BDUkVMMTY6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfUENSRUwzMjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci19Ci0KLQwKLS8qIFJlbG9jYXRlIGFuIE1OMTAzMDAgRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqKQotCQkgKGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGhvd3RvID0gZWxmX21uMTAzMDBfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIC8qIEp1c3Qgc2tpcCB0aGUgdnRhYmxlIGdjIHJlbG9jcy4gICovCi0gICAgICBpZiAocl90eXBlID09IFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUCi0JICB8fCByX3R5cGUgPT0gUl9NTjEwMzAwX0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICByID0gbW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCSAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQsCi0JCQkJCSAgIGluZm8sIHNlYywgaCA9PSBOVUxMKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjb25zdCBjaGFyICptc2cgPSAoY29uc3QgY2hhciAqKTA7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggaW5pdGlhbGl6aW5nIG9uZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5IChnZW5fZW50cnksIGluX2FyZ3MpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZ2VuX2VudHJ5OwotICAgICBQVFIgaW5fYXJncyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmVudHJ5OwotICB1bnNpZ25lZCBpbnQgYnl0ZV9jb3VudCA9IDA7Ci0KLSAgZW50cnkgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OwotCi0gIC8qIElmIHdlIGFscmVhZHkga25vdyB3ZSB3YW50IHRvIGNvbnZlcnQgImNhbGwiIHRvICJjYWxscyIgZm9yIGNhbGxzCi0gICAgIHRvIHRoaXMgc3ltYm9sLCB0aGVuIHJldHVybiBub3cuICAqLwotICBpZiAoZW50cnktPmZsYWdzID09IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBuYW1lZCBjYWxscyB0byB0aGlzIHN5bWJvbCwgb3IgdGhlcmUncyBub3RoaW5nIHdlCi0gICAgIGNhbiBtb3ZlIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4KLSAgICAgbm90ZSB0aGF0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byAiY2FsbHMiCi0gICAgIGluc3RydWN0aW9ucyBhbmQgcmV0dXJuLiAgKi8KLSAgaWYgKGVudHJ5LT5kaXJlY3RfY2FsbHMgPT0gMAotICAgICAgfHwgKGVudHJ5LT5zdGFja19zaXplID09IDAgJiYgZW50cnktPm1vdm1fYXJncyA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIGEgbm90ZSB0aGF0IHdlIHNob3VsZCBjb252ZXJ0ICJjYWxsIiBpbnN0cnVjdGlvbnMgdG8gImNhbGxzIgotCSBpbnN0cnVjdGlvbnMgZm9yIGNhbGxzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGVudHJ5LT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBtYXkgYmUgYWJsZSB0byBtb3ZlIHNvbWUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvCi0gICAgIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24uICBDb3VudCBob3cgbWFueSBieXRlcyB3ZSBtaWdodCBiZSBhYmxlIHRvCi0gICAgIGVsaW1pbmF0ZSBpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLQotICAvKiBBIG1vdm0gaW5zdHJ1Y3Rpb24gaXMgdHdvIGJ5dGVzLiAgKi8KLSAgaWYgKGVudHJ5LT5tb3ZtX2FyZ3MpCi0gICAgYnl0ZV9jb3VudCArPSAyOwotCi0gIC8qIENvdW50IHRoZSBpbnNuIHRvIGFsbG9jYXRlIHN0YWNrIHNwYWNlIHRvby4gICovCi0gIGlmIChlbnRyeS0+c3RhY2tfc2l6ZSA+IDAgJiYgZW50cnktPnN0YWNrX3NpemUgPD0gMTI4KQotICAgIGJ5dGVfY291bnQgKz0gMzsKLSAgZWxzZSBpZiAoZW50cnktPnN0YWNrX3NpemUgPiAwICYmIGVudHJ5LT5zdGFja19zaXplIDwgMjU2KQotICAgIGJ5dGVfY291bnQgKz0gNDsKLQotICAvKiBJZiB1c2luZyAiY2FsbCIgd2lsbCByZXN1bHQgaW4gbGFyZ2VyIGNvZGUsIHRoZW4gdHVybiBhbGwKLSAgICAgdGhlIGFzc29jaWF0ZWQgImNhbGwiIGluc3RydWN0aW9ucyBpbnRvICJjYWxscyIgaW5zdHJ1dGlvbnMuICAqLwotICBpZiAoYnl0ZV9jb3VudCA8IGVudHJ5LT5kaXJlY3RfY2FsbHMpCi0gICAgZW50cnktPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOwotCi0gIC8qIFRoaXMgcm91dGluZSBuZXZlciBmYWlscy4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtbjEwMzAwLgotCi0gICBUaGVyZSdzIHF1aXRlIGEgZmV3IHJlbGF4aW5nIG9wcG9ydHVuaXRlcyBhdmFpbGFibGUgb24gdGhlIG1uMTAzMDA6Ci0KLQkqIGNhbGxzOjMyIC0+IGNhbGxzOjE2IAkJCQkJICAgMiBieXRlcwotCSogY2FsbDozMiAgLT4gY2FsbDoxNgkJCQkJICAgMiBieXRlcwotCi0JKiBjYWxsOjMyIC0+IGNhbGxzOjMyCQkJCQkgICAxIGJ5dGUKLQkqIGNhbGw6MTYgLT4gY2FsbHM6MTYJCQkJCSAgIDEgYnl0ZQotCQkqIFRoZXNlIGFyZSBkb25lIGFueXRpbWUgdXNpbmcgImNhbGxzIiB3b3VsZCByZXN1bHQKLQkJaW4gc21hbGxlciBjb2RlLCBvciB3aGVuIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSB0aGUKLQkJbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS4KLQotCSogY2FsbDozMgkJCQkJCSAgIHZhcmllcwotCSogY2FsbDoxNgotCQkqIEluIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSBjYW4gbW92ZSBpbnN0cnVjdGlvbnMKLQkJZnJvbSBhIGZ1bmN0aW9uIHByb2xvZ3VlIGludG8gYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JCVRoaXMgaXMgb25seSBkb25lIGlmIHRoZSByZXN1bHRpbmcgY29kZSBpcyBubyBsYXJnZXIKLQkJdGhhbiB0aGUgb3JpZ2luYWwgY29kZS4KLQotCi0JKiBqbXA6MzIgLT4gam1wOjE2CQkJCQkgICAyIGJ5dGVzCi0JKiBqbXA6MTYgLT4gYnJhOjgJCQkJCSAgIDEgYnl0ZQotCi0JCSogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoCi0JCWFyb3VuZCB0aGUganVtcC9icmEsIHdlIG1heSBiZSBhYmxlIHRvIHJldmVyc2UgaXRzIGNvbmRpdGlvbgotCQlhbmQgY2hhbmdlIGl0cyB0YXJnZXQgdG8gdGhlIGp1bXAncyB0YXJnZXQuICBUaGUganVtcC9icmEKLQkJY2FuIHRoZW4gYmUgZGVsZXRlZC4JCQkJICAgMiBieXRlcwotCi0JKiBtb3YgYWJzMzIgLT4gbW92IGFiczE2CQkJCSAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMzIgY2FuIHJlbGF4IHRvIGltbTE2ICAxIG9yIDIgYnl0ZXMKLQktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBpbW0xNiBjYW4gcmVsYXggdG8gaW1tOCAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDMyIGNhbiByZWxheCB0byBkMTYJICAgMSBvciAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDE2IGNhbiByZWxheCB0byBkOAkgICAxIG9yIDIgYnl0ZXMKLQotCVdlIGRvbid0IGhhbmRsZSBpbW0xNi0+aW1tOCBvciBkMTYtPmQ4IGFzIHRoZXkncmUgdmVyeSByYXJlCi0JYW5kIHNvbWV3aGF0IG1vcmUgZGlmZmljdWx0IHRvIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIG1uMTAzMDAgc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBmaWVsZHMgaW4gZWFjaCBoYXNoIHRhYmxlIGVudHJ5IHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICAqLwotICBpZiAoKGhhc2hfdGFibGUtPmZsYWdzICYgTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQpID09IDApCi0gICAgewotICAgICAgYmZkICppbnB1dF9iZmQ7Ci0KLSAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGlucHV0IGJmZHMuICAqLwotICAgICAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7Ci0JICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0JICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgYWxsIHRoZSBzeW1ib2xzIGZvciBlYWNoIGJmZC4gICovCi0JICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICAgICAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotICAgICAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgICAgICAgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0gICAgICAgICAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLSAgICAgICAgICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLSAgICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICAgICAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgaW5wdXRfYmZkKQotICAgICAgICAgICAgICAgICAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgICAgICAgfQotCi0JICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBzZWN0aW9uIGluIHRoaXMgYmZkLiAgKi8KLQkgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjID0gTlVMTDsKLQkgICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgICAgICBjaGFyICpuZXdfbmFtZTsKLQotCSAgICAgIC8qIEdldCBjYWNoZWQgY29weSBvZiBzZWN0aW9uIGNvbnRlbnRzIGlmIGl0IGV4aXN0cy4gICovCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCQljb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50czsKLQkgICAgICBlbHNlIGlmIChzZWN0aW9uLT5fcmF3X3NpemUgIT0gMCkKLQkJewotCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkJICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKWJmZF9tYWxsb2MgKHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkJICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBzZWN0aW9uLAotCQkJCQkJIGNvbnRlbnRzLCAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgc2VjdGlvbi0+X3Jhd19zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY29udGVudHMgPSBOVUxMOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jcywgdGhlbiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uICAqLwotCSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLQkJICAmJiBzZWN0aW9uLT5yZWxvY19jb3VudCAhPSAwKQotCQl7Ci0KLQkJICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotCQkgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCQkgICAgIChpbnB1dF9iZmQsIHNlY3Rpb24sIChQVFIpIE5VTEwsCi0JCQkJICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotCQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JCSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotCQkgIC8qIE5vdyBleGFtaW5lIGVhY2ggcmVsb2NhdGlvbi4gICovCi0JCSAgaXJlbCA9IGludGVybmFsX3JlbG9jczsKLQkJICBpcmVsZW5kID0gaXJlbCArIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCQkgICAgewotCQkgICAgICBsb25nIHJfdHlwZTsKLQkJICAgICAgdW5zaWduZWQgbG9uZyByX2luZGV4OwotCQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkJICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pOwotCQkgICAgICByX2luZGV4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyk7Ci0KLQkJICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpUl9NTjEwMzAwX01BWCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAgIC8qIFdlIG5lZWQgdGhlIG5hbWUgYW5kIGhhc2ggdGFibGUgZW50cnkgb2YgdGhlIHRhcmdldAotCQkJIHN5bWJvbCEgICovCi0JCSAgICAgIGhhc2ggPSBOVUxMOwotCQkgICAgICBzeW0gPSBOVUxMOwotCQkgICAgICBzeW1fc2VjID0gTlVMTDsKLQotCQkgICAgICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JCQl7Ci0JCQkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KLQkJCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0JCQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLAotCQkJCQkJICAgIGV4dHN5bXMgKyByX2luZGV4LCAmaXN5bSk7Ci0KLQkJCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMAotCQkJCSAgICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQkJICAgIHN5bV9zZWMKLQkJCSAgICAgID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgaXN5bS5zdF9zaG5keCk7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkJCSAgICBzeW1fc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCQkJICAKLQkJCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICBpc3ltLnN0X25hbWUpOwotCi0JCQkgIC8qIElmIGl0IGlzbid0IGEgZnVuY3Rpb24sIHRoZW4gd2UgZG9uJ3QgY2FyZQotCQkJICAgICBhYm91dCBpdC4gICovCi0JCQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJICAgICAgJiYgRUxGX1NUX1RZUEUgKGlzeW0uc3RfaW5mbykgIT0gU1RUX0ZVTkMpCi0JCQkgICAgY29udGludWU7Ci0KLQkJCSAgLyogVGFjayBvbiBhbiBJRCBzbyB3ZSBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcwotCQkJICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkJCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkJCSAgaWYgKG5ld19uYW1lID09IDApCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0KLQkJCSAgaGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCQkgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkJICAgICAgICAgc3ltX25hbWUsIHRydWUsCi0JCQkJCQkgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0JCQkgIGZyZWUgKG5ld19uYW1lKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICByX2luZGV4IC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCQkgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkJICAgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbcl9pbmRleF07Ci0JCQl9Ci0KLQkJICAgICAgLyogSWYgdGhpcyBpcyBub3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4gd2UKLQkJCSBzaG91bGQgY29udmVydCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvICJjYWxscyIKLQkJCSBpbnN0cnVjdGlvbnMuICAqLwotCQkgICAgICBjb2RlID0gYmZkX2dldF84IChpbnB1dF9iZmQsCi0JCQkJCWNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkJICAgICAgaWYgKGNvZGUgIT0gMHhkZCAmJiBjb2RlICE9IDB4Y2QpCi0JCQloYXNoLT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLQotCQkgICAgICAvKiBJZiB0aGlzIGlzIGEganVtcC9jYWxsLCB0aGVuIGJ1bXAgdGhlIGRpcmVjdF9jYWxscwotCQkJIGNvdW50ZXIuICBFbHNlIGZvcmNlICJjYWxsIiB0byAiY2FsbHMiIGNvbnZlcnNpb25zLiAgKi8KLQkJICAgICAgaWYgKHJfdHlwZSA9PSBSX01OMTAzMDBfUENSRUwzMgotCQkJICB8fCByX3R5cGUgPT0gUl9NTjEwMzAwX1BDUkVMMTYpCi0JCQloYXNoLT5kaXJlY3RfY2FsbHMrKzsKLQkJICAgICAgZWxzZQotCQkJaGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIE5vdyBsb29rIGF0IHRoZSBhY3R1YWwgY29udGVudHMgdG8gZ2V0IHRoZSBzdGFjayBzaXplLAotCQkgYW5kIGEgbGlzdCBvZiB3aGF0IHJlZ2lzdGVycyB3ZXJlIHNhdmVkIGluIHRoZSBwcm9sb2d1ZQotCQkgKGllIG1vdm1fYXJncykuICAqLwotCSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkJewotCi0JCSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQkJICBpbnQgaWR4LCBzaG5keDsKLQotCQkgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICBzZWN0aW9uKTsKLQotCi0JCSAgLyogTG9vayBhdCBlYWNoIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uIGFuZAotCQkgICAgIHVwZGF0ZSBpbmZvIGZvciB0aGF0IGZ1bmN0aW9uLiAgKi8KLQkJICBlc3ltID0gZXh0c3ltczsKLQkJICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0JCSAgICB7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkJICAmJiBFTEZfU1RfVFlQRSAoaXN5bS5zdF9pbmZvKSA9PSBTVFRfRlVOQykKLQkJCXsKLQkJCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMAotCQkJCSAgICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQkJICAgIHN5bV9zZWMKLQkJCSAgICAgID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgaXN5bS5zdF9zaG5keCk7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkJCSAgICBzeW1fc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCi0JCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJaXN5bS5zdF9uYW1lKTsKLQotCQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JCQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkJICBpZiAobmV3X25hbWUgPT0gMCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCQkJICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJCSAgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkJICAgICAgICAgIHN5bV9uYW1lLCB0cnVlLAotCQkJCQkJICAgICAgICAgIHRydWUsIGZhbHNlKTsKLQkJCSAgZnJlZSAobmV3X25hbWUpOwotCQkJICBjb21wdXRlX2Z1bmN0aW9uX2luZm8gKGlucHV0X2JmZCwgaGFzaCwKLQkJCQkJICAgICAgICAgaXN5bS5zdF92YWx1ZSwgY29udGVudHMpOwotCQkJfQotCQkgICAgfQotCi0JCSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotCQkgIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUKLQkJCQkgICAgICAgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotCQkgIGZvciAoaWR4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaWR4KyspCi0JCSAgICB7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgICAgICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgICAgIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lkeF07Ci0JCSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCQkgICYmIEVMRl9TVF9UWVBFIChpc3ltLnN0X2luZm8pID09IFNUVF9GVU5DCi0JCQkgICYmIChoYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjdGlvbgotCQkJICAmJiAoKGhhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgIHx8IChoYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJCWNvbXB1dGVfZnVuY3Rpb25faW5mbyAoaW5wdXRfYmZkLCBoYXNoLAotCQkJCQkgICAgICAgKGhhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUsCi0JCQkJCSAgICAgICBjb250ZW50cyk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSByZWxvY3MuICAqLwotCSAgICAgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotCQl7Ci0JCSAgZnJlZSAoZnJlZV9yZWxvY3MpOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIGNvbnRlbnRzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgfQotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHN5bWJvbHMuICAqLwotCSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoZnJlZV9leHRzeW1zKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JCX0KLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOb3cgaXRlcmF0ZSBvbiBlYWNoIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgcGVyZm9ybQotCSB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgb24gZWFjaC4gICovCi0gICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSAoaGFzaF90YWJsZSwKLQkJCQkJZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSwKLQkJCQkJTlVMTCk7Ci0gICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSAoaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUsCi0JCQkJCWVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnksCi0JCQkJCU5VTEwpOwotCi0gICAgICAvKiBBbGwgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuICAqLwotICAgICAgaGFzaF90YWJsZS0+ZmxhZ3MgfD0gTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQ7Ci0KLSAgICAgIC8qIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGdvIHRocm91Z2ggZWFjaAotCSBjb2RlIHNlY3Rpb24gYW5kIGRlbGV0ZSBhbnkgcHJvbG9ndWUgaW5zbnMgd2hpY2ggd2lsbCBiZQotCSByZWR1bmRhbnQgYmVjYXVzZSB0aGVpciBvcGVyYXRpb25zIHdpbGwgYmUgcGVyZm9ybWVkIGJ5Ci0JIGEgImNhbGwiIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzOwotCSAgIGlucHV0X2JmZCAhPSBOVUxMOwotCSAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIGFsbCB0aGUgc3ltYm9scyBmb3IgZWFjaCBiZmQuICAqLwotCSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgICAgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLSAgICAgICAgICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotICAgICAgICAgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0gICAgICAgICAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0gICAgICAgICAgICAgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICAgICAgICAgICAgICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGlucHV0X2JmZCkKLSAgICAgICAgICAgICAgICAgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgIH0KLQotCSAgLyogV2FsayBvdmVyIGVhY2ggc2VjdGlvbiBpbiB0aGlzIGJmZC4gICovCi0JICBmb3IgKHNlY3Rpb24gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgICBzZWN0aW9uICE9IE5VTEw7Ci0JICAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IHNobmR4OwotCSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0JICAgICAgaW50IGlkeDsKLQotCSAgICAgIC8qIFNraXAgbm9uLWNvZGUgc2VjdGlvbnMgYW5kIGVtcHR5IHNlY3Rpb25zLiAgKi8KLQkgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDAgfHwgc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ICE9IDApCi0JCXsKLSAgICAgICAgICAgICAgICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICAgICAgICAgICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0X2JmZCwgc2VjdGlvbiwgKFBUUikgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgICAgICAgICAgICAgICAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJfQotCi0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IG9mIHNlY3Rpb24gY29udGVudHMgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkJICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKWJmZF9tYWxsb2MgKHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkJICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBzZWN0aW9uLAotCQkJCQkJIGNvbnRlbnRzLCAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgc2VjdGlvbi0+X3Jhd19zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQotCSAgICAgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChpbnB1dF9iZmQsIHNlY3Rpb24pOwotCi0JICAgICAgLyogTm93IGxvb2sgZm9yIGFueSBmdW5jdGlvbiBpbiB0aGlzIHNlY3Rpb24gd2hpY2ggbmVlZHMKLQkJIGluc25zIGRlbGV0ZWQgZnJvbSBpdHMgcHJvbG9ndWUuICAqLwotCSAgICAgIGVzeW0gPSBleHRzeW1zOwotCSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkJICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCQkgIGFzZWN0aW9uICpzeW1fc2VjID0gTlVMTDsKLQkJICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkJICBjaGFyICpuZXdfbmFtZTsKLQotCQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLQkJICBpZiAoaXN5bS5zdF9zaG5keCAhPSBzaG5keCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCSAgICBzeW1fc2VjCi0JCSAgICAgID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bS5zdF9zaG5keCk7Ci0JCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgCi0JCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQlpc3ltLnN0X25hbWUpOwotCi0JCSAgLyogVGFjayBvbiBhbiBJRCBzbyB3ZSBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcwotCQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JCSAgaWYgKG5ld19uYW1lID09IDApCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJICBzeW1fbmFtZSA9IG5ld19uYW1lOwotCi0JCSAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCZoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwKLQkJCQkJICAgICAgICAgIHN5bV9uYW1lLCBmYWxzZSwKLQkJCQkJICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0KLQkJICBmcmVlIChuZXdfbmFtZSk7Ci0JCSAgaWYgKHN5bV9oYXNoID09IE5VTEwpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmICghICgoc3ltX2hhc2gpLT5mbGFncyAmIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQotCQkgICAgICAmJiAhICgoc3ltX2hhc2gpLT5mbGFncyAmIE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUykpCi0JCSAgICB7Ci0JCSAgICAgIGludCBieXRlcyA9IDA7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhpbmdzLiAgKi8KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKWV4dHN5bXM7Ci0JCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgICAgLyogQ291bnQgaG93IG1hbnkgYnl0ZXMgd2UncmUgZ29pbmcgdG8gZGVsZXRlLiAgKi8KLQkJICAgICAgaWYgKHN5bV9oYXNoLT5tb3ZtX2FyZ3MpCi0JCQlieXRlcyArPSAyOwotCi0JCSAgICAgIGlmIChzeW1faGFzaC0+c3RhY2tfc2l6ZSAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8PSAxMjgpCi0JCQlieXRlcyArPSAzOwotCQkgICAgICBlbHNlIGlmIChzeW1faGFzaC0+c3RhY2tfc2l6ZQotCQkJICAgICAgICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDwgMjU2KQotCQkJYnl0ZXMgKz0gNDsKLQotCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgZGVsZXRlZCBwcm9sb2d1ZSBieXRlcyBmb3IgdGhpcwotCQkJIGZ1bmN0aW9uLiAgKi8KLQkJICAgICAgc3ltX2hhc2gtPmZsYWdzIHw9IE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUzsKLQotCQkgICAgICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLQkJICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGlucHV0X2JmZCwKLQkJCQkJCQkgICBzZWN0aW9uLAotCQkJCQkJCSAgIGlzeW0uc3RfdmFsdWUsCi0JCQkJCQkJICAgYnl0ZXMpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogU29tZXRoaW5nIGNoYW5nZWQuICBOb3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQKLQkJCSBtYXkgbGVhZCB0byBtb3JlIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotCQkgICAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBMb29rIGZvciBhbnkgZ2xvYmFsIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gd2hpY2gKLQkJIG5lZWQgaW5zbnMgZGVsZXRlZCBmcm9tIHRoZWlyIHByb2xvZ3Vlcy4gICovCi0JICAgICAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgICAgIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUKLQkJCQkgICAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0JICAgICAgZm9yIChpZHggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpZHgrKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkJICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCi0JCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sICZpc3ltKTsKLQkJICBzeW1faGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCSAgICAgICAoZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaWR4XSk7Ci0JCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkJICAgICAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjdGlvbgotCQkgICAgICAmJiAhICgoc3ltX2hhc2gpLT5mbGFncyAmIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQotCQkgICAgICAmJiAhICgoc3ltX2hhc2gpLT5mbGFncyAmIE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUykpCi0JCSAgICB7Ci0JCSAgICAgIGludCBieXRlcyA9IDA7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhpbmdzLiAgKi8KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKWV4dHN5bXM7Ci0JCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgICAgLyogQ291bnQgaG93IG1hbnkgYnl0ZXMgd2UncmUgZ29pbmcgdG8gZGVsZXRlLiAgKi8KLQkJICAgICAgaWYgKHN5bV9oYXNoLT5tb3ZtX2FyZ3MpCi0JCQlieXRlcyArPSAyOwotCi0JCSAgICAgIGlmIChzeW1faGFzaC0+c3RhY2tfc2l6ZSAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8PSAxMjgpCi0JCQlieXRlcyArPSAzOwotCQkgICAgICBlbHNlIGlmIChzeW1faGFzaC0+c3RhY2tfc2l6ZQotCQkJICAgICAgICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDwgMjU2KQotCQkJYnl0ZXMgKz0gNDsKLQotCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgZGVsZXRlZCBwcm9sb2d1ZSBieXRlcyBmb3IgdGhpcwotCQkJIGZ1bmN0aW9uLiAgKi8KLQkJICAgICAgc3ltX2hhc2gtPmZsYWdzIHw9IE1OMTAzMDBfREVMRVRFRF9QUk9MT0dVRV9CWVRFUzsKLQotCQkgICAgICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLQkJICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGlucHV0X2JmZCwKLQkJCQkJCQkgICBzZWN0aW9uLAotCQkJCQkJCSAgIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwKLQkJCQkJCQkgICBieXRlcykpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZC4gIE5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dAotCQkJIG1heSBsZWFkIHRvIG1vcmUgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0JCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSByZWxvY3MuICAqLwotCSAgICAgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotCQl7Ci0JCSAgZnJlZSAoZnJlZV9yZWxvY3MpOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIGNvbnRlbnRzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgfQotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHN5bWJvbHMuICAqLwotCSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoZnJlZV9leHRzeW1zKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JCX0KLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLQotCi0gIC8qIChSZSlpbml0aWFsaXplIGZvciB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gc2hvcnRlbmluZy9yZWxheGluZyBwYXNzLiAgKi8KLSAgY29udGVudHMgPSBOVUxMOwotICBleHRzeW1zID0gTlVMTDsKLSAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgotICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKLSAgICAgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogV2FsayB0aHJvdWdoIHRoZW0gbG9va2luZyBmb3IgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzeW12YWw7Ci0gICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotCi0gICAgICAvKiBJZiB0aGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZWxheGVkLCB0aGVuIGlnbm9yZQotCSB0aGlzIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX05PTkUKLQkgIHx8IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfOAotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF9NQVgpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0JICBhc2VjdGlvbiAqc3ltX3NlYyA9IE5VTEw7Ci0JICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgIGNoYXIgKm5ld19uYW1lOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIHN5bV9zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaXN5bS5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0JICAKLQkgIHN5bXZhbCA9IChpc3ltLnN0X3ZhbHVlCi0JCSAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldCk7Ci0JICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsCi0JCQkJCQkgICAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJICAgICAgaXN5bS5zdF9uYW1lKTsKLQotCSAgLyogVGFjayBvbiBhbiBJRCBzbyB3ZSBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcwotCSAgICAgbG9jYWwgc3ltYm9sIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0JICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCSAgaWYgKG5ld19uYW1lID09IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JICBzeW1fbmFtZSA9IG5ld19uYW1lOwotCi0JICBoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQllbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCSAgICAgIHN5bV9uYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkgIGZyZWUgKG5ld19uYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JICAvKiBBbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCSAgaW5keCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCShlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF0pOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gCQlzeW1ib2wuICBKdXN0IGlnbm9yZSBpdC0taXQgd2lsbCBiZSBjYXVnaHQgYnkgdGhlCi0gCQlyZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJICAgICsgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLQotICAgICAgLyogRm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nLCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzLCB0aGUgc2VjdGlvbiByZWxvY3MsIGFuZCB0aGUgQkZEIHN5bWJvbCB0YWJsZS4gIFdlCi0JIG11c3QgdGVsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBub3QgdG8gZnJlZSB1cCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaW5zdGVhZCBjcmVhdGUgYSB0YWJsZQotCSBvZiBjaGFuZ2VzIHdoaWNoIGhhdmUgdG8gYmUgbWFkZSwgYXMgaXMgZG9uZSBpbiBjb2ZmLW1pcHMuYzsKLQkgdGhhdCB3b3VsZCBiZSBtb3JlIHdvcmssIGJ1dCB3b3VsZCByZXF1aXJlIGxlc3MgbWVtb3J5IHdoZW4KLQkgdGhlIGxpbmtlciBpcyBydW4uICAqLwotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDMyYml0IHBjLXJlbGF0aXZlIGJyYW5jaC9jYWxsIGludG8gYSAxNmJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2gvY2FsbCwgYWxzbyBkZWFsIHdpdGggImNhbGwiIC0+ICJjYWxscyIgY29udmVyc2lvbnMgYW5kCi0JIGluc2VydGlvbiBvZiBwcm9sb2d1ZSBkYXRhIGludG8gImNhbGwiIGluc3RydWN0aW9ucy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF9QQ1JFTDMyKQotCXsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0KLQkgIC8qIElmIHdlJ3ZlIGdvdCBhICJjYWxsIiBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHR1cm5lZAotCSAgICAgaW50byBhICJjYWxscyIgaW5zdHJ1Y3Rpb24sIGRvIHNvIG5vdy4gIEl0IHNhdmVzIGEgYnl0ZS4gICovCi0JICBpZiAoaCAmJiAoaC0+ZmxhZ3MgJiBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHdlJ3JlIHdvcmtpbmcgd2l0aCBhICJjYWxsIiBpbnN0cnVjdGlvbiEgICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhkZCkKLQkJewotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsCi0JCSAgICAgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmMsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmYsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCi0JCSAgLyogRml4IGlyZWwtPnJfb2Zmc2V0IGFuZCBpcmVsLT5yX2FkZGVuZC4gICovCi0JCSAgaXJlbC0+cl9vZmZzZXQgKz0gMTsKLQkJICBpcmVsLT5yX2FkZGVuZCArPSAxOwotCi0JCSAgLyogRGVsZXRlIG9uZSBieXRlIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAzLCAxKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaCkKLQkgICAgewotCSAgICAgIC8qIFdlJ3ZlIGdvdCBhICJjYWxsIiBpbnN0cnVjdGlvbiB3aGljaCBuZWVkcyBzb21lIGRhdGEKLQkJIGZyb20gdGFyZ2V0IGZ1bmN0aW9uIGZpbGxlZCBpbi4gICovCi0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIEluc2VydCBkYXRhIGZyb20gdGhlIHRhcmdldCBmdW5jdGlvbiBpbnRvIHRoZSAiY2FsbCIKLQkJIGluc3RydWN0aW9uIGlmIG5lZWRlZC4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhkZCkKLQkJewotCQkgIGJmZF9wdXRfOCAoYWJmZCwgaC0+bW92bV9hcmdzLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgNCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBoLT5zdGFja19zaXplICsgaC0+bW92bV9zdGFja19zaXplLAotCQkJICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgNSk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IGlyZWwtPnJfb2Zmc2V0OwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gMTYgYml0cywgbm90ZSB0aGUgaGlnaCB2YWx1ZSBpcwotCSAgICAgMHg3ZmZmICsgMiBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgdHdvIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKLQkgICAgIGFibGUgdG8gcmVsYXguICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MDAxICYmIChsb25nKXZhbHVlID4gLTB4ODAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGRjICYmIGNvZGUgIT0gMHhkZCAmJiBjb2RlICE9IDB4ZmYpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGRjKQotCQliZmRfcHV0XzggKGFiZmQsIDB4Y2MsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkgICAgICBlbHNlIGlmIChjb2RlID09IDB4ZGQpCi0JCWJmZF9wdXRfOCAoYWJmZCwgMHhjZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHhmZikKLQkJYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX01OMTAzMDBfUENSRUwxNik7Ci0KLQkgICAgICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCSAgICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICBpcmVsLT5yX29mZnNldCArIDEsIDIpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMTZiaXQgcGMtcmVsYXRpdmUgYnJhbmNoIGludG8gYSA4Yml0IHBjLXJlbGF0aXZlCi0JIGJyYW5jaC4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF9QQ1JFTDE2KQotCXsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0KLQkgIC8qIElmIHdlJ3ZlIGdvdCBhICJjYWxsIiBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHR1cm5lZAotCSAgICAgaW50byBhICJjYWxscyIgaW5zdHJ1Y3Rpb24sIGRvIHNvIG5vdy4gIEl0IHNhdmVzIGEgYnl0ZS4gICovCi0JICBpZiAoaCAmJiAoaC0+ZmxhZ3MgJiBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHdlJ3JlIHdvcmtpbmcgd2l0aCBhICJjYWxsIiBpbnN0cnVjdGlvbiEgICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhjZCkKLQkJewotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsCi0JCSAgICAgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmYsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCi0JCSAgLyogRml4IGlyZWwtPnJfb2Zmc2V0IGFuZCBpcmVsLT5yX2FkZGVuZC4gICovCi0JCSAgaXJlbC0+cl9vZmZzZXQgKz0gMTsKLQkJICBpcmVsLT5yX2FkZGVuZCArPSAxOwotCi0JCSAgLyogRGVsZXRlIG9uZSBieXRlIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAxKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBJbnNlcnQgZGF0YSBmcm9tIHRoZSB0YXJnZXQgZnVuY3Rpb24gaW50byB0aGUgImNhbGwiCi0JCSBpbnN0cnVjdGlvbiBpZiBuZWVkZWQuICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4Y2QpCi0JCXsKLQkJICBiZmRfcHV0XzggKGFiZmQsIGgtPm1vdm1fYXJncywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDIpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgaC0+c3RhY2tfc2l6ZSArIGgtPm1vdm1fc3RhY2tfc2l6ZSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDMpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLwotCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSAtPSBpcmVsLT5yX29mZnNldDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDggYml0cywgbm90ZSB0aGUgaGlnaCB2YWx1ZSBpcwotCSAgICAgMHg3ZiArIDEgYXMgdGhlIHRhcmdldCB3aWxsIGJlIG9uZSBieXRlcyBjbG9zZXIgaWYgd2UgYXJlCi0JICAgICBhYmxlIHRvIHJlbGF4LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4ODAgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGNjKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgYmZkX3B1dF84IChhYmZkLCAweGNhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkgICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICBSX01OMTAzMDBfUENSRUw4KTsKLQotCSAgICAgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAxKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gZWxpbWluYXRlIGFuIHVuY29uZGl0aW9uYWwgOCBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoCi0JIHdoaWNoIGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBjb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2ggYXJvdW5kIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KLQotCSAgICBvcmlnaW5hbDoJCW5ldzoKLQkgICAgYkNDIGxhYjEJCWJDQycgbGFiMgotCSAgICBicmEgbGFiMgotCSAgIGxhYjE6CSAgICAgICBsYWIxOgotCi0KLQkgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGJDQyBjYW4ndCByZWFjaCBsYWIyIGF0IGFzc2VtYmx5IHRpbWUsCi0JIGJ1dCBkdWUgdG8gb3RoZXIgcmVsYXhhdGlvbnMgaXQgY2FuIHJlYWNoIGF0IGxpbmsgdGltZS4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF9QQ1JFTDgpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKm5yZWw7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCSAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IGlyZWwtPnJfb2Zmc2V0OwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIERvIG5vdGhpbmcgaWYgdGhpcyByZWxvYyBpcyB0aGUgbGFzdCBieXRlIGluIHRoZSBzZWN0aW9uLiAgKi8KLQkgIGlmIChpcmVsLT5yX29mZnNldCA9PSBzZWMtPl9jb29rZWRfc2l6ZSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhbiB1bmNvbmRpdGlvbmFsIHBjLXJlbGF0aXZlCi0JICAgICBicmFuY2gsIG1vcmUgb2Z0ZW4gdGhhbiBub3QgdGhpcyB0ZXN0IHdpbGwgZmFpbCwgc28gd2UKLQkgICAgIHRlc3QgaXQgZmlyc3QgdG8gc3BlZWQgdGhpbmdzIHVwLiAgKi8KLQkgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAxKTsKLQkgIGlmIChjb2RlICE9IDB4Y2EpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBBbHNvIG1ha2Ugc3VyZSB0aGUgbmV4dCByZWxvY2F0aW9uIGFwcGxpZXMgdG8gdGhlIG5leHQKLQkgICAgIGluc3RydWN0aW9uIGFuZCB0aGF0IGl0J3MgYSBwYy1yZWxhdGl2ZSA4IGJpdCBicmFuY2guICAqLwotCSAgbnJlbCA9IGlyZWwgKyAxOwotCSAgaWYgKG5yZWwgPT0gaXJlbGVuZAotCSAgICAgIHx8IGlyZWwtPnJfb2Zmc2V0ICsgMiAhPSBucmVsLT5yX29mZnNldAotCSAgICAgIHx8IEVMRjMyX1JfVFlQRSAobnJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX01OMTAzMDBfUENSRUw4KQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTWFrZSBzdXJlIG91ciBkZXN0aW5hdGlvbiBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZQotCSAgICAgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotCSAgaWYgKHN5bXZhbCAhPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgKyBpcmVsLT5yX29mZnNldCArIDMpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTm93IG1ha2Ugc3VyZSB3ZSBhcmUgYSBjb25kaXRpb25hbCBicmFuY2guICBUaGlzIG1heSBub3QKLQkgICAgIGJlIG5lY2Vzc2FyeSwgYnV0IHdoeSB0YWtlIHRoZSBjaGFuY2UuCi0KLQkgICAgIE5vdGUgdGhlc2UgY2hlY2tzIGFzc3VtZSB0aGF0IFJfTU4xMDMwMF9QQ1JFTDggcmVsb2NzCi0JICAgICBvbmx5IG9jY3VyIG9uIGJDQyBhbmQgYkNDeCBpbnNucy4gIElmIHRoZXkgb2NjdXJlZAotCSAgICAgZWxzZXdoZXJlLCB3ZSdkIG5lZWQgdG8ga25vdyB0aGUgc3RhcnQgb2YgdGhpcyBpbnNuCi0JICAgICBmb3IgdGhpcyBjaGVjayB0byBiZSBhY2N1cmF0ZS4gICovCi0JICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICBpZiAoY29kZSAhPSAweGMwICYmIGNvZGUgIT0gMHhjMSAmJiBjb2RlICE9IDB4YzIKLQkgICAgICAmJiBjb2RlICE9IDB4YzMgJiYgY29kZSAhPSAweGM0ICYmIGNvZGUgIT0gMHhjNQotCSAgICAgICYmIGNvZGUgIT0gMHhjNiAmJiBjb2RlICE9IDB4YzcgJiYgY29kZSAhPSAweGM4Ci0JICAgICAgJiYgY29kZSAhPSAweGM5ICYmIGNvZGUgIT0gMHhlOCAmJiBjb2RlICE9IDB4ZTkKLQkgICAgICAmJiBjb2RlICE9IDB4ZWEgJiYgY29kZSAhPSAweGViKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogV2UgYWxzbyBoYXZlIHRvIGJlIHN1cmUgdGhlcmUgaXMgbm8gc3ltYm9sL2xhYmVsCi0JICAgICBhdCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotCSAgaWYgKG1uMTAzMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIHNlYywgZXh0c3ltcywKLQkJCQkJICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0JICBzd2l0Y2ggKGNvZGUpCi0JICAgIHsKLQkgICAgICBjYXNlIDB4Yzg6Ci0JCWNvZGUgPSAweGM5OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4Yzk6Ci0JCWNvZGUgPSAweGM4OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4YzA6Ci0JCWNvZGUgPSAweGMyOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4YzI6Ci0JCWNvZGUgPSAweGMwOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4YzM6Ci0JCWNvZGUgPSAweGMxOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4YzE6Ci0JCWNvZGUgPSAweGMzOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4YzQ6Ci0JCWNvZGUgPSAweGM2OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4YzY6Ci0JCWNvZGUgPSAweGM0OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4Yzc6Ci0JCWNvZGUgPSAweGM1OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4YzU6Ci0JCWNvZGUgPSAweGM3OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTg6Ci0JCWNvZGUgPSAweGU5OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4OWQ6Ci0JCWNvZGUgPSAweGU4OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWE6Ci0JCWNvZGUgPSAweGViOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWI6Ci0JCWNvZGUgPSAweGVhOwotCQlicmVhazsKLQkgICAgfQotCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgIC8qIFNldCB0aGUgcmVsb2MgdHlwZSBhbmQgc3ltYm9sIGZvciB0aGUgZmlyc3QgYnJhbmNoCi0JICAgICBmcm9tIHRoZSBzZWNvbmQgYnJhbmNoLiAgKi8KLQkgIGlyZWwtPnJfaW5mbyA9IG5yZWwtPnJfaW5mbzsKLQotCSAgLyogTWFrZSB0aGUgcmVsb2MgZm9yIHRoZSBzZWNvbmQgYnJhbmNoIGEgbnVsbCByZWxvYy4gICovCi0JICBucmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAotCQkJCSAgICAgICBSX01OMTAzMDBfTk9ORSk7Ci0KLQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgKmFnYWluID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMjQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcwotCSBpbnRvIGEgOCBpbW1lZGlhdGUsIGRpc3BsYWNlbWVudCBvciBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwXzI0KQotCXsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiA4IGJpdHMuICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg3ZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogQU0zMyBpbnNucyB3aGljaCBoYXZlIDI0IG9wZXJhbmRzIGFyZSA2IGJ5dGVzIGxvbmcgYW5kCi0JCSB3aWxsIGhhdmUgMHhmZCBhcyB0aGUgZmlyc3QgYnl0ZS4gICovCi0KLQkgICAgICAvKiBHZXQgdGhlIGZpcnN0IG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDMpOwotCi0JICAgICAgaWYgKGNvZGUgPT0gMHhmZCkKLQkJewotCSAgICAgICAgICAvKiBHZXQgdGhlIHNlY29uZCBvcGNvZGUuICAqLwotCSAgICAgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICAvKiBXZSBjYW4gbm90IHJlbGF4IDB4NmIsIDB4N2IsIDB4OGIsIDB4OWIgYXMgbm8gMjRiaXQKLQkJICAgICBlcXVpdmFsZW50IGluc3RydWN0aW9ucyBleGlzdHMuICAqLwotCSAgICAgICAgICBpZiAoY29kZSAhPSAweDZiICYmIGNvZGUgIT0gMHg3YgotCQkgICAgICAmJiBjb2RlICE9IDB4OGIgJiYgY29kZSAhPSAweDliCi0JCSAgICAgICYmICgoY29kZSAmIDB4MGYpID09IDB4MDkgfHwgKGNvZGUgJiAweDBmKSA9PSAweDA4Ci0JCQkgIHx8IChjb2RlICYgMHgwZikgPT0gMHgwYSB8fCAoY29kZSAmIDB4MGYpID09IDB4MGIKLQkJCSAgfHwgKGNvZGUgJiAweDBmKSA9PSAweDBlKSkKLQkJICAgIHsKLQkJICAgICAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQotCQkgICAgICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgICAgICBpbiBhIHNpZ25lZCA4Yml0IHZhbHVlLiAgVGhpcyBpcyBjdXJyZW50bHkgb3ZlcgotCQkgICAgICAgICBjb25zZXJ2YXRpdmUuICAqLwotCQkgICAgICBpZiAoKHZhbHVlICYgMHg4MCkgPT0gMCkKLQkJCXsKLQkJCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsCi0JCQkgICAgIGV0Yy4gICovCi0JCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmIsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAzKTsKLQkJCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCQkgIGlyZWwtPnJfaW5mbwotCQkJICAgID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSAgICAgICAgIFJfTU4xMDMwMF84KTsKLQotCQkJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDEsIDIpKQotCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4Ci0JCQkgICAgIGFnYWluLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQKLQkJCSAgICAgIG1heSBiZSBzbG93LiAgKi8KLQkJCSAgKmFnYWluID0gdHJ1ZTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDMyYml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MKLQkgaW50byBhIDE2Yml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfMzIpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDI0IGJpdHMuCi0JICAgICBXZSBhbGxvdyBhbnkgMTZiaXQgbWF0Y2ggaGVyZS4gIFdlIHBydW5lIHRob3NlIHdlIGNhbid0Ci0JICAgICBoYW5kbGUgYmVsb3cuICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg3ZmZmZmYgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBBTTMzIGluc25zIHdoaWNoIGhhdmUgMzJiaXQgb3BlcmFuZHMgYXJlIDcgYnl0ZXMgbG9uZyBhbmQKLQkJIHdpbGwgaGF2ZSAweGZlIGFzIHRoZSBmaXJzdCBieXRlLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMyk7Ci0KLQkgICAgICBpZiAoY29kZSA9PSAweGZlKQotCQl7Ci0JICAgICAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIC8qIEFsbCB0aGUgYW0zMyAzMiAtPiAyNCByZWxheGluZyBwb3NzaWJpbGl0aWVzLiAgKi8KLQkJICAvKiBXZSBjYW4gbm90IHJlbGF4IDB4NmIsIDB4N2IsIDB4OGIsIDB4OWIgYXMgbm8gMjRiaXQKLQkJICAgICBlcXVpdmFsZW50IGluc3RydWN0aW9ucyBleGlzdHMuICAqLwotCSAgICAgICAgICBpZiAoY29kZSAhPSAweDZiICYmIGNvZGUgIT0gMHg3YgotCQkgICAgICAmJiBjb2RlICE9IDB4OGIgJiYgY29kZSAhPSAweDliCi0JCSAgICAgICYmICgoY29kZSAmIDB4MGYpID09IDB4MDkgfHwgKGNvZGUgJiAweDBmKSA9PSAweDA4Ci0JCQkgIHx8IChjb2RlICYgMHgwZikgPT0gMHgwYSB8fCAoY29kZSAmIDB4MGYpID09IDB4MGIKLQkJCSAgfHwgKGNvZGUgJiAweDBmKSA9PSAweDBlKSkKLQkJICAgIHsKLQkJICAgICAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQotCQkgICAgICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gIFRoaXMgaXMgY3VycmVudGx5IG92ZXIKLQkJICAgICAgICAgY29uc2VydmF0aXZlLiAgKi8KLQkJICAgICAgaWYgKCh2YWx1ZSAmIDB4ODAwMCkgPT0gMCkKLQkJCXsKLQkJCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsCi0JCQkgICAgIGV0Yy4gICovCi0JCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAzKTsKLQkJCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCQkgIGlyZWwtPnJfaW5mbwotCQkJICAgID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSAgICAgICAgIFJfTU4xMDMwMF8yNCk7Ci0KLQkJCSAgLyogRGVsZXRlIG9uZSBieXRlIG9mIGRhdGEuICAqLwotCQkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDMsIDEpKQotCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4Ci0JCQkgICAgIGFnYWluLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQKLQkJCSAgICAgIG1heSBiZSBzbG93LiAgKi8KLQkJCSAgKmFnYWluID0gdHJ1ZTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gMTYgYml0cy4KLQkgICAgIFdlIGFsbG93IGFueSAxNmJpdCBtYXRjaCBoZXJlLiAgV2UgcHJ1bmUgdGhvc2Ugd2UgY2FuJ3QKLQkgICAgIGhhbmRsZSBiZWxvdy4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDdmZmYgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogTW9zdCBpbnNucyB3aGljaCBoYXZlIDMyYml0IG9wZXJhbmRzIGFyZSA2IGJ5dGVzIGxvbmc7Ci0JCSBleGNlcHRpb25zIGFyZSBwY3JlbCBpbnNucyBhbmQgYml0IGluc25zLgotCi0JCSBXZSBoYW5kbGUgcGNyZWwgaW5zbnMgYWJvdmUuICBXZSBkb24ndCBib3RoZXIgdHJ5aW5nCi0JCSB0byBoYW5kbGUgdGhlIGJpdCBpbnNucyBoZXJlLgotCi0JCSBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVtYWluaW5nIGluc25zIHdpbGwgYmUgMHhmYy4gICovCi0KLQkgICAgICAvKiBHZXQgdGhlIGZpcnN0IG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhmYykKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIHNlY29uZCBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmICgoY29kZSAmIDB4ZjApIDwgMHg4MCkKLQkJc3dpdGNoIChjb2RlICYgMHhmMCkKLQkJICB7Ci0JCSAgLyogbW92IChkMzIsYW0pLGRuICAgLT4gbW92IChkMzIsYW0pLGRuCi0JCSAgICAgbW92IGRtLChkMzIsYW0pICAgLT4gbW92IGRuLChkMzIsYW0pCi0JCSAgICAgbW92IChkMzIsYW0pLGFuICAgLT4gbW92IChkMzIsYW0pLGFuCi0JCSAgICAgbW92IGRtLChkMzIsYW0pICAgLT4gbW92IGRuLChkMzIsYW0pCi0JCSAgICAgbW92YnUgKGQzMixhbSksZG4gLT4gbW92YnUgKGQzMixhbSksZG4KLQkJICAgICBtb3ZidSBkbSwoZDMyLGFtKSAtPiBtb3ZidSBkbiwoZDMyLGFtKQotCQkgICAgIG1vdmh1IChkMzIsYW0pLGRuIC0+IG1vdmh1IChkMzIsYW0pLGRuCi0JCSAgICAgbW92aHUgZG0sKGQzMixhbSkgLT4gbW92aHUgZG4sKGQzMixhbSkgKi8KLQkJICBjYXNlIDB4MDA6Ci0JCSAgY2FzZSAweDEwOgotCQkgIGNhc2UgMHgyMDoKLQkJICBjYXNlIDB4MzA6Ci0JCSAgY2FzZSAweDQwOgotCQkgIGNhc2UgMHg1MDoKLQkJICBjYXNlIDB4NjA6Ci0JCSAgY2FzZSAweDcwOgotCQkgICAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQotCQkgICAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgKi8KLQkJICAgIGlmIChjb2RlID09IDB4Y2MKLQkJCSYmICh2YWx1ZSAmIDB4ODAwMCkpCi0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgICAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDIsIDIpKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIGVsc2UgaWYgKChjb2RlICYgMHhmMCkgPT0gMHg4MAotCQkgICAgICAgfHwgKGNvZGUgJiAweGYwKSA9PSAweDkwKQotCQlzd2l0Y2ggKGNvZGUgJiAweGYzKQotCQkgIHsKLQkJICAvKiBtb3YgZG4sKGFiczMyKSAgIC0+IG1vdiBkbiwoYWJzMTYpCi0JCSAgICAgbW92YnUgZG4sKGFiczMyKSAtPiBtb3ZidSBkbiwoYWJzMTYpCi0JCSAgICAgbW92aHUgZG4sKGFiczMyKSAtPiBtb3ZodSBkbiwoYWJzMTYpICAqLwotCQkgIGNhc2UgMHg4MToKLQkJICBjYXNlIDB4ODI6Ci0JCSAgY2FzZSAweDgzOgotCQkgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgIGlmICgoY29kZSAmIDB4ZjMpID09IDB4ODEpCi0JCSAgICAgIGNvZGUgPSAweDAxICsgKGNvZGUgJiAweDBjKTsKLQkJICAgIGVsc2UgaWYgKChjb2RlICYgMHhmMykgPT0gMHg4MikKLQkJICAgICAgY29kZSA9IDB4MDIgKyAoY29kZSAmIDB4MGMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYzKSA9PSAweDgzKQotCQkgICAgICBjb2RlID0gMHgwMyArIChjb2RlICYgMHgwYyk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGFib3J0ICgpOwotCi0JCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUKLQkJICAgICAgIGFkZGVuZCBhbmQgb2Zmc2V0IHRvbyEgICovCi0JCSAgICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgICAvKiBEZWxldGUgdGhyZWUgYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDEsIDMpKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0KLQkJICAvKiBtb3YgYW0sKGFiczMyKSAgICAtPiBtb3YgYW0sKGFiczE2KQotCQkgICAgIG1vdiBhbSwoZDMyLHNwKSAgIC0+IG1vdiBhbSwoZDE2LHNwKQotCQkgICAgIG1vdiBkbSwoZDMyLHNwKSAgIC0+IG1vdiBkbSwoZDMyLHNwKQotCQkgICAgIG1vdmJ1IGRtLChkMzIsc3ApIC0+IG1vdmJ1IGRtLChkMzIsc3ApCi0JCSAgICAgbW92aHUgZG0sKGQzMixzcCkgLT4gbW92aHUgZG0sKGQzMixzcCkgKi8KLQkJICBjYXNlIDB4ODA6Ci0JCSAgY2FzZSAweDkwOgotCQkgIGNhc2UgMHg5MToKLQkJICBjYXNlIDB4OTI6Ci0JCSAgY2FzZSAweDkzOgotCQkgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSBSX01OMTAzMDBfMTYpOwotCi0JCSAgICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCQkgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICBlbHNlIGlmICgoY29kZSAmIDB4ZjApIDwgMHhmMCkKLQkJc3dpdGNoIChjb2RlICYgMHhmYykKLQkJICB7Ci0JCSAgLyogbW92IGltbTMyLGRuICAgICAtPiBtb3YgaW1tMTYsZG4KLQkJICAgICBtb3YgaW1tMzIsYW4gICAgIC0+IG1vdiBpbW0xNixhbgotCQkgICAgIG1vdiAoYWJzMzIpLGRuICAgLT4gbW92IChhYnMxNiksZG4KLQkJICAgICBtb3ZidSAoYWJzMzIpLGRuIC0+IG1vdmJ1IChhYnMxNiksZG4KLQkJICAgICBtb3ZodSAoYWJzMzIpLGRuIC0+IG1vdmh1IChhYnMxNiksZG4gICovCi0JCSAgY2FzZSAweGNjOgotCQkgIGNhc2UgMHhkYzoKLQkJICBjYXNlIDB4YTQ6Ci0JCSAgY2FzZSAweGE4OgotCQkgIGNhc2UgMHhhYzoKLQkJICAgIC8qIE5vdCBzYWZlIGlmIHRoZSBoaWdoIGJpdCBpcyBvbiBhcyByZWxheGluZyBtYXkKLQkJICAgICAgIG1vdmUgdGhlIHZhbHVlIG91dCBvZiBoaWdoIG1lbSBhbmQgdGh1cyBub3QgZml0Ci0JCSAgICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gICovCi0JCSAgICBpZiAoY29kZSA9PSAweGNjCi0JCQkmJiAodmFsdWUgJiAweDgwMDApKQotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgIGlmICgoY29kZSAmIDB4ZmMpID09IDB4Y2MpCi0JCSAgICAgIGNvZGUgPSAweDJjICsgKGNvZGUgJiAweDAzKTsKLQkJICAgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhkYykKLQkJICAgICAgY29kZSA9IDB4MjQgKyAoY29kZSAmIDB4MDMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGE0KQotCQkgICAgICBjb2RlID0gMHgzMCArIChjb2RlICYgMHgwMyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4YTgpCi0JCSAgICAgIGNvZGUgPSAweDM0ICsgKGNvZGUgJiAweDAzKTsKLQkJICAgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhhYykKLQkJICAgICAgY29kZSA9IDB4MzggKyAoY29kZSAmIDB4MDMpOwotCQkgICAgZWxzZQotCQkgICAgICBhYm9ydCAoKTsKLQotCQkgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSBSX01OMTAzMDBfMTYpOwotCi0JCSAgICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlCi0JCSAgICAgICBhZGRlbmQgYW5kIG9mZnNldCB0b28hICAqLwotCQkgICAgaXJlbC0+cl9vZmZzZXQgLT0gMTsKLQotCQkgICAgLyogRGVsZXRlIHRocmVlIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCQkgaXJlbC0+cl9vZmZzZXQgKyAxLCAzKSkKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIGJyZWFrOwotCi0JCSAgLyogbW92IChhYnMzMiksYW4gICAgLT4gbW92IChhYnMxNiksYW4KLQkJICAgICBtb3YgKGQzMixzcCksYW4gICAtPiBtb3YgKGQzMixzcCksYW4KLQkJICAgICBtb3YgKGQzMixzcCksZG4gICAtPiBtb3YgKGQzMixzcCksZG4KLQkJICAgICBtb3ZidSAoZDMyLHNwKSxkbiAtPiBtb3ZidSAoZDMyLHNwKSxkbgotCQkgICAgIG1vdmh1IChkMzIsc3ApLGRuIC0+IG1vdmh1IChkMzIsc3ApLGRuCi0JCSAgICAgYWRkIGltbTMyLGRuICAgICAgLT4gYWRkIGltbTE2LGRuCi0JCSAgICAgY21wIGltbTMyLGRuICAgICAgLT4gY21wIGltbTE2LGRuCi0JCSAgICAgYWRkIGltbTMyLGFuICAgICAgLT4gYWRkIGltbTE2LGFuCi0JCSAgICAgY21wIGltbTMyLGFuICAgICAgLT4gY21wIGltbTE2LGFuCi0JCSAgICAgYW5kIGltbTMyLGRuICAgICAgLT4gYW5kIGltbTMyLGRuCi0JCSAgICAgb3IgaW1tMzIsZG4gICAgICAgLT4gb3IgaW1tMzIsZG4KLQkJICAgICB4b3IgaW1tMzIsZG4gICAgICAtPiB4b3IgaW1tMzIsZG4KLQkJICAgICBidHN0IGltbTMyLGRuICAgICAtPiBidHN0IGltbTMyLGRuICovCi0KLQkJICBjYXNlIDB4YTA6Ci0JCSAgY2FzZSAweGIwOgotCQkgIGNhc2UgMHhiMToKLQkJICBjYXNlIDB4YjI6Ci0JCSAgY2FzZSAweGIzOgotCQkgIGNhc2UgMHhjMDoKLQkJICBjYXNlIDB4Yzg6Ci0KLQkJICBjYXNlIDB4ZDA6Ci0JCSAgY2FzZSAweGQ4OgotCQkgIGNhc2UgMHhlMDoKLQkJICBjYXNlIDB4ZTE6Ci0JCSAgY2FzZSAweGUyOgotCQkgIGNhc2UgMHhlMzoKLQkJICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMikpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGZlKQotCQl7Ci0JCSAgLyogYWRkIGltbTMyLHNwIC0+IGFkZCBpbW0xNixzcCAgKi8KLQotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSBSX01OMTAzMDBfMTYpOwotCi0JCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQl9Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDb21wdXRlIHRoZSBzdGFjayBzaXplIGFuZCBtb3ZtIGFyZ3VtZW50cyBmb3IgdGhlIGZ1bmN0aW9uCi0gICByZWZlcnJlZCB0byBieSBIQVNIIGF0IGFkZHJlc3MgQUREUiBpbiBzZWN0aW9uIHdpdGgKLSAgIGNvbnRlbnRzIENPTlRFTlRTLCBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHZvaWQKLWNvbXB1dGVfZnVuY3Rpb25faW5mbyAoYWJmZCwgaGFzaCwgYWRkciwgY29udGVudHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotewotICB1bnNpZ25lZCBjaGFyIGJ5dGUxLCBieXRlMjsKLSAgLyogV2Ugb25seSBjYXJlIGFib3V0IGEgdmVyeSBzbWFsbCBzdWJzZXQgb2YgdGhlIHBvc3NpYmxlIHByb2xvZ3VlCi0gICAgIHNlcXVlbmNlcyBoZXJlLiAgQmFzaWNhbGx5IHdlIGxvb2sgZm9yOgotCi0gICAgIG1vdm0gW2QyLGQzLGEyLGEzXSxzcCAob3B0aW9uYWwpCi0gICAgIGFkZCA8c2l6ZT4sc3AgKG9wdGlvbmFsLCBhbmQgb25seSBmb3Igc2l6ZXMgd2hpY2ggZml0IGluIGFuIHVuc2lnbmVkCi0JCSAgICA4IGJpdCBudW1iZXIpCi0KLSAgICAgSWYgd2UgZmluZCBhbnl0aGluZyBlbHNlLCB3ZSBxdWl0LiAgKi8KLQotICAvKiBMb29rIGZvciBtb3ZtIFtyZWdzXSxzcCAqLwotICBieXRlMSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKLSAgYnl0ZTIgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDEpOwotCi0gIGlmIChieXRlMSA9PSAweGNmKQotICAgIHsKLSAgICAgIGhhc2gtPm1vdm1fYXJncyA9IGJ5dGUyOwotICAgICAgYWRkciArPSAyOwotICAgICAgYnl0ZTEgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgYWRkcik7Ci0gICAgICBieXRlMiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMSk7Ci0gICAgfQotCi0gIC8qIE5vdyBmaWd1cmUgb3V0IGhvdyBtdWNoIHN0YWNrIHNwYWNlIHdpbGwgYmUgYWxsb2NhdGVkIGJ5IHRoZSBtb3ZtCi0gICAgIGluc3RydWN0aW9uLiAgV2UgbmVlZCB0aGlzIGtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgZnVudGlvbidzIG5vcm1hbAotICAgICBzdGFjayBzcGFjZS4gICovCi0gIGlmIChoYXNoLT5tb3ZtX2FyZ3MpCi0gICAgewotICAgICAgLyogU3BhY2UgZm9yIGQyLiAgKi8KLSAgICAgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDgwKQotCWhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA0OwotCi0gICAgICAvKiBTcGFjZSBmb3IgZDMuICAqLwotICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4NDApCi0JaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFNwYWNlIGZvciBhMi4gICovCi0gICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgyMCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNDsKLQotICAgICAgLyogU3BhY2UgZm9yIGEzLiAgKi8KLSAgICAgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDEwKQotCWhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA0OwotCi0gICAgICAvKiAib3RoZXIiIHNwYWNlLiAgZDAsIGQxLCBhMCwgYTEsIG1kciwgbGlyLCBsYXIsIDQgYnl0ZSBwYWQuICAqLwotICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4MDgpCi0JaGFzaC0+bW92bV9zdGFja19zaXplICs9IDggKiA0OwotCi0gICAgICBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9hbTMzKQotCXsKLQkgIC8qICJleG90aGVyIiBzcGFjZS4gIGUwLCBlMSwgbWRycSwgbWNyaCwgbWNybCwgbWN2ZiAqLwotCSAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4MSkKLQkgICAgaGFzaC0+bW92bV9zdGFja19zaXplICs9IDYgKiA0OwotCi0JICAvKiBleHJlZzEgc3BhY2UuICBlNCwgZTUsIGU2LCBlNyAqLwotCSAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4MikKLQkgICAgaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQgKiA0OwotCi0JICAvKiBleHJlZzAgc3BhY2UuICBlMiwgZTMgICovCi0JICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHg0KQotCSAgICBoYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gMiAqIDQ7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgbG9vayBmb3IgdGhlIHR3byBzdGFjayBhZGp1c3RtZW50IHZhcmlhbnRzLiAgKi8KLSAgaWYgKGJ5dGUxID09IDB4ZjggJiYgYnl0ZTIgPT0gMHhmZSkKLSAgICB7Ci0gICAgICBpbnQgdGVtcCA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMik7Ci0gICAgICB0ZW1wID0gKCh0ZW1wICYgMHhmZikgXiAofjB4N2YpKSArIDB4ODA7Ci0KLSAgICAgIGhhc2gtPnN0YWNrX3NpemUgPSAtdGVtcDsKLSAgICB9Ci0gIGVsc2UgaWYgKGJ5dGUxID09IDB4ZmEgJiYgYnl0ZTIgPT0gMHhmZSkKLSAgICB7Ci0gICAgICBpbnQgdGVtcCA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOwotICAgICAgdGVtcCA9ICgodGVtcCAmIDB4ZmZmZikgXiAofjB4N2ZmZikpICsgMHg4MDAwOwotICAgICAgdGVtcCA9IC10ZW1wOwotCi0gICAgICBpZiAodGVtcCA8IDI1NSkKLQloYXNoLT5zdGFja19zaXplID0gdGVtcDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIHRvdGFsIHN0YWNrIHRvIGJlIGFsbG9jYXRlZCBieSB0aGUgY2FsbCBpbnN0cnVjdGlvbiBpcyBtb3JlCi0gICAgIHRoYW4gMjU1IGJ5dGVzLCB0aGVuIHdlIGNhbid0IHJlbW92ZSB0aGUgc3RhY2sgYWRqdXN0bWVudCBieSB1c2luZwotICAgICAiY2FsbCIgKHdlIG1pZ2h0IHN0aWxsIGJlIGFibGUgdG8gcmVtb3ZlIHRoZSAibW92bSIgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoaGFzaC0+c3RhY2tfc2l6ZSArIGhhc2gtPm1vdm1fc3RhY2tfc2l6ZSA+IDI1NSkKLSAgICBoYXNoLT5zdGFja19zaXplID0gMDsKLQotICByZXR1cm47Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgaW50IHNobmR4LCBpbmRleDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0KLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsKLSAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOwotICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKLQotICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLwotICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBpZiAoKGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgICYmIGlyZWwtPnJfb2Zmc2V0IDwgdG9hZGRyKSkKLQlpcmVsLT5yX29mZnNldCAtPSBjb3VudDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSBsb2NhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPiBhZGRyCi0JICAmJiBpc3ltLnN0X3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0uc3RfdmFsdWUgLT0gY291bnQ7Ci0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmaXN5bSwgZXN5bSk7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYWRqdXN0IHRoZSBnbG9iYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpbmRleCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0gICAgICBzeW1faGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJICAgKGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmRleF0pOwotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmICgoc3ltX2hhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoc3ltX2hhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA+IGFkZHIKLQkgICYmIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgLT0gY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgYSBzeW1ib2wgZXhpc3RzIGF0IHRoZSBnaXZlbiBhZGRyZXNzLCBlbHNlIHJldHVybgotICAgZmFsc2UuICAqLwotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIHNlYywgZXh0c3ltcywgYWRkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIGludCBzaG5keDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2gsICoqc3ltX2hhc2hfZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgLyogRXhhbWluZSBhbGwgdGhlIHN5bWJvbHMuICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICBzeW1faGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiopKGVsZl9zeW1faGFzaGVzIChhYmZkKSk7Ci0gIHN5bV9oYXNoX2VuZCA9IChzeW1faGFzaAotCQkgICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkKLQkJICAgICAtIHN5bXRhYl9oZHItPnNoX2luZm8pKTsKLSAgZm9yICg7IHN5bV9oYXNoIDwgc3ltX2hhc2hfZW5kOyBzeW1faGFzaCsrKQotICAgIHsKLSAgICAgIGlmICgoKCpzeW1faGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoKnN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoKnN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlID09IGFkZHIpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLW1uMTAzMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQkgICAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmludGVybmFsX3N5bXMgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCi0gICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUKLSAgICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBtZW1jcHkgKGRhdGEsIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cywKLQkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0KLSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCWV4dGVybmFsX3N5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGV4dGVybmFsX3N5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpOwotCSAgaWYgKGV4dGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIHN5bXRhYl9oZHItPnNoX2luZm8sIGlucHV0X2JmZCkKLQkJICAhPSAoc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgZmFsc2UpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoRWxmX0ludGVybmFsX1N5bSAqKQotCQkgICAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSkpOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IGV4dGVybmFsX3N5bXM7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7ICsrZXN5bSwgKytpc3ltcCwgKytzZWNwcCkKLQl7Ci0JICBhc2VjdGlvbiAqaXNlYzsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW1wKTsKLQotCSAgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID4gMCAmJiBpc3ltcC0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdobyBrbm93cz8gICovCi0JICAgICAgaXNlYyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnNlY3BwID0gaXNlYzsKLQl9Ci0KLSAgICAgIGlmICghIG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBBc3NvcnRlZCBoYXNoIHRhYmxlIGZ1bmN0aW9ucy4gICovCi0KLS8qIEluaXRpYWxpemUgYW4gZW50cnkgaW4gdGhlIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhbiBNTjEwMzAwIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgcmV0LT5kaXJlY3RfY2FsbHMgPSAwOwotICAgICAgcmV0LT5zdGFja19zaXplID0gMDsKLSAgICAgIHJldC0+bW92bV9zdGFja19zaXplID0gMDsKLSAgICAgIHJldC0+ZmxhZ3MgPSAwOwotICAgICAgcmV0LT5tb3ZtX2FyZ3MgPSAwOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBtbjEwMzAwIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgIGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+ZmxhZ3MgPSAwOwotICByZXQtPnN0YXRpY19oYXNoX3RhYmxlCi0gICAgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKQotICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldC0+c3RhdGljX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgIGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQtPnN0YXRpY19oYXNoX3RhYmxlKTsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi1zdGF0aWMgaW50Ci1lbGZfbW4xMDMwMF9tYWNoIChmbGFncykKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIHN3aXRjaCAoZmxhZ3MgJiBFRl9NTjEwMzAwX01BQ0gpCi0gICAgewotICAgICAgY2FzZSBFX01OMTAzMDBfTUFDSF9NTjEwMzAwOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGJmZF9tYWNoX21uMTAzMDA7Ci0KLSAgICAgIGNhc2UgRV9NTjEwMzAwX01BQ0hfQU0zMzoKLSAgICAgICAgcmV0dXJuIGJmZF9tYWNoX2FtMzM7Ci0gICAgfQotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGEgTU4xMDMwMCBFTEYgb2JqZWN0Ci0gICBmaWxlLiAgVGhpcyBnZXRzIHRoZSBNTjEwMzAwIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZQotICAgbnVtYmVyLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1fYmZkX21uMTAzMDBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlciBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0gICAgewotICAgICAgZGVmYXVsdDoKLSAgICAgIGNhc2UgYmZkX21hY2hfbW4xMDMwMDoKLQl2YWwgPSBFX01OMTAzMDBfTUFDSF9NTjEwMzAwOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGJmZF9tYWNoX2FtMzM6Ci0JdmFsID0gRV9NTjEwMzAwX01BQ0hfQU0zMzsKLQlicmVhazsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfiAoRUZfTU4xMDMwMF9NQUNIKTsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi1ib29sZWFuCi1fYmZkX21uMTAzMDBfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX21uMTAzMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZl9tbjEwMzAwX21hY2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1ib29sZWFuCi1fYmZkX21uMTAzMDBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotICAgICAgJiYgYmZkX2dldF9tYWNoIChvYmZkKSA8IGJmZF9nZXRfbWFjaCAoaWJmZCkpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9tYWNoIChpYmZkKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfbW4xMDMwMF92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1tbjEwMzAwIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbW4xMDMwMAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19NTjEwMzAwCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCW1uMTAzMDBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCW1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJbW4xMDMwMF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQkJbW4xMDMwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0JCQkJZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0KLSNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCi0KLS8qIFNvIHdlIGNhbiBzZXQgYml0cyBpbiBlX2ZsYWdzLiAgKi8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9vYmplY3RfcAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZi5jIGIvYmZkL2VsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODMwZmYwLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDU1OTYgKzAsMCBAQAotLyogRUxGIGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLQotU0VDVElPTgotCUVMRiBiYWNrZW5kcwotCi0JQkZEIHN1cHBvcnQgZm9yIEVMRiBmb3JtYXRzIGlzIGJlaW5nIHdvcmtlZCBvbi4KLQlDdXJyZW50bHksIHRoZSBiZXN0IHN1cHBvcnRlZCBiYWNrIGVuZHMgYXJlIGZvciBzcGFyYyBhbmQgaTM4NgotCShydW5uaW5nIHN2cjQgb3IgU29sYXJpcyAyKS4KLQotCURvY3VtZW50YXRpb24gb2YgdGhlIGludGVybmFscyBvZiB0aGUgc3VwcG9ydCBjb2RlIHN0aWxsIG5lZWRzCi0JdG8gYmUgd3JpdHRlbi4gIFRoZSBjb2RlIGlzIGNoYW5naW5nIHF1aWNrbHkgZW5vdWdoIHRoYXQgd2UKLQloYXZlbid0IGJvdGhlcmVkIHlldC4KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2RlZmluZSBBUkNIX1NJWkUgMAotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotc3RhdGljIElOTElORSBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptYWtlX21hcHBpbmcKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICoqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gbWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGVsZl9zb3J0X3NlY3Rpb25zIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gcHJlcF9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzd2FwX291dF9zeW1zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBjaGFyICplbGZfcmVhZCBQQVJBTVMgKChiZmQgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBlbGZfZmFrZV9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBhc3NpZ25fc2VjdGlvbl9udW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgSU5MSU5FIGludCBzeW1faXNfZ2xvYmFsIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tYXBfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9zaXplX3R5cGUgZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZmNvcmVfcmVhZF9ub3RlcyBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi0vKiBTd2FwIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gYW5kIG91dC4gIFRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzCi0gICBjdXJyZW50bHkgc2l6ZSBpbmRlcGVuZGVudC4gIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbAotICAgbmVlZCB0byBtb3ZlIGludG8gZWxmY29kZS5oLiAgKi8KLQotLyogU3dhcCBpbiBhIFZlcmRlZiBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRlZiAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICpkc3Q7Ci17Ci0gIGRzdC0+dmRfdmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF92ZXJzaW9uKTsKLSAgZHN0LT52ZF9mbGFncyAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZkX2ZsYWdzKTsKLSAgZHN0LT52ZF9uZHggICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZkX25keCk7Ci0gIGRzdC0+dmRfY250ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9jbnQpOwotICBkc3QtPnZkX2hhc2ggICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfaGFzaCk7Ci0gIGRzdC0+dmRfYXV4ICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52ZF9hdXgpOwotICBkc3QtPnZkX25leHQgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgVmVyZGVmIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRlZiAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52ZF92ZXJzaW9uLCBkc3QtPnZkX3ZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfZmxhZ3MsIGRzdC0+dmRfZmxhZ3MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfbmR4LCBkc3QtPnZkX25keCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52ZF9jbnQsIGRzdC0+dmRfY250KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkX2hhc2gsIGRzdC0+dmRfaGFzaCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9hdXgsIGRzdC0+dmRfYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkX25leHQsIGRzdC0+dmRfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJkYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRhdXggKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggKmRzdDsKLXsKLSAgZHN0LT52ZGFfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52ZGFfbmFtZSk7Ci0gIGRzdC0+dmRhX25leHQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRhX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcmRhdXggc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRhdXggKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcmRhdXggKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkYV9uYW1lLCBkc3QtPnZkYV9uYW1lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkYV9uZXh0LCBkc3QtPnZkYV9uZXh0KTsKLX0KLQotLyogU3dhcCBpbiBhIFZlcm5lZWQgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqZHN0OwotewotICBkc3QtPnZuX3ZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dm5fdmVyc2lvbik7Ci0gIGRzdC0+dm5fY250ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bl9jbnQpOwotICBkc3QtPnZuX2ZpbGUgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fZmlsZSk7Ci0gIGRzdC0+dm5fYXV4ICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bl9hdXgpOwotICBkc3QtPnZuX25leHQgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fbmV4dCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgVmVybmVlZCBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmVlZCAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dm5fdmVyc2lvbiwgZHN0LT52bl92ZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuX2NudCwgZHN0LT52bl9jbnQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5fZmlsZSwgZHN0LT52bl9maWxlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX2F1eCwgZHN0LT52bl9hdXgpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5fbmV4dCwgZHN0LT52bl9uZXh0KTsKLX0KLQotLyogU3dhcCBpbiBhIFZlcm5hdXggc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqZHN0OwotewotICBkc3QtPnZuYV9oYXNoICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bmFfaGFzaCk7Ci0gIGRzdC0+dm5hX2ZsYWdzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuYV9mbGFncyk7Ci0gIGRzdC0+dm5hX290aGVyID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuYV9vdGhlcik7Ci0gIGRzdC0+dm5hX25hbWUgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuYV9uYW1lKTsKLSAgZHN0LT52bmFfbmV4dCAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5hX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcm5hdXggc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5hdXggKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1Zlcm5hdXggKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuYV9oYXNoLCBkc3QtPnZuYV9oYXNoKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuYV9mbGFncywgZHN0LT52bmFfZmxhZ3MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dm5hX290aGVyLCBkc3QtPnZuYV9vdGhlcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfbmFtZSwgZHN0LT52bmFfbmFtZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfbmV4dCwgZHN0LT52bmFfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJzeW0gc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJzeW0gKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcnN5bSAqZHN0OwotewotICBkc3QtPnZzX3ZlcnMgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dnNfdmVycyk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgVmVyc3ltIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1ZlcnN5bSAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfVmVyc3ltICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52c192ZXJzLCBkc3QtPnZzX3ZlcnMpOwotfQotCi0vKiBTdGFuZGFyZCBFTEYgaGFzaCBmdW5jdGlvbi4gIERvIG5vdCBjaGFuZ2UgdGhpcyBmdW5jdGlvbjsgeW91IHdpbGwKLSAgIGNhdXNlIGludmFsaWQgaGFzaCB0YWJsZXMgdG8gYmUgZ2VuZXJhdGVkLiAgKi8KLQotdW5zaWduZWQgbG9uZwotYmZkX2VsZl9oYXNoIChuYW1lYXJnKQotICAgICBjb25zdCBjaGFyICpuYW1lYXJnOwotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmFtZWFyZzsKLSAgdW5zaWduZWQgbG9uZyBoID0gMDsKLSAgdW5zaWduZWQgbG9uZyBnOwotICBpbnQgY2g7Ci0KLSAgd2hpbGUgKChjaCA9ICpuYW1lKyspICE9ICdcMCcpCi0gICAgewotICAgICAgaCA9IChoIDw8IDQpICsgY2g7Ci0gICAgICBpZiAoKGcgPSAoaCAmIDB4ZjAwMDAwMDApKSAhPSAwKQotCXsKLQkgIGggXj0gZyA+PiAyNDsKLQkgIC8qIFRoZSBFTEYgQUJJIHNheXMgYGggJj0gfmcnLCBidXQgdGhpcyBpcyBlcXVpdmFsZW50IGluCi0JICAgICB0aGlzIGNhc2UgYW5kIG9uIHNvbWUgbWFjaGluZXMgb25lIGluc24gaW5zdGVhZCBvZiB0d28uICAqLwotCSAgaCBePSBnOwotCX0KLSAgICB9Ci0gIHJldHVybiBoOwotfQotCi0vKiBSZWFkIGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBhdCBhIHNwZWNpZmllZCBvZmZzZXQgaW4gYW4gRUxGCi0gICBmaWxlLCBpbnRvIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciwgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlCi0gICBidWZmZXIuICovCi0KLXN0YXRpYyBjaGFyICoKLWVsZl9yZWFkIChhYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgY2hhciAqYnVmOwotCi0gIGlmICgoYnVmID0gYmZkX2FsbG9jIChhYmZkLCBzaXplKSkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBidWYsIHNpemUsIDEsIGFiZmQpICE9IHNpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBidWY7Ci19Ci0KLWJvb2xlYW4KLWJmZF9lbGZfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIC8qIHRoaXMganVzdCBkb2VzIGluaXRpYWxpemF0aW9uICovCi0gIC8qIGNvZmZfbWtvYmplY3QgemFsbG9jJ3Mgc3BhY2UgZm9yIHRkYXRhLmNvZmZfb2JqX2RhdGEgLi4uICovCi0gIGVsZl90ZGF0YSAoYWJmZCkgPSAoc3RydWN0IGVsZl9vYmpfdGRhdGEgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChlbGZfdGRhdGEgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBzaW5jZSBldmVyeXRoaW5nIGlzIGRvbmUgYXQgY2xvc2UgdGltZSwgZG8gd2UgbmVlZCBhbnkKLSAgICAgaW5pdGlhbGl6YXRpb24/ICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWJmZF9lbGZfbWtjb3JlZmlsZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgLyogSSB0aGluayB0aGlzIGNhbiBiZSBkb25lIGp1c3QgbGlrZSBhbiBvYmplY3QgZmlsZS4gKi8KLSAgcmV0dXJuIGJmZF9lbGZfbWtvYmplY3QgKGFiZmQpOwotfQotCi1jaGFyICoKLWJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIChhYmZkLCBzaGluZGV4KQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2hpbmRleDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwotICBjaGFyICpzaHN0cnRhYiA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBzaHN0cnRhYnNpemU7Ci0KLSAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0gIGlmIChpX3NoZHJwID09IDAgfHwgaV9zaGRycFtzaGluZGV4XSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHNoc3RydGFiID0gKGNoYXIgKikgaV9zaGRycFtzaGluZGV4XS0+Y29udGVudHM7Ci0gIGlmIChzaHN0cnRhYiA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vIGNhY2hlZCBvbmUsIGF0dGVtcHQgdG8gcmVhZCwgYW5kIGNhY2hlIHdoYXQgd2UgcmVhZC4gKi8KLSAgICAgIG9mZnNldCA9IGlfc2hkcnBbc2hpbmRleF0tPnNoX29mZnNldDsKLSAgICAgIHNoc3RydGFic2l6ZSA9IGlfc2hkcnBbc2hpbmRleF0tPnNoX3NpemU7Ci0gICAgICBzaHN0cnRhYiA9IGVsZl9yZWFkIChhYmZkLCBvZmZzZXQsIHNoc3RydGFic2l6ZSk7Ci0gICAgICBpX3NoZHJwW3NoaW5kZXhdLT5jb250ZW50cyA9IChQVFIpIHNoc3RydGFiOwotICAgIH0KLSAgcmV0dXJuIHNoc3RydGFiOwotfQotCi1jaGFyICoKLWJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIHNoaW5kZXgsIHN0cmluZGV4KQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2hpbmRleDsKLSAgICAgdW5zaWduZWQgaW50IHN0cmluZGV4OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0gIGlmIChzdHJpbmRleCA9PSAwKQotICAgIHJldHVybiAiIjsKLQotICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdOwotCi0gIGlmIChoZHItPmNvbnRlbnRzID09IE5VTEwKLSAgICAgICYmIGJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIChhYmZkLCBzaGluZGV4KSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChzdHJpbmRleCA+PSBoZHItPnNoX3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBpbnZhbGlkIHN0cmluZyBvZmZzZXQgJXUgPj0gJWx1IGZvciBzZWN0aW9uIGAlcyciKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN0cmluZGV4LCAodW5zaWduZWQgbG9uZykgaGRyLT5zaF9zaXplLAotCSAoKHNoaW5kZXggPT0gZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keAotCSAgICYmIHN0cmluZGV4ID09IGhkci0+c2hfbmFtZSkKLQkgID8gIi5zaHN0cnRhYiIKLQkgIDogZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIgKGFiZmQsIGhkci0+c2hfbmFtZSkpKTsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgcmV0dXJuICgoY2hhciAqKSBoZHItPmNvbnRlbnRzKSArIHN0cmluZGV4OwotfQotCi0vKiBNYWtlIGEgQkZEIHNlY3Rpb24gZnJvbSBhbiBFTEYgc2VjdGlvbi4gIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGUKLSAgIEJGRCBzZWN0aW9uIGluIHRoZSBiZmRfc2VjdGlvbiBmaWVsZCBvZiB0aGUgaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKHN0cmNtcCAobmFtZSwKLQkJCSAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24pKSA9PSAwKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBuZXdzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAobmV3c2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuZXdzZWN0LT5maWxlcG9zID0gaGRyLT5zaF9vZmZzZXQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3ZtYSAoYWJmZCwgbmV3c2VjdCwgaGRyLT5zaF9hZGRyKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgbmV3c2VjdCwgaGRyLT5zaF9zaXplKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBuZXdzZWN0LAotCQkJCSAgICAgIGJmZF9sb2cyIChoZHItPnNoX2FkZHJhbGlnbikpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmbGFncyA9IFNFQ19OT19GTEFHUzsKLSAgaWYgKGhkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotICAgIGZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGlmICgoaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBmbGFncyB8PSBTRUNfQUxMT0M7Ci0gICAgICBpZiAoaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JZmxhZ3MgfD0gU0VDX0xPQUQ7Ci0gICAgfQotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfV1JJVEUpID09IDApCi0gICAgZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKSAhPSAwKQotICAgIGZsYWdzIHw9IFNFQ19DT0RFOwotICBlbHNlIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICBmbGFncyB8PSBTRUNfREFUQTsKLQotICAvKiBUaGUgZGVidWdnaW5nIHNlY3Rpb25zIGFwcGVhciB0byBiZSByZWNvZ25pemVkIG9ubHkgYnkgbmFtZSwgbm90Ci0gICAgIGFueSBzb3J0IG9mIGZsYWcuICAqLwotICBpZiAoc3RybmNtcCAobmFtZSwgIi5kZWJ1ZyIsIHNpemVvZiAiLmRlYnVnIiAtIDEpID09IDAKLSAgICAgIHx8IHN0cm5jbXAgKG5hbWUsICIubGluZSIsIHNpemVvZiAiLmxpbmUiIC0gMSkgPT0gMAotICAgICAgfHwgc3RybmNtcCAobmFtZSwgIi5zdGFiIiwgc2l6ZW9mICIuc3RhYiIgLSAxKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7Ci0KLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBpZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCAuZ251LmxpbmtvbmNlLCB3ZQotICAgICBvbmx5IGxpbmsgYSBzaW5nbGUgY29weSBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0Ci0gICAgIGcrKy4gIGcrKyB3aWxsIGVtaXQgZWFjaCB0ZW1wbGF0ZSBleHBhbnNpb24gaW4gaXRzIG93biBzZWN0aW9uLgotICAgICBUaGUgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgYXMgd2Vhaywgc28gdGhhdCBtdWx0aXBsZSBkZWZpbml0aW9ucwotICAgICBhcmUgcGVybWl0dGVkLiAgVGhlIEdOVSBsaW5rZXIgZXh0ZW5zaW9uIGlzIHRvIGFjdHVhbGx5IGRpc2NhcmQKLSAgICAgYWxsIGJ1dCBvbmUgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251LmxpbmtvbmNlIiwgc2l6ZW9mICIuZ251LmxpbmtvbmNlIiAtIDEpID09IDApCi0gICAgZmxhZ3MgfD0gU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLQotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QsIGZsYWdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKChmbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcjsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHBoZHJzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgbG1hLgotICAgICAgICAgSWYgYWxsIHRoZSBwX3BhZGRyIGZpZWxkcyBhcmUgemVybywgd2UgaWdub3JlIHRoZW0sIHNpbmNlCi0gICAgICAgICBzb21lIEVMRiBsaW5rZXJzIHByb2R1Y2Ugc3VjaCBvdXRwdXQuICAqLwotICAgICAgcGhkciA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07IGkrKywgcGhkcisrKQotCXsKLQkgIGlmIChwaGRyLT5wX3BhZGRyICE9IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW0pCi0JewotCSAgcGhkciA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0JICBmb3IgKGkgPSAwOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07IGkrKywgcGhkcisrKQotCSAgICB7Ci0JICAgICAgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9MT0FECi0JCSAgJiYgcGhkci0+cF92YWRkciAhPSBwaGRyLT5wX3BhZGRyCi0JCSAgJiYgcGhkci0+cF92YWRkciA8PSBoZHItPnNoX2FkZHIKLQkJICAmJiAocGhkci0+cF92YWRkciArIHBoZHItPnBfbWVtc3oKLQkJICAgICAgPj0gaGRyLT5zaF9hZGRyICsgaGRyLT5zaF9zaXplKQotCQkgICYmICgoZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotCQkgICAgICB8fCAocGhkci0+cF9vZmZzZXQgPD0gKGJmZF92bWEpIGhkci0+c2hfb2Zmc2V0Ci0JCQkgICYmIChwaGRyLT5wX29mZnNldCArIHBoZHItPnBfZmlsZXN6Ci0JCQkgICAgICA+PSBoZHItPnNoX29mZnNldCArIGhkci0+c2hfc2l6ZSkpKSkKLQkJewotCQkgIG5ld3NlY3QtPmxtYSArPSBwaGRyLT5wX3BhZGRyIC0gcGhkci0+cF92YWRkcjsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBoZHItPmJmZF9zZWN0aW9uID0gbmV3c2VjdDsKLSAgZWxmX3NlY3Rpb25fZGF0YSAobmV3c2VjdCktPnRoaXNfaGRyID0gKmhkcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2VsZl9maW5kX3NlY3Rpb24KLQotU1lOT1BTSVMKLQlzdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKmJmZF9lbGZfZmluZF9zZWN0aW9uIChiZmQgKmFiZmQsIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCUhlbHBlciBmdW5jdGlvbnMgZm9yIEdEQiB0byBsb2NhdGUgdGhlIHN0cmluZyB0YWJsZXMuCi0JU2luY2UgQkZEIGhpZGVzIHN0cmluZyB0YWJsZXMgZnJvbSBjYWxsZXJzLCBHREIgbmVlZHMgdG8gdXNlIGFuCi0JaW50ZXJuYWwgaG9vayB0byBmaW5kIHRoZW0uICBTdW4ncyAuc3RhYnN0ciwgaW4gcGFydGljdWxhciwKLQlpc24ndCBldmVuIHBvaW50ZWQgdG8gYnkgdGhlIC5zdGFiIHNlY3Rpb24sIHNvIG9yZGluYXJ5Ci0JbWVjaGFuaXNtcyB3b3VsZG4ndCB3b3JrIHRvIGZpbmQgaXQsIGV2ZW4gaWYgd2UgaGFkIHNvbWUuCi0qLwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKgotYmZkX2VsZl9maW5kX3NlY3Rpb24gKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgY2hhciAqc2hzdHJ0YWI7Ci0gIHVuc2lnbmVkIGludCBtYXg7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpZiAoaV9zaGRycCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNoc3RydGFiID0gYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24KLQkoYWJmZCwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgpOwotICAgICAgaWYgKHNoc3RydGFiICE9IE5VTEwpCi0JewotCSAgbWF4ID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07Ci0JICBmb3IgKGkgPSAxOyBpIDwgbWF4OyBpKyspCi0JICAgIGlmICghc3RyY21wICgmc2hzdHJ0YWJbaV9zaGRycFtpXS0+c2hfbmFtZV0sIG5hbWUpKQotCSAgICAgIHJldHVybiBpX3NoZHJwW2ldOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1jb25zdCBjaGFyICpjb25zdCBiZmRfZWxmX3NlY3Rpb25fdHlwZV9uYW1lc1tdID0gewotICAiU0hUX05VTEwiLCAiU0hUX1BST0dCSVRTIiwgIlNIVF9TWU1UQUIiLCAiU0hUX1NUUlRBQiIsCi0gICJTSFRfUkVMQSIsICJTSFRfSEFTSCIsICJTSFRfRFlOQU1JQyIsICJTSFRfTk9URSIsCi0gICJTSFRfTk9CSVRTIiwgIlNIVF9SRUwiLCAiU0hUX1NITElCIiwgIlNIVF9EWU5TWU0iLAotfTsKLQotLyogRUxGIHJlbG9jcyBhcmUgYWdhaW5zdCBzeW1ib2xzLiAgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUKLSAgIG91dHB1dCwgYW5kIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIG5vdGhpbmcKLSAgIGhhcyBnaXZlbiB1cyBhbnkgYWRkaXRpb25hbCBhZGRlbmQsIHRoZSByZXN1bHRpbmcgcmVsb2Mgd2lsbCBhbHNvCi0gICBiZSBhZ2FpbnN0IHRoZSBzYW1lIHN5bWJvbC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvCi0gICBjaGFuZ2UgYW55dGhpbmcgYWJvdXQgdGhlIHdheSB0aGUgcmVsb2MgaXMgaGFuZGxlZCwgc2luY2UgaXQgd2lsbAotICAgYWxsIGJlIGRvbmUgYXQgZmluYWwgbGluayB0aW1lLiAgUmF0aGVyIHRoYW4gcHV0IHNwZWNpYWwgY2FzZSBjb2RlCi0gICBpbnRvIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFsbCB0aGUgcmVsb2MgdHlwZXMgdXNlIHRoaXMgaG93dG8KLSAgIGZ1bmN0aW9uLiAgSXQganVzdCBzaG9ydCBjaXJjdWl0cyB0aGUgcmVsb2MgaWYgcHJvZHVjaW5nCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotDAotLyogUHJpbnQgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBmYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmYXJnOwotewotICBGSUxFICpmID0gKEZJTEUgKikgZmFyZzsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnA7Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZHluYnVmID0gTlVMTDsKLQotICBwID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaSwgYzsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5Qcm9ncmFtIEhlYWRlcjpcbiIpKTsKLSAgICAgIGMgPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyssIHArKykKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCSAgY2hhciBidWZbMjBdOwotCi0JICBzd2l0Y2ggKHAtPnBfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFBUX05VTEw6IHMgPSAiTlVMTCI7IGJyZWFrOwotCSAgICBjYXNlIFBUX0xPQUQ6IHMgPSAiTE9BRCI7IGJyZWFrOwotCSAgICBjYXNlIFBUX0RZTkFNSUM6IHMgPSAiRFlOQU1JQyI7IGJyZWFrOwotCSAgICBjYXNlIFBUX0lOVEVSUDogcyA9ICJJTlRFUlAiOyBicmVhazsKLQkgICAgY2FzZSBQVF9OT1RFOiBzID0gIk5PVEUiOyBicmVhazsKLQkgICAgY2FzZSBQVF9TSExJQjogcyA9ICJTSExJQiI7IGJyZWFrOwotCSAgICBjYXNlIFBUX1BIRFI6IHMgPSAiUEhEUiI7IGJyZWFrOwotCSAgICBkZWZhdWx0OiBzcHJpbnRmIChidWYsICIweCVseCIsIHAtPnBfdHlwZSk7IHMgPSBidWY7IGJyZWFrOwotCSAgICB9Ci0JICBmcHJpbnRmIChmLCAiJThzIG9mZiAgICAweCIsIHMpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfb2Zmc2V0KTsKLQkgIGZwcmludGYgKGYsICIgdmFkZHIgMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX3ZhZGRyKTsKLQkgIGZwcmludGYgKGYsICIgcGFkZHIgMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX3BhZGRyKTsKLQkgIGZwcmludGYgKGYsICIgYWxpZ24gMioqJXVcbiIsIGJmZF9sb2cyIChwLT5wX2FsaWduKSk7Ci0JICBmcHJpbnRmIChmLCAiICAgICAgICAgZmlsZXN6IDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF9maWxlc3opOwotCSAgZnByaW50ZiAoZiwgIiBtZW1zeiAweCIpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfbWVtc3opOwotCSAgZnByaW50ZiAoZiwgIiBmbGFncyAlYyVjJWMiLAotCQkgICAocC0+cF9mbGFncyAmIFBGX1IpICE9IDAgPyAncicgOiAnLScsCi0JCSAgIChwLT5wX2ZsYWdzICYgUEZfVykgIT0gMCA/ICd3JyA6ICctJywKLQkJICAgKHAtPnBfZmxhZ3MgJiBQRl9YKSAhPSAwID8gJ3gnIDogJy0nKTsKLQkgIGlmICgocC0+cF9mbGFncyAmfiAoUEZfUiB8IFBGX1cgfCBQRl9YKSkgIT0gMCkKLQkgICAgZnByaW50ZiAoZiwgIiAlbHgiLCBwLT5wX2ZsYWdzICZ+IChQRl9SIHwgUEZfVyB8IFBGX1gpKTsKLQkgIGZwcmludGYgKGYsICJcbiIpOwotCX0KLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgZWxmc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBsaW5rOwotICAgICAgYmZkX2J5dGUgKmV4dGR5biwgKmV4dGR5bmVuZDsKLSAgICAgIHNpemVfdCBleHRkeW5zaXplOwotICAgICAgdm9pZCAoKnN3YXBfZHluX2luKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5EeW5hbWljIFNlY3Rpb246XG4iKSk7Ci0KLSAgICAgIGR5bmJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKGR5bmJ1ZiA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCAoUFRSKSBkeW5idWYsIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBzLT5fcmF3X3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotICAgICAgaWYgKGVsZnNlYyA9PSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0KLSAgICAgIGV4dGR5bnNpemUgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9keW47Ci0gICAgICBzd2FwX2R5bl9pbiA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c3dhcF9keW5faW47Ci0KLSAgICAgIGV4dGR5biA9IGR5bmJ1ZjsKLSAgICAgIGV4dGR5bmVuZCA9IGV4dGR5biArIHMtPl9yYXdfc2l6ZTsKLSAgICAgIGZvciAoOyBleHRkeW4gPCBleHRkeW5lbmQ7IGV4dGR5biArPSBleHRkeW5zaXplKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYWJbMjBdOwotCSAgYm9vbGVhbiBzdHJpbmdwOwotCi0JICAoKnN3YXBfZHluX2luKSAoYWJmZCwgKFBUUikgZXh0ZHluLCAmZHluKTsKLQotCSAgaWYgKGR5bi5kX3RhZyA9PSBEVF9OVUxMKQotCSAgICBicmVhazsKLQotCSAgc3RyaW5ncCA9IGZhbHNlOwotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzcHJpbnRmIChhYiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIGR5bi5kX3RhZyk7Ci0JICAgICAgbmFtZSA9IGFiOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTkVFREVEOiBuYW1lID0gIk5FRURFRCI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICJQTFRSRUxTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVEdPVDogbmFtZSA9ICJQTFRHT1QiOyBicmVhazsKLQkgICAgY2FzZSBEVF9IQVNIOiBuYW1lID0gIkhBU0giOyBicmVhazsKLQkgICAgY2FzZSBEVF9TVFJUQUI6IG5hbWUgPSAiU1RSVEFCIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1lNVEFCOiBuYW1lID0gIlNZTVRBQiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEE6IG5hbWUgPSAiUkVMQSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEFTWjogbmFtZSA9ICJSRUxBU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBRU5UOiBuYW1lID0gIlJFTEFFTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TVFJTWjogbmFtZSA9ICJTVFJTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTUVOVDogbmFtZSA9ICJTWU1FTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9JTklUOiBuYW1lID0gIklOSVQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9GSU5JOiBuYW1lID0gIkZJTkkiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TT05BTUU6IG5hbWUgPSAiU09OQU1FIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1JQQVRIOiBuYW1lID0gIlJQQVRIIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTUJPTElDOiBuYW1lID0gIlNZTUJPTElDIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMOiBuYW1lID0gIlJFTCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTFNaOiBuYW1lID0gIlJFTFNaIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMRU5UOiBuYW1lID0gIlJFTEVOVCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTDogbmFtZSA9ICJQTFRSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9ERUJVRzogbmFtZSA9ICJERUJVRyI7IGJyZWFrOwotCSAgICBjYXNlIERUX1RFWFRSRUw6IG5hbWUgPSAiVEVYVFJFTCI7IGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogbmFtZSA9ICJKTVBSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9BVVhJTElBUlk6IG5hbWUgPSAiQVVYSUxJQVJZIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX0ZJTFRFUjogbmFtZSA9ICJGSUxURVIiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSU1lNOiBuYW1lID0gIlZFUlNZTSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUkRFRjogbmFtZSA9ICJWRVJERUYiOyBicmVhazsKLQkgICAgY2FzZSBEVF9WRVJERUZOVU06IG5hbWUgPSAiVkVSREVGTlVNIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSTkVFRDogbmFtZSA9ICJWRVJORUVEIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSTkVFRE5VTTogbmFtZSA9ICJWRVJORUVETlVNIjsgYnJlYWs7Ci0JICAgIH0KLQotCSAgZnByaW50ZiAoZiwgIiAgJS0xMXMgIiwgbmFtZSk7Ci0JICBpZiAoISBzdHJpbmdwKQotCSAgICBmcHJpbnRmIChmLCAiMHglbHgiLCAodW5zaWduZWQgbG9uZykgZHluLmRfdW4uZF92YWwpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotCi0JICAgICAgc3RyaW5nID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCQlkeW4uZF91bi5kX3ZhbCk7Ci0JICAgICAgaWYgKHN0cmluZyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcHJpbnRmIChmLCAiJXMiLCBzdHJpbmcpOwotCSAgICB9Ci0JICBmcHJpbnRmIChmLCAiXG4iKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGR5bmJ1Zik7Ci0gICAgICBkeW5idWYgPSBOVUxMOwotICAgIH0KLQotICBpZiAoKGVsZl9keW52ZXJkZWYgKGFiZmQpICE9IDAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID09IE5VTEwpCi0gICAgICB8fCAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCAmJiBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPT0gTlVMTCkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9keW52ZXJkZWYgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAqdDsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5WZXJzaW9uIGRlZmluaXRpb25zOlxuIikpOwotICAgICAgZm9yICh0ID0gZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmOyB0ICE9IE5VTEw7IHQgPSB0LT52ZF9uZXh0ZGVmKQotCXsKLQkgIGZwcmludGYgKGYsICIlZCAweCUyLjJ4IDB4JTguOGx4ICVzXG4iLCB0LT52ZF9uZHgsCi0JCSAgIHQtPnZkX2ZsYWdzLCB0LT52ZF9oYXNoLCB0LT52ZF9ub2RlbmFtZSk7Ci0JICBpZiAodC0+dmRfYXV4cHRyLT52ZGFfbmV4dHB0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggKmE7Ci0KLQkgICAgICBmcHJpbnRmIChmLCAiXHQiKTsKLQkgICAgICBmb3IgKGEgPSB0LT52ZF9hdXhwdHItPnZkYV9uZXh0cHRyOwotCQkgICBhICE9IE5VTEw7Ci0JCSAgIGEgPSBhLT52ZGFfbmV4dHB0cikKLQkJZnByaW50ZiAoZiwgIiVzICIsIGEtPnZkYV9ub2RlbmFtZSk7Ci0JICAgICAgZnByaW50ZiAoZiwgIlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChlbGZfZHludmVycmVmIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJcblZlcnNpb24gUmVmZXJlbmNlczpcbiIpKTsKLSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dm5fbmV4dHJlZikKLQl7Ci0JICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCSAgZnByaW50ZiAoZiwgXygiICByZXF1aXJlZCBmcm9tICVzOlxuIiksIHQtPnZuX2ZpbGVuYW1lKTsKLQkgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JICAgIGZwcmludGYgKGYsICIgICAgMHglOC44bHggMHglMi4yeCAlMi4yZCAlc1xuIiwgYS0+dm5hX2hhc2gsCi0JCSAgICAgYS0+dm5hX2ZsYWdzLCBhLT52bmFfb3RoZXIsIGEtPnZuYV9ub2RlbmFtZSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGlzcGxheSBFTEYtc3BlY2lmaWMgZmllbGRzIG9mIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotYmZkX2VsZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiZWxmICIpOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHN5bWJvbC0+dmFsdWUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlbHgiLCAobG9uZykgc3ltYm9sLT5mbGFncyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCUNPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZTsKLQlDT05TVCBjaGFyICpuYW1lID0gTlVMTDsKLQlzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCXVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7Ci0JCi0Jc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uID8gc3ltYm9sLT5zZWN0aW9uLT5uYW1lIDogIigqbm9uZSopIjsKLQotCWJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQlpZiAoYmVkLT5lbGZfYmFja2VuZF9wcmludF9zeW1ib2xfYWxsKQotCSAgICBuYW1lID0gKCpiZWQtPmVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwpIChhYmZkLCBmaWxlcCwgc3ltYm9sKTsKLQotCWlmIChuYW1lID09IE5VTEwpCi0JICB7Ci0JICAgIG5hbWUgPSBzeW1ib2wtPm5hbWU7ICAKLQkgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQkgIH0KLQotCWZwcmludGYgKGZpbGUsICIgJXNcdCIsIHNlY3Rpb25fbmFtZSk7Ci0JLyogUHJpbnQgdGhlICJvdGhlciIgdmFsdWUgZm9yIGEgc3ltYm9sLiAgRm9yIGNvbW1vbiBzeW1ib2xzLAotCSAgIHdlJ3ZlIGFscmVhZHkgcHJpbnRlZCB0aGUgc2l6ZTsgbm93IHByaW50IHRoZSBhbGlnbm1lbnQuCi0JICAgRm9yIG90aGVyIHN5bWJvbHMsIHdlIGhhdmUgbm8gc3BlY2lmaWVkIGFsaWdubWVudCwgYW5kCi0JICAgd2UndmUgcHJpbnRlZCB0aGUgYWRkcmVzczsgbm93IHByaW50IHRoZSBzaXplLiAgKi8KLQlmcHJpbnRmX3ZtYSAoZmlsZSwKLQkJICAgICAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0JCSAgICAgID8gKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZQotCQkgICAgICA6ICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZSkpOwotCi0JLyogSWYgd2UgaGF2ZSB2ZXJzaW9uIGluZm9ybWF0aW9uLCBwcmludCBpdC4gICovCi0JaWYgKGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9zZWN0aW9uICE9IDAKLQkgICAgJiYgKGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9zZWN0aW9uICE9IDAKLQkJfHwgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX3NlY3Rpb24gIT0gMCkpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCB2ZXJudW07Ci0JICAgIGNvbnN0IGNoYXIgKnZlcnNpb25fc3RyaW5nOwotCi0JICAgIHZlcm51bSA9ICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPnZlcnNpb24gJiBWRVJTWU1fVkVSU0lPTjsKLQotCSAgICBpZiAodmVybnVtID09IDApCi0JICAgICAgdmVyc2lvbl9zdHJpbmcgPSAiIjsKLQkgICAgZWxzZSBpZiAodmVybnVtID09IDEpCi0JICAgICAgdmVyc2lvbl9zdHJpbmcgPSAiQmFzZSI7Ci0JICAgIGVsc2UgaWYgKHZlcm51bSA8PSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmcykKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9Ci0JCWVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZlt2ZXJudW0gLSAxXS52ZF9ub2RlbmFtZTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7Ci0KLQkJdmVyc2lvbl9zdHJpbmcgPSAiIjsKLQkJZm9yICh0ID0gZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmOwotCQkgICAgIHQgIT0gTlVMTDsKLQkJICAgICB0ID0gdC0+dm5fbmV4dHJlZikKLQkJICB7Ci0JCSAgICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCQkgICAgZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQkJICAgICAgewotCQkJaWYgKGEtPnZuYV9vdGhlciA9PSB2ZXJudW0pCi0JCQkgIHsKLQkJCSAgICB2ZXJzaW9uX3N0cmluZyA9IGEtPnZuYV9ub2RlbmFtZTsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoKCgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPnZlcnNpb24gJiBWRVJTWU1fSElEREVOKSA9PSAwKQotCSAgICAgIGZwcmludGYgKGZpbGUsICIgICUtMTFzIiwgdmVyc2lvbl9zdHJpbmcpOwotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgaTsKLQotCQlmcHJpbnRmIChmaWxlLCAiICglcykiLCB2ZXJzaW9uX3N0cmluZyk7Ci0JCWZvciAoaSA9IDEwIC0gc3RybGVuICh2ZXJzaW9uX3N0cmluZyk7IGkgPiAwOyAtLWkpCi0JCSAgcHV0YyAoJyAnLCBmaWxlKTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBJZiB0aGUgc3Rfb3RoZXIgZmllbGQgaXMgbm90IHplcm8sIHByaW50IGl0LiAgKi8KLQlzdF9vdGhlciA9ICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXI7Ci0JCi0Jc3dpdGNoIChzdF9vdGhlcikKLQkgIHsKLQkgIGNhc2UgMDogYnJlYWs7Ci0JICBjYXNlIFNUVl9JTlRFUk5BTDogIGZwcmludGYgKGZpbGUsICIgLmludGVybmFsIik7ICBicmVhazsKLQkgIGNhc2UgU1RWX0hJRERFTjogICAgZnByaW50ZiAoZmlsZSwgIiAuaGlkZGVuIik7ICAgIGJyZWFrOwotCSAgY2FzZSBTVFZfUFJPVEVDVEVEOiBmcHJpbnRmIChmaWxlLCAiIC5wcm90ZWN0ZWQiKTsgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICAvKiBTb21lIG90aGVyIG5vbi1kZWZpbmVkIGZsYWdzIGFyZSBhbHNvIHByZXNlbnQsIHNvIHByaW50Ci0JICAgICAgIGV2ZXJ5dGhpbmcgaGV4LiAgKi8KLQkgICAgZnByaW50ZiAoZmlsZSwgIiAweCUwMngiLCAodW5zaWduZWQgaW50KSBzdF9vdGhlcik7Ci0JICB9Ci0KLQlmcHJpbnRmIChmaWxlLCAiICVzIiwgbmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPnNpemUgPSAwOwotICAgICAgcmV0LT5keW5pbmR4ID0gLTE7Ci0gICAgICByZXQtPmR5bnN0cl9pbmRleCA9IDA7Ci0gICAgICByZXQtPndlYWtkZWYgPSBOVUxMOwotICAgICAgcmV0LT5nb3Qub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgICAgcmV0LT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgICAgcmV0LT5saW5rZXJfc2VjdGlvbl9wb2ludGVyID0gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopMDsKLSAgICAgIHJldC0+dmVyaW5mby52ZXJkZWYgPSBOVUxMOwotICAgICAgcmV0LT52dGFibGVfZW50cmllc191c2VkID0gTlVMTDsKLSAgICAgIHJldC0+dnRhYmxlX2VudHJpZXNfc2l6ZSA9IDA7Ci0gICAgICByZXQtPnZ0YWJsZV9wYXJlbnQgPSBOVUxMOwotICAgICAgcmV0LT50eXBlID0gU1RUX05PVFlQRTsKLSAgICAgIHJldC0+b3RoZXIgPSAwOwotICAgICAgLyogQXNzdW1lIHRoYXQgd2UgaGF2ZSBiZWVuIGNhbGxlZCBieSBhIG5vbi1FTEYgc3ltYm9sIHJlYWRlci4KLSAgICAgICAgIFRoaXMgZmxhZyBpcyB0aGVuIHJlc2V0IGJ5IHRoZSBjb2RlIHdoaWNoIHJlYWRzIGFuIEVMRiBpbnB1dAotICAgICAgICAgZmlsZS4gIFRoaXMgZW5zdXJlcyB0aGF0IGEgc3ltYm9sIGNyZWF0ZWQgYnkgYSBub24tRUxGIHN5bWJvbAotICAgICAgICAgcmVhZGVyIHdpbGwgaGF2ZSB0aGUgZmxhZyBzZXQgY29ycmVjdGx5LiAgKi8KLSAgICAgIHJldC0+ZWxmX2xpbmtfaGFzaF9mbGFncyA9IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ29weSBkYXRhIGZyb20gYW4gaW5kaXJlY3Qgc3ltYm9sIHRvIGl0cyBkaXJlY3Qgc3ltYm9sLCBoaWRpbmcgdGhlCi0gICBvbGQgaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfbGlua19oYXNoX2NvcHlfaW5kaXJlY3QgKGRpciwgaW5kKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZGlyLCAqaW5kOwotewotICAvKiBDb3B5IGRvd24gYW55IHJlZmVyZW5jZXMgdGhhdCB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHNlZW4gdG8gdGhlCi0gICAgIHN5bWJvbCB3aGljaCBqdXN0IGJlY2FtZSBpbmRpcmVjdC4gICovCi0KLSAgZGlyLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9Ci0gICAgKGluZC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotICAgICAmIChFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDCi0JfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUsKLQl8IEVMRl9MSU5LX05PTl9HT1RfUkVGKSk7Ci0KLSAgLyogQ29weSBvdmVyIHRoZSBnbG9iYWwgYW5kIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIG9mZnNldCBlbnRyaWVzLgotICAgICBUaGVzZSBtYXkgaGF2ZSBiZWVuIGFscmVhZHkgc2V0IHVwIGJ5IGEgY2hlY2tfcmVsb2NzIHJvdXRpbmUuICAqLwotICBpZiAoZGlyLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBkaXItPmdvdC5vZmZzZXQgPSBpbmQtPmdvdC5vZmZzZXQ7Ci0gICAgICBpbmQtPmdvdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgfQotICBCRkRfQVNTRVJUIChpbmQtPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotICBpZiAoZGlyLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBkaXItPnBsdC5vZmZzZXQgPSBpbmQtPnBsdC5vZmZzZXQ7Ci0gICAgICBpbmQtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgfQotICBCRkRfQVNTRVJUIChpbmQtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotICBpZiAoZGlyLT5keW5pbmR4ID09IC0xKQotICAgIHsKLSAgICAgIGRpci0+ZHluaW5keCA9IGluZC0+ZHluaW5keDsKLSAgICAgIGRpci0+ZHluc3RyX2luZGV4ID0gaW5kLT5keW5zdHJfaW5kZXg7Ci0gICAgICBpbmQtPmR5bmluZHggPSAtMTsKLSAgICAgIGluZC0+ZHluc3RyX2luZGV4ID0gMDsKLSAgICB9Ci0gIEJGRF9BU1NFUlQgKGluZC0+ZHluaW5keCA9PSAtMSk7Ci19Ci0KLXZvaWQKLV9iZmRfZWxmX2xpbmtfaGFzaF9oaWRlX3N5bWJvbChoKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0gIGgtPmR5bmluZHggPSAtMTsKLSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkID0gZmFsc2U7Ci0gIHRhYmxlLT5keW5vYmogPSBOVUxMOwotICAvKiBUaGUgZmlyc3QgZHluYW1pYyBzeW1ib2wgaXMgYSBkdW1teS4gICovCi0gIHRhYmxlLT5keW5zeW1jb3VudCA9IDE7Ci0gIHRhYmxlLT5keW5zdHIgPSBOVUxMOwotICB0YWJsZS0+YnVja2V0Y291bnQgPSAwOwotICB0YWJsZS0+bmVlZGVkID0gTlVMTDsKLSAgdGFibGUtPmhnb3QgPSBOVUxMOwotICB0YWJsZS0+c3RhYl9pbmZvID0gTlVMTDsKLSAgcmV0dXJuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKHJldCwgYWJmZCwgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBmb3IgdGhlIEVMRiBlbXVsYXRpb24gY29kZSBpbiB0aGUgZ2VuZXJpYyBsaW5rZXIgdG8KLSAgIHRlbGwgdGhlIGJhY2tlbmQgbGlua2VyIHdoYXQgZmlsZSBuYW1lIHRvIHVzZSBmb3IgdGhlIERUX05FRURFRAotICAgZW50cnkgZm9yIGEgZHluYW1pYyBvYmplY3QuICBUaGUgZ2VuZXJpYyBsaW5rZXIgcGFzc2VzIG5hbWUgYXMgYW4KLSAgIGVtcHR5IHN0cmluZyB0byBpbmRpY2F0ZSB0aGF0IG5vIERUX05FRURFRCBlbnRyeSBzaG91bGQgYmUgbWFkZS4gICovCi0KLXZvaWQKLWJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0KQotICAgIGVsZl9kdF9uYW1lIChhYmZkKSA9IG5hbWU7Ci19Ci0KLS8qIEdldCB0aGUgbGlzdCBvZiBEVF9ORUVERUQgZW50cmllcyBmb3IgYSBsaW5rLiAgVGhpcyBpcyBhIGhvb2sgZm9yCi0gICB0aGUgbGlua2VyIEVMRiBlbXVsYXRpb24gY29kZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqCi1iZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci19Ci0KLS8qIEdldCB0aGUgbmFtZSBhY3R1YWxseSB1c2VkIGZvciBhIGR5bmFtaWMgb2JqZWN0IGZvciBhIGxpbmsuICBUaGlzCi0gICBpcyB0aGUgU09OQU1FIGVudHJ5IGlmIHRoZXJlIGlzIG9uZS4gIE90aGVyd2lzZSwgaXQgaXMgdGhlIHN0cmluZwotICAgcGFzc2VkIHRvIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lLCBvciBpdCBpcyB0aGUgZmlsZW5hbWUuICAqLwotCi1jb25zdCBjaGFyICoKLWJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKLSAgICByZXR1cm4gZWxmX2R0X25hbWUgKGFiZmQpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2V0IHRoZSBsaXN0IG9mIERUX05FRURFRCBlbnRyaWVzIGZyb20gYSBCRkQuICBUaGlzIGlzIGEgaG9vayBmb3IKLSAgIHRoZSBFTEYgbGlua2VyIGVtdWxhdGlvbiBjb2RlLiAgKi8KLQotYm9vbGVhbgotYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IChhYmZkLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKnBuZWVkZWQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZHluYnVmID0gTlVMTDsKLSAgaW50IGVsZnNlYzsKLSAgdW5zaWduZWQgbG9uZyBsaW5rOwotICBiZmRfYnl0ZSAqZXh0ZHluLCAqZXh0ZHluZW5kOwotICBzaXplX3QgZXh0ZHluc2l6ZTsKLSAgdm9pZCAoKnN3YXBfZHluX2luKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLQotICAqcG5lZWRlZCA9IE5VTEw7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKHMgPT0gTlVMTCB8fCBzLT5fcmF3X3NpemUgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5idWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAocy0+X3Jhd19zaXplKTsKLSAgaWYgKGR5bmJ1ZiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKFBUUikgZHluYnVmLCAoZmlsZV9wdHIpIDAsCi0JCQkJICBzLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGVsZnNlYyA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgcyk7Ci0gIGlmIChlbGZzZWMgPT0gLTEpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbGluayA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbZWxmc2VjXS0+c2hfbGluazsKLQotICBleHRkeW5zaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfZHluOwotICBzd2FwX2R5bl9pbiA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c3dhcF9keW5faW47Ci0KLSAgZXh0ZHluID0gZHluYnVmOwotICBleHRkeW5lbmQgPSBleHRkeW4gKyBzLT5fcmF3X3NpemU7Ci0gIGZvciAoOyBleHRkeW4gPCBleHRkeW5lbmQ7IGV4dGR5biArPSBleHRkeW5zaXplKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCi0gICAgICAoKnN3YXBfZHluX2luKSAoYWJmZCwgKFBUUikgZXh0ZHluLCAmZHluKTsKLQotICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9OVUxMKQotCWJyZWFrOwotCi0gICAgICBpZiAoZHluLmRfdGFnID09IERUX05FRURFRCkKLQl7Ci0JICBjb25zdCBjaGFyICpzdHJpbmc7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7Ci0KLQkgIHN0cmluZyA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCi0JCQkJCQkgICAgZHluLmRfdW4uZF92YWwpOwotCSAgaWYgKHN0cmluZyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgbCA9IChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKmwpOwotCSAgaWYgKGwgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGwtPmJ5ID0gYWJmZDsKLQkgIGwtPm5hbWUgPSBzdHJpbmc7Ci0JICBsLT5uZXh0ID0gKnBuZWVkZWQ7Ci0JICAqcG5lZWRlZCA9IGw7Ci0JfQotICAgIH0KLQotICBmcmVlIChkeW5idWYpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZHluYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoZHluYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogQWxsb2NhdGUgYW4gRUxGIHN0cmluZyB0YWJsZS0tZm9yY2UgdGhlIGZpcnN0IGJ5dGUgdG8gYmUgemVyby4gICovCi0KLXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKgotX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQgKCkKLXsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqcmV0OwotCi0gIHJldCA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxvYzsKLQotICAgICAgbG9jID0gX2JmZF9zdHJpbmd0YWJfYWRkIChyZXQsICIiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBCRkRfQVNTRVJUIChsb2MgPT0gMCB8fCBsb2MgPT0gKGJmZF9zaXplX3R5cGUpIC0xKTsKLSAgICAgIGlmIChsb2MgPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXsKLQkgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHJldCk7Ci0JICByZXQgPSBOVUxMOwotCX0KLSAgICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBFTEYgLm8vZXhlYyBmaWxlIHJlYWRpbmcgKi8KLQotLyogQ3JlYXRlIGEgbmV3IGJmZCBzZWN0aW9uIGZyb20gYW4gRUxGIHNlY3Rpb24gaGVhZGVyLiAqLwotCi1ib29sZWFuCi1iZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIHNoaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdOwotICBFbGZfSW50ZXJuYWxfRWhkciAqZWhkciA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBjaGFyICpuYW1lOwotCi0gIG5hbWUgPSBlbGZfc3RyaW5nX2Zyb21fZWxmX3N0cnRhYiAoYWJmZCwgaGRyLT5zaF9uYW1lKTsKLQotICBzd2l0Y2ggKGhkci0+c2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfTlVMTDoKLSAgICAgIC8qIEluYWN0aXZlIHNlY3Rpb24uIFRocm93IGl0IGF3YXkuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIFNIVF9QUk9HQklUUzoJLyogTm9ybWFsIHNlY3Rpb24gd2l0aCBjb250ZW50cy4gICovCi0gICAgY2FzZSBTSFRfRFlOQU1JQzoJLyogRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICBjYXNlIFNIVF9OT0JJVFM6CS8qIC5ic3Mgc2VjdGlvbi4gICovCi0gICAgY2FzZSBTSFRfSEFTSDoJLyogLmhhc2ggc2VjdGlvbi4gICovCi0gICAgY2FzZSBTSFRfTk9URToJLyogLm5vdGUgc2VjdGlvbi4gICovCi0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICAgIGNhc2UgU0hUX1NZTVRBQjoJCS8qIEEgc3ltYm9sIHRhYmxlICovCi0gICAgICBpZiAoZWxmX29uZXN5bXRhYiAoYWJmZCkgPT0gc2hpbmRleCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgQkZEX0FTU0VSVCAoaGRyLT5zaF9lbnRzaXplID09IGJlZC0+cy0+c2l6ZW9mX3N5bSk7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfb25lc3ltdGFiIChhYmZkKSA9PSAwKTsKLSAgICAgIGVsZl9vbmVzeW10YWIgKGFiZmQpID0gc2hpbmRleDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIgPSAqaGRyOwotICAgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgICAgIC8qIFNvbWV0aW1lcyBhIHNoYXJlZCBvYmplY3Qgd2lsbCBtYXAgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIElmCi0gICAgICAgICBTSEZfQUxMT0MgaXMgc2V0LCBhbmQgdGhpcyBpcyBhIHNoYXJlZCBvYmplY3QsIHRoZW4gd2UgYWxzbwotICAgICAgICAgdHJlYXQgdGhpcyBzZWN0aW9uIGFzIGEgQkZEIHNlY3Rpb24uICBXZSBjYW4gbm90IGJhc2UgdGhlCi0gICAgICAgICBkZWNpc2lvbiBwdXJlbHkgb24gU0hGX0FMTE9DLCBiZWNhdXNlIHRoYXQgZmxhZyBpcyBzb21ldGltZXMKLSAgICAgICAgIHNldCBpbiBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSwgd2hpY2ggd291bGQgY29uZnVzZSB0aGUKLSAgICAgICAgIGxpbmtlci4gICovCi0gICAgICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDAKLQkgICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLQkgICYmICEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSBTSFRfRFlOU1lNOgkJLyogQSBkeW5hbWljIHN5bWJvbCB0YWJsZSAqLwotICAgICAgaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IHNoaW5kZXgpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfZW50c2l6ZSA9PSBiZWQtPnMtPnNpemVvZl9zeW0pOwotICAgICAgQkZEX0FTU0VSVCAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCk7Ci0gICAgICBlbGZfZHluc3ltdGFiIChhYmZkKSA9IHNoaW5kZXg7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyID0gKmhkcjsKLSAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkcjsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gICAgICAvKiBCZXNpZGVzIGJlaW5nIGEgc3ltYm9sIHRhYmxlLCB3ZSBhbHNvIHRyZWF0IHRoaXMgYXMgYSByZWd1bGFyCi0JIHNlY3Rpb24sIHNvIHRoYXQgb2JqY29weSBjYW4gaGFuZGxlIGl0LiAgKi8KLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOwotCi0gICAgY2FzZSBTSFRfU1RSVEFCOgkJLyogQSBzdHJpbmcgdGFibGUgKi8KLSAgICAgIGlmIChoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBpZiAoZWhkci0+ZV9zaHN0cm5keCA9PSBzaGluZGV4KQotCXsKLQkgIGVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkciA9ICpoZHI7Ci0JICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gJmVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkcjsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDE7IGkgPCBlaGRyLT5lX3NobnVtOyBpKyspCi0JICB7Ci0JICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtpXTsKLQkgICAgaWYgKGhkcjItPnNoX2xpbmsgPT0gc2hpbmRleCkKLQkgICAgICB7Ci0JCWlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpZiAoZWxmX29uZXN5bXRhYiAoYWJmZCkgPT0gaSkKLQkJICB7Ci0JCSAgICBlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyID0gKmhkcjsKLQkJICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPQotCQkgICAgICAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKLQkJICAgIHJldHVybiB0cnVlOwotCQkgIH0KLQkJaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IGkpCi0JCSAgewotCQkgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHluc3RydGFiX2hkciA9ICpoZHI7Ci0JCSAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyID0KLQkJICAgICAgJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN0cnRhYl9oZHI7Ci0JCSAgICAvKiBXZSBhbHNvIHRyZWF0IHRoaXMgYXMgYSByZWd1bGFyIHNlY3Rpb24sIHNvCi0JCSAgICAgICB0aGF0IG9iamNvcHkgY2FuIGhhbmRsZSBpdC4gICovCi0JCSAgICBicmVhazsKLQkJICB9Ci0jaWYgMCAvKiBOb3QgaGFuZGxpbmcgb3RoZXIgc3RyaW5nIHRhYmxlcyBzcGVjaWFsbHkgcmlnaHQgbm93LiAgKi8KLQkJaGRyMiA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaV07CS8qIGluIGNhc2UgaXQgbW92ZWQgKi8KLQkJLyogV2UgaGF2ZSBhIHN0cnRhYiBmb3Igc29tZSByYW5kb20gb3RoZXIgc2VjdGlvbi4gICovCi0JCW5ld3NlY3QgPSAoYXNlY3Rpb24gKikgaGRyMi0+YmZkX3NlY3Rpb247Ci0JCWlmICghbmV3c2VjdCkKLQkJICBicmVhazsKLQkJaGRyLT5iZmRfc2VjdGlvbiA9IG5ld3NlY3Q7Ci0JCWhkcjIgPSAmZWxmX3NlY3Rpb25fZGF0YSAobmV3c2VjdCktPnN0cl9oZHI7Ci0JCSpoZHIyID0gKmhkcjsKLQkJZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkcjI7Ci0jZW5kaWYKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOwotCi0gICAgY2FzZSBTSFRfUkVMOgotICAgIGNhc2UgU0hUX1JFTEE6Ci0gICAgICAvKiAqVGhlc2UqIGRvIGEgbG90IG9mIHdvcmsgLS0gYnV0IGJ1aWxkIG5vIHNlY3Rpb25zISAgKi8KLSAgICAgIHsKLQlhc2VjdGlvbiAqdGFyZ2V0X3NlY3Q7Ci0JRWxmX0ludGVybmFsX1NoZHIgKmhkcjI7Ci0KLQkvKiBDaGVjayBmb3IgYSBib2d1cyBsaW5rIHRvIGF2b2lkIGNyYXNoaW5nLiAgKi8KLQlpZiAoaGRyLT5zaF9saW5rID49IGVoZHItPmVfc2hudW0pCi0JICB7Ci0JICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgIChfKCIlczogaW52YWxpZCBsaW5rICVsdSBmb3IgcmVsb2Mgc2VjdGlvbiAlcyAoaW5kZXggJXUpIiksCi0JICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGhkci0+c2hfbGluaywgbmFtZSwgc2hpbmRleCkpOwotCSAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQkgIH0KLQotCS8qIEZvciBzb21lIGluY29tcHJlaGVuc2libGUgcmVhc29uIE9yYWNsZSBkaXN0cmlidXRlcwotCSAgIGxpYnJhcmllcyBmb3IgU29sYXJpcyBpbiB3aGljaCBzb21lIG9mIHRoZSBvYmplY3RzIGhhdmUKLQkgICBib2d1cyBzaF9saW5rIGZpZWxkcy4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQganVzdAotCSAgIHJlamVjdCB0aGVtLCBidXQsIHVuZm9ydHVuYXRlbHksIHNvbWUgcGVvcGxlIG5lZWQgdG8gdXNlCi0JICAgdGhlbS4gIFdlIHNjYW4gdGhyb3VnaCB0aGUgc2VjdGlvbiBoZWFkZXJzOyBpZiB3ZSBmaW5kIG9ubHkKLQkgICBvbmUgc3VpdGFibGUgc3ltYm9sIHRhYmxlLCB3ZSBjbG9iYmVyIHRoZSBzaF9saW5rIHRvIHBvaW50Ci0JICAgdG8gaXQuICBJIGhvcGUgdGhpcyBkb2Vzbid0IGJyZWFrIGFueXRoaW5nLiAgKi8KLQlpZiAoZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtoZHItPnNoX2xpbmtdLT5zaF90eXBlICE9IFNIVF9TWU1UQUIKLQkgICAgJiYgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtoZHItPnNoX2xpbmtdLT5zaF90eXBlICE9IFNIVF9EWU5TWU0pCi0JICB7Ci0JICAgIGludCBzY2FuOwotCSAgICBpbnQgZm91bmQ7Ci0KLQkgICAgZm91bmQgPSAwOwotCSAgICBmb3IgKHNjYW4gPSAxOyBzY2FuIDwgZWhkci0+ZV9zaG51bTsgc2NhbisrKQotCSAgICAgIHsKLQkJaWYgKGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2Nhbl0tPnNoX3R5cGUgPT0gU0hUX1NZTVRBQgotCQkgICAgfHwgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzY2FuXS0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCQkgIHsKLQkJICAgIGlmIChmb3VuZCAhPSAwKQotCQkgICAgICB7Ci0JCQlmb3VuZCA9IDA7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgZm91bmQgPSBzY2FuOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGlmIChmb3VuZCAhPSAwKQotCSAgICAgIGhkci0+c2hfbGluayA9IGZvdW5kOwotCSAgfQotCi0JLyogR2V0IHRoZSBzeW1ib2wgdGFibGUuICAqLwotCWlmIChlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2hkci0+c2hfbGlua10tPnNoX3R5cGUgPT0gU0hUX1NZTVRBQgotCSAgICAmJiAhIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLT5zaF9saW5rKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIElmIHRoaXMgcmVsb2Mgc2VjdGlvbiBkb2VzIG5vdCB1c2UgdGhlIG1haW4gc3ltYm9sIHRhYmxlIHdlCi0JICAgZG9uJ3QgdHJlYXQgaXQgYXMgYSByZWxvYyBzZWN0aW9uLiAgQkZEIGNhbid0IGFkZXF1YXRlbHkKLQkgICByZXByZXNlbnQgc3VjaCBhIHNlY3Rpb24sIHNvIGF0IGxlYXN0IGZvciBub3csIHdlIGRvbid0Ci0JICAgdHJ5LiAgV2UganVzdCBwcmVzZW50IGl0IGFzIGEgbm9ybWFsIHNlY3Rpb24uICAqLwotCWlmIChoZHItPnNoX2xpbmsgIT0gZWxmX29uZXN5bXRhYiAoYWJmZCkpCi0JICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotCWlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLT5zaF9pbmZvKSkKLQkgIHJldHVybiBmYWxzZTsKLQl0YXJnZXRfc2VjdCA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBoZHItPnNoX2luZm8pOwotCWlmICh0YXJnZXRfc2VjdCA9PSBOVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JaWYgKCh0YXJnZXRfc2VjdC0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgICAgfHwgdGFyZ2V0X3NlY3QtPnJlbG9jX2NvdW50ID09IDApCi0JICBoZHIyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+cmVsX2hkcjsKLQllbHNlCi0JICB7Ci0JICAgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+cmVsX2hkcjIgPT0gTlVMTCk7Ci0JICAgIGhkcjIgPSAoRWxmX0ludGVybmFsX1NoZHIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCpoZHIyKSk7Ci0JICAgIGVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+cmVsX2hkcjIgPSBoZHIyOwotCSAgfQotCSpoZHIyID0gKmhkcjsKLQllbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyMjsKLQl0YXJnZXRfc2VjdC0+cmVsb2NfY291bnQgKz0gaGRyLT5zaF9zaXplIC8gaGRyLT5zaF9lbnRzaXplOwotCXRhcmdldF9zZWN0LT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JdGFyZ2V0X3NlY3QtPnJlbG9jYXRpb24gPSBOVUxMOwotCXRhcmdldF9zZWN0LT5yZWxfZmlsZXBvcyA9IGhkci0+c2hfb2Zmc2V0OwotCS8qIEluIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoZSByZWxvY2F0aW9ucyBhcHBseSwgbWFyayB3aGV0aGVyCi0JICAgaXRzIHJlbG9jYXRpb25zIGFyZSBvZiB0aGUgUkVMIG9yIFJFTEEgdmFyaWV0eS4gICovCi0JZWxmX3NlY3Rpb25fZGF0YSAodGFyZ2V0X3NlY3QpLT51c2VfcmVsYV9wIAotCSAgPSAoaGRyLT5zaF90eXBlID09IFNIVF9SRUxBKTsKLQlhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hUX0dOVV92ZXJkZWY6Ci0gICAgICBlbGZfZHludmVyZGVmIChhYmZkKSA9IHNoaW5kZXg7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyID0gKmhkcjsKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9HTlVfdmVyc3ltOgotICAgICAgZWxmX2R5bnZlcnN5bSAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX2hkciA9ICpoZHI7Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfR05VX3Zlcm5lZWQ6Ci0gICAgICBlbGZfZHludmVycmVmIChhYmZkKSA9IHNoaW5kZXg7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfaGRyID0gKmhkcjsKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9TSExJQjoKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIENoZWNrIGZvciBhbnkgcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLwotICAgICAgewotCWlmIChiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKQotCSAgKCpiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKSAoYWJmZCwgaGRyLCBuYW1lKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2l2ZW4gYW4gRUxGIHNlY3Rpb24gbnVtYmVyLCByZXRyaWV2ZSB0aGUgY29ycmVzcG9uZGluZyBCRkQKLSAgIHNlY3Rpb24uICAqLwotCi1hc2VjdGlvbiAqCi1iZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICBCRkRfQVNTRVJUIChpbmRleCA+IDAgJiYgaW5kZXggPCBTSE5fTE9SRVNFUlZFKTsKLSAgaWYgKGluZGV4ID49IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtpbmRleF0tPmJmZF9zZWN0aW9uOwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICpzZGF0YTsKLQotICBzZGF0YSA9IChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICgqc2RhdGEpKTsKLSAgaWYgKCFzZGF0YSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNlYy0+dXNlZF9ieV9iZmQgPSAoUFRSKSBzZGF0YTsKLQotICAvKiBJbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHNlY3Rpb24gc2hvdWxkIHVzZSBSRUxBIHJlbG9jYXRpb25zLiAgKi8KLSAgc2RhdGEtPnVzZV9yZWxhX3AgCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmRlZmF1bHRfdXNlX3JlbGFfcDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IGJmZCBzZWN0aW9uIGZyb20gYW4gRUxGIHByb2dyYW0gaGVhZGVyLgotCi0gICBTaW5jZSBwcm9ncmFtIHNlZ21lbnRzIGhhdmUgbm8gbmFtZXMsIHdlIGdlbmVyYXRlIGEgc3ludGhldGljIG5hbWUKLSAgIG9mIHRoZSBmb3JtIHNlZ21lbnQ8TlVNPiwgd2hlcmUgTlVNIGlzIGdlbmVyYWxseSB0aGUgaW5kZXggaW4gdGhlCi0gICBwcm9ncmFtIGhlYWRlciB0YWJsZS4gIEZvciBzZWdtZW50cyB0aGF0IGFyZSBzcGxpdCAoc2VlIGJlbG93KSB3ZQotICAgZ2VuZXJhdGUgdGhlIG5hbWVzIHNlZ21lbnQ8TlVNPmEgYW5kIHNlZ21lbnQ8TlVNPmIuCi0KLSAgIE5vdGUgdGhhdCBzb21lIHByb2dyYW0gc2VnbWVudHMgbWF5IGhhdmUgYSBmaWxlIHNpemUgdGhhdCBpcyBkaWZmZXJlbnQgdGhhbgotICAgKGxlc3MgdGhhbikgdGhlIG1lbW9yeSBzaXplLiAgQWxsIHRoaXMgbWVhbnMgaXMgdGhhdCBhdCBleGVjdXRpb24gdGhlCi0gICBzeXN0ZW0gbXVzdCBhbGxvY2F0ZSB0aGUgYW1vdW50IG9mIG1lbW9yeSBzcGVjaWZpZWQgYnkgdGhlIG1lbW9yeSBzaXplLAotICAgYnV0IG9ubHkgaW5pdGlhbGl6ZSBpdCB3aXRoIHRoZSBmaXJzdCAiZmlsZSBzaXplIiBieXRlcyByZWFkIGZyb20gdGhlCi0gICBmaWxlLiAgVGhpcyB3b3VsZCBvY2N1ciBmb3IgZXhhbXBsZSwgd2l0aCBwcm9ncmFtIHNlZ21lbnRzIGNvbnNpc3RpbmcKLSAgIG9mIGNvbWJpbmVkIGRhdGErYnNzLgotCi0gICBUbyBoYW5kbGUgdGhlIGFib3ZlIHNpdHVhdGlvbiwgdGhpcyByb3V0aW5lIGdlbmVyYXRlcyBUV08gYmZkIHNlY3Rpb25zCi0gICBmb3IgdGhlIHNpbmdsZSBwcm9ncmFtIHNlZ21lbnQuICBUaGUgZmlyc3QgaGFzIHRoZSBsZW5ndGggc3BlY2lmaWVkIGJ5Ci0gICB0aGUgZmlsZSBzaXplIG9mIHRoZSBzZWdtZW50LCBhbmQgdGhlIHNlY29uZCBoYXMgdGhlIGxlbmd0aCBzcGVjaWZpZWQKLSAgIGJ5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzaXplcy4gIEluIGVmZmVjdCwgdGhlIHNlZ21lbnQgaXMgc3BsaXQKLSAgIGludG8gaXQncyBpbml0aWFsaXplZCBhbmQgdW5pbml0aWFsaXplZCBwYXJ0cy4KLQotICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsIHR5cGVuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9QaGRyICpoZHI7Ci0gICAgIGludCBpbmRleDsKLSAgICAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVidWZbNjRdOwotICBpbnQgc3BsaXQ7Ci0KLSAgc3BsaXQgPSAoKGhkci0+cF9tZW1zeiA+IDApCi0JICAgICYmIChoZHItPnBfZmlsZXN6ID4gMCkKLQkgICAgJiYgKGhkci0+cF9tZW1zeiA+IGhkci0+cF9maWxlc3opKTsKLSAgc3ByaW50ZiAobmFtZWJ1ZiwgIiVzJWQlcyIsIHR5cGVuYW1lLCBpbmRleCwgc3BsaXQgPyAiYSIgOiAiIik7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZWJ1ZikgKyAxKTsKLSAgaWYgKCFuYW1lKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyY3B5IChuYW1lLCBuYW1lYnVmKTsKLSAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAobmV3c2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3c2VjdC0+dm1hID0gaGRyLT5wX3ZhZGRyOwotICBuZXdzZWN0LT5sbWEgPSBoZHItPnBfcGFkZHI7Ci0gIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IGhkci0+cF9maWxlc3o7Ci0gIG5ld3NlY3QtPmZpbGVwb3MgPSBoZHItPnBfb2Zmc2V0OwotICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICBpZiAoaGRyLT5wX3R5cGUgPT0gUFRfTE9BRCkKLSAgICB7Ci0gICAgICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0gICAgICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfTE9BRDsKLSAgICAgIGlmIChoZHItPnBfZmxhZ3MgJiBQRl9YKQotCXsKLQkgIC8qIEZJWE1FOiBhbGwgd2Uga25vd24gaXMgdGhhdCBpdCBoYXMgZXhlY3V0ZSBQRVJNSVNTSU9OLAotCSAgICAgbWF5IGJlIGRhdGEuICovCi0JICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfQ09ERTsKLQl9Ci0gICAgfQotICBpZiAoIShoZHItPnBfZmxhZ3MgJiBQRl9XKSkKLSAgICB7Ci0gICAgICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0gICAgfQotCi0gIGlmIChzcGxpdCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChuYW1lYnVmLCAiJXMlZGIiLCB0eXBlbmFtZSwgaW5kZXgpOwotICAgICAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lYnVmKSArIDEpOwotICAgICAgaWYgKCFuYW1lKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN0cmNweSAobmFtZSwgbmFtZWJ1Zik7Ci0gICAgICBuZXdzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gICAgICBpZiAobmV3c2VjdCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5ld3NlY3QtPnZtYSA9IGhkci0+cF92YWRkciArIGhkci0+cF9maWxlc3o7Ci0gICAgICBuZXdzZWN0LT5sbWEgPSBoZHItPnBfcGFkZHIgKyBoZHItPnBfZmlsZXN6OwotICAgICAgbmV3c2VjdC0+X3Jhd19zaXplID0gaGRyLT5wX21lbXN6IC0gaGRyLT5wX2ZpbGVzejsKLSAgICAgIGlmIChoZHItPnBfdHlwZSA9PSBQVF9MT0FEKQotCXsKLQkgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19BTExPQzsKLQkgIGlmIChoZHItPnBfZmxhZ3MgJiBQRl9YKQotCSAgICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfQ09ERTsKLQl9Ci0gICAgICBpZiAoIShoZHItPnBfZmxhZ3MgJiBQRl9XKSkKLQluZXdzZWN0LT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1iZmRfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKmhkcjsKLSAgICAgaW50IGluZGV4OwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIHN3aXRjaCAoaGRyLT5wX3R5cGUpCi0gICAgewotICAgIGNhc2UgUFRfTlVMTDoKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAibnVsbCIpOwotCi0gICAgY2FzZSBQVF9MT0FEOgotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJsb2FkIik7Ci0KLSAgICBjYXNlIFBUX0RZTkFNSUM6Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgImR5bmFtaWMiKTsKLQotICAgIGNhc2UgUFRfSU5URVJQOgotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJpbnRlcnAiKTsKLQotICAgIGNhc2UgUFRfTk9URToKLSAgICAgIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJub3RlIikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZWxmY29yZV9yZWFkX25vdGVzIChhYmZkLCBoZHItPnBfb2Zmc2V0LCBoZHItPnBfZmlsZXN6KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgUFRfU0hMSUI6Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgInNobGliIik7Ci0KLSAgICBjYXNlIFBUX1BIRFI6Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgInBoZHIiKTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBDaGVjayBmb3IgYW55IHByb2Nlc3Nvci1zcGVjaWZpYyBwcm9ncmFtIHNlZ21lbnQgdHlwZXMuCi0gICAgICAgICBJZiBubyBoYW5kbGVyIGZvciB0aGVtLCBkZWZhdWx0IHRvIG1ha2luZyAic2VnbWVudCIgc2VjdGlvbnMuICovCi0gICAgICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gICAgICBpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkcikKLQlyZXR1cm4gKCpiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyKSAoYWJmZCwgaGRyLCBpbmRleCk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJzZWdtZW50Iik7Ci0gICAgfQotfQotCi0vKiBJbml0aWFsaXplIFJFTF9IRFIsIHRoZSBzZWN0aW9uLWhlYWRlciBmb3IgbmV3IHNlY3Rpb24sIGNvbnRhaW5pbmcKLSAgIHJlbG9jYXRpb25zIGFnYWluc3QgQVNFQ1QuICBJZiBVU0VfUkVMQV9QIGlzIHRydWUsIHdlIHVzZSBSRUxBCi0gICByZWxvY2F0aW9uczsgb3RoZXJ3aXNlLCB3ZSB1c2UgUkVMIHJlbG9jYXRpb25zLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyIChhYmZkLCByZWxfaGRyLCBhc2VjdCwgdXNlX3JlbGFfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBib29sZWFuIHVzZV9yZWxhX3A7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgIi5yZWxhIiArIHN0cmxlbiAoYXNlY3QtPm5hbWUpKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNwcmludGYgKG5hbWUsICIlcyVzIiwgdXNlX3JlbGFfcCA/ICIucmVsYSIgOiAiLnJlbCIsIGFzZWN0LT5uYW1lKTsKLSAgcmVsX2hkci0+c2hfbmFtZSA9Ci0gICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfc2hzdHJ0YWIgKGFiZmQpLCBuYW1lLAotCQkJCSAgICAgICB0cnVlLCBmYWxzZSk7Ci0gIGlmIChyZWxfaGRyLT5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmVsX2hkci0+c2hfdHlwZSA9IHVzZV9yZWxhX3AgPyBTSFRfUkVMQSA6IFNIVF9SRUw7Ci0gIHJlbF9oZHItPnNoX2VudHNpemUgPSAodXNlX3JlbGFfcAotCQkJID8gYmVkLT5zLT5zaXplb2ZfcmVsYQotCQkJIDogYmVkLT5zLT5zaXplb2ZfcmVsKTsKLSAgcmVsX2hkci0+c2hfYWRkcmFsaWduID0gYmVkLT5zLT5maWxlX2FsaWduOwotICByZWxfaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHJlbF9oZHItPnNoX2FkZHIgPSAwOwotICByZWxfaGRyLT5zaF9zaXplID0gMDsKLSAgcmVsX2hkci0+c2hfb2Zmc2V0ID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHVwIGFuIEVMRiBpbnRlcm5hbCBzZWN0aW9uIGhlYWRlciBmb3IgYSBzZWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGFzZWN0LCBmYWlsZWRwdHJhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBQVFIgZmFpbGVkcHRyYXJnOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBib29sZWFuICpmYWlsZWRwdHIgPSAoYm9vbGVhbiAqKSBmYWlsZWRwdHJhcmc7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICp0aGlzX2hkcjsKLQotICBpZiAoKmZhaWxlZHB0cikKLSAgICB7Ci0gICAgICAvKiBXZSBhbHJlYWR5IGZhaWxlZDsganVzdCBnZXQgb3V0IG9mIHRoZSBiZmRfbWFwX292ZXJfc2VjdGlvbnMKLSAgICAgICAgIGxvb3AuICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0aGlzX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCktPnRoaXNfaGRyOwotCi0gIHRoaXNfaGRyLT5zaF9uYW1lID0gKHVuc2lnbmVkIGxvbmcpIF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX3Noc3RydGFiIChhYmZkKSwKLQkJCQkJCQkgIGFzZWN0LT5uYW1lLAotCQkJCQkJCSAgdHJ1ZSwgZmFsc2UpOwotICBpZiAodGhpc19oZHItPnNoX25hbWUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotICAgIHsKLSAgICAgICpmYWlsZWRwdHIgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0aGlzX2hkci0+c2hfZmxhZ3MgPSAwOwotCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0gICAgICB8fCBhc2VjdC0+dXNlcl9zZXRfdm1hKQotICAgIHRoaXNfaGRyLT5zaF9hZGRyID0gYXNlY3QtPnZtYTsKLSAgZWxzZQotICAgIHRoaXNfaGRyLT5zaF9hZGRyID0gMDsKLQotICB0aGlzX2hkci0+c2hfb2Zmc2V0ID0gMDsKLSAgdGhpc19oZHItPnNoX3NpemUgPSBhc2VjdC0+X3Jhd19zaXplOwotICB0aGlzX2hkci0+c2hfbGluayA9IDA7Ci0gIHRoaXNfaGRyLT5zaF9hZGRyYWxpZ24gPSAxIDw8IGFzZWN0LT5hbGlnbm1lbnRfcG93ZXI7Ci0gIC8qIFRoZSBzaF9lbnRzaXplIGFuZCBzaF9pbmZvIGZpZWxkcyBtYXkgaGF2ZSBiZWVuIHNldCBhbHJlYWR5IGJ5Ci0gICAgIGNvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEuICAqLwotCi0gIHRoaXNfaGRyLT5iZmRfc2VjdGlvbiA9IGFzZWN0OwotICB0aGlzX2hkci0+Y29udGVudHMgPSBOVUxMOwotCi0gIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYmFzZWQgb24gc2VjdGlvbiBuYW1lcy4gICovCi0gIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmR5bnN0ciIpID09IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmhhc2giKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0hBU0g7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX2hhc2hfZW50cnk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmR5bnN5bSIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfRFlOU1lNOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9zeW07Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmR5bmFtaWMiKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0RZTkFNSUM7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX2R5bjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGFzZWN0LT5uYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JICAgJiYgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5tYXlfdXNlX3JlbGFfcCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9SRUxBOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9yZWxhOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIucmVsIiwgNCkgPT0gMAotCSAgICYmIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+bWF5X3VzZV9yZWxfcCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9SRUw7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3JlbDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGFzZWN0LT5uYW1lLCAiLm5vdGUiLCA1KSA9PSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX05PVEU7Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGFzZWN0LT5uYW1lLCAiLnN0YWIiLCA1KSA9PSAwCi0JICAgJiYgc3RyY21wIChhc2VjdC0+bmFtZSArIHN0cmxlbiAoYXNlY3QtPm5hbWUpIC0gMywgInN0ciIpID09IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmdudS52ZXJzaW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9HTlVfdmVyc3ltOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5nbnUudmVyc2lvbl9kIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9HTlVfdmVyZGVmOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSAwOwotICAgICAgLyogb2JqY29weSBvciBzdHJpcCB3aWxsIGNvcHkgb3ZlciBzaF9pbmZvLCBidXQgbWF5IG5vdCBzZXQKLSAgICAgICAgIGN2ZXJkZWZzLiAgVGhlIGxpbmtlciB3aWxsIHNldCBjdmVyZGVmcywgYnV0IHNoX2luZm8gd2lsbCBiZQotICAgICAgICAgemVyby4gICovCi0gICAgICBpZiAodGhpc19oZHItPnNoX2luZm8gPT0gMCkKLQl0aGlzX2hkci0+c2hfaW5mbyA9IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzOwotICAgICAgZWxzZQotCUJGRF9BU1NFUlQgKGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzID09IDAKLQkJICAgIHx8IHRoaXNfaGRyLT5zaF9pbmZvID09IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZ251LnZlcnNpb25fciIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfR05VX3Zlcm5lZWQ7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICAvKiBvYmpjb3B5IG9yIHN0cmlwIHdpbGwgY29weSBvdmVyIHNoX2luZm8sIGJ1dCBtYXkgbm90IHNldAotICAgICAgICAgY3ZlcnJlZnMuICBUaGUgbGlua2VyIHdpbGwgc2V0IGN2ZXJyZWZzLCBidXQgc2hfaW5mbyB3aWxsIGJlCi0gICAgICAgICB6ZXJvLiAgKi8KLSAgICAgIGlmICh0aGlzX2hkci0+c2hfaW5mbyA9PSAwKQotCXRoaXNfaGRyLT5zaF9pbmZvID0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcnJlZnM7Ci0gICAgICBlbHNlCi0JQkZEX0FTU0VSVCAoZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcnJlZnMgPT0gMAotCQkgICAgfHwgdGhpc19oZHItPnNoX2luZm8gPT0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcnJlZnMpOwotICAgIH0KLSAgZWxzZSBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICYmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLSAgZWxzZSBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICYmICgoYXNlY3QtPmZsYWdzICYgU0VDX0xPQUQpID09IDApKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX05PQklUUzsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdobyBrbm93cz8gICovCi0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLSAgICB9Ci0KLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgdGhpc19oZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0gICAgdGhpc19oZHItPnNoX2ZsYWdzIHw9IFNIRl9XUklURTsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLSAgICB0aGlzX2hkci0+c2hfZmxhZ3MgfD0gU0hGX0VYRUNJTlNUUjsKLQotICAvKiBDaGVjayBmb3IgcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zKQotICAgICgqYmVkLT5lbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zKSAoYWJmZCwgdGhpc19oZHIsIGFzZWN0KTsKLQotICAvKiBJZiB0aGUgc2VjdGlvbiBoYXMgcmVsb2NzLCBzZXQgdXAgYSBzZWN0aW9uIGhlYWRlciBmb3IgdGhlCi0gICAgIFNIVF9SRUxbQV0gc2VjdGlvbi4gIElmIHR3byByZWxvY2F0aW9uIHNlY3Rpb25zIGFyZSByZXF1aXJlZCBmb3IKLSAgICAgdGhpcyBzZWN0aW9uLCBpdCBpcyB1cCB0byB0aGUgcHJvY2Vzc29yLXNwZWNpZmljIGJhY2stZW5kIHRvCi0gICAgIGNyZWF0ZSB0aGUgb3RoZXIuICAqLyAKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmICFfYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIgKGFiZmQsIAotCQkJCSAgICAmZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpLT5yZWxfaGRyLAotCQkJCSAgICBhc2VjdCwgCi0JCQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KS0+dXNlX3JlbGFfcCkpCi0gICAgKmZhaWxlZHB0ciA9IHRydWU7Ci19Ci0KLS8qIEFzc2lnbiBhbGwgRUxGIHNlY3Rpb24gbnVtYmVycy4gIFRoZSBkdW1teSBmaXJzdCBzZWN0aW9uIGlzIGhhbmRsZWQgaGVyZQotICAgdG9vLiAgVGhlIGxpbmsvaW5mbyBwb2ludGVycyBmb3IgdGhlIHN0YW5kYXJkIHNlY3Rpb24gdHlwZXMgYXJlIGZpbGxlZAotICAgaW4gaGVyZSB0b28sIHdoaWxlIHdlJ3JlIGF0IGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFzc2lnbl9zZWN0aW9uX251bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKnQgPSBlbGZfdGRhdGEgKGFiZmQpOwotICBhc2VjdGlvbiAqc2VjOwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9udW1iZXI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICBzZWN0aW9uX251bWJlciA9IDE7Ci0KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICpkID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKTsKLQotICAgICAgZC0+dGhpc19pZHggPSBzZWN0aW9uX251bWJlcisrOwotICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotCWQtPnJlbF9pZHggPSAwOwotICAgICAgZWxzZQotCWQtPnJlbF9pZHggPSBzZWN0aW9uX251bWJlcisrOwotCi0gICAgICBpZiAoZC0+cmVsX2hkcjIpCi0JZC0+cmVsX2lkeDIgPSBzZWN0aW9uX251bWJlcisrOwotICAgICAgZWxzZQotCWQtPnJlbF9pZHgyID0gMDsKLSAgICB9Ci0KLSAgdC0+c2hzdHJ0YWJfc2VjdGlvbiA9IHNlY3Rpb25fbnVtYmVyKys7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4ID0gdC0+c2hzdHJ0YWJfc2VjdGlvbjsKLSAgdC0+c2hzdHJ0YWJfaGRyLnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfc2hzdHJ0YWIgKGFiZmQpKTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIHQtPnN5bXRhYl9zZWN0aW9uID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICAgIHQtPnN0cnRhYl9zZWN0aW9uID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW0gPSBzZWN0aW9uX251bWJlcjsKLQotICAvKiBTZXQgdXAgdGhlIGxpc3Qgb2Ygc2VjdGlvbiBoZWFkZXIgcG9pbnRlcnMsIGluIGFncmVlbWVudCB3aXRoIHRoZQotICAgICBpbmRpY2VzLiAgKi8KLSAgaV9zaGRycCA9ICgoRWxmX0ludGVybmFsX1NoZHIgKiopCi0JICAgICBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb25fbnVtYmVyICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkciAqKSkpOwotICBpZiAoaV9zaGRycCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpX3NoZHJwWzBdID0gKChFbGZfSW50ZXJuYWxfU2hkciAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKSk7Ci0gIGlmIChpX3NoZHJwWzBdID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGlfc2hkcnApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbWVtc2V0IChpX3NoZHJwWzBdLCAwLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSk7Ci0KLSAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKSA9IGlfc2hkcnA7Ci0KLSAgaV9zaGRycFt0LT5zaHN0cnRhYl9zZWN0aW9uXSA9ICZ0LT5zaHN0cnRhYl9oZHI7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgaV9zaGRycFt0LT5zeW10YWJfc2VjdGlvbl0gPSAmdC0+c3ltdGFiX2hkcjsKLSAgICAgIGlfc2hkcnBbdC0+c3RydGFiX3NlY3Rpb25dID0gJnQtPnN0cnRhYl9oZHI7Ci0gICAgICB0LT5zeW10YWJfaGRyLnNoX2xpbmsgPSB0LT5zdHJ0YWJfc2VjdGlvbjsKLSAgICB9Ci0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqZCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyk7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIGlfc2hkcnBbZC0+dGhpc19pZHhdID0gJmQtPnRoaXNfaGRyOwotICAgICAgaWYgKGQtPnJlbF9pZHggIT0gMCkKLQlpX3NoZHJwW2QtPnJlbF9pZHhdID0gJmQtPnJlbF9oZHI7Ci0gICAgICBpZiAoZC0+cmVsX2lkeDIgIT0gMCkKLQlpX3NoZHJwW2QtPnJlbF9pZHgyXSA9IGQtPnJlbF9oZHIyOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBzaF9saW5rIGFuZCBzaF9pbmZvIGZpZWxkcyB3aGlsZSB3ZSdyZSBhdCBpdC4gICovCi0KLSAgICAgIC8qIHNoX2xpbmsgb2YgYSByZWxvYyBzZWN0aW9uIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzeW1ib2wKLQkgdGFibGUuICBzaF9pbmZvIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzZWN0aW9uIHRvIHdoaWNoCi0JIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgYXBwbHkuICAqLwotICAgICAgaWYgKGQtPnJlbF9pZHggIT0gMCkKLQl7Ci0JICBkLT5yZWxfaGRyLnNoX2xpbmsgPSB0LT5zeW10YWJfc2VjdGlvbjsKLQkgIGQtPnJlbF9oZHIuc2hfaW5mbyA9IGQtPnRoaXNfaWR4OwotCX0KLSAgICAgIGlmIChkLT5yZWxfaWR4MiAhPSAwKQotCXsKLQkgIGQtPnJlbF9oZHIyLT5zaF9saW5rID0gdC0+c3ltdGFiX3NlY3Rpb247Ci0JICBkLT5yZWxfaGRyMi0+c2hfaW5mbyA9IGQtPnRoaXNfaWR4OwotCX0KLQotICAgICAgc3dpdGNoIChkLT50aGlzX2hkci5zaF90eXBlKQotCXsKLQljYXNlIFNIVF9SRUw6Ci0JY2FzZSBTSFRfUkVMQToKLQkgIC8qIEEgcmVsb2Mgc2VjdGlvbiB3aGljaCB3ZSBhcmUgdHJlYXRpbmcgYXMgYSBub3JtYWwgQkZECi0JICAgICBzZWN0aW9uLiAgc2hfbGluayBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc3ltYm9sCi0JICAgICB0YWJsZS4gIHNoX2luZm8gaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHNlY3Rpb24gdG8KLQkgICAgIHdoaWNoIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgYXBwbHkuICBXZSBhc3N1bWUgdGhhdCBhbgotCSAgICAgYWxsb2NhdGVkIHJlbG9jIHNlY3Rpb24gdXNlcyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JICAgICBGSVhNRTogSG93IGNhbiB3ZSBiZSBzdXJlPyAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGQtPnRoaXNfaGRyLnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0KLQkgIC8qIFdlIGxvb2sgdXAgdGhlIHNlY3Rpb24gdGhlIHJlbG9jcyBhcHBseSB0byBieSBuYW1lLiAgKi8KLQkgIG5hbWUgPSBzZWMtPm5hbWU7Ci0JICBpZiAoZC0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMKQotCSAgICBuYW1lICs9IDQ7Ci0JICBlbHNlCi0JICAgIG5hbWUgKz0gNTsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBkLT50aGlzX2hkci5zaF9pbmZvID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9TVFJUQUI6Ci0JICAvKiBXZSBhc3N1bWUgdGhhdCBhIHNlY3Rpb24gbmFtZWQgLnN0YWIqc3RyIGlzIGEgc3RhYnMKLQkgICAgIHN0cmluZyBzZWN0aW9uLiAgV2UgbG9vayBmb3IgYSBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZQotCSAgICAgYnV0IHdpdGhvdXQgdGhlIHRyYWlsaW5nIGBgc3RyJycsIGFuZCBzZXQgaXRzIHNoX2xpbmsKLQkgICAgIGZpZWxkIHRvIHBvaW50IHRvIHRoaXMgc2VjdGlvbi4gICovCi0JICBpZiAoc3RybmNtcCAoc2VjLT5uYW1lLCAiLnN0YWIiLCBzaXplb2YgIi5zdGFiIiAtIDEpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKHNlYy0+bmFtZSArIHN0cmxlbiAoc2VjLT5uYW1lKSAtIDMsICJzdHIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQkgICAgICBjaGFyICphbGM7Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKHNlYy0+bmFtZSk7Ci0JICAgICAgYWxjID0gKGNoYXIgKikgYmZkX21hbGxvYyAobGVuIC0gMik7Ci0JICAgICAgaWYgKGFsYyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc3RybmNweSAoYWxjLCBzZWMtPm5hbWUsIGxlbiAtIDMpOwotCSAgICAgIGFsY1tsZW4gLSAzXSA9ICdcMCc7Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBhbGMpOwotCSAgICAgIGZyZWUgKGFsYyk7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9saW5rID0gZC0+dGhpc19pZHg7Ci0KLQkJICAvKiBUaGlzIGlzIGEgLnN0YWIgc2VjdGlvbi4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCQkgICAgNCArIDIgKiAoYmVkLT5zLT5hcmNoX3NpemUgLyA4KTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0RZTkFNSUM6Ci0JY2FzZSBTSFRfRFlOU1lNOgotCWNhc2UgU0hUX0dOVV92ZXJuZWVkOgotCWNhc2UgU0hUX0dOVV92ZXJkZWY6Ci0JICAvKiBzaF9saW5rIGlzIHRoZSBzZWN0aW9uIGhlYWRlciBpbmRleCBvZiB0aGUgc3RyaW5nIHRhYmxlCi0JICAgICB1c2VkIGZvciB0aGUgZHluYW1pYyBlbnRyaWVzLCBvciB0aGUgc3ltYm9sIHRhYmxlLCBvciB0aGUKLQkgICAgIHZlcnNpb24gc3RyaW5ncy4gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3RyIik7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBkLT50aGlzX2hkci5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9IQVNIOgotCWNhc2UgU0hUX0dOVV92ZXJzeW06Ci0JICAvKiBzaF9saW5rIGlzIHRoZSBzZWN0aW9uIGhlYWRlciBpbmRleCBvZiB0aGUgc3ltYm9sIHRhYmxlCi0JICAgICB0aGlzIGhhc2ggdGFibGUgb3IgdmVyc2lvbiB0YWJsZSBpcyBmb3IuICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgZC0+dGhpc19oZHIuc2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hcCBzeW1ib2wgZnJvbSBpdCdzIGludGVybmFsIG51bWJlciB0byB0aGUgZXh0ZXJuYWwgbnVtYmVyLCBtb3ZpbmcKLSAgIGFsbCBsb2NhbCBzeW1ib2xzIHRvIGJlIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLXN5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIC8qIElmIHRoZSBiYWNrZW5kIGhhcyBhIHNwZWNpYWwgbWFwcGluZywgdXNlIGl0LiAgKi8KLSAgaWYgKGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCkKLSAgICByZXR1cm4gKCgqZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKQotCSAgICAoYWJmZCwgc3ltKSk7Ci0KLSAgcmV0dXJuICgoc3ltLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKSAhPSAwCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGZfbWFwX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGFzeW1ib2wgKipzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgYXN5bWJvbCAqKnNlY3Rfc3ltczsKLSAgaW50IG51bV9sb2NhbHMgPSAwOwotICBpbnQgbnVtX2dsb2JhbHMgPSAwOwotICBpbnQgbnVtX2xvY2FsczIgPSAwOwotICBpbnQgbnVtX2dsb2JhbHMyID0gMDsKLSAgaW50IG1heF9pbmRleCA9IDA7Ci0gIGludCBudW1fc2VjdGlvbnMgPSAwOwotICBpbnQgaWR4OwotICBhc2VjdGlvbiAqYXNlY3Q7Ci0gIGFzeW1ib2wgKipuZXdfc3ltczsKLSAgYXN5bWJvbCAqc3ltOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiZWxmX21hcF9zeW1ib2xzXG4iKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotI2VuZGlmCi0KLSAgLyogQWRkIGEgc2VjdGlvbiBzeW1ib2wgZm9yIGVhY2ggQkZEIHNlY3Rpb24uICBGSVhNRTogSXMgdGhpcyByZWFsbHkKLSAgICAgbmVjZXNzYXJ5PyAgKi8KLSAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobWF4X2luZGV4IDwgYXNlY3QtPmluZGV4KQotCW1heF9pbmRleCA9IGFzZWN0LT5pbmRleDsKLSAgICB9Ci0KLSAgbWF4X2luZGV4Kys7Ci0gIHNlY3Rfc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBtYXhfaW5kZXggKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZiAoc2VjdF9zeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbGZfc2VjdGlvbl9zeW1zIChhYmZkKSA9IHNlY3Rfc3ltczsKLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHN5bWNvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBzeW0gPSBzeW1zW2lkeF07Ci0gICAgICAKLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAotCSAgJiYgc3ltLT52YWx1ZSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIHNlYyA9IHN5bS0+c2VjdGlvbjsKLQotCSAgaWYgKHNlYy0+b3duZXIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChzZWMtPm93bmVyICE9IGFiZmQpCi0JCXsKLQkJICBpZiAoc2VjLT5vdXRwdXRfb2Zmc2V0ICE9IDApCi0JCSAgICBjb250aW51ZTsKLQkJICAKLQkJICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCi0JCSAgLyogRW1wdHkgc2VjdGlvbnMgaW4gdGhlIGlucHV0IGZpbGVzIG1heSBoYXZlIGhhZCBhIHNlY3Rpb24KLQkJICAgICBzeW1ib2wgY3JlYXRlZCBmb3IgdGhlbS4gIChTZWUgdGhlIGNvbW1lbnQgbmVhciB0aGUgZW5kIG9mCi0JCSAgICAgX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMgaW4gbGlua2VyLmMpLiAgSWYgdGhlIGxpbmtlcgotCQkgICAgIHNjcmlwdCBkaXNjYXJkcyBzdWNoIHNlY3Rpb25zIHRoZW4gd2Ugd2lsbCByZWFjaCB0aGlzIHBvaW50LgotCQkgICAgIFNpbmNlIHdlIGtub3cgdGhhdCB3ZSBjYW5ub3QgYXZvaWQgdGhpcyBjYXNlLCB3ZSBkZXRlY3QgaXQKLQkJICAgICBhbmQgc2tpcCB0aGUgYWJvcnQgYW5kIHRoZSBhc3NpZ25tZW50IHRvIHRoZSBzZWN0X3N5bXMgYXJyYXkuCi0JCSAgICAgVG8gcmVwcm9kdWNlIHRoaXMgcGFydGljdWxhciBjYXNlIHRyeSBydW5uaW5nIHRoZSBsaW5rZXIKLQkJICAgICB0ZXN0c3VpdGUgdGVzdCBsZC1zY3JpcHRzL3dlYWsuZXhwIGZvciBhbiBFTEYgcG9ydCB0aGF0IHVzZXMKLQkJICAgICB0aGUgZ2VuZXJpYyBsaW5rZXIuICAqLwotCQkgIGlmIChzZWMtPm93bmVyID09IE5VTEwpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIEJGRF9BU1NFUlQgKHNlYy0+b3duZXIgPT0gYWJmZCk7Ci0JCX0KLQkgICAgICBzZWN0X3N5bXNbc2VjLT5pbmRleF0gPSBzeW1zW2lkeF07Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYXNlY3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdICE9IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3ltLT50aGVfYmZkID0gYWJmZDsKLSAgICAgIHN5bS0+bmFtZSA9IGFzZWN0LT5uYW1lOwotICAgICAgc3ltLT52YWx1ZSA9IDA7Ci0gICAgICAvKiBTZXQgdGhlIGZsYWdzIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIG9uZSB3YXMgbmV3bHkgYWRkZWQuICAqLwotICAgICAgc3ltLT5mbGFncyA9IDA7Ci0gICAgICBzeW0tPnNlY3Rpb24gPSBhc2VjdDsKLSAgICAgIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdID0gc3ltOwotICAgICAgbnVtX3NlY3Rpb25zKys7Ci0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSBfKCJjcmVhdGluZyBzZWN0aW9uIHN5bWJvbCwgbmFtZSA9ICVzLCB2YWx1ZSA9IDB4JS44bHgsIGluZGV4ID0gJWQsIHNlY3Rpb24gPSAweCUuOGx4XG4iKSwKLQkgICAgICAgYXNlY3QtPm5hbWUsIChsb25nKSBhc2VjdC0+dm1hLCBhc2VjdC0+aW5kZXgsIChsb25nKSBhc2VjdCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogQ2xhc3NpZnkgYWxsIG9mIHRoZSBzeW1ib2xzLiAgKi8KLSAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzeW1zW2lkeF0pKQotCW51bV9sb2NhbHMrKzsKLSAgICAgIGVsc2UKLQludW1fZ2xvYmFscysrOwotICAgIH0KLSAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0gIT0gTlVMTAotCSAgJiYgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID09IDApCi0JewotCSAgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSkpCi0JICAgIG51bV9sb2NhbHMrKzsKLQkgIGVsc2UKLQkgICAgbnVtX2dsb2JhbHMrKzsKLQkgIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdLT5mbGFncyA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgc29ydCB0aGUgc3ltYm9scyBzbyB0aGUgbG9jYWwgc3ltYm9scyBhcmUgZmlyc3QuICAqLwotICBuZXdfc3ltcyA9ICgoYXN5bWJvbCAqKikKLQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgKG51bV9sb2NhbHMgKyBudW1fZ2xvYmFscykgKiBzaXplb2YgKGFzeW1ib2wgKikpKTsKLSAgaWYgKG5ld19zeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc3ltY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bSA9IHN5bXNbaWR4XTsKLSAgICAgIGludCBpOwotCi0gICAgICBpZiAoIXN5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkpCi0JaSA9IG51bV9sb2NhbHMyKys7Ci0gICAgICBlbHNlCi0JaSA9IG51bV9sb2NhbHMgKyBudW1fZ2xvYmFsczIrKzsKLSAgICAgIG5ld19zeW1zW2ldID0gc3ltOwotICAgICAgc3ltLT51ZGF0YS5pID0gaSArIDE7Ci0gICAgfQotICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFzZWN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSAhPSBOVUxMCi0JICAmJiBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XS0+ZmxhZ3MgPT0gMCkKLQl7Ci0JICBhc3ltYm9sICpzeW0gPSBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XTsKLQkgIGludCBpOwotCi0JICBzeW0tPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pKQotCSAgICBpID0gbnVtX2xvY2FsczIrKzsKLQkgIGVsc2UKLQkgICAgaSA9IG51bV9sb2NhbHMgKyBudW1fZ2xvYmFsczIrKzsKLQkgIG5ld19zeW1zW2ldID0gc3ltOwotCSAgc3ltLT51ZGF0YS5pID0gaSArIDE7Ci0JfQotICAgIH0KLQotICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgbmV3X3N5bXMsIG51bV9sb2NhbHMgKyBudW1fZ2xvYmFscyk7Ci0KLSAgZWxmX251bV9sb2NhbHMgKGFiZmQpID0gbnVtX2xvY2FsczsKLSAgZWxmX251bV9nbG9iYWxzIChhYmZkKSA9IG51bV9nbG9iYWxzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxpZ24gdG8gdGhlIG1heGltdW0gZmlsZSBhbGlnbm1lbnQgdGhhdCBjb3VsZCBiZSByZXF1aXJlZCBmb3IgYW55Ci0gICBFTEYgZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgSU5MSU5FIGZpbGVfcHRyIGFsaWduX2ZpbGVfcG9zaXRpb24gUEFSQU1TICgoZmlsZV9wdHIsIGludCkpOwotc3RhdGljIElOTElORSBmaWxlX3B0cgotYWxpZ25fZmlsZV9wb3NpdGlvbiAob2ZmLCBhbGlnbikKLSAgICAgZmlsZV9wdHIgb2ZmOwotICAgICBpbnQgYWxpZ247Ci17Ci0gIHJldHVybiAob2ZmICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKTsKLX0KLQotLyogQXNzaWduIGEgZmlsZSBwb3NpdGlvbiB0byBhIHNlY3Rpb24sIG9wdGlvbmFsbHkgYWxpZ25pbmcgdG8gdGhlCi0gICByZXF1aXJlZCBzZWN0aW9uIGFsaWdubWVudC4gICovCi0KLUlOTElORSBmaWxlX3B0cgotX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGlfc2hkcnAsIG9mZnNldCwgYWxpZ24pCi0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICppX3NoZHJwOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gYWxpZ247Ci17Ci0gIGlmIChhbGlnbikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWw7Ci0KLSAgICAgIGFsID0gaV9zaGRycC0+c2hfYWRkcmFsaWduOwotICAgICAgaWYgKGFsID4gMSkKLQlvZmZzZXQgPSBCRkRfQUxJR04gKG9mZnNldCwgYWwpOwotICAgIH0KLSAgaV9zaGRycC0+c2hfb2Zmc2V0ID0gb2Zmc2V0OwotICBpZiAoaV9zaGRycC0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICBpX3NoZHJwLT5iZmRfc2VjdGlvbi0+ZmlsZXBvcyA9IG9mZnNldDsKLSAgaWYgKGlfc2hkcnAtPnNoX3R5cGUgIT0gU0hUX05PQklUUykKLSAgICBvZmZzZXQgKz0gaV9zaGRycC0+c2hfc2l6ZTsKLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgd2UgYXJlIGdvaW5nIHRvIHB1dCB0aGUgc2VjdGlvbnMgYXQsIGFuZAotICAgb3RoZXJ3aXNlIHByZXBhcmUgdG8gYmVnaW4gd3JpdGluZyBvdXQgdGhlIEVMRiBmaWxlLiAgSWYgTElOS19JTkZPCi0gICBpcyBub3QgTlVMTCwgdGhpcyBpcyBiZWluZyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGJvb2xlYW4gZmFpbGVkOwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzaHN0cnRhYl9oZHI7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRG8gYW55IGVsZiBiYWNrZW5kIHNwZWNpZmljIHByb2Nlc3NpbmcgZmlyc3QuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKQotICAgICgqYmVkLT5lbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKSAoYWJmZCwgbGlua19pbmZvKTsKLQotICBpZiAoISBwcmVwX2hlYWRlcnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQb3N0IHByb2Nlc3MgdGhlIGhlYWRlcnMgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKSAoYWJmZCwgbGlua19pbmZvKTsKLQotICBmYWlsZWQgPSBmYWxzZTsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBlbGZfZmFrZV9zZWN0aW9ucywgJmZhaWxlZCk7Ci0gIGlmIChmYWlsZWQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghYXNzaWduX3NlY3Rpb25fbnVtYmVycyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBiYWNrZW5kIGxpbmtlciBidWlsZHMgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGl0c2VsZi4gICovCi0gIGlmIChsaW5rX2luZm8gPT0gTlVMTCAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgLyogTm9uLXplcm8gaWYgZG9pbmcgYSByZWxvY2F0YWJsZSBsaW5rLiAgKi8KLSAgICAgIGludCByZWxvY2F0YWJsZV9wID0gISAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpOwotCi0gICAgICBpZiAoISBzd2FwX291dF9zeW1zIChhYmZkLCAmc3RydGFiLCByZWxvY2F0YWJsZV9wKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHNoc3RydGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHI7Ci0gIC8qIHNoX25hbWUgd2FzIHNldCBpbiBwcmVwX2hlYWRlcnMuICAqLwotICBzaHN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBzaHN0cnRhYl9oZHItPnNoX2ZsYWdzID0gMDsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9hZGRyID0gMDsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX3Noc3RydGFiIChhYmZkKSk7Ci0gIHNoc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gIHNoc3RydGFiX2hkci0+c2hfbGluayA9IDA7Ci0gIHNoc3RydGFiX2hkci0+c2hfaW5mbyA9IDA7Ci0gIC8qIHNoX29mZnNldCBpcyBzZXQgaW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MuICAqLwotICBzaHN0cnRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDE7Ci0KLSAgaWYgKCFhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChsaW5rX2luZm8gPT0gTlVMTCAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgZmlsZV9wdHIgb2ZmOwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotICAgICAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKLQotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gICAgICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsIHRydWUpOwotCi0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKLSAgICAgIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChoZHIsIG9mZiwgdHJ1ZSk7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7Ci0KLSAgICAgIC8qIE5vdyB0aGF0IHdlIGtub3cgd2hlcmUgdGhlIC5zdHJ0YWIgc2VjdGlvbiBnb2VzLCB3cml0ZSBpdAotICAgICAgICAgb3V0LiAgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAhIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIHN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoc3RydGFiKTsKLSAgICB9Ci0KLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBhIHNldCBvZiBzZWN0aW9ucyB0byBhIHByb2dyYW0gc2VnbWVudC4gICovCi0KLXN0YXRpYyBJTkxJTkUgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqCi1tYWtlX21hcHBpbmcgKGFiZmQsIHNlY3Rpb25zLCBmcm9tLCB0bywgcGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotICAgICB1bnNpZ25lZCBpbnQgZnJvbTsKLSAgICAgdW5zaWduZWQgaW50IHRvOwotICAgICBib29sZWFuIHBoZHI7Ci17Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIHVuc2lnbmVkIGludCBpOwotICBhc2VjdGlvbiAqKmhkcnBwOwotCi0gIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLSAgICAgICBiZmRfemFsbG9jIChhYmZkLAotCQkgICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQotCQkgICAgKyAodG8gLSBmcm9tIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOwotICBpZiAobSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBtLT5uZXh0ID0gTlVMTDsKLSAgbS0+cF90eXBlID0gUFRfTE9BRDsKLSAgZm9yIChpID0gZnJvbSwgaGRycHAgPSBzZWN0aW9ucyArIGZyb207IGkgPCB0bzsgaSsrLCBoZHJwcCsrKQotICAgIG0tPnNlY3Rpb25zW2kgLSBmcm9tXSA9ICpoZHJwcDsKLSAgbS0+Y291bnQgPSB0byAtIGZyb207Ci0KLSAgaWYgKGZyb20gPT0gMCAmJiBwaGRyKQotICAgIHsKLSAgICAgIC8qIEluY2x1ZGUgdGhlIGhlYWRlcnMgaW4gdGhlIGZpcnN0IFBUX0xPQUQgc2VnbWVudC4gICovCi0gICAgICBtLT5pbmNsdWRlc19maWxlaGRyID0gMTsKLSAgICAgIG0tPmluY2x1ZGVzX3BoZHJzID0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIG07Ci19Ci0KLS8qIFNldCB1cCBhIG1hcHBpbmcgZnJvbSBCRkQgc2VjdGlvbnMgdG8gcHJvZ3JhbSBzZWdtZW50cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptZmlyc3Q7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKipwbTsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLSAgYXNlY3Rpb24gKmxhc3RfaGRyOwotICB1bnNpZ25lZCBpbnQgcGhkcl9pbmRleDsKLSAgYmZkX3ZtYSBtYXhwYWdlc2l6ZTsKLSAgYXNlY3Rpb24gKipoZHJwcDsKLSAgYm9vbGVhbiBwaGRyX2luX3NlZ21lbnQgPSB0cnVlOwotICBib29sZWFuIHdyaXRhYmxlOwotICBhc2VjdGlvbiAqZHluc2VjOwotCi0gIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VsZWN0IHRoZSBhbGxvY2F0ZWQgc2VjdGlvbnMsIGFuZCBzb3J0IHRoZW0uICAqLwotCi0gIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpCi0JCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGkgPSAwOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXsKLQkgIHNlY3Rpb25zW2ldID0gczsKLQkgICsraTsKLQl9Ci0gICAgfQotICBCRkRfQVNTRVJUIChpIDw9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkpOwotICBjb3VudCA9IGk7Ci0KLSAgcXNvcnQgKHNlY3Rpb25zLCAoc2l6ZV90KSBjb3VudCwgc2l6ZW9mIChhc2VjdGlvbiAqKSwgZWxmX3NvcnRfc2VjdGlvbnMpOwotCi0gIC8qIEJ1aWxkIHRoZSBtYXBwaW5nLiAgKi8KLQotICBtZmlyc3QgPSBOVUxMOwotICBwbSA9ICZtZmlyc3Q7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhIC5pbnRlcnAgc2VjdGlvbiwgdGhlbiBjcmVhdGUgYSBQVF9QSERSIHNlZ21lbnQgZm9yCi0gICAgIHRoZSBwcm9ncmFtIGhlYWRlcnMgYW5kIGEgUFRfSU5URVJQIHNlZ21lbnQgZm9yIHRoZSAuaW50ZXJwCi0gICAgIHNlY3Rpb24uICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpKTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBtLT5uZXh0ID0gTlVMTDsKLSAgICAgIG0tPnBfdHlwZSA9IFBUX1BIRFI7Ci0gICAgICAvKiBGSVhNRTogVW5peFdhcmUgYW5kIFNvbGFyaXMgc2V0IFBGX1gsIElyaXggNSBkb2VzIG5vdC4gICovCi0gICAgICBtLT5wX2ZsYWdzID0gUEZfUiB8IFBGX1g7Ci0gICAgICBtLT5wX2ZsYWdzX3ZhbGlkID0gMTsKLSAgICAgIG0tPmluY2x1ZGVzX3BoZHJzID0gMTsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0KLSAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbS0+bmV4dCA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgPSBQVF9JTlRFUlA7Ci0gICAgICBtLT5jb3VudCA9IDE7Ci0gICAgICBtLT5zZWN0aW9uc1swXSA9IHM7Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotICAgIH0KLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb25zLiAgV2UgcHV0IHNlY3Rpb25zIGluIHRoZSBzYW1lIHByb2dyYW0KLSAgICAgc2VnbWVudCB3aGVuIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHNlY3Rpb24gY2FuIGJlIHBsYWNlZCB3aXRoaW4KLSAgICAgYSBmZXcgYnl0ZXMgb2YgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4gICovCi0gIGxhc3RfaGRyID0gTlVMTDsKLSAgcGhkcl9pbmRleCA9IDA7Ci0gIG1heHBhZ2VzaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5tYXhwYWdlc2l6ZTsKLSAgd3JpdGFibGUgPSBmYWxzZTsKLSAgZHluc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICBpZiAoZHluc2VjICE9IE5VTEwKLSAgICAgICYmIChkeW5zZWMtPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0gICAgZHluc2VjID0gTlVMTDsKLQotICAvKiBEZWFsIHdpdGggLVR0ZXh0IG9yIHNvbWV0aGluZyBzaW1pbGFyIHN1Y2ggdGhhdCB0aGUgZmlyc3Qgc2VjdGlvbgotICAgICBpcyBub3QgYWRqYWNlbnQgdG8gdGhlIHByb2dyYW0gaGVhZGVycy4gIFRoaXMgaXMgYW4KLSAgICAgYXBwcm94aW1hdGlvbiwgc2luY2UgYXQgdGhpcyBwb2ludCB3ZSBkb24ndCBrbm93IGV4YWN0bHkgaG93IG1hbnkKLSAgICAgcHJvZ3JhbSBoZWFkZXJzIHdlIHdpbGwgbmVlZC4gICovCi0gIGlmIChjb3VudCA+IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBwaGRyX3NpemU7Ci0KLSAgICAgIHBoZHJfc2l6ZSA9IGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7Ci0gICAgICBpZiAocGhkcl9zaXplID09IDApCi0JcGhkcl9zaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfcGhkcjsKLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA9PSAwCi0JICB8fCBzZWN0aW9uc1swXS0+bG1hIDwgcGhkcl9zaXplCi0JICB8fCBzZWN0aW9uc1swXS0+bG1hICUgbWF4cGFnZXNpemUgPCBwaGRyX3NpemUgJSBtYXhwYWdlc2l6ZSkKLQlwaGRyX2luX3NlZ21lbnQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgaGRycHAgPSBzZWN0aW9uczsgaSA8IGNvdW50OyBpKyssIGhkcnBwKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhkcjsKLSAgICAgIGJvb2xlYW4gbmV3X3NlZ21lbnQ7Ci0KLSAgICAgIGhkciA9ICpoZHJwcDsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgc2VjdGlvbiBhbmQgdGhlIGxhc3Qgb25lIHdpbGwgZml0IGluIHRoZSBzYW1lCi0gICAgICAgICBzZWdtZW50LiAgKi8KLQotICAgICAgaWYgKGxhc3RfaGRyID09IE5VTEwpCi0JewotCSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHNlZ21lbnQgeWV0LCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcKLQkgICAgIG9uZSAod2UgYnVpbGQgdGhlIGxhc3Qgb25lIGFmdGVyIHRoaXMgbG9vcCkuICAqLwotCSAgbmV3X3NlZ21lbnQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmIChsYXN0X2hkci0+bG1hIC0gbGFzdF9oZHItPnZtYSAhPSBoZHItPmxtYSAtIGhkci0+dm1hKQotCXsKLQkgIC8qIElmIHRoaXMgc2VjdGlvbiBoYXMgYSBkaWZmZXJlbnQgcmVsYXRpb24gYmV0d2VlbiB0aGUKLSAgICAgICAgICAgICB2aXJ0dWFsIGFkZHJlc3MgYW5kIHRoZSBsb2FkIGFkZHJlc3MsIHRoZW4gd2UgbmVlZCBhIG5ldwotICAgICAgICAgICAgIHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKEJGRF9BTElHTiAobGFzdF9oZHItPmxtYSArIGxhc3RfaGRyLT5fcmF3X3NpemUsIG1heHBhZ2VzaXplKQotCSAgICAgICA8IEJGRF9BTElHTiAoaGRyLT5sbWEsIG1heHBhZ2VzaXplKSkKLQl7Ci0JICAvKiBJZiBwdXR0aW5nIHRoaXMgc2VjdGlvbiBpbiB0aGlzIHNlZ21lbnQgd291bGQgZm9yY2UgdXMgdG8KLSAgICAgICAgICAgICBza2lwIGEgcGFnZSBpbiB0aGUgc2VnbWVudCwgdGhlbiB3ZSBuZWVkIGEgbmV3IHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKChsYXN0X2hkci0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotCSAgICAgICAmJiAoaGRyLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotCXsKLQkgIC8qIFdlIGRvbid0IHdhbnQgdG8gcHV0IGEgbG9hZGFibGUgc2VjdGlvbiBhZnRlciBhCi0gICAgICAgICAgICAgbm9ubG9hZGFibGUgc2VjdGlvbiBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA9PSAwKQotCXsKLQkgIC8qIElmIHRoZSBmaWxlIGlzIG5vdCBkZW1hbmQgcGFnZWQsIHdoaWNoIG1lYW5zIHRoYXQgd2UKLSAgICAgICAgICAgICBkb24ndCByZXF1aXJlIHRoZSBzZWN0aW9ucyB0byBiZSBjb3JyZWN0bHkgYWxpZ25lZCBpbiB0aGUKLSAgICAgICAgICAgICBmaWxlLCB0aGVuIHRoZXJlIGlzIG5vIG90aGVyIHJlYXNvbiBmb3IgYSBuZXcgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgd3JpdGFibGUKLQkgICAgICAgJiYgKGhkci0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKLQkgICAgICAgJiYgKEJGRF9BTElHTiAobGFzdF9oZHItPmxtYSArIGxhc3RfaGRyLT5fcmF3X3NpemUsIG1heHBhZ2VzaXplKQotCQkgICA9PSBoZHItPmxtYSkpCi0JewotCSAgLyogV2UgZG9uJ3Qgd2FudCB0byBwdXQgYSB3cml0YWJsZSBzZWN0aW9uIGluIGEgcmVhZCBvbmx5Ci0gICAgICAgICAgICAgc2VnbWVudCwgdW5sZXNzIHRoZXkgYXJlIG9uIHRoZSBzYW1lIHBhZ2UgaW4gbWVtb3J5Ci0gICAgICAgICAgICAgYW55aG93LiAgV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGxhc3Qgc2VjdGlvbiBkb2VzIG5vdAotICAgICAgICAgICAgIGJyaW5nIHVzIHBhc3QgdGhlIGN1cnJlbnQgc2VjdGlvbiBvbiB0aGUgcGFnZSwgc28gdGhlCi0gICAgICAgICAgICAgb25seSBjYXNlIGluIHdoaWNoIHRoZSBuZXcgc2VjdGlvbiBpcyBub3Qgb24gdGhlIHNhbWUKLSAgICAgICAgICAgICBwYWdlIGFzIHRoZSBwcmV2aW91cyBzZWN0aW9uIGlzIHdoZW4gdGhlIHByZXZpb3VzIHNlY3Rpb24KLSAgICAgICAgICAgICBlbmRzIHByZWNpc2VseSBvbiBhIHBhZ2UgYm91bmRhcnkuICAqLwotCSAgbmV3X3NlZ21lbnQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBPdGhlcndpc2UsIHdlIGNhbiB1c2UgdGhlIHNhbWUgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgbmV3X3NlZ21lbnQpCi0JewotCSAgaWYgKChoZHItPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCSAgICB3cml0YWJsZSA9IHRydWU7Ci0JICBsYXN0X2hkciA9IGhkcjsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgbmVlZCBhIG5ldyBwcm9ncmFtIHNlZ21lbnQuICBXZSBtdXN0IGNyZWF0ZSBhIG5ldyBwcm9ncmFtCi0gICAgICAgICBoZWFkZXIgaG9sZGluZyBhbGwgdGhlIHNlY3Rpb25zIGZyb20gcGhkcl9pbmRleCB1bnRpbCBoZHIuICAqLwotCi0gICAgICBtID0gbWFrZV9tYXBwaW5nIChhYmZkLCBzZWN0aW9ucywgcGhkcl9pbmRleCwgaSwgcGhkcl9pbl9zZWdtZW50KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotCi0gICAgICBpZiAoKGhkci0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0Jd3JpdGFibGUgPSB0cnVlOwotICAgICAgZWxzZQotCXdyaXRhYmxlID0gZmFsc2U7Ci0KLSAgICAgIGxhc3RfaGRyID0gaGRyOwotICAgICAgcGhkcl9pbmRleCA9IGk7Ci0gICAgICBwaGRyX2luX3NlZ21lbnQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGEgZmluYWwgUFRfTE9BRCBwcm9ncmFtIHNlZ21lbnQuICAqLwotICBpZiAobGFzdF9oZHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtID0gbWFrZV9tYXBwaW5nIChhYmZkLCBzZWN0aW9ucywgcGhkcl9pbmRleCwgaSwgcGhkcl9pbl9zZWdtZW50KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBhIC5keW5hbWljIHNlY3Rpb24sIHRocm93IGluIGEgUFRfRFlOQU1JQyBzZWdtZW50LiAgKi8KLSAgaWYgKGR5bnNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbS0+bmV4dCA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgPSBQVF9EWU5BTUlDOwotICAgICAgbS0+Y291bnQgPSAxOwotICAgICAgbS0+c2VjdGlvbnNbMF0gPSBkeW5zZWM7Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotICAgIH0KLQotICAvKiBGb3IgZWFjaCBsb2FkYWJsZSAubm90ZSBzZWN0aW9uLCBhZGQgYSBQVF9OT1RFIHNlZ21lbnQuICBXZSBkb24ndAotICAgICB1c2UgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUsIGJlY2F1c2UgaWYgd2UgbGluayB0b2dldGhlcgotICAgICBub25sb2FkYWJsZSAubm90ZSBzZWN0aW9ucyBhbmQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMsIHdlIHdpbGwKLSAgICAgZ2VuZXJhdGUgdHdvIC5ub3RlIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQgZmlsZS4gIEZJWE1FOiBVc2luZwotICAgICBuYW1lcyBmb3Igc2VjdGlvbiB0eXBlcyBpcyBib2d1cyBhbnlob3cuICAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkgICYmIHN0cm5jbXAgKHMtPm5hbWUsICIubm90ZSIsIDUpID09IDApCi0JewotCSAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7Ci0JICBpZiAobSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG0tPm5leHQgPSBOVUxMOwotCSAgbS0+cF90eXBlID0gUFRfTk9URTsKLQkgIG0tPmNvdW50ID0gMTsKLQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0JfQotICAgIH0KLQotICBmcmVlIChzZWN0aW9ucyk7Ci0gIHNlY3Rpb25zID0gTlVMTDsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCA9IG1maXJzdDsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTb3J0IHNlY3Rpb25zIGJ5IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgaW50Ci1lbGZfc29ydF9zZWN0aW9ucyAoYXJnMSwgYXJnMikKLSAgICAgY29uc3QgUFRSIGFyZzE7Ci0gICAgIGNvbnN0IFBUUiBhcmcyOwotewotICBjb25zdCBhc2VjdGlvbiAqc2VjMSA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzE7Ci0gIGNvbnN0IGFzZWN0aW9uICpzZWMyID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMjsKLQotICAvKiBTb3J0IGJ5IExNQSBmaXJzdCwgc2luY2UgdGhpcyBpcyB0aGUgYWRkcmVzcyB1c2VkIHRvCi0gICAgIHBsYWNlIHRoZSBzZWN0aW9uIGludG8gYSBzZWdtZW50LiAgKi8KLSAgaWYgKHNlYzEtPmxtYSA8IHNlYzItPmxtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKHNlYzEtPmxtYSA+IHNlYzItPmxtYSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBUaGVuIHNvcnQgYnkgVk1BLiAgTm9ybWFsbHkgdGhlIExNQSBhbmQgdGhlIFZNQSB3aWxsIGJlCi0gICAgIHRoZSBzYW1lLCBhbmQgdGhpcyB3aWxsIGRvIG5vdGhpbmcuICAqLwotICBpZiAoc2VjMS0+dm1hIDwgc2VjMi0+dm1hKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoc2VjMS0+dm1hID4gc2VjMi0+dm1hKQotICAgIHJldHVybiAxOwotCi0gIC8qIFB1dCAhU0VDX0xPQUQgc2VjdGlvbnMgYWZ0ZXIgU0VDX0xPQUQgb25lcy4gICovCi0KLSNkZWZpbmUgVE9FTkQoeCkgKCgoeCktPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0KLSAgaWYgKFRPRU5EIChzZWMxKSkKLSAgICB7Ci0gICAgICBpZiAoVE9FTkQgKHNlYzIpKQotCXJldHVybiBzZWMxLT50YXJnZXRfaW5kZXggLSBzZWMyLT50YXJnZXRfaW5kZXg7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChUT0VORCAoc2VjMikpCi0gICAgcmV0dXJuIC0xOwotCi0jdW5kZWYgVE9FTkQKLQotICAvKiBTb3J0IGJ5IHNpemUsIHRvIHB1dCB6ZXJvIHNpemVkIHNlY3Rpb25zIGJlZm9yZSBvdGhlcnMgYXQgdGhlCi0gICAgIHNhbWUgYWRkcmVzcy4gICovCi0KLSAgaWYgKHNlYzEtPl9yYXdfc2l6ZSA8IHNlYzItPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChzZWMxLT5fcmF3X3NpemUgPiBzZWMyLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIHNlYzEtPnRhcmdldF9pbmRleCAtIHNlYzItPnRhcmdldF9pbmRleDsKLX0KLQotLyogQXNzaWduIGZpbGUgcG9zaXRpb25zIHRvIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbWFwcGluZyBmcm9tCi0gICBzZWN0aW9ucyB0byBzZWdtZW50cy4gIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHVwIHNvbWUgZmllbGRzIGluCi0gICB0aGUgZmlsZSBoZWFkZXIsIGFuZCB3cml0ZXMgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIHVuc2lnbmVkIGludCBhbGxvYzsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHJzOwotICBmaWxlX3B0ciBvZmYsIHZvZmY7Ci0gIGJmZF92bWEgZmlsZWhkcl92YWRkciwgZmlsZWhkcl9wYWRkcjsKLSAgYmZkX3ZtYSBwaGRyc192YWRkciwgcGhkcnNfcGFkZHI7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotCi0gIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIG1hcF9zZWN0aW9uc190b19zZWdtZW50cyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApCi0gICAgewotICAgICAgaWYgKCEgKCpiZWQtPmVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCkgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgY291bnQgPSAwOwotICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLSAgICArK2NvdW50OwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Bob2ZmID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhlbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfcGhkcjsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW0gPSBjb3VudDsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3ZSBhbHJlYWR5IGNvdW50ZWQgdGhlIG51bWJlciBvZiBwcm9ncmFtIHNlZ21lbnRzLCBtYWtlIHN1cmUKLSAgICAgdGhhdCB3ZSBhbGxvY2F0ZWQgZW5vdWdoIHNwYWNlLiAgVGhpcyBoYXBwZW5zIHdoZW4gU0laRU9GX0hFQURFUlMKLSAgICAgaXMgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQuICAqLwotICBhbGxvYyA9IGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemUgLyBiZWQtPnMtPnNpemVvZl9waGRyOwotICBpZiAoYWxsb2MgIT0gMCAmJiBjb3VudCA+IGFsbG9jKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoXygiJXM6IE5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzIChhbGxvY2F0ZWQgJXUsIG5lZWQgJXUpIiksCi0JYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGFsbG9jLCBjb3VudCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChhbGxvYyA9PSAwKQotICAgIGFsbG9jID0gY291bnQ7Ci0KLSAgcGhkcnMgPSAoKEVsZl9JbnRlcm5hbF9QaGRyICopCi0JICAgYmZkX2FsbG9jIChhYmZkLCBhbGxvYyAqIHNpemVvZiAoRWxmX0ludGVybmFsX1BoZHIpKSk7Ci0gIGlmIChwaGRycyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvZmYgPSBiZWQtPnMtPnNpemVvZl9laGRyOwotICBvZmYgKz0gYWxsb2MgKiBiZWQtPnMtPnNpemVvZl9waGRyOwotCi0gIGZpbGVoZHJfdmFkZHIgPSAwOwotICBmaWxlaGRyX3BhZGRyID0gMDsKLSAgcGhkcnNfdmFkZHIgPSAwOwotICBwaGRyc19wYWRkciA9IDA7Ci0KLSAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAsIHAgPSBwaGRyczsKLSAgICAgICBtICE9IE5VTEw7Ci0gICAgICAgbSA9IG0tPm5leHQsIHArKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLSAgICAgIC8qIElmIGVsZl9zZWdtZW50X21hcCBpcyBub3QgZnJvbSBtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMsIHRoZQotICAgICAgICAgc2VjdGlvbnMgbWF5IG5vdCBiZSBjb3JyZWN0bHkgb3JkZXJlZC4gICovCi0gICAgICBpZiAobS0+Y291bnQgPiAwKQotCXFzb3J0IChtLT5zZWN0aW9ucywgKHNpemVfdCkgbS0+Y291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksCi0JICAgICAgIGVsZl9zb3J0X3NlY3Rpb25zKTsKLQotICAgICAgcC0+cF90eXBlID0gbS0+cF90eXBlOwotICAgICAgcC0+cF9mbGFncyA9IG0tPnBfZmxhZ3M7Ci0KLSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRAotCSAgJiYgbS0+Y291bnQgPiAwCi0JICAmJiAobS0+c2VjdGlvbnNbMF0tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXsKLQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCSAgICBvZmYgKz0gKG0tPnNlY3Rpb25zWzBdLT52bWEgLSBvZmYpICUgYmVkLT5tYXhwYWdlc2l6ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgYWxpZ247Ci0KLQkgICAgICBhbGlnbiA9IDA7Ci0JICAgICAgZm9yIChpID0gMCwgc2VjcHAgPSBtLT5zZWN0aW9uczsgaSA8IG0tPmNvdW50OyBpKyssIHNlY3BwKyspCi0JCXsKLQkJICBiZmRfc2l6ZV90eXBlIHNlY2FsaWduOwotCi0JCSAgc2VjYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCAqc2VjcHApOwotCQkgIGlmIChzZWNhbGlnbiA+IGFsaWduKQotCQkgICAgYWxpZ24gPSBzZWNhbGlnbjsKLQkJfQotCi0JICAgICAgb2ZmICs9IChtLT5zZWN0aW9uc1swXS0+dm1hIC0gb2ZmKSAlICgxIDw8IGFsaWduKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKG0tPmNvdW50ID09IDApCi0JcC0+cF92YWRkciA9IDA7Ci0gICAgICBlbHNlCi0JcC0+cF92YWRkciA9IG0tPnNlY3Rpb25zWzBdLT52bWE7Ci0KLSAgICAgIGlmIChtLT5wX3BhZGRyX3ZhbGlkKQotCXAtPnBfcGFkZHIgPSBtLT5wX3BhZGRyOwotICAgICAgZWxzZSBpZiAobS0+Y291bnQgPT0gMCkKLQlwLT5wX3BhZGRyID0gMDsKLSAgICAgIGVsc2UKLQlwLT5wX3BhZGRyID0gbS0+c2VjdGlvbnNbMF0tPmxtYTsKLQotICAgICAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FECi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCXAtPnBfYWxpZ24gPSBiZWQtPm1heHBhZ2VzaXplOwotICAgICAgZWxzZSBpZiAobS0+Y291bnQgPT0gMCkKLQlwLT5wX2FsaWduID0gYmVkLT5zLT5maWxlX2FsaWduOwotICAgICAgZWxzZQotCXAtPnBfYWxpZ24gPSAwOwotCi0gICAgICBwLT5wX29mZnNldCA9IDA7Ci0gICAgICBwLT5wX2ZpbGVzeiA9IDA7Ci0gICAgICBwLT5wX21lbXN6ID0gMDsKLQotICAgICAgaWYgKG0tPmluY2x1ZGVzX2ZpbGVoZHIpCi0JewotCSAgaWYgKCEgbS0+cF9mbGFnc192YWxpZCkKLQkgICAgcC0+cF9mbGFncyB8PSBQRl9SOwotCSAgcC0+cF9vZmZzZXQgPSAwOwotCSAgcC0+cF9maWxlc3ogPSBiZWQtPnMtPnNpemVvZl9laGRyOwotCSAgcC0+cF9tZW1zeiA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0JICBpZiAobS0+Y291bnQgPiAwKQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAocC0+cF90eXBlID09IFBUX0xPQUQpOwotCi0JICAgICAgaWYgKHAtPnBfdmFkZHIgPCAoYmZkX3ZtYSkgb2ZmKQotCQl7Ci0JCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMsIHRyeSBsaW5raW5nIHdpdGggLU4iKSwKLQkJCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBwLT5wX3ZhZGRyIC09IG9mZjsKLQkgICAgICBpZiAoISBtLT5wX3BhZGRyX3ZhbGlkKQotCQlwLT5wX3BhZGRyIC09IG9mZjsKLQkgICAgfQotCSAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKQotCSAgICB7Ci0JICAgICAgZmlsZWhkcl92YWRkciA9IHAtPnBfdmFkZHI7Ci0JICAgICAgZmlsZWhkcl9wYWRkciA9IHAtPnBfcGFkZHI7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChtLT5pbmNsdWRlc19waGRycykKLQl7Ci0JICBpZiAoISBtLT5wX2ZsYWdzX3ZhbGlkKQotCSAgICBwLT5wX2ZsYWdzIHw9IFBGX1I7Ci0KLQkgIGlmIChtLT5pbmNsdWRlc19maWxlaGRyKQotCSAgICB7Ci0JICAgICAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKQotCQl7Ci0JCSAgcGhkcnNfdmFkZHIgPSBwLT5wX3ZhZGRyICsgYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkJICBwaGRyc19wYWRkciA9IHAtPnBfcGFkZHIgKyBiZWQtPnMtPnNpemVvZl9laGRyOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHAtPnBfb2Zmc2V0ID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQotCSAgICAgIGlmIChtLT5jb3VudCA+IDApCi0JCXsKLQkJICBCRkRfQVNTRVJUIChwLT5wX3R5cGUgPT0gUFRfTE9BRCk7Ci0JCSAgcC0+cF92YWRkciAtPSBvZmYgLSBwLT5wX29mZnNldDsKLQkJICBpZiAoISBtLT5wX3BhZGRyX3ZhbGlkKQotCQkgICAgcC0+cF9wYWRkciAtPSBvZmYgLSBwLT5wX29mZnNldDsKLQkJfQotCi0JICAgICAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKQotCQl7Ci0JCSAgcGhkcnNfdmFkZHIgPSBwLT5wX3ZhZGRyOwotCQkgIHBoZHJzX3BhZGRyID0gcC0+cF9wYWRkcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJcGhkcnNfdmFkZHIgPSBiZWQtPm1heHBhZ2VzaXplICsgYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkgICAgfQotCi0JICBwLT5wX2ZpbGVzeiArPSBhbGxvYyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0JICBwLT5wX21lbXN6ICs9IGFsbG9jICogYmVkLT5zLT5zaXplb2ZfcGhkcjsKLQl9Ci0KLSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRAotCSAgfHwgKHAtPnBfdHlwZSA9PSBQVF9OT1RFICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfY29yZSkpCi0JewotCSAgaWYgKCEgbS0+aW5jbHVkZXNfZmlsZWhkciAmJiAhIG0tPmluY2x1ZGVzX3BoZHJzKQotCSAgICBwLT5wX29mZnNldCA9IG9mZjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpbGVfcHRyIGFkanVzdDsKLQotCSAgICAgIGFkanVzdCA9IG9mZiAtIChwLT5wX29mZnNldCArIHAtPnBfZmlsZXN6KTsKLQkgICAgICBwLT5wX2ZpbGVzeiArPSBhZGp1c3Q7Ci0JICAgICAgcC0+cF9tZW1zeiArPSBhZGp1c3Q7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHZvZmYgPSBvZmY7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHNlY3BwID0gbS0+c2VjdGlvbnM7IGkgPCBtLT5jb3VudDsgaSsrLCBzZWNwcCsrKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBmbGFnd29yZCBmbGFnczsKLQkgIGJmZF9zaXplX3R5cGUgYWxpZ247Ci0KLQkgIHNlYyA9ICpzZWNwcDsKLQkgIGZsYWdzID0gc2VjLT5mbGFnczsKLQkgIGFsaWduID0gMSA8PCBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMpOwotCi0JICAvKiBUaGUgc2VjdGlvbiBtYXkgaGF2ZSBhcnRpZmljaWFsIGFsaWdubWVudCBmb3JjZWQgYnkgYQotCSAgICAgbGluayBzY3JpcHQuICBOb3RpY2UgdGhpcyBjYXNlIGJ5IHRoZSBnYXAgYmV0d2VlbiB0aGUKLQkgICAgIGN1bXVsYXRpdmUgcGhkciB2bWEgYW5kIHRoZSBzZWN0aW9uJ3Mgdm1hLiAgKi8KLQkgIGlmIChwLT5wX3ZhZGRyICsgcC0+cF9tZW1zeiA8IHNlYy0+dm1hKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBhZGp1c3QgPSBzZWMtPnZtYSAtIChwLT5wX3ZhZGRyICsgcC0+cF9tZW1zeik7Ci0KLQkgICAgICBwLT5wX21lbXN6ICs9IGFkanVzdDsKLQkgICAgICBvZmYgKz0gYWRqdXN0OwotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJcC0+cF9maWxlc3ogKz0gYWRqdXN0OwotCSAgICB9Ci0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgewotCSAgICAgIGJmZF9zaWduZWRfdm1hIGFkanVzdDsKLQotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJewotCQkgIGFkanVzdCA9IHNlYy0+bG1hIC0gKHAtPnBfcGFkZHIgKyBwLT5wX21lbXN6KTsKLQkJICBpZiAoYWRqdXN0IDwgMCkKLQkJICAgIGFkanVzdCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXsKLQkJICAvKiBUaGUgc2VjdGlvbiBWTUEgbXVzdCBlcXVhbCB0aGUgZmlsZSBwb3NpdGlvbgotCQkgICAgIG1vZHVsbyB0aGUgcGFnZSBzaXplLiAgRklYTUU6IEknbSBub3Qgc3VyZSBpZgotCQkgICAgIHRoaXMgYWRqdXN0bWVudCBpcyByZWFsbHkgbmVjZXNzYXJ5LiAgV2UgdXNlZCB0bwotCQkgICAgIG5vdCBoYXZlIHRoZSBTRUNfTE9BRCBjYXNlIGp1c3QgYWJvdmUsIGFuZCB0aGVuCi0JCSAgICAgdGhpcyB3YXMgbmVjZXNzYXJ5LCBidXQgbm93IEknbSBub3Qgc3VyZS4gICovCi0JCSAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0JCSAgICBhZGp1c3QgPSAoc2VjLT52bWEgLSB2b2ZmKSAlIGJlZC0+bWF4cGFnZXNpemU7Ci0JCSAgZWxzZQotCQkgICAgYWRqdXN0ID0gKHNlYy0+dm1hIC0gdm9mZikgJSBhbGlnbjsKLQkJfQotCSAgICAgIGVsc2UKLQkJYWRqdXN0ID0gMDsKLQotCSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQkJewotCQkgIGlmIChpID09IDApCi0JCSAgICB7Ci0JCSAgICAgICgqIF9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCJFcnJvcjogRmlyc3Qgc2VjdGlvbiBpbiBzZWdtZW50ICglcykgc3RhcnRzIGF0IDB4JXgiKSwKLQkJCSBiZmRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBzZWMtPmxtYSk7Ci0JCSAgICAgICgqIF9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIgICAgICAgd2hlcmVhcyBzZWdtZW50IHN0YXJ0cyBhdCAweCV4IiksCi0JCQkgcC0+cF9wYWRkcik7Ci0KLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIHAtPnBfbWVtc3ogKz0gYWRqdXN0OwotCQkgIG9mZiArPSBhZGp1c3Q7Ci0JCSAgdm9mZiArPSBhZGp1c3Q7Ci0JCSAgaWYgKChmbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotCQkgICAgcC0+cF9maWxlc3ogKz0gYWRqdXN0OwotCQl9Ci0KLQkgICAgICBzZWMtPmZpbGVwb3MgPSBvZmY7Ci0KLQkgICAgICAvKiBXZSBjaGVjayBTRUNfSEFTX0NPTlRFTlRTIGhlcmUgYmVjYXVzZSBpZiBOT0xPQUQgaXMKLSAgICAgICAgICAgICAgICAgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQgd2UgbWF5IGhhdmUgYSBzZWN0aW9uIHdpdGgKLSAgICAgICAgICAgICAgICAgU0VDX0xPQUQgY2xlYXIgYnV0IHdoaWNoIGlzIHN1cHBvc2VkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgY29udGVudHMuICAqLwotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCQkgIHx8IChmbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JCW9mZiArPSBzZWMtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXZvZmYgKz0gc2VjLT5fcmF3X3NpemU7Ci0JICAgIH0KLQotCSAgaWYgKHAtPnBfdHlwZSA9PSBQVF9OT1RFICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfY29yZSkKLQkgICAgewotCSAgICAgIGlmIChpID09IDApCS8qIHRoZSBhY3R1YWwgIm5vdGUiIHNlZ21lbnQgKi8KLQkJewkJLyogdGhpcyBvbmUgYWN0dWFsbHkgY29udGFpbnMgZXZlcnl0aGluZy4gKi8KLQkJICBzZWMtPmZpbGVwb3MgPSBvZmY7Ci0JCSAgcC0+cF9maWxlc3ogPSBzZWMtPl9yYXdfc2l6ZTsKLQkJICBvZmYgKz0gc2VjLT5fcmF3X3NpemU7Ci0JCSAgdm9mZiA9IG9mZjsKLQkJfQotCSAgICAgIGVsc2UJLyogZmFrZSBzZWN0aW9ucyAtLSBkb24ndCBuZWVkIHRvIGJlIHdyaXR0ZW4gKi8KLQkJewotCQkgIHNlYy0+ZmlsZXBvcyA9IDA7Ci0JCSAgc2VjLT5fcmF3X3NpemUgPSAwOwotCQkgIGZsYWdzID0gc2VjLT5mbGFncyA9IDA7CS8qIG5vIGNvbnRlbnRzICovCi0JCX0KLQkgICAgICBwLT5wX21lbXN6ID0gMDsKLQkgICAgICBwLT5wX2FsaWduID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcC0+cF9tZW1zeiArPSBzZWMtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJcC0+cF9maWxlc3ogKz0gc2VjLT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoYWxpZ24gPiBwLT5wX2FsaWduCi0JCSAgJiYgKHAtPnBfdHlwZSAhPSBQVF9MT0FEIHx8IChhYmZkLT5mbGFncyAmIERfUEFHRUQpID09IDApKQotCQlwLT5wX2FsaWduID0gYWxpZ247Ci0JICAgIH0KLQotCSAgaWYgKCEgbS0+cF9mbGFnc192YWxpZCkKLQkgICAgewotCSAgICAgIHAtPnBfZmxhZ3MgfD0gUEZfUjsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0NPREUpICE9IDApCi0JCXAtPnBfZmxhZ3MgfD0gUEZfWDsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCQlwLT5wX2ZsYWdzIHw9IFBGX1c7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgc2V0IHRoZSBzZWN0aW9uIGZpbGUgcG9zaXRpb25zLCB3ZSBjYW4gc2V0IHVwCi0gICAgIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIG5vbiBQVF9MT0FEIHNlZ21lbnRzLiAgKi8KLSAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAsIHAgPSBwaGRyczsKLSAgICAgICBtICE9IE5VTEw7Ci0gICAgICAgbSA9IG0tPm5leHQsIHArKykKLSAgICB7Ci0gICAgICBpZiAocC0+cF90eXBlICE9IFBUX0xPQUQgJiYgbS0+Y291bnQgPiAwKQotCXsKLQkgIEJGRF9BU1NFUlQgKCEgbS0+aW5jbHVkZXNfZmlsZWhkciAmJiAhIG0tPmluY2x1ZGVzX3BoZHJzKTsKLQkgIHAtPnBfb2Zmc2V0ID0gbS0+c2VjdGlvbnNbMF0tPmZpbGVwb3M7Ci0JfQotICAgICAgaWYgKG0tPmNvdW50ID09IDApCi0JewotCSAgaWYgKG0tPmluY2x1ZGVzX2ZpbGVoZHIpCi0JICAgIHsKLQkgICAgICBwLT5wX3ZhZGRyID0gZmlsZWhkcl92YWRkcjsKLQkgICAgICBpZiAoISBtLT5wX3BhZGRyX3ZhbGlkKQotCQlwLT5wX3BhZGRyID0gZmlsZWhkcl9wYWRkcjsKLQkgICAgfQotCSAgZWxzZSBpZiAobS0+aW5jbHVkZXNfcGhkcnMpCi0JICAgIHsKLQkgICAgICBwLT5wX3ZhZGRyID0gcGhkcnNfdmFkZHI7Ci0JICAgICAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJcC0+cF9wYWRkciA9IHBoZHJzX3BhZGRyOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBDbGVhciBvdXQgYW55IHByb2dyYW0gaGVhZGVycyB3ZSBhbGxvY2F0ZWQgYnV0IGRpZCBub3QgdXNlLiAgKi8KLSAgZm9yICg7IGNvdW50IDwgYWxsb2M7IGNvdW50KyssIHArKykKLSAgICB7Ci0gICAgICBtZW1zZXQgKHAsIDAsIHNpemVvZiAqcCk7Ci0gICAgICBwLT5wX3R5cGUgPSBQVF9OVUxMOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5waGRyID0gcGhkcnM7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgYmVkLT5zLT5zaXplb2ZfZWhkciwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJlZC0+cy0+d3JpdGVfb3V0X3BoZHJzIChhYmZkLCBwaGRycywgYWxsb2MpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIHNpemUgb2YgdGhlIHByb2dyYW0gaGVhZGVyLgotCi0gICBJZiB0aGlzIGlzIGNhbGxlZCBieSB0aGUgbGlua2VyIGJlZm9yZSBhbnkgb2YgdGhlIHNlY3Rpb24gVk1BJ3MgYXJlIHNldCwgaXQKLSAgIGNhbid0IGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgYSBzdHJhbmdlIG1lbW9yeSBsYXlvdXQuICBUaGlzIG9ubHkKLSAgIGhhcHBlbnMgd2hlbiBTSVpFT0ZfSEVBREVSUyBpcyB1c2VkIGluIGEgbGlua2VyIHNjcmlwdC4gIEluIHRoaXMgY2FzZSwKLSAgIFNPUlRFRF9IRFJTIGlzIE5VTEwgYW5kIHdlIGFzc3VtZSB0aGUgbm9ybWFsIHNjZW5hcmlvIG9mIG9uZSB0ZXh0IGFuZCBvbmUKLSAgIGRhdGEgc2VnbWVudCAoZXhjbHVzaXZlIG9mIC5pbnRlcnAgYW5kIC5keW5hbWljKS4KLQotICAgPz8/IFVzZXIgd3JpdHRlbiBzY3JpcHRzIG11c3QgZWl0aGVyIG5vdCB1c2UgU0laRU9GX0hFQURFUlMsIG9yIGFzc3VtZSB0aGVyZQotICAgd2lsbCBiZSB0d28gc2VnbWVudHMuICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZQotZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc2l6ZV90IHNlZ3M7Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIC8qIFdlIGNhbid0IHJldHVybiBhIGRpZmZlcmVudCByZXN1bHQgZWFjaCB0aW1lIHdlJ3JlIGNhbGxlZC4gICovCi0gIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplICE9IDApCi0gICAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7Ci0KLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLQotICAgICAgc2VncyA9IDA7Ci0gICAgICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQkrK3NlZ3M7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplID0gc2VncyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0gICAgICByZXR1cm4gZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZTsKLSAgICB9Ci0KLSAgLyogQXNzdW1lIHdlIHdpbGwgbmVlZCBleGFjdGx5IHR3byBQVF9MT0FEIHNlZ21lbnRzOiBvbmUgZm9yIHRleHQKLSAgICAgYW5kIG9uZSBmb3IgZGF0YS4gICovCi0gIHNlZ3MgPSAyOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGEgbG9hZGFibGUgaW50ZXJwcmV0ZXIgc2VjdGlvbiwgd2UgbmVlZCBhCi0JIFBUX0lOVEVSUCBzZWdtZW50LiAgSW4gdGhpcyBjYXNlLCBhc3N1bWUgd2UgYWxzbyBuZWVkIGEKLQkgUFRfUEhEUiBzZWdtZW50LCBhbHRob3VnaCB0aGF0IG1heSBub3QgYmUgdHJ1ZSBmb3IgYWxsCi0JIHRhcmdldHMuICAqLwotICAgICAgc2VncyArPSAyOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgbmVlZCBhIFBUX0RZTkFNSUMgc2VnbWVudC4gICovCi0gICAgICArK3NlZ3M7Ci0gICAgfQotCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCSAgJiYgc3RybmNtcCAocy0+bmFtZSwgIi5ub3RlIiwgNSkgPT0gMCkKLQl7Ci0JICAvKiBXZSBuZWVkIGEgUFRfTk9URSBzZWdtZW50LiAgKi8KLQkgICsrc2VnczsKLQl9Ci0gICAgfQotCi0gIC8qIExldCB0aGUgYmFja2VuZCBjb3VudCB1cCBhbnkgcHJvZ3JhbSBoZWFkZXJzIGl0IG1pZ2h0IG5lZWQuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycykKLSAgICB7Ci0gICAgICBpbnQgYTsKLQotICAgICAgYSA9ICgqYmVkLT5lbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycykgKGFiZmQpOwotICAgICAgaWYgKGEgPT0gLTEpCi0JYWJvcnQgKCk7Ci0gICAgICBzZWdzICs9IGE7Ci0gICAgfQotCi0gIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemUgPSBzZWdzICogYmVkLT5zLT5zaXplb2ZfcGhkcjsKLSAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7Ci19Ci0KLS8qIFdvcmsgb3V0IHRoZSBmaWxlIHBvc2l0aW9ucyBvZiBhbGwgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyBjYWxsZWQgYnkKLSAgIF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIEFsbCB0aGUgc2VjdGlvbiBzaXplcyBhbmQKLSAgIFZNQXMgbXVzdCBiZSBrbm93biBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuCi0KLSAgIFdlIGRvIG5vdCBjb25zaWRlciByZWxvYyBzZWN0aW9ucyBhdCB0aGlzIHBvaW50LCB1bmxlc3MgdGhleSBmb3JtCi0gICBwYXJ0IG9mIHRoZSBsb2FkYWJsZSBpbWFnZS4gIFJlbG9jIHNlY3Rpb25zIGFyZSBhc3NpZ25lZCBmaWxlCi0gICBwb3NpdGlvbnMgaW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MsIHdoaWNoIGlzIGNhbGxlZCBieQotICAgd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGFuZCBmaW5hbF9saW5rLgotCi0gICBXZSBhbHNvIGRvbid0IHNldCB0aGUgcG9zaXRpb25zIG9mIHRoZSAuc3ltdGFiIGFuZCAuc3RydGFiIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKiBjb25zdCB0ZGF0YSA9IGVsZl90ZGF0YSAoYWJmZCk7Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICogY29uc3QgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKiBjb25zdCBpX3NoZHJwcCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0gIGZpbGVfcHRyIG9mZjsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX2NvcmUpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKipoZHJwcDsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICAvKiBTdGFydCBhZnRlciB0aGUgRUxGIGhlYWRlci4gICovCi0gICAgICBvZmYgPSBpX2VoZHJwLT5lX2Voc2l6ZTsKLQotICAgICAgLyogV2UgYXJlIG5vdCBjcmVhdGluZyBhbiBleGVjdXRhYmxlLCB3aGljaCBtZWFucyB0aGF0IHdlIGFyZQotCSBub3QgY3JlYXRpbmcgYSBwcm9ncmFtIGhlYWRlciwgYW5kIHRoYXQgdGhlIGFjdHVhbCBvcmRlciBvZgotCSB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgaXMgdW5pbXBvcnRhbnQuICAqLwotICAgICAgZm9yIChpID0gMSwgaGRycHAgPSBpX3NoZHJwcCArIDE7IGkgPCBpX2VoZHJwLT5lX3NobnVtOyBpKyssIGhkcnBwKyspCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotCSAgaGRyID0gKmhkcnBwOwotCSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMIHx8IGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICAgewotCSAgICAgIGhkci0+c2hfb2Zmc2V0ID0gLTE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGlmIChpID09IHRkYXRhLT5zeW10YWJfc2VjdGlvbgotCSAgICAgIHx8IGkgPT0gdGRhdGEtPnN0cnRhYl9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgaGRyLT5zaF9vZmZzZXQgPSAtMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsIHRydWUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICoqaGRycHA7Ci0KLSAgICAgIC8qIEFzc2lnbiBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIGxvYWRlZCBzZWN0aW9ucyBiYXNlZCBvbiB0aGUKLSAgICAgICAgIGFzc2lnbm1lbnQgb2Ygc2VjdGlvbnMgdG8gc2VnbWVudHMuICAqLwotICAgICAgaWYgKCEgYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBBc3NpZ24gZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBvdGhlciBzZWN0aW9ucy4gICovCi0KLSAgICAgIG9mZiA9IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3M7Ci0gICAgICBmb3IgKGkgPSAxLCBoZHJwcCA9IGlfc2hkcnBwICsgMTsgaSA8IGlfZWhkcnAtPmVfc2hudW07IGkrKywgaGRycHArKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0JICBoZHIgPSAqaGRycHA7Ci0JICBpZiAoaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0JICAgICAgJiYgaGRyLT5iZmRfc2VjdGlvbi0+ZmlsZXBvcyAhPSAwKQotCSAgICBoZHItPnNoX29mZnNldCA9IGhkci0+YmZkX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBlbHNlIGlmICgoaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiB3YXJuaW5nOiBhbGxvY2F0ZWQgc2VjdGlvbiBgJXMnIG5vdCBpbiBzZWdtZW50IiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkoaGRyLT5iZmRfc2VjdGlvbiA9PSBOVUxMCi0JCSA/ICIqdW5rbm93bioiCi0JCSA6IGhkci0+YmZkX3NlY3Rpb24tPm5hbWUpKSk7Ci0JICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0JCW9mZiArPSAoaGRyLT5zaF9hZGRyIC0gb2ZmKSAlIGJlZC0+bWF4cGFnZXNpemU7Ci0JICAgICAgZWxzZQotCQlvZmYgKz0gKGhkci0+c2hfYWRkciAtIG9mZikgJSBoZHItPnNoX2FkZHJhbGlnbjsKLQkgICAgICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsCi0JCQkJCQkJICAgICAgIGZhbHNlKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9SRUwKLQkJICAgfHwgaGRyLT5zaF90eXBlID09IFNIVF9SRUxBCi0JCSAgIHx8IGhkciA9PSBpX3NoZHJwcFt0ZGF0YS0+c3ltdGFiX3NlY3Rpb25dCi0JCSAgIHx8IGhkciA9PSBpX3NoZHJwcFt0ZGF0YS0+c3RydGFiX3NlY3Rpb25dKQotCSAgICBoZHItPnNoX29mZnNldCA9IC0xOwotCSAgZWxzZQotCSAgICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsIHRydWUpOwotCX0KLSAgICB9Ci0KLSAgLyogUGxhY2UgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCi0gIG9mZiA9IGFsaWduX2ZpbGVfcG9zaXRpb24gKG9mZiwgYmVkLT5zLT5maWxlX2FsaWduKTsKLSAgaV9laGRycC0+ZV9zaG9mZiA9IG9mZjsKLSAgb2ZmICs9IGlfZWhkcnAtPmVfc2hudW0gKiBpX2VoZHJwLT5lX3NoZW50c2l6ZTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcHJlcF9oZWFkZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICppX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1BoZHIgKmlfcGhkcnAgPSAwOyAvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlLCBpbnRlcm5hbCBmb3JtICovCi0gIGludCBjb3VudDsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc2hzdHJ0YWI7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKLQotICBzaHN0cnRhYiA9IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoc2hzdHJ0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWxmX3Noc3RydGFiIChhYmZkKSA9IHNoc3RydGFiOwotCi0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMF0gPSBFTEZNQUcwOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX01BRzFdID0gRUxGTUFHMTsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9NQUcyXSA9IEVMRk1BRzI7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfTUFHM10gPSBFTEZNQUczOwotCi0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfQ0xBU1NdID0gYmVkLT5zLT5lbGZjbGFzczsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9EQVRBXSA9Ci0gICAgYmZkX2JpZ19lbmRpYW4gKGFiZmQpID8gRUxGREFUQTJNU0IgOiBFTEZEQVRBMkxTQjsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9WRVJTSU9OXSA9IGJlZC0+cy0+ZXZfY3VycmVudDsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX09TQUJJXSA9IEVMRk9TQUJJX1NZU1Y7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfQUJJVkVSU0lPTl0gPSAwOwotCi0gIGZvciAoY291bnQgPSBFSV9QQUQ7IGNvdW50IDwgRUlfTklERU5UOyBjb3VudCsrKQotICAgIGlfZWhkcnAtPmVfaWRlbnRbY291bnRdID0gMDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9EWU47Ci0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLSAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9FWEVDOwotICBlbHNlIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX2NvcmUpCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfQ09SRTsKLSAgZWxzZQotICAgIGlfZWhkcnAtPmVfdHlwZSA9IEVUX1JFTDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfdW5rbm93bjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX05PTkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgaWYgKGJlZC0+cy0+YXJjaF9zaXplID09IDY0KQotCWlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1NQQVJDVjk7Ci0gICAgICBlbHNlCi0JaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fU1BBUkM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2kzNzA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TMzcwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fMzg2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fNjhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tODhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pODYwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fOTYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9taXBzOgkvKiBNSVBTIFJ4eHh4ICovCi0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NSVBTOwkvKiBvbmx5IE1JUFMgUjMwMDAgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaHBwYToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BBUklTQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BQQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9BTFBIQTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfZDEwdjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19EMTBWOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9kMzB2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX0QzMFY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2ZyMzA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfRlIzMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NQ09SRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYXZyOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQVZSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF92ODUwOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgMDogICAgICAgICAgICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfVjg1MDsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICBjYXNlIGJmZF9hcmNoX2FyYzoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19BUkM7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgYmZkX2FyY2hfYXJtOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQVJNOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tMzJyOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX00zMlI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAyMDA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfTU4xMDIwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbW4xMDMwMDoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19NTjEwMzAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9wajoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BKOwotICAgICAgYnJlYWs7Ci0gICAgICAvKiBhbHNvIG5vdGUgdGhhdCBFTV9NMzIsIEFUJlQgV0UzMjEwMCBpcyB1bmtub3duIHRvIGJmZCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9OT05FOwotICAgIH0KLSAgaV9laGRycC0+ZV92ZXJzaW9uID0gYmVkLT5zLT5ldl9jdXJyZW50OwotICBpX2VoZHJwLT5lX2Voc2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0KLSAgLyogbm8gcHJvZ3JhbSBoZWFkZXIsIGZvciBub3cuICovCi0gIGlfZWhkcnAtPmVfcGhvZmYgPSAwOwotICBpX2VoZHJwLT5lX3BoZW50c2l6ZSA9IDA7Ci0gIGlfZWhkcnAtPmVfcGhudW0gPSAwOwotCi0gIC8qIGVhY2ggYmZkIHNlY3Rpb24gaXMgc2VjdGlvbiBoZWFkZXIgZW50cnkgKi8KLSAgaV9laGRycC0+ZV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIGlfZWhkcnAtPmVfc2hlbnRzaXplID0gYmVkLT5zLT5zaXplb2Zfc2hkcjsKLQotICAvKiBpZiB3ZSdyZSBidWlsZGluZyBhbiBleGVjdXRhYmxlLCB3ZSdsbCBuZWVkIGEgcHJvZ3JhbSBoZWFkZXIgdGFibGUgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIC8qIGl0IGFsbCBoYXBwZW5zIGxhdGVyICovCi0jaWYgMAotICAgICAgaV9laGRycC0+ZV9waGVudHNpemUgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKTsKLQotICAgICAgLyogZWxmX2J1aWxkX3BoZHJzKCkgcmV0dXJucyBhIChOVUxMLXRlcm1pbmF0ZWQpIGFycmF5IG9mCi0JIEVsZl9JbnRlcm5hbF9QaGRycyAqLwotICAgICAgaV9waGRycCA9IGVsZl9idWlsZF9waGRycyAoYWJmZCwgaV9laGRycCwgaV9zaGRycCwgJmlfZWhkcnAtPmVfcGhudW0pOwotICAgICAgaV9laGRycC0+ZV9waG9mZiA9IG91dGJhc2U7Ci0gICAgICBvdXRiYXNlICs9IGlfZWhkcnAtPmVfcGhlbnRzaXplICogaV9laGRycC0+ZV9waG51bTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlfZWhkcnAtPmVfcGhlbnRzaXplID0gMDsKLSAgICAgIGlfcGhkcnAgPSAwOwotICAgICAgaV9laGRycC0+ZV9waG9mZiA9IDA7Ci0gICAgfQotCi0gIGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfbmFtZSA9Ci0gICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChzaHN0cnRhYiwgIi5zeW10YWIiLCB0cnVlLCBmYWxzZSk7Ci0gIGVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHIuc2hfbmFtZSA9Ci0gICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChzaHN0cnRhYiwgIi5zdHJ0YWIiLCB0cnVlLCBmYWxzZSk7Ci0gIGVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkci5zaF9uYW1lID0KLSAgICAodW5zaWduZWQgaW50KSBfYmZkX3N0cmluZ3RhYl9hZGQgKHNoc3RydGFiLCAiLnNoc3RydGFiIiwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xCi0gICAgICB8fCBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX25hbWUgPT0gKHVuc2lnbmVkIGludCkgLTEKLSAgICAgIHx8IGVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkci5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXNzaWduIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHJlbG9jIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgcGFydAotICAgb2YgdGhlIGxvYWRhYmxlIGZpbGUgaW1hZ2UuICAqLwotCi12b2lkCi1fYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBmaWxlX3B0ciBvZmY7Ci0gIHVuc2lnbmVkIGludCBpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKnNoZHJwcDsKLQotICBvZmYgPSBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zOwotCi0gIGZvciAoaSA9IDEsIHNoZHJwcCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgKyAxOwotICAgICAgIGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsKLSAgICAgICBpKyssIHNoZHJwcCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzaGRycDsKLQotICAgICAgc2hkcnAgPSAqc2hkcnBwOwotICAgICAgaWYgKChzaGRycC0+c2hfdHlwZSA9PSBTSFRfUkVMIHx8IHNoZHJwLT5zaF90eXBlID09IFNIVF9SRUxBKQotCSAgJiYgc2hkcnAtPnNoX29mZnNldCA9PSAtMSkKLQlvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoc2hkcnAsIG9mZiwgdHJ1ZSk7Ci0gICAgfQotCi0gIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwotICBib29sZWFuIGZhaWxlZDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4KLSAgICAgICYmICEgX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zCi0gICAgICAgICAgICAgKGFiZmQsIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLQotICBmYWlsZWQgPSBmYWxzZTsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBiZWQtPnMtPndyaXRlX3JlbG9jcywgJmZhaWxlZCk7Ci0gIGlmIChmYWlsZWQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzIChhYmZkKTsKLQotICAvKiBBZnRlciB3cml0aW5nIHRoZSBoZWFkZXJzLCB3ZSBuZWVkIHRvIHdyaXRlIHRoZSBzZWN0aW9ucyB0b28uLi4gKi8KLSAgZm9yIChjb3VudCA9IDE7IGNvdW50IDwgaV9laGRycC0+ZV9zaG51bTsgY291bnQrKykKLSAgICB7Ci0gICAgICBpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpCi0JKCpiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZykgKGFiZmQsIGlfc2hkcnBbY291bnRdKTsKLSAgICAgIGlmIChpX3NoZHJwW2NvdW50XS0+Y29udGVudHMpCi0JewotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX3NoZHJwW2NvdW50XS0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfd3JpdGUgKGlfc2hkcnBbY291bnRdLT5jb250ZW50cywgaV9zaGRycFtjb3VudF0tPnNoX3NpemUsCi0JCQkgICAgIDEsIGFiZmQpCi0JCSAgIT0gaV9zaGRycFtjb3VudF0tPnNoX3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gaGVhZGVyIG5hbWVzLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBlbGZfc2hzdHJ0YWIgKGFiZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZykKLSAgICAoKmJlZC0+ZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZykgKGFiZmQsCi0JCQkJCQllbGZfdGRhdGEgKGFiZmQpLT5saW5rZXIpOwotCi0gIHJldHVybiBiZWQtPnMtPndyaXRlX3NoZHJzX2FuZF9laGRyIChhYmZkKTsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogSG9wZWZ1bGx5IHRoaXMgY2FuIGJlIGRvbmUganVzdCBsaWtlIGFuIG9iamVjdCBmaWxlLiAqLwotICByZXR1cm4gX2JmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKTsKLX0KLS8qIGdpdmVuIGEgc2VjdGlvbiwgc2VhcmNoIHRoZSBoZWFkZXIgdG8gZmluZCB0aGVtLi4uICovCi1pbnQKLV9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHNlYyAqYXNlY3Q7Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0gIGludCBpbmRleDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgaW50IG1heGluZGV4ID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07Ci0KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWF4aW5kZXg7IGluZGV4KyspCi0gICAgewotICAgICAgaGRyID0gaV9zaGRycFtpbmRleF07Ci0gICAgICBpZiAoaGRyLT5iZmRfc2VjdGlvbiA9PSBhc2VjdCkKLQlyZXR1cm4gaW5kZXg7Ci0gICAgfQotCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtYXhpbmRleDsgaW5kZXgrKykKLQl7Ci0JICBpbnQgcmV0dmFsOwotCi0JICBoZHIgPSBpX3NoZHJwW2luZGV4XTsKLQkgIHJldHZhbCA9IGluZGV4OwotCSAgaWYgKCgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pCi0JICAgICAgKGFiZmQsIGhkciwgYXNlY3QsICZyZXR2YWwpKQotCSAgICByZXR1cm4gcmV0dmFsOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoYXNlY3QpKQotICAgIHJldHVybiBTSE5fQUJTOwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChhc2VjdCkpCi0gICAgcmV0dXJuIFNITl9DT01NT047Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGFzZWN0KSkKLSAgICByZXR1cm4gU0hOX1VOREVGOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCi0gIHJldHVybiAtMTsKLX0KLQotLyogR2l2ZW4gYSBCRkQgc3ltYm9sLCByZXR1cm4gdGhlIGluZGV4IGluIHRoZSBFTEYgc3ltYm9sIHRhYmxlLCBvciAtMQotICAgb24gZXJyb3IuICAqLwotCi1pbnQKLV9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsIGFzeW1fcHRyX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYXN5bV9wdHJfcHRyOwotewotICBhc3ltYm9sICphc3ltX3B0ciA9ICphc3ltX3B0cl9wdHI7Ci0gIGludCBpZHg7Ci0gIGZsYWd3b3JkIGZsYWdzID0gYXN5bV9wdHItPmZsYWdzOwotCi0gIC8qIFdoZW4gZ2FzIGNyZWF0ZXMgcmVsb2NhdGlvbnMgYWdhaW5zdCBsb2NhbCBsYWJlbHMsIGl0IGNyZWF0ZXMgaXRzCi0gICAgIG93biBzeW1ib2wgZm9yIHRoZSBzZWN0aW9uLCBidXQgZG9lcyBwdXQgdGhlIHN5bWJvbCBpbnRvIHRoZQotICAgICBzeW1ib2wgY2hhaW4sIHNvIHVkYXRhIGlzIDAuICBXaGVuIHRoZSBsaW5rZXIgaXMgZ2VuZXJhdGluZwotICAgICByZWxvY2F0YWJsZSBvdXRwdXQsIHRoaXMgc2VjdGlvbiBzeW1ib2wgbWF5IGJlIGZvciBvbmUgb2YgdGhlCi0gICAgIGlucHV0IHNlY3Rpb25zIHJhdGhlciB0aGFuIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGlmIChhc3ltX3B0ci0+dWRhdGEuaSA9PSAwCi0gICAgICAmJiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgICAmJiBhc3ltX3B0ci0+c2VjdGlvbikKLSAgICB7Ci0gICAgICBpbnQgaW5keDsKLQotICAgICAgaWYgKGFzeW1fcHRyLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCWluZHggPSBhc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmluZGV4OwotICAgICAgZWxzZQotCWluZHggPSBhc3ltX3B0ci0+c2VjdGlvbi0+aW5kZXg7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fc3ltcyAoYWJmZClbaW5keF0pCi0JYXN5bV9wdHItPnVkYXRhLmkgPSBlbGZfc2VjdGlvbl9zeW1zIChhYmZkKVtpbmR4XS0+dWRhdGEuaTsKLSAgICB9Ci0KLSAgaWR4ID0gYXN5bV9wdHItPnVkYXRhLmk7Ci0KLSAgaWYgKGlkeCA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgd2hlbiB1c2luZyAtLXN0cmlwLXN5bWJvbCBvbiBhIHN5bWJvbAotICAgICAgICAgd2hpY2ggaXMgdXNlZCBpbiBhIHJlbG9jYXRpb24gZW50cnkuICAqLwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBzeW1ib2wgYCVzJyByZXF1aXJlZCBidXQgbm90IHByZXNlbnQiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGJmZF9hc3ltYm9sX25hbWUgKGFzeW1fcHRyKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0jaWYgREVCVUcgJiA0Ci0gIHsKLSAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICBfKCJlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAweCUuOGx4LCBuYW1lID0gJXMsIHN5bSBudW0gPSAlZCwgZmxhZ3MgPSAweCUuOGx4JXNcbiIpLAotCSAgICAgKGxvbmcpIGFzeW1fcHRyLCBhc3ltX3B0ci0+bmFtZSwgaWR4LCBmbGFncywKLQkgICAgIGVsZl9zeW1ib2xfZmxhZ3MgKGZsYWdzKSk7Ci0gICAgZmZsdXNoIChzdGRlcnIpOwotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBDb3B5IHByaXZhdGUgQkZEIGRhdGEuICBUaGlzIGNvcGllcyBhbnkgcHJvZ3JhbSBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgRWxmX0ludGVybmFsX0VoZHIgKmllaGRyOwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptZmlyc3Q7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKipwbTsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnA7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgbnVtX3NlZ21lbnRzOwotICBib29sZWFuIHBoZHJfaW5jbHVkZWQgPSBmYWxzZTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGVsZl90ZGF0YSAoaWJmZCktPnBoZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZWhkciA9IGVsZl9lbGZoZWFkZXIgKGliZmQpOwotCi0gIG1maXJzdCA9IE5VTEw7Ci0gIHBtID0gJm1maXJzdDsKLQotICBudW1fc2VnbWVudHMgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9waG51bTsKLQotI2RlZmluZSBJU19DT05UQUlORURfQlkoYWRkciwgbGVuLCBib3R0b20sIHBoZHIpCQkgCVwKLQkgICgoYWRkcikgPj0gKGJvdHRvbSkJCQkJIAkgIAlcCi0JICAgJiYgKCAgICgoYWRkcikgKyAobGVuKSkgPD0gKChib3R0b20pICsgKHBoZHIpLT5wX21lbXN6KQlcCi0JICAgICAgIHx8ICgoYWRkcikgKyAobGVuKSkgPD0gKChib3R0b20pICsgKHBoZHIpLT5wX2ZpbGVzeikpKQotCi0gIC8qIFNwZWNpYWwgY2FzZTogY29yZWZpbGUgIk5PVEUiIHNlY3Rpb24gY29udGFpbmluZyByZWdzLCBwcnBzaW5mbyBldGMuICovCi0KLSNkZWZpbmUgSVNfQ09SRUZJTEVfTk9URShwLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgKHAtPnBfdHlwZSA9PSBQVF9OT1RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGliZmQpID09IGJmZF9jb3JlICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICAmJiBzLT52bWEgPT0gMCAmJiBzLT5sbWEgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICYmIChiZmRfdm1hKSBzLT5maWxlcG9zID49IHAtPnBfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgJiYgKGJmZF92bWEpIHMtPmZpbGVwb3MgKyBzLT5fcmF3X3NpemUgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICA8PSBwLT5wX29mZnNldCArIHAtPnBfZmlsZXN6KQotCi0gIC8qIFRoZSBjb21wbGljYXRlZCBjYXNlIHdoZW4gcF92YWRkciBpcyAwIGlzIHRvIGhhbmRsZSB0aGUgU29sYXJpcwotICAgICBsaW5rZXIsIHdoaWNoIGdlbmVyYXRlcyBhIFBUX0lOVEVSUCBzZWN0aW9uIHdpdGggcF92YWRkciBhbmQKLSAgICAgcF9tZW1zeiBzZXQgdG8gMC4gICovCi0KLSNkZWZpbmUgSVNfU09MQVJJU19QVF9JTlRFUlAocCwgcykJCQkJCVwKLQkgICAgKHAtPnBfdmFkZHIgPT0gMAkJCQkJCVwKLQkgICAgICYmIHAtPnBfZmlsZXN6ID4gMAkJCQkJCVwKLQkgICAgICYmIChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAJCQlcCi0JICAgICAmJiBzLT5fcmF3X3NpemUgPiAwCQkJCQlcCi0JICAgICAmJiAoYmZkX3ZtYSkgcy0+ZmlsZXBvcyA+PSBwLT5wX29mZnNldAkJCVwKLQkgICAgICYmICgoYmZkX3ZtYSkgcy0+ZmlsZXBvcyArIHMtPl9yYXdfc2l6ZQkJCVwKLQkJICAgICA8PSBwLT5wX29mZnNldCArIHAtPnBfZmlsZXN6KSkKLQotICAvKiBTY2FuIHRocm91Z2ggdGhlIHNlZ21lbnRzIHNwZWNpZmllZCBpbiB0aGUgcHJvZ3JhbSBoZWFkZXIKLSAgICAgb2YgdGhlIGlucHV0IEJGRC4gICovCi0gIGZvciAoaSA9IDAsIHAgPSBlbGZfdGRhdGEgKGliZmQpLT5waGRyOyBpIDwgbnVtX3NlZ21lbnRzOyBpKyssIHArKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY3NlY3M7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci0gICAgICBhc2VjdGlvbiAqb3M7Ci0gICAgICB1bnNpZ25lZCBpbnQgaXNlYzsKLSAgICAgIGJmZF92bWEgbWF0Y2hpbmdfbG1hOwotICAgICAgYmZkX3ZtYSBzdWdnZXN0ZWRfbG1hOwotICAgICAgdW5zaWduZWQgaW50IGo7Ci0KLSAgICAgIC8qIEZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIGlucHV0IEJGRCwgZGVjaWRlIGlmIGl0IHNob3VsZCBiZQotCSBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBzZWdtZW50LiAgQSBzZWN0aW9uIHdpbGwgYmUgaW5jbHVkZWQKLQkgaWYgaXQgaXMgd2l0aGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBzZWdtZW50LCBhbmQgaXQgaXMKLQkgYW4gYWxsb2NhdGVkIHNlZ21lbnQsIGFuZCB0aGVyZSBpcyBhbiBvdXRwdXQgc2VjdGlvbgotCSBhc3NvY2lhdGVkIHdpdGggaXQuICAqLwotICAgICAgY3NlY3MgPSAwOwotICAgICAgZm9yIChzID0gaWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JaWYgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JICB7Ci0JICAgIGlmICgoSVNfQ09OVEFJTkVEX0JZIChzLT52bWEsIHMtPl9yYXdfc2l6ZSwgcC0+cF92YWRkciwgcCkKLQkJIHx8IElTX1NPTEFSSVNfUFRfSU5URVJQIChwLCBzKSkKLQkJJiYgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICAgICsrY3NlY3M7Ci0JICAgIGVsc2UgaWYgKElTX0NPUkVGSUxFX05PVEUgKHAsIHMpKQotCSAgICAgICsrY3NlY3M7Ci0JICB9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIGEgc2VnbWVudCBtYXAgYmlnIGVub3VnaCB0byBjb250YWluIGFsbCBvZiB0aGUKLQkgc2VjdGlvbnMgd2UgaGF2ZSBzZWxlY3RlZC4gICovCi0gICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgYmZkX2FsbG9jIChvYmZkLAotCQkgICAgICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQotCQkgICAgICAgKyAoKHNpemVfdCkgY3NlY3MgLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmllbGRzIG9mIHRoZSBzZWdtZW50IG1hcC4gIERlZmF1bHQgdG8KLQkgdXNpbmcgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQgaW4gdGhlIGlucHV0IEJGRC4gICovCi0gICAgICBtLT5uZXh0ICAgICAgICAgID0gTlVMTDsKLSAgICAgIG0tPnBfdHlwZSAgICAgICAgPSBwLT5wX3R5cGU7Ci0gICAgICBtLT5wX2ZsYWdzICAgICAgID0gcC0+cF9mbGFnczsKLSAgICAgIG0tPnBfZmxhZ3NfdmFsaWQgPSAxOwotICAgICAgbS0+cF9wYWRkciAgICAgICA9IHAtPnBfcGFkZHI7Ci0gICAgICBtLT5wX3BhZGRyX3ZhbGlkID0gMTsKLQotICAgICAgLyogRGV0ZXJtaW5lIGlmIHRoaXMgc2VnbWVudCBjb250YWlucyB0aGUgRUxGIGZpbGUgaGVhZGVyCi0JIGFuZCBpZiBpdCBjb250YWlucyB0aGUgcHJvZ3JhbSBoZWFkZXJzIHRoZW1zZWx2ZXMuICAqLwotICAgICAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IChwLT5wX29mZnNldCA9PSAwCi0JCQkgICAgICYmIHAtPnBfZmlsZXN6ID49IGllaGRyLT5lX2Voc2l6ZSk7Ci0KLSAgICAgIG0tPmluY2x1ZGVzX3BoZHJzID0gMDsKLQotICAgICAgaWYgKCEgcGhkcl9pbmNsdWRlZCB8fCBwLT5wX3R5cGUgIT0gUFRfTE9BRCkKLQl7Ci0JICBtLT5pbmNsdWRlc19waGRycyA9Ci0JICAgIChwLT5wX29mZnNldCA8PSAoYmZkX3ZtYSkgaWVoZHItPmVfcGhvZmYKLQkgICAgICYmIChwLT5wX29mZnNldCArIHAtPnBfZmlsZXN6Ci0JCSA+PSAoKGJmZF92bWEpIGllaGRyLT5lX3Bob2ZmCi0JCSAgICAgKyBpZWhkci0+ZV9waG51bSAqIGllaGRyLT5lX3BoZW50c2l6ZSkpKTsKLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCAmJiBtLT5pbmNsdWRlc19waGRycykKLQkgICAgcGhkcl9pbmNsdWRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBpZiAoY3NlY3MgPT0gMCkKLQl7Ci0JICAvKiBTcGVjaWFsIHNlZ21lbnRzLCBzdWNoIGFzIHRoZSBQVF9QSERSIHNlZ21lbnQsIG1heSBjb250YWluCi0JICAgICBubyBzZWN0aW9ucywgYnV0IG9yZGluYXJ5LCBsb2FkYWJsZSBzZWdtZW50cyBzaG91bGQgY29udGFpbgotCSAgICAgc29tZXRoaW5nLiAgKi8KLQotCSAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKQotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkoXygiJXM6IHdhcm5pbmc6IEVtcHR5IGxvYWRhYmxlIHNlZ21lbnQgZGV0ZWN0ZWRcbiIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0JICBtLT5jb3VudCA9IDA7Ci0JICAqcG0gPSBtOwotCSAgcG0gPSAmbS0+bmV4dDsKLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOb3cgc2NhbiB0aGUgc2VjdGlvbnMgaW4gdGhlIGlucHV0IEJGRCBhZ2FpbiBhbmQgYXR0ZW1wdAotCSB0byBhZGQgdGhlaXIgY29ycmVzcG9uZGluZyBvdXRwdXQgc2VjdGlvbnMgdG8gdGhlIHNlZ21lbnQgbWFwLgotCSBUaGUgcHJvYmxlbSBoZXJlIGlzIGhvdyB0byBoYW5kbGUgYW4gb3V0cHV0IHNlY3Rpb24gd2hpY2ggaGFzCi0JIGJlZW4gbW92ZWQgKGllIGhhZCBpdHMgTE1BIGNoYW5nZWQpLiAgVGhlcmUgYXJlIGZvdXIgcG9zc2liaWxpdGllczoKLQotCSAxLiBOb25lIG9mIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQuCi0JICAgIEluIHRoaXMgY2FzZSB3ZSBjYW4gY29udGludWUgdG8gdXNlIHRoZSBzZWdtZW50IExNQSBmcm9tIHRoZQotCSAgICBpbnB1dCBCRkQuCi0KLQkgMi4gQWxsIG9mIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQgYnkgdGhlIHNhbWUgYW1vdW50LgotCSAgICBJbiB0aGlzIGNhc2Ugd2UgY2FuIGNoYW5nZSB0aGUgc2VnbWVudCdzIExNQSB0byBtYXRjaCB0aGUgTE1BCi0JICAgIG9mIHRoZSBmaXJzdCBzZWN0aW9uLgotCi0JIDMuIFNvbWUgb2YgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBtb3ZlZCwgb3RoZXJzIGhhdmUgbm90LgotCSAgICBJbiB0aGlzIGNhc2UgdGhvc2Ugc2VjdGlvbnMgd2hpY2ggaGF2ZSBub3QgYmVlbiBtb3ZlZCBjYW4gYmUKLQkgICAgcGxhY2VkIGluIHRoZSBjdXJyZW50IHNlZ21lbnQgd2hpY2ggd2lsbCBoYXZlIHRvIGhhdmUgaXRzIHNpemUsCi0JICAgIGFuZCBwb3NzaWJseSBpdHMgTE1BIGNoYW5nZWQsIGFuZCBhIG5ldyBzZWdtZW50IG9yIHNlZ21lbnRzIHdpbGwKLQkgICAgaGF2ZSB0byBiZSBjcmVhdGVkIHRvIGNvbnRhaW4gdGhlIG90aGVyIHNlY3Rpb25zLgotCi0JIDQuIFRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQsIGJ1dCBub3QgYmUgdGhlIHNhbWUgYW1vdW50LgotCSAgICBJbiB0aGlzIGNhc2Ugd2UgY2FuIGNoYW5nZSB0aGUgc2VnbWVudCdzIExNQSB0byBtYXRjaCB0aGUgTE1BCi0JICAgIG9mIHRoZSBmaXJzdCBzZWN0aW9uIGFuZCB3ZSB3aWxsIGhhdmUgdG8gY3JlYXRlIGEgbmV3IHNlZ21lbnQKLQkgICAgb3Igc2VnbWVudHMgdG8gY29udGFpbiB0aGUgb3RoZXIgc2VjdGlvbnMuCi0KLQkgSW4gb3JkZXIgdG8gc2F2ZSB0aW1lLCB3ZSBhbGxvY2F0ZSBhbiBhcnJheSB0byBob2xkIHRoZSBzZWN0aW9uCi0JIHBvaW50ZXJzIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4uICBBcyB0aGVzZSBzZWN0aW9ucyBnZXQgYXNzaWduZWQKLQkgdG8gYSBzZWdtZW50LCB0aGV5IGFyZSByZW1vdmVkIGZyb20gdGhpcyBhcnJheS4gICovCi0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzaXplb2YgKGFzZWN0aW9uICopICogY3NlY3MpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTdGVwIE9uZTogU2NhbiBmb3Igc2VnbWVudCB2cyBzZWN0aW9uIExNQSBjb25mbGljdHMuCi0JIEFsc28gYWRkIHRoZSBzZWN0aW9ucyB0byB0aGUgc2VjdGlvbiBhcnJheSBhbGxvY2F0ZWQgYWJvdmUuCi0JIEFsc28gYWRkIHRoZSBzZWN0aW9ucyB0byB0aGUgY3VycmVudCBzZWdtZW50LiAgSW4gdGhlIGNvbW1vbgotCSBjYXNlLCB3aGVyZSB0aGUgc2VjdGlvbnMgaGF2ZSBub3QgYmVlbiBtb3ZlZCwgdGhpcyBtZWFucyB0aGF0Ci0JIHdlIGhhdmUgY29tcGxldGVseSBmaWxsZWQgdGhlIHNlZ21lbnQsIGFuZCB0aGVyZSBpcyBub3RoaW5nCi0JIG1vcmUgdG8gZG8uICAqLwotCi0gICAgICBpc2VjID0gMDsKLSAgICAgIG1hdGNoaW5nX2xtYSA9IGZhbHNlOwotICAgICAgc3VnZ2VzdGVkX2xtYSA9IDA7Ci0KLSAgICAgIGZvciAoaiA9IDAsIHMgPSBpYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotCi0JICBpZiAoKCgoSVNfQ09OVEFJTkVEX0JZIChzLT52bWEsIHMtPl9yYXdfc2l6ZSwgcC0+cF92YWRkciwgcCkKLQkJIHx8IElTX1NPTEFSSVNfUFRfSU5URVJQIChwLCBzKSkKLQkJJiYgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICAgICB8fCBJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkgICAgICAmJiBvcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2VjdGlvbnNbaisrXSA9IHM7Ci0KLQkgICAgICAvKiBUaGUgU29sYXJpcyBuYXRpdmUgbGlua2VyIGFsd2F5cyBzZXRzIHBfcGFkZHIgdG8gMC4KLQkJIFdlIHRyeSB0byBjYXRjaCB0aGF0IGNhc2UgaGVyZSwgYW5kIHNldCBpdCB0byB0aGUKLQkJIGNvcnJlY3QgdmFsdWUuICAqLwotCSAgICAgIGlmIChwLT5wX3BhZGRyID09IDAKLQkJICAmJiBwLT5wX3ZhZGRyICE9IDAKLQkJICAmJiBpc2VjID09IDAKLQkJICAmJiBvcy0+bG1hICE9IDAKLQkJICAmJiAob3MtPnZtYSA9PSAocC0+cF92YWRkcgotCQkJCSAgKyAobS0+aW5jbHVkZXNfZmlsZWhkcgotCQkJCSAgICAgPyBpZWhkci0+ZV9laHNpemUKLQkJCQkgICAgIDogMCkKLQkJCQkgICsgKG0tPmluY2x1ZGVzX3BoZHJzCi0JCQkJICAgICA/IGllaGRyLT5lX3BobnVtICogaWVoZHItPmVfcGhlbnRzaXplCi0JCQkJICAgICA6IDApKSkpCi0JCW0tPnBfcGFkZHIgPSBwLT5wX3ZhZGRyOwotCi0JICAgICAgLyogTWF0Y2ggdXAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQgd2l0aCB0aGUKLQkJIExNQSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKElTX0NPTlRBSU5FRF9CWSAob3MtPmxtYSwgb3MtPl9yYXdfc2l6ZSwgbS0+cF9wYWRkciwgcCkKLQkJICB8fCBJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkJewotCQkgIGlmIChtYXRjaGluZ19sbWEgPT0gMCkKLQkJICAgIG1hdGNoaW5nX2xtYSA9IG9zLT5sbWE7Ci0KLQkJICAvKiBXZSBhc3N1bWUgdGhhdCBpZiB0aGUgc2VjdGlvbiBmaXRzIHdpdGhpbiB0aGUgc2VnbWVudAotCQkgICAgIHRoYXQgaXQgZG9lcyBub3Qgb3ZlcmxhcCBhbnkgb3RoZXIgc2VjdGlvbiB3aXRoaW4gdGhhdAotCQkgICAgIHNlZ21lbnQuICAqLwotCQkgIG0tPnNlY3Rpb25zW2lzZWMrK10gPSBvczsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN1Z2dlc3RlZF9sbWEgPT0gMCkKLQkJc3VnZ2VzdGVkX2xtYSA9IG9zLT5sbWE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGogPT0gY3NlY3MpOwotCi0gICAgICAvKiBTdGVwIFR3bzogQWRqdXN0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQsCi0JIGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoaXNlYyA9PSBjc2VjcykKLQl7Ci0JICAvKiBBbGwgb2YgdGhlIHNlY3Rpb25zIGZpdHRlZCB3aXRoaW4gdGhlIHNlZ21lbnQgYXMgY3VycmVudGx5Ci0JICAgICBzcGVjaWZpZWQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGNhc2UuICBBZGQgdGhlIHNlZ21lbnQgdG8KLQkgICAgIHRoZSBsaXN0IG9mIGJ1aWx0IHNlZ21lbnRzIGFuZCBjYXJyeSBvbiB0byBwcm9jZXNzIHRoZSBuZXh0Ci0JICAgICBwcm9ncmFtIGhlYWRlciBpbiB0aGUgaW5wdXQgQkZELiAgKi8KLQkgIG0tPmNvdW50ID0gY3NlY3M7Ci0JICAqcG0gPSBtOwotCSAgcG0gPSAmbS0+bmV4dDsKLQotCSAgZnJlZSAoc2VjdGlvbnMpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZSBpZiAobWF0Y2hpbmdfbG1hICE9IDApCi0JewotCSAgLyogQXQgbGVhc3Qgb25lIHNlY3Rpb24gZml0cyBpbnNpZGUgdGhlIGN1cnJlbnQgc2VnbWVudC4KLQkgICAgIEtlZXAgaXQsIGJ1dCBtb2RpZnkgaXRzIHBoeXNpY2FsIGFkZHJlc3MgdG8gbWF0Y2ggdGhlCi0JICAgICBMTUEgb2YgdGhlIGZpcnN0IHNlY3Rpb24gdGhhdCBmaXR0ZWQuICAqLwotCi0JICBtLT5wX3BhZGRyID0gbWF0Y2hpbmdfbG1hOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBOb25lIG9mIHRoZSBzZWN0aW9ucyBmaXR0ZWQgaW5zaWRlIHRoZSBjdXJyZW50IHNlZ21lbnQuCi0JICAgICBDaGFuZ2UgdGhlIGN1cnJlbnQgc2VnbWVudCdzIHBoeXNpY2FsIGFkZHJlc3MgdG8gbWF0Y2gKLQkgICAgIHRoZSBMTUEgb2YgdGhlIGZpcnN0IHNlY3Rpb24uICAqLwotCi0JICBtLT5wX3BhZGRyID0gc3VnZ2VzdGVkX2xtYTsKLQl9Ci0KLSAgICAgIC8qIFN0ZXAgVGhyZWU6IExvb3Agb3ZlciB0aGUgc2VjdGlvbnMgYWdhaW4sIHRoaXMgdGltZSBhc3NpZ25pbmcKLQkgdGhvc2UgdGhhdCBmaXQgdG8gdGhlIGN1cnJlbnQgc2VnbWVudCBhbmQgcmVtdm9pbmcgdGhlbSBmcm9tIHRoZQotCSBzZWN0aW9ucyBhcnJheTsgYnV0IG1ha2luZyBzdXJlIG5vdCB0byBsZWF2ZSBsYXJnZSBnYXBzLiAgT25jZSBhbGwKLQkgcG9zc2libGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgaXQgaXMKLQkgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgYnVpbHQgc2VnbWVudHMgYW5kIGlmIHNlY3Rpb25zIHN0aWxsIHJlbWFpbgotCSB0byBiZSBhc3NpZ25lZCwgYSBuZXcgc2VnbWVudCBpcyBjb25zdHJ1Y3RlZCBiZWZvcmUgcmVwZWF0aW5nCi0JIHRoZSBsb29wLiAgKi8KLSAgICAgIGlzZWMgPSAwOwotICAgICAgZG8KLQl7Ci0JICBtLT5jb3VudCA9IDA7Ci0JICBzdWdnZXN0ZWRfbG1hID0gMDsKLQotCSAgLyogRmlsbCB0aGUgY3VycmVudCBzZWdtZW50IHdpdGggc2VjdGlvbnMgdGhhdCBmaXQuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IGNzZWNzOyBqKyspCi0JICAgIHsKLQkgICAgICBzID0gc2VjdGlvbnNbal07Ci0KLQkgICAgICBpZiAocyA9PSBOVUxMKQotCQljb250aW51ZTsKLQotCSAgICAgIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgICAgICBpZiAoSVNfQ09OVEFJTkVEX0JZIChvcy0+bG1hLCBvcy0+X3Jhd19zaXplLCBtLT5wX3BhZGRyLCBwKQotCQkgIHx8IElTX0NPUkVGSUxFX05PVEUgKHAsIHMpKQotCQl7Ci0JCSAgaWYgKG0tPmNvdW50ID09IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHRoZSBmaXJzdCBzZWN0aW9uIGluIGEgc2VnbWVudCBkb2VzIG5vdCBzdGFydCBhdAotCQkJIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQsIHRoZW4gc29tZXRoaW5nIGlzIHdyb25nLiAgKi8KLQkJICAgICAgaWYgKG9zLT5sbWEgIT0gbS0+cF9wYWRkcikKLQkJCWFib3J0ICgpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKiBwcmV2X3NlYzsKLQkJICAgICAgYmZkX3ZtYSBtYXhwYWdlc2l6ZTsKLQotCQkgICAgICBwcmV2X3NlYyA9IG0tPnNlY3Rpb25zW20tPmNvdW50IC0gMV07Ci0JCSAgICAgIG1heHBhZ2VzaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG9iZmQpLT5tYXhwYWdlc2l6ZTsKLQotCQkgICAgICAvKiBJZiB0aGUgZ2FwIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgc2VjdGlvbgotCQkJIGFuZCB0aGUgc3RhcnQgb2YgdGhpcyBzZWN0aW9uIGlzIG1vcmUgdGhhbiBtYXhwYWdlc2l6ZQotCQkJIHRoZW4gd2UgbmVlZCB0byBzdGFydCBhIG5ldyBzZWdtZW50LiAgKi8KLQkJICAgICAgaWYgKEJGRF9BTElHTiAocHJldl9zZWMtPmxtYSArIHByZXZfc2VjLT5fcmF3X3NpemUsIG1heHBhZ2VzaXplKQotCQkJICA8IEJGRF9BTElHTiAob3MtPmxtYSwgbWF4cGFnZXNpemUpKQotCQkJewotCQkJICBpZiAoc3VnZ2VzdGVkX2xtYSA9PSAwKQotCQkJICAgIHN1Z2dlc3RlZF9sbWEgPSBvcy0+bG1hOwotCi0JCQkgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgfQotCi0JCSAgbS0+c2VjdGlvbnNbbS0+Y291bnQrK10gPSBvczsKLQkJICArK2lzZWM7Ci0JCSAgc2VjdGlvbnNbal0gPSBOVUxMOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3VnZ2VzdGVkX2xtYSA9PSAwKQotCQlzdWdnZXN0ZWRfbG1hID0gb3MtPmxtYTsKLQkgICAgfQotCi0JICBCRkRfQVNTRVJUIChtLT5jb3VudCA+IDApOwotCi0JICAvKiBBZGQgdGhlIGN1cnJlbnQgc2VnbWVudCB0byB0aGUgbGlzdCBvZiBidWlsdCBzZWdtZW50cy4gICovCi0JICAqcG0gPSBtOwotCSAgcG0gPSAmbS0+bmV4dDsKLQotCSAgaWYgKGlzZWMgPCBjc2VjcykKLQkgICAgewotCSAgICAgIC8qIFdlIHN0aWxsIGhhdmUgbm90IGFsbG9jYXRlZCBhbGwgb2YgdGhlIHNlY3Rpb25zIHRvCi0JCSBzZWdtZW50cy4gIENyZWF0ZSBhIG5ldyBzZWdtZW50IGhlcmUsIGluaXRpYWxpc2UgaXQKLQkJIGFuZCBjYXJyeSBvbiBsb29waW5nLiAgKi8KLQotCSAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkJICAgYmZkX2FsbG9jIChvYmZkLAotCQkJICAgICAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJCSAgICAgICArICgoc2l6ZV90KSBjc2VjcyAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLQkgICAgICBpZiAobSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWVsZHMgb2YgdGhlIHNlZ21lbnQgbWFwLiAgU2V0IHRoZSBwaHlzaWNhbAotCQkgcGh5c2ljYWwgYWRkcmVzcyB0byB0aGUgTE1BIG9mIHRoZSBmaXJzdCBzZWN0aW9uIHRoYXQgaGFzCi0JCSBub3QgeWV0IGJlZW4gYXNzaWduZWQuICAqLwotCi0JICAgICAgbS0+bmV4dCAgICAgICAgICAgICA9IE5VTEw7Ci0JICAgICAgbS0+cF90eXBlICAgICAgICAgICA9IHAtPnBfdHlwZTsKLQkgICAgICBtLT5wX2ZsYWdzICAgICAgICAgID0gcC0+cF9mbGFnczsKLQkgICAgICBtLT5wX2ZsYWdzX3ZhbGlkICAgID0gMTsKLQkgICAgICBtLT5wX3BhZGRyICAgICAgICAgID0gc3VnZ2VzdGVkX2xtYTsKLQkgICAgICBtLT5wX3BhZGRyX3ZhbGlkICAgID0gMTsKLQkgICAgICBtLT5pbmNsdWRlc19maWxlaGRyID0gMDsKLQkgICAgICBtLT5pbmNsdWRlc19waGRycyAgID0gMDsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlIChpc2VjIDwgY3NlY3MpOwotCi0gICAgICBmcmVlIChzZWN0aW9ucyk7Ci0gICAgfQotCi0gIC8qIFRoZSBTb2xhcmlzIGxpbmtlciBjcmVhdGVzIHByb2dyYW0gaGVhZGVycyBpbiB3aGljaCBhbGwgdGhlCi0gICAgIHBfcGFkZHIgZmllbGRzIGFyZSB6ZXJvLiAgV2hlbiB3ZSB0cnkgdG8gb2JqY29weSBvciBzdHJpcCBzdWNoIGEKLSAgICAgZmlsZSwgd2UgZ2V0IGNvbmZ1c2VkLiAgQ2hlY2sgZm9yIHRoaXMgY2FzZSwgYW5kIGlmIHdlIGZpbmQgaXQKLSAgICAgcmVzZXQgdGhlIHBfcGFkZHJfdmFsaWQgZmllbGRzLiAgKi8KLSAgZm9yIChtID0gbWZpcnN0OyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotICAgIGlmIChtLT5wX3BhZGRyICE9IDApCi0gICAgICBicmVhazsKLSAgaWYgKG0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKG0gPSBtZmlyc3Q7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JbS0+cF9wYWRkcl92YWxpZCA9IDA7Ci0gICAgfQotCi0gIGVsZl90ZGF0YSAob2JmZCktPnNlZ21lbnRfbWFwID0gbWZpcnN0OwotCi0jaWYgMAotICAvKiBGaW5hbCBTdGVwOiBTb3J0IHRoZSBzZWdtZW50cyBpbnRvIGFzY2VuZGluZyBvcmRlciBvZiBwaHlzaWNhbCBhZGRyZXNzLiAqLwotICBpZiAobWZpcnN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9zZWdtZW50X21hcCogcHJldjsKLQotICAgICAgcHJldiA9IG1maXJzdDsKLSAgICAgIGZvciAobSA9IG1maXJzdC0+bmV4dDsgbSAhPSBOVUxMOyBwcmV2ID0gbSwgbSA9IG0tPm5leHQpCi0JewotCSAgLyogWWVzIEkga25vdyAtIGl0cyBhIGJ1YmJsZSBzb3J0Li4uLiovCi0JICBpZiAobS0+bmV4dCAhPSBOVUxMICYmIChtLT5uZXh0LT5wX3BhZGRyIDwgbS0+cF9wYWRkcikpCi0JICAgIHsKLQkgICAgICAvKiBzd2FwIG0gYW5kIG0tPm5leHQgKi8KLQkgICAgICBwcmV2LT5uZXh0ID0gbS0+bmV4dDsKLQkgICAgICBtLT5uZXh0ID0gbS0+bmV4dC0+bmV4dDsKLQkgICAgICBwcmV2LT5uZXh0LT5uZXh0ID0gbTsKLQotCSAgICAgIC8qIHJlc3RhcnQgbG9vcC4gKi8KLQkgICAgICBtID0gbWZpcnN0OwotCSAgICB9Ci0JfQotICAgIH0KLSNlbmRpZgotCi0jdW5kZWYgSVNfQ09OVEFJTkVEX0JZCi0jdW5kZWYgSVNfU09MQVJJU19QVF9JTlRFUlAKLSN1bmRlZiBJU19DT1JFRklMRV9OT1RFCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIFRoaXMgY29waWVzIG92ZXIgdGhlIGVudHNpemUKLSAgIGZpZWxkLCBhbmQgc29tZXRpbWVzIHRoZSBpbmZvIGZpZWxkLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYywgb2JmZCwgb3NlYykKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYzsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmloZHIsICpvaGRyOwotCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBDb3B5IG92ZXIgcHJpdmF0ZSBCRkQgZGF0YSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjb3BpZWQuCi0gICAgIFRoaXMgbXVzdCBiZSBkb25lIGhlcmUsIHJhdGhlciB0aGFuIGluIHRoZSBjb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgICAgZW50cnkgcG9pbnQsIGJlY2F1c2UgdGhlIGxhdHRlciBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb24KLSAgICAgY29udGVudHMgaGF2ZSBiZWVuIHNldCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcHJvZ3JhbSBoZWFkZXJzIGhhdmUKLSAgICAgYWxyZWFkeSBiZWVuIHdvcmtlZCBvdXQuICAqLwotICBpZiAoZWxmX3RkYXRhIChvYmZkKS0+c2VnbWVudF9tYXAgPT0gTlVMTAotICAgICAgJiYgZWxmX3RkYXRhIChpYmZkKS0+cGhkciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBPbmx5IHNldCB1cCB0aGUgc2VnbWVudHMgaWYgdGhlcmUgYXJlIG5vIG1vcmUgU0VDX0FMTE9DCi0gICAgICAgICBzZWN0aW9ucy4gIEZJWE1FOiBUaGlzIHdvbid0IGRvIHRoZSByaWdodCB0aGluZyBpZiBvYmpjb3B5IGlzCi0gICAgICAgICB1c2VkIHRvIHJlbW92ZSB0aGUgbGFzdCBTRUNfQUxMT0Mgc2VjdGlvbiwgc2luY2Ugb2JqY29weQotICAgICAgICAgd29uJ3QgY2FsbCB0aGlzIHJvdXRpbmUgaW4gdGhhdCBjYXNlLiAgKi8KLSAgICAgIGZvciAocyA9IGlzZWMtPm5leHQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoISBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkcjsKLSAgb2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+dGhpc19oZHI7Ci0KLSAgb2hkci0+c2hfZW50c2l6ZSA9IGloZHItPnNoX2VudHNpemU7Ci0KLSAgaWYgKGloZHItPnNoX3R5cGUgPT0gU0hUX1NZTVRBQgotICAgICAgfHwgaWhkci0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNCi0gICAgICB8fCBpaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVybmVlZAotICAgICAgfHwgaWhkci0+c2hfdHlwZSA9PSBTSFRfR05VX3ZlcmRlZikKLSAgICBvaGRyLT5zaF9pbmZvID0gaWhkci0+c2hfaW5mbzsKLQotICBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+dXNlX3JlbGFfcAotICAgID0gZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnVzZV9yZWxhX3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24uICBJZiB0aGlzIHN5bWJvbCBpcyBpbiBhIHNlY3Rpb24KLSAgIHdoaWNoIHdlIGRpZCBub3QgbWFwIGludG8gYSBCRkQgc2VjdGlvbiwgdHJ5IHRvIG1hcCB0aGUgc2VjdGlvbgotICAgaW5kZXggY29ycmVjdGx5LiAgV2UgdXNlIHNwZWNpYWwgbWFjcm8gZGVmaW5pdGlvbnMgZm9yIHRoZSBtYXBwZWQKLSAgIHNlY3Rpb24gaW5kaWNlczsgdGhlc2UgZGVmaW5pdGlvbnMgYXJlIGludGVycHJldGVkIGJ5IHRoZQotICAgc3dhcF9vdXRfc3ltcyBmdW5jdGlvbi4gICovCi0KLSNkZWZpbmUgTUFQX09ORVNZTVRBQiAoU0hOX0xPUkVTRVJWRSAtIDEpCi0jZGVmaW5lIE1BUF9EWU5TWU1UQUIgKFNITl9MT1JFU0VSVkUgLSAyKQotI2RlZmluZSBNQVBfU1RSVEFCIChTSE5fTE9SRVNFUlZFIC0gMykKLSNkZWZpbmUgTUFQX1NIU1RSVEFCIChTSE5fTE9SRVNFUlZFIC0gNCkKLQotYm9vbGVhbgotX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIChpYmZkLCBpc3ltYXJnLCBvYmZkLCBvc3ltYXJnKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzeW1ib2wgKmlzeW1hcmc7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXN5bWJvbCAqb3N5bWFyZzsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICppc3ltLCAqb3N5bTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaXN5bSA9IGVsZl9zeW1ib2xfZnJvbSAoaWJmZCwgaXN5bWFyZyk7Ci0gIG9zeW0gPSBlbGZfc3ltYm9sX2Zyb20gKG9iZmQsIG9zeW1hcmcpOwotCi0gIGlmIChpc3ltICE9IE5VTEwKLSAgICAgICYmIG9zeW0gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChpc3ltLT5zeW1ib2wuc2VjdGlvbikpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNobmR4OwotCi0gICAgICBzaG5keCA9IGlzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHg7Ci0gICAgICBpZiAoc2huZHggPT0gZWxmX29uZXN5bXRhYiAoaWJmZCkpCi0Jc2huZHggPSBNQVBfT05FU1lNVEFCOwotICAgICAgZWxzZSBpZiAoc2huZHggPT0gZWxmX2R5bnN5bXRhYiAoaWJmZCkpCi0Jc2huZHggPSBNQVBfRFlOU1lNVEFCOwotICAgICAgZWxzZSBpZiAoc2huZHggPT0gZWxmX3RkYXRhIChpYmZkKS0+c3RydGFiX3NlY3Rpb24pCi0Jc2huZHggPSBNQVBfU1RSVEFCOwotICAgICAgZWxzZSBpZiAoc2huZHggPT0gZWxmX3RkYXRhIChpYmZkKS0+c2hzdHJ0YWJfc2VjdGlvbikKLQlzaG5keCA9IE1BUF9TSFNUUlRBQjsKLSAgICAgIG9zeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHggPSBzaG5keDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN3YXBfb3V0X3N5bXMgKGFiZmQsIHN0dHAsIHJlbG9jYXRhYmxlX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKnN0dHA7Ci0gICAgIGludCByZWxvY2F0YWJsZV9wOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIGlmICghZWxmX21hcF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRHVtcCBvdXQgdGhlIHN5bXRhYnMuICovCi0gIHsKLSAgICBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgICBhc3ltYm9sICoqc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3R0OwotICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW1zdHJ0YWJfaGRyOwotICAgIGNoYXIgKm91dGJvdW5kX3N5bXM7Ci0gICAgaW50IGlkeDsKLQotICAgIHN0dCA9IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICAgIGlmIChzdHQgPT0gTlVMTCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICBzeW10YWJfaGRyLT5zaF90eXBlID0gU0hUX1NZTVRBQjsKLSAgICBzeW10YWJfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgIHN5bXRhYl9oZHItPnNoX3NpemUgPSBzeW10YWJfaGRyLT5zaF9lbnRzaXplICogKHN5bWNvdW50ICsgMSk7Ci0gICAgc3ltdGFiX2hkci0+c2hfaW5mbyA9IGVsZl9udW1fbG9jYWxzIChhYmZkKSArIDE7Ci0gICAgc3ltdGFiX2hkci0+c2hfYWRkcmFsaWduID0gYmVkLT5zLT5maWxlX2FsaWduOwotCi0gICAgc3ltc3RydGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyOwotICAgIHN5bXN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotCi0gICAgb3V0Ym91bmRfc3ltcyA9IGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAgICAoMSArIHN5bWNvdW50KSAqIGJlZC0+cy0+c2l6ZW9mX3N5bSk7Ci0gICAgaWYgKG91dGJvdW5kX3N5bXMgPT0gTlVMTCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChQVFIpIG91dGJvdW5kX3N5bXM7Ci0KLSAgICAvKiBub3cgZ2VuZXJhdGUgdGhlIGRhdGEgKGZvciAiY29udGVudHMiKSAqLwotICAgIHsKLSAgICAgIC8qIEZpbGwgaW4gemVyb3RoIHN5bWJvbCBhbmQgc3dhcCBpdCBvdXQuICAqLwotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfdmFsdWUgPSAwOwotICAgICAgc3ltLnN0X3NpemUgPSAwOwotICAgICAgc3ltLnN0X2luZm8gPSAwOwotICAgICAgc3ltLnN0X290aGVyID0gMDsKLSAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLSAgICAgIGJlZC0+cy0+c3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmc3ltLCAoUFRSKSBvdXRib3VuZF9zeW1zKTsKLSAgICAgIG91dGJvdW5kX3N5bXMgKz0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgIH0KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHN5bWNvdW50OyBpZHgrKykKLSAgICAgIHsKLQlFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLQliZmRfdm1hIHZhbHVlID0gc3ltc1tpZHhdLT52YWx1ZTsKLQllbGZfc3ltYm9sX3R5cGUgKnR5cGVfcHRyOwotCWZsYWd3b3JkIGZsYWdzID0gc3ltc1tpZHhdLT5mbGFnczsKLQlpbnQgdHlwZTsKLQotCWlmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgIC8qIFNlY3Rpb24gc3ltYm9scyBoYXZlIG5vIG5hbWVzLiAgKi8KLQkgIHN5bS5zdF9uYW1lID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIHN5bS5zdF9uYW1lID0gKHVuc2lnbmVkIGxvbmcpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc3R0LAotCQkJCQkJCSAgICAgIHN5bXNbaWR4XS0+bmFtZSwKLQkJCQkJCQkgICAgICB0cnVlLCBmYWxzZSk7Ci0JICAgIGlmIChzeW0uc3RfbmFtZSA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JdHlwZV9wdHIgPSBlbGZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bXNbaWR4XSk7Ci0KLQlpZiAoKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0JICAgICYmIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHsKLQkgICAgLyogRUxGIGNvbW1vbiBzeW1ib2xzIHB1dCB0aGUgYWxpZ25tZW50IGludG8gdGhlIGB2YWx1ZScgZmllbGQsCi0JICAgICAgIGFuZCB0aGUgc2l6ZSBpbnRvIHRoZSBgc2l6ZScgZmllbGQuICBUaGlzIGlzIGJhY2t3YXJkcyBmcm9tCi0JICAgICAgIGhvdyBCRkQgaGFuZGxlcyBpdCwgc28gcmV2ZXJzZSBpdCBoZXJlLiAgKi8KLQkgICAgc3ltLnN0X3NpemUgPSB2YWx1ZTsKLQkgICAgaWYgKHR5cGVfcHRyID09IE5VTEwKLQkJfHwgdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWUgPT0gMCkKLQkgICAgICBzeW0uc3RfdmFsdWUgPSB2YWx1ZSA+PSAxNiA/IDE2IDogKDEgPDwgYmZkX2xvZzIgKHZhbHVlKSk7Ci0JICAgIGVsc2UKLQkgICAgICBzeW0uc3RfdmFsdWUgPSB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZTsKLQkgICAgc3ltLnN0X3NobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0JICAgICAgKGFiZmQsIHN5bXNbaWR4XS0+c2VjdGlvbik7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBhc2VjdGlvbiAqc2VjID0gc3ltc1tpZHhdLT5zZWN0aW9uOwotCSAgICBpbnQgc2huZHg7Ci0KLQkgICAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JICAgICAgewotCQl2YWx1ZSArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0JCXNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICAgICAgfQotCSAgICAvKiBEb24ndCBhZGQgaW4gdGhlIHNlY3Rpb24gdm1hIGZvciByZWxvY2F0YWJsZSBvdXRwdXQuICAqLwotCSAgICBpZiAoISByZWxvY2F0YWJsZV9wKQotCSAgICAgIHZhbHVlICs9IHNlYy0+dm1hOwotCSAgICBzeW0uc3RfdmFsdWUgPSB2YWx1ZTsKLQkgICAgc3ltLnN0X3NpemUgPSB0eXBlX3B0ciA/IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgOiAwOwotCi0JICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLQkJJiYgdHlwZV9wdHIgIT0gTlVMTAotCQkmJiB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keCAhPSAwKQotCSAgICAgIHsKLQkJLyogVGhpcyBzeW1ib2wgaXMgaW4gYSByZWFsIEVMRiBzZWN0aW9uIHdoaWNoIHdlIGRpZAotICAgICAgICAgICAgICAgICAgIG5vdCBjcmVhdGUgYXMgYSBCRkQgc2VjdGlvbi4gIFVuZG8gdGhlIG1hcHBpbmcgZG9uZQotICAgICAgICAgICAgICAgICAgIGJ5IGNvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YS4gICovCi0JCXNobmR4ID0gdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHg7Ci0JCXN3aXRjaCAoc2huZHgpCi0JCSAgewotCQkgIGNhc2UgTUFQX09ORVNZTVRBQjoKLQkJICAgIHNobmR4ID0gZWxmX29uZXN5bXRhYiAoYWJmZCk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIE1BUF9EWU5TWU1UQUI6Ci0JCSAgICBzaG5keCA9IGVsZl9keW5zeW10YWIgKGFiZmQpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBNQVBfU1RSVEFCOgotCQkgICAgc2huZHggPSBlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfc2VjdGlvbjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgTUFQX1NIU1RSVEFCOgotCQkgICAgc2huZHggPSBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9zZWN0aW9uOwotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0JCWlmIChzaG5keCA9PSAtMSkKLQkJICB7Ci0JCSAgICBhc2VjdGlvbiAqc2VjMjsKLQotCQkgICAgLyogV3JpdGluZyB0aGlzIHdvdWxkIGJlIGEgaGVsbCBvZiBhIGxvdCBlYXNpZXIgaWYKLQkJICAgICAgIHdlIGhhZCBzb21lIGRlY2VudCBkb2N1bWVudGF0aW9uIG9uIGJmZCwgYW5kCi0JCSAgICAgICBrbmV3IHdoYXQgdG8gZXhwZWN0IG9mIHRoZSBsaWJyYXJ5LCBhbmQgd2hhdCB0bwotCQkgICAgICAgZGVtYW5kIG9mIGFwcGxpY2F0aW9ucy4gIEZvciBleGFtcGxlLCBpdAotCQkgICAgICAgYXBwZWFycyB0aGF0IGBvYmpjb3B5JyBtaWdodCBub3Qgc2V0IHRoZQotCQkgICAgICAgc2VjdGlvbiBvZiBhIHN5bWJvbCB0byBiZSBhIHNlY3Rpb24gdGhhdCBpcwotCQkgICAgICAgYWN0dWFsbHkgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkJICAgIHNlYzIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc2VjLT5uYW1lKTsKLQkJICAgIEJGRF9BU1NFUlQgKHNlYzIgIT0gMCk7Ci0JCSAgICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjMik7Ci0JCSAgICBCRkRfQVNTRVJUIChzaG5keCAhPSAtMSk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBzeW0uc3Rfc2huZHggPSBzaG5keDsKLQkgIH0KLQotCWlmICgoZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IDApCi0JICB0eXBlID0gU1RUX0ZVTkM7Ci0JZWxzZSBpZiAoKGZsYWdzICYgQlNGX09CSkVDVCkgIT0gMCkKLQkgIHR5cGUgPSBTVFRfT0JKRUNUOwotCWVsc2UKLQkgIHR5cGUgPSBTVFRfTk9UWVBFOwotCi0gICAgICAgIC8qIFByb2Nlc3Nvci1zcGVjaWZpYyB0eXBlcyAqLwotICAgICAgICBpZiAodHlwZV9wdHIgIT0gTlVMTAotCSAgICAmJiBiZWQtPmVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSkKLSAgICAgICAgICB0eXBlID0gKCpiZWQtPmVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSkgKCZ0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bSwgdHlwZSk7Ci0KLQlpZiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLQllbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNbaWR4XS0+c2VjdGlvbikpCi0JICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCB0eXBlKTsKLQllbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bXNbaWR4XS0+c2VjdGlvbikpCi0JICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPICgoKGZsYWdzICYgQlNGX1dFQUspCi0JCQkJICAgICAgPyBTVEJfV0VBSwotCQkJCSAgICAgIDogU1RCX0dMT0JBTCksCi0JCQkJICAgICB0eXBlKTsKLQllbHNlIGlmIChmbGFncyAmIEJTRl9GSUxFKQotCSAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfRklMRSk7Ci0JZWxzZQotCSAgewotCSAgICBpbnQgYmluZCA9IFNUQl9MT0NBTDsKLQotCSAgICBpZiAoZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JICAgICAgYmluZCA9IFNUQl9MT0NBTDsKLQkgICAgZWxzZSBpZiAoZmxhZ3MgJiBCU0ZfV0VBSykKLQkgICAgICBiaW5kID0gU1RCX1dFQUs7Ci0JICAgIGVsc2UgaWYgKGZsYWdzICYgQlNGX0dMT0JBTCkKLQkgICAgICBiaW5kID0gU1RCX0dMT0JBTDsKLQotCSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChiaW5kLCB0eXBlKTsKLQkgIH0KLQotCWlmICh0eXBlX3B0ciAhPSBOVUxMKQotCSAgc3ltLnN0X290aGVyID0gdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXI7Ci0JZWxzZQotCSAgc3ltLnN0X290aGVyID0gMDsKLQotCWJlZC0+cy0+c3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmc3ltLCAoUFRSKSBvdXRib3VuZF9zeW1zKTsKLQlvdXRib3VuZF9zeW1zICs9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICAgIH0KLQotICAgICpzdHRwID0gc3R0OwotICAgIHN5bXN0cnRhYl9oZHItPnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChzdHQpOwotICAgIHN5bXN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotCi0gICAgc3ltc3RydGFiX2hkci0+c2hfZmxhZ3MgPSAwOwotICAgIHN5bXN0cnRhYl9oZHItPnNoX2FkZHIgPSAwOwotICAgIHN5bXN0cnRhYl9oZHItPnNoX2VudHNpemUgPSAwOwotICAgIHN5bXN0cnRhYl9oZHItPnNoX2xpbmsgPSAwOwotICAgIHN5bXN0cnRhYl9oZHItPnNoX2luZm8gPSAwOwotICAgIHN5bXN0cnRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDE7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgc3ltdGFiIHZlY3Rvci4KLQotICAgTm90ZSB0aGF0IHdlIGJhc2UgaXQgb24gdGhlIGNvdW50IHBsdXMgMSwgc2luY2Ugd2Ugd2lsbCBudWxsIHRlcm1pbmF0ZQotICAgdGhlIHZlY3RvciBhbGxvY2F0ZWQgYmFzZWQgb24gdGhpcyBzaXplLiAgSG93ZXZlciwgdGhlIEVMRiBzeW1ib2wgdGFibGUKLSAgIGFsd2F5cyBoYXMgYSBkdW1teSBlbnRyeSBhcyBzeW1ib2wgIzAsIHNvIGl0IGVuZHMgdXAgZXZlbi4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBzeW1jb3VudDsKLSAgbG9uZyBzeW10YWJfc2l6ZTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2Zfc3ltOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCAtIDEgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIHJldHVybiBzeW10YWJfc2l6ZTsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIGxvbmcgc3ltdGFiX3NpemU7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkcjsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBzeW1jb3VudCA9IGhkci0+c2hfc2l6ZSAvIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX3N5bTsKLSAgc3ltdGFiX3NpemUgPSAoc3ltY291bnQgLSAxICsgMSkgKiAoc2l6ZW9mIChhc3ltYm9sICopKTsKLQotICByZXR1cm4gc3ltdGFiX3NpemU7Ci19Ci0KLWxvbmcKLV9iZmRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0vKiBDYW5vbmljYWxpemUgdGhlIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0cjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKCEgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9yZWxvY190YWJsZSAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLAotCQkJCQkJCSAgIHN5bWJvbHMsCi0JCQkJCQkJICAgZmFsc2UpKQotICAgIHJldHVybiAtMTsKLQotICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGkrKykKLSAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQotICAqcmVscHRyID0gTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLWxvbmcKLV9iZmRfZWxmX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBsb25nIHN5bWNvdW50ID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9zeW1ib2xfdGFibGUKLSAgICAoYWJmZCwgYWxvY2F0aW9uLCBmYWxzZSk7Ci0KLSAgaWYgKHN5bWNvdW50ID49IDApCi0gICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKLSAgcmV0dXJuIHN5bWNvdW50OwotfQotCi1sb25nCi1fYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICByZXR1cm4gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9zeW1ib2xfdGFibGUKLSAgICAoYWJmZCwgYWxvY2F0aW9uLCB0cnVlKTsKLX0KLQotLyogUmV0dXJuIHRoZSBzaXplIHJlcXVpcmVkIGZvciB0aGUgZHluYW1pYyByZWxvYyBlbnRyaWVzLiAgQW55Ci0gICBzZWN0aW9uIHRoYXQgd2FzIGFjdHVhbGx5IGluc3RhbGxlZCBpbiB0aGUgQkZELCBhbmQgaGFzIHR5cGUKLSAgIFNIVF9SRUwgb3IgU0hUX1JFTEEsIGFuZCB1c2VzIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgaXMKLSAgIGNvbnNpZGVyZWQgdG8gYmUgYSBkeW5hbWljIHJlbG9jIHNlY3Rpb24uICAqLwotCi1sb25nCi1fYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHJldDsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0ID0gc2l6ZW9mIChhcmVsZW50ICopOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPT0gZWxmX2R5bnN5bXRhYiAoYWJmZCkKLQkmJiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAotCSAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkpCi0gICAgICByZXQgKz0gKChzLT5fcmF3X3NpemUgLyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfZW50c2l6ZSkKLQkgICAgICAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQ2Fub25pY2FsaXplIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcy4gIE5vdGUgdGhhdCB3ZSByZXR1cm4KLSAgIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGFzIGEgc2luZ2xlIGJsb2NrLCBhbHRob3VnaCB0aGV5IGFyZQotICAgYWN0dWFsbHkgYXNzb2NpYXRlZCB3aXRoIHBhcnRpY3VsYXIgc2VjdGlvbnM7IHRoZSBpbnRlcmZhY2UsIHdoaWNoCi0gICB3YXMgZGVzaWduZWQgZm9yIFN1bk9TIHN0eWxlIHNoYXJlZCBsaWJyYXJpZXMsIGV4cGVjdHMgdGhhdCB0aGVyZQotICAgaXMgb25seSBvbmUgc2V0IG9mIGR5bmFtaWMgcmVsb2NzLiAgQW55IHNlY3Rpb24gdGhhdCB3YXMgYWN0dWFsbHkKLSAgIGluc3RhbGxlZCBpbiB0aGUgQkZELCBhbmQgaGFzIHR5cGUgU0hUX1JFTCBvciBTSFRfUkVMQSwgYW5kIHVzZXMKLSAgIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgaXMgY29uc2lkZXJlZCB0byBiZSBhIGR5bmFtaWMgcmVsb2MKLSAgIHNlY3Rpb24uICAqLwotCi1sb25nCi1fYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgc3RvcmFnZSwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICoqc3RvcmFnZTsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci17Ci0gIGJvb2xlYW4gKCpzbHVycF9yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIGFzZWN0aW9uICpzOwotICBsb25nIHJldDsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBzbHVycF9yZWxvY3MgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3JlbG9jX3RhYmxlOwotICByZXQgPSAwOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPT0gZWxmX2R5bnN5bXRhYiAoYWJmZCkKLQkgICYmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMCi0JICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTEEpKQotCXsKLQkgIGFyZWxlbnQgKnA7Ci0JICBsb25nIGNvdW50LCBpOwotCi0JICBpZiAoISAoKnNsdXJwX3JlbG9jcykgKGFiZmQsIHMsIHN5bXMsIHRydWUpKQotCSAgICByZXR1cm4gLTE7Ci0JICBjb3VudCA9IHMtPl9yYXdfc2l6ZSAvIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplOwotCSAgcCA9IHMtPnJlbG9jYXRpb247Ci0JICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkgICAgKnN0b3JhZ2UrKyA9IHArKzsKLQkgIHJldCArPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gICpzdG9yYWdlID0gTlVMTDsKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogUmVhZCBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0KLSAgaWYgKGVsZl9keW52ZXJkZWYgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkZWYgKmV2ZXJkZWY7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICppdmVyZGVmOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPQotCSgoRWxmX0ludGVybmFsX1ZlcmRlZiAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBoZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJkZWYpKSk7Ci0gICAgICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzID0gaGRyLT5zaF9pbmZvOwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3JlYWQgKChQVFIpIGNvbnRlbnRzLCAxLCBoZHItPnNoX3NpemUsIGFiZmQpICE9IGhkci0+c2hfc2l6ZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZXZlcmRlZiA9IChFbGZfRXh0ZXJuYWxfVmVyZGVmICopIGNvbnRlbnRzOwotICAgICAgaXZlcmRlZiA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoZHItPnNoX2luZm87IGkrKywgaXZlcmRlZisrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpldmVyZGF1eDsKLQkgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICppdmVyZGF1eDsKLQkgIHVuc2lnbmVkIGludCBqOwotCi0JICBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbiAoYWJmZCwgZXZlcmRlZiwgaXZlcmRlZik7Ci0KLQkgIGl2ZXJkZWYtPnZkX2JmZCA9IGFiZmQ7Ci0KLQkgIGl2ZXJkZWYtPnZkX2F1eHB0ciA9ICgoRWxmX0ludGVybmFsX1ZlcmRhdXggKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChpdmVyZGVmLT52ZF9jbnQKLQkJCQkJICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfVmVyZGF1eCkpKSk7Ci0JICBpZiAoaXZlcmRlZi0+dmRfYXV4cHRyID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBldmVyZGF1eCA9ICgoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikKLQkJICAgICAgKChiZmRfYnl0ZSAqKSBldmVyZGVmICsgaXZlcmRlZi0+dmRfYXV4KSk7Ci0JICBpdmVyZGF1eCA9IGl2ZXJkZWYtPnZkX2F1eHB0cjsKLQkgIGZvciAoaiA9IDA7IGogPCBpdmVyZGVmLT52ZF9jbnQ7IGorKywgaXZlcmRhdXgrKykKLQkgICAgewotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiAoYWJmZCwgZXZlcmRhdXgsIGl2ZXJkYXV4KTsKLQotCSAgICAgIGl2ZXJkYXV4LT52ZGFfbm9kZW5hbWUgPQotCQliZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssCi0JCQkJCQkgaXZlcmRhdXgtPnZkYV9uYW1lKTsKLQkgICAgICBpZiAoaXZlcmRhdXgtPnZkYV9ub2RlbmFtZSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmIChqICsgMSA8IGl2ZXJkZWYtPnZkX2NudCkKLQkJaXZlcmRhdXgtPnZkYV9uZXh0cHRyID0gaXZlcmRhdXggKyAxOwotCSAgICAgIGVsc2UKLQkJaXZlcmRhdXgtPnZkYV9uZXh0cHRyID0gTlVMTDsKLQotCSAgICAgIGV2ZXJkYXV4ID0gKChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKQotCQkJICAoKGJmZF9ieXRlICopIGV2ZXJkYXV4ICsgaXZlcmRhdXgtPnZkYV9uZXh0KSk7Ci0JICAgIH0KLQotCSAgaXZlcmRlZi0+dmRfbm9kZW5hbWUgPSBpdmVyZGVmLT52ZF9hdXhwdHItPnZkYV9ub2RlbmFtZTsKLQotCSAgaWYgKGkgKyAxIDwgaGRyLT5zaF9pbmZvKQotCSAgICBpdmVyZGVmLT52ZF9uZXh0ZGVmID0gaXZlcmRlZiArIDE7Ci0JICBlbHNlCi0JICAgIGl2ZXJkZWYtPnZkX25leHRkZWYgPSBOVUxMOwotCi0JICBldmVyZGVmID0gKChFbGZfRXh0ZXJuYWxfVmVyZGVmICopCi0JCSAgICAgKChiZmRfYnl0ZSAqKSBldmVyZGVmICsgaXZlcmRlZi0+dmRfbmV4dCkpOwotCX0KLQotICAgICAgZnJlZSAoY29udGVudHMpOwotICAgICAgY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKmV2ZXJuZWVkOwotICAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKml2ZXJuZWVkOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfaGRyOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPQotCSgoRWxmX0ludGVybmFsX1Zlcm5lZWQgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfVmVybmVlZCkpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcnJlZnMgPSBoZHItPnNoX2luZm87Ci0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoKFBUUikgY29udGVudHMsIDEsIGhkci0+c2hfc2l6ZSwgYWJmZCkgIT0gaGRyLT5zaF9zaXplKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBldmVybmVlZCA9IChFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKSBjb250ZW50czsKLSAgICAgIGl2ZXJuZWVkID0gZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmOwotICAgICAgZm9yIChpID0gMDsgaSA8IGhkci0+c2hfaW5mbzsgaSsrLCBpdmVybmVlZCsrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICpldmVybmF1eDsKLQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICppdmVybmF1eDsKLQkgIHVuc2lnbmVkIGludCBqOwotCi0JICBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4gKGFiZmQsIGV2ZXJuZWVkLCBpdmVybmVlZCk7Ci0KLQkgIGl2ZXJuZWVkLT52bl9iZmQgPSBhYmZkOwotCi0JICBpdmVybmVlZC0+dm5fZmlsZW5hbWUgPQotCSAgICBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssCi0JCQkJCSAgICAgaXZlcm5lZWQtPnZuX2ZpbGUpOwotCSAgaWYgKGl2ZXJuZWVkLT52bl9maWxlbmFtZSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaXZlcm5lZWQtPnZuX2F1eHB0ciA9Ci0JICAgICgoRWxmX0ludGVybmFsX1Zlcm5hdXggKikKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCWl2ZXJuZWVkLT52bl9jbnQgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJuYXV4KSkpOwotCi0JICBldmVybmF1eCA9ICgoRWxmX0V4dGVybmFsX1Zlcm5hdXggKikKLQkJICAgICAgKChiZmRfYnl0ZSAqKSBldmVybmVlZCArIGl2ZXJuZWVkLT52bl9hdXgpKTsKLQkgIGl2ZXJuYXV4ID0gaXZlcm5lZWQtPnZuX2F1eHB0cjsKLQkgIGZvciAoaiA9IDA7IGogPCBpdmVybmVlZC0+dm5fY250OyBqKyssIGl2ZXJuYXV4KyspCi0JICAgIHsKLQkgICAgICBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4gKGFiZmQsIGV2ZXJuYXV4LCBpdmVybmF1eCk7Ci0KLQkgICAgICBpdmVybmF1eC0+dm5hX25vZGVuYW1lID0KLQkJYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLAotCQkJCQkJIGl2ZXJuYXV4LT52bmFfbmFtZSk7Ci0JICAgICAgaWYgKGl2ZXJuYXV4LT52bmFfbm9kZW5hbWUgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBpZiAoaiArIDEgPCBpdmVybmVlZC0+dm5fY250KQotCQlpdmVybmF1eC0+dm5hX25leHRwdHIgPSBpdmVybmF1eCArIDE7Ci0JICAgICAgZWxzZQotCQlpdmVybmF1eC0+dm5hX25leHRwdHIgPSBOVUxMOwotCi0JICAgICAgZXZlcm5hdXggPSAoKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopCi0JCQkgICgoYmZkX2J5dGUgKikgZXZlcm5hdXggKyBpdmVybmF1eC0+dm5hX25leHQpKTsKLQkgICAgfQotCi0JICBpZiAoaSArIDEgPCBoZHItPnNoX2luZm8pCi0JICAgIGl2ZXJuZWVkLT52bl9uZXh0cmVmID0gaXZlcm5lZWQgKyAxOwotCSAgZWxzZQotCSAgICBpdmVybmVlZC0+dm5fbmV4dHJlZiA9IE5VTEw7Ci0KLQkgIGV2ZXJuZWVkID0gKChFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKQotCQkgICAgICAoKGJmZF9ieXRlICopIGV2ZXJuZWVkICsgaXZlcm5lZWQtPnZuX25leHQpKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICAgIGNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotYXN5bWJvbCAqCi1fYmZkX2VsZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBlbGZfc3ltYm9sX3R5cGUgKm5ld3N5bTsKLQotICBuZXdzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoZWxmX3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3c3ltKQotICAgIHJldHVybiBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgbmV3c3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gICAgICByZXR1cm4gJm5ld3N5bS0+c3ltYm9sOwotICAgIH0KLX0KLQotdm9pZAotX2JmZF9lbGZfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgbmFtZSBpbXBsaWVzIGEgbG9jYWwgc3ltYm9sLiAgTW9zdCB0YXJnZXRzCi0gICB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgdGhlIGlzX2xvY2FsX2xhYmVsX25hbWUgZW50cnkgcG9pbnQsIGJ1dCBzb21lCi0gICBvdmVycmlkZSBpdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICAvKiBOb3JtYWwgbG9jYWwgc3ltYm9scyBzdGFydCB3aXRoIGBgLkwnJy4gICovCi0gIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdMJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBdCBsZWFzdCBzb21lIFNWUjQgY29tcGlsZXJzIChlLmcuLCBVbml4V2FyZSAyLjEgY2MpIGdlbmVyYXRlCi0gICAgIERXQVJGIGRlYnVnZ2luZyBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggYGAuLicnLiAgKi8KLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJy4nKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIGdjYyB3aWxsIHNvbWV0aW1lcyBnZW5lcmF0ZSBzeW1ib2xzIGJlZ2lubmluZyB3aXRoIGBgXy5MXycnIHdoZW4KLSAgICAgZW1pdHRpbmcgRFdBUkYgZGVidWdnaW5nIG91dHB1dC4gIEkgc3VzcGVjdCB0aGlzIGlzIGFjdHVhbGx5IGEKLSAgICAgc21hbGwgYnVnIGluIGdjYyAoaXQgY2FsbHMgQVNNX09VVFBVVF9MQUJFTCB3aGVuIGl0IHNob3VsZCBjYWxsCi0gICAgIEFTTV9HRU5FUkFURV9JTlRFUk5BTF9MQUJFTCwgYW5kIHRoaXMgY2F1c2VzIHRoZSBsZWFkaW5nCi0gICAgIHVuZGVyc2NvcmUgdG8gYmUgZW1pdHRlZCBvbiBzb21lIEVMRiB0YXJnZXRzKS4gIEZvciBlYXNlIG9mIHVzZSwKLSAgICAgd2UgdHJlYXQgc3VjaCBzeW1ib2xzIGFzIGxvY2FsLiAgKi8KLSAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gJ0wnICYmIG5hbWVbM10gPT0gJ18nKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYWxlbnQgKgotX2JmZF9lbGZfZ2V0X2xpbmVubyAoaWdub3JlX2FiZmQsIHN5bWJvbCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIC8qIElmIHRoaXMgaXNuJ3QgdGhlIHJpZ2h0IGFyY2hpdGVjdHVyZSBmb3IgdGhpcyBiYWNrZW5kLCBhbmQgdGhpcwotICAgICBpc24ndCB0aGUgZ2VuZXJpYyBiYWNrZW5kLCBmYWlsLiAgKi8KLSAgaWYgKGFyY2ggIT0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5hcmNoCi0gICAgICAmJiBhcmNoICE9IGJmZF9hcmNoX3Vua25vd24KLSAgICAgICYmIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+YXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiBhbmQgb2Zmc2V0LCBmb3IgZXJyb3IKLSAgIHJlcG9ydGluZy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAotCQkJICAgIHNlY3Rpb24sCi0JCQkgICAgc3ltYm9scywKLQkJCSAgICBvZmZzZXQsCi0JCQkgICAgZmlsZW5hbWVfcHRyLAotCQkJICAgIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkgICAgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBhc3ltYm9sICpmdW5jOwotICBiZmRfdm1hIGxvd19mdW5jOwotICBhc3ltYm9sICoqcDsKLQotICBpZiAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgCi0JCQkJICAgICBsaW5lX3B0cikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0ciwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKLQkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKLQkJCQkJICAgICAmZWxmX3RkYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoc3ltYm9scyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmaWxlbmFtZSA9IE5VTEw7Ci0gIGZ1bmMgPSBOVUxMOwotICBsb3dfZnVuYyA9IDA7Ci0KLSAgZm9yIChwID0gc3ltYm9sczsgKnAgIT0gTlVMTDsgcCsrKQotICAgIHsKLSAgICAgIGVsZl9zeW1ib2xfdHlwZSAqcTsKLQotICAgICAgcSA9IChlbGZfc3ltYm9sX3R5cGUgKikgKnA7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKCZxLT5zeW1ib2wpICE9IHNlY3Rpb24pCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoRUxGX1NUX1RZUEUgKHEtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQljYXNlIFNUVF9GSUxFOgotCSAgZmlsZW5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgmcS0+c3ltYm9sKTsKLQkgIGJyZWFrOwotCWNhc2UgU1RUX05PVFlQRToKLQljYXNlIFNUVF9GVU5DOgotCSAgaWYgKHEtPnN5bWJvbC5zZWN0aW9uID09IHNlY3Rpb24KLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmMKLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZnVuYyA9IChhc3ltYm9sICopIHE7Ci0JICAgICAgbG93X2Z1bmMgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IGJmZF9hc3ltYm9sX25hbWUgKGZ1bmMpOwotICAqbGluZV9wdHIgPSAwOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50Ci1fYmZkX2VsZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgaW50IHJldDsKLQotICByZXQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9laGRyOwotICBpZiAoISByZWxvYykKLSAgICByZXQgKz0gZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUgKGFiZmQpOwotICByZXR1cm4gcmV0OwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuCi0gICAgICAmJiAhIF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICAgICAgKGFiZmQsIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkcjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0ICsgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZAotX2JmZF9lbGZfbm9faW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYm9ydCAoKTsKLX0KLQotI2lmIDAKLXZvaWQKLV9iZmRfZWxmX25vX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0jZW5kaWYKLQotLyogVHJ5IHRvIGNvbnZlcnQgYSBub24tRUxGIHJlbG9jIGludG8gYW4gRUxGIG9uZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBhcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYXJlbG9jOwotewotICAvKiBDaGVjayB3aGV0aGVyIHdlIHJlYWxseSBoYXZlIGFuIEVMRiBob3d0by4gKi8KLQotICBpZiAoKCphcmVsb2MtPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgICAgIC8qIEFsaWVuIHJlbG9jOiBUcnkgdG8gZGV0ZXJtaW5lIGl0cyB0eXBlIHRvIHJlcGxhY2UgaXQgd2l0aCBhbgotCSBlcXVpdmFsZW50IEVMRiByZWxvYy4gKi8KLQotICAgICAgaWYgKGFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKQotCXsKLQkgIHN3aXRjaCAoYXJlbG9jLT5ob3d0by0+Yml0c2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDg6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDEyOgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTJfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTY6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAyNDoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzI0X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDMyOgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNjQ6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ182NF9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIH0KLQotCSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpOwotCi0JICBpZiAoYXJlbG9jLT5ob3d0by0+cGNyZWxfb2Zmc2V0ICE9IGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JICAgIHsKLQkgICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCkKLQkJYXJlbG9jLT5hZGRlbmQgKz0gYXJlbG9jLT5hZGRyZXNzOwotCSAgICAgIGVsc2UKLQkJYXJlbG9jLT5hZGRlbmQgLT0gYXJlbG9jLT5hZGRyZXNzOyAvKiBhZGRlbmQgaXMgdW5zaWduZWQhISAqLwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoYXJlbG9jLT5ob3d0by0+Yml0c2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDg6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ184OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTY6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18xNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAyNjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzI2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDMyOgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNjQ6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ182NDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIH0KLQotCSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpOwotCX0KLQotICAgICAgaWYgKGhvd3RvKQotCWFyZWxvYy0+aG93dG8gPSBob3d0bzsKLSAgICAgIGVsc2UKLQlnb3RvIGZhaWw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZmFpbDoKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgJXMiKSwKLSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGFyZWxvYy0+aG93dG8tPm5hbWUpOwotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgaWYgKGVsZl9zaHN0cnRhYiAoYWJmZCkgIT0gTlVMTCkKLQlfYmZkX3N0cmluZ3RhYl9mcmVlIChlbGZfc2hzdHJ0YWIgKGFiZmQpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCk7Ci19Ci0KLS8qIEZvciBSZWwgdGFyZ2V0cywgd2UgZW5jb2RlIG1lYW5pbmdmdWwgZGF0YSBmb3IgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgaW4gdGhlIHJlbG9jYXRpb24ncyBvZmZzZXQuICBUaHVzIHdlIGNhbm5vdCBhbGxvdyBhbnkgc29ydCBvZiBzYW5pdHkKLSAgIHJhbmdlLWNoZWNraW5nIHRvIGludGVyZmVyZS4gIFRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkbyBpbiBwcm9jZXNzaW5nCi0gICB0aGlzIHJlbG9jLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuIChhYmZkLCByZSwgc3ltYm9sLCBkYXRhLCBpcywgb2JmZCwgZXJybXNnKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppcyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKiBFbGYgY29yZSBmaWxlIHN1cHBvcnQuICBNdWNoIG9mIHRoaXMgb25seSB3b3JrcyBvbiBuYXRpdmUKLSAgIHRvb2xjaGFpbnMsIHNpbmNlIHdlIHJlbHkgb24ga25vd2luZyB0aGUKLSAgIG1hY2hpbmUtZGVwZW5kZW50IHByb2NmcyBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gcGljawotICAgb3V0IGRldGFpbHMgYWJvdXQgdGhlIGNvcmVmaWxlLiAqLwotCi0jaWZkZWYgSEFWRV9TWVNfUFJPQ0ZTX0gKLSMgaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotI2VuZGlmCi0KLQotLyogRGVmaW5lIG9mZnNldG9mIGZvciB0aG9zZSBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQuICovCi0KLSNpZm5kZWYgb2Zmc2V0b2YKLSMgZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKLSNlbmRpZgotCi0KLS8qIEZJWE1FOiB0aGlzIGlzIGtpbmRhIHdyb25nLCBidXQgaXQncyB3aGF0IGdkYiB3YW50cy4gKi8KLQotc3RhdGljIGludAotZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkKLSAgICAgYmZkKiBhYmZkOwotewotICByZXR1cm4gKChlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkIDw8IDE2KQotCSAgKyAoZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9waWQpKTsKLX0KLQotCi0vKiBJZiB0aGVyZSBpc24ndCBhIHNlY3Rpb24gY2FsbGVkIE5BTUUsIG1ha2Ugb25lLCB1c2luZwotICAgZGF0YSBmcm9tIFNFQ1QuICBOb3RlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUgYQotICAgcmVmZXJlbmNlIHRvIE5BTUUsIHNvIHlvdSBzaG91bGRuJ3QgZGVhbGxvY2F0ZSBvcgotICAgb3ZlcndyaXRlIGl0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsIG5hbWUsIHNlY3QpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgY2hhciogbmFtZTsKLSAgICAgYXNlY3Rpb24qIHNlY3Q7Ci17Ci0gIGFzZWN0aW9uKiBzZWN0MjsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2VjdDIgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKHNlY3QyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY3QyLT5fcmF3X3NpemUgPSBzZWN0LT5fcmF3X3NpemU7Ci0gIHNlY3QyLT5maWxlcG9zID0gc2VjdC0+ZmlsZXBvczsKLSAgc2VjdDItPmZsYWdzID0gc2VjdC0+ZmxhZ3M7Ci0gIHNlY3QyLT5hbGlnbm1lbnRfcG93ZXIgPSBzZWN0LT5hbGlnbm1lbnRfcG93ZXI7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIHByc3RhdHVzX3QgZXhpc3RzIG9uOgotICAgICBzb2xhcmlzIDIuWzU2N10KLSAgICAgbGludXggMi5bMDFdICsgZ2xpYmMKLSAgICAgdW5peHdhcmUgNC4yCi0qLwotCi0jaWYgZGVmaW5lZCAoSEFWRV9QUlNUQVRVU19UKQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wcnN0YXR1cyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgcHJzdGF0dXNfdCBwcnN0YXQ7Ci0gIGNoYXIgYnVmWzEwMF07Ci0gIGNoYXIqIG5hbWU7Ci0gIGFzZWN0aW9uKiBzZWN0OwotCi0gIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChwcnN0YXQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJnByc3RhdCwgbm90ZS0+ZGVzY2RhdGEsIHNpemVvZiAocHJzdGF0KSk7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWwgPSBwcnN0YXQucHJfY3Vyc2lnOwotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3BpZCA9IHByc3RhdC5wcl9waWQ7Ci0KLSAgLyogcHJfd2hvIGV4aXN0cyBvbjoKLSAgICAgICBzb2xhcmlzIDIuWzU2N10KLSAgICAgICB1bml4d2FyZSA0LjIKLSAgICAgcHJfd2hvIGRvZXNuJ3QgZXhpc3Qgb246Ci0gICAgICAgbGludXggMi5bMDFdCi0gICovCi0jaWYgZGVmaW5lZCAoSEFWRV9QUlNUQVRVU19UX1BSX1dITykKLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9sd3BpZCA9IHByc3RhdC5wcl93aG87Ci0jZW5kaWYKLQotICAvKiBNYWtlIGEgIi5yZWcvOTk5IiBzZWN0aW9uLiAqLwotCi0gIHNwcmludGYgKGJ1ZiwgIi5yZWcvJWQiLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyY3B5IChuYW1lLCBidWYpOwotCi0gIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKHNlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAocHJzdGF0LnByX3JlZyk7Ci0gIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zICsgb2Zmc2V0b2YgKHByc3RhdHVzX3QsIHByX3JlZyk7Ci0gIHNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBpZiAoISBlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgIi5yZWciLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9QUlNUQVRVU19UKSAqLwotCi0KLS8qIENyZWF0ZSBhIHBzZXVkb3NlY3Rpb24gY29udGFpbmluZyB0aGUgZXhhY3QgY29udGVudHMgb2YgTk9URS4gIFRoaXMKLSAgIGFjdHVhbGx5IGNyZWF0ZXMgdXAgdG8gdHdvIHBzZXVkb3NlY3Rpb25zOgotICAgLSBGb3IgdGhlIHNpbmdsZS10aHJlYWRlZCBjYXNlLCBhIHNlY3Rpb24gbmFtZWQgTkFNRSwgdW5sZXNzCi0gICAgIHN1Y2ggYSBzZWN0aW9uIGFscmVhZHkgZXhpc3RzLgotICAgLSBGb3IgdGhlIG11bHRpLXRocmVhZGVkIGNhc2UsIGEgc2VjdGlvbiBuYW1lZCAiTkFNRS9QSUQiLCB3aGVyZQotICAgICBQSUQgaXMgZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkuCi0gICBCb3RoIHBzZXVkb3NlY3Rpb25zIGhhdmUgaWRlbnRpY2FsIGNvbnRlbnRzOiB0aGUgY29udGVudHMgb2YgTk9URS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX21ha2Vfbm90ZV9wc2V1ZG9zZWN0aW9uIChhYmZkLCBuYW1lLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBjaGFyIGJ1ZlsxMDBdOwotICBjaGFyICp0aHJlYWRlZF9uYW1lOwotICBhc2VjdGlvbiogc2VjdDsKLQotICAvKiBCdWlsZCB0aGUgc2VjdGlvbiBuYW1lLiAgKi8KLQotICBzcHJpbnRmIChidWYsICIlcy8lZCIsIG5hbWUsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgdGhyZWFkZWRfbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmICh0aHJlYWRlZF9uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKHRocmVhZGVkX25hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHRocmVhZGVkX25hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjdC0+X3Jhd19zaXplID0gbm90ZS0+ZGVzY3N6OwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvczsKLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghIGVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCBuYW1lLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogVGhlcmUgaXNuJ3QgYSBjb25zaXN0ZW50IHByZnByZWdzZXRfdCBhY3Jvc3MgcGxhdGZvcm1zLAotICAgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdG8gcGljayB0aGlzCi0gICBkYXRhIHN0cnVjdHVyZSBhcGFydC4gKi8KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfcHJmcHJlZyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgcmV0dXJuIGVsZmNvcmVfbWFrZV9ub3RlX3BzZXVkb3NlY3Rpb24gKGFiZmQsICIucmVnMiIsIG5vdGUpOwotfQotCi0KLS8qIExpbnV4IGR1bXBzIHRoZSBJbnRlbCBTU0UgcmVncyBpbiBhIG5vdGUgbmFtZWQgIkxJTlVYIiB3aXRoIGEgbm90ZQotICAgdHlwZSBvZiA1IChOVF9QUlhGUFJFRykuICBKdXN0IGluY2x1ZGUgdGhlIHdob2xlIG5vdGUncyBjb250ZW50cwotICAgbGl0ZXJhbGx5LiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfcHJ4ZnByZWcgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHJldHVybiBlbGZjb3JlX21ha2Vfbm90ZV9wc2V1ZG9zZWN0aW9uIChhYmZkLCAiLnJlZy14ZnAiLCBub3RlKTsKLX0KLQotCi0jaWYgZGVmaW5lZCAoSEFWRV9QUlBTSU5GT19UKQotIyBkZWZpbmUgZWxmY29yZV9wc2luZm9fdCBwcnBzaW5mb190Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCi0jIGRlZmluZSBlbGZjb3JlX3BzaW5mb190IHBzaW5mb190Ci0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZCAoSEFWRV9QUlBTSU5GT19UKSB8fCBkZWZpbmVkIChIQVZFX1BTSU5GT19UKQotCi0vKiByZXR1cm4gYSBtYWxsb2MnZWQgY29weSBvZiBhIHN0cmluZyBhdCBTVEFSVCB3aGljaCBpcyBhdAotICAgbW9zdCBNQVggYnl0ZXMgbG9uZywgcG9zc2libHkgd2l0aG91dCBhIHRlcm1pbmF0aW5nICdcMCcuCi0gICB0aGUgY29weSB3aWxsIGFsd2F5cyBoYXZlIGEgdGVybWluYXRpbmcgJ1wwJy4gKi8KLQotc3RhdGljIGNoYXIqCi1lbGZjb3JlX3N0cm5kdXAgKGFiZmQsIHN0YXJ0LCBtYXgpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgY2hhciogc3RhcnQ7Ci0gICAgIGludCBtYXg7Ci17Ci0gIGNoYXIqIGR1cDsKLSAgY2hhciogZW5kID0gbWVtY2hyIChzdGFydCwgJ1wwJywgbWF4KTsKLSAgaW50IGxlbjsKLQotICBpZiAoZW5kID09IE5VTEwpCi0gICAgbGVuID0gbWF4OwotICBlbHNlCi0gICAgbGVuID0gZW5kIC0gc3RhcnQ7Ci0KLSAgZHVwID0gYmZkX2FsbG9jIChhYmZkLCBsZW4gKyAxKTsKLSAgaWYgKGR1cCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG1lbWNweSAoZHVwLCBzdGFydCwgbGVuKTsKLSAgZHVwW2xlbl0gPSAnXDAnOwotCi0gIHJldHVybiBkdXA7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfcHNpbmZvIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBlbGZjb3JlX3BzaW5mb190IHBzaW5mbzsKLQotICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAoZWxmY29yZV9wc2luZm9fdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmcHNpbmZvLCBub3RlLT5kZXNjZGF0YSwgbm90ZS0+ZGVzY3N6KTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3Byb2dyYW0KLSAgICA9IGVsZmNvcmVfc3RybmR1cCAoYWJmZCwgcHNpbmZvLnByX2ZuYW1lLCBzaXplb2YgKHBzaW5mby5wcl9mbmFtZSkpOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfY29tbWFuZAotICAgID0gZWxmY29yZV9zdHJuZHVwIChhYmZkLCBwc2luZm8ucHJfcHNhcmdzLCBzaXplb2YgKHBzaW5mby5wcl9wc2FyZ3MpKTsKLQotICAvKiBOb3RlIHRoYXQgZm9yIHNvbWUgcmVhc29uLCBhIHNwdXJpb3VzIHNwYWNlIGlzIHRhY2tlZAotICAgICBvbnRvIHRoZSBlbmQgb2YgdGhlIGFyZ3MgaW4gc29tZSAoYXQgbGVhc3Qgb25lIGFueXdheSkKLSAgICAgaW1wbGVtZW50YXRpb25zLCBzbyBzdHJpcCBpdCBvZmYgaWYgaXQgZXhpc3RzLiAqLwotCi0gIHsKLSAgICBjaGFyKiBjb21tYW5kID0gZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9jb21tYW5kOwotICAgIGludCBuID0gc3RybGVuIChjb21tYW5kKTsKLQotICAgIGlmICgwIDwgbiAmJiBjb21tYW5kW24gLSAxXSA9PSAnICcpCi0gICAgICBjb21tYW5kW24gLSAxXSA9ICdcMCc7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpICovCi0KLQotI2lmIGRlZmluZWQgKEhBVkVfUFNUQVRVU19UKQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wc3RhdHVzIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBwc3RhdHVzX3QgcHN0YXQ7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKHBzdGF0KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtZW1jcHkgKCZwc3RhdCwgbm90ZS0+ZGVzY2RhdGEsIHNpemVvZiAocHN0YXQpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3BpZCA9IHBzdGF0LnByX3BpZDsKLQotICAvKiBDb3VsZCBncmFiIHNvbWUgbW9yZSBkZXRhaWxzIGZyb20gdGhlICJyZXByZXNlbnRhdGl2ZSIKLSAgICAgbHdwc3RhdHVzX3QgaW4gcHN0YXQucHJfbHdwLCBidXQgd2UnbGwgY2F0Y2ggaXQgYWxsIGluIGFuCi0gICAgIE5UX0xXUFNUQVRVUyBub3RlLCBwcmVzdW1hYmx5LiAqLwotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfUFNUQVRVU19UKSAqLwotCi0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UKQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19sd3BzdGF0dXMgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIGx3cHN0YXR1c190IGx3cHN0YXQ7Ci0gIGNoYXIgYnVmWzEwMF07Ci0gIGNoYXIqIG5hbWU7Ci0gIGFzZWN0aW9uKiBzZWN0OwotCi0gIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChsd3BzdGF0KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtZW1jcHkgKCZsd3BzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChsd3BzdGF0KSk7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9sd3BpZCA9IGx3cHN0YXQucHJfbHdwaWQ7Ci0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfc2lnbmFsID0gbHdwc3RhdC5wcl9jdXJzaWc7Ci0KLSAgLyogTWFrZSBhICIucmVnLzk5OSIgc2VjdGlvbi4gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnLyVkIiwgZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAobmFtZSwgYnVmKTsKLQotICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfY29udGV4dC51Y19tY29udGV4dC5ncmVncyk7Ci0gIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zCi0gICAgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX2NvbnRleHQudWNfbWNvbnRleHQuZ3JlZ3MpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX1JFRykKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX3JlZyk7Ci0gIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zICsgb2Zmc2V0b2YgKGx3cHN0YXR1c190LCBwcl9yZWcpOwotI2VuZGlmCi0KLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnIiwgc2VjdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE1ha2UgYSAiLnJlZzIvOTk5IiBzZWN0aW9uICovCi0KLSAgc3ByaW50ZiAoYnVmLCAiLnJlZzIvJWQiLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyY3B5IChuYW1lLCBidWYpOwotCi0gIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKHNlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQpCi0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9jb250ZXh0LnVjX21jb250ZXh0LmZwcmVncyk7Ci0gIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zCi0gICAgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX2NvbnRleHQudWNfbWNvbnRleHQuZnByZWdzKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVF9QUl9GUFJFRykKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX2ZwcmVnKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX2ZwcmVnKTsKLSNlbmRpZgotCi0gIHNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBpZiAoIWVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZzIiLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVCkgKi8KLQotI2lmIGRlZmluZWQgKEhBVkVfV0lOMzJfUFNUQVRVU19UKQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva193aW4zMnBzdGF0dXMgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlICogbm90ZTsKLXsKLSAgY2hhciBidWZbMzBdOwotICBjaGFyICogbmFtZTsKLSAgYXNlY3Rpb24gKiBzZWN0OwotICB3aW4zMl9wc3RhdHVzX3QgcHN0YXR1czsKLQotICBpZiAobm90ZS0+ZGVzY3N6IDwgc2l6ZW9mIChwc3RhdHVzKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtZW1jcHkgKCYgcHN0YXR1cywgbm90ZS0+ZGVzY2RhdGEsIG5vdGUtPmRlc2Nzeik7Ci0gIAotICBzd2l0Y2ggKHBzdGF0dXMuZGF0YV90eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBOT1RFX0lORk9fUFJPQ0VTUzoKLSAgICAgIC8qIEZJWE1FOiBuZWVkIHRvIGFkZCAtPmNvcmVfY29tbWFuZC4gICovCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbCA9IHBzdGF0dXMuZGF0YS5wcm9jZXNzX2luZm8uc2lnbmFsOwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9waWQgPSBwc3RhdHVzLmRhdGEucHJvY2Vzc19pbmZvLnBpZDsKLSAgICAgIGJyZWFrIDsKLQotICAgIGNhc2UgTk9URV9JTkZPX1RIUkVBRDoKLSAgICAgIC8qIE1ha2UgYSAiLnJlZy85OTkiIHNlY3Rpb24uICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLnJlZy8lZCIsIHBzdGF0dXMuZGF0YS50aHJlYWRfaW5mby50aWQpOwotICAgICAgCi0gICAgICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgc3RyY3B5IChuYW1lLCBidWYpOwotCi0gICAgICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gICAgICBpZiAoc2VjdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAocHN0YXR1cy5kYXRhLnRocmVhZF9pbmZvLnRocmVhZF9jb250ZXh0KTsKLSAgICAgIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zICsgb2Zmc2V0b2YgKHN0cnVjdCB3aW4zMl9wc3RhdHVzLAotCQkJCQkJZGF0YS50aHJlYWRfaW5mby50aHJlYWRfY29udGV4dCk7Ci0gICAgICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gICAgICBpZiAocHN0YXR1cy5kYXRhLnRocmVhZF9pbmZvLmlzX2FjdGl2ZV90aHJlYWQpCi0JaWYgKCEgZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnIiwgc2VjdCkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTk9URV9JTkZPX01PRFVMRToKLSAgICAgIC8qIE1ha2UgYSAiLm1vZHVsZS94eHh4eHh4eCIgc2VjdGlvbi4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIubW9kdWxlLyUwOHgiICwgcHN0YXR1cy5kYXRhLm1vZHVsZV9pbmZvLmJhc2VfYWRkcmVzcyk7Ci0gICAgICAKLSAgICAgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIHN0cmNweSAobmFtZSwgYnVmKTsKLQotICAgICAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgICAgCi0gICAgICBpZiAoc2VjdCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgc2VjdC0+X3Jhd19zaXplID0gbm90ZS0+ZGVzY3N6OwotICAgICAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3M7Ci0gICAgICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIEhBVkVfV0lOMzJfUFNUQVRVU19UICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX2dyb2tfbm90ZSAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgc3dpdGNoIChub3RlLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHRydWU7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpCi0gICAgY2FzZSBOVF9QUlNUQVRVUzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHJzdGF0dXMgKGFiZmQsIG5vdGUpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BTVEFUVVNfVCkKLSAgICBjYXNlIE5UX1BTVEFUVVM6Ci0gICAgICByZXR1cm4gZWxmY29yZV9ncm9rX3BzdGF0dXMgKGFiZmQsIG5vdGUpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UKQotICAgIGNhc2UgTlRfTFdQU1RBVFVTOgotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19sd3BzdGF0dXMgKGFiZmQsIG5vdGUpOwotI2VuZGlmCi0KLSAgICBjYXNlIE5UX0ZQUkVHU0VUOgkJLyogRklYTUU6IHJlbmFtZSB0byBOVF9QUkZQUkVHICovCi0gICAgICByZXR1cm4gZWxmY29yZV9ncm9rX3ByZnByZWcgKGFiZmQsIG5vdGUpOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9XSU4zMl9QU1RBVFVTX1QpCi0gICAgY2FzZSBOVF9XSU4zMlBTVEFUVVM6CQotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva193aW4zMnBzdGF0dXMgKGFiZmQsIG5vdGUpOwotI2VuZGlmCi0KLSAgY2FzZSBOVF9QUlhGUFJFRzoJCS8qIExpbnV4IFNTRSBleHRlbnNpb24gKi8KLSAgICAgIGlmIChub3RlLT5uYW1lc3ogPT0gNQotCSAgJiYgISBzdHJjbXAgKG5vdGUtPm5hbWVkYXRhLCAiTElOVVgiKSkKLQlyZXR1cm4gZWxmY29yZV9ncm9rX3ByeGZwcmVnIChhYmZkLCBub3RlKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gdHJ1ZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkgfHwgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkKLSAgICBjYXNlIE5UX1BSUFNJTkZPOgotICAgIGNhc2UgTlRfUFNJTkZPOgotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wc2luZm8gKGFiZmQsIG5vdGUpOwotI2VuZGlmCi0gICAgfQotfQotCi0KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX3JlYWRfbm90ZXMgKGFiZmQsIG9mZnNldCwgc2l6ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSBzaXplOwotewotICBjaGFyKiBidWY7Ci0gIGNoYXIqIHA7Ci0KLSAgaWYgKHNpemUgPD0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLQotICBidWYgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3JlYWQgKGJ1Ziwgc2l6ZSwgMSwgYWJmZCkgIT0gc2l6ZSkKLSAgICB7Ci0gICAgZXJyb3I6Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwID0gYnVmOwotICB3aGlsZSAocCA8IGJ1ZiArIHNpemUpCi0gICAgewotICAgICAgLyogRklYTUU6IGJhZCBhbGlnbm1lbnQgYXNzdW1wdGlvbi4gKi8KLSAgICAgIEVsZl9FeHRlcm5hbF9Ob3RlKiB4bnAgPSAoRWxmX0V4dGVybmFsX05vdGUqKSBwOwotICAgICAgRWxmX0ludGVybmFsX05vdGUgaW47Ci0KLSAgICAgIGluLnR5cGUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSB4bnAtPnR5cGUpOwotCi0gICAgICBpbi5uYW1lc3ogPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSB4bnAtPm5hbWVzeik7Ci0gICAgICBpbi5uYW1lZGF0YSA9IHhucC0+bmFtZTsKLQotICAgICAgaW4uZGVzY3N6ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT5kZXNjc3opOwotICAgICAgaW4uZGVzY2RhdGEgPSBpbi5uYW1lZGF0YSArIEJGRF9BTElHTiAoaW4ubmFtZXN6LCA0KTsKLSAgICAgIGluLmRlc2Nwb3MgPSBvZmZzZXQgKyAoaW4uZGVzY2RhdGEgLSBidWYpOwotCi0gICAgICBpZiAoISBlbGZjb3JlX2dyb2tfbm90ZSAoYWJmZCwgJmluKSkKLQlnb3RvIGVycm9yOwotCi0gICAgICBwID0gaW4uZGVzY2RhdGEgKyBCRkRfQUxJR04gKGluLmRlc2NzeiwgNCk7Ci0gICAgfQotCi0gIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGlzIG5vdyB1bm5lY2Vzc2FyeS4gIENhbGxlcnMgY2FuIGp1c3QgY2FsbAotICAgYmZkX3NlY3Rpb25fZnJvbV9waGRyIGRpcmVjdGx5LiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBwaGRyLCBzZWNfbnVtKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9QaGRyKiBwaGRyOwotICAgICBpbnQgc2VjX251bTsKLXsKLSAgaWYgKCEgYmZkX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBwaGRyLCBzZWNfbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotDAotLyogUHJvdmlkaW5nIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgRUxGIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKi8KLQotLyogUmV0dXJuIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYQotICAgY29weSBvZiBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcy4gIFJldHVybiAtMSBpZiBhbiBlcnJvcgotICAgb2NjdXJzOyBiZmRfZ2V0X2Vycm9yIHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGNvZGUuICAqLwotbG9uZwotYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtCi0JICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1BoZHIpKTsKLX0KLQotCi0vKiBDb3B5IEFCRkQncyBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIHRvICpQSERSUy4gIFRoZSBlbnRyaWVzCi0gICB3aWxsIGJlIHN0b3JlZCBhcyBhbiBhcnJheSBvZiBFbGZfSW50ZXJuYWxfUGhkciBzdHJ1Y3R1cmVzLCBhcwotICAgZGVmaW5lZCBpbiBpbmNsdWRlL2VsZi9pbnRlcm5hbC5oLiAgVG8gZmluZCBvdXQgaG93IGxhcmdlIHRoZQotICAgYnVmZmVyIG5lZWRzIHRvIGJlLCBjYWxsIGJmZF9nZXRfZWxmX3BoZHJfdXBwZXJfYm91bmQuCi0KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXMgcmVhZCwgb3IgLTEgaWYgYW4KLSAgIGVycm9yIG9jY3VyczsgYmZkX2dldF9lcnJvciB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSBjb2RlLiAgKi8KLWludAotYmZkX2dldF9lbGZfcGhkcnMgKGFiZmQsIHBoZHJzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHZvaWQgKnBoZHJzOwotewotICBpbnQgbnVtX3BoZHJzOwotCi0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIG51bV9waGRycyA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOwotICBtZW1jcHkgKHBoZHJzLCBlbGZfdGRhdGEgKGFiZmQpLT5waGRyLCAKLQkgIG51bV9waGRycyAqIHNpemVvZiAoRWxmX0ludGVybmFsX1BoZHIpKTsKLQotICByZXR1cm4gbnVtX3BoZHJzOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWFyYy5jIGIvYmZkL2VsZjMyLWFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThkYzcwLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1hcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKiBBUkMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2FyYy5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIGFyY19pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIGJvb2xlYW4gYXJjX2VsZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgYXJjX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0KLS8qIFRyeSB0byBtaW5pbWl6ZSB0aGUgYW1vdW50IG9mIHNwYWNlIG9jY3VwaWVkIGJ5IHJlbG9jYXRpb24gdGFibGVzCi0gICBvbiB0aGUgUk9NIChub3QgdGhhdCB0aGUgUk9NIHdvbid0IGJlIHN3YW1wZWQgYnkgb3RoZXIgRUxGIG92ZXJoZWFkKS4gICovCi0jZGVmaW5lIFVTRV9SRUwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2FyY19ob3d0b190YWJsZVtdID0KLXsKLSAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9BUkNfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0FSQ18zMiwJCS8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJDXzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLCAgIAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDI2IGJpdCBhYnNvbHV0ZSBicmFuY2gsIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX0FSQ19CMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJDX0IyNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjIgYml0IGJyYW5jaDsgYml0cyAyMS0yIGFyZSBzdG9yZWQgaW4gYml0cyAyNi03LiAgKi8KLSAgSE9XVE8gKFJfQVJDX0IyMl9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDcsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ19CMjJfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmZmZjgwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmZmY4MCwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIEFSQyBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgYXJjX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmNfcmVsb2NfbWFwIGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfQVJDX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX0FSQ18zMiB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX0FSQ18zMiB9LAotICB7IEJGRF9SRUxPQ19BUkNfQjI2LCBSX0FSQ19CMjYgfSwKLSAgeyBCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCwgUl9BUkNfQjIyX1BDUkVMIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAoYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBhcmNfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX2FyY19ob3d0b190YWJsZVthcmNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBBUkMgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0FSQ19tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9hcmNfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlciBmb3IgYW4gQVJDIEVMRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFyY19lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IG1hY2g7Ci0gIHVuc2lnbmVkIGxvbmcgYXJjaCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQVJDX01BQ0g7Ci0KLSAgc3dpdGNoIChhcmNoKQotICAgIHsKLSAgICBjYXNlIEVfQVJDX01BQ0hfQkFTRToKLSAgICAgIG1hY2ggPSBiZmRfbWFjaF9hcmNfYmFzZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBVbmtub3duIGNwdSB0eXBlLiAgPz8/IFdoYXQgdG8gZG8/ICAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfYXJjLCBtYWNoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgYW4gQVJDIEVMRiBvYmplY3QgZmlsZS4KLSAgIFRoaXMgZ2V0cyB0aGUgQVJDIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotYXJjX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IG1hY2g7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAobWFjaCA9IGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfYXJjX2Jhc2U6Ci0gICAgICB2YWwgPSBFX0FSQ19NQUNIX0JBU0U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfQVJDX01BQ0g7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfbGl0dGxlYXJjX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLWxpdHRsZWFyYyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9iaWdhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWJpZ2FyYyIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2FyYwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19BUkMKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAlhcmNfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJYXJjX2VsZl9vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLQkJCQlhcmNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWFybS5oIGIvYmZkL2VsZjMyLWFybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWFmOTc2Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMzkgKzAsMCBAQAotLyogMzItYml0IEVMRiBzdXBwb3J0IGZvciBBUk0KLSAgIENvcHlyaWdodCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBpbnNuMzI7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBpbnNuMTY7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjMyX2FybV9zZXRfcHJpdmF0ZV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBpbnQgZWxmMzJfYXJtX2dldF9zeW1ib2xfdHlwZQotICBQQVJBTVMgKCggRWxmX0ludGVybmFsX1N5bSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIsIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotc3RhdGljIGluc24zMiBpbnNlcnRfdGh1bWJfYnJhbmNoCi0gIFBBUkFNUyAoKGluc24zMiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmZpbmRfdGh1bWJfZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBDT05TVCBjaGFyICosIGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmZpbmRfYXJtX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgQ09OU1QgY2hhciAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgcmVjb3JkX2FybV90b190aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCBlbGYzMl9hcm1fcG9zdF9wcm9jZXNzX2hlYWRlcnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBpbnQgZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3NpZ25lZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBpbnQgZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3NpZ25lZF92bWEsIGJmZF92bWEpKTsKLQotLyogVGhlIGxpbmtlciBzY3JpcHQga25vd3MgdGhlIHNlY3Rpb24gbmFtZXMgZm9yIHBsYWNlbWVudC4KLSAgIFRoZSBlbnRyeV9uYW1lcyBhcmUgdXNlZCB0byBkbyBzaW1wbGUgbmFtZSBtYW5nbGluZyBvbiB0aGUgc3R1YnMuCi0gICBHaXZlbiBhIGZ1bmN0aW9uIG5hbWUsIGFuZCBpdHMgdHlwZSwgdGhlIHN0dWIgY2FuIGJlIGZvdW5kLiBUaGUKLSAgIG5hbWUgY2FuIGJlIGNoYW5nZWQuIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoZSAlcyBiZSBwcmVzZW50LgotICovCi0KLSNkZWZpbmUgSU5URVJXT1JLX0ZMQUcoIGFiZmQgKSAgIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0lOVEVSV09SSykKLQotI2RlZmluZSBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUgIi5nbHVlXzd0IgotI2RlZmluZSBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FICAgIl9fJXNfZnJvbV90aHVtYiIKLQotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUgIi5nbHVlXzciCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUgICAiX18lc19mcm9tX2FybSIKLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICAgICAiL3Vzci9saWIvbGQuc28uMSIKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxNgotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rcyBsaWtlCi0gICB0aGlzLiAgSXQgaXMgc2V0IHVwIHNvIHRoYXQgYW55IHNoYXJlZCBsaWJyYXJ5IGZ1bmN0aW9uIHRoYXQgaXMKLSAgIGNhbGxlZCBiZWZvcmUgdGhlIHJlbG9jYXRpb24gaGFzIGJlZW4gc2V0IHVwIGNhbGxzIHRoZSBkeW5hbWljCi0gICBsaW5rZXIgZmlyc3QgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHQwX2VudHJ5IFtQTFRfRU5UUllfU0laRV0gPQotewotICAweDA0LCAweGUwLCAweDJkLCAweGU1LAkvKiBzdHIgICBsciwgW3NwLCAjLTRdISAgICAgKi8KLSAgMHgxMCwgMHhlMCwgMHg5ZiwgMHhlNSwJLyogbGRyICAgbHIsIFtwYywgIzE2XSAgICAgICovCi0gIDB4MGUsIDB4ZTAsIDB4OGYsIDB4ZTAsCS8qIGFkciAgIGxyLCBwYywgbHIgICAgICAgICAqLwotICAweDA4LCAweGYwLCAweGJlLCAweGU1CS8qIGxkciAgIHBjLCBbbHIsICM4XSEgICAgICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlCi0gICB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHRfZW50cnkgW1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MDQsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgIGlwLCBbcGMsICM0XSAgICAgICAqLwotICAweDBjLCAweGMwLCAweDhmLCAweGUwLAkvKiBhZGQgICBpcCwgcGMsIGlwICAgICAgICAgKi8KLSAgMHgwMCwgMHhmMCwgMHg5YywgMHhlNSwJLyogbGRyICAgcGMsIFtpcF0gICAgICAgICAgICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgICAgICAgIC8qIG9mZnNldCB0byBzeW1ib2wgaW4gZ290ICAqLwotfTsKLQotCi0vKiBUaGUgQVJNIGxpbmtlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHRoYXQgaXQKLSAgIGRlY2lkZXMgdG8gY29weSBpbiBjaGVja19yZWxvY3MgZm9yIGVhY2ggc3ltYm9sLiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBpdCBjYW4gZGlzY2FyZCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgaXQgZG9lc24ndCBuZWVkIHRoZW0gd2hlbgotICAgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMuICBXZSBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWVsZAotICAgZXh0ZW5kaW5nIHRoZSByZWd1bGFyIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIHdlCi0gICBoYXZlIGNvcGllZCBmb3IgYSBnaXZlbiBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQKLXsKLSAgLyogTmV4dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogbmV4dDsKLSAgLyogQSBzZWN0aW9uIGluIGR5bm9iai4gICovCi0gIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgLyogTnVtYmVyIG9mIHJlbG9jcyBjb3BpZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLX07Ci0KLS8qIEFybSBFTEYgbGlua2VyIGhhc2ggZW50cnkuICAqLwotCi1zdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIE51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHBjcmVsX3JlbG9jc19jb3BpZWQ7Ci19OwotCi0vKiBEZWNsYXJlIHRoaXMgbm93IHRoYXQgdGhlIGFib3ZlIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIFRyYXZlcnNlIGFuIGFybSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBBUk0gZWxmIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgZWxmMzJfYXJtX2hhc2hfdGFibGUoaW5mbykgXAotICAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopICgoaW5mbyktPmhhc2gpKQotCi0vKiBBUk0gRUxGIGxpbmtlciBoYXNoIHRhYmxlICovCi1zdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZQotICB7Ci0gICAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gICAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBUaHVtYi10by1BUk0gZ2x1ZS4gICovCi0gICAgbG9uZyBpbnQgdGh1bWJfZ2x1ZV9zaXplOwotCi0gICAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIEFSTS10by1UaHVtYiBnbHVlLiAgKi8KLSAgICBsb25nIGludCBhcm1fZ2x1ZV9zaXplOwotCi0gICAgLyogQW4gYXJiaXRhcnkgaW5wdXQgQkZEIGNob3NlbiB0byBob2xkIHRoZSBnbHVlIHNlY3Rpb25zLiAgKi8KLSAgICBiZmQgKiBiZmRfb2ZfZ2x1ZV9vd25lcjsKLQotICAgIC8qIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIga25vd2xlZGdlIG9mIHRoZSBBUk0ncyBwaXBlbGluZQotICAgICAgIGxlbmd0aCBzaG91bGQgYmUgYXBwbGllZCBieSB0aGUgbGlua2VyLiAgKi8KLSAgICBpbnQgbm9fcGlwZWxpbmVfa25vd2xlZGdlOwotICB9OwotCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhbiBBUk0gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9hcm1fbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiBlbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICogdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKiBzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICogcmV0ID0KLSAgICAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0LT5wY3JlbF9yZWxvY3NfY29waWVkID0gTlVMTDsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBBUk0gZWxmIGxpbmtlciBoYXNoIHRhYmxlICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgZWxmMzJfYXJtX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXQtPnRodW1iX2dsdWVfc2l6ZSA9IDA7Ci0gIHJldC0+YXJtX2dsdWVfc2l6ZSA9IDA7Ci0gIHJldC0+YmZkX29mX2dsdWVfb3duZXIgPSBOVUxMOwotICByZXQtPm5vX3BpcGVsaW5lX2tub3dsZWRnZSA9IDA7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoKLWZpbmRfdGh1bWJfZ2x1ZSAobGlua19pbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBjaGFyICp0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpoYXNoX3RhYmxlOwotCi0gIC8qIFdlIG5lZWQgYSBwb2ludGVyIHRvIHRoZSBhcm1lbGYgc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0gICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBoYXNoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoJihoYXNoX3RhYmxlKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKGhhc2ggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIiVzOiB1bmFibGUgdG8gZmluZCBUSFVNQiBnbHVlICclcycgZm9yIGAlcyciKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHRtcF9uYW1lLCBuYW1lKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgcmV0dXJuIGhhc2g7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX2FybV9nbHVlIChsaW5rX2luZm8sIG5hbWUsIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKnRtcF9uYW1lOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBXZSBuZWVkIGEgcG9pbnRlciB0byB0aGUgZWxmYXJtIHNwZWNpZmljIGhhc2ggdGFibGUuICAqLwotICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLSAgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIG15aCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoaGFzaF90YWJsZSktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIiVzOiB1bmFibGUgdG8gZmluZCBBUk0gZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBteWg7Ci19Ci0KLS8qCi0gICBBUk0tPlRodW1iIGdsdWU6Ci0KLSAgIC5hcm0KLSAgIF9fZnVuY19mcm9tX2FybToKLSAgIGxkciByMTIsIF9fZnVuY19hZGRyCi0gICBieCAgcjEyCi0gICBfX2Z1bmNfYWRkcjoKLSAgIC53b3JkIGZ1bmMgICAgQCBiZWhhdmUgYXMgaWYgeW91IHNhdyBhIEFSTV8zMiByZWxvYwotICovCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0laRSAxMgotc3RhdGljIGNvbnN0IGluc24zMiBhMnQxX2xkcl9pbnNuID0gMHhlNTlmYzAwMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0Ml9ieF9yMTJfaW5zbiA9IDB4ZTEyZmZmMWM7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDNfZnVuY19hZGRyX2luc24gPSAweDAwMDAwMDAxOwotCi0vKgotICAgVGh1bWItPkFSTTogICAgICAgICAgICAgICAgICAgICAgICAgIFRodW1iLT4obm9uLWludGVyd29ya2luZyBhd2FyZSkgQVJNCi0KLSAgIC50aHVtYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGh1bWIKLSAgIC5hbGlnbiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWxpZ24gMgotICAgX19mdW5jX2Zyb21fdGh1bWI6ICAgICAgICAgICAgICBfX2Z1bmNfZnJvbV90aHVtYjoKLSAgIGJ4IHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIHtyNiwgbHJ9Ci0gICBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRyICByNiwgX19mdW5jX2FkZHIKLSAgIC5hcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiAgbHIsIHBjCi0gICBfX2Z1bmNfY2hhbmdlX3RvX2FybTogICAgICAgICAgICAgICAgICAgICAgICBieCAgIHI2Ci0gICBiIGZ1bmMgICAgICAgICAgICAgICAgICAgICAgIC5hcm0KLSAgIF9fZnVuY19iYWNrX3RvX3RodW1iOgotICAgbGRtaWEgcjEzISB7cjYsIGxyfQotICAgYnggICAgbHIKLSAgIF9fZnVuY19hZGRyOgotICAgLndvcmQgICAgICAgIGZ1bmMKLSAqLwotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NJWkUgOAotc3RhdGljIGNvbnN0IGluc24xNiB0MmExX2J4X3BjX2luc24gPSAweDQ3Nzg7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTJfbm9vcF9pbnNuID0gMHg0NmMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmEzX2JfaW5zbiA9IDB4ZWEwMDAwMDA7Ci0KLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9wdXNoX2luc24gPSAweGI1NDA7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTJfbGRyX2luc24gPSAweDRlMDM7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTNfbW92X2luc24gPSAweDQ2ZmU7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTRfYnhfaW5zbiA9IDB4NDczMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNV9wb3BfaW5zbiA9IDB4ZThiZDQwNDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTZfYnhfaW5zbiA9IDB4ZTEyZmZmMWU7Ci0KLWJvb2xlYW4KLWJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIChpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGFzZWN0aW9uICogczsKLSAgYmZkX2J5dGUgKiBmb287Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGdsb2JhbHMtPmFybV9nbHVlX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplKTsKLQotICAgICAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gZm9vOwotICAgIH0KLQotICBpZiAoZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYwotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLQotICAgICAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplOwotICAgICAgcy0+Y29udGVudHMgPSBmb287Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotcmVjb3JkX2FybV90b190aHVtYl9nbHVlIChsaW5rX2luZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogbGlua19pbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiBzOwotICBjaGFyICogdG1wX25hbWU7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLSAgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIG15aCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoZ2xvYmFscyktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47CQkJLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIC8qIFRoZSBvbmx5IHRyaWNrIGhlcmUgaXMgdXNpbmcgaGFzaF90YWJsZS0+YXJtX2dsdWVfc2l6ZSBhcyB0aGUgdmFsdWUuIEV2ZW4KLSAgICAgdGhvdWdoIHRoZSBzZWN0aW9uIGlzbid0IGFsbG9jYXRlZCB5ZXQsIHRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBiZSBwdXR0aW5nCi0gICAgIGl0LiAgKi8KLQotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAobGlua19pbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkJICAgIEJTRl9HTE9CQUwsCi0JCQkJICAgIHMsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKyAxLAotCQkJCSAgICBOVUxMLCB0cnVlLCBmYWxzZSwKLQkJCQkgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmbXloKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArPSBBUk0yVEhVTUJfR0xVRV9TSVpFOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSAobGlua19pbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgY29uc3QgY2hhciAqbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBjaGFyICp0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKm15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7Ci0gIGNoYXIgYmluZDsKLQotICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoaGFzaF90YWJsZSAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGhhc2hfdGFibGUtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoJihoYXNoX3RhYmxlKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsJCQkvKiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBndXkgKi8KLSAgICB9Ci0KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGxpbmtfaW5mbywgaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJICAgICBCU0ZfR0xPQkFMLCBzLCBoYXNoX3RhYmxlLT50aHVtYl9nbHVlX3NpemUgKyAxLAotCQkJCSAgICBOVUxMLCB0cnVlLCBmYWxzZSwKLQkJCQkgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmbXloKTsKLQotICAvKiBJZiB3ZSBtYXJrIGl0ICd0aHVtYicsIHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBkbyBhIGJldHRlciBqb2IuICAqLwotICBiaW5kID0gRUxGX1NUX0JJTkQgKG15aC0+dHlwZSk7Ci0gIG15aC0+dHlwZSA9IEVMRl9TVF9JTkZPIChiaW5kLCBTVFRfQVJNX1RGVU5DKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgLyogQWxsb2NhdGUgYW5vdGhlciBzeW1ib2wgdG8gbWFyayB3aGVyZSB3ZSBzd2l0Y2ggdG8gYXJtIG1vZGUuICAqLwotCi0jZGVmaW5lIENIQU5HRV9UT19BUk0gIl9fJXNfY2hhbmdlX3RvX2FybSIKLSNkZWZpbmUgQkFDS19GUk9NX0FSTSAiX18lc19iYWNrX2Zyb21fYXJtIgotCi0gIHRtcF9uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQ0hBTkdFX1RPX0FSTSkgKyAxKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIENIQU5HRV9UT19BUk0sIG5hbWUpOwotCi0gIG15aCA9IE5VTEw7Ci0KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGxpbmtfaW5mbywgaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJICAgICAgQlNGX0xPQ0FMLCBzLCBoYXNoX3RhYmxlLT50aHVtYl9nbHVlX3NpemUgKyA0LAotCQkJCSAgICBOVUxMLCB0cnVlLCBmYWxzZSwKLQkJCQkgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmbXloKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgaGFzaF90YWJsZS0+dGh1bWJfZ2x1ZV9zaXplICs9IFRIVU1CMkFSTV9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBTZWxlY3QgYSBCRkQgdG8gYmUgdXNlZCB0byBob2xkIHRoZSBzZWN0aW9ucyB1c2VkIGJ5IHRoZSBnbHVlIGNvZGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiBsZC9lbXVsdGVtcGwvCi0gICB7YXJtZWxmL3BlfS5lbSAgKi8KLWJvb2xlYW4KLWJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCi0gICAgIGdldHRpbmcgYSBiZmQgdG8gaG9sZCB0aGUgZ2x1ZS4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCi0gIGlmIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOb3RlOiB3ZSBkbyBub3QgaW5jbHVkZSB0aGUgZmxhZyBTRUNfTElOS0VSX0NSRUFURUQsIGFzIHRoaXMKLQkgd2lsbCBwcmV2ZW50IGVsZl9saW5rX2lucHV0X2JmZCgpIGZyb20gcHJvY2Vzc2luZyB0aGUgY29udGVudHMKLQkgb2YgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotCi0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBpZiAoc2VjID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgZ2MgbWFyayB0byBwcmV2ZW50IHRoZSBzZWN0aW9uIGZyb20gYmVpbmcgcmVtb3ZlZCBieSBnYXJiYWdlCi0JIGNvbGxlY3Rpb24sIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBubyByZWxvY3MgcmVmZXIgdG8gdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIHNlYy0+Z2NfbWFyayA9IDE7Ci0gICAgfQotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfQ09ERSB8IFNFQ19SRUFET05MWTsKLQotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBzZWMtPmdjX21hcmsgPSAxOwotICAgIH0KLQotICAvKiBTYXZlIHRoZSBiZmQgZm9yIGxhdGVyIHVzZS4gICovCi0gIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyID0gYWJmZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChhYmZkLCBsaW5rX2luZm8sIG5vX3BpcGVsaW5lX2tub3dsZWRnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBpbnQgbm9fcGlwZWxpbmVfa25vd2xlZGdlOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKLQotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgdG8gY29uc3RydWN0IGFueSBnbHVlLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiAgV2UgaGF2ZSBhIGhvb2sKLSAgICAgdG8gZG8gcmVsb2MgcnVtbWFnaW5nLCBiZWZvcmUgc2VjdGlvbiBzaXplcyBhcmUgbmFpbGVkIGRvd24uICAqLwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UgPSBub19waXBlbGluZV9rbm93bGVkZ2U7Ci0KLSAgLyogUnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgZ2x1ZSB2ZWN0b3JzLiAgKi8KLSAgc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAoOyBzZWMgIT0gTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIC8qIExvYWQgdGhlIHJlbG9jcy4gICovCi0KLSAgICAgIGlyZWwgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsCi0JCQkJCShFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotCi0gICAgICBCRkRfQVNTRVJUIChpcmVsICE9IDApOwotCi0gICAgICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQl7Ci0JICBsb25nIHJfdHlwZTsKLQkgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKLQotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKTsKLQkgIHJfaW5kZXggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKTsKLQotCSAgLyogVGhlc2UgYXJlIHRoZSBvbmx5IHJlbG9jYXRpb24gdHlwZXMgd2UgY2FyZSBhYm91dCAqLwotCSAgaWYgKCAgIHJfdHlwZSAhPSBSX0FSTV9QQzI0Ci0JICAgICAgJiYgcl90eXBlICE9IFJfQVJNX1RITV9QQzIyKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkJICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCQkgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotCSAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCQlleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JCSAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkJICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkJICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICAgICAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkJICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgbm90IGFnYWluc3QgYSBzeW1ib2wgaXQgY2Fubm90IGNvbmNlcm4gdXMuICovCi0KLQkgIGggPSBOVUxMOwotCi0JICAvKiBXZSBkb24ndCBjYXJlIGFib3V0IGxvY2FsIHN5bWJvbHMgKi8KLQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sICovCi0JICByX2luZGV4IC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgIGVsZl9zeW1faGFzaGVzIChhYmZkKVtyX2luZGV4XTsKLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgYWdhaW5zdCBhIHN0YXRpYyBzeW1ib2wgaXQgbXVzdCBiZSB3aXRoaW4KLQkgICAgIHRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIHNvIGNhbm5vdCBiZSBhIGNyb3NzIEFSTS9UaHVtYiByZWxvY2F0aW9uLiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJfQVJNX1BDMjQ6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gYXJtIGNvZGUuICBXZSBuZWVkIHRvIGxvb2sgdXAKLQkgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiAgSWYgaXQgaXMgYSB0aHVtYiB0YXJnZXQsIHdlCi0JICAgICAgICAgaW5zZXJ0IGdsdWUuICAqLwotCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFKGgtPnR5cGUpID09IFNUVF9BUk1fVEZVTkMpCi0JCXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAobGlua19pbmZvLCBoKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfQVJNX1RITV9QQzIyOgotCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIHRodW1iIGNvZGUuICBXZSBsb29rCi0JICAgICAgICAgdXAgdGhlIHRhcmdldCBvZiB0aGUgY2FsbC4gIElmIGl0IGlzIG5vdCBhIHRodW1iCi0gICAgICAgICAgICAgICAgIHRhcmdldCwgd2UgaW5zZXJ0IGdsdWUuICAqLwotCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChoLT50eXBlKSAhPSBTVFRfQVJNX1RGVU5DKQotCQlyZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGxpbmtfaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0gIAotZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGUgdGh1bWIgZm9ybSBvZiBhIGxvbmcgYnJhbmNoIGlzIGEgYml0IGZpbmlja3ksIGJlY2F1c2UgdGhlIG9mZnNldAotICAgZW5jb2RpbmcgaXMgc3BsaXQgb3ZlciB0d28gZmllbGRzLCBlYWNoIGluIGl0J3Mgb3duIGluc3RydWN0aW9uLiBUaGV5Ci0gICBjYW4gb2NjdXIgaW4gYW55IG9yZGVyLiBTbyBnaXZlbiBhIHRodW1iIGZvcm0gb2YgbG9uZyBicmFuY2gsIGFuZCBhbgotICAgb2Zmc2V0LCBpbnNlcnQgdGhlIG9mZnNldCBpbnRvIHRoZSB0aHVtYiBicmFuY2ggYW5kIHJldHVybiBmaW5pc2hlZAotICAgaW5zdHJ1Y3Rpb24uCi0KLSAgIEl0IHRha2VzIHR3byB0aHVtYiBpbnN0cnVjdGlvbnMgdG8gZW5jb2RlIHRoZSB0YXJnZXQgYWRkcmVzcy4gRWFjaCBoYXMKLSAgIDExIGJpdHMgdG8gaW52ZXN0LiBUaGUgdXBwZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIG9uZSAoaWRlbnRpZmVkIGJ5Ci0gICBILTAuLiBzZWUgYmVsb3cpLCB0aGUgbG93ZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIHRoZSBvdGhlciAoaWRlbnRpZmllZAotICAgYnkgSC0xKS4KLQotICAgQ29tYmluZSB0b2dldGhlciBhbmQgc2hpZnRlZCBsZWZ0IGJ5IDEgKGl0J3MgYSBoYWxmIHdvcmQgYWRkcmVzcykgYW5kCi0gICB0aGVyZSB5b3UgaGF2ZSBpdC4KLQotICAgT3A6IDExMTEgPSBGLAotICAgSC0wLCB1cHBlciBhZGRyZXNzLTAgPSAwMDAKLSAgIE9wOiAxMTExID0gRiwKLSAgIEgtMSwgbG93ZXIgYWRkcmVzcy0wID0gODAwCi0KLSAgIFRoZXkgY2FuIGJlIG9yZGVyZWQgZWl0aGVyIHdheSwgYnV0IHRoZSBhcm0gdG9vbHMgSSd2ZSBzZWVuIGFsd2F5cyBwdXQKLSAgIHRoZSBsb3dlciBvbmUgZmlyc3QuIEl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyLiBrcmtAY3lnbnVzLmNvbQotCi0gICBYWFg6ICBBY3R1YWxseSB0aGUgb3JkZXIgZG9lcyBtYXR0ZXIuICBUaGUgc2Vjb25kIGluc3RydWN0aW9uIChILTEpCi0gICBtb3ZlcyB0aGUgY29tcHV0ZWQgYWRkcmVzcyBpbnRvIHRoZSBQQywgc28gaXQgbXVzdCBiZSB0aGUgc2Vjb25kIG9uZQotICAgaW4gdGhlIHNlcXVlbmNlLiAgVGhlIHByb2JsZW0sIGhvd2V2ZXIgaXMgdGhhdCB3aGlsc3QgbGl0dGxlIGVuZGlhbiBjb2RlCi0gICBzdG9yZXMgdGhlIGluc3RydWN0aW9ucyBpbiBISSB0aGVuIExPVyBvcmRlciwgYmlnIGVuZGlhbiBjb2RlIGRvZXMgdGhlCi0gICByZXZlcnNlLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLQotI2RlZmluZSBMT1dfSElfT1JERVIgMHhGODAwRjAwMAotI2RlZmluZSBISV9MT1dfT1JERVIgMHhGMDAwRjgwMAotCi1zdGF0aWMgaW5zbjMyCi1pbnNlcnRfdGh1bWJfYnJhbmNoIChicl9pbnNuLCByZWxfb2ZmKQotICAgICBpbnNuMzIgYnJfaW5zbjsKLSAgICAgaW50IHJlbF9vZmY7Ci17Ci0gIHVuc2lnbmVkIGludCBsb3dfYml0czsKLSAgdW5zaWduZWQgaW50IGhpZ2hfYml0czsKLQotCi0gIEJGRF9BU1NFUlQgKChyZWxfb2ZmICYgMSkgIT0gMSk7Ci0KLSAgcmVsX29mZiA+Pj0gMTsJCS8qIGhhbGYgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KLSAgbG93X2JpdHMgPSByZWxfb2ZmICYgMHgwMDAwMDdGRjsJLyogdGhlIGJvdHRvbSAxMSBiaXRzICovCi0gIGhpZ2hfYml0cyA9IChyZWxfb2ZmID4+IDExKSAmIDB4MDAwMDA3RkY7CS8qIHRoZSB0b3AgMTEgYml0cyAqLwotCi0gIGlmICgoYnJfaW5zbiAmIExPV19ISV9PUkRFUikgPT0gTE9XX0hJX09SREVSKQotICAgIGJyX2luc24gPSBMT1dfSElfT1JERVIgfCAobG93X2JpdHMgPDwgMTYpIHwgaGlnaF9iaXRzOwotICBlbHNlIGlmICgoYnJfaW5zbiAmIEhJX0xPV19PUkRFUikgPT0gSElfTE9XX09SREVSKQotICAgIGJyX2luc24gPSBISV9MT1dfT1JERVIgfCAoaGlnaF9iaXRzIDw8IDE2KSB8IGxvd19iaXRzOwotICBlbHNlCi0gICAgYWJvcnQgKCk7CQkJLyogZXJyb3IgLSBub3QgYSB2YWxpZCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybSAqLwotCi0gIC8qIEZJWE1FOiBhYm9ydCBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IGNhbGwuIGtya0BjeWdudXMuY29tICovCi0KLSAgcmV0dXJuIGJyX2luc247Ci19Ci0KLS8qIFRodW1iIGNvZGUgY2FsbGluZyBhbiBBUk0gZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQKLWVsZjMyX3RodW1iX3RvX2FybV9zdHViIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgaGl0X2RhdGEsIHN5bV9zZWMsIG9mZnNldCwgYWRkZW5kLCB2YWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgaGl0X2RhdGE7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgc3ltX3NlYzsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICBvZmZzZXQ7Ci0gICAgIGJmZF9zaWduZWRfdm1hICAgICAgICAgYWRkZW5kOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgIHZhbDsKLXsKLSAgYXNlY3Rpb24gKiBzID0gMDsKLSAgbG9uZyBpbnQgbXlfb2Zmc2V0OwotICB1bnNpZ25lZCBsb25nIGludCB0bXA7Ci0gIGxvbmcgaW50IHJldF9vZmZzZXQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgbXloID0gZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotICBpZiAobXloID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsCi0JCQkgICAgICAgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0KLSAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotICAgIHsKLSAgICAgIGlmIChzeW1fc2VjICE9IE5VTEwKLQkgICYmIHN5bV9zZWMtPm93bmVyICE9IE5VTEwKLQkgICYmICFJTlRFUldPUktfRkxBRyAoc3ltX3NlYy0+b3duZXIpKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoc3ltX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLS1teV9vZmZzZXQ7Ci0gICAgICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfYnhfcGNfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTJfbm9vcF9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMik7Ci0KLSAgICAgIHJldF9vZmZzZXQgPQotCSgoYmZkX3NpZ25lZF92bWEpIHZhbCkJLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBvZiB0aGUgc3R1YiAqLwotCS0gKChiZmRfc2lnbmVkX3ZtYSkKLQkgICAocy0+b3V0cHV0X29mZnNldAkvKiBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KLQkgICAgKyBteV9vZmZzZXQJCS8qIE9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBzdHViIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JICAgICsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSkJLyogQWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi0JICAgKyA0CQkJLyogVGhlIGJyYW5jaCBpbnN0cnVjdGlvbiBpcyA0IGJ5dGVzIGludG8gdGhlIHN0dWIuICAqLwotCSAgICsgOCk7CQkvKiBBUk0gYnJhbmNoZXMgd29yayBmcm9tIHRoZSBwYyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKyA4LiAgKi8KLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICB0MmEzX2JfaW5zbiB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOwotCi0gIC8qIE5vdyBnbyBiYWNrIGFuZCBmaXggdXAgdGhlIG9yaWdpbmFsIEJMIGluc24gdG8gcG9pbnQKLSAgICAgdG8gaGVyZS4gICovCi0gIHJldF9vZmZzZXQgPQotICAgIHMtPm91dHB1dF9vZmZzZXQKLSAgICArIG15X29mZnNldAotICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICArIG9mZnNldCArIGFkZGVuZCkKLSAgICAtIDg7Ci0KLSAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YQotCQkgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JICAgICAgaW5zZXJ0X3RodW1iX2JyYW5jaCAodG1wLCByZXRfb2Zmc2V0KSwKLQkgICAgICBoaXRfZGF0YSAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFybSBjb2RlIGNhbGxpbmcgYSBUaHVtYiBmdW5jdGlvbiAqLwotc3RhdGljIGludAotZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBoaXRfZGF0YSwgc3ltX3NlYywgb2Zmc2V0LCBhZGRlbmQsIHZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIG5hbWU7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBoaXRfZGF0YTsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBzeW1fc2VjOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgIG9mZnNldDsKLSAgICAgYmZkX3NpZ25lZF92bWEgICAgICAgICBhZGRlbmQ7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgdmFsOwotewotICB1bnNpZ25lZCBsb25nIGludCB0bXA7Ci0gIGxvbmcgaW50IG15X29mZnNldDsKLSAgYXNlY3Rpb24gKiBzOwotICBsb25nIGludCByZXRfb2Zmc2V0OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIG15aCA9IGZpbmRfYXJtX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7Ci0gIGlmIChteWggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsCi0JCQkgICAgICAgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCi0gIGlmICgobXlfb2Zmc2V0ICYgMHgwMSkgPT0gMHgwMSkKLSAgICB7Ci0gICAgICBpZiAoc3ltX3NlYyAhPSBOVUxMCi0JICAmJiBzeW1fc2VjLT5vd25lciAhPSBOVUxMCi0JICAmJiAhSU5URVJXT1JLX0ZMQUcgKHN5bV9zZWMtPm93bmVyKSkKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiBhcm0gY2FsbCB0byB0aHVtYiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JfQotICAgICAgLS1teV9vZmZzZXQ7Ci0gICAgICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDFfbGRyX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQyX2J4X3IxMl9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0KLSAgICAgIC8qIEl0J3MgYSB0aHVtYiBhZGRyZXNzLiAgQWRkIHRoZSBsb3cgb3JkZXIgYml0LiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbCB8IGEydDNfZnVuY19hZGRyX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA4KTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotCi0gIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpOwotICB0bXAgPSB0bXAgJiAweEZGMDAwMDAwOwotCi0gIC8qIFNvbWVob3cgdGhlc2UgYXJlIGJvdGggNCB0b28gZmFyLCBzbyBzdWJ0cmFjdCA4LiAqLwotICByZXRfb2Zmc2V0ID0gcy0+b3V0cHV0X29mZnNldAotICAgICsgbXlfb2Zmc2V0Ci0gICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICAgICsgb2Zmc2V0ICsgYWRkZW5kKQotICAgIC0gODsKLSAgCi0gIHRtcCA9IHRtcCB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpOwotCi0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHRtcCwgaGl0X2RhdGEKLQkgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWwsIHZhbHVlLAotCQkJICAgICAgIGluZm8sIHN5bV9zZWMsIHN5bV9uYW1lLCBzeW1fZmxhZ3MsIGgpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgaG93dG87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICByZWw7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBzeW1fc2VjOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIHN5bV9uYW1lOwotICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIHN5bV9mbGFnczsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotewotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICByX3R5cGUgPSBob3d0by0+dHlwZTsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gIGJmZF9ieXRlICogICAgICAgICAgICAgICAgICAgIGhpdF9kYXRhID0gY29udGVudHMgKyByZWwtPnJfb2Zmc2V0OwotICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgICBkeW5vYmogPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBiZmRfdm1hICogICAgICAgICAgICAgICAgICAgICBsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgc2dvdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgIHNwbHQgPSBOVUxMOwotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICBzcmVsb2MgPSBOVUxMOwotICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQ7Ci0gIGJmZF9zaWduZWRfdm1hICAgICAgICAgICAgICAgIHNpZ25lZF9hZGRlbmQ7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqKQotICAgIHsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgfQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0gIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotI2lmZGVmIFVTRV9SRUwKLSAgYWRkZW5kID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiBob3d0by0+c3JjX21hc2s7Ci0KLSAgaWYgKGFkZGVuZCAmICgoaG93dG8tPnNyY19tYXNrICsgMSkgPj4gMSkpCi0gICAgewotICAgICAgc2lnbmVkX2FkZGVuZCA9IC0xOwotICAgICAgc2lnbmVkX2FkZGVuZCAmPSB+IGhvd3RvLT5zcmNfbWFzazsKLSAgICAgIHNpZ25lZF9hZGRlbmQgfD0gYWRkZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHNpZ25lZF9hZGRlbmQgPSBhZGRlbmQ7Ci0jZWxzZQotICBhZGRlbmQgPSBzaWduZWRfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSNlbmRpZgotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfQVJNX05PTkU6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9QQzI0OgotICAgIGNhc2UgUl9BUk1fQUJTMzI6Ci0gICAgY2FzZSBSX0FSTV9SRUwzMjoKLSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBjb3BpZWQKLQkgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWUuICovCi0KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChyX3R5cGUgIT0gUl9BUk1fUEMyNAotIAkgICAgICB8fCAoaCAhPSBOVUxMCi0JICAgICAgICAgICYmIGgtPmR5bmluZHggIT0gLTEKLQkJICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0JICBib29sZWFuIHNraXAsIHJlbG9jYXRlOwotCi0JICBpZiAoc3JlbG9jID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICogbmFtZTsKLQotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLAotCQkgICAgICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkJICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJICAgICBuYW1lICsgNCkgPT0gMCk7Ci0KLQkgICAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgc2tpcCA9IGZhbHNlOwotCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCSAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCSAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgJiBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSk7Ci0JICAgICAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCXNraXAgPSB0cnVlOwotCSAgICAgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkgICAgfQotCi0JICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgIGlmIChza2lwKQotCSAgICB7Ci0JICAgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkgICAgICByZWxvY2F0ZSA9IGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9BUk1fUEMyNCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5keW5pbmR4ICE9IC0xKTsKLQkgICAgICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWxvY2F0ZSA9IGZhbHNlOwotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGUgPSB0cnVlOwotCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfQVJNX1BDMjQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaCA9PSBOVUxMCi0JCSAgfHwgKChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCQl7Ci0JCSAgcmVsb2NhdGUgPSB0cnVlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfQVJNX1JFTEFUSVZFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRlID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9BQlMzMik7Ci0JCX0KLQkgICAgfQotCi0JICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCSAgICAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJICAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQkgIAotCSAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG8gbm90IHdhbnQgdG8KLQkgICAgIGZpZGRsZSB3aXRoIHRoZSBhZGRlbmQuICBPdGhlcndpc2UsIHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgc3ltYm9sCi0JICAgICB2YWx1ZSBzbyB0aGF0IGl0IGJlY29tZXMgYW4gYWRkZW5kIGZvciB0aGUgZHluYW1pYyByZWxvYy4gKi8KLQkgIGlmICghIHJlbG9jYXRlKQotCSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0JICAKLQkgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLQkJCQkJICAgKGJmZF92bWEpIDApOwotCX0KLSAgICAgIGVsc2Ugc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9BUk1fUEMyNDoKLQkgIC8qIEFybSBCL0JMIGluc3RydWN0aW9uICovCi0KLQkgIC8qIENoZWNrIGZvciBhcm0gY2FsbGluZyB0aHVtYiBmdW5jdGlvbi4gICovCi0JICBpZiAoc3ltX2ZsYWdzID09IFNUVF9BUk1fVEZVTkMpCi0JICAgIHsKLQkgICAgICBlbGYzMl9hcm1fdG9fdGh1bWJfc3R1YiAoaW5mbywgc3ltX25hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgaGl0X2RhdGEsIHN5bV9zZWMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgICAgIHNpZ25lZF9hZGRlbmQsIHZhbHVlKTsKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0KLQkgIGlmICggICBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItbGl0dGxlYXJtLW9hYmkiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3RhcmdldCAoaW5wdXRfYmZkKSwgImVsZjMyLWJpZ2FybS1vYWJpIikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBvbGQgd2F5IG9mIGRvaW5nIHRoaW5ncy4gIFRyZWFyaW5nIHRoZSBhZGRlbmQgYXMgYQotCQkgYnl0ZSBzaXplZCBmaWVsZCBhbmQgYWRkaW5nIGluIHRoZSBwaXBlbGluZSBvZmZzZXQuICAqLwotCi0JICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgdmFsdWUgLT0gcmVsLT5yX29mZnNldDsKLQkgICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXZhbHVlIC09IDg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBBUk0gRUxGIEFCSSBzYXlzIHRoYXQgdGhpcyByZWxvYyBpcyBjb21wdXRlZCBhczogUyAtIFAgKyBBCi0JCSB3aGVyZToKLQkJICBTIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgaW4gdGhlIHJlbG9jYXRpb24uCi0JCSAgUCBpcyBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiBiZWluZyByZWxvY2F0ZWQuCi0JCSAgQSBpcyB0aGUgYWRkZW5kIChleHRyYWN0ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24pIGluIGJ5dGVzLgotCi0JCSBTIGlzIGhlbGQgaW4gJ3ZhbHVlJy4KLQkJIFAgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBpbnN0cnVjdGlvbgotCQkgICBwbHVzIHRoZSBvZmZzZXQgb2YgdGhlIHJlbG9jIGludG8gdGhhdCBzZWN0aW9uLCBpZToKLQkJICAgICAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCQkgICAgICByZWwtPnJfb2Zmc2V0KS4KLQkJIEEgaXMgdGhlIGFkZGVuZCwgY29udmVydGVkIGludG8gYnl0ZXMsIGllOgotCQkgICAgIChzaWduZWRfYWRkZW5kICogNCkKLQotCQkgTm90ZTogTm9uZSBvZiB0aGVzZSBvcGVyYXRpb25zIGhhdmUga25vd2xlZGdlIG9mIHRoZSBwaXBlbGluZQotCQkgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yLCB0aHVzIGl0IGlzIHVwIHRvIHRoZSBhc3NlbWJsZXIgdG8gZW5jb2RlCi0JCSB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGFkZGVuZC4gICovCi0KLQkgICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB2YWx1ZSAtPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIHZhbHVlICs9IChzaWduZWRfYWRkZW5kIDw8IGhvd3RvLT5zaXplKTsKLQotCSAgICAgIC8qIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY29kZSBhbHNvIHVzZWQgdG8gYWRkIGluIHRoZSBwaXBlbGluZQotCQkgb2Zmc2V0IGhlcmUuICBUaGlzIGlzIHdyb25nIGJlY2F1c2UgdGhlIGxpbmtlciBpcyBub3Qgc3VwcG9zZWQKLQkJIHRvIGtub3cgYWJvdXQgc3VjaCB0aGluZ3MsIGFuZCBvbmUgZGF5IGl0IG1pZ2h0IGNoYW5nZS4gIEluIG9yZGVyCi0JCSB0byBzdXBwb3J0IG9sZCBiaW5hcmllcyB0aGF0IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIgaG93ZXZlciwgc28KLQkJIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHdoaWNoIEFCSSB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfRWhkciAqIGlfZWhkcnA7IC8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotCi0JCSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCk7Ci0KLQkJICBpZiAoaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gMCkKLQkJICAgIHZhbHVlIC09IDg7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBJdCBpcyBub3QgYW4gZXJyb3IgZm9yIGFuIHVuZGVmaW5lZCB3ZWFrIHJlZmVyZW5jZSB0byBiZQotCSAgICAgb3V0IG9mIHJhbmdlLiAgQW55IHByb2dyYW0gdGhhdCBicmFuY2hlcyB0byBzdWNoIGEgc3ltYm9sCi0JICAgICBpcyBnb2luZyB0byBjcmFzaCBhbnl3YXksIHNvIHRoZXJlIGlzIG5vIHBvaW50IHdvcnJ5aW5nIAotCSAgICAgYWJvdXQgZ2V0dGluZyB0aGUgZGVzdGluYXRpb24gZXhhY3RseSByaWdodC4gICovCSAgICAgCi0JICBpZiAoISBoIHx8IGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFBlcmZvcm0gYSBzaWduZWQgcmFuZ2UgY2hlY2suICAqLwotCSAgICAgIHNpZ25lZF9hZGRlbmQgPSB2YWx1ZTsKLQkgICAgICBzaWduZWRfYWRkZW5kID4+PSBob3d0by0+cmlnaHRzaGlmdDsKLQkgICAgICBpZiAoc2lnbmVkX2FkZGVuZCA+ICgoYmZkX3NpZ25lZF92bWEpKGhvd3RvLT5kc3RfbWFzayA+PiAxKSkKLQkJICB8fCBzaWduZWRfYWRkZW5kIDwgLSAoKGJmZF9zaWduZWRfdm1hKSAoKGhvd3RvLT5kc3RfbWFzayArIDEpID4+IDEpKSkKLQkJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgICAgfQotCSAgICAgIAotCSAgdmFsdWUgPSAoc2lnbmVkX2FkZGVuZCAmIGhvd3RvLT5kc3RfbWFzaykKLQkgICAgfCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAofiBob3d0by0+ZHN0X21hc2spKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9BQlMzMjoKLQkgIHZhbHVlICs9IGFkZGVuZDsKLQkgIGlmIChzeW1fZmxhZ3MgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgdmFsdWUgfD0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9SRUwzMjoKLQkgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgKz0gYWRkZW5kOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlM4OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2YgfHwgKGxvbmcpIHZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlMxNjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmZiB8fCAobG9uZykgdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0FCUzEyOgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbiBmb3IgdGhlIGFybSAqLwotICAgICAgLyogQWxzbyB0aHVtYiBiICh1bmNvbmRpdGlvbmFsIGJyYW5jaCkuICA/Pz8gUmVhbGx5PyAgKi8KLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmIHx8IChsb25nKSB2YWx1ZSA8IC0weDgwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGZmZmZmMDAwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX1RITV9BQlM1OgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbnMgZm9yIHRoZSB0aHVtYi4gKi8KLSNpZmRlZiBVU0VfUkVMCi0gICAgICAvKiBOZWVkIHRvIHJlZmV0Y2ggYWRkZW5kLiAgKi8KLSAgICAgIGFkZGVuZCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgaG93dG8tPnNyY19tYXNrOwotICAgICAgLyogPz8/IE5lZWQgdG8gZGV0ZXJtaW5lIHNoaWZ0IGFtb3VudCBmcm9tIG9wZXJhbmQgc2l6ZS4gICovCi0gICAgICBhZGRlbmQgPj49IGhvd3RvLT5yaWdodHNoaWZ0OwotI2VuZGlmCi0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIC8qID8/PyBJc24ndCB2YWx1ZSB1bnNpZ25lZD8gICovCi0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHgxZiB8fCAobG9uZykgdmFsdWUgPCAtMHgxMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICAvKiA/Pz8gVmFsdWUgbmVlZHMgdG8gYmUgcHJvcGVybHkgc2hpZnRlZCBpbnRvIHBsYWNlIGZpcnN0LiAgKi8KLSAgICAgIHZhbHVlIHw9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmODNmOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fVEhNX1BDMjI6Ci0gICAgICAvKiBUaHVtYiBCTCAoYnJhbmNoIGxvbmcgaW5zdHJ1Y3Rpb24pLiAqLwotICAgICAgewotCWJmZF92bWEgICAgICAgIHJlbG9jYXRpb247Ci0JYm9vbGVhbiAgICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQliZmRfdm1hICAgICAgICB1cHBlcl9pbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0JYmZkX3ZtYSAgICAgICAgbG93ZXJfaW5zbiA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEgKyAyKTsKLQliZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMTsKLQliZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfiByZWxvY19zaWduZWRfbWF4OwotCWJmZF92bWEgICAgICAgIGNoZWNrOwotCWJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLQotI2lmZGVmIFVTRV9SRUwKLQkvKiBOZWVkIHRvIHJlZmV0Y2ggdGhlIGFkZGVuZCBhbmQgc3F1aXNoIHRoZSB0d28gMTEgYml0IHBpZWNlcwotCSAgIHRvZ2V0aGVyLiAgKi8KLQl7Ci0JICBiZmRfdm1hIHVwcGVyID0gdXBwZXJfaW5zbiAmIDB4N2ZmOwotCSAgYmZkX3ZtYSBsb3dlciA9IGxvd2VyX2luc24gJiAweDdmZjsKLQkgIHVwcGVyID0gKHVwcGVyIF4gMHg0MDApIC0gMHg0MDA7IC8qIHNpZ24gZXh0ZW5kICovCi0JICBhZGRlbmQgPSAodXBwZXIgPDwgMTIpIHwgKGxvd2VyIDw8IDEpOwotCSAgc2lnbmVkX2FkZGVuZCA9IGFkZGVuZDsKLQl9Ci0jZW5kaWYKLQotICAgICAgICAvKiBJZiBpdCBpcyBub3QgYSBjYWxsIHRvIHRodW1iLCBhc3N1bWUgY2FsbCB0byBhcm0uCi0JICAgSWYgaXQgaXMgYSBjYWxsIHJlbGF0aXZlIHRvIGEgc2VjdGlvbiBuYW1lLCB0aGVuIGl0IGlzIG5vdCBhCi0JICAgZnVuY3Rpb24gY2FsbCBhdCBhbGwsIGJ1dCByYXRoZXIgYSBsb25nIGp1bXAuICAqLwotCWlmIChzeW1fZmxhZ3MgIT0gU1RUX0FSTV9URlVOQyAmJiBzeW1fZmxhZ3MgIT0gU1RUX1NFQ1RJT04pCi0JICB7Ci0JICAgIGlmIChlbGYzMl90aHVtYl90b19hcm1fc3R1YgotCQkoaW5mbywgc3ltX25hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJIGhpdF9kYXRhLCBzeW1fc2VjLCByZWwtPnJfb2Zmc2V0LCBzaWduZWRfYWRkZW5kLCB2YWx1ZSkpCi0JICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQkgICAgZWxzZQotCSAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCSAgfQotCi0JcmVsb2NhdGlvbiA9IHZhbHVlICsgc2lnbmVkX2FkZGVuZDsKLQotCXJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyByZWwtPnJfb2Zmc2V0KTsKLQkKLQlpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JICB7Ci0JICAgIEVsZl9JbnRlcm5hbF9FaGRyICogaV9laGRycDsgLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0JICAgIAotCSAgICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKTsKLQotCSAgICAvKiBQcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGNvZGUgYWxzbyB1c2VkIHRvIGFkZCBpbiB0aGUgcGlwbGluZQotCSAgICAgICBvZmZzZXQgaGVyZS4gIFRoaXMgaXMgd3JvbmcgYmVjYXVzZSB0aGUgbGlua2VyIGlzIG5vdCBzdXBwb3NlZAotCSAgICAgICB0byBrbm93IGFib3V0IHN1Y2ggdGhpbmdzLCBhbmQgb25lIGRheSBpdCBtaWdodCBjaGFuZ2UuICBJbiBvcmRlcgotCSAgICAgICB0byBzdXBwb3J0IG9sZCBiaW5hcmllcyB0aGF0IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIgaG93ZXZlciwgc28KLQkgICAgICAgd2UgYXR0ZW1wdCB0byBkZXRlY3Qgd2hpY2ggQUJJIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcmVsb2MuICAqLwotCSAgICBpZiAoICAgc3RyY21wIChiZmRfZ2V0X3RhcmdldCAoaW5wdXRfYmZkKSwgImVsZjMyLWxpdHRsZWFybS1vYWJpIikgPT0gMAotCQl8fCBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItYmlnYXJtLW9hYmkiKSA9PSAwCi0JCXx8IGlfZWhkcnAtPmVfaWRlbnRbRUlfT1NBQkldID09IDApCi0JICAgICAgcmVsb2NhdGlvbiArPSA0OwotCSAgfQotCi0JY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCi0JLyogSWYgdGhpcyBpcyBhIHNpZ25lZCB2YWx1ZSwgdGhlIHJpZ2h0c2hpZnQganVzdCBkcm9wcGVkCi0JICAgbGVhZGluZyAxIGJpdHMgKGFzc3VtaW5nIHR3b3MgY29tcGxlbWVudCkuICAqLwotCWlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj0gMCkKLQkgIHNpZ25lZF9jaGVjayA9IGNoZWNrOwotCWVsc2UKLQkgIHNpZ25lZF9jaGVjayA9IGNoZWNrIHwgfigoYmZkX3ZtYSkgLTEgPj4gaG93dG8tPnJpZ2h0c2hpZnQpOwotCi0JLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KLQlpZiAoc2lnbmVkX2NoZWNrID4gcmVsb2Nfc2lnbmVkX21heCB8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgb3ZlcmZsb3cgPSB0cnVlOwotCi0JLyogUHV0IFJFTE9DQVRJT04gYmFjayBpbnRvIHRoZSBpbnNuLiAgKi8KLQl1cHBlcl9pbnNuID0gKHVwcGVyX2luc24gJiB+KGJmZF92bWEpIDB4N2ZmKSB8ICgocmVsb2NhdGlvbiA+PiAxMikgJiAweDdmZik7Ci0JbG93ZXJfaW5zbiA9IChsb3dlcl9pbnNuICYgfihiZmRfdm1hKSAweDdmZikgfCAoKHJlbG9jYXRpb24gPj4gMSkgJiAweDdmZik7Ci0KLQkvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZTogICovCi0JYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB1cHBlcl9pbnNuLCBoaXRfZGF0YSk7Ci0JYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBsb3dlcl9pbnNuLCBoaXRfZGF0YSArIDIpOwotCi0JcmV0dXJuIChvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vayk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fQ09QWToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9HTE9CX0RBVDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9KVU1QX1NMT1Q6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUkVMQVRJVkU6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fR09UT0ZGOgotICAgICAgLyogUmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgICAgCi0gICAgICAvKiBOb3RlIHRoYXQgc2dvdC0+b3V0cHV0X29mZnNldCBpcyBub3QgaW52b2x2ZWQgaW4gdGhpcwotICAgICAgICAgY2FsY3VsYXRpb24uICBXZSBhbHdheXMgd2FudCB0aGUgc3RhcnQgb2YgLmdvdC4gIElmIHdlCi0gICAgICAgICBkZWZpbmUgX0dMT0JBTF9PRkZTRVRfVEFCTEUgaW4gYSBkaWZmZXJlbnQgd2F5LCBhcyBpcwotICAgICAgICAgcGVybWl0dGVkIGJ5IHRoZSBBQkksIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoaXMKLSAgICAgICAgIGNhbGN1bGF0aW9uLiAqLwotCi0gICAgICB2YWx1ZSAtPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgIAkJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgCQkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX0dPVFBDOgotICAgICAgLyogVXNlIGdsb2JhbCBvZmZzZXQgdGFibGUgYXMgc3ltYm9sIHZhbHVlLiAqLwotCi0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCi0gICAgICBpZiAoc2dvdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgdmFsdWUgPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgIAkJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgCQkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX0dPVDMyOgotICAgICAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZS4gKi8KLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgaWYgKCFlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCB8fAotCSAgICAgIChpbmZvLT5zaGFyZWQgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhIC1Cc3ltYm9saWMgbGluawotCQkgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBsb2NhbGx5LiAgV2UgbXVzdCBpbml0aWFsaXplIHRoaXMKLQkJIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlIG9mZnNldCBtdXN0Ci0JCSBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZSB1c2UgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdAotCQkgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZSBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsLmdvdCByZWxvY2F0aW9uCi0JCSBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMgaXMgZG9uZSBpbiB0aGUKLQkJIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAqLwotCi0JICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQlvZmYgJj0gfjE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICBoLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCX0KLQkgICAgfQotCi0JICB2YWx1ZSA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF92bWEgb2ZmOwotCi0JICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMICYmCi0JCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlIHRoZQotCSAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeQotCSAgICAgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICovCi0JICBpZiAoKG9mZiAmIDEpICE9IDApCi0JICAgIG9mZiAmPSB+MTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgYXNlY3Rpb24gKiBzcmVsZ290OwotCQkgIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotCi0JCSAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICArIG9mZik7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9BUk1fUkVMQVRJVkUpOwotCQkgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkgICAgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJICAgICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJfQotCi0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JICAgIH0KLQotCSAgdmFsdWUgPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCX0KLSAgICAgIAotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgIAkJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgCQkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX1BMVDMyOgotICAgICAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0gICAgICAvKiBSZXNvbHZlIGEgUExUMzIgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCBkaXJlY3RseSwKLSAgICAgICAgIHdpdGhvdXQgdXNpbmcgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAqLwotICAgICAgaWYgKGggPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgCQkJCSBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAgIAkJCQkgKGJmZF92bWEpIDApOwotCi0gICAgICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQlyZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotCQkJCQkgKGJmZF92bWEpIDApOwotCi0gICAgICBCRkRfQVNTRVJUKHNwbHQgIT0gTlVMTCk7Ci0gICAgICBpZiAoc3BsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgdmFsdWUgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBoLT5wbHQub2Zmc2V0KTsKLSAgICAgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgIAkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAgIAkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX1NCUkVMMzI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fQU1QX1ZDQUxMOToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SU0JSRUwzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9USE1fUlBDMjI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUlJFTDMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JBQlMzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SUEMyNDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SQkFTRToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLX0KLQotI2lmZGVmIFVTRV9SRUwKLS8qIEFkZCBJTkNSRU1FTlQgdG8gdGhlIHJlbG9jIChvZiB0eXBlIEhPV1RPKSBhdCBBRERSRVNTLiAgKi8KLXN0YXRpYyB2b2lkCi1hcm1fYWRkX3RvX3JlbCAoYWJmZCwgYWRkcmVzcywgaG93dG8sIGluY3JlbWVudCkKLSAgICAgYmZkICogICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIGJmZF9ieXRlICogICAgICAgICBhZGRyZXNzOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci0gICAgIGJmZF9zaWduZWRfdm1hICAgICBpbmNyZW1lbnQ7Ci17Ci0gIGJmZF92bWEgICAgICAgIGNvbnRlbnRzOwotICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7Ci0KLSAgY29udGVudHMgPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyZXNzKTsKLQotICAvKiBHZXQgdGhlIChzaWduZWQpIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgYWRkZW5kID0gY29udGVudHMgJiBob3d0by0+c3JjX21hc2s7Ci0gIGlmIChhZGRlbmQgJiAoKGhvd3RvLT5zcmNfbWFzayArIDEpID4+IDEpKQotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIG1hc2s7Ci0gICAgICAKLSAgICAgIG1hc2sgPSAtMTsKLSAgICAgIG1hc2sgJj0gfiBob3d0by0+c3JjX21hc2s7Ci0gICAgICBhZGRlbmQgfD0gbWFzazsKLSAgICB9Ci0KLSAgLyogQWRkIGluIHRoZSBpbmNyZW1lbnQsICh3aGljaCBpcyBhIGJ5dGUgdmFsdWUpLiAgKi8KLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKLSAgICBkZWZhdWx0OgotICAgICAgYWRkZW5kICs9IGluY3JlbWVudDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9QQzI0OgotICAgICAgYWRkZW5kIDw8PSBob3d0by0+c2l6ZTsKLSAgICAgIGFkZGVuZCArPSAgaW5jcmVtZW50OwotICAgICAgCi0gICAgICAvKiBTaG91bGQgd2UgY2hlY2sgZm9yIG92ZXJmbG93IGhlcmUgPyAgKi8KLQotICAgICAgLyogRHJvcCBhbnkgdW5kZXNpcmVkIGJpdHMuICAqLwotICAgICAgYWRkZW5kID4+PSBob3d0by0+cmlnaHRzaGlmdDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIGNvbnRlbnRzID0gKGNvbnRlbnRzICYgfiBob3d0by0+ZHN0X21hc2spIHwgKGFkZGVuZCAmIGhvd3RvLT5kc3RfbWFzayk7Ci0gIAotICBiZmRfcHV0XzMyIChhYmZkLCBjb250ZW50cywgYWRkcmVzcyk7Ci19Ci0jZW5kaWYgLyogVVNFX1JFTCAqLwotCi0vKiBSZWxvY2F0ZSBhbiBBUk0gRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLSAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgbmFtZTsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW07Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgcjsKLSAgICAgIGFyZWxlbnQgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgICA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoICAgcl90eXBlID09IFJfQVJNX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfQVJNX0dOVV9WVElOSEVSSVQpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBlbGYzMl9hcm1faW5mb190b19ob3d0byAoaW5wdXRfYmZkLCAmIGJmZF9yZWxvYywgcmVsKTsKLSAgICAgIGhvd3RvID0gYmZkX3JlbG9jLmhvd3RvOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLSNpZmRlZiBVU0VfUkVMCi0JCSAgYXJtX2FkZF90b19yZWwgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0LAotCQkJCSAgaG93dG8sIHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWUpOwotI2Vsc2UKLQkJICByZWwtPnJfYWRkZW5kICs9IChzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlKQotCQkgICAgPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0jZW5kaWYKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBpbnQgcmVsb2NhdGlvbl9uZWVkZWQgPSAxOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgICAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24gdmFsdWUuCi0JICAgICAgICAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZSBvYnNjdXJlIGNhc2VzCi0JICAgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICovCi0JICAgICAgc3dpdGNoIChyX3R5cGUpCi0JCXsKLQkgICAgICAgIGNhc2UgUl9BUk1fUEMyNDoKLQkgICAgICAgIGNhc2UgUl9BUk1fQUJTMzI6Ci0JICAgICAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAgICAgICAgICYmICgKLQkgICAgICAgICAgICAgIAkgICghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkgICAgICAgICAgICAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkJCSAgKQotCSAgICAgICAgICAgICAgJiYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgICAgKQotCSAgICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgY2FzZSBSX0FSTV9HT1RQQzoKLQkgICAgICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgIGJyZWFrOwotCi0JICAgICAgICBjYXNlIFJfQVJNX0dPVDMyOgotCSAgICAgICAgICBpZiAoZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgICAgICAgICAgICAgJiYgKCFpbmZvLT5zaGFyZWQKLQkgICAgICAgICAgICAgICAgICB8fCAoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JICAgICAgICAgICAgICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0JCQkgICkKLQkJICAgICAgKQotCSAgICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgY2FzZSBSX0FSTV9QTFQzMjoKLQkgICAgICAgICAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpLTEpCi0JICAgICAgICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgIGJyZWFrOwotCi0JICAgICAgICBkZWZhdWx0OgotCQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIpLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgICAgICByZWxvY2F0aW9uX25lZWRlZCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChyZWxvY2F0aW9uX25lZWRlZCkKLQkJcmVsb2NhdGlvbiA9IGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsCi0JCSAgICAgKCFpbmZvLT5zaGFyZWQgfHwgaW5mby0+bm9fdW5kZWZpbmVkKSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0JbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBlbHNlCi0JewotCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JfQotCi0gICAgICByID0gZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLAotCQkJCQkgcmVsb2NhdGlvbiwgaW5mbywgc2VjLCBuYW1lLAotCQkJCQkgKGggPyBFTEZfU1RfVFlQRSAoaC0+dHlwZSkgOgotCQkJCQkgIEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pKSwgaCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgMDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBrZWVwIEFSTSBzcGVjaWZpYyBmbGFncyBpbiB0aGUgRUxGIGhlYWRlci4gKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBpZiAoZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0gICAgICAmJiBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAhPSBmbGFncykKLSAgICB7Ci0gICAgICBpZiAoZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0JX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgbm9uLWludGVyd29ya2luZyIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGVsc2UKLQlfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1XYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICAgICAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBpbl9mbGFnczsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoZWxmX2ZsYWdzX2luaXQgKG9iZmQpICYmIGluX2ZsYWdzICE9IG91dF9mbGFncykKLSAgICB7Ci0gICAgICAvKiBDYW5ub3QgbWl4IFBJQyBhbmQgbm9uLVBJQyBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9QSUMpICE9IChvdXRfZmxhZ3MgJiBFRl9QSUMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ2Fubm90IG1peCBBUENTMjYgYW5kIEFQQ1MzMiBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTXzI2KSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU18yNikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDYW5ub3QgbWl4IGZsb2F0IEFQQ1MgYW5kIG5vbi1mbG9hdCBBUENTIGNvZGUuICAqLwotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgaW50ZXJ3b3JraW5nIGZsYWdzCi0gICAgICAgICB0aGVuIHR1cm4gb2ZmIHRoZSBpbnRlcndvcmtpbmcgYml0LiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9JTlRFUldPUkspICE9IChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspKQotCXsKLQkgIGlmIChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspCi0JICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmsgZmxhZyBpbiAlcyBiZWNhdXNlIG5vbi1pbnRlcndvcmtpbmcgY29kZSBpbiAlcyBoYXMgYmVlbiBsaW5rZWQgd2l0aCBpdCIpLAotCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0JICBpbl9mbGFncyAmPSB+RUZfSU5URVJXT1JLOwotCX0KLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOCi0gICAgICAmJiBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgYmZkX2JpZ19lbmRpYW4gKGliZmQpID8gImJpZyIgOiAibGl0dGxlIiwKLQkgYmZkX2JpZ19lbmRpYW4gKG9iZmQpID8gImJpZyIgOiAibGl0dGxlIik7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgQkZEIG11c3QgaGF2ZSBoYWQgaXRzIGZsYWdzIGluaXRpYWxpc2VkLiAgKi8KLSAgLyogVGhlIGZvbGxvd2luZyBzZWVtcyBib2d1cyB0byBtZSAtLSBUaGUgZmxhZ3MgYXJlIGluaXRpYWxpemVkIGluCi0gICAgIHRoZSBhc3NlbWJsZXIgYnV0IEkgZG9uJ3QgdGhpbmsgYW4gZWxmX2ZsYWdzX2luaXQgZmllbGQgaXMKLSAgICAgd3JpdHRlbiBpbnRvIHRoZSBvYmplY3QgKi8KLSAgLyogQkZEX0FTU0VSVCAoZWxmX2ZsYWdzX2luaXQgKGliZmQpKTsgKi8KLQotICBpbl9mbGFncyAgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotICAgICAgICAgYm90aGVyIHNldHRpbmcgdGhlIGZsYWdzIGZvciB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSwKLSAgICAgICAgIGluc3RlYWQgYWxsb3cgZnV0dXJlIG1lcmdlcyB0byBkbyB0aGlzLiAgSWYgbm8gZnV0dXJlCi0gICAgICAgICBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0gICAgICAgICB1bml0aWFsaXNlZCB2YWx1ZXMsIHdoaWNoIHN1cnByaXNlIHN1cnByaXNlLCBjb3JyZXNwb25kCi0gICAgICAgICB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgICAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChpYmZkKS0+dGhlX2RlZmF1bHQpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBDaGVjayBmbGFnIGNvbXBhdGliaWxpdHkuICAqLwotICBpZiAoaW5fZmxhZ3MgPT0gb3V0X2ZsYWdzKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENvbXBsYWluIGFib3V0IHZhcmlvdXMgZmxhZyBtaXNtYXRjaGVzLiAgKi8KLQotICBpZiAoKGluX2ZsYWdzICYgRUZfQVBDU18yNikgIT0gKG91dF9mbGFncyAmIEVGX0FQQ1NfMjYpKQotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLUVycm9yOiAlcyBjb21waWxlZCBmb3IgQVBDUy0lZCwgd2hlcmVhcyAlcyBpcyBjb21waWxlZCBmb3IgQVBDUy0lZCIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQlpbl9mbGFncyAmIEVGX0FQQ1NfMjYgPyAyNiA6IDMyLAotCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCQlvdXRfZmxhZ3MgJiBFRl9BUENTXzI2ID8gMjYgOiAzMik7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSkKLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1FcnJvcjogJXMgcGFzc2VzIGZsb2F0cyBpbiAlcyByZWdpc3RlcnMsIHdoZXJlYXMgJXMgcGFzc2VzIHRoZW0gaW4gJXMgcmVnaXN0ZXJzIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJICAgICBpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQgPyBfICgiZmxvYXQiKSA6IF8gKCJpbnRlZ2VyIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKLQkJICAgICAgb3V0X2ZsYWdzICYgRUZfQVBDU18yNiA/IF8gKCJmbG9hdCIpIDogXyAoImludGVnZXIiKSk7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX1BJQykgIT0gKG91dF9mbGFncyAmIEVGX1BJQykpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotRXJyb3I6ICVzIGlzIGNvbXBpbGVkIGFzIHBvc2l0aW9uICVzIGNvZGUsIHdoZXJlYXMgJXMgaXMgbm90IiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJICAgIGluX2ZsYWdzICYgRUZfUElDID8gXyAoImluZGVwZW5kZW50IikgOiBfICgiZGVwZW5kZW50IiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgLyogSW50ZXJ3b3JraW5nIG1pc21hdGNoIGlzIG9ubHkgYSB3YXJuaW5nLiAqLwotICBpZiAoKGluX2ZsYWdzICYgRUZfSU5URVJXT1JLKSAhPSAob3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLKSkKLSAgICB7Ci0gICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1XYXJuaW5nOiAlcyAlcyBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgJXMiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICBpbl9mbGFncyAmIEVGX0lOVEVSV09SSyA/IF8gKCJzdXBwb3J0cyIpIDogXyAoImRvZXMgbm90IHN1cHBvcnQiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICBvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUksgPyBfICgiZG9lcyBub3QiKSA6IF8gKCJkb2VzIikpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHI7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBwdHI7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLQotICAvKiBQcmludCBub3JtYWwgRUxGIHByaXZhdGUgZGF0YS4gICovCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0KLSAgLyogSWdub3JlIGluaXQgZmxhZyAtIGl0IG1heSBub3QgYmUgc2V0LCBkZXNwaXRlIHRoZSBmbGFncyBmaWVsZCBjb250YWluaW5nIHZhbGlkIGRhdGEuICAqLwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8gKCJwcml2YXRlIGZsYWdzID0gJWx4OiIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfSU5URVJXT1JLKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2ludGVyd29ya2luZyBlbmFibGVkXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2ludGVyd29ya2luZyBub3QgZW5hYmxlZF0iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQVBDU18yNikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtBUENTLTI2XSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW0FQQ1MtMzJdIikpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbZmxvYXRzIHBhc3NlZCBpbiBmbG9hdCByZWdpc3RlcnNdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbZmxvYXRzIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVyc10iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfUElDKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2Fic29sdXRlIHBvc2l0aW9uXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLWVsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUgKGVsZl9zeW0sIHR5cGUpCi0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBlbGZfc3ltOwotICAgICBpbnQgdHlwZTsKLXsKLSAgc3dpdGNoIChFTEZfU1RfVFlQRSAoZWxmX3N5bS0+c3RfaW5mbykpCi0gICAgewotICAgIGNhc2UgU1RUX0FSTV9URlVOQzoKLSAgICAgIHJldHVybiBFTEZfU1RfVFlQRSAoZWxmX3N5bS0+c3RfaW5mbyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNUVF9BUk1fMTZCSVQ6Ci0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIG5vdCBhbiBvYmplY3QsIHJldHVybiB0aGUgU1RUX0FSTV8xNkJJVCBmbGFnLgotCSBUaGlzIGFsbG93cyB1cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRhdGEgdXNlZCBieSBUaHVtYiBpbnN0cnVjdGlvbnMKLQkgYW5kIG5vbi1kYXRhICh3aGljaCBpcyBwcm9iYWJseSBjb2RlKSBpbnNpZGUgVGh1bWIgcmVnaW9ucyBvZiBhbgotCSBleGVjdXRhYmxlLiAgKi8KLSAgICAgIGlmICh0eXBlICE9IFNUVF9PQkpFQ1QpCi0JcmV0dXJuIEVMRl9TVF9UWVBFIChlbGZfc3ltLT5zdF9pbmZvKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHlwZTsKLX0KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZjMyX2FybV9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBXZSBkb24ndCBzdXBwb3J0IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBHT1QgYW5kIFBMVCByZWxvY3MgeWV0LiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICByZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbF9lbmQ7Ci0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzZ290LCAqc3JlbGdvdCwgKnNyZWxvYzsKLSAgYmZkX3ZtYSAqIGxvY2FsX2dvdF9vZmZzZXRzOwotICAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIHNnb3QgPSBzcmVsZ290ID0gc3JlbG9jID0gTlVMTDsKLSAgCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotICAgICAgCi0gICAgICAvKiBTb21lIHJlbG9jcyByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFJfQVJNX0dPVDMyOgotCSAgICBjYXNlIFJfQVJNX0dPVE9GRjoKLQkgICAgY2FzZSBSX0FSTV9HT1RQQzoKLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotCSAgY2FzZSBSX0FSTV9HT1QzMjoKLQkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQkgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgICB7Ci0JICAgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgICAgfQotCi0JICAgIC8qIEdldCB0aGUgZ290IHJlbG9jYXRpb24gc2VjdGlvbiBpZiBuZWNlc3NhcnkuICAqLwotCSAgICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgICAgewotCSAgICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkKLQkgICAgICAgIC8qIElmIG5vIGdvdCByZWxvY2F0aW9uIHNlY3Rpb24sIG1ha2Ugb25lIGFuZCBpbml0aWFsaXplLiAgKi8KLQkgICAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCSAgewotCQkgICAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJICAJCQkJICAgIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCSAgICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCi0JICAgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCSAgICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0gICAgIAkgICAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsCi0gICAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIHNpemVfdCBzaXplOwotCQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkJICAgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfdm1hKTsKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrKQotCQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tpXSA9IChiZmRfdm1hKSAtMTsKLQkJICB9Ci0KLQkgICAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCi0JICAgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JCSAgICAgb3V0cHV0IGEgUl9BUk1fUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotCQkgICAgIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgICAgIH0KLQotCSAgICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkgICAgYnJlYWs7Ci0KLSAgCSAgY2FzZSBSX0FSTV9QTFQzMjoKLQkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdoaWNoIGlzCi0gICAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQotICAgICAgICAgICAgICAgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLSAgICAgICAgICAgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgICBpZiAoaCA9PSBOVUxMKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIFJfQVJNX0FCUzMyOgotCSAgY2FzZSBSX0FSTV9SRUwzMjoKLQkgIGNhc2UgUl9BUk1fUEMyNDoKLQkgICAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIGlzIGEgcmVsb2MKLSAgICAgICAgICAgICAgIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBvciBhIG5vbiBQQyByZWxhdGl2ZSByZWxvYwotICAgICAgICAgICAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgdGhlbiB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jCi0gICAgICAgICAgICAgICBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBsaW5raW5nIHdpdGgKLSAgICAgICAgICAgICAgIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkgYSByZWxvYyBhZ2FpbnN0IGEKLSAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlCi0gICAgICAgICAgICAgICBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCkuICBBdAotICAgICAgICAgICAgICAgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzCi0gICAgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dCB3aWxsIGJlIHNldAotICAgICAgICAgICAgICAgbGF0ZXIgKGl0IGlzIG5ldmVyIGNsZWFyZWQpLiAgV2UgYWNjb3VudCBmb3IgdGhhdAotICAgICAgICAgICAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgICAgICAgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pICE9IFJfQVJNX1BDMjQKLQkgICAgICAgIHx8IChoICE9IE5VTEwKLQkJICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCSAgICAgIHsKLQkgICAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCi0gICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0KLQkJICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAgIChhYmZkLAotCQkJICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkgCSAgICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJICAgbmFtZSArIDQpID09IDApOwotCi0JCSAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgICAgewotCQkgICAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCSAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0JCSAgfQotCi0JICAgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGFuZCB0aGlzIGlzIGEKLSAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgd2UgaGF2ZSBlbnRlcmVkIGZvciB0aGlzIHN5bWJvbCwgc28gdGhhdAotICAgICAgICAgICAgICAgICAgIHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgaXMgb25seSBjYWxsZWQgaWYgd2UgYXJlIHVzaW5nIGFuIGVsZl9pMzg2IGxpbmtlcgotICAgICAgICAgICAgICAgICAgIGhhc2ggdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgaCBpcyByZWFsbHkgYSBwb2ludGVyIHRvCi0gICAgICAgICAgICAgICAgICAgYW4gZWxmX2kzODZfbGlua19oYXNoX2VudHJ5LiAgKi8KLQkgICAgICAgIGlmIChoICE9IE5VTEwgJiYgaW5mby0+c3ltYm9saWMKLQkJICAgICYmIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfQVJNX1BDMjQpCi0JCSAgewotCQkgICAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiBlaDsKLQkJICAgIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHA7Ci0KLQkJICAgIGVoID0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkJICAgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCi0JCSAgICAgICAgYnJlYWs7Ci0KLQkJICAgIGlmIChwID09IE5VTEwpCi0JCSAgICAgIHsKLQkJICAgICAgICBwID0gKChzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKikKLQkJCSAgICAgYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAqIHApKTsKLQotCQkgICAgICAgIGlmIChwID09IE5VTEwpCi0JCQkgIHJldHVybiBmYWxzZTsKLQkJICAgICAgICBwLT5uZXh0ID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci0JCSAgICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7Ci0JCSAgICAgICAgcC0+Y291bnQgPSAwOwotCQkgICAgICB9Ci0KLQkJICAgICsrcC0+Y291bnQ7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQkgIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiBhbmQgb2Zmc2V0LCBmb3IgZXJyb3IKLSAgIHJlcG9ydGluZy4gICBUaGlzIGNvZGUgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGNvZGUgaW4gZWxmLmMsIGV4Y2VwdAotICAgdGhhdCBpdCBhbHNvIGFjY2VwdHMgU1RUX0FSTV9URlVOQyBhcyBhIHN5bWJvbCB0aGF0IG5hbWVzIGEgZnVuY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZmluZF9uZWFyZXN0X2xpbmUKLSAgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICogICAgICAgICAgYWJmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKiAgICAgc3ltYm9sczsKLSAgICAgYmZkX3ZtYSAgICAgICAgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqICBmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKiogIGZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqIGxpbmVfcHRyOwotewotICBib29sZWFuICAgICAgZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsKLSAgYXN5bWJvbCAqICAgIGZ1bmM7Ci0gIGJmZF92bWEgICAgICBsb3dfZnVuYzsKLSAgYXN5bWJvbCAqKiAgIHA7Ci0KLSAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0ciwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKLQkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKLQkJCQkJICAgICAmZWxmX3RkYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChzeW1ib2xzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgZnVuYyA9IE5VTEw7Ci0gIGxvd19mdW5jID0gMDsKLQotICBmb3IgKHAgPSBzeW1ib2xzOyAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgZWxmX3N5bWJvbF90eXBlICpxOwotCi0gICAgICBxID0gKGVsZl9zeW1ib2xfdHlwZSAqKSAqcDsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoJnEtPnN5bWJvbCkgIT0gc2VjdGlvbikKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChFTEZfU1RfVFlQRSAocS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCWNhc2UgU1RUX0ZJTEU6Ci0JICBmaWxlbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCZxLT5zeW1ib2wpOwotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfTk9UWVBFOgotCWNhc2UgU1RUX0ZVTkM6Ci0JY2FzZSBTVFRfQVJNX1RGVU5DOgotCSAgaWYgKHEtPnN5bWJvbC5zZWN0aW9uID09IHNlY3Rpb24KLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmMKLQkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZnVuYyA9IChhc3ltYm9sICopIHE7Ci0JICAgICAgbG93X2Z1bmMgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IGJmZF9hc3ltYm9sX25hbWUgKGZ1bmMpOwotICAqbGluZV9wdHIgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgYmZkICogZHlub2JqOwotICBhc2VjdGlvbiAqIHM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAotICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpID09IDApCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBQTFQzMiByZWxvYyBpbiBhbiBpbnB1dAotICAgICAgICAgICAgIGZpbGUsIGJ1dCB0aGUgc3ltYm9sIHdhcyBuZXZlciByZWZlcnJlZCB0byBieSBhIGR5bmFtaWMKLSAgICAgICAgICAgICBvYmplY3QuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZAotICAgICAgICAgICAgIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFBDMzIKLSAgICAgICAgICAgICByZWxvYyBpbnN0ZWFkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgd2hpY2gKLQkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIC5nb3Qgc2VjdGlvbiBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gNDsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfQVJNX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KLSAgICAgY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiAzKQotICAgIHBvd2VyX29mX3R3byA9IDM7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBiZmQgKiBkeW5vYmo7Ci0gIGFzZWN0aW9uICogczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbC5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBzaGFyZWQgbGluaywgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgYWxsCi0gICAgIFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotICAgICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2UKLSAgICAgd2lsbCBub3QgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGluZm8tPnN5bWJvbGljKQotICAgIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgIGVsZjMyX2FybV9kaXNjYXJkX2NvcGllcywKLQkJCQkgIChQVFIpIE5VTEwpOwotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBtb3N0bHkgdG8gaGFuZGxlIC5yZWwuYnNzIGFuZAotCQkgLnJlbC5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICogdGFyZ2V0OwotCi0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jIHNlY3Rpb25zIG90aGVyCi0gICAgICAgICAgICAgICAgIHRoYW4gLnJlbC5wbHQuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsLnBsdCIpICE9IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICpvdXRuYW1lOwotCi0JCSAgcmVsb2NzID0gdHJ1ZTsKLQotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMCi0JCSAgICAgZW50cnkuICBUaGUgZW50cmllcyBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbgotCQkgICAgIHJlYWxseSBhcHBseSB0byB0aGUgLmdvdCBzZWN0aW9uLCB3aGljaCB3ZQotCQkgICAgIGNyZWF0ZWQgb3Vyc2VsdmVzIGFuZCBzbyBrbm93IGlzIG5vdCByZWFkb25seS4gICovCi0JCSAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkJICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JCSAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA0KTsKLQkJICAKLQkJICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWx0ZXh0ID0gdHJ1ZTsKLQkJfQotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBhc2VjdGlvbiAqKiBzcHA7Ci0KLQkgIGZvciAoc3BwID0gJnMtPm91dHB1dF9zZWN0aW9uLT5vd25lci0+c2VjdGlvbnM7Ci0JICAgICAgICpzcHAgIT0gcy0+b3V0cHV0X3NlY3Rpb247Ci0JICAgICAgIHNwcCA9ICYoKnNwcCktPm5leHQpCi0JICAgIDsKLQkgICpzcHAgPSBzLT5vdXRwdXRfc2VjdGlvbi0+bmV4dDsKLQkgIC0tcy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLT5zZWN0aW9uX2NvdW50OwotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMRU5ULAotCQkJCQkJc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGYzMl9hcm1fbGlua19oYXNoX3RyYXZlcnNlIGlmIHdlIGFyZQotICAgY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0IHdpdGggLUJzeW1ib2xpYy4gIEl0IGRpc2NhcmRzIHRoZSBzcGFjZQotICAgYWxsb2NhdGVkIHRvIGNvcHkgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyB3aGljaCBhcmUKLSAgIGRlZmluZWQgaW4gcmVndWxhciBvYmplY3RzLiAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZQotICAgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZSB3b24ndCBmaWxsIHRoZW0gaW4gaW4gdGhlCi0gICByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgUFRSIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogc3ltOwotewotICBiZmQgKiBkeW5vYmo7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogc3BsdDsKLSAgICAgIGFzZWN0aW9uICogc2dvdDsKLSAgICAgIGFzZWN0aW9uICogc3JlbDsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLQkgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5kZXggaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHdoaWNoCi0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgc3ltYm9sLiAgVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhpcyBzeW1ib2wKLQkgaW4gYWxsIHRoZSBzeW1ib2xzIGZvciB3aGljaCB3ZSBhcmUgbWFraW5nIHBsdCBlbnRyaWVzLiAgVGhlCi0JIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyByZXNlcnZlZC4gICovCi0gICAgICBwbHRfaW5kZXggPSBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSAxOwotCi0gICAgICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZ290IHRhYmxlIG9mIHRoZSBlbnRyeSB0aGF0Ci0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgZnVuY3Rpb24uICBFYWNoIC5nb3QgZW50cnkgaXMgNCBieXRlcy4KLQkgVGhlIGZpcnN0IHRocmVlIGFyZSByZXNlcnZlZC4gICovCi0gICAgICBnb3Rfb2Zmc2V0ID0gKHBsdF9pbmRleCArIDMpICogNDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LAotICAgICAgICAgICAgICBlbGYzMl9hcm1fcGx0X2VudHJ5LAotCSAgICAgIFBMVF9FTlRSWV9TSVpFKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgZ290X29mZnNldAotCQkgICAgICAgLSBzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAtIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgIC0gaC0+cGx0Lm9mZnNldCAtIDEyKSwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMTIpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldCksCi0JCSAgc2dvdC0+Y29udGVudHMgKyBnb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgZ290X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9KVU1QX1NMT1QpOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgcGx0X2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogc2dvdDsKLSAgICAgIGFzZWN0aW9uICogc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLQkgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIFRoZSBlbnRyeSBpbgotCSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGluCi0JIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQlyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9HTE9CX0RBVCk7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgc3JlbC0+Y29udGVudHMKLQkJCQkgKyBzcmVsLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWwuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9DT1BZKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzLT5jb250ZW50cwotCQkJCSArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGJmZCAqIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzZ290OwotICBhc2VjdGlvbiAqIHNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKiBuYW1lOwotCSAgYXNlY3Rpb24gKiBzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsLnBsdCI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxTWjoKLQkgICAgICAvKiBNeSByZWFkaW5nIG9mIHRoZSBTVlI0IEFCSSBpbmRpY2F0ZXMgdGhhdCB0aGUKLQkJIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHJlbG9jcyAoRFRfSk1QUkVMKSBzaG91bGQgYmUKLQkJIGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHJlbG9jcyAoRFRfUkVMKS4gIFRoaXMgaXMKLQkJIHdoYXQgU29sYXJpcyBkb2VzLiAgSG93ZXZlciwgVW5peFdhcmUgY2FuIG5vdCBoYW5kbGUKLQkJIHRoYXQgY2FzZS4gIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgdGhlIERUX1JFTFNaIGVudHJ5Ci0JCSBoZXJlIHRvIG1ha2UgaXQgbm90IGluY2x1ZGUgdGhlIEpNUFJFTCByZWxvY3MuICBTaW5jZQotCQkgdGhlIGxpbmtlciBzY3JpcHQgYXJyYW5nZXMgZm9yIC5yZWwucGx0IHRvIGZvbGxvdyBhbGwKLQkJIG90aGVyIHJlbG9jYXRpb24gc2VjdGlvbnMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkJIGFib3V0IGNoYW5naW5nIHRoZSBEVF9SRUwgZW50cnkuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWwucGx0Iik7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fcmF3X3NpemU7Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmMzJfYXJtX3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKLQotICAgICAgLyogVW5peFdhcmUgc2V0cyB0aGUgZW50c2l6ZSBvZiAucGx0IHRvIDQsIGFsdGhvdWdoIHRoYXQgZG9lc24ndAotCSByZWFsbHkgc2VlbSBsaWtlIHRoZSByaWdodCB2YWx1ZS4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBmaXJzdCB0aHJlZSBlbnRyaWVzIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgOCk7Ci0gICAgfQotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1fcG9zdF9wcm9jZXNzX2hlYWRlcnMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgRWxmX0ludGVybmFsX0VoZHIgKiBpX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLQotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0KLSAgaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gICAgICA9IEFSTV9FTEZfT1NfQUJJX1ZFUlNJT047Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfQUJJVkVSU0lPTl0gPSBBUk1fRUxGX0FCSV9WRVJTSU9OOwotfQotCi0KLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9hcm0KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fQVJNCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4ODAwMAotCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgCWVsZjMyX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIAllbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQllbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCWVsZjMyX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAgICBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIAllbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2ZpbmRfbmVhcmVzdF9saW5lCSAgICAgICAgZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlICAgICAgICAgICAgIGVsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICAgICAgICAgIGVsZjMyX2FybV9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICAgICAgICAgIGVsZjMyX2FybV9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBlbGYzMl9hcm1fY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gICAgCWVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbAllbGYzMl9hcm1fYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAllbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCWVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMJZWxmMzJfYXJtX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycwllbGYzMl9hcm1fcG9zdF9wcm9jZXNzX2hlYWRlcnMKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgICAgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgICAgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gICAgMAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkxMgotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJUExUX0VOVFJZX1NJWkUKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWF2ci5jIGIvYmZkL2VsZjMyLWF2ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjRhYjI4Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1hdnIuYworKysgL2Rldi9udWxsCkBAIC0xLDk2MyArMCwwIEBACi0vKiBBVlItc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGVuaXMgQ2hlcnR5a292IDxkZW5pc2NAb3ZlcnRhLnJ1PgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvYXZyLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIGF2cl9pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmVsZjMyX2F2cl9nY19tYXJrX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hdnJfZ2Nfc3dlZXBfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hdnJfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYXZyX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hdnJfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHZvaWQgYmZkX2VsZl9hdnJfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXZyX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLQotLyogVXNlIFJFTEEgaW5zdGVhZCBvZiBSRUwgKi8KLSN1bmRlZiBVU0VfUkVMCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9hdnJfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX0FWUl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BVlJfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSXzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA3IGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfQVZSXzdfUENSRUwsCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA3LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAzLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl83X1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxMyBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0FWUl8xM19QQ1JFTCwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTMsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSXzEzX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0FWUl8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl8xNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIGZvciBjb21tYW5kIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9BVlJfMTZfUE0sCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSXzE2X1BNIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIGxvdyA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIDE2IGJpdCBhZGRyZXNzLgotICAgICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfTE84X0xESSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0xPOF9MREkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQSBoaWdoIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24gb2YgMTYgYml0IGFkZHJlc3MuCi0gICAgIEZvciBMREkgY29tbWFuZC4gICovCi0gIEhPV1RPIChSX0FWUl9ISThfTERJLAkJLyogdHlwZSAqLwotCSA4LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfSEk4X0xESSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIGhpZ2ggNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiAyMiBiaXQgYWRkcmVzcy4KLSAgICAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0hIOF9MREksCQkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfSEg4X0xESSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIG5lZ2F0aXZlIGxvdyA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIDE2IGJpdCBhZGRyZXNzLgotICAgICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfTE84X0xESV9ORUcsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0xPOF9MRElfTkVHIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEEgaGVnYXRpdmUgaGlnaCA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIDE2IGJpdCBhZGRyZXNzLgotICAgICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfSEk4X0xESV9ORUcsCS8qIHR5cGUgKi8KLQkgOCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0hJOF9MRElfTkVHIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEEgaGVnYXRpdmUgaGlnaCA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIDIyIGJpdCBhZGRyZXNzLgotICAgICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfSEg4X0xESV9ORUcsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl9ISDhfTERJX05FRyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIGxvdyA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIDI0IGJpdCBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzLgotICAgICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfTE84X0xESV9QTSwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfTE84X0xESV9QTSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIGhpZ2ggOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiBvZiAxNiBiaXQgcHJvZ3JhbSBtZW1vcnkgYWRkcmVzcy4KLSAgICAgRm9yIExESSBjb21tYW5kLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0hJOF9MRElfUE0sCS8qIHR5cGUgKi8KLQkgOSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0hJOF9MRElfUE0iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQSBoaWdoIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24gb2YgMjQgYml0IHByb2dyYW0gbWVtb3J5IGFkZHJlc3MuCi0gICAgIEZvciBMREkgY29tbWFuZC4gICovCi0gIEhPV1RPIChSX0FWUl9ISDhfTERJX1BNLAkvKiB0eXBlICovCi0JIDE3LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfSEg4X0xESV9QTSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBBIGxvdyA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIGEgbmVnYXRpdmUgMjQgYml0Ci0gICAgIHByb2dyYW0gbWVtb3J5IGFkZHJlc3MuICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfTE84X0xESV9QTV9ORUcsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0xPOF9MRElfUE1fTkVHIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEEgaGlnaCA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIGEgbmVnYXRpdmUgMTYgYml0Ci0gICAgIHByb2dyYW0gbWVtb3J5IGFkZHJlc3MuICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfSEk4X0xESV9QTV9ORUcsCS8qIHR5cGUgKi8KLQkgOSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVZSX0hJOF9MRElfUE1fTkVHIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIEEgaGlnaCA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uIG9mIGEgbmVnYXRpdmUgMjQgYml0Ci0gICAgIHByb2dyYW0gbWVtb3J5IGFkZHJlc3MuICBGb3IgTERJIGNvbW1hbmQuICAqLwotICBIT1dUTyAoUl9BVlJfSEg4X0xESV9QTV9ORUcsCS8qIHR5cGUgKi8KLQkgMTcsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FWUl9ISDhfTERJX1BNX05FRyIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBSZWxvY2F0aW9uIGZvciBDQUxMIGNvbW1hbmQgaW4gQVRtZWdhLiAgKi8KLSAgSE9XVE8gKFJfQVZSX0NBTEwsCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMywJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BVlJfQ0FMTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBBVlIgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGF2cl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGludCBlbGZfcmVsb2NfdmFsOwotfTsKLQotIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXZyX3JlbG9jX21hcCBhdnJfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCAgICAgICAgICAgICAgICAgUl9BVlJfTk9ORSB9LAotICB7IEJGRF9SRUxPQ18zMiwgICAgICAgICAgICAgICAgICAgUl9BVlJfMzIgfSwKLSAgeyBCRkRfUkVMT0NfQVZSXzdfUENSRUwsICAgICAgICAgIFJfQVZSXzdfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfQVZSXzEzX1BDUkVMLCAgICAgICAgIFJfQVZSXzEzX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCAgICAgICAgICAgICAgICAgICBSX0FWUl8xNiB9LAotICB7IEJGRF9SRUxPQ19BVlJfMTZfUE0sICAgICAgICAgICAgUl9BVlJfMTZfUE0gfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0xPOF9MREksICAgICAgICAgIFJfQVZSX0xPOF9MREl9LAotICB7IEJGRF9SRUxPQ19BVlJfSEk4X0xESSwgICAgICAgICAgUl9BVlJfSEk4X0xESSB9LAotICB7IEJGRF9SRUxPQ19BVlJfSEg4X0xESSwgICAgICAgICAgUl9BVlJfSEg4X0xESSB9LAotICB7IEJGRF9SRUxPQ19BVlJfTE84X0xESV9ORUcsICAgICAgUl9BVlJfTE84X0xESV9ORUcgfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0hJOF9MRElfTkVHLCAgICAgIFJfQVZSX0hJOF9MRElfTkVHIH0sCi0gIHsgQkZEX1JFTE9DX0FWUl9ISDhfTERJX05FRywgICAgICBSX0FWUl9ISDhfTERJX05FRyB9LAotICB7IEJGRF9SRUxPQ19BVlJfTE84X0xESV9QTSwgICAgICAgUl9BVlJfTE84X0xESV9QTSB9LAotICB7IEJGRF9SRUxPQ19BVlJfSEk4X0xESV9QTSwgICAgICAgUl9BVlJfSEk4X0xESV9QTSB9LAotICB7IEJGRF9SRUxPQ19BVlJfSEg4X0xESV9QTSwgICAgICAgUl9BVlJfSEg4X0xESV9QTSB9LAotICB7IEJGRF9SRUxPQ19BVlJfTE84X0xESV9QTV9ORUcsICAgUl9BVlJfTE84X0xESV9QTV9ORUcgfSwKLSAgeyBCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE1fTkVHLCAgIFJfQVZSX0hJOF9MRElfUE1fTkVHIH0sCi0gIHsgQkZEX1JFTE9DX0FWUl9ISDhfTERJX1BNX05FRywgICBSX0FWUl9ISDhfTERJX1BNX05FRyB9LAotICB7IEJGRF9SRUxPQ19BVlJfQ0FMTCwgICAgICAgICAgICAgUl9BVlJfQ0FMTCB9Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKGF2cl9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgYXZyX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChhdnJfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9hdnJfaG93dG9fdGFibGVbYXZyX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gQVZSIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1hdnJfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9BVlJfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfYXZyX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9hdnJfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCSAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hdnJfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIC8qIFdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBhdnIuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hdnJfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGVyZm9ybSBhIHNpbmdsZSByZWxvY2F0aW9uLiAgQnkgZGVmYXVsdCB3ZSB1c2UgdGhlIHN0YW5kYXJkIEJGRAotICAgcm91dGluZXMsIGJ1dCBhIGZldyByZWxvY3MsIHdlIGhhdmUgdG8gZG8gdGhlbSBvdXJzZWx2ZXMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hdnJfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBjb250ZW50cywgcmVsLCByZWxvY2F0aW9uKQotICAgICByZWxvY19ob3d0b190eXBlICogIGhvd3RvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICByZWxvY2F0aW9uOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgciA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSAgICAgICAgICAgICAgIHg7Ci0gIGJmZF9zaWduZWRfdm1hCXNyZWw7Ci0KLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0FWUl83X1BDUkVMOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7CS8qIEJyYW5jaCBpbnN0cnVjdGlvbnMgYWRkIDIgdG8gdGhlIFBDLi4uICovCi0gICAgICBzcmVsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkgICAgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLSAgICAgIGlmIChzcmVsICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICBpZiAoc3JlbCA+ICgoMSA8PCA3KSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCA3KSkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZmMwNykgfCAoKChzcmVsID4+IDEpIDw8IDMpICYgMHgzZjgpOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BVlJfMTNfUENSRUw6Ci0gICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotICAgICAgc3JlbCArPSByZWwtPnJfYWRkZW5kOwotICAgICAgc3JlbCAtPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCAtPSAyOwkvKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zIGFkZCAyIHRvIHRoZSBQQy4uLiAqLwotICAgICAgc3JlbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JICAgICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0gICAgICBpZiAoc3JlbCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gICAgICAvKiBBVlIgYWRkcmVzc2VzIGNvbW1hbmRzIGFzIHdvcmRzLiAgKi8KLSAgICAgIHNyZWwgPj49IDE7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdy4gICovCi0gICAgICBpZiAoc3JlbCA8IC0yMDQ4IHx8IHNyZWwgPiAyMDQ3KQotCXsKLQkgIC8qIEFwcGx5IFdSQVBBUk9VTkQgaWYgcG9zc2libGUuICAqLwotCSAgaWYgKGJmZF9nZXRfbWFjaCAoaW5wdXRfYmZkKSA9PSBiZmRfbWFjaF9hdnIyKQotCSAgICB7Ci0JICAgICAgaWYgKHNyZWwgPiAyMDQ3KQotCQlzcmVsIC09IDQwOTY7Ci0JICAgICAgZWxzZQotCQlzcmVsICs9IDQwOTY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQl9Ci0KLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjAwMCkgfCAoc3JlbCAmIDB4ZmZmKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0xPOF9MREk6Ci0gICAgICBjb250ZW50cyArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGYwZjApIHwgKHNyZWwgJiAweGYpIHwgKChzcmVsIDw8IDQpICYgMHhmMDApOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BVlJfSEk4X0xESToKLSAgICAgIGNvbnRlbnRzICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLSAgICAgIHNyZWwgPSAoc3JlbCA+PiA4KSAmIDB4ZmY7Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGYwZjApIHwgKHNyZWwgJiAweGYpIHwgKChzcmVsIDw8IDQpICYgMHhmMDApOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BVlJfSEg4X0xESToKLSAgICAgIGNvbnRlbnRzICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLSAgICAgIHNyZWwgPSAoc3JlbCA+PiAxNikgJiAweGZmOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0xPOF9MRElfTkVHOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgc3JlbCA9IC1zcmVsOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0hJOF9MRElfTkVHOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgc3JlbCA9IC1zcmVsOwotICAgICAgc3JlbCA9IChzcmVsID4+IDgpICYgMHhmZjsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjBmMCkgfCAoc3JlbCAmIDB4ZikgfCAoKHNyZWwgPDwgNCkgJiAweGYwMCk7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FWUl9ISDhfTERJX05FRzoKLSAgICAgIGNvbnRlbnRzICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLSAgICAgIHNyZWwgPSAtc3JlbDsKLSAgICAgIHNyZWwgPSAoc3JlbCA+PiAxNikgJiAweGZmOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0xPOF9MRElfUE06Ci0gICAgICBjb250ZW50cyArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBpZiAoc3JlbCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgICAgc3JlbCA9IHNyZWwgPj4gMTsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjBmMCkgfCAoc3JlbCAmIDB4ZikgfCAoKHNyZWwgPDwgNCkgJiAweGYwMCk7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FWUl9ISThfTERJX1BNOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIHNyZWwgPSBzcmVsID4+IDE7Ci0gICAgICBzcmVsID0gKHNyZWwgPj4gOCkgJiAweGZmOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0hIOF9MRElfUE06Ci0gICAgICBjb250ZW50cyArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBpZiAoc3JlbCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgICAgc3JlbCA9IHNyZWwgPj4gMTsKLSAgICAgIHNyZWwgPSAoc3JlbCA+PiAxNikgJiAweGZmOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0xPOF9MRElfUE1fTkVHOgotICAgICAgY29udGVudHMgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotICAgICAgc3JlbCA9IC1zcmVsOwotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIHNyZWwgPSBzcmVsID4+IDE7Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGYwZjApIHwgKHNyZWwgJiAweGYpIHwgKChzcmVsIDw8IDQpICYgMHhmMDApOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BVlJfSEk4X0xESV9QTV9ORUc6Ci0gICAgICBjb250ZW50cyArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsID0gLXNyZWw7Ci0gICAgICBpZiAoc3JlbCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgICAgc3JlbCA9IHNyZWwgPj4gMTsKLSAgICAgIHNyZWwgPSAoc3JlbCA+PiA4KSAmIDB4ZmY7Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGYwZjApIHwgKHNyZWwgJiAweGYpIHwgKChzcmVsIDw8IDQpICYgMHhmMDApOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BVlJfSEg4X0xESV9QTV9ORUc6Ci0gICAgICBjb250ZW50cyArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsID0gLXNyZWw7Ci0gICAgICBpZiAoc3JlbCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgICAgc3JlbCA9IHNyZWwgPj4gMTsKLSAgICAgIHNyZWwgPSAoc3JlbCA+PiAxNikgJiAweGZmOwotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmMGYwKSB8IChzcmVsICYgMHhmKSB8ICgoc3JlbCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQVZSX0NBTEw6Ci0gICAgICBjb250ZW50cyArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCA9IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBpZiAoc3JlbCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgICAgc3JlbCA9IHNyZWwgPj4gMTsKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggfD0gKChzcmVsICYgMHgxMDAwMCkgfCAoKHNyZWwgPDwgMykgJiAweDFmMDAwMDApKSA+PiAxNjsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBzcmVsICYgMHhmZmZmLCBjb250ZW50cysyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIEFWUiBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXZyX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICByZWxlbmQgICAgID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsICsrKQotICAgIHsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW07Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgcjsKLSAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJfdHlwZTsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0gICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0KLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9ucyBbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaG93dG8gID0gZWxmX2F2cl9ob3d0b190YWJsZSArIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaCAgICAgID0gTlVMTDsKLSAgICAgIHN5bSAgICA9IE5VTEw7Ci0gICAgICBzZWMgICAgPSBOVUxMOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0KLQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7Ci0JICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYykgOiBuYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlcyBbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgewotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHIgPSBhdnJfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICBjb250ZW50cywgcmVsLCByZWxvY2F0aW9uKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKiBtc2cgPSAoY29uc3QgY2hhciAqKSBOVUxMOwotCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cKLQkJKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wKLQkJKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgcmVsb2NhdGlvbiIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAobXNnKQotCSAgICByID0gaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nCi0JICAgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKCEgcikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgYSBBVlIgRUxGIG9iamVjdAotICAgZmlsZS4gIFRoaXMgZ2V0cyB0aGUgQVZSIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZQotICAgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWJmZF9lbGZfYXZyX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlciBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbWFjaF9hdnIyOgotICAgICAgdmFsID0gRV9BVlJfTUFDSF9BVlIyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX2F2cjE6Ci0gICAgICB2YWwgPSBFX0FWUl9NQUNIX0FWUjE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfYXZyMzoKLSAgICAgIHZhbCA9IEVfQVZSX01BQ0hfQVZSMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9hdnI0OgotICAgICAgdmFsID0gRV9BVlJfTUFDSF9BVlI0OwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9IEVNX0FWUjsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfiBFRl9BVlJfTUFDSDsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2F2cl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgZV9zZXQgPSBiZmRfbWFjaF9hdnIyOwotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9PSBFTV9BVlIpCi0gICAgewotICAgICAgaW50IGVfbWFjaCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQVZSX01BQ0g7Ci0gICAgICBzd2l0Y2ggKGVfbWFjaCkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIEVfQVZSX01BQ0hfQVZSMjoKLQkgIGVfc2V0ID0gYmZkX21hY2hfYXZyMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX0FWUl9NQUNIX0FWUjE6Ci0JICBlX3NldCA9IGJmZF9tYWNoX2F2cjE7Ci0JICBicmVhazsKLQotCWNhc2UgRV9BVlJfTUFDSF9BVlIzOgotCSAgZV9zZXQgPSBiZmRfbWFjaF9hdnIzOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfQVZSX01BQ0hfQVZSNDoKLQkgIGVfc2V0ID0gYmZkX21hY2hfYXZyNDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9hdnIsCi0JCQkJICAgIGVfc2V0KTsKLX0KLQotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9hdnIKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9BVlIKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkxCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgICAgYmZkX2VsZjMyX2F2cl92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1hdnIiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JICAgICAgICAgICAgIGF2cl9pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCSAgICAgICAgICAgICBOVUxMCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gICAgICAgICBlbGYzMl9hdnJfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgZWxmMzJfYXZyX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgICAgICAgZWxmMzJfYXZyX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgIGVsZjMyX2F2cl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zICAgICAgICAgIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0JCQkJCWJmZF9lbGZfYXZyX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCWVsZjMyX2F2cl9vYmplY3RfcAotCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1kMTB2LmMgYi9iZmQvZWxmMzItZDEwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDJlODkyLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1kMTB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyogRDEwVi1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotLyogI2luY2x1ZGUgImVsZi9kMTB2LmgiICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIGQxMHZfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLQotCi0vKiBVc2UgUkVMIGluc3RlYWQgb2YgUkVMQSB0byBzYXZlIHNwYWNlICovCi0jZGVmaW5lIFVTRV9SRUwKLQotZW51bSByZWxvY190eXBlCi17Ci0gIFJfRDEwVl9OT05FID0gMCwKLSAgUl9EMTBWXzEwX1BDUkVMX1IsCi0gIFJfRDEwVl8xMF9QQ1JFTF9MLAotICBSX0QxMFZfMTYsCi0gIFJfRDEwVl8xOCwKLSAgUl9EMTBWXzE4X1BDUkVMLAotICBSX0QxMFZfMzIsCi0gIFJfRDEwVl9HTlVfVlRJTkhFUklULAotICBSX0QxMFZfR05VX1ZURU5UUlksCi0gIFJfRDEwVl9tYXgKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9kMTB2X2hvd3RvX3RhYmxlW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX0QxMFZfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIFBDIFJlbGF0aXZlIDEwLWJpdCByZWxvY2F0aW9uLCBzaGlmdGVkIGJ5IDIgICovCi0gIC8qIHJpZ2h0IGNvbnRhaW5lciAqLwotICBIT1dUTyAoUl9EMTBWXzEwX1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMCwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzEwX1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBQQyBSZWxhdGl2ZSAxMC1iaXQgcmVsb2NhdGlvbiwgc2hpZnRlZCBieSAyICAqLwotICAvKiBsZWZ0IGNvbnRhaW5lciAqLwotICBIT1dUTyAoUl9EMTBWXzEwX1BDUkVMX0wsCS8qIHR5cGUgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMCwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0JIDE1LAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xMF9QQ1JFTF9MIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZjgwMDAsCQkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4MDdmODAwMCwgICAJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTYgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDEwVl8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gMTggYml0IGFic29sdXRlIHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgMiAqLwotICBIT1dUTyAoUl9EMTBWXzE4LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xOCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE4IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIgICovCi0gIEhPV1RPIChSX0QxMFZfMThfUENSRUwsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzE4X1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMTBWXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9EMTBWX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0QxMFZfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0QxMFZfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0QxMFZfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotIAotfTsKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBEMTBWIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBkMTB2X3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZDEwdl9yZWxvY19tYXAgZDEwdl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfRDEwVl9OT05FLCB9LAotICB7IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IsIFJfRDEwVl8xMF9QQ1JFTF9SIH0sCi0gIHsgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwgUl9EMTBWXzEwX1BDUkVMX0wgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfRDEwVl8xNiB9LAotICB7IEJGRF9SRUxPQ19EMTBWXzE4LCBSX0QxMFZfMTggfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTCwgUl9EMTBWXzE4X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX0QxMFZfMzIgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfRDEwVl9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9EMTBWX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAoZDEwdl9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZDEwdl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAoZDEwdl9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX2QxMHZfaG93dG9fdGFibGVbZDEwdl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEQxMFYgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWQxMHZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMTBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QxMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZjMyX2QxMHZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX0QxMFZfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiB3ZSBkb24ndCB1c2UgZ290IGFuZCBwbHQgZW50cmllcyBmb3IgZDEwdiAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfZDEwdl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotIAotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0QxMFZfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfRDEwVl9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhIEQxMFYgRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX0QxMFZfR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9EMTBWX0dOVV9WVElOSEVSSVQgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaG93dG8gPSBlbGZfZDEwdl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQluYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgIGlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLQkgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQl9Ci0gICAgICAKLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopIDA7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2QxMHYKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfRDEwVgotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgIGJmZF9lbGYzMl9kMTB2X3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1kMTB2IgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCSAgICAgICAgICAgICAwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkgICAgICAgICAgICAgZDEwdl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkgICAgICAgICAgICAgMAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nICAgMAotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgZWxmMzJfZDEwdl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICAgICAgIGVsZjMyX2QxMHZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgZWxmMzJfZDEwdl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICAgICAgIGVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgICAgICAgICAgMQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZDMwdi5jIGIvYmZkL2VsZjMyLWQzMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzYjVjMC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZDMwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qIEQzMFYtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGJmZF9lbGZfZDMwdl9yZWxvYyBQQVJBTVMgKCgKLSAgICAgYmZkICphYmZkLAotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgYXN5bWJvbCAqc3ltYm9sLAotICAgICBQVFIgZGF0YSwKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYmZkX2VsZl9kMzB2X3JlbG9jXzIxIFBBUkFNUyAoKAotICAgICBiZmQgKmFiZmQsCi0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICBhc3ltYm9sICpzeW1ib2wsCi0gICAgIFBUUiBkYXRhLAotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUl9EMzBWX05PTkUgPSAwLAotICBSX0QzMFZfNiwKLSAgUl9EMzBWXzlfUENSRUwsCi0gIFJfRDMwVl85X1BDUkVMX1IsCi0gIFJfRDMwVl8xNSwKLSAgUl9EMzBWXzE1X1BDUkVMLAotICBSX0QzMFZfMTVfUENSRUxfUiwKLSAgUl9EMzBWXzIxLAotICBSX0QzMFZfMjFfUENSRUwsCi0gIFJfRDMwVl8yMV9QQ1JFTF9SLAotICBSX0QzMFZfMzIsCi0gIFJfRDMwVl8zMl9QQ1JFTCwKLSAgUl9EMzBWXzMyX05PUk1BTCwKLSAgUl9EMzBWX21heAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2QzMHZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfRDMwVl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl85X1BDUkVMLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzlfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl85X1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfOV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNSwJCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTCwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMTVfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMjEgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzIxLAkJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyMSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAzICovCi0gIEhPV1RPIChSX0QzMFZfMjFfUENSRUwsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIxIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMsIGluIHRoZSBSaWdodCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDMwVl8yMV9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8yMV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIEQzMFYgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAzMiBiaXQgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMzBWXzMyX1BDUkVMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8zMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWd1bGFyIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfMzJfTk9STUFMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMzJfTk9STUFMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLSNkZWZpbmUgTUlOMzIgKGxvbmcgbG9uZykweGZmZmZmZmZmODAwMDAwMDBMTAotI2RlZmluZSBNQVgzMiAweDdmZmZmZmZmTEwKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2VsZl9kMzB2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgbG9uZyBsb25nIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW4xLCBpbjIsIG51bTsKLSAgYmZkX3ZtYSB0bXBfYWRkciA9IDA7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgaW50IG1ha2VfYWJzb2x1dGUgPSAwOwotCi0gIHIgPSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotICBpZiAociAhPSBiZmRfcmVsb2NfY29udGludWUpCi0gICAgcmV0dXJuIHI7IAotCi0gIC8qIGEgaGFja2VkLXVwIHZlcnNpb24gb2YgYmZkX3BlcmZvcm1fcmVsb2MoKSBmb2xsb3dzICovCi0gaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0KLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIHRtcF9hZGRyID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgCi0JKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICAgIHJlbG9jYXRpb24gLT0gdG1wX2FkZHI7Ci0gICAgfQotICAKLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGZsYWc7Ci0gICAgfQotICBlbHNlCi0gICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0gIAotICBpbjEgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBpbjIgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIgKyA0KTsKLQotICAvKiBleHRyYWN0IHRoZSBhZGRlbmQgKi8KLSAgbnVtID0gKChpbjIgJiAweDNGRkZGKQotCSB8ICgoaW4yICYgMHhGRjAwMDAwKSA+PiAyKQotCSB8ICgoaW4xICYgMHgzRikgPDwgMjYpKTsKLSAgaW4xICY9IDB4RkZGRkZGQzA7Ci0gIGluMiA9IDB4ODAwMDAwMDA7Ci0gIAotICByZWxvY2F0aW9uICs9IG51bTsKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUgJiYgaG93dG8tPmJpdHNpemUgPT0gMzIpCi0gICAgewotICAgICAgLyogdGhlIEQzMFYgaGFzIGEgUEMgdGhhdCBkb2Vzbid0IHdyYXAgYW5kIFBDLXJlbGF0aXZlIGp1bXBzICovCi0gICAgICAvKiBhcmUgc2lnbmVkLCBzbyBhIFBDLXJlbGF0aXZlIGp1bXAgY2FuJ3RiZSBtb3JlIHRoYW4gKy8tIDJeMzEgYnlydGVzICovCi0gICAgICAvKiBpZiBvbmUgZXhjZWVkcyB0aGlzLCBjaGFuZ2UgaXQgdG8gYW4gYWJzb2x1dGUganVtcCAqLwotICAgICAgaWYgKHJlbG9jYXRpb24gPiBNQVgzMikKLQl7Ci0JICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gKyB0bXBfYWRkcikgJiAweGZmZmZmZmZmOwotCSAgbWFrZV9hYnNvbHV0ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAocmVsb2NhdGlvbiA8IE1JTjMyKQotCXsKLQkgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiArIHRtcF9hZGRyKSAmIDB4ZmZmZmZmZmY7Ci0JICBtYWtlX2Fic29sdXRlID0gMTsKLQl9Ci0gICAgfQotICAKLSAgaW4xIHw9IChyZWxvY2F0aW9uID4+IDI2KSAmIDB4M0Y7CS8qIHRvcCA2IGJpdHMgKi8KLSAgaW4yIHw9ICgocmVsb2NhdGlvbiAmIDB4MDNGQzAwMDApIDw8IDIpOyAgLyogbmV4dCA4IGJpdHMgKi8gCi0gIGluMiB8PSByZWxvY2F0aW9uICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCi0gIAotICAvKiBjaGFuZ2UgYSBQQy1yZWxhdGl2ZSBpbnN0cnVjdGlvbiB0byBpdHMgYWJzb2x1dGUgZXF1aXZhbGVudCAqLwotICAvKiB3aXRoIHRoaXMgc2ltcGxlIGhhY2sgKi8KLSAgaWYgKG1ha2VfYWJzb2x1dGUpCi0gICAgaW4xIHw9IDB4MDAxMDAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW4xLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbjIsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkciArIDQpOwotICAKLSAgcmV0dXJuIGZsYWc7Ci19ICAgCi0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2VsZl9kMzB2X3JlbG9jXzIxIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfdm1hIGluMSwgbnVtOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gIGludCBtYXNrLCBtYXg7Ci0KLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsgCi0KLSAgLyogYSBoYWNrZWQtdXAgdmVyc2lvbiBvZiBiZmRfcGVyZm9ybV9yZWxvYygpIGZvbGxvd3MgKi8KLSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotICBpZiAob3V0cHV0X2JmZCkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUpCi0JcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGZsYWc7Ci0gICAgfQotICBlbHNlCi0gICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0gIAotICBpbjEgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIG1hc2sgPSAgKDEgPDwgaG93dG8tPmJpdHNpemUpIC0gMTsKLSAgaWYgKGhvd3RvLT5iaXRzaXplID09IDYpCi0gICAgbWFzayA8PD0gMTI7Ci0gIG1heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSArIDIpKSAtIDE7Ci0KLSAgLyogZXh0cmFjdCB0aGUgYWRkZW5kICovCi0gIG51bSA9IGluMSAmIG1hc2s7ICAvKiAxOCBiaXRzICovCi0gIGlmIChob3d0by0+Yml0c2l6ZSA9PSA2KQotICAgIG51bSA+Pj0gMTI7Ci0gIG51bSA8PD0gMzsgLyogc2hpZnQgbGVmdCAzICovCi0gIGluMSAmPSB+bWFzazsgIC8qIG1hc2sgb3V0IGFkZGVuZCAqLwotCi0gIHJlbG9jYXRpb24gKz0gbnVtOwotICBpZiAoaG93dG8tPnR5cGUgPT0gUl9EMzBWXzIxX1BDUkVMX1IgfHwgaG93dG8tPnR5cGUgPT0gUl9EMzBWXzE1X1BDUkVMX1IgfHwKLSAgICAgIGhvd3RvLT50eXBlID09IFJfRDMwVl85X1BDUkVMX1IgKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gKz0gNDsKLSAgICB9Ci0KLSAgaWYgKChpbnQpcmVsb2NhdGlvbiA8IDAgKQotICAgIHsKLSAgICAgIGlmICh+KGludClyZWxvY2F0aW9uID4gbWF4KQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChpbnQpcmVsb2NhdGlvbiA+IG1heCkKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgIH0KLSAgcmVsb2NhdGlvbiA+Pj0gMzsgCi0gIGlmIChob3d0by0+Yml0c2l6ZSA9PSA2KQotICAgIGluMSB8PSAoKHJlbG9jYXRpb24gJiAobWFzayA+PiAxMikpIDw8IDEyKTsKLSAgZWxzZQotICAgIGluMSB8PSByZWxvY2F0aW9uICYgbWFzazsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBpbjEsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIAotICByZXR1cm4gZmxhZzsKLX0gICAKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBEMzBWIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBkMzB2X3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGQzMHZfcmVsb2NfbWFwIGQzMHZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0QzMFZfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl82LCBSX0QzMFZfNiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsIFJfRDMwVl85X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SLCBSX0QzMFZfOV9QQ1JFTF9SIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMTUsIFJfRDMwVl8xNSB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMLCBSX0QzMFZfMTVfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLCBSX0QzMFZfMTVfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzIxLCBSX0QzMFZfMjEgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCwgUl9EMzBWXzIxX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUiwgUl9EMzBWXzIxX1BDUkVMX1IgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8zMiwgUl9EMzBWXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwsIFJfRDMwVl8zMl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9EMzBWXzMyX05PUk1BTCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKGQzMHZfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGQzMHZfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGQzMHZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9kMzB2X2hvd3RvX3RhYmxlW2QzMHZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMzBWIEVMRiByZWxvYyAodHlwZSBSRUwpLiAgKi8KLQotc3RhdGljIHZvaWQKLWQzMHZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMzBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QzMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMzBWIEVMRiByZWxvYyAodHlwZSBSRUxBKS4gICovCi0KLXN0YXRpYyB2b2lkCi1kMzB2X2luZm9fdG9faG93dG9fcmVsYSAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMzBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QzMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfZDMwdgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19EMzBWCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX2QzMHZfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWQzMHYiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCWQzMHZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJMAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCTAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWZyMzAuYyBiL2JmZC9lbGYzMi1mcjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjk1ZDMuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWZyMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDgxNSArMCwwIEBACi0vKiBGUjMwLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZnIzMC5oIgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZyMzBfZWxmX2kyMF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZnIzMF9lbGZfaTMyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBmcjMwX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIGZyMzBfaW5mb190b19ob3d0b19yZWxhIAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gZnIzMF9lbGZfZ2Nfc3dlZXBfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGFzZWN0aW9uICogZnIzMF9lbGZfZ2NfbWFya19ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZnIzMF9lbGZfaG93dG9fdGFibGUgW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX0ZSMzBfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzgiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIwIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF8yMCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGZyMzBfZWxmX2kyMF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzIwIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBpbnRvIDQ4IGJpdHMgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfNDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBmcjMwX2VsZl9pMzJfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF80OCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF82X0lOXzQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzZfSU5fNCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBBbiA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF84X0lOXzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzhfSU5fOCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwZmYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBBIDkgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzlfSU5fOCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDksCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOV9JTl84IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEEgMTAgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzEwX0lOXzgsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzEwX0lOXzgiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgOSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAxLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF85X1BDUkVMLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA5LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzlfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIFBDIHJlbGF0aXZlIDEyIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDEuICAqLwotICBIT1dUTyAoUl9GUjMwXzEyX1BDUkVMLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF8xMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9GUjMwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0ZSMzBfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0ZSMzBfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0ZSMzBfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotIAotfTsKLQwKLS8qIFV0aWxpdHkgdG8gYWN0dWFsbHkgcGVyZm9ybSBhbiBSX0ZSMzBfMjAgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2VsZl9pMjBfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiAgc3ltYm9sOwotICAgICBQVFIgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSAgICAgICByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHg7Ci0gIAotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPQotICAgIHN5bWJvbC0+dmFsdWUKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY2F0aW9uID4gKCgxVSA8PCAyMCkgLSAxKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICB4ID0gKHggJiAweGZmMGYwMDAwKSB8IChyZWxvY2F0aW9uICYgMHgwMDAwZmZmZikgfCAoKHJlbG9jYXRpb24gJiAweDAwMGYwMDAwKSA8PCA0KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKiBVdGlsaXR5IHRvIGFjdHVhbGx5IHBlcmZvcm0gYSBSX0ZSMzBfNDggcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2VsZl9pMzJfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiAgc3ltYm9sOwotICAgICBQVFIgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSAgICAgICByZWxvY2F0aW9uOwotCi0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgcmVsb2NhdGlvbiA9Ci0gICAgc3ltYm9sLT52YWx1ZQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2NhdGlvbiwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgMik7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQwKLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gRlIzMCBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZnIzMF9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGludCBmcjMwX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZnIzMF9yZWxvY19tYXAgZnIzMF9yZWxvY19tYXAgW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCAgICAgICAgICAgUl9GUjMwX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfOCwgICAgICAgICAgICAgIFJfRlIzMF84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfMjAsICAgICAgICBSX0ZSMzBfMjAgfSwKLSAgeyBCRkRfUkVMT0NfMzIsICAgICAgICAgICAgIFJfRlIzMF8zMiB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzQ4LCAgICAgICAgUl9GUjMwXzQ4IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfNl9JTl80LCAgICBSX0ZSMzBfNl9JTl80IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfOF9JTl84LCAgICBSX0ZSMzBfOF9JTl84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfOV9JTl84LCAgICBSX0ZSMzBfOV9JTl84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOCwgICBSX0ZSMzBfMTBfSU5fOCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzlfUENSRUwsICAgUl9GUjMwXzlfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCwgIFJfRlIzMF8xMl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9GUjMwX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCAgIFJfRlIzMF9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZnIzMF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gc2l6ZW9mIChmcjMwX3JlbG9jX21hcCkgLyBzaXplb2YgKGZyMzBfcmVsb2NfbWFwWzBdKTsKLSAgICAgICAtLWk7KQotICAgIGlmIChmcjMwX3JlbG9jX21hcCBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotICAgICAgcmV0dXJuICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW2ZyMzBfcmVsb2NfbWFwW2ldLmZyMzBfcmVsb2NfdmFsXTsKLSAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEZSMzAgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyMzBfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICogZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0ZSMzBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW3JfdHlwZV07Ci19Ci0MCi0vKiBQZXJmb3JtIGEgc2luZ2xlIHJlbG9jYXRpb24uICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgc3RhbmRhcmQgQkZECi0gICByb3V0aW5lcywgYnV0IGEgZmV3IHJlbG9jcywgd2UgaGF2ZSB0byBkbyB0aGVtIG91cnNlbHZlcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICBob3d0bzsKLSAgICAgYmZkICogICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWw7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgICAgICAgICAgICAgICB4OwotICBiZmRfc2lnbmVkX3ZtYQlzcmVsOwotICAKLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0ZSMzBfMjA6Ci0gICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0KLSAgICAgIGlmIChyZWxvY2F0aW9uID4gKCgxIDw8IDIwKSAtIDEpKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZmYwZjAwMDApIHwgKHJlbG9jYXRpb24gJiAweDAwMDBmZmZmKSB8ICgocmVsb2NhdGlvbiAmIDB4MDAwZjAwMDApIDw8IDQpOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9GUjMwXzQ4OgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMjsKLSAgICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF85X1BDUkVMOgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMTsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7ICAvKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zIGFkZCAyIHRvIHRoZSBQQy4uLiAqLwotICAgICAgc3JlbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICAKLSAgICAgIGlmIChzcmVsICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICBpZiAoc3JlbCA+ICgoMSA8PCA4KSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCA4KSkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHNyZWwgPj4gMSwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF8xMl9QQ1JFTDoKLSAgICAgIGNvbnRlbnRzICAgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7IC8qIEJyYW5jaCBpbnN0cnVjdGlvbnMgYWRkIDIgdG8gdGhlIFBDLi4uICovCi0gICAgICBzcmVsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJICAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIGlmIChzcmVsID4gKCgxIDw8IDExKSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCAxMSkpKQotCSAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmODAwKSB8ICgoc3JlbCA+PiAxKSAmIDB4N2ZmKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotICAgIH0KLQotICByZXR1cm4gcjsKLX0KLQotDAotLyogUmVsb2NhdGUgYW4gRlIzMCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZQotICAgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1mcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICBpbmZvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgcmVsZW5kICAgICA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCArKykKLSAgICB7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIHI7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByX3R5cGU7Ci0gICAgICAKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAoICAgcl90eXBlID09IFJfRlIzMF9HTlVfVlRJTkhFUklUCi0JICB8fCByX3R5cGUgPT0gUl9GUjMwX0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0gICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnMgW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGhvd3RvICA9IGZyMzBfZWxmX2hvd3RvX3RhYmxlICsgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBoICAgICAgPSBOVUxMOwotICAgICAgc3ltICAgID0gTlVMTDsKLSAgICAgIHNlYyAgICA9IE5VTEw7Ci0gICAgICAKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnMgW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQkgIAotCSAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKTsKLQkgIG5hbWUgPSAobmFtZSA9PSBOVUxMKSA/IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKSA6IG5hbWU7Ci0jaWYgMAotCSAgZnByaW50ZiAoc3RkZXJyLCAibG9jYWw6IHNlYzogJXMsIHN5bTogJXMgKCVkKSwgdmFsdWU6ICV4ICsgJXggKyAleCBhZGRlbmQgJXhcbiIsCi0JCSAgIHNlYy0+bmFtZSwgbmFtZSwgc3ltLT5zdF9uYW1lLAotCQkgICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEsIHNlYy0+b3V0cHV0X29mZnNldCwKLQkJICAgc3ltLT5zdF92YWx1ZSwgcmVsLT5yX2FkZGVuZCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0JICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIAotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotI2lmIDAKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICAiZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXMsIHZhbHVlOiAleCArICV4ICsgJXggZ2l2ZXM6ICV4XG4iLAotCQkgICAgICAgc2VjLT5uYW1lLCBuYW1lLCBoLT5yb290LnUuZGVmLnZhbHVlLAotCQkgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsIHJlbG9jYXRpb24pOwotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgewotI2lmIDAKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJ1bmRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzXG4iLAotCQkgICAgICAgc2VjLT5uYW1lLCBuYW1lKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0jaWYgMAotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInVua25vd246IG5hbWU6ICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICByID0gZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbik7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgTlVMTDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93Ci0JCShpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbAotCQkoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LAotCQkgdHJ1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG1zZykKLQkgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+d2FybmluZwotCSAgICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0KLQkgIGlmICghIHIpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWZyMzBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9GUjMwX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX0ZSMzBfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1mcjMwX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgIHNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotZnIzMF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9GUjMwX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0ZSMzBfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotIAotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2ZyMzAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfRlIzMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgIGJmZF9lbGYzMl9mcjMwX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1mcjMwIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCU5VTEwKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQlmcjMwX2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJZnIzMF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCWZyMzBfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgICAgIGZyMzBfZWxmX2NoZWNrX3JlbG9jcwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkJMQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCWZyMzBfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWdlbi5jIGIvYmZkL2VsZjMyLWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2RhNTNiLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1nZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIEdlbmVyaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTUsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgc2hvdWxkIGJlCi0gICBnb29kIGVub3VnaCBmb3IgR0RCIG9yIG9iamR1bXAgdG8gcmVhZCB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGR1bW15ID0KLSAgSE9XVE8gKDAsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVU5LTk9XTiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZWxmX3JlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZWxmX3JlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmMzItbGl0dGxlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJImVsZjMyLWJpZyIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF91bmtub3duCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX05PTkUKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQllbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaHBwYS5jIGIvYmZkL2VsZjMyLWhwcGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzYTMwOC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaHBwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyOSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQIFBBLVJJU0MgRUxGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5Ci0KLQlDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLQlEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UKLQlVbml2ZXJzaXR5IG9mIFV0YWgKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9ocHBhLmgiCi0jaW5jbHVkZSAibGliaHBwYS5oIgotI2luY2x1ZGUgImVsZjMyLWhwcGEuaCIKLSNkZWZpbmUgQVJDSF9TSVpFCQkzMgotI2luY2x1ZGUgImVsZi1ocHBhLmgiCi0KLQotLyogV2UgdXNlIHRocmVlIGRpZmZlcmVudCBoYXNoIHRhYmxlcyB0byBob2xkIGluZm9ybWF0aW9uIGZvcgotICAgbGlua2luZyBQQSBFTEYgb2JqZWN0cy4KLQotICAgVGhlIGZpcnN0IGlzIHRoZSBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSB3aGljaCBpcyBkZXJpdmVkCi0gICBmcm9tIHRoZSBzdGFuZGFyZCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICBXZSB1c2UgdGhpcyBhcyBhIHBsYWNlIHRvCi0gICBhdHRhY2ggb3RoZXIgaGFzaCB0YWJsZXMgYW5kIHN0YXRpYyBpbmZvcm1hdGlvbi4KLQotICAgVGhlIHNlY29uZCBpcyB0aGUgc3R1YiBoYXNoIHRhYmxlIHdoaWNoIGlzIGRlcml2ZWQgZnJvbSB0aGUKLSAgIGJhc2UgQkZEIGhhc2ggdGFibGUuICBUaGUgc3R1YiBoYXNoIHRhYmxlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbgotICAgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBsaW5rZXIgc3R1YnMgZHVyaW5nIGEgbGluay4gICovCi0KLS8qIEhhc2ggdGFibGUgZm9yIGxpbmtlciBzdHVicy4gICovCi0KLXN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeQotewotICAvKiBCYXNlIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCB3ZSBjYW4gZ2V0IHRoZSBuYW1lIG9mIHRoZSBzdHViCi0gICAgIChhbmQgdGh1cyBrbm93IGV4YWN0bHkgd2hhdCBhY3Rpb25zIGl0IHBlcmZvcm1zKSBmcm9tIHRoZSBiYXNlCi0gICAgIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBPZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGlzIHN0dWIuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLQotICAvKiBHaXZlbiB0aGUgc3ltYm9sJ3MgdmFsdWUgYW5kIGl0cyBzZWN0aW9uIHdlIGNhbiBkZXRlcm1pbmUgaXRzIGZpbmFsCi0gICAgIHZhbHVlIHdoZW4gYnVpbGRpbmcgdGhlIHN0dWJzIChzbyB0aGUgc3R1YiBrbm93cyB3aGVyZSB0byBqdW1wLiAgKi8KLSAgc3ltdmFsdWUgdGFyZ2V0X3ZhbHVlOwotICBhc2VjdGlvbiAqdGFyZ2V0X3NlY3Rpb247Ci19OwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogVGhlIHN0dWIgQkZELiAgKi8KLSAgYmZkICpzdHViX2JmZDsKLQotICAvKiBXaGVyZSB0byBwbGFjZSB0aGUgbmV4dCBzdHViLiAgKi8KLSAgYmZkX2J5dGUgKmxvY2F0aW9uOwotCi0gIC8qIEN1cnJlbnQgb2Zmc2V0IGluIHRoZSBzdHViIHNlY3Rpb24uICAqLwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCi19OwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLX07Ci0KLXN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICpzdHViX2hhc2hfdGFibGU7Ci0KLSAgLyogQSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIG91dHB1dCBzeW1ib2xzLiAgKi8KLSAgdW5zaWduZWQgaW50IG91dHB1dF9zeW1ib2xfY291bnQ7Ci0KLSAgLyogU3R1ZmYgc28gd2UgY2FuIGhhbmRsZSBEUCByZWxhdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGxvbmcgZ2xvYmFsX3ZhbHVlOwotICBpbnQgZ2xvYmFsX3N5bV9kZWZpbmVkOwotfTsKLQotLyogRUxGMzIvSFBQQSByZWxvY2F0aW9uIHN1cHBvcnQKLQotCVRoaXMgZmlsZSBjb250YWlucyBFTEYzMi9IUFBBIHJlbG9jYXRpb24gc3VwcG9ydCBhcyBzcGVjaWZpZWQKLQlpbiB0aGUgU3RyYXR1cyBGVFgvR29sZiBPYmplY3QgRmlsZSBGb3JtYXQgKFNFRC0xNzYyKSBkYXRlZAotCUZlYnJ1YXJ5IDE5OTQuICAqLwotCi0jaW5jbHVkZSAiZWxmMzItaHBwYS5oIgotI2luY2x1ZGUgImhwcGFfc3R1YnMuaCIKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBwYV9lbGZfcmVsb2NhdGVfaW5zbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgbG9uZywKLQkgICBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBhc2VjdGlvbiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX2J1aWxkX29uZV9zdHViIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBlbGYzMl9ocHBhX3NpemVfb2Zfc3R1YgotICBQQVJBTVMgKChiZmRfdm1hLCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQgZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIKLSAgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX3ZtYSwgY2hhciAqKSk7Ci0KLS8qIEZvciBsaW5rZXIgc3R1YiBoYXNoIHRhYmxlcy4gICovCi0jZGVmaW5lIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0jZGVmaW5lIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKSBcCi0gIChiZmRfaGFzaF90cmF2ZXJzZSBcCi0gICAoJih0YWJsZSktPnJvb3QsIFwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksIFwKLSAgICAoaW5mbykpKQotCi0vKiBGb3IgSFBQQSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KVwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfZW50cnkgKikJCQkJXAotICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIFBBIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLQotLyogQXNzb3J0ZWQgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICAqLwotCi0vKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+b2Zmc2V0ID0gMDsKLSAgICAgIHJldC0+dGFyZ2V0X3ZhbHVlID0gMDsKLSAgICAgIHJldC0+dGFyZ2V0X3NlY3Rpb24gPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBzdHViIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIHN0dWJfYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKnN0dWJfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+b2Zmc2V0ID0gMDsKLSAgdGFibGUtPmxvY2F0aW9uID0gMDsKLSAgdGFibGUtPnN0dWJfYmZkID0gc3R1Yl9iZmQ7Ci0gIHJldHVybiAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBuZXdmdW5jKSk7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgZGVyaXZlZCBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoZSBQQSBFTEYgcG9ydCB1c2VzIHRoZSBkZXJpdmVkCi0gICBoYXNoIHRhYmxlIHRvIGtlZXAgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIFBBIEVMRiBsaW5rZXIgKHdpdGhvdXQKLSAgIHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMpLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXQtPnN0dWJfaGFzaF90YWJsZSA9IE5VTEw7Ci0gIHJldC0+b3V0cHV0X3N5bWJvbF9jb3VudCA9IDA7Ci0gIHJldC0+Z2xvYmFsX3ZhbHVlID0gMDsKLSAgcmV0LT5nbG9iYWxfc3ltX2RlZmluZWQgPSAwOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIFJlbG9jYXRlIHRoZSBnaXZlbiBJTlNOIGdpdmVuIHRoZSB2YXJpb3VzIGlucHV0IHBhcmFtZXRlcnMuCi0KLSAgIEZJWE1FOiBlbmRpYW5uZXNzIGFuZCBzaXplb2YgKGxvbmcpIGlzc3VlcyBhYm91bmQgaGVyZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1ocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChhYmZkLCBpbnB1dF9zZWN0LCBpbnNuLCBhZGRyZXNzLCBzeW1fdmFsdWUsCi0JCQlyX2FkZGVuZCwgcl9mb3JtYXQsIHJfZmllbGQsIHBjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0OwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLSAgICAgbG9uZyBzeW1fdmFsdWU7Ci0gICAgIGxvbmcgcl9hZGRlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9maWVsZDsKLSAgICAgdW5zaWduZWQgbG9uZyBwY3JlbDsKLXsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGUgPSBnZXRfb3Bjb2RlIChpbnNuKTsKLSAgbG9uZyBjb25zdGFudF92YWx1ZTsKLQotICBzd2l0Y2ggKG9wY29kZSkKLSAgICB7Ci0gICAgY2FzZSBMRE86Ci0gICAgY2FzZSBMREI6Ci0gICAgY2FzZSBMREg6Ci0gICAgY2FzZSBMRFc6Ci0gICAgY2FzZSBMRFdNOgotICAgIGNhc2UgU1RCOgotICAgIGNhc2UgU1RIOgotICAgIGNhc2UgU1RXOgotICAgIGNhc2UgU1RXTToKLSAgICBjYXNlIENPTUlDTFI6Ci0gICAgY2FzZSBTVUJJOgotICAgIGNhc2UgQURESVQ6Ci0gICAgY2FzZSBBRERJOgotICAgIGNhc2UgTERJTDoKLSAgICBjYXNlIEFERElMOgotICAgICAgY29uc3RhbnRfdmFsdWUgPSBIUFBBX1JfQ09OU1RBTlQgKHJfYWRkZW5kKTsKLQotICAgICAgaWYgKHBjcmVsKQotCXN5bV92YWx1ZSAtPSBhZGRyZXNzOwotCi0gICAgICBzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCk7Ci0gICAgICByZXR1cm4gaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHN5bV92YWx1ZSwgcl9mb3JtYXQpOwotCi0gICAgY2FzZSBCTDoKLSAgICBjYXNlIEJFOgotICAgIGNhc2UgQkxFOgotICAgICAgLyogWFhYIGNvbXB1dGluZyBjb25zdGFudF92YWx1ZSBpcyBub3QgbmVlZGVkPz8/ICovCi0gICAgICBjb25zdGFudF92YWx1ZSA9IGFzc2VtYmxlXzE3ICgoaW5zbiAmIDB4MDAxZjAwMDApID4+IDE2LAotCQkJCSAgICAoaW5zbiAmIDB4MDAwMDFmZmMpID4+IDIsCi0JCQkJICAgIGluc24gJiAxKTsKLQotICAgICAgY29uc3RhbnRfdmFsdWUgPSAoY29uc3RhbnRfdmFsdWUgPDwgMTUpID4+IDE1OwotICAgICAgaWYgKHBjcmVsKQotCXsKLQkgIHN5bV92YWx1ZSAtPQotCSAgICBhZGRyZXNzICsgaW5wdXRfc2VjdC0+b3V0cHV0X29mZnNldAotCSAgICArIGlucHV0X3NlY3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAtOCwgcl9maWVsZCk7Ci0JfQotICAgICAgZWxzZQotCXN5bV92YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIGNvbnN0YW50X3ZhbHVlLCByX2ZpZWxkKTsKLQotICAgICAgcmV0dXJuIGhwcGFfcmVidWlsZF9pbnNuIChhYmZkLCBpbnNuLCBzeW1fdmFsdWUgPj4gMiwgcl9mb3JtYXQpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChvcGNvZGUgPT0gMCkKLQl7Ci0JICBjb25zdGFudF92YWx1ZSA9IEhQUEFfUl9DT05TVEFOVCAocl9hZGRlbmQpOwotCi0JICBpZiAocGNyZWwpCi0JICAgIHN5bV92YWx1ZSAtPSBhZGRyZXNzOwotCi0JICByZXR1cm4gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIEhQUEEgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmX2hwcGFfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzeW1fc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc3ltX3NlYy0+b3V0cHV0X29mZnNldDsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHN5bV9zZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgPyAwIDogc3ltLT5zdF92YWx1ZSkKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGluZHg7Ci0KLQkgIGluZHggPSByX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHN5bV9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQlzeW1fbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBlbHNlCi0JewotCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJICAgICAgc3ltLT5zdF9uYW1lKTsKLQkgIGlmIChzeW1fbmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoKnN5bV9uYW1lID09ICdcMCcpCi0JICAgIHN5bV9uYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzeW1fc2VjKTsKLQl9Ci0KLSAgICAgIHIgPSBlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJICAgICAgcmVsLT5yX29mZnNldCwgcmVsb2NhdGlvbiwKLQkJCQkJICAgICAgcmVsLT5yX2FkZGVuZCwgaW5mbywgc3ltX3NlYywKLQkJCQkJICAgICAgc3ltX25hbWUsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBEUCByZWxhdGl2ZSByZWxvY3MgaWYgJGdsb2JhbCQgaXMKLQkgICAgICAgdW5kZWZpbmVkLiAgVGhpcyBpcyBhIHBhbmljIHNpdHVhdGlvbiBzbyB3ZSBkb24ndCB0cnkKLQkgICAgICAgdG8gY29udGludWUuICAqLwotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCAiJGdsb2JhbCQiLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgewotCQkvKiBXZSB1c2UgdGhpcyByZXR1cm4gdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBwZXJmb3JtZWQKLQkJICAgYSAiZGFuZ2Vyb3VzIiByZWxvY2F0aW9uLiAgVGhpcyBkb2Vzbid0IG1lYW4gd2UgZGlkCi0JCSAgIHRoZSB3cm9uZyB0aGluZywgaXQganVzdCBtZWFucyB0aGVyZSBtYXkgYmUgc29tZSBjbGVhbnVwCi0JCSAgIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBoZXJlLgotCi0JCSAgIEluIHBhcnRpY3VsYXIgd2UgaGFkIHRvIHN3YXAgdGhlIGxhc3QgY2FsbCBpbnNuIGFuZCBpdHMKLQkJICAgZGVsYXkgc2xvdC4gIElmIHRoZSBkZWxheSBzbG90IGluc24gbmVlZGVkIGEgcmVsb2NhdGlvbiwKLQkJICAgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkanVzdCB0aGUgbmV4dCByZWxvY2F0aW9uIGVudHJ5J3MKLQkJICAgb2Zmc2V0IHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgdGhlIGluc24gbW92ZWQuCi0KLQkJICAgVGhpcyBoYWlyIHdvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZiB3ZSBpbnNlcnRlZCBzdHVicwotCQkgICBiZXR3ZWVuIHByb2NlZHVyZXMgYW5kIHVzZWQgYSAiYmwiIHRvIGdldCB0byB0aGUgc3R1Yi4gICovCi0JCWlmIChyZWwgIT0gcmVsZW5kKQotCQkgIHsKLQkJICAgIEVsZl9JbnRlcm5hbF9SZWxhICpuZXh0X3JlbCA9IHJlbCArIDE7Ci0KLQkJICAgIGlmIChyZWwtPnJfb2Zmc2V0ICsgNCA9PSBuZXh0X3JlbC0+cl9vZmZzZXQpCi0JCSAgICAgIG5leHRfcmVsLT5yX29mZnNldCAtPSA0OwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgKGluZm8sIHN5bV9uYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWN0dWFsbHkgcGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICBUaGlzIGNhbiBnZXQKLSAgIHJhdGhlciBoYWlyeSB3aGVuIGxpbmtlciBzdHVicyBhcmUgbmVlZGVkLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgdmFsdWUsCi0JCQkJICAgIGFkZGVuZCwgaW5mbywgc3ltX3NlYywgc3ltX25hbWUsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0gICAgIGludCBpc19sb2NhbDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICB1bnNpZ25lZCBsb25nIHJfZm9ybWF0ID0gaG93dG8tPmJpdHNpemU7Ci0gIHVuc2lnbmVkIGxvbmcgcl9maWVsZCA9IGVfZnNlbDsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0gIGJvb2xlYW4gcl9wY3JlbCA9IGhvd3RvLT5wY19yZWxhdGl2ZTsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWx1ZSBmb3IgJGdsb2JhbCQuICBGSVhNRSBpc24ndCB0aGlzIGVmZmVjdGl2ZWx5Ci0gICAgIGp1c3QgbGlrZSB0aGUgZ3AgcG9pbnRlciBvbiBNSVBTPyAgQ2FuIHdlIHVzZSB0aG9zZSByb3V0aW5lcyBmb3IgdGhpcwotICAgICBwdXJwb3NlPyAgKi8KLSAgaWYgKCFlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfc3ltX2RlZmluZWQpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgIiRnbG9iYWwkIiwgZmFsc2UsCi0JCQkJIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzbid0IGEgJGdsb2JhbCQsIHRoZW4gd2UncmUgaW4gZGVlcCB0cm91YmxlLiAgKi8KLSAgICAgIGlmIChoID09IE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICAgIC8qIElmICRnbG9iYWwkIGlzbid0IGEgZGVmaW5lZCBzeW1ib2wsIHRoZW4gd2UncmUgc3RpbGwgaW4gZGVlcAotCSB0cm91YmxlLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCXJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWUgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3N5bV9kZWZpbmVkID0gMTsKLSAgICB9Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9QQVJJU0NfTk9ORToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1BBUklTQ19ESVIzMjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdDOgotICAgICAgcl9maWVsZCA9IGVfZnNlbDsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgIGNhc2UgUl9QQVJJU0NfRElSMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwyMUw6Ci0gICAgICByX2ZpZWxkID0gZV9scnNlbDsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0UjoKLSAgICAgIHJfZmllbGQgPSBlX3Jyc2VsOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0KLSAgICAvKiBGb3IgYWxsIHRoZSBEUCByZWxhdGl2ZSByZWxvY2F0aW9ucywgd2UgbmVlZCB0byBleGFtaW5lIHRoZSBzeW1ib2wncwotICAgICAgIHNlY3Rpb24uICBJZiBpdCdzIGEgY29kZSBzZWN0aW9uLCB0aGVuICJkYXRhIHBvaW50ZXIgcmVsYXRpdmUiIG1ha2VzCi0gICAgICAgbm8gc2Vuc2UuICBJbiB0aGF0IGNhc2Ugd2UgZG9uJ3QgYWRqdXN0IHRoZSAidmFsdWUiLCBhbmQgZm9yIDIxIGJpdAotICAgICAgIGFkZGlsIGluc3RydWN0aW9ucywgd2UgY2hhbmdlIHRoZSBzb3VyY2UgYWRkZW5kIHJlZ2lzdGVyIGZyb20gJWRwIHRvCi0gICAgICAgJXIwLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMjFMOgotICAgICAgcl9maWVsZCA9IGVfbHJzZWw7Ci0gICAgICBpZiAoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQl7Ci0JICBpZiAoKGluc24gJiAweGZjMDAwMDAwKSA+PiAyNiA9PSAweGEKLQkgICAgICAgJiYgKGluc24gJiAweDAzZTAwMDAwKSA+PiAyMSA9PSAweDFiKQotCSAgICBpbnNuICY9IH4weDAzZTAwMDAwOwotCX0KLSAgICAgIGVsc2UKLQl2YWx1ZSAtPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWU7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRSOgotICAgICAgcl9maWVsZCA9IGVfcnJzZWw7Ci0gICAgICBpZiAoKHN5bV9zZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0JdmFsdWUgLT0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0RjoKLSAgICAgIHJfZmllbGQgPSBlX2ZzZWw7Ci0gICAgICBpZiAoKHN5bV9zZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0JdmFsdWUgLT0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0KLSAgICAvKiBUaGVzZSBjYXNlcyBhcmUgc2VwYXJhdGUgYXMgdGhleSBtYXkgaW52b2x2ZSBhIGxvdCBtb3JlIHdvcmsKLSAgICAgICB0byBkZWFsIHdpdGggbGlua2VyIHN0dWJzLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX1BMQUJFTDMyOgotICAgIGNhc2UgUl9QQVJJU0NfUExBQkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfUExBQkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN0Y6Ci0gICAgICB7Ci0JYmZkX3ZtYSBsb2NhdGlvbjsKLQl1bnNpZ25lZCBpbnQgbGVuOwotCWNoYXIgKm5ld19uYW1lLCAqc3R1Yl9uYW1lOwotCi0JLyogR2V0IHRoZSBmaWVsZCBzZWxlY3RvciByaWdodC4gIFdlJ2xsIG5lZWQgaXQgaW4gYSBtaW51dGUuICAqLwotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxN0YKLQkgICAgfHwgcl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDMyKQotCSAgcl9maWVsZCA9IGVfZnNlbDsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMjFMKQotCSAgcl9maWVsZCA9IGVfbHJzZWw7Ci0JZWxzZSBpZiAocl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDE0UikKLQkgIHJfZmllbGQgPSBlX3Jyc2VsOwotCi0JLyogRmluZCBvdXQgd2hlcmUgd2UgYXJlIGFuZCB3aGVyZSB3ZSdyZSBnb2luZy4gICovCi0JbG9jYXRpb24gPSAob2Zmc2V0ICsKLQkJICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCQkgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQlsZW4gPSBzdHJsZW4gKHN5bV9uYW1lKSArIDE7Ci0JaWYgKGlzX2xvY2FsKQotCSAgbGVuICs9IDk7Ci0JbmV3X25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOwotCWlmICghbmV3X25hbWUpCi0JICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQlzdHJjcHkgKG5ld19uYW1lLCBzeW1fbmFtZSk7Ci0KLQkvKiBMb2NhbCBzeW1ib2xzIGhhdmUgdW5pcXVlIElEcy4gICovCi0JaWYgKGlzX2xvY2FsKQotCSAgc3ByaW50ZiAobmV3X25hbWUgKyBsZW4gLSAxMCwgIl8lMDh4IiwgKGludClzeW1fc2VjKTsKLQotCS8qIEFueSBraW5kIG9mIGxpbmtlciBzdHViIG5lZWRlZD8gICovCi0JaWYgKCgoaW50KSh2YWx1ZSAtIGxvY2F0aW9uKSA+IDB4M2ZmZmYpCi0JICAgIHx8ICgoaW50KSh2YWx1ZSAtIGxvY2F0aW9uKSA8IChpbnQpMHhmZmZjMDAwMCkpCi0JICB7Ci0JICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOwotCSAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKnN0dWJfaGFzaDsKLQkgICAgYXNlY3Rpb24gKnN0dWJfc2VjdGlvbjsKLQotCSAgICAvKiBCdWlsZCBhIG5hbWUgZm9yIHRoZSBzdHViLiAgKi8KLQotCSAgICBsZW4gPSBzdHJsZW4gKG5ld19uYW1lKTsKLQkgICAgbGVuICs9IDIzOwotCSAgICBzdHViX25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOwotCSAgICBpZiAoIXN0dWJfbmFtZSkKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQkgICAgZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIgKGxvY2F0aW9uLCB2YWx1ZSwgc3R1Yl9uYW1lKTsKLQkgICAgc3RyY2F0IChzdHViX25hbWUsIG5ld19uYW1lKTsKLQkgICAgZnJlZSAobmV3X25hbWUpOwotCi0JICAgIHN0dWJfaGFzaF90YWJsZSA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPnN0dWJfaGFzaF90YWJsZTsKLQotCSAgICBzdHViX2hhc2gKLQkgICAgICA9IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCAoc3R1Yl9oYXNoX3RhYmxlLCBzdHViX25hbWUsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlKTsKLQotCSAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhhdCBuYW1lLiAgKi8KLQkgICAgZnJlZSAoc3R1Yl9uYW1lKTsKLQotCSAgICAvKiBUaGUgc3R1YiBCRkQgb25seSBoYXMgb25lIHNlY3Rpb24uICAqLwotCSAgICBzdHViX3NlY3Rpb24gPSBzdHViX2hhc2hfdGFibGUtPnN0dWJfYmZkLT5zZWN0aW9uczsKLQotCSAgICBpZiAoc3R1Yl9oYXNoICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdGKQotCQkgIHsKLQkJICAgIHVuc2lnbmVkIGxvbmcgZGVsYXlfaW5zbjsKLQkJICAgIHVuc2lnbmVkIGludCBvcGNvZGUsIHJ0bl9yZWcsIGxkb190YXJnZXRfcmVnLCBsZG9fc3JjX3JlZzsKLQotCQkgICAgLyogV2UnbGwgbmVlZCB0byBwZWVrIGF0IHRoZSBuZXh0IGluc24uICAqLwotCQkgICAgZGVsYXlfaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEgKyA0KTsKLQkJICAgIG9wY29kZSA9IGdldF9vcGNvZGUgKGRlbGF5X2luc24pOwotCi0JCSAgICAvKiBXZSBhbHNvIG5lZWQgdG8ga25vdyB0aGUgcmV0dXJuIHJlZ2lzdGVyIGZvciB0aGlzCi0JCSAgICAgICBjYWxsLiAgKi8KLQkJICAgIHJ0bl9yZWcgPSAoaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxOwotCi0JCSAgICBsZG9fc3JjX3JlZyA9IChkZWxheV9pbnNuICYgMHgwM2UwMDAwMCkgPj4gMjE7Ci0JCSAgICBsZG9fdGFyZ2V0X3JlZyA9IChkZWxheV9pbnNuICYgMHgwMDFmMDAwMCkgPj4gMTY7Ci0KLQkJICAgIC8qIE11bmdlIHVwIHRoZSB2YWx1ZSBhbmQgb3RoZXIgcGFyYW1ldGVycyBmb3IKLQkJICAgICAgIGhwcGFfZWxmX3JlbG9jYXRlX2luc24uICAqLwotCi0JCSAgICB2YWx1ZSA9IChzdHViX2hhc2gtPm9mZnNldAotCQkJICAgICArIHN0dWJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICArIHN0dWJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkJICAgIHJfZm9ybWF0ID0gMTc7Ci0JCSAgICByX2ZpZWxkID0gZV9mc2VsOwotCQkgICAgcl9wY3JlbCA9IDA7Ci0JCSAgICBhZGRlbmQgPSAwOwotCi0JCSAgICAvKiBXZSBuZWVkIHRvIHBlZWsgYXQgdGhlIGRlbGF5IGluc24gYW5kIGRldGVybWluZSBpZgotCQkgICAgICAgd2UnbGwgbmVlZCB0byBzd2FwIHRoZSBicmFuY2ggYW5kIGl0cyBkZWxheSBpbnNuLiAgKi8KLQkJICAgIGlmICgoaW5zbiAmIDIpCi0JCQl8fCAob3Bjb2RlID09IExETwotCQkJICAgICYmIGxkb190YXJnZXRfcmVnID09IHJ0bl9yZWcpCi0JCQl8fCAoZGVsYXlfaW5zbiA9PSAweDA4MDAwMjQwKSkKLQkJICAgICAgewotCQkJLyogTm8gbmVlZCB0byBzd2FwIHRoZSBicmFuY2ggYW5kIGl0cyBkZWxheSBzbG90LCBidXQKLQkJCSAgIHdlIGRvIG5lZWQgdG8gbWFrZSBzdXJlIHRvIGp1bXAgcGFzdCB0aGUgcmV0dXJuCi0JCQkgICBwb2ludGVyIHVwZGF0ZSBpbiB0aGUgc3R1Yi4gICovCi0JCQl2YWx1ZSArPSA0OwotCi0JCQkvKiBJZiB0aGUgZGVsYXkgaW5zbiBkb2VzIGEgcmV0dXJuIHBvaW50ZXIgYWRqdXN0bWVudCwKLQkJCSAgIHRoZW4gd2UgaGF2ZSB0byBtYWtlIHN1cmUgaXQgc3RheXMgdmFsaWQuICAqLwotCQkJaWYgKG9wY29kZSA9PSBMRE8KLQkJCSAgICAmJiBsZG9fdGFyZ2V0X3JlZyA9PSBydG5fcmVnKQotCQkJICB7Ci0JCQkgICAgZGVsYXlfaW5zbiAmPSAweGZjMDBmZmZmOwotCQkJICAgIGRlbGF5X2luc24gfD0gKCgzMSA8PCAyMSkgfCAoMzEgPDwgMTYpKTsKLQkJCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGRlbGF5X2luc24sIGhpdF9kYXRhICsgNCk7Ci0JCQkgIH0KLQkJCS8qIFVzZSBhIEJMRSB0byByZWFjaCB0aGUgc3R1Yi4gICovCi0JCQlpbnNuID0gQkxFX1NSNF9SMDsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkvKiBXb25kZXJmdWwsIHdlIGhhdmUgdG8gc3dhcCB0aGUgY2FsbCBpbnNuIGFuZCBpdHMKLQkJCSAgIGRlbGF5IHNsb3QuICAqLwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBkZWxheV9pbnNuLCBoaXRfZGF0YSk7Ci0JCQkvKiBVc2UgYSBCTEUsbiB0byByZWFjaCB0aGUgc3R1Yi4gICovCi0JCQlpbnNuID0gKEJMRV9TUjRfUjAgfCAweDIpOwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSArIDQpOwotCQkJaW5zbiA9IGhwcGFfZWxmX3JlbG9jYXRlX2luc24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJICAgICAgIGluc24sIG9mZnNldCArIDQsCi0JCQkJCQkgICAgICAgdmFsdWUsIGFkZGVuZCwKLQkJCQkJCSAgICAgICByX2Zvcm1hdCwgcl9maWVsZCwKLQkJCQkJCSAgICAgICByX3BjcmVsKTsKLQkJCS8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0JCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGhpdF9kYXRhICsgNCk7Ci0JCQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICAgIGVsc2UKLQkJICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQkgICAgICB9Ci0JICB9Ci0JZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgICB9Ci0KLWRvX2Jhc2ljX3R5cGVfMToKLSAgICAgIGluc24gPSBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGluc24sCi0JCQkJICAgICBvZmZzZXQsIHZhbHVlLCBhZGRlbmQsIHJfZm9ybWF0LAotCQkJCSAgICAgcl9maWVsZCwgcl9wY3JlbCk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNvbWV0aGluZyB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUuICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIHRoZSBpbnN0cnVjdGlvbiB3b3JkLiAgKi8KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gIHJldHVybiAoYmZkX3JlbG9jX29rKTsKLX0KLQotLyogVW5kbyB0aGUgZ2VuZXJpYyBFTEYgY29kZSdzIHN1YnRyYWN0aW9uIG9mIHNlY3Rpb24tPnZtYSBmcm9tIHRoZQotICAgdmFsdWUgb2YgZWFjaCBleHRlcm5hbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqbmFtZXAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gICp2YWxwICs9ICgqc2VjcCktPnZtYTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgc3R1YiBuZWVkZWQgdG8gcGVyZm9ybSBhIGNhbGwgYXNzdW1pbmcgdGhlCi0gICBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgZm9yIGNhbGxlciBhbmQgY2FsbGVlIGFyZSBpbiBDQUxMRVIgYW5kIENBTExFRQotICAgZm9yIGEgY2FsbCBmcm9tIExPQ0FUSU9OIHRvIERFU1RJTkFUSU9OLiAgQ29weSB0aGUgbmFtZSBpbnRvIFNUVUJfTkFNRS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGYzMl9ocHBhX25hbWVfb2Zfc3R1YiAobG9jYXRpb24sIGRlc3RpbmF0aW9uLCBzdHViX25hbWUpCi0gICAgIGJmZF92bWEgbG9jYXRpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBkZXN0aW5hdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpzdHViX25hbWU7Ci17Ci0gIHN0cmNweSAoc3R1Yl9uYW1lLCAiX19fX19sb25nX2JyYW5jaF9zdHViXyIpOwotfQotCi0vKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzdHViIG5lZWRlZCB0byBjYWxsIGZyb20gTE9DQVRJT04gdG8gREVTVElOQVRJT04KLSAgIChhIGZ1bmN0aW9uIG5hbWVkIFNZTV9OQU1FKSwgd2l0aCBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgQ0FMTEVSIGFuZAotICAgQ0FMTEVFLiAgUmV0dXJuIHplcm8gaWYgbm8gc3R1YiBpcyBuZWVkZWQgdG8gcGVyZm9ybSBzdWNoIGEgY2FsbC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWVsZjMyX2hwcGFfc2l6ZV9vZl9zdHViIChsb2NhdGlvbiwgZGVzdGluYXRpb24sIHN5bV9uYW1lKQotICAgICBiZmRfdm1hIGxvY2F0aW9uLCBkZXN0aW5hdGlvbjsKLSAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci17Ci0gIC8qIERldGVybWluZSBpZiBhIGxvbmcgYnJhbmNoIHN0dWIgaXMgbmVlZGVkLiAgKi8KLSAgaWYgKCEoKChpbnQpKGxvY2F0aW9uIC0gZGVzdGluYXRpb24pID4gMHgzZmZmZikKLQl8fCAoKGludCkobG9jYXRpb24gLSBkZXN0aW5hdGlvbikgPCAoaW50KTB4ZmZmYzAwMDApKSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoIXN0cm5jbXAgKCIkJCIsIHN5bV9uYW1lLCAyKQotICAgICAgJiYgc3RyY21wICgiJCRkeW5jYWxsIiwgc3ltX25hbWUpKQotICAgIHJldHVybiAxMjsKLSAgZWxzZQotICAgIHJldHVybiAxNjsKLX0KLQotLyogQnVpbGQgb25lIGxpbmtlciBzdHViIGFzIGRlZmluZWQgYnkgdGhlIHN0dWIgaGFzaCB0YWJsZSBlbnRyeSBHRU5fRU5UUlkuCi0gICBJTl9BUkdTIGNvbnRhaW5zIHRoZSBzdHViIEJGRCBhbmQgbGluayBpbmZvIHBvaW50ZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfYnVpbGRfb25lX3N0dWIgKGdlbl9lbnRyeSwgaW5fYXJncykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpnZW5fZW50cnk7Ci0gICAgIFBUUiBpbl9hcmdzOwotewotICB2b2lkICoqYXJncyA9ICh2b2lkICoqKWluX2FyZ3M7Ci0gIGJmZCAqc3R1Yl9iZmQgPSAoYmZkICopYXJnc1swXTsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKilhcmdzWzFdOwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKmVudHJ5OwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZTsKLSAgYmZkX2J5dGUgKmxvYzsKLSAgc3ltdmFsdWUgc3ltX3ZhbHVlOwotICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQotICAvKiBJbml0aWFsaXplIHBvaW50ZXJzIHRvIHRoZSBzdHViIGhhc2ggdGFibGUsIHRoZSBwYXJ0aWN1bGFyIGVudHJ5IHdlCi0gICAgIGFyZSBidWlsZGluZyBhIHN0dWIgZm9yLCBhbmQgd2hlcmUgKGluIG1lbW9yeSkgd2Ugc2hvdWxkIHBsYWNlIHRoZSBzdHViCi0gICAgIGluc3RydWN0aW9ucy4gICovCi0gIGVudHJ5ID0gKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKWdlbl9lbnRyeTsKLSAgc3R1Yl9oYXNoX3RhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGluZm8pLT5zdHViX2hhc2hfdGFibGU7Ci0gIGxvYyA9IHN0dWJfaGFzaF90YWJsZS0+bG9jYXRpb247Ci0KLSAgLyogTWFrZSBhIG5vdGUgb2YgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHN0dWJzIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgZW50cnktPm9mZnNldCA9IHN0dWJfaGFzaF90YWJsZS0+b2Zmc2V0OwotCi0gIC8qIFRoZSBzeW1ib2wncyBuYW1lIHN0YXJ0cyBhdCBvZmZzZXQgMjIuICAqLwotICBzeW1fbmFtZSA9IGVudHJ5LT5yb290LnN0cmluZyArIDIyOwotCi0gIHN5bV92YWx1ZSA9IChlbnRyeS0+dGFyZ2V0X3ZhbHVlCi0JICAgICAgICsgZW50cnktPnRhcmdldF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgZW50cnktPnRhcmdldF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotICBpZiAoMSkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgb25lIG9mIHR3byB2YXJpYW50IGxvbmcgYnJhbmNoIHN0dWJzLiAgT25lIGZvciAkJGR5bmNhbGwgYW5kCi0JIG5vcm1hbCBjYWxscywgdGhlIG90aGVyIGZvciBjYWxscyB0byBtaWxsaWNvZGUuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgaW50IG1pbGxpY29kZV9jYWxsID0gMDsKLQotICAgICAgaWYgKCFzdHJuY21wICgiJCQiLCBzeW1fbmFtZSwgMikgJiYgc3RyY21wICgiJCRkeW5jYWxsIiwgc3ltX25hbWUpKQotCW1pbGxpY29kZV9jYWxsID0gMTsKLQotICAgICAgLyogRmlyc3QgdGhlIHJldHVybiBwb2ludGVyIGFkanVzdG1lbnQuICBEZXBlbmRpbmcgb24gZXhhY3QgY2FsbGluZwotCSBzZXF1ZW5jZSB0aGlzIGluc3RydWN0aW9uIG1heSBiZSBza2lwcGVkLiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBMRE9fTTRfUjMxX1IzMSwgbG9jKTsKLQotICAgICAgLyogVGhlIG5leHQgdHdvIGluc3RydWN0aW9ucyBhcmUgdGhlIGxvbmcgYnJhbmNoIGl0c2VsZi4gIEEgbG9uZyBicmFuY2gKLQkgaXMgZm9ybWVkIHdpdGggImxkaWwiIGxvYWRpbmcgdGhlIHVwcGVyIGJpdHMgb2YgdGhlIHRhcmdldCBhZGRyZXNzCi0JIGludG8gYSByZWdpc3RlciwgdGhlbiBicmFuY2hpbmcgd2l0aCAiYmUiIHdoaWNoIGFkZHMgaW4gdGhlIGxvd2VyIGJpdHMuCi0JIExvbmcgYnJhbmNoZXMgdG8gbWlsbGljb2RlIG51bGxpZnkgdGhlIGRlbGF5IHNsb3Qgb2YgdGhlICJiZSIuICAqLwotICAgICAgaW5zbiA9IGhwcGFfcmVidWlsZF9pbnNuIChzdHViX2JmZCwgTERJTF9SMSwKLQkJCQlocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAwLCBlX2xyc2VsKSwgMjEpOwotICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIGluc24sIGxvYyArIDQpOwotICAgICAgaW5zbiA9IGhwcGFfcmVidWlsZF9pbnNuIChzdHViX2JmZCwgQkVfU1I0X1IxIHwgKG1pbGxpY29kZV9jYWxsID8gMiA6IDApLAotCQkJCWhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIDAsIGVfcnJzZWwpID4+IDIsCi0JCQkJMTcpOwotICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIGluc24sIGxvYyArIDgpOwotCi0gICAgICBpZiAoIW1pbGxpY29kZV9jYWxsKQotCXsKLQkgIC8qIFRoZSBzZXF1ZW5jZSB0byBjYWxsIHRoaXMgc3R1YiBwbGFjZXMgdGhlIHJldHVybiBwb2ludGVyIGludG8gJXIzMSwKLQkgICAgIHRoZSBmaW5hbCB0YXJnZXQgZXhwZWN0cyB0aGUgcmV0dXJuIHBvaW50ZXIgaW4gJXIyLCBzbyBjb3B5IHRoZQotCSAgICAgIHJldHVybiBwb2ludGVyIGludG8gdGhlIHByb3BlciByZWdpc3Rlci4gICovCi0JICBiZmRfcHV0XzMyIChzdHViX2JmZCwgQ09QWV9SMzFfUjIsIGxvYyArIDEyKTsKLQotCSAgLyogVXBkYXRlIHRoZSBsb2NhdGlvbiBhbmQgb2Zmc2V0cy4gICovCi0JICBzdHViX2hhc2hfdGFibGUtPmxvY2F0aW9uICs9IDE2OwotCSAgc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQgKz0gMTY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFVwZGF0ZSB0aGUgbG9jYXRpb24gYW5kIG9mZnNldHMuICAqLwotCSAgc3R1Yl9oYXNoX3RhYmxlLT5sb2NhdGlvbiArPSAxMjsKLQkgIHN0dWJfaGFzaF90YWJsZS0+b2Zmc2V0ICs9IDEyOwotCX0KLQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEV4dGVybmFsIGVudHJ5IHBvaW50cyBmb3Igc2l6aW5nIGFuZCBidWlsZGluZyBsaW5rZXIgc3R1YnMuICAqLwotCi0vKiBCdWlsZCBhbGwgdGhlIHN0dWJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBvdXRwdXQgZmlsZS4gIFRoZQotICAgc3R1YnMgYXJlIGtlcHQgaW4gYSBoYXNoIHRhYmxlIGF0dGFjaGVkIHRvIHRoZSBtYWluIGxpbmtlciBoYXNoCi0gICB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBocHBhZWxmX2ZpbmlzaCBpbiB0aGUgbGlua2VyLiAgKi8KLQotYm9vbGVhbgotZWxmMzJfaHBwYV9idWlsZF9zdHVicyAoc3R1Yl9iZmQsIGluZm8pCi0gICAgIGJmZCAqc3R1Yl9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICAvKiBUaGUgc3R1YiBCRkQgb25seSBoYXMgb25lIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqc3R1Yl9zZWMgPSBzdHViX2JmZC0+c2VjdGlvbnM7Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqdGFibGU7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICB2b2lkICphcmdzWzJdOwotCi0gIC8qIFNvIHdlIGNhbiBwYXNzIGJvdGggdGhlIEJGRCBmb3IgdGhlIHN0dWJzIGFuZCB0aGUgbGluayBpbmZvCi0gICAgIHN0cnVjdHVyZSB0byB0aGUgcm91dGluZSB3aGljaCBhY3R1YWxseSBidWlsZHMgc3R1YnMuICAqLwotICBhcmdzWzBdID0gc3R1Yl9iZmQ7Ci0gIGFyZ3NbMV0gPSBpbmZvOwotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBsaW5rZXIgc3R1YnMuICAqLwotICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoc3R1Yl9iZmQsIHN0dWJfc2VjKTsKLSAgc3R1Yl9zZWMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX3phbGxvYyAoc3R1Yl9iZmQsIHNpemUpOwotICBpZiAoc3R1Yl9zZWMtPmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICB0YWJsZSA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZShpbmZvKS0+c3R1Yl9oYXNoX3RhYmxlOwotICB0YWJsZS0+bG9jYXRpb24gPSBzdHViX3NlYy0+Y29udGVudHM7Ci0KLSAgLyogQnVpbGQgdGhlIHN0dWJzIGFzIGRpcmVjdGVkIGJ5IHRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotICBlbGYzMl9ocHBhX3N0dWJfaGFzaF90cmF2ZXJzZSAodGFibGUsIGVsZjMyX2hwcGFfYnVpbGRfb25lX3N0dWIsIGFyZ3MpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZXRlcm1pbmUgYW5kIHNldCB0aGUgc2l6ZSBvZiB0aGUgc3R1YiBzZWN0aW9uIGZvciBhIGZpbmFsIGxpbmsuCi0KLSAgIFRoZSBiYXNpYyBpZGVhIGhlcmUgaXMgdG8gZXhhbWluZSBhbGwgdGhlIHJlbG9jYXRpb25zIGxvb2tpbmcgZm9yCi0gICBQQy1yZWxhdGl2ZSBjYWxscyB0byBhIHRhcmdldCB0aGF0IGlzIHVucmVhY2hhYmxlIHdpdGggYSAiYmwiCi0gICBpbnN0cnVjdGlvbiBvciBjYWxscyB3aGVyZSB0aGUgY2FsbGVyIGFuZCBjYWxsZWUgZGlzYWdyZWUgb24gdGhlCi0gICBsb2NhdGlvbiBvZiB0aGVpciBhcmd1bWVudHMgb3IgcmV0dXJuIHZhbHVlLiAgKi8KLQotYm9vbGVhbgotZWxmMzJfaHBwYV9zaXplX3N0dWJzIChzdHViX2JmZCwgb3V0cHV0X2JmZCwgbGlua19pbmZvKQotICAgICBiZmQgKnN0dWJfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkICppbnB1dF9iZmQ7Ci0gIGFzZWN0aW9uICpzZWN0aW9uLCAqc3R1Yl9zZWMgPSAwOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltcywgKiphbGxfbG9jYWxfc3ltczsKLSAgdW5zaWduZWQgaW50IGksIGluZGV4LCBiZmRfY291bnQgPSAwOwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZSA9IDA7Ci0KLSAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotICBzdHViX2hhc2hfdGFibGUgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqKQotCQkgICAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlKSkpOwotICBpZiAoIXN0dWJfaGFzaF90YWJsZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoIWVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlX2luaXQgKHN0dWJfaGFzaF90YWJsZSwgc3R1Yl9iZmQsCi0JCQkJCWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEF0dGFjaCB0aGUgaGFzaCB0YWJsZXMgdG8gdGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIGVsZjMyX2hwcGFfaGFzaF90YWJsZShsaW5rX2luZm8pLT5zdHViX2hhc2hfdGFibGUgPSBzdHViX2hhc2hfdGFibGU7Ci0KLSAgLyogQ291bnQgdGhlIG51bWJlciBvZiBpbnB1dCBCRkRzLiAgKi8KLSAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7Ci0gICAgICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0gICAgIGJmZF9jb3VudCsrOwotCi0gIC8qIE1hZ2ljIGFzIHdlIGtub3cgdGhlIHN0dWIgYmZkIG9ubHkgaGFzIG9uZSBzZWN0aW9uLiAgKi8KLSAgc3R1Yl9zZWMgPSBzdHViX2JmZC0+c2VjdGlvbnM7Ci0KLSAgLyogSWYgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSwgdGhlbiB3ZSBkb24ndAotICAgICBoYXZlIHRvIGV4YW1pbmUgdGhlIHJlbG9jcy4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYXJndW1lbnQgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGFsbCB0aGUgZ2xvYmFsCi0gICAgIGZ1bmN0aW9ucyB3ZSBjYW4gc3RhcnQgbG9va2luZyBmb3Igc3R1YnMuICAqLwotICBmb3IgKGlucHV0X2JmZCA9IGxpbmtfaW5mby0+aW5wdXRfYmZkcywgaW5kZXggPSAwOwotICAgICAgIGlucHV0X2JmZCAhPSBOVUxMOwotICAgICAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0LCBpbmRleCsrKQotICAgIHsKLSAgICAgIC8qIFdlJ2xsIG5lZWQgdGhlIHN5bWJvbCB0YWJsZSBpbiBhIHNlY29uZC4gICovCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIGlmIChzeW10YWJfaGRyLT5zaF9pbmZvID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGxvY2FsX3N5bXMgPSBhbGxfbG9jYWxfc3ltc1tpbmRleF07Ci0KLSAgICAgIC8qIFdhbGsgb3ZlciBlYWNoIHNlY3Rpb24gYXR0YWNoZWQgdG8gdGhlIGlucHV0IGJmZC4gICovCi0gICAgICBmb3IgKHNlY3Rpb24gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqaW5wdXRfcmVsX2hkcjsKLQkgIEVsZjMyX0V4dGVybmFsX1JlbGEgKmV4dGVybmFsX3JlbG9jcywgKmVyZWxhZW5kLCAqZXJlbGE7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzLCAqaXJlbGFlbmQsICppcmVsYTsKLQotCSAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MsIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLiAgKi8KLQkgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgICAgICB8fCBzZWN0aW9uLT5yZWxvY19jb3VudCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBleHRlcm5hbCByZWxvY2F0aW9ucy4gICovCi0JICBleHRlcm5hbF9yZWxvY3MKLQkgICAgPSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkgICAgICAgYmZkX21hbGxvYyAoc2VjdGlvbi0+cmVsb2NfY291bnQKLQkJCSAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpOwotCSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBMaWtld2lzZSBmb3IgdGhlIGludGVybmFsIHJlbG9jYXRpb25zLiAgKi8KLQkgIGludGVybmFsX3JlbG9jcwotCSAgICA9ICgoRWxmX0ludGVybmFsX1JlbGEgKikKLQkgICAgICAgYmZkX21hbGxvYyAoc2VjdGlvbi0+cmVsb2NfY291bnQgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0JICBpbnB1dF9yZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxfaGRyOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3JlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBpbnB1dF9yZWxfaGRyLT5zaF9zaXplLAotCQkJICAgaW5wdXRfYmZkKSAhPSBpbnB1dF9yZWxfaGRyLT5zaF9zaXplKQotCSAgICB7Ci0JICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogU3dhcCBpbiB0aGUgcmVsb2NzLiAgKi8KLQkgIGVyZWxhID0gZXh0ZXJuYWxfcmVsb2NzOwotCSAgZXJlbGFlbmQgPSBlcmVsYSArIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmb3IgKDsgZXJlbGEgPCBlcmVsYWVuZDsgZXJlbGErKywgaXJlbGErKykKLQkgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX2luIChpbnB1dF9iZmQsIGVyZWxhLCBpcmVsYSk7Ci0KLQkgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgZXh0ZXJuYWwgcmVsb2NzLCBmcmVlIHRoZW0uICAqLwotCSAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLQotCSAgLyogTm93IGV4YW1pbmUgZWFjaCByZWxvY2F0aW9uLiAgKi8KLQkgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgaXJlbGFlbmQgPSBpcmVsYSArIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgZm9yICg7IGlyZWxhIDwgaXJlbGFlbmQ7IGlyZWxhKyspCi0JICAgIHsKLQkgICAgICBsb25nIHJfdHlwZSwgc2l6ZV9vZl9zdHViOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGFzaDsKLQkgICAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKnN0dWJfaGFzaDsKLQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0JICAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0JICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0JICAgICAgc3ltdmFsdWUgc3ltX3ZhbHVlOwotCSAgICAgIGJmZF92bWEgbG9jYXRpb24sIGRlc3RpbmF0aW9uOwotCSAgICAgIGNoYXIgKm5ld19uYW1lID0gTlVMTDsKLQotCSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbGEtPnJfaW5mbyk7Ci0JICAgICAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsYS0+cl9pbmZvKTsKLQotCSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotCQl7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkJICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIE9ubHkgbG9vayBmb3Igc3R1YnMgb24gY2FsbCBpbnN0cnVjdGlvbnMgb3IgcGxhYmVsCi0JCSByZWZlcmVuY2VzLiAgKi8KLQkgICAgICBpZiAocl90eXBlICE9IFJfUEFSSVNDX1BDUkVMMTdGCi0JCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDMyCi0JCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDIxTAotCQkgICYmIHJfdHlwZSAhPSBSX1BBUklTQ19QTEFCRUwxNFIpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogTm93IGRldGVybWluZSB0aGUgY2FsbCB0YXJnZXQsIGl0cyBuYW1lLCB2YWx1ZSwgc2VjdGlvbgotCQkgYW5kIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cy4gICovCi0JICAgICAgaGFzaCA9IE5VTEw7Ci0JICAgICAgc3ltID0gTlVMTDsKLQkgICAgICBzeW1fc2VjID0gTlVMTDsKLQkgICAgICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JCXsKLQkJICAvKiBJdCdzIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkJICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0JCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfaW5kZXg7Ci0JCSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChpbnB1dF9iZmQpW3N5bS0+c3Rfc2huZHhdOwotCQkgIHN5bV9zZWMgPSBoZHItPmJmZF9zZWN0aW9uOwotCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgICAgc3ltLT5zdF9uYW1lKTsKLQkJICBzeW1fdmFsdWUgPSAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04KLQkJCSAgICAgICA/IDAgOiBzeW0tPnN0X3ZhbHVlKTsKLQkJICBkZXN0aW5hdGlvbiA9IChzeW1fdmFsdWUKLQkJCQkgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGxvY2FsCi0JCSAgICAgc3ltYm9sIGluIHRoZSBzdHViIG9yIGFyZyBpbmZvIGhhc2ggdGFibGVzLiAgKi8KLQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCQkgICAgewotCQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJICBzeW1fbmFtZSA9IG5ld19uYW1lOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogSXQncyBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCQkgIGxvbmcgaW5kZXg7Ci0KLQkJICBpbmRleCA9IHJfaW5kZXggLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCQkgIGhhc2ggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmRleF07Ci0JCSAgaWYgKGhhc2gtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaGFzaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgIHsKLQkJICAgICAgc3ltX3NlYyA9IGhhc2gtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICAgICAgc3ltX25hbWUgPSBoYXNoLT5yb290LnJvb3Quc3RyaW5nOwotCQkgICAgICBzeW1fdmFsdWUgPSBoYXNoLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICBkZXN0aW5hdGlvbiA9IChzeW1fdmFsdWUKLQkJCQkgICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAotCQkJCSAgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogTm93IGRldGVybWluZSB3aGVyZSB0aGUgY2FsbCBwb2ludCBpcy4gICovCi0JICAgICAgbG9jYXRpb24gPSAoc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICArIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpcmVsYS0+cl9vZmZzZXQpOwotCi0JICAgICAgLyogV2Ugb25seSBjYXJlIGFib3V0IHRoZSBkZXN0aW5hdGlvbiBmb3IgUENSRUwgZnVuY3Rpb24KLQkJIGNhbGxzIChlZy4gd2UgZG9uJ3QgY2FyZSBmb3IgUExBQkVMUykuICAqLwotCSAgICAgIGlmIChyX3R5cGUgIT0gUl9QQVJJU0NfUENSRUwxN0YpCi0JCWxvY2F0aW9uID0gZGVzdGluYXRpb247Ci0KLQkgICAgICAvKiBEZXRlcm1pbmUgd2hhdCAoaWYgYW55KSBsaW5rZXIgc3R1YiBpcyBuZWVkZWQgYW5kIGl0cwotCQkgc2l6ZSAoaW4gYnl0ZXMpLiAgKi8KLQkgICAgICBzaXplX29mX3N0dWIgPSBlbGYzMl9ocHBhX3NpemVfb2Zfc3R1YiAobG9jYXRpb24sCi0JCQkJCQkgICAgICBkZXN0aW5hdGlvbiwKLQkJCQkJCSAgICAgIHN5bV9uYW1lKTsKLQkgICAgICBpZiAoc2l6ZV9vZl9zdHViICE9IDApCi0JCXsKLQkJICBjaGFyICpzdHViX25hbWU7Ci0JCSAgdW5zaWduZWQgaW50IGxlbjsKLQotCQkgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGlzIHN0dWIuICAqLwotCQkgIGxlbiA9IHN0cmxlbiAoc3ltX25hbWUpOwotCQkgIGxlbiArPSAyMzsKLQotCQkgIHN0dWJfbmFtZSA9IGJmZF9tYWxsb2MgKGxlbik7Ci0JCSAgaWYgKCFzdHViX25hbWUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEJlY2F1c2Ugc3ltX25hbWUgd2FzIG1hbGxvY2QgYWJvdmUgZm9yIGxvY2FsCi0JCQkgc3ltYm9scy4gICovCi0JCSAgICAgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJCWZyZWUgKG5ld19uYW1lKTsKLQotCQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJICBlbGYzMl9ocHBhX25hbWVfb2Zfc3R1YiAobG9jYXRpb24sIGRlc3RpbmF0aW9uLCBzdHViX25hbWUpOwotCQkgIHN0cmNhdCAoc3R1Yl9uYW1lICsgMjIsIHN5bV9uYW1lKTsKLQotCQkgIC8qIEJlY2F1c2Ugc3ltX25hbWUgd2FzIG1hbGxvY2VkIGFib3ZlIGZvciBsb2NhbCBzeW1ib2xzLiAgKi8KLQkJICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JCSAgICBmcmVlIChuZXdfbmFtZSk7Ci0KLQkJICBzdHViX2hhc2gKLQkJICAgID0gZWxmMzJfaHBwYV9zdHViX2hhc2hfbG9va3VwIChzdHViX2hhc2hfdGFibGUsIHN0dWJfbmFtZSwKLQkJCQkJCSAgIGZhbHNlLCBmYWxzZSk7Ci0JCSAgaWYgKHN0dWJfaGFzaCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgcHJvcGVyIHN0dWIgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBub3RoaW5nCi0JCQkgZWxzZSB0byBkby4gICovCi0JCSAgICAgIGZyZWUgKHN0dWJfbmFtZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoc3R1Yl9iZmQsIHN0dWJfc2VjLAotCQkJCQkgICAgKGJmZF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLAotCQkJCQkJCSAgICAgICBzdHViX3NlYykKLQkJCQkJICAgICArIHNpemVfb2Zfc3R1YikpOwotCi0JCSAgICAgIC8qIEVudGVyIHRoaXMgZW50cnkgaW50byB0aGUgbGlua2VyIHN0dWIgaGFzaCB0YWJsZS4gICovCi0JCSAgICAgIHN0dWJfaGFzaAotCQkJPSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAgKHN0dWJfaGFzaF90YWJsZSwKLQkJCQkJCSAgICAgICBzdHViX25hbWUsIHRydWUsIHRydWUpOwotCQkgICAgICBpZiAoc3R1Yl9oYXNoID09IE5VTEwpCi0JCQl7Ci0JCQkgIGZyZWUgKHN0dWJfbmFtZSk7Ci0JCQkgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCQkgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0KLQkJICAgICAgLyogV2UnbGwgbmVlZCB0aGVzZSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgdGhhdCB0aGUKLQkJCSBzdHViIHdpbGwgYnJhbmNoIHRvLiAgKi8KLQkJICAgICAgc3R1Yl9oYXNoLT50YXJnZXRfdmFsdWUgPSBzeW1fdmFsdWU7Ci0JCSAgICAgIHN0dWJfaGFzaC0+dGFyZ2V0X3NlY3Rpb24gPSBzeW1fc2VjOwotCQkgICAgfQotCQkgIGZyZWUgKHN0dWJfbmFtZSk7Ci0JCX0KLQkgICAgfQotCSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBpbnRlcm5hbCByZWxvY3MsIGZyZWUgdGhlbS4gICovCi0JICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCX0KLSAgICB9Ci0gIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgbG9jYWwgc3ltYm9scywgZnJlZSB0aGVtLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotICByZXR1cm4gdHJ1ZTsKLQotZXJyb3JfcmV0dXJuOgotICAvKiBSZXR1cm4gZ3JhY2VmdWxseSwgYXZvaWRpbmcgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byB0aGUgaGFzaCB0YWJsZXMuICAqLwotICBpZiAoc3R1Yl9oYXNoX3RhYmxlKQotICAgIHsKLSAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZShsaW5rX2luZm8pLT5zdHViX2hhc2hfdGFibGUgPSBOVUxMOwotICAgICAgZnJlZSAoc3R1Yl9oYXNoX3RhYmxlKTsKLSAgICB9Ci0gIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgc3R1YiBzZWN0aW9uIHRvIHplcm8gc2luY2Ugd2UncmUgbmV2ZXIgZ29pbmcKLSAgICAgdG8gY3JlYXRlIHRoZW0uICAgQXZvaWRzIGxvc2luZyB3aGVuIHdlIHRyeSB0byBnZXQgaXRzIGNvbnRlbnRzCi0gICAgIHRvby4gICovCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMsIDApOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIE1pc2MgQkZEIHN1cHBvcnQgY29kZS4gICovCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCWVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQllbGZfaHBwYV9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgCWVsZl9ocHBhX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICAJZWxmX2hwcGFfaW5mb190b19ob3d0b19yZWwKLQotLyogU3R1ZmYgZm9yIHRoZSBCRkQgbGlua2VyLiAgKi8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJCWVsZl9ocHBhX2Zha2Vfc2VjdGlvbnMKLQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfaHBwYV92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItaHBwYSIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2hwcGEKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9QQVJJU0MKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWhwcGEuaCBiL2JmZC9lbGYzMi1ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNWZjMTMuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIEVMRjMyL0hQUEEgc3VwcG9ydAotCi0gICBUaGlzIGZpbGUgY29udGFpbnMgRUxGMzIvSFBQQSByZWxvY2F0aW9uIHN1cHBvcnQgYXMgc3BlY2lmaWVkCi0gICBpbiB0aGUgU3RyYXR1cyBGVFgvR29sZiBPYmplY3QgRmlsZSBGb3JtYXQgKFNFRC0xNzYyKSBkYXRlZAotICAgRmVicnVhcnkgMTk5NC4KLQotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieToKLQotICAgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlCi0gICBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaAotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRjMyX0hQUEFfSAotI2RlZmluZSBfRUxGMzJfSFBQQV9ICi0KLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAibGliaHBwYS5oIgotI2luY2x1ZGUgImVsZi9ocHBhLmgiCi0KLWJvb2xlYW4gZWxmMzJfaHBwYV9zaXplX3N0dWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1ib29sZWFuIGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGVsZl9ocHBhX3JlbG9jX3R5cGUgKiogX2JmZF9lbGYzMl9ocHBhX2dlbl9yZWxvY190eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBlbGZfaHBwYV9yZWxvY190eXBlLCBpbnQsIGludCwgaW50LCBhc3ltYm9sICopKTsKLQotLyogRGVmaW5lIGdyb3VwcyBvZiBiYXNpYyByZWxvY2F0aW9ucy4gIEZJWE1FOiAgVGhlc2Ugc2hvdWxkCi0gICBiZSB0aGUgb25seSBiYXNpYyByZWxvY2F0aW9ucyBjcmVhdGVkIGJ5IEdBUy4gIFRoZSByZXN0Ci0gICBzaG91bGQgYmUgaW50ZXJuYWwgdG8gdGhlIEJGRCBiYWNrZW5kLgotCi0gICBUaGUgaWRlYSBpcyBib3RoIFNPTSBhbmQgRUxGIGRlZmluZSB0aGVzZSBiYXNpYyByZWxvY2F0aW9uCi0gICB0eXBlcyBzbyB0aGV5IG1hcCBpbnRvIGEgU09NIG9yIEVMRiBzcGVjaWZpYyByZWxvY2F0aW9uCi0gICBhcyBhcHByb3ByaWF0ZS4gIFRoaXMgYWxsb3dzIEdBUyB0byBzaGFyZSBtdWNoIG1vcmUgY29kZQotICAgYmV0d2VlbiB0aGUgdHdvIHRhcmdldCBvYmplY3QgZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgUl9IUFBBX05PTkUJCQlSX1BBUklTQ19OT05FCi0jZGVmaW5lIFJfSFBQQQkJCQlSX1BBUklTQ19ESVIzMgotI2RlZmluZSBSX0hQUEFfR09UT0ZGCQkJUl9QQVJJU0NfRFBSRUwyMUwKLSNkZWZpbmUgUl9IUFBBX1BDUkVMX0NBTEwJCVJfUEFSSVNDX1BDUkVMMjFMCi0jZGVmaW5lIFJfSFBQQV9BQlNfQ0FMTAkJCVJfUEFSSVNDX0RJUjE3RgotI2RlZmluZSBSX0hQUEFfQ09NUExFWAkJCVJfUEFSSVNDX1VOSU1QTEVNRU5URUQKLQotI2VuZGlmIC8qIF9FTEYzMl9IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1pMzcwLmMgYi9iZmQvZWxmMzItaTM3MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJmOTQzLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1pMzcwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQyICswLDAgQEAKLS8qIGkzNzAtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLSAgIEhhY2tlZCBieSBMaW5hcyBWZXBzdGFzIGZvciBpMzcwIGxpbmFzQGxpbmFzLm9yZwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotCi0vKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gYSBwcmVsaW1pbmFyeSBQb3dlclBDIEVMRiBBQkkuCi0gICBCdXQgaXRzIGJlZW4gaGFja2VkIG9uIGZvciB0aGUgSUJNIDM2MC8zNzAgYXJjaGl0ZWN0dXJlcy4KLSAgIEJhc2ljYWxseSwgdGhlIDMxYml0IHJlbG9jYXRpb24gd29ya3MsIGFuZCBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcKLSAgIGVsc2UgaXMgYSB3aWxkIGNhcmQuICBJbiBwYXJ0aWN1bGFyLCBkb24ndCBleHBlY3Qgc2hhcmVkIGxpYnMgb3IKLSAgIGR5bmFtaWMgbG9hZGluZyB0byB3b3JrIC4uLiAgaXRzIG5ldmVyIGJlZW4gdGVzdGVkIC4uLgotKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvaTM3MC5oIgotCi0jZGVmaW5lIFVTRV9SRUxBCQkvKiB3ZSB3YW50IFJFTEEgcmVsb2NhdGlvbnMsIG5vdCBSRUwgKi8KLQotLyogaTM3MCByZWxvY2F0aW9ucyAqLwotLyogTm90ZSB0aGF0IHRoZXJlIGlzIHJlYWxseSBqdXN0IG9uZSByZWxvY2F0aW9uIHRoYXQgd2UgY3VycmVudGx5Ci0gKiBzdXBwb3J0IChhbmQgb25seSBvbmUgdGhhdCB3ZSBzZWVtIHRvIG5lZWQsIGF0IHRoZSBtb21lbnQpLCBhbmQKLSAqIHRoYXQgaXMgdGhlIDMxLWJpdCBhZGRyZXNzIHJlbG9jYXRpb24uICBOb3RlIHRoYXQgdGhlIDM3MC8zOTAKLSAqIG9ubHkgc3VwcG9ydHMgYSAzMS1iaXQgKDJHQikgYWRkcmVzcyBzcGFjZS4KLSAqLwotZW51bSBpMzcwX3JlbG9jX3R5cGUKLXsKLSAgUl9JMzcwX05PTkUJCT0gICAwLAotICBSX0kzNzBfQUREUjMxCQk9ICAgMSwKLSAgUl9JMzcwX0FERFIzMgkJPSAgIDIsCi0gIFJfSTM3MF9BRERSMTYJCT0gICAzLAotICBSX0kzNzBfUkVMMzEJCT0gICA0LAotICBSX0kzNzBfUkVMMzIJCT0gICA1LAotICBSX0kzNzBfQUREUjEyCQk9ICAgNiwKLSAgUl9JMzcwX1JFTDEyCQk9ICAgNywKLSAgUl9JMzcwX0FERFI4CQk9ICAgOCwKLSAgUl9JMzcwX1JFTDgJCT0gICA5LAotICBSX0kzNzBfQ09QWQkJPSAgMTAsCi0gIFJfSTM3MF9SRUxBVElWRQk9ICAxMSwKLQotICBSX0kzNzBfbWF4Ci19OwotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqaTM3MF9lbGZfaG93dG9fdGFibGVbIChpbnQpUl9JMzcwX21heCBdOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBpMzcwX2VsZl9ob3d0b19yYXdbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfSTM3MF9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0kzNzBfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAzMSBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0kzNzBfQUREUjMxLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzEsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0kzNzBfQUREUjMxIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0kzNzBfQUREUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0kzNzBfQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAxNiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0kzNzBfQUREUjE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0kzNzBfQUREUjE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMS1iaXQgUEMgcmVsYXRpdmUgKi8KLSAgSE9XVE8gKFJfSTM3MF9SRUwzMSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMxLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0kzNzBfUkVMMzEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgUEMgcmVsYXRpdmUgKi8KLSAgSE9XVE8gKFJfSTM3MF9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0kzNzBfUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDEyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfSTM3MF9BRERSMTIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9BRERSMTIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyLWJpdCBQQyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9JMzcwX1JFTDEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9SRUwxMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCA4IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfSTM3MF9BRERSOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0kzNzBfQUREUjgiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOC1iaXQgUEMgcmVsYXRpdmUgKi8KLSAgSE9XVE8gKFJfSTM3MF9SRUw4LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9JMzcwX1JFTDgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgaXMgdXNlZCBvbmx5IGJ5IHRoZSBkeW5hbWljIGxpbmtlci4gIFRoZSBzeW1ib2wgc2hvdWxkIGV4aXN0Ci0gICAgIGJvdGggaW4gdGhlIG9iamVjdCBiZWluZyBydW4gYW5kIGluIHNvbWUgc2hhcmVkIGxpYnJhcnkuICBUaGUKLSAgICAgZHluYW1pYyBsaW5rZXIgY29waWVzIHRoZSBkYXRhIGFkZHJlc3NlZCBieSB0aGUgc3ltYm9sIGZyb20gdGhlCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGludG8gdGhlIG9iamVjdCwgYmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nCi0gICAgIHJ1biBoYXMgdG8gaGF2ZSB0aGUgZGF0YSBhdCBzb21lIHBhcnRpY3VsYXIgYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX0kzNzBfQ09QWSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfSTM3MF9DT1BZIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIG9ubHkgYnkgdGhlIGR5bmFtaWMgbGlua2VyLiAgV2hlbiB0aGUgb2JqZWN0IGlzIHJ1biwgdGhpcwotICAgICBsb25nd29yZCBpcyBzZXQgdG8gdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgb2JqZWN0LCBwbHVzIHRoZQotICAgICBhZGRlbmQuICAqLwotICBIT1dUTyAoUl9JMzcwX1JFTEFUSVZFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0kzNzBfUkVMQVRJVkUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQotDAotc3RhdGljIHZvaWQgaTM3MF9lbGZfaG93dG9faW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBpMzcwX2VsZl9pbmZvX3RvX2hvd3RvIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqY2FjaGVfcHRyLAotCQkJCQkgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0KSk7Ci1zdGF0aWMgYm9vbGVhbiBpMzcwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLQotDAotLyogSW5pdGlhbGl6ZSB0aGUgaTM3MF9lbGZfaG93dG9fdGFibGUsIHNvIHRoYXQgbGluZWFyIGFjY2Vzc2VzIGNhbiBiZSBkb25lLiAgKi8KLQotc3RhdGljIHZvaWQKLWkzNzBfZWxmX2hvd3RvX2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGksIHR5cGU7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoaTM3MF9lbGZfaG93dG9fcmF3KSAvIHNpemVvZiAoaTM3MF9lbGZfaG93dG9fcmF3WzBdKTsgaSsrKQotICAgIHsKLSAgICAgIHR5cGUgPSBpMzcwX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKLSAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBzaXplb2YoaTM3MF9lbGZfaG93dG9fdGFibGUpIC8gc2l6ZW9mKGkzNzBfZWxmX2hvd3RvX3RhYmxlWzBdKSk7Ci0gICAgICBpMzcwX2VsZl9ob3d0b190YWJsZVt0eXBlXSA9ICZpMzcwX2VsZl9ob3d0b19yYXdbaV07Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1pMzcwX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBlbnVtIGkzNzBfcmVsb2NfdHlwZSBpMzcwX3JlbG9jID0gUl9JMzcwX05PTkU7Ci0KLSAgaWYgKCFpMzcwX2VsZl9ob3d0b190YWJsZVsgUl9JMzcwX0FERFIzMSBdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIGkzNzBfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgc3dpdGNoICgoaW50KWNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTk9ORToJaTM3MF9yZWxvYyA9IFJfSTM3MF9OT05FOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCWkzNzBfcmVsb2MgPSBSX0kzNzBfQUREUjMxOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoJCWkzNzBfcmVsb2MgPSBSX0kzNzBfQUREUjE2OwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoJaTM3MF9yZWxvYyA9IFJfSTM3MF9SRUwzMTsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoJaTM3MF9yZWxvYyA9IFJfSTM3MF9BRERSMzE7CWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0kzNzBfRDEyOglpMzcwX3JlbG9jID0gUl9JMzcwX0FERFIxMjsJYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBpMzcwX2VsZl9ob3d0b190YWJsZVsgKGludClpMzcwX3JlbG9jIF07Ci19OwotCi1zdGF0aWMgYm9vbGVhbiBpMzcwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpMzcwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBpMzcwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkJCQkJCSAgYmZkICosCi0JCQkJCQkgIGFzZWN0aW9uICosCi0JCQkJCQkgIGJmZF9ieXRlICosCi0JCQkJCQkgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MsCi0JCQkJCQkgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JCQkJCQkgIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX3NlY3Rpb25fZnJvbV9zaGRyIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJICAgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpMzcwX2VsZl9mYWtlX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkgICAgICAgYXNlY3Rpb24gKikpOwotI2lmIDAKLXN0YXRpYyBlbGZfbGlua2VyX3NlY3Rpb25fdCAqaTM3MF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtKSk7Ci0jZW5kaWYKLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX2NoZWNrX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgIGFzZWN0aW9uICosCi0JCQkJCSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBpMzcwX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotc3RhdGljIGJvb2xlYW4gaTM3MF9lbGZfYWRqdXN0X2R5bmluZHggUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuIGkzNzBfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBpMzcwX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi9saWIvbGQuc28iCi0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBpMzcwIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1pMzcwX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBpZiAoIWkzNzBfZWxmX2hvd3RvX3RhYmxlWyBSX0kzNzBfQUREUjMxIF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgKi8KLSAgICBpMzcwX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9JMzcwX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSBpMzcwX2VsZl9ob3d0b190YWJsZVtFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKV07Ci19Ci0KLS8qIGhhY2sgYWxlcnQgLS0gIHRoZSBmb2xsb3dpbmcgc2V2ZXJhbCByb3V0aW5lcyBsb29rIGdlbmVyaWMgdG8gbWUgLi4uCi0gKiB3aHkgYXJlIHdlIGJvdGhlcmluZyB3aXRoIHRoZW0gPz8/Ci0gKi8KLS8qIEZ1bmN0aW9uIHRvIHNldCB3aGV0aGVyIGEgbW9kdWxlIG5lZWRzIHRoZSAtbXJlbG9jYXRhYmxlIGJpdCBzZXQuICovCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1pMzcwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nICovCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQkvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0gICAgfQotCi0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotCi0gIGVsc2UJCQkJCS8qIEluY29tcGF0aWJsZSBmbGFncyAqLwotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSgiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgKGxvbmcpbmV3X2ZsYWdzLCAobG9uZylvbGRfZmxhZ3MpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEhhbmRsZSBhbiBpMzcwIHNwZWNpZmljIHNlY3Rpb24gd2hlbiByZWFkaW5nIGFuIG9iamVjdCBmaWxlLiAgVGhpcwotICAgaXMgY2FsbGVkIHdoZW4gZWxmY29kZS5oIGZpbmRzIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZS4gICovCi0vKiBYWFggaGFjayBhbGVydCBib2d1cyBUaGlzIHJvdXRpbmUgaXMgbW9zdGx5IGFsbCBqdW5rIGFuZCBhbG1vc3QKLSAqIGNlcnRhaW5seSBkb2VzIHRoZSB3cm9uZyB0aGluZy4gIEl0cyBoZXJlIHNpbXBseSBiZWNhdXNlIGl0IGRvZXMKLSAqIGp1c3QgZW5vdWdoIHRvIGFsbG93IGdsaWJjLTIuMSBsZC5zbyB0byBjb21waWxlICYgbGluay4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuZXdzZWN0ID0gaGRyLT5iZmRfc2VjdGlvbjsKLSAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QpOwotICBpZiAoaGRyLT5zaF9mbGFncyAmIFNIRl9FWENMVURFKQotICAgIGZsYWdzIHw9IFNFQ19FWENMVURFOwotCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX09SREVSRUQpCi0gICAgZmxhZ3MgfD0gU0VDX1NPUlRfRU5UUklFUzsKLQotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QsIGZsYWdzKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotDAotLyogU2V0IHVwIGFueSBvdGhlciBzZWN0aW9uIGZsYWdzIGFuZCBzdWNoIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeS4gICovCi0vKiBYWFggaGFjayBhbGVydCBib2d1cyBUaGlzIHJvdXRpbmUgaXMgbW9zdGx5IGFsbCBqdW5rIGFuZCBhbG1vc3QKLSAqIGNlcnRhaW5seSBkb2VzIHRoZSB3cm9uZyB0aGluZy4gIEl0cyBoZXJlIHNpbXBseSBiZWNhdXNlIGl0IGRvZXMKLSAqIGp1c3QgZW5vdWdoIHRvIGFsbG93IGdsaWJjLTIuMSBsZC5zbyB0byBjb21waWxlICYgbGluay4KLSAqLwotCi0KLXN0YXRpYyBib29sZWFuCi1pMzcwX2VsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBzaGRyLCBhc2VjdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKnNoZHI7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLXsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkKLSAgICBzaGRyLT5zaF9mbGFncyB8PSBTSEZfRVhDTFVERTsKLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19TT1JUX0VOVFJJRVMpICE9IDApCi0gICAgc2hkci0+c2hfdHlwZSA9IFNIVF9PUkRFUkVEOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0jaWYgMAotLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiAqLwotLyogWFhYIGhhY2sgYWxlcnQgYm9ndXMgVGhpcyByb3V0aW5lIGlzIG1vc3RseSBhbGwganVuayBhbmQgYWxtb3N0Ci0gKiBjZXJ0YWlubHkgZG9lcyB0aGUgd3JvbmcgdGhpbmcuICBJdHMgaGVyZSBzaW1wbHkgYmVjYXVzZSBpdCBkb2VzCi0gKiBqdXN0IGVub3VnaCB0byBhbGxvdyBnbGliYy0yLjEgbGQuc28gdG8gY29tcGlsZSAmIGxpbmsuCi0gKi8KLQotc3RhdGljIGVsZl9saW5rZXJfc2VjdGlvbl90ICoKLWkzNzBfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgd2hpY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0gd2hpY2g7Ci17Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdDsKLQotICAvKiBSZWNvcmQgdGhlIGZpcnN0IGJmZCBzZWN0aW9uIHRoYXQgbmVlZHMgdGhlIHNwZWNpYWwgc2VjdGlvbiAqLwotICBpZiAoIWR5bm9iaikKLSAgICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGFiZmQ7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSwgY3JlYXRlIHRoZSBzZWN0aW9uICovCi0gIGxzZWN0ID0gZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIHdoaWNoKTsKLSAgaWYgKCFsc2VjdCkKLSAgICB7Ci0gICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCBkZWZhdWx0czsKLSAgICAgIHN0YXRpYyBlbGZfbGlua2VyX3NlY3Rpb25fdCB6ZXJvX3NlY3Rpb247Ci0KLSAgICAgIGRlZmF1bHRzID0gemVyb19zZWN0aW9uOwotICAgICAgZGVmYXVsdHMud2hpY2ggPSB3aGljaDsKLSAgICAgIGRlZmF1bHRzLmhvbGVfd3JpdHRlbl9wID0gZmFsc2U7Ci0gICAgICBkZWZhdWx0cy5hbGlnbm1lbnQgPSAyOwotCi0gICAgICAvKiBCb3RoIG9mIHRoZXNlIHNlY3Rpb25zIGFyZSAodGVjaG5pY2FsbHkpIGNyZWF0ZWQgYnkgdGhlIHVzZXIKLQkgcHV0dGluZyBkYXRhIGluIHRoZW0sIHNvIHRoZXkgc2hvdWxkbid0IGJlIG1hcmtlZAotCSBTRUNfTElOS0VSX0NSRUFURUQuCi0KLQkgVGhlIGxpbmtlciBjcmVhdGVzIHRoZW0gc28gaXQgaGFzIHNvbWV3aGVyZSB0byBhdHRhY2ggdGhlaXIKLQkgcmVzcGVjdGl2ZSBzeW1ib2xzLiBJbiBmYWN0LCBpZiB0aGV5IHdlcmUgZW1wdHkgaXQgd291bGQKLQkgYmUgT0sgdG8gbGVhdmUgdGhlIHN5bWJvbCBzZXQgdG8gMCAob3IgYW55IHJhbmRvbSBudW1iZXIpLCBiZWNhdXNlCi0JIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciBzaG91bGQgbmV2ZXIgYmUgdXNlZC4gICovCi0gICAgICBkZWZhdWx0cy5mbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCXwgU0VDX0lOX01FTU9SWSk7Ci0KLSAgICAgIHN3aXRjaCAod2hpY2gpCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogVW5rbm93biBzcGVjaWFsIGxpbmtlciB0eXBlICVkIiwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJIChpbnQpd2hpY2gpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAoZWxmX2xpbmtlcl9zZWN0aW9uX3QgKikwOwotCi0JY2FzZSBMSU5LRVJfU0VDVElPTl9TREFUQToJLyogLnNkYXRhLy5zYnNzIHNlY3Rpb24gKi8KLQkgIGRlZmF1bHRzLm5hbWUJCSAgPSAiLnNkYXRhIjsKLQkgIGRlZmF1bHRzLnJlbF9uYW1lCSAgPSAiLnJlbGEuc2RhdGEiOwotCSAgZGVmYXVsdHMuYnNzX25hbWUJICA9ICIuc2JzcyI7Ci0JICBkZWZhdWx0cy5zeW1fbmFtZQkgID0gIl9TREFfQkFTRV8iOwotCSAgZGVmYXVsdHMuc3ltX29mZnNldAkgID0gMzI3Njg7Ci0JICBicmVhazsKLQotCWNhc2UgTElOS0VSX1NFQ1RJT05fU0RBVEEyOgkvKiAuc2RhdGEyLy5zYnNzMiBzZWN0aW9uICovCi0JICBkZWZhdWx0cy5uYW1lCQkgID0gIi5zZGF0YTIiOwotCSAgZGVmYXVsdHMucmVsX25hbWUJICA9ICIucmVsYS5zZGF0YTIiOwotCSAgZGVmYXVsdHMuYnNzX25hbWUJICA9ICIuc2JzczIiOwotCSAgZGVmYXVsdHMuc3ltX25hbWUJICA9ICJfU0RBMl9CQVNFXyI7Ci0JICBkZWZhdWx0cy5zeW1fb2Zmc2V0CSAgPSAzMjc2ODsKLQkgIGRlZmF1bHRzLmZsYWdzCSB8PSBTRUNfUkVBRE9OTFk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGxzZWN0ID0gX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCwgJmRlZmF1bHRzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGxzZWN0OwotfQotI2VuZGlmCi0MCi0vKiBXZSBoYXZlIHRvIGNyZWF0ZSAuZHluc2JzcyBhbmQgLnJlbGEuc2JzcyBoZXJlIHNvIHRoYXQgdGhleSBnZXQgbWFwcGVkCi0gICB0byBvdXRwdXQgc2VjdGlvbnMgKGp1c3QgbGlrZSBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBoYXMKLSAgIHRvIGNyZWF0ZSAuZHluYnNzIGFuZCAucmVsYS5ic3MpLiAgKi8KLS8qIFhYWCBoYWNrIGFsZXJ0IGJvZ3VzIFRoaXMgcm91dGluZSBpcyBtb3N0bHkgYWxsIGp1bmsgYW5kIGFsbW9zdAotICogY2VydGFpbmx5IGRvZXMgdGhlIHdyb25nIHRoaW5nLiAgSXRzIGhlcmUgc2ltcGx5IGJlY2F1c2UgaXQgZG9lcwotICoganVzdCBlbm91Z2ggdG8gYWxsb3cgZ2xpYmMtMi4xIGxkLnNvIHRvIGNvbXBpbGUgJiBsaW5rLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzcwX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmICghX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc2JzcyIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgU0VDX0FMTE9DKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbGEuc2JzcyIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAvKiB4eHggYmVhdHMgbWUsIHNlZW0gdG8gbmVlZCBhIHJlbGEudGV4dCAuLi4gKi8KLSAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbGEudGV4dCIpOwotICAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0vKiBYWFggaGFjayBhbGVydCBib2d1cyBUaGlzIHJvdXRpbmUgaXMgbW9zdGx5IGFsbCBqdW5rIGFuZCBhbG1vc3QKLSAqIGNlcnRhaW5seSBkb2VzIHRoZSB3cm9uZyB0aGluZy4gIEl0cyBoZXJlIHNpbXBseSBiZWNhdXNlIGl0IGRvZXMKLSAqIGp1c3QgZW5vdWdoIHRvIGFsbG93IGdsaWJjLTIuMSBsZC5zbyB0byBjb21waWxlICYgbGluay4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiaTM3MF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGNhbGxlZCBmb3IgJXNcbiIsCi0JICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnRleHQiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLgotCi0gICAgIE9mIGNvdXJzZSwgaWYgdGhlIHN5bWJvbCBpcyBzdWZmaWNpZW50bHkgc21hbGwsIHdlIG11c3QgaW5zdGVhZAotICAgICBhbGxvY2F0ZSBpdCBpbiAuc2Jzcy4gIEZJWE1FOiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZG8gdGhpcyBpZiBhbmQKLSAgICAgb25seSBpZiB0aGVyZSB3ZXJlIGFjdHVhbGx5IFNEQVJFTCByZWxvY3MgZm9yIHRoYXQgc3ltYm9sLiAgKi8KLQotICBpZiAoaC0+c2l6ZSA8PSBlbGZfZ3Bfc2l6ZSAoZHlub2JqKSkKLSAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zYnNzIik7Ci0gIGVsc2UKLSAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9JMzcwX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KLSAgICAgY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbGEuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgaWYgKGgtPnNpemUgPD0gZWxmX2dwX3NpemUgKGR5bm9iaikpCi0Jc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5zYnNzIik7Ci0gICAgICBlbHNlCi0Jc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiA0KQotICAgIHBvd2VyX29mX3R3byA9IDQ7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEluY3JlbWVudCB0aGUgaW5kZXggb2YgYSBkeW5hbWljIHN5bWJvbCBieSBhIGdpdmVuIGFtb3VudC4gIENhbGxlZAotICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotLyogWFhYIGhhY2sgYWxlcnQgYm9ndXMgVGhpcyByb3V0aW5lIGlzIG1vc3RseSBhbGwganVuayBhbmQgYWxtb3N0Ci0gKiBjZXJ0YWlubHkgZG9lcyB0aGUgd3JvbmcgdGhpbmcuICBJdHMgaGVyZSBzaW1wbHkgYmVjYXVzZSBpdCBkb2VzCi0gKiBqdXN0IGVub3VnaCB0byBhbGxvdyBnbGliYy0yLjEgbGQuc28gdG8gY29tcGlsZSAmIGxpbmsuCi0gKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzNzBfZWxmX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBjcGFyZzsKLXsKLSAgaW50ICpjcCA9IChpbnQgKikgY3Bhcmc7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgImkzNzBfZWxmX2FkanVzdF9keW5pbmR4IGNhbGxlZCwgaC0+ZHluaW5keCA9ICVkLCAqY3AgPSAlZFxuIiwKLQkgICBoLT5keW5pbmR4LCAqY3ApOwotI2VuZGlmCi0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotLyogWFhYIGhhY2sgYWxlcnQgYm9ndXMgVGhpcyByb3V0aW5lIGlzIG1vc3RseSBhbGwganVuayBhbmQgYWxtb3N0Ci0gKiBjZXJ0YWlubHkgZG9lcyB0aGUgd3JvbmcgdGhpbmcuICBJdHMgaGVyZSBzaW1wbHkgYmVjYXVzZSBpdCBkb2VzCi0gKiBqdXN0IGVub3VnaCB0byBhbGxvdyBnbGliYy0yLjEgbGQuc28gdG8gY29tcGlsZSAmIGxpbmsuCi0gKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzNzBfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgImkzNzBfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyBjYWxsZWRcbiIpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3QsIC5yZWxhLnNkYXRhLCBhbmQKLQkgLnJlbGEuc2RhdGEyIHNlY3Rpb25zLiAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUKLQkgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbCBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldAotCSB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsIGV0IGFsLCB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldAotCSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZSBiZWxvdy4gICovCi0gICAgICBzdGF0aWMgY2hhciAqcmVsYV9zZWN0aW9uc1tdID0geyAiLnJlbGEuZ290IiwgIi5yZWxhLnNkYXRhIiwKLQkJCQkgICAgICAgIi5yZWxhLnNkYXRhMiIsICIucmVsYS5zYnNzIiwKLQkJCQkgICAgICAgKGNoYXIgKikwIH07Ci0gICAgICBjaGFyICoqcDsKLQotICAgICAgZm9yIChwID0gcmVsYV9zZWN0aW9uczsgKnAgIT0gKGNoYXIgKikwOyBwKyspCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICpwKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIHMtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLwotCSAgICAgIHBsdCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2NhdGlvbiBzZWN0aW9ucy4gKi8KLQkgICAgICByZWxvY3MgPSB0cnVlOwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZ290IikgIT0gMAotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5zZGF0YTIiKSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIGFzZWN0aW9uICoqc3BwOwotCi0JICBmb3IgKHNwcCA9ICZzLT5vdXRwdXRfc2VjdGlvbi0+b3duZXItPnNlY3Rpb25zOwotCSAgICAgICAqc3BwICE9IHMtPm91dHB1dF9zZWN0aW9uOwotCSAgICAgICBzcHAgPSAmKCpzcHApLT5uZXh0KQotCSAgICA7Ci0JICAqc3BwID0gcy0+b3V0cHV0X3NlY3Rpb24tPm5leHQ7Ci0JICAtLXMtPm91dHB1dF9zZWN0aW9uLT5vd25lci0+c2VjdGlvbl9jb3VudDsKLQotCSAgY29udGludWU7Ci0JfQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBpMzcwX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxvY3MpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCQlzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgZ2VuZXJhdGUgYSBzZWN0aW9uCi0gICAgIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbi4gIFRoZXNlIGFyZSBsb2NhbCBzeW1ib2xzLCB3aGljaAotICAgICBtZWFucyB0aGF0IHRoZXkgbXVzdCBjb21lIGZpcnN0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLSAgICAgVGhhdCBtZWFucyB3ZSBtdXN0IGluY3JlbWVudCB0aGUgZHluYW1pYyBzeW1ib2wgaW5kZXggb2YgZXZlcnkKLSAgICAgb3RoZXIgZHluYW1pYyBzeW1ib2wuCi0KLSAgICAgRklYTUU6IFdlIGFzc3VtZSB0aGF0IHRoZXJlIHdpbGwgbmV2ZXIgYmUgcmVsb2NhdGlvbnMgdG8KLSAgICAgbG9jYXRpb25zIGluIGxpbmtlci1jcmVhdGVkIHNlY3Rpb25zIHRoYXQgZG8gbm90IGhhdmUKLSAgICAgZXh0ZXJuYWxseS12aXNpYmxlIG5hbWVzLiBJbnN0ZWFkLCB3ZSBzaG91bGQgd29yayBvdXQgcHJlY2lzZWx5Ci0gICAgIHdoaWNoIHNlY3Rpb25zIHJlbG9jYXRpb25zIGFyZSB0YXJnZXR0ZWQgYXQuICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGludCBjOwotCi0gICAgICBmb3IgKGMgPSAwLCBzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMAotCSAgICAgIHx8IChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgewotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gLTE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhlc2Ugc3ltYm9scyB3aWxsIGhhdmUgbm8gbmFtZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLQkgICAgIGZpZGRsZSB3aXRoIGR5bnN0cl9pbmRleC4gICovCi0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gYyArIDE7Ci0KLQkgIGMrKzsKLQl9Ci0KLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIGkzNzBfZWxmX2FkanVzdF9keW5pbmR4LAotCQkJICAgICAgKFBUUikgJmMpOwotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0vKiBYWFggaGFjayBhbGVydCBib2d1cyBUaGlzIHJvdXRpbmUgaXMgbW9zdGx5IGFsbCBqdW5rIGFuZCBhbG1vc3QKLSAqIGNlcnRhaW5seSBkb2VzIHRoZSB3cm9uZyB0aGluZy4gIEl0cyBoZXJlIHNpbXBseSBiZWNhdXNlIGl0IGRvZXMKLSAqIGp1c3QgZW5vdWdoIHRvIGFsbG93IGdsaWJjLTIuMSBsZC5zbyB0byBjb21waWxlICYgbGluay4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiaTM3MF9lbGZfY2hlY2tfcmVsb2NzIGNhbGxlZCBmb3Igc2VjdGlvbiAlcyBpbiAlc1xuIiwKLQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0jZW5kaWYKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBpZiAoaW5mby0+c2hhcmVkKQotCXsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAiaTM3MF9lbGZfY2hlY2tfcmVsb2NzIG5lZWRzIHRvIGNyZWF0ZSByZWxvY2F0aW9uIGZvciAlc1xuIiwKLQkJICAgKGggJiYgaC0+cm9vdC5yb290LnN0cmluZykKLQkJICAgPyBoLT5yb290LnJvb3Quc3RyaW5nIDogIjx1bmtub3duPiIpOwotI2VuZGlmCi0JICBpZiAoc3JlbG9jID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgIChhYmZkLAotCQkgICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCSAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIG5hbWUgKyA1KSA9PSAwKTsKLQotCSAgICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgIGZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkgIC8qIEZJWE1FOiBXZSBzaG91bGQgaGVyZSBkbyB3aGF0IHRoZSBtNjhrIGFuZCBpMzg2Ci0JICAgICBiYWNrZW5kcyBkbzogaWYgdGhlIHJlbG9jIGlzIHBjLXJlbGF0aXZlLCByZWNvcmQgaXQKLQkgICAgIGluIGNhc2UgaXQgdHVybnMgb3V0IHRoYXQgdGhlIHJlbG9jIGlzIHVubmVjZXNzYXJ5Ci0JICAgICBiZWNhdXNlIHRoZSBzeW1ib2wgaXMgZm9yY2VkIGxvY2FsIGJ5IHZlcnNpb25pbmcgb3IKLQkgICAgIHdlIGFyZSBsaW5raW5nIHdpdGggLUJkeW5hbWljLiAgRm9ydHVuYXRlbHkgdGhpcwotCSAgICAgY2FzZSBpcyBub3QgZnJlcXVlbnQuICAqLwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0vKiBYWFggaGFjayBhbGVydCBib2d1cyBUaGlzIHJvdXRpbmUgaXMgbW9zdGx5IGFsbCBqdW5rIGFuZCBhbG1vc3QKLSAqIGNlcnRhaW5seSBkb2VzIHRoZSB3cm9uZyB0aGluZy4gIEl0cyBoZXJlIHNpbXBseSBiZWNhdXNlIGl0IGRvZXMKLSAqIGp1c3QgZW5vdWdoIHRvIGFsbG93IGdsaWJjLTIuMSBsZC5zbyB0byBjb21waWxlICYgbGluay4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzZHluOwotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJpMzcwX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBjYWxsZWRcbiIpOwotI2VuZGlmCi0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYm9vbGVhbiBzaXplOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6ICAgbmFtZSA9ICIucGx0IjsJICBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSB0cnVlOyAgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgZGVmYXVsdDoJICAgICAgbmFtZSA9IE5VTEw7CSAgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAobmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGlmIChzID09IE5VTEwpCi0JCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBzaXplKQotCQkgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBZGQgYSBibHJsIGluc3RydWN0aW9uIGF0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy00IHNvIHRoYXQgYSBmdW5jdGlvbiBjYW4KLSAgICAgZWFzaWx5IGZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4gICovCi0vKiBYWFggdGhpcyBpcyBjbGVhcmx5IHZlcnkgd3JvbmcgZm9yIHRoZSAzNzAgYXJjaCAqLwotICBpZiAoc2dvdCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50cyA9IHNnb3QtPmNvbnRlbnRzOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg0ZTgwMDAyMSAvKiBibHJsICovLCBjb250ZW50cyk7Ci0KLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIGNvbnRlbnRzKzQpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIGNvbnRlbnRzKzQpOwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotICAgIH0KLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZHluc3ltOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBtYXhkaW5keCA9IDA7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLQotICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOwotCi0gICAgICBzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLSAgICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGludCBpbmR4LCBkaW5keDsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgZGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keDsKLQkgIGlmIChkaW5keCAhPSAtMSkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQoaW5keCA+IDApOwotCSAgICAgIEJGRF9BU1NFUlQoZGluZHggPiAwKTsKLQotCSAgICAgIGlmIChkaW5keCA+IG1heGRpbmR4KQotCQltYXhkaW5keCA9IGRpbmR4OwotCi0JICAgICAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZzeW0sCi0JCQkJCSAoUFRSKSAoKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCQkJCSBzZHluc3ltLT5jb250ZW50cykKLQkJCQkJCSsgZGluZHgpKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogU2V0IHRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBvdXRwdXQgLmR5bnN5bSBzZWN0aW9uIHRvIHRoZQotICAgICAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCBzeW1ib2wuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQltYXhkaW5keCArIDE7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlcgotICAgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uLgotCi0gICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgemVyby4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlIHJlbG9jIGFkZGVuZCBhcwotICAgbmVjZXNzYXJ5LgotCi0gICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdF9zaG5keCBmaWVsZCBvZiBlYWNoIGxvY2FsIHN5bWJvbC4KLQotICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlCi0gICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYWRkZW5kIG11c3QgYmUgYWRqdXN0ZWQKLSAgIGFjY29yZGluZ2x5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzNzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcgkJICA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBiZmQgKmR5bm9iagkJCQkgID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwJCSAgPSByZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQJCSAgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYXNlY3Rpb24gKnNyZWxvYwkJCSAgPSBOVUxMOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYm9vbGVhbiByZXQJCQkJICA9IHRydWU7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJpMzcwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbGxlZCBmb3IgJXMgc2VjdGlvbiAlcywgJWxkIHJlbG9jYXRpb25zJXNcbiIsCi0JICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICBiZmRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JICAgKGxvbmcpaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQsCi0JICAgKGluZm8tPnJlbG9jYXRlYWJsZSkgPyAiIChyZWxvY2F0YWJsZSkiIDogIiIpOwotI2VuZGlmCi0KLSAgaWYgKCFpMzcwX2VsZl9ob3d0b190YWJsZVsgUl9JMzcwX0FERFIzMSBdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIGkzNzBfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgZW51bSBpMzcwX3JlbG9jX3R5cGUgcl90eXBlCT0gKGVudW0gaTM3MF9yZWxvY190eXBlKUVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgYmZkX3ZtYSBvZmZzZXQJCQk9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBiZmRfdm1hIGFkZGVuZAkJCT0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByCQk9IGJmZF9yZWxvY19vdGhlcjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bQkJPSAoRWxmX0ludGVybmFsX1N5bSAqKTA7Ci0gICAgICBhc2VjdGlvbiAqc2VjCQkJPSAoYXNlY3Rpb24gKikwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgJPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikwOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWUJCT0gKGNvbnN0IGNoYXIgKikwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gICAgICAvKiBVbmtub3duIHJlbG9jYXRpb24gaGFuZGxpbmcgKi8KLSAgICAgIGlmICgodW5zaWduZWQpcl90eXBlID49ICh1bnNpZ25lZClSX0kzNzBfbWF4Ci0JICB8fCAhaTM3MF9lbGZfaG93dG9fdGFibGVbKGludClyX3R5cGVdKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCIsCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaG93dG8gPSBpMzcwX2VsZl9ob3d0b190YWJsZVsoaW50KXJfdHlwZV07Ci0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKCh1bnNpZ25lZClFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIlx0dHlwZSA9ICVzICglZCksIHN5bWJvbCBpbmRleCA9ICVsZCwgb2Zmc2V0ID0gJWxkLCBhZGRlbmQgPSAlbGRcbiIsCi0JCSAgIGhvd3RvLT5uYW1lLAotCQkgICAoaW50KXJfdHlwZSwKLQkJICAgcl9zeW1uZHgsCi0JCSAgIChsb25nKW9mZnNldCwKLQkJICAgKGxvbmcpYWRkZW5kKTsKLSNlbmRpZgotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHN5bV9uYW1lID0gIjxsb2NhbCBzeW1ib2w+IjsKLQotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBzeW1fbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgaWYgKGluZm8tPnNoYXJlZAotCQkgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JCSAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgJiYgKHJfdHlwZSA9PSBSX0kzNzBfQUREUjMxCi0JCSAgICAgIHx8IHJfdHlwZSA9PSBSX0kzNzBfQ09QWQotCQkgICAgICB8fCByX3R5cGUgPT0gUl9JMzcwX0FERFIxNgotCQkgICAgICB8fCByX3R5cGUgPT0gUl9JMzcwX1JFTEFUSVZFKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgIG9ic2N1cmUgY2FzZXMgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICAqLwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpKGluZm8sCi0JCQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkJICAgaW5wdXRfYmZkLAotCQkJCQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSAgIHJlbC0+cl9vZmZzZXQsCi0JCQkJCQkgICB0cnVlKTsKLQkgICAgICByZXQgPSBmYWxzZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoICgoaW50KXJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCBmb3Igc3ltYm9sICVzIiwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgKGludClyX3R5cGUsIHN5bV9uYW1lKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCi0JLyogUmVsb2NhdGlvbnMgdGhhdCBtYXkgbmVlZCB0byBiZSBwcm9wYWdhdGVkIGlmIHRoaXMgaXMgYSBzaGFyZWQKLSAgICAgICAgICAgb2JqZWN0LiAgKi8KLQljYXNlIChpbnQpUl9JMzcwX1JFTDMxOgotCSAgLyogSWYgdGhlc2UgcmVsb2NhdGlvbnMgYXJlIG5vdCB0byBhIG5hbWVkIHN5bWJvbCwgdGhleSBjYW4gYmUKLQkgICAgIGhhbmRsZWQgcmlnaHQgaGVyZSwgbm8gbmVlZCB0byBib3RoZXIgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCS8qIFJlbG9jYXRpb25zIHRoYXQgYWx3YXlzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCBpZiB0aGlzIGlzIGEgc2hhcmVkCi0gICAgICAgICAgIG9iamVjdC4gICovCi0JY2FzZSAoaW50KVJfSTM3MF9OT05FOgotCWNhc2UgKGludClSX0kzNzBfQUREUjMxOgotCWNhc2UgKGludClSX0kzNzBfQUREUjE2OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgICBib29sZWFuIHNraXA7Ci0KLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgICJpMzcwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIG5lZWRzIHRvIGNyZWF0ZSByZWxvY2F0aW9uIGZvciAlc1xuIiwKLQkJICAgICAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iKTsKLSNlbmRpZgotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLSAgICAgICAgICAgICAgICAgdGltZS4gICovCi0KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChpbnB1dF9iZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQl9Ci0KLQkgICAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF92bWEgb2ZmOwotCi0JCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCX0KLQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChza2lwKQotCQltZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLSAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KLQkgICAgICBlbHNlIGlmIChoICE9IE5VTEwKLQkJICAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgcl90eXBlKTsKLQkJICBvdXRyZWwucl9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJfdHlwZSA9PSBSX0kzNzBfQUREUjMxKQotCQkgICAgewotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0kzNzBfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQkgICAgICB8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0JCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCX0KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCWluZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQkJCSAgQkZEX0FTU0VSVChpbmR4ID4gMCk7Ci0jaWZkZWYgREVCVUcKLQkJCSAgaWYgKGluZHggPD0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBwcmludGYoImluZHg9JWQgc2VjdGlvbj0lcyBmbGFncz0lMDh4IG5hbWU9JXNcbiIsCi0JCQkJICAgICBpbmR4LCBvc2VjLT5uYW1lLCBvc2VjLT5mbGFncywKLQkJCQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkJICAgIH0KLSNlbmRpZgotCQkJfQotCi0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIHJfdHlwZSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCSAgICAgIC8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCi0gICAgICAgICAgICAgICAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCi0gICAgICAgICAgICAgICAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChza2lwCi0JCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgfHwgRUxGMzJfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX0kzNzBfUkVMQVRJVkUpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgKGludClSX0kzNzBfQ09QWToKLQljYXNlIChpbnQpUl9JMzcwX1JFTEFUSVZFOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6IFJlbG9jYXRpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHN5bWJvbCAlcy4iLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSBpMzcwX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS0+bmFtZSwKLQkJCQkgc3ltX25hbWUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0KLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBuYW1lID0gJXMsIHN5bWJvbCBpbmRleCA9ICVsZCwgb2Zmc2V0ID0gJWxkLCBhZGRlbmQgPSAlbGRcbiIsCi0JICAgICAgIGhvd3RvLT5uYW1lLAotCSAgICAgICAoaW50KXJfdHlwZSwKLQkgICAgICAgc3ltX25hbWUsCi0JICAgICAgIHJfc3ltbmR4LAotCSAgICAgICAobG9uZylvZmZzZXQsCi0JICAgICAgIChsb25nKWFkZGVuZCk7Ci0jZW5kaWYKLQotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCi0JCQkJICAgIGlucHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsCi0JCQkJICAgIG9mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwKLQkJCQkgICAgYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHJldCA9IGZhbHNlOwotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgICBzeW0tPnN0X25hbWUpOwotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQotCQkoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpKGluZm8sCi0JCQkJCQkgICBuYW1lLAotCQkJCQkJICAgaG93dG8tPm5hbWUsCi0JCQkJCQkgICAoYmZkX3ZtYSkgMCwKLQkJCQkJCSAgIGlucHV0X2JmZCwKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICBvZmZzZXQpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICB9Ci0JfQotICAgIH0KLQotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pMzcwX2VsZl9wb3N0X3Byb2Nlc3NfaGVhZGVycyAoYWJmZCwgbGlua19pbmZvKQotICAgIGJmZCAqIGFiZmQ7Ci0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgRWxmX0ludGVybmFsX0VoZHIgKiBpX2VoZHJwOyAgLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX09TQUJJXSA9IEVMRk9TQUJJX0xJTlVYOwotfQotDAotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX2kzNzBfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWkzNzAiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9pMzcwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUzM3MAotI2lmZGVmIEVNX0kzNzBfT0xECi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEJRU1fSTM3MF9PTEQKLSNlbmRpZgotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwlpMzcwX2VsZl9pbmZvX3RvX2hvd3RvCi0KLQotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQgNAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCWkzNzBfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCWkzNzBfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCWkzNzBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEJaTM3MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlpMzcwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIGR5bmFtaWMgbG9hZGVyIHN1cHBvcnQgaXMgbW9zdGx5IGJyb2tlbjsganVzdCBlbm91Z2ggaGVyZSB0byBiZSBhYmxlIHRvCi0gKiBsaW5rIGdsaWJjJ3MgbGQuc28gd2l0aG91dCBlcnJvcnMuCi0gKi8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMJaTM3MF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCWkzNzBfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwlpMzcwX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCQlpMzcwX2VsZl9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCQlpMzcwX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wJaTM3MF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwkJaTM3MF9lbGZfY2hlY2tfcmVsb2NzCi0KLS8qCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJaTM3MF9lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAlpMzcwX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMJaTM3MF9lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCQlpMzcwX2VsZl9tb2RpZnlfc2VnbWVudF9tYXAKLSovCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMJaTM3MF9lbGZfcG9zdF9wcm9jZXNzX2hlYWRlcnMKLQotaW50IGkzNzBfbm9vcCgpCi17Ci0gIHJldHVybiAxOwotfQotCi0vKiB3ZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBhdCBsZWFzdCBhcyBuby1vcHMgdG8gbGluayBnbGliYyBsZC5zbyAqLwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayBcCi0gIChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgXAotCQkJY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBcCi0JCQlhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSkpIAkJaTM3MF9ub29wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0gIChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgXAotCQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgXAotCQkJRWxmX0ludGVybmFsX1N5bSAqKSkpCQkJaTM3MF9ub29wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIFwKLSAgKGludCAoKikgUEFSQU1TICgoYmZkICopKSkJCQkJCWkzNzBfbm9vcAotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAgXAotICAoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICopKSkJCQkJaTM3MF9ub29wCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1pMzg2LmMgYi9iZmQvZWxmMzItaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVmYmE4Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTU1ICswLDAgQEAKLS8qIEludGVsIDgwMzg2LzgwNDg2LXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCA5NC05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIGVsZl9pMzg2X2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbGZfaTM4Nl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotI2RlZmluZSBVU0VfUkVMCTEJCS8qIDM4NiB1c2VzIFJFTCByZWxvY2F0aW9ucyBpbnN0ZWFkIG9mIFJFTEEgKi8KLQotI2luY2x1ZGUgImVsZi9pMzg2LmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9ob3d0b190YWJsZVtdPQotewotICBIT1dUTyhSXzM4Nl9OT05FLAkgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfTk9ORSIsCSAgICB0cnVlLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCxmYWxzZSksCi0gIEhPV1RPKFJfMzg2XzMyLAkgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfMzIiLAkgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9QQzMyLAkgMCwyLDMyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUEMzMiIsCSAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl8zODZfR09UMzIsCSAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HT1QzMiIsICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUExUMzIsCSAwLDIsMzIsdHJ1ZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BMVDMyIiwgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfMzg2X0NPUFksICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfQ09QWSIsCSAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X0dMT0JfREFULCAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfR0xPQl9EQVQiLCB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X0pVTVBfU0xPVCwgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfSlVNUF9TTE9UIix0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1JFTEFUSVZFLCAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUkVMQVRJVkUiLCB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X0dPVE9GRiwgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfR09UT0ZGIiwgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X0dPVFBDLCAgICAgMCwyLDMyLHRydWUsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HT1RQQyIsICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLHRydWUpLAotICBFTVBUWV9IT1dUTyAoMTEpLAotICBFTVBUWV9IT1dUTyAoMTIpLAotICBFTVBUWV9IT1dUTyAoMTMpLAotICBFTVBUWV9IT1dUTyAoMTQpLAotICBFTVBUWV9IT1dUTyAoMTUpLAotICBFTVBUWV9IT1dUTyAoMTYpLAotICBFTVBUWV9IT1dUTyAoMTcpLAotICBFTVBUWV9IT1dUTyAoMTgpLAotICBFTVBUWV9IT1dUTyAoMTkpLAotICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLSAgSE9XVE8oUl8zODZfMTYsCSAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl8xNiIsCSAgICB0cnVlLDB4ZmZmZiwweGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9QQzE2LAkgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUEMxNiIsCSAgICB0cnVlLDB4ZmZmZiwweGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfMzg2XzgsCSAwLDAsOCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2XzgiLAkgICAgdHJ1ZSwweGZmLDB4ZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9QQzgsCSAwLDAsOCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzgiLAkgICAgdHJ1ZSwweGZmLDB4ZmYsdHJ1ZSksCi19OwotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0byA9Ci0gIEhPV1RPIChSXzM4Nl9HTlVfVlRJTkhFUklULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSXzM4Nl9HTlVfVlRJTkhFUklUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsKLQotLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfMzg2X0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl8zODZfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwotCi0jaWZkZWYgREVCVUdfR0VOX1JFTE9DCi0jZGVmaW5lIFRSQUNFKHN0cikgZnByaW50ZiAoc3RkZXJyLCAiaTM4NiBiZmQgcmVsb2MgbG9va3VwICVkICglcylcbiIsIGNvZGUsIHN0cikKLSNlbHNlCi0jZGVmaW5lIFRSQUNFKHN0cikKLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19OT05FIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9OT05FIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzMyIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl8zMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX0NUT1IiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2XzMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX1BDMzIiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X1BDMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1QzMjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HT1QzMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR09UMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9QTFQzMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfUExUMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9DT1BZOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0NPUFkiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0NPUFkgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR0xPQl9EQVQgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1Q6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfSlVNUF9TTE9UIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9KVU1QX1NMT1QgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9SRUxBVElWRToKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9SRUxBVElWRSIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfUkVMQVRJVkUgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RPRkY6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR09UT0ZGIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9HT1RPRkYgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RQQzoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HT1RQQyIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR09UUEMgXTsKLQotICAgICAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbi4gICovCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18xNiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfMTZdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18xNl9QQ1JFTCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfUEMxNl07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfOCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfOF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfOF9QQ1JFTCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfUEM4XTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQiKTsKLSAgICAgIHJldHVybiAmZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19WVEFCTEVfRU5UUlkiKTsKLSAgICAgIHJldHVybiAmZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBUUkFDRSAoIlVua25vd24iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfaTM4Nl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkCQkqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50CQkqY2FjaGVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGVudW0gZWxmX2kzODZfcmVsb2NfdHlwZSB0eXBlOwotCi0gIHR5cGUgPSAoZW51bSBlbGZfaTM4Nl9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgaWYgKHR5cGUgPT0gUl8zODZfR05VX1ZUSU5IRVJJVCkKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvOwotICBlbHNlIGlmICh0eXBlID09IFJfMzg2X0dOVV9WVEVOVFJZKQotICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvOwotICBlbHNlIGlmICh0eXBlIDwgUl8zODZfbWF4Ci0JICAgJiYgKHR5cGUgPCBGSVJTVF9JTlZBTElEX1JFTE9DIHx8IHR5cGUgPiBMQVNUX0lOVkFMSURfUkVMT0MpKQotICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHR5cGVdOwotICBlbHNlCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogaW52YWxpZCByZWxvY2F0aW9uIHR5cGUgJWQiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIChpbnQpIHR5cGUpOwotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfTk9ORV07Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBsYWJlbC4gIFRoZSBVbml4V2FyZQotICAgMi4xIGNjIGdlbmVyYXRlcyB0ZW1wb3Jhcnkgc3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggLlgsIHNvIHdlCi0gICByZWNvZ25pemUgdGhlbSBoZXJlLiAgRklYTUU6IGRvIG90aGVyIFNWUjQgY29tcGlsZXJzIGFsc28gdXNlIC5YPy4KLSAgIElmIHNvLCB3ZSBzaG91bGQgbW92ZSB0aGUgLlggcmVjb2duaXRpb24gaW50bwotICAgX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdYJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBpMzg2IEVMRiBsaW5rZXIuICAqLwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGliYy5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDE2Ci0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhbiBhYnNvbHV0ZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rcyBsaWtlCi0gICB0aGlzLiAgU2VlIHRoZSBTVlI0IEFCSSBpMzg2IHN1cHBsZW1lbnQgdG8gc2VlIGhvdyB0aGlzIHdvcmtzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BsdDBfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHgzNSwJLyogcHVzaGwgY29udGVudHMgb2YgYWRkcmVzcyAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgLmdvdCArIDQuICAqLwotICAweGZmLCAweDI1LAkvKiBqbXAgaW5kaXJlY3QgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBhZGRyZXNzIG9mIC5nb3QgKyA4LiAgKi8KLSAgMCwgMCwgMCwgMAkvKiBwYWQgb3V0IHRvIDE2IGJ5dGVzLiAgKi8KLX07Ci0KLS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBhbiBhYnNvbHV0ZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UKLSAgIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4ZmYsIDB4MjUsCS8qIGptcCBpbmRpcmVjdCAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgdGhpcyBzeW1ib2wgaW4gLmdvdC4gICovCi0gIDB4NjgsCQkvKiBwdXNobCBpbW1lZGlhdGUgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLSAgMHhlOSwJCS8qIGptcCByZWxhdGl2ZSAqLwotICAwLCAwLCAwLCAwCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLwotfTsKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgUElDIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZSB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4ZmYsIDB4YjMsIDQsIDAsIDAsIDAsCS8qIHB1c2hsIDQoJWVieCkgKi8KLSAgMHhmZiwgMHhhMywgOCwgMCwgMCwgMCwJLyogam1wICo4KCVlYngpICovCi0gIDAsIDAsIDAsIDAJCQkvKiBwYWQgb3V0IHRvIDE2IGJ5dGVzLiAgKi8KLX07Ci0KLS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBhIFBJQyBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9waWNfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4ZmYsIDB4YTMsCS8qIGptcCAqb2Zmc2V0KCVlYngpICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IG9mIHRoaXMgc3ltYm9sIGluIC5nb3QuICAqLwotICAweDY4LAkJLyogcHVzaGwgaW1tZWRpYXRlICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4ZTksCQkvKiBqbXAgcmVsYXRpdmUgKi8KLSAgMCwgMCwgMCwgMAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLX07Ci0KLS8qIFRoZSBpMzg2IGxpbmtlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHRoYXQgaXQKLSAgIGRlY2lkZXMgdG8gY29weSBpbiBjaGVja19yZWxvY3MgZm9yIGVhY2ggc3ltYm9sLiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBpdCBjYW4gZGlzY2FyZCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgaXQgZG9lc24ndCBuZWVkIHRoZW0gd2hlbgotICAgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMuICBXZSBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWVsZAotICAgZXh0ZW5kaW5nIHRoZSByZWd1bGFyIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIHdlCi0gICBoYXZlIGNvcGllZCBmb3IgYSBnaXZlbiBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZAotewotICAvKiBOZXh0IHNlY3Rpb24uICAqLwotICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqbmV4dDsKLSAgLyogQSBzZWN0aW9uIGluIGR5bm9iai4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwotICAvKiBOdW1iZXIgb2YgcmVsb2NzIGNvcGllZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotfTsKLQotLyogaTM4NiBFTEYgbGlua2VyIGhhc2ggZW50cnkuICAqLwotCi1zdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogTnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci19OwotCi0vKiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIERlY2xhcmUgdGhpcyBub3cgdGhhdCB0aGUgYWJvdmUgc3RydWN0dXJlcyBhcmUgZGVmaW5lZC4gICovCi0KLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIFRyYXZlcnNlIGFuIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgZWxmX2kzODZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGZfaTM4Nl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcmVsZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIC8qIFNvbWUgcmVsb2NzIHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQl7Ci0JICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgUl8zODZfR09UMzI6Ci0JICAgIGNhc2UgUl8zODZfR09UT0ZGOgotCSAgICBjYXNlIFJfMzg2X0dPVFBDOgotCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfMzg2X0dPVDMyOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLSAgICAgCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCXsKLQkJICBzaXplX3Qgc2l6ZTsKLQkJICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLQotCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfdm1hKTsKLQkJICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOwotCQkgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfaGRyLT5zaF9pbmZvOyBpKyspCi0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tpXSA9IChiZmRfdm1hKSAtMTsKLQkJfQotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYSBSXzM4Nl9SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZSBkeW5hbWljCi0gICAgICAgICAgICAgICAgICAgICBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkJfQotCSAgICB9Ci0KLQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCi0JICBicmVhazsKLQotCWNhc2UgUl8zODZfUExUMzI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aGljaCBpcwotICAgICAgICAgICAgIG5ldmVyIHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgaW4gd2hpY2ggY2FzZSB3ZQotICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQotICAgICAgICAgICAgIGFmdGVyIGFsbC4gICovCi0KLQkgIC8qIElmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wsIHdlIHJlc29sdmUgaXQgZGlyZWN0bHkgd2l0aG91dAotICAgICAgICAgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl8zMjoKLQljYXNlIFJfMzg2X1BDMzI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX05PTl9HT1RfUkVGOwotCi0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoaXMgaXMgYSByZWxvYwotICAgICAgICAgICAgIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBvciBhIG5vbiBQQyByZWxhdGl2ZSByZWxvYwotICAgICAgICAgICAgIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIHRoZW4gd2UgbmVlZCB0byBjb3B5IHRoZSByZWxvYwotICAgICAgICAgICAgIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgSG93ZXZlciwgaWYgd2UgYXJlIGxpbmtpbmcgd2l0aAotICAgICAgICAgICAgIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkgYSByZWxvYyBhZ2FpbnN0IGEKLSAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZQotICAgICAgICAgICAgIGluY2x1ZGluZyBpbiB0aGUgbGluayAoaS5lLiwgREVGX1JFR1VMQVIgaXMgc2V0KS4gIEF0Ci0gICAgICAgICAgICAgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzCi0gICAgICAgICAgICAgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQgd2lsbCBiZSBzZXQKLSAgICAgICAgICAgICBsYXRlciAoaXQgaXMgbmV2ZXIgY2xlYXJlZCkuICBXZSBhY2NvdW50IGZvciB0aGF0Ci0gICAgICAgICAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgICAgICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICAgICYmIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSAhPSBSXzM4Nl9QQzMyCi0JCSAgfHwgKGggIT0gTlVMTAotCQkgICAgICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotICAgICAgICAgICAgICAgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoaXMgcmVsb2MuICAqLwotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNCkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKLQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCQlmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGFuZCB0aGlzIGlzIGEKLSAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbCwgd2UgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZQotICAgICAgICAgICAgICAgICByZWxvY2F0aW9ucyB3ZSBoYXZlIGVudGVyZWQgZm9yIHRoaXMgc3ltYm9sLCBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgIHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbgotICAgICAgICAgICAgICAgICBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgdXNpbmcgYW4gZWxmX2kzODYgbGlua2VyCi0gICAgICAgICAgICAgICAgIGhhc2ggdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgaCBpcyByZWFsbHkgYSBwb2ludGVyIHRvCi0gICAgICAgICAgICAgICAgIGFuIGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeS4gICovCi0JICAgICAgaWYgKGggIT0gTlVMTCAmJiBpbmZvLT5zeW1ib2xpYwotCQkgICYmIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfMzg2X1BDMzIpCi0JCXsKLQkJICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICplaDsKLQkJICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqcDsKLQotCQkgIGVoID0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCQkgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQotCQkgICAgICBicmVhazsKLQotCQkgIGlmIChwID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHAgPSAoKHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICopCi0JCQkgICBiZmRfYWxsb2MgKGR5bm9iaiwgc2l6ZW9mICpwKSk7Ci0JCSAgICAgIGlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHAtPm5leHQgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsKLQkJICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOwotCQkgICAgICBwLT5jb3VudCA9IDA7Ci0JCSAgICB9Ci0KLQkJICArK3AtPmNvdW50OwotCQl9Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfMzg2X0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzM4Nl9HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZl9pMzg2X2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfMzg2X0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSXzM4Nl9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qID8/PyBJdCB3b3VsZCBzZWVtIHRoYXQgdGhlIGV4aXN0aW5nIGkzODYgY29kZSBkb2VzIG5vIHNvcnQKLSAgICAgb2YgcmVmZXJlbmNlIGNvdW50aW5nIG9yIHdoYXRub3Qgb24gaXRzIEdPVCBhbmQgUExUIGVudHJpZXMsCi0gICAgIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBnYXJiYWdlIGNvbGxlY3QgdGhlbSBhdCB0aGlzIHRpbWUuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgUExUMzIgcmVsb2MgaW4gYW4gaW5wdXQKLSAgICAgICAgICAgICBmaWxlLCBidXQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgcmVmZXJyZWQgdG8gYnkgYSBkeW5hbWljCi0gICAgICAgICAgICAgb2JqZWN0LiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQKLSAgICAgICAgICAgICBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBQQzMyCi0gICAgICAgICAgICAgcmVsb2MgaW5zdGVhZC4gICovCi0JICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgLnBsdCBlbnRyeSwgbWFrZSByb29tIGZvciB0aGUgc3BlY2lhbAotCSBmaXJzdCBlbnRyeS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCX0KLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5nb3QucGx0IHNlY3Rpb24sIHdoaWNoCi0JIHdpbGwgYmUgcGxhY2VkIGluIHRoZSAuZ290IHNlY3Rpb24gYnkgdGhlIGxpbmtlciBzY3JpcHQuICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sIHRoYXQgZG8gbm90IHVzZSB0aGUKLSAgICAgR09ULCB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgY29weSByZWxvYy4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX05PTl9HT1RfUkVGKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSXzM4Nl9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWwuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWwuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsLmdvdCwKLSAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0gICAgICAgICBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIHNoYXJlZCBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBhbGwKLSAgICAgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCi0gICAgIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZQotICAgICB3aWxsIG5vdCBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQgJiYgaW5mby0+c3ltYm9saWMpCi0gICAgZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaTM4Nl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMsCi0JCQkJIChQVFIpIE5VTEwpOwotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKLSAgICAgICAgICAgICAgICAgY29tbWVudCBiZWxvdy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KLQkgICAgICBwbHQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbC5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGJvdGggc2VjdGlvbnMgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIHRoZXkgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvYyBzZWN0aW9ucyBvdGhlcgotICAgICAgICAgICAgICAgICB0aGFuIC5yZWwucGx0LiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbC5wbHQiKSAhPSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCQkgIHJlbG9jcyA9IHRydWU7Ci0KLQkJICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTAotCQkgICAgIGVudHJ5LiAgVGhlIGVudHJpZXMgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24KLQkJICAgICByZWFsbHkgYXBwbHkgdG8gdGhlIC5nb3Qgc2VjdGlvbiwgd2hpY2ggd2UKLQkJICAgICBjcmVhdGVkIG91cnNlbHZlcyBhbmQgc28ga25vdyBpcyBub3QgcmVhZG9ubHkuICAqLwotCQkgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMRU5ULAotCQkJCQkJc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UgaWYgd2UgYXJlCi0gICBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3Qgd2l0aCAtQnN5bWJvbGljLiAgSXQgZGlzY2FyZHMgdGhlIHNwYWNlCi0gICBhbGxvY2F0ZWQgdG8gY29weSBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIHdoaWNoIGFyZQotICAgZGVmaW5lZCBpbiByZWd1bGFyIG9iamVjdHMuICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlCi0gICBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlIHdvbid0IGZpbGwgdGhlbSBpbiBpbiB0aGUKLSAgIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2Rpc2NhcmRfY29waWVzIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKnM7Ci0KLSAgLyogV2Ugb25seSBkaXNjYXJkIHJlbG9jcyBmb3Igc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuICAqLwotICBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChzID0gaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICBzLT5zZWN0aW9uLT5fcmF3X3NpemUgLT0gcy0+Y291bnQgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIGkzODYgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNwbHQgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlID09IFJfMzg2X0dOVV9WVElOSEVSSVQKLQkgIHx8IHJfdHlwZSA9PSBSXzM4Nl9HTlVfVlRFTlRSWSkKLQljb250aW51ZTsKLSAgICAgIGlmIChyX3R5cGUgPCAwCi0JICB8fCByX3R5cGUgPj0gKGludCkgUl8zODZfbWF4Ci0JICB8fCAocl90eXBlID49IChpbnQpIEZJUlNUX0lOVkFMSURfUkVMT0MKLQkgICAgICAmJiByX3R5cGUgPD0gKGludCkgTEFTVF9JTlZBTElEX1JFTE9DKSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBob3d0byA9IGVsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIGJmZF92bWEgdmFsOwotCi0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHZhbCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJICB2YWwgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgaWYgKHJfdHlwZSA9PSBSXzM4Nl9HT1RQQwotCQkgIHx8IChyX3R5cGUgPT0gUl8zODZfUExUMzIKLQkJICAgICAgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCSAgfHwgKHJfdHlwZSA9PSBSXzM4Nl9HT1QzMgotCQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoISBpbmZvLT5zaGFyZWQKLQkJCSAgfHwgKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSXzM4Nl8zMgotCQkJICB8fCByX3R5cGUgPT0gUl8zODZfUEMzMikKLQkJICAgICAgJiYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkJICAvKiBEV0FSRiB3aWxsIGVtaXQgUl8zODZfMzIgcmVsb2NhdGlvbnMgaW4gaXRzCi0JCQkgICAgIHNlY3Rpb25zIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGV4dGVybmFsbHkKLQkJCSAgICAgaW4gc2hhcmVkIGxpYnJhcmllcy4gIFdlIGNhbid0IGRvIGFueXRoaW5nCi0JCQkgICAgIHdpdGggdGhlbSBoZXJlLiAgKi8KLQkJCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQotICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LAotCQkgICAgICAoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5ub191bmRlZmluZWQpKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl8zODZfR09UMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGdsb2JhbAotCSAgICAgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0JCSAgICAgLUJzeW1ib2xpYyBsaW5rIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkJICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKLQkJICAgICBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLiAgV2UgbXVzdCBpbml0aWFsaXplCi0JCSAgICAgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlIHRoZQotCQkgICAgIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUKLQkJICAgICBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotCQkgICAgIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJICAgICBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsLmdvdAotCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzCi0JCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJICAgIG9mZiAmPSB+MTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgICAgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgQkZEX0FTU0VSVCAobG9jYWxfZ290X29mZnNldHMgIT0gTlVMTAotCQkJICAmJiBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQotCSAgICAgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlCi0gICAgICAgICAgICAgICAgIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotICAgICAgICAgICAgICAgICBhbHJlYWR5IGdlbmVyYXRlZCB0aGUgbmVjZXNzYXJ5IHJlbG9jLiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0KLQkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgb2ZmKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOwotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKLQkJCQkJCSAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCi0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9HT1RPRkY6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2xvYmFsIG9mZnNldAotCSAgICAgdGFibGUuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICAvKiBOb3RlIHRoYXQgc2dvdC0+b3V0cHV0X29mZnNldCBpcyBub3QgaW52b2x2ZWQgaW4gdGhpcwotCSAgICAgY2FsY3VsYXRpb24uICBXZSBhbHdheXMgd2FudCB0aGUgc3RhcnQgb2YgLmdvdC4gIElmIHdlCi0JICAgICBkZWZpbmVkIF9HTE9CQUxfT0ZGU0VUX1RBQkxFIGluIGEgZGlmZmVyZW50IHdheSwgYXMgaXMKLQkgICAgIHBlcm1pdHRlZCBieSB0aGUgQUJJLCB3ZSBtaWdodCBoYXZlIHRvIGNoYW5nZSB0aGlzCi0JICAgICBjYWxjdWxhdGlvbi4gICovCi0JICByZWxvY2F0aW9uIC09IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9HT1RQQzoKLQkgIC8qIFVzZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGFzIHN5bWJvbCB2YWx1ZS4gICovCi0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0JICBicmVhazsKLQotCWNhc2UgUl8zODZfUExUMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0JICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLQkgIC8qIFJlc29sdmUgYSBQTFQzMiByZWxvYyBhZ2FpbiBhIGxvY2FsIHN5bWJvbCBkaXJlY3RseSwKLSAgICAgICAgICAgICB3aXRob3V0IHVzaW5nIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotICAgICAgICAgICAgICAgICBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0gICAgICAgICAgICAgICAgIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGgtPnBsdC5vZmZzZXQpOwotCi0JICBicmVhazsKLQotCWNhc2UgUl8zODZfMzI6Ci0JY2FzZSBSXzM4Nl9QQzMyOgotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICAgICYmIChyX3R5cGUgIT0gUl8zODZfUEMzMgotCQkgIHx8IChoICE9IE5VTEwKLQkJICAgICAgJiYgaC0+ZHluaW5keCAhPSAtMQotCQkgICAgICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0JICAgICAgYm9vbGVhbiBza2lwLCByZWxvY2F0ZTsKLQotCSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zCi0JCSBhcmUgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1bgotCQkgdGltZS4gICovCi0KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChpbnB1dF9iZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJCSBuYW1lICsgNCkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCX0KLQotCSAgICAgIHNraXAgPSBmYWxzZTsKLQotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JCW91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3ZtYSBvZmY7Ci0KLQkJICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQkgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkJfQotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICAgICAgaWYgKHNraXApCi0JCXsKLQkJICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCQkgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChyX3R5cGUgPT0gUl8zODZfUEMzMikKLQkJewotCQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5keW5pbmR4ICE9IC0xKTsKLQkJICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X1BDMzIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KLQkJICBpZiAoaCA9PSBOVUxMCi0JCSAgICAgIHx8ICgoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JCSAgICB7Ci0JCSAgICAgIHJlbG9jYXRlID0gdHJ1ZTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgICAgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2XzMyKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKLQkJCQkJICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG8KLQkJIG5vdCB3YW50IHRvIGZpZGRsZSB3aXRoIHRoZSBhZGRlbmQuICBPdGhlcndpc2UsIHdlCi0JCSBuZWVkIHRvIGluY2x1ZGUgdGhlIHN5bWJvbCB2YWx1ZSBzbyB0aGF0IGl0IGJlY29tZXMKLQkJIGFuIGFkZGVuZCBmb3IgdGhlIGR5bmFtaWMgcmVsb2MuICAqLwotCSAgICAgIGlmICghIHJlbG9jYXRlKQotCQljb250aW51ZTsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCAoYmZkX3ZtYSkgMCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgICBzeW0tPnN0X25hbWUpOwotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JCSAgfQotCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLQkgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5kZXggaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHdoaWNoCi0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgc3ltYm9sLiAgVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhpcyBzeW1ib2wKLQkgaW4gYWxsIHRoZSBzeW1ib2xzIGZvciB3aGljaCB3ZSBhcmUgbWFraW5nIHBsdCBlbnRyaWVzLiAgVGhlCi0JIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyByZXNlcnZlZC4gICovCi0gICAgICBwbHRfaW5kZXggPSBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSAxOwotCi0gICAgICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZ290IHRhYmxlIG9mIHRoZSBlbnRyeSB0aGF0Ci0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgZnVuY3Rpb24uICBFYWNoIC5nb3QgZW50cnkgaXMgNCBieXRlcy4KLQkgVGhlIGZpcnN0IHRocmVlIGFyZSByZXNlcnZlZC4gICovCi0gICAgICBnb3Rfb2Zmc2V0ID0gKHBsdF9pbmRleCArIDMpICogNDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX2kzODZfcGx0X2VudHJ5LAotCQkgIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgZ290X29mZnNldCksCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX2kzODZfcGljX3BsdF9lbnRyeSwKLQkJICBQTFRfRU5UUllfU0laRSk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBnb3Rfb2Zmc2V0LAotCQkgICAgICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyAyKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHBsdF9pbmRleCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA3KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIC0gKGgtPnBsdC5vZmZzZXQgKyBQTFRfRU5UUllfU0laRSksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMTIpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICArIGgtPnBsdC5vZmZzZXQKLQkJICAgKyA2KSwKLQkJICBzZ290LT5jb250ZW50cyArIGdvdF9vZmZzZXQpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbi4gICovCi0gICAgICByZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBnb3Rfb2Zmc2V0KTsKLSAgICAgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X0pVTVBfU0xPVCk7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgc3JlbC0+Y29udGVudHMKLQkJCQkgKyBwbHRfaW5kZXgpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLQkgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIExpa2V3aXNlIGlmCi0JIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLgotCSBUaGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgotCSBpbml0aWFsaXplZCBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfR0xPQl9EQVQpOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgc3JlbC0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbC0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWwuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9DT1BZKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzLT5jb250ZW50cwotCQkJCSArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbC5wbHQiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMU1o6Ci0JICAgICAgLyogTXkgcmVhZGluZyBvZiB0aGUgU1ZSNCBBQkkgaW5kaWNhdGVzIHRoYXQgdGhlCi0JCSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkIGJlCi0JCSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTCkuICBUaGlzIGlzCi0JCSB3aGF0IFNvbGFyaXMgZG9lcy4gIEhvd2V2ZXIsIFVuaXhXYXJlIGNhbiBub3QgaGFuZGxlCi0JCSB0aGF0IGNhc2UuICBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxTWiBlbnRyeQotCQkgaGVyZSB0byBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UKLQkJIHRoZSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsLnBsdCB0byBmb2xsb3cgYWxsCi0JCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMIGVudHJ5LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOwotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgaWYgKHNwbHQgJiYgc3BsdC0+X3Jhd19zaXplID4gMCkKLQl7Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfaTM4Nl9waWNfcGx0MF9lbnRyeSwgUExUX0VOVFJZX1NJWkUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX2kzODZfcGx0MF9lbnRyeSwgUExUX0VOVFJZX1NJWkUpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgNCwKLQkJCSAgc3BsdC0+Y29udGVudHMgKyAyKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDgsCi0JCQkgIHNwbHQtPmNvbnRlbnRzICsgOCk7Ci0JICAgIH0KLQotCSAgLyogVW5peFdhcmUgc2V0cyB0aGUgZW50c2l6ZSBvZiAucGx0IHRvIDQsIGFsdGhvdWdoIHRoYXQgZG9lc24ndAotCSAgICAgcmVhbGx5IHNlZW0gbGlrZSB0aGUgcmlnaHQgdmFsdWUuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQl9Ci0gICAgfQotCi0gIC8qIEZpbGwgaW4gdGhlIGZpcnN0IHRocmVlIGVudHJpZXMgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgNCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA4KTsKLSAgICB9Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjMyX2kzODZfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjMyLWkzODYiCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV8zODYKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxMDAwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGZfaTM4Nl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAllbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAotCQkJCQllbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQkJZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmX2kzODZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawllbGZfaTM4Nl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawllbGZfaTM4Nl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0CTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5CTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltCTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQlQTFRfRU5UUllfU0laRQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTg2MC5jIGIvYmZkL2VsZjMyLWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyZDJkOS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTg2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogSW50ZWwgODYwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAliZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJX2JmZF9lbGZfbm9faW5mb190b19ob3d0bwotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCSBiZmRfZWxmMzJfaTg2MF92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAiZWxmMzItaTg2MCIKLSNkZWZpbmUgRUxGX0FSQ0gJIGJmZF9hcmNoX2k4NjAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERSBFTV84NjAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFICAxIC8qIEZJWE1FOiBUaGlzIG51bWJlciBpcyB3cm9uZywgIEl0IHNob3VsZCBiZSB0aGUgcGFnZSBzaXplIGluIGJ5dGVzLiAgKi8KLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWk5NjAuYyBiL2JmZC9lbGYzMi1pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWZjM2QuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWk5NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKiBJbnRlbCA4NjAgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvaTk2MC5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjMyX2k5NjBfcmVsb2NhdGUKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmMzJfaTk2MF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0KLSNkZWZpbmUgVVNFX1JFTCAxCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAllbGYzMl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGYzMl9pOTYwX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQllbGYzMl9pOTYwX2luZm9fdG9faG93dG9fcmVsCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9ob3d0b190YWJsZVtdPQotewotICBIT1dUTyhSXzk2MF9OT05FLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JZWxmMzJfaTk2MF9yZWxvY2F0ZSwgIlJfOTYwX05PTkUiLCB0cnVlLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIGZhbHNlKSwKLSAgRU1QVFlfSE9XVE8gKDEpLAotICBIT1dUTyAoUl85NjBfMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JZWxmMzJfaTk2MF9yZWxvY2F0ZSwgIlJfOTYwXzMyIiwgdHJ1ZSwKLQkweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSXzk2MF9JUDI0LCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWVsZjMyX2k5NjBfcmVsb2NhdGUsICJSXzk2MF9JUDI0ICIsIHRydWUsCi0JMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgZmFsc2UpLAotICBFTVBUWV9IT1dUTyAoNCksCi0gIEVNUFRZX0hPV1RPICg1KSwKLSAgRU1QVFlfSE9XVE8gKDYpLAotICBFTVBUWV9IT1dUTyAoNykKLX07Ci0KLXN0YXRpYyBlbnVtIGVsZl9pOTYwX3JlbG9jX3R5cGUKLWVsZjMyX2k5NjBfYmZkX3RvX3JlbG9jX3R5cGUgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKQotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gUl85NjBfTk9ORTsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuIFJfOTYwX09QVENBTEw7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiBSXzk2MF8zMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiBSXzk2MF9JUDI0OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWVsZjMyX2k5NjBfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZAkJKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudAkJKmNhY2hlX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9pOTYwX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGVudW0gZWxmX2k5NjBfcmVsb2NfdHlwZSB0eXBlOwotCi0gIHR5cGUgPSAoZW51bSBlbGZfaTk2MF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAodHlwZSA8IFJfOTYwX21heCk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfaG93dG9fdGFibGVbKGludCkgdHlwZV07Ci19Ci0KLS8qIEVMRiByZWxvY3MgYXJlIGFnYWluc3Qgc3ltYm9scy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlCi0gICBvdXRwdXQsIGFuZCB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nCi0gICBoYXMgZ2l2ZW4gdXMgYW55IGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbwotICAgYmUgYWdhaW5zdCB0aGUgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0bwotICAgY2hhbmdlIGFueXRoaW5nIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwKLSAgIGFsbCBiZSBkb25lIGF0IGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZQotICAgaW50byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCi0gICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZwotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGYzMl9pOTYwX3JlbG9jYXRlIChhYmZkLAotCQkgICAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgICBzeW1ib2wsCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogSEFDSzogSSB0aGluayB0aGlzIGZpcnN0IGNvbmRpdGlvbiBpcyBuZWNlc3Nhcnkgd2hlbiBwcm9kdWNpbmcKLSAgICAgcmVsb2NhdGFibGUgb3V0cHV0LiAgQWZ0ZXIgdGhlIGVuZCBvZiBIQUNLLCB0aGUgY29kZSBpcyBpZGVudGljYWwKLSAgICAgdG8gYmZkX2VsZl9nZW5lcmljX3JlbG9jKCkuICBJIHdvdWxkIF9ndWVzc18gdGhlIGZpcnN0IGNoYW5nZQotICAgICBiZWxvbmdzIHRoZXJlIHJhdGhlciB0aGFuIGhlcmUuICBtYXJ0aW5kbyAxOTk4LTEwLTIzLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiByZWxvY19lbnRyeS0+aG93dG8tPnBjX3JlbGF0aXZlCi0gICAgICAmJiAhcmVsb2NfZW50cnktPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCAtPSBzeW1ib2wtPnZhbHVlOwotICAgIH0KLSAgLyogVGhpcyBpcyBtb3JlIGR1YmlvdXMuICovCi0gIGVsc2UgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0JICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCAtPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogZW5kIG9mIEhBQ0sgKi8KLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotCSAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLQkgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICAgICAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLQl7Ci0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjMyX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgcmV0dXJuIGVsZl9ob3d0b190YWJsZSArIGVsZjMyX2k5NjBfYmZkX3RvX3JlbG9jX3R5cGUgKGNvZGUpOwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9pOTYwX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLWk5NjAiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9pOTYwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fOTYwCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAgCTEgLyogRklYTUU6IFRoaXMgbnVtYmVyIGlzIHdyb25nLCAgSXQgc2hvdWxkIGJlIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbTMyci5jIGIvYmZkL2VsZjMyLW0zMnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiNjU1NS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItbTMyci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE5NiArMCwwIEBACi0vKiBNMzJSLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbTMyci5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgcmVsb2NfaG93dG9fdHlwZSAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIGJmZF92bWEsIGFzZWN0aW9uICosIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfaGkxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIG0zMnJfZWxmX3JlbG9jYXRlX2hpMTYKLSAgUEFSQU1TICgoYmZkICosIGludCwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfbG8xNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9nZW5lcmljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9zZGExNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG0zMnJfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLWJvb2xlYW4gX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXZvaWQgX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0jaWYgMCAvKiBub3QgeWV0ICovCi1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIG0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0jZGVmaW5lIE5PUF9JTlNOCQkweDcwMDAKLSNkZWZpbmUgTUFLRV9QQVJBTExFTChpbnNuKQkoKGluc24pIHwgMHg4MDAwKQotCi0vKiBVc2UgUkVMIGluc3RlYWQgb2YgUkVMQSB0byBzYXZlIHNwYWNlLgotICAgVGhpcyBvbmx5IHNhdmVzIHNwYWNlIGluIGxpYnJhcmllcyBhbmQgb2JqZWN0IGZpbGVzLCBidXQgcGVyaGFwcwotICAgcmVsb2NzIHdpbGwgYmUgcHV0IGluIFJPTT8gIEFsbCBpbiBhbGwgdGhvdWdoLCBSRUwgcmVsb2NzIGFyZSBhIHBhaW4KLSAgIHRvIHdvcmsgd2l0aC4gICovCi0jZGVmaW5lIFVTRV9SRUwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbTMycl9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX00zMlJfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9nZW5lcmljX3JlbG9jLC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NMzJSXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTMycl9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjQgYml0IGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSXzI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTMycl9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMi4KLSAgICAgVGhpcyByZWxvYyBpcyBjb21wbGljYXRlZCBiZWNhdXNlIHJlbG9jYXRpb25zIGFyZSByZWxhdGl2ZSB0byBwYyAmIC00LgotICAgICBpLmUuIGJyYW5jaGVzIGluIHRoZSByaWdodCBpbnNuIHNsb3QgdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBsZWZ0IGluc24KLSAgICAgc2xvdCBmb3IgcGMuICAqLwotICAvKiA/Pz8gSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGlzIHNob3VsZCBoYXZlIHBhcnRpYWxfaW5wbGFjZSBzZXQgb3Igbm90LgotICAgICBCcmFuY2ggcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBjYW4gc3RvcmUgdGhlIGFkZGVuZCBpbiB0aGUgaW5zbiwKLSAgICAgYW5kIGlmIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gZ2V0cyBjYWxsZWQgdGhlIGFkZGVuZCBtYXkgZ2V0IGFkZGVkCi0gICAgIGFnYWluLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8xMF9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMTBfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE4IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9NMzJSXzE4X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xOF9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjYgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0gIC8qID8/PyBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoaXMgc2hvdWxkIGhhdmUgcGFydGlhbF9pbnBsYWNlIHNldCBvciBub3QuCi0gICAgIEJyYW5jaCByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGNhbiBzdG9yZSB0aGUgYWRkZW5kIGluIHRoZSBpbnNuLAotICAgICBhbmQgaWYgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBnZXRzIGNhbGxlZCB0aGUgYWRkZW5kIG1heSBnZXQgYWRkZWQKLSAgICAgYWdhaW4uICAqLwotICBIT1dUTyAoUl9NMzJSXzI2X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8yNl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgYWRkcmVzcyB3aGVuIGxvd2VyIDE2IGlzIG9yJ2QgaW4uICAqLwotICBIT1dUTyAoUl9NMzJSX0hJMTZfVUxPLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfSEkxNl9VTE8iLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGFkZHJlc3Mgd2hlbiBsb3dlciAxNiBpcyBhZGRlZCBpbi4gICovCi0gIEhPV1RPIChSX00zMlJfSEkxNl9TTE8sCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9ISTE2X1NMTyIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3dlciAxNiBiaXRzIG9mIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTbWFsbCBkYXRhIGFyZWEgMTYgYml0cyBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9NMzJSX1NEQTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX3NkYTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfU0RBMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAvKiBGSVhNRTogY29ycmVjdD8gKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NMzJSX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX00zMlJfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotDAotLyogSGFuZGxlIHRoZSBSX00zMlJfMTBfUENSRUwgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl8xMF9wY3JlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiogZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIHJldHVybiBtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnktPmhvd3RvLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgIGRhdGEsIHJlbG9jX2VudHJ5LT5hZGRyZXNzLAotCQkJCSAgICAgc3ltYm9sLT5zZWN0aW9uLAotCQkJCSAgICAgKHN5bWJvbC0+dmFsdWUKLQkJCQkgICAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSwKLQkJCQkgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotfQotCi0vKiBVdGlsaXR5IHRvIGFjdHVhbGx5IHBlcmZvcm0gYW4gUl9NMzJSXzEwX1BDUkVMIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MgKGFiZmQsIGhvd3RvLCBpbnB1dF9zZWN0aW9uLCBkYXRhLCBvZmZzZXQsCi0JCQkgICAgc3ltYm9sX3NlY3Rpb24sIHN5bWJvbF92YWx1ZSwgYWRkZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBhc2VjdGlvbiAqc3ltYm9sX3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBzeW1ib2xfdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBiZmRfc2lnbmVkX3ZtYSByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHg7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzdGF0dXM7Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzIChvZmZzZXQgaW4gc2VjdGlvbikuICAqLwotICBpZiAob2Zmc2V0ID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZWxvY2F0aW9uID0gc3ltYm9sX3ZhbHVlICsgYWRkZW5kOwotICAvKiBNYWtlIGl0IHBjIHJlbGF0aXZlLiAgKi8KLSAgcmVsb2NhdGlvbiAtPQkoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgLyogVGhlc2UganVtcHMgbWFzayBvZmYgdGhlIGxvd2VyIHR3byBiaXRzIG9mIHRoZSBjdXJyZW50IGFkZHJlc3MKLSAgICAgYmVmb3JlIGRvaW5nIHBjcmVsIGNhbGN1bGF0aW9ucy4gICovCi0gIHJlbG9jYXRpb24gLT0gKG9mZnNldCAmIC00TCk7Ci0KLSAgaWYgKHJlbG9jYXRpb24gPCAtMHgyMDAgfHwgcmVsb2NhdGlvbiA+IDB4MWZmKQotICAgIHN0YXR1cyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHN0YXR1cyA9IGJmZF9yZWxvY19vazsKLQotICB4ID0gYmZkX2dldF8xNiAoYWJmZCwgZGF0YSArIG9mZnNldCk7Ci0gIHJlbG9jYXRpb24gPj49IGhvd3RvLT5yaWdodHNoaWZ0OwotICByZWxvY2F0aW9uIDw8PSBob3d0by0+Yml0cG9zOwotICB4ID0gKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spOwotICBiZmRfcHV0XzE2IChhYmZkLCB4LCBkYXRhICsgb2Zmc2V0KTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKiBIYW5kbGUgdGhlIFJfTTMyUl9ISTE2X1tTVV1MTyByZWxvY3MuCi0gICBISTE2X1NMTyBpcyBmb3IgdGhlIGFkZDMgYW5kIGxvYWQvc3RvcmUgd2l0aCBkaXNwbGFjZW1lbnQgaW5zdHJ1Y3Rpb25zLgotICAgSEkxNl9VTE8gaXMgZm9yIHRoZSBvcjMgaW5zdHJ1Y3Rpb24uCi0gICBGb3IgUl9NMzJSX0hJMTZfU0xPLCB0aGUgbG93ZXIgMTYgYml0cyBhcmUgc2lnbiBleHRlbmRlZCB3aGVuIGFkZGVkIHRvCi0gICB0aGUgaGlnaCAxNiBieXRlcyBzbyBpZiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgbmVnYXRpdmUgKGJpdCAxNSA9PSAxKSB0aGVuCi0gICB3ZSBtdXN0IGFkZCBvbmUgdG8gdGhlIGhpZ2ggMTYgYnl0ZXMgKHdoaWNoIHdpbGwgZ2V0IHN1YnRyYWN0ZWQgb2ZmIHdoZW4KLSAgIHRoZSBsb3cgMTYgYml0cyBhcmUgYWRkZWQpLgotICAgVGhlc2UgcmVsb2NzIGhhdmUgdG8gYmUgZG9uZSBpbiBjb21iaW5hdGlvbiB3aXRoIGFuIFJfTTMyUl9MTzE2IHJlbG9jCi0gICBiZWNhdXNlIHRoZXJlIGlzIGEgY2FycnkgZnJvbSB0aGUgTE8xNiB0byB0aGUgSEkxNi4gIEhlcmUgd2UganVzdCBzYXZlCi0gICB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZDsgd2UgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uIHdoZW4gd2Ugc2VlIHRoZSBMTzE2LgotICAgVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIHRoZSBlbGYzMi1taXBzLmMuICBXZSBhbHNvIHN1cHBvcnQgYW4gYXJiaXRyYXJ5Ci0gICBudW1iZXIgb2YgSEkxNiByZWxvY3MgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIExPMTYgcmVsb2MuICBUaGUKLSAgIGFzc2VtYmxlciBzb3J0cyB0aGUgcmVsb2NzIHRvIGVuc3VyZSBlYWNoIEhJMTYgaW1tZWRpYXRlbHkgcHJlY2VkZXMgaXRzCi0gICBMTzE2LiAgSG93ZXZlciBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29waWVzLCB0aGUgYXNzZW1ibGVyIG1heSBub3QgZmluZAotICAgdGhlIHJlYWwgTE8xNiBzbyBpdCBwaWNrcyB0aGUgZmlyc3Qgb25lIGl0IGZpbmRzLiAgKi8KLQotc3RydWN0IG0zMnJfaGkxNgotewotICBzdHJ1Y3QgbTMycl9oaTE2ICpuZXh0OwotICBiZmRfYnl0ZSAqYWRkcjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGEgc3RhdGljIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtMzJyX2hpMTYgKm0zMnJfaGkxNl9saXN0OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9oaTE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBzdHJ1Y3QgbTMycl9oaTE2ICpuOwotCi0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4KLSAgICAgSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzIChvZmZzZXQgaW4gc2VjdGlvbikuICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIHJldCA9IGJmZF9yZWxvY19vazsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0ID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgTE8xNiBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24uICAqLwotICBuID0gKHN0cnVjdCBtMzJyX2hpMTYgKikgYmZkX21hbGxvYyAoc2l6ZW9mICpuKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gIG4tPmFkZHIgPSAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBuLT5hZGRlbmQgPSByZWxvY2F0aW9uOwotICBuLT5uZXh0ID0gbTMycl9oaTE2X2xpc3Q7Ci0gIG0zMnJfaGkxNl9saXN0ID0gbjsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBIYW5kbGUgYW4gTTMyUiBFTEYgSEkxNiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tMzJyX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHR5cGUsIHJlbGhpLCByZWxsbywgY29udGVudHMsIGFkZGVuZCkKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsaGk7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxsbzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfdm1hIGFkZGxvOwotCi0gIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsaGktPnJfb2Zmc2V0KTsKLQotICBhZGRsbyA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWxsby0+cl9vZmZzZXQpOwotICBpZiAodHlwZSA9PSBSX00zMlJfSEkxNl9TTE8pCi0gICAgYWRkbG8gPSAoKGFkZGxvICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7Ci0gIGVsc2UKLSAgICBhZGRsbyAmPSAweGZmZmY7Ci0KLSAgYWRkZW5kICs9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgYWRkbG87Ci0KLSAgLyogUmVhY2NvdW50IGZvciBzaWduIGV4dGVuc2lvbiBvZiBsb3cgcGFydC4gICovCi0gIGlmICh0eXBlID09IFJfTTMyUl9ISTE2X1NMTwotICAgICAgJiYgKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCkKLSAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JICAgICAgKGluc24gJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZiksCi0JICAgICAgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotfQotCi0vKiBEbyBhbiBSX00zMlJfTE8xNiByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQKLSAgIGlucGxhY2UgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlCi0gICBSX00zMlJfSEkxNl9bU1VdTE8gcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2xvMTZfcmVsb2MgKGlucHV0X2JmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuCi0gICAgIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChtMzJyX2hpMTZfbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBtMzJyX2hpMTYgKmw7Ci0KLSAgICAgIGwgPSBtMzJyX2hpMTZfbGlzdDsKLSAgICAgIHdoaWxlIChsICE9IE5VTEwpCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICB1bnNpZ25lZCBsb25nIHZhbGxvOwotCSAgc3RydWN0IG0zMnJfaGkxNiAqbmV4dDsKLQotCSAgLyogRG8gdGhlIEhJMTYgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndCBuZWVkCi0JICAgICB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBMTzE2IGl0c2VsZiwgZXhjZXB0IHdoZXJlIHRvCi0JICAgICBmaW5kIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG5lZWRlZCBieSB0aGUgTE8xNi4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsLT5hZGRyKTsKLQkgIHZhbGxvID0gKChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogUmVhY2NvdW50IGZvciBzaWduIGV4dGVuc2lvbiBvZiBsb3cgcGFydC4gICovCi0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG0zMnJfaGkxNl9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBMTzE2IHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuCi0gICAgID8/PyBJdCB3b3VsZCBiZSBuaWNlIHRvIGNhbGwgYmZkX2VsZl9nZW5lcmljX3JlbG9jIGhlcmUsCi0gICAgIGJ1dCB3ZSBoYXZlIHBhcnRpYWxfaW5wbGFjZSA9PSBUUlVFLiAgYmZkX2VsZl9nZW5lcmljX3JlbG9jIHdpbGwKLSAgICAgcGFzcyB0aGUgaGFuZGxpbmcgYmFjayB0byBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdoaWNoIHdpbGwgaW5zdGFsbAotICAgICBhIHNlY3Rpb24gcmVsYXRpdmUgYWRkZW5kIHdoaWNoIGlzIHdyb25nLiAgKi8KLSAgcmV0dXJuIG0zMnJfZWxmX2dlbmVyaWNfcmVsb2MgKGlucHV0X2JmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLX0KLQotLyogRG8gZ2VuZXJpYyBwYXJ0aWFsX2lucGxhY2UgcmVsb2NhdGlvbi4gIAotICAgVGhpcyBpcyBhIGxvY2FsIHJlcGxhY2VtZW50IGZvciBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTMycl9lbGZfZ2VuZXJpY19yZWxvYyAoaW5wdXRfYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX2J5dGUgKmlucGxhY2VfYWRkcmVzczsKLQotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuCi0gICAgIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyB0aGUgdGhlIHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuCi0gICAgID8/PyBJdCB3b3VsZCBiZSBuaWNlIHRvIGNhbGwgYmZkX2VsZl9nZW5lcmljX3JlbG9jIGhlcmUsCi0gICAgIGJ1dCB3ZSBoYXZlIHBhcnRpYWxfaW5wbGFjZSA9PSBUUlVFLiAgYmZkX2VsZl9nZW5lcmljX3JlbG9jIHdpbGwKLSAgICAgcGFzcyB0aGUgaGFuZGxpbmcgYmFjayB0byBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdoaWNoIHdpbGwgaW5zdGFsbAotICAgICBhIHNlY3Rpb24gcmVsYXRpdmUgYWRkZW5kIHdoaWNoIGlzIHdyb25nLiAgKi8KLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MgKG9mZnNldCBpbiBzZWN0aW9uKS4gICovCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmV0ID0gYmZkX3JlbG9jX29rOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXQgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgIHx8IG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgLyogT25seSBkbyB0aGlzIGZvciBhIGZpbmFsIGxpbmsuICAqLwotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci0KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICBpbnBsYWNlX2FkZHJlc3MgPSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLSNkZWZpbmUgRE9JVCh4KSAJCQkJCVwKLSAgeCA9ICggKHggJiB+cmVsb2NfZW50cnktPmhvd3RvLT5kc3RfbWFzaykgfCAJCVwKLSAgKCgoeCAmIHJlbG9jX2VudHJ5LT5ob3d0by0+c3JjX21hc2spICsgIHJlbG9jYXRpb24pICYJXAotICByZWxvY19lbnRyeS0+aG93dG8tPmRzdF9tYXNrKSkKLQotICBzd2l0Y2ggKHJlbG9jX2VudHJ5LT5ob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgewotCXNob3J0IHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGlucGxhY2VfYWRkcmVzcyk7Ci0JRE9JVCAoeCk7Ci0gICAgICAJYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBpbnBsYWNlX2FkZHJlc3MpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaW5wbGFjZV9hZGRyZXNzKTsKLQlET0lUICh4KTsKLSAgICAgIAliZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGlucGxhY2VfYWRkcmVzcyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgUl9NMzJSX1NEQTE2IHJlbG9jLgotICAgVGhpcyByZWxvYyBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIGFkZHJlc3Mgb2Ygb2JqZWN0cyBpbiB0aGUgc21hbGwgZGF0YSBhcmVhCi0gICBhbmQgdG8gcGVyZm9ybSBsb2FkcyBhbmQgc3RvcmVzIGZyb20gdGhhdCBhcmVhLgotICAgVGhlIGxvd2VyIDE2IGJpdHMgYXJlIHNpZ24gZXh0ZW5kZWQgYW5kIGFkZGVkIHRvIHRoZSByZWdpc3RlciBzcGVjaWZpZWQKLSAgIGluIHRoZSBpbnN0cnVjdGlvbiwgd2hpY2ggaXMgYXNzdW1lZCB0byBwb2ludCB0byBfU0RBX0JBU0VfLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTMycl9lbGZfc2RhMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBub3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUgeWV0LiAgQnV0IHRoZW4gYWdhaW4sIHRoZSBsaW5rZXIKLSAgICAgbWF5IG5ldmVyIGNhbGwgdXMuICAqLwotICBhYm9ydCAoKTsKLX0KLQwKLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gTTMyUiBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgbTMycl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbTMycl9yZWxvY19tYXAgbTMycl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfTTMyUl9OT05FIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX00zMlJfMTYgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTTMyUl8zMiB9LAotICB7IEJGRF9SRUxPQ19NMzJSXzI0LCBSX00zMlJfMjQgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTCwgUl9NMzJSXzEwX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMThfUENSRUwsIFJfTTMyUl8xOF9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMLCBSX00zMlJfMjZfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTywgUl9NMzJSX0hJMTZfVUxPIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8sIFJfTTMyUl9ISTE2X1NMTyB9LAotICB7IEJGRF9SRUxPQ19NMzJSX0xPMTYsIFJfTTMyUl9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfU0RBMTYsIFJfTTMyUl9TREExNiB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9NMzJSX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX00zMlJfR05VX1ZURU5UUlkgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChtMzJyX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBtMzJyX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChtMzJyX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZtMzJyX2VsZl9ob3d0b190YWJsZVttMzJyX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gTTMyUiBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX00zMlJfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZtMzJyX2VsZl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotDAotLyogR2l2ZW4gYSBCRkQgc2VjdGlvbiwgdHJ5IHRvIGxvY2F0ZSB0aGUgY29ycmVzcG9uZGluZyBFTEYgc2VjdGlvbgotICAgaW5kZXguICAqLwotCi1ib29sZWFuCi1fYmZkX20zMnJfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBpbnQgKnJldHZhbDsKLXsKLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NMzJSX1NDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTTMyUiBFTEYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUgb3RoZXIKLSAgIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0IHRvZ2V0aGVyLCBhbmQgdGhlbgotICAgcmVmZXJlbmNlZCB2aWEgb25lIHJlZ2lzdGVyLCB3aGljaCB5aWVsZHMgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgSXQgaXMKLSAgIHVwIHRvIHRoZSBjb21waWxlciB0byBlbWl0IGFuIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIHJlZ2lzdGVyIHdpdGgKLSAgIF9TREFfQkFTRS4gIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gIFRoaXMKLSAgIGFwcHJvYWNoIGlzIGNvcGllZCBmcm9tIGVsZjMyLW1pcHMuYy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbTMycl9lbGZfc2NvbV9zeW1ib2xfcHRyOwotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLiAgKi8KLQotdm9pZAotX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKmFzeW07Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqZWxmc3ltOwotCi0gIGVsZnN5bSA9IChlbGZfc3ltYm9sX3R5cGUgKikgYXN5bTsKLQotICBzd2l0Y2ggKGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fTTMyUl9TQ09NTU9OOgotICAgICAgaWYgKG0zMnJfZWxmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgc21hbGwgY29tbW9uIHNlY3Rpb24uICAqLwotCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPSAiLnNjb21tb24iOwotCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJm0zMnJfZWxmX3Njb21fc3ltYm9sOwotCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm0zMnJfZWxmX3Njb21fc3ltYm9sX3B0cjsKLQkgIG0zMnJfZWxmX3Njb21fc3ltYm9sLm5hbWUgPSAiLnNjb21tb24iOwotCSAgbTMycl9lbGZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbC5zZWN0aW9uID0gJm0zMnJfZWxmX3Njb21fc2VjdGlvbjsKLQkgIG0zMnJfZWxmX3Njb21fc3ltYm9sX3B0ciA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJm0zMnJfZWxmX3Njb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSBtdXN0IGhhbmRsZSB0aGUgc3BlY2lhbCBNMzJSIHNlY3Rpb24gbnVtYmVycyBoZXJlLgotICAgV2UgYWxzbyBrZWVwIHdhdGNoaW5nIGZvciB3aGV0aGVyIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBzZGF0YSBzcGVjaWFsCi0gICBsaW5rZXIgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBmbGFnd29yZCAqZmxhZ3NwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAoKm5hbWVwKVswXSA9PSAnXycgJiYgKCpuYW1lcClbMV0gPT0gJ1MnCi0gICAgICAmJiBzdHJjbXAgKCpuYW1lcCwgIl9TREFfQkFTRV8iKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgc2ltcGxlciB0aGFuIHVzaW5nIF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbgotCSAob3VyIG5lZWRzIGFyZSBzaW1wbGVyIHRoYW4gcHBjJ3MgbmVlZHMpLiAgQWxzbwotCSBfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gY3VycmVudGx5IGhhcyBhIGJ1ZyB3aGVyZSBpZiBhIC5zZGF0YQotCSBzZWN0aW9uIGFscmVhZHkgZXhpc3RzIGEgbmV3IG9uZSBpcyBjcmVhdGVkIHRoYXQgZm9sbG93cyBpdCB3aGljaAotCSBzY3Jld3Mgb2YgX1NEQV9CQVNFXyBhZGRyZXNzIGNhbGNzIGJlY2F1c2Ugb3V0cHV0X29mZnNldCAhPSAwLiAgKi8KLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKnMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOwotCi0gICAgICAvKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGNvYmJsZWQgZnJvbSBlbGYzMi1wcGMuYyBhbmQgZWxmbGluay5jLiAgKi8KLQotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICBpbnQgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0JICBzID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuc2RhdGEiKTsKLQkgIGlmIChzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpOwotCSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMik7Ci0JfQotCi0gICAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfU0RBX0JBU0VfIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIGlmICgoaCA9PSBOVUxMIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkgICYmICEoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sCi0JCQkJCQkgYWJmZCwKLQkJCQkJCSAiX1NEQV9CQVNFXyIsCi0JCQkJCQkgQlNGX0dMT0JBTCwKLQkJCQkJCSBzLAotCQkJCQkJIDMyNzY4LAotCQkJCQkJIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgZmFsc2UsCi0JCQkJCQkgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCQkJCQkJIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLSAgICB9Ci0KLSAgc3dpdGNoIChzeW0tPnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9NMzJSX1NDT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zY29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgU0RBX0JBU0UgdmFsdWUsIHNvIHRoYXQgd2UgY2FuIGFkanVzdCB0aGUKLSAgIHN5bWJvbCB2YWx1ZSBjb3JyZWN0bHkuICBXZSBsb29rIHVwIHRoZSBzeW1ib2wgX1NEQV9CQVNFXyBpbiB0aGUgb3V0cHV0Ci0gICBCRkQuICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCB3ZSdyZSBzdHVjay4gIFdlIGNhY2hlIGl0IGluIHRoZSBFTEYKLSAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgIGV4dGVybmFsIHN5bWJvbCBpZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9maW5hbF9zZGFfYmFzZSAob3V0cHV0X2JmZCwgaW5mbywgZXJyb3JfbWVzc2FnZSwgcHNiKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLSAgICAgYmZkX3ZtYSAqcHNiOwotewotICBpZiAoZWxmX2dwIChvdXRwdXRfYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfU0RBX0JBU0VfIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQllbGZfZ3AgKG91dHB1dF9iZmQpID0gKGgtPnUuZGVmLnZhbHVlCi0JCQkgICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBPbmx5IGdldCB0aGUgZXJyb3Igb25jZS4gICovCi0JICAqcHNiID0gZWxmX2dwIChvdXRwdXRfYmZkKSA9IDQ7Ci0JICAqZXJyb3JfbWVzc2FnZSA9Ci0JICAgIChjb25zdCBjaGFyICopIF8oIlNEQSByZWxvY2F0aW9uIHdoZW4gX1NEQV9CQVNFXyBub3QgZGVmaW5lZCIpOwotCSAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JfQotICAgIH0KLSAgKnBzYiA9IGVsZl9ncCAob3V0cHV0X2JmZCk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBSZWxvY2F0ZSBhbiBNMzJSL0QgRUxGIHNlY3Rpb24uCi0gICBUaGVyZSBpcyBzb21lIGF0dGVtcHQgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIHVzYWJsZSBmb3IgbWFueSBhcmNoaXRlY3R1cmVzLAotICAgYm90aCBVU0VfUkVMIGFuZCBVU0VfUkVMQSBbJ3R3b3VsZCBiZSBuaWNlIGlmIHN1Y2ggYSBjcml0dGVyIGV4aXN0ZWRdLAotICAgaWYgb25seSB0byBzZXJ2ZSBhcyBhIGxlYXJuaW5nIHRvb2wuCi0KLSAgIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgbmV3IEVMRiBiYWNrZW5kIGxpbmtlcgotICAgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uLgotCi0gICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgemVyby4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlIHJlbG9jIGFkZGVuZCBhcwotICAgbmVjZXNzYXJ5LgotCi0gICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdF9zaG5keCBmaWVsZCBvZiBlYWNoIGxvY2FsIHN5bWJvbC4KLQotICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlCi0gICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYWRkZW5kIG11c3QgYmUgYWRqdXN0ZWQKLSAgIGFjY29yZGluZ2x5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICAvKiBBc3N1bWUgc3VjY2Vzcy4gICovCi0gIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgLyogV2UgY2FuJ3QgbW9kaWZ5IHJfYWRkZW5kIGhlcmUgYXMgZWxmX2xpbmtfaW5wdXRfYmZkIGhhcyBhbiBhc3NlcnQgdG8KLQkgZW5zdXJlIGl0J3MgemVybyAod2UgdXNlIFJFTCByZWxvY3MsIG5vdCBSRUxBKS4gIFRoZXJlZm9yZSB0aGlzCi0JIHNob3VsZCBiZSBhc3NpZ25pbmcgemVybyB0byBgYWRkZW5kJywgYnV0IGZvciBjbGFyaXR5IHdlIHVzZQotCSBgcl9hZGRlbmQnLiAgKi8KLSAgICAgIGJmZF92bWEgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfTTMyUl9tYXgpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgKGludCkgcl90eXBlKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NMzJSX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfTTMyUl9HTlVfVlRJTkhFUklUKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaG93dG8gPSBtMzJyX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc2VjID0gTlVMTDsKLQkgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgLyogRXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBMb2NhbCBzeW1ib2wuICAqLwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCSAgLyogU1RUX1NFQ1RJT046IHN5bWJvbCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgKi8KLQkgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKLQkgICAgewotCSAgICAgIC8qIFN5bWJvbCBpc24ndCBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgTm90aGluZyB0byBkby4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0jaWZuZGVmIFVTRV9SRUwKLQkgIC8qIFRoaXMgY2FuJ3QgYmUgZG9uZSBmb3IgVVNFX1JFTCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWVhbiBhbnl0aGluZwotCSAgICAgYW5kIGVsZl9saW5rX2lucHV0X2JmZCBhc3NlcnRzIHRoaXMgc3RheXMgemVyby4gICovCi0JICByZWwtPnJfYWRkZW5kID0gYWRkZW5kOwotI2VuZGlmCi0KLSNpZm5kZWYgVVNFX1JFTAotCSAgLyogQWRkZW5kcyBhcmUgc3RvcmVkIHdpdGggcmVsb2NzLiAgV2UncmUgZG9uZS4gICovCi0JICBjb250aW51ZTsKLSNlbHNlIC8qIFVTRV9SRUwgKi8KLQkgIC8qIElmIHBhcnRpYWxfaW5wbGFjZSwgd2UgbmVlZCB0byBzdG9yZSBhbnkgYWRkaXRpb25hbCBhZGRlbmQKLQkgICAgIGJhY2sgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKCEgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSkKLQkgICAgY29udGludWU7Ci0JICAvKiA/Pz8gSGVyZSBpcyBhIG5pY2UgcGxhY2UgdG8gY2FsbCBhIHNwZWNpYWxfZnVuY3Rpb24KLQkgICAgIGxpa2UgaGFuZGxlci4gICovCi0JICBpZiAocl90eXBlICE9IFJfTTMyUl9ISTE2X1NMTyAmJiByX3R5cGUgIT0gUl9NMzJSX0hJMTZfVUxPKQotCSAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJYWRkZW5kLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqbG9yZWw7Ci0KLQkgICAgICAvKiBXZSBhbGxvdyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYgcmVsb2NzIGJlZm9yZSB0aGUKLQkJIExPMTYgcmVsb2MuICBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLQkJIGl0c2VsZi4gICovCi0JICAgICAgZm9yIChsb3JlbCA9IHJlbCArIDE7Ci0JCSAgIChsb3JlbCA8IHJlbGVuZAotCQkgICAgJiYgKEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0hJMTZfU0xPCi0JCQl8fCBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1VMTykpOwotCQkgICBsb3JlbCsrKQotCQljb250aW51ZTsKLQkgICAgICBpZiAobG9yZWwgPCByZWxlbmQKLQkJICAmJiBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9MTzE2KQotCQl7Ci0JCSAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCi0JCQkJCSAgY29udGVudHMsIGFkZGVuZCk7Ci0JCSAgciA9IGJmZF9yZWxvY19vazsKLQkJfQotCSAgICAgIGVsc2UKLQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsCi0JCQkJCSAgICBhZGRlbmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgICAgfQotI2VuZGlmIC8qIFVTRV9SRUwgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0JICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0JICBzeW0gPSBOVUxMOwotCSAgc2VjID0gTlVMTDsKLQotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIC8qIExvY2FsIHN5bWJvbC4gICovCi0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgICAgICBzeW1fbmFtZSA9ICI8bG9jYWwgc3ltYm9sPiI7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICsgc3ltLT5zdF92YWx1ZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEV4dGVybmFsIHN5bWJvbC4gICovCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAgICAgc3ltX25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCi0JICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQl7Ci0JCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgICByZWxvY2F0aW9uID0gMDsKLQkJICBlbHNlCi0JCSAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXJlbG9jYXRpb24gPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLCBvZmZzZXQsIHRydWUpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCi0JICBpZiAob2Zmc2V0ID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICB7Ci0JICAgICAgciA9IGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCSAgICAgIGdvdG8gY2hlY2tfcmVsb2M7Ci0JICAgIH0KLQotCSAgc3dpdGNoICgoaW50KSByX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSAoaW50KSBSX00zMlJfMTBfUENSRUwgOgotCSAgICAgIHIgPSBtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyAoaW5wdXRfYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMsIG9mZnNldCwKLQkJCQkJICAgICAgc2VjLCByZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgKGludCkgUl9NMzJSX0hJMTZfU0xPIDoKLQkgICAgY2FzZSAoaW50KSBSX00zMlJfSEkxNl9VTE8gOgotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOwotCi0JCS8qIFdlIGFsbG93IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkxNiByZWxvY3MgYmVmb3JlIHRoZQotCQkgICBMTzE2IHJlbG9jLiAgVGhpcyBwZXJtaXRzIGdjYyB0byBlbWl0IHRoZSBISSBhbmQgTE8gcmVsb2NzCi0JCSAgIGl0c2VsZi4gICovCi0JCWZvciAobG9yZWwgPSByZWwgKyAxOwotCQkgICAgIChsb3JlbCA8IHJlbGVuZAotCQkgICAgICAmJiAoRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9TTE8KLQkJCSAgfHwgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9VTE8pKTsKLQkJICAgICBsb3JlbCsrKQotCQkgIGNvbnRpbnVlOwotCQlpZiAobG9yZWwgPCByZWxlbmQKLQkJICAgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0xPMTYpCi0JCSAgewotCQkgICAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCi0JCQkJCSAgICBjb250ZW50cywgcmVsb2NhdGlvbiArIGFkZGVuZCk7Ci0JCSAgICByID0gYmZkX3JlbG9jX29rOwotCQkgIH0KLQkJZWxzZQotCQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCQljb250ZW50cywgb2Zmc2V0LAotCQkJCQkJcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAoaW50KSBSX00zMlJfU0RBMTYgOgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7Ci0JCW5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLQotCQlpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCi0JCSAgewotCQkgICAgYmZkX3ZtYSBzZGFfYmFzZTsKLQkJICAgIGJmZCAqb3V0X2JmZCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotCi0JCSAgICByID0gbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UgKG91dF9iZmQsIGluZm8sCi0JCQkJCQkgJmVycm1zZywKLQkJCQkJCSAmc2RhX2Jhc2UpOwotCQkgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCQkgICAgICB7Ci0JCQlyZXQgPSBmYWxzZTsKLQkJCWdvdG8gY2hlY2tfcmVsb2M7Ci0JCSAgICAgIH0KLQotCQkgICAgLyogQXQgdGhpcyBwb2ludCBgcmVsb2NhdGlvbicgY29udGFpbnMgdGhlIG9iamVjdCdzCi0JCSAgICAgICBhZGRyZXNzLiAgKi8KLQkJICAgIHJlbG9jYXRpb24gLT0gc2RhX2Jhc2U7Ci0JCSAgICAvKiBOb3cgaXQgY29udGFpbnMgdGhlIG9mZnNldCBmcm9tIF9TREFfQkFTRV8uICAqLwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhbiAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBzZWN0aW9uICglcykiKSwKLQkJCQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkJICAgc3ltX25hbWUsCi0JCQkJCSAgIG0zMnJfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHJfdHlwZV0ubmFtZSwKLQkJCQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotCQkgICAgLypiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsgPz8/IHdoeT8gKi8KLQkJICAgIHJldCA9IGZhbHNlOwotCQkgICAgY29udGludWU7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBkZWZhdWx0IDoKLQkgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsIG9mZnNldCwKLQkJCQkJICAgIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICBjaGVja19yZWxvYzoKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBnZW5lcmljIGVub3VnaCB0byBnbyBpbiBhIHV0aWxpdHkuICAqLwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIGlmIChlcnJtc2cgIT0gTlVMTCkKLQkgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG9mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBlcnJtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIGVycm1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG9mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0jaWYgMCAvKiByZWxheGluZyBub3Qgc3VwcG9ydGVkIHlldCAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtMzJyLgotICAgUmVsYXhpbmcgb24gdGhlIG0zMnIgaXMgdHJpY2t5IGJlY2F1c2Ugb2YgaW5zdHJ1Y3Rpb24gYWxpZ25tZW50Ci0gICByZXF1aXJlbWVudHMgKDQgYnl0ZSBpbnN0cnVjdGlvbnMgbXVzdCBiZSBhbGlnbmVkIG9uIDQgYnl0ZSBib3VuZGFyaWVzKS4KLQotICAgVGhlIGZvbGxvd2luZyByZWxheGluZyBvcHBvcnR1bml0aWVzIGFyZSBoYW5kbGVkOgotCi0gICBzZXRoL2FkZDMvamwgLT4gYmwyNCBvciBibDgKLSAgIHNldGgvYWRkMyAtPiBsZDI0Ci0KLSAgIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIGJsMjQgLT4gYmw4IGJ1dCBnaXZlbjoKLQotICAgLSA0IGJ5dGUgaW5zbnMgbXVzdCBiZSBvbiA0IGJ5dGUgYm91bmRhcmllcwotICAgLSBicmFuY2ggaW5zdHJ1Y3Rpb25zIG9ubHkgYnJhbmNoIHRvIGluc25zIG9uIDQgYnl0ZSBib3VuZGFyaWVzCi0KLSAgIHRoaXMgaXNuJ3QgbXVjaCBvZiBhIHdpbiBiZWNhdXNlIHRoZSBpbnNuIGluIHRoZSAyICJkZWxldGVkIiBieXRlcwotICAgbXVzdCBiZWNvbWUgYSBub3AuICBXaXRoIHNvbWUgY29tcGxleGl0eSBzb21lIHJlYWwgcmVsYXhhdGlvbiBjb3VsZCBiZQotICAgZG9uZSBidXQgdGhlIGZyZXF1ZW5jeSBqdXN0IHdvdWxkbid0IG1ha2UgaXQgd29ydGggaXQ7IGl0J3MgYmV0dGVyIHRvCi0gICB0cnkgdG8gZG8gYWxsIHRoZSBjb2RlIGNvbXBhY3Rpb24gb25lIGNhbiBlbHNld2hlcmUuCi0gICBXaGVuIHRoZSBjaGlwIHN1cHBvcnRzIHBhcmFsbGVsIDE2IGJpdCBpbnNucywgdGhpbmdzIG1heSBjaGFuZ2UuCi0qLwotCi1zdGF0aWMgYm9vbGVhbiAKLW0zMnJfZWxmX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIC8qIFRoZSBSZWxhIHN0cnVjdHVyZXMgYXJlIHVzZWQgaGVyZSBiZWNhdXNlIHRoYXQncyB3aGF0Ci0gICAgIF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcyB1c2VzIFtmb3IgY29udmVuaWVuY2UgLSBpdCBzZXRzIHRoZSBhZGRlbmQKLSAgICAgZmllbGQgdG8gMF0uICAqLwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIC8qIEFzc3VtZSBub3RoaW5nIGNoYW5nZXMuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgotICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKLSAgICAgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0gICAgICB8fCAwIC8qIEZJWE1FOiBjaGVjayBTSEZfTTMyUl9DQU5fUkVMQVggKi8pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICAvKiBXYWxrIHRocm91Z2ggdGhlbSBsb29raW5nIGZvciByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN5bXZhbDsKLQotICAgICAgLyogSWYgdGhpcyBpc24ndCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVsYXhlZCwgdGhlbiBpZ25vcmUKLQkgdGhpcyByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfTTMyUl9ISTE2X1NMTykKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBzeW1fc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOwotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgLyogVHJ5IHRvIGNoYW5nZSBhIHNldGgvYWRkMy9qbCBzdWJyb3V0aW5lIGNhbGwgdG8gYmwyNCBvciBibDguCi0JIFRoaXMgc2VxdWVuY2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciB3aGVuIGNvbXBpbGluZyBpbgotCSAzMiBiaXQgbW9kZS4gIEFsc28gbG9vayBmb3Igc2V0aC9hZGQzIC0+IGxkMjQuICAqLwotCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTTMyUl9ISTE2X1NMTykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKLQkgIGJmZF92bWEgcGMgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGlyZWwtPnJfb2Zmc2V0KTsKLQkgIGJmZF9zaWduZWRfdm1hIHBjcmVsX3ZhbHVlID0gc3ltdmFsIC0gcGM7Ci0JICB1bnNpZ25lZCBpbnQgY29kZSxyZWc7Ci0JICBpbnQgYWRkZW5kLG5vcF9wLGJsOF9wLHRvX2RlbGV0ZTsKLQotCSAgLyogVGhlIHRlc3RzIGFyZSBvcmRlcmVkIHNvIHRoYXQgd2UgZ2V0IG91dCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlCi0JICAgICBpZiB0aGlzIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gcmVsYXgsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdAotCSAgICAgd2UgYXJlIGxvb2tpbmcgZm9yIHR3byBzZXBhcmF0ZSBwb3NzaWJpbGl0aWVzIChqbC9sZDI0KS4gICovCi0KLQkgIC8qIERvIG5vdGhpbmcgaWYgbm8gcm9vbSBpbiB0aGUgc2VjdGlvbiBmb3IgdGhpcyB0byBiZSB3aGF0IHdlJ3JlCi0JICAgICBsb29raW5nIGZvci4gICovCi0JICBpZiAoaXJlbC0+cl9vZmZzZXQgPiBzZWMtPl9jb29rZWRfc2l6ZSAtIDgpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgcmVsb2NhdGlvbiBhcHBsaWVzIHRvIHRoZSBuZXh0Ci0JICAgICBpbnN0cnVjdGlvbiBhbmQgdGhhdCBpdCdzIHRoZSBhZGQzJ3MgcmVsb2MuICAqLwotCSAgbnJlbCA9IGlyZWwgKyAxOwotCSAgaWYgKG5yZWwgPT0gaXJlbGVuZAotCSAgICAgIHx8IGlyZWwtPnJfb2Zmc2V0ICsgNCAhPSBucmVsLT5yX29mZnNldAotCSAgICAgIHx8IEVMRjMyX1JfVFlQRSAobnJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX00zMlJfTE8xNikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBzZXRoL2FkZDMuICAqLwotCSAgLyogRklYTUU6IFRoaXMgaXMgd2hlcmUgbWFjcm9zIGZyb20gY2dlbiBjYW4gY29tZSBpbi4gICovCi0JICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDApOwotCSAgaWYgKChjb2RlICYgMHhmMGZmKSAhPSAweGQwYzApCi0JICAgIGNvbnRpbnVlOyAvKiBub3Qgc2V0aCByTixmb28gKi8KLQkgIHJlZyA9IChjb2RlICYgMHgwZjAwKSA+PiA4OwotCSAgY29kZSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA0KTsKLQkgIGlmIChjb2RlICE9ICgweDgwYTAgfCByZWcgfCAocmVnIDw8IDgpKSkKLQkgICAgY29udGludWU7IC8qIG5vdCBhZGQzIHJOLHJOLGZvbyAqLwotCi0JICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGNvbmZpcm1lZCB3ZSBoYXZlIHNldGgvYWRkMy4gIE5vdyBjaGVjawotCSAgICAgd2hldGhlciB0aGUgbmV4dCBpbnNuIGlzIGEgamwsIGluIHdoaWNoIGNhc2UgdHJ5IHRvIGNoYW5nZSB0aGlzCi0JICAgICB0byBibDI0IG9yIGJsOC4gICovCi0KLQkgIC8qIEVuc3VyZSB0aGUgYnJhbmNoIHRhcmdldCBpcyBpbiByYW5nZS4KLQkgICAgIFRoZSBibDI0IGluc3RydWN0aW9uIGhhcyBhIDI0IGJpdCBvcGVyYW5kIHdoaWNoIGlzIHRoZSB0YXJnZXQKLQkgICAgIGFkZHJlc3MgcmlnaHQgc2hpZnRlZCBieSAyLCBnaXZpbmcgYSBzaWduZWQgcmFuZ2Ugb2YgMjYgYml0cy4KLQkgICAgIE5vdGUgdGhhdCA0IGJ5dGVzIGFyZSBhZGRlZCB0byB0aGUgaGlnaCB2YWx1ZSBiZWNhdXNlIHRoZSB0YXJnZXQKLQkgICAgIHdpbGwgYmUgYXQgbGVhc3QgNCBieXRlcyBjbG9zZXIgaWYgd2UgY2FuIHJlbGF4LiAgSXQnbGwgYWN0dWFsbHkKLQkgICAgIGJlIDQgb3IgOCBieXRlcyBjbG9zZXIsIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGp1c3QgeWV0IGFuZAotCSAgICAgdGhlIGRpZmZlcmVuY2UgaXNuJ3Qgc2lnbmlmaWNhbnQgZW5vdWdoIHRvIHdvcnJ5IGFib3V0LiAgKi8KLSNpZm5kZWYgVVNFX1JFTCAvKiBwdXQgaW4gZm9yIGxlYXJuaW5nIHB1cnBvc2VzICovCi0JICBwY3JlbF92YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLSNlbHNlCi0JICBhZGRlbmQgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDIpOwotCSAgcGNyZWxfdmFsdWUgKz0gYWRkZW5kOwotI2VuZGlmCi0KLQkgIGlmIChwY3JlbF92YWx1ZSA+PSAtKDEgPDwgMjUpICYmIHBjcmVsX3ZhbHVlIDwgKDEgPDwgMjUpICsgNAotCSAgICAgIC8qIERvIG5vdGhpbmcgaWYgbm8gcm9vbSBpbiB0aGUgc2VjdGlvbiBmb3IgdGhpcyB0byBiZSB3aGF0IHdlJ3JlCi0JCSBsb29raW5nIGZvci4gICovCi0JICAgICAgJiYgKGlyZWwtPnJfb2Zmc2V0IDw9IHNlYy0+X2Nvb2tlZF9zaXplIC0gMTIpCi0JICAgICAgLyogRW5zdXJlIHRoZSBuZXh0IGluc24gaXMgImpsIHJOIi4gICovCi0JICAgICAgJiYgKChjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDgpKSwKLQkJICBjb2RlICE9ICgweDFlYzAgfCByZWcpKSkKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiByZWxheCB0byBibDI0L2JsOC4gICovCi0KLQkgICAgICAvKiBTZWUgaWYgdGhlcmUncyBhIG5vcCBmb2xsb3dpbmcgdGhlIGpsLgotCQkgQWxzbyBzZWUgaWYgd2UgY2FuIHVzZSBhIGJsOCBpbnNuLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEwKTsKLQkgICAgICBub3BfcCA9IChjb2RlICYgMHg3ZmZmKSA9PSBOT1BfSU5TTjsKLQkgICAgICBibDhfcCA9IHBjcmVsX3ZhbHVlID49IC0weDIwMCAmJiBwY3JlbF92YWx1ZSA8IDB4MjAwOwotCi0JICAgICAgaWYgKGJsOF9wKQotCQl7Ci0JCSAgLyogQ2hhbmdlICJzZXRoIHJOLGZvbyIgdG8gImJsOCBmb28gfHwgbm9wIi4KLQkJICAgICBXZSBPUiBpbiBDT0RFIGp1c3QgaW4gY2FzZSBpdCdzIG5vdCBhIG5vcCAodGVjaG5pY2FsbHksCi0JCSAgICAgQ09ERSBjdXJyZW50bHkgbXVzdCBiZSBhIG5vcCwgYnV0IGZvciBjbGVhbm5lc3Mgd2UKLQkJICAgICBhbGxvdyBpdCB0byBiZSBhbnl0aGluZykuICAqLwotI2lmbmRlZiBVU0VfUkVMIC8qIHB1dCBpbiBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKi8KLQkJICBjb2RlID0gMHg3ZTAwMDAwMCB8IE1BS0VfUEFSQUxMRUwgKGNvZGUpOwotI2Vsc2UKLQkJICBjb2RlID0gKDB4N2UwMDAwMDAgKyAoKChhZGRlbmQgPj4gMikgJiAweGZmKSA8PCAxNikpIHwgTUFLRV9QQVJBTExFTCAoY29kZSk7Ci0jZW5kaWYKLQkJICB0b19kZWxldGUgPSA4OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2hhbmdlIHRoZSBzZXRoIHJOLGZvbyB0byBhIGJsMjQgZm9vLiAgKi8KLSNpZm5kZWYgVVNFX1JFTCAvKiBwdXQgaW4gZm9yIGxlYXJuaW5nIHB1cnBvc2VzICovCi0JCSAgY29kZSA9IDB4ZmUwMDAwMDA7Ci0jZWxzZQotCQkgIGNvZGUgPSAweGZlMDAwMDAwICsgKChhZGRlbmQgPj4gMikgJiAweGZmZmZmZik7Ci0jZW5kaWYKLQkJICB0b19kZWxldGUgPSBub3BfcCA/IDggOiA0OwotCQl9Ci0KLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotCSAgICAgIC8qIFNldCB0aGUgbmV3IHJlbG9jIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKG5yZWwtPnJfaW5mbyksCi0JCQkJCSAgIGJsOF9wID8gUl9NMzJSXzEwX1BDUkVMIDogUl9NMzJSXzI2X1BDUkVMKTsKLQotCSAgICAgIC8qIERlbGV0ZSB0aGUgYWRkMyByZWxvYyBieSBtYWtpbmcgaXQgYSBudWxsIHJlbG9jLiAgKi8KLQkgICAgICBucmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAotCQkJCQkgICBSX00zMlJfTk9ORSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkZGVuZCA+PSAwCi0JCSAgICYmIHN5bXZhbCArIGFkZGVuZCA8PSAweGZmZmZmZikKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiByZWxheCB0byBsZDI0LiAgKi8KLQotCSAgICAgIGNvZGUgPSAweGUwMDAwMDAwIHwgKHJlZyA8PCAyNCkgfCAoYWRkZW5kICYgMHhmZmZmZmYpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCSAgICAgIHRvX2RlbGV0ZSA9IDQ7Ci0JICAgICAgLyogVGVsbCB0aGUgZm9sbG93aW5nIGNvZGUgYSBub3AgZmlsbGVyIGlzbid0IG5lZWRlZC4gICovCi0JICAgICAgbm9wX3AgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBDYW4ndCBkbyBhbnl0aGluZyBoZXJlLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAvKiBEZWxldGUgVE9fREVMRVRFIGJ5dGVzIG9mIGRhdGEuICAqLwotCSAgaWYgKCFtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJICAgIGlyZWwtPnJfb2Zmc2V0ICsgNCwgdG9fZGVsZXRlKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIE5vdyB0aGF0IHRoZSBmb2xsb3dpbmcgYnl0ZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gcGxhY2UsIHNlZSBpZgotCSAgICAgd2UgbmVlZCB0byByZXBsYWNlIHRoZSBqbCB3aXRoIGEgbm9wLiAgVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGFkCi0JICAgICB0byB1c2UgYSBibDI0IGluc24gYW5kIHRoZSBpbnNuIGZvbGxvd2luZyB0aGUgamwgaXNuJ3QgYSBub3AuCi0JICAgICBUZWNobmljYWxseSwgdGhpcyBzaXR1YXRpb24gY2FuJ3QgaGFwcGVuIChzaW5jZSB0aGUgaW5zbiBjYW4KLQkgICAgIG5ldmVyIGJlIGV4ZWN1dGVkKSBidXQgdG8gYmUgY2xlYW4gd2UgZG8gdGhpcy4gIFdoZW4gdGhlIGNoaXAKLQkgICAgIHN1cHBvcnRzIHBhcmFsbGVsIDE2IGJpdCBpbnNucyB0aGluZ3MgbWF5IGNoYW5nZS4KLQkgICAgIFdlIGRvbid0IG5lZWQgdG8gZG8gdGhpcyBpbiB0aGUgY2FzZSBvZiByZWxheGluZyB0byBsZDI0LAotCSAgICAgYW5kIHRoZSBhYm92ZSBjb2RlIHNldHMgbm9wX3Agc28gdGhpcyBpc24ndCBkb25lLiAgKi8KLQkgIGlmICghIG5vcF9wICYmIHRvX2RlbGV0ZSA9PSA0KQotCSAgICBiZmRfcHV0XzE2IChhYmZkLCBOT1BfSU5TTiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOwotCi0JICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28gd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgKmFnYWluID0gdHJ1ZTsKLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBsb29wIHRvIHRyeSB0aGUgbmV4dCByZWxvYyAqLwotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JfQotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgaW50IGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICBpbnQgc2huZHgsIGluZGV4OwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCi0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgaWYgKChpcmVsLT5yX29mZnNldCA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX29mZnNldCA8IHRvYWRkcikpCi0JaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgotCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotICAgICAgc3ltX2hhc2ggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdOwotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmICgoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgLT0gY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICB3aGljaCB1c2VzIG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotbTMycl9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKLSAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZQotICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gIG1lbWNweSAoZGF0YSwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzLAotCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSAqaXN5bXA7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQotICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JZXh0ZXJuYWxfc3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgZXh0ZXJuYWxfc3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSk7Ci0JICBpZiAoZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCi0JCQkgICAgc3ltdGFiX2hkci0+c2hfaW5mbywgaW5wdXRfYmZkKQotCQkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpIE5VTEwsCi0JCQkgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKLSAgICAgIHNlY3BwID0gc2VjdGlvbnM7Ci0gICAgICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgKytlc3ltLCArK2lzeW1wLCArK3NlY3BwKQotCXsKLQkgIGFzZWN0aW9uICppc2VjOwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bXApOwotCi0JICBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPiAwICYmIGlzeW1wLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIGlzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+c3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9NMzJSX1NDT01NT04pCi0JICAgIGlzZWMgPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2hvIGtub3dzPyAgKi8KLQkgICAgICBpc2VjID0gTlVMTDsKLQkgICAgfQotCi0JICAqc2VjcHAgPSBpc2VjOwotCX0KLQotICAgICAgaWYgKCEgbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZW5kaWYgLyogI2lmIDAgKi8KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX00zMlJfQVJDSDogICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTMyciwgYmZkX21hY2hfbTMycik7ICBicmVhazsKLSAgICBjYXNlIEVfTTMyUlhfQVJDSDogICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9tMzJyLCBiZmRfbWFjaF9tMzJyeCk7IGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0b3JlIHRoZSBtYWNoaW5lIG51bWJlciBpbiB0aGUgZmxhZ3MgZmllbGQuICAqLwotc3RhdGljIHZvaWQKLW0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBib29sZWFuIGxpbmtlciBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbWFjaF9tMzJyOiAgdmFsID0gRV9NMzJSX0FSQ0g7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTMycng6IHZhbCA9IEVfTTMyUlhfQVJDSDsgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9NMzJSX0FSQ0g7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotLyogRnVuY3Rpb24gdG8ga2VlcCBNMzJSIHNwZWNpZmljIGZpbGUgZmxhZ3MuICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKiAgICBhYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncwotCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7Ci0KLSAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGluX2ZsYWdzICA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAotCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0JIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKLQkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQl7Ci0JICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0gIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX00zMlJfQVJDSCkpCi0gICAgewotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gRV9NMzJSX0FSQ0gpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogSW5zdHJ1Y3Rpb24gc2V0IG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZCAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpCi0gIAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotICAKLSAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICVseCIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0gIAotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTTMyUl9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9NMzJSX0FSQ0g6ICBmcHJpbnRmIChmaWxlLCBfKCI6IG0zMnIgaW5zdHJ1Y3Rpb25zIikpOyAgYnJlYWs7Ci0gICAgY2FzZSBFX00zMlJYX0FSQ0g6IGZwcmludGYgKGZpbGUsIF8oIjogbTMycnggaW5zdHJ1Y3Rpb25zIikpOyBicmVhazsKLSAgICB9Ci0gIAotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotYXNlY3Rpb24gKgotbTMycl9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX00zMlJfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9NMzJSX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLSAKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICBlbHNlCi0gICAgIHsKLSAgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLSAgICAgICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotICAgICAgICAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0gICAgICAgICAgICAgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiB3ZSBkb24ndCB1c2UgZ290IGFuZCBwbHQgZW50cmllcyBmb3IgbTMyciAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotIAotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX00zMlJfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTTMyUl9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0KLQwKLQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbTMycgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19NMzJSCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxIC8qIEV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IE1pdHN1YmlzaGkuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgIGJmZF9lbGYzMl9tMzJyX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tMzJyIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkJMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCQltMzJyX2luZm9fdG9faG93dG9fcmVsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbglfYmZkX20zMnJfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZwkJX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJCW0zMnJfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQltMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICAgICBtMzJyX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICAgICAgICAgIG0zMnJfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgICAgIG0zMnJfZWxmX2NoZWNrX3JlbG9jcwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAgICAgICAgICAgICAxCi0jaWYgMCAvKiBub3QgeWV0ICovCi0vKiByZWxheCBzdXBwb3J0ICovCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbgkJbTMycl9lbGZfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQkJCW0zMnJfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCQltMzJyX2VsZl9vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIAltMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAltMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIAltMzJyX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCW0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQltMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0JCQkJCQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLW02OGsuYyBiL2JmZC9lbGYzMi1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjIyMzAuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLW02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMTAgKzAsMCBAQAotLyogTW90b3JvbGEgNjhrIHNlcmllcyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MywgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL202OGsuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHJ0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmX202OGtfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBhc2VjdGlvbiAqZWxmX202OGtfZ2NfbWFya19ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZ2Nfc3dlZXBfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfbTY4a19jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gewotICBIT1dUTyhSXzY4S19OT05FLCAgICAgICAwLCAwLCAwLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfTk9ORSIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwMDAsZmFsc2UpLAotICBIT1dUTyhSXzY4S18zMiwgICAgICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfMzIiLCAgICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S18xNiwgICAgICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfMTYiLCAgICAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S184LCAgICAgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfOCIsICAgICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QQzMyLCAgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUEMzMiIsICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BDMTYsICAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QQzE2IiwgICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUEM4LCAgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BDOCIsICAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1QzMiwgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMzIiLCAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX0dPVDE2LCAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QxNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfR09UOCwgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDgiLCAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1QzMk8sICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMzJPIiwgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HT1QxNk8sICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMTZPIiwgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HT1Q4TywgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UOE8iLCAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQzMiwgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMzIiLCAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BMVDE2LCAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQxNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUExUOCwgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDgiLCAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QTFQzMk8sICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMzJPIiwgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQxNk8sICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMTZPIiwgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQ4TywgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUOE8iLCAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19DT1BZLCAgICAgICAwLCAwLCAwLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfQ09QWSIsICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HTE9CX0RBVCwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR0xPQl9EQVQiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19KTVBfU0xPVCwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfSk1QX1NMT1QiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19SRUxBVElWRSwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUkVMQVRJVkUiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl82OEtfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl82OEtfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSXzY4S19HTlVfVlRFTlRSWSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfNjhLX0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1ydHlwZV90b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRShkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSXzY4S19tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3RhYmxlW0VMRjMyX1JfVFlQRShkc3QtPnJfaW5mbyldOwotfQotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIHJ0eXBlX3RvX2hvd3RvCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF92YWw7Ci0gIGludCBlbGZfdmFsOwotfSByZWxvY19tYXBbXSA9IHsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl82OEtfTk9ORSB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl82OEtfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfNjhLXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfNjhLXzggfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfNjhLX1BDMzIgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUENSRUwsIFJfNjhLX1BDMTYgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl82OEtfUEM4IH0sCi0gIHsgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTCwgUl82OEtfR09UMzIgfSwKLSAgeyBCRkRfUkVMT0NfMTZfR09UX1BDUkVMLCBSXzY4S19HT1QxNiB9LAotICB7IEJGRF9SRUxPQ184X0dPVF9QQ1JFTCwgUl82OEtfR09UOCB9LAotICB7IEJGRF9SRUxPQ18zMl9HT1RPRkYsIFJfNjhLX0dPVDMyTyB9LAotICB7IEJGRF9SRUxPQ18xNl9HT1RPRkYsIFJfNjhLX0dPVDE2TyB9LAotICB7IEJGRF9SRUxPQ184X0dPVE9GRiwgUl82OEtfR09UOE8gfSwKLSAgeyBCRkRfUkVMT0NfMzJfUExUX1BDUkVMLCBSXzY4S19QTFQzMiB9LAotICB7IEJGRF9SRUxPQ18xNl9QTFRfUENSRUwsIFJfNjhLX1BMVDE2IH0sCi0gIHsgQkZEX1JFTE9DXzhfUExUX1BDUkVMLCBSXzY4S19QTFQ4IH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BMVE9GRiwgUl82OEtfUExUMzJPIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BMVE9GRiwgUl82OEtfUExUMTZPIH0sCi0gIHsgQkZEX1JFTE9DXzhfUExUT0ZGLCBSXzY4S19QTFQ4TyB9LAotICB7IEJGRF9SRUxPQ19OT05FLCBSXzY4S19DT1BZIH0sCi0gIHsgQkZEX1JFTE9DXzY4S19HTE9CX0RBVCwgUl82OEtfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfNjhLX0pNUF9TTE9ULCBSXzY4S19KTVBfU0xPVCB9LAotICB7IEJGRF9SRUxPQ182OEtfUkVMQVRJVkUsIFJfNjhLX1JFTEFUSVZFIH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfNjhLXzMyIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSXzY4S19HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl82OEtfR05VX1ZURU5UUlkgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXJlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChyZWxvY19tYXApIC8gc2l6ZW9mIChyZWxvY19tYXBbMF0pOyBpKyspCi0gICAgewotICAgICAgaWYgKHJlbG9jX21hcFtpXS5iZmRfdmFsID09IGNvZGUpCi0JcmV0dXJuICZob3d0b190YWJsZVtyZWxvY19tYXBbaV0uZWxmX3ZhbF07Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHJlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIEVMRl9BUkNIIGJmZF9hcmNoX202OGsKLS8qIGVuZCBjb2RlIGdlbmVyYXRlZCBieSBlbGYuZWwgKi8KLQotI2RlZmluZSBVU0VfUkVMQQotCi0MCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBtNjhrIEVMRiBsaW5rZXIuICAqLwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGliYy5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDIwCi0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2tzIGxpa2UgdGhpcy4gIFNlZQotICAgdGhlIFNWUjQgQUJJIG02OGsgc3VwcGxlbWVudCB0byBzZWUgaG93IHRoaXMgd29ya3MuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX202OGtfcGx0MF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweDJmLCAweDNiLCAweDAxLCAweDcwLCAvKiBtb3ZlLmwgKCVwYyxhZGRyKSwtKCVzcCkgKi8KLSAgMCwgMCwgMCwgMCwJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gLmdvdCArIDQuICAqLwotICAweDRlLCAweGZiLCAweDAxLCAweDcxLCAvKiBqbXAgKFslcGMsYWRkcl0pICovCi0gIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIC5nb3QgKyA4LiAgKi8KLSAgMCwgMCwgMCwgMAkJICAvKiBwYWQgb3V0IHRvIDIwIGJ5dGVzLiAgKi8KLX07Ci0KLS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZSB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9tNjhrX3BsdF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweDRlLCAweGZiLCAweDAxLCAweDcxLCAvKiBqbXAgKFslcGMsc3ltYm9sQEdPVFBDXSkgKi8KLSAgMCwgMCwgMCwgMCwJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3ltYm9sJ3MgLmdvdCBlbnRyeS4gICovCi0gIDB4MmYsIDB4M2MsCQkgIC8qIG1vdmUubCAjb2Zmc2V0LC0oJXNwKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBpbnRvIHJlbG9jYXRpb24gdGFibGUuICAqLwotICAweDYwLCAweGZmLAkJICAvKiBicmEubCAucGx0ICovCi0gIDAsIDAsIDAsIDAJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3RhcnQgb2YgLnBsdC4gICovCi19OwotCi0jZGVmaW5lIENQVTMyX0ZMQUcoYWJmZCkgIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0NQVTMyKQotCi0jZGVmaW5lIFBMVF9DUFUzMl9FTlRSWV9TSVpFIDI0Ci0vKiBQcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyaWVzIGZvciB0aGUgY3B1MzIgKi8KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfY3B1MzJfcGx0MF9lbnRyeVtQTFRfQ1BVMzJfRU5UUllfU0laRV0gPQotewotICAweDIyLCAweDdiLCAweDAxLCAweDcwLCAvKiBtb3ZlYWwgJXBjQCgweGMpLCAlYTEgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gLmdvdCArIDQuICAqLwotICAweDRlLCAweGQxLCAgICAgICAgICAgICAvKiBqbXAgJWExQCAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggb2Zmc2V0IHRvIC5nb3QgKzguICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHBhZCBvdXQgdG8gMjQgYnl0ZXMuICAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiBwYWQgb3V0IHRvIDI0IGJ5dGVzLiAgKi8KLSAgMCwgMAotfTsKLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9jcHUzMl9wbHRfZW50cnlbUExUX0NQVTMyX0VOVFJZX1NJWkVdID0KLXsKLSAgMHgyMiwgMHg3YiwgMHgwMSwgMHg3MCwgIC8qIG1vdmVhbCAlcGNAKDB4YyksICVhMSAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3ltYm9sJ3MgLmdvdCBlbnRyeS4gICovCi0gIDB4NGUsIDB4ZDEsICAgICAgICAgICAgICAvKiBqbXAgJWExQCAqLwotICAweDJmLCAweDNjLCAgICAgICAgICAgICAgLyogbW92ZS5sICNvZmZzZXQsLSglc3ApICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBpbnRvIHJlbG9jYXRpb24gdGFibGUuICAqLwotICAweDYwLCAweGZmLCAgICAgICAgICAgICAgLyogYnJhLmwgLnBsdCAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3RhcnQgb2YgLnBsdC4gICovCi0gIDAsIDAKLX07Ci0KLS8qIFRoZSBtNjhrIGxpbmtlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHRoYXQgaXQKLSAgIGRlY2lkZXMgdG8gY29weSBpbiBjaGVja19yZWxvY3MgZm9yIGVhY2ggc3ltYm9sLiAgVGhpcyBpcyBzbyB0aGF0IGl0Ci0gICBjYW4gZGlzY2FyZCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgaXQgZG9lc24ndCBuZWVkIHRoZW0gd2hlbiBsaW5raW5nCi0gICB3aXRoIC1Cc3ltYm9saWMuICBXZSBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWVsZCBleHRlbmRpbmcgdGhlCi0gICByZWd1bGFyIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIHdlIGhhdmUKLSAgIGNvcGllZCBmb3IgYSBnaXZlbiBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZAotewotICAvKiBOZXh0IHNlY3Rpb24uICAqLwotICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqbmV4dDsKLSAgLyogQSBzZWN0aW9uIGluIGR5bm9iai4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwotICAvKiBOdW1iZXIgb2YgcmVsb2NzIGNvcGllZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotfTsKLQotLyogbTY4ayBFTEYgbGlua2VyIGhhc2ggZW50cnkuICAqLwotCi1zdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogTnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVsZl9tNjhrX3BjcmVsX3JlbG9jc19jb3BpZWQgKnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci19OwotCi0vKiBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIERlY2xhcmUgdGhpcyBub3cgdGhhdCB0aGUgYWJvdmUgc3RydWN0dXJlcyBhcmUgZGVmaW5lZC4gICovCi0KLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2Rpc2NhcmRfY29waWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIFRyYXZlcnNlIGFuIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgZWxmX202OGtfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZSAqKSAocCktPmhhc2gpCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhbiBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgcmV0LT5wY3JlbF9yZWxvY3NfY29waWVkID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmX202OGtfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgIGVsZl9tNjhrX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBLZWVwIG02OGstc3BlY2lmaWMgZmxhZ3MgaW4gdGhlIEVMRiBoZWFkZXIgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgbTY4ay1zcGVjaWZpYyBkYXRhIGZyb20gb25lIG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfbTY4a19jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIGluX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gCi0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gaW5fZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGluX2ZsYWdzICA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoIWVsZl9mbGFnc19pbml0IChvYmZkKSkKLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHB0cjsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHB0cjsKLQotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotCi0gIC8qIFByaW50IG5vcm1hbCBFTEYgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLQotICAvKiBJZ25vcmUgaW5pdCBmbGFnIC0gaXQgbWF5IG5vdCBiZSBzZXQsIGRlc3BpdGUgdGhlIGZsYWdzIGZpZWxkIGNvbnRhaW5pbmcgdmFsaWQgZGF0YS4gICovCi0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXyAoInByaXZhdGUgZmxhZ3MgPSAlbHg6IiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLQotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9DUFUzMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtjcHUzMl0iKSk7Ci0KLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcmVsZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl82OEtfR09UODoKLQljYXNlIFJfNjhLX0dPVDE2OgotCWNhc2UgUl82OEtfR09UMzI6Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl82OEtfR09UOE86Ci0JY2FzZSBSXzY4S19HT1QxNk86Ci0JY2FzZSBSXzY4S19HT1QzMk86Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoZHlub2JqID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJCQkJCSAoU0VDX0FMTE9DCi0JCQkJCQkgIHwgU0VDX0xPQUQKLQkJCQkJCSAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3QucmVmY291bnQgPT0gLTEpCi0JCXsKLQkJICBoLT5nb3QucmVmY291bnQgPSAxOwotCi0JCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkJICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCFiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgLyogQWxsb2NhdGUgc3BhY2UgaW4gdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0JCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JCSAgLyogQWxsb2NhdGUgcmVsb2NhdGlvbiBzcGFjZS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWgtPmdvdC5yZWZjb3VudCsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzID09IE5VTEwpCi0JCXsKLQkJICBzaXplX3Qgc2l6ZTsKLQotCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfc2lnbmVkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X3JlZmNvdW50cyA9ICgoYmZkX3NpZ25lZF92bWEgKikKLQkJCQkJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSkpOwotCQkgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpID0gbG9jYWxfZ290X3JlZmNvdW50czsKLQkJICBtZW1zZXQgKGxvY2FsX2dvdF9yZWZjb3VudHMsIC0xLCBzaXplKTsKLQkJfQotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9PSAtMSkKLQkJewotCQkgIGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID0gMTsKLQotCQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotCQkJIG91dHB1dCBhIFJfNjhLX1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlIGR5bmFtaWMKLQkJCSBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQlsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSsrOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUODoKLQljYXNlIFJfNjhLX1BMVDE2OgotCWNhc2UgUl82OEtfUExUMzI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLQkgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdoaWNoIGlzCi0gICAgICAgICAgICAgbmV2ZXIgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5Ci0gICAgICAgICAgICAgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgLyogSWYgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgd2UgcmVzb2x2ZSBpdCBkaXJlY3RseSB3aXRob3V0Ci0JICAgICBjcmVhdGluZyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgIGVsc2UKLQkgICAgaC0+cGx0LnJlZmNvdW50Kys7Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUOE86Ci0JY2FzZSBSXzY4S19QTFQxNk86Ci0JY2FzZSBSXzY4S19QTFQzMk86Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gaGF2ZSB0aGlzIHJlbG9jYXRpb24gZm9yIGEKLQkJIGxvY2FsIHN5bWJvbC4gIEZJWE1FOiBkb2VzIGl0PyAgSG93IHRvIGhhbmRsZSBpdCBpZgotCQkgaXQgZG9lcyBtYWtlIHNlbnNlPyAgKi8KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCFiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JICAgIGgtPnBsdC5yZWZjb3VudCA9IDE7Ci0JICBlbHNlCi0JICAgIGgtPnBsdC5yZWZjb3VudCsrOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX1BDODoKLQljYXNlIFJfNjhLX1BDMTY6Ci0JY2FzZSBSXzY4S19QQzMyOgotCSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHRoaXMgaXMgbm90IGEgbG9jYWwKLQkgICAgIHN5bWJvbCwgd2UgbmVlZCB0byBjb3B5IHRoZSByZWxvYyBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4KLQkgICAgIEhvd2V2ZXIgd2hlbiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYyBhbmQgdGhpcyBpcyBhIGdsb2JhbAotCSAgICAgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZSBpbmNsdWRpbmcgaW4gdGhlCi0JICAgICBsaW5rIChpLmUuLCBERUZfUkVHVUxBUiBpcyBzZXQpLCB0aGVuIHdlIGNhbiByZXNvbHZlIHRoZQotCSAgICAgcmVsb2MgZGlyZWN0bHkuICBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbm90IHNlZW4gYWxsIHRoZSBpbnB1dAotCSAgICAgZmlsZXMsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQgREVGX1JFR1VMQVIgaXMgbm90IHNldCBub3cgYnV0Ci0JICAgICB3aWxsIGJlIHNldCBsYXRlciAoaXQgaXMgbmV2ZXIgY2xlYXJlZCkuICBXZSBhY2NvdW50IGZvciB0aGF0Ci0JICAgICBwb3NzaWJpbGl0eSBiZWxvdyBieSBzdG9yaW5nIGluZm9ybWF0aW9uIGluIHRoZQotCSAgICAgcGNyZWxfcmVsb2NzX2NvcGllZCBmaWVsZCBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0JICBpZiAoIShpbmZvLT5zaGFyZWQKLQkJJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJJiYgaCAhPSBOVUxMCi0JCSYmICghaW5mby0+c3ltYm9saWMKLQkJICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkKLQkgICAgewotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCXsKLQkJICAvKiBNYWtlIHN1cmUgYSBwbHQgZW50cnkgaXMgY3JlYXRlZCBmb3IgdGhpcyBzeW1ib2wgaWYKLQkJICAgICBpdCB0dXJucyBvdXQgdG8gYmUgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgZHluYW1pYwotCQkgICAgIG9iamVjdC4gICovCi0JCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkJICAgIGgtPnBsdC5yZWZjb3VudCA9IDE7Ci0JCSAgZWxzZQotCQkgICAgaC0+cGx0LnJlZmNvdW50Kys7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfNjhLXzg6Ci0JY2FzZSBSXzY4S18xNjoKLQljYXNlIFJfNjhLXzMyOgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIE1ha2Ugc3VyZSBhIHBsdCBlbnRyeSBpcyBjcmVhdGVkIGZvciB0aGlzIHN5bWJvbCBpZiBpdAotCQkgdHVybnMgb3V0IHRvIGJlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQkgICAgICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCQloLT5wbHQucmVmY291bnQgPSAxOwotCSAgICAgIGVsc2UKLQkJaC0+cGx0LnJlZmNvdW50Kys7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG5lZWQgdG8gY29weSB0aGUKLQkgICAgIHJlbG9jIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLQkJIHJlbG9jIHR5cGVzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLQkJIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoaXMgcmVsb2MuICAqLwotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsCi0JCQkJCQkgICAgIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCQkJICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JICAgICAgLyogSWYgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mCi0JCSBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3ZSBoYXZlIGVudGVyZWQgZm9yIHRoaXMgc3ltYm9sLAotCQkgc28gdGhhdCB3ZSBjYW4gZGlzY2FyZCB0aGVtIGFnYWluIGlmIHRoZSBzeW1ib2wgaXMgbGF0ZXIKLQkJIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzCi0JCSBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgdXNpbmcgYW4gbTY4a2VsZiBsaW5rZXIgaGFzaCB0YWJsZSwKLQkJIHdoaWNoIG1lYW5zIHRoYXQgaCBpcyByZWFsbHkgYSBwb2ludGVyIHRvIGFuCi0JCSBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkuICAqLwotCSAgICAgIGlmICgoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl82OEtfUEM4Ci0gCQkgICB8fCBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSXzY4S19QQzE2Ci0gCQkgICB8fCBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSXzY4S19QQzMyKQotCQkgICYmIGluZm8tPnN5bWJvbGljKQotCQl7Ci0JCSAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqZWg7Ci0JCSAgc3RydWN0IGVsZl9tNjhrX3BjcmVsX3JlbG9jc19jb3BpZWQgKnA7Ci0KLQkJICBlaCA9IChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkJICBmb3IgKHAgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkJICAgIGlmIChwLT5zZWN0aW9uID09IHNyZWxvYykKLQkJICAgICAgYnJlYWs7Ci0KLQkJICBpZiAocCA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBwID0gKChzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqKQotCQkJICAgYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAqcCkpOwotCQkgICAgICBpZiAocCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBwLT5uZXh0ID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci0JCSAgICAgIGVoLT5wY3JlbF9yZWxvY3NfY29waWVkID0gcDsKLQkJICAgICAgcC0+c2VjdGlvbiA9IHNyZWxvYzsKLQkJICAgICAgcC0+Y291bnQgPSAwOwotCQkgICAgfQotCi0JCSAgKytwLT5jb3VudDsKLQkJfQotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzY4S19HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl82OEtfR05VX1ZURU5UUlk6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGZfbTY4a19nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl82OEtfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbGdvdCA9IE5VTEw7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqKQotICAgIHsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICB9Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HT1Q4OgotCWNhc2UgUl82OEtfR09UMTY6Ci0JY2FzZSBSXzY4S19HT1QzMjoKLQljYXNlIFJfNjhLX0dPVDhPOgotCWNhc2UgUl82OEtfR09UMTZPOgotCWNhc2UgUl82OEtfR09UMzJPOgotCSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotCQl7Ci0JCSAgLS1oLT5nb3QucmVmY291bnQ7Ci0JCSAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSAuZ290IGVudHJ5IGFueSBtb3JlLiAgKi8KLQkJICAgICAgc2dvdC0+X3Jhd19zaXplIC09IDQ7Ci0JCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSAtPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCi0JCXsKLQkJICAtLWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdOwotCQkgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSAuZ290IGVudHJ5IGFueSBtb3JlLiAgKi8KLQkJICAgICAgc2dvdC0+X3Jhd19zaXplIC09IDQ7Ci0JCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCQlzcmVsZ290LT5fcmF3X3NpemUgLT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUODoKLQljYXNlIFJfNjhLX1BMVDE2OgotCWNhc2UgUl82OEtfUExUMzI6Ci0JY2FzZSBSXzY4S19QTFQ4TzoKLQljYXNlIFJfNjhLX1BMVDE2TzoKLQljYXNlIFJfNjhLX1BMVDMyTzoKLQljYXNlIFJfNjhLX1BDODoKLQljYXNlIFJfNjhLX1BDMTY6Ci0JY2FzZSBSXzY4S19QQzMyOgotCWNhc2UgUl82OEtfODoKLQljYXNlIFJfNjhLXzE2OgotCWNhc2UgUl82OEtfMzI6Ci0JICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JICBpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA+IDApCi0JCS0taC0+cGx0LnJlZmNvdW50OwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAotICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpID09IDAKLQkgIC8qIFdlIG11c3QgYWx3YXlzIGNyZWF0ZSB0aGUgcGx0IGVudHJ5IGlmIGl0IHdhcyByZWZlcmVuY2VkCi0JICAgICBieSBhIFBMVHh4TyByZWxvY2F0aW9uLiAgSW4gdGhpcyBjYXNlIHdlIGFscmVhZHkgcmVjb3JkZWQKLQkgICAgIGl0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFBMVHh4IHJlbG9jIGluIGFuIGlucHV0Ci0JICAgICBmaWxlLCBidXQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgcmVmZXJyZWQgdG8gYnkgYSBkeW5hbWljCi0JICAgICBvYmplY3QuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZAotCSAgICAgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgUEN4eAotCSAgICAgcmVsb2MgaW5zdGVhZC4gICovCi0JICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIEdDIG1heSBoYXZlIHJlbmRlcmVkIHRoaXMgZW50cnkgdW51c2VkLiAgKi8KLSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPD0gMCkKLQl7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKLQkgZmlyc3QgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXsKLQkgIGlmIChDUFUzMl9GTEFHIChkeW5vYmopKQotCSAgICBzLT5fcmF3X3NpemUgKz0gUExUX0NQVTMyX0VOVFJZX1NJWkU7Ci0JICBlbHNlCi0JICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBpZiAoQ1BVMzJfRkxBRyAoZHlub2JqKSkKLSAgICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9DUFUzMl9FTlRSWV9TSVpFOwotICAgICAgZWxzZQotICAgICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAuZ290LnBsdCBzZWN0aW9uLCB3aGljaAotCSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgLmdvdCBzZWN0aW9uIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSA0OwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogUmVpbml0aWFsaXplIHRoZSBwbHQgb2Zmc2V0IG5vdyB0aGF0IGl0IGlzIG5vdCB1c2VkIGFzIGEgcmVmZXJlbmNlCi0gICAgIGNvdW50IGFueSBtb3JlLiAgKi8KLSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSXzY4S19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWxhLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcGx0OwotICBib29sZWFuIHJlbG9jczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3Qgc2VjdGlvbi4KLQkgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotCSBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCi0JIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0JIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIHNoYXJlZCBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBhbGwgUEMKLSAgICAgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuICBXZQotICAgICBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2Ugd2lsbCBub3QKLSAgICAgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGluZm8tPnN5bWJvbGljKQotICAgIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX202OGtfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJIGVsZl9tNjhrX2Rpc2NhcmRfY29waWVzLAotCQkJCSAoUFRSKSBOVUxMKTsKLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2Mgc2VjdGlvbnMgb3RoZXIKLSAgICAgICAgICAgICAgICAgdGhhbiAucmVsYS5wbHQuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsYS5wbHQiKSAhPSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCQkgIHJlbG9jcyA9IHRydWU7Ci0KLQkJICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTAotCQkgICAgIGVudHJ5LiAgLnJlbGEucGx0IGlzIGFjdHVhbGx5IGFzc29jaWF0ZWQgd2l0aAotCQkgICAgIC5nb3QucGx0LCB3aGljaCBpcyBuZXZlciByZWFkb25seS4gICovCi0JCSAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkJICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JCSAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkJICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWx0ZXh0ID0gdHJ1ZTsKLQkJfQotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKGluZm8sIHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkgICAgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UgaWYgd2UgYXJlCi0gICBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3Qgd2l0aCAtQnN5bWJvbGljLiAgSXQgZGlzY2FyZHMgdGhlIHNwYWNlCi0gICBhbGxvY2F0ZWQgdG8gY29weSBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkCi0gICBpbiByZWd1bGFyIG9iamVjdHMuICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcwotICAgcm91dGluZSwgYnV0IHdlIHdvbid0IGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZGlzY2FyZF9jb3BpZXMgKGgsIGlnbm9yZSkKLSAgICAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqczsKLQotICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIE02OEsgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNwbHQgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl82OEtfbWF4KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKChyX3R5cGUgPT0gUl82OEtfUExUOAotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDE2Ci0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMzIKLQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19QTFQ4TwotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDE2TwotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDMyTykKLQkJICAgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEKLQkJICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0JCSAgfHwgKChyX3R5cGUgPT0gUl82OEtfR09UOE8KLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNk8KLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMk8KLQkJICAgICAgIHx8ICgocl90eXBlID09IFJfNjhLX0dPVDgKLQkJCSAgICB8fCByX3R5cGUgPT0gUl82OEtfR09UMTYKLQkJCSAgICB8fCByX3R5cGUgPT0gUl82OEtfR09UMzIpCi0JCQkgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgICAgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKQotCQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoISBpbmZvLT5zaGFyZWQKLQkJCSAgfHwgKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkJICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgICAgICYmIChyX3R5cGUgPT0gUl82OEtfOAotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfMTYKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLXzMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSXzY4S19QQzgKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDMTYKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDMzIpKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCi0JCSAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0JCSAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoIShpbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwKLQkJICAgICAoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5ub191bmRlZmluZWQpKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl82OEtfR09UODoKLQljYXNlIFJfNjhLX0dPVDE2OgotCWNhc2UgUl82OEtfR09UMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wKLQkgICAgIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdGhlIG9mZnNldCBvZiB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluCi0JICAgICB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLQkgIHsKLQkgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgICB7Ci0JCXNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCQlCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICAgIH0KLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIHsKLQkJb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkJQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkJaWYgKCFlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgfHwgKGluZm8tPnNoYXJlZAotCQkJJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCQkmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJICB7Ci0JCSAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLQkJICAgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JCSAgICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKLQkJICAgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuLiAgV2UgbXVzdCBpbml0aWFsaXplCi0JCSAgICAgICB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UKLQkJICAgICAgIHRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZQotCQkgICAgICAgdXNlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIKLQkJICAgICAgIHdlIGhhdmUgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCQkgICAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCQkgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgICBvZmYgJj0gfjE7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJCWgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCUJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKLQkJCSAgICAmJiBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKLQotCQlvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkJLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLQkJICAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSAgIGFscmVhZHkgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICAqLwotCQlpZiAoKG9mZiAmIDEpICE9IDApCi0JCSAgb2ZmICY9IH4xOwotCQllbHNlCi0JCSAgewotCQkgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCi0JCSAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgICB7Ci0JCQlhc2VjdGlvbiAqc3JlbGdvdDsKLQkJCUVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCQkJc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJCUJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJCW91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgICArIG9mZik7Ci0JCQlvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzY4S19SRUxBVElWRSk7Ci0JCQlvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uOwotCQkJYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSAgICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJCSAgICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgICAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkJKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgICAgfQotCi0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCSAgICBpZiAocl90eXBlID09IFJfNjhLX0dPVDhPCi0JCXx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNk8KLQkJfHwgcl90eXBlID09IFJfNjhLX0dPVDMyTykKLQkgICAgICB7Ci0JCS8qIFRoaXMgcmVsb2NhdGlvbiBkb2VzIG5vdCB1c2UgdGhlIGFkZGVuZC4gICovCi0JCXJlbC0+cl9hZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gKz0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4OgotCWNhc2UgUl82OEtfUExUMTY6Ci0JY2FzZSBSXzY4S19QTFQzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLQkgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogUmVzb2x2ZSBhIFBMVHh4IHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHksCi0JICAgICB3aXRob3V0IHVzaW5nIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xCi0JICAgICAgfHwgIWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotCQkgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotCQkgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUOE86Ci0JY2FzZSBSXzY4S19QTFQxNk86Ci0JY2FzZSBSXzY4S19QTFQzMk86Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbgotCSAgICAgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSBoLT5wbHQub2Zmc2V0OwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZG9lcyBub3QgdXNlIHRoZSBhZGRlbmQuICAqLwotCSAgcmVsLT5yX2FkZGVuZCA9IDA7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QQzg6Ci0JY2FzZSBSXzY4S19QQzE2OgotCWNhc2UgUl82OEtfUEMzMjoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfNjhLXzg6Ci0JY2FzZSBSXzY4S18xNjoKLQljYXNlIFJfNjhLXzMyOgotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICAgICYmICgocl90eXBlICE9IFJfNjhLX1BDOAotCQkgICAmJiByX3R5cGUgIT0gUl82OEtfUEMxNgotCQkgICAmJiByX3R5cGUgIT0gUl82OEtfUEMzMikKLQkJICB8fCAoIWluZm8tPnN5bWJvbGljCi0JCSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCSAgICAgIGJvb2xlYW4gc2tpcCwgcmVsb2NhdGU7Ci0KLQkgICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucwotCQkgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLQkJIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJewotCQkgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJfQotCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoZSBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTAotCQkgICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIHJfdHlwZSk7Ci0JCSAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocl90eXBlID09IFJfNjhLXzMyKQotCQkgICAgewotCQkgICAgICByZWxvY2F0ZSA9IHRydWU7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfNjhLX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJICAgICAgfHwgKGgtPnJvb3QudHlwZQotCQkJCQkgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQl9Ci0JCSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQlpbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7Ci0JCQkgIEJGRF9BU1NFUlQgKGluZHggPiAwKTsKLQkJCX0KLQotCQkgICAgICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCByX3R5cGUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotICAgICAgICAgICAgICAgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgZXhjZXB0IGZvciBSXzY4S18zMgotICAgICAgICAgICAgICAgICByZWxvY2F0aW9ucyB0aGF0IGhhdmUgYmVlbiB0dXJuZWQgaW50bwotICAgICAgICAgICAgICAgICBSXzY4S19SRUxBVElWRS4gICovCi0JICAgICAgaWYgKCFyZWxvY2F0ZSkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIC8qIFRoZXNlIGFyZSBuby1vcHMgaW4gdGhlIGVuZC4gICovCi0JICBjb250aW51ZTsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghKGluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cKLQkJICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGludCBwbHRfb2ZmMSwgcGx0X29mZjIsIHBsdF9vZmYzOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7Ci0gICAgICBiZmRfdm1hIGdvdF9vZmZzZXQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0JIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICAvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB3aGljaAotCSBjb3JyZXNwb25kcyB0byB0aGlzIHN5bWJvbC4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sCi0JIGluIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggd2UgYXJlIG1ha2luZyBwbHQgZW50cmllcy4gIFRoZQotCSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKCBDUFUzMl9GTEFHIChvdXRwdXRfYmZkKSkKLSAgICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9DUFUzMl9FTlRSWV9TSVpFIC0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9FTlRSWV9TSVpFIC0gMTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgaW50byB0aGUgLmdvdCB0YWJsZSBvZiB0aGUgZW50cnkgdGhhdAotCSBjb3JyZXNwb25kcyB0byB0aGlzIGZ1bmN0aW9uLiAgRWFjaCAuZ290IGVudHJ5IGlzIDQgYnl0ZXMuCi0JIFRoZSBmaXJzdCB0aHJlZSBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgZ290X29mZnNldCA9IChwbHRfaW5kZXggKyAzKSAqIDQ7Ci0KLSAgICAgIGlmICggQ1BVMzJfRkxBRyAob3V0cHV0X2JmZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBlbGZfY3B1MzJfcGx0X2VudHJ5LAotCSAgICAgICAgICBQTFRfQ1BVMzJfRU5UUllfU0laRSk7Ci0gICAgICAgICAgcGx0X29mZjEgPSA0OwotICAgICAgICAgIHBsdF9vZmYyID0gMTI7Ci0gICAgICAgICAgcGx0X29mZjMgPSAxODsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX202OGtfcGx0X2VudHJ5LAotCSAgICAgICAgICBQTFRfRU5UUllfU0laRSk7Ci0gICAgICAgICAgcGx0X29mZjEgPSA0OwotICAgICAgICAgIHBsdF9vZmYyID0gMTA7Ci0gICAgICAgICAgcGx0X29mZjMgPSAxNjsKLSAgICAgICAgfQotCi0gICAgICAvKiBUaGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBleHRlbnNpb24gd29yZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICArIGdvdF9vZmZzZXQKLQkJICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnBsdC5vZmZzZXQgKyAyKSksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgcGx0X29mZjEpOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBwbHRfaW5kZXggKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIHBsdF9vZmYyKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIC0gKGgtPnBsdC5vZmZzZXQgKyBwbHRfb2ZmMyksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgcGx0X29mZjMpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICArIGgtPnBsdC5vZmZzZXQKLQkJICAgKyA4KSwKLQkJICBzZ290LT5jb250ZW50cyArIGdvdF9vZmZzZXQpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgZ290X29mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl82OEtfSk1QX1NMT1QpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBwbHRfaW5kZXgpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLQkgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIExpa2V3aXNlIGlmCi0JIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLgotCSBUaGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgotCSBpbml0aWFsaXplZCBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JewotCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfNjhLX1JFTEFUSVZFKTsKLQkgIHJlbGEucl9hZGRlbmQgPSBiZmRfZ2V0X3NpZ25lZF8zMiAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAoc2dvdC0+Y29udGVudHMKLQkJCQkJICAgICAgKyAoaC0+Z290Lm9mZnNldCAmIH4xKSkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgc2dvdC0+Y29udGVudHMgKyAoaC0+Z290Lm9mZnNldCAmIH4xKSk7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl82OEtfR0xPQl9EQVQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBzcmVsYS0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbGEtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfNjhLX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbGEucGx0IjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVFJFTFNaOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWxhLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxBU1o6Ci0JICAgICAgLyogVGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHJlbG9jcyAoRFRfSk1QUkVMKSBzaG91bGQKLQkJIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTEEpLgotCQkgVGhlcmVmb3JlLCB3ZSBvdmVycmlkZSB0aGUgRFRfUkVMQVNaIGVudHJ5IGhlcmUgdG8KLQkJIG1ha2UgaXQgbm90IGluY2x1ZGUgdGhlIEpNUFJFTCByZWxvY3MuICBTaW5jZSB0aGUKLQkJIGxpbmtlciBzY3JpcHQgYXJyYW5nZXMgZm9yIC5yZWxhLnBsdCB0byBmb2xsb3cgYWxsCi0JCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMQSBlbnRyeS4gICovCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbGEucGx0Iik7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fcmF3X3NpemU7Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotICAgICAgICAgIGlmICghQ1BVMzJfRkxBRyAob3V0cHV0X2JmZCkpCi0gICAgICAgICAgICB7Ci0JICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX202OGtfcGx0MF9lbnRyeSwgUExUX0VOVFJZX1NJWkUpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDQKLQkJICAgICAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMikpLAotCQkgICAgICAgICAgc3BsdC0+Y29udGVudHMgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA4Ci0JCSAgICAgICAgICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDEwKSksCi0JCSAgICAgICAgICBzcGx0LT5jb250ZW50cyArIDEyKTsKLSAgICAgICAgICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplIAotICAgICAgICAgICAgICAgPSBQTFRfRU5UUllfU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIC8qIGNwdTMyICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9jcHUzMl9wbHQwX2VudHJ5LCBQTFRfQ1BVMzJfRU5UUllfU0laRSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgNAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAyKSksCi0JCSAgICAgICAgICBzcGx0LT5jb250ZW50cyArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDgKLQkJICAgICAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMTApKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgMTApOwotICAgICAgICAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgCi0gICAgICAgICAgICAgICA9IFBMVF9DUFUzMl9FTlRSWV9TSVpFOwotICAgICAgICAgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjMyX202OGtfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGYzMi1tNjhrIgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV82OEsKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgyMDAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQkJZWxmX202OGtfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsJX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxfbGluawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwllbGZfbTY4a19jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCWVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCWVsZl9tNjhrX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCWVsZl9tNjhrX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZjMyX202OGtfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmMzJfbTY4a19tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMAotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMTIKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLW04OGsuYyBiL2JmZC9lbGYzMi1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZGUyMmEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIE1vdG9yb2xhIDg4ay1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0vKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYW55IHJlbG9jYXRpb25zLCBidXQgc2hvdWxkIGJlIGdvb2QgZW5vdWdoCi0gICBmb3IgR0RCLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX204OGtfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLW04OGsiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tODhrCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fODhLCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAgCTEgLyogRklYTUU6IFRoaXMgbnVtYmVyIGlzIHdyb25nLCAgSXQgc2hvdWxkIGJlIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMuICAqLwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tY29yZS5jIGIvYmZkL2VsZjMyLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjNhOWUuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLW1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjQgKzAsMCBAQAotLyogTW90b3JvbGEgTUNvcmUgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGEgcHJlbGltaW5hcnkgUkNFIEVMRiBBQkkuICBUaGUKLSAgIGluZm9ybWF0aW9uIG1heSBub3QgbWF0Y2ggdGhlIGZpbmFsIFJDRSBFTEYgQUJJLiAgICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tY29yZS5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jZGVmaW5lCVVTRV9SRUxBCS8qIE9ubHkgVVNFX1JFTCBpcyBhY3R1YWxseSBzaWduaWZpY2FudCwgYnV0IHRoaXMgaXMKLQkJCSAgIGhlcmUgYXJlIGEgcmVtaW5kZXIuLi4gKi8KLQotc3RhdGljIHZvaWQgbWNvcmVfZWxmX2hvd3RvX2luaXQKLSAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBtY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgbWNvcmVfZWxmX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIG1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSBSX01DT1JFX21heF07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1jb3JlX2VsZl9ob3d0b19yYXdbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTUNPUkVfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsICAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfTk9ORSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUNPUkVfQUREUjMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkFERFIzMiIsCQkvKiBuYW1lICovLyogRm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBjb2ZmL3BlIHBvcnQuICAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdHMgKyAyIHplcm8gYml0czsgam1waS9qc3JpL2xydyBpbnN0cnVjdGlvbnMuCi0gICAgIFNob3VsZCBub3QgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4gKi8KLSAgSE9XVE8gKFJfTUNPUkVfUENSRUxJTU04Qlk0LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMSU1NOEJZNCIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIGJzci9idC9iZi9iciBpbnN0cnVjdGlvbnM7IDExIGJpdHMgKyAxIHplcm8gYml0IAotICAgICBTcGFuIDJrIGluc3RydWN0aW9ucyA9PSA0ayBieXRlcy4KLSAgICAgT25seSB1c2VmdWwgcGllY2VzIGF0IHRoZSByZWxvY2F0ZWQgYWRkcmVzcyBhcmUgdGhlIG9wY29kZSAoNSBiaXRzKSAqLwotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTElNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTElNTTExQlkyIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXRzICsgMSB6ZXJvIGJpdDsgJ2xvb3B0JyBpbnN0cnVjdGlvbiBvbmx5OyB1bnN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKFJfTUNPUkVfUENSRUxJTU00QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jLC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxJTU00QlkyIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHBjLXJlbGF0aXZlLiBFdmVudHVhbGx5IHRoaXMgd2lsbCBoZWxwIHN1cHBvcnQgUElDIGNvZGUuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUENSRUxJTU0xMUJZMiwgdGhpcyByZWxvY2F0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKLSAgICAgJ2pzcmknIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSByZWxvY2F0aW9uCi0gICAgIGVudHJ5IGZvciB0aGUgbGl0ZXJhbCBwb29sIGVudHJ5IHRoYXQgaXQgcmVmZXJlbmNlcywgYnV0IHdlIAotICAgICBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUganNyaSB0byBhIGJzciBpZiB0aGUgdGFyZ2V0IHR1cm5zIG91dAotICAgICB0byBiZSBjbG9zZSBlbm91Z2ggW2V2ZW4gdGhvdWdoIHdlIHdvbid0IHJlY2xhaW0gdGhlIGxpdGVyYWwgcG9vbAotICAgICBlbnRyeSwgd2UnbGwgZ2V0IHNvbWUgcnVudGltZSBlZmZpY2llbmN5IGJhY2tdLiBOb3RlIHRoYXQgdGhpcwotICAgICBpcyBhIHJlbG9jYXRpb24gdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBzYWZlbHkgaWdub3JlLiAgKi8gCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMiIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX01DT1JFX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX01DT1JFX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9NQ09SRV9HTlVfVlRFTlRSWSwgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfTUNPUkVfR05VX1ZURU5UUlkiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEhPV1RPIChSX01DT1JFX1JFTEFUSVZFLCAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUkVMQVRJVkUiLCAgICAvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0jaWZuZGVmIE5VTV9FTEVNCi0jZGVmaW5lIE5VTV9FTEVNKGEpIChzaXplb2YgKGEpIC8gc2l6ZW9mIChhKVswXSkKLSNlbmRpZgotDAotLyogSW5pdGlhbGl6ZSB0aGUgbWNvcmVfZWxmX2hvd3RvX3RhYmxlLCBzbyB0aGF0IGxpbmVhciBhY2Nlc3NlcyBjYW4gYmUgZG9uZS4gICovCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2hvd3RvX2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gTlVNX0VMRU0gKG1jb3JlX2VsZl9ob3d0b19yYXcpOyBpLS07KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB0eXBlOwotICAgICAgCi0gICAgICB0eXBlID0gbWNvcmVfZWxmX2hvd3RvX3Jhd1tpXS50eXBlOwotICAgICAgCi0gICAgICBCRkRfQVNTRVJUICh0eXBlIDwgTlVNX0VMRU0gKG1jb3JlX2VsZl9ob3d0b190YWJsZSkpOwotICAgICAgCi0gICAgICBtY29yZV9lbGZfaG93dG9fdGFibGUgW3R5cGVdID0gJiBtY29yZV9lbGZfaG93dG9fcmF3IFtpXTsKLSAgICB9Ci19Ci0KLQwKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1jb3JlX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgZW51bSBlbGZfbWNvcmVfcmVsb2NfdHlwZSBtY29yZV9yZWxvYyA9IFJfTUNPUkVfTk9ORTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6CQkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9OT05FOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCQkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9BRERSMzI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQ6CSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSU1NOEJZNDsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTI6ICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxJTU0xMUJZMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMjoJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxJTU00QlkyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoJCSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMMzI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjogbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDogICAgICAgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9HTlVfVlRJTkhFUklUOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6ICAgICAgICAgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9HTlVfVlRFTlRSWTsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOiAgICAgICAgICAgICAgICAgICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUkVMQVRJVkU7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOwotICAgIH0KLQotICBpZiAoISBtY29yZV9lbGZfaG93dG9fdGFibGUgW1JfTUNPUkVfUENSRUxJTU04Qlk0XSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBtY29yZV9lbGZfaG93dG9faW5pdCAoKTsKLQotICByZXR1cm4gbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSBtY29yZV9yZWxvY107Ci19OwotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGEgUkNFIEVMRiByZWxvYy4gICovCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKiBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKiBkc3Q7Ci17Ci0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9NQ09SRV9tYXgpOwotICAKLSAgY2FjaGVfcHRyLT5ob3d0byA9IG1jb3JlX2VsZl9ob3d0b190YWJsZSBbRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotCi0vKiBGdW5jdGlvbiB0byBzZXQgd2hldGhlciBhIG1vZHVsZSBuZWVkcyB0aGUgLW1yZWxvY2F0YWJsZSBiaXQgc2V0LiAqLwotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghIGVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbi5cbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLSAgICAgICAgIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIAotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCS8qIEZpcnN0IGNhbGwsIG5vIGZsYWdzIHNldCAqLwotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICB9Ci0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUUgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIERvbid0IHByZXRlbmQgd2UgY2FuIGRlYWwgd2l0aCB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqIHN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICogb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqIGVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgQkZEX0FTU0VSVCAocmVsb2NfZW50cnktPmhvd3RvICE9IChyZWxvY19ob3d0b190eXBlICopMCk7Ci0gIAotICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBSZWxvY2F0aW9uICVzICglZCkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSwKLQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+bmFtZSwKLQkJICAgICAgcmVsb2NfZW50cnktPmhvd3RvLT50eXBlKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotDAotLyogVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIKLSAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgIHplcm8uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsID0gcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLAotCSAgICJtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYWxsZWQgZm9yICVzIHNlY3Rpb24gJXMsICVsZCByZWxvY2F0aW9ucyVzXG4iLAotCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgYmZkX3NlY3Rpb25fbmFtZShpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLAotCSAgIChsb25nKSBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCwKLQkgICAoaW5mby0+cmVsb2NhdGVhYmxlKSA/ICIgKHJlbG9jYXRhYmxlKSIgOiAiIik7Ci0jZW5kaWYKLQotICBpZiAoISBtY29yZV9lbGZfaG93dG9fdGFibGUgW1JfTUNPUkVfUENSRUxJTU04Qlk0XSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBtY29yZV9lbGZfaG93dG9faW5pdCAoKTsKLQotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBlbnVtIGVsZl9tY29yZV9yZWxvY190eXBlICAgIHJfdHlwZSA9IChlbnVtIGVsZl9tY29yZV9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgciA9IGJmZF9yZWxvY19vdGhlcjsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjID0gKGFzZWN0aW9uICopIDA7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGhvd3RvOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW0gPSAoRWxmX0ludGVybmFsX1N5bSAqKSAwOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAwOwotICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICBvbGRpbnN0ID0gMDsKLSAgICAgIAotICAgICAgLyogVW5rbm93biByZWxvY2F0aW9uIGhhbmRsaW5nICovCi0gICAgICBpZiAoKHVuc2lnbmVkKSByX3R5cGUgPj0gKHVuc2lnbmVkKSBSX01DT1JFX21heAotCSAgfHwgISBtY29yZV9lbGZfaG93dG9fdGFibGUgWyhpbnQpcl90eXBlXSkKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBVbmtub3duIHJlbG9jYXRpb24gdHlwZSAlZFxuIiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJICAgICAgKGludCkgcl90eXBlKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIAotICAgICAgaG93dG8gPSBtY29yZV9lbGZfaG93dG9fdGFibGUgWyhpbnQpIHJfdHlwZV07Ci0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICAKLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgCi0JICAgICAgaWYgKCh1bnNpZ25lZClFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIlx0dHlwZSA9ICVzICglZCksIHN5bWJvbCBpbmRleCA9ICVsZCwgb2Zmc2V0ID0gJWxkLCBhZGRlbmQgPSAlbGRcbiIsCi0JCSAgIGhvd3RvLT5uYW1lLCAoaW50KSByX3R5cGUsIHJfc3ltbmR4LCAobG9uZykgb2Zmc2V0LCAobG9uZykgYWRkZW5kKTsKLSNlbmRpZgotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0KLSAgICAgIC8qIENvbXBsYWluIGFib3V0IGtub3duIHJlbG9jYXRpb24gdGhhdCBhcmUgbm90IHlldCBzdXBwb3J0ZWQgKi8KLSAgICAgIGlmIChob3d0by0+c3BlY2lhbF9mdW5jdGlvbiA9PSBtY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJICAgICAgaG93dG8tPm5hbWUsCi0JCQkgICAgICAoaW50KXJfdHlwZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnMgW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJIAkgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICByZXQgPSBmYWxzZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMjoKLQkgIG9sZGluc3QgPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLSNkZWZpbmUJTUNPUkVfSU5TVF9CU1IJMHhGODAwCi0JICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIE1DT1JFX0lOU1RfQlNSLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBicmVhazsKLQl9Ci0KLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCSAgICAgICBob3d0by0+bmFtZSwgcl90eXBlLCByX3N5bW5keCwgKGxvbmcpIG9mZnNldCwgKGxvbmcpIGFkZGVuZCk7Ci0jZW5kaWYKLQotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotCShob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCByZWxvY2F0aW9uLCBhZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2sgJiYgcl90eXBlID09IFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIpCi0JewotCSAgLyogV2Fzbid0IG9rLCBiYWNrIGl0IG91dCBhbmQgZ2l2ZSB1cC4gICovCi0JICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIG9sZGluc3QsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgcmV0ID0gZmFsc2U7Ci0JICAKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqIG5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICAKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBpZiAoKiBuYW1lID09ICdcMCcpCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JCSAgfQotCi0JCSgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgIG9mZnNldCk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1jb3JlX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgIHJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTUNPUkVfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfTUNPUkVfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICAKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBhc2VjdGlvbiAqIHNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiByZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICAKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICAKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlcyBbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NQ09SRV9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCSAgCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX01DT1JFX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9tY29yZV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLW1jb3JlLWJpZyIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgICAgImVsZjMyLW1jb3JlLWxpdHRsZSIKLQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbWNvcmUKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9NQ09SRQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAkJLyogNGssIGlmIHdlIGV2ZXIgaGF2ZSAnZW0gKi8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JbWNvcmVfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCU5VTEwKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCW1jb3JlX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCW1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCW1jb3JlX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQltY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJbWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCQltY29yZV9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCW1jb3JlX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBtY29yZV9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCQkxCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1taXBzLmMgYi9iZmQvZWxmMzItbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTFiYWI5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQ3ICswLDAgQEAKLS8qIE1JUFMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgTW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsCi0gICA8aWFuQGN5Z251cy5jb20+LgotICAgTjMyLzY0IEFCSSBzdXBwb3J0IGFkZGVkIGJ5IE1hcmsgTWl0Y2hlbGwsIENvZGVTb3VyY2VyeSwgTExDLgotICAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaGFuZGxlcyBNSVBTIEVMRiB0YXJnZXRzLiAgU0dJIElyaXggNSB1c2VzIGEgc2xpZ2h0bHkKLSAgIGRpZmZlcmVudCBNSVBTIEVMRiBmcm9tIG90aGVyIHRhcmdldHMuICBUaGlzIG1hdHRlcnMgd2hlbiBsaW5raW5nLgotICAgVGhpcyBmaWxlIHN1cHBvcnRzIGJvdGgsIHN3aXRjaGluZyBhdCBydW50aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9taXBzLmgiCi0jZGVmaW5lIEVDT0ZGXzMyCi0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCAuZ290IGluZm9ybWF0aW9uIHdoZW4gbGlua2luZy4gIEl0Ci0gICBpcyBzdG9yZWQgaW4gdGhlIHRkYXRhIGZpZWxkIG9mIHRoZSBiZmRfZWxmX3NlY3Rpb25fZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbWlwc19nb3RfaW5mbwotewotICAvKiBUaGUgZ2xvYmFsIHN5bWJvbCBpbiB0aGUgR09UIHdpdGggdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZ2xvYmFsX2dvdHN5bTsKLSAgLyogVGhlIG51bWJlciBvZiBnbG9iYWwgLmdvdCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGdsb2JhbF9nb3RubzsKLSAgLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgbG9jYWxfZ290bm87Ci0gIC8qIFRoZSBudW1iZXIgb2YgbG9jYWwgLmdvdCBlbnRyaWVzIHdlIGhhdmUgdXNlZC4gICovCi0gIHVuc2lnbmVkIGludCBhc3NpZ25lZF9nb3RubzsKLX07Ci0KLS8qIFRoZSBNSVBTIEVMRiBsaW5rZXIgbmVlZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBzeW1ib2wgaW4KLSAgIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBFeHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBFWFRSIGVzeW07Ci0KLSAgLyogTnVtYmVyIG9mIFJfTUlQU18zMiwgUl9NSVBTX1JFTDMyLCBvciBSX01JUFNfNjQgcmVsb2NzIGFnYWluc3QKLSAgICAgdGhpcyBzeW1ib2wuICAqLyAKLSAgdW5zaWduZWQgaW50IHBvc3NpYmx5X2R5bmFtaWNfcmVsb2NzOwotCi0gIC8qIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZHluYW1pYyByZWxvY2F0aW9uIChpbiB0aGUgLnJlbC5keW4KLSAgICAgc2VjdGlvbikgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGludCBtaW5fZHluX3JlbG9jX2luZGV4OwotCi0gIC8qIElmIHRoZXJlIGlzIGEgc3R1YiB0aGF0IDMyIGJpdCBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0byBjYWxsIHRoaXMKLSAgICAgMTYgYml0IGZ1bmN0aW9uLCB0aGlzIHBvaW50cyB0byB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBzdHViLiAgKi8KLSAgYXNlY3Rpb24gKmZuX3N0dWI7Ci0KLSAgLyogV2hldGhlciB3ZSBuZWVkIHRoZSBmbl9zdHViOyB0aGlzIGlzIHNldCBpZiB0aGlzIHN5bWJvbCBhcHBlYXJzCi0gICAgIGluIGFueSByZWxvY3Mgb3RoZXIgdGhhbiBhIDE2IGJpdCBjYWxsLiAgKi8KLSAgYm9vbGVhbiBuZWVkX2ZuX3N0dWI7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBzdHViIHRoYXQgMTYgYml0IGZ1bmN0aW9ucyBzaG91bGQgdXNlIHRvIGNhbGwgdGhpcwotICAgICAzMiBiaXQgZnVuY3Rpb24sIHRoaXMgcG9pbnRzIHRvIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHN0dWIuICAqLwotICBhc2VjdGlvbiAqY2FsbF9zdHViOwotCi0gIC8qIFRoaXMgaXMgbGlrZSB0aGUgY2FsbF9zdHViIGZpZWxkLCBidXQgaXQgaXMgdXNlZCBpZiB0aGUgZnVuY3Rpb24KLSAgICAgYmVpbmcgY2FsbGVkIHJldHVybnMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4gICovCi0gIGFzZWN0aW9uICpjYWxsX2ZwX3N0dWI7Ci19OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHMzMl82NGJpdF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptaXBzX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqLCBFbGYzMl9ncHRhYiAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfZ3B0YWIgKiwgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKikpOwotI2lmIDAKLXN0YXRpYyB2b2lkIGJmZF9taXBzX2VsZl9zd2FwX21zeW1faW4gCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9Nc3ltICosIEVsZjMyX0ludGVybmFsX01zeW0gKikpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9tc3ltX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfSW50ZXJuYWxfTXN5bSAqLCBFbGYzMl9FeHRlcm5hbF9Nc3ltICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3N5bV9pc19nbG9iYWwgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZQotICBQQVJBTVMgKChQVFIsIGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLXN0YXRpYyBJTkxJTkUgaW50IGVsZl9taXBzX2lzYSBQQVJBTVMgKChmbGFnd29yZCkpOwotc3RhdGljIElOTElORSBpbnQgZWxmX21pcHNfbWFjaCBQQVJBTVMgKChmbGFnd29yZCkpOwotc3RhdGljIElOTElORSBjaGFyKiBlbGZfbWlwc19hYmlfbmFtZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICptaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBncHRhYl9jb21wYXJlIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHMxNl9qdW1wX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzMTZfZ3ByZWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZWxmX2ZpbmFsX2dwCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJmZF9ieXRlICplbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uIAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX3NpZ25fZXh0ZW5kIFBBUkFNUyAoKGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfb3ZlcmZsb3dfcCBQQVJBTVMgKChiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2hpZ2ggUEFSQU1TICgoYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfaGlnaGVyIFBBUkFNUyAoKGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2hpZ2hlc3QgUEFSQU1TICgoYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfbG9jYWxfZ290X2luZGV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXgKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgc3RydWN0IG1pcHNfZ290X2luZm8gKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfZ290X3BhZ2UKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF92bWEsIGJmZF92bWEgKikpOwotc3RhdGljIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICptaXBzX2VsZl9uZXh0X3JlbG9jYXRpb24KLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCAKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hLCByZWxvY19ob3d0b190eXBlICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqLCBjb25zdCBjaGFyICoqLAotCSAgIGJvb2xlYW4gKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfb2J0YWluX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCByZWxvY19ob3d0b190eXBlICosIAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF92bWEsCi0JICAgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2Fzc2lnbl9ncCBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGVfZiAKLSAgUEFSQU1TICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGFzZWN0aW9uICogbWlwc19lbGZfZ290X3NlY3Rpb24gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqbWlwc19lbGZfZ290X2luZm8gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBtaXBzX2dvdF9pbmZvICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2dvdDE2X2VudHJ5IAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF92bWEsIGJmZF92bWEgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucyAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfc3R1Yl9zZWN0aW9uX3AgCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIFRoZSBsZXZlbCBvZiBJUklYIGNvbXBhdGliaWxpdHkgd2UncmUgc3RyaXZpbmcgZm9yLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgaWN0X25vbmUsCi0gIGljdF9pcml4NSwKLSAgaWN0X2lyaXg2Ci19IGlyaXhfY29tcGF0X3Q7Ci0KLS8qIE5vbnplcm8gaWYgQUJGRCBpcyB1c2luZyB0aGUgTjMyIEFCSS4gICovCi0KLSNkZWZpbmUgQUJJX04zMl9QKGFiZmQpIFwKLSAgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJMikgIT0gMCkKLQotLyogTm9uemVybyBpZiBBQkZEIGlzIHVzaW5nIHRoZSA2NC1iaXQgQUJJLiAgRklYTUU6IFRoaXMgaXMgbmV2ZXIKLSAgIHRydWUsIHlldC4gICovCi0jZGVmaW5lIEFCSV82NF9QKGFiZmQpIFwKLSAgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NCkgIT0gMCkKLQotLyogV2hhdCB2ZXJzaW9uIG9mIElyaXggd2UgYXJlIHRyeWluZyB0byBiZSBjb21wYXRpYmxlIHdpdGguICBGSVhNRToKLSAgIEF0IHRoZSBtb21lbnQsIHdlIG5ldmVyIGdlbmVyYXRlICJub3JtYWwiIE1JUFMgRUxGIEFCSSBleGVjdXRhYmxlczsKLSAgIHdlIGFsd2F5cyB1c2Ugc29tZSB2ZXJzaW9uIG9mIElyaXguICAqLwotCi0jZGVmaW5lIElSSVhfQ09NUEFUKGFiZmQpIFwKLSAgKChBQklfTjMyX1AgKGFiZmQpIHx8IEFCSV82NF9QIChhYmZkKSkgPyBpY3RfaXJpeDYgOiBpY3RfaXJpeDUpCi0KLS8qIFdoZXRoZXIgd2UgYXJlIHRyeWluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggSVJJWCBhdCBhbGwuICAqLwotCi0jZGVmaW5lIFNHSV9DT01QQVQoYWJmZCkgXAotICAoSVJJWF9DT01QQVQgKGFiZmQpICE9IGljdF9ub25lKQotCi0vKiBUaGUgbmFtZSBvZiB0aGUgbXN5bSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUoYWJmZCkgIi5tc3ltIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3JkYXRhIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FKGFiZmQpICIuc3JkYXRhIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9ucyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUoYWJmZCkgXAotICAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NiA/ICIuTUlQUy5vcHRpb25zIiA6ICIub3B0aW9ucyIpCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBzdHViIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRShhYmZkKSBcCi0gIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2ID8gIi5NSVBTLnN0dWJzIiA6ICIuc3R1YiIpCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gc2VjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FKGFiZmQpICIucmVsLmR5biIKLQotLyogVGhlIHNpemUgb2YgYW4gZXh0ZXJuYWwgUkVMIHJlbG9jYXRpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9SRUxfU0laRShhYmZkKSBcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9yZWwpCi0KLS8qIFRoZSBzaXplIG9mIGFuIGV4dGVybmFsIGR5bmFtaWMgdGFibGUgZW50cnkuICAqLwotI2RlZmluZSBNSVBTX0VMRl9EWU5fU0laRShhYmZkKSBcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9keW4pCi0KLS8qIFRoZSBzaXplIG9mIGEgR09UIGVudHJ5LiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfR09UX1NJWkUoYWJmZCkgXAotICAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5hcmNoX3NpemUgLyA4KQotCi0vKiBUaGUgc2l6ZSBvZiBhIHN5bWJvbC10YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1NZTV9TSVpFKGFiZmQpIFwKLSAgKGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX3N5bSkKLQotLyogVGhlIGRlZmF1bHQgYWxpZ25tZW50IGZvciBzZWN0aW9ucywgYXMgYSBwb3dlciBvZiB0d28uICAqLwotI2RlZmluZSBNSVBTX0VMRl9MT0dfRklMRV9BTElHTihhYmZkKQkJCQlcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPmZpbGVfYWxpZ24gPT0gOCA/IDMgOiAyKQotCi0vKiBHZXQgd29yZC1zaXplZCBkYXRhLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfR0VUX1dPUkQoYWJmZCwgcHRyKSBcCi0gIChBQklfNjRfUCAoYWJmZCkgPyBiZmRfZ2V0XzY0IChhYmZkLCBwdHIpIDogYmZkX2dldF8zMiAoYWJmZCwgcHRyKSkKLQotLyogUHV0IG91dCB3b3JkLXNpemVkIGRhdGEuICAqLwotI2RlZmluZSBNSVBTX0VMRl9QVVRfV09SRChhYmZkLCB2YWwsIHB0cikJXAotICAoQUJJXzY0X1AgKGFiZmQpIAkJCQlcCi0gICA/IGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgcHRyKSAJCVwKLSAgIDogYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBwdHIpKQotCi0vKiBBZGQgYSBkeW5hbWljIHN5bWJvbCB0YWJsZS1lbnRyeS4gICovCi0jaWZkZWYgQkZENjQKLSNkZWZpbmUgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkoaW5mbywgdGFnLCB2YWwpIFwKLSAgKEFCSV82NF9QIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaikJICAgXAotICAgPyBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKSAgXAotICAgOiBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKSkKLSNlbHNlCi0jZGVmaW5lIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZKGluZm8sIHRhZywgdmFsKSBcCi0gIChBQklfNjRfUCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmopCSAgIFwKLSAgID8gKGFib3J0ICgpLCBmYWxzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIDogYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCB0YWcsIHZhbCkpCi0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMgd2UgcmVzZXJ2ZS4gICovCi0jZGVmaW5lIE1JUFNfUkVTRVJWRURfR09UTk8gKDIpCi0KLS8qIEluc3RydWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gYSBzdHViLiAgRm9yIHNvbWUgcmVhc29uIHRoZSBzdHViIGlzCi0gICBzbGlnaHRseSBkaWZmZXJlbnQgb24gYW4gU0dJIHN5c3RlbS4gICovCi0jZGVmaW5lIEVMRl9NSVBTX0dQX09GRlNFVChhYmZkKSAoU0dJX0NPTVBBVCAoYWJmZCkgPyAweDdmZjAgOiAweDgwMDApCi0jZGVmaW5lIFNUVUJfTFcoYWJmZCkJCQkJCQlcCi0gIChTR0lfQ09NUEFUIChhYmZkKQkJCQkJCVwKLSAgID8gKEFCSV82NF9QIChhYmZkKSAgCQkJCQkJXAotICAgICAgPyAweGRmOTk4MDEwCQkvKiBsZCB0OSwweDgwMTAoZ3ApICovCQlcCi0gICAgICA6IDB4OGY5OTgwMTApICAgICAgICAgICAgIC8qIGx3IHQ5LDB4ODAxMChncCkgKi8JCVwKLSAgIDogMHg4Zjk5ODAwMCkJCS8qIGx3IHQ5LDB4ODAwMChncCkgKi8KLSNkZWZpbmUgU1RVQl9NT1ZFIDB4MDNlMDc4MjUJLyogbW92ZSB0NyxyYSAqLwotI2RlZmluZSBTVFVCX0pBTFIgMHgwMzIwZjgwOQkvKiBqYWwgdDkgKi8KLSNkZWZpbmUgU1RVQl9MSTE2IDB4MzQxODAwMDAJLyogb3JpIHQ4LHplcm8sMCAqLwotI2RlZmluZSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSAoMTYpCi0KLSNpZiAwCi0vKiBXZSBubyBsb25nZXIgdHJ5IHRvIGlkZW50aWZ5IHBhcnRpY3VsYXIgc2VjdGlvbnMgZm9yIHRoZSAuZHluc3ltCi0gICBzZWN0aW9uLiAgV2hlbiB3ZSBkbywgd2Ugd2luZCB1cCBjcmFzaGluZyBpZiB0aGVyZSBhcmUgb3RoZXIgcmFuZG9tCi0gICBzZWN0aW9ucyB3aXRoIHJlbG9jYXRpb25zLiAgKi8KLQotLyogTmFtZXMgb2Ygc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIHRoZSAuZHluc3ltIHNlY3Rpb24gaW4gYW4gSXJpeCA1Ci0gICBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzW10gPQotewotICAiLnRleHQiLAotICAiLmluaXQiLAotICAiLmZpbmkiLAotICAiLmRhdGEiLAotICAiLnJvZGF0YSIsCi0gICIuc2RhdGEiLAotICAiLnNic3MiLAotICAiLmJzcyIsCi0gIE5VTEwKLX07Ci0KLSNkZWZpbmUgU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTIFwKLSAgKHNpemVvZiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIC8gc2l6ZW9mIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXNbMF0pCi0KLS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIHdoaWNoIGdvIGluIHRoZQotICAgdGV4dCBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBNSVBTX1RFWFRfRFlOU1lNX1NFQ05PICgzKQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGUgbmFtZXMgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIHN5bWJvbHMgdXNlZCBvbiBJcml4IDUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbXSA9Ci17Ci0gICJfcHJvY2VkdXJlX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfc3RyaW5nX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfdGFibGVfc2l6ZSIsCi0gIE5VTEwKLX07Ci0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIC5jb21wYWN0X3JlbCBzZWN0aW9uIG9uCi0gICBJcml4IDUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nIGlkMTsJCS8qIEFsd2F5cyBvbmU/ICAqLwotICB1bnNpZ25lZCBsb25nIG51bTsJCS8qIE51bWJlciBvZiBjb21wYWN0IHJlbG9jYXRpb24gZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgaWQyOwkJLyogQWx3YXlzIHR3bz8gICovCi0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyogVGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDA7CS8qIFplcm8/ICAqLwotICB1bnNpZ25lZCBsb25nIHJlc2VydmVkMTsJLyogWmVybz8gICovCi19IEVsZjMyX2NvbXBhY3RfcmVsOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpZDFbNF07Ci0gIGJmZF9ieXRlIG51bVs0XTsKLSAgYmZkX2J5dGUgaWQyWzRdOwotICBiZmRfYnl0ZSBvZmZzZXRbNF07Ci0gIGJmZF9ieXRlIHJlc2VydmVkMFs0XTsKLSAgYmZkX2J5dGUgcmVzZXJ2ZWQxWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgaW50IGN0eXBlIDogMTsJLyogMTogbG9uZyAwOiBzaG9ydCBmb3JtYXQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGludCBydHlwZSA6IDQ7CS8qIFJlbG9jYXRpb24gdHlwZXMuIFNlZSBiZWxvdy4gKi8KLSAgdW5zaWduZWQgaW50IGRpc3QydG8gOiA4OwotICB1bnNpZ25lZCBpbnQgcmVsdmFkZHIgOiAxOTsJLyogKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KS8gNCAqLwotICB1bnNpZ25lZCBsb25nIGtvbnN0OwkJLyogS09OU1QgZmllbGQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdmFkZHI7CQkvKiBWQUREUiB0byBiZSByZWxvY2F0ZWQuICAqLwotfSBFbGYzMl9jcmluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGludCBjdHlwZSA6IDE7CS8qIDE6IGxvbmcgMDogc2hvcnQgZm9ybWF0LiBTZWUgYmVsb3cuICAqLwotICB1bnNpZ25lZCBpbnQgcnR5cGUgOiA0OwkvKiBSZWxvY2F0aW9uIHR5cGVzLiBTZWUgYmVsb3cuICovCi0gIHVuc2lnbmVkIGludCBkaXN0MnRvIDogODsKLSAgdW5zaWduZWQgaW50IHJlbHZhZGRyIDogMTk7CS8qIChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkvIDQgKi8KLSAgdW5zaWduZWQgbG9uZyBrb25zdDsJCS8qIEtPTlNUIGZpZWxkLiBTZWUgYmVsb3cuICAqLwotfSBFbGYzMl9jcmluZm8yOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpbmZvWzRdOwotICBiZmRfYnl0ZSBrb25zdFs0XTsKLSAgYmZkX2J5dGUgdmFkZHJbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYmZkX2J5dGUgaW5mb1s0XTsKLSAgYmZkX2J5dGUga29uc3RbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzI7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgY29uc3RhbnRzIHVzZWQgdG8gc3dhcCB0aGUgYml0ZmllbGRzIGluIGEgY3JpbmZvLiAgKi8KLQotI2RlZmluZSBDUklORk9fQ1RZUEUgKDB4MSkKLSNkZWZpbmUgQ1JJTkZPX0NUWVBFX1NIICgzMSkKLSNkZWZpbmUgQ1JJTkZPX1JUWVBFICgweGYpCi0jZGVmaW5lIENSSU5GT19SVFlQRV9TSCAoMjcpCi0jZGVmaW5lIENSSU5GT19ESVNUMlRPICgweGZmKQotI2RlZmluZSBDUklORk9fRElTVDJUT19TSCAoMTkpCi0jZGVmaW5lIENSSU5GT19SRUxWQUREUiAoMHg3ZmZmZikKLSNkZWZpbmUgQ1JJTkZPX1JFTFZBRERSX1NIICgwKQotCi0vKiBBIGNvbXBhY3QgcmVsb2NhdGlvbiBpbmZvIGhhcyBsb25nICgzIHdvcmRzKSBvciBzaG9ydCAoMiB3b3JkcykKLSAgIGZvcm1hdHMuICBBIHNob3J0IGZvcm1hdCBkb2Vzbid0IGhhdmUgVkFERFIgZmllbGQgYW5kIHJlbHZhZGRyCi0gICBmaWVsZHMgY29udGFpbnMgKChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkgPj4gMikuICAqLwotI2RlZmluZSBDUkZfTUlQU19MT05HCQkJMQotI2RlZmluZSBDUkZfTUlQU19TSE9SVAkJCTAKLQotLyogVGhlcmUgYXJlIDQgdHlwZXMgb2YgY29tcGFjdCByZWxvY2F0aW9uIGF0IGxlYXN0LiBUaGUgdmFsdWUgS09OU1QKLSAgIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBmb3IgZWFjaCB0eXBlOgotCi0gICAodHlwZSkJCShrb25zdCkKLSAgIENUX01JUFNfUkVMMzIJQWRkcmVzcyBpbiBkYXRhCi0gICBDVF9NSVBTX1dPUkQJCUFkZHJlc3MgaW4gd29yZCAoWFhYKQotICAgQ1RfTUlQU19HUEhJX0xPCUdQIC0gdmFkZHIKLSAgIENUX01JUFNfSk1QQUQJQWRkcmVzcyB0byBqdW1wCi0gICAqLwotCi0jZGVmaW5lIENSVF9NSVBTX1JFTDMyCQkJMHhhCi0jZGVmaW5lIENSVF9NSVBTX1dPUkQJCQkweGIKLSNkZWZpbmUgQ1JUX01JUFNfR1BISV9MTwkJMHhjCi0jZGVmaW5lIENSVF9NSVBTX0pNUEFECQkJMHhkCi0KLSNkZWZpbmUgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCh4LGZvcm1hdCkJKCh4KS5jdHlwZSA9IChmb3JtYXQpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfdHlwZSh4LHR5cGUpCQkoKHgpLnJ0eXBlID0gKHR5cGUpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byh4LHYpCQkoKHgpLmRpc3QydG8gPSAodikpCi0jZGVmaW5lIG1pcHNfZWxmX3NldF9jcl9yZWx2YWRkcih4LGQpCQkoKHgpLnJlbHZhZGRyID0gKGQpPDwyKQotCi1zdGF0aWMgdm9pZCBiZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NvbXBhY3RfcmVsICosIEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICopKTsKLXN0YXRpYyB2b2lkIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NyaW5mbyAqLCBFbGYzMl9FeHRlcm5hbF9jcmluZm8gKikpOwotCi0jZGVmaW5lIFVTRV9SRUwJMQkJLyogTUlQUyB1c2VzIFJFTCByZWxvY2F0aW9ucyBpbnN0ZWFkIG9mIFJFTEEgKi8KLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MTzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1QxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19QQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEMxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBjYWxsIHRocm91Z2ggZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTEwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZGVmaW5lZCBvbiBJcml4IDUsIGFsdGhvdWdoIHRoZXkgYXJlCi0gICAgICAgbm90IGRlZmluZWQgYnkgdGhlIEFCSS4gICovCi0gICAgRU1QVFlfSE9XVE8gKDEzKSwKLSAgICBFTVBUWV9IT1dUTyAoMTQpLAotICAgIEVNUFRZX0hPV1RPICgxNSksCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCi0gICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzQsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ESVNQIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCB0byBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9PRlNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfT0ZTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgc3VidHJhY3Rpb24uICBVc2VkIGluIHRoZSBOMzIgQUJJLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TVUIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TVUIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIHRvIGNhdXNlIHRoZSBsaW5rZXIgdG8gaW5zZXJ0IGFuZCBkZWxldGUgaW5zdHJ1Y3Rpb25zPyAgKi8KLSAgRU1QVFlfSE9XVE8gKFJfTUlQU19JTlNFUlRfQSksCi0gIEVNUFRZX0hPV1RPIChSX01JUFNfSU5TRVJUX0IpLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX0RFTEVURSksCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFUiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNlY3Rpb24gZGlzcGxhY2VtZW50LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TQ05fRElTUCwgICAgICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TQ05fRElTUCIsICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEVNUFRZX0hPV1RPIChSX01JUFNfUkVMMTYpLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX0FERF9JTU1FRElBVEUpLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX1BKVU1QKSwKLSAgRU1QVFlfSE9XVE8gKFJfTUlQU19SRUxHT1QpLAotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVGhlIHJlbG9jIHVzZWQgZm9yIEJGRF9SRUxPQ19DVE9SIHdoZW4gZG9pbmcgYSA2NCBiaXQgbGluay4gIFRoaXMKLSAgIGlzIGEgaGFjayB0byBtYWtlIHRoZSBsaW5rZXIgdGhpbmsgdGhhdCB3ZSBuZWVkIDY0IGJpdCB2YWx1ZXMuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfY3RvcjY0X2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHMxNl9qdW1wX2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQUzE2XzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgbWlwczE2X2p1bXBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2XzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGdwcmVsIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzMTZfZ3ByZWxfaG93dG8gPQotICBIT1dUTyAoUl9NSVBTMTZfR1BSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMTZfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2X0dQUkVMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwMDFmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDAxZiwJICAgICAgICAvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi0vKiBHTlUgZXh0ZW5zaW9ucyBmb3IgZW1iZWRkZWQtcGljLiAgKi8KLS8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUsIHBjLXJlbGF0aXZlLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2dudV9yZWxfaGkxNiA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1JFTF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR05VX1JFTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLCBwYy1yZWxhdGl2ZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfcmVsX2xvMTYgPQotICBIT1dUTyAoUl9NSVBTX0dOVV9SRUxfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dOVV9SRUxfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIDE2IGJpdCBvZmZzZXQgZm9yIHBjLXJlbGF0aXZlIGJyYW5jaGVzLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2dudV9yZWwxNl9zMiA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1JFTDE2X1MyLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HTlVfUkVMMTZfUzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiA2NCBiaXQgcGMtcmVsYXRpdmUuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfZ251X3BjcmVsNjQgPQotICBIT1dUTyAoUl9NSVBTX1BDNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QQzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIDMyIGJpdCBwYy1yZWxhdGl2ZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfcGNyZWwzMiA9Ci0gIEhPV1RPIChSX01JUFNfUEMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BDMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIERvIGEgUl9NSVBTX0hJMTYgcmVsb2NhdGlvbi4gIFRoaXMgaGFzIHRvIGJlIGRvbmUgaW4gY29tYmluYXRpb24KLSAgIHdpdGggYSBSX01JUFNfTE8xNiByZWxvYywgYmVjYXVzZSB0aGVyZSBpcyBhIGNhcnJ5IGZyb20gdGhlIExPMTYgdG8KLSAgIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZQotICAgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuICBNSVBTIEVMRiByZXF1aXJlcyB0aGF0IHRoZQotICAgTE8xNiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEhJMTYuICBBcyBhIEdOVSBleHRlbnNpb24sIHdlIHBlcm1pdCBhbgotICAgYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNgotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpMTYKLXsKLSAgc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaTE2ICptaXBzX2hpMTZfbGlzdDsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgc3ltYm9sLAotCQkgICAgIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLAotCQkgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG1pcHNfaGkxNiAqbjsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0KLSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgIGJmZF92bWEgZ3A7Ci0KLSAgICAgIGlmIChyZXQgPT0gYmZkX3JlbG9jX3VuZGVmaW5lZCkKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLQlyZWxvY2F0ZWFibGUgPSB0cnVlOwotICAgICAgZWxzZQotCXsKLQkgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotCSAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotCX0KLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLAotCQkJICAgICAgIGVycm9yX21lc3NhZ2UsICZncCk7Ci0gICAgICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLQlyZXR1cm4gcmV0OwotCi0gICAgICByZWxvY2F0aW9uID0gZ3AgLSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0JICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLQlyZXQgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCXJlbG9jYXRpb24gPSAwOwotICAgICAgZWxzZQotCXJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotICAgIH0KLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaTE2ICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG1pcHNfaGkxNl9saXN0OwotICBtaXBzX2hpMTZfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSX01JUFNfTE8xNiByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQKLSAgIGlucGxhY2UgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlCi0gICBSX01JUFNfSEkxNiByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jIChhYmZkLAotCQkgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgIHN5bWJvbCwKLQkJICAgICBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwKLQkJICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYXJlbGVudCBncF9kaXNwX3JlbGVudDsKLQotICBpZiAobWlwc19oaTE2X2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbWlwc19oaTE2ICpsOwotCi0gICAgICBsID0gbWlwc19oaTE2X2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7Ci0KLQkgIC8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QgbmVlZAotCSAgICAgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZSB0bwotCSAgICAgZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpOwotCSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyB2YWxsbzsKLQkgIHZhbCArPSBsLT5hZGRlbmQ7Ci0KLQkgIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIHZhbHVlLiAgVGhlcmVmb3JlLCBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSBsb3cgb3JkZXIgYml0cwotCSAgICAgcmVxdWlyZXMgYW4gYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZAotCSAgICAgdG8gbWFrZSB0aGlzIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlCi0JICAgICB0b29rIGZyb20gdGhlIGRhdGEsIGFuZCBvbmNlIGZvciB0aGUgYml0cyB3ZSBhcmUgcHV0dGluZwotCSAgICAgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0JICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgLT0gMHgxMDAwMDsKLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCi0JICAgIHsKLQkgICAgICBncF9kaXNwX3JlbGVudCA9ICpyZWxvY19lbnRyeTsKLQkgICAgICByZWxvY19lbnRyeSA9ICZncF9kaXNwX3JlbGVudDsKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gbC0+YWRkZW5kOwotCSAgICB9Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG1pcHNfaGkxNl9saXN0ID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICAgICAgYmZkX3ZtYSBncCwgcmVsb2NhdGlvbjsKLQotICAgICAgLyogRklYTUU6IERvZXMgdGhpcyBjYXNlIGV2ZXIgb2NjdXI/ICAqLwotCi0gICAgICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCB0cnVlLCBlcnJvcl9tZXNzYWdlLCAmZ3ApOwotICAgICAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0JcmV0dXJuIHJldDsKLQotICAgICAgcmVsb2NhdGlvbiA9IGdwIC0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gICAgICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gICAgICBncF9kaXNwX3JlbGVudCA9ICpyZWxvY19lbnRyeTsKLSAgICAgIHJlbG9jX2VudHJ5ID0gJmdwX2Rpc3BfcmVsZW50OwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb24gLSA0OwotICAgIH0KLQotICAvKiBOb3cgZG8gdGhlIExPMTYgcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4gICovCi0gIHJldHVybiBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkJaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0dPVDE2IHJlbG9jLiAgVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGdsb2JhbCBvZmZzZXQKLSAgIHRhYmxlIHVzZWQgZm9yIFBJQyBjb2RlLiAgSWYgdGhlIHN5bWJvbCBpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgbW9kaWZpZWQgdG8gY29udGFpbiB0aGUgb2Zmc2V0IG9mIHRoZSBhcHByb3ByaWF0ZQotICAgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBJZiB0aGUgc3ltYm9sIGlzIGEgc2VjdGlvbgotICAgc3ltYm9sLCB0aGUgbmV4dCByZWxvYyBpcyBhIFJfTUlQU19MTzE2IHJlbG9jLiAgVGhlIHR3byAxNiBiaXQKLSAgIGFkZGVuZHMgYXJlIGNvbWJpbmVkIHRvIGZvcm0gdGhlIHJlYWwgYWRkZW5kIGFnYWluc3QgdGhlIHNlY3Rpb24KLSAgIHN5bWJvbDsgdGhlIEdPVDE2IGlzIG1vZGlmaWVkIHRvIGNvbnRhaW4gdGhlIG9mZnNldCBvZiBhbiBlbnRyeSBpbgotICAgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIGFuZCB0aGUgTE8xNiBpcyBtb2RpZmllZCB0byBvZmZzZXQgaXQKLSAgIGFwcHJvcHJpYXRlbHkuICBUaHVzIGFuIG9mZnNldCBsYXJnZXIgdGhhbiAxNiBiaXRzIHJlcXVpcmVzIGEKLSAgIG1vZGlmaWVkIHZhbHVlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotCi0gICBUaGlzIGltcGxlbWVudGF0aW9uIHN1ZmZpY2VzIGZvciB0aGUgYXNzZW1ibGVyLCBidXQgdGhlIGxpbmtlciBkb2VzCi0gICBub3QgeWV0IGtub3cgaG93IHRvIGNyZWF0ZSBnbG9iYWwgb2Zmc2V0IHRhYmxlcy4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYyAoYWJmZCwKLQkJICAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgIHN5bWJvbCwKLQkJICAgICAgZGF0YSwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSBjYW4gaGFuZGxlIGl0Ci0gICAgIGp1c3QgbGlrZSBISTE2LiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICByZXR1cm4gX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFNldCB0aGUgR1AgdmFsdWUgZm9yIE9VVFBVVF9CRkQuICBSZXR1cm5zIGZhbHNlIGlmIHRoaXMgaXMgYQotICAgZGFuZ2Vyb3VzIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfYXNzaWduX2dwIChvdXRwdXRfYmZkLCBwZ3ApCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkX3ZtYSAqcGdwOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGFzeW1ib2wgKipzeW07Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgZmlndXJlZCBvdXQgd2hhdCBHUCB3aWxsIGJlLCBqdXN0IHJldHVybiBpdC4gICovCi0gICpwZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0gIGlmICgqcGdwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0gIHN5bSA9IGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCk7Ci0KLSAgLyogVGhlIGxpbmtlciBzY3JpcHQgd2lsbCBoYXZlIGNyZWF0ZWQgYSBzeW1ib2wgbmFtZWQgYF9ncCcgd2l0aCB0aGUKLSAgICAgYXBwcm9wcmlhdGUgdmFsdWUuICAqLwotICBpZiAoc3ltID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIGkgPSBjb3VudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzeW0rKykKLQl7Ci0JICByZWdpc3RlciBDT05TVCBjaGFyICpuYW1lOwotCi0JICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoKnN5bSk7Ci0JICBpZiAoKm5hbWUgPT0gJ18nICYmIHN0cmNtcCAobmFtZSwgIl9ncCIpID09IDApCi0JICAgIHsKLQkgICAgICAqcGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOwotCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCAqcGdwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGkgPj0gY291bnQpCi0gICAgewotICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotICAgICAgKnBncCA9IDQ7Ci0gICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgKnBncCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIGdwIHZhbHVlLCBzbyB0aGF0IHdlIGNhbiBhZGp1c3QgdGhlCi0gICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICBCRkQuICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCB3ZSdyZSBzdHVjay4gIFdlIGNhY2hlIGl0IGluIHRoZSBFTEYKLSAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgIGV4dGVybmFsIHN5bWJvbCBpZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsIHBncCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLSAgICAgYmZkX3ZtYSAqcGdwOwotewotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAhIHJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAqcGdwID0gMDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotICAgIH0KLQotICAqcGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoKnBncCA9PSAwCi0gICAgICAmJiAoISByZWxvY2F0ZWFibGUKLQkgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICAqcGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOwotCX0KLSAgICAgIGVsc2UgaWYgKCFtaXBzX2VsZl9hc3NpZ25fZ3AgKG91dHB1dF9iZmQsIHBncCkpCi0JewotCSAgKmVycm9yX21lc3NhZ2UgPQotCSAgICAoY2hhciAqKSBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gX2dwIG5vdCBkZWZpbmVkIik7Ci0JICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0dQUkVMMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSAxNiBiaXQgdmFsdWUgd2hpY2ggbXVzdAotICAgYmVjb21lIHRoZSBvZmZzZXQgZnJvbSB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGZ1bmN0aW9uIGFsc28gaGFuZGxlcwotICAgUl9NSVBTX0xJVEVSQUwgcmVsb2NhdGlvbnMsIGFsdGhvdWdoIHRob3NlIGNhbiBiZSBoYW5kbGVkIG1vcmUKLSAgIGNsZXZlcmx5IGJlY2F1c2UgdGhlIGVudHJpZXMgaW4gdGhlIC5saXQ4IGFuZCAubGl0NCBzZWN0aW9ucyBjYW4gYmUKLSAgIG1lcmdlZC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ3ByZWwxNl93aXRoX2dwIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCQkgICAgICBhcmVsZW50ICosIGFzZWN0aW9uICosCi0JCQkJCQkgICAgICBib29sZWFuLCBQVFIsIGJmZF92bWEpKTsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSBncDsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aCBubwotICAgICBhZGRlbmQsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGFueXRoaW5nLiAgV2Ugd2lsbCBvbmx5IGhhdmUgYW4KLSAgICAgYWRkZW5kIGlmIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIHJlbG9jLCBub3QgcmVhZCBmcm9tIGFuIEVMRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsCi0JCQkgICAmZ3ApOwotICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLSAgICByZXR1cm4gcmV0OwotCi0gIHJldHVybiBncHJlbDE2X3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sCi0JCQkgIHJlbG9jYXRlYWJsZSwgZGF0YSwgZ3ApOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ncHJlbDE2X3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sIHJlbG9jYXRlYWJsZSwgZGF0YSwKLQkJIGdwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGJmZF92bWEgZ3A7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIGlmIChyZWxvY19lbnRyeS0+aG93dG8tPnNyY19tYXNrID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBjYXNlIG9jY3VycyB3aXRoIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLiAgKi8KLSAgICAgIHZhbCA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsID0gKChpbnNuICYgMHhmZmZmKSArIHJlbG9jX2VudHJ5LT5hZGRlbmQpICYgMHhmZmZmOwotICAgICAgaWYgKHZhbCAmIDB4ODAwMCkKLQl2YWwgLT0gMHgxMDAwMDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHZhbCBmb3IgdGhlIGZpbmFsIHNlY3Rpb24gbG9jYXRpb24gYW5kIEdQIHZhbHVlLiAgSWYgd2UKLSAgICAgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yCi0gICAgIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIGlmICghIHJlbG9jYXRlYWJsZQotICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIGl0IGZpdCBpbiAxNiBiaXRzLiAgKi8KLSAgaWYgKHZhbCA+PSAweDgwMDAgJiYgdmFsIDwgMHhmZmZmODAwMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0dQUkVMMzIgcmVsb2NhdGlvbi4gIElzIHRoaXMgMzIgYml0IHZhbHVlIHRoZSBvZmZzZXQKLSAgIGZyb20gdGhlIGdwIHJlZ2lzdGVyPyBYWFggKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBncHJlbDMyX3dpdGhfZ3AgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCSAgICAgIGJvb2xlYW4sIFBUUiwgYmZkX3ZtYSkpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYyAoYWJmZCwKLQkJCXJlbG9jX2VudHJ5LAotCQkJc3ltYm9sLAotCQkJZGF0YSwKLQkJCWlucHV0X3NlY3Rpb24sCi0JCQlvdXRwdXRfYmZkLAotCQkJZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRoIG5vCi0gICAgIGFkZGVuZCwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcuICBXZSB3aWxsIG9ubHkgaGF2ZSBhbgotICAgICBhZGRlbmQgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgcmVsb2MsIG5vdCByZWFkIGZyb20gYW4gRUxGCi0gICAgIGZpbGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKQotCV8oIjMyYml0cyBncCByZWxhdGl2ZSByZWxvY2F0aW9uIG9jY3VycyBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sIik7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSB0cnVlOwotICAgICAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0gICAgICBvdXRwdXRfYmZkID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0KLSAgICAgIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwKLQkJCSAgICAgICBlcnJvcl9tZXNzYWdlLCAmZ3ApOwotICAgICAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0JcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgcmV0dXJuIGdwcmVsMzJfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgcmVsb2NhdGVhYmxlLCBkYXRhLCBncCk7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWdwcmVsMzJfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwgcmVsb2NhdGVhYmxlLCBkYXRhLAotCQkgZ3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBncDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5ob3d0by0+c3JjX21hc2sgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhc2UgYXJpc2VzIHdpdGggdGhlIDY0LWJpdCBNSVBTIEVMRiBBQkkuICAqLwotICAgICAgdmFsID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICAvKiBTZXQgdmFsIHRvIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvciBzeW1ib2wuICAqLwotICB2YWwgKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKCEgcmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB2YWwgKz0gcmVsb2NhdGlvbiAtIGdwOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEhhbmRsZSBhIDY0IGJpdCByZWxvYyBpbiBhIDMyIGJpdCBNSVBTIEVMRiBmaWxlLiAgVGhlc2UgYXJlCi0gICBnZW5lcmF0ZWQgd2hlbiBhZGRyZXNlcyBhcmUgNjQgYml0cy4gIFRoZSB1cHBlciAzMiBiaXRzIGFyZSBhIHNpbWxlCi0gICBzaWduIGV4dGVuc2lvbi4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHMzMl82NGJpdF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgYXJlbGVudCByZWxvYzMyOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgYmZkX3NpemVfdHlwZSBhZGRyOwotCi0gIHIgPSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotICBpZiAociAhPSBiZmRfcmVsb2NfY29udGludWUpCi0gICAgcmV0dXJuIHI7Ci0KLSAgLyogRG8gYSBub3JtYWwgMzIgYml0IHJlbG9jYXRpb24gb24gdGhlIGxvd2VyIDMyIGJpdHMuICAqLwotICByZWxvYzMyID0gKnJlbG9jX2VudHJ5OwotICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHJlbG9jMzIuYWRkcmVzcyArPSA0OwotICByZWxvYzMyLmhvd3RvID0gJmVsZl9taXBzX2hvd3RvX3RhYmxlW1JfTUlQU18zMl07Ci0gIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChhYmZkLCAmcmVsb2MzMiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotCi0gIC8qIFNpZ24gZXh0ZW5kIGludG8gdGhlIHVwcGVyIDMyIGJpdHMuICAqLwotICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jMzIuYWRkcmVzcyk7Ci0gIGlmICgodmFsICYgMHg4MDAwMDAwMCkgIT0gMCkKLSAgICB2YWwgPSAweGZmZmZmZmZmOwotICBlbHNlCi0gICAgdmFsID0gMDsKLSAgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGFkZHIgKz0gNDsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIHJldHVybiByOwotfQotCi0vKiBIYW5kbGUgYSBtaXBzMTYganVtcC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHMxNl9qdW1wX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBGSVhNRS4gICovCi0gIHsKLSAgICBzdGF0aWMgYm9vbGVhbiB3YXJuZWQ7Ci0KLSAgICBpZiAoISB3YXJuZWQpCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiTGlua2luZyBtaXBzMTYgb2JqZWN0cyBpbnRvICVzIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIiksCi0JIGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpKTsKLSAgICB3YXJuZWQgPSB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci19Ci0KLS8qIEhhbmRsZSBhIG1pcHMxNiBHUCByZWxhdGl2ZSByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHMxNl9ncHJlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSBncDsKLSAgdW5zaWduZWQgc2hvcnQgZXh0ZW5kLCBpbnNuOwotICB1bnNpZ25lZCBsb25nIGZpbmFsOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRoIG5vCi0gICAgIGFkZGVuZCwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcuICBXZSB3aWxsIG9ubHkgaGF2ZSBhbgotICAgICBhZGRlbmQgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgcmVsb2MsIG5vdCByZWFkIGZyb20gYW4gRUxGCi0gICAgIGZpbGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLSAgICAgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLSAgICB9Ci0KLSAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLCBlcnJvcl9tZXNzYWdlLAotCQkJICAgJmdwKTsKLSAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0gICAgcmV0dXJuIHJldDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFBpY2sgdXAgdGhlIG1pcHMxNiBleHRlbmQgaW5zdHJ1Y3Rpb24gYW5kIHRoZSByZWFsIGluc3RydWN0aW9uLiAgKi8KLSAgZXh0ZW5kID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgMik7Ci0KLSAgLyogU3R1ZmYgdGhlIGN1cnJlbnQgYWRkZW5kIGJhY2sgYXMgYSAzMiBiaXQgdmFsdWUsIGRvIHRoZSB1c3VhbAotICAgICByZWxvY2F0aW9uLCBhbmQgdGhlbiBjbGVhbiB1cC4gICovCi0gIGJmZF9wdXRfMzIgKGFiZmQsCi0JICAgICAgKCgoZXh0ZW5kICYgMHgxZikgPDwgMTEpCi0JICAgICAgIHwgKGV4dGVuZCAmIDB4N2UwKQotCSAgICAgICB8IChpbnNuICYgMHgxZikpLAotCSAgICAgIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHJldCA9IGdwcmVsMTZfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwKLQkJCSByZWxvY2F0ZWFibGUsIGRhdGEsIGdwKTsKLQotICBmaW5hbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICBiZmRfcHV0XzE2IChhYmZkLAotCSAgICAgICgoZXh0ZW5kICYgMHhmODAwKQotCSAgICAgICB8ICgoZmluYWwgPj4gMTEpICYgMHgxZikKLQkgICAgICAgfCAoZmluYWwgJiAweDdlMCkpLAotCSAgICAgIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICBiZmRfcHV0XzE2IChhYmZkLAotCSAgICAgICgoaW5zbiAmIDB4ZmZlMCkKLQkgICAgICAgfCAoZmluYWwgJiAweDFmKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyArIDIpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFJldHVybiB0aGUgSVNBIGZvciBhIE1JUFMgZV9mbGFncyB2YWx1ZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1lbGZfbWlwc19pc2EgKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfQVJDSCkKLSAgICB7Ci0gICAgY2FzZSBFX01JUFNfQVJDSF8xOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBFX01JUFNfQVJDSF8yOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBFX01JUFNfQVJDSF8zOgotICAgICAgcmV0dXJuIDM7Ci0gICAgY2FzZSBFX01JUFNfQVJDSF80OgotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICByZXR1cm4gNDsKLX0KLQotLyogUmV0dXJuIHRoZSBNQUNIIGZvciBhIE1JUFMgZV9mbGFncyB2YWx1ZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1lbGZfbWlwc19tYWNoIChmbGFncykKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX01BQ0gpCi0gICAgewotICAgIGNhc2UgRV9NSVBTX01BQ0hfMzkwMDoKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzMzkwMDsKLQotICAgIGNhc2UgRV9NSVBTX01BQ0hfNDAxMDoKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzNDAxMDsKLQotICAgIGNhc2UgRV9NSVBTX01BQ0hfNDEwMDoKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzNDEwMDsKLQotICAgIGNhc2UgRV9NSVBTX01BQ0hfNDExMToKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzNDExMTsKLQotICAgIGNhc2UgRV9NSVBTX01BQ0hfNDY1MDoKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzNDY1MDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BUkNIKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgRV9NSVBTX0FSQ0hfMToKLQkgIHJldHVybiBiZmRfbWFjaF9taXBzMzAwMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX01JUFNfQVJDSF8yOgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHM2MDAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfTUlQU19BUkNIXzM6Ci0JICByZXR1cm4gYmZkX21hY2hfbWlwczQwMDA7Ci0JICBicmVhazsKLQotCWNhc2UgRV9NSVBTX0FSQ0hfNDoKLQkgIHJldHVybiBiZmRfbWFjaF9taXBzODAwMDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBwcmludGFibGUgbmFtZSBmb3IgQUJJLiAqLwotCi1zdGF0aWMgSU5MSU5FIGNoYXIqCi1lbGZfbWlwc19hYmlfbmFtZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoQUJJX04zMl9QIChhYmZkKSkKLSAgICByZXR1cm4gIk4zMiI7Ci0gIGVsc2UgaWYgKEFCSV82NF9QIChhYmZkKSkKLSAgICByZXR1cm4gIjY0IjsKLSAgICAgIAotICBmbGFncyA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzOwotICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BQkkpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAibm9uZSI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX08zMjoKLSAgICAgIHJldHVybiAiTzMyIjsKLSAgICBjYXNlIEVfTUlQU19BQklfTzY0OgotICAgICAgcmV0dXJuICJPNjQiOwotICAgIGNhc2UgRV9NSVBTX0FCSV9FQUJJMzI6Ci0gICAgICByZXR1cm4gIkVBQkkzMiI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX0VBQkk2NDoKLSAgICAgIHJldHVybiAiRUFCSTY0IjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIGFiaSI7Ci0gICAgfQotfQotCi0vKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gTUlQUyBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICBlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBtaXBzX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NSVBTX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01JUFNfMTYgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTUlQU18zMiB9LAotICB7IEJGRF9SRUxPQ182NCwgUl9NSVBTXzY0IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfSk1QLCBSX01JUFNfMjYgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLCBSX01JUFNfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19MTzE2LCBSX01JUFNfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBSX01JUFNfR1BSRUwxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIFJfTUlQU19MSVRFUkFMIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UMTYsIFJfTUlQU19HT1QxNiB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NSVBTX1BDMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIFJfTUlQU19DQUxMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLCBSX01JUFNfR1BSRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LCBSX01JUFNfR09UX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgUl9NSVBTX0dPVF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBSX01JUFNfQ0FMTF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBSX01JUFNfQ0FMTF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfU1VCLCBSX01JUFNfU1VCIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX1BBR0UsIFJfTUlQU19HT1RfUEFHRSB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNULCBSX01JUFNfR09UX09GU1QgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfRElTUCwgUl9NSVBTX0dPVF9ESVNQIH0KLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIGhvd3RvIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1pcHNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKG1pcHNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9taXBzX2hvd3RvX3RhYmxlWyhpbnQpIG1pcHNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIC8qIFdlIG5lZWQgdG8gaGFuZGxlIEJGRF9SRUxPQ19DVE9SIHNwZWNpYWxseS4KLQkgU2VsZWN0IHRoZSByaWdodCByZWxvY2F0aW9uIChSX01JUFNfMzIgb3IgUl9NSVBTXzY0KSBiYXNlZCBvbiB0aGUKLQkgc2l6ZSBvZiBhZGRyZXNzZXMgb24gdGhpcyBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgaWYgKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpID09IDMyKQotCXJldHVybiAmZWxmX21pcHNfaG93dG9fdGFibGVbKGludCkgUl9NSVBTXzMyXTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gJmVsZl9taXBzX2N0b3I2NF9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9KTVA6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfanVtcF9ob3d0bzsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUw6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfZ3ByZWxfaG93dG87Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV92dGluaGVyaXRfaG93dG87Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0bzsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV9yZWxfaGkxNjsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfcmVsX2xvMTY7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV9yZWwxNl9zMjsKLSAgICBjYXNlIEJGRF9SRUxPQ182NF9QQ1JFTDoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3BjcmVsNjQ7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV9wY3JlbDMyOwotICAgIH0KLX0KLQotLyogR2l2ZW4gYSBNSVBTIEVsZjMyX0ludGVybmFsX1JlbCwgZmlsbCBpbiBhbiBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1pcHNfcnR5cGVfdG9faG93dG8gKHJfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHJfdHlwZTsKLXsKLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9NSVBTMTZfMjY6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfanVtcF9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTMTZfR1BSRUw6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfZ3ByZWxfaG93dG87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFNfR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFNfR05VX1JFTF9ISTE2OgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfcmVsX2hpMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQU19HTlVfUkVMX0xPMTY6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV9yZWxfbG8xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTX0dOVV9SRUwxNl9TMjoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3JlbDE2X3MyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFNfUEM2NDoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3BjcmVsNjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQU19QQzMyOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfcGNyZWwzMjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTUlQU19tYXgpOwotICAgICAgcmV0dXJuICZlbGZfbWlwc19ob3d0b190YWJsZVtyX3R5cGVdOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhIE1JUFMgRWxmMzJfSW50ZXJuYWxfUmVsLCBmaWxsIGluIGFuIGFyZWxlbnQgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSBtaXBzX3J0eXBlX3RvX2hvd3RvIChyX3R5cGUpOwotCi0gIC8qIFRoZSBhZGRlbmQgZm9yIGEgR1BSRUwxNiBvciBMSVRFUkFMIHJlbG9jYXRpb24gY29tZXMgZnJvbSB0aGUgR1AKLSAgICAgdmFsdWUgZm9yIHRoZSBvYmplY3QgZmlsZS4gIFdlIGdldCB0aGUgYWRkZW5kIG5vdywgcmF0aGVyIHRoYW4KLSAgICAgd2hlbiB3ZSBkbyB0aGUgcmVsb2NhdGlvbiwgYmVjYXVzZSB0aGUgc3ltYm9sIG1hbmlwdWxhdGlvbnMgZG9uZQotICAgICBieSB0aGUgbGlua2VyIG1heSBjYXVzZSB1cyB0byBsb3NlIHRyYWNrIG9mIHRoZSBpbnB1dCBCRkQuICAqLwotICBpZiAoKCgqY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0gICAgICAmJiAocl90eXBlID09ICh1bnNpZ25lZCBpbnQpIFJfTUlQU19HUFJFTDE2Ci0JICB8fCByX3R5cGUgPT0gKHVuc2lnbmVkIGludCkgUl9NSVBTX0xJVEVSQUwpKQotICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gZWxmX2dwIChhYmZkKTsKLX0KLQotLyogR2l2ZW4gYSBNSVBTIEVsZjMyX0ludGVybmFsX1JlbGEsIGZpbGwgaW4gYW4gYXJlbGVudCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICAvKiBTaW5jZSBhbiBFbGYzMl9JbnRlcm5hbF9SZWwgaXMgYW4gaW5pdGlhbCBwcmVmaXggb2YgYW4KLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSwgd2UgY2FuIGp1c3QgdXNlIG1pcHNfaW5mb190b19ob3d0b19yZWwKLSAgICAgYWJvdmUuICAqLwotICBtaXBzX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIChFbGYzMl9JbnRlcm5hbF9SZWwgKikgZHN0KTsKLQotICAvKiBJZiB3ZSBldmVyIG5lZWQgdG8gZG8gYW55IGV4dHJhIHByb2Nlc3Npbmcgd2l0aCBkc3QtPnJfYWRkZW5kCi0gICAgICh0aGUgZmllbGQgb21pdHRlZCBpbiBhbiBFbGYzMl9JbnRlcm5hbF9SZWwpIHdlIGNhbiBkbyBpdCBoZXJlLiAgKi8KLX0KLQwKLS8qIEEgLnJlZ2luZm8gc2VjdGlvbiBob2xkcyBhIHNpbmdsZSBFbGYzMl9SZWdJbmZvIHN0cnVjdHVyZS4gIFRoZXNlCi0gICByb3V0aW5lcyBzd2FwIHRoaXMgc3RydWN0dXJlIGluIGFuZCBvdXQuICBUaGV5IGFyZSB1c2VkIG91dHNpZGUgb2YKLSAgIEJGRCwgc28gdGhleSBhcmUgZ2xvYmFsbHkgdmlzaWJsZS4gICovCi0KLXZvaWQKLWJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKmV4OwotICAgICBFbGYzMl9SZWdJbmZvICppbjsKLXsKLSAgaW4tPnJpX2dwcm1hc2sgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7Ci0gIGluLT5yaV9jcHJtYXNrWzBdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMF0pOwotICBpbi0+cmlfY3BybWFza1sxXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzFdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMl0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1syXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzNdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbM10pOwotICBpbi0+cmlfZ3BfdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BfdmFsdWUpOwotfQotCi12b2lkCi1iZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9fb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfUmVnSW5mbyAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfZ3BybWFzaywKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMF0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzFdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1syXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbM10sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncF92YWx1ZSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLS8qIEluIHRoZSA2NCBiaXQgQUJJLCB0aGUgLk1JUFMub3B0aW9ucyBzZWN0aW9uIGhvbGRzIHJlZ2lzdGVyCi0gICBpbmZvcm1hdGlvbiBpbiBhbiBFbGY2NF9SZWdpbmZvIHN0cnVjdHVyZS4gIFRoZXNlIHJvdXRpbmVzIHN3YXAKLSAgIHRoZW0gaW4gYW5kIG91dC4gIFRoZXkgYXJlIGdsb2JhbGx5IHZpc2libGUgYmVjYXVzZSB0aGV5IGFyZSB1c2VkCi0gICBvdXRzaWRlIG9mIEJGRC4gIFRoZXNlIHJvdXRpbmVzIGFyZSBoZXJlIHNvIHRoYXQgZ2FzIGNhbiBjYWxsIHRoZW0KLSAgIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgd2hldGhlciB0aGUgNjQgYml0IEFCSSBoYXMgYmVlbiBpbmNsdWRlZC4gICovCi0KLXZvaWQKLWJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKmV4OwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICppbjsKLXsKLSAgaW4tPnJpX2dwcm1hc2sgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7Ci0gIGluLT5yaV9wYWQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfcGFkKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzFdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBpbi0+cmlfY3BybWFza1syXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGluLT5yaV9ncF92YWx1ZSA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLXZvaWQKLWJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICppbjsKLSAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncHJtYXNrLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwcm1hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfcGFkLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX3BhZCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzBdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMF0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1sxXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzFdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMl0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1syXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzNdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbM10pOwotICBiZmRfaF9wdXRfNjQgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfZ3BfdmFsdWUsCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfZ3BfdmFsdWUpOwotfQotCi0vKiBTd2FwIGFuIGVudHJ5IGluIGEgLmdwdGFiIHNlY3Rpb24uICBOb3RlIHRoYXQgdGhlc2Ugcm91dGluZXMgcmVseQotICAgb24gdGhlIGVxdWl2YWxlbmNlIG9mIHRoZSB0d28gZWxlbWVudHMgb2YgdGhlIHVuaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4gKGFiZmQsIGV4LCBpbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqZXg7Ci0gICAgIEVsZjMyX2dwdGFiICppbjsKLXsKLSAgaW4tPmd0X2VudHJ5Lmd0X2dfdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5ndF9lbnRyeS5ndF9nX3ZhbHVlKTsKLSAgaW4tPmd0X2VudHJ5Lmd0X2J5dGVzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleC0+Z3RfZW50cnkuZ3RfYnl0ZXMpOwotfQotCi1zdGF0aWMgdm9pZAotYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9ncHRhYiAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX2dwdGFiICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmd0X2VudHJ5Lmd0X2dfdmFsdWUsCi0JCWV4LT5ndF9lbnRyeS5ndF9nX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmd0X2VudHJ5Lmd0X2J5dGVzLAotCQlleC0+Z3RfZW50cnkuZ3RfYnl0ZXMpOwotfQotCi1zdGF0aWMgdm9pZAotYmZkX2VsZjMyX3N3YXBfY29tcGFjdF9yZWxfb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfY29tcGFjdF9yZWwgKmluOwotICAgICBFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCAqZXg7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5pZDEsIGV4LT5pZDEpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+bnVtLCBleC0+bnVtKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmlkMiwgZXgtPmlkMik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5vZmZzZXQsIGV4LT5vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmVzZXJ2ZWQwLCBleC0+cmVzZXJ2ZWQwKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJlc2VydmVkMSwgZXgtPnJlc2VydmVkMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZWxmMzJfc3dhcF9jcmluZm9fb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfY3JpbmZvICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfY3JpbmZvICpleDsKLXsKLSAgdW5zaWduZWQgbG9uZyBsOwotCi0gIGwgPSAoKChpbi0+Y3R5cGUgJiBDUklORk9fQ1RZUEUpIDw8IENSSU5GT19DVFlQRV9TSCkKLSAgICAgICB8ICgoaW4tPnJ0eXBlICYgQ1JJTkZPX1JUWVBFKSA8PCBDUklORk9fUlRZUEVfU0gpCi0gICAgICAgfCAoKGluLT5kaXN0MnRvICYgQ1JJTkZPX0RJU1QyVE8pIDw8IENSSU5GT19ESVNUMlRPX1NIKQotICAgICAgIHwgKChpbi0+cmVsdmFkZHIgJiBDUklORk9fUkVMVkFERFIpIDw8IENSSU5GT19SRUxWQUREUl9TSCkpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBsLCBleC0+aW5mbyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5rb25zdCwgZXgtPmtvbnN0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnZhZGRyLCBleC0+dmFkZHIpOwotfQotCi0vKiBTd2FwIGluIGFuIG9wdGlvbnMgaGVhZGVyLiAgKi8KLQotdm9pZAotYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9PcHRpb25zICpleDsKLSAgICAgRWxmX0ludGVybmFsX09wdGlvbnMgKmluOwotewotICBpbi0+a2luZCA9IGJmZF9oX2dldF84IChhYmZkLCBleC0+a2luZCk7Ci0gIGluLT5zaXplID0gYmZkX2hfZ2V0XzggKGFiZmQsIGV4LT5zaXplKTsKLSAgaW4tPnNlY3Rpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4LT5zZWN0aW9uKTsKLSAgaW4tPmluZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5pbmZvKTsKLX0KLQotLyogU3dhcCBvdXQgYW4gb3B0aW9ucyBoZWFkZXIuICAqLwotCi12b2lkCi1iZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9PcHRpb25zICppbjsKLSAgICAgRWxmX0V4dGVybmFsX09wdGlvbnMgKmV4OwotewotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW4tPmtpbmQsIGV4LT5raW5kKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIGluLT5zaXplLCBleC0+c2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnNlY3Rpb24sIGV4LT5zZWN0aW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+aW5mbywgZXgtPmluZm8pOwotfQotI2lmIDAKLS8qIFN3YXAgaW4gYW4gTVNZTSBlbnRyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1iZmRfbWlwc19lbGZfc3dhcF9tc3ltX2luIChhYmZkLCBleCwgaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfRXh0ZXJuYWxfTXN5bSAqZXg7Ci0gICAgIEVsZjMyX0ludGVybmFsX01zeW0gKmluOwotewotICBpbi0+bXNfaGFzaF92YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPm1zX2hhc2hfdmFsdWUpOwotICBpbi0+bXNfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXgtPm1zX2luZm8pOwotfQotI2VuZGlmCi0vKiBTd2FwIG91dCBhbiBNU1lNIGVudHJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLWJmZF9taXBzX2VsZl9zd2FwX21zeW1fb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfSW50ZXJuYWxfTXN5bSAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX01zeW0gKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5tc19oYXNoX3ZhbHVlLCBleC0+bXNfaGFzaF92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPm1zX2luZm8sIGV4LT5tc19pbmZvKTsKLX0KLQotDAotLyogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzeW1ib2wgaXMgZ2xvYmFsIGZvciB0aGUgcHVycG9zZXMgb2Ygc3BsaXR0aW5nCi0gICB0aGUgc3ltYm9sIHRhYmxlIGludG8gZ2xvYmFsIHN5bWJvbHMgYW5kIGxvY2FsIHN5bWJvbHMuICBBdCBsZWFzdAotICAgb24gSXJpeCA1LCB0aGlzIHNwbGl0IG11c3QgYmUgYmV0d2VlbiBzZWN0aW9uIHN5bWJvbHMgYW5kIGFsbCBvdGhlcgotICAgc3ltYm9scy4gIE9uIG1vc3QgRUxGIHRhcmdldHMgdGhlIHNwbGl0IGlzIGJldHdlZW4gc3RhdGljIHN5bWJvbHMKLSAgIGFuZCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX3N5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgcmV0dXJuIChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOwotfQotDAotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlciBmb3IgYSBNSVBTIEVMRiBmaWxlLiAgVGhpcyBpcyB1c2VkIGZvcgotICAgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogSXJpeCA1IGFuZCA2IGlzIGJyb2tlbi4gIE9iamVjdCBmaWxlIHN5bWJvbCB0YWJsZXMgYXJlIG5vdCBhbHdheXMKLSAgICAgc29ydGVkIGNvcnJlY3RseSBzdWNoIHRoYXQgbG9jYWwgc3ltYm9scyBwcmVjZWRlIGdsb2JhbCBzeW1ib2xzLAotICAgICBhbmQgdGhlIHNoX2luZm8gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBpcyBub3QgYWx3YXlzIHJpZ2h0LiAgKi8KLSAgZWxmX2JhZF9zeW10YWIgKGFiZmQpID0gdHJ1ZTsKLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9taXBzLAotCQkJICAgICBlbGZfbWlwc19tYWNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIGZpbmFsIHByb2Nlc3NpbmcgZG9uZSBqdXN0IGJlZm9yZSB3cml0aW5nIG91dCBhIE1JUFMgRUxGIG9iamVjdAotICAgZmlsZS4gIFRoaXMgZ2V0cyB0aGUgTUlQUyBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUKLSAgIG51bWJlci4gIFRoaXMgaXMgdXNlZCBieSBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1fYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlciBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaGRycHA7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfbWlwczMwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8xOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMSB8IEVfTUlQU19NQUNIXzM5MDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQzMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDEwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDEwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDExMToKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjUwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQ2NTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczgwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF80OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLQotICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgZm9yIC5ncHRhYiBzZWN0aW9ucyBhbmQgb3RoZXIgYXBwcm9wcmlhdGUKLSAgICAgaW5mbyBmb3IgZWFjaCBzcGVjaWFsIHNlY3Rpb24uICAqLwotICBmb3IgKGkgPSAxLCBoZHJwcCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgKyAxOwotICAgICAgIGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsKLSAgICAgICBpKyssIGhkcnBwKyspCi0gICAgewotICAgICAgc3dpdGNoICgoKmhkcnBwKS0+c2hfdHlwZSkKLQl7Ci0JY2FzZSBTSFRfTUlQU19NU1lNOgotCWNhc2UgU0hUX01JUFNfTElCTElTVDoKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN0ciIpOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX0dQVEFCOgotCSAgQkZEX0FTU0VSVCAoKCpoZHJwcCktPmJmZF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCAoKmhkcnBwKS0+YmZkX3NlY3Rpb24pOwotCSAgQkZEX0FTU0VSVCAobmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApOwotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxKTsKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkgICgqaGRycHApLT5zaF9pbmZvID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfQ09OVEVOVDoKLQkgIEJGRF9BU1NFUlQgKCgqaGRycHApLT5iZmRfc2VjdGlvbiAhPSBOVUxMKTsKLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgKCpoZHJwcCktPmJmZF9zZWN0aW9uKTsKLQkgIEJGRF9BU1NFUlQgKG5hbWUgIT0gTlVMTAotCQkgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsCi0JCQkJICBzaXplb2YgIi5NSVBTLmNvbnRlbnQiIC0gMSkgPT0gMCk7Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKLQkJCQkJIG5hbWUgKyBzaXplb2YgIi5NSVBTLmNvbnRlbnQiIC0gMSk7Ci0JICBCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7Ci0JICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX1NZTUJPTF9MSUI6Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKLQkgIGlmIChzZWMgIT0gTlVMTCkKLQkgICAgKCpoZHJwcCktPnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxpYmxpc3QiKTsKLQkgIGlmIChzZWMgIT0gTlVMTCkKLQkgICAgKCpoZHJwcCktPnNoX2luZm8gPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfTUlQU19FVkVOVFM6Ci0JICBCRkRfQVNTRVJUICgoKmhkcnBwKS0+YmZkX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsICgqaGRycHApLT5iZmRfc2VjdGlvbik7Ci0JICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwpOwotCSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuTUlQUy5ldmVudHMiLCBzaXplb2YgIi5NSVBTLmV2ZW50cyIgLSAxKSA9PSAwKQotCSAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKLQkJCQkJICAgbmFtZSArIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5NSVBTLnBvc3RfcmVsIiwKLQkJCQkgICBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpID09IDApOwotCSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkgICAgIChuYW1lCi0JCQkJCSAgICAgICsgc2l6ZW9mICIuTUlQUy5wb3N0X3JlbCIgLSAxKSk7Ci0JICAgIH0KLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCX0KLSAgICB9Ci19Ci0MCi0vKiBGdW5jdGlvbiB0byBrZWVwIE1JUFMgc3BlY2lmaWMgZmlsZSBmbGFncyBsaWtlIGFzIEVGX01JUFNfUElDLiAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MKLQkJICA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncykpOwotCi0gIGVsZl9ncCAob2JmZCkgPSBlbGZfZ3AgKGliZmQpOwotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb2xkX2ZsYWdzOwotICBmbGFnd29yZCBuZXdfZmxhZ3M7Ci0gIGJvb2xlYW4gb2s7Ci0KLSAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgc2FtZSBlbmRpYW5lc3MgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbXNnOwotCi0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGliZmQpKQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4iKTsKLSAgICAgIGVsc2UKLQltc2cgPSBfKCIlczogY29tcGlsZWQgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBiaWcgZW5kaWFuIik7Ci0KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IG5ld19mbGFncyAmIEVGX01JUFNfTk9SRU9SREVSOwotICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfaWRlbnRbRUlfQ0xBU1NdIAotCT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfaWRlbnRbRUlfQ0xBU1NdOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXsKLQkgIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJCSAgIGJmZF9nZXRfbWFjaCAoaWJmZCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLQotICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfTk9SRU9SREVSOwotICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfTk9SRU9SREVSOwotCi0gIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9rID0gdHJ1ZTsKLQotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfUElDKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19QSUMpKQotICAgIHsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfTUlQU19QSUM7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfUElDOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBsaW5raW5nIFBJQyBmaWxlcyB3aXRoIG5vbi1QSUMgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpICE9IChvbGRfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpKQotICAgIHsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfTUlQU19DUElDOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX0NQSUM7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGxpbmtpbmcgYWJpY2FsbHMgZmlsZXMgd2l0aCBub24tYWJpY2FsbHMgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ29tcGFyZSB0aGUgSVNBJ3MuICovCi0gIGlmICgobmV3X2ZsYWdzICYgKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCkpCi0gICAgICAhPSAob2xkX2ZsYWdzICYgKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCkpKQotICAgIHsKLSAgICAgIGludCBuZXdfbWFjaCA9IG5ld19mbGFncyAmIEVGX01JUFNfTUFDSDsKLSAgICAgIGludCBvbGRfbWFjaCA9IG9sZF9mbGFncyAmIEVGX01JUFNfTUFDSDsKLSAgICAgIGludCBuZXdfaXNhID0gZWxmX21pcHNfaXNhIChuZXdfZmxhZ3MpOwotICAgICAgaW50IG9sZF9pc2EgPSBlbGZfbWlwc19pc2EgKG9sZF9mbGFncyk7Ci0KLSAgICAgIC8qIElmIGVpdGhlciBoYXMgbm8gbWFjaGluZSBzcGVjaWZpZWQsIGp1c3QgY29tcGFyZSB0aGUgZ2VuZXJhbCBpc2Ency4KLQkgU29tZSBjb21iaW5hdGlvbnMgb2YgbWFjaGluZXMgYXJlIG9rLCBpZiB0aGUgaXNhJ3MgbWF0Y2guICovCi0gICAgICBpZiAoISBuZXdfbWFjaCAKLQkgIHx8ICEgb2xkX21hY2gKLQkgIHx8IG5ld19tYWNoID09IG9sZF9tYWNoCi0JICApCi0JewotCSAgLyogRG9uJ3Qgd2FybiBhYm91dCBtaXhpbmcgLW1pcHMxIGFuZCAtbWlwczIgY29kZSwgb3IgbWl4aW5nIC1taXBzMwotCSAgICAgYW5kIC1taXBzNCBjb2RlLiAgVGhleSB3aWxsIG5vcm1hbGx5IHVzZSB0aGUgc2FtZSBkYXRhIHNpemVzIGFuZAotCSAgICAgY2FsbGluZyBjb252ZW50aW9ucy4gICovCi0KLQkgIGlmICgobmV3X2lzYSA9PSAxIHx8IG5ld19pc2EgPT0gMikKLQkgICAgICA/IChvbGRfaXNhICE9IDEgJiYgb2xkX2lzYSAhPSAyKQotCSAgICAgIDogKG9sZF9pc2EgPT0gMSB8fCBvbGRfaXNhID09IDIpKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogSVNBIG1pc21hdGNoICgtbWlwcyVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKC1taXBzJWQpIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCBuZXdfaXNhLCBvbGRfaXNhKTsKLQkgICAgICBvayA9IGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogSVNBIG1pc21hdGNoICglZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICglZCkiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgICAgZWxmX21pcHNfbWFjaCAobmV3X2ZsYWdzKSwKLQkgICAgIGVsZl9taXBzX21hY2ggKG9sZF9mbGFncykpOwotCSAgb2sgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIG5ld19mbGFncyAmPSB+IChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpOwotICAgICAgb2xkX2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gICAgfQotCi0gIC8qIENvbXBhcmUgQUJJJ3MuICBUaGUgNjQtYml0IEFCSSBkb2VzIG5vdCB1c2UgRUZfTUlQU19BQkkuICBCdXQsIGl0Ci0gICAgIGRvZXMgc2V0IEVJX0NMQVNTIGRpZmZlcmVudGx5IGZyb20gYW55IDMyLWJpdCBBQkkuICAqLwotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfQUJJKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19BQkkpCi0gICAgICB8fCAoZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfaWRlbnRbRUlfQ0xBU1NdIAotCSAgIT0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfaWRlbnRbRUlfQ0xBU1NdKSkKLSAgICB7Ci0gICAgICAvKiBPbmx5IGVycm9yIGlmIGJvdGggYXJlIHNldCAodG8gZGlmZmVyZW50IHZhbHVlcykuICovCi0gICAgICBpZiAoKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgJiYgKG9sZF9mbGFncyAmIEVGX01JUFNfQUJJKSkKLQkgIHx8IChlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9pZGVudFtFSV9DTEFTU10gCi0JICAgICAgIT0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfaWRlbnRbRUlfQ0xBU1NdKSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBBQkkgbWlzbWF0Y2g6IGxpbmtpbmcgJXMgbW9kdWxlIHdpdGggcHJldmlvdXMgJXMgbW9kdWxlcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICAgICBlbGZfbWlwc19hYmlfbmFtZSAoaWJmZCksCi0JICAgICBlbGZfbWlwc19hYmlfbmFtZSAob2JmZCkpOwotCSAgb2sgPSBmYWxzZTsKLQl9Ci0gICAgICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfQUJJOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX0FCSTsKLSAgICB9Ci0KLSAgLyogV2FybiBhYm91dCBhbnkgb3RoZXIgbWlzbWF0Y2hlcyAqLwotICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksICh1bnNpZ25lZCBsb25nKSBuZXdfZmxhZ3MsCi0JICh1bnNpZ25lZCBsb25nKSBvbGRfZmxhZ3MpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgb2spCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHB0cjsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHB0cjsKLQotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotCi0gIC8qIFByaW50IG5vcm1hbCBFTEYgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9PMzIpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU8zMl0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSA9PSBFX01JUFNfQUJJX082NCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9TzY0XSIpKTsKLSAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfRUFCSTMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1FQUJJMzJdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9FQUJJNjQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPUVBQkk2NF0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmkgdW5rbm93bl0iKSk7Ci0gIGVsc2UgaWYgKEFCSV9OMzJfUCAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU4zMl0iKSk7Ci0gIGVsc2UgaWYgKEFCSV82NF9QIChhYmZkKSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9NjRdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbm8gYWJpIHNldF0iKSk7Ci0KLSAgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMV0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzMl0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzM10iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfNCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFttaXBzNF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFt1bmtub3duIElTQV0iKSk7Ci0KLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU18zMkJJVE1PREUpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbMzJiaXRtb2RlXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW25vdCAzMmJpdG1vZGVdIikpOwotCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhhbmRsZSBhIE1JUFMgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLgotICAgVGhpcyByb3V0aW5lIHN1cHBvcnRzIGJvdGggdGhlIDMyLWJpdCBhbmQgNjQtYml0IEVMRiBBQkkuCi0KLSAgIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgU0hGX01JUFNfR1BSRUwgZmxhZywgYnV0IEknbSBub3Qgc3VyZQotICAgaG93IHRvLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzID0gMDsKLQotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gIEZvcnR1bmF0ZWx5LCB0aGUgQUJJIGdpdmVzCi0gICAgIHN1Z2dlc3RlZCBuYW1lcyBmb3IgYWxsIHRoZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLCBzbyB3ZSB3aWxsCi0gICAgIHByb2JhYmx5IGdldCBhd2F5IHdpdGggdGhpcy4gICovCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9NSVBTX0xJQkxJU1Q6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmxpYmxpc3QiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfTVNZTToKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0NPTkZMSUNUOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5jb25mbGljdCIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19HUFRBQjoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfVUNPREU6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnVjb2RlIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0RFQlVHOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZsYWdzID0gU0VDX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfUkVHSU5GTzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpICE9IDAKLQkgIHx8IGhkci0+c2hfc2l6ZSAhPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZsYWdzID0gKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0lGQUNFOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLmludGVyZmFjZXMiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfQ09OVEVOVDoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfT1BUSU9OUzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChhYmZkKSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0RXQVJGOgotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWdfIiwgc2l6ZW9mICIuZGVidWdfIiAtIDEpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLnN5bWxpYiIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19FVkVOVFM6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCi0JCSAgICAgIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCi0JCQkJCQkJICAgaGRyLT5iZmRfc2VjdGlvbikKLQkJCQkgICAgfCBmbGFncykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFdlIHNob3VsZCByZWNvcmQgc2hfaW5mbyBmb3IgYSAuZ3B0YWIgc2VjdGlvbi4gICovCi0KLSAgLyogRm9yIGEgLnJlZ2luZm8gc2VjdGlvbiwgc2V0IHRoZSBncCB2YWx1ZSBpbiB0aGUgdGRhdGEgaW5mb3JtYXRpb24KLSAgICAgZnJvbSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgV2UgbmVlZCB0aGUgZ3AgdmFsdWUgd2hpbGUKLSAgICAgcHJvY2Vzc2luZyByZWxvY3MsIHNvIHdlIGp1c3QgZ2V0IGl0IG5vdy4gIFRoZSAucmVnaW5mbyBzZWN0aW9uCi0gICAgIGlzIG5vdCB1c2VkIGluIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19SRUdJTkZPKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OwotICAgICAgRWxmMzJfUmVnSW5mbyBzOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sIChQVFIpICZleHQsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4gKGFiZmQsICZleHQsICZzKTsKLSAgICAgIGVsZl9ncCAoYWJmZCkgPSBzLnJpX2dwX3ZhbHVlOwotICAgIH0KLQotICAvKiBGb3IgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24sIGxvb2sgZm9yIGEgT0RLX1JFR0lORk8gZW50cnksIGFuZAotICAgICBzZXQgdGhlIGdwIHZhbHVlIGJhc2VkIG9uIHdoYXQgd2UgZmluZC4gIFdlIG1heSBzZWUgYm90aAotICAgICBTSFRfTUlQU19SRUdJTkZPIGFuZCBTSFRfTUlQU19PUFRJT05TL09ES19SRUdJTkZPOyBpbiB0aGF0IGNhc2UsCi0gICAgIHRoZXkgc2hvdWxkIGFncmVlLiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIGhkci0+c2hfc2l6ZSkpCi0JewotCSAgZnJlZSAoY29udGVudHMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChBQklfNjRfUCAoYWJmZCkgJiYgaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCi0JICAgIHsKLQkgICAgICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIGludHJlZzsKLQotCSAgICAgIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbgotCQkoYWJmZCwKLQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkgIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykpKSwKLQkJICZpbnRyZWcpOwotCSAgICAgIGVsZl9ncCAoYWJmZCkgPSBpbnRyZWcucmlfZ3BfdmFsdWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgRWxmMzJfUmVnSW5mbyBpbnRyZWc7Ci0KLQkgICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4KLQkJKGFiZmQsCi0JCSAoKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikKLQkJICAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKSksCi0JCSAmaW50cmVnKTsKLQkgICAgICBlbGZfZ3AgKGFiZmQpID0gaW50cmVnLnJpX2dwX3ZhbHVlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhIE1JUFMgRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQotICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgIi5saWJsaXN0IikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19MSUJMSVNUOwotICAgICAgaGRyLT5zaF9pbmZvID0gc2VjLT5fcmF3X3NpemUgLyBzaXplb2YgKEVsZjMyX0xpYik7Ci0gICAgICAvKiBUaGUgc2hfbGluayBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuY29uZmxpY3QiKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0NPTkZMSUNUOwotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0dQVEFCOwotICAgICAgaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0gICAgICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIudWNvZGUiKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX1VDT0RFOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19ERUJVRzsKLSAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5tZGVidWcgc2VjdGlvbiBoYXMgYW4KLSAgICAgICAgIGVudHNpemUgb2YgMC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KLSAgICAgIGlmIChTR0lfQ09NUEFUIChhYmZkKSAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCWhkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWdpbmZvIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19SRUdJTkZPOwotICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLnJlZ2luZm8gc2VjdGlvbiBoYXMgYW4KLSAgICAgICAgIGVudHNpemUgb2YgMHgxOC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KLSAgICAgIGlmIChTR0lfQ09NUEFUIChhYmZkKSAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCWhkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNHSV9DT01QQVQgKGFiZmQpCi0JICAgJiYgKHN0cmNtcCAobmFtZSwgIi5oYXNoIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIuZHluYW1pYyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApKQotICAgIHsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDA7Ci0jaWYgMAotICAgICAgLyogVGhpcyBpc24ndCBob3cgdGhlIElyaXggNiBsaW5rZXIgYmVoYXZlcy4gICovCi0gICAgICBoZHItPnNoX2luZm8gPSBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVM7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5nb3QiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCBNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0gICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19HUFJFTDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLk1JUFMuaW50ZXJmYWNlcyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfSUZBQ0U7Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsIHN0cmxlbiAoIi5NSVBTLmNvbnRlbnQiKSkgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19DT05URU5UOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgICAgLyogVGhlIHNoX2luZm8gZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfT1BUSU9OUzsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDE7Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIHNpemVvZiAiLmRlYnVnXyIgLSAxKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0RXQVJGOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5zeW1saWIiKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX1NZTUJPTF9MSUI7Ci0gICAgICAvKiBUaGUgc2hfbGluayBhbmQgc2hfaW5mbyBmaWVsZHMgYXJlIHNldCBpbgotICAgICAgICAgZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuZXZlbnRzIiwgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSkgPT0gMAotCSAgIHx8IHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCi0JCSAgICAgICBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfRVZFTlRTOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgICAgLyogVGhlIHNoX2xpbmsgZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfTVNZTTsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwotICAgICAgaGRyLT5zaF9lbnRzaXplID0gODsKLSAgICB9Ci0KLSAgLyogVGhlIGdlbmVyaWMgZWxmX2Zha2Vfc2VjdGlvbnMgd2lsbCBzZXQgdXAgUkVMX0hEUiB1c2luZyB0aGUKLSAgICAgZGVmYXVsdCBraW5kIG9mIHJlbG9jYXRpb25zLiAgQnV0LCB3ZSBtYXkgYWN0dWFsbHkgbmVlZCBib3RoCi0gICAgIGtpbmRzIG9mIHJlbG9jYXRpb25zLCBzbyB3ZSBzZXQgdXAgdGhlIHNlY29uZCBoZWFkZXIgaGVyZS4gICovCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmVzZDsKLQotICAgICAgZXNkID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVzZC0+cmVsX2hkcjIgPT0gTlVMTCk7Ci0gICAgICBlc2QtPnJlbF9oZHIyIAotCT0gKEVsZl9JbnRlcm5hbF9TaGRyICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKTsKLSAgICAgIGlmICghZXNkLT5yZWxfaGRyMikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBfYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIgKGFiZmQsIGVzZC0+cmVsX2hkcjIsIHNlYywKLQkJCQkhZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dXNlX3JlbGFfcCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhIEJGRCBzZWN0aW9uLCB0cnkgdG8gbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVMRiBzZWN0aW9uCi0gICBpbmRleC4gIFRoaXMgaXMgdXNlZCBieSBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLgotICAgQWN0dWFsbHksIGl0J3Mgbm90IGNsZWFyIHRvIG1lIHRoYXQgdGhlIDY0LWJpdCBBQkkgc3VwcG9ydHMgdGhlc2UsCi0gICBidXQgZm9yIG5vbi1QSUMgb2JqZWN0cyB3ZSB3aWxsIGNlcnRhaW5seSB3YW50IHN1cHBvcnQgZm9yIGF0IGxlYXN0Ci0gICB0aGUgLnNjb21tb24gc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBoZHIsIHNlYywgcmV0dmFsKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCAqcmV0dmFsOwotewotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICAqcmV0dmFsID0gU0hOX01JUFNfU0NPTU1PTjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuYWNvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NSVBTX0FDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV2hlbiBhcmUgd3JpdGluZyBvdXQgdGhlIC5vcHRpb25zIG9yIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiwKLSAgIHJlbWVtYmVyIHRoZSBieXRlcyB3ZSBhcmUgd3JpdGluZyBvdXQsIHNvIHRoYXQgd2UgY2FuIGluc3RhbGwgdGhlCi0gICBHUCB2YWx1ZSBpbiB0aGUgc2VjdGlvbl9wcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgKmM7Ci0KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpKTsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYyA9IChiZmRfYnl0ZSAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGRhdGE7Ci0gICAgICBpZiAoYyA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotCSAgaWYgKHNlY3Rpb24tPl9jb29rZWRfc2l6ZSAhPSAwKQotCSAgICBzaXplID0gc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgZWxzZQotCSAgICBzaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgYyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50ZGF0YSA9IChQVFIpIGM7Ci0JfQotCi0gICAgICBtZW1jcHkgKGMgKyBvZmZzZXQsIGxvY2F0aW9uLCBjb3VudCk7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwKLQkJCQkJY291bnQpOwotfQotCi0vKiBXb3JrIG92ZXIgYSBzZWN0aW9uIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICBGSVhNRTogV2UgcmVjb2duaXplCi0gICBzZWN0aW9ucyB0aGF0IG5lZWQgdGhlIFNIRl9NSVBTX0dQUkVMIGZsYWcgYnkgbmFtZTsgdGhlcmUgaGFzIHRvIGJlCi0gICBhIGJldHRlciB3YXkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci17Ci0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfUkVHSU5GTwotICAgICAgJiYgaGRyLT5zaF9zaXplID4gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBidWZbNF07Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfc2l6ZSA9PSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+Y29udGVudHMgPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIGhkci0+c2hfb2Zmc2V0ICsgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSAtIDQsCi0JCSAgICBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgZWxmX2dwIChhYmZkKSwgYnVmKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgKGJmZF9zaXplX3R5cGUpIDEsIChiZmRfc2l6ZV90eXBlKSA0LCBhYmZkKSAhPSA0KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TCi0gICAgICAmJiBoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICAvKiBXZSBzdG9yZWQgdGhlIHNlY3Rpb24gY29udGVudHMgaW4gdGhlIGVsZl9zZWN0aW9uX2RhdGEgdGRhdGEKLQkgZmllbGQgaW4gdGhlIHNldF9zZWN0aW9uX2NvbnRlbnRzIHJvdXRpbmUuICBXZSBzYXZlIHRoZQotCSBzZWN0aW9uIGNvbnRlbnRzIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByZWFkIHRoZW0gYWdhaW4uCi0JIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IGVsZl9ncCBpcyBzZXQsIHNvIHdlIGNhbiBsb29rCi0JIHRocm91Z2ggdGhlIHNlY3Rpb24gY29udGVudHMgdG8gc2VlIGlmIHRoZXJlIGlzIGFuCi0JIE9ES19SRUdJTkZPIHN0cnVjdHVyZS4gICovCi0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YTsKLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChBQklfNjRfUCAoYWJmZCkgJiYgaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCi0JICAgIHsKLQkgICAgICBiZmRfYnl0ZSBidWZbOF07Ci0KLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCQkgICAgKGhkci0+c2hfb2Zmc2V0Ci0JCQkgICAgICsgKGwgLSBjb250ZW50cykKLQkJCSAgICAgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKQotCQkJICAgICArIChzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pIC0gOCkpLAotCQkJICAgICBTRUVLX1NFVCkgPT0gLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBiZmRfaF9wdXRfNjQgKGFiZmQsIGVsZl9ncCAoYWJmZCksIGJ1Zik7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA4LCBhYmZkKSAhPSA4KQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgYnVmWzRdOwotCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkJICAgIChoZHItPnNoX29mZnNldAotCQkJICAgICArIChsIC0gY29udGVudHMpCi0JCQkgICAgICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykKLQkJCSAgICAgKyAoc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSAtIDQpKSwKLQkJCSAgICAgU0VFS19TRVQpID09IC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBlbGZfZ3AgKGFiZmQpLCBidWYpOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICB9Ci0KLSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24pOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCSAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwCi0JICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMCkKLQl7Ci0JICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQyB8IFNIRl9NSVBTX0dQUkVMOwotCSAgaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5jb21wYWN0X3JlbCIpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyA9IDA7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJ0cHJvYyIpID09IDApCi0JewotCSAgaWYgKGhkci0+c2hfYWRkcmFsaWduICE9IDAgJiYgaGRyLT5zaF9lbnRzaXplID09IDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYWRqdXN0OwotCi0JICAgICAgYWRqdXN0ID0gaGRyLT5zaF9zaXplICUgaGRyLT5zaF9hZGRyYWxpZ247Ci0JICAgICAgaWYgKGFkanVzdCAhPSAwKQotCQloZHItPnNoX3NpemUgKz0gaGRyLT5zaF9hZGRyYWxpZ24gLSBhZGp1c3Q7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBNSVBTIEVMRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZQotICAgb3RoZXIgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQKLSAgIHRvZ2V0aGVyLCBhbmQgdGhlbiByZWZlcmVuY2VkIHZpYSB0aGUgZ3AgcG9pbnRlciwgd2hpY2ggeWllbGRzCi0gICBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzIGlzIHdoYXQgd2UgdXNlIGZvciB0aGUgc21hbGwgY29tbW9uCi0gICBzZWN0aW9uLiAgVGhpcyBhcHByb2FjaCBpcyBjb3BpZWQgZnJvbSBlY29mZi5jLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBtaXBzX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBtaXBzX2VsZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptaXBzX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIE1JUFMgRUxGIGFsc28gdXNlcyBhbiBhY29tbW9uIHNlY3Rpb24sIHdoaWNoIHJlcHJlc2VudHMgYW4KLSAgIGFsbG9jYXRlZCBjb21tb24gc3ltYm9sIHdoaWNoIG1heSBiZSBvdmVycmlkZGVuIGJ5IGEKLSAgIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgbGlicmFyeS4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCi0vKiBUaGUgSXJpeCA1IHN1cHBvcnQgdXNlcyB0d28gdmlydHVhbCBzZWN0aW9ucywgd2hpY2ggcmVwcmVzZW50Ci0gICB0ZXh0L2RhdGEgc3ltYm9scyBkZWZpbmVkIGluIGR5bmFtaWMgb2JqZWN0cy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfdGV4dF9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyOwotCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfZGF0YV9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyOwotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgTUlQUyBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLgotICAgVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotdm9pZAotX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0gIHN3aXRjaCAoZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9NSVBTX0FDT01NT046Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlIGZpbGUuCi0JIEl0IGlzIGFuIGFsbG9jYXRlZCBjb21tb24gc2VjdGlvbi4gIFRoZSBkeW5hbWljIGxpbmtlciBjYW4KLQkgZWl0aGVyIHJlc29sdmUgdGhlc2Ugc3ltYm9scyB0byBzb21ldGhpbmcgaW4gYSBzaGFyZWQKLQkgbGlicmFyeSwgb3IgaXQgY2FuIGp1c3QgbGVhdmUgdGhlbSBoZXJlLiAgRm9yIG91ciBwdXJwb3NlcywKLQkgd2UgY2FuIGNvbnNpZGVyIHRoZXNlIHN5bWJvbHMgdG8gYmUgaW4gYSBuZXcgc2VjdGlvbi4gICovCi0gICAgICBpZiAobWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBhY29tbW9uIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPSAiLmFjb21tb24iOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0FMTE9DOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9hY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2wubmFtZSA9ICIuYWNvbW1vbiI7Ci0JICBtaXBzX2VsZl9hY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX2Fjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gdGhlIEdQIHNpemUgYXJlIGF1dG9tYXRpY2FsbHkKLQkgdHJlYXRlZCBhcyBTSE5fTUlQU19TQ09NTU9OIHN5bWJvbHMgb24gSVJJWDUuICAqLwotICAgICAgaWYgKGFzeW0tPnZhbHVlID4gZWxmX2dwX3NpemUgKGFiZmQpCi0JICB8fCBJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2KQotCWJyZWFrOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIFNITl9NSVBTX1NDT01NT046Ci0gICAgICBpZiAobWlwc19lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX3Njb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2wubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19TVU5ERUZJTkVEOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotI2lmIDAgLyogZm9yIFNHSV9DT01QQVQgKi8KLSAgICBjYXNlIFNITl9NSVBTX1RFWFQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19EQVRBOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IG1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0KLX0KLQwKLS8qIFdoZW4gY3JlYXRpbmcgYW4gSXJpeCA1IGV4ZWN1dGFibGUsIHdlIG5lZWQgUkVHSU5GTyBhbmQgUlRQUk9DCi0gICBzZWdtZW50cy4gICovCi0KLWludAotX2JmZF9taXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgaW50IHJldCA9IDA7Ci0KLSAgaWYgKCFTR0lfQ09NUEFUIChhYmZkKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZWUgaWYgd2UgbmVlZCBhIFBUX01JUFNfUkVHSU5GTyBzZWdtZW50LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlZ2luZm8iKTsKLSAgaWYgKHMgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpKQotICAgICsrcmV0OwotCi0gIC8qIFNlZSBpZiB3ZSBuZWVkIGEgUFRfTUlQU19PUFRJT05TIHNlZ21lbnQuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NgotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIAotCQkJCSAgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGFiZmQpKSkKLSAgICArK3JldDsKLQotICAvKiBTZWUgaWYgd2UgbmVlZCBhIFBUX01JUFNfUlRQUk9DIHNlZ21lbnQuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NQotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpCi0gICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5tZGVidWciKSkKLSAgICArK3JldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBNb2RpZnkgdGhlIHNlZ21lbnQgbWFwIGZvciBhbiBJcml4IDUgZXhlY3V0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOwotCi0gIGlmICghIFNHSV9DT01QQVQgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGlzIGEgLnJlZ2luZm8gc2VjdGlvbiwgd2UgbmVlZCBhIFBUX01JUFNfUkVHSU5GTwotICAgICBzZWdtZW50LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlZ2luZm8iKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQlpZiAobS0+cF90eXBlID09IFBUX01JUFNfUkVHSU5GTykKLQkgIGJyZWFrOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQl7Ci0JICBtID0gKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICptKTsKLQkgIGlmIChtID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgbS0+cF90eXBlID0gUFRfTUlQU19SRUdJTkZPOwotCSAgbS0+Y291bnQgPSAxOwotCSAgbS0+c2VjdGlvbnNbMF0gPSBzOwotCi0JICAvKiBXZSB3YW50IHRvIHB1dCBpdCBhZnRlciB0aGUgUEhEUiBhbmQgSU5URVJQIHNlZ21lbnRzLiAgKi8KLQkgIHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOwotCSAgd2hpbGUgKCpwbSAhPSBOVUxMCi0JCSAmJiAoKCpwbSktPnBfdHlwZSA9PSBQVF9QSERSCi0JCSAgICAgfHwgKCpwbSktPnBfdHlwZSA9PSBQVF9JTlRFUlApKQotCSAgICBwbSA9ICYoKnBtKS0+bmV4dDsKLQotCSAgbS0+bmV4dCA9ICpwbTsKLQkgICpwbSA9IG07Ci0JfQotICAgIH0KLQotICAvKiBGb3IgSVJJWCA2LCB3ZSBkb24ndCBoYXZlIC5tZGVidWcgc2VjdGlvbnMsIG5vciBkb2VzIGFueXRoaW5nIGJ1dAotICAgICAuZHluYW1pYyBlbmQgdXAgaW4gUFRfRFlOQU1JQy4gIEhvd2V2ZXIsIHdlIGRvIGhhdmUgdG8gaW5zZXJ0IGEKLSAgICAgUFRfT1BUSU9OUyBzZWdlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHByb2dyYW0gaGVhZGVyCi0gICAgIHRhYmxlLiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQlpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUykKLQkgIGJyZWFrOwotCi0gICAgICBpZiAocykKLQl7Ci0JICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICpvcHRpb25zX3NlZ21lbnQ7Ci0KLQkgIC8qIFVzdWFsbHksIHRoZXJlJ3MgYSBwcm9ncmFtIGhlYWRlciB0YWJsZS4gIEJ1dCwgc29tZXRpbWVzCi0JICAgICB0aGVyZSdzIG5vdCAobGlrZSB3aGVuIHJ1bm5pbmcgdGhlIGBsZCcgdGVzdHN1aXRlKS4gIFNvLAotCSAgICAgaWYgdGhlcmUncyBubyBwcm9ncmFtIGhlYWRlciB0YWJsZSwgd2UganVzdCBwdXQgdGhlCi0JICAgICBvcHRpb25zIHNlZ2VtZW50IGF0IHRoZSBlbmQuICAqLwotCSAgZm9yIChwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgCi0JICAgICAgICpwbSAhPSBOVUxMOwotCSAgICAgICBwbSA9ICYoKnBtKS0+bmV4dCkKLQkgICAgaWYgKCgqcG0pLT5wX3R5cGUgPT0gUFRfUEhEUikKLQkgICAgICBicmVhazsKLQotCSAgb3B0aW9uc19zZWdtZW50ID0gYmZkX3phbGxvYyAoYWJmZCwgCi0JCQkJCXNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpOwotCSAgb3B0aW9uc19zZWdtZW50LT5uZXh0ID0gKnBtOwotCSAgb3B0aW9uc19zZWdtZW50LT5wX3R5cGUgPSBQVF9NSVBTX09QVElPTlM7Ci0JICBvcHRpb25zX3NlZ21lbnQtPnBfZmxhZ3MgPSBQRl9SOwotCSAgb3B0aW9uc19zZWdtZW50LT5wX2ZsYWdzX3ZhbGlkID0gdHJ1ZTsKLQkgIG9wdGlvbnNfc2VnbWVudC0+Y291bnQgPSAxOwotCSAgb3B0aW9uc19zZWdtZW50LT5zZWN0aW9uc1swXSA9IHM7Ci0JICAqcG0gPSBvcHRpb25zX3NlZ21lbnQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGFyZSAuZHluYW1pYyBhbmQgLm1kZWJ1ZyBzZWN0aW9ucywgd2UgbWFrZSBhIHJvb20KLQkgZm9yIHRoZSBSVFBST0MgaGVhZGVyLiAgRklYTUU6IFJld3JpdGUgd2l0aG91dCBzZWN0aW9uIG5hbWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKSA9PSBOVUxMCi0JICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikgIT0gTlVMTAotCSAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIikgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLQkgICAgaWYgKG0tPnBfdHlwZSA9PSBQVF9NSVBTX1JUUFJPQykKLQkgICAgICBicmVhazsKLQkgIGlmIChtID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtID0gKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICptKTsKLQkgICAgICBpZiAobSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBtLT5wX3R5cGUgPSBQVF9NSVBTX1JUUFJPQzsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLQkgICAgICBpZiAocyA9PSBOVUxMKQotCQl7Ci0JCSAgbS0+Y291bnQgPSAwOwotCQkgIG0tPnBfZmxhZ3MgPSAwOwotCQkgIG0tPnBfZmxhZ3NfdmFsaWQgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbS0+Y291bnQgPSAxOwotCQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQkJfQotCi0JICAgICAgLyogV2Ugd2FudCB0byBwdXQgaXQgYWZ0ZXIgdGhlIERZTkFNSUMgc2VnbWVudC4gICovCi0JICAgICAgcG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7Ci0JICAgICAgd2hpbGUgKCpwbSAhPSBOVUxMICYmICgqcG0pLT5wX3R5cGUgIT0gUFRfRFlOQU1JQykKLQkJcG0gPSAmKCpwbSktPm5leHQ7Ci0JICAgICAgaWYgKCpwbSAhPSBOVUxMKQotCQlwbSA9ICYoKnBtKS0+bmV4dDsKLQotCSAgICAgIG0tPm5leHQgPSAqcG07Ci0JICAgICAgKnBtID0gbTsKLQkgICAgfQotCX0KLQotICAgICAgLyogT24gSXJpeCA1LCB0aGUgUFRfRFlOQU1JQyBzZWdtZW50IGluY2x1ZGVzIHRoZSAuZHluYW1pYywKLQkgLmR5bnN0ciwgLmR5bnN5bSwgYW5kIC5oYXNoIHNlY3Rpb25zLCBhbmQgZXZlcnl0aGluZyBpbgotCSBiZXR3ZWVuLiAgKi8KLSAgICAgIGZvciAocG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7ICpwbSAhPSBOVUxMOyBwbSA9ICYoKnBtKS0+bmV4dCkKLQlpZiAoKCpwbSktPnBfdHlwZSA9PSBQVF9EWU5BTUlDKQotCSAgYnJlYWs7Ci0gICAgICBtID0gKnBtOwotICAgICAgaWYgKG0gIT0gTlVMTAotCSAgJiYgbS0+Y291bnQgPT0gMQotCSAgJiYgc3RyY21wIChtLT5zZWN0aW9uc1swXS0+bmFtZSwgIi5keW5hbWljIikgPT0gMCkKLQl7Ci0JICBzdGF0aWMgY29uc3QgY2hhciAqc2VjX25hbWVzW10gPQotCSAgeyAiLmR5bmFtaWMiLCAiLmR5bnN0ciIsICIuZHluc3ltIiwgIi5oYXNoIiB9OwotCSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0JICB1bnNpZ25lZCBpbnQgaSwgYzsKLQkgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm47Ci0KLQkgIGxvdyA9IDB4ZmZmZmZmZmY7Ci0JICBoaWdoID0gMDsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Ygc2VjX25hbWVzIC8gc2l6ZW9mIHNlY19uYW1lc1swXTsgaSsrKQotCSAgICB7Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzZWNfbmFtZXNbaV0pOwotCSAgICAgIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXsKLQkJICBiZmRfc2l6ZV90eXBlIHN6OwotCi0JCSAgaWYgKGxvdyA+IHMtPnZtYSkKLQkJICAgIGxvdyA9IHMtPnZtYTsKLQkJICBzeiA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBpZiAoc3ogPT0gMCkKLQkJICAgIHN6ID0gcy0+X3Jhd19zaXplOwotCQkgIGlmIChoaWdoIDwgcy0+dm1hICsgc3opCi0JCSAgICBoaWdoID0gcy0+dm1hICsgc3o7Ci0JCX0KLQkgICAgfQotCi0JICBjID0gMDsKLQkgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCSAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkJJiYgcy0+dm1hID49IGxvdwotCQkmJiAoKHMtPnZtYQotCQkgICAgICsgKHMtPl9jb29rZWRfc2l6ZSAhPSAwID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKSkKLQkJICAgIDw9IGhpZ2gpKQotCSAgICAgICsrYzsKLQotCSAgbiA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKm4gKyAoYyAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKm4gPSAqbTsKLQkgIG4tPmNvdW50ID0gYzsKLQotCSAgaSA9IDA7Ci0JICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCQkgICYmIHMtPnZtYSA+PSBsb3cKLQkJICAmJiAoKHMtPnZtYQotCQkgICAgICAgKyAocy0+X2Nvb2tlZF9zaXplICE9IDAgPwotCQkJICBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpKQotCQkgICAgICA8PSBoaWdoKSkKLQkJewotCQkgIG4tPnNlY3Rpb25zW2ldID0gczsKLQkJICArK2k7Ci0JCX0KLQkgICAgfQotCi0JICAqcG0gPSBuOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGUgc3RydWN0dXJlIG9mIHRoZSBydW50aW1lIHByb2NlZHVyZSBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgdGhlCi0gICBsb2FkZXIgZm9yIHVzZSBieSB0aGUgc3RhdGljIGV4Y2VwdGlvbiBzeXN0ZW0uICAqLwotCi10eXBlZGVmIHN0cnVjdCBydW50aW1lX3BkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBzdGFydCBvZiBwcm9jZWR1cmUgKi8KLQlsb25nCXJlZ21hc2s7CS8qIHNhdmUgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJcmVnb2Zmc2V0OwkvKiBzYXZlIHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJlZ21hc2s7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJZnJlZ29mZnNldDsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyYW1lb2Zmc2V0OwkvKiBmcmFtZSBzaXplICovCi0Jc2hvcnQJZnJhbWVyZWc7CS8qIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgKi8KLQlzaG9ydAlwY3JlZzsJCS8qIG9mZnNldCBvciByZWcgb2YgcmV0dXJuIHBjICovCi0JbG9uZwlpcnBzczsJCS8qIGluZGV4IGludG8gdGhlIHJ1bnRpbWUgc3RyaW5nIHRhYmxlICovCi0JbG9uZwlyZXNlcnZlZDsKLQlzdHJ1Y3QgZXhjZXB0aW9uX2luZm8gKmV4Y2VwdGlvbl9pbmZvOy8qIHBvaW50ZXIgdG8gZXhjZXB0aW9uIGFycmF5ICovCi19IFJQRFIsICpwUlBEUjsKLSNkZWZpbmUgY2JSUERSIHNpemVvZihSUERSKQotI2RlZmluZSBycGROaWwgKChwUlBEUikgMCkKLQotLyogU3dhcCBSUERSIChydW50aW1lIHByb2NlZHVyZSB0YWJsZSBlbnRyeSkgZm9yIG91dHB1dC4gICovCi0KLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcnBkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IFJQRFIgKiwgc3RydWN0IHJwZHJfZXh0ICopKTsKLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcnBkcl9vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBSUERSICppbjsKLSAgICAgc3RydWN0IHJwZHJfZXh0ICpleDsKLXsKLSAgLyogZWNvZmZfcHV0X29mZiB3YXMgZGVmaW5lZCBpbiBlY29mZnN3YXAuaC4gICovCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGluLT5hZHIsIChiZmRfYnl0ZSAqKSBleC0+cF9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5yZWdtYXNrLCAoYmZkX2J5dGUgKikgZXgtPnBfcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnJlZ29mZnNldCwgKGJmZF9ieXRlICopIGV4LT5wX3JlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmZyZWdtYXNrLCAoYmZkX2J5dGUgKikgZXgtPnBfZnJlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5mcmVnb2Zmc2V0LCAoYmZkX2J5dGUgKikgZXgtPnBfZnJlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmZyYW1lb2Zmc2V0LCAoYmZkX2J5dGUgKikgZXgtPnBfZnJhbWVvZmZzZXQpOwotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPmZyYW1lcmVnLCAoYmZkX2J5dGUgKikgZXgtPnBfZnJhbWVyZWcpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT5wY3JlZywgKGJmZF9ieXRlICopIGV4LT5wX3BjcmVnKTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5pcnBzcywgKGJmZF9ieXRlICopIGV4LT5wX2lycHNzKTsKLSNpZiAwIC8qIEZJWE1FICovCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGluLT5leGNlcHRpb25faW5mbywgKGJmZF9ieXRlICopIGV4LT5wX2V4Y2VwdGlvbl9pbmZvKTsKLSNlbmRpZgotfQotDAotLyogUmVhZCBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIC5tZGVidWcgc2VjdGlvbiBpbnRvIGEKLSAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIHNlY3Rpb24sIGRlYnVnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci17Ci0gIEhEUlIgKnN5bWhkcjsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIGNoYXIgKmV4dF9oZHIgPSBOVUxMOwotCi0gIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIG1lbXNldCAoZGVidWcsIDAsIHNpemVvZigqZGVidWcpKTsKLQotICBleHRfaGRyID0gKGNoYXIgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpOwotICBpZiAoZXh0X2hkciA9PSBOVUxMICYmIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgZXh0X2hkciwgKGZpbGVfcHRyKSAwLAotCQkJCXN3YXAtPmV4dGVybmFsX2hkcl9zaXplKQotICAgICAgPT0gZmFsc2UpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gICgqc3dhcC0+c3dhcF9oZHJfaW4pIChhYmZkLCBleHRfaGRyLCBzeW1oZHIpOwotCi0gIC8qIFRoZSBzeW1ib2xpYyBoZWFkZXIgY29udGFpbnMgYWJzb2x1dGUgZmlsZSBvZmZzZXRzIGFuZCBzaXplcyB0bwotICAgICByZWFkLiAgKi8KLSNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCi0gICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAotICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIHN5bWhkci0+b2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAlcCi0JICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCi0JCQlhYmZkKSAhPSBzaXplICogc3ltaGRyLT5jb3VudCkpCQkJXAotCWdvdG8gZXJyb3JfcmV0dXJuOwkJCQkJCVwKLSAgICB9Ci0KLSAgUkVBRCAobGluZSwgY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksIHVuc2lnbmVkIGNoYXIgKik7Ci0gIFJFQUQgKGV4dGVybmFsX2RuciwgY2JEbk9mZnNldCwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfb3B0LCBjYk9wdE9mZnNldCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JdW5pb24gYXV4X2V4dCAqKTsKLSAgUkVBRCAoc3MsIGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKLSAgUkVBRCAoc3NleHQsIGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZXh0LCBjYkV4dE9mZnNldCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsIFBUUik7Ci0jdW5kZWYgUkVBRAotCi0gIGRlYnVnLT5mZHIgPSBOVUxMOwotICBkZWJ1Zy0+YWRqdXN0ID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGV4dF9oZHIgIT0gTlVMTCkKLSAgICBmcmVlIChleHRfaGRyKTsKLSAgaWYgKGRlYnVnLT5saW5lICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmxpbmUpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2RuciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9kbnIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3N5bSAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9zeW0pOwotICBpZiAoZGVidWctPmV4dGVybmFsX29wdCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9vcHQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOwotICBpZiAoZGVidWctPnNzICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzKTsKLSAgaWYgKGRlYnVnLT5zc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5zc2V4dCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Zkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3JmZCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIE1JUFMgRUxGIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICckJywgbm90ICdMJy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJyQnKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE9uIElyaXggNiwgdGhlIGxhYmVscyBnbyBiYWNrIHRvIHN0YXJ0aW5nIHdpdGggJy4nLCBzbyB3ZSBhY2NlcHQKLSAgICAgdGhlIGdlbmVyaWMgRUxGIGxvY2FsIGxhYmVsIHN5bnRheCBhcyB3ZWxsLiAgKi8KLSAgcmV0dXJuIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0vKiBNSVBTIEVMRiB1c2VzIGEgc3BlY2lhbCBmaW5kX25lYXJlc3RfbGluZSByb3V0aW5lIGluIG9yZGVyIHRoZQotICAgaGFuZGxlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lCi17Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGQ7Ci0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgaTsKLX07Ci0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAotCQkJCSBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYXNlY3Rpb24gKm1zZWM7Ci0KLSAgaWYgKF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0cikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0ciwgCi0JCQkJICAgICBBQklfNjRfUCAoYWJmZCkgPyA4IDogMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpOwotICBpZiAobXNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIG9yaWdmbGFnczsKLSAgICAgIHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKmZpOwotICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBzd2FwID0KLQlnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBjYWxsZWQgZHVyaW5nIGEgbGluaywgbWlwc19lbGZfZmluYWxfbGluayBtYXkgaGF2ZQotCSBjbGVhcmVkIHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZpZWxkLiAgV2UgZm9yY2UgaXQgYmFjayBvbiBoZXJlCi0JIGlmIGFwcHJvcHJpYXRlICh3aGljaCBpdCBub3JtYWxseSB3aWxsIGJlKS4gICovCi0gICAgICBvcmlnZmxhZ3MgPSBtc2VjLT5mbGFnczsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChtc2VjKS0+dGhpc19oZHIuc2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCW1zZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgIGZpID0gZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm87Ci0gICAgICBpZiAoZmkgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOwotCSAgY2hhciAqZnJhd19zcmM7Ci0JICBjaGFyICpmcmF3X2VuZDsKLQkgIHN0cnVjdCBmZHIgKmZkcl9wdHI7Ci0KLQkgIGZpID0gKChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSkpKTsKLQkgIGlmIChmaSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBtc2VjLCAmZmktPmQpKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFN3YXAgaW4gdGhlIEZEUiBpbmZvcm1hdGlvbi4gICovCi0JICBmaS0+ZC5mZHIgPSAoKHN0cnVjdCBmZHIgKikKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgIChmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICoKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBmZHIpKSkpOwotCSAgaWYgKGZpLT5kLmZkciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBleHRlcm5hbF9mZHJfc2l6ZSA9IHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotCSAgZmRyX3B0ciA9IGZpLT5kLmZkcjsKLQkgIGZyYXdfc3JjID0gKGNoYXIgKikgZmktPmQuZXh0ZXJuYWxfZmRyOwotCSAgZnJhd19lbmQgPSAoZnJhd19zcmMKLQkJICAgICAgKyBmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICogZXh0ZXJuYWxfZmRyX3NpemUpOwotCSAgZm9yICg7IGZyYXdfc3JjIDwgZnJhd19lbmQ7IGZyYXdfc3JjICs9IGV4dGVybmFsX2Zkcl9zaXplLCBmZHJfcHRyKyspCi0JICAgICgqc3dhcC0+c3dhcF9mZHJfaW4pIChhYmZkLCAoUFRSKSBmcmF3X3NyYywgZmRyX3B0cik7Ci0KLQkgIGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID0gZmk7Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gZXZlciBmcmVlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgZmluZF9uZWFyZXN0X2xpbmUgaXMgZWl0aGVyIGNhbGxlZCBhbGwgdGhlIHRpbWUsIGFzIGluCi0gICAgICAgICAgICAgb2JqZHVtcCAtbCwgc28gdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBzYXZlZCwgb3IgaXQgaXMKLSAgICAgICAgICAgICByYXJlbHkgY2FsbGVkLCBhcyBpbiBsZCBlcnJvciBtZXNzYWdlcywgc28gdGhlIG1lbW9yeQotICAgICAgICAgICAgIHdhc3RlZCBpcyB1bmltcG9ydGFudC4gIFN0aWxsLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBhCi0gICAgICAgICAgICAgZ29vZCBpZGVhIGZvciBmcmVlX2NhY2hlZF9pbmZvIHRvIHRocm93IGl0IGF3YXkuICAqLwotCX0KLQotICAgICAgaWYgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgJmZpLT5kLCBzd2FwLAotCQkJCSAgJmZpLT5pLCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICBsaW5lX3B0cikpCi0JewotCSAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotICAgIH0KLQotICAvKiBGYWxsIGJhY2sgb24gdGhlIGdlbmVyaWMgRUxGIGZpbmRfbmVhcmVzdF9saW5lIHJvdXRpbmUuICAqLwotCi0gIHJldHVybiBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIpOwotfQotDAotICAvKiBUaGUgbWlwczE2IGNvbXBpbGVyIHVzZXMgYSBjb3VwbGUgb2Ygc3BlY2lhbCBzZWN0aW9ucyB0byBoYW5kbGUKLSAgICAgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzLgotCi0gICAgIFNlY3Rpb24gbmFtZXMgdGhhdCBsb29rIGxpa2UgLm1pcHMxNi5mbi5GTk5BTUUgY29udGFpbiBzdHVicyB0aGF0Ci0gICAgIGNvcHkgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGZyb20gdGhlIGZwIHJlZ3MgdG8gdGhlIGdwIHJlZ3MgYW5kCi0gICAgIHRoZW4ganVtcCB0byBGTk5BTUUuICBJZiBhbnkgMzIgYml0IGZ1bmN0aW9uIGNhbGxzIEZOTkFNRSwgdGhlCi0gICAgIGNhbGwgc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIHN0dWIgaW5zdGVhZC4gIElmIG5vIDMyIGJpdAotICAgICBmdW5jdGlvbiBjYWxscyBGTk5BTUUsIHRoZSBzdHViIHNob3VsZCBiZSBkaXNjYXJkZWQuICBXZSBuZWVkIHRvCi0gICAgIGNvbnNpZGVyIGFueSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uLCBub3QganVzdCBhIGNhbGwsIGJlY2F1c2UKLSAgICAgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGlzIHRha2VuIHdlIHdpbGwgbmVlZCB0aGUgc3R1YiwKLSAgICAgc2luY2UgdGhlIGFkZHJlc3MgbWlnaHQgYmUgcGFzc2VkIHRvIGEgMzIgYml0IGZ1bmN0aW9uLgotCi0gICAgIFNlY3Rpb24gbmFtZXMgdGhhdCBsb29rIGxpa2UgLm1pcHMxNi5jYWxsLkZOTkFNRSBjb250YWluIHN0dWJzCi0gICAgIHRoYXQgY29weSBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgZnJvbSB0aGUgZ3AgcmVncyB0byB0aGUgZnAKLSAgICAgcmVncyBhbmQgdGhlbiBqdW1wIHRvIEZOTkFNRS4gIElmIEZOTkFNRSBpcyBhIDMyIGJpdCBmdW5jdGlvbiwKLSAgICAgdGhlbiBhbnkgMTYgYml0IGZ1bmN0aW9uIHRoYXQgY2FsbHMgRk5OQU1FIHNob3VsZCBiZSByZWRpcmVjdGVkCi0gICAgIHRvIHRoZSBzdHViIGluc3RlYWQuICBJZiBGTk5BTUUgaXMgbm90IGEgMzIgYml0IGZ1bmN0aW9uLCB0aGUKLSAgICAgc3R1YiBzaG91bGQgYmUgZGlzY2FyZGVkLgotCi0gICAgIC5taXBzMTYuY2FsbC5mcC5GTk5BTUUgc2VjdGlvbnMgYXJlIHNpbWlsYXIsIGJ1dCBjb250YWluIHN0dWJzCi0gICAgIHdoaWNoIGNhbGwgRk5OQU1FIGFuZCB0aGVuIGNvcHkgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBmcCByZWdzCi0gICAgIHRvIHRoZSBncCByZWdzLiAgVGhlc2Ugc3R1YnMgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSBpbiAkMTggd2hpbGUKLSAgICAgY2FsbGluZyBGTk5BTUU7IGFueSBmdW5jdGlvbiB3aGljaCBtaWdodCBjYWxsIG9uZSBvZiB0aGVzZSBzdHVicwotICAgICBtdXN0IGFycmFuZ2UgdG8gc2F2ZSAkMTggYXJvdW5kIHRoZSBjYWxsLiAgKFRoaXMgY2FzZSBpcyBub3QKLSAgICAgbmVlZGVkIGZvciAzMiBiaXQgZnVuY3Rpb25zIHRoYXQgY2FsbCAxNiBiaXQgZnVuY3Rpb25zLCBiZWNhdXNlCi0gICAgIDE2IGJpdCBmdW5jdGlvbnMgYWx3YXlzIHJldHVybiBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gYm90aAotICAgICAkZjAvJGYxIGFuZCAkMi8kMy4pCi0KLSAgICAgTm90ZSB0aGF0IGluIGFsbCBjYXNlcyBGTk5BTUUgbWlnaHQgYmUgZGVmaW5lZCBzdGF0aWNhbGx5LgotICAgICBUaGVyZWZvcmUsIEZOTkFNRSBpcyBub3QgdXNlZCBsaXRlcmFsbHkuICBJbnN0ZWFkLCB0aGUgcmVsb2NhdGlvbgotICAgICBpbmZvcm1hdGlvbiB3aWxsIGluZGljYXRlIHdoaWNoIHN5bWJvbCB0aGUgc2VjdGlvbiBpcyBmb3IuCi0KLSAgICAgV2UgcmVjb3JkIGFueSBzdHVicyB0aGF0IHdlIGZpbmQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLSNkZWZpbmUgRk5fU1RVQiAiLm1pcHMxNi5mbi4iCi0jZGVmaW5lIENBTExfU1RVQiAiLm1pcHMxNi5jYWxsLiIKLSNkZWZpbmUgQ0FMTF9GUF9TVFVCICIubWlwczE2LmNhbGwuZnAuIgotCi0vKiBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSNpZiAwCi0gIC8qIFdlIG5vIGxvbmdlciB1c2UgdGhpcy4gICovCi0gIC8qIFN0cmluZyBzZWN0aW9uIGluZGljZXMgZm9yIHRoZSBkeW5hbWljIHNlY3Rpb24gc3ltYm9scy4gICovCi0gIGJmZF9zaXplX3R5cGUgZHluc3ltX3NlY19zdHJpbmRleFtTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVNdOwotI2VuZGlmCi0gIC8qIFRoZSBudW1iZXIgb2YgLnJ0cHJvYyBlbnRyaWVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBwcm9jZWR1cmVfY291bnQ7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSAuY29tcGFjdF9yZWwgc2VjdGlvbiAoaWYgU0dJX0NPTVBBVCkuICAqLwotICBiZmRfc2l6ZV90eXBlIGNvbXBhY3RfcmVsX3NpemU7Ci0gIC8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgRFRfTUlQU19STERfTUFQIGR5bmFtaWMKLSAgICAgZW50cnkgaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIF9fcmxkX29ial9oZWFkIGFzIGluIElyaXggNS4gKi8KLSAgYm9vbGVhbiB1c2VfcmxkX29ial9oZWFkOwotICAvKiBUaGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgX19ybGRfbWFwIG9yIF9fcmxkX29ial9oZWFkIHN5bWJvbC4gICovCi0gIGJmZF92bWEgcmxkX3ZhbHVlOwotICAvKiBUaGlzIGlzIHNldCBpZiB3ZSBzZWUgYW55IG1pcHMxNiBzdHViIHNlY3Rpb25zLiAqLwotICBib29sZWFuIG1pcHMxNl9zdHVic19zZWVuOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBtaXBzX2VsZl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9vdXRwdXRfZXh0c3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1taXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIG1lbXNldCAoJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIChFWFRSKSk7Ci0gICAgICAvKiBXZSB1c2UgLTIgYXMgYSBtYXJrZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5mb3JtYXRpb24gaGFzCi0JIG5vdCBiZWVuIHNldC4gIC0xIG1lYW5zIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgaWZkLiAgKi8KLSAgICAgIHJldC0+ZXN5bS5pZmQgPSAtMjsKLSAgICAgIHJldC0+cG9zc2libHlfZHluYW1pY19yZWxvY3MgPSAwOwotICAgICAgcmV0LT5taW5fZHluX3JlbG9jX2luZGV4ID0gMDsKLSAgICAgIHJldC0+Zm5fc3R1YiA9IE5VTEw7Ci0gICAgICByZXQtPm5lZWRfZm5fc3R1YiA9IGZhbHNlOwotICAgICAgcmV0LT5jYWxsX3N0dWIgPSBOVUxMOwotICAgICAgcmV0LT5jYWxsX2ZwX3N0dWIgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgbWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWYgMAotICAvKiBXZSBubyBsb25nZXIgdXNlIHRoaXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTOyBpKyspCi0gICAgcmV0LT5keW5zeW1fc2VjX3N0cmluZGV4W2ldID0gKGJmZF9zaXplX3R5cGUpIC0xOwotI2VuZGlmCi0gIHJldC0+cHJvY2VkdXJlX2NvdW50ID0gMDsKLSAgcmV0LT5jb21wYWN0X3JlbF9zaXplID0gMDsKLSAgcmV0LT51c2VfcmxkX29ial9oZWFkID0gZmFsc2U7Ci0gIHJldC0+cmxkX3ZhbHVlID0gMDsKLSAgcmV0LT5taXBzMTZfc3R1YnNfc2VlbiA9IGZhbHNlOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSBtdXN0IGhhbmRsZSB0aGUgc3BlY2lhbCBNSVBTIHNlY3Rpb24gbnVtYmVycyBoZXJlLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChTR0lfQ09NUEFUIChhYmZkKQotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgc3RyY21wICgqbmFtZXAsICJfcmxkX25ld19pbnRlcmZhY2UiKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFNraXAgSXJpeCA1IHJsZCBlbnRyeSBuYW1lLiAgKi8KLSAgICAgICpuYW1lcCA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc3dpdGNoIChzeW0tPnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gdGhlIEdQIHNpemUgYXJlIGF1dG9tYXRpY2FsbHkKLQkgdHJlYXRlZCBhcyBTSE5fTUlQU19TQ09NTU9OIHN5bWJvbHMuICAqLwotICAgICAgaWYgKHN5bS0+c3Rfc2l6ZSA+IGVsZl9ncF9zaXplIChhYmZkKQotCSAgfHwgSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NikKLQlicmVhazsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBTSE5fTUlQU19TQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2NvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX1RFWFQ6Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIHNoYXJlZCBvYmplY3QuICAqLwotICAgICAgaWYgKG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzZWN0aW9uLiAgKi8KLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5uYW1lID0gIi50ZXh0IjsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9IE5VTEw7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sX3B0cjsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLm5hbWUgPSAiLnRleHQiOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU0gfCBCU0ZfRFlOQU1JQzsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0ciA9ICZtaXBzX2VsZl90ZXh0X3NlY3Rpb247Ci0JfQotICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gZG8gKnNlY3AgPSBiZmRfdW5kX3NlY3Rpb25fcHRyIGlmCi0gICAgICAgICBpbmZvLT5zaGFyZWQuICBJIGRvbid0IGtub3cgd2h5LCBhbmQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UsCi0gICAgICAgICBzbyBJIHRvb2sgaXQgb3V0LiAgKi8KLSAgICAgICpzZWNwID0gbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19BQ09NTU9OOgotICAgICAgLyogRmFsbCB0aHJvdWdoLiBYWFggQ2FuIHdlIHRyZWF0IHRoaXMgYXMgYWxsb2NhdGVkIGRhdGE/ICAqLwotICAgIGNhc2UgU0hOX01JUFNfREFUQToKLSAgICAgIC8qIFRoaXMgc2VjdGlvbiBpcyB1c2VkIGluIGEgc2hhcmVkIG9iamVjdC4gICovCi0gICAgICBpZiAobWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0ciA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLm5hbWUgPSAiLmRhdGEiOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLmZsYWdzID0gU0VDX05PX0ZMQUdTOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gTlVMTDsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wubmFtZSA9ICIuZGF0YSI7Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTSB8IEJTRl9EWU5BTUlDOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wuc2VjdGlvbiA9ICZtaXBzX2VsZl9kYXRhX3NlY3Rpb247Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbF9wdHIgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyID0gJm1pcHNfZWxmX2RhdGFfc2VjdGlvbjsKLQl9Ci0gICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBkbyAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHIgaWYKLSAgICAgICAgIGluZm8tPnNoYXJlZC4gIEkgZG9uJ3Qga25vdyB3aHksIGFuZCB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSwKLSAgICAgICAgIHNvIEkgdG9vayBpdCBvdXQuICAqLwotICAgICAgKnNlY3AgPSBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX1NVTkRFRklORUQ6Ci0gICAgICAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpCi0gICAgICAmJiAhIGluZm8tPnNoYXJlZAotICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjCi0gICAgICAmJiBzdHJjbXAgKCpuYW1lcCwgIl9fcmxkX29ial9oZWFkIikgPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogTWFyayBfX3JsZF9vYmpfaGVhZCBhcyBkeW5hbWljLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgYWJmZCwgKm5hbWVwLCBCU0ZfR0xPQkFMLCAqc2VjcCwKLQkgICAgICAoYmZkX3ZtYSkgKnZhbHAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbWlwczE2IHRleHQgc3ltYm9sLCBhZGQgMSB0byB0aGUgdmFsdWUgdG8gbWFrZSBpdAotICAgICBvZGQuICBUaGlzIHdpbGwgY2F1c2Ugc29tZXRoaW5nIGxpa2UgLndvcmQgU1lNIHRvIGNvbWUgdXAgd2l0aAotICAgICB0aGUgcmlnaHQgdmFsdWUgd2hlbiBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMuICAqLwotICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2KQotICAgICsrKnZhbHA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gbWlwc19lbGZfb3V0cHV0X2V4dHN5bS4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHdyaXRlIG91dCBFQ09GRiBkZWJ1Z2dpbmcgZXh0ZXJuYWwgc3ltYm9sCi0gICBpbmZvcm1hdGlvbi4gIEl0IGlzIGNhbGxlZCB2aWEgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgVGhlCi0gICBFQ09GRiBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gbXVzdCBtYXRjaCB0aGUgRUxGIGV4dGVybmFsCi0gICBzeW1ib2wgaW5mb3JtYXRpb24uICBVbmZvcnR1bmF0ZWx5LCBhdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cKLSAgIHdoZXRoZXIgYSBzeW1ib2wgaXMgcmVxdWlyZWQgYnkgcmVsb2MgaW5mb3JtYXRpb24sIHNvIHRoZSB0d28KLSAgIHRhYmxlcyBtYXkgd2luZCB1cCBiZWluZyBkaWZmZXJlbnQuICBXZSBtdXN0IHNvcnQgb3V0IHRoZSBleHRlcm5hbAotICAgc3ltYm9sIGluZm9ybWF0aW9uIGJlZm9yZSB3ZSBjYW4gc2V0IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAubWRlYnVnCi0gICBzZWN0aW9uLCBhbmQgd2UgbXVzdCBzZXQgdGhlIHNpemUgb2YgdGhlIC5tZGVidWcgc2VjdGlvbiBiZWZvcmUgd2UKLSAgIGNhbiByZWxvY2F0ZSBhbnkgc2VjdGlvbnMsIGFuZCB3ZSBjYW4ndCBrbm93IHdoaWNoIHN5bWJvbHMgYXJlCi0gICByZXF1aXJlZCBieSByZWxvY2F0aW9uIHVudGlsIHdlIHJlbG9jYXRlIHRoZSBzZWN0aW9ucy4KLSAgIEZvcnR1bmF0ZWx5LCBpdCBpcyByZWxhdGl2ZWx5IHVubGlrZWx5IHRoYXQgYW55IHN5bWJvbCB3aWxsIGJlCi0gICBzdHJpcHBlZCBidXQgcmVxdWlyZWQgYnkgYSByZWxvYy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBub3QgaGFwcGVuCi0gICB3aGVuIGdlbmVyYXRpbmcgYSBmaW5hbCBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX291dHB1dF9leHRzeW0gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOwotICBib29sZWFuIHN0cmlwOwotICBhc2VjdGlvbiAqc2VjLCAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgaWYgKGgtPnJvb3QuaW5keCA9PSAtMikKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmICgoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgfHwgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApCi0JICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UgaWYgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgICB8fCAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChlaW5mby0+aW5mby0+a2VlcF9oYXNoLAotCQkJCSAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgaWYgKHN0cmlwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5lc3ltLmlmZCA9PSAtMikKLSAgICB7Ci0gICAgICBoLT5lc3ltLmptcHRibCA9IDA7Ci0gICAgICBoLT5lc3ltLmNvYm9sX21haW4gPSAwOwotICAgICAgaC0+ZXN5bS53ZWFrZXh0ID0gMDsKLSAgICAgIGgtPmVzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5pZmQgPSBpZmROaWw7Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RHbG9iYWw7Ci0KLSAgICAgIGlmIChTR0lfQ09NUEFUIChlaW5mby0+YWJmZCkKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAvKiBVc2UgdW5kZWZpbmVkIGNsYXNzLiAgQWxzbywgc2V0IGNsYXNzIGFuZCB0eXBlIGZvciBzb21lCi0gICAgICAgICAgICAgc3BlY2lhbCBzeW1ib2xzLiAgKi8KLQkgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzBdKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzFdKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0TGFiZWw7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzJdKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKLQkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPQotCQltaXBzX2VsZl9oYXNoX3RhYmxlIChlaW5mby0+aW5mbyktPnByb2NlZHVyZV9jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2dwX2Rpc3AiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKLQkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBlbGZfZ3AgKGVpbmZvLT5hYmZkKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgc3ltYm9sIGggaXMgdGhlIG9uZSBmcm9tCi0JICAgICB0aGUgYW5vdGhlciBzaGFyZWQgbGlicmFyeSwgT1VUUFVUX1NFQ1RJT04gbWF5IGJlIG51bGwuICAqLwotCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJvZGF0YSIpID09IDAKLQkJICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOwotCSAgICAgIGVsc2UKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGgtPmVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKLSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICBlbHNlIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIGVsc2UKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNldCB0eXBlIGFuZCB2YWx1ZSBmb3IgYSBzeW1ib2wgd2l0aCBhIGZ1bmN0aW9uIHN0dWIuICAqLwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RQcm9jOwotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QucGx0Lm9mZnNldAotCQkJCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0JfQotI2lmIDAgLyogRklYTUU/ICAqLwotICAgICAgaC0+ZXN5bS5pZmQgPSAwOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGVpbmZvLT5hYmZkLCBlaW5mby0+ZGVidWcsIGVpbmZvLT5zd2FwLAotCQkJCSAgICAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCQkgICAgICAmaC0+ZXN5bSkpCi0gICAgewotICAgICAgZWluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBydW50aW1lIHByb2NlZHVyZSB0YWJsZSBmcm9tIHRoZSAubWRlYnVnIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAoaGFuZGxlLCBhYmZkLCBpbmZvLCBzLCBkZWJ1ZykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIEhEUlIgKmhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBSUERSICpycGRyLCAqcnA7Ci0gIHN0cnVjdCBycGRyX2V4dCAqZXJwOwotICBQVFIgcnRwcm9jOwotICBzdHJ1Y3QgcGRyX2V4dCAqZXBkcjsKLSAgc3RydWN0IHN5bV9leHQgKmVzeW07Ci0gIGNoYXIgKnNzLCAqKnN2OwotICBjaGFyICpzdHI7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY291bnQ7Ci0gIHVuc2lnbmVkIGxvbmcgc2luZGV4OwotICB1bnNpZ25lZCBsb25nIGk7Ci0gIFBEUiBwZHI7Ci0gIFNZTVIgc3ltOwotICBjb25zdCBjaGFyICpub19uYW1lX2Z1bmMgPSBfKCJzdGF0aWMgcHJvY2VkdXJlIChubyBuYW1lKSIpOwotCi0gIGVwZHIgPSBOVUxMOwotICBycGRyID0gTlVMTDsKLSAgZXN5bSA9IE5VTEw7Ci0gIHNzID0gTlVMTDsKLSAgc3YgPSBOVUxMOwotCi0gIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgc2luZGV4ID0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKLSAgY291bnQgPSBoZHItPmlwZE1heDsKLSAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBzaXplID0gc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLSAgICAgIGVwZHIgPSAoc3RydWN0IHBkcl9leHQgKikgYmZkX21hbGxvYyAoc2l6ZSAqIGNvdW50KTsKLSAgICAgIGlmIChlcGRyID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciAoaGFuZGxlLCAoUFRSKSBlcGRyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2l6ZSA9IHNpemVvZiAoUlBEUik7Ci0gICAgICBycCA9IHJwZHIgPSAoUlBEUiAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOwotICAgICAgaWYgKHJwZHIgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc3YgPSAoY2hhciAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChjaGFyICopICogY291bnQpOwotICAgICAgaWYgKHN2ID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNvdW50ID0gaGRyLT5pc3ltTWF4OwotICAgICAgc2l6ZSA9IHN3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotICAgICAgZXN5bSA9IChzdHJ1Y3Qgc3ltX2V4dCAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOwotICAgICAgaWYgKGVzeW0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKCEgX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIChoYW5kbGUsIChQVFIpIGVzeW0pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBjb3VudCA9IGhkci0+aXNzTWF4OwotICAgICAgc3MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChjb3VudCk7Ci0gICAgICBpZiAoc3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIChoYW5kbGUsIChQVFIpIHNzKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgY291bnQgPSBoZHItPmlwZE1heDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBycCsrKQotCXsKLQkgICgqc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSAoZXBkciArIGkpLCAmcGRyKTsKLQkgICgqc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCAoUFRSKSAmZXN5bVtwZHIuaXN5bV0sICZzeW0pOwotCSAgcnAtPmFkciA9IHN5bS52YWx1ZTsKLQkgIHJwLT5yZWdtYXNrID0gcGRyLnJlZ21hc2s7Ci0JICBycC0+cmVnb2Zmc2V0ID0gcGRyLnJlZ29mZnNldDsKLQkgIHJwLT5mcmVnbWFzayA9IHBkci5mcmVnbWFzazsKLQkgIHJwLT5mcmVnb2Zmc2V0ID0gcGRyLmZyZWdvZmZzZXQ7Ci0JICBycC0+ZnJhbWVvZmZzZXQgPSBwZHIuZnJhbWVvZmZzZXQ7Ci0JICBycC0+ZnJhbWVyZWcgPSBwZHIuZnJhbWVyZWc7Ci0JICBycC0+cGNyZWcgPSBwZHIucGNyZWc7Ci0JICBycC0+aXJwc3MgPSBzaW5kZXg7Ci0JICBzdltpXSA9IHNzICsgc3ltLmlzczsKLQkgIHNpbmRleCArPSBzdHJsZW4gKHN2W2ldKSArIDE7Ci0JfQotICAgIH0KLQotICBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMikgKyBzaW5kZXg7Ci0gIHNpemUgPSBCRkRfQUxJR04gKHNpemUsIDE2KTsKLSAgcnRwcm9jID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKHJ0cHJvYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSAwOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSBjb3VudCArIDI7Ci0KLSAgZXJwID0gKHN0cnVjdCBycGRyX2V4dCAqKSBydHByb2M7Ci0gIG1lbXNldCAoZXJwLCAwLCBzaXplb2YgKHN0cnVjdCBycGRyX2V4dCkpOwotICBlcnArKzsKLSAgc3RyID0gKGNoYXIgKikgcnRwcm9jICsgc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMik7Ci0gIHN0cmNweSAoc3RyLCBub19uYW1lX2Z1bmMpOwotICBzdHIgKz0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgZWNvZmZfc3dhcF9ycGRyX291dCAoYWJmZCwgcnBkciArIGksIGVycCArIGkpOwotICAgICAgc3RyY3B5IChzdHIsIHN2W2ldKTsKLSAgICAgIHN0ciArPSBzdHJsZW4gKHN2W2ldKSArIDE7Ci0gICAgfQotICBlY29mZl9wdXRfb2ZmIChhYmZkLCAoYmZkX3ZtYSkgLTEsIChiZmRfYnl0ZSAqKSAoZXJwICsgY291bnQpLT5wX2Fkcik7Ci0KLSAgLyogU2V0IHRoZSBzaXplIGFuZCBjb250ZW50cyBvZiAucnRwcm9jIHNlY3Rpb24uICAqLwotICBzLT5fcmF3X3NpemUgPSBzaXplOwotICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBydHByb2M7Ci0KLSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLSAgcy0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0gIGlmIChlcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZXBkcik7Ci0gIGlmIChycGRyICE9IE5VTEwpCi0gICAgZnJlZSAocnBkcik7Ci0gIGlmIChlc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZXN5bSk7Ci0gIGlmIChzcyAhPSBOVUxMKQotICAgIGZyZWUgKHNzKTsKLSAgaWYgKHN2ICE9IE5VTEwpCi0gICAgZnJlZSAoc3YpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXBkciAhPSBOVUxMKQotICAgIGZyZWUgKGVwZHIpOwotICBpZiAocnBkciAhPSBOVUxMKQotICAgIGZyZWUgKHJwZHIpOwotICBpZiAoZXN5bSAhPSBOVUxMKQotICAgIGZyZWUgKGVzeW0pOwotICBpZiAoc3MgIT0gTlVMTCkKLSAgICBmcmVlIChzcyk7Ci0gIGlmIChzdiAhPSBOVUxMKQotICAgIGZyZWUgKHN2KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBIGNvbXBhcmlzb24gcm91dGluZSB1c2VkIHRvIHNvcnQgLmdwdGFiIGVudHJpZXMuICAqLwotCi1zdGF0aWMgaW50Ci1ncHRhYl9jb21wYXJlIChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBFbGYzMl9ncHRhYiAqYTEgPSAoY29uc3QgRWxmMzJfZ3B0YWIgKikgcDE7Ci0gIGNvbnN0IEVsZjMyX2dwdGFiICphMiA9IChjb25zdCBFbGYzMl9ncHRhYiAqKSBwMjsKLQotICByZXR1cm4gYTEtPmd0X2VudHJ5Lmd0X2dfdmFsdWUgLSBhMi0+Z3RfZW50cnkuZ3RfZ192YWx1ZTsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsIGxpbmsgcm91dGluZSB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIGFuZAotICAgdGhlIC5tZGVidWcgc2VjdGlvbnMuICBXZSBuZWVkIHRvIG1lcmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlc2UKLSAgIHNlY3Rpb25zIHRvZ2V0aGVyLCBub3Qgd3JpdGUgdGhlbSBhbGwgb3V0IHNlcXVlbnRpYWxseS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKipzZWNwcDsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKnJlZ2luZm9fc2VjLCAqbWRlYnVnX3NlYywgKmdwdGFiX2RhdGFfc2VjLCAqZ3B0YWJfYnNzX3NlYzsKLSAgYXNlY3Rpb24gKnJ0cHJvY19zZWM7Ci0gIEVsZjMyX1JlZ0luZm8gcmVnaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy5zeW1ib2xpY19oZWFkZXI7Ci0gIFBUUiBtZGVidWdfaGFuZGxlID0gTlVMTDsKLQotICAvKiBJZiBhbGwgdGhlIHRoaW5ncyB3ZSBsaW5rZWQgdG9nZXRoZXIgd2VyZSBQSUMsIGJ1dCB3ZSdyZQotICAgICBwcm9kdWNpbmcgYW4gZXhlY3V0YWJsZSAocmF0aGVyIHRoYW4gYSBzaGFyZWQgb2JqZWN0KSwgdGhlbiB0aGUKLSAgICAgcmVzdWx0aW5nIGZpbGUgaXMgQ1BJQyAoaS5lLiwgaXQgY2FsbHMgUElDIGNvZGUuKSAgKi8KLSAgaWYgKCFpbmZvLT5zaGFyZWQKLSAgICAgICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19QSUMpCi0gICAgewotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfkVGX01JUFNfUElDOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfTUlQU19DUElDOwotICAgIH0KLQotICAvKiBXZSdkIGNhcmVmdWxseSBhcnJhbmdlZCB0aGUgZHluYW1pYyBzeW1ib2wgaW5kaWNlcywgYW5kIHRoZW4gdGhlCi0gICAgIGdlbmVyaWMgc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJlbnVtYmVyZWQgdGhlbSBvdXQgZnJvbSB1bmRlciB1cy4KLSAgICAgUmF0aGVyIHRoYW4gdHJ5aW5nIHNvbWVob3cgdG8gcHJldmVudCB0aGUgcmVudW1iZXJpbmcsIGp1c3QgZG8KLSAgICAgdGhlIHNvcnQgYWdhaW4uICAqLwotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYmZkICpkeW5vYmo7Ci0gICAgICBhc2VjdGlvbiAqZ290OwotICAgICAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgICAgIC8qIFdoZW4gd2UgcmVzb3J0LCB3ZSBtdXN0IHRlbGwgbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIHdoYXQKLQkgdGhlIGxvd2VzdCBpbmRleCBpdCBtYXkgdXNlIGlzLiAgVGhhdCdzIHRoZSBudW1iZXIgb2Ygc2VjdGlvbgotCSBzeW1ib2xzIHdlJ3JlIGdvaW5nIHRvIGFkZC4gIFRoZSBnZW5lcmljIEVMRiBsaW5rZXIgb25seQotCSBhZGRzIHRoZXNlIHN5bWJvbHMgd2hlbiBidWlsZGluZyBhIHNoYXJlZCBvYmplY3QuICBOb3RlIHRoYXQKLQkgd2UgY291bnQgdGhlIHNlY3Rpb25zIGFmdGVyIChwb3NzaWJseSkgcmVtb3ZpbmcgdGhlIC5vcHRpb25zCi0JIHNlY3Rpb24gYWJvdmUuICAqLwotICAgICAgaWYgKCFtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGUgKGluZm8sIChpbmZvLT5zaGFyZWQgCi0JCQkJCSAgICA/IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgKyAxCi0JCQkJCSAgICA6IDEpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgZGlkbid0IGdyb3cgdGhlIGdsb2JhbCAuZ290IHJlZ2lvbi4gICovCi0gICAgICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgICAgIGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKGdvdCktPnRkYXRhOwotCi0gICAgICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSAhPSBOVUxMKQotCUJGRF9BU1NFUlQgKChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50Ci0JCSAgICAgLSBnLT5nbG9iYWxfZ290c3ltLT5keW5pbmR4KQotCQkgICAgPD0gZy0+Z2xvYmFsX2dvdG5vKTsKLSAgICB9Ci0KLSAgLyogT24gSVJJWDUsIHdlIG9taXQgdGhlIC5vcHRpb25zIHNlY3Rpb24uICBPbiBJUklYNiwgaG93ZXZlciwgd2UKLSAgICAgaW5jbHVkZSBpdCwgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgcHJvY2VzcyBpdCBxdWl0ZSByaWdodC4gIChTb21lCi0gICAgIGVudHJpZXMgYXJlIHN1cHBvc2VkIHRvIGJlIG1lcmdlZC4pICBFbXBpcmljYWxseSwgd2Ugc2VlbSB0byBiZQotICAgICBiZXR0ZXIgb2ZmIGluY2x1ZGluZyBpdCB0aGVuIG5vdC4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg1KQotICAgIGZvciAoc2VjcHAgPSAmYWJmZC0+c2VjdGlvbnM7ICpzZWNwcCAhPSBOVUxMOyBzZWNwcCA9ICYoKnNlY3BwKS0+bmV4dCkKLSAgICAgIHsKLQlpZiAoc3RyY21wICgoKnNlY3BwKS0+bmFtZSwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSAwKQotCSAgewotCSAgICBmb3IgKHAgPSAoKnNlY3BwKS0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQlwLT51LmluZGlyZWN0LnNlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICAoKnNlY3BwKS0+bGlua19vcmRlcl9oZWFkID0gTlVMTDsKLQkgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgIC0tYWJmZC0+c2VjdGlvbl9jb3VudDsKLQkgICAgCi0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotCi0gIC8qIEdldCBhIHZhbHVlIGZvciB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBpZiAoZWxmX2dwIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVsZl9ncCAoYWJmZCkgPSAoaC0+dS5kZWYudmFsdWUKLQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGJmZF92bWEgbG87Ci0KLQkgIC8qIEZpbmQgdGhlIEdQLXJlbGF0aXZlIHNlY3Rpb24gd2l0aCB0aGUgbG93ZXN0IG9mZnNldC4gICovCi0JICBsbyA9IChiZmRfdm1hKSAtMTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgaWYgKG8tPnZtYSA8IGxvIAotCQkmJiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLnNoX2ZsYWdzICYgU0hGX01JUFNfR1BSRUwpKQotCSAgICAgIGxvID0gby0+dm1hOwotCi0JICAvKiBBbmQgY2FsY3VsYXRlIEdQIHJlbGF0aXZlIHRvIHRoYXQuICAqLwotCSAgZWxmX2dwIChhYmZkKSA9IGxvICsgRUxGX01JUFNfR1BfT0ZGU0VUIChhYmZkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSWYgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSByZWxvYwotCSAgICAgaW52b2x2aW5nIHRoZSBHUCB2YWx1ZSwgaXQgc2hvdWxkIG1ha2UgYSByZWxvY19kYW5nZXJvdXMKLQkgICAgIGNhbGxiYWNrIHRvIHdhcm4gdGhhdCBHUCBpcyBub3QgZGVmaW5lZC4gICovCi0JfQotICAgIH0KLQotICAvKiBHbyB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY29sbGVjdCB0aGUgLnJlZ2luZm8gYW5kIC5tZGVidWcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICByZWdpbmZvX3NlYyA9IE5VTEw7Ci0gIG1kZWJ1Z19zZWMgPSBOVUxMOwotICBncHRhYl9kYXRhX3NlYyA9IE5VTEw7Ci0gIGdwdGFiX2Jzc19zZWMgPSBOVUxMOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5yZWdpbmZvIikgPT0gMCkKLQl7Ci0JICBtZW1zZXQgKCZyZWdpbmZvLCAwLCBzaXplb2YgcmVnaW5mbyk7Ci0KLQkgIC8qIFdlIGhhdmUgZm91bmQgdGhlIC5yZWdpbmZvIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgotCSAgICAgTG9vayB0aHJvdWdoIGFsbCB0aGUgbGlua19vcmRlcnMgY29tcHJpc2luZyBpdCBhbmQgbWVyZ2UKLQkgICAgIHRoZSBpbmZvcm1hdGlvbiB0b2dldGhlci4gICovCi0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCSAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OwotCSAgICAgIEVsZjMyX1JlZ0luZm8gc3ViOwotCi0JICAgICAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCXsKLQkJICBpZiAocC0+dHlwZSA9PSBiZmRfZmlsbF9saW5rX29yZGVyKQotCQkgICAgY29udGludWU7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0JICAgICAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0KLQkgICAgICAvKiBUaGUgbGlua2VyIGVtdWxhdGlvbiBjb2RlIGhhcyBwcm9iYWJseSBjbG9iYmVyZWQgdGhlCi0gICAgICAgICAgICAgICAgIHNpemUgdG8gYmUgemVybyBieXRlcy4gICovCi0JICAgICAgaWYgKGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSA9PSAwKQotCQlpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIChQVFIpICZleHQsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkJICAgICAgc2l6ZW9mIGV4dCkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbiAoaW5wdXRfYmZkLCAmZXh0LCAmc3ViKTsKLQotCSAgICAgIHJlZ2luZm8ucmlfZ3BybWFzayB8PSBzdWIucmlfZ3BybWFzazsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gfD0gc3ViLnJpX2Nwcm1hc2tbMF07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzFdIHw9IHN1Yi5yaV9jcHJtYXNrWzFdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1syXSB8PSBzdWIucmlfY3BybWFza1syXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gfD0gc3ViLnJpX2Nwcm1hc2tbM107Ci0KLQkgICAgICAvKiByaV9ncF92YWx1ZSBpcyBzZXQgYnkgdGhlIGZ1bmN0aW9uCi0JCSBtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyB3aGVuIHRoZSBzZWN0aW9uIGlzCi0JCSBmaW5hbGx5IHdyaXR0ZW4gb3V0LiAgKi8KLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0JICAvKiBTaXplIGhhcyBiZWVuIHNldCBpbiBtaXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucyAgKi8KLQkgIEJGRF9BU1NFUlQoby0+X3Jhd19zaXplID09IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykpOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgcmVnaW5mb19zZWMgPSBvOwotCX0KLQotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5tZGVidWciKSA9PSAwKQotCXsKLQkgIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKLQkgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgdmVyc2lvbiBzdGFtcCBiZT8gICovCi0JICBzeW1oZHItPnZzdGFtcCA9IDA7Ci0JICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLQkgIHN5bWhkci0+Y2JMaW5lID0gMDsKLQkgIHN5bWhkci0+aWRuTWF4ID0gMDsKLQkgIHN5bWhkci0+aXBkTWF4ID0gMDsKLQkgIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0JICBzeW1oZHItPmlvcHRNYXggPSAwOwotCSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzTWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWZkTWF4ID0gMDsKLQkgIHN5bWhkci0+Y3JmZCA9IDA7Ci0JICBzeW1oZHItPmlleHRNYXggPSAwOwotCi0JICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZQotCSAgICAgZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCSAgZGVidWcubGluZSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9kbnIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcGRyID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9vcHQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLQkgIGRlYnVnLnNzID0gTlVMTDsKLQkgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9yZmQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0KLQkgIG1kZWJ1Z19oYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLQkgIGlmIChtZGVidWdfaGFuZGxlID09IChQVFIpIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0JICAgICAgRVhUUiBlc3ltOwotCSAgICAgIGJmZF92bWEgbGFzdDsKLQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQkgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVbXSA9Ci0JCXsgIi50ZXh0IiwgIi5pbml0IiwgIi5maW5pIiwgIi5kYXRhIiwKLQkJICAgICIucm9kYXRhIiwgIi5zZGF0YSIsICIuc2JzcyIsICIuYnNzIiB9OwotCSAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2NbXSA9IHsgc2NUZXh0LCBzY0luaXQsIHNjRmluaSwgc2NEYXRhLAotCQkJCQkgIHNjUkRhdGEsIHNjU0RhdGEsIHNjU0Jzcywgc2NCc3MgfTsKLQotCSAgICAgIGVzeW0uam1wdGJsID0gMDsKLQkgICAgICBlc3ltLmNvYm9sX21haW4gPSAwOwotCSAgICAgIGVzeW0ud2Vha2V4dCA9IDA7Ci0JICAgICAgZXN5bS5yZXNlcnZlZCA9IDA7Ci0JICAgICAgZXN5bS5pZmQgPSBpZmROaWw7Ci0JICAgICAgZXN5bS5hc3ltLmlzcyA9IGlzc05pbDsKLQkgICAgICBlc3ltLmFzeW0uc3QgPSBzdExvY2FsOwotCSAgICAgIGVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0JICAgICAgZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0JICAgICAgbGFzdCA9IDA7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJewotCQkgIGVzeW0uYXN5bS5zYyA9IHNjW2ldOwotCQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZVtpXSk7Ci0JCSAgaWYgKHMgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZXN5bS5hc3ltLnZhbHVlID0gcy0+dm1hOwotCQkgICAgICBsYXN0ID0gcy0+dm1hICsgcy0+X3Jhd19zaXplOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGVzeW0uYXN5bS52YWx1ZSA9IGxhc3Q7Ci0KLQkJICBpZiAoISBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChhYmZkLCAmZGVidWcsIHN3YXAsCi0JCQkJCQkgICAgICBuYW1lW2ldLCAmZXN5bSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCSAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwOwotCSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGlucHV0X2RlYnVnOwotCSAgICAgIGNoYXIgKmVyYXdfc3JjOwotCSAgICAgIGNoYXIgKmVyYXdfZW5kOwotCi0JICAgICAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCXsKLQkJICBpZiAocC0+dHlwZSA9PSBiZmRfZmlsbF9saW5rX29yZGVyKQotCQkgICAgY29udGludWU7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0JICAgICAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0KLQkgICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChpbnB1dF9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkJICB8fCAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGlucHV0X2JmZCkKLQkJICAgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKSA9PSBOVUxMKQotCQl7Ci0JCSAgLyogSSBkb24ndCBrbm93IHdoYXQgYSBub24gTUlQUyBFTEYgYmZkIHdvdWxkIGJlCi0JCSAgICAgZG9pbmcgd2l0aCBhIC5tZGVidWcgc2VjdGlvbiwgYnV0IEkgZG9uJ3QgcmVhbGx5Ci0JCSAgICAgd2FudCB0byBkZWFsIHdpdGggaXQuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zd2FwID0gKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCQkgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnNpemUgPT0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIFRoZSBFQ09GRiBsaW5raW5nIGNvZGUgZXhwZWN0cyB0aGF0IHdlIGhhdmUgYWxyZWFkeQotCQkgcmVhZCBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBzZXQgdXAgYW4KLQkJIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBzbyB3ZSBkbyB0aGF0IG5vdy4gICovCi0JICAgICAgaWYgKCEgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSAgICZpbnB1dF9kZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotCQkgICAgIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGlucHV0X2JmZCwKLQkJICAgICAgJmlucHV0X2RlYnVnLCBpbnB1dF9zd2FwLCBpbmZvKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIEZvciBlYWNoIG9uZSB3aXRoCi0JCSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiwgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbCBpbgotCQkgdGhlIGxpbmtlciBnbG9iYWwgaGFzaCB0YWJsZSBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24KLQkJIGZvciB0aGUgb3V0cHV0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotCSAgICAgIGVyYXdfc3JjID0gaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0OwotCSAgICAgIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JCQkgICsgKGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4Ci0JCQkgICAgICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpKTsKLQkgICAgICBmb3IgKDsKLQkJICAgZXJhd19zcmMgPCBlcmF3X2VuZDsKLQkJICAgZXJhd19zcmMgKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0JCXsKLQkJICBFWFRSIGV4dDsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJICAoKmlucHV0X3N3YXAtPnN3YXBfZXh0X2luKSAoaW5wdXRfYmZkLCAoUFRSKSBlcmF3X3NyYywgJmV4dCk7Ci0JCSAgaWYgKGV4dC5hc3ltLnNjID09IHNjTmlsCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgbmFtZSA9IGlucHV0X2RlYnVnLnNzZXh0ICsgZXh0LmFzeW0uaXNzOwotCQkgIGggPSBtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkgIGlmIChoID09IE5VTEwgfHwgaC0+ZXN5bS5pZmQgIT0gLTIpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChleHQuaWZkICE9IC0xKQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChleHQuaWZkCi0JCQkJICA8IGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZmRNYXgpOwotCQkgICAgICBleHQuaWZkID0gaW5wdXRfZGVidWcuaWZkbWFwW2V4dC5pZmRdOwotCQkgICAgfQotCi0JCSAgaC0+ZXN5bSA9IGV4dDsKLQkJfQotCi0JICAgICAgLyogRnJlZSB1cCB0aGUgaW5mb3JtYXRpb24gd2UganVzdCByZWFkLiAgKi8KLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5saW5lKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9kbnIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3Bkcik7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfc3ltKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9vcHQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2F1eCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuc3MpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzZXh0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9mZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3JmZCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0KTsKLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0JICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgLyogQ3JlYXRlIC5ydHByb2Mgc2VjdGlvbi4gICovCi0JICAgICAgcnRwcm9jX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJ0cHJvYyIpOwotCSAgICAgIGlmIChydHByb2Nfc2VjID09IE5VTEwpCi0JCXsKLQkJICBmbGFnd29yZCBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCQkJCSAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCB8IFNFQ19SRUFET05MWSk7Ci0KLQkJICBydHByb2Nfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5ydHByb2MiKTsKLQkJICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBydHByb2Nfc2VjLCBmbGFncykKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBydHByb2Nfc2VjLCA0KSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwKLQkJCQkJCSAgICAgaW5mbywgcnRwcm9jX3NlYywgJmRlYnVnKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCSAgZWluZm8uYWJmZCA9IGFiZmQ7Ci0JICBlaW5mby5pbmZvID0gaW5mbzsKLQkgIGVpbmZvLmRlYnVnID0gJmRlYnVnOwotCSAgZWluZm8uc3dhcCA9IHN3YXA7Ci0JICBlaW5mby5mYWlsZWQgPSBmYWxzZTsKLQkgIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgICAgIG1pcHNfZWxmX291dHB1dF9leHRzeW0sCi0JCQkJICAgICAgIChQVFIpICZlaW5mbyk7Ci0JICBpZiAoZWluZm8uZmFpbGVkKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgIG8tPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCAmZGVidWcsIHN3YXApOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgbWRlYnVnX3NlYyA9IG87Ci0JfQotCi0gICAgICBpZiAoc3RybmNtcCAoby0+bmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKLQl7Ci0JICBjb25zdCBjaGFyICpzdWJuYW1lOwotCSAgdW5zaWduZWQgaW50IGM7Ci0JICBFbGYzMl9ncHRhYiAqdGFiOwotCSAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKmV4dF90YWI7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgLyogVGhlIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3Mgc2VjdGlvbnMgaG9sZAotCSAgICAgaW5mb3JtYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIHNtYWxsIGRhdGEgYXJlYSB3b3VsZAotCSAgICAgY2hhbmdlIGRlcGVuZGluZyB1cG9uIHRoZSAtRyBzd2l0Y2guICBUaGVzZSBzZWN0aW9ucwotCSAgICAgbm90IHVzZWQgaW4gZXhlY3V0YWJsZXMgZmlsZXMuICAqLwotCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotCSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkJICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JCSAgIHAgPSBwLT5uZXh0KQotCQl7Ci0JCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0KLQkJICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJICAgIHsKLQkJICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJCWNvbnRpbnVlOwotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIH0KLQotCQkgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkJICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJICAgICBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCQkgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCQl9Ci0KLQkgICAgICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzCi0JCSBjdXJyZW50bHkgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgICAgICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgICAgICAvKiBSZWFsbHkgcmVtb3ZlIHRoZSBzZWN0aW9uLiAgKi8KLQkgICAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOwotCQkgICAqc2VjcHAgIT0gbzsKLQkJICAgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCi0JCTsKLQkgICAgICAqc2VjcHAgPSAoKnNlY3BwKS0+bmV4dDsKLQkgICAgICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBUaGVyZSBpcyBvbmUgZ3B0YWIgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCBvbmUgZm9yCi0JICAgICB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zZGF0YSIpID09IDApCi0JICAgIGdwdGFiX2RhdGFfc2VjID0gbzsKLQkgIGVsc2UgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zYnNzIikgPT0gMCkKLQkgICAgZ3B0YWJfYnNzX3NlYyA9IG87Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFRoZSBsaW5rZXIgc2NyaXB0IGFsd2F5cyBjb21iaW5lcyAuZ3B0YWIuZGF0YSBhbmQKLQkgICAgIC5ncHRhYi5zZGF0YSBpbnRvIC5ncHRhYi5zZGF0YSwgYW5kIGxpa2V3aXNlIGZvcgotCSAgICAgLmdwdGFiLmJzcyBhbmQgLmdwdGFiLnNic3MuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzCi0JICAgICBubyAuc2RhdGEgb3IgLnNic3Mgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGluIHdoaWNoCi0JICAgICBjYXNlIHdlIG11c3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAobyA9PSBncHRhYl9kYXRhX3NlYykKLQkJby0+bmFtZSA9ICIuZ3B0YWIuZGF0YSI7Ci0JICAgICAgZWxzZQotCQlvLT5uYW1lID0gIi5ncHRhYi5ic3MiOwotCSAgICAgIHN1Ym5hbWUgPSBvLT5uYW1lICsgc2l6ZW9mICIuZ3B0YWIiIC0gMTsKLQkgICAgICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3VibmFtZSkgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgLyogU2V0IHVwIHRoZSBmaXJzdCBlbnRyeS4gICovCi0JICBjID0gMTsKLQkgIHRhYiA9IChFbGYzMl9ncHRhYiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChFbGYzMl9ncHRhYikpOwotCSAgaWYgKHRhYiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X2N1cnJlbnRfZ192YWx1ZSA9IGVsZl9ncF9zaXplIChhYmZkKTsKLQkgIHRhYlswXS5ndF9oZWFkZXIuZ3RfdW51c2VkID0gMDsKLQotCSAgLyogQ29tYmluZSB0aGUgaW5wdXQgc2VjdGlvbnMuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBsYXN0OwotCSAgICAgIGJmZF9zaXplX3R5cGUgZ3BlbnRyeTsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogQ29tYmluZSB0aGUgZ3B0YWIgZW50cmllcyBmb3IgdGhpcyBpbnB1dCBzZWN0aW9uIG9uZQotCQkgYnkgb25lLiAgV2Uga25vdyB0aGF0IHRoZSBpbnB1dCBncHRhYiBlbnRyaWVzIGFyZQotCQkgc29ydGVkIGJ5IGFzY2VuZGluZyAtRyB2YWx1ZS4gICovCi0JICAgICAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0JICAgICAgbGFzdCA9IDA7Ci0JICAgICAgZm9yIChncGVudHJ5ID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0JCSAgIGdwZW50cnkgPCBzaXplOwotCQkgICBncGVudHJ5ICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKQotCQl7Ci0JCSAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgZXh0X2dwdGFiOwotCQkgIEVsZjMyX2dwdGFiIGludF9ncHRhYjsKLQkJICB1bnNpZ25lZCBsb25nIHZhbDsKLQkJICB1bnNpZ25lZCBsb25nIGFkZDsKLQkJICBib29sZWFuIGV4YWN0OwotCQkgIHVuc2lnbmVkIGludCBsb29rOwotCi0JCSAgaWYgKCEgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpICZleHRfZ3B0YWIsCi0JCQkgIGdwZW50cnksIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKSkpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKHRhYik7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4gKGlucHV0X2JmZCwgJmV4dF9ncHRhYiwKLQkJCQkJCSZpbnRfZ3B0YWIpOwotCQkgIHZhbCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9nX3ZhbHVlOwotCQkgIGFkZCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9ieXRlcyAtIGxhc3Q7Ci0KLQkJICBleGFjdCA9IGZhbHNlOwotCQkgIGZvciAobG9vayA9IDE7IGxvb2sgPCBjOyBsb29rKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA+PSB2YWwpCi0JCQl0YWJbbG9va10uZ3RfZW50cnkuZ3RfYnl0ZXMgKz0gYWRkOwotCi0JCSAgICAgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9PSB2YWwpCi0JCQlleGFjdCA9IHRydWU7Ci0JCSAgICB9Ci0KLQkJICBpZiAoISBleGFjdCkKLQkJICAgIHsKLQkJICAgICAgRWxmMzJfZ3B0YWIgKm5ld190YWI7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBtYXg7Ci0KLQkJICAgICAgLyogV2UgbmVlZCBhIG5ldyB0YWJsZSBlbnRyeS4gICovCi0JCSAgICAgIG5ld190YWIgPSAoKEVsZjMyX2dwdGFiICopCi0JCQkJIGJmZF9yZWFsbG9jICgoUFRSKSB0YWIsCi0JCQkJCSAgICAgIChjICsgMSkgKiBzaXplb2YgKEVsZjMyX2dwdGFiKSkpOwotCQkgICAgICBpZiAobmV3X3RhYiA9PSBOVUxMKQotCQkJewotCQkJICBmcmVlICh0YWIpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIHRhYiA9IG5ld190YWI7Ci0JCSAgICAgIHRhYltjXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID0gdmFsOwotCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfYnl0ZXMgPSBhZGQ7Ci0KLQkJICAgICAgLyogTWVyZ2UgaW4gdGhlIHNpemUgZm9yIHRoZSBuZXh0IHNtYWxsZXN0IC1HCi0JCQkgdmFsdWUsIHNpbmNlIHRoYXQgd2lsbCBiZSBpbXBsaWVkIGJ5IHRoaXMgbmV3Ci0JCQkgdmFsdWUuICAqLwotCQkgICAgICBtYXggPSAwOwotCQkgICAgICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQotCQkJewotCQkJICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPCB2YWwKLQkJCSAgICAgICYmIChtYXggPT0gMAotCQkJCSAgfHwgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlCi0JCQkJICAgICAgPiB0YWJbbWF4XS5ndF9lbnRyeS5ndF9nX3ZhbHVlKSkpCi0JCQkgICAgbWF4ID0gbG9vazsKLQkJCX0KLQkJICAgICAgaWYgKG1heCAhPSAwKQotCQkJdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzICs9Ci0JCQkgIHRhYlttYXhdLmd0X2VudHJ5Lmd0X2J5dGVzOwotCi0JCSAgICAgICsrYzsKLQkJICAgIH0KLQotCQkgIGxhc3QgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXM7Ci0JCX0KLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0JICAvKiBUaGUgdGFibGUgbXVzdCBiZSBzb3J0ZWQgYnkgLUcgdmFsdWUuICAqLwotCSAgaWYgKGMgPiAyKQotCSAgICBxc29ydCAodGFiICsgMSwgYyAtIDEsIHNpemVvZiAodGFiWzBdKSwgZ3B0YWJfY29tcGFyZSk7Ci0KLQkgIC8qIFN3YXAgb3V0IHRoZSB0YWJsZS4gICovCi0JICBleHRfdGFiID0gKChFbGYzMl9FeHRlcm5hbF9ncHRhYiAqKQotCQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgYyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKSk7Ci0JICBpZiAoZXh0X3RhYiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZSAodGFiKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQkgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIHRhYiArIGksIGV4dF90YWIgKyBpKTsKLQkgIGZyZWUgKHRhYik7Ci0KLQkgIG8tPl9yYXdfc2l6ZSA9IGMgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKTsKLQkgIG8tPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dF90YWI7Ci0KLQkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0JICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLwotICBpZiAoQUJJXzY0X1AgKGFiZmQpKQotICAgIHsKLSNpZmRlZiBCRkQ2NAotICAgICAgaWYgKCFiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZiAvKiBCRkQ2NCAqLwotICAgIH0KLSAgZWxzZSBpZiAoIWJmZF9lbGYzMl9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgdGhlIGNvbXB1dGVkIHNlY3Rpb25zLiAgKi8KLQotICBpZiAocmVnaW5mb19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0KLSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKGFiZmQsICZyZWdpbmZvLCAmZXh0KTsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcmVnaW5mb19zZWMsIChQVFIpICZleHQsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChtZGVidWdfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOwotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsCi0JCQkJCSAgICAgICBzd2FwLCBpbmZvLAotCQkJCQkgICAgICAgbWRlYnVnX3NlYy0+ZmlsZXBvcykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfZWNvZmZfZGVidWdfZnJlZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLSAgICB9Ci0KLSAgaWYgKGdwdGFiX2RhdGFfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfZGF0YV9zZWMsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBncHRhYl9kYXRhX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChncHRhYl9ic3Nfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfYnNzX3NlYywKLQkJCQkgICAgICBncHRhYl9ic3Nfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKLSAgICB7Ci0gICAgICBydHByb2Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnRwcm9jIik7Ci0gICAgICBpZiAocnRwcm9jX3NlYyAhPSBOVUxMKQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcnRwcm9jX3NlYywKLQkJCQkJICBydHByb2Nfc2VjLT5jb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsCi0JCQkJCSAgcnRwcm9jX3NlYy0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybnMgdGhlIEdPVCBzZWN0aW9uIGZvciBBQkZELiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1pcHNfZWxmX2dvdF9zZWN0aW9uIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKTsKLX0KLQotLyogUmV0dXJucyB0aGUgR09UIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluayBpbmRpY2F0ZWQgYnkKLSAgIElORk8uICBJZiBTR09UUCBpcyBub24tTlVMTCwgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIEdPVCAKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfZ290X2luZm8gKgotbWlwc19lbGZfZ290X2luZm8gKGFiZmQsIHNnb3RwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICoqc2dvdHA7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBzZ290ID0gbWlwc19lbGZfZ290X3NlY3Rpb24gKGFiZmQpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgaWYgKHNnb3RwKQotICAgICpzZ290cCA9IHNnb3Q7Ci0gIHJldHVybiBnOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHJlbG9jYXRpb24gaXMgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9sb2NhbF9yZWxvY2F0aW9uX3AgKGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NhdGlvbjsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0KLSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIGlmICghIGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotICAgIHJldHVybiByX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIHRhYmxlIGRvZXMgbm90IGZvbGxvdyB0aGUgcnVsZSB0aGF0IGxvY2FsIHN5bWJvbHMKLQkgbXVzdCBjb21lIGJlZm9yZSBnbG9iYWxzLiAgKi8KLSAgICAgIHJldHVybiBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF0gIT0gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIFNpZ24tZXh0ZW5kIFZBTFVFLCB3aGljaCBoYXMgdGhlIGluZGljYXRlZCBudW1iZXIgb2YgQklUUy4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9zaWduX2V4dGVuZCAodmFsdWUsIGJpdHMpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGludCBiaXRzOwotewotICBpZiAodmFsdWUgJiAoKGJmZF92bWEpMSA8PCAoYml0cyAtIDEpKSkKLSAgICAvKiBWQUxVRSBpcyBuZWdhdGl2ZS4gICovCi0gICAgdmFsdWUgfD0gKChiZmRfdm1hKSAtIDEpIDw8IGJpdHM7ICAgICAgCi0gIAotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFJldHVybiBub24temVybyBpZiB0aGUgaW5kaWNhdGVkIFZBTFVFIGhhcyBvdmVyZmxvd2VkIHRoZSBtYXhpbXVtCi0gICByYW5nZSBleHByZXNzYWJsZSBieSBhIHNpZ25lZCBudW1iZXIgd2l0aCB0aGUgaW5kaWNhdGVkIG51bWJlciBvZgotICAgQklUUy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgYml0cykKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci17Ci0gIGJmZF9zaWduZWRfdm1hIHN2YWx1ZSA9IChiZmRfc2lnbmVkX3ZtYSkgdmFsdWU7Ci0KLSAgaWYgKHN2YWx1ZSA+ICgxIDw8IChiaXRzIC0gMSkpIC0gMSkKLSAgICAvKiBUaGUgdmFsdWUgaXMgdG9vIGJpZy4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0gIGVsc2UgaWYgKHN2YWx1ZSA8IC0oMSA8PCAoYml0cyAtIDEpKSkKLSAgICAvKiBUaGUgdmFsdWUgaXMgdG9vIHNtYWxsLiAgKi8KLSAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgLyogQWxsIGlzIHdlbGwuICAqLwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgJWhpZ2ggZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfaGlnaCAodmFsdWUpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHJldHVybiAoKHZhbHVlICsgKGJmZF92bWEpIDB4ODAwMCkgPj4gMTYpICYgMHhmZmZmOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlICVoaWdoZXIgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfaGlnaGVyICh2YWx1ZSkKLSAgICAgYmZkX3ZtYSB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIHJldHVybiAoKHZhbHVlICsgKGJmZF92bWEpIDB4ODAwMDgwMDApID4+IDMyKSAmIDB4ZmZmZjsKLSNlbHNlCi0gIGFib3J0ICgpOwotICByZXR1cm4gKGJmZF92bWEpIC0xOwotI2VuZGlmCi19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgJWhpZ2hlc3QgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYSAKLW1pcHNfZWxmX2hpZ2hlc3QgKHZhbHVlKQotICAgICBiZmRfdm1hIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgQkZENjQKLSAgcmV0dXJuICgodmFsdWUgKyAoYmZkX3ZtYSkgMHg4MDAwODAwMDgwMDApID4+IDQ4KSAmIDB4ZmZmZjsKLSNlbHNlCi0gIGFib3J0ICgpOwotICByZXR1cm4gKGJmZF92bWEpIC0xOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybnMgdGhlIEdPVCBpbmRleCBmb3IgdGhlIGdsb2JhbCBzeW1ib2wgaW5kaWNhdGVkIGJ5IEguICAqLwotCi1zdGF0aWMgYmZkX3ZtYSAKLW1pcHNfZWxmX2dsb2JhbF9nb3RfaW5kZXggKGFiZmQsIGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZF92bWEgaW5kZXg7Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGFiZmQsICZzZ290KTsKLQotICAvKiBPbmNlIHdlIGRldGVybWluZSB0aGUgZ2xvYmFsIEdPVCBlbnRyeSB3aXRoIHRoZSBsb3dlc3QgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUgaW5kZXgsIHdlIG11c3QgcHV0IGFsbCBkeW5hbWljIHN5bWJvbHMgd2l0aCBncmVhdGVyCi0gICAgIGluZGljZXMgaW50byB0aGUgR09ULiAgVGhhdCBtYWtlcyBpdCBlYXN5IHRvIGNhbGN1bGF0ZSB0aGUgR09UCi0gICAgIG9mZnNldC4gICovCi0gIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggPj0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keCk7Ci0gIGluZGV4ID0gKChoLT5keW5pbmR4IC0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keCArIGctPmxvY2FsX2dvdG5vKSAKLQkgICAqIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSk7Ci0gIEJGRF9BU1NFUlQgKGluZGV4IDwgc2dvdC0+X3Jhd19zaXplKTsKLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIFJldHVybnMgdGhlIG9mZnNldCBmb3IgdGhlIGVudHJ5IGF0IHRoZSBJTkRFWHRoIHBvc2l0aW9uCi0gICBpbiB0aGUgR09ULiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleCAoZHlub2JqLCBvdXRwdXRfYmZkLCBpbmRleCkKLSAgICAgYmZkICpkeW5vYmo7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkX3ZtYSBpbmRleDsKLXsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGJmZF92bWEgZ3A7Ci0KLSAgc2dvdCA9IG1pcHNfZWxmX2dvdF9zZWN0aW9uIChkeW5vYmopOwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgcmV0dXJuIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2dvdC0+b3V0cHV0X29mZnNldCArIGluZGV4IC0gCi0JICBncCk7Ci19Ci0KLS8qIElmIEggaXMgYSBzeW1ib2wgdGhhdCBuZWVkcyBhIGdsb2JhbCBHT1QgZW50cnksIGJ1dCBoYXMgYSBkeW5hbWljCi0gICBzeW1ib2wgdGFibGUgaW5kZXggbG93ZXIgdGhhbiBhbnkgd2UndmUgc2VlbiB0byBkYXRlLCByZWNvcmQgaXQgZm9yCi0gICBwb3N0ZXJpdHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sIChoLCBpbmZvLCBnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEEgZ2xvYmFsIHN5bWJvbCBpbiB0aGUgR09UIG11c3QgYWxzbyBiZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wKLSAgICAgdGFibGUuICAqLwotICBpZiAoaC0+ZHluaW5keCA9PSAtMQotICAgICAgJiYgIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogSWYgd2UndmUgYWxyZWFkeSBtYXJrZWQgdGhpcyBlbnRyeSBhcyBuZWVkIEdPVCBzcGFjZSwgd2UgZG9uJ3QKLSAgICAgbmVlZCB0byBkbyBpdCBhZ2Fpbi4gICovCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtIDEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQnkgc2V0dGluZyB0aGlzIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiAtMSwgd2UgYXJlIGluZGljYXRpbmcgdGhhdAotICAgICB0aGVyZSBuZWVkcyB0byBiZSBhIEdPVCBlbnRyeSBmb3IgSC4gICovCi0gIGgtPmdvdC5vZmZzZXQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlX2Ygd2hlbiBzb3J0aW5nCi0gICB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgICAgCi1zdHJ1Y3QgbWlwc19lbGZfaGFzaF9zb3J0X2RhdGEKLXsKLSAgLyogVGhlIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIEdPVCB3aXRoIHRoZSBsb3dlc3QgZHluYW1pYyBzeW1ib2wgdGFibGUKLSAgICAgaW5kZXguICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbG93OwotICAvKiBUaGUgbGVhc3QgZHluYW1pYyBzeW1ib2wgdGFibGUgaW5kZXggY29ycmVzcG9uZGluZyB0byBhIHN5bWJvbAotICAgICB3aXRoIGEgR09UIGVudHJ5LiAgKi8KLSAgbG9uZyBtaW5fZ290X2R5bmluZHg7Ci0gIC8qIFRoZSBncmVhdGVzdCBkeW5hbWljIHN5bWJvbCB0YWJsZSBpbmRleCBub3QgY29ycmVzcG9uZGluZyB0byBhCi0gICAgIHN5bWJvbCB3aXRob3V0IGEgR09UIGVudHJ5LiAgKi8KLSAgbG9uZyBtYXhfbm9uX2dvdF9keW5pbmR4OwotfTsKLQotLyogSWYgSCBuZWVkcyBhIEdPVCBlbnRyeSwgYXNzaWduIGl0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBkeW5hbWljCi0gICBpbmRleC4gIE90aGVyd2lzZSwgYXNzaWduIGl0IHRoZSBsb3dlc3QgYXZhaWxhYmxlIGR5bmFtaWMgCi0gICBpbmRleC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9zb3J0X2hhc2hfdGFibGVfZiAoaCwgZGF0YSkKLSAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9oYXNoX3NvcnRfZGF0YSAqaHNkIAotICAgID0gKHN0cnVjdCBtaXBzX2VsZl9oYXNoX3NvcnRfZGF0YSAqKSBkYXRhOwotCi0gIC8qIFN5bWJvbHMgd2l0aG91dCBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzIGFyZW4ndCBpbnRlcmVzdGluZwotICAgICBhdCBhbGwuICAqLwotICBpZiAoaC0+cm9vdC5keW5pbmR4ID09IC0xKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5yb290LmdvdC5vZmZzZXQgIT0gMCkKLSAgICBoLT5yb290LmR5bmluZHggPSBoc2QtPm1heF9ub25fZ290X2R5bmluZHgrKzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGgtPnJvb3QuZHluaW5keCA9IC0taHNkLT5taW5fZ290X2R5bmluZHg7Ci0gICAgICBoc2QtPmxvdyA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU29ydCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgc28gdGhhdCBzeW1ib2xzIHRoYXQgbmVlZCBHT1QgZW50cmllcwotICAgYXBwZWFyIHRvd2FyZHMgdGhlIGVuZC4gIFRoaXMgcmVkdWNlcyB0aGUgYW1vdW50IG9mIEdPVCBzcGFjZQotICAgcmVxdWlyZWQuICBNQVhfTE9DQUwgaXMgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBsb2NhbCBzeW1ib2xzCi0gICBrbm93biB0byBiZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBEdXJpbmcKLSAgIG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucywgdGhpcyB2YWx1ZSBpcyAxLiAgQWZ0ZXJ3YXJkLCB0aGUKLSAgIHNlY3Rpb24gc3ltYm9scyBhcmUgYWRkZWQgYW5kIHRoZSBjb3VudCBpcyBoaWdoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIChpbmZvLCBtYXhfbG9jYWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIG1heF9sb2NhbDsKLXsKLSAgc3RydWN0IG1pcHNfZWxmX2hhc2hfc29ydF9kYXRhIGhzZDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGhzZC5sb3cgPSBOVUxMOwotICBoc2QubWluX2dvdF9keW5pbmR4ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLSAgaHNkLm1heF9ub25fZ290X2R5bmluZHggPSBtYXhfbG9jYWw7Ci0gIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopIAotCQkJCWVsZl9oYXNoX3RhYmxlIChpbmZvKSksIAotCQkJICAgICAgIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZV9mLCAKLQkJCSAgICAgICAmaHNkKTsKLQotICAvKiBUaGVyZSBzaG91ZCBoYXZlIGJlZW4gZW5vdWdoIHJvb20gaW4gdGhlIHN5bWJvbCB0YWJsZSB0bwotICAgICBhY2NvbW9kYXRlIGJvdGggdGhlIEdPVCBhbmQgbm9uLUdPVCBzeW1ib2xzLiAgKi8KLSAgQkZEX0FTU0VSVCAoaHNkLm1pbl9nb3RfZHluaW5keCA9PSBoc2QubWF4X25vbl9nb3RfZHluaW5keCk7Ci0KLSAgLyogTm93IHdlIGtub3cgd2hpY2ggZHluYW1pYyBzeW1ib2wgaGFzIHRoZSBsb3dlc3QgZHluYW1pYyBzeW1ib2wKLSAgICAgdGFibGUgaW5kZXggaW4gdGhlIEdPVC4gICovCi0gIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZHlub2JqLCBOVUxMKTsKLSAgZy0+Z2xvYmFsX2dvdHN5bSA9IGhzZC5sb3c7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIGxvY2FsIEdPVCBlbnRyeSBmb3IgVkFMVUUuICBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbnRyeSwKLSAgIG9yIC0xIGlmIGl0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkgKGFiZmQsIGcsIHNnb3QsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgaWYgKGctPmFzc2lnbmVkX2dvdG5vID49IGctPmxvY2FsX2dvdG5vKQotICAgIHsKLSAgICAgIC8qIFdlIGRpZG4ndCBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gdGhlIEdPVC4gICovCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygibm90IGVub3VnaCBHT1Qgc3BhY2UgZm9yIGxvY2FsIEdPVCBlbnRyaWVzIikpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIC0xOwotICAgIH0KLQotICBNSVBTX0VMRl9QVVRfV09SRCAoYWJmZCwgdmFsdWUsCi0JCSAgICAgKHNnb3QtPmNvbnRlbnRzIAotCQkgICAgICArIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIGctPmFzc2lnbmVkX2dvdG5vKSk7Ci0gIHJldHVybiBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBnLT5hc3NpZ25lZF9nb3RubysrOwotfQotCi0vKiBSZXR1cm5zIHRoZSBHT1Qgb2Zmc2V0IGF0IHdoaWNoIHRoZSBpbmRpY2F0ZWQgYWRkcmVzcyBjYW4gYmUgZm91bmQuCi0gICBJZiB0aGVyZSBpcyBub3QgeWV0IGEgR09UIGVudHJ5IGZvciB0aGlzIHZhbHVlLCBjcmVhdGUgb25lLiAgUmV0dXJucwotICAgLTEgaWYgbm8gc2F0aXNmYWN0b3J5IEdPVCBvZmZzZXQgY2FuIGJlIGZvdW5kLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2xvY2FsX2dvdF9pbmRleCAoYWJmZCwgaW5mbywgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgYmZkX2J5dGUgKmVudHJ5OwotCi0gIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosICZzZ290KTsKLQotICAvKiBMb29rIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnkuICAqLwotICBmb3IgKGVudHJ5ID0gKHNnb3QtPmNvbnRlbnRzIAotCQkrIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIE1JUFNfUkVTRVJWRURfR09UTk8pOyAKLSAgICAgICBlbnRyeSAhPSBzZ290LT5jb250ZW50cyArIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSAqIGctPmFzc2lnbmVkX2dvdG5vOwotICAgICAgIGVudHJ5ICs9IE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3MgPSBNSVBTX0VMRl9HRVRfV09SRCAoYWJmZCwgZW50cnkpOwotICAgICAgaWYgKGFkZHJlc3MgPT0gdmFsdWUpCi0JcmV0dXJuIGVudHJ5IC0gc2dvdC0+Y29udGVudHM7Ci0gICAgfQotCi0gIHJldHVybiBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IChhYmZkLCBnLCBzZ290LCB2YWx1ZSk7Ci19Ci0KLS8qIEZpbmQgYSBHT1QgZW50cnkgdGhhdCBpcyB3aXRoaW4gMzJLQiBvZiB0aGUgVkFMVUUuICBUaGVzZSBlbnRyaWVzCi0gICBhcmUgc3VwcG9zZWQgdG8gYmUgcGxhY2VkIGF0IHNtYWxsIG9mZnNldHMgaW4gdGhlIEdPVCwgaS5lLiwKLSAgIHdpdGhpbiAzMktCIG9mIEdQLiAgUmV0dXJuIHRoZSBpbmRleCBpbnRvIHRoZSBHT1QgZm9yIHRoaXMgcGFnZSwKLSAgIGFuZCBzdG9yZSB0aGUgb2Zmc2V0IGZyb20gdGhpcyBlbnRyeSB0byB0aGUgZGVzaXJlZCBhZGRyZXNzIGluCi0gICBPRkZTRVRQLCBpZiBpdCBpcyBub24tTlVMTC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9nb3RfcGFnZSAoYWJmZCwgaW5mbywgdmFsdWUsIG9mZnNldHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgKm9mZnNldHA7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgYmZkX2J5dGUgKmVudHJ5OwotICBiZmRfYnl0ZSAqbGFzdF9lbnRyeTsKLSAgYmZkX3ZtYSBpbmRleCA9IDA7Ci0gIGJmZF92bWEgYWRkcmVzczsKLQotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCAmc2dvdCk7Ci0KLSAgLyogTG9vayB0byBzZWUgaWYgd2UgYWxlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnkuICAqLwotICBsYXN0X2VudHJ5ID0gc2dvdC0+Y29udGVudHMgKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBnLT5hc3NpZ25lZF9nb3RubzsKLSAgZm9yIChlbnRyeSA9IChzZ290LT5jb250ZW50cyAKLQkJKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBNSVBTX1JFU0VSVkVEX0dPVE5PKTsKLSAgICAgICBlbnRyeSAhPSBsYXN0X2VudHJ5OwotICAgICAgIGVudHJ5ICs9IE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSkKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gTUlQU19FTEZfR0VUX1dPUkQgKGFiZmQsIGVudHJ5KTsKLQotICAgICAgaWYgKCFtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSAtIGFkZHJlc3MsIDE2KSkKLQl7Ci0JICAvKiBUaGlzIGVudHJ5IHdpbGwgc2VydmUgYXMgdGhlIHBhZ2UgcG9pbnRlci4gIFdlIGNhbiBhZGQgYQotCSAgICAgMTYtYml0IG51bWJlciB0byBpdCB0byBnZXQgdGhlIGFjdHVhbCBhZGRyZXNzLiAgKi8KLQkgIGluZGV4ID0gZW50cnkgLSBzZ290LT5jb250ZW50czsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnksIHdlIGNyZWF0ZSBvbmUgbm93LiAgKi8KLSAgaWYgKGVudHJ5ID09IGxhc3RfZW50cnkpCi0gICAgaW5kZXggPSBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IChhYmZkLCBnLCBzZ290LCB2YWx1ZSk7Ci0KLSAgaWYgKG9mZnNldHApCi0gICAgewotICAgICAgYWRkcmVzcyA9IE1JUFNfRUxGX0dFVF9XT1JEIChhYmZkLCBlbnRyeSk7Ci0gICAgICAqb2Zmc2V0cCA9IHZhbHVlIC0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIGluZGV4OwotfQotCi0vKiBGaW5kIGEgR09UIGVudHJ5IHdob3NlIGhpZ2hlci1vcmRlciAxNiBiaXRzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZQotICAgZm9yIHZhbHVlLiAgUmV0dXJuIHRoZSBpbmRleCBpbnRvIHRoZSBHT1QgZm9yIHRoaXMgZW50cnkuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfZ290MTZfZW50cnkgKGFiZmQsIGluZm8sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZF9ieXRlICplbnRyeTsKLSAgYmZkX2J5dGUgKmxhc3RfZW50cnk7Ci0gIGJmZF92bWEgaW5kZXggPSAwOwotICBiZmRfdm1hIGFkZHJlc3M7Ci0KLSAgLyogQWx0aG91Z2ggdGhlIEFCSSBzYXlzIHRoYXQgaXQgaXMgInRoZSBoaWdoLW9yZGVyIDE2IGJpdHMiIHRoYXQgd2UKLSAgICAgd2FudCwgaXQgaXMgcmVhbGx5IHRoZSAlaGlnaCB2YWx1ZS4gIFRoZSBjb21wbGV0ZSB2YWx1ZSBpcwotICAgICBjYWxjdWxhdGVkIHdpdGggYSBgYWRkaXUnIG9mIGEgTE8xNiByZWxvY2F0aW9uLCBqdXN0IGFzIHdpdGggYQotICAgICBISTE2L0xPMTYgcGFpci4gICovCi0gIHZhbHVlID0gbWlwc19lbGZfaGlnaCAodmFsdWUpIDw8IDE2OwotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCAmc2dvdCk7Ci0KLSAgLyogTG9vayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGFwcHJvcHJpYXRlIGVudHJ5LiAgKi8KLSAgbGFzdF9lbnRyeSA9IHNnb3QtPmNvbnRlbnRzICsgTUlQU19FTEZfR09UX1NJWkUgKGFiZmQpICogZy0+YXNzaWduZWRfZ290bm87Ci0gIGZvciAoZW50cnkgPSAoc2dvdC0+Y29udGVudHMgCi0JCSsgTUlQU19FTEZfR09UX1NJWkUgKGFiZmQpICogTUlQU19SRVNFUlZFRF9HT1ROTyk7Ci0gICAgICAgZW50cnkgIT0gbGFzdF9lbnRyeTsKLSAgICAgICBlbnRyeSArPSBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkpCi0gICAgewotICAgICAgYWRkcmVzcyA9IE1JUFNfRUxGX0dFVF9XT1JEIChhYmZkLCBlbnRyeSk7Ci0gICAgICBpZiAoKGFkZHJlc3MgJiAweGZmZmYwMDAwKSA9PSB2YWx1ZSkKLQl7Ci0JICAvKiBUaGlzIGVudHJ5IGhhcyB0aGUgcmlnaHQgaGlnaC1vcmRlciAxNiBiaXRzLiAgKi8KLQkgIGluZGV4ID0gZW50cnkgLSBzZ290LT5jb250ZW50czsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnksIHdlIGNyZWF0ZSBvbmUgbm93LiAgKi8KLSAgaWYgKGVudHJ5ID09IGxhc3RfZW50cnkpCi0gICAgaW5kZXggPSBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IChhYmZkLCBnLCBzZ290LCB2YWx1ZSk7Ci0KLSAgcmV0dXJuIGluZGV4OwotfQotCi0vKiBSZXR1cm5zIHRoZSBmaXJzdCByZWxvY2F0aW9uIG9mIHR5cGUgcl90eXBlIGZvdW5kLCBiZWdpbm5pbmcgd2l0aAotICAgUkVMT0NBVElPTi4gIFJFTEVORCBpcyBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICoKLW1pcHNfZWxmX25leHRfcmVsb2NhdGlvbiAocl90eXBlLCByZWxvY2F0aW9uLCByZWxlbmQpCi0gICAgIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY2F0aW9uOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotewotICAvKiBBY2NvcmRpbmcgdG8gdGhlIE1JUFMgRUxGIEFCSSwgdGhlIFJfTUlQU19MTzE2IHJlbG9jYXRpb24gbXVzdCBiZQotICAgICBpbW1lZGlhdGVseSBmb2xsb3dpbmcuICBIb3dldmVyLCBmb3IgdGhlIElSSVg2IEFCSSwgdGhlIG5leHQKLSAgICAgcmVsb2NhdGlvbiBtYXkgYmUgYSBjb21wb3NlZCByZWxvY2F0aW9uIGNvbnNpc3Rpbmcgb2Ygc2V2ZXJhbAotICAgICByZWxvY2F0aW9ucyBmb3IgdGhlIHNhbWUgYWRkcmVzcy4gIEluIHRoYXQgY2FzZSwgdGhlIFJfTUlQU19MTzE2Ci0gICAgIHJlbG9jYXRpb24gbWF5IG9jY3VyIGFzIG9uZSBvZiB0aGVzZS4gIFdlIHBlcm1pdCBhIHNpbWlsYXIKLSAgICAgZXh0ZW5zaW9uIGluIGdlbmVyYWwsIGFzIHRoYXQgaXMgdXNlZnVsIGZvciBHQ0MuICAqLwotICB3aGlsZSAocmVsb2NhdGlvbiA8IHJlbGVuZCkKLSAgICB7Ci0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChyZWxvY2F0aW9uLT5yX2luZm8pID09IHJfdHlwZSkKLQlyZXR1cm4gcmVsb2NhdGlvbjsKLQotICAgICAgKytyZWxvY2F0aW9uOwotICAgIH0KLQotICAvKiBXZSBkaWRuJ3QgZmluZCBpdC4gICovCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQ3JlYXRlIGEgcmVsLmR5biByZWxvY2F0aW9uIGZvciB0aGUgZHluYW1pYyBsaW5rZXIgdG8gcmVzb2x2ZS4gIFJFTAotICAgaXMgdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24sIHdoaWNoIGlzIG5vdyBiZWluZyB0cmFuc2Zvcm1lZCBpbnRvIGEKLSAgIGR5YW5taWMgcmVsb2NhdGlvbi4gIFRoZSBBRERFTkRQIGlzIGFkanVzdGVkIGlmIG5lY2Vzc2FyeTsgdGhlCi0gICBjYWxsZXIgc2hvdWxkIHN0b3JlIHRoZSByZXN1bHQgaW4gcGxhY2Ugb2YgdGhlIG9yaWdpbmFsIGFkZGVuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCByZWwsIGgsIHNlYywKLQkJCQkgICAgc3ltYm9sLCBhZGRlbmRwLCBpbnB1dF9zZWN0aW9uKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIHN5bWJvbDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotICBib29sZWFuIHNraXA7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGJmZCAqZHlub2JqOwotICBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3JlbG9jIAotICAgID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwKLQkJCSAgICAgICBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpOwotICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0KLSAgc2tpcCA9IGZhbHNlOwotCi0gIC8qIFdlIGJlZ2luIGJ5IGFzc3VtaW5nIHRoYXQgdGhlIG9mZnNldCBmb3IgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbgotICAgICBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24uICBXZSdsbCBhZGp1c3QgdGhpcwotICAgICBsYXRlciB0byByZWZsZWN0IHRoZSBjb3JyZWN0IG91dHB1dCBvZmZzZXRzLiAgKi8KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLSAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICBlbHNlCi0gICAgewotICAgICAgLyogRXhjZXB0IHRoYXQgaW4gYSBzdGFiIHNlY3Rpb24gdGhpbmdzIGFyZSBtb3JlIGNvbXBsZXguCi0JIEJlY2F1c2Ugd2UgY29tcHJlc3Mgc3RhYiBpbmZvcm1hdGlvbiwgdGhlIG9mZnNldCBnaXZlbiBpbiB0aGUKLQkgcmVsb2NhdGlvbiBtYXkgbm90IGJlIHRoZSBvbmUgd2Ugd2FudDsgd2UgbXVzdCBsZXQgdGhlIHN0YWJzCi0JIG1hY2hpbmVyeSB0ZWxsIHVzIHRoZSBvZmZzZXQuICAqLwotICAgICAgb3V0cmVsLnJfb2Zmc2V0IAotCT0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCSAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JICAgIGlucHV0X3NlY3Rpb24sCi0JICAgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCSAgICByZWwtPnJfb2Zmc2V0KSk7Ci0gICAgICAvKiBJZiB3ZSBkaWRuJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbiBhdCBhbGwsIHRoaXMgdmFsdWUgd2lsbCBiZQotCSAtMS4gICovCi0gICAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQlza2lwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UndmUgZGVjaWRlZCB0byBza2lwIHRoaXMgcmVsb2NhdGlvbiwganVzdCBvdXRwdXQgYW4gZW10cHkKLSAgICAgcmVjb3JkLiAgTm90ZSB0aGF0IFJfTUlQU19OT05FID09IDAsIHNvIHRoYXQgdGhpcyBjYWxsIHRvIG1lbXNldAotICAgICBpcyBhIHdheSBvZiBzZXR0aW5nIFJfVFlQRSB0byBSX01JUFNfTk9ORS4gICovCi0gIGlmIChza2lwKQotICAgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIChvdXRyZWwpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW5keDsKLSAgICAgIGJmZF92bWEgc2VjdGlvbl9vZmZzZXQ7Ci0KLSAgICAgIC8qIFdlIG11c3Qgbm93IGNhbGN1bGF0ZSB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaW5kZXggdG8gdXNlCi0JIGluIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmICghIGluZm8tPnN5bWJvbGljIHx8IChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCXsKLQkgIGluZHggPSBoLT5yb290LmR5bmluZHg7Ci0JICBCRkRfQVNTRVJUIChpbmR4ICE9IC0xKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkgICAgaW5keCA9IDA7Ci0JICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMtPm91dHB1dF9zZWN0aW9uKS0+ZHluaW5keDsKLQkgICAgICBpZiAoaW5keCA9PSAwKQotCQlhYm9ydCAoKTsKLQkgICAgfQotCi0JICAvKiBGaWd1cmUgb3V0IGhvdyBmYXIgdGhlIHRhcmdldCBvZiB0aGUgcmVsb2NhdGlvbiBpcyBmcm9tCi0JICAgICB0aGUgYmVnaW5uaW5nIG9mIGl0cyBzZWN0aW9uLiAgKi8KLQkgIHNlY3Rpb25fb2Zmc2V0ID0gc3ltYm9sIC0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgLyogVGhlIHJlbG9jYXRpb24gd2UncmUgYnVpbGRpbmcgaXMgc2VjdGlvbi1yZWxhdGl2ZS4KLQkgICAgIFRoZXJlZm9yZSwgdGhlIG9yaWdpbmFsIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkIGJ5IHRoZQotCSAgICAgc2VjdGlvbiBvZmZzZXQuICAqLwotCSAgKmFkZGVuZHAgKz0gc3ltYm9sIC0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgLyogTm93LCB0aGUgcmVsb2NhdGlvbiBpcyBqdXN0IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotCSAgc3ltYm9sID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCX0KLSAgICAgIAotICAgICAgLyogSWYgdGhlIHJlbG9jYXRpb24gd2FzIHByZXZpb3VzbHkgYW4gYWJzb2x1dGUgcmVsb2NhdGlvbiwgd2UKLQkgbXVzdCBhZGp1c3QgaXQgYnkgdGhlIHZhbHVlIHdlIGdpdmUgaXQgaW4gdGhlIGR5bmFtaWMgc3ltYm9sCi0JIHRhYmxlLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgIT0gUl9NSVBTX1JFTDMyKQotCSphZGRlbmRwICs9IHN5bWJvbDsKLQotICAgICAgLyogVGhlIHJlbG9jYXRpb24gaXMgYWx3YXlzIGFuIFJFTDMyIHJlbG9jYXRpb24gYmVjYXVzZSB3ZSBkb24ndAotCSBrbm93IHdoZXJlIHRoZSBzaGFyZWQgbGlicmFyeSB3aWxsIHdpbmQgdXAgYXQgbG9hZC10aW1lLiAgKi8KLSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIFJfTUlQU19SRUwzMik7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgb3V0cHV0IG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiB0byByZWZlcmVuY2UgdGhlCi0JIGNvcnJlY3QgbG9jYXRpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgIH0KLQotICAvKiBQdXQgdGhlIHJlbG9jYXRpb24gYmFjayBvdXQuICBXZSBoYXZlIHRvIHVzZSB0aGUgc3BlY2lhbAotICAgICByZWxvY2F0aW9uIG91dHB1dHRlciBpbiB0aGUgNjQtYml0IGNhc2Ugc2luY2UgdGhlIDY0LWJpdAotICAgICByZWxvY2F0aW9uIGZvcm1hdCBpcyBub24tc3RhbmRhcmQuICAqLwotICBpZiAoQUJJXzY0X1AgKG91dHB1dF9iZmQpKQotICAgIHsKLSAgICAgICgqZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG91dHB1dF9iZmQpLT5zLT5zd2FwX3JlbG9jX291dCkKLQkob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkgKHNyZWxvYy0+Y29udGVudHMgCi0JICArIHNyZWxvYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsKSkpOwotICAgIH0KLSAgZWxzZQotICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCSAgICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCXNyZWxvYy0+Y29udGVudHMpCi0JCQkgICAgICAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0KLSAgLyogUmVjb3JkIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcmVsb2NhdGlvbiByZWZlcmVuY2luZyBILiAgVGhpcwotICAgICBpbmZvcm1hdGlvbiBpcyBsYXRlciBlbWl0dGVkIGluIHRoZSAubXN5bSBzZWN0aW9uLiAgKi8KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgKGgtPm1pbl9keW5fcmVsb2NfaW5kZXggPT0gMCAKLQkgIHx8IHNyZWxvYy0+cmVsb2NfY291bnQgPCBoLT5taW5fZHluX3JlbG9jX2luZGV4KSkKLSAgICBoLT5taW5fZHluX3JlbG9jX2luZGV4ID0gc3JlbG9jLT5yZWxvY19jb3VudDsKLQotICAvKiBXZSd2ZSBub3cgYWRkZWQgYW5vdGhlciByZWxvY2F0aW9uLiAgKi8KLSAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgb3V0cHV0IHNlY3Rpb24gaXMgd3JpdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIKLSAgICAgd2lsbCBiZSB3cml0aW5nIHRvIGl0LiAgKi8KLSAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9mbGFncwotICAgIHw9IFNIRl9XUklURTsKLQotICAvKiBPbiBJUklYNSwgbWFrZSBhbiBlbnRyeSBvZiBjb21wYWN0IHJlbG9jYXRpb24gaW5mby4gICovCi0gIGlmICghIHNraXAgJiYgSVJJWF9DT01QQVQgKG91dHB1dF9iZmQpID09IGljdF9pcml4NSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiogc2NwdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuY29tcGFjdF9yZWwiKTsKLSAgICAgIGJmZF9ieXRlICpjcjsKLQotICAgICAgaWYgKHNjcHQpCi0JewotCSAgRWxmMzJfY3JpbmZvIGNwdHJlbDsKLQotCSAgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCAoY3B0cmVsLCBDUkZfTUlQU19MT05HKTsKLQkgIGNwdHJlbC52YWRkciA9IChyZWwtPnJfb2Zmc2V0Ci0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKHJfdHlwZSA9PSBSX01JUFNfUkVMMzIpCi0JICAgIG1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX1JFTDMyKTsKLQkgIGVsc2UKLQkgICAgbWlwc19lbGZfc2V0X2NyX3R5cGUgKGNwdHJlbCwgQ1JUX01JUFNfV09SRCk7Ci0JICBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byAoY3B0cmVsLCAwKTsKLQkgIGNwdHJlbC5rb25zdCA9ICphZGRlbmRwOwotCi0JICBjciA9IChzY3B0LT5jb250ZW50cwotCQkrIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwpKTsKLQkgIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKG91dHB1dF9iZmQsICZjcHRyZWwsCi0JCQkJICAgICAoKEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSBjcgotCQkJCSAgICAgICsgc2NwdC0+cmVsb2NfY291bnQpKTsKLQkgICsrc2NwdC0+cmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSB2YWx1ZSBwcm9kdWNlZCBieSB0aGUgUkVMT0NBVElPTiAod2hpY2ggY29tZXMgZnJvbQotICAgdGhlIElOUFVUX0JGRCkuICBUaGUgQURERU5EIGlzIHRoZSBhZGRlbmQgdG8gdXNlIGZvciB0aGlzCi0gICBSRUxPQ0FUSU9OOyBSRUxPQ0FUSU9OLT5SX0FEREVORCBpcyBpZ25vcmVkLgotCi0gICBUaGUgcmVzdWx0IG9mIHRoZSByZWxvY2F0aW9uIGNhbGN1bGF0aW9uIGlzIHN0b3JlZCBpbiBWQUxVRVAuCi0gICBSRVFVSVJFX0pBTFhQIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgb3Bjb2RlIHVzZWQgd2l0aCB0aGlzCi0gICByZWxvY2F0aW9uIG11c3QgYmUgSkFMWC4KLQotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJmZF9yZWxvY19jb250aW51ZSBpZiB0aGUgY2FsbGVyIG5lZWQgdGFrZSBubwotICAgZnVydGhlciBhY3Rpb24gcmVnYXJkaW5nIHRoaXMgcmVsb2NhdGlvbiwgYmZkX3JlbG9jX25vdHN1cHBvcnRlZCBpZgotICAgc29tZXRoaW5nIGdvZXMgZHJhbWF0aWNhbGx5IHdyb25nLCBiZmRfcmVsb2Nfb3ZlcmZsb3cgaWYgYW4KLSAgIG92ZXJmbG93IG9jY3VycywgYW5kIGJmZF9yZWxvY19vayB0byBpbmRpY2F0ZSBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gKGFiZmQsIAotCQkJICAgICAgIGlucHV0X2JmZCwKLQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgIGluZm8sCi0JCQkgICAgICAgcmVsb2NhdGlvbiwKLQkJCSAgICAgICBhZGRlbmQsCi0JCQkgICAgICAgaG93dG8sCi0JCQkgICAgICAgbG9jYWxfc3ltcywKLQkJCSAgICAgICBsb2NhbF9zZWN0aW9ucywKLQkJCSAgICAgICB2YWx1ZXAsCi0JCQkgICAgICAgbmFtZXAsCi0JCQkgICAgICAgcmVxdWlyZV9qYWx4cCkgCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLSAgICAgYmZkX3ZtYSAqdmFsdWVwOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGJvb2xlYW4gKnJlcXVpcmVfamFseHA7Ci17Ci0gIC8qIFRoZSBldmVudHVhbCB2YWx1ZSB3ZSB3aWxsIHJldHVybi4gICovCi0gIGJmZF92bWEgdmFsdWU7Ci0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYWdhaW5zdCB3aGljaCB0aGUgcmVsb2NhdGlvbiBpcwotICAgICBvY2N1cnJpbmcuICAqLwotICBiZmRfdm1hIHN5bWJvbCA9IDA7Ci0gIC8qIFRoZSBmaW5hbCBHUCB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgcmVsb2NhdGFibGUsIGV4ZWN1dGFibGUsIG9yCi0gICAgIHNoYXJlZCBvYmplY3QgZmlsZSBiZWluZyBwcm9kdWNlZC4gICovCi0gIGJmZF92bWEgZ3AgPSAoYmZkX3ZtYSkgLSAxOwotICAvKiBUaGUgcGxhY2UgKHNlY3Rpb24gb2Zmc2V0IG9yIGFkZHJlc3MpIG9mIHRoZSBzdG9yYWdlIHVuaXQgYmVpbmcKLSAgICAgcmVsb2NhdGVkLiAgKi8KLSAgYmZkX3ZtYSBwOwotICAvKiBUaGUgdmFsdWUgb2YgR1AgdXNlZCB0byBjcmVhdGUgdGhlIHJlbG9jYXRhYmxlIG9iamVjdC4gICovCi0gIGJmZF92bWEgZ3AwID0gKGJmZF92bWEpIC0gMTsKLSAgLyogVGhlIG9mZnNldCBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGF0IHdoaWNoIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSByZWxvY2F0aW9uIGVudHJ5IHN5bWJvbCwgYWRqdXN0ZWQgYnkgdGhlIGFkZGVuZCwgcmVzaWRlcwotICAgICBkdXJpbmcgZXhlY3V0aW9uLiAgKi8KLSAgYmZkX3ZtYSBnID0gKGJmZF92bWEpIC0gMTsKLSAgLyogVGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhlIHN5bWJvbCByZWZlcmVuY2VkIGJ5IHRoZSByZWxvY2F0aW9uIGlzCi0gICAgIGxvY2F0ZWQuICAqLwotICBhc2VjdGlvbiAqc2VjID0gTlVMTDsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSogaCA9IE5VTEw7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGlzIHJlbG9jYXRpb24gaXMgYSBsb2NhbAotICAgICBzeW1ib2wuICAqLwotICBib29sZWFuIGxvY2FsX3A7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGlzIHJlbG9jYXRpb24gaXMgIl9ncF9kaXNwIi4gICovCi0gIGJvb2xlYW4gZ3BfZGlzcF9wID0gZmFsc2U7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzaXplX3QgZXh0c3ltb2ZmOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBpbnQgcl90eXBlOwotICAvKiBUcnVlIGlmIG92ZXJmbG93IG9jY3VycmVkIGR1cmluZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gdmFsdWUuICAqLwotICBib29sZWFuIG92ZXJmbG93ZWRfcDsKLSAgLyogVHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gcmVmZXJzIHRvIGEgTUlQUzE2IGZ1bmN0aW9uLiAgKi8KLSAgYm9vbGVhbiB0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCA9IGZhbHNlOwotCi0gIC8qIFBhcnNlIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWxvY2F0aW9uLT5yX2luZm8pOwotICBwID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgCi0gICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgKyByZWxvY2F0aW9uLT5yX29mZnNldCk7Ci0KLSAgLyogQXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBvdmVyZmxvdy4gICovCi0gIG92ZXJmbG93ZWRfcCA9IGZhbHNlOwotCi0gIC8qIEZpZ3VyZSBvdXQgd2hldGhlciBvciBub3QgdGhlIHN5bWJvbCBpcyBsb2NhbCwgYW5kIGdldCB0aGUgb2Zmc2V0Ci0gICAgIHVzZWQgaW4gdGhlIGFycmF5IG9mIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBsb2NhbF9wID0gbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wIChpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCSBsb2NhbF9zZWN0aW9ucyk7Ci0gIGlmICghIGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotICAgIGV4dHN5bW9mZiA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIHRhYmxlIGRvZXMgbm90IGZvbGxvdyB0aGUgcnVsZSB0aGF0IGxvY2FsIHN5bWJvbHMKLQkgbXVzdCBjb21lIGJlZm9yZSBnbG9iYWxzLiAgKi8KLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICAgICAgCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotICBpZiAobG9jYWxfcCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0KLSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQotICAgICAgc3ltYm9sID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9TRUNUSU9OKQotCXN5bWJvbCArPSBzeW0tPnN0X3ZhbHVlOwotCi0gICAgICAvKiBNSVBTMTYgdGV4dCBsYWJlbHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2RkLiAgKi8KLSAgICAgIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYpCi0JKytzeW1ib2w7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbCwgZm9yIG91ciBjYWxsZXIuICAqLwotICAgICAgKm5hbWVwID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCXN5bS0+c3RfbmFtZSk7Ci0gICAgICBpZiAoKm5hbWVwID09ICdcMCcpCi0JKm5hbWVwID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCi0gICAgICB0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCA9IChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBnbG9iYWwgc3ltYm9scyB3ZSBsb29rIHVwIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2gtdGFibGUuICAqLwotICAgICAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAKLQkgICBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKSBbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKLSAgICAgIC8qIEZpbmQgdGhlIHJlYWwgaGFzaC10YWJsZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnJvb3QudS5pLmxpbms7Ci0gICAgICAKLSAgICAgIC8qIFJlY29yZCB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbCwgZm9yIG91ciBjYWxsZXIuICAqLwotICAgICAgKm5hbWVwID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBpcyB0aGUgc3BlY2lhbCBfZ3BfZGlzcCBzeW1ib2wuICBOb3RlIHRoYXQgc3VjaCBhCi0JIHN5bWJvbCBtdXN0IGFsd2F5cyBiZSBhIGdsb2JhbCBzeW1ib2wuICAqLwotICAgICAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCAiX2dwX2Rpc3AiKSA9PSAwKQotCXsKLQkgIC8qIFJlbG9jYXRpb25zIGFnYWluc3QgX2dwX2Rpc3AgYXJlIHBlcm1pdHRlZCBvbmx5IHdpdGgKLQkgICAgIFJfTUlQU19ISTE2IGFuZCBSX01JUFNfTE8xNiByZWxvY2F0aW9ucy4gICovCi0JICBpZiAocl90eXBlICE9IFJfTUlQU19ISTE2ICYmIHJfdHlwZSAhPSBSX01JUFNfTE8xNikKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLQkgIGdwX2Rpc3BfcCA9IHRydWU7Ci0JfQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCwgY2FsY3VsYXRlIGl0cyBhZGRyZXNzLiAgTm90ZSB0aGF0Ci0JIF9ncF9kaXNwIGlzIGEgbWFnaWMgc3ltYm9sLCBhbHdheXMgaW1wbGljaXRseSBkZWZpbmVkIGJ5IHRoZQotCSBsaW5rZXIsIHNvIGl0J3MgaW5hcHByb3ByaWF0ZSB0byBjaGVjayB0byBzZWUgd2hldGhlciBvciBub3QKLQkgaXRzIGRlZmluZWQuICAqLwotICAgICAgZWxzZSBpZiAoKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKQotCXsKLQkgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JICAgIHN5bWJvbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUgCi0JCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIGVsc2UKLQkgICAgc3ltYm9sID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCS8qIFdlIGFsbG93IHJlbG9jYXRpb25zIGFnYWluc3QgdW5kZWZpbmVkIHdlYWsgc3ltYm9scywgZ2l2aW5nCi0JICAgaXQgdGhlIHZhbHVlIHplcm8sIHNvIHRoYXQgeW91IGNhbiB1bmRlZmluZWQgd2VhayBmdW5jdGlvbnMKLQkgICBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZXkgZXhpc3QgYnkgbG9va2luZyBhdCB0aGVpcgotCSAgIGFkZHJlc3Nlcy4gICovCi0Jc3ltYm9sID0gMDsKLSAgICAgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQlzeW1ib2wgPSAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQ19MSU5LIikgPT0gMCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBsaW5rLCB3ZSBzaG91bGQgaGF2ZSBjcmVhdGVkIGEKLQkgICAgIF9EWU5BTUlDX0xJTksgc3ltYm9sIGluIG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCSAgICAgT3RoZXJ3aXNlLCB3ZSBzaG91bGQgZGVmaW5lIHRoZSBzeW1ib2wgd2l0aCBhIHZhbHVlIG9mIDAuCi0JICAgICBGSVhNRTogSXQgc2hvdWxkIHByb2JhYmx5IGdldCBpbnRvIHRoZSBzeW1ib2wgdGFibGUKLQkgICAgIHNvbWVob3cgYXMgd2VsbC4gICovCi0JICBCRkRfQVNTRVJUICghIGluZm8tPnNoYXJlZCk7Ci0JICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikgPT0gTlVMTCk7Ci0JICBzeW1ib2wgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2NhdGlvbi0+cl9vZmZzZXQsCi0JCSAgKCFpbmZvLT5zaGFyZWQgfHwgaW5mby0+bm9fdW5kZWZpbmVkKSkpKQotCSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQkgIHN5bWJvbCA9IDA7Ci0JfQotCi0gICAgICB0YXJnZXRfaXNfMTZfYml0X2NvZGVfcCA9IChoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpOwotICAgIH0KLSAgCi0gIC8qIElmIHRoaXMgaXMgYSAzMi1iaXQgY2FsbCB0byBhIDE2LWJpdCBmdW5jdGlvbiB3aXRoIGEgc3R1Yiwgd2UKLSAgICAgbmVlZCB0byByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgc3R1YiwgdW5sZXNzIHdlJ3JlIGFscmVhZHkgKmluKgotICAgICBhIHN0dWIuICAqLwotICBpZiAocl90eXBlICE9IFJfTUlQUzE2XzI2ICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICgoaCAhPSBOVUxMICYmIGgtPmZuX3N0dWIgIT0gTlVMTCkKLQkgIHx8IChsb2NhbF9wICYmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfc3R1YnMgIT0gTlVMTAotCSAgICAgICYmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfc3R1YnNbcl9zeW1uZHhdICE9IE5VTEwpKQotICAgICAgJiYgIW1pcHNfZWxmX3N0dWJfc2VjdGlvbl9wIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSAzMi1iaXQgY2FsbCB0byBhIDE2LWJpdCBmdW5jdGlvbi4gIFdlIHNob3VsZAotCSBoYXZlIGFscmVhZHkgbm90aWNlZCB0aGF0IHdlIHdlcmUgZ29pbmcgdG8gbmVlZCB0aGUKLQkgc3R1Yi4gICovCi0gICAgICBpZiAobG9jYWxfcCkKLQlzZWMgPSBlbGZfdGRhdGEgKGlucHV0X2JmZCktPmxvY2FsX3N0dWJzW3Jfc3ltbmR4XTsKLSAgICAgIGVsc2UKLQl7Ci0JICBCRkRfQVNTRVJUIChoLT5uZWVkX2ZuX3N0dWIpOwotCSAgc2VjID0gaC0+Zm5fc3R1YjsKLQl9Ci0KLSAgICAgIHN5bWJvbCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci0gIC8qIElmIHRoaXMgaXMgYSAxNi1iaXQgY2FsbCB0byBhIDMyLWJpdCBmdW5jdGlvbiB3aXRoIGEgc3R1Yiwgd2UKLSAgICAgbmVlZCB0byByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgc3R1Yi4gICovCi0gIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNiAmJiAhaW5mby0+cmVsb2NhdGVhYmxlCi0JICAgJiYgaCAhPSBOVUxMIAotCSAgICYmIChoLT5jYWxsX3N0dWIgIT0gTlVMTCB8fCBoLT5jYWxsX2ZwX3N0dWIgIT0gTlVMTCkKLQkgICAmJiAhdGFyZ2V0X2lzXzE2X2JpdF9jb2RlX3ApCi0gICAgewotICAgICAgLyogSWYgYm90aCBjYWxsX3N0dWIgYW5kIGNhbGxfZnBfc3R1YiBhcmUgZGVmaW5lZCwgd2UgY2FuIGZpZ3VyZQotCSBvdXQgd2hpY2ggb25lIHRvIHVzZSBieSBzZWVpbmcgd2hpY2ggb25lIGFwcGVhcnMgaW4gdGhlIGlucHV0Ci0JIGZpbGUuICAqLwotICAgICAgaWYgKGgtPmNhbGxfc3R1YiAhPSBOVUxMICYmIGgtPmNhbGxfZnBfc3R1YiAhPSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpvOwotCi0JICBzZWMgPSBOVUxMOwotCSAgZm9yIChvID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBvKSwKLQkJCSAgIENBTExfRlBfU1RVQiwgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCi0JCXsKLQkJICBzZWMgPSBoLT5jYWxsX2ZwX3N0dWI7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKHNlYyA9PSBOVUxMKQotCSAgICBzZWMgPSBoLT5jYWxsX3N0dWI7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+Y2FsbF9zdHViICE9IE5VTEwpCi0Jc2VjID0gaC0+Y2FsbF9zdHViOwotICAgICAgZWxzZQotCXNlYyA9IGgtPmNhbGxfZnBfc3R1YjsKLQotICAgICAgQkZEX0FTU0VSVCAoc2VjLT5fcmF3X3NpemUgPiAwKTsKLSAgICAgIHN5bWJvbCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci0KLSAgLyogQ2FsbHMgZnJvbSAxNi1iaXQgY29kZSB0byAzMi1iaXQgY29kZSBhbmQgdmljZSB2ZXJzYSByZXF1aXJlIHRoZQotICAgICBzcGVjaWFsIGphbHggaW5zdHJ1Y3Rpb24uICAqLwotICAqcmVxdWlyZV9qYWx4cCA9ICghaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICAmJiAoKHJfdHlwZSA9PSBSX01JUFMxNl8yNikgIT0gdGFyZ2V0X2lzXzE2X2JpdF9jb2RlX3ApKTsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZGV0ZXJtaW5lZCB0aGUgR09UIG9mZnNldCwgb3IgdGhlIEdQIHZhbHVlLAotICAgICBhbmQgd2UncmUgZ29pbmcgdG8gbmVlZCBpdCwgZ2V0IGl0IG5vdy4gICovCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfTUlQU19DQUxMMTY6Ci0gICAgY2FzZSBSX01JUFNfR09UMTY6Ci0gICAgY2FzZSBSX01JUFNfR09UX0RJU1A6Ci0gICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0gICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotICAgIGNhc2UgUl9NSVBTX0dPVF9MTzE2OgotICAgIGNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLSAgICAgIC8qIEZpbmQgdGhlIGluZGV4IGludG8gdGhlIEdPVCB3aGVyZSB0aGlzIHZhbHVlIGlzIGxvY2F0ZWQuICAqLwotICAgICAgaWYgKCFsb2NhbF9wKQotCXsKLQkgIEJGRF9BU1NFUlQgKGFkZGVuZCA9PSAwKTsKLQkgIGcgPSBtaXBzX2VsZl9nbG9iYWxfZ290X2luZGV4IAotCSAgICAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JICAgICAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkqKSBoKTsKLQl9Ci0gICAgICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTX0dPVDE2KQotCS8qIFRoZXJlJ3Mgbm8gbmVlZCB0byBjcmVhdGUgYSBsb2NhbCBHT1QgZW50cnkgaGVyZTsgdGhlCi0JICAgY2FsY3VsYXRpb24gZm9yIGEgbG9jYWwgR09UMTYgZW50cnkgZG9lcyBub3QgaW52b2x2ZSBHLiAgKi8KLQlicmVhazsKLSAgICAgIGVsc2UKLQl7Ci0JICBnID0gbWlwc19lbGZfbG9jYWxfZ290X2luZGV4IChhYmZkLCBpbmZvLCBzeW1ib2wgKyBhZGRlbmQpOwotCSAgaWYgKGcgPT0gKGJmZF92bWEpIC0xKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBDb252ZXJ0IEdPVCBpbmRpY2VzIHRvIGFjdHVhbCBvZmZzZXRzLiAgKi8KLSAgICAgIGcgPSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXggKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkgIGFiZmQsIGcpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19ISTE2OgotICAgIGNhc2UgUl9NSVBTX0xPMTY6Ci0gICAgY2FzZSBSX01JUFNfR1BSRUwxNjoKLSAgICBjYXNlIFJfTUlQU19HUFJFTDMyOgotICAgIGNhc2UgUl9NSVBTX0xJVEVSQUw6Ci0gICAgICBncDAgPSBfYmZkX2dldF9ncF92YWx1ZSAoaW5wdXRfYmZkKTsKLSAgICAgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIHJlbG9jYXRpb24gaXMgYmVpbmcgcGVyZm9ybWVkLiAgKi8KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9NSVBTX05PTkU6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gICAgY2FzZSBSX01JUFNfMTY6Ci0gICAgICB2YWx1ZSA9IHN5bWJvbCArIG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQsIDE2KTsKLSAgICAgIG92ZXJmbG93ZWRfcCA9IG1pcHNfZWxmX292ZXJmbG93X3AgKHZhbHVlLCAxNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTXzMyOgotICAgIGNhc2UgUl9NSVBTX1JFTDMyOgotICAgIGNhc2UgUl9NSVBTXzY0OgotICAgICAgaWYgKChpbmZvLT5zaGFyZWQKLQkgICB8fCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgICAgICAgJiYgaCAhPSBOVUxMCi0JICAgICAgICYmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikKLQkJICAgPT0gMCkpKQotCSAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXsKLQkgIC8qIElmIHdlJ3JlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIG9yIHRoaXMgcmVsb2NhdGlvbiBpcwotCSAgICAgYWdhaW5zdCBhIHN5bWJvbCBpbiBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHdlIGNhbid0IGtub3cKLQkgICAgIHdoZXJlIHRoZSBzeW1ib2wgd2lsbCBlbmQgdXAuICBTbywgd2UgY3JlYXRlIGEgcmVsb2NhdGlvbgotCSAgICAgcmVjb3JkIGluIHRoZSBvdXRwdXQsIGFuZCBsZWF2ZSB0aGUgam9iIHVwIHRvIHRoZSBkeW5hbWljCi0JICAgICBsaW5rZXIuICAqLwotCSAgdmFsdWUgPSBhZGRlbmQ7Ci0JICBpZiAoIW1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3JlbG9jYXRpb24gKGFiZmQsIAotCQkJCQkJICAgaW5mbywgCi0JCQkJCQkgICByZWxvY2F0aW9uLAotCQkJCQkJICAgaCwKLQkJCQkJCSAgIHNlYywKLQkJCQkJCSAgIHN5bWJvbCwKLQkJCQkJCSAgICZ2YWx1ZSwKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChyX3R5cGUgIT0gUl9NSVBTX1JFTDMyKQotCSAgICB2YWx1ZSA9IHN5bWJvbCArIGFkZGVuZDsKLQkgIGVsc2UKLQkgICAgdmFsdWUgPSBhZGRlbmQ7Ci0JfQotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19QQzMyOgotICAgIGNhc2UgUl9NSVBTX1BDNjQ6Ci0gICAgY2FzZSBSX01JUFNfR05VX1JFTF9MTzE2OgotICAgICAgdmFsdWUgPSBzeW1ib2wgKyBhZGRlbmQgLSBwOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19HTlVfUkVMMTZfUzI6Ci0gICAgICB2YWx1ZSA9IHN5bWJvbCArIG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQgPDwgMiwgMTgpIC0gcDsKLSAgICAgIG92ZXJmbG93ZWRfcCA9IG1pcHNfZWxmX292ZXJmbG93X3AgKHZhbHVlLCAxOCk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA+PiAyKSAmIGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfR05VX1JFTF9ISTE2OgotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoIChhZGRlbmQgKyBzeW1ib2wgLSBwKTsKLSAgICAgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFMxNl8yNjoKLSAgICAgIC8qIFRoZSBjYWxjdWxhdGlvbiBmb3IgUl9NSVBTXzI2IGlzIGp1c3QgdGhlIHNhbWUgYXMgZm9yIGFuCi0JIFJfTUlQU18yNi4gIEl0J3Mgb25seSB0aGUgc3RvcmFnZSBvZiB0aGUgcmVsb2NhdGVkIGZpZWxkIGludG8KLQkgdGhlIG91dHB1dCBmaWxlIHRoYXQncyBkaWZmZXJlbnQuICBUaGF0J3MgaGFuZGxlZCBpbgotCSBtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24uICBTbywgd2UganVzdCBmYWxsIHRocm91Z2ggdG8gdGhlCi0JIFJfTUlQU18yNiBjYXNlIGhlcmUuICAqLwotICAgIGNhc2UgUl9NSVBTXzI2OgotICAgICAgaWYgKGxvY2FsX3ApCi0JdmFsdWUgPSAoKChhZGRlbmQgPDwgMikgfCAocCAmIDB4ZjAwMDAwMDApKSArIHN5bWJvbCkgPj4gMjsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IChtaXBzX2VsZl9zaWduX2V4dGVuZCAoYWRkZW5kIDw8IDIsIDI4KSArIHN5bWJvbCkgPj4gMjsKLSAgICAgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfSEkxNjoKLSAgICAgIGlmICghZ3BfZGlzcF9wKQotCXsKLQkgIHZhbHVlID0gbWlwc19lbGZfaGlnaCAoYWRkZW5kICsgc3ltYm9sKTsKLQkgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoIChhZGRlbmQgKyBncCAtIHApOwotCSAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0xPMTY6Ci0gICAgICBpZiAoIWdwX2Rpc3BfcCkKLQl2YWx1ZSA9IChzeW1ib2wgKyBhZGRlbmQpICYgaG93dG8tPmRzdF9tYXNrOwotICAgICAgZWxzZQotCXsKLQkgIHZhbHVlID0gYWRkZW5kICsgZ3AgLSBwICsgNDsKLQkgIC8qIFRoZSBNSVBTIEFCSSByZXF1aXJlcyBjaGVja2luZyB0aGUgUl9NSVBTX0xPMTYgcmVsb2NhdGlvbgotCSAgICAgZm9yIG92ZXJmbG93LiAgQnV0LCBvbiwgc2F5LCBJcml4IDUsIHJlbG9jYXRpb25zIGFnYWluc3QKLQkgICAgIF9ncF9kaXNwIGFyZSBub3JtYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgLmNwbG9hZAotCSAgICAgcHNldWRvLW9wLiAgSXQgZ2VuZXJhdGVzIGNvZGUgdGhhdCBub3JtYWxseSBsb29rcyBsaWtlCi0JICAgICB0aGlzOgotCi0JICAgICAgIGx1aSAgICAkZ3AsJWhpKF9ncF9kaXNwKQotCSAgICAgICBhZGRpdSAgJGdwLCRncCwlbG8oX2dwX2Rpc3ApCi0JICAgICAgIGFkZHUgICAkZ3AsJGdwLCR0OQotCi0JICAgICBIZXJlICR0OSBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLAotCSAgICAgYXMgcmVxdWlyZWQgYnkgdGhlIE1JUFMgRUxGIEFCSS4gIFRoZSBSX01JUFNfTE8xNgotCSAgICAgcmVsb2NhdGlvbiBjYW4gZWFzaWx5IG92ZXJmbG93IGluIHRoaXMgc2l0dWF0aW9uLCBidXQgdGhlCi0JICAgICBSX01JUFNfSEkxNiByZWxvY2F0aW9uIHdpbGwgaGFuZGxlIHRoZSBvdmVyZmxvdy4KLQkgICAgIFRoZXJlZm9yZSwgd2UgY29uc2lkZXIgdGhpcyBhIGJ1ZyBpbiB0aGUgTUlQUyBBQkksIGFuZCBkbwotCSAgICAgbm90IGNoZWNrIGZvciBvdmVyZmxvdyBoZXJlLiAgKi8KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0xJVEVSQUw6Ci0gICAgICAvKiBCZWNhdXNlIHdlIGRvbid0IG1lcmdlIGxpdGVyYWwgc2VjdGlvbnMsIHdlIGNhbiBoYW5kbGUgdGhpcwotCSBqdXN0IGxpa2UgUl9NSVBTX0dQUkVMMTYuICBJbiB0aGUgbG9uZyBydW4sIHdlIHNob3VsZCBtZXJnZQotCSBzaGFyZWQgbGl0ZXJhbHMsIGFuZCB0aGVuIHdlIHdpbGwgbmVlZCB0byBhZGRpdGlvbmFsIHdvcmsKLQkgaGVyZS4gICovCi0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0KLSAgICBjYXNlIFJfTUlQUzE2X0dQUkVMOgotICAgICAgLyogVGhlIFJfTUlQUzE2X0dQUkVMIHBlcmZvcm1zIHRoZSBzYW1lIGNhbGN1bGF0aW9uIGFzCi0JIFJfTUlQU19HUFJFTDE2LCBidXQgc3RvcmVzIHRoZSByZWxvY2F0ZWQgYml0cyBpbiBhIGRpZmZlcmVudAotCSBvcmRlci4gIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBoZXJlOyB0aGUKLQkgZGlmZmVyZW5jZXMgYXJlIGhhbmRsZWQgaW4gbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfTUlQU19HUFJFTDE2OgotICAgICAgaWYgKGxvY2FsX3ApCi0JdmFsdWUgPSBtaXBzX2VsZl9zaWduX2V4dGVuZCAoYWRkZW5kLCAxNikgKyBzeW1ib2wgKyBncDAgLSBncDsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQsIDE2KSArIHN5bWJvbCAtIGdwOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX01JUFNfR09UMTY6Ci0gICAgICBpZiAobG9jYWxfcCkKLQl7Ci0JICB2YWx1ZSA9IG1pcHNfZWxmX2dvdDE2X2VudHJ5IChhYmZkLCBpbmZvLCBzeW1ib2wgKyBhZGRlbmQpOwotCSAgaWYgKHZhbHVlID09IChiZmRfdm1hKSAtMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdmFsdWUgCi0JICAgID0gbWlwc19lbGZfZ290X29mZnNldF9mcm9tX2luZGV4IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICAgICAgYWJmZCwKLQkJCQkJICAgICAgdmFsdWUpOwotCSAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQotICAgIGNhc2UgUl9NSVBTX0NBTEwxNjoKLSAgICBjYXNlIFJfTUlQU19HT1RfRElTUDoKLSAgICAgIHZhbHVlID0gZzsKLSAgICAgIG92ZXJmbG93ZWRfcCA9IG1pcHNfZWxmX292ZXJmbG93X3AgKHZhbHVlLCAxNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0dQUkVMMzI6Ci0gICAgICB2YWx1ZSA9IChhZGRlbmQgKyBzeW1ib2wgKyBncDAgLSBncCkgJiBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX1BDMTY6Ci0gICAgICB2YWx1ZSA9IG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQsIDE2KSArIHN5bWJvbCAtIHA7Ci0gICAgICB2YWx1ZSA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSB2YWx1ZSAvIDQpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0gICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotICAgICAgLyogV2UncmUgYWxsb3dlZCB0byBoYW5kbGUgdGhlc2UgdHdvIHJlbG9jYXRpb25zIGlkZW50aWNhbGx5LgotCSBUaGUgZHluYW1pYyBsaW5rZXIgaXMgYWxsb3dlZCB0byBoYW5kbGUgdGhlIENBTEwgcmVsb2NhdGlvbnMKLQkgZGlmZmVyZW50bHkgYnkgY3JlYXRpbmcgYSBsYXp5IGV2YWx1YXRpb24gc3R1Yi4gICovCi0gICAgICB2YWx1ZSA9IGc7Ci0gICAgICB2YWx1ZSA9IG1pcHNfZWxmX2hpZ2ggKHZhbHVlKTsKLSAgICAgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0gICAgY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotICAgICAgdmFsdWUgPSBnICYgaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19HT1RfUEFHRToKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfZ290X3BhZ2UgKGFiZmQsIGluZm8sIHN5bWJvbCArIGFkZGVuZCwgTlVMTCk7Ci0gICAgICBpZiAodmFsdWUgPT0gKGJmZF92bWEpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfZ290X29mZnNldF9mcm9tX2luZGV4IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICAgICAgYWJmZCwKLQkJCQkJICAgICAgdmFsdWUpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX01JUFNfR09UX09GU1Q6Ci0gICAgICBtaXBzX2VsZl9nb3RfcGFnZSAoYWJmZCwgaW5mbywgc3ltYm9sICsgYWRkZW5kLCAmdmFsdWUpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfU1VCOgotICAgICAgdmFsdWUgPSBzeW1ib2wgLSBhZGRlbmQ7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0hJR0hFUjoKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfaGlnaGVyIChhZGRlbmQgKyBzeW1ib2wpOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19ISUdIRVNUOgotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoZXN0IChhZGRlbmQgKyBzeW1ib2wpOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19TQ05fRElTUDoKLSAgICAgIHZhbHVlID0gc3ltYm9sICsgYWRkZW5kIC0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19QSlVNUDoKLSAgICBjYXNlIFJfTUlQU19KQUxSOgotICAgICAgLyogQm90aCBvZiB0aGVzZSBtYXkgYmUgaWdub3JlZC4gIFJfTUlQU19KQUxSIGlzIGFuIG9wdGltaXphdGlvbgotCSBoaW50OyB3ZSBjb3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ5IGhvbm9yaW5nIHRoYXQgaGludC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gICAgY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfTUlQU19HTlVfVlRFTlRSWToKLSAgICAgIC8qIFdlIGRvbid0IGRvIGFueXRoaW5nIHdpdGggdGhlc2UgYXQgcHJlc2VudC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIEFuIHVucmVjb2duaXplZCByZWxvY2F0aW9uIHR5cGUuICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSBWQUxVRSBmb3Igb3VyIGNhbGxlci4gICovCi0gICp2YWx1ZXAgPSB2YWx1ZTsKLSAgcmV0dXJuIG92ZXJmbG93ZWRfcCA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLX0KLQotLyogT2J0YWluIHRoZSBmaWVsZCByZWxvY2F0ZWQgYnkgUkVMT0NBVElPTi4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9vYnRhaW5fY29udGVudHMgKGhvd3RvLCByZWxvY2F0aW9uLCBpbnB1dF9iZmQsIGNvbnRlbnRzKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGJmZF92bWEgeDsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uID0gY29udGVudHMgKyByZWxvY2F0aW9uLT5yX29mZnNldDsKLQotICAvKiBPYnRhaW4gdGhlIGJ5dGVzLiAgKi8KLSAgeCA9IGJmZF9nZXQgKDggKiBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKSwgaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0KLSAgaWYgKChFTEYzMl9SX1RZUEUgKHJlbG9jYXRpb24tPnJfaW5mbykgPT0gUl9NSVBTMTZfMjYKLSAgICAgICB8fCBFTEYzMl9SX1RZUEUgKHJlbG9jYXRpb24tPnJfaW5mbykgPT0gUl9NSVBTMTZfR1BSRUwpCi0gICAgICAmJiBiZmRfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSkKLSAgICAvKiBUaGUgdHdvIDE2LWJpdCB3b3JkcyB3aWxsIGJlIHJldmVyc2VkIG9uIGEgbGl0dGxlLWVuZGlhbgotICAgICAgIHN5c3RlbS4gIFNlZSBtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gZm9yIG1vcmUgZGV0YWlscy4gICovCi0gICAgeCA9ICgoKHggJiAweGZmZmYpIDw8IDE2KSB8ICgoeCAmIDB4ZmZmZjAwMDApID4+IDE2KSk7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLS8qIEl0IGhhcyBiZWVuIGRldGVybWluZWQgdGhhdCB0aGUgcmVzdWx0IG9mIHRoZSBSRUxPQ0FUSU9OIGlzIHRoZQotICAgVkFMVUUuICBVc2UgSE9XVE8gdG8gcGxhY2UgVkFMVUUgaW50byB0aGUgb3V0cHV0IGZpbGUgYXQgdGhlCi0gICBhcHByb3ByaWF0ZSBwb3NpdGlvbi4gIFRoZSBTRUNUSU9OIGlzIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoZQotICAgcmVsb2NhdGlvbiBhcHBsaWVzLiAgSWYgUkVRVUlSRV9KQUxYIGlzIHRydWUsIHRoZW4gdGhlIG9wY29kZSB1c2VkCi0gICBmb3IgdGhlIHJlbG9jYXRpb24gbXVzdCBiZSBlaXRoZXIgSkFMIG9yIEpBTFgsIGFuZCBpdCBpcwotICAgdW5jb25kaXRpb25hbGx5IGNvbnZlcnRlZCB0byBKQUxYLgotCi0gICBSZXR1cm5zIGZhbHNlIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uIChpbmZvLCBob3d0bywgcmVsb2NhdGlvbiwgdmFsdWUsCi0JCQkgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgCi0JCQkgICAgIGNvbnRlbnRzLCByZXF1aXJlX2phbHgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuIHJlcXVpcmVfamFseDsKLXsKLSAgYmZkX3ZtYSB4OwotICBiZmRfYnl0ZSAqbG9jYXRpb247Ci0gIGludCByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbG9jYXRpb24tPnJfaW5mbyk7Ci0KLSAgLyogRmlndXJlIG91dCB3aGVyZSB0aGUgcmVsb2NhdGlvbiBpcyBvY2N1cnJpbmcuICAqLwotICBsb2NhdGlvbiA9IGNvbnRlbnRzICsgcmVsb2NhdGlvbi0+cl9vZmZzZXQ7Ci0KLSAgLyogT2J0YWluIHRoZSBjdXJyZW50IHZhbHVlLiAgKi8KLSAgeCA9IG1pcHNfZWxmX29idGFpbl9jb250ZW50cyAoaG93dG8sIHJlbG9jYXRpb24sIGlucHV0X2JmZCwgY29udGVudHMpOwotCi0gIC8qIENsZWFyIHRoZSBmaWVsZCB3ZSBhcmUgc2V0dGluZy4gICovCi0gIHggJj0gfmhvd3RvLT5kc3RfbWFzazsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBSX01JUFMxNl8yNiByZWxvY2F0aW9uLCB3ZSBtdXN0IHN0b3JlIHRoZQotICAgICB2YWx1ZSBpbiBhIGZ1bm55IHdheS4gICovCi0gIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfMjYpCi0gICAgewotICAgICAgLyogUl9NSVBTMTZfMjYgaXMgdXNlZCBmb3IgdGhlIG1pcHMxNiBqYWwgYW5kIGphbHggaW5zdHJ1Y3Rpb25zLgotCSBNb3N0IG1pcHMxNiBpbnN0cnVjdGlvbnMgYXJlIDE2IGJpdHMsIGJ1dCB0aGVzZSBpbnN0cnVjdGlvbnMKLQkgYXJlIDMyIGJpdHMuCi0KLQkgVGhlIGZvcm1hdCBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgaXM6Ci0KLQkgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAhICAgICBKQUxYICAgICAhIFghICAgSW1tIDIwOjE2ICAhICAgSW1tIDI1OjIxICAhCi0JICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgIQkgIAkgIEltbWVkaWF0ZSAgMTU6MAkJICAgICEKLQkgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAKLQkgSkFMWCBpcyB0aGUgNS1iaXQgdmFsdWUgMDAwMTEuICBYIGlzIDAgZm9yIGphbCwgMSBmb3IgamFseC4KLQkgTm90ZSB0aGF0IHRoZSBpbW1lZGlhdGUgdmFsdWUgaW4gdGhlIGZpcnN0IHdvcmQgaXMgc3dhcHBlZC4KLQotCSBXaGVuIHByb2R1Y2luZyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSwgUl9NSVBTMTZfMjYgaXMKLQkgaGFuZGxlZCBtb3N0bHkgbGlrZSBSX01JUFNfMjYuICBJbiBwYXJ0aWN1bGFyLCB0aGUgYWRkZW5kIGlzCi0JIHN0b3JlZCBhcyBhIHN0cmFpZ2h0IDI2LWJpdCB2YWx1ZSBpbiBhIDMyLWJpdCBpbnN0cnVjdGlvbi4KLQkgKGdhcyBtYWtlcyBsaWZlIHNpbXBsZXIgZm9yIGl0c2VsZiBieSBuZXZlciBhZGp1c3RpbmcgYQotCSBSX01JUFMxNl8yNiByZWxvYyB0byBiZSBhZ2FpbnN0IGEgc2VjdGlvbiwgc28gdGhlIGFkZGVuZCBpcwotCSBhbHdheXMgemVybykuICBIb3dldmVyLCB0aGUgMzIgYml0IGluc3RydWN0aW9uIGlzIHN0b3JlZCBhcyAyCi0JIDE2LWJpdCB2YWx1ZXMsIHJhdGhlciB0aGFuIGEgc2luZ2xlIDMyLWJpdCB2YWx1ZS4gIEluIGEKLQkgYmlnLWVuZGlhbiBmaWxlLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lOyBpbiBhIGxpdHRsZS1lbmRpYW4KLQkgZmlsZSwgdGhlIHR3byAxNi1iaXQgaGFsdmVzIG9mIHRoZSAzMiBiaXQgdmFsdWUgYXJlIHN3YXBwZWQuCi0JIFRoaXMgaXMgc28gdGhhdCBhIGRpc2Fzc2VtYmxlciBjYW4gcmVjb2duaXplIHRoZSBqYWwKLQkgaW5zdHJ1Y3Rpb24uCi0KLQkgV2hlbiBkb2luZyBhIGZpbmFsIGxpbmssIFJfTUlQUzE2XzI2IGlzIHRyZWF0ZWQgYXMgYSAzMiBiaXQKLQkgaW5zdHJ1Y3Rpb24gc3RvcmVkIGFzIHR3byAxNi1iaXQgdmFsdWVzLiAgVGhlIGFkZGVuZCBBIGlzIHRoZQotCSBjb250ZW50cyBvZiB0aGUgdGFyZzI2IGZpZWxkLiAgVGhlIGNhbGN1bGF0aW9uIGlzIHRoZSBzYW1lIGFzCi0JIFJfTUlQU18yNi4gIFdoZW4gc3RvcmluZyB0aGUgY2FsY3VsYXRlZCB2YWx1ZSwgcmVvcmRlciB0aGUKLQkgaW1tZWRpYXRlIHZhbHVlIGFzIHNob3duIGFib3ZlLCBhbmQgZG9uJ3QgZm9yZ2V0IHRvIHN0b3JlIHRoZQotCSB2YWx1ZSBhcyB0d28gMTYtYml0IHZhbHVlcy4KLQotCSBUbyBwdXQgaXQgaW4gTUlQUyBBQkkgdGVybXMsIHRoZSByZWxvY2F0aW9uIGZpZWxkIGlzIFQtdGFyZzI2LTE2LAotCSBkZWZpbmVkIGFzCi0JIAotCSBiaWctZW5kaWFuOgotCSArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8Ci0JIHwgICAgICAgIHwgICAgdGFyZzI2LTE2ICAgICAgICAgfAotCSB8MzEgICAgMjZ8MjUgICAgICAgICAgICAgICAgICAgMHwKLQkgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JIAotCSBsaXR0bGUtZW5kaWFuOgotCSArLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLSsKLQkgfCAgICAgICAgICB8ICAgICAgfCAgICAgICAgICAgICB8Ci0JIHwgIHN1YjEgICAgfCAgICAgIHwgICAgIHN1YjIgICAgfAotCSB8MCAgICAgICAgOXwxMCAgMTV8MTYgICAgICAgICAzMXwKLQkgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JIHdoZXJlIHRhcmcyNi0xNiBpcyBzdWIxIGZvbGxvd2VkIGJ5IHN1YjIgKGkuZS4sIHRoZSBhZGRlbmQgZmllbGQgQSBpcwotCSAoKHN1YjEgPDwgMTYpIHwgc3ViMikpLgotCSAKLQkgV2hlbiBwcm9kdWNpbmcgYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUsIHRoZSBjYWxjdWxhdGlvbiBpcwotCSAoKChBIDwgMikgfCAoUCAmIDB4ZjAwMDAwMDApICsgUykgPj4gMikKLQkgV2hlbiBwcm9kdWNpbmcgYSBmdWxseSBsaW5rZWQgZmlsZSwgdGhlIGNhbGN1bGF0aW9uIGlzCi0JIGxldCBSID0gKCgoQSA8IDIpIHwgKFAgJiAweGYwMDAwMDAwKSArIFMpID4+IDIpCi0JICgoUiAmIDB4MWYwMDAwKSA8PCA1KSB8ICgoUiAmIDB4M2UwMDAwMCkgPj4gNSkgfCAoUiAmIDB4ZmZmZikgICovCi0KLSAgICAgIGlmICghaW5mby0+cmVsb2NhdGVhYmxlKQotCS8qIFNodWZmbGUgdGhlIGJpdHMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhIGFib3ZlLiAgKi8KLQl2YWx1ZSA9ICgoKHZhbHVlICYgMHgxZjAwMDApIDw8IDUpIAotCQkgfCAoKHZhbHVlICYgMHgzZTAwMDAwKSA+PiA1KSAKLQkJIHwgKHZhbHVlICYgMHhmZmZmKSk7Ci0gICAgICAKLSAgICB9Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl9HUFJFTCkKLSAgICB7Ci0gICAgICAvKiBSX01JUFMxNl9HUFJFTCBpcyB1c2VkIGZvciBHUC1yZWxhdGl2ZSBhZGRyZXNzaW5nIGluIG1pcHMxNgotCSBtb2RlLiAgQSB0eXBpY2FsIGluc3RydWN0aW9uIHdpbGwgaGF2ZSBhIGZvcm1hdCBsaWtlIHRoaXM6Ci0KLQkgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAhICAgIEVYVEVORCAgICAhICAgICBJbW0gMTA6NSAgICAhICAgSW1tIDE1OjExICAhCi0JICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgISAgICBNYWpvciAgICAgISAgIHJ4ICAgISAgIHJ5ICAgISAgIEltbSAgNDowICAgIQotCSArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JIAotCSBFWFRFTkQgaXMgdGhlIGZpdmUgYml0IHZhbHVlIDExMTEwLiAgTWFqb3IgaXMgdGhlIGluc3RydWN0aW9uCi0JIG9wY29kZS4KLQkgCi0JIFRoaXMgaXMgaGFuZGxlZCBleGFjdGx5IGxpa2UgUl9NSVBTX0dQUkVMMTYsIGV4Y2VwdCB0aGF0IHRoZQotCSBhZGRlbmQgaXMgcmV0cmlldmVkIGFuZCBzdG9yZWQgYXMgc2hvd24gaW4gdGhpcyBkaWFncmFtOyB0aGF0Ci0JIGlzLCB0aGUgSW1tIGZpZWxkcyBhYm92ZSByZXBsYWNlIHRoZSBWLXJlbDE2IGZpZWxkLiAgCi0KLSAgICAgICAgIEFsbCB3ZSBuZWVkIHRvIGRvIGhlcmUgaXMgc2h1ZmZsZSB0aGUgYml0cyBhcHByb3ByaWF0ZWx5LiAgQXMKLQkgYWJvdmUsIHRoZSB0d28gMTYtYml0IGhhbHZlcyBtdXN0IGJlIHN3YXBwZWQgb24gYQotCSBsaXR0bGUtZW5kaWFuIHN5c3RlbS4gICovCi0gICAgICB2YWx1ZSA9ICgoKHZhbHVlICYgMHg3ZTApIDw8IDE2KQotCSAgICAgICB8ICgodmFsdWUgJiAweGY4MDApIDw8IDUpCi0JICAgICAgIHwgKHZhbHVlICYgMHgxZikpOwotICAgIH0KLQotICAvKiBTZXQgdGhlIGZpZWxkLiAgKi8KLSAgeCB8PSAodmFsdWUgJiBob3d0by0+ZHN0X21hc2spOwotCi0gIC8qIElmIHJlcXVpcmVkLCB0dXJuIEpBTCBpbnRvIEpBTFguICAqLwotICBpZiAocmVxdWlyZV9qYWx4KQotICAgIHsKLSAgICAgIGJvb2xlYW4gb2s7Ci0gICAgICBiZmRfdm1hIG9wY29kZSA9IHggPj4gMjY7Ci0gICAgICBiZmRfdm1hIGphbHhfb3Bjb2RlOwotCi0gICAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIG9wY29kZSBpcyBhbHJlYWR5IEpBTCBvciBKQUxYLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfMjYpCi0JewotCSAgb2sgPSAoKG9wY29kZSA9PSAweDYpIHx8IChvcGNvZGUgPT0gMHg3KSk7Ci0JICBqYWx4X29wY29kZSA9IDB4NzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb2sgPSAoKG9wY29kZSA9PSAweDMpIHx8IChvcGNvZGUgPT0gMHgxZCkpOwotCSAgamFseF9vcGNvZGUgPSAweDFkOwotCX0KLQotICAgICAgLyogSWYgdGhlIG9wY29kZSBpcyBub3QgSkFMIG9yIEpBTFgsIHRoZXJlJ3MgYSBwcm9ibGVtLiAgKi8KLSAgICAgIGlmICghb2spCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogJXMrMHglbHg6IGp1bXAgdG8gc3R1YiByb3V0aW5lIHdoaWNoIGlzIG5vdCBqYWwiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgICBpbnB1dF9zZWN0aW9uLT5uYW1lLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbG9jYXRpb24tPnJfb2Zmc2V0KTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogTWFrZSB0aGlzIHRoZSBKQUxYIG9wY29kZS4gICovCi0gICAgICB4ID0gKHggJiB+KDB4M2YgPDwgMjYpKSB8IChqYWx4X29wY29kZSA8PCAyNik7Ci0gICAgfQotCi0gIC8qIFN3YXAgdGhlIGhpZ2gtIGFuZCBsb3ctb3JkZXIgMTYgYml0cyBvbiBsaXR0bGUtZW5kaWFuIHN5c3RlbXMKLSAgICAgd2hlbiBkb2luZyBhIE1JUFMxNiByZWxvY2F0aW9uLiAgKi8KLSAgaWYgKChyX3R5cGUgPT0gUl9NSVBTMTZfR1BSRUwgfHwgcl90eXBlID09IFJfTUlQUzE2XzI2KQotICAgICAgJiYgYmZkX2xpdHRsZV9lbmRpYW4gKGlucHV0X2JmZCkpCi0gICAgeCA9ICgoKHggJiAweGZmZmYpIDw8IDE2KSB8ICgoeCAmIDB4ZmZmZjAwMDApID4+IDE2KSk7Ci0gIAotICAvKiBQdXQgdGhlIHZhbHVlIGludG8gdGhlIG91dHB1dC4gICovCi0gIGJmZF9wdXQgKDggKiBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKSwgaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIHRydWUgaWYgU0VDVElPTiBpcyBhIE1JUFMxNiBzdHViIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfc3R1Yl9zZWN0aW9uX3AgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgY29uc3QgY2hhciAqbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKTsKLQotICByZXR1cm4gKHN0cm5jbXAgKG5hbWUsIEZOX1NUVUIsIHNpemVvZiBGTl9TVFVCIC0gMSkgPT0gMAotCSAgfHwgc3RybmNtcCAobmFtZSwgQ0FMTF9TVFVCLCBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgPT0gMAotCSAgfHwgc3RybmNtcCAobmFtZSwgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgTUlQUyBFTEYgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCWNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLSAgYmZkX3ZtYSBhZGRlbmQgPSAwOwotICBib29sZWFuIHVzZV9zYXZlZF9hZGRlbmRfcCA9IGZhbHNlOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKTsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsOwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyArK3JlbCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYm9vbGVhbiByZXF1aXJlX2phbHg7Ci0gICAgICAvKiBUcnVlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGEgUkVMQSByZWxvY2F0aW9uLCByYXRoZXIgdGhhbiBhCi0gICAgICAgICBSRUwgcmVsb2NhdGlvbi4gICovCi0gICAgICBib29sZWFuIHJlbGFfcmVsb2NhdGlvbl9wID0gdHJ1ZTsKLSAgICAgIGludCByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgLyogRmluZCB0aGUgcmVsb2NhdGlvbiBob3d0byBmb3IgdGhpcyByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTXzY0ICYmICFBQklfNjRfUCAob3V0cHV0X2JmZCkpCi0JewotCSAgLyogU29tZSAzMi1iaXQgY29kZSB1c2VzIFJfTUlQU182NC4gIEluIHBhcnRpY3VsYXIsIHBlb3BsZSB1c2UKLQkgICAgIDY0LWJpdCBjb2RlLCBidXQgbWFrZSBzdXJlIGFsbCB0aGVpciBhZGRyZXNzZXMgYXJlIGluIHRoZSAKLQkgICAgIGxvd2VybW9zdCBvciB1cHBlcm1vc3QgMzItYml0IHNlY3Rpb24gb2YgdGhlIDY0LWJpdCBhZGRyZXNzCi0JICAgICBzcGFjZS4gIFRodXMsIHdoZW4gdGhleSB1c2UgYW4gUl9NSVBTXzY0IHRoZXkgbWVhbiB3aGF0IGlzCi0JICAgICB1c3VhbGx5IG1lYW50IGJ5IFJfTUlQU18zMiwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlCi0JICAgICBzdG9yZWQgdmFsdWUgaXMgc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzLiAgKi8KLQkgIGhvd3RvID0gZWxmX21pcHNfaG93dG9fdGFibGUgKyBSX01JUFNfMzI7Ci0KLQkgIC8qIE9uIGJpZy1lbmRpYW4gc3lzdGVtcywgd2UgbmVlZCB0byBsaWUgYWJvdXQgdGhlIHBvc2l0aW9uCi0JICAgICBvZiB0aGUgcmVsb2MuICAqLwotCSAgaWYgKGJmZF9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCSAgICAgIHJlbC0+cl9vZmZzZXQgKz0gNDsKLQl9Ci0gICAgICBlbHNlCi0JaG93dG8gPSBtaXBzX3J0eXBlX3RvX2hvd3RvIChyX3R5cGUpOwotCi0gICAgICBpZiAoIXVzZV9zYXZlZF9hZGRlbmRfcCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLQotCSAgLyogSWYgdGhlc2UgcmVsb2NhdGlvbnMgd2VyZSBvcmlnaW5hbGx5IG9mIHRoZSBSRUwgdmFyaWV0eSwKLQkgICAgIHdlIG11c3QgcHVsbCB0aGUgYWRkZW5kIG91dCBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlCi0JICAgICByZWxvY2F0ZWQuICBPdGhlcndpc2UsIHdlIHNpbXBseSB1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZQotCSAgICAgUkVMQSByZWxvY2F0aW9uLiAgVG8gZGV0ZXJtaW5lIHdoaWNoIGZsYXZvciBvciByZWxvY2F0aW9uCi0JICAgICB0aGlzIGlzLCB3ZSBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCB0aGUgSU5QVVRfU0VDVElPTidzCi0JICAgICBSRUxfSERSIGlzIHJlYWQgYmVmb3JlIGl0cyBSRUxfSERSMi4gICovCi0JICByZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyOwotCSAgaWYgKChzaXplX3QpIChyZWwgLSByZWxvY3MpCi0JICAgICAgPj0gKHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplCi0JCSAgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsKSkKLQkgICAgcmVsX2hkciA9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyMjsKLQkgIGlmIChyZWxfaGRyLT5zaF9lbnRzaXplID09IE1JUFNfRUxGX1JFTF9TSVpFIChpbnB1dF9iZmQpKQotCSAgICB7Ci0JICAgICAgLyogTm90ZSB0aGF0IHRoaXMgaXMgYSBSRUwgcmVsb2NhdGlvbi4gICovCi0JICAgICAgcmVsYV9yZWxvY2F0aW9uX3AgPSBmYWxzZTsKLQotCSAgICAgIC8qIEdldCB0aGUgYWRkZW5kLCB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIGlucHV0IGZpbGUuICAqLwotCSAgICAgIGFkZGVuZCA9IG1pcHNfZWxmX29idGFpbl9jb250ZW50cyAoaG93dG8sIAotCQkJCQkJIHJlbCwKLQkJCQkJCSBpbnB1dF9iZmQsCi0JCQkJCQkgY29udGVudHMpOwotCSAgICAgIGFkZGVuZCAmPSBob3d0by0+c3JjX21hc2s7Ci0KLQkgICAgICAvKiBGb3Igc29tZSBraW5kcyBvZiByZWxvY2F0aW9ucywgdGhlIEFEREVORCBpcyBhCi0JCSBjb21iaW5hdGlvbiBvZiB0aGUgYWRkZW5kIHN0b3JlZCBpbiB0d28gZGlmZmVyZW50Ci0JCSByZWxvY2F0aW9ucy4gICAqLwotCSAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTX0hJMTYKLQkJICB8fCByX3R5cGUgPT0gUl9NSVBTX0dOVV9SRUxfSEkxNgotCQkgIHx8IChyX3R5cGUgPT0gUl9NSVBTX0dPVDE2Ci0JCSAgICAgICYmIG1pcHNfZWxmX2xvY2FsX3JlbG9jYXRpb25fcCAoaW5wdXRfYmZkLCByZWwsCi0JCQkJCQkgICAgICBsb2NhbF9zZWN0aW9ucykpKQotCQl7Ci0JCSAgYmZkX3ZtYSBsOwotCQkgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpsbzE2X3JlbG9jYXRpb247Ci0JCSAgcmVsb2NfaG93dG9fdHlwZSAqbG8xNl9ob3d0bzsKLQkJICBpbnQgbG87Ci0KLQkJICAvKiBUaGUgY29tYmluZWQgdmFsdWUgaXMgdGhlIHN1bSBvZiB0aGUgSEkxNiBhZGRlbmQsCi0JCSAgICAgbGVmdC1zaGlmdGVkIGJ5IHNpeHRlZW4gYml0cywgYW5kIHRoZSBMTzE2Ci0JCSAgICAgYWRkZW5kLCBzaWduIGV4dGVuZGVkLiAgKFVzdWFsbHksIHRoZSBjb2RlIGRvZXMKLQkJICAgICBhIGBsdWknIG9mIHRoZSBISTE2IHZhbHVlLCBhbmQgdGhlbiBhbiBgYWRkaXUnIG9mCi0JCSAgICAgdGhlIExPMTYgdmFsdWUuKSAgCi0KLQkJICAgICBTY2FuIGFoZWFkIHRvIGZpbmQgYSBtYXRjaGluZyBMTzE2IHJlbG9jYXRpb24uICAqLwotCQkgIGlmIChyX3R5cGUgPT0gUl9NSVBTX0dOVV9SRUxfSEkxNikKLQkJICAgIGxvID0gUl9NSVBTX0dOVV9SRUxfTE8xNjsKLQkJICBlbHNlCi0JCSAgICBsbyA9IFJfTUlQU19MTzE2OwotCQkgIGxvMTZfcmVsb2NhdGlvbiAKLQkJICAgID0gbWlwc19lbGZfbmV4dF9yZWxvY2F0aW9uIChsbywgcmVsLCByZWxlbmQpOyAKLQkJICBpZiAobG8xNl9yZWxvY2F0aW9uID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAvKiBPYnRhaW4gdGhlIGFkZGVuZCBrZXB0IHRoZXJlLiAgKi8KLQkJICBsbzE2X2hvd3RvID0gbWlwc19ydHlwZV90b19ob3d0byAobG8pOwotCQkgIGwgPSBtaXBzX2VsZl9vYnRhaW5fY29udGVudHMgKGxvMTZfaG93dG8sCi0JCQkJCQlsbzE2X3JlbG9jYXRpb24sCi0JCQkJCQlpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLQkJICBsICY9IGxvMTZfaG93dG8tPnNyY19tYXNrOwotCQkgIGwgPSBtaXBzX2VsZl9zaWduX2V4dGVuZCAobCwgMTYpOwotCi0JCSAgYWRkZW5kIDw8PSAxNjsKLQotCQkgIC8qIENvbXB1dGUgdGhlIGNvbWJpbmVkIGFkZGVuZC4gICovCi0JCSAgYWRkZW5kICs9IGw7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfR1BSRUwpCi0JCXsKLQkJICAvKiBUaGUgYWRkZW5kIGlzIHNjcmFtYmxlZCBpbiB0aGUgb2JqZWN0IGZpbGUuICBTZWUKLQkJICAgICBtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gZm9yIGRldGFpbHMgb24gdGhlCi0JCSAgICAgZm9ybWF0LiAgKi8KLQkJICBhZGRlbmQgPSAoKChhZGRlbmQgJiAweDFmMDAwMCkgPj4gNSkKLQkJCSAgICB8ICgoYWRkZW5kICYgMHg3ZTAwMDAwKSA+PiAxNikKLQkJCSAgICB8IChhZGRlbmQgJiAweDFmKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCX0KLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0JICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCi0JICBpZiAocl90eXBlID09IFJfTUlQU182NCAmJiAhQUJJXzY0X1AgKG91dHB1dF9iZmQpCi0JICAgICAgJiYgYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JICAgIHJlbC0+cl9vZmZzZXQgLT0gNDsKLQotCSAgLyogU2luY2Ugd2UncmUganVzdCByZWxvY2F0aW5nLCBhbGwgd2UgbmVlZCB0byBkbyBpcyBjb3B5Ci0JICAgICB0aGUgcmVsb2NhdGlvbnMgYmFjayBvdXQgdG8gdGhlIG9iamVjdCBmaWxlLCB1bmxlc3MKLQkgICAgIHRoZXkncmUgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQKLQkgICAgIHRvIGFkanVzdCBieSB0aGUgc2VjdGlvbiBvZmZzZXQsIG9yIHVubGVzcyB0aGV5J3JlIEdQCi0JICAgICByZWxhdGl2ZSBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gYWRqdXN0IGJ5IHRoZSBhbW91bnQKLQkgICAgIHRoYXQgd2UncmUgYWRqdXN0aW5nIEdQIGluIHRoaXMgcmVsb2NhdGVhYmxlIG9iamVjdC4gICovCi0KLQkgIGlmICghbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wIChpbnB1dF9iZmQsIHJlbCwgbG9jYWxfc2VjdGlvbnMpKQotCSAgICAvKiBUaGVyZSdzIG5vdGhpbmcgdG8gZG8gZm9yIG5vbi1sb2NhbCByZWxvY2F0aW9ucy4gICovCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAocl90eXBlID09IFJfTUlQUzE2X0dQUkVMIAotCSAgICAgIHx8IHJfdHlwZSA9PSBSX01JUFNfR1BSRUwxNgotCSAgICAgIHx8IHJfdHlwZSA9PSBSX01JUFNfR1BSRUwzMgotCSAgICAgIHx8IHJfdHlwZSA9PSBSX01JUFNfTElURVJBTCkKLQkgICAgYWRkZW5kIC09IChfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCkKLQkJICAgICAgIC0gX2JmZF9nZXRfZ3BfdmFsdWUgKGlucHV0X2JmZCkpOwotCSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQU18yNiB8fCByX3R5cGUgPT0gUl9NSVBTMTZfMjYKLQkJICAgfHwgcl90eXBlID09IFJfTUlQU19HTlVfUkVMMTZfUzIpCi0JICAgIC8qIFRoZSBhZGRlbmQgaXMgc3RvcmVkIHdpdGhvdXQgaXRzIHR3byBsZWFzdAotCSAgICAgICBzaWduaWZpY2FudCBiaXRzICh3aGljaCBhcmUgYWx3YXlzIHplcm8uKSAgSW4gYQotCSAgICAgICBub24tcmVsb2NhdGVhYmxlIGxpbmssIGNhbGN1bGF0ZV9yZWxvY2F0aW9uIHdpbGwgZG8KLQkgICAgICAgdGhpcyBzaGlmdDsgaGVyZSwgd2UgbXVzdCBkbyBpdCBvdXJzZWx2ZXMuICAqLwotCSAgICBhZGRlbmQgPDw9IDI7Ci0KLQkgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkgICAgLyogQWRqdXN0IHRoZSBhZGRlbmQgYXBwcm9wcmlhdGVseS4gICovCi0JICAgIGFkZGVuZCArPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF0tPm91dHB1dF9vZmZzZXQ7Ci0JICAKLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIFJfTUlQU19ISTE2IG9yIFJfTUlQU19HT1QxNiwKLQkgICAgIHRoZW4gd2Ugb25seSB3YW50IHRvIHdyaXRlIG91dCB0aGUgaGlnaC1vcmRlciAxNiBiaXRzLgotCSAgICAgVGhlIHN1YnNlcXVlbnQgUl9NSVBTX0xPMTYgd2lsbCBoYW5kbGUgdGhlIGxvdy1vcmRlciBiaXRzLiAgKi8KLQkgIGlmIChyX3R5cGUgPT0gUl9NSVBTX0hJMTYgfHwgcl90eXBlID09IFJfTUlQU19HT1QxNgotCSAgICAgIHx8IHJfdHlwZSA9PSBSX01JUFNfR05VX1JFTF9ISTE2KQotCSAgICBhZGRlbmQgPSBtaXBzX2VsZl9oaWdoIChhZGRlbmQpOwotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGFuIFJfTUlQU18yNiByZWxvY2F0aW9uLCB0aGVuCi0JICAgICB0aGUgdHdvIGxvdy1vcmRlciBiaXRzIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBvYmplY3QgZmlsZTsKLQkgICAgIHRoZXkgYXJlIGltcGxpY2l0bHkgemVyby4gICovCi0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTXzI2IHx8IHJfdHlwZSA9PSBSX01JUFMxNl8yNgotCQkgICB8fCByX3R5cGUgPT0gUl9NSVBTX0dOVV9SRUwxNl9TMikKLQkgICAgYWRkZW5kID4+PSAyOwotCi0JICBpZiAocmVsYV9yZWxvY2F0aW9uX3ApCi0JICAgIC8qIElmIHRoaXMgaXMgYSBSRUxBIHJlbG9jYXRpb24sIGp1c3QgdXBkYXRlIHRoZSBhZGRlbmQuCi0JICAgICAgIFdlIGhhdmUgdG8gY2FzdCBhd2F5IGNvbnN0bmVzcyBmb3IgUkVMLiAgKi8KLQkgICAgcmVsLT5yX2FkZGVuZCA9IGFkZGVuZDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE90aGVyd2lzZSwgd2UgaGF2ZSB0byB3cml0ZSB0aGUgdmFsdWUgYmFjayBvdXQuICBOb3RlCi0JCSB0aGF0IHdlIHVzZSB0aGUgc291cmNlIG1hc2ssIHJhdGhlciB0aGFuIHRoZQotCQkgZGVzdGluYXRpb24gbWFzayBiZWNhdXNlIHRoZSBwbGFjZSB0byB3aGljaCB3ZSBhcmUKLQkJIHdyaXRpbmcgd2lsbCBiZSBzb3VyY2Ugb2YgdGhlIGFkZGVuZCBpbiB0aGUgZmluYWwKLQkJIGxpbmsuICAqLwotCSAgICAgIGFkZGVuZCAmPSBob3d0by0+c3JjX21hc2s7Ci0KLQkgICAgICBpZiAocl90eXBlID09IFJfTUlQU182NCAmJiAhQUJJXzY0X1AgKG91dHB1dF9iZmQpKQotCQkvKiBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgYWJvdXQgdXNpbmcgUl9NSVBTXzY0IGluIHRoZSAzMi1iaXQKLQkJICAgQUJJLiAgSGVyZSwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGFkZGVuZC4gIEl0IHdvdWxkIGJlCi0JCSAgIHBvc3NpYmxlIHRvIGdldCBhd2F5IHdpdGgganVzdCB1c2luZyB0aGUgUl9NSVBTXzMyIHJlbG9jCi0JCSAgIGJ1dCBmb3IgZW5kaWFubmVzcy4gICovCi0JCXsKLQkJICBiZmRfdm1hIHNpZ25fYml0czsKLQkJICBiZmRfdm1hIGxvd19iaXRzOwotCQkgIGJmZF92bWEgaGlnaF9iaXRzOwotCQkgIAotCQkgIGlmIChhZGRlbmQgJiAweDgwMDAwMDAwdSkKLQkJICAgIHNpZ25fYml0cyA9IDB4ZmZmZmZmZmZ1OwotCQkgIGVsc2UKLQkJICAgIHNpZ25fYml0cyA9IDA7Ci0JCSAgCi0JCSAgLyogSWYgd2UgZG9uJ3Qga25vdyB0aGF0IHdlIGhhdmUgYSA2NC1iaXQgdHlwZSwKLQkJICAgICBkbyB0d28gc2VwYXJhdGUgc3RvcmVzLiAgKi8KLQkJICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFN0b3JlIHRoZSBzaWduLWJpdHMgKHdoaWNoIGFyZSBtb3N0IHNpZ25pZmljYW50KQotCQkJIGZpcnN0LiAgKi8KLQkJICAgICAgbG93X2JpdHMgPSBzaWduX2JpdHM7Ci0JCSAgICAgIGhpZ2hfYml0cyA9IGFkZGVuZDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvd19iaXRzID0gYWRkZW5kOwotCQkgICAgICBoaWdoX2JpdHMgPSBzaWduX2JpdHM7Ci0JCSAgICB9Ci0JCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBsb3dfYml0cywgCi0JCQkgICAgICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaGlnaF9iaXRzLCAKLQkJCSAgICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCArIDQpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpZiAoIW1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5mbywgaG93dG8sIHJlbCwgYWRkZW5kLAotCQkJCQkJaW5wdXRfYmZkLCAgaW5wdXRfc2VjdGlvbiwgCi0JCQkJCQljb250ZW50cywgZmFsc2UpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogR28gb24gdG8gdGhlIG5leHQgcmVsb2NhdGlvbi4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEluIHRoZSBOMzIgYW5kIDY0LWJpdCBBQklzIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBjb25zZWN1dGl2ZQotCSByZWxvY2F0aW9ucyBmb3IgdGhlIHNhbWUgb2Zmc2V0LiAgSW4gdGhhdCBjYXNlIHdlIGFyZQotCSBzdXBwb3NlZCB0byB0cmVhdCB0aGUgb3V0cHV0IG9mIGVhY2ggcmVsb2NhdGlvbiBhcyB0aGUgYWRkZW5kCi0JIGZvciB0aGUgbmV4dC4gICovCi0gICAgICBpZiAocmVsICsgMSA8IHJlbGVuZCAKLQkgICYmIHJlbC0+cl9vZmZzZXQgPT0gcmVsWzFdLnJfb2Zmc2V0Ci0JICAmJiBFTEYzMl9SX1RZUEUgKHJlbFsxXS5yX2luZm8pICE9IFJfTUlQU19OT05FKQotCXVzZV9zYXZlZF9hZGRlbmRfcCA9IHRydWU7Ci0gICAgICBlbHNlCi0JdXNlX3NhdmVkX2FkZGVuZF9wID0gZmFsc2U7Ci0KLSAgICAgIC8qIEZpZ3VyZSBvdXQgd2hhdCB2YWx1ZSB3ZSBhcmUgc3VwcG9zZWQgdG8gcmVsb2NhdGUuICAqLwotICAgICAgc3dpdGNoIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbiAob3V0cHV0X2JmZCwgCi0JCQkJCSAgICAgaW5wdXRfYmZkLAotCQkJCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgaW5mbywKLQkJCQkJICAgICByZWwsCi0JCQkJCSAgICAgYWRkZW5kLAotCQkJCQkgICAgIGhvd3RvLAotCQkJCQkgICAgIGxvY2FsX3N5bXMsCi0JCQkJCSAgICAgbG9jYWxfc2VjdGlvbnMsCi0JCQkJCSAgICAgJnZhbHVlLAotCQkJCQkgICAgICZuYW1lLAotCQkJCQkgICAgICZyZXF1aXJlX2phbHgpKQotCXsKLQljYXNlIGJmZF9yZWxvY19jb250aW51ZToKLQkgIC8qIFRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCi0JICBjb250aW51ZTsKLQotCWNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgIC8qIG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uIGFscmVhZHkgY2FsbGVkIHRoZQotCSAgICAgdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjay4gIFRoZXJlJ3Mgbm8gcmVhbCBwb2ludCBpbgotCSAgICAgdHJ5aW5nIHRvIHBlcmZvcm0gdGhlIHJlbG9jYXRpb24gYXQgdGhpcyBwb2ludCwgc28gd2UKLQkgICAgIGp1c3Qgc2tpcCBhaGVhZCB0byB0aGUgbmV4dCByZWxvY2F0aW9uLiAgKi8KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKHVzZV9zYXZlZF9hZGRlbmRfcCkKLQkgICAgLyogSWdub3JlIG92ZXJmbG93IHVudGlsIHdlIHJlYWNoIHRoZSBsYXN0IHJlbG9jYXRpb24gZm9yCi0JICAgICAgIGEgZ2l2ZW4gbG9jYXRpb24uICAqLwotCSAgICA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwpOwotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSd2ZSBnb3QgYW5vdGhlciByZWxvY2F0aW9uIGZvciB0aGUgYWRkcmVzcywga2VlcCBnb2luZwotCSB1bnRpbCB3ZSByZWFjaCB0aGUgbGFzdCBvbmUuICAqLwotICAgICAgaWYgKHVzZV9zYXZlZF9hZGRlbmRfcCkKLQl7Ci0JICBhZGRlbmQgPSB2YWx1ZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfNjQgJiYgIUFCSV82NF9QIChvdXRwdXRfYmZkKSkKLQkvKiBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgYWJvdXQgdXNpbmcgUl9NSVBTXzY0IGluIHRoZSAzMi1iaXQKLQkgICBBQkkuICBVbnRpbCBub3csIHdlJ3ZlIGJlZW4gdXNpbmcgdGhlIEhPV1RPIGZvciBSX01JUFNfMzI7Ci0JICAgdGhhdCBjYWxjdWxhdGVkIHRoZSByaWdodCB2YWx1ZS4gIE5vdywgaG93ZXZlciwgd2UKLQkgICBzaWduLWV4dGVuZCB0aGUgMzItYml0IHJlc3VsdCB0byA2NC1iaXRzLCBhbmQgc3RvcmUgaXQgYXMgYQotCSAgIDY0LWJpdCB2YWx1ZS4gIFdlIGFyZSBlc3BlY2lhbGx5IGdlbmVyb3VzIGhlcmUgaW4gdGhhdCB3ZQotCSAgIGdvIHRvIGV4dHJlbWUgbGVuZ3RocyB0byBzdXBwb3J0IHRoaXMgdXNhZ2Ugb24gc3lzdGVtcyB3aXRoCi0JICAgb25seSBhIDMyLWJpdCBWTUEuICAqLwotCXsKLQkgIGJmZF92bWEgc2lnbl9iaXRzOwotCSAgYmZkX3ZtYSBsb3dfYml0czsKLQkgIGJmZF92bWEgaGlnaF9iaXRzOwotCi0JICBpZiAodmFsdWUgJiAweDgwMDAwMDAwdSkKLQkgICAgc2lnbl9iaXRzID0gMHhmZmZmZmZmZnU7Ci0JICBlbHNlCi0JICAgIHNpZ25fYml0cyA9IDA7Ci0KLQkgIC8qIElmIHdlIGRvbid0IGtub3cgdGhhdCB3ZSBoYXZlIGEgNjQtYml0IHR5cGUsCi0JICAgICBkbyB0d28gc2VwYXJhdGUgc3RvcmVzLiAgKi8KLQkgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkgICAgewotCSAgICAgIC8qIFVuZG8gd2hhdCB3ZSBkaWQgYWJvdmUuICAqLwotCSAgICAgIHJlbC0+cl9vZmZzZXQgLT0gNDsKLQkgICAgICAvKiBTdG9yZSB0aGUgc2lnbi1iaXRzICh3aGljaCBhcmUgbW9zdCBzaWduaWZpY2FudCkKLQkJIGZpcnN0LiAgKi8KLQkgICAgICBsb3dfYml0cyA9IHNpZ25fYml0czsKLQkgICAgICBoaWdoX2JpdHMgPSB2YWx1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG93X2JpdHMgPSB2YWx1ZTsKLQkgICAgICBoaWdoX2JpdHMgPSBzaWduX2JpdHM7Ci0JICAgIH0KLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgbG93X2JpdHMsIAotCQkgICAgICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBoaWdoX2JpdHMsIAotCQkgICAgICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQgKyA0KTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWN0dWFsbHkgcGVyZm9ybSB0aGUgcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoIW1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5mbywgaG93dG8sIHJlbCwgdmFsdWUsIGlucHV0X2JmZCwgCi0JCQkJCWlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCQlyZXF1aXJlX2phbHgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaG9vayBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBsaW5rZXIgd3JpdGVzIG91dCBhIGdsb2JhbAotICAgc3ltYm9sLiAgV2UgbWFyayBzeW1ib2xzIGFzIHNtYWxsIGNvbW1vbiBpZiBhcHByb3ByaWF0ZS4gIFRoaXMgaXMKLSAgIGFsc28gd2hlcmUgd2UgdW5kbyB0aGUgaW5jcmVtZW50IG9mIHRoZSB2YWx1ZSBmb3IgYSBtaXBzMTYgc3ltYm9sLiAgKi8KLQotLypBUkdTSUdOT1JFRCovCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBuYW1lLCBzeW0sIGlucHV0X3NlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjOwotewotICAvKiBJZiB3ZSBzZWUgYSBjb21tb24gc3ltYm9sLCB3aGljaCBpbXBsaWVzIGEgcmVsb2NhdGFibGUgbGluaywgdGhlbgotICAgICBpZiBhIHN5bWJvbCB3YXMgc21hbGwgY29tbW9uIGluIGFuIGlucHV0IGZpbGUsIG1hcmsgaXQgYXMgc21hbGwKLSAgICAgY29tbW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04KLSAgICAgICYmIHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnNjb21tb24iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19TQ09NTU9OOwotCi0gIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYKLSAgICAgICYmIChzeW0tPnN0X3ZhbHVlICYgMSkgIT0gMCkKLSAgICAtLXN5bS0+c3RfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSKGFiZmQpIAkJXAotICAgKEFCSV9OMzJfUCAoYWJmZCkgPyAiL3Vzci9saWIzMi9saWJjLnNvLjEiIAlcCi0gICAgOiBBQklfNjRfUCAoYWJmZCkgPyAiL3Vzci9saWI2NC9saWJjLnNvLjEiIAlcCi0gICAgOiAiL3Vzci9saWIvbGliYy5zby4xIikKLQotLyogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIGNvbnN0IGNoYXIgKiBjb25zdCAqbmFtZXA7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEIHwgU0VDX1JFQURPTkxZKTsKLQotICAvKiBNaXBzIEFCSSByZXF1ZXN0cyB0aGUgLmR5bmFtaWMgc2VjdGlvbiB0byBiZSByZWFkIG9ubHkuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBjcmVhdGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ3JlYXRlIHRoZSAubXN5bSBzZWN0aW9uIG9uIElSSVg2LiAgSXQgaXMgdXNlZCBieSB0aGUgZHluYW1pYwotICAgICBsaW5rZXIgdG8gc3BlZWQgdXAgZHluYW1pYyByZWxvY2F0aW9ucywgYW5kIHRvIGF2b2lkIGNvbXB1dGluZwotICAgICB0aGUgRUxGIGhhc2ggZm9yIHN5bWJvbHMuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NgotICAgICAgJiYgIW1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24gKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qIENyZWF0ZSAuc3R1YiBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAKLQkJCSAgICAgICBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IE5VTEwpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChhYmZkKSk7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfQ09ERSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywKLQkJCQkJICBNSVBTX0VMRl9MT0dfRklMRV9BTElHTiAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDUKLSAgICAgICYmICFpbmZvLT5zaGFyZWQKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJsZF9tYXAiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJsZF9tYXAiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyAmIH5TRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsCi0JCQkJCSAgTUlQU19FTEZfTE9HX0ZJTEVfQUxJR04gKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE9uIElSSVg1LCB3ZSBhZGp1c3QgYWRkIHNvbWUgYWRkaXRpb25hbCBzeW1ib2xzIGFuZCBjaGFuZ2UgdGhlCi0gICAgIGFsaWdubWVudHMgb2Ygc2V2ZXJhbCBzZWN0aW9ucy4gIFRoZXJlIGlzIG5vIEFCSSBkb2N1bWVudGF0aW9uCi0gICAgIGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIG5lY2Vzc2FyeSBvbiBJUklYNiwgbm9yIGFueSBldmlkZW5jZSB0aGF0Ci0gICAgIHRoZSBsaW5rZXIgdGFrZXMgc3VjaCBhY3Rpb24uICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NSkKLSAgICB7Ci0gICAgICBmb3IgKG5hbWVwID0gbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lczsgKm5hbWVwICE9IE5VTEw7IG5hbWVwKyspCi0JewotCSAgaCA9IE5VTEw7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCAqbmFtZXAsIEJTRl9HTE9CQUwsIGJmZF91bmRfc2VjdGlvbl9wdHIsCi0JCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICBoLT50eXBlID0gU1RUX1NFQ1RJT047Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgLmNvbXBhY3RfcmVsIHNlY3Rpb24uICAqLwotICAgICAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24gKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ2hhbmdlIGFsaWdtZW50cyBvZiBzb21lIHNlY3Rpb25zLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5oYXNoIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zdHIiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVnaW5mbyIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgIH0KLQotICBpZiAoIWluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsICJfRFlOQU1JQ19MSU5LIiwgQlNGX0dMT0JBTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwKLQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICAgICAgaC0+dHlwZSA9IFNUVF9TRUNUSU9OOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQpCi0JewotCSAgLyogX19ybGRfbWFwIGlzIGEgZm91ciBieXRlIHdvcmQgbG9jYXRlZCBpbiB0aGUgLmRhdGEgc2VjdGlvbgotCSAgICAgYW5kIGlzIGZpbGxlZCBpbiBieSB0aGUgcnRsZCB0byBjb250YWluIGEgcG9pbnRlciB0bwotCSAgICAgdGhlIF9yX2RlYnVnIHN0cnVjdHVyZS4gSXRzIHN5bWJvbCB2YWx1ZSB3aWxsIGJlIHNldCBpbgotCSAgICAgbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ybGRfbWFwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0JICBoID0gTlVMTDsKLQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgKGluZm8sIGFiZmQsICJfX3JsZF9tYXAiLCBCU0ZfR0xPQkFMLCBzLAotCQkgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkJICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIC5jb21wYWN0X3JlbCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuY29tcGFjdF9yZWwiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JICAgICAgIHwgU0VDX1JFQURPTkxZKTsKLQotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuY29tcGFjdF9yZWwiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywKLQkJCQkJICBNSVBTX0VMRl9MT0dfRklMRV9BTElHTiAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbiB0byBob2xkIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuICAqLwotICBpZiAobWlwc19lbGZfZ290X3NlY3Rpb24gKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlCi0gICAgIGxpbmtlciBzY3JpcHQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgc3ltYm9sIGlmIHdlCi0gICAgIGFyZSBub3QgY3JlYXRpbmcgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGZpcnN0IHNldmVyYWwgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzIGFyZSByZXNlcnZlZC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IE1JUFNfUkVTRVJWRURfR09UTk8gKiBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCk7Ci0KLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgbWlwc19nb3RfaW5mbykpOwotICBpZiAoZyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZy0+Z2xvYmFsX2dvdHN5bSA9IE5VTEw7Ci0gIGctPmxvY2FsX2dvdG5vID0gTUlQU19SRVNFUlZFRF9HT1ROTzsKLSAgZy0+YXNzaWduZWRfZ290bm8gPSBNSVBTX1JFU0VSVkVEX0dPVE5POwotICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzLT51c2VkX2J5X2JmZCA9Ci0JKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpKTsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50ZGF0YSA9IChQVFIpIGc7Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9mbGFncyAKLSAgICB8PSBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfTUlQU19HUFJFTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyB0aGUgLm1zeW0gc2VjdGlvbiBmb3IgQUJGRCwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QKLSAgIGFscmVhZHkgZXhpc3QuICBSZXR1cm5zIE5VTEwgdG8gaW5kaWNhdGUgZXJyb3IuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWlwc19lbGZfY3JlYXRlX21zeW1fc2VjdGlvbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSk7Ci0gIGlmICghcykgCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSk7Ci0gICAgICBpZiAoIXMKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIAotCQkJCSAgICAgU0VDX0FMTE9DCi0JCQkJICAgICB8IFNFQ19MT0FECi0JCQkJICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVEIAotCQkJCSAgICAgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywKLQkJCQkJIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOIChhYmZkKSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBzOwotfQotCi0vKiBBZGQgcm9vbSBmb3IgTiByZWxvY2F0aW9ucyB0byB0aGUgLnJlbC5keW4gc2VjdGlvbiBpbiBBQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmX2FsbG9jYXRlX2R5bmFtaWNfcmVsb2NhdGlvbnMgKGFiZmQsIG4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IG47Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKGFiZmQpKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgCi0gIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHJvb20gZm9yIGEgbnVsbCBlbGVtZW50LiAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IE1JUFNfRUxGX1JFTF9TSVpFIChhYmZkKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotICBzLT5fcmF3X3NpemUgKz0gbiAqIE1JUFNfRUxGX1JFTF9TSVpFIChhYmZkKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGV4dHN5bW9mZiA9IChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpID8gMCA6IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgLyogQ2hlY2sgZm9yIHRoZSBtaXBzMTYgc3R1YiBzZWN0aW9ucy4gICovCi0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotICBpZiAoc3RybmNtcCAobmFtZSwgRk5fU1RVQiwgc2l6ZW9mIEZOX1NUVUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0KLSAgICAgIC8qIExvb2sgYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCB3aGljaCBzeW1ib2wKLSAgICAgICAgIHRoaXMgaXMgZm9yLiAgKi8KLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NzLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYKLQkgIHx8IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKm87Ci0KLQkgIC8qIFRoaXMgc3R1YiBpcyBmb3IgYSBsb2NhbCBzeW1ib2wuICBUaGlzIHN0dWIgd2lsbCBvbmx5IGJlCi0gICAgICAgICAgICAgbmVlZGVkIGlmIHRoZXJlIGlzIHNvbWUgcmVsb2NhdGlvbiBpbiB0aGlzIEJGRCwgb3RoZXIKLSAgICAgICAgICAgICB0aGFuIGEgMTYgYml0IGZ1bmN0aW9uIGNhbGwsIHdoaWNoIHJlZmVycyB0byB0aGlzIHN5bWJvbC4gICovCi0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpzZWNfcmVsb2NzOwotCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyLCAqcmVuZDsKLQotCSAgICAgIC8qIFdlIGNhbiBpZ25vcmUgc3R1YiBzZWN0aW9ucyB3aGVuIGxvb2tpbmcgZm9yIHJlbG9jcy4gICovCi0JICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCQkgIHx8IG8tPnJlbG9jX2NvdW50ID09IDAKLQkJICB8fCBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksIEZOX1NUVUIsCi0JCQkgICAgICBzaXplb2YgRk5fU1RVQiAtIDEpID09IDAKLQkJICB8fCBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksIENBTExfU1RVQiwKLQkJCSAgICAgIHNpemVvZiBDQUxMX1NUVUIgLSAxKSA9PSAwCi0JCSAgfHwgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCBDQUxMX0ZQX1NUVUIsCi0JCQkgICAgICBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzZWNfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJICAgIChhYmZkLCBvLCAoUFRSKSBOVUxMLAotCQkJICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSAgICAgaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkgICAgICBpZiAoc2VjX3JlbG9jcyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICByZW5kID0gc2VjX3JlbG9jcyArIG8tPnJlbG9jX2NvdW50OwotCSAgICAgIGZvciAociA9IHNlY19yZWxvY3M7IHIgPCByZW5kOyByKyspCi0JCWlmIChFTEYzMl9SX1NZTSAoci0+cl9pbmZvKSA9PSByX3N5bW5keAotCQkgICAgJiYgRUxGMzJfUl9UWVBFIChyLT5yX2luZm8pICE9IFJfTUlQUzE2XzI2KQotCQkgIGJyZWFrOwotCi0JICAgICAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0JCWZyZWUgKHNlY19yZWxvY3MpOwotCi0JICAgICAgaWYgKHIgPCByZW5kKQotCQlicmVhazsKLQkgICAgfQotCi0JICBpZiAobyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgaXMgbm8gbm9uLWNhbGwgcmVsb2MgZm9yIHRoaXMgc3R1Yiwgc28gd2UgZG8KLSAgICAgICAgICAgICAgICAgbm90IG5lZWQgaXQuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucywgd2UKLSAgICAgICAgICAgICAgICAgY2FuIGVhc2lseSBkaXNjYXJkIGl0IGJ5IHNldHRpbmcgdGhlIFNFQ19FWENMVURFCi0gICAgICAgICAgICAgICAgIGZsYWcuICAqLwotCSAgICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgLyogUmVjb3JkIHRoaXMgc3R1YiBpbiBhbiBhcnJheSBvZiBsb2NhbCBzeW1ib2wgc3R1YnMgZm9yCi0gICAgICAgICAgICAgdGhpcyBCRkQuICovCi0JICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfc3R1YnMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgc3ltY291bnQ7Ci0JICAgICAgYXNlY3Rpb24gKipuOwotCi0JICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLQkJc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc3ltdGFiX2hkci0+c2hfZW50c2l6ZTsKLQkgICAgICBlbHNlCi0JCXN5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBuID0gKGFzZWN0aW9uICoqKSBiZmRfemFsbG9jIChhYmZkLAotCQkJCQkgICAgc3ltY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQkgICAgICBpZiAobiA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfc3R1YnMgPSBuOwotCSAgICB9Ci0KLQkgIGVsZl90ZGF0YSAoYWJmZCktPmxvY2FsX3N0dWJzW3Jfc3ltbmR4XSA9IHNlYzsKLQotCSAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZXQgbWlwczE2X3N0dWJzX3NlZW4gaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgIFRoYXQgZmxhZyBpcyB1c2VkIHRvIHNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gbG9vayB0aHJvdWdoCi0gICAgICAgICAgICAgdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUgZm9yIHN0dWJzLiAgV2UgZG9uJ3QgbmVlZCB0byBzZXQKLSAgICAgICAgICAgICBpdCBoZXJlLCBiZWNhdXNlIHdlIGp1c3QgaGF2ZSBhIGxvY2FsIHN0dWIuICAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgICAgIHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKLQotCSAgLyogSCBpcyB0aGUgc3ltYm9sIHRoaXMgc3R1YiBpcyBmb3IuICAqLwotCi0JICBoLT5mbl9zdHViID0gc2VjOwotCSAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPm1pcHMxNl9zdHVic19zZWVuID0gdHJ1ZTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCBDQUxMX1NUVUIsIHNpemVvZiBDQUxMX1NUVUIgLSAxKSA9PSAwCi0JICAgfHwgc3RybmNtcCAobmFtZSwgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICoqbG9jOwotCi0gICAgICAvKiBMb29rIGF0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hpY2ggc3ltYm9sCi0gICAgICAgICB0aGlzIGlzIGZvci4gICovCi0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbG9jcy0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfc3ltbmR4IDwgZXh0c3ltb2ZmCi0JICB8fCBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSA9PSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgc3R1YiB3YXMgYWN0dWFsbHkgYnVpbHQgZm9yIGEgc3RhdGljIHN5bWJvbCBkZWZpbmVkCi0JICAgICBpbiB0aGUgc2FtZSBmaWxlLiAgV2UgYXNzdW1lIHRoYXQgYWxsIHN0YXRpYyBzeW1ib2xzIGluCi0JICAgICBtaXBzMTYgY29kZSBhcmUgdGhlbXNlbHZlcyBtaXBzMTYsIHNvIHdlIGNhbiBzaW1wbHkKLQkgICAgIGRpc2NhcmQgdGhpcyBzdHViLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlCi0JICAgICB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLCB3ZSBjYW4KLQkgICAgIGVhc2lseSBkaXNjYXJkIGl0IGJ5IHNldHRpbmcgdGhlIFNFQ19FWENMVURFIGZsYWcuICAqLwotCSAgc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKLQotICAgICAgLyogSCBpcyB0aGUgc3ltYm9sIHRoaXMgc3R1YiBpcyBmb3IuICAqLwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLQlsb2MgPSAmaC0+Y2FsbF9mcF9zdHViOwotICAgICAgZWxzZQotCWxvYyA9ICZoLT5jYWxsX3N0dWI7Ci0KLSAgICAgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBhcHByb3ByaWF0ZSBzdHViIGZvciB0aGlzIGZ1bmN0aW9uLCB3ZQotCSBkb24ndCBuZWVkIGFub3RoZXIgb25lLCBzbyB3ZSBjYW4gZGlzY2FyZCB0aGlzIG9uZS4gIFNpbmNlCi0JIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMKLQkgdG8gb3V0cHV0IHNlY3Rpb25zLCB3ZSBjYW4gZWFzaWx5IGRpc2NhcmQgaXQgYnkgc2V0dGluZyB0aGUKLQkgU0VDX0VYQ0xVREUgZmxhZy4gIFdlIGNhbiBhbHNvIGRpc2NhcmQgdGhpcyBzZWN0aW9uIGlmIHdlCi0JIGhhcHBlbiB0byBhbHJlYWR5IGtub3cgdGhhdCB0aGlzIGlzIGEgbWlwczE2IGZ1bmN0aW9uOyBpdCBpcwotCSBub3QgbmVjZXNzYXJ5IHRvIGNoZWNrIHRoaXMgaGVyZSwgYXMgaXQgaXMgY2hlY2tlZCBsYXRlciwgYnV0Ci0JIGl0IGlzIHNsaWdodGx5IGZhc3RlciB0byBjaGVjayBub3cuICAqLwotICAgICAgaWYgKCpsb2MgIT0gTlVMTCB8fCBoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpCi0JewotCSAgc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgKmxvYyA9IHNlYzsKLSAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5taXBzMTZfc3R1YnNfc2VlbiA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChkeW5vYmogPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZ290ID0gTlVMTDsKLSAgICAgIGcgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNnb3QgPSBtaXBzX2VsZl9nb3Rfc2VjdGlvbiAoZHlub2JqKTsKLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0JZyA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0JICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLQkgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0JfQotICAgIH0KLQotICBzcmVsb2MgPSBOVUxMOwotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50ICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7ICsrcmVsKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYpCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdOwotCi0JICAvKiBUaGlzIG1heSBiZSBhbiBpbmRpcmVjdCBzeW1ib2wgY3JlYXRlZCBiZWNhdXNlIG9mIGEgdmVyc2lvbi4gICovCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFNvbWUgcmVsb2NzIHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCB8fCBzZ290ID09IE5VTEwpCi0JewotCSAgc3dpdGNoIChyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBSX01JUFNfR09UMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0NBTEwxNjoKLQkgICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotCSAgICBjYXNlIFJfTUlQU19DQUxMX0xPMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0dPVF9ISTE2OgotCSAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLQkgICAgY2FzZSBSX01JUFNfR09UX1BBR0U6Ci0JICAgIGNhc2UgUl9NSVBTX0dPVF9PRlNUOgotCSAgICBjYXNlIFJfTUlQU19HT1RfRElTUDoKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBnID0gbWlwc19lbGZfZ290X2luZm8gKGR5bm9iaiwgJnNnb3QpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9NSVBTXzMyOgotCSAgICBjYXNlIFJfTUlQU19SRUwzMjoKLQkgICAgY2FzZSBSX01JUFNfNjQ6Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMCi0JCSAgJiYgKGluZm8tPnNoYXJlZCB8fCBoICE9IE5VTEwpCi0JCSAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoIWggJiYgKHJfdHlwZSA9PSBSX01JUFNfQ0FMTF9MTzE2Ci0JCSB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVF9MTzE2Ci0JCSB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVF9ESVNQKSkKLQl7Ci0JICAvKiBXZSBtYXkgbmVlZCBhIGxvY2FsIEdPVCBlbnRyeSBmb3IgdGhpcyByZWxvY2F0aW9uLiAgV2UKLQkgICAgIGRvbid0IGNvdW50IFJfTUlQU19HT1RfUEFHRSBiZWNhdXNlIHdlIGNhbiBlc3RpbWF0ZSB0aGUKLQkgICAgIG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzIG5lZWRlZCBieSBsb29raW5nIGF0IHRoZSBzaXplIG9mCi0JICAgICB0aGUgc2VnbWVudC4gIFNpbWlsYXIgY29tbWVudHMgYXBwbHkgdG8gUl9NSVBTX0dPVDE2LiAgV2UKLQkgICAgIGRvbid0IGNvdW50IFJfTUlQU19HT1RfSEkxNiwgb3IgUl9NSVBTX0NBTExfSEkxNiBiZWNhdXNlCi0JICAgICB0aGVzZSBhcmUgYWx3YXlzIGZvbGxvd2VkIGJ5IGFuIFJfTUlQU19HT1RfTE8xNiBvcgotCSAgICAgUl9NSVBTX0NBTExfTE8xNi4KLQotCSAgICAgVGhpcyBlc3RpbWF0aW9uIGlzIHZlcnkgY29uc2VydmF0aXZlIHNpbmNlIHdlIGNhbiBtZXJnZQotCSAgICAgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIEdPVC4gIEluIG9yZGVyIHRvIGJlIGxlc3MKLQkgICAgIGNvbnNlcnZhdGl2ZSwgd2UgY291bGQgYWN0dWFsbHkgYnVpbGQgdGhlIEdPVCBoZXJlLAotCSAgICAgcmF0aGVyIHRoYW4gaW4gcmVsb2NhdGVfc2VjdGlvbi4gICovCi0JICBnLT5sb2NhbF9nb3RubysrOwotCSAgc2dvdC0+X3Jhd19zaXplICs9IE1JUFNfRUxGX0dPVF9TSVpFIChkeW5vYmopOwotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9NSVBTX0NBTEwxNjoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBDQUxMMTYgcmVsb2MgYXQgMHglbHggbm90IGFnYWluc3QgZ2xvYmFsIHN5bWJvbCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSByZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0KLQljYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0JY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0JICAgICAgaWYgKCFtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgKGgsIGluZm8sIGcpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBXZSBuZWVkIGEgc3R1Yiwgbm90IGEgcGx0IGVudHJ5IGZvciB0aGUgdW5kZWZpbmVkCi0JCSBmdW5jdGlvbi4gIEJ1dCB3ZSByZWNvcmQgaXQgYXMgaWYgaXQgbmVlZHMgcGx0LiAgU2VlCi0JCSBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGluIGVsZmxpbmsuaC4gICovCi0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgICAgICBoLT50eXBlID0gU1RUX0ZVTkM7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfR09UMTY6Ci0JY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0JY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0JY2FzZSBSX01JUFNfR09UX0RJU1A6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggJiYgIW1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCAoaCwgaW5mbywgZykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfMzI6Ci0JY2FzZSBSX01JUFNfUkVMMzI6Ci0JY2FzZSBSX01JUFNfNjQ6Ci0JICBpZiAoKGluZm8tPnNoYXJlZCB8fCBoICE9IE5VTEwpCi0JICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lID0gTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKGR5bm9iaik7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsCi0JCQkJCQkgICAgICAoU0VDX0FMTE9DCi0JCQkJCQkgICAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLAotCQkJCQkJCSAgNCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0JCSAgIHJlbG9jIHR5cGVzIGludG8gdGhlIG91dHB1dCBmaWxlIGFzIFJfTUlQU19SRUwzMgotCQkgICByZWxvY3MuICBXZSBtYWtlIHJvb20gZm9yIHRoaXMgcmVsb2MgaW4gdGhlCi0JCSAgIC5yZWwuZHluIHJlbG9jIHNlY3Rpb24uICAqLwotCQltaXBzX2VsZl9hbGxvY2F0ZV9keW5hbWljX3JlbG9jYXRpb25zIChkeW5vYmosIDEpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmhtaXBzOwotCi0JCSAgLyogV2Ugb25seSBuZWVkIHRvIGNvcHkgdGhpcyByZWxvYyBpZiB0aGUgc3ltYm9sIGlzCi0gICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QuICAqLwotCQkgIGhtaXBzID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLQkJICArK2htaXBzLT5wb3NzaWJseV9keW5hbWljX3JlbG9jczsKLQkJfQotCSAgICAgCi0JICAgICAgLyogRXZlbiB0aG91Z2ggd2UgZG9uJ3QgZGlyZWN0bHkgbmVlZCBhIEdPVCBlbnRyeSBmb3IKLQkJIHRoaXMgc3ltYm9sLCBhIHN5bWJvbCBtdXN0IGhhdmUgYSBkeW5hbWljIHN5bWJvbAotCQkgdGFibGUgaW5kZXggZ3JlYXRlciB0aGF0IERUX01JUFNfR09UU1lNIGlmIHRoZXJlIGFyZQotCQkgZHluYW1pYyByZWxvY2F0aW9ucyBhZ2FpbnN0IGl0LiAgKi8KLQkgICAgICBpZiAoaCAhPSBOVUxMCi0JCSAgJiYgIW1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCAoaCwgaW5mbywgZykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoU0dJX0NPTVBBVCAoZHlub2JqKSkKLQkgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmNvbXBhY3RfcmVsX3NpemUgKz0KLQkgICAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NyaW5mbyk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9NSVBTXzI2OgotCWNhc2UgUl9NSVBTX0dQUkVMMTY6Ci0JY2FzZSBSX01JUFNfTElURVJBTDoKLQljYXNlIFJfTUlQU19HUFJFTDMyOgotCSAgaWYgKFNHSV9DT01QQVQgKGR5bm9iaikpCi0JICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5jb21wYWN0X3JlbF9zaXplICs9Ci0JICAgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jcmluZm8pOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgcmVsb2MgaXMgbm90IGEgMTYgYml0IGNhbGwsIGFuZCBpdCBoYXMgYSBnbG9iYWwKLSAgICAgICAgIHN5bWJvbCwgdGhlbiB3ZSB3aWxsIG5lZWQgdGhlIGZuX3N0dWIgaWYgdGhlcmUgaXMgb25lLgotICAgICAgICAgUmVmZXJlbmNlcyBmcm9tIGEgc3R1YiBzZWN0aW9uIGRvIG5vdCBjb3VudC4gKi8KLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIHJfdHlwZSAhPSBSX01JUFMxNl8yNgotCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIEZOX1NUVUIsCi0JCSAgICAgIHNpemVvZiBGTl9TVFVCIC0gMSkgIT0gMAotCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIENBTExfU1RVQiwKLQkJICAgICAgc2l6ZW9mIENBTExfU1RVQiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBDQUxMX0ZQX1NUVUIsCi0JCSAgICAgIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSAhPSAwKQotCXsKLQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKm1oOwotCi0JICBtaCA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0JICBtaC0+bmVlZF9mbl9zdHViID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1hc2VjdGlvbiAqCi1fYmZkX21pcHNfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgLyogPz8/IERvIG1pcHMxNiBzdHViIHNlY3Rpb25zIG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsPyAgKi8KLQotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9NSVBTX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX01JUFNfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiAwCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9NSVBTX0dPVDE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotICAgICAgY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotICAgICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0gICAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLQkvKiA/Pz8gSXQgd291bGQgc2VlbSB0aGF0IHRoZSBleGlzdGluZyBNSVBTIGNvZGUgZG9lcyBubyBzb3J0Ci0JICAgb2YgcmVmZXJlbmNlIGNvdW50aW5nIG9yIHdoYXRub3Qgb24gaXRzIEdPVCBhbmQgUExUIGVudHJpZXMsCi0JICAgc28gaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdhcmJhZ2UgY29sbGVjdCB0aGVtIGF0IHRoaXMgdGltZS4gICovCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaG1pcHM7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QsIHdlIG5lZWQgdG8gY29weQotICAgICBhbnkgUl9NSVBTXzMyIG9yIFJfTUlQU19SRUwzMiByZWxvY3MgYWdhaW5zdCBpdCBpbnRvIHRoZSBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGhtaXBzID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBobWlwcy0+cG9zc2libHlfZHluYW1pY19yZWxvY3MgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIG1pcHNfZWxmX2FsbG9jYXRlX2R5bmFtaWNfcmVsb2NhdGlvbnMgKGR5bm9iaiwgCi0JCQkJCSAgIGhtaXBzLT5wb3NzaWJseV9keW5hbWljX3JlbG9jcyk7Ci0KLSAgLyogRm9yIGEgZnVuY3Rpb24sIGNyZWF0ZSBhIHN0dWIsIGlmIG5lZWRlZC4gKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCB0aGVuIHNldAotCSB0aGUgc3ltYm9sIHRvIHRoZSBzdHViIGxvY2F0aW9uLiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlCi0JIGZ1bmN0aW9uIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsCi0JIGV4ZWN1dGFibGUgYW5kIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIFdlIG5lZWQgLnN0dWIgc2VjdGlvbi4gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJICAgICAgIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0JICAvKiBYWFggV3JpdGUgdGhpcyBzdHViIGFkZHJlc3Mgc29tZXdoZXJlLiAgKi8KLQkgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLQkgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBzdHViIGNvZGUuICAqLwotCSAgcy0+X3Jhd19zaXplICs9IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCi0JICAvKiBUaGUgbGFzdCBoYWxmIHdvcmQgb2YgdGhlIHN0dWIgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgaW5kZXgKLQkgICAgIG9mIHRoaXMgc3ltYm9sIGluIC5keW5zeW0gc2VjdGlvbi4gICovCi0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiByZWFkLAotICAgYW5kIHRoZSBpbnB1dCBzZWN0aW9ucyBoYXZlIGJlZW4gYXNzaWduZWQgdG8gb3V0cHV0IHNlY3Rpb25zLiAgV2UKLSAgIGNoZWNrIGZvciBhbnkgbWlwczE2IHN0dWIgc2VjdGlvbnMgdGhhdCB3ZSBjYW4gZGlzY2FyZC4gICovCi0KLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicwotICBQQVJBTVMgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcmk7Ci0KLSAgLyogVGhlIC5yZWdpbmZvIHNlY3Rpb24gaGFzIGEgZml4ZWQgc2l6ZS4gICovCi0gIHJpID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVnaW5mbyIpOwotICBpZiAocmkgIT0gTlVMTCkKLSAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgcmksIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykpOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8ICEgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPm1pcHMxNl9zdHVic19zZWVuKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICAgbWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzLAotCQkJICAgICAgIChQVFIpIE5VTEwpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGVjayB0aGUgbWlwczE2IHN0dWJzIGZvciBhIHBhcnRpY3VsYXIgc3ltYm9sLCBhbmQgc2VlIGlmIHdlIGNhbgotICAgZGlzY2FyZCB0aGVtLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoaC0+Zm5fc3R1YiAhPSBOVUxMCi0gICAgICAmJiAhIGgtPm5lZWRfZm5fc3R1YikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBmbl9zdHViOyB0aGUgb25seSByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sCi0gICAgICAgICBhcmUgMTYgYml0IGNhbGxzLiAgQ2xvYmJlciB0aGUgc2l6ZSB0byAwIHRvIHByZXZlbnQgaXQgZnJvbQotICAgICAgICAgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Zm5fc3R1Yi0+X3Jhd19zaXplID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPl9jb29rZWRfc2l6ZSA9IDA7Ci0gICAgICBoLT5mbl9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmZuX3N0dWItPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICAgIH0KLQotICBpZiAoaC0+Y2FsbF9zdHViICE9IE5VTEwKLSAgICAgICYmIGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBjYWxsX3N0dWI7IHRoaXMgaXMgYSAxNiBiaXQgZnVuY3Rpb24sIHNvCi0gICAgICAgICBjYWxscyBmcm9tIG90aGVyIDE2IGJpdCBmdW5jdGlvbnMgYXJlIE9LLiAgQ2xvYmJlciB0aGUgc2l6ZQotICAgICAgICAgdG8gMCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Y2FsbF9zdHViLT5fcmF3X3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5fY29va2VkX3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmNhbGxfc3R1Yi0+cmVsb2NfY291bnQgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgICB9Ci0KLSAgaWYgKGgtPmNhbGxfZnBfc3R1YiAhPSBOVUxMCi0gICAgICAmJiBoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpCi0gICAgewotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgY2FsbF9zdHViOyB0aGlzIGlzIGEgMTYgYml0IGZ1bmN0aW9uLCBzbwotICAgICAgICAgY2FsbHMgZnJvbSBvdGhlciAxNiBiaXQgZnVuY3Rpb25zIGFyZSBPSy4gIENsb2JiZXIgdGhlIHNpemUKLSAgICAgICAgIHRvIDAgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+X3Jhd19zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+X2Nvb2tlZF9zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+ZmxhZ3MgJj0gfiBTRUNfUkVMT0M7Ci0gICAgICBoLT5jYWxsX2ZwX3N0dWItPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZyA9IE5VTEw7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplIAotCSAgICA9IHN0cmxlbiAoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgKG91dHB1dF9iZmQpKSArIDE7Ci0JICBzLT5jb250ZW50cyAKLQkgICAgPSAoYmZkX2J5dGUgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgKG91dHB1dF9iZmQpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFdlIG9ubHkgc3RyaXAgdGhlIHNlY3Rpb24gaWYgdGhlIG91dHB1dCBzZWN0aW9uIG5hbWUKLSAgICAgICAgICAgICAgICAgaGFzIHRoZSBzYW1lIG5hbWUuICBPdGhlcndpc2UsIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwKLSAgICAgICAgICAgICAgICAgaW5wdXQgc2VjdGlvbnMgZm9yIHRoaXMgb3V0cHV0IHNlY3Rpb24uICBGSVhNRTogVGhpcwotICAgICAgICAgICAgICAgICBjb2RlIGlzIHByb2JhYmx5IG5vdCBuZWVkZWQgdGhlc2UgZGF5cyBhbnlob3csIHNpbmNlCi0gICAgICAgICAgICAgICAgIHRoZSBsaW5rZXIgbm93IGRvZXMgbm90IGNyZWF0ZSBlbXB0eSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCSAgICAgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JCSAgJiYgc3RyY21wIChuYW1lLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLAotCQkJCQkJICAgcy0+b3V0cHV0X3NlY3Rpb24pKSA9PSAwKQotCQlzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4KLSAgICAgICAgICAgICAgICAgSWYgdGhlIHJlbG9jYXRpb24gc2VjdGlvbiBpcyAucmVsLmR5biwgd2UgYWx3YXlzCi0gICAgICAgICAgICAgICAgIGFzc2VydCBhIERUX1RFWFRSRUwgZW50cnkgcmF0aGVyIHRoYW4gdGVzdGluZyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgIHRoZXJlIGV4aXN0cyBhIHJlbG9jYXRpb24gdG8gYSByZWFkIG9ubHkgc2VjdGlvbiBvcgotICAgICAgICAgICAgICAgICBub3QuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JICAgICAgaWYgKCh0YXJnZXQgIT0gTlVMTAotCQkgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICB8fCBzdHJjbXAgKG91dG5hbWUsIAotCQkJICAgICBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpID09IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIAotCQkJICBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpICE9IDApCi0JCXMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgPT0gMCkKLQl7Ci0JICBpbnQgaTsKLSAJICBiZmRfc2l6ZV90eXBlIGxvYWRhYmxlX3NpemUgPSAwOwotIAkgIGJmZF9zaXplX3R5cGUgbG9jYWxfZ290bm87Ci0gCSAgc3RydWN0IF9iZmQgKnN1YjsKLQotIAkgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHMpICE9IE5VTEwpOwotCSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGRhdGE7Ci0gCSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotIAkgIC8qIENhbGN1bGF0ZSB0aGUgdG90YWwgbG9hZGFibGUgc2l6ZSBvZiB0aGUgb3V0cHV0LiAgVGhhdAotIAkgICAgIHdpbGwgZ2l2ZSB1cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgR09UX1BBR0UgZW50cmllcwotIAkgICAgIHJlcXVpcmVkLiAgKi8KLSAJICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1Yjsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gCSAgICB7Ci0gCSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotIAotIAkgICAgICBmb3IgKHN1YnNlY3Rpb24gPSBzdWItPnNlY3Rpb25zOyAKLSAJCSAgIHN1YnNlY3Rpb247IAotIAkJICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0gCQl7Ci0gCQkgIGlmICgoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gCQkgICAgY29udGludWU7Ci0gCQkgIGxvYWRhYmxlX3NpemUgKz0gKHN1YnNlY3Rpb24tPl9yYXdfc2l6ZSArIDB4ZikgJiB+MHhmOwotIAkJfQotIAkgICAgfQotIAkgIGxvYWRhYmxlX3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0KLSAJICAvKiBBc3N1bWUgdGhlcmUgYXJlIHR3byBsb2FkYWJsZSBzZWdtZW50cyBjb25zaXN0aW5nIG9mCi0gCSAgICAgY29udGlndW91cyBzZWN0aW9ucy4gIElzIDUgZW5vdWdoPyAgKi8KLSAJICBsb2NhbF9nb3RubyA9IChsb2FkYWJsZV9zaXplID4+IDE2KSArIDU7Ci0JICBpZiAoSVJJWF9DT01QQVQgKG91dHB1dF9iZmQpID09IGljdF9pcml4NikKLQkgICAgLyogSXQncyBwb3NzaWJsZSB3ZSB3aWxsIG5lZWQgR09UX1BBR0UgZW50cmllcyBhcyB3ZWxsIGFzCi0JICAgICAgIEdPVDE2IGVudHJpZXMuICBPZnRlbiwgdGhlc2Ugd2lsbCBiZSBhYmxlIHRvIHNoYXJlIEdPVAotCSAgICAgICBlbnRyaWVzLCBidXQgbm90IGFsd2F5cy4gICovCi0JICAgIGxvY2FsX2dvdG5vICo9IDI7Ci0KLSAJICBnLT5sb2NhbF9nb3RubyArPSBsb2NhbF9nb3RubzsKLSAJICBzLT5fcmF3X3NpemUgKz0gbG9jYWxfZ290bm8gKiBNSVBTX0VMRl9HT1RfU0laRSAoZHlub2JqKTsKLQotIAkgIC8qIFRoZXJlIGhhcyB0byBiZSBhIGdsb2JhbCBHT1QgZW50cnkgZm9yIGV2ZXJ5IHN5bWJvbCB3aXRoCi0gCSAgICAgYSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBEVF9NSVBTX0dPVFNZTSBvcgotIAkgICAgIGhpZ2hlci4gIFRoZXJlZm9yZSwgaXQgbWFrZSBzZW5zZSB0byBwdXQgdGhvc2Ugc3ltYm9scwotIAkgICAgIHRoYXQgbmVlZCBHT1QgZW50cmllcyBhdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUuICBXZQotIAkgICAgIGRvIHRoYXQgaGVyZS4gICovCi0gCSAgaWYgKCFtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGUgKGluZm8sIDEpKQotIAkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSAhPSBOVUxMKQotCSAgICBpID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCAtIGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHg7Ci0JICBlbHNlCi0JICAgIC8qIElmIHRoZXJlIGFyZSBubyBnbG9iYWwgc3ltYm9scywgb3Igbm9uZSByZXF1aXJpbmcKLQkgICAgICAgcmVsb2NhdGlvbnMsIHRoZW4gR0xPQkFMX0dPVFNZTSB3aWxsIGJlIE5VTEwuICAqLwotCSAgICBpID0gMDsKLQkgIGctPmdsb2JhbF9nb3RubyA9IGk7Ci0JICBzLT5fcmF3X3NpemUgKz0gaSAqIE1JUFNfRUxGX0dPVF9TSVpFIChkeW5vYmopOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKSA9PSAwKQotCXsKLQkgIC8qIElyaXggcmxkIGFzc3VtZXMgdGhhdCB0aGUgZnVuY3Rpb24gc3R1YiBpc24ndCBhdCB0aGUgZW5kCi0JICAgICBvZiAudGV4dCBzZWN0aW9uLiBTbyBwdXQgYSBkdW1teS4gWFhYICAqLwotCSAgcy0+X3Jhd19zaXplICs9IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAgICAgICYmICEgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQKLQkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5ybGRfbWFwIiwgOCkgPT0gMCkKLQl7Ci0JICAvKiBXZSBhZGQgYSByb29tIGZvciBfX3JsZF9tYXAuIEl0IHdpbGwgYmUgZmlsbGVkIGluIGJ5IHRoZQotCSAgICAgcnRsZCB0byBjb250YWluIGEgcG9pbnRlciB0byB0aGUgX3JfZGVidWcgc3RydWN0dXJlLiAgKi8KLQkgIHMtPl9yYXdfc2l6ZSArPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpCi0JICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuY29tcGFjdF9yZWwiLCAxMikgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmNvbXBhY3RfcmVsX3NpemU7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChvdXRwdXRfYmZkKSkKLQkgICAgICAgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSAoc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9Nc3ltKSAKLQkJCSogKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQKLQkJCSAgICsgYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKSkpOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5pbml0IiwgNSkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKGluZm8sIHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9taXBzX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAvKiBTR0kgb2JqZWN0IGhhcyB0aGUgZXF1aXZhbGVuY2Ugb2YgRFRfREVCVUcgaW4gdGhlCi0JCSBEVF9NSVBTX1JMRF9NQVAgZW50cnkuICAqLwotCSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX1JMRF9NQVAsIDApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9QTFRHT1QsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosCi0JCQkJICAgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKGR5bm9iaikpKQotCXsKLQkgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9SRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9SRUxTWiwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX1JFTEVOVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0NPTkZMSUNUTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfTElCTElTVE5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmNvbmZsaWN0IikgIT0gTlVMTCkKLQl7Ci0JICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19DT05GTElDVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIubGlibGlzdCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfTElCTElTVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX1JMRF9WRVJTSU9OLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0ZMQUdTLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSNpZiAwCi0gICAgICAvKiBUaW1lIHN0YW1wcyBpbiBleGVjdXRhYmxlIGZpbGVzIGFyZSBhIGJhZCBpZGVhLiAgKi8KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX1RJTUVfU1RBTVAsIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0jaWYgMCAvKiBGSVhNRSAgKi8KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0lDSEVDS1NVTSwgMCkpCi0JcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSNpZiAwIC8qIEZJWE1FICAqLwotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfSVZFUlNJT04sIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19CQVNFX0FERFJFU1MsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfTE9DQUxfR09UTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfU1lNVEFCTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfVU5SRUZFWFROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19HT1RTWU0sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKElSSVhfQ09NUEFUIChkeW5vYmopID09IGljdF9pcml4NQotCSAgJiYgISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19ISVBBR0VOTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoSVJJWF9DT01QQVQgKGR5bm9iaikgPT0gaWN0X2lyaXg2Ci0JICAmJiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgCi0JICAgICAgKGR5bm9iaiwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGR5bm9iaikpKQotCSAgJiYgIU1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX09QVElPTlMsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChkeW5vYmopKQotCSAgJiYgIU1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX01TWU0sIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIElmIE5BTUUgaXMgb25lIG9mIHRoZSBzcGVjaWFsIElSSVg2IHN5bWJvbHMgZGVmaW5lZCBieSB0aGUgbGlua2VyLAotICAgYWRqdXN0IGl0IGFwcHJvcHJpYXRlbHkgbm93LiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCAoYWJmZCwgbmFtZSwgc3ltKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICAvKiBUaGUgbGlua2VyIHNjcmlwdCB0YWtlcyBjYXJlIG9mIHByb3ZpZGluZyBuYW1lcyBhbmQgdmFsdWVzIGZvcgotICAgICB0aGVzZSwgYnV0IHdlIG11c3QgcGxhY2UgdGhlbSBpbnRvIHRoZSByaWdodCBzZWN0aW9ucy4gICovCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCB0ZXh0X3NlY3Rpb25fc3ltYm9sc1tdID0gewotICAgICJfZnRleHQiLAotICAgICJfZXRleHQiLAotICAgICJfX2Rzb19kaXNwbGFjZW1lbnQiLAotICAgICJfX2VsZl9oZWFkZXIiLAotICAgICJfX3Byb2dyYW1faGVhZGVyX3RhYmxlIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGRhdGFfc2VjdGlvbl9zeW1ib2xzW10gPSB7Ci0gICAgIl9mZGF0YSIsCi0gICAgIl9lZGF0YSIsCi0gICAgIl9lbmQiLAotICAgICJfZmJzcyIsCi0gICAgTlVMTAotICB9OwotCi0gIGNvbnN0IGNoYXIqIGNvbnN0ICpwOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQotICAgIGZvciAocCA9IChpID09IDApID8gdGV4dF9zZWN0aW9uX3N5bWJvbHMgOiBkYXRhX3NlY3Rpb25fc3ltYm9sczsgCi0JICpwOwotCSArK3ApCi0gICAgICBpZiAoc3RyY21wICgqcCwgbmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBBbGwgb2YgdGhlc2Ugc3ltYm9scyBhcmUgZ2l2ZW4gdHlwZSBTVFRfU0VDVElPTiBieSB0aGUKLQkgICAgIElSSVg2IGxpbmtlci4gICovCi0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgCi0JICAvKiBUaGUgSVJJWCBsaW5rZXIgcHV0cyB0aGVzZSBzeW1ib2xzIGluIHNwZWNpYWwgc2VjdGlvbnMuICAqLwotCSAgaWYgKGkgPT0gMCkKLQkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX1RFWFQ7Ci0JICBlbHNlCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCSAgCi0JICBicmVhazsKLQl9Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGJmZF92bWEgZ3ZhbDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzbXN5bTsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKm1oOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBndmFsID0gc3ltLT5zdF92YWx1ZTsKLSAgbWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX2J5dGUgc3R1YltNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRV07Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIHN0dWIuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgdGhlIHN0dWIuICAqLwotICAgICAgcCA9IHN0dWI7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0xXKG91dHB1dF9iZmQpLCBwKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfTU9WRSwgcCk7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIEZJWE1FOiBDYW4gaC0+ZHluaW5kZXggYmUgbW9yZSB0aGFuIDY0Sz8gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCAmIDB4ZmZmZjAwMDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0pBTFIsIHApOwotICAgICAgcCArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1RVQl9MSTE2ICsgaC0+ZHluaW5keCwgcCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPnBsdC5vZmZzZXQgPD0gcy0+X3Jhd19zaXplKTsKLSAgICAgIG1lbWNweSAocy0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBzdHViLCBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0KLSAgICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQuICBwbHQub2Zmc2V0ICE9IC0xIG9jY3VycwotCSBvbmx5IGZvciB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuICAqLwotICAgICAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQotICAgICAgLyogVGhlIHJ1bi10aW1lIGxpbmtlciB1c2VzIHRoZSBzdF92YWx1ZSBmaWVsZCBvZiB0aGUgc3ltYm9sCi0JIHRvIHJlc2V0IHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciB0aGlzIGV4dGVybmFsCi0JIHRvIGl0cyBzdHViIGFkZHJlc3Mgd2hlbiB1bmxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGd2YWwgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCArIGgtPnBsdC5vZmZzZXQ7Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gZ3ZhbDsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgc2dvdCA9IG1pcHNfZWxmX2dvdF9zZWN0aW9uIChkeW5vYmopOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgLyogUnVuIHRocm91Z2ggdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUsIGNyZWF0aW5nIEdPVCBlbnRyaWVzIGZvciBhbGwKLSAgICAgdGhlIHN5bWJvbHMgdGhhdCBuZWVkIHRoZW0uICAqLwotICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSAhPSBOVUxMCi0gICAgICAmJiBoLT5keW5pbmR4ID49IGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHgpCi0gICAgewotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotCi0gICAgICBpZiAoc3ltLT5zdF92YWx1ZSkKLQl2YWx1ZSA9IHN5bS0+c3RfdmFsdWU7Ci0gICAgICBlbHNlCi0JLyogRm9yIGFuIGVudGl0eSBkZWZpbmVkIGluIGEgc2hhcmVkIG9iamVjdCwgdGhpcyB3aWxsIGJlCi0JICAgTlVMTC4gIChGb3IgZnVuY3Rpb25zIGluIHNoYXJlZCBvYmplY3RzIGZvcgotCSAgIHdoaWNoIHdlIGhhdmUgY3JlYXRlZCBzdHVicywgU1RfVkFMVUUgd2lsbCBiZSBub24tTlVMTC4KLQkgICBUaGF0J3MgYmVjYXVzZSBzdWNoIHRoZSBmdW5jdGlvbnMgYXJlIG5vdyBubyBsb25nZXIgZGVmaW5lZAotCSAgIGluIGEgc2hhcmVkIG9iamVjdC4pICAqLwotCXZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICAgICAgb2Zmc2V0ID0gbWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleCAoZHlub2JqLCBoKTsKLSAgICAgIE1JUFNfRUxGX1BVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWx1ZSwgc2dvdC0+Y29udGVudHMgKyBvZmZzZXQpOwotICAgIH0KLQotICAvKiBDcmVhdGUgYSAubXN5bSBlbnRyeSwgaWYgYXBwcm9wcmlhdGUuICAqLwotICBzbXN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgaWYgKHNtc3ltKQotICAgIHsKLSAgICAgIEVsZjMyX0ludGVybmFsX01zeW0gbXN5bTsKLQotICAgICAgbXN5bS5tc19oYXNoX3ZhbHVlID0gYmZkX2VsZl9oYXNoIChoLT5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgIC8qIEl0IGlzIHVuZG9jdW1lbnRlZCB3aGF0IHRoZSBgMScgaW5kaWNhdGVzLCBidXQgSVJJWDYgdXNlcwotCSB0aGlzIHZhbHVlLiAgKi8KLSAgICAgIG1zeW0ubXNfaW5mbyA9IEVMRjMyX01TX0lORk8gKG1oLT5taW5fZHluX3JlbG9jX2luZGV4LCAxKTsKLSAgICAgIGJmZF9taXBzX2VsZl9zd2FwX21zeW1fb3V0IAotCShkeW5vYmosICZtc3ltLAotCSAoKEVsZjMyX0V4dGVybmFsX01zeW0gKikgc21zeW0tPmNvbnRlbnRzKSArIGgtPmR5bmluZHgpOwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgaWYgKHN0cmNtcCAobmFtZSwgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChuYW1lLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX0RZTkFNSUNfTElOSyIpID09IDApCi0gICAgewotICAgICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0gICAgICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotICAgICAgc3ltLT5zdF92YWx1ZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiX2dwX2Rpc3AiKSA9PSAwKQotCXsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCSAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKLQkgIHN5bS0+c3RfdmFsdWUgPSBlbGZfZ3AgKG91dHB1dF9iZmQpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1swXSkgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsIG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbMV0pID09IDApCi0JewotCSAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKLQkgIHN5bS0+c3Rfb3RoZXIgPSBTVE9fUFJPVEVDVEVEOwotCSAgc3ltLT5zdF92YWx1ZSA9IDA7Ci0JICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfREFUQTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbMl0pID09IDApCi0JewotCSAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKLQkgIHN5bS0+c3Rfb3RoZXIgPSBTVE9fUFJPVEVDVEVEOwotCSAgc3ltLT5zdF92YWx1ZSA9IG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQ7Ci0JICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9VTkRFRiAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9BQlMpCi0JewotCSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMpCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19URVhUOwotCSAgZWxzZSBpZiAoaC0+dHlwZSA9PSBTVFRfT0JKRUNUKQotCSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfREFUQTsKLQl9Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgSVJJWDYtc3BlY2lmaWMgc3ltYm9scy4gICovCi0gIGlmIChJUklYX0NPTVBBVCAob3V0cHV0X2JmZCkgPT0gaWN0X2lyaXg2KQotICAgIG1pcHNfZWxmX2lyaXg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgbmFtZSwgc3ltKTsKLQotICBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkKLSAgICAgICYmICEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGlmICghIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkCi0JICAmJiBzdHJjbXAgKG5hbWUsICJfX3JsZF9tYXAiKSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5ybGRfbWFwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgc3ltLT5zdF92YWx1ZSA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHMtPmNvbnRlbnRzKTsKLQkgIGlmIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlID09IDApCi0JICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIl9fcmxkX29ial9oZWFkIikgPT0gMCkKLQl7Ci0JICAvKiBJUklYNiBkb2VzIG5vdCB1c2UgYSAucmxkX21hcCBzZWN0aW9uLiAgKi8KLQkgIGlmIChJUklYX0NPTVBBVCAob3V0cHV0X2JmZCkgPT0gaWN0X2lyaXg1KQotCSAgICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJsZF9tYXAiKSAKLQkJCSE9IE5VTEwpOwotCSAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZSA9IHN5bS0+c3RfdmFsdWU7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbWlwczE2IHN5bWJvbCwgZm9yY2UgdGhlIHZhbHVlIHRvIGJlIGV2ZW4uICAqLwotICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2Ci0gICAgICAmJiAoc3ltLT5zdF92YWx1ZSAmIDEpICE9IDApCi0gICAgLS1zeW0tPnN0X3ZhbHVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgc2dvdCA9IG1pcHNfZWxmX2dvdF9zZWN0aW9uIChkeW5vYmopOwotICBpZiAoc2dvdCA9PSBOVUxMKQotICAgIGcgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0gICAgICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqYjsKLQotICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgICAgIGZvciAoYiA9IHNkeW4tPmNvbnRlbnRzOwotCSAgIGIgPCBzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZTsKLQkgICBiICs9IE1JUFNfRUxGX0RZTl9TSVpFIChkeW5vYmopKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIHNpemVfdCBlbGVtc2l6ZTsKLQkgIGFzZWN0aW9uICpzOwotCSAgYm9vbGVhbiBzd2FwX291dF9wOwotCi0JICAvKiBSZWFkIGluIHRoZSBjdXJyZW50IGR5bmFtaWMgZW50cnkuICAqLwotCSAgKCpnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZHlub2JqKS0+cy0+c3dhcF9keW5faW4pIChkeW5vYmosIGIsICZkeW4pOwotCSAgCi0JICAvKiBBc3N1bWUgdGhhdCB3ZSdyZSBnb2luZyB0byBtb2RpZnkgaXQgYW5kIHdyaXRlIGl0IG91dC4gICovCi0JICBzd2FwX291dF9wID0gdHJ1ZTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9SRUxFTlQ6Ci0JICAgICAgcyA9IChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAKLQkJICAgKGR5bm9iaiwKLQkJICAgIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FIChkeW5vYmopKSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IE1JUFNfRUxGX1JFTF9TSVpFIChkeW5vYmopOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfU1RSU1o6Ci0JICAgICAgLyogUmV3cml0ZSBEVF9TVFJTWi4gICovCi0JICAgICAgZHluLmRfdW4uZF92YWwgPQotCQlfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfTUlQU19DT05GTElDVDoKLQkgICAgICBuYW1lID0gIi5jb25mbGljdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX01JUFNfTElCTElTVDoKLQkgICAgICBuYW1lID0gIi5saWJsaXN0IjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX1JMRF9WRVJTSU9OOgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gMTsgLyogWFhYICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0ZMQUdTOgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gUkhGX05PVFBPVDsgLyogWFhYICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86Ci0JICAgICAgbmFtZSA9ICIuY29uZmxpY3QiOwotCSAgICAgIGVsZW1zaXplID0gc2l6ZW9mIChFbGYzMl9Db25mbGljdCk7Ci0JICAgICAgZ290byBzZXRfZWxlbW5vOwotCi0JICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUTk86Ci0JICAgICAgbmFtZSA9ICIubGlibGlzdCI7Ci0JICAgICAgZWxlbXNpemUgPSBzaXplb2YgKEVsZjMyX0xpYik7Ci0JICAgIHNldF9lbGVtbm86Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkgICAgZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemUgLyBlbGVtc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZSAvIGVsZW1zaXplOwotCQl9Ci0JICAgICAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19USU1FX1NUQU1QOgotCSAgICAgIHRpbWUgKCh0aW1lX3QgKikgJmR5bi5kX3VuLmRfdmFsKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfSUNIRUNLU1VNOgotCSAgICAgIC8qIFhYWCBGSVhNRTogKi8KLQkgICAgICBzd2FwX291dF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0lWRVJTSU9OOgotCSAgICAgIC8qIFhYWCBGSVhNRTogKi8KLQkgICAgICBzd2FwX291dF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0JBU0VfQUREUkVTUzoKLQkgICAgICBzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYSAmIH4oMHhmZmZmKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfTE9DQUxfR09UTk86Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBnLT5sb2NhbF9nb3RubzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzoKLQkgICAgICAvKiBUaGUgaW5kZXggaW50byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgd2hpY2ggaXMgdGhlCi0JCSBlbnRyeSBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sIHRoYXQgaXMgbm90Ci0JCSByZWZlcmVuY2VkIHdpdGhpbiB0aGUgc2FtZSBvYmplY3QuICAqLwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKSArIDE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0dPVFNZTToKLQkgICAgICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSkKLQkJewotCQkgIGR5bi5kX3VuLmRfdmFsID0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIEluIGNhc2UgaWYgd2UgZG9uJ3QgaGF2ZSBnbG9iYWwgZ290IHN5bWJvbHMgd2UgZGVmYXVsdAotCQkgdG8gc2V0dGluZyBEVF9NSVBTX0dPVFNZTSB0byB0aGUgc2FtZSB2YWx1ZSBhcwotCQkgRFRfTUlQU19TWU1UQUJOTywgc28gd2UganVzdCBmYWxsIHRocm91Z2guICAqLwotCi0JICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzoKLQkgICAgICBuYW1lID0gIi5keW5zeW0iOwotCSAgICAgIGVsZW1zaXplID0gTUlQU19FTEZfU1lNX1NJWkUgKG91dHB1dF9iZmQpOwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemUgLyBlbGVtc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplIC8gZWxlbXNpemU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0hJUEFHRU5POgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gZy0+bG9jYWxfZ290bm8gLSBNSVBTX1JFU0VSVkVEX0dPVE5POwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19STERfTUFQOgotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfT1BUSU9OUzoKLQkgICAgICBzID0gKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIAotCQkgICAob3V0cHV0X2JmZCwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKSk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX01TWU06Ci0JICAgICAgcyA9IChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAKLQkJICAgKG91dHB1dF9iZmQsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChvdXRwdXRfYmZkKSkpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc3dhcF9vdXRfcCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzd2FwX291dF9wKQotCSAgICAoKmdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopLT5zLT5zd2FwX2R5bl9vdXQpIAotCSAgICAgIChkeW5vYmosICZkeW4sIGIpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYmUgZmlsbGVkIGF0Ci0gICAgIHJ1bnRpbWUuIFRoZSBzZWNvbmQgZW50cnkgd2lsbCBiZSB1c2VkIGJ5IHNvbWUgcnVudGltZSBsb2FkZXJzLgotICAgICBUaGlzIGlzbid0IHRoZSBjYXNlIG9mIElyaXggcmxkLiAqLwotICBpZiAoc2dvdCAhPSBOVUxMICYmIHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgTUlQU19FTEZfUFVUX1dPUkQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBNSVBTX0VMRl9QVVRfV09SRCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDB4ODAwMDAwMDAsIAotCQkJIHNnb3QtPmNvbnRlbnRzICsgTUlQU19FTEZfR09UX1NJWkUgKG91dHB1dF9iZmQpKTsKLSAgICB9Ci0KLSAgaWYgKHNnb3QgIT0gTlVMTCkKLSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUKLSAgICAgID0gTUlQU19FTEZfR09UX1NJWkUgKG91dHB1dF9iZmQpOwotCi0gIHsKLSAgICBhc2VjdGlvbiAqc21zeW07Ci0gICAgYXNlY3Rpb24gKnM7Ci0gICAgRWxmMzJfY29tcGFjdF9yZWwgY3B0OwotCi0gICAgLyogPz8/IFRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMgd2VyZSBzZXQgdXAgaW4KLSAgICAgICBfYmZkX2VsZl9maW5hbF9saW5rLiAgU0dJIHNldHMgdGhlIFNUVF9OT1RZUEUgYXR0cmlidXRlIGZvciB0aGVzZQotICAgICAgIHN5bWJvbHMuICBTaG91bGQgd2UgZG8gc28/ICAqLwotCi0gICAgc21zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkgICAgIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgICBpZiAoc21zeW0gIT0gTlVMTCkKLSAgICAgIHsKLQlFbGYzMl9JbnRlcm5hbF9Nc3ltIG1zeW07Ci0KLQltc3ltLm1zX2hhc2hfdmFsdWUgPSAwOwotCW1zeW0ubXNfaW5mbyA9IEVMRjMyX01TX0lORk8gKDAsIDEpOwotCi0JZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICB7Ci0JICAgIGxvbmcgZHluaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4OwotCi0JICAgIGJmZF9taXBzX2VsZl9zd2FwX21zeW1fb3V0IAotCSAgICAgIChvdXRwdXRfYmZkLCAmbXN5bSwKLQkgICAgICAgKCgoRWxmMzJfRXh0ZXJuYWxfTXN5bSAqKSBzbXN5bS0+Y29udGVudHMpCi0JCSsgZHluaW5keCkpOwotCSAgfQotICAgICAgfQotCi0gICAgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotICAgICAgewotCS8qIFdyaXRlIC5jb21wYWN0X3JlbCBzZWN0aW9uIG91dC4gICovCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuY29tcGFjdF9yZWwiKTsKLQlpZiAocyAhPSBOVUxMKQotCSAgewotCSAgICBjcHQuaWQxID0gMTsKLQkgICAgY3B0Lm51bSA9IHMtPnJlbG9jX2NvdW50OwotCSAgICBjcHQuaWQyID0gMjsKLQkgICAgY3B0Lm9mZnNldCA9IChzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcwotCQkJICArIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwpKTsKLQkgICAgY3B0LnJlc2VydmVkMCA9IDA7Ci0JICAgIGNwdC5yZXNlcnZlZDEgPSAwOwotCSAgICBiZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQgKG91dHB1dF9iZmQsICZjcHQsCi0JCQkJCSAgICAoKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICopCi0JCQkJCSAgICAgcy0+Y29udGVudHMpKTsKLQotCSAgICAvKiBDbGVhbiB1cCBhIGR1bW15IHN0dWIgZnVuY3Rpb24gZW50cnkgaW4gLnRleHQuICAqLwotCSAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJCSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAoZHlub2JqKSk7Ci0JICAgIGlmIChzICE9IE5VTEwpCi0JICAgICAgewotCQlmaWxlX3B0ciBkdW1teV9vZmZzZXQ7Ci0KLQkJQkZEX0FTU0VSVCAocy0+X3Jhd19zaXplID49IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFKTsKLQkJZHVtbXlfb2Zmc2V0ID0gcy0+X3Jhd19zaXplIC0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0JCW1lbXNldCAocy0+Y29udGVudHMgKyBkdW1teV9vZmZzZXQsIDAsCi0JCQlNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotCi0gICAgLyogQ2xlYW4gdXAgYSBmaXJzdCByZWxvY2F0aW9uIGluIC5yZWwuZHluLiAgKi8KLSAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgICBpZiAocyAhPSBOVUxMICYmIHMtPl9yYXdfc2l6ZSA+IDApCi0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCBNSVBTX0VMRl9SRUxfU0laRSAoZHlub2JqKSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBiZmRfZ2VuZXJpY19nZXRfLi4uIGV4Y2VwdCB0aGF0IHNvbWUKLSAgIE1JUFMgcmVsb2NhdGlvbnMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWxseS4gIFNpZ2guICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJICAgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwKLQkJCQkgKFBUUikgZGF0YSwKLQkJCQkgMCwKLQkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSdyZSBub3QgcmVsYXhpbmcgdGhlIHNlY3Rpb24sIHNvIGp1c3QgY29weSB0aGUgc2l6ZSBpbmZvICovCi0gIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcGFyZW50OwotICAgICAgLyogZm9yIG1pcHMgKi8KLSAgICAgIGludCBncF9mb3VuZDsKLSAgICAgIGJmZF92bWEgZ3AgPSAweDEyMzQ1Njc4OwkvKiBpbml0aWFsaXplIGp1c3QgdG8gc2h1dCBnY2MgdXAgKi8KLQotICAgICAgewotCXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbGg7Ci0JLyogU2tpcCBhbGwgdGhpcyBzdHVmZiBpZiB3ZSBhcmVuJ3QgbWl4aW5nIGZvcm1hdHMuICAqLwotCWlmIChhYmZkICYmIGlucHV0X2JmZAotCSAgICAmJiBhYmZkLT54dmVjID09IGlucHV0X2JmZC0+eHZlYykKLQkgIGxoID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIGggPSBiZmRfaGFzaF9sb29rdXAgKCZsaW5rX2luZm8tPmhhc2gtPnRhYmxlLCAiX2dwIiwgZmFsc2UsIGZhbHNlKTsKLQkgICAgbGggPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQkgIH0KLSAgICAgIGxvb2t1cDoKLQlpZiAobGgpCi0JICB7Ci0JICAgIHN3aXRjaCAobGgtPnR5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCQlncF9mb3VuZCA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCQlncF9mb3VuZCA9IDE7Ci0JCWdwID0gbGgtPnUuZGVmLnZhbHVlOwotCQlicmVhazsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0JCWxoID0gbGgtPnUuaS5saW5rOwotCQkvKiBAQEZJWE1FICBpZ25vcmluZyB3YXJuaW5nIGZvciBub3cgKi8KLQkJZ290byBsb29rdXA7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLQkgICAgICBkZWZhdWx0OgotCQlhYm9ydCAoKTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgZ3BfZm91bmQgPSAwOwotICAgICAgfQotICAgICAgLyogZW5kIG1pcHMgKi8KLSAgICAgIGZvciAocGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50ICE9IChhcmVsZW50ICopIE5VTEw7Ci0JICAgcGFyZW50KyspCi0JewotCSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotCSAgLyogU3BlY2lmaWMgdG8gTUlQUzogRGVhbCB3aXRoIHJlbG9jYXRpb24gdHlwZXMgdGhhdCByZXF1aXJlCi0JICAgICBrbm93aW5nIHRoZSBncCBvZiB0aGUgb3V0cHV0IGJmZC4gICovCi0JICBhc3ltYm9sICpzeW0gPSAqKCpwYXJlbnQpLT5zeW1fcHRyX3B0cjsKLQkgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikgJiYgYWJmZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBzcGVjaWFsX2Z1bmN0aW9uIHdvdWxkbid0IGdldCBjYWxsZWQgYW55d2F5cy4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKCFncF9mb3VuZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBncCBpc24ndCB0aGVyZTsgbGV0IHRoZSBzcGVjaWFsIGZ1bmN0aW9uIGNvZGUKLQkJIGZhbGwgb3ZlciBvbiBpdHMgb3duLiAgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoKCpwYXJlbnQpLT5ob3d0by0+c3BlY2lhbF9mdW5jdGlvbgotCQkgICA9PSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpCi0JICAgIHsKLQkgICAgICAvKiBieXBhc3Mgc3BlY2lhbF9mdW5jdGlvbiBjYWxsICovCi0JICAgICAgciA9IGdwcmVsMTZfd2l0aF9ncCAoaW5wdXRfYmZkLCBzeW0sICpwYXJlbnQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgcmVsb2NhdGVhYmxlLCAoUFRSKSBkYXRhLCBncCk7Ci0JICAgICAgZ290byBza2lwX2JmZF9wZXJmb3JtX3JlbG9jYXRpb247Ci0JICAgIH0KLQkgIC8qIGVuZCBtaXBzIHNwZWNpZmljIHN0dWZmICovCi0KLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKnBhcmVudCwKLQkJCQkgICAgICAoUFRSKSBkYXRhLAotCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTCwKLQkJCQkgICAgICAmZXJyb3JfbWVzc2FnZSk7Ci0Jc2tpcF9iZmRfcGVyZm9ybV9yZWxvY2F0aW9uOgotCi0JICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKm9zID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgICAgICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzICovCi0JICAgICAgb3MtPm9yZWxvY2F0aW9uW29zLT5yZWxvY19jb3VudF0gPSAqcGFyZW50OwotCSAgICAgIG9zLT5yZWxvY19jb3VudCsrOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcywKLQkJCSB0cnVlKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCQkgIEJGRF9BU1NFUlQgKGVycm9yX21lc3NhZ2UgIT0gKGNoYXIgKikgTlVMTCk7Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkJKGxpbmtfaW5mbywgZXJyb3JfbWVzc2FnZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKigqcGFyZW50KS0+c3ltX3B0cl9wdHIpLAotCQkJICgqcGFyZW50KS0+aG93dG8tPm5hbWUsICgqcGFyZW50KS0+YWRkZW5kLAotCQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0KLWVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0MCi0vKiBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZXNlIGFyZSB1c2VkIHdoZW4gZGVhbGluZyB3aXRoIHRoZQotICAgLm1kZWJ1ZyBzZWN0aW9uLCB3aGljaCBpcyBpbiB0aGUgRUNPRkYgZGVidWdnaW5nIGZvcm1hdC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgbWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwID0KLXsKLSAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljU3ltLAotICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gIDQsCi0gIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBwZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBmZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gIGVjb2ZmX3N3YXBfZG5yX2luLAotICBlY29mZl9zd2FwX3Bkcl9pbiwKLSAgZWNvZmZfc3dhcF9zeW1faW4sCi0gIGVjb2ZmX3N3YXBfb3B0X2luLAotICBlY29mZl9zd2FwX2Zkcl9pbiwKLSAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gIGVjb2ZmX3N3YXBfZXh0X2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICBlY29mZl9zd2FwX3N5bV9vdXQsCi0gIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICBlY29mZl9zd2FwX3JmZF9vdXQsCi0gIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCwKLSAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmMzItbGl0dGxlbWlwcyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmMzJfYmlnbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJImVsZjMyLWJpZ21pcHMiCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfbWlwcwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9NSVBTCi0KLS8qIFRoZSBTVlI0IE1JUFMgQUJJIHNheXMgdGhhdCB0aGlzIHNob3VsZCBiZSAweDEwMDAwLCBidXQgSXJpeCA1IHVzZXMKLSAgIGEgdmFsdWUgb2YgMHgxMDAwLCBhbmQgd2UgYXJlIGNvbXBhdGlibGUuICAqLwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEwMDAKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jb2xsZWN0CQl0cnVlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2lnbl9leHRlbmRfdm1hCXRydWUKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCW1pcHNfaW5mb190b19ob3d0b19yZWxhCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCW1pcHNfZWxmX3N5bV9pc19nbG9iYWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCV9iZmRfbWlwc19lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCV9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gXAotCQkJCQlfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcJX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCV9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAkmbWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawlfYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCV9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCV9iZmRfbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCV9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayBcCi0JCQkJCV9iZmRfbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawlfYmZkX21pcHNfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCV9iZmRfbWlwc19lbGZfZ2Nfc3dlZXBfaG9vawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkoNCpNSVBTX1JFU0VSVkVEX0dPVE5PKQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJMAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0JCQkJCW1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjMyX2ZpbmRfbmVhcmVzdF9saW5lCV9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZjMyX3NldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawlfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwlfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXBqLmMgYi9iZmQvZWxmMzItcGouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5Njk0OS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItcGouYworKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKiBwaWNvSmF2YSBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYW4gb2YgVHJhbnNtZXRhIChzYWNAcG9ib3guY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvcGouaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwal9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcGpfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHBqX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcGpfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUEpfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgU2V0dGluZyBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZSBhbmQKLSAgICAgc3JjX21hc2sgdG8gYSBub24temVybyB2YWx1ZSBpcyBzaW1pbGFyIHRvIHRoZSBDT0ZGIHRvb2xjaGFpbi4gICovCi0gIEhPV1RPIChSX1BKX0RBVEFfRElSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX0RJUjMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1BKX0NPREVfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1BKX0NPREVfUkVMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZjZ3ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfUkVMMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEVNUFRZX0hPV1RPICg0KSwKLSAgRU1QVFlfSE9XVE8gKDUpLAotICBIT1dUTyAoUl9QSl9DT0RFX0RJUjMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX0NPREVfRElSMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDcpLAotICBFTVBUWV9IT1dUTyAoOCksCi0gIEVNUFRZX0hPV1RPICg5KSwKLSAgRU1QVFlfSE9XVE8gKDEwKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLSAgRU1QVFlfSE9XVE8gKDEyKSwKLQotICBIT1dUTyAoUl9QSl9DT0RFX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfTE8xNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi0gICAgSE9XVE8gKFJfUEpfQ09ERV9ISTE2LAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcGpfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QSl9ISTE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX1BKX0dOVV9WVElOSEVSSVQsICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1BKX0dOVV9WVElOSEVSSVQiLCAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfUEpfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1BKX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG5vcm1hbCByZWxvY3MuICBUaGlzIGlzIGxpa2UgdGhlIENPRkYKLSAgIGZ1bmN0aW9uLCBhbmQgaXMgYWxtb3N0IGNlcnRhaW5seSBpbmNvcnJlY3QgZm9yIG90aGVyIEVMRiB0YXJnZXRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcGpfZWxmX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfdm1hIHN5bV92YWx1ZTsKLSAgZW51bSBlbGZfcGpfcmVsb2NfdHlwZSByX3R5cGU7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBhZGRyICsgKGJmZF9ieXRlICopIGRhdGE7Ci0KLSAgcl90eXBlID0gKGVudW0gZWxmX3BqX3JlbG9jX3R5cGUpIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFBhcnRpYWwgbGlua2luZy0tZG8gbm90aGluZy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICBzeW1fdmFsdWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlIAotICAgIHN5bV92YWx1ZSA9IChzeW1ib2xfaW4tPnZhbHVlICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSBzeW1ib2xfaW4tPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUEpfREFUQV9ESVIzMjoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogUmVsb2NhdGlvbnMgaW4gY29kZSBhcmUgYWx3YXlzIGJpZ2VuZGlhbiwgbm8gbWF0dGVyIHdoYXQgdGhlCi0JIGRhdGEgZW5kaWFubmVzcyBpcy4gKi8KLQotICAgIGNhc2UgUl9QSl9DT0RFX0RJUjMyOgotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIGJmZF9wdXRiMzIgKGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1BKX0NPREVfUkVMMTY6Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kCi0gICAgICAgIC0gIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgYmZkX3B1dGIxNiAoaW5zbiwgaGl0X2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BKX0NPREVfTE8xNjoKLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0YjE2IChpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9QSl9DT0RFX0hJMTY6Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSAoc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZCkgPj4gMTY7Ci0gICAgICBiZmRfcHV0YjE2IChpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCBCRkQgcmVsb2MgY29kZXMgdG8gUEogRUxGIHJlbG9jcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi0vKiBBbiBhcnJheSBtYXBwaW5nIEJGRCByZWxvYyBjb2RlcyB0byBQSiBFTEYgcmVsb2NzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGZfcmVsb2NfbWFwIHBqX3JlbG9jX21hcFtdID0KLXsKLSAgICB7IEJGRF9SRUxPQ19OT05FLCAJCVJfUEpfTk9ORSAgICAgICAgICB9LAotICAgIHsgQkZEX1JFTE9DXzMyLCAJCVJfUEpfREFUQV9ESVIzMiAgICB9LAotICAgIHsgQkZEX1JFTE9DX1BKX0NPREVfRElSMTYsIAlSX1BKX0NPREVfRElSMTYgICAgfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyLCAJUl9QSl9DT0RFX0RJUjMyICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9MTzE2LCAJUl9QSl9DT0RFX0xPMTYgICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9ISTE2LCAJUl9QSl9DT0RFX0hJMTYgICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9SRUwzMiwgIFJfUEpfQ09ERV9SRUwzMiAgICB9LAotICAgIHsgQkZEX1JFTE9DX1BKX0NPREVfUkVMMTYsICBSX1BKX0NPREVfUkVMMTYgICAgfSwKLSAgICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9QSl9HTlVfVlRJTkhFUklUIH0sCi0gICAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCAgIFJfUEpfR05VX1ZURU5UUlkgICB9LAotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgY29kZSwgcmV0dXJuIHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIHRoZQotICAgY29ycmVzcG9uZGluZyBQSiBFTGYgcmVsb2MuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1wal9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwal9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocGpfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnBqX2VsZl9ob3d0b190YWJsZVsoaW50KSBwal9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHaXZlbiBhbiBFTEYgcmVsb2MsIGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkIG9mIGEgcmVsZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXBqX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHI7Ci0KLSAgciA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKHIgPCAodW5zaWduZWQgaW50KSBSX1BKX21heCk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZwal9lbGZfaG93dG9fdGFibGVbcl07Ci19Ci0KLS8qIFRha2UgdGhpcyBtb21lbnQgdG8gZmlsbCBpbiB0aGUgc3BlY2lhbCBwaWNvSmF2YSBiaXRzIGluIHRoZQotICAgZV9mbGFncyBmaWVsZC4gKi8KLQotc3RhdGljIHZvaWQKLXBqX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9QSUNPSkFWQV9BUkNIOwotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1BJQ09KQVZBX0dOVUNBTExTOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfcGpfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXBqIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfcGpsX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLXBqbCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX3BqCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUEoKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJICAgICAgICAgICAgIHBqX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nICAgICAgICAgICBwal9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJICAgICAgICAgICAgIHBqX2VsZl9pbmZvX3RvX2hvd3RvCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItcHBjLmMgYi9iZmQvZWxmMzItcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MmNmYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc2MSArMCwwIEBACi0vKiBQb3dlclBDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGEgcHJlbGltaW5hcnkgUG93ZXJQQyBFTEYgQUJJLiAgVGhlCi0gICBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHRoZSBmaW5hbCBQb3dlclBDIEVMRiBBQkkuICBJdCBpbmNsdWRlcwotICAgc3VnZ2VzdGlvbnMgZnJvbSB0aGUgaW4tcHJvZ3Jlc3MgRW1iZWRkZWQgUG93ZXJQQyBBQkksIGFuZCB0aGF0Ci0gICBpbmZvcm1hdGlvbiBtYXkgYWxzbyBub3QgbWF0Y2guICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0KLSNkZWZpbmUgVVNFX1JFTEEJCS8qIHdlIHdhbnQgUkVMQSByZWxvY2F0aW9ucywgbm90IFJFTCAqLwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKmNhY2hlX3B0ciwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX2hvd3RvX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotc3RhdGljIGludCBwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCSAgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOwotCi1zdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY2hlY2tfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqIHBwY19lbGZfZ2NfbWFya19ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCXN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkJRWxmX0ludGVybmFsX1JlbGEgKnJlbCwKLQkJCQkJCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCQkJCQkJRWxmX0ludGVybmFsX1N5bSAqc3ltKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZ2Nfc3dlZXBfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjLAotCQkJCQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkJCQkJCSBiZmQgKiwKLQkJCQkJCSBhc2VjdGlvbiAqLAotCQkJCQkJIGJmZF9ieXRlICosCi0JCQkJCQkgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywKLQkJCQkJCSBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zLAotCQkJCQkJIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfYWRkX3N5bWJvbF9ob29rICBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkJCQkJCSBjb25zdCBjaGFyICoqLAotCQkJCQkJIGZsYWd3b3JkICosCi0JCQkJCQkgYXNlY3Rpb24gKiosCi0JCQkJCQkgYmZkX3ZtYSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0jZGVmaW5lIEJSQU5DSF9QUkVESUNUX0JJVCAweDIwMDAwMAkJLyogYnJhbmNoIHByZWRpY3Rpb24gYml0IGZvciBicmFuY2ggdGFrZW4gcmVsb2NzICovCi0jZGVmaW5lIFJBX1JFR0lTVEVSX01BU0sgMHgwMDFmMDAwMAkJLyogbWFzayB0byBzZXQgUkEgaW4gbWVtb3J5IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBSQV9SRUdJU1RFUl9TSElGVCAxNgkJCS8qIHZhbHVlIHRvIHNoaWZ0IHJlZ2lzdGVyIGJ5IHRvIGluc2VydCBSQSAqLwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGQuc28uMSIKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKLS8qIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBsdCByZXNlcnZlZCBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLSNkZWZpbmUgUExUX0lOSVRJQUxfRU5UUllfU0laRSA3MgotLyogVGhlIHNpemUgb2YgdGhlIGdhcCBiZXR3ZWVuIGVudHJpZXMgaW4gdGhlIFBMVC4gICovCi0jZGVmaW5lIFBMVF9TTE9UX1NJWkUgOAotLyogVGhlIG51bWJlciBvZiBzaW5nbGUtc2xvdCBQTFQgZW50cmllcyAodGhlIHJlc3QgdXNlIHR3byBzbG90cykuICAqLwotI2RlZmluZSBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTIDgxOTIKLQotDAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpUl9QUENfbWF4IF07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHBwY19lbGZfaG93dG9fcmF3W10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX1BQQ19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMjYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4KLSAgICAgRklYTUU6IHdlIGRvbid0IGNoZWNrIHRoYXQsIHdlIGp1c3QgY2xlYXIgdGhlbS4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIyNCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAxNiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgcmVsb2NhdGlvbiB3aXRob3V0IG92ZXJmbG93LiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNl9MTywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0hJLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIxNl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggb3JkZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLCBwbHVzIDEgaWYgdGhlIGNvbnRlbnRzIG9mCi0gICAgIHRoZSBsb3cgMTYgYml0cywgdHJlYXRlZCBhcyBhIHNpZ25lZCBudW1iZXIsIGlzIG5lZ2F0aXZlLgkqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0hBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAxNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgotICAgICBGSVhNRTogd2UgZG9uJ3QgY2hlY2sgdGhhdCwgd2UganVzdCBjbGVhciB0aGVtLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAxNiBiaXQgYnJhbmNoLCBmb3Igd2hpY2ggYml0IDEwIHNob3VsZCBiZSBzZXQgdG8KLSAgICAgaW5kaWNhdGUgdGhhdCB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuLglUaGUgbG93ZXIgdHdvCi0gICAgIGJpdHMgbXVzdCBiZSB6ZXJvLgkgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNF9CUlRBS0VOLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIxNF9CUlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2gsIGZvciB3aGljaCBiaXQgMTAgc2hvdWxkIGJlIHNldCB0bwotICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLiAgVGhlIGxvd2VyCi0gICAgIHR3byBiaXRzIG11c3QgYmUgemVyby4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTRfQlJOVEFLRU4sIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0X0JSTlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4JICovCi0gIEhPV1RPIChSX1BQQ19SRUwyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2g7IHRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlIHplcm8uCSAqLwotICBIT1dUTyAoUl9QUENfUkVMMTQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTDE0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxNiBiaXQgYnJhbmNoLglCaXQgMTAgc2hvdWxkIGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgIHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZQotICAgICB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDE0X0JSVEFLRU4sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMTRfQlJUQUtFTiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxNiBiaXQgYnJhbmNoLglCaXQgMTAgc2hvdWxkIGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgIHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLiAgVGhlIGxvd2VyIHR3byBiaXRzIG11c3QKLSAgICAgYmUgemVyby4gICovCi0gIEhPV1RPIChSX1BQQ19SRUwxNF9CUk5UQUtFTiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwxNF9CUk5UQUtFTiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNiwgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvciB0aGUKLSAgICAgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9MTywgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hJLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dPVDE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEEsIGJ1dCByZWZlcnJpbmcgdG8gdGhlIEdPVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19HT1QxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19SRUwyNCwgYnV0IHJlZmVycmluZyB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUKLSAgICAgZW50cnkgZm9yIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUUkVMMjQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVFJFTDI0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIGlzIHVzZWQgb25seSBieSB0aGUgZHluYW1pYyBsaW5rZXIuICBUaGUgc3ltYm9sIHNob3VsZCBleGlzdAotICAgICBib3RoIGluIHRoZSBvYmplY3QgYmVpbmcgcnVuIGFuZCBpbiBzb21lIHNoYXJlZCBsaWJyYXJ5LiAgVGhlCi0gICAgIGR5bmFtaWMgbGlua2VyIGNvcGllcyB0aGUgZGF0YSBhZGRyZXNzZWQgYnkgdGhlIHN5bWJvbCBmcm9tIHRoZQotICAgICBzaGFyZWQgbGlicmFyeSBpbnRvIHRoZSBvYmplY3QsIGJlY2F1c2UgdGhlIG9iamVjdCBiZWluZwotICAgICBydW4gaGFzIHRvIGhhdmUgdGhlIGRhdGEgYXQgc29tZSBwYXJ0aWN1bGFyIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9QUENfQ09QWSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0NPUFkiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjMyLCBidXQgdXNlZCB3aGVuIHNldHRpbmcgZ2xvYmFsIG9mZnNldCB0YWJsZQotICAgICBlbnRyaWVzLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dMT0JfREFULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HTE9CX0RBVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE1hcmtzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgZm9yIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0pNUF9TTE9ULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19KTVBfU0xPVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIG9ubHkgYnkgdGhlIGR5bmFtaWMgbGlua2VyLiAgV2hlbiB0aGUgb2JqZWN0IGlzIHJ1biwgdGhpcwotICAgICBsb25nd29yZCBpcyBzZXQgdG8gdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgb2JqZWN0LCBwbHVzIHRoZQotICAgICBhZGRlbmQuICAqLwotICBIT1dUTyAoUl9QUENfUkVMQVRJVkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTEFUSVZFIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19SRUwyNCwgYnV0IHVzZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgd2l0aGluIHRoZQotICAgICBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIGZpbmFsIHZhbHVlLiAgTm9ybWFsbHkgdXNlZCBmb3IKLSAgICAgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0xPQ0FMMjRQQywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19MT0NBTDI0UEMiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjMyLCBidXQgbWF5IGJlIHVuYWxpZ25lZC4gICovCi0gIEhPV1RPIChSX1BQQ19VQUREUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19VQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTYsIGJ1dCBtYXkgYmUgdW5hbGlnbmVkLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1VBRERSMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1VBRERSMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBQQyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9QUENfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHJlbG9jYXRpb24gdG8gdGhlIHN5bWJvbCdzIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgotICAgICBGSVhNRTogbm90IHN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdG8gdGhlIHN5bWJvbCdzIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgotICAgICBGSVhNRTogbm90IHN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKFJfUFBDX1BMVFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfTE8sIGJ1dCByZWZlcnJpbmcgdG8gdGhlIFBMVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFQxNl9MTywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9ISSwgYnV0IHJlZmVycmluZyB0byB0aGUgUExUIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDE2X0hJLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQxNl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hBLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBQTFQgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUMTZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUMTZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc2lnbi1leHRlbmRlZCAxNiBiaXQgdmFsdWUgcmVsYXRpdmUgdG8gX1NEQV9CQVNFXywgZm9yIHVzZSB3aXRoCi0gICAgIHNtYWxsIGRhdGEgaXRlbXMuICAqLwotICBIT1dUTyAoUl9QUENfU0RBUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NEQVJFTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19TRUNUT0ZGIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCBsb3dlciBoYWxmIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfTE8sCSAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCB1cHBlciBoYWxmIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkZfSEkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCSAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNi1iaXQgdXBwZXIgaGFsZiBhZGp1c3RlZCBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gIEhPV1RPIChSX1BQQ19TRUNUT0ZGX0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBmcm9tIHRoZSBFbWJlZGRlZCBFTEYgQUJJLCBhbmQgYXJlIG5vdAotICAgICBpbiB0aGUgU1ZSNCBFTEYgQUJJLiAgKi8KLQotICAvKiAzMiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFkZGVuZCBtaW51cyB0aGUgc3ltYm9sICovCi0gIEhPV1RPIChSX1BQQ19FTUJfTkFERFIzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfTkFERFIzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFkZGVuZCBtaW51cyB0aGUgc3ltYm9sICovCi0gIEhPV1RPIChSX1BQQ19FTUJfTkFERFIxNl9MTywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX0FERFIxNl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggb3JkZXIgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0hJLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjE2X0hJIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFkZGVuZCBtaW51cyB0aGUgYWRkcmVzcywKLSAgICAgcGx1cyAxIGlmIHRoZSBjb250ZW50cyBvZiB0aGUgbG93IDE2IGJpdHMsIHRyZWF0ZWQgYXMgYSBzaWduZWQgbnVtYmVyLAotICAgICBpcyBuZWdhdGl2ZS4gICovCi0gIEhPV1RPIChSX1BQQ19FTUJfTkFERFIxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjE2X0hBIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYWxsb2NhdGluZyBhIDQgYnl0ZSB3b3JkIHRvIGhvbGQgYW4KLSAgICAgYWRkcmVzcyBpbiB0aGUgLnNkYXRhIHNlY3Rpb24sIGFuZCByZXR1cm5pbmcgdGhlIG9mZnNldCBmcm9tCi0gICAgIF9TREFfQkFTRV8gZm9yIHRoYXQgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9QUENfRU1CX1NEQUkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfU0RBSTE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYWxsb2NhdGluZyBhIDQgYnl0ZSB3b3JkIHRvIGhvbGQgYW4KLSAgICAgYWRkcmVzcyBpbiB0aGUgLnNkYXRhMiBzZWN0aW9uLCBhbmQgcmV0dXJuaW5nIHRoZSBvZmZzZXQgZnJvbQotICAgICBfU0RBMl9CQVNFXyBmb3IgdGhhdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMkkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfU0RBMkkxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzaWduLWV4dGVuZGVkIDE2IGJpdCB2YWx1ZSByZWxhdGl2ZSB0byBfU0RBMl9CQVNFXywgZm9yIHVzZSB3aXRoCi0gICAgIHNtYWxsIGRhdGEgaXRlbXMuCSAqLwotICBIT1dUTyAoUl9QUENfRU1CX1NEQTJSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEyUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY2F0ZSBhZ2FpbnN0IGVpdGhlciBfU0RBX0JBU0VfIG9yIF9TREEyX0JBU0VfLCBmaWxsaW5nIGluIHRoZSAxNiBiaXQKLSAgICAgc2lnbmVkIG9mZnNldCBmcm9tIHRoZSBhcHByb3ByaWF0ZSBiYXNlLCBhbmQgZmlsbGluZyBpbiB0aGUgcmVnaXN0ZXIKLSAgICAgZmllbGQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgKDAsIDIsIG9yIDEzKS4gICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMjEsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEyMSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX01SS1JFRiAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU0VDMTYgKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX1JFTFNUX0xPICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTVF9ISSAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU1RfSEEgKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX0JJVF9GTEQgKi8KLQotICAvKiBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8gb3IgX1NEQTJfQkFTRV8sIGZpbGxpbmcKLSAgICAgaW4gdGhlIDE2IGJpdCBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGFwcHJvcHJpYXRlIGJhc2UsIGFuZCBmaWxsaW5nIGluIHRoZQotICAgICByZWdpc3RlciBmaWVsZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAoMCwgMiwgb3IgMTMpLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9SRUxTREEsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1JFTFNEQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfUFBDX0dOVV9WVElOSEVSSVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dOVV9WVElOSEVSSVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfUFBDX0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQaG9ueSByZWxvYyB0byBoYW5kbGUgQUlYIHN0eWxlIFRPQyBlbnRyaWVzICovCi0gIEhPV1RPIChSX1BQQ19UT0MxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1RPQzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0MCi0vKiBJbml0aWFsaXplIHRoZSBwcGNfZWxmX2hvd3RvX3RhYmxlLCBzbyB0aGF0IGxpbmVhciBhY2Nlc3NlcyBjYW4gYmUgZG9uZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2hvd3RvX2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGksIHR5cGU7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHBjX2VsZl9ob3d0b19yYXcpIC8gc2l6ZW9mIChwcGNfZWxmX2hvd3RvX3Jhd1swXSk7IGkrKykKLSAgICB7Ci0gICAgICB0eXBlID0gcHBjX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKLSAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBzaXplb2YocHBjX2VsZl9ob3d0b190YWJsZSkgLyBzaXplb2YocHBjX2VsZl9ob3d0b190YWJsZVswXSkpOwotICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVt0eXBlXSA9ICZwcGNfZWxmX2hvd3RvX3Jhd1tpXTsKLSAgICB9Ci19Ci0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIFBQQyB3aXRoIG9wdGlvbiAtLW1wYzg2MGMwWz08bj5dLgotCi0gICBUaGUgTVBDODYwLCByZXZpc2lvbiBDMCBvciBlYXJsaWVyIGNvbnRhaW5zIGEgYnVnIGluIHRoZSBkaWUuCi0gICBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlLCB0aGUgbmV4dCBpbnN0cnVjdGlvbgotICAgdG8gYmUgZXhlY3V0ZWQgKm1heSogYmUgdHJlYXRlZCBhcyBhIG5vLW9wLgotICAgMS8gQSBmb3J3YXJkIGJyYW5jaCBpcyBleGVjdXRlZC4KLSAgIDIvIFRoZSBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdCB0YWtlbi4KLSAgIDMvIFRoZSBicmFuY2ggaXMgdGFrZW4uCi0gICA0LyBUaGUgYnJhbmNoIGlzIGxvY2F0ZWQgaW4gdGhlIGxhc3QgNSB3b3JkcyBvZiBhIHBhZ2UuCi0gICAgICAoVGhlIEVPUCBsaW1pdCBpcyA1IGJ5IGRlZmF1bHQgYnV0IG1heSBiZSBzcGVjaWZpZWQgYXMgYW55IHZhbHVlIGZyb20gMS0xMC4pCi0gICAKLSAgIE91ciBzb2Z0d2FyZSBzb2x1dGlvbiBpcyB0byBkZXRlY3QgdGhlc2UgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gYQotICAgbGlua2VyIHBhc3MgYW5kIG1vZGlmeSB0aGVtIGFzIGZvbGxvd3M6Ci0gICAxLyBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzIC0gU2luY2UgdGhlc2UgYXJlIGFsd2F5cyBwcmVkaWN0ZWQgdGFrZW4sCi0gICAgICB0aGVyZSBpcyBubyBwcm9ibGVtIGFuZCBubyBhY3Rpb24gaXMgcmVxdWlyZWQuCi0gICAyLyBDb25kaXRpb25hbCBiYWNrd2FyZCBicmFuY2hlcyAtIE5vIHByb2JsZW0sIG5vIGFjdGlvbiByZXF1aXJlZC4KLSAgIDMvIENvbmRpdGlvbmFsIGZvcndhcmQgYnJhbmNoZXMgLSBFbnN1cmUgdGhhdCB0aGUgImludmVyc2UgcHJlZGljdGlvbgotICAgICAgYml0IiBpcyBzZXQgKGVuc3VyZSBpdCBpcyBwcmVkaWN0ZWQgdGFrZW4pLgotICAgNC8gQ29uZGl0aW9uYWwgcmVnaXN0ZXIgYnJhbmNoZXMgLSBFbnN1cmUgdGhhdCB0aGUgInkgYml0IiBpcyBzZXQKLSAgICAgIChlbnN1cmUgaXQgaXMgcHJlZGljdGVkIHRha2VuKS4KLSovCi0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBpbnQKLXBwY19lbGZfc29ydF9yZWxhIChhcmcxLCBhcmcyKQotICAgIGNvbnN0IHZvaWQgKmFyZzE7Ci0gICAgY29uc3Qgdm9pZCAqYXJnMjsKLXsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKipyZWxhMSA9IChjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSoqKSBhcmcxOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGEyID0gKGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhKiopIGFyZzI7Ci0KLSAgLyogU29ydCBieSBvZmZzZXQuICovCi0gIHJldHVybiAoKCpyZWxhMSktPnJfb2Zmc2V0IC0gKCpyZWxhMiktPnJfb2Zmc2V0KTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgaXNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICBiZmQgKmFiZmQ7Ci0gICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICBib29sZWFuICphZ2FpbjsKLXsKLSNkZWZpbmUgUEFHRVNJWkUgMHgxMDAwCi0KLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKipyZWxhX2NvbWIgPSBOVUxMOwotICBpbnQgY29tYl9jdXJyLCBjb21iX2NvdW50OwotCi0gIC8qIFdlIG5ldmVyIGhhdmUgdG8gZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBwZXIgaW5wdXQgc2VjdGlvbi4gKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogSWYgbmVlZGVkLCBpbml0aWFsaXplIHRoaXMgc2VjdGlvbidzIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKGlzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgICAgaXNlYy0+X2Nvb2tlZF9zaXplID0gaXNlYy0+X3Jhd19zaXplOwotCi0gIC8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB0ZXh0IHNlY3Rpb25zIHdoaWNoIG92ZXJsYXAgdGhlCi0gIHRyb3VibGVzb21lIGFyZWEgYXQgdGhlIGVuZCBvZiBhIHBhZ2UuICovCi0gIGlmIChsaW5rX2luZm8tPm1wYzg2MGMwICYmIChpc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAmJiBpc2VjLT5fY29va2VkX3NpemUpCi0gICAgewotICAgICAgYmZkX3ZtYSBkb3QsIGVuZF9wYWdlLCBlbmRfc2VjdGlvbjsKLSAgICAgIGJvb2xlYW4gc2VjdGlvbl9tb2RpZmllZDsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAqLwotICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpc2VjLT5fcmF3X3NpemUpOwotCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaXNlYywgY29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBpc2VjLT5fcmF3X3NpemUpKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgY29tYl9jdXJyID0gMDsKLSAgICAgIGNvbWJfY291bnQgPSAwOwotICAgICAgaWYgKGlzZWMtPnJlbG9jX2NvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgbjsKLQotICAgICAgICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICAgICAgaW50ZXJuYWxfcmVsb2NzID0gX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzICgKLSAgICAJICAgIGFiZmQsIGlzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCAKLSAgICAJICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpOwotICAgICAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICAJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICAJICAgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgCi0gICAgICAgICAgLyogU2V0dXAgYSBmYXN0ZXIgYWNjZXNzIG1ldGhvZCBmb3IgdGhlIHJlbG9jIGluZm8gd2UgbmVlZC4gKi8KLSAgICAgICAgICByZWxhX2NvbWIgPSAoRWxmX0ludGVybmFsX1JlbGEqKikKLQkgICAgYmZkX21hbGxvYyAoaXNlYy0+cmVsb2NfY291bnQqc2l6ZW9mKEVsZl9JbnRlcm5hbF9SZWxhKikpOwotICAgICAgICAgIGlmIChyZWxhX2NvbWIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgZm9yIChuPTA7IG48aXNlYy0+cmVsb2NfY291bnQ7ICsrbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbG9uZyByX3R5cGU7Ci0gICAgCi0gICAgICAgICAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaW50ZXJuYWxfcmVsb2NzW25dLnJfaW5mbyk7Ci0gICAgICAgICAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KVJfUFBDX21heCkKLSAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIAotICAgICAgICAgICAgICAvKiBQcm9sb2d1ZSBjb25zdGFudHMgYXJlIHNvbWV0aW1lcyBwcmVzZW50IGluIHRoZSAiLnRleHQiCi0gICAgICAgICAgICAgIHNlY3Rpb25zIGFuZCB0aGV5IGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGFzc29jaWF0ZWQgcmVsb2NhdGlvbi4KLSAgICAgICAgICAgICAgV2UgZG9uJ3Qgd2FudCB0byBwcm9jZXNzIHRob3NlIHdvcmRzIGFuZCBzb21lIG90aGVycyB3aGljaAotICAgICAgICAgICAgICBjYW4gYWxzbyBiZSBpZGVudGlmaWVkIGJ5IHRoZWlyIHJlbG9jYXRpb25zLiAgSG93ZXZlciwgbm90IGFsbAotICAgICAgICAgICAgICBjb25kaXRpb25hbCBicmFuY2hlcyB3aWxsIGhhdmUgYSByZWxvY2F0aW9uIHNvIHdlIHdpbGwKLSAgICAgICAgICAgICAgb25seSBpZ25vcmUgd29yZHMgdGhhdCAxKSBoYXZlIGEgcmVsb2MsIGFuZCAyKSB0aGUgcmVsb2MKLSAgICAgICAgICAgICAgaXMgbm90IGFwcGxpY2FibGUgdG8gYSBjb25kaXRpb25hbCBicmFuY2guCi0gICAgICAgICAgICAgIFRoZSBhcnJheSByZWxhX2NvbWIgaXMgYnVpbHQgaGVyZSBmb3IgdXNlIGluIHRoZSBFT1Agc2NhbiBsb29wLiAqLwotICAgICAgICAgICAgICBzd2l0Y2ggKHJfdHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19BRERSMTRfQlJOVEFLRU46ICAgICAvKiBhYnNvbHV0ZSwgcHJlZGljdGVkIG5vdCB0YWtlbiAqLwotICAgICAgICAgICAgICAgIGNhc2UgUl9QUENfUkVMMTQ6ICAgICAgICAgICAgICAgLyogcmVsYXRpdmUgY29uZC4gYnIuICovCi0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19SRUwxNF9CUk5UQUtFTjogICAgICAvKiByZWwuIGNvbmQuIGJyLiwgcHJlZGljdGVkIG5vdCB0YWtlbiAqLwotICAgICAgICAgICAgICAgICAgLyogV2Ugc2hvdWxkIGNoZWNrIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAvKiBUaGUgd29yZCBpcyBub3QgYSBjb25kaXRpb25hbCBicmFuY2ggLSBpZ25vcmUgaXQuICovCi0gICAgICAgICAgICAgICAgICByZWxhX2NvbWJbY29tYl9jb3VudCsrXSA9ICZpbnRlcm5hbF9yZWxvY3Nbbl07Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGNvbWJfY291bnQgPiAxKQotICAgICAgICAgICAgICBxc29ydCAocmVsYV9jb21iLCAoc2l6ZV90KSBjb21iX2NvdW50LCBzaXplb2YgKGludCksIHBwY19lbGZfc29ydF9yZWxhKTsKLSAgICAgICAgfQotCi0gICAgICAvKiBFbnVtZXJhdGUgZWFjaCBFT1AgcmVnaW9uIHRoYXQgb3ZlcmxhcHMgdGhpcyBzZWN0aW9uLiAqLwotICAgICAgZW5kX3NlY3Rpb24gPSBpc2VjLT52bWEgKyBpc2VjLT5fY29va2VkX3NpemU7Ci0gICAgICBkb3QgPSBlbmRfcGFnZSA9IChpc2VjLT52bWEgfCAoUEFHRVNJWkUgLSAxKSkgKyAxOwotICAgICAgZG90IC09IGxpbmtfaW5mby0+bXBjODYwYzA7Ci0gICAgICBzZWN0aW9uX21vZGlmaWVkID0gZmFsc2U7Ci0gICAgICBpZiAoZG90IDwgaXNlYy0+dm1hKSAgICAgIC8qIEluY3JlbWVudCB0aGUgc3RhcnQgcG9zaXRpb24gaWYgdGhpcyBzZWN0aW9uICovCi0gICAgICAgICAgZG90ID0gaXNlYy0+dm1hOyAgICAgIC8qIGJlZ2lucyBpbiB0aGUgbWlkZGxlIG9mIGl0cyBmaXJzdCBFT1AgcmVnaW9uLiAqLwotICAgICAgZm9yICg7Ci0gICAgICAgICAgIGRvdCA8IGVuZF9zZWN0aW9uOwotICAgICAgICAgICBkb3QgKz0gUEFHRVNJWkUsIGVuZF9wYWdlICs9IFBBR0VTSVpFKQotICAgICAgICB7Ci0KLSAgICAgICAgICAvKiBDaGVjayBlYWNoIHdvcmQgaW4gdGhpcyBFT1AgcmVnaW9uLiAqLwotICAgICAgICAgIGZvciAoOyBkb3QgPCBlbmRfcGFnZTsgZG90ICs9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJmZF92bWEgaXNlY19vZmZzZXQ7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgICAgICAgICAgYm9vbGVhbiBza2lwLCBtb2RpZmllZDsKLQotICAgICAgICAgICAgICAvKiBEb24ndCBwcm9jZXNzIHRoaXMgd29yZCBpZiB0aGVyZSBpcyBhIHJlbG9jYXRpb24gZm9yIGl0IGFuZAotICAgICAgICAgICAgICB0aGUgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgdGhlIHdvcmQgaXMgbm90IGEgY29uZGl0aW9uYWwgYnJhbmNoLiAqLwotICAgICAgICAgICAgICBza2lwID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGlzZWNfb2Zmc2V0ID0gZG90IC0gaXNlYy0+dm1hOwotICAgICAgICAgICAgICBmb3IgKDsgY29tYl9jdXJyPGNvbWJfY291bnQ7ICsrY29tYl9jdXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJmZF92bWEgcl9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgIHJfb2Zmc2V0ID0gcmVsYV9jb21iW2NvbWJfY3Vycl0tPnJfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgaWYgKHJfb2Zmc2V0ID49IGlzZWNfb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHJfb2Zmc2V0ID09IGlzZWNfb2Zmc2V0KSBza2lwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHNraXApIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgIC8qIENoZWNrIHRoZSBjdXJyZW50IHdvcmQgZm9yIGEgcHJvYmxlbWF0aWMgY29uZGl0aW9uYWwgYnJhbmNoLiAqLwotI2RlZmluZSBCTzAoaW5zbikgKChpbnNuKSAmIDB4MDIwMDAwMDApCi0jZGVmaW5lIEJPMihpbnNuKSAoKGluc24pICYgMHgwMDgwMDAwMCkKLSNkZWZpbmUgQk80KGluc24pICgoaW5zbikgJiAweDAwMjAwMDAwKQotICAgICAgICAgICAgICBpbnNuID0gKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgaXNlY19vZmZzZXQpOwotICAgICAgICAgICAgICBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAgICAgICBpZiAoKGluc24gJiAweEZjMDAwMDAwKSA9PSAweDQwMDAwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDeCAqLwotICAgICAgICAgICAgICAgICAgaWYgKCghQk8wKGluc24pIHx8ICFCTzIoaW5zbikpICYmICFCTzQoaW5zbikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBiZmRfdm1hIHRhcmdldDsKLSAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgIm5vcm1hbCIuCi0gICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBhIGZvcndhcmQgYnJhbmNoLCBpdCBpcyBwcm9ibGVtYXRpYy4gKi8KLQotICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGluc24gJiAweDAwMDBGZmZjOyAgICAgICAgICAgICAgIC8qZXh0cmFjdCovCi0gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKHRhcmdldCBeIDB4ODAwMCkgLSAweDgwMDA7ICAgICAgLypzaWduIGV4dGVuZCovCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnNuICYgMHgwMDAwMDAwMikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ICs9IGRvdDsgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbnZlcnQgdG8gYWJzKi8KLSAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID4gZG90KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuIHw9IDB4MDAyMDAwMDA7ICAgLyogc2V0IHRoZSBwcmVkaWN0aW9uIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKChpbnNuICYgMHhGYzAwRmZmZSkgPT0gMHg0YzAwMDQyMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBJbnN0cnVjdGlvbiBpcyBCQ0NUUnggKi8KLSAgICAgICAgICAgICAgICAgIGlmICgoIUJPMChpbnNuKSB8fCAhQk8yKGluc24pKSAmJiAhQk80KGluc24pKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90LXRha2VuLgotCQkgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLgotICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHdlIGNhbid0IHRlbGwgc3RhdGljYWxseSBpZiBpdCB3aWxsIGJyYW5jaCBmb3J3YXJkLAotICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBzZXQgdGhlIHByZWRpY3Rpb24gYml0LiAqLwotICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoKGluc24gJiAweEZjMDBGZmZlKSA9PSAweDRjMDAwMDIwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDTFJ4ICovCi0gICAgICAgICAgICAgICAgICBpZiAoKCFCTzAoaW5zbikgfHwgIUJPMihpbnNuKSkgJiYgIUJPNChpbnNuKSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdC10YWtlbi4KLQkJICAgICAgSWYgdGhpcyBpcyBhIGZvcndhcmQgYnJhbmNoLCBpdCBpcyBwcm9ibGVtYXRpYy4KLSAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB3ZSBjYW4ndCB0ZWxsIHN0YXRpY2FsbHkgaWYgaXQgd2lsbCBicmFuY2ggZm9yd2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoZSBwcmVkaWN0aW9uIGJpdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnNuIHw9IDB4MDAyMDAwMDA7ICAgLyogc2V0IHRoZSBwcmVkaWN0aW9uIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jdW5kZWYgQk8wCi0jdW5kZWYgQk8yCi0jdW5kZWYgQk80Ci0gICAgICAgICAgICAgIGlmIChtb2RpZmllZCkKLQkgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgaXNlY19vZmZzZXQpOwotCQkgIHNlY3Rpb25fbW9kaWZpZWQgPSB0cnVlOwotCSAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBpZiAoc2VjdGlvbl9tb2RpZmllZCkKLQl7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgaWYgKHJlbGFfY29tYiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbGFfY29tYik7Ci0gICAgICByZWxhX2NvbWIgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotZXJyb3JfcmV0dXJuOgotICBpZiAocmVsYV9jb21iICE9IE5VTEwpCi0gICAgZnJlZSAocmVsYV9jb21iKTsKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQwKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcHBjX3JlbG9jID0gUl9QUENfTk9ORTsKLQotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbUl9QUENfQUREUjMyXSkKLSAgICAvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBzd2l0Y2ggKChpbnQpY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgkJcHBjX3JlbG9jID0gUl9QUENfTk9ORTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMzI7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkEyNjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTRfQlJUQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU46CXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IyNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDI0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDE0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUlRBS0VOOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfR09UMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2X0dPVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0xPOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9HT1RPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19HT1QxNl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkY6CXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19DT1BZOgkJcHBjX3JlbG9jID0gUl9QUENfQ09QWTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQ6CXBwY19yZWxvYyA9IFJfUFBDX0dMT0JfREFUOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQzoJcHBjX3JlbG9jID0gUl9QUENfTE9DQUwyNFBDOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQlwcGNfcmVsb2MgPSBSX1BQQ19SRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfUExUT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRjoJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDE2OgkJcHBjX3JlbG9jID0gUl9QUENfU0RBUkVMMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9CQVNFUkVMOgkJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9MTzsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19TRUNUT0ZGX0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1RPQzE2OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE86CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0xPOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEk6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hJOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hBOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQUkxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTJJMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUw6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9TREEyUkVMOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMToJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTIxOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9NUktSRUY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2OglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU0VDMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEk7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQ6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9CSVRfRkxEOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTREE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoJcHBjX3JlbG9jID0gUl9QUENfR05VX1ZUSU5IRVJJVDsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOglwcGNfcmVsb2MgPSBSX1BQQ19HTlVfVlRFTlRSWTsJCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClwcGNfcmVsb2MgXTsKLX07Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBQb3dlclBDIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGlmICghcHBjX2VsZl9ob3d0b190YWJsZVsgUl9QUENfQUREUjMyIF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgcHBjX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9QUENfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9IHBwY19lbGZfaG93dG9fdGFibGVbRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotCi0vKiBIYW5kbGUgdGhlIFJfUFBDX0FERFIxNl9IQSByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19lbGZfYWRkcjE2X2hhX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgcmVsb2NfZW50cnktPmFkZGVuZCArPSAocmVsb2NhdGlvbiAmIDB4ODAwMCkgPDwgMTsKLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBzZXQgd2hldGhlciBhIG1vZHVsZSBuZWVkcyB0aGUgLW1yZWxvY2F0YWJsZSBiaXQgc2V0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZyAqLwotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotICBib29sZWFuIGVycm9yOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmIChpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm1zZzsKLQotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChpYmZkKSkKLQltc2cgPSBfKCIlczogY29tcGlsZWQgZm9yIGEgYmlnIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBsaXR0bGUgZW5kaWFuIik7Ci0gICAgICBlbHNlCi0JbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGxpdHRsZSBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgYmlnIGVuZGlhbiIpOwotCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIG5ld19mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCS8qIEZpcnN0IGNhbGwsIG5vIGZsYWdzIHNldCAqLwotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICB9Ci0KLSAgZWxzZSBpZiAobmV3X2ZsYWdzID09IG9sZF9mbGFncykJLyogQ29tcGF0aWJsZSBmbGFncyBhcmUgb2sgKi8KLSAgICA7Ci0KLSAgZWxzZQkJCQkJLyogSW5jb21wYXRpYmxlIGZsYWdzICovCi0gICAgewotICAgICAgLyogV2FybiBhYm91dCAtbXJlbG9jYXRhYmxlIG1pc21hdGNoLiAgQWxsb3cgLW1yZWxvY2F0YWJsZS1saWIgdG8gYmUgbGlua2VkCi0gICAgICAgICB3aXRoIGVpdGhlci4gICovCi0gICAgICBlcnJvciA9IGZhbHNlOwotICAgICAgaWYgKChuZXdfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEUpICE9IDAKLQkgICYmIChvbGRfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpID09IDApCi0JewotCSAgZXJyb3IgPSB0cnVlOwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogY29tcGlsZWQgd2l0aCAtbXJlbG9jYXRhYmxlIGFuZCBsaW5rZWQgd2l0aCBtb2R1bGVzIGNvbXBpbGVkIG5vcm1hbGx5IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoKG5ld19mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCKSkgPT0gMAotCSAgICAgICAmJiAob2xkX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKSAhPSAwKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNvbXBpbGVkIG5vcm1hbGx5IGFuZCBsaW5rZWQgd2l0aCBtb2R1bGVzIGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCX0KLQotICAgICAgLyogVGhlIG91dHB1dCBpcyAtbXJlbG9jYXRhYmxlLWxpYiBpZmYgYm90aCB0aGUgaW5wdXQgZmlsZXMgYXJlLiAgKi8KLSAgICAgIGlmICghIChuZXdfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEVfTElCKSkKLQllbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyAmPSB+RUZfUFBDX1JFTE9DQVRBQkxFX0xJQjsKLQotICAgICAgLyogVGhlIG91dHB1dCBpcyAtbXJlbG9jYXRhYmxlIGlmZiBpdCBjYW4ndCBiZSAtbXJlbG9jYXRhYmxlLWxpYiwKLSAgICAgICAgIGJ1dCBlYWNoIGlucHV0IGZpbGUgaXMgZWl0aGVyIC1tcmVsb2NhdGFibGUgb3IgLW1yZWxvY2F0YWJsZS1saWIuICAqLwotICAgICAgaWYgKCEgKGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikKLQkgICYmIChuZXdfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiB8IEVGX1BQQ19SRUxPQ0FUQUJMRSkpCi0JICAmJiAob2xkX2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfUkVMT0NBVEFCTEUpKSkKLQllbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyB8PSBFRl9QUENfUkVMT0NBVEFCTEU7Ci0KLSAgICAgIC8qIERvIG5vdCB3YXJuIGFib3V0IGVhYmkgdnMuIFYuNCBtaXNtYXRjaCwganVzdCBvciBpbiB0aGUgYml0IGlmIGFueSBtb2R1bGUgdXNlcyBpdCAqLwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgfD0gKG5ld19mbGFncyAmIEVGX1BQQ19FTUIpOwotCi0gICAgICBuZXdfZmxhZ3MgJj0gfiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiB8IEVGX1BQQ19FTUIpOwotICAgICAgb2xkX2ZsYWdzICY9IH4gKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfRU1CKTsKLQotICAgICAgLyogV2FybiBhYm91dCBhbnkgb3RoZXIgbWlzbWF0Y2hlcyAqLwotICAgICAgaWYgKG5ld19mbGFncyAhPSBvbGRfZmxhZ3MpCi0JewotCSAgZXJyb3IgPSB0cnVlOwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdXNlcyBkaWZmZXJlbnQgZV9mbGFncyAoMHglbHgpIGZpZWxkcyB0aGFuIHByZXZpb3VzIG1vZHVsZXMgKDB4JWx4KSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIChsb25nKW5ld19mbGFncywgKGxvbmcpb2xkX2ZsYWdzKTsKLQl9Ci0KLSAgICAgIGlmIChlcnJvcikKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBIYW5kbGUgYSBQb3dlclBDIHNwZWNpZmljIHNlY3Rpb24gd2hlbiByZWFkaW5nIGFuIG9iamVjdCBmaWxlLiAgVGhpcwotICAgaXMgY2FsbGVkIHdoZW4gZWxmY29kZS5oIGZpbmRzIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3c2VjdCA9IGhkci0+YmZkX3NlY3Rpb247Ci0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0KTsKLSAgaWYgKGhkci0+c2hfZmxhZ3MgJiBTSEZfRVhDTFVERSkKLSAgICBmbGFncyB8PSBTRUNfRVhDTFVERTsKLQotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9PUkRFUkVEKQotICAgIGZsYWdzIHw9IFNFQ19TT1JUX0VOVFJJRVM7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0LCBmbGFncyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBTZXQgdXAgYW55IG90aGVyIHNlY3Rpb24gZmxhZ3MgYW5kIHN1Y2ggdGhhdCBtYXkgYmUgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZmFrZV9zZWN0aW9ucyAoYWJmZCwgc2hkciwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpzaGRyOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci17Ci0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0VYQ0xVREUpICE9IDApCi0gICAgc2hkci0+c2hfZmxhZ3MgfD0gU0hGX0VYQ0xVREU7Ci0KLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfU09SVF9FTlRSSUVTKSAhPSAwKQotICAgIHNoZHItPnNoX3R5cGUgPSBTSFRfT1JERVJFRDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiAqLwotc3RhdGljIGVsZl9saW5rZXJfc2VjdGlvbl90ICoKLXBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSB3aGljaDsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotCi0gIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCi0gIGlmICghZHlub2JqKQotICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLSAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOwotICBpZiAoIWxzZWN0KQotICAgIHsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl90IGRlZmF1bHRzOwotICAgICAgc3RhdGljIGVsZl9saW5rZXJfc2VjdGlvbl90IHplcm9fc2VjdGlvbjsKLQotICAgICAgZGVmYXVsdHMgPSB6ZXJvX3NlY3Rpb247Ci0gICAgICBkZWZhdWx0cy53aGljaCA9IHdoaWNoOwotICAgICAgZGVmYXVsdHMuaG9sZV93cml0dGVuX3AgPSBmYWxzZTsKLSAgICAgIGRlZmF1bHRzLmFsaWdubWVudCA9IDI7Ci0KLSAgICAgIC8qIEJvdGggb2YgdGhlc2Ugc2VjdGlvbnMgYXJlICh0ZWNobmljYWxseSkgY3JlYXRlZCBieSB0aGUgdXNlcgotCSBwdXR0aW5nIGRhdGEgaW4gdGhlbSwgc28gdGhleSBzaG91bGRuJ3QgYmUgbWFya2VkCi0JIFNFQ19MSU5LRVJfQ1JFQVRFRC4KLQotCSBUaGUgbGlua2VyIGNyZWF0ZXMgdGhlbSBzbyBpdCBoYXMgc29tZXdoZXJlIHRvIGF0dGFjaCB0aGVpcgotCSByZXNwZWN0aXZlIHN5bWJvbHMuIEluIGZhY3QsIGlmIHRoZXkgd2VyZSBlbXB0eSBpdCB3b3VsZAotCSBiZSBPSyB0byBsZWF2ZSB0aGUgc3ltYm9sIHNldCB0byAwIChvciBhbnkgcmFuZG9tIG51bWJlciksIGJlY2F1c2UKLQkgdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyIHNob3VsZCBuZXZlciBiZSB1c2VkLiAgKi8KLSAgICAgIGRlZmF1bHRzLmZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJfCBTRUNfSU5fTUVNT1JZKTsKLQotICAgICAgc3dpdGNoICh3aGljaCkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFVua25vd24gc3BlY2lhbCBsaW5rZXIgdHlwZSAlZCIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgKGludCl3aGljaCk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQljYXNlIExJTktFUl9TRUNUSU9OX1NEQVRBOgkvKiAuc2RhdGEvLnNic3Mgc2VjdGlvbiAqLwotCSAgZGVmYXVsdHMubmFtZQkJICA9ICIuc2RhdGEiOwotCSAgZGVmYXVsdHMucmVsX25hbWUJICA9ICIucmVsYS5zZGF0YSI7Ci0JICBkZWZhdWx0cy5ic3NfbmFtZQkgID0gIi5zYnNzIjsKLQkgIGRlZmF1bHRzLnN5bV9uYW1lCSAgPSAiX1NEQV9CQVNFXyI7Ci0JICBkZWZhdWx0cy5zeW1fb2Zmc2V0CSAgPSAzMjc2ODsKLQkgIGJyZWFrOwotCi0JY2FzZSBMSU5LRVJfU0VDVElPTl9TREFUQTI6CS8qIC5zZGF0YTIvLnNic3MyIHNlY3Rpb24gKi8KLQkgIGRlZmF1bHRzLm5hbWUJCSAgPSAiLnNkYXRhMiI7Ci0JICBkZWZhdWx0cy5yZWxfbmFtZQkgID0gIi5yZWxhLnNkYXRhMiI7Ci0JICBkZWZhdWx0cy5ic3NfbmFtZQkgID0gIi5zYnNzMiI7Ci0JICBkZWZhdWx0cy5zeW1fbmFtZQkgID0gIl9TREEyX0JBU0VfIjsKLQkgIGRlZmF1bHRzLnN5bV9vZmZzZXQJICA9IDMyNzY4OwotCSAgZGVmYXVsdHMuZmxhZ3MJIHw9IFNFQ19SRUFET05MWTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbHNlY3QgPSBfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoLCAmZGVmYXVsdHMpOwotICAgIH0KLQotICByZXR1cm4gbHNlY3Q7Ci19Ci0KLQwKLS8qIElmIHdlIGhhdmUgYSBub24temVybyBzaXplZCAuc2JzczIgb3IgLlBQQy5FTUIuc2JzczAgc2VjdGlvbnMsIHdlIG5lZWQgdG8gYnVtcCB1cAotICAgdGhlIG51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgaW50Ci1wcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBpbnQgcmV0OwotCi0gIHJldCA9IDA7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmludGVycCIpOwotICBpZiAocyAhPSBOVUxMKQotICAgICsrcmV0OwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zYnNzMiIpOwotICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwICYmIHMtPl9yYXdfc2l6ZSA+IDApCi0gICAgKytyZXQ7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLlBQQy5FTUIuc2JzczAiKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCAmJiBzLT5fcmF3X3NpemUgPiAwKQotICAgICsrcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIE1vZGlmeSB0aGUgc2VnbWVudCBtYXAgaWYgbmVlZGVkICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgaGF2ZSB0byBjcmVhdGUgLmR5bnNic3MgYW5kIC5yZWxhLnNic3MgaGVyZSBzbyB0aGF0IHRoZXkgZ2V0IG1hcHBlZAotICAgdG8gb3V0cHV0IHNlY3Rpb25zIChqdXN0IGxpa2UgX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgaGFzCi0gICB0byBjcmVhdGUgLmR5bmJzcyBhbmQgLnJlbGEuYnNzKS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyhhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zYnNzIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsYS5zYnNzIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLSAgYmZkX3ZtYSBwbHRfb2Zmc2V0OwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgY2FsbGVkIGZvciAlc1xuIiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKCghaW5mby0+c2hhcmVkIHx8IGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0JICB8fCAoaW5mby0+c2hhcmVkICYmIGgtPnBsdC5yZWZjb3VudCA8PSAwKSkKLQl7Ci0JICAvKiBBIFBMVCBlbnRyeSBpcyBub3QgcmVxdWlyZWQvYWxsb3dlZCB3aGVuOgotCi0JICAgICAxLiBXZSBhcmUgbm90IHVzaW5nIGxkLnNvOyBiZWNhdXNlIHRoZW4gdGhlIFBMVCBlbnRyeQotCSAgICAgY2FuJ3QgYmUgc2V0IHVwLCBzbyB3ZSBjYW4ndCB1c2Ugb25lLgotCi0JICAgICAyLiBXZSBrbm93IGZvciBjZXJ0YWluIHRoYXQgYSBzeW1ib2wgaXMgZGVmaW5lZCBpbgotCSAgICAgdGhpcyBvYmplY3QsIGJlY2F1c2UgdGhpcyBvYmplY3QgaXMgdGhlIGFwcGxpY2F0aW9uLAotCSAgICAgaXMgbGlua2VkIHdpdGggLUJzeW1ib2xpYywgb3IgYmVjYXVzZSB0aGUgc3ltYm9sIGlzIGxvY2FsLgotCi0JICAgICAzLiBHQyBoYXMgcmVuZGVyZWQgdGhlIGVudHJ5IHVudXNlZC4KLQkgICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaW4gYW4gZXhlY3V0YWJsZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUKLQkgICAgIHN5bWJvbCBnbyB0byB0aGUgUExULCBzbyB3ZSBjYW4ndCB0dXJuIGl0IG9mZiBpbiB0aGF0IGNhc2UuCi0JICAgICA/Pz8gVGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gaGVyZSBpcyB0byByZWZlcmVuY2UgY291bnQKLQkgICAgIGFsbCB1c2VzIG9mIHRoZSBzeW1ib2wsIG5vdCBqdXN0IHRob3NlIHRvIHRoZSBHT1Qgb3IgUExULiAgKi8KLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0lOSVRJQUxfRU5UUllfU0laRTsKLQotICAgICAgLyogVGhlIFBvd2VyUEMgUExUIGlzIGFjdHVhbGx5IGNvbXBvc2VkIG9mIHR3byBwYXJ0cywgdGhlIGZpcnN0IHBhcnQKLQkgaXMgMiB3b3JkcyAoZm9yIGEgbG9hZCBhbmQgYSBqdW1wKSwgYW5kIHRoZW4gdGhlcmUgaXMgYSByZW1haW5pbmcKLQkgd29yZCBhdmFpbGFibGUgYXQgdGhlIGVuZC4gICovCi0gICAgICBwbHRfb2Zmc2V0ID0gKFBMVF9JTklUSUFMX0VOVFJZX1NJWkUKLQkJICAgICsgKFBMVF9TTE9UX1NJWkUKLQkJICAgICAgICogKChzLT5fcmF3X3NpemUgLSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFKQotCQkJICAvIFBMVF9FTlRSWV9TSVpFKSkpOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcGx0X29mZnNldDsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBwbHRfb2Zmc2V0OwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICBBZnRlciB0aGUgODE5Mm5kIGVudHJ5LCByb29tCi0gICAgICAgICBmb3IgdHdvIGVudHJpZXMgaXMgYWxsb2NhdGVkLiAgKi8KLSAgICAgIGlmICgocy0+X3Jhd19zaXplIC0gUExUX0lOSVRJQUxfRU5UUllfU0laRSkgLyBQTFRfRU5UUllfU0laRQotCSAgPj0gUExUX05VTV9TSU5HTEVfRU5UUklFUykKLQlzLT5fcmF3X3NpemUgKz0gMiAqIFBMVF9FTlRSWV9TSVpFOwotICAgICAgZWxzZQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuCi0KLSAgICAgT2YgY291cnNlLCBpZiB0aGUgc3ltYm9sIGlzIHN1ZmZpY2llbnRseSBzbWFsbCwgd2UgbXVzdCBpbnN0ZWFkCi0gICAgIGFsbG9jYXRlIGl0IGluIC5zYnNzLiAgRklYTUU6IEl0IHdvdWxkIGJlIGJldHRlciB0byBkbyB0aGlzIGlmIGFuZAotICAgICBvbmx5IGlmIHRoZXJlIHdlcmUgYWN0dWFsbHkgU0RBUkVMIHJlbG9jcyBmb3IgdGhhdCBzeW1ib2wuICAqLwotCi0gIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnNic3MiKTsKLSAgZWxzZQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1BQQ19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWxhLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuc2JzcyIpOwotICAgICAgZWxzZQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gNCkKLSAgICBwb3dlcl9vZl90d28gPSA0OwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcGx0OwotICBib29sZWFuIHJlbG9jczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgY2FsbGVkXG4iKTsKLSNlbmRpZgotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290LCAucmVsYS5zZGF0YSwgYW5kCi0JIC5yZWxhLnNkYXRhMiBzZWN0aW9ucy4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlCi0JIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQKLQkgdGhlIHNpemUgb2YgLnJlbGEuZ290LCBldCBhbCwgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQKLQkgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUgYmVsb3cuICAqLwotICAgICAgc3RhdGljIGNoYXIgKnJlbGFfc2VjdGlvbnNbXSA9IHsgIi5yZWxhLmdvdCIsICIucmVsYS5zZGF0YSIsCi0JCQkJICAgICAgICIucmVsYS5zZGF0YTIiLCAiLnJlbGEuc2JzcyIsCi0JCQkJICAgICAgIChjaGFyICopMCB9OwotICAgICAgY2hhciAqKnA7Ci0KLSAgICAgIGZvciAocCA9IHJlbGFfc2VjdGlvbnM7ICpwICE9IChjaGFyICopMDsgcCsrKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAqcCk7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBzLT5fcmF3X3NpemUgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICBwbHQgPSBmYWxzZTsKLSAgcmVsb2NzID0gZmFsc2U7Ci0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLwotCSAgICAgIHBsdCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2NhdGlvbiBzZWN0aW9ucy4gKi8KLQkgICAgICByZWxvY3MgPSB0cnVlOwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZ290IikgIT0gMAotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5zZGF0YTIiKSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAoaW5mbywgcyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxvY3MpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCQlzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGE7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YTI7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGFzZWN0aW9uICpzZ290ID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNyZWxnb3QgPSBOVUxMOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2NoZWNrX3JlbG9jcyBjYWxsZWQgZm9yIHNlY3Rpb24gJXMgaW4gJXNcbiIsCi0JICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotI2VuZGlmCi0KLSAgLyogQ3JlYXRlIHRoZSBsaW5rZXIgZ2VuZXJhdGVkIHNlY3Rpb25zIGFsbCB0aGUgdGltZSBzbyB0aGF0IHRoZQotICAgICBzcGVjaWFsIHN5bWJvbHMgYXJlIGNyZWF0ZWQuICAqLwotCi0gIGlmICgoc2RhdGEgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGFiZmQsIExJTktFUl9TRUNUSU9OX1NEQVRBKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZGF0YSA9IHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBMSU5LRVJfU0VDVElPTl9TREFUQSk7Ci0gICAgICBpZiAoIXNkYXRhKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICBpZiAoKHNkYXRhMiA9IGVsZl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgTElOS0VSX1NFQ1RJT05fU0RBVEEyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZGF0YTIgPSBwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgTElOS0VSX1NFQ1RJT05fU0RBVEEyKTsKLSAgICAgIGlmICghc2RhdGEyKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCi0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgLyogSWYgYSByZWxvY2F0aW9uIHJlZmVycyB0byBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIGNyZWF0ZSB0aGUgLmdvdC4KLQkgVGhpcyBzaG93cyB1cCBpbiBwYXJ0aWN1bGFyIGluIGFuIFJfUFBDX0FERFIzMiBpbiB0aGUgZWFiaQotCSBzdGFydHVwIGNvZGUuICAqLwotICAgICAgaWYgKGggJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQl7Ci0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JLyogR09UMTYgcmVsb2NhdGlvbnMgKi8KLQljYXNlIFJfUFBDX0dPVDE2OgotCWNhc2UgUl9QUENfR09UMTZfTE86Ci0JY2FzZSBSX1BQQ19HT1QxNl9ISToKLQljYXNlIFJfUFBDX0dPVDE2X0hBOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAtMSkKLQkJewotCQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgIC8qIEFsbG9jYXRlIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICAvKiBBbGxvY2F0ZSByZWxvY2F0aW9uIHNwYWNlLiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCQkgIGgtPmdvdC5yZWZjb3VudCA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWgtPmdvdC5yZWZjb3VudCsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzID09IE5VTEwpCi0JCXsKLQkJICBzaXplX3Qgc2l6ZTsKLQotCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfc2lnbmVkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IChiZmRfc2lnbmVkX3ZtYSAqKQotCQkgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKSA9IGxvY2FsX2dvdF9yZWZjb3VudHM7Ci0JCSAgbWVtc2V0IChsb2NhbF9nb3RfcmVmY291bnRzLCAtMSwgc2l6ZSk7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gLTEpCi0JCXsKLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGEgUl9QUENfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCQkgIGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0rKzsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEgcmVsb2NhdGlvbiAqLwotCWNhc2UgUl9QUENfRU1CX1NEQUkxNjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICJSX1BQQ19FTUJfU0RBSTE2IikpOwotCSAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCFiZmRfZWxmMzJfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHNkYXRhLCBoLCByZWwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGJyZWFrOwotCi0JLyogSW5kaXJlY3QgLnNkYXRhMiByZWxvY2F0aW9uICovCi0JY2FzZSBSX1BQQ19FTUJfU0RBMkkxNjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICJSX1BQQ19FTUJfU0RBMkkxNiIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCFiZmRfZWxmMzJfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHNkYXRhMiwgaCwgcmVsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9QUENfU0RBUkVMMTY6Ci0JY2FzZSBSX1BQQ19FTUJfU0RBMlJFTDoKLQljYXNlIFJfUFBDX0VNQl9TREEyMToKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCXBwY19lbGZfaG93dG9fdGFibGVbKGludClFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKV0tPm5hbWUpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQQ19QTFQzMjoKLQljYXNlIFJfUFBDX1BMVFJFTDI0OgotCWNhc2UgUl9QUENfUExUMTZfTE86Ci0JY2FzZSBSX1BQQ19QTFQxNl9ISToKLQljYXNlIFJfUFBDX1BMVDE2X0hBOgotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJSZWxvYyByZXF1aXJlcyBhIFBMVCBlbnRyeVxuIik7Ci0jZW5kaWYKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdpdGhvdXQKLSAgICAgICAgICAgICBsaW5raW5nIGluIGFueSBkeW5hbWljIG9iamVjdHMsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QKLSAgICAgICAgICAgICBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIHByb2NlZHVyZSBsaW5rYWdlCi0gICAgICAgICAgICAgICAgIHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkgICAgewotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGUgZm9sbG93aW5nIHJlbG9jYXRpb25zIGRvbid0IG5lZWQgdG8gcHJvcGFnYXRlIHRoZQotCSAgICAgcmVsb2NhdGlvbiBpZiBsaW5raW5nIGEgc2hhcmVkIG9iamVjdCBzaW5jZSB0aGV5IGFyZQotCSAgICAgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JY2FzZSBSX1BQQ19TRUNUT0ZGOgotCWNhc2UgUl9QUENfU0VDVE9GRl9MTzoKLQljYXNlIFJfUFBDX1NFQ1RPRkZfSEk6Ci0JY2FzZSBSX1BQQ19TRUNUT0ZGX0hBOgotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVmZXJzIG9ubHkgdG8gZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5ICovCi0JY2FzZSBSX1BQQ19MT0NBTDI0UEM6Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9QUENfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfUFBDX0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCSAgICAgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLQkgICAgIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoZSByZWxvYy4gICovCi0JY2FzZSBSX1BQQ19SRUwyNDoKLQljYXNlIFJfUFBDX1JFTDE0OgotCWNhc2UgUl9QUENfUkVMMTRfQlJUQUtFTjoKLQljYXNlIFJfUFBDX1JFTDE0X0JSTlRBS0VOOgotCWNhc2UgUl9QUENfUkVMMzI6Ci0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCWRlZmF1bHQ6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2NoZWNrX3JlbG9jcyBuZWVkIHRvIGNyZWF0ZSByZWxvY2F0aW9uIGZvciAlc1xuIiwKLQkJICAgICAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iKTsKLSNlbmRpZgotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgaGVyZSBkbyB3aGF0IHRoZSBtNjhrIGFuZCBpMzg2Ci0JCSBiYWNrZW5kcyBkbzogaWYgdGhlIHJlbG9jIGlzIHBjLXJlbGF0aXZlLCByZWNvcmQgaXQKLQkJIGluIGNhc2UgaXQgdHVybnMgb3V0IHRoYXQgdGhlIHJlbG9jIGlzIHVubmVjZXNzYXJ5Ci0JCSBiZWNhdXNlIHRoZSBzeW1ib2wgaXMgZm9yY2VkIGxvY2FsIGJ5IHZlcnNpb25pbmcgb3IKLQkJIHdlIGFyZSBsaW5raW5nIHdpdGggLUJkeW5hbWljLiAgRm9ydHVuYXRlbHkgdGhpcwotCQkgY2FzZSBpcyBub3QgZnJlcXVlbnQuICAqLwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1wcGNfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfUFBDX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX1BQQ19HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1BQQ19HT1QxNjoKLSAgICAgIGNhc2UgUl9QUENfR09UMTZfTE86Ci0gICAgICBjYXNlIFJfUFBDX0dPVDE2X0hJOgotICAgICAgY2FzZSBSX1BQQ19HT1QxNl9IQToKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotCSAgICAgIGgtPmdvdC5yZWZjb3VudC0tOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID4gMCkKLQkgICAgICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XS0tOwotCSAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBSX1BQQ19QTFQzMjoKLSAgICAgIGNhc2UgUl9QUENfUExUUkVMMjQ6Ci0gICAgICBjYXNlIFJfUFBDX1BMVDE2X0xPOgotICAgICAgY2FzZSBSX1BQQ19QTFQxNl9ISToKLSAgICAgIGNhc2UgUl9QUENfUExUMTZfSEE6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+cGx0LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5wbHQucmVmY291bnQtLTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSB1c2UgaXQgdG8gcHV0IC5jb21tIGl0ZW1zIGluIC5zYnNzLCBhbmQgbm90IC5ic3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmbGFnd29yZCAqZmxhZ3NwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTgotICAgICAgJiYgIWluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3ltLT5zdF9zaXplIDw9IChiZmRfdm1hKSBiZmRfZ2V0X2dwX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAtRyBubiBieXRlcyBhcmUgYXV0b21hdGljYWxseQotCSBwdXQgaW50byAuc2RhdGEuICAqLwotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhCi0JPSBwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgTElOS0VSX1NFQ1RJT05fU0RBVEEpOwotCi0gICAgICBpZiAoIXNkYXRhLT5ic3Nfc2VjdGlvbikKLQl7Ci0JICAvKiBXZSBkb24ndCBnbyB0aHJvdWdoIGJmZF9tYWtlX3NlY3Rpb24sIGJlY2F1c2Ugd2UgZG9uJ3QKLSAgICAgICAgICAgICB3YW50IHRvIGF0dGFjaCB0aGlzIGNvbW1vbiBzZWN0aW9uIHRvIERZTk9CSi4gIFRoZSBsaW5rZXIKLSAgICAgICAgICAgICB3aWxsIG1vdmUgdGhlIHN5bWJvbHMgdG8gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBzZWN0aW9uCi0gICAgICAgICAgICAgd2hlbiBpdCBkZWZpbmVzIGNvbW1vbiBzeW1ib2xzLiAgKi8KLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbiA9ICgoYXNlY3Rpb24gKikKLQkJCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSkpOwotCSAgaWYgKHNkYXRhLT5ic3Nfc2VjdGlvbiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPm5hbWUgPSBzZGF0YS0+YnNzX25hbWU7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBzZGF0YS0+YnNzX3NlY3Rpb247Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbCA9Ci0JICAgIChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2xfcHRyX3B0ciA9Ci0JICAgIChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wgKikpOwotCSAgaWYgKHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sID09IE5VTEwKLQkgICAgICB8fCBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sLT5uYW1lID0gc2RhdGEtPmJzc19uYW1lOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wtPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wtPnNlY3Rpb24gPSBzZGF0YS0+YnNzX3NlY3Rpb247Ci0JICAqc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2xfcHRyX3B0ciA9IHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sOwotCX0KLQotICAgICAgKnNlY3AgPSBzZGF0YS0+YnNzX3NlY3Rpb247Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgY2FsbGVkIGZvciAlcyIsCi0JICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0gICAgICBiZmRfdm1hIHJlbG9jX2luZGV4OwotCi0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiwgcGx0X29mZnNldCA9ICVkIiwgaC0+cGx0Lm9mZnNldCk7Ci0jZW5kaWYKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFNldAotICAgICAgICAgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBmaWxsIGluIHRoZSAucGx0LiAgVGhlIHBwYyBkeW5hbWljIGxpbmtlcgotCSB3aWxsIGZpbGwgaXQgaW4uICAqLwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9QUENfSk1QX1NMT1QpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0KLSAgICAgIHJlbG9jX2luZGV4ID0gKGgtPnBsdC5vZmZzZXQgLSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFKSAvIFBMVF9TTE9UX1NJWkU7Ci0gICAgICBpZiAocmVsb2NfaW5kZXggPiBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTKQotCXJlbG9jX2luZGV4IC09IChyZWxvY19pbmRleCAtIFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMpIC8gMjsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHJlbG9jX2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0gICAgICAgICB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgVGhlIGVudHJ5IGluCi0JIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgaW4KLQkgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1BQQ19SRUxBVElWRSk7Ci0JICByZWxhLnJfYWRkZW5kID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQoKGgtPmdvdC5vZmZzZXQgJiAxKSA9PSAwKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfUFBDX0dMT0JfREFUKTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2xzIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLCBjb3B5Iik7Ci0jZW5kaWYKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAgICIucmVsYS5zYnNzIik7Ci0gICAgICBlbHNlCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfUFBDX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGFzZWN0aW9uICpzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgY2FsbGVkXG4iKTsKLSNlbmRpZgotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGJvb2xlYW4gc2l6ZTsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUExUR09UOiAgIG5hbWUgPSAiLnBsdCI7CSAgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gdHJ1ZTsgIGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogICBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CSAgICAgIG5hbWUgPSBOVUxMOwkgIHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG5hbWUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBpZiAocyA9PSBOVUxMKQotCQlkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgc2l6ZSkKLQkJICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgICAgIGVsc2UKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCQkgICAgfQotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWRkIGEgYmxybCBpbnN0cnVjdGlvbiBhdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8tNCBzbyB0aGF0IGEgZnVuY3Rpb24gY2FuCi0gICAgIGVhc2lseSBmaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICAqLwotICBpZiAoc2dvdCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50cyA9IHNnb3QtPmNvbnRlbnRzOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg0ZTgwMDAyMSAvKiBibHJsICovLCBjb250ZW50cyk7Ci0KLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIGNvbnRlbnRzKzQpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIGNvbnRlbnRzKzQpOwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIKLSAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgIHplcm8uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcgkJICA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBiZmQgKmR5bm9iagkJCQkgID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YQkJICA9IChkeW5vYmopID8gZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIExJTktFUl9TRUNUSU9OX1NEQVRBKSAgOiBOVUxMOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEyCQkgID0gKGR5bm9iaikgPyBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgTElOS0VSX1NFQ1RJT05fU0RBVEEyKSA6IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwJCSAgPSByZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQJCSAgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYXNlY3Rpb24gKnNyZWxvYwkJCSAgPSBOVUxMOwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBib29sZWFuIHJldAkJCQkgID0gdHJ1ZTsKLSAgbG9uZyBpbnNuOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbGxlZCBmb3IgJXMgc2VjdGlvbiAlcywgJWxkIHJlbG9jYXRpb25zJXNcbiIsCi0JICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICBiZmRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JICAgKGxvbmcpaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQsCi0JICAgKGluZm8tPnJlbG9jYXRlYWJsZSkgPyAiIChyZWxvY2F0YWJsZSkiIDogIiIpOwotI2VuZGlmCi0KLSAgaWYgKCFwcGNfZWxmX2hvd3RvX3RhYmxlWyBSX1BQQ19BRERSMzIgXSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBwcGNfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc3BsdCA9IHNnb3QgPSBOVUxMOwotICBpZiAoZHlub2JqICE9IE5VTEwpCi0gICAgewotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICB9Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcl90eXBlCT0gKGVudW0gZWxmX3BwY19yZWxvY190eXBlKUVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgYmZkX3ZtYSBvZmZzZXQJCQk9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBiZmRfdm1hIGFkZGVuZAkJCT0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByCQk9IGJmZF9yZWxvY19vdGhlcjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bQkJPSAoRWxmX0ludGVybmFsX1N5bSAqKTA7Ci0gICAgICBhc2VjdGlvbiAqc2VjCQkJPSAoYXNlY3Rpb24gKikwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgJPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikwOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWUJCT0gKGNvbnN0IGNoYXIgKikwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gICAgICAvKiBVbmtub3duIHJlbG9jYXRpb24gaGFuZGxpbmcgKi8KLSAgICAgIGlmICgodW5zaWduZWQpcl90eXBlID49ICh1bnNpZ25lZClSX1BQQ19tYXggfHwgIXBwY19lbGZfaG93dG9fdGFibGVbKGludClyX3R5cGVdKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaG93dG8gPSBwcGNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpcl90eXBlXTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoKHVuc2lnbmVkKUVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkJICAgaG93dG8tPm5hbWUsCi0JCSAgIChpbnQpcl90eXBlLAotCQkgICByX3N5bW5keCwKLQkJICAgKGxvbmcpb2Zmc2V0LAotCQkgICAobG9uZylhZGRlbmQpOwotI2VuZGlmCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCi0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIHN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX1BQQ19QTFQzMgotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAocl90eXBlID09IFJfUFBDX0xPQ0FMMjRQQwotCQkgICAgICAmJiBzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgfHwgKChyX3R5cGUgPT0gUl9QUENfR09UMTYKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19HT1QxNl9MTwotCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX0dPVDE2X0hJCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfR09UMTZfSEEpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCQkgIC8qIFRlc3RpbmcgU0VDX0RFQlVHR0lORyBoZXJlIG1heSBiZSB3cm9uZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQncyBoZXJlIHRvIGF2b2lkIGEgY3Jhc2ggd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBEV0FSRgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCQkgICAgICAgICAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIyNAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfTE8KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2X0hBCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTQKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNF9CUlRBS0VOCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTRfQlJOVEFLRU4KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1BMVFJFTDI0Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19DT1BZCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19HTE9CX0RBVAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfSk1QX1NMT1QKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1NEQVJFTDE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIzMgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjE2X0xPCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTZfSEEKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREFJMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREEySTE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMlJFTAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1NEQTIxCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTVJLUkVGCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfQklUX0ZMRAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1JFTFNEQQotCQkJICB8fCAoKHJfdHlwZSA9PSBSX1BQQ19SRUwyNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwzMgotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNF9CUlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTDE0X0JSTlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTEFUSVZFKQotCQkJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgICAgICAgICAoXygiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIiksCi0gICAgICAgICAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCSAgICAgICAgfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKShpbmZvLAotCQkJCQkJCSBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkJCSBpbnB1dF9iZmQsCi0JCQkJCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkJIHJlbC0+cl9vZmZzZXQsCi0JCQkJCQkJICghaW5mby0+c2hhcmVkCi0JCQkJCQkJICB8fCBpbmZvLT5ub191bmRlZmluZWQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKChpbnQpcl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQgZm9yIHN5bWJvbCAlcyIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAoaW50KXJfdHlwZSwgc3ltX25hbWUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0KLQkvKiBSZWxvY2F0aW9ucyB0aGF0IG5lZWQgbm8gc3BlY2lhbCBwcm9jZXNzaW5nLiAgKi8KLQljYXNlIChpbnQpUl9QUENfTE9DQUwyNFBDOgotCSAgLyogSXQgbWFrZXMgbm8gc2Vuc2UgdG8gcG9pbnQgYSBsb2NhbCByZWxvY2F0aW9uCi0JICAgICBhdCBhIHN5bWJvbCBub3QgaW4gdGhpcyBvYmplY3QuICAqLwotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAmJiBzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkgKGluZm8sCi0JCQkJCQkJICBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkJCSAgaW5wdXRfYmZkLAotCQkJCQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCQkgIHJlbC0+cl9vZmZzZXQsCi0JCQkJCQkJICB0cnVlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIFJlbG9jYXRpb25zIHRoYXQgbWF5IG5lZWQgdG8gYmUgcHJvcGFnYXRlZCBpZiB0aGlzIGlzIGEgc2hhcmVkCi0gICAgICAgICAgIG9iamVjdC4gICovCi0JY2FzZSAoaW50KVJfUFBDX1JFTDI0OgotCWNhc2UgKGludClSX1BQQ19SRUwzMjoKLQljYXNlIChpbnQpUl9QUENfUkVMMTQ6Ci0JICAvKiBJZiB0aGVzZSByZWxvY2F0aW9ucyBhcmUgbm90IHRvIGEgbmFtZWQgc3ltYm9sLCB0aGV5IGNhbiBiZQotCSAgICAgaGFuZGxlZCByaWdodCBoZXJlLCBubyBuZWVkIHRvIGJvdGhlciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCS8qIGZhbGwgdGhyb3VnaCAqLwotCi0JLyogUmVsb2NhdGlvbnMgdGhhdCBhbHdheXMgbmVlZCB0byBiZSBwcm9wYWdhdGVkIGlmIHRoaXMgaXMgYSBzaGFyZWQKLSAgICAgICAgICAgb2JqZWN0LiAgKi8KLQljYXNlIChpbnQpUl9QUENfTk9ORToKLQljYXNlIChpbnQpUl9QUENfQUREUjMyOgotCWNhc2UgKGludClSX1BQQ19BRERSMjQ6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNjoKLQljYXNlIChpbnQpUl9QUENfQUREUjE2X0xPOgotCWNhc2UgKGludClSX1BQQ19BRERSMTZfSEk6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNl9IQToKLQljYXNlIChpbnQpUl9QUENfQUREUjE0OgotCWNhc2UgKGludClSX1BQQ19VQUREUjMyOgotCWNhc2UgKGludClSX1BQQ19VQUREUjE2OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgICBib29sZWFuIHNraXA7Ci0KLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBuZWVkIHRvIGNyZWF0ZSByZWxvY2F0aW9uIGZvciAlc1xuIiwKLQkJICAgICAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iKTsKLSNlbmRpZgotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLSAgICAgICAgICAgICAgICAgdGltZS4gICovCi0KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChpbnB1dF9iZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQl9Ci0KLQkgICAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF92bWEgb2ZmOwotCi0JCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCX0KLQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChza2lwKQotCQltZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLSAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KLQkgICAgICBlbHNlIGlmIChoICE9IE5VTEwKLQkJICAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgcl90eXBlKTsKLQkJICBvdXRyZWwucl9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMzIpCi0JCSAgICB7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfUFBDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJICAgICAgfHwgKGgtPnJvb3QudHlwZQotCQkJCQkgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQl9Ci0JCSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQlpbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7Ci0JCQkgIEJGRF9BU1NFUlQoaW5keCA+IDApOwotI2lmZGVmIERFQlVHCi0JCQkgIGlmIChpbmR4IDw9IDApCi0JCQkgICAgewotCQkJICAgICAgcHJpbnRmKCJpbmR4PSVkIHNlY3Rpb249JXMgZmxhZ3M9JTA4eCBuYW1lPSVzXG4iLAotCQkJCSAgICAgaW5keCwgb3NlYy0+bmFtZSwgb3NlYy0+ZmxhZ3MsCi0JCQkJICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkJCSAgICB9Ci0jZW5kaWYKLQkJCX0KLQotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCByX3R5cGUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotICAgICAgICAgICAgICAgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQotICAgICAgICAgICAgICAgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoc2tpcAotCQkgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkgIHx8IEVMRjMyX1JfVFlQRSAob3V0cmVsLnJfaW5mbykgIT0gUl9QUENfUkVMQVRJVkUpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEFyaXRobWV0aWMgYWRqdXN0IHJlbG9jYXRpb25zIHRoYXQgYXJlbid0IGdvaW5nIGludG8gYQotCSAgICAgc2hhcmVkIG9iamVjdC4gICovCi0JICBpZiAocl90eXBlID09IFJfUFBDX0FERFIxNl9IQQotCSAgICAgIC8qIEl0J3MganVzdCBwb3NzaWJsZSB0aGF0IHRoaXMgc3ltYm9sIGlzIGEgd2VhayBzeW1ib2wKLQkJIHRoYXQncyBub3QgYWN0dWFsbHkgZGVmaW5lZCBhbnl3aGVyZS4gSW4gdGhhdCBjYXNlLAotCQkgJ3NlYycgd291bGQgYmUgTlVMTCwgYW5kIHdlIHNob3VsZCBsZWF2ZSB0aGUgc3ltYm9sCi0JCSBhbG9uZSAoaXQgd2lsbCBiZSBzZXQgdG8gemVybyBlbHNld2hlcmUgaW4gdGhlIGxpbmspLiAgKi8KLQkgICAgICAmJiBzZWMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFkZGVuZCArPSAoKHJlbG9jYXRpb24gKyBhZGRlbmQpICYgMHg4MDAwKSA8PCAxOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIGJyYW5jaCB0YWtlbiBwcmVkaWN0aW9uIHJlbG9jYXRpb25zICovCi0JY2FzZSAoaW50KVJfUFBDX0FERFIxNF9CUlRBS0VOOgotCWNhc2UgKGludClSX1BQQ19SRUwxNF9CUlRBS0VOOgotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKG91dHB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGlmICgocmVsb2NhdGlvbiAtIG9mZnNldCkgJiAweDgwMDApCi0JICAgIGluc24gJj0gfkJSQU5DSF9QUkVESUNUX0JJVDsKLQkgIGVsc2UKLQkgICAgaW5zbiB8PSBCUkFOQ0hfUFJFRElDVF9CSVQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBicmVhazsKLQotCS8qIGJyYW5jaCBub3QgdGFrZW4gcHJlZGljaXRpb24gcmVsb2NhdGlvbnMgKi8KLQljYXNlIChpbnQpUl9QUENfQUREUjE0X0JSTlRBS0VOOgotCWNhc2UgKGludClSX1BQQ19SRUwxNF9CUk5UQUtFTjoKLQkgIGluc24gPSBiZmRfZ2V0XzMyIChvdXRwdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBpZiAoKHJlbG9jYXRpb24gLSBvZmZzZXQpICYgMHg4MDAwKQotCSAgICBpbnNuIHw9IEJSQU5DSF9QUkVESUNUX0JJVDsKLQkgIGVsc2UKLQkgICAgaW5zbiAmPSB+QlJBTkNIX1BSRURJQ1RfQklUOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgYnJlYWs7Ci0KLQkvKiBHT1QxNiByZWxvY2F0aW9ucyAqLwotCWNhc2UgKGludClSX1BQQ19HT1QxNjoKLQljYXNlIChpbnQpUl9QUENfR09UMTZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX0dPVDE2X0hJOgotCWNhc2UgKGludClSX1BQQ19HT1QxNl9IQToKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0gICAgICAgICAgICAgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0gICAgICAgICAgICAgICAgICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgbG9jYWxseS4gIFdlIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlIHRoZSBvZmZzZXQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UgdXNlIHRoZSBsZWFzdAotICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJICAgICBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsYS5nb3QKLQkJICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCQkgICAgIGlzIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KLQkJICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCSAgICBvZmYgJj0gfjE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgICAgICBoLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gNDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICYmIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLQkJIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotCQkgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBlbnRyeS4gICovCi0JICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQlvZmYgJj0gfjE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCi0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgUl9QUENfUkVMQVRJVkUgcmVsb2MKLQkJCSBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJCSArIG9mZik7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfUFBDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbjsKLQkJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCQkgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCi0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gNDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEgcmVsb2NhdGlvbiAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfU0RBSTE2OgotCSAgQkZEX0FTU0VSVCAoc2RhdGEgIT0gTlVMTCk7Ci0JICByZWxvY2F0aW9uID0gYmZkX2VsZjMyX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sCi0JCQkJCQkJCXNkYXRhLCBoLCByZWxvY2F0aW9uLCByZWwsCi0JCQkJCQkJCVJfUFBDX1JFTEFUSVZFKTsKLQkgIGJyZWFrOwotCi0JLyogSW5kaXJlY3QgLnNkYXRhMiByZWxvY2F0aW9uICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9TREEySTE2OgotCSAgQkZEX0FTU0VSVCAoc2RhdGEyICE9IE5VTEwpOwotCSAgcmVsb2NhdGlvbiA9IGJmZF9lbGYzMl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLAotCQkJCQkJCQlzZGF0YTIsIGgsIHJlbG9jYXRpb24sIHJlbCwKLQkJCQkJCQkJUl9QUENfUkVMQVRJVkUpOwotCSAgYnJlYWs7Ci0KLQkvKiBIYW5kbGUgdGhlIFRPQzE2IHJlbG9jLiAgV2Ugd2FudCB0byB1c2UgdGhlIG9mZnNldCB3aXRoaW4gdGhlIC5nb3QKLQkgICBzZWN0aW9uLCBub3QgdGhlIGFjdHVhbCBWTUEuICBUaGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gZ2VuZXJhdGluZwotCSAgIGFuIGVtYmVkZGVkIEVMRiBvYmplY3QsIGZvciB3aGljaCB0aGUgLmdvdCBzZWN0aW9uIGFjdHMgbGlrZSB0aGUKLQkgICBBSVggLnRvYyBzZWN0aW9uLiAgKi8KLQljYXNlIChpbnQpUl9QUENfVE9DMTY6CQkJLyogcGhvbnkgR09UMTYgcmVsb2NhdGlvbnMgKi8KLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKQotCQkgICAgICB8fCBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLmdvdCIpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5jZ290IikgPT0gMCkKLQotCSAgYWRkZW5kIC09IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCArIDB4ODAwMDsKLQkgIGJyZWFrOwotCi0JY2FzZSAoaW50KVJfUFBDX1BMVFJFTDI0OgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMQotCSAgICAgIHx8IHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkJKyBoLT5wbHQub2Zmc2V0KTsKLSAJICBicmVhazsKLQotCS8qIHJlbG9jYXRlIGFnYWluc3QgX1NEQV9CQVNFXyAqLwotCWNhc2UgKGludClSX1BQQ19TREFSRUwxNjoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSAhPSAwCi0JCSYmIHN0cmNtcCAobmFtZSwgIi5zYnNzIikgIT0gMCkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiKSwKLQkJCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICAgc3ltX25hbWUsCi0JCQkJICAgICAgIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCi0JCQkJICAgICAgIG5hbWUpOwotCSAgICAgIH0KLQkgICAgYWRkZW5kIC09IChzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQotCS8qIHJlbG9jYXRlIGFnYWluc3QgX1NEQTJfQkFTRV8gKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX1NEQTJSRUw6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpICE9IDAgJiYgc3RyY21wIChuYW1lLCAiLnNic3MyIikgIT0gMCkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiKSwKLQkJCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICAgc3ltX25hbWUsCi0JCQkJICAgICAgIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCi0JCQkJICAgICAgIG5hbWUpOwotCQkKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCXJldCA9IGZhbHNlOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIGFkZGVuZCAtPSAoc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIH0KLQkgIGJyZWFrOwotCi0KLQkvKiByZWxvY2F0ZSBhZ2FpbnN0IGVpdGhlciBfU0RBX0JBU0VfLCBfU0RBMl9CQVNFXywgb3IgMCAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfU0RBMjE6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTREE6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGludCByZWc7Ci0KLQkgICAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JICAgICAgewotCQlyZWcgPSAxMzsKLQkJYWRkZW5kIC09IChzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEyIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICIuc2JzczIiKSA9PSAwKQotCSAgICAgIHsKLQkJcmVnID0gMjsKLQkJYWRkZW5kIC09IChzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICArIHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuUFBDLkVNQi5zZGF0YTAiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgIi5QUEMuRU1CLnNic3MwIikgPT0gMCkKLQkgICAgICB7Ci0JCXJlZyA9IDA7Ci0JICAgICAgfQotCi0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiKSwKLQkJCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICAgc3ltX25hbWUsCi0JCQkJICAgICAgIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCi0JCQkJICAgICAgIG5hbWUpOwotCi0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlyZXQgPSBmYWxzZTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGlmIChyX3R5cGUgPT0gUl9QUENfRU1CX1NEQTIxKQotCSAgICAgIHsJCQkvKiBmaWxsIGluIHJlZ2lzdGVyIGZpZWxkICovCi0JCWluc24gPSBiZmRfZ2V0XzMyIChvdXRwdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7Ci0JCWluc24gPSAoaW5zbiAmIH5SQV9SRUdJU1RFUl9NQVNLKSB8IChyZWcgPDwgUkFfUkVHSVNURVJfU0hJRlQpOwotCQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQkvKiBSZWxvY2F0ZSBhZ2FpbnN0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gKi8KLQljYXNlIChpbnQpUl9QUENfU0VDVE9GRjoKLQljYXNlIChpbnQpUl9QUENfU0VDVE9GRl9MTzoKLQljYXNlIChpbnQpUl9QUENfU0VDVE9GRl9ISToKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgIGFkZGVuZCAtPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQotCWNhc2UgKGludClSX1BQQ19TRUNUT0ZGX0hBOgotCSAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgYWRkZW5kIC09IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIGFkZGVuZCArPSAoKHJlbG9jYXRpb24gKyBhZGRlbmQpICYgMHg4MDAwKSA8PCAxOwotCSAgYnJlYWs7Ci0KLQkvKiBOZWdhdGl2ZSByZWxvY2F0aW9ucyAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIzMjoKLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMTY6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjE2X0xPOgotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNl9ISToKLQkgIGFkZGVuZCAtPSAyKnJlbG9jYXRpb247Ci0JICBicmVhazsKLQotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNl9IQToKLQkgIGFkZGVuZCAtPSAyKnJlbG9jYXRpb247Ci0JICBhZGRlbmQgKz0gKChyZWxvY2F0aW9uICsgYWRkZW5kKSAmIDB4ODAwMCkgPDwgMTsKLQkgIGJyZWFrOwotCi0JLyogTk9QIHJlbG9jYXRpb24gdGhhdCBwcmV2ZW50cyBnYXJiYWdlIGNvbGxlY3RpbmcgbGlua2VycyBmcm9tIG9taXR0aW5nIGEKLQkgICByZWZlcmVuY2UuICAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfTVJLUkVGOgotCSAgY29udGludWU7Ci0KLQljYXNlIChpbnQpUl9QUENfQ09QWToKLQljYXNlIChpbnQpUl9QUENfR0xPQl9EQVQ6Ci0JY2FzZSAoaW50KVJfUFBDX0pNUF9TTE9UOgotCWNhc2UgKGludClSX1BQQ19SRUxBVElWRToKLQljYXNlIChpbnQpUl9QUENfUExUMzI6Ci0JY2FzZSAoaW50KVJfUFBDX1BMVFJFTDMyOgotCWNhc2UgKGludClSX1BQQ19QTFQxNl9MTzoKLQljYXNlIChpbnQpUl9QUENfUExUMTZfSEk6Ci0JY2FzZSAoaW50KVJfUFBDX1BMVDE2X0hBOgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU0VDMTY6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTVF9MTzoKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNUX0hJOgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU1RfSEE6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9CSVRfRkxEOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogUmVsb2NhdGlvbiAlcyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3Igc3ltYm9sICVzLiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLT5uYW1lLAotCQkJCSBzeW1fbmFtZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAoaW50KVJfUFBDX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSAoaW50KVJfUFBDX0dOVV9WVEVOVFJZOgotCSAgLyogVGhlc2UgYXJlIG5vLW9wcyBpbiB0aGUgZW5kLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotCi0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlx0dHlwZSA9ICVzICglZCksIG5hbWUgPSAlcywgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkgICAgICAgaG93dG8tPm5hbWUsCi0JICAgICAgIChpbnQpcl90eXBlLAotCSAgICAgICBzeW1fbmFtZSwKLQkgICAgICAgcl9zeW1uZHgsCi0JICAgICAgIChsb25nKW9mZnNldCwKLQkgICAgICAgKGxvbmcpYWRkZW5kKTsKLSNlbmRpZgotCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkgICAgaW5wdXRfYmZkLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywKLQkJCQkgICAgb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLAotCQkJCSAgICBhZGRlbmQpOwotCi0gICAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2spCi0JOwotICAgICAgZWxzZSBpZiAociA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLQkJICAmJiBob3d0by0+cGNfcmVsYXRpdmUpCi0JCXsKLQkJICAvKiBBc3N1bWUgdGhpcyBpcyBhIGNhbGwgcHJvdGVjdGVkIGJ5IG90aGVyIGNvZGUgdGhhdAotCQkgICAgIGRldGVjdCB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIElmIHRoaXMgaXMgdGhlIGNhc2UsCi0JCSAgICAgd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIG92ZXJmbG93LiAgSWYgbm90LCB0aGUKLQkJICAgICBwcm9ncmFtIGlzIGhvc2VkIGFueXdheSwgYW5kIGEgbGl0dGxlIHdhcm5pbmcgaXNuJ3QKLQkJICAgICBnb2luZyB0byBoZWxwLiAgKi8KLQotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykoaW5mbywKLQkJCQkJCSAgIG5hbWUsCi0JCQkJCQkgICBob3d0by0+bmFtZSwKLQkJCQkJCSAgIChiZmRfdm1hKSAwLAotCQkJCQkJICAgaW5wdXRfYmZkLAotCQkJCQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSAgIG9mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0ID0gZmFsc2U7Ci0gICAgfQotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXQ7Ci19Ci0KLQwKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1wb3dlcnBjbGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfcG93ZXJwY192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItcG93ZXJwYyIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX3Bvd2VycGMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9QUEMKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCXBwY19lbGZfaW5mb190b19ob3d0bwotCi0jaWZkZWYgIEVNX0NZR05VU19QT1dFUlBDCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEJRU1fQ1lHTlVTX1BPV0VSUEMKLSNlbmRpZgotCi0jaWZkZWYgRU1fUFBDX09MRAotI2RlZmluZSBFTEZfTUFDSElORV9BTFQyCUVNX1BQQ19PTEQKLSNlbmRpZgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQJNAotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMTIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCVBMVF9JTklUSUFMX0VOVFJZX1NJWkUKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQlwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEJcHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbiAgICAgICAgICAgICBwcGNfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJcHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQlwcGNfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawkJX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxfbGluawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJcHBjX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawkJcHBjX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCQlwcGNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCXBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwlwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwkJcHBjX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCXBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJcHBjX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCXBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAlwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwlwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJCXBwY19lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwlwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAkJcHBjX2VsZl9tb2RpZnlfc2VnbWVudF9tYXAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXNoLmMgYi9iZmQvZWxmMzItc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MGUwNy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItc2guYworKysgL2Rldi9udWxsCkBAIC0xLDIyMzAgKzAsMCBAQAotLyogSGl0YWNoaSBTSCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5NiwgOTcsIDk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL3NoLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc2hfZWxmX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzaF9lbGZfaWdub3JlX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnNoX2VsZl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBzaF9lbGZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9lbGZfY29weV9wcml2YXRlX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9lbGZfbWVyZ2VfcHJpdmF0ZV9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotYm9vbGVhbiBzaF9lbGZfc2V0X21hY2hfZnJvbV9mbGFncwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9lbGZfYWxpZ25fbG9hZHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF9ieXRlICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX3N3YXBfaW5zbnMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBiZmRfYnl0ZSAqc2hfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzaF9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9TSF9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICBTZXR0aW5nIHBhcnRpYWxfaW5wbGFjZSB0byB0cnVlIGFuZAotICAgICBzcmNfbWFzayB0byBhIG5vbi16ZXJvIHZhbHVlIGlzIHNpbWlsYXIgdG8gdGhlIENPRkYgdG9vbGNoYWluLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1NIX1JFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9SRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggZGl2aWRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOFdQTiwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4V1BOIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IFBDIHJlbGF0aXZlIGJyYW5jaCBkaXZpZGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9TSF9JTkQxMlcsCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0lORDEyVyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IHVuc2lnbmVkIFBDIHJlbGF0aXZlIGRpdmlkZWQgYnkgNC4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUEwsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4V1BMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgdW5zaWduZWQgUEMgcmVsYXRpdmUgZGl2aWRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOFdQWiwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhXUFoiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBHQlIgcmVsYXRpdmUuICBGSVhNRTogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmIHdlIGhhdmUgc29tZQotICAgICBzcGVjaWFsIHN5bWJvbCBmb3IgdGhlIEdCUiByZWxhdGl2ZSBhcmVhLCBhbmQgdGhhdCBpcyBub3QKLSAgICAgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4QlAsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOEJQIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBHQlIgcmVsYXRpdmUgZGl2aWRlZCBieSAyLiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZgotICAgICB3ZSBoYXZlIHNvbWUgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQKLSAgICAgaXMgbm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOFcsCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFciLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IEdCUiByZWxhdGl2ZSBkaXZpZGVkIGJ5IDQuICBGSVhNRTogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmCi0gICAgIHdlIGhhdmUgc29tZSBzcGVjaWFsIHN5bWJvbCBmb3IgdGhlIEdCUiByZWxhdGl2ZSBhcmVhLCBhbmQgdGhhdAotICAgICBpcyBub3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4TCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4TCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDEwKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLSAgRU1QVFlfSE9XVE8gKDEyKSwKLSAgRU1QVFlfSE9XVE8gKDEzKSwKLSAgRU1QVFlfSE9XVE8gKDE0KSwKLSAgRU1QVFlfSE9XVE8gKDE1KSwKLSAgRU1QVFlfSE9XVE8gKDE2KSwKLSAgRU1QVFlfSE9XVE8gKDE3KSwKLSAgRU1QVFlfSE9XVE8gKDE4KSwKLSAgRU1QVFlfSE9XVE8gKDE5KSwKLSAgRU1QVFlfSE9XVE8gKDIwKSwKLSAgRU1QVFlfSE9XVE8gKDIxKSwKLSAgRU1QVFlfSE9XVE8gKDIyKSwKLSAgRU1QVFlfSE9XVE8gKDIzKSwKLSAgRU1QVFlfSE9XVE8gKDI0KSwKLQotICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgYSBHTlUgZXh0ZW5zaW9uIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhlCi0gICAgIGZpbmFsIHBhc3Mgb2YgdGhlIGxpbmtlciBuZXZlciBuZWVkcyB0byBkbyBhbnl0aGluZyB3aXRoIGFueSBvZgotICAgICB0aGVzZSByZWxvY3MuICBBbnkgcmVxdWlyZWQgb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUKLSAgICAgcmVsYXhhdGlvbiBjb2RlLiAgKi8KLQotICAvKiBBIDE2IGJpdCBzd2l0Y2ggdGFibGUgZW50cnkuICBUaGlzIGlzIGdlbmVyYXRlZCBmb3IgYW4gZXhwcmVzc2lvbgotICAgICBzdWNoIGFzIGBgLndvcmQgTDEgLSBMMicnLiAgVGhlIG9mZnNldCBob2xkcyB0aGUgZGlmZmVyZW5jZQotICAgICBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCBMMi4gICovCi0gIEhPV1RPIChSX1NIX1NXSVRDSDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9TV0lUQ0gxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBzd2l0Y2ggdGFibGUgZW50cnkuICBUaGlzIGlzIGdlbmVyYXRlZCBmb3IgYW4gZXhwcmVzc2lvbgotICAgICBzdWNoIGFzIGBgLmxvbmcgTDEgLSBMMicnLiAgVGhlIG9mZnNldCBob2xkcyB0aGUgZGlmZmVyZW5jZQotICAgICBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCBMMi4gICovCi0gIEhPV1RPIChSX1NIX1NXSVRDSDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9TV0lUQ0gzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbmRpY2F0ZXMgYSAudXNlcyBwc2V1ZG8tb3AuICBUaGUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSAudXNlcwotICAgICBwc2V1ZG8tb3BzIHdoZW4gaXQgZmluZHMgYSBmdW5jdGlvbiBjYWxsIHdoaWNoIGNhbiBiZSByZWxheGVkLgotICAgICBUaGUgb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gdGhlIGluc3RydWN0aW9uCi0gICAgIHdoaWNoIGxvYWRzIHRoZSByZWdpc3RlciB1c2VkIGluIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLSAgSE9XVE8gKFJfU0hfVVNFUywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9VU0VTIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgdGhpcyByZWxvYyBmb3IgYWRkcmVzc2VzIHJlZmVycmVkIHRvCi0gICAgIGJ5IHRoZSByZWdpc3RlciBsb2FkcyBhc3NvY2lhdGVkIHdpdGggVVNFUyByZWxvY3MuICBUaGUgb2Zmc2V0Ci0gICAgIGZpZWxkIGhvbGRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFkZHJlc3MgaXMgcmVmZXJlbmNlZCBpbiB0aGUKLSAgICAgb2JqZWN0IGZpbGUuICAqLwotICBIT1dUTyAoUl9TSF9DT1VOVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9DT1VOVCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5kaWNhdGVzIGFuIGFsaWdubWVudCBzdGF0ZW1lbnQuICBUaGUgb2Zmc2V0IGZpZWxkIGlzIHRoZSBwb3dlcgotICAgICBvZiAyIHRvIHdoaWNoIHN1YnNlcXVlbnQgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlIG11c3QgYmUKLSAgICAgYWxpZ25lZC4gICovCi0gIEhPV1RPIChSX1NIX0FMSUdOLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0FMSUdOIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSB0aGlzIHJlbG9jIGJlZm9yZSBhIGJsb2NrIG9mCi0gICAgIGluc3RydWN0aW9ucy4gIEEgc2VjdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkIGFzIGFzc3VtaW5pbmcgaXQKLSAgICAgY29udGFpbnMgZGF0YSwgdW5sZXNzIHRoaXMgcmVsb2MgaXMgc2Vlbi4gICovCi0gIEhPV1RPIChSX1NIX0NPREUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfQ09ERSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIHRoaXMgcmVsb2MgYWZ0ZXIgYSBibG9jayBvZgotICAgICBpbnN0cnVjdGlvbnMgd2hlbiBpdCBzZWVzIGRhdGEgdGhhdCBpcyBub3QgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgSE9XVE8gKFJfU0hfREFUQSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9EQVRBIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgYXNzZW1ibGVyIGdlbmVyYXRlcyB0aGlzIHJlbG9jIGZvciBlYWNoIGxhYmVsIHdpdGhpbiBhIGJsb2NrCi0gICAgIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvIGF2b2lkIHN3YXBwaW5nCi0gICAgIGluc3RydWN0aW9ucyB3aGljaCBhcmUgdGhlIHRhcmdldHMgb2YgYnJhbmNoZXMuICAqLwotICBIT1dUTyAoUl9TSF9MQUJFTCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9MQUJFTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gOCBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC53b3JkIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0g4LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX1NXSVRDSDgiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfU0hfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfU0hfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX1NIX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9TSF9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igbm9ybWFsIHJlbG9jcy4gIFRoaXMgaXMgbGlrZSB0aGUgQ09GRgotICAgZnVuY3Rpb24sIGFuZCBpcyBhbG1vc3QgY2VydGFpbmx5IGluY29ycmVjdCBmb3Igb3RoZXIgRUxGIHRhcmdldHMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zaF9lbGZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF92bWEgc3ltX3ZhbHVlOwotICBlbnVtIGVsZl9zaF9yZWxvY190eXBlIHJfdHlwZTsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGFkZHIgKyAoYmZkX2J5dGUgKikgZGF0YTsKLQotICByX3R5cGUgPSAoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nLS1kbyBub3RoaW5nLiAgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBBbG1vc3QgYWxsIHJlbG9jcyBoYXZlIHRvIGRvIHdpdGggcmVsYXhpbmcuICBJZiBhbnkgd29yayBtdXN0IGJlCi0gICAgIGRvbmUgZm9yIHRoZW0sIGl0IGhhcyBiZWVuIGRvbmUgaW4gc2hfcmVsYXhfc2VjdGlvbi4gICovCi0gIGlmIChyX3R5cGUgIT0gUl9TSF9ESVIzMgotICAgICAgJiYgKHJfdHlwZSAhPSBSX1NIX0lORDEyVwotCSAgfHwgKHN5bWJvbF9pbi0+ZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICBzeW1fdmFsdWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlIAotICAgIHN5bV92YWx1ZSA9IChzeW1ib2xfaW4tPnZhbHVlICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSBzeW1ib2xfaW4tPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfU0hfRElSMzI6Ci0gICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1NIX0lORDEyVzoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBzeW1fdmFsdWUgKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIHN5bV92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIGFkZHIKLQkJICAgICsgNCk7Ci0gICAgICBzeW1fdmFsdWUgKz0gKGluc24gJiAweGZmZikgPDwgMTsKLSAgICAgIGlmIChpbnNuICYgMHg4MDApCi0Jc3ltX3ZhbHVlIC09IDB4MTAwMDsKLSAgICAgIGluc24gPSAoaW5zbiAmIDB4ZjAwMCkgfCAoc3ltX3ZhbHVlICYgMHhmZmYpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgICAgaWYgKHN5bV92YWx1ZSA8IChiZmRfdm1hKSAtMHgxMDAwIHx8IHN5bV92YWx1ZSA+PSAweDEwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHJlbG9jcyB3aGljaCBhcmUgb25seSB1c2VkIGZvciByZWxheGluZywKLSAgIHdoaWNoIHRoZSBsaW5rZXIgc2hvdWxkIG90aGVyd2lzZSBpZ25vcmUuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zaF9lbGZfaWdub3JlX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgQkZEIHJlbG9jIGNvZGVzIHRvIFNIIEVMRiByZWxvY3MuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotLyogQW4gYXJyYXkgbWFwcGluZyBCRkQgcmVsb2MgY29kZXMgdG8gU0ggRUxGIHJlbG9jcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzaF9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU0hfTk9ORSB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9TSF9ESVIzMiB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NIX0RJUjMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NIX1JFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIsIFJfU0hfRElSOFdQTiB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiwgUl9TSF9JTkQxMlcgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLCBSX1NIX0RJUjhXUFogfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX0RJUjhXUEwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TSF9TV0lUQ0g4IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDE2IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLCBSX1NIX1NXSVRDSDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1VTRVMsIFJfU0hfVVNFUyB9LAotICB7IEJGRF9SRUxPQ19TSF9DT1VOVCwgUl9TSF9DT1VOVCB9LAotICB7IEJGRF9SRUxPQ19TSF9BTElHTiwgUl9TSF9BTElHTiB9LAotICB7IEJGRF9SRUxPQ19TSF9DT0RFLCBSX1NIX0NPREUgfSwKLSAgeyBCRkRfUkVMT0NfU0hfREFUQSwgUl9TSF9EQVRBIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0xBQkVMLCBSX1NIX0xBQkVMIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1NIX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NIX0dOVV9WVEVOVFJZIH0sCi19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyBjb2RlLCByZXR1cm4gdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlCi0gICBjb3JyZXNwb25kaW5nIFNIIEVMZiByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzaF9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2hfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnNoX2VsZl9ob3d0b190YWJsZVsoaW50KSBzaF9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHaXZlbiBhbiBFTEYgcmVsb2MsIGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkIG9mIGEgcmVsZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNoX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHI7Ci0KLSAgciA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKHIgPCAodW5zaWduZWQgaW50KSBSX1NIX21heCk7Ci0gIEJGRF9BU1NFUlQgKHIgPCBSX1NIX0ZJUlNUX0lOVkFMSURfUkVMT0MgfHwgciA+IFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DKTsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gJnNoX2VsZl9ob3d0b190YWJsZVtyXTsKLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgU0ggRUxGLiAgU2VlIHRoZSBjb3JyZXNwb25kaW5nCi0gICBmdW5jdGlvbiBpbiBjb2ZmLXNoLmMgZm9yIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIGRvZXMuICBGSVhNRToKLSAgIFRoZXJlIGlzIGEgbG90IG9mIGR1cGxpY2F0aW9uIGhlcmUgYmV0d2VlbiB0aGlzIGNvZGUgYW5kIHRoZSBDT0ZGCi0gICBzcGVjaWZpYyBjb2RlLiAgVGhlIGZvcm1hdCBvZiByZWxvY3MgYW5kIHN5bWJvbHMgaXMgd291bmQgZGVlcGx5Ci0gICBpbnRvIHRoaXMgY29kZSwgYnV0IGl0IHdvdWxkIHN0aWxsIGJlIGJldHRlciBpZiB0aGUgZHVwbGljYXRpb24KLSAgIGNvdWxkIGJlIGVsaW1pbmF0ZWQgc29tZWhvdy4gIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IGFsdGhvdWdoIGJvdGgKLSAgIGZ1bmN0aW9ucyB1c2Ugc3ltYm9scyBsaWtlIFJfU0hfQ09ERSwgdGhvc2Ugc3ltYm9scyBoYXZlIGRpZmZlcmVudAotICAgdmFsdWVzOyBpbiBjb2ZmLXNoLmMgdGhleSBjb21lIGZyb20gaW5jbHVkZS9jb2ZmL3NoLmgsIHdoZXJlYXMgaGVyZQotICAgdGhleSBjb21lIGZyb20gZW51bSBlbGZfc2hfcmVsb2NfdHlwZSBpbiBpbmNsdWRlL2VsZi9zaC5oLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1zaF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgYm9vbGVhbiBoYXZlX2NvZGU7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgaGF2ZV9jb2RlID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxhZGRyLCBwYWRkciwgc3ltdmFsOwotICAgICAgdW5zaWduZWQgc2hvcnQgaW5zbjsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsZm4sICppcmVsc2NhbiwgKmlyZWxjb3VudDsKLSAgICAgIGJmZF9zaWduZWRfdm1hIGZvZmY7Ci0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9DT0RFKQotCWhhdmVfY29kZSA9IHRydWU7Ci0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9VU0VTKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUaGUgcl9hZGRlbmQgZmllbGQgb2YgdGhlIFJfU0hfVVNFUyByZWxvYyB3aWxsIHBvaW50IHVzIHRvCi0gICAgICAgICB0aGUgcmVnaXN0ZXIgbG9hZC4gIFRoZSA0IGlzIGJlY2F1c2UgdGhlIHJfYWRkZW5kIGZpZWxkIGlzCi0gICAgICAgICBjb21wdXRlZCBhcyB0aG91Z2ggaXQgd2VyZSBhIGp1bXAgb2Zmc2V0LCB3aGljaCBhcmUgYmFzZWQKLSAgICAgICAgIGZyb20gNCBieXRlcyBhZnRlciB0aGUganVtcCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBsYWRkciA9IGlyZWwtPnJfb2Zmc2V0ICsgNCArIGlyZWwtPnJfYWRkZW5kOwotICAgICAgaWYgKGxhZGRyID49IHNlYy0+X3Jhd19zaXplKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIG9mZnNldCIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGxhZGRyKTsKLQotICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBtb3YubCBOTixyTiwgd2UgZG9uJ3Qga25vdyB3aGF0IHRvCi0gICAgICAgICBkby4gICovCi0gICAgICBpZiAoKGluc24gJiAweGYwMDApICE9IDB4ZDAwMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogUl9TSF9VU0VTIHBvaW50cyB0byB1bnJlY29nbml6ZWQgaW5zbiAweCV4IiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQsIGluc24pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzIGJlaW5nIGxvYWRlZC4gIFRoZQotICAgICAgCSBkaXNwbGFjZW1lbnQgaW4gdGhlIG1vdi5sIGluc3RydWN0aW9uIGlzIHF1YWRydXBsZWQuICBJdCBpcyBhCi0gICAgICAJIGRpc3BsYWNlbWVudCBmcm9tIGZvdXIgYnl0ZXMgYWZ0ZXIgdGhlIG1vdmwgaW5zdHJ1Y3Rpb24sIGJ1dCwKLSAgICAgIAkgYmVmb3JlIGFkZGluZyBpbiB0aGUgUEMgYWRkcmVzcywgdHdvIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKLSAgICAgIAkgb2YgdGhlIFBDIGFyZSBjbGVhcmVkLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlY3Rpb24gaXMgYWxpZ25lZAotICAgICAgCSBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0gICAgICBwYWRkciA9IGluc24gJiAweGZmOwotICAgICAgcGFkZHIgKj0gNDsKLSAgICAgIHBhZGRyICs9IChsYWRkciArIDQpICZ+IDM7Ci0gICAgICBpZiAocGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgbG9hZCBvZmZzZXQiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHJlbG9jIGZvciB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSByZWdpc3RlciBpcwotICAgICAgICAgYmVpbmcgbG9hZGVkLiAgVGhpcyByZWxvYyB3aWxsIHRlbGwgdXMgd2hpY2ggZnVuY3Rpb24gaXMKLSAgICAgICAgIGFjdHVhbGx5IGJlaW5nIGNhbGxlZC4gICovCi0gICAgICBmb3IgKGlyZWxmbiA9IGludGVybmFsX3JlbG9jczsgaXJlbGZuIDwgaXJlbGVuZDsgaXJlbGZuKyspCi0JaWYgKGlyZWxmbi0+cl9vZmZzZXQgPT0gcGFkZHIKLQkgICAgJiYgRUxGMzJfUl9UWVBFIChpcmVsZm4tPnJfaW5mbykgPT0gKGludCkgUl9TSF9ESVIzMikKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxmbiA+PSBpcmVsZW5kKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCByZWxvYyIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBpZiAoaXN5bS5zdF9zaG5keCAhPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYykpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IHN5bWJvbCBpbiB1bmV4cGVjdGVkIHNlY3Rpb24iKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChpc3ltLnN0X3ZhbHVlCi0JCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluZHg7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaW5keCA9IEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIHN5bXZhbCArPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHBhZGRyKTsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgZnVuY3Rpb24gY2FsbCBjYW4gYmUgc2hvcnRlbmVkLiAgKi8KLSAgICAgIGZvZmYgPSAoc3ltdmFsCi0JICAgICAgLSAoaXJlbC0+cl9vZmZzZXQKLQkJICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgKyA0KSk7Ci0gICAgICBpZiAoZm9mZiA8IC0weDEwMDAgfHwgZm9mZiA+PSAweDEwMDApCi0JewotCSAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgd2UgY2FuJ3Qgc2hvcnRlbiB0aGlzIGZ1bmN0aW9uIGNhbGwuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBTaG9ydGVuIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLQotICAgICAgLyogRm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nLCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzLCB0aGUgc2VjdGlvbiByZWxvY3MsIGFuZCB0aGUgQkZEIHN5bWJvbCB0YWJsZS4gIFdlCi0JIG11c3QgdGVsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBub3QgdG8gZnJlZSB1cCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaW5zdGVhZCBjcmVhdGUgYSB0YWJsZQotCSBvZiBjaGFuZ2VzIHdoaWNoIGhhdmUgdG8gYmUgbWFkZSwgYXMgaXMgZG9uZSBpbiBjb2ZmLW1pcHMuYzsKLQkgdGhhdCB3b3VsZCBiZSBtb3JlIHdvcmssIGJ1dCB3b3VsZCByZXF1aXJlIGxlc3MgbWVtb3J5IHdoZW4KLQkgdGhlIGxpbmtlciBpcyBydW4uICAqLwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgICAgIC8qIFJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLQotICAgICAgLyogQ2hhbmdlIHRoZSBSX1NIX1VTRVMgcmVsb2MgaW50byBhbiBSX1NIX0lORDEyVyByZWxvYywgYW5kCi0gICAgICAgICByZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4gICovCi0gICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbyksIFJfU0hfSU5EMTJXKTsKLSAgICAgIGlmIChFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICAvKiBJZiB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgYmVjYXVzZSBvZiBmdXR1cmUgcmVsYXhpbmcsCi0gICAgICAgICAgICAgaXQgd2lsbCBiZSBoYW5kbGVkIGhlcmUgbGlrZSBvdGhlciBpbnRlcm5hbCBJTkQxMlcKLSAgICAgICAgICAgICByZWxvY3MuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJICAgICAgMHhiMDAwIHwgKChmb2ZmID4+IDEpICYgMHhmZmYpLAotCQkgICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3QgZnVsbHkgcmVzb2x2ZSB0aGlzIHlldCwgYmVjYXVzZSB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wgdmFsdWUgbWF5IGJlIGNoYW5nZWQgYnkgZnV0dXJlIHJlbGF4aW5nLiAgV2UgbGV0Ci0gICAgICAgICAgICAgdGhlIGZpbmFsIGxpbmsgcGhhc2UgaGFuZGxlIGl0LiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIDB4YjAwMCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0JfQotCi0gICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBSX1NIX1VTRVMgcmVsb2MgcmVmZXJyaW5nIHRvIHRoZSBzYW1lCi0gICAgICAgICByZWdpc3RlciBsb2FkLiAgKi8KLSAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbGVuZDsgaXJlbHNjYW4rKykKLQlpZiAoRUxGMzJfUl9UWVBFIChpcmVsc2Nhbi0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX1VTRVMKLQkgICAgJiYgbGFkZHIgPT0gaXJlbHNjYW4tPnJfb2Zmc2V0ICsgNCArIGlyZWxzY2FuLT5yX2FkZGVuZCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxzY2FuIDwgaXJlbGVuZCkKLQl7Ci0JICAvKiBTb21lIG90aGVyIGZ1bmN0aW9uIGNhbGwgZGVwZW5kcyB1cG9uIHRoaXMgcmVnaXN0ZXIgbG9hZCwKLQkgICAgIGFuZCB3ZSBoYXZlIG5vdCB5ZXQgY29udmVydGVkIHRoYXQgZnVuY3Rpb24gY2FsbC4KLQkgICAgIEluZGVlZCwgd2UgbWF5IG5ldmVyIGJlIGFibGUgdG8gY29udmVydCBpdC4gIFRoZXJlIGlzCi0JICAgICBub3RoaW5nIGVsc2Ugd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciBhIFJfU0hfQ09VTlQgcmVsb2Mgb24gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZQotICAgICAgICAgZnVuY3Rpb24gYWRkcmVzcyBpcyBzdG9yZWQuICBEbyB0aGlzIGJlZm9yZSBkZWxldGluZyBhbnkKLSAgICAgICAgIGJ5dGVzLCB0byBhdm9pZCBjb25mdXNpb24gYWJvdXQgdGhlIGFkZHJlc3MuICAqLwotICAgICAgZm9yIChpcmVsY291bnQgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxjb3VudCA8IGlyZWxlbmQ7IGlyZWxjb3VudCsrKQotCWlmIChpcmVsY291bnQtPnJfb2Zmc2V0ID09IHBhZGRyCi0JICAgICYmIEVMRjMyX1JfVFlQRSAoaXJlbGNvdW50LT5yX2luZm8pID09IChpbnQpIFJfU0hfQ09VTlQpCi0JICBicmVhazsKLQotICAgICAgLyogRGVsZXRlIHRoZSByZWdpc3RlciBsb2FkLiAgKi8KLSAgICAgIGlmICghIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgbGFkZHIsIDIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIGp1c3QgaW4gY2FzZSBpdCBwZXJtaXRzIHNvbWUKLSAgICAgICAgIG90aGVyIGZ1bmN0aW9uIGNhbGwgdG8gY29tZSB3aXRoaW4gcmFuZ2UsIHdlIHNob3VsZCByZWxheAotICAgICAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0gICAgICAqYWdhaW4gPSB0cnVlOwotCi0gICAgICAvKiBOb3cgY2hlY2sgd2hldGhlciB3ZSBnb3QgYSBDT1VOVCByZWxvYy4gICovCi0gICAgICBpZiAoaXJlbGNvdW50ID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIENPVU5UIHJlbG9jIiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhlIG51bWJlciBvZiB1c2VzIGlzIHN0b3JlZCBpbiB0aGUgcl9hZGRlbmQgZmllbGQuICBXZSd2ZQotICAgICAgICAganVzdCBkZWxldGVkIG9uZS4gICovCi0gICAgICBpZiAoaXJlbGNvdW50LT5yX2FkZGVuZCA9PSAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiAweCVseDogd2FybmluZzogYmFkIGNvdW50IiksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAtLWlyZWxjb3VudC0+cl9hZGRlbmQ7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHVzZXMsIHdlIGNhbiBkZWxldGUgdGhlIGFkZHJlc3MuICBSZWxvYWQKLSAgICAgICAgIHRoZSBhZGRyZXNzIGZyb20gaXJlbGZuLCBpbiBjYXNlIGl0IHdhcyBjaGFuZ2VkIGJ5IHRoZQotICAgICAgICAgcHJldmlvdXMgY2FsbCB0byBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfYWRkZW5kID09IDApCi0JewotCSAgaWYgKCEgc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBpcmVsZm4tPnJfb2Zmc2V0LCA0KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBXZSd2ZSBkb25lIGFsbCB3ZSBjYW4gd2l0aCB0aGF0IGZ1bmN0aW9uIGNhbGwuICAqLwotICAgIH0KLQotICAvKiBMb29rIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCB3ZSBjYW4gYWxpZ24gb24gZm91cgotICAgICBieXRlIGJvdW5kYXJpZXMuICAqLwotICBpZiAoaGF2ZV9jb2RlKQotICAgIHsKLSAgICAgIGJvb2xlYW4gc3dhcHBlZDsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgc2hfZWxmX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsCi0JCQkJJnN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc3dhcHBlZCkKLQl7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JfQotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICBGSVhNRTogVGhlcmUgaXMgYQotICAgbG90IG9mIGR1cGxpY2F0aW9uIGJldHdlZW4gdGhpcyBmdW5jdGlvbiBhbmQgc2hfcmVsYXhfZGVsZXRlX2J5dGVzCi0gICBpbiBjb2ZmLXNoLmMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgaW50IHNobmR4LCBpbmRleDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0gIGFzZWN0aW9uICpvOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0KLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsKLSAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfQUxJR04KLQkgICYmIGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgJiYgY291bnQgPCAoMSA8PCBpcmVsLT5yX2FkZGVuZCkpCi0JewotCSAgaXJlbGFsaWduID0gaXJlbDsKLQkgIHRvYWRkciA9IGlyZWwtPnJfb2Zmc2V0OwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgaWYgKGlyZWxhbGlnbiA9PSBOVUxMKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSNkZWZpbmUgTk9QX09QQ09ERSAoMHgwMDA5KQotCi0gICAgICBCRkRfQVNTRVJUICgoY291bnQgJiAxKSA9PSAwKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSAyKQotCWJmZF9wdXRfMTYgKGFiZmQsIE5PUF9PUENPREUsIGNvbnRlbnRzICsgdG9hZGRyIC0gY291bnQgKyBpKTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgbnJhZGRyLCBzdG9wOwotICAgICAgYmZkX3ZtYSBzdGFydCA9IDA7Ci0gICAgICBpbnQgaW5zbiA9IDA7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBvZmYsIGFkanVzdCwgb2luc247Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSB2b2ZmID0gMDsKLSAgICAgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgbnJhZGRyID0gaXJlbC0+cl9vZmZzZXQ7Ci0gICAgICBpZiAoKGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgICYmIGlyZWwtPnJfb2Zmc2V0IDwgdG9hZGRyKQotCSAgfHwgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0FMSUdOCi0JICAgICAgJiYgaXJlbC0+cl9vZmZzZXQgPT0gdG9hZGRyKSkKLQlucmFkZHIgLT0gY291bnQ7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIHdhcyBmb3IgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZCwgaW4gd2hpY2gKLQkgY2FzZSB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCBpdC4gIERvbid0IGRlbGV0ZSByZWxvY3Mgd2hpY2gKLQkgcmVwcmVzZW50IGFkZHJlc3NlcywgdGhvdWdoLiAgKi8KLSAgICAgIGlmIChpcmVsLT5yX29mZnNldCA+PSBhZGRyCi0JICAmJiBpcmVsLT5yX29mZnNldCA8IGFkZHIgKyBjb3VudAotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfQUxJR04KLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0NPREUKLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0RBVEEKLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0xBQkVMKQotCWlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICAoaW50KSBSX1NIX05PTkUpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHNlZSBpZiB0aGUgcmFuZ2UgaXQgY292ZXJzCi0gICAgICAgICBpbmNsdWRlcyB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLiAgKi8KLSAgICAgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUE46Ci0JY2FzZSBSX1NIX0lORDEyVzoKLQljYXNlIFJfU0hfRElSOFdQWjoKLQljYXNlIFJfU0hfRElSOFdQTDoKLQkgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykpCi0JewotCWRlZmF1bHQ6Ci0JICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSMzI6Ci0JICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGlzCi0gICAgICAgICAgICAgc2VjdGlvbiwgYW5kIHRoZSBzeW1ib2wgd2lsbCBub3QgYmUgYWRqdXN0ZWQgYmVsb3csIHdlCi0gICAgICAgICAgICAgbXVzdCBjaGVjayB0aGUgYWRkZW5kIHRvIHNlZSBpdCB3aWxsIHB1dCB0aGUgdmFsdWUgaW4KLSAgICAgICAgICAgICByYW5nZSB0byBiZSBhZGp1c3RlZCwgYW5kIGhlbmNlIG11c3QgYmUgY2hhbmdlZC4gICovCi0JICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCQlleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSZzeW0pOwotCSAgICAgIGlmIChzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkJICAmJiAoc3ltLnN0X3ZhbHVlIDw9IGFkZHIKLQkJICAgICAgfHwgc3ltLnN0X3ZhbHVlID49IHRvYWRkcikpCi0JCXsKLQkJICBiZmRfdm1hIHZhbDsKLQotCQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkJICB2YWwgKz0gc3ltLnN0X3ZhbHVlOwotCQkgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LCBjb250ZW50cyArIG5yYWRkcik7Ci0JCX0KLQkgICAgfQotCSAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUE46Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIGlmIChvZmYgJiAweDgwKQotCSAgICBvZmYgLT0gMHgxMDA7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgNCArIG9mZiAqIDIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfSU5EMTJXOgotCSAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvZmYgPSBpbnNuICYgMHhmZmY7Ci0JICAgICAgaWYgKG9mZiAmIDB4ODAwKQotCQlvZmYgLT0gMHgxMDAwOwotCSAgICAgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUFo6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIHN0b3AgPSBzdGFydCArIDQgKyBvZmYgKiAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQTDoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IChzdGFydCAmfiAoYmZkX3ZtYSkgMykgKyA0ICsgb2ZmICogNDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1NXSVRDSDg6Ci0JY2FzZSBSX1NIX1NXSVRDSDE2OgotCWNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgIC8qIFRoZXNlIHJlbG9jcyB0eXBlcyByZXByZXNlbnQKLQkgICAgICAgLndvcmQgTDItTDEKLQkgICAgIFRoZSByX2FkZGVuZCBmaWVsZCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYwotCSAgICAgYWRkcmVzcyBhbmQgTDEuICBUaGF0IGlzIHRoZSBzdGFydCBvZiB0aGUgcmVsb2MsIGFuZAotCSAgICAgYWRkaW5nIGluIHRoZSBjb250ZW50cyBnaXZlcyB1cyB0aGUgdG9wLiAgV2UgbXVzdCBhZGp1c3QKLQkgICAgIGJvdGggdGhlIHJfb2Zmc2V0IGZpZWxkIGFuZCB0aGUgc2VjdGlvbiBjb250ZW50cy4KLQkgICAgIE4uQi4gaW4gZ2FzIC8gY29mZiBiZmQsIHRoZSBlbGYgYmZkIHJfYWRkZW5kIGlzIGNhbGxlZCByX29mZnNldCwKLQkgICAgIGFuZCB0aGUgZWxmIGJmZCByX29mZnNldCBpcyBjYWxsZWQgcl92YWRkci4gICovCi0KLQkgIHN0b3AgPSBpcmVsLT5yX29mZnNldDsKLQkgIHN0YXJ0ID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0b3AgLSAobG9uZykgaXJlbC0+cl9hZGRlbmQpOwotCi0JICBpZiAoc3RhcnQgPiBhZGRyCi0JICAgICAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICAgICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9hZGRlbmQgKz0gY291bnQ7Ci0JICBlbHNlIGlmIChzdG9wID4gYWRkcgotCQkgICAmJiBzdG9wIDwgdG9hZGRyCi0JCSAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfYWRkZW5kIC09IGNvdW50OwotCi0JICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfU1dJVENIMTYpCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZSBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfU1dJVENIOCkKLQkgICAgdm9mZiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZQotCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyB2b2ZmKTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfVVNFUzoKLQkgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0Ci0JCQkgICAgKyAobG9uZykgaXJlbC0+cl9hZGRlbmQKLQkJCSAgICArIDQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc3RhcnQgPiBhZGRyCi0JICAmJiBzdGFydCA8IHRvYWRkcgotCSAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JYWRqdXN0ID0gY291bnQ7Ci0gICAgICBlbHNlIGlmIChzdG9wID4gYWRkcgotCSAgICAgICAmJiBzdG9wIDwgdG9hZGRyCi0JICAgICAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JYWRqdXN0ID0gLSBjb3VudDsKLSAgICAgIGVsc2UKLQlhZGp1c3QgPSAwOwotCi0gICAgICBpZiAoYWRqdXN0ICE9IDApCi0JewotCSAgb2luc24gPSBpbnNuOwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BOOgotCSAgICBjYXNlIFJfU0hfRElSOFdQWjoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9JTkQxMlc6Ci0JICAgICAgaW5zbiArPSBhZGp1c3QgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfRElSOFdQTDoKLQkgICAgICBCRkRfQVNTRVJUIChhZGp1c3QgPT0gY291bnQgfHwgY291bnQgPj0gNCk7Ci0JICAgICAgaWYgKGNvdW50ID49IDQpCi0JCWluc24gKz0gYWRqdXN0IC8gNDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGlyZWwtPnJfb2Zmc2V0ICYgMykgPT0gMCkKLQkJICAgICsraW5zbjsKLQkJfQotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIMTY6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgaWYgKHZvZmYgPCAtIDB4ODAwMCB8fCB2b2ZmID49IDB4ODAwMCkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfc2lnbmVkXzE2IChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGJmZF9wdXRfc2lnbmVkXzMyIChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1VTRVM6Ci0JICAgICAgaXJlbC0+cl9hZGRlbmQgKz0gYWRqdXN0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvdmVyZmxvdykKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlyZWwtPnJfb2Zmc2V0ID0gbnJhZGRyOwotICAgIH0KLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBvdGhlciBzZWN0aW9ucy4gIElmIHRoZXJlIGNvbnRhaW4gYW55IElNTTMyCi0gICAgIHJlbG9jcyBhZ2FpbnN0IGludGVybmFsIHN5bWJvbHMgd2hpY2ggd2UgYXJlIG5vdCBnb2luZyB0byBhZGp1c3QKLSAgICAgYmVsb3csIHdlIG1heSBuZWVkIHRvIGFkanVzdCB0aGUgYWRkZW5kcy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbHNjYW4sICppcmVsc2NhbmVuZDsKLSAgICAgIGJmZF9ieXRlICpvY29udGVudHM7Ci0KLSAgICAgIGlmIChvID09IHNlYwotCSAgfHwgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICB8fCBvLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHJlbG9jcy4gIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzCi0gICAgICAgICBmYWxzZSwgd2Ugc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywgd2hlbiB3ZQotICAgICAgICAgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAoYWJmZCwgbywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgIHRydWUpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG9jb250ZW50cyA9IE5VTEw7Ci0gICAgICBpcmVsc2NhbmVuZCA9IGludGVybmFsX3JlbG9jcyArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsc2NhbmVuZDsgaXJlbHNjYW4rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLQotCSAgLyogRHdhcmYgbGluZSBudW1iZXJzIHVzZSBSX1NIX1NXSVRDSDMyIHJlbG9jcy4gICovCi0JICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsc2Nhbi0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX1NXSVRDSDMyKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSB2b2ZmOwotCi0JICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCQkgICAgb2NvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB3ZSBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotCQkgICAgICBvY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoby0+X3Jhd19zaXplKTsKLQkJICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8sIG9jb250ZW50cywKLQkJCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkJCSAgICAgIG8tPl9yYXdfc2l6ZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyA9IG9jb250ZW50czsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3RvcCA9IGlyZWxzY2FuLT5yX29mZnNldDsKLQkgICAgICBzdGFydAotCQk9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdG9wIC0gKGxvbmcpIGlyZWxzY2FuLT5yX2FkZGVuZCk7Ci0KLQkgICAgICAvKiBTVE9QIGlzIGluIGEgZGlmZmVyZW50IHNlY3Rpb24sIHNvIGl0IHdvbid0IGNoYW5nZS4gICovCi0JICAgICAgaWYgKHN0YXJ0ID4gYWRkciAmJiBzdGFydCA8IHRvYWRkcikKLQkJaXJlbHNjYW4tPnJfYWRkZW5kICs9IGNvdW50OwotCi0JICAgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLCBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICAgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyB2b2ZmKTsKLQotCSAgICAgIGlmIChzdGFydCA+IGFkZHIKLQkJICAmJiBzdGFydCA8IHRvYWRkcgotCQkgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCQliZmRfcHV0X3NpZ25lZF8zMiAoYWJmZCwgdm9mZiArIGNvdW50LAotCQkJCSAgIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgICAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkJICAgICAgICYmIHN0b3AgPCB0b2FkZHIKLQkJICAgICAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JCWJmZF9wdXRfc2lnbmVkXzMyIChhYmZkLCB2b2ZmIC0gY291bnQsCi0JCQkJICAgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgfQotCi0JICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsc2Nhbi0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0RJUjMyKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKEVMRjMyX1JfU1lNIChpcmVsc2Nhbi0+cl9pbmZvKSA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICBjb250aW51ZTsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWxzY2FuLT5yX2luZm8pLAotCQkJCSAgICAmc3ltKTsKLQotCSAgaWYgKHN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgICAgICYmIChzeW0uc3RfdmFsdWUgPD0gYWRkcgotCQkgIHx8IHN5bS5zdF92YWx1ZSA+PSB0b2FkZHIpKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCXsKLQkJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCSAgICBvY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHM7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdlIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0JCSAgICAgIG9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5fcmF3X3NpemUpOwotCQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbywgb2NvbnRlbnRzLAotCQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzID0gb2NvbnRlbnRzOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICAgIHZhbCArPSBzeW0uc3RfdmFsdWU7Ci0JICAgICAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQliZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwKLQkJCSAgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogU2VlIGlmIHdlIGNhbiBtb3ZlIHRoZSBBTElHTiByZWxvYyBmb3J3YXJkLiAgV2UgaGF2ZSBhZGp1c3RlZAotICAgICByX29mZnNldCBmb3IgaXQgYWxyZWFkeS4gICovCi0gIGlmIChpcmVsYWxpZ24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFsaWdudG8sIGFsaWduYWRkcjsKLQotICAgICAgYWxpZ250byA9IEJGRF9BTElHTiAodG9hZGRyLCAxIDw8IGlyZWxhbGlnbi0+cl9hZGRlbmQpOwotICAgICAgYWxpZ25hZGRyID0gQkZEX0FMSUdOIChpcmVsYWxpZ24tPnJfb2Zmc2V0LAotCQkJICAgICAxIDw8IGlyZWxhbGlnbi0+cl9hZGRlbmQpOwotICAgICAgaWYgKGFsaWdudG8gIT0gYWxpZ25hZGRyKQotCXsKLQkgIC8qIFRhaWwgcmVjdXJzaW9uLiAgKi8KLQkgIHJldHVybiBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFsaWduYWRkciwKLQkJCQkJICAgIGFsaWdudG8gLSBhbGlnbmFkZHIpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgZm9yIGxvYWRzIGFuZCBzdG9yZXMgd2hpY2ggd2UgY2FuIGFsaWduIHRvIGZvdXIgYnl0ZQotICAgYm91bmRhcmllcy4gIFRoaXMgaXMgbGlrZSBzaF9hbGlnbl9sb2FkcyBpbiBjb2ZmLXNoLmMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsIHBzd2FwcGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX3ZtYSAqbGFiZWxzID0gTlVMTDsKLSAgYmZkX3ZtYSAqbGFiZWwsICpsYWJlbF9lbmQ7Ci0KLSAgKnBzd2FwcGVkID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogR2V0IGFsbCB0aGUgYWRkcmVzc2VzIHdpdGggbGFiZWxzIG9uIHRoZW0uICAqLwotICBsYWJlbHMgPSAoYmZkX3ZtYSAqKSBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChiZmRfdm1hKSk7Ci0gIGlmIChsYWJlbHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbGFiZWxfZW5kID0gbGFiZWxzOwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0xBQkVMKQotCXsKLQkgICpsYWJlbF9lbmQgPSBpcmVsLT5yX29mZnNldDsKLQkgICsrbGFiZWxfZW5kOwotCX0KLSAgICB9Ci0KLSAgLyogTm90ZSB0aGF0IHRoZSBhc3NlbWJsZXIgY3VycmVudGx5IGFsd2F5cyBvdXRwdXRzIHJlbG9jcyBpbgotICAgICBhZGRyZXNzIG9yZGVyLiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gc29ydAotICAgICB0aGUgbGFiZWwgdmFsdWVzIGFuZCB0aGUgcmVsb2NzLiAgKi8KLQotICBsYWJlbCA9IGxhYmVsczsKLQotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0NPREUpCi0JY29udGludWU7Ci0KLSAgICAgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7Ci0KLSAgICAgIGZvciAoaXJlbCsrOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCWlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9EQVRBKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbCA8IGlyZWxlbmQpCi0Jc3RvcCA9IGlyZWwtPnJfb2Zmc2V0OwotICAgICAgZWxzZQotCXN0b3AgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICAgICAgaWYgKCEgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4gKGFiZmQsIHNlYywgY29udGVudHMsIHNoX2VsZl9zd2FwX2luc25zLAotCQkJCSAgICAgKFBUUikgaW50ZXJuYWxfcmVsb2NzLCAmbGFiZWwsCi0JCQkJICAgICBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZyZWUgKGxhYmVscyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChsYWJlbHMgIT0gTlVMTCkKLSAgICBmcmVlIChsYWJlbHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFN3YXAgdHdvIFNIIGluc3RydWN0aW9ucy4gIFRoaXMgaXMgbGlrZSBzaF9zd2FwX2luc25zIGluIGNvZmYtc2guYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfc3dhcF9pbnNucyAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiByZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIHJlbG9jczsKLSAgdW5zaWduZWQgc2hvcnQgaTEsIGkyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0KLSAgLyogU3dhcCB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuICAqLwotICBpMSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGkyID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkyLCBjb250ZW50cyArIGFkZHIpOwotICBiZmRfcHV0XzE2IChhYmZkLCBpMSwgY29udGVudHMgKyBhZGRyICsgMik7Ci0KLSAgLyogQWRqdXN0IGFsbCByZWxvYyBhZGRyZXNzZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGVudW0gZWxmX3NoX3JlbG9jX3R5cGUgdHlwZTsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIHR5cGVzIG9mIHJlbG9jcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgIGFkanVzdC4gIFRoZXNlIHJlbG9jcyBkbyBub3QgYXBwbHkgdG8gdGhlIGluc3RydWN0aW9uIGl0c2VsZiwKLSAgICAgICAgIGJ1dCBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MuICAqLwotICAgICAgdHlwZSA9IChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAodHlwZSA9PSBSX1NIX0FMSUdOCi0JICB8fCB0eXBlID09IFJfU0hfQ09ERQotCSAgfHwgdHlwZSA9PSBSX1NIX0RBVEEKLQkgIHx8IHR5cGUgPT0gUl9TSF9MQUJFTCkKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgYW4gUl9TSF9VU0VTIHJlbG9jIHBvaW50cyB0byBvbmUgb2YgdGhlIGFkZHJlc3NlcyBiZWluZwotICAgICAgICAgc3dhcHBlZCwgd2UgbXVzdCBhZGp1c3QgaXQuICBJdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gZG8gdGhpcwotICAgICAgICAgZm9yIGEganVtcCwgdGhvdWdoLCBzaW5jZSB3ZSB3YW50IHRvIGV4ZWN1dGUgYm90aAotICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBqdW1wLiAgKFdlIGhhdmUgYXZvaWRlZCBzd2FwcGluZwotICAgICAgICAgYXJvdW5kIGEgbGFiZWwsIHNvIHRoZSBqdW1wIHdpbGwgbm90IHdpbmQgdXAgZXhlY3V0aW5nIGFuCi0gICAgICAgICBpbnN0cnVjdGlvbiBpdCBzaG91bGRuJ3QpLiAgKi8KLSAgICAgIGlmICh0eXBlID09IFJfU0hfVVNFUykKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQotCSAgb2ZmID0gaXJlbC0+cl9vZmZzZXQgKyA0ICsgaXJlbC0+cl9hZGRlbmQ7Ci0JICBpZiAob2ZmID09IGFkZHIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0ICs9IDI7Ci0JICBlbHNlIGlmIChvZmYgPT0gYWRkciArIDIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0IC09IDI7Ci0JfQotCi0gICAgICBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gYWRkcikKLQl7Ci0JICBpcmVsLT5yX29mZnNldCArPSAyOwotCSAgYWRkID0gLTI7Ci0JfQotICAgICAgZWxzZSBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gYWRkciArIDIpCi0JewotCSAgaXJlbC0+cl9vZmZzZXQgLT0gMjsKLQkgIGFkZCA9IDI7Ci0JfQotICAgICAgZWxzZQotCWFkZCA9IDA7Ci0KLSAgICAgIGlmIChhZGQgIT0gMCkKLQl7Ci0JICBiZmRfYnl0ZSAqbG9jOwotCSAgdW5zaWduZWQgc2hvcnQgaW5zbiwgb2luc247Ci0JICBib29sZWFuIG92ZXJmbG93OwotCi0JICBsb2MgPSBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0OwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAodHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BOOgotCSAgICBjYXNlIFJfU0hfRElSOFdQWjoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0lORDEyVzoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0RJUjhXUEw6Ci0JICAgICAgLyogVGhpcyByZWxvYyBpZ25vcmVzIHRoZSBsZWFzdCBzaWduaWZpY2FudCAzIGJpdHMgb2YKLSAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gY291bnRlciBiZWZvcmUgYWRkaW5nIGluIHRoZSBvZmZzZXQuCi0gICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBpZiBBRERSIGlzIGF0IGFuIGV2ZW4gYWRkcmVzcywgdGhlCi0gICAgICAgICAgICAgICAgIHN3YXAgd2lsbCBub3QgYWZmZWN0IHRoZSBvZmZzZXQuICBJZiBBRERSIGlzIGFuIGF0IGFuCi0gICAgICAgICAgICAgICAgIG9kZCBhZGRyZXNzLCB0aGVuIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIGNyb3NzaW5nIGEKLSAgICAgICAgICAgICAgICAgZm91ciBieXRlIGJvdW5kYXJ5LCBhbmQgbXVzdCBiZSBhZGp1c3RlZC4gICovCi0JICAgICAgaWYgKChhZGRyICYgMykgIT0gMCkKLQkJewotCQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCQkgIG9pbnNuID0gaW5zbjsKLQkJICBpbnNuICs9IGFkZCAvIDI7Ci0JCSAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQkgICAgb3ZlcmZsb3cgPSB0cnVlOwotCQkgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvdmVyZmxvdykKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVsb2NhdGUgYW4gU0ggRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfdm1hIGFkZGVuZCA9IChiZmRfdm1hKTA7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0gICAgICAgICAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotICAgICAgICAgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICAvKiBNYW55IG9mIHRoZSByZWxvY3MgYXJlIG9ubHkgdXNlZCBmb3IgcmVsYXhpbmcsIGFuZCBhcmUKLSAgICAgICAgIGhhbmRsZWQgZW50aXJlbHkgYnkgdGhlIHJlbGF4YXRpb24gY29kZS4gICovCi0gICAgICBpZiAocl90eXBlID4gKGludCkgUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgPCAwCi0JICB8fCByX3R5cGUgPj0gKGludCkgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogRklYTUU6IFRoaXMgaXMgY2VydGFpbmx5IGluY29ycmVjdC4gIEhvd2V2ZXIsIGl0IGlzIGhvdyB0aGUKLSAgICAgICAgIENPRkYgbGlua2VyIHdvcmtzLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgIT0gKGludCkgUl9TSF9ESVIzMgotCSAgJiYgcl90eXBlICE9IChpbnQpIFJfU0hfSU5EMTJXKQotCWNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IHNoX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogVGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGZvciBhbiBpbnRlcm5hbCBJTkQxMlcKLSAgICAgICAgICAgICByZWxvY2F0aW9uLiAgRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIGhvdwotICAgICAgICAgICAgIHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotCSAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQkgICAgY29udGludWU7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LCB0cnVlKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRklYTUU6IFRoaXMgaXMgaG93IHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQlyZWxvY2F0aW9uIC09IDQ7Ci0KLSAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCi0JewotCWNhc2UgKGludClSX1NIX0RJUjMyOgotCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ09GRiByZWxvY3MgZG9uJ3QgdXNlIHRoZSBhZGRlbmQuIFRoZSBhZGRlbmQgaXMgdXNlZCBmb3IgUl9TSF9ESVIzMiAKLQkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIGNvbXBpbGVycy4gKi8KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCBhZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1zaF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCWRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJICAgICBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotCWZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0JZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLQlmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMCi0gICAgICAmJiBpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci1zdGF0aWMgYXNlY3Rpb24gKgotc2hfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9TSF9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX1NIX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBzaC4gKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotIAotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1NIX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1NIX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLXNoX2VsZl9zZXRfbWFjaF9mcm9tX2ZsYWdzIChhYmZkKQotICAgICBiZmQgKiAgICBhYmZkOwotewotICBmbGFnd29yZCBmbGFncyA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzOwotCi0gIHN3aXRjaCAoZmxhZ3MgJiBFRl9TSF9NQUNIX01BU0spCi0gICAgewotICAgIGNhc2UgRUZfU0gxOgotICAgICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc2gsIGJmZF9tYWNoX3NoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUZfU0gyOgotICAgICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc2gsIGJmZF9tYWNoX3NoMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVGX1NIX0RTUDoKLSAgICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NoLCBiZmRfbWFjaF9zaF9kc3ApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFRl9TSDM6Ci0gICAgICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zaCwgYmZkX21hY2hfc2gzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUZfU0gzX0RTUDoKLSAgICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NoLCBiZmRfbWFjaF9zaDNfZHNwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUZfU0gzRToKLSAgICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NoLCBiZmRfbWFjaF9zaDNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUZfU0hfVU5LTk9XTjoKLSAgICBjYXNlIEVGX1NINDoKLSAgICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NoLCBiZmRfbWFjaF9zaDQpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBrZWVwIFNIIHNwZWNpZmljIGZpbGUgZmxhZ3MuICovCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICogICAgYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCEgZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiBzaF9lbGZfc2V0X21hY2hfZnJvbV9mbGFncyAoYWJmZCk7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9jb3B5X3ByaXZhdGVfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBzaF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKG9iZmQsIGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKTsKLX0KLQotLyogVGhpcyByb3V0aW5lIGNoZWNrcyBmb3IgbGlua2luZyBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gb2JqZWN0cwotICAgdG9nZXRoZXIsIGFuZCBmb3IgbGlua2luZyBzaC1kc3Agd2l0aCBzaDNlIC8gc2g0IG9iamVjdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX21lcmdlX3ByaXZhdGVfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFncywgbmV3X2ZsYWdzOwotCi0gIGlmIChfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaCAoaWJmZCwgb2JmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gMDsKLSAgICB9Ci0gIG9sZF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgaWYgKChFRl9TSF9IQVNfRFNQIChvbGRfZmxhZ3MpICYmIEVGX1NIX0hBU19GUCAobmV3X2ZsYWdzKSkKLSAgICAgIHx8IChFRl9TSF9IQVNfRFNQIChuZXdfZmxhZ3MpICYmIEVGX1NIX0hBU19GUCAob2xkX2ZsYWdzKSkpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKCIlczogdXNlcyAlcyBpbnN0cnVjdGlvbnMgd2hpbGUgcHJldmlvdXMgbW9kdWxlcyB1c2UgJXMgaW5zdHJ1Y3Rpb25zIiwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JIEVGX1NIX0hBU19EU1AgKG5ld19mbGFncykgPyAiZHNwIiA6ICJmbG9hdGluZyBwb2ludCIsCi0JIEVGX1NIX0hBU19EU1AgKG5ld19mbGFncykgPyAiZmxvYXRpbmcgcG9pbnQiIDogImRzcCIpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IEVGX1NIX01FUkdFX01BQ0ggKG9sZF9mbGFncywgbmV3X2ZsYWdzKTsKLQotICByZXR1cm4gc2hfZWxmX3NldF9tYWNoX2Zyb21fZmxhZ3MgKG9iZmQpOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfc2hfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXNoIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfc2hsX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLXNobCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX3NoCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fU0gKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJc2hfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCXNoX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24Jc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCQlzaF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQlzaF9lbGZfc2V0X21hY2hfZnJvbV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2JmZF9mbGFncyBcCi0JCQkJCXNoX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCXNoX2VsZl9jb3B5X3ByaXZhdGVfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlzaF9lbGZfbWVyZ2VfcHJpdmF0ZV9kYXRhCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICBzaF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgc2hfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICBzaF9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1zcGFyYy5jIGIvYmZkL2VsZjMyLXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MWE4MmYuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTk1ICswLDAgQEAKLS8qIFNQQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL3NwYXJjLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICplbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBlbGYzMl9zcGFyY19pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0MCi0vKiBUaGUgcmVsb2NhdGlvbiAiaG93dG8iIHRhYmxlLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotcmVsb2NfaG93dG9fdHlwZSBfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgICAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsICAgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgICAwLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QTFQzMiwgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QTFQzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVBMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISVBMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MT1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19MT1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDMyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDMyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMCwgICAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEwIiwgICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTEsICAgICAgICAwLDIsMTEsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMSIsICAgICAgZmFsc2UsMCwweDAwMDAwN2ZmLHRydWUpLAotICAvKiBUaGVzZSBhcmUgZm9yIHNwYXJjNjQgaW4gYSA2NCBiaXQgZW52aXJvbm1lbnQuCi0gICAgIFZhbHVlcyBuZWVkIHRvIGJlIGhlcmUgYmVjYXVzZSB0aGUgdGFibGUgaXMgaW5kZXhlZCBieSByZWxvYyBudW1iZXIuICAqLwotICBIT1dUTyhSX1NQQVJDXzY0LCAgICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDXzY0IiwgICAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfT0xPMTAsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfT0xPMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISDIyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISDIyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hNMTAsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE0yMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfTE0yMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ISDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ19ISDIyIiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hNMTAsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX1BDX0hNMTAiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfTE0yMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENfTE0yMiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgLyogRW5kIHNwYXJjNjQgaW4gNjQgYml0IGVudmlyb25tZW50IHZhbHVlcy4KLSAgICAgVGhlIGZvbGxvd2luZyBhcmUgZm9yIHNwYXJjNjQgaW4gYSAzMiBiaXQgZW52aXJvbm1lbnQuICAqLwotICBIT1dUTyhSX1NQQVJDX1dESVNQMTYsICAgMiwyLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MsIlJfU1BBUkNfV0RJU1AxNiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE5LCAgIDIsMiwxOSx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMTkiLCBmYWxzZSwwLDB4MDAwN2ZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVU5VU0VEXzQyLCAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VTlVTRURfNDIiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ183LCAgICAgICAgIDAsMiwgNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzciLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwN2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNSwgICAgICAgICAwLDIsIDUsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ181IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDFmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzYsICAgICAgICAgMCwyLCA2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNiIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAzZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVWMzIsICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVWMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLX07Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl9TUEFSQ19HTlVfVlRJTkhFUklULCAwLDIsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1NQQVJDX0dOVV9WVElOSEVSSVQiLCBmYWxzZSwwLCAwLCBmYWxzZSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfU1BBUkNfR05VX1ZURU5UUlksIDAsMiwwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwiUl9TUEFSQ19HTlVfVlRFTlRSWSIsIGZhbHNlLDAsMCwgZmFsc2UpOwotCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qID8/PyBEb2Vzbid0IGR3YXJmIHVzZSB0aGlzPyAgKi8KLS8qeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KLSAge0JGRF9SRUxPQ19TUEFSQ18xMCwgUl9TUEFSQ18xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTEsIFJfU1BBUkNfMTF9LAotICB7QkZEX1JFTE9DX1NQQVJDXzY0LCBSX1NQQVJDXzY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19PTE8xMCwgUl9TUEFSQ19PTE8xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSEgyMiwgUl9TUEFSQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ITTEwLCBSX1NQQVJDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0xNMjIsIFJfU1BBUkNfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwgUl9TUEFSQ19QQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLCBSX1NQQVJDX1BDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsIFJfU1BBUkNfUENfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwgUl9TUEFSQ19XRElTUDE2fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE5LCBSX1NQQVJDX1dESVNQMTl9LAotICB7QkZEX1JFTE9DX1NQQVJDXzcsIFJfU1BBUkNfN30sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNSwgUl9TUEFSQ181fSwKLSAge0JGRF9SRUxPQ19TUEFSQ182LCBSX1NQQVJDXzZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1JFVjMyLCBSX1NQQVJDX1JFVjMyIH0sCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfU1BBUkNfR05VX1ZUSU5IRVJJVH0sCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NQQVJDX0dOVV9WVEVOVFJZfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICAKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmZWxmMzJfc3BhcmNfdnRpbmhlcml0X2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgcmV0dXJuICZlbGYzMl9zcGFyY192dGVudHJ5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNwYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNwYXJjX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JICAgIHJldHVybiAmX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGVbKGludCkgc3BhcmNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgICAgICB9Ci0gICAgfQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBXZSBuZWVkIHRvIHVzZSBFTEYzMl9SX1RZUEUgc28gd2UgaGF2ZSBvdXIgb3duIGNvcHkgb2YgdGhpcyBmdW5jdGlvbiwKLSAgIGFuZCBlbGY2NC1zcGFyYy5jIGhhcyBpdHMgb3duIGNvcHkuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmMzJfc3BhcmNfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHN3aXRjaCAoRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKSkKLSAgICB7Ci0gICAgY2FzZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX3NwYXJjX3Z0aW5oZXJpdF9ob3d0bzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1NQQVJDX0dOVV9WVEVOVFJZOgotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9zcGFyY192dGVudHJ5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkZEX0FTU0VSVCAoRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfU1BBUkNfbWF4X3N0ZCk7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJl9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlW0VMRjMyX1JfVFlQRShkc3QtPnJfaW5mbyldOwotICAgIH0KLX0KLQwKLS8qIEZvciB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jIChhYmZkLAotCQkJICAgICByZWxvY19lbnRyeSwKLQkJCSAgICAgc3ltYm9sLAotCQkJICAgICBkYXRhLAotCQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICBvdXRwdXRfYmZkLAotCQkJICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotLyogSGFuZGxlIHRoZSBXRElTUDE2IHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MgKGFiZmQsCi0JCQkgcmVsb2NfZW50cnksCi0JCQkgc3ltYm9sLAotCQkJIGRhdGEsCi0JCQkgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLAotCQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSB4OwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZWxvY2F0aW9uID0gKHN5bWJvbC0+dmFsdWUKLQkJKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIHJlbG9jYXRpb24gLT0JKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLSAgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICB4IHw9ICgoKChyZWxvY2F0aW9uID4+IDIpICYgMHhjMDAwKSA8PCA2KQotCXwgKChyZWxvY2F0aW9uID4+IDIpICYgMHgzZmZmKSk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAtIDB4NDAwMDAKLSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBTUEFSQyBFTEYgbGlua2VyLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xkLnNvLjEiCi0KLS8qIFRoZSBub3Agb3Bjb2RlIHdlIHVzZS4gICovCi0KLSNkZWZpbmUgU1BBUkNfTk9QIDB4MDEwMDAwMDAKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgotCi0vKiBUaGUgZmlyc3QgZm91ciBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgYXJlIHJlc2VydmVkLAotICAgYW5kIHRoZSBpbml0aWFsIGNvbnRlbnRzIGFyZSB1bmltcG9ydGFudCAod2UgemVybyB0aGVtIG91dCkuCi0gICBTdWJzZXF1ZW50IGVudHJpZXMgbG9vayBsaWtlIHRoaXMuICBTZWUgdGhlIFNWUjQgQUJJIFNQQVJDCi0gICBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLS8qIHNldGhpICVoaSguLS5wbHQwKSwlZzEuICBXZSBmaWxsIGluIHRoZSBhZGRyZXNzIGxhdGVyLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQwIDB4MDMwMDAwMDAKLS8qIGIsYSAucGx0MC4gIFdlIGZpbGwgaW4gdGhlIG9mZnNldCBsYXRlci4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMSAweDMwODAwMDAwCi0vKiBub3AuICAqLwotI2RlZmluZSBQTFRfRU5UUllfV09SRDIgU1BBUkNfTk9QCi0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcmVsZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAotICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0JCSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X29mZnNldHMgPSAoYmZkX3ZtYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCkgPSBsb2NhbF9nb3Rfb2Zmc2V0czsKLQkJICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrKQotCQkgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJewotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCX0KLQkgICAgfQotCi0JICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQotCSAgLyogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlIHRoYW4gMHgxMDAwIGJ5dGVzLCB3ZSBhZGQKLQkgICAgIDB4MTAwMCB0byB0aGUgdmFsdWUgb2YgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBzbyB0aGF0IDEzCi0JICAgICBiaXQgcmVsb2NhdGlvbnMgaGF2ZSBhIGdyZWF0ZXIgY2hhbmNlIG9mIHdvcmtpbmcuICAqLwotCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+PSAweDEwMDAKLQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPT0gMCkKLQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID0gMHgxMDAwOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aXRob3V0Ci0gICAgICAgICAgICAgbGlua2luZyBpbiBhbnkgZHluYW1pYyBvYmplY3RzLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0Ci0gICAgICAgICAgICAgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFmdGVyIGFsbC4gICovCi0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgU29sYXJpcyBuYXRpdmUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgYSBXUExUMzAKLSAgICAgICAgICAgICAgICAgcmVsb2MgZm9yIGEgbG9jYWwgc3ltYm9sIGlmIHlvdSBhc3NlbWJsZSBhIGNhbGwgZnJvbQotICAgICAgICAgICAgICAgICBvbmUgc2VjdGlvbiB0byBhbm90aGVyIHdoZW4gdXNpbmcgLUsgcGljLiAgV2UgdHJlYXQKLSAgICAgICAgICAgICAgICAgaXQgYXMgV0RJU1AzMC4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1BDMTA6Ci0JY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX05PTl9HT1RfUkVGOwotCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ19ESVNQODoKLQljYXNlIFJfU1BBUkNfRElTUDE2OgotCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX05PTl9HT1RfUkVGOwotCi0JICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkKLSAgICAgICAgICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzCi0gICAgICAgICAgICAgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlIGluY2x1ZGluZyBpbiB0aGUgbGluayAoaS5lLiwKLSAgICAgICAgICAgICBERUZfUkVHVUxBUiBpcyBzZXQpLiAgRklYTUU6IEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBub3QKLSAgICAgICAgICAgICBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQKLSAgICAgICAgICAgICBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQgd2lsbCBiZSBzZXQgbGF0ZXIgKGl0IGlzCi0gICAgICAgICAgICAgbmV2ZXIgY2xlYXJlZCkuICBUaGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgaW4KLSAgICAgICAgICAgICBlbGYzMi1pMzg2LmMuICAqLwotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8IChpbmZvLT5zeW1ib2xpYwotCQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfODoKLQljYXNlIFJfU1BBUkNfMTY6Ci0JY2FzZSBSX1NQQVJDXzMyOgotCWNhc2UgUl9TUEFSQ19ISTIyOgotCWNhc2UgUl9TUEFSQ18yMjoKLQljYXNlIFJfU1BBUkNfMTM6Ci0JY2FzZSBSX1NQQVJDX0xPMTA6Ci0JY2FzZSBSX1NQQVJDX1VBMzI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX05PTl9HT1RfUkVGOwotCi0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotICAgICAgICAgICAgICAgICByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGUgcmVsb2MuICAqLwotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCi0JICBicmVhazsKLQotICAgICAgICBjYXNlIFJfU1BBUkNfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJfU1BBUkNfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9zcGFyY19nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotCi0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0KLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1NQQVJDX0dPVDEwOgotICAgICAgY2FzZSBSX1NQQVJDX0dPVDEzOgotICAgICAgY2FzZSBSX1NQQVJDX0dPVDIyOgotCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgIHsKLQkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCi0JICAgICAgaC0+Z290LnJlZmNvdW50LS07Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPiAwKQotCSAgICAgIGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdLS07Ci0JICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFJfU1BBUkNfUExUMzI6Ci0gICAgICBjYXNlIFJfU1BBUkNfSElQTFQyMjoKLSAgICAgIGNhc2UgUl9TUEFSQ19MT1BMVDEwOgotICAgICAgY2FzZSBSX1NQQVJDX1BDUExUMzI6Ci0gICAgICBjYXNlIFJfU1BBUkNfUENQTFQxMDoKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5wbHQucmVmY291bnQgPiAwKQotCSAgICAgIGgtPnBsdC5yZWZjb3VudC0tOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlcgotICAgICAoYWx0aG91Z2ggd2UgY291bGQgYWN0dWFsbHkgZG8gaXQgaGVyZSkuICBUaGUgU1RUX05PVFlQRQotICAgICBjb25kaXRpb24gaXMgYSBoYWNrIHNwZWNpZmljYWxseSBmb3IgdGhlIE9yYWNsZSBsaWJyYXJpZXMKLSAgICAgZGVsaXZlcmVkIGZvciBTb2xhcmlzOyBmb3Igc29tZSBpbmV4cGxpY2FibGUgcmVhc29uLCB0aGV5IGRlZmluZQotICAgICBzb21lIG9mIHRoZWlyIGZ1bmN0aW9ucyBhcyBTVFRfTk9UWVBFIHdoZW4gdGhleSByZWFsbHkgc2hvdWxkIGJlCi0gICAgIFNUVF9GVU5DLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKLSAgICAgIHx8IChoLT50eXBlID09IFNUVF9OT1RZUEUKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQotICAgIHsKLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICB8fCAoKCFpbmZvLT5zaGFyZWQgfHwgaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBXUExUMzAgcmVsb2MgaW4gYW4gaW5wdXQKLQkgICAgIGZpbGUsIGJ1dCBub25lIG9mIHRoZSBpbnB1dCBmaWxlcyB3ZXJlIGR5bmFtaWMgb2JqZWN0cy4KLQkgICAgIE9yLCB3aGVuIGxpbmtpbmcgdGhlIG1haW4gYXBwbGljYXRpb24gb3IgYSAtQnN5bWJvbGljCi0JICAgICBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IFBJQyBjb2RlLiAgT3Igd2hlbiBhIGdsb2JhbCBzeW1ib2wKLQkgICAgIGhhcyBiZWVuIG1hZGUgcHJpdmF0ZSwgZS5nLiB2aWEgdmVyc2lvbmluZy4KLQotCSAgICAgSW4gdGhlc2UgY2FzZXMgd2Uga25vdyB3aGF0IHZhbHVlIHRoZSBzeW1ib2wgd2lsbCByZXNvbHZlCi0JICAgICB0bywgc28gd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZCBhIHByb2NlZHVyZSBsaW5rYWdlCi0JICAgICB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgV0RJU1AzMCByZWxvYyBpbnN0ZWFkLiAgKi8KLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogVGhlIGZpcnN0IGZvdXIgZW50cmllcyBpbiAucGx0IGFyZSByZXNlcnZlZC4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplID0gNCAqIFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaGFzIGEgbWF4aW11bSBzaXplLiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gMHg0MDAwMDApCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0gICAgICAgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0gICAgICAgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLSAgICAgICBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotICAgICAgIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgIGlmICghIGluZm8tPnNoYXJlZAotCSYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICAgIHsKLQloLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCWgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0gICAgICB9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sIHRoYXQgZG8gbm90IHVzZSB0aGUKLSAgICAgR09ULCB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgY29weSByZWxvYy4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX05PTl9HT1RfUkVGKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1NQQVJDX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIKLSAgICAgdG8gY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotICBib29sZWFuIHJlbHBsdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLQotICAgICAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIHRyYWlsaW5nIG5vcCBpbiAucGx0LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPiAwKQotCXMtPl9yYXdfc2l6ZSArPSA0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIHJlbHBsdCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKLQkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIGl0IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJcmVsdGV4dCA9IHRydWU7Ci0KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbGEucGx0IikgPT0gMCkKLQkJcmVscGx0ID0gdHJ1ZTsKLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgIT0gMAotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuZ290IikgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKGluZm8sIHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVscGx0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhIFNQQVJDIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBiZmRfdm1hIGdvdF9iYXNlOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNwbHQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QgPT0gTlVMTCkKLSAgICBnb3RfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBnb3RfYmFzZSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3BsdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDX0dOVV9WVElOSEVSSVQgCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfR05VX1ZURU5UUlkpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9TUEFSQ19tYXhfc3RkKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX1NQQVJDX1dQTFQzMAotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAoKHJfdHlwZSA9PSBSX1NQQVJDX0dPVDEwCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19HT1QxMwotCQkgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfR09UMjIpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAocl90eXBlID09IFJfU1BBUkNfOAotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18xNgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18zMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ESVNQOAotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ESVNQMTYKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfRElTUDMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMzAKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AyMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19XRElTUDE5Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMTYKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfSEkyMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18yMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ18xMwotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19MTzEwCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1VBMzIKLQkJCSAgfHwgKChyX3R5cGUgPT0gUl9TUEFSQ19QQzEwCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfUEMyMikKLQkJCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSAhPSAwKSkpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQotICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwKLQkJICAgICAgKCFpbmZvLT5zaGFyZWQgfHwgaW5mby0+bm9fdW5kZWZpbmVkKSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0gICAgICAgICAgICAgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0gICAgICAgICAgICAgICAgICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgbG9jYWxseSwgb3IgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsCi0gICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLiAgV2UgbXVzdCBpbml0aWFsaXplCi0gICAgICAgICAgICAgICAgICAgICB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZSB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAotCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzCi0JCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJICAgIG9mZiAmPSB+MTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgICAgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSBnb3RfYmFzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICYmIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLQkJIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotCQkgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBlbnRyeS4gICovCi0JICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQlvZmYgJj0gfjE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCi0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYwotCQkJIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotCQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgb2ZmKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkJICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICAgICAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQotCQkgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSB8PSAxOwotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1dQTFQzMDoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLSAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLQkgIC8qIFRoZSBTb2xhcmlzIG5hdGl2ZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIFdQTFQzMCByZWxvYwotCSAgICAgZm9yIGEgbG9jYWwgc3ltYm9sIGlmIHlvdSBhc3NlbWJsZSBhIGNhbGwgZnJvbSBvbmUKLQkgICAgIHNlY3Rpb24gdG8gYW5vdGhlciB3aGVuIHVzaW5nIC1LIHBpYy4gIFdlIHRyZWF0IGl0IGFzCi0JICAgICBXRElTUDMwLiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCi0JICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0gICAgICAgICAgICAgICAgIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLSAgICAgICAgICAgICAgICAgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19QQzEwOgotCWNhc2UgUl9TUEFSQ19QQzIyOgotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQljYXNlIFJfU1BBUkNfRElTUDMyOgotCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCWNhc2UgUl9TUEFSQ19XRElTUDE5OgotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgaWYgKGggPT0gTlVMTAotCSAgICAgIHx8IChpbmZvLT5zeW1ib2xpYwotCQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfODoKLQljYXNlIFJfU1BBUkNfMTY6Ci0JY2FzZSBSX1NQQVJDXzMyOgotCWNhc2UgUl9TUEFSQ19ISTIyOgotCWNhc2UgUl9TUEFSQ18yMjoKLQljYXNlIFJfU1BBUkNfMTM6Ci0JY2FzZSBSX1NQQVJDX0xPMTA6Ci0JY2FzZSBSX1NQQVJDX1VBMzI6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCSAgICAgIGJvb2xlYW4gc2tpcDsKLQotCSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zCi0gICAgICAgICAgICAgICAgIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0gICAgICAgICAgICAgICAgIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkgICAgICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGUgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLSAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KLQkgICAgICBlbHNlIGlmIChoICE9IE5VTEwKLQkJICAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgcl90eXBlKTsKLQkJICBvdXRyZWwucl9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDXzMyKQotCQkgICAgewotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJICAgICAgfHwgKGgtPnJvb3QudHlwZQotCQkJCQkgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQl9Ci0JCSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQlpbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7Ci0KLQkJCSAgLyogRklYTUU6IHdlIHJlYWxseSBzaG91bGQgYmUgYWJsZSB0byBsaW5rIG5vbi1waWMKLQkJCSAgICAgc2hhcmVkIGxpYnJhcmllcy4gICovCi0JCQkgIGlmIChpbmR4ID09IDApCi0JCQkgICAgewotCQkJICAgICAgQkZEX0ZBSUwgKCk7Ci0JCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCQkoXygiJXM6IHByb2JhYmx5IGNvbXBpbGVkIHdpdGhvdXQgLWZQSUM/IiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIHJfdHlwZSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCSAgICAgIC8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCi0gICAgICAgICAgICAgICAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCi0gICAgICAgICAgICAgICAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChza2lwCi0JCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgfHwgRUxGMzJfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1NQQVJDX1JFTEFUSVZFKQotCQljb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocl90eXBlID09IFJfU1BBUkNfV0RJU1AxNikKLQl7Ci0JICBiZmRfdm1hIHg7Ci0KLQkgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgcmVsb2NhdGlvbiAtPSByZWwtPnJfb2Zmc2V0OwotCi0JICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQkJfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAotCSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0JICAgIHIgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICBlbHNlCi0JICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfU1BBUkNfUkVWMzIpCi0JewotCSAgYmZkX3ZtYSB4OwotCi0JICByZWxvY2F0aW9uID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0KLQkgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICB4ID0geCArIHJlbG9jYXRpb247Ci0JICBiZmRfcHV0bDMyICgvKmlucHV0X2JmZCwqLyB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgciA9IGJmZF9yZWxvY19vazsKLQl9Ci0gICAgICBlbHNlCi0JciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLSAgICAgICAgIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIFBMVF9FTlRSWV9XT1JEMCArIGgtPnBsdC5vZmZzZXQsCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKFBMVF9FTlRSWV9XT1JEMQotCQkgICArICgoKC0gKGgtPnBsdC5vZmZzZXQgKyA0KSkgPj4gMikgJiAweDNmZmZmZikpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0VOVFJZX1dPUkQyLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDgpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19KTVBfU0xPVCk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDQpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLSAgICAgICAgIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0dMT0JfREFUKTsKLQl9Ci0KLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2xzIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfQ09QWSk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgcy0+Y29udGVudHMKLQkJCQkgICsgcy0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZHluOwotICBhc2VjdGlvbiAqc2dvdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBib29sZWFuIHNpemU7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6ICAgbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkgIG5hbWUgPSBOVUxMOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIENsZWFyIHRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLAotCSBhbmQgcHV0IGEgbm9wIGluIHRoZSBsYXN0IGZvdXIgYnl0ZXMuICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgbWVtc2V0IChzcGx0LT5jb250ZW50cywgMCwgNCAqIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX05PUCwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBzcGx0LT5fcmF3X3NpemUgLSA0KTsKLQl9Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JUExUX0VOVFJZX1NJWkU7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdG8gdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIGVfZmxhZ3MgZmllbGQuCi0KLSAgIFdlIGRvbid0IGRlZmluZSBzZXRfcHJpdmF0ZV9mbGFncyBvciBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgYmVjYXVzZQotICAgdGhlIG9ubHkgY3VycmVudGx5IGRlZmluZWQgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgYmZkIG1hY2ggbnVtYmVyLAotICAgc28gd2UgdXNlIHRoZSBsYXR0ZXIgaW5zdGVhZCBhbmQgZGVmZXIgc2V0dGluZyBlX2ZsYWdzIHVudGlsIHRoZQotICAgZmlsZSBpcyB3cml0dGVuIG91dC4gICovCi0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgYm9vbGVhbiBlcnJvcjsKLSAgLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBzdGF0aWMuICAqLwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2aW91c19pYmZkX2VfZmxhZ3MgPSAodW5zaWduZWQgbG9uZykgLTE7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVycm9yID0gZmFsc2U7Ci0KLSNpZiAwCi0gIC8qID8/PyBUaGUgbmF0aXZlIGxpbmtlciBkb2Vzbid0IGRvIHRoaXMgc28gd2UgY2FuJ3QgKG90aGVyd2lzZSBnY2Mgd291bGQKLSAgICAgaGF2ZSB0byBrbm93IHdoaWNoIGxpbmtlciBpcyBiZWluZyB1c2VkKS4gIEluc3RlYWQsIHRoZSBuYXRpdmUgbGlua2VyCi0gICAgIGJ1bXBzIHVwIHRoZSBhcmNoaXRlY3R1cmUgbGV2ZWwgd2hlbiBpdCBoYXMgdG8uICBIb3dldmVyLCBJIHN0aWxsIHRoaW5rCi0gICAgIHdhcm5pbmdzIGxpa2UgdGhlc2UgYXJlIGdvb2QsIHNvIGl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSB0aGVtIHR1cm5lZCBvbgotICAgICBieSBzb21lIG9wdGlvbi4gICovCi0KLSAgLyogSWYgdGhlIG91dHB1dCBtYWNoaW5lIGlzIG5vcm1hbCBzcGFyYywgd2UgY2FuJ3QgYWxsb3cgdjkgaW5wdXQgZmlsZXMuICAqLwotICBpZiAoYmZkX2dldF9tYWNoIChvYmZkKSA9PSBiZmRfbWFjaF9zcGFyYwotICAgICAgJiYgKGJmZF9nZXRfbWFjaCAoaWJmZCkgPT0gYmZkX21hY2hfc3BhcmNfdjhwbHVzCi0JICB8fCBiZmRfZ2V0X21hY2ggKGliZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EpKQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICB9Ci0gIC8qIElmIHRoZSBvdXRwdXQgbWFjaGluZSBpcyB2OSwgd2UgY2FuJ3QgYWxsb3cgdjkrdmlzIGlucHV0IGZpbGVzLiAgKi8KLSAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPT0gYmZkX21hY2hfc3BhcmNfdjhwbHVzCi0gICAgICAmJiBiZmRfZ2V0X21hY2ggKGliZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EpCi0gICAgewotICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSB2OHBsdXNhIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4cGx1cyIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotI2Vsc2UKLSAgaWYgKGJmZF9nZXRfbWFjaCAoaWJmZCkgPj0gYmZkX21hY2hfc3BhcmNfdjkpCi0gICAgewotICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSA2NCBiaXQgc3lzdGVtIGFuZCB0YXJnZXQgaXMgMzIgYml0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChpYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPCBiZmRfZ2V0X21hY2ggKGliZmQpKQotCWJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfYXJjaF9zcGFyYywgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKCgoZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCi0gICAgICAgIT0gcHJldmlvdXNfaWJmZF9lX2ZsYWdzKQotICAgICAgJiYgcHJldmlvdXNfaWJmZF9lX2ZsYWdzICE9ICh1bnNpZ25lZCBsb25nKSAtMSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGxpbmtpbmcgbGl0dGxlIGVuZGlhbiBmaWxlcyB3aXRoIGJpZyBlbmRpYW4gZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgZXJyb3IgPSB0cnVlOwotICAgIH0KLSAgcHJldmlvdXNfaWJmZF9lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEE7Ci0KLSAgaWYgKGVycm9yKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPT0gRU1fU1BBUkMzMlBMVVMpCi0gICAgewotICAgICAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfU1VOX1VTMSkKLQlyZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc3BhcmMsCi0JCQkJCSAgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSk7Ci0gICAgICBlbHNlIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDXzMyUExVUykKLQlyZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc3BhcmMsCi0JCQkJCSAgYmZkX21hY2hfc3BhcmNfdjhwbHVzKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX0xFREFUQSkKLSAgICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc3BhcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjKTsKLX0KLQotLyogVGhlIGZpbmFsIHByb2Nlc3NpbmcgZG9uZSBqdXN0IGJlZm9yZSB3cml0aW5nIG91dCB0aGUgb2JqZWN0IGZpbGUuCi0gICBXZSBuZWVkIHRvIHNldCB0aGUgZV9tYWNoaW5lIGZpZWxkIGFwcHJvcHJpYXRlbHkuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyYyA6Ci0gICAgICBicmVhazsgLyogbm90aGluZyB0byBkbyAqLwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzIDoKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPSBFTV9TUEFSQzMyUExVUzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9TUEFSQ18zMlBMVVNfTUFTSzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDXzMyUExVUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSA6Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID0gRU1fU1BBUkMzMlBMVVM7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfU1BBUkNfMzJQTFVTX01BU0s7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9TUEFSQ18zMlBMVVMgfCBFRl9TUEFSQ19TVU5fVVMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUgOgotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9IEVNX1NQQVJDOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfTEVEQVRBOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JYmZkX2VsZjMyX3NwYXJjX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJImVsZjMyLXNwYXJjIgotI2RlZmluZSBFTEZfQVJDSAliZmRfYXJjaF9zcGFyYwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNX1NQQVJDCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgRU1fU1BBUkMzMlBMVVMKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIDB4MTAwMDAKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGYzMl9zcGFyY19pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCWVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotCQkJCQllbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotCQkJCQllbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQllbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQllbGYzMl9zcGFyY19vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLQkJCQkJZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgIGVsZjMyX3NwYXJjX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgIGVsZjMyX3NwYXJjX2djX3N3ZWVwX2hvb2sKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgNAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgKDQqUExUX0VOVFJZX1NJWkUpCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi12ODUwLmMgYi9iZmQvZWxmMzItdjg1MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmUyOGZjLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi12ODUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjM2ICswLDAgQEAKLS8qIFY4NTAtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotCi0vKiBYWFggRklYTUU6IFRoaXMgY29kZSBpcyBsaXR0ZXJlZCB3aXRoIDMyYml0IGludCwgMTZiaXQgc2hvcnQsIDhiaXQgY2hhcgotICAgZGVwZW5kZW5jaWVzLiAgQXMgaXMgdGhlIGdhcyAmIHNpbXVsYXRvciBjb2RlIG9yIHRoZSB2ODUwLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvdjg1MC5oIgotCi0vKiBzaWduLWV4dGVuZCBhIDI0LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDI0KHgpCSgoKCh4KSAmIDB4ZmZmZmZmKSBeICh+IDB4N2ZmZmZmKSkgKyAweDgwMDAwMCkKLSAgICAgIAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgdm9pZCB2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHY4NTBfZWxmX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIGludCwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCByZW1lbWJlcl9oaTE2c19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJmZF9ieXRlICogZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jCi0gIFBBUkFNUyAoKGJmZF92bWEsIGJvb2xlYW4gKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAotCSAgIGJmZF92bWEsIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgY2hhciAqKSk7Ci0KLS8qIE5vdGU6IEl0IGlzIFJFUVVJUkVEIHRoYXQgdGhlICd0eXBlJyB2YWx1ZSBvZiBlYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkKLSAgIG1hdGNoIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgaW4gdGhlIGFycmF5LiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHY4NTBfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX1Y4NTBfTk9ORSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9OT05FIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgOSBiaXQgYnJhbmNoLiAqLwotICBIT1dUTyAoUl9WODUwXzlfUENSRUwsCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfOV9QQ1JFTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMGZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIFBDIHJlbGF0aXZlIDIyIGJpdCBicmFuY2guICovCi0gIEhPV1RPIChSX1Y4NTBfMjJfUENSRUwsCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIyLAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDcsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzIyX1BDUkVMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmZmZjgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZmZmODAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9WODUwX0hJMTZfUywJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfSEkxNl9TIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9ISTE2LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9ISTE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9MTzE2LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9MTzE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2ltcGxlIDMyYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF8zMiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfMzIiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNpbXBsZSAxNmJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX1Y4NTBfMTYsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF8xNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNpbXBsZSA4Yml0IHJlbG9jLgkgKi8KLSAgSE9XVE8gKFJfVjg1MF84LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF84IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE1IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDEsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZSwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTUgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAxLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmUsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzZfOF9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDEsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfNl84X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdlLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDdlLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV83XzhfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzdfOF9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogNyBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV83XzdfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA3LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzdfN19PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlciEgICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNSBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV80XzVfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzRfNV9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDQgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfNF80X09GRlNFVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV80XzRfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MGYsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4MGYsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZTAwMjAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZTAwMjAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDcsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2YsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfVjg1MF9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9WODUwX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9WODUwX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9WODUwX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAKLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gVjg1MCBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3Qgdjg1MF9lbGZfcmVsb2NfbWFwCi17Ci0gIC8qIEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVCBpcyAyNTgsIHdoaWNoIHdpbGwgbm90IGZpeCBpbiBhbgotICAgICB1bnNpZ25lZCBjaGFyLiAgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdjg1MF9lbGZfcmVsb2NfbWFwIHY4NTBfZWxmX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwJCVJfVjg1MF9OT05FIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTCwJUl9WODUwXzlfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTCwJUl9WODUwXzIyX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0hJMTZfUywJCVJfVjg1MF9ISTE2X1MgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNiwJCVJfVjg1MF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX0xPMTYsCQlSX1Y4NTBfTE8xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwJCVJfVjg1MF8zMiB9LAotICB7IEJGRF9SRUxPQ18xNiwJCVJfVjg1MF8xNiB9LAotICB7IEJGRF9SRUxPQ184LAkJUl9WODUwXzggfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VULCBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQsIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VULCBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VULCAgIFJfVjg1MF9UREFfNl84X09GRlNFVCAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQsICAgUl9WODUwX1REQV83XzhfT0ZGU0VUICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVCwgICBSX1Y4NTBfVERBXzdfN19PRkZTRVQgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQsIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQsICAgICAgICAgUl9WODUwX1REQV80XzVfT0ZGU0VUICAgICAgICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVCwgICAgICAgICBSX1Y4NTBfVERBXzRfNF9PRkZTRVQgICAgICAgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCwgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VULCAgICAgICBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCAgICAgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVCwgICAgIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCAgICAgICAgICAgICAgIFJfVjg1MF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgICAgICAgICAgICAgICAgIFJfVjg1MF9HTlVfVlRFTlRSWSB9LAotCi19OwotCi0MCi0vKiBNYXAgYSBiZmQgcmVsb2NhdGlvbiBpbnRvIHRoZSBhcHByb3ByaWF0ZSBob3d0byBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKHY4NTBfZWxmX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAodjg1MF9lbGZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQl7Ci0JICBCRkRfQVNTRVJUICh2ODUwX2VsZl9ob3d0b190YWJsZVt2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF0udHlwZSA9PSB2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbCk7Ci0JICAKLQkgIHJldHVybiAmIHY4NTBfZWxmX2hvd3RvX3RhYmxlW3Y4NTBfZWxmX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0MCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIFY4NTAgRUxGIHJlbG9jLiAgKi8KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKiAgICAgICAgICAgICBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqICBkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfVjg1MF9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJnY4NTBfZWxmX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBWODUwIEVMRiByZWxvYyAodHlwZSBSRUxBKS4gKi8KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogICAgICAgICAgICAgY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICAgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9WODUwX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmdjg1MF9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotDAotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICBpbmZvOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogIHJlbG9jczsKLXsKLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGVudW0gdjg1MF9yZWxvY190eXBlIHJfdHlwZTsKLSAgaW50IG90aGVyID0gMDsKLSAgY29uc3QgY2hhciAqY29tbW9uID0gKGNvbnN0IGNoYXIgKikwOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJ2ODUwX2VsZl9jaGVja19yZWxvY3MgY2FsbGVkIGZvciBzZWN0aW9uICVzIGluICVzXG4iLAotCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSNlbmRpZgotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgcl90eXBlID0gKGVudW0gdjg1MF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgUl9WODUwX05PTkU6Ci0JY2FzZSBSX1Y4NTBfOV9QQ1JFTDoKLQljYXNlIFJfVjg1MF8yMl9QQ1JFTDoKLQljYXNlIFJfVjg1MF9ISTE2X1M6Ci0JY2FzZSBSX1Y4NTBfSEkxNjoKLQljYXNlIFJfVjg1MF9MTzE2OgotCWNhc2UgUl9WODUwXzMyOgotCWNhc2UgUl9WODUwXzE2OgotCWNhc2UgUl9WODUwXzg6Ci0JY2FzZSBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDoKLQljYXNlIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQ6Ci0JICBicmVhazsKLQotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1Y4NTBfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotCWNhc2UgUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDoKLQljYXNlIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOgotCSAgb3RoZXIgPSBWODUwX09USEVSX1NEQTsKLQkgIGNvbW1vbiA9ICIuc2NvbW1vbiI7Ci0JICBnb3RvIHNtYWxsX2RhdGFfY29tbW9uOwotCSAgCi0JY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDoKLQljYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQ6Ci0JICBvdGhlciA9IFY4NTBfT1RIRVJfWkRBOwotCSAgY29tbW9uID0gIi56Y29tbW9uIjsKLQkgIGdvdG8gc21hbGxfZGF0YV9jb21tb247Ci0JICAKLQljYXNlIFJfVjg1MF9UREFfNF81X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfNF80X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfNl84X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfN184X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfN183X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOgotCSAgb3RoZXIgPSBWODUwX09USEVSX1REQTsKLQkgIGNvbW1vbiA9ICIudGNvbW1vbiI7Ci0JICAvKiBmYWxsIHRocm91Z2ggKi8KLQotI2RlZmluZSBWODUwX09USEVSX01BU0sgKFY4NTBfT1RIRVJfVERBIHwgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1pEQSkKLQotCXNtYWxsX2RhdGFfY29tbW9uOgotCSAgaWYgKGgpCi0JICAgIHsKLQkgICAgICBoLT5vdGhlciB8PSBvdGhlcjsJLyogZmxhZyB3aGljaCB0eXBlIG9mIHJlbG9jYXRpb24gd2FzIHVzZWQgKi8KLQkgICAgICBpZiAoKGgtPm90aGVyICYgVjg1MF9PVEhFUl9NQVNLKSAhPSAob3RoZXIgJiBWODUwX09USEVSX01BU0spCi0JCSAgJiYgKGgtPm90aGVyICYgVjg1MF9PVEhFUl9FUlJPUikgPT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKiBtc2c7Ci0JCSAgc3RhdGljIGNoYXIgIGJ1ZmZbMjAwXTsgLyogWFhYICovCi0KLQkJICBzd2l0Y2ggKGgtPm90aGVyICYgVjg1MF9PVEhFUl9NQVNLKQotCQkgICAgewotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3Qgb2NjdXB5IGluIG11bHRpcGxlIHNtYWxsIGRhdGEgcmVnaW9ucyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1pEQSB8IFY4NTBfT1RIRVJfVERBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbiBvbmx5IGJlIGluIG9uZSBvZiB0aGUgc21hbGwsIHplcm8sIGFuZCB0aW55IGRhdGEgcmVnaW9ucyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1pEQToKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgemVybyBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFY4NTBfT1RIRVJfU0RBIHwgVjg1MF9PVEhFUl9UREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IGJlIGluIGJvdGggc21hbGwgYW5kIHRpbnkgZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1pEQSB8IFY4NTBfT1RIRVJfVERBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHplcm8gYW5kIHRpbnkgZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgc3ByaW50ZiAoYnVmZiwgbXNnLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkJICBpbmZvLT5jYWxsYmFja3MtPndhcm5pbmcgKGluZm8sIGJ1ZmYsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCSAgICBhYmZkLCBoLT5yb290LnUuZGVmLnNlY3Rpb24sIDApOwotCi0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgaC0+b3RoZXIgfD0gVjg1MF9PVEhFUl9FUlJPUjsKLQkJICByZXQgPSBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmIGgtPnJvb3QudS5jLnAKLQkgICAgICAmJiAhc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgaC0+cm9vdC51LmMucC0+c2VjdGlvbiksICJDT01NT04iKSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgY29tbW9uKTsKLQkgICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAidjg1MF9lbGZfY2hlY2tfcmVsb2NzLCBmb3VuZCAlcyByZWxvY2F0aW9uIGZvciAlcyVzXG4iLAotCQkgICB2ODUwX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS5uYW1lLAotCQkgICAoaCAmJiBoLT5yb290LnJvb3Quc3RyaW5nKSA/IGgtPnJvb3Qucm9vdC5zdHJpbmcgOiAiPHVua25vd24+IiwKLQkJICAgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikgPyAiLCBzeW1ib2wgaXMgY29tbW9uIiA6ICIiKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotICogSW4gdGhlIG9sZCB2ZXJzaW9uLCB3aGVuIGFuIGVudHJ5IHdhcyBjaGVja2VkIG91dCBmcm9tIHRoZSB0YWJsZSwKLSAqIGl0IHdhcyBkZWxldGVkLiAgVGhpcyBwcm9kdWNlZCBhbiBlcnJvciBpZiB0aGUgZW50cnkgd2FzIG5lZWRlZAotICogbW9yZSB0aGFuIG9uY2UsIGFzIHRoZSBzZWNvbmQgYXR0ZW1wdGVkIHJldHJ5IGZhaWxlZC4KLSAqCi0gKiBJbiB0aGUgY3VycmVudCB2ZXJzaW9uLCB0aGUgZW50cnkgaXMgbm90IGRlbGV0ZWQsIGluc3RlYWQgd2Ugc2V0Ci0gKiB0aGUgZmllbGQgJ2ZvdW5kJyB0byB0cnVlLiAgSWYgYSBzZWNvbmQgbG9va3VwIG1hdGNoZXMgdGhlIHNhbWUKLSAqIGVudHJ5LCB0aGVuIHdlIGtub3cgdGhhdCB0aGUgaGkxNnMgcmVsb2MgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCi0gKiBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSB1cGRhdGVkIGEgc2Vjb25kIHRpbWUuCi0gKgotICogVE9ETyAtIFRPRklYOiBJZiBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIG5lZWQgdG8gcmVzdG9yZSAyIGRpZmZlcmVudAotICogYWRkcmVzc2VzIGZyb20gdGhlIHNhbWUgdGFibGUgZW50cnksIHdoZXJlIHRoZSBmaXJzdCBnZW5lcmF0ZXMgYW4KLSAqIG92ZXJmbG93LCB3aGlsc3QgdGhlIHNlY29uZCBkbyBub3QsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBoaTE2c19sb2NhdGlvbgotewotICBiZmRfdm1hICAgICAgIGFkZGVuZDsKLSAgYmZkX2J5dGUgKiAgICBhZGRyZXNzOwotICB1bnNpZ25lZCBsb25nIGNvdW50ZXI7Ci0gIGJvb2xlYW4gICAgICAgZm91bmQ7Ci0gIHN0cnVjdCBoaTE2c19sb2NhdGlvbiAqIG5leHQ7Ci19Ci1oaTE2c19sb2NhdGlvbjsKLQotc3RhdGljIGhpMTZzX2xvY2F0aW9uICogIHByZXZpb3VzX2hpMTZzOwotc3RhdGljIGhpMTZzX2xvY2F0aW9uICogIGZyZWVfaGkxNnM7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyAgICAgaGkxNnNfY291bnRlcjsKLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX2hpMTZzX3JlbG9jIChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpCi0gICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgYmZkX3ZtYSAgICBhZGRlbmQ7Ci0gICAgIGJmZF9ieXRlICogYWRkcmVzczsKLXsKLSAgaGkxNnNfbG9jYXRpb24gKiBlbnRyeSA9IE5VTEw7Ci0gIAotICAvKiBGaW5kIGEgZnJlZSBzdHJ1Y3R1cmUuICAqLwotICBpZiAoZnJlZV9oaTE2cyA9PSBOVUxMKQotICAgIGZyZWVfaGkxNnMgPSAoaGkxNnNfbG9jYXRpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICgqIGZyZWVfaGkxNnMpKTsKLQotICBlbnRyeSAgICAgID0gZnJlZV9oaTE2czsKLSAgZnJlZV9oaTE2cyA9IGZyZWVfaGkxNnMtPm5leHQ7Ci0gIAotICBlbnRyeS0+YWRkZW5kICA9IGFkZGVuZDsKLSAgZW50cnktPmFkZHJlc3MgPSBhZGRyZXNzOwotICBlbnRyeS0+Y291bnRlciA9IGhpMTZzX2NvdW50ZXIgKys7Ci0gIGVudHJ5LT5mb3VuZCAgID0gZmFsc2U7Ci0gIGVudHJ5LT5uZXh0ICAgID0gcHJldmlvdXNfaGkxNnM7Ci0gIHByZXZpb3VzX2hpMTZzID0gZW50cnk7Ci0gIAotICAvKiBDb3BlIHdpdGggd3JhcCBhcm91bmQgb2Ygb3VyIGNvdW50ZXIuICAqLwotICBpZiAoaGkxNnNfY291bnRlciA9PSAwKQotICAgIHsKLSAgICAgIC8qIFhYWCAtIEFzc3VtZSB0aGF0IGFsbCBjb3VudGVyIGVudHJpZXMgZGlmZmVyIG9ubHkgaW4gdGhlaXIgbG93IDE2IGJpdHMuICAqLwotICAgICAgZm9yIChlbnRyeSA9IHByZXZpb3VzX2hpMTZzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotCWVudHJ5LT5jb3VudGVyICY9IDB4ZmZmZjsKLQotICAgICAgaGkxNnNfY291bnRlciA9IDB4MTAwMDA7Ci0gICAgfQotICAKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgYmZkX2J5dGUgKgotZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jIChhZGRlbmQsIGFscmVhZHlfZm91bmQpCi0gICAgIGJmZF92bWEgICBhZGRlbmQ7Ci0gICAgIGJvb2xlYW4gKiBhbHJlYWR5X2ZvdW5kOwotewotICBoaTE2c19sb2NhdGlvbiAqIG1hdGNoID0gTlVMTDsKLSAgaGkxNnNfbG9jYXRpb24gKiBlbnRyeTsKLSAgaGkxNnNfbG9jYXRpb24gKiBwcmV2aW91cyA9IE5VTEw7Ci0gIGhpMTZzX2xvY2F0aW9uICogcHJldjsKLSAgYmZkX2J5dGUgKiAgICAgICBhZGRyOwotICAKLSAgLyogU2VhcmNoIHRoZSB0YWJsZS4gIFJlY29yZCB0aGUgbW9zdCByZWNlbnQgZW50cnkgdGhhdCBtYXRjaGVzLiAgKi8KLSAgZm9yIChlbnRyeSA9IHByZXZpb3VzX2hpMTZzOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZW50cnktPmFkZGVuZCA9PSBhZGRlbmQKLQkgICYmIChtYXRjaCA9PSBOVUxMIHx8IG1hdGNoLT5jb3VudGVyIDwgZW50cnktPmNvdW50ZXIpKQotCXsKLQkgIHByZXZpb3VzID0gcHJldjsKLQkgIG1hdGNoICAgID0gZW50cnk7Ci0JfQotICAgICAgCi0gICAgICBwcmV2ID0gZW50cnk7Ci0gICAgfQotCi0gIGlmIChtYXRjaCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIEV4dHJhY3QgdGhlIGFkZHJlc3MuICAqLwotICBhZGRyID0gbWF0Y2gtPmFkZHJlc3M7Ci0KLSAgLyogUmVtZWJlciBpZiB0aGlzIGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBiZWZvcmUuICAqLwotICBpZiAoYWxyZWFkeV9mb3VuZCkKLSAgICAqIGFscmVhZHlfZm91bmQgPSBtYXRjaC0+Zm91bmQ7Ci0KLSAgLyogTm90ZSB0aGF0IHRoaXMgZW50cnkgaGFzIG5vdyBiZWVuIHVzZWQuICAqLwotICBtYXRjaC0+Zm91bmQgPSB0cnVlOwotICAKLSAgcmV0dXJuIGFkZHI7Ci19ICAgICAKLQotLyogRklYTUU6ICBUaGUgY29kZSBoZXJlIHByb2JhYmx5IG91Z2h0IHRvIGJlIHJlbW92ZWQgYW5kIHRoZSBjb2RlIGluIHJlbG9jLmMKLSAgIGFsbG93ZWQgdG8gZG8gaXRzICBzdHVmZiBpbnN0ZWFkLiAgQXQgbGVhc3QgZm9yIG1vc3Qgb2YgdGhlIHJlbG9jcywgYW53eWF5LiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiAoYWJmZCwgcl90eXBlLCBhZGRlbmQsIGFkZHJlc3MpCi0gICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgaW50ICAgICAgICByX3R5cGU7Ci0gICAgIGJmZF92bWEgICAgYWRkZW5kOwotICAgICBiZmRfYnl0ZSAqIGFkZHJlc3M7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3NpZ25lZF92bWEgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAKLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBmcHJpbnRmIChzdGRlcnIsICJyZWxvYyB0eXBlICVkIG5vdCBTVVBQT1JURURcbiIsIHJfdHlwZSApOyAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF8zMjoKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGFkZGVuZCwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfMjJfUENSRUw6Ci0gICAgICBpZiAoc2FkZGVuZCA+IDB4MWZmZmZmIHx8IHNhZGRlbmQgPCAtMHgyMDAwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKChhZGRlbmQgJSAyKSAhPSAwKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgaW5zbiAmPSB+MHhmZmZlMDAzZjsKLSAgICAgIGluc24gfD0gKCgoYWRkZW5kICYgMHhmZmZlKSA8PCAxNikgfCAoKGFkZGVuZCAmIDB4M2YwMDAwKSA+PiAxNikpOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfOV9QQ1JFTDoKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmZiB8fCBzYWRkZW5kIDwgLTB4MTAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmICgoYWRkZW5kICUgMikgIT0gMCkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAgPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGluc24gJj0gfiAweGY4NzA7Ci0gICAgICBpbnNuIHw9ICgoYWRkZW5kICYgMHgxZjApIDw8IDcpIHwgKChhZGRlbmQgJiAweDBlKSA8PCAzKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfSEkxNjoKLSAgICAgIGFkZGVuZCArPSAoYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcykgPDwgMTYpOwotICAgICAgYWRkZW5kID0gKGFkZGVuZCA+PiAxNik7Ci0gICAgICBpbnNuID0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9ISTE2X1M6Ci0gICAgICAvKiBSZW1lbWJlciB3aGVyZSB0aGlzIHJlbG9jYXRpb24gdG9vayBwbGFjZS4gICovCi0gICAgICByZW1lbWJlcl9oaTE2c19yZWxvYyAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKTsKLQotICAgICAgYWRkZW5kICs9IChiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKSA8PCAxNik7Ci0gICAgICBhZGRlbmQgPSAoYWRkZW5kID4+IDE2KSArICgoYWRkZW5kICYgMHg4MDAwKSAhPSAwKTsKLSAgICAgIAotICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGNhbm5vdCBvdmVyZmxvdy4gKi8KLSAgICAgIGlmIChhZGRlbmQgPiAweDdmZmYpCi0JYWRkZW5kID0gMDsKLSAgICAgIAotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfTE8xNjoKLSAgICAgIC8qIENhbGN1bGF0ZSB0aGUgc3VtIG9mIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uIGFuZCB0aGUKLQkgYWRkZW5kIGFuZCBjaGVjayBmb3Igb3ZlcmZsb3cgZnJvbSB0aGUgbG93IDE2IGJpdHMgaW50byB0aGUgaGlnaAotCSAxNiBiaXRzLiAgVGhlIGFzc2VtYmxlciBoYXMgYWxyZWFkeSBkb25lIHNvbWUgb2YgdGhpczogIElmIHRoZQotCSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uIGhhcyBpdHMgMTV0aCBiaXQgc2V0LCAoY291bnRpbmcKLQkgZnJvbSB6ZXJvKSB0aGVuIHRoZSBhc3NlbWJsZXIgd2lsbCBoYXZlIGFkZGVkIDEgdG8gdGhlIHZhbHVlCi0JIHN0b3JlZCBpbiB0aGUgYXNzb2NpYXRlZCBISTE2UyByZWxvYy4gIFNvIGZvciBleGFtcGxlLCB0aGVzZQotCSByZWxvY2F0aW9uczoKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgKSwgcjAsIHIxCi0JICAgICBtb3ZlYSBsbyggZnJlZCApLCByMSwgcjEKLQotCSB3aWxsIHN0b3JlIDAgaW4gdGhlIHZhbHVlIGZpZWxkcyBmb3IgdGhlIE1PVkhJIGFuZCBNT1ZFQSBpbnN0cnVjdGlvbnMKLQkgYW5kIGFkZGVuZCB3aWxsIGJlIHRoZSBhZGRyZXNzIG9mIGZyZWQsIGJ1dCBmb3IgdGhlc2UgaW5zdHJ1Y3Rpb25zOgotCi0JICAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTIzNDU2KSwgcjAsIHIxCi0JICAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTIzNDU2KSwgcjEsIHIxCi0KLQkgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTU9WSEkgaW5zdHJ1Y3Rpb24gd2lsbCBiZSAweDEyIGFuZCB0aGUgdmFsdWUKLQkgc3RvcmVkIGluIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbiB3aWxsIGJlIDB4MzQ1Ni4gIElmIGhvd2V2ZXIgdGhlCi0JIGluc3RydWN0aW9ucyB3ZXJlOgotCi0JICAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTBmZmZmKSwgcjAsIHIxCi0JICAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTBmZmZmKSwgcjEsIHIxCi0KLQkgdGhlbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBNT1ZISSBpbnN0cnVjdGlvbiB3b3VsZCBiZSAweDExIChub3QKLQkgMHgxMCkgYW5kIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1PVkVBIGluc3RydWN0aW9uIHdvdWxkIGJlIDB4ZmZmZi4KLQkgVGh1cyAoYXNzdW1pbmcgZm9yIHRoZSBtb21lbnQgdGhhdCB0aGUgYWRkZW5kIGlzIDApLCBhdCBydW4gdGltZSB0aGUKLQkgTU9WSEkgaW5zdHJ1Y3Rpb24gbG9hZHMgMHgxMTAwMDAgaW50byByMSwgdGhlbiB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24KLQkgYWRkcyAweGZmZmZmZmZmIChzaWduIGV4dGVuc2lvbiEpIHByb2R1Y2luZyAweDEwZmZmZi4gIFNpbWlsYXJseSBpZgotCSB0aGUgaW5zdHJ1Y3Rpb25zIHdlcmU6Ci0KLQkgICAgIG1vdmhpIGhpKCBmcmVkIC0gMSksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgLSAxKSwgcjEsIHIxCi0KLQkgdGhlbiAwIGlzIHN0b3JlZCBpbiB0aGUgTU9WSEkgaW5zdHJ1Y3Rpb24gYW5kIC0xIGlzIHN0b3JlZCBpbiB0aGUKLQkgTU9WRUEgaW5zdHJ1Y3Rpb24uCi0KLQkgT3ZlcmZsb3cgY2FuIG9jY3VyIGlmIHRoZSBhZGRpdGlvbiBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZQotCSBpbnN0cnVjdGlvbiBwbHVzIHRoZSBhZGRlbmQgc2V0cyB0aGUgMTV0aCBiaXQgd2hlbiBiZWZvcmUgaXQgd2FzIGNsZWFyLgotCSBUaGlzIGlzIGJlY2F1c2UgdGhlIDE1dGggYml0IHdpbGwgYmUgc2lnbiBleHRlbmRlZCBpbnRvIHRoZSBoaWdoIHBhcnQsCi0JIHRodXMgcmVkdWNpbmcgaXRzIHZhbHVlIGJ5IG9uZSwgYnV0IHNpbmNlIHRoZSAxNXRoIGJpdCB3YXMgb3JpZ2luYWxseQotCSBjbGVhciwgdGhlIGFzc2VtYmxlciB3aWxsIG5vdCBoYXZlIGFkZGVkIDEgdG8gdGhlIHByZXZpb3VzIEhJMTZTIHJlbG9jCi0JIHRvIGNvbXBlbnNhdGUgZm9yIHRoaXMgZWZmZWN0LiAgRm9yIGV4YW1wbGU6Ci0KLQkgICAgbW92aGkgaGkoIGZyZWQgKyAweDEyMzQ1NiksIHIwLCByMQotCSAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTIzNDU2KSwgcjEsIHIxCi0KLQkgVGhlIHZhbHVlIHN0b3JlZCBpbiBISTE2UyByZWxvYyBpcyAweDEyLCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBMTzE2Ci0JIHJlbG9jIGlzIDB4MzQ1Ni4gIElmIHdlIGFzc3VtZSB0aGF0IHRoZSBhZGRyZXNzIG9mIGZyZWQgaXMgMHgwMDAwNzAwMAotCSB0aGVuIHRoZSByZWxvY2F0aW9ucyBiZWNvbWU6Ci0KLQkgICBISTE2UzogMHgwMDEyICsgKDB4MDAwMDcwMDAgPj4gMTYpICAgID0gMHgxMgotCSAgIExPMTY6ICAweDM0NTYgKyAoMHgwMDAwNzAwMCAmIDB4ZmZmZikgPSAweGE0NTYKLQotCSBidXQgd2hlbiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBleGVjdXRlZCwgdGhlIE1PVkVBIGluc3RydWN0aW9uJ3MgdmFsdWUKLQkgaXMgc2lnbmVkIGV4dGVuZGVkLCBzbyB0aGUgc3VtIGJlY29tZXM6Ci0KLQkgICAgICAweDAwMTIwMDAwCi0JICAgICsgMHhmZmZmYTQ1NgotCSAgICAtLS0tLS0tLS0tLS0KLQkgICAgICAweDAwMTFhNDU2ICAgIGJ1dCAnZnJlZCArIDB4MTIzNDU2JyA9IDB4MDAxMmE0NTYKLQotCSBOb3RlIHRoYXQgaWYgdGhlIDE1dGggYml0IHdhcyBzZXQgaW4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTE8xNgotCSByZWxvYywgdGhlbiB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnl0aGluZzoKLQotCSAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTBmZmZmKSwgcjAsIHIxCi0JICAgIG1vdmVhIGxvKCBmcmVkICsgMHgxMGZmZmYpLCByMSwgcjEKLQotCSAgICBISTE2UzogIDB4MDAxMSArICgweDAwMDA3MDAwID4+IDE2KSAgICA9IDB4MTEKLQkgICAgTE8xNjogICAweGZmZmYgKyAoMHgwMDAwNzAwMCAmIDB4ZmZmZikgPSAweDZmZmYKLQotCSAgICAgIDB4MDAxMTAwMDAKLQkgICAgKyAweDAwMDA2ZmZmCi0JICAgIC0tLS0tLS0tLS0tLQotCSAgICAgIDB4MDAxMTZmZmYgID0gZnJlZCArIDB4MTBmZmZmID0gMHg3MDAwICsgMHgxMGZmZmYKLQotCSAKLQkgT3ZlcmZsb3cgY2FuIGFsc28gb2NjdXIgaWYgdGhlIGNvbXB1dGF0aW9uIGNhcnJpZXMgaW50byB0aGUgMTZ0aCBiaXQKLQkgYW5kIGl0IGFsc28gcmVzdWx0cyBpbiB0aGUgMTV0aCBiaXQgaGF2aW5nIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSAxNXRoCi0JIGJpdCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUuICAgV2hhdCBoYXBwZW5zIGlzIHRoYXQgdGhlIEhJMTZTIHJlbG9jCi0JIHdpbGwgaGF2ZSBhbHJlYWR5IGV4YW1pbmVkIHRoZSAxNXRoIGJpdCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUgYW5kCi0JIGFkZGVkIDEgdG8gdGhlIGhpZ2ggcGFydCBpZiB0aGUgYml0IGlzIHNldC4gIFRoaXMgY29tcGVuc2F0ZXMgZm9yIHRoZQotCSBzaWduIGV4dGVuc2lvbiBvZiAxNXRoIGJpdCBvZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wdXRhdGlvbi4gIEJ1dCBub3cKLQkgdGhlcmUgaXMgYSBjYXJyeSBpbnRvIHRoZSAxNnRoIGJpdCwgYW5kIHRoaXMgaGFzIG5vdCBiZWVuIGFsbG93ZWQgZm9yLgotCi0JIFNvLCBmb3IgZXhhbXBsZSBpZiBmcmVkIGlzIGF0IGFkZHJlc3MgMHhmMDAwOgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweGZmZmYpLCByMCwgcjEgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIHNldF0KLQkgICBtb3ZlYSBsbyggZnJlZCArIDB4ZmZmZiksIHIxLCByMQotCi0JICAgSEkxNlM6IDB4MDAwMSArICgweDAwMDBmMDAwID4+IDE2KSAgICA9IDB4MDAwMQotCSAgIExPMTY6ICAweGZmZmYgKyAoMHgwMDAwZjAwMCAmIDB4ZmZmZikgPSAweGVmZmYgICAoY2FycnkgaW50byBiaXQgMTYgaXMgbG9zdCkKLQotCSAgICAgMHgwMDAxMDAwMAotCSAgICsgMHhmZmZmZWZmZgotCSAgIC0tLS0tLS0tLS0tLQotCSAgICAgMHgwMDAwZWZmZiAgIGJ1dCAnZnJlZCArIDB4ZmZmZicgPSAweDAwMDFlZmZmCi0KLQkgU2ltaWxhcmx5LCBpZiB0aGUgMTV0aCBiaXQgcmVtYWlucyBjbGVhciwgYnV0IG92ZXJmbG93IG9jY3VycyBpbnRvCi0JIHRoZSAxNnRoIGJpdCB0aGVuIChhc3N1bWluZyB0aGUgYWRkcmVzcyBvZiBmcmVkIGlzIDB4ZjAwMCk6Ci0KLQkgICBtb3ZoaSBoaSggZnJlZCArIDB4NzAwMCksIHIwLCByMSAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgY2xlYXJdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweDcwMDApLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDAgKyAoMHgwMDAwZjAwMCA+PiAxNikgICAgPSAweDAwMDAKLQkgICBMTzE2OiAgMHg3MDAwICsgKDB4MDAwMGYwMDAgJiAweGZmZmYpID0gMHg2ZmZmICAoY2FycnkgaW50byBiaXQgMTYgaXMgbG9zdCkKLQotCSAgICAgMHgwMDAwMDAwMAotCSAgICsgMHgwMDAwNmZmZgotCSAgIC0tLS0tLS0tLS0tLQotCSAgICAgMHgwMDAwNmZmZiAgIGJ1dCAnZnJlZCArIDB4NzAwMCcgPSAweDAwMDE2ZmZmCi0JICAgCi0JIE5vdGUgLSB0aGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBpZiBhIGNhcnJ5IG9jY3VycywgYW5kIHRoZQotCSAxNXRoIGJpdCBjaGFuZ2VzIGl0cyB2YWx1ZSBmcm9tIGJlaW5nIHNldCB0byBiZWluZyBjbGVhciwgYXMgdGhlIEhJMTZTCi0JIHJlbG9jIHdpbGwgaGF2ZSBhbHJlYWR5IGFkZGVkIGluIDEgdG8gdGhlIGhpZ2ggcGFydCBmb3IgdXM6Ci0KLQkgICBtb3ZoaSBoaSggZnJlZCArIDB4ZmZmZiksIHIwLCByMSAgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIHNldF0KLQkgICBtb3ZlYSBsbyggZnJlZCArIDB4ZmZmZiksIHIxLCByMQotCi0JICAgSEkxNlM6IDB4MDAwMSArICgweDAwMDA3MDAwID4+IDE2KQotCSAgIExPMTY6ICAweGZmZmYgKyAoMHgwMDAwNzAwMCAmIDB4ZmZmZikgPSAweDZmZmYgIChjYXJyeSBpbnRvIGJpdCAxNiBpcyBsb3N0KQotCi0JICAgICAweDAwMDEwMDAwCi0JICAgKyAweDAwMDA2ZmZmICAgKGJpdCAxNSBub3Qgc2V0LCBzbyB0aGUgdG9wIGhhbGYgaXMgemVybykKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMTZmZmYgICB3aGljaCBpcyByaWdodCAoYXNzdW1pbmcgdGhhdCBmcmVkIGlzIGF0IDB4NzAwMCkKLQotCSBidXQgaWYgdGhlIDE1dGggYml0IGdvZXMgZnJvbSBiZWluZyBjbGVhciB0byBiZWluZyBzZXQsIHRoZW4gd2UgbXVzdAotCSBvbmNlIGFnYWluIGhhbmRsZSBvdmVyZmxvdzoKLQotCSAgIG1vdmhpIGhpKCBmcmVkICsgMHg3MDAwKSwgcjAsIHIxICAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgY2xlYXJdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweDcwMDApLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDAgKyAoMHgwMDAwZmZmZiA+PiAxNikKLQkgICBMTzE2OiAgMHg3MDAwICsgKDB4MDAwMGZmZmYgJiAweGZmZmYpID0gMHg2ZmZmICAoY2FycnkgaW50byBiaXQgMTYpCi0KLQkgICAgIDB4MDAwMDAwMDAKLQkgICArIDB4MDAwMDZmZmYgICAoYml0IDE1IG5vdCBzZXQsIHNvIHRoZSB0b3AgaGFsZiBpcyB6ZXJvKQotCSAgIC0tLS0tLS0tLS0tLQotCSAgICAgMHgwMDAwNmZmZiAgIHdoaWNoIGlzIHdyb25nIChhc3N1bWluZyB0aGF0IGZyZWQgaXMgYXQgMHhmZmZmKQotCSAqLwotCi0gICAgICB7Ci0JbG9uZyByZXN1bHQ7Ci0KLQlpbnNuICAgPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLQlyZXN1bHQgPSBpbnNuICsgYWRkZW5kOwotCi0jZGVmaW5lIEJJVDE1X1NFVCh4KSAoKHgpICYgMHg4MDAwKQotI2RlZmluZSBPVkVSRkxPV1MoYSxpKSAoKCgoYSkgJiAweGZmZmYpICsgKGkpKSA+IDB4ZmZmZikKLQkKLQlpZiAoKEJJVDE1X1NFVCAocmVzdWx0KSAmJiAhIEJJVDE1X1NFVCAoYWRkZW5kKSkKLQkgICAgfHwgKE9WRVJGTE9XUyAoYWRkZW5kLCBpbnNuKQotCQkmJiAoKCEgQklUMTVfU0VUIChpbnNuKSkgfHwgKEJJVDE1X1NFVCAoYWRkZW5kKSkpKSkKLQkgIHsKLQkgICAgYm9vbGVhbiBhbHJlYWR5X3VwZGF0ZWQ7Ci0JICAgIGJmZF9ieXRlICogaGkxNnNfYWRkcmVzcyA9IGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYwotCSAgICAgIChhZGRlbmQsICYgYWxyZWFkeV91cGRhdGVkKTsKLQkgICAgCi0JICAgIC8qIEFtZW5kIHRoZSBtYXRjaGluZyBISTE2X1MgcmVsb2NhdGlvbi4gICovCi0JICAgIGlmIChoaTE2c19hZGRyZXNzICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoISBhbHJlYWR5X3VwZGF0ZWQpCi0JCSAgewotCQkgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpMTZzX2FkZHJlc3MpOwotCQkgICAgaW5zbiArPSAxOwotCQkgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgaGkxNnNfYWRkcmVzcyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RkZXJyLCBfKCJGQUlMRUQgdG8gZmluZCBwcmV2aW91cyBISTE2IHJlbG9jXG4iKSk7Ci0JCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICAgICAgfQotCSAgfQotCQotCS8qIERvIG5vdCBjb21wbGFpbiBpZiB2YWx1ZSBoYXMgdG9wIGJpdCBzZXQsIGFzIHRoaXMgaGFzIGJlZW4gYW50aWNpcGF0ZWQuICAqLwotCWluc24gPSByZXN1bHQgJiAweGZmZmY7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFJfVjg1MF84OgotICAgICAgYWRkZW5kICs9IChjaGFyKSBiZmRfZ2V0XzggKGFiZmQsIGFkZHJlc3MpOwotCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZiB8fCBzYWRkZW5kIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKLSAgICAgIGFkZGVuZCArPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZmZmZiB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBpbnNuID0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF8xNjoKLQotICAgICAgLyogZHJvcCB0aHJvdWdoICovICAgICAgICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6Ci0gICAgICBhZGRlbmQgKz0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmZmYgfHwgc2FkZGVuZCA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9IChpbnNuICYgMHhmZmZlKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2ZmZSB8fCBzYWRkZW5kIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gPSAoYWRkZW5kICYgfjEpIHwgKGluc24gJiAxKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzZfOF9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHg3ZSkgPDwgMSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweGZjIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAzKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmY4MTsKLSAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzdfOF9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHg3ZikgPDwgMSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweGZlIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAxKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmY4MDsKLSAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzdfN19PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gaW5zbiAmIDB4N2Y7Ci0JCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZiB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmY4MDsKLSAgICAgIGluc24gfD0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfNF81X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweGYpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHgxZSB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmZjA7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9IGluc24gJiAweGY7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweGYgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmZjA7Ci0gICAgICBpbnNuIHw9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4ZmZmZTAwMDApID4+IDE2KSArICgoaW5zbiAmIDB4MjApID4+IDUpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZmZmIHx8IHNhZGRlbmQgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHgwMDAxZmZkZjsKLSAgICAgIGluc24gfD0gKGFkZGVuZCAmIDEpIDw8IDU7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgJiB+MSkgPDwgMTY7Ci0gICAgICAKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0NBTExUXzZfN19PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHgzZikgPDwgMSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdlIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAxKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmY4MDsKLSAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1Y4NTBfR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICB9Ci0KLSAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgYWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qIEluc2VydCB0aGUgYWRkZW5kIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXY4NTBfZWxmX3JlbG9jIChhYmZkLCByZWxvYywgc3ltYm9sLCBkYXRhLCBpc2VjdGlvbiwgb2JmZCwgZXJyKQotICAgICBiZmQgKiAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKiAgIHJlbG9jOwotICAgICBhc3ltYm9sICogICBzeW1ib2w7Ci0gICAgIFBUUiAgICAgICAgIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiAgaXNlY3Rpb247Ci0gICAgIGJmZCAqICAgICAgIG9iZmQ7Ci0gICAgIGNoYXIgKiogICAgIGVyciBBVFRSSUJVVEVfVU5VU0VEOwotewotICBsb25nIHJlbG9jYXRpb247Ci0gIAotICAvKiBJZiB0aGVyZSBpcyBhbiBvdXRwdXQgQkZELAotICAgICBhbmQgdGhlIHN5bWJvbCBpcyBub3QgYSBzZWN0aW9uIG5hbWUgKHdoaWNoIGlzIG9ubHkgZGVmaW5lZCBhdCBmaW5hbCBsaW5rIHRpbWUpLAotICAgICBhbmQgZWl0aGVyIHdlIGFyZSBub3QgcHV0dGluZyB0aGUgYWRkZW5kIGludG8gdGhlIGluc3RydWN0aW9uCi0gICAgICAgICBvciB0aGUgYWRkZW5kIGlzIHplcm8sIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkIGludG8gdGhlIGluc3RydWN0aW9uCi0gICAgIHRoZW4ganVzdCBmaXh1cCB0aGUgYWRkcmVzcyBhbmQgcmV0dXJuLiAgKi8KLSAgaWYgKG9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2MtPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jLT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2MtPmFkZHJlc3MgKz0gaXNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLSNpZiAwICAKLSAgZWxzZSBpZiAob2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotI2VuZGlmCi0gIAotICAvKiBDYXRjaCByZWxvY3MgaW52b2x2aW5nIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb2JmZCA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIFdlIGhhbmRsZSBmaW5hbCBsaW5raW5nIG9mIHNvbWUgcmVsb2NzIG91cnNlbHZlcy4gICovCi0KLSAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCi0gIGlmIChyZWxvYy0+YWRkcmVzcyA+IGlzZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAKLSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0gIAotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLSAgCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUgKyBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2MtPmFkZGVuZDsKLSAgCi0gIGlmIChyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLQkgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0gICAgICByZWxvY2F0aW9uIC09IGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICAKLSAgICAgIC8qIERlYWwgd2l0aCBwY3JlbF9vZmZzZXQgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2MtPmFkZHJlc3M7Ci0gICAgfQotCi0gIHJlbG9jLT5hZGRlbmQgPSByZWxvY2F0aW9uOwkKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotDAotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICogICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiAgbmFtZTsKLXsKLSAgcmV0dXJuICggICAobmFtZVswXSA9PSAnLicgJiYgKG5hbWVbMV0gPT0gJ0wnIHx8IG5hbWVbMV0gPT0gJy4nKSkKLQkgIHx8IChuYW1lWzBdID09ICdfJyAmJiAgbmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAnTCcgJiYgbmFtZVszXSA9PSAnXycpKTsKLX0KLQotDAotLyogUGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgdmFsdWUsCi0JCQkJICAgIGFkZGVuZCwgaW5mbywgc3ltX3NlYywgaXNfbG9jYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgIGhvd3RvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIG9mZnNldDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgc3ltX3NlYzsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgaXNfbG9jYWwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyAgcl90eXBlICAgPSBob3d0by0+dHlwZTsKLSAgYmZkX2J5dGUgKiAgICAgaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICAvKiBBZGp1c3QgdGhlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfVjg1MF85X1BDUkVMOgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IG9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgUl9WODUwXzIyX1BDUkVMOgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSsgb2Zmc2V0KTsKLQotICAgICAgLyogSWYgdGhlIHNpZ24gZXh0ZW5zaW9uIHdpbGwgY29ycnVwdCB0aGUgdmFsdWUgdGhlbiB3ZSBoYXZlIG92ZXJmbG93ZWQuICAqLwotICAgICAgaWYgKCgodmFsdWUgJiAweGZmMDAwMDAwKSAhPSAweDApICYmICgodmFsdWUgJiAweGZmMDAwMDAwKSAhPSAweGZmMDAwMDAwKSkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICB2YWx1ZSA9IFNFWFQyNCAodmFsdWUpOyAgLyogT25seSB0aGUgYm90dG9tIDI0IGJpdHMgb2YgdGhlIFBDIGFyZSB2YWxpZCAqLwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9ISTE2X1M6Ci0gICAgY2FzZSBSX1Y4NTBfSEkxNjoKLSAgICBjYXNlIFJfVjg1MF9MTzE2OgotICAgIGNhc2UgUl9WODUwXzE2OgotICAgIGNhc2UgUl9WODUwXzMyOgotICAgIGNhc2UgUl9WODUwXzg6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQ6CQotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICAgIGlmIChzeW1fc2VjID09IE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0JICAKLSAgICAgIHZhbHVlIC09IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgZ3A7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCkKLQkgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2dwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0KLQlncCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQl2YWx1ZSAtPSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCXZhbHVlIC09IChncCAtIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1Y4NTBfVERBXzRfNF9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzRfNV9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfN183X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfN184X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfNl84X09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGVwOwotCXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQkKLQkvKiBHZXQgdGhlIHZhbHVlIG9mIF9fZXAuICAqLwotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9fZXAiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsgIC8qIEFjdHVhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgX19lcCBjb3VsZCBub3QgYmUgZm91bmQuICovCi0KLQllcCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQl2YWx1ZSAtPSBlcDsKLSAgICAgIH0KLSAgICBicmVhazsKLSAgICAKLSAgICBjYXNlIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgY3RicDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0JCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2N0YnAuICAqLwotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9fY3RicCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICByZXR1cm4gKGJmZF9yZWxvY19kYW5nZXJvdXMgKyAxKTsgIC8qIEFjdHVhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgX19jdGJwIGNvdWxkIG5vdCBiZSBmb3VuZC4gKi8KLQotCWN0YnAgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCXZhbHVlIC09IGN0YnA7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgY3RicDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLQlpZiAoc3ltX3NlYyA9PSBOVUxMKQotCSAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0JICAKLQkvKiBHZXQgdGhlIHZhbHVlIG9mIF9fY3RicC4gICovCi0JaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX19jdGJwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgIHJldHVybiAoYmZkX3JlbG9jX2Rhbmdlcm91cyArIDEpOwotCi0JY3RicCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQl2YWx1ZSAtPSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCXZhbHVlIC09IChjdGJwIC0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9OT05FOgotICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgY2FzZSBSX1Y4NTBfR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLQotICAvKiBQZXJmb3JtIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgcmV0dXJuIHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLCByX3R5cGUsIHZhbHVlICsgYWRkZW5kLCBoaXRfZGF0YSk7IAotfQotCi0MCi0vKiBSZWxvY2F0ZSBhbiBWODUwIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIGlmIChzeW1faGFzaGVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nCi0JKGluZm8sICJubyBoYXNoIHRhYmxlIGF2YWlsYWJsZSIsIE5VTEwsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgMCk7Ci0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIAotICAvKiBSZXNldCB0aGUgbGlzdCBvZiByZW1lbWJlcmVkIEhJMTZTIHJlbG9jcyB0byBlbXB0eS4gICovCi0gIGZyZWVfaGkxNnMgICAgID0gcHJldmlvdXNfaGkxNnM7Ci0gIHByZXZpb3VzX2hpMTZzID0gTlVMTDsKLSAgaGkxNnNfY291bnRlciAgPSAwOwotICAKLSAgcmVsICAgID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSAgID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9WODUwX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfVjg1MF9HTlVfVlRJTkhFUklUKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaG93dG8gPSB2ODUwX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0jaWYgMAotCSAgewotCSAgICBjaGFyICogbmFtZTsKLQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKTsKLQkgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxub25lPiIgOiBuYW1lOwotZnByaW50ZiAoc3RkZXJyLCAibG9jYWw6IHNlYzogJXMsIHN5bTogJXMgKCVkKSwgdmFsdWU6ICV4ICsgJXggKyAleCBhZGRlbmQgJXhcbiIsCi0JIHNlYy0+bmFtZSwgbmFtZSwgc3ltLT5zdF9uYW1lLAotCSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEsIHNlYy0+b3V0cHV0X29mZnNldCwgc3ltLT5zdF92YWx1ZSwgcmVsLT5yX2FkZGVuZCk7Ci0JICB9Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIAotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSNpZiAwCi1mcHJpbnRmIChzdGRlcnIsICJkZWZpbmVkOiBzZWM6ICVzLCBuYW1lOiAlcywgdmFsdWU6ICV4ICsgJXggKyAleCBnaXZlczogJXhcbiIsCi0JIHNlYy0+bmFtZSwgaC0+cm9vdC5yb290LnN0cmluZywgaC0+cm9vdC51LmRlZi52YWx1ZSwgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsIHJlbG9jYXRpb24pOwotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgewotI2lmIDAKLWZwcmludGYgKHN0ZGVyciwgInVuZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXNcbiIsCi0JIHNlYy0+bmFtZSwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotI2lmIDAKLWZwcmludGYgKHN0ZGVyciwgInVua25vd246IG5hbWU6ICVzXG4iLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHVzZSB0aGUgYWRkZW5kLCBidXQgdGhlIENPRkYgcmVsb2NhdGlvbnMKLSAgICAgICAgIGRvbid0LiAgKi8KLSAgICAgIHIgPSB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCwKLQkJCQkJaW5mbywgc2VjLCBoID09IE5VTEwpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG5hbWU7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikwOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdGhlcjoKLQkgICAgICBtc2cgPSBfKCJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2dwIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfY29udGludWU6Ci0JICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19lcCIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgKGJmZF9yZWxvY19kYW5nZXJvdXMgKyAxKToKLQkgICAgICBtc2cgPSBfKCJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2N0YnAiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBObyBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciB2ODUwLWVsZiAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGFzZWN0aW9uICoKLXY4NTBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX1Y4NTBfQVJDSDogICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfdjg1MCwgMCk7IGJyZWFrOwotICAgIGNhc2UgRV9WODUwRV9BUkNIOiAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Y4NTAsIGJmZF9tYWNoX3Y4NTBlKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFQV9BUkNIOiAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfdjg1MCwgYmZkX21hY2hfdjg1MGVhKTsgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RvcmUgdGhlIG1hY2hpbmUgbnVtYmVyIGluIHRoZSBmbGFncyBmaWVsZC4gICovCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6IHZhbCA9IEVfVjg1MF9BUkNIOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgdmFsID0gRV9WODUwRV9BUkNIOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogdmFsID0gRV9WODUwRUFfQVJDSDsgIGJyZWFrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfVjg1MF9BUkNIOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGtlZXAgVjg1MCBzcGVjaWZpYyBmaWxlIGZsYWdzLiAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICogICAgYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MKLQkJICA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncykpOwotCi0gIGVsZl9ncCAob2JmZCkgPSBlbGZfZ3AgKGliZmQpOwotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAotCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0JIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKLQkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQl7Ci0JICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0gIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKLSAgICAgICYmIChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gRV9WODUwX0FSQ0gpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogQXJjaGl0ZWN0dXJlIG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotICAKLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLSAgCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oInByaXZhdGUgZmxhZ3MgPSAlbHg6ICIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0gIAotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfVjg1MF9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9WODUwX0FSQ0g6IGZwcmludGYgKGZpbGUsIF8oInY4NTAgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVfQVJDSDogIGZwcmludGYgKGZpbGUsIF8oInY4NTBlIGFyY2hpdGVjdHVyZSIpKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFQV9BUkNIOiBmcHJpbnRmIChmaWxlLCBfKCJ2ODUwZWEgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICB9Ci0gIAotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVjg1MCBFTEYgdXNlcyBmb3VyIGNvbW1vbiBzZWN0aW9ucy4gIE9uZSBpcyB0aGUgdXN1YWwgb25lLCBhbmQgdGhlCi0gICBvdGhlcnMgYXJlIGZvciAoc21hbGwpIG9iamVjdHMgaW4gb25lIG9mIHRoZSBzcGVjaWFsIGRhdGEgYXJlYXM6Ci0gICBzbWFsbCwgdGlueSBhbmQgemVyby4gIEFsbCB0aGUgb2JqZWN0cyBhcmUga2VwdCB0b2dldGhlciwgYW5kIHRoZW4KLSAgIHJlZmVyZW5jZWQgdmlhIHRoZSBncCByZWdpc3RlciwgdGhlIGVwIHJlZ2lzdGVyIG9yIHRoZSByMCByZWdpc3RlcgotICAgcmVzcGVjdGl2ZWx5LCB3aGljaCB5aWVsZHMgc21hbGxlciwgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcwotICAgYXBwcm9hY2ggaXMgY29waWVkIGZyb20gZWxmMzItbWlwcy5jLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgIHY4NTBfZWxmX3Njb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKiB2ODUwX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci1zdGF0aWMgYXNlY3Rpb24gIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sICAgdjg1MF9lbGZfdGNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqIHY4NTBfZWxmX3Rjb21fc3ltYm9sX3B0cjsKLXN0YXRpYyBhc2VjdGlvbiAgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgICB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICogdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyOwotCi0KLS8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KLSAgIGluZGV4LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGhkciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgc2VjOwotICAgICBpbnQgKiAgICAgICAgICAgICAgICAgcmV0dmFsOwotewotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICAqcmV0dmFsID0gU0hOX1Y4NTBfU0NPTU1PTjsKLSAgZWxzZSBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi50Y29tbW9uIikgPT0gMCkKLSAgICAqcmV0dmFsID0gU0hOX1Y4NTBfVENPTU1PTjsKLSAgZWxzZSBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi56Y29tbW9uIikgPT0gMCkKLSAgICAqcmV0dmFsID0gU0hOX1Y4NTBfWkNPTU1PTjsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgVjg1MCBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIChhYmZkLCBhc3ltKQotICAgICBiZmQgKiAgICAgYWJmZDsKLSAgICAgYXN5bWJvbCAqIGFzeW07Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqIGVsZnN5bSA9IChlbGZfc3ltYm9sX3R5cGUgKikgYXN5bTsKLSAgdW5zaWduZWQgc2hvcnQgaW5kZXg7Ci0gIAotICBpbmRleCA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbiBpbmRleCBpcyBhbiAib3JkaW5hcnkiIGluZGV4LCB0aGVuIGl0IG1heQotICAgICByZWZlciB0byBhIHY4NTAgc3BlY2lmaWMgc2VjdGlvbiBjcmVhdGVkIGJ5IHRoZSBhc3NlbWJsZXIuCi0gICAgIENoZWNrIHRoZSBzZWN0aW9uJ3MgdHlwZSBhbmQgY2hhbmdlIHRoZSBpbmRleCBpdCBtYXRjaGVzLgotICAgICAKLSAgICAgRklYTUU6IFNob3VsZCB3ZSBhbHRlciB0aGUgc3Rfc2huZHggZmllbGQgYXMgd2VsbCA/ICAqLwotICAKLSAgaWYgKGluZGV4IDwgZWxmX2VsZmhlYWRlcihhYmZkKVswXS5lX3NobnVtKQotICAgIHN3aXRjaCAoZWxmX2VsZnNlY3Rpb25zKGFiZmQpW2luZGV4XS0+c2hfdHlwZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgU0hUX1Y4NTBfU0NPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1NDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIFNIVF9WODUwX1RDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9UQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgY2FzZSBTSFRfVjg1MF9aQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfWkNPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIAotICBzd2l0Y2ggKGluZGV4KQotICAgIHsKLSAgICBjYXNlIFNITl9WODUwX1NDT01NT046Ci0gICAgICBpZiAodjg1MF9lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnNjb21tb24iOwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLmZsYWdzICAgICAgICAgID0gU0VDX0lTX0NPTU1PTiB8IFNFQ19BTExPQyB8IFNFQ19EQVRBOwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHY4NTBfZWxmX3Njb21fc3ltYm9sOwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiB2ODUwX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnNjb21tb24iOwotCSAgdjg1MF9lbGZfc2NvbV9zeW1ib2wuZmxhZ3MgICAgICAgICAgID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgdjg1MF9lbGZfc2NvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbF9wdHIgICAgICAgICAgICAgPSAmIHY4NTBfZWxmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0hOX1Y4NTBfVENPTU1PTjoKLSAgICAgIGlmICh2ODUwX2VsZl90Y29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHRjb21tb24gc2VjdGlvbi4gICovCi0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnRjb21tb24iOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLmZsYWdzICAgICAgICAgID0gU0VDX0lTX0NPTU1PTjsKLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgdjg1MF9lbGZfdGNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiB2ODUwX2VsZl90Y29tX3N5bWJvbDsKLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgdjg1MF9lbGZfdGNvbV9zeW1ib2xfcHRyOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi50Y29tbW9uIjsKLQkgIHY4NTBfZWxmX3Rjb21fc3ltYm9sLmZsYWdzICAgICAgICAgICA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHY4NTBfZWxmX3Rjb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgdjg1MF9lbGZfdGNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2xfcHRyICAgICAgICAgICAgID0gJiB2ODUwX2VsZl90Y29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9WODUwX1pDT01NT046Ci0gICAgICBpZiAodjg1MF9lbGZfemNvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSB6Y29tbW9uIHNlY3Rpb24uICAqLwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLm5hbWUgICAgICAgICAgID0gIi56Y29tbW9uIjsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5mbGFncyAgICAgICAgICA9IFNFQ19JU19DT01NT047Ci0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHY4NTBfZWxmX3pjb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgdjg1MF9lbGZfemNvbV9zeW1ib2w7Ci0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHY4NTBfZWxmX3pjb21fc3ltYm9sX3B0cjsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIuemNvbW1vbiI7Ci0JICB2ODUwX2VsZl96Y29tX3N5bWJvbC5mbGFncyAgICAgICAgICAgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICB2ODUwX2VsZl96Y29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHY4NTBfZWxmX3pjb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sX3B0ciAgICAgICAgICAgICA9ICYgdjg1MF9lbGZfemNvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIG11c3QgaGFuZGxlIHRoZSBzcGVjaWFsIHY4NTAgc2VjdGlvbiBudW1iZXJzIGhlcmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiBzeW07Ci0gICAgIGNvbnN0IGNoYXIgKiogICAgICAgICAgICBuYW1lcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmbGFnd29yZCAqICAgICAgICAgICAgICAgZmxhZ3NwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgICBzZWNwOwotICAgICBiZmRfdm1hICogICAgICAgICAgICAgICAgdmFscDsKLXsKLSAgaW50IGluZGV4ID0gc3ltLT5zdF9zaG5keDsKLSAgCi0gIC8qIElmIHRoZSBzZWN0aW9uIGluZGV4IGlzIGFuICJvcmRpbmFyeSIgaW5kZXgsIHRoZW4gaXQgbWF5Ci0gICAgIHJlZmVyIHRvIGEgdjg1MCBzcGVjaWZpYyBzZWN0aW9uIGNyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlci4KLSAgICAgQ2hlY2sgdGhlIHNlY3Rpb24ncyB0eXBlIGFuZCBjaGFuZ2UgdGhlIGluZGV4IGl0IG1hdGNoZXMuCi0gICAgIAotICAgICBGSVhNRTogU2hvdWxkIHdlIGFsdGVyIHRoZSBzdF9zaG5keCBmaWVsZCBhcyB3ZWxsID8gICovCi0gIAotICBpZiAoaW5kZXggPCBlbGZfZWxmaGVhZGVyKGFiZmQpWzBdLmVfc2hudW0pCi0gICAgc3dpdGNoIChlbGZfZWxmc2VjdGlvbnMoYWJmZClbaW5kZXhdLT5zaF90eXBlKQotICAgICAgewotICAgICAgY2FzZSBTSFRfVjg1MF9TQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfVENPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1RDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIFNIVF9WODUwX1pDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9aQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLSAgCi0gIHN3aXRjaCAoaW5kZXgpCi0gICAgewotICAgIGNhc2UgU0hOX1Y4NTBfU0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSE5fVjg1MF9UQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGNvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNITl9WODUwX1pDT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi56Y29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qQVJHU0lHTk9SRUQqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBuYW1lLCBzeW0sIGlucHV0X3NlYykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIG5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBzeW07Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjOwotewotICAvKiBJZiB3ZSBzZWUgYSBjb21tb24gc3ltYm9sLCB3aGljaCBpbXBsaWVzIGEgcmVsb2NhdGFibGUgbGluaywgdGhlbgotICAgICBpZiBhIHN5bWJvbCB3YXMgaW4gYSBzcGVjaWFsIGNvbW1vbiBzZWN0aW9uIGluIGFuIGlucHV0IGZpbGUsIG1hcmsKLSAgICAgaXQgYXMgYSBzcGVjaWFsIGNvbW1vbiBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAKLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIuc2NvbW1vbiIpID09IDApCi0Jc3ltLT5zdF9zaG5keCA9IFNITl9WODUwX1NDT01NT047Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi50Y29tbW9uIikgPT0gMCkKLQlzeW0tPnN0X3NobmR4ID0gU0hOX1Y4NTBfVENPTU1PTjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnpjb21tb24iKSA9PSAwKQotCXN5bS0+c3Rfc2huZHggPSBTSE5fVjg1MF9aQ09NTU9OOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKiBoZHI7Ci0gICAgIGNoYXIgKiAgICAgICAgICAgICAgbmFtZTsKLXsKLSAgLyogVGhlcmUgb3VnaHQgdG8gYmUgYSBwbGFjZSB0byBrZWVwIEVMRiBiYWNrZW5kIHNwZWNpZmljIGZsYWdzLCBidXQKLSAgICAgYXQgdGhlIG1vbWVudCB0aGVyZSBpc24ndCBvbmUuICBXZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIHNlY3Rpb25zIGJ5IHRoZWlyIG5hbWUsIGluc3RlYWQuICAqLwotCi0gIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9WODUwX1NDT01NT046Ci0gICAgY2FzZSBTSFRfVjg1MF9UQ09NTU9OOgotICAgIGNhc2UgU0hUX1Y4NTBfWkNPTU1PTjoKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwKLQkJCQkgICAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCQkJCSAgIGhkci0+YmZkX3NlY3Rpb24pCi0JCQkJICAgIHwgU0VDX0lTX0NPTU1PTikpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhIFY4NTAgRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQotICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBoZHIsIHNlYykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgIHNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqIG5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX1Y4NTBfU0NPTU1PTjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi50Y29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfVjg1MF9UQ09NTU9OOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnpjb21tb24iKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9WODUwX1pDT01NT047Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQkJYmZkX2VsZjMyX3Y4NTBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJCSJlbGYzMi12ODUwIgotI2RlZmluZSBFTEZfQVJDSAkJCQliZmRfYXJjaF92ODUwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCQlFTV9DWUdOVVNfVjg1MAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkJMHgxMDAwCi0JCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkJdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCXY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCQl2ODUwX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICAJdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJCXY4NTBfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgCXY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIAl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCXY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIAl2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkJdjg1MF9lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgdjg1MF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICB2ODUwX2VsZl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQl2ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCXY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCXY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQl2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIJCQknXycKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLmMgYi9iZmQvZWxmMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyMjk2OS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIEVMRiAzMi1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRQkJMzIKLQotCi0jaW5jbHVkZSAiZWxmY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LWFscGhhLmMgYi9iZmQvZWxmNjQtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkOGYwZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MDYgKzAsMCBAQAotLyogQWxwaGEgc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdlIG5lZWQgYSBwdWJsaXNoZWQgQUJJIHNwZWMgZm9yIHRoaXMuICBVbnRpbCBvbmUgY29tZXMgb3V0LCBkb24ndAotICAgYXNzdW1lIHRoaXMnbGwgcmVtYWluIHVuY2hhbmdlZCBmb3JldmVyLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2luY2x1ZGUgImVsZi9hbHBoYS5oIgotCi0jZGVmaW5lIEFMUEhBRUNPRkYKLQotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBOZWVkZWQgZm9yIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gKi8KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImNvZmYvYWxwaGEuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0jZGVmaW5lIEVDT0ZGXzY0Ci0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICogZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogZWxmNjRfYWxwaGFfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TKChiZmQgKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX3JlbG9jX25pbAotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9yZWxvY19iYWQKLSAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwCi0gIFBBUkFNUygoYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwCi0gIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUygoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfaW5mb190b19ob3d0bwotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIEVsZjY0X0ludGVybmFsX1JlbGEgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9vYmplY3RfcAotICBQQVJBTVMoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMoKGJmZCAqLCBFbGY2NF9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBFbGY2NF9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbgotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbwotICBQQVJBTVMoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUygoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cwotICBQQVJBTVMoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfbWVyZ2VfZ290cwotICBQQVJBTVMoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzCi0gIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqc2VjLAotCSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUygoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluYWxfbGluawotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9tZXJnZV9pbmRfc3ltYm9scwotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIEVsZl9JbnRlcm5hbF9SZWxhICogZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMKLSAgUEFSQU1TICgoRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSwgaW50KSk7Ci0KLQwKLXN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogRXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgRVhUUiBlc3ltOwotCi0gIC8qIEN1bXVsYXRpdmUgZmxhZ3MgZm9yIGFsbCB0aGUgLmdvdCBlbnRyaWVzLiAgKi8KLSAgaW50IGZsYWdzOwotCi0gIC8qIENvbnRleHRzIChMSVRVU0UpIGluIHdoaWNoIGEgbGl0ZXJhbCB3YXMgcmVmZXJlbmNlZC4gICovCi0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQUREUiAweDAxCi0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfTUVNICAweDAyCi0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQllURSAweDA0Ci0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQyAweDA4Ci0KLSAgLyogVXNlZCB0byBpbXBsZW1lbnQgbXVsdGlwbGUgLmdvdCBzdWJzZWN0aW9ucy4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5Ci0gIHsKLSAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqbmV4dDsKLQotICAgIC8qIHdoaWNoIC5nb3Qgc3Vic2VjdGlvbj8gICovCi0gICAgYmZkICpnb3RvYmo7Ci0KLSAgICAvKiB0aGUgYWRkZW5kIGluIGVmZmVjdCBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAvKiB0aGUgLmdvdCBvZmZzZXQgZm9yIHRoaXMgZW50cnkuICAqLwotICAgIGludCBnb3Rfb2Zmc2V0OwotCi0gICAgaW50IGZsYWdzOwotCi0gICAgLyogQW4gYWRkaXRpb25hbCBmbGFnLiAgKi8KLSNkZWZpbmUgQUxQSEFfRUxGX0dPVF9FTlRSWV9SRUxPQ1NfRE9ORSAweDEwCi0KLSAgICBpbnQgdXNlX2NvdW50OwotICB9ICpnb3RfZW50cmllczsKLQotICAvKiB1c2VkIHRvIGNvdW50IG5vbi1nb3QsIG5vbi1wbHQgcmVsb2NhdGlvbnMgZm9yIGRlbGF5ZWQgc2l6aW5nCi0gICAgIG9mIHJlbG9jYXRpb24gc2VjdGlvbnMuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5Ci0gIHsKLSAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpuZXh0OwotCi0gICAgLyogd2hpY2ggLnJlbG9jIHNlY3Rpb24/ICovCi0gICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAvKiB3aGF0IGtpbmQgb2YgcmVsb2NhdGlvbj8gKi8KLSAgICB1bnNpZ25lZCBsb25nIHJ0eXBlOwotCi0gICAgLyogaG93IG1hbnkgZGlkIHdlIGZpbmQ/ICAqLwotICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci0gIH0gKnJlbG9jX2VudHJpZXM7Ci19OwotCi0vKiBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSBoZWFkIG9mIGEgbGlzdCBvZiAuZ290IHN1YnNlY3Rpb25zIGxpbmtlZCB0aHJvdWdoCi0gICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+Z290X2xpbmtfbmV4dC4gICovCi0gIGJmZCAqZ290X2xpc3Q7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogR2V0IHRoZSBvYmplY3QncyBzeW1ib2xzIGFzIG91ciBvd24gZW50cnkgdHlwZS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWxmX3N5bV9oYXNoZXMoYWJmZCkgXAotICAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICoqKWVsZl9zeW1faGFzaGVzKGFiZmQpKQotCi0vKiBTaG91bGQgd2UgZG8gZHluYW1pYyB0aGluZ3MgdG8gdGhpcyBzeW1ib2w/ICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKGgsIGluZm8pIAkJCQlcCi0gICgoKChpbmZvKS0+c2hhcmVkICYmICEoaW5mbyktPnN5bWJvbGljKQkJCQlcCi0gICAgfHwgKCgoaCktPmVsZl9saW5rX2hhc2hfZmxhZ3MJCQkJCVwKLQkgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKQlcCi0gICAgICAgID09IChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpCVwKLSAgICB8fCAoaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawkJCVwKLSAgICB8fCAoaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCQkJCVwKLSAgICYmIChoKS0+ZHluaW5keCAhPSAtMSkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgbWVtc2V0ICgmcmV0LT5lc3ltLCAwLCBzaXplb2YgKEVYVFIpKTsKLSAgICAgIC8qIFdlIHVzZSAtMiBhcyBhIG1hcmtlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBoYXMKLQkgbm90IGJlZW4gc2V0LiAgLTEgbWVhbnMgdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBpZmQuICAqLwotICAgICAgcmV0LT5lc3ltLmlmZCA9IC0yOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgICByZXQtPmdvdF9lbnRyaWVzID0gTlVMTDsKLSAgICAgIHJldC0+cmVsb2NfZW50cmllcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZjY0X2FscGhhX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQwKLS8qIFdlIGhhdmUgc29tZSBwcml2YXRlIGZpZWxkcyBoYW5naW5nIG9mZiBvZiB0aGUgZWxmX3RkYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhCi17Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhIHJvb3Q7Ci0KLSAgLyogRm9yIGV2ZXJ5IGlucHV0IGZpbGUsIHRoZXNlIGFyZSB0aGUgZ290IGVudHJpZXMgZm9yIHRoYXQgb2JqZWN0J3MKLSAgICAgbG9jYWwgc3ltYm9scy4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqIGxvY2FsX2dvdF9lbnRyaWVzOwotCi0gIC8qIEZvciBldmVyeSBpbnB1dCBmaWxlLCB0aGlzIGlzIHRoZSBvYmplY3QgdGhhdCBvd25zIHRoZSBnb3QgdGhhdAotICAgICB0aGlzIGlucHV0IGZpbGUgdXNlcy4gICovCi0gIGJmZCAqZ290b2JqOwotCi0gIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgYSBsaW5rZWQgbGlzdCB0aHJvdWdoIHRoZSBvYmplY3RzIHVzaW5nIHRoaXMgZ290ICovCi0gIGJmZCAqaW5fZ290X2xpbmtfbmV4dDsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIGEgbGluayB0byB0aGUgbmV4dCBnb3Qgc3Vic2VnbWVudC4gICovCi0gIGJmZCAqZ290X2xpbmtfbmV4dDsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIHRoZSBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKmdvdDsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIGl0J3MgdG90YWwgbnVtYmVyIG9mICplbnRyaWVzKi4gICovCi0gIGludCB0b3RhbF9nb3RfZW50cmllczsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlciBvZiAqZW50cmllcyogcmVxdWlyZWQKLSAgICAgdG8gaG9sZCBhbGwgb2YgdGhlIG1lbWJlciBvYmplY3QncyBsb2NhbCBnb3QuICAqLwotICBpbnQgbl9sb2NhbF9nb3RfZW50cmllczsKLX07Ci0KLSNkZWZpbmUgYWxwaGFfZWxmX3RkYXRhKGFiZmQpIFwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSAqKSAoYWJmZCktPnRkYXRhLmFueSkKLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmFueSA9IGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmFueSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBBbGxvY2F0ZSBvdXIgc3BlY2lhbCB0YXJnZXQgZGF0YS4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhICpuZXdfdGRhdGE7Ci0gIG5ld190ZGF0YSA9IGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEpKTsKLSAgaWYgKG5ld190ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3X3RkYXRhLT5yb290ID0gKmFiZmQtPnRkYXRhLmVsZl9vYmpfZGF0YTsKLSAgYWJmZC0+dGRhdGEuYW55ID0gbmV3X3RkYXRhOwotCi0gIC8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGFuIEFscGhhIEVMRiBmaWxlLiAgKi8KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FscGhhLCAwKTsKLX0KLQwKLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGY2NF9hbHBoYV9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKFJfQUxQSEFfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX25pbCwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMT05HIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfUkVGUVVBRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0Ci0gICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKLSAgICAgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIGZvciBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlZmVycyB0byBtZW1vcnkgb2ZmIHRoZSBHUCByZWdpc3Rlci4gICovCi0gIEhPV1RPIChSX0FMUEhBX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkVMRl9MSVRFUkFMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhbiBFTEZfTElURVJBTCByZWxvYy4KLSAgICAgSXQgaWRlbnRpZmllcyBhIHVzZSBvZiB0aGUgbGl0ZXJhbC4gIFRoZSBzeW1ib2wgaW5kZXggaXMgc3BlY2lhbDoKLSAgICAgMSBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSBiYXNlIHJlZ2lzdGVyIG9mIGEgbWVtb3J5Ci0gICAgIGZvcm1hdCBpbnN0cnVjdGlvbjsgMiBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSBieXRlCi0gICAgIG9mZnNldCByZWdpc3RlciBvZiBhIGJ5dGUtbWFuaXB1bGF0aW9uIGluc3RydWN0aW9uOyAzIG1lYW5zIHRoZQotICAgICBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIHRhcmdldCByZWdpc3RlciBvZiBhIGpzciBpbnN0cnVjdGlvbi4KLSAgICAgVGhpcyBkb2VzIG5vdCBhY3R1YWxseSBkbyBhbnkgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0FMUEhBX0xJVFVTRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19uaWwsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgR1BESVNQIGluc3RydWN0aW9uIGlzIGFuIG9mZnNldCBpbiBieXRlcyB0byB0aGUgbGRhCi0gICAgIGluc3RydWN0aW9uIHRoYXQgbG9hZHMgdGhlIGxvd2VyIDE2IGJpdHMuICBUaGUgdmFsdWUgdG8gdXNlIGZvcgotICAgICB0aGUgcmVsb2NhdGlvbiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlCi0gICAgIGN1cnJlbnQgbG9jYXRpb247IHRoZSBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyCi0gICAgIGhvbGRpbmcgdGhlIGN1cnJlbnQgYWRkcmVzcy4KLQotICAgICBOT1RFOiBVbmxpa2UgRUNPRkYsIHBhcnRpYWwgaW4tcGxhY2UgcmVsb2NhdGlvbiBpcyBub3QgZG9uZS4gIElmCi0gICAgIGFueSBvZmZzZXQgaXMgcHJlc2VudCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLCBpdCBpcyBhbiBvZmZzZXQgZnJvbQotICAgICB0aGUgcmVnaXN0ZXIgdG8gdGhlIGxkYWggaW5zdHJ1Y3Rpb24uICBUaGlzIGxldHMgdXMgYXZvaWQgYW55Ci0gICAgIHN0dXBpZCBoYWNrZXJ5IGxpa2UgaW52ZW50aW5nIGEgZ3AgdmFsdWUgdG8gZG8gcGFydGlhbCByZWxvY2F0aW9uCi0gICAgIGFnYWluc3QuICBBbHNvIHVubGlrZSBFQ09GRiwgd2UgZG8gdGhlIHdob2xlIHJlbG9jYXRpb24gb2ZmIG9mCi0gICAgIHRoZSBHUERJU1AgcmF0aGVyIHRoYW4gYSBHUERJU1BfSEkxNi9HUERJU1BfTE8xNiBwYWlyLiAgQW4gb2RkLAotICAgICBzcGFjZSBjb25zdW1pbmcgYml0LCB0aGF0LCBzaW5jZSBhbGwgdGhlIGluZm9ybWF0aW9uIHdhcyBwcmVzZW50Ci0gICAgIGluIHRoZSBHUERJU1BfSEkxNiByZWxvYy4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUERJU1AiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyMSBiaXQgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfQlJBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkJSQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChSX0FMUEhBX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJISU5UIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9TUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9TUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfU1JFTDY0LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUw2NCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFVTSCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAgU3RvcmUgaXQgaW4KLSAgICAgYSBiaXRmaWVsZCBvZiBzaXplIHJfc2l6ZSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gcl9vZmZzZXQuICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN1YnRyYWN0IHRoZSByZWxvYyBhZGRyZXNzIGZyb20gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gc3RhY2suICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFNVQiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHJlbG9jYXRpb24gc3RhY2sgcmlnaHQgYnkgdGhlCi0gICAgIGdpdmVuIHZhbHVlLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BSU0hJRlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIENoYW5nZSB0aGUgdmFsdWUgb2YgR1AgdXNlZCBieSArcl9hZGRlbmQgdW50aWwgdGhlIG5leHQgR1BWQUxVRSBvciB0aGUKLSAgICAgZW5kIG9mIHRoZSBpbnB1dCBiZmQuICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BWQUxVRSwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQVkFMVUUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIDE2IGJpdHMgb2YgdGhlIGRpc3BsYWNlbWVudCBmcm9tIEdQIHRvIHRoZSB0YXJnZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUFJFTEhJR0gsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTEhJR0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBkaXNwbGFjZW1lbnQgZnJvbSBHUCB0byB0aGUgdGFyZ2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BSRUxMT1csCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUxMT1ciLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNi1iaXQgZGlzcGxhY2VtZW50IGZyb20gdGhlIEdQIHRvIHRoZSB0YXJnZXQuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0dQXzE2LAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NRURfR1BfMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggYml0cyBvZiBhIDMyLWJpdCBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgR1AgdG8gdGhlIHRhcmdldDsgdGhlCi0gICAgIGxvdyBiaXRzIGFyZSBzdXBwbGllZCBpbiB0aGUgc3Vic2VxdWVudCBSX0FMUEhBX0lNTUVEX0xPMzIgcmVsb2NzLiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9HUF9ISTMyLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NRURfR1BfSEkzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggYml0cyBvZiBhIDMyLWJpdCBkaXNwbGFjZW1lbnQgdG8gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlCi0gICAgIGN1cnJlbnQgc2VjdGlvbiAodGhlIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGlnbm9yZWQpOyB0aGUgbG93IGJpdHMgYXJlIAotICAgICBzdXBwbGllZCBpbiB0aGUgc3Vic2VxdWVudCBSX0FMUEhBX0lNTUVEX0xPMzIgcmVsb2NzLiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9TQ05fSEkzMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX1NDTl9ISTMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBiaXRzIG9mIGEgMzItYml0IGRpc3BsYWNlbWVudCBmcm9tIHRoZSBwcmV2aW91cyBiciwgYnNyLCBqc3IKLSAgICAgb3Igam1wIGluc24gKGFzIHRhZ2dlZCBieSBhIEJSQUREUiBvciBISU5UIHJlbG9jKSB0byB0aGUgdGFyZ2V0OyB0aGUKLSAgICAgbG93IGJpdHMgYXJlIHN1cHBsaWVkIGJ5IHN1YnNlcXVlbnQgUl9BTFBIQV9JTU1FRF9MTzMyIHJlbG9jcy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfQlJfSEkzMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0JSX0hJMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBsb3cgMTYgYml0cyBvZiBhIGRpc3BsYWNlbWVudCBjYWxjdWxhdGVkIGluIGEgcHJldmlvdXMgSEkzMiByZWxvYy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfTE8zMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0xPMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE1pc2MgRUxGIHJlbG9jYXRpb25zLiAqLwotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIHRvIGNvcHkgdGhlIHRhcmdldCBpbnRvIG91ciAuZHluYnNzIHNlY3Rpb24uICAqLwotICAvKiBOb3QgZ2VuZXJhdGVkLCBhcyBhbGwgQWxwaGEgb2JqZWN0cyB1c2UgUElDLCBzbyBpdCBpcyBub3QgbmVlZGVkLiAgSXQKLSAgICAgaXMgcHJlc2VudCBiZWNhdXNlIGV2ZXJ5IG90aGVyIEVMRiBoYXMgb25lLCBidXQgc2hvdWxkIG5vdCBiZSB1c2VkCi0gICAgIGJlY2F1c2UgLmR5bmJzcyBpcyBhbiB1Z2x5IHRoaW5nLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfQ09QWSwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIkNPUFkiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSksCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gZm9yIGEgLmdvdCBlbnRyeS4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dMT0JfREFULAotCSAwLAotCSAwLAotCSAwLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiR0xPQl9EQVQiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSksCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gZm9yIGEgLnBsdCBlbnRyeS4gICovCi0gIEhPV1RPIChSX0FMUEhBX0pNUF9TTE9ULAotCSAwLAotCSAwLAotCSAwLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiSk1QX1NMT1QiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSksCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gdG8gYWRkIHRoZSBiYXNlIG9mIHRoZSBEU08gdG8gYSA2NC1iaXQgZmllbGQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9SRUxBVElWRSwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJFTEFUSVZFIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpCi19OwotCi0vKiBBIHJlbG9jYXRpb24gZnVuY3Rpb24gd2hpY2ggZG9lc24ndCBkbyBhbnl0aGluZy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX3JlbG9jX25pbCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICByZWxvYy0+YWRkcmVzcyArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEEgcmVsb2NhdGlvbiBmdW5jdGlvbiB1c2VkIGZvciBhbiB1bnN1cHBvcnRlZCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX3JlbG9jX2JhZCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICByZWxvYy0+YWRkcmVzcyArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0vKiBEbyB0aGUgd29yayBvZiB0aGUgR1BESVNQIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGFiZmQsIGdwZGlzcCwgcF9sZGFoLCBwX2xkYSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIGdwZGlzcDsKLSAgICAgYmZkX2J5dGUgKnBfbGRhaDsKLSAgICAgYmZkX2J5dGUgKnBfbGRhOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0ID0gYmZkX3JlbG9jX29rOwotICBiZmRfdm1hIGFkZGVuZDsKLSAgdW5zaWduZWQgbG9uZyBpX2xkYWgsIGlfbGRhOwotCi0gIGlfbGRhaCA9IGJmZF9nZXRfMzIgKGFiZmQsIHBfbGRhaCk7Ci0gIGlfbGRhID0gYmZkX2dldF8zMiAoYWJmZCwgcF9sZGEpOwotCi0gIC8qIENvbXBsYWluIGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBjb3JyZWN0LiAgKi8KLSAgaWYgKCgoaV9sZGFoID4+IDI2KSAmIDB4M2YpICE9IDB4MDkKLSAgICAgIHx8ICgoaV9sZGEgPj4gMjYpICYgMHgzZikgIT0gMHgwOCkKLSAgICByZXQgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCi0gIC8qIEV4dHJhY3QgdGhlIHVzZXItc3VwcGxpZWQgb2Zmc2V0LCBtaXJyb3JpbmcgdGhlIHNpZ24gZXh0ZW5zaW9ucwotICAgICB0aGF0IHRoZSBpbnN0cnVjdGlvbnMgcGVyZm9ybS4gICovCi0gIGFkZGVuZCA9ICgoaV9sZGFoICYgMHhmZmZmKSA8PCAxNikgfCAoaV9sZGEgJiAweGZmZmYpOwotICBhZGRlbmQgPSAoYWRkZW5kIF4gMHg4MDAwODAwMCkgLSAweDgwMDA4MDAwOwotCi0gIGdwZGlzcCArPSBhZGRlbmQ7Ci0KLSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgZ3BkaXNwIDwgLShiZmRfc2lnbmVkX3ZtYSkgMHg4MDAwMDAwMAotICAgICAgfHwgKGJmZF9zaWduZWRfdm1hKSBncGRpc3AgPj0gKGJmZF9zaWduZWRfdm1hKSAweDdmZmY4MDAwKQotICAgIHJldCA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBjb21wZW5zYXRlIGZvciB0aGUgc2lnbiBleHRlbnNpb24gYWdhaW4uICAqLwotICBpX2xkYWggPSAoKGlfbGRhaCAmIDB4ZmZmZjAwMDApCi0JICAgIHwgKCgoZ3BkaXNwID4+IDE2KSArICgoZ3BkaXNwID4+IDE1KSAmIDEpKSAmIDB4ZmZmZikpOwotICBpX2xkYSA9IChpX2xkYSAmIDB4ZmZmZjAwMDApIHwgKGdwZGlzcCAmIDB4ZmZmZik7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgaV9sZGFoLCBwX2xkYWgpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpX2xkYSwgcF9sZGEpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBzcGVjaWFsIGZ1bmN0aW9uIGZvciB0aGUgR1BESVNQIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwIChhYmZkLCByZWxvY19lbnRyeSwgc3ltLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICBvdXRwdXRfYmZkLCBlcnJfbXNnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyX21zZzsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSBncCwgcmVsb2NhdGlvbjsKLSAgYmZkX2J5dGUgKnBfbGRhaCwgKnBfbGRhOwotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIG5vdCBkb2luZyBhIGZpbmFsIGxpbmsuICAqLwotICBpZiAob3V0cHV0X2JmZCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplIHx8Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArIHJlbG9jX2VudHJ5LT5hZGRlbmQgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFRoZSBncCB1c2VkIGluIHRoZSBwb3J0aW9uIG9mIHRoZSBvdXRwdXQgb2JqZWN0IHRvIHdoaWNoIHRoaXMKLSAgICAgaW5wdXQgb2JqZWN0IGJlbG9uZ3MgaXMgY2FjaGVkIG9uIHRoZSBpbnB1dCBiZmQuICAqLwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKTsKLQotICByZWxvY2F0aW9uID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHBfbGRhaCA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIHBfbGRhID0gcF9sZGFoICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICByZXQgPSBlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGFiZmQsIGdwIC0gcmVsb2NhdGlvbiwgcF9sZGFoLCBwX2xkYSk7Ci0KLSAgLyogQ29tcGxhaW4gaWYgdGhlIGluc3RydWN0aW9ucyBhcmUgbm90IGNvcnJlY3QuICAqLwotICBpZiAocmV0ID09IGJmZF9yZWxvY19kYW5nZXJvdXMpCi0gICAgKmVycl9tc2cgPSBfKCJHUERJU1AgcmVsb2NhdGlvbiBkaWQgbm90IGZpbmQgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucyIpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBBbHBoYSBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgaW50IGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZl9yZWxvY19tYXAgZWxmNjRfYWxwaGFfcmVsb2NfbWFwW10gPQotewotICB7QkZEX1JFTE9DX05PTkUsCQlSX0FMUEhBX05PTkV9LAotICB7QkZEX1JFTE9DXzMyLAkJUl9BTFBIQV9SRUZMT05HfSwKLSAge0JGRF9SRUxPQ182NCwJCVJfQUxQSEFfUkVGUVVBRH0sCi0gIHtCRkRfUkVMT0NfQ1RPUiwJCVJfQUxQSEFfUkVGUVVBRH0sCi0gIHtCRkRfUkVMT0NfR1BSRUwzMiwJCVJfQUxQSEFfR1BSRUwzMn0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwsCVJfQUxQSEFfTElURVJBTH0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfTElUVVNFLAlSX0FMUEhBX0xJVFVTRX0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfR1BESVNQLAlSX0FMUEhBX0dQRElTUH0sCi0gIHtCRkRfUkVMT0NfMjNfUENSRUxfUzIsCVJfQUxQSEFfQlJBRERSfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9ISU5ULAlSX0FMUEhBX0hJTlR9LAotICB7QkZEX1JFTE9DXzE2X1BDUkVMLAkJUl9BTFBIQV9TUkVMMTZ9LAotICB7QkZEX1JFTE9DXzMyX1BDUkVMLAkJUl9BTFBIQV9TUkVMMzJ9LAotICB7QkZEX1JFTE9DXzY0X1BDUkVMLAkJUl9BTFBIQV9TUkVMNjR9LAotCi0vKiBUaGUgQkZEX1JFTE9DX0FMUEhBX1VTRVJfKiByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHRvIHByb2Nlc3MKLSAgIHRoZSBleHBsaWNpdCAhPHJlbG9jPiFzZXF1ZW5jZSByZWxvY2F0aW9ucywgYW5kIGFyZSBtYXBwZWQgaW50byB0aGUgbm9ybWFsCi0gICByZWxvY2F0aW9ucyBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcuICovCi0gIHtCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMLAlSX0FMUEhBX0xJVEVSQUx9LAotICB7QkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0UsCVJfQUxQSEFfTElUVVNFfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYsCVJfQUxQSEFfTElUVVNFfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1IsCVJfQUxQSEFfTElUVVNFfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0dQRElTUCwJCVJfQUxQSEFfR1BESVNQfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSCwJUl9BTFBIQV9HUFJFTEhJR0h9LAotICB7QkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1csCVJfQUxQSEFfR1BSRUxMT1d9LAotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgdHlwZSwgcmV0dXJuIGEgSE9XVE8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCAqaSwgKmU7Ci0gIGkgPSBlID0gZWxmNjRfYWxwaGFfcmVsb2NfbWFwOwotICBlICs9IHNpemVvZiAoZWxmNjRfYWxwaGFfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOwotICBmb3IgKDsgaSAhPSBlOyArK2kpCi0gICAgewotICAgICAgaWYgKGktPmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZjY0X2FscGhhX2hvd3RvX3RhYmxlW2ktPmVsZl9yZWxvY192YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEdpdmVuIGFuIEFscGhhIEVMRiByZWxvYyB0eXBlLCBmaWxsIGluIGFuIGFyZWxlbnQgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjY0X2FscGhhX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmNjRfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGNjRfUl9UWVBFKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9BTFBIQV9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjY0X2FscGhhX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0MCi0vKiBUaGVzZSBmdW5jdGlvbnMgZG8gcmVsYXhhdGlvbiBmb3IgQWxwaGEgRUxGLiAKLQotICAgQ3VycmVudGx5IEknbSBvbmx5IGhhbmRsaW5nIHdoYXQgSSBjYW4gZG8gd2l0aCBleGlzdGluZyBjb21waWxlcgotICAgYW5kIGFzc2VtYmxlciBzdXBwb3J0LCB3aGljaCBtZWFucyBubyBpbnN0cnVjdGlvbnMgYXJlIHJlbW92ZWQsCi0gICB0aG91Z2ggc29tZSBtYXkgYmUgbm9wcGVkLiAgQXQgdGhpcyB0aW1lIEdDQyBkb2VzIG5vdCBlbWl0IGVub3VnaAotICAgaW5mb3JtYXRpb24gdG8gZG8gYWxsIG9mIHRoZSByZWxheGluZyB0aGF0IGlzIHBvc3NpYmxlLiAgSXQgd2lsbAotICAgdGFrZSBzb21lIG5vdCBzbWFsbCBhbW91bnQgb2Ygd29yayBmb3IgdGhhdCB0byBoYXBwZW4uCi0KLSAgIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBpbnRlcmVzdGluZyBwYXBlcnMgdGhhdCBJIG9uY2UgcmVhZCBvbiB0aGlzCi0gICBzdWJqZWN0LCB0aGF0IEkgY2Fubm90IGZpbmQgcmVmZXJlbmNlcyB0byBhdCB0aGUgbW9tZW50LCB0aGF0Ci0gICByZWxhdGVkIHRvIEFscGhhIGluIHBhcnRpY3VsYXIuICBUaGV5IGFyZSBieSBEYXZpZCBXYWxsLCB0aGVuIG9mCi0gICBERUMgV1JMLiAgKi8KLQotI2RlZmluZSBPUF9MREEJCTB4MDgKLSNkZWZpbmUgT1BfTERBSAkJMHgwOQotI2RlZmluZSBJTlNOX0pTUgkweDY4MDA0MDAwCi0jZGVmaW5lIElOU05fSlNSX01BU0sJMHhmYzAwYzAwMAotI2RlZmluZSBPUF9MRFEJCTB4MjkKLSNkZWZpbmUgT1BfQlIJCTB4MzAKLSNkZWZpbmUgT1BfQlNSCQkweDM0Ci0jZGVmaW5lIElOU05fVU5PUAkweDJmZTAwMDAwCi0KLXN0cnVjdCBhbHBoYV9yZWxheF9pbmZvCi17Ci0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzLCAqcmVsZW5kOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICBib29sZWFuIGNoYW5nZWRfY29udGVudHM7Ci0gIGJvb2xlYW4gY2hhbmdlZF9yZWxvY3M7Ci0gIGJmZF92bWEgZ3A7Ci0gIGJmZCAqZ290b2JqOwotICBhc2VjdGlvbiAqdHNlYzsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0gIHVuc2lnbmVkIGNoYXIgb3RoZXI7Ci19OwotCi1zdGF0aWMgRWxmX0ludGVybmFsX1JlbGEgKiBlbGY2NF9hbHBoYV9yZWxheF93aXRoX2xpdHVzZQotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvLCBiZmRfdm1hIHN5bXZhbCwgCi0gICAgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsZW5kKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlbGF4X3dpdGhvdXRfbGl0dXNlCi0gIFBBUkFNUygoc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm8sIGJmZF92bWEgc3ltdmFsLCAKLSAgICAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCkpOwotCi1zdGF0aWMgYmZkX3ZtYSBlbGY2NF9hbHBoYV9yZWxheF9vcHRfY2FsbAotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvLCBiZmRfdm1hIHN5bXZhbCkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgYm9vbGVhbiAqYWdhaW4pKTsKLQotc3RhdGljIEVsZl9JbnRlcm5hbF9SZWxhICoKLWVsZjY0X2FscGhhX2ZpbmRfcmVsb2NfYXRfb2ZzIChyZWwsIHJlbGVuZCwgb2Zmc2V0LCB0eXBlKQotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIHdoaWxlIChyZWwgPCByZWxlbmQpCi0gICAgewotICAgICAgaWYgKHJlbC0+cl9vZmZzZXQgPT0gb2Zmc2V0ICYmIEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pID09IHR5cGUpCi0JcmV0dXJuIHJlbDsKLSAgICAgICsrcmVsOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfUmVsYSAqCi1lbGY2NF9hbHBoYV9yZWxheF93aXRoX2xpdHVzZSAoaW5mbywgc3ltdmFsLCBpcmVsLCBpcmVsZW5kKQotICAgICBzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBzeW12YWw7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnVyZWw7Ci0gIGludCBmbGFncywgY291bnQsIGk7Ci0gIGJmZF9zaWduZWRfdm1hIGRpc3A7Ci0gIGJvb2xlYW4gZml0czE2OwotICBib29sZWFuIGZpdHMzMjsKLSAgYm9vbGVhbiBsaXRfcmV1c2VkID0gZmFsc2U7Ci0gIGJvb2xlYW4gYWxsX29wdGltaXplZCA9IHRydWU7Ci0gIHVuc2lnbmVkIGludCBsaXRfaW5zbjsKLQotICBsaXRfaW5zbiA9IGJmZF9nZXRfMzIgKGluZm8tPmFiZmQsIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotICBpZiAobGl0X2luc24gPj4gMjYgIT0gT1BfTERRKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoIiVzOiAlcysweCVseDogd2FybmluZzogTElURVJBTCByZWxvY2F0aW9uIGFnYWluc3QgdW5leHBlY3RlZCBpbnNuIiwKLQliZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgaW5mby0+c2VjLT5uYW1lLAotCSh1bnNpZ25lZCBsb25nKWlyZWwtPnJfb2Zmc2V0KSk7Ci0gICAgICByZXR1cm4gaXJlbDsKLSAgICB9Ci0KLSAgLyogU3VtbWFyaXplIGhvdyB0aGlzIHBhcnRpY3VsYXIgTElURVJBTCBpcyB1c2VkLiAgKi8KLSAgZm9yICh1cmVsID0gaXJlbCsxLCBmbGFncyA9IGNvdW50ID0gMDsgdXJlbCA8IGlyZWxlbmQ7ICsrdXJlbCwgKytjb3VudCkKLSAgICB7Ci0gICAgICBpZiAoRUxGNjRfUl9UWVBFICh1cmVsLT5yX2luZm8pICE9IFJfQUxQSEFfTElUVVNFKQotCWJyZWFrOwotICAgICAgaWYgKHVyZWwtPnJfYWRkZW5kID49IDAgJiYgdXJlbC0+cl9hZGRlbmQgPD0gMykKLQlmbGFncyB8PSAxIDw8IHVyZWwtPnJfYWRkZW5kOwotICAgIH0KLQotICAvKiBBIGxpdHRsZSBwcmVwYXJhdGlvbiBmb3IgdGhlIGxvb3AuLi4gKi8KLSAgZGlzcCA9IHN5bXZhbCAtIGluZm8tPmdwOwotICBmaXRzMTYgPSAoZGlzcCA+PSAtKGJmZF9zaWduZWRfdm1hKTB4ODAwMCAmJiBkaXNwIDwgMHg4MDAwKTsKLSAgZml0czMyID0gKGRpc3AgPj0gLShiZmRfc2lnbmVkX3ZtYSkweDgwMDAwMDAwICYmIGRpc3AgPCAweDdmZmY4MDAwKTsKLQotICBmb3IgKHVyZWwgPSBpcmVsKzEsIGkgPSAwOyBpIDwgY291bnQ7ICsraSwgKyt1cmVsKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGluZm8tPmFiZmQsIGluZm8tPmNvbnRlbnRzICsgdXJlbC0+cl9vZmZzZXQpOwotCi0gICAgICBzd2l0Y2ggKHVyZWwtPnJfYWRkZW5kKQotCXsKLQlkZWZhdWx0OiAvKiAwID0gQUREUkVTUyBGT1JNQVQgKi8KLQkgIC8qIFRoaXMgdHlwZSBpcyByZWFsbHkganVzdCBhIHBsYWNlaG9sZGVyIHRvIG5vdGUgdGhhdCBhbGwKLQkgICAgIHVzZXMgY2Fubm90IGJlIG9wdGltaXplZCwgYnV0IHRvIHN0aWxsIGFsbG93IHNvbWUuICAqLwotCSAgYWxsX29wdGltaXplZCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIDE6IC8qIE1FTSBGT1JNQVQgKi8KLQkgIC8qIFdlIGNhbiBhbHdheXMgb3B0aW1pemUgMTYtYml0IGRpc3BsYWNlbWVudHMuICAqLwotCSAgaWYgKGZpdHMxNikKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBzYW5pdHkgY2hlY2sgdGhlIGluc24gZm9yIG1lbSBmb3JtYXQgd2l0aAotCQkgemVybyBhZGRlbmQuICAqLwotCi0JICAgICAgLyogVGFrZSB0aGUgb3AgY29kZSBhbmQgZGVzdCBmcm9tIHRoaXMgaW5zbiwgdGFrZSB0aGUgYmFzZSAKLQkJIHJlZ2lzdGVyIGZyb20gdGhlIGxpdGVyYWwgaW5zbi4gIExlYXZlIHRoZSBvZmZzZXQgYWxvbmUuICAqLwotCSAgICAgIGluc24gPSAoaW5zbiAmIDB4ZmZlMDAwMDApIHwgKGxpdF9pbnNuICYgMHgwMDFmMDAwMCk7Ci0JICAgICAgdXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9BTFBIQV9HUFJFTExPVyk7Ci0JICAgICAgdXJlbC0+cl9hZGRlbmQgPSBpcmVsLT5yX2FkZGVuZDsKLQkgICAgICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0KLQkgICAgICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBpbnNuLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQkgICAgfQotCi0JICAvKiBJZiBhbGwgbWVtK2J5dGUsIHdlIGNhbiBvcHRpbWl6ZSAzMi1iaXQgbWVtIGRpc3BsYWNlbWVudHMuICAqLwotCSAgZWxzZSBpZiAoZml0czMyICYmICEoZmxhZ3MgJiB+NikpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogc2FuaXR5IGNoZWNrIHRoYXQgbGl0IGluc24gUmEgaXMgbWVtIGluc24gUmIsIGFuZAotCQkgdGhhdCBtZW1faW5zbiBkaXNwIGlzIHplcm8uICAqLwotCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9BTFBIQV9HUFJFTEhJR0gpOwotCSAgICAgIGxpdF9pbnNuID0gKE9QX0xEQUggPDwgMjYpIHwgKGxpdF9pbnNuICYgMHgwM2ZmMDAwMCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgbGl0X2luc24sCi0JCQkgIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGxpdF9yZXVzZWQgPSB0cnVlOwotCSAgICAgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCi0JICAgICAgdXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9BTFBIQV9HUFJFTExPVyk7Ci0JICAgICAgdXJlbC0+cl9hZGRlbmQgPSBpcmVsLT5yX2FkZGVuZDsKLQkgICAgICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYWxsX29wdGltaXplZCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIDI6IC8qIEJZVEUgT0ZGU0VUIEZPUk1BVCAqLwotCSAgLyogV2UgY2FuIGFsd2F5cyBvcHRpbWl6ZSBieXRlIGluc3RydWN0aW9ucy4gICovCi0KLQkgIC8qIEZJWE1FOiBzYW5pdHkgY2hlY2sgdGhlIGluc24gZm9yIGJ5dGUgb3AuICBDaGVjayB0aGF0IHRoZQotCSAgICAgbGl0ZXJhbCBkZXN0IHJlZyBpcyBpbmRlZWQgUmIgaW4gdGhlIGJ5dGUgaW5zbi4gICovCi0KLQkgIGluc24gPSAoaW5zbiAmIH4weDAwMWZmMDAwKSB8ICgoc3ltdmFsICYgNykgPDwgMTMpIHwgMHgxMDAwOwotCi0JICB1cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfQUxQSEFfTk9ORSk7Ci0JICB1cmVsLT5yX2FkZGVuZCA9IDA7Ci0JICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0KLQkgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgdXJlbC0+cl9vZmZzZXQpOwotCSAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgMzogLyogQ0FMTCBGT1JNQVQgKi8KLQkgIHsKLQkgICAgLyogSWYgbm90IHplcm8sIHBsYWNlIHRvIGp1bXAgd2l0aG91dCBuZWVkaW5nIHB2LiAgKi8KLQkgICAgYmZkX3ZtYSBvcHRkZXN0ID0gZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwgKGluZm8sIHN5bXZhbCk7Ci0JICAgIGJmZF92bWEgb3JnID0gKGluZm8tPnNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbmZvLT5zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgdXJlbC0+cl9vZmZzZXQgKyA0KTsKLQkgICAgYmZkX3NpZ25lZF92bWEgb2Rpc3A7Ci0KLQkgICAgb2Rpc3AgPSAob3B0ZGVzdCA/IG9wdGRlc3QgOiBzeW12YWwpIC0gb3JnOwotCSAgICBpZiAob2Rpc3AgPj0gLTB4NDAwMDAwICYmIG9kaXNwIDwgMHg0MDAwMDApCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfUmVsYSAqeHJlbDsKLQotCQkvKiBQcmVzZXJ2ZSBicmFuY2ggcHJlZGljdGlvbiBjYWxsIHN0YWNrIHdoZW4gcG9zc2libGUuICovCi0JCWlmICgoaW5zbiAmIElOU05fSlNSX01BU0spID09IElOU05fSlNSKQotCQkgIGluc24gPSAoT1BfQlNSIDw8IDI2KSB8IChpbnNuICYgMHgwM2UwMDAwMCk7Ci0JCWVsc2UKLQkJICBpbnNuID0gKE9QX0JSIDw8IDI2KSB8IChpbnNuICYgMHgwM2UwMDAwMCk7Ci0JCSAgCi0JCXVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgUl9BTFBIQV9CUkFERFIpOwotCQl1cmVsLT5yX2FkZGVuZCA9IGlyZWwtPnJfYWRkZW5kOwotCi0JCWlmIChvcHRkZXN0KQotCQkgIHVyZWwtPnJfYWRkZW5kICs9IG9wdGRlc3QgLSBzeW12YWw7Ci0JCWVsc2UKLQkJICBhbGxfb3B0aW1pemVkID0gZmFsc2U7Ci0KLQkJYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgaW5zbiwgaW5mby0+Y29udGVudHMgKyB1cmVsLT5yX29mZnNldCk7Ci0KLQkJLyogS2lsbCBhbnkgSElOVCByZWxvYyB0aGF0IG1pZ2h0IGV4aXN0IGZvciB0aGlzIGluc24uICAqLwotCQl4cmVsID0gKGVsZjY0X2FscGhhX2ZpbmRfcmVsb2NfYXRfb2ZzCi0JCQkoaW5mby0+cmVsb2NzLCBpbmZvLT5yZWxlbmQsIHVyZWwtPnJfb2Zmc2V0LCAKLQkJCSBSX0FMUEhBX0hJTlQpKTsKLQkJaWYgKHhyZWwpCi0JCSAgeHJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX0FMUEhBX05PTkUpOwotCi0JCWluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCQlpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgYWxsX29wdGltaXplZCA9IGZhbHNlOwotCi0JICAgIC8qID8/PyBJZiB0YXJnZXQgZ3AgPT0gY3VycmVudCBncCB3ZSBjYW4gZWxpbWluYXRlIHRoZSBncCByZWxvYWQuCi0JICAgICAgIFRoaXMgZG9lcyBkZXBlbmQgb24gZXZlcnkgcGxhY2UgYSBncCBjb3VsZCBiZSByZWxvYWRlZCB3aWxsCi0JICAgICAgIGJlLCB3aGljaCBjdXJyZW50bHkgaGFwcGVucyBmb3IgYWxsIGNvZGUgcHJvZHVjZWQgYnkgZ2NjLCBidXQKLQkgICAgICAgbm90IG5lY2Vzc2FyaWx5IGJ5IGhhbmQtY29kZWQgYXNzZW1ibHksIG9yIGlmIHNpYmxpbmcgY2FsbHMKLQkgICAgICAgYXJlIGVuYWJsZWQgaW4gZ2NjLiAKLQotCSAgICAgICBQZXJoYXBzIGNvbmRpdGlvbmFsaXplIHRoaXMgb24gYSBmbGFnIGJlaW5nIHNldCBpbiB0aGUgdGFyZ2V0Ci0JICAgICAgIG9iamVjdCBmaWxlJ3MgaGVhZGVyLCBhbmQgaGF2ZSBnY2Mgc2V0IGl0PyAgKi8KLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgYWxsIGNhc2VzIHdlcmUgb3B0aW1pemVkLCB3ZSBjYW4gcmVkdWNlIHRoZSB1c2UgY291bnQgb24gdGhpcwotICAgICBnb3QgZW50cnkgYnkgb25lLCBwb3NzaWJseSBlbGltaW5hdGluZyBpdC4gICovCi0gIGlmIChhbGxfb3B0aW1pemVkKQotICAgIHsKLSAgICAgIGluZm8tPmdvdGVudC0+dXNlX2NvdW50IC09IDE7Ci0gICAgICBhbHBoYV9lbGZfdGRhdGEgKGluZm8tPmdvdGVudC0+Z290b2JqKS0+dG90YWxfZ290X2VudHJpZXMgLT0gMTsKLSAgICAgIGlmICghaW5mby0+aCkKLQlhbHBoYV9lbGZfdGRhdGEgKGluZm8tPmdvdGVudC0+Z290b2JqKS0+bl9sb2NhbF9nb3RfZW50cmllcyAtPSAxOwotCi0gICAgICAvKiBJZiB0aGUgbGl0ZXJhbCBpbnN0cnVjdGlvbiBpcyBubyBsb25nZXIgbmVlZGVkIChpdCBtYXkgaGF2ZSBiZWVuCi0JIHJldXNlZC4gIFdlIGNhbiBlbGltaW5hdGUgaXQuCi0JID8/PyBGb3Igbm93LCBJIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIGNvbXBhY3RpbmcgdGhlIHNlY3Rpb24sCi0JIHNvIGp1c3Qgbm9wIGl0IG91dC4gICovCi0gICAgICBpZiAoIWxpdF9yZXVzZWQpCi0JewotCSAgaXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX0FMUEhBX05PTkUpOwotCSAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0JICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBJTlNOX1VOT1AsIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCSAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gaXJlbCArIGNvdW50OwotfQotCi1zdGF0aWMgYmZkX3ZtYQotZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwgKGluZm8sIHN5bXZhbCkKLSAgICAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgc3ltdmFsOwotewotICAvKiBJZiB0aGUgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIGdwLCBhbmQgd2UgY2FuIGlkZW50aWZ5IHRoYXQgdGhlCi0gICAgIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSBpdHMgZnVuY3Rpb24gcG9pbnRlciwgd2UgY2FuIGVsaW1pbmF0ZSB0aGUKLSAgICAgYWRkcmVzcyBsb2FkLiAgKi8KLQotICAvKiBJZiB0aGUgc3ltYm9sIGlzIG1hcmtlZCBOT1BWLCB3ZSBhcmUgYmVpbmcgdG9sZCB0aGUgZnVuY3Rpb24gbmV2ZXIKLSAgICAgbmVlZHMgaXRzIHByb2NlZHVyZSB2YWx1ZS4gICovCi0gIGlmIChpbmZvLT5vdGhlciA9PSBTVE9fQUxQSEFfTk9QVikKLSAgICByZXR1cm4gc3ltdmFsOwotCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgbWFya2VkIFNURF9HUCwgd2UgYXJlIGJlaW5nIHRvbGQgdGhlIGZ1bmN0aW9uIGRvZXMKLSAgICAgYSBub3JtYWwgbGRncCBpbiB0aGUgZmlyc3QgdHdvIHdvcmRzLiAgKi8gCi0gIGVsc2UgaWYgKGluZm8tPm90aGVyID09IFNUT19BTFBIQV9TVERfR1BMT0FEKQotICAgIDsKLQotICAvKiBPdGhlcndpc2UsIHdlIG1heSBiZSBhYmxlIHRvIGlkZW50aWZ5IGEgR1AgbG9hZCBpbiB0aGUgZmlyc3QgdHdvCi0gICAgIHdvcmRzLCB3aGljaCB3ZSBjYW4gdGhlbiBza2lwLiAgKi8KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqdHNlY19yZWxvY3MsICp0c2VjX3JlbGVuZCwgKnRzZWNfZnJlZSwgKmdwZGlzcDsKLSAgICAgIGJmZF92bWEgb2ZzOwotCi0gICAgICAvKiBMb2FkIHRoZSByZWxvY2F0aW9ucyBmcm9tIHRoZSBzZWN0aW9uIHRoYXQgdGhlIHRhcmdldCBzeW1ib2wgaXMgaW4uICovCi0gICAgICBpZiAoaW5mby0+c2VjID09IGluZm8tPnRzZWMpCi0JewotCSAgdHNlY19yZWxvY3MgPSBpbmZvLT5yZWxvY3M7Ci0JICB0c2VjX3JlbGVuZCA9IGluZm8tPnJlbGVuZDsKLQkgIHRzZWNfZnJlZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRzZWNfcmVsb2NzID0gKF9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcwotCQkgICAgICAgICAoaW5mby0+YWJmZCwgaW5mby0+dHNlYywgKFBUUikgTlVMTCwKLQkJCSAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSBpbmZvLT5saW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0JICBpZiAodHNlY19yZWxvY3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0JICB0c2VjX3JlbGVuZCA9IHRzZWNfcmVsb2NzICsgaW5mby0+dHNlYy0+cmVsb2NfY291bnQ7Ci0JICB0c2VjX2ZyZWUgPSAoaW5mby0+bGlua19pbmZvLT5rZWVwX21lbW9yeSA/IE5VTEwgOiB0c2VjX3JlbG9jcyk7Ci0JfQotCi0gICAgICAvKiBSZWNvdmVyIHRoZSBzeW1ib2wncyBvZmZzZXQgd2l0aGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIG9mcyA9IChzeW12YWwgLSBpbmZvLT50c2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAtIGluZm8tPnRzZWMtPm91dHB1dF9vZmZzZXQpOwotICAKLSAgICAgIC8qIExvb2sgZm9yIGEgR1BESVNQIHJlbG9jLiAgKi8KLSAgICAgIGdwZGlzcCA9IChlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcwotCQkodHNlY19yZWxvY3MsIHRzZWNfcmVsZW5kLCBvZnMsIFJfQUxQSEFfR1BESVNQKSk7Ci0KLSAgICAgIGlmICghZ3BkaXNwIHx8IGdwZGlzcC0+cl9hZGRlbmQgIT0gNCkKLQl7Ci0JICBpZiAodHNlY19mcmVlKQotCSAgICBmcmVlICh0c2VjX2ZyZWUpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaWYgKHRzZWNfZnJlZSkKLSAgICAgICAgZnJlZSAodHNlY19mcmVlKTsKLSAgICB9Ci0KLSAgLyogV2UndmUgbm93IGRldGVybWluZWQgdGhhdCB3ZSBjYW4gc2tpcCBhbiBpbml0aWFsIGdwIGxvYWQuICBWZXJpZnkgCi0gICAgIHRoYXQgdGhlIGNhbGwgYW5kIHRoZSB0YXJnZXQgdXNlIHRoZSBzYW1lIGdwLiAgICovCi0gIGlmIChpbmZvLT5saW5rX2luZm8tPmhhc2gtPmNyZWF0b3IgIT0gaW5mby0+dHNlYy0+b3duZXItPnh2ZWMKLSAgICAgIHx8IGluZm8tPmdvdG9iaiAhPSBhbHBoYV9lbGZfdGRhdGEgKGluZm8tPnRzZWMtPm93bmVyKS0+Z290b2JqKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBzeW12YWwgKyA4OwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UgKGluZm8sIHN5bXZhbCwgaXJlbCkKLSAgICAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgc3ltdmFsOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbDsKLXsKLSAgdW5zaWduZWQgaW50IGluc247Ci0gIGJmZF9zaWduZWRfdm1hIGRpc3A7Ci0KLSAgLyogR2V0IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGluc24gPSBiZmRfZ2V0XzMyIChpbmZvLT5hYmZkLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotICBpZiAoaW5zbiA+PiAyNiAhPSBPUF9MRFEpCi0gICAgewotICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICgiJXM6ICVzKzB4JWx4OiB3YXJuaW5nOiBMSVRFUkFMIHJlbG9jYXRpb24gYWdhaW5zdCB1bmV4cGVjdGVkIGluc24iLAotCWJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpLCBpbmZvLT5zZWMtPm5hbWUsCi0JKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogU28gd2UgYXJlbid0IHRvbGQgbXVjaC4gIERvIHdoYXQgd2UgY2FuIHdpdGggdGhlIGFkZHJlc3MgbG9hZCBhbmQKLSAgICAgZmFrZSB0aGUgcmVzdC4gIEFsbCBvZiB0aGUgb3B0aW1pemF0aW9ucyBoZXJlIHJlcXVpcmUgdGhhdCB0aGUKLSAgICAgb2Zmc2V0IGZyb20gdGhlIEdQIGZpdCBpbiAxNiBiaXRzLiAgKi8KLQotICBkaXNwID0gc3ltdmFsIC0gaW5mby0+Z3A7Ci0gIGlmIChkaXNwIDwgLTB4ODAwMCB8fCBkaXNwID49IDB4ODAwMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBPbiB0aGUgTElURVJBTCBpbnN0cnVjdGlvbiBpdHNlbGYsIGNvbnNpZGVyIGV4Y2hhbmdpbmcKLSAgICAgYGxkcSBSLFgoZ3ApJyBmb3IgYGxkYSBSLFkoZ3ApJy4gICovCi0KLSAgaW5zbiA9IChPUF9MREEgPDwgMjYpIHwgKGluc24gJiAweDAzZmYwMDAwKTsKLSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgaW5zbiwgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0gIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCi0gIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksIFJfQUxQSEFfR1BSRUxMT1cpOwotICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0KLSAgLyogUmVkdWNlIHRoZSB1c2UgY291bnQgb24gdGhpcyBnb3QgZW50cnkgYnkgb25lLCBwb3NzaWJseQotICAgICBlbGltaW5hdGluZyBpdC4gICovCi0gIGluZm8tPmdvdGVudC0+dXNlX2NvdW50IC09IDE7Ci0gIGFscGhhX2VsZl90ZGF0YSAoaW5mby0+Z290ZW50LT5nb3RvYmopLT50b3RhbF9nb3RfZW50cmllcyAtPSAxOwotICBpZiAoIWluZm8tPmgpCi0gICAgYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPm5fbG9jYWxfZ290X2VudHJpZXMgLT0gMTsKLQotICAvKiA/Pz8gU2VhcmNoIGZvcndhcmQgdGhyb3VnaCB0aGlzIGJhc2ljIGJsb2NrIGxvb2tpbmcgZm9yIGluc25zCi0gICAgIHRoYXQgdXNlIHRoZSB0YXJnZXQgcmVnaXN0ZXIuICBTdG9wIGFmdGVyIGFuIGluc24gbW9kaWZ5aW5nIHRoZQotICAgICByZWdpc3RlciBpcyBzZWVuLCBvciBhZnRlciBhIGJyYW5jaCBvciBjYWxsLgotCi0gICAgIEFueSBzdWNoIG1lbW9yeSBsb2FkIGluc24gbWF5IGJlIHN1YnN0aXR1dGVkIGJ5IGEgbG9hZCBkaXJlY3RseQotICAgICBvZmYgdGhlIEdQLiAgVGhpcyBhbGxvd3MgdGhlIG1lbW9yeSBsb2FkIGluc24gdG8gYmUgaXNzdWVkIGJlZm9yZQotICAgICB0aGUgY2FsY3VsYXRlZCBHUCByZWdpc3RlciB3b3VsZCBvdGhlcndpc2UgYmUgcmVhZHkuIAotCi0gICAgIEFueSBzdWNoIGpzciBpbnNuIGNhbiBiZSByZXBsYWNlZCBieSBhIGJzciBpZiBpdCBpcyBpbiByYW5nZS4KLQotICAgICBUaGlzIHdvdWxkIG1lYW4gdGhhdCB3ZSdkIGhhdmUgdG8gX2FkZF8gcmVsb2NhdGlvbnMsIHRoZSBwYWluIG9mCi0gICAgIHdoaWNoIGdpdmVzIG9uZSBwYXVzZS4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmNjRfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmNjRfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKmxvY2FsX2dvdF9lbnRyaWVzOwotICBzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyBpbmZvOwotCi0gIC8qIFdlIGFyZSBub3QgY3VycmVudGx5IGNoYW5naW5nIGFueSBzaXplcywgc28gb25seSBvbmUgcGFzcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgbG9jYWxfZ290X2VudHJpZXMgPSBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmxvY2FsX2dvdF9lbnRyaWVzOwotCi0gIC8qIExvYWQgdGhlIHJlbG9jYXRpb25zIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGY2NF9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLSAgaW5mby5hYmZkID0gYWJmZDsKLSAgaW5mby5zZWMgPSBzZWM7Ci0gIGluZm8ubGlua19pbmZvID0gbGlua19pbmZvOwotICBpbmZvLnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgaW5mby5yZWxlbmQgPSBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBGaW5kIHRoZSBHUCBmb3IgdGhpcyBvYmplY3QuICAqLwotICBpbmZvLmdvdG9iaiA9IGFscGhhX2VsZl90ZGF0YSAoYWJmZCktPmdvdG9iajsKLSAgaWYgKGluZm8uZ290b2JqKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChpbmZvLmdvdG9iaiktPmdvdDsKLSAgICAgIGluZm8uZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoaW5mby5nb3RvYmopOwotICAgICAgaWYgKGluZm8uZ3AgPT0gMCkKLQl7Ci0JICBpbmZvLmdwID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIDB4ODAwMCk7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoaW5mby5nb3RvYmosIGluZm8uZ3ApOwotCX0KLSAgICB9Ci0KLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3ltdmFsOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQotICAgICAgaWYgKEVMRjY0X1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX0FMUEhBX0xJVEVSQUwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoaW5mby5jb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBpbmZvLmNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoaW5mby5jb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gaW5mby5jb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBpbmZvLmNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmNjRfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXh0c3ltcyA9ICgoRWxmNjRfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpbmZvLnRzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIGluZm8udHNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaW5mby50c2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaW5mby50c2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgCi0JICAgIGNvbnRpbnVlOwkvKiB3aG8ga25vd3MuICovCi0KLQkgIGluZm8uaCA9IE5VTEw7Ci0JICBpbmZvLm90aGVyID0gaXN5bS5zdF9vdGhlcjsKLQkgIGdvdGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW0VMRjY0X1JfU1lNKGlyZWwtPnJfaW5mbyldOwotCSAgc3ltdmFsID0gaXN5bS5zdF92YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGluZHggPSBFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKLQotCSAgLyogV2UgY2FuJ3QgZG8gYW50aGluZyB3aXRoIHVuZGVmaW5lZCBvciBkeW5hbWljIHN5bWJvbHMuICAqLwotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLQkgICAgICB8fCBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGxpbmtfaW5mbykpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpbmZvLmggPSBoOwotCSAgaW5mby5nb3RlbnQgPSBnb3RlbnQ7Ci0JICBpbmZvLnRzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGluZm8ub3RoZXIgPSBoLT5yb290Lm90aGVyOwotCSAgZ290ZW50ID0gaC0+Z290X2VudHJpZXM7Ci0JICBzeW12YWwgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWU7Ci0JfQotCi0gICAgICAvKiBTZWFyY2ggZm9yIHRoZSBnb3QgZW50cnkgdG8gYmUgdXNlZCBieSB0aGlzIHJlbG9jYXRpb24uICAqLwotICAgICAgd2hpbGUgKGdvdGVudC0+Z290b2JqICE9IGluZm8uZ290b2JqIHx8IGdvdGVudC0+YWRkZW5kICE9IGlyZWwtPnJfYWRkZW5kKQotCWdvdGVudCA9IGdvdGVudC0+bmV4dDsKLSAgICAgIGluZm8uZ290ZW50ID0gZ290ZW50OwotCi0gICAgICBzeW12YWwgKz0gaW5mby50c2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5mby50c2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgc3ltdmFsICs9IGlyZWwtPnJfYWRkZW5kOwotCi0gICAgICBCRkRfQVNTRVJUKGluZm8uZ290ZW50ICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGVyZSBleGlzdCBMSVRVU0UgcmVsb2NhdGlvbnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nLCB0aGlzCi0JIG9wZW5zIHVwIGFsbCBzb3J0cyBvZiBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb25zLCBiZWNhdXNlIHdlCi0JIG5vdyBrbm93IGV2ZXJ5IGxvY2F0aW9uIHRoYXQgdGhpcyBhZGRyZXNzIGxvYWQgaXMgdXNlZC4gICovCi0KLSAgICAgIGlmIChpcmVsKzEgPCBpcmVsZW5kICYmIEVMRjY0X1JfVFlQRSAoaXJlbFsxXS5yX2luZm8pID09IFJfQUxQSEFfTElUVVNFKQotCXsKLQkgIGlyZWwgPSBlbGY2NF9hbHBoYV9yZWxheF93aXRoX2xpdHVzZSAoJmluZm8sIHN5bXZhbCwgaXJlbCwgaXJlbGVuZCk7Ci0JICBpZiAoaXJlbCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCFlbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZSAoJmluZm8sIHN5bXZhbCwgaXJlbCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyAoYWJmZCwgbGlua19pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8uY2hhbmdlZF9yZWxvY3MpCi0gICAgewotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgfQotCi0gIGlmIChpbmZvLmNoYW5nZWRfY29udGVudHMpCi0gICAgewotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBpbmZvLmNvbnRlbnRzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGluZm8uY29udGVudHM7Ci0JfQotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICB9Ci0KLSAgKmFnYWluID0gaW5mby5jaGFuZ2VkX2NvbnRlbnRzIHx8IGluZm8uY2hhbmdlZF9yZWxvY3M7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIFBMVC9HT1QgU3R1ZmYgKi8KLSNkZWZpbmUgUExUX0hFQURFUl9TSVpFIDMyCi0jZGVmaW5lIFBMVF9IRUFERVJfV09SRDEJMHhjMzYwMDAwMAkvKiBiciAgICQyNywuKzQgICAgICovCi0jZGVmaW5lIFBMVF9IRUFERVJfV09SRDIJMHhhNzdiMDAwYwkvKiBsZHEgICQyNywxMigkMjcpICovCi0jZGVmaW5lIFBMVF9IRUFERVJfV09SRDMJMHg0N2ZmMDQxZgkvKiBub3AgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBMVF9IRUFERVJfV09SRDQJMHg2YjdiMDAwMAkvKiBqbXAgICQyNywoJDI3KSAgICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQxCQkweGMzODAwMDAwCS8qIGJyICAgJDI4LCBwbHQwICAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQyCQkwCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMwkJMAotCi0jZGVmaW5lIE1BWF9HT1RfRU5UUklFUwkJKDY0KjEwMjQgLyA4KQotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zbyIKLQwKLS8qIEhhbmRsZSBhbiBBbHBoYSBzcGVjaWZpYyBzZWN0aW9uIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gIFRoaXMKLSAgIGlzIGNhbGxlZCB3aGVuIGVsZmNvZGUuaCBmaW5kcyBhIHNlY3Rpb24gd2l0aCBhbiB1bmtub3duIHR5cGUuCi0gICBGSVhNRTogV2UgbmVlZCB0byBoYW5kbGUgdGhlIFNIRl9BTFBIQV9HUFJFTCBmbGFnLCBidXQgSSdtIG5vdCBzdXJlCi0gICBob3cgdG8uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGY2NF9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIC8qIFRoZXJlIG91Z2h0IHRvIGJlIGEgcGxhY2UgdG8ga2VlcCBFTEYgYmFja2VuZCBzcGVjaWZpYyBmbGFncywgYnV0Ci0gICAgIGF0IHRoZSBtb21lbnQgdGhlcmUgaXNuJ3Qgb25lLiAgV2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZQotICAgICBzZWN0aW9ucyBieSB0aGVpciBuYW1lLCBpbnN0ZWFkLiAgRm9ydHVuYXRlbHksIHRoZSBBQkkgZ2l2ZXMKLSAgICAgc3VnZ2VzdGVkIG5hbWVzIGZvciBhbGwgdGhlIE1JUFMgc3BlY2lmaWMgc2VjdGlvbnMsIHNvIHdlIHdpbGwKLSAgICAgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCB0aGlzLiAgKi8KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX0FMUEhBX0RFQlVHOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgICBjYXNlIFNIVF9BTFBIQV9SRUdJTkZPOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWdpbmZvIikgIT0gMAotCSAgfHwgaGRyLT5zaF9zaXplICE9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3c2VjdCA9IGhkci0+YmZkX3NlY3Rpb247Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfQUxQSEFfREVCVUcpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0LAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QpCi0JCQkJICAgIHwgU0VDX0RFQlVHR0lORykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gIC8qIEZvciBhIC5yZWdpbmZvIHNlY3Rpb24sIHNldCB0aGUgZ3AgdmFsdWUgaW4gdGhlIHRkYXRhIGluZm9ybWF0aW9uCi0gICAgIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbi4gIFdlIG5lZWQgdGhlIGdwIHZhbHVlIHdoaWxlCi0gICAgIHByb2Nlc3NpbmcgcmVsb2NzLCBzbyB3ZSBqdXN0IGdldCBpdCBub3cuICAqLwotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9BTFBIQV9SRUdJTkZPKQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gZXh0OwotICAgICAgRWxmNjRfUmVnSW5mbyBzOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG5ld3NlY3QsIChQVFIpICZleHQsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9yZWdpbmZvX2luIChhYmZkLCAmZXh0LCAmcyk7Ci0gICAgICBlbGZfZ3AgKGFiZmQpID0gcy5yaV9ncF92YWx1ZTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGFuIEFscGhhIEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9mYWtlX3NlY3Rpb25zIChhYmZkLCBoZHIsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBFbGY2NF9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfQUxQSEFfREVCVUc7Ci0gICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAubWRlYnVnIHNlY3Rpb24gaGFzIGFuCi0gICAgICAgICBlbnRzaXplIG9mIDAuICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCApCi0JaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIGVsc2UKLQloZHItPnNoX2VudHNpemUgPSAxOwotICAgIH0KLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWdpbmZvIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfQUxQSEFfUkVHSU5GTzsKLSAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5yZWdpbmZvIHNlY3Rpb24gaGFzIGFuCi0gICAgICAgICBlbnRzaXplIG9mIDB4MTguICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQloZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pOwotICAgICAgZWxzZQotCWhkci0+c2hfZW50c2l6ZSA9IDE7Ci0KLSAgICAgIC8qIEZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIGV2ZW4gaWYgdGhlCi0JIGxpbmtlciB0aGlua3MgaXQgaXMgbGFyZ2VyLiAgVGhlIGxpbmsgcm91dGluZSBiZWxvdyB3aWxsIG9ubHkKLQkgd3JpdGUgb3V0IHRoaXMgbXVjaCBkYXRhIGZvciAucmVnaW5mby4gICovCi0gICAgICBoZHItPnNoX3NpemUgPSBzZWMtPl9yYXdfc2l6ZSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaGFzaCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuZHluYW1pYyIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuZHluc3RyIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSAwOwotICAgICAgaGRyLT5zaF9pbmZvID0gU0laRU9GX0FMUEhBX0RZTlNZTV9TRUNOQU1FUzsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLSAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTFBIQV9HUFJFTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIHVzZSBpdCB0byBwdXQgLmNvbW0gaXRlbXMgaW4gLnNic3MsIGFuZCBub3QgLmJzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3A7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTgotICAgICAgJiYgIWluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3ltLT5zdF9zaXplIDw9IGJmZF9nZXRfZ3Bfc2l6ZSAoYWJmZCkpCi0gICAgewotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIC1HIG5uIGJ5dGVzIGFyZQotCSBhdXRvbWF0aWNhbGx5IHB1dCBpbnRvIC5zYnNzLiAgKi8KLQotICAgICAgYXNlY3Rpb24gKnNjb21tID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2NvbW1vbiIpOwotCi0gICAgICBpZiAoc2NvbW0gPT0gTlVMTCkKLQl7Ci0JICBzY29tbSA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuc2NvbW1vbiIpOwotCSAgaWYgKHNjb21tID09IE5VTEwKLQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzY29tbSwgKFNFQ19BTExPQwotCQkJCQkJICAgICAgIHwgU0VDX0lTX0NPTU1PTgotCQkJCQkJICAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgICpzZWNwID0gc2NvbW07Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbihhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqczsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZ290IikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKSkKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWxwaGFfZWxmX3RkYXRhIChhYmZkKS0+Z290ID0gczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGFsbCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5wbHQsIC5yZWxhLnBsdCwgLmdvdCwgYW5kIC5yZWxhLmdvdCBzZWN0aW9ucy4gICovCi0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCSAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkgICAgfCBTRUNfQ09ERSkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUKLSAgICAgLnBsdCBzZWN0aW9uLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAoaW5mbywgYWJmZCwgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iLCBCU0ZfR0xPQkFMLCBzLAotCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoaW5mby0+c2hhcmVkCi0gICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsYS5wbHQiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2UgbWF5IG9yIG1heSBub3QgaGF2ZSBjcmVhdGVkIGEgLmdvdCBzZWN0aW9uIGZvciB0aGlzIG9iamVjdCwgYnV0Ci0gICAgIHdlIGRlZmluaXRlbHkgaGF2bid0IGRvbmUgdGhlIHJlc3Qgb2YgdGhlIHdvcmsuICAqLwotCi0gIGlmICghZWxmNjRfYWxwaGFfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24oYWJmZCwgIi5yZWxhLmdvdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIGR5bm9iaidzIC5nb3Qgc2VjdGlvbi4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlIGxpbmtlciBzY3JpcHQKLSAgICAgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgc3ltYm9sIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcKLSAgICAgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JKGluZm8sIGFiZmQsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLCBCU0ZfR0xPQkFMLAotCSBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmdvdCwgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsCi0JIGZhbHNlLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdCA9IGg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSZWFkIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgLm1kZWJ1ZyBzZWN0aW9uIGludG8gYQotICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBzZWN0aW9uLCBkZWJ1ZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotewotICBIRFJSICpzeW1oZHI7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBjaGFyICpleHRfaGRyID0gTlVMTDsKLQotICBzd2FwID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotICBtZW1zZXQgKGRlYnVnLCAwLCBzaXplb2YoKmRlYnVnKSk7Ci0KLSAgZXh0X2hkciA9IChjaGFyICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplKTsKLSAgaWYgKGV4dF9oZHIgPT0gTlVMTCAmJiBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGV4dF9oZHIsIChmaWxlX3B0cikgMCwKLQkJCQlzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSkKLSAgICAgID09IGZhbHNlKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICAoKnN3YXAtPnN3YXBfaGRyX2luKSAoYWJmZCwgZXh0X2hkciwgc3ltaGRyKTsKLQotICAvKiBUaGUgc3ltYm9saWMgaGVhZGVyIGNvbnRhaW5zIGFic29sdXRlIGZpbGUgb2Zmc2V0cyBhbmQgc2l6ZXMgdG8KLSAgICAgcmVhZC4gICovCi0jZGVmaW5lIFJFQUQocHRyLCBvZmZzZXQsIGNvdW50LCBzaXplLCB0eXBlKQkJCQlcCi0gIGlmIChzeW1oZHItPmNvdW50ID09IDApCQkJCQkJXAotICAgIGRlYnVnLT5wdHIgPSBOVUxMOwkJCQkJCQlcCi0gIGVsc2UJCQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGRlYnVnLT5wdHIgPSAodHlwZSkgYmZkX21hbGxvYyAoKHNpemVfdCkgKHNpemUgKiBzeW1oZHItPmNvdW50KSk7CVwKLSAgICAgIGlmIChkZWJ1Zy0+cHRyID09IE5VTEwpCQkJCQkJXAotCWdvdG8gZXJyb3JfcmV0dXJuOwkJCQkJCVwKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBzeW1oZHItPm9mZnNldCwgU0VFS19TRVQpICE9IDAJXAotCSAgfHwgKGJmZF9yZWFkIChkZWJ1Zy0+cHRyLCBzaXplLCBzeW1oZHItPmNvdW50LAkJXAotCQkJYWJmZCkgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpKQkJCVwKLQlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCi0gICAgfQotCi0gIFJFQUQgKGxpbmUsIGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLCB1bnNpZ25lZCBjaGFyICopOwotICBSRUFEIChleHRlcm5hbF9kbnIsIGNiRG5PZmZzZXQsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3BkciwgY2JQZE9mZnNldCwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX29wdCwgY2JPcHRPZmZzZXQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9hdXgsIGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpLAotCXVuaW9uIGF1eF9leHQgKik7Ci0gIFJFQUQgKHNzLCBjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7Ci0gIFJFQUQgKHNzZXh0LCBjYlNzRXh0T2Zmc2V0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7Ci0gIFJFQUQgKGV4dGVybmFsX2ZkciwgY2JGZE9mZnNldCwgaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX2V4dCwgY2JFeHRPZmZzZXQsIGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplLCBQVFIpOwotI3VuZGVmIFJFQUQKLQotICBkZWJ1Zy0+ZmRyID0gTlVMTDsKLSAgZGVidWctPmFkanVzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChleHRfaGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0X2hkcik7Ci0gIGlmIChkZWJ1Zy0+bGluZSAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5saW5lKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9kbnIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9wZHIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9zeW0gIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9vcHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0KTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9hdXggIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4KTsKLSAgaWYgKGRlYnVnLT5zcyAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5zcyk7Ci0gIGlmIChkZWJ1Zy0+c3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+c3NleHQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2ZkciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9mZHIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3JmZCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9yZmQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9leHQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFscGhhIEVMRiBsb2NhbCBsYWJlbHMgc3RhcnQgd2l0aCAnJCcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbmFtZVswXSA9PSAnJCc7Ci19Ci0KLS8qIEFscGhhIEVMRiBmb2xsb3dzIE1JUFMgRUxGIGluIHVzaW5nIGEgc3BlY2lhbCBmaW5kX25lYXJlc3RfbGluZQotICAgcm91dGluZSBpbiBvcmRlciB0byBoYW5kbGUgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdlCi0gICBzdGlsbCBjYWxsIHRoaXMgbWlwc19lbGZfZmluZF9saW5lIGJlY2F1c2Ugb2YgdGhlIHNsb3QKLSAgIGZpbmRfbGluZV9pbmZvIGluIGVsZl9vYmpfdGRhdGEgaXMgZGVjbGFyZWQgdGhhdCB3YXkuICAqLwotCi1zdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lCi17Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGQ7Ci0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgaTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQkgICAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIGFzZWN0aW9uICptc2VjOwotCi0gIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5tZGVidWciKTsKLSAgaWYgKG1zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBvcmlnZmxhZ3M7Ci0gICAgICBzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICpmaTsKLSAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3Qgc3dhcCA9Ci0JZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgY2FsbGVkIGR1cmluZyBhIGxpbmssIGFscGhhX2VsZl9maW5hbF9saW5rIG1heSBoYXZlCi0JIGNsZWFyZWQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmllbGQuICBXZSBmb3JjZSBpdCBiYWNrIG9uIGhlcmUKLQkgaWYgYXBwcm9wcmlhdGUgKHdoaWNoIGl0IG5vcm1hbGx5IHdpbGwgYmUpLiAgKi8KLSAgICAgIG9yaWdmbGFncyA9IG1zZWMtPmZsYWdzOwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG1zZWMpLT50aGlzX2hkci5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JbXNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQotICAgICAgZmkgPSBlbGZfdGRhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbzsKLSAgICAgIGlmIChmaSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBjaGFyICpmcmF3X3NyYzsKLQkgIGNoYXIgKmZyYXdfZW5kOwotCSAgc3RydWN0IGZkciAqZmRyX3B0cjsKLQotCSAgZmkgPSAoKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKikKLQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lKSkpOwotCSAgaWYgKGZpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKCFlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIG1zZWMsICZmaS0+ZCkpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogU3dhcCBpbiB0aGUgRkRSIGluZm9ybWF0aW9uLiAgKi8KLQkgIGZpLT5kLmZkciA9ICgoc3RydWN0IGZkciAqKQotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgKGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKgotCQkJCSAgIHNpemVvZiAoc3RydWN0IGZkcikpKSk7Ci0JICBpZiAoZmktPmQuZmRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGV4dGVybmFsX2Zkcl9zaXplID0gc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBmZHJfcHRyID0gZmktPmQuZmRyOwotCSAgZnJhd19zcmMgPSAoY2hhciAqKSBmaS0+ZC5leHRlcm5hbF9mZHI7Ci0JICBmcmF3X2VuZCA9IChmcmF3X3NyYwotCQkgICAgICArIGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKiBleHRlcm5hbF9mZHJfc2l6ZSk7Ci0JICBmb3IgKDsgZnJhd19zcmMgPCBmcmF3X2VuZDsgZnJhd19zcmMgKz0gZXh0ZXJuYWxfZmRyX3NpemUsIGZkcl9wdHIrKykKLQkgICAgKCpzd2FwLT5zd2FwX2Zkcl9pbikgKGFiZmQsIChQVFIpIGZyYXdfc3JjLCBmZHJfcHRyKTsKLQotCSAgZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPSBmaTsKLQotCSAgLyogTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciB0byBldmVyIGZyZWUgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICBmaW5kX25lYXJlc3RfbGluZSBpcyBlaXRoZXIgY2FsbGVkIGFsbCB0aGUgdGltZSwgYXMgaW4KLSAgICAgICAgICAgICBvYmpkdW1wIC1sLCBzbyB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHNhdmVkLCBvciBpdCBpcwotICAgICAgICAgICAgIHJhcmVseSBjYWxsZWQsIGFzIGluIGxkIGVycm9yIG1lc3NhZ2VzLCBzbyB0aGUgbWVtb3J5Ci0gICAgICAgICAgICAgd2FzdGVkIGlzIHVuaW1wb3J0YW50LiAgU3RpbGwsIGl0IHdvdWxkIHByb2JhYmx5IGJlIGEKLSAgICAgICAgICAgICBnb29kIGlkZWEgZm9yIGZyZWVfY2FjaGVkX2luZm8gdG8gdGhyb3cgaXQgYXdheS4gICovCi0JfQotCi0gICAgICBpZiAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2Zmc2V0LCAmZmktPmQsIHN3YXAsCi0JCQkJICAmZmktPmksIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgIGxpbmVfcHRyKSkKLQl7Ci0JICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0gICAgfQotCi0gIC8qIEZhbGwgYmFjayBvbiB0aGUgZ2VuZXJpYyBFTEYgZmluZF9uZWFyZXN0X2xpbmUgcm91dGluZS4gICovCi0KLSAgcmV0dXJuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0cik7Ci19Ci0MCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGFscGhhX2VsZl9vdXRwdXRfZXh0c3ltLiAgKi8KLQotc3RydWN0IGV4dHN5bV9pbmZvCi17Ci0gIGJmZCAqYWJmZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIGJvb2xlYW4gZmFpbGVkOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX291dHB1dF9leHRzeW0gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGV4dHN5bV9pbmZvICplaW5mbyA9IChzdHJ1Y3QgZXh0c3ltX2luZm8gKikgZGF0YTsKLSAgYm9vbGVhbiBzdHJpcDsKLSAgYXNlY3Rpb24gKnNlYywgKm91dHB1dF9zZWN0aW9uOwotCi0gIGlmIChoLT5yb290LmluZHggPT0gLTIpCi0gICAgc3RyaXAgPSBmYWxzZTsKLSAgZWxzZSBpZiAoKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAgICAgIHx8IChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKQotICAgICAgICAgICYmIChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAgICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlIGlmIChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0gICAgICAgICAgfHwgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0gICAgICAgICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZWluZm8tPmluZm8tPmtlZXBfaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UKLSAgICBzdHJpcCA9IGZhbHNlOwotCi0gIGlmIChzdHJpcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+ZXN5bS5pZmQgPT0gLTIpCi0gICAgewotICAgICAgaC0+ZXN5bS5qbXB0YmwgPSAwOwotICAgICAgaC0+ZXN5bS5jb2JvbF9tYWluID0gMDsKLSAgICAgIGgtPmVzeW0ud2Vha2V4dCA9IDA7Ci0gICAgICBoLT5lc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uaWZkID0gaWZkTmlsOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0R2xvYmFsOwotCi0gICAgICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgICAgICAgIC8qIFdoZW4gbWFraW5nIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHN5bWJvbCBoIGlzIHRoZSBvbmUgZnJvbQotICAgICAgICAgICAgdGhlIGFub3RoZXIgc2hhcmVkIGxpYnJhcnksIE9VVFBVVF9TRUNUSU9OIG1heSBiZSBudWxsLiAgKi8KLSAgICAgICAgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfc2VjdGlvbi0+b3duZXIsIG91dHB1dF9zZWN0aW9uKTsKLQotICAgICAgICAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1RleHQ7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NEYXRhOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yb2RhdGEiKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRmluaTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgaC0+ZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgIH0KLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gaC0+cm9vdC5yb290LnUuYy5zaXplOwotICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLSAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1NDb21tb24pCi0gICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCi0gICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgICAgIGlmIChvdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIGVsc2UKLSAgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNldCB0eXBlIGFuZCB2YWx1ZSBmb3IgYSBzeW1ib2wgd2l0aCBhIGZ1bmN0aW9uIHN0dWIuICAqLwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RQcm9jOwotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGVpbmZvLT5hYmZkLCAiLnBsdCIpOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCSAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IChoLT5yb290LnBsdC5vZmZzZXQKLQkJCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICArIG91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgZWxzZQotCSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotCX0KLSNpZiAwIC8qIEZJWE1FPyAgKi8KLSAgICAgIGgtPmVzeW0uaWZkID0gMDsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoISBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChlaW5mby0+YWJmZCwgZWluZm8tPmRlYnVnLCBlaW5mby0+c3dhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmVzeW0pKQotICAgIHsKLSAgICAgIGVpbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRklYTUU6ICBDcmVhdGUgYSBydW50aW1lIHByb2NlZHVyZSB0YWJsZSBmcm9tIHRoZSAubWRlYnVnIHNlY3Rpb24uCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlIChoYW5kbGUsIGFiZmQsIGluZm8sIHMsIGRlYnVnKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqczsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotKi8KLQwKLS8qIEhhbmRsZSBkeW5hbWljIHJlbG9jYXRpb25zIHdoZW4gZG9pbmcgYW4gQWxwaGEgRUxGIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGNvbnN0IGNoYXIgKnJlbF9zZWNfbmFtZTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllczsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgaW50IGdvdF9jcmVhdGVkOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotICAgIGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCi0gIHNyZWxvYyA9IE5VTEw7Ci0gIHJlbF9zZWNfbmFtZSA9IE5VTEw7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMoYWJmZCk7Ci0gIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5sb2NhbF9nb3RfZW50cmllczsKLSAgZ290X2NyZWF0ZWQgPSAwOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7ICsrcmVsKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHgsIHJfdHlwZTsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjY0X1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSOwotCX0KLSAgICAgIHJfdHlwZSA9IEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX0FMUEhBX0xJVEVSQUw6Ci0JICB7Ci0JICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0JICAgIGludCBmbGFncyA9IDA7Ci0KLQkgICAgaWYgKGgpCi0JICAgICAgewotCQkvKiBTZWFyY2ggZm9yIGFuZCBwb3NzaWJseSBjcmVhdGUgYSBnb3QgZW50cnkuICAqLwotCQlmb3IgKGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOyBnb3RlbnQgOyBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JCSAgaWYgKGdvdGVudC0+Z290b2JqID09IGFiZmQgJiYKLQkJICAgICAgZ290ZW50LT5hZGRlbmQgPT0gcmVsLT5yX2FkZGVuZCkKLQkJICAgIGJyZWFrOwotCi0JCWlmICghZ290ZW50KQotCQkgIHsKLQkJICAgIGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKikKLQkJCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkpKSk7Ci0JCSAgICBpZiAoIWdvdGVudCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBnb3RlbnQtPmdvdG9iaiA9IGFiZmQ7Ci0JCSAgICBnb3RlbnQtPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICBnb3RlbnQtPmdvdF9vZmZzZXQgPSAtMTsKLQkJICAgIGdvdGVudC0+ZmxhZ3MgPSAwOwotCQkgICAgZ290ZW50LT51c2VfY291bnQgPSAxOwotCi0JCSAgICBnb3RlbnQtPm5leHQgPSBoLT5nb3RfZW50cmllczsKLQkJICAgIGgtPmdvdF9lbnRyaWVzID0gZ290ZW50OwotCi0JCSAgICBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT50b3RhbF9nb3RfZW50cmllcysrOwotCQkgIH0KLQkJZWxzZQotCQkgIGdvdGVudC0+dXNlX2NvdW50ICs9IDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiBUaGlzIGlzIGEgbG9jYWwgLmdvdCBlbnRyeSAtLSByZWNvcmQgZm9yIG1lcmdlLiAgKi8KLQkJaWYgKCFsb2NhbF9nb3RfZW50cmllcykKLQkJICB7Ci0JCSAgICBzaXplX3Qgc2l6ZTsKLQkJICAgIHNpemUgPSAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJICAgICogc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKSk7Ci0KLQkJICAgIGxvY2FsX2dvdF9lbnRyaWVzID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKikKLQkJCQkJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSkpOwotCQkgICAgaWYgKCFsb2NhbF9nb3RfZW50cmllcykKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBtZW1zZXQgKGxvY2FsX2dvdF9lbnRyaWVzLCAwLCBzaXplKTsKLQkJICAgIGFscGhhX2VsZl90ZGF0YSAoYWJmZCktPmxvY2FsX2dvdF9lbnRyaWVzID0KLQkJICAgICAgbG9jYWxfZ290X2VudHJpZXM7Ci0JCSAgfQotCi0JCWZvciAoZ290ZW50ID0gbG9jYWxfZ290X2VudHJpZXNbRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pXTsKLQkJICAgICBnb3RlbnQgIT0gTlVMTCAmJiBnb3RlbnQtPmFkZGVuZCAhPSByZWwtPnJfYWRkZW5kOwotCQkgICAgIGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLQkJICBjb250aW51ZTsKLQkJaWYgKCFnb3RlbnQpCi0JCSAgewotCQkgICAgZ290ZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKQotCQkJICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSkpKTsKLQkJICAgIGlmICghZ290ZW50KQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAgIGdvdGVudC0+Z290b2JqID0gYWJmZDsKLQkJICAgIGdvdGVudC0+YWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJICAgIGdvdGVudC0+Z290X29mZnNldCA9IC0xOwotCQkgICAgZ290ZW50LT5mbGFncyA9IDA7Ci0JCSAgICBnb3RlbnQtPnVzZV9jb3VudCA9IDE7Ci0KLQkJICAgIGdvdGVudC0+bmV4dCA9IGxvY2FsX2dvdF9lbnRyaWVzW0VMRjY0X1JfU1lNKHJlbC0+cl9pbmZvKV07Ci0JCSAgICBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShyZWwtPnJfaW5mbyldID0gZ290ZW50OwotCi0JCSAgICBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPnRvdGFsX2dvdF9lbnRyaWVzKys7Ci0JCSAgICBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPm5fbG9jYWxfZ290X2VudHJpZXMrKzsKLQkJICB9Ci0JCWVsc2UKLQkJICBnb3RlbnQtPnVzZV9jb3VudCArPSAxOwotCSAgICAgIH0KLQotCSAgICAvKiBSZW1lbWJlciBob3cgdGhpcyBsaXRlcmFsIGlzIHVzZWQgZnJvbSBpdHMgTElUVVNFcy4KLQkgICAgICAgVGhpcyB3aWxsIGJlIGltcG9ydGFudCB3aGVuIGl0IGNvbWVzIHRvIGRlY2lkZSBpZiB3ZSBjYW4KLQkgICAgICAgY3JlYXRlIGEgLnBsdCBlbnRyeSBmb3IgYSBmdW5jdGlvbiBzeW1ib2wuICAqLwotCSAgICBpZiAocmVsKzEgPCByZWxlbmQKLQkJJiYgRUxGNjRfUl9UWVBFIChyZWxbMV0ucl9pbmZvKSA9PSBSX0FMUEhBX0xJVFVTRSkKLQkgICAgICB7Ci0JCWRvCi0JCSAgewotCQkgICAgKytyZWw7Ci0JCSAgICBpZiAocmVsLT5yX2FkZGVuZCA+PSAxICYmIHJlbC0+cl9hZGRlbmQgPD0gMykKLQkJICAgICAgZmxhZ3MgfD0gMSA8PCByZWwtPnJfYWRkZW5kOwotCQkgIH0KLQkJd2hpbGUgKHJlbCsxIDwgcmVsZW5kICYmCi0JCSAgICAgICBFTEY2NF9SX1RZUEUgKHJlbFsxXS5yX2luZm8pID09IFJfQUxQSEFfTElUVVNFKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIE5vIExJVFVTRXMgLS0gcHJlc3VtYWJseSB0aGUgYWRkcmVzcyBpcyBub3QgYmVpbmcKLQkJICAgbG9hZGVkIGZvciBub3RoaW5nLiAgKi8KLQkJZmxhZ3MgPSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFI7Ci0JICAgICAgfQotCi0JICAgIGdvdGVudC0+ZmxhZ3MgfD0gZmxhZ3M7Ci0JICAgIGlmIChoKQotCSAgICAgIHsKLQkJLyogTWFrZSBhIGd1ZXNzIGFzIHRvIHdoZXRoZXIgYSAucGx0IGVudHJ5IHdpbGwgYmUgbmVlZGVkLiAgKi8KLQkJaWYgKChoLT5mbGFncyB8PSBmbGFncykgPT0gQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9GVU5DKQotCQkgIGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkJZWxzZQotCQkgIGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgICAgfQotCSAgfQotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgUl9BTFBIQV9HUERJU1A6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMMzI6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMSElHSDoKLQljYXNlIFJfQUxQSEFfR1BSRUxMT1c6Ci0JICAvKiBXZSBkb24ndCBhY3R1YWxseSB1c2UgdGhlIC5nb3QgaGVyZSwgYnV0IHRoZSBzZWN0aW9ucyBtdXN0Ci0JICAgICBiZSBjcmVhdGVkIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JICAgICBzZWN0aW9ucy4gICovCi0JICBpZiAoIWdvdF9jcmVhdGVkKQotCSAgICB7Ci0JICAgICAgaWYgKCFlbGY2NF9hbHBoYV9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgdGhlIG9iamVjdCdzIGdvdG9iaiBpcyBzZXQgdG8gaXRzZWxmIHNvCi0JCSB0aGF0IHdlIGRlZmF1bHQgdG8gZXZlcnkgb2JqZWN0IHdpdGggaXRzIG93biAuZ290LgotCQkgV2UnbGwgbWVyZ2UgLmdvdHMgbGF0ZXIgb25jZSB3ZSd2ZSBjb2xsZWN0ZWQgZWFjaAotCQkgb2JqZWN0J3MgaW5mby4gICovCi0JICAgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5nb3RvYmogPSBhYmZkOwotCi0JICAgICAgZ290X2NyZWF0ZWQgPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9BTFBIQV9TUkVMMTY6Ci0JY2FzZSBSX0FMUEhBX1NSRUwzMjoKLQljYXNlIFJfQUxQSEFfU1JFTDY0OgotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGQUxMVEhSVSAqLwotCi0JY2FzZSBSX0FMUEhBX1JFRkxPTkc6Ci0JY2FzZSBSX0FMUEhBX1JFRlFVQUQ6Ci0JICBpZiAocmVsX3NlY19uYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICByZWxfc2VjX25hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAgICAgKGFiZmQsIGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICAgICAgZWxmX3NlY3Rpb25fZGF0YShzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkgICAgICBpZiAocmVsX3NlY19uYW1lID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKHJlbF9zZWNfbmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCSAgICAgcmVsX3NlY19uYW1lKzUpID09IDApOwotCSAgICB9Ci0KLQkgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBzZWN0aW9uIGhlcmUgbm93IHdoZXRoZXIgd2UgZXZlbnR1YWxseQotCSAgICAgdXNlIGl0IG9yIG5vdCBzbyB0aGF0IGl0IGdldHMgbWFwcGVkIHRvIGFuIG91dHB1dCBzZWN0aW9uIGJ5Ci0JICAgICB0aGUgbGlua2VyLiAgSWYgbm90IHVzZWQsIHdlJ2xsIGtpbGwgaXQgaW4KLQkgICAgIHNpemVfZHluYW1pY19zZWN0aW9ucy4gICovCi0JICBpZiAoc3JlbG9jID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCByZWxfc2VjX25hbWUpOwotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgcmVsX3NlY19uYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsCi0JCQkJCQkgKFNFQ19BTExPQ3xTRUNfTE9BRAotCQkJCQkJICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAzKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoKQotCSAgICB7Ci0JICAgICAgLyogU2luY2Ugd2UgaGF2bid0IHNlZW4gYWxsIG9mIHRoZSBpbnB1dCBzeW1ib2xzIHlldCwgd2UKLQkJIGRvbid0IGtub3cgd2hldGhlciB3ZSdsbCBhY3R1YWxseSBuZWVkIGEgZHluYW1pYyByZWxvY2F0aW9uCi0JCSBlbnRyeSBmb3IgdGhpcyByZWxvYy4gIFNvIG1ha2UgYSByZWNvcmQgb2YgaXQuICBPbmNlIHdlCi0JCSBmaW5kIG91dCBpZiB0aGlzIHRoaW5nIG5lZWRzIGR5bmFtaWMgcmVsb2NhdGlvbiB3ZSdsbAotCQkgZXhwYW5kIHRoZSByZWxvY2F0aW9uIHNlY3Rpb25zIGJ5IHRoZSBhcHByb3ByaWF0ZSBhbW91bnQuICovCi0KLQkgICAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpyZW50OwotCi0JICAgICAgZm9yIChyZW50ID0gaC0+cmVsb2NfZW50cmllczsgcmVudDsgcmVudCA9IHJlbnQtPm5leHQpCi0JCWlmIChyZW50LT5ydHlwZSA9PSByX3R5cGUgJiYgcmVudC0+c3JlbCA9PSBzcmVsb2MpCi0JCSAgYnJlYWs7Ci0KLQkgICAgICBpZiAoIXJlbnQpCi0JCXsKLQkJICByZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICopCi0JCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSkpKTsKLQkJICBpZiAoIXJlbnQpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICByZW50LT5zcmVsID0gc3JlbG9jOwotCQkgIHJlbnQtPnJ0eXBlID0gcl90eXBlOwotCQkgIHJlbnQtPmNvdW50ID0gMTsKLQotCQkgIHJlbnQtPm5leHQgPSBoLT5yZWxvY19lbnRyaWVzOwotCQkgIGgtPnJlbG9jX2VudHJpZXMgPSByZW50OwotCQl9Ci0JICAgICAgZWxzZQotCQlyZW50LT5jb3VudCsrOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnksIHdlIG5lZWQgYSBSRUxBVElWRSByZWxvYy4gICovCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmFoOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIGFoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaDsKLQotICAvKiBOb3cgdGhhdCB3ZSd2ZSBzZWVuIGFsbCBvZiB0aGUgaW5wdXQgc3ltYm9scywgZmluYWxpemUgb3VyIGRlY2lzaW9uCi0gICAgIGFib3V0IHdoZXRoZXIgdGhpcyBzeW1ib2wgc2hvdWxkIGdldCBhIC5wbHQgZW50cnkuICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLSAgICAgICYmIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wIChoLCBpbmZvKQotICAgICAgJiYgKChoLT50eXBlID09IFNUVF9GVU5DCi0JICAgJiYgIShhaC0+ZmxhZ3MgJiBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFIpKQotCSAgfHwgKGgtPnR5cGUgPT0gU1RUX05PVFlQRQotCSAgICAgICYmIGFoLT5mbGFncyA9PSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMpKQotICAgICAgLyogRG9uJ3QgcHJldmVudCBvdGhlcndpc2UgdmFsaWQgcHJvZ3JhbXMgZnJvbSBsaW5raW5nIGJ5IGF0dGVtcHRpbmcKLQkgdG8gY3JlYXRlIGEgbmV3IC5nb3QgZW50cnkgc29tZXdoZXJlLiAgQSBDb3JyZWN0IFNvbHV0aW9uIHdvdWxkIGJlCi0JIHRvIGFkZCBhIG5ldyAuZ290IHNlY3Rpb24gdG8gYSBuZXcgb2JqZWN0IGZpbGUgYW5kIGxldCBpdCBiZSBtZXJnZWQKLQkgc29tZXdoZXJlIGxhdGVyLiAgQnV0IGZvciBub3cgZG9uJ3QgYm90aGVyLiAgKi8KLSAgICAgICYmIGFoLT5nb3RfZW50cmllcykKLSAgICB7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoZHlub2JqLCAiLnBsdCIpOwotICAgICAgaWYgKCFzICYmICFlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoZHlub2JqLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBiaXQgb2YgdGhlIC5wbHQgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IFBMVF9IRUFERVJfU0laRTsKLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUgbm90Ci0JIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGUgbG9jYXRpb24KLQkgaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24gcG9pbnRlcnMgY29tcGFyZQotCSBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPnBsdC5vZmZzZXQ7Ci0JfQotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgYSBKTVBfU0xPVCBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gIFRoZSBBbHBoYSwgc2luY2UgaXQgdXNlcyAuZ290IGVudHJpZXMgZm9yIGFsbAotICAgICBzeW1ib2xzIGV2ZW4gaW4gcmVndWxhciBvYmplY3RzLCBkb2VzIG5vdCBuZWVkIHRoZSBoYWNrZXJ5IG9mIGEKLSAgICAgLmR5bmJzcyBzZWN0aW9uIGFuZCBDT1BZIGR5bmFtaWMgcmVsb2NhdGlvbnMuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTeW1ib2wgdmVyc2lvbmluZyBjYW4gY3JlYXRlIG5ldyBzeW1ib2xzLCBhbmQgbWFrZSBvdXIgb2xkIHN5bWJvbHMKLSAgIGluZGlyZWN0IHRvIHRoZSBuZXcgb25lcy4gIENvbnNvbGlkYXRlIHRoZSBnb3QgYW5kIHJlbG9jIGluZm9ybWF0aW9uCi0gICBpbiB0aGVzZSBzaXR1YXRpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzIChoaSwgZHVtbXkpCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoaTsKLSAgICAgUFRSIGR1bW15OwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaHM7Ci0KLSAgaWYgKGhpLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHJldHVybiB0cnVlOwotICBocyA9IGhpOwotICBkbyB7Ci0gICAgaHMgPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKilocy0+cm9vdC5yb290LnUuaS5saW5rOwotICB9IHdoaWxlIChocy0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk7Ci0KLSAgLyogTWVyZ2UgdGhlIGZsYWdzLiAgV2hlZS4gICovCi0KLSAgaHMtPmZsYWdzIHw9IGhpLT5mbGFnczsKLQotICAvKiBNZXJnZSB0aGUgLmdvdCBlbnRyaWVzLiAgQ2FubmliYWxpemUgdGhlIG9sZCBzeW1ib2wncyBsaXN0IGluCi0gICAgIGRvaW5nIHNvLCBzaW5jZSB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmUuICAqLwotCi0gIGlmIChocy0+Z290X2VudHJpZXMgPT0gTlVMTCkKLSAgICBocy0+Z290X2VudHJpZXMgPSBoaS0+Z290X2VudHJpZXM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ2ksICpncywgKmdpbiwgKmdzaDsKLQotICAgICAgZ3NoID0gaHMtPmdvdF9lbnRyaWVzOwotICAgICAgZm9yIChnaSA9IGhpLT5nb3RfZW50cmllczsgZ2kgOyBnaSA9IGdpbikKLQl7Ci0JICBnaW4gPSBnaS0+bmV4dDsKLQkgIGZvciAoZ3MgPSBnc2g7IGdzIDsgZ3MgPSBncy0+bmV4dCkKLQkgICAgaWYgKGdpLT5nb3RvYmogPT0gZ3MtPmdvdG9iaiAmJiBnaS0+YWRkZW5kID09IGdzLT5hZGRlbmQpCi0JICAgICAgZ290byBnb3RfZm91bmQ7Ci0JICBnaS0+bmV4dCA9IGhzLT5nb3RfZW50cmllczsKLQkgIGhzLT5nb3RfZW50cmllcyA9IGdpOwotCWdvdF9mb3VuZDo7Ci0JfQotICAgIH0KLSAgaGktPmdvdF9lbnRyaWVzID0gTlVMTDsKLQotICAvKiBBbmQgc2ltaWxhciBmb3IgdGhlIHJlbG9jIGVudHJpZXMuICAqLwotCi0gIGlmIChocy0+cmVsb2NfZW50cmllcyA9PSBOVUxMKQotICAgIGhzLT5yZWxvY19lbnRyaWVzID0gaGktPnJlbG9jX2VudHJpZXM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpyaSwgKnJzLCAqcmluLCAqcnNoOwotCi0gICAgICByc2ggPSBocy0+cmVsb2NfZW50cmllczsKLSAgICAgIGZvciAocmkgPSBoaS0+cmVsb2NfZW50cmllczsgcmkgOyByaSA9IHJpbikKLQl7Ci0JICByaW4gPSByaS0+bmV4dDsKLQkgIGZvciAocnMgPSByc2g7IHJzIDsgcnMgPSBycy0+bmV4dCkKLQkgICAgaWYgKHJpLT5ydHlwZSA9PSBycy0+cnR5cGUpCi0JICAgICAgewotCQlycy0+Y291bnQgKz0gcmktPmNvdW50OwotCQlnb3RvIGZvdW5kX3JlbG9jOwotCSAgICAgIH0KLQkgIHJpLT5uZXh0ID0gaHMtPnJlbG9jX2VudHJpZXM7Ci0JICBocy0+cmVsb2NfZW50cmllcyA9IHJpOwotCWZvdW5kX3JlbG9jOjsKLQl9Ci0gICAgfQotICBoaS0+cmVsb2NfZW50cmllcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIElzIGl0IHBvc3NpYmxlIHRvIG1lcmdlIHR3byBvYmplY3QgZmlsZSdzIC5nb3QgdGFibGVzPyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzIChhLCBiKQotICAgICBiZmQgKmEsICpiOwotewotICBpbnQgdG90YWwgPSBhbHBoYV9lbGZfdGRhdGEgKGEpLT50b3RhbF9nb3RfZW50cmllczsKLSAgYmZkICpic3ViOwotCi0gIC8qIFRyaXZpYWwgcXVpY2sgZmFsbG91dCB0ZXN0LiAgKi8KLSAgaWYgKHRvdGFsICsgYWxwaGFfZWxmX3RkYXRhIChiKS0+dG90YWxfZ290X2VudHJpZXMgPD0gTUFYX0dPVF9FTlRSSUVTKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEJ5IHRoZWlyIG5hdHVyZSwgbG9jYWwgLmdvdCBlbnRyaWVzIGNhbm5vdCBiZSBtZXJnZWQuICAqLwotICBpZiAoKHRvdGFsICs9IGFscGhhX2VsZl90ZGF0YSAoYiktPm5fbG9jYWxfZ290X2VudHJpZXMpID4gTUFYX0dPVF9FTlRSSUVTKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGYWlsaW5nIHRoZSBjb21tb24gdHJpdmlhbCBjb21wYXJpc29uLCB3ZSBtdXN0IGVmZmVjdGl2ZWx5Ci0gICAgIHBlcmZvcm0gdGhlIG1lcmdlLiAgTm90IGFjdHVhbGx5IHBlcmZvcm1pbmcgdGhlIG1lcmdlIG1lYW5zIHRoYXQKLSAgICAgd2UgZG9uJ3QgaGF2ZSB0byBzdG9yZSB1bmRvIGluZm9ybWF0aW9uIGluIGNhc2Ugd2UgZmFpbC4gICovCi0gIGZvciAoYnN1YiA9IGI7IGJzdWIgOyBic3ViID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hlcyA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChic3ViKTsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYnN1YiktPnN5bXRhYl9oZHI7Ci0gICAgICBpbnQgaSwgbjsKLQotICAgICAgbiA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzeW10YWJfaGRyLT5zaF9lbnRzaXplIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0JewotCSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmFlLCAqYmU7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IGhhc2hlc1tpXTsKLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICBmb3IgKGJlID0gaC0+Z290X2VudHJpZXM7IGJlIDsgYmUgPSBiZS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChiZS0+dXNlX2NvdW50ID09IDApCi0JICAgICAgICBjb250aW51ZTsKLQkgICAgICBpZiAoYmUtPmdvdG9iaiAhPSBiKQotCSAgICAgICAgY29udGludWU7Ci0KLQkgICAgICBmb3IgKGFlID0gaC0+Z290X2VudHJpZXM7IGFlIDsgYWUgPSBhZS0+bmV4dCkKLQkgICAgICAgIGlmIChhZS0+Z290b2JqID09IGEgJiYgYWUtPmFkZGVuZCA9PSBiZS0+YWRkZW5kKQotCQkgIGdvdG8gZ2xvYmFsX2ZvdW5kOwotCi0JICAgICAgaWYgKCsrdG90YWwgPiBNQVhfR09UX0VOVFJJRVMpCi0JICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGdsb2JhbF9mb3VuZDo7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBY3R1YWxseSBtZXJnZSB0d28gLmdvdCB0YWJsZXMuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyAoYSwgYikKLSAgICAgYmZkICphLCAqYjsKLXsKLSAgaW50IHRvdGFsID0gYWxwaGFfZWxmX3RkYXRhIChhKS0+dG90YWxfZ290X2VudHJpZXM7Ci0gIGJmZCAqYnN1YjsKLQotICAvKiBSZW1lbWJlciBsb2NhbCBleHBhbnNpb24uICAqLwotICB7Ci0gICAgaW50IGUgPSBhbHBoYV9lbGZfdGRhdGEgKGIpLT5uX2xvY2FsX2dvdF9lbnRyaWVzOwotICAgIHRvdGFsICs9IGU7Ci0gICAgYWxwaGFfZWxmX3RkYXRhIChhKS0+bl9sb2NhbF9nb3RfZW50cmllcyArPSBlOwotICB9Ci0KLSAgZm9yIChic3ViID0gYjsgYnN1YiA7IGJzdWIgPSBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5pbl9nb3RfbGlua19uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXM7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hlczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICAgICAgaW50IGksIG47Ci0KLSAgICAgIC8qIExldCB0aGUgbG9jYWwgLmdvdCBlbnRyaWVzIGtub3cgdGhleSBhcmUgcGFydCBvZiBhIG5ldyBzdWJzZWdtZW50LiAgKi8KLSAgICAgIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0gICAgICBpZiAobG9jYWxfZ290X2VudHJpZXMpCi0gICAgICAgIHsKLQkgIG4gPSBlbGZfdGRhdGEgKGJzdWIpLT5zeW10YWJfaGRyLnNoX2luZm87Ci0JICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmVudDsKLQkgICAgICBmb3IgKGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW2ldOyBlbnQ7IGVudCA9IGVudC0+bmV4dCkKLQkgICAgICAgIGVudC0+Z290b2JqID0gYTsKLQkgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qIE1lcmdlIHRoZSBnbG9iYWwgLmdvdCBlbnRyaWVzLiAgKi8KLSAgICAgIGhhc2hlcyA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChic3ViKTsKLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChic3ViKS0+c3ltdGFiX2hkcjsKLQotICAgICAgbiA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzeW10YWJfaGRyLT5zaF9lbnRzaXplIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0gICAgICAgIHsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICphZSwgKmJlLCAqKnBiZSwgKipzdGFydDsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gaGFzaGVzW2ldOwotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIHN0YXJ0ID0gJmgtPmdvdF9lbnRyaWVzOwotCSAgZm9yIChwYmUgPSBzdGFydCwgYmUgPSAqc3RhcnQ7IGJlIDsgcGJlID0gJmJlLT5uZXh0LCBiZSA9IGJlLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKGJlLT51c2VfY291bnQgPT0gMCkKLQkgICAgICAgIHsKLQkJICAqcGJlID0gYmUtPm5leHQ7Ci0JCSAgY29udGludWU7Ci0JICAgICAgICB9Ci0JICAgICAgaWYgKGJlLT5nb3RvYmogIT0gYikKLQkgICAgICAgIGNvbnRpbnVlOwotCi0JICAgICAgZm9yIChhZSA9ICpzdGFydDsgYWUgOyBhZSA9IGFlLT5uZXh0KQotCSAgICAgICAgaWYgKGFlLT5nb3RvYmogPT0gYSAmJiBhZS0+YWRkZW5kID09IGJlLT5hZGRlbmQpCi0JCSAgewotCQkgICAgYWUtPmZsYWdzIHw9IGJlLT5mbGFnczsKLQkJICAgIGFlLT51c2VfY291bnQgKz0gYmUtPnVzZV9jb3VudDsKLQkJICAgICpwYmUgPSBiZS0+bmV4dDsKLQkJICAgIGdvdG8gZ2xvYmFsX2ZvdW5kOwotCQkgIH0KLQkgICAgICBiZS0+Z290b2JqID0gYTsKLQkgICAgICB0b3RhbCArPSAxOwotCi0JICAgIGdsb2JhbF9mb3VuZDo7Ci0JICAgIH0KLSAgICAgICAgfQotCi0gICAgICBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5nb3RvYmogPSBhOwotICAgIH0KLSAgYWxwaGFfZWxmX3RkYXRhIChhKS0+dG90YWxfZ290X2VudHJpZXMgPSB0b3RhbDsKLQotICAvKiBNZXJnZSB0aGUgdHdvIGluX2dvdCBjaGFpbnMuICAqLwotICB7Ci0gICAgYmZkICpuZXh0OwotCi0gICAgYnN1YiA9IGE7Ci0gICAgd2hpbGUgKChuZXh0ID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCkgIT0gTlVMTCkKLSAgICAgIGJzdWIgPSBuZXh0OwotCi0gICAgYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCA9IGI7Ci0gIH0KLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBvZmZzZXRzIGZvciB0aGUgZ290IGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sIChoLCBhcmcpCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgYXJnOwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCi0gIGZvciAoZ290ZW50ID0gaC0+Z290X2VudHJpZXM7IGdvdGVudDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotICAgIGlmIChnb3RlbnQtPnVzZV9jb3VudCA+IDApCi0gICAgICB7Ci0JYmZkX3NpemVfdHlwZSAqcGxnZQotCSAgPSAmYWxwaGFfZWxmX3RkYXRhIChnb3RlbnQtPmdvdG9iaiktPmdvdC0+X3Jhd19zaXplOwotCi0JZ290ZW50LT5nb3Rfb2Zmc2V0ID0gKnBsZ2U7Ci0JKnBsZ2UgKz0gODsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHMgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmksICpnb3RfbGlzdCA9IGFscGhhX2VsZl9oYXNoX3RhYmxlKGluZm8pLT5nb3RfbGlzdDsKLQotICAvKiBGaXJzdCwgemVybyBvdXQgdGhlIC5nb3Qgc2l6ZXMsIGFzIHdlIG1heSBiZSByZWNhbGN1bGF0aW5nIHRoZQotICAgICAuZ290IGFmdGVyIG9wdGltaXppbmcgaXQuICAqLwotICBmb3IgKGkgPSBnb3RfbGlzdDsgaSA7IGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0gICAgYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9yYXdfc2l6ZSA9IDA7Ci0KLSAgLyogTmV4dCwgZmlsbCBpbiB0aGUgb2Zmc2V0cyBmb3IgYWxsIHRoZSBnbG9iYWwgZW50cmllcy4gICovCi0gIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQllbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzX2Zvcl9zeW1ib2wsCi0JCQkJTlVMTCk7Ci0KLSAgLyogRmluYWxseSwgZmlsbCBpbiB0aGUgb2Zmc2V0cyBmb3IgdGhlIGxvY2FsIGVudHJpZXMuICAqLwotICBmb3IgKGkgPSBnb3RfbGlzdDsgaSA7IGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBnb3Rfb2Zmc2V0ID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9yYXdfc2l6ZTsKLSAgICAgIGJmZCAqajsKLQotICAgICAgZm9yIChqID0gaTsgaiA7IGogPSBhbHBoYV9lbGZfdGRhdGEoaiktPmluX2dvdF9saW5rX25leHQpCi0JewotCSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllcywgKmdvdGVudDsKLQkgIGludCBrLCBuOwotCi0JICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YShqKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0JICBpZiAoIWxvY2FsX2dvdF9lbnRyaWVzKQotCSAgICBjb250aW51ZTsKLQotCSAgZm9yIChrID0gMCwgbiA9IGVsZl90ZGF0YShqKS0+c3ltdGFiX2hkci5zaF9pbmZvOyBrIDwgbjsgKytrKQotCSAgICBmb3IgKGdvdGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW2tdOyBnb3RlbnQ7IGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLQkgICAgICBpZiAoZ290ZW50LT51c2VfY291bnQgPiAwKQotCSAgICAgICAgewotCQkgIGdvdGVudC0+Z290X29mZnNldCA9IGdvdF9vZmZzZXQ7Ci0JCSAgZ290X29mZnNldCArPSA4OwotCSAgICAgICAgfQotCX0KLQotICAgICAgYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9yYXdfc2l6ZSA9IGdvdF9vZmZzZXQ7Ci0gICAgICBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdC0+X2Nvb2tlZF9zaXplID0gZ290X29mZnNldDsKLSAgICB9Ci19Ci0KLS8qIENvbnN0cnVjdHMgdGhlIGdvdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqaSwgKmdvdF9saXN0LCAqY3VyX2dvdF9vYmo7Ci0gIGludCBzb21ldGhpbmdfY2hhbmdlZCA9IDA7Ci0KLSAgZ290X2xpc3QgPSBhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9saXN0OwotCi0gIC8qIE9uIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHByZXRlbmQgd2UgaGF2ZSBhbiBleGlzdGluZyBnb3QgbGlzdAotICAgICBjb25zaXN0aW5nIG9mIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICBpZiAoZ290X2xpc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBpbmZvLT5pbnB1dF9iZmRzOyBpIDsgaSA9IGktPmxpbmtfbmV4dCkKLQl7Ci0JICBiZmQgKnRoaXNfZ290ID0gYWxwaGFfZWxmX3RkYXRhIChpKS0+Z290b2JqOwotCSAgaWYgKHRoaXNfZ290ID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBXZSBhcmUgYXNzdW1pbmcgbm8gbWVyZ2luZyBoYXMgeWV0IG9jdXJyZWQuICAqLwotCSAgQkZEX0FTU0VSVCAodGhpc19nb3QgPT0gaSk7Ci0KLSAgICAgICAgICBpZiAoYWxwaGFfZWxmX3RkYXRhICh0aGlzX2dvdCktPnRvdGFsX2dvdF9lbnRyaWVzID4gTUFYX0dPVF9FTlRSSUVTKQotCSAgICB7Ci0JICAgICAgLyogWWlrZXMhIEEgc2luZ2xlIG9iamVjdCBmaWxlIGhhcyB0b28gbWFueSBlbnRyaWVzLiAgKi8KLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgIChfKCIlczogLmdvdCBzdWJzZWdtZW50IGV4Y2VlZHMgNjRLIChzaXplICVkKSIpLAotCSAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGkpLAotCSAgICAgICAgIGFscGhhX2VsZl90ZGF0YSAodGhpc19nb3QpLT50b3RhbF9nb3RfZW50cmllcyAqIDgpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoZ290X2xpc3QgPT0gTlVMTCkKLQkgICAgZ290X2xpc3QgPSB0aGlzX2dvdDsKLQkgIGVsc2UKLQkgICAgYWxwaGFfZWxmX3RkYXRhKGN1cl9nb3Rfb2JqKS0+Z290X2xpbmtfbmV4dCA9IHRoaXNfZ290OwotCSAgY3VyX2dvdF9vYmogPSB0aGlzX2dvdDsKLQl9Ci0KLSAgICAgIC8qIFN0cmFuZ2UgZGVnZW5lcmF0ZSBjYXNlIG9mIG5vIGdvdCByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGlmIChnb3RfbGlzdCA9PSBOVUxMKQotCXJldHVybiB0cnVlOwotCi0gICAgICBhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9saXN0ID0gZ290X2xpc3Q7Ci0KLSAgICAgIC8qIEZvcmNlIGdvdCBvZmZzZXRzIHRvIGJlIHJlY2FsY3VsYXRlZC4gICovCi0gICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IDE7Ci0gICAgfQotCi0gIGN1cl9nb3Rfb2JqID0gZ290X2xpc3Q7Ci0gIGkgPSBhbHBoYV9lbGZfdGRhdGEoY3VyX2dvdF9vYmopLT5nb3RfbGlua19uZXh0OwotICB3aGlsZSAoaSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cyAoY3VyX2dvdF9vYmosIGkpKQotCXsKLQkgIGVsZjY0X2FscGhhX21lcmdlX2dvdHMgKGN1cl9nb3Rfb2JqLCBpKTsKLQkgIGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQ7Ci0JICBhbHBoYV9lbGZfdGRhdGEoY3VyX2dvdF9vYmopLT5nb3RfbGlua19uZXh0ID0gaTsKLQkgIHNvbWV0aGluZ19jaGFuZ2VkID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VyX2dvdF9vYmogPSBpOwotCSAgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dDsKLQl9Ci0gICAgfQotCi0gIC8qIE9uY2UgdGhlIGdvdHMgaGF2ZSBiZWVuIG1lcmdlZCwgZmlsbCBpbiB0aGUgZ290IG9mZnNldHMgZm9yCi0gICAgIGV2ZXJ5dGhpbmcgdGhlcmVpbi4gICovCi0gIGlmICgxIHx8IHNvbWV0aGluZ19jaGFuZ2VkKQotICAgIGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHMgKGluZm8pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqaTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0LCB0YWtlIGNhcmUgb2YgdGhlIGluZGlyZWN0IHN5bWJvbHMgY3JlYXRlZCBieSB2ZXJzaW9uaW5nLiAgKi8KLSAgYWxwaGFfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCWVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzLAotCQkJCU5VTEwpOwotCi0gIGlmICghZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIG9mIHRoZSAuZ290IHN1YnNlY3Rpb25zLiAgKi8KLSAgaSA9IGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Z290X2xpc3Q7Ci0gIGZvciAoIDsgaSA7IGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnMgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdDsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGksIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdvcmsgb3V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMgKGgsIGluZm8pCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgLyogSWYgdGhlIHN5bWJvbCB3YXMgZGVmaW5lZCBhcyBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdAotICAgICBmaWxlLCBhbmQgdGhlcmUgd2FzIG5vIGRlZmluaXRpb24gaW4gYW55IGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZQotICAgICBsaW5rZXIgd2lsbCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIHN5bWJvbCBpbiBhIGNvbW1vbgotICAgICBzZWN0aW9uIGJ1dCB0aGUgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiBmbGFnIHdpbGwgbm90IGhhdmUgYmVlbgotICAgICBzZXQuICBUaGlzIGlzIGRvbmUgZm9yIGR5bmFtaWMgc3ltYm9scyBpbgotICAgICBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGJ1dCB0aGlzIGlzIG5vdCBkb25lIGZvciBub24tZHluYW1pYwotICAgICBzeW1ib2xzLCBzb21laG93LiAgKi8KLSAgaWYgKCgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0gICAgICAgJiAoRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUgotCSAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JICB8IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpKQotICAgICAgID09IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiAhKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSkKLSAgICB7Ci0gICAgICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBkeW5hbWljLCB3ZSdsbCBuZWVkIGFsbCB0aGUgcmVsb2NhdGlvbnMgaW4gdGhlaXIKLSAgICAgbmF0dXJhbCBmb3JtLiAgSWYgdGhpcyBpcyBhIHNoYXJlZCBvYmplY3QsIGFuZCBpdCBoYXMgYmVlbiBmb3JjZWQKLSAgICAgbG9jYWwsIHdlJ2xsIG5lZWQgdGhlIHNhbWUgbnVtYmVyIG9mIFJFTEFUSVZFIHJlbG9jYXRpb25zLiAgKi8KLQotICBpZiAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBpbmZvKSB8fCBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqcmVsZW50OwotICAgICAgYmZkICpkeW5vYmo7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotICAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBmb3IgKHJlbGVudCA9IGgtPnJlbG9jX2VudHJpZXM7IHJlbGVudDsgcmVsZW50ID0gcmVsZW50LT5uZXh0KQotCWlmIChyZWxlbnQtPnJ0eXBlID09IFJfQUxQSEFfUkVGTE9ORwotCSAgICB8fCByZWxlbnQtPnJ0eXBlID09IFJfQUxQSEFfUkVGUVVBRCkKLQkgIHsKLQkgICAgcmVsZW50LT5zcmVsLT5fcmF3X3NpemUgKz0KLQkgICAgICBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiByZWxlbnQtPmNvdW50OwotCSAgfQotCi0gICAgICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICAgICAgY291bnQgPSAwOwotCi0gICAgICBmb3IgKGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOyBnb3RlbnQgOyBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JY291bnQrKzsKLQotICAgICAgLyogSWYgd2UgYXJlIHVzaW5nIGEgLnBsdCBlbnRyeSwgc3VidHJhY3Qgb25lLCBhcyB0aGUgZmlyc3QKLQkgcmVmZXJlbmNlIHVzZXMgYSAucmVsYS5wbHQgZW50cnkgaW5zdGVhZC4gICovCi0gICAgICBpZiAoaC0+cm9vdC5wbHQub2Zmc2V0ICE9IE1JTlVTX09ORSkKLQljb3VudC0tOwotCi0gICAgICBpZiAoY291bnQgPiAwKQotCXsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCSAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGJvb2xlYW4gcmVscGx0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSd2ZSBzZWVuIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMsIHdlIGNhbiBkZWNpZGUgd2hpY2gKLQkgc3ltYm9scyBuZWVkIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIGFuZCB3aGljaCBkb24ndC4gIFdlJ3ZlCi0JIGNvbGxlY3RlZCBpbmZvcm1hdGlvbiBpbiBjaGVja19yZWxvY3MgdGhhdCB3ZSBjYW4gbm93IGFwcGx5IHRvCi0JIHNpemUgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBzZWN0aW9ucy4gICovCi0gICAgICBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlIChhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgIGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzLAotCQkJCSAgICBpbmZvKTsKLQotICAgICAgLyogV2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLCBlYWNoIGxvY2FsIC5nb3QgZW50cnkgbmVlZHMgYQotCSBSRUxBVElWRSByZWxvYy4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkKQotCXsKLQkgIGJmZCAqaTsKLQkgIGFzZWN0aW9uICpzcmVsOwotCSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLQotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0KLQkgIGZvciAoaSA9IGFscGhhX2VsZl9oYXNoX3RhYmxlKGluZm8pLT5nb3RfbGlzdCwgY291bnQgPSAwOwotCSAgICAgICBpICE9IE5VTEw7Ci0JICAgICAgIGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0JICAgIGNvdW50ICs9IGFscGhhX2VsZl90ZGF0YShpKS0+bl9sb2NhbF9nb3RfZW50cmllczsKLQotCSAgc3JlbC0+X3Jhd19zaXplICs9IGNvdW50ICogc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCX0KLSAgICB9Ci0gIC8qIGVsc2Ugd2UncmUgbm90IGR5bmFtaWMgYW5kIGJ5IGRlZmluaXRpb24gd2UgZG9uJ3QgbmVlZCBzdWNoIHRoaW5ncy4gICovCi0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIHJlbHBsdCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoIShzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCi0JIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQKLQkgaW4gY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgaXQgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZQotCSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLiAgVGhlCi0JIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZAotCSBpdCBpcyB0aGF0IGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0bwotCSBnbyBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgc3RyaXAgPSAocy0+X3Jhd19zaXplID09IDApOwotCi0JICBpZiAoIXN0cmlwKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIGlmIChzdHJjbXAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCi0JCXJlbHBsdCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBkeW5hbWljIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQlfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKGluZm8sIHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyhkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIEFscGhhIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIGFzZWN0aW9uICpzZWMsICpzZ290LCAqc3JlbCwgKnNyZWxnb3Q7Ci0gIGJmZCAqZHlub2JqLCAqZ290b2JqOwotICBiZmRfdm1hIGdwOwotCi0gIHNyZWxnb3QgPSBzcmVsID0gTlVMTDsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqKQotICAgIHsKLSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgfQotCi0gIC8qIEZpbmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIGlucHV0IGJmZC4gICovCi0gIHNnb3QgPSBOVUxMOwotICBncCA9IDA7Ci0gIGdvdG9iaiA9IGFscGhhX2VsZl90ZGF0YSAoaW5wdXRfYmZkKS0+Z290b2JqOwotICBpZiAoZ290b2JqKQotICAgIHsKLSAgICAgIHNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdG9iaiktPmdvdDsKLSAgICAgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGdvdG9iaik7Ci0gICAgICBpZiAoZ3AgPT0gMCkKLQl7Ci0JICBncCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkrIDB4ODAwMCk7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoZ290b2JqLCBncCk7Ci0JfQotICAgIH0KLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEY2NF9SX1RZUEUocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfQUxQSEFfbWF4KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmNjRfYWxwaGFfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0KLQkgIC8qIFRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIEdQRElTUCBhbmQgTElUVVNFIGlzIAotCSAgICAgaW1tYXRlcmlhbC4gIE9ubHkgdGhlIGFkZGVuZCBpcyBzaWduaWZpY2FudC4gICovCi0JICBpZiAocl90eXBlID09IFJfQUxQSEFfR1BESVNQIHx8IHJfdHlwZSA9PSBSX0FMUEhBX0xJVFVTRSkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKLQotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCi0jaWYgcnRoX25vdGRlZgotCSAgICAgIGlmICgocl90eXBlID09IFJfQUxQSEFfTElURVJBTAotCQkgICAmJiBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICYmICghaW5mby0+c2hhcmVkCi0JCSAgICAgICB8fCAhaW5mby0+c3ltYm9saWMKLQkJICAgICAgIHx8ICEoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoIWluZm8tPnN5bWJvbGljCi0JCQkgIHx8ICEoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotCQkgICAgICAmJiAocl90eXBlID09IFJfQUxQSEFfUkVGTE9ORwotCQkJICB8fCByX3R5cGUgPT0gUl9BTFBIQV9SRUZRVUFECi0JCQkgIHx8IHJfdHlwZSA9PSBSX0FMUEhBX0xJVEVSQUwpKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uIHZhbHVlLgotCQkgICAgIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUgb2JzY3VyZSBjYXNlcwotCQkgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotI2Vsc2UKLQkgICAgICAvKiBGSVhNRTogQXJlIG5vdCB0aGVzZSBvYnNjdXJlIGNhc2VzIHNpbXBseSBidWdzPyAgTGV0J3MKLQkJIGdldCBzb21ldGhpbmcgd29ya2luZyBhbmQgY29tZSBiYWNrIHRvIHRoaXMuICAqLwotCSAgICAgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCXJlbG9jYXRpb24gPSAwOwotI2VuZGlmIC8qIHJ0aF9ub3RkZWYgKi8KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkJCSsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0LAotCQkgICAgICghaW5mby0+c2hhcmVkIHx8IGluZm8tPm5vX3VuZGVmaW5lZCkpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotICAgICAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9BTFBIQV9HUERJU1A6Ci0JICB7Ci0JICAgIGJmZF9ieXRlICpwX2xkYWgsICpwX2xkYTsKLQotCSAgICBCRkRfQVNTRVJUKGdwICE9IDApOwotCi0JICAgIHJlbG9jYXRpb24gPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgICBwX2xkYWggPSBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIHBfbGRhID0gcF9sZGFoICsgcmVsLT5yX2FkZGVuZDsKLQotCSAgICByID0gZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwIChpbnB1dF9iZmQsIGdwIC0gcmVsb2NhdGlvbiwKLQkJCQkJICAgICBwX2xkYWgsIHBfbGRhKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FMUEhBX09QX1BVU0g6Ci0JY2FzZSBSX0FMUEhBX09QX1NUT1JFOgotCWNhc2UgUl9BTFBIQV9PUF9QU1VCOgotCWNhc2UgUl9BTFBIQV9PUF9QUlNISUZUOgotCSAgLyogV2UgaGF0ZSB0aGVzZSBzaWxseSBiZWFzdHMuICAqLwotCSAgYWJvcnQoKTsKLQotCWNhc2UgUl9BTFBIQV9MSVRFUkFMOgotCSAgewotCSAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCSAgICBib29sZWFuIGR5bmFtaWNfc3ltYm9sOwotCi0JICAgIEJGRF9BU1NFUlQoc2dvdCAhPSBOVUxMKTsKLQkgICAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIHsKLQkJZ290ZW50ID0gaC0+Z290X2VudHJpZXM7Ci0JCWR5bmFtaWNfc3ltYm9sID0gYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBpbmZvKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWdvdGVudCA9IChhbHBoYV9lbGZfdGRhdGEoaW5wdXRfYmZkKS0+Ci0JCQkgIGxvY2FsX2dvdF9lbnRyaWVzW3Jfc3ltbmR4XSk7Ci0JCWR5bmFtaWNfc3ltYm9sID0gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIEJGRF9BU1NFUlQoZ290ZW50ICE9IE5VTEwpOwotCi0JICAgIHdoaWxlIChnb3RlbnQtPmdvdG9iaiAhPSBnb3RvYmogfHwgZ290ZW50LT5hZGRlbmQgIT0gYWRkZW5kKQotCSAgICAgIGdvdGVudCA9IGdvdGVudC0+bmV4dDsKLQotCSAgICBCRkRfQVNTRVJUKGdvdGVudC0+dXNlX2NvdW50ID49IDEpOwotCi0JICAgIC8qIEluaXRpYWxpemUgdGhlIC5nb3QgZW50cnkncyB2YWx1ZS4gICovCi0JICAgIGlmICghKGdvdGVudC0+ZmxhZ3MgJiBBTFBIQV9FTEZfR09UX0VOVFJZX1JFTE9DU19ET05FKSkKLQkgICAgICB7Ci0JCWJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24rYWRkZW5kLAotCQkJICAgIHNnb3QtPmNvbnRlbnRzICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQotCQkvKiBJZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGZvcmNlZCBsb2NhbCwgb3V0cHV0IGEKLQkJICAgUkVMQVRJVkUgcmVsb2MsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGhhbmRsZWQgaW4KLQkJICAgZmluaXNoX2R5bmFtaWNfc3ltYm9sLiAgKi8KLQkJaWYgKGluZm8tPnNoYXJlZCAmJiAhZHluYW1pY19zeW1ib2wpCi0JCSAgewotCQkgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICBCRkRfQVNTRVJUKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCSAgICAgICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JCSAgICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKDAsIFJfQUxQSEFfUkVMQVRJVkUpOwotCQkgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQotCQkgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICAgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICAgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkgICAgICAgKyBzcmVsZ290LT5yZWxvY19jb3VudCsrKTsKLQkJICAgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKQotCQkJCSogc3JlbGdvdC0+cmVsb2NfY291bnQKLQkJCQk8PSBzcmVsZ290LT5fY29va2VkX3NpemUpOwotCQkgIH0KLQotCQlnb3RlbnQtPmZsYWdzIHw9IEFMUEhBX0VMRl9HT1RfRU5UUllfUkVMT0NTX0RPTkU7Ci0JICAgICAgfQotCi0JICAgIC8qIEZpZ3VyZSB0aGUgZ3ByZWwgcmVsb2NhdGlvbi4gICovCi0JICAgIGFkZGVuZCA9IDA7Ci0JICAgIHJlbG9jYXRpb24gPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCSAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCSAgICByZWxvY2F0aW9uIC09IGdwOwotCSAgfQotCSAgLyogb3ZlcmZsb3cgaGFuZGxlZCBieSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKi8KLQkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCWNhc2UgUl9BTFBIQV9HUFJFTDMyOgotCWNhc2UgUl9BTFBIQV9HUFJFTExPVzoKLQkgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7Ci0JICByZWxvY2F0aW9uIC09IGdwOwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX0dQUkVMSElHSDoKLQkgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7Ci0JICByZWxvY2F0aW9uIC09IGdwOwotCSAgcmVsb2NhdGlvbiArPSBhZGRlbmQ7Ci0JICBhZGRlbmQgPSAwOwotCSAgcmVsb2NhdGlvbiA9ICgoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID4+IDE2KQotCQkJKyAoKHJlbG9jYXRpb24gPj4gMTUpICYgMSkpOwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX0JSQUREUjoKLQljYXNlIFJfQUxQSEFfSElOVDoKLQkgIC8qIFRoZSByZWd1bGFyIFBDLXJlbGF0aXZlIHN0dWZmIG1lYXN1cmVzIGZyb20gdGhlIHN0YXJ0IG9mCi0JICAgICB0aGUgaW5zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gdGhlIGVuZC4gICovCi0JICBhZGRlbmQgLT0gNDsKLQkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCWNhc2UgUl9BTFBIQV9SRUZMT05HOgotCWNhc2UgUl9BTFBIQV9SRUZRVUFEOgotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JICAgIGJvb2xlYW4gc2tpcDsKLQotCSAgICAvKiBDYXJlZnVsIGhlcmUgdG8gcmVtZW1iZXIgUkVMQVRJVkUgcmVsb2NhdGlvbnMgZm9yIGdsb2JhbAotCSAgICAgICB2YXJpYWJsZXMgZm9yIHN5bWJvbGljIHNoYXJlZCBvYmplY3RzLiAgKi8KLQotCSAgICBpZiAoaCAmJiBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGluZm8pKQotCSAgICAgIHsKLQkJQkZEX0FTU0VSVChoLT5yb290LmR5bmluZHggIT0gLTEpOwotCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKGgtPnJvb3QuZHluaW5keCwgcl90eXBlKTsKLQkJb3V0cmVsLnJfYWRkZW5kID0gYWRkZW5kOwotCQlhZGRlbmQgPSAwLCByZWxvY2F0aW9uID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgICB7Ci0JCW91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oMCwgUl9BTFBIQV9SRUxBVElWRSk7Ci0JCW91dHJlbC5yX2FkZGVuZCA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JICAgIGlmICghc3JlbCkKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkoaW5wdXRfYmZkLCBlbGZfZWxmaGVhZGVyKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgZWxmX3NlY3Rpb25fZGF0YShpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCUJGRF9BU1NFUlQobmFtZSAhPSBOVUxMKTsKLQotCQlzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCUJGRF9BU1NFUlQoc3JlbCAhPSBOVUxMKTsKLQkgICAgICB9Ci0KLQkgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYmZkX3ZtYSBvZmY7Ci0KLQkJb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkgICAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCWlucHV0X3NlY3Rpb24sCi0JCQkmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCXJlbC0+cl9vZmZzZXQpKTsKLQkJaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgc2tpcCA9IHRydWU7Ci0JCW91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgc2tpcCkKLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgIGVsc2UKLQkgICAgICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCi0JICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQlzcmVsLT5jb250ZW50cykKLQkJCQkgICAgICAgKyBzcmVsLT5yZWxvY19jb3VudCsrKTsKLQkgICAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpICogc3JlbC0+cmVsb2NfY291bnQKLQkJCTw9IHNyZWwtPl9jb29rZWRfc2l6ZSk7Ci0JICB9Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQlkZWZhdWx0OgotCWRlZmF1bHRfcmVsb2M6Ci0JICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcmVsLT5yX29mZnNldCwgcmVsb2NhdGlvbiwKLQkJCQkJYWRkZW5kKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoIChyKQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCShpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgICB9Ci0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gTUlOVVNfT05FKQotICAgIHsKLSAgICAgIC8qIEZpbGwgaW4gdGhlIC5wbHQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGFzZWN0aW9uICpzcGx0LCAqc2dvdCwgKnNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0gICAgICBiZmRfdm1hIGdvdF9hZGRyLCBwbHRfYWRkcjsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCAuZ290IGVudHJ5IHdpbGwgYmUgdXBkYXRlZCBieSB0aGUgLnBsdCB3aXRoIHRoZQotCSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgZnVuY3Rpb24uICAqLwotICAgICAgZ290ZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoKS0+Z290X2VudHJpZXM7Ci0gICAgICBCRkRfQVNTRVJUIChnb3RlbnQgJiYgZ290ZW50LT5hZGRlbmQgPT0gMCk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoZ290ZW50LT5nb3RvYmopLT5nb3Q7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCi0gICAgICBnb3RfYWRkciA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotICAgICAgcGx0X2FkZHIgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICsgaC0+cGx0Lm9mZnNldCk7Ci0KLSAgICAgIHBsdF9pbmRleCA9IChoLT5wbHQub2Zmc2V0IC0gUExUX0hFQURFUl9TSVpFKSAvIFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgewotCXVuc2lnbmVkIGluc24xLCBpbnNuMiwgaW5zbjM7Ci0KLQlpbnNuMSA9IFBMVF9FTlRSWV9XT1JEMSB8ICgoLShoLT5wbHQub2Zmc2V0ICsgNCkgPj4gMikgJiAweDFmZmZmZik7Ci0JaW5zbjIgPSBQTFRfRU5UUllfV09SRDI7Ci0JaW5zbjMgPSBQTFRfRU5UUllfV09SRDM7Ci0KLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuMSwgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0KTsKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuMiwgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgNCk7Ci0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbjMsIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDgpOwotICAgICAgfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gZ290X2FkZHI7Ci0gICAgICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKGgtPmR5bmluZHgsIFJfQUxQSEFfSk1QX1NMT1QpOwotICAgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopc3JlbC0+Y29udGVudHMKLQkJCQkgICsgcGx0X2luZGV4KSk7Ci0KLSAgICAgIGlmICghKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluIHRoZQotCSAgICAgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyaWVzIGluIHRoZSAuZ290LiAgKi8KLSAgICAgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHBsdF9hZGRyLCBzZ290LT5jb250ZW50cyArIGdvdGVudC0+Z290X29mZnNldCk7Ci0KLSAgICAgIC8qIFN1YnNlcXVlbnQgLmdvdCBlbnRyaWVzIHdpbGwgY29udGludWUgdG8gYm91bmNlIHRocm91Z2ggdGhlIC5wbHQuICAqLwotICAgICAgaWYgKGdvdGVudC0+bmV4dCkKLQl7Ci0JICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgQkZEX0FTU0VSVCAoISBpbmZvLT5zaGFyZWQgfHwgc3JlbCAhPSBOVUxMKTsKLQotCSAgZ290ZW50ID0gZ290ZW50LT5uZXh0OwotCSAgZG8KLQkgICAgewotCSAgICAgIHNnb3QgPSBhbHBoYV9lbGZfdGRhdGEoZ290ZW50LT5nb3RvYmopLT5nb3Q7Ci0JICAgICAgQkZEX0FTU0VSVChzZ290ICE9IE5VTEwpOwotCSAgICAgIEJGRF9BU1NFUlQoZ290ZW50LT5hZGRlbmQgPT0gMCk7Ci0KLQkgICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCBwbHRfYWRkciwKLQkJICAgICAgICAgIHNnb3QtPmNvbnRlbnRzICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTygwLCBSX0FMUEhBX1JFTEFUSVZFKTsKLQkJICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCi0JCSAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgICAgc3JlbC0+Y29udGVudHMpCi0JCQkJCSAgICAgKyBzcmVsLT5yZWxvY19jb3VudCsrKTsKLQkJICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBzcmVsLT5yZWxvY19jb3VudAotCQkJICAgICAgPD0gc3JlbC0+X2Nvb2tlZF9zaXplKTsKLQkJfQotCi0JICAgICAgZ290ZW50ID0gZ290ZW50LT5uZXh0OwotCSAgICB9Ci0gICAgICAgICAgd2hpbGUgKGdvdGVudCAhPSBOVUxMKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoaCwgaW5mbykpCi0gICAgewotICAgICAgLyogRmlsbCBpbiB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyBmb3IgdGhpcyBzeW1ib2wncyAuZ290IGVudHJpZXMuICAqLwotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLQotICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BTFBIQV9HTE9CX0RBVCk7Ci0gICAgICBmb3IgKGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmdvdF9lbnRyaWVzOwotCSAgIGdvdGVudCAhPSBOVUxMOwotCSAgIGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLQl7Ci0JICBhc2VjdGlvbiAqc2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoZ290ZW50LT5nb3RvYmopLT5nb3Q7Ci0JICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCSAgb3V0cmVsLnJfYWRkZW5kID0gZ290ZW50LT5hZGRlbmQ7Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKilzcmVsLT5jb250ZW50cwotCQkJCSAgICAgICsgc3JlbC0+cmVsb2NfY291bnQrKykpOwotCSAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpICogc3JlbC0+cmVsb2NfY291bnQKLQkJICAgICAgPD0gc3JlbC0+X2Nvb2tlZF9zaXplKTsKLQl9Ci0gICAgfQotCi0gIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmNjRfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgYmZkX2VsZjY0X3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUExUR09UOgotCSAgICAgIG5hbWUgPSAiLnBsdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1BMVFJFTFNaOgotCSAgICAgIG5hbWUgPSAiLnJlbGEucGx0IjsKLQkgICAgICBnb3RvIGdldF9zaXplOwotCSAgICBjYXNlIERUX0pNUFJFTDoKLQkgICAgICBuYW1lID0gIi5yZWxhLnBsdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCi0JICAgIGNhc2UgRFRfUkVMQVNaOgotCSAgICAgIC8qIE15IGludGVycHJldGF0aW9uIG9mIHRoZSBUSVMgdjEuMSBFTEYgZG9jdW1lbnQgaW5kaWNhdGVzCi0JCSB0aGF0IFJFTEFTWiBzaG91bGQgbm90IGluY2x1ZGUgSk1QUkVMLiAgVGhpcyBpcyBub3Qgd2hhdAotCQkgdGhlIHJlc3Qgb2YgdGhlIEJGRCBkb2VzLiAgSXQgaXMsIGhvd2V2ZXIsIHdoYXQgdGhlCi0JCSBnbGliYyBsZC5zbyB3YW50cy4gIERvIHRoaXMgZml4dXAgaGVyZSB1bnRpbCB3ZSBmb3VuZAotCQkgb3V0IHdobyBpcyByaWdodC4gICovCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbGEucGx0Iik7Ci0JICAgICAgaWYgKHMpCi0JCXsKLQkJICBkeW4uZF91bi5kX3ZhbCAtPQotCQkgICAgKHMtPl9jb29rZWRfc2l6ZSA/IHMtPl9jb29rZWRfc2l6ZSA6IHMtPl9yYXdfc2l6ZSk7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSAocyA/IHMtPnZtYSA6IDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGdldF9zaXplOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPQotCQkocy0+X2Nvb2tlZF9zaXplID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBiZmRfZWxmNjRfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCX0KLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgUExUMCBlbnRyeSAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JEMSwgc3BsdC0+Y29udGVudHMpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JEMiwgc3BsdC0+Y29udGVudHMgKyA0KTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDMsIHNwbHQtPmNvbnRlbnRzICsgOCk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQ0LCBzcGx0LT5jb250ZW50cyArIDEyKTsKLQotCSAgLyogVGhlIG5leHQgdHdvIHdvcmRzIHdpbGwgYmUgZmlsbGVkIGluIGJ5IGxkLnNvICovCi0JICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCAwLCBzcGx0LT5jb250ZW50cyArIDE2KTsKLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIDAsIHNwbHQtPmNvbnRlbnRzICsgMjQpOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCSAgICBQTFRfSEVBREVSX1NJWkU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsIGxpbmsgcm91dGluZSB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIGFuZAotICAgdGhlIC5tZGVidWcgc2VjdGlvbnMuICBXZSBuZWVkIHRvIG1lcmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlc2UKLSAgIHNlY3Rpb25zIHRvZ2V0aGVyLCBub3Qgd3JpdGUgdGhlbSBhbGwgb3V0IHNlcXVlbnRpYWxseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBhc2VjdGlvbiAqcmVnaW5mb19zZWMsICptZGVidWdfc2VjLCAqZ3B0YWJfZGF0YV9zZWMsICpncHRhYl9ic3Nfc2VjOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1ZzsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAKLSAgICA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgSERSUiAqc3ltaGRyID0gJmRlYnVnLnN5bWJvbGljX2hlYWRlcjsKLSAgUFRSIG1kZWJ1Z19oYW5kbGUgPSBOVUxMOwotCi0jaWYgMAotCSAgICAgIGlmICgrK25nb3RzID09IDIpCi0JCXsKLQkJICAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBfKCJ1c2luZyBtdWx0aXBsZSBncCB2YWx1ZXMiKSwgKGNoYXIgKikgTlVMTCwKLQkJICAgICBvdXRwdXRfYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApOwotCQl9Ci0jZW5kaWYKLQotICAvKiBHbyB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY29sbGVjdCB0aGUgLnJlZ2luZm8gYW5kIC5tZGVidWcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICByZWdpbmZvX3NlYyA9IE5VTEw7Ci0gIG1kZWJ1Z19zZWMgPSBOVUxMOwotICBncHRhYl9kYXRhX3NlYyA9IE5VTEw7Ci0gIGdwdGFiX2Jzc19zZWMgPSBOVUxMOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIucmVnaW5mbyIpID09IDApCi0JewotCSAgbWVtc2V0ICgmcmVnaW5mbywgMCwgc2l6ZW9mIHJlZ2luZm8pOwotCi0JICAvKiBXZSBoYXZlIGZvdW5kIHRoZSAucmVnaW5mbyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLQkgICAgICBFbGY2NF9SZWdJbmZvIHN1YjsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogVGhlIGxpbmtlciBlbXVsYXRpb24gY29kZSBoYXMgcHJvYmFibHkgY2xvYmJlcmVkIHRoZQotICAgICAgICAgICAgICAgICBzaXplIHRvIGJlIHplcm8gYnl0ZXMuICAqLwotCSAgICAgIGlmIChpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKLQkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICAoUFRSKSAmZXh0LAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCSAgICAgIHNpemVvZiBleHQpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9yZWdpbmZvX2luIChpbnB1dF9iZmQsICZleHQsICZzdWIpOwotCi0JICAgICAgcmVnaW5mby5yaV9ncHJtYXNrIHw9IHN1Yi5yaV9ncHJtYXNrOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1swXSB8PSBzdWIucmlfY3BybWFza1swXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMV0gfD0gc3ViLnJpX2Nwcm1hc2tbMV07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzJdIHw9IHN1Yi5yaV9jcHJtYXNrWzJdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1szXSB8PSBzdWIucmlfY3BybWFza1szXTsKLQotCSAgICAgIC8qIHJpX2dwX3ZhbHVlIGlzIHNldCBieSB0aGUgZnVuY3Rpb24KLQkJIGFscGhhX2VsZl9zZWN0aW9uX3Byb2Nlc3Npbmcgd2hlbiB0aGUgc2VjdGlvbiBpcwotCQkgZmluYWxseSB3cml0dGVuIG91dC4gICovCi0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogRm9yY2UgdGhlIHNlY3Rpb24gc2l6ZSB0byB0aGUgdmFsdWUgd2Ugd2FudC4gICovCi0JICBvLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgcmVnaW5mb19zZWMgPSBvOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLm1kZWJ1ZyIpID09IDApCi0JewotCSAgc3RydWN0IGV4dHN5bV9pbmZvIGVpbmZvOwotCi0JICAvKiBXZSBoYXZlIGZvdW5kIHRoZSAubWRlYnVnIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgotCSAgICAgTG9vayB0aHJvdWdoIGFsbCB0aGUgbGlua19vcmRlcnMgY29tcHJpc2luZyBpdCBhbmQgbWVyZ2UKLQkgICAgIHRoZSBpbmZvcm1hdGlvbiB0b2dldGhlci4gICovCi0JICBzeW1oZHItPm1hZ2ljID0gc3dhcC0+c3ltX21hZ2ljOwotCSAgLyogRklYTUU6IFdoYXQgc2hvdWxkIHRoZSB2ZXJzaW9uIHN0YW1wIGJlPyAgKi8KLQkgIHN5bWhkci0+dnN0YW1wID0gMDsKLQkgIHN5bWhkci0+aWxpbmVNYXggPSAwOwotCSAgc3ltaGRyLT5jYkxpbmUgPSAwOwotCSAgc3ltaGRyLT5pZG5NYXggPSAwOwotCSAgc3ltaGRyLT5pcGRNYXggPSAwOwotCSAgc3ltaGRyLT5pc3ltTWF4ID0gMDsKLQkgIHN5bWhkci0+aW9wdE1heCA9IDA7Ci0JICBzeW1oZHItPmlhdXhNYXggPSAwOwotCSAgc3ltaGRyLT5pc3NNYXggPSAwOwotCSAgc3ltaGRyLT5pc3NFeHRNYXggPSAwOwotCSAgc3ltaGRyLT5pZmRNYXggPSAwOwotCSAgc3ltaGRyLT5jcmZkID0gMDsKLQkgIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0KLQkgIC8qIFdlIGFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpdHNlbGYgaW4gdGhlCi0JICAgICBkZWJ1Z19pbmZvIHN0cnVjdHVyZS4gICovCi0JICBkZWJ1Zy5saW5lID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2RuciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9wZHIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfc3ltID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX29wdCA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9hdXggPSBOVUxMOwotCSAgZGVidWcuc3MgPSBOVUxMOwotCSAgZGVidWcuc3NleHQgPSBkZWJ1Zy5zc2V4dF9lbmQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZmRyID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3JmZCA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9leHQgPSBkZWJ1Zy5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKLQotCSAgbWRlYnVnX2hhbmRsZSA9IGJmZF9lY29mZl9kZWJ1Z19pbml0IChhYmZkLCAmZGVidWcsIHN3YXAsIGluZm8pOwotCSAgaWYgKG1kZWJ1Z19oYW5kbGUgPT0gKFBUUikgTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoMSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCSAgICAgIEVYVFIgZXN5bTsKLQkgICAgICBiZmRfdm1hIGxhc3Q7Ci0JICAgICAgdW5zaWduZWQgaW50IGk7Ci0JICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lW10gPQotCQl7Ci0JCSAgIi50ZXh0IiwgIi5pbml0IiwgIi5maW5pIiwgIi5kYXRhIiwKLQkJICAiLnJvZGF0YSIsICIuc2RhdGEiLCAiLnNic3MiLCAiLmJzcyIKLQkJfTsKLQkgICAgICBzdGF0aWMgY29uc3QgaW50IHNjW10gPSB7IHNjVGV4dCwgc2NJbml0LCBzY0ZpbmksIHNjRGF0YSwKLQkJCQkJICBzY1JEYXRhLCBzY1NEYXRhLCBzY1NCc3MsIHNjQnNzIH07Ci0KLQkgICAgICBlc3ltLmptcHRibCA9IDA7Ci0JICAgICAgZXN5bS5jb2JvbF9tYWluID0gMDsKLQkgICAgICBlc3ltLndlYWtleHQgPSAwOwotCSAgICAgIGVzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uaWZkID0gaWZkTmlsOwotCSAgICAgIGVzeW0uYXN5bS5pc3MgPSBpc3NOaWw7Ci0JICAgICAgZXN5bS5hc3ltLnN0ID0gc3RMb2NhbDsKLQkgICAgICBlc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJICBlc3ltLmFzeW0uc2MgPSBzY1tpXTsKLQkJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVbaV0pOwotCQkgIGlmIChzICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGVzeW0uYXN5bS52YWx1ZSA9IHMtPnZtYTsKLQkJICAgICAgbGFzdCA9IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBlc3ltLmFzeW0udmFsdWUgPSBsYXN0OwotCi0JCSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgJmRlYnVnLCBzd2FwLAotCQkJCQkJICAgICAgbmFtZVtpXSwgJmVzeW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcDsKLQkgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBpbnB1dF9kZWJ1ZzsKLQkgICAgICBjaGFyICplcmF3X3NyYzsKLQkgICAgICBjaGFyICplcmF3X2VuZDsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaW5wdXRfYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JCSAgfHwgKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCSAgICAgIC0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCkgPT0gTlVMTCkKLQkJewotCQkgIC8qIEkgZG9uJ3Qga25vdyB3aGF0IGEgbm9uIEFMUEhBIEVMRiBiZmQgd291bGQgYmUKLQkJICAgICBkb2luZyB3aXRoIGEgLm1kZWJ1ZyBzZWN0aW9uLCBidXQgSSBkb24ndCByZWFsbHkKLQkJICAgICB3YW50IHRvIGRlYWwgd2l0aCBpdC4gICovCi0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIGlucHV0X3N3YXAgPSAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGlucHV0X2JmZCkKLQkJCSAgICAtPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApOwotCi0JICAgICAgQkZEX0FTU0VSVCAocC0+c2l6ZSA9PSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0JICAgICAgLyogVGhlIEVDT0ZGIGxpbmtpbmcgY29kZSBleHBlY3RzIHRoYXQgd2UgaGF2ZSBhbHJlYWR5Ci0JCSByZWFkIGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIHNldCB1cCBhbgotCQkgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUsIHNvIHdlIGRvIHRoYXQgbm93LiAgKi8KLQkgICAgICBpZiAoIWVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkJJmlucHV0X2RlYnVnKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgaWYgKCEgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0JCSAgICAgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5wdXRfYmZkLAotCQkgICAgICAmaW5wdXRfZGVidWcsIGlucHV0X3N3YXAsIGluZm8pKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogTG9vcCB0aHJvdWdoIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgRm9yIGVhY2ggb25lIHdpdGgKLQkJIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLCB0cnkgdG8gZmluZCB0aGUgc3ltYm9sIGluCi0JCSB0aGUgbGlua2VyIGdsb2JhbCBoYXNoIHRhYmxlIGFuZCBzYXZlIHRoZSBpbmZvcm1hdGlvbgotCQkgZm9yIHRoZSBvdXRwdXQgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0JICAgICAgZXJhd19zcmMgPSBpbnB1dF9kZWJ1Zy5leHRlcm5hbF9leHQ7Ci0JICAgICAgZXJhd19lbmQgPSAoZXJhd19zcmMKLQkJCSAgKyAoaW5wdXRfZGVidWcuc3ltYm9saWNfaGVhZGVyLmlleHRNYXgKLQkJCSAgICAgKiBpbnB1dF9zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpOwotCSAgICAgIGZvciAoOwotCQkgICBlcmF3X3NyYyA8IGVyYXdfZW5kOwotCQkgICBlcmF3X3NyYyArPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkKLQkJewotCQkgIEVYVFIgZXh0OwotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJICAoKmlucHV0X3N3YXAtPnN3YXBfZXh0X2luKSAoaW5wdXRfYmZkLCAoUFRSKSBlcmF3X3NyYywgJmV4dCk7Ci0JCSAgaWYgKGV4dC5hc3ltLnNjID09IHNjTmlsCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0JCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgbmFtZSA9IGlucHV0X2RlYnVnLnNzZXh0ICsgZXh0LmFzeW0uaXNzOwotCQkgIGggPSBhbHBoYV9lbGZfbGlua19oYXNoX2xvb2t1cCAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkgIGlmIChoID09IE5VTEwgfHwgaC0+ZXN5bS5pZmQgIT0gLTIpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChleHQuaWZkICE9IC0xKQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChleHQuaWZkCi0JCQkJICA8IGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZmRNYXgpOwotCQkgICAgICBleHQuaWZkID0gaW5wdXRfZGVidWcuaWZkbWFwW2V4dC5pZmRdOwotCQkgICAgfQotCi0JCSAgaC0+ZXN5bSA9IGV4dDsKLQkJfQotCi0JICAgICAgLyogRnJlZSB1cCB0aGUgaW5mb3JtYXRpb24gd2UganVzdCByZWFkLiAgKi8KLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5saW5lKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9kbnIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3Bkcik7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfc3ltKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9vcHQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2F1eCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuc3MpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzZXh0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9mZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3JmZCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0KTsKLQotCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAotCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSAucnRwcm9jIHNlY3Rpb24uICAqLwotCSAgICAgIHJ0cHJvY19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLQkgICAgICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgfCBTRUNfUkVBRE9OTFkpOwotCi0JCSAgcnRwcm9jX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucnRwcm9jIik7Ci0JCSAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcnRwcm9jX3NlYywgZmxhZ3MpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcnRwcm9jX3NlYywgMTIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAoISBhbHBoYV9lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwKLQkJCQkJCSAgICAgaW5mbywgcnRwcm9jX3NlYywgJmRlYnVnKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0jZW5kaWYKLQotCi0JICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQkgIGVpbmZvLmFiZmQgPSBhYmZkOwotCSAgZWluZm8uaW5mbyA9IGluZm87Ci0JICBlaW5mby5kZWJ1ZyA9ICZkZWJ1ZzsKLQkgIGVpbmZvLnN3YXAgPSBzd2FwOwotCSAgZWluZm8uZmFpbGVkID0gZmFsc2U7Ci0JICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICBlbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltLAotCQkJCSAgKFBUUikgJmVpbmZvKTsKLQkgIGlmIChlaW5mby5mYWlsZWQpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAubWRlYnVnIHNlY3Rpb24uICAqLwotCSAgby0+X3Jhd19zaXplID0gYmZkX2Vjb2ZmX2RlYnVnX3NpemUgKGFiZmQsICZkZWJ1Zywgc3dhcCk7Ci0KLQkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0JICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0JICBtZGVidWdfc2VjID0gbzsKLQl9Ci0KLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gICAgICBpZiAoc3RybmNtcCAoby0+bmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKLQl7Ci0JICBjb25zdCBjaGFyICpzdWJuYW1lOwotCSAgdW5zaWduZWQgaW50IGM7Ci0JICBFbGY2NF9ncHRhYiAqdGFiOwotCSAgRWxmNjRfRXh0ZXJuYWxfZ3B0YWIgKmV4dF90YWI7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgLyogVGhlIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3Mgc2VjdGlvbnMgaG9sZAotCSAgICAgaW5mb3JtYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIHNtYWxsIGRhdGEgYXJlYSB3b3VsZAotCSAgICAgY2hhbmdlIGRlcGVuZGluZyB1cG9uIHRoZSAtRyBzd2l0Y2guICBUaGVzZSBzZWN0aW9ucwotCSAgICAgbm90IHVzZWQgaW4gZXhlY3V0YWJsZXMgZmlsZXMuICAqLwotCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotCSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkJICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JCSAgIHAgPSBwLT5uZXh0KQotCQl7Ci0JCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0KLQkJICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJICAgIHsKLQkJICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJCWNvbnRpbnVlOwotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIH0KLQotCQkgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkJICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJICAgICBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCQkgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCQl9Ci0KLQkgICAgICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzCi0JCSBjdXJyZW50bHkgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgICAgICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgICAgICAvKiBSZWFsbHkgcmVtb3ZlIHRoZSBzZWN0aW9uLiAgKi8KLQkgICAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOwotCQkgICAqc2VjcHAgIT0gbzsKLQkJICAgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCi0JCTsKLQkgICAgICAqc2VjcHAgPSAoKnNlY3BwKS0+bmV4dDsKLQkgICAgICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBUaGVyZSBpcyBvbmUgZ3B0YWIgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCBvbmUgZm9yCi0JICAgICB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zZGF0YSIpID09IDApCi0JICAgIGdwdGFiX2RhdGFfc2VjID0gbzsKLQkgIGVsc2UgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zYnNzIikgPT0gMCkKLQkgICAgZ3B0YWJfYnNzX3NlYyA9IG87Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFRoZSBsaW5rZXIgc2NyaXB0IGFsd2F5cyBjb21iaW5lcyAuZ3B0YWIuZGF0YSBhbmQKLQkgICAgIC5ncHRhYi5zZGF0YSBpbnRvIC5ncHRhYi5zZGF0YSwgYW5kIGxpa2V3aXNlIGZvcgotCSAgICAgLmdwdGFiLmJzcyBhbmQgLmdwdGFiLnNic3MuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzCi0JICAgICBubyAuc2RhdGEgb3IgLnNic3Mgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGluIHdoaWNoCi0JICAgICBjYXNlIHdlIG11c3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAobyA9PSBncHRhYl9kYXRhX3NlYykKLQkJby0+bmFtZSA9ICIuZ3B0YWIuZGF0YSI7Ci0JICAgICAgZWxzZQotCQlvLT5uYW1lID0gIi5ncHRhYi5ic3MiOwotCSAgICAgIHN1Ym5hbWUgPSBvLT5uYW1lICsgc2l6ZW9mICIuZ3B0YWIiIC0gMTsKLQkgICAgICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3VibmFtZSkgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgLyogU2V0IHVwIHRoZSBmaXJzdCBlbnRyeS4gICovCi0JICBjID0gMTsKLQkgIHRhYiA9IChFbGY2NF9ncHRhYiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChFbGY2NF9ncHRhYikpOwotCSAgaWYgKHRhYiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X2N1cnJlbnRfZ192YWx1ZSA9IGVsZl9ncF9zaXplIChhYmZkKTsKLQkgIHRhYlswXS5ndF9oZWFkZXIuZ3RfdW51c2VkID0gMDsKLQotCSAgLyogQ29tYmluZSB0aGUgaW5wdXQgc2VjdGlvbnMuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBsYXN0OwotCSAgICAgIGJmZF9zaXplX3R5cGUgZ3BlbnRyeTsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogQ29tYmluZSB0aGUgZ3B0YWIgZW50cmllcyBmb3IgdGhpcyBpbnB1dCBzZWN0aW9uIG9uZQotCQkgYnkgb25lLiAgV2Uga25vdyB0aGF0IHRoZSBpbnB1dCBncHRhYiBlbnRyaWVzIGFyZQotCQkgc29ydGVkIGJ5IGFzY2VuZGluZyAtRyB2YWx1ZS4gICovCi0JICAgICAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0JICAgICAgbGFzdCA9IDA7Ci0JICAgICAgZm9yIChncGVudHJ5ID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9ncHRhYik7Ci0JCSAgIGdwZW50cnkgPCBzaXplOwotCQkgICBncGVudHJ5ICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpKQotCQl7Ci0JCSAgRWxmNjRfRXh0ZXJuYWxfZ3B0YWIgZXh0X2dwdGFiOwotCQkgIEVsZjY0X2dwdGFiIGludF9ncHRhYjsKLQkJICB1bnNpZ25lZCBsb25nIHZhbDsKLQkJICB1bnNpZ25lZCBsb25nIGFkZDsKLQkJICBib29sZWFuIGV4YWN0OwotCQkgIHVuc2lnbmVkIGludCBsb29rOwotCi0JCSAgaWYgKCEgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpICZleHRfZ3B0YWIsCi0JCQkgIGdwZW50cnksIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpKSkpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKHRhYik7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX2dwdGFiX2luIChpbnB1dF9iZmQsICZleHRfZ3B0YWIsCi0JCQkJCQkmaW50X2dwdGFiKTsKLQkJICB2YWwgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfZ192YWx1ZTsKLQkJICBhZGQgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXMgLSBsYXN0OwotCi0JCSAgZXhhY3QgPSBmYWxzZTsKLQkJICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQotCQkgICAgewotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPj0gdmFsKQotCQkJdGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2J5dGVzICs9IGFkZDsKLQotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPT0gdmFsKQotCQkJZXhhY3QgPSB0cnVlOwotCQkgICAgfQotCi0JCSAgaWYgKCEgZXhhY3QpCi0JCSAgICB7Ci0JCSAgICAgIEVsZjY0X2dwdGFiICpuZXdfdGFiOwotCQkgICAgICB1bnNpZ25lZCBpbnQgbWF4OwotCi0JCSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgdGFibGUgZW50cnkuICAqLwotCQkgICAgICBuZXdfdGFiID0gKChFbGY2NF9ncHRhYiAqKQotCQkJCSBiZmRfcmVhbGxvYyAoKFBUUikgdGFiLAotCQkJCQkgICAgICAoYyArIDEpICogc2l6ZW9mIChFbGY2NF9ncHRhYikpKTsKLQkJICAgICAgaWYgKG5ld190YWIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgZnJlZSAodGFiKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICB0YWIgPSBuZXdfdGFiOwotCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9IHZhbDsKLQkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzID0gYWRkOwotCi0JCSAgICAgIC8qIE1lcmdlIGluIHRoZSBzaXplIGZvciB0aGUgbmV4dCBzbWFsbGVzdCAtRwotCQkJIHZhbHVlLCBzaW5jZSB0aGF0IHdpbGwgYmUgaW1wbGllZCBieSB0aGlzIG5ldwotCQkJIHZhbHVlLiAgKi8KLQkJICAgICAgbWF4ID0gMDsKLQkJICAgICAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKLQkJCXsKLQkJCSAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlIDwgdmFsCi0JCQkgICAgICAmJiAobWF4ID09IDAKLQkJCQkgIHx8ICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZQotCQkJCSAgICAgID4gdGFiW21heF0uZ3RfZW50cnkuZ3RfZ192YWx1ZSkpKQotCQkJICAgIG1heCA9IGxvb2s7Ci0JCQl9Ci0JCSAgICAgIGlmIChtYXggIT0gMCkKLQkJCXRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyArPQotCQkJICB0YWJbbWF4XS5ndF9lbnRyeS5ndF9ieXRlczsKLQotCQkgICAgICArK2M7Ci0JCSAgICB9Ci0KLQkJICBsYXN0ID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzOwotCQl9Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogVGhlIHRhYmxlIG11c3QgYmUgc29ydGVkIGJ5IC1HIHZhbHVlLiAgKi8KLQkgIGlmIChjID4gMikKLQkgICAgcXNvcnQgKHRhYiArIDEsIGMgLSAxLCBzaXplb2YgKHRhYlswXSksIGdwdGFiX2NvbXBhcmUpOwotCi0JICAvKiBTd2FwIG91dCB0aGUgdGFibGUuICAqLwotCSAgZXh0X3RhYiA9ICgoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIgKikKLQkJICAgICBiZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkpOwotCSAgaWYgKGV4dF90YWIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHRhYik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0JICAgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX2dwdGFiX291dCAoYWJmZCwgdGFiICsgaSwgZXh0X3RhYiArIGkpOwotCSAgZnJlZSAodGFiKTsKLQotCSAgby0+X3Jhd19zaXplID0gYyAqIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpOwotCSAgby0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0X3RhYjsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JfQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLwotICBpZiAoISBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHRoZSBjb21wdXRlZCBzZWN0aW9ucy4gICovCi0KLSAgLyogVGhlIC5nb3Qgc3Vic2VjdGlvbnMuLi4gICovCi0gIHsKLSAgICBiZmQgKmksICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICAgIGZvciAoaSA9IGFscGhhX2VsZl9oYXNoX3RhYmxlKGluZm8pLT5nb3RfbGlzdDsKLQkgaSAhPSBOVUxMOwotCSBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotICAgICAgewotCWFzZWN0aW9uICpzZ290OwotCi0JLyogZWxmX2JmZF9maW5hbF9saW5rIGFscmVhZHkgZGlkIGV2ZXJ5dGhpbmcgaW4gZHlub2JqLiAgKi8KLQlpZiAoaSA9PSBkeW5vYmopCi0JICBjb250aW51ZTsKLQotCXNnb3QgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdDsKLQlpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNnb3QtPm91dHB1dF9zZWN0aW9uLAotCQkJCQlzZ290LT5jb250ZW50cywgc2dvdC0+b3V0cHV0X29mZnNldCwKLQkJCQkJc2dvdC0+X3Jhd19zaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICBpZiAocmVnaW5mb19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0KLSAgICAgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX3JlZ2luZm9fb3V0IChhYmZkLCAmcmVnaW5mbywgJmV4dCk7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHJlZ2luZm9fc2VjLCAoUFRSKSAmZXh0LAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChtZGVidWdfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOwotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsCi0JCQkJCSAgICAgICBzd2FwLCBpbmZvLAotCQkJCQkgICAgICAgbWRlYnVnX3NlYy0+ZmlsZXBvcykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfZWNvZmZfZGVidWdfZnJlZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLSAgICB9Ci0KLSAgaWYgKGdwdGFiX2RhdGFfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfZGF0YV9zZWMsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBncHRhYl9kYXRhX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChncHRhYl9ic3Nfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfYnNzX3NlYywKLQkJCQkgICAgICBncHRhYl9ic3Nfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+X3Jhd19zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUKLSAgIC5tZGVidWcgc2VjdGlvbiwgd2hpY2ggaXMgaW4gdGhlIEVDT0ZGIGRlYnVnZ2luZyBmb3JtYXQuICBDb3BpZWQKLSAgIGZyb20gZWxmMzItbWlwcy5jLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwCi1lbGY2NF9hbHBoYV9lY29mZl9kZWJ1Z19zd2FwID0KLXsKLSAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljU3ltMiwKLSAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICA4LAotICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX2luLAotICBlY29mZl9zd2FwX2Rucl9pbiwKLSAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gIGVjb2ZmX3N3YXBfc3ltX2luLAotICBlY29mZl9zd2FwX29wdF9pbiwKLSAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gIGVjb2ZmX3N3YXBfcmZkX2luLAotICBlY29mZl9zd2FwX2V4dF9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gIGVjb2ZmX3N3YXBfcGRyX291dCwKLSAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICBlY29mZl9zd2FwX29wdF9vdXQsCi0gIGVjb2ZmX3N3YXBfZmRyX291dCwKLSAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gIGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbwotfTsKLQwKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjY0X2FscGhhX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjY0LWFscGhhIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfYWxwaGEKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERSAJRU1fQUxQSEEKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIAkweDEwMDAwCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgZWxmNjRfYWxwaGFfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKLSAgZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIFwKLSAgZWxmNjRfYWxwaGFfaW5mb190b19ob3d0bwotCi0jZGVmaW5lIGJmZF9lbGY2NF9ta29iamVjdCBcCi0gIGVsZjY0X2FscGhhX21rb2JqZWN0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wIFwKLSAgZWxmNjRfYWxwaGFfb2JqZWN0X3AKLQotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkciBcCi0gIGVsZjY0X2FscGhhX3NlY3Rpb25fZnJvbV9zaGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9mYWtlX3NlY3Rpb25zCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgZWxmNjRfYWxwaGFfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmNjRfZmluZF9uZWFyZXN0X2xpbmUgXAotICBlbGY2NF9hbHBoYV9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbGF4X3NlY3Rpb24gXAotICBlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rIFwKLSAgZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyBcCi0gIGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0gIGVsZjY0X2FscGhhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0gIGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyBcCi0gIGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0gIGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIFwKLSAgZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotICBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsgXAotICBlbGY2NF9hbHBoYV9maW5hbF9saW5rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCBcCi0gICZlbGY2NF9hbHBoYV9lY29mZl9kZWJ1Z19zd2FwCi0KLS8qCi0gKiBBIGZldyBjb25zdGFudHMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSAucGx0IHNlY3Rpb24gaXMgc2V0IHVwLgotICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSBQTFRfSEVBREVSX1NJWkUKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LWdlbi5jIGIvYmZkL2VsZjY0LWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRjMDlkLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1nZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIEdlbmVyaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgc2hvdWxkIGJlCi0gICBnb29kIGVub3VnaCBmb3IgR0RCIG9yIG9iamR1bXAgdG8gcmVhZCB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGR1bW15ID0KLSAgSE9XVE8gKDAsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVU5LTk9XTiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbCAqZWxmX3JlbG9jOwotewotICBiZmRfcmVsb2MtPmhvd3RvID0gJmR1bW15OwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjY0LWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGY2NC1iaWciCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfdW5rbm93bgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9OT05FCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0b19yZWwKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LW1pcHMuYyBiL2JmZC9lbGY2NC1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzBkY2QuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOTAgKzAsMCBAQAotLyogTUlQUy1zcGVjaWZpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0gICBMaW5rZXIgc3VwcG9ydCBhZGRlZCBieSBNYXJrIE1pdGNoZWxsLCBDb2RlU291cmNlcnksIExMQy4KLSAgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHN1cHBvcnRzIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLgotCi0gICBUaGUgTUlQUyA2NC1iaXQgRUxGIEFCSSB1c2VzIGFuIHVudXN1YWwgcmVsb2MgZm9ybWF0LiAgVGhpcyBmaWxlCi0gICBvdmVycmlkZXMgdGhlIHVzdWFsIEVMRiByZWxvYyBoYW5kbGluZywgYW5kIGhhbmRsZXMgcmVhZGluZyBhbmQKLSAgIHdyaXRpbmcgdGhlIHJlbG9jYXRpb25zIGhlcmUuCi0KLSAgIFRoZSBNSVBTIDY0LWJpdCBFTEYgQUJJIGFsc28gdXNlcyBhbiB1bnVzdWFsIGFyY2hpdmUgbWFwIGZvcm1hdC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZSA2NC1iaXQgQUJJIGlzIG5vdCBzdXBwb3NlZCB0bwotICAgdXNlIEVDT0ZGLiAgSG93ZXZlciwgd2Ugc3VwcG9ydCBpdCBhbnlob3cgZm9yIGFuIGVhc2llciBjaGFuZ2VvdmVyLiAgKi8KLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotLyogVGhlIDY0IGJpdCB2ZXJzaW9ucyBvZiB0aGUgbWRlYnVnIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gYWxwaGEuaC4gICovCi0jaW5jbHVkZSAiY29mZi9hbHBoYS5oIgotI2RlZmluZSBFQ09GRl82NAotI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgotCi1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICosCi0JICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICosCi0JICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfc3dhcF9yZWxvY19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICosCi0JICAgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqLAotCSAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGJmZF9ieXRlICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGxvbmcgbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3dyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3dyaXRlX2FybWFwCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKTsKLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLS8qIFRoZSBudW1iZXIgb2YgbG9jYWwgLmdvdCBlbnRyaWVzIHdlIHJlc2VydmUuICAqLwotI2RlZmluZSBNSVBTX1JFU0VSVkVEX0dPVE5PICgyKQotCi0vKiBUaGUgcmVsb2NhdGlvbiB0YWJsZSB1c2VkIGZvciBTSFRfUkVMIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHN5bWJvbCByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDI2IGJpdCBicmFuY2ggYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18yNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xPMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gbGl0ZXJhbCBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTElURVJBTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1QxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfUEMxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BDMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgY2FsbCB0aHJvdWdoIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTEwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICB7IDEzIH0sCi0gICAgeyAxNCB9LAotICAgIHsgMTUgfSwKLQotICAvKiBBIDUgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5OyBhIHNwZWNpYWwgZnVuY3Rpb24gaXMKLSAgICAgbmVlZGVkIHRvIHB1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdjNCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzQsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfRElTUCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgdG8gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX1BBR0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9QQUdFIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE9mZnNldCBmcm9tIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9PRlNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfT0ZTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCBzdWJzdHJhY3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TVUIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TVUIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9BLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0EiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24sIGFuZCBjaGFuZ2UgYWxsIHJlbG9jYXRpb25zCi0gICAgIHRvIHJlZmVyIHRvIHRoZSBvbGQgaW5zdHJ1Y3Rpb24gYXQgdGhlIGFkZHJlc3MuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9CIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERlbGV0ZSBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0RFTEVURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ERUxFVEUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVSLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEknbSBub3Qgc3VyZSB3aGF0IHRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSwgYnV0IHRoZXkgYXJlIGRlZmluZWQKLSAgICAgb24gSXJpeCA2LiAgKi8KLQotICBIT1dUTyAoUl9NSVBTX1NDTl9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0NOX0RJU1AiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX0FERF9JTU1FRElBVEUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19BRERfSU1NRURJQVRFIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUEpVTVAsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEpVTVAiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUxHT1QsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMR09UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVGhlIHJlbG9jYXRpb24gdGFibGUgdXNlZCBmb3IgU0hUX1JFTEEgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbGFbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHN5bWJvbCByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX01JUFNfTE8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTE8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gbGl0ZXJhbCBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTElURVJBTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1BDMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QQzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgY2FsbCB0aHJvdWdoIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTEwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAgeyAxMyB9LAotICAgIHsgMTQgfSwKLSAgICB7IDE1IH0sCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNiBiaXQgc2hpZnQgZmllbGQuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHk7IGEgc3BlY2lhbCBmdW5jdGlvbiBpcwotICAgICBuZWVkZWQgdG8gcHV0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpbiB0aGUgcmlnaHQgcGxhY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzQsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ESVNQIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgdG8gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX1BBR0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9QQUdFIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfT0ZTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX09GU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgc3Vic3RyYWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfU1VCLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU1VCIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9BLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0EiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24sIGFuZCBjaGFuZ2UgYWxsIHJlbG9jYXRpb25zCi0gICAgIHRvIHJlZmVyIHRvIHRoZSBvbGQgaW5zdHJ1Y3Rpb24gYXQgdGhlIGFkZHJlc3MuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9CIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERlbGV0ZSBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0RFTEVURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ERUxFVEUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVSLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXN0IHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEknbSBub3Qgc3VyZSB3aGF0IHRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSwgYnV0IHRoZXkgYXJlIGRlZmluZWQKLSAgICAgb24gSXJpeCA2LiAgKi8KLQotICBIT1dUTyAoUl9NSVBTX1NDTl9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0NOX0RJU1AiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUwxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX0FERF9JTU1FRElBVEUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19BRERfSU1NRURJQVRFIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUEpVTVAsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEpVTVAiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19SRUxHT1QsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMR09UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogU3dhcCBpbiBhIE1JUFMgNjQtYml0IFJlbCByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGRzdC0+cl9vZmZzZXQgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX3N5bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zeW0pOwotICBkc3QtPnJfc3N5bSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3NzeW0pOwotICBkc3QtPnJfdHlwZTMgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMyk7Ci0gIGRzdC0+cl90eXBlMiA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUyKTsKLSAgZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlKTsKLX0KLQotLyogU3dhcCBpbiBhIE1JUFMgNjQtYml0IFJlbGEgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9zeW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3ltKTsKLSAgZHN0LT5yX3NzeW0gPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zc3ltKTsKLSAgZHN0LT5yX3R5cGUzID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTMpOwotICBkc3QtPnJfdHlwZTIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMik7Ci0gIGRzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZSk7Ci0gIGRzdC0+cl9hZGRlbmQgPSBiZmRfaF9nZXRfc2lnbmVkXzY0IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX2FkZGVuZCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgTUlQUyA2NC1iaXQgUmVsIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKLX0KLQotLyogU3dhcCBvdXQgYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKLSAgYmZkX2hfcHV0XzY0IChhYmZkLCBzcmMtPnJfYWRkZW5kLCAoYmZkX2J5dGUgKikgZHN0LT5yX2FkZGVuZCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBNSVBTIDY0LWJpdCBSZWwgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBiZmRfYnl0ZSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsIG1pcmVsOwotCi0gIG1pcHNfZWxmNjRfc3dhcF9yZWxvY19pbiAoYWJmZCwgCi0JCQkgICAgKGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICopIHNyYywKLQkJCSAgICAmbWlyZWwpOwotCi0gIGRzdFswXS5yX29mZnNldCA9IG1pcmVsLnJfb2Zmc2V0OwotICBkc3RbMF0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChtaXJlbC5yX3N5bSwgbWlyZWwucl90eXBlKTsKLSAgZHN0WzFdLnJfb2Zmc2V0ID0gbWlyZWwucl9vZmZzZXQ7Ci0gIGRzdFsxXS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKG1pcmVsLnJfc3N5bSwgbWlyZWwucl90eXBlMik7Ci0gIGRzdFsyXS5yX29mZnNldCA9IG1pcmVsLnJfb2Zmc2V0OwotICBkc3RbMl0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChTVE5fVU5ERUYsIG1pcmVsLnJfdHlwZTMpOwotfQotCi0vKiBTd2FwIGluIGEgTUlQUyA2NC1iaXQgUmVsYSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBiZmRfYnl0ZSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgbWlyZWxhOwotCi0gIG1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIAotCQkJICAgICAoY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICopIHNyYywKLQkJCSAgICAgJm1pcmVsYSk7Ci0KLSAgZHN0WzBdLnJfb2Zmc2V0ID0gbWlyZWxhLnJfb2Zmc2V0OwotICBkc3RbMF0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChtaXJlbGEucl9zeW0sIG1pcmVsYS5yX3R5cGUpOwotICBkc3RbMF0ucl9hZGRlbmQgPSBtaXJlbGEucl9hZGRlbmQ7Ci0gIGRzdFsxXS5yX29mZnNldCA9IG1pcmVsYS5yX29mZnNldDsKLSAgZHN0WzFdLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAobWlyZWxhLnJfc3N5bSwgbWlyZWxhLnJfdHlwZTIpOwotICBkc3RbMV0ucl9hZGRlbmQgPSAwOwotICBkc3RbMl0ucl9vZmZzZXQgPSBtaXJlbGEucl9vZmZzZXQ7Ci0gIGRzdFsyXS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKFNUTl9VTkRFRiwgbWlyZWxhLnJfdHlwZTMpOwotICBkc3RbMl0ucl9hZGRlbmQgPSAwOwotfQotCi0vKiBTd2FwIG91dCBhIE1JUFMgNjQtYml0IFJlbCByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X2JlX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIGJmZF9ieXRlICpkc3Q7Ci17Ci0gIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsIG1pcmVsOwotCi0gIG1pcmVsLnJfb2Zmc2V0ID0gc3JjLT5yX29mZnNldDsKLSAgbWlyZWwucl90eXBlID0gRUxGMzJfUl9UWVBFIChzcmMtPnJfaW5mbyk7Ci0gIG1pcmVsLnJfc3ltID0gRUxGMzJfUl9TWU0gKHNyYy0+cl9pbmZvKTsKLSAgbWlyZWwucl90eXBlMiA9IFJfTUlQU19OT05FOwotICBtaXJlbC5yX3NzeW0gPSBTVE5fVU5ERUY7Ci0gIG1pcmVsLnJfdHlwZTMgPSBSX01JUFNfTk9ORTsKLQotICBtaXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmbWlyZWwsIAotCQkJICAgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKikgZHN0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqc3JjOwotICAgICBiZmRfYnl0ZSAqZHN0OwotewotICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgbWlyZWxhOwotCi0gIG1pcmVsYS5yX29mZnNldCA9IHNyYy0+cl9vZmZzZXQ7Ci0gIG1pcmVsYS5yX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHNyYy0+cl9pbmZvKTsKLSAgbWlyZWxhLnJfYWRkZW5kID0gc3JjLT5yX2FkZGVuZDsKLSAgbWlyZWxhLnJfc3ltID0gRUxGMzJfUl9TWU0gKHNyYy0+cl9pbmZvKTsKLSAgbWlyZWxhLnJfdHlwZTIgPSBSX01JUFNfTk9ORTsKLSAgbWlyZWxhLnJfc3N5bSA9IFNUTl9VTkRFRjsKLSAgbWlyZWxhLnJfdHlwZTMgPSBSX01JUFNfTk9ORTsKLQotICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJm1pcmVsYSwgCi0JCQkgICAgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICopIGRzdCk7Ci19Ci0KLS8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBNSVBTIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICBlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBtaXBzX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NSVBTX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01JUFNfMTYgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTUlQU18zMiB9LAotICB7IEJGRF9SRUxPQ182NCwgUl9NSVBTXzY0IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfTUlQU182NCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NSVBTX1JFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfSk1QLCBSX01JUFNfMjYgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLCBSX01JUFNfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19MTzE2LCBSX01JUFNfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBSX01JUFNfR1BSRUwxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIFJfTUlQU19MSVRFUkFMIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UMTYsIFJfTUlQU19HT1QxNiB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NSVBTX1BDMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIFJfTUlQU19DQUxMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLCBSX01JUFNfR1BSRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LCBSX01JUFNfR09UX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgUl9NSVBTX0dPVF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBSX01JUFNfQ0FMTF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBSX01JUFNfQ0FMTF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfU1VCLCBSX01JUFNfU1VCIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX1BBR0UsIFJfTUlQU19HT1RfUEFHRSB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNULCBSX01JUFNfR09UX09GU1QgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfRElTUCwgUl9NSVBTX0dPVF9ESVNQIH0KLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIGhvd3RvIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1pcHNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKG1pcHNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQl7Ci0JICBpbnQgdjsKLQotCSAgdiA9IChpbnQpIG1pcHNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWw7Ci0JICByZXR1cm4gJm1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsW3ZdOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNpbmNlIGVhY2ggZW50cnkgaW4gYW4gU0hUX1JFTCBvciBTSFRfUkVMQSBzZWN0aW9uIGNhbiByZXByZXNlbnQgdXAKLSAgIHRvIHRocmVlIHJlbG9jcywgd2UgbXVzdCB0ZWxsIHRoZSB1c2VyIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UuICAqLwotCi1zdGF0aWMgbG9uZwotbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gKHNlYy0+cmVsb2NfY291bnQgKiAzICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIFJlYWQgdGhlIHJlbG9jYXRpb25zIGZyb20gb25lIHJlbG9jIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCByZWxfaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotewotICBQVFIgYWxsb2NhdGVkID0gTlVMTDsKLSAgYmZkX2J5dGUgKm5hdGl2ZV9yZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbGVudHM7Ci0gIGFyZWxlbnQgKnJlbGVudDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGVudHNpemU7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvX3RhYmxlOwotCi0gIGFsbG9jYXRlZCA9IChQVFIpIGJmZF9tYWxsb2MgKHJlbF9oZHItPnNoX3NpemUpOwotICBpZiAoYWxsb2NhdGVkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCByZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGFsbG9jYXRlZCwgMSwgcmVsX2hkci0+c2hfc2l6ZSwgYWJmZCkgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7Ci0KLSAgcmVsZW50cyA9IGFzZWN0LT5yZWxvY2F0aW9uICsgYXNlY3QtPnJlbG9jX2NvdW50OwotCi0gIGVudHNpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplOwotICBCRkRfQVNTRVJUIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpCi0JICAgICAgfHwgZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSkpOwotCi0gIGNvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIGVudHNpemU7Ci0KLSAgaWYgKGVudHNpemUgPT0gc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCkpCi0gICAgaG93dG9fdGFibGUgPSBtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbDsKLSAgZWxzZQotICAgIGhvd3RvX3RhYmxlID0gbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxhOwotCi0gIHJlbGVudCA9IHJlbGVudHM7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBuYXRpdmVfcmVsb2NzICs9IGVudHNpemUpCi0gICAgewotICAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIHJlbGE7Ci0gICAgICBib29sZWFuIHVzZWRfc3ltLCB1c2VkX3NzeW07Ci0gICAgICBpbnQgaXI7Ci0KLSAgICAgIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhKSkKLQltaXBzX2VsZjY0X3N3YXBfcmVsb2NhX2luIChhYmZkLAotCQkJCSAgIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikgbmF0aXZlX3JlbG9jcywKLQkJCQkgICAmcmVsYSk7Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgcmVsOwotCi0JICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4gKGFiZmQsCi0JCQkJICAgIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqKSBuYXRpdmVfcmVsb2NzLAotCQkJCSAgICAmcmVsKTsKLQkgIHJlbGEucl9vZmZzZXQgPSByZWwucl9vZmZzZXQ7Ci0JICByZWxhLnJfc3ltID0gcmVsLnJfc3ltOwotCSAgcmVsYS5yX3NzeW0gPSByZWwucl9zc3ltOwotCSAgcmVsYS5yX3R5cGUzID0gcmVsLnJfdHlwZTM7Ci0JICByZWxhLnJfdHlwZTIgPSByZWwucl90eXBlMjsKLQkgIHJlbGEucl90eXBlID0gcmVsLnJfdHlwZTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgLyogRWFjaCBlbnRyeSByZXByZXNlbnRzIHVwIHRvIHRocmVlIGFjdHVhbCByZWxvY2F0aW9ucy4gICovCi0KLSAgICAgIHVzZWRfc3ltID0gZmFsc2U7Ci0gICAgICB1c2VkX3NzeW0gPSBmYWxzZTsKLSAgICAgIGZvciAoaXIgPSAwOyBpciA8IDM7IGlyKyspCi0JewotCSAgZW51bSBlbGZfbWlwc19yZWxvY190eXBlIHR5cGU7Ci0KLQkgIHN3aXRjaCAoaXIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSAwOgotCSAgICAgIHR5cGUgPSAoZW51bSBlbGZfbWlwc19yZWxvY190eXBlKSByZWxhLnJfdHlwZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOgotCSAgICAgIHR5cGUgPSAoZW51bSBlbGZfbWlwc19yZWxvY190eXBlKSByZWxhLnJfdHlwZTI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICB0eXBlID0gKGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSkgcmVsYS5yX3R5cGUzOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICh0eXBlID09IFJfTUlQU19OT05FKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgcmVsb2NhdGlvbnMgaW4gdGhpcyBlbnRyeS4gIElmIHRoaXMKLSAgICAgICAgICAgICAgICAgaXMgdGhlIGZpcnN0IGVudHJ5LCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgZHVtbXkKLSAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBzbyB0aGF0IHRoZSBnZW5lcmljIGxpbmtlciBrbm93cyB0aGF0Ci0gICAgICAgICAgICAgICAgIHRoZXJlIGhhcyBiZWVuIGEgYnJlYWsgaW4gdGhlIHNlcXVlbmNlIG9mIHJlbG9jYXRpb25zCi0gICAgICAgICAgICAgICAgIGFwcGx5aW5nIHRvIGEgcGFydGljdWxhciBhZGRyZXNzLiAgKi8KLQkgICAgICBpZiAoaXIgPT0gMCkKLQkJewotCQkgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkJICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLQkJICBlbHNlCi0JCSAgICByZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0IC0gYXNlY3QtPnZtYTsKLQkJICByZWxlbnQtPmFkZGVuZCA9IDA7Ci0JCSAgcmVsZW50LT5ob3d0byA9ICZob3d0b190YWJsZVsoaW50KSBSX01JUFNfTk9ORV07Ci0JCSAgKytyZWxlbnQ7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBTb21lIHR5cGVzIHJlcXVpcmUgc3ltYm9scywgd2hlcmVhcyBzb21lIGRvIG5vdC4gICovCi0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBSX01JUFNfTk9ORToKLQkgICAgY2FzZSBSX01JUFNfTElURVJBTDoKLQkgICAgY2FzZSBSX01JUFNfSU5TRVJUX0E6Ci0JICAgIGNhc2UgUl9NSVBTX0lOU0VSVF9COgotCSAgICBjYXNlIFJfTUlQU19ERUxFVEU6Ci0JICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKCEgdXNlZF9zeW0pCi0JCXsKLQkJICBpZiAocmVsYS5yX3N5bSA9PSAwKQotCQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXN5bWJvbCAqKnBzLCAqczsKLQotCQkgICAgICBwcyA9IHN5bWJvbHMgKyByZWxhLnJfc3ltIC0gMTsKLQkJICAgICAgcyA9ICpwczsKLQkJICAgICAgaWYgKChzLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQkJCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBwczsKLQkJICAgICAgZWxzZQotCQkJcmVsZW50LT5zeW1fcHRyX3B0ciA9IHMtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCQkgICAgfQotCi0JCSAgdXNlZF9zeW0gPSB0cnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoISB1c2VkX3NzeW0pCi0JCXsKLQkJICBzd2l0Y2ggKHJlbGEucl9zc3ltKQotCQkgICAgewotCQkgICAgY2FzZSBSU1NfVU5ERUY6Ci0JCSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPQotCQkJYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIFJTU19HUDoKLQkJICAgIGNhc2UgUlNTX0dQMDoKLQkJICAgIGNhc2UgUlNTX0xPQzoKLQkJICAgICAgLyogRklYTUU6IEkgdGhpbmsgdGhlc2UgbmVlZCB0byBiZSBoYW5kbGVkIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCBob3d0byBzdHJ1Y3R1cmVzLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBCRkRfQVNTRVJUICgwKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICB1c2VkX3NzeW0gPSB0cnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4KLQkgICAgIG9iamVjdCBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvcgotCSAgICAgc2hhcmVkIGxpYnJhcnkuICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMKLQkgICAgIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLQkgIGVsc2UKLQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldCAtIGFzZWN0LT52bWE7Ci0KLQkgIHJlbGVudC0+YWRkZW5kID0gcmVsYS5yX2FkZGVuZDsKLQotCSAgcmVsZW50LT5ob3d0byA9ICZob3d0b190YWJsZVsoaW50KSB0eXBlXTsKLQotCSAgKytyZWxlbnQ7Ci0JfQotICAgIH0KLQotICBhc2VjdC0+cmVsb2NfY291bnQgKz0gcmVsZW50IC0gcmVsZW50czsKLQotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCB0aGUgcmVsb2NhdGlvbnMuICBPbiBJcml4IDYsIHRoZXJlIGNhbiBiZSB0d28gcmVsb2Mgc2VjdGlvbnMKLSAgIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBkYXRhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKiBjb25zdCBkID0gZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpOwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbiAhPSBOVUxMCi0gICAgICB8fCAoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBhc2VjdC0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgMyBhcmVsZW50IHN0cnVjdHVyZXMgZm9yIGVhY2ggUmVsIHN0cnVjdHVyZS4gICovCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gKChhcmVsZW50ICopCi0JCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICBhc2VjdC0+cmVsb2NfY291bnQgKiAzICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIHNsdXJwX29uZV9yZWxvY190YWJsZSByb3V0aW5lIGluY3JlbWVudHMgcmVsb2NfY291bnQuICAqLwotICBhc2VjdC0+cmVsb2NfY291bnQgPSAwOwotCi0gIGlmICghIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgJmQtPnJlbF9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGQtPnJlbF9oZHIyICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLAotCQkJCQkgICAgICBkLT5yZWxfaGRyMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3dyaXRlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBib29sZWFuICpmYWlsZWRwID0gKGJvb2xlYW4gKikgZGF0YTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7Ci0gIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqZXh0X3JlbGE7Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIGFzeW1ib2wgKmxhc3Rfc3ltID0gMDsKLSAgaW50IGxhc3Rfc3ltX2lkeCA9IDA7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICBpZiAoKmZhaWxlZHApCi0gICAgcmV0dXJuOwotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhlIGxpbmtlciBiYWNrZW5kIHdyaXRlcyB0aGUgcmVsb2NzIG91dCBpdHNlbGYsIGFuZCBzZXRzIHRoZQotICAgICByZWxvY19jb3VudCBmaWVsZCB0byB6ZXJvIHRvIGluaGliaXQgd3JpdGluZyB0aGVtIGhlcmUuICBBbHNvLAotICAgICBzb21ldGltZXMgdGhlIFNFQ19SRUxPQyBmbGFnIGdldHMgc2V0IGV2ZW4gd2hlbiB0aGVyZSBhcmVuJ3QgYW55Ci0gICAgIHJlbG9jcy4gICovCi0gIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFdlIGNhbiBjb21iaW5lIHVwIHRvIHRocmVlIHJlbG9jcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGFkZHJlc3MKLSAgICAgaWYgdGhlIGxhdHRlciByZWxvY3MgaGF2ZSBubyBhc3NvY2lhdGVkIHN5bWJvbC4gICovCi0gIGNvdW50ID0gMDsKLSAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgKytjb3VudDsKLQotICAgICAgYWRkciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XS0+YWRkcmVzczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JewotCSAgYXJlbGVudCAqcjsKLQotCSAgaWYgKGlkeCArIDEgPj0gc2VjLT5yZWxvY19jb3VudCkKLQkgICAgYnJlYWs7Ci0JICByID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQkgIGlmIChyLT5hZGRyZXNzICE9IGFkZHIKLQkgICAgICB8fCAhIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCi0JICAgICAgfHwgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlICE9IDApCi0JICAgIGJyZWFrOwotCi0JICAvKiBXZSBjYW4gbWVyZ2UgdGhlIHJlbG9jIGF0IElEWCArIDEgd2l0aCB0aGUgcmVsb2MgYXQgSURYLiAgKi8KLQotCSAgKytpZHg7Ci0JfQotICAgIH0KLQotICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyOwotCi0gIHJlbGFfaGRyLT5zaF9zaXplID0gcmVsYV9oZHItPnNoX2VudHNpemUgKiBjb3VudDsKLSAgcmVsYV9oZHItPmNvbnRlbnRzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxhX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChyZWxhX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqZmFpbGVkcCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGV4dF9yZWxhID0gKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHM7Ci0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyssIGV4dF9yZWxhKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcHRyOwotICAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIGludF9yZWxhOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgaW50IG47Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCWludF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotICAgICAgZWxzZQotCWludF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLSAgICAgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotICAgICAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQluID0gbGFzdF9zeW1faWR4OwotICAgICAgZWxzZQotCXsKLQkgIGxhc3Rfc3ltID0gc3ltOwotCSAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgaWYgKG4gPCAwKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgbGFzdF9zeW1faWR4ID0gbjsKLQl9Ci0KLSAgICAgIGludF9yZWxhLnJfc3ltID0gbjsKLQotICAgICAgaW50X3JlbGEucl9hZGRlbmQgPSBwdHItPmFkZGVuZDsKLQotICAgICAgaW50X3JlbGEucl9zc3ltID0gUlNTX1VOREVGOwotCi0gICAgICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjCi0JICAmJiAhIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBwdHIpKQotCXsKLQkgICpmYWlsZWRwID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGludF9yZWxhLnJfdHlwZSA9IHB0ci0+aG93dG8tPnR5cGU7Ci0gICAgICBpbnRfcmVsYS5yX3R5cGUyID0gKGludCkgUl9NSVBTX05PTkU7Ci0gICAgICBpbnRfcmVsYS5yX3R5cGUzID0gKGludCkgUl9NSVBTX05PTkU7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JewotCSAgYXJlbGVudCAqcjsKLQotCSAgaWYgKGlkeCArIDEgPj0gc2VjLT5yZWxvY19jb3VudCkKLQkgICAgYnJlYWs7Ci0JICByID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQkgIGlmIChyLT5hZGRyZXNzICE9IHB0ci0+YWRkcmVzcwotCSAgICAgIHx8ICEgYmZkX2lzX2Fic19zZWN0aW9uICgoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbikKLQkgICAgICB8fCAoKnItPnN5bV9wdHJfcHRyKS0+dmFsdWUgIT0gMCkKLQkgICAgYnJlYWs7Ci0KLQkgIC8qIFdlIGNhbiBtZXJnZSB0aGUgcmVsb2MgYXQgSURYICsgMSB3aXRoIHRoZSByZWxvYyBhdCBJRFguICAqLwotCi0JICBpZiAoaSA9PSAwKQotCSAgICBpbnRfcmVsYS5yX3R5cGUyID0gci0+aG93dG8tPnR5cGU7Ci0JICBlbHNlCi0JICAgIGludF9yZWxhLnJfdHlwZTMgPSByLT5ob3d0by0+dHlwZTsKLQotCSAgKytpZHg7Ci0JfQotCi0gICAgICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmludF9yZWxhLCBleHRfcmVsYSk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGV4dF9yZWxhIC0gKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHMKLQkgICAgICA9PSBjb3VudCk7Ci19Ci0MCi0vKiBJcml4IDYgZGVmaW5lcyBhIGJyYW5kIG5ldyBhcmNoaXZlIG1hcCBmb3JtYXQsIHNvIHRoYXQgdGhleSBjYW4KLSAgIGhhdmUgYXJjaGl2ZXMgbW9yZSB0aGFuIDQgR0IgaW4gc2l6ZS4gICovCi0KLS8qIFJlYWQgYW4gSXJpeCA2IGFybWFwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOwotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgZmlsZV9wdHIgYXJoZHJwb3M7Ci0gIGJmZF9zaXplX3R5cGUgaSwgcGFyc2VkX3NpemUsIG5zeW16LCBzdHJpbmdzaXplLCBjYXJzeW1fc2l6ZSwgcHRyc2l6ZTsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgYmZkX2J5dGUgaW50X2J1Zls4XTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgYmZkX2J5dGUgKnJhd19hcm1hcCA9IE5VTEw7Ci0gIGNhcnN5bSAqY2Fyc3ltczsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSBOVUxMOwotCi0gIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgZWxlbWVudC4gICovCi0gIGFyaGRycG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFyY2hpdmVzIHdpdGggdHJhZGl0aW9uYWwgYXJtYXBzIGFyZSBzdGlsbCBwZXJtaXR0ZWQuICAqLwotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICIvICAgICAgICAgICAgICAgIiwgMTYpID09IDApCi0gICAgcmV0dXJuIGJmZF9zbHVycF9hcm1hcCAoYWJmZCk7Ci0KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiL1NZTTY0LyAgICAgICAgICIsIDE2KSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsKLQotICBpZiAoYmZkX3JlYWQgKGludF9idWYsIDEsIDgsIGFiZmQpICE9IDgpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG5zeW16ID0gYmZkX2dldGI2NCAoaW50X2J1Zik7Ci0gIHN0cmluZ3NpemUgPSBwYXJzZWRfc2l6ZSAtIDggKiBuc3lteiAtIDg7Ci0KLSAgY2Fyc3ltX3NpemUgPSBuc3lteiAqIHNpemVvZiAoY2Fyc3ltKTsKLSAgcHRyc2l6ZSA9IDggKiBuc3ltejsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF96YWxsb2MgKGFiZmQsIGNhcnN5bV9zaXplICsgc3RyaW5nc2l6ZSArIDEpOwotICBpZiAoYXJkYXRhLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjYXJzeW1zID0gYXJkYXRhLT5zeW1kZWZzOwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIGFyZGF0YS0+c3ltZGVmcykgKyBjYXJzeW1fc2l6ZTsKLQotICByYXdfYXJtYXAgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBwdHJzaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfcmVhZCAocmF3X2FybWFwLCAxLCBwdHJzaXplLCBhYmZkKSAhPSBwdHJzaXplCi0gICAgICB8fCBiZmRfcmVhZCAoc3RyaW5nYmFzZSwgMSwgc3RyaW5nc2l6ZSwgYWJmZCkgIT0gc3RyaW5nc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbnN5bXo7IGkrKykKLSAgICB7Ci0gICAgICBjYXJzeW1zLT5maWxlX29mZnNldCA9IGJmZF9nZXRiNjQgKHJhd19hcm1hcCArIGkgKiA4KTsKLSAgICAgIGNhcnN5bXMtPm5hbWUgPSBzdHJpbmdiYXNlOwotICAgICAgc3RyaW5nYmFzZSArPSBzdHJsZW4gKHN0cmluZ2Jhc2UpICsgMTsKLSAgICAgICsrY2Fyc3ltczsKLSAgICB9Ci0gICpzdHJpbmdiYXNlID0gJ1wwJzsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IG5zeW16OwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGFyaGRycG9zICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIHBhcnNlZF9zaXplOwotCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCByYXdfYXJtYXApOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAocmF3X2FybWFwICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJhd19hcm1hcCk7Ci0gIGlmIChhcmRhdGEtPnN5bWRlZnMgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYXJkYXRhLT5zeW1kZWZzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gSXJpeCA2IGFybWFwLiAgVGhlIElyaXggNiB0b29scyBhcmUgc3VwcG9zZWQgdG8gYmUKLSAgIGFibGUgdG8gaGFuZGxlIG9yZGluYXJ5IEVMRiBhcm1hcHMsIGJ1dCBhdCBsZWFzdCBvbiBJcml4IDYuMiB0aGUKLSAgIGxpbmtlciBjcmFzaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgc3ltYm9sX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgdW5zaWduZWQgaW50IHJhbmxpYnNpemUgPSAoc3ltYm9sX2NvdW50ICogOCkgKyA4OwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZSA9IHN0cmlkeDsKLSAgdW5zaWduZWQgaW50IG1hcHNpemUgPSBzdHJpbmdzaXplICsgcmFubGlic2l6ZTsKLSAgZmlsZV9wdHIgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHI7Ci0gIGJmZCAqY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBwYWRkaW5nOwotICBiZmRfYnl0ZSBidWZbOF07Ci0KLSAgcGFkZGluZyA9IEJGRF9BTElHTiAobWFwc2l6ZSwgOCkgLSBtYXBzaXplOwotICBtYXBzaXplICs9IHBhZGRpbmc7Ci0KLSAgLyogd29yayBvdXQgd2hlcmUgdGhlIGZpcnN0IG9iamVjdCBmaWxlIHdpbGwgZ28gaW4gdGhlIGFyY2hpdmUgKi8KLSAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgPSAobWFwc2l6ZQotCQkJICAgICArIGVsZW5ndGgKLQkJCSAgICAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpCi0JCQkgICAgICsgU0FSTUFHKTsKLQotICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIHN0cmNweSAoaGRyLmFyX25hbWUsICIvU1lNNjQvIik7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBtYXBzaXplKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgdGltZSAoTlVMTCkpOwotICAvKiBUaGlzLCBhdCBsZWFzdCwgaXMgd2hhdCBJbnRlbCBjb2ZmIHNldHMgdGhlIHZhbHVlcyB0by46ICovCi0gIHNwcmludGYgKChoZHIuYXJfdWlkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfZ2lkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfbW9kZSksICIlLTdvIiwgKHVuc2lnbmVkKSAwKTsKLSAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLSAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgLyogV3JpdGUgdGhlIGFyIGhlYWRlciBmb3IgdGhpcyBpdGVtIGFuZCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dGI2NCAoc3ltYm9sX2NvdW50LCBidWYpOwotICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDgsIGFyY2gpICE9IDgpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFR3byBwYXNzZXMsIGZpcnN0IHdyaXRlIHRoZSBmaWxlIG9mZnNldHMgZm9yIGVhY2ggc3ltYm9sIC0KLSAgICAgcmVtZW1iZXJpbmcgdGhhdCBlYWNoIG9mZnNldCBpcyBvbiBhIHR3byBieXRlIGJvdW5kYXJ5LiAgKi8KLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggZWFjaAotICAgICBzeW1ib2wsIGFuZCByZW1lbWJlciB0byBrZWVwIHRoZSBvZmZzZXRzIHBhZGRlZCBvdXQuICAqLwotCi0gIGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKGN1cnJlbnQgIT0gKGJmZCAqKSBOVUxMICYmIGNvdW50IDwgc3ltYm9sX2NvdW50KQotICAgIHsKLSAgICAgIC8qIEZvciBlYWNoIHN5bWJvbCB3aGljaCBpcyB1c2VkIGRlZmluZWQgaW4gdGhpcyBvYmplY3QsIHdyaXRlIG91dAotCSB0aGUgb2JqZWN0IGZpbGUncyBhZGRyZXNzIGluIHRoZSBhcmNoaXZlICovCi0KLSAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKSA9PSBjdXJyZW50KQotCXsKLQkgIGJmZF9wdXRiNjQgKGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyLCBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA4LCBhcmNoKSAhPSA4KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBjb3VudCsrOwotCX0KLSAgICAgIC8qIEFkZCBzaXplIG9mIHRoaXMgYXJjaGl2ZSBlbnRyeSAqLwotICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gKGFyZWx0X3NpemUgKGN1cnJlbnQpCi0JCQkJICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgLyogcmVtZW1iZXIgYWJvdXQgdGhlIGV2ZW4gYWxpZ25tZW50ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciAlIDI7Ci0gICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKLSAgICB9Ci0KLSAgLyogbm93IHdyaXRlIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc3ltYm9sX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCptYXBbY291bnRdLm5hbWUpICsgMTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKm1hcFtjb3VudF0ubmFtZSwgMSwgbGVuLCBhcmNoKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzYXlzIHRoYXQgdGhpcyBzaG91bGQgYmUgcGFkZGVkIHRvIGFuIDggYnl0ZSBib3VuZGFyeS4KLSAgICAgSG93ZXZlciwgdGhlIElyaXggNi4yIHRvb2xzIGRvIG5vdCBhcHBlYXIgdG8gZG8gdGhpcy4gICovCi0gIHdoaWxlIChwYWRkaW5nICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLS1wYWRkaW5nOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCi0gICAubWRlYnVnIHNlY3Rpb24sIHdoaWNoIGlzIGluIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCBtaXBzX2VsZjY0X2Vjb2ZmX2RlYnVnX3N3YXAgPQotewotICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgbWFnaWNTeW0yLAotICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gIDgsCi0gIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBwZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBmZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gIGVjb2ZmX3N3YXBfZG5yX2luLAotICBlY29mZl9zd2FwX3Bkcl9pbiwKLSAgZWNvZmZfc3dhcF9zeW1faW4sCi0gIGVjb2ZmX3N3YXBfb3B0X2luLAotICBlY29mZl9zd2FwX2Zkcl9pbiwKLSAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gIGVjb2ZmX3N3YXBfZXh0X2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICBlY29mZl9zd2FwX3N5bV9vdXQsCi0gIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICBlY29mZl9zd2FwX3JmZF9vdXQsCi0gIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCwKLSAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0vKiBSZWxvY2F0aW9ucyBpbiB0aGUgNjQgYml0IE1JUFMgRUxGIEFCSSBhcmUgbW9yZSBjb21wbGV4IHRoYW4gaW4KLSAgIHN0YW5kYXJkIEVMRi4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVkaXJlY3QgdGhlIHJlbG9jYXRpb24KLSAgIGhhbmRsaW5nIHJvdXRpbmVzLiAgKi8KLQotY29uc3Qgc3RydWN0IGVsZl9zaXplX2luZm8gbWlwc19lbGY2NF9zaXplX2luZm8gPQotewotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX0VoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1BoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1NoZHIpLAotICBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsKSwKLSAgc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfRHluKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfTm90ZSksCi0gIDQsICAgICAgICAgICAgLyogaGFzaC10YWJsZSBlbnRyeSBzaXplICovCi0gIDMsICAgICAgICAgICAgLyogaW50ZXJuYWwgcmVsb2NhdGlvbnMgcGVyIGV4dGVybmFsIHJlbG9jYXRpb25zICovCi0gIDY0LAkJLyogYXJjaF9zaXplICovCi0gIDgsCQkvKiBmaWxlX2FsaWduICovCi0gIEVMRkNMQVNTNjQsCi0gIEVWX0NVUlJFTlQsCi0gIGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMsCi0gIGJmZF9lbGY2NF93cml0ZV9zaGRyc19hbmRfZWhkciwKLSAgbWlwc19lbGY2NF93cml0ZV9yZWxvY3MsCi0gIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQsCi0gIG1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUsCi0gIGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUsCi0gIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiwKLSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCwKLSAgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX2luLAotICBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2Nfb3V0LAotICBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX2luLAotICBtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX291dAotfTsKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjY0LWxpdHRsZW1pcHMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjY0X2JpZ21pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGY2NC1iaWdtaXBzIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX21pcHMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTUlQUwotCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NvbGxlY3QJCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2sJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2luZm8JCW1pcHNfZWxmNjRfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQlfYmZkX21pcHNfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwlfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAlfYmZkX21pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAJJm1pcHNfZWxmNjRfZWNvZmZfZGVidWdfc3dhcAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwlfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotCQkJCQlfYmZkX21pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICBfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgXAotCQkJCQlfYmZkX21pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCV9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJX2JmZF9taXBzX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawlfYmZkX21pcHNfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCSg0Kk1JUFNfUkVTRVJWRURfR09UTk8pCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQkwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21heV91c2VfcmVsX3AgICAgICAgMQotCi0vKiBXZSBkb24ndCBzZXQgYmZkX2VsZjY0X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJlY2F1c2UgdGhlIDMyLWJpdCAKLSAgIE1JUFMtc3BlY2lmaWMgZnVuY3Rpb24gb25seSBhcHBsaWVzIHRvIElSSVg1LCB3aGljaCBoYWQgbm8gNjQtYml0Ci0gICBBQkkuICAqLwotI2RlZmluZSBiZmRfZWxmNjRfZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmNjRfc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQlfYmZkX21pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rCV9iZmRfbWlwc19lbGZfZmluYWxfbGluawotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3NldF9wcml2YXRlX2ZsYWdzCV9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZCBtaXBzX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwCW1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfZnVuY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3NsdXJwX2FybWFwCW1pcHNfZWxmNjRfc2x1cnBfYXJtYXAKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfdHJ1bmNhdGVfYXJuYW1lIFwKLQkJCQkJX2JmZF9hcmNoaXZlX2NvZmZfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3dyaXRlX2FybWFwCW1pcHNfZWxmNjRfd3JpdGVfYXJtYXAKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfcmVhZF9hcl9oZHIJX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLQkJCQlfYmZkX2FyY2hpdmVfY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfZ2V0X2VsdF9hdF9pbmRleCBcCi0JCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKLQkJCQkJX2JmZF9hcmNoaXZlX2NvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgXAotCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LXNwYXJjLmMgYi9iZmQvZWxmNjQtc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlNzc3NS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDMwMDcgKzAsMCBAQAotLyogU1BBUkMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoaXMgaXMgZGVmaW5lZCBpZiBvbmUgd2FudHMgdG8gYnVpbGQgdXB3YXJkIGNvbXBhdGlibGUgYmluYXJpZXMKLSAgIHdpdGggdGhlIG9yaWdpbmFsIHNwYXJjNjQtZWxmIHRvb2xjaGFpbi4gIFRoZSBzdXBwb3J0IGlzIGtlcHQgaW4gZm9yCi0gICBub3cgYnV0IGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gIGRqZSA5NzA5MzAgICovCi0vKiNkZWZpbmUgU1BBUkM2NF9PTERfUkVMT0NTKi8KLQotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlLiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FICh+IChiZmRfdm1hKSAwKQotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiBzcGFyYzY0X2VsZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMoKGJmZCAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgc3BhcmM2NF9lbGZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyB2b2lkIHNwYXJjNjRfZWxmX2J1aWxkX3BsdAotICBQQVJBTVMoKGJmZCAqLCB1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGJmZF92bWEgc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldAotICBQQVJBTVMoKGludCkpOwotc3RhdGljIGJmZF92bWEgc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQKLSAgUEFSQU1TKChpbnQsIGludCkpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKnNlYywKLQkgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IHNwYXJjNjRfZWxmX2dldF9zeW1ib2xfdHlwZQotICBQQVJBTVMgKCggRWxmX0ludGVybmFsX1N5bSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotICAgICAgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgdm9pZCBzcGFyYzY0X2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzcGFyYzY0X2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBsb25nIHNwYXJjNjRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9zbHVycF9vbmVfcmVsb2NfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3NsdXJwX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgbG9uZyBzcGFyYzY0X2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIHZvaWQgc3BhcmM2NF9lbGZfd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQwKLS8qIFRoZSByZWxvY2F0aW9uICJob3d0byIgdGFibGUuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfaGl4MjJfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl9sb3gxMF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzgsICAgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfOCIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xNiwgICAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMzIsICAgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18zMiIsICAgICAgZmFsc2UsMCwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1A4LCAgICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDgiLCAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMTYsICAgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AxNiIsICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDMyLCAgICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQMzIiLCAgZmFsc2UsMCwweDAwZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMzAsICAgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AzMCIsIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDIyLCAgIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMjIiLCBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEkyMiwgICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ISTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzIyLCAgICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMjIiLCAgICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMywgICAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEzIiwgICAgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE8xMCwgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MTzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEwLCAgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMywgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDEzIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMjIsICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QyMiIsICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMTAsICAgICAgMCwyLDEwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMxMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzIyLCAgICAgMTAsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV1BMVDMwLCAgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XUExUMzAiLCAgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0NPUFksICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfQ09QWSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HTE9CX0RBVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dMT0JfREFUIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSk1QX1NMT1QsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19KTVBfU0xPVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFTEFUSVZFLCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVMQVRJVkUiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTMyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VBMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0jaWZuZGVmIFNQQVJDNjRfT0xEX1JFTE9DUwotICAvKiBUaGVzZSBhcmVuJ3QgaW1wbGVtZW50ZWQgeWV0LiAgKi8KLSAgSE9XVE8oUl9TUEFSQ19QTFQzMiwgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BMVDMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hJUExUMjIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfSElQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE9QTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19MT1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDMyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BDUExUMzIiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDUExUMjIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUENQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QQ1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSNlbmRpZgotICBIT1dUTyhSX1NQQVJDXzEwLCAgICAgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTAiLCAgICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMSwgICAgICAgIDAsMiwxMSxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzExIiwgICAgICBmYWxzZSwwLDB4MDAwMDA3ZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNjQsICAgICAgICAwLDQsNjQsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ182NCIsICAgICAgZmFsc2UsMCxNSU5VU19PTkUsIHRydWUpLAotICBIT1dUTyhSX1NQQVJDX09MTzEwLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfT0xPMTAiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISDIyLCAgICAgNDIsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hIMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSE0xMCwgICAgIDMyLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ITTEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xNMjIsICAgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTE0yMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ISDIyLCAgNDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDX0hIMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfSE0xMCwgIDMyLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQ19ITTEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0xNMjIsICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUENfTE0yMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE2LCAgIDIsMiwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jLCJSX1NQQVJDX1dESVNQMTYiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AxOSwgICAyLDIsMTksdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDE5IiwgZmFsc2UsMCwweDAwMDdmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VOVVNFRF80MiwgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVU5VU0VEXzQyIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNywgICAgICAgICAwLDIsIDcsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ183IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDdmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzUsICAgICAgICAgMCwyLCA1LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNSIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAxZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ182LCAgICAgICAgIDAsMiwgNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzYiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwM2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDY0LCAgICAwLDQsNjQsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQNjQiLCAgZmFsc2UsMCxNSU5VU19PTkUsIHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BMVDY0LCAgICAgMCw0LDY0LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUExUNjQiLCAgIGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfSElYMjIsICAgICAwLDQsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfaGl4MjJfcmVsb2MsICAiUl9TUEFSQ19ISVgyMiIsICAgZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19MT1gxMCwgICAgIDAsNCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9sb3gxMF9yZWxvYywgICJSX1NQQVJDX0xPWDEwIiwgICBmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0g0NCwgICAgICAyMiwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSDQ0IiwgICAgIGZhbHNlLDAsMHgwMDNmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfTTQ0LCAgICAgIDEyLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19NNDQiLCAgICAgZmFsc2UsMCwweDAwMDAwM2ZmLGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19MNDQsICAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0w0NCIsICAgICBmYWxzZSwwLDB4MDAwMDBmZmYsZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX1JFR0lTVEVSLCAgMCw0LCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUkVHSVNURVIiLGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfVUE2NCwgICAgICAgIDAsNCw2NCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VBNjQiLCAgICAgIGZhbHNlLDAsTUlOVVNfT05FLCB0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUExNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpCi19OwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgc3BhcmNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX1NQQVJDX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX1NQQVJDXzE2LCB9LAotICB7IEJGRF9SRUxPQ184LCBSX1NQQVJDXzggfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TUEFSQ19ESVNQOCB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NQQVJDXzY0IH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX1NQQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NQQVJDX0RJU1AzMiB9LAotICB7IEJGRF9SRUxPQ19ISTIyLCBSX1NQQVJDX0hJMjIgfSwKLSAgeyBCRkRfUkVMT0NfTE8xMCwgUl9TUEFSQ19MTzEwLCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgUl9TUEFSQ19XRElTUDMwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDMjIsIFJfU1BBUkNfMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMxMywgUl9TUEFSQ18xMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgUl9TUEFSQ19HT1QxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMywgUl9TUEFSQ19HT1QxMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgUl9TUEFSQ19HT1QyMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzEwLCBSX1NQQVJDX1BDMTAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUEMyMiwgUl9TUEFSQ19QQzIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgUl9TUEFSQ19XUExUMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfQ09QWSwgUl9TUEFSQ19DT1BZIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULCBSX1NQQVJDX0dMT0JfREFUIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULCBSX1NQQVJDX0pNUF9TTE9UIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFLCBSX1NQQVJDX1JFTEFUSVZFIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIFJfU1BBUkNfV0RJU1AyMiB9LAotICAvKiA/Pz8gRG9lc24ndCBkd2FyZiB1c2UgdGhpcz8gICovCi0vKnsgQkZEX1JFTE9DX1NQQVJDX1VBMzIsIFJfU1BBUkNfVUEzMiB9LCBub3QgdXNlZD8/ICovCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTAsIFJfU1BBUkNfMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDXzExLCBSX1NQQVJDXzExfSwKLSAge0JGRF9SRUxPQ19TUEFSQ182NCwgUl9TUEFSQ182NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfT0xPMTAsIFJfU1BBUkNfT0xPMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0hIMjIsIFJfU1BBUkNfSEgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSE0xMCwgUl9TUEFSQ19ITTEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19MTTIyLCBSX1NQQVJDX0xNMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIsIFJfU1BBUkNfUENfSEgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSE0xMCwgUl9TUEFSQ19QQ19ITTEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19MTTIyLCBSX1NQQVJDX1BDX0xNMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1dESVNQMTYsIFJfU1BBUkNfV0RJU1AxNn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOSwgUl9TUEFSQ19XRElTUDE5fSwKLSAge0JGRF9SRUxPQ19TUEFSQ183LCBSX1NQQVJDXzd9LAotICB7QkZEX1JFTE9DX1NQQVJDXzUsIFJfU1BBUkNfNX0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNiwgUl9TUEFSQ182fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ESVNQNjQsIFJfU1BBUkNfRElTUDY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QTFQ2NCwgUl9TUEFSQ19QTFQ2NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSElYMjIsIFJfU1BBUkNfSElYMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX0xPWDEwLCBSX1NQQVJDX0xPWDEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19INDQsIFJfU1BBUkNfSDQ0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19NNDQsIFJfU1BBUkNfTTQ0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19MNDQsIFJfU1BBUkNfTDQ0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19SRUdJU1RFUiwgUl9TUEFSQ19SRUdJU1RFUn0KLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3BhcmNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKHNwYXJjX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVsoaW50KSBzcGFyY19yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLXNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmNjRfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBCRkRfQVNTRVJUIChFTEY2NF9SX1RZUEVfSUQgKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfU1BBUkNfbWF4X3N0ZCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbRUxGNjRfUl9UWVBFX0lEIChkc3QtPnJfaW5mbyldOwotfQotDAotLyogRHVlIHRvIHRoZSB3YXkgaG93IHdlIGhhbmRsZSBSX1NQQVJDX09MTzEwLCBlYWNoIGVudHJ5IGluIGEgU0hUX1JFTEEKLSAgIHNlY3Rpb24gY2FuIHJlcHJlc2VudCB1cCB0byB0d28gcmVsb2NzLCB3ZSBtdXN0IHRlbGwgdGhlIHVzZXIgdG8gYWxsb2NhdGUKLSAgIG1vcmUgc3BhY2UuICAqLwotICAgCi1zdGF0aWMgbG9uZwotc3BhcmM2NF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIChzZWMtPnJlbG9jX2NvdW50ICogMiArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi1zdGF0aWMgbG9uZwotc3BhcmM2NF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKSAqIDI7Ci19Ci0KLS8qIFJlYWQgIHJlbG9jYXRpb25zIGZvciBBU0VDVCBmcm9tIFJFTF9IRFIuICBUaGVyZSBhcmUgUkVMT0NfQ09VTlQgb2YgCi0gICB0aGVtLiAgV2UgY2Fubm90IHVzZSBnZW5lcmljIGVsZiByb3V0aW5lcyBmb3IgdGhpcywgIGJlY2F1c2UgUl9TUEFSQ19PTE8xMAotICAgaGFzIHNlY29uZGFyeSBhZGRlbmQgaW4gRUxGNjRfUl9UWVBFX0RBVEEuICBXZSBoYW5kbGUgaXQgYXMgdHdvIHJlbG9jYXRpb25zCi0gICBmb3IgdGhlIHNhbWUgbG9jYXRpb24sICBSX1NQQVJDX0xPMTAgYW5kIFJfU1BBUkNfMTMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgcmVsX2hkciwgc3ltYm9scywgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgUFRSIGFsbG9jYXRlZCA9IE5VTEw7Ci0gIGJmZF9ieXRlICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxlbnQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgZW50c2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgYXJlbGVudCAqcmVsZW50czsKLQotICBhbGxvY2F0ZWQgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxfaGRyLT5zaF9zaXplKTsKLSAgaWYgKGFsbG9jYXRlZCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgcmVsX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChhbGxvY2F0ZWQsIDEsIHJlbF9oZHItPnNoX3NpemUsIGFiZmQpCi0JICAhPSByZWxfaGRyLT5zaF9zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBuYXRpdmVfcmVsb2NzID0gKGJmZF9ieXRlICopIGFsbG9jYXRlZDsKLQotICByZWxlbnRzID0gYXNlY3QtPnJlbG9jYXRpb24gKyBhc2VjdC0+cmVsb2NfY291bnQ7Ci0KLSAgZW50c2l6ZSA9IHJlbF9oZHItPnNoX2VudHNpemU7Ci0gIEJGRF9BU1NFUlQgKGVudHNpemUgPT0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSk7Ci0gIAotICBjb3VudCA9IHJlbF9oZHItPnNoX3NpemUgLyBlbnRzaXplOwotCi0gIGZvciAoaSA9IDAsIHJlbGVudCA9IHJlbGVudHM7IGkgPCBjb3VudDsKLSAgICAgICBpKyssIHJlbGVudCsrLCBuYXRpdmVfcmVsb2NzICs9IGVudHNpemUpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luIChhYmZkLCAoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBuYXRpdmVfcmVsb2NzLCAmcmVsYSk7Ci0KLSAgICAgIC8qIFRoZSBhZGRyZXNzIG9mIGFuIEVMRiByZWxvYyBpcyBzZWN0aW9uIHJlbGF0aXZlIGZvciBhbiBvYmplY3QKLQkgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3Igc2hhcmVkIGxpYnJhcnkuCi0JIFRoZSBhZGRyZXNzIG9mIGEgbm9ybWFsIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZSwKLQkgYW5kIHRoZSBhZGRyZXNzIG9mIGEgZHluYW1pYyByZWxvYyBpcyBhYnNvbHV0ZS4uICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCB8fCBkeW5hbWljKQotCXJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQ7Ci0gICAgICBlbHNlCi0JcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldCAtIGFzZWN0LT52bWE7Ci0KLSAgICAgIGlmIChFTEY2NF9SX1NZTSAocmVsYS5yX2luZm8pID09IDApCi0JcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgZWxzZQotCXsKLQkgIGFzeW1ib2wgKipwcywgKnM7Ci0KLQkgIHBzID0gc3ltYm9scyArIEVMRjY0X1JfU1lNIChyZWxhLnJfaW5mbykgLSAxOwotCSAgcyA9ICpwczsKLQotCSAgLyogQ2Fub25pY2FsaXplIEVMRiBzZWN0aW9uIHN5bWJvbHMuICBGSVhNRTogV2h5PyAgKi8KLQkgIGlmICgocy0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBwczsKLQkgIGVsc2UKLQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHMtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgcmVsZW50LT5hZGRlbmQgPSByZWxhLnJfYWRkZW5kOwotCi0gICAgICBCRkRfQVNTRVJUIChFTEY2NF9SX1RZUEVfSUQgKHJlbGEucl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfU1BBUkNfbWF4X3N0ZCk7Ci0gICAgICBpZiAoRUxGNjRfUl9UWVBFX0lEIChyZWxhLnJfaW5mbykgPT0gUl9TUEFSQ19PTE8xMCkKLQl7Ci0JICByZWxlbnQtPmhvd3RvID0gJnNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlW1JfU1BBUkNfTE8xMF07Ci0JICByZWxlbnRbMV0uYWRkcmVzcyA9IHJlbGVudC0+YWRkcmVzczsKLQkgIHJlbGVudCsrOwotCSAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgcmVsZW50LT5hZGRlbmQgPSBFTEY2NF9SX1RZUEVfREFUQSAocmVsYS5yX2luZm8pOwotCSAgcmVsZW50LT5ob3d0byA9ICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtSX1NQQVJDXzEzXTsKLQl9Ci0gICAgICBlbHNlCi0JcmVsZW50LT5ob3d0byA9ICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtFTEY2NF9SX1RZUEVfSUQgKHJlbGEucl9pbmZvKV07Ci0gICAgfQotCi0gIGFzZWN0LT5yZWxvY19jb3VudCArPSByZWxlbnQgLSByZWxlbnRzOwotCi0gIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvY2F0ZWQpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIGFuZCBzd2FwIHRoZSBleHRlcm5hbCByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICogY29uc3QgZCA9IGVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyMjsKLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICB8fCBhc2VjdC0+cmVsb2NfY291bnQgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcmVsX2hkciA9ICZkLT5yZWxfaGRyOwotICAgICAgcmVsX2hkcjIgPSBkLT5yZWxfaGRyMjsKLQotICAgICAgQkZEX0FTU0VSVCAoYXNlY3QtPnJlbF9maWxlcG9zID09IHJlbF9oZHItPnNoX29mZnNldAotCQkgIHx8IChyZWxfaGRyMiAmJiBhc2VjdC0+cmVsX2ZpbGVwb3MgPT0gcmVsX2hkcjItPnNoX29mZnNldCkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBBU0VDVC0+UkVMT0NfQ09VTlQgdGVuZHMgbm90IHRvIGJlIGFjY3VyYXRlIGluIHRoaXMKLQkgY2FzZSBiZWNhdXNlIHJlbG9jYXRpb25zIGFnYWluc3QgdGhpcyBzZWN0aW9uIG1heSB1c2UgdGhlCi0JIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBhbmQgaW4gdGhhdCBjYXNlIGJmZF9zZWN0aW9uX2Zyb21fc2hkcgotCSBpbiBlbGYuYyBkb2VzIG5vdCB1cGRhdGUgdGhlIFJFTE9DX0NPVU5ULiAgKi8KLSAgICAgIGlmIChhc2VjdC0+X3Jhd19zaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJlbF9oZHIgPSAmZC0+dGhpc19oZHI7Ci0gICAgICBhc2VjdC0+cmVsb2NfY291bnQgPSByZWxfaGRyLT5zaF9zaXplIC8gcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIHJlbF9oZHIyID0gTlVMTDsKLSAgICB9Ci0KLSAgYXNlY3QtPnJlbG9jYXRpb24gPSAoKGFyZWxlbnQgKikgCi0JCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIAotCQkJCSAgYXNlY3QtPnJlbG9jX2NvdW50ICogMiAqIHNpemVvZiAoYXJlbGVudCkpKTsKLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBzcGFyYzY0X2VsZl9zbHVycF9vbmVfcmVsb2NfdGFibGUgcm91dGluZSBpbmNyZW1lbnRzIHJlbG9jX2NvdW50LiAgKi8KLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gMDsKLSAgICAKLSAgaWYgKCFzcGFyYzY0X2VsZl9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCByZWxfaGRyLCBzeW1ib2xzLAotCQkJCQkgIGR5bmFtaWMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIGlmIChyZWxfaGRyMiAKLSAgICAgICYmICFzcGFyYzY0X2VsZl9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCByZWxfaGRyMiwgc3ltYm9scywKLQkJCQkJICAgICBkeW5hbWljKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbm9uaWNhbGl6ZSB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGVudHJpZXMuICBOb3RlIHRoYXQgd2UgcmV0dXJuCi0gICB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyBhcyBhIHNpbmdsZSBibG9jaywgYWx0aG91Z2ggdGhleSBhcmUKLSAgIGFjdHVhbGx5IGFzc29jaWF0ZWQgd2l0aCBwYXJ0aWN1bGFyIHNlY3Rpb25zOyB0aGUgaW50ZXJmYWNlLCB3aGljaAotICAgd2FzIGRlc2lnbmVkIGZvciBTdW5PUyBzdHlsZSBzaGFyZWQgbGlicmFyaWVzLCBleHBlY3RzIHRoYXQgdGhlcmUKLSAgIGlzIG9ubHkgb25lIHNldCBvZiBkeW5hbWljIHJlbG9jcy4gIEFueSBzZWN0aW9uIHRoYXQgd2FzIGFjdHVhbGx5Ci0gICBpbnN0YWxsZWQgaW4gdGhlIEJGRCwgYW5kIGhhcyB0eXBlIFNIVF9SRUwgb3IgU0hUX1JFTEEsIGFuZCB1c2VzCi0gICB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBkeW5hbWljIHJlbG9jCi0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGxvbmcKLXNwYXJjNjRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBzdG9yYWdlLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKipzdG9yYWdlOwotICAgICBhc3ltYm9sICoqc3ltczsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGxvbmcgcmV0OwotCi0gIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldCA9IDA7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfbGluayA9PSBlbGZfZHluc3ltdGFiIChhYmZkKQotCSAgJiYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKSkKLQl7Ci0JICBhcmVsZW50ICpwOwotCSAgbG9uZyBjb3VudCwgaTsKLQotCSAgaWYgKCEgc3BhcmM2NF9lbGZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHMsIHN5bXMsIHRydWUpKQotCSAgICByZXR1cm4gLTE7Ci0JICBjb3VudCA9IHMtPnJlbG9jX2NvdW50OwotCSAgcCA9IHMtPnJlbG9jYXRpb247Ci0JICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkgICAgKnN0b3JhZ2UrKyA9IHArKzsKLQkgIHJldCArPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gICpzdG9yYWdlID0gTlVMTDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zcGFyYzY0X2VsZl93cml0ZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgYm9vbGVhbiAqZmFpbGVkcCA9IChib29sZWFuICopIGRhdGE7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxhX2hkcjsKLSAgRWxmNjRfRXh0ZXJuYWxfUmVsYSAqb3V0Ym91bmRfcmVsb2NhcywgKnNyY19yZWxhOwotICB1bnNpZ25lZCBpbnQgaWR4LCBjb3VudDsKLSAgYXN5bWJvbCAqbGFzdF9zeW0gPSAwOwotICBpbnQgbGFzdF9zeW1faWR4ID0gMDsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkLCBkb24ndCBkbyBhbnl0aGluZy4gICovCi0gIGlmICgqZmFpbGVkcCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBUaGUgbGlua2VyIGJhY2tlbmQgd3JpdGVzIHRoZSByZWxvY3Mgb3V0IGl0c2VsZiwgYW5kIHNldHMgdGhlCi0gICAgIHJlbG9jX2NvdW50IGZpZWxkIHRvIHplcm8gdG8gaW5oaWJpdCB3cml0aW5nIHRoZW0gaGVyZS4gIEFsc28sCi0gICAgIHNvbWV0aW1lcyB0aGUgU0VDX1JFTE9DIGZsYWcgZ2V0cyBzZXQgZXZlbiB3aGVuIHRoZXJlIGFyZW4ndCBhbnkKLSAgICAgcmVsb2NzLiAgKi8KLSAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogV2UgY2FuIGNvbWJpbmUgdHdvIHJlbG9jcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGFkZHJlc3MKLSAgICAgaW50byBSX1NQQVJDX09MTzEwIGlmIGZpcnN0IG9uZSBpcyBSX1NQQVJDX0xPMTAgYW5kIHRoZQotICAgICBsYXR0ZXIgaXMgUl9TUEFSQ18xMyB3aXRoIG5vIGFzc29jaWF0ZWQgc3ltYm9sLiAgKi8KLSAgY291bnQgPSAwOwotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkcjsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICArK2NvdW50OwotCi0gICAgICBhZGRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdLT5hZGRyZXNzOwotICAgICAgaWYgKHNlYy0+b3JlbG9jYXRpb25baWR4XS0+aG93dG8tPnR5cGUgPT0gUl9TUEFSQ19MTzEwCi0JICAmJiBpZHggPCBzZWMtPnJlbG9jX2NvdW50IC0gMSkKLQl7Ci0JICBhcmVsZW50ICpyID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQotCSAgaWYgKHItPmhvd3RvLT50eXBlID09IFJfU1BBUkNfMTMKLQkgICAgICAmJiByLT5hZGRyZXNzID09IGFkZHIKLQkgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKCgqci0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKQotCSAgICAgICYmICgqci0+c3ltX3B0cl9wdHIpLT52YWx1ZSA9PSAwKQotCSAgICArK2lkeDsKLQl9Ci0gICAgfQotCi0gIHJlbGFfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHI7Ci0KLSAgcmVsYV9oZHItPnNoX3NpemUgPSByZWxhX2hkci0+c2hfZW50c2l6ZSAqIGNvdW50OwotICByZWxhX2hkci0+Y29udGVudHMgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbGFfaGRyLT5zaF9zaXplKTsKLSAgaWYgKHJlbGFfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGV0aGVyIHRoZSByZWxvY2F0aW9ucyBhcmUgUkVMQSBvciBSRUwgcmVsb2NhdGlvbnMuICAqLwotICBpZiAocmVsYV9oZHItPnNoX3R5cGUgIT0gU0hUX1JFTEEpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogb3JlbG9jYXRpb24gaGFzIHRoZSBkYXRhLCByZWxvY19jb3VudCBoYXMgdGhlIGNvdW50Li4uICovCi0gIG91dGJvdW5kX3JlbG9jYXMgPSAoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHM7Ci0gIHNyY19yZWxhID0gb3V0Ym91bmRfcmVsb2NhczsKLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIGRzdF9yZWxhOwotICAgICAgYXJlbGVudCAqcHRyOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgaW50IG47Ci0KLSAgICAgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKLQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQlkc3RfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzczsKLSAgICAgIGVsc2UKLQlkc3RfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzcyArIHNlYy0+dm1hOwotCi0gICAgICBzeW0gPSAqcHRyLT5zeW1fcHRyX3B0cjsKLSAgICAgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JbiA9IGxhc3Rfc3ltX2lkeDsKLSAgICAgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSAmJiBzeW0tPnZhbHVlID09IDApCi0JbiA9IFNUTl9VTkRFRjsKLSAgICAgIGVsc2UKLQl7Ci0JICBsYXN0X3N5bSA9IHN5bTsKLQkgIG4gPSBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCAmc3ltKTsKLQkgIGlmIChuIDwgMCkKLQkgICAgewotCSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JfQotCi0gICAgICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZCAhPSBOVUxMCi0JICAmJiAoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMKLQkgICYmICEgX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIHB0cikpCi0JewotCSAgKmZhaWxlZHAgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKHB0ci0+aG93dG8tPnR5cGUgPT0gUl9TUEFSQ19MTzEwCi0JICAmJiBpZHggPCBzZWMtPnJlbG9jX2NvdW50IC0gMSkKLQl7Ci0JICBhcmVsZW50ICpyID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQotCSAgaWYgKHItPmhvd3RvLT50eXBlID09IFJfU1BBUkNfMTMKLQkgICAgICAmJiByLT5hZGRyZXNzID09IHB0ci0+YWRkcmVzcwotCSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCi0JICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlID09IDApCi0JICAgIHsKLQkgICAgICBpZHgrKzsKLQkgICAgICBkc3RfcmVsYS5yX2luZm8KLQkJPSBFTEY2NF9SX0lORk8gKG4sIEVMRjY0X1JfVFlQRV9JTkZPIChyLT5hZGRlbmQsCi0JCQkJCQkgICAgICBSX1NQQVJDX09MTzEwKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZHN0X3JlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChuLCBSX1NQQVJDX0xPMTApOwotCX0KLSAgICAgIGVsc2UKLQlkc3RfcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKG4sIHB0ci0+aG93dG8tPnR5cGUpOwotCi0gICAgICBkc3RfcmVsYS5yX2FkZGVuZCA9IHB0ci0+YWRkZW5kOwotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmRzdF9yZWxhLCBzcmNfcmVsYSk7Ci0gICAgICArK3NyY19yZWxhOwotICAgIH0KLX0KLQwKLS8qIFNwYXJjNjQgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHNwYXJjNjRfZWxmX2FwcF9yZWcKLXsKLSAgdW5zaWduZWQgY2hhciBiaW5kOwotICB1bnNpZ25lZCBzaG9ydCBzaG5keDsKLSAgYmZkICphYmZkOwotICBjaGFyICpuYW1lOwotfTsKLQotc3RydWN0IHNwYXJjNjRfZWxmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIHN0cnVjdCBzcGFyYzY0X2VsZl9hcHBfcmVnIGFwcF9yZWdzIFs0XTsKLX07Ci0KLS8qIEdldCB0aGUgU3BhcmM2NCBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIHNwYXJjNjRfZWxmX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBzcGFyYzY0X2VsZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0gIAotLyogQ3JlYXRlIGEgU3BhcmM2NCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotc3BhcmM2NF9lbGZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHNwYXJjNjRfZWxmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHNwYXJjNjRfZWxmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzcGFyYzY0X2VsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzcGFyYzY0X2VsZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLQwKLS8qIFV0aWxpdHkgZm9yIHBlcmZvcm1pbmcgdGhlIHN0YW5kYXJkIGluaXRpYWwgd29yayBvZiBhbiBpbnN0cnVjdGlvbgotICAgcmVsb2NhdGlvbi4KLSAgICpQUkVMT0NBVElPTiB3aWxsIGNvbnRhaW4gdGhlIHJlbG9jYXRlZCBpdGVtLgotICAgKlBJTlNOIHdpbGwgY29udGFpbiB0aGUgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgotICAgSWYgdGhlIHJlc3VsdCBpcyBgYmZkX3JlbG9jX290aGVyJyB0aGUgY2FsbGVyIGNhbiBjb250aW51ZSB3aXRoCi0gICBwZXJmb3JtaW5nIHRoZSByZWxvY2F0aW9uLiAgT3RoZXJ3aXNlIGl0IG11c3Qgc3RvcCBhbmQgcmV0dXJuIHRoZQotICAgdmFsdWUgdG8gaXRzIGNhbGxlci4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWluaXRfaW5zbl9yZWxvYyAoYWJmZCwKLQkJIHJlbG9jX2VudHJ5LAotCQkgc3ltYm9sLAotCQkgZGF0YSwKLQkJIGlucHV0X3NlY3Rpb24sCi0JCSBvdXRwdXRfYmZkLAotCQkgcHJlbG9jYXRpb24sCi0JCSBwaW5zbikKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkX3ZtYSAqcHJlbG9jYXRpb247Ci0gICAgIGJmZF92bWEgKnBpbnNuOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIFRoaXMgd29ya3MgYmVjYXVzZSBwYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZWxvY2F0aW9uID0gKHN5bWJvbC0+dmFsdWUKLQkJKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICAqcHJlbG9jYXRpb24gPSByZWxvY2F0aW9uOwotICAqcGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vdGhlcjsKLX0KLQotLyogRm9yIHVuc3VwcG9ydGVkIHJlbG9jcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl9ub3RzdXBfcmVsb2MgKGFiZmQsCi0JCQlyZWxvY19lbnRyeSwKLQkJCXN5bWJvbCwKLQkJCWRhdGEsCi0JCQlpbnB1dF9zZWN0aW9uLAotCQkJb3V0cHV0X2JmZCwKLQkJCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotLyogSGFuZGxlIHRoZSBXRElTUDE2IHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbnNuOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIGluc24gPSAoaW5zbiAmIH4weDMwM2ZmZikgfCAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQkJCSAgICAgICB8ICgocmVsb2NhdGlvbiA+PiAyKSAmIDB4M2ZmZikpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgLSAweDQwMDAwCi0gICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPiAweDNmZmZmKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gIGVsc2UKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBIYW5kbGUgdGhlIEhJWDIyIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX2hpeDIyX3JlbG9jIChhYmZkLAotCQkgICAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgICBzeW1ib2wsCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfdm1hIGluc247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gaW5pdF9pbnNuX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsICZyZWxvY2F0aW9uLCAmaW5zbik7Ci0gIGlmIChzdGF0dXMgIT0gYmZkX3JlbG9jX290aGVyKQotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgcmVsb2NhdGlvbiBePSBNSU5VU19PTkU7Ci0gIGluc24gPSAoaW5zbiAmIH4weDNmZmZmZikgfCAoKHJlbG9jYXRpb24gPj4gMTApICYgMHgzZmZmZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweGZmZmZmZmZmKSAhPSAwKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gIGVsc2UKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBIYW5kbGUgdGhlIExPWDEwIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX2xveDEwX3JlbG9jIChhYmZkLAotCQkgICAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgICBzeW1ib2wsCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfdm1hIGluc247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gaW5pdF9pbnNuX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsICZyZWxvY2F0aW9uLCAmaW5zbik7Ci0gIGlmIChzdGF0dXMgIT0gYmZkX3JlbG9jX290aGVyKQotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgaW5zbiA9IChpbnNuICYgfjB4MWZmZikgfCAweDFjMDAgfCAocmVsb2NhdGlvbiAmIDB4M2ZmKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQwKLS8qIFBMVC9HT1Qgc3R1ZmYgKi8KLQotLyogQm90aCB0aGUgaGVhZGVycyBhbmQgdGhlIGVudHJpZXMgYXJlIGljYWNoZSBhbGlnbmVkLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUJCTMyCi0jZGVmaW5lIFBMVF9IRUFERVJfU0laRQkJKDQgKiBQTFRfRU5UUllfU0laRSkKLSNkZWZpbmUgTEFSR0VfUExUX1RIUkVTSE9MRAkzMjc2OAotI2RlZmluZSBHT1RfUkVTRVJWRURfRU5UUklFUwkxCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL3NwYXJjdjkvbGQuc28uMSIKLQotCi0vKiBGaWxsIGluIHRoZSAucGx0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc3BhcmM2NF9lbGZfYnVpbGRfcGx0IChvdXRwdXRfYmZkLCBjb250ZW50cywgbmVudHJpZXMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7Ci0gICAgIGludCBuZW50cmllczsKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG5vcCA9IDB4MDEwMDAwMDA7Ci0gIGludCBpLCBqOwotICAKLSAgLyogVGhlIGZpcnN0IGZvdXIgZW50cmllcyBhcmUgcmVzZXJ2ZWQsIGFuZCBhcmUgaW5pdGlhbGx5IHVuZGVmaW5lZC4KLSAgICAgV2UgZmlsbCB0aGVtIHdpdGggYGlsbHRyYXAgMCcgdG8gZm9yY2UgbGQuc28gdG8gZG8gc29tZXRoaW5nLiAgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgUExUX0hFQURFUl9TSVpFLzQ7ICsraSkKLSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBjb250ZW50cytpKjQpOwotCi0gIC8qIFRoZSBmaXJzdCAzMjc2OCBlbnRyaWVzIGFyZSBjbG9zZSBlbm91Z2ggdG8gcGx0MSB0byBnZXQgdGhlcmUgdmlhCi0gICAgIGEgc3RyYWlnaHQgYnJhbmNoLiAgKi8KLQotICBmb3IgKGkgPSA0OyBpIDwgTEFSR0VfUExUX1RIUkVTSE9MRCAmJiBpIDwgbmVudHJpZXM7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICplbnRyeSA9IGNvbnRlbnRzICsgaSAqIFBMVF9FTlRSWV9TSVpFOwotICAgICAgdW5zaWduZWQgaW50IHNldGhpLCBiYTsKLQotICAgICAgLyogc2V0aGkgKC4gLSBwbHQwKSwgJWcxICovCi0gICAgICBzZXRoaSA9IDB4MDMwMDAwMDAgfCAoaSAqIFBMVF9FTlRSWV9TSVpFKTsKLQotICAgICAgLyogYmEsYSxwdCAleGNjLCBwbHQxICovCi0gICAgICBiYSA9IDB4MzA2ODAwMDAgfCAoKChjb250ZW50cytQTFRfRU5UUllfU0laRSkgLSAoZW50cnkrNCkpIC8gNCAmIDB4N2ZmZmYpOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBzZXRoaSwgZW50cnkpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYmEsIGVudHJ5KzQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSs4KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMTIpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsxNik7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzIwKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMjQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsyOCk7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgdHJpY2t5IGJpdC4gIEVudHJpZXMgMzI3NjggYW5kIGhpZ2hlciBhcmUgZ3JvdXBlZCBpbiBibG9ja3Mgb2YKLSAgICAgMTYwOiAxNjAgZW50cmllcyBhbmQgMTYwIHBvaW50ZXJzLiAgVGhpcyBpcyB0byBzZXBhcmF0ZSBjb2RlIGZyb20gZGF0YSwKLSAgICAgd2hpY2ggaXMgbXVjaCBmcmllbmRsaWVyIG9uIHRoZSBjYWNoZS4gICovCi0gIAotICBmb3IgKDsgaSA8IG5lbnRyaWVzOyBpICs9IDE2MCkKLSAgICB7Ci0gICAgICBpbnQgYmxvY2sgPSAoaSArIDE2MCA8PSBuZW50cmllcyA/IDE2MCA6IG5lbnRyaWVzIC0gaSk7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgYmxvY2s7ICsraikKLQl7Ci0JICB1bnNpZ25lZCBjaGFyICplbnRyeSwgKnB0cjsKLQkgIHVuc2lnbmVkIGludCBsZHg7Ci0KLQkgIGVudHJ5ID0gY29udGVudHMgKyBpKlBMVF9FTlRSWV9TSVpFICsgaio0KjY7Ci0JICBwdHIgPSBjb250ZW50cyArIGkqUExUX0VOVFJZX1NJWkUgKyBibG9jayo0KjYgKyBqKjg7Ci0KLQkgIC8qIGxkeCBbJW83ICsgcHRyIC0gZW50cnkrNF0sICVnMSAqLwotCSAgbGR4ID0gMHhjMjViZTAwMCB8ICgocHRyIC0gZW50cnkrNCkgJiAweDFmZmYpOwotCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDhhMTAwMDBmLCBlbnRyeSk7ICAgIC8qIG1vdiAlbzcsJWc1ICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDQwMDAwMDAyLCBlbnRyeSs0KTsgIC8qIGNhbGwgLis4ICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzgpOyAgICAgICAgIC8qIG5vcCAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbGR4LCBlbnRyeSsxMik7ICAgICAgICAvKiBsZHggWyVvNytQXSwlZzEgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4ODNjM2MwMDEsIGVudHJ5KzE2KTsgLyogam1wbCAlbzcrJWcxLCVnMSAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg5ZTEwMDAwNSwgZW50cnkrMjApOyAvKiBtb3YgJWc1LCVvNyAqLwotCi0JICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCBjb250ZW50cyAtIChlbnRyeSs0KSwgcHRyKTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIG9mZnNldCBvZiBhIHBhcnRpY3VsYXIgcGx0IGVudHJ5IHdpdGhpbiB0aGUgLnBsdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLXNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGluZGV4KQotICAgICBpbnQgaW5kZXg7Ci17Ci0gIGludCBibG9jaywgb2ZzOwotCi0gIGlmIChpbmRleCA8IExBUkdFX1BMVF9USFJFU0hPTEQpCi0gICAgcmV0dXJuIGluZGV4ICogUExUX0VOVFJZX1NJWkU7Ci0KLSAgLyogU2VlIGFib3ZlIGZvciBkZXRhaWxzLiAgKi8KLQotICBibG9jayA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpIC8gMTYwOwotICBvZnMgPSAoaW5kZXggLSBMQVJHRV9QTFRfVEhSRVNIT0xEKSAlIDE2MDsKLQotICByZXR1cm4gKChiZmRfdm1hKShMQVJHRV9QTFRfVEhSRVNIT0xEICsgYmxvY2sqMTYwKSAqIFBMVF9FTlRSWV9TSVpFCi0JICArIG9mcyAqIDYqNCk7Ci19Ci0KLXN0YXRpYyBiZmRfdm1hCi1zcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCAoaW5kZXgsIG1heCkKLSAgICAgaW50IGluZGV4LCBtYXg7Ci17Ci0gIGludCBibG9jaywgb2ZzLCBsYXN0OwotCi0gIEJGRF9BU1NFUlQoaW5kZXggPj0gTEFSR0VfUExUX1RIUkVTSE9MRCk7Ci0KLSAgLyogU2VlIGFib3ZlIGZvciBkZXRhaWxzLiAgKi8KLQotICBibG9jayA9ICgoKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgLyAxNjApICogMTYwKQotCSAgKyBMQVJHRV9QTFRfVEhSRVNIT0xEOwotICBvZnMgPSBpbmRleCAtIGJsb2NrOwotICBpZiAoYmxvY2sgKyAxNjAgPiBtYXgpCi0gICAgbGFzdCA9IChtYXggLSBMQVJHRV9QTFRfVEhSRVNIT0xEKSAlIDE2MDsKLSAgZWxzZQotICAgIGxhc3QgPSAxNjA7Ci0KLSAgcmV0dXJuIChibG9jayAqIFBMVF9FTlRSWV9TSVpFCi0JICArIGxhc3QgKiA2KjQKLQkgICsgb2ZzICogOCk7Ci19Ci0KLQotDAotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSB8fCAhKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbGdvdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEY2NF9SX1RZUEVfSUQgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX1NQQVJDX0dPVDEwOgotCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQljYXNlIFJfU1BBUkNfR09UMjI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoZHlub2JqID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJCQkJCSAgKFNFQ19BTExPQwotCQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAzKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGgtPmdvdC5vZmZzZXQgPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCXsKLQkJICBzaXplX3Qgc2l6ZTsKLQkJICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLQotCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfdm1hKTsKLQkJICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOwotCQkgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfaGRyLT5zaF9pbmZvOyBpKyspCi0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tpXSA9IChiZmRfdm1hKSAtMTsKLQkJfQotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkJfQotCSAgICB9Ci0KLQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA4OwotCi0jaWYgMAotCSAgLyogRG9lc24ndCB3b3JrIGZvciA2NC1iaXQgLWZQSUMsIHNpbmNlIHNldGhpL29yIGJ1aWxkcwotCSAgICAgdW5zaWduZWQgbnVtYmVycy4gIElmIHdlIHBlcm1pdCBvdXJzZWx2ZXMgdG8gbW9kaWZ5Ci0JICAgICBjb2RlIHNvIHdlIGdldCBzZXRoaS94b3IsIHRoaXMgY291bGQgd29yay4KLQkgICAgIFF1ZXN0aW9uOiBkbyB3ZSBjb25zaWRlciBjb25kaXRpb25hbGx5IHJlLWVuYWJsaW5nCi0gICAgICAgICAgICAgdGhpcyBmb3IgLWZwaWMsIG9uY2Ugd2Uga25vdyBhYm91dCBvYmplY3QgY29kZSBtb2RlbHM/ICAqLwotCSAgLyogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlIHRoYW4gMHgxMDAwIGJ5dGVzLCB3ZSBhZGQKLQkgICAgIDB4MTAwMCB0byB0aGUgdmFsdWUgb2YgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBzbyB0aGF0IDEzCi0JICAgICBiaXQgcmVsb2NhdGlvbnMgaGF2ZSBhIGdyZWF0ZXIgY2hhbmNlIG9mIHdvcmtpbmcuICAqLwotCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+PSAweDEwMDAKLQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPT0gMCkKLQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID0gMHgxMDAwOwotI2VuZGlmCi0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1dQTFQzMDoKLQljYXNlIFJfU1BBUkNfUExUMzI6Ci0JY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0JY2FzZSBSX1NQQVJDX0xPUExUMTA6Ci0JY2FzZSBSX1NQQVJDX1BDUExUMzI6Ci0JY2FzZSBSX1NQQVJDX1BDUExUMjI6Ci0JY2FzZSBSX1NQQVJDX1BDUExUMTA6Ci0JY2FzZSBSX1NQQVJDX1BMVDY0OgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2l0aG91dAotICAgICAgICAgICAgIGxpbmtpbmcgaW4gYW55IGR5bmFtaWMgb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgIG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhZnRlciBhbGwuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIGEgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgICAgICAgICAgICAgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19QQzEwOgotCWNhc2UgUl9TUEFSQ19QQzIyOgotCWNhc2UgUl9TUEFSQ19QQ19ISDIyOgotCWNhc2UgUl9TUEFSQ19QQ19ITTEwOgotCWNhc2UgUl9TUEFSQ19QQ19MTTIyOgotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQljYXNlIFJfU1BBUkNfRElTUDMyOgotCWNhc2UgUl9TUEFSQ19ESVNQNjQ6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDXzg6Ci0JY2FzZSBSX1NQQVJDXzE2OgotCWNhc2UgUl9TUEFSQ18zMjoKLQljYXNlIFJfU1BBUkNfSEkyMjoKLQljYXNlIFJfU1BBUkNfMjI6Ci0JY2FzZSBSX1NQQVJDXzEzOgotCWNhc2UgUl9TUEFSQ19MTzEwOgotCWNhc2UgUl9TUEFSQ19VQTMyOgotCWNhc2UgUl9TUEFSQ18xMDoKLQljYXNlIFJfU1BBUkNfMTE6Ci0JY2FzZSBSX1NQQVJDXzY0OgotCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQljYXNlIFJfU1BBUkNfSEgyMjoKLQljYXNlIFJfU1BBUkNfSE0xMDoKLQljYXNlIFJfU1BBUkNfTE0yMjoKLQljYXNlIFJfU1BBUkNfNzoKLQljYXNlIFJfU1BBUkNfNToKLQljYXNlIFJfU1BBUkNfNjoKLQljYXNlIFJfU1BBUkNfSElYMjI6Ci0JY2FzZSBSX1NQQVJDX0xPWDEwOgotCWNhc2UgUl9TUEFSQ19INDQ6Ci0JY2FzZSBSX1NQQVJDX000NDoKLQljYXNlIFJfU1BBUkNfTDQ0OgotCWNhc2UgUl9TUEFSQ19VQTY0OgotCWNhc2UgUl9TUEFSQ19VQTE2OgotCSAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZSByZWxvY3MKLQkgICAgIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2Mgc2VjdGlvbiBpbgotCSAgICAgZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoZSByZWxvYy4gCi0KLQkgICAgIEJ1dCBkb24ndCBkbyB0aGlzIGZvciBkZWJ1Z2dpbmcgc2VjdGlvbnMgLS0gdGhpcyBzaG93cyB1cAotCSAgICAgd2l0aCBEV0FSRjIgLS0gZmlyc3QgYmVjYXVzZSB0aGV5IGFyZSBub3QgbG9hZGVkLCBhbmQKLQkgICAgIHNlY29uZCBiZWNhdXNlIERXQVJGIHNleiB0aGUgZGVidWcgaW5mbyBpcyBub3QgdG8gYmUKLQkgICAgIGJpYXNlZCBieSB0aGUgbG9hZCBhZGRyZXNzLiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpKQotCSAgICB7Ci0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKLQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCQlmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19SRUdJU1RFUjoKLQkgIC8qIE5vdGhpbmcgdG8gZG8uICAqLwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpKF8oIiVzOiBjaGVja19yZWxvY3M6IHVuaGFuZGxlZCByZWxvYyB0eXBlICVkIiksCi0JCQkJYmZkX2dldF9maWxlbmFtZShhYmZkKSwKLQkJCQlFTEY2NF9SX1RZUEVfSUQgKHJlbC0+cl9pbmZvKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIHVzZSBpdCBmb3IgU1RUX1JFR0lTVEVSIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBmbGFnd29yZCAqZmxhZ3NwOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIHN0YXRpYyBjaGFyICpzdHRfdHlwZXNbXSA9IHsgIk5PVFlQRSIsICJPQkpFQ1QiLCAiRlVOQ1RJT04iIH07Ci0KLSAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9SRUdJU1RFUikKLSAgICB7Ci0gICAgICBpbnQgcmVnOwotICAgICAgc3RydWN0IHNwYXJjNjRfZWxmX2FwcF9yZWcgKnA7Ci0gICAgICAKLSAgICAgIHJlZyA9IChpbnQpc3ltLT5zdF92YWx1ZTsKLSAgICAgIHN3aXRjaCAocmVnICYgfjEpCi0JewotCWNhc2UgMjogcmVnIC09IDI7IGJyZWFrOwotCWNhc2UgNjogcmVnIC09IDQ7IGJyZWFrOwotCWRlZmF1bHQ6Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgICAoXygiJXM6IE9ubHkgcmVnaXN0ZXJzICUlZ1syMzY3XSBjYW4gYmUgZGVjbGFyZWQgdXNpbmcgU1RUX1JFR0lTVEVSIiksCi0gICAgICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYwotCSAgfHwgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICAgICAgewotCSAgLyogU1RUX1JFR0lTVEVSIG9ubHkgd29ya3Mgd2hlbiBsaW5raW5nIGFuIGVsZjY0X3NwYXJjIG9iamVjdC4KLQkgICAgIElmIFNUVF9SRUdJU1RFUiBjb21lcyBmcm9tIGEgZHluYW1pYyBvYmplY3QsIGRvbid0IHB1dCBpdCBpbnRvCi0JICAgICB0aGUgb3V0cHV0IGJmZC4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHJlY2hlY2sgaXQuICAqLwotCSAgKm5hbWVwID0gTlVMTDsKLQkgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIHAgPSBzcGFyYzY0X2VsZl9oYXNoX3RhYmxlKGluZm8pLT5hcHBfcmVncyArIHJlZzsKLQotICAgICAgaWYgKHAtPm5hbWUgIT0gTlVMTCAmJiBzdHJjbXAgKHAtPm5hbWUsICpuYW1lcCkpCi0JewotICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgKF8oIlJlZ2lzdGVyICUlZyVkIHVzZWQgaW5jb21wYXRpYmx5OiAiCi0gICAgICAgICAgICAgICAicHJldmlvdXNseSBkZWNsYXJlZCBpbiAlcyB0byAlcywgaW4gJXMgcmVkZWZpbmVkIHRvICVzIiksCi0gICAgICAgICAgICAgKGludClzeW0tPnN0X3ZhbHVlLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHAtPmFiZmQpLCAqcC0+bmFtZSA/IHAtPm5hbWUgOiAiI3NjcmF0Y2giLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAqKm5hbWVwID8gKm5hbWVwIDogIiNzY3JhdGNoIik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocC0+bmFtZSA9PSBOVUxMKQotCXsKLQkgIGlmICgqKm5hbWVwKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICAgICAgCi0JICAgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCQliZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgKm5hbWVwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCXsKLQkJICB1bnNpZ25lZCBjaGFyIHR5cGUgPSBoLT50eXBlOwotCi0JCSAgaWYgKHR5cGUgPiBTVFRfRlVOQykgdHlwZSA9IDA7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiU3ltYm9sIGAlcycgaGFzIGRpZmZlcmluZyB0eXBlczogIgotCQkgICAgICAgInByZXZpb3VzbHkgJXMsIFJFR0lTVEVSIGluICVzIiksCi0JCSAgICAgKm5hbWVwLCBzdHRfdHlwZXMgW3R5cGVdLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBwLT5uYW1lID0gYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJICAgc3RybGVuICgqbmFtZXApICsgMSk7Ci0JICAgICAgaWYgKCFwLT5uYW1lKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBzdHJjcHkgKHAtPm5hbWUsICpuYW1lcCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcC0+bmFtZSA9ICIiOwotCSAgcC0+YmluZCA9IEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pOwotCSAgcC0+YWJmZCA9IGFiZmQ7Ci0JICBwLT5zaG5keCA9IHN5bS0+c3Rfc2huZHg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChwLT5iaW5kID09IFNUQl9XRUFLCi0JICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPT0gU1RCX0dMT0JBTCkKLQkgICAgewotCSAgICAgIHAtPmJpbmQgPSBTVEJfR0xPQkFMOwotCSAgICAgIHAtPmFiZmQgPSBhYmZkOwotCSAgICB9Ci0JfQotICAgICAgKm5hbWVwID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZSBpZiAoISAqbmFtZXAgfHwgISAqKm5hbWVwKQotICAgIHJldHVybiB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBzdHJ1Y3Qgc3BhcmM2NF9lbGZfYXBwX3JlZyAqcDsKLQotICAgICAgcCA9IHNwYXJjNjRfZWxmX2hhc2hfdGFibGUoaW5mbyktPmFwcF9yZWdzOwotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgcCsrKQotCWlmIChwLT5uYW1lICE9IE5VTEwgJiYgISBzdHJjbXAgKHAtPm5hbWUsICpuYW1lcCkpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGNoYXIgdHlwZSA9IEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pOwotCi0JICAgIGlmICh0eXBlID4gU1RUX0ZVTkMpIHR5cGUgPSAwOwotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAoXygiU3ltYm9sIGAlcycgaGFzIGRpZmZlcmluZyB0eXBlczogIgotCQkgIlJFR0lTVEVSIGluICVzLCAlcyBpbiAlcyIpLAotCSAgICAgICAqbmFtZXAsIGJmZF9nZXRfZmlsZW5hbWUgKHAtPmFiZmQpLCBzdHRfdHlwZXMgW3R5cGVdLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgZW1pdGluZyBTVFRfUkVHSVNURVIgc3ltYm9scwotICAgd2hpY2ggd2UgY2Fubm90IGVhc2lseSBrZWVwIGluIHRoZSBzeW1ib2wgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9vdXRwdXRfYXJjaF9zeW1zIChvdXRwdXRfYmZkLCBpbmZvLCBmaW5mbywgZnVuYykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgUFRSIGZpbmZvOwotICAgICBib29sZWFuICgqZnVuYykgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0JCQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLXsKLSAgaW50IHJlZzsKLSAgc3RydWN0IHNwYXJjNjRfZWxmX2FwcF9yZWcgKmFwcF9yZWdzID0KLSAgICBzcGFyYzY0X2VsZl9oYXNoX3RhYmxlKGluZm8pLT5hcHBfcmVnczsKLSAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0KLSAgLyogV2UgYXJyYW5nZWQgaW4gc2l6ZV9keW5hbWljX3NlY3Rpb25zIHRvIHB1dCB0aGUgU1RUX1JFR0lTVEVSIGVudHJpZXMKLSAgICAgYXQgdGhlIGVuZCBvZiB0aGUgZHlubG9jYWwgbGlzdCwgc28gdGhleSBjYW1lIGF0IHRoZSBlbmQgb2YgdGhlIGxvY2FsCi0gICAgIHN5bWJvbHMgaW4gdGhlIHN5bXRhYi4gIEV4Y2VwdCB0aGF0IHRoZXkgYXJlbid0IFNUQl9MT0NBTCwgc28gd2UgbmVlZAotICAgICB0byBiYWNrIHVwIHN5bXRhYi0+c2hfaW5mby4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsKQotICAgIHsKLSAgICAgIGJmZCAqIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICAgICAgYXNlY3Rpb24gKmR5bnN5bXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqZTsKLQotICAgICAgZm9yIChlID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbDsgZSA7IGUgPSBlLT5uZXh0KQotCWlmIChlLT5pbnB1dF9pbmR4ID09IC0xKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoZSkKLQl7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChkeW5zeW1zZWMtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbwotCSAgICA9IGUtPmR5bmluZHg7Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocmVnID0gMDsgcmVnIDwgNDsgcmVnKyspCi0gICAgaWYgKGFwcF9yZWdzIFtyZWddLm5hbWUgIT0gTlVMTCkKLSAgICAgIHsKLQlpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGluZm8tPmtlZXBfaGFzaCwKLQkJCQlhcHBfcmVncyBbcmVnXS5uYW1lLAotCQkJCWZhbHNlLCBmYWxzZSkgPT0gTlVMTCkKLQkgIGNvbnRpbnVlOwotCi0Jc3ltLnN0X3ZhbHVlID0gcmVnIDwgMiA/IHJlZyArIDIgOiByZWcgKyA0OwotCXN5bS5zdF9zaXplID0gMDsKLQlzeW0uc3Rfb3RoZXIgPSAwOwotCXN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGFwcF9yZWdzIFtyZWddLmJpbmQsIFNUVF9SRUdJU1RFUik7Ci0Jc3ltLnN0X3NobmR4ID0gYXBwX3JlZ3MgW3JlZ10uc2huZHg7Ci0JaWYgKCEgKCpmdW5jKSAoZmluZm8sIGFwcF9yZWdzIFtyZWddLm5hbWUsICZzeW0sCi0JCSAgICAgICBzeW0uc3Rfc2huZHggPT0gU0hOX0FCUwotCQkJID8gYmZkX2Fic19zZWN0aW9uX3B0ciA6IGJmZF91bmRfc2VjdGlvbl9wdHIpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1zcGFyYzY0X2VsZl9nZXRfc3ltYm9sX3R5cGUgKGVsZl9zeW0sIHR5cGUpCi0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBlbGZfc3ltOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKEVMRl9TVF9UWVBFIChlbGZfc3ltLT5zdF9pbmZvKSA9PSBTVFRfUkVHSVNURVIpCi0gICAgcmV0dXJuIFNUVF9SRUdJU1RFUjsKLSAgZWxzZQotICAgIHJldHVybiB0eXBlOwotfQotCi0vKiBBIFNUQl9HTE9CQUwsU1RUX1JFR0lTVEVSIHN5bWJvbCBzaG91bGQgYmUgQlNGX0dMT0JBTAotICAgZXZlbiBpbiBTSE5fVU5ERUYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zcGFyYzY0X2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0gIGlmIChlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbwotICAgICAgPT0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9SRUdJU1RFUikpCi0gICAgewotICAgICAgYXN5bS0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLSAgICB9Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyCi0gICAgIChhbHRob3VnaCB3ZSBjb3VsZCBhY3R1YWxseSBkbyBpdCBoZXJlKS4gIFRoZSBTVFRfTk9UWVBFCi0gICAgIGNvbmRpdGlvbiBpcyBhIGhhY2sgc3BlY2lmaWNhbGx5IGZvciB0aGUgT3JhY2xlIGxpYnJhcmllcwotICAgICBkZWxpdmVyZWQgZm9yIFNvbGFyaXM7IGZvciBzb21lIGluZXhwbGljYWJsZSByZWFzb24sIHRoZXkgZGVmaW5lCi0gICAgIHNvbWUgb2YgdGhlaXIgZnVuY3Rpb25zIGFzIFNUVF9OT1RZUEUgd2hlbiB0aGV5IHJlYWxseSBzaG91bGQgYmUKLSAgICAgU1RUX0ZVTkMuICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMAotICAgICAgfHwgKGgtPnR5cGUgPT0gU1RUX05PVFlQRQotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkpCi0gICAgewotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBXUExUMzAgcmVsb2MgaW4gYW4gaW5wdXQKLSAgICAgICAgICAgICBmaWxlLCBidXQgbm9uZSBvZiB0aGUgaW5wdXQgZmlsZXMgd2VyZSBkeW5hbWljIG9iamVjdHMuCi0gICAgICAgICAgICAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQgYQotICAgICAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBXRElTUDMwCi0gICAgICAgICAgICAgcmVsb2MgaW5zdGVhZC4gICovCi0JICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBUaGUgZmlyc3QgZm91ciBiaXQgaW4gLnBsdCBpcyByZXNlcnZlZC4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplID0gUExUX0hFQURFUl9TSVpFOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCX0KLQotICAgICAgLyogVG8gc2ltcGxpZnkgbWF0dGVycyBsYXRlciwganVzdCBzdG9yZSB0aGUgcGx0IGluZGV4IGhlcmUuICAqLwotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZSAvIFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogVGhlIGZpcnN0IHBsdCBlbnRyaWVzIGFyZSByZXNlcnZlZCwgYW5kIHRoZSByZWxvY2F0aW9ucyBtdXN0Ci0JIHBhaXIgdXAgZXhhY3RseS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplICs9IChQTFRfSEVBREVSX1NJWkUvUExUX0VOVFJZX1NJWkUKLQkJCSAqIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpOwotCi0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgLyogVGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHNpemUgaXMgYm91bmRlZCBieSB0aGUgbWFnbml0dWRlCi0JIG9mIHRoZSBvZmZzZXQgd2UgY2FuIGRlc2NyaWJlIGluIHRoZSBlbnRyeS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID49IChiZmRfdm1hKTEgPDwgMzIpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9TUEFSQ19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyCi0gICAgIHRvIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWwuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAxNi1ieXRlcyBpcyB0aGUgc2l6ZQotICAgICBvZiB0aGUgbGFyZ2VzdCB0eXBlIHRoYXQgcmVxdWlyZXMgaGFyZCBhbGlnbm1lbnQgLS0gbG9uZyBkb3VibGUuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiA0KQotICAgIHBvd2VyX29mX3R3byA9IDQ7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLSAgYm9vbGVhbiByZWxwbHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3Qgc2VjdGlvbi4KLSAgICAgICAgIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLSAgICAgICAgIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0IHRoZSBzaXplIG9mIC5yZWxhLmdvdCwKLSAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0gICAgICAgICBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHJlbHRleHQgPSBmYWxzZTsKLSAgcmVscGx0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbC5wbHQuICBXZSBtdXN0IGNyZWF0ZSBpdCBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgaXQgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLQkJcmVsdGV4dCA9IHRydWU7Ci0KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbGEucGx0IikgPT0gMCkKLQkJcmVscGx0ID0gdHJ1ZTsKLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgIT0gMAotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gIFplcm8gdGhlIG1lbW9yeQotCSBmb3IgdGhlIGJlbmVmaXQgb2YgLnJlbGEucGx0LCB3aGljaCBoYXMgNCB1bnVzZWQgZW50cmllcwotCSBhdCB0aGUgYmVnaW5uaW5nLCBhbmQgd2UgZG9uJ3Qgd2FudCBnYXJiYWdlLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGludCByZWc7Ci0gICAgICBzdHJ1Y3Qgc3BhcmM2NF9lbGZfYXBwX3JlZyAqIGFwcF9yZWdzOwotICAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKmVodCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKTsKLQotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVscGx0KQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIEFkZCBkeW5hbWljIFNUVF9SRUdJU1RFUiBzeW1ib2xzIGFuZCBjb3JyZXNwb25kaW5nIERUX1NQQVJDX1JFR0lTVEVSCi0JIGVudHJpZXMgaWYgbmVlZGVkLiAgKi8KLSAgICAgIGFwcF9yZWdzID0gc3BhcmM2NF9lbGZfaGFzaF90YWJsZSAoaW5mbyktPmFwcF9yZWdzOwotICAgICAgZHluc3RyID0gZWh0LT5keW5zdHI7Ci0KLSAgICAgIGZvciAocmVnID0gMDsgcmVnIDwgNDsgcmVnKyspCi0JaWYgKGFwcF9yZWdzIFtyZWddLm5hbWUgIT0gTlVMTCkKLQkgIHsKLQkgICAgc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKmVudHJ5LCAqZTsKLQkgICAgICAKLQkgICAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TUEFSQ19SRUdJU1RFUiwgMCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGVudHJ5ID0gKHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICopCi0JICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwgc2l6ZW9mICgqZW50cnkpKTsKLQkgICAgaWYgKGVudHJ5ID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIC8qIFdlIGNoZWF0IGhlcmUgYSBsaXR0bGUgYml0OiB0aGUgc3ltYm9sIHdpbGwgbm90IGJlIGxvY2FsLCBzbyB3ZQotCSAgICAgICBwdXQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgZHlubG9jYWwgbGlua2VkIGxpc3QuICBXZSB3aWxsIGZpeCBpdAotCSAgICAgICBsYXRlciBvbiwgYXMgd2UgaGF2ZSB0byBmaXggb3RoZXIgZmllbGRzIGFueXdheS4gICovCi0JICAgIGVudHJ5LT5pc3ltLnN0X3ZhbHVlID0gcmVnIDwgMiA/IHJlZyArIDIgOiByZWcgKyA0OwotCSAgICBlbnRyeS0+aXN5bS5zdF9zaXplID0gMDsKLQkgICAgaWYgKCphcHBfcmVncyBbcmVnXS5uYW1lICE9ICdcMCcpCi0JICAgICAgZW50cnktPmlzeW0uc3RfbmFtZQotCQk9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZHluc3RyLCBhcHBfcmVnc1tyZWddLm5hbWUsIHRydWUsIGZhbHNlKTsKLQkgICAgZWxzZQotCSAgICAgIGVudHJ5LT5pc3ltLnN0X25hbWUgPSAwOwotCSAgICBlbnRyeS0+aXN5bS5zdF9vdGhlciA9IDA7Ci0JICAgIGVudHJ5LT5pc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoYXBwX3JlZ3MgW3JlZ10uYmluZCwKLQkJCQkJICAgICAgIFNUVF9SRUdJU1RFUik7Ci0JICAgIGVudHJ5LT5pc3ltLnN0X3NobmR4ID0gYXBwX3JlZ3MgW3JlZ10uc2huZHg7Ci0JICAgIGVudHJ5LT5uZXh0ID0gTlVMTDsKLQkgICAgZW50cnktPmlucHV0X2JmZCA9IG91dHB1dF9iZmQ7Ci0JICAgIGVudHJ5LT5pbnB1dF9pbmR4ID0gLTE7Ci0KLQkgICAgaWYgKGVodC0+ZHlubG9jYWwgPT0gTlVMTCkKLQkgICAgICBlaHQtPmR5bmxvY2FsID0gZW50cnk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWZvciAoZSA9IGVodC0+ZHlubG9jYWw7IGUtPm5leHQ7IGUgPSBlLT5uZXh0KQotCQkgIDsKLQkJZS0+bmV4dCA9IGVudHJ5OwotCSAgICAgIH0KLQkgICAgZWh0LT5keW5zeW1jb3VudCsrOwotCSAgfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlbG9jYXRlIGEgU1BBUkM2NCBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYmZkX3ZtYSBnb3RfYmFzZTsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUoaW5mbyktPmhnb3QgPT0gTlVMTCkKLSAgICBnb3RfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBnb3RfYmFzZSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICBzZ290ID0gc3BsdCA9IHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEY2NF9SX1RZUEVfSUQgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1NQQVJDX21heF9zdGQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBza2lwX2l0ID0gZmFsc2U7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgICAgc3dpdGNoIChyX3R5cGUpCi0JCXsKLQkJY2FzZSBSX1NQQVJDX1dQTFQzMDoKLQkJY2FzZSBSX1NQQVJDX1BMVDMyOgotCQljYXNlIFJfU1BBUkNfSElQTFQyMjoKLQkJY2FzZSBSX1NQQVJDX0xPUExUMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQ1BMVDMyOgotCQljYXNlIFJfU1BBUkNfUENQTFQyMjoKLQkJY2FzZSBSX1NQQVJDX1BDUExUMTA6Ci0JCWNhc2UgUl9TUEFSQ19QTFQ2NDoKLQkJICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwX2l0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQkJY2FzZSBSX1NQQVJDX0dPVDIyOgotCQkgIGlmIChlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghaW5mby0+c2hhcmVkCi0JCQkgIHx8ICghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgICBza2lwX2l0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfU1BBUkNfUEMxMDoKLQkJY2FzZSBSX1NQQVJDX1BDMjI6Ci0JCWNhc2UgUl9TUEFSQ19QQ19ISDIyOgotCQljYXNlIFJfU1BBUkNfUENfSE0xMDoKLQkJY2FzZSBSX1NQQVJDX1BDX0xNMjI6Ci0JCSAgaWYgKCFzdHJjbXAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpKQotCQkgICAgYnJlYWs7Ci0JCSAgLyogRkFMTFRIUlUgKi8KLQotCQljYXNlIFJfU1BBUkNfODoKLQkJY2FzZSBSX1NQQVJDXzE2OgotCQljYXNlIFJfU1BBUkNfMzI6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQODoKLQkJY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQkJY2FzZSBSX1NQQVJDX0RJU1AzMjoKLQkJY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCQljYXNlIFJfU1BBUkNfSEkyMjoKLQkJY2FzZSBSX1NQQVJDXzIyOgotCQljYXNlIFJfU1BBUkNfMTM6Ci0JCWNhc2UgUl9TUEFSQ19MTzEwOgotCQljYXNlIFJfU1BBUkNfVUEzMjoKLQkJY2FzZSBSX1NQQVJDXzEwOgotCQljYXNlIFJfU1BBUkNfMTE6Ci0JCWNhc2UgUl9TUEFSQ182NDoKLQkJY2FzZSBSX1NQQVJDX09MTzEwOgotCQljYXNlIFJfU1BBUkNfSEgyMjoKLQkJY2FzZSBSX1NQQVJDX0hNMTA6Ci0JCWNhc2UgUl9TUEFSQ19MTTIyOgotCQljYXNlIFJfU1BBUkNfV0RJU1AxOToKLQkJY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JCWNhc2UgUl9TUEFSQ183OgotCQljYXNlIFJfU1BBUkNfNToKLQkJY2FzZSBSX1NQQVJDXzY6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQNjQ6Ci0JCWNhc2UgUl9TUEFSQ19ISVgyMjoKLQkJY2FzZSBSX1NQQVJDX0xPWDEwOgotCQljYXNlIFJfU1BBUkNfSDQ0OgotCQljYXNlIFJfU1BBUkNfTTQ0OgotCQljYXNlIFJfU1BBUkNfTDQ0OgotCQljYXNlIFJfU1BBUkNfVUE2NDoKLQkJY2FzZSBSX1NQQVJDX1VBMTY6Ci0JCSAgaWYgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoKCFpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAhKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJICAgIHNraXBfaXQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAoc2tpcF9pdCkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgIG9ic2N1cmUgY2FzZXMgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICAqLwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCwKLQkJICAgICAgKCFpbmZvLT5zaGFyZWQgfHwgaW5mby0+bm9fdW5kZWZpbmVkKSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBjb3BpZWQKLQkgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWUuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZCAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpKQotCXsKLQkgIHN3aXRjaCAocl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgUl9TUEFSQ19QQzEwOgotCSAgICBjYXNlIFJfU1BBUkNfUEMyMjoKLQkgICAgY2FzZSBSX1NQQVJDX1BDX0hIMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19QQ19ITTEwOgotCSAgICBjYXNlIFJfU1BBUkNfUENfTE0yMjoKLQkgICAgICBpZiAoaCAhPSBOVUxMCi0JCSAgJiYgIXN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpKQotCQlicmVhazsKLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIFJfU1BBUkNfRElTUDg6Ci0JICAgIGNhc2UgUl9TUEFSQ19ESVNQMTY6Ci0JICAgIGNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JICAgIGNhc2UgUl9TUEFSQ19XRElTUDMwOgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AyMjoKLQkgICAgY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JICAgIGNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgICBjYXNlIFJfU1BBUkNfRElTUDY0OgotCSAgICAgIGlmIChoID09IE5VTEwpCi0JCWJyZWFrOwotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2UgUl9TUEFSQ184OgotCSAgICBjYXNlIFJfU1BBUkNfMTY6Ci0JICAgIGNhc2UgUl9TUEFSQ18zMjoKLQkgICAgY2FzZSBSX1NQQVJDX0hJMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ18yMjoKLQkgICAgY2FzZSBSX1NQQVJDXzEzOgotCSAgICBjYXNlIFJfU1BBUkNfTE8xMDoKLQkgICAgY2FzZSBSX1NQQVJDX1VBMzI6Ci0JICAgIGNhc2UgUl9TUEFSQ18xMDoKLQkgICAgY2FzZSBSX1NQQVJDXzExOgotCSAgICBjYXNlIFJfU1BBUkNfNjQ6Ci0JICAgIGNhc2UgUl9TUEFSQ19PTE8xMDoKLQkgICAgY2FzZSBSX1NQQVJDX0hIMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19ITTEwOgotCSAgICBjYXNlIFJfU1BBUkNfTE0yMjoKLQkgICAgY2FzZSBSX1NQQVJDXzc6Ci0JICAgIGNhc2UgUl9TUEFSQ181OgotCSAgICBjYXNlIFJfU1BBUkNfNjoKLQkgICAgY2FzZSBSX1NQQVJDX0hJWDIyOgotCSAgICBjYXNlIFJfU1BBUkNfTE9YMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19INDQ6Ci0JICAgIGNhc2UgUl9TUEFSQ19NNDQ6Ci0JICAgIGNhc2UgUl9TUEFSQ19MNDQ6Ci0JICAgIGNhc2UgUl9TUEFSQ19VQTY0OgotCSAgICBjYXNlIFJfU1BBUkNfVUExNjoKLQkgICAgICB7Ci0JCUVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkJYm9vbGVhbiBza2lwOwotCi0JCWlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuYW1lID0KLQkJICAgICAgKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgIChpbnB1dF9iZmQsCi0JCQllbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCi0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCQkmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwKLQkJCQkJCQkJaW5wdXRfc2VjdGlvbiksCi0JCQkJCSAgIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCSAgfQotCi0JCXNraXAgPSBmYWxzZTsKLQotCQlpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQkgIG91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBiZmRfdm1hIG9mZjsKLQotCQkgICAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkJICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJICAgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICAgIGlmIChvZmYgPT0gTUlOVVNfT05FKQotCQkgICAgICBza2lwID0gdHJ1ZTsKLQkJICAgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkJICB9Ci0KLQkJb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkJLyogT3B0aW1pemUgdW5hbGlnbmVkIHJlbG9jIHVzYWdlIG5vdyB0aGF0IHdlIGtub3cgd2hlcmUKLQkJICAgaXQgZmluYWxseSByZXNpZGVzLiAgKi8KLQkJc3dpdGNoIChyX3R5cGUpCi0JCSAgewotCQkgIGNhc2UgUl9TUEFSQ18xNjoKLQkJICAgIGlmIChvdXRyZWwucl9vZmZzZXQgJiAxKSByX3R5cGUgPSBSX1NQQVJDX1VBMTY7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfVUExNjoKLQkJICAgIGlmICghKG91dHJlbC5yX29mZnNldCAmIDEpKSByX3R5cGUgPSBSX1NQQVJDXzE2OwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDXzMyOgotCQkgICAgaWYgKG91dHJlbC5yX29mZnNldCAmIDMpIHJfdHlwZSA9IFJfU1BBUkNfVUEzMjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ19VQTMyOgotCQkgICAgaWYgKCEob3V0cmVsLnJfb2Zmc2V0ICYgMykpIHJfdHlwZSA9IFJfU1BBUkNfMzI7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfNjQ6Ci0JCSAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ICYgNykgcl90eXBlID0gUl9TUEFSQ19VQTY0OwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JCSAgICBpZiAoIShvdXRyZWwucl9vZmZzZXQgJiA3KSkgcl90eXBlID0gUl9TUEFSQ182NDsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQlpZiAoc2tpcCkKLQkJICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCQkvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGUgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLQkJICAgYmVjb21lIGxvY2FsLiAgKi8KLQkJZWxzZSBpZiAoaCAhPSBOVUxMCi0JCQkgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCSAgewotCQkgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgICBvdXRyZWwucl9pbmZvCi0JCSAgICAgID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LAotCQkJCSAgICAgIEVMRjY0X1JfVFlQRV9JTkZPICgKLQkJCQkJRUxGNjRfUl9UWVBFX0RBVEEgKHJlbC0+cl9pbmZvKSwKLQkJCQkJCQkgICByX3R5cGUpKTsKLQkJICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDXzY0KQotCQkgICAgICB7Ci0JCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJCW91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWxvbmcgaW5keDsKLQotCQkJaWYgKGggPT0gTlVMTCkKLQkJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCQl8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQkJCSAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQkgIH0KLQkJCWlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQkgIGluZHggPSAwOwotCQkJZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJICB7Ci0JCQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICAgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICAgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQotCQkJICAgIC8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkIGJlIGFibGUgdG8gbGluayBub24tcGljCi0JCQkgICAgICAgc2hhcmVkIGxpYnJhcmllcy4gICovCi0JCQkgICAgaWYgKGluZHggPT0gMCkKLQkJCSAgICAgIHsKLQkJCQlCRkRfRkFJTCAoKTsKLQkJCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCQkgIChfKCIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iKSwKLQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQotCQkJb3V0cmVsLnJfaW5mbwotCQkJICA9IEVMRjY0X1JfSU5GTyAoaW5keCwKLQkJCQkJICBFTEY2NF9SX1RZUEVfSU5GTyAoCi0JCQkJCSAgICBFTEY2NF9SX1RZUEVfREFUQSAocmVsLT5yX2luZm8pLAotCQkJCQkJCSAgICAgICByX3R5cGUpKTsKLQkJCW91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCWJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAgICgoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JCSsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCQkvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotCQkgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQotCQkgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KLQkJaWYgKHNraXAKLQkJICAgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkgICAgfHwgRUxGNjRfUl9UWVBFX0lEIChvdXRyZWwucl9pbmZvKSAhPSBSX1NQQVJDX1JFTEFUSVZFKQotCQkgIGNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0JICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEgLUJzeW1ib2xpYwotCQkgICAgIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBsb2NhbGx5LCBvciB0aGUgc3ltYm9sCi0JCSAgICAgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLiAgV2UKLQkJICAgICBtdXN0IGluaXRpYWxpemUgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLQkJICAgICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgOCwgd2UKLQkJICAgICB1c2UgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZQotCQkgICAgIGhhdmUgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAotCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzIGlzCi0JCSAgICAgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSBnb3RfYmFzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMKTsKLQkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgOC4gIFdlIHVzZQotCQkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jCi0JCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZShkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJCSArIG9mZik7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uOwotCQkgICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkJICgoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJCSAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkJICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0JICBnb3RvIGRvX2RlZmF1bHQ7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQljYXNlIFJfU1BBUkNfSElQTFQyMjoKLQljYXNlIFJfU1BBUkNfTE9QTFQxMDoKLQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQljYXNlIFJfU1BBUkNfUENQTFQyMjoKLQljYXNlIFJfU1BBUkNfUENQTFQxMDoKLQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotCQkgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotCQkgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgZ290byBkb19kZWZhdWx0OwotCSAgICB9Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGgtPnBsdC5vZmZzZXQpKTsKLQkgIGdvdG8gZG9fZGVmYXVsdDsKLQotCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQkgIHsKLQkgICAgYmZkX3ZtYSB4OwotCi0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgICAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uICYgMHgzZmYpICsgRUxGNjRfUl9UWVBFX0RBVEEgKHJlbC0+cl9pbmZvKTsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgxZmZmKSB8IChyZWxvY2F0aW9uICYgMHgxZmZmKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCQkgICAgaG93dG8tPmJpdHNpemUsIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJCSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpLAotCQkJCSAgICByZWxvY2F0aW9uKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICB7Ci0JICAgIGJmZF92bWEgeDsKLQotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0JICAgIC8qIEFkanVzdCBmb3IgcGMtcmVsYXRpdmUtbmVzcy4gICovCi0JICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgIHJlbG9jYXRpb24gLT0gcmVsLT5yX29mZnNldDsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgzMDNmZmYpIHwgKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCi0JCQkJICAgfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCQkgICAgaG93dG8tPmJpdHNpemUsIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJCSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpLAotCQkJCSAgICByZWxvY2F0aW9uKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX0hJWDIyOgotCSAgewotCSAgICBiZmRfdm1hIHg7Ci0KLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCSAgICByZWxvY2F0aW9uID0gcmVsb2NhdGlvbiBeIE1JTlVTX09ORTsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgzZmZmZmYpIHwgKChyZWxvY2F0aW9uID4+IDEwKSAmIDB4M2ZmZmZmKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCQkgICAgaG93dG8tPmJpdHNpemUsIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJCSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpLAotCQkJCSAgICByZWxvY2F0aW9uKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX0xPWDEwOgotCSAgewotCSAgICBiZmRfdm1hIHg7Ci0KLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCSAgICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gJiAweDNmZikgfCAweDFjMDA7Ci0KLQkgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgeCA9ICh4ICYgfjB4MWZmZikgfCByZWxvY2F0aW9uOwotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQlkb19kZWZhdWx0OgotCSAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCXJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHIpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JCSAgICAmJiBob3d0by0+cGNfcmVsYXRpdmUpCi0JCSAgewotCQkgICAgLyogQXNzdW1lIHRoaXMgaXMgYSBjYWxsIHByb3RlY3RlZCBieSBvdGhlciBjb2RlIHRoYXQKLQkJICAgICAgIGRldGVjdCB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIElmIHRoaXMgaXMgdGhlIGNhc2UsCi0JCSAgICAgICB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgb3ZlcmZsb3cuICBJZiBub3QsIHRoZSAKLQkJICAgICAgIHByb2dyYW0gaXMgaG9zZWQgYW55d2F5LCBhbmQgYSBsaXR0bGUgd2FybmluZyBpc24ndAotCQkgICAgICAgZ29pbmcgdG8gaGVscC4gICovCi0JCSAgICBicmVhazsKLQkJICB9Ci0JCSAgCi0JICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJKGlucHV0X2JmZCwKLQkJCSBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJIHN5bS0+c3RfbmFtZSkpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgICB9Ci0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUExULiAgU2V0IGl0IHVwLiAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgaWYgKGgtPnBsdC5vZmZzZXQgPCBMQVJHRV9QTFRfVEhSRVNIT0xEKQotCXsKLQkgIHJlbGEucl9vZmZzZXQgPSBzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChoLT5wbHQub2Zmc2V0KTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgbWF4ID0gc3BsdC0+X3Jhd19zaXplIC8gUExUX0VOVFJZX1NJWkU7Ci0JICByZWxhLnJfb2Zmc2V0ID0gc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQgKGgtPnBsdC5vZmZzZXQsIG1heCk7Ci0JICByZWxhLnJfYWRkZW5kID0gLShzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChoLT5wbHQub2Zmc2V0KSArIDQpCi0JCQkgIC0oc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNwbHQtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIHJlbGEucl9vZmZzZXQgKz0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0pNUF9TTE9UKTsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgaC0+cGx0Lm9mZnNldCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgR09ULiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIGFzZWN0aW9uICpzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JICByZWxhLnJfYWRkZW5kID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfR0xPQl9EQVQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBzcmVsYS0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbGEtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbHMgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19DT1BZKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBzLT5jb250ZW50cwotCQkJCSAgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgaW50IHN0dF9yZWdpZHggPSAtMTsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGFzZWN0aW9uICpzZ290OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGJvb2xlYW4gc2l6ZTsKLQotCSAgYmZkX2VsZjY0X3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUExUR09UOiAgIG5hbWUgPSAiLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogICBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1BBUkNfUkVHSVNURVI6Ci0JICAgICAgaWYgKHN0dF9yZWdpZHggPT0gLTEpCi0JCXsKLQkJICBzdHRfcmVnaWR4ID0KLQkJICAgIF9iZmRfZWxmX2xpbmtfbG9va3VwX2xvY2FsX2R5bmluZHggKGluZm8sIG91dHB1dF9iZmQsIC0xKTsKLQkJICBpZiAoc3R0X3JlZ2lkeCA9PSAtMSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gc3R0X3JlZ2lkeCsrOwotCSAgICAgIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgLyogZmFsbHRocm91Z2ggKi8KLQkgICAgZGVmYXVsdDoJICAgICAgbmFtZSA9IE5VTEw7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG5hbWUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBpZiAocyA9PSBOVUxMKQotCQlkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgc2l6ZSkKLQkJICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgICAgIGVsc2UKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCQkgICAgfQotCQl9Ci0JICAgICAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIC5wbHQgc2VjdGlvbi4gICovCi0gICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID4gMCkKLQl7Ci0JICBzcGFyYzY0X2VsZl9idWlsZF9wbHQob3V0cHV0X2JmZCwgc3BsdC0+Y29udGVudHMsCi0JCQkJc3BsdC0+X3Jhd19zaXplIC8gUExUX0VOVFJZX1NJWkUpOwotCX0KLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0KLQlQTFRfRU5UUllfU0laRTsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB0byB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgZHluYW1pYyBzZWN0aW9uLiAgKi8KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzY0IChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgfQotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgZV9mbGFncyBmaWVsZC4gKi8KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBib29sZWFuIGVycm9yOwotICBmbGFnd29yZCBuZXdfZmxhZ3MsIG9sZF9mbGFnczsKLSAgaW50IG5ld19tbSwgb2xkX21tOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpICAgLyogRmlyc3QgY2FsbCwgbm8gZmxhZ3Mgc2V0ICovCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSBpZiAobmV3X2ZsYWdzID09IG9sZF9mbGFncykgICAgICAvKiBDb21wYXRpYmxlIGZsYWdzIGFyZSBvayAqLwotICAgIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvbXBhdGlibGUgZmxhZ3MgKi8KLSAgICB7Ci0gICAgICBlcnJvciA9IGZhbHNlOwotICAKLSAgICAgIGlmICgoaWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCXsKLQkgIC8qIFdlIGRvbid0IHdhbnQgZHluYW1pYyBvYmplY3RzIG1lbW9yeSBvcmRlcmluZyBhbmQKLQkgICAgIGFyY2hpdGVjdHVyZSB0byBoYXZlIGFueSByb2xlLiBUaGF0J3Mgd2hhdCBkeW5hbWljIGxpbmtlcgotCSAgICAgc2hvdWxkIGRvLiAgKi8KLQkgIG9sZF9mbGFncyAmPSB+KEVGX1NQQVJDVjlfTU0gfCBFRl9TUEFSQ19TVU5fVVMxIHwgRUZfU1BBUkNfSEFMX1IxKTsKLQkgIG9sZF9mbGFncyB8PSAobmV3X2ZsYWdzCi0JCQkmIChFRl9TUEFSQ1Y5X01NCi0JCQkgICB8IEVGX1NQQVJDX1NVTl9VUzEKLQkJCSAgIHwgRUZfU1BBUkNfSEFMX1IxKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIENob29zZSB0aGUgaGlnaGVzdCBhcmNoaXRlY3R1cmUgcmVxdWlyZW1lbnRzLiAgKi8KLQkgIG9sZF9mbGFncyB8PSAobmV3X2ZsYWdzICYgKEVGX1NQQVJDX1NVTl9VUzEgfCBFRl9TUEFSQ19IQUxfUjEpKTsKLQkgIG5ld19mbGFncyB8PSAob2xkX2ZsYWdzICYgKEVGX1NQQVJDX1NVTl9VUzEgfCBFRl9TUEFSQ19IQUxfUjEpKTsKLQkgIGlmICgob2xkX2ZsYWdzICYgKEVGX1NQQVJDX1NVTl9VUzEgfCBFRl9TUEFSQ19IQUxfUjEpKQotCSAgICAgID09IChFRl9TUEFSQ19TVU5fVVMxIHwgRUZfU1BBUkNfSEFMX1IxKSkKLQkgICAgewotCSAgICAgIGVycm9yID0gdHJ1ZTsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBsaW5raW5nIFVsdHJhU1BBUkMgc3BlY2lmaWMgd2l0aCBIQUwgc3BlY2lmaWMgY29kZSIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCSAgICB9Ci0JICAvKiBDaG9vc2UgdGhlIG1vc3QgcmVzdHJpY3RpdmUgbWVtb3J5IG9yZGVyaW5nLiAgKi8KLQkgIG9sZF9tbSA9IChvbGRfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKTsKLQkgIG5ld19tbSA9IChuZXdfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKTsKLQkgIG9sZF9mbGFncyAmPSB+RUZfU1BBUkNWOV9NTTsKLQkgIG5ld19mbGFncyAmPSB+RUZfU1BBUkNWOV9NTTsKLQkgIGlmIChuZXdfbW0gPCBvbGRfbW0pCi0JICAgIG9sZF9tbSA9IG5ld19tbTsKLQkgIG9sZF9mbGFncyB8PSBvbGRfbW07Ci0JICBuZXdfZmxhZ3MgfD0gb2xkX21tOwotCX0KLQotICAgICAgLyogV2FybiBhYm91dCBhbnkgb3RoZXIgbWlzbWF0Y2hlcyAqLwotICAgICAgaWYgKG5ld19mbGFncyAhPSBvbGRfZmxhZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgICAoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLSAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgKGxvbmcpbmV3X2ZsYWdzLCAobG9uZylvbGRfZmxhZ3MpOwotICAgICAgICB9Ci0KLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gb2xkX2ZsYWdzOwotCi0gICAgICBpZiAoZXJyb3IpCi0gICAgICAgIHsKLSAgICAgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogUHJpbnQgYSBTVFRfUkVHSVNURVIgc3ltYm9sIHRvIGZpbGUgRklMRS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXNwYXJjNjRfZWxmX3ByaW50X3N5bWJvbF9hbGwgKGFiZmQsIGZpbGVwLCBzeW1ib2wpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLSAgaW50IHJlZywgdHlwZTsKLSAgCi0gIGlmIChFTEZfU1RfVFlQRSAoKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKQotICAgICAgIT0gU1RUX1JFR0lTVEVSKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJlZyA9ICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWU7Ci0gIHR5cGUgPSBzeW1ib2wtPmZsYWdzOwotICBmcHJpbnRmIChmaWxlLCAiUkVHXyVjJWMlMTFzJWMlYyAgICBSIiwgIkdPTEkiIFtyZWcgLyA4XSwgJzAnICsgKHJlZyAmIDcpLCAiIiwKLQkJICgodHlwZSAmIEJTRl9MT0NBTCkKLQkJICA/ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnIScgOiAnbCcKLSAgCSAgICAgICAgICA6ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnZycgOiAnICcpLAotICAJICAgICAgICAgKHR5cGUgJiBCU0ZfV0VBSykgPyAndycgOiAnICcpOwotICBpZiAoc3ltYm9sLT5uYW1lID09IE5VTEwgfHwgc3ltYm9sLT5uYW1lIFswXSA9PSAnXDAnKQotICAgIHJldHVybiAiI3NjcmF0Y2giOwotICBlbHNlCi0gICAgcmV0dXJuIHN5bWJvbC0+bmFtZTsKLX0KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGEgU1BBUkM2NCBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIG1hY2ggPSBiZmRfbWFjaF9zcGFyY192OTsKLSAgCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0gICAgbWFjaCA9IGJmZF9tYWNoX3NwYXJjX3Y5YTsKLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLCBtYWNoKTsKLX0KLQotLyogUmVsb2NhdGlvbnMgaW4gdGhlIDY0IGJpdCBTUEFSQyBFTEYgQUJJIGFyZSBtb3JlIGNvbXBsZXggdGhhbiBpbgotICAgc3RhbmRhcmQgRUxGLCBiZWNhdXNlIFJfU1BBUkNfT0xPMTAgaGFzIHNlY29uZGFyeSBhZGRlbmQgaW4KLSAgIEVMRjY0X1JfVFlQRV9EQVRBIGZpZWxkLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZWRpcmVjdCB0aGUKLSAgIHJlbG9jYXRpb24gaGFuZGxpbmcgcm91dGluZXMuICAqLwotCi1jb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBzcGFyYzY0X2VsZl9zaXplX2luZm8gPQotewotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX0VoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1BoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1NoZHIpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbCksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfU3ltKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9EeW4pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9Ob3RlKSwKLSAgNCwJCS8qIGhhc2gtdGFibGUgZW50cnkgc2l6ZSAqLwotICAvKiBpbnRlcm5hbCByZWxvY2F0aW9ucyBwZXIgZXh0ZXJuYWwgcmVsb2NhdGlvbnMuCi0gICAgIEZvciBsaW5rIHB1cnBvc2VzIHdlIHVzZSBqdXN0IDEgaW50ZXJuYWwgcGVyCi0gICAgIDEgZXh0ZXJuYWwsIGZvciBhc3NlbWJseSBhbmQgc2x1cnAgc3ltYm9sIHRhYmxlCi0gICAgIHdlIHVzZSAyLiAqLwotICAxLAotICA2NCwJCS8qIGFyY2hfc2l6ZSAqLwotICA4LAkJLyogZmlsZV9hbGlnbiAqLwotICBFTEZDTEFTUzY0LAotICBFVl9DVVJSRU5ULAotICBiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzLAotICBiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIsCi0gIHNwYXJjNjRfZWxmX3dyaXRlX3JlbG9jcywKLSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCwKLSAgc3BhcmM2NF9lbGZfc2x1cnBfcmVsb2NfdGFibGUsCi0gIGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUsCi0gIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiwKLSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTAotfTsKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmNjRfc3BhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmNjQtc3BhcmMiCi0jZGVmaW5lIEVMRl9BUkNICWJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAweDEwMDAwMAotCi0vKiBUaGlzIGlzIHRoZSBvZmZpY2lhbCBBQkkgdmFsdWUuICAqLwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNX1NQQVJDVjkKLQotLyogVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3ZSB1c2VkIGJlZm9yZSB0aGUgQUJJIHdhcyByZWxlYXNlZC4gICovCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgRU1fT0xEX1NQQVJDVjkKLQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBzcGFyYzY0X2VsZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8gXAotICBzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGJmZF9lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICBzcGFyYzY0X2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZjY0X2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgc3BhcmM2NF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZjY0X2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgc3BhcmM2NF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gIHNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sgXAotICBzcGFyYzY0X2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlIFwKLSAgc3BhcmM2NF9lbGZfZ2V0X3N5bWJvbF90eXBlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nIFwKLSAgc3BhcmM2NF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzIFwKLSAgc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0gIHNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotICBzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBcCi0gIHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLSAgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLSAgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbCBcCi0gIHNwYXJjNjRfZWxmX3ByaW50X3N5bWJvbF9hbGwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb3V0cHV0X2FyY2hfc3ltcyBcCi0gIHNwYXJjNjRfZWxmX291dHB1dF9hcmNoX3N5bXMKLQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICBzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvIFwKLSAgc3BhcmM2NF9lbGZfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wIFwKLSAgc3BhcmM2NF9lbGZfb2JqZWN0X3AKLQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotCi0vKiBTZWN0aW9uIDUuMi40IG9mIHRoZSBBQkkgc3BlY2lmaWVzIGEgMjU2LWJ5dGUgYm91bmRhcnkgZm9yIHRoZSB0YWJsZS4gICovCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQgOAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSA4Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSBQTFRfSEVBREVSX1NJWkUKLQotI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LmMgYi9iZmQvZWxmNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmYjViNS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIEVMRiA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRQkJNjQKLQotI2luY2x1ZGUgImVsZmNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGZhcm0tbmFiaS5jIGIvYmZkL2VsZmFybS1uYWJpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Nzc4YjcuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmFybS1uYWJpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyogMzItYml0IEVMRiBzdXBwb3J0IGZvciBBUk0gbmV3IGFiaSBvcHRpb24uCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAgKHNpemVvZiAoYSkgLyAoc2l6ZW9mIChhKVswXSkpCi0jZW5kaWYKLQotI2RlZmluZSBVU0VfUkVMCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgICAgICAgICAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAgICAgICAgICJlbGYzMi1saXR0bGVhcm0iCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgICAgICAgICAgYmZkX2VsZjMyX2JpZ2FybV92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgICAgICAgICAgICAiZWxmMzItYmlnYXJtIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgICAgICAgICAgIGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvCi0KLSNkZWZpbmUgQVJNX0VMRl9BQklfVkVSU0lPTgkJMAotI2RlZmluZSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OCQlFTEZPU0FCSV9BUk0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUEMyNCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIHN0YW5kYXJkIDMyYml0IHBjLXJlbGF0aXZlIHJlbG9jICovCi0gIEhPV1RPIChSX0FSTV9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX1BDMTMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzEzIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMTIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA4ZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX0FCUzUsCS8qIHR5cGUgKi8KLQkgNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fU0JSRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fU0JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEMyMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZjA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmYwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzgsCSAgICAgICAgLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX0FNUF9WQ0FMTDksCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FNUF9WQ0FMTDkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TV0kyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TV0kyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fU1dJOCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1NXSTgiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGVzZSBuZXh0IHR3byByZWxvY3MgYXJlIGRlZmluZWQsIGJ1dCBJIGRvIG5vdCBrbm93IHdoYXQgdGhleSBkby4gICovCi0gIAotICBIT1dUTyAoUl9BUk1fWFBDMjUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fWFBDMjUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1hQQzIyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1hQQzIyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIFRoZXNlIG5leHQgdGhyZWUgcmVsb2NzIGFyZSBub3QgZGVmaW5lZCwgYnV0IHdlIG5lZWQgdG8gZmlsbCB0aGUgc3BhY2UuICAqLwotCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV91bmtub3duXzE3IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV91bmtub3duXzE4IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV91bmtub3duXzE5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlbG9jcyB1c2VkIGluIEFSTSBMaW51eCAqLwotICAKLSAgSE9XVE8gKFJfQVJNX0NPUFksCQkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fQ09QWSIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX0dMT0JfREFULAkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR0xPQl9EQVQiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0pVTVBfU0xPVCwJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0pVTVBfU0xPVCIsCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fUkVMQVRJVkUsCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9SRUxBVElWRSIsCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fR09UT0ZGLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVE9GRiIsCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fR09UUEMsCQkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR09UUEMiLAkJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgICAgICAgIAotICBIT1dUTyAoUl9BUk1fR09UMzIsCQkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX1BMVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMjYsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX1BMVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBFbmQgb2YgcmVsb2NzIHVzZWQgaW4gQVJNIExpbnV4ICovIAotCi0gIEhPV1RPIChSX0FSTV9SUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUkFCUzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SQUJTMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JQQzI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JCQVNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SQkFTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpOyAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3Z0ZW50cnlfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9hcm1fdGhtX3BjMTFfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMTEsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMTEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3RobV9wYzlfaG93dG8gPQotICBIT1dUTyAoUl9BUk1fVEhNX1BDOSwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEM5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotIAotc3RhdGljIHZvaWQKLWVsZjMyX2FybV9pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKiBlbGZfcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIAotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0FSTV9HTlVfVlRJTkhFUklUOgotICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3Z0aW5oZXJpdF9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9HTlVfVlRFTlRSWToKLSAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV92dGVudHJ5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfQVJNX1RITV9QQzExOgotICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfQVJNX1RITV9QQzk6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdGhtX3BjOV9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChyX3R5cGUgPj0gTlVNX0VMRU0gKGVsZjMyX2FybV9ob3d0b190YWJsZSkpCi0JYmZkX3JlbG9jLT5ob3d0byA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV9ob3d0b190YWJsZVtyX3R5cGVdOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotICAKLXN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwCi0gIHsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGJmZF9yZWxvY192YWw7Ci0gICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgICBlbGZfcmVsb2NfdmFsOwotICB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAgZWxmMzJfYXJtX3JlbG9jX21hcFtdID0KLXsKLSAge0JGRF9SRUxPQ19OT05FLCAgICAgICAgICAgICAgICAgUl9BUk1fTk9ORX0sCi0gIHtCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgICAgIFJfQVJNX1BDMjR9LAotICB7QkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMzMn0sCi0gIHtCRkRfUkVMT0NfMzJfUENSRUwsICAgICAgICAgICAgIFJfQVJNX1JFTDMyfSwKLSAge0JGRF9SRUxPQ184LCAgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTOH0sCi0gIHtCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzE2fSwKLSAge0JGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTSwgICAgICAgUl9BUk1fQUJTMTJ9LAotICB7QkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQsICAgICBSX0FSTV9USE1fQUJTNX0sCi0gIHtCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsIFJfQVJNX1RITV9QQzIyfSwKLSAge0JGRF9SRUxPQ19BUk1fQ09QWSwgICAgICAgICAgICAgUl9BUk1fQ09QWX0sCi0gIHtCRkRfUkVMT0NfQVJNX0dMT0JfREFULCAgICAgICAgIFJfQVJNX0dMT0JfREFUfSwKLSAge0JGRF9SRUxPQ19BUk1fSlVNUF9TTE9ULCAgICAgICAgUl9BUk1fSlVNUF9TTE9UfSwKLSAge0JGRF9SRUxPQ19BUk1fUkVMQVRJVkUsICAgICAgICAgUl9BUk1fUkVMQVRJVkV9LAotICB7QkZEX1JFTE9DX0FSTV9HT1RPRkYsICAgICAgICAgICBSX0FSTV9HT1RPRkZ9LAotICB7QkZEX1JFTE9DX0FSTV9HT1RQQywgICAgICAgICAgICBSX0FSTV9HT1RQQ30sCi0gIHtCRkRfUkVMT0NfQVJNX0dPVDMyLCAgICAgICAgICAgIFJfQVJNX0dPVDMyfSwKLSAge0JGRF9SRUxPQ19BUk1fUExUMzIsICAgICAgICAgICAgUl9BUk1fUExUMzJ9Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1fdnRlbnRyeV9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOgotICAgICAgcmV0dXJuICYgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTSAoZWxmMzJfYXJtX3JlbG9jX21hcCk7IGkgKyspCi0JaWYgKGVsZjMyX2FybV9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgcmV0dXJuICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgICAKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotfQotCi0jaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW9hYmkuYyBiL2JmZC9lbGZhcm0tb2FiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmY2MmYyLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tb2FiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG9sZCBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImVsZi9hcm0tb2FiaS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQotI2RlZmluZSBVU0VfUkVMQQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAgICAgICAgICJlbGYzMi1saXR0bGVhcm0tb2FiaSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgICAgICAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybS1vYWJpIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgZWxmMzJfYXJtX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICAwCi0KLSNkZWZpbmUgQVJNX0VMRl9BQklfVkVSU0lPTgkJMAotI2RlZmluZSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OCQkwCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9QQzI0LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBzdGFuZGFyZCAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyAqLwotICBIT1dUTyAoUl9BUk1fUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlM4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMxMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwOGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fQUJTNSwJLyogdHlwZSAqLwotCSA2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMjIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TQlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TQlJFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9BTVBfVkNBTEw5LAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQU1QX1ZDQUxMOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEMxMSwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEMxMSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEM5LAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotICAKLSAgSE9XVE8gKFJfQVJNX1BMVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMjYsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX1BMVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotCi0gIEhPV1RPIChSX0FSTV9SUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JBQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JBQlMzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUlBDMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JCQVNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkJBU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogTG9jYXRlIGEgcmVsb2MgaW4gdGhlIGhvd3RvIHRhYmxlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQKLSAgIHdoZW4gdGhlIGVudHJ5IG51bWJlciBpcyBpcyA+IFJfQVJNX0dOVV9WVElOSEVSSVQuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZmluZF9ob3d0byAocl90eXBlKQotICAgICB1bnNpZ25lZCBpbnQgcl90eXBlOwotewotICBpbnQgaTsKLSAgCi0gIGZvciAoaSA9IE5VTV9FTEVNIChlbGYzMl9hcm1faG93dG9fdGFibGUpOyBpLS07KQotICAgIGlmIChlbGYzMl9hcm1faG93dG9fdGFibGUgW2ldLnR5cGUgPT0gcl90eXBlKQotICAgICAgcmV0dXJuIGVsZjMyX2FybV9ob3d0b190YWJsZSArIGk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKTsKLQotICBpZiAocl90eXBlIDw9IFJfQVJNX0dOVV9WVElOSEVSSVQpCi0gICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0gIGVsc2UKLSAgICBiZmRfcmVsb2MtPmhvd3RvID0gZmluZF9ob3d0byAocl90eXBlKTsKLX0KLQotc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAKLSAgewotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICAgIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwIGVsZjMyX2FybV9yZWxvY19tYXBbXSA9Ci17Ci0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX05PTkUgfSwKLSAge0JGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAgICAgUl9BUk1fUEMyNCB9LAotICB7QkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMzMiB9LAotICB7QkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICBSX0FSTV9SRUwzMiB9LAotICB7QkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlM4IH0sCi0gIHtCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzE2IH0sCi0gIHtCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0sICAgICAgIFJfQVJNX0FCUzEyIH0sCi0gIHtCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwgICAgIFJfQVJNX1RITV9BQlM1IH0sCi0gIHtCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsIFJfQVJNX1RITV9QQzIyIH0sCi0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX1NCUkVMMzIgfSwKLSAge0JGRF9SRUxPQ19OT05FLCAgICAgICAgICAgICAgICAgUl9BUk1fQU1QX1ZDQUxMOSB9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLCBSX0FSTV9USE1fUEMxMSB9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDksICBSX0FSTV9USE1fUEM5IH0sICAKLSAge0JGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgICAgICAgUl9BUk1fR05VX1ZUSU5IRVJJVCB9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgICAgICAgICBSX0FSTV9HTlVfVlRFTlRSWSB9Ci19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChlbGYzMl9hcm1fcmVsb2NfbWFwKTsgaS0tOykKLSAgICBpZiAoZWxmMzJfYXJtX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1faG93dG9fdGFibGUgW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0FSTV9QTFQzMikKLSAgICByZXR1cm4gZmluZF9ob3d0byAoUl9BUk1fUExUMzIpOwotICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCi0jaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmY29kZS5oIGIvYmZkL2VsZmNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlZGY5Yi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0NiArMCwwIEBACi0vKiBFTEYgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uIHB1Ymxpc2hlZAotICAgaW4gIlVOSVggU3lzdGVtIFYgUmVsZWFzZSA0LCBQcm9ncmFtbWVycyBHdWlkZTogQU5TSSBDIGFuZAotICAgUHJvZ3JhbW1pbmcgU3VwcG9ydCBUb29scyIuICBTdWZmaWNpZW50IHN1cHBvcnQgZm9yIGdkYi4KLQotICAgUmV3cml0dGVuIGJ5IE1hcmsgRWljaGluIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24KLSAgIHB1Ymxpc2hlZCBpbiAiU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSIsIGNoYXB0ZXJzIDQKLSAgIGFuZCA1LCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzICJQcm9jZXNzb3IgU3VwcGxlbWVudCIgZG9jdW1lbnRzCi0gICBkZXJpdmVkIGZyb20gaXQuIEFkZGVkIHN1cHBvcnQgZm9yIGFzc2VtYmxlciBhbmQgb3RoZXIgb2JqZWN0IGZpbGUKLSAgIHV0aWxpdGllcy4gIEZ1cnRoZXIgd29yayBkb25lIGJ5IEtlbiBSYWVidXJuIChDeWdudXMgU3VwcG9ydCksIE1pY2hhZWwKLSAgIE1laXNzbmVyIChPcGVuIFNvZnR3YXJlIEZvdW5kYXRpb24pLCBhbmQgUGV0ZXIgSG9vZ2VuYm9vbSAoVW5pdmVyc2l0eQotICAgb2YgVXRhaCkgdG8gZmluaXNoIGFuZCBleHRlbmQgdGhpcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBQcm9ibGVtcyBhbmQgb3RoZXIgaXNzdWVzIHRvIHJlc29sdmUuCi0KLSAgICgxKQlCRkQgZXhwZWN0cyB0aGVyZSB0byBiZSBzb21lIGZpeGVkIG51bWJlciBvZiAic2VjdGlvbnMiIGluCi0gICAgICAgIHRoZSBvYmplY3QgZmlsZS4gIEkuRS4gdGhlcmUgaXMgYSAic2VjdGlvbl9jb3VudCIgdmFyaWFibGUgaW4gdGhlCi0JYmZkIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zLiAgSG93ZXZlciwgRUxGCi0Jc3VwcG9ydHMgbXVsdGlwbGUgInZpZXdzIiBvZiBhIGZpbGUuICBJbiBwYXJ0aWN1bGFyLCB3aXRoIGN1cnJlbnQKLQlpbXBsZW1lbnRhdGlvbnMsIGV4ZWN1dGFibGUgZmlsZXMgdHlwaWNhbGx5IGhhdmUgdHdvIHRhYmxlcywgYQotCXByb2dyYW0gaGVhZGVyIHRhYmxlIGFuZCBhIHNlY3Rpb24gaGVhZGVyIHRhYmxlLCBib3RoIG9mIHdoaWNoCi0JcGFydGl0aW9uIHRoZSBleGVjdXRhYmxlLgotCi0JSW4gRUxGLXNwZWFrLCB0aGUgImxpbmtpbmcgdmlldyIgb2YgdGhlIGZpbGUgdXNlcyB0aGUgc2VjdGlvbiBoZWFkZXIKLQl0YWJsZSB0byBhY2Nlc3MgInNlY3Rpb25zIiB3aXRoaW4gdGhlIGZpbGUsIGFuZCB0aGUgImV4ZWN1dGlvbiB2aWV3IgotCXVzZXMgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlIHRvIGFjY2VzcyAic2VnbWVudHMiIHdpdGhpbiB0aGUgZmlsZS4KLQkiU2VnbWVudHMiIHR5cGljYWxseSBtYXkgY29udGFpbiBhbGwgdGhlIGRhdGEgZnJvbSBvbmUgb3IgbW9yZQotCSJzZWN0aW9ucyIuCi0KLQlOb3RlIHRoYXQgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGlzIG9wdGlvbmFsIGluIEVMRiBleGVjdXRhYmxlcywKLQlidXQgaXQgaXMgdGhpcyBpbmZvcm1hdGlvbiB0aGF0IGlzIG1vc3QgdXNlZnVsIHRvIGdkYi4gIElmIHRoZQotCXNlY3Rpb24gaGVhZGVyIHRhYmxlIGlzIG1pc3NpbmcsIHRoZW4gZ2RiIHNob3VsZCBwcm9iYWJseSB0cnkKLQl0byBtYWtlIGRvIHdpdGggdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKEZJWE1FKQotCi0gICAoMikgIFRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBjb21waWxlZCB0d2ljZSwgb25jZSBpbiAzMi1iaXQgbW9kZSBhbmQKLQlvbmNlIGluIDY0LWJpdCBtb2RlLiAgTW9yZSBvZiBpdCBzaG91bGQgYmUgbWFkZSBzaXplLWluZGVwZW5kZW50Ci0JYW5kIG1vdmVkIGludG8gZWxmLmMuCi0KLSAgICgzKQlFTEYgc2VjdGlvbiBzeW1ib2xzIGFyZSBoYW5kbGVkIHJhdGhlciBzbG9wcGlseSBub3cuICBUaGlzIHNob3VsZAotCWJlIGNsZWFuZWQgdXAsIGFuZCBFTEYgc2VjdGlvbiBzeW1ib2xzIHJlY29uY2lsZWQgd2l0aCBCRkQgc2VjdGlvbgotCXN5bWJvbHMuCi0KLSAgICg0KSAgV2UgbmVlZCBhIHB1Ymxpc2hlZCBzcGVjIGZvciA2NC1iaXQgRUxGLiAgV2UndmUgZ290IHNvbWUgc3R1ZmYgaGVyZQotCXRoYXQgd2UncmUgdXNpbmcgZm9yIFNQQVJDIFY5IDY0LWJpdCBjaGlwcywgYnV0IGRvbid0IGFzc3VtZSB0aGF0Ci0JaXQncyBjYXN0IGluIHN0b25lLgotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0vKiBSZW5hbWluZyBzdHJ1Y3R1cmVzLCB0eXBlZGVmcywgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdG8gYmUgc2l6ZS1zcGVjaWZpYy4gICovCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9FaGRyCU5BTUUoRWxmLEV4dGVybmFsX0VoZHIpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9TeW0JTkFNRShFbGYsRXh0ZXJuYWxfU3ltKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfU2hkcglOQU1FKEVsZixFeHRlcm5hbF9TaGRyKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUGhkcglOQU1FKEVsZixFeHRlcm5hbF9QaGRyKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUmVsCU5BTUUoRWxmLEV4dGVybmFsX1JlbCkKLSNkZWZpbmUgRWxmX0V4dGVybmFsX1JlbGEJTkFNRShFbGYsRXh0ZXJuYWxfUmVsYSkKLSNkZWZpbmUgRWxmX0V4dGVybmFsX0R5bglOQU1FKEVsZixFeHRlcm5hbF9EeW4pCi0KLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpCi0jZGVmaW5lIGVsZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBcCi0gIE5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZGVmaW5lIGVsZl9vYmplY3RfcAkJCU5BTUUoYmZkX2VsZixvYmplY3RfcCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9wCQkJTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9wKQotI2RlZmluZSBlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAlOQU1FKGJmZF9lbGYsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBcCi0gIE5BTUUoYmZkX2VsZixnZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY19pbikKLSNkZWZpbmUgZWxmX3N3YXBfcmVsb2NhX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY2FfaW4pCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jX291dAkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2Nfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9yZWxvY2Ffb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY2Ffb3V0KQotI2RlZmluZSBlbGZfc3dhcF9zeW1ib2xfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3N5bWJvbF9pbikKLSNkZWZpbmUgZWxmX3N3YXBfc3ltYm9sX291dAkJTkFNRShiZmRfZWxmLHN3YXBfc3ltYm9sX291dCkKLSNkZWZpbmUgZWxmX3N3YXBfcGhkcl9pbgkJTkFNRShiZmRfZWxmLHN3YXBfcGhkcl9pbikKLSNkZWZpbmUgZWxmX3N3YXBfcGhkcl9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3BoZHJfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9keW5faW4JCQlOQU1FKGJmZF9lbGYsc3dhcF9keW5faW4pCi0jZGVmaW5lIGVsZl9zd2FwX2R5bl9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX2R5bl9vdXQpCi0jZGVmaW5lIGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQJTkFNRShiZmRfZWxmLGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYwkJTkFNRShiZmRfZWxmLGNhbm9uaWNhbGl6ZV9yZWxvYykKLSNkZWZpbmUgZWxmX3NsdXJwX3N5bWJvbF90YWJsZQkJTkFNRShiZmRfZWxmLHNsdXJwX3N5bWJvbF90YWJsZSkKLSNkZWZpbmUgZWxmX2dldF9zeW10YWIJCQlOQU1FKGJmZF9lbGYsZ2V0X3N5bXRhYikKLSNkZWZpbmUgZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gIE5BTUUoYmZkX2VsZixjYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0jZGVmaW5lIGVsZl9tYWtlX2VtcHR5X3N5bWJvbAkJTkFNRShiZmRfZWxmLG1ha2VfZW1wdHlfc3ltYm9sKQotI2RlZmluZSBlbGZfZ2V0X3N5bWJvbF9pbmZvCQlOQU1FKGJmZF9lbGYsZ2V0X3N5bWJvbF9pbmZvKQotI2RlZmluZSBlbGZfZ2V0X2xpbmVubwkJCU5BTUUoYmZkX2VsZixnZXRfbGluZW5vKQotI2RlZmluZSBlbGZfc2V0X2FyY2hfbWFjaAkJTkFNRShiZmRfZWxmLHNldF9hcmNoX21hY2gpCi0jZGVmaW5lIGVsZl9maW5kX25lYXJlc3RfbGluZQkJTkFNRShiZmRfZWxmLGZpbmRfbmVhcmVzdF9saW5lKQotI2RlZmluZSBlbGZfc2l6ZW9mX2hlYWRlcnMJCU5BTUUoYmZkX2VsZixzaXplb2ZfaGVhZGVycykKLSNkZWZpbmUgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCU5BTUUoYmZkX2VsZixzZXRfc2VjdGlvbl9jb250ZW50cykKLSNkZWZpbmUgZWxmX25vX2luZm9fdG9faG93dG8JCU5BTUUoYmZkX2VsZixub19pbmZvX3RvX2hvd3RvKQotI2RlZmluZSBlbGZfbm9faW5mb190b19ob3d0b19yZWwJTkFNRShiZmRfZWxmLG5vX2luZm9fdG9faG93dG9fcmVsKQotI2RlZmluZSBlbGZfZmluZF9zZWN0aW9uCQlOQU1FKGJmZF9lbGYsZmluZF9zZWN0aW9uKQotI2RlZmluZSBlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMJTkFNRShiZmRfZWxmLGJmZF9saW5rX2FkZF9zeW1ib2xzKQotI2RlZmluZSBlbGZfYWRkX2R5bmFtaWNfZW50cnkJCU5BTUUoYmZkX2VsZixhZGRfZHluYW1pY19lbnRyeSkKLSNkZWZpbmUgZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyCU5BTUUoYmZkX2VsZix3cml0ZV9zaGRyc19hbmRfZWhkcikKLSNkZWZpbmUgZWxmX3dyaXRlX291dF9waGRycwkJTkFNRShiZmRfZWxmLHdyaXRlX291dF9waGRycykKLSNkZWZpbmUgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBOQU1FKGJmZF9lbGYsbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucykKLSNkZWZpbmUgZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sICBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmZkX2ZpbmFsX2xpbmsJCU5BTUUoYmZkX2VsZixiZmRfZmluYWxfbGluaykKLSNkZWZpbmUgZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIE5BTUUoYmZkX2VsZixjcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIE5BTUUoYmZkX2VsZixmaW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2djX3NlY3Rpb25zCQkJTkFNRShfYmZkX2VsZixnY19zZWN0aW9ucykKLSNkZWZpbmUgZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyBcCi0gIE5BTUUoX2JmZF9lbGYsZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKQotI2RlZmluZSBlbGZfZ2NfY29tbW9uX2ZpbmFsX2xpbmsJTkFNRShfYmZkX2VsZixnY19jb21tb25fZmluYWxfbGluaykKLSNkZWZpbmUgZWxmX2djX3JlY29yZF92dGluaGVyaXQJCU5BTUUoX2JmZF9lbGYsZ2NfcmVjb3JkX3Z0aW5oZXJpdCkKLSNkZWZpbmUgZWxmX2djX3JlY29yZF92dGVudHJ5CQlOQU1FKF9iZmRfZWxmLGdjX3JlY29yZF92dGVudHJ5KQotI2RlZmluZSBlbGZfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wgXAotICBOQU1FKF9iZmRfZWxmLGxpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKQotCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIEVMRl9SX0lORk8oWCxZKQlFTEY2NF9SX0lORk8oWCxZKQotI2RlZmluZSBFTEZfUl9TWU0oWCkJRUxGNjRfUl9TWU0oWCkKLSNkZWZpbmUgRUxGX1JfVFlQRShYKQlFTEY2NF9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGQ0xBU1MJRUxGQ0xBU1M2NAotI2RlZmluZSBGSUxFX0FMSUdOCTgKLSNkZWZpbmUgTE9HX0ZJTEVfQUxJR04JMwotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIEVMRl9SX0lORk8oWCxZKQlFTEYzMl9SX0lORk8oWCxZKQotI2RlZmluZSBFTEZfUl9TWU0oWCkJRUxGMzJfUl9TWU0oWCkKLSNkZWZpbmUgRUxGX1JfVFlQRShYKQlFTEYzMl9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGQ0xBU1MJRUxGQ0xBU1MzMgotI2RlZmluZSBGSUxFX0FMSUdOCTQKLSNkZWZpbmUgTE9HX0ZJTEVfQUxJR04JMgotI2VuZGlmCi0KLS8qIFN0YXRpYyBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHZvaWQgZWxmX3N3YXBfZWhkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX0VoZHIgKiwgRWxmX0ludGVybmFsX0VoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX3N3YXBfZWhkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9FaGRyICosIEVsZl9FeHRlcm5hbF9FaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zd2FwX3NoZHJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9TaGRyICosIEVsZl9JbnRlcm5hbF9TaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zd2FwX3NoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqLCBFbGZfRXh0ZXJuYWxfU2hkciAqKSk7Ci0KLSNkZWZpbmUgZWxmX3N0cmluZ3RhYl9pbml0IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0Ci0KLSNkZWZpbmUgc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleAotCi1zdGF0aWMgYm9vbGVhbiBlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uIAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYmZkX3NpemVfdHlwZSwKLQkgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGVsZl9zbHVycF9yZWxvY190YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZCB3cml0ZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZmlsZV9wIFBBUkFNUyAoKEVsZl9FeHRlcm5hbF9FaGRyICopKTsKLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZCBlbGZfZGVidWdfc2VjdGlvbiBQQVJBTVMgKChpbnQsIEVsZl9JbnRlcm5hbF9TaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9kZWJ1Z19maWxlIFBBUkFNUyAoKEVsZl9JbnRlcm5hbF9FaGRyICopKTsKLXN0YXRpYyBjaGFyICplbGZfc3ltYm9sX2ZsYWdzIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci0jZW5kaWYKLQwKLS8qIFN0cnVjdHVyZSBzd2FwcGluZyByb3V0aW5lcyAqLwotCi0vKiBTaG91bGQgcGVyaGFwcyB1c2UgcHV0X29mZnNldCwgcHV0X3dvcmQsIGV0Yy4gIEZvciBub3csIHRoZSB0d28gdmVyc2lvbnMKLSAgIGNhbiBiZSBoYW5kbGVkIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZyAzMiBiaXRzIG9yICJ0aGUgbG9uZyB0eXBlIi4gICovCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF82NAotI2RlZmluZSBwdXRfc2lnbmVkX3dvcmQJYmZkX2hfcHV0X3NpZ25lZF82NAotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfNjQKLSNkZWZpbmUgZ2V0X3NpZ25lZF93b3JkCWJmZF9oX2dldF9zaWduZWRfNjQKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfMzIKLSNkZWZpbmUgcHV0X3NpZ25lZF93b3JkCWJmZF9oX3B1dF9zaWduZWRfMzIKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIGdldF9zaWduZWRfd29yZAliZmRfaF9nZXRfc2lnbmVkXzMyCi0jZW5kaWYKLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzeW1ib2wgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIHN5bWJvbCBpbiBpbnRlcm5hbAotICAgZm9ybWF0LiAqLwotCi12b2lkCi1lbGZfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9TeW0gKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqZHN0OwotewotICBpbnQgc2lnbmVkX3ZtYSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+c2lnbl9leHRlbmRfdm1hOwotCi0gIGRzdC0+c3RfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfbmFtZSk7Ci0gIGlmIChzaWduZWRfdm1hKQotICAgIGRzdC0+c3RfdmFsdWUgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X3ZhbHVlKTsKLSAgZWxzZQotICAgIGRzdC0+c3RfdmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfdmFsdWUpOwotICBkc3QtPnN0X3NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3Rfc2l6ZSk7Ci0gIGRzdC0+c3RfaW5mbyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9pbmZvKTsKLSAgZHN0LT5zdF9vdGhlciA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9vdGhlcik7Ci0gIGRzdC0+c3Rfc2huZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X3NobmR4KTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzeW1ib2wgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIHN5bWJvbCBpbiBleHRlcm5hbAotICAgZm9ybWF0LiAqLwotCi12b2lkCi1lbGZfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCBzcmMsIGNkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3JjOwotICAgICBQVFIgY2RzdDsKLXsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZHN0ID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgY2RzdDsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnN0X25hbWUsIGRzdC0+c3RfbmFtZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnN0X3ZhbHVlLCBkc3QtPnN0X3ZhbHVlKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c3Rfc2l6ZSwgZHN0LT5zdF9zaXplKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3RfaW5mbywgZHN0LT5zdF9pbmZvKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3Rfb3RoZXIsIGRzdC0+c3Rfb3RoZXIpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+c3Rfc2huZHgsIGRzdC0+c3Rfc2huZHgpOwotfQotCi0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgZmlsZSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIGZpbGUgaGVhZGVyIGluCi0gICBpbnRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9laGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfRWhkciAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfRWhkciAqZHN0OwotewotICBtZW1jcHkgKGRzdC0+ZV9pZGVudCwgc3JjLT5lX2lkZW50LCBFSV9OSURFTlQpOwotICBkc3QtPmVfdHlwZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV90eXBlKTsKLSAgZHN0LT5lX21hY2hpbmUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfbWFjaGluZSk7Ci0gIGRzdC0+ZV92ZXJzaW9uID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3ZlcnNpb24pOwotICBkc3QtPmVfZW50cnkgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9lbnRyeSk7Ci0gIGRzdC0+ZV9waG9mZiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3Bob2ZmKTsKLSAgZHN0LT5lX3Nob2ZmID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hvZmYpOwotICBkc3QtPmVfZmxhZ3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfZmxhZ3MpOwotICBkc3QtPmVfZWhzaXplID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX2Voc2l6ZSk7Ci0gIGRzdC0+ZV9waGVudHNpemUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfcGhlbnRzaXplKTsKLSAgZHN0LT5lX3BobnVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3BobnVtKTsKLSAgZHN0LT5lX3NoZW50c2l6ZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaGVudHNpemUpOwotICBkc3QtPmVfc2hudW0gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hudW0pOwotICBkc3QtPmVfc2hzdHJuZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hzdHJuZHgpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIGZpbGUgaGVhZGVyIGluIGludGVybmFsIGZvcm1hdCBpbnRvIGFuIEVMRiBmaWxlIGhlYWRlciBpbgotICAgZXh0ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotZWxmX3N3YXBfZWhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9FaGRyICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9FaGRyICpkc3Q7Ci17Ci0gIG1lbWNweSAoZHN0LT5lX2lkZW50LCBzcmMtPmVfaWRlbnQsIEVJX05JREVOVCk7Ci0gIC8qIG5vdGUgdGhhdCBhbGwgZWxlbWVudHMgb2YgZHN0IGFyZSAqYXJyYXlzIG9mIHVuc2lnbmVkIGNoYXIqIGFscmVhZHkuLi4gKi8KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfdHlwZSwgZHN0LT5lX3R5cGUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9tYWNoaW5lLCBkc3QtPmVfbWFjaGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5lX3ZlcnNpb24sIGRzdC0+ZV92ZXJzaW9uKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9lbnRyeSwgZHN0LT5lX2VudHJ5KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9waG9mZiwgZHN0LT5lX3Bob2ZmKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9zaG9mZiwgZHN0LT5lX3Nob2ZmKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPmVfZmxhZ3MsIGRzdC0+ZV9mbGFncyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX2Voc2l6ZSwgZHN0LT5lX2Voc2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BoZW50c2l6ZSwgZHN0LT5lX3BoZW50c2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BobnVtLCBkc3QtPmVfcGhudW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaGVudHNpemUsIGRzdC0+ZV9zaGVudHNpemUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaG51bSwgZHN0LT5lX3NobnVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfc2hzdHJuZHgsIGRzdC0+ZV9zaHN0cm5keCk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLWVsZl9zd2FwX3NoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9TaGRyICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpkc3Q7Ci17Ci0gIGludCBzaWduZWRfdm1hID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zaWduX2V4dGVuZF92bWE7Ci0KLSAgZHN0LT5zaF9uYW1lID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9uYW1lKTsKLSAgZHN0LT5zaF90eXBlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF90eXBlKTsKLSAgZHN0LT5zaF9mbGFncyA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9mbGFncyk7Ci0gIGlmIChzaWduZWRfdm1hKQotICAgIGRzdC0+c2hfYWRkciA9IGdldF9zaWduZWRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcik7Ci0gIGVsc2UKLSAgICBkc3QtPnNoX2FkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcik7Ci0gIGRzdC0+c2hfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX29mZnNldCk7Ci0gIGRzdC0+c2hfc2l6ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9zaXplKTsKLSAgZHN0LT5zaF9saW5rID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9saW5rKTsKLSAgZHN0LT5zaF9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9pbmZvKTsKLSAgZHN0LT5zaF9hZGRyYWxpZ24gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcmFsaWduKTsKLSAgZHN0LT5zaF9lbnRzaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2VudHNpemUpOwotICBkc3QtPmJmZF9zZWN0aW9uID0gTlVMTDsKLSAgZHN0LT5jb250ZW50cyA9IE5VTEw7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4KLSAgIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9zaGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1NoZHIgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1NoZHIgKmRzdDsKLXsKLSAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfbmFtZSwgZHN0LT5zaF9uYW1lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnNoX3R5cGUsIGRzdC0+c2hfdHlwZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2ZsYWdzLCBkc3QtPnNoX2ZsYWdzKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkciwgZHN0LT5zaF9hZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfb2Zmc2V0LCBkc3QtPnNoX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX3NpemUsIGRzdC0+c2hfc2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF9saW5rLCBkc3QtPnNoX2xpbmspOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfaW5mbywgZHN0LT5zaF9pbmZvKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkcmFsaWduLCBkc3QtPnNoX2FkZHJhbGlnbik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2VudHNpemUsIGRzdC0+c2hfZW50c2l6ZSk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotdm9pZAotZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1BoZHIgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKmRzdDsKLXsKLSAgaW50IHNpZ25lZF92bWEgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnNpZ25fZXh0ZW5kX3ZtYTsKLQotICBkc3QtPnBfdHlwZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF90eXBlKTsKLSAgZHN0LT5wX2ZsYWdzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX2ZsYWdzKTsKLSAgZHN0LT5wX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX29mZnNldCk7Ci0gIGlmIChzaWduZWRfdm1hKQotICAgIHsKLSAgICAgIGRzdC0+cF92YWRkciA9IGdldF9zaWduZWRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF92YWRkcik7Ci0gICAgICBkc3QtPnBfcGFkZHIgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfcGFkZHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRzdC0+cF92YWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3ZhZGRyKTsKLSAgICAgIGRzdC0+cF9wYWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3BhZGRyKTsKLSAgICB9Ci0gIGRzdC0+cF9maWxlc3ogPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9maWxlc3opOwotICBkc3QtPnBfbWVtc3ogPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9tZW1zeik7Ci0gIGRzdC0+cF9hbGlnbiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX2FsaWduKTsKLX0KLQotdm9pZAotZWxmX3N3YXBfcGhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9QaGRyICpkc3Q7Ci17Ci0gIC8qIG5vdGUgdGhhdCBhbGwgZWxlbWVudHMgb2YgZHN0IGFyZSAqYXJyYXlzIG9mIHVuc2lnbmVkIGNoYXIqIGFscmVhZHkuLi4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnBfdHlwZSwgZHN0LT5wX3R5cGUpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX29mZnNldCwgZHN0LT5wX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfdmFkZHIsIGRzdC0+cF92YWRkcik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfcGFkZHIsIGRzdC0+cF9wYWRkcik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfZmlsZXN6LCBkc3QtPnBfZmlsZXN6KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9tZW1zeiwgZHN0LT5wX21lbXN6KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnBfZmxhZ3MsIGRzdC0+cF9mbGFncyk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfYWxpZ24sIGRzdC0+cF9hbGlnbik7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgcmVsb2MgZnJvbSBleHRlcm5hbCBmb3JtYXQgdG8gaW50ZXJuYWwgZm9ybWF0LiAqLwotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgZHN0LT5yX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9pbmZvID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfaW5mbyk7Ci19Ci0KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGRzdC0+cl9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9vZmZzZXQpOwotICBkc3QtPnJfaW5mbyA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX2luZm8pOwotICBkc3QtPnJfYWRkZW5kID0gZ2V0X3NpZ25lZF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX2FkZGVuZCk7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgcmVsb2MgZnJvbSBpbnRlcm5hbCBmb3JtYXQgdG8gZXh0ZXJuYWwgZm9ybWF0LiAqLwotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfb2Zmc2V0LCBkc3QtPnJfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9pbmZvLCBkc3QtPnJfaW5mbyk7Ci19Ci0KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfUmVsYSAqZHN0OwotewotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX29mZnNldCwgZHN0LT5yX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfaW5mbywgZHN0LT5yX2luZm8pOwotICBwdXRfc2lnbmVkX3dvcmQgKGFiZmQsIHNyYy0+cl9hZGRlbmQsIGRzdC0+cl9hZGRlbmQpOwotfQotCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfZHluX2luIChhYmZkLCBwLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgUFRSIHA7Ci0gICAgIEVsZl9JbnRlcm5hbF9EeW4gKmRzdDsKLXsKLSAgY29uc3QgRWxmX0V4dGVybmFsX0R5biAqc3JjID0gKGNvbnN0IEVsZl9FeHRlcm5hbF9EeW4gKikgcDsKLQotICBkc3QtPmRfdGFnID0gZ2V0X3dvcmQgKGFiZmQsIHNyYy0+ZF90YWcpOwotICBkc3QtPmRfdW4uZF92YWwgPSBnZXRfd29yZCAoYWJmZCwgc3JjLT5kX3VuLmRfdmFsKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX2R5bl9vdXQgKGFiZmQsIHNyYywgcCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfRHluICpzcmM7Ci0gICAgIFBUUiBwOwotewotICBFbGZfRXh0ZXJuYWxfRHluICpkc3QgPSAoRWxmX0V4dGVybmFsX0R5biAqKSBwOwotCi0gIHB1dF93b3JkIChhYmZkLCBzcmMtPmRfdGFnLCBkc3QtPmRfdGFnKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZF91bi5kX3ZhbCwgZHN0LT5kX3VuLmRfdmFsKTsKLX0KLQwKLS8qIEVMRiAuby9leGVjIGZpbGUgcmVhZGluZyAqLwotCi0KLS8qIEJlZ2luIHByb2Nlc3NpbmcgYSBnaXZlbiBvYmplY3QuCi0KLSAgIEZpcnN0IHdlIHZhbGlkYXRlIHRoZSBmaWxlIGJ5IHJlYWRpbmcgaW4gdGhlIEVMRiBoZWFkZXIgYW5kIGNoZWNraW5nCi0gICB0aGUgbWFnaWMgbnVtYmVyLiAgKi8KLQotc3RhdGljIElOTElORSBib29sZWFuCi1lbGZfZmlsZV9wICh4X2VoZHJwKQotICAgICBFbGZfRXh0ZXJuYWxfRWhkciAqeF9laGRycDsKLXsKLSAgcmV0dXJuICgoeF9laGRycC0+ZV9pZGVudFtFSV9NQUcwXSA9PSBFTEZNQUcwKQotCSAgJiYgKHhfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMV0gPT0gRUxGTUFHMSkKLQkgICYmICh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzJdID09IEVMRk1BRzIpCi0JICAmJiAoeF9laGRycC0+ZV9pZGVudFtFSV9NQUczXSA9PSBFTEZNQUczKSk7Ci19Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggQUJGRCBtYXRjaGVzIHRoZSB0YXJnZXQgdmVjdG9yCi0gICB0aGF0IEFCRkQgcG9pbnRzIHRvLgotCi0gICBOb3RlIHRoYXQgd2UgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHdpdGggdGhlIHNhbWUgQUJGRCwgYnV0IGRpZmZlcmVudAotICAgdGFyZ2V0IHZlY3RvcnMsIG1vc3Qgb2Ygd2hpY2ggd2lsbCBub3QgbWF0Y2guICBXZSBoYXZlIHRvIGF2b2lkIGxlYXZpbmcKLSAgIGFueSBzaWRlIGVmZmVjdHMgaW4gQUJGRCwgb3IgYW55IGRhdGEgaXQgcG9pbnRzIHRvIChsaWtlIHRkYXRhKSwgaWYgdGhlCi0gICBmaWxlIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfRXh0ZXJuYWxfU2hkciB4X3NoZHI7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5LCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICppX3NoZHJwID0gTlVMTDsgLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci0gIGNoYXIgKnNoc3RydGFiOwkJLyogSW50ZXJuYWwgY29weSBvZiBzZWN0aW9uIGhlYWRlciBzdHJpbmd0YWIgKi8KLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZDsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IGVsZl90ZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOwotICBhc2VjdGlvbiAqczsKLQotICAvKiBSZWFkIGluIHRoZSBFTEYgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHhfZWhkcikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGVsc2UKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogTm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgdmFsaWQgRUxGIGZpbGUsIGFuZCBvbmUgdGhhdCBCRkQgY2FuCi0gICAgIG1ha2UgdXNlIG9mLiAgVGhlIG1hZ2ljIG51bWJlciBtdXN0IG1hdGNoLCB0aGUgYWRkcmVzcyBzaXplICgnY2xhc3MnKQotICAgICBhbmQgYnl0ZS1zd2FwcGluZyBtdXN0IG1hdGNoIG91ciBYVkVDIGVudHJ5LCBhbmQgaXQgbXVzdCBoYXZlIGEKLSAgICAgc2VjdGlvbiBoZWFkZXIgdGFibGUgKEZJWE1FOiBTZWUgY29tbWVudHMgcmUgc2VjdGlvbnMgYXQgdG9wIG9mIHRoaXMKLSAgICAgZmlsZSkuICovCi0KLSAgaWYgKChlbGZfZmlsZV9wICgmeF9laGRyKSA9PSBmYWxzZSkgfHwKLSAgICAgICh4X2VoZHIuZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UKSB8fAotICAgICAgKHhfZWhkci5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUykpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIENoZWNrIHRoYXQgZmlsZSdzIGJ5dGUgb3JkZXIgbWF0Y2hlcyB4dmVjJ3MgKi8KLSAgc3dpdGNoICh4X2VoZHIuZV9pZGVudFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBMk1TQjoJCS8qIEJpZy1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBMkxTQjoJCS8qIExpdHRsZS1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBTk9ORToJCS8qIE5vIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCi0gICAgZGVmYXVsdDoJCQkvKiBVbmtub3duIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCi0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBlbGZfb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bwotICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KLQotICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9vYmpfdGRhdGEpKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLSAgZWxmX3RkYXRhIChhYmZkKSA9IG5ld190ZGF0YTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBieXRlIG9yZGVyLCBzd2FwIGluIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgKi8KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBlbGZfc3dhcF9laGRyX2luIChhYmZkLCAmeF9laGRyLCBpX2VoZHJwKTsKLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0KLSAgLyogUmVqZWN0IEVUX0NPUkUgKGhlYWRlciBpbmRpY2F0ZXMgY29yZSBmaWxlLCBub3Qgb2JqZWN0IGZpbGUpICovCi0gIGlmIChpX2VoZHJwLT5lX3R5cGUgPT0gRVRfQ09SRSkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogSWYgdGhlcmUgaXMgbm8gc2VjdGlvbiBoZWFkZXIgdGFibGUsIHdlJ3JlIGhvc2VkLiAqLwotICBpZiAoaV9laGRycC0+ZV9zaG9mZiA9PSAwKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBBcyBhIHNpbXBsZSBzYW5pdHkgY2hlY2ssIHZlcmlmeSB0aGF0IHRoZSB3aGF0IEJGRCB0aGlua3MgaXMgdGhlCi0gICAgIHNpemUgb2YgZWFjaCBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBhY3R1YWxseSBtYXRjaGVzIHRoZSBzaXplCi0gICAgIHJlY29yZGVkIGluIHRoZSBmaWxlLiAqLwotICBpZiAoaV9laGRycC0+ZV9zaGVudHNpemUgIT0gc2l6ZW9mICh4X3NoZHIpKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgRUxGIGVfbWFjaGluZSBmaWVsZCBtYXRjaGVzIHdoYXQgdGhpcyBwYXJ0aWN1bGFyCi0gICAgIEJGRCBmb3JtYXQgZXhwZWN0cy4gICovCi0gIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gaV9laGRycC0+ZV9tYWNoaW5lCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQxID09IDAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MSkKLSAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDIgPT0gMCB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQyKSkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldF9wdHI7Ci0KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gIExldCBpdCBtYXRjaCBhbnkgRUxGIHRhcmdldAotCSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSBzcGVjaWZpYyBiYWNrZW5kLiAgKi8KLSAgICAgIGZvciAodGFyZ2V0X3B0ciA9IGJmZF90YXJnZXRfdmVjdG9yOyAqdGFyZ2V0X3B0ciAhPSBOVUxMOyB0YXJnZXRfcHRyKyspCi0JewotCSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJhY2s7Ci0KLQkgIGlmICgoKnRhcmdldF9wdHIpLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIGNvbnRpbnVlOwotCSAgYmFjayA9IChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqKSAoKnRhcmdldF9wdHIpLT5iYWNrZW5kX2RhdGE7Ci0JICBpZiAoYmFjay0+ZWxmX21hY2hpbmVfY29kZSA9PSBpX2VoZHJwLT5lX21hY2hpbmUKLQkgICAgICB8fCAoYmFjay0+ZWxmX21hY2hpbmVfYWx0MSAhPSAwCi0JCSAgJiYgYmFjay0+ZWxmX21hY2hpbmVfYWx0MSA9PSBpX2VoZHJwLT5lX21hY2hpbmUpCi0JICAgICAgfHwgKGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgIT0gMAotCQkgICYmIGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgPT0gaV9laGRycC0+ZV9tYWNoaW5lKSkKLQkgICAgewotCSAgICAgIC8qIHRhcmdldF9wdHIgaXMgYW4gRUxGIGJhY2tlbmQgd2hpY2ggbWF0Y2hlcyB0aGlzCi0JCSBvYmplY3QgZmlsZSwgc28gcmVqZWN0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICAqLwotCSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGlfZWhkcnAtPmVfdHlwZSA9PSBFVF9FWEVDKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgZWxzZSBpZiAoaV9laGRycC0+ZV90eXBlID09IEVUX0RZTikKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGlmIChpX2VoZHJwLT5lX3BobnVtID4gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotCi0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGViZC0+YXJjaCwgMCkpCi0gICAgewotICAgICAgLyogSXQncyBPSyBpZiB0aGlzIGZhaWxzIGZvciB0aGUgZ2VuZXJpYyB0YXJnZXQuICAqLwotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3BlY2lmaWVkIGluIHRoZSBFTEYgZmlsZSBoZWFkZXIuICovCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpX2VoZHJwLT5lX2VudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvcHkgb2YgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluCi0gICAgIGludGVybmFsIGZvcm0sIHNlZWsgdG8gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluIHRoZSBmaWxlLAotICAgICByZWFkIGl0IGluLCBhbmQgY29udmVydCBpdCB0byBpbnRlcm5hbCBmb3JtLiAgKi8KLSAgaV9zaGRycCA9ICgoRWxmX0ludGVybmFsX1NoZHIgKikKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaV9zaGRycCkgKiBpX2VoZHJwLT5lX3NobnVtKSk7Ci0gIGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgPSAoKEVsZl9JbnRlcm5hbF9TaGRyICoqKQotCQkJICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChpX3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKTsKLSAgaWYgKCFpX3NoZHJwIHx8ICFlbGZfZWxmc2VjdGlvbnMgKGFiZmQpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfc2hvZmYsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBmb3IgKHNoaW5kZXggPSAwOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiB4X3NoZHIsIHNpemVvZiB4X3NoZHIsIDEsIGFiZmQpICE9IHNpemVvZiAoeF9zaGRyKSkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICAgIGVsZl9zd2FwX3NoZHJfaW4gKGFiZmQsICZ4X3NoZHIsIGlfc2hkcnAgKyBzaGluZGV4KTsKLSAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBpX3NoZHJwICsgc2hpbmRleDsKLQotICAgICAgLyogSWYgdGhlIHNlY3Rpb24gaXMgbG9hZGVkLCBidXQgbm90IHBhZ2UgYWxpZ25lZCwgY2xlYXIKLSAgICAgICAgIERfUEFHRUQuICAqLwotICAgICAgaWYgKChpX3NoZHJwW3NoaW5kZXhdLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JICAmJiBpX3NoZHJwW3NoaW5kZXhdLnNoX3R5cGUgIT0gU0hUX05PQklUUwotCSAgJiYgKCgoaV9zaGRycFtzaGluZGV4XS5zaF9hZGRyIC0gaV9zaGRycFtzaGluZGV4XS5zaF9vZmZzZXQpCi0JICAgICAgICUgZWJkLT5tYXhwYWdlc2l6ZSkKLQkgICAgICAhPSAwKSkKLQlhYmZkLT5mbGFncyAmPSB+RF9QQUdFRDsKLSAgICB9Ci0gIGlmIChpX2VoZHJwLT5lX3Noc3RybmR4KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaV9laGRycC0+ZV9zaHN0cm5keCkpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0gIGlmIChpX2VoZHJwLT5lX3BobnVtID09IDApCi0gICAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaV9waGRyOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSAoKEVsZl9JbnRlcm5hbF9QaGRyICopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoaV9laGRycC0+ZV9waG51bQotCQkJCQkgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSkpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5waGRyID09IE5VTEwpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfcGhvZmYsIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgICAgaV9waGRyID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpX2VoZHJwLT5lX3BobnVtOyBpKyssIGlfcGhkcisrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9QaGRyIHhfcGhkcjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmeF9waGRyLCBzaXplb2YgeF9waGRyLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiB4X3BoZHIpCi0JICAgIGdvdG8gZ290X25vX21hdGNoOwotCSAgZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgJnhfcGhkciwgaV9waGRyKTsKLQl9Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgc2VjdGlvbnMuICBXZQotICAgICB3aWxsIG5lZWQgdGhlIGJhc2UgcG9pbnRlciB0byB0aGlzIHRhYmxlIGxhdGVyLiAqLwotICAvKiBXZSByZWFkIHRoaXMgaW5saW5lIG5vdywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGdvIHRocm91Z2gKLSAgICAgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIHdpdGggaXQgKHNpbmNlIHRoaXMgcGFydGljdWxhciBzdHJ0YWIgaXMKLSAgICAgdXNlZCB0byBmaW5kIGFsbCBvZiB0aGUgRUxGIHNlY3Rpb24gbmFtZXMuKSAqLwotCi0gIHNoc3RydGFiID0gYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24gKGFiZmQsIGlfZWhkcnAtPmVfc2hzdHJuZHgpOwotICBpZiAoIXNoc3RydGFiKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIC8qIE9uY2UgYWxsIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMgaGF2ZSBiZWVuIHJlYWQgYW5kIGNvbnZlcnRlZCwgd2UKLSAgICAgY2FuIHN0YXJ0IHByb2Nlc3NpbmcgdGhlbS4gIE5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VjdGlvbiBoZWFkZXIgaXMKLSAgICAgYSBkdW1teSBwbGFjZWhvbGRlciBlbnRyeSwgc28gd2UgaWdub3JlIGl0LiAgKi8KLQotICBmb3IgKHNoaW5kZXggPSAxOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgc2hpbmRleCkpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIExldCB0aGUgYmFja2VuZCBkb3VibGUgY2hlY2sgdGhlIGZvcm1hdCBhbmQgb3ZlcnJpZGUgZ2xvYmFsCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfb2JqZWN0X3ApCi0gICAgewotICAgICAgaWYgKCgqZWJkLT5lbGZfYmFja2VuZF9vYmplY3RfcCkgKGFiZmQpID09IGZhbHNlKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGFueSByZWxvYyBzZWN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgZGVidWdnaW5nIHNlY3Rpb25zLCBtYXJrIHRoZSByZWxvYyBzZWN0aW9ucyBhcyBkZWJ1Z2dpbmcgYXMgd2VsbC4gICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAotCSAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKQotCSAgJiYgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2luZm8gPiAwKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGFyZ19pbmRleDsKLQkgIGFzZWN0aW9uICp0YXJnX3NlYzsKLQotCSAgdGFyZ19pbmRleCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9pbmZvOwotCSAgdGFyZ19zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgdGFyZ19pbmRleCk7Ci0JICBpZiAodGFyZ19zZWMgIT0gTlVMTAotCSAgICAgICYmICh0YXJnX3NlYy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgICBzLT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChhYmZkLT54dmVjKTsKLQotIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I6Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotIGdvdF9ub19tYXRjaDoKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMCi0gICAgICAmJiBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0ciAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0cik7Ci0gIGlmIChpX3NoZHJwICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIGlfc2hkcnApOwotICBpZiAobmV3X3RkYXRhICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIG5ld190ZGF0YSk7Ci0gIGVsZl90ZGF0YSAoYWJmZCkgPSBwcmVzZXJ2ZWRfdGRhdGE7Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0MCi0vKiBFTEYgLm8vZXhlYyBmaWxlIHdyaXRpbmcgKi8KLQotLyogV3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGJvb2xlYW4gKmZhaWxlZHAgPSAoYm9vbGVhbiAqKSBkYXRhOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7Ci0gIEVsZl9FeHRlcm5hbF9SZWxhICpvdXRib3VuZF9yZWxvY2FzOwotICBFbGZfRXh0ZXJuYWxfUmVsICpvdXRib3VuZF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIGludCB1c2VfcmVsYV9wOwotICBhc3ltYm9sICpsYXN0X3N5bSA9IDA7Ci0gIGludCBsYXN0X3N5bV9pZHggPSAwOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKCpmYWlsZWRwKQotICAgIHJldHVybjsKLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFRoZSBsaW5rZXIgYmFja2VuZCB3cml0ZXMgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLCBhbmQgc2V0cyB0aGUKLSAgICAgcmVsb2NfY291bnQgZmllbGQgdG8gemVybyB0byBpbmhpYml0IHdyaXRpbmcgdGhlbSBoZXJlLiAgQWxzbywKLSAgICAgc29tZXRpbWVzIHRoZSBTRUNfUkVMT0MgZmxhZyBnZXRzIHNldCBldmVuIHdoZW4gdGhlcmUgYXJlbid0IGFueQotICAgICByZWxvY3MuICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyOwotCi0gIHJlbGFfaGRyLT5zaF9zaXplID0gcmVsYV9oZHItPnNoX2VudHNpemUgKiBzZWMtPnJlbG9jX2NvdW50OwotICByZWxhX2hkci0+Y29udGVudHMgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbGFfaGRyLT5zaF9zaXplKTsKLSAgaWYgKHJlbGFfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGV0aGVyIHRoZSByZWxvY2F0aW9ucyBhcmUgUkVMQSBvciBSRUwgcmVsb2NhdGlvbnMuICAqLwotICBpZiAocmVsYV9oZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpCi0gICAgdXNlX3JlbGFfcCA9IHRydWU7Ci0gIGVsc2UgaWYgKHJlbGFfaGRyLT5zaF90eXBlID09IFNIVF9SRUwpCi0gICAgdXNlX3JlbGFfcCA9IGZhbHNlOwotICBlbHNlCi0gICAgLyogRXZlcnkgcmVsb2NhdGlvbiBzZWN0aW9uIHNob3VsZCBiZSBlaXRoZXIgYW4gU0hUX1JFTEEgb3IgYW4KLSAgICAgICBTSFRfUkVMIHNlY3Rpb24uICAqLwotICAgIGFib3J0ICgpOwotCi0gIC8qIG9yZWxvY2F0aW9uIGhhcyB0aGUgZGF0YSwgcmVsb2NfY291bnQgaGFzIHRoZSBjb3VudC4uLiAqLwotICBpZiAodXNlX3JlbGFfcCkKLSAgICB7Ci0gICAgICBvdXRib3VuZF9yZWxvY2FzID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIHJlbGFfaGRyLT5jb250ZW50czsKLQotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSBkc3RfcmVsYTsKLQkgIEVsZl9FeHRlcm5hbF9SZWxhICpzcmNfcmVsYTsKLQkgIGFyZWxlbnQgKnB0cjsKLQkgIGFzeW1ib2wgKnN5bTsKLQkgIGludCBuOwotCi0JICBwdHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF07Ci0JICBzcmNfcmVsYSA9IG91dGJvdW5kX3JlbG9jYXMgKyBpZHg7Ci0KLQkgIC8qIFRoZSBhZGRyZXNzIG9mIGFuIEVMRiByZWxvYyBpcyBzZWN0aW9uIHJlbGF0aXZlIGZvciBhbiBvYmplY3QKLQkgICAgIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkgICAgZHN0X3JlbGEucl9vZmZzZXQgPSBwdHItPmFkZHJlc3M7Ci0JICBlbHNlCi0JICAgIGRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLQkgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotCSAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQkgICAgbiA9IGxhc3Rfc3ltX2lkeDsKLQkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSAmJiBzeW0tPnZhbHVlID09IDApCi0JICAgIG4gPSBTVE5fVU5ERUY7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsYXN0X3N5bSA9IHN5bTsKLQkgICAgICBuID0gX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0JICAgICAgaWYgKG4gPCAwKQotCQl7Ci0JCSAgKmZhaWxlZHAgPSB0cnVlOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JICAgIH0KLQotCSAgaWYgKCgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQgIT0gTlVMTAotCSAgICAgICYmICgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgICAgICYmICEgX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIHB0cikpCi0JICAgIHsKLQkgICAgICAqZmFpbGVkcCA9IHRydWU7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGRzdF9yZWxhLnJfaW5mbyA9IEVMRl9SX0lORk8gKG4sIHB0ci0+aG93dG8tPnR5cGUpOwotCi0JICBkc3RfcmVsYS5yX2FkZGVuZCA9IHB0ci0+YWRkZW5kOwotCSAgZWxmX3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmRzdF9yZWxhLCBzcmNfcmVsYSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIC8qIFJFTCByZWxvY2F0aW9ucyAqLwotICAgIHsKLSAgICAgIG91dGJvdW5kX3JlbG9jcyA9IChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbGFfaGRyLT5jb250ZW50czsKLQotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIGRzdF9yZWw7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsICpzcmNfcmVsOwotCSAgYXJlbGVudCAqcHRyOwotCSAgaW50IG47Ci0JICBhc3ltYm9sICpzeW07Ci0KLQkgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKLQkgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotCSAgc3JjX3JlbCA9IG91dGJvdW5kX3JlbG9jcyArIGlkeDsKLQotCSAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSAgICAgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3Igc2hhcmVkIGxpYnJhcnkuCi0JICAgICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCSAgICBkc3RfcmVsLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotCSAgZWxzZQotCSAgICBkc3RfcmVsLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLQkgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JICAgIG4gPSBsYXN0X3N5bV9pZHg7Ci0JICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikgJiYgc3ltLT52YWx1ZSA9PSAwKQotCSAgICBuID0gU1ROX1VOREVGOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbGFzdF9zeW0gPSBzeW07Ci0JICAgICAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgICAgIGlmIChuIDwgMCkKLQkJewotCQkgICpmYWlsZWRwID0gdHJ1ZTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBsYXN0X3N5bV9pZHggPSBuOwotCSAgICB9Ci0KLQkgIGlmICgoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkICE9IE5VTEwKLQkgICAgICAmJiAoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMKLQkgICAgICAmJiAhIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBwdHIpKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBkc3RfcmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKG4sIHB0ci0+aG93dG8tPnR5cGUpOwotCi0JICBlbGZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZkc3RfcmVsLCBzcmNfcmVsKTsKLQl9Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0KLWludAotZWxmX3dyaXRlX291dF9waGRycyAoYWJmZCwgcGhkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1BoZHIgZXh0cGhkcjsKLSAgICAgIGVsZl9zd2FwX3BoZHJfb3V0IChhYmZkLCBwaGRyLCAmZXh0cGhkcik7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmZXh0cGhkciwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkciksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBwaGRyKys7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGhlYWRlcnMgYW5kIHRoZSBFTEYgZmlsZSBoZWFkZXIuICAqLwotCi1ib29sZWFuCi1lbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfRXh0ZXJuYWxfU2hkciAqeF9zaGRycDsJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKLQotICAvKiBzd2FwIHRoZSBoZWFkZXIgYmVmb3JlIHNwaXR0aW5nIGl0IG91dC4uLiAqLwotCi0jaWYgREVCVUcgJiAxCi0gIGVsZl9kZWJ1Z19maWxlIChpX2VoZHJwKTsKLSNlbmRpZgotICBlbGZfc3dhcF9laGRyX291dCAoYWJmZCwgaV9laGRycCwgJnhfZWhkcik7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJiB4X2VoZHIsIHNpemVvZiAoeF9laGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoeF9laGRyKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGF0IHRoaXMgcG9pbnQgd2UndmUgY29uY29jdGVkIGFsbCB0aGUgRUxGIHNlY3Rpb25zLi4uICovCi0gIHhfc2hkcnAgPSAoRWxmX0V4dGVybmFsX1NoZHIgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKnhfc2hkcnApICogKGlfZWhkcnAtPmVfc2hudW0pKTsKLSAgaWYgKCF4X3NoZHJwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBpX2VoZHJwLT5lX3NobnVtOyBjb3VudCsrKQotICAgIHsKLSNpZiBERUJVRyAmIDIKLSAgICAgIGVsZl9kZWJ1Z19zZWN0aW9uIChjb3VudCwgaV9zaGRycFtjb3VudF0pOwotI2VuZGlmCi0gICAgICBlbGZfc3dhcF9zaGRyX291dCAoYWJmZCwgaV9zaGRycFtjb3VudF0sIHhfc2hkcnAgKyBjb3VudCk7Ci0gICAgfQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgaV9laGRycC0+ZV9zaG9mZiwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpIHhfc2hkcnAsIHNpemVvZiAoKnhfc2hkcnApLCBpX2VoZHJwLT5lX3NobnVtLCBhYmZkKQotCSAgIT0gc2l6ZW9mICgqeF9zaGRycCkgKiBpX2VoZHJwLT5lX3NobnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogbmVlZCB0byBkdW1wIHRoZSBzdHJpbmcgdGFibGUgdG9vLi4uICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWVsZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQsIHN5bXB0cnMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXB0cnM7CQkvKiBCdWZmZXIgZm9yIGdlbmVyYXRlZCBiZmQgc3ltYm9scyAqLwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICp2ZXJoZHI7Ci0gIHVuc2lnbmVkIGxvbmcgc3ltY291bnQ7CS8qIE51bWJlciBvZiBleHRlcm5hbCBFTEYgc3ltYm9scyAqLwotICBlbGZfc3ltYm9sX3R5cGUgKnN5bTsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBiZmQgc3ltYm9sICovCi0gIGVsZl9zeW1ib2xfdHlwZSAqc3ltYmFzZTsJLyogQnVmZmVyIGZvciBnZW5lcmF0ZWQgYmZkIHN5bWJvbHMgKi8KLSAgRWxmX0ludGVybmFsX1N5bSBpX3N5bTsKLSAgRWxmX0V4dGVybmFsX1N5bSAqeF9zeW1wID0gTlVMTDsKLSAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqeF92ZXJzeW1wID0gTlVMTDsKLQotICAvKiBSZWFkIGVhY2ggcmF3IEVMRiBzeW1ib2wsIGNvbnZlcnRpbmcgZnJvbSBleHRlcm5hbCBFTEYgZm9ybSB0bwotICAgICBpbnRlcm5hbCBFTEYgZm9ybSwgYW5kIHRoZW4gdXNpbmcgdGhlIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBhCi0gICAgIGNhbm9uaWNhbCBiZmQgc3ltYm9sIHRhYmxlIGVudHJ5LgotCi0gICAgIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSB0aGUgaW5pdGlhbCBiZmQgY2Fub25pY2FsIHN5bWJvbCBidWZmZXIKLSAgICAgYmFzZWQgb24gYSBvbmUtdG8tb25lIG1hcHBpbmcgb2YgdGhlIEVMRiBzeW1ib2xzIHRvIGNhbm9uaWNhbAotICAgICBzeW1ib2xzLiAgV2UgYWN0dWFsbHkgdXNlIGFsbCB0aGUgRUxGIHN5bWJvbHMsIHNvIHRoZXJlIHdpbGwgYmUgbm8KLSAgICAgc3BhY2UgbGVmdCBvdmVyIGF0IHRoZSBlbmQuICBXaGVuIHdlIGhhdmUgYWxsIHRoZSBzeW1ib2xzLCB3ZQotICAgICBidWlsZCB0aGUgY2FsbGVyJ3MgcG9pbnRlciB2ZWN0b3IuICovCi0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIHZlcmhkciA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0gICAgICBpZiAoZWxmX2R5bnZlcnN5bSAoYWJmZCkgPT0gMCkKLQl2ZXJoZHIgPSBOVUxMOwotICAgICAgZWxzZQotCXZlcmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1faGRyOwotICAgICAgaWYgKChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfc2VjdGlvbiAhPSAwCi0JICAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID09IE5VTEwpCi0JICB8fCAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX3NlY3Rpb24gIT0gMAotCSAgICAgICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZiA9PSBOVUxMKSkKLQl7Ci0JICBpZiAoISBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyAoYWJmZCkpCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gIGlmIChzeW1jb3VudCA9PSAwKQotICAgIHN5bSA9IHN5bWJhc2UgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIC0xOwotCi0gICAgICBzeW1iYXNlID0gKChlbGZfc3ltYm9sX3R5cGUgKikKLQkJIGJmZF96YWxsb2MgKGFiZmQsIHN5bWNvdW50ICogc2l6ZW9mIChlbGZfc3ltYm9sX3R5cGUpKSk7Ci0gICAgICBpZiAoc3ltYmFzZSA9PSAoZWxmX3N5bWJvbF90eXBlICopIE5VTEwpCi0JcmV0dXJuIC0xOwotICAgICAgc3ltID0gc3ltYmFzZTsKLQotICAgICAgLyogVGVtcG9yYXJpbHkgYWxsb2NhdGUgcm9vbSBmb3IgdGhlIHJhdyBFTEYgc3ltYm9scy4gICovCi0gICAgICB4X3N5bXAgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJYmZkX21hbGxvYyAoc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoeF9zeW1wID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB4X3N5bXAsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIHN5bWNvdW50LCBhYmZkKQotCSAgIT0gc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBSZWFkIHRoZSByYXcgRUxGIHZlcnNpb24gc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQotICAgICAgaWYgKHZlcmhkciAhPSBOVUxMCi0JICAmJiB2ZXJoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pICE9IHN5bWNvdW50KQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHZlcnNpb24gY291bnQgKCVsZCkgZG9lcyBub3QgbWF0Y2ggc3ltYm9sIGNvdW50ICglbGQpIiksCi0JICAgICBhYmZkLT5maWxlbmFtZSwKLQkgICAgIChsb25nKSAodmVyaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyc3ltKSksCi0JICAgICBzeW1jb3VudCk7Ci0KLQkgIC8qIFNsdXJwIGluIHRoZSBzeW1ib2xzIHdpdGhvdXQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgc2luY2UgdGhhdCBpcyBtb3JlIGhlbHBmdWwgdGhhbiBqdXN0IHF1aXR0aW5nLiAgKi8KLQkgIHZlcmhkciA9IE5VTEw7Ci0JfQotCi0gICAgICBpZiAodmVyaGRyICE9IE5VTEwpCi0JewotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCB2ZXJoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICB4X3ZlcnN5bXAgPSAoRWxmX0V4dGVybmFsX1ZlcnN5bSAqKSBiZmRfbWFsbG9jICh2ZXJoZHItPnNoX3NpemUpOwotCSAgaWYgKHhfdmVyc3ltcCA9PSBOVUxMICYmIHZlcmhkci0+c2hfc2l6ZSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB4X3ZlcnN5bXAsIDEsIHZlcmhkci0+c2hfc2l6ZSwgYWJmZCkKLQkgICAgICAhPSB2ZXJoZHItPnNoX3NpemUpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogU2tpcCBmaXJzdCBzeW1ib2wsIHdoaWNoIGlzIGEgbnVsbCBkdW1teS4gICovCi0gICAgICBmb3IgKGkgPSAxOyBpIDwgc3ltY291bnQ7IGkrKykKLQl7Ci0JICBlbGZfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIHhfc3ltcCArIGksICZpX3N5bSk7Ci0JICBtZW1jcHkgKCZzeW0tPmludGVybmFsX2VsZl9zeW0sICZpX3N5bSwgc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSk7Ci0jaWZkZWYgRUxGX0tFRVBfRVhUU1lNCi0JICBtZW1jcHkgKCZzeW0tPm5hdGl2ZV9lbGZfc3ltLCB4X3N5bXAgKyBpLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKTsKLSNlbmRpZgotCSAgc3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLQkgIHN5bS0+c3ltYm9sLm5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLAotCQkJCQkJCSAgICAgIGhkci0+c2hfbGluaywKLQkJCQkJCQkgICAgICBpX3N5bS5zdF9uYW1lKTsKLQotCSAgc3ltLT5zeW1ib2wudmFsdWUgPSBpX3N5bS5zdF92YWx1ZTsKLQotCSAgaWYgKGlfc3ltLnN0X3NobmR4ID4gMCAmJiBpX3N5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwKLQkJCQkJCQkgICAgaV9zeW0uc3Rfc2huZHgpOwotCSAgICAgIGlmIChzeW0tPnN5bWJvbC5zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICAvKiBUaGlzIHN5bWJvbCBpcyBpbiBhIHNlY3Rpb24gZm9yIHdoaWNoIHdlIGRpZCBub3QKLQkJICAgICBjcmVhdGUgYSBCRkQgc2VjdGlvbi4gIEp1c3QgdXNlIGJmZF9hYnNfc2VjdGlvbiwKLQkJICAgICBhbHRob3VnaCBpdCBpcyB3cm9uZy4gIEZJWE1FLiAgKi8KLQkJICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChpX3N5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlfc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgICAgICAvKiBFbGYgcHV0cyB0aGUgYWxpZ25tZW50IGludG8gdGhlIGB2YWx1ZScgZmllbGQsIGFuZAotCQkgdGhlIHNpemUgaW50byB0aGUgYHNpemUnIGZpZWxkLiAgQkZEIHdhbnRzIHRvIHNlZSB0aGUKLQkJIHNpemUgaW4gdGhlIHZhbHVlIGZpZWxkLCBhbmQgZG9lc24ndCBjYXJlIChhdCB0aGUKLQkJIG1vbWVudCkgYWJvdXQgdGhlIGFsaWdubWVudC4gICovCi0JICAgICAgc3ltLT5zeW1ib2wudmFsdWUgPSBpX3N5bS5zdF9zaXplOwotCSAgICB9Ci0JICBlbHNlIGlmIChpX3N5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotCSAgLyogSWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBmaWxlLCB0aGVuIHRoZSBzeW1ib2wgdmFsdWUgaXMKLSAgICAgICAgICAgICBhbHJlYWR5IHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgIT0gMCkKLQkgICAgc3ltLT5zeW1ib2wudmFsdWUgLT0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCi0JICBzd2l0Y2ggKEVMRl9TVF9CSU5EIChpX3N5bS5zdF9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFNUQl9MT0NBTDoKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RCX0dMT0JBTDoKLQkgICAgICBpZiAoaV9zeW0uc3Rfc2huZHggIT0gU0hOX1VOREVGCi0JCSAgJiYgaV9zeW0uc3Rfc2huZHggIT0gU0hOX0NPTU1PTikKLQkJc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVEJfV0VBSzoKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfV0VBSzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzd2l0Y2ggKEVMRl9TVF9UWVBFIChpX3N5bS5zdF9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFNUVF9TRUNUSU9OOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTSB8IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RUX0ZJTEU6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZJTEUgfCBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUVF9GVU5DOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVFRfT0JKRUNUOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGR5bmFtaWMpCi0JICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9EWU5BTUlDOwotCi0JICBpZiAoeF92ZXJzeW1wICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfVmVyc3ltIGl2ZXJzeW07Ci0KLQkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiAoYWJmZCwgeF92ZXJzeW1wICsgaSwgJml2ZXJzeW0pOwotCSAgICAgIHN5bS0+dmVyc2lvbiA9IGl2ZXJzeW0udnNfdmVyczsKLQkgICAgfQotCi0JICAvKiBEbyBzb21lIGJhY2tlbmQtc3BlY2lmaWMgcHJvY2Vzc2luZyBvbiB0aGlzIHN5bWJvbC4gICovCi0JICB7Ci0JICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICplYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0JICAgIGlmIChlYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKQotCSAgICAgICgqZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZykgKGFiZmQsICZzeW0tPnN5bWJvbCk7Ci0JICB9Ci0KLQkgIHN5bSsrOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gc29tZSBiYWNrZW5kLXNwZWNpZmljIHByb2Nlc3Npbmcgb24gdGhpcyBzeW1ib2wgdGFibGUuICAqLwotICB7Ci0gICAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgICBpZiAoZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZykKLSAgICAgICgqZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZykgKGFiZmQsIHN5bWJhc2UsIHN5bWNvdW50KTsKLSAgfQotCi0gIC8qIFdlIHJlbHkgb24gdGhlIHphbGxvYyB0byBjbGVhciBvdXQgdGhlIGZpbmFsIHN5bWJvbCBlbnRyeS4gICovCi0KLSAgc3ltY291bnQgPSBzeW0gLSBzeW1iYXNlOwotCi0gIC8qIEZpbGwgaW4gdGhlIHVzZXIncyBzeW1ib2wgcG9pbnRlciB2ZWN0b3IgaWYgbmVlZGVkLiAgKi8KLSAgaWYgKHN5bXB0cnMpCi0gICAgewotICAgICAgbG9uZyBsID0gc3ltY291bnQ7Ci0KLSAgICAgIHN5bSA9IHN5bWJhc2U7Ci0gICAgICB3aGlsZSAobC0tID4gMCkKLQl7Ci0JICAqc3ltcHRycysrID0gJnN5bS0+c3ltYm9sOwotCSAgc3ltKys7Ci0JfQotICAgICAgKnN5bXB0cnMgPSAwOwkJLyogRmluYWwgbnVsbCBwb2ludGVyICovCi0gICAgfQotCi0gIGlmICh4X3ZlcnN5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3ZlcnN5bXApOwotICBpZiAoeF9zeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF9zeW1wKTsKLSAgcmV0dXJuIHN5bWNvdW50OwotZXJyb3JfcmV0dXJuOgotICBpZiAoeF92ZXJzeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF92ZXJzeW1wKTsKLSAgaWYgKHhfc3ltcCAhPSBOVUxMKQotICAgIGZyZWUgKHhfc3ltcCk7Ci0gIHJldHVybiAtMTsKLX0KLQotLyogUmVhZCAgcmVsb2NhdGlvbnMgZm9yIEFTRUNUIGZyb20gUkVMX0hEUi4gIFRoZXJlIGFyZSBSRUxPQ19DT1VOVCBvZiAKLSAgIHRoZW0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbiAoYWJmZCwgYXNlY3QsIHJlbF9oZHIsIHJlbG9jX2NvdW50LAotCQkJCSAgICByZWxlbnRzLCBzeW1ib2xzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gICAgIGFyZWxlbnQgKnJlbGVudHM7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICogY29uc3QgZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBQVFIgYWxsb2NhdGVkID0gTlVMTDsKLSAgYmZkX2J5dGUgKm5hdGl2ZV9yZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbGVudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBlbnRzaXplOwotCi0gIGFsbG9jYXRlZCA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9oZHItPnNoX3NpemUpOwotICBpZiAoYWxsb2NhdGVkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCByZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGFsbG9jYXRlZCwgMSwgcmVsX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkgICE9IHJlbF9oZHItPnNoX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIG5hdGl2ZV9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYWxsb2NhdGVkOwotCi0gIGVudHNpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplOwotICBCRkRfQVNTRVJUIChlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCkKLQkgICAgICB8fCBlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKTsKLQotICBmb3IgKGkgPSAwLCByZWxlbnQgPSByZWxlbnRzOwotICAgICAgIGkgPCByZWxvY19jb3VudDsKLSAgICAgICBpKyssIHJlbGVudCsrLCBuYXRpdmVfcmVsb2NzICs9IGVudHNpemUpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICBpZiAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSkKLQllbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfUmVsYSAqKSBuYXRpdmVfcmVsb2NzLCAmcmVsYSk7Ci0gICAgICBlbHNlCi0JewotCSAgZWxmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfUmVsICopIG5hdGl2ZV9yZWxvY3MsICZyZWwpOwotCSAgcmVsYS5yX29mZnNldCA9IHJlbC5yX29mZnNldDsKLQkgIHJlbGEucl9pbmZvID0gcmVsLnJfaW5mbzsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgVGhlIGFkZHJlc3Mgb2YgYSBub3JtYWwgQkZEIHJlbG9jIGlzIGFsd2F5cyBzZWN0aW9uIHJlbGF0aXZlLAotCSBhbmQgdGhlIGFkZHJlc3Mgb2YgYSBkeW5hbWljIHJlbG9jIGlzIGFic29sdXRlLi4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwIHx8IGR5bmFtaWMpCi0JcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLSAgICAgIGVsc2UKLQlyZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0IC0gYXNlY3QtPnZtYTsKLQotICAgICAgaWYgKEVMRl9SX1NZTSAocmVsYS5yX2luZm8pID09IDApCi0JcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgZWxzZQotCXsKLQkgIGFzeW1ib2wgKipwcywgKnM7Ci0KLQkgIHBzID0gc3ltYm9scyArIEVMRl9SX1NZTSAocmVsYS5yX2luZm8pIC0gMTsKLQkgIHMgPSAqcHM7Ci0KLQkgIC8qIENhbm9uaWNhbGl6ZSBFTEYgc2VjdGlvbiBzeW1ib2xzLiAgRklYTUU6IFdoeT8gICovCi0JICBpZiAoKHMtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCSAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gcHM7Ci0JICBlbHNlCi0JICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIHJlbGVudC0+YWRkZW5kID0gcmVsYS5yX2FkZGVuZDsKLQotICAgICAgaWYgKGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpCi0JKCplYmQtPmVsZl9pbmZvX3RvX2hvd3RvKSAoYWJmZCwgcmVsZW50LCAmcmVsYSk7Ci0gICAgICBlbHNlCi0JKCplYmQtPmVsZl9pbmZvX3RvX2hvd3RvX3JlbCkgKGFiZmQsIHJlbGVudCwgJnJlbCk7Ci0gICAgfQotCi0gIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvY2F0ZWQpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIGFuZCBzd2FwIHRoZSBleHRlcm5hbCByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqIGNvbnN0IGQgPSBlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjI7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQyOwotICBhcmVsZW50ICpyZWxlbnRzOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbiAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIGR5bmFtaWMpCi0gICAgewotICAgICAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgIHx8IGFzZWN0LT5yZWxvY19jb3VudCA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICByZWxfaGRyID0gJmQtPnJlbF9oZHI7Ci0gICAgICByZWxvY19jb3VudCA9IHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplOwotICAgICAgcmVsX2hkcjIgPSBkLT5yZWxfaGRyMjsKLSAgICAgIHJlbG9jX2NvdW50MiA9IChyZWxfaGRyMiAKLQkJICAgICAgPyAocmVsX2hkcjItPnNoX3NpemUgLyByZWxfaGRyMi0+c2hfZW50c2l6ZSkKLQkJICAgICAgOiAwKTsKLQotICAgICAgQkZEX0FTU0VSVCAoYXNlY3QtPnJlbG9jX2NvdW50ID09IHJlbG9jX2NvdW50ICsgcmVsb2NfY291bnQyKTsKLSAgICAgIEJGRF9BU1NFUlQgKGFzZWN0LT5yZWxfZmlsZXBvcyA9PSByZWxfaGRyLT5zaF9vZmZzZXQKLQkJICB8fCAocmVsX2hkcjIgJiYgYXNlY3QtPnJlbF9maWxlcG9zID09IHJlbF9oZHIyLT5zaF9vZmZzZXQpKTsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBBU0VDVC0+UkVMT0NfQ09VTlQgdGVuZHMgbm90IHRvIGJlIGFjY3VyYXRlIGluIHRoaXMKLQkgY2FzZSBiZWNhdXNlIHJlbG9jYXRpb25zIGFnYWluc3QgdGhpcyBzZWN0aW9uIG1heSB1c2UgdGhlCi0JIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBhbmQgaW4gdGhhdCBjYXNlIGJmZF9zZWN0aW9uX2Zyb21fc2hkcgotCSBpbiBlbGYuYyBkb2VzIG5vdCB1cGRhdGUgdGhlIFJFTE9DX0NPVU5ULiAgKi8KLSAgICAgIGlmIChhc2VjdC0+X3Jhd19zaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJlbF9oZHIgPSAmZC0+dGhpc19oZHI7Ci0gICAgICByZWxvY19jb3VudCA9IHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplOwotICAgICAgcmVsX2hkcjIgPSBOVUxMOwotICAgICAgcmVsb2NfY291bnQyID0gMDsKLSAgICB9Ci0KLSAgcmVsZW50cyA9ICgoYXJlbGVudCAqKSAKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgCi0JCQkocmVsb2NfY291bnQgKyByZWxvY19jb3VudDIpICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAocmVsZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIWVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24gKGFiZmQsIGFzZWN0LAotCQkJCQkgICByZWxfaGRyLCByZWxvY19jb3VudCwKLQkJCQkJICAgcmVsZW50cywKLQkJCQkJICAgc3ltYm9scywgZHluYW1pYykpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaWYgKHJlbF9oZHIyIAotICAgICAgJiYgIWVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24gKGFiZmQsIGFzZWN0LAotCQkJCQkgICAgICByZWxfaGRyMiwgcmVsb2NfY291bnQyLAotCQkJCQkgICAgICByZWxlbnRzICsgcmVsb2NfY291bnQsCi0JCQkJCSAgICAgIHN5bWJvbHMsIGR5bmFtaWMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAKLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxlbnRzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZAotZWxmX2RlYnVnX3NlY3Rpb24gKG51bSwgaGRyKQotICAgICBpbnQgbnVtOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotewotICBmcHJpbnRmIChzdGRlcnIsICJcblNlY3Rpb24jJWQgJyVzJyAweCUuOGx4XG4iLCBudW0sCi0JICAgaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMID8gaGRyLT5iZmRfc2VjdGlvbi0+bmFtZSA6ICIiLAotCSAgIChsb25nKSBoZHIpOwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgInNoX25hbWUgICAgICA9ICVsZFx0c2hfdHlwZSAgICAgID0gJWxkXHRzaF9mbGFncyAgICAgPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfbmFtZSwKLQkgICAobG9uZykgaGRyLT5zaF90eXBlLAotCSAgIChsb25nKSBoZHItPnNoX2ZsYWdzKTsKLSAgZnByaW50ZiAoc3RkZXJyLAotCSAgICJzaF9hZGRyICAgICAgPSAlbGRcdHNoX29mZnNldCAgICA9ICVsZFx0c2hfc2l6ZSAgICAgID0gJWxkXG4iLAotCSAgIChsb25nKSBoZHItPnNoX2FkZHIsCi0JICAgKGxvbmcpIGhkci0+c2hfb2Zmc2V0LAotCSAgIChsb25nKSBoZHItPnNoX3NpemUpOwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgInNoX2xpbmsgICAgICA9ICVsZFx0c2hfaW5mbyAgICAgID0gJWxkXHRzaF9hZGRyYWxpZ24gPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfbGluaywKLQkgICAobG9uZykgaGRyLT5zaF9pbmZvLAotCSAgIChsb25nKSBoZHItPnNoX2FkZHJhbGlnbik7Ci0gIGZwcmludGYgKHN0ZGVyciwgInNoX2VudHNpemUgICA9ICVsZFxuIiwKLQkgICAobG9uZykgaGRyLT5zaF9lbnRzaXplKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2RlYnVnX2ZpbGUgKGVoZHJwKQotICAgICBFbGZfSW50ZXJuYWxfRWhkciAqZWhkcnA7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfZW50cnkgICAgICA9IDB4JS44bHhcbiIsIChsb25nKSBlaGRycC0+ZV9lbnRyeSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfcGhvZmYgICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3Bob2ZmKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9waG51bSAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfcGhudW0pOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3BoZW50c2l6ZSAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9waGVudHNpemUpOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3Nob2ZmICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9zaG9mZik7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfc2hudW0gICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3NobnVtKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9zaGVudHNpemUgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfc2hlbnRzaXplKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZWxmX3N5bWJvbF9mbGFncyAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07Ci0KLSAgYnVmZmVyWzBdID0gJ1wwJzsKLSAgaWYgKGZsYWdzICYgQlNGX0xPQ0FMKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGxvY2FsIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0dMT0JBTCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBnbG9iYWwiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGRlYnVnIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0ZVTkNUSU9OKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGZ1bmN0aW9uIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0tFRVApCi0gICAgc3RyY2F0IChidWZmZXIsICIga2VlcCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9LRUVQX0cpCi0gICAgc3RyY2F0IChidWZmZXIsICIga2VlcF9nIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX1dFQUspCi0gICAgc3RyY2F0IChidWZmZXIsICIgd2VhayIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBzZWN0aW9uLXN5bSIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9PTERfQ09NTU9OKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIG9sZC1jb21tb24iKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBub3QtYXQtZW5kIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGNvbnN0cnVjdG9yIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX1dBUk5JTkcpCi0gICAgc3RyY2F0IChidWZmZXIsICIgd2FybmluZyIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9JTkRJUkVDVCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBpbmRpcmVjdCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9GSUxFKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGZpbGUiKTsKLQotICBpZiAoZmxhZ3MgJiBEWU5BTUlDKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGR5bmFtaWMiKTsKLQotICBpZiAoZmxhZ3MgJiB+KEJTRl9MT0NBTAotCQl8IEJTRl9HTE9CQUwKLQkJfCBCU0ZfREVCVUdHSU5HCi0JCXwgQlNGX0ZVTkNUSU9OCi0JCXwgQlNGX0tFRVAKLQkJfCBCU0ZfS0VFUF9HCi0JCXwgQlNGX1dFQUsKLQkJfCBCU0ZfU0VDVElPTl9TWU0KLQkJfCBCU0ZfT0xEX0NPTU1PTgotCQl8IEJTRl9OT1RfQVRfRU5ECi0JCXwgQlNGX0NPTlNUUlVDVE9SCi0JCXwgQlNGX1dBUk5JTkcKLQkJfCBCU0ZfSU5ESVJFQ1QKLQkJfCBCU0ZfRklMRQotCQl8IEJTRl9EWU5BTUlDKSkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiB1bmtub3duLWJpdHMiKTsKLQotICByZXR1cm4gYnVmZmVyOwotfQotI2VuZGlmCi0MCi0jaW5jbHVkZSAiZWxmY29yZS5oIgotI2luY2x1ZGUgImVsZmxpbmsuaCIKLQwKLS8qIFNpemUtZGVwZW5kZW50IGRhdGEgYW5kIGZ1bmN0aW9ucy4gICovCi1jb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBOQU1FKF9iZmRfZWxmLHNpemVfaW5mbykgPSB7Ci0gIHNpemVvZiAoRWxmX0V4dGVybmFsX0VoZHIpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU2hkciksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9EeW4pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9Ob3RlKSwKLSAgQVJDSF9TSVpFIC8gOCwKLSAgMSwKLSAgQVJDSF9TSVpFLCBGSUxFX0FMSUdOLAotICBFTEZDTEFTUywgRVZfQ1VSUkVOVCwKLSAgZWxmX3dyaXRlX291dF9waGRycywKLSAgZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyLAotICB3cml0ZV9yZWxvY3MsCi0gIGVsZl9zd2FwX3N5bWJvbF9vdXQsCi0gIGVsZl9zbHVycF9yZWxvY190YWJsZSwKLSAgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgZWxmX3N3YXBfZHluX2luLAotICBlbGZfc3dhcF9keW5fb3V0LAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2VsZmNvcmUuaCBiL2JmZC9lbGZjb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDU0YWEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKiBFTEYgY29yZSBmaWxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLWNoYXIqCi1lbGZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9jb21tYW5kOwotfQotCi1pbnQKLWVsZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfc2lnbmFsOwotfQotCi0KLWJvb2xlYW4KLWVsZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZDsKLSAgICAgYmZkICpleGVjX2JmZDsKLXsKLSAgY2hhciogY29yZW5hbWU7Ci0KLSAgLyogeHZlY3MgbXVzdCBtYXRjaCBpZiBib3RoIGFyZSBFTEYgZmlsZXMgZm9yIHRoZSBzYW1lIHRhcmdldC4gKi8KLQotICBpZiAoY29yZV9iZmQtPnh2ZWMgIT0gZXhlY19iZmQtPnh2ZWMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIHRoZSBuYW1lIGluIHRoZSBjb3JlZmlsZSBtYXRjaGVzIHRoZSBleGVjdXRhYmxlIG5hbWUuICovCi0KLSAgY29yZW5hbWUgPSBlbGZfdGRhdGEgKGNvcmVfYmZkKS0+Y29yZV9wcm9ncmFtOwotICBpZiAoY29yZW5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyKiBleGVjbmFtZSA9IHN0cnJjaHIgKGV4ZWNfYmZkLT5maWxlbmFtZSwgJy8nKTsKLSAgICAgIGV4ZWNuYW1lID0gZXhlY25hbWUgPyBleGVjbmFtZSArIDEgOiBleGVjX2JmZC0+ZmlsZW5hbWU7Ci0KLSAgICAgIGlmIChzdHJjbXAoZXhlY25hbWUsIGNvcmVuYW1lKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogIENvcmUgZmlsZXMgYXJlIHNpbXBseSBzdGFuZGFyZCBFTEYgZm9ybWF0dGVkIGZpbGVzIHRoYXQgcGFydGl0aW9uCi0gICAgdGhlIGZpbGUgdXNpbmcgdGhlIGV4ZWN1dGlvbiB2aWV3IG9mIHRoZSBmaWxlIChwcm9ncmFtIGhlYWRlciB0YWJsZSkKLSAgICByYXRoZXIgdGhhbiB0aGUgbGlua2luZyB2aWV3LiAgSW4gZmFjdCwgdGhlcmUgaXMgbm8gc2VjdGlvbiBoZWFkZXIKLSAgICB0YWJsZSBpbiBhIGNvcmUgZmlsZS4KLQotICAgIFRoZSBwcm9jZXNzIHN0YXR1cyBpbmZvcm1hdGlvbiAoaW5jbHVkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZ2VuZXJhbAotICAgIHJlZ2lzdGVyIHNldCkgYW5kIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBzZXQgYXJlIHN0b3JlZCBpbiBhCi0gICAgc2VnbWVudCBvZiB0eXBlIFBUX05PVEUuICBXZSBoYW5kY3JhZnQgYSBjb3VwbGUgb2YgZXh0cmEgYmZkIHNlY3Rpb25zCi0gICAgdGhhdCBhbGxvdyBzdGFuZGFyZCBiZmQgYWNjZXNzIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyAoLnJlZykgYW5kIHRoZQotICAgIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAoLnJlZzIpLgotCi0gKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1lbGZfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfUGhkciAqaV9waGRycDsJLyogRWxmIHByb2dyYW0gaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIGludCBwaGluZGV4OwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkOwotCi0gIC8qIFJlYWQgaW4gdGhlIEVMRiBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0LiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHhfZWhkcikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoZSBtYWdpYyBudW1iZXIuICovCi0gIGlmIChlbGZfZmlsZV9wICgmeF9laGRyKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgd3Jvbmc6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBGSVhNRTogQ2hlY2sgRUlfVkVSU0lPTiBoZXJlICEgKi8KLQotICAvKiBDaGVjayB0aGUgYWRkcmVzcyBzaXplICgiY2xhc3MiKS4gKi8KLSAgaWYgKHhfZWhkci5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUykKLSAgICBnb3RvIHdyb25nOwotCi0gIC8qIENoZWNrIHRoZSBieXRlb3JkZXIuICovCi0gIHN3aXRjaCAoeF9laGRyLmVfaWRlbnRbRUlfREFUQV0pCi0gICAgewotICAgIGNhc2UgRUxGREFUQTJNU0I6CQkvKiBCaWctZW5kaWFuICovCi0gICAgICBpZiAoISBiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZ290byB3cm9uZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUxGREFUQTJMU0I6CQkvKiBMaXR0bGUtZW5kaWFuICovCi0gICAgICBpZiAoISBiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0JZ290byB3cm9uZzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBnb3RvIHdyb25nOwotICAgIH0KLQotICAvKiBHaXZlIGFiZmQgYW4gZWxmX29ial90ZGF0YS4gKi8KLSAgZWxmX3RkYXRhIChhYmZkKSA9Ci0gICAgKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9vYmpfdGRhdGEpKTsKLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBGSVhNRTogZnJvbSBoZXJlIG9uIGRvd24sICJnb3RvIHdyb25nIiB3aWxsIGxlYWsgbWVtb3J5LiAgKi8KLQotICAvKiBTd2FwIGluIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIsIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGJ5dGUgb3JkZXIuICovCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgZWxmX3N3YXBfZWhkcl9pbiAoYWJmZCwgJnhfZWhkciwgaV9laGRycCk7Ci0KLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0KLSAgZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIC8qIENoZWNrIHRoYXQgdGhlIEVMRiBlX21hY2hpbmUgZmllbGQgbWF0Y2hlcyB3aGF0IHRoaXMgcGFydGljdWxhcgotICAgICBCRkQgZm9ybWF0IGV4cGVjdHMuICAqLwotCi0gIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gaV9laGRycC0+ZV9tYWNoaW5lCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQxID09IDAKLQkgIHx8IGlfZWhkcnAtPmVfbWFjaGluZSAhPSBlYmQtPmVsZl9tYWNoaW5lX2FsdDEpCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQyID09IDAKLQkgIHx8IGlfZWhkcnAtPmVfbWFjaGluZSAhPSBlYmQtPmVsZl9tYWNoaW5lX2FsdDIpKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0X3B0cjsKLQotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCWdvdG8gd3Jvbmc7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gIExldCBpdCBtYXRjaCBhbnkgRUxGIHRhcmdldAotCSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSBzcGVjaWZpYyBiYWNrZW5kLiAgKi8KLQotICAgICAgZm9yICh0YXJnZXRfcHRyID0gYmZkX3RhcmdldF92ZWN0b3I7ICp0YXJnZXRfcHRyICE9IE5VTEw7IHRhcmdldF9wdHIrKykKLQl7Ci0JICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmFjazsKLQotCSAgaWYgKCgqdGFyZ2V0X3B0ciktPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkgICAgY29udGludWU7Ci0JICBiYWNrID0gKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICopICgqdGFyZ2V0X3B0ciktPmJhY2tlbmRfZGF0YTsKLQkgIGlmIChiYWNrLT5lbGZfbWFjaGluZV9jb2RlID09IGlfZWhkcnAtPmVfbWFjaGluZSkKLQkgICAgewotCSAgICAgIC8qIHRhcmdldF9wdHIgaXMgYW4gRUxGIGJhY2tlbmQgd2hpY2ggbWF0Y2hlcyB0aGlzCi0JCSBvYmplY3QgZmlsZSwgc28gcmVqZWN0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICAqLwotCSAgICAgIGdvdG8gd3Jvbmc7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIG5vIHByb2dyYW0gaGVhZGVyLCBvciB0aGUgdHlwZSBpcyBub3QgYSBjb3JlIGZpbGUsIHRoZW4KLSAgICAgd2UgYXJlIGhvc2VkLiAqLwotICBpZiAoaV9laGRycC0+ZV9waG9mZiA9PSAwIHx8IGlfZWhkcnAtPmVfdHlwZSAhPSBFVF9DT1JFKQotICAgIGdvdG8gd3Jvbmc7Ci0KLSAgLyogRG9lcyBCRkQncyBpZGVhIG9mIHRoZSBwaGRyIHNpemUgbWF0Y2ggdGhlIHNpemUKLSAgICAgcmVjb3JkZWQgaW4gdGhlIGZpbGU/ICovCi0gIGlmIChpX2VoZHJwLT5lX3BoZW50c2l6ZSAhPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSkKLSAgICBnb3RvIHdyb25nOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAqLwotICBpX3BoZHJwID0gKEVsZl9JbnRlcm5hbF9QaGRyICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCppX3BoZHJwKSAqIGlfZWhkcnAtPmVfcGhudW0pOwotICBpZiAoIWlfcGhkcnApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IGlfcGhkcnA7Ci0KLSAgLyogUmVhZCBhbmQgY29udmVydCB0byBpbnRlcm5hbCBmb3JtLiAqLwotICBmb3IgKHBoaW5kZXggPSAwOyBwaGluZGV4IDwgaV9laGRycC0+ZV9waG51bTsgKytwaGluZGV4KQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9QaGRyIHhfcGhkcjsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJnhfcGhkciwgc2l6ZW9mICh4X3BoZHIpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mICh4X3BoZHIpKQotCXJldHVybiBOVUxMOwotCi0gICAgICBlbGZfc3dhcF9waGRyX2luIChhYmZkLCAmeF9waGRyLCBpX3BoZHJwICsgcGhpbmRleCk7Ci0gICAgfQotCi0gIC8qIFByb2Nlc3MgZWFjaCBwcm9ncmFtIGhlYWRlci4gKi8KLSAgZm9yIChwaGluZGV4ID0gMDsgcGhpbmRleCA8IGlfZWhkcnAtPmVfcGhudW07ICsrcGhpbmRleCkKLSAgICB7Ci0gICAgICBpZiAoIV9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaV9waGRycCArIHBoaW5kZXgsIHBoaW5kZXgpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBTZXQgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlLiAqLwotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBlYmQtPmFyY2gsIDApKQotICAgIHsKLSAgICAgIC8qIEl0J3MgT0sgaWYgdGhpcyBmYWlscyBmb3IgdGhlIGdlbmVyaWMgdGFyZ2V0LiAgKi8KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2F2ZSB0aGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgRUxGIGhlYWRlci4gKi8KLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGlfZWhkcnAtPmVfZW50cnk7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWxmbGluay5jIGIvYmZkL2VsZmxpbmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzNGQ4NC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qIEVMRiBsaW5raW5nIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2RlZmluZSBBUkNIX1NJWkUgMAotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotYm9vbGVhbgotX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBpbnQgcHRyYWxpZ247Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmdvdCIpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKLSAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gICAgfQotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJlZC0+d2FudF9nb3RfcGx0KQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdC5wbHQiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlIC5nb3QKLSAgICAgKG9yIC5nb3QucGx0KSBzZWN0aW9uLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgbGlua2VyIHNjcmlwdAotICAgICBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBzeW1ib2wgaWYgd2UgYXJlIG5vdCBjcmVhdGluZwotICAgICBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JIGJlZC0+Z290X3N5bWJvbF9vZmZzZXQsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSBiZWQtPmNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdCA9IGg7Ci0KLSAgLyogVGhlIGZpcnN0IGJpdCBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBpcyB0aGUgaGVhZGVyLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGJlZC0+Z290X2hlYWRlcl9zaXplICsgYmVkLT5nb3Rfc3ltYm9sX29mZnNldDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLQotLyogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFncywgcGx0ZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBpbnQgcHRyYWxpZ24gPSAwOwotCi0gIHN3aXRjaCAoYmVkLT5zLT5hcmNoX3NpemUpCi0gICAgewotICAgIGNhc2UgMzI6IHB0cmFsaWduID0gMjsgYnJlYWs7Ci0gICAgY2FzZSA2NDogcHRyYWxpZ24gPSAzOyBicmVhazsKLSAgICBkZWZhdWx0OiBhYm9ydCgpOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSAucGx0LCAucmVsW2FdLnBsdCwgLmdvdCwgLmdvdC5wbHQsIC5keW5ic3MsIGFuZAotICAgICAucmVsW2FdLmJzcyBzZWN0aW9ucy4gICovCi0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBwbHRmbGFncyA9IGZsYWdzOwotICBwbHRmbGFncyB8PSBTRUNfQ09ERTsKLSAgaWYgKGJlZC0+cGx0X25vdF9sb2FkZWQpCi0gICAgcGx0ZmxhZ3MgJj0gfiAoU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKTsKLSAgaWYgKGJlZC0+cGx0X3JlYWRvbmx5KQotICAgIHBsdGZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5wbHQiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIHBsdGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBiZWQtPnBsdF9hbGlnbm1lbnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmVkLT53YW50X3BsdF9zeW0pCi0gICAgewotICAgICAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlCi0JIC5wbHQgc2VjdGlvbi4gICovCi0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JICAgICAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICAgICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIAotCQkJYmVkLT5kZWZhdWx0X3VzZV9yZWxhX3AgPyAiLnJlbGEucGx0IiA6ICIucmVsLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJlZC0+d2FudF9keW5ic3MpCi0gICAgewotICAgICAgLyogVGhlIC5keW5ic3Mgc2VjdGlvbiBpcyBhIHBsYWNlIHRvIHB1dCBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkCi0JIGJ5IGR5bmFtaWMgb2JqZWN0cywgYXJlIHJlZmVyZW5jZWQgYnkgcmVndWxhciBvYmplY3RzLCBhbmQgYXJlCi0JIG5vdCBmdW5jdGlvbnMuICBXZSBtdXN0IGFsbG9jYXRlIHNwYWNlIGZvciB0aGVtIGluIHRoZSBwcm9jZXNzCi0JIGltYWdlIGFuZCB1c2UgYSBSXypfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotCSBpbml0aWFsaXplIHRoZW0gYXQgcnVuIHRpbWUuICBUaGUgbGlua2VyIHNjcmlwdCBwdXRzIHRoZSAuZHluYnNzCi0JIHNlY3Rpb24gaW50byB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBmaW5hbCBpbWFnZS4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5ic3MiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5yZWxbYV0uYnNzIHNlY3Rpb24gaG9sZHMgY29weSByZWxvY3MuICBUaGlzIHNlY3Rpb24gaXMgbm90Ci0gICAgIG5vcm1hbGx5IG5lZWRlZC4gIFdlIG5lZWQgdG8gY3JlYXRlIGl0IGhlcmUsIHRob3VnaCwgc28gdGhhdCB0aGUKLSAgICAgbGlua2VyIHdpbGwgbWFwIGl0IHRvIGFuIG91dHB1dCBzZWN0aW9uLiAgV2UgY2FuJ3QganVzdCBjcmVhdGUgaXQKLSAgICAgb25seSBpZiB3ZSBuZWVkIGl0LCBiZWNhdXNlIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB3ZSBuZWVkIGl0Ci0gICAgIHVudGlsIHdlIGhhdmUgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBhbmQgdGhlIGZpcnN0IHRpbWUgdGhlCi0gICAgIG1haW4gbGlua2VyIGNvZGUgY2FsbHMgQkZEIGFmdGVyIGV4YW1pbmluZyBhbGwgdGhlIGlucHV0IGZpbGVzCi0gICAgIChzaXplX2R5bmFtaWNfc2VjdGlvbnMpIHRoZSBpbnB1dCBzZWN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbgotICAgICBtYXBwZWQgdG8gdGhlIG91dHB1dCBzZWN0aW9ucy4gIElmIHRoZSBzZWN0aW9uIHR1cm5zIG91dCBub3QgdG8KLSAgICAgYmUgbmVlZGVkLCB3ZSBjYW4gZGlzY2FyZCBpdCBsYXRlci4gIFdlIHdpbGwgbmV2ZXIgbmVlZCB0aGlzCi0gICAgIHNlY3Rpb24gd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgc2luY2UgdGhleSBkbyBub3QgdXNlCi0gICAgIGNvcHkgcmVsb2NzLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgCi0JCQkJKGJlZC0+ZGVmYXVsdF91c2VfcmVsYV9wIAotCQkJCSA/ICIucmVsYS5ic3MiIDogIi5yZWwuYnNzIikpOyAKLQkgIGlmIChzID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBwdHJhbGlnbikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBSZWNvcmQgYSBuZXcgZHluYW1pYyBzeW1ib2wuICBXZSByZWNvcmQgdGhlIGR5bmFtaWMgc3ltYm9scyBhcyB3ZQotICAgcmVhZCB0aGUgaW5wdXQgZmlsZXMsIHNpbmNlIHdlIG5lZWQgdG8gaGF2ZSBhIGxpc3Qgb2YgYWxsIG9mIHRoZW0KLSAgIGJlZm9yZSB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBmaW5hbCBzaXplcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb25zLgotICAgTm90ZSB0aGF0IHdlIG1heSBhY3R1YWxseSBjYWxsIHRoaXMgZnVuY3Rpb24gZXZlbiB0aG91Z2ggd2UgYXJlIG5vdAotICAgZ29pbmcgdG8gb3V0cHV0IGFueSBkeW5hbWljIHN5bWJvbHM7IGluIHNvbWUgY2FzZXMgd2Uga25vdyB0aGF0IGEKLSAgIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBidXQgb25seSBpZiB0aGVyZSBpcwotICAgb25lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICAgICAgY2hhciAqcCwgKmFsYzsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIGNvcHk7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgICAgIC8qIFhYWDogVGhlIEFCSSBkcmFmdCBzYXlzIHRoZSBsaW5rZXIgbXVzdCB0dXJuIGhpZGRlbiBhbmQKLQkgaW50ZXJuYWwgc3ltYm9scyBpbnRvIFNUQl9MT0NBTCBzeW1ib2xzIHdoZW4gcHJvZHVjaW5nIHRoZQotCSBEU08uIEhvd2V2ZXIsIGlmIGxkLnNvIGhvbm9ycyBzdF9vdGhlciBpbiB0aGUgZHluYW1pYyB0YWJsZSwKLQkgdGhpcyB3b3VsZCBub3QgYmUgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIHN3aXRjaCAoRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKSkKLQl7Ci0JY2FzZSBTVFZfSU5URVJOQUw6Ci0JY2FzZSBTVFZfSElEREVOOgotCSAgLyogVGhpcyBzeW1ib2wgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzaGFyZWQgb2JqZWN0IG9yCi0JICAgICBleGVjdXRhYmxlLiAgKi8KLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBiZmQgKiBhYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0JICAgICAgY29uc3QgY2hhciAqIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIAotCSAgICAgICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkoaW5mbywgbmFtZSwgYWJmZCwgYmZkX3VuZF9zZWN0aW9uX3B0ciwgMCwgdHJ1ZSk7Ci0JICAgIH0KLQkgIAotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7Ci0JICBicmVhazsKLQkgIAotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGgtPmR5bmluZHggPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgICAgKytlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gICAgICBkeW5zdHIgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cjsKLSAgICAgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotCSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBkeW5zdHIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLQkgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgZG9uJ3QgcHV0IGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBkeW5hbWljIHN0cmluZwotICAgICAgICAgdGFibGUuICAqLwotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGFsYyA9IE5VTEw7Ci0JICBjb3B5ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFsYyA9IGJmZF9tYWxsb2MgKHAgLSBuYW1lICsgMSk7Ci0JICBpZiAoYWxjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN0cm5jcHkgKGFsYywgbmFtZSwgcCAtIG5hbWUpOwotCSAgYWxjW3AgLSBuYW1lXSA9ICdcMCc7Ci0JICBuYW1lID0gYWxjOwotCSAgY29weSA9IHRydWU7Ci0JfQotCi0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsIG5hbWUsIHRydWUsIGNvcHkpOwotCi0gICAgICBpZiAoYWxjICE9IE5VTEwpCi0JZnJlZSAoYWxjKTsKLQotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IGluZHg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGR5bmluZGV4IG9mIGEgbG9jYWwgZHluYW1pYyBzeW1ib2wuICAqLwotCi1sb25nCi1fYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4IChpbmZvLCBpbnB1dF9iZmQsIGlucHV0X2luZHgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgbG9uZyBpbnB1dF9pbmR4OwotewotICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqZTsKLQotICBmb3IgKGUgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsOyBlIDsgZSA9IGUtPm5leHQpCi0gICAgaWYgKGUtPmlucHV0X2JmZCA9PSBpbnB1dF9iZmQgJiYgZS0+aW5wdXRfaW5keCA9PSBpbnB1dF9pbmR4KQotICAgICAgcmV0dXJuIGUtPmR5bmluZHg7Ci0gIHJldHVybiAtMTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbnVtYmVyIHRoZSBkeW5hbWljIHN5bWJvbHMsIGlmIHNvbWUgb2YKLSAgIHRoZW0gYXJlIHJlbW92ZWQgYmVjYXVzZSB0aGV5IGFyZSBtYXJrZWQgYXMgbG9jYWwuICBUaGlzIGlzIGNhbGxlZAotICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc2l6ZV90ICpjb3VudCA9IChzaXplX3QgKikgZGF0YTsKLQotICBpZiAoaC0+ZHluaW5keCAhPSAtMSkKLSAgICBoLT5keW5pbmR4ID0gKysoKmNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXNzaWduIGR5bnN5bSBpbmRpY2llcy4gIEluIGEgc2hhcmVkIGxpYnJhcnkgd2UgZ2VuZXJhdGUgYSBzZWN0aW9uCi0gICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24sIHdoaWNoIGNvbWUgZmlyc3QuICBOZXh0IGNvbWUgYWxsIG9mCi0gICB0aGUgYmFjay1lbmQgYWxsb2NhdGVkIGxvY2FsIGR5bmFtaWMgc3ltcywgZm9sbG93ZWQgYnkgdGhlIHJlc3Qgb2YKLSAgIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0KLXVuc2lnbmVkIGxvbmcKLV9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgbG9uZyBkeW5zeW1jb3VudCA9IDA7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqcDsKLSAgICAgIGZvciAocCA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBwIDsgcCA9IHAtPm5leHQpCi0JZWxmX3NlY3Rpb25fZGF0YSAocCktPmR5bmluZHggPSArK2R5bnN5bWNvdW50OwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqcDsKLSAgICAgIGZvciAocCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlubG9jYWw7IHAgOyBwID0gcC0+bmV4dCkKLQlwLT5keW5pbmR4ID0gKytkeW5zeW1jb3VudDsKLSAgICB9Ci0KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMsCi0JCQkgICZkeW5zeW1jb3VudCk7Ci0KLSAgLyogVGhlcmUgaXMgYW4gdW51c2VkIE5VTEwgZW50cnkgYXQgdGhlIGhlYWQgb2YgdGhlIHRhYmxlIHdoaWNoCi0gICAgIHdlIG11c3QgYWNjb3VudCBmb3IgaW4gb3VyIGNvdW50LiAgVW5sZXNzIHRoZXJlIHdlcmVuJ3QgYW55Ci0gICAgIHN5bWJvbHMsIHdoaWNoIG1lYW5zIHdlJ2xsIGhhdmUgbm8gdGFibGUgYXQgYWxsLiAgKi8KLSAgaWYgKGR5bnN5bWNvdW50ICE9IDApCi0gICAgKytkeW5zeW1jb3VudDsKLQotICByZXR1cm4gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9IGR5bnN5bWNvdW50OwotfQotDAotLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiwgb3IgcmV0dXJuIGEgcG9pbnRlciB0byBhIGxpbmtlcgotICAgc2VjdGlvbiBhbHJlYWR5IGNyZWF0ZWQgKi8KLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCwgZGVmYXVsdHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0gd2hpY2g7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpkZWZhdWx0czsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotCi0gIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCi0gIGlmICghZHlub2JqKQotICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLSAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOwotICBpZiAoIWxzZWN0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBsc2VjdCA9IChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKQotCWJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl90KSk7Ci0KLSAgICAgICpsc2VjdCA9ICpkZWZhdWx0czsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCkgPSBsc2VjdDsKLSAgICAgIGxzZWN0LT53aGljaCA9IHdoaWNoOwotICAgICAgbHNlY3QtPmhvbGVfd3JpdHRlbl9wID0gZmFsc2U7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGUgc2VjdGlvbnMgYWxyZWFkeSBleGlzdCAqLwotICAgICAgbHNlY3QtPnNlY3Rpb24gPSBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPm5hbWUpOwotICAgICAgaWYgKCFzIHx8IChzLT5mbGFncyAmIGRlZmF1bHRzLT5mbGFncykgIT0gZGVmYXVsdHMtPmZsYWdzKQotCXsKLQkgIGxzZWN0LT5zZWN0aW9uID0gcyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChkeW5vYmosIGxzZWN0LT5uYW1lKTsKLQotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLCBkZWZhdWx0cy0+ZmxhZ3MpOwotCSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBsc2VjdC0+YWxpZ25tZW50KTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpIDwgbHNlY3QtPmFsaWdubWVudCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIGxzZWN0LT5hbGlnbm1lbnQpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBhbGlnbl9wb3dlciAocy0+X3Jhd19zaXplLCBsc2VjdC0+YWxpZ25tZW50KTsKLQotICAgICAgLyogSXMgdGhlcmUgYSBob2xlIHdlIGhhdmUgdG8gcHJvdmlkZT8gIElmIHNvIGNoZWNrIHdoZXRoZXIgdGhlIHNlZ21lbnQgaXMKLQkgdG9vIGJpZyBhbHJlYWR5ICovCi0gICAgICBpZiAobHNlY3QtPmhvbGVfc2l6ZSkKLQl7Ci0JICBsc2VjdC0+aG9sZV9vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0JICBzLT5fcmF3X3NpemUgKz0gbHNlY3QtPmhvbGVfc2l6ZTsKLQkgIGlmIChsc2VjdC0+aG9sZV9vZmZzZXQgPiBsc2VjdC0+bWF4X2hvbGVfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogU2VjdGlvbiAlcyBpcyBhbHJlYWR5IHRvIGxhcmdlIHRvIHB1dCBob2xlIG9mICVsZCBieXRlcyBpbiIpLAotCQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAgICBsc2VjdC0+bmFtZSwKLQkJCQkgICAgIChsb25nKWxzZWN0LT5ob2xlX3NpemUpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ3JlYXRpbmcgc2VjdGlvbiAlcywgY3VycmVudCBzaXplID0gJWxkXG4iLAotCSAgICAgICBsc2VjdC0+bmFtZSwgKGxvbmcpcy0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAobHNlY3QtPnN5bV9uYW1lKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQWRkaW5nICVzIHRvIHNlY3Rpb24gJXNcbiIsCi0JCSAgIGxzZWN0LT5zeW1fbmFtZSwKLQkJICAgbHNlY3QtPm5hbWUpOwotI2VuZGlmCi0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgIGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBsc2VjdC0+c3ltX25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICBpZiAoKGggPT0gTlVMTCB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgICAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSAgICAgYWJmZCwKLQkJCQkJCSAgICAgbHNlY3QtPnN5bV9uYW1lLAotCQkJCQkJICAgICBCU0ZfR0xPQkFMLAotCQkJCQkJICAgICBzLAotCQkJCQkJICAgICAoKGxzZWN0LT5ob2xlX3NpemUpCi0JCQkJCQkgICAgICA/IHMtPl9yYXdfc2l6ZSAtIGxzZWN0LT5ob2xlX3NpemUgKyBsc2VjdC0+c3ltX29mZnNldAotCQkJCQkJICAgICAgOiBsc2VjdC0+c3ltX29mZnNldCksCi0JCQkJCQkgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgIGZhbHNlLAotCQkJCQkJICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGlmICgoZGVmYXVsdHMtPndoaWNoICE9IExJTktFUl9TRUNUSU9OX1NEQVRBKQotCSAgICAgICYmIChkZWZhdWx0cy0+d2hpY2ggIT0gTElOS0VSX1NFQ1RJT05fU0RBVEEyKSkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCi0JICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgIGxzZWN0LT5zeW1faGFzaCA9IGg7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JfQotICAgIH0KLQotI2lmIDAKLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlLiAgVGhlIHNlY3Rpb25zIHdoaWNoIG1heSBleGlzdCBpbiB0aGUKLSAgICAgb2JqZWN0IGZpbGUgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggdGhlIHNlY3Rpb25zIHdlIHdhbnQgdG8KLSAgICAgY3JlYXRlLiAgKi8KLQotICAvKiBGaW5kIHRoZSByZWxhdGVkIHNlY3Rpb25zIGlmIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQgKi8KLSAgaWYgKGxzZWN0LT5ic3NfbmFtZSAmJiAhbHNlY3QtPmJzc19zZWN0aW9uKQotICAgIGxzZWN0LT5ic3Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5ic3NfbmFtZSk7Ci0KLSAgaWYgKGxzZWN0LT5yZWxfbmFtZSAmJiAhbHNlY3QtPnJlbF9zZWN0aW9uKQotICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5yZWxfbmFtZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gbHNlY3Q7Ci19Ci0KLQwKLS8qIEZpbmQgYSBsaW5rZXIgZ2VuZXJhdGVkIHBvaW50ZXIgd2l0aCBhIGdpdmVuIGFkZGVuZCBhbmQgdHlwZS4gICovCi0KLWVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoKLV9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAobGlua2VyX3BvaW50ZXJzLCBhZGRlbmQsIHdoaWNoKQotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzOwotICAgICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7Ci17Ci0gIGZvciAoIDsgbGlua2VyX3BvaW50ZXJzICE9IE5VTEw7IGxpbmtlcl9wb2ludGVycyA9IGxpbmtlcl9wb2ludGVycy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAod2hpY2ggPT0gbGlua2VyX3BvaW50ZXJzLT53aGljaCAmJiBhZGRlbmQgPT0gbGlua2VyX3BvaW50ZXJzLT5hZGRlbmQpCi0JcmV0dXJuIGxpbmtlcl9wb2ludGVyczsKLSAgICB9Ci0KLSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci19Ci0KLQwKLS8qIE1ha2UgdGhlIC5yZWxhIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIGxpbmtlciBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhIChkeW5vYmosIGxzZWN0LCBhbGlnbm1lbnQpCi0gICAgIGJmZCAqZHlub2JqOwotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci17Ci0gIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgICAgIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24gPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwKLQkJCQkgICAgICBsc2VjdC0+cmVsX3NlY3Rpb24sCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIGxzZWN0LT5yZWxfc2VjdGlvbiwgYWxpZ25tZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZmxpbmsuaCBiL2JmZC9lbGZsaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGYyOTAuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3MDMgKzAsMCBAQAotLyogRUxGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRUxGIGxpbmtlciBjb2RlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHJvdXRpbmVzIGNhbGxlZCB2aWEKLSAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2Ugd2hpY2ggbXVzdCByZXR1cm4gZmFpbHVyZS4gICovCi0KLXN0cnVjdCBlbGZfaW5mb19mYWlsZWQKLXsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbWVyZ2Vfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiwKLQkgICBib29sZWFuICosIGJvb2xlYW4gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9maXhfc3ltYm9sX2ZsYWdzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2NvbGxlY3RfaGFzaF9jb2RlcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIFBUUiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIHZvaWQgZWxmX2xpbmtfb3V0cHV0X3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfbGlua19hZGp1c3RfcmVsb2NzIAotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgaW50LCAKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0vKiBHaXZlbiBhbiBFTEYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotDAotLyogUmV0dXJuIHRydWUgaWZmIHRoaXMgaXMgYSBub24tY29tbW9uIGRlZmluaXRpb24gb2YgYSBzeW1ib2wuICAqLwotc3RhdGljIGJvb2xlYW4KLWlzX2dsb2JhbF9zeW1ib2xfZGVmaW5pdGlvbiAoYWJmZCwgc3ltKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBzeW07Ci17Ci0gIC8qIExvY2FsIHN5bWJvbHMgZG8gbm90IGNvdW50LCBidXQgdGFyZ2V0IHNwZWNpZmljIG9uZXMgbWlnaHQuICAqLwotICBpZiAoRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0dMT0JBTAotICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPCBTVEJfTE9PUykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gaXMgdW5kZWZpbmVkLCB0aGVuIHNvIGlzIHRoZSBzeW1ib2wuICAqLwotICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBjb21tb24gc2VjdGlvbiwgdGhlbgotICAgICBpdCBpcyBhIGNvbW1vbiBkZWZpbml0aW9uIGFuZCBzbyBkb2VzIG5vdCBjb3VudC4gICovCi0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgaW4gYSB0YXJnZXQgc3BlY2lmaWMgc2VjdGlvbiB0aGVuIHdlCi0gICAgIG11c3QgcmVseSB1cG9uIHRoZSBiYWNrZW5kIHRvIHRlbGwgdXMgd2hhdCBpdCBpcy4gICovCi0gIGlmIChzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUgJiYgc3ltLT5zdF9zaG5keCA8IFNITl9BQlMpCi0gICAgLyogRklYTUUgLSB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjb2RlZCB5ZXQ6Ci0gICAgICAgCi0gICAgICAgcmV0dXJuIF9iZmRfaXNfZ2xvYmFsX3N5bWJvbF9kZWZpbml0aW9uIChhYmZkLCBzeW0pOwotICAgICAgIAotICAgICAgIEluc3RlYWQgZm9yIG5vdyBhc3N1bWUgdGhhdCB0aGUgZGVmaW5pdGlvbiBpcyBub3QgZ2xvYmFsLAotICAgICAgIEV2ZW4gaWYgdGhpcyBpcyB3cm9uZywgYXQgbGVhc3QgdGhlIGxpbmtlciB3aWxsIGJlaGF2ZQotICAgICAgIGluIHRoZSBzYW1lIHdheSB0aGF0IGl0IHVzZWQgdG8gZG8uICAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgICAgIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBTZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgYXJjaGl2ZSBlbGVtZW50IG9mIHRoZSBhcmNoaXZlIEFCRkQKLSAgIHdob2VzIGFyY2hvdmUgbWFwIGNvbnRhaW5zIGEgbWVudGlvbiBvZiBTWU1ERUYsIGFuZCBkZXRlcm1pbmUgaWYKLSAgIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGlzIGVsZW1lbnQuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2lzX2RlZmluZWRfYXJjaGl2ZV9zeW1ib2wgKGFiZmQsIHN5bWRlZikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgY2Fyc3ltICogc3ltZGVmOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgRWxmX0V4dGVybmFsX1N5bSAqICBlc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICogIGVzeW1lbmQ7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKiAgYnVmID0gTlVMTDsKLSAgc2l6ZV90IHN5bWNvdW50OwotICBzaXplX3QgZXh0c3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gIAotICBhYmZkID0gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIHN5bWRlZi0+ZmlsZV9vZmZzZXQpOwotICBpZiAoYWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGlzIHN5bWJvbCBpbiB0aGUKLSAgICAgbGluayB0aGVuIHdlIGRvIG5vdCBuZWVkIHRvIGluY2x1ZGUgaXQgYWdhaW4uICBKdXN0IGNsYWltIHRoYXQgYW55IHN5bWJvbAotICAgICBpdCBjb250YWlucyBpcyBub3QgYSBkZWZpbml0aW9uLCBzbyB0aGF0IG91ciBjYWxsZXIgd2lsbCBub3QgZGVjaWRlIHRvCi0gICAgIChyZSlpbmNsdWRlIHRoaXMgZWxlbWVudC4gICovCi0gIGlmIChhYmZkLT5hcmNoaXZlX3Bhc3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCB8fCBlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBlbHNlCi0gICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBzeW10YWIgaGVhZGVyIHRlbGxzIHVzIHdoZXJlIHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzIHN0YXJ0LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gIGlmIChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudDsKLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudCAtIGhkci0+c2hfaW5mbzsKLSAgICAgIGV4dHN5bW9mZiA9IGhkci0+c2hfaW5mbzsKLSAgICB9Ci0KLSAgYnVmID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JIGJmZF9tYWxsb2MgKGV4dHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOwotICBpZiAoYnVmID09IE5VTEwgJiYgZXh0c3ltY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLgotICAgICBGSVhNRTogIFRoaXMgb3VnaHQgdG8gYmUgY2FjaGVkIHNvbWV3aGVyZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJaGRyLT5zaF9vZmZzZXQgKyBleHRzeW1vZmYgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSBidWYsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIGV4dHN5bWNvdW50LCBhYmZkKQotCSAgIT0gZXh0c3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLSAgICB7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTY2FuIHRoZSBzeW1ib2wgdGFibGUgbG9va2luZyBmb3IgU1lNREVGLiAgKi8KLSAgZXN5bWVuZCA9IGJ1ZiArIGV4dHN5bWNvdW50OwotICBmb3IgKGVzeW0gPSBidWY7Ci0gICAgICAgZXN5bSA8IGVzeW1lbmQ7Ci0gICAgICAgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJiBzeW0pOwotCi0gICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLCBzeW0uc3RfbmFtZSk7Ci0gICAgICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWJyZWFrOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCBzeW1kZWYtPm5hbWUpID09IDApCi0JewotCSAgcmVzdWx0ID0gaXNfZ2xvYmFsX3N5bWJvbF9kZWZpbml0aW9uIChhYmZkLCAmIHN5bSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKGJ1Zik7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotDAotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIEVMRiBhcmNoaXZlIGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgV2UKLSAgIGRvbid0IHVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGJlY2F1c2Ugb2YgYQotICAgcHJvYmxlbSB3aGljaCBhcmlzZXMgb24gVW5peFdhcmUuICBUaGUgVW5peFdhcmUgbGliYy5zbyBpcyBhbgotICAgYXJjaGl2ZSB3aGljaCBpbmNsdWRlcyBhbiBlbnRyeSBsaWJjLnNvLjEgd2hpY2ggZGVmaW5lcyBhIGJ1bmNoIG9mCi0gICBzeW1ib2xzLiAgVGhlIGxpYmMuc28gYXJjaGl2ZSBhbHNvIGluY2x1ZGVzIGEgbnVtYmVyIG9mIG90aGVyCi0gICBvYmplY3QgZmlsZXMsIHdoaWNoIGFsc28gZGVmaW5lIHN5bWJvbHMsIHNvbWUgb2Ygd2hpY2ggYXJlIHRoZSBzYW1lCi0gICBhcyB0aG9zZSBkZWZpbmVkIGluIGxpYmMuc28uMS4gIENvcnJlY3QgbGlua2luZyByZXF1aXJlcyB0aGF0IHdlCi0gICBjb25zaWRlciBlYWNoIG9iamVjdCBmaWxlIGluIHR1cm4sIGFuZCBpbmNsdWRlIGl0IGlmIGl0IGRlZmluZXMgYW55Ci0gICBzeW1ib2xzIHdlIG5lZWQuICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGRvZXMgbm90IGRvCi0gICB0aGlzOyBpdCBsb29rcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgaW5jbHVkZXMKLSAgIGFueSBvYmplY3QgZmlsZSB3aGljaCBkZWZpbmVzIHRoZW0uICBXaGVuIHRoaXMgYWxnb3JpdGhtIGlzIHVzZWQgb24KLSAgIFVuaXhXYXJlLCBpdCB3aW5kcyB1cCBwdWxsaW5nIGluIGxpYmMuc28uMSBlYXJseSBhbmQgZGVmaW5pbmcgYQotICAgYnVuY2ggb2Ygc3ltYm9scy4gIFRoaXMgbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBvdGhlciBvYmplY3RzIGluIHRoZQotICAgYXJjaGl2ZSBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBsaW5rLCB3aGljaCBpcyBpbmNvcnJlY3Qgc2luY2UgdGhleQotICAgcHJlY2VkZSBsaWJjLnNvLjEgaW4gdGhlIGFyY2hpdmUuCi0KLSAgIEZvcnR1bmF0ZWx5LCBFTEYgYXJjaGl2ZSBoYW5kbGluZyBpcyBzaW1wbGVyIHRoYW4gdGhhdCBkb25lIGJ5Ci0gICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLCB3aGljaCBoYXMgdG8gYWxsb3cgZm9yIGEub3V0Ci0gICBvZGRpdGllcy4gIEluIEVMRiwgaWYgd2UgZmluZCBhIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBtYXAsIGFuZCB0aGUKLSAgIHN5bWJvbCBpcyBjdXJyZW50bHkgdW5kZWZpbmVkLCB3ZSBrbm93IHRoYXQgd2UgbXVzdCBwdWxsIGluIHRoYXQKLSAgIG9iamVjdCBmaWxlLgotCi0gICBVbmZvcnR1bmF0ZWx5LCB3ZSBkbyBoYXZlIHRvIG1ha2UgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIHN5bWJvbAotICAgdGFibGUgdW50aWwgbm90aGluZyBmdXJ0aGVyIGlzIHJlc29sdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN5bWluZGV4IGM7Ci0gIGJvb2xlYW4gKmRlZmluZWQgPSBOVUxMOwotICBib29sZWFuICppbmNsdWRlZCA9IE5VTEw7Ci0gIGNhcnN5bSAqc3ltZGVmczsKLSAgYm9vbGVhbiBsb29wOwotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KLSAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBzeW1ib2xzIHdlIGtub3cgdG8gYmUgYWxyZWFkeSBkZWZpbmVkLCBhbmQgYWxsCi0gICAgIGZpbGVzIHdlIGtub3cgdG8gYmUgYWxyZWFkeSBpbmNsdWRlZC4gIFRoaXMgaXMgdG8gc3BlZWQgdXAgdGhlCi0gICAgIHNlY29uZCBhbmQgc3Vic2VxdWVudCBwYXNzZXMuICAqLwotICBjID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudDsKLSAgaWYgKGMgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZGVmaW5lZCA9IChib29sZWFuICopIGJmZF9tYWxsb2MgKGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLSAgaW5jbHVkZWQgPSAoYm9vbGVhbiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChib29sZWFuKSk7Ci0gIGlmIChkZWZpbmVkID09IChib29sZWFuICopIE5VTEwgfHwgaW5jbHVkZWQgPT0gKGJvb2xlYW4gKikgTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0IChkZWZpbmVkLCAwLCBjICogc2l6ZW9mIChib29sZWFuKSk7Ci0gIG1lbXNldCAoaW5jbHVkZWQsIDAsIGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLQotICBzeW1kZWZzID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBmaWxlX3B0ciBsYXN0OwotICAgICAgc3ltaW5kZXggaTsKLSAgICAgIGNhcnN5bSAqc3ltZGVmOwotICAgICAgY2Fyc3ltICpzeW1kZWZlbmQ7Ci0KLSAgICAgIGxvb3AgPSBmYWxzZTsKLSAgICAgIGxhc3QgPSAtMTsKLQotICAgICAgc3ltZGVmID0gc3ltZGVmczsKLSAgICAgIHN5bWRlZmVuZCA9IHN5bWRlZiArIGM7Ci0gICAgICBmb3IgKGkgPSAwOyBzeW1kZWYgPCBzeW1kZWZlbmQ7IHN5bWRlZisrLCBpKyspCi0JewotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICBiZmQgKmVsZW1lbnQ7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzX3RhaWw7Ci0JICBzeW1pbmRleCBtYXJrOwotCi0JICBpZiAoZGVmaW5lZFtpXSB8fCBpbmNsdWRlZFtpXSkKLQkgICAgY29udGludWU7Ci0JICBpZiAoc3ltZGVmLT5maWxlX29mZnNldCA9PSBsYXN0KQotCSAgICB7Ci0JICAgICAgaW5jbHVkZWRbaV0gPSB0cnVlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBzeW1kZWYtPm5hbWUsCi0JCQkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqcCwgKmNvcHk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgZGVmYXVsdCB2ZXJzaW9uICh0aGUgbmFtZSBjb250YWlucyBAQCksCi0JCSBsb29rIHVwIHRoZSBzeW1ib2wgYWdhaW4gd2l0aG91dCB0aGUgdmVyc2lvbi4gIFRoZQotCQkgZWZmZWN0IGlzIHRoYXQgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIHdpdGhvdXQgdGhlCi0JCSB2ZXJzaW9uIHdpbGwgYmUgbWF0Y2hlZCBieSB0aGUgZGVmYXVsdCBzeW1ib2wgaW4gdGhlCi0JCSBhcmNoaXZlLiAgKi8KLQotCSAgICAgIHAgPSBzdHJjaHIgKHN5bWRlZi0+bmFtZSwgRUxGX1ZFUl9DSFIpOwotCSAgICAgIGlmIChwID09IE5VTEwgfHwgcFsxXSAhPSBFTEZfVkVSX0NIUikKLQkJY29udGludWU7Ci0KLQkgICAgICBjb3B5ID0gYmZkX2FsbG9jIChhYmZkLCBwIC0gc3ltZGVmLT5uYW1lICsgMSk7Ci0JICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgbWVtY3B5IChjb3B5LCBzeW1kZWYtPm5hbWUsIHAgLSBzeW1kZWYtPm5hbWUpOwotCSAgICAgIGNvcHlbcCAtIHN5bWRlZi0+bmFtZV0gPSAnXDAnOwotCi0JICAgICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGNvcHksCi0JCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcHkpOwotCSAgICB9Ci0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICB7Ci0JICAgICAgLyogV2UgY3VycmVudGx5IGhhdmUgYSBjb21tb24gc3ltYm9sLiAgVGhlIGFyY2hpdmUgbWFwIGNvbnRhaW5zCi0JCSBhIHJlZmVyZW5jZSB0byB0aGlzIHN5bWJvbCwgc28gd2UgbWF5IHdhbnQgdG8gaW5jbHVkZSBpdC4gIFdlCi0JCSBvbmx5IHdhbnQgdG8gaW5jbHVkZSBpdCBob3dldmVyLCBpZiB0aGlzIGFyY2hpdmUgZWxlbWVudAotCQkgY29udGFpbnMgYSBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wsIG5vdCBqdXN0IGFub3RoZXIgY29tbW9uCi0JCSBkZWNsYXJhdGlvbiBvZiBpdC4KLQotCQkgVW5mb3J0dW5hdGVseSBzb21lIGFyY2hpdmVycyAoaW5jbHVkaW5nIEdOVSBhcikgd2lsbCBwdXQKLQkJIGRlY2xhcmF0aW9ucyBvZiBjb21tb24gc3ltYm9scyBpbnRvIHRoZWlyIGFyY2hpdmUgbWFwcywgYXMKLQkJIHdlbGwgYXMgcmVhbCBkZWZpbml0aW9ucywgc28gd2UgY2Fubm90IGp1c3QgZ28gYnkgdGhlIGFyY2hpdmUKLQkJIG1hcCBhbG9uZS4gIEluc3RlYWQgd2UgbXVzdCByZWFkIGluIHRoZSBlbGVtZW50J3Mgc3ltYm9sCi0JCSB0YWJsZSBhbmQgY2hlY2sgdGhhdCB0byBzZWUgd2hhdCBraW5kIG9mIHN5bWJvbCBkZWZpbml0aW9uCi0JCSB0aGlzIGlzLiAgKi8KLQkgICAgICBpZiAoISBlbGZfbGlua19pc19kZWZpbmVkX2FyY2hpdmVfc3ltYm9sIChhYmZkLCBzeW1kZWYpKQotCQljb250aW51ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJZGVmaW5lZFtpXSA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogV2UgbmVlZCB0byBpbmNsdWRlIHRoaXMgYXJjaGl2ZSBtZW1iZXIuICAqLwotCi0JICBlbGVtZW50ID0gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIHN5bWRlZi0+ZmlsZV9vZmZzZXQpOwotCSAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBEb3VibGVjaGVjayB0aGF0IHdlIGhhdmUgbm90IGluY2x1ZGVkIHRoaXMgb2JqZWN0Ci0JICAgICBhbHJlYWR5LS1pdCBzaG91bGQgYmUgaW1wb3NzaWJsZSwgYnV0IHRoZXJlIG1heSBiZQotCSAgICAgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGFyY2hpdmUuICAqLwotCSAgaWYgKGVsZW1lbnQtPmFyY2hpdmVfcGFzcyAhPSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IDE7Ci0KLQkgIHVuZGVmc190YWlsID0gaW5mby0+aGFzaC0+dW5kZWZzX3RhaWw7Ci0KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgZWxlbWVudCwKLQkJCQkJCQkgc3ltZGVmLT5uYW1lKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoISBlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGVsZW1lbnQsIGluZm8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogSWYgdGhlcmUgYXJlIGFueSBuZXcgdW5kZWZpbmVkIHN5bWJvbHMsIHdlIG5lZWQgdG8gbWFrZQotCSAgICAgYW5vdGhlciBwYXNzIHRocm91Z2ggdGhlIGFyY2hpdmUgaW4gb3JkZXIgdG8gc2VlIHdoZXRoZXIKLQkgICAgIHRoZXkgY2FuIGJlIGRlZmluZWQuICBGSVhNRTogVGhpcyBpc24ndCBwZXJmZWN0LCBiZWNhdXNlCi0JICAgICBjb21tb24gc3ltYm9scyB3aW5kIHVwIG9uIHVuZGVmc190YWlsIGFuZCBiZWNhdXNlIGFuCi0JICAgICB1bmRlZmluZWQgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgbGF0ZXIgb24gaW4gdGhpcyBwYXNzCi0JICAgICBkb2VzIG5vdCByZXF1aXJlIGFub3RoZXIgcGFzcy4gIFRoaXMgaXNuJ3QgYSBidWcsIGJ1dCBpdAotCSAgICAgZG9lcyBtYWtlIHRoZSBjb2RlIGxlc3MgZWZmaWNpZW50IHRoYW4gaXQgY291bGQgYmUuICAqLwotCSAgaWYgKHVuZGVmc190YWlsICE9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsKQotCSAgICBsb29wID0gdHJ1ZTsKLQotCSAgLyogTG9vayBiYWNrd2FyZCB0byBtYXJrIGFsbCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZQotCSAgICAgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHNlZW4gaW4gdGhpcyBwYXNzLiAgKi8KLQkgIG1hcmsgPSBpOwotCSAgZG8KLQkgICAgewotCSAgICAgIGluY2x1ZGVkW21hcmtdID0gdHJ1ZTsKLQkgICAgICBpZiAobWFyayA9PSAwKQotCQlicmVhazsKLQkgICAgICAtLW1hcms7Ci0JICAgIH0KLQkgIHdoaWxlIChzeW1kZWZzW21hcmtdLmZpbGVfb2Zmc2V0ID09IHN5bWRlZi0+ZmlsZV9vZmZzZXQpOwotCi0JICAvKiBXZSBtYXJrIHN1YnNlcXVlbnQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgYXMgd2UgZ28KLQkgICAgIG9uIHRocm91Z2ggdGhlIGxvb3AuICAqLwotCSAgbGFzdCA9IHN5bWRlZi0+ZmlsZV9vZmZzZXQ7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGxvb3ApOwotCi0gIGZyZWUgKGRlZmluZWQpOwotICBmcmVlIChpbmNsdWRlZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChkZWZpbmVkICE9IChib29sZWFuICopIE5VTEwpCi0gICAgZnJlZSAoZGVmaW5lZCk7Ci0gIGlmIChpbmNsdWRlZCAhPSAoYm9vbGVhbiAqKSBOVUxMKQotICAgIGZyZWUgKGluY2x1ZGVkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHdhbnQgdG8gZGVmaW5lIGEgbmV3IHN5bWJvbC4gIEl0Ci0gICBoYW5kbGVzIHRoZSB2YXJpb3VzIGNhc2VzIHdoaWNoIGFyaXNlIHdoZW4gd2UgZmluZCBhIGRlZmluaXRpb24gaW4KLSAgIGEgZHluYW1pYyBvYmplY3QsIG9yIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIGRlZmluaXRpb24gaW4gYQotICAgZHluYW1pYyBvYmplY3QuICBUaGUgbmV3IHN5bWJvbCBpcyBkZXNjcmliZWQgYnkgTkFNRSwgU1lNLCBQU0VDLAotICAgYW5kIFBWQUxVRS4gIFdlIHNldCBTWU1fSEFTSCB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeS4gIFdlIHNldAotICAgT1ZFUlJJREUgaWYgdGhlIG9sZCBzeW1ib2wgaXMgb3ZlcnJpZGluZyBhIG5ldyBkZWZpbml0aW9uLiAgV2Ugc2V0Ci0gICBUWVBFX0NIQU5HRV9PSyBpZiBpdCBpcyBPSyBmb3IgdGhlIHR5cGUgdG8gY2hhbmdlLiAgV2Ugc2V0Ci0gICBTSVpFX0NIQU5HRV9PSyBpZiBpdCBpcyBPSyBmb3IgdGhlIHNpemUgdG8gY2hhbmdlLiAgQnkgT0sgdG8KLSAgIGNoYW5nZSwgd2UgbWVhbiB0aGF0IHdlIHNob3VsZG4ndCB3YXJuIGlmIHRoZSB0eXBlIG9yIHNpemUgZG9lcwotICAgY2hhbmdlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgcHNlYywgcHZhbHVlLCBzeW1faGFzaCwKLQkJICBvdmVycmlkZSwgdHlwZV9jaGFuZ2Vfb2ssIHNpemVfY2hhbmdlX29rKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGFzZWN0aW9uICoqcHNlYzsKLSAgICAgYmZkX3ZtYSAqcHZhbHVlOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICAgICBib29sZWFuICpvdmVycmlkZTsKLSAgICAgYm9vbGVhbiAqdHlwZV9jaGFuZ2Vfb2s7Ci0gICAgIGJvb2xlYW4gKnNpemVfY2hhbmdlX29rOwotewotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgaW50IGJpbmQ7Ci0gIGJmZCAqb2xkYmZkOwotICBib29sZWFuIG5ld2R5biwgb2xkZHluLCBvbGRkZWYsIG5ld2RlZiwgbmV3ZHluY29tbW9uLCBvbGRkeW5jb21tb247Ci0KLSAgKm92ZXJyaWRlID0gZmFsc2U7Ci0KLSAgc2VjID0gKnBzZWM7Ci0gIGJpbmQgPSBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKTsKLQotICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gIGVsc2UKLSAgICBoID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBuYW1lLCB0cnVlLCBmYWxzZSwgZmFsc2UpKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpzeW1faGFzaCA9IGg7Ci0KLSAgLyogVGhpcyBjb2RlIGlzIGZvciBjb3Bpbmcgd2l0aCBkeW5hbWljIG9iamVjdHMsIGFuZCBpcyBvbmx5IHVzZWZ1bAotICAgICBpZiB3ZSBhcmUgZG9pbmcgYW4gRUxGIGxpbmsuICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZvciBtZXJnaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgcmVhbCBzeW1ib2xzLiAgKi8KLQotICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLSAgLyogSWYgd2UganVzdCBjcmVhdGVkIHRoZSBzeW1ib2wsIG1hcmsgaXQgYXMgYmVpbmcgYW4gRUxGIHN5bWJvbC4KLSAgICAgT3RoZXIgdGhhbiB0aGF0LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLS10aGVyZSBpcyBubyBtZXJnZSBpc3N1ZQotICAgICB3aXRoIGEgbmV3bHkgZGVmaW5lZCBzeW1ib2wtLXNvIHdlIGp1c3QgcmV0dXJuLiAgKi8KLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIHsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogT0xEQkZEIGlzIGEgQkZEIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhpc3Rpbmcgc3ltYm9sLiAgKi8KLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9sZGJmZCA9IE5VTEw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIG9sZGJmZCA9IGgtPnJvb3QudS51bmRlZi5hYmZkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIG9sZGJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBvbGRiZmQgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBJbiBjYXNlcyBpbnZvbHZpbmcgd2VhayB2ZXJzaW9uZWQgc3ltYm9scywgd2UgbWF5IHdpbmQgdXAgdHJ5aW5nCi0gICAgIHRvIG1lcmdlIGEgc3ltYm9sIHdpdGggaXRzZWxmLiAgQ2F0Y2ggdGhhdCBoZXJlLCB0byBhdm9pZCB0aGUKLSAgICAgY29uZnVzaW9uIHRoYXQgcmVzdWx0cyBpZiB3ZSB0cnkgdG8gb3ZlcnJpZGUgYSBzeW1ib2wgd2l0aAotICAgICBpdHNlbGYuICBUaGUgYWRkaXRpb25hbCB0ZXN0cyBjYXRjaCBjYXNlcyBsaWtlCi0gICAgIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgd2hpY2ggYXJlIHJlZ3VsYXIgc3ltYm9scyBkZWZpbmVkIGluIGEKLSAgICAgZHluYW1pYyBvYmplY3QsIHdoaWNoIHdlIGRvIHdhbnQgdG8gaGFuZGxlIGhlcmUuICAqLwotICBpZiAoYWJmZCA9PSBvbGRiZmQKLSAgICAgICYmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwCi0JICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE5FV0RZTiBhbmQgT0xERFlOIGluZGljYXRlIHdoZXRoZXIgdGhlIG5ldyBvciBvbGQgc3ltYm9sLAotICAgICByZXNwZWN0aXZlbHksIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4gICovCi0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgbmV3ZHluID0gdHJ1ZTsKLSAgZWxzZQotICAgIG5ld2R5biA9IGZhbHNlOwotCi0gIGlmIChvbGRiZmQgIT0gTlVMTCkKLSAgICBvbGRkeW4gPSAob2xkYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqaHNlYzsKLQotICAgICAgLyogVGhpcyBjb2RlIGhhbmRsZXMgdGhlIHNwZWNpYWwgU0hOX01JUFNfe1RFWFQsREFUQX0gc2VjdGlvbgotICAgICAgICAgaW5kaWNlcyB1c2VkIGJ5IE1JUFMgRUxGLiAgKi8KLSAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgaHNlYyA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgIGhzZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaHNlYyA9PSBOVUxMKQotCW9sZGR5biA9IGZhbHNlOwotICAgICAgZWxzZQotCW9sZGR5biA9IChoc2VjLT5zeW1ib2wtPmZsYWdzICYgQlNGX0RZTkFNSUMpICE9IDA7Ci0gICAgfQotCi0gIC8qIE5FV0RFRiBhbmQgT0xEREVGIGluZGljYXRlIHdoZXRoZXIgdGhlIG5ldyBvciBvbGQgc3ltYm9sLAotICAgICByZXNwZWN0aXZlbHksIGFwcGVhciB0byBiZSBhIGRlZmluaXRpb24gcmF0aGVyIHRoYW4gcmVmZXJlbmNlLiAgKi8KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLSAgICBuZXdkZWYgPSBmYWxzZTsKLSAgZWxzZQotICAgIG5ld2RlZiA9IHRydWU7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgb2xkZGVmID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBvbGRkZWYgPSB0cnVlOwotCi0gIC8qIE5FV0RZTkNPTU1PTiBhbmQgT0xERFlOQ09NTU9OIGluZGljYXRlIHdoZXRoZXIgdGhlIG5ldyBvciBvbGQKLSAgICAgc3ltYm9sLCByZXNwZWN0aXZlbHksIGFwcGVhcnMgdG8gYmUgYSBjb21tb24gc3ltYm9sIGluIGEgZHluYW1pYwotICAgICBvYmplY3QuICBJZiBhIHN5bWJvbCBhcHBlYXJzIGluIGFuIHVuaW5pdGlhbGl6ZWQgc2VjdGlvbiwgYW5kIGlzCi0gICAgIG5vdCB3ZWFrLCBhbmQgaXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gaXQgbWF5IGJlIGEgY29tbW9uIHN5bWJvbAotICAgICB3aGljaCB3YXMgcmVzb2x2ZWQgd2hlbiB0aGUgZHluYW1pYyBvYmplY3Qgd2FzIGNyZWF0ZWQuICBXZSB3YW50Ci0gICAgIHRvIHRyZWF0IHN1Y2ggc3ltYm9scyBzcGVjaWFsbHksIGJlY2F1c2UgdGhleSByYWlzZSBzcGVjaWFsCi0gICAgIGNvbnNpZGVyYXRpb25zIHdoZW4gc2V0dGluZyB0aGUgc3ltYm9sIHNpemU6IGlmIHRoZSBzeW1ib2wKLSAgICAgYXBwZWFycyBhcyBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdCwgYW5kIHRoZSBzaXplIGluCi0gICAgIHRoZSByZWd1bGFyIG9iamVjdCBpcyBsYXJnZXIsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgdXNlIHRoZQotICAgICBsYXJnZXIgc2l6ZS4gIFRoaXMgcHJvYmxlbWF0aWMgY2FzZSBjYW4gYWx3YXlzIGJlIGF2b2lkZWQgaW4gQywKLSAgICAgYnV0IGl0IG11c3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiB1c2luZyBGb3J0cmFuIHNoYXJlZAotICAgICBsaWJyYXJpZXMuCi0KLSAgICAgTm90ZSB0aGF0IGlmIE5FV0RZTkNPTU1PTiBpcyBzZXQsIE5FV0RFRiB3aWxsIGJlIHNldCwgYW5kCi0gICAgIGxpa2V3aXNlIGZvciBPTEREWU5DT01NT04gYW5kIE9MRERFRi4KLQotICAgICBOb3RlIHRoYXQgdGhpcyB0ZXN0IGlzIGp1c3QgYSBoZXVyaXN0aWMsIGFuZCB0aGF0IGl0IGlzIHF1aXRlCi0gICAgIHBvc3NpYmxlIHRvIGhhdmUgYW4gdW5pbml0aWFsaXplZCBzeW1ib2wgaW4gYSBzaGFyZWQgb2JqZWN0IHdoaWNoCi0gICAgIGlzIHJlYWxseSBhIGRlZmluaXRpb24sIHJhdGhlciB0aGFuIGEgY29tbW9uIHN5bWJvbC4gIFRoaXMgY291bGQKLSAgICAgbGVhZCB0byBzb21lIG1pbm9yIGNvbmZ1c2lvbiB3aGVuIHRoZSBzeW1ib2wgcmVhbGx5IGlzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBzb21lIHJlZ3VsYXIgb2JqZWN0LiAgSG93ZXZlciwgSSB0aGluayBpdCB3aWxsIGJlCi0gICAgIGhhcm1sZXNzLiAgKi8KLQotICBpZiAobmV3ZHluCi0gICAgICAmJiBuZXdkZWYKLSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0gICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwCi0gICAgICAmJiBzeW0tPnN0X3NpemUgPiAwCi0gICAgICAmJiBiaW5kICE9IFNUQl9XRUFLCi0gICAgICAmJiBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfRlVOQykKLSAgICBuZXdkeW5jb21tb24gPSB0cnVlOwotICBlbHNlCi0gICAgbmV3ZHluY29tbW9uID0gZmFsc2U7Ci0KLSAgaWYgKG9sZGR5bgotICAgICAgJiYgb2xkZGVmCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwCi0gICAgICAmJiBoLT5zaXplID4gMAotICAgICAgJiYgaC0+dHlwZSAhPSBTVFRfRlVOQykKLSAgICBvbGRkeW5jb21tb24gPSB0cnVlOwotICBlbHNlCi0gICAgb2xkZHluY29tbW9uID0gZmFsc2U7Ci0KLSAgLyogSXQncyBPSyB0byBjaGFuZ2UgdGhlIHR5cGUgaWYgZWl0aGVyIHRoZSBleGlzdGluZyBzeW1ib2wgb3IgdGhlCi0gICAgIG5ldyBzeW1ib2wgaXMgd2Vhay4gICovCi0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotICAgICAgfHwgYmluZCA9PSBTVEJfV0VBSykKLSAgICAqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gIC8qIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSBzaXplIGlmIGVpdGhlciB0aGUgZXhpc3Rpbmcgc3ltYm9sIG9yIHRoZQotICAgICBuZXcgc3ltYm9sIGlzIHdlYWssIG9yIGlmIHRoZSBvbGQgc3ltYm9sIGlzIHVuZGVmaW5lZC4gICovCi0KLSAgaWYgKCp0eXBlX2NoYW5nZV9vawotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgLyogSWYgYm90aCB0aGUgb2xkIGFuZCB0aGUgbmV3IHN5bWJvbHMgbG9vayBsaWtlIGNvbW1vbiBzeW1ib2xzIGluIGEKLSAgICAgZHluYW1pYyBvYmplY3QsIHNldCB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRvIHRoZSBsYXJnZXIgb2YgdGhlCi0gICAgIHR3by4gICovCi0KLSAgaWYgKG9sZGR5bmNvbW1vbgotICAgICAgJiYgbmV3ZHluY29tbW9uCi0gICAgICAmJiBzeW0tPnN0X3NpemUgIT0gaC0+c2l6ZSkKLSAgICB7Ci0gICAgICAvKiBTaW5jZSB3ZSB0aGluayB3ZSBoYXZlIHR3byBjb21tb24gc3ltYm9scywgaXNzdWUgYSBtdWx0aXBsZQotICAgICAgICAgY29tbW9uIHdhcm5pbmcgaWYgZGVzaXJlZC4gIE5vdGUgdGhhdCB3ZSBvbmx5IHdhcm4gaWYgdGhlCi0gICAgICAgICBzaXplIGlzIGRpZmZlcmVudC4gIElmIHRoZSBzaXplIGlzIHRoZSBzYW1lLCB3ZSBzaW1wbHkgbGV0Ci0gICAgICAgICB0aGUgb2xkIHN5bWJvbCBvdmVycmlkZSB0aGUgbmV3IG9uZSBhcyBub3JtYWxseSBoYXBwZW5zIHdpdGgKLSAgICAgICAgIHN5bWJvbHMgZGVmaW5lZCBpbiBkeW5hbWljIG9iamVjdHMuICAqLwotCi0gICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBvbGRiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLAotCSAgICAgIGgtPnNpemUsIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBzeW0tPnN0X3NpemUpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzeW0tPnN0X3NpemUgPiBoLT5zaXplKQotCWgtPnNpemUgPSBzeW0tPnN0X3NpemU7Ci0KLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBsb29raW5nIGF0IGEgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSBoYXZlIGZvdW5kIGEKLSAgICAgZGVmaW5pdGlvbiwgd2UgbmVlZCB0byBzZWUgaWYgdGhlIHN5bWJvbCB3YXMgYWxyZWFkeSBkZWZpbmVkIGJ5Ci0gICAgIHNvbWUgb3RoZXIgb2JqZWN0LiAgSWYgc28sIHdlIHdhbnQgdG8gdXNlIHRoZSBleGlzdGluZwotICAgICBkZWZpbml0aW9uLCBhbmQgd2UgZG8gbm90IHdhbnQgdG8gcmVwb3J0IGEgbXVsdGlwbGUgc3ltYm9sCi0gICAgIGRlZmluaXRpb24gZXJyb3I7IHdlIGRvIHRoaXMgYnkgY2xvYmJlcmluZyAqUFNFQyB0byBiZQotICAgICBiZmRfdW5kX3NlY3Rpb25fcHRyLgotCi0gICAgIFdlIHRyZWF0IGEgY29tbW9uIHN5bWJvbCBhcyBhIGRlZmluaXRpb24gaWYgdGhlIHN5bWJvbCBpbiB0aGUKLSAgICAgc2hhcmVkIGxpYnJhcnkgaXMgYSBmdW5jdGlvbiwgc2luY2UgY29tbW9uIHN5bWJvbHMgYWx3YXlzCi0gICAgIHJlcHJlc2VudCB2YXJpYWJsZXM7IHRoaXMgY2FuIGNhdXNlIGNvbmZ1c2lvbiBpbiBwcmluY2lwbGUsIGJ1dAotICAgICBhbnkgc3VjaCBjb25mdXNpb24gd291bGQgc2VlbSB0byBpbmRpY2F0ZSBhbiBlcnJvbmVvdXMgcHJvZ3JhbSBvcgotICAgICBzaGFyZWQgbGlicmFyeS4gIFdlIGFsc28gcGVybWl0IGEgY29tbW9uIHN5bWJvbCBpbiBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0IHRvIG92ZXJyaWRlIGEgd2VhayBzeW1ib2wgaW4gYSBzaGFyZWQgb2JqZWN0LgotCi0gICAgIFdlIHByZWZlciBhIG5vbi13ZWFrIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgbGlicmFyeSB0byBhIHdlYWsKLSAgICAgZGVmaW5pdGlvbiBpbiB0aGUgZXhlY3V0YWJsZS4gICovCi0KLSAgaWYgKG5ld2R5bgotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiAob2xkZGVmCi0JICB8fCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgJiYgKGJpbmQgPT0gU1RCX1dFQUsKLQkJICB8fCBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfRlVOQykpKQotICAgICAgJiYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkgIHx8IGJpbmQgPT0gU1RCX1dFQUspKQotICAgIHsKLSAgICAgICpvdmVycmlkZSA9IHRydWU7Ci0gICAgICBuZXdkZWYgPSBmYWxzZTsKLSAgICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotCi0gICAgICAqcHNlYyA9IHNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gICAgICAvKiBJZiB3ZSBnZXQgaGVyZSB3aGVuIHRoZSBvbGQgc3ltYm9sIGlzIGEgY29tbW9uIHN5bWJvbCwgdGhlbgotICAgICAgICAgd2UgYXJlIGV4cGxpY2l0bHkgbGV0dGluZyBpdCBvdmVycmlkZSBhIHdlYWsgc3ltYm9sIG9yCi0gICAgICAgICBmdW5jdGlvbiBpbiBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byB3YXJuIGFib3V0Ci0gICAgICAgICBhIHR5cGUgY2hhbmdlLiAgSWYgdGhlIG9sZCBzeW1ib2wgaXMgYSBkZWZpbmVkIHN5bWJvbCwgYSB0eXBlCi0gICAgICAgICBjaGFuZ2Ugd2FybmluZyBtYXkgc3RpbGwgYmUgYXBwcm9wcmlhdGUuICAqLwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGFuIG9sZCBjb21tb24gc3ltYm9sIG1lcmdpbmcgd2l0aCBhCi0gICAgIG5ldyBzeW1ib2wgd2hpY2ggbG9va3MgbGlrZSBhIGNvbW1vbiBzeW1ib2wgaW4gYSBzaGFyZWQgb2JqZWN0LgotICAgICBXZSBjaGFuZ2UgKlBTRUMgYW5kICpQVkFMVUUgdG8gbWFrZSB0aGUgbmV3IHN5bWJvbCBsb29rIGxpa2UgYQotICAgICBjb21tb24gc3ltYm9sLCBhbmQgbGV0IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdpbGwgZG8KLSAgICAgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQotICBpZiAobmV3ZHluY29tbW9uCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgewotICAgICAgKm92ZXJyaWRlID0gdHJ1ZTsKLSAgICAgIG5ld2RlZiA9IGZhbHNlOwotICAgICAgbmV3ZHluY29tbW9uID0gZmFsc2U7Ci0gICAgICAqcHZhbHVlID0gc3ltLT5zdF9zaXplOwotICAgICAgKnBzZWMgPSBzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG9sZCBzeW1ib2wgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhlIG5ldyBzeW1ib2wgaXMKLSAgICAgYSBkZWZpbml0aW9uIHdoaWNoIGlzIG5vdCBmcm9tIGEgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIG5ldwotICAgICBzeW1ib2wgb3ZlcnJpZGVzIHRoZSBvbGQgc3ltYm9sLiAgU3ltYm9scyBmcm9tIHJlZ3VsYXIgZmlsZXMKLSAgICAgYWx3YXlzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHN5bWJvbHMgZnJvbSBkeW5hbWljIG9iamVjdHMsIGV2ZW4gaWYKLSAgICAgdGhleSBhcmUgZGVmaW5lZCBhZnRlciB0aGUgZHluYW1pYyBvYmplY3QgaW4gdGhlIGxpbmsuCi0KLSAgICAgQXMgYWJvdmUsIHdlIGFnYWluIHBlcm1pdCBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdCB0bwotICAgICBvdmVycmlkZSBhIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgb2JqZWN0IGlmIHRoZSBzaGFyZWQgb2JqZWN0Ci0gICAgIHN5bWJvbCBpcyBhIGZ1bmN0aW9uIG9yIGlzIHdlYWsuCi0KLSAgICAgQXMgYWJvdmUsIHdlIHBlcm1pdCBhIG5vbi13ZWFrIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgb2JqZWN0IHRvCi0gICAgIG92ZXJyaWRlIGEgd2VhayBkZWZpbml0aW9uIGluIGEgcmVndWxhciBvYmplY3QuICAqLwotCi0gIGlmICghIG5ld2R5bgotICAgICAgJiYgKG5ld2RlZgotCSAgfHwgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKQotCSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgfHwgaC0+dHlwZSA9PSBTVFRfRlVOQykpKQotICAgICAgJiYgb2xkZHluCi0gICAgICAmJiBvbGRkZWYKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGJpbmQgIT0gU1RCX1dFQUsKLQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIC8qIENoYW5nZSB0aGUgaGFzaCB0YWJsZSBlbnRyeSB0byB1bmRlZmluZWQsIGFuZCBsZXQKLQkgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgZG8gdGhlIHJpZ2h0IHRoaW5nIHdpdGggdGhlCi0JIG5ldyBkZWZpbml0aW9uLiAgKi8KLQotICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0gICAgICBoLT5yb290LnUudW5kZWYuYWJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0gICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gICAgICBvbGRkZWYgPSBmYWxzZTsKLSAgICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOwotCi0gICAgICAvKiBXZSBhZ2FpbiBwZXJtaXQgYSB0eXBlIGNoYW5nZSB3aGVuIGEgY29tbW9uIHN5bWJvbCBtYXkgYmUKLSAgICAgICAgIG92ZXJyaWRpbmcgYSBmdW5jdGlvbi4gICovCi0KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0JKnR5cGVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgLyogVGhpcyB1bmlvbiBtYXkgaGF2ZSBiZWVuIHNldCB0byBiZSBub24tTlVMTCB3aGVuIHRoaXMgc3ltYm9sCi0JIHdhcyBzZWVuIGluIGEgZHluYW1pYyBvYmplY3QuICBXZSBtdXN0IGZvcmNlIHRoZSB1bmlvbiB0byBiZQotCSBOVUxMLCBzbyB0aGF0IGl0IGlzIGNvcnJlY3QgZm9yIGEgcmVndWxhciBzeW1ib2wuICAqLwotCi0gICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSBOVUxMOwotCi0gICAgICAvKiBJbiB0aGlzIHNwZWNpYWwgY2FzZSwgaWYgSCBpcyB0aGUgdGFyZ2V0IG9mIGFuIGluZGlyZWN0aW9uLAotICAgICAgICAgd2Ugd2FudCB0aGUgY2FsbGVyIHRvIGZyb2Igd2l0aCBIIHJhdGhlciB0aGFuIHdpdGggdGhlCi0gICAgICAgICBpbmRpcmVjdCBzeW1ib2wuICBUaGF0IHdpbGwgcGVybWl0IHRoZSBjYWxsZXIgdG8gcmVkZWZpbmUgdGhlCi0gICAgICAgICB0YXJnZXQgb2YgdGhlIGluZGlyZWN0aW9uLCByYXRoZXIgdGhhbiB0aGUgaW5kaXJlY3Qgc3ltYm9sCi0gICAgICAgICBpdHNlbGYuICBGSVhNRTogVGhpcyB3aWxsIGJyZWFrIHRoZSAteSBvcHRpb24gaWYgd2Ugc3RvcmUgYQotICAgICAgICAgc3ltYm9sIHdpdGggYSBkaWZmZXJlbnQgbmFtZS4gICovCi0gICAgICAqc3ltX2hhc2ggPSBoOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIG5ldyBjb21tb24gc3ltYm9sIG1lcmdpbmcgd2l0aCBhbgotICAgICBvbGQgc3ltYm9sIHRoYXQgbG9va3MgbGlrZSBpdCBtaWdodCBiZSBhIGNvbW1vbiBzeW1ib2wgZGVmaW5lZCBpbgotICAgICBhIHNoYXJlZCBvYmplY3QuICBOb3RlIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIGNhc2UgaW4KLSAgICAgd2hpY2ggYSBuZXcgY29tbW9uIHN5bWJvbCBzaG91bGQgc2ltcGx5IG92ZXJyaWRlIHRoZSBkZWZpbml0aW9uCi0gICAgIGluIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLSAgaWYgKCEgbmV3ZHluCi0gICAgICAmJiBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKLSAgICAgICYmIG9sZGR5bmNvbW1vbikKLSAgICB7Ci0gICAgICAvKiBJdCB3b3VsZCBiZSBiZXN0IGlmIHdlIGNvdWxkIHNldCB0aGUgaGFzaCB0YWJsZSBlbnRyeSB0byBhCi0JIGNvbW1vbiBzeW1ib2wsIGJ1dCB3ZSBkb24ndCBrbm93IHdoYXQgdG8gdXNlIGZvciB0aGUgc2VjdGlvbgotCSBvciB0aGUgYWxpZ25tZW50LiAgKi8KLSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIG9sZGJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sCi0JICAgICAgaC0+c2l6ZSwgYWJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHN5bS0+c3Rfc2l6ZSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSWYgdGhlIHByZWR1bWVkIGNvbW1vbiBzeW1ib2wgaW4gdGhlIGR5bmFtaWMgb2JqZWN0IGlzCi0gICAgICAgICBsYXJnZXIsIHByZXRlbmQgdGhhdCB0aGUgbmV3IHN5bWJvbCBoYXMgaXRzIHNpemUuICAqLwotCi0gICAgICBpZiAoaC0+c2l6ZSA+ICpwdmFsdWUpCi0JKnB2YWx1ZSA9IGgtPnNpemU7Ci0KLSAgICAgIC8qIEZJWE1FOiBXZSBubyBsb25nZXIga25vdyB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGJ5IHRoZSBzeW1ib2wKLQkgaW4gdGhlIGR5bmFtaWMgb2JqZWN0LCBzbyB3ZSBqdXN0IHdpbmQgdXAgdXNpbmcgdGhlIG9uZSBmcm9tCi0JIHRoZSByZWd1bGFyIG9iamVjdC4gICovCi0KLSAgICAgIG9sZGRlZiA9IGZhbHNlOwotICAgICAgb2xkZHluY29tbW9uID0gZmFsc2U7Ci0KLSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCi0gICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgICAgKnR5cGVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSB3ZWFrIGRlZmluaXRpb24gaW4gYSByZWd1bGFyIG9iamVjdAotICAgICBmb2xsb3dlZCBieSBhIG5vbi13ZWFrIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgb2JqZWN0LiAgSW4gdGhpcwotICAgICBjYXNlLCB3ZSBwcmVmZXIgdGhlIGRlZmluaXRpb24gaW4gdGhlIHNoYXJlZCBvYmplY3QuICAqLwotICBpZiAob2xkZGVmCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICAmJiBuZXdkZWYKLSAgICAgICYmIG5ld2R5bgotICAgICAgJiYgYmluZCAhPSBTVEJfV0VBSykKLSAgICB7Ci0gICAgICAvKiBUbyBtYWtlIHRoaXMgd29yayB3ZSBoYXZlIHRvIGZyb2IgdGhlIGZsYWdzIHNvIHRoYXQgdGhlIHJlc3QKLSAgICAgICAgIG9mIHRoZSBjb2RlIGRvZXMgbm90IHRoaW5rIHdlIGFyZSB1c2luZyB0aGUgcmVndWxhcgotICAgICAgICAgZGVmaW5pdGlvbi4gICovCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKQotCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUjsKLSAgICAgIGVsc2UgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMCkKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUM7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH4gKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIKLQkJCQkgICB8IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpOwotCi0gICAgICAvKiBJZiBIIGlzIHRoZSB0YXJnZXQgb2YgYW4gaW5kaXJlY3Rpb24sIHdlIHdhbnQgdGhlIGNhbGxlciB0bwotICAgICAgICAgdXNlIEggcmF0aGVyIHRoYW4gdGhlIGluZGlyZWN0IHN5bWJvbC4gIE90aGVyd2lzZSBpZiB3ZSBhcmUKLSAgICAgICAgIGRlZmluaW5nIGEgbmV3IGluZGlyZWN0IHN5bWJvbCB3ZSB3aWxsIHdpbmQgdXAgYXR0YWNoaW5nIGl0Ci0gICAgICAgICB0byB0aGUgZW50cnkgd2UgYXJlIG92ZXJyaWRpbmcuICAqLwotICAgICAgKnN5bV9oYXNoID0gaDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkCi0gICAgIG9iamVjdCBmb2xsb3dlZCBieSBhIHdlYWsgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgSW4KLSAgICAgdGhpcyBjYXNlIHdlIHByZWZlciB0byBkZWZpbml0aW9uIGluIHRoZSBzaGFyZWQgb2JqZWN0LiAgVG8gbWFrZQotICAgICB0aGlzIHdvcmsgd2UgaGF2ZSB0byB0ZWxsIHRoZSBjYWxsZXIgdG8gbm90IHRyZWF0IHRoZSBuZXcgc3ltYm9sCi0gICAgIGFzIGEgZGVmaW5pdGlvbi4gICovCi0gIGlmIChvbGRkZWYKLSAgICAgICYmIG9sZGR5bgotICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiAhIG5ld2R5bgotICAgICAgJiYgYmluZCA9PSBTVEJfV0VBSykKLSAgICAqb3ZlcnJpZGUgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIEVMRiBvYmplY3QgZmlsZSB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuICgqYWRkX3N5bWJvbF9ob29rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwKLQkJCQkgICAgICBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci0gIGJvb2xlYW4gKCpjaGVja19yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgIGFzZWN0aW9uICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLSAgYm9vbGVhbiBjb2xsZWN0OwotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICBzaXplX3Qgc3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1jb3VudDsKLSAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgRWxmX0V4dGVybmFsX1N5bSAqYnVmID0gTlVMTDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYm9vbGVhbiBkeW5hbWljOwotICBiZmRfYnl0ZSAqZHludmVyID0gTlVMTDsKLSAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqZXh0dmVyc3ltID0gTlVMTDsKLSAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqZXZlcjsKLSAgRWxmX0V4dGVybmFsX0R5biAqZHluYnVmID0gTlVMTDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtzOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgYWRkX3N5bWJvbF9ob29rID0gYmVkLT5lbGZfYWRkX3N5bWJvbF9ob29rOwotICBjb2xsZWN0ID0gYmVkLT5jb2xsZWN0OwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIGR5bmFtaWMgPSBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGR5bmFtaWMgPSB0cnVlOwotCi0gICAgICAvKiBZb3UgY2FuJ3QgdXNlIC1yIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gIEFsc28sIHRoZXJlJ3Mgbm8KLQkgaG9wZSBvZiB1c2luZyBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoIGRvZXMgbm90IGV4YWN0bHkgbWF0Y2gKLQkgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSB8fCBpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBhbnkgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIG5hbWVkCi0gICAgIC5nbnUud2FybmluZy5TWU1CT0wgYXJlIHRyZWF0ZWQgYXMgd2FybmluZyBzeW1ib2xzIGZvciB0aGUgZ2l2ZW4KLSAgICAgc3ltYm9sLiAgVGhpcyBkaWZmZXJzIGZyb20gLmdudS53YXJuaW5nIHNlY3Rpb25zLCB3aGljaCBnZW5lcmF0ZQotICAgICB3YXJuaW5ncyB3aGVuIHRoZXkgYXJlIGluY2x1ZGVkIGluIGFuIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHMpOwotCSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251Lndhcm5pbmcuIiwgc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDEpID09IDApCi0JICAgIHsKLQkgICAgICBjaGFyICptc2c7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzejsKLQotCSAgICAgIG5hbWUgKz0gc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDE7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc2hhcmVkIG9iamVjdCwgdGhlbiBsb29rIHVwIHRoZSBzeW1ib2wKLQkJIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgaXQgaXMgdGhlcmUsIGFuZCBpdCBpcyBhbHJlYWR5Ci0JCSBiZWVuIGRlZmluZWQsIHRoZW4gd2Ugd2lsbCBub3QgYmUgdXNpbmcgdGhlIGVudHJ5Ci0JCSBmcm9tIHRoaXMgc2hhcmVkIG9iamVjdCwgc28gd2UgZG9uJ3QgbmVlZCB0byB3YXJuLgotCQkgRklYTUU6IElmIHdlIHNlZSB0aGUgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0Ci0JCSBsYXRlciBvbiwgd2Ugd2lsbCB3YXJuLCBidXQgd2Ugc2hvdWxkbid0LiAgVGhlIG9ubHkKLQkJIGZpeCBpcyB0byBrZWVwIHRyYWNrIG9mIHdoYXQgd2FybmluZ3Mgd2UgYXJlIHN1cHBvc2VkCi0JCSB0byBlbWl0LCBhbmQgdGhlbiBoYW5kbGUgdGhlbSBhbGwgYXQgdGhlIGVuZCBvZiB0aGUKLQkJIGxpbmsuICAqLwotCSAgICAgIGlmIChkeW5hbWljICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLQkJewotCQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsCi0JCQkJCSAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JCSAgLyogRklYTUU6IFdoYXQgYWJvdXQgYmZkX2xpbmtfaGFzaF9jb21tb24/ICAqLwotCQkgIGlmIChoICE9IE5VTEwKLQkJICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaXNzdWUgdGhpcyB3YXJuaW5nLiAgQ2xvYmJlcgotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZWN0aW9uIHNpemUgc28gdGhhdCB0aGUgd2FybmluZyBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCQkgICAgICBzLT5fcmF3X3NpemUgPSAwOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3ogPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzKTsKLQkgICAgICBtc2cgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHN6ICsgMSk7Ci0JICAgICAgaWYgKG1zZyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgbXNnLCAoZmlsZV9wdHIpIDAsIHN6KSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBtc2dbc3pdID0gJ1wwJzsKLQotCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBCU0ZfV0FSTklORywgcywgKGJmZF92bWEpIDAsIG1zZywKLQkJICAgICAgZmFsc2UsIGNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJewotCQkgIC8qIENsb2JiZXIgdGhlIHNlY3Rpb24gc2l6ZSBzbyB0aGF0IHRoZSB3YXJuaW5nIGRvZXMKLSAgICAgICAgICAgICAgICAgICAgIG5vdCBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkJICBzLT5fcmF3X3NpemUgPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIG9iamVjdCwgd2UgYWx3YXlzIGxpbmsgYWdhaW5zdCB0aGUgLmR5bnN5bQotICAgICBzeW1ib2wgdGFibGUsIG5vdCB0aGUgLnN5bXRhYiBzeW1ib2wgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIKLSAgICAgd2lsbCBvbmx5IHNlZSB0aGUgLmR5bnN5bSBzeW1ib2wgdGFibGUsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwotICAgICBsb29rIGF0IC5zeW10YWIgZm9yIGEgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIGlmICghIGR5bmFtaWMgfHwgZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZWxzZQotICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIC8qIFJlYWQgaW4gYW55IHZlcnNpb24gZGVmaW5pdGlvbnMuICAqLwotCi0gICAgICBpZiAoISBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFJlYWQgaW4gdGhlIHN5bWJvbCB2ZXJzaW9ucywgYnV0IGRvbid0IGJvdGhlciB0byBjb252ZXJ0IHRoZW0KLSAgICAgICAgIHRvIGludGVybmFsIGZvcm1hdC4gICovCi0gICAgICBpZiAoZWxmX2R5bnZlcnN5bSAoYWJmZCkgIT0gMCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU2hkciAqdmVyc3ltaGRyOwotCi0JICB2ZXJzeW1oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX2hkcjsKLQkgIGV4dHZlcnN5bSA9IChFbGZfRXh0ZXJuYWxfVmVyc3ltICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0JICBpZiAoZXh0dmVyc3ltID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCB2ZXJzeW1oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKChQVFIpIGV4dHZlcnN5bSwgMSwgdmVyc3ltaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICE9IHZlcnN5bWhkci0+c2hfc2l6ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBzeW10YWIgaGVhZGVyIHRlbGxzIHVzIHdoZXJlIHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzIHN0YXJ0LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbG9jYWwgc3ltYm9scyBhdAotICAgICB0aGlzIHBvaW50LiAgKi8KLSAgaWYgKGVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICB7Ci0gICAgICBleHRzeW1jb3VudCA9IHN5bWNvdW50OwotICAgICAgZXh0c3ltb2ZmID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRzeW1jb3VudCA9IHN5bWNvdW50IC0gaGRyLT5zaF9pbmZvOwotICAgICAgZXh0c3ltb2ZmID0gaGRyLT5zaF9pbmZvOwotICAgIH0KLQotICBidWYgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkgYmZkX21hbGxvYyAoZXh0c3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGlmIChidWYgPT0gTlVMTCAmJiBleHRzeW1jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeSBmb3IgZWFjaCBleHRlcm5hbAotICAgICBzeW1ib2wuICAqLwotICBzeW1faGFzaCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIGV4dHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotICBpZiAoc3ltX2hhc2ggPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgZWxmX3N5bV9oYXNoZXMgKGFiZmQpID0gc3ltX2hhc2g7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgY3JlYXRlIGFsbCB0aGUgZHluYW1pYwotICAgICAgICAgc2VjdGlvbnMgaW1tZWRpYXRlbHkuICBXZSBuZWVkIHRvIGF0dGFjaCB0aGVtIHRvIHNvbWV0aGluZywKLSAgICAgICAgIHNvIHdlIGF0dGFjaCB0aGVtIHRvIHRoaXMgQkZELCBwcm92aWRlZCBpdCBpcyB0aGUgcmlnaHQKLSAgICAgICAgIGZvcm1hdC4gIEZJWE1FOiBJZiB0aGVyZSBhcmUgbm8gaW5wdXQgQkZEJ3Mgb2YgdGhlIHNhbWUKLSAgICAgICAgIGZvcm1hdCBhcyB0aGUgb3V0cHV0LCB3ZSBjYW4ndCBtYWtlIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotCXsKLQkgIGlmICghIGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgYm9vbGVhbiBhZGRfbmVlZGVkOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJmZF9zaXplX3R5cGUgb2xkc2l6ZTsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3RyaW5kZXg7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIG5hbWUgdG8gdXNlIGluIGEgRFRfTkVFREVEIGVudHJ5IHRoYXQgcmVmZXJzIHRvIHRoaXMKLQkgb2JqZWN0LiAgSWYgdGhlIG9iamVjdCBoYXMgYSBEVF9TT05BTUUgZW50cnksIHdlIHVzZSBpdC4KLQkgT3RoZXJ3aXNlLCBpZiB0aGUgZ2VuZXJpYyBsaW5rZXIgc3R1Y2sgc29tZXRoaW5nIGluCi0JIGVsZl9kdF9uYW1lLCB3ZSB1c2UgdGhhdC4gIE90aGVyd2lzZSwgd2UganVzdCB1c2UgdGhlIGZpbGUKLQkgbmFtZS4gIElmIHRoZSBnZW5lcmljIGxpbmtlciBwdXQgYSBudWxsIHN0cmluZyBpbnRvCi0JIGVsZl9kdF9uYW1lLCB3ZSBkb24ndCBtYWtlIGEgRFRfTkVFREVEIGVudHJ5IGF0IGFsbCwgZXZlbiBpZgotCSB0aGVyZSBpcyBhIERUX1NPTkFNRSBlbnRyeS4gICovCi0gICAgICBhZGRfbmVlZGVkID0gdHJ1ZTsKLSAgICAgIG5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICAgIGlmIChlbGZfZHRfbmFtZSAoYWJmZCkgIT0gTlVMTCkKLQl7Ci0JICBuYW1lID0gZWxmX2R0X25hbWUgKGFiZmQpOwotCSAgaWYgKCpuYW1lID09ICdcMCcpCi0JICAgIGFkZF9uZWVkZWQgPSBmYWxzZTsKLQl9Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfRHluICpleHRkeW47Ci0JICBFbGZfRXh0ZXJuYWxfRHluICpleHRkeW5lbmQ7Ci0JICBpbnQgZWxmc2VjOwotCSAgdW5zaWduZWQgbG9uZyBsaW5rOwotCi0JICBkeW5idWYgPSAoRWxmX0V4dGVybmFsX0R5biAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotCSAgaWYgKGR5bmJ1ZiA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCAoUFRSKSBkeW5idWYsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBzLT5fcmF3X3NpemUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgZWxmc2VjID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzKTsKLQkgIGlmIChlbGZzZWMgPT0gLTEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbGluayA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbZWxmc2VjXS0+c2hfbGluazsKLQotCSAgewotCSAgICAvKiBUaGUgc2hhcmVkIGxpYnJhcmllcyBkaXN0cmlidXRlZCB3aXRoIGhwdXgxMSBoYXZlIGEgYm9ndXMKLQkgICAgICAgc2hfbGluayBmaWVsZCBmb3IgdGhlICIuZHluYW1pYyIgc2VjdGlvbi4gIFRoaXMgY29kZSBkZXRlY3RzCi0JICAgICAgIHdoZW4gTElOSyByZWZlcnMgdG8gYSBzZWN0aW9uIHRoYXQgaXMgbm90IGEgc3RyaW5nIHRhYmxlIGFuZAotCSAgICAgICB0cmllcyB0byBmaW5kIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoZSAiLmR5bnN5bSIgc2VjdGlvbgotCSAgICAgICBpbnN0ZWFkLiAgKi8KLQkgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbbGlua107Ci0JICAgIGlmIChoZHItPnNoX3R5cGUgIT0gU0hUX1NUUlRBQikKLQkgICAgICB7Ci0JCWFzZWN0aW9uICpzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0JCWludCBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotCQlpZiAoZWxmc2VjID09IC0xKQotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQlsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOwotCSAgICAgIH0KLQkgIH0KLQotCSAgZXh0ZHluID0gZHluYnVmOwotCSAgZXh0ZHluZW5kID0gZXh0ZHluICsgcy0+X3Jhd19zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRHluKTsKLQkgIGZvciAoOyBleHRkeW4gPCBleHRkeW5lbmQ7IGV4dGR5bisrKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0KLQkgICAgICBlbGZfc3dhcF9keW5faW4gKGFiZmQsIGV4dGR5biwgJmR5bik7Ci0JICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9TT05BTUUpCi0JCXsKLQkJICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCQkgIGR5bi5kX3VuLmRfdmFsKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBpZiAoZHluLmRfdGFnID09IERUX05FRURFRCkKLQkJewotCQkgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbiwgKipwbjsKLQkJICBjaGFyICpmbm0sICphbm07Ci0KLQkJICBuID0gKChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKikKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QpKSk7Ci0JCSAgZm5tID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCQkgZHluLmRfdW4uZF92YWwpOwotCQkgIGlmIChuID09IE5VTEwgfHwgZm5tID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBhbm0gPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoZm5tKSArIDEpOwotCQkgIGlmIChhbm0gPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cmNweSAoYW5tLCBmbm0pOwotCQkgIG4tPm5hbWUgPSBhbm07Ci0JCSAgbi0+YnkgPSBhYmZkOwotCQkgIG4tPm5leHQgPSBOVUxMOwotCQkgIGZvciAocG4gPSAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci0JCSAgICAgICAqcG4gIT0gTlVMTDsKLQkJICAgICAgIHBuID0gJigqcG4pLT5uZXh0KQotCQkgICAgOwotCQkgICpwbiA9IG47Ci0JCX0KLQkgICAgfQotCi0JICBmcmVlIChkeW5idWYpOwotCSAgZHluYnVmID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgYW55IG9mIHRoZSBzZWN0aW9ucyBpbiBhIGR5bmFtaWMKLQkgb2JqZWN0IGluIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGhhY2sgYnkgc2ltcGx5IGNsb2JiZXJpbmcgdGhlCi0JIGxpc3Qgb2Ygc2VjdGlvbnMgaW4gdGhlIEJGRC4gIFRoaXMgY291bGQgYmUgaGFuZGxlZCBtb3JlCi0JIGNsZWFubHkgYnksIHNheSwgYSBuZXcgc2VjdGlvbiBmbGFnOyB0aGUgZXhpc3RpbmcKLQkgU0VDX05FVkVSX0xPQUQgZmxhZyBpcyBub3QgdGhlIG9uZSB3ZSB3YW50LCBiZWNhdXNlIHRoYXQgb25lCi0JIHN0aWxsIGltcGxpZXMgdGhhdCB0aGUgc2VjdGlvbiB0YWtlcyB1cCBzcGFjZSBpbiB0aGUgb3V0cHV0Ci0JIGZpbGUuICAqLwotICAgICAgYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotICAgICAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDA7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIHRoZSBsaW5rLCBjcmVhdGUKLQkgdGhlIHNwZWNpYWwgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgbGlua2luZy4gICovCi0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQl7Ci0JICBpZiAoISBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGFkZF9uZWVkZWQpCi0JewotCSAgLyogQWRkIGEgRFRfTkVFREVEIGVudHJ5IGZvciB0aGlzIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQkgIG9sZHNpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7Ci0JICBzdHJpbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsIG5hbWUsCi0JCQkJCSB0cnVlLCBmYWxzZSk7Ci0JICBpZiAoc3RyaW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKG9sZHNpemUgPT0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNkeW47Ci0JICAgICAgRWxmX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0JICAgICAgLyogVGhlIGhhc2ggdGFibGUgc2l6ZSBkaWQgbm90IGNoYW5nZSwgd2hpY2ggbWVhbnMgdGhhdAotCQkgdGhlIGR5bmFtaWMgb2JqZWN0IG5hbWUgd2FzIGFscmVhZHkgZW50ZXJlZC4gIElmIHdlCi0JCSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgdGhpcyBkeW5hbWljIG9iamVjdCBpbiB0aGUKLQkJIGxpbmssIGp1c3QgaWdub3JlIGl0LiAgVGhlcmUgaXMgbm8gcmVhc29uIHRvIGluY2x1ZGUKLQkJIGEgcGFydGljdWxhciBkeW5hbWljIG9iamVjdCBtb3JlIHRoYW4gb25jZS4gICovCi0JICAgICAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICAgICAgIi5keW5hbWljIik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLQotCSAgICAgIGR5bmNvbiA9IChFbGZfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotCSAgICAgIGR5bmNvbmVuZCA9IChFbGZfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArCi0JCQkJCQlzZHluLT5fcmF3X3NpemUpOwotCSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0KLQkJICBlbGZfc3dhcF9keW5faW4gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCBkeW5jb24sCi0JCQkJICAgJmR5bik7Ci0JCSAgaWYgKGR5bi5kX3RhZyA9PSBEVF9ORUVERUQKLQkJICAgICAgJiYgZHluLmRfdW4uZF92YWwgPT0gc3RyaW5kZXgpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChidWYgIT0gTlVMTCkKLQkJCWZyZWUgKGJ1Zik7Ci0JCSAgICAgIGlmIChleHR2ZXJzeW0gIT0gTlVMTCkKLQkJCWZyZWUgKGV4dHZlcnN5bSk7Ci0JCSAgICAgIHJldHVybiB0cnVlOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ORUVERUQsIHN0cmluZGV4KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBTYXZlIHRoZSBTT05BTUUsIGlmIHRoZXJlIGlzIG9uZSwgYmVjYXVzZSBzb21ldGltZXMgdGhlCi0gICAgICAgICBsaW5rZXIgZW11bGF0aW9uIGNvZGUgd2lsbCBuZWVkIHRvIGtub3cgaXQuICAqLwotICAgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgZWxmX2R0X25hbWUgKGFiZmQpID0gbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQloZHItPnNoX29mZnNldCArIGV4dHN5bW9mZiAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKChQVFIpIGJ1Ziwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgZXh0c3ltY291bnQsIGFiZmQpCi0JICAhPSBleHRzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdlYWtzID0gTlVMTDsKLQotICBldmVyID0gZXh0dmVyc3ltICE9IE5VTEwgPyBleHR2ZXJzeW0gKyBleHRzeW1vZmYgOiBOVUxMOwotICBlc3ltZW5kID0gYnVmICsgZXh0c3ltY291bnQ7Ci0gIGZvciAoZXN5bSA9IGJ1ZjsKLSAgICAgICBlc3ltIDwgZXN5bWVuZDsKLSAgICAgICBlc3ltKyssIHN5bV9oYXNoKyssIGV2ZXIgPSAoZXZlciAhPSBOVUxMID8gZXZlciArIDEgOiBOVUxMKSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBiaW5kOwotICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgICAgIGJvb2xlYW4gc2l6ZV9jaGFuZ2Vfb2ssIHR5cGVfY2hhbmdlX29rOwotICAgICAgYm9vbGVhbiBuZXdfd2Vha2RlZjsKLSAgICAgIHVuc2lnbmVkIGludCBvbGRfYWxpZ25tZW50OwotCi0gICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZzeW0pOwotCi0gICAgICBmbGFncyA9IEJTRl9OT19GTEFHUzsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICB2YWx1ZSA9IHN5bS5zdF92YWx1ZTsKLSAgICAgICpzeW1faGFzaCA9IE5VTEw7Ci0KLSAgICAgIGJpbmQgPSBFTEZfU1RfQklORCAoc3ltLnN0X2luZm8pOwotICAgICAgaWYgKGJpbmQgPT0gU1RCX0xPQ0FMKQotCXsKLQkgIC8qIFRoaXMgc2hvdWxkIGJlIGltcG9zc2libGUsIHNpbmNlIEVMRiByZXF1aXJlcyB0aGF0IGFsbAotCSAgICAgZ2xvYmFsIHN5bWJvbHMgZm9sbG93IGFsbCBsb2NhbCBzeW1ib2xzLCBhbmQgdGhhdCBzaF9pbmZvCi0JICAgICBwb2ludCB0byB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gIFVuZm9ydHVuYXRlYWx5LCBJcml4IDUKLQkgICAgIHNjcmV3cyB0aGlzIHVwLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGJpbmQgPT0gU1RCX0dMT0JBTCkKLQl7Ci0JICBpZiAoc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRgotCSAgICAgICYmIHN5bS5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKQotCSAgICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBlbHNlCi0JICAgIGZsYWdzID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChiaW5kID09IFNUQl9XRUFLKQotCWZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBlbHNlCi0JewotCSAgLyogTGVhdmUgaXQgdXAgdG8gdGhlIHByb2Nlc3NvciBiYWNrZW5kLiAgKi8KLQl9Ci0KLSAgICAgIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmIChzeW0uc3Rfc2huZHggPiAwICYmIHN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JewotCSAgc2VjID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLnN0X3NobmR4KTsKLQkgIGlmIChzZWMgPT0gTlVMTCkKLQkgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgIT0gMCkKLQkgICAgdmFsdWUgLT0gc2VjLT52bWE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0Jc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCXsKLQkgIHNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAvKiBXaGF0IEVMRiBjYWxscyB0aGUgc2l6ZSB3ZSBjYWxsIHRoZSB2YWx1ZS4gIFdoYXQgRUxGCi0JICAgICBjYWxscyB0aGUgdmFsdWUgd2UgY2FsbCB0aGUgYWxpZ25tZW50LiAgKi8KLQkgIHZhbHVlID0gc3ltLnN0X3NpemU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIExlYXZlIGl0IHVwIHRvIHRoZSBwcm9jZXNzb3IgYmFja2VuZC4gICovCi0JfQotCi0gICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLCBzeW0uc3RfbmFtZSk7Ci0gICAgICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYWRkX3N5bWJvbF9ob29rKQotCXsKLQkgIGlmICghICgqYWRkX3N5bWJvbF9ob29rKSAoYWJmZCwgaW5mbywgJnN5bSwgJm5hbWUsICZmbGFncywgJnNlYywKLQkJCQkgICAgJnZhbHVlKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFRoZSBob29rIGZ1bmN0aW9uIHNldHMgdGhlIG5hbWUgdG8gTlVMTCBpZiB0aGlzIHN5bWJvbAotCSAgICAgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHNvbWUgcmVhc29uLiAgKi8KLQkgIGlmIChuYW1lID09IChjb25zdCBjaGFyICopIE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogU2FuaXR5IGNoZWNrIHRoYXQgYWxsIHBvc3NpYmlsaXRpZXMgd2VyZSBoYW5kbGVkLiAgKi8KLSAgICAgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQlkZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICBlbHNlCi0JZGVmaW5pdGlvbiA9IHRydWU7Ci0KLSAgICAgIHNpemVfY2hhbmdlX29rID0gZmFsc2U7Ci0gICAgICB0eXBlX2NoYW5nZV9vayA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+dHlwZV9jaGFuZ2Vfb2s7Ci0gICAgICBvbGRfYWxpZ25tZW50ID0gMDsKLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgRWxmX0ludGVybmFsX1ZlcnN5bSBpdmVyOwotCSAgdW5zaWduZWQgaW50IHZlcm51bSA9IDA7Ci0JICBib29sZWFuIG92ZXJyaWRlOwotCi0JICBpZiAoZXZlciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4gKGFiZmQsIGV2ZXIsICZpdmVyKTsKLQkgICAgICB2ZXJudW0gPSBpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fVkVSU0lPTjsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBoaWRkZW4gc3ltYm9sLCBvciBpZiBpdCBpcyBub3QgdmVyc2lvbgotICAgICAgICAgICAgICAgICAxLCB3ZSBhcHBlbmQgdGhlIHZlcnNpb24gbmFtZSB0byB0aGUgc3ltYm9sIG5hbWUuCi0gICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHdlIGRvIG5vdCBtb2RpZnkgYSBub24taGlkZGVuIGFic29sdXRlCi0gICAgICAgICAgICAgICAgIHN5bWJvbCwgYmVjYXVzZSBpdCBtaWdodCBiZSB0aGUgdmVyc2lvbiBzeW1ib2wKLSAgICAgICAgICAgICAgICAgaXRzZWxmLiAgRklYTUU6IFdoYXQgaWYgaXQgaXNuJ3Q/ICAqLwotCSAgICAgIGlmICgoaXZlci52c192ZXJzICYgVkVSU1lNX0hJRERFTikgIT0gMAotCQkgIHx8ICh2ZXJudW0gPiAxICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKSkKLQkJewotCQkgIGNvbnN0IGNoYXIgKnZlcnN0cjsKLQkJICBpbnQgbmFtZWxlbiwgbmV3bGVuOwotCQkgIGNoYXIgKm5ld25hbWUsICpwOwotCi0JCSAgaWYgKHN5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYpCi0JCSAgICB7Ci0JCSAgICAgIGlmICh2ZXJudW0gPiBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyLnNoX2luZm8pCi0JCQl7Ci0JCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAgIChfKCIlczogJXM6IGludmFsaWQgdmVyc2lvbiAldSAobWF4ICVkKSIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSwgdmVybnVtLAotCQkJICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyLnNoX2luZm8pOwotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHZlcm51bSA+IDEpCi0JCQl2ZXJzdHIgPQotCQkJICBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWZbdmVybnVtIC0gMV0udmRfbm9kZW5hbWU7Ci0JCSAgICAgIGVsc2UKLQkJCXZlcnN0ciA9ICIiOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgY2Fubm90IHNpbXBseSB0ZXN0IGZvciB0aGUgbnVtYmVyIG9mCi0JCQkgZW50cmllcyBpbiB0aGUgVkVSTkVFRCBzZWN0aW9uIHNpbmNlIHRoZQotCQkJIG51bWJlcnMgZm9yIHRoZSBuZWVkZWQgdmVyc2lvbnMgZG8gbm90IHN0YXJ0Ci0JCQkgYXQgMC4gICovCi0JCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OwotCi0JCSAgICAgIHZlcnN0ciA9IE5VTEw7Ci0JCSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsKLQkJCSAgIHQgIT0gTlVMTDsKLQkJCSAgIHQgPSB0LT52bl9uZXh0cmVmKQotCQkJewotCQkJICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCQkJICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChhLT52bmFfb3RoZXIgPT0gdmVybnVtKQotCQkJCXsKLQkJCQkgIHZlcnN0ciA9IGEtPnZuYV9ub2RlbmFtZTsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkgIGlmIChhICE9IE5VTEwpCi0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGlmICh2ZXJzdHIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiAlczogaW52YWxpZCBuZWVkZWQgdmVyc2lvbiAlZCIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSwgdmVybnVtKTsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCQkgICAgfQotCi0JCSAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0JCSAgbmV3bGVuID0gbmFtZWxlbiArIHN0cmxlbiAodmVyc3RyKSArIDI7Ci0JCSAgaWYgKChpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fSElEREVOKSA9PSAwKQotCQkgICAgKytuZXdsZW47Ci0KLQkJICBuZXduYW1lID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBuZXdsZW4pOwotCQkgIGlmIChuZXduYW1lID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCQkgIHAgPSBuZXduYW1lICsgbmFtZWxlbjsKLQkJICAqcCsrID0gRUxGX1ZFUl9DSFI7Ci0JCSAgLyogSWYgdGhpcyBpcyBhIGRlZmluZWQgbm9uLWhpZGRlbiB2ZXJzaW9uIHN5bWJvbCwKLQkJICAgICB3ZSBhZGQgYW5vdGhlciBAIHRvIHRoZSBuYW1lLiAgVGhpcyBpbmRpY2F0ZXMgdGhlCi0JCSAgICAgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICAqLwotCQkgIGlmICgoaXZlci52c192ZXJzICYgVkVSU1lNX0hJRERFTikgPT0gMAotCQkgICAgICAmJiBzeW0uc3Rfc2huZHggIT0gU0hOX1VOREVGKQotCQkgICAgKnArKyA9IEVMRl9WRVJfQ0hSOwotCQkgIHN0cmNweSAocCwgdmVyc3RyKTsKLQotCQkgIG5hbWUgPSBuZXduYW1lOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgbmFtZSwgJnN5bSwgJnNlYywgJnZhbHVlLAotCQkJCSAgc3ltX2hhc2gsICZvdmVycmlkZSwgJnR5cGVfY2hhbmdlX29rLAotCQkJCSAgJnNpemVfY2hhbmdlX29rKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvdmVycmlkZSkKLQkgICAgZGVmaW5pdGlvbiA9IGZhbHNlOwotCi0JICBoID0gKnN5bV9oYXNoOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLQkgIC8qIFJlbWVtYmVyIHRoZSBvbGQgYWxpZ25tZW50IGlmIHRoaXMgaXMgYSBjb21tb24gc3ltYm9sLCBzbwotICAgICAgICAgICAgIHRoYXQgd2UgZG9uJ3QgcmVkdWNlIHRoZSBhbGlnbm1lbnQgbGF0ZXIgb24uICBXZSBjYW4ndAotICAgICAgICAgICAgIGNoZWNrIGxhdGVyLCBiZWNhdXNlIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gICAgICAgICAgICAgd2lsbCBzZXQgYSBkZWZhdWx0IGZvciB0aGUgYWxpZ25tZW50IHdoaWNoIHdlIHdhbnQgdG8KLSAgICAgICAgICAgICBvdmVycmlkZS4gICovCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICBvbGRfYWxpZ25tZW50ID0gaC0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmICE9IE5VTEwKLQkgICAgICAmJiAhIG92ZXJyaWRlCi0JICAgICAgJiYgdmVybnVtID4gMQotCSAgICAgICYmIGRlZmluaXRpb24pCi0JICAgIGgtPnZlcmluZm8udmVyZGVmID0gJmVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZlt2ZXJudW0gLSAxXTsKLQl9Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWMsIHZhbHVlLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCSAgICAgIGZhbHNlLCBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGggPSAqc3ltX2hhc2g7Ci0gICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotICAgICAgKnN5bV9oYXNoID0gaDsKLQotICAgICAgbmV3X3dlYWtkZWYgPSBmYWxzZTsKLSAgICAgIGlmIChkeW5hbWljCi0JICAmJiBkZWZpbml0aW9uCi0JICAmJiAoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCSAgJiYgRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSAhPSBTVFRfRlVOQwotCSAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JICAmJiBoLT53ZWFrZGVmID09IE5VTEwpCi0JewotCSAgLyogS2VlcCBhIGxpc3Qgb2YgYWxsIHdlYWsgZGVmaW5lZCBub24gZnVuY3Rpb24gc3ltYm9scyBmcm9tCi0JICAgICBhIGR5bmFtaWMgb2JqZWN0LCB1c2luZyB0aGUgd2Vha2RlZiBmaWVsZC4gIExhdGVyIGluIHRoaXMKLQkgICAgIGZ1bmN0aW9uIHdlIHdpbGwgc2V0IHRoZSB3ZWFrZGVmIGZpZWxkIHRvIHRoZSBjb3JyZWN0Ci0JICAgICB2YWx1ZS4gIFdlIG9ubHkgcHV0IG5vbi1mdW5jdGlvbiBzeW1ib2xzIGZyb20gZHluYW1pYwotCSAgICAgb2JqZWN0cyBvbiB0aGlzIGxpc3QsIGJlY2F1c2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRoZSBvbmx5Ci0JICAgICB0aW1lIHdlIG5lZWQgdG8ga25vdyB0aGUgbm9ybWFsIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIGEKLQkgICAgIHdlYWsgc3ltYm9sLCBhbmQgdGhlIGluZm9ybWF0aW9uIGlzIHRpbWUgY29uc3VtaW5nIHRvCi0JICAgICBmaWd1cmUgb3V0LiAgSWYgdGhlIHdlYWtkZWYgZmllbGQgaXMgbm90IGFscmVhZHkgTlVMTCwKLQkgICAgIHRoZW4gdGhpcyBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZCBieSBzb21lIHByZXZpb3VzCi0JICAgICBkeW5hbWljIG9iamVjdCwgYW5kIHdlIHdpbGwgYmUgdXNpbmcgdGhhdCBwcmV2aW91cwotCSAgICAgZGVmaW5pdGlvbiBhbnlob3cuICAqLwotCi0JICBoLT53ZWFrZGVmID0gd2Vha3M7Ci0JICB3ZWFrcyA9IGg7Ci0JICBuZXdfd2Vha2RlZiA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wuICAqLwotICAgICAgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OCi0JICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgdW5zaWduZWQgaW50IGFsaWduOwotCi0JICBhbGlnbiA9IGJmZF9sb2cyIChzeW0uc3RfdmFsdWUpOwotCSAgaWYgKGFsaWduID4gb2xkX2FsaWdubWVudCkKLQkgICAgaC0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ247Ci0JfQotCi0gICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGludCBvbGRfZmxhZ3M7Ci0JICBib29sZWFuIGR5bnN5bTsKLQkgIGludCBuZXdfZmxhZzsKLQotCSAgLyogUmVtZW1iZXIgdGhlIHN5bWJvbCBzaXplIGFuZCB0eXBlLiAgKi8KLQkgIGlmIChzeW0uc3Rfc2l6ZSAhPSAwCi0JICAgICAgJiYgKGRlZmluaXRpb24gfHwgaC0+c2l6ZSA9PSAwKSkKLQkgICAgewotCSAgICAgIGlmIChoLT5zaXplICE9IDAgJiYgaC0+c2l6ZSAhPSBzeW0uc3Rfc2l6ZSAmJiAhIHNpemVfY2hhbmdlX29rKQotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiV2FybmluZzogc2l6ZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWx1IHRvICVsdSBpbiAlcyIpLAotCQkgICBuYW1lLCAodW5zaWduZWQgbG9uZykgaC0+c2l6ZSwgKHVuc2lnbmVkIGxvbmcpIHN5bS5zdF9zaXplLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLQkgICAgICBoLT5zaXplID0gc3ltLnN0X3NpemU7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4gd2UgYWx3YXlzIHdhbnQgSC0+U0laRQotICAgICAgICAgICAgIHRvIGJlIHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgVGhlIGNvZGUganVzdCBhYm92ZQotICAgICAgICAgICAgIHdvbid0IGZpeCB0aGUgc2l6ZSBpZiBhIGNvbW1vbiBzeW1ib2wgYmVjb21lcyBsYXJnZXIuICBXZQotICAgICAgICAgICAgIGRvbid0IHdhcm4gYWJvdXQgYSBzaXplIGNoYW5nZSBoZXJlLCBiZWNhdXNlIHRoYXQgaXMKLSAgICAgICAgICAgICBjb3ZlcmVkIGJ5IC0td2Fybi1jb21tb24uICAqLwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgaC0+c2l6ZSA9IGgtPnJvb3QudS5jLnNpemU7Ci0KLQkgIGlmIChFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pICE9IFNUVF9OT1RZUEUKLQkgICAgICAmJiAoZGVmaW5pdGlvbiB8fCBoLT50eXBlID09IFNUVF9OT1RZUEUpKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnR5cGUgIT0gU1RUX05PVFlQRQotCQkgICYmIGgtPnR5cGUgIT0gRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKQotCQkgICYmICEgdHlwZV9jaGFuZ2Vfb2spCi0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIpLAotCQkgICBuYW1lLCBoLT50eXBlLCBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLQkgICAgICBoLT50eXBlID0gRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKTsKLQkgICAgfQotCi0JICAvKiBJZiBzdF9vdGhlciBoYXMgYSBwcm9jZXNzb3Itc3BlY2lmaWMgbWVhbmluZywgc3BlY2lmaWMgY29kZQotCSAgICAgbWlnaHQgYmUgbmVlZGVkIGhlcmUuICAqLwotCSAgaWYgKHN5bS5zdF9vdGhlciAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogQ29tYmluZSB2aXNpYmlsaXRpZXMsIHVzaW5nIHRoZSBtb3N0IGNvbnN0cmFpbmluZyBvbmUuICAqLwotCSAgICAgIHVuc2lnbmVkIGNoYXIgaHZpcyAgID0gRUxGX1NUX1ZJU0lCSUxJVFkgKGgtPm90aGVyKTsKLQkgICAgICB1bnNpZ25lZCBjaGFyIHN5bXZpcyA9IEVMRl9TVF9WSVNJQklMSVRZIChzeW0uc3Rfb3RoZXIpOwotCSAgICAgIAotCSAgICAgIGlmIChzeW12aXMgJiYgKGh2aXMgPiBzeW12aXMgfHwgaHZpcyA9PSAwKSkKLQkJaC0+b3RoZXIgPSBzeW0uc3Rfb3RoZXI7Ci0JICAgICAgCi0JICAgICAgLyogSWYgbmVpdGhlciBoYXMgdmlzaWJpbGl0eSwgdXNlIHRoZSBzdF9vdGhlciBvZiB0aGUKLQkgICAgICAgICBkZWZpbml0aW9uLiAgVGhpcyBpcyBhbiBhcmJpdHJhcnkgY2hvaWNlLCBzaW5jZSB0aGUKLQkgICAgICAgICBvdGhlciBiaXRzIGhhdmUgbm8gZ2VuZXJhbCBtZWFuaW5nLiAgKi8KLQkgICAgICBpZiAoIXN5bXZpcyAmJiAhaHZpcwotCQkgICYmIChkZWZpbml0aW9uIHx8IGgtPm90aGVyID09IDApKQotCQloLT5vdGhlciA9IHN5bS5zdF9vdGhlcjsKLQkgICAgfQotCi0JICAvKiBTZXQgYSBmbGFnIGluIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGluZGljYXRpbmcgdGhlIHR5cGUgb2YKLQkgICAgIHJlZmVyZW5jZSBvciBkZWZpbml0aW9uIHdlIGp1c3QgZm91bmQuICBLZWVwIGEgY291bnQgb2YKLQkgICAgIHRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzIHdlIGZpbmQuICBBIGR5bmFtaWMgc3ltYm9sCi0JICAgICBpcyBvbmUgd2hpY2ggaXMgcmVmZXJlbmNlZCBvciBkZWZpbmVkIGJ5IGJvdGggYSByZWd1bGFyCi0JICAgICBvYmplY3QgYW5kIGEgc2hhcmVkIG9iamVjdC4gICovCi0JICBvbGRfZmxhZ3MgPSBoLT5lbGZfbGlua19oYXNoX2ZsYWdzOwotCSAgZHluc3ltID0gZmFsc2U7Ci0JICBpZiAoISBkeW5hbWljKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVmaW5pdGlvbikKLQkJewotCQkgIG5ld19mbGFnID0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUjsKLQkJICBpZiAoYmluZCAhPSBTVEJfV0VBSykKLQkJICAgIG5ld19mbGFnIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSzsKLQkJfQotCSAgICAgIGVsc2UKLQkJbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkJICB8fCAob2xkX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMKLQkJCQkgICB8IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpKSAhPSAwKQotCQlkeW5zeW0gPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWZpbml0aW9uKQotCQluZXdfZmxhZyA9IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUM7Ci0JICAgICAgZWxzZQotCQluZXdfZmxhZyA9IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUM7Ci0JICAgICAgaWYgKChvbGRfZmxhZ3MgJiAoRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUgotCQkJCXwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpICE9IDAKLQkJICB8fCAoaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgICAgICYmICEgbmV3X3dlYWtkZWYKLQkJICAgICAgJiYgaC0+d2Vha2RlZi0+ZHluaW5keCAhPSAtMSkpCi0JCWR5bnN5bSA9IHRydWU7Ci0JICAgIH0KLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBuZXdfZmxhZzsKLQotCSAgLyogSWYgdGhpcyBzeW1ib2wgaGFzIGEgdmVyc2lvbiwgYW5kIGl0IGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgdmVyc2lvbiwgd2UgY3JlYXRlIGFuIGluZGlyZWN0IHN5bWJvbCBmcm9tIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgbmFtZSB0byB0aGUgZnVsbHkgZGVjb3JhdGVkIG5hbWUuICBUaGlzIHdpbGwgY2F1c2UKLSAgICAgICAgICAgICBleHRlcm5hbCByZWZlcmVuY2VzIHdoaWNoIGRvIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiB0byBiZQotICAgICAgICAgICAgIGJvdW5kIHRvIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3ltYm9sLiAgKi8KLQkgIGlmIChkZWZpbml0aW9uKQotCSAgICB7Ci0JICAgICAgY2hhciAqcDsKLQotCSAgICAgIHAgPSBzdHJjaHIgKG5hbWUsIEVMRl9WRVJfQ0hSKTsKLQkgICAgICBpZiAocCAhPSBOVUxMICYmIHBbMV0gPT0gRUxGX1ZFUl9DSFIpCi0JCXsKLQkJICBjaGFyICpzaG9ydG5hbWU7Ci0JCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhpOwotCQkgIGJvb2xlYW4gb3ZlcnJpZGU7Ci0KLQkJICBzaG9ydG5hbWUgPSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkJIHAgLSBuYW1lICsgMSk7Ci0JCSAgaWYgKHNob3J0bmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RybmNweSAoc2hvcnRuYW1lLCBuYW1lLCBwIC0gbmFtZSk7Ci0JCSAgc2hvcnRuYW1lW3AgLSBuYW1lXSA9ICdcMCc7Ci0KLQkJICAvKiBXZSBhcmUgZ29pbmcgdG8gY3JlYXRlIGEgbmV3IHN5bWJvbC4gIE1lcmdlIGl0Ci0gICAgICAgICAgICAgICAgICAgICB3aXRoIGFueSBleGlzdGluZyBzeW1ib2wgd2l0aCB0aGlzIG5hbWUuICBGb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICBwdXJwb3NlcyBvZiB0aGUgbWVyZ2UsIGFjdCBhcyB0aG91Z2ggd2Ugd2VyZQotICAgICAgICAgICAgICAgICAgICAgZGVmaW5pbmcgdGhlIHN5bWJvbCB3ZSBqdXN0IGRlZmluZWQsIGFsdGhvdWdoIHdlCi0gICAgICAgICAgICAgICAgICAgICBhY3R1YWxseSBnb2luZyB0byBkZWZpbmUgYW4gaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLQkJICB0eXBlX2NoYW5nZV9vayA9IGZhbHNlOwotCQkgIHNpemVfY2hhbmdlX29rID0gZmFsc2U7Ci0JCSAgaWYgKCEgZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgc2hvcnRuYW1lLCAmc3ltLCAmc2VjLAotCQkJCQkgICZ2YWx1ZSwgJmhpLCAmb3ZlcnJpZGUsCi0JCQkJCSAgJnR5cGVfY2hhbmdlX29rLCAmc2l6ZV9jaGFuZ2Vfb2spKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICBpZiAoISBvdmVycmlkZSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCQkgICAgIChpbmZvLCBhYmZkLCBzaG9ydG5hbWUsIEJTRl9JTkRJUkVDVCwKLQkJCSAgICAgIGJmZF9pbmRfc2VjdGlvbl9wdHIsIChiZmRfdm1hKSAwLCBuYW1lLCBmYWxzZSwKLQkJCSAgICAgIGNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmhpKSkpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIEluIHRoaXMgY2FzZSB0aGUgc3ltYm9sIG5hbWVkIFNIT1JUTkFNRSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRpbmcgdGhlIGluZGlyZWN0IHN5bWJvbCB3ZSB3YW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWRkLiAgV2Ugd2VyZSBwbGFubmluZyBvbiBtYWtpbmcgU0hPUlROQU1FIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3Qgc3ltYm9sIHJlZmVycmluZyB0byBOQU1FLiAgU0hPUlROQU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIG5hbWUgd2l0aG91dCBhIHZlcnNpb24uICBOQU1FIGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHZlcnNpb25lZCBuYW1lLCBhbmQgaXQgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLgotCi0JCQkgT3ZlcnJpZGluZyBtZWFucyB0aGF0IHdlIGFscmVhZHkgc2F3IGEKLQkJCSBkZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sIFNIT1JUTkFNRSBpbiBhCi0JCQkgcmVndWxhciBvYmplY3QsIGFuZCBpdCBpcyBvdmVycmlkaW5nIHRoZQotCQkJIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBkeW5hbWljIG9iamVjdC4KLQotCQkJIFdoZW4gdGhpcyBoYXBwZW5zLCB3ZSBhY3R1YWxseSB3YW50IHRvIGNoYW5nZQotCQkJIE5BTUUsIHRoZSBzeW1ib2wgd2UganVzdCBhZGRlZCwgdG8gcmVmZXIgdG8KLQkJCSBTSE9SVE5BTUUuICBUaGlzIHdpbGwgY2F1c2UgcmVmZXJlbmNlcyB0bwotCQkJIE5BTUUgaW4gdGhlIHNoYXJlZCBvYmplY3QgdG8gYmVjb21lCi0JCQkgcmVmZXJlbmNlcyB0byBTSE9SVE5BTUUgaW4gdGhlIHJlZ3VsYXIKLQkJCSBvYmplY3QuICBUaGlzIGlzIHdoYXQgd2UgZXhwZWN0IHdoZW4gd2UKLQkJCSBvdmVycmlkZSBhIGZ1bmN0aW9uIGluIGEgc2hhcmVkIG9iamVjdDogdGhhdAotCQkJIHRoZSByZWZlcmVuY2VzIGluIHRoZSBzaGFyZWQgb2JqZWN0IHdpbGwgYmUKLQkJCSBtYXBwZWQgdG8gdGhlIGRlZmluaXRpb24gaW4gdGhlIHJlZ3VsYXIKLQkJCSBvYmplY3QuICAqLwotCi0JCSAgICAgIHdoaWxlIChoaS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJCSAgICAgfHwgaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCQloaSA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoaS0+cm9vdC51LmkubGluazsKLQotCQkgICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2luZGlyZWN0OwotCQkgICAgICBoLT5yb290LnUuaS5saW5rID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGhpOwotCQkgICAgICBpZiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpCi0JCQl7Ci0JCQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUM7Ci0JCQkgIGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUM7Ci0JCQkgIGlmIChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCSB8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLAotCQkJCQkJCQkJIGhpKSkKLQkJCQlnb3RvIGVycm9yX3JldHVybjsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgLyogTm93IHNldCBISSB0byBILCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc2V0IHRoZSBvdGhlciBmaWVsZHMgY29ycmVjdGx5LiAgKi8KLQkJICAgICAgaGkgPSBoOwotCQkgICAgfQotCi0JCSAgLyogSWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBzb21ld2hlcmUsCi0JCSAgICAgdGhlbiBISSBtYXkgbm90IHBvaW50IHRvIGFuIGluZGlyZWN0IHN5bWJvbC4gIFdlCi0JCSAgICAgd2lsbCBoYXZlIHJlcG9ydGVkIGFuIGVycm9yIHRvIHRoZSB1c2VyIGluIHRoYXQKLQkJICAgICBjYXNlLiAgKi8KLQotCQkgIGlmIChoaS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpodDsKLQotCQkgICAgICAvKiBJZiB0aGUgc3ltYm9sIGJlY2FtZSBpbmRpcmVjdCwgdGhlbiB3ZSBhc3N1bWUKLQkJCSB0aGF0IHdlIGhhdmUgbm90IHNlZW4gYSBkZWZpbml0aW9uIGJlZm9yZS4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMKLQkJCQkgICAgICB8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCQkJCSAgPT0gMCk7Ci0KLQkJICAgICAgaHQgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaGktPnJvb3QudS5pLmxpbms7Ci0JCSAgICAgICgqYmVkLT5lbGZfYmFja2VuZF9jb3B5X2luZGlyZWN0X3N5bWJvbCkgKGh0LCBoaSk7Ci0KLQkJICAgICAgLyogU2VlIGlmIHRoZSBuZXcgZmxhZ3MgbGVhZCB1cyB0byByZWFsaXplIHRoYXQKLQkJCSB0aGUgc3ltYm9sIG11c3QgYmUgZHluYW1pYy4gICovCi0JCSAgICAgIGlmICghIGR5bnN5bSkKLQkJCXsKLQkJCSAgaWYgKCEgZHluYW1pYykKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoaW5mby0+c2hhcmVkCi0JCQkJICB8fCAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykKLQkJCQkgICAgICAhPSAwKSkKLQkJCQlkeW5zeW0gPSB0cnVlOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDApCi0JCQkJZHluc3ltID0gdHJ1ZTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICAvKiBXZSBhbHNvIG5lZWQgdG8gZGVmaW5lIGFuIGluZGlyZWN0aW9uIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICBub25kZWZhdWx0IHZlcnNpb24gb2YgdGhlIHN5bWJvbC4gICovCi0KLQkJICBzaG9ydG5hbWUgPSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkJIHN0cmxlbiAobmFtZSkpOwotCQkgIGlmIChzaG9ydG5hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cm5jcHkgKHNob3J0bmFtZSwgbmFtZSwgcCAtIG5hbWUpOwotCQkgIHN0cmNweSAoc2hvcnRuYW1lICsgKHAgLSBuYW1lKSwgcCArIDEpOwotCi0JCSAgLyogT25jZSBhZ2FpbiwgbWVyZ2Ugd2l0aCBhbnkgZXhpc3Rpbmcgc3ltYm9sLiAgKi8KLQkJICB0eXBlX2NoYW5nZV9vayA9IGZhbHNlOwotCQkgIHNpemVfY2hhbmdlX29rID0gZmFsc2U7Ci0JCSAgaWYgKCEgZWxmX21lcmdlX3N5bWJvbCAoYWJmZCwgaW5mbywgc2hvcnRuYW1lLCAmc3ltLCAmc2VjLAotCQkJCQkgICZ2YWx1ZSwgJmhpLCAmb3ZlcnJpZGUsCi0JCQkJCSAgJnR5cGVfY2hhbmdlX29rLCAmc2l6ZV9jaGFuZ2Vfb2spKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICBpZiAob3ZlcnJpZGUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEhlcmUgU0hPUlROQU1FIGlzIGEgdmVyc2lvbmVkIG5hbWUsIHNvIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgZXhwZWN0IHRvIHNlZSB0aGUgdHlwZSBvZiBvdmVycmlkZSB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIGRvIGluIHRoZSBjYXNlIGFib3ZlLiAgKi8KLQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiJXM6IHdhcm5pbmc6IHVuZXhwZWN0ZWQgcmVkZWZpbml0aW9uIG9mIGAlcyciKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc2hvcnRuYW1lKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkJICAgICAoaW5mbywgYWJmZCwgc2hvcnRuYW1lLCBCU0ZfSU5ESVJFQ1QsCi0JCQkgICAgICBiZmRfaW5kX3NlY3Rpb25fcHRyLCAoYmZkX3ZtYSkgMCwgbmFtZSwgZmFsc2UsCi0JCQkgICAgICBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoaSkpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogSWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBzb21ld2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBISSBtYXkgbm90IHBvaW50IHRvIGFuIGluZGlyZWN0IHN5bWJvbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICBXZSB3aWxsIGhhdmUgcmVwb3J0ZWQgYW4gZXJyb3IgdG8gdGhlIHVzZXIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNhc2UuICAqLwotCi0JCSAgICAgIGlmIChoaS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JCQl7Ci0JCQkgIC8qIElmIHRoZSBzeW1ib2wgYmVjYW1lIGluZGlyZWN0LCB0aGVuIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc3VtZSB0aGF0IHdlIGhhdmUgbm90IHNlZW4gYSBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZS4gICovCi0JCQkgIEJGRF9BU1NFUlQgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICAgICAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJCSAgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJCQkgICAgICA9PSAwKTsKLQotCQkgICAgICAgICAgKCpiZWQtPmVsZl9iYWNrZW5kX2NvcHlfaW5kaXJlY3Rfc3ltYm9sKSAoaCwgaGkpOwotCi0JCQkgIC8qIFNlZSBpZiB0aGUgbmV3IGZsYWdzIGxlYWQgdXMgdG8gcmVhbGl6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBzeW1ib2wgbXVzdCBiZSBkeW5hbWljLiAgKi8KLQkJCSAgaWYgKCEgZHluc3ltKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICghIGR5bmFtaWMpCi0JCQkJewotCQkJCSAgaWYgKGluZm8tPnNoYXJlZAotCQkJCSAgICAgIHx8ICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkJICAgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKQotCQkJCQkgICE9IDApKQotCQkJCSAgICBkeW5zeW0gPSB0cnVlOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBpZiAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMCkKLQkJCQkgICAgZHluc3ltID0gdHJ1ZTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGR5bnN5bSAmJiBoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgJiYgISBuZXdfd2Vha2RlZgotCQkgICYmIGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywKLQkJCQkJCQkgICAgIGgtPndlYWtkZWYpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTm93IHNldCB0aGUgd2Vha2RlZnMgZmllbGQgY29ycmVjdGx5IGZvciBhbGwgdGhlIHdlYWsgZGVmaW5lZAotICAgICBzeW1ib2xzIHdlIGZvdW5kLiAgVGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2VhcmNoIGFsbCB0aGUKLSAgICAgc3ltYm9scy4gIFNpbmNlIHdlIG9ubHkgbmVlZCB0aGUgaW5mb3JtYXRpb24gZm9yIG5vbiBmdW5jdGlvbnMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzLCB0aGF0J3MgdGhlIG9ubHkgdGltZSB3ZSBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24KLSAgICAgdGhlIGxpc3QgV0VBS1MuICBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gc28gdGhhdCBpZiBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0IHJlZmVycyB0byBhIHN5bWJvbCBkZWZpbmVkIHdlYWtseSBpbiBhIGR5bmFtaWMgb2JqZWN0LCB0aGUKLSAgICAgcmVhbCBzeW1ib2wgaW4gdGhlIGR5bmFtaWMgb2JqZWN0IGlzIGFsc28gcHV0IGluIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbHM7IHdlIGFsc28gbXVzdCBhcnJhbmdlIGZvciBib3RoIHN5bWJvbHMgdG8gcG9pbnQgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uLiAgV2UgY291bGQgaGFuZGxlIHRoZSBnZW5lcmFsIGNhc2Ugb2Ygc3ltYm9sCi0gICAgIGFsaWFzaW5nLCBidXQgYSBnZW5lcmFsIHN5bWJvbCBhbGlhcyBjYW4gb25seSBiZSBnZW5lcmF0ZWQgaW4KLSAgICAgYXNzZW1ibGVyIGNvZGUsIGhhbmRsaW5nIGl0IGNvcnJlY3RseSB3b3VsZCBiZSB2ZXJ5IHRpbWUKLSAgICAgY29uc3VtaW5nLCBhbmQgb3RoZXIgRUxGIGxpbmtlcnMgZG9uJ3QgaGFuZGxlIGdlbmVyYWwgYWxpYXNpbmcKLSAgICAgZWl0aGVyLiAgKi8KLSAgd2hpbGUgKHdlYWtzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhsb29rOwotICAgICAgYXNlY3Rpb24gKnNsb29rOwotICAgICAgYmZkX3ZtYSB2bG9vazsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqaHBwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipocHBlbmQ7Ci0KLSAgICAgIGhsb29rID0gd2Vha3M7Ci0gICAgICB3ZWFrcyA9IGhsb29rLT53ZWFrZGVmOwotICAgICAgaGxvb2stPndlYWtkZWYgPSBOVUxMOwotCi0gICAgICBCRkRfQVNTRVJUIChobG9vay0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgfHwgaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk7Ci0gICAgICBzbG9vayA9IGhsb29rLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICB2bG9vayA9IGhsb29rLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICBocHAgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gICAgICBocHBlbmQgPSBocHAgKyBleHRzeW1jb3VudDsKLSAgICAgIGZvciAoOyBocHAgPCBocHBlbmQ7IGhwcCsrKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gKmhwcDsKLQkgIGlmIChoICE9IE5VTEwgJiYgaCAhPSBobG9vawotCSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2xvb2sKLQkgICAgICAmJiBoLT5yb290LnUuZGVmLnZhbHVlID09IHZsb29rKQotCSAgICB7Ci0JICAgICAgaGxvb2stPndlYWtkZWYgPSBoOwotCi0JICAgICAgLyogSWYgdGhlIHdlYWsgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCi0JCSBzeW1ib2xzLCBtYWtlIHN1cmUgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBwdXQgdGhlcmUKLQkJIGFzIHdlbGwuICAqLwotCSAgICAgIGlmIChobG9vay0+ZHluaW5keCAhPSAtMQotCQkgICYmIGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCi0gICAgICAgICAgICAgICAgIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUgd2VhayBkZWZpbml0aW9uIGlzIHB1dCB0aGVyZQotICAgICAgICAgICAgICAgICBhcyB3ZWxsLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB0aGUgZHluYW1pYwotICAgICAgICAgICAgICAgICBsb2FkZXIgbWlnaHQgbm90IG1lcmdlIHRoZSBlbnRyaWVzIGZvciB0aGUgcmVhbAotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCB0aGUgd2VhayBkZWZpbml0aW9uLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIGhsb29rLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGhsb29rKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBidWYgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZXh0dmVyc3ltKTsKLSAgICAgIGV4dHZlcnN5bSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgb2JqZWN0IGlzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb3V0cHV0IG9iamVjdCwgYW5kIGl0IGlzCi0gICAgIG5vdCBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGxldCB0aGUgYmFja2VuZCBsb29rIHRocm91Z2ggdGhlCi0gICAgIHJlbG9jcy4KLQotICAgICBUaGlzIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcyBhbmQgdG8KLSAgICAgYXJyYW5nZSBmb3IgZHluYW1pYyByZWxvY3MuICBJdCBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZQotICAgICBwYXJ0aWN1bGFyIGNvbW1vbiBjYXNlIG9mIGxpbmtpbmcgbm9uIFBJQyBjb2RlLCBldmVuIHdoZW4gbGlua2luZwotICAgICBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIHdheSBvZgotICAgICBrbm93aW5nIHdoZXRoZXIgYW4gb2JqZWN0IGZpbGUgaGFzIGJlZW4gY29tcGlsZWQgUElDIG9yIG5vdC4KLSAgICAgTG9va2luZyB0aHJvdWdoIHRoZSByZWxvY3MgaXMgbm90IHBhcnRpY3VsYXJseSB0aW1lIGNvbnN1bWluZy4KLSAgICAgVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBtdXN0IGVpdGhlciAoMSkga2VlcCB0aGUgcmVsb2NzIGluIG1lbW9yeSwKLSAgICAgd2hpY2ggY2F1c2VzIHRoZSBsaW5rZXIgdG8gcmVxdWlyZSBhZGRpdGlvbmFsIHJ1bnRpbWUgbWVtb3J5IG9yCi0gICAgICgyKSByZWFkIHRoZSByZWxvY3MgdHdpY2UgZnJvbSB0aGUgaW5wdXQgZmlsZSwgd2hpY2ggd2FzdGVzIHRpbWUuCi0gICAgIFRoaXMgd291bGQgYmUgYSBnb29kIGNhc2UgZm9yIHVzaW5nIG1tYXAuCi0KLSAgICAgSSBoYXZlIG5vIGlkZWEgaG93IHRvIGhhbmRsZSBsaW5raW5nIFBJQyBjb2RlIGludG8gYSBmaWxlIG9mIGEKLSAgICAgZGlmZmVyZW50IGZvcm1hdC4gIEl0IHByb2JhYmx5IGNhbid0IGJlIGRvbmUuICAqLwotICBjaGVja19yZWxvY3MgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNoZWNrX3JlbG9jczsKLSAgaWYgKCEgZHluYW1pYwotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0gICAgICAmJiBjaGVja19yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLQkgIGJvb2xlYW4gb2s7Ci0KLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgICAgICB8fCBvLT5yZWxvY19jb3VudCA9PSAwCi0JICAgICAgfHwgKChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIpCi0JCSAgJiYgKG8tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQkgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG8tPm91dHB1dF9zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkgICAgIChhYmZkLCBvLCAoUFRSKSBOVUxMLAotCQkJICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgICAgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgb2sgPSAoKmNoZWNrX3JlbG9jcykgKGFiZmQsIGluZm8sIG8sIGludGVybmFsX3JlbG9jcyk7Ci0KLQkgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCi0JICBpZiAoISBvaykKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbm9uLXRyYWRpdGlvbmFsLCBub24tcmVsb2NhdGVhYmxlIGxpbmssIHRyeSB0bwotICAgICBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgdGhlIC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgZHluYW1pYwotICAgICAgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgaW5mby0+dHJhZGl0aW9uYWxfZm9ybWF0Ci0gICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfZGVidWdnZXIpKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdGFiLCAqc3RhYnN0cjsKLQotICAgICAgc3RhYiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKLSAgICAgIGlmIChzdGFiICE9IE5VTEwpCi0JewotCSAgc3RhYnN0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKLQotCSAgaWYgKHN0YWJzdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqc2VjZGF0YTsKLQotCSAgICAgIHNlY2RhdGEgPSBlbGZfc2VjdGlvbl9kYXRhIChzdGFiKTsKLQkgICAgICBpZiAoISBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyAoYWJmZCwKLQkJCQkJICAgICAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkJCSAgICAgc3RhYiwgc3RhYnN0ciwKLQkJCQkJICAgICAmc2VjZGF0YS0+c3RhYl9pbmZvKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIGlmIChkeW52ZXIgIT0gTlVMTCkKLSAgICBmcmVlIChkeW52ZXIpOwotICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0dmVyc3ltKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDcmVhdGUgc29tZSBzZWN0aW9ucyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIGR5bmFtaWMgbGlua2luZwotICAgaW5mb3JtYXRpb24uICBBQkZEIGlzIGFuIGlucHV0IGZpbGUgd2hpY2ggcmVxdWlyZXMgZHluYW1pYyBzZWN0aW9ucwotICAgdG8gYmUgY3JlYXRlZC4gIFRoZSBkeW5hbWljIHNlY3Rpb25zIHRha2UgdXAgdmlydHVhbCBtZW1vcnkgc3BhY2UKLSAgIHdoZW4gdGhlIGZpbmFsIGV4ZWN1dGFibGUgaXMgcnVuLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZQotICAgYWRkcmVzc2VzIGFyZSBhc3NpZ25lZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgV2Ugd29yayBvdXQgdGhlCi0gICBhY3R1YWwgY29udGVudHMgYW5kIHNpemUgb2YgdGhlc2Ugc2VjdGlvbnMgbGF0ZXIuICAqLwotCi1ib29sZWFuCi1lbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgYWxsIGR5bmFtaWMgc2VjdGlvbnMgdXNlIHRoZSBzYW1lIGlucHV0IEJGRC4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgZWxzZQotICAgIGFiZmQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcgZm9yIGFsbCBvZiB0aGVzZQotICAgICBzZWN0aW9ucy4gICovCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCSAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgLyogQSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSBoYXMgYSAuaW50ZXJwIHNlY3Rpb24sIGJ1dCBhCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGRvZXMgbm90LiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmludGVycCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBzZWN0aW9ucyB0byBob2xkIHZlcnNpb24gaW5mb3JtYXRpb25zLiAgVGhlc2UgYXJlIHJlbW92ZWQKLSAgICAgaWYgdGhleSBhcmUgbm90IG5lZWRlZC4gICovCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX2QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX3IiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN5bSIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3RyIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSBhIHN0cnRhYiB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbCBuYW1lcy4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID0gZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICAgICAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3BlY2lhbCBzeW1ib2wgX0RZTkFNSUMgaXMgYWx3YXlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIC5keW5hbWljIHNlY3Rpb24uICBUaGlzIGNhbGwgb2NjdXJzIGJlZm9yZSB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUKLSAgICAgc3ltYm9scyBmb3IgYW55IGR5bmFtaWMgb2JqZWN0LCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0Ci0gICAgIG92ZXJyaWRpbmcgYSBkeW5hbWljIGRlZmluaXRpb24uICBXZSBjb3VsZCBzZXQgX0RZTkFNSUMgaW4gYQotICAgICBsaW5rZXIgc2NyaXB0LCBidXQgd2Ugb25seSB3YW50IHRvIGRlZmluZSBpdCBpZiB3ZSBhcmUsIGluIGZhY3QsCi0gICAgIGNyZWF0aW5nIGEgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIGl0IGlmIHRoZXJlCi0gICAgIGlzIG5vIC5keW5hbWljIHNlY3Rpb24sIHNpbmNlIG9uIHNvbWUgRUxGIHBsYXRmb3JtcyB0aGUgc3RhcnQgdXAKLSAgICAgY29kZSBleGFtaW5lcyBpdCB0byBkZWNpZGUgaG93IHRvIGluaXRpYWxpemUgdGhlIHByb2Nlc3MuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JIChpbmZvLCBhYmZkLCAiX0RZTkFNSUMiLCBCU0ZfR0xPQkFMLCBzLCAoYmZkX3ZtYSkgMCwKLQkgIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuaGFzaCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfaGFzaF9lbnRyeTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgY3JlYXRlIHRoZSByZXN0IG9mIHRoZSBzZWN0aW9ucy4gIFRoaXMgbGV0cyB0aGUKLSAgICAgYmFja2VuZCBzZXQgdGhlIHJpZ2h0IGZsYWdzLiAgVGhlIGJhY2tlbmQgd2lsbCBub3JtYWxseSBjcmVhdGUKLSAgICAgdGhlIC5nb3QgYW5kIC5wbHQgc2VjdGlvbnMuICAqLwotICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYW4gZW50cnkgdG8gdGhlIC5keW5hbWljIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCB0YWcsIHZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgdGFnOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgc2l6ZV90IG5ld3NpemU7Ci0gIGJmZF9ieXRlICpuZXdjb250ZW50czsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgbmV3c2l6ZSA9IHMtPl9yYXdfc2l6ZSArIHNpemVvZiAoRWxmX0V4dGVybmFsX0R5bik7Ci0gIG5ld2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChzLT5jb250ZW50cywgbmV3c2l6ZSk7Ci0gIGlmIChuZXdjb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkeW4uZF90YWcgPSB0YWc7Ci0gIGR5bi5kX3VuLmRfdmFsID0gdmFsOwotICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sCi0JCSAgICAoRWxmX0V4dGVybmFsX0R5biAqKSAobmV3Y29udGVudHMgKyBzLT5fcmF3X3NpemUpKTsKLQotICBzLT5fcmF3X3NpemUgPSBuZXdzaXplOwotICBzLT5jb250ZW50cyA9IG5ld2NvbnRlbnRzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBuZXcgbG9jYWwgZHluYW1pYyBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1lbGZfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfaW5keCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBsb25nIGlucHV0X2luZHg7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICplbnRyeTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKmVodDsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICBFbGZfRXh0ZXJuYWxfU3ltIGVzeW07Ci0gIHVuc2lnbmVkIGxvbmcgZHluc3RyX2luZGV4OwotICBjaGFyICpuYW1lOwotCi0gIC8qIFNlZSBpZiB0aGUgZW50cnkgZXhpc3RzIGFscmVhZHkuICAqLwotICBmb3IgKGVudHJ5ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbDsgZW50cnkgOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotICAgIGlmIChlbnRyeS0+aW5wdXRfYmZkID09IGlucHV0X2JmZCAmJiBlbnRyeS0+aW5wdXRfaW5keCA9PSBpbnB1dF9pbmR4KQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgZW50cnkgPSAoc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKikKLSAgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwgc2l6ZW9mICgqZW50cnkpKTsKLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdvIGZpbmQgdGhlIHN5bWJvbCwgc28gdGhhdCB3ZSBjYW4gZmluZCBpdCdzIG5hbWUuICAqLwotICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwKLQkJKGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkci5zaF9vZmZzZXQKLQkJICsgaW5wdXRfaW5keCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgmZXN5bSwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgMSwgaW5wdXRfYmZkKQotCSAgIT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgJmVzeW0sICZlbnRyeS0+aXN5bSk7Ci0KLSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JICAoaW5wdXRfYmZkLCBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHIuc2hfbGluaywKLQkgICBlbnRyeS0+aXN5bS5zdF9uYW1lKSk7Ci0KLSAgZHluc3RyID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHI7Ci0gIGlmIChkeW5zdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBkeW5zdHIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICAgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGR5bnN0cl9pbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZHluc3RyLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChkeW5zdHJfaW5kZXggPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgZW50cnktPmlzeW0uc3RfbmFtZSA9IGR5bnN0cl9pbmRleDsKLQotICBlaHQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgZW50cnktPm5leHQgPSBlaHQtPmR5bmxvY2FsOwotICBlaHQtPmR5bmxvY2FsID0gZW50cnk7Ci0gIGVudHJ5LT5pbnB1dF9iZmQgPSBpbnB1dF9iZmQ7Ci0gIGVudHJ5LT5pbnB1dF9pbmR4ID0gaW5wdXRfaW5keDsKLSAgZWh0LT5keW5zeW1jb3VudCsrOwotCi0gIC8qIFdoYXRldmVyIGJpbmRpbmcgdGhlIHN5bWJvbCBoYWQgYmVmb3JlLCBpdCdzIG5vdyBsb2NhbC4gICovCi0gIGVudHJ5LT5pc3ltLnN0X2luZm8KLSAgICA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIEVMRl9TVF9UWVBFIChlbnRyeS0+aXN5bS5zdF9pbmZvKSk7Ci0KLSAgLyogVGhlIGR5bmluZHggd2lsbCBiZSBzZXQgYXQgdGhlIGVuZCBvZiBzaXplX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZnJvbSB0aGUgc2VjdGlvbiBpbmRpY2F0ZWQgYnkgU0hEUi4gIFRoaXMKLSAgIG1heSBiZSBlaXRoZXIgYSBSRUwgb3IgYSBSRUxBIHNlY3Rpb24uICBUaGUgcmVsb2NhdGlvbnMgYXJlCi0gICB0cmFuc2xhdGVkIGludG8gUkVMQSByZWxvY2F0aW9ucyBhbmQgc3RvcmVkIGluIElOVEVSTkFMX1JFTE9DUywKLSAgIHdoaWNoIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgdG8gY29udGFpbiBlbm91Z2ggc3BhY2UuCi0gICBUaGUgRVhURVJOQUxfUkVMT0NTIGFyZSBhIGJ1ZmZlciB3aGVyZSB0aGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUKLSAgIHJlbG9jYXRpb25zIHNob3VsZCBiZSBzdG9yZWQuCi0KLSAgIFJldHVybnMgZmFsc2UgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uIChhYmZkLCBzaGRyLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJICAgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzaGRyOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NhdGlvbnMsIHRoYXQncyBPSy4gICovCi0gIGlmICghc2hkcikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBQb3NpdGlvbiBvdXJzZWx2ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWFkIHRoZSByZWxvY2F0aW9ucy4gICovCi0gIGlmIChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBzaGRyLT5zaF9zaXplLCBhYmZkKQotICAgICAgIT0gc2hkci0+c2hfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIC8qIENvbnZlcnQgdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zIHRvIHRoZSBpbnRlcm5hbCBmb3JtYXQuICAqLwotICBpZiAoc2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsZW5kOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbCAqaXJlbDsKLQotICAgICAgZXJlbCA9IChFbGZfRXh0ZXJuYWxfUmVsICopIGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGVyZWxlbmQgPSBlcmVsICsgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7Ci0gICAgICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGlyZWwgPSBiZmRfYWxsb2MgKGFiZmQsIChiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsCi0JCQkgICAgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWwpKSk7Ci0gICAgICBmb3IgKDsgZXJlbCA8IGVyZWxlbmQ7IGVyZWwrKywgaXJlbGEgKz0gYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkKLQl7Ci0JICB1bnNpZ25lZCBjaGFyIGk7Ci0KLQkgIGlmIChiZWQtPnMtPnN3YXBfcmVsb2NfaW4pCi0JICAgICgqYmVkLT5zLT5zd2FwX3JlbG9jX2luKSAoYWJmZCwgKGJmZF9ieXRlICopIGVyZWwsIGlyZWwpOwotCSAgZWxzZQotCSAgICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgaXJlbCk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsOyArK2kpCi0JICAgIHsKLQkgICAgICBpcmVsYVtpXS5yX29mZnNldCA9IGlyZWxbaV0ucl9vZmZzZXQ7Ci0JICAgICAgaXJlbGFbaV0ucl9pbmZvID0gaXJlbFtpXS5yX2luZm87Ci0JICAgICAgaXJlbGFbaV0ucl9hZGRlbmQgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYWVuZDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYTsKLQotICAgICAgQkZEX0FTU0VSVCAoc2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0KLSAgICAgIGVyZWxhID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGVyZWxhZW5kID0gZXJlbGEgKyBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yICg7IGVyZWxhIDwgZXJlbGFlbmQ7IGVyZWxhKyssIGlyZWxhICs9IGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWwpCi0JewotCSAgaWYgKGJlZC0+cy0+c3dhcF9yZWxvY2FfaW4pCi0JICAgICgqYmVkLT5zLT5zd2FwX3JlbG9jYV9pbikgKGFiZmQsIChiZmRfYnl0ZSAqKSBlcmVsYSwgaXJlbGEpOwotCSAgZWxzZQotCSAgICBlbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIGVyZWxhLCBpcmVsYSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbmQgc3dhcCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gTy4gIFRoZXkgbWF5IGhhdmUgYmVlbgotICAgY2FjaGVkLiAgSWYgdGhlIEVYVEVSTkFMX1JFTE9DUyBhbmQgSU5URVJOQUxfUkVMT0NTIGFyZ3VtZW50cyBhcmUKLSAgIG5vdCBOVUxMLCB0aGV5IGFyZSB1c2VkIGFzIGJ1ZmZlcnMgdG8gcmVhZCBpbnRvLiAgVGhleSBhcmUga25vd24gdG8KLSAgIGJlIGxhcmdlIGVub3VnaC4gIElmIHRoZSBJTlRFUk5BTF9SRUxPQ1MgcmVsb2NzIGFyZ3VtZW50IGlzIE5VTEwsCi0gICB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsbG9jYXRlZCB1c2luZyBlaXRoZXIgbWFsbG9jIG9yIGJmZF9hbGxvYywKLSAgIGFjY29yZGluZyB0byB0aGUgS0VFUF9NRU1PUlkgYXJndW1lbnQuICBJZiBPIGhhcyB0d28gcmVsb2NhdGlvbgotICAgc2VjdGlvbnMgKGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zKSwgdGhlbiB0aGUgUkVMX0hEUgotICAgcmVsb2NhdGlvbnMgd2lsbCBhcHBlYXIgZmlyc3QgaW4gSU5URVJOQUxfUkVMT0NTLCBmb2xsb3dlZCBieSB0aGUKLSAgIFJFTF9IRFIyIHJlbG9jYXRpb25zLiAgKi8KLQotRWxmX0ludGVybmFsX1JlbGEgKgotTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKSAoYWJmZCwgbywgZXh0ZXJuYWxfcmVsb2NzLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJIGtlZXBfbWVtb3J5KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpvOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBib29sZWFuIGtlZXBfbWVtb3J5OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgUFRSIGFsbG9jMSA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICphbGxvYzIgPSBOVUxMOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzICE9IE5VTEwpCi0gICAgcmV0dXJuIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY3M7Ci0KLSAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKLQotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IHNpemU7Ci0KLSAgICAgIHNpemUgPSAoby0+cmVsb2NfY291bnQgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsIAotCSAgICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkpOwotICAgICAgaWYgKGtlZXBfbWVtb3J5KQotCWludGVybmFsX3JlbG9jcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICAgICAgZWxzZQotCWludGVybmFsX3JlbG9jcyA9IGFsbG9jMiA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZTsKLQotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMikKLQlzaXplICs9IChzaXplX3QpIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMi0+c2hfc2l6ZTsKLSAgICAgIGFsbG9jMSA9IChQVFIpIGJmZF9tYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGFsbG9jMSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gYWxsb2MxOwotICAgIH0KLQotICBpZiAoIWVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbiAoYWJmZCwgcmVsX2hkciwKLQkJCQkJICBleHRlcm5hbF9yZWxvY3MsCi0JCQkJCSAgaW50ZXJuYWxfcmVsb2NzKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCFlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24gCi0gICAgICAoYWJmZCwgCi0gICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyLAotICAgICAgICgoYmZkX2J5dGUgKikgZXh0ZXJuYWxfcmVsb2NzKSArIHJlbF9oZHItPnNoX3NpemUsCi0gICAgICAgaW50ZXJuYWxfcmVsb2NzICsgKHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplCi0JCQkgICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciBuZXh0IHRpbWUsIGlmIHdlIGNhbi4gICovCi0gIGlmIChrZWVwX21lbW9yeSkKLSAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotCi0gIC8qIERvbid0IGZyZWUgYWxsb2MyLCBzaW5jZSBpZiBpdCB3YXMgYWxsb2NhdGVkIHdlIGFyZSBwYXNzaW5nIGl0Ci0gICAgIGJhY2sgKHVuZGVyIHRoZSBuYW1lIG9mIGludGVybmFsX3JlbG9jcykuICAqLwotCi0gIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvYzEgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzEpOwotICBpZiAoYWxsb2MyICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2MyKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0KLS8qIFJlY29yZCBhbiBhc3NpZ25tZW50IHRvIGEgc3ltYm9sIG1hZGUgYnkgYSBsaW5rZXIgc2NyaXB0LiAgV2UgbmVlZAotICAgdGhpcyBpbiBjYXNlIHNvbWUgZHluYW1pYyBvYmplY3QgcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1OQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUsIHByb3ZpZGUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBwcm92aWRlOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCwgYW5kIGl0IGlzCi0gICAgIGN1cnJlbnRseSBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGJ1dCBub3QgYnkgYSByZWd1bGFyCi0gICAgIG9iamVjdCwgdGhlbiBtYXJrIGl0IGFzIHVuZGVmaW5lZCBzbyB0aGF0IHRoZSBnZW5lcmljIGxpbmtlciB3aWxsCi0gICAgIGZvcmNlIHRoZSBjb3JyZWN0IHZhbHVlLiAgKi8KLSAgaWYgKHByb3ZpZGUKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyBwcm92aWRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCwgYW5kIGl0IGlzCi0gICAgIGN1cnJlbnRseSBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGJ1dCBub3QgYnkgYSByZWd1bGFyIG9iamVjdCwKLSAgICAgdGhlbiBjbGVhciBvdXQgYW55IHZlcnNpb24gaW5mb3JtYXRpb24gYmVjYXVzZSB0aGUgc3ltYm9sIHdpbGwgbm90IGJlCi0gICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHluYW1pYyBvYmplY3QgYW55IG1vcmUuICAqLwotICBpZiAoIXByb3ZpZGUKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIGgtPnZlcmluZm8udmVyZGVmID0gTlVMTDsKLQotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0KLSAgLyogV2hlbiBwb3NzaWJsZSwga2VlcCB0aGUgb3JpZ2luYWwgdHlwZSBvZiB0aGUgc3ltYm9sICovCi0gIGlmIChoLT50eXBlID09IFNUVF9OT1RZUEUpCi0gICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKCgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJICB8IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpKSAhPSAwCi0gICAgICAgfHwgaW5mby0+c2hhcmVkKQotICAgICAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbmVkIHN5bWJvbCwgYW5kIHdlIGtub3cgYSBjb3JyZXNwb25kaW5nCi0JIHJlYWwgc3ltYm9sIGZyb20gdGhlIHNhbWUgZHluYW1pYyBvYmplY3QsIG1ha2Ugc3VyZSB0aGUgcmVhbAotCSBzeW1ib2wgaXMgYWxzbyBtYWRlIGludG8gYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMCi0JICAmJiBoLT53ZWFrZGVmLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoLT53ZWFrZGVmKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KLSAgIGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbi4gICovCi0KLXN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8KLXsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIFZlcnNpb24gdHJlZS4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyZGVmczsKLSAgLyogV2hldGhlciB3ZSBhcmUgZXhwb3J0aW5nIGFsbCBkeW5hbWljIHN5bWJvbHMuICAqLwotICBib29sZWFuIGV4cG9ydF9keW5hbWljOwotICAvKiBXaGV0aGVyIHdlIGhhZCBhIGZhaWx1cmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcy4gICovCi0KLXN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbwotewotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogVGhlIG51bWJlciBvZiBkZXBlbmRlbmNpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgdmVyczsKLSAgLyogV2hldGhlciB3ZSBoYWQgYSBmYWlsdXJlLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci19OwotCi0vKiBBcnJheSB1c2VkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGhhc2ggdGFibGUgYnVja2V0cyB0byB1c2UKLSAgIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0aGVyZSBhcmUuICBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbgotICAgMyBzeW1ib2xzIHdlIHVzZSAxIGJ1Y2tldCwgZmV3ZXIgdGhhbiAxNyBzeW1ib2xzIHdlIHVzZSAzIGJ1Y2tldHMsCi0gICBmZXdlciB0aGFuIDM3IHdlIHVzZSAxNyBidWNrZXRzLCBhbmQgc28gZm9ydGguICBXZSBuZXZlciB1c2UgbW9yZQotICAgdGhhbiAzMjc3MSBidWNrZXRzLiAgKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBlbGZfYnVja2V0c1tdID0KLXsKLSAgMSwgMywgMTcsIDM3LCA2NywgOTcsIDEzMSwgMTk3LCAyNjMsIDUyMSwgMTAzMSwgMjA1MywgNDA5OSwgODIwOSwKLSAgMTY0MTEsIDMyNzcxLCAwCi19OwotCi0vKiBDb21wdXRlIGJ1Y2tldCBjb3VudCBmb3IgaGFzaGluZyB0YWJsZS4gIFdlIGRvIG5vdCB1c2UgYSBzdGF0aWMgc2V0Ci0gICBvZiBwb3NzaWJsZSB0YWJsZXMgc2l6ZXMgYW55bW9yZS4gIEluc3RlYWQgd2UgZGV0ZXJtaW5lIGZvciBhbGwKLSAgIHBvc3NpYmxlIHJlYXNvbmFibGUgc2l6ZXMgb2YgdGhlIHRhYmxlIHRoZSBvdXRjb21lIChpLmUuLCB0aGUKLSAgIG51bWJlciBvZiBjb2xsaXNpb25zIGV0YykgYW5kIGNob29zZSB0aGUgYmVzdCBzb2x1dGlvbi4gIFRoZQotICAgd2VpZ2h0aW5nIGZ1bmN0aW9ucyBhcmUgbm90IHRvbyBzaW1wbGUgdG8gYWxsb3cgdGhlIHRhYmxlIHRvIGdyb3cKLSAgIHdpdGhvdXQgYm91bmRzLiAgSW5zdGVhZCBvbmUgb2YgdGhlIHdlaWdodGluZyBmYWN0b3JzIGlzIHRoZSBzaXplLgotICAgVGhlcmVmb3JlIHRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZ29vZCBwYXlvZmYgYmV0d2VlbiBmZXcgY29sbGlzaW9ucwotICAgKD0gc2hvcnQgY2hhaW4gbGVuZ3RocykgYW5kIHRhYmxlIHNpemUuICAqLwotc3RhdGljIHNpemVfdAotY29tcHV0ZV9idWNrZXRfY291bnQgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzaXplX3QgZHluc3ltY291bnQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICBzaXplX3QgYmVzdF9zaXplID0gMDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2RlczsKLSAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2Rlc3A7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGk7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIGFsbCBleHBvcnRlZCBzeW1ib2xzLiAgQXQgdGhlIHNhbWUKLSAgICAgdGltZSBzdG9yZSB0aGUgdmFsdWVzIGluIGFuIGFycmF5IHNvIHRoYXQgd2UgY291bGQgdXNlIHRoZW0gZm9yCi0gICAgIG9wdGltaXphdGlvbnMuICAqLwotICBoYXNoY29kZXMgPSAodW5zaWduZWQgbG9uZyBpbnQgKikgYmZkX21hbGxvYyAoZHluc3ltY291bnQKLQkJCQkJCSogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpOwotICBpZiAoaGFzaGNvZGVzID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIGhhc2hjb2Rlc3AgPSBoYXNoY29kZXM7Ci0KLSAgLyogUHV0IGFsbCBoYXNoIHZhbHVlcyBpbiBIQVNIQ09ERVMuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9jb2xsZWN0X2hhc2hfY29kZXMsICZoYXNoY29kZXNwKTsKLQotLyogV2UgaGF2ZSBhIHByb2JsZW0gaGVyZS4gIFRoZSBmb2xsb3dpbmcgY29kZSB0byBvcHRpbWl6ZSB0aGUgdGFibGUKLSAgIHNpemUgcmVxdWlyZXMgYW4gaW50ZWdlciB0eXBlIHdpdGggbW9yZSB0aGUgMzIgYml0cy4gIElmCi0gICBCRkRfSE9TVF9VXzY0X0JJVCBpcyBzZXQgd2Uga25vdyBhYm91dCBzdWNoIGEgdHlwZS4gICovCi0jaWZkZWYgQkZEX0hPU1RfVV82NF9CSVQKLSAgaWYgKGluZm8tPm9wdGltaXplID09IHRydWUpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgbnN5bXMgPSBoYXNoY29kZXNwIC0gaGFzaGNvZGVzOwotICAgICAgc2l6ZV90IG1pbnNpemU7Ci0gICAgICBzaXplX3QgbWF4c2l6ZTsKLSAgICAgIEJGRF9IT1NUX1VfNjRfQklUIGJlc3RfY2hsZW4gPSB+KChCRkRfSE9TVF9VXzY0X0JJVCkgMCk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCAqY291bnRzIDsKLQotICAgICAgLyogUG9zc2libGUgb3B0aW1pemF0aW9uIHBhcmFtZXRlcnM6IGlmIHdlIGhhdmUgTlNZTVMgc3ltYm9scyB3ZSBzYXkKLQkgdGhhdCB0aGUgaGFzaGluZyB0YWJsZSBtdXN0IGF0IGxlYXN0IGhhdmUgTlNZTVMvNCBhbmQgYXQgbW9zdAotCSAyKk5TWU1TIGJ1Y2tldHMuICAqLwotICAgICAgbWluc2l6ZSA9IG5zeW1zIC8gNDsKLSAgICAgIGlmIChtaW5zaXplID09IDApCi0JbWluc2l6ZSA9IDE7Ci0gICAgICBiZXN0X3NpemUgPSBtYXhzaXplID0gbnN5bXMgKiAyOwotCi0gICAgICAvKiBDcmVhdGUgYXJyYXkgd2hlcmUgd2UgY291bnQgdGhlIGNvbGxpc2lvbnMgaW4uICBXZSBtdXN0IHVzZSBiZmRfbWFsbG9jCi0JIHNpbmNlIHRoZSBzaXplIGNvdWxkIGJlIGxhcmdlLiAgKi8KLSAgICAgIGNvdW50cyA9ICh1bnNpZ25lZCBsb25nIGludCAqKSBiZmRfbWFsbG9jIChtYXhzaXplCi0JCQkJCQkgKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSk7Ci0gICAgICBpZiAoY291bnRzID09IE5VTEwpCi0JewotCSAgZnJlZSAoaGFzaGNvZGVzKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogQ29tcHV0ZSB0aGUgIm9wdGltYWwiIHNpemUgZm9yIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGNyaXRlcmlhIGlzIGEKLQkgbWluaW1hbCBjaGFpbiBsZW5ndGguICBUaGUgbWlub3IgY3JpdGVyaWEgaXMgKG9mIGNvdXJzZSkgdGhlIHNpemUKLQkgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGZvciAoaSA9IG1pbnNpemU7IGkgPCBtYXhzaXplOyArK2kpCi0JewotCSAgLyogV2FsayB0aHJvdWdoIHRoZSBhcnJheSBvZiBoYXNoY29kZXMgYW5kIGNvdW50IHRoZSBjb2xsaXNpb25zLiAgKi8KLQkgIEJGRF9IT1NUX1VfNjRfQklUIG1heDsKLQkgIHVuc2lnbmVkIGxvbmcgaW50IGo7Ci0JICB1bnNpZ25lZCBsb25nIGludCBmYWN0OwotCi0JICBtZW1zZXQgKGNvdW50cywgJ1wwJywgaSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKTsKLQotCSAgLyogRGV0ZXJtaW5lIGhvdyBvZnRlbiBlYWNoIGhhc2ggYnVja2V0IGlzIHVzZWQuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyArK2opCi0JICAgICsrY291bnRzW2hhc2hjb2Rlc1tqXSAlIGldOwotCi0JICAvKiBGb3IgdGhlIHdlaWdodCBmdW5jdGlvbiB3ZSBuZWVkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICAgICBwYWdlc2l6ZSBvbiB0aGUgdGFyZ2V0LiAgVGhpcyBpcyBpbmZvcm1hdGlvbiBuZWVkIG5vdCBiZSAxMDAlCi0JICAgICBhY2N1cmF0ZS4gIFNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSAoc28gZmFyKSB3ZQotCSAgICAgZGVmaW5lIGl0IGhlcmUgdG8gYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUuICBJZiBpdCBpcyBjcnVjaWFsCi0JICAgICB0byBoYXZlIGEgYmV0dGVyIHZhbHVlIHNvbWUgZGF5IHNpbXBseSBkZWZpbmUgdGhpcyB2YWx1ZS4gICovCi0jIGlmbmRlZiBCRkRfVEFSR0VUX1BBR0VTSVpFCi0jICBkZWZpbmUgQkZEX1RBUkdFVF9QQUdFU0laRQkoNDA5NikKLSMgZW5kaWYKLQotCSAgLyogV2UgaW4gYW55IGNhc2UgbmVlZCAyICsgTlNZTVMgZW50cmllcyBmb3IgdGhlIHNpemUgdmFsdWVzIGFuZAotCSAgICAgdGhlIGNoYWlucy4gICovCi0JICBtYXggPSAoMiArIG5zeW1zKSAqIChBUkNIX1NJWkUgLyA4KTsKLQotIyBpZiAxCi0JICAvKiBWYXJpYW50IDE6IG9wdGltaXplIGZvciBzaG9ydCBjaGFpbnMuICBXZSBhZGQgdGhlIHNxdWFyZXMKLQkgICAgIG9mIGFsbCB0aGUgY2hhaW4gbGVuZ3RocyAod2hpY2ggZmF2b3VzIG1hbnkgc21hbGwgY2hhaW4KLQkgICAgIG92ZXIgYSBmZXcgbG9uZyBjaGFpbnMpLiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBpOyArK2opCi0JICAgIG1heCArPSBjb3VudHNbal0gKiBjb3VudHNbal07Ci0KLQkgIC8qIFRoaXMgYWRkcyBwZW5hbHRpZXMgZm9yIHRoZSBvdmVyYWxsIHNpemUgb2YgdGhlIHRhYmxlLiAgKi8KLQkgIGZhY3QgPSBpIC8gKEJGRF9UQVJHRVRfUEFHRVNJWkUgLyAoQVJDSF9TSVpFIC8gOCkpICsgMTsKLQkgIG1heCAqPSBmYWN0ICogZmFjdDsKLSMgZWxzZQotCSAgLyogVmFyaWFudCAyOiBPcHRpbWl6ZSBhIGxvdCBtb3JlIGZvciBzbWFsbCB0YWJsZS4gIEhlcmUgd2UKLQkgICAgIGFsc28gYWRkIHNxdWFyZXMgb2YgdGhlIHNpemUgYnV0IHdlIGFsc28gYWRkIHBlbmFsdGllcyBmb3IKLQkgICAgIGVtcHR5IHNsb3RzICh0aGUgKzEgdGVybSkuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IGk7ICsraikKLQkgICAgbWF4ICs9ICgxICsgY291bnRzW2pdKSAqICgxICsgY291bnRzW2pdKTsKLQotCSAgLyogVGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgdGFibGUgaXMgY29uc2lkZXJlZCwgYnV0IG5vdCBhcwotCSAgICAgc3Ryb25nIGFzIGluIHZhcmlhbnQgMSwgd2hlcmUgaXQgaXMgc3F1YXJlZC4gICovCi0JICBmYWN0ID0gaSAvIChCRkRfVEFSR0VUX1BBR0VTSVpFIC8gKEFSQ0hfU0laRSAvIDgpKSArIDE7Ci0JICBtYXggKj0gZmFjdDsKLSMgZW5kaWYKLQotCSAgLyogQ29tcGFyZSB3aXRoIGN1cnJlbnQgYmVzdCByZXN1bHRzLiAgKi8KLQkgIGlmIChtYXggPCBiZXN0X2NobGVuKQotCSAgICB7Ci0JICAgICAgYmVzdF9jaGxlbiA9IG1heDsKLQkgICAgICBiZXN0X3NpemUgPSBpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcmVlIChjb3VudHMpOwotICAgIH0KLSAgZWxzZQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9IT1NUX1VfNjRfQklUKSAqLwotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIGZhbGxiYWNrIHNvbHV0aW9uIGlmIG5vIDY0Yml0IHR5cGUgaXMgYXZhaWxhYmxlIG9yIGlmIHdlCi0JIGFyZSBub3Qgc3VwcG9zZWQgdG8gc3BlbmQgbXVjaCB0aW1lIG9uIG9wdGltaXphdGlvbnMuICBXZSBzZWxlY3QgdGhlCi0JIGJ1Y2tldCBjb3VudCB1c2luZyBhIGZpeGVkIHNldCBvZiBudW1iZXJzLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGVsZl9idWNrZXRzW2ldICE9IDA7IGkrKykKLQl7Ci0JICBiZXN0X3NpemUgPSBlbGZfYnVja2V0c1tpXTsKLQkgIGlmIChkeW5zeW1jb3VudCA8IGVsZl9idWNrZXRzW2kgKyAxXSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBGcmVlIHRoZSBhcnJheXMgd2UgbmVlZGVkLiAgKi8KLSAgZnJlZSAoaGFzaGNvZGVzKTsKLQotICByZXR1cm4gYmVzdF9zaXplOwotfQotCi0vKiBTZXQgdXAgdGhlIHNpemVzIGFuZCBjb250ZW50cyBvZiB0aGUgRUxGIGR5bmFtaWMgc2VjdGlvbnMuICBUaGlzIGlzCi0gICBjYWxsZWQgYnkgdGhlIEVMRiBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZQotICAgbXVzdCBzZXQgdGhlIHNpemVzIG9mIHRoZSBzZWN0aW9ucyBiZWZvcmUgdGhlIGxpbmtlciBzZXRzIHRoZQotICAgYWRkcmVzc2VzIG9mIHRoZSB2YXJpb3VzIHNlY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykgKG91dHB1dF9iZmQsIHNvbmFtZSwgcnBhdGgsCi0JCQkJICAgICBleHBvcnRfZHluYW1pYywgZmlsdGVyX3NobGliLAotCQkJCSAgICAgYXV4aWxpYXJ5X2ZpbHRlcnMsIGluZm8sIHNpbnRlcnBwdHIsCi0JCQkJICAgICB2ZXJkZWZzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcnBhdGg7Ci0gICAgIGJvb2xlYW4gZXhwb3J0X2R5bmFtaWM7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbHRlcl9zaGxpYjsKLSAgICAgY29uc3QgY2hhciAqIGNvbnN0ICphdXhpbGlhcnlfZmlsdGVyczsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICoqc2ludGVycHB0cjsKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJkZWZzOwotewotICBiZmRfc2l6ZV90eXBlIHNvbmFtZV9pbmR4OwotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLSAgc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyBhc3ZpbmZvOwotCi0gICpzaW50ZXJwcHRyID0gTlVMTDsKLQotICBzb25hbWVfaW5keCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZSBiYWNrZW5kIG1heSBoYXZlIHRvIGNyZWF0ZSBzb21lIHNlY3Rpb25zIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotICAgICB3ZSdyZSBkeW5hbWljIG9yIG5vdC4gICovCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKTsKLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgICAgICYmICEgKCpiZWQtPmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIElmIHRoZXJlIHdlcmUgbm8gZHluYW1pYyBvYmplY3RzIGluIHRoZSBsaW5rLCB0aGVyZSBpcyBub3RoaW5nIHRvCi0gICAgIGRvIGhlcmUuICAqLwotICBpZiAoZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN0cnNpemU7Ci0KLSAgICAgICpzaW50ZXJwcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLSAgICAgIEJGRF9BU1NFUlQgKCpzaW50ZXJwcHRyICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKTsKLQotICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMKQotCXsKLQkgIHNvbmFtZV9pbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgIHNvbmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoc29uYW1lX2luZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCi0JICAgICAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NPTkFNRSwgc29uYW1lX2luZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+c3ltYm9saWMpCi0JewotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1CT0xJQywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChycGF0aCAhPSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsIHJwYXRoLAotCQkJCSAgICAgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUlBBVEgsIGluZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoZmlsdGVyX3NobGliICE9IE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkgICAgIGZpbHRlcl9zaGxpYiwgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfRklMVEVSLCBpbmR4KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGF1eGlsaWFyeV9maWx0ZXJzICE9IE5VTEwpCi0JewotCSAgY29uc3QgY2hhciAqIGNvbnN0ICpwOwotCi0JICBmb3IgKHAgPSBhdXhpbGlhcnlfZmlsdGVyczsgKnAgIT0gTlVMTDsgcCsrKQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAqcCwgdHJ1ZSwgdHJ1ZSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCi0JCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0FVWElMSUFSWSwgaW5keCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHN1cHBvc2VkIHRvIGV4cG9ydCBhbGwgc3ltYm9scyBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbAotICAgICAgICAgdGFibGUgKHRoaXMgaXMgbm90IHRoZSBub3JtYWwgY2FzZSksIHRoZW4gZG8gc28uICAqLwotICAgICAgaWYgKGV4cG9ydF9keW5hbWljKQotCXsKLQkgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOwotCi0JICBlaWYuZmFpbGVkID0gZmFsc2U7Ci0JICBlaWYuaW5mbyA9IGluZm87Ci0JICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGVsZl9leHBvcnRfc3ltYm9sLAotCQkJICAgICAgICAgIChQVFIpICZlaWYpOwotCSAgaWYgKGVpZi5mYWlsZWQpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIEF0dGFjaCBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlaXIgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gICAgICBhc3ZpbmZvLm91dHB1dF9iZmQgPSBvdXRwdXRfYmZkOwotICAgICAgYXN2aW5mby5pbmZvID0gaW5mbzsKLSAgICAgIGFzdmluZm8udmVyZGVmcyA9IHZlcmRlZnM7Ci0gICAgICBhc3ZpbmZvLmV4cG9ydF9keW5hbWljID0gZXhwb3J0X2R5bmFtaWM7Ci0gICAgICBhc3ZpbmZvLmZhaWxlZCA9IGZhbHNlOwotCi0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24sCi0JCQkgICAgICAoUFRSKSAmYXN2aW5mbyk7Ci0gICAgICBpZiAoYXN2aW5mby5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGFuZCBtYWtlCi0JIHRoZSBiYWNrZW5kIHBpY2sgYSByZWFzb25hYmxlIHZhbHVlIGZvciB0aGVtLiAgKi8KLSAgICAgIGVpZi5mYWlsZWQgPSBmYWxzZTsKLSAgICAgIGVpZi5pbmZvID0gaW5mbzsKLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsCi0JCQkgICAgICAoUFRSKSAmZWlmKTsKLSAgICAgIGlmIChlaWYuZmFpbGVkKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gc29tZSBvZiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfYmZkX2ZpbmFsX2xpbmssIGJ1dCB3ZSBtdXN0IGFkZCB0aGUgZW50cmllcwotCSBub3cgc28gdGhhdCB3ZSBrbm93IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgKi8KLQotICAgICAgLyogSWYgdGhlcmUgYXJlIGluaXRpYWxpemF0aW9uIGFuZC9vciBmaW5hbGl6YXRpb24gZnVuY3Rpb25zIHRvCi0JIGNhbGwgdGhlbiBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgRFRfSU5JVC9EVF9GSU5JIGVudHJpZXMuICAqLwotICAgICAgaCA9IChpbmZvLT5pbml0X2Z1bmN0aW9uCi0JICAgPyBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICBpbmZvLT5pbml0X2Z1bmN0aW9uLCBmYWxzZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JICAgOiBOVUxMKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0lOSVQsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaCA9IChpbmZvLT5maW5pX2Z1bmN0aW9uCi0JICAgPyBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICBpbmZvLT5maW5pX2Z1bmN0aW9uLCBmYWxzZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JICAgOiBOVUxMKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0ZJTkksIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdHJzaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9IQVNILCAwKQotCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NUUlRBQiwgMCkKLQkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1UQUIsIDApCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1RSU1osIHN0cnNpemUpCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1lNRU5ULAotCQkJCSAgICAgIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGJhY2tlbmQgbXVzdCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBvdGhlciBkeW5hbWljCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gICAgICAmJiAhICgqYmVkLT5lbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpIChvdXRwdXRfYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHNpemVfdCBkeW5zeW1jb3VudDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgc2l6ZV90IGJ1Y2tldGNvdW50ID0gMDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLSAgICAgIHNpemVfdCBoYXNoX2VudHJ5X3NpemU7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb25fZCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBhZGRpdGlvbmFsIHZlcnNpb24gZGVmaW5pdGlvbnMgaWYgd2UgYXJlCi0gICAgICAgICBqdXN0IGxpbmtpbmcgYSByZWd1bGFyIGFwcGxpY2F0aW9uLiAgKi8KLSAgICAgIHZlcmRlZnMgPSBhc3ZpbmZvLnZlcmRlZnM7Ci0KLSAgICAgIGlmICh2ZXJkZWZzID09IE5VTEwpCi0JX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgY2RlZnM7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0JICBiZmRfYnl0ZSAqcDsKLQkgIEVsZl9JbnRlcm5hbF9WZXJkZWYgZGVmOwotCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggZGVmYXV4OwotCi0JICBjZGVmcyA9IDA7Ci0JICBzaXplID0gMDsKLQotCSAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIGJhc2UgdmVyc2lvbi4gICovCi0JICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgKytjZGVmczsKLQotCSAgZm9yICh0ID0gdmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbjsKLQotCSAgICAgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgICAgICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICAgICsrY2RlZnM7Ci0KLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQlzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICB9Ci0KLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBGaWxsIGluIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCi0KLQkgIHAgPSBzLT5jb250ZW50czsKLQotCSAgZGVmLnZkX3ZlcnNpb24gPSBWRVJfREVGX0NVUlJFTlQ7Ci0JICBkZWYudmRfZmxhZ3MgPSBWRVJfRkxHX0JBU0U7Ci0JICBkZWYudmRfbmR4ID0gMTsKLQkgIGRlZi52ZF9jbnQgPSAxOwotCSAgZGVmLnZkX2F1eCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBkZWYudmRfbmV4dCA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpCi0JCQkgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KSk7Ci0KLQkgIGlmIChzb25hbWVfaW5keCAhPSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIHsKLQkgICAgICBkZWYudmRfaGFzaCA9IGJmZF9lbGZfaGFzaCAoc29uYW1lKTsKLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBzb25hbWVfaW5keDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBuYW1lID0gb3V0cHV0X2JmZC0+ZmlsZW5hbWU7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKG5hbWUpOwotCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IGluZHg7Ci0JICAgIH0KLQkgIGRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAob3V0cHV0X2JmZCwgJmRlZiwKLQkJCQkgICAgKEVsZl9FeHRlcm5hbF9WZXJkZWYgKilwKTsKLQkgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJICAgICAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgcCk7Ci0JICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCi0JICBmb3IgKHQgPSB2ZXJkZWZzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGNkZXBzOwotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbjsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGNkZXBzID0gMDsKLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQkrK2NkZXBzOwotCi0JICAgICAgLyogQWRkIGEgc3ltYm9sIHJlcHJlc2VudGluZyB0aGlzIHZlcnNpb24uICAqLwotCSAgICAgIGggPSBOVUxMOwotCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgICAgIChpbmZvLCBkeW5vYmosIHQtPm5hbWUsIEJTRl9HTE9CQUwsIGJmZF9hYnNfc2VjdGlvbl9wdHIsCi0JCSAgICAgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkJICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGR5bm9iaiktPmNvbGxlY3QsCi0JCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfiBFTEZfTElOS19OT05fRUxGOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCi0JICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBkZWYudmRfdmVyc2lvbiA9IFZFUl9ERUZfQ1VSUkVOVDsKLQkgICAgICBkZWYudmRfZmxhZ3MgPSAwOwotCSAgICAgIGlmICh0LT5nbG9iYWxzID09IE5VTEwgJiYgdC0+bG9jYWxzID09IE5VTEwgJiYgISB0LT51c2VkKQotCQlkZWYudmRfZmxhZ3MgfD0gVkVSX0ZMR19XRUFLOwotCSAgICAgIGRlZi52ZF9uZHggPSB0LT52ZXJudW0gKyAxOwotCSAgICAgIGRlZi52ZF9jbnQgPSBjZGVwcyArIDE7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKHQtPm5hbWUpOwotCSAgICAgIGRlZi52ZF9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgICAgIGlmICh0LT5uZXh0ICE9IE5VTEwpCi0JCWRlZi52ZF9uZXh0ID0gKHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZikKLQkJCSAgICAgICArIChjZGVwcyArIDEpICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCkpOwotCSAgICAgIGVsc2UKLQkJZGVmLnZkX25leHQgPSAwOwotCi0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0IChvdXRwdXRfYmZkLCAmZGVmLAotCQkJCQkoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSBwKTsKLQkgICAgICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0KLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBoLT5keW5zdHJfaW5kZXg7Ci0JICAgICAgaWYgKHQtPmRlcHMgPT0gTlVMTCkKLQkJZGVmYXV4LnZkYV9uZXh0ID0gMDsKLQkgICAgICBlbHNlCi0JCWRlZmF1eC52ZGFfbmV4dCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICAgIHQtPm5hbWVfaW5keCA9IGRlZmF1eC52ZGFfbmFtZTsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJCSAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgcCk7Ci0JICAgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCSAgICAgIGZvciAobiA9IHQtPmRlcHM7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JCXsKLQkJICBpZiAobi0+dmVyc2lvbl9uZWVkZWQgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUKLQkJCSB2ZXJzaW9uIHNjcmlwdC4gICovCi0JCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZGVmYXV4LnZkYV9uYW1lID0gbi0+dmVyc2lvbl9uZWVkZWQtPm5hbWVfaW5keDsKLQkJICBpZiAobi0+bmV4dCA9PSBOVUxMKQotCQkgICAgZGVmYXV4LnZkYV9uZXh0ID0gMDsKLQkJICBlbHNlCi0JCSAgICBkZWZhdXgudmRhX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCQkgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCQkgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUkRFRiwgMCkKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSREVGTlVNLCBjZGVmcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcmRlZnMgPSBjZGVmczsKLQl9Ci0KLSAgICAgIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSB2ZXJzaW9uIHJlZmVyZW5jZSBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb25fciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHsKLQlzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gc2luZm87Ci0KLQlzaW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLQlzaW5mby5pbmZvID0gaW5mbzsKLQlzaW5mby52ZXJzID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcmRlZnM7Ci0JaWYgKHNpbmZvLnZlcnMgPT0gMCkKLQkgIHNpbmZvLnZlcnMgPSAxOwotCXNpbmZvLmZhaWxlZCA9IGZhbHNlOwotCi0JZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCWVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMsCi0JCQkJKFBUUikgJnNpbmZvKTsKLQotCWlmIChlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWYgPT0gTlVMTCkKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAoaW5mbywgcyk7Ci0JZWxzZQotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQkgICAgdW5zaWduZWQgaW50IHNpemU7Ci0JICAgIHVuc2lnbmVkIGludCBjcmVmczsKLQkgICAgYmZkX2J5dGUgKnA7Ci0KLQkgICAgLyogQnVpbGQgdGhlIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KLQkgICAgc2l6ZSA9IDA7Ci0JICAgIGNyZWZzID0gMDsKLQkgICAgZm9yICh0ID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmOwotCQkgdCAhPSBOVUxMOwotCQkgdCA9IHQtPnZuX25leHRyZWYpCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCQlzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOwotCQkrK2NyZWZzOwotCQlmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCk7Ci0JICAgICAgfQotCi0JICAgIHMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc2l6ZSk7Ci0JICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBwID0gcy0+Y29udGVudHM7Ci0JICAgIGZvciAodCA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnZlcnJlZjsKLQkJIHQgIT0gTlVMTDsKLQkJIHQgPSB0LT52bl9uZXh0cmVmKQotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IGNhdXg7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCQliZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJY2F1eCA9IDA7Ci0JCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgKytjYXV4OwotCi0JCXQtPnZuX3ZlcnNpb24gPSBWRVJfTkVFRF9DVVJSRU5UOwotCQl0LT52bl9jbnQgPSBjYXV4OwotCQlpZiAoZWxmX2R0X25hbWUgKHQtPnZuX2JmZCkgIT0gTlVMTCkKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICBlbGZfZHRfbmFtZSAodC0+dm5fYmZkKSwKLQkJCQkJICAgICB0cnVlLCBmYWxzZSk7Ci0JCWVsc2UKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICB0LT52bl9iZmQtPmZpbGVuYW1lLCB0cnVlLCBmYWxzZSk7Ci0JCWlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXQtPnZuX2ZpbGUgPSBpbmR4OwotCQl0LT52bl9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKTsKLQkJaWYgKHQtPnZuX25leHRyZWYgPT0gTlVMTCkKLQkJICB0LT52bl9uZXh0ID0gMDsKLQkJZWxzZQotCQkgIHQtPnZuX25leHQgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmVlZCkKLQkJCQkrIGNhdXggKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KSk7Ci0KLQkJX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCAob3V0cHV0X2JmZCwgdCwKLQkJCQkJICAgKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIHApOwotCQlwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOwotCi0JCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgewotCQkgICAgYS0+dm5hX2hhc2ggPSBiZmRfZWxmX2hhc2ggKGEtPnZuYV9ub2RlbmFtZSk7Ci0JCSAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICAgIGEtPnZuYV9ub2RlbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCQkgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBhLT52bmFfbmFtZSA9IGluZHg7Ci0JCSAgICBpZiAoYS0+dm5hX25leHRwdHIgPT0gTlVMTCkKLQkJICAgICAgYS0+dm5hX25leHQgPSAwOwotCQkgICAgZWxzZQotCQkgICAgICBhLT52bmFfbmV4dCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5hdXgpOwotCi0JCSAgICBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0IChvdXRwdXRfYmZkLCBhLAotCQkJCQkgICAgICAgKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopIHApOwotCQkgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSTkVFRCwgMCkKLQkJfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUk5FRUROVU0sIGNyZWZzKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcnJlZnMgPSBjcmVmczsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgLyogQXNzaWduIGR5bnN5bSBpbmRpY2llcy4gIEluIGEgc2hhcmVkIGxpYnJhcnkgd2UgZ2VuZXJhdGUgYSAKLQkgc2VjdGlvbiBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24sIHdoaWNoIGNvbWUgZmlyc3QuCi0JIE5leHQgY29tZSBhbGwgb2YgdGhlIGJhY2stZW5kIGFsbG9jYXRlZCBsb2NhbCBkeW5hbWljIHN5bXMsCi0JIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0KLSAgICAgIGR5bnN5bWNvdW50ID0gX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zIChvdXRwdXRfYmZkLCBpbmZvKTsKLQotICAgICAgLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB2ZXJzaW9uIHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAoZHluc3ltY291bnQgPT0gMAotCSAgfHwgKHZlcmRlZnMgPT0gTlVMTCAmJiBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWYgPT0gTlVMTCkpCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzKTsKLQkgIC8qIFRoZSBEWU5TWU1DT1VOVCBtaWdodCBoYXZlIGNoYW5nZWQgaWYgd2Ugd2VyZSBnb2luZyB0bwotCSAgICAgb3V0cHV0IGEgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cnkgZm9yIFMuICAqLwotCSAgZHluc3ltY291bnQgPSBfYmZkX2VsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMgKG91dHB1dF9iZmQsIGluZm8pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSk7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJTWU0sIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5keW5zeW0gYW5kIC5oYXNoIHNlY3Rpb25zLiAgV2UgY291bnRlZAotCSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyBpbiBlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMuCi0JIFdlIHdpbGwgYnVpbGQgdGhlIGNvbnRlbnRzIG9mIC5keW5zeW0gYW5kIC5oYXNoIHdoZW4gd2UgYnVpbGQKLQkgdGhlIGZpbmFsIHN5bWJvbCB0YWJsZSwgYmVjYXVzZSB1bnRpbCB0aGVuIHdlIGRvIG5vdCBrbm93IHRoZQotCSBjb3JyZWN0IHZhbHVlIHRvIGdpdmUgdGhlIHN5bWJvbHMuICBXZSBidWlsdCB0aGUgLmR5bnN0cgotCSBzZWN0aW9uIGFzIHdlIHdlbnQgYWxvbmcgaW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGR5bnN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIC5keW5zeW0gaXMgYSBkdW1teSBzeW1ib2wuICAqLwotICAgICAgaXN5bS5zdF92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLnN0X3NpemUgPSAwOwotICAgICAgaXN5bS5zdF9uYW1lID0gMDsKLSAgICAgIGlzeW0uc3RfaW5mbyA9IDA7Ci0gICAgICBpc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGlzeW0uc3Rfc2huZHggPSAwOwotICAgICAgZWxmX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJmlzeW0sCi0JCQkgICAoUFRSKSAoRWxmX0V4dGVybmFsX1N5bSAqKSBzLT5jb250ZW50cyk7Ci0KLSAgICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGhhc2hpbmcgdGFibGUuICBBcyBhIHNpZGUgZWZmZWN0IHRoaXMKLQkgY29tcHV0ZXMgdGhlIGhhc2ggdmFsdWVzIGZvciBhbGwgdGhlIG5hbWVzIHdlIGV4cG9ydC4gICovCi0gICAgICBidWNrZXRjb3VudCA9IGNvbXB1dGVfYnVja2V0X2NvdW50IChpbmZvKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGhhc2hfZW50cnlfc2l6ZSA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplOwotICAgICAgcy0+X3Jhd19zaXplID0gKCgyICsgYnVja2V0Y291bnQgKyBkeW5zeW1jb3VudCkgKiBoYXNoX2VudHJ5X3NpemUpOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLQotICAgICAgYmZkX3B1dCAoOCAqIGhhc2hfZW50cnlfc2l6ZSwgb3V0cHV0X2JmZCwgYnVja2V0Y291bnQsIHMtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXQgKDggKiBoYXNoX2VudHJ5X3NpemUsIG91dHB1dF9iZmQsIGR5bnN5bWNvdW50LCAKLQkgICAgICAgcy0+Y29udGVudHMgKyBoYXNoX2VudHJ5X3NpemUpOwotCi0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50ID0gYnVja2V0Y291bnQ7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKLQotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9OVUxMLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRml4IHVwIHRoZSBmbGFncyBmb3IgYSBzeW1ib2wuICBUaGlzIGhhbmRsZXMgdmFyaW91cyBjYXNlcyB3aGljaAotICAgY2FuIG9ubHkgYmUgZml4ZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBhcmUgc2Vlbi4gIFRoaXMgaXMKLSAgIGN1cnJlbnRseSBjYWxsZWQgYnkgYm90aCBhZGp1c3RfZHluYW1pY19zeW1ib2wgYW5kCi0gICBhc3NpZ25fc3ltX3ZlcnNpb24sIHdoaWNoIGlzIHVubmVjZXNzYXJ5IGJ1dCBwZXJoYXBzIG1vcmUgcm9idXN0IGluCi0gICB0aGUgZmFjZSBvZiBmdXR1cmUgY2hhbmdlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgZWlmKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmOwotewotICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgbWVudGlvbmVkIGluIGEgbm9uLUVMRiBmaWxlLCB0cnkgdG8gc2V0Ci0gICAgIERFRl9SRUdVTEFSIGFuZCBSRUZfUkVHVUxBUiBjb3JyZWN0bHkuICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0bwotICAgICBwZXJtaXQgYSBub24tRUxGIGZpbGUgdG8gY29ycmVjdGx5IHJlZmVyIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4KLSAgICAgYW4gRUxGIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfTk9OX0VMRikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKTsKLQkgIGVsc2UKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCX0KLQotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEKLQkgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChlaWYtPmluZm8sIGgpKQotCSAgICB7Ci0JICAgICAgZWlmLT5mYWlsZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBVbmZvcnR1bmF0ZWx5LCBFTEZfTElOS19OT05fRUxGIGlzIG9ubHkgY29ycmVjdCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhIG5vbi1FTEYgZmlsZS4gIEZvcnR1bmF0ZWx5LCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhbiBFTEYgZmlsZSwgd2UncmUgcHJvYmFibHkgT0sgdW5sZXNzIHRoZQotICAgICAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgbm9uLUVMRiBmaWxlLiAgQ2F0Y2ggdGhhdCBjYXNlIGhlcmUuCi0gICAgICAgICBGSVhNRTogV2UncmUgc3RpbGwgaW4gdHJvdWJsZSBpZiB0aGUgc3ltYm9sIHdhcyBmaXJzdCBzZWVuIGluCi0gICAgICAgICBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhlbiBsYXRlciBpbiBhIG5vbi1FTEYgcmVndWxhciBvYmplY3QuICAqLwotICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCSAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgICAgID8gKGJmZF9nZXRfZmxhdm91ciAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcikKLQkJICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgICAgOiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JCSAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMCkpKQotCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIGFuZCB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbgotICAgICBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvcgotICAgICB0aGUgc3ltYm9sIGluIGEgY29tbW9uIHNlY3Rpb24gYnV0IHRoZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0gICAgIGZsYWcgd2lsbCBub3QgaGF2ZSBiZWVuIHNldC4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQotICAvKiBJZiAtQnN5bWJvbGljIHdhcyB1c2VkICh3aGljaCBtZWFucyB0byBiaW5kIHJlZmVyZW5jZXMgdG8gZ2xvYmFsCi0gICAgIHN5bWJvbHMgdG8gdGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgb2JqZWN0KSwgYW5kIHRoaXMKLSAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QsIHRoZW4gaXQgYWN0dWFsbHkgZG9lc24ndAotICAgICBuZWVkIGEgUExUIGVudHJ5LiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKLSAgICAgICYmIGVpZi0+aW5mby0+c2hhcmVkCi0gICAgICAmJiBlaWYtPmluZm8tPnN5bWJvbGljCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0gICAgICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbmVkIHN5bWJvbCBpbiBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2Uga25vdwotICAgICB0aGUgcmVhbCBkZWZpbml0aW9uIGluIHRoZSBkeW5hbWljIG9iamVjdCwgY29weSBpbnRlcmVzdGluZyBmbGFncwotICAgICBvdmVyIHRvIHRoZSByZWFsIGRlZmluaXRpb24uICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp3ZWFrZGVmOwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICB3ZWFrZGVmID0gaC0+d2Vha2RlZjsKLSAgICAgIEJGRF9BU1NFUlQgKHdlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCB3ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIEJGRF9BU1NFUlQgKHdlYWtkZWYtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKTsKLQotICAgICAgLyogSWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSwKLQkgZG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbC4gIFNlZSB0aGUgbG9uZ2VyIGRlc2NyaXB0aW9uIGluCi0JIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsIGJlbG93LiAgKi8KLSAgICAgIGlmICgod2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0JaC0+d2Vha2RlZiA9IE5VTEw7Ci0gICAgICBlbHNlCi0Jd2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PQotCSAgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkgICAmIChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JICAgICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUsKLQkgICAgICB8IEVMRl9MSU5LX05PTl9HT1RfUkVGKSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIHRoZSBiYWNrZW5kIHBpY2sgYSBnb29kIHZhbHVlIGZvciBhIGR5bmFtaWMgc3ltYm9sLiAgVGhpcyBpcwotICAgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLCBhbmQgYWxzbyBjYWxscyBpdHNlbGYKLSAgIHJlY3Vyc2l2ZWx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmID0gKHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikgZGF0YTsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgLyogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuICBUaGVzZSBhcmUgYWRkZWQgYnkgdGhlIHZlcnNpb25pbmcgY29kZS4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXggdGhlIHN5bWJvbCBmbGFncy4gICovCi0gIGlmICghIGVsZl9maXhfc3ltYm9sX2ZsYWdzIChoLCBlaWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgUExUIGVudHJ5LCBhbmQgaXQgaXMgbm90Ci0gICAgIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgb3IgaXMgbm90IHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyCi0gICAgIG9iamVjdCwgaWdub3JlIGl0LiAgV2UgZG8gaGF2ZSB0byBoYW5kbGUgYSB3ZWFrIGRlZmluZWQgc3ltYm9sLAotICAgICBldmVuIGlmIG5vIHJlZ3VsYXIgb2JqZWN0IHJlZmVycyB0byBpdCwgaWYgd2UgZGVjaWRlZCB0byBhZGQgaXQKLSAgICAgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgRklYTUU6IERvIHdlIG5vcm1hbGx5IG5lZWQgdG8gd29ycnkKLSAgICAgYWJvdXQgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBieSBvbmUgZHluYW1pYyBvYmplY3QgYW5kCi0gICAgIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBvbmU/ICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgPT0gMAotICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMAotCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwCi0JICAgICAgJiYgKGgtPndlYWtkZWYgPT0gTlVMTCB8fCBoLT53ZWFrZGVmLT5keW5pbmR4ID09IC0xKSkpKQotICAgIHsKLSAgICAgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UndmUgYWxyZWFkeSBhZGp1c3RlZCB0aGlzIHN5bWJvbCwgZG9uJ3QgZG8gaXQgYWdhaW4uICBUaGlzCi0gICAgIGNhbiBoYXBwZW4gdmlhIGEgcmVjdXJzaXZlIGNhbGwuICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RZTkFNSUNfQURKVVNURUQpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRG9uJ3QgbG9vayBhdCB0aGlzIHN5bWJvbCBhZ2Fpbi4gIE5vdGUgdGhhdCB3ZSBtdXN0IHNldCB0aGlzCi0gICAgIGFmdGVyIGNoZWNraW5nIHRoZSBhYm92ZSBjb25kaXRpb25zLCBiZWNhdXNlIHdlIG1heSBsb29rIGF0IGEKLSAgICAgc3ltYm9sIG9uY2UsIGRlY2lkZSBub3QgdG8gZG8gYW55dGhpbmcsIGFuZCB0aGVuIGdldCBjYWxsZWQKLSAgICAgcmVjdXJzaXZlbHkgbGF0ZXIgYWZ0ZXIgUkVGX1JFR1VMQVIgaXMgc2V0IGJlbG93LiAgKi8KLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RZTkFNSUNfQURKVVNURUQ7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgZGVmaW5pdGlvbiwgYW5kIHdlIGtub3cgYSByZWFsIGRlZmluaXRpb24sIGFuZAotICAgICB0aGUgcmVhbCBzeW1ib2wgaXMgbm90IGl0c2VsZiBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSwKLSAgICAgdGhlbiBnZXQgYSBnb29kIHZhbHVlIGZvciB0aGUgcmVhbCBkZWZpbml0aW9uLiAgV2UgaGFuZGxlIHRoZQotICAgICByZWFsIHN5bWJvbCBmaXJzdCwgZm9yIHRoZSBjb252ZW5pZW5jZSBvZiB0aGUgYmFja2VuZCByb3V0aW5lLgotCi0gICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGNvbmZ1c2luZyBjYXNlIGhlcmUuICBJZiB0aGUgcmVhbCBkZWZpbml0aW9uCi0gICAgIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlLCB3ZSBkb24ndCBnZXQgdGhlIHJlYWwgc3ltYm9sCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UgZG8gZ2V0IHRoZSB3ZWFrIHN5bWJvbC4gIElmIHRoZQotICAgICBwcm9jZXNzb3IgYmFja2VuZCB1c2VzIGEgQ09QWSByZWxvYywgdGhlbiBpZiBzb21lIHJvdXRpbmUgaW4gdGhlCi0gICAgIGR5bmFtaWMgb2JqZWN0IGNoYW5nZXMgdGhlIHJlYWwgc3ltYm9sLCB3ZSB3aWxsIG5vdCBzZWUgdGhhdAotICAgICBjaGFuZ2UgaW4gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBzeW1ib2wuICBUaGlzIGlzIHRoZSB3YXkgb3RoZXIKLSAgICAgRUxGIGxpbmtlcnMgd29yayBhcyB3ZWxsLCBhbmQgc2VlbXMgdG8gYmUgYSByZXN1bHQgb2YgdGhlIHNoYXJlZAotICAgICBsaWJyYXJ5IG1vZGVsLgotCi0gICAgIEkgd2lsbCBjbGFyaWZ5IHRoaXMgaXNzdWUuICBNb3N0IFNWUjQgc2hhcmVkIGxpYnJhcmllcyBkZWZpbmUgdGhlCi0gICAgIHZhcmlhYmxlIF90aW1lem9uZSBhbmQgZGVmaW5lIHRpbWV6b25lIGFzIGEgd2VhayBzeW5vbnltLiAgVGhlCi0gICAgIHR6c2V0IGNhbGwgY2hhbmdlcyBfdGltZXpvbmUuICBJZiB5b3Ugd3JpdGUKLSAgICAgICBleHRlcm4gaW50IHRpbWV6b25lOwotICAgICAgIGludCBfdGltZXpvbmUgPSA1OwotICAgICAgIGludCBtYWluICgpIHsgdHpzZXQgKCk7IHByaW50ZiAoIiVkICVkXG4iLCB0aW1lem9uZSwgX3RpbWV6b25lKTsgfQotICAgICB5b3UgbWlnaHQgZXhwZWN0IHRoYXQsIHNpbmNlIHRpbWV6b25lIGlzIGEgc3lub255bSBmb3IgX3RpbWV6b25lLAotICAgICB0aGUgc2FtZSBudW1iZXIgd2lsbCBwcmludCBib3RoIHRpbWVzLiAgSG93ZXZlciwgaWYgdGhlIHByb2Nlc3NvcgotICAgICBiYWNrZW5kIHVzZXMgYSBDT1BZIHJlbG9jLCB0aGVuIGFjdHVhbGx5IHRpbWV6b25lIHdpbGwgYmUgY29waWVkCi0gICAgIGludG8geW91ciBwcm9jZXNzIGltYWdlLCBhbmQsIHNpbmNlIHlvdSBkZWZpbmUgX3RpbWV6b25lCi0gICAgIHlvdXJzZWxmLCBfdGltZXpvbmUgd2lsbCBub3QuICBUaHVzIHRpbWV6b25lIGFuZCBfdGltZXpvbmUgd2lsbAotICAgICB3aW5kIHVwIGF0IGRpZmZlcmVudCBtZW1vcnkgbG9jYXRpb25zLiAgVGhlIHR6c2V0IGNhbGwgd2lsbCBzZXQKLSAgICAgX3RpbWV6b25lLCBsZWF2aW5nIHRpbWV6b25lIHVuY2hhbmdlZC4gICovCi0KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBnZXQgdG8gdGhpcyBwb2ludCwgd2Uga25vdyB0aGVyZSBpcyBhbiBpbXBsaWNpdAotCSByZWZlcmVuY2UgYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlIHZpYSB0aGUgd2VhayBzeW1ib2wgSC4KLQkgRklYTUU6IElzIHRoaXMgcmVhbGx5IHRydWU/ICBXaGF0IGlmIHRoZSB0cmF2ZXJzYWwgZmluZHMKLQkgSC0+V0VBS0RFRiBiZWZvcmUgaXQgZmluZHMgSD8gICovCi0gICAgICBoLT53ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0KLSAgICAgIGlmICghIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGgtPndlYWtkZWYsIChQVFIpIGVpZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiBhIHN5bWJvbCBoYXMgbm8gdHlwZSBhbmQgbm8gc2l6ZSBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIFBMVAotICAgICBlbnRyeSwgdGhlbiB3ZSBhcmUgcHJvYmFibHkgYWJvdXQgdG8gZG8gdGhlIHdyb25nIHRoaW5nIGhlcmU6IHdlCi0gICAgIGFyZSBwcm9iYWJseSBnb2luZyB0byBjcmVhdGUgYSBDT1BZIHJlbG9jIGZvciBhbiBlbXB0eSBvYmplY3QuCi0gICAgIFRoaXMgY2FzZSBjYW4gYXJpc2Ugd2hlbiBhIHNoYXJlZCBvYmplY3QgaXMgYnVpbHQgd2l0aCBhc3NlbWJseQotICAgICBjb2RlLCBhbmQgdGhlIGFzc2VtYmx5IGNvZGUgZmFpbHMgdG8gc2V0IHRoZSBzeW1ib2wgdHlwZS4gICovCi0gIGlmIChoLT5zaXplID09IDAKLSAgICAgICYmIGgtPnR5cGUgPT0gU1RUX05PVFlQRQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgPT0gMCkKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgIChfKCJ3YXJuaW5nOiB0eXBlIGFuZCBzaXplIG9mIGR5bmFtaWMgc3ltYm9sIGAlcycgYXJlIG5vdCBkZWZpbmVkIiksCi0JIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChlaWYtPmluZm8pLT5keW5vYmo7Ci0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopOwotICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKSAoZWlmLT5pbmZvLCBoKSkKLSAgICB7Ci0gICAgICBlaWYtPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gZXhwb3J0IGFsbCBkZWZpbmVkIHN5bWJvbHMgaW50byB0aGUgZHluYW1pYwotICAgc3ltYm9sIHRhYmxlLiAgSXQgaXMgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9leHBvcnRfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZiA9IChzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICopIGRhdGE7Ci0KLSAgLyogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuICBUaGVzZSBhcmUgYWRkZWQgYnkgdGhlIHZlcnNpb25pbmcgY29kZS4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+ZHluaW5keCA9PSAtMQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkgICYgKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoZWlmLT5pbmZvLCBoKSkKLQl7Ci0JICBlaWYtPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBpbiBvdGhlciBzaGFyZWQKLSAgIGxpYnJhcmllcyBhbmQgcmVmZXJlbmNlZCBoZXJlLiAgVXBkYXRlIHRoZSBsaXN0IG9mIHZlcnNpb24KLSAgIGRlcGVuZGVuY2llcy4gIFRoaXMgd2lsbCBiZSBwdXQgaW50byB0aGUgLmdudS52ZXJzaW9uX3Igc2VjdGlvbi4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvICpyaW5mbyA9IChzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gKikgZGF0YTsKLSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7Ci0gIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCi0gIC8qIFdlIG9ubHkgY2FyZSBhYm91dCBzeW1ib2xzIGRlZmluZWQgaW4gc2hhcmVkIG9iamVjdHMgd2l0aCB2ZXJzaW9uCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwCi0gICAgICB8fCBoLT5keW5pbmR4ID09IC0xCi0gICAgICB8fCBoLT52ZXJpbmZvLnZlcmRlZiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSBpZiB3ZSBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgZm9yICh0ID0gZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dm5fbmV4dHJlZikKLSAgICB7Ci0gICAgICBpZiAodC0+dm5fYmZkICE9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9iZmQpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JaWYgKGEtPnZuYV9ub2RlbmFtZSA9PSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfbm9kZW5hbWUpCi0JICByZXR1cm4gdHJ1ZTsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSBuZXcgdmVyc2lvbi4gIEFkZCBpdCB0byB0cmVlIHdlIGFyZSBidWlsZGluZy4gICovCi0KLSAgaWYgKHQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB0ID0gKEVsZl9JbnRlcm5hbF9WZXJuZWVkICopIGJmZF96YWxsb2MgKHJpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKnQpOwotICAgICAgaWYgKHQgPT0gTlVMTCkKLQl7Ci0JICByaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHQtPnZuX2JmZCA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9iZmQ7Ci0gICAgICB0LT52bl9uZXh0cmVmID0gZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZjsKLSAgICAgIGVsZl90ZGF0YSAocmluZm8tPm91dHB1dF9iZmQpLT52ZXJyZWYgPSB0OwotICAgIH0KLQotICBhID0gKEVsZl9JbnRlcm5hbF9WZXJuYXV4ICopIGJmZF96YWxsb2MgKHJpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKmEpOwotCi0gIC8qIE5vdGUgdGhhdCB3ZSBhcmUgY29weWluZyBhIHN0cmluZyBwb2ludGVyIGhlcmUsIGFuZCB0ZXN0aW5nIGl0Ci0gICAgIGFib3ZlLiAgSWYgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiBpcyBldmVyIGNoYW5nZWQgdG8KLSAgICAgZGlzY2FyZCB0aGUgc3RyaW5nIGRhdGEgd2hlbiBsb3cgaW4gbWVtb3J5LCB0aGlzIHdpbGwgaGF2ZSB0byBiZQotICAgICBmaXhlZC4gICovCi0gIGEtPnZuYV9ub2RlbmFtZSA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9ub2RlbmFtZTsKLQotICBhLT52bmFfZmxhZ3MgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZmxhZ3M7Ci0gIGEtPnZuYV9uZXh0cHRyID0gdC0+dm5fYXV4cHRyOwotCi0gIGgtPnZlcmluZm8udmVyZGVmLT52ZF9leHBfcmVmbm8gPSByaW5mby0+dmVyczsKLSAgKytyaW5mby0+dmVyczsKLQotICBhLT52bmFfb3RoZXIgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZXhwX3JlZm5vICsgMTsKLQotICB0LT52bl9hdXhwdHIgPSBhOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaWd1cmUgb3V0IGFwcHJvcHJpYXRlIHZlcnNpb25zIGZvciBhbGwgdGhlIHN5bWJvbHMuICBXZSBtYXkgbm90Ci0gICBoYXZlIHRoZSB2ZXJzaW9uIG51bWJlciBzY3JpcHQgdW50aWwgd2UgaGF2ZSByZWFkIGFsbCBvZiB0aGUgaW5wdXQKLSAgIGZpbGVzLCBzbyB1bnRpbCB0aGF0IHBvaW50IHdlIGRvbid0IGtub3cgd2hpY2ggc3ltYm9scyBzaG91bGQgYmUKLSAgIGxvY2FsLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8gKnNpbmZvID0KLSAgICAoc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IHNpbmZvLT5pbmZvOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkIGVpZjsKLSAgY2hhciAqcDsKLQotICAvKiBGaXggdGhlIHN5bWJvbCBmbGFncy4gICovCi0gIGVpZi5mYWlsZWQgPSBmYWxzZTsKLSAgZWlmLmluZm8gPSBpbmZvOwotICBpZiAoISBlbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgJmVpZikpCi0gICAgewotICAgICAgaWYgKGVpZi5mYWlsZWQpCi0Jc2luZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIG9ubHkgbmVlZCB2ZXJzaW9uIG51bWJlcnMgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiByZWd1bGFyCi0gICAgIG9iamVjdHMuICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChzaW5mby0+b3V0cHV0X2JmZCk7Ci0gIHAgPSBzdHJjaHIgKGgtPnJvb3Qucm9vdC5zdHJpbmcsIEVMRl9WRVJfQ0hSKTsKLSAgaWYgKHAgIT0gTlVMTCAmJiBoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0gICAgICBib29sZWFuIGhpZGRlbjsKLQotICAgICAgaGlkZGVuID0gdHJ1ZTsKLQotICAgICAgLyogVGhlcmUgYXJlIHR3byBjb25zZWN1dGl2ZSBFTEZfVkVSX0NIUiBjaGFyYWN0ZXJzIGlmIHRoaXMgaXMKLSAgICAgICAgIG5vdCBhIGhpZGRlbiBzeW1ib2wuICAqLwotICAgICAgKytwOwotICAgICAgaWYgKCpwID09IEVMRl9WRVJfQ0hSKQotCXsKLQkgIGhpZGRlbiA9IGZhbHNlOwotCSAgKytwOwotCX0KLQotICAgICAgLyogSWYgdGhlcmUgaXMgbm8gdmVyc2lvbiBzdHJpbmcsIHdlIGNhbiBqdXN0IHJldHVybiBvdXQuICAqLwotICAgICAgaWYgKCpwID09ICdcMCcpCi0JewotCSAgaWYgKGhpZGRlbikKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19ISURERU47Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIHRoZSB2ZXJzaW9uLiAgSWYgd2UgZmluZCBpdCwgaXQgaXMgbm8gbG9uZ2VyIHdlYWsuICAqLwotICAgICAgZm9yICh0ID0gc2luZm8tPnZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgaWYgKHN0cmNtcCAodC0+bmFtZSwgcCkgPT0gMCkKLQkgICAgewotCSAgICAgIGludCBsZW47Ci0JICAgICAgY2hhciAqYWxjOwotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZDsKLQotCSAgICAgIGxlbiA9IHAgLSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIGFsYyA9IGJmZF9hbGxvYyAoc2luZm8tPm91dHB1dF9iZmQsIGxlbik7Ci0JICAgICAgaWYgKGFsYyA9PSBOVUxMKQotCSAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgIHN0cm5jcHkgKGFsYywgaC0+cm9vdC5yb290LnN0cmluZywgbGVuIC0gMSk7Ci0JICAgICAgYWxjW2xlbiAtIDFdID0gJ1wwJzsKLQkgICAgICBpZiAoYWxjW2xlbiAtIDJdID09IEVMRl9WRVJfQ0hSKQotCSAgICAgICAgYWxjW2xlbiAtIDJdID0gJ1wwJzsKLQotCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JICAgICAgdC0+dXNlZCA9IHRydWU7Ci0JICAgICAgZCA9IE5VTEw7Ci0KLQkgICAgICBpZiAodC0+Z2xvYmFscyAhPSBOVUxMKQotCQl7Ci0JCSAgZm9yIChkID0gdC0+Z2xvYmFsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJICAgIGlmICgoKmQtPm1hdGNoKSAoZCwgYWxjKSkKLQkJICAgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBmb3JjZSB0aGlzIHN5bWJvbCB0bwotICAgICAgICAgICAgICAgICBsb2NhbCBzY29wZS4gICovCi0JICAgICAgaWYgKGQgPT0gTlVMTCAmJiB0LT5sb2NhbHMgIT0gTlVMTCkKLQkJewotCQkgIGZvciAoZCA9IHQtPmxvY2FsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCgqZC0+bWF0Y2gpIChkLCBhbGMpKQotCQkJewotCQkJICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCQkJICAgICAgJiYgaW5mby0+c2hhcmVkCi0JCQkgICAgICAmJiAhIHNpbmZvLT5leHBvcnRfZHluYW1pYykKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTDsKLQkJCSAgICAgICgqYmVkLT5lbGZfYmFja2VuZF9oaWRlX3N5bWJvbCkgKGgpOwotCQkJICAgICAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzCi0JCQkJIGFscmVhZHkgYmVlbiByZWNvcmRlZCBpbiB0aGUgZHluYW1pYwotCQkJCSBzdHJpbmcgdGFibGUgc2VjdGlvbi4gICovCi0JCQkgICAgfQotCi0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfcmVsZWFzZSAoc2luZm8tPm91dHB1dF9iZmQsIGFsYyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiwgd2UgbmVlZCB0byBjcmVhdGUgYQotICAgICAgICAgdmVyc2lvbiBub2RlIGZvciB0aGlzIHZlcnNpb24uICAqLwotICAgICAgaWYgKHQgPT0gTlVMTCAmJiAhIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKipwcDsKLQkgIGludCB2ZXJzaW9uX2luZGV4OwotCi0JICAvKiBJZiB3ZSBhcmVuJ3QgZ29pbmcgdG8gZXhwb3J0IHRoaXMgc3ltYm9sLCB3ZSBkb24ndCBuZWVkCi0gICAgICAgICAgICAgdG8gd29ycnkgYWJvdXQgaXQuICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgcmV0dXJuIHRydWU7Ci0KLQkgIHQgPSAoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKQotCSAgICAgICBiZmRfYWxsb2MgKHNpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKnQpKTsKLQkgIGlmICh0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgdC0+bmV4dCA9IE5VTEw7Ci0JICB0LT5uYW1lID0gcDsKLQkgIHQtPmdsb2JhbHMgPSBOVUxMOwotCSAgdC0+bG9jYWxzID0gTlVMTDsKLQkgIHQtPmRlcHMgPSBOVUxMOwotCSAgdC0+bmFtZV9pbmR4ID0gKHVuc2lnbmVkIGludCkgLTE7Ci0JICB0LT51c2VkID0gdHJ1ZTsKLQotCSAgdmVyc2lvbl9pbmRleCA9IDE7Ci0JICBmb3IgKHBwID0gJnNpbmZvLT52ZXJkZWZzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JICAgICsrdmVyc2lvbl9pbmRleDsKLQkgIHQtPnZlcm51bSA9IHZlcnNpb25faW5kZXg7Ci0KLQkgICpwcCA9IHQ7Ci0KLQkgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JfQotICAgICAgZWxzZSBpZiAodCA9PSBOVUxMKQotCXsKLQkgIC8qIFdlIGNvdWxkIG5vdCBmaW5kIHRoZSB2ZXJzaW9uIGZvciBhIHN5bWJvbCB3aGVuCi0gICAgICAgICAgICAgZ2VuZXJhdGluZyBhIHNoYXJlZCBhcmNoaXZlLiAgUmV0dXJuIGFuIGVycm9yLiAgKi8KLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVuZGVmaW5lZCB2ZXJzaW9uZWQgc3ltYm9sIG5hbWUgJXMiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHNpbmZvLT5vdXRwdXRfYmZkKSwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHNpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGhpZGRlbikKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hJRERFTjsKLSAgICB9Ci0KLSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHZlcnNpb24gZm9yIHRoaXMgc3ltYm9sLCBzZWUgaWYgd2UgY2FuIGZpbmQKLSAgICAgc29tZXRoaW5nLiAgKi8KLSAgaWYgKGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMICYmIHNpbmZvLT52ZXJkZWZzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp0OwotICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpkZWZsdDsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZDsKLQotICAgICAgLyogU2VlIGlmIGNhbiBmaW5kIHdoYXQgdmVyc2lvbiB0aGlzIHN5bWJvbCBpcyBpbi4gIElmIHRoZQotICAgICAgICAgc3ltYm9sIGlzIHN1cHBvc2VkIHRvIGJlIGxvY2FsLCB0aGVuIGRvbid0IGFjdHVhbGx5IHJlZ2lzdGVyCi0gICAgICAgICBpdC4gICovCi0gICAgICBkZWZsdCA9IE5VTEw7Ci0gICAgICBmb3IgKHQgPSBzaW5mby0+dmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQl7Ci0JICBpZiAodC0+Z2xvYmFscyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChkID0gdC0+Z2xvYmFsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJewotCQkgIGlmICgoKmQtPm1hdGNoKSAoZCwgaC0+cm9vdC5yb290LnN0cmluZykpCi0JCSAgICB7Ci0JCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoZCAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCi0JICBpZiAodC0+bG9jYWxzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKGQgPSB0LT5sb2NhbHM7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0JCXsKLQkJICBpZiAoZC0+cGF0dGVyblswXSA9PSAnKicgJiYgZC0+cGF0dGVyblsxXSA9PSAnXDAnKQotCQkgICAgZGVmbHQgPSB0OwotCQkgIGVsc2UgaWYgKCgqZC0+bWF0Y2gpIChkLCBoLT5yb290LnJvb3Quc3RyaW5nKSkKLQkJICAgIHsKLQkJICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQkJICAgICAgaWYgKGgtPmR5bmluZHggIT0gLTEKLQkJCSAgJiYgaW5mby0+c2hhcmVkCi0JCQkgICYmICEgc2luZm8tPmV4cG9ydF9keW5hbWljKQotCQkJewotCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTDsKLQkJCSAgKCpiZWQtPmVsZl9iYWNrZW5kX2hpZGVfc3ltYm9sKSAoaCk7Ci0JCQkgIC8qIEZJWE1FOiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGhhcyBhbHJlYWR5Ci0JCQkgICAgIGJlZW4gcmVjb3JkZWQgaW4gdGhlIGR5bmFtaWMgc3RyaW5nIHRhYmxlCi0JCQkgICAgIHNlY3Rpb24uICAqLwotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGQgIT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChkZWZsdCAhPSBOVUxMICYmIGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMKQotCXsKLQkgIGgtPnZlcmluZm8udmVydHJlZSA9IGRlZmx0OwotCSAgaWYgKGgtPmR5bmluZHggIT0gLTEKLQkgICAgICAmJiBpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAhIHNpbmZvLT5leHBvcnRfZHluYW1pYykKLQkgICAgewotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfRk9SQ0VEX0xPQ0FMOwotCSAgICAgICgqYmVkLT5lbGZfYmFja2VuZF9oaWRlX3N5bWJvbCkgKGgpOwotCSAgICAgIC8qIEZJWE1FOiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4KLQkJIHJlY29yZGVkIGluIHRoZSBkeW5hbWljIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAgKi8KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGaW5hbCBwaGFzZSBvZiBFTEYgbGlua2VyLiAgKi8KLQotLyogQSBzdHJ1Y3R1cmUgd2UgdXNlIHRvIGF2b2lkIHBhc3NpbmcgbGFyZ2UgbnVtYmVycyBvZiBhcmd1bWVudHMuICAqLwotCi1zdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbwotewotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogU3ltYm9sIHN0cmluZyB0YWJsZS4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN5bXN0cnRhYjsKLSAgLyogLmR5bnN5bSBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKmR5bnN5bV9zZWM7Ci0gIC8qIC5oYXNoIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqaGFzaF9zZWM7Ci0gIC8qIHN5bWJvbCB2ZXJzaW9uIHNlY3Rpb24gKC5nbnUudmVyc2lvbikuICAqLwotICBhc2VjdGlvbiAqc3ltdmVyX3NlYzsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgcmVsb2NzIG9mIGFueSBzZWN0aW9uLiAgKi8KLSAgUFRSIGV4dGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGludGVybmFsIHJlbG9jcyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsb2NhbCBzeW1ib2xzIG9mIGFueSBpbnB1dAotICAgICBCRkQuICAqLwotICBFbGZfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgaW50ZXJuYWwgbG9jYWwgc3ltYm9scyBvZiBhbnkgaW5wdXQKLSAgICAgQkZELiAgKi8KLSAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltczsKLSAgLyogQXJyYXkgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBzeW1ib2wgaW5kZXggZm9yIGVhY2ggbG9jYWwgc3ltYm9sCi0gICAgIG9mIGFueSBpbnB1dCBCRkQuICAqLwotICBsb25nICppbmRpY2VzOwotICAvKiBBcnJheSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIHNlY3Rpb24gcG9pbnRlciBmb3IgZWFjaCBsb2NhbAotICAgICBzeW1ib2wgb2YgYW55IGlucHV0IEJGRC4gICovCi0gIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci0gIC8qIEJ1ZmZlciB0byBob2xkIHN3YXBwZWQgb3V0IHN5bWJvbHMuICAqLwotICBFbGZfRXh0ZXJuYWxfU3ltICpzeW1idWY7Ci0gIC8qIE51bWJlciBvZiBzd2FwcGVkIG91dCBzeW1ib2xzIGluIGJ1ZmZlci4gICovCi0gIHNpemVfdCBzeW1idWZfY291bnQ7Ci0gIC8qIE51bWJlciBvZiBzeW1ib2xzIHdoaWNoIGZpdCBpbiBzeW1idWYuICAqLwotICBzaXplX3Qgc3ltYnVmX3NpemU7Ci19OwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19vdXRwdXRfc3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX291dHB1dF9leHRzeW0KLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBlbGZfbGlua19vdXRwdXRfZXh0c3ltLiAgKi8KLQotc3RydWN0IGVsZl9vdXRleHRfaW5mbwotewotICBib29sZWFuIGZhaWxlZDsKLSAgYm9vbGVhbiBsb2NhbHN5bXM7Ci0gIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLX07Ci0KLS8qIENvbXB1dGUgdGhlIHNpemUgb2YsIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IsIFJFTF9IRFIgd2hpY2ggaXMgdGhlCi0gICBzZWN0aW9uIGhlYWRlciBmb3IgYSBzZWN0aW9uIGNvbnRhaW5pbmcgcmVsb2NhdGlvbnMgZm9yIE8uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uIChhYmZkLCByZWxfaGRyLCBvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICAgICBhc2VjdGlvbiAqbzsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipwLCAqKnBlbmQ7Ci0gIHVuc2lnbmVkIHJlbG9jX2NvdW50OwotCi0gIC8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgcmVsb2NhdGlvbnMgdGhlcmUgd2lsbCBiZS4gICovCi0gIGlmIChyZWxfaGRyID09ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcikKLSAgICByZWxvY19jb3VudCA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQ7Ci0gIGVsc2UKLSAgICByZWxvY19jb3VudCA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQyOwotCi0gIC8qIFRoYXQgYWxsb3dzIHVzIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHJlbF9oZHItPnNoX3NpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplICogcmVsb2NfY291bnQ7Ci0KLSAgLyogVGhlIGNvbnRlbnRzIGZpZWxkIG11c3QgbGFzdCBpbnRvIHdyaXRlX29iamVjdF9jb250ZW50cywgc28gd2UKLSAgICAgYWxsb2NhdGUgaXQgd2l0aCBiZmRfYWxsb2MgcmF0aGVyIHRoYW4gbWFsbG9jLiAgKi8KLSAgcmVsX2hkci0+Y29udGVudHMgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbF9oZHItPnNoX3NpemUpOwotICBpZiAocmVsX2hkci0+Y29udGVudHMgPT0gTlVMTCAmJiByZWxfaGRyLT5zaF9zaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogV2Ugb25seSBhbGxvY2F0ZSBvbmUgc2V0IG9mIGhhc2ggZW50cmllcywgc28gd2Ugb25seSBkbyBpdCB0aGUKLSAgICAgZmlyc3QgdGltZSB3ZSBhcmUgY2FsbGVkLiAgKi8KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzID09IE5VTEwpCi0gICAgewotICAgICAgcCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQKLQkJICAgICAgICogc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotICAgICAgaWYgKHAgPT0gTlVMTCAmJiBvLT5yZWxvY19jb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgPSBwOwotICAgICAgcGVuZCA9IHAgKyBvLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoOyBwIDwgcGVuZDsgcCsrKQotCSpwID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGUgaW5wdXQgcmVsb2NhdGlvbnMgYXJlCi0gICBwcmVzZXJ2ZWQuICBCdXQsIGlmIHRoZXkgcmVmZXJlbmNlIGdsb2JhbCBzeW1ib2xzLCB0aGUgaW5kaWNlcwotICAgcmVmZXJlbmNlZCBtdXN0IGJlIHVwZGF0ZWQuICBVcGRhdGUgYWxsIHRoZSByZWxvY2F0aW9ucyBpbgotICAgUkVMX0hEUiAodGhlcmUgYXJlIENPVU5UIG9mIHRoZW0pLCB1c2luZyB0aGUgZGF0YSBpbiBSRUxfSEFTSC4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfbGlua19hZGp1c3RfcmVsb2NzIChhYmZkLCByZWxfaGRyLCBjb3VudCwgcmVsX2hhc2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIHVuc2lnbmVkIGludCBjb3VudDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJlbF9oYXNoKyspCi0gICAgewotICAgICAgaWYgKCpyZWxfaGFzaCA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBCRkRfQVNTRVJUICgoKnJlbF9oYXNoKS0+aW5keCA+PSAwKTsKLQotICAgICAgaWYgKHJlbF9oZHItPnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsOwotCSAgRWxmX0ludGVybmFsX1JlbCBpcmVsOwotCSAgCi0JICBlcmVsID0gKEVsZl9FeHRlcm5hbF9SZWwgKikgcmVsX2hkci0+Y29udGVudHMgKyBpOwotCSAgZWxmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIGVyZWwsICZpcmVsKTsKLQkgIGlyZWwucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCi0JCQkJICAgIEVMRl9SX1RZUEUgKGlyZWwucl9pbmZvKSk7Ci0JICBlbGZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZpcmVsLCBlcmVsKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotCSAgRWxmX0ludGVybmFsX1JlbGEgaXJlbGE7Ci0JICAKLQkgIEJGRF9BU1NFUlQgKHJlbF9oZHItPnNoX2VudHNpemUKLQkJICAgICAgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOwotCSAgCi0JICBlcmVsYSA9IChFbGZfRXh0ZXJuYWxfUmVsYSAqKSByZWxfaGRyLT5jb250ZW50cyArIGk7Ci0JICBlbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIGVyZWxhLCAmaXJlbGEpOwotCSAgaXJlbGEucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCi0JCQkJICAgICBFTEZfUl9UWVBFIChpcmVsYS5yX2luZm8pKTsKLQkgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsICZpcmVsYSwgZXJlbGEpOwotCX0KLSAgICB9Ci19Ci0KLS8qIERvIHRoZSBmaW5hbCBzdGVwIG9mIGFuIEVMRiBsaW5rLiAgKi8KLQotYm9vbGVhbgotZWxmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuIGR5bmFtaWM7Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyBmaW5mbzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKm87Ci0gIHJlZ2lzdGVyIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgcmVnaXN0ZXIgYmZkICpzdWI7Ci0gIHNpemVfdCBtYXhfY29udGVudHNfc2l6ZTsKLSAgc2l6ZV90IG1heF9leHRlcm5hbF9yZWxvY19zaXplOwotICBzaXplX3QgbWF4X2ludGVybmFsX3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X3N5bV9jb3VudDsKLSAgZmlsZV9wdHIgb2ZmOwotICBFbGZfSW50ZXJuYWxfU3ltIGVsZnN5bTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltc3RydGFiX2hkcjsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgc3RydWN0IGVsZl9vdXRleHRfaW5mbyBlb2luZm87Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGR5bmFtaWMgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZDsKLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgZmluZm8uaW5mbyA9IGluZm87Ci0gIGZpbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICBmaW5mby5zeW1zdHJ0YWIgPSBlbGZfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChmaW5mby5zeW1zdHJ0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBmaW5mby5keW5zeW1fc2VjID0gTlVMTDsKLSAgICAgIGZpbmZvLmhhc2hfc2VjID0gTlVMTDsKLSAgICAgIGZpbmZvLnN5bXZlcl9zZWMgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpbmZvLmR5bnN5bV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgZmluZm8uaGFzaF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKGZpbmZvLmR5bnN5bV9zZWMgIT0gTlVMTCAmJiBmaW5mby5oYXNoX3NlYyAhPSBOVUxMKTsKLSAgICAgIGZpbmZvLnN5bXZlcl9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdudS52ZXJzaW9uIik7Ci0gICAgICAvKiBOb3RlIHRoYXQgaXQgaXMgT0sgaWYgc3ltdmVyX3NlYyBpcyBOVUxMLiAgKi8KLSAgICB9Ci0KLSAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmaW5mby5leHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmluZGljZXMgPSBOVUxMOwotICBmaW5mby5zZWN0aW9ucyA9IE5VTEw7Ci0gIGZpbmZvLnN5bWJ1ZiA9IE5VTEw7Ci0gIGZpbmZvLnN5bWJ1Zl9jb3VudCA9IDA7Ci0KLSAgLyogQ291bnQgdXAgdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyB3ZSB3aWxsIG91dHB1dCBmb3IgZWFjaCBvdXRwdXQKLSAgICAgc2VjdGlvbiwgc28gdGhhdCB3ZSBrbm93IHRoZSBzaXplcyBvZiB0aGUgcmVsb2Mgc2VjdGlvbnMuICBXZQotICAgICBhbHNvIGZpZ3VyZSBvdXQgc29tZSBtYXhpbXVtIHNpemVzLiAgKi8KLSAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOwotICBtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IDA7Ci0gIG1heF9pbnRlcm5hbF9yZWxvY19jb3VudCA9IDA7Ci0gIG1heF9zeW1fY291bnQgPSAwOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotCi0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCSAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICArK28tPnJlbG9jX2NvdW50OwotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCi0JCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAotCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCi0JICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7Ci0KLQkgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCQlvLT5yZWxvY19jb3VudCArPSBzZWMtPnJlbG9jX2NvdW50OwotCi0JICAgICAgaWYgKHNlYy0+X3Jhd19zaXplID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JCW1heF9jb250ZW50c19zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0JICAgICAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JCW1heF9jb250ZW50c19zaXplID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLQkgICAgICAvKiBXZSBhcmUgaW50ZXJlc3RlZCBpbiBqdXN0IGxvY2FsIHN5bWJvbHMsIG5vdCBhbGwKLQkJIHN5bWJvbHMuICAqLwotCSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKHNlYy0+b3duZXIpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkJICAmJiAoc2VjLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotCQl7Ci0JCSAgc2l6ZV90IHN5bV9jb3VudDsKLQotCQkgIGlmIChlbGZfYmFkX3N5bXRhYiAoc2VjLT5vd25lcikpCi0JCSAgICBzeW1fY291bnQgPSAoZWxmX3RkYXRhIChzZWMtPm93bmVyKS0+c3ltdGFiX2hkci5zaF9zaXplCi0JCQkJIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSk7Ci0JCSAgZWxzZQotCQkgICAgc3ltX2NvdW50ID0gZWxmX3RkYXRhIChzZWMtPm93bmVyKS0+c3ltdGFiX2hkci5zaF9pbmZvOwotCi0JCSAgaWYgKHN5bV9jb3VudCA+IG1heF9zeW1fY291bnQpCi0JCSAgICBtYXhfc3ltX2NvdW50ID0gc3ltX2NvdW50OwotCi0JCSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCQkgICAgewotCQkgICAgICBzaXplX3QgZXh0X3NpemU7Ci0KLQkJICAgICAgZXh0X3NpemUgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX3NpemU7Ci0JCSAgICAgIGlmIChleHRfc2l6ZSA+IG1heF9leHRlcm5hbF9yZWxvY19zaXplKQotCQkJbWF4X2V4dGVybmFsX3JlbG9jX3NpemUgPSBleHRfc2l6ZTsKLQkJICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPiBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQpCi0JCQltYXhfaW50ZXJuYWxfcmVsb2NfY291bnQgPSBzZWMtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCA+IDApCi0Jby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEV4cGxpY2l0bHkgY2xlYXIgdGhlIFNFQ19SRUxPQyBmbGFnLiAgVGhlIGxpbmtlciB0ZW5kcyB0bwotCSAgICAgc2V0IGl0ICh0aGlzIGlzIHByb2JhYmx5IGEgYnVnKSBhbmQgaWYgaXQgaXMgc2V0Ci0JICAgICBhc3NpZ25fc2VjdGlvbl9udW1iZXJzIHdpbGwgY3JlYXRlIGEgcmVsb2Mgc2VjdGlvbi4gICovCi0JICBvLT5mbGFncyAmPX4gU0VDX1JFTE9DOwotCX0KLQotICAgICAgLyogSWYgdGhlIFNFQ19BTExPQyBmbGFnIGlzIG5vdCBzZXQsIGZvcmNlIHRoZSBzZWN0aW9uIFZNQSB0bwotCSB6ZXJvLiAgVGhpcyBpcyBkb25lIGluIGVsZl9mYWtlX3NlY3Rpb25zIGFzIHdlbGwsIGJ1dCBmb3JjaW5nCi0JIHRoZSBWTUEgdG8gMCBoZXJlIHdpbGwgZW5zdXJlIHRoYXQgcmVsb2NzIGFnYWluc3QgdGhlc2UKLQkgc2VjdGlvbnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDAKLQkgICYmICEgby0+dXNlcl9zZXRfdm1hKQotCW8tPnZtYSA9IDA7Ci0gICAgfQotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBldmVyeXRoaW5nIGJ1dCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIGFuZCB0aGUgcmVsb2NzLiAgV2Ugc2V0IHN5bWNvdW50IHRvIGZvcmNlIGFzc2lnbl9zZWN0aW9uX251bWJlcnMKLSAgICAgdG8gY3JlYXRlIGEgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwgPyAwIDogMTsKLSAgQkZEX0FTU0VSVCAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKTsKLSAgaWYgKCEgX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkLCBpbmZvKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBGaWd1cmUgb3V0IGhvdyBtYW55IHJlbG9jYXRpb25zIHdlIHdpbGwgaGF2ZSBpbiBlYWNoIHNlY3Rpb24uCi0gICAgIEp1c3QgdXNpbmcgUkVMT0NfQ09VTlQgaXNuJ3QgZ29vZCBlbm91Z2ggc2luY2UgdGhhdCBkb2Vzbid0Ci0gICAgIG1haW50YWluIGEgc2VwYXJhdGUgdmFsdWUgZm9yIFJFTCB2cy4gUkVMQSByZWxvY2F0aW9ucy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCSAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHNlY3Rpb24gd2FzIG9taXR0ZWQgZnJvbSB0aGUgbGluay4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgb3V0cHV0X3NlY3Rpb24gPSBvLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkgICAgICAmJiAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmVzZGkgCi0JCT0gZWxmX3NlY3Rpb25fZGF0YSAobyk7Ci0JICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICplc2RvIAotCQk9IGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB1bnNpZ25lZCBpbnQgKnJlbF9jb3VudDsKLQkgICAgICB1bnNpZ25lZCBpbnQgKnJlbF9jb3VudDI7Ci0KLQkgICAgICAvKiBXZSBtdXN0IGJlIGNhcmVmdWwgdG8gYWRkIHRoZSByZWxvY2F0aW9uIGZyb21zIHRoZQotCQkgaW5wdXQgc2VjdGlvbiB0byB0aGUgcmlnaHQgb3V0cHV0IGNvdW50LiAgKi8KLQkgICAgICBpZiAoZXNkaS0+cmVsX2hkci5zaF9lbnRzaXplID09IGVzZG8tPnJlbF9oZHIuc2hfZW50c2l6ZSkKLQkJewotCQkgIHJlbF9jb3VudCA9ICZlc2RvLT5yZWxfY291bnQ7Ci0JCSAgcmVsX2NvdW50MiA9ICZlc2RvLT5yZWxfY291bnQyOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsX2NvdW50ID0gJmVzZG8tPnJlbF9jb3VudDI7Ci0JCSAgcmVsX2NvdW50MiA9ICZlc2RvLT5yZWxfY291bnQ7Ci0JCX0KLQkgICAgICAKLQkgICAgICAqcmVsX2NvdW50ICs9IChlc2RpLT5yZWxfaGRyLnNoX3NpemUgCi0JCQkgICAgIC8gZXNkaS0+cmVsX2hkci5zaF9lbnRzaXplKTsKLQkgICAgICBpZiAoZXNkaS0+cmVsX2hkcjIpCi0JCSpyZWxfY291bnQyICs9IChlc2RpLT5yZWxfaGRyMi0+c2hfc2l6ZSAKLQkJCQkvIGVzZGktPnJlbF9oZHIyLT5zaF9lbnRzaXplKTsKLQkgICAgfQotCX0KLQotICAvKiBUaGF0IGNyZWF0ZWQgdGhlIHJlbG9jIHNlY3Rpb25zLiAgU2V0IHRoZWlyIHNpemVzLCBhbmQgYXNzaWduCi0gICAgIHRoZW0gZmlsZSBwb3NpdGlvbnMsIGFuZCBhbGxvY2F0ZSBzb21lIGJ1ZmZlcnMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGlmICghZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uIChhYmZkLAotCQkJCQkgICAgJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyLAotCQkJCQkgICAgbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyCi0JICAgICAgJiYgIWVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbiAoYWJmZCwKLQkJCQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMiwKLQkJCQkJICAgICAgIG8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIE5vdywgcmVzZXQgUkVMX0NPVU5UIGFuZCBSRUxfQ09VTlQyIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtCi0JIHRvIGNvdW50IHVwd2FyZHMgd2hpbGUgYWN0dWFsbHkgb3V0cHV0dGluZyB0aGUgcmVsb2NhdGlvbnMuICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2NvdW50ID0gMDsKLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQyID0gMDsKLSAgICB9Ci0KLSAgX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MgKGFiZmQpOwotCi0gIC8qIFdlIGhhdmUgbm93IGFzc2lnbmVkIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zIGV4Y2VwdAotICAgICAuc3ltdGFiIGFuZCAuc3RydGFiLiAgV2Ugc3RhcnQgdGhlIC5zeW10YWIgc2VjdGlvbiBhdCB0aGUgY3VycmVudAotICAgICBmaWxlIHBvc2l0aW9uLCBhbmQgd3JpdGUgZGlyZWN0bHkgdG8gaXQuICBXZSBidWlsZCB0aGUgLnN0cnRhYgotICAgICBzZWN0aW9uIGluIG1lbW9yeS4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAvKiBzaF9uYW1lIGlzIHNldCBpbiBwcmVwX2hlYWRlcnMuICAqLwotICBzeW10YWJfaGRyLT5zaF90eXBlID0gU0hUX1NZTVRBQjsKLSAgc3ltdGFiX2hkci0+c2hfZmxhZ3MgPSAwOwotICBzeW10YWJfaGRyLT5zaF9hZGRyID0gMDsKLSAgc3ltdGFiX2hkci0+c2hfc2l6ZSA9IDA7Ci0gIHN5bXRhYl9oZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICAvKiBzaF9saW5rIGlzIHNldCBpbiBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLiAgKi8KLSAgLyogc2hfaW5mbyBpcyBzZXQgYmVsb3cuICAqLwotICAvKiBzaF9vZmZzZXQgaXMgc2V0IGp1c3QgYmVsb3cuICAqLwotICBzeW10YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSA0OyAgLyogRklYTUU6IHN5c3RlbSBkZXBlbmRlbnQ/ICAqLwotCi0gIG9mZiA9IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3M7Ci0gIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChzeW10YWJfaGRyLCBvZmYsIHRydWUpOwotCi0gIC8qIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgaXMKLSAgICAgaW5jb3JyZWN0LiAgV2UgZG8gbm90IHlldCBrbm93IHRoZSBzaXplIG9mIHRoZSAuc3ltdGFiIHNlY3Rpb24uCi0gICAgIFdlIGNvcnJlY3QgbmV4dF9maWxlX3BvcyBiZWxvdywgYWZ0ZXIgd2UgZG8ga25vdyB0aGUgc2l6ZS4gICovCi0KLSAgLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gaG9sZCBzd2FwcGVkIG91dCBzeW1ib2xzLiAgVGhpcyBpcyB0byBhdm9pZAotICAgICBjb250aW51b3VzbHkgc2Vla2luZyB0byB0aGUgcmlnaHQgcG9zaXRpb24gaW4gdGhlIGZpbGUuICAqLwotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSB8fCBtYXhfc3ltX2NvdW50IDwgMjApCi0gICAgZmluZm8uc3ltYnVmX3NpemUgPSAyMDsKLSAgZWxzZQotICAgIGZpbmZvLnN5bWJ1Zl9zaXplID0gbWF4X3N5bV9jb3VudDsKLSAgZmluZm8uc3ltYnVmID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JCSAgYmZkX21hbGxvYyAoZmluZm8uc3ltYnVmX3NpemUgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGlmIChmaW5mby5zeW1idWYgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBTdGFydCB3cml0aW5nIG91dCB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIGZpcnN0IHN5bWJvbCBpcyBhbHdheXMgYQotICAgICBkdW1teSBzeW1ib2wuICAqLwotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsIHx8IGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBlbGZzeW0uc3RfdmFsdWUgPSAwOwotICAgICAgZWxmc3ltLnN0X3NpemUgPSAwOwotICAgICAgZWxmc3ltLnN0X2luZm8gPSAwOwotICAgICAgZWxmc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGVsZnN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLSAgICAgIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKCZmaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgJmVsZnN5bSwgYmZkX3VuZF9zZWN0aW9uX3B0cikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0jaWYgMAotICAvKiBTb21lIHN0YW5kYXJkIEVMRiBsaW5rZXJzIGRvIHRoaXMsIGJ1dCB3ZSBkb24ndCBiZWNhdXNlIGl0IGNhdXNlcwotICAgICBib290c3RyYXAgY29tcGFyaXNvbiBmYWlsdXJlcy4gICovCi0gIC8qIE91dHB1dCBhIGZpbGUgc3ltYm9sIGZvciB0aGUgb3V0cHV0IGZpbGUgYXMgdGhlIHNlY29uZCBzeW1ib2wuCi0gICAgIFdlIG91dHB1dCB0aGlzIGV2ZW4gaWYgd2UgYXJlIGRpc2NhcmRpbmcgbG9jYWwgc3ltYm9scywgYWx0aG91Z2gKLSAgICAgSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdC4gICovCi0gIGVsZnN5bS5zdF92YWx1ZSA9IDA7Ci0gIGVsZnN5bS5zdF9zaXplID0gMDsKLSAgZWxmc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfRklMRSk7Ci0gIGVsZnN5bS5zdF9vdGhlciA9IDA7Ci0gIGVsZnN5bS5zdF9zaG5keCA9IFNITl9BQlM7Ci0gIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKCZmaW5mbywgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkgICAgICZlbGZzeW0sIGJmZF9hYnNfc2VjdGlvbl9wdHIpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotI2VuZGlmCi0KLSAgLyogT3V0cHV0IGEgc3ltYm9sIGZvciBlYWNoIHNlY3Rpb24uICBXZSBvdXRwdXQgdGhlc2UgZXZlbiBpZiB3ZSBhcmUKLSAgICAgZGlzY2FyZGluZyBsb2NhbCBzeW1ib2xzLCBzaW5jZSB0aGV5IGFyZSB1c2VkIGZvciByZWxvY3MuICBUaGVzZQotICAgICBzeW1ib2xzIGhhdmUgbm8gbmFtZXMuICBXZSBzdG9yZSB0aGUgaW5kZXggb2YgZWFjaCBvbmUgaW4gdGhlCi0gICAgIGluZGV4IGZpZWxkIG9mIHRoZSBzZWN0aW9uLCBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0IGFnYWluIHdoZW4KLSAgICAgb3V0cHV0dGluZyByZWxvY3MuICAqLwotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsIHx8IGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBlbGZzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIGVsZnN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07IGkrKykKLQl7Ci0JICBvID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaSk7Ci0JICBpZiAobyAhPSBOVUxMKQotCSAgICBvLT50YXJnZXRfaW5kZXggPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGVsZnN5bS5zdF9zaG5keCA9IGk7Ci0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8IG8gPT0gTlVMTCkKLQkgICAgZWxmc3ltLnN0X3ZhbHVlID0gMDsKLQkgIGVsc2UKLQkgICAgZWxmc3ltLnN0X3ZhbHVlID0gby0+dm1hOwotCSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICAgJmVsZnN5bSwgbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgdG8gaG9sZCBpbmZvcm1hdGlvbiByZWFkIGluIGZyb20gdGhlIGlucHV0Ci0gICAgIGZpbGVzLiAgKi8KLSAgZmluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2NvbnRlbnRzX3NpemUpOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jIChtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSk7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9ICgoRWxmX0ludGVybmFsX1JlbGEgKikKLQkJCSAgIGJmZF9tYWxsb2MgKG1heF9pbnRlcm5hbF9yZWxvY19jb3VudAotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpCi0JCQkJICAgICAgICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkpOwotICBmaW5mby5leHRlcm5hbF9zeW1zID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSk7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgZmluZm8uaW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8uc2VjdGlvbnMgPSAoKGFzZWN0aW9uICoqKQotCQkgICAgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplICE9IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X2V4dGVybmFsX3JlbG9jX3NpemUgIT0gMCkKLSAgICAgIHx8IChmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQotICAgICAgfHwgKGZpbmZvLmludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApCi0gICAgICB8fCAoZmluZm8uaW5kaWNlcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5zZWN0aW9ucyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU2luY2UgRUxGIHBlcm1pdHMgcmVsb2NhdGlvbnMgdG8gYmUgYWdhaW5zdCBsb2NhbCBzeW1ib2xzLCB3ZQotICAgICBtdXN0IGhhdmUgdGhlIGxvY2FsIHN5bWJvbHMgYXZhaWxhYmxlIHdoZW4gd2UgZG8gdGhlIHJlbG9jYXRpb25zLgotICAgICBTaW5jZSB3ZSB3b3VsZCByYXRoZXIgb25seSByZWFkIHRoZSBsb2NhbCBzeW1ib2xzIG9uY2UsIGFuZCB3ZQotICAgICB3b3VsZCByYXRoZXIgbm90IGtlZXAgdGhlbSBpbiBtZW1vcnksIHdlIGhhbmRsZSBhbGwgdGhlCi0gICAgIHJlbG9jYXRpb25zIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IHRoZSBzYW1lIHRpbWUuCi0KLSAgICAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgdGhlIHRvdGFsIG51bWJlciBvZiBsb2NhbAotICAgICBzeW1ib2xzIHVudGlsIHdlIGhhdmUgc2VlbiBhbGwgb2YgdGhlbSwgYW5kIHRoZSBsb2NhbCBzeW1ib2wKLSAgICAgaW5kaWNlcyBwcmVjZWRlIHRoZSBnbG9iYWwgc3ltYm9sIGluZGljZXMuICBUaGlzIG1lYW5zIHRoYXQgd2hlbgotICAgICB3ZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2Ugc2VlIGEgcmVsb2MgYWdhaW5zdAotICAgICBhIGdsb2JhbCBzeW1ib2wsIHdlIGNhbiBub3Qga25vdyB0aGUgc3ltYm9sIGluZGV4IHVudGlsIHdlIGhhdmUKLSAgICAgZmluaXNoZWQgZXhhbWluaW5nIGFsbCB0aGUgbG9jYWwgc3ltYm9scyB0byBzZWUgd2hpY2ggb25lcyB3ZSBhcmUKLSAgICAgZ29pbmcgdG8gb3V0cHV0LiAgVG8gZGVhbCB3aXRoIHRoaXMsIHdlIGtlZXAgdGhlIHJlbG9jYXRpb25zIGluCi0gICAgIG1lbW9yeSwgYW5kIGRvbid0IG91dHB1dCB0aGVtIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIGlzCi0gICAgIGFuIHVuZm9ydHVuYXRlIHdhc3RlIG9mIG1lbW9yeSwgYnV0IEkgZG9uJ3Qgc2VlIGEgZ29vZCB3YXkgYXJvdW5kCi0gICAgIGl0LiAgRm9ydHVuYXRlbHksIGl0IG9ubHkgaGFwcGVucyB3aGVuIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUKLSAgICAgbGluaywgd2hpY2ggaXMgbm90IHRoZSBjb21tb24gY2FzZS4gIEZJWE1FOiBJZiBrZWVwX21lbW9yeSBpcyBzZXQKLSAgICAgd2UgY291bGQgd3JpdGUgdGhlIHJlbG9jcyBvdXQgYW5kIHRoZW4gcmVhZCB0aGVtIGFnYWluOyBJIGRvbid0Ci0gICAgIGtub3cgaG93IGJhZCB0aGUgbWVtb3J5IGxvc3Mgd2lsbCBiZS4gICovCi0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCi0JCSAgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBzdWIgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1bikKLQkJewotCQkgIGlmICghIGVsZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBzdWIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISBlbGZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBUaGF0IHdyb3RlIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGaW5pc2ggdXAgdGhlIHN5bWJvbCB0YWJsZQotICAgICB3aXRoIHRoZSBnbG9iYWwgc3ltYm9scy4gRXZlbiBpZiB3ZSB3YW50IHRvIHN0cmlwIGV2ZXJ5dGhpbmcgd2UKLSAgICAgY2FuLCB3ZSBzdGlsbCBuZWVkIHRvIGRlYWwgd2l0aCB0aG9zZSBnbG9iYWwgc3ltYm9scyB0aGF0IGdvdAotICAgICBjb252ZXJ0ZWQgdG8gbG9jYWwgaW4gYSB2ZXJzaW9uIHNjcmlwdC4gKi8KLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIC8qIE91dHB1dCBhbnkgZ2xvYmFsIHN5bWJvbHMgdGhhdCBnb3QgY29udmVydGVkIHRvIGxvY2FsIGluIGEKLSAgICAgICAgIHZlcnNpb24gc2NyaXB0LiAgV2UgZG8gdGhpcyBpbiBhIHNlcGFyYXRlIHN0ZXAgc2luY2UgRUxGCi0gICAgICAgICByZXF1aXJlcyBhbGwgbG9jYWwgc3ltYm9scyB0byBhcHBlYXIgcHJpb3IgdG8gYW55IGdsb2JhbAotICAgICAgICAgc3ltYm9scy4gIEZJWE1FOiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHNvbWUgZ2xvYmFsCi0gICAgICAgICBzeW1ib2xzIHdlcmUsIGluIGZhY3QsIGNvbnZlcnRlZCB0byBiZWNvbWUgbG9jYWwuICBGSVhNRToKLSAgICAgICAgIFdpbGwgdGhpcyB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBJcml4IDUgbGlua2VyPyAgKi8KLSAgICAgIGVvaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgICAgIGVvaW5mby5maW5mbyA9ICZmaW5mbzsKLSAgICAgIGVvaW5mby5sb2NhbHN5bXMgPSB0cnVlOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBlbGZfbGlua19vdXRwdXRfZXh0c3ltLAotCQkJICAgICAgKFBUUikgJmVvaW5mbyk7Ci0gICAgICBpZiAoZW9pbmZvLmZhaWxlZCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIHJlY29yZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24gbG9jYWwgc3ltYm9sLiAgKi8KLSAgc3ltdGFiX2hkci0+c2hfaW5mbyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgRWxmX0V4dGVybmFsX1N5bSAqZHluc3ltID0KLQkoRWxmX0V4dGVybmFsX1N5bSAqKWZpbmZvLmR5bnN5bV9zZWMtPmNvbnRlbnRzOwotICAgICAgbG9uZyBsYXN0X2xvY2FsID0gMDsKLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQl7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgc3ltLnN0X3NpemUgPSAwOwotCSAgc3ltLnN0X25hbWUgPSAwOwotCSAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7Ci0JICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0JICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgewotCSAgICAgIGludCBpbmR4OwotCSAgICAgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICAgICAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgICAgIHN5bS5zdF9zaG5keCA9IGluZHg7Ci0JICAgICAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICAgICAgZWxmX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJnN5bSwKLQkJCQkgICBkeW5zeW0gKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCk7Ci0JICAgIH0KLQotCSAgbGFzdF9sb2NhbCA9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCk7Ci0JfQotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIGxvY2FsIGR5bnN5bXMuICAqLwotICAgICAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlubG9jYWwpCi0JewotCSAgc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKmU7Ci0JICBmb3IgKGUgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsOyBlIDsgZSA9IGUtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHN5bS5zdF9zaXplID0gZS0+aXN5bS5zdF9zaXplOwotCSAgICAgIHN5bS5zdF9vdGhlciA9IGUtPmlzeW0uc3Rfb3RoZXI7Ci0KLQkgICAgICAvKiBDb3B5IHRoZSBpbnRlcm5hbCBzeW1ib2wgYXMgaXMuCi0JCSBOb3RlIHRoYXQgd2Ugc2F2ZWQgYSB3b3JkIG9mIHN0b3JhZ2UgYW5kIG92ZXJ3cm90ZQotICAgICAgICAgICAgICAgICB0aGUgb3JpZ2luYWwgc3RfbmFtZSB3aXRoIHRoZSBkeW5zdHJfaW5kZXguICAqLwotICAgICAgICAgICAgICBzeW0gPSBlLT5pc3ltOwotCi0JICAgICAgaWYgKGUtPmlzeW0uc3Rfc2huZHggPiAwICYmIGUtPmlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQl7Ci0JCSAgcyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChlLT5pbnB1dF9iZmQsCi0JCQkJCQkgIGUtPmlzeW0uc3Rfc2huZHgpOwotCi0JCSAgc3ltLnN0X3NobmR4ID0KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHMtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19pZHg7Ci0JCSAgc3ltLnN0X3ZhbHVlID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgcy0+b3V0cHV0X29mZnNldAotCQkJCSAgKyBlLT5pc3ltLnN0X3ZhbHVlKTsKLQkJfQotCi0JICAgICAgaWYgKGxhc3RfbG9jYWwgPCBlLT5keW5pbmR4KQotCQlsYXN0X2xvY2FsID0gZS0+ZHluaW5keDsKLQotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZzeW0sIGR5bnN5bSArIGUtPmR5bmluZHgpOwotCSAgICB9Ci0JfQotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChmaW5mby5keW5zeW1fc2VjLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPQotCWxhc3RfbG9jYWwgKyAxOwotICAgIH0KLQotICAvKiBXZSBnZXQgdGhlIGdsb2JhbCBzeW1ib2xzIGZyb20gdGhlIGhhc2ggdGFibGUuICAqLwotICBlb2luZm8uZmFpbGVkID0gZmFsc2U7Ci0gIGVvaW5mby5sb2NhbHN5bXMgPSBmYWxzZTsKLSAgZW9pbmZvLmZpbmZvID0gJmZpbmZvOwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGVsZl9saW5rX291dHB1dF9leHRzeW0sCi0JCQkgIChQVFIpICZlb2luZm8pOwotICBpZiAoZW9pbmZvLmZhaWxlZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgYmFja2VuZCBuZWVkcyB0byBvdXRwdXQgc29tZSBzeW1ib2xzIG5vdCBwcmVzZW50IGluIHRoZSBoYXNoCi0gICAgIHRhYmxlLCBkbyBpdCBub3cuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zKQotICAgIHsKLSAgICAgIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zKQotCSAgICAgIChhYmZkLCBpbmZvLCAoUFRSKSAmZmluZm8sCi0JICAgICAgIChib29sZWFuICgqKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKLQkgICAgICAgICAgICAgICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpKQotCSAgICAgICBlbGZfbGlua19vdXRwdXRfc3ltKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfSAgICAgIAotCi0gIC8qIEZsdXNoIGFsbCBzeW1ib2xzIHRvIHRoZSBmaWxlLiAgKi8KLSAgaWYgKCEgZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMgKCZmaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSBzeW10YWIgc2VjdGlvbi4gICovCi0gIG9mZiArPSBzeW10YWJfaGRyLT5zaF9zaXplOwotCi0gIC8qIEZpbmlzaCB1cCBhbmQgd3JpdGUgb3V0IHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlICguc3RydGFiKQotICAgICBzZWN0aW9uLiAgKi8KLSAgc3ltc3RydGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyOwotICAvKiBzaF9uYW1lIHdhcyBzZXQgaW4gcHJlcF9oZWFkZXJzLiAgKi8KLSAgc3ltc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2ZsYWdzID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zeW1zdHJ0YWIpOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgc3ltc3RydGFiX2hkci0+c2hfbGluayA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2luZm8gPSAwOwotICAvKiBzaF9vZmZzZXQgaXMgc2V0IGp1c3QgYmVsb3cuICAqLwotICBzeW1zdHJ0YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotCi0gIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChzeW1zdHJ0YWJfaGRyLCBvZmYsIHRydWUpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1zdHJ0YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAhIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN5bXN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIHJlbG9jcyB0byBoYXZlIHRoZSBjb3JyZWN0IHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgZWxmX2xpbmtfYWRqdXN0X3JlbG9jcyAoYWJmZCwgJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyLCAKLQkJCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQsCi0JCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyk7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyICE9IE5VTEwpCi0JZWxmX2xpbmtfYWRqdXN0X3JlbG9jcyAoYWJmZCwgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyLAotCQkJCWVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQyLAotCQkJCShlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAKLQkJCQkgKyBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2NvdW50KSk7Ci0KLSAgICAgIC8qIFNldCB0aGUgcmVsb2NfY291bnQgZmllbGQgdG8gMCB0byBwcmV2ZW50IHdyaXRlX3JlbG9jcyBmcm9tCi0JIHRyeWluZyB0byBzd2FwIHRoZSByZWxvY3Mgb3V0IGl0c2VsZi4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdCwgb3IgZ2VuZXJhdGluZyBhCi0gICAgIHNoYXJlZCBsaWJyYXJ5LCBmaW5pc2ggdXAgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgLyogRml4IHVwIC5keW5hbWljIGVudHJpZXMuICAqLwotICAgICAgbyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotICAgICAgQkZEX0FTU0VSVCAobyAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgby0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmX0V4dGVybmFsX0R5biAqKSAoby0+Y29udGVudHMgKyBvLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLQkgIGVsZl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERUX0lOSVQ6Ci0JICAgICAgbmFtZSA9IGluZm8tPmluaXRfZnVuY3Rpb247Ci0JICAgICAgZ290byBnZXRfc3ltOwotCSAgICBjYXNlIERUX0ZJTkk6Ci0JICAgICAgbmFtZSA9IGluZm8tPmZpbmlfZnVuY3Rpb247Ci0JICAgIGdldF9zeW06Ci0JICAgICAgewotCQlzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQloID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwKLQkJCQkJICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlpZiAoaCAhPSBOVUxMCi0JCSAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCSAgewotCQkgICAgZHluLmRfdW4uZF92YWwgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgbyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICAgIGlmIChvLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCQkgICAgICBkeW4uZF91bi5kX3ZhbCArPSAoby0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgKyBvLT5vdXRwdXRfb2Zmc2V0KTsKLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJLyogVGhlIHN5bWJvbCBpcyBpbXBvcnRlZCBmcm9tIGFub3RoZXIgc2hhcmVkCi0JCQkgICBsaWJyYXJ5IGFuZCBkb2VzIG5vdCBhcHBseSB0byB0aGlzIG9uZS4gICovCi0JCQlkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JCSAgICAgIH0KLQotCQkgICAgZWxmX3N3YXBfZHluX291dCAoZHlub2JqLCAmZHluLCBkeW5jb24pOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9IQVNIOgotCSAgICAgIG5hbWUgPSAiLmhhc2giOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9TVFJUQUI6Ci0JICAgICAgbmFtZSA9ICIuZHluc3RyIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfU1lNVEFCOgotCSAgICAgIG5hbWUgPSAiLmR5bnN5bSI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1ZFUkRFRjoKLQkgICAgICBuYW1lID0gIi5nbnUudmVyc2lvbl9kIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfVkVSTkVFRDoKLQkgICAgICBuYW1lID0gIi5nbnUudmVyc2lvbl9yIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfVkVSU1lNOgotCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uIjsKLQkgICAgZ2V0X3ZtYToKLQkgICAgICBvID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgICAgIEJGRF9BU1NFUlQgKG8gIT0gTlVMTCk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBvLT52bWE7Ci0JICAgICAgZWxmX3N3YXBfZHluX291dCAoZHlub2JqLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMOgotCSAgICBjYXNlIERUX1JFTEE6Ci0JICAgIGNhc2UgRFRfUkVMU1o6Ci0JICAgIGNhc2UgRFRfUkVMQVNaOgotCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfUkVMIHx8IGR5bi5kX3RhZyA9PSBEVF9SRUxTWikKLQkJdHlwZSA9IFNIVF9SRUw7Ci0JICAgICAgZWxzZQotCQl0eXBlID0gU0hUX1JFTEE7Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGZvciAoaSA9IDE7IGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsgaSsrKQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotCQkgIGhkciA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaV07Ci0JCSAgaWYgKGhkci0+c2hfdHlwZSA9PSB0eXBlCi0JCSAgICAgICYmIChoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotCQkgICAgewotCQkgICAgICBpZiAoZHluLmRfdGFnID09IERUX1JFTFNaIHx8IGR5bi5kX3RhZyA9PSBEVF9SRUxBU1opCi0JCQlkeW4uZF91bi5kX3ZhbCArPSBoZHItPnNoX3NpemU7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaWYgKGR5bi5kX3VuLmRfdmFsID09IDAKLQkJCSAgICAgIHx8IGhkci0+c2hfYWRkciA8IGR5bi5kX3VuLmRfdmFsKQotCQkJICAgIGR5bi5kX3VuLmRfdmFsID0gaGRyLT5zaF9hZGRyOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxmX3N3YXBfZHluX291dCAoZHlub2JqLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlIGNyZWF0ZWQgYW55IGR5bmFtaWMgc2VjdGlvbnMsIHRoZW4gb3V0cHV0IHRoZW0uICAqLwotICBpZiAoZHlub2JqICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCpiZWQtPmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKSAoYWJmZCwgaW5mbykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZvciAobyA9IGR5bm9iai0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICAgICB8fCBvLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgY29udGludWU7Ci0JICBpZiAoKG8tPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzZWN0aW9ucwotICAgICAgICAgICAgICAgICBjcmVhdGVkIGJ5IGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgaWYgKChlbGZfc2VjdGlvbl9kYXRhIChvLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX3R5cGUKLQkgICAgICAgIT0gU0hUX1NUUlRBQikKLQkgICAgICB8fCBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgIi5keW5zdHIiKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgby0+Y29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJCSAgICAgIG8tPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlX3B0ciBvZmY7Ci0KLQkgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhlIC5keW5zdHIgc2VjdGlvbiBhcmUgYWN0dWFsbHkgaW4gYQotICAgICAgICAgICAgICAgICBzdHJpbmd0YWIuICAqLwotCSAgICAgIG9mZiA9IGVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfb2Zmc2V0OwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2ZmLCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwKLQkJCQkJICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgKGFiZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmIChmaW5mby5zeW1zdHJ0YWIgIT0gTlVMTCkKLSAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zeW1zdHJ0YWIpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLmluZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbmRpY2VzKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjdGlvbnMpOwotICBpZiAoZmluZm8uc3ltYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltYnVmKTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgJiYgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgIT0gTlVMTCkKLQlmcmVlIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyk7Ci0gICAgfQotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmxpbmtlciA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmaW5mby5zeW1zdHJ0YWIgIT0gTlVMTCkKLSAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zeW1zdHJ0YWIpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLmluZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbmRpY2VzKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjdGlvbnMpOwotICBpZiAoZmluZm8uc3ltYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltYnVmKTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgJiYgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgIT0gTlVMTCkKLQlmcmVlIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyk7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX291dHB1dF9zeW0gKGZpbmZvLCBuYW1lLCBlbGZzeW0sIGlucHV0X3NlYykKLSAgICAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICplbGZzeW07Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWM7Ci17Ci0gIGJvb2xlYW4gKCpvdXRwdXRfc3ltYm9sX2hvb2spIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSBjb25zdCBjaGFyICosCi0JCQkJCSBFbGZfSW50ZXJuYWxfU3ltICosCi0JCQkJCSBhc2VjdGlvbiAqKSk7Ci0KLSAgb3V0cHV0X3N5bWJvbF9ob29rID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGZpbmZvLT5vdXRwdXRfYmZkKS0+Ci0gICAgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2s7Ci0gIGlmIChvdXRwdXRfc3ltYm9sX2hvb2sgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCpvdXRwdXRfc3ltYm9sX2hvb2spCi0JICAgICAoZmluZm8tPm91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBuYW1lLCBlbGZzeW0sIGlucHV0X3NlYykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotICAgIGVsZnN5bS0+c3RfbmFtZSA9IDA7Ci0gIGVsc2UgaWYgKGlucHV0X3NlYy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLSAgICBlbGZzeW0tPnN0X25hbWUgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgZWxmc3ltLT5zdF9uYW1lID0gKHVuc2lnbmVkIGxvbmcpIF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN5bXN0cnRhYiwKLQkJCQkJCQkgICAgbmFtZSwgdHJ1ZSwKLQkJCQkJCQkgICAgZmFsc2UpOwotICAgICAgaWYgKGVsZnN5bS0+c3RfbmFtZSA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZmluZm8tPnN5bWJ1Zl9jb3VudCA+PSBmaW5mby0+c3ltYnVmX3NpemUpCi0gICAgewotICAgICAgaWYgKCEgZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMgKGZpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVsZl9zd2FwX3N5bWJvbF9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCBlbGZzeW0sCi0JCSAgICAgICAoUFRSKSAoZmluZm8tPnN5bWJ1ZiArIGZpbmZvLT5zeW1idWZfY291bnQpKTsKLSAgKytmaW5mby0+c3ltYnVmX2NvdW50OwotCi0gICsrIGJmZF9nZXRfc3ltY291bnQgKGZpbmZvLT5vdXRwdXRfYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmx1c2ggdGhlIG91dHB1dCBzeW1ib2xzIHRvIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zIChmaW5mbykKLSAgICAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotewotICBpZiAoZmluZm8tPnN5bWJ1Zl9jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYjsKLQotICAgICAgc3ltdGFiID0gJmVsZl90ZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGZpbmZvLT5vdXRwdXRfYmZkLCBzeW10YWItPnNoX29mZnNldCArIHN5bXRhYi0+c2hfc2l6ZSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3dyaXRlICgoUFRSKSBmaW5mby0+c3ltYnVmLCBmaW5mby0+c3ltYnVmX2NvdW50LAotCQkJIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIGZpbmZvLT5vdXRwdXRfYmZkKQotCSAgICAgICE9IGZpbmZvLT5zeW1idWZfY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN5bXRhYi0+c2hfc2l6ZSArPSBmaW5mby0+c3ltYnVmX2NvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLQotICAgICAgZmluZm8tPnN5bWJ1Zl9jb3VudCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYW4gZXh0ZXJuYWwgc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGNhbGxlZCBmcm9tCi0gICB0aGUgaGFzaCB0YWJsZSB0cmF2ZXJzYWwgcm91dGluZS4gIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsCi0gICB3ZSBnbyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgdHdpY2UuICBUaGUgZmlyc3QgdGltZSB3ZSBvdXRwdXQKLSAgIGFueXRoaW5nIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGZvcmNlZCB0byBsb2NhbCBzY29wZSBpbiBhIHZlcnNpb24KLSAgIHNjcmlwdC4gIFRoZSBzZWNvbmQgdGltZSB3ZSBvdXRwdXQgdGhlIHN5bWJvbHMgdGhhdCBhcmUgc3RpbGwKLSAgIGdsb2JhbCBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX291dHB1dF9leHRzeW0gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9vdXRleHRfaW5mbyAqZW9pbmZvID0gKHN0cnVjdCBlbGZfb3V0ZXh0X2luZm8gKikgZGF0YTsKLSAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvID0gZW9pbmZvLT5maW5mbzsKLSAgYm9vbGVhbiBzdHJpcDsKLSAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gIGFzZWN0aW9uICppbnB1dF9zZWM7Ci0KLSAgLyogRGVjaWRlIHdoZXRoZXIgdG8gb3V0cHV0IHRoaXMgc3ltYm9sIGluIHRoaXMgcGFzcy4gICovCi0gIGlmIChlb2luZm8tPmxvY2Fsc3ltcykKLSAgICB7Ci0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSAhPSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIHN5bWJvbCBpcwotICAgICByZWZlcmVuY2VkIGJ5IGEgc2hhcmVkIGxpYnJhcnkgYnV0IGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLCB0aGVuCi0gICAgIHdhcm4gdGhhdCBpdCBpcyB1bmRlZmluZWQuICBJZiB3ZSBkbyBub3QgZG8gdGhpcywgdGhlIHJ1bnRpbWUKLSAgICAgbGlua2VyIHdpbGwgY29tcGxhaW4gdGhhdCB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCB3aGVuIHRoZQotICAgICBwcm9ncmFtIGlzIHJ1bi4gIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc3ltYm9scyB0aGF0IGFyZQotICAgICByZWZlcmVuY2VkIGJ5IHJlZ3VsYXIgZmlsZXMsIGJlY2F1c2Ugd2Ugd2lsbCBhbHJlYWR5IGhhdmUgaXNzdWVkCi0gICAgIHdhcm5pbmdzIGZvciB0aGVtLiAgKi8KLSAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISAoZmluZm8tPmluZm8tPnNoYXJlZAotCSAgICAmJiAhZmluZm8tPmluZm8tPm5vX3VuZGVmaW5lZCkKLSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgewotICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkgICAgIChmaW5mby0+aW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaC0+cm9vdC51LnVuZGVmLmFiZmQsCi0JICAgICAgKGFzZWN0aW9uICopIE5VTEwsIDAsIHRydWUpKSkKLQl7Ci0JICBlb2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBXZSBkb24ndCB3YW50IHRvIG91dHB1dCBzeW1ib2xzIHRoYXQgaGF2ZSBuZXZlciBiZWVuIG1lbnRpb25lZCBieQotICAgICBhIHJlZ3VsYXIgZmlsZSwgb3IgdGhhdCB3ZSBoYXZlIGJlZW4gdG9sZCB0byBzdHJpcC4gIEhvd2V2ZXIsIGlmCi0gICAgIGgtPmluZHggaXMgc2V0IHRvIC0yLCB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYyBhbmQgd2UgbXVzdAotICAgICBvdXRwdXQgaXQuICAqLwotICBpZiAoaC0+aW5keCA9PSAtMikKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmICgoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMCkKLQkgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICAvKiBJZiB3ZSdyZSBzdHJpcHBpbmcgaXQsIGFuZCBpdCdzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLCB0aGVyZSdzCi0gICAgIG5vdGhpbmcgZWxzZSB0byBkbyB1bmxlc3MgaXQgaXMgYSBmb3JjZWQgbG9jYWwgc3ltYm9sLiAgKi8KLSAgaWYgKHN0cmlwCi0gICAgICAmJiBoLT5keW5pbmR4ID09IC0xCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW0uc3RfdmFsdWUgPSAwOwotICBzeW0uc3Rfc2l6ZSA9IGgtPnNpemU7Ci0gIHN5bS5zdF9vdGhlciA9IGgtPm90aGVyOwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpICE9IDApCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBoLT50eXBlKTsKLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfV0VBSywgaC0+dHlwZSk7Ci0gIGVsc2UKLSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBoLT50eXBlKTsKLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgaW5wdXRfc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIGlucHV0X3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWlucHV0X3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQlpZiAoaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgewotCSAgICBzeW0uc3Rfc2huZHggPQotCSAgICAgIF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJCQkgaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgIGlmIChzeW0uc3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogY291bGQgbm90IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXMgZm9yIGlucHV0IHNlY3Rpb24gJXMiKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoZmluZm8tPm91dHB1dF9iZmQpLAotCQkgICBpbnB1dF9zZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLAotCQkgICBpbnB1dF9zZWMtPm5hbWUpOwotCQllb2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgLyogRUxGIHN5bWJvbHMgaW4gcmVsb2NhdGVhYmxlIGZpbGVzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLAotCSAgICAgICBidXQgaW4gbm9ucmVsb2NhdGVhYmxlIGZpbGVzIHRoZXkgYXJlIHZpcnR1YWwKLQkgICAgICAgYWRkcmVzc2VzLiAgKi8KLQkgICAgc3ltLnN0X3ZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZSArIGlucHV0X3NlYy0+b3V0cHV0X29mZnNldDsKLQkgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgICBzeW0uc3RfdmFsdWUgKz0gaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjLT5vd25lciA9PSBOVUxMCi0JCQl8fCAoaW5wdXRfc2VjLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKTsKLQkgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotCSAgICBpbnB1dF9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgaW5wdXRfc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLSAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9DT01NT047Ci0gICAgICBzeW0uc3RfdmFsdWUgPSAxIDw8IGgtPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgICAgLyogVGhlc2Ugc3ltYm9scyBhcmUgY3JlYXRlZCBieSBzeW1ib2wgdmVyc2lvbmluZy4gIFRoZXkgcG9pbnQKLSAgICAgICAgIHRvIHRoZSBkZWNvcmF0ZWQgdmVyc2lvbiBvZiB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCBpZiB0aGUKLSAgICAgICAgIHN5bWJvbCBmb29AQEdOVV8xLjIgaXMgdGhlIGRlZmF1bHQsIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4KLSAgICAgICAgIGZvbyBpcyB1c2VkIHdpdGggbm8gdmVyc2lvbiwgdGhlbiB3ZSBhZGQgYW4gaW5kaXJlY3Qgc3ltYm9sCi0gICAgICAgICBmb28gd2hpY2ggcG9pbnRzIHRvIGZvb0BAR05VXzEuMi4gIFdlIGlnbm9yZSB0aGVzZSBzeW1ib2xzLAotICAgICAgICAgc2luY2UgdGhlIGluZGlyZWN0ZWQgc3ltYm9sIGlzIGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUuICBJZgotICAgICAgICAgdGhlIGluZGlyZWN0IHN5bWJvbCBpcyBub24tRUxGLCBmYWxsIHRocm91Z2ggYW5kIG91dHB1dCBpdC4gICovCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19OT05fRUxGKSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogV2UgY2FuJ3QgcmVwcmVzZW50IHRoZXNlIHN5bWJvbHMgaW4gRUxGLCBhbHRob3VnaCBhIHdhcm5pbmcKLSAgICAgICAgIHN5bWJvbCBtYXkgaGF2ZSBjb21lIGZyb20gYSAuZ251Lndhcm5pbmcuU1lNQk9MIHNlY3Rpb24uICBXZQotICAgICAgICAganVzdCBwdXQgdGhlIHRhcmdldCBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICBJZiB0aGUgdGFyZ2V0Ci0gICAgICAgICBzeW1ib2wgZG9lcyBub3QgcmVhbGx5IGV4aXN0LCBkb24ndCBkbyBhbnl0aGluZy4gICovCi0gICAgICBpZiAoaC0+cm9vdC51LmkubGluay0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIHJldHVybiAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bQotCSAgICAgICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluaywgZGF0YSkpOwotICAgIH0KLQotICAvKiBHaXZlIHRoZSBwcm9jZXNzb3IgYmFja2VuZCBhIGNoYW5jZSB0byB0d2VhayB0aGUgc3ltYm9sIHZhbHVlLAotICAgICBhbmQgYWxzbyB0byBmaW5pc2ggdXAgYW55dGhpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciB0aGlzCi0gICAgIHN5bWJvbC4gICovCi0gIGlmICgoaC0+ZHluaW5keCAhPSAtMQotICAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSAhPSAwKQotICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgICAgIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCk7Ci0gICAgICBpZiAoISAoKCpiZWQtPmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCkKLQkgICAgIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIGgsICZzeW0pKSkKLQl7Ci0JICBlb2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbWFya2luZyB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgYW5kIHRoZXJlIGFyZSBubwotICAgICBub24td2VhayByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sIGZyb20gYSByZWd1bGFyIG9iamVjdCwgdGhlbgotICAgICBtYXJrIHRoZSBzeW1ib2wgYXMgd2VhayB1bmRlZmluZWQ7IGlmIHRoZXJlIGFyZSBub24td2VhawotICAgICByZWZlcmVuY2VzLCBtYXJrIHRoZSBzeW1ib2wgYXMgc3Ryb25nLiAgV2UgY2FuJ3QgZG8gdGhpcyBlYXJsaWVyLAotICAgICBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBiZSBtYXJrZWQgYXMgdW5kZWZpbmVkIHVudGlsIHRoZQotICAgICBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZSBnZXRzIHRocm91Z2ggd2l0aCBpdC4gICovCi0gIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLSAgICAgICYmIChFTEZfU1RfQklORChzeW0uc3RfaW5mbykgPT0gU1RCX0dMT0JBTAotCSAgfHwgRUxGX1NUX0JJTkQoc3ltLnN0X2luZm8pID09IFNUQl9XRUFLKSkKLSAgICB7Ci0gICAgICBpbnQgYmluZHR5cGU7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSykgIT0gMCkKLQliaW5kdHlwZSA9IFNUQl9HTE9CQUw7Ci0gICAgICBlbHNlCi0JYmluZHR5cGUgPSBTVEJfV0VBSzsKLSAgICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGJpbmR0eXBlLCBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgc2hvdWxkIGJlIHB1dCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLCB0aGVuIHB1dCBpdAotICAgICB0aGVyZSBub3cuICBXZSBoYXZlIGFscmVhZHkga25vdyB0aGUgc3ltYm9sIGluZGV4LiAgV2UgYWxzbyBmaWxsCi0gICAgIGluIHRoZSBlbnRyeSBpbiB0aGUgLmhhc2ggc2VjdGlvbi4gICovCi0gIGlmIChoLT5keW5pbmR4ICE9IC0xCi0gICAgICAmJiBlbGZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgc2l6ZV90IGJ1Y2tldGNvdW50OwotICAgICAgc2l6ZV90IGJ1Y2tldDsKLSAgICAgIHNpemVfdCBoYXNoX2VudHJ5X3NpemU7Ci0gICAgICBiZmRfYnl0ZSAqYnVja2V0cG9zOwotICAgICAgYmZkX3ZtYSBjaGFpbjsKLQotICAgICAgc3ltLnN0X25hbWUgPSBoLT5keW5zdHJfaW5kZXg7Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCAmc3ltLAotCQkJICAgKFBUUikgKCgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQkJCSAgIGZpbmZvLT5keW5zeW1fc2VjLT5jb250ZW50cykKLQkJCQkgICsgaC0+ZHluaW5keCkpOwotCi0gICAgICBidWNrZXRjb3VudCA9IGVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmJ1Y2tldGNvdW50OwotICAgICAgYnVja2V0ID0gaC0+ZWxmX2hhc2hfdmFsdWUgJSBidWNrZXRjb3VudDsKLSAgICAgIGhhc2hfZW50cnlfc2l6ZSAKLQk9IGVsZl9zZWN0aW9uX2RhdGEgKGZpbmZvLT5oYXNoX3NlYyktPnRoaXNfaGRyLnNoX2VudHNpemU7Ci0gICAgICBidWNrZXRwb3MgPSAoKGJmZF9ieXRlICopIGZpbmZvLT5oYXNoX3NlYy0+Y29udGVudHMKLQkJICAgKyAoYnVja2V0ICsgMikgKiBoYXNoX2VudHJ5X3NpemUpOwotICAgICAgY2hhaW4gPSBiZmRfZ2V0ICg4ICogaGFzaF9lbnRyeV9zaXplLCBmaW5mby0+b3V0cHV0X2JmZCwgYnVja2V0cG9zKTsKLSAgICAgIGJmZF9wdXQgKDggKiBoYXNoX2VudHJ5X3NpemUsIGZpbmZvLT5vdXRwdXRfYmZkLCBoLT5keW5pbmR4LCBidWNrZXRwb3MpOwotICAgICAgYmZkX3B1dCAoOCAqIGhhc2hfZW50cnlfc2l6ZSwgZmluZm8tPm91dHB1dF9iZmQsIGNoYWluLAotCSAgICAgICAoKGJmZF9ieXRlICopIGZpbmZvLT5oYXNoX3NlYy0+Y29udGVudHMKLQkJKyAoYnVja2V0Y291bnQgKyAyICsgaC0+ZHluaW5keCkgKiBoYXNoX2VudHJ5X3NpemUpKTsKLQotICAgICAgaWYgKGZpbmZvLT5zeW12ZXJfc2VjICE9IE5VTEwgJiYgZmluZm8tPnN5bXZlcl9zZWMtPmNvbnRlbnRzICE9IE5VTEwpCi0JewotCSAgRWxmX0ludGVybmFsX1ZlcnN5bSBpdmVyc3ltOwotCi0JICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnZlcmluZm8udmVyZGVmID09IE5VTEwpCi0JCWl2ZXJzeW0udnNfdmVycyA9IDA7Ci0JICAgICAgZWxzZQotCQlpdmVyc3ltLnZzX3ZlcnMgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZXhwX3JlZm5vICsgMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMKQotCQlpdmVyc3ltLnZzX3ZlcnMgPSAxOwotCSAgICAgIGVsc2UKLQkJaXZlcnN5bS52c192ZXJzID0gaC0+dmVyaW5mby52ZXJ0cmVlLT52ZXJudW0gKyAxOwotCSAgICB9Ci0KLQkgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hJRERFTikgIT0gMCkKLQkgICAgaXZlcnN5bS52c192ZXJzIHw9IFZFUlNZTV9ISURERU47Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCAoZmluZm8tPm91dHB1dF9iZmQsICZpdmVyc3ltLAotCQkJCSAgICAoKChFbGZfRXh0ZXJuYWxfVmVyc3ltICopCi0JCQkJICAgICAgZmluZm8tPnN5bXZlcl9zZWMtPmNvbnRlbnRzKQotCQkJCSAgICAgKyBoLT5keW5pbmR4KSk7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSdyZSBzdHJpcHBpbmcgaXQsIHRoZW4gaXQgd2FzIGp1c3QgYSBkeW5hbWljIHN5bWJvbCwgYW5kCi0gICAgIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHRvIGRvLiAgKi8KLSAgaWYgKHN0cmlwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmluZHggPSBiZmRfZ2V0X3N5bWNvdW50IChmaW5mby0+b3V0cHV0X2JmZCk7Ci0KLSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsICZzeW0sIGlucHV0X3NlYykpCi0gICAgewotICAgICAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSB0aGUgcmVsb2NhdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSBJTlRFUk5BTF9SRUxPQ1MgKHdoaWNoCi0gICBvcmlnaW5hdGVkIGZyb20gdGhlIHNlY3Rpb24gZ2l2ZW4gYnkgSU5QVVRfUkVMX0hEUikgdG8gdGhlCi0gICBPVVRQVVRfQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9saW5rX291dHB1dF9yZWxvY3MgKG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGlucHV0X3JlbF9oZHIsIAotCQkJaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaW5wdXRfcmVsX2hkcjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpvdXRwdXRfcmVsX2hkcjsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgKnJlbF9jb3VudHAgPSBOVUxMOwotCi0gIG91dHB1dF9zZWN0aW9uID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0gIG91dHB1dF9yZWxfaGRyID0gTlVMTDsKLQotICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX2VudHNpemUgCi0gICAgICA9PSBpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplKQotICAgIHsKLSAgICAgIG91dHB1dF9yZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjsKLSAgICAgIHJlbF9jb3VudHAgPSAmZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQ7Ci0gICAgfQotICBlbHNlIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHIyCi0JICAgJiYgKGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjItPnNoX2VudHNpemUKLQkgICAgICAgPT0gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZSkpCi0gICAgewotICAgICAgb3V0cHV0X3JlbF9oZHIgPSBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHIyOwotICAgICAgcmVsX2NvdW50cCA9ICZlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudDI7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKG91dHB1dF9yZWxfaGRyICE9IE5VTEwpOwotICAKLSAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIGlyZWxhZW5kID0gaXJlbGEgKyBpbnB1dF9yZWxfaGRyLT5zaF9zaXplIC8gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgaWYgKGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsOwotCi0gICAgICBlcmVsID0gKChFbGZfRXh0ZXJuYWxfUmVsICopIG91dHB1dF9yZWxfaGRyLT5jb250ZW50cyArICpyZWxfY291bnRwKTsKLSAgICAgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCBlcmVsKyspCi0JewotCSAgRWxmX0ludGVybmFsX1JlbCBpcmVsOwotCi0JICBpcmVsLnJfb2Zmc2V0ID0gaXJlbGEtPnJfb2Zmc2V0OwotCSAgaXJlbC5yX2luZm8gPSBpcmVsYS0+cl9pbmZvOwotCSAgQkZEX0FTU0VSVCAoaXJlbGEtPnJfYWRkZW5kID09IDApOwotCSAgZWxmX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmaXJlbCwgZXJlbCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLQotICAgICAgQkZEX0FTU0VSVCAoaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZQotCQkgID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKTsKLSAgICAgIGVyZWxhID0gKChFbGZfRXh0ZXJuYWxfUmVsYSAqKSBvdXRwdXRfcmVsX2hkci0+Y29udGVudHMgKyAqcmVsX2NvdW50cCk7Ci0gICAgICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKywgZXJlbGErKykKLQllbGZfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCBpcmVsYSwgZXJlbGEpOwotICAgIH0KLQotICAvKiBCdW1wIHRoZSBjb3VudGVyLCBzbyB0aGF0IHdlIGtub3cgd2hlcmUgdG8gYWRkIHRoZSBuZXh0IHNldCBvZgotICAgICByZWxvY2F0aW9ucy4gICovCi0gICpyZWxfY291bnRwICs9IGlucHV0X3JlbF9oZHItPnNoX3NpemUgLyBpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplOwotfQotCi0vKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgotICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLgotICAgVGhpcyBpcyBzbyB0aGF0IHdlIG9ubHkgaGF2ZSB0byByZWFkIHRoZSBsb2NhbCBzeW1ib2xzIG9uY2UsIGFuZAotICAgZG9uJ3QgaGF2ZSB0byBrZWVwIHRoZW0gaW4gbWVtb3J5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgYm9vbGVhbiAoKnJlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkJCQkgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkJCQkgICAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzaXplX3QgbG9jc3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXM7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW07Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW1lbmQ7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW07Ci0gIGxvbmcgKnBpbmRleDsKLSAgYXNlY3Rpb24gKipwcHNlY3Rpb247Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG91dHB1dF9iZmQpOwotICByZWxvY2F0ZV9zZWN0aW9uID0gYmVkLT5lbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uOwotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIG9iamVjdCwgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBoZXJlOgotICAgICB3ZSBkb24ndCB3YW50IHRoZSBsb2NhbCBzeW1ib2xzLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGUgc2VjdGlvbgotICAgICBjb250ZW50cy4gICovCi0gIGlmICgoaW5wdXRfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKLSAgICB7Ci0gICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICAgICAgZXh0c3ltb2ZmID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBleHRzeW1vZmYgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0gICAgZXh0ZXJuYWxfc3ltcyA9IChFbGZfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICBlbHNlIGlmIChsb2NzeW1jb3VudCA9PSAwKQotICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgZXh0ZXJuYWxfc3ltcyA9IGZpbmZvLT5leHRlcm5hbF9zeW1zOwotICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwKLQkJCWxvY3N5bWNvdW50LCBpbnB1dF9iZmQpCi0JICAgICAgIT0gbG9jc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN3YXAgaW4gdGhlIGxvY2FsIHN5bWJvbHMgYW5kIHdyaXRlIG91dCB0aGUgb25lcyB3aGljaCB3ZSBrbm93Ci0gICAgIGFyZSBnb2luZyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICBlc3ltZW5kID0gZXN5bSArIGxvY3N5bWNvdW50OwotICBpc3ltID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIHBpbmRleCA9IGZpbmZvLT5pbmRpY2VzOwotICBwcHNlY3Rpb24gPSBmaW5mby0+c2VjdGlvbnM7Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpc3ltKyssIHBpbmRleCsrLCBwcHNlY3Rpb24rKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIG9zeW07Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltKTsKLSAgICAgICpwaW5kZXggPSAtMTsKLQotICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotCXsKLQkgIGlmIChFTEZfU1RfQklORCAoaXN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgICB7Ci0JICAgICAgKnBwc2VjdGlvbiA9IE5VTEw7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmIChpc3ltLT5zdF9zaG5keCA+IDAgJiYgaXN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCWlzZWMgPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW0tPnN0X3NobmR4KTsKLSAgICAgIGVsc2UgaWYgKGlzeW0tPnN0X3NobmR4ID09IFNITl9BQlMpCi0JaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmIChpc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCWlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFdobyBrbm93cz8gICovCi0JICBpc2VjID0gTlVMTDsKLQl9Ci0KLSAgICAgICpwcHNlY3Rpb24gPSBpc2VjOwotCi0gICAgICAvKiBEb24ndCBvdXRwdXQgdGhlIGZpcnN0LCB1bmRlZmluZWQsIHN5bWJvbC4gICovCi0gICAgICBpZiAoZXN5bSA9PSBleHRlcm5hbF9zeW1zKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgc3RyaXBwaW5nIGFsbCBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IHRvIG91dHB1dCB0aGlzCi0JIG9uZS4gICovCi0gICAgICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgbmV2ZXIgb3V0cHV0IHNlY3Rpb24gc3ltYm9scy4gIEluc3RlYWQsIHdlIHVzZSB0aGUgc2VjdGlvbgotCSBzeW1ib2wgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgaWYgKEVMRl9TVF9UWVBFIChpc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgd2UgYXJlIGRpc2NhcmRpbmcgYWxsIGxvY2FsIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgdG8KLQkgb3V0cHV0IHRoaXMgb25lLiAgSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0Ci0JIGZpbGUsIHRoZW4gc29tZSBvZiB0aGUgbG9jYWwgc3ltYm9scyBtYXkgYmUgcmVxdWlyZWQgYnkKLQkgcmVsb2NzOyB3ZSBvdXRwdXQgdGhlbSBiZWxvdyBhcyB3ZSBkaXNjb3ZlciB0aGF0IHRoZXkgYXJlCi0JIG5lZWRlZC4gICovCi0gICAgICBpZiAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBzZWN0aW9uIHdoaWNoIHdlIGFyZQotICAgICAgICAgZGlzY2FyZGluZywgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGl0LCBidXQgbm90ZSB0aGF0Ci0gICAgICAgICBsaW5rZXJfbWFyayBpcyBvbmx5IHJlbGlhYmxlIGZvciBzZWN0aW9ucyB0aGF0IGhhdmUgY29udGVudHMuCi0gICAgICAgICBGb3IgdGhlIGJlbmVmaXQgb2YgdGhlIE1JUFMgRUxGIGxpbmtlciwgd2UgY2hlY2sgU0VDX0VYQ0xVREUKLSAgICAgICAgIGFzIHdlbGwgYXMgbGlua2VyX21hcmsuICAqLwotICAgICAgaWYgKGlzeW0tPnN0X3NobmR4ID4gMAotCSAgJiYgaXN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFCi0JICAmJiBpc2VjICE9IE5VTEwKLQkgICYmICgoISBpc2VjLT5saW5rZXJfbWFyayAmJiAoaXNlYy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCSAgICAgIHx8ICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAmJiAoaXNlYy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4gICovCi0gICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkgICAgICBpc3ltLT5zdF9uYW1lKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTZWUgaWYgd2UgYXJlIGRpc2NhcmRpbmcgc3ltYm9scyB3aXRoIHRoaXMgbmFtZS4gICovCi0gICAgICBpZiAoKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCSAgICAgICA9PSBOVUxMKSkKLQkgIHx8IChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKLQkgICAgICAmJiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBhcmUgZ29pbmcgdG8gb3V0cHV0IHRoaXMgc3ltYm9sLiAgKi8KLQotICAgICAgb3N5bSA9ICppc3ltOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIHNlY3Rpb24gaW5kZXggZm9yIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBvc3ltLnN0X3NobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChvdXRwdXRfYmZkLAotCQkJCQkJCSBpc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0gICAgICBpZiAob3N5bS5zdF9zaG5keCA9PSAodW5zaWduZWQgc2hvcnQpIC0xKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgKnBpbmRleCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCi0gICAgICAvKiBFTEYgc3ltYm9scyBpbiByZWxvY2F0ZWFibGUgZmlsZXMgYXJlIHNlY3Rpb24gcmVsYXRpdmUsIGJ1dAotCSBpbiBleGVjdXRhYmxlIGZpbGVzIHRoZXkgYXJlIHZpcnR1YWwgYWRkcmVzc2VzLiAgTm90ZSB0aGF0Ci0JIHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgYWxsIEVMRiBzZWN0aW9ucyBoYXZlIGFuIGFzc29jaWF0ZWQKLQkgQkZEIHNlY3Rpb24gd2l0aCBhIHJlYXNvbmFibGUgdmFsdWUgZm9yIG91dHB1dF9vZmZzZXQ7IGJlbG93Ci0JIHdlIGFzc3VtZSB0aGF0IHRoZXkgYWxzbyBoYXZlIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3IKLQkgb3V0cHV0X3NlY3Rpb24uICBBbnkgc3BlY2lhbCBzZWN0aW9ucyBtdXN0IGJlIHNldCB1cCB0byBtZWV0Ci0JIHRoZXNlIHJlcXVpcmVtZW50cy4gICovCi0gICAgICBvc3ltLnN0X3ZhbHVlICs9IGlzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCW9zeW0uc3RfdmFsdWUgKz0gaXNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsICZvc3ltLCBpc2VjKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFJlbG9jYXRlIHRoZSBjb250ZW50cyBvZiBlYWNoIHNlY3Rpb24uICAqLwotICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLQotICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JewotCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgKG8tPl9yYXdfc2l6ZSA9PSAwICYmIChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpICE9IDApCi0JewotCSAgLyogU2VjdGlvbiB3YXMgY3JlYXRlZCBieSBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotCSAgICAgb3Igc29tZXN1Y2guICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLiAgVGhleSBoYXZlIGJlZW4gY2FjaGVkIGJ5IGEKLSAgICAgICAgIHJlbGF4YXRpb24gcm91dGluZS4gIE5vdGUgdGhhdCBvIGlzIGEgc2VjdGlvbiBpbiBhbiBpbnB1dAotICAgICAgICAgZmlsZSwgc28gdGhlIGNvbnRlbnRzIGZpZWxkIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQgYnkgYW55IG9mCi0gICAgICAgICB0aGUgcm91dGluZXMgd2hpY2ggd29yayBvbiBvdXRwdXQgZmlsZXMuICAqLwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnRlbnRzID0gZmluZm8tPmNvbnRlbnRzOwotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIG8sIGNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwgby0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotCi0JICAvKiBHZXQgdGhlIHN3YXBwZWQgcmVsb2NzLiAgKi8KLQkgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkgICAgIChpbnB1dF9iZmQsIG8sIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JCQkgICAgICBmaW5mby0+aW50ZXJuYWxfcmVsb2NzLCBmYWxzZSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMCi0JICAgICAgJiYgby0+cmVsb2NfY291bnQgPiAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFJlbG9jYXRlIHRoZSBzZWN0aW9uIGJ5IGludm9raW5nIGEgYmFjayBlbmQgcm91dGluZS4KLQotCSAgICAgVGhlIGJhY2sgZW5kIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdGluZyB0aGUKLQkgICAgIHNlY3Rpb24gY29udGVudHMgYXMgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzCi0JICAgICBhbmQgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZQotCSAgICAgcmVsb2MgYWRkZW5kIGFzIG5lY2Vzc2FyeS4KLQotCSAgICAgVGhlIGJhY2sgZW5kIHJvdXRpbmUgZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nCi0JICAgICB0aGUgcmVsb2MgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0JICAgICBUaGUgYmFjayBlbmQgcm91dGluZSBpcyBnaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4KLQkgICAgIGludGVybmFsIHN5bWJvbHMsIGFuZCBjYW4gYWNjZXNzIHRoZSBoYXNoIHRhYmxlIGVudHJpZXMKLQkgICAgIGZvciB0aGUgZXh0ZXJuYWwgc3ltYm9scyB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLQkgICAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGUgYmFjayBlbmQgcm91dGluZQotCSAgICAgbXVzdCBoYW5kbGUgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlCi0JICAgICBvdXRwdXQgc3ltYm9sIGlzIGdvaW5nIHRvIGJlIGEgc2VjdGlvbiBzeW1ib2wKLQkgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dCBzZWN0aW9uLCB3aGljaCB3aWxsIHJlcXVpcmUKLQkgICAgIHRoZSBhZGRlbmQgdG8gYmUgYWRqdXN0ZWQuICAqLwotCi0JICBpZiAoISAoKnJlbG9jYXRlX3NlY3Rpb24pIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkgICAgIGlucHV0X2JmZCwgbywgY29udGVudHMsCi0JCQkJICAgICBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJICAgICBmaW5mby0+aW50ZXJuYWxfc3ltcywKLQkJCQkgICAgIGZpbmZvLT5zZWN0aW9ucykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGE7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhZW5kOwotCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0JICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmlucHV0X3JlbF9oZHI7Ci0KLQkgICAgICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotCi0JICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgaXJlbGFlbmQgPSAKLQkJaXJlbGEgKyBvLT5yZWxvY19jb3VudCAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWw7Ci0JICAgICAgcmVsX2hhc2ggPSAoZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfaGFzaGVzCi0JCQkgICsgZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQKLQkJCSAgKyBlbGZfc2VjdGlvbl9kYXRhIChvLT5vdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudDIpOwotCSAgICAgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCByZWxfaGFzaCsrKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQkJICBFbGZfSW50ZXJuYWxfU3ltICppc3ltOwotCQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkJICBpcmVsYS0+cl9vZmZzZXQgKz0gby0+b3V0cHV0X29mZnNldDsKLQotCQkgIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChpcmVsYS0+cl9pbmZvKTsKLQotCQkgIGlmIChyX3N5bW5keCA9PSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAocl9zeW1uZHggPj0gbG9jc3ltY291bnQKLQkJICAgICAgfHwgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpCi0JCQkgICYmIGZpbmZvLT5zZWN0aW9uc1tyX3N5bW5keF0gPT0gTlVMTCkpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpyaDsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbC4gIFdlCi0JCQkgaGF2ZSBub3QgeWV0IG91dHB1dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMsIHNvCi0JCQkgd2UgZG8gbm90IGtub3cgdGhlIHN5bWJvbCBpbmRleCBvZiBhbnkgZ2xvYmFsCi0JCQkgc3ltYm9sLiAgV2Ugc2V0IHRoZSByZWxfaGFzaCBlbnRyeSBmb3IgdGhpcwotCQkJIHJlbG9jIHRvIHBvaW50IHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeQotCQkJIGZvciB0aGlzIHN5bWJvbC4gIFRoZSBzeW1ib2wgaW5kZXggaXMgdGhlbgotCQkJIHNldCBhdCB0aGUgZW5kIG9mIGVsZl9iZmRfZmluYWxfbGluay4gICovCi0JCSAgICAgIGluZHggPSByX3N5bW5keCAtIGV4dHN5bW9mZjsKLQkJICAgICAgcmggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkJICAgICAgd2hpbGUgKHJoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkJICAgICB8fCByaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJCXJoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIHJoLT5yb290LnUuaS5saW5rOwotCi0JCSAgICAgIC8qIFNldHRpbmcgdGhlIGluZGV4IHRvIC0yIHRlbGxzCi0JCQkgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSB0aGF0IHRoaXMgc3ltYm9sIGlzCi0JCQkgdXNlZCBieSBhIHJlbG9jLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAocmgtPmluZHggPCAwKTsKLQkJICAgICAgcmgtPmluZHggPSAtMjsKLQotCQkgICAgICAqcmVsX2hhc2ggPSByaDsKLQotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLiAqLwotCi0JCSAgKnJlbF9oYXNoID0gTlVMTDsKLQkJICBpc3ltID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKLQkJICBzZWMgPSBmaW5mby0+c2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGlmIChFTEZfU1RfVFlQRSAoaXN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCSAgICB7Ci0JCSAgICAgIC8qIEkgc3VwcG9zZSB0aGUgYmFja2VuZCBvdWdodCB0byBmaWxsIGluIHRoZQotCQkJIHNlY3Rpb24gb2YgYW55IFNUVF9TRUNUSU9OIHN5bWJvbCBhZ2FpbnN0IGEKLQkJCSBwcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbi4gIElmIHdlIGhhdmUKLQkJCSBkaXNjYXJkZWQgYSBzZWN0aW9uLCB0aGUgb3V0cHV0X3NlY3Rpb24gd2lsbAotCQkJIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JCQkgICYmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLQkJCSAgICAgIHx8IChzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkJCQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjLT5vdXRwdXRfc2VjdGlvbikpKSkKLQkJCXJfc3ltbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHJfc3ltbmR4ID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQkJICBCRkRfQVNTRVJUIChyX3N5bW5keCAhPSAwKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChmaW5mby0+aW5kaWNlc1tyX3N5bW5keF0gPT0gLTEpCi0JCQl7Ci0JCQkgIHVuc2lnbmVkIGxvbmcgbGluazsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JCQkgICAgewotCQkJICAgICAgLyogWW91IGNhbid0IGRvIGxkIC1yIC1zLiAgKi8KLQkJCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCi0JCQkgIC8qIFRoaXMgc3ltYm9sIHdhcyBza2lwcGVkIGVhcmxpZXIsIGJ1dAotCQkJICAgICBzaW5jZSBpdCBpcyBuZWVkZWQgYnkgYSByZWxvYywgd2UKLQkJCSAgICAgbXVzdCBvdXRwdXQgaXQgbm93LiAgKi8KLQkJCSAgbGluayA9IHN5bXRhYl9oZHItPnNoX2xpbms7Ci0JCQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJCSAgbGluaywKLQkJCQkJCQkJICBpc3ltLT5zdF9uYW1lKTsKLQkJCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGlzeW0tPnN0X3NobmR4ID0KLQkJCSAgICBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKG91dHB1dF9iZmQsCi0JCQkJCQkJICAgICAgIG9zZWMpOwotCQkJICBpZiAoaXN5bS0+c3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgaXN5bS0+c3RfdmFsdWUgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQkJICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCQkJICAgIGlzeW0tPnN0X3ZhbHVlICs9IG9zZWMtPnZtYTsKLQotCQkJICBmaW5mby0+aW5kaWNlc1tyX3N5bW5keF0gPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLQotCQkJICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltIChmaW5mbywgbmFtZSwgaXN5bSwgc2VjKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJICAgICAgcl9zeW1uZHggPSBmaW5mby0+aW5kaWNlc1tyX3N5bW5keF07Ci0JCSAgICB9Ci0KLQkJICBpcmVsYS0+cl9pbmZvID0gRUxGX1JfSU5GTyAocl9zeW1uZHgsCi0JCQkJCSAgICAgIEVMRl9SX1RZUEUgKGlyZWxhLT5yX2luZm8pKTsKLQkJfQotCi0JICAgICAgLyogU3dhcCBvdXQgdGhlIHJlbG9jcy4gICovCi0JICAgICAgaW5wdXRfcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKLQkgICAgICBlbGZfbGlua19vdXRwdXRfcmVsb2NzIChvdXRwdXRfYmZkLCBvLCAKLQkJCQkgICAgICBpbnB1dF9yZWxfaGRyLAotCQkJCSAgICAgIGludGVybmFsX3JlbG9jcyk7Ci0JICAgICAgaW50ZXJuYWxfcmVsb2NzIAotCQkrPSBpbnB1dF9yZWxfaGRyLT5zaF9zaXplIC8gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZTsKLQkgICAgICBpbnB1dF9yZWxfaGRyID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyOwotCSAgICAgIGlmIChpbnB1dF9yZWxfaGRyKQotCQllbGZfbGlua19vdXRwdXRfcmVsb2NzIChvdXRwdXRfYmZkLCBvLCAKLQkJCQkJaW5wdXRfcmVsX2hkciwKLQkJCQkJaW50ZXJuYWxfcmVsb2NzKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JewotCSAgaWYgKCEgKG8tPmZsYWdzICYgU0VDX0VYQ0xVREUpICYmCi0JICAgICAgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgIGNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCQkgIChvLT5fY29va2VkX3NpemUgIT0gMAotCQkJCQkgICA/IG8tPl9jb29rZWRfc2l6ZQotCQkJCQkgICA6IG8tPl9yYXdfc2l6ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+c3RhYl9pbmZvLAotCQkgIG8sICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+c3RhYl9pbmZvLCBjb250ZW50cykpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyB3aGVuIGxpbmtpbmcgYW4gRUxGIGZpbGUuICBUaGlzIGlzIGEgcmVsb2MKLSAgIHJlcXVlc3RlZCBieSB0aGUgbGlua2VyLCBhbmQgZG9lcyBjb21lIGZyb20gYW55IGlucHV0IGZpbGUuICBUaGlzCi0gICBpcyB1c2VkIHRvIGJ1aWxkIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcyB3aGVuIGxpbmtpbmcKLSAgIHdpdGggLVVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBsb25nIGluZHg7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBiZmRfdm1hIGFkZGVuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaF9wdHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotCi0gIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKGhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gIHJlbF9oYXNoX3B0ciA9IChlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oYXNoZXMKLQkJICArIGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50Ci0JCSAgKyBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudDIpOwotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQotICAgIHsKLSAgICAgIGluZHggPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgQkZEX0FTU0VSVCAoaW5keCAhPSAwKTsKLSAgICAgICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUcmVhdCBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbCBhcyB0aG91Z2ggaXQgd2VyZQotICAgICAgICAgYWN0dWFsbHkgYWdhaW5zdCB0aGUgc2VjdGlvbi4gICovCi0gICAgICBoID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotCSAgc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGluZHggPSBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0JICAvKiBJdCBzZWVtcyB0aGF0IHdlIG91Z2h0IHRvIGFkZCB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotICAgICAgICAgICAgIGFkZGVuZCBoZXJlLCBidXQgaW4gcHJhY3RpY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgICAgICAgIGJlY2F1c2UgaXQgd2FzIHBhc3NlZCB0byBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4gICovCi0JICBhZGRlbmQgKz0gc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCXsKLQkgIC8qIFNldHRpbmcgdGhlIGluZGV4IHRvIC0yIHRlbGxzIGVsZl9saW5rX291dHB1dF9leHRzeW0gdGhhdAotCSAgICAgdGhpcyBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jLiAgKi8KLQkgIGgtPmluZHggPSAtMjsKLQkgICpyZWxfaGFzaF9wdHIgPSBoOwotCSAgaW5keCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJIChpbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwgKGJmZCAqKSBOVUxMLAotCQkgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpbmR4ID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYW4gaW5wbGFjZSByZWxvYywgd2UgbXVzdCB3cml0ZSB0aGUgYWRkZW5kIGludG8gdGhlCi0gICAgIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgJiYgYWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQotCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKLQkJICBob3d0by0+bmFtZSwgYWRkZW5kLCAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkgIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgYWRkcmVzcyBvZiBhIHJlbG9jIGlzIHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uIGluIGEKLSAgICAgcmVsb2NhdGVhYmxlIGZpbGUsIGFuZCBpcyBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhbiBleGVjdXRhYmxlCi0gICAgIGZpbGUuICAqLwotICBvZmZzZXQgPSBsaW5rX29yZGVyLT5vZmZzZXQ7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBvZmZzZXQgKz0gb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjsKLQotICBpZiAocmVsX2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgaXJlbDsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0KLSAgICAgIGlyZWwucl9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICBpcmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKGluZHgsIGhvd3RvLT50eXBlKTsKLSAgICAgIGVyZWwgPSAoKEVsZl9FeHRlcm5hbF9SZWwgKikgcmVsX2hkci0+Y29udGVudHMKLQkgICAgICArIGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50KTsKLSAgICAgIGVsZl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJmlyZWwsIGVyZWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIGlyZWxhOwotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotCi0gICAgICBpcmVsYS5yX29mZnNldCA9IG9mZnNldDsKLSAgICAgIGlyZWxhLnJfaW5mbyA9IEVMRl9SX0lORk8gKGluZHgsIGhvd3RvLT50eXBlKTsKLSAgICAgIGlyZWxhLnJfYWRkZW5kID0gYWRkZW5kOwotICAgICAgZXJlbGEgPSAoKEVsZl9FeHRlcm5hbF9SZWxhICopIHJlbF9oZHItPmNvbnRlbnRzCi0JICAgICAgICsgZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQpOwotICAgICAgZWxmX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJmlyZWxhLCBlcmVsYSk7Ci0gICAgfQotCi0gICsrZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEFsbG9jYXRlIGEgcG9pbnRlciB0byBsaXZlIGluIGEgbGlua2VyIGNyZWF0ZWQgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLWVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgbHNlY3QsIGgsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLXsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKipwdHJfbGlua2VyX3NlY3Rpb25fcHRyID0gTlVMTDsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKmxpbmtlcl9zZWN0aW9uX3B0cjsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keCA9IEVMRl9SX1NZTSAocmVsLT5yX2luZm8pOzsKLQotICBCRkRfQVNTRVJUIChsc2VjdCAhPSBOVUxMKTsKLQotICAvKiBJcyB0aGlzIGEgZ2xvYmFsIHN5bWJvbD8gKi8KLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBIYXMgdGhpcyBzeW1ib2wgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgaWYgc28sIG91ciB3b3JrIGlzIGRvbmUgKi8KLSAgICAgIGlmIChfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGgtPmxpbmtlcl9zZWN0aW9uX3BvaW50ZXIsCi0JCQkJCQlyZWwtPnJfYWRkZW5kLAotCQkJCQkJbHNlY3QtPndoaWNoKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9ICZoLT5saW5rZXJfc2VjdGlvbl9wb2ludGVyOwotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24pCi0JbHNlY3QtPnJlbF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgfQotCi0gIGVsc2UgIC8qIEFsbG9jYXRpb24gb2YgYSBwb2ludGVyIHRvIGEgbG9jYWwgc3ltYm9sICovCi0gICAgewotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKipwdHIgPSBlbGZfbG9jYWxfcHRyX29mZnNldHMgKGFiZmQpOwotCi0gICAgICAvKiBBbGxvY2F0ZSBhIHRhYmxlIHRvIGhvbGQgdGhlIGxvY2FsIHN5bWJvbHMgaWYgZmlyc3QgdGltZSAqLwotICAgICAgaWYgKCFwdHIpCi0JewotCSAgdW5zaWduZWQgaW50IG51bV9zeW1ib2xzID0gZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9pbmZvOwotCSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkgIHB0ciA9IChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKikKLQkgICAgYmZkX2FsbG9jIChhYmZkLCBudW1fc3ltYm9scyAqIHNpemVvZiAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKikpOwotCi0JICBpZiAoIXB0cikKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBlbGZfbG9jYWxfcHRyX29mZnNldHMgKGFiZmQpID0gcHRyOwotCSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1ib2xzOyBpKyspCi0JICAgIHB0cltpXSA9IChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci0JfQotCi0gICAgICAvKiBIYXMgdGhpcyBzeW1ib2wgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgaWYgc28sIG91ciB3b3JrIGlzIGRvbmUgKi8KLSAgICAgIGlmIChfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKHB0cltyX3N5bW5keF0sCi0JCQkJCQlyZWwtPnJfYWRkZW5kLAotCQkJCQkJbHNlY3QtPndoaWNoKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9ICZwdHJbcl9zeW1uZHhdOwotCi0gICAgICBpZiAoaW5mby0+c2hhcmVkKQotCXsKLQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotCSAgICAgb3V0cHV0IGEgUl88eHh4Pl9SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotCSAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JICBCRkRfQVNTRVJUIChsc2VjdC0+cmVsX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICBsc2VjdC0+cmVsX3NlY3Rpb24tPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKTsKLQl9Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIHBvaW50ZXIgaW4gdGhlIGxpbmtlciBzZWN0aW9uLCBhbmQgYWxsb2NhdGUgYSBuZXcgcG9pbnRlciByZWNvcmQKLSAgICAgZnJvbSBpbnRlcm5hbCBtZW1vcnkuICAqLwotICBCRkRfQVNTRVJUIChwdHJfbGlua2VyX3NlY3Rpb25fcHRyICE9IE5VTEwpOwotICBsaW5rZXJfc2VjdGlvbl9wdHIgPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QpKTsKLQotICBpZiAoIWxpbmtlcl9zZWN0aW9uX3B0cikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbGlua2VyX3NlY3Rpb25fcHRyLT5uZXh0ID0gKnB0cl9saW5rZXJfc2VjdGlvbl9wdHI7Ci0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+YWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSAgbGlua2VyX3NlY3Rpb25fcHRyLT53aGljaCA9IGxzZWN0LT53aGljaDsKLSAgbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCA9IGZhbHNlOwotICAqcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9IGxpbmtlcl9zZWN0aW9uX3B0cjsKLQotI2lmIDAKLSAgaWYgKGxzZWN0LT5ob2xlX3NpemUgJiYgbHNlY3QtPmhvbGVfb2Zmc2V0IDwgbHNlY3QtPm1heF9ob2xlX29mZnNldCkKLSAgICB7Ci0gICAgICBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCA9IGxzZWN0LT5zZWN0aW9uLT5fcmF3X3NpemUgLSBsc2VjdC0+aG9sZV9zaXplICsgKEFSQ0hfU0laRSAvIDgpOwotICAgICAgbHNlY3QtPmhvbGVfb2Zmc2V0ICs9IEFSQ0hfU0laRSAvIDg7Ci0gICAgICBsc2VjdC0+c3ltX29mZnNldCAgKz0gQVJDSF9TSVpFIC8gODsKLSAgICAgIGlmIChsc2VjdC0+c3ltX2hhc2gpCS8qIEJ1bXAgdXAgc3ltYm9sIHZhbHVlIGlmIG5lZWRlZCAqLwotCXsKLQkgIGxzZWN0LT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZSArPSBBUkNIX1NJWkUgLyA4OwotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJCdW1wIHVwICVzIGJ5ICVsZCwgY3VycmVudCB2YWx1ZSA9ICVsZFxuIiwKLQkJICAgbHNlY3QtPnN5bV9oYXNoLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAobG9uZylBUkNIX1NJWkUgLyA4LAotCQkgICAobG9uZylsc2VjdC0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUpOwotI2VuZGlmCi0JfQotICAgIH0KLSAgZWxzZQotI2VuZGlmCi0gICAgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQgPSBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplOwotCi0gIGxzZWN0LT5zZWN0aW9uLT5fcmF3X3NpemUgKz0gQVJDSF9TSVpFIC8gODsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIkNyZWF0ZSBwb2ludGVyIGluIGxpbmtlciBzZWN0aW9uICVzLCBvZmZzZXQgPSAlbGQsIHNlY3Rpb24gc2l6ZSA9ICVsZFxuIiwKLQkgICBsc2VjdC0+bmFtZSwgKGxvbmcpbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQsIChsb25nKWxzZWN0LT5zZWN0aW9uLT5fcmF3X3NpemUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIGJmZF9wdXRfcHRyKEJGRCxWQUwsQUREUikgYmZkX3B1dF82NCAoQkZELCBWQUwsIEFERFIpCi0jZW5kaWYKLSNpZiBBUkNIX1NJWkU9PTMyCi0jZGVmaW5lIGJmZF9wdXRfcHRyKEJGRCxWQUwsQUREUikgYmZkX3B1dF8zMiAoQkZELCBWQUwsIEFERFIpCi0jZW5kaWYKLQotLyogRmlsbCBpbiB0aGUgYWRkcmVzcyBmb3IgYSBwb2ludGVyIGdlbmVyYXRlZCBpbiBhbGlua2VyIHNlY3Rpb24uICAqLwotCi1iZmRfdm1hCi1lbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywgbHNlY3QsIGgsIHJlbG9jYXRpb24sIHJlbCwgcmVsYXRpdmVfcmVsb2MpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIGludCByZWxhdGl2ZV9yZWxvYzsKLXsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKmxpbmtlcl9zZWN0aW9uX3B0cjsKLQotICBCRkRfQVNTRVJUIChsc2VjdCAhPSBOVUxMKTsKLQotICBpZiAoaCAhPSBOVUxMKQkJLyogZ2xvYmFsIHN5bWJvbCAqLwotICAgIHsKLSAgICAgIGxpbmtlcl9zZWN0aW9uX3B0ciA9IF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoaC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlciwKLQkJCQkJCQkJIHJlbC0+cl9hZGRlbmQsCi0JCQkJCQkJCSBsc2VjdC0+d2hpY2gpOwotCi0gICAgICBCRkRfQVNTRVJUIChsaW5rZXJfc2VjdGlvbl9wdHIgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICB8fCAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgaW5mby0+c3ltYm9saWMKLQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQl7Ci0JICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLQkgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JICAgICBsb2NhbGx5LiAgV2UgbXVzdCBpbml0aWFsaXplIHRoaXMgZW50cnkgaW4gdGhlCi0JICAgICBnbG9iYWwgc2VjdGlvbi4KLQotCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuPHh4eD4KLQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzCi0JICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JICBpZiAoIWxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3ApCi0JICAgIHsKLQkgICAgICBsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0X3B0ciAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiArIGxpbmtlcl9zZWN0aW9uX3B0ci0+YWRkZW5kLAotCQkJICBsc2VjdC0+c2VjdGlvbi0+Y29udGVudHMgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCQkJCS8qIGxvY2FsIHN5bWJvbCAqLwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyAoaW5wdXRfYmZkKSAhPSBOVUxMKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyAoaW5wdXRfYmZkKVtyX3N5bW5keF0gIT0gTlVMTCk7Ci0gICAgICBsaW5rZXJfc2VjdGlvbl9wdHIgPSBfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyAoaW5wdXRfYmZkKVtyX3N5bW5keF0sCi0JCQkJCQkJCSByZWwtPnJfYWRkZW5kLAotCQkJCQkJCQkgbHNlY3QtPndoaWNoKTsKLQotICAgICAgQkZEX0FTU0VSVCAobGlua2VyX3NlY3Rpb25fcHRyICE9IE5VTEwpOwotCi0gICAgICAvKiBXcml0ZSBvdXQgcG9pbnRlciBpZiBpdCBoYXNuJ3QgYmVlbiByZXdyaXR0ZW4gb3V0IGJlZm9yZSAqLwotICAgICAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wKQotCXsKLQkgIGxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3AgPSB0cnVlOwotCSAgYmZkX3B1dF9wdHIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24gKyBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCwKLQkJICAgICAgIGxzZWN0LT5zZWN0aW9uLT5jb250ZW50cyArIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0KTsKLQotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzcmVsID0gbHNlY3QtPnJlbF9zZWN0aW9uOwotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSByZWxhdGl2ZSByZWxvYyBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkgICAgICBpZiAoIXNyZWwpCi0JCWxzZWN0LT5yZWxfc2VjdGlvbiA9IHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkJCQkJCSAgICAgbHNlY3QtPnJlbF9uYW1lKTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAobHNlY3QtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgKyBsc2VjdC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJCSArIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0KTsKLQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGX1JfSU5GTyAoMCwgcmVsYXRpdmVfcmVsb2MpOwotCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0JICAgICAgZWxmX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAoKChFbGZfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCSAgICAgbHNlY3QtPnNlY3Rpb24tPmNvbnRlbnRzKQotCQkJCSAgICArIGVsZl9zZWN0aW9uX2RhdGEgKGxzZWN0LT5zZWN0aW9uKS0+cmVsX2NvdW50KSk7Ci0JICAgICAgKytlbGZfc2VjdGlvbl9kYXRhIChsc2VjdC0+c2VjdGlvbiktPnJlbF9jb3VudDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmVsb2NhdGlvbiA9IChsc2VjdC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkrIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0Ci0JCS0gbHNlY3QtPmhvbGVfb2Zmc2V0Ci0JCS0gbHNlY3QtPnN5bV9vZmZzZXQpOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiRmluaXNoIHBvaW50ZXIgaW4gbGlua2VyIHNlY3Rpb24gJXMsIG9mZnNldCA9ICVsZCAoMHglbHgpXG4iLAotCSAgIGxzZWN0LT5uYW1lLCAobG9uZylyZWxvY2F0aW9uLCAobG9uZylyZWxvY2F0aW9uKTsKLSNlbmRpZgotCi0gIC8qIFN1YnRyYWN0IG91dCB0aGUgYWRkZW5kLCBiZWNhdXNlIGl0IHdpbGwgZ2V0IGFkZGVkIGJhY2sgaW4gYnkgdGhlIG5vcm1hbAotICAgICBwcm9jZXNzaW5nLiAgKi8KLSAgcmV0dXJuIHJlbG9jYXRpb24gLSBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZDsKLX0KLQwKLS8qIEdhcmJhZ2UgY29sbGVjdCB1bnVzZWQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2NfbWFyawotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKnNlYywKLQkgICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotCSAgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zd2VlcAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKLQkgICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAotCQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSkpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX3N3ZWVwX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGlkeHB0cikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBvZmZhcmcpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBQVFIgZHVtbXkpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGR1bW15KSk7Ci0KLS8qIFRoZSBtYXJrIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEZvciBhIGdpdmVuIHNlY3Rpb24sIG1hcmsKLSAgIGl0LCBhbmQgYWxsIHRoZSBzZWN0aW9ucyB3aGljaCBkZWZpbmUgc3ltYm9scyB0byB3aGljaCBpdCByZWZlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX21hcmsgKGluZm8sIHNlYywgZ2NfbWFya19ob29rKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLSAgICAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci17Ci0gIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQotICBzZWMtPmdjX21hcmsgPSAxOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2VjdGlvbiByZWxvY3MuICAqLwotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsc3RhcnQsICpyZWwsICpyZWxlbmQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgICAgIHNpemVfdCBubG9jc3ltczsKLSAgICAgIHNpemVfdCBleHRzeW1vZmY7Ci0gICAgICBFbGZfRXh0ZXJuYWxfU3ltICpsb2NzeW1zLCAqZnJlZXN5bXMgPSBOVUxMOwotICAgICAgYmZkICppbnB1dF9iZmQgPSBzZWMtPm93bmVyOwotICAgICAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpOwotCi0gICAgICAvKiBHQ0ZJWE1FOiBob3cgdG8gYXJyYW5nZSBzbyB0aGF0IHJlbG9jcyBhbmQgc3ltYm9scyBhcmUgbm90Ci0JIHJlcmVhZCBjb250aW51YWxseT8gICovCi0KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICAgICAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gICAgICAvKiBSZWFkIHRoZSBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKLQl7Ci0JICBubG9jc3ltcyA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICAgICAgICAgIGV4dHN5bW9mZiA9IDA7Ci0JfQotICAgICAgZWxzZQotCWV4dHN5bW9mZiA9IG5sb2NzeW1zID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cykKLQlsb2NzeW1zID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICBlbHNlIGlmIChubG9jc3ltcyA9PSAwKQotCWxvY3N5bXMgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGxvY3N5bXMgPSBmcmVlc3ltcyA9Ci0JICAgIGJmZF9tYWxsb2MgKG5sb2NzeW1zICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSk7Ci0JICBpZiAoZnJlZXN5bXMgPT0gTlVMTAotCSAgICAgIHx8IGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGxvY3N5bXMsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0JCQkgICAgbmxvY3N5bXMsIGlucHV0X2JmZCkKLQkJICAhPSBubG9jc3ltcyAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCSAgICB7Ci0JICAgICAgcmV0ID0gZmFsc2U7Ci0JICAgICAgZ290byBvdXQxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoZSByZWxvY2F0aW9ucy4gICovCi0gICAgICByZWxzdGFydCA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCSAgKHNlYy0+b3duZXIsIHNlYywgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgIGluZm8tPmtlZXBfbWVtb3J5KSk7Ci0gICAgICBpZiAocmVsc3RhcnQgPT0gTlVMTCkKLQl7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGdvdG8gb3V0MTsKLQl9Ci0gICAgICByZWxlbmQgPSByZWxzdGFydCArIHNlYy0+cmVsb2NfY291bnQgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsOwotCi0gICAgICBmb3IgKHJlbCA9IHJlbHN0YXJ0OyByZWwgPCByZWxlbmQ7IHJlbCsrKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0JICBhc2VjdGlvbiAqcnNlYzsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgRWxmX0ludGVybmFsX1N5bSBzOwotCi0JICByX3N5bW5keCA9IEVMRl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoZWxmX2JhZF9zeW10YWIgKHNlYy0+b3duZXIpKQotCSAgICB7Ci0JICAgICAgZWxmX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsICZsb2NzeW1zW3Jfc3ltbmR4XSwgJnMpOwotCSAgICAgIGlmIChFTEZfU1RfQklORCAocy5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpCi0JICAgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgTlVMTCwgJnMpOwotCSAgICAgIGVsc2UKLQkJewotCSAgICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0JICAgICAgICAgIHJzZWMgPSAoKmdjX21hcmtfaG9vaykoc2VjLT5vd25lciwgaW5mbywgcmVsLCBoLCBOVUxMKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyX3N5bW5keCA+PSBubG9jc3ltcykKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXTsKLQkgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgaCwgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCAmbG9jc3ltc1tyX3N5bW5keF0sICZzKTsKLQkgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgTlVMTCwgJnMpOwotCSAgICB9Ci0KLQkgIGlmIChyc2VjICYmICFyc2VjLT5nY19tYXJrKQotCSAgICBpZiAoIWVsZl9nY19tYXJrIChpbmZvLCByc2VjLCBnY19tYXJrX2hvb2spKQotCSAgICAgIHsKLQkJcmV0ID0gZmFsc2U7Ci0JCWdvdG8gb3V0MjsKLQkgICAgICB9Ci0JfQotCi0gICAgb3V0MjoKLSAgICAgIGlmICghaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAocmVsc3RhcnQpOwotICAgIG91dDE6Ci0gICAgICBpZiAoZnJlZXN5bXMpCi0JZnJlZSAoZnJlZXN5bXMpOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgc3dlZXAgcGhhc2Ugb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgUmVtb3ZlIGFsbCBnYXJiYWdlIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zd2VlcCAoaW5mbywgZ2Nfc3dlZXBfaG9vaykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKCpnY19zd2VlcF9ob29rKQotICAgICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAotCQljb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci17Ci0gIGJmZCAqc3ViOwotCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpvOwotCi0gICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChzdWIpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgLyogS2VlcCBzcGVjaWFsIHNlY3Rpb25zLiAgS2VlcCAuZGVidWcgc2VjdGlvbnMuICAqLwotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkKLQkgICAgICB8fCAoby0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSkKLQkgICAgby0+Z2NfbWFyayA9IDE7Ci0KLQkgIGlmIChvLT5nY19tYXJrKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2tpcCBzd2VlcGluZyBzZWN0aW9ucyBhbHJlYWR5IGV4Y2x1ZGVkLiAgKi8KLQkgIGlmIChvLT5mbGFncyAmIFNFQ19FWENMVURFKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2luY2UgdGhpcyBpcyBlYXJseSBpbiB0aGUgbGluayBwcm9jZXNzLCBpdCBpcyBzaW1wbGUKLQkgICAgIHRvIHJlbW92ZSBhIHNlY3Rpb24gZnJvbSB0aGUgb3V0cHV0LiAgKi8KLQkgIG8tPmZsYWdzIHw9IFNFQ19FWENMVURFOwotCi0JICAvKiBCdXQgd2UgYWxzbyBoYXZlIHRvIHVwZGF0ZSBzb21lIG9mIHRoZSByZWxvY2F0aW9uCi0JICAgICBpbmZvIHdlIGNvbGxlY3RlZCBiZWZvcmUuICAqLwotCSAgaWYgKGdjX3N3ZWVwX2hvb2sKLQkgICAgICAmJiAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICYmIG8tPnJlbG9jX2NvdW50ID4gMCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgYm9vbGVhbiByOwotCi0JICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykKLQkJCQkgKG8tPm93bmVyLCBvLCBOVUxMLCBOVUxMLCBpbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgciA9ICgqZ2Nfc3dlZXBfaG9vaykoby0+b3duZXIsIGluZm8sIG8sIGludGVybmFsX3JlbG9jcyk7Ci0KLQkgICAgICBpZiAoIWluZm8tPmtlZXBfbWVtb3J5KQotCQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCi0JICAgICAgaWYgKCFyKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFJlbW92ZSB0aGUgc3ltYm9scyB0aGF0IHdlcmUgaW4gdGhlIHN3ZXB0IHNlY3Rpb25zIGZyb20gdGhlIGR5bmFtaWMKLSAgICAgc3ltYm9sIHRhYmxlLiAgR0NGSVhNRTogQW55b25lIGtub3cgaG93IHRvIGdldCB0aGVtIG91dCBvZiB0aGUKLSAgICAgc3RhdGljIHN5bWJvbCB0YWJsZSBhcyB3ZWxsPyAgKi8KLSAgewotICAgIGludCBpID0gMDsKLQotICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBlbGZfZ2Nfc3dlZXBfc3ltYm9sLAotCQkJICAgIChQVFIpICZpKTsKLQotICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgPSBpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN3ZWVwIHN5bWJvbHMgaW4gc3dlcHQgc2VjdGlvbnMuICBDYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX3N3ZWVwX3N5bWJvbCAoaCwgaWR4cHRyKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGlkeHB0cjsKLXsKLSAgaW50ICppZHggPSAoaW50ICopIGlkeHB0cjsKLQotICBpZiAoaC0+ZHluaW5keCAhPSAtMQotICAgICAgJiYgKChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgIHx8IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+Z2NfbWFyaykpCi0gICAgaC0+ZHluaW5keCA9ICgqaWR4KSsrOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcm9wb2dhdGUgY29sbGVjdGVkIHZ0YWJsZSBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgY2FsbGVkIHRocm91Z2gKLSAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkIChoLCBva3ApCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgb2twOwotewotICAvKiBUaG9zZSB0aGF0IGFyZSBub3QgdnRhYmxlcy4gKi8KLSAgaWYgKGgtPnZ0YWJsZV9wYXJlbnQgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBUaG9zZSB2dGFibGVzIHRoYXQgZG8gbm90IGhhdmUgcGFyZW50cywgd2UgY2Fubm90IG1lcmdlLiAgKi8KLSAgaWYgKGgtPnZ0YWJsZV9wYXJlbnQgPT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIC0xKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgYmVlbiBkb25lLCBleGl0LiAgKi8KLSAgaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgJiYgaC0+dnRhYmxlX2VudHJpZXNfdXNlZFstMV0pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBwYXJlbnQncyB0YWJsZSBpcyB1cCB0byBkYXRlLiAgKi8KLSAgZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkIChoLT52dGFibGVfcGFyZW50LCBva3ApOwotCi0gIGlmIChoLT52dGFibGVfZW50cmllc191c2VkID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm9uZSBvZiB0aGlzIHRhYmxlJ3MgZW50cmllcyB3ZXJlIHJlZmVyZW5jZWQuICBSZS11c2UgdGhlCi0JIHBhcmVudCdzIHRhYmxlLiAgKi8KLSAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc191c2VkOwotICAgICAgaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3NpemU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2l6ZV90IG47Ci0gICAgICBib29sZWFuICpjdSwgKnB1OwotCi0gICAgICAvKiBPciB0aGUgcGFyZW50J3MgZW50cmllcyBpbnRvIG91cnMuICAqLwotICAgICAgY3UgPSBoLT52dGFibGVfZW50cmllc191c2VkOwotICAgICAgY3VbLTFdID0gdHJ1ZTsKLSAgICAgIHB1ID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLSAgICAgIGlmIChwdSAhPSBOVUxMKQotCXsKLQkgIG4gPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc19zaXplIC8gRklMRV9BTElHTjsKLQkgIHdoaWxlICgtLW4gIT0gMCkKLQkgICAgewotCSAgICAgIGlmICgqcHUpICpjdSA9IHRydWU7Ci0JICAgICAgcHUrKywgY3UrKzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzIChoLCBva3ApCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgb2twOwotewotICBhc2VjdGlvbiAqc2VjOwotICBiZmRfdm1hIGhzdGFydCwgaGVuZDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbHN0YXJ0LCAqcmVsZW5kLCAqcmVsOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIC8qIFRha2UgY2FyZSBvZiBib3RoIHRob3NlIHN5bWJvbHMgdGhhdCBkbyBub3QgZGVzY3JpYmUgdnRhYmxlcyBhcwotICAgICB3ZWxsIGFzIHRob3NlIHRoYXQgYXJlIG5vdCBsb2FkZWQuICAqLwotICBpZiAoaC0+dnRhYmxlX3BhcmVudCA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLQotICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gIGhzdGFydCA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0gIGhlbmQgPSBoc3RhcnQgKyBoLT5zaXplOwotCi0gIHJlbHN0YXJ0ID0gKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykKLQkgICAgICAoc2VjLT5vd25lciwgc2VjLCBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgdHJ1ZSkpOwotICBpZiAoIXJlbHN0YXJ0KQotICAgIHJldHVybiAqKGJvb2xlYW4gKilva3AgPSBmYWxzZTsKLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKHNlYy0+b3duZXIpOwotICByZWxlbmQgPSByZWxzdGFydCArIHNlYy0+cmVsb2NfY291bnQgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsOwotCi0gIGZvciAocmVsID0gcmVsc3RhcnQ7IHJlbCA8IHJlbGVuZDsgKytyZWwpCi0gICAgaWYgKHJlbC0+cl9vZmZzZXQgPj0gaHN0YXJ0ICYmIHJlbC0+cl9vZmZzZXQgPCBoZW5kKQotICAgICAgewotCS8qIElmIHRoZSBlbnRyeSBpcyBpbiB1c2UsIGRvIG5vdGhpbmcuICAqLwotCWlmIChoLT52dGFibGVfZW50cmllc191c2VkCi0JICAgICYmIChyZWwtPnJfb2Zmc2V0IC0gaHN0YXJ0KSA8IGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUpCi0JICB7Ci0JICAgIGJmZF92bWEgZW50cnkgPSAocmVsLT5yX29mZnNldCAtIGhzdGFydCkgLyBGSUxFX0FMSUdOOwotCSAgICBpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZFtlbnRyeV0pCi0JICAgICAgY29udGludWU7Ci0JICB9Ci0JLyogT3RoZXJ3aXNlLCBraWxsIGl0LiAgKi8KLQlyZWwtPnJfb2Zmc2V0ID0gcmVsLT5yX2luZm8gPSByZWwtPnJfYWRkZW5kID0gMDsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRG8gbWFyayBhbmQgc3dlZXAgb2YgdW51c2VkIHNlY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuIG9rID0gdHJ1ZTsKLSAgYmZkICpzdWI7Ci0gIGFzZWN0aW9uICogKCpnY19tYXJrX2hvb2spCi0gICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotICAgICAgICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotICBpZiAoIWdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y2FuX2djX3NlY3Rpb25zCi0gICAgICB8fCBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEFwcGx5IHRyYW5zaXRpdmUgY2xvc3VyZSB0byB0aGUgdnRhYmxlIGVudHJ5IHVzYWdlIGluZm8uICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCwKLQkJCSAgKFBUUikgJm9rKTsKLSAgaWYgKCFvaykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogS2lsbCB0aGUgdnRhYmxlIHJlbG9jYXRpb25zIHRoYXQgd2VyZSBub3QgdXNlZC4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcywKLQkJCSAgKFBUUikgJm9rKTsKLSAgaWYgKCFvaykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR3JvdmVsIHRocm91Z2ggcmVsb2NzIHRvIGZpbmQgb3V0IHdobyBzdGF5cyAuLi4gICovCi0KLSAgZ2NfbWFya19ob29rID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5nY19tYXJrX2hvb2s7Ci0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpvOwotCi0gICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChzdWIpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgaWYgKG8tPmZsYWdzICYgU0VDX0tFRVApCi0gIAkgICAgaWYgKCFlbGZfZ2NfbWFyayAoaW5mbywgbywgZ2NfbWFya19ob29rKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiAuLi4gYW5kIG1hcmsgU0VDX0VYQ0xVREUgZm9yIHRob3NlIHRoYXQgZ28uICAqLwotICBpZiAoIWVsZl9nY19zd2VlcChpbmZvLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmdjX3N3ZWVwX2hvb2spKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIENhbGxlZCBmcm9tIGNoZWNrX3JlbG9jcyB0byByZWNvcmQgdGhlIGV4aXN0YW5jZSBvZiBhIFZUSU5IRVJJVCByZWxvYy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzZWFyY2gsICpjaGlsZDsKLSAgYmZkX3NpemVfdHlwZSBleHRzeW1jb3VudDsKLQotICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgc3ltdGFiIGhlYWRlciB0ZWxscyB1cyB3aGVyZSB0aGUKLSAgICAgZXh0ZXJuYWwgc3ltYm9scyBzdGFydC4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGxvY2FsIHN5bWJvbHMgYXQKLSAgICAgdGhpcyBwb2ludC4gICovCi0gIGV4dHN5bWNvdW50ID0gZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9zaXplL3NpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIGV4dHN5bWNvdW50IC09IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLQotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBleHRzeW1jb3VudDsKLQotICAvKiBIdW50IGRvd24gdGhlIGNoaWxkIHN5bWJvbCwgd2hpY2ggaXMgaW4gdGhpcyBzZWN0aW9uIGF0IHRoZSBzYW1lCi0gICAgIG9mZnNldCBhcyB0aGUgcmVsb2NhdGlvbi4gICovCi0gIGZvciAoc2VhcmNoID0gc3ltX2hhc2hlczsgc2VhcmNoICE9IHN5bV9oYXNoZXNfZW5kOyArK3NlYXJjaCkKLSAgICB7Ci0gICAgICBpZiAoKGNoaWxkID0gKnNlYXJjaCkgIT0gTlVMTAotCSAgJiYgKGNoaWxkLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgY2hpbGQtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBjaGlsZC0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgY2hpbGQtPnJvb3QudS5kZWYudmFsdWUgPT0gb2Zmc2V0KQotCWdvdG8gd2luOwotICAgIH0KLQotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogJXMrJWx1OiBObyBzeW1ib2wgZm91bmQgZm9yIElOSEVSSVQiLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzZWMtPm5hbWUsCi0JCQkgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KTsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotCi13aW46Ci0gIGlmICghaCkKLSAgICB7Ci0gICAgICAvKiBUaGlzICpzaG91bGQqIG9ubHkgYmUgdGhlIGFic29sdXRlIHNlY3Rpb24uICBJdCBjb3VsZCBwb3RlbnRpYWxseQotCSBiZSB0aGF0IHNvbWVvbmUgaGFzIGRlZmluZWQgYSBub24tZ2xvYmFsIHZ0YWJsZSB0aG91Z2gsIHdoaWNoCi0JIHdvdWxkIGJlIGJhZC4gIEl0IGlzbid0IHdvcnRoIHBhZ2luZyBpbiB0aGUgbG9jYWwgc3ltYm9scyB0byBiZQotCSBzdXJlIHRob3VnaDsgdGhhdCBjYXNlIHNob3VsZCBzaW1wbHkgYmUgaGFuZGxlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotICAgICAgY2hpbGQtPnZ0YWJsZV9wYXJlbnQgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgLTE7Ci0gICAgfQotICBlbHNlCi0gICAgY2hpbGQtPnZ0YWJsZV9wYXJlbnQgPSBoOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsZWQgZnJvbSBjaGVja19yZWxvY3MgdG8gcmVjb3JkIHRoZSBleGlzdGFuY2Ugb2YgYSBWVEVOVFJZIHJlbG9jLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIGFkZGVuZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBpZiAoYWRkZW5kID49IGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUpCi0gICAgewotICAgICAgc2l6ZV90IHNpemUsIGJ5dGVzOwotICAgICAgYm9vbGVhbiAqcHRyID0gaC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLQotICAgICAgLyogV2hpbGUgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIHdlIGhhdmUgdG8gYmUgcHJlcGFyZWQgdG8gaGFuZGxlCi0JIGEgemVybyBzaXplLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0Jc2l6ZSA9IGFkZGVuZDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzaXplID0gaC0+c2l6ZTsKLQkgIGlmIChzaXplIDwgYWRkZW5kKQotCSAgICB7Ci0JICAgICAgLyogT29wcyEgIFdlJ3ZlIGdvdCBhIHJlZmVyZW5jZSBwYXN0IHRoZSBkZWZpbmVkIGVuZCBvZgotCQkgdGhlIHRhYmxlLiAgVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyAtLSBzaGFsbCB3ZSB3YXJuPyAgKi8KLQkgICAgICBzaXplID0gYWRkZW5kOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBvbmUgZXh0cmEgZW50cnkgZm9yIHVzZSBhcyBhICJkb25lIiBmbGFnIGZvciB0aGUKLQkgY29uc29saWRhdGlvbiBwYXNzLiAgKi8KLSAgICAgIGJ5dGVzID0gKHNpemUgLyBGSUxFX0FMSUdOICsgMSkgKiBzaXplb2YgKGJvb2xlYW4pOwotCi0gICAgICBpZiAocHRyKQotCXsKLQkgIHB0ciA9IGJmZF9yZWFsbG9jIChwdHIgLSAxLCBieXRlcyk7Ci0JICAKLQkgIGlmIChwdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNpemVfdCBvbGRieXRlczsKLQotCSAgICAgIG9sZGJ5dGVzID0gKGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUvRklMRV9BTElHTiArIDEpICogc2l6ZW9mIChib29sZWFuKTsKLQkgICAgICBtZW1zZXQgKCgoY2hhciAqKXB0cikgKyBvbGRieXRlcywgMCwgYnl0ZXMgLSBvbGRieXRlcyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JcHRyID0gYmZkX3ptYWxsb2MgKGJ5dGVzKTsKLQotICAgICAgaWYgKHB0ciA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgLyogQW5kIGFycmFuZ2UgZm9yIHRoYXQgZG9uZSBmbGFnIHRvIGJlIGF0IGluZGV4IC0xLiAgKi8KLSAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgPSBwdHIgKyAxOwotICAgICAgaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSA9IHNpemU7Ci0gICAgfQotICAKLSAgaC0+dnRhYmxlX2VudHJpZXNfdXNlZFthZGRlbmQgLyBGSUxFX0FMSUdOXSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFuZCBhbiBhY2NvbXBhbnlpbmcgYml0IHRvIHdvcmsgb3V0IGZpbmFsIGdvdCBlbnRyeSBvZmZzZXRzIG9uY2UKLSAgIHdlJ3JlIGRvbmUuICBTaG91bGQgYmUgY2FsbGVkIGZyb20gZmluYWxfbGluay4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqaTsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgYmZkX3ZtYSBnb3RvZmY7Ci0KLSAgLyogVGhlIEdPVCBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIC5nb3Qgc2VjdGlvbiwgYnV0IHRoZSBHT1QgaGVhZGVyIGlzCi0gICAgIHB1dCBpbnRvIHRoZSAuZ290LnBsdCBzZWN0aW9uLCBpZiB0aGUgYmFja2VuZCB1c2VzIGl0LiAgKi8KLSAgaWYgKGJlZC0+d2FudF9nb3RfcGx0KQotICAgIGdvdG9mZiA9IDA7Ci0gIGVsc2UKLSAgICBnb3RvZmYgPSBiZWQtPmdvdF9oZWFkZXJfc2l6ZTsKLQotICAvKiBEbyB0aGUgbG9jYWwgLmdvdCBlbnRyaWVzIGZpcnN0LiAgKi8KLSAgZm9yIChpID0gaW5mby0+aW5wdXRfYmZkczsgaTsgaSA9IGktPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290OwotICAgICAgYmZkX3NpemVfdHlwZSBqLCBsb2NzeW1jb3VudDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotCi0gICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChpKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCWNvbnRpbnVlOwotCi0gICAgICBsb2NhbF9nb3QgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoaSk7Ci0gICAgICBpZiAoIWxvY2FsX2dvdCkKLQljb250aW51ZTsKLQotICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGkpLT5zeW10YWJfaGRyOwotICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChpKSkKLQlsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICAgICAgZWxzZQotCWxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IGxvY3N5bWNvdW50OyArK2opCi0JewotCSAgaWYgKGxvY2FsX2dvdFtqXSA+IDApCi0JICAgIHsKLQkgICAgICBsb2NhbF9nb3Rbal0gPSBnb3RvZmY7Ci0JICAgICAgZ290b2ZmICs9IEFSQ0hfU0laRSAvIDg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgbG9jYWxfZ290W2pdID0gKGJmZF92bWEpIC0xOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlbiB0aGUgZ2xvYmFsIC5nb3QgYW5kIC5wbHQgZW50cmllcy4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzLAotCQkJICAoUFRSKSAmZ290b2ZmKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIG5lZWQgYSBzcGVjaWFsIHRvcC1sZXZlbCBsaW5rIHJvdXRpbmUgdG8gY29udmVydCBnb3QgcmVmZXJlbmNlIGNvdW50cwotICAgdG8gcmVhbCBnb3Qgb2Zmc2V0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMgKGgsIG9mZmFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBvZmZhcmc7Ci17Ci0gIGJmZF92bWEgKm9mZiA9IChiZmRfdm1hICopIG9mZmFyZzsKLQotICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBoLT5nb3Qub2Zmc2V0ID0gb2ZmWzBdOwotICAgICAgb2ZmWzBdICs9IEFSQ0hfU0laRSAvIDg7Ci0gICAgfQotICBlbHNlCi0gICAgaC0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFueSBmb2xrIG5lZWQgbm8gbW9yZSBpbiB0aGUgd2F5IG9mIGZpbmFsIGxpbmsgdGhhbiB0aGlzLCBvbmNlCi0gICBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50aW5nIGlzIGVuYWJsZWQuICAqLwotCi1ib29sZWFuCi1lbGZfZ2NfY29tbW9uX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmICghZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgcmV0dXJuIGVsZl9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbyk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdGhvdWdoIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgdG8gc3RvcmUKLSAgIGFsbCBoYXNoIHZhbHVlIG9mIHRoZSBleHBvcnRlZCBzeW1ib2xzIGluIGFuIGFycmF5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9jb2xsZWN0X2hhc2hfY29kZXMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgdW5zaWduZWQgbG9uZyAqKnZhbHVlcCA9ICh1bnNpZ25lZCBsb25nICoqKSBkYXRhOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjaGFyICpwOwotICB1bnNpZ25lZCBsb25nIGhhOwotICBjaGFyICphbGMgPSBOVUxMOwotCi0gIC8qIElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhlc2UgYXJlIGFkZGVkIGJ5IHRoZSB2ZXJzaW9uaW5nIGNvZGUuICAqLwotICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcCA9IHN0cmNociAobmFtZSwgRUxGX1ZFUl9DSFIpOwotICBpZiAocCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFsYyA9IGJmZF9tYWxsb2MgKHAgLSBuYW1lICsgMSk7Ci0gICAgICBtZW1jcHkgKGFsYywgbmFtZSwgcCAtIG5hbWUpOwotICAgICAgYWxjW3AgLSBuYW1lXSA9ICdcMCc7Ci0gICAgICBuYW1lID0gYWxjOwotICAgIH0KLQotICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlLiAgKi8KLSAgaGEgPSBiZmRfZWxmX2hhc2ggKG5hbWUpOwotCi0gIC8qIFN0b3JlIHRoZSBmb3VuZCBoYXNoIHZhbHVlIGluIHRoZSBhcnJheSBnaXZlbiBhcyB0aGUgYXJndW1lbnQuICAqLwotICAqKCp2YWx1ZXApKysgPSBoYTsKLQotICAvKiBBbmQgc3RvcmUgaXQgaW4gdGhlIHN0cnVjdCBzbyB0aGF0IHdlIGNhbiBwdXQgaXQgaW4gdGhlIGhhc2ggdGFibGUKLSAgICAgbGF0ZXIuICAqLwotICBoLT5lbGZfaGFzaF92YWx1ZSA9IGhhOwotCi0gIGlmIChhbGMgIT0gTlVMTCkKLSAgICBmcmVlIChhbGMpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZnh4LXRhcmdldC5oIGIvYmZkL2VsZnh4LXRhcmdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY0ODY3Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGZ4eC10YXJnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vKiBUYXJnZXQgZGVmaW5pdGlvbnMgZm9yIE5OLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYSB0YXJnZXQuCi0gICBJdCBpbmNsdWRlcyB0aGluZ3MgbGlrZSBpdHMgYnl0ZSBvcmRlciwgbmFtZSwgd2hhdCByb3V0aW5lcyB0byBjYWxsCi0gICB0byBkbyB2YXJpb3VzIG9wZXJhdGlvbnMsIGV0Yy4gIEV2ZXJ5IEJGRCBwb2ludHMgdG8gYSB0YXJnZXQgc3RydWN0dXJlCi0gICB3aXRoIGl0cyAieHZlYyIgbWVtYmVyLgotCi0gICBUaGVyZSBhcmUgdHdvIHN1Y2ggc3RydWN0dXJlcyBoZXJlOiAgb25lIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzIGFuZAotICAgb25lIGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLiAgICovCi0KLSNkZWZpbmUJYmZkX2VsZk5OX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc2VjdGlvbl9jb250ZW50cyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jZGVmaW5lIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZGVmaW5lIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfcmVsb2MJX2JmZF9lbGZfY2Fub25pY2FsaXplX3JlbG9jCi0jaWZuZGVmIGJmZF9lbGZOTl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmTk5fZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUKLSNlbmRpZgotI2RlZmluZSBiZmRfZWxmTk5fcmVhZF9taW5pc3ltYm9scwlfYmZkX2VsZl9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGJmZF9lbGZOTl9taW5pc3ltYm9sX3RvX3N5bWJvbAlfYmZkX2VsZl9taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X2xpbmVubwkJX2JmZF9lbGZfZ2V0X2xpbmVubwotI2lmbmRlZiBiZmRfZWxmTk5fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zeW1ib2xfaW5mbwlfYmZkX2VsZl9nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zeW10YWIJCV9iZmRfZWxmX2dldF9zeW10YWIKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9lbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2lmIDAgLyogZG9uZSBpbiBlbGYtYmZkLmggKi8KLSNkZWZpbmUgYmZkX2VsZk5OX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sCi0jZW5kaWYKLSNkZWZpbmUgYmZkX2VsZk5OX21ha2VfZW1wdHlfc3ltYm9sCV9iZmRfZWxmX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIGJmZF9lbGZOTl9uZXdfc2VjdGlvbl9ob29rCV9iZmRfZWxmX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgYmZkX2VsZk5OX3NldF9hcmNoX21hY2gJCV9iZmRfZWxmX3NldF9hcmNoX21hY2gKLSNpZm5kZWYgYmZkX2VsZk5OX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGZOTl9zZXRfc2VjdGlvbl9jb250ZW50cwlfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9zaXplb2ZfaGVhZGVycwlfYmZkX2VsZl9zaXplb2ZfaGVhZGVycwotI2RlZmluZSBiZmRfZWxmTk5fd3JpdGVfb2JqZWN0X2NvbnRlbnRzIF9iZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fd3JpdGVfY29yZWZpbGVfY29udGVudHMgX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMKLQotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0IChiZmRfdm1hKSAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCAyCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfd2FudF9keW5ic3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9keW5ic3MgMQotI2VuZGlmCi0KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CWJmZF92b2lkCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19lbmQJYmZkX3ZvaWQKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJKFBST1RPKHZvaWQsKCopLChiZmQqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJTlVMTAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawlOVUxMCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2djX3NlY3Rpb25zIF9iZmRfZWxmTk5fZ2Nfc2VjdGlvbnMKLSNlbmRpZgotCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZW5kaWYKLQotI2lmZGVmIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNlbHNlIC8qICEgZGVmaW5lZCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbikgKi8KLS8qIElmIG5vIGJhY2tlbmQgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLCB1c2UgdGhlIGdlbmVyaWMgbGlua2VyLiAgKi8KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19hZGRfc3ltYm9scwlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfZmluYWxfbGluawotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2ZpbmFsX2xpbmsJX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNlbmRpZgotI2VuZGlmIC8qICEgZGVmaW5lZCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbikgKi8KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2FyY2hpdmVfcAotI2RlZmluZSBiZmRfZWxmTk5fYXJjaGl2ZV9wIGJmZF9nZW5lcmljX2FyY2hpdmVfcAotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fbWtvYmplY3QKLSNkZWZpbmUgYmZkX2VsZk5OX21rb2JqZWN0IGJmZF9lbGZfbWtvYmplY3QKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0jZGVmaW5lIGJmZF9lbGZOTl9ta2NvcmVmaWxlIGJmZF9lbGZfbWtjb3JlZmlsZQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX21rYXJjaGl2ZQotI2RlZmluZSBiZmRfZWxmTk5fbWthcmNoaXZlIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgMAotI2VuZGlmCi0KLSNpZm5kZWYgRUxGX01BWFBBR0VTSVpFCi0gICNlcnJvciBFTEZfTUFYUEFHRVNJWkUgaXMgbm90IGRlZmluZWQKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIDEKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2NvbGxlY3QKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY29sbGVjdCBmYWxzZQotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rIGZhbHNlCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCU5VTEwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wcmludF9zeW1ib2xfYWxsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwJCU5VTEwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX291dHB1dF9hcmNoX3N5bXMJCU5VTEwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9jb3B5X2luZGlyZWN0X3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9jb3B5X2luZGlyZWN0X3N5bWJvbCAgX2JmZF9lbGZfbGlua19oYXNoX2NvcHlfaW5kaXJlY3QKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9oaWRlX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9oaWRlX3N5bWJvbAkJX2JmZF9lbGZfbGlua19oYXNoX2hpZGVfc3ltYm9sCi0jZW5kaWYKLQotCi0vKiBQcmV2aW91c2x5LCBiYWNrZW5kcyBjb3VsZCBvbmx5IHVzZSBTSFRfUkVMIG9yIFNIVF9SRUxBIHJlbG9jYXRpb24KLSAgIHNlY3Rpb25zLCBidXQgbm90IGJvdGguICBUaGV5IGRlZmluZWQgVVNFX1JFTCB0byBpbmRpY2F0ZSBTSFRfUkVMCi0gICBzZWN0aW9ucywgYW5kIGxlZnQgaXQgdW5kZWZpbmVkIHRvIGluZGljYXRlZCBTSFRfUkVMQSBzZWN0aW9ucy4KLSAgIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2Ugc3RpbGwgc3VwcG9ydCB0aGlzIHVzYWdlLiAgKi8KLSNpZm5kZWYgVVNFX1JFTAotI2RlZmluZSBVU0VfUkVMIDAKLSNlbHNlCi0jdW5kZWYgVVNFX1JFTAotI2RlZmluZSBVU0VfUkVMIDEKLSNlbmRpZiAKLQotLyogVXNlIHRoZXNlIGluIG5ldyBjb2RlLiAgKi8KLSNpZm5kZWYgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxfcCAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxfcCBVU0VfUkVMCi0jZW5kaWYgCi0jaWZuZGVmIGVsZl9iYWNrZW5kX21heV91c2VfcmVsYV9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21heV91c2VfcmVsYV9wICFVU0VfUkVMCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wIAotI2RlZmluZSBlbGZfYmFja2VuZF9kZWZhdWx0X3VzZV9yZWxhX3AgIVVTRV9SRUwKLSNlbmRpZgotCi0jaWZuZGVmIEVMRl9NQUNISU5FX0FMVDEKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMSAwCi0jZW5kaWYKLQotI2lmbmRlZiBFTEZfTUFDSElORV9BTFQyCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDIgMAotI2VuZGlmCi0KLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfaW5mbyBfYmZkX2VsZk5OX3NpemVfaW5mbwotI2VuZGlmCi0KLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2lnbl9leHRlbmRfdm1hCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpZ25fZXh0ZW5kX3ZtYSAwCi0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvIF9iZmRfZWxmTk5fc2l6ZV9pbmZvOwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgZWxmTk5fYmVkID0KLXsKLSAgRUxGX0FSQ0gsCQkJLyogYXJjaCAqLwotICBFTEZfTUFDSElORV9DT0RFLAkJLyogZWxmX21hY2hpbmVfY29kZSAqLwotICBFTEZfTUFYUEFHRVNJWkUsCQkvKiBtYXhwYWdlc2l6ZSAqLwotICBlbGZfaW5mb190b19ob3d0bywKLSAgZWxmX2luZm9fdG9faG93dG9fcmVsLAotICBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsLAotICBlbGZfYmFja2VuZF9vYmplY3RfcCwKLSAgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nLAotICBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUsCi0gIGVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIsCi0gIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyLAotICBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24sCi0gIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vaywKLSAgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2ssCi0gIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MsCi0gIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiwKLSAgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotICBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMsCi0gIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCwKLSAgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAotICBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rLAotICBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycywKLSAgZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbCwKLSAgZWxmX2JhY2tlbmRfb3V0cHV0X2FyY2hfc3ltcywKLSAgZWxmX2JhY2tlbmRfY29weV9pbmRpcmVjdF9zeW1ib2wsCi0gIGVsZl9iYWNrZW5kX2hpZGVfc3ltYm9sLAotICBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwLAotICBFTEZfTUFDSElORV9BTFQxLAotICBFTEZfTUFDSElORV9BTFQyLAotICAmZWxmX2JhY2tlbmRfc2l6ZV9pbmZvLAotICBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCwKLSAgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplLAotICBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUsCi0gIGVsZl9iYWNrZW5kX2NvbGxlY3QsCi0gIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rLAotICBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbF9wLAotICBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcCwKLSAgZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wLAotICBlbGZfYmFja2VuZF9zaWduX2V4dGVuZF92bWEsCi0gIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCwKLSAgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5LAotICBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0sCi0gIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkLAotICBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50LAotICBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzCi19OwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciB1c2Ugd2hlbiBpbml0aWFsaXNpbmcgYWx0ZXJuYXRpdmVfdGFyZ2V0IGZpZWxkLiAgKi8KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU07Ci0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9CSUdfU1lNID0KLXsKLSAgLyogbmFtZTogaWRlbnRpZnkga2luZCBvZiB0YXJnZXQgKi8KLSAgVEFSR0VUX0JJR19OQU1FLAotCi0gIC8qIGZsYXZvdXI6IGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCBmaWxlICovCi0gIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCi0KLSAgLyogYnl0ZW9yZGVyOiBkYXRhIGlzIGJpZyBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9CSUcsCi0KLSAgLyogaGVhZGVyX2J5dGVvcmRlcjogaGVhZGVyIGlzIGFsc28gYmlnIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0JJRywKLQotICAvKiBvYmplY3RfZmxhZ3M6IG1hc2sgb2YgYWxsIGZpbGUgZmxhZ3MgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfAotICAgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAvKiBzZWN0aW9uX2ZsYWdzOiBtYXNrIG9mIGFsbCBzZWN0aW9uIGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfUkVBRE9OTFkgfAotICAgU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ERUJVR0dJTkcgfCBTRUNfRVhDTFVERSB8IFNFQ19TT1JUX0VOVFJJRVMpLAotCi0gICAvKiBsZWFkaW5nX3N5bWJvbF9jaGFyOiBpcyB0aGUgZmlyc3QgY2hhciBvZiBhIHVzZXIgc3ltYm9sCi0gICAgICBwcmVkaWN0YWJsZSwgYW5kIGlmIHNvIHdoYXQgaXMgaXQgKi8KLSAgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0KLSAgLyogYXJfcGFkX2NoYXI6IHBhZCBjaGFyYWN0ZXIgZm9yIGZpbGVuYW1lcyB3aXRoaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIEVMRiwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQvb3Igb3MgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUgKi8KLSAgJy8nLAotCi0gIC8qIGFyX21heF9uYW1lbGVuOiBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBFTEYsIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUuICBUaGlzIHZhbHVlIGlzCi0gICAgIGEgV0FHICh3aWxkIGEqKiBndWVzcykgKi8KLSAgMTQsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZGF0YSBzZWN0aW9ucyAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBmaWxlIGhlYWRlcnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0KLSAgLyogYmZkX2NoZWNrX2Zvcm1hdDogY2hlY2sgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgcmVhZCAqLwotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICBiZmRfZWxmTk5fb2JqZWN0X3AsCQkvKiBhc3NlbWJsZXIvbGlua2VyIG91dHB1dCAob2JqZWN0IGZpbGUpICovCi0gICAgYmZkX2VsZk5OX2FyY2hpdmVfcCwJLyogYW4gYXJjaGl2ZSAqLwotICAgIGJmZF9lbGZOTl9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICB9LAotCi0gIC8qIGJmZF9zZXRfZm9ybWF0OiBzZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBiZmRfZWxmTk5fbWtvYmplY3QsCi0gICAgYmZkX2VsZk5OX21rYXJjaGl2ZSwKLSAgICBiZmRfZWxmTk5fbWtjb3JlZmlsZQotICB9LAotCi0gIC8qIGJmZF93cml0ZV9jb250ZW50czogd3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgYmZkX2VsZk5OX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBiZmRfZWxmTk5fd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZWxmTk5fd3JpdGVfY29yZWZpbGVfY29udGVudHMsCi0gIH0sCi0KLSAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoYmZkX2VsZk5OKSwKLSNpZmRlZiBiZmRfZWxmTk5fYXJjaGl2ZV9mdW5jdGlvbnMKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKGJmZF9lbGZOTl9hcmNoaXZlKSwKLSNlbHNlCi0gICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0jZW5kaWYKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChiZmRfZWxmTk4pLAotCi0gIC8qIEFsdGVybmF0aXZlIGVuZGlhbiB0YXJnZXQuICAqLwotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0gICYgVEFSR0VUX0xJVFRMRV9TWU0sCi0jZWxzZQotICBOVUxMLAotI2VuZGlmCi0KLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSAmZWxmTk5fYmVkCi19OwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9MSVRUTEVfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGxpdHRsZSBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwKLSAgIERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfREVCVUdHSU5HIHwgU0VDX0VYQ0xVREUgfCBTRUNfU09SVF9FTlRSSUVTKSwKLQotICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLAotCi0gIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBFTEYsIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCi0gICcvJywKLQotICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcwotICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCi0gIDE0LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KLSAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgYmZkX2VsZk5OX29iamVjdF9wLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9lbGZOTl9hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBiZmRfZWxmTk5fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgYmZkX2VsZk5OX21rb2JqZWN0LAotICAgIGJmZF9lbGZOTl9ta2FyY2hpdmUsCi0gICAgYmZkX2VsZk5OX21rY29yZWZpbGUKLSAgfSwKLQotICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAotICB9LAotCi0gICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGJmZF9lbGZOTiksCi0jaWZkZWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zCi0gICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChiZmRfZWxmTk5fYXJjaGl2ZSksCi0jZWxzZQotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotI2VuZGlmCi0gICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoYmZkX2VsZk5OKSwKLQotICAvKiBBbHRlcm5hdGl2ZSBlbmRpYW4gdGFyZ2V0LiAgKi8KLSNpZmRlZiBUQVJHRVRfQklHX1NZTQotICAmIFRBUkdFVF9CSUdfU1lNLAotI2Vsc2UKLSAgTlVMTCwKLSNlbmRpZgotICAKLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSAmZWxmTk5fYmVkCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvZXBvYy1wZS1hcm0uYyBiL2JmZC9lcG9jLXBlLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGEyNzdhLi4wMDAwMDAwCi0tLSBhL2JmZC9lcG9jLXBlLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBUk0gRVBPQyBQRSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgICAgMAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAgICAiIgotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybV9lcG9jX3BlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgImVwb2MtcGUtYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAiZXBvYy1wZS1hcm0tYmlnIgotCi0jZGVmaW5lIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfYXJtX2Vwb2NfcGVfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIFwKLQliZmRfYXJtX2Vwb2NfcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0jZGVmaW5lIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCi0JYmZkX2FybV9lcG9jX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLQotI2luY2x1ZGUgInBlLWFybS5jIgotCmRpZmYgLS1naXQgYS9iZmQvZXBvYy1wZWktYXJtLmMgYi9iZmQvZXBvYy1wZWktYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMjU0OGQuLjAwMDAwMDAKLS0tIGEvYmZkL2Vwb2MtcGVpLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBUk0gRVBPQyBQRSBJTUFHRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAgICAwCi0jZGVmaW5lIFVTRVJfTEFCRUxfUFJFRklYICAgICIiCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgImVwb2MtcGVpLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybV9lcG9jX3BlaV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICJlcG9jLXBlaS1hcm0tYmlnIgotCi0jaW5jbHVkZSAicGVpLWFybS5jIgotCmRpZmYgLS1naXQgYS9iZmQvZm9ybWF0LmMgYi9iZmQvZm9ybWF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjFmOWMuLjAwMDAwMDAKLS0tIGEvYmZkL2Zvcm1hdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qIEdlbmVyaWMgQkZEIHN1cHBvcnQgZm9yIGZpbGUgZm9ybWF0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCUZpbGUgZm9ybWF0cwotCi0JQSBmb3JtYXQgaXMgYSBCRkQgY29uY2VwdCBvZiBoaWdoIGxldmVsIGZpbGUgY29udGVudHMgdHlwZS4gVGhlCi0JZm9ybWF0cyBzdXBwb3J0ZWQgYnkgQkZEIGFyZTogCi0KLQlvIDw8YmZkX29iamVjdD4+Ci0KLQlUaGUgQkZEIG1heSBjb250YWluIGRhdGEsIHN5bWJvbHMsIHJlbG9jYXRpb25zIGFuZCBkZWJ1ZyBpbmZvLgotCi0JbyA8PGJmZF9hcmNoaXZlPj4KLQotCVRoZSBCRkQgY29udGFpbnMgb3RoZXIgQkZEcyBhbmQgYW4gb3B0aW9uYWwgaW5kZXguCi0KLQlvIDw8YmZkX2NvcmU+PgotCi0JVGhlIEJGRCBjb250YWlucyB0aGUgcmVzdWx0IG9mIGFuIGV4ZWN1dGFibGUgY29yZSBkdW1wLgotCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogSU1QT1JUIGZyb20gdGFyZ2V0cy5jLiAgKi8KLWV4dGVybiBjb25zdCBzaXplX3QgX2JmZF90YXJnZXRfdmVjdG9yX2VudHJpZXM7Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jaGVja19mb3JtYXQKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jaGVja19mb3JtYXQoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCk7Ci0KLURFU0NSSVBUSU9OCi0JVmVyaWZ5IGlmIHRoZSBmaWxlIGF0dGFjaGVkIHRvIHRoZSBCRkQgQHZhcnthYmZkfSBpcyBjb21wYXRpYmxlCi0Jd2l0aCB0aGUgZm9ybWF0IEB2YXJ7Zm9ybWF0fSAoaS5lLiwgb25lIG9mIDw8YmZkX29iamVjdD4+LAotCTw8YmZkX2FyY2hpdmU+PiBvciA8PGJmZF9jb3JlPj4pLgotCi0JSWYgdGhlIEJGRCBoYXMgYmVlbiBzZXQgdG8gYSBzcGVjaWZpYyB0YXJnZXQgYmVmb3JlIHRoZQotCWNhbGwsIG9ubHkgdGhlIG5hbWVkIHRhcmdldCBhbmQgZm9ybWF0IGNvbWJpbmF0aW9uIGlzCi0JY2hlY2tlZC4gSWYgdGhlIHRhcmdldCBoYXMgbm90IGJlZW4gc2V0LCBvciBoYXMgYmVlbiBzZXQgdG8KLQk8PGRlZmF1bHQ+PiwgdGhlbiBhbGwgdGhlIGtub3duIHRhcmdldCBiYWNrZW5kcyBpcwotCWludGVycm9nYXRlZCB0byBkZXRlcm1pbmUgYSBtYXRjaC4gIElmIHRoZSBkZWZhdWx0IHRhcmdldAotCW1hdGNoZXMsIGl0IGlzIHVzZWQuICBJZiBub3QsIGV4YWN0bHkgb25lIHRhcmdldCBtdXN0IHJlY29nbml6ZQotCXRoZSBmaWxlLCBvciBhbiBlcnJvciByZXN1bHRzLgotCi0JVGhlIGZ1bmN0aW9uIHJldHVybnMgPDx0cnVlPj4gb24gc3VjY2Vzcywgb3RoZXJ3aXNlIDw8ZmFsc2U+PgotCXdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6ICAKLQotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JaWYgPDxmb3JtYXQ+PiBpcyBub3Qgb25lIG9mIDw8YmZkX29iamVjdD4+LCA8PGJmZF9hcmNoaXZlPj4gb3IKLQk8PGJmZF9jb3JlPj4uCi0KLQlvIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4gLQotCWlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIGEgcmVhZCAtIGV2ZW4gc29tZSBmaWxlIG1pc21hdGNoZXMKLQljYW4gY2F1c2UgYmZkX2Vycm9yX3N5c3RlbV9jYWxscy4KLQotCW8gPDxmaWxlX25vdF9yZWNvZ25pc2VkPj4gLQotCW5vbmUgb2YgdGhlIGJhY2tlbmRzIHJlY29nbmlzZWQgdGhlIGZpbGUgZm9ybWF0LgotCi0JbyA8PGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQ+PiAtCi0JbW9yZSB0aGFuIG9uZSBiYWNrZW5kIHJlY29nbmlzZWQgdGhlIGZpbGUgZm9ybWF0LgotKi8KLQotYm9vbGVhbgotYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgZm9ybWF0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9mb3JtYXQgZm9ybWF0OwotewotICByZXR1cm4gYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBmb3JtYXQsIE5VTEwpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyhiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0LCBjaGFyICoqKm1hdGNoaW5nKTsKLQotREVTQ1JJUFRJT04KLQlMaWtlIDw8YmZkX2NoZWNrX2Zvcm1hdD4+LCBleGNlcHQgd2hlbiBpdCByZXR1cm5zIGZhbHNlIHdpdGgKLQk8PGJmZF9lcnJubz4+IHNldCB0byA8PGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQ+Pi4gIEluIHRoYXQKLQljYXNlLCBpZiBAdmFye21hdGNoaW5nfSBpcyBub3QgTlVMTCwgaXQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotCWEgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHRoZSBmb3JtYXRzIHRoYXQgbWF0Y2hlZCwKLQlhbGxvY2F0ZWQgd2l0aCA8PG1hbGxvYz4+LgotCVRoZW4gdGhlIHVzZXIgbWF5IGNob29zZSBhIGZvcm1hdCBhbmQgdHJ5IGFnYWluLgotCi0JV2hlbiBkb25lIHdpdGggdGhlIGxpc3QgdGhhdCBAdmFye21hdGNoaW5nfSBwb2ludHMgdG8sIHRoZSBjYWxsZXIKLQlzaG91bGQgZnJlZSBpdC4gIAotKi8KLQotYm9vbGVhbgotYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBmb3JtYXQsIG1hdGNoaW5nKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9mb3JtYXQgZm9ybWF0OwotICAgICBjaGFyICoqKm1hdGNoaW5nOwotewotICBleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiaW5hcnlfdmVjOwotICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldCwgKnNhdmVfdGFyZywgKnJpZ2h0X3Rhcmc7Ci0gIGNoYXIgKiptYXRjaGluZ192ZWN0b3IgPSBOVUxMOwotICBpbnQgbWF0Y2hfY291bnQ7Ci0KLSAgaWYgKCFiZmRfcmVhZF9wIChhYmZkKSB8fAotICAgICAgKChpbnQpKGFiZmQtPmZvcm1hdCkgPCAoaW50KWJmZF91bmtub3duKSB8fAotICAgICAgKChpbnQpKGFiZmQtPmZvcm1hdCkgPj0gKGludCliZmRfdHlwZV9lbmQpKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF91bmtub3duKQotICAgIHJldHVybiAoYWJmZC0+Zm9ybWF0ID09IGZvcm1hdCk/IHRydWU6IGZhbHNlOwotCi0KLSAgLyogU2luY2UgdGhlIHRhcmdldCB0eXBlIHdhcyBkZWZhdWx0ZWQsIGNoZWNrIHRoZW0gCi0gICAgIGFsbCBpbiB0aGUgaG9wZSB0aGF0IG9uZSB3aWxsIGJlIHVuaXF1ZWx5IHJlY29nbml6ZWQuICAqLwotCi0gIHNhdmVfdGFyZyA9IGFiZmQtPnh2ZWM7Ci0gIG1hdGNoX2NvdW50ID0gMDsKLSAgaWYgKG1hdGNoaW5nKQotICAgIHsKLSAgICAgIG1hdGNoaW5nX3ZlY3RvciA9Ci0JKGNoYXIgKiopIGJmZF9tYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqCi0JCQkgICAgICAoX2JmZF90YXJnZXRfdmVjdG9yX2VudHJpZXMgKyAxKSk7Ci0gICAgICBpZiAoIW1hdGNoaW5nX3ZlY3RvcikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtYXRjaGluZ192ZWN0b3JbMF0gPSBOVUxMOwotICAgICAgKm1hdGNoaW5nID0gbWF0Y2hpbmdfdmVjdG9yOwotICAgIH0KLSAgcmlnaHRfdGFyZyA9IDA7Ci0KLQotICAvKiBwcmVzdW1lIHRoZSBhbnN3ZXIgaXMgeWVzICovCi0gIGFiZmQtPmZvcm1hdCA9IGZvcm1hdDsKLQotICAvKiBJZiB0aGUgdGFyZ2V0IHR5cGUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBqdXN0IGNoZWNrIHRoYXQgdGFyZ2V0LiAgKi8KLQotICBpZiAoIWFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpIHsKLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikwLCBTRUVLX1NFVCkgIT0gMCkJLyogcmV3aW5kISAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJpZ2h0X3RhcmcgPSBCRkRfU0VORF9GTVQgKGFiZmQsIF9iZmRfY2hlY2tfZm9ybWF0LCAoYWJmZCkpOwotICAgIGlmIChyaWdodF90YXJnKSB7Ci0gICAgICBhYmZkLT54dmVjID0gcmlnaHRfdGFyZzsJCS8qIFNldCB0aGUgdGFyZ2V0IGFzIHJldHVybmVkICovCi0gICAgICBpZiAobWF0Y2hpbmcpCi0JZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLSAgICAgIHJldHVybiB0cnVlOwkJCS8qIEZpbGUgcG9zaXRpb24gaGFzIG1vdmVkLCBCVFcgKi8KLSAgICB9Ci0KLSAgICAvKiBGb3IgYSBsb25nIHRpbWUgdGhlIGNvZGUgaGFzIGRyb3BwZWQgdGhyb3VnaCB0byBjaGVjayBhbGwKLSAgICAgICB0YXJnZXRzIGlmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHdhcyB3cm9uZy4gIEkgZG9uJ3Qga25vdyB3aHksCi0gICAgICAgYW5kIEknbSByZWx1Y3RhbnQgdG8gY2hhbmdlIGl0LiAgSG93ZXZlciwgaW4gdGhlIGNhc2Ugb2YgYW4KLSAgICAgICBhcmNoaXZlLCBpdCBjYW4gY2F1c2UgcHJvYmxlbXMuICBJZiB0aGUgc3BlY2lmaWVkIHRhcmdldCBkb2VzCi0gICAgICAgbm90IHBlcm1pdCBhcmNoaXZlcyAoZS5nLiwgdGhlIGJpbmFyeSB0YXJnZXQpLCB0aGVuIHdlIHNob3VsZAotICAgICAgIG5vdCBhbGxvdyBzb21lIG90aGVyIHRhcmdldCB0byByZWNvZ25pemUgaXQgYXMgYW4gYXJjaGl2ZSwgYnV0Ci0gICAgICAgc2hvdWxkIGluc3RlYWQgYWxsb3cgdGhlIHNwZWNpZmllZCB0YXJnZXQgdG8gcmVjb2duaXplIGl0IGFzIGFuCi0gICAgICAgb2JqZWN0LiAgV2hlbiBJIGZpcnN0IG1hZGUgdGhpcyBjaGFuZ2UsIGl0IGJyb2tlIHRoZSBQRSB0YXJnZXQsCi0gICAgICAgYmVjYXVzZSB0aGUgc3BlY2lmaWVkIHBlaS1pMzg2IHRhcmdldCBkaWQgbm90IHJlY29nbml6ZSB0aGUKLSAgICAgICBhY3R1YWwgcGUtaTM4NiBhcmNoaXZlLiAgU2luY2UgdGhlcmUgbWF5IGJlIG90aGVyIHByb2JsZW1zIG9mCi0gICAgICAgdGhpcyBzb3J0LCBJIGNoYW5nZWQgdGhpcyB0ZXN0IHRvIGNoZWNrIG9ubHkgZm9yIHRoZSBiaW5hcnkKLSAgICAgICB0YXJnZXQuICAqLwotCi0gICAgaWYgKGZvcm1hdCA9PSBiZmRfYXJjaGl2ZSAmJiBzYXZlX3RhcmcgPT0gJmJpbmFyeV92ZWMpCi0gICAgICB7Ci0JYWJmZC0+eHZlYyA9IHNhdmVfdGFyZzsKLQlhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLQlpZiAobWF0Y2hpbmcpCi0JICBmcmVlIChtYXRjaGluZ192ZWN0b3IpOwotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkKTsKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gIH0KLQotICBmb3IgKHRhcmdldCA9IGJmZF90YXJnZXRfdmVjdG9yOyAqdGFyZ2V0ICE9IE5VTEw7IHRhcmdldCsrKSB7Ci0gICAgY29uc3QgYmZkX3RhcmdldCAqdGVtcDsKLQotICAgIGlmICgqdGFyZ2V0ID09ICZiaW5hcnlfdmVjKQotICAgICAgY29udGludWU7Ci0KLSAgICBhYmZkLT54dmVjID0gKnRhcmdldDsJLyogQ2hhbmdlIEJGRCdzIHRhcmdldCB0ZW1wb3JhcmlseSAqLwotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKTAsIFNFRUtfU0VUKSAhPSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8qIElmIF9iZmRfY2hlY2tfZm9ybWF0IG5lZ2xlY3RzIHRvIHNldCBiZmRfZXJyb3IsIGFzc3VtZSBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LgotICAgICAgIFdlIGRpZG4ndCB1c2VkIHRvIGV2ZW4gcGF5IGFueSBhdHRlbnRpb24gdG8gYmZkX2Vycm9yLCBzbyBJIHN1c3BlY3QKLSAgICAgICB0aGF0IHNvbWUgX2JmZF9jaGVja19mb3JtYXQgbWlnaHQgaGF2ZSB0aGlzIHByb2JsZW0uICAqLwotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHRlbXAgPSBCRkRfU0VORF9GTVQgKGFiZmQsIF9iZmRfY2hlY2tfZm9ybWF0LCAoYWJmZCkpOwotICAgIGlmICh0ZW1wKSB7CQkJCS8qIFRoaXMgZm9ybWF0IGNoZWNrcyBvdXQgYXMgb2shICovCi0gICAgICByaWdodF90YXJnID0gdGVtcDsKLSAgICAgIGlmIChtYXRjaGluZykKLQl7Ci0JICBtYXRjaGluZ192ZWN0b3JbbWF0Y2hfY291bnRdID0gdGVtcC0+bmFtZTsKLQkgIG1hdGNoaW5nX3ZlY3RvclttYXRjaF9jb3VudCArIDFdID0gTlVMTDsKLQl9Ci0gICAgICBtYXRjaF9jb3VudCsrOwotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZGVmYXVsdCB0YXJnZXQsIGFjY2VwdCBpdCwgZXZlbiBpZiBvdGhlciB0YXJnZXRzCi0JIG1pZ2h0IG1hdGNoLiAgUGVvcGxlIHdobyB3YW50IHRob3NlIG90aGVyIHRhcmdldHMgaGF2ZSB0byBzZXQgCi0JIHRoZSBHTlVUQVJHRVQgdmFyaWFibGUuICAqLwotICAgICAgaWYgKHRlbXAgPT0gYmZkX2RlZmF1bHRfdmVjdG9yWzBdKQotCXsKLQkgIGlmIChtYXRjaGluZykKLQkgICAgewotCSAgICAgIG1hdGNoaW5nX3ZlY3RvclswXSA9IHRlbXAtPm5hbWU7Ci0JICAgICAgbWF0Y2hpbmdfdmVjdG9yWzFdID0gTlVMTDsKLQkgICAgfQotCSAgbWF0Y2hfY291bnQgPSAxOwotCSAgYnJlYWs7Ci0JfQotI2lmZGVmIEdOVTk2MAotICAgICAgLyogQmlnLSBhbmQgbGl0dGxlLWVuZGlhbiBiLm91dCBhcmNoaXZlcyBsb29rIHRoZSBzYW1lLCBidXQgaXQgZG9lc24ndAotICAgICAgICogbWF0dGVyOiB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIHRoZWlyIGhlYWRlcnMsIGFuZCBtZW1iZXIgZmlsZSBieXRlCi0gICAgICAgKiBvcmRlcnMgd2lsbCAoSSBob3BlKSBiZSBoYW5kbGVkIGFwcHJvcHJpYXRlbHkgYnkgYmZkLiAgRGl0dG8gZm9yIGJpZwotICAgICAgICogYW5kIGxpdHRsZSBjb2ZmIGFyY2hpdmVzLiAgQW5kIHRoZSA0IGNvZmYvYi5vdXQgb2JqZWN0IGZvcm1hdHMgYXJlCi0gICAgICAgKiB1bmFtYmlndW91cy4gIFNvIGFjY2VwdCB0aGUgZmlyc3QgbWF0Y2ggd2UgZmluZC4KLSAgICAgICAqLwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICB9IGVsc2UgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCkgewotICAgICAgYWJmZC0+eHZlYyA9IHNhdmVfdGFyZzsKLSAgICAgIGFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotICAgICAgaWYgKG1hdGNoaW5nICYmIGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQlmcmVlIChtYXRjaGluZ192ZWN0b3IpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmIChtYXRjaF9jb3VudCA9PSAxKSB7Ci0gICAgYWJmZC0+eHZlYyA9IHJpZ2h0X3Rhcmc7CQkvKiBDaGFuZ2UgQkZEJ3MgdGFyZ2V0IHBlcm1hbmVudGx5ICovCi0gICAgaWYgKG1hdGNoaW5nKQotICAgICAgZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLSAgICByZXR1cm4gdHJ1ZTsJCQkvKiBGaWxlIHBvc2l0aW9uIGhhcyBtb3ZlZCwgQlRXICovCi0gIH0KLQotICBhYmZkLT54dmVjID0gc2F2ZV90YXJnOwkJLyogUmVzdG9yZSBvcmlnaW5hbCB0YXJnZXQgdHlwZSAqLwotICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsJCS8qIFJlc3RvcmUgb3JpZ2luYWwgZm9ybWF0ICovCi0gIGlmIChtYXRjaF9jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkKTsKLSAgICAgIGlmIChtYXRjaGluZykKLQlmcmVlIChtYXRjaGluZ192ZWN0b3IpOwotICAgIH0KLSAgZWxzZQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZm9ybWF0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X2Zvcm1hdChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KTsKLQotREVTQ1JJUFRJT04KLQlUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGZpbGUgZm9ybWF0IG9mIHRoZSBCRkQgQHZhcnthYmZkfSB0byB0aGUKLQlmb3JtYXQgQHZhcntmb3JtYXR9LiBJZiB0aGUgdGFyZ2V0IHNldCBpbiB0aGUgQkZEIGRvZXMgbm90Ci0Jc3VwcG9ydCB0aGUgZm9ybWF0IHJlcXVlc3RlZCwgdGhlIGZvcm1hdCBpcyBpbnZhbGlkLCBvciB0aGUgQkZECi0JaXMgbm90IG9wZW4gZm9yIHdyaXRpbmcsIHRoZW4gYW4gZXJyb3Igb2NjdXJzLgotCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2Zvcm1hdCAoYWJmZCwgZm9ybWF0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9mb3JtYXQgZm9ybWF0OwotewotCi0gIGlmIChiZmRfcmVhZF9wIChhYmZkKSB8fAotICAgICAgKChpbnQpYWJmZC0+Zm9ybWF0IDwgKGludCliZmRfdW5rbm93bikgfHwKLSAgICAgICgoaW50KWFiZmQtPmZvcm1hdCA+PSAoaW50KWJmZF90eXBlX2VuZCkpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX3Vua25vd24pCi0gICAgcmV0dXJuIChhYmZkLT5mb3JtYXQgPT0gZm9ybWF0KSA/IHRydWU6ZmFsc2U7Ci0KLSAgLyogcHJlc3VtZSB0aGUgYW5zd2VyIGlzIHllcyAqLwotICBhYmZkLT5mb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgaWYgKCFCRkRfU0VORF9GTVQgKGFiZmQsIF9iZmRfc2V0X2Zvcm1hdCwgKGFiZmQpKSkgewotICAgIGFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9mb3JtYXRfc3RyaW5nCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2Zvcm1hdF9zdHJpbmcoYmZkX2Zvcm1hdCBmb3JtYXQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHBvaW50ZXIgdG8gYSBjb25zdCBzdHJpbmcKLQk8PGludmFsaWQ+PiwgPDxvYmplY3Q+PiwgPDxhcmNoaXZlPj4sIDw8Y29yZT4+LCBvciA8PHVua25vd24+PiwKLQlkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgb2YgQHZhcntmb3JtYXR9LgotKi8KLQotQ09OU1QgY2hhciAqCi1iZmRfZm9ybWF0X3N0cmluZyAoZm9ybWF0KQotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLXsKLSAgaWYgKCgoaW50KWZvcm1hdCA8KGludCkgYmZkX3Vua25vd24pIAotICAgICAgfHwgKChpbnQpZm9ybWF0ID49KGludCkgYmZkX3R5cGVfZW5kKSkgCi0gICAgcmV0dXJuICJpbnZhbGlkIjsKLSAgCi0gIHN3aXRjaCAoZm9ybWF0KSB7Ci0gIGNhc2UgYmZkX29iamVjdDoKLSAgICByZXR1cm4gIm9iamVjdCI7CQkvKiBsaW5rZXIvYXNzZW1iZXIvY29tcGlsZXIgb3V0cHV0ICovCi0gIGNhc2UgYmZkX2FyY2hpdmU6IAotICAgIHJldHVybiAiYXJjaGl2ZSI7CQkvKiBvYmplY3QgYXJjaGl2ZSBmaWxlICovCi0gIGNhc2UgYmZkX2NvcmU6IAotICAgIHJldHVybiAiY29yZSI7CQkvKiBjb3JlIGR1bXAgKi8KLSAgZGVmYXVsdDogCi0gICAgcmV0dXJuICJ1bmtub3duIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYmZkL2ZyZWVic2QuaCBiL2JmZC9mcmVlYnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MGMyMTMuLjAwMDAwMDAKLS0tIGEvYmZkL2ZyZWVic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZGVmaW5pdGlvbnMgdXNlZCBieSBhbGwgRnJlZUJTRCB0YXJnZXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTk2LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSovCi0KLS8qIEZyZWVCU0QgWk1BR0lDIGZpbGVzIG5ldmVyIGhhdmUgdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gKi8KLSNkZWZpbmUJTl9IRUFERVJfSU5fVEVYVCh4KQkwCi0KLS8qIFpNQUdJQyBmaWxlcyBzdGFydCBhdCBvZmZzZXQgMC4gIERvZXMgbm90IGFwcGx5IHRvIFFNQUdJQyBmaWxlcy4gKi8KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCQkwCi0KLSNkZWZpbmUgTl9HRVRNQUdJQ19ORVQoZXhlYykgXAotCSgoZXhlYykuYV9pbmZvICYgMHhmZmZmKQotI2RlZmluZSBOX0dFVE1JRF9ORVQoZXhlYykgXAotCSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweDNmZikKLSNkZWZpbmUgTl9HRVRGTEFHX05FVChleCkgXAotCSgoKGV4ZWMpLmFfaW5mbyA+PiAyNikgJiAweDNmKQotCi0jZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgXAotCSgoZW51bSBtYWNoaW5lX3R5cGUpIFwKLQkgKChOX0dFVE1BR0lDX05FVCAoZXhlYykgPT0gWk1BR0lDKSA/IE5fR0VUTUlEX05FVCAoZXhlYykgOiBcCi0JICAoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweDNmZikpCi0jZGVmaW5lIE5fRkxBR1MoZXhlYykgXAotCSgoTl9HRVRNQUdJQ19ORVQgKGV4ZWMpID09IFpNQUdJQykgPyBOX0dFVEZMQUdfTkVUIChleGVjKSA6IFwKLQkgKChleGVjKS5hX2luZm8gPj4gMjYpICYgMHgzZikKLQotI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAotCSgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpIFwKLQkgfCAoKChpbnQpKHR5cGUpICYgMHgzZmYpIDw8IDE2KSBcCi0JIHwgKCgoZmxhZ3MpICYgMHgzZikgPDwgMjYpKQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAotCSgoZXhlYykuYV9pbmZvID0gXAotICAgICAgICAgKChleGVjKS5hX2luZm8gJiAweGZiMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHgzZmYpIDw8IDE2KSkKLSNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLQkgKChleGVjKS5hX2luZm8gJiAweDAzZmZmZmZmKSB8ICgoZmxhZ3MgJiAweDAzZikgPDwgMjYpKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0vKiBPbiBGcmVlQlNELCB0aGUgbWFnaWMgbnVtYmVyIGlzIGFsd2F5cyBpbiBpMzg2IChsaXR0bGUtZW5kaWFuKQotICAgZm9ybWF0LiAgSSB0aGluay4gICovCi0jZGVmaW5lIFNXQVBfTUFHSUMoZXh0KSBiZmRfZ2V0bDMyIChleHQpCi0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotc3RhdGljIGJvb2xlYW4gTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaChhYmZkKSkgewotICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgaWYgKHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImEub3V0LW02OGs0ay1uZXRic2QiKSA9PSAwKQotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4SzRLX05FVEJTRCk7Ci0gICAgZWxzZQotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4S19ORVRCU0QpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9TUEFSQ19ORVRCU0QpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzM4Nl9ORVRCU0QpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX25zMzJrOgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV81MzJfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9nZW4tYW91dC5jIGIvYmZkL2dlbi1hb3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZWQ5MWEuLjAwMDAwMDAKLS0tIGEvYmZkL2dlbi1hb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyogR2VuZXJhdGUgcGFyYW1ldGVycyBmb3IgYW4gYS5vdXQgc3lzdGVtLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgIi91c3IvaW5jbHVkZS9hLm91dC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7IGNoYXIqKiBhcmd2OwotewotICBzdHJ1Y3QgZXhlYyBteV9leGVjOwotICBpbnQgcGFnZV9zaXplOwotICBjaGFyICp0YXJnZXQgPSAidW5rbm93biIsICphcmNoID0gInVua25vd24iOwotICBGSUxFICpmaWxlID0gZm9wZW4oImdlbi1hb3V0IiwgInIiKTsKLQotICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGdlbi1hb3V0IVxuIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGZyZWFkKCZteV9leGVjLCBzaXplb2Yoc3RydWN0IGV4ZWMpLCAxLCBmaWxlKSAhPSAxKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCByZWFkIGdlbi1hb3V0IVxuIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLQotICB0YXJnZXQgPSBhcmd2WzFdOwotICBpZiAodGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGdlbi1hb3V0IHRhcmdldF9uYW1lXG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICB9Ci0KLSNpZmRlZiBOX1RYVE9GRgotICBwYWdlX3NpemUgPSBOX1RYVE9GRihteV9leGVjKTsKLSAgaWYgKHBhZ2Vfc2l6ZSA9PSAwKQotICAgIHByaW50ZigiI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDFcbiIpOwotICBlbHNlCi0gICAgcHJpbnRmKCIjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMFxuIik7Ci0jZW5kaWYKLQotICBwcmludGYoIiNkZWZpbmUgQllURVNfSU5fV09SRCAlZFxuIiwgc2l6ZW9mIChpbnQpKTsKLSAgaWYgKG15X2V4ZWMuYV9lbnRyeSA9PSAwKSB7Ci0gICAgICBwcmludGYoIiNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk9cbiIpOwotICAgICAgcHJpbnRmKCIjZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwIC8qIEF2b2lkcyB3YXJuaW5nICovXG4iKTsKLSAgfQotICBlbHNlIHsKLSAgICAgIHByaW50ZigiLyojZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPKi9cbiIpOwotICAgICAgcHJpbnRmKCIvKiNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAqL1xuIik7Ci0gIH0KLQotICBwcmludGYoIiNkZWZpbmUgVEVYVF9TVEFSVF9BRERSICVkXG4iLCBteV9leGVjLmFfZW50cnkpOwotCi0jaWZkZWYgUEFHU0laCi0gIGlmIChwYWdlX3NpemUgPT0gMCkKLSAgICBwYWdlX3NpemUgPSBQQUdTSVo7Ci0jZW5kaWYKLSAgaWYgKHBhZ2Vfc2l6ZSAhPSAwKQotICAgIHByaW50ZigiI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFICVkXG4iLCBwYWdlX3NpemUpOwotICBlbHNlCi0gICAgcHJpbnRmKCIvKiAjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgPz8/ICovXG4iKTsKLSAgcHJpbnRmKCIjZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFXG4iKTsKLQotI2lmZGVmIHZheAotICBhcmNoID0gInZheCI7Ci0jZW5kaWYKLSNpZmRlZiBtNjhrCi0gIGFyY2ggPSAibTY4ayI7Ci0jZW5kaWYKLSAgaWYgKGFyY2hbMF0gPT0gJzEnKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygid2FybmluZzogcHJlcHJvY2Vzc29yIHN1YnN0aXR1dGVkIGFyY2hpdGVjdHVyZSBuYW1lIGluc2lkZSBzdHJpbmc7IikpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIgICAgICAgICBmaXggREVGQVVMVF9BUkNIIGluIHRoZSBvdXRwdXQgZmlsZSB5b3Vyc2VsZlxuIikpOwotICAgICAgYXJjaCA9ICJ1bmtub3duIjsKLSAgICB9Ci0gIHByaW50ZigiI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfJXNcbiIsIGFyY2gpOwotCi0gIHByaW50ZigiXG4jZGVmaW5lIE1ZKE9QKSBDQVQoJXNfLE9QKVxuIiwgdGFyZ2V0KTsKLSAgcHJpbnRmKCIjZGVmaW5lIFRBUkdFVE5BTUUgXCJhLm91dC0lc1wiXG5cbiIsIHRhcmdldCk7Ci0KLSAgcHJpbnRmKCIjaW5jbHVkZSBcImJmZC5oXCJcbiIpOwotICBwcmludGYoIiNpbmNsdWRlIFwic3lzZGVwLmhcIlxuIik7Ci0gIHByaW50ZigiI2luY2x1ZGUgXCJsaWJiZmQuaFwiXG4iKTsKLSAgcHJpbnRmKCIjaW5jbHVkZSBcImxpYmFvdXQuaFwiXG4iKTsKLSAgcHJpbnRmKCJcbiNpbmNsdWRlIFwiYW91dC10YXJnZXQuaFwiXG4iKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9nZW5saW5rLmggYi9iZmQvZ2VubGluay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTBhOGRlLi4wMDAwMDAwCi0tLSBhL2JmZC9nZW5saW5rLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogZ2VubGluay5oIC0tIGludGVyZmFjZSB0byB0aGUgQkZEIGdlbmVyaWMgbGlua2VyCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHRU5MSU5LX0gKLSNkZWZpbmUgR0VOTElOS19ICi0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgaXMgaW50ZXJuYWwgdG8gQkZELiAgSXQgZGVzY3JpYmVzIHRoZSBpbnRlcm5hbAotICAgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEJGRCBnZW5lcmljIGxpbmtlciwgaW4gY2FzZQotICAgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGxpbmtlcnMgd2FudCB0byB1c2Ugb3IgY2FsbCB0aGVtLiAgTm90ZQotICAgdGhhdCBzb21lIGZ1bmN0aW9ucywgc3VjaCBhcyBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwKLSAgIGFyZSBkZWNsYXJlZCBpbiBsaWJiZmQuaCwgYmVjYXVzZSB0aGV5IGFyZSBleHBlY3RlZCB0byBiZSB3aWRlbHkKLSAgIHVzZWQuICBUaGUgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzIGluIHRoaXMgZmlsZSB3aWxsIHByb2JhYmx5IG9ubHkKLSAgIGJlIHVzZWQgYnkgYSBmZXcgZmlsZXMgYmVzaWRlcyBsaW5rZXIuYyBpdHNlbGYuICBJbiBmYWN0LCB0aGlzIGZpbGUKLSAgIGlzIG5vdCBwYXJ0aWN1bGFybHkgY29tcGxldGU7IEkgaGF2ZSBvbmx5IHB1dCBpbiB0aGUgaW50ZXJmYWNlcyBJCi0gICBhY3R1YWxseSBuZWVkZWQuICAqLwotCi0vKiBUaGUgZ2VuZXJpYyBsaW5rZXIgdXNlcyBhIGhhc2ggdGFibGUgd2hpY2ggaXMgYSBkZXJpdmVkIGNsYXNzIG9mCi0gICB0aGUgc3RhbmRhcmQgbGlua2VyIGhhc2ggdGFibGUsIGp1c3QgYXMgdGhlIG90aGVyIGJhY2tlbmQgc3BlY2lmaWMKLSAgIGxpbmtlcnMgZG8uICBEbyBub3QgY29uZnVzZSB0aGUgZ2VuZXJpYyBsaW5rZXIgaGFzaCB0YWJsZSB3aXRoIHRoZQotICAgc3RhbmRhcmQgQkZEIGxpbmtlciBoYXNoIHRhYmxlIGl0IGlzIGJ1aWx0IHVwb24uICAqLwotCi0vKiBHZW5lcmljIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogV2hldGhlciB0aGlzIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuIG91dC4gICovCi0gIGJvb2xlYW4gd3JpdHRlbjsKLSAgLyogU3ltYm9sIGZyb20gaW5wdXQgQkZELiAgKi8KLSAgYXN5bWJvbCAqc3ltOwotfTsKLQotLyogR2VuZXJpYyBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogVGhlIGdlbmVyaWMgbGlua2VyIHJlYWRzIGluIHRoZSBhc3ltYm9sIHN0cnVjdHVyZXMgZm9yIGFuIGlucHV0IEJGRAotICAgYW5kIGtlZXBzIHRoZW0gaW4gdGhlIG91dHN5bWJvbCBhbmQgc3ltY291bnQgZmllbGRzLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyhhYmZkKSAoKGFiZmQpLT5vdXRzeW1ib2xzKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQoYWJmZCkgKChhYmZkKS0+c3ltY291bnQpCi0KLS8qIEFkZCB0aGUgc3ltYm9scyBvZiBpbnB1dF9iZmQgdG8gdGhlIHN5bWJvbHMgYmVpbmcgYnVpbHQgZm9yCi0gICBvdXRwdXRfYmZkLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgYmZkICppbnB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgc2l6ZV90ICpwc3ltYWxsb2MpKTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvCi0gICBfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sLCB3aGljaCBtYXkgYmUgY2FsbGVkIHZpYQotICAgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBzaXplX3QgKnBzeW1hbGxvYzsKLX07Ci0KLS8qIFdyaXRlIG91dCBhIHNpbmdsZSBnbG9iYWwgc3ltYm9sLiAgVGhpcyBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQKLSAgIHZpYSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RyYXZlcnNlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0Ci0gICBhY3R1YWxseSBiZSBhIHN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbyAqLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBHZW5lcmljIGxpbmsgaGFzaCB0YWJsZSBlbnRyeSBjcmVhdGlvbiByb3V0aW5lLiAgKi8KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLSAgICAgICAgICAgY29uc3QgY2hhciAqKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2dvMzJzdHViLmggYi9iZmQvZ28zMnN0dWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0Mzg4Yy4uMDAwMDAwMAotLS0gYS9iZmQvZ28zMnN0dWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0weDRkLDB4NWEsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MjcsMHgwMCwweGZmLDB4ZmYsMHgwMCwweDAwLAotMHg2MCwweDA3LDB4MDAsMHgwMCwweDU0LDB4MDAsMHgwMCwweDAwLDB4MGQsMHgwYSwweDczLDB4NzQsMHg3NSwweDYyLDB4MmUsMHg2OCwKLTB4MjAsMHg2NywweDY1LDB4NmUsMHg2NSwweDcyLDB4NjEsMHg3NCwweDY1LDB4NjQsMHgyMCwweDY2LDB4NzIsMHg2ZiwweDZkLDB4MjAsCi0weDczLDB4NzQsMHg3NSwweDYyLDB4MmUsMHg2MSwweDczLDB4NmQsMHgyMCwweDYyLDB4NzksMHgyMCwweDY0LDB4NmEsMHg2MSwweDczLAotMHg2ZCwweDJjLDB4MjAsMHg2ZiwweDZlLDB4MjAsMHg1NywweDY1LDB4NjQsMHgyMCwweDRhLDB4NzUsMHg2ZSwweDIwLDB4MzEsMHgzMSwKLTB4MjAsMHgzMSwweDM2LDB4M2EsMHgzMCwweDM5LDB4M2EsMHgzMSwweDM1LDB4MjAsMHgzMSwweDM5LDB4MzksMHgzNywweDBkLDB4MGEsCi0weDU0LDB4NjgsMHg2NSwweDIwLDB4NTMsMHg1NCwweDU1LDB4NDIsMHgyZSwweDQ1LDB4NTgsMHg0NSwweDIwLDB4NzMsMHg3NCwweDc1LAotMHg2MiwweDIwLDB4NmMsMHg2ZiwweDYxLDB4NjQsMHg2NSwweDcyLDB4MjAsMHg2OSwweDczLDB4MjAsMHg0MywweDZmLDB4NzAsMHg3OSwKLTB4NzIsMHg2OSwweDY3LDB4NjgsMHg3NCwweDIwLDB4MjgsMHg0MywweDI5LDB4MjAsMHgzMSwweDM5LDB4MzksMHgzMywweDJkLDB4MzEsCi0weDM5LDB4MzksMHgzNSwweDIwLDB4NDQsMHg0YSwweDIwLDB4NDQsMHg2NSwweDZjLDB4NmYsMHg3MiwweDY5LDB4NjUsMHgyZSwweDIwLAotMHgwZCwweDBhLDB4NTAsMHg2NSwweDcyLDB4NmQsMHg2OSwweDczLDB4NzMsMHg2OSwweDZmLDB4NmUsMHgyMCwweDY3LDB4NzIsMHg2MSwKLTB4NmUsMHg3NCwweDY1LDB4NjQsMHgyMCwweDc0LDB4NmYsMHgyMCwweDc1LDB4NzMsMHg2NSwweDIwLDB4NjYsMHg2ZiwweDcyLDB4MjAsCi0weDYxLDB4NmUsMHg3OSwweDIwLDB4NzAsMHg3NSwweDcyLDB4NzAsMHg2ZiwweDczLDB4NjUsMHgyMCwweDcwLDB4NzIsMHg2ZiwweDc2LAotMHg2OSwweDY0LDB4NjUsMHg2NCwweDIwLDB4NzQsMHg2OCwweDY5LDB4NzMsMHgyMCwweDYzLDB4NmYsMHg3MCwweDc5LDB4NzIsMHg2OSwKLTB4NjcsMHg2OCwweDc0LDB4MjAsMHgwZCwweDBhLDB4NzIsMHg2NSwweDZkLDB4NjEsMHg2OSwweDZlLDB4NzMsMHgyMCwweDcwLDB4NzIsCi0weDY1LDB4NzMsMHg2NSwweDZlLDB4NzQsMHgyMCwweDYxLDB4NmUsMHg2NCwweDIwLDB4NzUsMHg2ZSwweDZkLDB4NmYsMHg2NCwweDY5LAotMHg2NiwweDY5LDB4NjUsMHg2NCwweDJlLDB4MjAsMHgwZCwweDBhLDB4NTQsMHg2OCwweDY5LDB4NzMsMHgyMCwweDZmLDB4NmUsMHg2YywKLTB4NzksMHgyMCwweDYxLDB4NzAsMHg3MCwweDZjLDB4NjksMHg2NSwweDczLDB4MjAsMHg3NCwweDZmLDB4MjAsMHg3NCwweDY4LDB4NjUsCi0weDIwLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyYywweDIwLDB4NjEsMHg2ZSwweDY0LDB4MjAsMHg2ZSwweDZmLDB4NzQsMHgyMCwweDZlLAotMHg2NSwweDYzLDB4NjMsMHg2NSwweDczLDB4NzMsMHg2MSwweDcyLDB4NjksMHg2YywweDc5LDB4MjAsMHg3NCwweDY4LDB4NjUsMHgyMCwKLTB4NzcsMHg2OCwweDZmLDB4NmMsMHg2NSwweDIwLDB4NzAsMHg3MiwweDZmLDB4NjcsMHg3MiwweDYxLDB4NmQsMHgyZSwweDBhLDB4MGQsCi0weDBhLDB4MjQsMHg0OSwweDY0LDB4M2EsMHgyMCwweDczLDB4NzQsMHg3NSwweDYyLDB4MmUsMHg2MSwweDczLDB4NmQsMHgyMCwweDYyLAotMHg3NSwweDY5LDB4NmMsMHg3NCwweDIwLDB4MzAsMHgzNiwweDJmLDB4MzEsMHgzMSwweDJmLDB4MzksMHgzNywweDIwLDB4MzEsMHgzNiwKLTB4M2EsMHgzMCwweDM5LDB4M2EsMHgzMSwweDM1LDB4MjAsMHg2MiwweDc5LDB4MjAsMHg2NCwweDZhLDB4NjEsMHg3MywweDZkLDB4MjAsCi0weDI0LDB4MGEsMHgwZCwweDBhLDB4NDAsMHgyOCwweDIzLDB4MjksMHgyMCwweDczLDB4NzQsMHg3NSwweDYyLDB4MmUsMHg2MSwweDczLAotMHg2ZCwweDIwLDB4NjIsMHg3NSwweDY5LDB4NmMsMHg3NCwweDIwLDB4MzAsMHgzNiwweDJmLDB4MzEsMHgzMSwweDJmLDB4MzksMHgzNywKLTB4MjAsMHgzMSwweDM2LDB4M2EsMHgzMCwweDM5LDB4M2EsMHgzMSwweDM1LDB4MjAsMHg2MiwweDc5LDB4MjAsMHg2NCwweDZhLDB4NjEsCi0weDczLDB4NmQsMHgwYSwweDBkLDB4MGEsMHgxYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4NjcsMHg2ZiwweDMzLDB4MzIsMHg3MywweDc0LDB4NzUsMHg2MiwweDJjLDB4MjAsMHg3NiwweDIwLDB4MzIsMHgyZSwweDMwLDB4MzAsCi0weDU0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsMHg1NywweDUzLDB4NDQsMHg1MCwweDRkLDB4NDksMHgyZSwweDQ1LDB4NTgsMHg0NSwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDBlLDB4MWYsMHg4YywweDFlLDB4MjQsMHgwMCwweDhjLDB4MDYsMHg2MCwweDA3LDB4ZmMsMHhiNCwKLTB4MzAsMHhjZCwweDIxLDB4M2MsMHgwMywweDczLDB4MDYsMHhiYSwweDg2LDB4MDUsMHhlOSwweGIyLDB4MDMsMHhhMiwweDY5LDB4MDgsCi0weGJiLDB4NzAsMHgwOCwweGExLDB4MjAsMHgwMCwweDM5LDB4YzMsMHg3MywweDAyLDB4ODksMHhjMywweDg5LDB4MWUsMHgyMCwweDAwLAotMHhmZSwweGM3LDB4YjksMHgwNCwweGZmLDB4ZDMsMHhlYiwweGI0LDB4NGEsMHhjZCwweDIxLDB4NzMsMHgwYSwweGQzLDB4ZTMsMHhmZSwKLTB4Y2YsMHg4OSwweDFlLDB4MjAsMHgwMCwweGViLDB4ZDksMHgyNiwweDhlLDB4MDYsMHgyYywweDAwLDB4MzEsMHhmZiwweDMwLDB4YzAsCi0weGE5LDB4ZjIsMHhhZSwweDI2LDB4ODEsMHgzZCwweDUwLDB4NDEsMHg3NSwweDE1LDB4YWYsMHgyNiwweDgxLDB4M2QsMHg1NCwweDQ4LAotMHg3NSwweDBkLDB4YWYsMHgyNiwweDgwLDB4M2QsMHgzZCwweDc1LDB4MDYsMHg0NywweDg5LDB4M2UsMHg2NywweDA0LDB4NGYsMHhhZSwKLTB4NzUsMHhkZiwweGFmLDB4MDYsMHg1NywweDMxLDB4YzksMHg3NCwweDEwLDB4YmEsMHg1ZCwweDA1LDB4ZTksMHg1MCwweDAzLDB4MDksCi0weGM5LDB4NzUsMHhmNiwweDQxLDB4ZTgsMHg5MiwweDAzLDB4NzIsMHhmMCwweGI4LDB4ODcsMHgxNiwweGNkLDB4MmYsMHgwOSwweGMwLAotMHg3NSwweGVkLDB4ODAsMHhlMywweDAxLDB4NzQsMHhlOCwweDg5LDB4M2UsMHgwMCwweDA2LDB4OGMsMHgwNiwweDAyLDB4MDYsMHg4OSwKLTB4MzYsMHgwNCwweDA2LDB4NWYsMHgwNywweGU4LDB4ZDUsMHgwMiwweDg5LDB4M2UsMHgyYSwweDAwLDB4ODksMHgzNiwweDYyLDB4MDcsCi0weDgwLDB4M2UsMHgyYywweDAwLDB4MDAsMHg3NCwweDI0LDB4YjksMHgwOCwweDAwLDB4YmYsMHgyYywweDAwLDB4OGEsMHgwNSwweDQ3LAotMHgwOCwweGMwLDB4NzQsMHgwNSwweDg4LDB4MDcsMHg0MywweGUyLDB4ZjQsMHg2NiwweGM3LDB4MDcsMHgyZSwweDQ1LDB4NTgsMHg0NSwKLTB4ODEsMHhjMywweDA0LDB4MDAsMHhjNiwweDA3LDB4MDAsMHg4OSwweDFlLDB4NjIsMHgwNywweGI4LDB4MDAsMHgzZCwweGJhLDB4NjQsCi0weDA3LDB4Y2QsMHgyMSwweDBmLDB4ODIsMHhiNCwweDAyLDB4YTMsMHgwNiwweDA2LDB4ODksMHhjMywweGI5LDB4MDYsMHgwMCwweGJhLAotMHhiNSwweDA3LDB4YjQsMHgzZiwweGNkLDB4MjEsMHgzMSwweGQyLDB4MzEsMHhjOSwweGExLDB4YjUsMHgwNywweDNkLDB4NGMsMHgwMSwKLTB4NzQsMHgxYiwweDNkLDB4NGQsMHg1YSwweDBmLDB4ODUsMHg5NywweDAyLDB4OGIsMHgxNiwweGI5LDB4MDcsMHhjMSwweGUyLDB4MDksCi0weDhiLDB4MWUsMHhiNywweDA3LDB4MDksMHhkYiwweDc0LDB4MDUsMHg4MCwweGVlLDB4MDIsMHgwMSwweGRhLDB4ODksMHgxNiwweGJiLAotMHgwNywweDg5LDB4MGUsMHhiZCwweDA3LDB4YjgsMHgwMCwweDQyLDB4OGIsMHgxZSwweDA2LDB4MDYsMHhjZCwweDIxLDB4YjksMHhhOCwKLTB4MDAsMHhiYSwweGJmLDB4MDcsMHhiNCwweDNmLDB4Y2QsMHgyMSwweDNkLDB4YTgsMHgwMCwweDc1LDB4MDYsMHg4MSwweDNlLDB4YmYsCi0weDA3LDB4NGMsMHgwMSwweDBmLDB4ODUsMHg1ZSwweDAyLDB4NjYsMHhhMSwweGUzLDB4MDcsMHg2NiwweGEzLDB4MTAsMHgwNiwweDY2LAotMHg4YiwweDBlLDB4YmIsMHgwNywweDY2LDB4YTEsMHgwMywweDA4LDB4NjYsMHgwMSwweGM4LDB4NjYsMHhhMywweDA4LDB4MDYsMHg2NiwKLTB4YTEsMHgyYiwweDA4LDB4NjYsMHgwMSwweGM4LDB4NjYsMHhhMywweDBjLDB4MDYsMHg2NiwweDhiLDB4MWUsMHg0YiwweDA4LDB4NjYsCi0weGExLDB4NGYsMHgwOCwweDY2LDB4MDEsMHhjMywweDY2LDB4YjgsMHgwMSwweDAwLDB4MDEsMHgwMCwweDY2LDB4MzksMHhjMywweDczLAotMHgwMywweDY2LDB4ODksMHhjMywweDY2LDB4ODEsMHhjMywweGZmLDB4ZmYsMHgwMCwweDAwLDB4MzEsMHhkYiwweDY2LDB4ODksMHgxZSwKLTB4MWMsMHgwMCwweGU4LDB4ZTgsMHgwMiwweDhiLDB4MWUsMHgwNCwweDA2LDB4MDksMHhkYiwweDc0LDB4MGEsMHhiNCwweDQ4LDB4Y2QsCi0weDIxLDB4MGYsMHg4MiwweDEwLDB4MDIsMHg4ZSwweGMwLDB4ZTgsMHhmYiwweDAyLDB4YjgsMHgwMSwweDAwLDB4ZmYsMHgxZSwweDAwLAotMHgwNiwweDBmLDB4ODIsMHgwOCwweDAyLDB4OGMsMHgwNiwweDI2LDB4MDAsMHg4YywweDBlLDB4MjgsMHgwMCwweDhjLDB4ZDgsMHhhMywKLTB4MjIsMHgwMCwweDhlLDB4YzAsMHgzMSwweGMwLDB4YjksMHgwMSwweDAwLDB4Y2QsMHgzMSwweDcyLDB4MDcsMHhhMywweDE0LDB4MDYsCi0weDMxLDB4YzAsMHhjZCwweDMxLDB4MGYsMHg4MiwweGVhLDB4MDEsMHhhMywweDE2LDB4MDYsMHg2NiwweDhiLDB4MGUsMHgxYywweDAwLAotMHhiOCwweDAxLDB4MDUsMHg4YiwweDFlLDB4MWUsMHgwMCwweGNkLDB4MzEsMHgwZiwweDgyLDB4ZGEsMHgwMSwweDg5LDB4MWUsMHgxYSwKLTB4MDYsMHg4OSwweDBlLDB4MTgsMHgwNiwweDg5LDB4MzYsMHgxYSwweDAwLDB4ODksMHgzZSwweDE4LDB4MDAsMHhiOCwweDA3LDB4MDAsCi0weDhiLDB4MWUsMHgxNCwweDA2LDB4OGIsMHgwZSwweDFhLDB4MDYsMHg4YiwweDE2LDB4MTgsMHgwNiwweGNkLDB4MzEsMHhiOCwweDA5LAotMHgwMCwweDhjLDB4YzksMHg4MSwweGUxLDB4MDMsMHgwMCwweGMxLDB4ZTEsMHgwNSwweDUxLDB4ODEsMHhjOSwweDliLDB4YzAsMHhjZCwKLTB4MzEsMHhiOCwweDA4LDB4MDAsMHg4YiwweDBlLDB4MWUsMHgwMCwweDQ5LDB4YmEsMHhmZiwweGZmLDB4Y2QsMHgzMSwweGI4LDB4MDcsCi0weDAwLDB4OGIsMHgxZSwweDE2LDB4MDYsMHg4YiwweDBlLDB4MWEsMHgwNiwweDhiLDB4MTYsMHgxOCwweDA2LDB4Y2QsMHgzMSwweGI4LAotMHgwOSwweDAwLDB4NTksMHg4MSwweGM5LDB4OTMsMHhjMCwweGNkLDB4MzEsMHhiOCwweDA4LDB4MDAsMHg4YiwweDBlLDB4MWUsMHgwMCwKLTB4NDksMHhiYSwweGZmLDB4ZmYsMHhjZCwweDMxLDB4YjgsMHgwMCwweDAxLDB4YmIsMHgwMCwweDBmLDB4Y2QsMHgzMSwweDczLDB4MTAsCi0weDNkLDB4MDgsMHgwMCwweDBmLDB4ODUsMHg2NSwweDAxLDB4YjgsMHgwMCwweDAxLDB4Y2QsMHgzMSwweDBmLDB4ODIsMHg1YywweDAxLAotMHhhMywweDFjLDB4MDYsMHg4OSwweDE2LDB4MWUsMHgwNiwweGMxLDB4ZTMsMHgwNCwweDg5LDB4MWUsMHgyMCwweDA2LDB4NjYsMHg4YiwKLTB4MzYsMHgwOCwweDA2LDB4NjYsMHg4YiwweDNlLDB4ZmIsMHgwNywweDY2LDB4OGIsMHgwZSwweGZmLDB4MDcsMHhlOCwweDQ5LDB4MDAsCi0weDY2LDB4OGIsMHgzNiwweDBjLDB4MDYsMHg2NiwweDhiLDB4M2UsMHgyMywweDA4LDB4NjYsMHg4YiwweDBlLDB4MjcsMHgwOCwweGU4LAotMHgzNywweDAwLDB4OGUsMHgwNiwweDE2LDB4MDYsMHg2NiwweDhiLDB4M2UsMHg0YiwweDA4LDB4NjYsMHg4YiwweDBlLDB4NGYsMHgwOCwKLTB4NjYsMHgzMSwweGMwLDB4NjYsMHhjMSwweGU5LDB4MDIsMHg2NywweGYzLDB4NjYsMHhhYiwweGI0LDB4M2UsMHg4YiwweDFlLDB4MDYsCi0weDA2LDB4Y2QsMHgyMSwweGI4LDB4MDEsMHgwMSwweDhiLDB4MTYsMHgxZSwweDA2LDB4Y2QsMHgzMSwweDFlLDB4MGYsMHhhMSwweDhlLAotMHgxZSwweDE2LDB4MDYsMHg2NiwweDY0LDB4ZmYsMHgyZSwweDEwLDB4MDYsMHg2NiwweDg5LDB4ZjAsMHg2NiwweDI1LDB4ZmYsMHgwMSwKLTB4MDAsMHgwMCwweDY2LDB4MDEsMHhjMSwweDI5LDB4YzYsMHg2NiwweDI5LDB4YzcsMHg2NiwweDg5LDB4MGUsMHgyNiwweDA2LDB4NjYsCi0weDg5LDB4M2UsMHgyMiwweDA2LDB4ZTgsMHhmZSwweDAwLDB4ODksMHgzNiwweDNlLDB4MDYsMHg2NiwweGMxLDB4ZWUsMHgxMCwweDg5LAotMHgzNiwweDQyLDB4MDYsMHg4YiwweDFlLDB4MDYsMHgwNiwweDg5LDB4MWUsMHgzYSwweDA2LDB4YzcsMHgwNiwweDQ2LDB4MDYsMHgwMCwKLTB4NDIsMHhlOCwweGYyLDB4MDAsMHhhMSwweDFjLDB4MDYsMHhhMywweDRlLDB4MDYsMHhjNywweDA2LDB4M2UsMHgwNiwweDAwLDB4MDAsCi0weGM2LDB4MDYsMHg0NywweDA2LDB4M2YsMHhhMSwweDI4LDB4MDYsMHgwOSwweGMwLDB4NzUsMHgwOSwweGExLDB4MjYsMHgwNiwweDNiLAotMHgwNiwweDIwLDB4MDYsMHg3NiwweDAzLDB4YTEsMHgyMCwweDA2LDB4YTMsMHg0MiwweDA2LDB4ZTgsMHhjOCwweDAwLDB4NjYsMHgzMSwKLTB4YzksMHg4YiwweDBlLDB4NDYsMHgwNiwweDY2LDB4OGIsMHgzZSwweDIyLDB4MDYsMHg2NiwweDAxLDB4MGUsMHgyMiwweDA2LDB4NjYsCi0weDI5LDB4MGUsMHgyNiwweDA2LDB4NjYsMHgzMSwweGY2LDB4YzEsMHhlOSwweDAyLDB4MWUsMHgwNiwweDhlLDB4MDYsMHgxNiwweDA2LAotMHg4ZSwweDFlLDB4MWUsMHgwNiwweDY3LDB4ZjMsMHg2NiwweGE1LDB4MDcsMHgxZiwweDY2LDB4MDMsMHgwZSwweDI2LDB4MDYsMHg3NSwKLTB4YWYsMHhjMywweDNjLDB4M2EsMHg3NCwweDA2LDB4M2MsMHgyZiwweDc0LDB4MDIsMHgzYywweDVjLDB4YzMsMHhiZSwweDY0LDB4MDcsCi0weDg5LDB4ZjMsMHgyNiwweDhhLDB4MDUsMHg0NywweDg4LDB4MDQsMHgzOCwweGUwLDB4NzQsMHgwZSwweDA4LDB4YzAsMHg3NCwweDBhLAotMHg0NiwweGU4LDB4ZGUsMHhmZiwweDc1LDB4ZWMsMHg4OSwweGYzLDB4NzQsMHhlOCwweGMzLDB4YmEsMHgyNiwweDA1LDB4ZWIsMHgwOCwKLTB4YmEsMHgzNCwweDA1LDB4ZWIsMHgwMywweGJhLDB4M2UsMHgwNSwweDUyLDB4OGIsMHgxZSwweDYyLDB4MDcsMHhjNiwweDA3LDB4MjQsCi0weGJiLDB4NjQsMHgwNywweGViLDB4MWUsMHhlOCwweGVkLDB4MDAsMHhiYSwweDc4LDB4MDUsMHhlYiwweDEyLDB4YmEsMHg5MSwweDA1LAotMHhlYiwweDBkLDB4YmEsMHhhMywweDA1LDB4ZWIsMHgwOCwweGJhLDB4YjUsMHgwNSwweGViLDB4MDMsMHhiYSwweDc4LDB4MDUsMHg1MiwKLTB4YmIsMHgxOSwweDA1LDB4ZTgsMHgxNCwweDAwLDB4NWIsMHhlOCwweDEwLDB4MDAsMHhiYiwweDQyLDB4MDQsMHhlOCwweDBhLDB4MDAsCi0weGI4LDB4ZmYsMHg0YywweGNkLDB4MjEsMHg0MywweGI0LDB4MDIsMHhjZCwweDIxLDB4OGEsMHgxNywweDgwLDB4ZmEsMHgyNCwweDc1LAotMHhmNCwweGMzLDB4MGQsMHgwYSwweDI0LDB4NTAsMHg1MSwweDU3LDB4MzEsMHhjMCwweGJmLDB4MmEsMHgwNiwweGI5LDB4MTksMHgwMCwKLTB4ZjMsMHhhYiwweDVmLDB4NTksMHg1OCwweGMzLDB4YjgsMHgwMCwweDAzLDB4YmIsMHgyMSwweDAwLDB4MzEsMHhjOSwweDY2LDB4YmYsCi0weDJhLDB4MDYsMHgwMCwweDAwLDB4Y2QsMHgzMSwweGMzLDB4MDAsMHgwMCwweDMwLDB4ZTQsMHhlOCwweDVmLDB4ZmYsMHg4OSwweGRlLAotMHg4YiwweDNlLDB4NjcsMHgwNCwweGViLDB4MTgsMHhiNCwweDNiLDB4ZTgsMHg1MiwweGZmLDB4ODEsMHhmZSwweDY0LDB4MDcsMHg3NCwKLTB4MTMsMHg4YSwweDg0LDB4ZmYsMHhmZiwweGU4LDB4M2EsMHhmZiwweDc0LDB4MDQsMHhjNiwweDA0LDB4NWMsMHg0NiwweGU4LDB4MDMsCi0weDAwLDB4NzIsMHhlMywweGMzLDB4ZTgsMHgzNiwweDAwLDB4YmIsMHg0NCwweDAwLDB4OGEsMHgwNywweDg4LDB4MDQsMHg0MywweDQ2LAotMHgwOCwweGMwLDB4NzUsMHhmNiwweDA2LDB4NTcsMHgxZSwweDA3LDB4ZTgsMHg5YSwweGZmLDB4YmIsMHgyYSwweDA2LDB4OGMsMHg5ZiwKLTB4MDQsMHgwMCwweDg5LDB4OWYsMHgwMiwweDAwLDB4YmEsMHg2NCwweDA3LDB4YjgsMHgwMCwweDRiLDB4Y2QsMHgyMSwweDVmLDB4MDcsCi0weDcyLDB4MDksMHhiNCwweDRkLDB4Y2QsMHgyMSwweDJkLDB4MDAsMHgwMywweGY3LDB4ZDgsMHhlYiwweDI4LDB4ODAsMHgzZSwweDY5LAotMHgwOCwweDA1LDB4NzIsMHgyMCwweGI4LDB4MDAsMHg1OCwweGNkLDB4MjEsMHhhMiwweDY3LDB4MDgsMHhiOCwweDAyLDB4NTgsMHhjZCwKLTB4MjEsMHhhMiwweDY4LDB4MDgsMHhiOCwweDAxLDB4NTgsMHhiYiwweDgwLDB4MDAsMHhjZCwweDIxLDB4YjgsMHgwMywweDU4LDB4YmIsCi0weDAxLDB4MDAsMHhjZCwweDIxLDB4YzMsMHg5YywweDgwLDB4M2UsMHg2OSwweDA4LDB4MDUsMHg3MiwweDFhLDB4NTAsMHg1MywweGI4LAotMHgwMywweDU4LDB4OGEsMHgxZSwweDY4LDB4MDgsMHgzMCwweGZmLDB4Y2QsMHgyMSwweGI4LDB4MDEsMHg1OCwweDhhLDB4MWUsMHg2NywKLTB4MDgsMHgzMCwweGZmLDB4Y2QsMHgyMSwweDViLDB4NTgsMHg5ZCwweGMzLDB4NGMsMHg2ZiwweDYxLDB4NjQsMHgyMCwweDY1LDB4NzIsCi0weDcyLDB4NmYsMHg3MiwweDNhLDB4MjAsMHgyNCwweDNhLDB4MjAsMHg2MywweDYxLDB4NmUsMHg2ZSwweDZmLDB4NzQsMHgyMCwweDZmLAotMHg3MCwweDY1LDB4NmUsMHgyNCwweDNhLDB4MjAsMHg2ZSwweDZmLDB4NzQsMHgyMCwweDQ1LDB4NTgsMHg0NSwweDI0LDB4M2EsMHgyMCwKLTB4NmUsMHg2ZiwweDc0LDB4MjAsMHg0MywweDRmLDB4NDYsMHg0NiwweDIwLDB4MjgsMHg0MywweDY4LDB4NjUsMHg2MywweDZiLDB4MjAsCi0weDY2LDB4NmYsMHg3MiwweDIwLDB4NzYsMHg2OSwweDcyLDB4NzUsMHg3MywweDY1LDB4NzMsMHgyOSwweDI0LDB4NmUsMHg2ZiwweDIwLAotMHg0NCwweDUwLDB4NGQsMHg0OSwweDIwLDB4MmQsMHgyMCwweDQ3LDB4NjUsMHg3NCwweDIwLDB4NjMsMHg3MywweDY0LDB4NzAsMHg2ZCwKLTB4NjksMHgyYSwweDYyLDB4MmUsMHg3YSwweDY5LDB4NzAsMHgyNCwweDZlLDB4NmYsMHgyMCwweDQ0LDB4NGYsMHg1MywweDIwLDB4NmQsCi0weDY1LDB4NmQsMHg2ZiwweDcyLDB4NzksMHgyNCwweDZlLDB4NjUsMHg2NSwweDY0LDB4MjAsMHg0NCwweDRmLDB4NTMsMHgyMCwweDMzLAotMHgyNCwweDYzLDB4NjEsMHg2ZSwweDI3LDB4NzQsMHgyMCwweDczLDB4NzcsMHg2OSwweDc0LDB4NjMsMHg2OCwweDIwLDB4NmQsMHg2ZiwKLTB4NjQsMHg2NSwweDI0LDB4NmUsMHg2ZiwweDIwLDB4NDQsMHg1MCwweDRkLDB4NDksMHgyMCwweDczLDB4NjUsMHg2YywweDY1LDB4NjMsCi0weDc0LDB4NmYsMHg3MiwweDczLDB4MjQsMHg2ZSwweDZmLDB4MjAsMHg0NCwweDUwLDB4NGQsMHg0OSwweDIwLDB4NmQsMHg2NSwweDZkLAotMHg2ZiwweDcyLDB4NzksMHgyNCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwKLTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsCi0weDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAotMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MApkaWZmIC0tZ2l0IGEvYmZkL2hhc2guYyBiL2JmZC9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2VhZjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDczNCArMCwwIEBACi0vKiBoYXNoLmMgLS0gaGFzaCB0YWJsZSByb3V0aW5lcyBmb3IgQkZECi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAib2JqYWxsb2MuaCIKLQotLyoKLVNFQ1RJT04KLQlIYXNoIFRhYmxlcwotCi1AY2luZGV4IEhhc2ggdGFibGVzCi0JQkZEIHByb3ZpZGVzIGEgc2ltcGxlIHNldCBvZiBoYXNoIHRhYmxlIGZ1bmN0aW9ucy4gIFJvdXRpbmVzCi0JYXJlIHByb3ZpZGVkIHRvIGluaXRpYWxpemUgYSBoYXNoIHRhYmxlLCB0byBmcmVlIGEgaGFzaCB0YWJsZSwKLQl0byBsb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZSBhbmQgb3B0aW9uYWxseSBjcmVhdGUgYW4KLQllbnRyeSBmb3IgaXQsIGFuZCB0byB0cmF2ZXJzZSBhIGhhc2ggdGFibGUuICBUaGVyZSBpcwotCWN1cnJlbnRseSBubyByb3V0aW5lIHRvIGRlbGV0ZSBhbiBzdHJpbmcgZnJvbSBhIGhhc2ggdGFibGUuCi0KLQlUaGUgYmFzaWMgaGFzaCB0YWJsZSBkb2VzIG5vdCBwZXJtaXQgYW55IGRhdGEgdG8gYmUgc3RvcmVkCi0Jd2l0aCBhIHN0cmluZy4gIEhvd2V2ZXIsIGEgaGFzaCB0YWJsZSBpcyBkZXNpZ25lZCB0byBwcmVzZW50IGEKLQliYXNlIGNsYXNzIGZyb20gd2hpY2ggb3RoZXIgdHlwZXMgb2YgaGFzaCB0YWJsZXMgbWF5IGJlCi0JZGVyaXZlZC4gIFRoZXNlIGRlcml2ZWQgdHlwZXMgbWF5IHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLQl3aXRoIHRoZSBzdHJpbmcuICBIYXNoIHRhYmxlcyB3ZXJlIGltcGxlbWVudGVkIGluIHRoaXMgd2F5LAotCXJhdGhlciB0aGFuIHNpbXBseSBwcm92aWRpbmcgYSBkYXRhIHBvaW50ZXIgaW4gYSBoYXNoIHRhYmxlCi0JZW50cnksIGJlY2F1c2UgdGhleSB3ZXJlIGRlc2lnbmVkIGZvciB1c2UgYnkgdGhlIGxpbmtlciBiYWNrCi0JZW5kcy4gIFRoZSBsaW5rZXIgbWF5IGNyZWF0ZSB0aG91c2FuZHMgb2YgaGFzaCB0YWJsZSBlbnRyaWVzLAotCWFuZCB0aGUgb3ZlcmhlYWQgb2YgYWxsb2NhdGluZyBwcml2YXRlIGRhdGEgYW5kIHN0b3JpbmcgYW5kCi0JZm9sbG93aW5nIHBvaW50ZXJzIGJlY29tZXMgbm90aWNlYWJsZS4KLQotCVRoZSBiYXNpYyBoYXNoIHRhYmxlIGNvZGUgaXMgaW4gPDxoYXNoLmM+Pi4KLQotQG1lbnUKLUAqIENyZWF0aW5nIGFuZCBGcmVlaW5nIGEgSGFzaCBUYWJsZTo6Ci1AKiBMb29raW5nIFVwIG9yIEVudGVyaW5nIGEgU3RyaW5nOjoKLUAqIFRyYXZlcnNpbmcgYSBIYXNoIFRhYmxlOjoKLUAqIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZTo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLUNyZWF0aW5nIGFuZCBGcmVlaW5nIGEgSGFzaCBUYWJsZSwgTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZywgSGFzaCBUYWJsZXMsIEhhc2ggVGFibGVzCi1TVUJTRUNUSU9OCi0JQ3JlYXRpbmcgYW5kIGZyZWVpbmcgYSBoYXNoIHRhYmxlCi0KLUBmaW5kZXggYmZkX2hhc2hfdGFibGVfaW5pdAotQGZpbmRleCBiZmRfaGFzaF90YWJsZV9pbml0X24KLQlUbyBjcmVhdGUgYSBoYXNoIHRhYmxlLCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSA8PHN0cnVjdAotCWJmZF9oYXNoX3RhYmxlPj4gKGRlZmluZWQgaW4gPDxiZmQuaD4+KSBhbmQgY2FsbAotCTw8YmZkX2hhc2hfdGFibGVfaW5pdD4+IChpZiB5b3Uga25vdyBhcHByb3hpbWF0ZWx5IGhvdyBtYW55Ci0JZW50cmllcyB5b3Ugd2lsbCBuZWVkLCB0aGUgZnVuY3Rpb24gPDxiZmRfaGFzaF90YWJsZV9pbml0X24+PiwKLQl3aGljaCB0YWtlcyBhIEB2YXJ7c2l6ZX0gYXJndW1lbnQsIG1heSBiZSB1c2VkKS4KLQk8PGJmZF9oYXNoX3RhYmxlX2luaXQ+PiByZXR1cm5zIDw8ZmFsc2U+PiBpZiBzb21lIHNvcnQgb2YKLQllcnJvciBvY2N1cnMuCi0KLUBmaW5kZXggYmZkX2hhc2hfbmV3ZnVuYwotCVRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX3RhYmxlX2luaXQ+PiB0YWtlIGFzIGFuIGFyZ3VtZW50IGEKLQlmdW5jdGlvbiB0byB1c2UgdG8gY3JlYXRlIG5ldyBlbnRyaWVzLiAgRm9yIGEgYmFzaWMgaGFzaAotCXRhYmxlLCB1c2UgdGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfbmV3ZnVuYz4+LiAgQHhyZWZ7RGVyaXZpbmcKLQlhIE5ldyBIYXNoIFRhYmxlIFR5cGV9LCBmb3Igd2h5IHlvdSB3b3VsZCB3YW50IHRvIHVzZSBhCi0JZGlmZmVyZW50IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50LgotCi1AZmluZGV4IGJmZF9oYXNoX2FsbG9jYXRlCi0JPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gd2lsbCBjcmVhdGUgYW4gb2JqYWxsb2Mgd2hpY2ggd2lsbCBiZQotCXVzZWQgdG8gYWxsb2NhdGUgbmV3IGVudHJpZXMuICBZb3UgbWF5IGFsbG9jYXRlIG1lbW9yeSBvbiB0aGlzCi0Jb2JqYWxsb2MgdXNpbmcgPDxiZmRfaGFzaF9hbGxvY2F0ZT4+LgotCi1AZmluZGV4IGJmZF9oYXNoX3RhYmxlX2ZyZWUKLQlVc2UgPDxiZmRfaGFzaF90YWJsZV9mcmVlPj4gdG8gZnJlZSB1cCBhbGwgdGhlIG1lbW9yeSB0aGF0IGhhcwotCWJlZW4gYWxsb2NhdGVkIGZvciBhIGhhc2ggdGFibGUuICBUaGlzIHdpbGwgbm90IGZyZWUgdXAgdGhlCi0JPDxzdHJ1Y3QgYmZkX2hhc2hfdGFibGU+PiBpdHNlbGYsIHdoaWNoIHlvdSBtdXN0IHByb3ZpZGUuCi0KLUlOT0RFCi1Mb29raW5nIFVwIG9yIEVudGVyaW5nIGEgU3RyaW5nLCBUcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZSwgQ3JlYXRpbmcgYW5kIEZyZWVpbmcgYSBIYXNoIFRhYmxlLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCUxvb2tpbmcgdXAgb3IgZW50ZXJpbmcgYSBzdHJpbmcKLQotQGZpbmRleCBiZmRfaGFzaF9sb29rdXAKLQlUaGUgZnVuY3Rpb24gPDxiZmRfaGFzaF9sb29rdXA+PiBpcyB1c2VkIGJvdGggdG8gbG9vayB1cCBhCi0Jc3RyaW5nIGluIHRoZSBoYXNoIHRhYmxlIGFuZCB0byBjcmVhdGUgYSBuZXcgZW50cnkuCi0KLQlJZiB0aGUgQHZhcntjcmVhdGV9IGFyZ3VtZW50IGlzIDw8ZmFsc2U+PiwgPDxiZmRfaGFzaF9sb29rdXA+PgotCXdpbGwgbG9vayB1cCBhIHN0cmluZy4gIElmIHRoZSBzdHJpbmcgaXMgZm91bmQsIGl0IHdpbGwKLQlyZXR1cm5zIGEgcG9pbnRlciB0byBhIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4uICBJZiB0aGUKLQlzdHJpbmcgaXMgbm90IGZvdW5kIGluIHRoZSB0YWJsZSA8PGJmZF9oYXNoX2xvb2t1cD4+IHdpbGwKLQlyZXR1cm4gPDxOVUxMPj4uICBZb3Ugc2hvdWxkIG5vdCBtb2RpZnkgYW55IG9mIHRoZSBmaWVsZHMgaW4KLQl0aGUgcmV0dXJucyA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeT4+LgotCi0JSWYgdGhlIEB2YXJ7Y3JlYXRlfSBhcmd1bWVudCBpcyA8PHRydWU+PiwgdGhlIHN0cmluZyB3aWxsIGJlCi0JZW50ZXJlZCBpbnRvIHRoZSBoYXNoIHRhYmxlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLgotCUVpdGhlciB3YXkgYSBwb2ludGVyIHRvIGEgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+PiB3aWxsIGJlCi0JcmV0dXJuZWQsIGVpdGhlciB0byB0aGUgZXhpc3Rpbmcgc3RydWN0dXJlIG9yIHRvIGEgbmV3bHkKLQljcmVhdGVkIG9uZS4gIEluIHRoaXMgY2FzZSwgYSA8PE5VTEw+PiByZXR1cm4gbWVhbnMgdGhhdCBhbgotCWVycm9yIG9jY3VycmVkLgotCi0JSWYgdGhlIEB2YXJ7Y3JlYXRlfSBhcmd1bWVudCBpcyA8PHRydWU+PiwgYW5kIGEgbmV3IGVudHJ5IGlzCi0JY3JlYXRlZCwgdGhlIEB2YXJ7Y29weX0gYXJndW1lbnQgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0bwotCWNvcHkgdGhlIHN0cmluZyBvbnRvIHRoZSBoYXNoIHRhYmxlIG9iamFsbG9jIG9yIG5vdC4gIElmCi0JQHZhcntjb3B5fSBpcyBwYXNzZWQgYXMgPDxmYWxzZT4+LCB5b3UgbXVzdCBiZSBjYXJlZnVsIG5vdCB0bwotCWRlYWxsb2NhdGUgb3IgbW9kaWZ5IHRoZSBzdHJpbmcgYXMgbG9uZyBhcyB0aGUgaGFzaCB0YWJsZQotCWV4aXN0cy4KLQotSU5PREUKLVRyYXZlcnNpbmcgYSBIYXNoIFRhYmxlLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUsIExvb2tpbmcgVXAgb3IgRW50ZXJpbmcgYSBTdHJpbmcsIEhhc2ggVGFibGVzCi1TVUJTRUNUSU9OCi0JVHJhdmVyc2luZyBhIGhhc2ggdGFibGUKLQotQGZpbmRleCBiZmRfaGFzaF90cmF2ZXJzZQotCVRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX3RyYXZlcnNlPj4gbWF5IGJlIHVzZWQgdG8gdHJhdmVyc2UgYQotCWhhc2ggdGFibGUsIGNhbGxpbmcgYSBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQuICBUaGUgdHJhdmVyc2FsCi0JaXMgZG9uZSBpbiBhIHJhbmRvbSBvcmRlci4KLQotCTw8YmZkX2hhc2hfdHJhdmVyc2U+PiB0YWtlcyBhcyBhcmd1bWVudHMgYSBmdW5jdGlvbiBhbmQgYQotCWdlbmVyaWMgPDx2b2lkICo+PiBwb2ludGVyLiAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKLQloYXNoIHRhYmxlIGVudHJ5IChhIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5ICo+PikgYW5kIHRoZQotCWdlbmVyaWMgcG9pbnRlciBwYXNzZWQgdG8gPDxiZmRfaGFzaF90cmF2ZXJzZT4+LiAgVGhlIGZ1bmN0aW9uCi0JbXVzdCByZXR1cm4gYSA8PGJvb2xlYW4+PiB2YWx1ZSwgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdG8KLQljb250aW51ZSB0cmF2ZXJzaW5nIHRoZSBoYXNoIHRhYmxlLiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKLQk8PGZhbHNlPj4sIDw8YmZkX2hhc2hfdHJhdmVyc2U+PiB3aWxsIHN0b3AgdGhlIHRyYXZlcnNhbCBhbmQKLQlyZXR1cm4gaW1tZWRpYXRlbHkuCi0KLUlOT0RFCi1EZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUsICwgVHJhdmVyc2luZyBhIEhhc2ggVGFibGUsIEhhc2ggVGFibGVzCi1TVUJTRUNUSU9OCi0JRGVyaXZpbmcgYSBuZXcgaGFzaCB0YWJsZSB0eXBlCi0KLQlNYW55IHVzZXMgb2YgaGFzaCB0YWJsZXMgd2FudCB0byBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0Jd2hpY2ggZWFjaCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gIFNvbWUgYWxzbyBmaW5kIGl0Ci0JY29udmVuaWVudCB0byBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpdGggdGhlIGhhc2ggdGFibGUKLQlpdHNlbGYuICBUaGlzIG1heSBiZSBkb25lIHVzaW5nIGEgZGVyaXZlZCBoYXNoIHRhYmxlLgotCi0JU2luY2UgQyBpcyBub3QgYW4gb2JqZWN0IG9yaWVudGVkIGxhbmd1YWdlLCBjcmVhdGluZyBhIGRlcml2ZWQKLQloYXNoIHRhYmxlIHJlcXVpcmVzIHN0aWNraW5nIHRvZ2V0aGVyIHNvbWUgYm9pbGVycGxhdGUKLQlyb3V0aW5lcyB3aXRoIGEgZmV3IGRpZmZlcmVuY2VzIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGhhc2gKLQl0YWJsZSB5b3Ugd2FudCB0byBjcmVhdGUuCi0KLQlBbiBleGFtcGxlIG9mIGEgZGVyaXZlZCBoYXNoIHRhYmxlIGlzIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQlUaGUgc3RydWN0dXJlcyBmb3IgdGhpcyBhcmUgZGVmaW5lZCBpbiA8PGJmZGxpbmsuaD4+LiAgVGhlCi0JZnVuY3Rpb25zIGFyZSBpbiA8PGxpbmtlci5jPj4uCi0KLQlZb3UgbWF5IGFsc28gZGVyaXZlIGEgaGFzaCB0YWJsZSBmcm9tIGFuIGFscmVhZHkgZGVyaXZlZCBoYXNoCi0JdGFibGUuICBGb3IgZXhhbXBsZSwgdGhlIGEub3V0IGxpbmtlciBiYWNrZW5kIGNvZGUgdXNlcyBhIGhhc2gKLQl0YWJsZSBkZXJpdmVkIGZyb20gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCi1AbWVudQotQCogRGVmaW5lIHRoZSBEZXJpdmVkIFN0cnVjdHVyZXM6OgotQCogV3JpdGUgdGhlIERlcml2ZWQgQ3JlYXRpb24gUm91dGluZTo6Ci1AKiBXcml0ZSBPdGhlciBEZXJpdmVkIFJvdXRpbmVzOjoKLUBlbmQgbWVudQotCi1JTk9ERQotRGVmaW5lIHRoZSBEZXJpdmVkIFN0cnVjdHVyZXMsIFdyaXRlIHRoZSBEZXJpdmVkIENyZWF0aW9uIFJvdXRpbmUsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZSwgRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlCi1TVUJTVUJTRUNUSU9OCi0JRGVmaW5lIHRoZSBkZXJpdmVkIHN0cnVjdHVyZXMKLQotCVlvdSBtdXN0IGRlZmluZSBhIHN0cnVjdHVyZSBmb3IgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUsCi0JYW5kIGEgc3RydWN0dXJlIGZvciB0aGUgaGFzaCB0YWJsZSBpdHNlbGYuCi0KLQlUaGUgZmlyc3QgZmllbGQgaW4gdGhlIHN0cnVjdHVyZSBmb3IgYW4gZW50cnkgaW4gdGhlIGhhc2gKLQl0YWJsZSBtdXN0IGJlIG9mIHRoZSB0eXBlIHVzZWQgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlCi0JeW91IGFyZSBkZXJpdmluZyBmcm9tLiAgSWYgeW91IGFyZSBkZXJpdmluZyBmcm9tIGEgYmFzaWMgaGFzaAotCXRhYmxlIHRoaXMgaXMgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+Piwgd2hpY2ggaXMgZGVmaW5lZCBpbgotCTw8YmZkLmg+Pi4gIFRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgc3RydWN0dXJlIGZvciB0aGUgaGFzaAotCXRhYmxlIGl0c2VsZiBtdXN0IGJlIG9mIHRoZSB0eXBlIG9mIHRoZSBoYXNoIHRhYmxlIHlvdSBhcmUKLQlkZXJpdmluZyBmcm9tIGl0c2VsZi4gIElmIHlvdSBhcmUgZGVyaXZpbmcgZnJvbSBhIGJhc2ljIGhhc2gKLQl0YWJsZSwgdGhpcyBpcyA8PHN0cnVjdCBiZmRfaGFzaF90YWJsZT4+LgotCi0JRm9yIGV4YW1wbGUsIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBkZWZpbmVzIDw8c3RydWN0Ci0JYmZkX2xpbmtfaGFzaF9lbnRyeT4+IChpbiA8PGJmZGxpbmsuaD4+KS4gIFRoZSBmaXJzdCBmaWVsZCwKLQk8PHJvb3Q+PiwgaXMgb2YgdHlwZSA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeT4+LiAgU2ltaWxhcmx5LAotCXRoZSBmaXJzdCBmaWVsZCBpbiA8PHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlPj4sIDw8dGFibGU+PiwKLQlpcyBvZiB0eXBlIDw8c3RydWN0IGJmZF9oYXNoX3RhYmxlPj4uCi0KLUlOT0RFCi1Xcml0ZSB0aGUgRGVyaXZlZCBDcmVhdGlvbiBSb3V0aW5lLCBXcml0ZSBPdGhlciBEZXJpdmVkIFJvdXRpbmVzLCBEZWZpbmUgdGhlIERlcml2ZWQgU3RydWN0dXJlcywgRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlCi1TVUJTVUJTRUNUSU9OCi0JV3JpdGUgdGhlIGRlcml2ZWQgY3JlYXRpb24gcm91dGluZQotCi0JWW91IG11c3Qgd3JpdGUgYSByb3V0aW5lIHdoaWNoIHdpbGwgY3JlYXRlIGFuZCBpbml0aWFsaXplIGFuCi0JZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBUaGlzIHJvdXRpbmUgaXMgcGFzc2VkIGFzIHRoZQotCWZ1bmN0aW9uIGFyZ3VtZW50IHRvIDw8YmZkX2hhc2hfdGFibGVfaW5pdD4+LgotCi0JSW4gb3JkZXIgdG8gcGVybWl0IG90aGVyIGhhc2ggdGFibGVzIHRvIGJlIGRlcml2ZWQgZnJvbSB0aGUKLQloYXNoIHRhYmxlIHlvdSBhcmUgY3JlYXRpbmcsIHRoaXMgcm91dGluZSBtdXN0IGJlIHdyaXR0ZW4gaW4gYQotCXN0YW5kYXJkIHdheS4KLQotCVRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY3JlYXRpb24gcm91dGluZSBpcyBhIHBvaW50ZXIgdG8gYQotCWhhc2ggdGFibGUgZW50cnkuICBUaGlzIG1heSBiZSA8PE5VTEw+PiwgaW4gd2hpY2ggY2FzZSB0aGUKLQlyb3V0aW5lIHNob3VsZCBhbGxvY2F0ZSB0aGUgcmlnaHQgYW1vdW50IG9mIHNwYWNlLiAgT3RoZXJ3aXNlCi0JdGhlIHNwYWNlIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEgaGFzaCB0YWJsZSB0eXBlCi0JZGVyaXZlZCBmcm9tIHRoaXMgb25lLgotCi0JQWZ0ZXIgYWxsb2NhdGluZyBzcGFjZSwgdGhlIGNyZWF0aW9uIHJvdXRpbmUgbXVzdCBjYWxsIHRoZQotCWNyZWF0aW9uIHJvdXRpbmUgb2YgdGhlIGhhc2ggdGFibGUgdHlwZSBpdCBpcyBkZXJpdmVkIGZyb20sCi0JcGFzc2luZyBpbiBhIHBvaW50ZXIgdG8gdGhlIHNwYWNlIGl0IGp1c3QgYWxsb2NhdGVkLiAgVGhpcwotCXdpbGwgaW5pdGlhbGl6ZSBhbnkgZmllbGRzIHVzZWQgYnkgdGhlIGJhc2UgaGFzaCB0YWJsZS4KLQotCUZpbmFsbHkgdGhlIGNyZWF0aW9uIHJvdXRpbmUgbXVzdCBpbml0aWFsaXplIGFueSBsb2NhbCBmaWVsZHMKLQlmb3IgdGhlIG5ldyBoYXNoIHRhYmxlIHR5cGUuCi0KLQlIZXJlIGlzIGEgYm9pbGVycGxhdGUgZXhhbXBsZSBvZiBhIGNyZWF0aW9uIHJvdXRpbmUuCi0JQHZhcntmdW5jdGlvbl9uYW1lfSBpcyB0aGUgbmFtZSBvZiB0aGUgcm91dGluZS4KLQlAdmFye2VudHJ5X3R5cGV9IGlzIHRoZSB0eXBlIG9mIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIHlvdQotCWFyZSBjcmVhdGluZy4gIEB2YXJ7YmFzZV9uZXdmdW5jfSBpcyB0aGUgbmFtZSBvZiB0aGUgY3JlYXRpb24KLQlyb3V0aW5lIG9mIHRoZSBoYXNoIHRhYmxlIHR5cGUgeW91ciBoYXNoIHRhYmxlIGlzIGRlcml2ZWQKLQlmcm9tLgotCi1FWEFNUExFCi0KLS5zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotLkB2YXJ7ZnVuY3Rpb25fbmFtZX0gKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotLiAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLS4gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0uICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0uewotLiAgc3RydWN0IEB2YXJ7ZW50cnlfdHlwZX0gKnJldCA9IChAdmFye2VudHJ5X3R5cGV9ICopIGVudHJ5OwotLgotLiB7KiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0uICAgIGRlcml2ZWQgY2xhc3MuICAqfQotLiAgaWYgKHJldCA9PSAoQHZhcntlbnRyeV90eXBlfSAqKSBOVUxMKQotLiAgICB7Ci0uICAgICAgcmV0ID0gKChAdmFye2VudHJ5X3R5cGV9ICopCi0uCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChAdmFye2VudHJ5X3R5cGV9KSkpOwotLiAgICAgIGlmIChyZXQgPT0gKEB2YXJ7ZW50cnlfdHlwZX0gKikgTlVMTCkKLS4gICAgICAgIHJldHVybiBOVUxMOwotLiAgICB9Ci0uCi0uIHsqIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBiYXNlIGNsYXNzLiAgKn0KLS4gIHJldCA9ICgoQHZhcntlbnRyeV90eXBlfSAqKQotLgkgQHZhcntiYXNlX25ld2Z1bmN9ICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotLgotLiB7KiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMgaGVyZS4gICp9Ci0uCi0uICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0ufQotCi1ERVNDUklQVElPTgotCVRoZSBjcmVhdGlvbiByb3V0aW5lIGZvciB0aGUgbGlua2VyIGhhc2ggdGFibGUsIHdoaWNoIGlzIGluCi0JPDxsaW5rZXIuYz4+LCBsb29rcyBqdXN0IGxpa2UgdGhpcyBleGFtcGxlLgotCUB2YXJ7ZnVuY3Rpb25fbmFtZX0gaXMgPDxfYmZkX2xpbmtfaGFzaF9uZXdmdW5jPj4uCi0JQHZhcntlbnRyeV90eXBlfSBpcyA8PHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Pj4uCi0JQHZhcntiYXNlX25ld2Z1bmN9IGlzIDw8YmZkX2hhc2hfbmV3ZnVuYz4+LCB0aGUgY3JlYXRpb24KLQlyb3V0aW5lIGZvciBhIGJhc2ljIGhhc2ggdGFibGUuCi0KLQk8PF9iZmRfbGlua19oYXNoX25ld2Z1bmM+PiBhbHNvIGluaXRpYWxpemVzIHRoZSBsb2NhbCBmaWVsZHMKLQlpbiBhIGxpbmtlciBoYXNoIHRhYmxlIGVudHJ5OiA8PHR5cGU+PiwgPDx3cml0dGVuPj4gYW5kCi0JPDxuZXh0Pj4uCi0KLUlOT0RFCi1Xcml0ZSBPdGhlciBEZXJpdmVkIFJvdXRpbmVzLCAsIFdyaXRlIHRoZSBEZXJpdmVkIENyZWF0aW9uIFJvdXRpbmUsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZQotU1VCU1VCU0VDVElPTgotCVdyaXRlIG90aGVyIGRlcml2ZWQgcm91dGluZXMKLQotCVlvdSB3aWxsIHdhbnQgdG8gd3JpdGUgb3RoZXIgcm91dGluZXMgZm9yIHlvdXIgbmV3IGhhc2ggdGFibGUsCi0JYXMgd2VsbC4gIAotCi0JWW91IHdpbGwgd2FudCBhbiBpbml0aWFsaXphdGlvbiByb3V0aW5lIHdoaWNoIGNhbGxzIHRoZQotCWluaXRpYWxpemF0aW9uIHJvdXRpbmUgb2YgdGhlIGhhc2ggdGFibGUgeW91IGFyZSBkZXJpdmluZyBmcm9tCi0JYW5kIGluaXRpYWxpemVzIGFueSBvdGhlciBsb2NhbCBmaWVsZHMuICBGb3IgdGhlIGxpbmtlciBoYXNoCi0JdGFibGUsIHRoaXMgaXMgPDxfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0Pj4gaW4gPDxsaW5rZXIuYz4+LgotCi0JWW91IHdpbGwgd2FudCBhIGxvb2t1cCByb3V0aW5lIHdoaWNoIGNhbGxzIHRoZSBsb29rdXAgcm91dGluZQotCW9mIHRoZSBoYXNoIHRhYmxlIHlvdSBhcmUgZGVyaXZpbmcgZnJvbSBhbmQgY2FzdHMgdGhlIHJlc3VsdC4KLQlUaGUgbGlua2VyIGhhc2ggdGFibGUgdXNlcyA8PGJmZF9saW5rX2hhc2hfbG9va3VwPj4gaW4KLQk8PGxpbmtlci5jPj4gKHRoaXMgYWN0dWFsbHkgdGFrZXMgYW4gYWRkaXRpb25hbCBhcmd1bWVudCB3aGljaAotCWl0IHVzZXMgdG8gZGVjaWRlIGhvdyB0byByZXR1cm4gdGhlIGxvb2tlZCB1cCB2YWx1ZSkuCi0KLQlZb3UgbWF5IHdhbnQgYSB0cmF2ZXJzYWwgcm91dGluZS4gIFRoaXMgc2hvdWxkIGp1c3QgY2FsbCB0aGUKLQl0cmF2ZXJzYWwgcm91dGluZSBvZiB0aGUgaGFzaCB0YWJsZSB5b3UgYXJlIGRlcml2aW5nIGZyb20gd2l0aAotCWFwcHJvcHJpYXRlIGNhc3RzLiAgVGhlIGxpbmtlciBoYXNoIHRhYmxlIHVzZXMKLQk8PGJmZF9saW5rX2hhc2hfdHJhdmVyc2U+PiBpbiA8PGxpbmtlci5jPj4uCi0KLQlUaGVzZSByb3V0aW5lcyBtYXkgc2ltcGx5IGJlIGRlZmluZWQgYXMgbWFjcm9zLiAgRm9yIGV4YW1wbGUsCi0JdGhlIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUsIHdoaWNoIGlzIGRlcml2ZWQgZnJvbSB0aGUKLQlsaW5rZXIgaGFzaCB0YWJsZSwgdXNlcyBtYWNyb3MgZm9yIHRoZSBsb29rdXAgYW5kIHRyYXZlcnNhbAotCXJvdXRpbmVzLiAgVGhlc2UgYXJlIDw8YW91dF9saW5rX2hhc2hfbG9va3VwPj4gYW5kCi0JPDxhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZT4+IGluIGFvdXR4LmguCi0qLwotCi0vKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgZW50cmllcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIGhhc2ggdGFibGUuICAqLwotI2RlZmluZSBERUZBVUxUX1NJWkUgKDQwNTEpCi0KLS8qIENyZWF0ZSBhIG5ldyBoYXNoIHRhYmxlLCBnaXZlbiBhIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KLQotYm9vbGVhbgotYmZkX2hhc2hfdGFibGVfaW5pdF9uICh0YWJsZSwgbmV3ZnVuYywgc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHVuc2lnbmVkIGludCBhbGxvYzsKLQotICBhbGxvYyA9IHNpemUgKiBzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKTsKLQotICB0YWJsZS0+bWVtb3J5ID0gKFBUUikgb2JqYWxsb2NfY3JlYXRlICgpOwotICBpZiAodGFibGUtPm1lbW9yeSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgdGFibGUtPnRhYmxlID0gKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiopCi0JCSAgb2JqYWxsb2NfYWxsb2MgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgdGFibGUtPm1lbW9yeSwgYWxsb2MpKTsKLSAgaWYgKHRhYmxlLT50YWJsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbWVtc2V0ICgoUFRSKSB0YWJsZS0+dGFibGUsIDAsIGFsbG9jKTsKLSAgdGFibGUtPnNpemUgPSBzaXplOwotICB0YWJsZS0+bmV3ZnVuYyA9IG5ld2Z1bmM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBuZXcgaGFzaCB0YWJsZSB3aXRoIHRoZSBkZWZhdWx0IG51bWJlciBvZiBlbnRyaWVzLiAgKi8KLQotYm9vbGVhbgotYmZkX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBiZmRfaGFzaF90YWJsZV9pbml0X24gKHRhYmxlLCBuZXdmdW5jLCBERUZBVUxUX1NJWkUpOwotfQotCi0vKiBGcmVlIGEgaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWJmZF9oYXNoX3RhYmxlX2ZyZWUgKHRhYmxlKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotewotICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnkpOwotICB0YWJsZS0+bWVtb3J5ID0gTlVMTDsKLX0KLQotLyogTG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotYmZkX2hhc2hfbG9va3VwICh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjcmVhdGU7Ci0gICAgIGJvb2xlYW4gY29weTsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqczsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBoYXNoOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpoYXNocDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICAKLSAgaGFzaCA9IDA7Ci0gIGxlbiA9IDA7Ci0gIHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzdHJpbmc7Ci0gIHdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpCi0gICAgewotICAgICAgaGFzaCArPSBjICsgKGMgPDwgMTcpOwotICAgICAgaGFzaCBePSBoYXNoID4+IDI7Ci0gICAgICArK2xlbjsKLSAgICB9Ci0gIGhhc2ggKz0gbGVuICsgKGxlbiA8PCAxNyk7Ci0gIGhhc2ggXj0gaGFzaCA+PiAyOwotCi0gIGluZGV4ID0gaGFzaCAlIHRhYmxlLT5zaXplOwotICBmb3IgKGhhc2hwID0gdGFibGUtPnRhYmxlW2luZGV4XTsKLSAgICAgICBoYXNocCAhPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7Ci0gICAgICAgaGFzaHAgPSBoYXNocC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoaGFzaHAtPmhhc2ggPT0gaGFzaAotCSAgJiYgc3RyY21wIChoYXNocC0+c3RyaW5nLCBzdHJpbmcpID09IDApCi0JcmV0dXJuIGhhc2hwOwotICAgIH0KLQotICBpZiAoISBjcmVhdGUpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTDsKLQotICBoYXNocCA9ICgqdGFibGUtPm5ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwsIHRhYmxlLCBzdHJpbmcpOwotICBpZiAoaGFzaHAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7Ci0gIGlmIChjb3B5KQotICAgIHsKLSAgICAgIGNoYXIgKm5ldzsKLQotICAgICAgbmV3ID0gKGNoYXIgKikgb2JqYWxsb2NfYWxsb2MgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgdGFibGUtPm1lbW9yeSwKLQkJCQkgICAgIGxlbiArIDEpOwotICAgICAgaWYgKCFuZXcpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotCX0KLSAgICAgIHN0cmNweSAobmV3LCBzdHJpbmcpOwotICAgICAgc3RyaW5nID0gbmV3OwotICAgIH0KLSAgaGFzaHAtPnN0cmluZyA9IHN0cmluZzsKLSAgaGFzaHAtPmhhc2ggPSBoYXNoOwotICBoYXNocC0+bmV4dCA9IHRhYmxlLT50YWJsZVtpbmRleF07Ci0gIHRhYmxlLT50YWJsZVtpbmRleF0gPSBoYXNocDsKLQotICByZXR1cm4gaGFzaHA7Ci19Ci0KLS8qIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotdm9pZAotYmZkX2hhc2hfcmVwbGFjZSAodGFibGUsIG9sZCwgbncpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqb2xkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm53OwotewotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKnBwaDsKLQotICBpbmRleCA9IG9sZC0+aGFzaCAlIHRhYmxlLT5zaXplOwotICBmb3IgKHBwaCA9ICZ0YWJsZS0+dGFibGVbaW5kZXhdOwotICAgICAgICgqcHBoKSAhPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7Ci0gICAgICAgcHBoID0gJigqcHBoKS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKnBwaCA9PSBvbGQpCi0JewotCSAgKnBwaCA9IG53OwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIEJhc2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIG5ldyBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotYmZkX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZW50cnkgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVudHJ5ID0gKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikKLQkgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkpKSk7Ci0gIHJldHVybiBlbnRyeTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2UgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotUFRSCi1iZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemUpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBQVFIgcmV0OwotCi0gIHJldCA9IG9iamFsbG9jX2FsbG9jICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnksIHNpemUpOwotICBpZiAocmV0ID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1iZmRfaGFzaF90cmF2ZXJzZSAodGFibGUsIGZ1bmMsIGluZm8pCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJvb2xlYW4gKCpmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0gICAgIFBUUiBpbmZvOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnNpemU7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnA7Ci0KLSAgICAgIGZvciAocCA9IHRhYmxlLT50YWJsZVtpXTsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAoISAoKmZ1bmMpIChwLCBpbmZvKSkKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0MCi0vKiBBIGZldyBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0cyAoYS5vdXQsIENPRkYsIEVMRikgdXNlIGEgc3RyaW5nCi0gICB0YWJsZS4gIFRoZXNlIGZ1bmN0aW9ucyBzdXBwb3J0IGFkZGluZyBzdHJpbmdzIHRvIGEgc3RyaW5nIHRhYmxlLAotICAgcmV0dXJuaW5nIHRoZSBieXRlIG9mZnNldCwgYW5kIHdyaXRpbmcgb3V0IHRoZSB0YWJsZS4KLQotICAgUG9zc2libGUgaW1wcm92ZW1lbnRzOgotICAgKyBsb29rIGZvciBzdHJpbmdzIG1hdGNoaW5nIHRyYWlsaW5nIHN1YnN0cmluZ3Mgb2Ygb3RoZXIgc3RyaW5ncwotICAgKyBiZXR0ZXIgZGF0YSBzdHJ1Y3R1cmVzPyAgYmFsYW5jZWQgdHJlZXM/Ci0gICArIGxvb2sgYXQgcmVkdWNpbmcgbWVtb3J5IHVzZSBlbHNld2hlcmUgLS0gbWF5YmUgaWYgd2UgZGlkbid0IGhhdmUKLSAgICAgdG8gY29uc3RydWN0IHRoZSBlbnRpcmUgc3ltYm9sIHRhYmxlIGF0IG9uY2UsIHdlIGNvdWxkIGdldCBieQotICAgICB3aXRoIHNtYWxsZXIgYW1vdW50cyBvZiBWTT8gIChXaGF0IGVmZmVjdCBkb2VzIHRoYXQgaGF2ZSBvbiB0aGUKLSAgICAgc3RyaW5nIHRhYmxlIHJlZHVjdGlvbnM/KSAgKi8KLQotLyogQW4gZW50cnkgaW4gdGhlIHN0cnRhYiBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBJbmRleCBpbiBzdHJpbmcgdGFibGUuICAqLwotICBiZmRfc2l6ZV90eXBlIGluZGV4OwotICAvKiBOZXh0IHN0cmluZyBpbiBzdHJ0YWIuICAqLwotICBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKm5leHQ7Ci19OwotCi0vKiBUaGUgc3RydGFiIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLSAgLyogU2l6ZSBvZiBzdHJ0YWItLWFsc28gbmV4dCBhdmFpbGFibGUgaW5kZXguICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIEZpcnN0IHN0cmluZyBpbiBzdHJ0YWIuICAqLwotICBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKmZpcnN0OwotICAvKiBMYXN0IHN0cmluZyBpbiBzdHJ0YWIuICAqLwotICBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKmxhc3Q7Ci0gIC8qIFdoZXRoZXIgdG8gcHJlY2VkZSBzdHJpbmdzIHdpdGggYSB0d28gYnl0ZSBsZW5ndGgsIGFzIGluIHRoZQotICAgICBYQ09GRiAuZGVidWcgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4geGNvZmY7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdHJ0YWJfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGEgc3RydGFiLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdHJ0YWJfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5kZXggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0gICAgICByZXQtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gc3RydGFiLiAgKi8KLQotI2RlZmluZSBzdHJ0YWJfaGFzaF9sb29rdXAodCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHQpLT50YWJsZSwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBDcmVhdGUgYSBuZXcgc3RydGFiLiAgKi8KLQotc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqCi1fYmZkX3N0cmluZ3RhYl9pbml0ICgpCi17Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYmxlOwotCi0gIHRhYmxlID0gKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopCi0JICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoKSkpOwotICBpZiAodGFibGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnRhYmxlLCBzdHJ0YWJfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlICh0YWJsZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgdGFibGUtPnNpemUgPSAwOwotICB0YWJsZS0+Zmlyc3QgPSBOVUxMOwotICB0YWJsZS0+bGFzdCA9IE5VTEw7Ci0gIHRhYmxlLT54Y29mZiA9IGZhbHNlOwotCi0gIHJldHVybiB0YWJsZTsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IHN0cnRhYiBpbiB3aGljaCB0aGUgc3RyaW5ncyBhcmUgb3V0cHV0IGluIHRoZSBmb3JtYXQKLSAgIHVzZWQgaW4gdGhlIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uOiBhIHR3byBieXRlIGxlbmd0aCBwcmVjZWRlcyBlYWNoCi0gICBzdHJpbmcuICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoKLV9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgKCkKLXsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqcmV0OwotCi0gIHJldCA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICByZXQtPnhjb2ZmID0gdHJ1ZTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRnJlZSBhIHN0cnRhYi4gICovCi0KLXZvaWQKLV9iZmRfc3RyaW5ndGFiX2ZyZWUgKHRhYmxlKQotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWJsZTsKLXsKLSAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJnRhYmxlLT50YWJsZSk7Ci0gIGZyZWUgKHRhYmxlKTsKLX0KLQotLyogR2V0IHRoZSBpbmRleCBvZiBhIHN0cmluZyBpbiBhIHN0cnRhYiwgYWRkaW5nIGl0IGlmIGl0IGlzIG5vdAotICAgYWxyZWFkeSBwcmVzZW50LiAgSWYgSEFTSCBpcyBmYWxzZSwgd2UgZG9uJ3QgcmVhbGx5IHVzZSB0aGUgaGFzaAotICAgdGFibGUsIGFuZCB3ZSBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRlIHN0cmluZ3MuICAqLwotCi1iZmRfc2l6ZV90eXBlCi1fYmZkX3N0cmluZ3RhYl9hZGQgKHRhYiwgc3RyLCBoYXNoLCBjb3B5KQotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgYm9vbGVhbiBoYXNoOwotICAgICBib29sZWFuIGNvcHk7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqZW50cnk7Ci0KLSAgaWYgKGhhc2gpCi0gICAgewotICAgICAgZW50cnkgPSBzdHJ0YWJfaGFzaF9sb29rdXAgKHRhYiwgc3RyLCB0cnVlLCBjb3B5KTsKLSAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQotCXJldHVybiAoYmZkX3NpemVfdHlwZSkgLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZW50cnkgPSAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKQotCSAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJnRhYi0+dGFibGUsCi0JCQkJICBzaXplb2YgKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSkpKTsKLSAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQotCXJldHVybiAoYmZkX3NpemVfdHlwZSkgLTE7Ci0gICAgICBpZiAoISBjb3B5KQotCWVudHJ5LT5yb290LnN0cmluZyA9IHN0cjsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpuOwotCi0JICBuID0gKGNoYXIgKikgYmZkX2hhc2hfYWxsb2NhdGUgKCZ0YWItPnRhYmxlLCBzdHJsZW4gKHN0cikgKyAxKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JICBlbnRyeS0+cm9vdC5zdHJpbmcgPSBuOwotCX0KLSAgICAgIGVudHJ5LT5pbmRleCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICAgIGVudHJ5LT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGVudHJ5LT5pbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0gICAgewotICAgICAgZW50cnktPmluZGV4ID0gdGFiLT5zaXplOwotICAgICAgdGFiLT5zaXplICs9IHN0cmxlbiAoc3RyKSArIDE7Ci0gICAgICBpZiAodGFiLT54Y29mZikKLQl7Ci0JICBlbnRyeS0+aW5kZXggKz0gMjsKLQkgIHRhYi0+c2l6ZSArPSAyOwotCX0KLSAgICAgIGlmICh0YWItPmZpcnN0ID09IE5VTEwpCi0JdGFiLT5maXJzdCA9IGVudHJ5OwotICAgICAgZWxzZQotCXRhYi0+bGFzdC0+bmV4dCA9IGVudHJ5OwotICAgICAgdGFiLT5sYXN0ID0gZW50cnk7Ci0gICAgfQotCi0gIHJldHVybiBlbnRyeS0+aW5kZXg7Ci19Ci0KLS8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgc3RydGFiLiAgKi8KLQotYmZkX3NpemVfdHlwZQotX2JmZF9zdHJpbmd0YWJfc2l6ZSAodGFiKQotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci17Ci0gIHJldHVybiB0YWItPnNpemU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cnRhYi4gIEFCRkQgbXVzdCBhbHJlYWR5IGJlIGF0IHRoZSByaWdodCBsb2NhdGlvbiBpbgotICAgdGhlIGZpbGUuICAqLwotCi1ib29sZWFuCi1fYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCB0YWIpCi0gICAgIHJlZ2lzdGVyIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotewotICByZWdpc3RlciBib29sZWFuIHhjb2ZmOwotICByZWdpc3RlciBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKmVudHJ5OwotCi0gIHhjb2ZmID0gdGFiLT54Y29mZjsKLQotICBmb3IgKGVudHJ5ID0gdGFiLT5maXJzdDsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjb25zdCBjaGFyICpzdHI7Ci0gICAgICByZWdpc3RlciBzaXplX3QgbGVuOwotCi0gICAgICBzdHIgPSBlbnRyeS0+cm9vdC5zdHJpbmc7Ci0gICAgICBsZW4gPSBzdHJsZW4gKHN0cikgKyAxOwotCi0gICAgICBpZiAoeGNvZmYpCi0JewotCSAgYmZkX2J5dGUgYnVmWzJdOwotCi0JICAvKiBUaGUgb3V0cHV0IGxlbmd0aCBpbmNsdWRlcyB0aGUgbnVsbCBieXRlLiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIGxlbiwgYnVmKTsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZiwgMSwgMiwgYWJmZCkgIT0gMikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgc3RyLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3QtYW91dC5jIGIvYmZkL2hvc3QtYW91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTY0M2RjLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0LWFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBsb2NhbCBob3N0J3MgYS5vdXQgYmluYXJpZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgUHJvYmFibHkgSm9obiBHaWxtb3JlJ3MgZmF1bHQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lCUFSQ0hfU0laRQkzMgotCi0vKiBXaGVuIHBvcnRpbmcgdG8gYSBuZXcgc3lzdGVtLCB5b3UgbXVzdCBzdXBwbHk6Ci0KLQlIT1NUX1BBR0VfU0laRQkJKG9wdGlvbmFsKQotCUhPU1RfU0VHTUVOVF9TSVpFCShvcHRpb25hbCAtLSBkZWZhdWx0cyB0byBwYWdlIHNpemUpCi0JSE9TVF9NQUNISU5FX0FSQ0gJKG9wdGlvbmFsKQotCUhPU1RfTUFDSElORV9NQUNISU5FCShvcHRpb25hbCkKLQlIT1NUX1RFWFRfU1RBUlRfQUREUgkob3B0aW9uYWwpCi0JSE9TVF9TVEFDS19FTkRfQUREUgkobm90IHVzZWQsIGV4Y2VwdCBieSB0cmFkLWNvcmUgPz8/KQotCUhPU1RfQklHX0VORElBTl9QCShyZXF1aXJlZCAtLSBkZWZpbmUgaWYgYmlnLWVuZGlhbikKLQotICAgaW4gdGhlIC4vaG9zdHMvaC1zeXN0ZW1uYW1lLmggZmlsZS4gICovCi0KLSNpZmRlZiBUUkFEX0hFQURFUgotI2luY2x1ZGUgVFJBRF9IRUFERVIKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX1BBR0VfU0laRQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCUhPU1RfUEFHRV9TSVpFCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9TRUdNRU5UX1NJWkUKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCUhPU1RfU0VHTUVOVF9TSVpFCi0jZWxzZQotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfVEVYVF9TVEFSVF9BRERSCi0jZGVmaW5lCVRFWFRfU1RBUlRfQUREUglIT1NUX1RFWFRfU1RBUlRfQUREUgotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfU1RBQ0tfRU5EX0FERFIKLSNkZWZpbmUJU1RBQ0tfRU5EX0FERFIJSE9TVF9TVEFDS19FTkRfQUREUgotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfQklHX0VORElBTl9QCi0jZGVmaW5lCVRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNlbHNlCi0jdW5kZWYgIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNlbmRpZgotCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLSNpZmRlZiBIT1NUX01BQ0hJTkVfQVJDSAotI2lmZGVmIEhPU1RfTUFDSElORV9NQUNISU5FCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goYWJmZCwgZXhlY3ApIFwKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBIT1NUX01BQ0hJTkVfQVJDSCwgSE9TVF9NQUNISU5FX01BQ0hJTkUpCi0jZWxzZQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKGFiZmQsIGV4ZWNwKSBcCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgSE9TVF9NQUNISU5FX0FSQ0gsIDApCi0jZW5kaWYKLSNlbmRpZiAvKiBIT1NUX01BQ0hJTkVfQVJDSCAqLwotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaG9zdF9hb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQiCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2FscGhhbGludXguaCBiL2JmZC9ob3N0cy9hbHBoYWxpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YjhkNjkuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2FscGhhbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLyogTGludXggZHVtcHMgInN0cnVjdCB0YXNrX3N0cnVjdCIgYXQgdGhlIGVuZCBvZiB0aGUgY29yZS1maWxlLiAgVGhpcwotICAgc3RydWN0dXJlIGlzIGN1cnJlbnRseSAxMDgwIGJ5dGVzIGxvbmcsIGJ1dCB3ZSBhbGxvdyB1cCB0byA0MDk2Ci0gICBieXRlcyB0byBhbGxvdyBmb3Igc29tZSBmdXR1cmUgZ3Jvd3RoLiAgKi8KLSNkZWZpbmUgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRAkJNDA5NgotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGFiZmQpIFwKLSAgKChhYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUuc2lnbmFsKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2FscGhhdm1zLmggYi9iZmQvaG9zdHMvYWxwaGF2bXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlMzkxYS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvYWxwaGF2bXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qIGFscGhhdm1zLmggLS0gQkZEIGRlZmluaXRpb25zIGZvciBhbiBvcGVuVk1TIGhvc3QKLSAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpCi0gICBvZiBwcm9HSVMgU29mdHdhcmVlbnR3aWNrbHVuZywgQWFjaGVuLCBHZXJtYW55Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXhsaWIuaD4KLSNpbmNsdWRlIDx1bml4aW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLS8qIE1ha2UgdGhlIGJhc2ljIHR5cGVzIDY0LWJpdCBxdWFudGl0aWVzIG9uIHRoZSBob3N0LgotICAgQWxzbyBwcm92aWRlIHRoZSBzdXBwb3J0IG1hY3JvcyBCRkQgbmVlZHMuICAqLwotIyBpZmRlZiBfX0dOVUNfXwotIyAgZGVmaW5lCUJGRF9IT1NUXzY0X0JJVAlsb25nIGxvbmcKLSMgZWxzZQotIyAgZGVmaW5lCUJGRF9IT1NUXzY0X0JJVAlsb25nCi0jIGVuZGlmCi10eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVCB1aW50NjRfdHlwZTsKLXR5cGVkZWYgQkZEX0hPU1RfNjRfQklUIGludDY0X3R5cGU7Ci0KLSMgZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZiAocywgIiUwMTZseCIsIHgpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotIyBkZWZpbmUgZnByaW50Zl92bWEoZix4KSBmcHJpbnRmIChmLCAiJTAxNmx4IiwgeCkgLyogQkZEX0hPU1RfNjRfQklUICovCi0KLSMgZGVmaW5lIEJZVEVTX0lOX1BSSU5URl9JTlQgNAotCi0vKiBUaGVzZSBtdXN0IGhhdmUgdHlwZSB1bnNpZ25lZCBsb25nIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBhcwotICAgYXJndW1lbnRzIGluIHByaW50ZiBmdW5jdGlvbnMuICAqLwotIyBkZWZpbmUgdWludDY0X3R5cGVMT1coeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSAmIDB4ZmZmZmZmZmYpKSkgLyogQkZEX0hPU1RfNjRfQklUICovCi0jIGRlZmluZSB1aW50NjRfdHlwZUhJR0goeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSA+PiAzMikgJiAweGZmZmZmZmZmKSkgLyogQkZEX0hPU1RfNjRfQklUICovCi0KLSNlbmRpZiAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLQotI2luY2x1ZGUgImZvcGVuLXZtcy5oIgotCi0jZGVmaW5lIE5PX0ZDTlRMIDEKLQotI2lmbmRlZiBPX0FDQ01PREUKLSNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQotI2VuZGlmCi0KLWV4dGVybiBpbnQgZ2V0cGFnZXNpemUgUEFSQU1TICgodm9pZCkpOwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2RlY3N0YXRpb24uaCBiL2JmZC9ob3N0cy9kZWNzdGF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MGMxNDMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2RlY3N0YXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qIEhvcGVmdWxseSB0aGlzIHNob3VsZCBpbmNsdWRlIGVpdGhlciBtYWNoaW5lL3BhcmFtLmggKFVsdHJpeCkgb3IKLSAgIG1hY2hpbmUvbWFjaHBhcmFtLmggKE1hY2gpLCB3aGljaGV2ZXIgaXMgaXRzIG5hbWUgb24gdGhpcyBzeXN0ZW0uICAqLwotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLS8qICNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRyAtLSB3ZSB1c2UgSE9TVF9EQVRBX1NUQVJUX0FERFIgKi8KLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbWlwcwotLyogI2RlZmluZQlIT1NUX01BQ0hJTkVfTUFDSElORQkgKi8KLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkJVVNSVEVYVAotI2RlZmluZQlIT1NUX0RBVEFfU1RBUlRfQUREUgkJVVNSREFUQQotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCQlVU1JTVEFDSwotCi0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoY29yZV9iZmQpIFwKLSAgKChjb3JlX2JmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfYXJnWzBdKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2RlbHRhNjguaCBiL2JmZC9ob3N0cy9kZWx0YTY4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNmE2ZTYuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2RlbHRhNjguaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qIERlZmluaXRpb25zIGZvciBhIE1vdG9yb2xhIERlbHRhIDMzMDAgYm94IHJ1bm5pbmcgU3lzdGVtIFYgUjMuMC4KLSAgIENvbnRyaWJ1dGVkIGJ5IG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlLiAgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBEZWZpbml0aW9ucyB1c2VkIGJ5IHRyYWQtY29yZS5jLiAgKi8KLSNkZWZpbmUJTkJQRwkJCU5CUEMKLSNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF9kYXRvcmcKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF90eHRvcmcKLSNpZiAwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJMHg0MDAwMDAwMAotI2Vsc2UKLS8qIFVzZXIncyBzdGFjaywgY29waWVkIGZyb20gc3lzL3BhcmFtLmggICovCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKLSNlbmRpZgotI2RlZmluZQlVUEFHRVMJCQlVU0laRQotI2RlZmluZQlUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGFiZmQpIFwKLSAgYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hYm9ydApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2RweDIuaCBiL2JmZC9ob3N0cy9kcHgyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjM5NWYuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2RweDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGZvciBjb3JlIGZpbGVzLiAgQ29yZSBzZWN0aW9uIHNpemVzIGZvcgotICAgdGhlIERQWDIgYXJlIGluIGJ5dGVzLiAgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2RlZmluZSBOQlBHIDEKLSNkZWZpbmUgVVBBR0VTIChVU0laRSAqIE5CUFApCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSICh1LnVfZXhkYXRhLnV4X2RhdG9yZykKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAoVVNFUlNUQUNLKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2hwMzAwYnNkLmggYi9iZmQvaG9zdHMvaHAzMDBic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyODcxNy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaHAzMDBic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZmRlZiBCU0Q0XzQKLSNkZWZpbmUgTk9fQ09SRV9DT01NQU5ECi0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCS8qIERhdGEgc2VnIHN0YXJ0IGFkZHIgcm91bmRzIHRvIE5CUEcgKi8KLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbTY4awotLyogI2RlZmluZQlIT1NUX01BQ0hJTkVfTUFDSElORQkgKi8KLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkJMAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCQkweGZmZjAwMDAwCi0jZGVmaW5lCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4NmJzZC5oIGIvYmZkL2hvc3RzL2kzODZic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVlZTNkOC4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4NmJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogSW50ZWwgMzg2IHJ1bm5pbmcgYW55IEJTRCBVbml4ICovCi0KLSNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0KLS8qIFJlY2VudCB2ZXJzaW9ucyBvZiBGcmVlQlNEIGRvbid0IGRlZmluZSBOQlBHLiAgKi8KLSNpZm5kZWYgTkJQRwotI2lmZGVmIFBBR0VfU0laRQotI2RlZmluZSBOQlBHIFBBR0VfU0laRQotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQlVU1JURVhUCi0KLS8qIEpvbGl0eiBzdWdnZXN0ZWQgZGVmaW5pbmcgSE9TVF9TVEFDS19FTkRfQUREUiB0bwotICAgKHUudV9rcHJvYy5rcF9lcHJvYy5lX3ZtLnZtX21heHNhZGRyICsgTUFYU1NJWiksIHdoaWNoIHNob3VsZCB3b3JrIG9uCi0gICBib3RoIEJTREkgYW5kIDM4NkJTRCwgYnV0IHRoYXQgaXMgYmVsaWV2ZWQgbm90IHRvIHdvcmsgZm9yIEJTRCA0LjQuICAqLwotCi0jaWZkZWYgX19ic2RpX18KLS8qIFRoaXMgc2VlbXMgdG8gYmUgdGhlIHJpZ2h0IHRoaW5nIGZvciBCU0RJLiAgKi8KLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJVVNSU1RBQ0sKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgKChiZmRfdm1hKXUudV9rcHJvYy5rcF9lcHJvYy5lX3ZtLnZtX2RhZGRyKQotI2Vsc2UKLS8qIFRoaXMgc2VlbXMgdG8gYmUgdGhlIHJpZ2h0IHRoaW5nIGZvciAzODZCU0QgcmVsZWFzZSAwLjEuICAqLwotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCQkoVVNSU1RBQ0sgLSBNQVhTU0laKQotI2VuZGlmCi0KLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAotICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9zaWcpCi0jZGVmaW5lIHVfY29tbSB1X2twcm9jLmtwX3Byb2MucF9jb21tCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4NmxpbnV4LmggYi9iZmQvaG9zdHMvaTM4NmxpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTUxZjEuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2kzODZsaW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBMaW51eCB3cml0ZXMgdGhlIHRhc2sgc3RydWN0dXJlIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmUgZmlsZS4gIEN1cnJlbnRseSBpdAotICAgaXMgMjkxMiBieXRlcy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyBzaG91bGQgYmUgYSBwaWNraWVyIGNoZWNrLCBidXQKLSAgIHdlIHNob3VsZCBwcm9iYWJseSBub3QgYmUgdG9vIHBpY2t5ICh0aGUgc2l6ZSBvZiB0aGUgdGFzayBzdHJ1Y3R1cmUgbWlnaHQKLSAgIHZhcnksIGFuZCBpZiBpdCdzIG5vdCB0aGUgbGVuZ3RoIHdlIGV4cGVjdCBpdCB0byBiZSwgaXQgZG9lc24ndCBhZmZlY3QKLSAgIG91ciBhYmlsaXR5IHRvIHByb2Nlc3MgdGhlIGNvcmUgZmlsZSkuICBTbyBhbGxvdyAwLTQwOTYgZXh0cmEgYnl0ZXMgYXQKLSAgIHRoZSBlbmQuICAqLwotCi0jZGVmaW5lIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQgNDA5NgpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2kzODZtYWNoMy5oIGIvYmZkL2hvc3RzL2kzODZtYWNoMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2M2MWUzLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pMzg2bWFjaDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotLyogVGhpcyBpcyBhbiB1Z2x5IHdheSB0byBoYWNrIGFyb3VuZCB0aGUgaW5jb3JyZWN0Ci0gKiBkZWZpbml0aW9uIG9mIFVQQUdFUyBpbiBpMzg2L21hY2hwYXJhbS5oLgotICoKLSAqIFRoZSBkZWZpbml0aW9uIHNob3VsZCBzcGVjaWZ5IHRoZSBzaXplIHJlc2VydmVkCi0gKiBmb3IgInN0cnVjdCB1c2VyIiBpbiBjb3JlIGZpbGVzIGluIFBBR0VTLAotICogYnV0IGluc3RlYWQgaXQgZ2l2ZXMgaXQgaW4gNTEyLWJ5dGUgY29yZS1jbGlja3MKLSAqIGZvciBpMzg2IGFuZCBpODYwLiBVUEFHRVMgaXMgdXNlZCBvbmx5IGluIHRyYWQtY29yZS5jLgotICovCi0jaWYgVVBBR0VTID09IDE2Ci0jdW5kZWYgIFVQQUdFUwotI2RlZmluZSBVUEFHRVMgMgotI2VuZGlmCi0KLSNpZiBVUEFHRVMgIT0gMgotRklYTUUhISBVUEFHRVMgaXMgbmVpdGhlciAyIG5vciAxNgotI2VuZGlmCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEKLSNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2kzODZzY28uaCBiL2JmZC9ob3N0cy9pMzg2c2NvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODYwOGMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2kzODZzY28uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qIENvcmUgZmlsZSBzdHVmZi4gIEF0IGxlYXN0IHNvbWUsIHBlcmhhcHMgYWxsLCBvZiB0aGUgZm9sbG93aW5nCi0gICBkZWZpbmVzIHdvcmsgb24gbWFueSBtb3JlIHN5c3RlbXMgdGhhbiBqdXN0IFNDTy4gICovCi0KLSNkZWZpbmUgTkJQRyBOQlBDCi0jZGVmaW5lIFVQQUdFUyBVU0laRQotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiB1LnVfZXhkYXRhLnV4X2RhdG9yZwotI2RlZmluZSBIT1NUX1NUQUNLX1NUQVJUX0FERFIgdS51X3N1YgotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGFiZmQpIFwKLSAgKChjb3JlX3VwYWdlKGFiZmQpLT51X3N5c2Fib3J0ICE9IDApIFwKLSAgID8gY29yZV91cGFnZShhYmZkKS0+dV9zeXNhYm9ydCBcCi0gICA6IC0xKQotCi0vKiBBY2NvcmRpbmcgdG8gdGhlIG1hbnBhZ2UsIGEgdmVyc2lvbiAyIFNDTyBjb3JlZmlsZSBjYW4gY29udGFpbgotICAgdmFyaW91cyBhZGRpdGlvbmFsIHNlY3Rpb25zIChpdCBpcyBjbGV2ZXJseSBhcnJhbmdlZCBzbyB0aGUgdSBhcmVhLAotICAgZGF0YSwgYW5kIHN0YWNrIGFyZSBmaXJzdCB3aGVyZSB3ZSBjYW4gZmluZCB0aGVtKS4gIFNvIHdpdGhvdXQKLSAgIHdyaXRpbmcgbG90cyBvZiBjb2RlIHRvIHBhcnNlIGFsbCB0aGVpciBoZWFkZXJzIGFuZCBzdHVmZiwgd2UgY2FuJ3QKLSAgIGtub3cgd2hldGhlciBhIGNvcmVmaWxlIGlzIGJpZ2dlciB0aGFuIGl0IHNob3VsZCBiZS4gICovCi0KLSNkZWZpbmUgVFJBRF9DT1JFX0FMTE9XX0FOWV9FWFRSQV9TSVpFIDEKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pODYwbWFjaDMuaCBiL2JmZC9ob3N0cy9pODYwbWFjaDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkMmFhMS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTg2MG1hY2gzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBUaGlzIGZpbGUgd2FzIGhhY2tlZCBmcm9tIGkzODZtYWNoMy5oICAgW2RvbGFuQHNzZC5pbnRlbC5jb21dICovCi0KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotLyogVGhpcyBpcyBhbiB1Z2x5IHdheSB0byBoYWNrIGFyb3VuZCB0aGUgaW5jb3JyZWN0Ci0gKiBkZWZpbml0aW9uIG9mIFVQQUdFUyBpbiBpMzg2L21hY2hwYXJhbS5oLgotICoKLSAqIFRoZSBkZWZpbml0aW9uIHNob3VsZCBzcGVjaWZ5IHRoZSBzaXplIHJlc2VydmVkCi0gKiBmb3IgInN0cnVjdCB1c2VyIiBpbiBjb3JlIGZpbGVzIGluIFBBR0VTLAotICogYnV0IGluc3RlYWQgaXQgZ2l2ZXMgaXQgaW4gNTEyLWJ5dGUgY29yZS1jbGlja3MKLSAqIGZvciBpMzg2IGFuZCBpODYwLiBVUEFHRVMgaXMgdXNlZCBvbmx5IGluIHRyYWQtY29yZS5jLgotICovCi0jaWYgVVBBR0VTID09IDE2Ci0jdW5kZWYgIFVQQUdFUwotI2RlZmluZSBVUEFHRVMgMgotI2VuZGlmCi0KLSNpZiBVUEFHRVMgIT0gMgotRklYTUUhISBVUEFHRVMgaXMgbmVpdGhlciAyIG5vciAxNgotI2VuZGlmCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEKLSNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9pODYwCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL202OGthdXguaCBiL2JmZC9ob3N0cy9tNjhrYXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzc3NTUuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL202OGthdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qIERlZmluaXRpb25zIGZvciBhbiBBcHBsZSBNYWNpbnRvc2ggcnVubmluZyBBL1VYIDMueC4gKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYWdlLmg+Ci0KLS8qIERlZmluaXRpb25zIHVzZWQgYnkgdHJhZC1jb3JlLmMuICAqLwotI2RlZmluZQlOQlBHCQkJTkJQUAotCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCXUudV9leGRhdGEudXhfZGF0b3JnCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCXUudV9leGRhdGEudXhfdHh0b3JnCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJMHgxMDAwMDAwMDAKLQotI2RlZmluZQlVUEFHRVMJCQlVU0laRQotCi0jZGVmaW5lCVRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbTY4a2xpbnV4LmggYi9iZmQvaG9zdHMvbTY4a2xpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjdkZmEuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL202OGtsaW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0vKiBMaW51eCBkdW1wcyAic3RydWN0IHRhc2tfc3RydWN0IiBhdCB0aGUgZW5kIG9mIHRoZSBjb3JlLWZpbGUuICBUaGlzCi0gICBzdHJ1Y3R1cmUgaXMgY3VycmVudGx5IDI1MTIgYnl0ZXMgbG9uZywgYnV0IHdlIGFsbG93IHVwIHRvIDQwOTYKLSAgIGJ5dGVzIHRvIGFsbG93IGZvciBzb21lIGZ1dHVyZSBncm93dGguICAqLwotI2RlZmluZSBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECQk0MDk2Ci0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoKGFiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS5zaWduYWwpCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbTg4a21hY2gzLmggYi9iZmQvaG9zdHMvbTg4a21hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTU1MzguLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL204OGttYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jdW5kZWYgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAzCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLSNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9tODhrCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL21pcHNic2QuaCBiL2JmZC9ob3N0cy9taXBzYnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZmFkMjEuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL21pcHNic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jdW5kZWYgQUxJR04KLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotLyogI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHIC0tIHdlIHVzZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9taXBzCi0vKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLwotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQlVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCVVTUlNUQUNLCi0jZGVmaW5lIE5PX0NPUkVfQ09NTUFORApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL21pcHNtYWNoMy5oIGIvYmZkL2hvc3RzL21pcHNtYWNoMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWM0NjhkLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9taXBzbWFjaDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL21hY2hwYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0vKiAjZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcgICovCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX21pcHMKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX0RBVEFfU1RBUlRfQUREUglVU1JEQVRBCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9uZXdzLW1pcHMuaCBiL2JmZC9ob3N0cy9uZXdzLW1pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3OTliZS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbmV3cy1taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKiBTb255IE5ld3MgcnVubmluZyBOZXdzT1MgMy4yLiAgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotCi0jZGVmaW5lIEhPU1RfUEFHRV9TSVpFIE5CUEcKLQotI2RlZmluZSBIT1NUX01BQ0hJTkVfQVJDSCBiZmRfYXJjaF9taXBzCi0KLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgVVNSVEVYVAotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiBVU1JEQVRBCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9uZXdzLmggYi9iZmQvaG9zdHMvbmV3cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjc5NDZjLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9uZXdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8qIFNvbnkgTmV3cyBydW5uaW5nIE5ld3NPUyAzLjIuICAqLwotCi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0KLSNkZWZpbmUgSE9TVF9QQUdFX1NJWkUgTkJQRwotI2RlZmluZSBIT1NUX1NFR01FTlRfU0laRSBOQlBHCi0jZGVmaW5lIEhPU1RfTUFDSElORV9BUkNIIGJmZF9hcmNoX202OGsKLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIChLRVJOQkFTRSAtIChVUEFHRVMgKiBOQlBHKSkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9wYzUzMm1hY2guaCBiL2JmZC9ob3N0cy9wYzUzMm1hY2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5NmY1OS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvcGM1MzJtYWNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIFRoaXMgaXMgYW4gdWdseSB3YXkgdG8gaGFjayBhcm91bmQgdGhlIGluY29ycmVjdAotICogZGVmaW5pdGlvbiBvZiBVUEFHRVMgaW4gbnM1MzIvbWFjaHBhcmFtLmguCi0gKgotICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKLSAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCi0gKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcwotICogZm9yIG5zNTMyLCBpMzg2IGFuZCBpODYwLiBVUEFHRVMgaXMgdXNlZCBvbmx5IGluIHRyYWQtY29yZS5jLgotICovCi0jaWYgVVBBR0VTID09IDE2Ci0jdW5kZWYgIFVQQUdFUwotI2RlZmluZSBVUEFHRVMgMgotI2VuZGlmCi0KLSNpZiBVUEFHRVMgIT0gMgotI2Vycm9yIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2Ci0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3Jpc2Nvcy5oIGIvYmZkL2hvc3RzL3Jpc2Nvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZhODI2Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9yaXNjb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qIFJJU0Mvb3MgNC41MkMsIGFuZCBwcmVzdW1hYmx5IG90aGVyIHZlcnNpb25zLiAgKi8KLQotI2luY2x1ZGUgPGJzZDQzL21hY2hpbmUvbWFjaHBhcmFtLmg+Ci0jaW5jbHVkZSA8YnNkNDMvbWFjaGluZS92bXBhcmFtLmg+Ci0KLSNkZWZpbmUgTkJQRyBCU0Q0M19OQlBHCi0jZGVmaW5lIFVQQUdFUyBCU0Q0M19VUEFHRVMKLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgQlNENDNfVVNSVEVYVAotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiBCU0Q0M19VU1JEQVRBCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgQlNENDNfVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9zeW1tZXRyeS5oIGIvYmZkL2hvc3RzL3N5bW1ldHJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzE3YjMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3N5bW1ldHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiBTeW1tZXRyeSBydW5uaW5nIGVpdGhlciBkeW5peCAzLjEgKGJzZCkgb3IgcHR4IChzeXN2KS4gICovCi0KLSNkZWZpbmUgTkJQRyA0MDk2Ci0jZGVmaW5lIFVQQUdFUyAxCi0KLSNpZmRlZiBfU0VRVUVOVF8KLS8qIHB0eCAqLwotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgMHgzZmZmZTAwMAotI2RlZmluZSBUUkFEX0NPUkVfVVNFUl9PRkZTRVQgKChVUEFHRVMgKiBOQlBHKSAtIHNpemVvZiAoc3RydWN0IHVzZXIpKQotI2Vsc2UKLS8qIGR5bml4ICovCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIDB4MTAwMAotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAoTkJQRyAqIHUudV90c2l6ZSkKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAweDNmZmZmMDAwCi0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoY29yZV9iZmQpIFwKLSAgKChjb3JlX2JmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfYXJnWzBdKQotI2VuZGlmCi0KLSNkZWZpbmUgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdGFob2UuaCBiL2JmZC9ob3N0cy90YWhvZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTZjZWUyLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy90YWhvZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI2RlZmluZQlOT19DT1JFX0NPTU1BTkQKLQotI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KLSNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+Ci0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX3RhaG9lCi0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJMAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCShLRVJOQkFTRSAtIChVUEFHRVMgKiBOQlBHKSkKLSNkZWZpbmUJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy92YXhic2QuaCBiL2JmZC9ob3N0cy92YXhic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViOWNjZS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvdmF4YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jZGVmaW5lCU5PX0NPUkVfQ09NTUFORAkJLyogTm8gY29tbWFuZCBuYW1lIGluIGNvcmUgZmlsZSAqLwotCi0jaWYgMAotI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KLS8qIERvZXMgbm90IGV4aXN0IG9uIEJTRCA0LjMsIGl0IHVzZXMgbWFjaGluZS9tYWNocGFyYW0uaC4KLSAgIFdoYXRldmVyIGl0IGlzLCBpdCdzIGluY2x1ZGVkIGJ5IDxzeXMvcGFyYW0uaD4sIHdoaWNoIHRyYWQtY29yZS5jLAotICAgdGhlIG9ubHkgcGxhY2UgdGhhdCB1c2VzIHRoaXMgKEkgdGhpbmspLCBhbHJlYWR5IGluY2x1ZGVzLiAgKi8KLSNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+Ci0jZW5kaWYKLSN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCi0KLS8qIE5vdGUgdGhhdCBIT1NUX1BBR0VfU0laRSAtLSB0aGUgcGFnZSBzaXplIGFzIGZhciBhcyBleGVjdXRhYmxlIGZpbGVzCi0gICBhcmUgY29uY2VybmVkIC0tIGlzIG5vdCB0aGUgc2FtZSBhcyBOQlBHLCBiZWNhdXNlIG9mIHBhZ2UgY2x1c3RlcmluZy4gICovCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxMDI0Ci0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX3ZheAotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCTAKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkoMHg4MDAwMDAwMCAtIChVUEFHRVMgKiBOQlBHKSkKLSN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheHVsdC5oIGIvYmZkL2hvc3RzL3ZheHVsdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzczMWI3Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy92YXh1bHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCShOQlBHKkNMU0laRSkKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdmF4Ci0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCi0jdW5kZWYJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy92YXh1bHQyLmggYi9iZmQvaG9zdHMvdmF4dWx0Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzczMWI3Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy92YXh1bHQyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkoTkJQRypDTFNJWkUpCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX3ZheAotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwotI3VuZGVmCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaHAzMDBic2QuYyBiL2JmZC9ocDMwMGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY3YjE4Li4wMDAwMDAwCi0tLSBhL2JmZC9ocDMwMGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUCA5MDAwLzMwMCAoNjgwMDAtYmFzZWQpIG1hY2hpbmVzIHJ1bm5pbmcgQlNEIFVuaXguCi0gICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVSTwotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCAvKiBBdm9pZHMgd2FybmluZyAqLwotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX202OGsKLQotI2RlZmluZSBNWShPUCkgQ0FUKGhwMzAwYnNkXyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaHAzMDBic2QiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2hwMzAwaHB1eC5jIGIvYmZkL2hwMzAwaHB1eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJmZWEwLi4wMDAwMDAwCi0tLSBhL2JmZC9ocDMwMGhwdXguYworKysgL2Rldi9udWxsCkBAIC0xLDg2NyArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgaHAtdXggOTAwMC8zMDAKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDk0LCA5NSwgOTcsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBHbGVubiBFbmdlbC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCi0gICAgaHB1eCBuYXRpdmUgIC0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhwMzAwaHB1eCBiZmQgfCAtLS0tLS0tLS0tPiBocHV4IHcvZ251IGV4dAotICAgIGhwdXggdy9nbnUgZXh0ZW5zaW9uIC0tLS0+IHwgICAgICAgICAgICAgICB8Ci0KLQotICAgIFN1cHBvcnQgZm9yIHRoZSA5MDAwL1szNF0wMCBoYXMgc2V2ZXJhbCBsaW1pdGF0aW9ucy4KLSAgICAgIDEuIFNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAyLiBUaGUgb3V0cHV0IGZvcm1hdCBmcm9tIHRoaXMgYmZkIGlzIG5vdCB1c2FibGUgYnkgbmF0aXZlIHRvb2xzLgotCi0gICAgVGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3Igd3JpdGluZyB0aGlzIGJmZCB3YXMgdG8gYWxsb3cgdXNlIG9mCi0gICAgZ2RiIGFuZCBnY2MgZm9yIGhvc3QgYmFzZWQgZGVidWdnaW5nIGFuZCBub3QgdG8gbWltaWMgdGhlIGhwLXV4IHRvb2xzCi0gICAgaW4gZXZlcnkgZGV0YWlsLiAgVGhpcyBsZWFkcyB0byBhIHNpZ25pZmljYW50IHNpbXBsaWZpY2F0aW9uIG9mIHRoZQotICAgIGNvZGUgYW5kIGEgbGVhcCBpbiBwZXJmb3JtYW5jZS4gIFRoZSBkZWNpc2lvbiB0byBub3Qgb3V0cHV0IGhwIG5hdGl2ZQotICAgIGNvbXBhdGlibGUgb2JqZWN0cyB3YXMgZnVydGhlciBzdHJlbmd0aGVuZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcmljaG5lc3MKLSAgICBvZiB0aGUgZ2NjIGNvbXBpbGVkIG9iamVjdHMgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgbG9zcyBvZgotICAgIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHdoaWxlIHRoZSBocCBmb3JtYXQgc3VwcG9ydHMgdGhlIGNvbmNlcHQgb2YKLSAgICBzZWNvbmRhcnkgc3ltYm9scywgaXQgZG9lcyBub3Qgc3VwcG9ydCBpbmRpcmVjdCBzeW1ib2xzLiAgQW5vdGhlcgotICAgIHJlYXNvbiBpcyB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGltcGxlbWVudGF0aW9ucwotICAgIG9mIGdjYyBvbiBocHV4IHdoaWNoIHVzZWQgJ2hweHQnIHRvIHRyYW5zbGF0ZSAuYSBhbmQgLm8gZmlsZXMgaW50byBhCi0gICAgZm9ybWF0IHdoaWNoIGNvdWxkIGJlIHJlYWRpbHkgdW5kZXJzdG9vZCBieSB0aGUgZ251IGxpbmtlciBhbmQgZ2RiLgotICAgIFRoaXMgYWxsb3dzIHJlYWRpbmcgaHAgc2Vjb25kYXJ5IHN5bWJvbHMgYW5kIGNvbnZlcnRpbmcgdGhlbSBpbnRvCi0gICAgaW5kaXJlY3Qgc3ltYm9scyBidXQgdGhlIHJldmVyc2UgaXQgbm90IGFsd2F5cyBwb3NzaWJsZS4KLQotICAgIEFub3RoZXIgZXhhbXBsZSBvZiBkaWZmZXJlbmNlcyBpcyB0aGF0IHRoZSBocCBmb3JtYXQgc3RvcmVzIHN5bWJvbCBvZmZzZXRzCi0gICAgaW4gdGhlIG9iamVjdCBjb2RlIHdoaWxlIHRoZSBnbnUgdXRpbGl0aWVzIHVzZSBhIGZpZWxkIGluIHRoZQotICAgIHJlbG9jYXRpb24gcmVjb3JkIGZvciB0aGlzLiAgVG8gc3VwcG9ydCB0aGUgaHAgbmF0aXZlIGZvcm1hdCwgdGhlIG9iamVjdAotICAgIGNvZGUgd291bGQgbmVlZCB0byBiZSBwYXRjaGVkIHdpdGggdGhlIG9mZnNldHMgd2hlbiBwcm9kdWNpbmcgLm8gZmlsZXMuCi0KLSAgICBUaGUgYmFzaWMgdGVjaG5pcXVlIHRha2VuIGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gI2luY2x1ZGUgdGhlIGNvZGUKLSAgICBmcm9tIGFvdXR4LmggYW5kIGFvdXQtdGFyZ2V0Lmggd2l0aCBhcHByb3ByaWF0ZSAjZGVmaW5lcyB0byBvdmVycmlkZQotICAgIGNvZGUgd2hlcmUgYSB1bmlxdWUgaW1wbGVtZW50YXRpb24gaXMgbmVlZGVkOgotCi0gICAgewotICAgICAgICAjZGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYKLSAgICAgICAgI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLSAgICAgICAgaW1wbGVtZW50IGEgYnVuY2ggb2YgZnVuY3Rpb25zCi0KLSAgICAgICAgI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0gICAgfQotCi0gICAgVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAotICAgIG9mIGhhdmluZyBhbiBhcnJheSBvZiBubGlzdCBpdGVtcyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncywgaHAncyBmb3JtYXQKLSAgICBoYXMgdGhlbSBtaXhlZCB0b2dldGhlciBpbiBvbmUgc3RydWN0dXJlLiAgSW4gYWRkaXRpb24sIHRoZSBzdHJpbmdzIGFyZQotICAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICAgbmxpc3QgZWxlbWVudCAxCi0gICAgc3RyaW5nMQotICAgIG5saXN0IGVsZW1lbnQgMgotICAgIHN0cmluZzIKLSAgICAuLi4KLQotICAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAotICAgIGFuZCBjb252ZXJ0IGl0IHRvIGNhbm9uaWNhbCBmb3JtLiAgQXMgd2UgbWFyY2ggdGhydSB0aGUgdGFibGUsIHdlIGNvcHkKLSAgICB0aGUgbmxpc3QgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBmb3JtIGFuZCB3ZSBjb21wYWN0IHRoZSBzdHJpbmdzIGFuZCBudWxsCi0gICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgotCi0gICAgc3RyaW5nMQotICAgIG51bGwKLSAgICBzdHJpbmcyCi0gICAgbnVsbAotICovCi0KLS8qIEBAIElzIHRoaXMgcmVhbGx5IHNvIGRpZmZlcmVudCBmcm9tIG5vcm1hbCBhLm91dCB0aGF0IGl0IG5lZWRzIHRvIGluY2x1ZGUKLSAgIGFvdXR4Lmg/ICBXZSBzaG91bGQgZ28gdGhyb3VnaCB0aGlzIGZpbGUgc29tZXRpbWUgYW5kIHNlZSB3aGF0IGNhbiBiZSBtYWRlCi0gICBtb3JlIGRlcGVuZGVudCBvbiBhb3V0MzIubyBhbmQgd2hhdCBtaWdodCBuZWVkIHRvIGJlIGJyb2tlbiBvZmYgYW5kIGFjY2Vzc2VkCi0gICB0aHJvdWdoIHRoZSBiYWNrZW5kX2RhdGEgZmllbGQuICBPciwgbWF5YmUgd2UgcmVhbGx5IGRvIG5lZWQgc3VjaCBhCi0gICBjb21wbGV0ZWx5IHNlcGFyYXRlIGltcGxlbWVudGF0aW9uLiAgSSBkb24ndCBoYXZlIHRpbWUgdG8gaW52ZXN0aWdhdGUgdGhpcwotICAgbXVjaCBmdXJ0aGVyIHJpZ2h0IG5vdy4gIFtyYWVidXJuOjE5OTMwNDI4LjIxMjRFU1RdICovCi0vKiBAQCBBbHNvLCBub3RlIHRoYXQgdGhlcmUgd2luZCB1cCBiZWluZyB0d28gdmVyc2lvbnMgb2Ygc29tZSByb3V0aW5lcywgd2l0aAotICAgZGlmZmVyZW50IG5hbWVzLCBvbmx5IG9uZSBvZiB3aGljaCBhY3R1YWxseSBnZXRzIHVzZWQuICBGb3IgZXhhbXBsZToKLQlzbHVycF9zeW1ib2xfdGFibGUKLQlzd2FwX3N0ZF9yZWxvY19pbgotCXNsdXJwX3JlbG9jX3RhYmxlCi0JZ2V0X3N5bXRhYgotCWdldF9zeW10YWJfdXBwZXJfYm91bmQKLQljYW5vbmljYWxpemVfcmVsb2MKLQlta29iamVjdAotICAgVGhpcyBzaG91bGQgYWxzbyBiZSBmaXhlZC4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaHAzMDBocHV4IgotI2RlZmluZSBNWShPUCkgQ0FUKGhwMzAwaHB1eF8sT1ApCi0KLSNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBocDMwMGhwdXhfZXhlY19ieXRlcwotI2RlZmluZSBleHRlcm5hbF9ubGlzdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKLQotI2luY2x1ZGUgImFvdXQvaHAzMDBocHV4LmgiCi0KLS8qIGRlZmluZSB0aGVzZSBzbyB3ZSBjYW4gY29tcGlsZSB1bnVzZWQgcm91dGluZXMgaW4gYW91dHguaCAqLwotI2RlZmluZSBlX3N0cnggIGVfc2hsaWIKLSNkZWZpbmUgZV9vdGhlciBlX2xlbmd0aAotI2RlZmluZSBlX2Rlc2MgIGVfYWxtb2QKLQotI2RlZmluZSBBUl9QQURfQ0hBUiAnLycKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBwcm92aWRlIG92ZXJyaWRlcyBmb3Igcm91dGluZXMgaW4gdGhpcyBmaWxlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0aGVzZSBkb24ndCB1c2UgTVkgYmVjYXVzZSB0aGF0IGNhdXNlcyBwcm9ibGVtcyB3aXRoaW4gSlVNUF9UQUJMRQotICAgKENBVCB3aW5kcyB1cCBiZWluZyBleHBhbmRlZCByZWN1cnNpdmVseSwgd2hpY2ggQU5TSSBDIGNvbXBpbGVycwotICAgd2lsbCBub3QgZG8pLiAgKi8KLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBocDMwMGhwdXhfZ2V0X3N5bXRhYgotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGhwMzAwaHB1eF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBocDMwMGhwdXhfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBocDMwMGhwdXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0vKiBVbnRpbCBhbmQgdW5sZXNzIHdlIGNvbnZlcnQgdGhlIHNsdXJwX3JlbG9jIGFuZCBzbHVycF9zeW10YWIKLSAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSwgd2UgY2FuIG5vdCB1c2UgdGhlIGRlZmF1bHQgYW91dAotICAgZnJlZV9jYWNoZWRfaW5mbyByb3V0aW5lIHdoaWNoIGFzc3VtZXMgdGhhdCB0aGUgcmVsb2NzIGFuZCBzeW10YWJzCi0gICB3ZXJlIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MuICAqLwotI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotCi0jZGVmaW5lIGhwMzAwaHB1eF93cml0ZV9zeW1zIGFvdXRfMzJfd3JpdGVfc3ltcwotCi0jZGVmaW5lIE1ZX2NhbGxiYWNrIE1ZKGNhbGxiYWNrKQotCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDB4MgotCi0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGhwMzAwaHB1eF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKLQotI2RlZmluZSBIUF9TWU1UWVBFX1VOREVGSU5FRAkweDAwCi0jZGVmaW5lIEhQX1NZTVRZUEVfQUJTT0xVVEUJMHgwMQotI2RlZmluZSBIUF9TWU1UWVBFX1RFWFQJCTB4MDIKLSNkZWZpbmUgSFBfU1lNVFlQRV9EQVRBCQkweDAzCi0jZGVmaW5lIEhQX1NZTVRZUEVfQlNTCQkweDA0Ci0jZGVmaW5lIEhQX1NZTVRZUEVfQ09NTU9OCTB4MDUKLQotI2RlZmluZSBIUF9TWU1UWVBFX1RZUEUJCTB4MEYKLSNkZWZpbmUgSFBfU1lNVFlQRV9GSUxFTkFNRQkweDFGCi0KLSNkZWZpbmUgSFBfU1lNVFlQRV9BTElHTgkweDEwCi0jZGVmaW5lIEhQX1NZTVRZUEVfRVhURVJOQUwJMHgyMAotI2RlZmluZSBIUF9TRUNPTkRBUllfU1lNQk9MICAgICAweDQwCi0KLS8qIFJFTE9DQVRJT04gREVGSU5JVElPTlMgKi8KLSNkZWZpbmUgSFBfUlNFR01FTlRfVEVYVAkweDAwCi0jZGVmaW5lIEhQX1JTRUdNRU5UX0RBVEEJMHgwMQotI2RlZmluZSBIUF9SU0VHTUVOVF9CU1MJCTB4MDIKLSNkZWZpbmUgSFBfUlNFR01FTlRfRVhURVJOQUwJMHgwMwotI2RlZmluZSBIUF9SU0VHTUVOVF9QQ1JFTCAgICAgICAweDA0Ci0jZGVmaW5lIEhQX1JTRUdNRU5UX1JETFQgICAgICAgIDB4MDUKLSNkZWZpbmUgSFBfUlNFR01FTlRfUlBMVCAgICAgICAgMHgwNgotI2RlZmluZSBIUF9SU0VHTUVOVF9OT09QCTB4M0YKLQotI2RlZmluZSBIUF9STEVOR1RIX0JZVEUJCTB4MDAKLSNkZWZpbmUgSFBfUkxFTkdUSF9XT1JECQkweDAxCi0jZGVmaW5lIEhQX1JMRU5HVEhfTE9ORwkJMHgwMgotI2RlZmluZSBIUF9STEVOR1RIX0FMSUdOCTB4MDMKLQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhocDMwMGhwdXgsXzMyXyx5KQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2RlZmluZSBCTUFHSUMgSFBVWF9ET1RfT19NQUdJQwotI2RlZmluZSBRTUFHSUMgMDMxNAotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotLyogU2luY2UgdGhlIGhwdXggc3ltYm9sIHRhYmxlIGhhcyBubGlzdCBlbGVtZW50cyBpbnRlcnNwZXJzZWQgd2l0aAotICAgc3RyaW5ncyBhbmQgd2UgbmVlZCB0byBpbnNlcnQgc29tIHN0cmluZ3MgZm9yIHNlY29uZGFyeSBzeW1ib2xzLCB3ZQotICAgZ2l2ZSBvdXJzZWx2ZXMgYSBsaXR0bGUgZXh0cmEgcGFkZGluZyB1cCBmcm9udCB0byBhY2NvdW50IGZvcgotICAgdGhpcy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBub24tc2Vjb25kYXJ5IHN5bWJvbCB3ZSBwcm9jZXNzLCB3ZSBnYWluCi0gICA5IGJ5dGVzIG9mIHNwYWNlIGZvciB0aGUgZGlzY2FyZGVkIG5saXN0IGVsZW1lbnQgKG9uZSBieXRlIHVzZWQgZm9yCi0gICBudWxsKS4gIFNZTV9FWFRSQV9CWVRFUyBpcyB0aGUgZXh0cmEgc3BhY2UuICAqLwotI2RlZmluZSBTWU1fRVhUUkFfQllURVMgICAxMDI0Ci0KLS8qIFNldCBwYXJhbWV0ZXJzIGFib3V0IHRoaXMgYS5vdXQgZmlsZSB0aGF0IGFyZSBtYWNoaW5lLWRlcGVuZGVudC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBzb21lX2FvdXRfb2JqZWN0X3AganVzdCBiZWZvcmUgaXQgcmV0dXJucy4gICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWSAoY2FsbGJhY2spIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7Ci0jZWxzZQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLQotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHsKLSAgICAgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fR05VX1RSRUxPRkYgKCpleGVjcCk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9HTlVfRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAgICAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICAgICAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fR05VX1NZTU9GRiAoKmV4ZWNwKTsKLSAgICAgIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAob2JqX3N5bV9maWxlcG9zIChhYmZkKSArIGV4ZWNwLT5hX3N5bXMpOwotCi0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOwotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gMTI7Ci0gICAgICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gMTI7Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWSAod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCi0gIGZpbGVfcHRyIHRleHRfZW5kOwotCi0gIG1lbXNldCAoJmV4ZWNfYnl0ZXMsIDAsIHNpemVvZiAoZXhlY19ieXRlcykpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIGlmIChhZGF0YSAoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQotICAgIE5BTUUgKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsKLSAgZXhlY3AtPmFfc3ltcyA9IDA7Ci0KLSAgZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIGV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotCQkgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotCQkgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0KLSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgMHhjKTsKLSAgTl9TRVRfRkxBR1MgKCpleGVjcCwgYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5leGVjX2hkcl9mbGFncyk7Ci0KLSAgTkFNRSAoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7Ci0KLSAgLyogdXBkYXRlIGZpZWxkcyBub3QgY292ZXJlZCBieSBkZWZhdWx0IHN3YXBfZXhlY19oZWFkZXJfb3V0ICovCi0KLSAgLyogdGhpcyBpcyByZWFsbHkgdGhlIHN5bSB0YWJsZSBzaXplIGJ1dCB3ZSBzdG9yZSBpdCBpbiBkcmVsb2NzICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiAxMiwgZXhlY19ieXRlcy5lX2RyZWxvY3MpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMEwsIGZhbHNlKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLQkgICE9IEVYRUNfQllURVNfU0laRSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3ltYm9scywgYW5kIHRoZW4gdGhlIHJlbG9jcy4gIFdlIG11c3Qgd3JpdGUgb3V0Ci0gICAgICAgdGhlIHN5bWJvbHMgZmlyc3Qgc28gdGhhdCB3ZSBrbm93IHRoZSBzeW1ib2wgaW5kaWNlcy4gICovCi0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgLyogU2tpcCB0aGUgcmVsb2NzIHRvIHdoZXJlIHdlIHdhbnQgdG8gcHV0IHRoZSBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBOX0RSRUxPRkYgKCpleGVjcCkgKyBleGVjcC0+YV9kcnNpemUsCi0JCSAgICBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghTVkgKHdyaXRlX3N5bXMpIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAobG9uZykgKE5fVFJFTE9GRiAoKmV4ZWNwKSksIGZhbHNlKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTkFNRSAoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAobG9uZykgKE5fRFJFTE9GRiAoKmV4ZWNwKSksIGZhbHNlKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTkFNRSAoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogY29udmVydCB0aGUgaHAgc3ltYm9sIHR5cGUgdG8gYmUgdGhlIHNhbWUgYXMgYW91dDY0LmggdXNhZ2Ugc28gd2UgKi8KLS8qIGNhbiBwaWdneWJhY2sgcm91dGluZXMgaW4gYW91dHguaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyB2b2lkCi1jb252ZXJ0X3N5bV90eXBlIChzeW1fcG9pbnRlciwgY2FjaGVfcHRyLCBhYmZkKQotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bV9wb2ludGVyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0cjsKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBuYW1lX3R5cGU7Ci0gIGludCBuZXdfdHlwZTsKLQotICBuYW1lX3R5cGUgPSAoY2FjaGVfcHRyLT50eXBlKTsKLSAgbmV3X3R5cGUgPSAwOwotCi0gIGlmICgobmFtZV90eXBlICYgSFBfU1lNVFlQRV9BTElHTikgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBpb3VfZXJyb3IgKCJhbGlnbmVkIHN5bWJvbCBlbmNvdW50ZXJlZDogJXMiLCBuYW1lKTsqLwotICAgICAgbmFtZV90eXBlID0gMDsKLSAgICB9Ci0KLSAgaWYgKG5hbWVfdHlwZSA9PSBIUF9TWU1UWVBFX0ZJTEVOQU1FKQotICAgIG5ld190eXBlID0gTl9GTjsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAobmFtZV90eXBlICYgSFBfU1lNVFlQRV9UWVBFKQotCXsKLQljYXNlIEhQX1NZTVRZUEVfVU5ERUZJTkVEOgotCSAgbmV3X3R5cGUgPSBOX1VOREY7Ci0JICBicmVhazsKLQotCWNhc2UgSFBfU1lNVFlQRV9BQlNPTFVURToKLQkgIG5ld190eXBlID0gTl9BQlM7Ci0JICBicmVhazsKLQotCWNhc2UgSFBfU1lNVFlQRV9URVhUOgotCSAgbmV3X3R5cGUgPSBOX1RFWFQ7Ci0JICBicmVhazsKLQotCWNhc2UgSFBfU1lNVFlQRV9EQVRBOgotCSAgbmV3X3R5cGUgPSBOX0RBVEE7Ci0JICBicmVhazsKLQotCWNhc2UgSFBfU1lNVFlQRV9CU1M6Ci0JICBuZXdfdHlwZSA9IE5fQlNTOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQ09NTU9OOgotCSAgbmV3X3R5cGUgPSBOX0NPTU07Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChuYW1lX3R5cGUgJiBIUF9TWU1UWVBFX0VYVEVSTkFMKQotCW5ld190eXBlIHw9IE5fRVhUOwotCi0gICAgICBpZiAobmFtZV90eXBlICYgSFBfU0VDT05EQVJZX1NZTUJPTCkKLQl7Ci0JICBzd2l0Y2ggKG5ld190eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0JICAgICAgLyogSWYgdGhlIHZhbHVlIGlzIG5vbnplcm8sIHRoZW4ganVzdCB0cmVhdCB0aGlzIGFzIGEKLSAgICAgICAgICAgICAgICAgY29tbW9uIHN5bWJvbC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIGNvcnJlY3QgaW4KLSAgICAgICAgICAgICAgICAgYWxsIGNhc2VzLCBidXQgaXQgaXMgbW9yZSBjb3JyZWN0IHRoYW4gdHJlYXRpbmcgaXQgYXMKLSAgICAgICAgICAgICAgICAgYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgICAgIGlmIChjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSA9PSAwKQotCQluZXdfdHlwZSA9IE5fV0VBS1U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0E7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0JICAgICAgbmV3X3R5cGUgPSBOX1dFQUtUOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgotCSAgICAgIG5ld190eXBlID0gTl9XRUFLRDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0JTUyB8IE5fRVhUOgotCSAgICAgIG5ld190eXBlID0gTl9XRUFLQjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGNhY2hlX3B0ci0+dHlwZSA9IG5ld190eXBlOwotCi19Ci0KLQotLyoKLURFU0NSSVBUSU9OCi0gICAgICAgIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3Ci0gICAgICAgIGJ5dGUgc3RyZWFtIG1lbW9yeSBpbWFnZSwgaW50byB0aGUgaW50ZXJuYWwgZXhlY19oZWFkZXIKLSAgICAgICAgc3RydWN0dXJlLgotKi8KLQotdm9pZAotTkFNRSAoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKSByYXdfYnl0ZXM7Ci0KLSAgLyogVGhlIGludGVybmFsX2V4ZWMgc3RydWN0dXJlIGhhcyBzb21lIGZpZWxkcyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhpcwotICAgICBjb25maWd1cmF0aW9uIChJRSBmb3IgaTk2MCksIHNvIGVuc3VyZSB0aGF0IGFsbCBzdWNoIHVuaW5pdGlhbGl6ZWQKLSAgICAgZmllbGRzIGFyZSB6ZXJvJ2Qgb3V0LiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB0d28gb2YgdGhlc2Ugc3RydWN0cwotICAgICBhcmUgbWVtY21wJ2QsIGFuZCB0aHVzIHRoZSBjb250ZW50cyBkbyBtYXR0ZXIuICovCi0gIG1lbXNldCAoZXhlY3AsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfaW5mbyk7Ci0gIGV4ZWNwLT5hX3RleHQgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpOwotICBleGVjcC0+YV9lbnRyeSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBjaGVjayB0aGUgaGVhZGVyIHRvIHNlZSBpZiBpdCB3YXMgZ2VuZXJhdGVkIGJ5IGEgYmZkIG91dHB1dCAqLwotICAvKiB0aGlzIGlzIGRldGVjdGVkIHJhdGhlciBiaXphcmVseSBieSByZXF1aXJpbmcgYSBidW5jaCBvZiAgICAqLwotICAvKiBoZWFkZXIgZmllbGRzIHRvIGJlIHplcm8gYW5kIGFuIG9sZCB1bnVzZWQgZmllbGQgKG5vdyB1c2VkKSAqLwotICAvKiB0byBiZSBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBkbwotICAgIHsKLSAgICAgIGxvbmcgc3ltczsKLSAgICAgIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9wYXNzaXplKSAhPSAwKQotCWJyZWFrOwotICAgICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfc3ltcykgIT0gMCkKLQlicmVhazsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX3N1cHNpemUpICE9IDApCi0JYnJlYWs7Ci0KLSAgICAgIHN5bXMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2RyZWxvY3MpOwotICAgICAgaWYgKHN5bXMgPT0gMCkKLQlicmVhazsKLQotICAgICAgLyogT0ssIHdlJ3ZlIHBhc3NlZCB0aGUgdGVzdCBhcyBiZXN0IGFzIHdlIGNhbiBkZXRlcm1pbmUgKi8KLSAgICAgIGV4ZWNwLT5hX3N5bXMgPSBzeW1zOwotCi0gICAgICAvKiBhbGxvY2F0ZSBzdG9yYWdlIGZvciB3aGVyZSB3ZSB3aWxsIHN0b3JlIHRoaXMgcmVzdWx0ICovCi0gICAgICByYXdwdHIgPSAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICgqcmF3cHRyKSk7Ci0KLSAgICAgIGlmIChyYXdwdHIgPT0gTlVMTCkKLQlyZXR1cm47Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7Ci0gICAgICBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID0gZ251X2VuY2FwX2Zvcm1hdDsKLSAgICB9Ci0gIHdoaWxlICgwKTsKLX0KLQotCi0vKiBUaGUgaHAgc3ltYm9sIHRhYmxlIGlzIGEgYml0IGRpZmZlcmVudCB0aGFuIG90aGVyIGEub3V0IHRhcmdldHMuICBJbnN0ZWFkCi0gICBvZiBoYXZpbmcgYW4gYXJyYXkgb2Ygbmxpc3QgaXRlbXMgYW5kIGFuIGFycmF5IG9mIHN0cmluZ3MsIGhwJ3MgZm9ybWF0Ci0gICBoYXMgdGhlbSBtaXhlZCB0b2dldGhlciBpbiBvbmUgc3RydWN0dXJlLiAgSW4gYWRkaXRpb24sIHRoZSBzdHJpbmdzIGFyZQotICAgbm90IG51bGwgdGVybWluYXRlZC4gIEl0IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0KLSAgIG5saXN0IGVsZW1lbnQgMQotICAgc3RyaW5nMQotICAgbmxpc3QgZWxlbWVudCAyCi0gICBzdHJpbmcyCi0gICAuLi4KLQotICAgVGhlIHdob2xlIHN5bWJvbCB0YWJsZSBpcyByZWFkIGFzIG9uZSBjaHVuayBhbmQgdGhlbiB3ZSBtYXJjaCB0aHJ1IGl0Ci0gICBhbmQgY29udmVydCBpdCB0byBjYW5vbmljYWwgZm9ybS4gIEFzIHdlIG1hcmNoIHRocnUgdGhlIHRhYmxlLCB3ZSBjb3B5Ci0gICB0aGUgbmxpc3QgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBmb3JtIGFuZCB3ZSBjb21wYWN0IHRoZSBzdHJpbmdzIGFuZCBudWxsCi0gICB0ZXJtaW5hdGUgdGhlbSwgdXNpbmcgc3RvcmFnZSBmcm9tIHRoZSBhbHJlYWR5IGFsbG9jYXRlZCBzeW1ib2wgdGFibGU6Ci0KLSAgIHN0cmluZzEKLSAgIG51bGwKLSAgIHN0cmluZzIKLSAgIG51bGwKLSAgIC4uLgotKi8KLQotYm9vbGVhbgotTVkgKHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1ib2xfYnl0ZXM7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltczsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fcG9pbnRlcjsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fZW5kOwotICBjaGFyICpzdHJpbmdzOwotICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZWQ7Ci0gIHVuc2lnbmVkIG51bV9zeW1zID0gMDsKLQotICAvKiBJZiB0aGVyZSdzIG5vIHdvcmsgdG8gYmUgZG9uZSwgZG9uJ3QgZG8gYW55ICovCi0gIGlmIChvYmpfYW91dF9zeW1ib2xzIChhYmZkKSAhPSAoYW91dF9zeW1ib2xfdHlwZSAqKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICBzeW1ib2xfYnl0ZXMgPSBleGVjX2hkciAoYWJmZCktPmFfc3ltczsKLQotICBzdHJpbmdzID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCXN5bWJvbF9ieXRlcyArIFNZTV9FWFRSQV9CWVRFUyk7Ci0gIGlmICghc3RyaW5ncykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bXMgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIChzdHJpbmdzICsgU1lNX0VYVFJBX0JZVEVTKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKChQVFIpIHN5bXMsIHN5bWJvbF9ieXRlcywgMSwgYWJmZCkgIT0gc3ltYm9sX2J5dGVzKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBzeW1zKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICBzeW1fZW5kID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoKChjaGFyICopIHN5bXMpICsgc3ltYm9sX2J5dGVzKTsKLQotICAvKiBmaXJzdCwgbWFyY2ggdGhydSB0aGUgdGFibGUgYW5kIGZpZ3VyZSBvdXQgaG93IG1hbnkgc3ltYm9scyB0aGVyZSBhcmUgKi8KLSAgZm9yIChzeW1fcG9pbnRlciA9IHN5bXM7IHN5bV9wb2ludGVyIDwgc3ltX2VuZDsgc3ltX3BvaW50ZXIrKywgbnVtX3N5bXMrKykKLSAgICB7Ci0gICAgICAvKiBza2lwIG92ZXIgdGhlIGVtYmVkZGVkIHN5bWJvbC4gKi8KLSAgICAgIHN5bV9wb2ludGVyID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoKChjaGFyICopIHN5bV9wb2ludGVyKSArCi0JCQkJCSAgICAgICBzeW1fcG9pbnRlci0+ZV9sZW5ndGhbMF0pOwotICAgIH0KLQotICAvKiBub3cgdGhhdCB3ZSBrbm93IHRoZSBzeW1ib2wgY291bnQsIHVwZGF0ZSB0aGUgYmZkIGhlYWRlciAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IG51bV9zeW1zOwotCi0gIGNhY2hlZCA9ICgoYW91dF9zeW1ib2xfdHlwZSAqKQotCSAgICBiZmRfemFsbG9jIChhYmZkLAotCQkJYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUpKSk7Ci0gIGlmIChjYWNoZWQgPT0gTlVMTCAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBhcyB3ZSBtYXJjaCB0aHJ1IHRoZSBocCBzeW1ib2wgdGFibGUsIGNvbnZlcnQgaXQgaW50byBhIGxpc3Qgb2YKLSAgICAgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MgdG8gaG9sZCB0aGUgc3ltYm9sIG5hbWVzLiAgTWFrZSBzdXJlIGFueQotICAgICBhc3NpZ25tZW50IHRvIHRoZSBzdHJpbmdzIHBvaW50ZXIgaXMgZG9uZSBhZnRlciB3ZSdyZSB0aHJ1IHVzaW5nCi0gICAgIHRoZSBubGlzdCBzbyB3ZSBkb24ndCBvdmVyd3JpdGUgYW55dGhpbmcgaW1wb3J0YW50LiAqLwotCi0gIC8qIE9LLCBub3cgd2FsayB0aGUgbmV3IHN5bXRhYmxlLCBjYWNoZWluZyBzeW1ib2wgcHJvcGVydGllcyAqLwotICB7Ci0gICAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVfcHRyID0gY2FjaGVkOwotICAgIGFvdXRfc3ltYm9sX3R5cGUgY2FjaGVfc2F2ZTsKLSAgICAvKiBSdW4gdGhyb3VnaCB0YWJsZSBhbmQgY29weSB2YWx1ZXMgKi8KLSAgICBmb3IgKHN5bV9wb2ludGVyID0gc3ltcywgY2FjaGVfcHRyID0gY2FjaGVkOwotCSBzeW1fcG9pbnRlciA8IHN5bV9lbmQ7IHN5bV9wb2ludGVyKyssIGNhY2hlX3B0cisrKQotICAgICAgewotCXVuc2lnbmVkIGludCBsZW5ndGg7Ci0JY2FjaGVfcHRyLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgPSBHRVRfU1dPUkQgKGFiZmQsIHN5bV9wb2ludGVyLT5lX3ZhbHVlKTsKLQljYWNoZV9wdHItPmRlc2MgPSBiZmRfZ2V0XzE2IChhYmZkLCBzeW1fcG9pbnRlci0+ZV9hbG1vZCk7Ci0JY2FjaGVfcHRyLT50eXBlID0gYmZkX2dldF84IChhYmZkLCBzeW1fcG9pbnRlci0+ZV90eXBlKTsKLQljYWNoZV9wdHItPnN5bWJvbC51ZGF0YS5wID0gTlVMTDsKLQlsZW5ndGggPSBiZmRfZ2V0XzggKGFiZmQsIHN5bV9wb2ludGVyLT5lX2xlbmd0aCk7Ci0JY2FjaGVfcHRyLT5vdGhlciA9IGxlbmd0aDsJLyogb3RoZXIgbm90IHVzZWQsIHNhdmUgbGVuZ3RoIGhlcmUgKi8KLQotCWNhY2hlX3NhdmUgPSAqY2FjaGVfcHRyOwotCWNvbnZlcnRfc3ltX3R5cGUgKHN5bV9wb2ludGVyLCBjYWNoZV9wdHIsIGFiZmQpOwotCWlmICghdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyAoYWJmZCwgY2FjaGVfcHRyKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiBmb3IgaHB1eCwgdGhlICdsZW5naHQnIHZhbHVlIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mICovCi0JLyogdGhlIHN5bWJvbCBuYW1lIHdoaWNoIGZvbGxvd3MgdGhlIG5saXN0IGVudHJ5LiAgICAgICAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlpZiAobGVuZ3RoKQotCSAgewotCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JICAgIC8qIHRoZSBocCBzdHJpbmcgaXMgbm90IG51bGwgdGVybWluYXRlZCBzbyB3ZSBjcmVhdGUgYSBuZXcgb25lKi8KLQkgICAgLyogYnkgY29weWluZyB0aGUgc3RyaW5nIHRvIG92ZXJsYXAgdGhlIGp1c3QgdmFjYXRlZCBubGlzdCAgICAqLwotCSAgICAvKiBzdHJ1Y3R1cmUgYmVmb3JlIGl0IGluIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkgICAgY2FjaGVfcHRyLT5zeW1ib2wubmFtZSA9IHN0cmluZ3M7Ci0JICAgIG1lbWNweSAoc3RyaW5ncywgc3ltX3BvaW50ZXIgKyAxLCBsZW5ndGgpOwotCSAgICBzdHJpbmdzW2xlbmd0aF0gPSAnXDAnOwotCSAgICBzdHJpbmdzICs9IGxlbmd0aCArIDE7Ci0JICB9Ci0JZWxzZQotCSAgY2FjaGVfcHRyLT5zeW1ib2wubmFtZSA9IChjaGFyICopIE5VTEw7Ci0KLQkvKiBza2lwIG92ZXIgdGhlIGVtYmVkZGVkIHN5bWJvbC4gKi8KLQlzeW1fcG9pbnRlciA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1fcG9pbnRlcikgKwotCQkJCQkJIGxlbmd0aCk7Ci0gICAgICB9Ci0gIH0KLQotICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IGNhY2hlZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLXZvaWQKLU1ZIChzd2FwX3N0ZF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBocDMwMGhwdXhfcmVsb2MgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm4gPSAwOwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsID0gMDsKLSAgc3RydWN0IGFvdXRkYXRhICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpOwotICByX2luZGV4ID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBieXRlcy0+cl9pbmRleCk7Ci0KLSAgc3dpdGNoIChieXRlcy0+cl90eXBlWzBdKQotICAgIHsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX1RFWFQ6Ci0gICAgICByX2luZGV4ID0gTl9URVhUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9EQVRBOgotICAgICAgcl9pbmRleCA9IE5fREFUQTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfQlNTOgotICAgICAgcl9pbmRleCA9IE5fQlNTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9FWFRFUk5BTDoKLSAgICAgIHJfZXh0ZXJuID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfUENSRUw6Ci0gICAgICByX2V4dGVybiA9IDE7Ci0gICAgICByX3BjcmVsID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfUkRMVDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfUlBMVDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUlNFR01FTlRfTk9PUDoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBzd2l0Y2ggKGJ5dGVzLT5yX2xlbmd0aFswXSkKLSAgICB7Ci0gICAgY2FzZSBIUF9STEVOR1RIX0JZVEU6Ci0gICAgICByX2xlbmd0aCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JMRU5HVEhfV09SRDoKLSAgICAgIHJfbGVuZ3RoID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUkxFTkdUSF9MT05HOgotICAgICAgcl9sZW5ndGggPSAyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSBob3d0b190YWJsZV9zdGQgKyByX2xlbmd0aCArIDQgKiByX3BjcmVsOwotICAvKiBGSVhNRS1zb29uOiAgUm9sbCBiYXNlcmVsLCBqbXB0YWJsZSwgcmVsYXRpdmUgYml0cyBpbnRvIGhvd3RvIHNldHRpbmcgKi8KLQotICAvKiBUaGlzIG1hY3JvIHVzZXMgdGhlIHJfaW5kZXggdmFsdWUgY29tcHV0ZWQgYWJvdmUgKi8KLSAgaWYgKHJfcGNyZWwgJiYgcl9leHRlcm4pCi0gICAgewotICAgICAgLyogVGhlIEdOVSBsaW5rZXIgYXNzdW1lcyBhbnkgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHNlY3Rpb24gKi8KLSAgICAgIC8qIGlzIGFscmVhZHkgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGltYWdlIHdoaWxlIHRoZSBIUCBsaW5rZXIgICovCi0gICAgICAvKiBhZGRzIHRoaXMgaW4gbGF0ZXIuICBBZGQgaXQgaW4gbm93Li4uICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgTU9WRV9BRERSRVNTICgtY2FjaGVfcHRyLT5hZGRyZXNzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBNT1ZFX0FERFJFU1MgKDApOwotICAgIH0KLX0KLQotYm9vbGVhbgotTVkgKHNsdXJwX3JlbG9jX3RhYmxlKSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBQVFIgcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLSAgc3RydWN0IGhwMzAwaHB1eF9yZWxvYyAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGFyZWxlbnQgKmNhY2hlX3B0cjsKLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX2RhdGFzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgIHJlbG9jX3NpemUgPSBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplOwotICAgICAgZ290byBkb2l0OwotICAgIH0KLQotICBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgIHJlbG9jX3NpemUgPSBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplOwotICAgICAgZ290byBkb2l0OwotICAgIH0KLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci0KLWRvaXQ6Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgYXNlY3QtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICBjb3VudCA9IHJlbG9jX3NpemUgLyBlYWNoX3NpemU7Ci0KLQotICByZWxvY19jYWNoZSA9IChhcmVsZW50ICopIGJmZF96YWxsb2MgKGFiZmQsIChzaXplX3QpIChjb3VudCAqIHNpemVvZgotCQkJCQkJCShhcmVsZW50KSkpOwotICBpZiAoIXJlbG9jX2NhY2hlICYmIGNvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJlbG9jcyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NzICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfY2FjaGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKHJlbG9jcywgMSwgcmVsb2Nfc2l6ZSwgYWJmZCkgIT0gcmVsb2Nfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NzKTsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJwdHIgPSAoc3RydWN0IGhwMzAwaHB1eF9yZWxvYyAqKSByZWxvY3M7Ci0gIGNvdW50ZXIgPSAwOwotICBjYWNoZV9wdHIgPSByZWxvY19jYWNoZTsKLQotICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0gICAgewotICAgICAgTVkgKHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgcnB0ciwgY2FjaGVfcHRyLCBzeW1ib2xzLAotCQkJICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotICAgIH0KLQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpZGVudGljYWwgdG8gZnVuY3Rpb25zIGluIGFvdXR4LmggZXhjZXB0ICovCi0vKiB0aGV5IHJlZmVyIHRvIE1ZKGZ1bmMpIHJhdGhlciB0aGFuIE5BTUUoYW91dCxmdW5jKSBhbmQgdGhleSBhbHNvICAgICAqLwotLyogY2FsbCBhb3V0XzMyIHZlcnNpb25zIGlmIHRoZSBpbnB1dCBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgZ2NjICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWxvbmcgYW91dF8zMl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGFzeW1ib2wgKiogbG9jYXRpb24pKTsKLWxvbmcgYW91dF8zMl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLQotbG9uZyBhb3V0XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiBhYmZkLCBzZWNfcHRyIHNlY3Rpb24sCi0JCQkJCSBhcmVsZW50ICoqIHJlbHB0ciwKLQkJCQkJIGFzeW1ib2wgKiogc3ltYm9scykpOwotCi1sb25nCi1NWSAoZ2V0X3N5bXRhYikgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICBhb3V0X3N5bWJvbF90eXBlICpzeW1iYXNlOwotCi0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfZ2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24pOwotCi0gIGlmICghTVkgKHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBmb3IgKHN5bWJhc2UgPSBvYmpfYW91dF9zeW1ib2xzIChhYmZkKTsgY291bnRlcisrIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7KQotICAgICoobG9jYXRpb24rKykgPSAoYXN5bWJvbCAqKSAoc3ltYmFzZSsrKTsKLSAgKmxvY2F0aW9uKysgPSAwOwotICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci19Ci0KLWxvbmcKLU1ZIChnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHJldHVybiBhb3V0XzMyX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoIU1ZIChzbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLQotCi0KLWxvbmcKLU1ZIChjYW5vbmljYWxpemVfcmVsb2MpIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHJldHVybiBhb3V0XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKTsKLQotICBpZiAoISh0YmxwdHIgfHwgTVkgKHNsdXJwX3JlbG9jX3RhYmxlKSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgewotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0JewotCSAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0JfQotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0KLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2hwcGFfc3R1YnMuaCBiL2JmZC9ocHBhX3N0dWJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODkzZTguLjAwMDAwMDAKLS0tIGEvYmZkL2hwcGFfc3R1YnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIEhQUEEgbGlua2VyIHN0dWIgaW5zdHJ1Y3Rpb25zICAqLwotCi0vKiBUaGVzZSBhcmUgdGhlIGluc3RydWN0aW9ucyB3aGljaCB0aGUgbGlua2VyIG1heSBpbnNlcnQgaW50byB0aGUKLSAgIGNvZGUgc3RyZWFtIHdoZW4gYnVpbGRpbmcgZmluYWwgZXhlY3V0YWJsZXMgdG8gaGFuZGxlIG91dC1vZi1yYW5nZQotICAgY2FsbHMgYW5kIGFyZ3VtZW50IHJlbG9jYXRpb25zLiAgKi8KLQotI2RlZmluZSBMRE9fTTRfUjMxX1IzMQkJMHgzN2ZmM2ZmOQkvKiBsZG8gLTQoJXIzMSksJXIzMQkgICovCi0jZGVmaW5lIExESUxfUjEJCQkweDIwMjAwMDAwCS8qIGxkaWwgWFhYLCVyMQkJICAqLwotI2RlZmluZSBCRV9TUjRfUjEJCTB4ZTAyMDIwMDAJLyogYmUgWFhYKCVzcjQsJXIxKQkgICovCi0jZGVmaW5lIENPUFlfUjMxX1IyICAgICAgICAgIAkweDA4MWYwMjQyCS8qIGNvcHkgJXIzMSwlcjIJICAqLwotI2RlZmluZSBCTEVfU1I0X1IwCQkweGU0MDAyMDAwCS8qIGJsZSBYWFgoJXNyNCwlcjApCSAgKi8KLSNkZWZpbmUgQkxFX1NSNF9SMQkJMHhlNDIwMjAwMAkvKiBibGUgWFhYKCVzcjQsJXIxKQkgICovCi0jZGVmaW5lIEJWX05fMF9SMzEJCTB4ZWJlMGMwMDIJLyogYnYsbiAwKCVyMzEpCQkgICovCi0jZGVmaW5lIFNUV19SMzFfTThSMzAJCTB4NmJkZjNmZjEJLyogc3R3ICVyMzEsLTgoJXIzMCkJICAqLwotI2RlZmluZSBMRFdfTThSMzBfUjMxCQkweDRiZGYzZmYxCS8qIGxkdyAtOCglcjMwKSwlcjMxCSAgKi8KLSNkZWZpbmUgU1RXX0FSR19NMTZSMzAJCTB4NmJjMDNmZTEJLyogc3R3ICVhcmdYLC0xNiglcjMwKQkgICovCi0jZGVmaW5lIExEV19NMTZSMzBfQVJHCQkweDRiYzAzZmUxCS8qIGxkdyAtMTIoJXIzMCksJWFyZ1gJICAqLwotI2RlZmluZSBTVFdfQVJHX00xMlIzMAkJMHg2YmMwM2ZlOQkvKiBzdHcgJWFyZ1gsLTE2KCVyMzApCSAgKi8KLSNkZWZpbmUgTERXX00xMlIzMF9BUkcJCTB4NGJjMDNmZTkJLyogbGR3IC0xMiglcjMwKSwlYXJnWAkgICovCi0jZGVmaW5lIEZTVFdfRkFSR19NMTZSMzAJMHgyN2MxMTIwMAkvKiBmc3R3cyAlZmFyZ1gsLTE2KCVyMzApICovCi0jZGVmaW5lIEZMRFdfTTE2UjMwX0ZBUkcJMHgyN2MxMTAwMAkvKiBmbGR3cyAtMTYoJXIzMCksJWZhcmdYICovCi0jZGVmaW5lIEZTVERfRkFSR19NMTZSMzAJMHgyZmMxMTIwMAkvKiBmc3RkcyAlZmFyZ1gsLTE2KCVyMzApICovCi0jZGVmaW5lIEZMRERfTTE2UjMwX0ZBUkcJMHgyZmMxMTAwMAkvKiBmbGRkcyAtMTYoJXIzMCksJWZhcmdYICovCmRpZmYgLS1naXQgYS9iZmQvaHBwYWJzZC1jb3JlLmMgYi9iZmQvaHBwYWJzZC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2U2YjIuLjAwMDAwMDAKLS0tIGEvYmZkL2hwcGFic2QtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSFBQQSBCU0QgY29yZSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4gCi0KLSAgIFRoZSBjb3JlIGZpbGUgc3RydWN0dXJlIGZvciB0aGUgVXRhaCA0LjNCU0QgYW5kIE9TRjEgcG9ydHMgb24gdGhlCi0gICBQQSBpcyBhIG1peCBiZXR3ZWVuIHRyYWRpdGlvbmFsIGNvcmVzIGFuZCBocHV4IGNvcmVzIC0tIGp1c3QKLSAgIGRpZmZlcmVudCBlbm91Z2ggdGhhdCBzdXBwb3J0aW5nIHRoaXMgZm9ybWF0IHdvdWxkIHRlbmQgdG8gYWRkCi0gICBncm9zcyBoYWNrcyB0byB0cmFkLWNvcmUuYyBvciBocHV4LWNvcmUuYy4gIFNvIGluc3RlYWQgd2Uga2VlcCBhbnkKLSAgIGdyb3NzIGhhY2tzIGlzb2xhdGVkIHRvIHRoaXMgZmlsZS4gICovCi0gICAKLQotLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIEhQUEEtQlNEIHN0eWxlCi0gICBjb3JlIGZpbGVzLgotCi0gICBJIHdvdWxkIG5vdCBleHBlY3QgdGhpcyB0byBiZSBvZiB1c2UgdG8gYW55IG90aGVyIGhvc3QvdGFyZ2V0LCBidXQKLSAgIHlvdSBuZXZlciBrbm93LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKQotCi0jaW5jbHVkZSAibWFjaGluZS92bXBhcmFtLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgkJLyogQWZ0ZXIgYS5vdXQuaCAgKi8KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCi1zdGF0aWMgYXNlY3Rpb24gKm1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosCi0JCQkJCSAgICBmbGFnd29yZCwgYmZkX3NpemVfdHlwZSwKLQkJCQkJICAgIGZpbGVfcHRyLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBhc3ltYm9sICpocHBhYnNkX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpocHBhYnNkX2NvcmVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICpocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBocHBhYnNkX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhLiAgKi8KLQotc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QKLSAgewotICAgIGludCBzaWc7Ci0gICAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Ci0gICAgYXNlY3Rpb24gKmRhdGFfc2VjdGlvbjsKLSAgICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKLSAgICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gIH07Ci0KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLmhwcGFic2RfY29yZV9kYXRhKQotI2RlZmluZSBjb3JlX3NpZ25hbChiZmQpIChjb3JlX2hkcihiZmQpLT5zaWcpCi0jZGVmaW5lIGNvcmVfY29tbWFuZChiZmQpIChjb3JlX2hkcihiZmQpLT5jbWQpCi0jZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5kYXRhX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfc3RhY2tzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+cmVnX3NlY3Rpb24pCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgb2Zmc2V0LCBhbGlnbm1lbnRfcG93ZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+ZmlsZXBvcyA9IG9mZnNldDsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGFsaWdubWVudF9wb3dlcjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWhwcGFic2RfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1ocHBhYnNkX2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHZhbDsKLSAgc3RydWN0IHVzZXIgdTsKLSAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmNvcmVkYXRhOwotICBpbnQgY2xpY2tzejsKLQotICAvKiBUcnkgdG8gcmVhZCBpbiB0aGUgdS1hcmVhLiAgV2Ugd2lsbCBuZWVkIGluZm9ybWF0aW9uIGZyb20gdGhpcwotICAgICB0byBrbm93IGhvdyB0byBncm9rIHRoZSByZXN0IG9mIHRoZSBjb3JlIHN0cnVjdHVyZXMuICAqLwotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikgJnUsIDEsIHNpemVvZiB1LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgdSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBwYWdlIHNpemUgb3V0IG9mIHRoZSB1IHN0cnVjdHVyZS4gIFRoaXMgd2lsbCBiZSBkaWZmZXJlbnQKLSAgICAgZm9yIFBBIDEuMCBtYWNoaW5lcyBhbmQgUEEgMS4xIG1hY2hpbmVzLiAgIFl1ayEgICovCi0gIGNsaWNrc3ogPSB1LnVfcGNiLnBjYl9wZ3N6OwotCi0gIC8qIGNsaWNrc3ogbXVzdCBiZSBhIHBvd2VyIG9mIHR3byA+PSAyay4gICovCi0gIGlmIChjbGlja3N6IDwgMHg4MDAKLSAgICAgIHx8IGNsaWNrc3ogIT0gKGNsaWNrc3ogJiAtY2xpY2tzeikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLQotICAvKiBTYW5pdHkgY2hlY2tzLiAgTWFrZSBzdXJlIHRoZSBzaXplIG9mIHRoZSBjb3JlIGZpbGUgbWF0Y2hlcyB0aGUKLSAgICAgdGhlIHNpemUgY29tcHV0ZWQgZnJvbSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGNvcmUgaXRzZWxmLiAgKi8KLSAgewotICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgaWYgKHN0cmVhbSA9PSBOVUxMIHx8IGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBpZiAoTkJQRyAqIChVUEFHRVMgKyB1LnVfZHNpemUgKyB1LnVfc3NpemUpID4gc3RhdGJ1Zi5zdF9zaXplKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgaWYgKGNsaWNrc3ogKiAoVVBBR0VTICsgdS51X2RzaXplICsgdS51X3NzaXplKSA8IHN0YXRidWYuc3Rfc2l6ZSkKLSAgICAgIHsKLQkvKiBUaGUgZmlsZSBpcyB0b28gYmlnLiAgTWF5YmUgaXQncyBub3QgYSBjb3JlIGZpbGUKLQkgICBvciB3ZSBvdGhlcndpc2UgaGF2ZSBiYWQgdmFsdWVzIGZvciB1X2RzaXplIGFuZCB1X3NzaXplKS4gICovCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICBjb3JlZGF0YSA9IChzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKCFjb3JlZGF0YSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBNYWtlIHRoZSBjb3JlIGRhdGEgYW5kIGF2YWlsYWJsZSB2aWEgdGhlIHRkYXRhIHBhcnQgb2YgdGhlIEJGRC4gICovCi0gIGFiZmQtPnRkYXRhLmhwcGFic2RfY29yZV9kYXRhID0gY29yZWRhdGE7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9ucy4gICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuc3RhY2siLAotCQkJCQkgICBTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkgICBjbGlja3N6ICogdS51X3NzaXplLAotCQkJCQkgICBOQlBHICogKFVTSVpFICsgS1NUQUtTSVpFKSAKLQkJCQkJICAgICArIGNsaWNrc3ogKiB1LnVfZHNpemUsIDIpOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gVVNSU1RBQ0s7IAotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCQkJICBTRUNfQUxMT0MgKyBTRUNfTE9BRAotCQkJCQkgICAgKyBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkgIGNsaWNrc3ogKiB1LnVfZHNpemUsCi0JCQkJCSAgTkJQRyAqIChVU0laRSArIEtTVEFLU0laRSksIDIpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBVREFUQVNFRzsKLQotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJCQkgU0VDX0hBU19DT05URU5UUywKLQkJCQkJIEtTVEFLU0laRSAqIE5CUEcsCi0JCQkJCSBOQlBHICogVVNJWkUsIDIpOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IDA7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgdS51X2NvbW0sIE1BWENPTUxFTiArIDEpOwotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSB1LnVfY29kZTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGludAotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLWhwcGFic2RfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICAvKiBUaGVyZSdzIG5vIHdheSB0byBrbm93IHRoaXMuLi4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFwKLSAgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBocHBhYnNkX2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIGhwcGFic2RfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGhwcGFic2RfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGhwcGFic2RfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGhwcGFic2RfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0ICgpCi17Ci0gIC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cC4gICovCi0gIGFib3J0ICgpOwkKLX0KLQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBocHBhYnNkX2NvcmVfdmVjID0KLSAgewotICAgICJocHBhYnNkLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoaHBwYWJzZF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaHBwYWJzZF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9ocHV4LWNvcmUuYyBiL2JmZC9ocHV4LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhYTJjMi4uMDAwMDAwMAotLS0gYS9iZmQvaHB1eC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUC9VWCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgotICAgQ29udmVydGVkIHRvIGJhY2stZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNVcHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFAvVVggc3R5bGUKLSAgIGNvcmUgZmlsZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQMzAwSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCi0KLS8qIEZJWE1FOiBzeXMvY29yZS5oIGRvZXNuJ3QgZXhpc3QgZm9yIEhQVVggdmVyc2lvbiA3LiAgSFBVWCB2ZXJzaW9uCi0gICA1LCA2LCBhbmQgNyBjb3JlIGZpbGVzIHNlZW0gdG8gYmUgc3RhbmRhcmQgdHJhZC1jb3JlLmMgdHlwZSBjb3JlCi0gICBmaWxlczsgY2FuIHdlIGp1c3QgdXNlIHRyYWQtY29yZS5jIGluIGFkZGl0aW9uIHRvIHRoaXMgZmlsZT8gICovCi0KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0KLSNlbmRpZiAvKiBIT1NUX0hQUEFIUFVYICovCi0KLSNpZmRlZiBIT1NUX0hQUEFCU0QKLQotLyogTm90IGEgdmVyeSBzd2lmdCBwbGFjZSB0byBwdXQgaXQsIGJ1dCB0aGF0J3Mgd2hlcmUgdGhlIEJTRCBwb3J0Ci0gICBwdXRzIHRoZW0uICAqLwotI2luY2x1ZGUgIi9ocHV4L3Vzci9pbmNsdWRlL3N5cy9jb3JlLmgiCi0KLSNlbmRpZiAvKiBIT1NUX0hQUEFCU0QgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEhBVkVfRElSRU5UX0gKLSMgaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NZU19ORElSX0gKLSMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfTkRJUl9ICi0jICBpbmNsdWRlIDxuZGlyLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLS8qIEtsdWRnZTogVGhlcmUncyBubyBleHBsaWNpdCBtZWNoYW5pc20gcHJvdmlkZWQgYnkgc3lzL2NvcmUuaCB0bwotICAgY29uZGl0aW9uYWxseSBrbm93IHdoZXRoZXIgYSBwcm9jX2luZm8gaGFzIHRocmVhZCBpZCBmaWVsZHMuCi0gICBIb3dldmVyLCBDT1JFX0FOT05fU0hNRU0gc2hvd3MgdXAgZmlyc3QgYXQgMTAuMzAsIHdoaWNoIGlzCi0gICBoYXBwaWx5IGFsc28gd2hlbiBtZWFuaW5nZnVsIHRocmVhZCBpZCdzIHNob3cgdXAgaW4gcHJvY19pbmZvLiAqLwotI2lmIGRlZmluZWQoQ09SRV9BTk9OX1NITUVNKQotI2RlZmluZSBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCAoMSkKLSNlbmRpZgotCi0vKiBUaGlzIHR5cGUgYXBwZWFycyBhdCBIUC1VWCAxMC4zMC4gIERlZmluaW5nIGl0IGlmIG5vdCBkZWZpbmVkCi0gICBieSBzeXMvY29yZS5oIGFsbG93cyB1cyB0byBidWlsZCBmb3Igb2xkZXIgSFAtVVgncywgYW5kIChzaW5jZQotICAgaXQgd29uJ3QgYmUgZW5jb3VudGVyZWQgaW4gY29yZS1kdW1wcyBmcm9tIG9sZGVyIEhQLVVYJ3MpIGlzCi0gICBoYXJtbGVzcy4gKi8KLSNpZiAhZGVmaW5lZChDT1JFX0FOT05fU0hNRU0pCi0jZGVmaW5lIENPUkVfQU5PTl9TSE1FTSAweDAwMDAwMjAwICAgICAgICAgLyogYW5vbnltb3VzIHNoYXJlZCBtZW1vcnkgKi8KLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi0vKiAubHdwaWQgYW5kIC51c2VyX3RpZCBhcmUgb25seSB2YWxpZCBpZiBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCwgZWxzZSB0aGV5Ci0gICBhcmUgc2V0IHRvIDAuICBBbHNvLCB1bnRpbCBIUC1VWCBpbXBsZW1lbnRzIE14TiB0aHJlYWRzLCAudXNlcl90aWQgYW5kCi0gICAubHdwaWQgYXJlIHN5bm9ueW1vdXMuICovCi1zdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgaW50IGx3cGlkOyAgICAgICAgICAgICAgIC8qIEtlcm5lbCB0aHJlYWQgSUQuICovCi0gIHVuc2lnbmVkIGxvbmcgdXNlcl90aWQ7ICAvKiBVc2VyIHRocmVhZCBJRC4gKi8KLSAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5ocHV4X2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotI2RlZmluZSBjb3JlX2tlcm5lbF90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+bHdwaWQpCi0jZGVmaW5lIGNvcmVfdXNlcl90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+dXNlcl90aWQpCi0KLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgYWxpZ25tZW50X3Bvd2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIGlmICghbmV3bmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGFsaWdubWVudF9wb3dlcjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWhwdXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgYmZkIHRhcmdldCBpZiB0aGUgZmlsZSBpcyBhIGNvcmVmaWxlLgotICAgSXQgcmV0dXJucyBudWxsIG9yIDAgaWYgaXQgZmluZHMgb3V0IHRoYWF0IGl0IGlzIG5vdCBhIGNvcmUgZmlsZS4KLSAgIFRoZSB3YXkgaXQgY2hlY2tzIHRoaXMgaXMgYnkgbG9va2luZyBmb3IgYWxsb3dlZCAndHlwZScgZmllbGQgdmFsdWVzLgotICAgVGhlc2UgYXJlIGRlY2xhcmVkIGluIHN5cy9jb3JlLmgKLSAgIFRoZXJlIGFyZSBzb21lIHZhbHVlcyB3aGljaCBhcmUgJ3Jlc2VydmVkIGZvciBmdXR1cmUgdXNlJy4gSW4gcGFydGljdWxhcgotICAgQ09SRV9OT05FIGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgMC4gVGhpcyBtYXkgYmUgYSBjYXRjaC1hbGwgZm9yIGNhc2VzCi0gICBpbiB3aGljaCB0aGUgY29yZSBmaWxlIGlzIGdlbmVyYXRlZCBieSBzb21lIG5vbi1ocHV4IGFwcGxpY2F0aW9uLgotICAgKEkgYW0ganVzdCBndWVzc2luZyBoZXJlISkKLSovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1ocHV4X2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50ICBnb29kX3NlY3Rpb25zID0gMDsKLSAgaW50ICB1bmtub3duX3NlY3Rpb25zID0gMDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBocHV4X2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCB2YWw7Ci0gICAgICBzdHJ1Y3QgY29yZWhlYWQgY29yZV9oZWFkZXI7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmY29yZV9oZWFkZXIsIDEsIHNpemVvZiBjb3JlX2hlYWRlciwgYWJmZCk7Ci0gICAgICBpZiAodmFsIDw9IDApCi0JYnJlYWs7Ci0gICAgICBzd2l0Y2ggKGNvcmVfaGVhZGVyLnR5cGUpCi0JewotCWNhc2UgQ09SRV9LRVJORUw6Ci0JY2FzZSBDT1JFX0ZPUk1BVDoKLQkgIGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKTsJLyogSnVzdCBza2lwIHRoaXMgKi8KLSAgICAgICAgICBnb29kX3NlY3Rpb25zKys7Ci0JICBicmVhazsKLQljYXNlIENPUkVfRVhFQzoKLQkgIHsKLQkgICAgc3RydWN0IHByb2NfZXhlYyBwcm9jX2V4ZWM7Ci0JICAgIGlmIChiZmRfcmVhZCAoKHZvaWQgKikgJnByb2NfZXhlYywgMSwgY29yZV9oZWFkZXIubGVuLCBhYmZkKQotCQkhPSBjb3JlX2hlYWRlci5sZW4pCi0JICAgICAgYnJlYWs7Ci0JICAgIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIHByb2NfZXhlYy5jbWQsIE1BWENPTUxFTiArIDEpOwotICAgICAgICAgICAgZ29vZF9zZWN0aW9ucysrOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFX1BST0M6Ci0JICB7Ci0JICAgIHN0cnVjdCBwcm9jX2luZm8gcHJvY19pbmZvOwotCSAgICBjaGFyICBzZWNuYW1lWzEwMF07ICAvKiBPZiBhcmJpdHJhcnkgc2l6ZSwgYnV0IHBsZW50eSBsYXJnZS4gKi8KLQotICAgICAgICAgICAgLyogV2UgbmVlZCB0byByZWFkIHRoaXMgc2VjdGlvbiwgJ2NhdXNlIHdlIG5lZWQgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBjb3JlLWR1bXBlZCBhcHAgd2FzIHRocmVhZGVkIGJlZm9yZSB3ZSBjcmVhdGUKLSAgICAgICAgICAgICAgIGFueSAucmVnIHNlY3Rpb25zLiAqLwotCSAgICBpZiAoYmZkX3JlYWQgKCZwcm9jX2luZm8sIDEsIGNvcmVfaGVhZGVyLmxlbiwgYWJmZCkKLQkJIT0gY29yZV9oZWFkZXIubGVuKQotCSAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIC8qIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBjcmVhdGUgdGhvc2Ugc2VjdGlvbnMgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgZmlsZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVjb3JkLCBpdCBzZWVtcy4gKi8KLSAgICAgICAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgLWNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpICE9IDApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0jaWYgZGVmaW5lZChQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCkKLSAgICAgICAgICAgIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPSBwcm9jX2luZm8ubHdwaWQ7Ci0gICAgICAgICAgICBjb3JlX3VzZXJfdGhyZWFkX2lkIChhYmZkKSA9IHByb2NfaW5mby51c2VyX3RpZDsKLSNlbHNlCi0gICAgICAgICAgICBjb3JlX2tlcm5lbF90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSAgICAgICAgICAgIGNvcmVfdXNlcl90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSNlbmRpZgotICAgICAgICAgICAgLyogSWYgdGhlIHByb2dyYW0gd2FzIHVudGhyZWFkZWQsIHRoZW4gd2UnbGwganVzdCBjcmVhdGUgYQotICAgICAgICAgICAgICAgLnJlZyBzZWN0aW9uLgotCi0gICAgICAgICAgICAgICBJZiB0aGUgcHJvZ3JhbSB3YXMgdGhyZWFkZWQsIHRoZW4gd2UnbGwgY3JlYXRlIC5yZWcvWFhYWFgKLSAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIGVhY2ggdGhyZWFkLCB3aGVyZSBYWFhYWCBpcyBhIHByaW50YWJsZQotICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtlcm5lbCB0aHJlYWQgaWQuICBXZSdsbCBhbHNvCi0gICAgICAgICAgICAgICBjcmVhdGUgYSAucmVnIHNlY3Rpb24gZm9yIHRoZSB0aHJlYWQgdGhhdCB3YXMgcnVubmluZwotICAgICAgICAgICAgICAgYW5kIHNpZ25hbGxlZCBhdCB0aGUgdGltZSBvZiB0aGUgY29yZS1kdW1wIChpLmUuLCB0aGlzCi0gICAgICAgICAgICAgICBpcyBlZmZlY3RpdmVseSBhbiBhbGlhcywgbmVlZGVkIHRvIGtlZXAgR0RCIGhhcHB5LikKLQotICAgICAgICAgICAgICAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFhYWCcgYXMgb3Bwb3NlZCB0byAnLnJlZ1hYWFhYJwotICAgICAgICAgICAgICAgYmVjYXVzZSBHREIgZXhwZWN0cyB0aGF0IC5yZWcyIHdpbGwgYmUgdGhlIGZsb2F0aW5nLQotICAgICAgICAgICAgICAgcG9pbnQgcmVnaXN0ZXJzLiAqLwotICAgICAgICAgICAgaWYgKGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPT0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfSEFTX0NPTlRFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaGVhZGVyLmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAmcHJvY19pbmZvIC0gKGludCkgJiBwcm9jX2luZm8uaHdfcmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVyZSBhcmUgdGhyZWFkcy4gIElzIHRoaXMgdGhlIG9uZSB0aGF0IGNhdXNlZCB0aGUKLSAgICAgICAgICAgICAgICAgICBjb3JlLWR1bXA/ICBXZSdsbCBjbGFpbSBpdCB3YXMgdGhlIHJ1bm5pbmcgdGhyZWFkLiAqLwotICAgICAgICAgICAgICAgIGlmIChwcm9jX2luZm8uc2lnICE9IC0xKQotICAgICAgICAgICAgICAgICAgewotCQkgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJCQkgICAgU0VDX0hBU19DT05URU5UUywKLQkJCQkJICAgIGNvcmVfaGVhZGVyLmxlbiwKLQkJCQkJICAgIChpbnQpICZwcm9jX2luZm8gLSAoaW50KSAmIHByb2NfaW5mby5od19yZWdzLAotCQkJCQkgICAgMikpCi0JCSAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFdlIGFsd2F5cyBtYWtlIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgZm9yIGV2ZXJ5IHRocmVhZC4gKi8KLSAgICAgICAgICAgICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkpOwotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX0hBU19DT05URU5UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2hlYWRlci5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgJnByb2NfaW5mbyAtIChpbnQpICYgcHJvY19pbmZvLmh3X3JlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgfQotCSAgICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBwcm9jX2luZm8uc2lnOwotICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKSAhPSAwKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX0RBVEE6Ci0JY2FzZSBDT1JFX1NUQUNLOgotCWNhc2UgQ09SRV9URVhUOgotCWNhc2UgQ09SRV9NTUY6Ci0JY2FzZSBDT1JFX1NITToKLQljYXNlIENPUkVfQU5PTl9TSE1FTToKLQkgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkJICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJICBjb3JlX2hlYWRlci5sZW4sIGNvcmVfaGVhZGVyLmFkZHIsIDIpKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgYmZkX3NlZWsgKGFiZmQsIGNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpOwotICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX05PTkU6Ci0gICAgICAgICAgLyogTGV0J3Mgbm90IHB1bnQgaWYgd2UgZW5jb3VudGVyIGEgc2VjdGlvbiBvZiB1bmtub3duCi0gICAgICAgICAgICAgdHlwZS4gIFJhdGhlciwgbGV0J3MgbWFrZSBhIG5vdGUgb2YgaXQuICBJZiB3ZSBsYXRlcgotICAgICAgICAgICAgIHNlZSB0aGF0IHRoZXJlIHdlcmUgYWxzbyAiZ29vZCIgc2VjdGlvbnMsIHRoZW4gd2UnbGwKLSAgICAgICAgICAgICBkZWNsYXJlIHRoYXQgdGhpcyBhIGNvcmUgZmlsZSwgYnV0IHdlJ2xsIGFsc28gd2FybiB0aGF0Ci0gICAgICAgICAgICAgaXQgbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZ2RiLgotICAgICAgICAgICAgICovCi0JICB1bmtub3duX3NlY3Rpb25zKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgCi0gICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyp1bnJlY29nbml6ZWQgY29yZSBmaWxlIHR5cGUgKi8KLQl9Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIFdlcmUgdGhlcmUgc2VjdGlvbnMgb2YgdW5rbm93biB0eXBlPyAgSWYgc28sIHlldCB0aGVyZSB3ZXJlCi0gICAgIGF0IGxlYXN0IHNvbWUgY29tcGxldGUgc2VjdGlvbnMgb2Yga25vd24gdHlwZSwgdGhlbiwgaXNzdWUKLSAgICAgYSB3YXJuaW5nLiAgUG9zc2libHkgdGhlIGNvcmUgZmlsZSB3YXMgZ2VuZXJhdGVkIG9uIGEgdmVyc2lvbgotICAgICBvZiBIUC1VWCB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoYXQgZm9yIHdoaWNoIHRoaXMgZ2RiIHdhcwotICAgICBidWlsdC4KLSAgICAgKi8KLSAgaWYgKCh1bmtub3duX3NlY3Rpb25zID4gMCkgJiYgKGdvb2Rfc2VjdGlvbnMgPiAwKSkKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICgiJXMgYXBwZWFycyB0byBiZSBhIGNvcmUgZmlsZSxcbmJ1dCBjb250YWlucyB1bmtub3duIHNlY3Rpb25zLiAgSXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIG9uIGFuIGluY29tcGF0aWJsZVxudmVyc2lvbiBvZiBIUC1VWC4gIEFzIGEgcmVzdWx0LCBzb21lIGluZm9ybWF0aW9uIG1heSBiZSB1bmF2YWlsYWJsZS5cbiIsCi0gICAgICAgYWJmZC0+ZmlsZW5hbWUpOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1ocHV4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLWhwdXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1ocHV4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotI2RlZmluZSBocHV4X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGhwdXhfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaHB1eF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBocHV4X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBocHV4X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiaHB1eC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGhwdXhfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2kzODZhb3V0LmMgYi9iZmQvaTM4NmFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiMmNmZi4uMDAwMDAwMAotLS0gYS9iZmQvaTM4NmFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGUgb25seSAzODYgYW91dCBzeXN0ZW0gd2UgaGF2ZSBoZXJlIGlzIEdPMzIgZnJvbSBESi4gCi0gICBUaGVzZSBudW1iZXJzIG1ha2UgQkZEIHdvcmsgd2l0aCB0aGF0LiBJZiB5b3VyIGFvdXQgMzg2IHN5c3RlbQotICAgZG9lc24ndCB3b3JrIHdpdGggdGhlc2UsIHdlJ2xsIGhhdmUgdG8gc3BsaXQgdGhlbSBpbnRvIGRpZmZlcmVudAotICAgZmlsZXMuICBTZW5kIG1lIChzYWNAY3lnbnVzLmNvbSkgdGhlIHJ1bmVzIHRvIG1ha2UgaXQgd29yayBvbiB5b3VyCi0gICBzeXN0ZW0sIGFuZCBJJ2xsIHN0aWNrIGl0IGluIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgKi8KLQotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNkZWZpbmUgTl9UWFRPRkYoeCkgMHgyMAotI2RlZmluZSBOX1RYVEFERFIoeCkgKE5fTUFHSUMoeCk9PVpNQUdJQyA/IDB4MTAyMCA6IDApCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQotI2lmIDAKLSNkZWZpbmUgTl9EQVRBRERSKHgpIChOX01BR0lDKHgpPT1PTUFHSUM/IChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkgOiAoU0VHTUVOVF9TSVpFICsgKCgweDEwMjArKHgpLmFfdGV4dC0xKSAmIH4oU0VHTUVOVF9TSVpFLTEpKSkpCi0jZGVmaW5lIE5PU1VCRVhFQ0IKLQotI2VuZGlmCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgMHg0MDAwMDAKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZhb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4NiIKLSNkZWZpbmUgTk9fV1JJVEVfSEVBREVSX0tMVURHRSAxCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUgY29ycmVjdGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8zODYpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIFdSSVRFX0hFQURFUlMgKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgaTM4NmFvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0KLXN0YXRpYyBib29sZWFuIE1ZKHNldF9zaXplcykoKTsKLSNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIE1ZKGJhY2tlbmRfZGF0YSkgPSB7Ci0gIDAsCQkJCS8qIHptYWdpYyBjb250aWd1b3VzICovCi0gIDEsCQkJCS8qIHRleHQgaW5jbCBoZWFkZXIgKi8KLSAgMCwJCQkJLyogZW50cnkgaXMgdGV4dCBhZGRyZXNzICovCi0gIDAsCQkJCS8qIGV4ZWNfaGRyX2ZsYWdzICovCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWShzZXRfc2l6ZXMpLAotICAxLAkJCQkvKiBleGVjIGhlYWRlciBub3QgY291bnRlZCAqLwotICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCi0gIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCi0gIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KLSAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KLSAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLwotICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KLX07Ci0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZic2QuYyBiL2JmZC9pMzg2YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjhmZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcyB1bmRlciBCU0QuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBkYXRhIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgZm9ybWF0IHVzZWQgdW5kZXIgYWxsIHRoZSB2YXJpb3VzCi0gICBCU0QgcG9ydHMgZm9yIDM4NiBtYWNoaW5lcy4gICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0KLS8qIFpNQUdJQyBmaWxlcyBuZXZlciBoYXZlIHRoZSBoZWFkZXIgaW4gdGhlIHRleHQuICAqLwotI2RlZmluZQlOX0hFQURFUl9JTl9URVhUKHgpCTAKLQotLyogWk1BR0lDIGZpbGVzIHN0YXJ0IGF0IGFkZHJlc3MgMC4gIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gUU1BR0lDLiAgKi8KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODYgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2YnNkXyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1ic2QiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZkeW5peC5jIGIvYmZkL2kzODZkeW5peC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUwYTE0Li4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2ZHluaXguYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcyB1bmRlciBkeW5peC4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIEJGRCBpcyBjdXJyZW50bHkgb25seSB0ZXN0ZWQgd2l0aCBnZGIsIHdyaXRpbmcgb2JqZWN0IGZpbGVzCi0gICBtYXkgbm90IHdvcmsuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiA0MDk2Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jaW5jbHVkZSAiYW91dC9keW5peDMuaCIKLQotI2RlZmluZSBERUZBVUxUX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODYgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2ZHluaXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWR5bml4IgotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhpMzg2ZHluaXgsXzMyXyx5KQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLSNkZWZpbmUgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luIE5BTUUoaTM4NmR5bml4XzMyXyxzd2FwX2V4ZWNfaGVhZGVyX2luKQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLS8qIGFvdXR4LmggcmVxdWlyZXMgZGVmaW5pdGlvbnMgZm9yIE5NQUdJQywgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2RlZmluZSBOTUFHSUMgMAotI2RlZmluZSBCTUFHSUMgT01BR0lDCi0jZGVmaW5lIFFNQUdJQyBYTUFHSUMKLQotI2luY2x1ZGUgImFvdXR4LmgiCi0KLS8qIChBYil1c2Ugc29tZSBmaWVsZHMgaW4gdGhlIGludGVybmFsIGV4ZWMgaGVhZGVyIHRvIGJlIGFibGUgdG8gcmVhZAotICAgZXhlY3V0YWJsZXMgdGhhdCBjb250YWluIHNoYXJlZCBkYXRhLiAgKi8KLQotI2RlZmluZSBhX3NoZGF0YSBhX3Rsb2FkCi0jZGVmaW5lIGFfc2hkcnNpemUgYV9kbG9hZAotCi12b2lkCi1pMzg2ZHluaXhfMzJfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBUaGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3R1cmUgaGFzIHNvbWUgZmllbGRzIHRoYXQgYXJlIHVudXNlZCBpbiB0aGlzCi0gICAgIGNvbmZpZ3VyYXRpb24gKElFIGZvciBpOTYwKSwgc28gZW5zdXJlIHRoYXQgYWxsIHN1Y2ggdW5pbml0aWFsaXplZAotICAgICBmaWVsZHMgYXJlIHplcm8nZCBvdXQuICBUaGVyZSBhcmUgcGxhY2VzIHdoZXJlIHR3byBvZiB0aGVzZSBzdHJ1Y3RzCi0gICAgIGFyZSBtZW1jbXAnZCwgYW5kIHRodXMgdGhlIGNvbnRlbnRzIGRvIG1hdHRlci4gKi8KLSAgbWVtc2V0ICgoUFRSKSBleGVjcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpOwotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKLSAgZXhlY3AtPmFfYnNzICAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGV4ZWNwLT5hX3N5bXMgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOwotICBleGVjcC0+YV9zaGRhdGEgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc2hkYXRhKTsKLSAgZXhlY3AtPmFfc2hkcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc2hkcnNpemUpOwotfQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2ZnJlZWJzZC5jIGIvYmZkL2kzODZmcmVlYnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjM3MWIuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZmcmVlYnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEZyZWVCU0QvMzg2IGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4Nl9ORVRCU0QgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2ZnJlZWJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWZyZWVic2QiCi0KLSNpbmNsdWRlICJmcmVlYnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmxpbnV4LmMgYi9iZmQvaTM4NmxpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjJhMTEuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZsaW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzY4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgbGludXggZmxhdm9yZWQgaTM4NiBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSAxMDI0Ci0jZGVmaW5lCVNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkweDAKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZsaW51eF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtbGludXgiCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IE1ZKHZlYyk7Ci0KLS8qIFdlIGFsd2F5cyBnZW5lcmF0ZSBRTUFHSUMgZmlsZXMgaW4gcHJlZmVyZW5jZSB0byBaTUFHSUMgZmlsZXMuICBJdAotICAgd291bGQgYmUgcG9zc2libGUgdG8gbWFrZSB0aGlzIGEgbGlua2VyIG9wdGlvbiwgaWYgdGhhdCBldmVyCi0gICBiZWNvbWVzIGltcG9ydGFudC4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLXN0YXRpYyBib29sZWFuIGkzODZsaW51eF9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID0gcV9tYWdpY19mb3JtYXQ7Ci0gIHJldHVybiBOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIGkzODZsaW51eF9iZmRfZmluYWxfbGluawotCi0vKiBTZXQgdGhlIG1hY2hpbmUgdHlwZSBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8zODYpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBpMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0MCi0vKiBDb2RlIHRvIGxpbmsgYWdhaW5zdCBMaW51eCBhLm91dCBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotCi0jaWZuZGVmIEdPVF9SRUZfUFJFRklYCi0jZGVmaW5lCUdPVF9SRUZfUFJFRklYCSJfX0dPVF8iCi0jZW5kaWYKLQotI2RlZmluZSBJU19HT1RfU1lNKG5hbWUpIFwKLSAgKHN0cm5jbXAgKG5hbWUsIEdPVF9SRUZfUFJFRklYLCBzaXplb2YgR09UX1JFRl9QUkVGSVggLSAxKSA9PSAwKQotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0jaWZuZGVmIFBMVF9SRUZfUFJFRklYCi0jZGVmaW5lCVBMVF9SRUZfUFJFRklYCSJfX1BMVF8iCi0jZW5kaWYKLQotI2RlZmluZSBJU19QTFRfU1lNKG5hbWUpIFwKLSAgKHN0cm5jbXAgKG5hbWUsIFBMVF9SRUZfUFJFRklYLCBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSA9PSAwKQotCi0vKiBUaGlzIHN0cmluZyBpcyB1c2VkIHRvIGdlbmVyYXRlIHNwZWNpYWxpemVkIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotI2lmbmRlZiBORUVEU19TSFJMSUIKLSNkZWZpbmUgTkVFRFNfU0hSTElCICJfX05FRURTX1NIUkxJQl8iCi0jZW5kaWYKLQotLyogVGhpcyBzcGVjaWFsIHN5bWJvbCBpcyBhIHNldCB2ZWN0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YKLSAgIHBvaW50ZXJzIHRvIGZpeHVwIHRhYmxlcy4gIEl0IHdpbGwgYmUgcHJlc2VudCBpbiBhbnkgZHluYW1pY2x5Ci0gICBsaW5rZWQgZmlsZS4gIFRoZSBsaW5rZXIgZ2VuZXJhdGVkIGZpeHVwIHRhYmxlIHNob3VsZCBhbHNvIGJlIGFkZGVkCi0gICB0byB0aGUgbGlzdCwgYW5kIGl0IHNob3VsZCBhbHdheXMgYXBwZWFyIGluIHRoZSBzZWNvbmQgc2xvdCAodGhlCi0gICBmaXJzdCBvbmUgaXMgYSBkdW1teSB3aXRoIGEgbWFnaWMgbnVtYmVyIHRoYXQgaXMgZGVmaW5lZCBpbgotICAgY3J0MC5vKS4gICovCi0KLSNpZm5kZWYgU0hBUkFCTEVfQ09ORkxJQ1RTCi0jZGVmaW5lIFNIQVJBQkxFX0NPTkZMSUNUUyAiX19TSEFSQUJMRV9DT05GTElDVFNfXyIKLSNlbmRpZgotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBUaGUgdGVybWlub2xvZ3kgaXMgYSBiaXQgc3RyYW5nZSwgYnV0Ci0gICBlYWNoIGZpeHVwIGNvbnRhaW5zIHR3byAzMiBiaXQgbnVtYmVycy4gIEEgcmVndWxhciBmaXh1cCBjb250YWlucwotICAgYW4gYWRkcmVzcyBhbmQgYSBwb2ludGVyLCBhbmQgYXQgcnVudGltZSB3ZSBzaG91bGQgc3RvcmUgdGhlCi0gICBhZGRyZXNzIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBwb2ludGVyLiAgQSBidWlsdGluIGZpeHVwCi0gICBjb250YWlucyB0d28gcG9pbnRlcnMsIGFuZCB3ZSBzaG91bGQgcmVhZCB0aGUgYWRkcmVzcyB1c2luZyBvbmUKLSAgIHBvaW50ZXIgYW5kIHN0b3JlIGl0IGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBvdGhlcgotICAgcG9pbnRlci4gIEJ1aWx0aW4gZml4dXBzIGNvbWUgaW50byBwbGF5IHdoZW4gd2UgaGF2ZSBkdXBsaWNhdGUKLSAgIF9fR09UX18gc3ltYm9scyBmb3IgdGhlIHNhbWUgdmFyaWFibGUuICBUaGUgYnVpbHRpbiBmaXh1cCB3aWxsIGNvcHkKLSAgIHRoZSBHT1QgcG9pbnRlciBmcm9tIG9uZSBvdmVyIGludG8gdGhlIG90aGVyLiAgKi8KLQotc3RydWN0IGZpeHVwCi17Ci0gIHN0cnVjdCBmaXh1cCAqbmV4dDsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBqdW1wIGluc3RydWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQsCi0gICAgIHplcm8gaWYgdGhpcyBpcyBqdXN0IGEgcG9pbnRlciAqLwotICBjaGFyIGp1bXA7Ci0KLSAgY2hhciBidWlsdGluOwotfTsKLQotLyogV2UgZG9uJ3QgbmVlZCBhIHNwZWNpYWwgaGFzaCB0YWJsZSBlbnRyeSBzdHJ1Y3R1cmUsIGJ1dCB3ZSBkbyBuZWVkCi0gICB0byBrZWVwIHNvbWUgaW5mb3JtYXRpb24gYmV0d2VlbiBsaW5rZXIgcGFzc2VzLCBzbyB3ZSB1c2UgYSBzcGVjaWFsCi0gICBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLX07Ci0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogRmlyc3QgZHluYW1pYyBvYmplY3QgZm91bmQgaW4gbGluay4gICovCi0gIGJmZCAqZHlub2JqOwotCi0gIC8qIE51bWJlciBvZiBmaXh1cHMuICAqLwotICBzaXplX3QgZml4dXBfY291bnQ7Ci0KLSAgLyogTnVtYmVyIG9mIGJ1aWx0aW4gZml4dXBzLiAgKi8KLSAgc2l6ZV90IGxvY2FsX2J1aWx0aW5zOwotCi0gIC8qIExpc3Qgb2YgZml4dXBzLiAgKi8KLSAgc3RydWN0IGZpeHVwICpmaXh1cF9saXN0OwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbGludXhfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHN0cnVjdCBmaXh1cCAqbmV3X2ZpeHVwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfdGFsbHlfc3ltYm9scwotICBQQVJBTVMgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfZmluaXNoX2R5bmFtaWNfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCi0JIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzOyB0aGVyZSBhcmVuJ3QgYW55LiAgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICBpZiAoISBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpICgmcmV0LT5yb290LCBhYmZkLAotCQkJCQkgbGludXhfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+ZHlub2JqID0gTlVMTDsKLSAgcmV0LT5maXh1cF9jb3VudCA9IDA7Ci0gIHJldC0+bG9jYWxfYnVpbHRpbnMgPSAwOwotICByZXQtPmZpeHVwX2xpc3QgPSBOVUxMOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGFvdXRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLQkJCSAgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGFvdXRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBMaW51eCBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgbGludXhfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXcgZml4dXAuICAqLwotCi1zdGF0aWMgc3RydWN0IGZpeHVwICoKLW5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsIGJ1aWx0aW4pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBpbnQgYnVpbHRpbjsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotCi0gIGYgPSAoc3RydWN0IGZpeHVwICopIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgZml4dXApKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICByZXR1cm4gZjsKLSAgZi0+bmV4dCA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OwotICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdCA9IGY7Ci0gIGYtPmggPSBoOwotICBmLT52YWx1ZSA9IHZhbHVlOwotICBmLT5idWlsdGluID0gYnVpbHRpbjsKLSAgZi0+anVtcCA9IDA7Ci0gICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OwotICByZXR1cm4gZjsKLX0KLQotLyogV2UgY29tZSBoZXJlIG9uY2Ugd2UgcmVhbGl6ZSB0aGF0IHdlIGFyZSBnb2luZyB0byBsaW5rIHRvIGEgc2hhcmVkCi0gICBsaWJyYXJ5LiAgV2UgbmVlZCB0byBjcmVhdGUgYSBzcGVjaWFsIHNlY3Rpb24gdGhhdCBjb250YWlucyB0aGUKLSAgIGZpeHVwIHRhYmxlLCBhbmQgd2UgdWx0aW1hdGVseSBuZWVkIHRvIGFkZCBhIHBvaW50ZXIgdG8gdGhpcyBpbnRvCi0gICB0aGUgc2V0IHZlY3RvciBmb3IgU0hBUkFCTEVfQ09ORkxJQ1RTLiAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QKLSAgIGtub3cgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24sIGJ1dCB0aGF0J3MgT0sgLSB3ZSBqdXN0IG5lZWQgdG8KLSAgIGNyZWF0ZSBpdCBmb3Igbm93LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotCi0gIC8qIE5vdGUgdGhhdCB3ZSBzZXQgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZy4gICovCi0gIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLQotICAvKiBXZSBjaG9vc2UgdG8gdXNlIHRoZSBuYW1lICIubGludXgtZHluYW1pYyIgZm9yIHRoZSBmaXh1cCB0YWJsZS4KLSAgICAgV2h5IG5vdD8gKi8KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcy0+X3Jhd19zaXplID0gMDsKLSAgcy0+Y29udGVudHMgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBhZGQgYSBzaW5nbGUgc3ltYm9sIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoaXMgaXMKLSAgIGEgd3JhcHBlciBhcm91bmQgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgd2hpY2ggaGFuZGxlcyB0aGUKLSAgIHR3ZWFraW5nIG5lZWRlZCBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLAotCQkgICAgICBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGluc2VydDsKLQotICAvKiBMb29rIHVwIGFuZCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLgotICAgICBJZiB3ZSBkbywgYW5kIHRoZSBkZWZpbmluZyBlbnRyeSBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHdlCi0gICAgIG5lZWQgdG8gY3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zLgotCi0gICAgIEZJWE1FOiBXaGF0IGlmIGFiZmQtPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcj8gIFdlIG1heSB3YW50IHRvCi0gICAgIGJlIGFibGUgdG8gbGluayBMaW51eCBhLm91dCBhbmQgRUxGIG9iamVjdHMgdG9nZXRoZXIsIGJ1dCBzZXJpb3VzCi0gICAgIGNvbmZ1c2lvbiBpcyBwb3NzaWJsZS4gICovCi0KLSAgaW5zZXJ0ID0gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgU0hBUkFCTEVfQ09ORkxJQ1RTKSA9PSAwCi0gICAgICAmJiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBpZiAoISBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgICAgIGluc2VydCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCBmYWxzZSwKLQkJCQkgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLQkgIGlmIChoYXNocCAhPSBOVUxMKQotCSAgICAqaGFzaHAgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCSAgZiA9IG5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsICEgSVNfUExUX1NZTSAobmFtZSkpOwotCSAgaWYgKGYgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZi0+anVtcCA9IElTX1BMVF9TWU0gKG5hbWUpOwotCi0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCi0gIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLQkJCQkJICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAotCQkJCQkgIGhhc2hwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSW5zZXJ0IGEgcG9pbnRlciB0byBvdXIgdGFibGUgaW4gdGhlIHNldCB2ZWN0b3IuICBUaGUgZHluYW1pYwotICAgICBsaW5rZXIgcmVxdWlyZXMgdGhpcyBpbmZvcm1hdGlvbiAqLwotICBpZiAoaW5zZXJ0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBIZXJlIHdlIGRvIG91ciBzcGVjaWFsIHRoaW5nIHRvIGFkZCB0aGUgcG9pbnRlciB0byB0aGUKLQkgZHluYW1pYyBzZWN0aW9uIGluIHRoZSBTSEFSQUJMRV9DT05GTElDVFMgc2V0IHZlY3Rvci4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkJICAgIi5saW51eC1keW5hbWljIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCBTSEFSQUJMRV9DT05GTElDVFMsCi0JICAgICAgQlNGX0dMT0JBTCB8IEJTRl9DT05TVFJVQ1RPUiwgcywgMCwgTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2Ugd2lsbCBjcmF3bCB0aGUgaGFzaCB0YWJsZSBhbmQgY29tZSBoZXJlIGZvciBldmVyeSBnbG9iYWwgc3ltYm9sLgotICAgV2Ugd2lsbCBleGFtaW5lIGVhY2ggZW50cnkgYW5kIHNlZSBpZiB0aGVyZSBhcmUgaW5kaWNhdGlvbnMgdGhhdCB3ZQotICAgbmVlZCB0byBhZGQgYSBmaXh1cC4gIFRoZXJlIGFyZSB0d28gcG9zc2libGUgY2FzZXMgLSBvbmUgaXMgd2hlcmUKLSAgIHlvdSBoYXZlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBvZiBQTFQgb3IgR09UIHN5bWJvbHMgLSB0aGVzZSB3aWxsCi0gICBoYXZlIGFscmVhZHkgYmVlbiBjYXVnaHQgYW5kIGFkZGVkIGFzICJidWlsdGluIiBmaXh1cHMuICBJZiB3ZSBmaW5kCi0gICB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIG5vbiBQTFQvR09UIHN5bWJvbCBpcyBhbHNvIHByZXNlbnQsIHdlCi0gICBjb252ZXJ0IGl0IHRvIGEgcmVndWxhciBmaXh1cCBpbnN0ZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgbGludXhfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X3RhbGx5X3N5bWJvbHMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgZml4dXAgKmYsICpmMTsKLSAgaW50IGlzX3BsdDsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDEsICpoMjsKLSAgYm9vbGVhbiBleGlzdHM7Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiBzdHJuY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIE5FRURTX1NIUkxJQiwKLQkJICBzaXplb2YgTkVFRFNfU0hSTElCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciAqcDsKLSAgICAgIGNoYXIgKmFsbG9jID0gTlVMTDsKLQotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyArIHNpemVvZiBORUVEU19TSFJMSUIgLSAxOwotICAgICAgcCA9IHN0cnJjaHIgKG5hbWUsICdfJyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotCWFsbG9jID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotCi0gICAgICBpZiAocCA9PSBOVUxMIHx8IGFsbG9jID09IE5VTEwpCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iKSwKLQkJCSAgICAgICBuYW1lKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJjcHkgKGFsbG9jLCBuYW1lKTsKLQkgIHAgPSBzdHJyY2hyIChhbGxvYywgJ18nKTsKLQkgICpwKysgPSAnXDAnOwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMuc28uJXMnXG4iKSwKLQkgICAgIGFsbG9jLCBwKTsKLQkgIGZyZWUgKGFsbG9jKTsKLQl9Ci0KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgYSBQTFQvR09ULCB3ZSBkbyBub3QgZXZlbiBuZWVkIHRvIGxvb2sgYXQgaXQgKi8KLSAgaXNfcGx0ID0gSVNfUExUX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQotICBpZiAoaXNfcGx0IHx8IElTX0dPVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZykpCi0gICAgewotICAgICAgLyogTG9vayB1cCB0aGlzIHN5bWJvbCB0d2ljZS4gIE9uY2UganVzdCBhcyBhIHJlZ3VsYXIgbG9va3VwLAotCSBhbmQgdGhlbiBhZ2FpbiBmb2xsb3dpbmcgYWxsIG9mIHRoZSBpbmRpcmVjdCBsaW5rcyB1bnRpbCB3ZQotCSByZWFjaCBhIHJlYWwgc3ltYm9sLiAgKi8KLSAgICAgIGgxID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAvKiBoMiBkb2VzIG5vdCBmb2xsb3cgaW5kaXJlY3Qgc3ltYm9scy4gKi8KLSAgICAgIGgyID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJCSAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLQkJCQkgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogVGhlIHJlYWwgc3ltYm9sIG11c3QgZXhpc3QgYnV0IGlmIGl0IGlzIGFsc28gYW4gQUJTIHN5bWJvbCwKLQkgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgZml4dXAuICBUaGlzIGlzIGJlY2F1c2UgdGhleSBib3RoCi0JIGNhbWUgZnJvbSB0aGUgc2FtZSBsaWJyYXJ5LiAgSWYgb24gdGhlIG90aGVyIGhhbmQsIHdlIGhhZCB0bwotCSB1c2UgYW4gaW5kaXJlY3Qgc3ltYm9sIHRvIGdldCB0byB0aGUgcmVhbCBzeW1ib2wsIHdlIGFkZCB0aGUKLQkgZml4dXAgYW55d2F5LCBzaW5jZSB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlc2Ugc3ltYm9scyBjb21lCi0JIGZyb20gZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJpZXMgKi8KLSAgICAgIGlmIChoMSAhPSBOVUxMCi0JICAmJiAoKChoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCXx8IGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoMS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCSAgICAgIHx8IGgyLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KSkKLQl7Ci0JICAvKiBTZWUgaWYgdGhlcmUgaXMgYSAiYnVpbHRpbiIgZml4dXAgYWxyZWFkeSBwcmVzZW50Ci0JICAgICBpbnZvbHZpbmcgdGhpcyBzeW1ib2wuICBJZiBzbywgY29udmVydCBpdCB0byBhIHJlZ3VsYXIKLQkgICAgIGZpeHVwLiAgSW4gdGhlIGVuZCwgdGhpcyByZWxheGVzIHNvbWUgb2YgdGhlIHJlcXVpcmVtZW50cwotCSAgICAgYWJvdXQgdGhlIG9yZGVyIG9mIHBlcmZvcm1pbmcgZml4dXBzLiAgKi8KLQkgIGV4aXN0cyA9IGZhbHNlOwotCSAgZm9yIChmMSA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OwotCSAgICAgICBmMSAhPSBOVUxMOwotCSAgICAgICBmMSA9IGYxLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKChmMS0+aCAhPSBoICYmIGYxLT5oICE9IGgxKQotCQkgIHx8ICghIGYxLT5idWlsdGluICYmICEgZjEtPmp1bXApKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoZjEtPmggPT0gaDEpCi0JCWV4aXN0cyA9IHRydWU7Ci0JICAgICAgaWYgKCEgZXhpc3RzCi0JCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JCXsKLQkJICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgZjEtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0JCSAgZi0+anVtcCA9IGlzX3BsdDsKLQkJfQotCSAgICAgIGYxLT5oID0gaDE7Ci0JICAgICAgZjEtPmp1bXAgPSBpc19wbHQ7Ci0JICAgICAgZjEtPmJ1aWx0aW4gPSAwOwotCSAgICAgIGV4aXN0cyA9IHRydWU7Ci0JICAgIH0KLQkgIGlmICghIGV4aXN0cwotCSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0JICAgICAgaWYgKGYgPT0gTlVMTCkKLQkJewotCQkgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFF1aWNrIGFuZCBkaXJ0eSB3YXkgb2Ygc3RyaXBwaW5nIHRoZXNlIHN5bWJvbHMgZnJvbSB0aGUKLQkgc3ltdGFiLiAqLwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCWgtPnJvb3Qud3JpdHRlbiA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIC5saW51eC1keW5hbWljIHNlY3Rpb24gaXMuCi0gICBJdCBpcyBjYWxsZWQgYnkgdGhlIExpbnV4IGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24KLSAgIHJvdXRpbmUuICBXZSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgYW5kIG5vdwotICAgd2UganVzdCBzY2FuIHRoZSBoYXNoIHRhYmxlcyB0byBmaW5kIG91dCBob3cgbWFueSBhZGRpdGlvbmFsIGZpeHVwcwotICAgYXJlIHJlcXVpcmVkLiAgKi8KLQotYm9vbGVhbgotYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRmlyc3QgZmluZCB0aGUgZml4dXBzLi4uICovCi0gIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgbGludXhfdGFsbHlfc3ltYm9scywKLQkJCSAgICAoUFRSKSBpbmZvKTsKLQotICAvKiBJZiB0aGVyZSBhcmUgYnVpbHRpbiBmaXh1cHMsIGxlYXZlIHJvb20gZm9yIGEgbWFya2VyLiAgVGhpcyBpcwotICAgICB1c2VkIGJ5IHRoZSBkeW5hbWljIGxpbmtlciBzbyB0aGF0IGl0IGtub3dzIHRoYXQgYWxsIHRoYXQgZm9sbG93Ci0gICAgIGFyZSBidWlsdGluIGZpeHVwcyBpbnN0ZWFkIG9mIHJlZ3VsYXIgZml4dXBzLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JewotCSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGluczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBmaXh1cCB0YWJsZS4gIFdlIHdpbGwgZmlsbCBpdCBpbiBsYXRlci4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCSAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzLT5fcmF3X3NpemUgPSA4ICsgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICogODsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSBhcmUgcmVhZHkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGZpeHVwIHRhYmxlIHRvCi0gICB0aGUgb3V0cHV0IGZpbGUuICBTY2FuIHRoZSBmaXh1cCB0YWJsZXMgYW5kIHNvIGZvcnRoIGFuZCBnZW5lcmF0ZQotICAgdGhlIHN0dWZmIHdlIG5lZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfZmluaXNoX2R5bmFtaWNfbGluayAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnMsICpvcywgKmlzOwotICBiZmRfYnl0ZSAqZml4dXBfdGFibGU7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgdW5zaWduZWQgaW50IG5ld19hZGRyOwotICBpbnQgc2VjdGlvbl9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBmaXh1cHNfd3JpdHRlbjsKLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCSAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKLSAgZml4dXBzX3dyaXR0ZW4gPSAwOwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICBwcmludGYgKCJGaXh1cCB0YWJsZSBmaWxlIG9mZnNldDogJXggIFZNQTogJXhcbiIsIAotCSAgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCSAgb3MtPnZtYSArIHMtPm91dHB1dF9vZmZzZXQpOwotI2VuZGlmCi0KLSAgZml4dXBfdGFibGUgPSBzLT5jb250ZW50czsKLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50LCBmaXh1cF90YWJsZSk7Ci0gIGZpeHVwX3RhYmxlICs9IDQ7Ci0KLSAgLyogRmlsbCBpbiBmaXh1cCB0YWJsZS4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0JICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkZpeHVwKCVkKSAlczogJXggJXhcbiIsZi0+anVtcCwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLQkgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLSAgICAgIGlmIChmLT5qdW1wKQotCXsKLQkgIC8qIFJlbGF0aXZlIGFkZHJlc3MgKi8KLQkgIG5ld19hZGRyID0gbmV3X2FkZHIgLSAoZi0+dmFsdWUgKyA1KTsgCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlICsgMSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQl9Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zICE9IDApCi0gICAgewotICAgICAgLyogU3BlY2lhbCBtYXJrZXIgc28gd2Uga25vdyB0byBzd2l0Y2ggdG8gdGhlIG90aGVyIHR5cGUgb2YgZml4dXAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotCXsKLQkgIGlmICghIGYtPmJ1aWx0aW4pCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0JCSBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0JICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotCSAgcHJpbnRmICgiRml4dXAoQikgJXM6ICV4ICV4XG4iLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCQkgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgICsrZml4dXBzX3dyaXR0ZW47Ci0JfQotICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAhPSBmaXh1cHNfd3JpdHRlbikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iKSk7Ci0gICAgICB3aGlsZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gZml4dXBzX3dyaXR0ZW4pCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICArK2ZpeHVwc193cml0dGVuOwotCX0KLSAgICB9Ci0KLSAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCSAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAotCQkJICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICBpcyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkJ1aWx0aW4gZml4dXAgdGFibGUgYXQgJXhcbiIsIG5ld19hZGRyKTsKLSNlbmRpZgotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgIH0KLSAgZWxzZQotICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIG91dHB1dF9iZmQpCi0gICAgICAhPSBzLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgbGludXhfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0KLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bHlueC5jIGIvYmZkL2kzODZseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTlkZDAuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzIHVuZGVyIEx5bnhPUy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWx5bngiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBXUklURV9IRUFERVJTCi0jZGVmaW5lIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApCQkJCQkgICAgICBcCi0gICAgICB7CQkJCQkJCQkJICAgICAgXAotCWJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJICAgICAgXAotCWZpbGVfcHRyIHRleHRfZW5kOwkJCQkJCSAgICAgIFwKLQlpZiAoYWRhdGEoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQkJCSAgICAgIFwKLQkgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOyAgICAgXAotICAgIAkJCQkJCQkJCSAgICAgIFwKLQlleGVjcC0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwkgICAgICBcCi0JZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwkJCSAgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICAgICBcCi0JCQkgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJICAgICAgXAotCWV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgICAgIFwKLQlpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkgICAgICBcCi0JICAgICE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgICAgIFwKLQkvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgICAgXAotICAJCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCi0JICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAgICAgXAotCQkgICE9IDApCQkJCQkJCSAgICAgIFwKLQkgICAgICAgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKCEgTkFNRShhb3V0LHdyaXRlX3N5bXMpKGFiZmQpKSByZXR1cm4gZmFsc2U7CQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKLQkJICAhPSAwKQkJCQkJCQkgICAgICBcCi0JICAgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICAgIGlmICghTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkgICBcCi0JCXJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKLQkJICAhPSAwKQkJCQkJCQkgICAgICBcCi0JICAgICAgICByZXR1cm4gMDsJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKCFOQU1FKGx5bngsc3F1aXJ0X291dF9yZWxvY3MpKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpICAgIFwKLQkJcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkgICAgfQkJCQkJCQkJICAgICAgXAotICAgICAgfQotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2lmZGVmIExZTlhfQ09SRQotCi1jaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCAoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotDAotCi0jZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCi0KLWV4dGVybiByZWxvY19ob3d0b190eXBlIGFvdXRfMzJfZXh0X2hvd3RvX3RhYmxlW107Ci1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhb3V0XzMyX3N0ZF9ob3d0b190YWJsZVtdOwotCi0vKiBTdGFuZGFyZCByZWxvYyBzdHVmZiAqLwotLyogT3V0cHV0IHN0YW5kYXJkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLwotCi12b2lkCi1OQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIHVuc2lnbmVkIGludCByX2FkZGVuZDsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRCAoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemU7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLSAgcl9wY3JlbCA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsJLyogUmVsYXRpdmUgdG8gUEM/ICovCi0gIC8qIHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZT8/PyAgRklYTUUtc29vbiAqLwotICByX2Jhc2VyZWwgPSAwOwotICByX2ptcHRhYmxlID0gMDsKLSAgcl9yZWxhdGl2ZSA9IDA7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqZy0+c3ltX3B0cl9wdHIpLT5LRUVQSVQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCXwgKHJfcGNyZWwgPyBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCXwgKHJfYmFzZXJlbCA/IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHIDogMCkKLQl8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHIDogMCkKLQl8IChyX3JlbGF0aXZlID8gUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHIDogMCkKLQl8IChyX2xlbmd0aCA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkocl9leHRlcm4gPyBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFIDogMCkKLQl8IChyX3BjcmVsID8gUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQl8IChyX2Jhc2VyZWwgPyBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSA6IDApCi0JfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSA6IDApCi0JfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSA6IDApCi0JfCAocl9sZW5ndGggPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotfQotCi0KLS8qIEV4dGVuZGVkIHN0dWZmICovCi0vKiBPdXRwdXQgZXh0ZW5kZWQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhIGZpbGUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICovCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfZXh0ZXJuID0gMTsKLQkgIHJfaW5kZXggPSAoKmctPnN5bV9wdHJfcHRyKS0+S0VFUElUOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCXwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKHJfZXh0ZXJuID8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCi0JfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLSAgICB9Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIHJfYWRkZW5kLCBuYXRwdHItPnJfYWRkZW5kKTsKLX0KLQotLyogQkZEIGRlYWxzIGludGVybmFsbHkgd2l0aCBhbGwgdGhpbmdzIGJhc2VkIGZyb20gdGhlIHNlY3Rpb24gdGhleSdyZQotICAgaW4uIHNvLCBzb21ldGhpbmcgaW4gMTAgYnl0ZXMgaW50byBhIHRleHQgc2VjdGlvbiAgd2l0aCBhIGJhc2Ugb2YKLSAgIDUwIHdvdWxkIGhhdmUgYSBzeW1ib2wgKC50ZXh0KzEwKSBhbmQga25vdyAudGV4dCB2bWEgd2FzIDUwLgotCi0gICBBb3V0IGtlZXBzIGFsbCBpdCdzIHN5bWJvbHMgYmFzZWQgZnJvbSB6ZXJvLCBzbyB0aGUgc3ltYm9sIHdvdWxkCi0gICBjb250YWluIDYwLiBUaGlzIG1hY3JvIHN1YnMgdGhlIGJhc2Ugb2YgZWFjaCBzZWN0aW9uIGZyb20gdGhlIHZhbHVlCi0gICB0byBnaXZlIHRoZSB0cnVlIG9mZnNldCBmcm9tIHRoZSBzZWN0aW9uICovCi0KLQotI2RlZmluZSBNT1ZFX0FERFJFU1MoYWQpICAgICAgIAkJCQkJCVwKLSAgaWYgKHJfZXh0ZXJuKSB7CQkJCQkJCVwKLSAgIC8qIHVuZGVmaW5lZCBzeW1ib2wgKi8JCQkJCQlcCi0gICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgcl9pbmRleDsJCQlcCi0gICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAotICAgICB9IGVsc2UgewkJCQkJCQkJXAotICAgIC8qIGRlZmluZWQsIHNlY3Rpb24gcmVsYXRpdmUuIHJlcGxhY2Ugc3ltYm9sIHdpdGggcG9pbnRlciB0byAgICAJXAotICAgICAgIHN5bWJvbCB3aGljaCBwb2ludHMgdG8gc2VjdGlvbiAgKi8JCQkJXAotICAgIHN3aXRjaCAocl9pbmRleCkgewkJCQkJCQlcCi0gICAgY2FzZSBOX1RFWFQ6CQkJCQkJCVwKLSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkICAtIHN1LT50ZXh0c2VjLT52bWE7CQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgY2FzZSBOX0RBVEE6CQkJCQkJCVwKLSAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX2RhdGFzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmRhdGFzZWMtPnZtYTsJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIE5fQlNTOgkJCQkJCQkJXAotICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfYnNzc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAtIHN1LT5ic3NzZWMtPnZtYTsJCQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgZGVmYXVsdDoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQUJTOgkJCQkJCQkJXAotICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoJCQkJCQkJXAotICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgfSAgICAgCQkJCQkJCQlcCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gKEdFVF9TV09SRCAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcykpOwotCi0gIHJfaW5kZXggPSBieXRlcy0+cl9pbmRleFsxXTsKLSAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHKSk7Ci0gIHJfdHlwZSA9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKQotICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHOwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSBhb3V0XzMyX2V4dF9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgTU9WRV9BRERSRVNTIChHRVRfU1dPUkQgKGFiZmQsIGJ5dGVzLT5yX2FkZGVuZCkpOwotfQotCi12b2lkCi1OQU1FKGx5bngsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9iYXNlcmVsLCByX2ptcHRhYmxlLCByX3JlbGF0aXZlOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0KLSAgcl9pbmRleCA9IGJ5dGVzLT5yX2luZGV4WzFdOwotICByX2V4dGVybiA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgcl9wY3JlbCA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICByX2Jhc2VyZWwgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRykpOwotICByX2ptcHRhYmxlID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKSk7Ci0gIHJfcmVsYXRpdmUgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcpKTsKLSAgcl9sZW5ndGggPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQotICAgID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUc7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IGFvdXRfMzJfc3RkX2hvd3RvX3RhYmxlICsgcl9sZW5ndGggKyA0ICogcl9wY3JlbDsKLSAgLyogRklYTUUtc29vbjogIFJvbGwgYmFzZXJlbCwgam1wdGFibGUsIHJlbGF0aXZlIGJpdHMgaW50byBob3d0byBzZXR0aW5nICovCi0KLSAgTU9WRV9BRERSRVNTICgwKTsKLX0KLQotLyogUmVsb2MgaGFja2VyeSAqLwotCi1ib29sZWFuCi1OQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7Ci0gIFBUUiByZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotICBzaXplX3QgZWFjaF9zaXplOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotZG9pdDoKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotCi0gIGNvdW50ID0gcmVsb2Nfc2l6ZSAvIGVhY2hfc2l6ZTsKLQotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX21hbGxvYyAoY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgaWYgKCFyZWxvY19jYWNoZSAmJiBjb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtc2V0IChyZWxvY19jYWNoZSwgMCwgY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvY3MgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jcyAmJiByZWxvY19zaXplICE9IDApCi0gICAgewotICAgICAgZnJlZSAocmVsb2NfY2FjaGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKHJlbG9jcywgMSwgcmVsb2Nfc2l6ZSwgYWJmZCkgIT0gcmVsb2Nfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NzKTsKLSAgICAgIGZyZWUgKHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVhY2hfc2l6ZSA9PSBSRUxPQ19FWFRfU0laRSkKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpycHRyID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2NzOwotICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgICAgYXJlbGVudCAqY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7Ci0KLSAgICAgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLQl7Ci0JICBOQU1FKGx5bngsc3dhcF9leHRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcnB0ciA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHJlbG9jczsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgICAgIGFyZWxlbnQgKmNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotCi0gICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0JewotCSAgTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgcnB0ciwgY2FjaGVfcHRyLCBzeW1ib2xzLAotCQkJCQliZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0JfQotCi0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0vKiBXcml0ZSBvdXQgYSByZWxvY2F0aW9uIHNlY3Rpb24gaW50byBhbiBvYmplY3QgZmlsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUobHlueCxzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICB1bnNpZ25lZCBjaGFyICpuYXRpdmUsICpuYXRwdHI7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0KLSAgdW5zaWduZWQgaW50IGNvdW50ID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIHNpemVfdCBuYXRzaXplOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OwotICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKLSAgaWYgKCFuYXRpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKG5hdHB0ciA9IG5hdGl2ZTsKLQkgICBjb3VudCAhPSAwOwotCSAgIC0tY291bnQsIG5hdHB0ciArPSBlYWNoX3NpemUsICsrZ2VuZXJpYykKLQlOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgKmdlbmVyaWMsIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIG5hdHB0cik7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5hdGl2ZSwgMSwgbmF0c2l6ZSwgYWJmZCkgIT0gbmF0c2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgbmF0aXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIHN0dXBpZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgYm9vbGVhbiBwcmVkaWNhdGUgKi8KLWxvbmcKLU5BTUUobHlueCxjYW5vbmljYWxpemVfcmVsb2MpIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlmICghKHRibHB0ciB8fCBOQU1FKGx5bngsc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCi0JewotCSAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0JICBjaGFpbiA9IGNoYWluLT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLQl7Ci0JICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQl9Ci0gICAgfQotICAqcmVscHRyID0gMDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX3JlbG9jIE5BTUUobHlueCxjYW5vbmljYWxpemVfcmVsb2MpCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZtYWNoMy5jIGIvYmZkL2kzODZtYWNoMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmY3NTgyLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2bWFjaDMuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpcyBmb3IgTWFjaCAzLCB3aGljaCB1c2VzIGEub3V0LCBub3QgTWFjaC1PLiAgKi8KLQotLyogVGhlcmUgaXMgbm8gbWFnaWMgbnVtYmVyIG9yIGFueXRoaW5nIHdoaWNoIGxldHMgdXMgZGlzdGluZ3Vpc2ggdGhpcyB0YXJnZXQKLSAgIGZyb20gaTM4NmFvdXQgb3IgaTM4NmJzZC4gIFNvIHRoaXMgdGFyZ2V0IGlzIG9ubHkgdXNlZnVsIGlmIGl0IGlzIHRoZQotICAgZGVmYXVsdCB0YXJnZXQuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJMQotI2RlZmluZQlTRUdNRU5UX1NJWkUJMHgxMDAwCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkweDEwMDAwCi0jZGVmaW5lIEFSQ0ggMzIKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0vKiBUaGlzIG1hY3JvIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBOX01BR0lDKHgpID09IFpNQUdJQy4gICovCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkJMQotCi0jZGVmaW5lIE5fVFhUU0laRSh4KQkoKHgpLmFfdGV4dCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2bWFjaDNfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tYWNoMyIKLQotc3RhdGljIGJvb2xlYW4gTVkoc2V0X3NpemVzKSgpOwotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEgJk1ZKGJhY2tlbmRfZGF0YSkKLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgMCwJCQkJLyogem1hZ2ljIGNvbnRpZ3VvdXMgKi8KLSAgMSwJCQkJLyogdGV4dCBpbmNsIGhlYWRlciAqLwotICAwLAkJCQkvKiBlbnRyeSBpcyB0ZXh0IGFkZHJlc3MgKi8KLSAgMCwJCQkJLyogZXhlY19oZHJfZmxhZ3MgKi8KLSAgMCwJCQkJLyogdGV4dCB2bWE/ICovCi0gIE1ZKHNldF9zaXplcyksCi0gIDEsCQkJCS8qIGV4ZWMgaGVhZGVyIG5vdCBjb3VudGVkICovCi0gIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KLSAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KLSAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLwotICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLwotICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCi0gIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLwotfTsKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4Nm1zZG9zLmMgYi9iZmQvaTM4Nm1zZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWM4NjQuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZtc2Rvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTVMtRE9TIGV4ZWN1dGFibGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEJyeWFuIEZvcmQgb2YgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaC4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2lmIDAKLXN0cnVjdCBleGVfaGVhZGVyCi17Ci0JdW5zaWduZWQgc2hvcnQgbWFnaWM7Ci0JdW5zaWduZWQgc2hvcnQgYnl0ZXNfaW5fbGFzdF9wYWdlOwotCXVuc2lnbmVkIHNob3J0IG5wYWdlczsJLyogbnVtYmVyIG9mIDUxMi1ieXRlICJwYWdlcyIgaW5jbHVkaW5nIHRoaXMgaGVhZGVyICovCi0JdW5zaWduZWQgc2hvcnQgbnJlbG9jczsKLQl1bnNpZ25lZCBzaG9ydCBoZWFkZXJfcGFyYXM7CS8qIG51bWJlciBvZiAxNi1ieXRlIHBhcmFncmFwaHMgaW4gaGVhZGVyICovCi0JdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQ7Ci0JdW5zaWduZWQgc2hvcnQgbG9hZF9zd2l0Y2g7Ci0JdW5zaWduZWQgc2hvcnQgc3Nfb2ZzOwotCXVuc2lnbmVkIHNob3J0IHNwOwotCXVuc2lnbmVkIHNob3J0IGNoZWNrc3VtOwotCXVuc2lnbmVkIHNob3J0IGlwOwotCXVuc2lnbmVkIHNob3J0IGNzX29mczsKLQl1bnNpZ25lZCBzaG9ydCByZWxvY19vZnM7Ci0JdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQyOwotCXVuc2lnbmVkIHNob3J0IHNvbWV0aGluZzE7Ci0JdW5zaWduZWQgc2hvcnQgc29tZXRoaW5nMjsKLQl1bnNpZ25lZCBzaG9ydCBzb21ldGhpbmczOwotfTsKLSNlbmRpZgotCi0jZGVmaW5lIEVYRV9NQUdJQwkweDVhNGQKLSNkZWZpbmUgRVhFX0xPQURfSElHSAkweDAwMDAKLSNkZWZpbmUgRVhFX0xPQURfTE9XCTB4ZmZmZgotI2RlZmluZSBFWEVfUEFHRV9TSVpFCTUxMgotCi0KLXN0YXRpYyBpbnQKLW1zZG9zX3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBleGVjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbXNkb3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBjaGFyIGhkcltFWEVfUEFHRV9TSVpFXTsKLSAgZmlsZV9wdHIgb3V0ZmlsZV9zaXplID0gc2l6ZW9mKGhkcik7Ci0gIGJmZF92bWEgaGlnaF92bWEgPSAwOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIC8qIEZpbmQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHByb2dyYW0gb24gZGlzayBhbmQgaW4gbWVtb3J5LiAgKi8KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSA9PSAwKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpCi0gICAgICAgIHsKLQkgIGJmZF92bWEgc2VjX3ZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkgIAkJICAgICsgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpOwotCSAgaWYgKHNlY192bWEgPiBoaWdoX3ZtYSkKLQkgICAgaGlnaF92bWEgPSBzZWNfdm1hOwotCX0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfTE9BRCkKLSAgICAgICAgewotCSAgZmlsZV9wdHIgc2VjX2VuZCA9IHNpemVvZihoZHIpCi0JICAJCSAgICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpOwotCSAgaWYgKHNlY19lbmQgPiBvdXRmaWxlX3NpemUpCi0JICAgIG91dGZpbGVfc2l6ZSA9IHNlY19lbmQ7Ci0JfQotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhlIHByb2dyYW0gaXNuJ3QgdG9vIGJpZy4gICovCi0gIGlmIChoaWdoX3ZtYSA+IChiZmRfdm1hKTB4ZmZmZikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBjb25zdGFudHMgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIEVYRV9NQUdJQywgJmhkclswXSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBFWEVfUEFHRV9TSVpFIC8gMTYsICZoZHJbOF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgRVhFX0xPQURfTE9XLCAmaGRyWzEyXSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAweDNlLCAmaGRyWzI0XSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAweDAwMDEsICZoZHJbMjhdKTsgLyogWFhYPz8/ICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAweDMwZmIsICZoZHJbMzBdKTsgLyogWFhYPz8/ICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAweDcyNmEsICZoZHJbMzJdKTsgLyogWFhYPz8/ICovCi0KLSAgLyogYnl0ZXMgaW4gbGFzdCBwYWdlICgwID0gZnVsbCBwYWdlKSAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgb3V0ZmlsZV9zaXplICYgKEVYRV9QQUdFX1NJWkUgLSAxKSwgJmhkclsyXSk7Ci0KLSAgLyogbnVtYmVyIG9mIHBhZ2VzICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAob3V0ZmlsZV9zaXplICsgRVhFX1BBR0VfU0laRSAtIDEpIC8gRVhFX1BBR0VfU0laRSwKLSAgCSAgICAgICAmaGRyWzRdKTsKLQotICAvKiBTZXQgdGhlIGluaXRpYWwgc3RhY2sgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBic3MuCi0gICAgIFRoZSBwcm9ncmFtJ3MgY3J0MCBjb2RlIG11c3QgcmVsb2NhdGUgaXQgdG8gYSByZWFsIHN0YWNrLiAgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGhpZ2hfdm1hLCAmaGRyWzE2XSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKGhkciwgMSwgc2l6ZW9mKGhkciksIGFiZmQpICE9IHNpemVvZihoZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW1zZG9zX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlY3Rpb24tPmZpbGVwb3MgPSBFWEVfUEFHRV9TSVpFICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbikgJiBTRUNfTE9BRCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLSNkZWZpbmUgbXNkb3NfbWtvYmplY3QgYW91dF8zMl9ta29iamVjdAotI2RlZmluZSBtc2Rvc19tYWtlX2VtcHR5X3N5bWJvbCBhb3V0XzMyX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIG1zZG9zX2JmZF9yZWxvY190eXBlX2xvb2t1cCBhb3V0XzMyX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUJbXNkb3NfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIG1zZG9zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBtc2Rvc19uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIG1zZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBtc2Rvc19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIG1zZG9zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbXNkb3NfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBtc2Rvc19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgbXNkb3NfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgbXNkb3NfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgbXNkb3NfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgbXNkb3NfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIG1zZG9zX3NldF9hcmNoX21hY2ggX2JmZF9nZW5lcmljX3NldF9hcmNoX21hY2gKLQotI2RlZmluZSBtc2Rvc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgbXNkb3NfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIG1zZG9zX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgbXNkb3NfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBtc2Rvc19maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBtc2Rvc19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgbXNkb3NfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgbXNkb3NfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBtc2Rvc19yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgbXNkb3NfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBtc2Rvc19jYW5vbmljYWxpemVfcmVsb2MgX2JmZF9ub3JlbG9jc19jYW5vbmljYWxpemVfcmVsb2MKLSNkZWZpbmUgbXNkb3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfbm9yZWxvY3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIG1zZG9zXzMyX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCBpMzg2bXNkb3NfdmVjID0KLXsKLSAgIm1zZG9zIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEVYRUNfUCksCQkJLyogb2JqZWN0IGZsYWdzICovCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBtc2Rvc19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgbXNkb3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAobXNkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAobXNkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAobXNkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvYmZkL2kzODZuZXRic2QuYyBiL2JmZC9pMzg2bmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyN2I2ZjkuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lCURFRkFVTFRfTUlEIAlNXzM4Nl9ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2b3M5ay5jIGIvYmZkL2kzODZvczlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWRlZTUuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZvczlrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBvczkwMDAgaTM4NiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotI2luY2x1ZGUgIm9zOWsuaCIKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKm9zOWtfY2FsbGJhY2sgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIHRha2VuIGZyb20gYSByYXcgYnl0ZQotICAgc3RyZWFtIG1lbW9yeSBpbWFnZSwgaW50byB0aGUgaW50ZXJuYWwgZXhlY19oZWFkZXIgc3RydWN0dXJlLiAgKi8KLWJvb2xlYW4KLW9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBtaF9jb20gKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBtaF9jb20gKmJ5dGVzID0gKG1oX2NvbSAqKSByYXdfYnl0ZXM7Ci0gIHVuc2lnbmVkIGludCBkbG9hZCwgZG1lbXNpemUsIGRtZW1zdGFydDsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBieXRlcy0+bV9zeW5jKTsKLSAgZXhlY3AtPmFfc3ltcyA9IDA7Ci0gIGV4ZWNwLT5hX2VudHJ5ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+bV9leGVjKTsKLSAgZXhlY3AtPmFfdGFsaWduID0gMjsKLSAgZXhlY3AtPmFfZGFsaWduID0gMjsKLSAgZXhlY3AtPmFfYmFsaWduID0gMjsKLQotICBkbG9hZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPm1faWRhdGEpOwotICBleGVjcC0+YV9kYXRhID0gZGxvYWQgKyA4OwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBkbG9hZCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoJmRtZW1zdGFydCwgc2l6ZW9mIChkbWVtc3RhcnQpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChkbWVtc3RhcnQpKQotICAgICAgfHwgKGJmZF9yZWFkICgmZG1lbXNpemUsIHNpemVvZiAoZG1lbXNpemUpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChkbWVtc2l6ZSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjcC0+YV90bG9hZCA9IDA7Ci0gIGV4ZWNwLT5hX2Rsb2FkID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZG1lbXN0YXJ0KTsKLSAgZXhlY3AtPmFfdGV4dCA9IGRsb2FkIC0gZXhlY3AtPmFfdGxvYWQ7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZkbWVtc2l6ZSk7Ci0gIGV4ZWNwLT5hX2JzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPm1fZGF0YSkgLSBleGVjcC0+YV9kYXRhOwotCi0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IDA7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlIGludG8gdGhlCi0gICBzdXBwbGllZCBidWZmZXIgcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4gICovCi0KLVBST1RPICh2b2lkLCBvczlrX3N3YXBfZXhlY19oZWFkZXJfb3V0LAotICAgICAgICAgKGJmZCAqIGFiZmQsCi0JICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqIGV4ZWNwLAotCSAgc3RydWN0IG1oX2NvbSAqIHJhd19ieXRlcykpOwotdm9pZAotb3M5a19zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIG1oX2NvbSAqcmF3X2J5dGVzOwotewotICBtaF9jb20gKmJ5dGVzID0gKG1oX2NvbSAqKSByYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvLCBieXRlcy0+ZV9pbmZvKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV90ZXh0LCBieXRlcy0+ZV90ZXh0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9kYXRhLCBieXRlcy0+ZV9kYXRhKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9ic3MsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfc3ltcywgYnl0ZXMtPmVfc3ltcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZW50cnksIGJ5dGVzLT5lX2VudHJ5KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX3Rsb2FkLCBieXRlcy0+ZV90bG9hZCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZGxvYWQsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgYnl0ZXMtPmVfdGFsaWduWzBdID0gZXhlY3AtPmFfdGFsaWduOwotICBieXRlcy0+ZV9kYWxpZ25bMF0gPSBleGVjcC0+YV9kYWxpZ247Ci0gIGJ5dGVzLT5lX2JhbGlnblswXSA9IGV4ZWNwLT5hX2JhbGlnbjsKLSAgYnl0ZXMtPmVfcmVsYXhhYmxlWzBdID0gZXhlY3AtPmFfcmVsYXhhYmxlOwotfQotCi0jZW5kaWYJLyogMCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vczlrX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgbWhfY29tIGV4ZWNfYnl0ZXM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIE1IQ09NX0JZVEVTX1NJWkUsIDEsIGFiZmQpCi0gICAgICAhPSBNSENPTV9CWVRFU19TSVpFKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhbmV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleGVjX2J5dGVzLm1fc3luYyk7Ci0gIGlmIChOX0JBRE1BRyAoYW5leGVjKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoISBvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsICZleGVjX2J5dGVzLCAmYW5leGVjKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgb3M5a19jYWxsYmFjayk7Ci19Ci0KLQotLyogRmluaXNoIHVwIHRoZSBvcGVuaW5nIG9mIGEgYi5vdXQgZmlsZSBmb3IgcmVhZGluZy4gIEZpbGwgaW4gYWxsIHRoZQotICAgZmllbGRzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IGNvbW1vbiBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb3M5a19jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGxvbmcgYnNzX3N0YXJ0OwotCi0gIC8qIEFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9pMzg2LCAwKTsKLQotICAvKiBUaGUgcG9zaXRpb25zIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAwOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gMDsKLQotICAvKiBUaGUgYWxpZ25tZW50cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV90YWxpZ247Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfZGFsaWduOwotICBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfYmFsaWduOwotCi0gIC8qIFRoZSBzdGFydGluZyBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV90bG9hZDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV9kbG9hZDsKLQotICAvKiBBbmQgcmVsb2FkIHRoZSBzaXplcywgc2luY2UgdGhlIGFvdXQgbW9kdWxlIHphcHMgdGhlbSAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX3RleHQ7Ci0KLSAgYnNzX3N0YXJ0ID0gZXhlY3AtPmFfZGxvYWQgKyBleGVjcC0+YV9kYXRhOwkvKiBCU1MgPSBlbmQgb2YgZGF0YSBzZWN0aW9uICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSBhbGlnbl9wb3dlciAoYnNzX3N0YXJ0LCBleGVjcC0+YV9iYWxpZ24pOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gZXhlY3AtPmFfZW50cnk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IGV4ZWNwLT5hX2Rsb2FkOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICoqKgotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUk9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gIE5fRFJPRkYoKmV4ZWNwKTsKLSAgKi8KLQotICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMTsJLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAxOy8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gTUhDT01fQllURVNfU0laRTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2lmIDAKLXN0cnVjdCBib3V0X2RhdGFfc3RydWN0Ci17Ci0gIHN0cnVjdCBhb3V0ZGF0YSBhOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLW9zOWtfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0cjsKLQotICByYXdwdHIgPSAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG9ial9ic3NzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vczlrX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLQotICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfaW5mbyA9IEJNQUdJQzsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGV4dCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzID0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoc3RydWN0IG5saXN0KTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RhbGlnbiA9IG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotICBleGVjX2hkciAoYWJmZCktPmFfZGFsaWduID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9iYWxpZ24gPSBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90bG9hZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBleGVjX2hkciAoYWJmZCktPmFfZGxvYWQgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICBib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjX2hkciAoYWJmZCksICZzd2FwcGVkX2hkcik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmIHN3YXBwZWRfaGRyLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0JICAhPSBFWEVDX0JZVEVTX1NJWkUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX1NZTU9GRiAoKmV4ZWNfaGRyIChhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWFvdXRfMzJfd3JpdGVfc3ltcyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fVFJPRkYgKCpleGVjX2hkciAoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fRFJPRkYgKCpleGVjX2hkciAoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1vczlrX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7CQkJCS8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MKLQkrIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gICAgfQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpIGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgPT0gY291bnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYJLyogMCAqLwotCi1zdGF0aWMgaW50Ci1vczlrX3NpemVvZl9oZWFkZXJzIChpZ25vcmVfYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCBhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgYW91dF8zMl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0KLSNkZWZpbmUgYW91dF8zMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBvczlrX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgb3M5a19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIG9zOWtfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIG9zOWtfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgb3M5a19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBvczlrX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIG9zOWtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IGkzODZvczlrX3ZlYyA9Ci17Ci0gICJpMzg2b3M5ayIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X29zOWtfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGRyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBXUF9URVhUKSwJLyogb2JqZWN0IGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBvczlrX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgYmZkX2ZhbHNlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgYmZkX2ZhbHNlLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAob3M5ayksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvaWVlZS5jIGIvYmZkL2llZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiM2JhYy4uMDAwMDAwMAotLS0gYS9iZmQvaWVlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk4MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGllZWUtNjk1IG9iamVjdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBLRUVQTUlOVVNQQ0lOSU5TVCAwCi0KLS8qIElFRUUgNjk1IGZvcm1hdCBpcyBhIHN0cmVhbSBvZiByZWNvcmRzLCB3aGljaCB3ZSBwYXJzZSB1c2luZyBhIHNpbXBsZSBvbmUtCi0gICB0b2tlbiAod2hpY2ggaXMgb25lIGJ5dGUgaW4gdGhpcyBsZXhpY29uKSBsb29rYWhlYWQgcmVjdXJzaXZlIGRlY2VudAotICAgcGFyc2VyLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImllZWUuaCIKLSNpbmNsdWRlICJsaWJpZWVlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2J5dGUgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV8yYnl0ZXMgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9pbnQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaWQgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hLCBhc3ltYm9sICosIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgaWVlZV93cml0ZV9pbnQ1IFBBUkFNUyAoKGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaW50NV9vdXQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRoX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZG9fYXNfcmVwZWF0IFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRob3V0X3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2RhdGFfcGFydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX21lX3BhcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfcHJvY2Vzc29yIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfZGVidWcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBpZWVlIGZpbGVzIGluIHRoZSBzdHJhbmdlIHdheSB0aGF0IHRoZQotICAgc3RhbmRhcmQgcmVxdWlyZXMuICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGJhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJhcmc7Ci17Ci0gIGJmZF9ieXRlIGJ5dGU7Ci0KLSAgYnl0ZSA9IGJhcmc7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZieXRlLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJ5dGVzOwotewotICBiZmRfYnl0ZSBidWZmZXJbMl07Ci0KLSAgYnVmZmVyWzBdID0gYnl0ZXMgPj4gODsKLSAgYnVmZmVyWzFdID0gYnl0ZXMgJiAweGZmOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIDIsIGFiZmQpICE9IDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50IChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAodmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLSAgICAgIC8qIEhvdyBtYW55IHNpZ25pZmljYW50IGJ5dGVzID8gKi8KLSAgICAgIC8qIEZJWE1FIEZPUiBMT05HRVIgSU5UUyAqLwotICAgICAgaWYgKHZhbHVlICYgMHhmZjAwMDAwMCkKLQlsZW5ndGggPSA0OwotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwZmYwMDAwKQotCWxlbmd0aCA9IDM7Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDAwMGZmMDApCi0JbGVuZ3RoID0gMjsKLSAgICAgIGVsc2UKLQlsZW5ndGggPSAxOwotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgIChiZmRfYnl0ZSkgKChpbnQpIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtCi0JCQkJCSArIGxlbmd0aCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN3aXRjaCAobGVuZ3RoKQotCXsKLQljYXNlIDQ6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlID4+IDI0KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAzOgotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpICh2YWx1ZSA+PiAxNikpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMjoKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUgPj4gOCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMToKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2lkIChhYmZkLCBpZCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICppZDsKLXsKLSAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbiAoaWQpOwotCi0gIGlmIChsZW5ndGggPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDI1NSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8xX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDY1NTM1KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIChpbnQpIGxlbmd0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogc3RyaW5nIHRvbyBsb25nICglZCBjaGFycywgbWF4IDY1NTM1KSIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGVuZ3RoKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGlkLCAxLCBsZW5ndGgsIGFiZmQpICE9IGxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRnVuY3Rpb25zIGZvciByZWFkaW5nIGZyb20gaWVlZSBmaWxlcyBpbiB0aGUgc3RyYW5nZSB3YXkgdGhhdCB0aGUKLXN0YW5kYXJkIHJlcXVpcmVzOgotKi8KLQotI2RlZmluZSB0aGlzX2J5dGUoaWVlZSkgKigoaWVlZSktPmlucHV0X3ApCi0jZGVmaW5lIG5leHRfYnl0ZShpZWVlKSAoKGllZWUpLT5pbnB1dF9wKyspCi0jZGVmaW5lIHRoaXNfYnl0ZV9hbmRfbmV4dChpZWVlKSAoKigoaWVlZSktPmlucHV0X3ArKykpCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAotcmVhZF8yYnl0ZXMgKGllZWUpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLXsKLSAgdW5zaWduZWQgY2hhciBjMSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gIHVuc2lnbmVkIGNoYXIgYzIgPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICByZXR1cm4gKGMxIDw8IDgpIHwgYzI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZ2V0X3N0cmluZyAoaWVlZSwgc3RyaW5nLCBsZW5ndGgpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBzaXplX3QgbGVuZ3RoOwotewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmluZ1tpXSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFkX2lkIChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIGNoYXIgKnN0cmluZzsKLSAgbGVuZ3RoID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgaWYgKGxlbmd0aCA8PSAweDdmKQotICAgIHsKLSAgICAgIC8qIFNpbXBsZSBzdHJpbmcgb2YgbGVuZ3RoIDAgdG8gMTI3ICovCi0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZSkKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCBieXRlLCBhbGxvd2luZyAwLi4yNTUgKi8KLSAgICAgIGxlbmd0aCA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZikKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCB0d28gYnl0ZXMsIGFsbG93aW5nIDAuLjY1NTM1ICovCi0gICAgICBsZW5ndGggPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgICAgbGVuZ3RoID0gKGxlbmd0aCAqIDI1NikgKyB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgIH0KLSAgLyogQnV5IG1lbW9yeSBhbmQgcmVhZCBzdHJpbmcgKi8KLSAgc3RyaW5nID0gYmZkX2FsbG9jIChpZWVlLT5hYmZkLCBsZW5ndGggKyAxKTsKLSAgaWYgKCFzdHJpbmcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGJmZF9nZXRfc3RyaW5nIChpZWVlLCBzdHJpbmcsIGxlbmd0aCk7Ci0gIHN0cmluZ1tsZW5ndGhdID0gMDsKLSAgcmV0dXJuIHN0cmluZzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiBwY3JlbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICB1bnNpZ25lZCBpbnQgdGVybV9jb3VudCA9IDA7Ci0KLSAgaWYgKHZhbHVlICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50Kys7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBEZWYgb2YgYSBjb21tb24gc3ltYm9sICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfWF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdGVybV9jb3VudCsrOwotICAgIH0KLSAgZWxzZSBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogUmVmIHRvIGRlZmluZWQgc3ltYm9sIC0gKi8KLQotICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9JX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgKEJTRl9MT0NBTCB8IEJTRl9TRUNUSU9OX1NZTSkpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgbG9jYWwgc3ltYm9sLiAgV2UgY2FuCi0JICAgICBlYXNpbHkgZG8gYSBsb2NhbCBhcyBhIHNlY3Rpb24rb2Zmc2V0LiAgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9SX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQkgIGlmIChzeW1ib2wtPnZhbHVlICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICB0ZXJtX2NvdW50Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5yZWNvZ25pemVkIHN5bWJvbCBgJXMnIGZsYWdzIDB4JXgiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCSAgICAgc3ltYm9sLT5mbGFncyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHBjcmVsKQotICAgIHsKLSAgICAgIC8qIHN1YnRyYWN0IHRoZSBwYyBmcm9tIGhlcmUgYnkgYXNraW5nIGZvciBQQyBvZiB0aGlzIHNlY3Rpb24qLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1BfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKGluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgYSAwIGFkZHJlc3MuICAqLwotICBpZiAodGVybV9jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHdoaWxlICh0ZXJtX2NvdW50ID4gMSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fcGx1c19lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50LS07Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotd3JpdGVzIGFueSBpbnRlZ2VyIGludG8gdGhlIGJ1ZmZlciBzdXBwbGllZCBhbmQgYWx3YXlzIHRha2VzIDUgYnl0ZXMKLSovCi1zdGF0aWMgdm9pZAotaWVlZV93cml0ZV9pbnQ1IChidWZmZXIsIHZhbHVlKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBidWZmZXJbMF0gPSAoYmZkX2J5dGUpIGllZWVfbnVtYmVyX3JlcGVhdF80X2VudW07Ci0gIGJ1ZmZlclsxXSA9ICh2YWx1ZSA+PiAyNCkgJiAweGZmOwotICBidWZmZXJbMl0gPSAodmFsdWUgPj4gMTYpICYgMHhmZjsKLSAgYnVmZmVyWzNdID0gKHZhbHVlID4+IDgpICYgMHhmZjsKLSAgYnVmZmVyWzRdID0gKHZhbHVlID4+IDApICYgMHhmZjsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50NV9vdXQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGJmZF9ieXRlIGJbNV07Ci0KLSAgaWVlZV93cml0ZV9pbnQ1IChiLCB2YWx1ZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGIsIDEsIDUsIGFiZmQpICE9IDUpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2ludCAoaWVlZSwgdmFsdWVfcHRyKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJmZF92bWEgKnZhbHVlX3B0cjsKLXsKLSAgaW50IHZhbHVlID0gdGhpc19ieXRlIChpZWVlKTsKLSAgaW50IHJlc3VsdDsKLSAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgICp2YWx1ZV9wdHIgPSB2YWx1ZTsKLSAgICAgIG5leHRfYnl0ZSAoaWVlZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhbHVlID49IDB4ODAgJiYgdmFsdWUgPD0gMHg4OCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSB2YWx1ZSAmIDB4ZjsKLSAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICBuZXh0X2J5dGUgKGllZWUpOwotICAgICAgd2hpbGUgKGNvdW50KQotCXsKLQkgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotCSAgY291bnQtLTsKLQl9Ci0gICAgICAqdmFsdWVfcHRyID0gcmVzdWx0OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX2kgKGllZWUsIG9rKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJvb2xlYW4gKm9rOwotewotICBiZmRfdm1hIHg7Ci0gICpvayA9IHBhcnNlX2ludCAoaWVlZSwgJngpOwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGJmZF92bWEKLW11c3RfcGFyc2VfaW50IChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIGJmZF92bWEgcmVzdWx0OwotICBCRkRfQVNTRVJUIChwYXJzZV9pbnQgKGllZWUsICZyZXN1bHQpID09IHRydWUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfdm1hIHZhbHVlOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci19IGllZWVfdmFsdWVfdHlwZTsKLQotCi0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIGFyZwotI2RlZmluZSBQQ1JFTF9PRkZTRVQgZmFsc2UKLQotI2Vsc2UKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIDAKLSNkZWZpbmUgUENSRUxfT0ZGU0VUIHRydWUKLQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFiczMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIDAsCi0JICJhYnMzMiIsCi0JIHRydWUsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWJzMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczE2IiwKLQkgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwKLQkgMHgwMDAwZmZmZiwKLQkgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhYnM4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczgiLAotCSB0cnVlLAotCSAweDAwMDAwMGZmLAotCSAweDAwMDAwMGZmLAotCSBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJlbDMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIDAsCi0JICJyZWwzMiIsCi0JIHRydWUsCi0JIFNSQ19NQVNLICgweGZmZmZmZmZmKSwKLQkgMHhmZmZmZmZmZiwKLQkgUENSRUxfT0ZGU0VUKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmVsMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDE2IiwKLQkgdHJ1ZSwKLQkgU1JDX01BU0sgKDB4MDAwMGZmZmYpLAotCSAweDAwMDBmZmZmLAotCSBQQ1JFTF9PRkZTRVQpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByZWw4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDgiLAotCSB0cnVlLAotCSBTUkNfTUFTSyAoMHgwMDAwMDBmZiksCi0JIDB4MDAwMDAwZmYsCi0JIFBDUkVMX09GRlNFVCk7Ci0KLXN0YXRpYyBpZWVlX3N5bWJvbF9pbmRleF90eXBlIE5PU1lNQk9MID0gezAsIDB9OwotCi1zdGF0aWMgdm9pZAotcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGV4dHJhLCBzZWN0aW9uKQotICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLSAgICAgYmZkX3ZtYSAqdmFsdWU7Ci0gICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiAqcGNyZWw7Ci0gICAgIHVuc2lnbmVkIGludCAqZXh0cmE7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbjsKLQotewotI2RlZmluZSBQT1Mgc3BbMV0KLSNkZWZpbmUgVE9TIHNwWzBdCi0jZGVmaW5lIE5PUyBzcFstMV0KLSNkZWZpbmUgSU5DIHNwKys7Ci0jZGVmaW5lIERFQyBzcC0tOwotCi0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGllZWVfdmFsdWVfdHlwZSBzdGFja1sxMF07Ci0KLSAgLyogVGhlIHN0YWNrIHBvaW50ZXIgYWx3YXlzIHBvaW50cyB0byB0aGUgbmV4dCB1bnVzZWQgbG9jYXRpb24gKi8KLSNkZWZpbmUgUFVTSCh4LHkseikgVE9TLnN5bWJvbD14O1RPUy5zZWN0aW9uPXk7VE9TLnZhbHVlPXo7SU5DOwotI2RlZmluZSBQT1AoeCx5LHopIERFQzt4PVRPUy5zeW1ib2w7eT1UT1Muc2VjdGlvbjt6PVRPUy52YWx1ZTsKLSAgaWVlZV92YWx1ZV90eXBlICpzcCA9IHN0YWNrOwotCi0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQl7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1BfZW51bToKLQkgIC8qIFAgdmFyaWFibGUsIGN1cnJlbnQgcHJvZ3JhbSBjb3VudGVyIGZvciBzZWN0aW9uIG4gKi8KLQkgIHsKLQkgICAgaW50IHNlY3Rpb25fbjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgKnBjcmVsID0gdHJ1ZTsKLQkgICAgc2VjdGlvbl9uID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICBQVVNIIChOT1NZTUJPTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgaWVlZV92YXJpYWJsZV9MX2VudW06Ci0JICAvKiBMIHZhcmlhYmxlICBhZGRyZXNzIG9mIHNlY3Rpb24gTiAqLwotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIFBVU0ggKE5PU1lNQk9MLCBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV0sIDApOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQkgIC8qIFIgdmFyaWFibGUsIGxvZ2ljYWwgYWRkcmVzcyBvZiBzZWN0aW9uIG1vZHVsZSAqLwotCSAgLyogRklYTUUsIHRoaXMgc2hvdWxkIGJlIGRpZmZlcmVudCB0byBMICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsIGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXSwgMCk7Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfU19lbnVtOgotCSAgLyogUyB2YXJpYWJsZSwgc2l6ZSBpbiBNQVVTIG9mIHNlY3Rpb24gbW9kdWxlICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsCi0JCTAsCi0JCWllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXS0+X3Jhd19zaXplKTsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YXJpYWJsZV9JX2VudW06Ci0JICAvKiBQdXNoIHRoZSBhZGRyZXNzIG9mIHZhcmlhYmxlIG4gKi8KLQkgIHsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgc3kuaW5kZXggPSAoaW50KSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmxldHRlciA9ICdJJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfWF9lbnVtOgotCSAgLyogUHVzaCB0aGUgYWRkcmVzcyBvZiBleHRlcm5hbCB2YXJpYWJsZSBuICovCi0JICB7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3k7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmluZGV4ID0gKGludCkgKG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKSk7Ci0JICAgIHN5LmxldHRlciA9ICdYJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX3VuZF9zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfZnVuY3Rpb25fbWludXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xLCAqc2VjdGlvbl9kdW1teTsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5LCBzZWN0aW9uMSwgdmFsdWUxKTsKLQkgICAgUE9QIChzeSwgc2VjdGlvbl9kdW1teSwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3ksIHNlY3Rpb24xID8gc2VjdGlvbjEgOiBzZWN0aW9uX2R1bW15LCB2YWx1ZTIgLSB2YWx1ZTEpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjI7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5MjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5MSwgc2VjdGlvbjEsIHZhbHVlMSk7Ci0JICAgIFBPUCAoc3kyLCBzZWN0aW9uMiwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3kxLmxldHRlciA/IHN5MSA6IHN5MiwKLQkJICBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24xKSA/IHNlY3Rpb24yIDogc2VjdGlvbjEsCi0JCSAgdmFsdWUxICsgdmFsdWUyKTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgdmE7Ci0JICAgIEJGRF9BU1NFUlQgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPCAoaW50KSBpZWVlX3ZhcmlhYmxlX0FfZW51bQotCQkgICAgfHwgdGhpc19ieXRlICgmKGllZWUtPmgpKSA+IChpbnQpIGllZWVfdmFyaWFibGVfWl9lbnVtKTsKLQkgICAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhKSkKLQkgICAgICB7Ci0JCVBVU0ggKE5PU1lNQk9MLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB2YSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKgotCQkgIFRoYXRzIGFsbCB0aGF0IHdlIGNhbiB1bmRlcnN0YW5kLiBBcyBmYXIgYXMgSSBjYW4gc2VlCi0JCSAgdGhlcmUgaXMgYSBidWcgaW4gdGhlIE1pY3JvdGVjIElFRUUgb3V0cHV0IHdoaWNoIEknbQotCQkgIHVzaW5nIHRvIHNjYW4sIHdoZXJlYnkgdGhlIGNvbW1hIG9wZXJhdG9yIGlzIG9taXR0ZWQKLQkJICBzb21ldGltZXMgaW4gYW4gZXhwcmVzc2lvbiwgZ2l2aW5nIGV4cHJlc3Npb25zIHdpdGggdG9vCi0JCSAgbWFueSB0ZXJtcy4gV2UgY2FuIHRlbGwgaWYgdGhhdCdzIHRoZSBjYXNlIGJ5IGVuc3VyaW5nCi0JCSAgdGhhdCBzcCA9PSBzdGFjayBoZXJlLiBJZiBub3QsIHRoZW4gd2UndmUgcHVzaGVkCi0JCSAgc29tZXRoaW5nIHRvbyBmYXIsIHNvIHdlIGtlZXAgYWRkaW5nLiAgKi8KLQotCQl3aGlsZSAoc3AgIT0gc3RhY2sgKyAxKQotCQkgIHsKLQkJICAgIGFzZWN0aW9uICpzZWN0aW9uMTsKLQkJICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCQkgICAgUE9QIChzeTEsIHNlY3Rpb24xLCAqZXh0cmEpOwotCQkgIH0KLQkJewotCQkgIGFzZWN0aW9uICpkdW1teTsKLQotCQkgIFBPUCAoKnN5bWJvbCwgZHVtbXksICp2YWx1ZSk7Ci0JCSAgaWYgKHNlY3Rpb24pCi0JCSAgICAqc2VjdGlvbiA9IGR1bW15OwotCQl9Ci0KLQkJbG9vcCA9IGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0gICAgfQotfQotCi0KLSNkZWZpbmUgaWVlZV9zZWVrKGFiZmQsIG9mZnNldCkgXAotICBJRUVFX0RBVEEoYWJmZCktPmguaW5wdXRfcCA9IElFRUVfREFUQShhYmZkKS0+aC5maXJzdF9ieXRlICsgb2Zmc2V0Ci0KLSNkZWZpbmUgaWVlZV9wb3MoYWJmZCkgXAotICAoSUVFRV9EQVRBKGFiZmQpLT5oLmlucHV0X3AgLSBJRUVFX0RBVEEoYWJmZCktPmguZmlyc3RfYnl0ZSkKLQotc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X2luZGV4Owotc3RhdGljIGNoYXIgbGFzdF90eXBlOwkJLyogaXMgdGhlIGluZGV4IGZvciBhbiBYIG9yIGEgRCAqLwotCi1zdGF0aWMgaWVlZV9zeW1ib2xfdHlwZSAqCi1nZXRfc3ltYm9sIChhYmZkLAotCSAgICBpZWVlLAotCSAgICBsYXN0X3N5bWJvbCwKLQkgICAgc3ltYm9sX2NvdW50LAotCSAgICBwcHRyLAotCSAgICBtYXhfaW5kZXgsCi0JICAgIHRoaXNfdHlwZQotKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gICAgIGllZWVfc3ltYm9sX3R5cGUgKmxhc3Rfc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgKnN5bWJvbF9jb3VudDsKLSAgICAgaWVlZV9zeW1ib2xfdHlwZSAqKipwcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKm1heF9pbmRleDsKLSAgICAgY2hhciB0aGlzX3R5cGUKLSAgICAgIDsKLXsKLSAgLyogTmVlZCBhIG5ldyBzeW1ib2wgKi8KLSAgdW5zaWduZWQgaW50IG5ld19pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLSAgaWYgKG5ld19pbmRleCAhPSBsYXN0X2luZGV4IHx8IHRoaXNfdHlwZSAhPSBsYXN0X3R5cGUpCi0gICAgewotICAgICAgaWVlZV9zeW1ib2xfdHlwZSAqbmV3X3N5bWJvbCA9IChpZWVlX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoaWVlZS0+aC5hYmZkLAotCQkJCQkJIHNpemVvZiAoaWVlZV9zeW1ib2xfdHlwZSkpOwotICAgICAgaWYgKCFuZXdfc3ltYm9sKQotCXJldHVybiBOVUxMOwotCi0gICAgICBuZXdfc3ltYm9sLT5pbmRleCA9IG5ld19pbmRleDsKLSAgICAgIGxhc3RfaW5kZXggPSBuZXdfaW5kZXg7Ci0gICAgICAoKnN5bWJvbF9jb3VudCkrKzsKLSAgICAgICoqcHB0ciA9IG5ld19zeW1ib2w7Ci0gICAgICAqcHB0ciA9ICZuZXdfc3ltYm9sLT5uZXh0OwotICAgICAgaWYgKG5ld19pbmRleCA+ICptYXhfaW5kZXgpCi0JewotCSAgKm1heF9pbmRleCA9IG5ld19pbmRleDsKLQl9Ci0gICAgICBsYXN0X3R5cGUgPSB0aGlzX3R5cGU7Ci0gICAgICBuZXdfc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICByZXR1cm4gbmV3X3N5bWJvbDsKLSAgICB9Ci0gIHJldHVybiBsYXN0X3N5bWJvbDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGZpbGVfcHRyIG9mZnNldCA9IGllZWUtPncuci5leHRlcm5hbF9wYXJ0OwotCi0gIGllZWVfc3ltYm9sX3R5cGUgKipwcmV2X3N5bWJvbHNfcHRyID0gJmllZWUtPmV4dGVybmFsX3N5bWJvbHM7Ci0gIGllZWVfc3ltYm9sX3R5cGUgKipwcmV2X3JlZmVyZW5jZV9wdHIgPSAmaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlOwotICBpZWVlX3N5bWJvbF90eXBlICpzeW1ib2wgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50ID0gMDsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLSAgbGFzdF9pbmRleCA9IDB4ZmZmZmZmOwotICBpZWVlLT5zeW1ib2xfdGFibGVfZnVsbCA9IHRydWU7Ci0KLSAgaWVlZV9zZWVrIChhYmZkLCBvZmZzZXQpOwotCi0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQl7Ci0JY2FzZSBpZWVlX25uX3JlY29yZDoKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgIHN5bWJvbCA9IGdldF9zeW1ib2wgKGFiZmQsIGllZWUsIHN5bWJvbCwgJnN5bWJvbF9jb3VudCwKLQkJCSAgICAgICAmcHJldl9zeW1ib2xzX3B0ciwKLQkJCSAgICAgICAmaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCwgJ0knKTsKLQkgIGlmIChzeW1ib2wgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBzeW1ib2wtPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQkgIHN5bWJvbC0+c3ltYm9sLm5hbWUgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLQkgIHN5bWJvbC0+c3ltYm9sLnVkYXRhLnAgPSAoUFRSKSBOVUxMOwotCSAgc3ltYm9sLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0JICBicmVhazsKLQljYXNlIGllZWVfZXh0ZXJuYWxfc3ltYm9sX2VudW06Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICBzeW1ib2wgPSBnZXRfc3ltYm9sIChhYmZkLCBpZWVlLCBzeW1ib2wsICZzeW1ib2xfY291bnQsCi0JCQkgICAgICAgJnByZXZfc3ltYm9sc19wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXgsICdEJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgQkZEX0FTU0VSVCAoc3ltYm9sLT5pbmRleCA+PSBpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4KTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX05PX0ZMQUdTOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2F0dHJpYnV0ZV9yZWNvcmRfZW51bSA+PiA4OgotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX25hbWVfaW5kZXg7Ci0JICAgIHVuc2lnbmVkIGludCBzeW1ib2xfdHlwZV9pbmRleDsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9hdHRyaWJ1dGVfZGVmOwotCSAgICBiZmRfdm1hIHZhbHVlOwotCSAgICBzd2l0Y2ggKHJlYWRfMmJ5dGVzIChpZWVlKSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBpZWVlX2F0dHJpYnV0ZV9yZWNvcmRfZW51bToKLQkJc3ltYm9sX25hbWVfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCXN5bWJvbF90eXBlX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQlzeW1ib2xfYXR0cmlidXRlX2RlZiA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJc3dpdGNoIChzeW1ib2xfYXR0cmlidXRlX2RlZikKLQkJICB7Ci0JCSAgY2FzZSA4OgotCQkgIGNhc2UgMTk6Ci0JCSAgICBwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgICAoXygiJXM6IHVuaW1wbGVtZW50ZWQgQVRJIHJlY29yZCAgJXUgZm9yIHN5bWJvbCAldSIpLAotCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN5bWJvbF9hdHRyaWJ1dGVfZGVmLAotCQkgICAgICAgc3ltYm9sX25hbWVfaW5kZXgpOwotCQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgaWVlZV9leHRlcm5hbF9yZWZlcmVuY2VfaW5mb19yZWNvcmRfZW51bToKLQkJLyogU2tpcCBvdmVyIEFUWCByZWNvcmQuICovCi0JCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBpZWVlX2F0bl9yZWNvcmRfZW51bToKLQkJLyogV2UgbWF5IGdldCBjYWxsIG9wdGltaXphdGlvbiBpbmZvcm1hdGlvbiBoZXJlLAotCQkgICB3aGljaCB3ZSBqdXN0IGlnbm9yZS4gIFRoZSBmb3JtYXQgaXMKLQkJICAgeyRGMX0ke0NFfXtpbmRleH17JDAwfXskM0Z9eyQzRn17I19vZl9BU05zfSAqLwotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQlpZiAodmFsdWUgIT0gMHgzZikKLQkJICB7Ci0JCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgICAgKF8oIiVzOiB1bmV4cGVjdGVkIEFUTiB0eXBlICVkIGluIGV4dGVybmFsIHBhcnQiKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKGludCkgdmFsdWUpOwotCQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsdWUpOwotCQl3aGlsZSAodmFsdWUgPiAwKQotCQkgIHsKLQkJICAgIGJmZF92bWEgdmFsMTsKLQotCQkgICAgLS12YWx1ZTsKLQotCQkgICAgc3dpdGNoIChyZWFkXzJieXRlcyAoaWVlZSkpCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSBpZWVlX2Fzbl9yZWNvcmRfZW51bToKLQkJCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWwxKTsKLQkJCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWwxKTsKLQkJCWJyZWFrOwotCi0JCSAgICAgIGRlZmF1bHQ6Ci0JCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgKF8oIiVzOiB1bmV4cGVjdGVkIHR5cGUgYWZ0ZXIgQVROIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YWx1ZV9yZWNvcmRfZW51bSA+PiA4OgotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX25hbWVfaW5kZXg7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3ltYm9sX2lnbm9yZTsKLQkgICAgYm9vbGVhbiBwY3JlbF9pZ25vcmU7Ci0JICAgIHVuc2lnbmVkIGludCBleHRyYTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBzeW1ib2xfbmFtZV9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgICAgcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwKLQkJCSAgICAgICZzeW1ib2wtPnN5bWJvbC52YWx1ZSwKLQkJCSAgICAgICZzeW1ib2xfaWdub3JlLAotCQkJICAgICAgJnBjcmVsX2lnbm9yZSwKLQkJCSAgICAgICZleHRyYSwKLQkJCSAgICAgICZzeW1ib2wtPnN5bWJvbC5zZWN0aW9uKTsKLQotCSAgICAvKiBGdWxseSBsaW5rZWQgSUVFRS02OTUgZmlsZXMgdGVuZCB0byBnaXZlIGV2ZXJ5IHN5bWJvbAotICAgICAgICAgICAgICAgYW4gYWJzb2x1dGUgdmFsdWUuICBUcnkgdG8gY29udmVydCB0aGF0IGJhY2sgaW50byBhCi0gICAgICAgICAgICAgICBzZWN0aW9uIHJlbGF0aXZlIHZhbHVlLiAgRklYTUU6IFRoaXMgd29uJ3QgYWx3YXlzIHRvCi0gICAgICAgICAgICAgICB0aGUgcmlnaHQgdGhpbmcuICAqLwotCSAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnN5bWJvbC5zZWN0aW9uKQotCQkmJiAoYWJmZC0+ZmxhZ3MgJiBIQVNfUkVMT0MpID09IDApCi0JICAgICAgewotCQliZmRfdm1hIHZhbDsKLQkJYXNlY3Rpb24gKnM7Ci0KLQkJdmFsID0gc3ltYm9sLT5zeW1ib2wudmFsdWU7Ci0JCWZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCQkgIHsKLQkJICAgIGlmICh2YWwgPj0gcy0+dm1hICYmIHZhbCA8IHMtPnZtYSArIHMtPl9yYXdfc2l6ZSkKLQkJICAgICAgewotCQkJc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IHM7Ci0JCQlzeW1ib2wtPnN5bWJvbC52YWx1ZSAtPSBzLT52bWE7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgc3ltYm9sLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVDsKLQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3dlYWtfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgc2l6ZTsKLQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgLyogVGhyb3cgYXdheSB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlIGluZGV4ICovCi0JICAgICh2b2lkKSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIC8qIEZldGNoIHRoZSBkZWZhdWx0IHNpemUgaWYgbm90IHJlc29sdmVkICovCi0JICAgIHNpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIC8qIEZldGNoIHRoZSBkZWZhdXRsdCB2YWx1ZSBpZiBhdmFpbGFibGUgKi8KLQkgICAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKSA9PSBmYWxzZSkKLQkgICAgICB7Ci0JCXZhbHVlID0gMDsKLQkgICAgICB9Ci0JICAgIC8qIFRoaXMgdHVybnMgaW50byBhIGNvbW1vbiAqLwotCSAgICBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgICAgc3ltYm9sLT5zeW1ib2wudmFsdWUgPSBzaXplOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW06Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICBzeW1ib2wgPSBnZXRfc3ltYm9sIChhYmZkLCBpZWVlLCBzeW1ib2wsICZzeW1ib2xfY291bnQsCi0JCQkgICAgICAgJnByZXZfcmVmZXJlbmNlX3B0ciwKLQkJCSAgICAgICAmaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCwgJ1gnKTsKLQkgIGlmIChzeW1ib2wgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBzeW1ib2wtPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQkgIHN5bWJvbC0+c3ltYm9sLm5hbWUgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLQkgIHN5bWJvbC0+c3ltYm9sLnVkYXRhLnAgPSAoUFRSKSBOVUxMOwotCSAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBzeW1ib2wtPnN5bWJvbC52YWx1ZSA9IChiZmRfdm1hKSAwOwotCSAgc3ltYm9sLT5zeW1ib2wuZmxhZ3MgPSAwOwotCi0JICBCRkRfQVNTRVJUIChzeW1ib2wtPmluZGV4ID49IGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXgpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgbG9vcCA9IGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXggIT0gMCkKLSAgICB7Ci0gICAgICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQgPQotCWllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXggLQotCWllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXggKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudCA9IDA7Ci0gICAgfQotCi0gIGlmIChpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWF4X2luZGV4ICE9IDApCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50ID0KLQlpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWF4X2luZGV4IC0KLQlpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4ICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfY291bnQgPSAwOwotICAgIH0KLQotICBhYmZkLT5zeW1jb3VudCA9Ci0gICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50ICsgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2NvdW50OwotCi0gIGlmIChzeW1ib2xfY291bnQgIT0gYWJmZC0+c3ltY291bnQpCi0gICAgewotICAgICAgLyogVGhlcmUgYXJlIGdhcHMgaW4gdGhlIHRhYmxlIC0tICovCi0gICAgICBpZWVlLT5zeW1ib2xfdGFibGVfZnVsbCA9IGZhbHNlOwotICAgIH0KLQotICAqcHJldl9zeW1ib2xzX3B0ciA9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gICpwcmV2X3JlZmVyZW5jZV9wdHIgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKElFRUVfREFUQSAoYWJmZCktPnJlYWRfc3ltYm9scyA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIElFRUVfREFUQSAoYWJmZCktPnJlYWRfc3ltYm9scyA9IHRydWU7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZwotaWVlZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghIGllZWVfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChhYmZkLT5zeW1jb3VudCAhPSAwKSA/Ci0gICAgKGFiZmQtPnN5bWNvdW50ICsgMSkgKiAoc2l6ZW9mIChpZWVlX3N5bWJvbF90eXBlICopKSA6IDA7Ci19Ci0KLS8qCi1Nb3ZlIGZyb20gb3VyIGludGVybmFsIGxpc3RzIHRvIHRoZSBjYW5vbiB0YWJsZSwgYW5kIGluc2VydCBpbgotc3ltYm9sIGluZGV4IG9yZGVyCi0qLwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpZWVlX3ZlYzsKLQotbG9uZwotaWVlZV9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gIGllZWVfc3ltYm9sX3R5cGUgKnN5bXA7Ci0gIHN0YXRpYyBiZmQgZHVtbXlfYmZkOwotICBzdGF0aWMgYXN5bWJvbCBlbXB0eV9zeW1ib2wgPQotICAvKiB0aGVfYmZkLCBuYW1lLCB2YWx1ZSwgYXR0ciwgc2VjdGlvbiAqLwotICB7JmR1bW15X2JmZCwgIiBpZWVlIGVtcHR5IiwgKHN5bXZhbHVlKSAwLCBCU0ZfREVCVUdHSU5HLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB7IDAgfX07Ci0KLSAgaWYgKGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgICAgIGR1bW15X2JmZC54dmVjID0gJmllZWVfdmVjOwotICAgICAgaWYgKCEgaWVlZV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKGllZWUtPnN5bWJvbF90YWJsZV9mdWxsID09IGZhbHNlKQotCXsKLQkgIC8qIEFycmdoIC0gdGhlcmUgYXJlIGdhcHMgaW4gdGhlIHRhYmxlLCBydW4gdGhyb3VnaCBhbmQgZmlsbCB0aGVtICovCi0JICAvKiB1cCB3aXRoIHBvaW50ZXJzIHRvIGEgbnVsbCBwbGFjZSAqLwotCSAgdW5zaWduZWQgaW50IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c3ltY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGxvY2F0aW9uW2ldID0gJmVtcHR5X3N5bWJvbDsKLQkgICAgfQotCX0KLQotICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0ID0gLWllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXg7Ci0gICAgICBmb3IgKHN5bXAgPSBJRUVFX0RBVEEgKGFiZmQpLT5leHRlcm5hbF9zeW1ib2xzOwotCSAgIHN5bXAgIT0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQkgICBzeW1wID0gc3ltcC0+bmV4dCkKLQl7Ci0JICAvKiBQbGFjZSBpbnRvIHRhYmxlIGF0IGNvcnJlY3QgaW5kZXggbG9jYXRpb25zICovCi0JICBsb2NhdGlvbltzeW1wLT5pbmRleCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9iYXNlX29mZnNldF0gPSAmc3ltcC0+c3ltYm9sOwotCX0KLQotICAgICAgLyogVGhlIGV4dGVybmFsIHJlZnMgYXJlIGluZGV4ZWQgaW4gYSBiaXQgKi8KLSAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldCA9Ci0JLWllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXggKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQ7Ci0KLSAgICAgIGZvciAoc3ltcCA9IElFRUVfREFUQSAoYWJmZCktPmV4dGVybmFsX3JlZmVyZW5jZTsKLQkgICBzeW1wICE9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7Ci0JICAgc3ltcCA9IHN5bXAtPm5leHQpCi0JewotCSAgbG9jYXRpb25bc3ltcC0+aW5kZXggKyBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfYmFzZV9vZmZzZXRdID0KLQkgICAgJnN5bXAtPnN5bWJvbDsKLQotCX0KLSAgICB9Ci0gIGlmIChhYmZkLT5zeW1jb3VudCkKLSAgICB7Ci0gICAgICBsb2NhdGlvblthYmZkLT5zeW1jb3VudF0gPSAoYXN5bWJvbCAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIGFiZmQtPnN5bWNvdW50OwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZ2V0X3NlY3Rpb25fZW50cnkgKGFiZmQsIGllZWUsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIGlmIChpbmRleCA+PSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGMsIGk7Ci0gICAgICBhc2VjdGlvbiAqKm47Ci0KLSAgICAgIGMgPSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemU7Ci0gICAgICBpZiAoYyA9PSAwKQotCWMgPSAyMDsKLSAgICAgIHdoaWxlIChjIDw9IGluZGV4KQotCWMgKj0gMjsKLQotICAgICAgbiA9ICgoYXNlY3Rpb24gKiopCi0JICAgYmZkX3JlYWxsb2MgKGllZWUtPnNlY3Rpb25fdGFibGUsIGMgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gICAgICBpZiAobiA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBmb3IgKGkgPSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemU7IGkgPCBjOyBpKyspCi0JbltpXSA9IE5VTEw7Ci0KLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGUgPSBuOwotICAgICAgaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplID0gYzsKLSAgICB9Ci0KLSAgaWYgKGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnRtcCA9IGJmZF9hbGxvYyAoYWJmZCwgMTEpOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgICAgIGlmICghdG1wKQotCXJldHVybiBOVUxMOwotICAgICAgc3ByaW50ZiAodG1wLCAiIGZzZWMlNGQiLCBpbmRleCk7Ci0gICAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgdG1wKTsKLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID0gc2VjdGlvbjsKLSAgICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX05PX0ZMQUdTOwotICAgICAgc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gaW5kZXg7Ci0gICAgICBpZWVlLT5zZWN0aW9uX3RhYmxlW2luZGV4XSA9IHNlY3Rpb247Ci0gICAgfQotICByZXR1cm4gaWVlZS0+c2VjdGlvbl90YWJsZVtpbmRleF07Ci19Ci0KLXN0YXRpYyB2b2lkCi1pZWVlX3NsdXJwX3NlY3Rpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgZmlsZV9wdHIgb2Zmc2V0ID0gaWVlZS0+dy5yLnNlY3Rpb25fcGFydDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgY2hhciAqbmFtZTsKLQotICBpZiAob2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgc2VjdGlvbl90eXBlWzNdOwotICAgICAgaWVlZV9zZWVrIChhYmZkLCBvZmZzZXQpOwotICAgICAgd2hpbGUgKHRydWUpCi0JewotCSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCSAgICB7Ci0JICAgIGNhc2UgaWVlZV9zZWN0aW9uX3R5cGVfZW51bToKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBzZWN0aW9uX2luZGV4OwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQlzZWN0aW9uX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCi0JCXNlY3Rpb24gPSBnZXRfc2VjdGlvbl9lbnRyeSAoYWJmZCwgaWVlZSwgc2VjdGlvbl9pbmRleCk7Ci0KLQkJc2VjdGlvbl90eXBlWzBdID0gdGhpc19ieXRlX2FuZF9uZXh0ICgmKGllZWUtPmgpKTsKLQotCQkvKiBTZXQgbWluaW1hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuIEF0dHJpYnV0ZXMgYXJlCi0JCSAgIGV4dGVuZGVkIGxhdGVyLCBiYXNlZCBvbiBzZWN0aW9uIGNvbnRlbnRzLiAqLwotCi0JCXN3aXRjaCAoc2VjdGlvbl90eXBlWzBdKQotCQkgIHsKLQkJICBjYXNlIDB4QzE6Ci0JCSAgICAvKiBOb3JtYWwgYXR0cmlidXRlcyBmb3IgYWJzb2x1dGUgc2VjdGlvbnMJKi8KLQkJICAgIHNlY3Rpb25fdHlwZVsxXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkJICAgIHN3aXRjaCAoc2VjdGlvbl90eXBlWzFdKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMHhEMzoJLyogQVMgQWJzb2x1dGUgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0JCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc2VjdGlvbl90eXBlWzJdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkJCXN3aXRjaCAoc2VjdGlvbl90eXBlWzJdKQotCQkJICB7Ci0JCQkgIGNhc2UgMHhEMDoKLQkJCSAgICAvKiBOb3JtYWwgY29kZSAqLwotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMHhDNDoKLQkJCSAgICAvKiBOb3JtYWwgZGF0YSAqLwotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEE7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMHhEMjoKLQkJCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJICAgIC8qIE5vcm1hbCByb20gZGF0YSAqLwotCQkJICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19ST00gfCBTRUNfREFUQTsKLQkJCSAgICBicmVhazsKLQkJCSAgZGVmYXVsdDoKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIDB4QzM6CS8qIE5hbWVkIHJlbG9jYXRhYmxlIHNlY3Rpb25zICh0eXBlIEMpICovCi0JCSAgICBzZWN0aW9uX3R5cGVbMV0gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JCSAgICBzd2l0Y2ggKHNlY3Rpb25fdHlwZVsxXSkKLQkJICAgICAgewotCQkgICAgICBjYXNlIDB4RDA6CS8qIE5vcm1hbCBjb2RlIChDUCkgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09ERTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDB4QzQ6CS8qIE5vcm1hbCBkYXRhIChDRCkgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDB4RDI6CS8qIE5vcm1hbCByb20gZGF0YSAoQ1IpICovCi0JCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1JPTSB8IFNFQ19EQVRBOwotCQkJYnJlYWs7Ci0JCSAgICAgIGRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQotCQkvKiBSZWFkIHNlY3Rpb24gbmFtZSwgdXNlIGl0IGlmIG5vbiBlbXB0eS4gKi8KLQkJbmFtZSA9IHJlYWRfaWQgKCZpZWVlLT5oKTsKLQkJaWYgKG5hbWVbMF0pCi0JCSAgc2VjdGlvbi0+bmFtZSA9IG5hbWU7Ci0KLQkJLyogU2tpcCB0aGVzZSBmaWVsZHMsIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQgKi8KLQkJewotCQkgIGJmZF92bWEgcGFyZW50LCBicm90aGVyLCBjb250ZXh0OwotCQkgIHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnBhcmVudCk7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmYnJvdGhlcik7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmY29udGV4dCk7Ci0JCX0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7Ci0JCWJmZF92bWEgdmFsdWU7Ci0JCWFzZWN0aW9uICpzZWN0aW9uOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQlzZWN0aW9uX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCZpZWVlLT5oKTsKLQkJc2VjdGlvbiA9IGdldF9zZWN0aW9uX2VudHJ5IChhYmZkLCBpZWVlLCBzZWN0aW9uX2luZGV4KTsKLQkJaWYgKHNlY3Rpb25faW5kZXggPiBpZWVlLT5zZWN0aW9uX2NvdW50KQotCQkgIHsKLQkJICAgIGllZWUtPnNlY3Rpb25fY291bnQgPSBzZWN0aW9uX2luZGV4OwotCQkgIH0KLQkJc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0KLQkJICBiZmRfbG9nMiAobXVzdF9wYXJzZV9pbnQgKCZpZWVlLT5oKSk7Ci0JCSh2b2lkKSBwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtOgotCSAgICAgIHsKLQkJaWVlZV9yZWNvcmRfZW51bV90eXBlIHQgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAocmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpKTsKLQotCQlzd2l0Y2ggKHQpCi0JCSAgewotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX3NpemVfZW51bToKLQkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07Ci0JCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfcGh5c2ljYWxfcmVnaW9uX3NpemVfZW51bToKLQkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07Ci0JCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfcmVnaW9uX2Jhc2VfYWRkcmVzc19lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPnZtYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmxtYSA9IHNlY3Rpb24tPnZtYTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9tYXVfc2l6ZV9lbnVtOgotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX21fdmFsdWVfZW51bToKLQkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPnZtYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmxtYSA9IHNlY3Rpb24tPnZtYTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX29mZnNldF9lbnVtOgotCQkgICAgKHZvaWQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgICh2b2lkKSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogTWFrZSBhIHNlY3Rpb24gZm9yIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIGFueS4gIFdlIGRvbid0IHRyeQotICAgdG8gaW50ZXJwcmV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb247IHdlIGp1c3QgcG9pbnQgdGhlIHNlY3Rpb24KLSAgIGF0IHRoZSBhcmVhIGluIHRoZSBmaWxlIHNvIHRoYXQgcHJvZ3JhbSB3aGljaCB1bmRlcnN0YW5kIGNhbiBkaWcgaXQKLSAgIG91dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX2RlYnVnIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZmlsZV9wdHIgZGVidWdfZW5kOwotCi0gIGlmIChpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGVidWciKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjLT5mbGFncyB8PSBTRUNfREVCVUdHSU5HIHwgU0VDX0hBU19DT05URU5UUzsKLSAgc2VjLT5maWxlcG9zID0gaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQ7Ci0KLSAgZGVidWdfZW5kID0gaWVlZS0+dy5yLmRhdGFfcGFydDsKLSAgaWYgKGRlYnVnX2VuZCA9PSAwKQotICAgIGRlYnVnX2VuZCA9IGllZWUtPncuci50cmFpbGVyX3BhcnQ7Ci0gIGlmIChkZWJ1Z19lbmQgPT0gMCkKLSAgICBkZWJ1Z19lbmQgPSBpZWVlLT53LnIubWVfcmVjb3JkOwotICBzZWMtPl9yYXdfc2l6ZSA9IGRlYnVnX2VuZCAtIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0OwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBhcmNoaXZlIHN0dWZmCi0qLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWllZWVfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmxpYnJhcnk7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls1MTJdOwotICBmaWxlX3B0ciBidWZmZXJfb2Zmc2V0ID0gMDsKLSAgaWVlZV9hcl9kYXRhX3R5cGUgKnNhdmUgPSBhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGE7Ci0gIGllZWVfYXJfZGF0YV90eXBlICppZWVlOwotICB1bnNpZ25lZCBpbnQgYWxjX2VsdHM7Ci0gIGllZWVfYXJfb2JzdGFja190eXBlICplbHRzID0gTlVMTDsKLQotICBhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGEgPQotICAgIChpZWVlX2FyX2RhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaWVlZV9hcl9kYXRhX3R5cGUpKTsKLSAgaWYgKCFhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGEpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGllZWUgPSBJRUVFX0FSX0RBVEEgKGFiZmQpOwotCi0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCk7Ci0KLSAgaWVlZS0+aC5maXJzdF9ieXRlID0gYnVmZmVyOwotICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7Ci0KLSAgaWVlZS0+aC5hYmZkID0gYWJmZDsKLQotICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSAhPSBNb2R1bGVfQmVnaW5uaW5nKQotICAgIHsKLSAgICAgIGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSA9IHNhdmU7Ci0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgfQotCi0gIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0gIGxpYnJhcnkgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLSAgaWYgKHN0cmNtcCAobGlicmFyeSwgIkxJQlJBUlkiKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpZWVlKTsKLSAgICAgIGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSA9IHNhdmU7Ci0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgfQotICAvKiBUaHJvdyBhd2F5IHRoZSBmaWxlbmFtZSAqLwotICByZWFkX2lkICgmKGllZWUtPmgpKTsKLQotICBpZWVlLT5lbGVtZW50X2NvdW50ID0gMDsKLSAgaWVlZS0+ZWxlbWVudF9pbmRleCA9IDA7Ci0KLSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsJLyogRHJvcCB0aGUgYWQgcGFydCAqLwotICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CS8qIEFuZCB0aGUgdHdvIGR1bW15IG51bWJlcnMgKi8KLSAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCi0gIGFsY19lbHRzID0gMTA7Ci0gIGVsdHMgPSAoaWVlZV9hcl9vYnN0YWNrX3R5cGUgKikgYmZkX21hbGxvYyAoYWxjX2VsdHMgKiBzaXplb2YgKmVsdHMpOwotICBpZiAoZWx0cyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFJlYWQgdGhlIGluZGV4IG9mIHRoZSBCQiB0YWJsZSAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgcmVjOwotICAgICAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKnQ7Ci0KLSAgICAgIHJlYyA9IHJlYWRfMmJ5dGVzICgmKGllZWUtPmgpKTsKLSAgICAgIGlmIChyZWMgIT0gKGludCkgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKLQlicmVhazsKLQotICAgICAgaWYgKGllZWUtPmVsZW1lbnRfY291bnQgPj0gYWxjX2VsdHMpCi0JewotCSAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKm47Ci0KLQkgIGFsY19lbHRzICo9IDI7Ci0JICBuID0gKChpZWVlX2FyX29ic3RhY2tfdHlwZSAqKQotCSAgICAgICBiZmRfcmVhbGxvYyAoZWx0cywgYWxjX2VsdHMgKiBzaXplb2YgKmVsdHMpKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgZWx0cyA9IG47Ci0JfQotCi0gICAgICB0ID0gJmVsdHNbaWVlZS0+ZWxlbWVudF9jb3VudF07Ci0gICAgICBpZWVlLT5lbGVtZW50X2NvdW50Kys7Ci0KLSAgICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLSAgICAgIHQtPmZpbGVfb2Zmc2V0ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotICAgICAgdC0+YWJmZCA9IChiZmQgKikgTlVMTDsKLQotICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgZ28gb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KLQotICAgICAgaWYgKChzaXplX3QpIGllZWVfcG9zIChhYmZkKSA+IHNpemVvZiAoYnVmZmVyKSAvIDIpCi0JewotCSAgLyogUGFzdCBoYWxmIHdheSwgcmVzZWVrIGFuZCByZXByaW1lICovCi0JICBidWZmZXJfb2Zmc2V0ICs9IGllZWVfcG9zIChhYmZkKTsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgYnVmZmVyX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzCi0JICAgICB0byByZWFkIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0JICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotCSAgaWVlZS0+aC5maXJzdF9ieXRlID0gYnVmZmVyOwotCSAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotCX0KLSAgICB9Ci0KLSAgaWVlZS0+ZWxlbWVudHMgPSAoKGllZWVfYXJfb2JzdGFja190eXBlICopCi0JCSAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgICAgICAgaWVlZS0+ZWxlbWVudF9jb3VudCAqIHNpemVvZiAqaWVlZS0+ZWxlbWVudHMpKTsKLSAgaWYgKGllZWUtPmVsZW1lbnRzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG1lbWNweSAoaWVlZS0+ZWxlbWVudHMsIGVsdHMsCi0JICBpZWVlLT5lbGVtZW50X2NvdW50ICogc2l6ZW9mICppZWVlLT5lbGVtZW50cyk7Ci0gIGZyZWUgKGVsdHMpOwotICBlbHRzID0gTlVMTDsKLQotICAvKiBOb3cgc2NhbiB0aGUgYXJlYSBhZ2FpbiwgYW5kIHJlcGxhY2UgQkIgb2Zmc2V0cyB3aXRoIGZpbGUgKi8KLSAgLyogb2Zmc2V0cyAqLwotCi0gIGZvciAoaSA9IDI7IGkgPCBpZWVlLT5lbGVtZW50X2NvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpZWVlLT5lbGVtZW50c1tpXS5maWxlX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8KLQkgcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICAgICAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKLSAgICAgIGllZWUtPmguZmlyc3RfYnl0ZSA9IGJ1ZmZlcjsKLSAgICAgIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKLQotICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsJLyogRHJvcCBGOCAqLwotICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsJLyogRHJvcCAxNCAqLwotICAgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIHNpemUgb2YgYmxvY2sgKi8KLSAgICAgIGlmIChtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSkgIT0gMCkKLQl7Ci0JICAvKiBUaGlzIG9iamVjdCBoYXMgYmVlbiBkZWxldGVkICovCi0JICBpZWVlLT5lbGVtZW50c1tpXS5maWxlX29mZnNldCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCX0KLSAgICB9Ci0KLSAgLyogIGFiZmQtPmhhc19hcm1hcCA9IDsqLwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjoKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAoZWx0cyAhPSBOVUxMKQotICAgIGZyZWUgKGVsdHMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWJmZC0+dGRhdGEuaWVlZV9kYXRhID0gKGllZWVfZGF0YV90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoaWVlZV9kYXRhX3R5cGUpKTsKLSAgcmV0dXJuIGFiZmQtPnRkYXRhLmllZWVfZGF0YSA/IHRydWUgOiBmYWxzZTsKLX0KLQotY29uc3QgYmZkX3RhcmdldCAqCi1pZWVlX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKnByb2Nlc3NvcjsKLSAgdW5zaWduZWQgaW50IHBhcnQ7Ci0gIGllZWVfZGF0YV90eXBlICppZWVlOwotICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclszMDBdOwotICBpZWVlX2RhdGFfdHlwZSAqc2F2ZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0KLSAgYWJmZC0+dGRhdGEuaWVlZV9kYXRhID0gMDsKLSAgaWVlZV9ta29iamVjdCAoYWJmZCk7Ci0KLSAgaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGZhaWw7Ci0gIC8qIFJlYWQgdGhlIGZpcnN0IGZldyBieXRlcyBpbiB0byBzZWUgaWYgaXQgbWFrZXMgc2Vuc2UgKi8KLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKLQotICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7Ci0gIGlmICh0aGlzX2J5dGVfYW5kX25leHQgKCYoaWVlZS0+aCkpICE9IE1vZHVsZV9CZWdpbm5pbmcpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0OwotCi0gIGllZWUtPnJlYWRfc3ltYm9scyA9IGZhbHNlOwotICBpZWVlLT5yZWFkX2RhdGEgPSBmYWxzZTsKLSAgaWVlZS0+c2VjdGlvbl9jb3VudCA9IDA7Ci0gIGllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXggPSAwOwotICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4ID0gSUVFRV9QVUJMSUNfQkFTRTsKLSAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCA9IElFRUVfUkVGRVJFTkNFX0JBU0U7Ci0gIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXggPSAwOwotICBpZWVlLT5oLmFiZmQgPSBhYmZkOwotICBpZWVlLT5zZWN0aW9uX3RhYmxlID0gTlVMTDsKLSAgaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplID0gMDsKLQotICBwcm9jZXNzb3IgPSBpZWVlLT5tYi5wcm9jZXNzb3IgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLSAgaWYgKHN0cmNtcCAocHJvY2Vzc29yLCAiTElCUkFSWSIpID09IDApCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0OwotICBpZWVlLT5tYi5tb2R1bGVfbmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotICBpZiAoYWJmZC0+ZmlsZW5hbWUgPT0gKENPTlNUIGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhYmZkLT5maWxlbmFtZSA9IGllZWUtPm1iLm1vZHVsZV9uYW1lOwotICAgIH0KLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuCi0gICAgICovCi0gIHsKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2g7Ci0gICAgY2hhciBmYW1pbHlbMTBdOwotCi0gICAgLyogSUVFRSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBmb3JtYXQgb2YgdGhlIHByb2Nlc3NvciBpZGVudGlmaWNhdG9uCi0gICAgICAgc3RyaW5nLCBzbyB0aGUgY29tcGlsZXIgaXMgZnJlZSB0byBwdXQgaW4gaXQgd2hhdGV2ZXIgaXQgd2FudHMuCi0gICAgICAgV2UgdHJ5IGhlcmUgdG8gcmVjb2duaXplIGRpZmZlcmVudCBwcm9jZXNzb3JzIGJlbG9uZ2luZyB0byB0aGUKLSAgICAgICBtNjhrIGZhbWlseS4gIENvZGUgZm9yIG90aGVyIHByb2Nlc3NvcnMgY2FuIGJlIGFkZGVkIGhlcmUuICAqLwotICAgIGlmICgocHJvY2Vzc29yWzBdID09ICc2JykgJiYgKHByb2Nlc3NvclsxXSA9PSAnOCcpKQotICAgICAgewotCWlmIChwcm9jZXNzb3JbMl0gPT0gJzMnKQkgICAgLyogNjgzeHggaW50ZWdyYXRlZCBwcm9jZXNzb3JzICovCi0JICB7Ci0JICAgIHN3aXRjaCAocHJvY2Vzc29yWzNdKQotCSAgICAgIHsKLQkgICAgICBjYXNlICcwJzoJCQkgICAgLyogNjgzMDIsIDY4MzA2LCA2ODMwNyAqLwotCSAgICAgIGNhc2UgJzInOgkJCSAgICAvKiA2ODMyMiwgNjgzMjggKi8KLQkgICAgICBjYXNlICc1JzoJCQkgICAgLyogNjgzNTYgKi8KLQkJc3RyY3B5IChmYW1pbHksICI2ODAwMCIpOyAgIC8qIE1DNjgwMDAtYmFzZWQgY29udHJvbGxlcnMgKi8KLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICczJzoJCQkgICAgLyogNjgzMzAsIDY4MzMxLCA2ODMzMiwgNjgzMzMsCi0JCQkJCSAgICAgICA2ODMzNCwgNjgzMzUsIDY4MzM2LCA2ODMzOCAqLwotCSAgICAgIGNhc2UgJzYnOgkJCSAgICAvKiA2ODM2MCAqLwotCSAgICAgIGNhc2UgJzcnOgkJCSAgICAvKiA2ODM3NiAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7ICAgLyogQ1BVMzIgYW5kIENQVTMyKyAqLwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzQnOgotCQlpZiAocHJvY2Vzc29yWzRdID09ICc5JykgICAgLyogNjgzNDkgKi8KLQkJICBzdHJjcHkgKGZhbWlseSwgIjY4MDMwIik7IC8qIENQVTAzMCAqLwotCQllbHNlCQkgICAgICAgICAgICAvKiA2ODM0MCwgNjgzNDEgKi8KLQkJICBzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7IC8qIENQVTMyIGFuZCBDUFUzMisgKi8KLQkJYnJlYWs7Ci0KLQkgICAgICBkZWZhdWx0OgkJCSAgICAvKiBEb2VzIG5vdCBleGlzdCB5ZXQgKi8KLQkJc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOyAgIC8qIEd1ZXNzIGl0IHdpbGwgYmUgQ1BVMzIgKi8KLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAodG91cHBlciAocHJvY2Vzc29yWzNdKSA9PSAnRicpICAgLyogNjhGMzMzICovCi0JICBzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7CSAgICAgICAgICAvKiBDUFUzMiAqLwotCWVsc2UgaWYgKCh0b3VwcGVyIChwcm9jZXNzb3JbM10pID09ICdDJykgIC8qIEVtYmVkZGVkIGNvbnRyb2xsZXJzICovCi0JCSAmJiAoKHRvdXBwZXIgKHByb2Nlc3NvclsyXSkgPT0gJ0UnKQotCQkgICAgIHx8ICh0b3VwcGVyIChwcm9jZXNzb3JbMl0pID09ICdIJykKLQkJICAgICB8fCAodG91cHBlciAocHJvY2Vzc29yWzJdKSA9PSAnTCcpKSkKLQkgIHsKLQkgICAgc3RyY3B5IChmYW1pbHksICI2OCIpOwotCSAgICBzdHJuY2F0IChmYW1pbHksIHByb2Nlc3NvciArIDQsIDcpOwotCSAgICBmYW1pbHlbOV0gPSAnXDAnOwotCSAgfQotCWVsc2UJCQkJIC8qICJSZWd1bGFyIiBwcm9jZXNzb3JzICovCi0JICB7Ci0JICAgIHN0cm5jcHkgKGZhbWlseSwgcHJvY2Vzc29yLCA5KTsKLQkgICAgZmFtaWx5WzldID0gJ1wwJzsKLQkgIH0KLSAgICAgIH0KLSAgICBlbHNlIGlmICgoc3RybmNtcCAocHJvY2Vzc29yLCAiY3B1MzIiLCA1KSA9PSAwKSAvKiBDUFUzMiBhbmQgQ1BVMzIrICovCi0JICAgICB8fCAoc3RybmNtcCAocHJvY2Vzc29yLCAiQ1BVMzIiLCA1KSA9PSAwKSkKLSAgICAgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsKLSAgICBlbHNlCi0gICAgICB7Ci0Jc3RybmNweSAoZmFtaWx5LCBwcm9jZXNzb3IsIDkpOwotCWZhbWlseVs5XSA9ICdcMCc7Ci0gICAgICB9Ci0KLSAgICBhcmNoID0gYmZkX3NjYW5fYXJjaCAoZmFtaWx5KTsKLSAgICBpZiAoYXJjaCA9PSAwKQotICAgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0OwotICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFyY2g7Ci0gIH0KLQotICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSAhPSAoaW50KSBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtKQotICAgIHsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLSAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJmllZWUtPmFkLm51bWJlcl9vZl9iaXRzX21hdSkgPT0gZmFsc2UpCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJmllZWUtPmFkLm51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3MpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBieXRlIG9yZGVyIGluZm8sIHRha2UgaXQgKi8KLSAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gKGludCkgaWVlZV92YXJpYWJsZV9MX2VudW0gfHwKLSAgICAgIHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gKGludCkgaWVlZV92YXJpYWJsZV9NX2VudW0pCi0gICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotICBmb3IgKHBhcnQgPSAwOyBwYXJ0IDwgTl9XX1ZBUklBQkxFUzsgcGFydCsrKQotICAgIHsKLSAgICAgIGJvb2xlYW4gb2s7Ci0gICAgICBpZiAocmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpICE9IChpbnQpIGllZWVfYXNzaWduX3ZhbHVlX3RvX3ZhcmlhYmxlX2VudW0pCi0JewotCSAgZ290byBmYWlsOwotCX0KLSAgICAgIGlmICh0aGlzX2J5dGVfYW5kX25leHQgKCYoaWVlZS0+aCkpICE9IHBhcnQpCi0JewotCSAgZ290byBmYWlsOwotCX0KLQotICAgICAgaWVlZS0+dy5vZmZzZXRbcGFydF0gPSBwYXJzZV9pICgmKGllZWUtPmgpLCAmb2spOwotICAgICAgaWYgKG9rID09IGZhbHNlKQotCXsKLQkgIGdvdG8gZmFpbDsKLQl9Ci0KLSAgICB9Ci0KLSAgaWYgKGllZWUtPncuci5leHRlcm5hbF9wYXJ0ICE9IDApCi0gICAgYWJmZC0+ZmxhZ3MgPSBIQVNfU1lNUzsKLQotICAvKiBCeSBub3cgd2Uga25vdyB0aGF0IHRoaXMgaXMgYSByZWFsIElFRUUgZmlsZSwgd2UncmUgZ29pbmcgdG8gcmVhZAotICAgICB0aGUgd2hvbGUgdGhpbmcgaW50byBtZW1vcnkgc28gdGhhdCB3ZSBjYW4gcnVuIHVwIGFuZCBkb3duIGl0Ci0gICAgIHF1aWNrbHkuICBXZSBjYW4gd29yayBvdXQgaG93IGJpZyB0aGUgZmlsZSBpcyBmcm9tIHRoZSB0cmFpbGVyCi0gICAgIHJlY29yZCAqLwotCi0gIElFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSA9Ci0gICAgKHVuc2lnbmVkIGNoYXIgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsIGllZWUtPncuci5tZV9yZWNvcmQgKyAxKTsKLSAgaWYgKCFJRUVFX0RBVEEgKGFiZmQpLT5oLmZpcnN0X2J5dGUpCi0gICAgZ290byBmYWlsOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBmYWlsOwotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgKElFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSksIDEsCi0JICAgIGllZWUtPncuci5tZV9yZWNvcmQgKyAxLCBhYmZkKTsKLQotICBpZWVlX3NsdXJwX3NlY3Rpb25zIChhYmZkKTsKLQotICBpZiAoISBpZWVlX3NsdXJwX2RlYnVnIChhYmZkKSkKLSAgICBnb3RvIGZhaWw7Ci0KLSAgLyogUGFyc2Ugc2VjdGlvbiBkYXRhIHRvIGFjdGl2YXRlIGZpbGUgYW5kIHNlY3Rpb24gZmxhZ3MgaW1wbGllZCBieQotICAgICBzZWN0aW9uIGNvbnRlbnRzLiAqLwotCi0gIGlmICghIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKSkKLSAgICBnb3RvIGZhaWw7Ci0gICAgCi0gIHJldHVybiBhYmZkLT54dmVjOwotZ290X3dyb25nX2Zvcm1hdDoKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci1mYWlsOgotICAodm9pZCkgYmZkX3JlbGVhc2UgKGFiZmQsIGllZWUpOwotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSBzYXZlOwotICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLX0KLQotdm9pZAotaWVlZV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotICBpZiAoc3ltYm9sLT5uYW1lWzBdID09ICcgJykKLSAgICByZXQtPm5hbWUgPSAiKiBlbXB0eSB0YWJsZSBlbnRyeSAiOwotICBpZiAoIXN5bWJvbC0+c2VjdGlvbikKLSAgICByZXQtPnR5cGUgPSAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkgPyAnYScgOiAnQSc7Ci19Ci0KLXZvaWQKLWllZWVfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotI2lmIDAKLSAgICAgIGZwcmludGYgKGZpbGUsICIlNHggJTJ4IiwgYW91dF9zeW1ib2wgKHN5bWJvbCktPmRlc2MgJiAweGZmZmYsCi0JICAgICAgIGFvdXRfc3ltYm9sIChzeW1ib2wpLT5vdGhlciAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICBCRkRfRkFJTCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lID0KLQkgIChzeW1ib2wtPnNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwKLQkgICA/ICIqYWJzIgotCSAgIDogc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKLQlpZiAoc3ltYm9sLT5uYW1lWzBdID09ICcgJykKLQkgIHsKLQkgICAgZnByaW50ZiAoZmlsZSwgIiogZW1wdHkgdGFibGUgZW50cnkgIik7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCi0JICAgIGZwcmludGYgKGZpbGUsICIgJS01cyAlMDR4ICUwMnggJXMiLAotCQkgICAgIHNlY3Rpb25fbmFtZSwKLQkJICAgICAodW5zaWduZWQpIGllZWVfc3ltYm9sIChzeW1ib2wpLT5pbmRleCwKLQkJICAgICAodW5zaWduZWQpIDAsCi0JCSAgICAgc3ltYm9sLT5uYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLWRvX29uZSAoaWVlZSwgY3VycmVudF9tYXAsIGxvY2F0aW9uX3B0ciwgcywgaXRlcmF0aW9ucykKLSAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gICAgIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqY3VycmVudF9tYXA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmxvY2F0aW9uX3B0cjsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIGludCBpdGVyYXRpb25zOwotewotICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0gICAgewotICAgIGNhc2UgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW06Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IG51bWJlcl9vZl9tYXVzOwotCXVuc2lnbmVkIGludCBpOwotCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JbnVtYmVyX29mX21hdXMgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX29mX21hdXM7IGkrKykKLQkgIHsKLQkgICAgbG9jYXRpb25fcHRyW2N1cnJlbnRfbWFwLT5wYysrXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaWVlZV9sb2FkX3dpdGhfcmVsb2NhdGlvbl9lbnVtOgotICAgICAgewotCWJvb2xlYW4gbG9vcCA9IHRydWU7Ci0JbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQl3aGlsZSAobG9vcCkKLQkgIHsKLQkgICAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCSAgICAgIHsKLQkgICAgICBjYXNlIGllZWVfdmFyaWFibGVfUl9lbnVtOgotCi0JICAgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX3NpZ25lZF9vcGVuX2JfZW51bToKLQkgICAgICBjYXNlIGllZWVfZnVuY3Rpb25fdW5zaWduZWRfb3Blbl9iX2VudW06Ci0JICAgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bToKLQkJewotCQkgIHVuc2lnbmVkIGludCBleHRyYSA9IDQ7Ci0JCSAgYm9vbGVhbiBwY3JlbCA9IGZhbHNlOwotCQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCQkgIGllZWVfcmVsb2NfdHlwZSAqciA9Ci0JCSAgKGllZWVfcmVsb2NfdHlwZSAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwKLQkJCQkJCSBzaXplb2YgKGllZWVfcmVsb2NfdHlwZSkpOwotCQkgIGlmICghcikKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgICooY3VycmVudF9tYXAtPnJlbG9jX3RhaWxfcHRyKSA9IHI7Ci0JCSAgY3VycmVudF9tYXAtPnJlbG9jX3RhaWxfcHRyID0gJnItPm5leHQ7Ci0JCSAgci0+bmV4dCA9IChpZWVlX3JlbG9jX3R5cGUgKikgTlVMTDsKLQkJICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotLyoJCQkgICAgYWJvcnQoKTsqLwotCQkgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IDA7Ci0JCSAgcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwKLQkJCQkgICAgJnItPnJlbGVudC5hZGRlbmQsCi0JCQkJICAgICZyLT5zeW1ib2wsCi0JCQkJICAgICZwY3JlbCwgJmV4dHJhLCAmc2VjdGlvbik7Ci0JCSAgci0+cmVsZW50LmFkZHJlc3MgPSBjdXJyZW50X21hcC0+cGM7Ci0JCSAgcy0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCQkgIHMtPm93bmVyLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0JCSAgcy0+cmVsb2NfY291bnQrKzsKLQkJICBpZiAoci0+cmVsZW50LnN5bV9wdHJfcHRyID09IE5VTEwgJiYgc2VjdGlvbiAhPSBOVUxMKQotCQkgICAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0KLQkJICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX2NvbW1hKQotCQkgICAgewotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICAvKiBGZXRjaCBudW1iZXIgb2YgYnl0ZXMgdG8gcGFkICovCi0JCSAgICAgIGV4dHJhID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgfTsKLQotCQkgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQkJICAgIHsKLQkJICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9zaWduZWRfY2xvc2VfYl9lbnVtOgotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgaWVlZV9mdW5jdGlvbl91bnNpZ25lZF9jbG9zZV9iX2VudW06Ci0JCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9jbG9zZV9iX2VudW06Ci0JCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyogQnVpbGQgYSByZWxvY2F0aW9uIGVudHJ5IGZvciB0aGlzIHR5cGUgKi8KLQkJICAvKiBJZiBwYyByZWwgdGhlbiBzdGljayAtdmUgcGMgaW50byBpbnN0cnVjdGlvbgotCQkgICAgIGFuZCB0YWtlIG91dCBvZiByZWxvYyAuLgotCi0JCSAgICAgSSd2ZSBjaGFuZ2VkIHRoaXMuIEl0J3MgYWxsIHRvbyBjb21wbGljYXRlZC4gSQotCQkgICAgIGtlZXAgMCBpbiB0aGUgaW5zdHJ1Y3Rpb24gbm93LiAgKi8KLQotCQkgIHN3aXRjaCAoZXh0cmEpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICBjYXNlIDQ6Ci0KLQkJICAgICAgaWYgKHBjcmVsID09IHRydWUpCi0JCQl7Ci0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQkJCSAgYmZkX3B1dF8zMiAoaWVlZS0+aC5hYmZkLCAtY3VycmVudF9tYXAtPnBjLCBsb2NhdGlvbl9wdHIgKwotCQkJCSAgICAgIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWwzMl9ob3d0bzsKLQkJCSAgci0+cmVsZW50LmFkZGVuZCAtPQotCQkJICAgIGN1cnJlbnRfbWFwLT5wYzsKLSNlbHNlCi0JCQkgIGJmZF9wdXRfMzIgKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsKLQkJCQkgICAgICBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMzJfaG93dG87Ci0jZW5kaWYKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBiZmRfcHV0XzMyIChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArCi0JCQkJICAgICAgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmFiczMyX2hvd3RvOwotCQkJfQotCQkgICAgICBjdXJyZW50X21hcC0+cGMgKz0gNDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDI6Ci0JCSAgICAgIGlmIChwY3JlbCA9PSB0cnVlKQotCQkJewotI2lmIEtFRVBNSU5VU1BDSU5JTlNUCi0JCQkgIGJmZF9wdXRfMTYgKGllZWUtPmguYWJmZCwgKGludCkgKC1jdXJyZW50X21hcC0+cGMpLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuYWRkZW5kIC09IGN1cnJlbnRfbWFwLT5wYzsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDE2X2hvd3RvOwotI2Vsc2UKLQotCQkJICBiZmRfcHV0XzE2IChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWwxNl9ob3d0bzsKLSNlbmRpZgotCQkJfQotCi0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYmZkX3B1dF8xNiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmYWJzMTZfaG93dG87Ci0JCQl9Ci0JCSAgICAgIGN1cnJlbnRfbWFwLT5wYyArPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMToKLQkJICAgICAgaWYgKHBjcmVsID09IHRydWUpCi0JCQl7Ci0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQkJCSAgYmZkX3B1dF84IChpZWVlLT5oLmFiZmQsIChpbnQpICgtY3VycmVudF9tYXAtPnBjKSwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50LmFkZGVuZCAtPSBjdXJyZW50X21hcC0+cGM7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWw4X2hvd3RvOwotI2Vsc2UKLQkJCSAgYmZkX3B1dF84IChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWw4X2hvd3RvOwotI2VuZGlmCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYmZkX3B1dF84IChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZhYnM4X2hvd3RvOwotCQkJfQotCQkgICAgICBjdXJyZW50X21hcC0+cGMgKz0gMTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIEJGRF9GQUlMICgpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJewotCQkgIGJmZF92bWEgdGhpc19zaXplOwotCQkgIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ0aGlzX3NpemUpID09IHRydWUpCi0JCSAgICB7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBpOwotCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpc19zaXplOyBpKyspCi0JCQl7Ci0JCQkgIGxvY2F0aW9uX3B0cltjdXJyZW50X21hcC0+cGMrK10gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbG9vcCA9IGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgICAgfQotCi0JICAgIC8qIFByZXZlbnQgbW9yZSB0aGFuIHRoZSBmaXJzdCBsb2FkLWl0ZW0gb2YgYW4gTFIgcmVjb3JkCi0JICAgICAgIGZyb20gYmVpbmcgcmVwZWF0ZWQgKE1SSSBjb252ZW50aW9uKS4gKi8KLQkgICAgaWYgKGl0ZXJhdGlvbnMgIT0gMSkKLQkgICAgICBsb29wID0gZmFsc2U7Ci0JICB9Ci0gICAgICB9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiBhbGwgdGhlIHNlY3Rpb24gZGF0YSBhbmQgcmVsb2NhdGlvbiBzdHVmZiB0b28gKi8KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSAqbG9jYXRpb25fcHRyID0gKGJmZF9ieXRlICopIE5VTEw7Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fbnVtYmVyOwotCi0gIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqY3VycmVudF9tYXAgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIE5VTEw7Ci0gIGFzZWN0aW9uICpzOwotICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBhcmVhICovCi0gIGlmIChpZWVlLT5yZWFkX2RhdGEgPT0gdHJ1ZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWVlZS0+cmVhZF9kYXRhID0gdHJ1ZTsKLSAgaWVlZV9zZWVrIChhYmZkLCBpZWVlLT53LnIuZGF0YV9wYXJ0KTsKLQotICAvKiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCB0aGUgc2VjdGlvbiBjb250ZW50cyAqLwotCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKnBlciA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgcy0+dXNlZF9ieV9iZmQ7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQljb250aW51ZTsKLSAgICAgIHBlci0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmICghcGVyLT5kYXRhKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qU1VQUFJFU1MgNjgqLwotICAgICAgcGVyLT5yZWxvY190YWlsX3B0ciA9Ci0JKGllZWVfcmVsb2NfdHlwZSAqKikgJiAocy0+cmVsb2NhdGlvbik7Ci0gICAgfQotCi0gIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQl7Ci0JICAvKiBJRiB3ZSBzZWUgYW55dGhpbmcgc3RyYW5nZSB0aGVuIHF1aXQgKi8KLQlkZWZhdWx0OgotCSAgcmV0dXJuIHRydWU7Ci0KLQljYXNlIGllZWVfc2V0X2N1cnJlbnRfc2VjdGlvbl9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIHNlY3Rpb25fbnVtYmVyID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgcyA9IGllZWUtPnNlY3Rpb25fdGFibGVbc2VjdGlvbl9udW1iZXJdOwotCSAgcy0+ZmxhZ3MgfD0gU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTOwotCSAgY3VycmVudF9tYXAgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIHMtPnVzZWRfYnlfYmZkOwotCSAgbG9jYXRpb25fcHRyID0gY3VycmVudF9tYXAtPmRhdGEgLSBzLT52bWE7Ci0JICAvKiBUaGUgZG9jdW1lbnQgSSBoYXZlIHNheXMgdGhhdCBNaWNyb3RlYydzIGNvbXBpbGVycyByZXNldCAqLwotCSAgLyogdGhpcyBhZnRlciBhIHNlYyBzZWN0aW9uLCBldmVuIHRob3VnaCB0aGUgc3RhbmRhcmQgc2F5cyBub3QgKi8KLQkgIC8qIHRvLiBTTyAuLiAqLwotCSAgY3VycmVudF9tYXAtPnBjID0gcy0+dm1hOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQkgICAgewotCSAgICBjYXNlIGllZWVfc2V0X2N1cnJlbnRfcGNfZW51bSAmIDB4ZmY6Ci0JICAgICAgewotCQliZmRfdm1hIHZhbHVlOwotCQlpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbDsKLQkJdW5zaWduZWQgaW50IGV4dHJhOwotCQlib29sZWFuIHBjcmVsOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQltdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CS8qIFRob3cgYXdheSBzZWN0aW9uICMqLwotCQlwYXJzZV9leHByZXNzaW9uIChpZWVlLCAmdmFsdWUsCi0JCQkJICAmc3ltYm9sLAotCQkJCSAgJnBjcmVsLCAmZXh0cmEsCi0JCQkJICAwKTsKLQkJY3VycmVudF9tYXAtPnBjID0gdmFsdWU7Ci0JCUJGRF9BU1NFUlQgKCh1bnNpZ25lZCkgKHZhbHVlIC0gcy0+dm1hKSA8PSBzLT5fcmF3X3NpemUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGllZWVfdmFsdWVfc3RhcnRpbmdfYWRkcmVzc19lbnVtICYgMHhmZjoKLQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICAgIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpID09IGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtKQotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgICAgLyogV2UndmUgZ290IHRvIHRoZSBlbmQgb2YgdGhlIGRhdGEgbm93IC0gKi8KLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBCRkRfRkFJTCAoKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9yZXBlYXRfZGF0YV9lbnVtOgotCSAgewotCSAgICAvKiBSZXBlYXQgdGhlIGZvbGxvd2luZyBMRCBvciBMUiBuIHRpbWVzIC0gd2UgZG8gdGhpcyBieQotCQkgcmVtZW1iZXJpbmcgdGhlIHN0cmVhbSBwb2ludGVyIGJlZm9yZSBydW5uaW5nIGl0IGFuZAotCQkgcmVzZXR0aW5nIGl0IGFuZCBydW5uaW5nIGl0IG4gdGltZXMuIFdlIHNwZWNpYWwgY2FzZQotCQkgdGhlIHJlcGV0aXRpb24gb2YgYSByZXBlYXRfZGF0YS9sb2FkX2NvbnN0YW50Ci0JCSAqLwotCi0JICAgIHVuc2lnbmVkIGludCBpdGVyYXRpb25zOwotCSAgICB1bnNpZ25lZCBjaGFyICpzdGFydDsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgaXRlcmF0aW9ucyA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgICAgc3RhcnQgPSBpZWVlLT5oLmlucHV0X3A7Ci0JICAgIGlmIChzdGFydFswXSA9PSAoaW50KSBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bSAmJgotCQlzdGFydFsxXSA9PSAxKQotCSAgICAgIHsKLQkJd2hpbGUgKGl0ZXJhdGlvbnMgIT0gMCkKLQkJICB7Ci0JCSAgICBsb2NhdGlvbl9wdHJbY3VycmVudF9tYXAtPnBjKytdID0gc3RhcnRbMl07Ci0JCSAgICBpdGVyYXRpb25zLS07Ci0JCSAgfQotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJd2hpbGUgKGl0ZXJhdGlvbnMgIT0gMCkKLQkJICB7Ci0JCSAgICBpZWVlLT5oLmlucHV0X3AgPSBzdGFydDsKLQkJICAgIGlmICghZG9fb25lIChpZWVlLCBjdXJyZW50X21hcCwgbG9jYXRpb25fcHRyLCBzLAotCQkJCSBpdGVyYXRpb25zKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaXRlcmF0aW9ucy0tOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtOgotCWNhc2UgaWVlZV9sb2FkX3dpdGhfcmVsb2NhdGlvbl9lbnVtOgotCSAgewotCSAgICBpZiAoIWRvX29uZSAoaWVlZSwgY3VycmVudF9tYXAsIGxvY2F0aW9uX3B0ciwgcywgMSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci19Ci0KLWJvb2xlYW4KLWllZWVfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgbmV3c2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqbmV3c2VjdDsKLXsKLSAgbmV3c2VjdC0+dXNlZF9ieV9iZmQgPSAoUFRSKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpZWVlX3Blcl9zZWN0aW9uX3R5cGUpKTsKLSAgaWYgKCFuZXdzZWN0LT51c2VkX2J5X2JmZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGllZWVfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5kYXRhID0gKGJmZF9ieXRlICopIE5VTEw7Ci0gIGllZWVfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5zZWN0aW9uID0gbmV3c2VjdDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWllZWVfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmICghIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKnAgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLSAgICByZXR1cm4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwKLQkJCQkJICAgICAgb2Zmc2V0LCBjb3VudCk7Ci0gIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKTsKLSAgKHZvaWQpIG1lbWNweSAoKFBUUikgbG9jYXRpb24sIChQVFIpIChwLT5kYXRhICsgb2Zmc2V0KSwgKHVuc2lnbmVkKSBjb3VudCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1sb25nCi1pZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0vKiAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZDsqLwotICBpZWVlX3JlbG9jX3R5cGUgKnNyYyA9IChpZWVlX3JlbG9jX3R5cGUgKikgKHNlY3Rpb24tPnJlbG9jYXRpb24pOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgd2hpbGUgKHNyYyAhPSAoaWVlZV9yZWxvY190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgLyogV29yayBvdXQgd2hpY2ggc3ltYm9sIHRvIGF0dGFjaCBpdCB0aGlzIHJlbG9jIHRvICovCi0gICAgICBzd2l0Y2ggKHNyYy0+c3ltYm9sLmxldHRlcikKLQl7Ci0JY2FzZSAnSSc6Ci0JICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciA9Ci0JICAgIHN5bWJvbHMgKyBzcmMtPnN5bWJvbC5pbmRleCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9iYXNlX29mZnNldDsKLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICBzeW1ib2xzICsgc3JjLT5zeW1ib2wuaW5kZXggKyBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfYmFzZV9vZmZzZXQ7Ci0JICBicmVhazsKLQljYXNlIDA6Ci0JICBpZiAoc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgIT0gTlVMTCkKLQkgICAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICAgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyWzBdLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0KLQkgIEJGRF9GQUlMICgpOwotCX0KLSAgICAgICpyZWxwdHIrKyA9ICZzcmMtPnJlbGVudDsKLSAgICAgIHNyYyA9IHNyYy0+bmV4dDsKLSAgICB9Ci0gICpyZWxwdHIgPSAoYXJlbGVudCAqKSBOVUxMOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbXAgKGFwLCBicCkKLSAgICAgQ09OU1QgUFRSIGFwOwotICAgICBDT05TVCBQVFIgYnA7Ci17Ci0gIGFyZWxlbnQgKmEgPSAqKChhcmVsZW50ICoqKSBhcCk7Ci0gIGFyZWxlbnQgKmIgPSAqKChhcmVsZW50ICoqKSBicCk7Ci0gIHJldHVybiBhLT5hZGRyZXNzIC0gYi0+YWRkcmVzczsKLX0KLQotLyogV3JpdGUgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX3NlY3Rpb25fcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGFzZWN0aW9uICpzOwotICBpZWVlLT53LnIuc2VjdGlvbl9wYXJ0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChzKQotCSAgJiYgKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgPT0gMCkKLQl7Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2VjdGlvbl90eXBlX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCQkrIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaW1hZ2UgaXMgZXhlY3V0YWJsZSwgc28gb3V0cHV0IGFic29sdXRlIHNlY3Rpb25zICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX0FfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9TX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9DX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChzLT5mbGFncyAmIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSkpCi0JICAgIHsKLQkgICAgY2FzZSBTRUNfQ09ERSB8IFNFQ19MT0FEOgotCSAgICBjYXNlIFNFQ19DT0RFOgotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9QX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0VDX0RBVEE6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX0RfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTRUNfUk9NOgotCSAgICBjYXNlIFNFQ19ST00gfCBTRUNfREFUQToKLQkgICAgY2FzZSBTRUNfUk9NIHwgU0VDX0xPQUQ6Ci0JICAgIGNhc2UgU0VDX1JPTSB8IFNFQ19EQVRBIHwgU0VDX0xPQUQ6Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1JfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0KLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsIHMtPm5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0jaWYgMAotCSAgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDApOwkvKiBQYXJlbnQgKi8KLQkgIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKTsJLyogQnJvdGhlciAqLwotCSAgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDApOwkvKiBDb250ZXh0ICovCi0jZW5kaWYKLQkgIC8qIEFsaWdubWVudCAqLwotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NlY3Rpb25fYWxpZ25tZW50X2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCQkrIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMSA8PCBzLT5hbGlnbm1lbnRfcG93ZXIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNpemUgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3NlY3Rpb25fc2l6ZV9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkJKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLQkgICAgewotCSAgICAgIC8qIFJlbG9jYXRlYWJsZSBzZWN0aW9ucyBkb24ndCBoYXZlIGFzbCByZWNvcmRzICovCi0JICAgICAgLyogVm1hICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfc2VjdGlvbl9iYXNlX2FkZHJlc3NfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJKChiZmRfYnl0ZSkKLQkJCQkJIChzLT5pbmRleAotCQkJCQkgICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+bG1hKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotZG9fd2l0aF9yZWxvY3MgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1iZXJfb2ZfbWF1c19pbl9hZGRyZXNzID0KLSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKSAvIGJmZF9hcmNoX2JpdHNfcGVyX2J5dGUgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgcmVsb2NzX3RvX2dvID0gcy0+cmVsb2NfY291bnQ7Ci0gIGJmZF9ieXRlICpzdHJlYW0gPSBpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YTsKLSAgYXJlbGVudCAqKnAgPSBzLT5vcmVsb2NhdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBjdXJyZW50X2J5dGVfaW5kZXggPSAwOwotCi0gIHFzb3J0IChzLT5vcmVsb2NhdGlvbiwKLQkgcmVsb2NzX3RvX2dvLAotCSBzaXplb2YgKGFyZWxlbnQgKiopLAotCSBjb21wKTsKLQotICAvKiBPdXRwdXQgdGhlIHNlY3Rpb24gcHJlaGVhZGVyICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCAmJiByZWxvY3NfdG9fZ28gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+bG1hKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9leHByZXNzaW9uIChhYmZkLCAwLCBzLT5zeW1ib2wsIDAsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jc190b19nbyA9PSAwKQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NhdGlvbnMgdGhlbiBvdXRwdXQgdGhlIGxvYWQgY29uc3RhbnQKLQkgYnl0ZSBvcGNvZGUgcmF0aGVyIHRoYW4gdGhlIGxvYWQgd2l0aCByZWxvY2F0aW9uIG9wY29kZSAqLwotCi0gICAgICB3aGlsZSAoY3VycmVudF9ieXRlX2luZGV4IDwgcy0+X3Jhd19zaXplKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgcnVuOwotCSAgdW5zaWduZWQgaW50IE1BWFJVTiA9IDEyNzsKLQkgIHJ1biA9IE1BWFJVTjsKLQkgIGlmIChydW4gPiBzLT5fcmF3X3NpemUgLSBjdXJyZW50X2J5dGVfaW5kZXgpCi0JICAgIHsKLQkgICAgICBydW4gPSBzLT5fcmF3X3NpemUgLSBjdXJyZW50X2J5dGVfaW5kZXg7Ci0JICAgIH0KLQotCSAgaWYgKHJ1biAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAvKiBPdXRwdXQgYSBzdHJlYW0gb2YgYnl0ZXMgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcnVuKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpLAotCQkJICAgICAxLAotCQkJICAgICBydW4sCi0JCQkgICAgIGFiZmQpCi0JCSAgIT0gcnVuKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IHJ1bjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBPdXRwdXQgdGhlIGRhdGEgc3RyZWFtIGFzIHRoZSBsb25nZXN0IHNlcXVlbmNlIG9mIGJ5dGVzCi0JIHBvc3NpYmxlLCBhbGxvd2luZyBmb3IgdGhlIGEgcmVhc29uYWJsZSBwYWNrZXQgc2l6ZSBhbmQKLQkgcmVsb2NhdGlvbiBzdHVmZnMuICAqLwotCi0gICAgICBpZiAoKFBUUikgc3RyZWFtID09IChQVFIpIE5VTEwpCi0JewotCSAgLyogT3V0cHV0dGluZyBhIHNlY3Rpb24gd2l0aG91dCBkYXRhLCBmaWxsIGl0IHVwICovCi0JICBzdHJlYW0gPSAodW5zaWduZWQgY2hhciAqKSAoYmZkX2FsbG9jIChhYmZkLCBzLT5fcmF3X3NpemUpKTsKLQkgIGlmICghc3RyZWFtKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBtZW1zZXQgKChQVFIpIHN0cmVhbSwgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLQl9Ci0gICAgICB3aGlsZSAoY3VycmVudF9ieXRlX2luZGV4IDwgcy0+X3Jhd19zaXplKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgcnVuOwotCSAgdW5zaWduZWQgaW50IE1BWFJVTiA9IDEyNzsKLQkgIGlmIChyZWxvY3NfdG9fZ28pCi0JICAgIHsKLQkgICAgICBydW4gPSAoKnApLT5hZGRyZXNzIC0gY3VycmVudF9ieXRlX2luZGV4OwotCSAgICAgIGlmIChydW4gPiBNQVhSVU4pCi0JCXJ1biA9IE1BWFJVTjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcnVuID0gTUFYUlVOOwotCSAgICB9Ci0JICBpZiAocnVuID4gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4KQotCSAgICB7Ci0JICAgICAgcnVuID0gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4OwotCSAgICB9Ci0KLQkgIGlmIChydW4gIT0gMCkKLQkgICAgewotCSAgICAgIC8qIE91dHB1dCBhIHN0cmVhbSBvZiBieXRlcyAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCBydW4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgKHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCksCi0JCQkgICAgIDEsCi0JCQkgICAgIHJ1biwKLQkJCSAgICAgYWJmZCkKLQkJICAhPSBydW4pCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXggKz0gcnVuOwotCSAgICB9Ci0JICAvKiBPdXRwdXQgYW55IHJlbG9jYXRpb25zIGhlcmUgKi8KLQkgIGlmIChyZWxvY3NfdG9fZ28gJiYgKCpwKSAmJiAoKnApLT5hZGRyZXNzID09IGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkgICAgewotCSAgICAgIHdoaWxlIChyZWxvY3NfdG9fZ28KLQkJICAgICAmJiAoKnApICYmICgqcCktPmFkZHJlc3MgPT0gY3VycmVudF9ieXRlX2luZGV4KQotCQl7Ci0JCSAgYXJlbGVudCAqciA9ICpwOwotCQkgIGJmZF9zaWduZWRfdm1hIG92OwotCi0jaWYgMAotCQkgIGlmIChyLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JCSAgICB7Ci0JCSAgICAgIHItPmFkZGVuZCArPSBjdXJyZW50X2J5dGVfaW5kZXg7Ci0JCSAgICB9Ci0jZW5kaWYKLQotCQkgIHN3aXRjaCAoci0+aG93dG8tPnNpemUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDI6Ci0KLQkJICAgICAgb3YgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KTsKLQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAxOgotCQkgICAgICBvdiA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLAotCQkJCQkgICAgICBzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpOwotCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXggKz0gMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIG92ID0gYmZkX2dldF9zaWduZWRfOCAoYWJmZCwKLQkJCQkJICAgICBzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpOwotCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXgrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBvdiA9IDA7Ci0JCSAgICAgIEJGRF9GQUlMICgpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBvdiAmPSByLT5ob3d0by0+c3JjX21hc2s7Ci0KLQkJICBpZiAoci0+aG93dG8tPnBjX3JlbGF0aXZlCi0JCSAgICAgICYmICEgci0+aG93dG8tPnBjcmVsX29mZnNldCkKLQkJICAgIG92ICs9IHItPmFkZHJlc3M7Ci0KLQkJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJCSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLS8qCQkgIGFib3J0KCk7Ki8KLQotCQkgIGlmIChyLT5zeW1fcHRyX3B0ciAhPSAoYXN5bWJvbCAqKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgaWVlZV93cml0ZV9leHByZXNzaW9uIChhYmZkLCByLT5hZGRlbmQgKyBvdiwKLQkJCQkJCSAgICooci0+c3ltX3B0cl9wdHIpLAotCQkJCQkJICAgci0+aG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCQkJICAgcy0+aW5kZXgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgaWVlZV93cml0ZV9leHByZXNzaW9uIChhYmZkLCByLT5hZGRlbmQgKyBvdiwKLQkJCQkJCSAgIChhc3ltYm9sICopIE5VTEwsCi0JCQkJCQkgICByLT5ob3d0by0+cGNfcmVsYXRpdmUsCi0JCQkJCQkgICBzLT5pbmRleCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBpZiAobnVtYmVyX29mX21hdXNfaW5fYWRkcmVzcwotCQkgICAgICAhPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHItPmhvd3RvKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsCi0JCQkJCSAgICBiZmRfZ2V0X3JlbG9jX3NpemUgKHItPmhvd3RvKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCQkgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIHJlbG9jc190b19nby0tOwotCQkgIHArKzsKLQkJfQotCi0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJZiB0aGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMgaW4gdGhlIG91dHB1dCBzZWN0aW9uIHRoZW4gd2UgY2FuIGJlCi0gICBjbGV2ZXIgYWJvdXQgaG93IHdlIHdyaXRlLiAgV2UgYmxvY2sgaXRlbXMgdXAgaW50byBhIG1heCBvZiAxMjcKLSAgIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRvX2FzX3JlcGVhdCAoYWJmZCwgcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgaWYgKHMtPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfc2VjdGlvbl9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJKGJmZF9ieXRlKSAocy0+aW5kZXgKLQkJCQkJICAgICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0gPj4gOCkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0gJiAweGZmKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJKGJmZF9ieXRlKSAocy0+aW5kZXgKLQkJCQkJICAgICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPmxtYSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3JlcGVhdF9kYXRhX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5fcmF3X3NpemUpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZG9fd2l0aG91dF9yZWxvY3MgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGJmZF9ieXRlICpzdHJlYW0gPSBpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YTsKLQotICBpZiAoc3RyZWFtID09IDAgfHwgKChzLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKSkKLSAgICB7Ci0gICAgICBpZiAoISBkb19hc19yZXBlYXQgKGFiZmQsIHMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5fcmF3X3NpemU7IGkrKykKLQl7Ci0JICBpZiAoc3RyZWFtW2ldICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBkb193aXRoX3JlbG9jcyAoYWJmZCwgcykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGlmICghIGRvX2FzX3JlcGVhdCAoYWJmZCwgcykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0cl9zdGFydDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHJfZW5kOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlucHV0X3B0cl9zdGFydDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnB1dF9wdHI7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5wdXRfcHRyX2VuZDsKLXN0YXRpYyBiZmQgKmlucHV0X2JmZDsKLXN0YXRpYyBiZmQgKm91dHB1dF9iZmQ7Ci1zdGF0aWMgaW50IG91dHB1dF9idWZmZXI7Ci0KLXN0YXRpYyB2b2lkCi1maWxsICgpCi17Ci0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSBpbnB1dF9wdHJfc3RhcnQsIDEsIGlucHV0X3B0cl9lbmQgLSBpbnB1dF9wdHJfc3RhcnQsIGlucHV0X2JmZCk7Ci0gIGlucHV0X3B0ciA9IGlucHV0X3B0cl9zdGFydDsKLX0KLXN0YXRpYyB2b2lkCi1mbHVzaCAoKQotewotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAob3V0cHV0X3B0cl9zdGFydCksIDEsIG91dHB1dF9wdHIgLSBvdXRwdXRfcHRyX3N0YXJ0LAotCQkgb3V0cHV0X2JmZCkKLSAgICAgICE9IChiZmRfc2l6ZV90eXBlKSAob3V0cHV0X3B0ciAtIG91dHB1dF9wdHJfc3RhcnQpKQotICAgIGFib3J0ICgpOwotICBvdXRwdXRfcHRyID0gb3V0cHV0X3B0cl9zdGFydDsKLSAgb3V0cHV0X2J1ZmZlcisrOwotfQotCi0jZGVmaW5lIFRISVMoKSAoICppbnB1dF9wdHIgKQotI2RlZmluZSBORVhUKCkgeyBpbnB1dF9wdHIrKzsgaWYgKGlucHV0X3B0ciA9PSBpbnB1dF9wdHJfZW5kKSBmaWxsKCk7IH0KLSNkZWZpbmUgT1VUKHgpIHsgKm91dHB1dF9wdHIrKyA9ICh4KTsgaWYob3V0cHV0X3B0ciA9PSBvdXRwdXRfcHRyX2VuZCkgIGZsdXNoKCk7IH0KLQotc3RhdGljIHZvaWQKLXdyaXRlX2ludCAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgIE9VVCAodmFsdWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gICAgICAvKiBIb3cgbWFueSBzaWduaWZpY2FudCBieXRlcyA/ICovCi0gICAgICAvKiBGSVhNRSBGT1IgTE9OR0VSIElOVFMgKi8KLSAgICAgIGlmICh2YWx1ZSAmIDB4ZmYwMDAwMDApCi0JewotCSAgbGVuZ3RoID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDBmZjAwMDApCi0JewotCSAgbGVuZ3RoID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDAwMGZmMDApCi0JewotCSAgbGVuZ3RoID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JbGVuZ3RoID0gMTsKLQotICAgICAgT1VUICgoaW50KSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSArIGxlbmd0aCk7Ci0gICAgICBzd2l0Y2ggKGxlbmd0aCkKLQl7Ci0JY2FzZSA0OgotCSAgT1VUICh2YWx1ZSA+PiAyNCk7Ci0JY2FzZSAzOgotCSAgT1VUICh2YWx1ZSA+PiAxNik7Ci0JY2FzZSAyOgotCSAgT1VUICh2YWx1ZSA+PiA4KTsKLQljYXNlIDE6Ci0JICBPVVQgKHZhbHVlKTsKLQl9Ci0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb3B5X2lkICgpCi17Ci0gIGludCBsZW5ndGggPSBUSElTICgpOwotICBjaGFyIGNoOwotICBPVVQgKGxlbmd0aCk7Ci0gIE5FWFQgKCk7Ci0gIHdoaWxlIChsZW5ndGgtLSkKLSAgICB7Ci0gICAgICBjaCA9IFRISVMgKCk7Ci0gICAgICBPVVQgKGNoKTsKLSAgICAgIE5FWFQgKCk7Ci0gICAgfQotfQotCi0jZGVmaW5lIFZBUih4KSAoKHggfCAweDgwKSkKLXN0YXRpYyB2b2lkCi1jb3B5X2V4cHJlc3Npb24gKCkKLXsKLSAgaW50IHN0YWNrWzEwXTsKLSAgaW50ICp0b3MgPSBzdGFjazsKLSAgaW50IHZhbHVlID0gMDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgc3dpdGNoIChUSElTICgpKQotCXsKLQljYXNlIDB4ODQ6Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgzOgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgyOgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgKnRvcysrID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDB4ODE6Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgwOgotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IDA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgaWYgKFRISVMgKCkgPiAweDg0KQotCSAgICB7Ci0JICAgICAgLyogTm90IGEgbnVtYmVyLCBqdXN0IGJ1ZyBvdXQgd2l0aCB0aGUgYW5zd2VyICovCi0JICAgICAgd3JpdGVfaW50ICgqKC0tdG9zKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAqdG9zKysgPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhhNToKLQkgIC8qIFBMVVMgYW55dGhpbmcgKi8KLQkgIHsKLQkgICAgaW50IHZhbHVlID0gKigtLXRvcyk7Ci0JICAgIHZhbHVlICs9ICooLS10b3MpOwotCSAgICAqdG9zKysgPSB2YWx1ZTsKLQkgICAgTkVYVCAoKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgVkFSICgnUicpOgotCSAgewotCSAgICBpbnQgc2VjdGlvbl9udW1iZXI7Ci0JICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotCSAgICBhc2VjdGlvbiAqczsKLQkgICAgTkVYVCAoKTsKLQkgICAgc2VjdGlvbl9udW1iZXIgPSBUSElTICgpOwotCi0JICAgIE5FWFQgKCk7Ci0JICAgIGllZWUgPSBJRUVFX0RBVEEgKGlucHV0X2JmZCk7Ci0JICAgIHMgPSBpZWVlLT5zZWN0aW9uX3RhYmxlW3NlY3Rpb25fbnVtYmVyXTsKLQkgICAgaWYgKHMtPm91dHB1dF9zZWN0aW9uKQotCSAgICAgIHsKLQkJdmFsdWUgPSBzLT5vdXRwdXRfc2VjdGlvbi0+bG1hOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJdmFsdWUgPSAwOwotCSAgICAgIH0KLQkgICAgdmFsdWUgKz0gcy0+b3V0cHV0X29mZnNldDsKLQkgICAgKnRvcysrID0gdmFsdWU7Ci0JICAgIHZhbHVlID0gMDsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHg5MDoKLQkgIHsKLQkgICAgTkVYVCAoKTsKLQkgICAgd3JpdGVfaW50ICgqKC0tdG9zKSk7Ci0JICAgIE9VVCAoMHg5MCk7Ci0JICAgIHJldHVybjsKLQotCSAgfQotCX0KLSAgICB9Ci0KLX0KLQotLyogRHJvcCB0aGUgaW50IGluIHRoZSBidWZmZXIsIGFuZCBjb3B5IGEgbnVsbCBpbnRvIHRoZSBnYXAsIHdoaWNoIHdlCi0gICB3aWxsIG92ZXJ3cml0ZSBsYXRlciAqLwotCi1zdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciAqcHRycDsKLSAgaW50IGJ1ZmZlcjsKLX07Ci0KLXN0YXRpYyB2b2lkCi1maWxsX2ludCAoYnVmKQotICAgICBzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3QgKmJ1ZjsKLXsKLSAgaWYgKGJ1Zi0+YnVmZmVyID09IG91dHB1dF9idWZmZXIpCi0gICAgewotICAgICAgLyogU3RpbGwgYSBjaGFuY2UgdG8gb3V0cHV0IHRoZSBzaXplICovCi0gICAgICBpbnQgdmFsdWUgPSBvdXRwdXRfcHRyIC0gYnVmLT5wdHJwICsgMzsKLSAgICAgIGJ1Zi0+cHRycFswXSA9IHZhbHVlID4+IDI0OwotICAgICAgYnVmLT5wdHJwWzFdID0gdmFsdWUgPj4gMTY7Ci0gICAgICBidWYtPnB0cnBbMl0gPSB2YWx1ZSA+PiA4OwotICAgICAgYnVmLT5wdHJwWzNdID0gdmFsdWUgPj4gMDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kcm9wX2ludCAoYnVmKQotICAgICBzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3QgKmJ1ZjsKLXsKLSAgaW50IHR5cGUgPSBUSElTICgpOwotICBpbnQgY2g7Ci0gIGlmICh0eXBlIDw9IDB4ODQpCi0gICAgewotICAgICAgTkVYVCAoKTsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSAweDg0OgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODM6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MjoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgxOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODA6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBPVVQgKDB4ODQpOwotICBidWYtPnB0cnAgPSBvdXRwdXRfcHRyOwotICBidWYtPmJ1ZmZlciA9IG91dHB1dF9idWZmZXI7Ci0gIE9VVCAoMCk7Ci0gIE9VVCAoMCk7Ci0gIE9VVCAoMCk7Ci0gIE9VVCAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb3B5X2ludCAoKQotewotICBpbnQgdHlwZSA9IFRISVMgKCk7Ci0gIGludCBjaDsKLSAgaWYgKHR5cGUgPD0gMHg4NCkKLSAgICB7Ci0gICAgICBPVVQgKHR5cGUpOwotICAgICAgTkVYVCAoKTsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSAweDg0OgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoY2gpOwotCWNhc2UgMHg4MzoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODI6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgT1VUIChjaCk7Ci0JY2FzZSAweDgxOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoY2gpOwotCWNhc2UgMHg4MDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLSNkZWZpbmUgSUQgY29weV9pZCgpCi0jZGVmaW5lIElOVCBjb3B5X2ludCgpCi0jZGVmaW5lIEVYUCBjb3B5X2V4cHJlc3Npb24oKQotc3RhdGljIHZvaWQgY29weV90aWxsX2VuZCAoKTsKLSNkZWZpbmUgSU5UbihxKSBjb3B5X2ludCgpCi0jZGVmaW5lIEVYUG4ocSkgY29weV9leHByZXNzaW9uKCkKLQotc3RhdGljIHZvaWQKLWYxX3JlY29yZCAoKQotewotICBpbnQgY2g7Ci0gIC8qIEFUTiByZWNvcmQgKi8KLSAgTkVYVCAoKTsKLSAgY2ggPSBUSElTICgpOwotICBzd2l0Y2ggKGNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgT1VUICgweGYxKTsKLSAgICAgIE9VVCAoY2gpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGM5OgotICAgICAgTkVYVCAoKTsKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKDB4YzkpOwotICAgICAgSU5UOwotICAgICAgSU5UOwotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweDE2OgotCSAgTkVYVCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMToKLQkgIE5FWFQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4MDA6Ci0JICBORVhUICgpOwotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAzOgotCSAgTkVYVCAoKTsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMzoKLQkgIEVYUG4gKGluc3RydWN0aW9uIGFkZHJlc3MpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhkODoKLSAgICAgIC8qIEVYdGVybmFsIHJlZiAqLwotICAgICAgTkVYVCAoKTsKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKDB4ZDgpOwotICAgICAgRVhQOwotICAgICAgRVhQOwotICAgICAgRVhQOwotICAgICAgRVhQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGNlOgotICAgICAgTkVYVCAoKTsKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKDB4Y2UpOwotICAgICAgSU5UOwotICAgICAgSU5UOwotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgSU5UOwotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweDAxOgotCSAgSU5UOwotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAyOgotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDA0OgotCSAgRVhQbiAoZXh0ZXJuYWwgZnVuY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSAweDA1OgotCSAgYnJlYWs7Ci0JY2FzZSAweDA3OgotCSAgSU5UbiAobGluZSBudW1iZXIpOwotCSAgSU5UOwotCWNhc2UgMHgwODoKLQkgIGJyZWFrOwotCWNhc2UgMHgwYToKLQkgIElOVG4gKGxvY2tlZCByZWdpc3Rlcik7Ci0JICBJTlQ7Ci0JICBicmVhazsKLQljYXNlIDB4M2Y6Ci0JICBjb3B5X3RpbGxfZW5kICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDNlOgotCSAgY29weV90aWxsX2VuZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg0MDoKLQkgIGNvcHlfdGlsbF9lbmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4NDE6Ci0JICBJRDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQKLWYwX3JlY29yZCAoKQotewotICAvKiBBdHRyaWJ1dGUgcmVjb3JkICovCi0gIE5FWFQgKCk7Ci0gIE9VVCAoMHhmMCk7Ci0gIElOVG4gKFN5bWJvbCBuYW1lKTsKLSAgSUQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb3B5X3RpbGxfZW5kICgpCi17Ci0gIGludCBjaCA9IFRISVMgKCk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHdoaWxlIChjaCA8PSAweDgwKQotCXsKLQkgIE9VVCAoY2gpOwotCSAgTkVYVCAoKTsKLQkgIGNoID0gVEhJUyAoKTsKLQl9Ci0gICAgICBzd2l0Y2ggKGNoKQotCXsKLQljYXNlIDB4ODQ6Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODM6Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODI6Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODE6Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoVEhJUyAoKSk7Ci0JICBORVhUICgpOwotCi0JICBjaCA9IFRISVMgKCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQKLWYyX3JlY29yZCAoKQotewotICBORVhUICgpOwotICBPVVQgKDB4ZjIpOwotICBJTlQ7Ci0gIE5FWFQgKCk7Ci0gIE9VVCAoMHhjZSk7Ci0gIElOVDsKLSAgY29weV90aWxsX2VuZCAoKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBibG9jayAoKTsKLXN0YXRpYyB2b2lkCi1mOF9yZWNvcmQgKCkKLXsKLSAgaW50IGNoOwotICBORVhUICgpOwotICBjaCA9IFRISVMgKCk7Ci0gIHN3aXRjaCAoY2gpCi0gICAgewotICAgIGNhc2UgMHgwMToKLSAgICBjYXNlIDB4MDI6Ci0gICAgY2FzZSAweDAzOgotICAgICAgLyogVW5pcXVlIHR5cGVkZWZzIGZvciBtb2R1bGUgKi8KLSAgICAgIC8qIEdMb2JhbCB0eXBlZGVmcyAgKi8KLSAgICAgIC8qIEhpZ2ggbGV2ZWwgbW9kdWxlIHNjb3BlIGJlZ2lubmluZyAqLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUIChjaCk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0KLQlibG9jayAoKTsKLQotCU5FWFQgKCk7Ci0JZmlsbF9pbnQgKCZvYik7Ci0JT1VUICgweGY5KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwNDoKLSAgICAgIC8qIEdsb2JhbCBmdW5jdGlvbiAqLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDA0KTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJTlRuIChzdGFjayBzaXplKTsKLQlJTlRuIChyZXQgdmFsKTsKLQlFWFBuIChvZmZzZXQpOwotCi0JYmxvY2sgKCk7Ci0KLQlORVhUICgpOwotCU9VVCAoMHhmOSk7Ci0JRVhQbiAoc2l6ZSBvZiBibG9jayk7Ci0JZmlsbF9pbnQgKCZvYik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgwNToKLSAgICAgIC8qIEZpbGUgbmFtZSBmb3Igc291cmNlIGxpbmUgbnVtYmVycyAqLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDA1KTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJTlRuICh5ZWFyKTsKLQlJTlRuIChtb250aCk7Ci0JSU5UbiAoZGF5KTsKLQlJTlRuIChob3VyKTsKLQlJTlRuIChtb251dGUpOwotCUlOVG4gKHNlY29uZCk7Ci0JYmxvY2sgKCk7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MDY6Ci0gICAgICAvKiBMb2NhbCBmdW5jdGlvbiAqLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDA2KTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJTlRuIChzdGFjayBzaXplKTsKLQlJTlRuICh0eXBlIHJldHVybik7Ci0JRVhQbiAob2Zmc2V0KTsKLQlibG9jayAoKTsKLQlORVhUICgpOwotCU9VVCAoMHhmOSk7Ci0JRVhQbiAoc2l6ZSk7Ci0JZmlsbF9pbnQgKCZvYik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgwYToKLSAgICAgIC8qIEFzc2VtYmxlciBtb2R1bGUgc2NvcGUgYmVnaW5uaW5nIC0qLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQotCU5FWFQgKCk7Ci0JT1VUICgweGY4KTsKLQlPVVQgKDB4MGEpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCUlEOwotCUlOVDsKLQlJRDsKLQlJTlQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0JSU5UOwotCUlOVDsKLQotCWJsb2NrICgpOwotCi0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDBiOgotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDBiKTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJTlQ7Ci0JSU5UbiAoc2VjdGlvbiBpbmRleCk7Ci0JRVhQbiAob2Zmc2V0KTsKLQlJTlRuIChzdHVmZik7Ci0KLQlibG9jayAoKTsKLQotCU9VVCAoMHhmOSk7Ci0JTkVYVCAoKTsKLQlFWFBuIChTaXplIGluIE1hdXMpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZTJfcmVjb3JkICgpCi17Ci0gIE9VVCAoMHhlMik7Ci0gIE5FWFQgKCk7Ci0gIE9VVCAoMHhjZSk7Ci0gIE5FWFQgKCk7Ci0gIElOVDsKLSAgRVhQOwotfQotCi1zdGF0aWMgdm9pZAotYmxvY2sgKCkKLXsKLSAgaW50IGNoOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaCA9IFRISVMgKCk7Ci0gICAgICBzd2l0Y2ggKGNoKQotCXsKLQljYXNlIDB4ZTE6Ci0JY2FzZSAweGU1OgotCSAgcmV0dXJuOwotCWNhc2UgMHhmOToKLQkgIHJldHVybjsKLQljYXNlIDB4ZjA6Ci0JICBmMF9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4ZjE6Ci0JICBmMV9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4ZjI6Ci0JICBmMl9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4Zjg6Ci0JICBmOF9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBlMl9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQotCX0KLSAgICB9Ci19Ci0KLQotCi0vKiByZWxvY2F0ZV9kZWJ1ZywKLSAgIG1vdmVzIGFsbCB0aGUgZGVidWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgc291cmNlIGJmZCB0byB0aGUgb3V0cHV0Ci0gICBiZmQsIGFuZCByZWxvY2F0ZXMgYW55IGV4cHJlc3Npb25zIGl0IGZpbmRzCi0qLwotCi1zdGF0aWMgdm9pZAotcmVsb2NhdGVfZGVidWcgKG91dHB1dCwgaW5wdXQpCi0gICAgIGJmZCAqb3V0cHV0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaW5wdXQ7Ci17Ci0jZGVmaW5lIElCUyA0MDAKLSNkZWZpbmUgT0JTIDQwMAotICB1bnNpZ25lZCBjaGFyIGlucHV0X2J1ZmZlcltJQlNdOwotCi0gIGlucHV0X3B0cl9zdGFydCA9IGlucHV0X3B0ciA9IGlucHV0X2J1ZmZlcjsKLSAgaW5wdXRfcHRyX2VuZCA9IGlucHV0X2J1ZmZlciArIElCUzsKLSAgaW5wdXRfYmZkID0gaW5wdXQ7Ci0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSBpbnB1dF9wdHJfc3RhcnQsIDEsIElCUywgaW5wdXQpOwotICBibG9jayAoKTsKLX0KLQotLyoKLSAgRHVyaW5nIGxpbmtpbmcsIHdlIHdlIHRvbGQgYWJvdXQgdGhlIGJmZHMgd2hpY2ggbWFkZSB1cCBvdXIKLSAgY29udGVudHMsIHdlIGhhdmUgYSBsaXN0IG9mIHRoZW0uIFRoZXkgd2lsbCBzdGlsbCBiZSBvcGVuLCBzbyBnbyB0bwotICB0aGUgZGVidWcgaW5mbyBpbiBlYWNoLCBhbmQgY29weSBpdCBvdXQsIHJlbG9jYXRpbmcgaXQgYXMgd2UgZ28uCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgYmZkX2NoYWluX3R5cGUgKmNoYWluID0gaWVlZS0+Y2hhaW5fcm9vdDsKLSAgdW5zaWduZWQgY2hhciBvdXRwdXRfYnVmZmVyW09CU107Ci0gIGJvb2xlYW4gc29tZV9kZWJ1ZyA9IGZhbHNlOwotICBmaWxlX3B0ciBoZXJlID0gYmZkX3RlbGwgKGFiZmQpOwotCi0gIG91dHB1dF9wdHJfc3RhcnQgPSBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZmZlcjsKLSAgb3V0cHV0X3B0cl9lbmQgPSBvdXRwdXRfYnVmZmVyICsgT0JTOwotICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZmZlcjsKLSAgb3V0cHV0X2JmZCA9IGFiZmQ7Ci0KLSAgaWYgKGNoYWluID09IChiZmRfY2hhaW5fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQlpZiAoKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9IDA7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gaGVyZTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIGFiZmQpICE9IHMtPl9yYXdfc2l6ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKGNoYWluICE9IChiZmRfY2hhaW5fdHlwZSAqKSBOVUxMKQotCXsKLQkgIGJmZCAqZW50cnkgPSBjaGFpbi0+dGhpczsKLQkgIGllZWVfZGF0YV90eXBlICplbnRyeV9pZWVlID0gSUVFRV9EQVRBIChlbnRyeSk7Ci0JICBpZiAoZW50cnlfaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGVudHJ5LCBlbnRyeV9pZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCwKLQkJCSAgICBTRUVLX1NFVCkKLQkJICAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGVfZGVidWcgKGFiZmQsIGVudHJ5KTsKLQkgICAgfQotCi0JICBjaGFpbiA9IGNoYWluLT5uZXh0OwotCX0KLSAgICAgIGlmIChzb21lX2RlYnVnKQotCXsKLQkgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gaGVyZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSAwOwotCX0KLQotICAgICAgZmx1c2ggKCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSB0aGUgZGF0YSBpbiBhbiBpZWVlIHdheS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2RhdGFfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBpZWVlLT53LnIuZGF0YV9wYXJ0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgLyogU2tpcCBzZWN0aW9ucyB0aGF0IGhhdmUgbm8gbG9hZGFibGUgY29udGVudHMgKC5ic3MsCi0gICAgICAgICBkZWJ1Z2dpbmcsIGV0Yy4pICAqLwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTb3J0IHRoZSByZWxvYyByZWNvcmRzIHNvIHdlIGNhbiBpbnNlcnQgdGhlbSBpbiB0aGUgY29ycmVjdAotCSBwbGFjZXMgKi8KLSAgICAgIGlmIChzLT5yZWxvY19jb3VudCAhPSAwKQotCXsKLQkgIGlmICghIGRvX3dpdGhfcmVsb2NzIChhYmZkLCBzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBkb193aXRob3V0X3JlbG9jcyAoYWJmZCwgcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi1pbml0X2Zvcl9vdXRwdXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQljb250aW51ZTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgIT0gMCkKLQl7Ci0JICBpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSAoYmZkX2FsbG9jIChhYmZkLCBzLT5fcmF3X3NpemUpKTsKLQkgIGlmICghaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBleGVjIGFuZCBjb3JlIGZpbGUgc2VjdGlvbnMgKi8KLQotLyogc2V0IHNlY3Rpb24gY29udGVudHMgaXMgY29tcGxpY2F0ZWQgd2l0aCBJRUVFIHNpbmNlIHRoZSBmb3JtYXQgaXMKLSogbm90IGEgYnl0ZSBpbWFnZSwgYnV0IGEgcmVjb3JkIHN0cmVhbS4KLSovCi1ib29sZWFuCi1pZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0JICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIC8qIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgZXZlcnl0aGluZwotICAgICAgICAgaXMgd2l0aGluIHJhbmdlLiAgKi8KLSAgICAgIG1lbWNweSAoc2VjdGlvbi0+Y29udGVudHMgKyBvZmZzZXQsIGxvY2F0aW9uLCBjb3VudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGllZWVfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghaW5pdF9mb3Jfb3V0cHV0IChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBtZW1jcHkgKChQVFIpIChpZWVlX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSArIG9mZnNldCksCi0JICAoUFRSKSBsb2NhdGlvbiwKLQkgICh1bnNpZ25lZCBpbnQpIGNvdW50KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIHRoZSBleHRlcm5hbCBzeW1ib2xzIG9mIGEgZmlsZS4gIElFRUUgY29uc2lkZXJzIHR3byBzb3J0cyBvZgotICAgZXh0ZXJuYWwgc3ltYm9scywgcHVibGljLCBhbmQgcmVmZXJlbmNlZC4gIEl0IHVzZXMgdG8gaW50ZXJuYWwKLSAgIGZvcm1zIHRvIGluZGV4IHRoZW0gYXMgd2VsbC4gIFdoZW4gd2Ugd3JpdGUgdGhlbSBvdXQgd2UgdHVybiB0aGVpcgotICAgc3ltYm9sIHZhbHVlcyBpbnRvIGluZGV4ZXMgZnJvbSB0aGUgcmlnaHQgYmFzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqKnE7Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICB1bnNpZ25lZCBpbnQgcmVmZXJlbmNlX2luZGV4ID0gSUVFRV9SRUZFUkVOQ0VfQkFTRTsKLSAgdW5zaWduZWQgaW50IHB1YmxpY19pbmRleCA9IElFRUVfUFVCTElDX0JBU0UgKyAyOwotICBmaWxlX3B0ciBoZXJlID0gYmZkX3RlbGwgKGFiZmQpOwotICBib29sZWFuIGhhZG9uZSA9IGZhbHNlOwotICBpZiAoYWJmZC0+b3V0c3ltYm9scyAhPSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICB7Ci0KLSAgICAgIGZvciAocSA9IGFiZmQtPm91dHN5bWJvbHM7ICpxICE9IChhc3ltYm9sICopIE5VTEw7IHErKykKLQl7Ci0JICBhc3ltYm9sICpwID0gKnE7Ci0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChwLT5zZWN0aW9uKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbXVzdCBiZSBhIHN5bWJvbCByZWZlcmVuY2UgLi4gKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcmVmZXJlbmNlX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcC0+bmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBwLT52YWx1ZSA9IHJlZmVyZW5jZV9pbmRleDsKLQkgICAgICByZWZlcmVuY2VfaW5kZXgrKzsKLQkgICAgICBoYWRvbmUgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHdlYWsgcmVmZXJlbmNlICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJlZmVyZW5jZV9pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIHAtPm5hbWUpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJCWllZWVfd2Vha19leHRlcm5hbF9yZWZlcmVuY2VfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCByZWZlcmVuY2VfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcC0+dmFsdWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcC0+dmFsdWUgPSByZWZlcmVuY2VfaW5kZXg7Ci0JICAgICAgcmVmZXJlbmNlX2luZGV4Kys7Ci0JICAgICAgaGFkb25lID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAocC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtdXN0IGJlIGEgc3ltYm9sIGRlZmluaXRpb24gKi8KLQotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlcm5hbF9zeW1ib2xfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwdWJsaWNfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBwLT5uYW1lKQotCQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfYXR0cmlidXRlX3JlY29yZF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMTUpIC8qIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMTkpIC8qIHN0YXRpYyBzeW1ib2wgKi8KLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMSkpIC8qIG9uZSBvZiB0aGVtICovCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgdmFsdWUgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV92YWx1ZV9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwdWJsaWNfaW5kZXgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChwLT5zZWN0aW9uKSkKLQkJewotCQkgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgZnVsbHkgbGlua2VkLCB0aGVuIG91dHB1dCBhbGwgc3ltYm9scwotCQkJIHJlbG9jYXRlZCAqLwotCQkgICAgICBpZiAoISAoaWVlZV93cml0ZV9pbnQKLQkJCSAgICAgKGFiZmQsCi0JCQkgICAgICAocC0+dmFsdWUKLQkJCSAgICAgICArIHAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICArIHAtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoaWVlZV93cml0ZV9leHByZXNzaW9uCi0JCQkgICAgIChhYmZkLAotCQkJICAgICAgcC0+dmFsdWUgKyBwLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkJICAgICAgcC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnN5bWJvbCwKLQkJCSAgICAgIGZhbHNlLCAwKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsCi0JCQkJCSAgICAgICBwLT52YWx1ZSwKLQkJCQkJICAgICAgIGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCwKLQkJCQkJICAgICAgIGZhbHNlLCAwKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIHAtPnZhbHVlID0gcHVibGljX2luZGV4OwotCSAgICAgIHB1YmxpY19pbmRleCsrOwotCSAgICAgIGhhZG9uZSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiAtIHdoZW4gdGhlcmUgYXJlIGdhcHMgaW4gdGhlIHN5bWJvbHMgcmVhZCAqLwotCSAgICAgIC8qIGZyb20gYW4gaW5wdXQgaWVlZSBmaWxlICovCi0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoaGFkb25lKQotICAgIGllZWUtPncuci5leHRlcm5hbF9wYXJ0ID0gaGVyZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgQ09OU1QgdW5zaWduZWQgY2hhciBleHRlbltdID0KLXsKLSAgMHhmMCwgMHgyMCwgMHgwMCwKLSAgMHhmMSwgMHhjZSwgMHgyMCwgMHgwMCwgMzcsIDMsIDMsCS8qIFNldCB2ZXJzaW9uIDMgcmV2IDMgICAJKi8KLSAgMHhmMSwgMHhjZSwgMHgyMCwgMHgwMCwgMzksIDIsLyoga2VlcCBzeW1ib2wgaW4gIG9yaWdpbmFsIGNhc2UgKi8KLSAgMHhmMSwgMHhjZSwgMHgyMCwgMHgwMCwgMzgJLyogc2V0IG9iamVjdCB0eXBlIHJlbG9jYXRlYWJsZSB0byB4ICovCi19OwotCi1zdGF0aWMgQ09OU1QgdW5zaWduZWQgY2hhciBlbnZpW10gPQotewotICAweGYwLCAweDIxLCAweDAwLAotCi0vKiAgICAweGYxLCAweGNlLCAweDIxLCAwMCwgNTAsIDB4ODIsIDB4MDcsIDB4YzcsIDB4MDksIDB4MTEsIDB4MTEsCi0gICAgMHgxOSwgMHgyYywKLSovCi0gIDB4ZjEsIDB4Y2UsIDB4MjEsIDAwLCA1MiwgMHgwMCwJLyogZXhlYyBvayAqLwotCi0gIDB4ZjEsIDB4Y2UsIDB4MjEsIDAsIDUzLCAweDAzLC8qIGhvc3QgdW5peCAqLwotLyogICAgMHhmMSwgMHhjZSwgMHgyMSwgMCwgNTQsIDIsMSwxCXRvb2wgJiB2ZXJzaW9uICMgKi8KLX07Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX21lX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBpZWVlLT53LnIudHJhaWxlcl9wYXJ0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYWJmZC0+c3RhcnRfYWRkcmVzcykKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV92YWx1ZV9zdGFydGluZ19hZGRyZXNzX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBhYmZkLT5zdGFydF9hZGRyZXNzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fZWl0aGVyX2Nsb3NlX2JfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWVlZS0+dy5yLm1lX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX21vZHVsZV9lbmRfZW51bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBJRUVFIHByb2Nlc3NvciBJRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX3Byb2Nlc3NvciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2g7Ci0KLSAgYXJjaCA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKTsKLSAgc3dpdGNoIChhcmNoLT5hcmNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgYmZkX3ByaW50YWJsZV9uYW1lIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiMjkwMDAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiSDgvMzAwIikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIkg4LzUwMCIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgc3dpdGNoIChhcmNoLT5tYWNoKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX21hY2hfaTk2MF9jb3JlOgotCWNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2MEtBIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfbWFjaF9pOTYwX2tiX3NiOgotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjgwOTYwS0IiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBDQSIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX21hY2hfaTk2MF9tYzoKLQljYXNlIGJmZF9tYWNoX2k5NjBfeGE6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBNQyIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIHsKLQljb25zdCBjaGFyICppZDsKLQotCXN3aXRjaCAoYXJjaC0+bWFjaCkKLQkgIHsKLQkgIGRlZmF1bHQ6CQlpZCA9ICI2ODAyMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMDA6IGlkID0gIjY4MDAwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAwODogaWQgPSAiNjgwMDgiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDEwOiBpZCA9ICI2ODAxMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6IGlkID0gIjY4MDIwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAzMDogaWQgPSAiNjgwMzAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDQwOiBpZCA9ICI2ODA0MCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwNjA6IGlkID0gIjY4MDYwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2NwdTMyOiAgaWQgPSAiY3B1MzIiOyBicmVhazsKLQkgIH0KLQotCWlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsIGlkKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgZmlsZV9wdHIgb2xkOwotCi0gIC8qIEZhc3QgZm9yd2FyZCBvdmVyIHRoZSBoZWFkZXIgYXJlYSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9tb2R1bGVfYmVnaW5uaW5nX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfcHJvY2Vzc29yIChhYmZkKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBhYmZkLT5maWxlbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZhc3QgZm9yd2FyZCBvdmVyIHRoZSB2YXJpYWJsZSBiaXRzICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfZW51bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEJpdHMgcGVyIE1BVSAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKGJmZF9hcmNoX2JpdHNfcGVyX2J5dGUgKGFiZmQpKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBNQVUncyBwZXIgYWRkcmVzcyAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgKGJmZF9ieXRlKSAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkKLQkJCQkgICAgIC8gYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgb2xkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKDggKiBOX1dfVkFSSUFCTEVTKSwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGllZWUtPncuci5leHRlbnNpb25fcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBleHRlbiwgMSwgc2l6ZW9mIChleHRlbiksIGFiZmQpICE9IHNpemVvZiAoZXh0ZW4pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMHgxKSkgLyogQWJzb2x1dGUgKi8KLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAweDIpKSAvKiBSZWxvY2F0ZWFibGUgKi8KLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGllZWUtPncuci5lbnZpcm9ubWVudGFsX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKGJmZF93cml0ZSAoKGNoYXIgKikgZW52aSwgMSwgc2l6ZW9mIChlbnZpKSwgYWJmZCkgIT0gc2l6ZW9mIChlbnZpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIEhQIGVtdWxhdG9yIGRhdGFiYXNlIHJlcXVpcmVzIGEgdGltZXN0YW1wIGluIHRoZSBmaWxlLiAgKi8KLSAgewotICAgIHRpbWVfdCBub3c7Ci0gICAgY29uc3Qgc3RydWN0IHRtICp0OwotCi0gICAgdGltZSAoJm5vdyk7Ci0gICAgdCA9IChzdHJ1Y3QgdG0gKikgbG9jYWx0aW1lICgmbm93KTsKLSAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDB4MjEpCi0JfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDApCi0JfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDUwKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX3llYXIgKyAxOTAwKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX21vbiArIDEpCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbWRheSkKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9ob3VyKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX21pbikKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9zZWMpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgb3V0cHV0X2JmZCA9IGFiZmQ7Ci0KLSAgZmx1c2ggKCk7Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLyogRmlyc3Qgd3JpdGUgdGhlIHN5bWJvbHMuICBUaGlzIGNoYW5nZXMgdGhlaXIgdmFsdWVzIGludG8gdGFibGUKLSAgICBpbmRlY2VzIHNvIHdlIGNhbnQgdXNlIGl0IGFmdGVyIHRoaXMgcG9pbnQuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiAgaWVlZV93cml0ZV9ieXRlKGFiZmQsIGllZWVfcmVjb3JkX3NlcGVyYXRvcl9lbnVtKTsqLwotCi0gIC8qICBpZWVlX3dyaXRlX2J5dGUoYWJmZCwgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0pOyovCi0KLQotICAvKiBXcml0ZSBhbnkgZGVidWdzIHdlIGhhdmUgYmVlbiB0b2xkIGFib3V0LiAgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ2FuIG9ubHkgd3JpdGUgdGhlIGRhdGEgb25jZSB0aGUgc3ltYm9scyBoYXZlIGJlZW4gd3JpdHRlbiwgc2luY2UKLSAgICAgdGhlIGRhdGEgY29udGFpbnMgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aGljaCBwb2ludHMgdG8gdGhlCi0gICAgIHN5bWJvbHMuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2RhdGFfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEF0IHRoZSBlbmQgd2UgcHV0IHRoZSBlbmQhICAqLwotICBpZiAoISBpZWVlX3dyaXRlX21lX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZW5lcmF0ZSB0aGUgaGVhZGVyICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2xkLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5fV19WQVJJQUJMRVM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpIGkpCi0JICB8fCAhIGllZWVfd3JpdGVfaW50NV9vdXQgKGFiZmQsIGllZWUtPncub2Zmc2V0W2ldKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTmF0aXZlLWxldmVsIGludGVyZmFjZSB0byBzeW1ib2xzLiAqLwotCi0vKiBXZSByZWFkIHRoZSBzeW1ib2xzIGludG8gYSBidWZmZXIsIHdoaWNoIGlzIGRpc2NhcmRlZCB3aGVuIHRoaXMKLSAgIGZ1bmN0aW9uIGV4aXRzLiAgV2UgcmVhZCB0aGUgc3RyaW5ncyBpbnRvIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0bwotICAgaG9sZCB0aGVtIGFsbCBwbHVzIGFsbCB0aGUgY2FjaGVkIHN5bWJvbCBlbnRyaWVzLiAqLwotCi1hc3ltYm9sICoKLWllZWVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9zeW1ib2xfdHlwZSAqbmV3ID0KLSAgICAoaWVlZV9zeW1ib2xfdHlwZSAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChpZWVlX3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotc3RhdGljIGJmZCAqCi1pZWVlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgcHJldikKLSAgICAgYmZkICphcmNoOwotICAgICBiZmQgKnByZXY7Ci17Ci0gIGllZWVfYXJfZGF0YV90eXBlICphciA9IElFRUVfQVJfREFUQSAoYXJjaCk7Ci0gIC8qIHRha2UgdGhlIG5leHQgb25lIGZyb20gdGhlIGFyY2ggc3RhdGUsIG9yIHJlc2V0ICovCi0gIGlmIChwcmV2ID09IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZXNldCB0aGUgaW5kZXggLSB0aGUgZmlyc3QgdHdvIGVudHJpZXMgYXJlIGJvZ3VzKi8KLSAgICAgIGFyLT5lbGVtZW50X2luZGV4ID0gMjsKLSAgICB9Ci0gIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIGllZWVfYXJfb2JzdGFja190eXBlICpwID0gYXItPmVsZW1lbnRzICsgYXItPmVsZW1lbnRfaW5kZXg7Ci0gICAgICBhci0+ZWxlbWVudF9pbmRleCsrOwotICAgICAgaWYgKGFyLT5lbGVtZW50X2luZGV4IDw9IGFyLT5lbGVtZW50X2NvdW50KQotCXsKLQkgIGlmIChwLT5maWxlX29mZnNldCAhPSAoZmlsZV9wdHIpIDApCi0JICAgIHsKLQkgICAgICBpZiAocC0+YWJmZCA9PSAoYmZkICopIE5VTEwpCi0JCXsKLQkJICBwLT5hYmZkID0gX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIChhcmNoKTsKLQkJICBwLT5hYmZkLT5vcmlnaW4gPSBwLT5maWxlX29mZnNldDsKLQkJfQotCSAgICAgIHJldHVybiBwLT5hYmZkOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLQkgIHJldHVybiAoYmZkICopIE5VTEw7Ci0JfQotCi0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKLQkJCXNlY3Rpb24sCi0JCQlzeW1ib2xzLAotCQkJb2Zmc2V0LAotCQkJZmlsZW5hbWVfcHRyLAotCQkJZnVuY3Rpb25uYW1lX3B0ciwKLQkJCWxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludAotaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBpZWVlX2FyX2RhdGFfdHlwZSAqYXIgPSAoaWVlZV9hcl9kYXRhX3R5cGUgKikgTlVMTDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLSAgICBhciA9IGFiZmQtPm15X2FyY2hpdmUtPnRkYXRhLmllZWVfYXJfZGF0YTsKLSAgaWYgKGFyID09IChpZWVlX2FyX2RhdGFfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChJRUVFX0RBVEEgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGllZWVfb2JqZWN0X3AgKGFiZmQpID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICBpZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBidWYtPnN0X3NpemUgPSBpZWVlLT53LnIubWVfcmVjb3JkICsgMTsKLSAgYnVmLT5zdF9tb2RlID0gMDY0NDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWllZWVfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIGRlYnVnIGluZm8gcm91dGluZXMgYXJlIG5ldmVyIHVzZWQuICAqLwotI2lmIDAKLQotc3RhdGljIHZvaWQKLWllZWVfYmZkX2RlYnVnX2luZm9fc3RhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLQotfQotCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19lbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLQotfQotCi0KLS8qIEFkZCB0aGlzIHNlY3Rpb24gdG8gdGhlIGxpc3Qgb2Ygc2VjdGlvbnMgd2UgaGF2ZSBkZWJ1ZyBpbmZvIGZvciwgdG8KLSAgIGJlIHJlYWR5IHRvIG91dHB1dCBpdCBhdCBjbG9zZSB0aW1lCi0gICAqLwotc3RhdGljIHZvaWQKLWllZWVfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKHNlY3Rpb24tPm93bmVyKTsKLSAgaWVlZV9kYXRhX3R5cGUgKm91dHB1dF9pZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgLyogY2FuIG9ubHkgYWNjdW11bGF0ZSBkYXRhIGZyb20gb3RoZXIgaWVlZSBiZmRzICovCi0gIGlmIChzZWN0aW9uLT5vd25lci0+eHZlYyAhPSBhYmZkLT54dmVjKQotICAgIHJldHVybjsKLSAgLyogT25seSBib3RoZXIgb25jZSBwZXIgYmZkICovCi0gIGlmIChpZWVlLT5kb25lX2RlYnVnID09IHRydWUpCi0gICAgcmV0dXJuOwotICBpZWVlLT5kb25lX2RlYnVnID0gdHJ1ZTsKLQotICAvKiBEb24ndCBib3RoZXIgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mbyAqLwotICBpZiAoaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPT0gMCkKLSAgICByZXR1cm47Ci0KLQotICAvKiBBZGQgdG8gY2hhaW4gKi8KLSAgewotICAgIGJmZF9jaGFpbl90eXBlICpuID0gKGJmZF9jaGFpbl90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChiZmRfY2hhaW5fdHlwZSkpOwotICAgIGlmICghbikKLSAgICAgIGFib3J0ICgpOwkJLyogRklYTUUgKi8KLSAgICBuLT50aGlzID0gc2VjdGlvbi0+b3duZXI7Ci0gICAgbi0+bmV4dCA9IChiZmRfY2hhaW5fdHlwZSAqKSBOVUxMOwotCi0gICAgaWYgKG91dHB1dF9pZWVlLT5jaGFpbl9oZWFkKQotICAgICAgewotCW91dHB1dF9pZWVlLT5jaGFpbl9oZWFkLT5uZXh0ID0gbjsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0Jb3V0cHV0X2llZWUtPmNoYWluX3Jvb3QgPSBuOwotCi0gICAgICB9Ci0gICAgb3V0cHV0X2llZWUtPmNoYWluX2hlYWQgPSBuOwotICB9Ci19Ci0KLSNlbmRpZgotCi0jZGVmaW5lCWllZWVfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGllZWVfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgaWVlZV9zbHVycF9hcm1hcCBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX3RydWUKLSNkZWZpbmUgaWVlZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfdHJ1ZSkKLSNkZWZpbmUgaWVlZV90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIGllZWVfd3JpdGVfYXJtYXAgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBpZWVlX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBpZWVlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLSNkZWZpbmUgaWVlZV9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0KLSNkZWZpbmUgaWVlZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGllZWVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGllZWVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBpZWVlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgaWVlZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBpZWVlX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGllZWVfc2V0X2FyY2hfbWFjaCBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaAotCi0jZGVmaW5lIGllZWVfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBpZWVlX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgaWVlZV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGllZWVfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGllZWVfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBpZWVlX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGllZWVfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0vKlNVUFBSRVNTIDQ2MCAqLwotY29uc3QgYmZkX3RhcmdldCBpZWVlX3ZlYyA9Ci17Ci0gICJpZWVlIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LAotICAgaWVlZV9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGllZWVfYXJjaGl2ZV9wLAotICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWVlZV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGllZWUpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGllZWUpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGllZWUpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvaWhleC5jIGIvYmZkL2loZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwYzU5Yi4uMDAwMDAwMAotLS0gYS9iZmQvaWhleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIEhleCBvYmplY3RzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3Igb2YgQ3lnbnVzIFN1cHBvcnQgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIHdoYXQgSW50ZWwgSGV4IGZpbGVzIGxvb2sgbGlrZToKLQotMS4gSU5URUwgRk9STUFUUwotCi1BLiBJbnRlbCAxCi0KLSAgIDE2LWJpdCBhZGRyZXNzLWZpZWxkIGZvcm1hdCwgZm9yIGZpbGVzIDY0ayBieXRlcyBpbiBsZW5ndGggb3IgbGVzcy4KLQotICAgREFUQSBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbig6KQotICAgMi4uMwkJVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIGhleCBub3RhdGlvbgotICAgNC4uNQkJSGlnaCBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCi0gICA2Li43CQlMb3cgYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAwIgotICAgMTAuLngJRGF0YSBieXRlcyBpbiBoZXggbm90YXRpb246Ci0JeCA9IChudW1iZXIgb2YgYnl0ZXMgLSAxKSAqIDIgKyAxMQotICAgeCsxLi54KzIJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICB4KzMuLngrNAlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi0gICBFTkQgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDAiCi0gICA0Li43CQlUcmFuc2Zlci1hZGRyZXNzICh1c3VhbGx5ICIwMDAwIikKLQkJdGhlIGp1bXAtdG8gYWRkcmVzcywgZXhlY3V0aW9uIHN0YXJ0IGFkZHJlc3MKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMSIKLSAgIDEwLi4xMQlDaGVja3N1bSwgaW4gaGV4IG5vdGF0aW9uCi0gICAxMi4uMTMJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotQi4gSU5URUwgMgotCi0gICBNQ1MtODYgZm9ybWF0LCB1c2luZyBhIDIwLWJpdCBhZGRyZXNzIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA2NEsgYnl0ZXMuCi0KLSAgIERBVEEgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCBvZiB0aGlzIHJlY29yZCwgaGV4IG5vdGF0aW9uCi0gICA0Li41CQlIaWdoIGJ5dGUgb2YgdGhlIHJlY29yZCBsb2FkIGFkZHJlc3MKLSAgIDYuLjcJCUxvdyBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDAiCi0gICAxMC4ueAlUaGUgZGF0YSBieXRlcyBpbiBoZXggbm90YXRpb246Ci0JeCA9IChudW1iZXIgb2YgZGF0YSBieXRlcyAtIDEpICogMiArIDExCi0gICB4KzEuLngrMglDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIHgrMy4ueCs0CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLSAgIEVYVEVOREVEIEFERFJFU1MgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24oOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMiIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMiIKLSAgIDEwLi4xMQlIaWdoIGJ5dGUgb2YgdGhlIG9mZnNldCBhZGRyZXNzCi0gICAxMi4uMTMJTG93IGJ5dGUgb2YgdGhlIG9mZnNldCBhZGRyZXNzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgVGhlIGNoZWNrc3VtcyBhcmUgdGhlIHR3bydzIGNvbXBsZW1lbnQgb2YgdGhlIDgtYml0IHN1bQotICAgd2l0aG91dCBjYXJyeSBvZiB0aGUgYnl0ZSBjb3VudCwgb2Zmc2V0IGFkZHJlc3MsIGFuZCB0aGUKLSAgIHJlY29yZCB0eXBlLgotCi0gICBTVEFSVCBBRERSRVNTIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjA0IgotICAgNC4uNwkJTG9hZCBhZGRyZXNzLCBtdXN0IGJlICIwMDAwIgotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAzIgotICAgMTAuLjEzCTgwODYgQ1MgdmFsdWUKLSAgIDE0Li4xNwk4MDg2IElQIHZhbHVlCi0gICAxOC4uMTkJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAyMC4uMjEJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotQW5vdGhlciBkb2N1bWVudCByZXBvcnRzIHRoZXNlIGFkZGl0aW9uYWwgdHlwZXM6Ci0KLSAgIEVYVEVOREVEIExJTkVBUiBBRERSRVNTIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjAyIgotICAgNC4uNwkJTG9hZCBhZGRyZXNzLCBtdXN0IGJlICIwMDAwIgotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjA0IgotICAgMTAuLjEzCVVwcGVyIDE2IGJpdHMgb2YgYWRkcmVzcyBvZiBzdWJzZXF1ZW50IHJlY29yZHMKLSAgIDE0Li4xNQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDE2Li4xNwlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi0gICBTVEFSVCBMSU5FQVIgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMiIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNSIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE0Li4xNQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDE2Li4xNwlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi1UaGUgTVJJIGNvbXBpbGVyIHVzZXMgdGhpcywgd2hpY2ggaXMgYSByZXBlYXQgb2YgdHlwZSA1OgotCi0gIEVYVEVOREVEIFNUQVJUIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjA0IgotICAgNC4uNwkJTG9hZCBhZGRyZXNzLCBtdXN0IGJlICIwMDAwIgotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjA1IgotICAgMTAuLjEzCVVwcGVyIDE2IGJpdHMgb2Ygc3RhcnQgYWRkcmVzcwotICAgMTQuLjE3CUxvd2VyIDE2IGJpdHMgb2Ygc3RhcnQgYWRkcmVzcwotICAgMTguLjE5CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMjAuLjIxCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgdm9pZCBpaGV4X2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gaWhleF9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIElOTElORSBpbnQgaWhleF9nZXRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBpaGV4X2JhZF9ieXRlIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWhleF9zY2FuIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqaWhleF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWhleF9yZWFkX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIGloZXhfd3JpdGVfcmVjb3JkCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hLCB1bnNpZ25lZCBpbnQsIGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqaWhleF9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWhleF9zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgaWhleF9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHB1dCBvbiBvbmUgbGluZSBkdXJpbmcgb3V0cHV0LiAgKi8KLQotI2RlZmluZSBDSFVOSyAxNgotCi0vKiBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBoZXggYW5kIGJpbmFyeS4gKi8KLQotI2RlZmluZSBOSUJCTEUoeCkgKGhleF92YWx1ZSAoeCkpCi0jZGVmaW5lIEhFWDIoYnVmZmVyKSAoKE5JQkJMRSAoKGJ1ZmZlcilbMF0pIDw8IDQpICsgTklCQkxFICgoYnVmZmVyKVsxXSkpCi0jZGVmaW5lIEhFWDQoYnVmZmVyKSAoKEhFWDIgKGJ1ZmZlcikgPDwgOCkgKyBIRVgyICgoYnVmZmVyKSArIDIpKQotI2RlZmluZSBJU0hFWCh4KSAoaGV4X3AgKHgpKQotCi0vKiBXaGVuIHdlIHdyaXRlIG91dCBhbiBpaGV4IHZhbHVlLCB0aGUgdmFsdWVzIGNhbiBub3QgYmUgb3V0cHV0IGFzCi0gICB0aGV5IGFyZSBzZWVuLiAgSW5zdGVhZCwgd2UgaG9sZCB0aGVtIGluIG1lbW9yeSBpbiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfbGlzdAotewotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKm5leHQ7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIHdoZXJlOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci19OwotCi0vKiBUaGUgaWhleCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfc3RydWN0Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqaGVhZDsKLSAgc3RydWN0IGloZXhfZGF0YV9saXN0ICp0YWlsOwotfTsKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gICovCi0KLXN0YXRpYyB2b2lkCi1paGV4X2luaXQgKCkKLXsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGVkOwotCi0gIGlmICghIGluaXRlZCkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSB0cnVlOwotICAgICAgaGV4X2luaXQgKCk7Ci0gICAgfQotfQotCi0vKiBDcmVhdGUgYW4gaWhleCBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+dGRhdGEuaWhleF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKnRkYXRhOwotCi0gICAgICB0ZGF0YSA9ICgoc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKikKLQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0KSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuaWhleF9kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+aGVhZCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+dGFpbCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgYnl0ZSBmcm9tIGEgQkZELiAgU2V0ICpFUlJPUlBUUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgIFJldHVybiBFT0Ygb24gZXJyb3Igb3IgZW5kIG9mIGZpbGUuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotaWhleF9nZXRfYnl0ZSAoYWJmZCwgZXJyb3JwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiAqZXJyb3JwdHI7Ci17Ci0gIGJmZF9ieXRlIGM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCi0JKmVycm9ycHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotCi0gIHJldHVybiAoaW50KSAoYyAmIDB4ZmYpOwotfQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgaW50IGM7Ci0gICAgIGJvb2xlYW4gZXJyb3I7Ci17Ci0gIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBpZiAoISBlcnJvcikKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKCEgaXNwcmludCAoYykpCi0Jc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgYyk7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYzsKLQkgIGJ1ZlsxXSA9ICdcMCc7Ci0JfQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiVkOiB1bmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIEludGVsIEhleCBmaWxlXG4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubywgYnVmKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLX0KLQotLyogUmVhZCBhbiBJbnRlbCBoZXggZmlsZSBhbmQgdHVybiBpdCBpbnRvIHNlY3Rpb25zLiAgV2UgY3JlYXRlIGEgbmV3Ci0gICBzZWN0aW9uIGZvciBlYWNoIGNvbnRpZ3VvdXMgc2V0IG9mIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfc2NhbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfdm1hIHNlZ2Jhc2U7Ci0gIGJmZF92bWEgZXh0YmFzZTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgaW50IGxpbmVubzsKLSAgYm9vbGVhbiBlcnJvcjsKLSAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBidWZzaXplOwotICBpbnQgYzsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IDA7Ci0KLSAgc2VnYmFzZSA9IDA7Ci0gIGV4dGJhc2UgPSAwOwotICBzZWMgPSBOVUxMOwotICBsaW5lbm8gPSAxOwotICBlcnJvciA9IGZhbHNlOwotICBidWZzaXplID0gMDsKLSAgd2hpbGUgKChjID0gaWhleF9nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGlmIChjID09ICdccicpCi0JY29udGludWU7Ci0gICAgICBlbHNlIGlmIChjID09ICdcbicpCi0JewotCSAgKytsaW5lbm87Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChjICE9ICc6JykKLQl7Ci0JICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxlX3B0ciBwb3M7Ci0JICBjaGFyIGhkcls4XTsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgdW5zaWduZWQgaW50IGxlbjsKLQkgIGJmZF92bWEgYWRkcjsKLQkgIHVuc2lnbmVkIGludCB0eXBlOwotCSAgdW5zaWduZWQgaW50IGNoYXJzOwotCSAgdW5zaWduZWQgaW50IGNoa3N1bTsKLQotCSAgLyogVGhpcyBpcyBhIGRhdGEgcmVjb3JkLiAgKi8KLQotCSAgcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gMTsKLQotCSAgLyogUmVhZCB0aGUgaGVhZGVyIGJ5dGVzLiAgKi8KLQotCSAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCEgSVNIRVggKGhkcltpXSkpCi0JCXsKLQkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgbGVuID0gSEVYMiAoaGRyKTsKLQkgIGFkZHIgPSBIRVg0IChoZHIgKyAyKTsKLQkgIHR5cGUgPSBIRVgyIChoZHIgKyA2KTsKLQotCSAgLyogUmVhZCB0aGUgZGF0YSBieXRlcy4gICovCi0KLQkgIGNoYXJzID0gbGVuICogMiArIDI7Ci0JICBpZiAoY2hhcnMgPj0gYnVmc2l6ZSkKLQkgICAgewotCSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAoYnVmLCBjaGFycyk7Ci0JICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBidWZzaXplID0gY2hhcnM7Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGNoYXJzLCBhYmZkKSAhPSBjaGFycykKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjaGFyczsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCEgSVNIRVggKGJ1ZltpXSkpCi0JCXsKLQkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgdGhlIGNoZWNrc3VtLiAgKi8KLQkgIGNoa3N1bSA9IGxlbiArIGFkZHIgKyAoYWRkciA+PiA4KSArIHR5cGU7Ci0JICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JICAgIGNoa3N1bSArPSBIRVgyIChidWYgKyAyICogaSk7Ci0JICBpZiAoKCgtIGNoa3N1bSkgJiAweGZmKSAhPSAodW5zaWduZWQgaW50KSBIRVgyIChidWYgKyAyICogaSkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiVkOiBiYWQgY2hlY2tzdW0gaW4gSW50ZWwgSGV4IGZpbGUgKGV4cGVjdGVkICV1LCBmb3VuZCAldSkiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sCi0JCSAoLSBjaGtzdW0pICYgMHhmZiwgKHVuc2lnbmVkIGludCkgSEVYMiAoYnVmICsgMiAqIGkpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIC8qIFRoaXMgaXMgYSBkYXRhIHJlY29yZC4gICovCi0JICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JCSAgJiYgc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZSA9PSBleHRiYXNlICsgc2VnYmFzZSArIGFkZHIpCi0JCXsKLQkJICAvKiBUaGlzIGRhdGEgZ29lcyBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJ1aWxkaW5nLiAgKi8KLQkJICBzZWMtPl9yYXdfc2l6ZSArPSBsZW47Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsZW4gPiAwKQotCQl7Ci0JCSAgY2hhciBzZWNidWZbMjBdOwotCQkgIGNoYXIgKnNlY25hbWU7Ci0KLQkJICBzcHJpbnRmIChzZWNidWYsICIuc2VjJWQiLCBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMSk7Ci0JCSAgc2VjbmFtZSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzZWNidWYpICsgMSk7Ci0JCSAgaWYgKHNlY25hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cmNweSAoc2VjbmFtZSwgc2VjYnVmKTsKLQkJICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBzZWNuYW1lKTsKLQkJICBpZiAoc2VjID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzZWMtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotCQkgIHNlYy0+dm1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOwotCQkgIHNlYy0+bG1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOwotCQkgIHNlYy0+X3Jhd19zaXplID0gbGVuOwotCQkgIHNlYy0+ZmlsZXBvcyA9IHBvczsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMToKLQkgICAgICAvKiBBbiBlbmQgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+c3RhcnRfYWRkcmVzcyA9PSAwKQotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gYWRkcjsKLQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0KLQkgICAgY2FzZSAyOgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAobGVuICE9IDIpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczolZDogYmFkIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBzZWdiYXNlID0gSEVYNCAoYnVmKSA8PCA0OwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMzoKLQkgICAgICAvKiBBbiBleHRlbmRlZCBzdGFydCBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSA0KQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBzdGFydCBhZGRyZXNzIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBhYmZkLT5zdGFydF9hZGRyZXNzICs9IChIRVg0IChidWYpIDw8IDQpICsgSEVYNCAoYnVmICsgNCk7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSA0OgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSAyKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGV4dGJhc2UgPSBIRVg0IChidWYpIDw8IDE2OwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgNToKLQkgICAgICAvKiBBbiBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyByZWNvcmQuICAqLwotCSAgICAgIGlmIChsZW4gIT0gMiAmJiBsZW4gIT0gNCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGlmIChsZW4gPT0gMikKLQkJYWJmZC0+c3RhcnRfYWRkcmVzcyArPSBIRVg0IChidWYpIDw8IDE2OwotCSAgICAgIGVsc2UKLQkJYWJmZC0+c3RhcnRfYWRkcmVzcyA9IChIRVg0IChidWYpIDw8IDE2KSArIEhFWDQgKGJ1ZiArIDQpOwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczolZDogdW5yZWNvZ25pemVkIGloZXggdHlwZSAldSBpbiBJbnRlbCBIZXggZmlsZVxuIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCB0eXBlKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGVycm9yKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUcnkgdG8gcmVjb2duaXplIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaWhleF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSBiWzldOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgaWhleF9pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9yZWFkIChiLCAxLCA5LCBhYmZkKSAhPSA5KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYlswXSAhPSAnOicpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMTsgaSA8IDk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBJU0hFWCAoYltpXSkpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHR5cGUgPSBIRVgyIChiICsgNyk7Ci0gIGlmICh0eXBlID4gNSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgaXQgbG9va3MgbGlrZSBpdCByZWFsbHkgaXMgYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi0gIGlmICghIGloZXhfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhIGloZXhfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgY29udGVudHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgaW50IGM7Ci0gIGJmZF9ieXRlICpwOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemU7Ci0gIGJvb2xlYW4gZXJyb3I7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBwID0gY29udGVudHM7Ci0gIGJ1ZnNpemUgPSAwOwotICBlcnJvciA9IGZhbHNlOwotICB3aGlsZSAoKGMgPSBpaGV4X2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCi0gICAgewotICAgICAgY2hhciBoZHJbOF07Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgYmZkX3ZtYSBhZGRyOwotICAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGloZXhfc2NhbiBoYXMgc3VjY2VlZGVkLCBzbyB3ZSBvdWdodCB0bwotICAgICAgICAga25vdyB0aGUgZXhhY3QgZm9ybWF0LiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGMgPT0gJzonKTsKLQotICAgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGxlbiA9IEhFWDIgKGhkcik7Ci0gICAgICBhZGRyID0gSEVYNCAoaGRyICsgMik7Ci0gICAgICB0eXBlID0gSEVYMiAoaGRyICsgNik7Ci0KLSAgICAgIC8qIFdlIHNob3VsZCBvbmx5IHNlZSB0eXBlIDAgcmVjb3JkcyBoZXJlLiAgKi8KLSAgICAgIGlmICh0eXBlICE9IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogaW50ZXJuYWwgZXJyb3IgaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpZiAobGVuICogMiA+IGJ1ZnNpemUpCi0JewotCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChidWYsIGxlbiAqIDIpOwotCSAgaWYgKGJ1ZiA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGJ1ZnNpemUgPSBsZW4gKiAyOwotCX0KLQotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGxlbiAqIDIsIGFiZmQpICE9IGxlbiAqIDIpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkqcCsrID0gSEVYMiAoYnVmICsgMiAqIGkpOwotICAgICAgaWYgKChiZmRfc2l6ZV90eXBlKSAocCAtIGNvbnRlbnRzKSA+PSBzZWN0aW9uLT5fcmF3X3NpemUpCi0JewotCSAgLyogV2UndmUgcmVhZCBldmVyeXRoaW5nIGluIHRoZSBzZWN0aW9uLiAgKi8KLQkgIGlmIChidWYgIT0gTlVMTCkKLQkgICAgZnJlZSAoYnVmKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogU2tpcCB0aGUgY2hlY2tzdW0uICAqLwotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIDIsIGFiZmQpICE9IDIpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmICgoYmZkX3NpemVfdHlwZSkgKHAgLSBjb250ZW50cykgPCBzZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBiYWQgc2VjdGlvbiBsZW5ndGggaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPSBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBpaGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgc2VjdGlvbi0+dXNlZF9ieV9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbWVtY3B5IChsb2NhdGlvbiwgKGJmZF9ieXRlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkICsgb2Zmc2V0LAotCSAgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqbjsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICp0ZGF0YTsKLQotICBpZiAoY291bnQgPT0gMAotICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCi0gICAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuID0gKChzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGloZXhfZGF0YV9saXN0KSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtY3B5IChkYXRhLCBsb2NhdGlvbiwgKHNpemVfdCkgY291bnQpOwotCi0gIG4tPmRhdGEgPSBkYXRhOwotICBuLT53aGVyZSA9IHNlY3Rpb24tPmxtYSArIG9mZnNldDsKLSAgbi0+c2l6ZSA9IGNvdW50OwotCi0gIC8qIFNvcnQgdGhlIHJlY29yZHMgYnkgYWRkcmVzcy4gIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKLSAgICAgYWRkaW5nIGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICAqLwotICB0ZGF0YSA9IGFiZmQtPnRkYXRhLmloZXhfZGF0YTsKLSAgaWYgKHRkYXRhLT50YWlsICE9IE5VTEwKLSAgICAgICYmIG4tPndoZXJlID49IHRkYXRhLT50YWlsLT53aGVyZSkKLSAgICB7Ci0gICAgICB0ZGF0YS0+dGFpbC0+bmV4dCA9IG47Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIHRkYXRhLT50YWlsID0gbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKipwcDsKLQotICAgICAgZm9yIChwcCA9ICZ0ZGF0YS0+aGVhZDsKLQkgICAqcHAgIT0gTlVMTCAmJiAoKnBwKS0+d2hlcmUgPCBuLT53aGVyZTsKLQkgICBwcCA9ICYoKnBwKS0+bmV4dCkKLQk7Ci0gICAgICBuLT5uZXh0ID0gKnBwOwotICAgICAgKnBwID0gbjsKLSAgICAgIGlmIChuLT5uZXh0ID09IE5VTEwpCi0JdGRhdGEtPnRhaWwgPSBuOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSByZWNvcmQgb3V0IHRvIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBjb3VudCwgYWRkciwgdHlwZSwgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGludCB0eXBlOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotICBjaGFyIGJ1Zls5ICsgQ0hVTksgKiAyICsgNF07Ci0gIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBjaGtzdW07Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jZGVmaW5lIFRPSEVYKGJ1ZiwgdikgXAotICAoKGJ1ZilbMF0gPSBkaWdzWygodikgPj4gNCkgJiAweGZdLCAoYnVmKVsxXSA9IGRpZ3NbKHYpICYgMHhmXSkKLQotICBidWZbMF0gPSAnOic7Ci0gIFRPSEVYIChidWYgKyAxLCBjb3VudCk7Ci0gIFRPSEVYIChidWYgKyAzLCAoYWRkciA+PiA4KSAmIDB4ZmYpOwotICBUT0hFWCAoYnVmICsgNSwgYWRkciAmIDB4ZmYpOwotICBUT0hFWCAoYnVmICsgNywgdHlwZSk7Ci0KLSAgY2hrc3VtID0gY291bnQgKyBhZGRyICsgKGFkZHIgPj4gOCkgKyB0eXBlOwotCi0gIGZvciAoaSA9IDAsIHAgPSBidWYgKyA5OyBpIDwgY291bnQ7IGkrKywgcCArPSAyLCBkYXRhKyspCi0gICAgewotICAgICAgVE9IRVggKHAsICpkYXRhKTsKLSAgICAgIGNoa3N1bSArPSAqZGF0YTsKLSAgICB9Ci0KLSAgVE9IRVggKHAsICgtIGNoa3N1bSkgJiAweGZmKTsKLSAgcFsyXSA9ICdccic7Ci0gIHBbM10gPSAnXG4nOwotCi0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOSArIGNvdW50ICogMiArIDQsIGFiZmQpICE9IDkgKyBjb3VudCAqIDIgKyA0KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF92bWEgc2VnYmFzZTsKLSAgYmZkX3ZtYSBleHRiYXNlOwotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKmw7Ci0KLSAgc2VnYmFzZSA9IDA7Ci0gIGV4dGJhc2UgPSAwOwotICBmb3IgKGwgPSBhYmZkLT50ZGF0YS5paGV4X2RhdGEtPmhlYWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgYmZkX3ZtYSB3aGVyZTsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLQotICAgICAgd2hlcmUgPSBsLT53aGVyZTsKLSAgICAgIHAgPSBsLT5kYXRhOwotICAgICAgY291bnQgPSBsLT5zaXplOwotICAgICAgd2hpbGUgKGNvdW50ID4gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIG5vdzsKLQotCSAgbm93ID0gY291bnQ7Ci0JICBpZiAobm93ID4gQ0hVTkspCi0JICAgIG5vdyA9IENIVU5LOwotCi0JICBpZiAod2hlcmUgPiBzZWdiYXNlICsgZXh0YmFzZSArIDB4ZmZmZikKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIGFkZHJbMl07Ci0KLQkgICAgICAvKiBXZSBuZWVkIGEgbmV3IGJhc2UgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKHdoZXJlIDw9IDB4ZmZmZmYpCi0JCXsKLQkJICAvKiBUaGUgYWRkcmVzc2VzIHNob3VsZCBiZSBzb3J0ZWQuICAqLwotCQkgIEJGRF9BU1NFUlQgKGV4dGJhc2UgPT0gMCk7Ci0KLQkJICBzZWdiYXNlID0gd2hlcmUgJiAweGYwMDAwOwotCQkgIGFkZHJbMF0gPSAoYmZkX2J5dGUpKHNlZ2Jhc2UgPj4gMTIpICYgMHhmZjsKLQkJICBhZGRyWzFdID0gKGJmZF9ieXRlKShzZWdiYXNlID4+IDQpICYgMHhmZjsKLQkJICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGUgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgYW5kIHRoZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGFyZSBjb21iaW5lZCwgYXQgbGVhc3QgYnkKLSAgICAgICAgICAgICAgICAgICAgIHNvbWUgcmVhZGVycy4gIFdlIG5lZWQgYW4gZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgIHJlY29yZCBoZXJlLCBzbyBpZiB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IGFuCi0gICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCwgemVybyBpdCBvdXQgdG8gYXZvaWQKLSAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2lvbi4gICovCi0JCSAgaWYgKHNlZ2Jhc2UgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgYWRkclswXSA9IDA7Ci0JCSAgICAgIGFkZHJbMV0gPSAwOwotCQkgICAgICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHNlZ2Jhc2UgPSAwOwotCQkgICAgfQotCi0JCSAgZXh0YmFzZSA9IHdoZXJlICYgMHhmZmZmMDAwMDsKLQkJICBpZiAod2hlcmUgPiBleHRiYXNlICsgMHhmZmZmKQotCQkgICAgewotCQkgICAgICBjaGFyIGJ1ZlsyMF07Ci0KLQkJICAgICAgc3ByaW50Zl92bWEgKGJ1Ziwgd2hlcmUpOwotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogYWRkcmVzcyAweCVzIG91dCBvZiByYW5nZSBmb3IgSW50ZXggSGV4IGZpbGUiKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYnVmKTsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBhZGRyWzBdID0gKGJmZF9ieXRlKShleHRiYXNlID4+IDI0KSAmIDB4ZmY7Ci0JCSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZXh0YmFzZSA+PiAxNikgJiAweGZmOwotCQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAyLCAwLCA0LCBhZGRyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBub3csIHdoZXJlIC0gKGV4dGJhc2UgKyBzZWdiYXNlKSwKLQkJCQkgICAwLCBwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICB3aGVyZSArPSBub3c7Ci0JICBwICs9IG5vdzsKLQkgIGNvdW50IC09IG5vdzsKLQl9Ci0gICAgfQotCi0gIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzICE9IDApCi0gICAgewotICAgICAgYmZkX3ZtYSBzdGFydDsKLSAgICAgIGJmZF9ieXRlIHN0YXJ0YnVmWzRdOwotCi0gICAgICBzdGFydCA9IGFiZmQtPnN0YXJ0X2FkZHJlc3M7Ci0KLSAgICAgIGlmIChzdGFydCA8PSAweGZmZmZmKQotCXsKLQkgIHN0YXJ0YnVmWzBdID0gKGJmZF9ieXRlKSgoc3RhcnQgJiAweGYwMDAwKSA+PiAxMikgJiAweGZmOwotCSAgc3RhcnRidWZbMV0gPSAwOwotCSAgc3RhcnRidWZbMl0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDgpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzNdID0gKGJmZF9ieXRlKXN0YXJ0ICYgMHhmZjsKLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCA0LCAwLCAzLCBzdGFydGJ1ZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RhcnRidWZbMF0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDI0KSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlsxXSA9IChiZmRfYnl0ZSkoc3RhcnQgPj4gMTYpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzJdID0gKGJmZF9ieXRlKShzdGFydCA+PiA4KSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlszXSA9IChiZmRfYnl0ZSlzdGFydCAmIDB4ZmY7Ci0JICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgNCwgMCwgNSwgc3RhcnRidWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMCwgMCwgMSwgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gIFRoaXMgaXMgcmVxdWlyZWQgb25seSBiZWNhdXNlCi0gICBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSB3YW50cyB0byBjcmVhdGUgYSBzeW1ib2wgZm9yIHRoZSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotaWhleF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXc7Ci0KLSAgbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcgIT0gTlVMTCkKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBmb3IgdGhlIG91dHB1dCBmaWxlLiAgVGhlIGFyY2hpdGVjdHVyZSBpcwotICAgaXJyZWxldmFudCwgc28gd2UgaWdub3JlIGVycm9ycyBhYm91dCB1bmtub3duIGFyY2hpdGVjdHVyZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpKQotICAgIHsKLSAgICAgIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycywgZm9yIHRoZSBsaW5rZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWloZXhfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNvbWUgcmFuZG9tIGRlZmluaXRpb25zIGZvciB0aGUgdGFyZ2V0IHZlY3Rvci4gICovCi0KLSNkZWZpbmUJaWhleF9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgaWhleF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgaWhleF9uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIGloZXhfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIGloZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBiZmRfMGwKLSNkZWZpbmUgaWhleF9nZXRfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIGloZXhfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBpaGV4X2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaWhleF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBpaGV4X2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBpaGV4X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGloZXhfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBpaGV4X3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBpaGV4X21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgaWhleF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF8wbCkKLSNkZWZpbmUgaWhleF9jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgaWhleF9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBpaGV4X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgaWhleF9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGloZXhfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGloZXhfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgaWhleF9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBpaGV4X2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGloZXhfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoZSBJbnRlbCBIZXggdGFyZ2V0IHZlY3Rvci4gICovCi0KLWNvbnN0IGJmZF90YXJnZXQgaWhleF92ZWMgPQotewotICAiaWhleCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ciwKLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAwLAkJCQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBpaGV4X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIGloZXhfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoaWhleCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2luaXQuYyBiL2JmZC9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTFkNTAuLjAwMDAwMDAKLS0tIGEvYmZkL2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIGJmZCBpbml0aWFsaXphdGlvbiBzdHVmZgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKgotU0VDVElPTgotCUluaXRpYWxpemF0aW9uCi0KLQlUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBpbml0aWFsaXppbmcgYSBCRkQuCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfaW5pdAotCi1TWU5PUFNJUwotCXZvaWQgYmZkX2luaXQodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgQkZEIGZ1bmN0aW9uIHRvCi0JaW5pdGlhbGl6ZSBtYWdpY2FsIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KLSovCi0KLS8qIEFjdHVhbGx5LCB0aGVyZSBpcyBjdXJyZW50bHkgbm90aGluZyBmb3IgdGhpcyBmdW5jdGlvbiB0byBkby4KLSAgIEhvd2V2ZXIsIHNvbWVkYXkgaXQgbWF5IGJlIG5lZWRlZCwgc28ga2VlcCBpdCBhcm91bmQuICAqLwotCi12b2lkCi1iZmRfaW5pdCAoKQotewotfQpkaWZmIC0tZ2l0IGEvYmZkL2lyaXgtY29yZS5jIGIvYmZkL2lyaXgtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDZlNmE3Li4wMDAwMDAwCi0tLSBhL2JmZC9pcml4LWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIElyaXggY29yZSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgotICAgQ29udmVydGVkIHRvIGJhY2stZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSXJpeCBzdHlsZSBjb3JlCi0gICBmaWxlcyAobmFtZWx5LCBJcml4IDQgYW5kIElyaXggNSwgc28gZmFyKS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmZGVmIElSSVhfQ09SRQotCi0jaW5jbHVkZSA8Y29yZS5vdXQuaD4KLQotc3RydWN0IHNnaV9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgY2hhciBjbWRbQ09SRV9OQU1FU0laRV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5zZ2lfY29yZV9kYXRhKQotI2RlZmluZSBjb3JlX3NpZ25hbChiZmQpIChjb3JlX2hkcihiZmQpLT5zaWcpCi0jZGVmaW5lIGNvcmVfY29tbWFuZChiZmQpIChjb3JlX2hkcihiZmQpLT5jbWQpCi0KLXN0YXRpYyBhc2VjdGlvbiAqbWFrZV9iZmRfYXNlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgZmxhZ3dvcmQsIGJmZF9zaXplX3R5cGUsIGJmZF92bWEsIGZpbGVfcHRyKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqaXJpeF9jb3JlX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaXJpeF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSA0OwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaXJpeF9jb3JlX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBpOwotICBjaGFyICpzZWNuYW1lOwotICBzdHJ1Y3QgY29yZW91dCBjb3Jlb3V0OwotICBzdHJ1Y3QgaWRlc2MgKmlkZywgKmlkZiwgKmlkczsKLQotICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmY29yZW91dCwgMSwgc2l6ZW9mIGNvcmVvdXQsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiBjb3Jlb3V0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmbmRlZiBDT1JFX01BR0lDTjMyCi0jZGVmaW5lIENPUkVfTUFHSUNOMzIgQ09SRV9NQUdJQwotI2VuZGlmCi0gIGlmICgoY29yZW91dC5jX21hZ2ljICE9IENPUkVfTUFHSUMgJiYgY29yZW91dC5jX21hZ2ljICE9IENPUkVfTUFHSUNOMzIpCi0gICAgICB8fCBjb3Jlb3V0LmNfdmVyc2lvbiAhPSBDT1JFX1ZFUlNJT04xKQotICAgIHJldHVybiAwOwotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNnaV9jb3JlX3N0cnVjdCkpOwotICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBjb3Jlb3V0LmNfbmFtZSwgQ09SRV9OQU1FU0laRSk7Ci0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IGNvcmVvdXQuY19zaWdjYXVzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGNvcmVvdXQuY192bWFwb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgY29yZW91dC5jX252bWFwOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHZtYXAgdm1hcDsKLQotICAgICAgdmFsID0gYmZkX3JlYWQgKChQVFIpJnZtYXAsIDEsIHNpemVvZiB2bWFwLCBhYmZkKTsKLSAgICAgIGlmICh2YWwgIT0gc2l6ZW9mIHZtYXApCi0JYnJlYWs7Ci0KLSAgICAgIHN3aXRjaCAodm1hcC52X3R5cGUpCi0JewotCWNhc2UgVkRBVEE6Ci0JICBzZWNuYW1lID0gIi5kYXRhIjsKLQkgIGJyZWFrOwotCWNhc2UgVlNUQUNLOgotCSAgc2VjbmFtZSA9ICIuc3RhY2siOwotCSAgYnJlYWs7Ci0jaWZkZWYgVk1BUEZJTEUKLQljYXNlIFZNQVBGSUxFOgotCSAgc2VjbmFtZSA9ICIubWFwZmlsZSI7Ci0JICBicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEEgZmlsZSBvZmZzZXQgb2YgemVybyBtZWFucyB0aGF0IHRoZSBzZWN0aW9uIGlzIG5vdCBjb250YWluZWQKLQkgaW4gdGhlIGNvcmVmaWxlLiAgKi8KLSAgICAgIGlmICh2bWFwLnZfb2Zmc2V0ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0JCQkgICAgICBTRUNfQUxMT0MrU0VDX0xPQUQrU0VDX0hBU19DT05URU5UUywKLQkJCSAgICAgIHZtYXAudl9sZW4sCi0JCQkgICAgICB2bWFwLnZfdmFkZHIsCi0JCQkgICAgICB2bWFwLnZfb2Zmc2V0KSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHJlZ3MgYXJlIGNvbnRpZ3VvdXMgd2l0aGluIHRoZSBjb3JlIGZpbGUuICovCi0KLSAgaWRnID0gJmNvcmVvdXQuY19pZGVzY1tJX0dQUkVHU107Ci0gIGlkZiA9ICZjb3Jlb3V0LmNfaWRlc2NbSV9GUFJFR1NdOwotICBpZHMgPSAmY29yZW91dC5jX2lkZXNjW0lfU1BFQ1JFR1NdOwotCi0gIGlmIChpZGctPmlfb2Zmc2V0ICsgaWRnLT5pX2xlbiAhPSBpZGYtPmlfb2Zmc2V0Ci0gICAgICB8fCBpZGYtPmlfb2Zmc2V0ICsgaWRmLT5pX2xlbiAhPSBpZHMtPmlfb2Zmc2V0KQotICAgIHJldHVybiAwOwkJCS8qIENhbid0IGRlYWwgd2l0aCBub24tY29udGlnIHJlZ3MgKi8KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlkZy0+aV9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCSAgICAgU0VDX0hBU19DT05URU5UUywKLQkJICAgICBpZGctPmlfbGVuICsgaWRmLT5pX2xlbiArIGlkcy0+aV9sZW4sCi0JCSAgICAgMCwKLQkJICAgICBpZGctPmlfb2Zmc2V0KTsKLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWlyaXhfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCQkvKiBYWFggLSBGSVhNRSAqLwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1pcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotI2RlZmluZSBpcml4X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaXJpeF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaXJpeF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaXJpeF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaXJpeF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBpcml4X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaXJpeF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaXJpeF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBpcml4X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgaXJpeF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiaXJpeC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGlyaXhfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGlyaXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGlyaXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwotCi0jZW5kaWYgLyogSVJJWF9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvbGliYW91dC5oIGIvYmZkL2xpYmFvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAwMWQzZC4uMDAwMDAwMAotLS0gYS9iZmQvbGliYW91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIGEub3V0IChhbmQgc2ltaWxhcikgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExJQkFPVVRfSAotI2RlZmluZSBMSUJBT1VUX0gKLQotLyogV2UgdHJ5IHRvIGVuY2Fwc3VsYXRlIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGUgdmFyaW91cyBhLm91dCBmaWxlCi0gICB2YXJpYW50cyBpbiBhIGZldyByb3V0aW5lcywgYW5kIG90aGVyd2lzZSBzaGFyZSBsYXJnZSBtYXNzZXMgb2YgY29kZS4KLSAgIFRoaXMgbWVhbnMgd2Ugb25seSBoYXZlIHRvIGZpeCBidWdzIGluIG9uZSBwbGFjZSwgbW9zdCBvZiB0aGUgdGltZS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIFBhcmFtZXRlcml6ZSB0aGUgYS5vdXQgY29kZSBiYXNlZCBvbiB3aGV0aGVyIGl0IGlzIGJlaW5nIGJ1aWx0Ci0gICBmb3IgYSAzMi1iaXQgYXJjaGl0ZWN0dXJlIG9yIGEgNjQtYml0IGFyY2hpdGVjdHVyZS4gICovCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBHRVRfV09SRCBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgR0VUX1NXT1JEIGJmZF9oX2dldF9zaWduZWRfNjQKLSNkZWZpbmUgUFVUX1dPUkQgYmZkX2hfcHV0XzY0Ci0jaWZuZGVmIE5BTUUKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoeCxfNjRfLHkpCi0jZW5kaWYKLSNkZWZpbmUgSk5BTUUoeCkgQ0FUKHgsXzY0KQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDgKLSNlbHNlIC8qIEFSQ0hfU0laRSA9PSAzMiAqLwotI2RlZmluZSBHRVRfV09SRCBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgR0VUX1NXT1JEIGJmZF9oX2dldF9zaWduZWRfMzIKLSNkZWZpbmUgUFVUX1dPUkQgYmZkX2hfcHV0XzMyCi0jaWZuZGVmIE5BTUUKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoeCxfMzJfLHkpCi0jZW5kaWYKLSNkZWZpbmUgSk5BTUUoeCkgQ0FUKHgsXzMyKQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNlbmRpZiAvKiBBUkNIX1NJWkU9PTMyICovCi0KLS8qIERlY2xhcmUgYXQgZmlsZSBsZXZlbCwgc2luY2UgdXNlZCBpbiBwYXJhbWV0ZXIgbGlzdHMsIHdoaWNoIGhhdmUKLSAgIHdlaXJkIHNjb3BlLiAgKi8KLXN0cnVjdCBleHRlcm5hbF9leGVjOwotc3RydWN0IGV4dGVybmFsX25saXN0Owotc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbDsKLXN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWw7Ci0MCi0vKiBhLm91dCBiYWNrZW5kIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogV2hldGhlciB0aGlzIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuIG91dC4gICovCi0gIGJvb2xlYW4gd3JpdHRlbjsKLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgKi8KLSAgaW50IGluZHg7Ci19OwotCi0vKiBhLm91dCBiYWNrZW5kIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIGEub3V0IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYW91dF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIGEub3V0IGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBhb3V0X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0MCi0vKiBCYWNrLWVuZCBpbmZvcm1hdGlvbiBmb3IgdmFyaW91cyBhLm91dCB0YXJnZXRzLiAgKi8KLXN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YQotewotICAvKiBBcmUgWk1BR0lDIGZpbGVzIG1hcHBlZCBjb250aWd1b3VzbHk/ICBJZiBzbywgdGhlIHRleHQgc2VjdGlvbiBtYXkKLSAgICAgbmVlZCBtb3JlIHBhZGRpbmcsIGlmIHRoZSBzZWdtZW50IHNpemUgKGdyYW51bGFyaXR5IGZvciBtZW1vcnkgYWNjZXNzCi0gICAgIGNvbnRyb2wpIGlzIGxhcmdlciB0aGFuIHRoZSBwYWdlIHNpemUuICAqLwotICB1bnNpZ25lZCBjaGFyIHptYWdpY19tYXBwZWRfY29udGlndW91czsKLSAgLyogSWYgdGhpcyBmbGFnIGlzIHNldCwgWk1BR0lDL05NQUdJQyBmaWxlIGhlYWRlcnMgZ2V0IG1hcHBlZCBpbiB3aXRoIHRoZQotICAgICB0ZXh0IHNlY3Rpb24sIHdoaWNoIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlsZSBoZWFkZXIuCi0gICAgIElmIG5vdCwgdGhlIHRleHQgc2VjdGlvbiBzdGFydHMgb24gdGhlIG5leHQgcGFnZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgdGV4dF9pbmNsdWRlc19oZWFkZXI7Ci0KLSAgLyogSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlbiBpZiB0aGUgZW50cnkgYWRkcmVzcyBpcyBub3QgaW4gdGhlCi0gICAgIGZpcnN0IFNFR01FTlRfU0laRSBieXRlcyBvZiB0aGUgdGV4dCBzZWN0aW9uLCBpdCBpcyB0YWtlbiB0byBiZQotICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VjdGlvbi4gIFRoaXMgY2FuIGJlIHVzZWZ1bAotICAgICBmb3Iga2VybmVscy4gICovCi0gIHVuc2lnbmVkIGNoYXIgZW50cnlfaXNfdGV4dF9hZGRyZXNzOwotCi0gIC8qIFRoZSB2YWx1ZSB0byBwYXNzIHRvIE5fU0VUX0ZMQUdTLiAgKi8KLSAgdW5zaWduZWQgY2hhciBleGVjX2hkcl9mbGFnczsKLQotICAvKiBJZiB0aGUgdGV4dCBzZWN0aW9uIFZNQSBpc24ndCBzcGVjaWZpZWQsIGFuZCB3ZSBuZWVkIGFuIGFic29sdXRlCi0gICAgIGFkZHJlc3MsIHVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0LiAgSWYgd2UncmUgcHJvZHVjaW5nIGEgcmVsb2NhdGFibGUKLSAgICAgZmlsZSwgemVybyBpcyBhbHdheXMgdXNlZC4gICovCi0gIC8qID8/IFBlcmhhcHMgYSBjYWxsYmFjayB3b3VsZCBiZSBhIGJldHRlciBjaG9pY2U/ICBXaWxsIHRoaXMgZG8gYW55dGhpbmcKLSAgICAgcmVhc29uYWJsZSBmb3IgYSBmb3JtYXQgdGhhdCBoYW5kbGVzIG11bHRpcGxlIENQVXMgd2l0aCBkaWZmZXJlbnQKLSAgICAgbG9hZCBhZGRyZXNzZXMgZm9yIGVhY2g/ICAqLwotICBiZmRfdm1hIGRlZmF1bHRfdGV4dF92bWE7Ci0KLSAgLyogQ2FsbGJhY2sgZm9yIHNldHRpbmcgdGhlIHBhZ2UgYW5kIHNlZ21lbnQgc2l6ZXMsIGlmIHRoZXkgY2FuJ3QgYmUKLSAgICAgdHJpdmlhbGx5IGRldGVybWluZWQgZnJvbSB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgYm9vbGVhbiAoKnNldF9zaXplcykgUEFSQU1TICgoYmZkICopKTsKLQotICAvKiB6bWFnaWMgZmlsZXMgb25seS4gRm9yIGdvMzIsIHRoZSBsZW5ndGggb2YgdGhlIGV4ZWMgaGVhZGVyIGNvbnRyaWJ1dGVzCi0gICAgIHRvIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHNlY3Rpb24gaW4gdGhlIGZpbGUgZm9yIGFsaWdubWVudCBwdXJwb3NlcyBidXQKLSAgICAgZG9lcyAqbm90KiBnZXQgY291bnRlZCBpbiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IHNlY3Rpb24uICovCi0gIHVuc2lnbmVkIGNoYXIgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQ7Ci0KLSAgLyogQ2FsbGJhY2sgZnJvbSB0aGUgYWRkIHN5bWJvbHMgcGhhc2Ugb2YgdGhlIGxpbmtlciBjb2RlIHRvIGhhbmRsZQotICAgICBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9keW5hbWljX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKiwKLQkJCQkJICBiZmRfc2l6ZV90eXBlICosIGNoYXIgKiopKTsKLQotICAvKiBDYWxsYmFjayBmcm9tIHRoZSBhZGQgc3ltYm9scyBwaGFzZSBvZiB0aGUgbGlua2VyIGNvZGUgdG8gaGFuZGxlCi0gICAgIGFkZGluZyBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0gIGJvb2xlYW4gKCphZGRfb25lX3N5bWJvbCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCi0JCQkJICAgICBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAotCQkJCSAgICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLAotCQkJCSAgICAgYm9vbGVhbiwKLQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0KLSAgLyogQ2FsbGVkIHRvIGhhbmRsZSBsaW5raW5nIGEgZHluYW1pYyBvYmplY3QuICAqLwotICBib29sZWFuICgqbGlua19keW5hbWljX29iamVjdCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICopKTsKLQotICAvKiBDYWxsZWQgZm9yIGVhY2ggZ2xvYmFsIHN5bWJvbCBiZWluZyB3cml0dGVuIG91dCBieSB0aGUgbGlua2VyLgotICAgICBUaGlzIHNob3VsZCB3cml0ZSBvdXQgdGhlIGR5bmFtaWMgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKndyaXRlX2R5bmFtaWNfc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopKTsKLQotICAvKiBJZiB0aGlzIGNhbGxiYWNrIGlzIG5vdCBOVUxMLCB0aGUgbGlua2VyIGNhbGxzIGl0IGZvciBlYWNoIHJlbG9jLgotICAgICBSRUxPQyBpcyBhIHBvaW50ZXIgdG8gdGhlIHVuc3dhcHBlZCByZWxvYy4gIElmICpTS0lQIGlzIHNldCB0bwotICAgICB0cnVlLCB0aGUgcmVsb2Mgd2lsbCBiZSBza2lwcGVkLiAgKlJFTE9DQVRJT04gbWF5IGJlIGNoYW5nZWQgdG8KLSAgICAgY2hhbmdlIHRoZSBlZmZlY3RzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKmNoZWNrX2R5bmFtaWNfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkgIGJmZCAqaW5wdXRfYmZkLAotCQkJCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaCwKLQkJCQkJICBQVFIgcmVsb2MsIGJmZF9ieXRlICpjb250ZW50cywKLQkJCQkJICBib29sZWFuICpza2lwLAotCQkJCQkgIGJmZF92bWEgKnJlbG9jYXRpb24pKTsKLQotICAvKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiBhIGxpbmsgdG8gZmluaXNoIHVwIGFueSBkeW5hbWljIGxpbmtpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqZmluaXNoX2R5bmFtaWNfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLX07Ci0jZGVmaW5lIGFvdXRfYmFja2VuZF9pbmZvKGFiZmQpIFwKLQkoKENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSAqKSgoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkpCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBpbiBtZW1vcnkgb2YgYSAic3RydWN0IGV4ZWMiIHdoaWxlIHdlIHByb2Nlc3MgaXQuCi0gICBBbGwgJ2xlbmd0aHMnIGFyZSBnaXZlbiBhcyBhIG51bWJlciBvZiBieXRlcy4KLSAgIEFsbCAnYWxpZ25tZW50cycgYXJlIGZvciByZWxpbmthYmxlIGZpbGVzIG9ubHk7ICBhbiBhbGlnbm1lbnQgb2YKLQknbicgaW5kaWNhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgbXVzdCBiZWdpbiBhdCBhbgotCWFkZHJlc3MgdGhhdCBpcyBhIG11bHRpcGxlIG9mICgyKipuKS4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9leGVjCi17Ci0gICAgbG9uZyBhX2luZm87CQkvKiBNYWdpYyBudW1iZXIgYW5kIGZsYWdzLCBwYWNrZWQgKi8KLSAgICBiZmRfdm1hIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAgKi8KLSAgICBiZmRfdm1hIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAgKi8KLSAgICBiZmRfdm1hIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGluIG1lbSAqLwotICAgIGJmZF92bWEgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUgKi8KLSAgICBiZmRfdm1hIGFfZW50cnk7CQkvKiBzdGFydCBhZGRyZXNzICovCi0gICAgYmZkX3ZtYSBhX3Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiB0ZXh0J3MgcmVsb2NhdGlvbiBpbmZvLCBpbiBieXRlcyAqLwotICAgIGJmZF92bWEgYV9kcnNpemU7CQkvKiBsZW5ndGggb2YgZGF0YSdzIHJlbG9jYXRpb24gaW5mbywgaW4gYnl0ZXMgKi8KLSAgICAvKiBBZGRlZCBmb3IgaTk2MCAqLwotICAgIGJmZF92bWEgYV90bG9hZDsJCS8qIFRleHQgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KLSAgICBiZmRfdm1hIGFfZGxvYWQ7CQkvKiBEYXRhIHJ1bnRpbWUgbG9hZCBhZGRyZXNzICovCi0gICAgdW5zaWduZWQgY2hhciBhX3RhbGlnbjsJLyogQWxpZ25tZW50IG9mIHRleHQgc2VnbWVudCAqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9kYWxpZ247CS8qIEFsaWdubWVudCBvZiBkYXRhIHNlZ21lbnQgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfYmFsaWduOwkvKiBBbGlnbm1lbnQgb2YgYnNzIHNlZ21lbnQgKi8KLSAgICBjaGFyIGFfcmVsYXhhYmxlOyAgICAgICAgICAgLyogRW5vdWdoIGluZm8gZm9yIGxpbmtlciByZWxheCAqLwotfTsKLQotLyogTWFnaWMgbnVtYmVyIGlzIHdyaXR0ZW4gCi08IE1TQiAgICAgICAgICA+Ci0zMTMwMjkyODI3MjYyNTI0MjMyMjIxMjAxOTE4MTcxNjE1MTQxMzEyMTExMDA5MDgwNzA2MDUwNDAzMDIwMTAwCi08IEZMQUdTICAgICAgICA+PCBNQUNISU5FIFRZUEUgPjwgIE1BR0lDIE5VTUJFUiAgICAgICAgICAgICAgICA+Ci0qLwotLyogTWFnaWMgbnVtYmVyIGZvciBOZXRCU0QgaXMKLTxNU0IgICAgICAgICAgID4KLTMxMzAyOTI4MjcyNjI1MjQyMzIyMjEyMDE5MTgxNzE2MTUxNDEzMTIxMTEwMDkwODA3MDYwNTA0MDMwMjAxMDAKLTwgRkxBR1MgICAgPjwgTUFDSElORSBUWVBFICAgICA+PCAgTUFHSUMgTlVNQkVSICAgICAgICAgICAgICAgID4KLSovCi0KLWVudW0gbWFjaGluZV90eXBlIHsKLSAgTV9VTktOT1dOID0gMCwKLSAgTV82ODAxMCA9IDEsCi0gIE1fNjgwMjAgPSAyLAotICBNX1NQQVJDID0gMywKLSAgLyogc2tpcCBhIGJ1bmNoIHNvIHdlIGRvbid0IHJ1biBpbnRvIGFueSBvZiBzdW5zIG51bWJlcnMgKi8KLSAgLyogbWFrZSB0aGVzZSB1cCBmb3IgdGhlIG5zMzJrKi8KLSAgTV9OUzMyMDMyID0gKDY0KSwJCS8qIG5zMzIwMzIgcnVubmluZyA/ICovCi0gIE1fTlMzMjUzMiA9ICg2NCArIDUpLAkJLyogbnMzMjUzMiBydW5uaW5nIG1hY2ggKi8KLQotICBNXzM4NiA9IDEwMCwKLSAgTV8yOUsgPSAxMDEsICAgICAgICAgIC8qIEFNRCAyOTAwMCAqLwotICBNXzM4Nl9EWU5JWCA9IDEwMiwJLyogU2VxdWVudCBydW5uaW5nIGR5bml4ICovCi0gIE1fQVJNID0gMTAzLAkJLyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKi8KLSAgTV9TUEFSQ0xFVCA9IDEzMSwJLyogU1BBUkNsZXQgPSBNX1NQQVJDICsgMTI4ICovCi0gIE1fMzg2X05FVEJTRCA9IDEzNCwJLyogTmV0QlNEL2kzODYgYmluYXJ5ICovCi0gIE1fNjhLX05FVEJTRCA9IDEzNSwJLyogTmV0QlNEL202OGsgYmluYXJ5ICovCi0gIE1fNjhLNEtfTkVUQlNEID0gMTM2LAkvKiBOZXRCU0QvbTY4azRrIGJpbmFyeSAqLwotICBNXzUzMl9ORVRCU0QgPSAxMzcsCS8qIE5ldEJTRC9uczMyayBiaW5hcnkgKi8KLSAgTV9TUEFSQ19ORVRCU0QgPSAxMzgsCS8qIE5ldEJTRC9zcGFyYyBiaW5hcnkgKi8KLSAgTV9QTUFYX05FVEJTRCA9IDEzOSwJLyogTmV0QlNEL3BtYXggKE1JUFMgbGl0dGxlLWVuZGlhbikgYmluYXJ5ICovCi0gIE1fVkFYX05FVEJTRCA9IDE0MCwJLyogTmV0QlNEL3ZheCBiaW5hcnkgKi8KLSAgTV9BTFBIQV9ORVRCU0QgPSAxNDEsCS8qIE5ldEJTRC9hbHBoYSBiaW5hcnkgKi8KLSAgTV9BUk02X05FVEJTRCA9IDE0MywJLyogTmV0QlNEL2FybTMyIGJpbmFyeSAqLwotICBNX1NQQVJDTEVUXzEgPSAxNDcsCS8qIDB4OTMsIHJlc2VydmVkICovCi0gIE1fTUlQUzEgPSAxNTEsICAgICAgICAvKiBNSVBTIFIyMDAwL1IzMDAwIGJpbmFyeSAqLwotICBNX01JUFMyID0gMTUyLCAgICAgICAgLyogTUlQUyBSNDAwMC9SNjAwMCBiaW5hcnkgKi8KLSAgTV9TUEFSQ0xFVF8yID0gMTYzLAkvKiAweGEzLCByZXNlcnZlZCAqLwotICBNX1NQQVJDTEVUXzMgPSAxNzksCS8qIDB4YjMsIHJlc2VydmVkICovCi0gIE1fU1BBUkNMRVRfNCA9IDE5NSwJLyogMHhjMywgcmVzZXJ2ZWQgKi8KLSAgTV9IUDIwMCA9IDIwMCwJLyogSFAgMjAwICg2ODAxMCkgQlNEIGJpbmFyeSAqLwotICBNX0hQMzAwID0gKDMwMCAlIDI1NiksIC8qIEhQIDMwMCAoNjgwMjArNjg4ODEpIEJTRCBiaW5hcnkgKi8KLSAgTV9IUFVYID0gKDB4MjBjICUgMjU2KSwgLyogSFAgMjAwLzMwMCBIUFVYIGJpbmFyeSAqLwotICBNX1NQQVJDTEVUXzUgPSAyMTEsCS8qIDB4ZDMsIHJlc2VydmVkICovCi0gIE1fU1BBUkNMRVRfNiA9IDIyNywJLyogMHhlMywgcmVzZXJ2ZWQgKi8KLSAgLyogIE1fU1BBUkNMRVRfNyA9IDI0MwkvICogMHhmMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xJVEVfTEUgPSAyNDMKLX07Ci0KLSNkZWZpbmUgTl9EWU5BTUlDKGV4ZWMpICgoZXhlYykuYV9pbmZvICYgMHg4MDAwMDAwMCkKLQotI2lmbmRlZiBOX01BR0lDCi0jIGRlZmluZSBOX01BR0lDKGV4ZWMpICgoZXhlYykuYV9pbmZvICYgMHhmZmZmKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9NQUNIVFlQRQotIyBkZWZpbmUgTl9NQUNIVFlQRShleGVjKSAoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweGZmKSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fRkxBR1MKLSMgZGVmaW5lIE5fRkxBR1MoZXhlYykgKCgoZXhlYykuYV9pbmZvID4+IDI0KSAmIDB4ZmYpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9JTkZPCi0jIGRlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAotKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotIHwgKCgoaW50KSh0eXBlKSAmIDB4ZmYpIDw8IDE2KSBcCi0gfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9EWU5BTUlDCi0jIGRlZmluZSBOX1NFVF9EWU5BTUlDKGV4ZWMsIGR5bmFtaWMpIFwKLSgoZXhlYykuYV9pbmZvID0gKGR5bmFtaWMpID8gKChleGVjKS5hX2luZm8gfCAweDgwMDAwMDAwKSA6IFwKLSgoZXhlYykuYV9pbmZvICYgMHg3ZmZmZmZmZikpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9NQUdJQwotIyBkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpIFwKLSgoZXhlYykuYV9pbmZvID0gKCgoZXhlYykuYV9pbmZvICYgMHhmZmZmMDAwMCkgfCAoKG1hZ2ljKSAmIDB4ZmZmZikpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9TRVRfTUFDSFRZUEUKLSMgZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCi0oKGV4ZWMpLmFfaW5mbyA9IFwKLSAoKGV4ZWMpLmFfaW5mbyYweGZmMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHhmZikgPDwgMTYpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9TRVRfRkxBR1MKLSMgZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0oKGV4ZWMpLmFfaW5mbyA9IFwKLSAoKGV4ZWMpLmFfaW5mbyYweDAwZmZmZmZmKSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCBhb3V0X3N5bWJvbCB7Ci0gIGFzeW1ib2wgc3ltYm9sOwotICBzaG9ydCBkZXNjOwotICBjaGFyIG90aGVyOwotICB1bnNpZ25lZCBjaGFyIHR5cGU7Ci19IGFvdXRfc3ltYm9sX3R5cGU7Ci0KLS8qIFRoZSBgdGRhdGEnIHN0cnVjdCBmb3IgYWxsIGEub3V0LWxpa2Ugb2JqZWN0IGZpbGUgZm9ybWF0cy4KLSAgIFZhcmlvdXMgdGhpbmdzIGRlcGVuZCBvbiB0aGlzIHN0cnVjdCBiZWluZyBhcm91bmQgYW55IHRpbWUgYW4gYS5vdXQKLSAgIGZpbGUgaXMgYmVpbmcgaGFuZGxlZC4gIEFuIGV4YW1wbGUgaXMgZGJ4cmVhZC5jIGluIEdEQi4gICovCi0KLXN0cnVjdCBhb3V0ZGF0YSB7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpoZHI7CQkvKiBleGVjIGZpbGUgaGVhZGVyICovCi0gIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJvbHM7CQkvKiBzeW10YWIgZm9yIGlucHV0IGJmZCAqLwotICAKLSAgLyogRm9yIGVhc2UsIHdlIGRvIHRoaXMgKi8KLSAgYXNlY3Rpb24gKnRleHRzZWM7Ci0gIGFzZWN0aW9uICpkYXRhc2VjOwotICBhc2VjdGlvbiAqYnNzc2VjOwotCi0gIC8qIFdlIHJlbWVtYmVyIHRoZXNlIG9mZnNldHMgc28gdGhhdCBhZnRlciBjaGVja19maWxlX2Zvcm1hdCwgd2UgaGF2ZQotICAgICBubyBkZXBlbmRlbmNpZXMgb24gdGhlIHBhcnRpY3VsYXIgZm9ybWF0IG9mIHRoZSBleGVjX2hkci4gICovCi0gIGZpbGVfcHRyIHN5bV9maWxlcG9zOwotICBmaWxlX3B0ciBzdHJfZmlsZXBvczsKLQotICAvKiBTaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSBpbiBleHRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIHJlbG9jX2VudHJ5X3NpemU7Ci0KLSAgLyogU2l6ZSBvZiBhIHN5bWJvbCB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIHN5bWJvbF9lbnRyeV9zaXplOwotCi0gIC8qIFBhZ2Ugc2l6ZSAtIG5lZWRlZCBmb3IgYWxpZ25tZW50IG9mIGRlbWFuZCBwYWdlZCBmaWxlcy4gKi8KLSAgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7Ci0KLSAgLyogU2VnbWVudCBzaXplIC0gbmVlZGVkIGZvciBhbGlnbm1lbnQgb2YgZGVtYW5kIHBhZ2VkIGZpbGVzLiAqLwotICB1bnNpZ25lZCBsb25nIHNlZ21lbnRfc2l6ZTsKLQotICAvKiBabWFnaWMgZGlzayBibG9jayBzaXplIC0gbmVlZCB0byBhbGlnbiB0aGUgc3RhcnQgb2YgdGhlIHRleHQKLSAgICAgc2VjdGlvbiBpbiBaTUFHSUMgYmluYXJpZXMuICBOb3JtYWxseSB0aGUgc2FtZSBhcyBwYWdlX3NpemUuICAqLwotICB1bnNpZ25lZCBsb25nIHptYWdpY19kaXNrX2Jsb2NrX3NpemU7Ci0KLSAgdW5zaWduZWQgZXhlY19ieXRlc19zaXplOwotICB1bnNpZ25lZCB2bWFfYWRqdXN0ZWQgOiAxOwotCi0gIC8qIHVzZWQgd2hlbiBhIGJmZCBzdXBwb3J0cyBzZXZlcmFsIGhpZ2hseSBzaW1pbGFyIGZvcm1hdHMgKi8KLSAgZW51bQotICAgIHsKLSAgICAgIGRlZmF1bHRfZm9ybWF0ID0gMCwKLSAgICAgIC8qIFVzZWQgb24gSFAgOTAwMC8zMDAgcnVubmluZyBIUC9VWC4gIFNlZSBocDMwMGhwdXguYy4gICovCi0gICAgICBnbnVfZW5jYXBfZm9ybWF0LAotICAgICAgLyogVXNlZCBvbiBMaW51eCwgMzg2QlNELCBldGMuICBTZWUgaW5jbHVkZS9hb3V0L2FvdXQ2NC5oLiAgKi8KLSAgICAgIHFfbWFnaWNfZm9ybWF0Ci0gICAgfSBzdWJmb3JtYXQ7Ci0KLSAgZW51bQotICAgIHsKLSAgICAgIHVuZGVjaWRlZF9tYWdpYyA9IDAsCi0gICAgICB6X21hZ2ljLAotICAgICAgb19tYWdpYywKLSAgICAgIG5fbWFnaWMKLSAgICB9IG1hZ2ljOwotCi0gIC8qIEEgYnVmZmVyIGZvciBmaW5kX25lYXJlc3RfbGluZS4gICovCi0gIGNoYXIgKmxpbmVfYnVmOwotCi0gIC8qIFRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmV4dGVybmFsX3N5bXM7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX2NvdW50OwotICBiZmRfd2luZG93IHN5bV93aW5kb3c7Ci0gIGNoYXIgKmV4dGVybmFsX3N0cmluZ3M7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3RyaW5nX3NpemU7Ci0gIGJmZF93aW5kb3cgc3RyaW5nX3dpbmRvdzsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiBBIHBvaW50ZXIgZm9yIHNoYXJlZCBsaWJyYXJ5IGluZm9ybWF0aW9uLiAgKi8KLSAgUFRSIGR5bmFtaWNfaW5mbzsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIG9mZnNldHMgaW50byB0aGUgZ2xvYmFsIG9mZnNldAotICAgICB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcgb24gU3VuT1MuICBUaGlzIGlzIGluZGV4ZWQgYnkgdGhlIHN5bWJvbAotICAgICBpbmRleC4gICovCi0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotfTsKLQotc3RydWN0ICBhb3V0X2RhdGFfc3RydWN0IHsKLSAgICBzdHJ1Y3QgYW91dGRhdGEgYTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotI2RlZmluZQlhZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLmFvdXRfZGF0YS0+YSkKLSNkZWZpbmUJZXhlY19oZHIoYmZkKQkJKGFkYXRhKGJmZCkuaGRyKQotI2RlZmluZQlvYmpfYW91dF9zeW1ib2xzKGJmZCkJKGFkYXRhKGJmZCkuc3ltYm9scykKLSNkZWZpbmUJb2JqX3RleHRzZWMoYmZkKQkoYWRhdGEoYmZkKS50ZXh0c2VjKQotI2RlZmluZQlvYmpfZGF0YXNlYyhiZmQpCShhZGF0YShiZmQpLmRhdGFzZWMpCi0jZGVmaW5lCW9ial9ic3NzZWMoYmZkKQkJKGFkYXRhKGJmZCkuYnNzc2VjKQotI2RlZmluZQlvYmpfc3ltX2ZpbGVwb3MoYmZkKQkoYWRhdGEoYmZkKS5zeW1fZmlsZXBvcykKLSNkZWZpbmUJb2JqX3N0cl9maWxlcG9zKGJmZCkJKGFkYXRhKGJmZCkuc3RyX2ZpbGVwb3MpCi0jZGVmaW5lCW9ial9yZWxvY19lbnRyeV9zaXplKGJmZCkgKGFkYXRhKGJmZCkucmVsb2NfZW50cnlfc2l6ZSkKLSNkZWZpbmUJb2JqX3N5bWJvbF9lbnRyeV9zaXplKGJmZCkgKGFkYXRhKGJmZCkuc3ltYm9sX2VudHJ5X3NpemUpCi0jZGVmaW5lIG9ial9hb3V0X3N1YmZvcm1hdChiZmQpCShhZGF0YShiZmQpLnN1YmZvcm1hdCkKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyhiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N5bXMpCi0jZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudChiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N5bV9jb3VudCkKLSNkZWZpbmUgb2JqX2FvdXRfc3ltX3dpbmRvdyhiZmQpIChhZGF0YShiZmQpLnN5bV93aW5kb3cpCi0jZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MoYmZkKSAoYWRhdGEoYmZkKS5leHRlcm5hbF9zdHJpbmdzKQotI2RlZmluZSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZShiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N0cmluZ19zaXplKQotI2RlZmluZSBvYmpfYW91dF9zdHJpbmdfd2luZG93KGJmZCkgKGFkYXRhKGJmZCkuc3RyaW5nX3dpbmRvdykKLSNkZWZpbmUgb2JqX2FvdXRfc3ltX2hhc2hlcyhiZmQpIChhZGF0YShiZmQpLnN5bV9oYXNoZXMpCi0jZGVmaW5lIG9ial9hb3V0X2R5bmFtaWNfaW5mbyhiZmQpIChhZGF0YShiZmQpLmR5bmFtaWNfaW5mbykKLQotLyogV2UgdGFrZSB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhbiBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbCAqLwotI2RlZmluZSBhb3V0X3N5bWJvbChhc3ltYm9sKSAoKGFvdXRfc3ltYm9sX3R5cGUgKikoJihhc3ltYm9sKS0+dGhlX2JmZCkpCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggYS5vdXQgc2VjdGlvbi4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkKLSAgIHVzZWQgYnkgdGhlIGEub3V0IGJhY2tlbmQgbGlua2VyLiAgKi8KLQotc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdAotewotICAvKiBUaGUgdW5zd2FwcGVkIHJlbG9jYXRpb24gZW50cmllcyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgUFRSIHJlbG9jczsKLX07Ci0KLSNkZWZpbmUgYW91dF9zZWN0aW9uX2RhdGEocykgXAotICAoKHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikgKHMpLT51c2VkX2J5X2JmZCkKLQotI2RlZmluZSBzZXRfYW91dF9zZWN0aW9uX2RhdGEocyx2KSBcCi0gICgocyktPnVzZWRfYnlfYmZkID0gKFBUUikmKHYpLT5yZWxvY3MpCi0KLS8qIFByb3RvdHlwZSBkZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGFvdXR4LmggICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgUEFSQU1TICgoYmZkICopKTsKLQotY29uc3QgYmZkX3RhcmdldCAqCi1OQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwKLQkJCQkgICAgICAgY29uc3QgYmZkX3RhcmdldCAqKCpjYWxsYmFjaykoYmZkICopKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxta29iamVjdCkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWVudW0gbWFjaGluZV90eXBlCi1OQU1FKGFvdXQsbWFjaGluZV90eXBlKSBQQVJBTVMgKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkJCQkgdW5zaWduZWQgbG9uZyBtYWNoaW5lLAotCQkJCSBib29sZWFuICp1bmtub3duKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSBQQVJBTVMgKChiZmQgKmFiZmQsIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQkgCQkgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqbmV3c2VjdCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBzZWN0aW9uLAotCQkJIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIgb2Zmc2V0LCBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0KLWFzeW1ib2wgKgotTkFNRShhb3V0LG1ha2VfZW1wdHlfc3ltYm9sKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqLCBhb3V0X3N5bWJvbF90eXBlICosCi0JCQkJCSAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqLAotCQkJCQkgICBiZmRfc2l6ZV90eXBlLCBjaGFyICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUsCi0JCQkJCSAgIGJvb2xlYW4gZHluYW1pYykpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHdyaXRlX3N5bXMpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi12b2lkCi1OQU1FKGFvdXQscmVjbGFpbV9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1sb25nCi1OQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKipsb2NhdGlvbikpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICosCi0JCQkJICAgICAgYXJlbGVudCAqLCBhc3ltYm9sICoqLCBiZmRfc2l6ZV90eXBlKSk7Ci12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosCi0JCQkJICAgICAgYXJlbGVudCAqLCBhc3ltYm9sICoqLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSBQQVJBTVMgKChiZmQgKmFiZmQsIHNlY19wdHIgYXNlY3QsCi0JCQkJICAgICAgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLQotbG9uZwotTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIHNlY3Rpb24sCi0JCQkJICAgICAgIGFyZWxlbnQgKipyZWxwdHIsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBhc2VjdCkpOwotCi12b2lkCi1OQU1FKGFvdXQscmVjbGFpbV9yZWxvYykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgc2VjX3B0ciBpZ25vcmUpKTsKLQotYWxlbnQgKgotTkFNRShhb3V0LGdldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqaWdub3JlX2FiZmQsIGFzeW1ib2wgKmlnbm9yZV9zeW1ib2wpKTsKLQotdm9pZAotTkFNRShhb3V0LHByaW50X3N5bWJvbCkgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgUFRSIGZpbGUsCi0JCQkgICAgYXN5bWJvbCAqc3ltYm9sLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93KSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKGJmZCAqaWdub3JlX2FiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICpzeW1ib2wsIHN5bWJvbF9pbmZvICpyZXQpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotICAgICAgYXN5bWJvbCAqKnN5bWJvbHMsIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyLAotICAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIsIHVuc2lnbmVkIGludCAqbGluZV9wdHIpKTsKLQotbG9uZwotTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKTsKLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsCi0JCQkJCSBhc3ltYm9sICopKTsKLQotaW50Ci1OQU1FKGFvdXQsc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiBleGVjKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICBiZmRfc2l6ZV90eXBlICp0ZXh0X3NpemUsIGZpbGVfcHRyICp0ZXh0X2VuZCkpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMsIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCkpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMpKTsKLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLU5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KQotICAgICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgIGNvbnN0IGNoYXIgKikpKTsKLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkgICAgICAgdm9pZCAoKikgKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLAotCQkJCQkgZmlsZV9wdHIgKikpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBBLm91dCB1c2VzIHRoZSBnZW5lcmljIHZlcnNpb25zIG9mIHRoZXNlIHJvdXRpbmVzLi4uICovCi0KLSNkZWZpbmUJYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwlfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZQlhb3V0XzY0X2dldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotI2lmbmRlZiBOT19XUklURV9IRUFERVJfS0xVREdFCi0jZGVmaW5lIE5PX1dSSVRFX0hFQURFUl9LTFVER0UgMAotI2VuZGlmCi0KLSNpZm5kZWYgYW91dF8zMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBhb3V0XzMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIFdSSVRFX0hFQURFUlMKLSNkZWZpbmUgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCkJCQkJCSAgICAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICAgICBcCi0JYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7IC8qIGR1bW15IHZhcnMgKi8JCQkgICAgICBcCi0JZmlsZV9wdHIgdGV4dF9lbmQ7CQkJCQkJICAgICAgXAotCWlmIChhZGF0YShhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCQkJICAgICAgXAotCSAgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7ICAgICBcCi0gICAgCQkJCQkJCQkJICAgICAgXAotCWV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7CSAgICAgIFwKLQlleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CQkJICAgICAgXAotICAgIAkJCQkJCQkJCSAgICAgIFwKLQlleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKLQkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCi0JZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICAgICBcCi0JCQkgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJICAgICAgXAotCU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7CSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApIHJldHVybiBmYWxzZTsJICAgICAgXAotCWlmIChiZmRfd3JpdGUgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCSAgICAgIFwKLQkgICAgIT0gRVhFQ19CWVRFU19TSVpFKQkJCQkJCSAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgICAgXAotCS8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwkgICAgICBcCi0gIAkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSAhPSAoYXN5bWJvbCAqKikgTlVMTAkJICAgICAgXAotCSAgICAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKSAJCQkJICAgICAgXAotCSAgewkJCQkJCQkJICAgICAgXAotCSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICAgICAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQkgICAgaWYgKCEgTkFNRShhb3V0LHdyaXRlX3N5bXMpKGFiZmQpKSByZXR1cm4gZmFsc2U7CQkgICAgICBcCi0JICB9CQkJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAotCWlmICghTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkgICAgICAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9EUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0JaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpICAgICAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAotICAgICAgfQkJCQkJCQkJCSAgICAgIAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKExJQkFPVVRfSCkgKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJiZmQtaW4uaCBiL2JmZC9saWJiZmQtaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhMTc2ZC4uMDAwMDAwMAotLS0gYS9iZmQvbGliYmZkLWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAotLyogbGliYmZkLmggLS0gRGVjbGFyYXRpb25zIHVzZWQgYnkgYmZkIGxpYnJhcnkgKmltcGxlbWVudGF0aW9uKi4KLSAgIChUaGlzIGluY2x1ZGUgZmlsZSBpcyBub3QgZm9yIHVzZXJzIG9mIHRoZSBsaWJyYXJ5LikKLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogbGliYmZkLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KLSoqIGdlbmVyYXRlIHRoaXMgZmlsZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbGlnbiBhbiBhZGRyZXNzIHVwd2FyZCB0byBhIGJvdW5kYXJ5LCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMuCi0gICBFLmcuIGFsaWduIHRvIGFuIDgtYnl0ZSBib3VuZGFyeSB3aXRoIGFyZ3VtZW50IG9mIDguICBUYWtlIGNhcmUgbmV2ZXIKLSAgIHRvIHdyYXAgYXJvdW5kIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBib3VuZGFyeS0xIG9mIHRoZSBlbmQgb2YgdGhlCi0gICBhZGRyZXNzIHNwYWNlLiAgKi8KLSNkZWZpbmUgQkZEX0FMSUdOKHRoaXMsIGJvdW5kYXJ5KQkJCQkJXAotICAoKCgoYmZkX3ZtYSkgKHRoaXMpICsgKGJvdW5kYXJ5KSAtIDEpID49IChiZmRfdm1hKSAodGhpcykpCQlcCi0gICA/ICgoKGJmZF92bWEpICh0aGlzKSArICgoYm91bmRhcnkpIC0gMSkpICYgKH4oKGJvdW5kYXJ5KS0xKSkpCVwKLSAgIDogfiAoYmZkX3ZtYSkgMCkKLQotLyogSWYgeW91IHdhbnQgdG8gcmVhZCBhbmQgd3JpdGUgbGFyZ2UgYmxvY2tzLCB5b3UgbWlnaHQgd2FudCB0byBkbyBpdAotICAgaW4gcXVhbnRhIG9mIHRoaXMgYW1vdW50ICovCi0jZGVmaW5lIERFRkFVTFRfQlVGRkVSU0laRSA4MTkyCi0KLS8qIFNldCBhIHRkYXRhIGZpZWxkLiAgQ2FuJ3QgdXNlIHRoZSBvdGhlciBtYWNyb3MgZm9yIHRoaXMsIHNpbmNlIHRoZXkKLSAgIGRvIGNhc3RzLCBhbmQgY2FzdGluZyB0byB0aGUgbGVmdCBvZiBhc3NpZ25tZW50IGlzbid0IHBvcnRhYmxlLiAgKi8KLSNkZWZpbmUgc2V0X3RkYXRhKGJmZCwgdikgKChiZmQpLT50ZGF0YS5hbnkgPSAoUFRSKSAodikpCi0KLS8qIElmIEJGRF9JTl9NRU1PUlkgaXMgc2V0IGZvciBhIEJGRCwgdGhlbiB0aGUgaW9zdHJlYW0gZmllbGRzIHBvaW50cwotICAgdG8gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYmZkX2luX21lbW9yeQotewotICAvKiBTaXplIG9mIGJ1ZmZlci4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogQnVmZmVyIGhvbGRpbmcgY29udGVudHMgb2YgQkZELiAgKi8KLSAgYmZkX2J5dGUgKmJ1ZmZlcjsKLX07Ci0KLS8qIHRkYXRhIGZvciBhbiBhcmNoaXZlLiAgRm9yIGFuIGlucHV0IGFyY2hpdmUsIGNhY2hlCi0gICBuZWVkcyB0byBiZSBmcmVlKCknZC4gIEZvciBhbiBvdXRwdXQgYXJjaGl2ZSwgc3ltZGVmcyBkby4gICovCi0KLXN0cnVjdCBhcnRkYXRhIHsKLSAgZmlsZV9wdHIgZmlyc3RfZmlsZV9maWxlcG9zOwotICAvKiBTcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFybWFwICovCi0gIHN0cnVjdCBhcl9jYWNoZSAqY2FjaGU7Ci0gIGJmZCAqYXJjaGl2ZV9oZWFkOyAgICAgICAgICAgIC8qIE9ubHkgaW50ZXJlc3RpbmcgaW4gb3V0cHV0IHJvdXRpbmVzICovCi0gIGNhcnN5bSAqc3ltZGVmczsJCS8qIHRoZSBzeW1kZWYgZW50cmllcyAqLwotICBzeW1pbmRleCBzeW1kZWZfY291bnQ7ICAgICAgICAgICAgIC8qIGhvdyBtYW55IHRoZXJlIGFyZSAqLwotICBjaGFyICpleHRlbmRlZF9uYW1lczsJCS8qIGNsZXZlciBpbnRlbCBleHRlbnNpb24gKi8KLSAgLyogd2hlbiBtb3JlIGNvbXBpbGVycyBhcmUgc3RhbmRhcmQgQywgdGhpcyBjYW4gYmUgYSB0aW1lX3QgKi8KLSAgbG9uZyAgYXJtYXBfdGltZXN0YW1wOwkvKiBUaW1lc3RhbXAgdmFsdWUgd3JpdHRlbiBpbnRvIGFybWFwLgotCQkJCSAgIFRoaXMgaXMgdXNlZCBmb3IgQlNEIGFyY2hpdmVzIHRvIGNoZWNrCi0JCQkJICAgdGhhdCB0aGUgdGltZXN0YW1wIGlzIHJlY2VudCBlbm91Z2gKLQkJCQkgICBmb3IgdGhlIEJTRCBsaW5rZXIgdG8gbm90IGNvbXBsYWluLAotCQkJCSAgIGp1c3QgYmVmb3JlIHdlIGZpbmlzaCB3cml0aW5nIGFuCi0JCQkJICAgYXJjaGl2ZS4gICovCi0gIGZpbGVfcHRyIGFybWFwX2RhdGVwb3M7CS8qIFBvc2l0aW9uIHdpdGhpbiBhcmNoaXZlIHRvIHNlZWsgdG8KLQkJCQkgICByZXdyaXRlIHRoZSBkYXRlIGZpZWxkLiAgKi8KLSAgUFRSIHRkYXRhOwkJCS8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotfTsKLQotI2RlZmluZSBiZmRfYXJkYXRhKGJmZCkgKChiZmQpLT50ZGF0YS5hb3V0X2FyX2RhdGEpCi0KLS8qIEdvZXMgaW4gYmZkJ3MgYXJlbHRfZGF0YSBzbG90ICovCi1zdHJ1Y3QgYXJlbHRkYXRhIHsKLSAgY2hhciAqIGFyY2hfaGVhZGVyOwkJCSAgICAgLyogaXQncyBhY3R1YWxseSBhIHN0cmluZyAqLwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7ICAgICAvKiBvY3RldHMgb2YgZmlsZXNpemUgbm90IGluY2x1ZGluZyBhcl9oZHIgKi8KLSAgY2hhciAqZmlsZW5hbWU7CQkJICAgICAvKiBudWxsLXRlcm1pbmF0ZWQgKi8KLX07Ci0KLSNkZWZpbmUgYXJlbHRfc2l6ZShiZmQpICgoKHN0cnVjdCBhcmVsdGRhdGEgKikoKGJmZCktPmFyZWx0X2RhdGEpKS0+cGFyc2VkX3NpemUpCi0KLWV4dGVybiBQVFIgYmZkX21hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3JlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3ptYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLWV4dGVybiBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIF9iZmRfZXJyb3JfaGFuZGxlcjsKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgYW5kIGZyZWUgdGhpbmdzIG9uIHRoZSBCRkQncyBvYmphbGxvYy4gICovCi0KLWV4dGVybiBQVFIgYmZkX2FsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3phbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBiZmRfcmVsZWFzZSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLWJmZCAqCV9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCBQQVJBTVMgKChiZmQgKm9iZmQpKTsKLWJmZCAqCV9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIFBBUkFNUyAoKGJmZCAqYXJjaF9iZmQsIGZpbGVfcHRyIGluZGV4KSk7Ci1ib29sZWFuIF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkICopKTsKLWJvb2xlYW4JX2JmZF9nZW5lcmljX21rYXJjaGl2ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNvbnN0IGJmZF90YXJnZXQgKmJmZF9nZW5lcmljX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JYmZkX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBiZmRfc2x1cnBfYnNkX2FybWFwX2YyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBiZmRfc2x1cnBfYnNkX2FybWFwIGJmZF9zbHVycF9hcm1hcAotI2RlZmluZSBiZmRfc2x1cnBfY29mZl9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLWJvb2xlYW4JX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1ib29sZWFuCV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50IGVsZW5ndGgpKTsKLWJmZCAqX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICphcmNoaXZlLCBmaWxlX3B0ciBmaWxlcG9zKSk7Ci1leHRlcm4gYmZkICpfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLWJmZCAqIF9iZmRfbmV3X2JmZCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJvb2xlYW4JYmZkX2ZhbHNlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1ib29sZWFuCWJmZF90cnVlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1QVFIJYmZkX251bGx2b2lkcHRyIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1pbnQJYmZkXzAgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXVuc2lnbmVkIGludAliZmRfMHUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWxvbmcJYmZkXzBsIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCV9iZmRfbjEgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXZvaWQJYmZkX3ZvaWQgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLQotYmZkICpfYmZkX25ld19iZmRfY29udGFpbmVkX2luIFBBUkFNUyAoKGJmZCAqKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpfYmZkX2R1bW15X3RhcmdldCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdm9pZAliZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci12b2lkCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfZ251X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLQotYm9vbGVhbglic2Rfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotCi1ib29sZWFuCWNvZmZfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotYmZkICoJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwKLQkJCQkJCSAgICAgYmZkICpsYXN0X2ZpbGUpKTsKLQotaW50CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzdGF0ICopKTsKLQotI2RlZmluZSBfYmZkX3JlYWRfYXJfaGRyKGFiZmQpIFwKLSAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVhZF9hcl9oZHJfZm4sIChhYmZkKSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9HRU5FUklDLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAgYmZkX3RydWUKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3dpbmRvdyAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09QWS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIpKSkgYmZkX3RydWUpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09SRSB3aGVuIHRoZXJlIGlzIG5vIGNvcmUgZmlsZQotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSkuICAqLwotCi1leHRlcm4gY2hhciAqX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHdoZW4gdGhlcmUgaXMgbm8gYXJjaGl2ZQotICAgZmlsZSBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfYXJtYXAgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdHJ1bmNhdGVfYXJuYW1lIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjaGFyICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXggXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX2ZhbHNlCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQlNEIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9hcm1hcCBiZmRfc2x1cnBfYnNkX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfdHJ1bmNhdGVfYXJuYW1lIGJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfd3JpdGVfYXJtYXAgYnNkX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IENPRkYgc3R5bGUKLSAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2NvZmZfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3dyaXRlX2FybWFwIGNvZmZfd3JpdGVfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgd2hlcmUgdGhlcmUgaXMgbm8gc3ltYm9sCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21ha2VfZW1wdHlfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8gXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubyBcCi0gICgoYWxlbnQgKigqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwgXAotCSAgICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIHdoZW4gdGhlcmUgaXMgbm8gcmVsb2MKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gICgocmVsb2NfaG93dG9fdHlwZSAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFIGZvciB0YXJnZXRzIHdoaWNoIG1heSBub3QKLSAgIGJlIHdyaXR0ZW4uICBVc2UgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfbm93cml0ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfYXJjaF9tYWNoIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpKSBcCi0gICBiZmRfZmFsc2UpCi0KLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0xJTksgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90Ci0gICBzdXBwb3J0IGxpbmtpbmcuICBVc2UgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLiAgKi8KLQotI2RlZmluZSBfYmZkX25vbGlua19zaXplb2ZfaGVhZGVycyAoKGludCAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKSkgYmZkXzApCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICAoKGJmZF9ieXRlICooKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgXAotCSAgICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19hZGRfc3ltYm9scyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZmluYWxfbGluayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19zcGxpdF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF9mYWxzZSkKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgaGF2ZSBkeW5hbWljIHN5bWJvbHMgb3IgcmVsb2NzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMKLSAgIChfYmZkX25vZHluYW1pYykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZSB0byBkZXRlcm1pbmUgb2YgdGhlIGdpdmVuIHN5bWJvbCBpcyBhIGxvY2FsCi0gICBsYWJlbC4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogR2VuZXJpYyBtaW5pc3ltYm9sIHJvdXRpbmVzLiAgKi8KLWV4dGVybiBsb25nIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBhc3ltYm9sICpfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyAuc3RhYi8uc3RhYnN0ciBzZWN0aW9ucy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYm9vbGVhbiAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFkZXJzdCBsaW5lIHVzaW5nIERXQVJGIDEgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyBEV0FSRiAyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEEgcm91dGluZSB0byBjcmVhdGUgZW50cmllcyBmb3IgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi0vKiBJbml0aWFsaXplIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgY3JlYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQgYnkgdGFyZ2V0cyBmb3IKLSAgIHdoaWNoIHRoZSBsaW5rZXIgbXVzdCBjb2xsZWN0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZSwKLSAgIGFzIHRoZSBjb2xsZWN0MiBwcm9ncmFtIGRvZXMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFyY2hpdmUgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgYm9vbGVhbiAoKmNoZWNrZm4pIChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpOwotCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhdm9pZCBwcm90b3R5cGUgZXJyb3JzLiAgKi8KLXR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgX2JmZF9saW5rX2hhc2hfZW50cnk7Ci0KLS8qIEdlbmVyaWMgcm91dGluZSB0byBhZGQgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICpuYW1lLCBmbGFnd29yZCwKLQkgICBhc2VjdGlvbiAqLCBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY29weSwKLQkgICBib29sZWFuIGNvbnN0cnVjdG9yLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0vKiBHZW5lcmljIGxpbmsgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLQotLyogR2VuZXJpYyByZWxvY19saW5rX29yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBEZWZhdWx0IGxpbmsgb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsb2MgZW50cmllcyBpbiBhIGxpbmsgb3JkZXIgbGlzdC4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRmluYWwgbGluayByZWxvY2F0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBiZmRfdm1hIGFkZHJlc3MsIGJmZF92bWEgdmFsdWUsIGJmZF92bWEgYWRkZW5kKSk7Ci0KLS8qIFJlbG9jYXRlIGEgcGFydGljdWxhciBsb2NhdGlvbiBieSBhIGhvd3RvIGFuZCBhIHZhbHVlLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIExpbmsgc3RhYnMgaW4gc2VjdGlvbnMgaW4gdGhlIGZpcnN0IHBhc3MuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIGFzZWN0aW9uICosIFBUUiAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX2J5dGUgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHN0cmluZyB0YWJsZSB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgUFRSICopKTsKLQotLyogRmluZCBhbiBvZmZzZXQgd2l0aGluIGEgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4KLSAgIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF92bWEpKTsKLQotLyogQ3JlYXRlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ3JlYXRlIGFuIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uIHN0eWxlIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZyZWUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgX2JmZF9zdHJpbmd0YWJfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX3NpemUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9hZGQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gaGFzaCwKLQkgICBib29sZWFuIGNvcHkpKTsKLQotLyogV3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfc3RyaW5ndGFiX2VtaXQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBDaGVjayB0aGF0IGVuZGlhbm5lc3Mgb2YgaW5wdXQgYW5kIG91dHB1dCBmaWxlIG1hdGNoLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotDAotLyogTWFjcm9zIHRvIHRlbGwgaWYgYmZkcyBhcmUgcmVhZCBvciB3cml0ZSBlbmFibGVkLgotCi0gICBOb3RlIHRoYXQgYmZkcyBvcGVuIGZvciByZWFkIG1heSBiZSBzY3JpYmJsZWQgaW50byBpZiB0aGUgZmQgcGFzc2VkCi0gICB0byBiZmRfZmRvcGVuciBpcyBhY3R1YWxseSBvcGVuIGJvdGggZm9yIHJlYWQgYW5kIHdyaXRlCi0gICBzaW11bHRhbmVvdXNseS4gIEhvd2V2ZXIgYW4gb3V0cHV0IGJmZCB3aWxsIG5ldmVyIGJlIG9wZW4gZm9yCi0gICByZWFkLiAgVGhlcmVmb3JlIHNvbWV0aW1lcyB5b3Ugd2FudCB0byBjaGVjayBiZmRfcmVhZF9wIG9yCi0gICAhYmZkX3JlYWRfcCwgYW5kIG9ubHkgc29tZXRpbWVzIGJmZF93cml0ZV9wLgotKi8KLQotI2RlZmluZQliZmRfcmVhZF9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSByZWFkX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLSNkZWZpbmUJYmZkX3dyaXRlX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLQotdm9pZAliZmRfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIqLGludCkpOwotCi0jZGVmaW5lIEJGRF9BU1NFUlQoeCkgXAoteyBpZiAoISh4KSkgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotI2RlZmluZSBCRkRfRkFJTCgpIFwKLXsgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotZXh0ZXJuIHZvaWQgX2JmZF9hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSkKLSAgICAgQVRUUklCVVRFX05PUkVUVVJOOwotCi0vKiBpZiBnY2MsIHdlIGNhbiBnaXZlIGEgZnVuY3Rpb24gbmFtZSwgdG9vICovCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSB8fCBfX0dOVUNfTUlOT1JfXyA8PSA1Ci0jZGVmaW5lIF9fUFJFVFRZX0ZVTkNUSU9OX18gICgoY2hhciAqKSBOVUxMKQotI2VuZGlmCi0KLSN1bmRlZiBhYm9ydAotI2RlZmluZSBhYm9ydCgpIF9iZmRfYWJvcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXykKLQotRklMRSAqCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0vKiBMaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXQgdmVjdG9ycywgYW5kIHRoZSBkZWZhdWx0IHZlY3RvciAoaWYKLSAgIGJmZF9kZWZhdWx0X3ZlY3RvclswXSBpcyBOVUxMLCB0aGVyZSBpcyBubyBkZWZhdWx0KS4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW107Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2RlZmF1bHRfdmVjdG9yW107Ci0KLS8qIEZ1bmN0aW9ucyBzaGFyZWQgYnkgdGhlIEVDT0ZGIGFuZCBNSVBTIEVMRiBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGVjb2ZmX2ZpbmRfbGluZTsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwKLQkgICBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci0KLWV4dGVybiBiZmRfdm1hIF9iZmRfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotCi0vKiBGdW5jdGlvbiBzaGFyZWQgYnkgdGhlIENPRkYgYW5kIEVMRiBTSCBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJvb2xlYW4gKCopIChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSwKLQkgICBQVFIsIGJmZF92bWEgKiosIGJmZF92bWEgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYm9vbGVhbiAqKSk7Ci0KLS8qIEFuZCBtb3JlIGZvbGxvd3MgKi8KLQpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC5jIGIvYmZkL2xpYmJmZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODFhZjczLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMjIgKzAsMCBAQAotLyogQXNzb3J0ZWQgQkZEIHN1cHBvcnQgcm91dGluZXMsIG9ubHkgdXNlZCBpbnRlcm5hbGx5LgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jZGVmaW5lIGdldHBhZ2VzaXplKCkgMjA0OAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcmVhbF9yZWFkIFBBUkFNUyAoKFBUUiwgc2l6ZV90LCBzaXplX3QsIEZJTEUgKikpOwotCi0vKgotU0VDVElPTgotCUludGVybmFsIGZ1bmN0aW9ucwotCi1ERVNDUklQVElPTgotCVRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIHdpdGhpbiBCRkQuCi0JVGhleSBhcmUgbm90IGludGVuZGVkIGZvciBleHBvcnQsIGJ1dCBhcmUgZG9jdW1lbnRlZCBoZXJlIGZvcgotCWNvbXBsZXRlbmVzcy4KLSovCi0KLS8qIEEgcm91dGluZSB3aGljaCBpcyB1c2VkIGluIHRhcmdldCB2ZWN0b3JzIGZvciB1bnN1cHBvcnRlZAotICAgb3BlcmF0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX2ZhbHNlIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHN1cHBvcnRlZCBvcGVyYXRpb25zCi0gICB3aGljaCBkbyBub3QgYWN0dWFsbHkgZG8gYW55dGhpbmcuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF90cnVlIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3IgdW5zdXBwb3J0ZWQKLSAgIG9wZXJhdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB2YWx1ZS4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1iZmRfbnVsbHZvaWRwdHIgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qQVJHU1VTRUQqLwotaW50IAotYmZkXzAgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdW5zaWduZWQgaW50IAotYmZkXzB1IChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gICByZXR1cm4gMDsKLX0KLQotLypBUkdVU0VEKi8KLWxvbmcKLWJmZF8wbCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHVuc3VwcG9ydGVkCi0gICBvcGVyYXRpb25zIHdoaWNoIHJldHVybiAtMSBvbiBlcnJvci4gICovCi0KLS8qQVJHU1VTRUQqLwotbG9uZwotX2JmZF9uMSAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQgCi1iZmRfdm9pZCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotfQotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoaWdub3JlX2NvcmVfYmZkLCBpZ25vcmVfZXhlY19iZmQpCi0gICAgIGJmZCAqaWdub3JlX2NvcmVfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaWdub3JlX2V4ZWNfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUm91dGluZSB0byBoYW5kbGUgY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBlbnRyeSBwb2ludCBmb3IgdGFyZ2V0cwotICAgd2l0aG91dCBjb3JlIGZpbGUgc3VwcG9ydC4gICovCi0KLS8qQVJHU1VTRUQqLwotY2hhciAqCi1fYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gKGNoYXIgKilOVUxMOwotfQotCi0vKiBSb3V0aW5lIHRvIGhhbmRsZSBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgZW50cnkgcG9pbnQgZm9yIHRhcmdldHMKLSAgIHdpdGhvdXQgY29yZSBmaWxlIHN1cHBvcnQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWludAotX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLV9iZmRfZHVtbXlfdGFyZ2V0IChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBtZW1vcnkgdXNpbmcgbWFsbG9jLiAgKi8KLQotUFRSCi1iZmRfbWFsbG9jIChzaXplKQotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHB0cjsKLQotICBwdHIgPSAoUFRSKSBtYWxsb2MgKHNpemUpOwotICBpZiAocHRyID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBSZWFsbG9jYXRlIG1lbW9yeSB1c2luZyByZWFsbG9jLiAgKi8KLQotUFRSCi1iZmRfcmVhbGxvYyAocHRyLCBzaXplKQotICAgICBQVFIgcHRyOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHJldDsKLQotICBpZiAocHRyID09IE5VTEwpCi0gICAgcmV0ID0gbWFsbG9jIChzaXplKTsKLSAgZWxzZQotICAgIHJldCA9IHJlYWxsb2MgKHB0ciwgc2l6ZSk7Ci0KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSB1c2luZyBtYWxsb2MgYW5kIGNsZWFyIGl0LiAgKi8KLQotUFRSCi1iZmRfem1hbGxvYyAoc2l6ZSkKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiBwdHI7Ci0KLSAgcHRyID0gKFBUUikgbWFsbG9jIChzaXplKTsKLQotICBpZiAoc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChwdHIgPT0gTlVMTCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIGVsc2UKLQltZW1zZXQgKHB0ciwgMCwgc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBTb21lIElPIGNvZGUgKi8KLQotCi0vKiBOb3RlIHRoYXQgYXJjaGl2ZSBlbnRyaWVzIGRvbid0IGhhdmUgc3RyZWFtczsgdGhleSBzaGFyZSB0aGVpciBwYXJlbnQncy4KLSAgIFRoaXMgYWxsb3dzIHNvbWVvbmUgdG8gcGxheSB3aXRoIHRoZSBpb3N0cmVhbSBiZWhpbmQgQkZEJ3MgYmFjay4KLQotICAgQWxzbywgbm90ZSB0aGF0IHRoZSBvcmlnaW4gcG9pbnRlciBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUncwotICAgY29udGVudHMgKDAgZm9yIG5vbi1hcmNoaXZlIGVsZW1lbnRzKS4gIEZvciBhcmNoaXZlIGVudHJpZXMgdGhpcyBpcyB0aGUKLSAgIGZpcnN0IG9jdGV0IGluIHRoZSBmaWxlLCBOT1QgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIuICovCi0KLXN0YXRpYyBpbnQKLXJlYWxfcmVhZCAod2hlcmUsIGEsYiwgZmlsZSkKLSAgICAgUFRSIHdoZXJlOwotICAgICBzaXplX3QgYTsKLSAgICAgc2l6ZV90IGI7Ci0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIC8qIEZJWE1FIC0gdGhpcyBsb29rcyBsaWtlIGFuIG9wdGltaXphdGlvbiwgYnV0IGl0J3MgcmVhbGx5IHRvIGNvdmVyCi0gICAgIHVwIGZvciBhIGZlYXR1cmUgb2Ygc29tZSBPU3MgKG5vdCBzb2xhcmlzIC0gc2lnaCkgdGhhdAotICAgICBsZC9wZS1kbGwuYyB0YWtlcyBhZHZhbnRhZ2Ugb2YgKGFwcGFyZW50bHkpIHdoZW4gaXQgY3JlYXRlcyBCRkRzCi0gICAgIGludGVybmFsbHkgYW5kIHRyaWVzIHRvIGxpbmsgYWdhaW5zdCB0aGVtLiAgQkZEIHNlZW1zIHRvIGJlIHNtYXJ0Ci0gICAgIGVub3VnaCB0byByZWFsaXplIHRoZXJlIGFyZSBubyBzeW1ib2wgcmVjb3JkcyBpbiB0aGUgImZpbGUiIHRoYXQKLSAgICAgZG9lc24ndCBleGlzdCBidXQgYXR0ZW1wdHMgdG8gcmVhZCB0aGVtIGFueXdheS4gIE9uIFNvbGFyaXMsCi0gICAgIGF0dGVtcHRpbmcgdG8gcmVhZCB6ZXJvIGJ5dGVzIGZyb20gYSBOVUxMIGZpbGUgcmVzdWx0cyBpbiBhIGNvcmUKLSAgICAgZHVtcCwgYnV0IG9uIG90aGVyIHBsYXRmb3JtcyBpdCBqdXN0IHJldHVybnMgemVybyBieXRlcyByZWFkLgotICAgICBUaGlzIG1ha2VzIGl0IHRvIHNvbWV0aGluZyByZWFzb25hYmxlLiAtIERKICovCi0gIGlmIChhID09IDAgfHwgYiA9PSAwKQotICAgIHJldHVybiAwOwotCi0jaWYgZGVmaW5lZCAoX19WQVgpICYmIGRlZmluZWQgKFZNUykKLSAgLyogQXBwYXJlbnRseSBmcmVhZCBvbiBWYXggVk1TIGRvZXMgbm90IGtlZXAgdGhlIHJlY29yZCBsZW5ndGgKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICByZXR1cm4gcmVhZCAoZmlsZW5vIChmaWxlKSwgd2hlcmUsIGEgKiBiKTsKLSNlbHNlCi0gIHJldHVybiBmcmVhZCAod2hlcmUsIGEsIGIsIGZpbGUpOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybiB2YWx1ZSBpcyBhbW91bnQgcmVhZCAoRklYTUU6IGhvdyBhcmUgZXJyb3JzIGFuZCBlbmQgb2YgZmlsZSBkZWFsdAotICAgd2l0aD8gIFdlIG5ldmVyIGNhbGwgYmZkX3NldF9lcnJvciwgd2hpY2ggaXMgcHJvYmFibHkgYSBtaXN0YWtlKS4gICovCi0KLWJmZF9zaXplX3R5cGUKLWJmZF9yZWFkIChwdHIsIHNpemUsIG5pdGVtcywgYWJmZCkKLSAgICAgUFRSIHB0cjsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICBiZmRfc2l6ZV90eXBlIG5pdGVtczsKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbnJlYWQ7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbTsKLSAgICAgIGJmZF9zaXplX3R5cGUgZ2V0OwotCi0gICAgICBiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW07Ci0gICAgICBnZXQgPSBzaXplICogbml0ZW1zOwotICAgICAgaWYgKGFiZmQtPndoZXJlICsgZ2V0ID4gYmltLT5zaXplKQotCXsKLQkgIGlmIChiaW0tPnNpemUgPCAoYmZkX3NpemVfdHlwZSkgYWJmZC0+d2hlcmUpCi0JICAgIGdldCA9IDA7Ci0JICBlbHNlCi0JICAgIGdldCA9IGJpbS0+c2l6ZSAtIGFiZmQtPndoZXJlOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQl9Ci0gICAgICBtZW1jcHkgKHB0ciwgYmltLT5idWZmZXIgKyBhYmZkLT53aGVyZSwgZ2V0KTsKLSAgICAgIGFiZmQtPndoZXJlICs9IGdldDsKLSAgICAgIHJldHVybiBnZXQ7Ci0gICAgfQotCi0gIG5yZWFkID0gcmVhbF9yZWFkIChwdHIsIDEsIChzaXplX3QpKHNpemUqbml0ZW1zKSwgYmZkX2NhY2hlX2xvb2t1cChhYmZkKSk7Ci0gIGlmIChucmVhZCA+IDApCi0gICAgYWJmZC0+d2hlcmUgKz0gbnJlYWQ7Ci0KLSAgLyogU2V0IGJmZF9lcnJvciBpZiB3ZSBkaWQgbm90IHJlYWQgYXMgbXVjaCBkYXRhIGFzIHdlIGV4cGVjdGVkLgotCi0gICAgIElmIHRoZSByZWFkIGZhaWxlZCBkdWUgdG8gYW4gZXJyb3Igc2V0IHRoZSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwsCi0gICAgIGVsc2Ugc2V0IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZC4KLQotICAgICBBIEJGRCBiYWNrZW5kIG1heSB3aXNoIHRvIG92ZXJyaWRlIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCB0bwotICAgICBwcm92aWRlIHNvbWV0aGluZyBtb3JlIHVzZWZ1bCAoZWcuIG5vX3N5bWJvbHMgb3Igd3JvbmdfZm9ybWF0KS4gICovCi0gIGlmIChucmVhZCAhPSAoaW50KSAoc2l6ZSAqIG5pdGVtcykpCi0gICAgewotICAgICAgaWYgKGZlcnJvciAoYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCkpKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBlbHNlCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5yZWFkOwotfQotCi0vKiBUaGUgd2luZG93IHN1cHBvcnQgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGJlIGJyb2tlbiBvdXQgaW50bwotICAgYW5vdGhlciBmaWxlLi4uLiAgKi8KLS8qIFRoZSBpZGVhIGJlaGluZCB0aGUgbmV4dCBhbmQgcmVmY291bnQgZmllbGRzIGlzIHRoYXQgb25lIG1hcHBlZAotICAgcmVnaW9uIGNhbiBzdWZmaWNlIGZvciBtdWx0aXBsZSByZWFkLW9ubHkgd2luZG93cyBvciBtdWx0aXBsZQotICAgbm9uLW92ZXJsYXBwaW5nIHJlYWQtd3JpdGUgd2luZG93cy4gIEl0J3Mgbm90IGltcGxlbWVudGVkIHlldAotICAgdGhvdWdoLiAgKi8KLXN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCB7Ci0gIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqbmV4dDsKLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgaW50IHJlZmNvdW50IDogMzE7CQkvKiBzaG91bGQgYmUgZW5vdWdoLi4uICovCi0gIHVuc2lnbmVkIG1hcHBlZCA6IDE7CQkvKiAxID0gbW1hcCwgMCA9IG1hbGxvYyAqLwotfTsKLQotdm9pZAotYmZkX2luaXRfd2luZG93ICh3aW5kb3dwKQotICAgICBiZmRfd2luZG93ICp3aW5kb3dwOwotewotICB3aW5kb3dwLT5kYXRhID0gMDsKLSAgd2luZG93cC0+aSA9IDA7Ci0gIHdpbmRvd3AtPnNpemUgPSAwOwotfQotDAotLyogQ3VycmVudGx5LCBpZiBVU0VfTU1BUCBpcyB1bmRlZmluZWQsIG5vbmUgaWYgdGhlIHdpbmRvdyBzdHVmZiBpcwotICAgdXNlZC4gIE9rYXksIHNvIGl0J3MgbWlzLW5hbWVkLiAgQXQgbGVhc3QgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KLSAgICItLXdpdGhvdXQtbW1hcCIgaXMgbW9yZSBvYnZpb3VzIHRoYW4gIi0td2l0aG91dC13aW5kb3dzIiBvciBzb21lCi0gICBzdWNoLiAgKi8KLSNpZmRlZiBVU0VfTU1BUAotCi0jdW5kZWYgSEFWRV9NUFJPVEVDVCAvKiBjb2RlJ3Mgbm90IHRlc3RlZCB5ZXQgKi8KLQotI2lmIEhBVkVfTU1BUCB8fCBIQVZFX01QUk9URUNUIHx8IEhBVkVfTUFEVklTRQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBNQVBfRklMRQotI2RlZmluZSBNQVBfRklMRSAwCi0jZW5kaWYKLQotc3RhdGljIGludCBkZWJ1Z193aW5kb3dzOwotCi12b2lkCi1iZmRfZnJlZV93aW5kb3cgKHdpbmRvd3ApCi0gICAgIGJmZF93aW5kb3cgKndpbmRvd3A7Ci17Ci0gIGJmZF93aW5kb3dfaW50ZXJuYWwgKmkgPSB3aW5kb3dwLT5pOwotICB3aW5kb3dwLT5pID0gMDsKLSAgd2luZG93cC0+ZGF0YSA9IDA7Ci0gIGlmIChpID09IDApCi0gICAgcmV0dXJuOwotICBpLT5yZWZjb3VudC0tOwotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJmcmVlaW5nIHdpbmRvdyBAJXA8JXAsJWx4LCVwPlxuIiwKLQkgICAgIHdpbmRvd3AsIHdpbmRvd3AtPmRhdGEsIHdpbmRvd3AtPnNpemUsIHdpbmRvd3AtPmkpOwotICBpZiAoaS0+cmVmY291bnQgIT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGktPm1hcHBlZCkKLSAgICB7Ci0jaWZkZWYgSEFWRV9NTUFQCi0gICAgICBtdW5tYXAgKGktPmRhdGEsIGktPnNpemUpOwotICAgICAgZ290byBub19mcmVlOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgfQotI2lmZGVmIEhBVkVfTVBST1RFQ1QKLSAgbXByb3RlY3QgKGktPmRhdGEsIGktPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwotI2VuZGlmCi0gIGZyZWUgKGktPmRhdGEpOwotI2lmZGVmIEhBVkVfTU1BUAotIG5vX2ZyZWU6Ci0jZW5kaWYKLSAgaS0+ZGF0YSA9IDA7Ci0gIC8qIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIHJlZmVyZW5jZXMgdG8gaSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgZnJlZSAoaSk7Ci19Ci0KLXN0YXRpYyBpbnQgb2tfdG9fbWFwID0gMTsKLQotYm9vbGVhbgotYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwgb2Zmc2V0LCBzaXplLCB3aW5kb3dwLCB3cml0YWJsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgYmZkX3dpbmRvdyAqd2luZG93cDsKLSAgICAgYm9vbGVhbiB3cml0YWJsZTsKLXsKLSAgc3RhdGljIHNpemVfdCBwYWdlc2l6ZTsKLSAgYmZkX3dpbmRvd19pbnRlcm5hbCAqaSA9IHdpbmRvd3AtPmk7Ci0gIHNpemVfdCBzaXplX3RvX2FsbG9jID0gc2l6ZTsKLQotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJiZmRfZ2V0X2ZpbGVfd2luZG93ICglcCwgJTZsZCwgJTZsZCwgJXA8JXAsJWx4LCVwPiwgJWQpIiwKLQkgICAgIGFiZmQsIChsb25nKSBvZmZzZXQsIChsb25nKSBzaXplLAotCSAgICAgd2luZG93cCwgd2luZG93cC0+ZGF0YSwgKHVuc2lnbmVkIGxvbmcpIHdpbmRvd3AtPnNpemUsCi0JICAgICB3aW5kb3dwLT5pLCB3cml0YWJsZSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgdGhlIHBhZ2Ugc2l6ZSwgc28gd2UgY2FuIGJlIGZyaWVuZGx5IHRvIG1tYXAuICAqLwotICBpZiAocGFnZXNpemUgPT0gMCkKLSAgICBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplICgpOwotICBpZiAocGFnZXNpemUgPT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoaSA9PSAwKQotICAgIHsKLSAgICAgIHdpbmRvd3AtPmkgPSBpID0gKGJmZF93aW5kb3dfaW50ZXJuYWwgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkX3dpbmRvd19pbnRlcm5hbCkpOwotICAgICAgaWYgKGkgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpLT5kYXRhID0gMDsKLSAgICB9Ci0jaWZkZWYgSEFWRV9NTUFQCi0gIGlmIChva190b19tYXAKLSAgICAgICYmIChpLT5kYXRhID09IDAgfHwgaS0+bWFwcGVkID09IDEpCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSA9PSAwKQotICAgIHsKLSAgICAgIGZpbGVfcHRyIGZpbGVfb2Zmc2V0LCBvZmZzZXQyOwotICAgICAgc2l6ZV90IHJlYWxfc2l6ZTsKLSAgICAgIGludCBmZDsKLSAgICAgIEZJTEUgKmY7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHJlYWwgZmlsZSBhbmQgdGhlIHJlYWwgb2Zmc2V0IGludG8gaXQuICAqLwotICAgICAgd2hpbGUgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLQl7Ci0JICBvZmZzZXQgKz0gYWJmZC0+b3JpZ2luOwotCSAgYWJmZCA9IGFiZmQtPm15X2FyY2hpdmU7Ci0JfQotICAgICAgZiA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgICAgZmQgPSBmaWxlbm8gKGYpOwotCi0gICAgICAvKiBDb21wdXRlIG9mZnNldHMgYW5kIHNpemUgZm9yIG1tYXAgYW5kIGZvciB0aGUgdXNlcidzIGRhdGEuICAqLwotICAgICAgb2Zmc2V0MiA9IG9mZnNldCAlIHBhZ2VzaXplOwotICAgICAgaWYgKG9mZnNldDIgPCAwKQotCWFib3J0ICgpOwotICAgICAgZmlsZV9vZmZzZXQgPSBvZmZzZXQgLSBvZmZzZXQyOwotICAgICAgcmVhbF9zaXplID0gb2Zmc2V0ICsgc2l6ZSAtIGZpbGVfb2Zmc2V0OwotICAgICAgcmVhbF9zaXplID0gcmVhbF9zaXplICsgcGFnZXNpemUgLSAxOwotICAgICAgcmVhbF9zaXplIC09IHJlYWxfc2l6ZSAlIHBhZ2VzaXplOwotCi0gICAgICAvKiBJZiB3ZSdyZSByZS11c2luZyBhIG1lbW9yeSByZWdpb24sIG1ha2Ugc3VyZSBpdCdzIGJpZyBlbm91Z2guICAqLwotICAgICAgaWYgKGktPmRhdGEgJiYgaS0+c2l6ZSA8IHNpemUpCi0JewotCSAgbXVubWFwIChpLT5kYXRhLCBpLT5zaXplKTsKLQkgIGktPmRhdGEgPSAwOwotCX0KLSAgICAgIGktPmRhdGEgPSBtbWFwIChpLT5kYXRhLCByZWFsX3NpemUsCi0JCSAgICAgIHdyaXRhYmxlID8gUFJPVF9XUklURSB8IFBST1RfUkVBRCA6IFBST1RfUkVBRCwKLQkJICAgICAgKHdyaXRhYmxlCi0JCSAgICAgICA/IE1BUF9GSUxFIHwgTUFQX1BSSVZBVEUKLQkJICAgICAgIDogTUFQX0ZJTEUgfCBNQVBfU0hBUkVEKSwKLQkJICAgICAgZmQsIGZpbGVfb2Zmc2V0KTsKLSAgICAgIGlmIChpLT5kYXRhID09IChQVFIpIC0xKQotCXsKLQkgIC8qIEFuIGVycm9yIGhhcHBlbmVkLiAgUmVwb3J0IGl0LCBvciB0cnkgdXNpbmcgbWFsbG9jLCBvcgotCSAgICAgc29tZXRoaW5nLiAgKi8KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICBpLT5kYXRhID0gMDsKLQkgIHdpbmRvd3AtPmRhdGEgPSAwOwotCSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIlx0XHRtbWFwIGZhaWxlZCFcbiIpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChkZWJ1Z193aW5kb3dzKQotCWZwcmludGYgKHN0ZGVyciwgIlxuXHRtYXBwZWQgJWxkIGF0ICVwLCBvZmZzZXQgaXMgJWxkXG4iLAotCQkgKGxvbmcpIHJlYWxfc2l6ZSwgaS0+ZGF0YSwgKGxvbmcpIG9mZnNldDIpOwotICAgICAgaS0+c2l6ZSA9IHJlYWxfc2l6ZTsKLSAgICAgIHdpbmRvd3AtPmRhdGEgPSAoUFRSKSAoKGJmZF9ieXRlICopIGktPmRhdGEgKyBvZmZzZXQyKTsKLSAgICAgIHdpbmRvd3AtPnNpemUgPSBzaXplOwotICAgICAgaS0+bWFwcGVkID0gMTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZSBpZiAoZGVidWdfd2luZG93cykKLSAgICB7Ci0gICAgICBpZiAob2tfdG9fbWFwKQotCWZwcmludGYgKHN0ZGVyciwgXygibm90IG1hcHBpbmc6IGRhdGE9JWx4IG1hcHBlZD0lZFxuIiksCi0JCSAodW5zaWduZWQgbG9uZykgaS0+ZGF0YSwgKGludCkgaS0+bWFwcGVkKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdGRlcnIsIF8oIm5vdCBtYXBwaW5nOiBlbnYgdmFyIG5vdCBzZXRcbiIpKTsKLSAgICB9Ci0jZWxzZQotICBva190b19tYXAgPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX01QUk9URUNUCi0gIGlmICghd3JpdGFibGUpCi0gICAgewotICAgICAgc2l6ZV90b19hbGxvYyArPSBwYWdlc2l6ZSAtIDE7Ci0gICAgICBzaXplX3RvX2FsbG9jIC09IHNpemVfdG9fYWxsb2MgJSBwYWdlc2l6ZTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXG5cdCVzKCU2bGQpIiwKLQkgICAgIGktPmRhdGEgPyAicmVhbGxvYyIgOiAiIG1hbGxvYyIsIChsb25nKSBzaXplX3RvX2FsbG9jKTsKLSAgaS0+ZGF0YSA9IChQVFIpIGJmZF9yZWFsbG9jIChpLT5kYXRhLCBzaXplX3RvX2FsbG9jKTsKLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXHQtPiAlcFxuIiwgaS0+ZGF0YSk7Ci0gIGktPnJlZmNvdW50ID0gMTsKLSAgaWYgKGktPmRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZV90b19hbGxvYyA9PSAwKQotCXJldHVybiB0cnVlOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpLT5zaXplID0gYmZkX3JlYWQgKGktPmRhdGEsIHNpemUsIDEsIGFiZmQpOwotICBpZiAoaS0+c2l6ZSAhPSBzaXplKQotICAgIHJldHVybiBmYWxzZTsKLSAgaS0+bWFwcGVkID0gMDsKLSNpZmRlZiBIQVZFX01QUk9URUNUCi0gIGlmICghd3JpdGFibGUpCi0gICAgewotICAgICAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JZnByaW50ZiAoc3RkZXJyLCAiXHRtcHJvdGVjdCAoJXAsICVsZCwgUFJPVF9SRUFEKVxuIiwgaS0+ZGF0YSwKLQkJIChsb25nKSBpLT5zaXplKTsKLSAgICAgIG1wcm90ZWN0IChpLT5kYXRhLCBpLT5zaXplLCBQUk9UX1JFQUQpOwotICAgIH0KLSNlbmRpZgotICB3aW5kb3dwLT5kYXRhID0gaS0+ZGF0YTsKLSAgd2luZG93cC0+c2l6ZSA9IGktPnNpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogVVNFX01NQVAgKi8KLQwKLWJmZF9zaXplX3R5cGUKLWJmZF93cml0ZSAocHRyLCBzaXplLCBuaXRlbXMsIGFiZmQpCi0gICAgIENPTlNUIFBUUiBwdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgYmZkX3NpemVfdHlwZSBuaXRlbXM7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBud3JvdGU7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSAoYWJmZC0+aW9zdHJlYW0pOwotICAgICAgc2l6ZSAqPSBuaXRlbXM7Ci0gICAgICBpZiAoYWJmZC0+d2hlcmUgKyBzaXplID4gYmltLT5zaXplKQotCXsKLQkgIGxvbmcgbmV3c2l6ZSwgb2xkc2l6ZSA9IChiaW0tPnNpemUgKyAxMjcpICYgfjEyNzsKLQkgIGJpbS0+c2l6ZSA9IGFiZmQtPndoZXJlICsgc2l6ZTsKLQkgIC8qIFJvdW5kIHVwIHRvIGN1dCBkb3duIG9uIG1lbW9yeSBmcmFnbWVudGF0aW9uICovCi0JICBuZXdzaXplID0gKGJpbS0+c2l6ZSArIDEyNykgJiB+MTI3OwotCSAgaWYgKG5ld3NpemUgPiBvbGRzaXplKQotCSAgICB7Ci0JICAgICAgYmltLT5idWZmZXIgPSBiZmRfcmVhbGxvYyAoYmltLT5idWZmZXIsIG5ld3NpemUpOwotCSAgICAgIGlmIChiaW0tPmJ1ZmZlciA9PSAwKQotCQl7Ci0JCSAgYmltLT5zaXplID0gMDsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgbWVtY3B5IChiaW0tPmJ1ZmZlciArIGFiZmQtPndoZXJlLCBwdHIsIHNpemUpOwotICAgICAgYWJmZC0+d2hlcmUgKz0gc2l6ZTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICBud3JvdGUgPSBmd3JpdGUgKHB0ciwgMSwgKHNpemVfdCkgKHNpemUgKiBuaXRlbXMpLAotCQkgICBiZmRfY2FjaGVfbG9va3VwIChhYmZkKSk7Ci0gIGlmIChud3JvdGUgPiAwKQotICAgIGFiZmQtPndoZXJlICs9IG53cm90ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBud3JvdGUgIT0gc2l6ZSAqIG5pdGVtcykKLSAgICB7Ci0jaWZkZWYgRU5PU1BDCi0gICAgICBpZiAobndyb3RlID49IDApCi0JZXJybm8gPSBFTk9TUEM7Ci0jZW5kaWYKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgfQotICByZXR1cm4gbndyb3RlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludAotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQoYmZkICphYmZkLCAgaW50IGkpOwotCi1ERVNDUklQVElPTgotCVdyaXRlIGEgNCBieXRlIGludGVnZXIgQHZhcntpfSB0byB0aGUgb3V0cHV0IEJGRCBAdmFye2FiZmR9LCBpbiBiaWcKLQllbmRpYW4gb3JkZXIgcmVnYXJkbGVzcyBvZiB3aGF0IGVsc2UgaXMgZ29pbmcgb24uICBUaGlzIGlzIHVzZWZ1bCBpbgotCWFyY2hpdmVzLgotCi0qLwotdm9pZAotYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFiZmQsIGkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGk7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgYmZkX3B1dGIzMihpLCBidWZmZXIpOwotICBpZiAoYmZkX3dyaXRlKChQVFIpYnVmZmVyLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIGFib3J0ICgpOwotfQotCi1sb25nCi1iZmRfdGVsbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBmaWxlX3B0ciBwdHI7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIGFiZmQtPndoZXJlOwotCi0gIHB0ciA9IGZ0ZWxsIChiZmRfY2FjaGVfbG9va3VwKGFiZmQpKTsKLQotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKLSAgICBwdHIgLT0gYWJmZC0+b3JpZ2luOwotICBhYmZkLT53aGVyZSA9IHB0cjsKLSAgcmV0dXJuIHB0cjsKLX0KLQotaW50Ci1iZmRfZmx1c2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmZmx1c2ggKGJmZF9jYWNoZV9sb29rdXAoYWJmZCkpOwotfQotCi0vKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlCi0gICBiZmRfZ2V0X2Vycm9yIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLwotaW50Ci1iZmRfc3RhdCAoYWJmZCwgc3RhdGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZjsKLXsKLSAgRklMRSAqZjsKLSAgaW50IHJlc3VsdDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJlc3VsdCA9IGZzdGF0IChmaWxlbm8gKGYpLCBzdGF0YnVmKTsKLSAgaWYgKHJlc3VsdCA8IDApCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub256ZXJvIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlIGJmZF9nZXRfZXJyb3IKLSAgIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLwotCi1pbnQKLWJmZF9zZWVrIChhYmZkLCBwb3NpdGlvbiwgZGlyZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIHBvc2l0aW9uOwotICAgICBpbnQgZGlyZWN0aW9uOwotewotICBpbnQgcmVzdWx0OwotICBGSUxFICpmOwotICBmaWxlX3B0ciBmaWxlX3Bvc2l0aW9uOwotICAvKiBGb3IgdGhlIHRpbWUgYmVpbmcsIGEgQkZEIG1heSBub3Qgc2VlayB0byBpdCdzIGVuZC4gIFRoZSBwcm9ibGVtCi0gICAgIGlzIHRoYXQgd2UgZG9uJ3QgZWFzaWx5IGhhdmUgYSB3YXkgdG8gcmVjb2duaXplIHRoZSBlbmQgb2YgYW4KLSAgICAgZWxlbWVudCBpbiBhbiBhcmNoaXZlLiAqLwotCi0gIEJGRF9BU1NFUlQgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCB8fCBkaXJlY3Rpb24gPT0gU0VFS19DVVIpOwotCi0gIGlmIChkaXJlY3Rpb24gPT0gU0VFS19DVVIgJiYgcG9zaXRpb24gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotCi0gICAgICBiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW07Ci0gICAgICAKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQpCi0JYWJmZC0+d2hlcmUgPSBwb3NpdGlvbjsKLSAgICAgIGVsc2UKLQlhYmZkLT53aGVyZSArPSBwb3NpdGlvbjsKLSAgICAgIAotICAgICAgaWYgKChiZmRfc2l6ZV90eXBlKSBhYmZkLT53aGVyZSA+IGJpbS0+c2l6ZSkKLQl7Ci0JICBhYmZkLT53aGVyZSA9IGJpbS0+c2l6ZTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfYXJjaGl2ZSAmJiBhYmZkLT5teV9hcmNoaXZlID09IDApCi0gICAgewotI2lmIDAKLSAgICAgIC8qIEV4cGxhbmF0aW9uIGZvciB0aGlzIGNvZGU6IEknbSBvbmx5IGFib3V0IDk1KyUgc3VyZSB0aGF0IHRoZSBhYm92ZQotCSBjb25kaXRpb25zIGFyZSBzdWZmaWNpZW50IGFuZCB0aGF0IGFsbCBpL28gY2FsbHMgYXJlIHByb3Blcmx5Ci0JIGFkanVzdGluZyB0aGUgYHdoZXJlJyBmaWVsZC4gIFNvIHRoaXMgaXMgc29ydCBvZiBhbiBgYXNzZXJ0JwotCSB0aGF0IHRoZSBgd2hlcmUnIGZpZWxkIGlzIGNvcnJlY3QuICBJZiB3ZSBjYW4gZ28gYSB3aGlsZSB3aXRob3V0Ci0JIHRyaXBwaW5nIHRoZSBhYm9ydCwgd2UgY2FuIHByb2JhYmx5IHNhZmVseSBkaXNhYmxlIHRoaXMgY29kZSwKLQkgc28gdGhhdCB0aGUgcmVhbCBvcHRpbWl6YXRpb25zIGhhcHBlbi4gICovCi0gICAgICBmaWxlX3B0ciB3aGVyZV9hbV9pX25vdzsKLSAgICAgIHdoZXJlX2FtX2lfbm93ID0gZnRlbGwgKGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpKTsKLSAgICAgIGlmIChhYmZkLT5teV9hcmNoaXZlKQotCXdoZXJlX2FtX2lfbm93IC09IGFiZmQtPm9yaWdpbjsKLSAgICAgIGlmICh3aGVyZV9hbV9pX25vdyAhPSBhYmZkLT53aGVyZSkKLQlhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBwb3NpdGlvbiA9PSBhYmZkLT53aGVyZSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHNvbWV0aGluZyBzbWFydGVyIHRvIG9wdGltaXplIGFjY2VzcyB0byBhcmNoaXZlcy4KLQkgQ3VycmVudGx5LCBhbnl0aGluZyBpbnNpZGUgYW4gYXJjaGl2ZSBpcyByZWFkIHZpYSB0aGUgZmlsZQotCSBoYW5kbGUgZm9yIHRoZSBhcmNoaXZlLiAgV2hpY2ggbWVhbnMgdGhhdCBhIGJmZF9zZWVrIG9uIG9uZQotCSBjb21wb25lbnQgYWZmZWN0cyB0aGUgYGN1cnJlbnQgcG9zaXRpb24nIGluIHRoZSBhcmNoaXZlLCBhcwotCSB3ZWxsIGFzIGluIGFueSBvdGhlciBjb21wb25lbnQuCi0KLQkgSXQgbWlnaHQgYmUgc3VmZmljaWVudCB0byBwdXQgYSBzcGlrZSB0aHJvdWdoIHRoZSBjYWNoZQotCSBhYnN0cmFjdGlvbiwgYW5kIGxvb2sgdG8gdGhlIGFyY2hpdmUgZm9yIHRoZSBmaWxlIHBvc2l0aW9uLAotCSBidXQgSSB0aGluayB3ZSBzaG91bGQgdHJ5IGZvciBzb21ldGhpbmcgY2xlYW5lci4KLQotCSBJbiB0aGUgbWVhbnRpbWUsIG5vIG9wdGltaXphdGlvbiBmb3IgYXJjaGl2ZXMuICAqLwotICAgIH0KLQotICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGZpbGVfcG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCi0gICAgZmlsZV9wb3NpdGlvbiArPSBhYmZkLT5vcmlnaW47Ci0KLSAgcmVzdWx0ID0gZnNlZWsgKGYsIGZpbGVfcG9zaXRpb24sIGRpcmVjdGlvbik7Ci0KLSAgaWYgKHJlc3VsdCAhPSAwKQotICAgIHsKLSAgICAgIGludCBob2xkX2Vycm5vID0gZXJybm87Ci0KLSAgICAgIC8qIEZvcmNlIHJlZGV0ZXJtaW5hdGlvbiBvZiBgd2hlcmUnIGZpZWxkLiAgKi8KLSAgICAgIGJmZF90ZWxsIChhYmZkKTsKLQotICAgICAgLyogQW4gRUlOVkFMIGVycm9yIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIGZpbGUgb2Zmc2V0IHdhcwotICAgICAgICAgYWJzdXJkLiAgKi8KLSAgICAgIGlmIChob2xkX2Vycm5vID09IEVJTlZBTCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICBlcnJubyA9IGhvbGRfZXJybm87Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFkanVzdCBgd2hlcmUnIGZpZWxkLiAgKi8KLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQpCi0JYWJmZC0+d2hlcmUgPSBwb3NpdGlvbjsKLSAgICAgIGVsc2UKLQlhYmZkLT53aGVyZSArPSBwb3NpdGlvbjsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0MCi0vKiogVGhlIGRvLWl0LXlvdXJzZWxmIChieXRlKSBzZXgtY2hhbmdlIGtpdCAqLwotCi0vKiBUaGUgbWlkZGxlIGxldHRlciBlLmcuIGdldDxiPnNob3J0IGluZGljYXRlcyBCaWcgb3IgTGl0dGxlIGVuZGlhbgotICAgdGFyZ2V0IG1hY2hpbmUuICBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0Ci0gICBtYWNoaW5lIGlzOyB0aGVzZSByb3V0aW5lcyB3b3JrIGZvciBlaXRoZXIuICAqLwotCi0vKiBGSVhNRTogU2hvdWxkIHRoZXNlIHRha2UgYSBjb3VudCBhcmd1bWVudD8KLSAgIEFuc3dlciAoZ251QGN5Z251cy5jb20pOiAgTm8sIGJ1dCBwZXJoYXBzIHRoZXkgc2hvdWxkIGJlIGlubGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgaW4gc3dhcC5oICNpZmRlZiBfX0dOVUNfXy4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwcm9mIHRoZW0gbGF0ZXIgYW5kIGZpbmQgb3V0LiAgKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3B1dF9zaXplCi1GVU5DVElPTgotCWJmZF9nZXRfc2l6ZQotCi1ERVNDUklQVElPTgotCVRoZXNlIG1hY3JvcyBhcyB1c2VkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHJhdyBkYXRhIGluCi0Jc2VjdGlvbnM7IGVhY2ggYWNjZXNzIChleGNlcHQgZm9yIGJ5dGVzKSBpcyB2ZWN0b3JlZCB0aHJvdWdoCi0JdGhlIHRhcmdldCBmb3JtYXQgb2YgdGhlIEJGRCBhbmQgbWFuZ2xlZCBhY2NvcmRpbmdseS4gVGhlCi0JbWFuZ2xpbmcgcGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBlbmRpYW4gdHJhbnNsYXRpb25zIGFuZAotCXJlbW92ZXMgYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gIE5vdGUgdGhhdCB0eXBlcyBhY2NlcHRlZCBhbmQKLQlyZXR1cm5lZCBieSB0aGVzZSBtYWNyb3MgYXJlIGlkZW50aWNhbCBzbyB0aGV5IGNhbiBiZSBzd2FwcGVkCi0JYXJvdW5kIGluIG1hY3Jvcy0tLWZvciBleGFtcGxlLCBAZmlsZXtsaWJhb3V0Lmh9IGRlZmluZXMgPDxHRVRfV09SRD4+Ci0JdG8gZWl0aGVyIDw8YmZkX2dldF8zMj4+IG9yIDw8YmZkX2dldF82ND4+LgotCi0JSW4gdGhlIHB1dCByb3V0aW5lcywgQHZhcnt2YWx9IG11c3QgYmUgYSA8PGJmZF92bWE+Pi4gIElmIHdlIGFyZSBvbiBhCi0Jc3lzdGVtIHdpdGhvdXQgcHJvdG90eXBlcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nCi0Jc3VyZSB0aGF0IGlzIHRydWUsIHdpdGggYSBjYXN0IGlmIG5lY2Vzc2FyeS4gIFdlIGRvbid0IGNhc3QKLQl0aGVtIGluIHRoZSBtYWNybyBkZWZpbml0aW9ucyBiZWNhdXNlIHRoYXQgd291bGQgcHJldmVudCA8PGxpbnQ+PgotCW9yIDw8Z2NjIC1XYWxsPj4gZnJvbSBkZXRlY3Rpbmcgc2lucyBzdWNoIGFzIHBhc3NpbmcgYSBwb2ludGVyLgotCVRvIGRldGVjdCBjYWxsaW5nIHRoZXNlIHdpdGggbGVzcyB0aGFuIGEgPDxiZmRfdm1hPj4sIHVzZQotCTw8Z2NjIC1XY29udmVyc2lvbj4+IG9uIGEgaG9zdCB3aXRoIDY0IGJpdCA8PGJmZF92bWE+PidzLgotCi0uCi0ueyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKn0KLS4KLS4jZGVmaW5lIGJmZF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICAoKHZvaWQpICgqKCh1bnNpZ25lZCBjaGFyICopKHB0cikpID0gKHVuc2lnbmVkIGNoYXIpKHZhbCkpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfOCBcCi0uCQliZmRfcHV0XzgKLS4jZGVmaW5lIGJmZF9nZXRfOChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLS4JCSgoKih1bnNpZ25lZCBjaGFyICopKHB0cikgXiAweDgwKSAtIDB4ODApCi0uCi0uI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MTYsICgodmFsKSwocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8xNiBcCi0uCQkgYmZkX3B1dF8xNgotLiNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgxNiwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAJIEJGRF9TRU5EIChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDMyLCAoKHZhbCksKHB0cikpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMzIgXAotLgkJIGJmZF9wdXRfMzIKLS4jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4MzIsIChwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzMyLCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHg2NCwgKCh2YWwpLCAocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCi0uCQkgYmZkX3B1dF82NAotLiNkZWZpbmUgYmZkX2dldF82NChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHg2NCwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX2dldChiaXRzLCBhYmZkLCBwdHIpCQkJCVwKLS4gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX2dldF84IChhYmZkLCBwdHIpCQlcCi0uCQkgOiAoYml0cykgPT0gMTYgPyBiZmRfZ2V0XzE2IChhYmZkLCBwdHIpCVwKLS4JCSA6IChiaXRzKSA9PSAzMiA/IGJmZF9nZXRfMzIgKGFiZmQsIHB0cikJXAotLgkJIDogKGJpdHMpID09IDY0ID8gYmZkX2dldF82NCAoYWJmZCwgcHRyKQlcCi0uCQkgOiAoYWJvcnQgKCksIChiZmRfdm1hKSAtIDEpKQotLgotLiNkZWZpbmUgYmZkX3B1dChiaXRzLCBhYmZkLCB2YWwsIHB0cikJCQkJXAotLiAgICAgICAgICAgICAgICAoKGJpdHMpID09IDggPyBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQlcCi0uCQkgOiAoYml0cykgPT0gMTYgPyBiZmRfcHV0XzE2IChhYmZkLCB2YWwsIHB0cikJXAotLgkJIDogKGJpdHMpID09IDMyID8gYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBwdHIpCVwKLS4JCSA6IChiaXRzKSA9PSA2NCA/IGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgcHRyKQlcCi0uCQkgOiAoYWJvcnQgKCksICh2b2lkKSAwKSkKLS4KLSovIAotCi0vKgotRlVOQ1RJT04KLQliZmRfaF9wdXRfc2l6ZQotCWJmZF9oX2dldF9zaXplCi0KLURFU0NSSVBUSU9OCi0JVGhlc2UgbWFjcm9zIGhhdmUgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlaXIgPDxiZmRfZ2V0X3g+PgotCWJyZXRoZXJlbiwgZXhjZXB0IHRoYXQgdGhleSBhcmUgdXNlZCBmb3IgcmVtb3ZpbmcgaW5mb3JtYXRpb24KLQlmb3IgdGhlIGhlYWRlciByZWNvcmRzIG9mIG9iamVjdCBmaWxlcy4gQmVsaWV2ZSBpdCBvciBub3QsCi0Jc29tZSBvYmplY3QgZmlsZXMga2VlcCB0aGVpciBoZWFkZXIgcmVjb3JkcyBpbiBiaWcgZW5kaWFuCi0Jb3JkZXIgYW5kIHRoZWlyIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4KLS4KLS57KiBCeXRlIHN3YXBwaW5nIG1hY3JvcyBmb3IgZmlsZSBoZWFkZXIgZGF0YS4gICp9Ci0uCi0uI2RlZmluZSBiZmRfaF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotLgkJYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfOChhYmZkLCB2YWwsIHB0cikgXAotLgkJYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLS4jZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAotLgkJYmZkX2dldF84IChhYmZkLCBwdHIpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzgoYWJmZCwgcHRyKSBcCi0uCQliZmRfZ2V0X3NpZ25lZF84IChhYmZkLCBwdHIpCi0uCi0uI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDE2LCh2YWwscHRyKSkKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfMTYgXAotLgkJIGJmZF9oX3B1dF8xNgotLiNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MTYsKHB0cikpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzE2KGFiZmQsIHB0cikgXAotLgkJIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHhfc2lnbmVkXzE2LCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9oX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MzIsKHZhbCxwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCi0uCQkgYmZkX2hfcHV0XzMyCi0uI2RlZmluZSBiZmRfaF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgzMiwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX2hfcHV0XzY0KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF82NCBcCi0uCQkgYmZkX2hfcHV0XzY0Ci0uI2RlZmluZSBiZmRfaF9nZXRfNjQoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfNjQoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotLgotKi8gCi0KLS8qIFNpZ24gZXh0ZW5zaW9uIHRvIGJmZF9zaWduZWRfdm1hLiAgKi8KLSNkZWZpbmUgQ09FUkNFMTYoeCkgKCgoYmZkX3NpZ25lZF92bWEpICh4KSBeIDB4ODAwMCkgLSAweDgwMDApCi0jZGVmaW5lIENPRVJDRTMyKHgpIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSkgKGxvbmcpICgoKHVuc2lnbmVkIGxvbmcpICh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkpCi0jZGVmaW5lIEVJR0hUX0dBWklMTElPTiAoKChCRkRfSE9TVF82NF9CSVQpMHg4MDAwMDAwMCkgPDwgMzIpCi0jZGVmaW5lIENPRVJDRTY0KHgpIFwKLSAgKCgoYmZkX3NpZ25lZF92bWEpICh4KSBeIEVJR0hUX0dBWklMTElPTikgLSBFSUdIVF9HQVpJTExJT04pCi0KLWJmZF92bWEKLWJmZF9nZXRiMTYgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICByZXR1cm4gKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0bDE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIChhZGRyWzFdIDw8IDgpIHwgYWRkclswXTsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF8xNiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHJldHVybiBDT0VSQ0UxNigoYWRkclswXSA8PCA4KSB8IGFkZHJbMV0pOwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGxfc2lnbmVkXzE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIENPRVJDRTE2KChhZGRyWzFdIDw8IDgpIHwgYWRkclswXSk7Ci19Ci0KLXZvaWQKLWJmZF9wdXRiMTYgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gOCk7Ci0gIGFkZHJbMV0gPSAoYmZkX2J5dGUgKWRhdGE7Ci19Ci0KLXZvaWQKLWJmZF9wdXRsMTYgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsgICAgICAgICAgICAgCi0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICBhZGRyWzBdID0gKGJmZF9ieXRlIClkYXRhOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+IDgpOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0YjMyIChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXSA8PCAyNDsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdOwotICByZXR1cm4gKGJmZF92bWEpIHY7Ci19Ci0KLWJmZF92bWEKLWJmZF9nZXRsMzIgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdOwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDg7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbM10gPDwgMjQ7Ci0gIHJldHVybiAoYmZkX3ZtYSkgdjsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF8zMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF0gPDwgMjQ7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXTsKLSAgcmV0dXJuIENPRVJDRTMyICh2KTsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRsX3NpZ25lZF8zMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF07Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXSA8PCAyNDsKLSAgcmV0dXJuIENPRVJDRTMyICh2KTsKLX0KLQotYmZkX3ZtYQotYmZkX2dldGI2NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLQotICBoaWdoPSAoKCgoKCgoKGFkZHJbMF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbM10pICk7Ci0KLSAgbG93ID0gKCgoKCgoKCgoYmZkX3ZtYSlhZGRyWzRdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzddKSk7Ci0KLSAgcmV0dXJuIGhpZ2ggPDwgMzIgfCBsb3c7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi1iZmRfdm1hCi1iZmRfZ2V0bDY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotICBoaWdoPSAoKCgoKCgoYWRkcls3XSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzRdKSk7Ci0KLSAgbG93ID0gKCgoKCgoKChiZmRfdm1hKWFkZHJbM10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclswXSkgKTsKLQotICByZXR1cm4gaGlnaCA8PCAzMiB8IGxvdzsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0gIHJldHVybiAwOwotI2VuZGlmCi0KLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF82NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLQotICBoaWdoPSAoKCgoKCgoKGFkZHJbMF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbM10pICk7Ci0KLSAgbG93ID0gKCgoKCgoKCgoYmZkX3ZtYSlhZGRyWzRdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzddKSk7Ci0KLSAgcmV0dXJuIENPRVJDRTY0KGhpZ2ggPDwgMzIgfCBsb3cpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRsX3NpZ25lZF82NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLSAgaGlnaD0gKCgoKCgoKGFkZHJbN10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzZdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzVdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkcls0XSkpOwotCi0gIGxvdyA9ICgoKCgoKCgoYmZkX3ZtYSlhZGRyWzNdIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbMF0pICk7Ci0KLSAgcmV0dXJuIENPRVJDRTY0KGhpZ2ggPDwgMzIgfCBsb3cpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotdm9pZAotYmZkX3B1dGIzMiAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgICAgICAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Ci0gICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gMTYpOwotICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICA4KTsKLSAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSlkYXRhOwotfQotCi12b2lkCi1iZmRfcHV0bDMyIChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICAgICAgICBhZGRyWzBdID0gKGJmZF9ieXRlKWRhdGE7Ci0gICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gIDgpOwotICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+IDE2KTsKLSAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Ci19Ci0KLXZvaWQKLWJmZF9wdXRiNjQgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDcqOCkpOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+ICg2KjgpKTsKLSAgYWRkclsyXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNSo4KSk7Ci0gIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDQqOCkpOwotICBhZGRyWzRdID0gKGJmZF9ieXRlKShkYXRhID4+ICgzKjgpKTsKLSAgYWRkcls1XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMio4KSk7Ci0gIGFkZHJbNl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDEqOCkpOwotICBhZGRyWzddID0gKGJmZF9ieXRlKShkYXRhID4+ICgwKjgpKTsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0jZW5kaWYKLX0KLQotdm9pZAotYmZkX3B1dGw2NCAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYWRkcls3XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNyo4KSk7Ci0gIGFkZHJbNl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDYqOCkpOwotICBhZGRyWzVdID0gKGJmZF9ieXRlKShkYXRhID4+ICg1KjgpKTsKLSAgYWRkcls0XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNCo4KSk7Ci0gIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDMqOCkpOwotICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICgyKjgpKTsKLSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMSo4KSk7Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDAqOCkpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSNlbmRpZgotfQotDAotLyogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoYmZkX3NpemVfdHlwZSkgKG9mZnNldCArIGNvdW50KSA+IHNlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKSAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IChhYmZkLCBzZWN0aW9uLCB3LCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF93aW5kb3cgKncgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBVU0VfTU1BUAotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGFiZmQtPnh2ZWMtPl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgIT0gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hhdCBjaGFuZ2VzIHRoZSBiZmQncyBnZXRfc2VjdGlvbl9jb250ZW50cwotCSBtZXRob2QgbWF5IGhhdmUgdG8gbWFrZS4gIFNvIHB1bnQgdHJ5aW5nIHRvIG1hcCB0aGUgZmlsZQotCSB3aW5kb3csIGFuZCBsZXQgZ2V0X3NlY3Rpb25fY29udGVudHMgZG8gaXRzIHRoaW5nLiAgKi8KLSAgICAgIC8qIEBAIEZJWE1FIDogSWYgdGhlIGludGVybmFsIHdpbmRvdyBoYXMgYSByZWZjb3VudCBvZiAxIGFuZCB3YXMKLQkgYWxsb2NhdGVkIHdpdGggbWFsbG9jIGluc3RlYWQgb2YgbW1hcCwganVzdCByZXVzZSBpdC4gICovCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKHcpOwotICAgICAgdy0+aSA9IChiZmRfd2luZG93X2ludGVybmFsICopIGJmZF96bWFsbG9jIChzaXplb2YgKGJmZF93aW5kb3dfaW50ZXJuYWwpKTsKLSAgICAgIGlmICh3LT5pID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdy0+aS0+ZGF0YSA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIGNvdW50KTsKLSAgICAgIGlmICh3LT5pLT5kYXRhID09IE5VTEwpCi0JewotCSAgZnJlZSAody0+aSk7Ci0JICB3LT5pID0gTlVMTDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICB3LT5pLT5tYXBwZWQgPSAwOwotICAgICAgdy0+aS0+cmVmY291bnQgPSAxOwotICAgICAgdy0+c2l6ZSA9IHctPmktPnNpemUgPSBjb3VudDsKLSAgICAgIHctPmRhdGEgPSB3LT5pLT5kYXRhOwotICAgICAgcmV0dXJuIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgdy0+ZGF0YSwgb2Zmc2V0LCBjb3VudCk7Ci0gICAgfQotICBpZiAoKGJmZF9zaXplX3R5cGUpIChvZmZzZXQrY291bnQpID4gc2VjdGlvbi0+X3Jhd19zaXplCi0gICAgICB8fCAoYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgY291bnQsIHcsIHRydWUpCi0JICA9PSBmYWxzZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLSNlbHNlCi0gIGFib3J0ICgpOwotI2VuZGlmCi19Ci0KLS8qIFRoaXMgZ2VuZXJpYyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIGltcGxlbWVudGF0aW9ucyB3aGVyZSBjcmVhdGluZwotICAgTkVXIHNlY3Rpb25zIGlzIGRpc2FsbG93ZWQuICBJdCBpcyB1c2VmdWwgaW4gcGF0Y2hpbmcgZXhpc3Rpbmcgc2VjdGlvbnMKLSAgIGluIHJlYWQtd3JpdGUgZmlsZXMsIHRob3VnaC4gIFNlZSBvdGhlciBzZXRfc2VjdGlvbl9jb250ZW50cyBmdW5jdGlvbnMKLSAgIHRvIHNlZSB3aHkgaXQgZG9lc24ndCB3b3JrIGZvciBuZXcgc2VjdGlvbnMuICAqLwotYm9vbGVhbgotX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgPT0gLTEKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKSAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfbG9nMgotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfbG9nMihiZmRfdm1hIHgpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbG9nIGJhc2UgMiBvZiB0aGUgdmFsdWUgc3VwcGxpZWQsIHJvdW5kZWQgdXAuICBFLmcuLCBhbgotCUB2YXJ7eH0gb2YgMTAyNSByZXR1cm5zIDExLgotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfbG9nMiAoeCkKLSAgICAgYmZkX3ZtYSB4OwotewotICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKLQotICB3aGlsZSAoKHggPSAoeCA+PiAxKSkgIT0gMCkKLSAgICArK3Jlc3VsdDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbGVhbgotYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjaGFyIGxvY2Fsc19wcmVmaXggPSAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXycpID8gJ0wnIDogJy4nOwotCi0gIHJldHVybiAobmFtZVswXSA9PSBsb2NhbHNfcHJlZml4KTsKLX0KLQotLyogIENhbiBiZSB1c2VkIGZyb20gLyBmb3IgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgdG8gY2hlY2sgdGhhdAotICAgIGVuZGlhbm5lc3MgbWF0Y2hlcyBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgZmlsZS4gIFJldHVybnMKLSAgICB0cnVlIGZvciBhIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgZW1pdHMgYW4gZXJyb3IuICAqLwotYm9vbGVhbgotX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuIiwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0JIGJmZF9iaWdfZW5kaWFuIChvYmZkKSA/ICJiaWciIDogImxpdHRsZSIpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvbGliYmZkLmggYi9iZmQvbGliYmZkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YmFmNWEuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmJmZC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTM2ICswLDAgQEAKLS8qIGxpYmJmZC5oIC0tIERlY2xhcmF0aW9ucyB1c2VkIGJ5IGJmZCBsaWJyYXJ5ICppbXBsZW1lbnRhdGlvbiouCi0gICAoVGhpcyBpbmNsdWRlIGZpbGUgaXMgbm90IGZvciB1c2VycyBvZiB0aGUgbGlicmFyeS4pCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmJmZC5oIGlzIGEgR0VORVJBVEVEIGZpbGUuICBEb24ndCBjaGFuZ2UgaXQ7IGluc3RlYWQsCi0qKiBjaGFuZ2UgbGliYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGlzIGZpbGUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQWxpZ24gYW4gYWRkcmVzcyB1cHdhcmQgdG8gYSBib3VuZGFyeSwgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgRS5nLiBhbGlnbiB0byBhbiA4LWJ5dGUgYm91bmRhcnkgd2l0aCBhcmd1bWVudCBvZiA4LiAgVGFrZSBjYXJlIG5ldmVyCi0gICB0byB3cmFwIGFyb3VuZCBpZiB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gYm91bmRhcnktMSBvZiB0aGUgZW5kIG9mIHRoZQotICAgYWRkcmVzcyBzcGFjZS4gICovCi0jZGVmaW5lIEJGRF9BTElHTih0aGlzLCBib3VuZGFyeSkJCQkJCVwKLSAgKCgoKGJmZF92bWEpICh0aGlzKSArIChib3VuZGFyeSkgLSAxKSA+PSAoYmZkX3ZtYSkgKHRoaXMpKQkJXAotICAgPyAoKChiZmRfdm1hKSAodGhpcykgKyAoKGJvdW5kYXJ5KSAtIDEpKSAmICh+KChib3VuZGFyeSktMSkpKQlcCi0gICA6IH4gKGJmZF92bWEpIDApCi0KLS8qIElmIHlvdSB3YW50IHRvIHJlYWQgYW5kIHdyaXRlIGxhcmdlIGJsb2NrcywgeW91IG1pZ2h0IHdhbnQgdG8gZG8gaXQKLSAgIGluIHF1YW50YSBvZiB0aGlzIGFtb3VudCAqLwotI2RlZmluZSBERUZBVUxUX0JVRkZFUlNJWkUgODE5MgotCi0vKiBTZXQgYSB0ZGF0YSBmaWVsZC4gIENhbid0IHVzZSB0aGUgb3RoZXIgbWFjcm9zIGZvciB0aGlzLCBzaW5jZSB0aGV5Ci0gICBkbyBjYXN0cywgYW5kIGNhc3RpbmcgdG8gdGhlIGxlZnQgb2YgYXNzaWdubWVudCBpc24ndCBwb3J0YWJsZS4gICovCi0jZGVmaW5lIHNldF90ZGF0YShiZmQsIHYpICgoYmZkKS0+dGRhdGEuYW55ID0gKFBUUikgKHYpKQotCi0vKiBJZiBCRkRfSU5fTUVNT1JZIGlzIHNldCBmb3IgYSBCRkQsIHRoZW4gdGhlIGlvc3RyZWFtIGZpZWxkcyBwb2ludHMKLSAgIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGJmZF9pbl9tZW1vcnkKLXsKLSAgLyogU2l6ZSBvZiBidWZmZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIEJ1ZmZlciBob2xkaW5nIGNvbnRlbnRzIG9mIEJGRC4gICovCi0gIGJmZF9ieXRlICpidWZmZXI7Ci19OwotCi0vKiB0ZGF0YSBmb3IgYW4gYXJjaGl2ZS4gIEZvciBhbiBpbnB1dCBhcmNoaXZlLCBjYWNoZQotICAgbmVlZHMgdG8gYmUgZnJlZSgpJ2QuICBGb3IgYW4gb3V0cHV0IGFyY2hpdmUsIHN5bWRlZnMgZG8uICAqLwotCi1zdHJ1Y3QgYXJ0ZGF0YSB7Ci0gIGZpbGVfcHRyIGZpcnN0X2ZpbGVfZmlsZXBvczsKLSAgLyogU3BlZWQgdXAgc2VhcmNoaW5nIHRoZSBhcm1hcCAqLwotICBzdHJ1Y3QgYXJfY2FjaGUgKmNhY2hlOwotICBiZmQgKmFyY2hpdmVfaGVhZDsgICAgICAgICAgICAvKiBPbmx5IGludGVyZXN0aW5nIGluIG91dHB1dCByb3V0aW5lcyAqLwotICBjYXJzeW0gKnN5bWRlZnM7CQkvKiB0aGUgc3ltZGVmIGVudHJpZXMgKi8KLSAgc3ltaW5kZXggc3ltZGVmX2NvdW50OyAgICAgICAgICAgICAvKiBob3cgbWFueSB0aGVyZSBhcmUgKi8KLSAgY2hhciAqZXh0ZW5kZWRfbmFtZXM7CQkvKiBjbGV2ZXIgaW50ZWwgZXh0ZW5zaW9uICovCi0gIC8qIHdoZW4gbW9yZSBjb21waWxlcnMgYXJlIHN0YW5kYXJkIEMsIHRoaXMgY2FuIGJlIGEgdGltZV90ICovCi0gIGxvbmcgIGFybWFwX3RpbWVzdGFtcDsJLyogVGltZXN0YW1wIHZhbHVlIHdyaXR0ZW4gaW50byBhcm1hcC4KLQkJCQkgICBUaGlzIGlzIHVzZWQgZm9yIEJTRCBhcmNoaXZlcyB0byBjaGVjawotCQkJCSAgIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyByZWNlbnQgZW5vdWdoCi0JCQkJICAgZm9yIHRoZSBCU0QgbGlua2VyIHRvIG5vdCBjb21wbGFpbiwKLQkJCQkgICBqdXN0IGJlZm9yZSB3ZSBmaW5pc2ggd3JpdGluZyBhbgotCQkJCSAgIGFyY2hpdmUuICAqLwotICBmaWxlX3B0ciBhcm1hcF9kYXRlcG9zOwkvKiBQb3NpdGlvbiB3aXRoaW4gYXJjaGl2ZSB0byBzZWVrIHRvCi0JCQkJICAgcmV3cml0ZSB0aGUgZGF0ZSBmaWVsZC4gICovCi0gIFBUUiB0ZGF0YTsJCQkvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLX07Ci0KLSNkZWZpbmUgYmZkX2FyZGF0YShiZmQpICgoYmZkKS0+dGRhdGEuYW91dF9hcl9kYXRhKQotCi0vKiBHb2VzIGluIGJmZCdzIGFyZWx0X2RhdGEgc2xvdCAqLwotc3RydWN0IGFyZWx0ZGF0YSB7Ci0gIGNoYXIgKiBhcmNoX2hlYWRlcjsJCQkgICAgIC8qIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcgKi8KLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOyAgICAgLyogb2N0ZXRzIG9mIGZpbGVzaXplIG5vdCBpbmNsdWRpbmcgYXJfaGRyICovCi0gIGNoYXIgKmZpbGVuYW1lOwkJCSAgICAgLyogbnVsbC10ZXJtaW5hdGVkICovCi19OwotCi0jZGVmaW5lIGFyZWx0X3NpemUoYmZkKSAoKChzdHJ1Y3QgYXJlbHRkYXRhICopKChiZmQpLT5hcmVsdF9kYXRhKSktPnBhcnNlZF9zaXplKQotCi1leHRlcm4gUFRSIGJmZF9tYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF9yZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1leHRlcm4gYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBfYmZkX2Vycm9yX2hhbmRsZXI7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIGFuZCBmcmVlIHRoaW5ncyBvbiB0aGUgQkZEJ3Mgb2JqYWxsb2MuICAqLwotCi1leHRlcm4gUFRSIGJmZF9hbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96YWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgYmZkX3JlbGVhc2UgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1iZmQgKglfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgUEFSQU1TICgoYmZkICpvYmZkKSk7Ci1iZmQgKglfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSBQQVJBTVMgKChiZmQgKmFyY2hfYmZkLCBmaWxlX3B0ciBpbmRleCkpOwotYm9vbGVhbiBfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZCAqKSk7Ci1ib29sZWFuCV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpiZmRfZ2VuZXJpY19hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuCWJmZF9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gYmZkX3NsdXJwX2JzZF9hcm1hcF9mMiBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgYmZkX3NsdXJwX2JzZF9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLSNkZWZpbmUgYmZkX3NsdXJwX2NvZmZfYXJtYXAgYmZkX3NsdXJwX2FybWFwCi1ib29sZWFuCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKikpOwotYm9vbGVhbglfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCBlbGVuZ3RoKSk7Ci1iZmQgKl9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwgZmlsZV9wdHIgZmlsZXBvcykpOwotZXh0ZXJuIGJmZCAqX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci1iZmQgKiBfYmZkX25ld19iZmQgUEFSQU1TICgodm9pZCkpOwotCi1ib29sZWFuCWJmZF9mYWxzZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotYm9vbGVhbgliZmRfdHJ1ZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotUFRSCWJmZF9udWxsdm9pZHB0ciBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotaW50CWJmZF8wIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci11bnNpZ25lZCBpbnQJYmZkXzB1IFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCWJmZF8wbCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotbG9uZwlfYmZkX24xIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci12b2lkCWJmZF92b2lkIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci0KLWJmZCAqX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiBQQVJBTVMgKChiZmQgKikpOwotY29uc3QgYmZkX3RhcmdldCAqX2JmZF9kdW1teV90YXJnZXQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQJYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfYnNkX3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLXZvaWQJYmZkX2dudV90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci0KLWJvb2xlYW4JYnNkX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotYm9vbGVhbgljb2ZmX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLWJmZCAqCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2hpdmUsCi0JCQkJCQkgICAgIGJmZCAqbGFzdF9maWxlKSk7Ci0KLWludAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLSNkZWZpbmUgX2JmZF9yZWFkX2FyX2hkcihhYmZkKSBcCi0gIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlYWRfYXJfaGRyX2ZuLCAoYWJmZCkpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfR0VORVJJQy4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF93aW5kb3cgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUFkuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkICosIGFzeW1ib2wgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSKSkpIGJmZF90cnVlKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUkUgd2hlbiB0aGVyZSBpcyBubyBjb3JlIGZpbGUKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLiAgKi8KLQotZXh0ZXJuIGNoYXIgKl9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB3aGVuIHRoZXJlIGlzIG5vIGFyY2hpdmUKLSAgIGZpbGUgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2FybWFwIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3RydW5jYXRlX2FybmFtZSBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV93cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9yZWFkX2FyX2hkciBiZmRfbnVsbHZvaWRwdHIKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4IFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF9mYWxzZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IEJTRCBzdHlsZQotICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCkuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3RydW5jYXRlX2FybmFtZSBiZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3dyaXRlX2FybWFwIGJzZF93cml0ZV9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgUEFSQU1TICgoYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBDT0ZGIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZikuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2FybWFwIGJmZF9zbHVycF9jb2ZmX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl93cml0ZV9hcm1hcCBjb2ZmX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIHdoZXJlIHRoZXJlIGlzIG5vIHN5bWJvbAotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19tYWtlX2VtcHR5X3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8gXAotICAoKGFsZW50ICooKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosIFwKLQkgICAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIFBUUiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyB3aGVuIHRoZXJlIGlzIG5vIHJlbG9jCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotICAoKHJlbG9jX2hvd3RvX3R5cGUgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURSBmb3IgdGFyZ2V0cyB3aGljaCBtYXkgbm90Ci0gICBiZSB3cml0dGVuLiAgVXNlIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX25vd3JpdGUpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X2FyY2hfbWFjaCBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfc2VjdGlvbl9jb250ZW50cyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKSkgXAotICAgYmZkX2ZhbHNlKQotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9MSU5LIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgc3VwcG9ydCBsaW5raW5nLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMgKChpbnQgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSkpIGJmZF8wKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChiZmRfYnl0ZSAqKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosIFwKLQkgICAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfcmVsYXhfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfYWRkX3N5bWJvbHMgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2ZpbmFsX2xpbmsgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfZmFsc2UpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKLSAgIGhhdmUgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDCi0gICAoX2JmZF9ub2R5bmFtaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmUgdG8gZGV0ZXJtaW5lIG9mIHRoZSBnaXZlbiBzeW1ib2wgaXMgYSBsb2NhbAotICAgbGFiZWwuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEdlbmVyaWMgbWluaXN5bWJvbCByb3V0aW5lcy4gICovCi1leHRlcm4gbG9uZyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGFzZWN0aW9uICosIGJmZF92bWEsIGJvb2xlYW4gKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgUFRSICopKTsKLQotLyogRmluZCB0aGUgbmVhZGVyc3QgbGluZSB1c2luZyBEV0FSRiAxIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgRFdBUkYgMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCkpOwotCi0vKiBBIHJvdXRpbmUgdG8gY3JlYXRlIGVudHJpZXMgZm9yIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksCi0JICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZSwKLQkgICBjb25zdCBjaGFyICpzdHJpbmcpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGJmZF9saW5rX2hhc2hfdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIEdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGNyZWF0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBHZW5lcmljIGFkZCBzeW1ib2wgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFkZCBzeW1ib2wgcm91dGluZS4gIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGJ5IHRhcmdldHMgZm9yCi0gICB3aGljaCB0aGUgbGlua2VyIG11c3QgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGJ5IG5hbWUsCi0gICBhcyB0aGUgY29sbGVjdDIgcHJvZ3JhbSBkb2VzLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogR2VuZXJpYyBhcmNoaXZlIGFkZCBzeW1ib2wgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIGJvb2xlYW4gKCpjaGVja2ZuKSAoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKTsKLQotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gYXZvaWQgcHJvdG90eXBlIGVycm9ycy4gICovCi10eXBlZGVmIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IF9iZmRfbGlua19oYXNoX2VudHJ5OwotCi0vKiBHZW5lcmljIHJvdXRpbmUgdG8gYWRkIGEgc2luZ2xlIHN5bWJvbC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqbmFtZSwgZmxhZ3dvcmQsCi0JICAgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuIGNvcHksCi0JICAgYm9vbGVhbiBjb25zdHJ1Y3Rvciwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotLyogR2VuZXJpYyBsaW5rIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSk7Ci0KLS8qIEdlbmVyaWMgcmVsb2NfbGlua19vcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRGVmYXVsdCBsaW5rIG9yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2RlZmF1bHRfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlbG9jIGVudHJpZXMgaW4gYSBsaW5rIG9yZGVyIGxpc3QuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIEZpbmFsIGxpbmsgcmVsb2NhdGlvbiByb3V0aW5lLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgYmZkX3ZtYSBhZGRyZXNzLCBiZmRfdm1hIHZhbHVlLCBiZmRfdm1hIGFkZGVuZCkpOwotCi0vKiBSZWxvY2F0ZSBhIHBhcnRpY3VsYXIgbG9jYXRpb24gYnkgYSBob3d0byBhbmQgYSB2YWx1ZS4gICovCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfcmVsb2NhdGVfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi0vKiBMaW5rIHN0YWJzIGluIHNlY3Rpb25zIGluIHRoZSBmaXJzdCBwYXNzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBhc2VjdGlvbiAqLCBQVFIgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFiIHNlY3Rpb24gd2hlbiBsaW5raW5nIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF9ieXRlICopKTsKLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYnN0ciBzdHJpbmcgdGFibGUgd2hlbiBsaW5raW5nIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIFBUUiAqKSk7Ci0KLS8qIEZpbmQgYW4gb2Zmc2V0IHdpdGhpbiBhIC5zdGFiIHNlY3Rpb24gd2hlbiBsaW5raW5nIHN0YWJzIGluCi0gICBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBiZmRfdm1hIF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIFBUUiAqLCBiZmRfdm1hKSk7Ci0KLS8qIENyZWF0ZSBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIENyZWF0ZSBhbiBYQ09GRiAuZGVidWcgc2VjdGlvbiBzdHlsZSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGcmVlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIF9iZmRfc3RyaW5ndGFiX2ZyZWUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9zaXplIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBBZGQgYSBzdHJpbmcgdG8gYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgX2JmZF9zdHJpbmd0YWJfYWRkCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGhhc2gsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFdyaXRlIG91dCBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0cmluZ3RhYl9lbWl0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogQ2hlY2sgdGhhdCBlbmRpYW5uZXNzIG9mIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBtYXRjaC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQwKLS8qIE1hY3JvcyB0byB0ZWxsIGlmIGJmZHMgYXJlIHJlYWQgb3Igd3JpdGUgZW5hYmxlZC4KLQotICAgTm90ZSB0aGF0IGJmZHMgb3BlbiBmb3IgcmVhZCBtYXkgYmUgc2NyaWJibGVkIGludG8gaWYgdGhlIGZkIHBhc3NlZAotICAgdG8gYmZkX2Zkb3BlbnIgaXMgYWN0dWFsbHkgb3BlbiBib3RoIGZvciByZWFkIGFuZCB3cml0ZQotICAgc2ltdWx0YW5lb3VzbHkuICBIb3dldmVyIGFuIG91dHB1dCBiZmQgd2lsbCBuZXZlciBiZSBvcGVuIGZvcgotICAgcmVhZC4gIFRoZXJlZm9yZSBzb21ldGltZXMgeW91IHdhbnQgdG8gY2hlY2sgYmZkX3JlYWRfcCBvcgotICAgIWJmZF9yZWFkX3AsIGFuZCBvbmx5IHNvbWV0aW1lcyBiZmRfd3JpdGVfcC4KLSovCi0KLSNkZWZpbmUJYmZkX3JlYWRfcChhYmZkKSAoKGFiZmQpLT5kaXJlY3Rpb24gPT0gcmVhZF9kaXJlY3Rpb24gfHwgKGFiZmQpLT5kaXJlY3Rpb24gPT0gYm90aF9kaXJlY3Rpb24pCi0jZGVmaW5lCWJmZF93cml0ZV9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24gfHwgKGFiZmQpLT5kaXJlY3Rpb24gPT0gYm90aF9kaXJlY3Rpb24pCi0KLXZvaWQJYmZkX2Fzc2VydCBQQVJBTVMgKChjb25zdCBjaGFyKixpbnQpKTsKLQotI2RlZmluZSBCRkRfQVNTRVJUKHgpIFwKLXsgaWYgKCEoeCkpIGJmZF9hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9Ci0KLSNkZWZpbmUgQkZEX0ZBSUwoKSBcCi17IGJmZF9hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9Ci0KLWV4dGVybiB2b2lkIF9iZmRfYWJvcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpCi0gICAgIEFUVFJJQlVURV9OT1JFVFVSTjsKLQotLyogaWYgZ2NjLCB3ZSBjYW4gZ2l2ZSBhIGZ1bmN0aW9uIG5hbWUsIHRvbyAqLwotI2lmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgX19HTlVDX01JTk9SX18gPD0gNQotI2RlZmluZSBfX1BSRVRUWV9GVU5DVElPTl9fICAoKGNoYXIgKikgTlVMTCkKLSNlbmRpZgotCi0jdW5kZWYgYWJvcnQKLSNkZWZpbmUgYWJvcnQoKSBfYmZkX2Fib3J0IChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pCi0KLUZJTEUgKgliZmRfY2FjaGVfbG9va3VwX3dvcmtlciBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gYmZkICpiZmRfbGFzdF9jYWNoZTsKLQotLyogTGlzdCBvZiBzdXBwb3J0ZWQgdGFyZ2V0IHZlY3RvcnMsIGFuZCB0aGUgZGVmYXVsdCB2ZWN0b3IgKGlmCi0gICBiZmRfZGVmYXVsdF92ZWN0b3JbMF0gaXMgTlVMTCwgdGhlcmUgaXMgbm8gZGVmYXVsdCkuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCBiZmRfdGFyZ2V0X3ZlY3RvcltdOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9kZWZhdWx0X3ZlY3RvcltdOwotCi0vKiBGdW5jdGlvbnMgc2hhcmVkIGJ5IHRoZSBFQ09GRiBhbmQgTUlQUyBFTEYgYmFja2VuZHMsIHdoaWNoIGhhdmUgbm8KLSAgIG90aGVyIGNvbW1vbiBoZWFkZXIgZmlsZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9maW5kX2xpbmU7Ci0jZW5kaWYKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9sb2NhdGVfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LCBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICosCi0JICAgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotCi1leHRlcm4gYmZkX3ZtYSBfYmZkX2dldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLQotLyogRnVuY3Rpb24gc2hhcmVkIGJ5IHRoZSBDT0ZGIGFuZCBFTEYgU0ggYmFja2VuZHMsIHdoaWNoIGhhdmUgbm8KLSAgIG90aGVyIGNvbW1vbiBoZWFkZXIgZmlsZXMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3NoX2FsaWduX2xvYWRfc3BhbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBib29sZWFuICgqKSAoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSksCi0JICAgUFRSLCBiZmRfdm1hICoqLCBiZmRfdm1hICosIGJmZF92bWEsIGJmZF92bWEsIGJvb2xlYW4gKikpOwotCi0vKiBBbmQgbW9yZSBmb2xsb3dzICovCi0KLXZvaWQgCi1iZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCBQQVJBTVMgKChiZmQgKmFiZmQsICBpbnQgaSkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfbG9nMiBQQVJBTVMgKChiZmRfdm1hIHgpKTsKLQotI2RlZmluZSBCRkRfQ0FDSEVfTUFYX09QRU4gMTAKLWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0jZGVmaW5lIGJmZF9jYWNoZV9sb29rdXAoeCkgXAotICAgICgoeCk9PWJmZF9sYXN0X2NhY2hlPyBcCi0gICAgICAoRklMRSopKGJmZF9sYXN0X2NhY2hlLT5pb3N0cmVhbSk6IFwKLSAgICAgICBiZmRfY2FjaGVfbG9va3VwX3dvcmtlcih4KSkKLWJvb2xlYW4gCi1iZmRfY2FjaGVfaW5pdCAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2FjaGVfY2xvc2UgIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1GSUxFKiAKLWJmZF9vcGVuX2ZpbGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLUZJTEUgKgotYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNpZmRlZiBfQkZEX01BS0VfVEFCTEVfYmZkX3JlbG9jX2NvZGVfcmVhbAotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lc1tdID0geyAiQEB1bmluaXRpYWxpemVkQEAiLAotCi0gICJCRkRfUkVMT0NfNjQiLAotICAiQkZEX1JFTE9DXzMyIiwKLSAgIkJGRF9SRUxPQ18yNiIsCi0gICJCRkRfUkVMT0NfMjQiLAotICAiQkZEX1JFTE9DXzE2IiwKLSAgIkJGRF9SRUxPQ18xNCIsCi0gICJCRkRfUkVMT0NfOCIsCi0gICJCRkRfUkVMT0NfNjRfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18yNF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DXzEyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ184X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18zMl9HT1RfUENSRUwiLAotICAiQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfOF9HT1RfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfMTZfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19MTzE2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9HT1RPRkYiLAotICAiQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYiLAotICAiQkZEX1JFTE9DXzhfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ18zMl9QTFRfUENSRUwiLAotICAiQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTZfUExUX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ184X1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMzJfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ18xNl9QTFRPRkYiLAotICAiQkZEX1JFTE9DX0xPMTZfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfOF9QTFRPRkYiLAotICAiQkZEX1JFTE9DXzY4S19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfNjhLX0pNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ182OEtfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DXzMyX0JBU0VSRUwiLAotICAiQkZEX1JFTE9DXzE2X0JBU0VSRUwiLAotICAiQkZEX1JFTE9DX0xPMTZfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfSEkxNl9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfOF9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19SVkEiLAotICAiQkZEX1JFTE9DXzhfRkZubiIsCi0gICJCRkRfUkVMT0NfMzJfUENSRUxfUzIiLAotICAiQkZEX1JFTE9DXzE2X1BDUkVMX1MyIiwKLSAgIkJGRF9SRUxPQ18yM19QQ1JFTF9TMiIsCi0gICJCRkRfUkVMT0NfSEkyMiIsCi0gICJCRkRfUkVMT0NfTE8xMCIsCi0gICJCRkRfUkVMT0NfR1BSRUwxNiIsCi0gICJCRkRfUkVMT0NfR1BSRUwzMiIsCi0gICJCRkRfUkVMT0NfSTk2MF9DQUxMSiIsCi0gICJCRkRfUkVMT0NfTk9ORSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkMyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkMxMyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfR09UMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0dPVDEzIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HT1QyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUEMxMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUEMyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV1BMVDMwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19DT1BZIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QiLAotICAiQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19VQTMyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19CQVNFMTMiLAotICAiQkZEX1JFTE9DX1NQQVJDX0JBU0UyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDXzExIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19PTE8xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSEgyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSE0xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfTE0yMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUENfSE0xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUENfTE0yMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfNyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfNiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfNSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUExUNjQiLAotICAiQkZEX1JFTE9DX1NQQVJDX0hJWDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19MT1gxMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSDQ0IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19NNDQiLAotICAiQkZEX1JFTE9DX1NQQVJDX0w0NCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1JFVjMyIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTYiLAotICAiQkZEX1JFTE9DX0FMUEhBX0dQRElTUCIsCi0gICJCRkRfUkVMT0NfQUxQSEFfTElURVJBTCIsCi0gICJCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FMUEhBX0xJVFVTRSIsCi0gICJCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYiLAotICAiQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AiLAotICAiQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdIIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9ISU5UIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUiIsCi0gICJCRkRfUkVMT0NfTUlQU19KTVAiLAotICAiQkZEX1JFTE9DX01JUFMxNl9KTVAiLAotICAiQkZEX1JFTE9DX01JUFMxNl9HUFJFTCIsCi0gICJCRkRfUkVMT0NfSEkxNiIsCi0gICJCRkRfUkVMT0NfSEkxNl9TIiwKLSAgIkJGRF9SRUxPQ19MTzE2IiwKLSAgIkJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MiLAotICAiQkZEX1JFTE9DX1BDUkVMX0xPMTYiLAotICAiQkZEX1JFTE9DX01JUFNfTElURVJBTCIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1QxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19DQUxMMTYiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0hJMTYiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0xPMTYiLAotICAiQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2IiwKLSAgIkJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19TVUIiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX1BBR0UiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX09GU1QiLAotICAiQkZEX1JFTE9DX01JUFNfR09UX0RJU1AiLAotCi0gICJCRkRfUkVMT0NfMzg2X0dPVDMyIiwKLSAgIkJGRF9SRUxPQ18zODZfUExUMzIiLAotICAiQkZEX1JFTE9DXzM4Nl9DT1BZIiwKLSAgIkJGRF9SRUxPQ18zODZfR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QiLAotICAiQkZEX1JFTE9DXzM4Nl9SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfMzg2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfMzg2X0dPVFBDIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fOCIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzE2IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMzIiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF84IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzE2IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzMyIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX1BKX0NPREVfSEkxNiIsCi0gICJCRkRfUkVMT0NfUEpfQ09ERV9MTzE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX0RJUjE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyIiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX1JFTDE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX1JFTDMyIiwKLSAgIkJGRF9SRUxPQ19QUENfQjI2IiwKLSAgIkJGRF9SRUxPQ19QUENfQkEyNiIsCi0gICJCRkRfUkVMT0NfUFBDX1RPQzE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQjE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CQTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOIiwKLSAgIkJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTiIsCi0gICJCRkRfUkVMT0NfUFBDX0NPUFkiLAotICAiQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfUFBDX0pNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ19QUENfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8iLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBIiwKLSAgIkJGRF9SRUxPQ19JMzcwX0QxMiIsCi0gICJCRkRfUkVMT0NfQ1RPUiIsCi0gICJCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCIsCi0gICJCRkRfUkVMT0NfQVJNX0lNTUVESUFURSIsCi0gICJCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFIiwKLSAgIkJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX1NISUZUX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX1NXSSIsCi0gICJCRkRfUkVMT0NfQVJNX01VTFRJIiwKLSAgIkJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX0FEUl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9MRFJfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fTElURVJBTCIsCi0gICJCRkRfUkVMT0NfQVJNX0lOX1BPT0wiLAotICAiQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOCIsCi0gICJCRkRfUkVMT0NfQVJNX0hXTElURVJBTCIsCi0gICJCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCIsCi0gICJCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUIiwKLSAgIkJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UMTIiLAotICAiQkZEX1JFTE9DX0FSTV9HT1QzMiIsCi0gICJCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVCIsCi0gICJCRkRfUkVMT0NfQVJNX0NPUFkiLAotICAiQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfQVJNX1BMVDMyIiwKLSAgIkJGRF9SRUxPQ19BUk1fUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DX0FSTV9HT1RPRkYiLAotICAiQkZEX1JFTE9DX0FSTV9HT1RQQyIsCi0gICJCRkRfUkVMT0NfU0hfUENESVNQOEJZMiIsCi0gICJCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIiLAotICAiQkZEX1JFTE9DX1NIX0lNTTQiLAotICAiQkZEX1JFTE9DX1NIX0lNTTRCWTIiLAotICAiQkZEX1JFTE9DX1NIX0lNTTRCWTQiLAotICAiQkZEX1JFTE9DX1NIX0lNTTgiLAotICAiQkZEX1JFTE9DX1NIX0lNTThCWTIiLAotICAiQkZEX1JFTE9DX1NIX0lNTThCWTQiLAotICAiQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiIsCi0gICJCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0IiwKLSAgIkJGRF9SRUxPQ19TSF9TV0lUQ0gxNiIsCi0gICJCRkRfUkVMT0NfU0hfU1dJVENIMzIiLAotICAiQkZEX1JFTE9DX1NIX1VTRVMiLAotICAiQkZEX1JFTE9DX1NIX0NPVU5UIiwKLSAgIkJGRF9SRUxPQ19TSF9BTElHTiIsCi0gICJCRkRfUkVMT0NfU0hfQ09ERSIsCi0gICJCRkRfUkVMT0NfU0hfREFUQSIsCi0gICJCRkRfUkVMT0NfU0hfTEFCRUwiLAotICAiQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDkiLAotICAiQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyIiwKLSAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMyIsCi0gICJCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfQVJDX0IyNiIsCi0gICJCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wiLAotICAiQkZEX1JFTE9DX0QxMFZfMTgiLAotICAiQkZEX1JFTE9DX0QxMFZfMThfUENSRUwiLAotICAiQkZEX1JFTE9DX0QzMFZfNiIsCi0gICJCRkRfUkVMT0NfRDMwVl85X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDMwVl8xNSIsCi0gICJCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzIxIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IiLAotICAiQkZEX1JFTE9DX0QzMFZfMzIiLAotICAiQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfMjQiLAotICAiQkZEX1JFTE9DX00zMlJfMTBfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfMThfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfMjZfUENSRUwiLAotICAiQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8iLAotICAiQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8iLAotICAiQkZEX1JFTE9DX00zMlJfTE8xNiIsCi0gICJCRkRfUkVMT0NfTTMyUl9TREExNiIsCi0gICJCRkRfUkVMT0NfVjg1MF85X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19WODUwXzIyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQiLAotCi0gICJCRkRfUkVMT0NfTU4xMDMwMF8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfVElDMzBfTERQIiwKLSAgIkJGRF9SRUxPQ19GUjMwXzQ4IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzIwIiwKLSAgIkJGRF9SRUxPQ19GUjMwXzZfSU5fNCIsCi0gICJCRkRfUkVMT0NfRlIzMF84X0lOXzgiLAotICAiQkZEX1JFTE9DX0ZSMzBfOV9JTl84IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzEwX0lOXzgiLAotICAiQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIiLAotICAiQkZEX1JFTE9DX01DT1JFX1JWQSIsCi0gICJCRkRfUkVMT0NfQVZSXzdfUENSRUwiLAotICAiQkZEX1JFTE9DX0FWUl8xM19QQ1JFTCIsCi0gICJCRkRfUkVMT0NfQVZSXzE2X1BNIiwKLSAgIkJGRF9SRUxPQ19BVlJfTE84X0xESSIsCi0gICJCRkRfUkVMT0NfQVZSX0hJOF9MREkiLAotICAiQkZEX1JFTE9DX0FWUl9ISDhfTERJIiwKLSAgIkJGRF9SRUxPQ19BVlJfTE84X0xESV9ORUciLAotICAiQkZEX1JFTE9DX0FWUl9ISThfTERJX05FRyIsCi0gICJCRkRfUkVMT0NfQVZSX0hIOF9MRElfTkVHIiwKLSAgIkJGRF9SRUxPQ19BVlJfTE84X0xESV9QTSIsCi0gICJCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE0iLAotICAiQkZEX1JFTE9DX0FWUl9ISDhfTERJX1BNIiwKLSAgIkJGRF9SRUxPQ19BVlJfTE84X0xESV9QTV9ORUciLAotICAiQkZEX1JFTE9DX0FWUl9ISThfTERJX1BNX05FRyIsCi0gICJCRkRfUkVMT0NfQVZSX0hIOF9MRElfUE1fTkVHIiwKLSAgIkJGRF9SRUxPQ19BVlJfQ0FMTCIsCi0gICJCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQiLAotICAiQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSIsCi0gIkBAb3ZlcmZsb3c6IEJGRF9SRUxPQ19VTlVTRURAQCIsCi19OwotI2VuZGlmCi0KLXJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLSBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgY29kZSkpOwotCi1ib29sZWFuIAotYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotICAgIGJvb2xlYW4gKikpOwotCi1ib29sZWFuIAotYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1iZmRfYnl0ZSAqCi0KLWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAgUEFSQU1TICgoYmZkICphYmZkLAotICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0gICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAotICAgIGJmZF9ieXRlICpkYXRhLAotICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotICAgIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci0KLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci1ib29sZWFuIAotYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0gICAgdW5zaWduZWQgbG9uZyBtYWNoKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfZGVmYXVsdF9jb21wYXRpYmxlCi0gUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphLAotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYikpOwotCi1ib29sZWFuIAotYmZkX2RlZmF1bHRfc2NhbiBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLXN0cnVjdCBlbGZfaW50ZXJuYWxfc2hkciAqCi1iZmRfZWxmX2ZpbmRfc2VjdGlvbiAgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICpuYW1lKSk7Ci0KZGlmZiAtLWdpdCBhL2JmZC9saWJjb2ZmLWluLmggYi9iZmQvbGliY29mZi1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjFhMDI2Li4wMDAwMDAwCi0tLSBhL2JmZC9saWJjb2ZmLWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyogQkZEIENPRkYgb2JqZWN0IGZpbGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBsaWJjb2ZmLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJjb2ZmLWluLmggb3IgY29mZmNvZGUuaC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiBPYmplY3QgZmlsZSB0ZGF0YTsgYWNjZXNzIG1hY3JvcyAqLwotCi0jZGVmaW5lIGNvZmZfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLmNvZmZfb2JqX2RhdGEpCi0jZGVmaW5lIGV4ZWNfaGRyKGJmZCkJCShjb2ZmX2RhdGEoYmZkKS0+aGRyKQotI2RlZmluZSBvYmpfcGUoYmZkKSAgICAgICAgICAgICAoY29mZl9kYXRhKGJmZCktPnBlKQotI2RlZmluZSBvYmpfc3ltYm9scyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+c3ltYm9scykKLSNkZWZpbmUJb2JqX3N5bV9maWxlcG9zKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1fZmlsZXBvcykKLQotI2RlZmluZSBvYmpfcmVsb2NiYXNlKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yZWxvY2Jhc2UpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50cyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmF3X3N5bWVudHMpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50X2NvdW50KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50X2NvdW50KQotI2RlZmluZSBvYmpfY29udmVydChiZmQpCShjb2ZmX2RhdGEoYmZkKS0+Y29udmVyc2lvbl90YWJsZSkKLSNkZWZpbmUgb2JqX2NvbnZfdGFibGVfc2l6ZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+Y29udl90YWJsZV9zaXplKQotCi0jZGVmaW5lIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5leHRlcm5hbF9zeW1zKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N5bXMoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX3N0cmluZ3MoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5zdHJpbmdzKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N0cmluZ3MoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX3N5bV9oYXNoZXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5zeW1faGFzaGVzKQotCi0jZGVmaW5lIG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+bG9jYWxfdG9jX3N5bV9tYXApCi0KLS8qIGBUZGF0YScgaW5mb3JtYXRpb24ga2VwdCBmb3IgQ09GRiBmaWxlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfdGRhdGEKLXsKLSAgc3RydWN0ICAgY29mZl9zeW1ib2xfc3RydWN0ICpzeW1ib2xzOwkvKiBzeW10YWIgZm9yIGlucHV0IGJmZCAqLwotICB1bnNpZ25lZCBpbnQgKmNvbnZlcnNpb25fdGFibGU7Ci0gIGludCBjb252X3RhYmxlX3NpemU7Ci0gIGZpbGVfcHRyIHN5bV9maWxlcG9zOwotCi0gIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnJhd19zeW1lbnRzOwotICB1bnNpZ25lZCBsb25nIHJhd19zeW1lbnRfY291bnQ7Ci0KLSAgLyogVGhlc2UgYXJlIG9ubHkgdmFsaWQgb25jZSB3cml0aW5nIGhhcyBiZWd1biAqLwotICBsb25nIGludCByZWxvY2Jhc2U7Ci0KLSAgLyogVGhlc2UgbWVtYmVycyBjb21tdW5pY2F0ZSBpbXBvcnRhbnQgY29uc3RhbnRzIGFib3V0IHRoZSBzeW1ib2wgdGFibGUKLSAgICAgdG8gR0RCJ3Mgc3ltYm9sLXJlYWRpbmcgY29kZS4gIFRoZXNlIGBjb25zdGFudHMnIHVuZm9ydHVuYXRlbHkgdmFyeQotICAgICBmcm9tIGNvZmYgaW1wbGVtZW50YXRpb24gdG8gaW1wbGVtZW50YXRpb24uLi4gICovCi0gIHVuc2lnbmVkIGxvY2FsX25fYnRtYXNrOwotICB1bnNpZ25lZCBsb2NhbF9uX2J0c2hmdDsKLSAgdW5zaWduZWQgbG9jYWxfbl90bWFzazsKLSAgdW5zaWduZWQgbG9jYWxfbl90c2hpZnQ7Ci0gIHVuc2lnbmVkIGxvY2FsX3N5bWVzejsKLSAgdW5zaWduZWQgbG9jYWxfYXV4ZXN6OwotICB1bnNpZ25lZCBsb2NhbF9saW5lc3o7Ci0KLSAgLyogVGhlIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2xzLiAgTWF5IGJlIE5VTEwuICBSZWFkIGJ5Ci0gICAgIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scy4gICovCi0gIFBUUiBleHRlcm5hbF9zeW1zOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBleHRlcm5hbF9zeW1zIG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfc3ltczsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlLiAgTWF5IGJlIE5VTEwuICBSZWFkIGJ5Ci0gICAgIF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZS4gICovCi0gIGNoYXIgKnN0cmluZ3M7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIHN0cmluZ3MgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9zdHJpbmdzOwotCi0gIC8qIGlzIHRoaXMgYSBQRSBmb3JtYXQgY29mZiBmaWxlICovCi0gIGludCBwZTsKLSAgLyogVXNlZCBieSB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0KLSAgLyogdXNlZCBieSB0aGUgcGUgbGlua2VyIGZvciBQb3dlclBDICovCi0gIGludCAqbG9jYWxfdG9jX3N5bV9tYXA7Ci0KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLQotICAvKiBVc2VkIGJ5IGNvZmZfZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBQVFIgbGluZV9pbmZvOwotCi0gIC8qIFRoZSB0aW1lc3RhbXAgZnJvbSB0aGUgQ09GRiBmaWxlIGhlYWRlci4gICovCi0gIGxvbmcgdGltZXN0YW1wOwotCi0gIC8qIENvcHkgb2Ygc29tZSBvZiB0aGUgZl9mbGFncyBiaXRzIGluIHRoZSBDT0ZGIGZpbGVoZHIgc3RydWN0dXJlLAotICAgICB1c2VkIGJ5IEFSTSBjb2RlLiAgKi8KLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLX0gY29mZl9kYXRhX3R5cGU7Ci0KLS8qIFRkYXRhIGZvciBwZSBpbWFnZSBmaWxlcy4gKi8KLXR5cGVkZWYgc3RydWN0IHBlX3RkYXRhCi17Ci0gIGNvZmZfZGF0YV90eXBlIGNvZmY7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlX29wdGhkcjsKLSAgaW50IGRsbDsKLSAgaW50IGhhc19yZWxvY19zZWN0aW9uOwotICBib29sZWFuICgqaW5fcmVsb2NfcCkgUEFSQU1TKChiZmQgKiwgcmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0gIGZsYWd3b3JkIHJlYWxfZmxhZ3M7Ci19IHBlX2RhdGFfdHlwZTsKLQotI2RlZmluZSBwZV9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEucGVfb2JqX2RhdGEpCi0KLS8qIFRkYXRhIGZvciBYQ09GRiBmaWxlcy4gICovCi0KLXN0cnVjdCB4Y29mZl90ZGF0YQotewotICAvKiBCYXNpYyBDT0ZGIGluZm9ybWF0aW9uLiAgKi8KLSAgY29mZl9kYXRhX3R5cGUgY29mZjsKLQotICAvKiBUcnVlIGlmIGEgbGFyZ2UgYS5vdXQgaGVhZGVyIHNob3VsZCBiZSBnZW5lcmF0ZWQuICAqLwotICBib29sZWFuIGZ1bGxfYW91dGhkcjsKLQotICAvKiBUT0MgdmFsdWUuICAqLwotICBiZmRfdm1hIHRvYzsKLQotICAvKiBJbmRleCBvZiBzZWN0aW9uIGhvbGRpbmcgVE9DLiAgKi8KLSAgaW50IHNudG9jOwotCi0gIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBlbnRyeSBwb2ludC4gICovCi0gIGludCBzbmVudHJ5OwotCi0gIC8qIC50ZXh0IGFsaWdubWVudCBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGludCB0ZXh0X2FsaWduX3Bvd2VyOwotCi0gIC8qIC5kYXRhIGFsaWdubWVudCBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGludCBkYXRhX2FsaWduX3Bvd2VyOwotCi0gIC8qIG1vZHR5cGUgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBzaG9ydCBtb2R0eXBlOwotCi0gIC8qIGNwdXR5cGUgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBzaG9ydCBjcHV0eXBlOwotCi0gIC8qIG1heGRhdGEgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIG1heGRhdGE7Ci0KLSAgLyogbWF4c3RhY2sgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIG1heHN0YWNrOwotCi0gIC8qIFVzZWQgYnkgdGhlIFhDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgYXNlY3Rpb24gKipjc2VjdHM7Ci0gIHVuc2lnbmVkIGxvbmcgKmRlYnVnX2luZGljZXM7Ci0gIHVuc2lnbmVkIGludCBpbXBvcnRfZmlsZV9pZDsKLX07Ci0KLSNkZWZpbmUgeGNvZmZfZGF0YShhYmZkKSAoKGFiZmQpLT50ZGF0YS54Y29mZl9vYmpfZGF0YSkKLQotLyogV2UgdGFrZSB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCi0gKiBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sLiAgKi8KLSNkZWZpbmUgY29mZnN5bWJvbChhc3ltYm9sKSAoKGNvZmZfc3ltYm9sX3R5cGUgKikoJigoYXN5bWJvbCktPnRoZV9iZmQpKSkKLQotLyogVGhlIHVzZWRfYnlfYmZkIGZpZWxkIG9mIGEgc2VjdGlvbiBtYXkgYmUgc2V0IHRvIGEgcG9pbnRlciB0byB0aGlzCi0gICBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFRoZSByZWxvY3MsIHN3YXBwZWQgaW50byBDT0ZGIGludGVybmFsIGZvcm0uICBUaGlzIG1heSBiZSBOVUxMLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIHJlbG9jcyBlbnRyeSBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3JlbG9jczsKLSAgLyogVGhlIHNlY3Rpb24gY29udGVudHMuICBUaGlzIG1heSBiZSBOVUxMLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBjb250ZW50cyBlbnRyeSBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX2NvbnRlbnRzOwotICAvKiBJbmZvcm1hdGlvbiBjYWNoZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIGJmZF92bWEgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgY29uc3QgY2hhciAqZnVuY3Rpb247Ci0gIGludCBsaW5lX2Jhc2U7Ci0gIC8qIEEgcG9pbnRlciB1c2VkIGZvciAuc3RhYiBsaW5raW5nIG9wdGltaXphdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotICAvKiBBdmFpbGFibGUgZm9yIGluZGl2aWR1YWwgYmFja2VuZHMuICAqLwotICBQVFIgdGRhdGE7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIGNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIChzZWMpLT51c2VkX2J5X2JmZCkKLQotLyogVGRhdGEgZm9yIHNlY3Rpb25zIGluIFhDT0ZGIGZpbGVzLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotCi1zdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBVc2VkIGZvciBYQ09GRiBjc2VjdHMgY3JlYXRlZCBieSB0aGUgbGlua2VyOyBwb2ludHMgdG8gdGhlIHJlYWwKLSAgICAgWENPRkYgc2VjdGlvbiB3aGljaCBjb250YWlucyB0aGlzIGNzZWN0LiAgKi8KLSAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLSAgLyogVGhlIGxpbmVub19jb3VudCBmaWVsZCBmb3IgdGhlIGVuY2xvc2luZyBzZWN0aW9uLCBiZWNhdXNlIHdlIGFyZQotICAgICBnb2luZyB0byBjbG9iYmVyIGl0IHRoZXJlLiAgKi8KLSAgdW5zaWduZWQgaW50IGxpbmVub19jb3VudDsKLSAgLyogVGhlIGZpcnN0IGFuZCBvbmUgcGFzdCB0aGUgbGFzdCBzeW1ib2wgaW5kaWNlcyBmb3Igc3ltYm9scyB1c2VkCi0gICAgIGJ5IHRoaXMgY3NlY3QuICAqLwotICB1bnNpZ25lZCBsb25nIGZpcnN0X3N5bW5keDsKLSAgdW5zaWduZWQgbG9uZyBsYXN0X3N5bW5keDsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIHRoZSB4Y29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHhjb2ZmX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSAqKSBjb2ZmX3NlY3Rpb25fZGF0YSAoKGFiZmQpLCAoc2VjKSktPnRkYXRhKQotCi0vKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gUEUgZmlsZXMuICAqLwotCi1zdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHZpcnR1YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgdmlydF9zaXplOwotICAvKiBUaGUgUEUgc2VjdGlvbiBmbGFncy4gICovCi0gIGxvbmcgcGVfZmxhZ3M7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIHBlaV9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHBlaV9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIFN5bWJvbCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdHlwZTsKLQotICAvKiBTeW1ib2wgY2xhc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGNsYXNzOwotCi0gIC8qIE51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcy4gICovCi0gIGNoYXIgbnVtYXV4OwotCi0gIC8qIEJGRCB0byB0YWtlIGF1eGlsaWFyeSBlbnRyaWVzIGZyb20uICAqLwotICBiZmQgKmF1eGJmZDsKLQotICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGF1eGlsaWFyeSBlbnRyaWVzLCBpZiBhbnkuICAqLwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eDsKLQotICAvKiBGbGFnIHdvcmQ7IGxlZ2FsIHZhbHVlcyBmb2xsb3cuICAqLwotICB1bnNpZ25lZCBzaG9ydCBjb2ZmX2xpbmtfaGFzaF9mbGFnczsKLSAgLyogU3ltYm9sIGlzIGEgUEUgc2VjdGlvbiBzeW1ib2wuICAqLwotI2RlZmluZSBDT0ZGX0xJTktfSEFTSF9QRV9TRUNUSU9OX1NZTUJPTCAoMDEpCi19OwotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3Qgc2VjICpjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggUEFSQU1TICgoYmZkICosIGludCkpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBpbnQgY29mZl9jb3VudF9saW5lbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKmNvZmZfc3ltYm9sX2Zyb20gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9yZW51bWJlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9tYW5nbGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl93cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYWxlbnQgKmNvZmZfZ2V0X2xpbmVubyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9zZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosCi0JCQkJICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLWV4dGVybiB2b2lkIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCSAgc3ltYm9sX2luZm8gKnJldCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBhc3ltYm9sICoqLAotCQkJCQkgICAgICAgYmZkX3ZtYSBvZmZzZXQsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyKSk7Ci1leHRlcm4gaW50IGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gcmVsb2MpKTsKLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1leHRlcm4gYmZkX2J5dGUgKmJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGJmZF92bWEgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgUEFSQU1TICgoYXJlbGVudCAqLAotCQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgIGFzZWN0aW9uICopKTsKLWV4dGVybiB2b2lkIGJmZF9wZXJmb3JtX3NsaXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgc2xpcCwKLQkJCQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfdm1hIHZhbCkpOwotCi0vKiBGdW5jdGlvbnMgYW5kIHR5cGVzIGluIGNvZmZsaW5rLmMuICAqLwotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gbWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCwgYW5kIHVuaW9uCi0gICBkZWZpbml0aW9ucyBpbiB0aGUgbGlua2VyLiAgKi8KLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgZWxlbWVudCAoYW4gZW51bSB2YWx1ZSwgYQotICAgc3RydWN0dXJlIG9yIHVuaW9uIGZpZWxkKSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQKLXsKLSAgLyogTmV4dCBlbGVtZW50LiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbmV4dDsKLQotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUeXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGZvciBjb21wbGV4IHR5cGUuICAqLwotICBsb25nIHRhZ25keDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgZGVidWcgbWVyZ2UgZW50cmllcyBmb3IgYSBnaXZlbiBuYW1lLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZQotewotICAvKiBOZXh0IHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbmV4dDsKLQotICAvKiBDbGFzcyBvZiB0eXBlLiAgKi8KLSAgaW50IGNsYXNzOwotCi0gIC8qIFN5bWJvbCBpbmRleCB3aGVyZSB0aGlzIHR5cGUgaXMgZGVmaW5lZC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBMaXN0IG9mIGVsZW1lbnRzLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqZWxlbWVudHM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBzdG9yZSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogQSBsaXN0IG9mIHR5cGVzIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqdHlwZXM7Ci19OwotCi0vKiBUaGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJih0YWJsZSktPnJvb3QsIF9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpKQotCi0vKiBGcmVlIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfZnJlZSAoJih0YWJsZSktPnJvb3QpKQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdoZW4gZG9pbmcKLSAgIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbwotewotICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCi0gICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaGVzOwotfTsKLQotLyogSW5mb3JtYXRpb24gdGhhdCB3ZSBwYXNzIGFyb3VuZCB3aGlsZSBkb2luZyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBVc2VkIHRvIGluZGljYXRlIGZhaWx1cmUgaW4gdHJhdmVyc2FsIHJvdXRpbmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLSAgLyogSWYgZG9pbmcgInRhc2sgbGlua2luZyIgc2V0IG9ubHkgZHVyaW5nIHRoZSB0aW1lIHdoZW4gd2Ugd2FudCB0aGUKLSAgICAgZ2xvYmFsIHN5bWJvbCB3cml0ZXIgdG8gY29udmVydCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBkZWZpbmVkIGdsb2JhbAotICAgICBzeW1ib2xzIGZyb20gZ2xvYmFsIHRvIHN0YXRpYy4gKi8KLSAgYm9vbGVhbiBnbG9iYWxfdG9fc3RhdGljOwotICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbiBhcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvcgotICAgICBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZSB0YXJnZXRfaW5kZXggZmllbGQuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqc2VjdGlvbl9pbmZvOwotICAvKiBTeW1ib2wgaW5kZXggb2YgbGFzdCBDX0ZJTEUgc3ltYm9sICgtMSBpZiBub25lKS4gICovCi0gIGxvbmcgbGFzdF9maWxlX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0IENfRklMRSBzeW1ib2wuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGxhc3RfZmlsZTsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGZpcnN0IGF1eCBlbnRyeSBvZiBsYXN0IC5iZiBzeW1ib2wgd2l0aCBhbiBlbXB0eQotICAgICBlbmRuZHggZmllbGQgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2JmX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0X2JmX2luZGV4IGF1eCBlbnRyeS4gICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCBsYXN0X2JmOwotICAvKiBIYXNoIHRhYmxlIHVzZWQgdG8gbWVyZ2UgZGVidWcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlIGRlYnVnX21lcmdlOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHNlY3Rpb25zIG9mIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBhc2VjdGlvbiAqKnNlY19wdHJzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKLSAgICAgaW5wdXQgZmlsZS4gICovCi0gIGxvbmcgKnN5bV9pbmRpY2VzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKm91dHN5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAotICAgICBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotfTsKLQotLyogTW9zdCBDT0ZGIHZhcmlhbnRzIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgYWxpZ25tZW50IG9mIGEKLSAgIHNlY3Rpb24uICBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIHNldCBhIHNwZWNpZmljIGFsaWdubWVudCBiYXNlZCBvbgotICAgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgY29mZl9zZWN0aW9uX2FsaWdubWVudF9lbnRyeQotewotICAvKiBUaGUgc2VjdGlvbiBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGlzIGlzIGVpdGhlciAodW5zaWduZWQgaW50KSAtMSwgaW5kaWNhdGluZyB0aGF0IHRoZSBzZWN0aW9uCi0gICAgIG5hbWUgbXVzdCBtYXRjaCBleGFjdGx5LCBvciBpdCBpcyB0aGUgbnVtYmVyIG9mIGxldHRlcnMgd2hpY2gKLSAgICAgbXVzdCBtYXRjaCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5hbWUuICAqLwotICB1bnNpZ25lZCBpbnQgY29tcGFyaXNvbl9sZW5ndGg7Ci0KLSAgLyogVGhlc2UgbWFjcm9zIG1heSBiZSB1c2VkIHRvIGZpbGwgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMgaW4gYQotICAgICBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uICAqLwotI2RlZmluZSBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSChuYW1lKSAobmFtZSksICgodW5zaWduZWQgaW50KSAtMSkKLSNkZWZpbmUgQ09GRl9TRUNUSU9OX05BTUVfUEFSVElBTF9NQVRDSChuYW1lKSAobmFtZSksIChzaXplb2YgKG5hbWUpIC0gMSkKLQotICAvKiBPbmx5IHVzZSB0aGlzIGVudHJ5IGlmIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IGZvciB0aGlzCi0gICAgIHRhcmdldCBpcyBhdCBsZWFzdCB0aGF0IG11Y2ggKGFzIGEgcG93ZXIgb2YgdHdvKS4gIElmIHRoaXMgZmllbGQKLSAgICAgaXMgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIGl0IHNob3VsZCBiZSBpZ25vcmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfYWxpZ25tZW50X21pbjsKLQotICAvKiBPbmx5IHVzZSB0aGlzIGVudHJ5IGlmIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IGZvciB0aGlzCi0gICAgIHRhcmdldCBpcyBubyBncmVhdGVyIHRoYW4gdGhpcyAoYXMgYSBwb3dlciBvZiB0d28pLiAgSWYgdGhpcwotICAgICBmaWVsZCBpcyBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgaXQgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9hbGlnbm1lbnRfbWF4OwotCi0jZGVmaW5lIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZICgodW5zaWduZWQgaW50KSAtMSkKLQotICAvKiBUaGUgZGVzaXJlZCBhbGlnbm1lbnQgZm9yIHRoaXMgc2VjdGlvbiAoYXMgYSBwb3dlciBvZiB0d28pLiAgKi8KLSAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gc3RydWN0IGludGVybmFsX3JlbG9jICpfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJvb2xlYW4sIGJmZF9ieXRlICosIGJvb2xlYW4sCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLQotI2RlZmluZSBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotLyogRnVuY3Rpb25zIGluIHhjb2ZmbGluay5jLiAgKi8KLQotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLS8qIEZ1bmN0aW9ucyBpbiBjb2ZmLXBwYy5jLiAgRklYTUU6IFRoZXNlIGFyZSBjYWxsZWQgYmUgcGUuZW0gaW4gdGhlCi0gICBsaW5rZXIsIGFuZCBzbyBzaG91bGQgc3RhcnQgd2l0aCBiZmQgYW5kIGJlIGRlY2xhcmVkIGluIGJmZC5oLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gcHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEFuZCBtb3JlIHRha2VuIGZyb20gdGhlIHNvdXJjZSAuLiAqLwotCmRpZmYgLS1naXQgYS9iZmQvbGliY29mZi5oIGIvYmZkL2xpYmNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlNGNlOS4uMDAwMDAwMAotLS0gYS9iZmQvbGliY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUzICswLDAgQEAKLS8qIEJGRCBDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogbGliY29mZi5oIGlzIGEgR0VORVJBVEVEIGZpbGUuICBEb24ndCBjaGFuZ2UgaXQ7IGluc3RlYWQsCi0qKiBjaGFuZ2UgbGliY29mZi1pbi5oIG9yIGNvZmZjb2RlLmguCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyogT2JqZWN0IGZpbGUgdGRhdGE7IGFjY2VzcyBtYWNyb3MgKi8KLQotI2RlZmluZSBjb2ZmX2RhdGEoYmZkKQkJKChiZmQpLT50ZGF0YS5jb2ZmX29ial9kYXRhKQotI2RlZmluZSBleGVjX2hkcihiZmQpCQkoY29mZl9kYXRhKGJmZCktPmhkcikKLSNkZWZpbmUgb2JqX3BlKGJmZCkgICAgICAgICAgICAgKGNvZmZfZGF0YShiZmQpLT5wZSkKLSNkZWZpbmUgb2JqX3N5bWJvbHMoYmZkKQkoY29mZl9kYXRhKGJmZCktPnN5bWJvbHMpCi0jZGVmaW5lCW9ial9zeW1fZmlsZXBvcyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+c3ltX2ZpbGVwb3MpCi0KLSNkZWZpbmUgb2JqX3JlbG9jYmFzZShiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmVsb2NiYXNlKQotI2RlZmluZSBvYmpfcmF3X3N5bWVudHMoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJhd19zeW1lbnRzKQotI2RlZmluZSBvYmpfcmF3X3N5bWVudF9jb3VudChiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmF3X3N5bWVudF9jb3VudCkKLSNkZWZpbmUgb2JqX2NvbnZlcnQoYmZkKQkoY29mZl9kYXRhKGJmZCktPmNvbnZlcnNpb25fdGFibGUpCi0jZGVmaW5lIG9ial9jb252X3RhYmxlX3NpemUoYmZkKSAoY29mZl9kYXRhKGJmZCktPmNvbnZfdGFibGVfc2l6ZSkKLQotI2RlZmluZSBvYmpfY29mZl9leHRlcm5hbF9zeW1zKGJmZCkgKGNvZmZfZGF0YSAoYmZkKS0+ZXh0ZXJuYWxfc3ltcykKLSNkZWZpbmUgb2JqX2NvZmZfa2VlcF9zeW1zKGJmZCkJKGNvZmZfZGF0YSAoYmZkKS0+a2VlcF9zeW1zKQotI2RlZmluZSBvYmpfY29mZl9zdHJpbmdzKGJmZCkJKGNvZmZfZGF0YSAoYmZkKS0+c3RyaW5ncykKLSNkZWZpbmUgb2JqX2NvZmZfa2VlcF9zdHJpbmdzKGJmZCkgKGNvZmZfZGF0YSAoYmZkKS0+a2VlcF9zdHJpbmdzKQotI2RlZmluZSBvYmpfY29mZl9zeW1faGFzaGVzKGJmZCkgKGNvZmZfZGF0YSAoYmZkKS0+c3ltX2hhc2hlcykKLQotI2RlZmluZSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoYmZkKSAoY29mZl9kYXRhKGJmZCktPmxvY2FsX3RvY19zeW1fbWFwKQotCi0vKiBgVGRhdGEnIGluZm9ybWF0aW9uIGtlcHQgZm9yIENPRkYgZmlsZXMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjb2ZmX3RkYXRhCi17Ci0gIHN0cnVjdCAgIGNvZmZfc3ltYm9sX3N0cnVjdCAqc3ltYm9sczsJLyogc3ltdGFiIGZvciBpbnB1dCBiZmQgKi8KLSAgdW5zaWduZWQgaW50ICpjb252ZXJzaW9uX3RhYmxlOwotICBpbnQgY29udl90YWJsZV9zaXplOwotICBmaWxlX3B0ciBzeW1fZmlsZXBvczsKLQotICBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpyYXdfc3ltZW50czsKLSAgdW5zaWduZWQgbG9uZyByYXdfc3ltZW50X2NvdW50OwotCi0gIC8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIG9uY2Ugd3JpdGluZyBoYXMgYmVndW4gKi8KLSAgbG9uZyBpbnQgcmVsb2NiYXNlOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJyB1bmZvcnR1bmF0ZWx5IHZhcnkKLSAgICAgZnJvbSBjb2ZmIGltcGxlbWVudGF0aW9uIHRvIGltcGxlbWVudGF0aW9uLi4uICAqLwotICB1bnNpZ25lZCBsb2NhbF9uX2J0bWFzazsKLSAgdW5zaWduZWQgbG9jYWxfbl9idHNoZnQ7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdHNoaWZ0OwotICB1bnNpZ25lZCBsb2NhbF9zeW1lc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2F1eGVzejsKLSAgdW5zaWduZWQgbG9jYWxfbGluZXN6OwotCi0gIC8qIFRoZSB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9scy4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMuICAqLwotICBQVFIgZXh0ZXJuYWxfc3ltczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgZXh0ZXJuYWxfc3ltcyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZS4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUuICAqLwotICBjaGFyICpzdHJpbmdzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBzdHJpbmdzIG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfc3RyaW5nczsKLQotICAvKiBpcyB0aGlzIGEgUEUgZm9ybWF0IGNvZmYgZmlsZSAqLwotICBpbnQgcGU7Ci0gIC8qIFVzZWQgYnkgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIHVzZWQgYnkgdGhlIHBlIGxpbmtlciBmb3IgUG93ZXJQQyAqLwotICBpbnQgKmxvY2FsX3RvY19zeW1fbWFwOwotCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0KLSAgLyogVXNlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgUFRSIGxpbmVfaW5mbzsKLQotICAvKiBUaGUgdGltZXN0YW1wIGZyb20gdGhlIENPRkYgZmlsZSBoZWFkZXIuICAqLwotICBsb25nIHRpbWVzdGFtcDsKLQotICAvKiBDb3B5IG9mIHNvbWUgb2YgdGhlIGZfZmxhZ3MgYml0cyBpbiB0aGUgQ09GRiBmaWxlaGRyIHN0cnVjdHVyZSwKLSAgICAgdXNlZCBieSBBUk0gY29kZS4gICovCi0gIGZsYWd3b3JkIGZsYWdzOwotCi19IGNvZmZfZGF0YV90eXBlOwotCi0vKiBUZGF0YSBmb3IgcGUgaW1hZ2UgZmlsZXMuICovCi10eXBlZGVmIHN0cnVjdCBwZV90ZGF0YQotewotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZV9vcHRoZHI7Ci0gIGludCBkbGw7Ci0gIGludCBoYXNfcmVsb2Nfc2VjdGlvbjsKLSAgYm9vbGVhbiAoKmluX3JlbG9jX3ApIFBBUkFNUygoYmZkICosIHJlbG9jX2hvd3RvX3R5cGUgKikpOwotICBmbGFnd29yZCByZWFsX2ZsYWdzOwotfSBwZV9kYXRhX3R5cGU7Ci0KLSNkZWZpbmUgcGVfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLnBlX29ial9kYXRhKQotCi0vKiBUZGF0YSBmb3IgWENPRkYgZmlsZXMuICAqLwotCi1zdHJ1Y3QgeGNvZmZfdGRhdGEKLXsKLSAgLyogQmFzaWMgQ09GRiBpbmZvcm1hdGlvbi4gICovCi0gIGNvZmZfZGF0YV90eXBlIGNvZmY7Ci0KLSAgLyogVHJ1ZSBpZiBhIGxhcmdlIGEub3V0IGhlYWRlciBzaG91bGQgYmUgZ2VuZXJhdGVkLiAgKi8KLSAgYm9vbGVhbiBmdWxsX2FvdXRoZHI7Ci0KLSAgLyogVE9DIHZhbHVlLiAgKi8KLSAgYmZkX3ZtYSB0b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIFRPQy4gICovCi0gIGludCBzbnRvYzsKLQotICAvKiBJbmRleCBvZiBzZWN0aW9uIGhvbGRpbmcgZW50cnkgcG9pbnQuICAqLwotICBpbnQgc25lbnRyeTsKLQotICAvKiAudGV4dCBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgdGV4dF9hbGlnbl9wb3dlcjsKLQotICAvKiAuZGF0YSBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgZGF0YV9hbGlnbl9wb3dlcjsKLQotICAvKiBtb2R0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgbW9kdHlwZTsKLQotICAvKiBjcHV0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgY3B1dHlwZTsKLQotICAvKiBtYXhkYXRhIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhkYXRhOwotCi0gIC8qIG1heHN0YWNrIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhzdGFjazsKLQotICAvKiBVc2VkIGJ5IHRoZSBYQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0gIGFzZWN0aW9uICoqY3NlY3RzOwotICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRpY2VzOwotICB1bnNpZ25lZCBpbnQgaW1wb3J0X2ZpbGVfaWQ7Ci19OwotCi0jZGVmaW5lIHhjb2ZmX2RhdGEoYWJmZCkgKChhYmZkKS0+dGRhdGEueGNvZmZfb2JqX2RhdGEpCi0KLS8qIFdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQotICogbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbC4gICovCi0jZGVmaW5lIGNvZmZzeW1ib2woYXN5bWJvbCkgKChjb2ZmX3N5bWJvbF90eXBlICopKCYoKGFzeW1ib2wpLT50aGVfYmZkKSkpCi0KLS8qIFRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiBhIHNlY3Rpb24gbWF5IGJlIHNldCB0byBhIHBvaW50ZXIgdG8gdGhpcwotICAgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgcmVsb2NzLCBzd2FwcGVkIGludG8gQ09GRiBpbnRlcm5hbCBmb3JtLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSByZWxvY3MgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9yZWxvY3M7Ci0gIC8qIFRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgY29udGVudHMgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9jb250ZW50czsKLSAgLyogSW5mb3JtYXRpb24gY2FjaGVkIGJ5IGNvZmZfZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKmZ1bmN0aW9uOwotICBpbnQgbGluZV9iYXNlOwotICAvKiBBIHBvaW50ZXIgdXNlZCBmb3IgLnN0YWIgbGlua2luZyBvcHRpbWl6YXRpb25zLiAgKi8KLSAgUFRSIHN0YWJfaW5mbzsKLSAgLyogQXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGJhY2tlbmRzLiAgKi8KLSAgUFRSIHRkYXRhOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqKSAoc2VjKS0+dXNlZF9ieV9iZmQpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBYQ09GRiBmaWxlcy4gIFRoaXMgaXMgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLQotc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVXNlZCBmb3IgWENPRkYgY3NlY3RzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlcjsgcG9pbnRzIHRvIHRoZSByZWFsCi0gICAgIFhDT0ZGIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgdGhpcyBjc2VjdC4gICovCi0gIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0gIC8qIFRoZSBsaW5lbm9fY291bnQgZmllbGQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiwgYmVjYXVzZSB3ZSBhcmUKLSAgICAgZ29pbmcgdG8gY2xvYmJlciBpdCB0aGVyZS4gICovCi0gIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0gIC8qIFRoZSBmaXJzdCBhbmQgb25lIHBhc3QgdGhlIGxhc3Qgc3ltYm9sIGluZGljZXMgZm9yIHN5bWJvbHMgdXNlZAotICAgICBieSB0aGlzIGNzZWN0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaXJzdF9zeW1uZHg7Ci0gIHVuc2lnbmVkIGxvbmcgbGFzdF9zeW1uZHg7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyB0aGUgeGNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSB4Y29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEgKikgY29mZl9zZWN0aW9uX2RhdGEgKChhYmZkKSwgKHNlYykpLT50ZGF0YSkKLQotLyogVGRhdGEgZm9yIHNlY3Rpb25zIGluIFBFIGZpbGVzLiAgKi8KLQotc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIHZpcnRfc2l6ZTsKLSAgLyogVGhlIFBFIHNlY3Rpb24gZmxhZ3MuICAqLwotICBsb25nIHBlX2ZsYWdzOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBwZWlfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBwZWlfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSAqKSBjb2ZmX3NlY3Rpb25fZGF0YSAoKGFiZmQpLCAoc2VjKSktPnRkYXRhKQotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICBTZXQgdG8gLTEgaW5pdGlhbGx5LiAgU2V0IHRvIC0yIGlmCi0gICAgIHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBTeW1ib2wgdHlwZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGNsYXNzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBjbGFzczsKLQotICAvKiBOdW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMuICAqLwotICBjaGFyIG51bWF1eDsKLQotICAvKiBCRkQgdG8gdGFrZSBhdXhpbGlhcnkgZW50cmllcyBmcm9tLiAgKi8KLSAgYmZkICphdXhiZmQ7Ci0KLSAgLyogUG9pbnRlciB0byBhcnJheSBvZiBhdXhpbGlhcnkgZW50cmllcywgaWYgYW55LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXg7Ci0KLSAgLyogRmxhZyB3b3JkOyBsZWdhbCB2YWx1ZXMgZm9sbG93LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgY29mZl9saW5rX2hhc2hfZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyBhIFBFIHNlY3Rpb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgQ09GRl9MSU5LX0hBU0hfUEVfU0VDVElPTl9TWU1CT0wgKDAxKQotfTsKLQotLyogQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotICAvKiBBIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gdXNlZCB0byBsaW5rIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLSAgUFRSIHN0YWJfaW5mbzsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCVwKLSAgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgY29mZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBGdW5jdGlvbnMgaW4gY29mZmdlbi5jLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpjb2ZmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IHNlYyAqY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gaW50IGNvZmZfY291bnRfbGluZW51bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3QgY29mZl9zeW1ib2xfc3RydWN0ICpjb2ZmX3N5bWJvbF9mcm9tIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfcmVudW1iZXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgaW50ICopKTsKLWV4dGVybiB2b2lkIGNvZmZfbWFuZ2xlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfd3JpdGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl93cml0ZV9saW5lbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGFsZW50ICpjb2ZmX2dldF9saW5lbm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfc2VjdGlvbl9zeW1ib2wgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9wcmludF9zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiBmaWxlcCwgYXN5bWJvbCAqLAotCQkJCSAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93KSk7Ci1leHRlcm4gdm9pZCBjb2ZmX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkgIHN5bWJvbF9pbmZvICpyZXQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSLAotCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBib29sZWFuIGNvZmZfZmluZF9uZWFyZXN0X2xpbmUgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgICBhc2VjdGlvbiAqLAotCQkJCQkgICAgICAgYXN5bWJvbCAqKiwKLQkJCQkJICAgICAgIGJmZF92bWEgb2Zmc2V0LAotCQkJCQkgICAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cikpOwotZXh0ZXJuIGludCBjb2ZmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuIHJlbG9jKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotZXh0ZXJuIGJmZF9ieXRlICpiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKiopKTsKLWV4dGVybiBiZmRfdm1hIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIFBBUkFNUyAoKGFyZWxlbnQgKiwKLQkJCQkJCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQkgICBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfcGVyZm9ybV9zbGlwIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHNsaXAsCi0JCQkJICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgYmZkX3ZtYSB2YWwpKTsKLQotLyogRnVuY3Rpb25zIGFuZCB0eXBlcyBpbiBjb2ZmbGluay5jLiAgKi8KLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi0vKiBXZSB1c2UgYSBoYXNoIHRhYmxlIHRvIG1lcmdlIGlkZW50aWNhbCBlbnVtLCBzdHJ1Y3QsIGFuZCB1bmlvbgotICAgZGVmaW5pdGlvbnMgaW4gdGhlIGxpbmtlci4gICovCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgc2luZ2xlIGVsZW1lbnQgKGFuIGVudW0gdmFsdWUsIGEKLSAgIHN0cnVjdHVyZSBvciB1bmlvbiBmaWVsZCkgaW4gdGhlIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50Ci17Ci0gIC8qIE5leHQgZWxlbWVudC4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQgKm5leHQ7Ci0KLSAgLyogTmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVHlwZS4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlOwotCi0gIC8qIFN5bWJvbCBpbmRleCBmb3IgY29tcGxleCB0eXBlLiAgKi8KLSAgbG9uZyB0YWduZHg7Ci19OwotCi0vKiBBIGxpbmtlZCBsaXN0IG9mIGRlYnVnIG1lcmdlIGVudHJpZXMgZm9yIGEgZ2l2ZW4gbmFtZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUKLXsKLSAgLyogTmV4dCB0eXBlIHdpdGggdGhlIHNhbWUgbmFtZS4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKm5leHQ7Ci0KLSAgLyogQ2xhc3Mgb2YgdHlwZS4gICovCi0gIGludCBjbGFzczsKLQotICAvKiBTeW1ib2wgaW5kZXggd2hlcmUgdGhpcyB0eXBlIGlzIGRlZmluZWQuICAqLwotICBsb25nIGluZHg7Ci0KLSAgLyogTGlzdCBvZiBlbGVtZW50cy4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQgKmVsZW1lbnRzOwotfTsKLQotLyogSW5mb3JtYXRpb24gd2Ugc3RvcmUgaW4gdGhlIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIEEgbGlzdCBvZiB0eXBlcyB3aXRoIHRoaXMgbmFtZS4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKnR5cGVzOwotfTsKLQotLyogVGhlIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogSW5pdGlhbGl6ZSBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQodGFibGUpIFwKLSAgKGJmZF9oYXNoX3RhYmxlX2luaXQgKCYodGFibGUpLT5yb290LCBfYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jKSkKLQotLyogRnJlZSBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUodGFibGUpIFwKLSAgKGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCYodGFibGUpLT5yb290KSkKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSB3aGVuIGRvaW5nCi0gICBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8KLXsKLSAgLyogVGhlIHJlbG9jcyB0byBiZSBvdXRwdXQuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogRm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wgd2hvc2UgaW5kZXggd2FzIG5vdCBrbm93bgotICAgICB3aGVuIHRoZSByZWxvYyB3YXMgaGFuZGxlZCwgdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hlczsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHRoYXQgd2UgcGFzcyBhcm91bmQgd2hpbGUgZG9pbmcgdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLXN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbwotewotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogVXNlZCB0byBpbmRpY2F0ZSBmYWlsdXJlIGluIHRyYXZlcnNhbCByb3V0aW5lLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIC8qIElmIGRvaW5nICJ0YXNrIGxpbmtpbmciIHNldCBvbmx5IGR1cmluZyB0aGUgdGltZSB3aGVuIHdlIHdhbnQgdGhlCi0gICAgIGdsb2JhbCBzeW1ib2wgd3JpdGVyIHRvIGNvbnZlcnQgdGhlIHN0b3JhZ2UgY2xhc3Mgb2YgZGVmaW5lZCBnbG9iYWwKLSAgICAgc3ltYm9scyBmcm9tIGdsb2JhbCB0byBzdGF0aWMuICovCi0gIGJvb2xlYW4gZ2xvYmFsX3RvX3N0YXRpYzsKLSAgLyogSGFzaCB0YWJsZSBmb3IgbG9uZyBzeW1ib2wgbmFtZXMuICAqLwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWI7Ci0gIC8qIFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgYW4gYXJyYXkgb2YgaW5mb3JtYXRpb24ga2VwdCBmb3IKLSAgICAgZWFjaCBvdXRwdXQgc2VjdGlvbiwgaW5kZXhlZCBieSB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8gKnNlY3Rpb25faW5mbzsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGxhc3QgQ19GSUxFIHN5bWJvbCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfZmlsZV9pbmRleDsKLSAgLyogQ29udGVudHMgb2YgbGFzdCBDX0ZJTEUgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBsYXN0X2ZpbGU7Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBmaXJzdCBhdXggZW50cnkgb2YgbGFzdCAuYmYgc3ltYm9sIHdpdGggYW4gZW1wdHkKLSAgICAgZW5kbmR4IGZpZWxkICgtMSBpZiBub25lKS4gICovCi0gIGxvbmcgbGFzdF9iZl9pbmRleDsKLSAgLyogQ29udGVudHMgb2YgbGFzdF9iZl9pbmRleCBhdXggZW50cnkuICAqLwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgbGFzdF9iZjsKLSAgLyogSGFzaCB0YWJsZSB1c2VkIHRvIG1lcmdlIGRlYnVnIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZSBkZWJ1Z19tZXJnZTsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHN3YXBwZWQgc3ltYm9scyBvZiBhbnkgaW5wdXQgZmlsZS4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmludGVybmFsX3N5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzZWN0aW9ucyBvZiBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYXNlY3Rpb24gKipzZWNfcHRyczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBpbmRpY2VzIG9mIHN5bWJvbHMgb2YgYW55Ci0gICAgIGlucHV0IGZpbGUuICAqLwotICBsb25nICpzeW1faW5kaWNlczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBzeW1ib2xzIGZvciBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGJmZF9ieXRlICpvdXRzeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgbGluZSBudW1iZXJzIGZvciBhbnkgaW5wdXQKLSAgICAgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpsaW5lbm9zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCByZWxvY3Mgb2YgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCByZWxvY3Mgb2YgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLX07Ci0KLS8qIE1vc3QgQ09GRiB2YXJpYW50cyBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGFsaWdubWVudCBvZiBhCi0gICBzZWN0aW9uLiAgVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBzZXQgYSBzcGVjaWZpYyBhbGlnbm1lbnQgYmFzZWQgb24KLSAgIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfZW50cnkKLXsKLSAgLyogVGhlIHNlY3Rpb24gbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhpcyBpcyBlaXRoZXIgKHVuc2lnbmVkIGludCkgLTEsIGluZGljYXRpbmcgdGhhdCB0aGUgc2VjdGlvbgotICAgICBuYW1lIG11c3QgbWF0Y2ggZXhhY3RseSwgb3IgaXQgaXMgdGhlIG51bWJlciBvZiBsZXR0ZXJzIHdoaWNoCi0gICAgIG11c3QgbWF0Y2ggYXQgdGhlIHN0YXJ0IG9mIHRoZSBuYW1lLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbXBhcmlzb25fbGVuZ3RoOwotCi0gIC8qIFRoZXNlIG1hY3JvcyBtYXkgYmUgdXNlZCB0byBmaWxsIGluIHRoZSBmaXJzdCB0d28gZmllbGRzIGluIGEKLSAgICAgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLiAgKi8KLSNkZWZpbmUgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0gobmFtZSkgKG5hbWUpLCAoKHVuc2lnbmVkIGludCkgLTEpCi0jZGVmaW5lIENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0gobmFtZSkgKG5hbWUpLCAoc2l6ZW9mIChuYW1lKSAtIDEpCi0KLSAgLyogT25seSB1c2UgdGhpcyBlbnRyeSBpZiB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBmb3IgdGhpcwotICAgICB0YXJnZXQgaXMgYXQgbGVhc3QgdGhhdCBtdWNoIChhcyBhIHBvd2VyIG9mIHR3bykuICBJZiB0aGlzIGZpZWxkCi0gICAgIGlzIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBpdCBzaG91bGQgYmUgaWdub3JlZC4gICovCi0gIHVuc2lnbmVkIGludCBkZWZhdWx0X2FsaWdubWVudF9taW47Ci0KLSAgLyogT25seSB1c2UgdGhpcyBlbnRyeSBpZiB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBmb3IgdGhpcwotICAgICB0YXJnZXQgaXMgbm8gZ3JlYXRlciB0aGFuIHRoaXMgKGFzIGEgcG93ZXIgb2YgdHdvKS4gIElmIHRoaXMKLSAgICAgZmllbGQgaXMgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIGl0IHNob3VsZCBiZSBpZ25vcmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfYWxpZ25tZW50X21heDsKLQotI2RlZmluZSBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSAoKHVuc2lnbmVkIGludCkgLTEpCi0KLSAgLyogVGhlIGRlc2lyZWQgYWxpZ25tZW50IGZvciB0aGlzIHNlY3Rpb24gKGFzIGEgcG93ZXIgb2YgdHdvKS4gICovCi0gIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci19OwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bQotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0KLSNkZWZpbmUgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIEZ1bmN0aW9ucyBpbiB4Y29mZmxpbmsuYy4gICovCi0KLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi0vKiBGdW5jdGlvbnMgaW4gY29mZi1wcGMuYy4gIEZJWE1FOiBUaGVzZSBhcmUgY2FsbGVkIGJlIHBlLmVtIGluIHRoZQotICAgbGlua2VyLCBhbmQgc28gc2hvdWxkIHN0YXJ0IHdpdGggYmZkIGFuZCBiZSBkZWNsYXJlZCBpbiBiZmQuaC4gICovCi0KLWV4dGVybiBib29sZWFuIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBBbmQgbW9yZSB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgLi4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0Ci17Ci0KLSAgICAgICAgLyogUmVtZW1iZXJzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBmaWxlIGZvcgotICAgICAgICAgIHRoaXMgc3ltYm9sLiBHZW5lcmF0ZWQgYnkgY29mZl9yZW51bWJlcl9zeW1ib2xzLiAqLwotdW5zaWduZWQgaW50IG9mZnNldDsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuICBVc2VkIGZvcgotICAgICAgICAgIFhDT0ZGIENfQlNUQVQgc3ltYm9scy4gIFNldCBieSBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCi11bnNpZ25lZCBpbnQgZml4X3ZhbHVlIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHRhZyBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfdGFnIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIGVuZGlkeCBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfZW5kIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHhfY3NlY3QueF9zY25sZW4gZmllbGQgYmUgcmVudW1iZXJlZC4KLSAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICovCi11bnNpZ25lZCBpbnQgZml4X3NjbmxlbiA6IDE7Ci0KLSAgICAgICAgLyogRml4IHVwIGFuIFhDT0ZGIENfQklOQ0wvQ19FSU5DTCBzeW1ib2wuICBUaGUgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgaW5kZXggaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcy4gIFNldCBieQotICAgICAgICAgIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKi8KLXVuc2lnbmVkIGludCBmaXhfbGluZSA6IDE7Ci0KLSAgICAgICAgLyogVGhlIGNvbnRhaW5lciBmb3IgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgcmVhZCBhbmQgdHJhbnNsYXRlZAotICAgICAgICAgICBmcm9tIHRoZSBmaWxlLiAqLwotCi11bmlvbiB7Ci0gICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4ZW50OwotICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0gfSB1OwotfSBjb21iaW5lZF9lbnRyeV90eXBlOwotCi0KLSAvKiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXM6ICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdAotewotICAgIC8qIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICovCi1hc3ltYm9sIHN5bWJvbDsKLQotICAgIC8qIEEgcG9pbnRlciB0byB0aGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqLwotY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotCi0gICAgLyogQSBwb2ludGVyIHRvIHRoZSBsaW5lbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqLwotc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSAqbGluZW5vOwotCi0gICAgLyogSGF2ZSB0aGUgbGluZSBudW1iZXJzIGJlZW4gcmVsb2NhdGVkIHlldCA/ICovCi1ib29sZWFuIGRvbmVfbGluZW5vOwotfSBjb2ZmX3N5bWJvbF90eXBlOwotIC8qIENPRkYgc3ltYm9sIGNsYXNzaWZpY2F0aW9ucy4gICovCi0KLWVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24KLXsKLSAgIC8qIEdsb2JhbCBzeW1ib2wuICAqLwotICBDT0ZGX1NZTUJPTF9HTE9CQUwsCi0gICAvKiBDb21tb24gc3ltYm9sLiAgKi8KLSAgQ09GRl9TWU1CT0xfQ09NTU9OLAotICAgLyogVW5kZWZpbmVkIHN5bWJvbC4gICovCi0gIENPRkZfU1lNQk9MX1VOREVGSU5FRCwKLSAgIC8qIExvY2FsIHN5bWJvbC4gICovCi0gIENPRkZfU1lNQk9MX0xPQ0FMLAotICAgLyogUEUgc2VjdGlvbiBzeW1ib2wuICAqLwotICBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OCi19OwotCi10eXBlZGVmIHN0cnVjdAotewotICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYXV4X2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotICAgICAgIGludCAgICAgICAgICAgICB0eXBlLAotICAgICAgIGludCAgICAgICAgICAgICBjbGFzcywKLSAgICAgICBpbnQgICAgICAgICAgICAgaW5kYXV4LAotICAgICAgIGludCAgICAgICAgICAgICBudW1hdXgsCi0gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0KLSAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX3N5bV9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQgLAotICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCi0gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0KLSAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX2xpbmVub19pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICAgICAgICAgZXh0LAotICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYXV4X291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGluLAotICAgICAgIGludCAgICAgdHlwZSwKLSAgICAgICBpbnQgICAgIGNsYXNzLAotICAgICAgIGludCAgICAgaW5kYXV4LAotICAgICAgIGludCAgICAgbnVtYXV4LAotICAgICAgIFBUUiAgICAgZXh0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSBQQVJBTVMgKCgKLSAgICAgIGJmZCAgICAgICphYmZkLAotICAgICAgUFRSICAgICAgaW4sCi0gICAgICBQVFIgICAgICBleHQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIGV4dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgc3JjLAotICAgICAgIFBUUiAgICAgZHN0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGluLAotICAgICAgIFBUUiAgICAgb3V0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGluLAotICAgICAgIFBUUiAgICAgb3V0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgUFRSICAgICBvdXQpKTsKLQotIHVuc2lnbmVkIGludCBfYmZkX2ZpbGhzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9hb3V0c3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfc2NuaHN6OwotIHVuc2lnbmVkIGludCBfYmZkX3N5bWVzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9hdXhlc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfcmVsc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfbGluZXN6OwotIHVuc2lnbmVkIGludCBfYmZkX2ZpbG5tbGVuOwotIGJvb2xlYW4gX2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzOwotIGJvb2xlYW4gX2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lczsKLSB1bnNpZ25lZCBpbnQgX2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXI7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBleHQsCi0gICAgICAgUFRSICAgICBpbikpOwotIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBleHQsCi0gICAgICAgUFRSICAgICBpbikpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotIFBUUiAoKl9iZmRfY29mZl9ta29iamVjdF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkciwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2FvdXRoZHIpKTsKLSBmbGFnd29yZCAoKl9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX3NjbmhkciwKLSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0gdm9pZCAoKl9iZmRfc2V0X2FsaWdubWVudF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIGFzZWN0aW9uICpzZWMsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbCwKLSAgICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4LAotICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfcHJpbnRfYXV4KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgRklMRSAqZmlsZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbCwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgsCi0gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCkpOwotIHZvaWQgKCpfYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKLSAgICAgICBhcmVsZW50ICpyZWxvYywKLSAgICAgICBiZmRfYnl0ZSAqZGF0YSwKLSAgICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHIsCi0gICAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyKSk7Ci0gaW50ICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgICBhcmVsZW50ICpyLAotICAgICAgIHVuc2lnbmVkIGludCBzaHJpbmssCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotIGVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24gKCpfYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaykgUEFSQU1TICgoCi0gICAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0gICAgICAgYmZkICppbnB1dF9iZmQsCi0gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXMsCi0gICAgICAgYXNlY3Rpb24gKipzZWN0aW9ucykpOwotIHJlbG9jX2hvd3RvX3R5cGUgKigqX2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgYXNlY3Rpb24gKnNlYywKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbCwKLSAgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmgsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltLAotICAgICAgIGJmZF92bWEgKmFkZGVuZHApKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqb2JmZCwKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmliZmQsCi0gICAgICAgYXNlY3Rpb24gKnNlYywKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jLAotICAgICAgIGJvb2xlYW4gKmFkanVzdGVkcCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCkgUEFSQU1TICgoCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgZmxhZ3dvcmQgZmxhZ3MsIAotICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotICAgICAgIGJmZF92bWEgdmFsdWUsCi0gICAgICAgY29uc3QgY2hhciAqc3RyaW5nLAotICAgICAgIGJvb2xlYW4gY29weSwKLSAgICAgICBib29sZWFuIGNvbGxlY3QsIAotICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHApKTsKLQotIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKiBhYmZkLAotICAgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKiBhYmZkLAotICAgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOwotCi19IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YTsKLQotI2RlZmluZSBjb2ZmX2JhY2tlbmRfaW5mbyhhYmZkKSAoKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9pbihhLGUsdCxjLGluZCxudW0saSkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X2luKSAoYSxlLHQsYyxpbmQsbnVtLGkpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX2luKGEsZSxpKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9zeW1faW4pIChhLGUsaSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4oYSxlLGkpIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoIGEpLT5fYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIChhLGUsaSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQoYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KGFiZmQsIGksIG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9vdXQoYSxpLHQsYyxpbmQsbnVtLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIChhLGksdCxjLGluZCxudW0sbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1fb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dChhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9maWxoc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9maWxoc3opCi0jZGVmaW5lIGJmZF9jb2ZmX2FvdXRzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2FvdXRzeikKLSNkZWZpbmUgYmZkX2NvZmZfc2NuaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc2NuaHN6KQotI2RlZmluZSBiZmRfY29mZl9zeW1lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zeW1lc3opCi0jZGVmaW5lIGJmZF9jb2ZmX2F1eGVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2F1eGVzeikKLSNkZWZpbmUgYmZkX2NvZmZfcmVsc3ooYWJmZCkgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfcmVsc3opCi0jZGVmaW5lIGJmZF9jb2ZmX2xpbmVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2xpbmVzeikKLSNkZWZpbmUgYmZkX2NvZmZfZmlsbm1sZW4oYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9maWxubWxlbikKLSNkZWZpbmUgYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMoYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzKQotI2RlZmluZSBiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMoYWJmZCkgXAotICAgICAgICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKQotI2RlZmluZSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKGFiZmQpIFwKLSAgICAgICAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIpCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4oYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4oYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX2luKGFiZmQsIGksIG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKGFiZmQsIGZpbGVoZHIpIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLQotI2RlZmluZSBiZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2soYWJmZCwgZmlsZWhkcilcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSAoYWJmZCwgZmlsZWhkcikpCi0jZGVmaW5lIGJmZF9jb2ZmX21rb2JqZWN0X2hvb2soYWJmZCwgZmlsZWhkciwgYW91dGhkcilcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2soYWJmZCwgc2NuaGRyLCBuYW1lLCBzZWN0aW9uKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vaylcCi0gICAgICAgICAoYWJmZCwgc2NuaGRyLCBuYW1lLCBzZWN0aW9uKSkKLQotI2RlZmluZSBiZmRfY29mZl9zZXRfYWxpZ25tZW50X2hvb2soYWJmZCwgc2VjLCBzY25oZHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIChhYmZkLCBzZWMsIHNjbmhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKGFiZmQpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcoYWJmZCwgc3ltKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSAoYWJmZCwgc3ltKSkKLQotI2RlZmluZSBiZmRfY29mZl9wcmludF9hdXgoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcHJpbnRfYXV4KVwKLSAgICAgICAgIChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KSkKLQotI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpXAotICAgICAgICAgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKVwKLSAgICAgICAgIChhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbChhYmZkLCBzeW0pXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbClcCi0gICAgICAgICAoYWJmZCwgc3ltKSkKLQotI2RlZmluZSBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMoYWJmZClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKVwKLSAgICAgICAgIChhYmZkKSkKLQotI2RlZmluZSBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rKG9iZmQsIGluZm8pXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChvYmZkKS0+X2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspXAotICAgICAgICAgKG9iZmQsIGluZm8pKQotI2RlZmluZSBiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKG9iZmQsaW5mbyxpYmZkLG8sY29uLHJlbCxpc3ltcyxzZWNzKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoaWJmZCktPl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKVwKLSAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBvLCBjb24sIHJlbCwgaXN5bXMsIHNlY3MpKQotI2RlZmluZSBiZmRfY29mZl9ydHlwZV90b19ob3d0byhhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ydHlwZV90b19ob3d0bylcCi0gICAgICAgICAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkpCi0jZGVmaW5lIGJmZF9jb2ZmX2FkanVzdF9zeW1uZHgob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfYWRqdXN0X3N5bW5keClcCi0gICAgICAgICAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcCkpCi0jZGVmaW5lIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2woaW5mbyxhYmZkLG5hbWUsZmxhZ3Msc2VjdGlvbix2YWx1ZSxzdHJpbmcsY3AsY29sbCxoYXNocClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbClcCi0gICAgICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNwLCBjb2xsLCBoYXNocCkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKGEscCkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgKGEscCkpCi0jZGVmaW5lIGJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdChhLHApIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIChhLHApKQotCmRpZmYgLS1naXQgYS9iZmQvbGliZWNvZmYuaCBiL2JmZC9saWJlY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTYxODA1Li4wMDAwMDAwCi0tLSBhL2JmZC9saWJlY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qIEJGRCBFQ09GRiBvYmplY3QgZmlsZSBwcml2YXRlIHN0cnVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpZm5kZWYgRUNPRkZfSAotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBiYWNrZW5kIGluZm9ybWF0aW9uIGtlcHQgZm9yIEVDT0ZGIGZpbGVzLiAgVGhpcwotICAgc3RydWN0dXJlIGlzIGNvbnN0YW50IGZvciBhIHBhcnRpY3VsYXIgYmFja2VuZC4gIFRoZSBmaXJzdCBlbGVtZW50Ci0gICBpcyB0aGUgQ09GRiBiYWNrZW5kIGRhdGEgc3RydWN0dXJlLCBzbyB0aGF0IEVDT0ZGIHRhcmdldHMgY2FuIHVzZQotICAgdGhlIGdlbmVyaWMgQ09GRiBjb2RlLiAgKi8KLQotI2RlZmluZSBlY29mZl9iYWNrZW5kKGFiZmQpIFwKLSAgKChzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi1zdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhCi17Ci0gIC8qIENPRkYgYmFja2VuZCBpbmZvcm1hdGlvbi4gIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgZmllbGQuICAqLwotICBiZmRfY29mZl9iYWNrZW5kX2RhdGEgY29mZjsKLSAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAvKiBJbml0aWFsIHBvcnRpb24gb2YgYXJtYXAgc3RyaW5nLiAgKi8KLSAgY29uc3QgY2hhciAqYXJtYXBfc3RhcnQ7Ci0gIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKLSAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KLSAgYmZkX3ZtYSByb3VuZDsKLSAgLyogVHJ1ZSBpZiB0aGUgLnJkYXRhIHNlY3Rpb24gaXMgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LCBhcyBvbiB0aGUKLSAgICAgQWxwaGEuICBGYWxzZSBpZiAucmRhdGEgaXMgcGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LCBhcyBvbiB0aGUKLSAgICAgTUlQUy4gICovCi0gIGJvb2xlYW4gcmRhdGFfaW5fdGV4dDsKLSAgLyogQml0c2l6ZSBvZiBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbnN0cnVjdG9yX2JpdHNpemU7Ci0gIC8qIFJlbG9jIHRvIHVzZSBmb3IgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmNvbnN0cnVjdG9yX3JlbG9jOwotICAvKiBIb3cgdG8gc3dhcCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCBkZWJ1Z19zd2FwOwotICAvKiBFeHRlcm5hbCByZWxvYyBzaXplLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplOwotICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLwotICB2b2lkICgqc3dhcF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIFBUUiwgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLSAgdm9pZCAoKnN3YXBfcmVsb2Nfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosIFBUUikpOwotICAvKiBCYWNrZW5kIHJlbG9jIHR3ZWFraW5nLiAgKi8KLSAgdm9pZCAoKmFkanVzdF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCSAgIGFyZWxlbnQgKikpOwotICB2b2lkICgqYWRqdXN0X3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkgICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLSAgLyogUmVsb2NhdGUgc2VjdGlvbiBjb250ZW50cyB3aGlsZSBsaW5raW5nLiAgKi8KLSAgYm9vbGVhbiAoKnJlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgYmZkICppbnB1dF9iZmQsIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0JCQkJICAgICAgIFBUUiBleHRlcm5hbF9yZWxvY3MpKTsKLSAgLyogRG8gZmluYWwgYWRqdXN0bWVudHMgdG8gZmlsZWhkciBhbmQgYW91dGhkci4gICovCi0gIGJvb2xlYW4gKCphZGp1c3RfaGVhZGVycykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICosCi0JCQkJICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSk7Ci0gIC8qIFJlYWQgYW4gZWxlbWVudCBmcm9tIGFuIGFyY2hpdmUgYXQgYSBnaXZlbiBmaWxlIHBvc2l0aW9uLiAgVGhpcwotICAgICBpcyBuZWVkZWQgYmVjYXVzZSBPU0YvMSAzLjIgdXNlcyBhIHdlaXJkIGFyY2hpdmUgZm9ybWF0LiAgKi8KLSAgYmZkICooKmdldF9lbHRfYXRfZmlsZXBvcykgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyKSk7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24ga2VwdCBmb3IgRUNPRkYgZmlsZXMuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2RhdGEoYWJmZCkgKChhYmZkKS0+dGRhdGEuZWNvZmZfb2JqX2RhdGEpCi0KLXR5cGVkZWYgc3RydWN0IGVjb2ZmX3RkYXRhCi17Ci0gIC8qIFRoZSByZWxvYyBmaWxlIHBvc2l0aW9uLCBzZXQgYnkKLSAgICAgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgKi8KLSAgZmlsZV9wdHIgcmVsb2NfZmlsZXBvczsKLQotICAvKiBUaGUgc3ltYm9sIHRhYmxlIGZpbGUgcG9zaXRpb24sIHNldCBieSBfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2suICAqLwotICBmaWxlX3B0ciBzeW1fZmlsZXBvczsKLQotICAvKiBUaGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgdGV4dCBzZWdtZW50LiAgT25seSB2YWxpZCBmb3IgYW4KLSAgICAgZXhpc3RpbmcgZmlsZSwgbm90IGZvciBvbmUgd2UgYXJlIGNyZWF0aW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyB0ZXh0X3N0YXJ0OwotICB1bnNpZ25lZCBsb25nIHRleHRfZW5kOwotCi0gIC8qIFRoZSBjYWNoZWQgZ3AgdmFsdWUuICBUaGlzIGlzIHVzZWQgd2hlbiByZWxvY2F0aW5nLiAgKi8KLSAgYmZkX3ZtYSBncDsKLQotICAvKiBUaGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gb3B0aW1pemUgdXNpbmcgZ3AuICBUaGlzIGlzCi0gICAgIHR5cGljYWxseSBzZXQgYnkgdGhlIC1HIG9wdGlvbiB0byB0aGUgY29tcGlsZXIsIGFzc2VtYmxlciBvcgotICAgICBsaW5rZXIuICAqLwotICB1bnNpZ25lZCBpbnQgZ3Bfc2l6ZTsKLQotICAvKiBUaGUgcmVnaXN0ZXIgbWFza3MuICBXaGVuIGxpbmtpbmcsIGFsbCB0aGUgbWFza3MgZm91bmQgaW4gdGhlCi0gICAgIGlucHV0IGZpbGVzIGFyZSBjb21iaW5lZCBpbnRvIHRoZSBtYXNrcyBvZiB0aGUgb3V0cHV0IGZpbGUuCi0gICAgIFRoZXNlIGFyZSBub3QgYWxsIHVzZWQgZm9yIGFsbCB0YXJnZXRzLCBidXQgdGhhdCdzIE9LLCBiZWNhdXNlCi0gICAgIHRoZSByZWxldmFudCBvbmVzIGFyZSB0aGUgb25seSBvbmVzIHN3YXBwZWQgaW4gYW5kIG91dC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsKLSAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOwotICB1bnNpZ25lZCBsb25nIGNwcm1hc2tbNF07Ci0KLSAgLyogVGhlIEVDT0ZGIHN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGRlYnVnX2luZm87Ci0KLSAgLyogVGhlIHVuc3dhcHBlZCBFQ09GRiBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIFBUUiByYXdfc3ltZW50czsKLQotICAvKiBUaGUgY2Fub25pY2FsIEJGRCBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IGVjb2ZmX3N5bWJvbF9zdHJ1Y3QgKmNhbm9uaWNhbF9zeW1ib2xzOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGV4dGVybmFsIHN5bWJvbCBudW1iZXJzIHRvIGVudHJpZXMgaW4gdGhlIGxpbmtlcgotICAgICBoYXNoIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZy4gICovCi0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIHJlbG9jIHN5bWJvbCBpbmRpY2VzIHRvIHNlY3Rpb25zLCB1c2VkIHdoZW4KLSAgICAgbGlua2luZy4gICovCi0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb247Ci0KLSAgLyogVHJ1ZSBpZiB0aGlzIEJGRCB3YXMgd3JpdHRlbiBieSB0aGUgYmFja2VuZCBsaW5rZXIuICAqLwotICBib29sZWFuIGxpbmtlcjsKLQotICAvKiBUcnVlIGlmIGEgd2FybmluZyB0aGF0IG11bHRpcGxlIGdsb2JhbCBwb2ludGVyIHZhbHVlcyBhcmUKLSAgICAgbmVlZGVkIGluIHRoZSBvdXRwdXQgYmluYXJ5IHdhcyBpc3N1ZWQgYWxyZWFkeS4gICovCi0gIGJvb2xlYW4gaXNzdWVkX211bHRpcGxlX2dwX3dhcm5pbmc7Ci0KLSAgLyogVXNlZCBieSBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gIFRoZSBzdHJ1Y3R1cmUgY291bGQgYmUKLSAgICAgaW5jbHVkZWQgZGlyZWN0bHkgaW4gdGhpcyBvbmUsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IHRvIHdhc3RpbmcKLSAgICAgdGhlIG1lbW9yeSBqdXN0IGZvciB0aGUgaW5mcmVxdWVudGx5IGNhbGxlZCBmaW5kX25lYXJlc3RfbGluZS4gICovCi0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmZpbmRfbGluZV9pbmZvOwotCi0gIC8qIFdoZXRoZXIgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIGluIHRoZSB0ZXh0IHNlZ21lbnQgZm9yIHRoaXMKLSAgICAgcGFydGljdWxhciBFQ09GRiBmaWxlLiAgVGhpcyBpcyBub3QgdmFsaWQgdW50aWwKLSAgICAgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIGlzIGNhbGxlZC4gICovCi0gIGJvb2xlYW4gcmRhdGFfaW5fdGV4dDsKLQotfSBlY29mZl9kYXRhX3R5cGU7Ci0KLS8qIEVhY2ggY2Fub25pY2FsIGFzeW1ib2wgcmVhbGx5IGxvb2tzIGxpa2UgdGhpcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVjb2ZmX3N5bWJvbF9zdHJ1Y3QKLXsKLSAgLyogVGhlIGFjdHVhbCBzeW1ib2wgd2hpY2ggdGhlIHJlc3Qgb2YgQkZEIHdvcmtzIHdpdGggKi8KLSAgYXN5bWJvbCBzeW1ib2w7Ci0KLSAgLyogVGhlIGZkciBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBGRFIgKmZkcjsKLQotICAvKiB0cnVlIGlmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wgcmF0aGVyIHRoYW4gYW4gZXh0ZXJuYWwgb25lLiAgKi8KLSAgYm9vbGVhbiBsb2NhbDsKLQotICAvKiBBIHBvaW50ZXIgdG8gdGhlIHVuc3dhcHBlZCBoaWRkZW4gaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sLgotICAgICBUaGlzIGlzIGVpdGhlciBhIHN0cnVjdCBzeW1fZXh0IG9yIGEgc3RydWN0IGV4dF9leHQsIGRlcGVuZGluZyBvbgotICAgICB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsIGZpZWxkIGFib3ZlLiAgKi8KLSAgUFRSIG5hdGl2ZTsKLX0gZWNvZmZfc3ltYm9sX3R5cGU7Ci0KLS8qIFdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbC4gICovCi0jZGVmaW5lIGVjb2Zmc3ltYm9sKGFzeW1ib2wpICgoZWNvZmZfc3ltYm9sX3R5cGUgKikgKCYoKGFzeW1ib2wpLT50aGVfYmZkKSkpCi0KLS8qIFdlIG5lZWQgdG8gc2F2ZSB0aGUgaW5kZXggb2YgYW4gZXh0ZXJuYWwgc3ltYm9sIHdoZW4gd2Ugd3JpdGUgaXQKLSAgIG91dCBzbyB0aGF0IGNhbiBzZXQgdGhlIHN5bWJvbCBpbmRleCBjb3JyZWN0bHkgd2hlbiB3ZSB3cml0ZSBvdXQKLSAgIHRoZSByZWxvY3MuICAqLwotI2RlZmluZSBlY29mZl9nZXRfc3ltX2luZGV4KHN5bWJvbCkgKChzeW1ib2wpLT51ZGF0YS5pKQotI2RlZmluZSBlY29mZl9zZXRfc3ltX2luZGV4KHN5bWJvbCwgaWR4KSAoKHN5bWJvbCktPnVkYXRhLmkgPSAoaWR4KSkKLQotLyogV2hlbiBnZW5lcmF0aW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUsIHRoZSBsaW5rZXIgcmVsYXhlcyB0aGUgY29kZQotICAgdG8gdHVybiBQQyByZWxhdGl2ZSBicmFuY2hlcyBpbnRvIGxvbmdlciBjb2RlIHNlcXVlbmNlcyB3aGVuIHRoZSBQQwotICAgcmVsYXRpdmUgYnJhbmNoIGlzIG91dCBvZiByYW5nZS4gIFRoaXMgaW52b2x2ZXMgcmVhZGluZyB0aGUgcmVsb2NzCi0gICBpbiBiZmRfcmVsYXhfc2VjdGlvbiBhcyB3ZWxsIGFzIGluIGJmZF9maW5hbF9saW5rLCBhbmQgcmVxdWlyZXMgdGhlCi0gICBjb2RlIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcmVsb2NzIGhhdmUgYmVlbiBleHBhbmRlZC4gIEEgcG9pbnRlcgotICAgdG8gdGhpcyBzdHJ1Y3R1cmUgaXMgcHV0IGluIHRoZSB1c2VkX2J5X2JmZCBwb2ludGVyIG9mIGEgc2VjdGlvbiB0bwotICAga2VlcCB0cmFjayBvZiB0aGlzIGluZm9ybWF0aW9uLiAgVGhlIHVzZXJfYnlfYmZkIHBvaW50ZXIgd2lsbCBiZQotICAgTlVMTCBpZiB0aGUgaW5mb3JtYXRpb24gd2FzIG5vdCBuZWVkZWQuICAqLwotCi1zdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgdW5zd2FwcGVkIHJlbG9jcyBmb3IgdGhpcyBzZWN0aW9uLiAgVGhlc2UgYXJlIHN0b3JlZCBpbgotICAgICBtZW1vcnkgc28gdGhlIGlucHV0IGZpbGUgZG9lcyBub3QgaGF2ZSB0byBiZSByZWFkIHR3aWNlLiAgKi8KLSAgUFRSIGV4dGVybmFsX3JlbG9jczsKLQotICAvKiBUaGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24uICBUaGVzZSBieXRlcyBtYXkgb3IgbWF5IG5vdCBiZSBzYXZlZAotICAgICBpbiBtZW1vcnksIGJ1dCBpZiBpdCBpcyB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGVtLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCi0gIC8qIE9mZnNldCBhZGp1c3RtZW50cyBmb3IgUEMgcmVsYXRpdmUgYnJhbmNoZXMuICBBIG51bWJlciBvdGhlciB0aGFuCi0gICAgIDEgaXMgYW4gYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlIGJyYW5jaCwgb3IgYSBzd2l0Y2ggdGFibGUgZW50cnkKLSAgICAgd2hpY2ggaXMgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIC50ZXh0IGxvY2F0aW9uczsgdGhpcyBhZGRlbmQKLSAgICAgYXJpc2VzIGJlY2F1c2UgdGhlIGJyYW5jaCBvciBkaWZmZXJlbmNlIGNyb3NzZXMgb25lIG9yIG1vcmUKLSAgICAgYnJhbmNoZXMgd2hpY2ggd2VyZSBleHBhbmRlZCBpbnRvIGEgbGFyZ2VyIGNvZGUgc2VxdWVuY2UuICBBIDEKLSAgICAgbWVhbnMgdGhhdCB0aGlzIGJyYW5jaCB3YXMgaXRzZWxmIGV4cGFuZGVkIGludG8gYSBsYXJnZXIgY29kZQotICAgICBzZXF1ZW5jZS4gIDEgaXMgbm90IGEgcG9zc2libGUgb2Zmc2V0LCBzaW5jZSBhbGwgb2Zmc2V0cyBtdXN0IGJlCi0gICAgIG11bHRpcGxlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2l6ZSwgd2hpY2ggaXMgNDsgYWxzbywgdGhlIG9ubHkKLSAgICAgcmVsb2NzIHdpdGggbm9uLXplcm8gb2Zmc2V0cyB3aWxsIGJlIFBDIHJlbGF0aXZlIGJyYW5jaGVzIG9yCi0gICAgIHN3aXRjaCB0YWJsZSBlbnRyaWVzIHdpdGhpbiB0aGUgc2FtZSBvYmplY3QgZmlsZS4gIElmIHRoaXMgZmllbGQKLSAgICAgaXMgTlVMTCwgbm8gYnJhbmNoZXMgd2VyZSBleHBhbmRlZCBhbmQgbm8gb2Zmc2V0cyBhcmUgcmVxdWlyZWQuCi0gICAgIE90aGVyd2lzZSB0aGVyZSBhcmUgYXMgbWFueSBlbnRyaWVzIGFzIHRoZXJlIGFyZSByZWxvY3MgaW4gdGhlCi0gICAgIHNlY3Rpb24sIGFuZCB0aGUgZW50cnkgZm9yIGFueSByZWxvYyB0aGF0IGlzIG5vdCBQQyByZWxhdGl2ZSBpcwotICAgICB6ZXJvLiAgKi8KLSAgbG9uZyAqb2Zmc2V0czsKLQotICAvKiBXaGVuIHByb2R1Y2luZyBhbiBleGVjdXRhYmxlIChpLmUuLCBmaW5hbCwgbm9uLXJlbG9jYXRhYmxlIGxpbmspCi0gICAgIG9uIHRoZSBBbHBoYSwgd2UgbWF5IG5lZWQgdG8gdXNlIG11bHRpcGxlIGdsb2JhbCBwb2ludGVyIHZhbHVlcwotICAgICB0byBzcGFuIHRoZSBlbnRpcmUgLmxpdGEgc2VjdGlvbi4gIEluIGVzc2VuY2UsIHdlIGFsbG93IGVhY2gKLSAgICAgaW5wdXQgLmxpdGEgc2VjdGlvbiB0byBoYXZlIGl0cyBvd24gZ3AgdmFsdWUuICBUbyBzdXBwb3J0IHRoaXMsCi0gICAgIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgZ3AgdmFsdWVzIHRoYXQgd2UgcGlja2VkIGZvciBlYWNoCi0gICAgIGlucHV0IC5saXRhIHNlY3Rpb24gLiAqLwotICBiZmRfdm1hIGdwOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBlY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGVjb2ZmX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSAoc2VjKS0+dXNlZF9ieV9iZmQpCi0KLS8qIEVDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gICovCi0gIGxvbmcgaW5keDsKLSAgLyogQkZEIHRoYXQgZXh0IGZpZWxkIHZhbHVlIGNhbWUgZnJvbS4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogRUNPRkYgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgRVhUUiBlc3ltOwotICAvKiBOb256ZXJvIGlmIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgY2hhciB3cml0dGVuOwotICAvKiBOb256ZXJvIGlmIHRoaXMgc3ltYm9sIHdhcyByZWZlcnJlZCB0byBhcyBzbWFsbCB1bmRlZmluZWQuICAqLwotICBjaGFyIHNtYWxsOwotfTsKLQotLyogRUNPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBNYWtlIGFuIEVDT0ZGIG9iamVjdC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFJlYWQgaW4gdGhlIEVDT0ZGIHN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLQotLyogR2VuZXJpYyBFQ09GRiBCRkQgYmFja2VuZCB2ZWN0b3JzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqX2JmZF9lY29mZl9hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNkZWZpbmUJX2JmZF9lY29mZl9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vawotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIF9iZmRfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIF9iZmRfZWNvZmZfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl93cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfZWNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2Vjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi1leHRlcm4gbG9uZyBfYmZkX2Vjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2Vjb2ZmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqYWxvY2F0aW9uKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9lY29mZl9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfcHJpbnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZXAsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX2dldF9zeW1ib2xfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEgb2Zmc2V0LAotCSAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHIsIGNvbnN0IGNoYXIgKipmbm5hbWVfcHRyLAotCSAgIHVuc2lnbmVkIGludCAqcmV0bGluZV9wdHIpKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIF9iZmRfZWNvZmZfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBfYmZkX2Vjb2ZmX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi1leHRlcm4gbG9uZyBfYmZkX2Vjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLS8qIGVjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBkZWZpbmVkIGJ5IGJhY2tlbmQuICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotZXh0ZXJuIGludCBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiByZWxvYykpOwotLyogZWNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBkZWZpbmVkIGJ5IGJhY2tlbmQuICAqLwotLyogZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gZGVmaW5lZCBieSBiYWNrZW5kLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9lY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBIb29rIGZ1bmN0aW9ucyBmb3IgdGhlIGdlbmVyaWMgQ09GRiBzZWN0aW9uIHJlYWRpbmcgY29kZS4gICovCi0KLWV4dGVybiBQVFIgX2JmZF9lY29mZl9ta29iamVjdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZWhkciwgUFRSIGFvdXRoZHIpKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKSkgYmZkX3ZvaWQpCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIFBUUiBmaWxlaGRyKSk7Ci1leHRlcm4gZmxhZ3dvcmQgX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncwotICBQQVJBTVMgKChiZmQgKmFiZmQsIFBUUiBoZHIsIGNvbnN0IGNoYXIgKm5hbWUsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogRUNPRkYgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHRoZSBzYW1lCi0gICBmb3IgYWxsIEVDT0ZGIHRhcmdldHMsIHNvIHRoZXkgYXJlIGRlZmluZWQgaW4gZWNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7CmRpZmYgLS1naXQgYS9iZmQvbGliaHBwYS5oIGIvYmZkL2xpYmhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMyZWFiZS4uMDAwMDAwMAotLS0gYS9iZmQvbGliaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzI5ICswLDAgQEAKLS8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfSFBQQV9ICi0jZGVmaW5lIF9IUFBBX0gKLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgUEFfUEFHRVNJWkUgMHgxMDAwCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgSU5MSU5FIGlubGluZQotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYgLyogR05VIEM/ICovCi0jZW5kaWYgLyogSU5MSU5FICovCi0KLSNpZiBfX0dOVUNfXyA+PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcKLS8qIERlY2xhcmUgdGhlIGZ1bmN0aW9ucyB3aXRoIHRoZSB1bnVzZWQgYXR0cmlidXRlIHRvIGF2b2lkIHdhcm5pbmdzLiAgKi8KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IGFzc2VtYmxlXzMgKHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdm9pZCBkaXNfYXNzZW1ibGVfMyAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IGFzc2VtYmxlXzEyICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdm9pZCBkaXNfYXNzZW1ibGVfMTIgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICosCi0JCQkJICAgIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIGFzc2VtYmxlXzE3ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkJCQkJIHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdm9pZCBkaXNfYXNzZW1ibGVfMTcgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICosCi0JCQkJICAgIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdm9pZCBkaXNfYXNzZW1ibGVfMjIgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICosCi0JCQkJICAgIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKiwKLQkJCQkgICAgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgYXNzZW1ibGVfMjEgKHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGUgKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzIxICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIHNpZ25fZXh0ZW5kICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IG9uZXMgKGludCkgX19hdHRyaWJ1dGUgKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgc2lnbl91bmV4dCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIGxvd19zaWduX2V4dGVuZCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgbG93X3NpZ25fdW5leHQgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBocHBhX2ZpZWxkX2FkanVzdCAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSBpbnQgYmZkX2hwcGFfaW5zbjJmbXQgKHVuc2lnbmVkIGxvbmcpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FICB1bnNpZ25lZCBsb25nIGhwcGFfcmVidWlsZF9pbnNuIChiZmQgKiwgdW5zaWduZWQgbG9uZywKLQkJCQkJCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci0jZW5kaWYgLyogZ2NjIDIuNyBvciBoaWdoZXIgKi8KLQotCi0vKiBUaGUgUEEgaW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLWVudW0gcGFfYXJjaCB7cGExMCA9IDEwLCBwYTExID0gMTEsIHBhMjAgPSAyMH07Ci0KLS8qIEhQIFBBLVJJU0MgcmVsb2NhdGlvbiB0eXBlcyAqLwotCi1lbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZQotICB7Ci0gICAgUl9IUFBBX0ZTRUwgPSAweDAsCi0gICAgUl9IUFBBX0xTU0VMID0gMHgxLAotICAgIFJfSFBQQV9SU1NFTCA9IDB4MiwKLSAgICBSX0hQUEFfTFNFTCA9IDB4MywKLSAgICBSX0hQUEFfUlNFTCA9IDB4NCwKLSAgICBSX0hQUEFfTERTRUwgPSAweDUsCi0gICAgUl9IUFBBX1JEU0VMID0gMHg2LAotICAgIFJfSFBQQV9MUlNFTCA9IDB4NywKLSAgICBSX0hQUEFfUlJTRUwgPSAweDgsCi0gICAgUl9IUFBBX05TRUwgID0gMHg5LAotICAgIFJfSFBQQV9OTFNFTCAgPSAweGEsCi0gICAgUl9IUFBBX05MUlNFTCAgPSAweGIsCi0gICAgUl9IUFBBX1BTRUwgPSAweGMsCi0gICAgUl9IUFBBX0xQU0VMID0gMHhkLAotICAgIFJfSFBQQV9SUFNFTCA9IDB4ZSwKLSAgICBSX0hQUEFfVFNFTCA9IDB4ZiwKLSAgICBSX0hQUEFfTFRTRUwgPSAweDEwLAotICAgIFJfSFBQQV9SVFNFTCA9IDB4MTEsCi0gICAgUl9IUFBBX0xUUFNFTCA9IDB4MTIsCi0gICAgUl9IUFBBX1JUUFNFTCA9IDB4MTMKLSAgfTsKLQotLyogL3Vzci9pbmNsdWRlL3JlbG9jLmggZGVmaW5lcyB0aGVzZSB0byBjb25zdGFudHMuICBXZSB3YW50IHRvIHVzZQotICAgdGhlbSBpbiBlbnVtcywgc28gI3VuZGVmIHRoZW0gYmVmb3JlIHdlIHN0YXJ0IHVzaW5nIHRoZW0uICBXZSBtaWdodAotICAgYmUgYWJsZSB0byBmaXggdGhpcyBhbm90aGVyIHdheSBieSBzaW1wbHkgbWFuYWdpbmcgbm90IHRvIGluY2x1ZGUKLSAgIC91c3IvaW5jbHVkZS9yZWxvYy5oLCBidXQgY3VycmVudGx5IEdEQiBwaWNrcyB1cCB0aGVzZSBkZWZpbmVzCi0gICBzb21ld2hlcmUuICAqLwotI3VuZGVmIGVfZnNlbAotI3VuZGVmIGVfbHNzZWwKLSN1bmRlZiBlX3Jzc2VsCi0jdW5kZWYgZV9sc2VsCi0jdW5kZWYgZV9yc2VsCi0jdW5kZWYgZV9sZHNlbAotI3VuZGVmIGVfcmRzZWwKLSN1bmRlZiBlX2xyc2VsCi0jdW5kZWYgZV9ycnNlbAotI3VuZGVmIGVfbnNlbAotI3VuZGVmIGVfbmxzZWwKLSN1bmRlZiBlX25scnNlbAotI3VuZGVmIGVfcHNlbAotI3VuZGVmIGVfbHBzZWwKLSN1bmRlZiBlX3Jwc2VsCi0jdW5kZWYgZV90c2VsCi0jdW5kZWYgZV9sdHNlbAotI3VuZGVmIGVfcnRzZWwKLSN1bmRlZiBlX29uZQotI3VuZGVmIGVfdHdvCi0jdW5kZWYgZV9wY3JlbAotI3VuZGVmIGVfY29uCi0jdW5kZWYgZV9wbGFiZWwKLSN1bmRlZiBlX2FicwotCi0vKiBmb3IgY29tcGF0aWJpbGl0eSAqLwotZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0Ci0gIHsKLSAgICBlX2ZzZWwgPSBSX0hQUEFfRlNFTCwKLSAgICBlX2xzc2VsID0gUl9IUFBBX0xTU0VMLAotICAgIGVfcnNzZWwgPSBSX0hQUEFfUlNTRUwsCi0gICAgZV9sc2VsID0gUl9IUFBBX0xTRUwsCi0gICAgZV9yc2VsID0gUl9IUFBBX1JTRUwsCi0gICAgZV9sZHNlbCA9IFJfSFBQQV9MRFNFTCwKLSAgICBlX3Jkc2VsID0gUl9IUFBBX1JEU0VMLAotICAgIGVfbHJzZWwgPSBSX0hQUEFfTFJTRUwsCi0gICAgZV9ycnNlbCA9IFJfSFBQQV9SUlNFTCwKLSAgICBlX25zZWwgPSBSX0hQUEFfTlNFTCwKLSAgICBlX25sc2VsID0gUl9IUFBBX05MU0VMLAotICAgIGVfbmxyc2VsID0gUl9IUFBBX05MUlNFTCwKLSAgICBlX3BzZWwgPSBSX0hQUEFfUFNFTCwKLSAgICBlX2xwc2VsID0gUl9IUFBBX0xQU0VMLAotICAgIGVfcnBzZWwgPSBSX0hQUEFfUlBTRUwsCi0gICAgZV90c2VsID0gUl9IUFBBX1RTRUwsCi0gICAgZV9sdHNlbCA9IFJfSFBQQV9MVFNFTCwKLSAgICBlX3J0c2VsID0gUl9IUFBBX1JUU0VMLAotICAgIGVfbHRwc2VsID0gUl9IUFBBX0xUUFNFTCwKLSAgICBlX3J0cHNlbCA9IFJfSFBQQV9SVFBTRUwKLSAgfTsKLQotZW51bSBocHBhX3JlbG9jX2V4cHJfdHlwZQotICB7Ci0gICAgUl9IUFBBX0VfT05FID0gMCwKLSAgICBSX0hQUEFfRV9UV08gPSAxLAotICAgIFJfSFBQQV9FX1BDUkVMID0gMiwKLSAgICBSX0hQUEFfRV9DT04gPSAzLAotICAgIFJfSFBQQV9FX1BMQUJFTCA9IDcsCi0gICAgUl9IUFBBX0VfQUJTID0gMTgKLSAgfTsKLQotLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KLWVudW0gaHBwYV9yZWxvY19leHByX3R5cGVfYWx0Ci0gIHsKLSAgICBlX29uZSA9IFJfSFBQQV9FX09ORSwKLSAgICBlX3R3byA9IFJfSFBQQV9FX1RXTywKLSAgICBlX3BjcmVsID0gUl9IUFBBX0VfUENSRUwsCi0gICAgZV9jb24gPSBSX0hQUEFfRV9DT04sCi0gICAgZV9wbGFiZWwgPSBSX0hQUEFfRV9QTEFCRUwsCi0gICAgZV9hYnMgPSBSX0hQUEFfRV9BQlMKLSAgfTsKLQotCi0vKiBSZWxvY2F0aW9ucyBmb3IgZnVuY3Rpb24gY2FsbHMgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBwYXJhbWV0ZXIKLSAgIHJlbG9jYXRpb24gYml0cy4gIFRoZXNlIGJpdHMgZGVzY3JpYmUgZXhhY3RseSB3aGVyZSB0aGUgY2FsbGVyIGhhcwotICAgcGxhY2VkIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cyBhbmQgd2hlcmUgaXQgZXhwZWN0cyB0byBmaW5kIGEgcmV0dXJuCi0gICB2YWx1ZS4KLQotICAgQm90aCBFTEYgYW5kIFNPTSBlbmNvZGUgdGhpcyBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGFkZGVuZCBmaWVsZAotICAgb2YgdGhlIGNhbGwgcmVsb2NhdGlvbi4gIChOb3RlIHRoaXMgY291bGQgYnJlYWsgdmVyeSBiYWRseSBpZiBvbmUKLSAgIHdhcyB0byBtYWtlIGEgY2FsbCBsaWtlIGJsIGZvbyArIDB4MTIzNDU2NzgpLgotCi0gICBUaGUgaGlnaCBvcmRlciAxMCBiaXRzIGNvbnRhaW4gcGFyYW1ldGVyIHJlbG9jYXRpb24gaW5mb3JtYXRpb24sCi0gICB0aGUgbG93IG9yZGVyIDIyIGJpdHMgY29udGFpbiB0aGUgY29uc3RhbnQgb2Zmc2V0LiAgKi8KLSAgIAotI2RlZmluZSBIUFBBX1JfQVJHX1JFTE9DKGEpCSgoKGEpID4+IDIyKSAmIDB4M0ZGKQotI2RlZmluZSBIUFBBX1JfQ09OU1RBTlQoYSkJKCgoKGludCkoYSkpIDw8IDEwKSA+PiAxMCkKLSNkZWZpbmUgSFBQQV9SX0FEREVORChyLGMpCSgoKHIpIDw8IDIyKSArICgoYykgJiAweDNGRkZGRikpCi0jZGVmaW5lIEhQUEFfV0lERQkgICAgICAgKDApIC8qIFBTVyBXLWJpdCwgbmVlZCB0byBjaGVjayEgRklYTUUgKi8KLQotLyogVGhlc2UgbWFjcm9zIGdldCBiaXQgZmllbGRzIHVzaW5nIEhQJ3MgbnVtYmVyaW5nIChNU0IgPSAwKSwKLSAqIGJ1dCBub3RlIHRoYXQgIk1BU0siIGFzc3VtZXMgdGhhdCB0aGUgTFNCIGJpdHMgYXJlIHdoYXQncwotICogd2FudGVkLgotICovCi0jaWZuZGVmIEdFVF9GSUVMRAotI2RlZmluZSBHRVRfRklFTEQoWCwgRlJPTSwgVE8pIFwKLSAgKChYKSA+PiAoMzEgLSAoVE8pKSAmICgoMSA8PCAoKFRPKSAtIChGUk9NKSArIDEpKSAtIDEpKQotI2VuZGlmICAKLSNkZWZpbmUgR0VUX0JJVChYLCBXSElDSCkgXAotICBHRVRfRklFTEQgKFgsIFdISUNILCBXSElDSCkKLQotI2RlZmluZSBNQVNLKFNJWkUpIFwKLSAgKH4oKC0xKSA8PCBTSVpFKSkKLSAgCi0jZGVmaW5lIENBVEVOQVRFKFgsIFhTSVpFLCBZLCBZU0laRSkgXAotICAoKChYICYgTUFTSyAoWFNJWkUpKSA8PCBZU0laRSkgfCAoWSAmIE1BU0sgKFlTSVpFKSkpCi0KLSNkZWZpbmUgRUxFVkVOKFgpIFwKLSAgQ0FURU5BVEUgKEdFVF9CSVQgKFgsIDEwKSwgMSwgR0VUX0ZJRUxEIChYLCAwLCA5KSwgMTApCi0gIAotLyogU29tZSBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBQQSBpbnN0cnVjdGlvbnMuICAqLwotCi0vKiBOT1RFOiB0aGVzZSB1c2UgdGhlIEhQIGNvbnZlbnRpb24gdGhhdCBmezF9IGlzIHRoZSBfbGVmdF8gbW9zdAotICogICAgICAgYml0IChNU0IpIG9mIGY7IHRoZXkgc29tZXRpbWVzIGhhdmUgdG8gaW1wb3NlIGFuIGFzc3VtcHRpb24KLSAqICAgICAgIGFib3V0IHRoZSBzaXplIG9mIGEgZmllbGQ7IGFuZCBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgbW9zdAotICogICAgICAgYXJlbid0IHVzZWQuCi0gKi8KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1zaWduX2V4dGVuZCAoeCwgbGVuKQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotewotICByZXR1cm4gKGludCkoeCA+PiAobGVuIC0gMSkgPyAoLTEgPDwgbGVuKSB8IHggOiB4KTsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLWFzc2VtYmxlXzMgKHgpCi0gICAgIHVuc2lnbmVkIGludCB4OwotewotICByZXR1cm4gQ0FURU5BVEUgKEdFVF9CSVQgKHgsIDIpLCAxLCBHRVRfRklFTEQgKHgsIDAsIDEpLCAyKTsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1kaXNfYXNzZW1ibGVfMyAoeCwgcikKLSAgICAgdW5zaWduZWQgaW50IHg7Ci0gICAgIHVuc2lnbmVkIGludCAqcjsKLXsKLSAgKnIgPSAoKCh4ICYgNCkgPj4gMikgfCAoKHggJiAzKSA8PCAxKSkgJiA3OwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotYXNzZW1ibGVfNiAoeCwgeSkKLSAgICAgdW5zaWduZWQgaW50IHgsIHk7Ci17Ci0gIHJldHVybiAoKCh4ICYgMHgxKSA8PCA1KSArICgzMiAtICh5ICYgMHgxZikpKTsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLWFzc2VtYmxlXzEyICh4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLXsKLSAgcmV0dXJuIENBVEVOQVRFIChDQVRFTkFURSAoeSwgMSwgR0VUX0JJVCAoeCwgMTApLCAxKSwgMiwKLSAJCSAgIEdFVF9GSUVMRCAoeCwgMCwgOSksIDkpOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc19hc3NlbWJsZV8xMiAoYXMxMiwgeCwgeSkKLSAgICAgdW5zaWduZWQgaW50IGFzMTI7Ci0gICAgIHVuc2lnbmVkIGludCAqeCwgKnk7Ci17Ci0gICp5ID0gKGFzMTIgJiAweDgwMCkgPj4gMTE7Ci0gICp4ID0gKChhczEyICYgMHgzZmYpIDw8IDEpIHwgKChhczEyICYgMHg0MDApID4+IDEwKTsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1hc3NlbWJsZV8xNiAoeCwgeSkKLSAgICAgdW5zaWduZWQgaW50IHgsIHk7Ci17Ci0gIC8qIERlcGVuZHMgb24gUFNXIFctYml0ICEqLwotICB1bnNpZ25lZCBpbnQgdGVtcDsKLQotICBpZiAoSFBQQV9XSURFKQotICAgIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKEdFVF9CSVQgKHksIDEzKSwgMSwKLQkJCSAgICAgICAoR0VUX0JJVCAoeSwgMTMpIF4gR0VUX0JJVCAoeCwgMCkpLCAxKSwgMiwKLQkJICAgICBDQVRFTkFURSAoKEdFVF9CSVQgKHksIDEzKSBeIEdFVF9CSVQgKHgsIDEpKSwgMSwKLQkJCSAgICAgICBHRVRfRklFTEQgKHksIDAsIDEyKSwgMTMpLCAxNCk7Ci0gIGVsc2UKLSAgICB0ZW1wID0gQ0FURU5BVEUgKENBVEVOQVRFIChHRVRfQklUICh5LCAxMyksIDEsIEdFVF9CSVQgKHksIDEzKSwgMSksIDIsCi0JCSAgICAgQ0FURU5BVEUgKEdFVF9CSVQgKHksIDEzKSwgMSwgR0VUX0ZJRUxEICh5LCAwLCAxMiksIDEzKSwgMTQpOwotCi0gIHJldHVybiBzaWduX2V4dGVuZCAodGVtcCwgMTYpOwotfQotCi0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotYXNzZW1ibGVfMTZhICh4LCB5LCB6KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeSwgejsKLXsKLSAgLyogRGVwZW5kcyBvbiBQU1cgVy1iaXQgISovCi0gIHVuc2lnbmVkIGludCB0ZW1wOwotCi0gIGlmIChIUFBBX1dJREUpCi0gICAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoeiwgMSwgKHogXiBHRVRfQklUICh4LCAwKSksIDEpLCAyLAotCQkgICAgIENBVEVOQVRFICgoeiBeIEdFVF9CSVQgKHgsIDEpKSwgMSwgeSwgMTEpLCAxMik7Ci0gIGVsc2UgCi0gICAgICB0ZW1wID0gQ0FURU5BVEUgKENBVEVOQVRFICh6LCAxLCB6LCAxKSwgMiwgQ0FURU5BVEUgKHosIDEsIHksIDExKSwgMTIpOwotCi0gIHJldHVybiBzaWduX2V4dGVuZCAoKHRlbXAgPDwgMiksIDE2KTsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1hc3NlbWJsZV8xNyAoeCwgeSwgeikKLSAgICAgdW5zaWduZWQgaW50IHgsIHksIHo7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQotICB0ZW1wID0gQ0FURU5BVEUgKENBVEVOQVRFICh6LCAxLCB4LCA1KSwgNiwKLQkJICAgQ0FURU5BVEUgKEdFVF9CSVQgKHksIDEwKSwgMSwgR0VUX0ZJRUxEICh5LCAwLCA5KSwgMTApLCAxMSk7Ci0gIAotICByZXR1cm4gdGVtcDsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1kaXNfYXNzZW1ibGVfMTcgKGFzMTcsIHgsIHksIHopCi0gICAgIHVuc2lnbmVkIGludCBhczE3OwotICAgICB1bnNpZ25lZCBpbnQgKngsICp5LCAqejsKLXsKLQotICAqeiA9IChhczE3ICYgMHgxMDAwMCkgPj4gMTY7Ci0gICp4ID0gKGFzMTcgJiAweDBmODAwKSA+PiAxMTsKLSAgKnkgPSAoKChhczE3ICYgMHgwMDQwMCkgPj4gMTApIHwgKChhczE3ICYgMHgzZmYpIDw8IDEpKSAmIDB4N2ZmOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc19hc3NlbWJsZV8yMiAoYXMyMiwgYSwgYiwgYywgZCkKLSAgICAgdW5zaWduZWQgaW50IGFzMjI7Ci0gICAgIHVuc2lnbmVkIGludCAqYSwgKmIsICpjLCAqZDsKLXsKLQotICAqZCA9IChhczIyICYgMHgyMDAwMDApID4+IDIxOwotICAqYSA9IChhczIyICYgMHgxZjAwMDApID4+IDE2OwotICAqYiA9IChhczIyICYgMHgwZjgwMCkgPj4gMTE7Ci0gICpjID0gKCgoYXMyMiAmIDB4MDA0MDApID4+IDEwKSB8ICgoYXMyMiAmIDB4M2ZmKSA8PCAxKSkgJiAweDdmZjsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1hc3NlbWJsZV8yMSAoeCkKLSAgICAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQotICB0ZW1wID0gKCh4ICYgMSkgPDwgMjApIHwKLSAgICAoKHggJiAweGZmZSkgPDwgOCkgfAotICAgICgoeCAmIDB4YzAwMCkgPj4gNykgfAotICAgICgoeCAmIDB4MWYwMDAwKSA+PiAxNCkgfAotICAgICgoeCAmIDB4MDAzMDAwKSA+PiAxMik7Ci0gIHJldHVybiB0ZW1wICYgMHgxZmZmZmY7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotYXNzZW1ibGVfMjIgKGEsYixjLGQpCi0gICAgIHVuc2lnbmVkIGludCBhLGIsYyxkOwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0gIAotICB0ZW1wID0gQ0FURU5BVEUgKENBVEVOQVRFIChkLCAxLCBhLCA1KSwgNiwKLQkJICAgQ0FURU5BVEUgKGIsIDUsIEVMRVZFTiAoYyksIDExKSwgMTYpOwotCi0gIHJldHVybiBzaWduX2V4dGVuZCAodGVtcCwgMjIpOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc19hc3NlbWJsZV8yMSAoYXMyMSwgeCkKLSAgICAgdW5zaWduZWQgaW50IGFzMjEsICp4OwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0KLQotICB0ZW1wID0gKGFzMjEgJiAweDEwMDAwMCkgPj4gMjA7Ci0gIHRlbXAgfD0gKGFzMjEgJiAweDBmZmUwMCkgPj4gODsKLSAgdGVtcCB8PSAoYXMyMSAmIDB4MDAwMTgwKSA8PCA3OwotICB0ZW1wIHw9IChhczIxICYgMHgwMDAwN2MpIDw8IDE0OwotICB0ZW1wIHw9IChhczIxICYgMHgwMDAwMDMpIDw8IDEyOwotICAqeCA9IHRlbXA7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1vbmVzIChuKQotICAgICBpbnQgbjsKLXsKLSAgdW5zaWduZWQgaW50IGxlbl9vbmVzOwotICBpbnQgaTsKLQotICBpID0gMDsKLSAgbGVuX29uZXMgPSAwOwotICB3aGlsZSAoaSA8IG4pCi0gICAgewotICAgICAgbGVuX29uZXMgPSAobGVuX29uZXMgPDwgMSkgfCAxOwotICAgICAgaSsrOwotICAgIH0KLQotICByZXR1cm4gbGVuX29uZXM7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotc2lnbl91bmV4dCAoeCwgbGVuLCByZXN1bHQpCi0gICAgIHVuc2lnbmVkIGludCB4LCBsZW47Ci0gICAgIHVuc2lnbmVkIGludCAqcmVzdWx0OwotewotICB1bnNpZ25lZCBpbnQgbGVuX29uZXM7Ci0KLSAgbGVuX29uZXMgPSBvbmVzIChsZW4pOwotCi0gICpyZXN1bHQgPSB4ICYgbGVuX29uZXM7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotbG93X3NpZ25fZXh0ZW5kICh4LCBsZW4pCi0gICAgIHVuc2lnbmVkIGludCB4LCBsZW47Ci17Ci0gIHJldHVybiAoaW50KSgoeCAmIDB4MSA/ICgtMSA8PCAobGVuIC0gMSkpIDogMCkgfCB4ID4+IDEpOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWxvd19zaWduX3VuZXh0ICh4LCBsZW4sIHJlc3VsdCkKLSAgICAgdW5zaWduZWQgaW50IHgsIGxlbjsKLSAgICAgdW5zaWduZWQgaW50ICpyZXN1bHQ7Ci17Ci0gIHVuc2lnbmVkIGludCB0ZW1wOwotICB1bnNpZ25lZCBpbnQgc2lnbjsKLSAgdW5zaWduZWQgaW50IHJlc3Q7Ci0gIHVuc2lnbmVkIGludCBvbmVfYml0X2F0X2xlbjsKLSAgdW5zaWduZWQgaW50IGxlbl9vbmVzOwotCi0gIGxlbl9vbmVzID0gb25lcyAobGVuKTsKLSAgb25lX2JpdF9hdF9sZW4gPSAxIDw8IChsZW4gLSAxKTsKLQotICBzaWduX3VuZXh0ICh4LCBsZW4sICZ0ZW1wKTsKLSAgc2lnbiA9IHRlbXAgJiBvbmVfYml0X2F0X2xlbjsKLSAgc2lnbiA+Pj0gKGxlbiAtIDEpOwotCi0gIHJlc3QgPSB0ZW1wICYgKGxlbl9vbmVzIF4gb25lX2JpdF9hdF9sZW4pOwotICByZXN0IDw8PSAxOwotCi0gICpyZXN1bHQgPSByZXN0IHwgc2lnbjsKLX0KLQotLyogSGFuZGxlIGZpZWxkIHNlbGVjdG9ycyBmb3IgUEEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1ocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGNvbnN0YW50X3ZhbHVlLCByX2ZpZWxkKQotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBsb25nIGNvbnN0YW50X3ZhbHVlOwotICAgICB1bnNpZ25lZCBzaG9ydCByX2ZpZWxkOwotewotICBzd2l0Y2ggKHJfZmllbGQpCi0gICAgewotICAgIGNhc2UgZV9mc2VsOgkJLyogRiAgOiBubyBjaGFuZ2UJCSAgICAgICovCi0gICAgY2FzZSBlX25zZWw6CQkvKiBOICA6IG5vIGNoYW5nZQkJICAgICAgICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xzc2VsOgkJLyogTFMgOiBpZiAoYml0IDIxKSB0aGVuIGFkZCAweDgwMAotCQkJCSAgIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cyAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICBpZiAodmFsdWUgJiAweDAwMDAwNDAwKQotCXZhbHVlICs9IDB4ODAwOwotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX3Jzc2VsOgkJLyogUlMgOiBTaWduIGV4dGVuZCBmcm9tIGJpdCAyMQkqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICBpZiAodmFsdWUgJiAweDAwMDAwNDAwKQotCXZhbHVlIHw9IDB4ZmZmZmY4MDA7Ci0gICAgICBlbHNlCi0JdmFsdWUgJj0gMHg3ZmY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9sc2VsOgkJLyogTCAgOiBBcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMgKi8KLSAgICBjYXNlIGVfbmxzZWw6CQkvKiBOTCAgOiBBcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX3JzZWw6CQkvKiBSICA6IFNldCBiaXRzIDAtMjAgdG8gemVybwkgICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIHZhbHVlID0gdmFsdWUgJiAweDdmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xkc2VsOgkJLyogTEQgOiBBZGQgMHg4MDAsIGFyaXRobWV0aWMgc2hpZnQKLQkJCQkgICByaWdodCAxMSBiaXRzCQkgICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIHZhbHVlICs9IDB4ODAwOwotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX3Jkc2VsOgkJLyogUkQgOiBTZXQgYml0cyAwLTIwIHRvIG9uZQkgICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSB8PSAweGZmZmZmODAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfbHJzZWw6CQkvKiBMUiA6IEwgd2l0aCAicm91bmRlZCIgY29uc3RhbnQgICAgICAqLwotICAgIGNhc2UgZV9ubHJzZWw6CQkvKiBOTFIgOiBOTCB3aXRoICJyb3VuZGVkIiBjb25zdGFudCAgICAgICovCi0gICAgICB2YWx1ZSA9IHZhbHVlICsgKChjb25zdGFudF92YWx1ZSArIDB4MTAwMCkgJiAweGZmZmZlMDAwKTsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9ycnNlbDoJCS8qIFJSIDogUiB3aXRoICJyb3VuZGVkIiBjb25zdGFudCAgICAgICovCi0gICAgICB2YWx1ZSA9IHZhbHVlICsgKChjb25zdGFudF92YWx1ZSArIDB4MTAwMCkgJiAweGZmZmZlMDAwKTsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHg3ZmYpICsgY29uc3RhbnRfdmFsdWUgLSAoKGNvbnN0YW50X3ZhbHVlICsgMHgxMDAwKSAmIDB4ZmZmZmUwMDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci0KLX0KLQotLyogUEEtUklTQyBPUENPREVTICovCi0jZGVmaW5lIGdldF9vcGNvZGUoaW5zbikJKChpbnNuKSAmIDB4ZmMwMDAwMDApID4+IDI2Ci0KLS8qIEZJWE1FOiB0aGlzIGxpc3QgaXMgaW5jb21wbGV0ZS4gIEl0IHNob3VsZCBhbHNvIGJlIGFuIGVudW1lcmF0ZWQKLSAgIHR5cGUgcmF0aGVyIHRoYW4gI2RlZmluZXMuICAqLwotCi0jZGVmaW5lIExETwkweDBkCi0jZGVmaW5lIExEQgkweDEwCi0jZGVmaW5lIExESAkweDExCi0jZGVmaW5lIExEVwkweDEyCi0jZGVmaW5lIExEV00JMHgxMwotI2RlZmluZSBTVEIJMHgxOAotI2RlZmluZSBTVEgJMHgxOQotI2RlZmluZSBTVFcJMHgxYQotI2RlZmluZSBTVFdNCTB4MWIKLSNkZWZpbmUgQ09NSUNMUgkweDI0Ci0jZGVmaW5lIFNVQkkJMHgyNQotI2RlZmluZSBTVUJJTwkweDI1Ci0jZGVmaW5lIEFERElUCTB4MmMKLSNkZWZpbmUgQURESVRPCTB4MmMKLSNkZWZpbmUgQURESQkweDJkCi0jZGVmaW5lIEFERElPCTB4MmQKLSNkZWZpbmUgTERJTAkweDA4Ci0jZGVmaW5lIEFERElMCTB4MGEKLQotI2RlZmluZSBNT1ZCCTB4MzIKLSNkZWZpbmUgTU9WSUIJMHgzMwotI2RlZmluZSBDT01CVAkweDIwCi0jZGVmaW5lIENPTUJGCTB4MjIKLSNkZWZpbmUgQ09NSUJUCTB4MjEKLSNkZWZpbmUgQ09NSUJGCTB4MjMKLSNkZWZpbmUgQUREQlQJMHgyOAotI2RlZmluZSBBRERCRgkweDJhCi0jZGVmaW5lIEFERElCVAkweDI5Ci0jZGVmaW5lIEFERElCRgkweDJiCi0jZGVmaW5lIEJWQgkweDMwCi0jZGVmaW5lIEJCCTB4MzEKLQotI2RlZmluZSBCTAkweDNhCi0jZGVmaW5lIEJMRQkweDM5Ci0jZGVmaW5lIEJFCTB4MzgKLQotI2RlZmluZSBDTVBCRFQJMHgyNwotI2RlZmluZSBDTVBCREYJMHgyZgotI2RlZmluZSBDTVBJQkQJMHgzYgotI2RlZmluZSBMREQJMHgxNAotI2RlZmluZSBTVEQJMHgxYwotI2RlZmluZSBMRFdMCTB4MTcKLSNkZWZpbmUgU1RXTAkweDFmCi0jZGVmaW5lIEZETFcgICAgMHgxNgotI2RlZmluZSBGU1RXICAgIDB4MWUKLSAgCi0vKiBHaXZlbiBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24sIHJldHVybiBpdHMgZm9ybWF0LgotCi0gICBGSVhNRTogIG9wY29kZXMgd2hpY2ggZG8gbm90IG1hcCB0byBhIGtub3duIGZvcm1hdAotICAgc2hvdWxkIHJldHVybiBhbiBlcnJvciBvZiBzb21lIHNvcnQuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotYmZkX2hwcGFfaW5zbjJmbXQgKGluc24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLXsKLSAgaW50IGZtdCA9IC0xOwotICB1bnNpZ25lZCBjaGFyIG9wID0gZ2V0X29wY29kZSAoaW5zbik7Ci0gIAotICBzd2l0Y2ggKG9wKQotICAgIHsKLSAgICBjYXNlIEFEREk6Ci0gICAgY2FzZSBBRERJVDoKLSAgICBjYXNlIFNVQkk6Ci0gICAgICBmbXQgPSAxMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9WQjoKLSAgICBjYXNlIE1PVklCOgotICAgIGNhc2UgQ09NQlQ6Ci0gICAgY2FzZSBDT01CRjoKLSAgICBjYXNlIENPTUlCVDoKLSAgICBjYXNlIENPTUlCRjoKLSAgICBjYXNlIEFEREJUOgotICAgIGNhc2UgQUREQkY6Ci0gICAgY2FzZSBBRERJQlQ6Ci0gICAgY2FzZSBBRERJQkY6Ci0gICAgY2FzZSBCVkI6Ci0gICAgY2FzZSBCQjoKLSAgICBjYXNlIENNUEJEVDoKLSAgICBjYXNlIENNUEJERjoKLSAgICBjYXNlIENNUElCRDoKLSAgICAgIGZtdCA9IDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRE86Ci0gICAgY2FzZSBMREI6Ci0gICAgY2FzZSBMREg6Ci0gICAgY2FzZSBMRFc6Ci0gICAgY2FzZSBMRFdNOgotICAgIGNhc2UgU1RCOgotICAgIGNhc2UgU1RIOgotICAgIGNhc2UgU1RXOgotICAgIGNhc2UgU1RXTToKLSAgICAgIGZtdCA9IDE0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRFdMOgotICAgIGNhc2UgU1RXTDoKLSAgICBjYXNlIEZETFc6Ci0gICAgY2FzZSBGU1RXOgotICAgICAgLyogVGhpcyBpcyBhIGhhY2suICBVbmZvcnR1bmF0ZWx5LCBmb3JtYXQgMTEgaXMgYWxyZWFkeSB0YWtlbgotCSBhbmQgd2UncmUgdXNpbmcgaW50ZWdlcnMgcmF0aGVyIHRoYW4gYW4gZW51bSwgc28gaXQncyBoYXJkCi0JIHRvIGRlc2NyaWJlIHRoZSAxMGEgZm9ybWF0LiAgKi8KLSAgICAgIGZtdCA9IC0xMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTEREOgotICAgIGNhc2UgU1REOgotICAgICAgZm10ID0gMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJMOgotICAgIGNhc2UgQkU6Ci0gICAgY2FzZSBCTEU6Ci0gICAgICBpZiAoKGluc24gJiAweDAwMDA4MDAwKSA9PSAweDAwMDA4MDAwKQotCXJldHVybiAyMjsKLSAgICAgIGZtdCA9IDE3OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRElMOgotICAgIGNhc2UgQURESUw6Ci0gICAgICBmbXQgPSAyMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmbXQgPSAzMjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIGZtdDsKLX0KLQotCi0vKiBJbnNlcnQgVkFMVUUgaW50byBJTlNOIHVzaW5nIFJfRk9STUFUIHRvIGRldGVybWluZSBleGFjdGx5IHdoYXQKLSAgIGJpdHMgdG8gY2hhbmdlLiAgKi8KLSAgIAotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1ocHBhX3JlYnVpbGRfaW5zbiAoYWJmZCwgaW5zbiwgdmFsdWUsIHJfZm9ybWF0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBsb25nIHJfZm9ybWF0OwotewotICB1bnNpZ25lZCBsb25nIGNvbnN0X3BhcnQ7Ci0gIHVuc2lnbmVkIGxvbmcgcmVidWlsdF9wYXJ0OwotCi0gIHN3aXRjaCAocl9mb3JtYXQpCi0gICAgewotICAgIGNhc2UgMTE6Ci0gICAgICB7Ci0JdW5zaWduZWQgdzEsIHc7Ci0KLQljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZmZmUwMDI7Ci0JZGlzX2Fzc2VtYmxlXzEyICh2YWx1ZSwgJncxLCAmdyk7Ci0JcmVidWlsdF9wYXJ0ID0gKHcxIDw8IDIpIHwgdzsKLQlyZXR1cm4gY29uc3RfcGFydCB8IHJlYnVpbHRfcGFydDsKLSAgICAgIH0KLQotICAgIGNhc2UgMTI6Ci0gICAgICB7Ci0JdW5zaWduZWQgdzEsIHc7Ci0KLQljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZmZmUwMDI7Ci0JZGlzX2Fzc2VtYmxlXzEyICh2YWx1ZSwgJncxLCAmdyk7Ci0JcmVidWlsdF9wYXJ0ID0gKHcxIDw8IDIpIHwgdzsKLQlyZXR1cm4gY29uc3RfcGFydCB8IHJlYnVpbHRfcGFydDsKLSAgICAgIH0KLQotICAgIGNhc2UgMTQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGV4dDsKLQkKLQljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZmZmMwMDA7Ci0JbG93X3NpZ25fdW5leHQgKHZhbHVlLCAxNCwgJmV4dCk7Ci0JcmV0dXJuIGNvbnN0X3BhcnQgfCBleHQ7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDE3OgotICAgICAgewotCXVuc2lnbmVkIHcxLCB3MiwgdzsKLQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmUwZTAwMjsKLQlkaXNfYXNzZW1ibGVfMTcgKHZhbHVlLCAmdzEsICZ3MiwgJncpOwotCXJlYnVpbHRfcGFydCA9ICh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3OwotCXJldHVybiBjb25zdF9wYXJ0IHwgcmVidWlsdF9wYXJ0OwotICAgICAgfQotCi0gICAgY2FzZSAyMToKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgdzsKLQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmUwMDAwMDsKLQlkaXNfYXNzZW1ibGVfMjEgKHZhbHVlLCAmdyk7Ci0JcmV0dXJuIGNvbnN0X3BhcnQgfCB3OwotICAgICAgfQotCi0gICAgY2FzZSAzMjoKLSAgICAgIGNvbnN0X3BhcnQgPSAwOwotICAgICAgcmV0dXJuIHZhbHVlOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLSNlbmRpZiAvKiBfSFBQQV9IICovCmRpZmYgLS1naXQgYS9iZmQvbGliaWVlZS5oIGIvYmZkL2xpYmllZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlODA2ZS4uMDAwMDAwMAotLS0gYS9iZmQvbGliaWVlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qIElFRUUtNjk1IG9iamVjdCBmaWxlIGZvcm1hdHM6ICBkZWZpbml0aW9ucyBpbnRlcm5hbCB0byBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBNb3N0bHkgU3RldmUgQ2hhbWJlcmxhaW4ncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBpbmRleDoyNDsKLSAgY2hhciBsZXR0ZXI7Ci19IGllZWVfc3ltYm9sX2luZGV4X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGN0IHsKLSAgYmZkICp0aGlzOwotICBzdHJ1Y3QgY3QgKm5leHQ7Ci19IGJmZF9jaGFpbl90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3N5bWJvbCAKLXsKLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIHN0cnVjdCBpZWVlX3N5bWJvbCAqbmV4dDsKLQotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci19IGllZWVfc3ltYm9sX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9yZWxvYyB7Ci0gIGFyZWxlbnQgcmVsZW50OwotICBzdHJ1Y3QgaWVlZV9yZWxvYyAqbmV4dDsKLSAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci0KLX0gaWVlZV9yZWxvY190eXBlOwotCi0jZGVmaW5lIGllZWVfc3ltYm9sKHgpICgoaWVlZV9zeW1ib2xfdHlwZSAqKSh4KSkKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9wZXJfc2VjdGlvbgotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBiZmRfdm1hIHBjOwotICAvKiBGb3Igb3V0cHV0ICovCi0gIGZpbGVfcHRyIGN1cnJlbnRfcG9zOwotICB1bnNpZ25lZCBpbnQgY3VycmVudF9ieXRlOwotICBib29sZWFuIGluaXRpYWxpemVkOwotICBpZWVlX3JlbG9jX3R5cGUgKipyZWxvY190YWlsX3B0cjsKLX0gaWVlZV9wZXJfc2VjdGlvbl90eXBlOwotCi0jZGVmaW5lIGllZWVfcGVyX3NlY3Rpb24oeCkgKChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikoKHgpLT51c2VkX2J5X2JmZCkpCi0gIAotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCAgY2hhciAqaW5wdXRfcDsKLSAgdW5zaWduZWQgY2hhciAqZmlyc3RfYnl0ZTsKLSAgYmZkICphYmZkOwotfSBjb21tb25faGVhZGVyX3R5cGUgOwotCi10eXBlZGVmIHN0cnVjdCBpZWVlX2RhdGFfc3RydWN0Ci17Ci0gIGNvbW1vbl9oZWFkZXJfdHlwZSBoOwotICBib29sZWFuIHJlYWRfc3ltYm9sczsKLSAgYm9vbGVhbiByZWFkX2RhdGE7CQotICBmaWxlX3B0ciBvdXRwdXRfY3Vyc29yOwotICAvKiBNYXAgb2Ygc2VjdGlvbiBpbmRleGVzIHRvIHNlY3Rpb24gcHRycyAqLwotICBhc2VjdGlvbiAqKnNlY3Rpb25fdGFibGU7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX3RhYmxlX3NpemU7Ci0gIGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX3R5cGUgYWQ7Ci0gIGllZWVfbW9kdWxlX2JlZ2luX3R5cGUgbWI7Ci0gIGllZWVfd192YXJpYWJsZV90eXBlIHc7Ci0gIAotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKLSAgCi0gIHVuc2lnbmVkIGludCBtYXBfaWR4OwotICAvKiBMaXN0IG9mIEdMT0JBTCBFWFBPUlQgc3ltYm9scyAqLwotICBpZWVlX3N5bWJvbF90eXBlICpleHRlcm5hbF9zeW1ib2xzOwotICAvKiBMaXN0IG9mIFVOREVGSU5FRCBzeW1ib2xzICovCi0gIGllZWVfc3ltYm9sX3R5cGUgKmV4dGVybmFsX3JlZmVyZW5jZTsKLSAgCi0gIC8qIFdoZW4gdGhlIHN5bWJvbHMgaGF2ZSBiZWVuIGNhbm9uaWNhbGl6ZWQsIHRoZXkgYXJlIGluIGEKLSAgICAqIHNwZWNpYWwgb3JkZXIsIHdlIHJlbWVtYmVyIHZhcmlvdXMgYmFzZXMgaGVyZS4uICovCi0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleDsKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3N5bWJvbF9jb3VudDsKLSAgaW50IGV4dGVybmFsX3N5bWJvbF9iYXNlX29mZnNldDsKLSAgCi0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWZlcmVuY2VfbWF4X2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleDsKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9jb3VudDsKLSAgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldDsKLSAgCi0KLSAgYm9vbGVhbiBzeW1ib2xfdGFibGVfZnVsbDsKLQotICAKLWJvb2xlYW4gZG9uZV9kZWJ1ZzsKLQotCi1iZmRfY2hhaW5fdHlwZSAqY2hhaW5faGVhZDsKLWJmZF9jaGFpbl90eXBlICpjaGFpbl9yb290OwotCi19IGllZWVfZGF0YV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwotICBiZmQgKmFiZmQ7Ci19IGllZWVfYXJfb2JzdGFja190eXBlOwotCi10eXBlZGVmIHN0cnVjdCBpZWVlX2FyX2RhdGFfc3RydWN0IAotewotICBjb21tb25faGVhZGVyX3R5cGUgaDsKLSAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKmVsZW1lbnRzOwotICAKLSAgdW5zaWduZWQgIGludCBlbGVtZW50X2luZGV4IDsKLSAgdW5zaWduZWQgaW50IGVsZW1lbnRfY291bnQ7Ci0KLX0gaWVlZV9hcl9kYXRhX3R5cGU7Ci0KLSNkZWZpbmUgSUVFRV9EQVRBKGFiZmQpICgoYWJmZCktPnRkYXRhLmllZWVfZGF0YSkKLSNkZWZpbmUgSUVFRV9BUl9EQVRBKGFiZmQpICgoYWJmZCktPnRkYXRhLmllZWVfYXJfZGF0YSkKLQotI2RlZmluZSBwdHIoYWJmZCkgKGllZWVfZGF0YShhYmZkKS0+aW5wdXRfcCkKZGlmZiAtLWdpdCBhL2JmZC9saWJubG0uaCBiL2JmZC9saWJubG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkMmU0ZS4uMDAwMDAwMAotLS0gYS9iZmQvbGlibmxtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMpIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9MSUJOTE1fSF8KLSNkZWZpbmUgX0xJQk5MTV9IXyAxCi0KLSNpZmRlZiBBUkNIX1NJWkUKLSMgIGRlZmluZSBOTE1fQVJDSF9TSVpFIEFSQ0hfU0laRQotI2VuZGlmCi0jaW5jbHVkZSAibmxtL2NvbW1vbi5oIgotI2luY2x1ZGUgIm5sbS9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIm5sbS9leHRlcm5hbC5oIgotCi0vKiBBIHJlbG9jIGZvciBhbiBpbXBvcnRlZCBOTE0gc3ltYm9sLiAgTm9ybWFsIHJlbG9jcyBhcmUgYXNzb2NpYXRlZAotICAgd2l0aCBzZWN0aW9ucywgYW5kIGluY2x1ZGUgYSBzeW1ib2wuICBUaGVzZSByZWxvY3MgYXJlIGFzc29jaWF0ZWQKLSAgIHdpdGggKHVuZGVmaW5lZCkgc3ltYm9scywgYW5kIGluY2x1ZGUgYSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IG5sbV9yZWxlbnQKLXsKLSAgLyogU2VjdGlvbiBvZiByZWxvYy4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwotICAvKiBSZWxvYyBpbmZvIChzeW1fcHRyX3B0ciBmaWVsZCBzZXQgb25seSB3aGVuIGNhbm9uaWNhbGl6ZWQpLiAgKi8KLSAgYXJlbGVudCByZWxvYzsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGFuIE5MTSBzeW1ib2wuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBCRkQgc3ltYm9sLiAgKi8KLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIC8qIE51bWJlciBvZiByZWxvYyBlbnRyaWVzIGZvciBpbXBvcnRlZCBzeW1ib2wuICAqLwotICBiZmRfc2l6ZV90eXBlIHJjbnQ7Ci0gIC8qIEFycmF5IG9mIHJlbG9jIGluZm9ybWF0aW9uIGZvciBpbXBvcnRlZCBzeW1ib2wuICAqLwotICBzdHJ1Y3QgbmxtX3JlbGVudCAqcmVsb2NzOwotfSBubG1OQU1FKHN5bWJvbF90eXBlKTsKLQotZXh0ZXJuIGJvb2xlYW4gbmxtX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBubG1fc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcpKTsKLQotZXh0ZXJuIHZvaWQgbmxtTkFNRShnZXRfc3ltYm9sX2luZm8pCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLWV4dGVybiBsb25nIG5sbU5BTUUoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSAgICAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIG5sbU5BTUUoZ2V0X3N5bXRhYikKLSAgICAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBhc3ltYm9sICpubG1OQU1FKG1ha2VfZW1wdHlfc3ltYm9sKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHZvaWQgbmxtTkFNRShwcmludF9zeW1ib2wpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci1leHRlcm4gbG9uZyBubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSAgICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBsb25nIG5sbU5BTUUoY2Fub25pY2FsaXplX3JlbG9jKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKm5sbU5BTUUob2JqZWN0X3ApCi0gICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBubG1OQU1FKHNldF9hcmNoX21hY2gpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBib29sZWFuIG5sbU5BTUUoc2V0X3NlY3Rpb25fY29udGVudHMpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gYm9vbGVhbiBubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cykKLSAgICAgUEFSQU1TICgoYmZkICopKTsKLQotLyogU29tZSBwcml2YXRlIGRhdGEgaXMgc3Rhc2hlZCBhd2F5IGZvciBmdXR1cmUgdXNlIHVzaW5nIHRoZSB0ZGF0YSBwb2ludGVyCi0gICBpbiB0aGUgYmZkIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBubG1fb2JqX3RkYXRhCi17Ci0gIC8qIEFjdHVhbCBkYXRhLCBidXQgcmVmIGxpa2UgcHRyICovCi0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIJbmxtX2ZpeGVkX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlcglubG1fdmFyaWFibGVfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIJbmxtX3ZlcnNpb25faGRyWzFdOwotICBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcglubG1fY29weXJpZ2h0X2hkclsxXTsKLSAgTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlcglubG1fZXh0ZW5kZWRfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcglubG1fY3VzdG9tX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyIG5sbV9jeWdudXNfZXh0X2hkclsxXTsKLSAgLyogQkZEIE5MTSBzeW1ib2xzLiAgKi8KLSAgbmxtTkFNRShzeW1ib2xfdHlwZSkJCSpubG1fc3ltYm9sczsKLSAgLyogTG93ZXN0IHRleHQgYW5kIGRhdGEgVk1BIHZhbHVlcy4gICovCi0gIGJmZF92bWEJCQlubG1fdGV4dF9sb3c7Ci0gIGJmZF92bWEJCQlubG1fZGF0YV9sb3c7Ci0gIC8qIENhY2hlcyBmb3IgZGF0YSByZWFkIGZyb20gb2JqZWN0IGZpbGUuICAqLwotICBhcmVsZW50ICoJCQlubG1fcmVsb2NfZml4dXBzOwotICBhc2VjdGlvbiAqKgkJCW5sbV9yZWxvY19maXh1cF9zZWNzOwotICAvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgYSBwb2ludGVyLAotICAgICBidXQgdGhhdCB3b3VsZCByZXF1aXJlIHlldCBhbm90aGVyIGVudHJ5IHBvaW50IHRvIGluaXRpYWxpemUgdGhlCi0gICAgIHN0cnVjdHVyZS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0CS8qIEFscGhhIGJhY2tlbmQgaW5mb3JtYXRpb24uICAqLwotCXsKLQkgIGJmZF92bWEgZ3A7CQkJLyogR1AgdmFsdWUuICAqLwotCSAgYmZkX3ZtYSBsaXRhX2FkZHJlc3M7CQkvKiAubGl0YSBzZWN0aW9uIGFkZHJlc3MuICAqLwotCSAgYmZkX3NpemVfdHlwZSBsaXRhX3NpemU7CS8qIC5saXRhIHNlY3Rpb24gc2l6ZS4gICovCi0JfQotICAgICAgYWxwaGFfYmFja2VuZF9kYXRhOwotICAgIH0KLSAgYmFja2VuZF9kYXRhOwotfTsKLQotI2RlZmluZSBubG1fdGRhdGEoYmZkKQkJCSgoYmZkKSAtPiB0ZGF0YS5ubG1fb2JqX2RhdGEpCi0jZGVmaW5lIG5sbV9maXhlZF9oZWFkZXIoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9maXhlZF9oZHIpCi0jZGVmaW5lIG5sbV92YXJpYWJsZV9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3ZhcmlhYmxlX2hkcikKLSNkZWZpbmUgbmxtX3ZlcnNpb25faGVhZGVyKGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdmVyc2lvbl9oZHIpCi0jZGVmaW5lIG5sbV9jb3B5cmlnaHRfaGVhZGVyKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9jb3B5cmlnaHRfaGRyKQotI2RlZmluZSBubG1fZXh0ZW5kZWRfaGVhZGVyKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9leHRlbmRlZF9oZHIpCi0jZGVmaW5lIG5sbV9jdXN0b21faGVhZGVyKGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fY3VzdG9tX2hkcikKLSNkZWZpbmUgbmxtX2N5Z251c19leHRfaGVhZGVyKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9jeWdudXNfZXh0X2hkcikKLSNkZWZpbmUgbmxtX2dldF9zeW1ib2xzKGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fc3ltYm9scykKLSNkZWZpbmUgbmxtX3NldF9zeW1ib2xzKGJmZCwgcCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fc3ltYm9scyA9IChwKSkKLSNkZWZpbmUgbmxtX3NldF90ZXh0X2xvdyhiZmQsIGkpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdGV4dF9sb3cgPSAoaSkpCi0jZGVmaW5lIG5sbV9nZXRfdGV4dF9sb3coYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV90ZXh0X2xvdykKLSNkZWZpbmUgbmxtX3NldF9kYXRhX2xvdyhiZmQsIGkpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZGF0YV9sb3cgPSAoaSkpCi0jZGVmaW5lIG5sbV9nZXRfZGF0YV9sb3coYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9kYXRhX2xvdykKLSNkZWZpbmUgbmxtX3JlbG9jYXRpb25fZml4dXBzKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9yZWxvY19maXh1cHMpCi0jZGVmaW5lIG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MoYmZkKQkobmxtX3RkYXRhKGJmZCktPm5sbV9yZWxvY19maXh1cF9zZWNzKQotCi0jZGVmaW5lIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEoYmZkKSBcCi0gICgmbmxtX3RkYXRhIChiZmQpLT5iYWNrZW5kX2RhdGEuYWxwaGFfYmFja2VuZF9kYXRhKQotCi0vKiBUaGlzIGlzIHVzZWQgd2hlbiB3cml0aW5nIG91dCB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAqLwotCi1zdHJ1Y3QgcmVsb2NfYW5kX3NlYwotewotICBhcmVsZW50ICpyZWw7Ci0gIGFzZWN0aW9uICpzZWM7Ci19OwotCi0vKiBXZSBzdG9yZSBzb21lIGZ1bmN0aW9uIHBvaW50ZXIgaW4gdGhlIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhpcyBsZXRzCi0gICBkaWZmZXJlbnQgTkxNIHRhcmdldHMgc2hhcmUgbW9zdCBvZiB0aGUgc2FtZSBjb2RlLCB3aGlsZSBwcm92aWRpbmcKLSAgIHNsaWdodGx5IGRpZmZlcmVudCBjb2RlIHdoZXJlIG5lY2Vzc2FyeS4gICovCi0KLXN0cnVjdCBubG1fYmFja2VuZF9kYXRhCi17Ci0gIC8qIFNpZ25hdHVyZSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgY2hhciBzaWduYXR1cmVbTkxNX1NJR05BVFVSRV9TSVpFXTsKLSAgLyogU2l6ZSBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBmaXhlZF9oZWFkZXJfc2l6ZTsKLSAgLyogU2l6ZSBvZiBvcHRpb25hbCBwcmVmaXggZm9yIHRoaXMgYmFja2VuZC4gIFNvbWUgYmFja2VuZCBtYXkKLSAgICAgcmVxdWlyZSB0aGlzIHRvIGJlIGEgZnVuY3Rpb24sIGJ1dCBzbyBmYXIgYSBjb25zdGFudCBpcyBPSy4gIFRoaXMKLSAgICAgaXMgZm9yIGEgcHJlZml4IHdoaWNoIHByZWNlZGVzIHRoZSBzdGFuZGFyZCBOTE0gZml4ZWQgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBvcHRpb25hbF9wcmVmaXhfc2l6ZTsKLSAgLyogQXJjaGl0ZWN0dXJlLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIC8qIE1hY2hpbmUuICAqLwotICBsb25nIG1hY2g7Ci0gIC8qIFNvbWUgTkxNIGZvcm1hdHMgZG8gbm90IHVzZSB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHNlY3Rpb24sIHNvCi0gICAgIGFsbCB1bmluaXRpYWxpemVkIGRhdGEgbXVzdCBiZSBwdXQgaW50byB0aGUgcmVndWxhciBkYXRhIHNlY3Rpb24KLSAgICAgaW5zdGVhZC4gICovCi0gIGJvb2xlYW4gbm9fdW5pbml0aWFsaXplZF9kYXRhOwotICAvKiBTb21lIE5MTSBmb3JtYXRzIGhhdmUgYSBwcmVmaXggb24gdGhlIGZpbGUuICBJZiB0aGlzIGZ1bmN0aW9uIGlzCi0gICAgIG5vdCBOVUxMLCBpdCB3aWxsIGJlIGNhbGxlZCBieSBubG1fb2JqZWN0X3AuICBJdCBzaG91bGQgcmV0dXJuCi0gICAgIHRydWUgaWYgdGhpcyBmaWxlIGNvdWxkIG1hdGNoIHRoaXMgZm9ybWF0LCBhbmQgaXQgc2hvdWxkIGxlYXZlCi0gICAgIHRoZSBCRkQgc3VjaCB0aGF0IGEgYmZkX3JlYWQgd2lsbCBwaWNrIHVwIHRoZSBmaXhlZCBoZWFkZXIuICAqLwotICBib29sZWFuICgqbmxtX2JhY2tlbmRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIC8qIFdyaXRlIG91dCB0aGUgcHJlZml4LiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgTlVMTC4gIFRoaXMgbXVzdAotICAgICB3cml0ZSBvdXQgdGhlIHNhbWUgbnVtYmVyIG9mIGJ5dGVzIGFzIGlzIGluIHRoZSBmaWVsZAotICAgICBvcHRpb25hbF9wcmVmaXhfc2l6ZS4gICovCi0gIGJvb2xlYW4gKCpubG1fd3JpdGVfcHJlZml4KSBQQVJBTVMgKChiZmQgKikpOwotICAvKiBSZWFkIGEgcmVsb2NhdGlvbiBmaXh1cCBmcm9tIGFiZmQuICBUaGUgcmVsb2MgaW5mb3JtYXRpb24gaXMKLSAgICAgbWFjaGluZSBzcGVjaWZpYy4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHN5bWJvbCBpZiB0aGlzIGlzCi0gICAgIGFuIGltcG9ydCwgb3IgTlVMTCBpZiB0aGlzIGlzIGEgcmVsb2MgZml4dXAuICBUaGlzIGZ1bmN0aW9uCi0gICAgIHNob3VsZCBzZXQgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSBzZWN0aW9uIHdoaWNoIHRoZSByZWxvYwotICAgICBiZWxvbmdzIGluLCBhbmQgdGhlIGZvdXJ0aCBhcmd1bWVudCB0byB0aGUgcmVsb2MgaXRzZWxmOyBpdCBkb2VzCi0gICAgIG5vdCBuZWVkIHRvIGZpbGwgaW4gdGhlIHN5bV9wdHJfcHRyIGZpZWxkIGZvciBhIHJlbG9jIGFnYWluc3QgYW4KLSAgICAgaW1wb3J0IHN5bWJvbC4gICovCi0gIGJvb2xlYW4gKCpubG1fcmVhZF9yZWxvYykgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosCi0JCQkJICAgICBhc2VjdGlvbiAqKiwgYXJlbGVudCAqKSk7Ci0gIC8qIFRvIG1ha2Ugb2JqY29weSB0byBhbiBpMzg2IE5MTSB3b3JrLCB0aGUgaTM4NiBiYWNrZW5kIG5lZWRzIGEKLSAgICAgY2hhbmNlIHRvIHdvcmsgb3ZlciB0aGUgcmVsb2NzLiAgVGhpcyBpcyBhIGJpdCBpY2t5LiAgKi8KLSAgYm9vbGVhbiAoKm5sbV9tYW5nbGVfcmVsb2NzKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGRhdGEsCi0JCQkJCWJmZF92bWEgb2Zmc2V0LAotCQkJCQliZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0gIC8qIFJlYWQgYW4gaW1wb3J0IHJlY29yZCBmcm9tIGFiZmQuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoaXMKLSAgICAgd2VyZSBpbiBhIG1hY2hpbmUtZGVwZW5kZW50IGZvcm1hdCwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byBiZS4gKi8KLSAgYm9vbGVhbiAoKm5sbV9yZWFkX2ltcG9ydCkgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLSAgLyogV3JpdGUgYW4gaW1wb3J0IHJlY29yZCB0byBhYmZkLiAqLwotICBib29sZWFuICgqbmxtX3dyaXRlX2ltcG9ydCkgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotICAvKiBTZXQgdGhlIHNlY3Rpb24gZm9yIGEgcHVibGljIHN5bWJvbC4gIFRoaXMgbWF5IGJlIE5VTEwsIGluIHdoaWNoCi0gICAgIGNhc2UgYSBkZWZhdWx0IG1ldGhvZCB3aWxsIGJlIHVzZWQuICAqLwotICBib29sZWFuICgqbmxtX3NldF9wdWJsaWNfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLSAgLyogR2V0IHRoZSBvZmZzZXQgdG8gd3JpdGUgb3V0IGZvciBhIHB1YmxpYyBzeW1ib2wuICBUaGlzIG1heSBiZQotICAgICBOVUxMLCBpbiB3aGljaCBjYXNlIGEgZGVmYXVsdCBtZXRob2Qgd2lsbCBiZSB1c2VkLiAgKi8KLSAgYmZkX3ZtYSAoKm5sbV9nZXRfcHVibGljX29mZnNldCkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotICAvKiBTd2FwIHRoZSBmaXhlZCBoZWFkZXIgaW4gYW5kIG91dCAqLwotICB2b2lkICgqbmxtX3N3YXBfZmhkcl9pbikgUEFSQU1TICgoYmZkICosCi0JCQkJICAgIFBUUiwKLQkJCQkgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqKSk7Ci0gIHZvaWQgKCpubG1fc3dhcF9maGRyX291dCkgUEFSQU1TICgoYmZkICosCi0JCQkJICAgICBzdHJ1Y3QgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlciAqLAotCQkJCSAgICAgUFRSKSk7Ci0gIC8qIFdyaXRlIG91dCBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotICBib29sZWFuICgqbmxtX3dyaXRlX2V4dGVybmFsKSBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwKLQkJCQkJIGFzeW1ib2wgKiwKLQkJCQkJIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLSAgYm9vbGVhbiAoKm5sbV93cml0ZV9leHBvcnQpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZF92bWEpKTsKLX07Ci0KLSNkZWZpbmUgbmxtX2JhY2tlbmQoYmZkKSBcCi0gICgoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgKikoKGJmZCkgLT4geHZlYyAtPiBiYWNrZW5kX2RhdGEpKQotI2RlZmluZSBubG1fc2lnbmF0dXJlKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBzaWduYXR1cmUpCi0jZGVmaW5lIG5sbV9maXhlZF9oZWFkZXJfc2l6ZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gZml4ZWRfaGVhZGVyX3NpemUpCi0jZGVmaW5lIG5sbV9vcHRpb25hbF9wcmVmaXhfc2l6ZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gb3B0aW9uYWxfcHJlZml4X3NpemUpCi0jZGVmaW5lIG5sbV9hcmNoaXRlY3R1cmUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IGFyY2gpCi0jZGVmaW5lIG5sbV9tYWNoaW5lKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBtYWNoKQotI2RlZmluZSBubG1fbm9fdW5pbml0aWFsaXplZF9kYXRhKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBub191bmluaXRpYWxpemVkX2RhdGEpCi0jZGVmaW5lIG5sbV9iYWNrZW5kX29iamVjdF9wX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9iYWNrZW5kX29iamVjdF9wKQotI2RlZmluZSBubG1fd3JpdGVfcHJlZml4X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9wcmVmaXgpCi0jZGVmaW5lIG5sbV9yZWFkX3JlbG9jX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9yZWFkX3JlbG9jKQotI2RlZmluZSBubG1fbWFuZ2xlX3JlbG9jc19mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fbWFuZ2xlX3JlbG9jcykKLSNkZWZpbmUgbmxtX3JlYWRfaW1wb3J0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9yZWFkX2ltcG9ydCkKLSNkZWZpbmUgbmxtX3dyaXRlX2ltcG9ydF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfaW1wb3J0KQotI2RlZmluZSBubG1fc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9zZXRfcHVibGljX3NlY3Rpb24pCi0jZGVmaW5lIG5sbV9nZXRfcHVibGljX29mZnNldF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fZ2V0X3B1YmxpY19vZmZzZXQpCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fc3dhcF9maGRyX2luKQotI2RlZmluZSBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9zd2FwX2ZoZHJfb3V0KQotI2RlZmluZSBubG1fd3JpdGVfZXh0ZXJuYWxfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX2V4dGVybmFsKQotI2RlZmluZSBubG1fd3JpdGVfZXhwb3J0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9leHBvcnQpCi0KLS8qIFRoZSBOTE0gY29kZSwgZGF0YSwgYW5kIHVuaW5pdGlhbGl6ZWQgc2VjdGlvbnMgaGF2ZSBubyBuYW1lcyBkZWZpbmVkCi0gICBpbiB0aGUgTkxNLCBidXQgYmZkIHdhbnRzIHRvIGdpdmUgdGhlbSBuYW1lcywgc28gdXNlIHRoZSB0cmFkaXRpb25hbAotICAgVU5JWCBuYW1lcy4gICovCi0KLSNkZWZpbmUgTkxNX0NPREVfTkFNRQkJCSIudGV4dCIKLSNkZWZpbmUgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRQkiLmRhdGEiCi0jZGVmaW5lIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRQkiLmJzcyIKLQotI2VuZGlmIC8qIF9MSUJOTE1fSF8gKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJvYXN5cy5oIGIvYmZkL2xpYm9hc3lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2VhNTkuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYm9hc3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKiBCRkQgaW50ZXJuYWwgZGVjbGFyYXRpb25zIGZvciBPYXN5cyBmaWxlIGZvcm1hdCBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgU2NyYXdsZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX3N5bWJvbAotewotICBhc3ltYm9sIHN5bWJvbDsKLX0gb2FzeXNfc3ltYm9sX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19yZWxvYyB7Ci0gIGFyZWxlbnQgcmVsZW50OwotICBzdHJ1Y3QgX29hc3lzX3JlbG9jICpuZXh0OwotICB1bnNpZ25lZCBpbnQgc3ltYm9sOwotfSBvYXN5c19yZWxvY190eXBlOwotCi0KLSNkZWZpbmUgb2FzeXNfc3ltYm9sKHgpICgob2FzeXNfc3ltYm9sX3R5cGUgKikoeCkpCi0jZGVmaW5lIG9hc3lzX3Blcl9zZWN0aW9uKHgpICgob2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqKSh4LT51c2VkX2J5X2JmZCkpCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19wZXJfc2VjdGlvbgotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBib29sZWFuIGhhZF92bWE7Ci0gIG9hc3lzX3JlbG9jX3R5cGUgKipyZWxvY190YWlsX3B0cjsKLSAgYmZkX3ZtYSBwYzsKLQotCi0gIGZpbGVfcHRyIGN1cnJlbnRfcG9zOwotICB1bnNpZ25lZCBpbnQgY3VycmVudF9ieXRlOwotICBib29sZWFuIGluaXRpYWxpemVkOwotfSBvYXN5c19wZXJfc2VjdGlvbl90eXBlOwotCi0jZGVmaW5lIE5TRUNUSU9OUyAxMAotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfYXJfb2JzdGFjayB7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwotICBiZmQgKmFiZmQ7Ci19IG9hc3lzX2FyX29ic3RhY2tfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfbW9kdWxlX2luZm8gewotICBmaWxlX3B0ciBwb3M7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBiZmQgKmFiZmQ7Ci0gIGNoYXIgKm5hbWU7Ci19IG9hc3lzX21vZHVsZV9pbmZvX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19hcl9kYXRhIHsKLSAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqbW9kdWxlOwotICB1bnNpZ25lZCBpbnQgbW9kdWxlX2NvdW50OwotICB1bnNpZ25lZCBpbnQgbW9kdWxlX2luZGV4OwotfSBvYXN5c19hcl9kYXRhX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19kYXRhIHsKLSAgY2hhciAqc3RyaW5nczsKLSAgYXN5bWJvbCAqc3ltYm9sczsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9zdHJpbmdfbGVuZ3RoOwotICBhc2VjdGlvbiAqc2VjdGlvbnNbT0FTWVNfTUFYX1NFQ19DT1VOVF07Ci0gIGZpbGVfcHRyIGZpcnN0X2RhdGFfcmVjb3JkOwotfSBvYXN5c19kYXRhX3R5cGU7Ci0KLSNkZWZpbmUgT0FTWVNfREFUQShhYmZkKQkoKGFiZmQpLT50ZGF0YS5vYXN5c19vYmpfZGF0YSkKLSNkZWZpbmUgT0FTWVNfQVJfREFUQShhYmZkKQkoKGFiZmQpLT50ZGF0YS5vYXN5c19hcl9kYXRhKQotCmRpZmYgLS1naXQgYS9iZmQvbGlicGVpLmggYi9iZmQvbGlicGVpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjlmNzMuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYnBlaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIFBFL1BFSTsgY29tbW9uIGhlYWRlciBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1Nb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwKLQkJCXNhY0BjeWdudXMuY29tCi0KLVBFL1BFSSByZWFycmFuZ2VtZW50IChhbmQgY29kZSBhZGRlZCk6IERvbm4gVGVycnkKLQkJCQkgICAgICAgU29mdHdheSBTeXN0ZW1zLCBJbmMuCi0qLwotCi0vKiBIZXkgbG9vaywgc29tZSBkb2N1bWVudGF0aW9uIFthbmQgaW4gYSBwbGFjZSB5b3UgZXhwZWN0IHRvIGZpbmQgaXRdIQotCi0gICBUaGUgbWFpbiByZWZlcmVuY2UgZm9yIHRoZSBwZWkgZm9ybWF0IGlzICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiA0LjEiLiAgR2V0IGl0IGlmIHlvdSBuZWVkIHRvCi0gICBkbyBzb21lIHNlcmlvdXMgaGFja2luZyBvbiB0aGlzIGNvZGUuCi0KLSAgIEFub3RoZXIgcmVmZXJlbmNlOgotICAgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOS4KLQotICAgVGhlICpzb2xlKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBlIGZvcm1hdCBhbmQgdGhlIHBlaSBmb3JtYXQgaXMgdGhhdCB0aGUKLSAgIGxhdHRlciBoYXMgYW4gTVNET1MgMi4wIC5leGUgaGVhZGVyIG9uIHRoZSBmcm9udCB0aGF0IHByaW50cyB0aGUgbWVzc2FnZQotICAgIlRoaXMgYXBwIG11c3QgYmUgcnVuIHVuZGVyIFdpbmRvd3MuIiAob3Igc29tZSBzdWNoKS4KLSAgIChGSVhNRTogV2hldGhlciB0aGF0IHN0YXRlbWVudCBpcyAqcmVhbGx5KiB0cnVlIG9yIG5vdCBpcyB1bmtub3duLgotICAgQXJlIHRoZXJlIG1vcmUgc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gcGUgYW5kIHBlaSBmb3JtYXRzPwotICAgRm9yIG5vdyBhc3N1bWUgdGhlcmUgYXJlbid0LiAgSWYgeW91IGZpbmQgb25lLCB0aGVuIGZvciBHb2Qgc2FrZXMKLSAgIGRvY3VtZW50IGl0IGhlcmUhKQotCi0gICBUaGUgTWljcm9zb2Z0IGRvY3MgdXNlIHRoZSB3b3JkICJpbWFnZSIgaW5zdGVhZCBvZiAiZXhlY3V0YWJsZSIgYmVjYXVzZQotICAgdGhlIGZvcm1lciBjYW4gYWxzbyByZWZlciB0byBhIERMTCAoc2hhcmVkIGxpYnJhcnkpLiAgQ29uZnVzaW9uIGNhbiBhcmlzZQotICAgYmVjYXVzZSB0aGUgYGknIGluIGBwZWknIGFsc28gcmVmZXJzIHRvICJpbWFnZSIuICBUaGUgYHBlJyBmb3JtYXQgY2FuCi0gICBhbHNvIGNyZWF0ZSBpbWFnZXMgKGkuZS4gZXhlY3V0YWJsZXMpLCBpdCdzIGp1c3QgdGhhdCB0byBydW4gb24gYSB3aW4zMgotICAgc3lzdGVtIHlvdSBuZWVkIHRvIHVzZSB0aGUgcGVpIGZvcm1hdC4KLQotICAgRklYTUU6IFBsZWFzZSBhZGQgbW9yZSBkb2NzIGhlcmUgc28gdGhlIG5leHQgcG9vciBmb29sIHRoYXQgaGFzIHRvIGhhY2sKLSAgIG9uIHRoaXMgY29kZSBoYXMgYSBjaGFuY2Ugb2YgZ2V0dGluZyBzb21ldGhpbmcgYWNjb21wbGlzaGVkIHdpdGhvdXQKLSAgIHdhc3RpbmcgdG9vIG11Y2ggdGltZS4KLSovCi0KLSNpZm5kZWYgR0VUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpIFwKLSAgICAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotCi0jaWZuZGVmIEdFVF9GQ05fRU5ETkRYCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgIFwKLQliZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLQotI2lmbmRlZiBQVVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsIGluLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZDTl9FTkRORFgKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9MTk5PCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfU0laRQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX0xOTk8KLSNkZWZpbmUgUFVUX0xOU1pfTE5OTyhhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfU0laRQotI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX1NDTkxFTgotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OUkVMT0MKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OTElOTk8KLSNkZWZpbmUgR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9TQ05MRU4KLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTlJFTE9DCi0jZGVmaW5lIFBVVF9TQ05fTlJFTE9DKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTkxJTk5PCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8xNihhYmZkLGluLCAoYmZkX2J5dGUgICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xJTkVOT19MTk5PCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX0xJTkVOT19MTk5PCi0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLQotLyogVGhlIGZfc3ltcHRyIGZpZWxkIGluIHRoZSBmaWxlaGRyIGlzIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIEdFVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgUFVUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBhb3V0aGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0JTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIEdFVF9BT1VUSERSX0VOVFJZIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgc2NuaGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9QQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUEFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9WQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9WQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgR0VUX1NDTkhEUl9TSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0laRQotI2RlZmluZSBQVVRfU0NOSERSX1NJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9TQ05QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9SRUxQVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCwgYW5kIGFyZSBpbiBwZWljb2RlLmg6Ci0gICBjb2ZmX3N3YXBfcmVsb2NfaW4KLSAgIGludCBjb2ZmX3N3YXBfcmVsb2Nfb3V0Ci0gICBjb2ZmX3N3YXBfZmlsZWhkcl9pbgotICAgY29mZl9zd2FwX3Njbmhkcl9pbgotICAgcGVfbWtvYmplY3QKLSAgIHBlX21rb2JqZWN0X2hvb2sgICovCi0KLS8qIFRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IGFyZSBjb21tb24gYWNyb3NzIGFsbCBQRS9QRUkKLSAgIGltcGxlbWVudGF0aW9ucyBhcmNoaXRlY3R1cmUgdHlwZXMsIGFuZCBhY3R1YWxseSBhcHBlYXIgaW4KLSAgIHBlaWdlbi5jLiAgKi8KLQotdm9pZCBfYmZkX3BlaV9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfc3ltX2luIF9iZmRfcGVpX3N3YXBfc3ltX2luCi0KLXVuc2lnbmVkIGludCBfYmZkX3BlaV9zd2FwX3N5bV9vdXQgUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX3N5bV9vdXQgX2JmZF9wZWlfc3dhcF9zeW1fb3V0Ci0KLXZvaWQgX2JmZF9wZWlfc3dhcF9hdXhfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX2F1eF9pbiBfYmZkX3BlaV9zd2FwX2F1eF9pbgotCi11bnNpZ25lZCBpbnQgX2JmZF9wZWlfc3dhcF9hdXhfb3V0IFwKLSAgUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX2F1eF9vdXQgX2JmZF9wZWlfc3dhcF9hdXhfb3V0Ci0KLXZvaWQgX2JmZF9wZWlfc3dhcF9saW5lbm9faW4gUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX2xpbmVub19pbiBfYmZkX3BlaV9zd2FwX2xpbmVub19pbgotCi11bnNpZ25lZCBpbnQgX2JmZF9wZWlfc3dhcF9saW5lbm9fb3V0IFBBUkFNUyAoKGJmZCosIFBUUiwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9saW5lbm9fb3V0IF9iZmRfcGVpX3N3YXBfbGluZW5vX291dAotCi12b2lkIF9iZmRfcGVpX3N3YXBfYW91dGhkcl9pbiBQQVJBTVMgKChiZmQqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9pbiBfYmZkX3BlaV9zd2FwX2FvdXRoZHJfaW4KLQotdW5zaWduZWQgaW50IF9iZmRfcGVpX3N3YXBfYW91dGhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX291dCBfYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0Ci0KLXVuc2lnbmVkIGludCBfYmZkX3BlaV9zd2FwX3Njbmhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfb3V0IF9iZmRfcGVpX3N3YXBfc2NuaGRyX291dAotCi1ib29sZWFuIF9iZmRfcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24gUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1ib29sZWFuIF9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24gUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLXZvaWQgX2JmZF9wZV9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotCi1ib29sZWFuIF9iZmRfcGVpX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopKTsKLQotI2lmbmRlZiBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAotI2RlZmluZSBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCBfYmZkX3BlaV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSNlbmRpZgotLyogVGhlIGZvbGxvd2luZyBhcmUgbmVlZGVkIG9ubHkgZm9yIE9ORSBvZiBwZSBvciBwZWksIGJ1dCBkb24ndAotICAgb3RoZXJ3aXNlIHZhcnk7IHBlaWNvZGUuaCBmaXhlcyB1cCBpZmRlZnMgYnV0IHdlIHByb3ZpZGUgdGhlCi0gICBwcm90b3R5cGUuICAqLwotCi11bnNpZ25lZCBpbnQgX2JmZF9wZV9vbmx5X3N3YXBfZmlsZWhkcl9vdXQgUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLXVuc2lnbmVkIGludCBfYmZkX3BlaV9vbmx5X3N3YXBfZmlsZWhkcl9vdXQgUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLWJvb2xlYW4gX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKZGlmZiAtLWdpdCBhL2JmZC9saW5rZXIuYyBiL2JmZC9saW5rZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5ZWU2NS4uMDAwMDAwMAotLS0gYS9iZmQvbGlua2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODE0ICswLDAgQEAKLS8qIGxpbmtlci5jIC0tIEJGRCBsaW5rZXIgcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0KLS8qCi1TRUNUSU9OCi0JTGlua2VyIEZ1bmN0aW9ucwotCi1AY2luZGV4IExpbmtlcgotCVRoZSBsaW5rZXIgdXNlcyB0aHJlZSBzcGVjaWFsIGVudHJ5IHBvaW50cyBpbiB0aGUgQkZEIHRhcmdldAotCXZlY3Rvci4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gd3JpdGUgc3BlY2lhbCByb3V0aW5lcyBmb3IKLQl0aGVzZSBlbnRyeSBwb2ludHMgd2hlbiBjcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQsIHNpbmNlCi0JZ2VuZXJpYyB2ZXJzaW9ucyBhcmUgcHJvdmlkZWQuICBIb3dldmVyLCB3cml0aW5nIHRoZW0gY2FuCi0Jc3BlZWQgdXAgbGlua2luZyBhbmQgbWFrZSBpdCB1c2Ugc2lnbmlmaWNhbnRseSBsZXNzIHJ1bnRpbWUKLQltZW1vcnkuCi0KLQlUaGUgZmlyc3Qgcm91dGluZSBjcmVhdGVzIGEgaGFzaCB0YWJsZSB1c2VkIGJ5IHRoZSBvdGhlcgotCXJvdXRpbmVzLiAgVGhlIHNlY29uZCByb3V0aW5lIGFkZHMgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLQlmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgVGhlIHRoaXJkIHJvdXRpbmUgdGFrZXMgYWxsIHRoZQotCW9iamVjdCBmaWxlcyBhbmQgbGlua3MgdGhlbSB0b2dldGhlciB0byBjcmVhdGUgdGhlIG91dHB1dAotCWZpbGUuICBUaGVzZSByb3V0aW5lcyBhcmUgZGVzaWduZWQgc28gdGhhdCB0aGUgbGlua2VyIHByb3BlcgotCWRvZXMgbm90IG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgc3ltYm9scyBpbiB0aGUgb2JqZWN0Ci0JZmlsZXMgdGhhdCBpdCBpcyBsaW5raW5nLiAgVGhlIGxpbmtlciBtZXJlbHkgYXJyYW5nZXMgdGhlCi0Jc2VjdGlvbnMgYXMgZGlyZWN0ZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQgYW5kIGxldHMgQkZEIGhhbmRsZQotCXRoZSBkZXRhaWxzIG9mIHN5bWJvbHMgYW5kIHJlbG9jcy4KLQotCVRoZSBzZWNvbmQgcm91dGluZSBhbmQgdGhpcmQgcm91dGluZXMgYXJlIHBhc3NlZCBhIHBvaW50ZXIgdG8KLQlhIDw8c3RydWN0IGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4KLQk8PGJmZGxpbmsuaD4+KSB3aGljaCBob2xkcyBpbmZvcm1hdGlvbiByZWxldmFudCB0byB0aGUgbGluaywKLQlpbmNsdWRpbmcgdGhlIGxpbmtlciBoYXNoIHRhYmxlICh3aGljaCB3YXMgY3JlYXRlZCBieSB0aGUKLQlmaXJzdCByb3V0aW5lKSBhbmQgYSBzZXQgb2YgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIHRoZSBsaW5rZXIKLQlwcm9wZXIuCi0KLQlUaGUgZ2VuZXJpYyBsaW5rZXIgcm91dGluZXMgYXJlIGluIDw8bGlua2VyLmM+PiwgYW5kIHVzZSB0aGUKLQloZWFkZXIgZmlsZSA8PGdlbmxpbmsuaD4+LiAgQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgb25seSBiYWNrCi0JZW5kcyB3aGljaCBoYXZlIGltcGxlbWVudGVkIHZlcnNpb25zIG9mIHRoZXNlIHJvdXRpbmVzIGFyZQotCWEub3V0IChpbiA8PGFvdXR4Lmg+PikgYW5kIEVDT0ZGIChpbiA8PGVjb2ZmLmM+PikuICBUaGUgYS5vdXQKLQlyb3V0aW5lcyBhcmUgdXNlZCBhcyBleGFtcGxlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbi4KLQotQG1lbnUJCi1AKiBDcmVhdGluZyBhIExpbmtlciBIYXNoIFRhYmxlOjoKLUAqIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlOjoKLUAqIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbms6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1DcmVhdGluZyBhIExpbmtlciBIYXNoIFRhYmxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgTGlua2VyIEZ1bmN0aW9ucywgTGlua2VyIEZ1bmN0aW9ucwotU1VCU0VDVElPTgotCUNyZWF0aW5nIGEgbGlua2VyIGhhc2ggdGFibGUKLQotQGNpbmRleCBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgaW4gdGFyZ2V0IHZlY3RvcgotQGNpbmRleCB0YXJnZXQgdmVjdG9yIChfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpCi0JVGhlIGxpbmtlciByb3V0aW5lcyBtdXN0IGNyZWF0ZSBhIGhhc2ggdGFibGUsIHdoaWNoIG11c3QgYmUKLQlkZXJpdmVkIGZyb20gPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+IGRlc2NyaWJlZCBpbgotCTw8YmZkbGluay5jPj4uICBAeHJlZntIYXNoIFRhYmxlc30sIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8KLQljcmVhdGUgYSBkZXJpdmVkIGhhc2ggdGFibGUuICBUaGlzIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB1c2luZwotCXRoZSB0YXJnZXQgdmVjdG9yIG9mIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuCi0KLQlUaGUgPDxfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGU+PiBlbnRyeSBwb2ludCBtdXN0IGFsbG9jYXRlCi0JYW5kIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlc2lyZWQgaGFzaCB0YWJsZS4gIElmIHRoZQotCWJhY2sgZW5kIGRvZXMgbm90IHJlcXVpcmUgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYmUKLQlzdG9yZWQgd2l0aCB0aGUgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgdGhlIGVudHJ5IHBvaW50IG1heQotCXNpbXBseSBjcmVhdGUgYSA8PHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlPj4uICBNb3N0IGxpa2VseSwKLQlob3dldmVyLCBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2lsbCBiZSBuZWVkZWQuCi0KLQlGb3IgZXhhbXBsZSwgd2l0aCBlYWNoIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIHRoZSBhLm91dAotCWxpbmtlciBrZWVwcyB0aGUgaW5kZXggdGhlIHN5bWJvbCBoYXMgaW4gdGhlIGZpbmFsIG91dHB1dCBmaWxlCi0JKHRoaXMgaW5kZXggbnVtYmVyIGlzIHVzZWQgc28gdGhhdCB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlCi0JbGluayB0aGUgc3ltYm9sIGluZGV4IHVzZWQgaW4gdGhlIG91dHB1dCBmaWxlIGNhbiBiZSBxdWlja2x5Ci0JZmlsbGVkIGluIHdoZW4gY29weWluZyBvdmVyIGEgcmVsb2MpLiAgVGhlIGEub3V0IGxpbmtlciBjb2RlCi0JZGVmaW5lcyB0aGUgcmVxdWlyZWQgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZvciBhIGhhc2ggdGFibGUKLQlkZXJpdmVkIGZyb20gPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+LiAgVGhlIGEub3V0IGxpbmtlcgotCWhhc2ggdGFibGUgaXMgY3JlYXRlZCBieSB0aGUgZnVuY3Rpb24KLQk8PE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKT4+OyBpdCBzaW1wbHkgYWxsb2NhdGVzCi0Jc3BhY2UgZm9yIHRoZSBoYXNoIHRhYmxlLCBpbml0aWFsaXplcyBpdCwgYW5kIHJldHVybnMgYQotCXBvaW50ZXIgdG8gaXQuCi0KLQlXaGVuIHdyaXRpbmcgdGhlIGxpbmtlciByb3V0aW5lcyBmb3IgYSBuZXcgYmFjayBlbmQsIHlvdSB3aWxsCi0JZ2VuZXJhbGx5IG5vdCBrbm93IGV4YWN0bHkgd2hpY2ggZmllbGRzIHdpbGwgYmUgcmVxdWlyZWQgdW50aWwKLQl5b3UgaGF2ZSBmaW5pc2hlZC4gIFlvdSBzaG91bGQgc2ltcGx5IGNyZWF0ZSBhIG5ldyBoYXNoIHRhYmxlCi0Jd2hpY2ggZGVmaW5lcyBubyBhZGRpdGlvbmFsIGZpZWxkcywgYW5kIHRoZW4gc2ltcGx5IGFkZCBmaWVsZHMKLQlhcyB0aGV5IGJlY29tZSBuZWNlc3NhcnkuCi0KLUlOT0RFCi1BZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaywgQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZSwgTGlua2VyIEZ1bmN0aW9ucwotU1VCU0VDVElPTgotCUFkZGluZyBzeW1ib2xzIHRvIHRoZSBoYXNoIHRhYmxlCi0KLUBjaW5kZXggX2JmZF9saW5rX2FkZF9zeW1ib2xzIGluIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciAoX2JmZF9saW5rX2FkZF9zeW1ib2xzKQotCVRoZSBsaW5rZXIgcHJvcGVyIHdpbGwgY2FsbCB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PgotCWVudHJ5IHBvaW50IGZvciBlYWNoIG9iamVjdCBmaWxlIG9yIGFyY2hpdmUgd2hpY2ggaXMgdG8gYmUKLQlsaW5rZWQgKHR5cGljYWxseSB0aGVzZSBhcmUgdGhlIGZpbGVzIG5hbWVkIG9uIHRoZSBjb21tYW5kCi0JbGluZSwgYnV0IHNvbWUgbWF5IGFsc28gY29tZSBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0KS4gIFRoZQotCWVudHJ5IHBvaW50IGlzIHJlc3BvbnNpYmxlIGZvciBleGFtaW5pbmcgdGhlIGZpbGUuICBGb3IgYW4KLQlvYmplY3QgZmlsZSwgQkZEIG11c3QgYWRkIGFueSByZWxldmFudCBzeW1ib2wgaW5mb3JtYXRpb24gdG8KLQl0aGUgaGFzaCB0YWJsZS4gIEZvciBhbiBhcmNoaXZlLCBCRkQgbXVzdCBkZXRlcm1pbmUgd2hpY2gKLQllbGVtZW50cyBvZiB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgdXNlZCBhbmQgYWRkaW5nIHRoZW0gdG8gdGhlCi0JbGluay4KLQotCVRoZSBhLm91dCB2ZXJzaW9uIG9mIHRoaXMgZW50cnkgcG9pbnQgaXMKLQk8PE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKT4+LgotCi1AbWVudQotQCogRGlmZmVyaW5nIGZpbGUgZm9ybWF0czo6Ci1AKiBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlOjoKLUAqIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZTo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLURpZmZlcmluZyBmaWxlIGZvcm1hdHMsIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZQotU1VCU1VCU0VDVElPTgotCURpZmZlcmluZyBmaWxlIGZvcm1hdHMKLQotCU5vcm1hbGx5IGFsbCB0aGUgZmlsZXMgaW52b2x2ZWQgaW4gYSBsaW5rIHdpbGwgYmUgb2YgdGhlIHNhbWUKLQlmb3JtYXQsIGJ1dCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGxpbmsgdG9nZXRoZXIgZGlmZmVyZW50Ci0JZm9ybWF0IG9iamVjdCBmaWxlcywgYW5kIHRoZSBiYWNrIGVuZCBtdXN0IHN1cHBvcnQgdGhhdC4gIFRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZW50cnkgcG9pbnQgaXMgY2FsbGVkIHZpYSB0aGUgdGFyZ2V0Ci0JdmVjdG9yIG9mIHRoZSBmaWxlIHRvIGJlIGFkZGVkLiAgVGhpcyBoYXMgYW4gaW1wb3J0YW50Ci0JY29uc2VxdWVuY2U6IHRoZSBmdW5jdGlvbiBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZSBoYXNoIHRhYmxlCi0JaXMgdGhlIHR5cGUgY3JlYXRlZCBieSB0aGUgY29ycmVzcG9uZGluZwotCTw8X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlPj4gdmVjdG9yLiAgQWxsIHRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24gY2FuIGFzc3VtZSBhYm91dCB0aGUgaGFzaAotCXRhYmxlIGlzIHRoYXQgaXQgaXMgZGVyaXZlZCBmcm9tIDw8c3RydWN0Ci0JYmZkX2xpbmtfaGFzaF90YWJsZT4+LgotCi0JU29tZXRpbWVzIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uIG11c3Qgc3RvcmUKLQlzb21lIGluZm9ybWF0aW9uIGluIHRoZSBoYXNoIHRhYmxlIGVudHJ5IHRvIGJlIHVzZWQgYnkgdGhlCi0JPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbi4gIEluIHN1Y2ggYSBjYXNlIHRoZSA8PGNyZWF0b3I+PgotCWZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIG11c3QgYmUgY2hlY2tlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUKLQloYXNoIHRhYmxlIHdhcyBjcmVhdGVkIGJ5IGFuIG9iamVjdCBmaWxlIG9mIHRoZSBzYW1lIGZvcm1hdC4KLQotCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgbXVzdCBiZSBwcmVwYXJlZCB0byBoYW5kbGUgYQotCWhhc2ggZW50cnkgd2l0aG91dCBhbnkgZXh0cmEgaW5mb3JtYXRpb24gYWRkZWQgYnkgdGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbi4gIEEgaGFzaCBlbnRyeSB3aXRob3V0Ci0JZXh0cmEgaW5mb3JtYXRpb24gd2lsbCBhbHNvIG9jY3VyIHdoZW4gdGhlIGxpbmtlciBzY3JpcHQKLQlkaXJlY3RzIHRoZSBsaW5rZXIgdG8gY3JlYXRlIGEgc3ltYm9sLiAgTm90ZSB0aGF0LCByZWdhcmRsZXNzCi0Jb2YgaG93IGEgaGFzaCB0YWJsZSBlbnRyeSBpcyBhZGRlZCwgYWxsIHRoZSBmaWVsZHMgd2lsbCBiZQotCWluaXRpYWxpemVkIHRvIHNvbWUgc29ydCBvZiBudWxsIHZhbHVlIGJ5IHRoZSBoYXNoIHRhYmxlIGVudHJ5Ci0JaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCi0KLQlTZWUgPDxlY29mZl9saW5rX2FkZF9leHRlcm5hbHM+PiBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdG8KLQljaGVjayB0aGUgPDxjcmVhdG9yPj4gZmllbGQgYmVmb3JlIHNhdmluZyBpbmZvcm1hdGlvbiAoaW4gdGhpcwotCWNhc2UsIHRoZSBFQ09GRiBleHRlcm5hbCBzeW1ib2wgZGVidWdnaW5nIGluZm9ybWF0aW9uKSBpbiBhCi0JaGFzaCB0YWJsZSBlbnRyeS4KLQotSU5PREUKLUFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUsIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZSwgRGlmZmVyaW5nIGZpbGUgZm9ybWF0cywgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUKLVNVQlNVQlNFQ1RJT04KLQlBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlCi0KLQlXaGVuIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgaXMgcGFzc2VkIGFuIG9iamVjdAotCWZpbGUsIGl0IG11c3QgYWRkIGFsbCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scyBpbiB0aGF0Ci0Jb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICBUaGUgYWN0dWFsIHdvcmsgb2YgYWRkaW5nIHRoZQotCXN5bWJvbCB0byB0aGUgaGFzaCB0YWJsZSBpcyBub3JtYWxseSBoYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbgotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+Pi4gIFRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgcmVhZGluZwotCWFsbCB0aGUgc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZSBhbmQgcGFzc2luZyB0aGUgY29ycmVjdAotCWluZm9ybWF0aW9uIHRvIDw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+Pi4KLQotCVRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgc2hvdWxkIG5vdCB1c2UKLQk8PGJmZF9jYW5vbmljYWxpemVfc3ltdGFiPj4gdG8gcmVhZCB0aGUgc3ltYm9scy4gIFRoZSBwb2ludCBvZgotCXByb3ZpZGluZyB0aGlzIHJvdXRpbmUgaXMgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGNvbnZlcnRpbmcKLQl0aGUgc3ltYm9scyBpbnRvIGdlbmVyaWMgPDxhc3ltYm9sPj4gc3RydWN0dXJlcy4KLQotQGZpbmRleCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+PiBoYW5kbGVzIHRoZSBkZXRhaWxzIG9mCi0JY29tYmluaW5nIGNvbW1vbiBzeW1ib2xzLCB3YXJuaW5nIGFib3V0IG11bHRpcGxlIGRlZmluaXRpb25zLAotCWFuZCBzbyBmb3J0aC4gIEl0IHRha2VzIGFyZ3VtZW50cyB3aGljaCBkZXNjcmliZSB0aGUgc3ltYm9sIHRvCi0JYWRkLCBub3RhYmx5IHN5bWJvbCBmbGFncywgYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0LiAgVGhlCi0Jc3ltYm9sIGZsYWdzIGluY2x1ZGUgc3VjaCB0aGluZ3MgYXMgPDxCU0ZfV0VBSz4+IG9yCi0JPDxCU0ZfSU5ESVJFQ1Q+Pi4gIFRoZSBzZWN0aW9uIGlzIGEgc2VjdGlvbiBpbiB0aGUgb2JqZWN0Ci0JZmlsZSwgb3Igc29tZXRoaW5nIGxpa2UgPDxiZmRfdW5kX3NlY3Rpb25fcHRyPj4gZm9yIGFuIHVuZGVmaW5lZAotCXN5bWJvbCBvciA8PGJmZF9jb21fc2VjdGlvbl9wdHI+PiBmb3IgYSBjb21tb24gc3ltYm9sLgotCi0JSWYgdGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBpcyBhbHNvIGdvaW5nIHRvIG5lZWQgdG8KLQlyZWFkIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24sIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+Ci0Jcm91dGluZSBzaG91bGQgc2F2ZSBpdCBzb21ld2hlcmUgYXR0YWNoZWQgdG8gdGhlIG9iamVjdCBmaWxlCi0JQkZELiAgSG93ZXZlciwgdGhlIGluZm9ybWF0aW9uIHNob3VsZCBvbmx5IGJlIHNhdmVkIGlmIHRoZQotCTw8a2VlcF9tZW1vcnk+PiBmaWVsZCBvZiB0aGUgPDxpbmZvPj4gYXJndW1lbnQgaXMgdHJ1ZSwgc28KLQl0aGF0IHRoZSA8PC1uby1rZWVwLW1lbW9yeT4+IGxpbmtlciBzd2l0Y2ggaXMgZWZmZWN0aXZlLgotCi0JVGhlIGEub3V0IGZ1bmN0aW9uIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIGlzCi0JPDxhb3V0X2xpbmtfYWRkX29iamVjdF9zeW1ib2xzPj4sIGFuZCBtb3N0IG9mIHRoZSBpbnRlcmVzdGluZwotCXdvcmsgaXMgaW4gPDxhb3V0X2xpbmtfYWRkX3N5bWJvbHM+Pi4gIFRoZSBsYXR0ZXIgc2F2ZXMKLQlwb2ludGVycyB0byB0aGUgaGFzaCB0YWJsZXMgZW50cmllcyBjcmVhdGVkIGJ5Ci0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbD4+IGluZGV4ZWQgYnkgc3ltYm9sIG51bWJlciwKLQlzbyB0aGF0IHRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgZG9lcyBub3QgaGF2ZSB0byBjYWxsCi0JdGhlIGhhc2ggdGFibGUgbG9va3VwIHJvdXRpbmUgdG8gbG9jYXRlIHRoZSBlbnRyeS4KLQotSU5PREUKLUFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZSwgLCBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZQotU1VCU1VCU0VDVElPTgotCUFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZQotCi0JV2hlbiB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIGlzIHBhc3NlZCBhbgotCWFyY2hpdmUsIGl0IG11c3QgbG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlCi0JYXJjaGl2ZSBhbmQgZGVjaWRlIHdoaWNoIGVsZW1lbnRzIG9mIHRoZSBhcmNoaXZlIHNob3VsZCBiZQotCWluY2x1ZGVkIGluIHRoZSBsaW5rLiAgRm9yIGVhY2ggc3VjaCBlbGVtZW50IGl0IG11c3QgY2FsbCB0aGUKLQk8PGFkZF9hcmNoaXZlX2VsZW1lbnQ+PiBsaW5rZXIgY2FsbGJhY2ssIGFuZCBpdCBtdXN0IGFkZCB0aGUKLQlzeW1ib2xzIGZyb20gdGhlIG9iamVjdCBmaWxlIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQotQGZpbmRleCBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JSW4gbW9zdCBjYXNlcyB0aGUgd29yayBvZiBsb29raW5nIHRocm91Z2ggdGhlIHN5bWJvbHMgaW4gdGhlCi0JYXJjaGl2ZSBzaG91bGQgYmUgZG9uZSBieSB0aGUKLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiBmdW5jdGlvbi4gIFRoaXMKLQlmdW5jdGlvbiBidWlsZHMgYSBoYXNoIHRhYmxlIGZyb20gdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGFuZAotCWxvb2tzIHRocm91Z2ggdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMgdG8gc2VlIHdoaWNoCi0JZWxlbWVudHMgc2hvdWxkIGJlIGluY2x1ZGVkLgotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+IGlzIHBhc3NlZCBhIGZ1bmN0aW9uCi0JdG8gY2FsbCB0byBtYWtlIHRoZSBmaW5hbCBkZWNpc2lvbiBhYm91dCBhZGRpbmcgYW4gYXJjaGl2ZQotCWVsZW1lbnQgdG8gdGhlIGxpbmsgYW5kIHRvIGRvIHRoZSBhY3R1YWwgd29yayBvZiBhZGRpbmcgdGhlCi0Jc3ltYm9scyB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0KLQlUaGUgZnVuY3Rpb24gcGFzc2VkIHRvCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4gbXVzdCByZWFkIHRoZQotCXN5bWJvbHMgb2YgdGhlIGFyY2hpdmUgZWxlbWVudCBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIGFyY2hpdmUKLQllbGVtZW50IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIElmIHRoZSBlbGVtZW50IGlzIHRvCi0JYmUgaW5jbHVkZWQsIHRoZSA8PGFkZF9hcmNoaXZlX2VsZW1lbnQ+PiBsaW5rZXIgY2FsbGJhY2sKLQlyb3V0aW5lIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGVsZW1lbnQgYXMgYW4gYXJndW1lbnQsIGFuZAotCXRoZSBlbGVtZW50cyBzeW1ib2xzIG11c3QgYmUgYWRkZWQgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlCi0JanVzdCBhcyB0aG91Z2ggdGhlIGVsZW1lbnQgaGFkIGl0c2VsZiBiZWVuIHBhc3NlZCB0byB0aGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uLgotCi0JV2hlbiB0aGUgYS5vdXQgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbiByZWNlaXZlcyBhbgotCWFyY2hpdmUsIGl0IGNhbGxzIDw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+Ci0JcGFzc2luZyA8PGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQ+PiBhcyB0aGUgZnVuY3Rpb24KLQlhcmd1bWVudC4gPDxhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Pj4gY2FsbHMKLQk8PGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzPj4uICBJZiB0aGUgbGF0dGVyIGRlY2lkZXMgdG8gYWRkCi0JdGhlIGVsZW1lbnQgKGFuIGVsZW1lbnQgaXMgb25seSBhZGRlZCBpZiBpdCBwcm92aWRlcyBhIHJlYWwsCi0Jbm9uLWNvbW1vbiwgZGVmaW5pdGlvbiBmb3IgYSBwcmV2aW91c2x5IHVuZGVmaW5lZCBvciBjb21tb24KLQlzeW1ib2wpIGl0IGNhbGxzIHRoZSA8PGFkZF9hcmNoaXZlX2VsZW1lbnQ+PiBjYWxsYmFjayBhbmQgdGhlbgotCTw8YW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudD4+IGNhbGxzCi0JPDxhb3V0X2xpbmtfYWRkX3N5bWJvbHM+PiB0byBhY3R1YWxseSBhZGQgdGhlIHN5bWJvbHMgdG8gdGhlCi0JbGlua2VyIGhhc2ggdGFibGUuCi0KLQlUaGUgRUNPRkYgYmFjayBlbmQgaXMgdW51c3VhbCBpbiB0aGF0IGl0IGRvZXMgbm90IG5vcm1hbGx5Ci0JY2FsbCA8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiwgYmVjYXVzZSBFQ09GRgotCWFyY2hpdmVzIGFscmVhZHkgY29udGFpbiBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIFRoZSBFQ09GRgotCWJhY2sgZW5kIHNlYXJjaGVzIHRoZSBhcmNoaXZlIGl0c2VsZiB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YKLQljcmVhdGluZyBhIG5ldyBoYXNoIHRhYmxlLgotCi1JTk9ERQotUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaywgLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgTGlua2VyIEZ1bmN0aW9ucwotU1VCU0VDVElPTgotCVBlcmZvcm1pbmcgdGhlIGZpbmFsIGxpbmsKLQotQGNpbmRleCBfYmZkX2xpbmtfZmluYWxfbGluayBpbiB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IHRhcmdldCB2ZWN0b3IgKF9iZmRfZmluYWxfbGluaykKLQlXaGVuIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgdGhlIGxpbmtlciBjYWxscwotCXRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGVudHJ5IHBvaW50IG9mIHRoZSBvdXRwdXQgQkZELiAgVGhpcwotCXJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHByb2R1Y2luZyB0aGUgZmluYWwgb3V0cHV0IGZpbGUsCi0Jd2hpY2ggaGFzIHNldmVyYWwgYXNwZWN0cy4gIEl0IG11c3QgcmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mCi0JdGhlIGlucHV0IHNlY3Rpb25zIGFuZCBjb3B5IHRoZSBkYXRhIGludG8gdGhlIG91dHB1dCBzZWN0aW9ucy4KLQlJdCBtdXN0IGJ1aWxkIGFuIG91dHB1dCBzeW1ib2wgdGFibGUgaW5jbHVkaW5nIGFueSBsb2NhbAotCXN5bWJvbHMgZnJvbSB0aGUgaW5wdXQgZmlsZXMgYW5kIHRoZSBnbG9iYWwgc3ltYm9scyBmcm9tIHRoZQotCWhhc2ggdGFibGUuICBXaGVuIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBpdCBtdXN0Ci0JbW9kaWZ5IHRoZSBpbnB1dCByZWxvY3MgYW5kIHdyaXRlIHRoZW0gaW50byB0aGUgb3V0cHV0IGZpbGUuCi0JVGhlcmUgbWF5IGFsc28gYmUgb2JqZWN0IGZvcm1hdCBkZXBlbmRlbnQgd29yayB0byBiZSBkb25lLgotCi0JVGhlIGxpbmtlciB3aWxsIGFsc28gY2FsbCB0aGUgPDx3cml0ZV9vYmplY3RfY29udGVudHM+PiBlbnRyeQotCXBvaW50IHdoZW4gdGhlIEJGRCBpcyBjbG9zZWQuICBUaGUgdHdvIGVudHJ5IHBvaW50cyBtdXN0IHdvcmsKLQl0b2dldGhlciBpbiBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG91dHB1dCBmaWxlLgotCi0JVGhlIGRldGFpbHMgb2YgaG93IHRoaXMgd29ya3MgYXJlIGluZXZpdGFibHkgZGVwZW5kZW50IHVwb24KLQl0aGUgc3BlY2lmaWMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlIGEub3V0Ci0JPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIGlzIDw8TkFNRShhb3V0LGZpbmFsX2xpbmspPj4uCi0KLUBtZW51Ci1AKiBJbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyOjoKLUAqIFJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHM6OgotQCogV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlOjoKLUBlbmQgbWVudQotCi1JTk9ERQotSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlciwgUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cywgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaywgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluawotU1VCU1VCU0VDVElPTgotCUluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIKLQotCUJlZm9yZSB0aGUgbGlua2VyIGNhbGxzIHRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGVudHJ5IHBvaW50LAotCWl0IHNldHMgdXAgc29tZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBmdW5jdGlvbiB0byB1c2UuCi0KLQlUaGUgPDxpbnB1dF9iZmRzPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZQotCXdpbGwgcG9pbnQgdG8gYSBsaXN0IG9mIGFsbCB0aGUgaW5wdXQgZmlsZXMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4gIFRoZXNlIGZpbGVzIGFyZSBsaW5rZWQgdGhyb3VnaCB0aGUgPDxsaW5rX25leHQ+PiBmaWVsZAotCW9mIHRoZSA8PGJmZD4+IHN0cnVjdHVyZS4KLQotCUVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBoYXZlIGEgbGlzdCBvZgotCTw8bGlua19vcmRlcj4+IHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gdGhlIDw8bGlua19vcmRlcl9oZWFkPj4KLQlmaWVsZCAodGhlIDw8bGlua19vcmRlcj4+IHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluCi0JPDxiZmRsaW5rLmg+PikuICBUaGVzZSBzdHJ1Y3R1cmVzIGRlc2NyaWJlIGhvdyB0byBjcmVhdGUgdGhlCi0JY29udGVudHMgb2YgdGhlIG91dHB1dCBzZWN0aW9uIGluIHRlcm1zIG9mIHRoZSBjb250ZW50cyBvZgotCXZhcmlvdXMgaW5wdXQgc2VjdGlvbnMsIGZpbGwgY29uc3RhbnRzLCBhbmQsIGV2ZW50dWFsbHksIG90aGVyCi0JdHlwZXMgb2YgaW5mb3JtYXRpb24uICBUaGV5IGFsc28gZGVzY3JpYmUgcmVsb2NzIHRoYXQgbXVzdCBiZQotCWNyZWF0ZWQgYnkgdGhlIEJGRCBiYWNrZW5kLCBidXQgZG8gbm90IGNvcnJlc3BvbmQgdG8gYW55IGlucHV0Ci0JZmlsZTsgdGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgLVVyLCB3aGljaCBidWlsZHMgY29uc3RydWN0b3JzCi0Jd2hpbGUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZS4KLQotSU5PREUKLVJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMsIFdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZSwgSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlciwgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluawotU1VCU1VCU0VDVElPTgotCVJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMKLQotCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uIHNob3VsZCBsb29rIHRocm91Z2ggdGhlCi0JPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoIHNlY3Rpb24gb2YgdGhlCi0Jb3V0cHV0IGZpbGUuICBFYWNoIDw8bGlua19vcmRlcj4+IHN0cnVjdHVyZSBzaG91bGQgZWl0aGVyIGJlCi0JaGFuZGxlZCBzcGVjaWFsbHksIG9yIGl0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uCi0JPDxfYmZkX2RlZmF1bHRfbGlua19vcmRlcj4+IHdoaWNoIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nCi0JKDw8X2JmZF9kZWZhdWx0X2xpbmtfb3JkZXI+PiBpcyBkZWZpbmVkIGluIDw8bGlua2VyLmM+PikuCi0KLQlGb3IgZWZmaWNpZW5jeSwgYSA8PGxpbmtfb3JkZXI+PiBvZiB0eXBlCi0JPDxiZmRfaW5kaXJlY3RfbGlua19vcmRlcj4+IHdob3NlIGFzc29jaWF0ZWQgc2VjdGlvbiBiZWxvbmdzCi0JdG8gYSBCRkQgb2YgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvdXRwdXQgQkZEIG11c3QgYmUgaGFuZGxlZAotCXNwZWNpYWxseS4gIFRoaXMgdHlwZSBvZiA8PGxpbmtfb3JkZXI+PiBkZXNjcmliZXMgcGFydCBvZiBhbgotCW91dHB1dCBzZWN0aW9uIGluIHRlcm1zIG9mIGEgc2VjdGlvbiBiZWxvbmdpbmcgdG8gb25lIG9mIHRoZQotCWlucHV0IGZpbGVzLiAgVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24gc2hvdWxkIHJlYWQgdGhlCi0JY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYW5kIGFueSBhc3NvY2lhdGVkIHJlbG9jcywgYXBwbHkgdGhlCi0JcmVsb2NzIHRvIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBhbmQgd3JpdGUgb3V0IHRoZSBtb2RpZmllZAotCXNlY3Rpb24gY29udGVudHMuICBJZiBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZQotCXJlbG9jcyB0aGVtc2VsdmVzIG11c3QgYWxzbyBiZSBtb2RpZmllZCBhbmQgd3JpdHRlbiBvdXQuCi0KLUBmaW5kZXggX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotQGZpbmRleCBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLQlUaGUgZnVuY3Rpb25zIDw8X2JmZF9yZWxvY2F0ZV9jb250ZW50cz4+IGFuZAotCTw8X2JmZF9maW5hbF9saW5rX3JlbG9jYXRlPj4gcHJvdmlkZSBzb21lIGdlbmVyYWwgc3VwcG9ydCBmb3IKLQlwZXJmb3JtaW5nIHRoZSBhY3R1YWwgcmVsb2NhdGlvbnMsIG5vdGFibHkgb3ZlcmZsb3cgY2hlY2tpbmcuCi0JVGhlaXIgYXJndW1lbnRzIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbCB0aGUKLQlyZWxvY2F0aW9uIGlzIGFnYWluc3QgYW5kIGEgPDxyZWxvY19ob3d0b190eXBlPj4gYXJndW1lbnQKLQl3aGljaCBkZXNjcmliZXMgdGhlIHJlbG9jYXRpb24gdG8gcGVyZm9ybS4gIFRoZXNlIGZ1bmN0aW9ucwotCWFyZSBkZWZpbmVkIGluIDw8cmVsb2MuYz4+LgotCi0JVGhlIGEub3V0IGZ1bmN0aW9uIHdoaWNoIGhhbmRsZXMgcmVhZGluZywgcmVsb2NhdGluZywgYW5kCi0Jd3JpdGluZyBzZWN0aW9uIGNvbnRlbnRzIGlzIDw8YW91dF9saW5rX2lucHV0X3NlY3Rpb24+Pi4gIFRoZQotCWFjdHVhbCByZWxvY2F0aW9uIGlzIGRvbmUgaW4gPDxhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQ+PgotCWFuZCA8PGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dD4+LgotCi1JTk9ERQotV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlLCAsIFJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmsKLVNVQlNVQlNFQ1RJT04KLQlXcml0aW5nIHRoZSBzeW1ib2wgdGFibGUKLQotCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uIG11c3QgZ2F0aGVyIGFsbCB0aGUgc3ltYm9scwotCWluIHRoZSBpbnB1dCBmaWxlcyBhbmQgd3JpdGUgdGhlbSBvdXQuICBJdCBtdXN0IGFsc28gd3JpdGUgb3V0Ci0JYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gIFRoaXMgbXVzdCBiZQotCWNvbnRyb2xsZWQgYnkgdGhlIDw8c3RyaXA+PiBhbmQgPDxkaXNjYXJkPj4gZmllbGRzIG9mIHRoZQotCTw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZS4KLQotCVRoZSBsb2NhbCBzeW1ib2xzIG9mIHRoZSBpbnB1dCBmaWxlcyB3aWxsIG5vdCBoYXZlIGJlZW4KLQllbnRlcmVkIGludG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhlIDw8X2JmZF9maW5hbF9saW5rPj4KLQlyb3V0aW5lIG11c3QgY29uc2lkZXIgZWFjaCBpbnB1dCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2xzCi0JaW4gdGhlIG91dHB1dCBmaWxlLiAgSXQgbWF5IGJlIGNvbnZlbmllbnQgdG8gZG8gdGhpcyB3aGVuCi0JbG9va2luZyB0aHJvdWdoIHRoZSA8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmVzLCBvciBpdCBtYXkgYmUKLQlkb25lIGJ5IHN0ZXBwaW5nIHRocm91Z2ggdGhlIDw8aW5wdXRfYmZkcz4+IGxpc3QuCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIG11c3QgYWxzbyB0cmF2ZXJzZSB0aGUgZ2xvYmFsCi0JaGFzaCB0YWJsZSB0byBnYXRoZXIgYWxsIHRoZSBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gIEl0Ci0JaXMgcG9zc2libGUgdGhhdCBtb3N0IG9mIHRoZSBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scyBtYXkgYmUKLQl3cml0dGVuIG91dCB3aGVuIGNvbnNpZGVyaW5nIHRoZSBzeW1ib2xzIG9mIGVhY2ggaW5wdXQgZmlsZSwKLQlidXQgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5IHRvIHRyYXZlcnNlIHRoZSBoYXNoIHRhYmxlIHNpbmNlIHRoZQotCWxpbmtlciBzY3JpcHQgbWF5IGhhdmUgZGVmaW5lZCBzb21lIHN5bWJvbHMgdGhhdCBhcmUgbm90IGluCi0JYW55IG9mIHRoZSBpbnB1dCBmaWxlcy4KLQotCVRoZSA8PHN0cmlwPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZQotCWNvbnRyb2xzIHdoaWNoIHN5bWJvbHMgYXJlIHdyaXR0ZW4gb3V0LiAgVGhlIHBvc3NpYmxlIHZhbHVlcwotCWFyZSBsaXN0ZWQgaW4gPDxiZmRsaW5rLmg+Pi4gIElmIHRoZSB2YWx1ZSBpcyA8PHN0cmlwX3NvbWU+PiwKLQl0aGVuIHRoZSA8PGtlZXBfaGFzaD4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PgotCXN0cnVjdHVyZSBpcyBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scyB0byBrZWVwOyBlYWNoIHN5bWJvbAotCXNob3VsZCBiZSBsb29rZWQgdXAgaW4gdGhpcyBoYXNoIHRhYmxlLCBhbmQgb25seSBzeW1ib2xzIHdoaWNoCi0JYXJlIHByZXNlbnQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotCUlmIHRoZSA8PHN0cmlwPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZQotCXBlcm1pdHMgbG9jYWwgc3ltYm9scyB0byBiZSB3cml0dGVuIG91dCwgdGhlIDw8ZGlzY2FyZD4+IGZpZWxkCi0JaXMgdXNlZCB0byBmdXJ0aGVyIGNvbnRyb2xzIHdoaWNoIGxvY2FsIHN5bWJvbHMgYXJlIGluY2x1ZGVkCi0JaW4gdGhlIG91dHB1dCBmaWxlLiAgSWYgdGhlIHZhbHVlIGlzIDw8ZGlzY2FyZF9sPj4sIHRoZW4gYWxsCi0JbG9jYWwgc3ltYm9scyB3aGljaCBiZWdpbiB3aXRoIGEgY2VydGFpbiBwcmVmaXggYXJlIGRpc2NhcmRlZDsKLQl0aGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIDw8YmZkX2lzX2xvY2FsX2xhYmVsX25hbWU+PiBlbnRyeSBwb2ludC4KLQotCVRoZSBhLm91dCBiYWNrZW5kIGhhbmRsZXMgc3ltYm9scyBieSBjYWxsaW5nCi0JPDxhb3V0X2xpbmtfd3JpdGVfc3ltYm9scz4+IG9uIGVhY2ggaW5wdXQgQkZEIGFuZCB0aGVuCi0JdHJhdmVyc2luZyB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgd2l0aCB0aGUgZnVuY3Rpb24KLQk8PGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2w+Pi4gIEl0IGJ1aWxkcyBhIHN0cmluZyB0YWJsZQotCXdoaWxlIHdyaXRpbmcgb3V0IHRoZSBzeW1ib2xzLCB3aGljaCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQKLQlmaWxlIGF0IHRoZSBlbmQgb2YgPDxOQU1FKGFvdXQsZmluYWxfbGluayk+Pi4KLSovCi0KLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuIGNvbGxlY3QpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkLCBib29sZWFuIGNvbGxlY3QpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF9zaXplX3R5cGUgY291bnQsIGFzeW1ib2wgKiosCi0JICAgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYmZkICpoYXNoX2VudHJ5X2JmZCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCBzZXRfc3ltYm9sX2Zyb21faGFzaAotICBQQVJBTVMgKChhc3ltYm9sICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHNpemVfdCAqcHN5bWFsbG9jLCBhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIGRlZmF1bHRfZmlsbF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJvb2xlYW4pKTsKLQotLyogVGhlIGxpbmsgaGFzaCB0YWJsZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBiZmRsaW5rLmguICBJdCBwcm92aWRlcwotICAgYSBiYXNlIGhhc2ggdGFibGUgd2hpY2ggdGhlIGJhY2tlbmQgc3BlY2lmaWMgaGFzaCB0YWJsZXMgYXJlIGJ1aWx0Ci0gICB1cG9uLiAgKi8KLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gdGhlIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50eXBlID0gYmZkX2xpbmtfaGFzaF9uZXc7Ci0gICAgICByZXQtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBsaW5rIGhhc2ggdGFibGUuICBUaGUgQkZEIGFyZ3VtZW50IGlzIHRoZSBvbmUKLSAgIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+Y3JlYXRvciA9IGFiZmQtPnh2ZWM7Ci0gIHRhYmxlLT51bmRlZnMgPSBOVUxMOwotICB0YWJsZS0+dW5kZWZzX3RhaWwgPSBOVUxMOwotICByZXR1cm4gYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT50YWJsZSwgbmV3ZnVuYyk7Ci19Ci0KLS8qIExvb2sgdXAgYSBzeW1ib2wgaW4gYSBsaW5rIGhhc2ggdGFibGUuICBJZiBmb2xsb3cgaXMgdHJ1ZSwgd2UKLSAgIGZvbGxvdyBiZmRfbGlua19oYXNoX2luZGlyZWN0IGFuZCBiZmRfbGlua19oYXNoX3dhcm5pbmcgbGlua3MgdG8KLSAgIHRoZSByZWFsIHN5bWJvbC4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoKLWJmZF9saW5rX2hhc2hfbG9va3VwICh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY3JlYXRlOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gZm9sbG93OwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbG9va3VwICgmdGFibGUtPnRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkpOwotCi0gIGlmIChmb2xsb3cgJiYgcmV0ICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHdoaWxlIChyZXQtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSAgICAgfHwgcmV0LT50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQlyZXQgPSByZXQtPnUuaS5saW5rOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBMb29rIHVwIGEgc3ltYm9sIGluIHRoZSBtYWluIGxpbmtlciBoYXNoIHRhYmxlIGlmIHRoZSBzeW1ib2wgbWlnaHQKLSAgIGJlIHdyYXBwZWQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHJlZmVyZW5jZXMgdG8gYW4KLSAgIHVuZGVmaW5lZCBzeW1ib2wsIG5vdCBmb3IgZGVmaW5pdGlvbnMgb2YgYSBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqCi1iZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY3JlYXRlOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gZm9sbG93OwotewotICBpZiAoaW5mby0+d3JhcF9oYXNoICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbDsKLQotICAgICAgbCA9IHN0cmluZzsKLSAgICAgIGlmICgqbCA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpKQotCSsrbDsKLQotI3VuZGVmIFdSQVAKLSNkZWZpbmUgV1JBUCAiX193cmFwXyIKLQotICAgICAgaWYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+d3JhcF9oYXNoLCBsLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCi0JewotCSAgY2hhciAqbjsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBiZWluZyB3cmFwcGVkLiAgV2Ugd2FudCB0byByZXBsYWNlIGFsbAotICAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gU1lNIHdpdGggcmVmZXJlbmNlcyB0byBfX3dyYXBfU1lNLiAgKi8KLQotCSAgbiA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobCkgKyBzaXplb2YgV1JBUCArIDEpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIC8qIE5vdGUgdGhhdCBzeW1ib2xfbGVhZGluZ19jaGFyIG1heSBiZSAnXDAnLiAgKi8KLQkgIG5bMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOwotCSAgblsxXSA9ICdcMCc7Ci0JICBzdHJjYXQgKG4sIFdSQVApOwotCSAgc3RyY2F0IChuLCBsKTsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbiwgY3JlYXRlLCB0cnVlLCBmb2xsb3cpOwotCSAgZnJlZSAobik7Ci0JICByZXR1cm4gaDsKLQl9Ci0KLSN1bmRlZiBXUkFQCi0KLSN1bmRlZiBSRUFMCi0jZGVmaW5lIFJFQUwgIl9fcmVhbF8iCi0KLSAgICAgIGlmICgqbCA9PSAnXycKLQkgICYmIHN0cm5jbXAgKGwsIFJFQUwsIHNpemVvZiBSRUFMIC0gMSkgPT0gMAotCSAgJiYgYmZkX2hhc2hfbG9va3VwIChpbmZvLT53cmFwX2hhc2gsIGwgKyBzaXplb2YgUkVBTCAtIDEsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCi0JewotCSAgY2hhciAqbjsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIF9fcmVhbF9TWU0sIHdoZXJlIFNZTSBpcyBiZWluZwotICAgICAgICAgICAgIHdyYXBwZWQuICBXZSB3YW50IHRvIHJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gX19yZWFsX1NZTQotICAgICAgICAgICAgIHdpdGggcmVmZXJlbmNlcyB0byBTWU0uICAqLwotCi0JICBuID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChsICsgc2l6ZW9mIFJFQUwgLSAxKSArIDIpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIC8qIE5vdGUgdGhhdCBzeW1ib2xfbGVhZGluZ19jaGFyIG1heSBiZSAnXDAnLiAgKi8KLQkgIG5bMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOwotCSAgblsxXSA9ICdcMCc7Ci0JICBzdHJjYXQgKG4sIGwgKyBzaXplb2YgUkVBTCAtIDEpOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuLCBjcmVhdGUsIHRydWUsIGZvbGxvdyk7Ci0JICBmcmVlIChuKTsKLQkgIHJldHVybiBoOwotCX0KLQotI3VuZGVmIFJFQUwKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KTsKLX0KLQotLyogVHJhdmVyc2UgYSBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5vdCBhCi0gICBtYWNybyBpcyB0byBkbyBiZXR0ZXIgdHlwZSBjaGVja2luZy4gIFRoaXMgY29kZSBwcmVzdW1lcyB0aGF0IGFuCi0gICBhcmd1bWVudCBwYXNzZWQgYXMgYSBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiBtYXkgYmUgY2F1Z2h0IGFzIGEKLSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogd2l0aCBubyBleHBsaWNpdCBjYXN0IHJlcXVpcmVkIG9uIHRoZQotICAgY2FsbC4gICovCi0KLXZvaWQgCi1iZmRfbGlua19oYXNoX3RyYXZlcnNlICh0YWJsZSwgZnVuYywgaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBib29sZWFuICgqZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0gICAgIFBUUiBpbmZvOwotewotICBiZmRfaGFzaF90cmF2ZXJzZSAoJnRhYmxlLT50YWJsZSwKLQkJICAgICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKSkKLQkJICAgICAgZnVuYyksCi0JCSAgICAgaW5mbyk7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUgdW5kZWZzIGxpc3QuICAqLwotCi1JTkxJTkUgdm9pZAotYmZkX2xpbmtfYWRkX3VuZGVmICh0YWJsZSwgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgQkZEX0FTU0VSVCAoaC0+bmV4dCA9PSBOVUxMKTsKLSAgaWYgKHRhYmxlLT51bmRlZnNfdGFpbCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB0YWJsZS0+dW5kZWZzX3RhaWwtPm5leHQgPSBoOwotICBpZiAodGFibGUtPnVuZGVmcyA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB0YWJsZS0+dW5kZWZzID0gaDsKLSAgdGFibGUtPnVuZGVmc190YWlsID0gaDsKLX0KLQwKLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPndyaXR0ZW4gPSBmYWxzZTsKLSAgICAgIHJldC0+c3ltID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICBpZiAoISBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBHcmFiIHRoZSBzeW1ib2xzIGZvciBhbiBvYmplY3QgZmlsZSB3aGVuIGRvaW5nIGEgZ2VuZXJpYyBsaW5rLiAgV2UKLSAgIHN0b3JlIHRoZSBzeW1ib2xzIGluIHRoZSBvdXRzeW1ib2xzIGZpZWxkLiAgV2UgbmVlZCB0byBrZWVwIHRoZW0KLSAgIGFyb3VuZCBmb3IgdGhlIGVudGlyZSBsaW5rIHRvIGVuc3VyZSB0aGF0IHdlIG9ubHkgcmVhZCB0aGVtIG9uY2UuCi0gICBJZiB3ZSByZWFkIHRoZW0gbXVsdGlwbGUgdGltZXMsIHdlIG1pZ2h0IHdpbmQgdXAgd2l0aCByZWxvY3MgYW5kCi0gICB0aGUgaGFzaCB0YWJsZSBwb2ludGluZyB0byBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzeW1ib2wKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHsKLSAgICAgIGxvbmcgc3ltc2l6ZTsKLSAgICAgIGxvbmcgc3ltY291bnQ7Ci0KLSAgICAgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gICAgICBpZiAoc3ltc2l6ZSA8IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGFiZmQsIHN5bXNpemUpOwotICAgICAgaWYgKGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPT0gTlVMTCAmJiBzeW1zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSk7Ci0gICAgICBpZiAoc3ltY291bnQgPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltY291bnQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogR2VuZXJpYyBmdW5jdGlvbiB0byBhZGQgc3ltYm9scyB0byBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZQotICAgZ2xvYmFsIGhhc2ggdGFibGUuICBUaGlzIHZlcnNpb24gZG9lcyBub3QgYXV0b21hdGljYWxseSBjb2xsZWN0Ci0gICBjb25zdHJ1Y3RvcnMgYnkgbmFtZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvLCBmYWxzZSk7Ci19Ci0KLS8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gYWRkIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsCi0gICBoYXNoIHRhYmxlLiAgVGhpcyB2ZXJzaW9uIGF1dG9tYXRpY2FsbHkgY29sbGVjdHMgY29uc3RydWN0b3JzIGJ5Ci0gICBuYW1lLCBhcyB0aGUgY29sbGVjdDIgcHJvZ3JhbSBkb2VzLiAgSXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFueQotICAgdGFyZ2V0IHdoaWNoIGRvZXMgbm90IHByb3ZpZGUgc29tZSBvdGhlciBtZWNoYW5pc20gZm9yIHNldHRpbmcgdXAKLSAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM7IHRoZXNlIGFyZSBhcHByb3hpbWF0ZWx5IHRob3NlIHRhcmdldHMKLSAgIGZvciB3aGljaCBnY2MgdXNlcyBjb2xsZWN0MiBhbmQgZG8gbm90IHN1cHBvcnQgc3RhYnMuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0IChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvLCB0cnVlKTsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvLCBjb2xsZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXQgPSBnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvLCBjb2xsZWN0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXQgPSAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCSAgICAgKGFiZmQsIGluZm8sCi0JICAgICAgKGNvbGxlY3QKLQkgICAgICAgPyBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QKLQkgICAgICAgOiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QpKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbywgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotewotICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0IChhYmZkLCBpbmZvLAotCQkJCSAgICAgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGFiZmQpLAotCQkJCSAgICAgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCksCi0JCQkJICAgICAgIGNvbGxlY3QpOwotfQotDAotLyogV2UgYnVpbGQgYSBoYXNoIHRhYmxlIG9mIGFsbCBzeW1ib2xzIGRlZmluZWQgaW4gYW4gYXJjaGl2ZS4gICovCi0KLS8qIEFuIGFyY2hpdmUgc3ltYm9sIG1heSBiZSBkZWZpbmVkIGJ5IG11bHRpcGxlIGFyY2hpdmUgZWxlbWVudHMuCi0gICBUaGlzIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gaG9sZCB0aGUgZWxlbWVudHMuICAqLwotCi1zdHJ1Y3QgYXJjaGl2ZV9saXN0Ci17Ci0gIHN0cnVjdCBhcmNoaXZlX2xpc3QgKm5leHQ7Ci0gIGludCBpbmR4OwotfTsKLQotLyogQW4gZW50cnkgaW4gYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogV2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLiAgKi8KLSAgc3RydWN0IGFyY2hpdmVfbGlzdCAqZGVmczsKLX07Ci0KLS8qIEFuIGFyY2hpdmUgaGFzaCB0YWJsZSBpdHNlbGYuICAqLwotCi1zdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmFyY2hpdmVfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhcmNoaXZlX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotCi0vKiBDcmVhdGUgYSBuZXcgZW50cnkgZm9yIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotYXJjaGl2ZV9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+ZGVmcyA9IChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXJjaGl2ZV9oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgcmV0dXJuIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+dGFibGUsIG5ld2Z1bmMpOwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYXJjaGl2ZV9oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHQpLT50YWJsZSwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBpbiBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZSh0LCBzaXplKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJih0KS0+dGFibGUsIChzaXplKSkKLQotLyogRnJlZSBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFyY2hpdmVfaGFzaF90YWJsZV9mcmVlKHQpIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCYodCktPnRhYmxlKQotCi0vKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGFkZCBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZSBmaWxlIHRvIHRoZSBnbG9iYWwKLSAgIGhhc2ggZmlsZS4gIFRoaXMgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUKLSAgIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBpbiAodGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IHRoZQotICAgYmZkX2NoZWNrX2Zvcm1hdCBlbnRyeSBwb2ludCkuICBJdCBsb29rcyB0aHJvdWdoIHRoZSB1bmRlZmluZWQgYW5kCi0gICBjb21tb24gc3ltYm9scyBhbmQgc2VhcmNoZXMgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGZvciB0aGVtLiAgSWYKLSAgIGl0IGZpbmRzIGFuIGVudHJ5LCBpdCBpbmNsdWRlcyB0aGUgYXNzb2NpYXRlZCBvYmplY3QgZmlsZSBpbiB0aGUKLSAgIGxpbmsuCi0KLSAgIFRoZSBvbGQgbGlua2VyIGxvb2tlZCB0aHJvdWdoIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBmb3IKLSAgIHVuZGVmaW5lZCBzeW1ib2xzLiAgV2UgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQsIGxvb2tpbmcgdGhyb3VnaAotICAgdW5kZWZpbmVkIHN5bWJvbHMgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGUgYXJjaGl2ZS4gIFRoZQotICAgYWR2YW50YWdlIG9mIHRoZSBuZXdlciBzY2hlbWUgaXMgdGhhdCB3ZSBvbmx5IGhhdmUgdG8gbG9vayB0aHJvdWdoCi0gICB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scyBvbmNlLCB3aGVyZWFzIHRoZSBvbGQgbWV0aG9kIGhhZCB0bwotICAgcmUtc2VhcmNoIHRoZSBzeW1ib2wgdGFibGUgZWFjaCB0aW1lIGEgbmV3IG9iamVjdCBmaWxlIHdhcyBhZGRlZC4KLQotICAgVGhlIENIRUNLRk4gYXJndW1lbnQgaXMgdXNlZCB0byBzZWUgaWYgYW4gb2JqZWN0IGZpbGUgc2hvdWxkIGJlCi0gICBpbmNsdWRlZC4gIENIRUNLRk4gc2hvdWxkIHNldCAqUE5FRURFRCB0byB0cnVlIGlmIHRoZSBvYmplY3QgZmlsZQotICAgc2hvdWxkIGJlIGluY2x1ZGVkLCBhbmQgbXVzdCBhbHNvIGNhbGwgdGhlIGJmZF9saW5rX2luZm8KLSAgIGFkZF9hcmNoaXZlX2VsZW1lbnQgY2FsbGJhY2sgZnVuY3Rpb24gYW5kIGhhbmRsZSBhZGRpbmcgdGhlIHN5bWJvbHMKLSAgIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gIENIRUNLRk4gc2hvdWxkIG9ubHkgcmV0dXJuIGZhbHNlIGlmIHNvbWUKLSAgIHNvcnQgb2YgZXJyb3Igb2NjdXJzLgotCi0gICBGb3Igc29tZSBmb3JtYXRzLCBzdWNoIGFzIGEub3V0LCBpdCBpcyBwb3NzaWJsZSB0byBsb29rIHRocm91Z2ggYW4KLSAgIG9iamVjdCBmaWxlIGJ1dCBub3QgYWN0dWFsbHkgaW5jbHVkZSBpdCBpbiB0aGUgbGluay4gIFRoZQotICAgYXJjaGl2ZV9wYXNzIGZpZWxkIGluIGEgQkZEIGlzIHVzZWQgdG8gYXZvaWQgY2hlY2tpbmcgdGhlIHN5bWJvbHMKLSAgIG9mIGFuIG9iamVjdCBmaWxlcyB0b28gbWFueSB0aW1lcy4gIFdoZW4gYW4gb2JqZWN0IGlzIGluY2x1ZGVkIGluCi0gICB0aGUgbGluaywgYXJjaGl2ZV9wYXNzIGlzIHNldCB0byAtMS4gIElmIGFuIG9iamVjdCBpcyBzY2FubmVkIGJ1dAotICAgbm90IGluY2x1ZGVkLCBhcmNoaXZlX3Bhc3MgaXMgc2V0IHRvIHRoZSBwYXNzIG51bWJlci4gIFRoZSBwYXNzCi0gICBudW1iZXIgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgbmV3IG9iamVjdCBmaWxlIGlzIGluY2x1ZGVkLiAgVGhlCi0gICBwYXNzIG51bWJlciBpcyB1c2VkIGJlY2F1c2Ugd2hlbiBhIG5ldyBvYmplY3QgZmlsZSBpcyBpbmNsdWRlZCBpdAotICAgbWF5IGNyZWF0ZSBuZXcgdW5kZWZpbmVkIHN5bWJvbHMgd2hpY2ggY2F1c2UgYSBwcmV2aW91c2x5IGV4YW1pbmVkCi0gICBvYmplY3QgZmlsZSB0byBiZSBpbmNsdWRlZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8sIGNoZWNrZm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKCpjaGVja2ZuKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgYm9vbGVhbiAqcG5lZWRlZCkpOwotewotICBjYXJzeW0gKmFyc3ltczsKLSAgY2Fyc3ltICphcnN5bV9lbmQ7Ci0gIHJlZ2lzdGVyIGNhcnN5bSAqYXJzeW07Ci0gIGludCBwYXNzOwotICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlIGFyc3ltX2hhc2g7Ci0gIGludCBpbmR4OwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKnB1bmRlZjsKLQotICBpZiAoISBiZmRfaGFzX21hcCAoYWJmZCkpCi0gICAgewotICAgICAgLyogQW4gZW1wdHkgYXJjaGl2ZSBpcyBhIHNwZWNpYWwgY2FzZS4gICovCi0gICAgICBpZiAoYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKSA9PSBOVUxMKQotCXJldHVybiB0cnVlOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYXJzeW1zID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7Ci0gIGFyc3ltX2VuZCA9IGFyc3ltcyArIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZfY291bnQ7Ci0KLSAgLyogSW4gb3JkZXIgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciBhbiBzeW1ib2wgaXMgZGVmaW5lZCBpbgotICAgICB0aGlzIGFyY2hpdmUsIHdlIGJ1aWxkIGEgaGFzaCB0YWJsZSBvZiB0aGUgc3ltYm9scy4gICovCi0gIGlmICghIGFyY2hpdmVfaGFzaF90YWJsZV9pbml0ICgmYXJzeW1faGFzaCwgYXJjaGl2ZV9oYXNoX25ld2Z1bmMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChhcnN5bSA9IGFyc3ltcywgaW5keCA9IDA7IGFyc3ltIDwgYXJzeW1fZW5kOyBhcnN5bSsrLCBpbmR4KyspCi0gICAgewotICAgICAgc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqYXJoOwotICAgICAgc3RydWN0IGFyY2hpdmVfbGlzdCAqbCwgKipwcDsKLQotICAgICAgYXJoID0gYXJjaGl2ZV9oYXNoX2xvb2t1cCAoJmFyc3ltX2hhc2gsIGFyc3ltLT5uYW1lLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoYXJoID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBsID0gKChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopCi0JICAgYXJjaGl2ZV9oYXNoX2FsbG9jYXRlICgmYXJzeW1faGFzaCwgc2l6ZW9mIChzdHJ1Y3QgYXJjaGl2ZV9saXN0KSkpOwotICAgICAgaWYgKGwgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGwtPmluZHggPSBpbmR4OwotICAgICAgZm9yIChwcCA9ICZhcmgtPmRlZnM7Ci0JICAgKnBwICE9IChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopIE5VTEw7Ci0JICAgcHAgPSAmKCpwcCktPm5leHQpCi0JOwotICAgICAgKnBwID0gbDsKLSAgICAgIGwtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICAvKiBUaGUgYXJjaGl2ZV9wYXNzIGZpZWxkIGluIHRoZSBhcmNoaXZlIGl0c2VsZiBpcyB1c2VkIHRvCi0gICAgIGluaXRpYWxpemUgUEFTUywgc2luZSB3ZSBtYXkgc2VhcmNoIHRoZSBzYW1lIGFyY2hpdmUgbXVsdGlwbGUKLSAgICAgdGltZXMuICAqLwotICBwYXNzID0gYWJmZC0+YXJjaGl2ZV9wYXNzICsgMTsKLQotICAvKiBOZXcgdW5kZWZpbmVkIHN5bWJvbHMgYXJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHNvIHdlCi0gICAgIG9ubHkgbmVlZCB0byBsb29rIHRocm91Z2ggaXQgb25jZS4gICovCi0gIHB1bmRlZiA9ICZpbmZvLT5oYXNoLT51bmRlZnM7Ci0gIHdoaWxlICgqcHVuZGVmICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqYXJoOwotICAgICAgc3RydWN0IGFyY2hpdmVfbGlzdCAqbDsKLQotICAgICAgaCA9ICpwdW5kZWY7Ci0KLSAgICAgIC8qIFdoZW4gYSBzeW1ib2wgaXMgZGVmaW5lZCwgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbQotCSB0aGUgbGlzdC4gICovCi0gICAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQl7Ci0JICAvKiBSZW1vdmUgdGhpcyBlbnRyeSBmcm9tIHRoZSBsaXN0LCBmb3IgZ2VuZXJhbCBjbGVhbmxpbmVzcwotCSAgICAgYW5kIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGxvb2sgdGhyb3VnaCB0aGUgbGlzdCBhZ2FpbgotCSAgICAgaWYgd2Ugc2VhcmNoIGFueSBtb3JlIGxpYnJhcmllcy4gIFdlIGNhbid0IHJlbW92ZSB0aGUKLQkgICAgIGVudHJ5IGlmIGl0IGlzIHRoZSB0YWlsLCBiZWNhdXNlIHRoYXQgd291bGQgbG9zZSBhbnkKLQkgICAgIGVudHJpZXMgd2UgYWRkIHRvIHRoZSBsaXN0IGxhdGVyIG9uIChpdCB3b3VsZCBhbHNvIGNhdXNlCi0JICAgICB1cyB0byBsb3NlIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHN5bWJvbCBoYXMgYmVlbgotCSAgICAgcmVmZXJlbmNlZCkuICAqLwotCSAgaWYgKCpwdW5kZWYgIT0gaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwpCi0JICAgICpwdW5kZWYgPSAoKnB1bmRlZiktPm5leHQ7Ci0JICBlbHNlCi0JICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBhcmNoaXZlIHN5bWJvbCBtYXAuICAqLwotICAgICAgYXJoID0gYXJjaGl2ZV9oYXNoX2xvb2t1cCAoJmFyc3ltX2hhc2gsIGgtPnJvb3Quc3RyaW5nLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGFyaCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotCXsKLQkgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgYXQgYWxsIHRoZSBvYmplY3RzIHdoaWNoIGRlZmluZSB0aGlzIHN5bWJvbC4gICovCi0gICAgICBmb3IgKGwgPSBhcmgtPmRlZnM7IGwgIT0gKHN0cnVjdCBhcmNoaXZlX2xpc3QgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0JewotCSAgYmZkICplbGVtZW50OwotCSAgYm9vbGVhbiBuZWVkZWQ7Ci0KLQkgIC8qIElmIHRoZSBzeW1ib2wgaGFzIGdvdHRlbiBkZWZpbmVkIGFsb25nIHRoZSB3YXksIHF1aXQuICAqLwotCSAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICBicmVhazsKLQotCSAgZWxlbWVudCA9IGJmZF9nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBsLT5pbmR4KTsKLQkgIGlmIChlbGVtZW50ID09IChiZmQgKikgTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIElmIHdlJ3ZlIGFscmVhZHkgaW5jbHVkZWQgdGhpcyBlbGVtZW50LCBvciBpZiB3ZSd2ZQotCSAgICAgYWxyZWFkeSBjaGVja2VkIGl0IG9uIHRoaXMgcGFzcywgY29udGludWUuICAqLwotCSAgaWYgKGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9PSAtMQotCSAgICAgIHx8IGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9PSBwYXNzKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgd2UgY2FuJ3QgZmlndXJlIHRoaXMgZWxlbWVudCBvdXQsIGp1c3QgaWdub3JlIGl0LiAgKi8KLQkgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGVsZW1lbnQsIGJmZF9vYmplY3QpKQotCSAgICB7Ci0JICAgICAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gLTE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogQ0hFQ0tGTiB3aWxsIHNlZSBpZiB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIGluY2x1ZGVkLCBhbmQKLQkgICAgIGdvIGFoZWFkIGFuZCBpbmNsdWRlIGl0IGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgIGlmICghICgqY2hlY2tmbikgKGVsZW1lbnQsIGluZm8sICZuZWVkZWQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKCEgbmVlZGVkKQotCSAgICBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPSBwYXNzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gLTE7Ci0KLQkgICAgICAvKiBJbmNyZW1lbnQgdGhlIHBhc3MgY291bnQgdG8gc2hvdyB0aGF0IHdlIG1heSBuZWVkIHRvCi0JCSByZWNoZWNrIG9iamVjdCBmaWxlcyB3aGljaCB3ZXJlIGFscmVhZHkgY2hlY2tlZC4gICovCi0JICAgICAgKytwYXNzOwotCSAgICB9Ci0JfQotCi0gICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotICAgIH0KLQotICBhcmNoaXZlX2hhc2hfdGFibGVfZnJlZSAoJmFyc3ltX2hhc2gpOwotCi0gIC8qIFNhdmUgUEFTUyBpbiBjYXNlIHdlIGFyZSBjYWxsZWQgYWdhaW4uICAqLwotICBhYmZkLT5hcmNoaXZlX3Bhc3MgPSBwYXNzOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBhcmNoaXZlX2hhc2hfdGFibGVfZnJlZSAoJmFyc3ltX2hhc2gpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBTZWUgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgYW4gYXJjaGl2ZSBlbGVtZW50LiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQKLSAgIHdoZW4gd2UgZG8gbm90IHdhbnQgdG8gYXV0b21hdGljYWxseSBjb2xsZWN0IGNvbnN0cnVjdG9ycyBiYXNlZCBvbgotICAgdGhlIHN5bWJvbCBuYW1lLCBwcmVzdW1hYmx5IGJlY2F1c2Ugd2UgaGF2ZSBzb21lIG90aGVyIG1lY2hhbmlzbQotICAgZm9yIGZpbmRpbmcgdGhlbS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkLCBmYWxzZSk7Ci19Ci0KLS8qIFNlZSBpZiB3ZSBzaG91bGQgaW5jbHVkZSBhbiBhcmNoaXZlIGVsZW1lbnQuICBUaGlzIHZlcnNpb24gaXMgdXNlZAotICAgd2hlbiB3ZSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYmFzZWQgb24gdGhlCi0gICBzeW1ib2wgbmFtZSwgYXMgY29sbGVjdDIgZG9lcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkLCB0cnVlKTsKLX0KLQotLyogU2VlIGlmIHdlIHNob3VsZCBpbmNsdWRlIGFuIGFyY2hpdmUgZWxlbWVudC4gIE9wdGlvbmFsbHkgY29sbGVjdAotICAgY29uc3RydWN0b3JzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQsIGNvbGxlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLXsKLSAgYXN5bWJvbCAqKnBwLCAqKnBwZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgaWYgKCEgZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBwID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpOwotICBwcGVuZCA9IHBwICsgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgZm9yICg7IHBwIDwgcHBlbmQ7IHBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqcDsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBwID0gKnBwOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGdsb2JhbGx5IHZpc2libGUgc3ltYm9scy4gICovCi0gICAgICBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHAtPnNlY3Rpb24pCi0JICAmJiAocC0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9JTkRJUkVDVCB8IEJTRl9XRUFLKSkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpZiB3ZSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGlzCi0JIHN5bWJvbCwgYW5kIGl0IGlzIHVuZGVmaW5lZCBvciBjb21tb24uICBBbiB1bmRlZmluZWQgd2VhawotCSBzeW1ib2wgKHR5cGUgYmZkX2xpbmtfaGFzaF91bmRlZndlYWspIGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlCi0JIGEgcmVmZXJlbmNlIHdoZW4gcHVsbGluZyBmaWxlcyBvdXQgb2YgYW4gYXJjaGl2ZS4gIFNlZSB0aGUKLQkgU1ZSNCBBQkksIHAuIDQtMjcuICAqLwotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBiZmRfYXN5bWJvbF9uYW1lIChwKSwgZmFsc2UsCi0JCQkJZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8IChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFAgaXMgYSBzeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLQotICAgICAgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChwLT5zZWN0aW9uKSkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotCSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0KLQkgIC8qIFRoaXMgb2JqZWN0IGZpbGUgZGVmaW5lcyB0aGlzIHN5bWJvbCwgc28gcHVsbCBpdCBpbi4gICovCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsCi0JCQkJCQkJIGJmZF9hc3ltYm9sX25hbWUgKHApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3ltY291bnQgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGFiZmQpOwotCSAgc3ltYm9scyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLQkgIGlmICghIGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QgKGFiZmQsIGluZm8sIHN5bWNvdW50LAotCQkJCQkgICAgICBzeW1ib2xzLCBjb2xsZWN0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKnBuZWVkZWQgPSB0cnVlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBQIGlzIGEgY29tbW9uIHN5bWJvbC4gICovCi0KLSAgICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIGJmZCAqc3ltYmZkOwotCSAgYmZkX3ZtYSBzaXplOwotCSAgdW5zaWduZWQgaW50IHBvd2VyOwotCi0JICBzeW1iZmQgPSBoLT51LnVuZGVmLmFiZmQ7Ci0JICBpZiAoc3ltYmZkID09IChiZmQgKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIGFzIHVuZGVmaW5lZCBmcm9tIG91dHNpZGUKLQkJIEJGRC4gIFdlIGFzc3VtZSB0aGF0IHdlIHNob3VsZCBsaW5rIGluIHRoZSBvYmplY3QKLQkJIGZpbGUuICBUaGlzIGlzIGZvciB0aGUgLXUgb3B0aW9uIGluIHRoZSBsaW5rZXIuICAqLwotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KQotCQkgIChpbmZvLCBhYmZkLCBiZmRfYXN5bWJvbF9uYW1lIChwKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgLyogVHVybiB0aGUgc3ltYm9sIGludG8gYSBjb21tb24gc3ltYm9sIGJ1dCBkbyBub3QgbGluayBpbgotCSAgICAgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpcyBob3cgYS5vdXQgd29ya3MuICBPYmplY3QKLQkgICAgIGZvcm1hdHMgdGhhdCByZXF1aXJlIGRpZmZlcmVudCBzZW1hbnRpY3MgbXVzdCBpbXBsZW1lbnQKLQkgICAgIHRoaXMgZnVuY3Rpb24gZGlmZmVyZW50bHkuICBUaGlzIHN5bWJvbCBpcyBhbHJlYWR5IG9uIHRoZQotCSAgICAgdW5kZWZzIGxpc3QuICBXZSBhZGQgdGhlIHNlY3Rpb24gdG8gYSBjb21tb24gc2VjdGlvbgotCSAgICAgYXR0YWNoZWQgdG8gc3ltYmZkIHRvIGVuc3VyZSB0aGF0IGl0IGlzIGluIGEgQkZEIHdoaWNoCi0JICAgICB3aWxsIGJlIGxpbmtlZCBpbi4gICovCi0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9jb21tb247Ci0JICBoLT51LmMucCA9Ci0JICAgICgoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5ICopCi0JICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCXNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5KSkpOwotCSAgaWYgKGgtPnUuYy5wID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc2l6ZSA9IGJmZF9hc3ltYm9sX3ZhbHVlIChwKTsKLQkgIGgtPnUuYy5zaXplID0gc2l6ZTsKLQotCSAgcG93ZXIgPSBiZmRfbG9nMiAoc2l6ZSk7Ci0JICBpZiAocG93ZXIgPiA0KQotCSAgICBwb3dlciA9IDQ7Ci0JICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7Ci0KLQkgIGlmIChwLT5zZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIpCi0JICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzeW1iZmQsICJDT01NT04iKTsKLQkgIGVsc2UKLQkgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN5bWJmZCwKLQkJCQkJCQkgIHAtPnNlY3Rpb24tPm5hbWUpOwotCSAgaC0+dS5jLnAtPnNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGNvbW1vbiBzeW1ib2wgaWYgbmVjZXNzYXJ5LiAgVGhpcwotCSAgICAgaXMgaG93IGEub3V0IHdvcmtzLiAgT2JqZWN0IGZvcm1hdHMgdGhhdCByZXF1aXJlCi0JICAgICBkaWZmZXJlbnQgc2VtYW50aWNzIG11c3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24KLQkgICAgIGRpZmZlcmVudGx5LiAgKi8KLQkgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAocCkgPiBoLT51LmMuc2l6ZSkKLQkgICAgaC0+dS5jLnNpemUgPSBiZmRfYXN5bWJvbF92YWx1ZSAocCk7Ci0JfQotICAgIH0KLQotICAvKiBUaGlzIGFyY2hpdmUgZWxlbWVudCBpcyBub3QgbmVlZGVkLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCB0aGUgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gIEFCRkQKLSAgIGlzIHRoZSBvYmplY3QgZmlsZS4gIElORk8gaXMgdGhlIGxpbmtlciBpbmZvcm1hdGlvbi4gIFNZTUJPTF9DT1VOVAotICAgaXMgdGhlIG51bWJlciBvZiBzeW1ib2xzLiAgU1lNQk9MUyBpcyB0aGUgbGlzdCBvZiBzeW1ib2xzLiAgQ09MTEVDVAotICAgaXMgdHJ1ZSBpZiBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgY29sbGVjdGVkIGJ5IG5hbWUKLSAgIGFzIGlzIGRvbmUgYnkgY29sbGVjdDIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCAoYWJmZCwgaW5mbywgc3ltYm9sX2NvdW50LCBzeW1ib2xzLCBjb2xsZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWJvbF9jb3VudDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLXsKLSAgYXN5bWJvbCAqKnBwLCAqKnBwZW5kOwotCi0gIHBwID0gc3ltYm9sczsKLSAgcHBlbmQgPSBzeW1ib2xzICsgc3ltYm9sX2NvdW50OwotICBmb3IgKDsgcHAgPCBwcGVuZDsgcHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwOwotCi0gICAgICBwID0gKnBwOwotCi0gICAgICBpZiAoKHAtPmZsYWdzICYgKEJTRl9JTkRJUkVDVAotCQkgICAgICAgfCBCU0ZfV0FSTklORwotCQkgICAgICAgfCBCU0ZfR0xPQkFMCi0JCSAgICAgICB8IEJTRl9DT05TVFJVQ1RPUgotCQkgICAgICAgfCBCU0ZfV0VBSykpICE9IDAKLQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKLQkgIHx8IGJmZF9pc19pbmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQkgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHApOwotCSAgaWYgKCgocC0+ZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QpICE9IDAKLQkgICAgICAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChwLT5zZWN0aW9uKSkKLQkgICAgICAmJiBwcCArIDEgPCBwcGVuZCkKLQkgICAgewotCSAgICAgIHBwKys7Ci0JICAgICAgc3RyaW5nID0gYmZkX2FzeW1ib2xfbmFtZSAoKnBwKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKHAtPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDAKLQkJICAgJiYgcHAgKyAxIDwgcHBlbmQpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgbmFtZSBvZiBQIGlzIGFjdHVhbGx5IHRoZSB3YXJuaW5nIHN0cmluZywgYW5kIHRoZQotCQkgbmV4dCBzeW1ib2wgaXMgdGhlIG9uZSB0byB3YXJuIGFib3V0LiAgKi8KLQkgICAgICBzdHJpbmcgPSBuYW1lOwotCSAgICAgIHBwKys7Ci0JICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpwcCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc3RyaW5nID0gTlVMTDsKLQotCSAgaCA9IE5VTEw7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCBuYW1lLCBwLT5mbGFncywgYmZkX2dldF9zZWN0aW9uIChwKSwKLQkJICBwLT52YWx1ZSwgc3RyaW5nLCBmYWxzZSwgY29sbGVjdCwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogSWYgdGhpcyBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbCwgYW5kIHRoZSBsaW5rZXIgZGlkbid0IGRvCi0gICAgICAgICAgICAgYW55dGhpbmcgd2l0aCBpdCwgdGhlbiB3ZSB3YW50IHRvIGp1c3QgcGFzcyB0aGUgc3ltYm9sCi0gICAgICAgICAgICAgdGhyb3VnaCB0byB0aGUgb3V0cHV0IGZpbGUuICBUaGlzIHdpbGwgaGFwcGVuIHdoZW4KLSAgICAgICAgICAgICBsaW5raW5nIHdpdGggLXIuICAqLwotCSAgaWYgKChwLT5mbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotCSAgICAgICYmIChoID09IE5VTEwgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KSkKLQkgICAgewotCSAgICAgIHAtPnVkYXRhLnAgPSBOVUxMOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFNhdmUgdGhlIEJGRCBzeW1ib2wgc28gdGhhdCB3ZSBkb24ndCBsb3NlIGFueSBiYWNrZW5kCi0JICAgICBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSBhdHRhY2hlZCB0byBpdC4gIFdlIG9ubHkKLQkgICAgIHdhbnQgdGhpcyBvbmUgaWYgaXQgZ2l2ZXMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZQotCSAgICAgZXhpc3Rpbmcgb25lOyB3ZSBkb24ndCB3YW50IHRvIHJlcGxhY2UgYSBkZWZpbmVkIHN5bWJvbAotCSAgICAgd2l0aCBhbiB1bmRlZmluZWQgb25lLiAgVGhpcyByb3V0aW5lIG1heSBiZSBjYWxsZWQgd2l0aCBhCi0JICAgICBoYXNoIHRhYmxlIG90aGVyIHRoYW4gdGhlIGdlbmVyaWMgaGFzaCB0YWJsZSwgc28gd2Ugb25seQotCSAgICAgZG8gdGhpcyBpZiB3ZSBhcmUgY2VydGFpbiB0aGF0IHRoZSBoYXNoIHRhYmxlIGlzIGEKLQkgICAgIGdlbmVyaWMgb25lLiAgKi8KLQkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+c3ltID09IChhc3ltYm9sICopIE5VTEwKLQkJICB8fCAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JCSAgICAgICYmICghIGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKLQkJCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKGgtPnN5bSkpKSkpCi0JCXsKLQkJICBoLT5zeW0gPSBwOwotCQkgIC8qIEJTRl9PTERfQ09NTU9OIGlzIGEgaGFjayB0byBzdXBwb3J0IENPRkYgcmVsb2MKLQkJICAgICByZWFkaW5nLCBhbmQgaXQgc2hvdWxkIGdvIGF3YXkgd2hlbiB0aGUgQ09GRgotCQkgICAgIGxpbmtlciBpcyBzd2l0Y2hlZCB0byB0aGUgbmV3IHZlcnNpb24uICAqLwotCQkgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpKQotCQkgICAgcC0+ZmxhZ3MgfD0gQlNGX09MRF9DT01NT047Ci0JCX0KLQkgICAgfQotCi0JICAvKiBTdG9yZSBhIGJhY2sgcG9pbnRlciBmcm9tIHRoZSBzeW1ib2wgdG8gdGhlIGhhc2gKLQkgICAgIHRhYmxlIGVudHJ5IGZvciB0aGUgYmVuZWZpdCBvZiByZWxheGF0aW9uIGNvZGUgdW50aWwKLQkgICAgIGl0IGdldHMgcmV3cml0dGVuIHRvIG5vdCB1c2UgYXN5bWJvbCBzdHJ1Y3R1cmVzLgotCSAgICAgU2V0dGluZyB0aGlzIGlzIGFsc28gdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZXNlCi0JICAgICBzeW1ib2xzIHdlcmUgc2V0IHVwIGJ5IHRoZSBnZW5lcmljIGxpbmtlci4gICovCi0JICBwLT51ZGF0YS5wID0gKFBUUikgaDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgdXNlIGEgc3RhdGUgdGFibGUgdG8gZGVhbCB3aXRoIGFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgVGhlIGZpcnN0IGluZGV4IGludG8gdGhlIHN0YXRlIHRhYmxlIGRlc2NyaWJlcyB0aGUgc3ltYm9sCi0gICBmcm9tIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBzZWNvbmQgaW5kZXggaW50byB0aGUgc3RhdGUgdGFibGUgaXMgdGhlCi0gICB0eXBlIG9mIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotCi0vKiBUaGUgc3ltYm9sIGZyb20gdGhlIG9iamVjdCBmaWxlIGlzIHR1cm5lZCBpbnRvIG9uZSBvZiB0aGVzZSByb3cKLSAgIHZhbHVlcy4gICovCi0KLWVudW0gbGlua19yb3cKLXsKLSAgVU5ERUZfUk9XLAkJLyogVW5kZWZpbmVkLiAgKi8KLSAgVU5ERUZXX1JPVywJCS8qIFdlYWsgdW5kZWZpbmVkLiAgKi8KLSAgREVGX1JPVywJCS8qIERlZmluZWQuICAqLwotICBERUZXX1JPVywJCS8qIFdlYWsgZGVmaW5lZC4gICovCi0gIENPTU1PTl9ST1csCQkvKiBDb21tb24uICAqLwotICBJTkRSX1JPVywJCS8qIEluZGlyZWN0LiAgKi8KLSAgV0FSTl9ST1csCQkvKiBXYXJuaW5nLiAgKi8KLSAgU0VUX1JPVwkJLyogTWVtYmVyIG9mIHNldC4gICovCi19OwotCi0vKiBhcHBhcmVudGx5IG5lZWRlZCBmb3IgSGl0YWNoaSAzMDUwUihISS1VWC9XRTIpPyAqLwotI3VuZGVmIEZBSUwKLQotLyogVGhlIGFjdGlvbnMgdG8gdGFrZSBpbiB0aGUgc3RhdGUgdGFibGUuICAqLwotCi1lbnVtIGxpbmtfYWN0aW9uCi17Ci0gIEZBSUwsCQkvKiBBYm9ydC4gKi8KLSAgVU5ELAkJLyogTWFyayBzeW1ib2wgdW5kZWZpbmVkLiAgKi8KLSAgV0VBSywJCS8qIE1hcmsgc3ltYm9sIHdlYWsgdW5kZWZpbmVkLiAgKi8KLSAgREVGLAkJLyogTWFyayBzeW1ib2wgZGVmaW5lZC4gICovCi0gIERFRlcsCQkvKiBNYXJrIHN5bWJvbCB3ZWFrIGRlZmluZWQuICAqLwotICBDT00sCQkvKiBNYXJrIHN5bWJvbCBjb21tb24uICAqLwotICBSRUYsCQkvKiBNYXJrIGRlZmluZWQgc3ltYm9sIHJlZmVyZW5jZWQuICAqLwotICBDUkVGLAkJLyogUG9zc2libHkgd2FybiBhYm91dCBjb21tb24gcmVmZXJlbmNlIHRvIGRlZmluZWQgc3ltYm9sLiAgKi8KLSAgQ0RFRiwJCS8qIERlZmluZSBleGlzdGluZyBjb21tb24gc3ltYm9sLiAgKi8KLSAgTk9BQ1QsCS8qIE5vIGFjdGlvbi4gICovCi0gIEJJRywJCS8qIE1hcmsgc3ltYm9sIGNvbW1vbiB1c2luZyBsYXJnZXN0IHNpemUuICAqLwotICBNREVGLAkJLyogTXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gICovCi0gIE1JTkQsCQkvKiBNdWx0aXBsZSBpbmRpcmVjdCBzeW1ib2xzLiAgKi8KLSAgSU5ELAkJLyogTWFrZSBpbmRpcmVjdCBzeW1ib2wuICAqLwotICBDSU5ELAkJLyogTWFrZSBpbmRpcmVjdCBzeW1ib2wgZnJvbSBleGlzdGluZyBjb21tb24gc3ltYm9sLiAgKi8KLSAgU0VULAkJLyogQWRkIHZhbHVlIHRvIHNldC4gICovCi0gIE1XQVJOLAkvKiBNYWtlIHdhcm5pbmcgc3ltYm9sLiAgKi8KLSAgV0FSTiwJCS8qIElzc3VlIHdhcm5pbmcuICAqLwotICBDV0FSTiwJLyogV2FybiBpZiByZWZlcmVuY2VkLCBlbHNlIE1XQVJOLiAgKi8KLSAgQ1lDTEUsCS8qIFJlcGVhdCB3aXRoIHN5bWJvbCBwb2ludGVkIHRvLiAgKi8KLSAgUkVGQywJCS8qIE1hcmsgaW5kaXJlY3Qgc3ltYm9sIHJlZmVyZW5jZWQgYW5kIHRoZW4gQ1lDTEUuICAqLwotICBXQVJOQwkJLyogSXNzdWUgd2FybmluZyBhbmQgdGhlbiBDWUNMRS4gICovCi19OwotCi0vKiBUaGUgc3RhdGUgdGFibGUgaXRzZWxmLiAgVGhlIGZpcnN0IGluZGV4IGlzIGEgbGlua19yb3cgYW5kIHRoZQotICAgc2Vjb25kIGluZGV4IGlzIGEgYmZkX2xpbmtfaGFzaF90eXBlLiAgKi8KLQotc3RhdGljIGNvbnN0IGVudW0gbGlua19hY3Rpb24gbGlua19hY3Rpb25bOF1bOF0gPQotewotICAvKiBjdXJyZW50XHByZXYgICAgbmV3ICAgIHVuZGVmICB1bmRlZncgZGVmICAgIGRlZncgICBjb20gICAgaW5kciAgIHdhcm4gICovCi0gIC8qIFVOREVGX1JPVyAJKi8gIHtVTkQsICAgTk9BQ1QsIFVORCwgICBSRUYsICAgUkVGLCAgIE5PQUNULCBSRUZDLCAgV0FSTkMgfSwKLSAgLyogVU5ERUZXX1JPVwkqLyAge1dFQUssICBOT0FDVCwgTk9BQ1QsIFJFRiwgICBSRUYsICAgTk9BQ1QsIFJFRkMsICBXQVJOQyB9LAotICAvKiBERUZfUk9XIAkqLyAge0RFRiwgICBERUYsICAgREVGLCAgIE1ERUYsICBERUYsICAgQ0RFRiwgIE1ERUYsICBDWUNMRSB9LAotICAvKiBERUZXX1JPVyAJKi8gIHtERUZXLCAgREVGVywgIERFRlcsICBOT0FDVCwgTk9BQ1QsIE5PQUNULCBOT0FDVCwgQ1lDTEUgfSwKLSAgLyogQ09NTU9OX1JPVwkqLyAge0NPTSwgICBDT00sICAgQ09NLCAgIENSRUYsICBDUkVGLCAgQklHLCAgIFJFRkMsICBXQVJOQyB9LAotICAvKiBJTkRSX1JPVwkqLyAge0lORCwgICBJTkQsICAgSU5ELCAgIE1ERUYsICBJTkQsICAgQ0lORCwgIE1JTkQsICBDWUNMRSB9LAotICAvKiBXQVJOX1JPVyAgICovICB7TVdBUk4sIFdBUk4sICBXQVJOLCAgQ1dBUk4sIENXQVJOLCBXQVJOLCAgQ1dBUk4sIE1XQVJOIH0sCi0gIC8qIFNFVF9ST1cJKi8gIHtTRVQsICAgU0VULCAgIFNFVCwgICBTRVQsICAgU0VULCAgIFNFVCwgICBDWUNMRSwgQ1lDTEUgfQotfTsKLQotLyogTW9zdCBvZiB0aGUgZW50cmllcyBpbiB0aGUgTElOS19BQ1RJT04gdGFibGUgYXJlIHN0cmFpZ2h0Zm9yd2FyZCwKLSAgIGJ1dCBhIGZldyBhcmUgc29tZXdoYXQgc3VidGxlLgotCi0gICBBIHJlZmVyZW5jZSB0byBhbiBpbmRpcmVjdCBzeW1ib2wgKFVOREVGX1JPVy9pbmRyIG9yCi0gICBVTkRFRldfUk9XL2luZHIpIGlzIGNvdW50ZWQgYXMgYSByZWZlcmVuY2UgYm90aCB0byB0aGUgaW5kaXJlY3QKLSAgIHN5bWJvbCBhbmQgdG8gdGhlIHN5bWJvbCB0aGUgaW5kaXJlY3Qgc3ltYm9sIHBvaW50cyB0by4KLQotICAgQSByZWZlcmVuY2UgdG8gYSB3YXJuaW5nIHN5bWJvbCAoVU5ERUZfUk9XL3dhcm4gb3IgVU5ERUZXX1JPVy93YXJuKQotICAgY2F1c2VzIHRoZSB3YXJuaW5nIHRvIGJlIGlzc3VlZC4KLQotICAgQSBjb21tb24gZGVmaW5pdGlvbiBvZiBhbiBpbmRpcmVjdCBzeW1ib2wgKENPTU1PTl9ST1cvaW5kcikgaXMKLSAgIHRyZWF0ZWQgYXMgYSBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgTGlrZXdpc2UgZm9yIGFuIGluZGlyZWN0Ci0gICBkZWZpbml0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCAoSU5EUl9ST1cvY29tKS4KLQotICAgQW4gaW5kaXJlY3QgZGVmaW5pdGlvbiBvZiBhIHdhcm5pbmcgKElORFJfUk9XL3dhcm4pIGRvZXMgbm90IGNhdXNlCi0gICB0aGUgd2FybmluZyB0byBiZSBpc3N1ZWQuCi0KLSAgIElmIGEgd2FybmluZyBpcyBjcmVhdGVkIGZvciBhbiBpbmRpcmVjdCBzeW1ib2wgKFdBUk5fUk9XL2luZHIpIG5vCi0gICB3YXJuaW5nIGlzIGNyZWF0ZWQgZm9yIHRoZSBzeW1ib2wgdGhlIGluZGlyZWN0IHN5bWJvbCBwb2ludHMgdG8uCi0KLSAgIEFkZGluZyBhbiBlbnRyeSB0byBhIHNldCBkb2VzIG5vdCBjb3VudCBhcyBhIHJlZmVyZW5jZSB0byBhIHNldCwKLSAgIGFuZCBubyB3YXJuaW5nIGlzIGlzc3VlZCAoU0VUX1JPVy93YXJuKS4gICovCi0KLS8qIFJldHVybiB0aGUgQkZEIGluIHdoaWNoIGEgaGFzaCBlbnRyeSBoYXMgYmVlbiBkZWZpbmVkLCBpZiBrbm93bi4gICovCi0KLXN0YXRpYyBiZmQgKgotaGFzaF9lbnRyeV9iZmQgKGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotewotICB3aGlsZSAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0gICAgaCA9IGgtPnUuaS5saW5rOwotICBzd2l0Y2ggKGgtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICByZXR1cm4gaC0+dS51bmRlZi5hYmZkOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgcmV0dXJuIGgtPnUuZGVmLnNlY3Rpb24tPm93bmVyOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICByZXR1cm4gaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4KLSAgIEFCRkQgaXMgdGhlIEJGRCB0aGUgc3ltYm9sIGNvbWVzIGZyb20uCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCi0gICBGTEFHUyBpcyB0aGUgQlNGXyogYml0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbC4KLSAgIFNFQ1RJT04gaXMgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhlIHN5bWJvbCBpcyBkZWZpbmVkOyB0aGlzIG1heSBiZQotICAgICBiZmRfdW5kX3NlY3Rpb25fcHRyIG9yIGJmZF9jb21fc2VjdGlvbl9wdHIuCi0gICBWQUxVRSBpcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24uCi0gICBTVFJJTkcgaXMgdXNlZCBmb3IgZWl0aGVyIGFuIGluZGlyZWN0IHN5bWJvbCwgaW4gd2hpY2ggY2FzZSBpdCBpcwotICAgICB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIGluZGlyZWN0IHRvLCBvciBhIHdhcm5pbmcgc3ltYm9sLCBpbgotICAgICB3aGljaCBjYXNlIGl0IGlzIHRoZSB3YXJuaW5nIHN0cmluZy4KLSAgIENPUFkgaXMgdHJ1ZSBpZiBOQU1FIG9yIFNUUklORyBtdXN0IGJlIGNvcGllZCBpbnRvIGxvY2FsbHkKLSAgICAgYWxsb2NhdGVkIG1lbW9yeSBpZiB0aGV5IG5lZWQgdG8gYmUgc2F2ZWQuCi0gICBDT0xMRUNUIGlzIHRydWUgaWYgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkgY29sbGVjdCBnY2MgY29uc3RydWN0b3IKLSAgICAgb3IgZGVzdHJ1Y3RvciBuYW1lcyBhcyBjb2xsZWN0MiBkb2VzLgotICAgSEFTSFAsIGlmIG5vdCBOVUxMLCBpcyBhIHBsYWNlIHRvIHN0b3JlIHRoZSBjcmVhdGVkIGhhc2ggdGFibGUKLSAgICAgZW50cnk7IGlmICpIQVNIUCBpcyBub3QgTlVMTCwgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBsb29rZWQgdXAKLSAgICAgdGhlIGhhc2ggdGFibGUgZW50cnksIGFuZCBzdG9yZWQgaXQgaW4gKkhBU0hQLiAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkJCSAgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBlbnVtIGxpbmtfcm93IHJvdzsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gY3ljbGU7Ci0KLSAgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgIHx8IChmbGFncyAmIEJTRl9JTkRJUkVDVCkgIT0gMCkKLSAgICByb3cgPSBJTkRSX1JPVzsKLSAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCi0gICAgcm93ID0gV0FSTl9ST1c7Ci0gIGVsc2UgaWYgKChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMCkKLSAgICByb3cgPSBTRVRfUk9XOwotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHsKLSAgICAgIGlmICgoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMCkKLQlyb3cgPSBVTkRFRldfUk9XOwotICAgICAgZWxzZQotCXJvdyA9IFVOREVGX1JPVzsKLSAgICB9Ci0gIGVsc2UgaWYgKChmbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHJvdyA9IERFRldfUk9XOwotICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHJvdyA9IENPTU1PTl9ST1c7Ci0gIGVsc2UKLSAgICByb3cgPSBERUZfUk9XOwotCi0gIGlmIChoYXNocCAhPSBOVUxMICYmICpoYXNocCAhPSBOVUxMKQotICAgIGggPSAqaGFzaHA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocm93ID09IFVOREVGX1JPVyB8fCByb3cgPT0gVU5ERUZXX1JPVykKLQloID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOwotICAgICAgZWxzZQotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBpZiAoaGFzaHAgIT0gTlVMTCkKLQkgICAgKmhhc2hwID0gTlVMTDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLT5ub3RpY2VfYWxsCi0gICAgICB8fCAoaW5mby0+bm90aWNlX2hhc2ggIT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMCi0JICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCSAgICAgICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpKQotICAgIHsKLSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5ub3RpY2UpIChpbmZvLCBoLT5yb290LnN0cmluZywgYWJmZCwgc2VjdGlvbiwKLQkJCQkJdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGhhc2hwICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkKLSAgICAqaGFzaHAgPSBoOwotCi0gIGRvCi0gICAgewotICAgICAgZW51bSBsaW5rX2FjdGlvbiBhY3Rpb247Ci0KLSAgICAgIGN5Y2xlID0gZmFsc2U7Ci0gICAgICBhY3Rpb24gPSBsaW5rX2FjdGlvblsoaW50KSByb3ddWyhpbnQpIGgtPnR5cGVdOwotICAgICAgc3dpdGNoIChhY3Rpb24pCi0JewotCWNhc2UgRkFJTDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBOT0FDVDoKLQkgIC8qIERvIG5vdGhpbmcuICAqLwotCSAgYnJlYWs7Ci0KLQljYXNlIFVORDoKLQkgIC8qIE1ha2UgYSBuZXcgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT51LnVuZGVmLmFiZmQgPSBhYmZkOwotCSAgYmZkX2xpbmtfYWRkX3VuZGVmIChpbmZvLT5oYXNoLCBoKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBXRUFLOgotCSAgLyogTWFrZSBhIG5ldyB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOwotCSAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDREVGOgotCSAgLyogV2UgaGF2ZSBmb3VuZCBhIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIHdoaWNoIHdhcwotCSAgICAgcHJldmlvdXNseSBjb21tb24uICAqLwotCSAgQkZEX0FTU0VSVCAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkJIChpbmZvLCBoLT5yb290LnN0cmluZywKLQkJICBoLT51LmMucC0+c2VjdGlvbi0+b3duZXIsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBoLT51LmMuc2l6ZSwKLQkJICBhYmZkLCBiZmRfbGlua19oYXNoX2RlZmluZWQsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBERUY6Ci0JY2FzZSBERUZXOgotCSAgewotCSAgICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSBvbGR0eXBlOwotCi0JICAgIC8qIERlZmluZSBhIHN5bWJvbC4gICovCi0JICAgIG9sZHR5cGUgPSBoLT50eXBlOwotCSAgICBpZiAoYWN0aW9uID09IERFRlcpCi0JICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmd2VhazsKLQkgICAgZWxzZQotCSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOwotCSAgICBoLT51LmRlZi52YWx1ZSA9IHZhbHVlOwotCi0JICAgIC8qIElmIHdlIGhhdmUgYmVlbiBhc2tlZCB0bywgd2UgYWN0IGxpa2UgY29sbGVjdDIgYW5kCi0JICAgICAgIGlkZW50aWZ5IGFsbCBmdW5jdGlvbnMgdGhhdCBtaWdodCBiZSBnbG9iYWwKLQkgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQgcGFzcyB0aGVtIHVwIGluIGEKLQkgICAgICAgY2FsbGJhY2suICBXZSBvbmx5IGRvIHRoaXMgZm9yIGNlcnRhaW4gb2JqZWN0IGZpbGUKLQkgICAgICAgdHlwZXMsIHNpbmNlIG1hbnkgb2JqZWN0IGZpbGUgdHlwZXMgY2FuIGhhbmRsZSB0aGlzCi0JICAgICAgIGF1dG9tYXRpY2FsbHkuICAqLwotCSAgICBpZiAoY29sbGVjdCAmJiBuYW1lWzBdID09ICdfJykKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKnM7Ci0KLQkJLyogQSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUgc3RhcnRzIGxpa2UgdGhpczoKLQkJICAgXytHTE9CQUxfW18uJF1bSURdW18uJF0gd2hlcmUgdGhlIGZpcnN0IFtfLiRdIGFuZAotCQkgICB0aGUgc2Vjb25kIGFyZSB0aGUgc2FtZSBjaGFyYWN0ZXIgKHdlIGFjY2VwdCBhbnkKLQkJICAgY2hhcmFjdGVyIHRoZXJlLCBpbiBjYXNlIGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdAotCQkgICBjb21lcyBhbG9uZyB3aXRoIGV2ZW4gd29yc2UgbmFtaW5nIHJlc3RyaWN0aW9ucykuICAqLwotCi0jZGVmaW5lIENPTlNfUFJFRklYICJHTE9CQUxfIgotI2RlZmluZSBDT05TX1BSRUZJWF9MRU4gKHNpemVvZiBDT05TX1BSRUZJWCAtIDEpCi0KLQkJcyA9IG5hbWUgKyAxOwotCQl3aGlsZSAoKnMgPT0gJ18nKQotCQkgICsrczsKLQkJaWYgKHNbMF0gPT0gJ0cnCi0JCSAgICAmJiBzdHJuY21wIChzLCBDT05TX1BSRUZJWCwgQ09OU19QUkVGSVhfTEVOIC0gMSkgPT0gMCkKLQkJICB7Ci0JCSAgICBjaGFyIGM7Ci0KLQkJICAgIGMgPSBzW0NPTlNfUFJFRklYX0xFTiArIDFdOwotCQkgICAgaWYgKChjID09ICdJJyB8fCBjID09ICdEJykKLQkJCSYmIHNbQ09OU19QUkVGSVhfTEVOXSA9PSBzW0NPTlNfUFJFRklYX0xFTiArIDJdKQotCQkgICAgICB7Ci0JCQkvKiBJZiB0aGlzIGlzIGEgZGVmaW5pdGlvbiBvZiBhIHN5bWJvbCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHByZXZpb3VzbHkgd2Vha2x5IGRlZmluZWQsIHdlIGFyZSBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJvdWJsZS4gIFdlIGhhdmUgYWxyZWFkeSBhZGRlZCBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciBlbnRyeSBmb3IgdGhlIHdlYWsgZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLCBhbmQgbm93IHdlIGFyZSB0cnlpbmcgdG8gYWRkIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBuZXcgc3ltYm9sLiAgRm9ydHVuYXRlbHksIHRoaXMgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIG5ldmVyIGFyaXNlIGluIHByYWN0aWNlLiAgKi8KLQkJCWlmIChvbGR0eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJCSAgYWJvcnQgKCk7Ci0KLQkJCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+Y29uc3RydWN0b3IpCi0JCQkgICAgICAgKGluZm8sCi0JCQkJYyA9PSAnSScgPyB0cnVlIDogZmFsc2UsCi0JCQkJaC0+cm9vdC5zdHJpbmcsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKSkpCi0JCQkgIHJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBDT006Ci0JICAvKiBXZSBoYXZlIGZvdW5kIGEgY29tbW9uIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICBiZmRfbGlua19hZGRfdW5kZWYgKGluZm8tPmhhc2gsIGgpOwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOwotCSAgaC0+dS5jLnAgPQotCSAgICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSAqKQotCSAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQlzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKLQkgIGlmIChoLT51LmMucCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0KLQkgIC8qIFNlbGVjdCBhIGRlZmF1bHQgYWxpZ25tZW50IGJhc2VkIG9uIHRoZSBzaXplLiAgVGhpcyBtYXkKLSAgICAgICAgICAgICBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsZXIuICAqLwotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0KLQkgICAgcG93ZXIgPSBiZmRfbG9nMiAodmFsdWUpOwotCSAgICBpZiAocG93ZXIgPiA0KQotCSAgICAgIHBvd2VyID0gNDsKLQkgICAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCSAgfQotCi0JICAvKiBUaGUgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgaXMgb25seSB1c2VkIGlmIHRoZSBjb21tb24KLSAgICAgICAgICAgICBzeW1ib2wgaXMgYWN0dWFsbHkgYWxsb2NhdGVkLiAgSXQgYmFzaWNhbGx5IHByb3ZpZGVzIGEKLSAgICAgICAgICAgICBob29rIGZvciB0aGUgbGlua2VyIHNjcmlwdCB0byBkZWNpZGUgd2hpY2ggb3V0cHV0IHNlY3Rpb24KLSAgICAgICAgICAgICB0aGUgY29tbW9uIHN5bWJvbHMgc2hvdWxkIGJlIHB1dCBpbi4gIEluIG1vc3QgY2FzZXMsIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sIHdpbGwgYmUgYmZkX2NvbV9zZWN0aW9uX3B0ciwKLSAgICAgICAgICAgICB0aGUgY29kZSBoZXJlIHdpbGwgY2hvb3NlIGEgY29tbW9uIHN5bWJvbCBzZWN0aW9uIG5hbWVkCi0gICAgICAgICAgICAgIkNPTU1PTiIsIGFuZCB0aGUgbGlua2VyIHNjcmlwdCB3aWxsIGNvbnRhaW4gKihDT01NT04pIGluCi0gICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHBsYWNlLiAgQSBmZXcgdGFyZ2V0cyB1c2Ugc2VwYXJhdGUgY29tbW9uCi0gICAgICAgICAgICAgc2VjdGlvbnMgZm9yIHNtYWxsIHN5bWJvbHMsIGFuZCB0aGV5IHJlcXVpcmUgc3BlY2lhbAotICAgICAgICAgICAgIGhhbmRsaW5nLiAgKi8KLQkgIGlmIChzZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIpCi0JICAgIHsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIkNPTU1PTiIpOwotCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2VjdGlvbi0+b3duZXIgIT0gYWJmZCkKLQkgICAgewotCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLAotCQkJCQkJCSAgICBzZWN0aW9uLT5uYW1lKTsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBzZWN0aW9uOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJFRjoKLQkgIC8qIEEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgaWYgKGgtPm5leHQgPT0gTlVMTCAmJiBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCAhPSBoKQotCSAgICBoLT5uZXh0ID0gaDsKLQkgIGJyZWFrOwotCi0JY2FzZSBCSUc6Ci0JICAvKiBXZSBoYXZlIGZvdW5kIGEgY29tbW9uIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIHdoaWNoCi0JICAgICBhbHJlYWR5IGhhZCBhIGNvbW1vbiBkZWZpbml0aW9uLiAgVXNlIHRoZSBtYXhpbXVtIG9mIHRoZQotCSAgICAgdHdvIHNpemVzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JCSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgaC0+dS5jLnNpemUsCi0JCSAgYWJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHZhbHVlKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICh2YWx1ZSA+IGgtPnUuYy5zaXplKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHBvd2VyOwotCi0JICAgICAgaC0+dS5jLnNpemUgPSB2YWx1ZTsKLQotCSAgICAgIC8qIFNlbGVjdCBhIGRlZmF1bHQgYWxpZ25tZW50IGJhc2VkIG9uIHRoZSBzaXplLiAgVGhpcyBtYXkKLQkJIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNhbGxlci4gICovCi0JICAgICAgcG93ZXIgPSBiZmRfbG9nMiAodmFsdWUpOwotCSAgICAgIGlmIChwb3dlciA+IDQpCi0JCXBvd2VyID0gNDsKLQkgICAgICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDUkVGOgotCSAgewotCSAgICBiZmQgKm9iZmQ7Ci0KLQkgICAgLyogV2UgaGF2ZSBmb3VuZCBhIGNvbW1vbiBkZWZpbml0aW9uIGZvciBhIHN5bWJvbCB3aGljaAotCSAgICAgICB3YXMgYWxyZWFkeSBkZWZpbmVkLiAgRklYTUU6IEl0IHdvdWxkIG5pY2UgaWYgd2UgY291bGQKLQkgICAgICAgcmVwb3J0IHRoZSBCRkQgd2hpY2ggZGVmaW5lZCBhbiBpbmRpcmVjdCBzeW1ib2wsIGJ1dCB3ZQotCSAgICAgICBkb24ndCBoYXZlIGFueXdoZXJlIHRvIHN0b3JlIHRoZSBpbmZvcm1hdGlvbi4gICovCi0JICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICBvYmZkID0gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICAgIGVsc2UKLQkgICAgICBvYmZkID0gTlVMTDsKLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JCSAgIChpbmZvLCBoLT5yb290LnN0cmluZywgb2JmZCwgaC0+dHlwZSwgKGJmZF92bWEpIDAsCi0JCSAgICBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgdmFsdWUpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgTUlORDoKLQkgIC8qIE11bHRpcGxlIGluZGlyZWN0IHN5bWJvbHMuICBUaGlzIGlzIE9LIGlmIHRoZXkgYm90aCBwb2ludAotCSAgICAgdG8gdGhlIHNhbWUgc3ltYm9sLiAgKi8KLQkgIGlmIChzdHJjbXAgKGgtPnUuaS5saW5rLT5yb290LnN0cmluZywgc3RyaW5nKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBNREVGOgotCSAgLyogSGFuZGxlIGEgbXVsdGlwbGUgZGVmaW5pdGlvbi4gICovCi0JICB7Ci0JICAgIGFzZWN0aW9uICptc2VjID0gTlVMTDsKLQkgICAgYmZkX3ZtYSBtdmFsID0gMDsKLQotCSAgICBzd2l0Y2ggKGgtPnR5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCQltc2VjID0gaC0+dS5kZWYuc2VjdGlvbjsKLQkJbXZhbCA9IGgtPnUuZGVmLnZhbHVlOwotCQlicmVhazsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0JCW1zZWMgPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotCQltdmFsID0gMDsKLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJYWJvcnQgKCk7Ci0JICAgICAgfQotCi0JICAgIC8qIElnbm9yZSBhIHJlZGVmaW5pdGlvbiBvZiBhbiBhYnNvbHV0ZSBzeW1ib2wgdG8gdGhlIHNhbWUKLSAgICAgICAgICAgICAgIHZhbHVlOyBpdCdzIGhhcm1sZXNzLiAgKi8KLQkgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSYmIGJmZF9pc19hYnNfc2VjdGlvbiAobXNlYykKLQkJJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKQotCQkmJiB2YWx1ZSA9PSBtdmFsKQotCSAgICAgIGJyZWFrOwotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfZGVmaW5pdGlvbikKLQkJICAgKGluZm8sIGgtPnJvb3Quc3RyaW5nLCBtc2VjLT5vd25lciwgbXNlYywgbXZhbCwgYWJmZCwKLQkJICAgIHNlY3Rpb24sIHZhbHVlKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIENJTkQ6Ci0JICAvKiBDcmVhdGUgYW4gaW5kaXJlY3Qgc3ltYm9sIGZyb20gYW4gZXhpc3RpbmcgY29tbW9uIHN5bWJvbC4gICovCi0JICBCRkRfQVNTRVJUIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgKGluZm8sIGgtPnJvb3Quc3RyaW5nLAotCQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lciwgYmZkX2xpbmtfaGFzaF9jb21tb24sIGgtPnUuYy5zaXplLAotCQkgIGFiZmQsIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBJTkQ6Ci0JICAvKiBDcmVhdGUgYW4gaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmluaDsKLQotCSAgICAvKiBTVFJJTkcgaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB3ZSB3YW50IHRvIGluZGlyZWN0Ci0JICAgICAgIHRvLiAgKi8KLQkgICAgaW5oID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgc3RyaW5nLCB0cnVlLAotCQkJCQkJY29weSwgZmFsc2UpOwotCSAgICBpZiAoaW5oID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKGluaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgICB7Ci0JCWluaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCQlpbmgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JCWJmZF9saW5rX2FkZF91bmRlZiAoaW5mby0+aGFzaCwgaW5oKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSWYgdGhlIGluZGlyZWN0IHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLCB3ZSBuZWVkIHRvCi0JICAgICAgIHB1c2ggdGhlIHJlZmVyZW5jZSBkb3duIHRvIHRoZSBzeW1ib2wgd2UgYXJlCi0JICAgICAgIHJlZmVyZW5jaW5nLiAgKi8KLQkgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgICAgewotCQlyb3cgPSBVTkRFRl9ST1c7Ci0JCWN5Y2xlID0gdHJ1ZTsKLQkgICAgICB9Ci0KLQkgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q7Ci0JICAgIGgtPnUuaS5saW5rID0gaW5oOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFNFVDoKLQkgIC8qIEFkZCBhbiBlbnRyeSB0byBhIHNldC4gICovCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX3RvX3NldCkgKGluZm8sIGgsIEJGRF9SRUxPQ19DVE9SLAotCQkJCQkJYWJmZCwgc2VjdGlvbiwgdmFsdWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgV0FSTkM6Ci0JICAvKiBJc3N1ZSBhIHdhcm5pbmcgYW5kIGN5Y2xlLiAgKi8KLQkgIGlmIChoLT51Lmkud2FybmluZyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpIChpbmZvLCBoLT51Lmkud2FybmluZywKLQkJCQkJCSBoLT5yb290LnN0cmluZywgYWJmZCwKLQkJCQkJCSAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJCSAoYmZkX3ZtYSkgMCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAvKiBPbmx5IGlzc3VlIGEgd2FybmluZyBvbmNlLiAgKi8KLQkgICAgICBoLT51Lmkud2FybmluZyA9IE5VTEw7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBDWUNMRToKLQkgIC8qIFRyeSBhZ2FpbiB3aXRoIHRoZSByZWZlcmVuY2VkIHN5bWJvbC4gICovCi0JICBoID0gaC0+dS5pLmxpbms7Ci0JICBjeWNsZSA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgUkVGQzoKLQkgIC8qIEEgcmVmZXJlbmNlIHRvIGFuIGluZGlyZWN0IHN5bWJvbC4gICovCi0JICBpZiAoaC0+bmV4dCA9PSBOVUxMICYmIGluZm8tPmhhc2gtPnVuZGVmc190YWlsICE9IGgpCi0JICAgIGgtPm5leHQgPSBoOwotCSAgaCA9IGgtPnUuaS5saW5rOwotCSAgY3ljbGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIFdBUk46Ci0JICAvKiBJc3N1ZSBhIHdhcm5pbmcuICAqLwotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpIChpbmZvLCBzdHJpbmcsIGgtPnJvb3Quc3RyaW5nLAotCQkJCQkgICAgIGhhc2hfZW50cnlfYmZkIChoKSwKLQkJCQkJICAgICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQ1dBUk46Ci0JICAvKiBXYXJuIGlmIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQgYWxyZWFkeSwKLQkgICAgIG90aGVyd2lzZSBhZGQgYSB3YXJuaW5nLiAgQSBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZCBpZgotCSAgICAgdGhlIG5leHQgZmllbGQgaXMgbm90IE5VTEwsIG9yIGl0IGlzIHRoZSB0YWlsIG9mIHRoZQotCSAgICAgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LiAgVGhlIFJFRiBjYXNlIGFib3ZlIGhlbHBzIHRvCi0JICAgICBlbnN1cmUgdGhpcy4gICovCi0JICBpZiAoaC0+bmV4dCAhPSBOVUxMIHx8IGluZm8tPmhhc2gtPnVuZGVmc190YWlsID09IGgpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykgKGluZm8sIHN0cmluZywgaC0+cm9vdC5zdHJpbmcsCi0JCQkJCQkgaGFzaF9lbnRyeV9iZmQgKGgpLAotCQkJCQkJIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkJIChiZmRfdm1hKSAwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgTVdBUk46Ci0JICAvKiBNYWtlIGEgd2FybmluZyBzeW1ib2wuICAqLwotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqc3ViOwotCi0JICAgIC8qIFNUUklORyBpcyB0aGUgd2FybmluZyB0byBnaXZlLiAgKi8KLQkgICAgc3ViID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkgICAoKCppbmZvLT5oYXNoLT50YWJsZS5uZXdmdW5jKQotCQkgICAgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCwgJmluZm8tPmhhc2gtPnRhYmxlLAotCQkgICAgIGgtPnJvb3Quc3RyaW5nKSkpOwotCSAgICBpZiAoc3ViID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAqc3ViID0gKmg7Ci0JICAgIHN1Yi0+dHlwZSA9IGJmZF9saW5rX2hhc2hfd2FybmluZzsKLQkgICAgc3ViLT51LmkubGluayA9IGg7Ci0JICAgIGlmICghIGNvcHkpCi0JICAgICAgc3ViLT51Lmkud2FybmluZyA9IHN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY2hhciAqdzsKLQotCQl3ID0gYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkgICAgICAgc3RybGVuIChzdHJpbmcpICsgMSk7Ci0JCWlmICh3ID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlzdHJjcHkgKHcsIHN0cmluZyk7Ci0JCXN1Yi0+dS5pLndhcm5pbmcgPSB3OwotCSAgICAgIH0KLQotCSAgICBiZmRfaGFzaF9yZXBsYWNlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkgICAgICAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIGgsCi0JCQkgICAgICAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHN1Yik7Ci0JICAgIGlmIChoYXNocCAhPSBOVUxMKQotCSAgICAgICpoYXNocCA9IHN1YjsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjeWNsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBHZW5lcmljIGZpbmFsIGxpbmsgcm91dGluZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKnN1YjsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG91dHN5bWFsbG9jOwotICBzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gd2dpbmZvOwotCi0gIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSAoYXN5bWJvbCAqKikgTlVMTDsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotICBvdXRzeW1hbGxvYyA9IDA7Ci0KLSAgLyogTWFyayBhbGwgc2VjdGlvbnMgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQlwLT51LmluZGlyZWN0LnNlY3Rpb24tPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotICAvKiBCdWlsZCB0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZS4gICovCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IChiZmQgKikgTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMgKGFiZmQsIHN1YiwgaW5mbywgJm91dHN5bWFsbG9jKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBY2N1bXVsYXRlIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIHdnaW5mby5pbmZvID0gaW5mbzsKLSAgd2dpbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICB3Z2luZm8ucHN5bWFsbG9jID0gJm91dHN5bWFsbG9jOwotICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RyYXZlcnNlIChfYmZkX2dlbmVyaWNfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCwKLQkJCQkgICAoUFRSKSAmd2dpbmZvKTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHRyYWlsaW5nIE5VTEwgcG9pbnRlciBvbiBPVVRTWU1CT0xTLiAgV2UKLSAgICAgc2hvdWxkbid0IHJlYWxseSBuZWVkIG9uZSwgc2luY2Ugd2UgaGF2ZSBTWU1DT1VOVCwgYnV0IHNvbWUgb2xkCi0gICAgIGNvZGUgc3RpbGwgZXhwZWN0cyBvbmUuICAqLwotICBpZiAoISBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sIChhYmZkLCAmb3V0c3ltYWxsb2MsIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgb3V0cHV0IHJlbG9jcyBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIG8gIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgbyA9IG8tPm5leHQpCi0JewotCSAgby0+cmVsb2NfY291bnQgPSAwOwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JCSsrby0+cmVsb2NfY291bnQ7Ci0JICAgICAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCQkgIGJmZCAqaW5wdXRfYmZkOwotCQkgIGxvbmcgcmVsc2l6ZTsKLQkJICBhcmVsZW50ICoqcmVsb2NzOwotCQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCQkgIGxvbmcgcmVsb2NfY291bnQ7Ci0KLQkJICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCQkgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCQkgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JCSAgaWYgKHJlbHNpemUgPCAwKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIHJlbG9jcyA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxzaXplKTsKLQkJICBpZiAoIXJlbG9jcyAmJiByZWxzaXplICE9IDApCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgc3ltYm9scyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpOwotCQkgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCQkJcmVsb2NzLAotCQkJCQkJCXN5bWJvbHMpOwotCQkgIGlmIChyZWxvY19jb3VudCA8IDApCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgQkZEX0FTU0VSVCAoKHVuc2lnbmVkIGxvbmcpIHJlbG9jX2NvdW50Ci0JCQkgICAgICA9PSBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0JCSAgby0+cmVsb2NfY291bnQgKz0gcmVsb2NfY291bnQ7Ci0JCSAgZnJlZSAocmVsb2NzKTsKLQkJfQotCSAgICB9Ci0JICBpZiAoby0+cmVsb2NfY291bnQgPiAwKQotCSAgICB7Ci0JICAgICAgby0+b3JlbG9jYXRpb24gPSAoKGFyZWxlbnQgKiopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoby0+cmVsb2NfY291bnQKLQkJCQkJICAgICogc2l6ZW9mIChhcmVsZW50ICopKSkpOwotCSAgICAgIGlmICghby0+b3JlbG9jYXRpb24pCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBvLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JICAgICAgLyogUmVzZXQgdGhlIGNvdW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXgKLQkJIHdoZW4gcHV0dGluZyBpbiB0aGUgb3V0cHV0IHJlbG9jcy4gICovCi0JICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBIYW5kbGUgYWxsIHRoZSBsaW5rIG9yZGVyIGluZm9ybWF0aW9uIGZvciB0aGUgc2VjdGlvbnMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBvICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICBwID0gcC0+bmV4dCkKLQl7Ci0JICBzd2l0Y2ggKHAtPnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyOgotCSAgICBjYXNlIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcjoKLQkgICAgICBpZiAoISBfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcjoKLQkgICAgICBpZiAoISBkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHAsIHRydWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbiBvdXRwdXQgc3ltYm9sIHRvIHRoZSBvdXRwdXQgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKG91dHB1dF9iZmQsIHBzeW1hbGxvYywgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHNpemVfdCAqcHN5bWFsbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKSA+PSAqcHN5bWFsbG9jKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKipuZXdzeW1zOwotCi0gICAgICBpZiAoKnBzeW1hbGxvYyA9PSAwKQotCSpwc3ltYWxsb2MgPSAxMjQ7Ci0gICAgICBlbHNlCi0JKnBzeW1hbGxvYyAqPSAyOwotICAgICAgbmV3c3ltcyA9IChhc3ltYm9sICoqKSBiZmRfcmVhbGxvYyAoYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKSwKLQkJCQkJICAqcHN5bWFsbG9jICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIGlmIChuZXdzeW1zID09IChhc3ltYm9sICoqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCkgPSBuZXdzeW1zOwotICAgIH0KLQotICBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpIFtiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKV0gPSBzeW07Ci0gIGlmIChzeW0gIT0gTlVMTCkKLSAgICArKyBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIHRoZSBzeW1ib2xzIGZvciBhbiBpbnB1dCBCRkQuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLCBwc3ltYWxsb2MpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzaXplX3QgKnBzeW1hbGxvYzsKLXsKLSAgYXN5bWJvbCAqKnN5bV9wdHI7Ci0gIGFzeW1ib2wgKipzeW1fZW5kOwotCi0gIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSBhIGZpbGVuYW1lIHN5bWJvbCBpZiB3ZSBhcmUgc3VwcG9zZWQgdG8uICAqLwotICBpZiAoaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgZm9yIChzZWMgPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgIHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgICBzZWMgPSBzZWMtPm5leHQpCi0JewotCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBhc3ltYm9sICpuZXdzeW07Ci0KLQkgICAgICBuZXdzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGlucHV0X2JmZCk7Ci0JICAgICAgaWYgKCFuZXdzeW0pCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBuZXdzeW0tPm5hbWUgPSBpbnB1dF9iZmQtPmZpbGVuYW1lOwotCSAgICAgIG5ld3N5bS0+dmFsdWUgPSAwOwotCSAgICAgIG5ld3N5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUwgfCBCU0ZfRklMRTsKLQkgICAgICBuZXdzeW0tPnNlY3Rpb24gPSBzZWM7Ci0KLQkgICAgICBpZiAoISBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sIChvdXRwdXRfYmZkLCBwc3ltYWxsb2MsCi0JCQkJCSAgICAgICBuZXdzeW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSB2YWx1ZXMgb2YgdGhlIGdsb2JhbGx5IHZpc2libGUgc3ltYm9scywgYW5kIHdyaXRlIG91dAotICAgICBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgc3ltX3B0ciA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpOwotICBzeW1fZW5kID0gc3ltX3B0ciArIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoaW5wdXRfYmZkKTsKLSAgZm9yICg7IHN5bV9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYm9vbGVhbiBvdXRwdXQ7Ci0KLSAgICAgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEw7Ci0gICAgICBzeW0gPSAqc3ltX3B0cjsKLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfSU5ESVJFQ1QKLQkJCSB8IEJTRl9XQVJOSU5HCi0JCQkgfCBCU0ZfR0xPQkFMCi0JCQkgfCBCU0ZfQ09OU1RSVUNUT1IKLQkJCSB8IEJTRl9XRUFLKSkgIT0gMAotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgIHx8IGJmZF9pc19pbmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICBpZiAoc3ltLT51ZGF0YS5wICE9IE5VTEwpCi0JICAgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIHN5bS0+dWRhdGEucDsKLQkgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBjYXNlIG5vcm1hbGx5IG1lYW5zIHRoYXQgdGhlIG1haW4gbGlua2VyIGNvZGUKLSAgICAgICAgICAgICAgICAgZGVsaWJlcmF0ZWx5IGlnbm9yZWQgdGhpcyBjb25zdHJ1Y3RvciBzeW1ib2wuICBXZQotICAgICAgICAgICAgICAgICBzaG91bGQganVzdCBwYXNzIGl0IHRocm91Z2guICBUaGlzIHdpbGwgc2NyZXcgdXAgaWYKLSAgICAgICAgICAgICAgICAgdGhlIGNvbnN0cnVjdG9yIHN5bWJvbCBpcyBmcm9tIGEgZGlmZmVyZW50LAotICAgICAgICAgICAgICAgICBub24tZ2VuZXJpYywgb2JqZWN0IGZpbGUgZm9ybWF0LCBidXQgdGhlIGNhc2Ugd2lsbAotICAgICAgICAgICAgICAgICBvbmx5IGFyaXNlIHdoZW4gbGlua2luZyB3aXRoIC1yLCB3aGljaCB3aWxsIHByb2JhYmx5Ci0gICAgICAgICAgICAgICAgIGZhaWwgYW55aG93LCBzaW5jZSB0aGVyZSB3aWxsIGJlIG5vIHdheSB0byByZXByZXNlbnQKLSAgICAgICAgICAgICAgICAgdGhlIHJlbG9jcyBpbiB0aGUgb3V0cHV0IGZvcm1hdCBiZWluZyB1c2VkLiAgKi8KLQkgICAgICBoID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICBoID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikKLQkJIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCSAgICAgICBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCQkgICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JICBlbHNlCi0JICAgIGggPSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX2xvb2t1cCAoX2JmZF9nZW5lcmljX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkgICAgICAgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKLQkJCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLQkgIGlmIChoICE9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEZvcmNlIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sIHRvIHBvaW50IHRvCi0JCSB0aGUgc2FtZSBhcmVhIGluIG1lbW9yeS4gIEl0IGlzIHBvc3NpYmxlIHRoYXQKLQkJIHRoaXMgcm91dGluZSB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgaGFzaCB0YWJsZQotCQkgb3RoZXIgdGhhbiBhIGdlbmVyaWMgaGFzaCB0YWJsZSwgc28gd2UgZG91YmxlCi0JCSBjaGVjayB0aGF0LiAgKi8KLQkgICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBpbnB1dF9iZmQtPnh2ZWMpCi0JCXsKLQkJICBpZiAoaC0+c3ltICE9IChhc3ltYm9sICopIE5VTEwpCi0JCSAgICAqc3ltX3B0ciA9IHN5bSA9IGgtPnN5bTsKLQkJfQotCi0JICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLQkJICBhYm9ydCAoKTsKLQkJY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkJICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0JCSAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkJICAvKiBmYWxsIHRocm91Z2ggKi8KLQkJY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JCSAgc3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCQkgIHN5bS0+ZmxhZ3MgJj1+IEJTRl9DT05TVFJVQ1RPUjsKLQkJICBzeW0tPnZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICBzeW0tPnNlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0JCSAgc3ltLT5mbGFncyAmPX4gQlNGX0NPTlNUUlVDVE9SOwotCQkgIHN5bS0+dmFsdWUgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotCQkgIHN5bS0+c2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkJICBzeW0tPnZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKLQkJICBzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0JCSAgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpOwotCQkgICAgICBzeW0tPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCQkgICAgfQotCQkgIC8qIFdlIGRvIG5vdCBzZXQgdGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbCB0bwotCQkgICAgIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24uICBUaGF0IHZhbHVlIHdhcyBzYXZlZCBzbwotCQkgICAgIHRoYXQgd2Ugd291bGQga25vdyB3aGVyZSB0byBhbGxvY2F0ZSB0aGUgc3ltYm9sCi0JCSAgICAgaWYgaXQgd2FzIGRlZmluZWQuICBJbiB0aGlzIGNhc2UgdGhlIHR5cGUgaXMKLQkJICAgICBzdGlsbCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc28gd2UgZGlkIG5vdCBkZWZpbmUKLQkJICAgICBpdCwgc28gd2UgZG8gbm90IHdhbnQgdG8gdXNlIHRoYXQgc2VjdGlvbi4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogVGhpcyBzd2l0Y2ggaXMgc3RyYWlnaHQgZnJvbSB0aGUgb2xkIGNvZGUgaW4KLQkgd3JpdGVfZmlsZV9sb2NhbHMgaW4gbGRzeW0uYy4gICovCi0gICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICB8fCAoaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGluZm8tPmtlZXBfaGFzaCwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JCSAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKSkpCi0Jb3V0cHV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKSAhPSAwKQotCXsKLQkgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG1hcmtlZCBhcyBvY2N1cnJpbmcgbm93LCByYXRoZXIKLQkgICAgIHRoYW4gYXQgdGhlIGVuZCwgb3V0cHV0IGl0IG5vdy4gIFRoaXMgaXMgdXNlZCBmb3IKLQkgICAgIENPRkYgQ19FWFQgRkNOIHN5bWJvbHMuICBGSVhNRTogVGhlcmUgbXVzdCBiZSBhCi0JICAgICBiZXR0ZXIgd2F5LiAgKi8KLQkgIGlmIChiZmRfYXN5bWJvbF9iZmQgKHN5bSkgPT0gaW5wdXRfYmZkCi0JICAgICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgIT0gMCkKLQkgICAgb3V0cHV0ID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgb3V0cHV0ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCW91dHB1dCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotCXsKLQkgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lKQotCSAgICBvdXRwdXQgPSB0cnVlOwotCSAgZWxzZQotCSAgICBvdXRwdXQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkgICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCW91dHB1dCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApCi0JewotCSAgaWYgKChzeW0tPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCi0JICAgIG91dHB1dCA9IGZhbHNlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChpbmZvLT5kaXNjYXJkKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgZGlzY2FyZF9hbGw6Ci0JCSAgb3V0cHV0ID0gZmFsc2U7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgZGlzY2FyZF9sOgotCQkgIGlmIChiZmRfaXNfbG9jYWxfbGFiZWwgKGlucHV0X2JmZCwgc3ltKSkKLQkJICAgIG91dHB1dCA9IGZhbHNlOwotCQkgIGVsc2UKLQkJICAgIG91dHB1dCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgZGlzY2FyZF9ub25lOgotCQkgIG91dHB1dCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSkKLQl7Ci0JICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCSAgICBvdXRwdXQgPSB0cnVlOwotCSAgZWxzZQotCSAgICBvdXRwdXQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGluIGEgc2VjdGlvbiB3aGljaCBpcyBub3QgYmVpbmcgaW5jbHVkZWQKLQkgaW4gdGhlIG91dHB1dCBmaWxlLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gb3V0cHV0IHRoZSBzeW1ib2wuCi0KLQkgR3Jvc3MuICAuYnNzIGFuZCBzaW1pbGFyIHNlY3Rpb25zIHdvbid0IGhhdmUgdGhlIGxpbmtlcl9tYXJrCi0JIGZpZWxkIHNldC4gICovCi0gICAgICBpZiAoKHN5bS0+c2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCi0JICAmJiBzeW0tPnNlY3Rpb24tPmxpbmtlcl9tYXJrID09IGZhbHNlKQotCW91dHB1dCA9IGZhbHNlOwotCi0gICAgICBpZiAob3V0cHV0KQotCXsKLQkgIGlmICghIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKG91dHB1dF9iZmQsIHBzeW1hbGxvYywgc3ltKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGggIT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBoLT53cml0dGVuID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNlY3Rpb24gYW5kIHZhbHVlIG9mIGEgZ2VuZXJpYyBCRkQgc3ltYm9sIGJhc2VkIG9uIGEgbGlua2VyCi0gICBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9zeW1ib2xfZnJvbV9oYXNoIChzeW0sIGgpCi0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIHN3aXRjaCAoaC0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29uc3RydWN0b3Igc3ltYm9sIGlzIHNlZW4gYnV0IHdlIGFyZQotICAgICAgICAgbm90IGJ1aWxkaW5nIGNvbnN0cnVjdG9ycy4gICovCi0gICAgICBpZiAoc3ltLT5zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgQkZEX0FTU0VSVCAoKHN5bS0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW0tPmZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIHN5bS0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBzeW0tPnZhbHVlID0gMDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIHN5bS0+dmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIHN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW0tPnZhbHVlID0gMDsKLSAgICAgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgIHN5bS0+c2VjdGlvbiA9IGgtPnUuZGVmLnNlY3Rpb247Ci0gICAgICBzeW0tPnZhbHVlID0gaC0+dS5kZWYudmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0gICAgICBzeW0tPnNlY3Rpb24gPSBoLT51LmRlZi5zZWN0aW9uOwotICAgICAgc3ltLT52YWx1ZSA9IGgtPnUuZGVmLnZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIHN5bS0+dmFsdWUgPSBoLT51LmMuc2l6ZTsKLSAgICAgIGlmIChzeW0tPnNlY3Rpb24gPT0gTlVMTCkKLQlzeW0tPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JewotCSAgQkZEX0FTU0VSVCAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKLQkgIHN5bS0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgLyogRG8gbm90IHNldCB0aGUgc2VjdGlvbjsgc2VlIF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlPyAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogV3JpdGUgb3V0IGEgZ2xvYmFsIHN5bWJvbCwgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiB3cml0dGVuIG91dC4KLSAgIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbyAqd2dpbmZvID0KLSAgICAoc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvICopIGRhdGE7Ci0gIGFzeW1ib2wgKnN5bTsKLQotICBpZiAoaC0+d3JpdHRlbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoLT53cml0dGVuID0gdHJ1ZTsKLQotICBpZiAod2dpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLSAgICAgIHx8ICh3Z2luZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICYmIGJmZF9oYXNoX2xvb2t1cCAod2dpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5zeW0gIT0gKGFzeW1ib2wgKikgTlVMTCkKLSAgICBzeW0gPSBoLT5zeW07Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKHdnaW5mby0+b3V0cHV0X2JmZCk7Ci0gICAgICBpZiAoIXN5bSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzeW0tPm5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgc3ltLT5mbGFncyA9IDA7Ci0gICAgfQotCi0gIHNldF9zeW1ib2xfZnJvbV9oYXNoIChzeW0sICZoLT5yb290KTsKLQotICBzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0KLSAgaWYgKCEgZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAod2dpbmZvLT5vdXRwdXRfYmZkLCB3Z2luZm8tPnBzeW1hbGxvYywKLQkJCQkgICBzeW0pKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGZhaWx1cmUuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSByZWxvY2F0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBhcmVsZW50ICpyOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHNlYy0+b3JlbG9jYXRpb24gPT0gKGFyZWxlbnQgKiopIE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgciA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhcmVsZW50KSk7Ci0gIGlmIChyID09IChhcmVsZW50ICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAgICAgCi0gIHItPmFkZHJlc3MgPSBsaW5rX29yZGVyLT5vZmZzZXQ7Ci0gIHItPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKHItPmhvd3RvID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgc3ltYm9sIHRvIHVzZSBmb3IgdGhlIHJlbG9jYXRpb24uICAqLwotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQotICAgIHItPnN5bV9wdHJfcHRyID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLAotCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgfHwgISBoLT53cml0dGVuKQotCXsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJIChpbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJICAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByLT5zeW1fcHRyX3B0ciA9ICZoLT5zeW07Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYW4gaW5wbGFjZSByZWxvYywgd3JpdGUgdGhlIGFkZGVuZCB0byB0aGUgb2JqZWN0IGZpbGUuCi0gICAgIE90aGVyd2lzZSwgc3RvcmUgaXQgaW4gdGhlIHJlbG9jIGFkZGVuZC4gICovCi0gIGlmICghIHItPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UpCi0gICAgci0+YWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoci0+aG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChyLT5ob3d0bywgYWJmZCwKLQkJCQkgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKGFiZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQotCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKLQkJICByLT5ob3d0by0+bmFtZSwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsCi0JCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5rX29yZGVyLT5vZmZzZXQgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfb2N0ZXRzX3Blcl9ieXRlIChhYmZkKSksIHNpemUpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGlmICghIG9rKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgci0+YWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgc2VjLT5vcmVsb2NhdGlvbltzZWMtPnJlbG9jX2NvdW50XSA9IHI7Ci0gICsrc2VjLT5yZWxvY19jb3VudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEFsbG9jYXRlIGEgbmV3IGxpbmtfb3JkZXIgZm9yIGEgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBiZmRfbGlua19vcmRlciAqCi1iZmRfbmV3X2xpbmtfb3JkZXIgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbmV3OwotCi0gIG5ldyA9ICgoc3RydWN0IGJmZF9saW5rX29yZGVyICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIpKSk7Ci0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotCi0gIG5ldy0+dHlwZSA9IGJmZF91bmRlZmluZWRfbGlua19vcmRlcjsKLSAgbmV3LT5vZmZzZXQgPSAwOwotICBuZXctPnNpemUgPSAwOwotICBuZXctPm5leHQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLSAgaWYgKHNlY3Rpb24tPmxpbmtfb3JkZXJfdGFpbCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEwpCi0gICAgc2VjdGlvbi0+bGlua19vcmRlcl90YWlsLT5uZXh0ID0gbmV3OwotICBlbHNlCi0gICAgc2VjdGlvbi0+bGlua19vcmRlcl9oZWFkID0gbmV3OwotICBzZWN0aW9uLT5saW5rX29yZGVyX3RhaWwgPSBuZXc7Ci0KLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogRGVmYXVsdCBsaW5rIG9yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gIE5vdGUgdGhhdCB3ZSBjYW4gbm90IGhhbmRsZQotICAgdGhlIHJlbG9jX2xpbmtfb3JkZXIgdHlwZXMgaGVyZSwgc2luY2UgdGhleSBkZXBlbmQgdXBvbiB0aGUgZGV0YWlscwotICAgb2YgaG93IHRoZSBwYXJ0aWN1bGFyIGJhY2tlbmRzIGdlbmVyYXRlcyByZWxvY3MuICAqLwotCi1ib29sZWFuCi1fYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHN3aXRjaCAobGlua19vcmRlci0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfdW5kZWZpbmVkX2xpbmtfb3JkZXI6Ci0gICAgY2FzZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyOgotICAgIGNhc2UgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyOgotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyOgotICAgICAgcmV0dXJuIGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyLAotCQkJCQkgIGZhbHNlKTsKLSAgICBjYXNlIGJmZF9maWxsX2xpbmtfb3JkZXI6Ci0gICAgICByZXR1cm4gZGVmYXVsdF9maWxsX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlcik7Ci0gICAgY2FzZSBiZmRfZGF0YV9saW5rX29yZGVyOgotICAgICAgcmV0dXJuIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLAotCQkJCSAgICAgICAoUFRSKSBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMsCi0JCQkJICAgICAgIChmaWxlX3B0cikgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlua19vcmRlci0+b2Zmc2V0ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfb2N0ZXRzX3Blcl9ieXRlIChhYmZkKSksCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnNpemUpOwotICAgIH0KLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBhIGJmZF9maWxsX2xpbmtfb3JkZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1kZWZhdWx0X2ZpbGxfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKnNwYWNlOwotICBzaXplX3QgaTsKLSAgaW50IGZpbGw7Ci0gIGJvb2xlYW4gcmVzdWx0OwotCi0gIEJGRF9BU1NFUlQgKChzZWMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCk7Ci0KLSAgc2l6ZSA9IChzaXplX3QpIGxpbmtfb3JkZXItPnNpemU7Ci0gIHNwYWNlID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc2l6ZSk7Ci0gIGlmIChzcGFjZSA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsbCA9IGxpbmtfb3JkZXItPnUuZmlsbC52YWx1ZTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gMikKLSAgICBzcGFjZVtpXSA9IGZpbGwgPj4gODsKLSAgZm9yIChpID0gMTsgaSA8IHNpemU7IGkgKz0gMikKLSAgICBzcGFjZVtpXSA9IGZpbGw7Ci0gIHJlc3VsdCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBzcGFjZSwKLQkJCQkgICAgIChmaWxlX3B0cikgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmtfb3JkZXItPm9mZnNldCAqIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfb2N0ZXRzX3Blcl9ieXRlIChhYmZkKSksCi0JCQkJICAgICBsaW5rX29yZGVyLT5zaXplKTsKLSAgZnJlZSAoc3BhY2UpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBEZWZhdWx0IHJvdXRpbmUgdG8gaGFuZGxlIGEgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlciwKLQkJCSAgICAgZ2VuZXJpY19saW5rZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBib29sZWFuIGdlbmVyaWNfbGlua2VyOwotewotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpuZXdfY29udGVudHM7Ci0KLSAgQkZEX0FTU0VSVCAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOwotCi0gIGlmIChsaW5rX29yZGVyLT5zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0KLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gb3V0cHV0X3NlY3Rpb24pOwotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID09IGxpbmtfb3JkZXItPm9mZnNldCk7Ci0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9PSBsaW5rX29yZGVyLT5zaXplKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDAKLSAgICAgICYmIG91dHB1dF9zZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSAoYXJlbGVudCAqKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTcGFjZSBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgb3V0cHV0IHJlbG9jYXRpb25zLgotCSBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhcmUgY2FsbGVkIGJ5IGEgc3BlY2lmaWMgYmFja2VuZAotCSBiZWNhdXNlIHNvbWVib2R5IGlzIGF0dGVtcHRpbmcgdG8gbGluayB0b2dldGhlciBkaWZmZXJlbnQKLQkgdHlwZXMgb2Ygb2JqZWN0IGZpbGVzLiAgSGFuZGxpbmcgdGhpcyBjYXNlIGNvcnJlY3RseSBpcwotCSBkaWZmaWN1bHQsIGFuZCBzb21ldGltZXMgaW1wb3NzaWJsZS4gICovCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiQXR0ZW1wdCB0byBkbyByZWxvY2F0ZWFibGUgbGluayB3aXRoICVzIGlucHV0IGFuZCAlcyBvdXRwdXQiKSwKLQkgYmZkX2dldF90YXJnZXQgKGlucHV0X2JmZCksIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgZ2VuZXJpY19saW5rZXIpCi0gICAgewotICAgICAgYXN5bWJvbCAqKnN5bXBwOwotICAgICAgYXN5bWJvbCAqKnN5bXBwZW5kOwotCi0gICAgICAvKiBHZXQgdGhlIGNhbm9uaWNhbCBzeW1ib2xzLiAgVGhlIGdlbmVyaWMgbGlua2VyIHdpbGwgYWx3YXlzCi0JIGhhdmUgcmV0cmlldmVkIHRoZW0gYnkgdGhpcyBwb2ludCwgYnV0IHdlIGFyZSBiZWluZyBjYWxsZWQgYnkKLQkgYSBzcGVjaWZpYyBsaW5rZXIsIHByZXN1bWFibHkgYmVjYXVzZSB3ZSBhcmUgbGlua2luZwotCSBkaWZmZXJlbnQgdHlwZXMgb2Ygb2JqZWN0IGZpbGVzIHRvZ2V0aGVyLiAgKi8KLSAgICAgIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTaW5jZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGJ5IGEgc3BlY2lmaWMgbGlua2VyLCByYXRoZXIgdGhhbgotCSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHRoZSB2YWx1ZXMgb2YgdGhlIHN5bWJvbHMgd2lsbCBub3QgYmUKLQkgcmlnaHQuICBUaGV5IHdpbGwgYmUgdGhlIHZhbHVlcyBhcyBzZWVuIGluIHRoZSBpbnB1dCBmaWxlLAotCSBub3QgdGhlIHZhbHVlcyBvZiB0aGUgZmluYWwgbGluay4gIFdlIG5lZWQgdG8gZml4IHRoZW0gdXAKLQkgYmVmb3JlIHdlIGNhbiByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gICovCi0gICAgICBzeW1wcCA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpOwotICAgICAgc3ltcHBlbmQgPSBzeW1wcCArIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoaW5wdXRfYmZkKTsKLSAgICAgIGZvciAoOyBzeW1wcCA8IHN5bXBwZW5kOyBzeW1wcCsrKQotCXsKLQkgIGFzeW1ib2wgKnN5bTsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBzeW0gPSAqc3ltcHA7Ci0KLQkgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfSU5ESVJFQ1QKLQkJCSAgICAgfCBCU0ZfV0FSTklORwotCQkJICAgICB8IEJTRl9HTE9CQUwKLQkJCSAgICAgfCBCU0ZfQ09OU1RSVUNUT1IKLQkJCSAgICAgfCBCU0ZfV0VBSykpICE9IDAKLQkgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIHsKLQkgICAgICAvKiBzeW0tPnVkYXRhIG1heSBoYXZlIGJlZW4gc2V0IGJ5Ci0JCSBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0LiAgKi8KLQkgICAgICBpZiAoc3ltLT51ZGF0YS5wICE9IE5VTEwpCi0JCWggPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgc3ltLT51ZGF0YS5wOwotCSAgICAgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkJaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCQkgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJCQkgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JICAgICAgZWxzZQotCQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsCi0JCQkJCSAgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKLQkJCQkJICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCXNldF9zeW1ib2xfZnJvbV9oYXNoIChzeW0sIGgpOwotCSAgICB9Ci0JfQkgIAotICAgIH0KLQotICAvKiBHZXQgYW5kIHJlbG9jYXRlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgY29udGVudHMgPSAoKGJmZF9ieXRlICopCi0JICAgICAgYmZkX21hbGxvYyAoYmZkX3NlY3Rpb25fc2l6ZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSkpOwotICBpZiAoY29udGVudHMgPT0gTlVMTCAmJiBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG5ld19jb250ZW50cyA9IChiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0JCSAgKG91dHB1dF9iZmQsIGluZm8sIGxpbmtfb3JkZXIsIGNvbnRlbnRzLCBpbmZvLT5yZWxvY2F0ZWFibGUsCi0JCSAgIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpKSk7Ci0gIGlmICghbmV3X2NvbnRlbnRzKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIE91dHB1dCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sCi0JCQkJICAoUFRSKSBuZXdfY29udGVudHMsCi0JCQkJICAoZmlsZV9wdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmtfb3JkZXItPm9mZnNldCAqIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfb2N0ZXRzX3Blcl9ieXRlIChvdXRwdXRfYmZkKSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfb3JkZXItPnNpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBIGxpdHRsZSByb3V0aW5lIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcmVsb2NzIGluIGEgbGlua19vcmRlcgotICAgbGlzdC4gICovCi0KLXVuc2lnbmVkIGludAotX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyAobGlua19vcmRlcikKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKLSAgcmVnaXN0ZXIgc3RydWN0IGJmZF9saW5rX29yZGVyICpsOwotCi0gIGMgPSAwOwotICBmb3IgKGwgPSBsaW5rX29yZGVyOyBsICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCSAgfHwgbC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JKytjOwotICAgIH0KLQotICByZXR1cm4gYzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGJmZF9saW5rX3NwbGl0X3NlY3Rpb24oYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gbm9uemVybyBpZiBAdmFye3NlY30gc2hvdWxkIGJlIHNwbGl0IGR1cmluZyBhCi0JcmVsb2NlYXRhYmxlIG9yIGZpbmFsIGxpbmsuCi0KLS4jZGVmaW5lIGJmZF9saW5rX3NwbGl0X3NlY3Rpb24oYWJmZCwgc2VjKSBcCi0uICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiwgKGFiZmQsIHNlYykpCi0uCi0KLSovCi0KLQotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9seW54LWNvcmUuYyBiL2JmZC9seW54LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1ODE3Ny4uMDAwMDAwMAotLS0gYS9iZmQvbHlueC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyogQkZEIGJhY2sgZW5kIGZvciBMeW54IGNvcmUgZmlsZXMKLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLSNpbmNsdWRlIDxzeXMvY29uZi5oPgotI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KLS8qIHN5cy9rZXJuZWwuaCBzaG91bGQgZGVmaW5lIHRoaXMsIGJ1dCBkb2Vzbid0IGFsd2F5cywgc2lnaC4gKi8KLSNpZm5kZWYgX19MWU5YT1MKLSNkZWZpbmUgX19MWU5YT1MKLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9tZW0uaD4KLSNpbmNsdWRlIDxzeXMvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxzeXMvaXRpbWVyLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxzeXMvcHJvYy5oPgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi1zdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgY2hhciBjbWRbUE5NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5seW54X2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi0vKiBIYW5kbGUgTHlueCBjb3JlIGR1bXAgZmlsZS4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIGlmICghbmV3bmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmV3bmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1seW54X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBzZWNudW07Ci0gIHN0cnVjdCBwc3NlbnRyeSBwc3M7Ci0gIHNpemVfdCB0Y29udGV4dF9zaXplOwotICBjb3JlX3N0X3QgKnRocmVhZHA7Ci0gIGludCBwYWdlc2l6ZTsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0KLSAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsJLyogU2VyaW91cyBjcm9zcy10YXJnZXQgaXNzdWUgaGVyZS4uLiAgVGhpcwotCQkJCSAgIHJlYWxseSBuZWVkcyB0byBjb21lIGZyb20gYSBzeXN0ZW0tc3BlY2lmaWMKLQkJCQkgICBoZWFkZXIgZmlsZS4gICovCi0KLSAgLyogR2V0IHRoZSBwc3MgZW50cnkgZnJvbSB0aGUgY29yZSBmaWxlICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmcHNzLCAxLCBzaXplb2YgcHNzLCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgcHNzKQotICAgIHsKLSAgICAgIC8qIFRvbyBzbWFsbCB0byBiZSBhIGNvcmUgZmlsZSAqLwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QpKTsKLQotICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBwc3MucG5hbWUsIFBOTUxFTiArIDEpOwotCi0gIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHRocmVhZCBjb250ZXh0cyAqLwotCi0gIHRjb250ZXh0X3NpemUgPSBwc3MudGhyZWFkY250ICogc2l6ZW9mIChjb3JlX3N0X3QpOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdGhyZWFkIGNvbnRleHRzICovCi0KLSAgdGhyZWFkcCA9IChjb3JlX3N0X3QgKiliZmRfYWxsb2MgKGFiZmQsIHRjb250ZXh0X3NpemUpOwotICBpZiAoIXRocmVhZHApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU2F2ZSB0aHJlYWQgY29udGV4dHMgKi8KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHBhZ2VzaXplLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKil0aHJlYWRwLCBwc3MudGhyZWFkY250LCBzaXplb2YgKGNvcmVfc3RfdCksIGFiZmQpOwotCi0gIGlmICh2YWwgIT0gdGNvbnRleHRfc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSB0b28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IHRocmVhZHAtPmN1cnJzaWc7Ci0KLSAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwKLQkJCSAgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgcHNzLnNzaXplLAotCQkJICAgICAgIHBzcy5zbGltaXQsCi0JCQkgICAgICAgcGFnZXNpemUgKyB0Y29udGV4dF9zaXplKTsKLSAgaWYgKCFuZXdzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCSAgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgcHNzLmRhdGFfbGVuICsgcHNzLmJzc19sZW4sCi0JCQkgICAgICAgcHNzLmRhdGFfc3RhcnQsCi0JCQkgICAgICAgcGFnZXNpemUgKyB0Y29udGV4dF9zaXplICsgcHNzLnNzaXplCi0jaWYgZGVmaW5lZCAoU1BBUkMpIHx8IGRlZmluZWQgKF9fU1BBUkNfXykKLQkJCSAgICAgICAvKiBTUEFSQyBMeW54IHNlZW1zIHRvIHN0YXJ0IGR1bXBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgLmRhdGEgc2VjdGlvbiBhdCBhIHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeS4gIEl0J3MgT0sgdG8gY2hlY2sgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgbGlrZSBTUEFSQyBoZXJlIGJlY2F1c2UgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gYSBMeW54Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC4gICovCi0JCQkgICAgICAgKyBwc3MuZGF0YV9zdGFydCAlIHBhZ2VzaXplCi0jZW5kaWYKLQkJCSAgICAgICApOwotICBpZiAoIW5ld3NlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLS8qIEFuZCwgbm93IGZvciB0aGUgLnJlZy9YWFggcHNldWRvIHNlY3Rpb25zLiAgRWFjaCB0aHJlYWQgaGFzIGl0J3Mgb3duCi0gICAucmVnL1hYWCBzZWN0aW9uLCB3aGVyZSBYWFggaXMgdGhlIHRocmVhZCBpZCAod2l0aG91dCBsZWFkaW5nIHplcm9zKS4gIFRoZQotICAgY3VycmVudGx5IHJ1bm5pbmcgdGhyZWFkIChhdCB0aGUgdGltZSBvZiB0aGUgY29yZSBkdW1wKSBhbHNvIGhhcyBhbiBhbGlhcwotICAgY2FsbGVkIGAucmVnJyAoanVzdCB0byBrZWVwIEdEQiBoYXBweSkuICBOb3RlIHRoYXQgd2UgdXNlIGAucmVnL1hYWCcgYXMKLSAgIG9wcG9zZWQgdG8gYC5yZWdYWFgnIGJlY2F1c2UgR0RCIGV4cGVjdHMgdGhhdCAucmVnMiB3aWxsIGJlIHRoZSBmbG9hdGluZy0KLSAgIHBvaW50IHJlZ2lzdGVycy4gICovCi0KLSAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCQkgICAgICAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgICAgICBzaXplb2YgKGNvcmVfc3RfdCksCi0JCQkgICAgICAgMCwKLQkJCSAgICAgICBwYWdlc2l6ZSk7Ci0gIGlmICghbmV3c2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKHNlY251bSA9IDA7IHNlY251bSA8IHBzcy50aHJlYWRjbnQ7IHNlY251bSsrKQotICAgIHsKLSAgICAgIGNoYXIgc2VjbmFtZVsxMDBdOwotCi0gICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIEJVSUxEUElEICgwLCB0aHJlYWRwW3NlY251bV0udGlkKSk7Ci0gICAgICBuZXdzZWN0ID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0JCQkJICAgU0VDX0hBU19DT05URU5UUywKLQkJCQkgICBzaXplb2YgKGNvcmVfc3RfdCksCi0JCQkJICAgMCwKLQkJCQkgICBwYWdlc2l6ZSArIHNlY251bSAqIHNpemVvZiAoY29yZV9zdF90KSk7Ci0gICAgICBpZiAoIW5ld3NlY3QpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1jaGFyICoKLWx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWJvb2xlYW4KLWx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvbTY4azRrbmV0YnNkLmMgYi9iZmQvbTY4azRrbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzQzOGQuLjAwMDAwMDAKLS0tIGEvYmZkL202OGs0a25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgxMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLNEtfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChtNjhrNGtuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4azRrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL202OGtsaW51eC5jIGIvYmZkL202OGtsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjUxNzU3Li4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc3MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIG02OGsgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzY4MDIwIHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tNjhrCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a2xpbnV4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4ay1saW51eCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgTVkodmVjKTsKLQotLyogV2UgYWx3YXlzIGdlbmVyYXRlIFFNQUdJQyBmaWxlcyBpbiBwcmVmZXJlbmNlIHRvIFpNQUdJQyBmaWxlcy4gIEl0Ci0gICB3b3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoaXMgYSBsaW5rZXIgb3B0aW9uLCBpZiB0aGF0IGV2ZXIKLSAgIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotc3RhdGljIGJvb2xlYW4gbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtNjhrbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1tNjhrbGludXhfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tNjhrbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotDAotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZQlHT1RfUkVGX1BSRUZJWAkiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2lmbmRlZiBQTFRfUkVGX1BSRUZJWAotI2RlZmluZQlQTFRfUkVGX1BSRUZJWAkiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIGxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmR5bm9iaiA9IE5VTEw7Ci0gIHJldC0+Zml4dXBfY291bnQgPSAwOwotICByZXQtPmxvY2FsX2J1aWx0aW5zID0gMDsKLSAgcmV0LT5maXh1cF9saXN0ID0gTlVMTDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcuICAqLwotICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0KLSAgLyogV2UgY2hvb3NlIHRvIHVzZSB0aGUgbmFtZSAiLmxpbnV4LWR5bmFtaWMiIGZvciB0aGUgZml4dXAgdGFibGUuCi0gICAgIFdoeSBub3Q/ICovCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHMtPl9yYXdfc2l6ZSA9IDA7Ci0gIHMtPmNvbnRlbnRzID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gYWRkIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGlzIGlzCi0gICBhIHdyYXBwZXIgYXJvdW5kIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdoaWNoIGhhbmRsZXMgdGhlCi0gICB0d2Vha2luZyBuZWVkZWQgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywKLQkJICAgICAgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYm9vbGVhbiBpbnNlcnQ7Ci0KLSAgLyogTG9vayB1cCBhbmQgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4KLSAgICAgSWYgd2UgZG8sIGFuZCB0aGUgZGVmaW5pbmcgZW50cnkgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCB3ZQotICAgICBuZWVkIHRvIGNyZWF0ZSB0aGUgZHluYW1pYyBzZWN0aW9ucy4KLQotICAgICBGSVhNRTogV2hhdCBpZiBhYmZkLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3I/ICBXZSBtYXkgd2FudCB0bwotICAgICBiZSBhYmxlIHRvIGxpbmsgTGludXggYS5vdXQgYW5kIEVMRiBvYmplY3RzIHRvZ2V0aGVyLCBidXQgc2VyaW91cwotICAgICBjb25mdXNpb24gaXMgcG9zc2libGUuICAqLwotCi0gIGluc2VydCA9IGZhbHNlOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG5hbWUsIFNIQVJBQkxFX0NPTkZMSUNUUykgPT0gMAotICAgICAgJiYgKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaWYgKCEgbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGFiZmQ7Ci0gICAgICBpbnNlcnQgPSB0cnVlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKQotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgZmFsc2UsCi0JCQkJICBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgc3RydWN0IGZpeHVwICpmOwotCi0JICBpZiAoaGFzaHAgIT0gTlVMTCkKLQkgICAgKmhhc2hwID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCAhIElTX1BMVF9TWU0gKG5hbWUpKTsKLQkgIGlmIChmID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGYtPmp1bXAgPSBJU19QTFRfU1lNIChuYW1lKTsKLQotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBEbyB0aGUgdXN1YWwgcHJvY2VkdXJlIGZvciBhZGRpbmcgYSBzeW1ib2wuICAqLwotICBpZiAoISBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sCi0JCQkJCSAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLQkJCQkJICBoYXNocCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEluc2VydCBhIHBvaW50ZXIgdG8gb3VyIHRhYmxlIGluIHRoZSBzZXQgdmVjdG9yLiAgVGhlIGR5bmFtaWMKLSAgICAgbGlua2VyIHJlcXVpcmVzIHRoaXMgaW5mb3JtYXRpb24gKi8KLSAgaWYgKGluc2VydCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogSGVyZSB3ZSBkbyBvdXIgc3BlY2lhbCB0aGluZyB0byBhZGQgdGhlIHBvaW50ZXIgdG8gdGhlCi0JIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGUgU0hBUkFCTEVfQ09ORkxJQ1RTIHNldCB2ZWN0b3IuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCSAgICIubGludXgtZHluYW1pYyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgU0hBUkFCTEVfQ09ORkxJQ1RTLAotCSAgICAgIEJTRl9HTE9CQUwgfCBCU0ZfQ09OU1RSVUNUT1IsIHMsIDAsIE5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIHdpbGwgY3Jhd2wgdGhlIGhhc2ggdGFibGUgYW5kIGNvbWUgaGVyZSBmb3IgZXZlcnkgZ2xvYmFsIHN5bWJvbC4KLSAgIFdlIHdpbGwgZXhhbWluZSBlYWNoIGVudHJ5IGFuZCBzZWUgaWYgdGhlcmUgYXJlIGluZGljYXRpb25zIHRoYXQgd2UKLSAgIG5lZWQgdG8gYWRkIGEgZml4dXAuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGNhc2VzIC0gb25lIGlzIHdoZXJlCi0gICB5b3UgaGF2ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb2YgUExUIG9yIEdPVCBzeW1ib2xzIC0gdGhlc2Ugd2lsbAotICAgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0IGFuZCBhZGRlZCBhcyAiYnVpbHRpbiIgZml4dXBzLiAgSWYgd2UgZmluZAotICAgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBub24gUExUL0dPVCBzeW1ib2wgaXMgYWxzbyBwcmVzZW50LCB3ZQotICAgY29udmVydCBpdCB0byBhIHJlZ3VsYXIgZml4dXAgaW5zdGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF90YWxseV9zeW1ib2xzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgZGF0YTsKLSAgc3RydWN0IGZpeHVwICpmLCAqZjE7Ci0gIGludCBpc19wbHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmgxLCAqaDI7Ci0gIGJvb2xlYW4gZXhpc3RzOwotCi0gIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBORUVEU19TSFJMSUIsCi0JCSAgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDEpID09IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjaGFyICphbGxvYyA9IE5VTEw7Ci0KLSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcgKyBzaXplb2YgTkVFRFNfU0hSTElCIC0gMTsKLSAgICAgIHAgPSBzdHJyY2hyIChuYW1lLCAnXycpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLQlhbGxvYyA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLQotICAgICAgaWYgKHAgPT0gTlVMTCB8fCBhbGxvYyA9PSBOVUxMKQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzJ1xuIiksCi0JCQkgICAgICAgbmFtZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyY3B5IChhbGxvYywgbmFtZSk7Ci0JICBwID0gc3RycmNociAoYWxsb2MsICdfJyk7Ci0JICAqcCsrID0gJ1wwJzsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIiksCi0JICAgICBhbGxvYywgcCk7Ci0JICBmcmVlIChhbGxvYyk7Ci0JfQotCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGEgUExUL0dPVCwgd2UgZG8gbm90IGV2ZW4gbmVlZCB0byBsb29rIGF0IGl0ICovCi0gIGlzX3BsdCA9IElTX1BMVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0KLSAgaWYgKGlzX3BsdCB8fCBJU19HT1RfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpKQotICAgIHsKLSAgICAgIC8qIExvb2sgdXAgdGhpcyBzeW1ib2wgdHdpY2UuICBPbmNlIGp1c3QgYXMgYSByZWd1bGFyIGxvb2t1cCwKLQkgYW5kIHRoZW4gYWdhaW4gZm9sbG93aW5nIGFsbCBvZiB0aGUgaW5kaXJlY3QgbGlua3MgdW50aWwgd2UKLQkgcmVhY2ggYSByZWFsIHN5bWJvbC4gICovCi0gICAgICBoMSA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLQkJCQkgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgLyogaDIgZG9lcyBub3QgZm9sbG93IGluZGlyZWN0IHN5bWJvbHMuICovCi0gICAgICBoMiA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIC8qIFRoZSByZWFsIHN5bWJvbCBtdXN0IGV4aXN0IGJ1dCBpZiBpdCBpcyBhbHNvIGFuIEFCUyBzeW1ib2wsCi0JIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGF2ZSBhIGZpeHVwLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgYm90aAotCSBjYW1lIGZyb20gdGhlIHNhbWUgbGlicmFyeS4gIElmIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBoYWQgdG8KLQkgdXNlIGFuIGluZGlyZWN0IHN5bWJvbCB0byBnZXQgdG8gdGhlIHJlYWwgc3ltYm9sLCB3ZSBhZGQgdGhlCi0JIGZpeHVwIGFueXdheSwgc2luY2UgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZXNlIHN5bWJvbHMgY29tZQotCSBmcm9tIGRpZmZlcmVudCBzaGFyZWQgbGlicmFyaWVzICovCi0gICAgICBpZiAoaDEgIT0gTlVMTAotCSAgJiYgKCgoaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaDEtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkgICAgICB8fCBoMi0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkpCi0JewotCSAgLyogU2VlIGlmIHRoZXJlIGlzIGEgImJ1aWx0aW4iIGZpeHVwIGFscmVhZHkgcHJlc2VudAotCSAgICAgaW52b2x2aW5nIHRoaXMgc3ltYm9sLiAgSWYgc28sIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyCi0JICAgICBmaXh1cC4gIEluIHRoZSBlbmQsIHRoaXMgcmVsYXhlcyBzb21lIG9mIHRoZSByZXF1aXJlbWVudHMKLQkgICAgIGFib3V0IHRoZSBvcmRlciBvZiBwZXJmb3JtaW5nIGZpeHVwcy4gICovCi0JICBleGlzdHMgPSBmYWxzZTsKLQkgIGZvciAoZjEgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLQkgICAgICAgZjEgIT0gTlVMTDsKLQkgICAgICAgZjEgPSBmMS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgoZjEtPmggIT0gaCAmJiBmMS0+aCAhPSBoMSkKLQkJICB8fCAoISBmMS0+YnVpbHRpbiAmJiAhIGYxLT5qdW1wKSkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGYxLT5oID09IGgxKQotCQlleGlzdHMgPSB0cnVlOwotCSAgICAgIGlmICghIGV4aXN0cwotCQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCQl7Ci0JCSAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGYxLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOwotCQkgIGYtPmp1bXAgPSBpc19wbHQ7Ci0JCX0KLQkgICAgICBmMS0+aCA9IGgxOwotCSAgICAgIGYxLT5qdW1wID0gaXNfcGx0OwotCSAgICAgIGYxLT5idWlsdGluID0gMDsKLQkgICAgICBleGlzdHMgPSB0cnVlOwotCSAgICB9Ci0JICBpZiAoISBleGlzdHMKLQkgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkgICAgewotCSAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBoLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOwotCSAgICAgIGlmIChmID09IE5VTEwpCi0JCXsKLQkJICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBmLT5qdW1wID0gaXNfcGx0OwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBRdWljayBhbmQgZGlydHkgd2F5IG9mIHN0cmlwcGluZyB0aGVzZSBzeW1ib2xzIGZyb20gdGhlCi0JIHN5bXRhYi4gKi8KLSAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQloLT5yb290LndyaXR0ZW4gPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSAubGludXgtZHluYW1pYyBzZWN0aW9uIGlzLgotICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMaW51eCBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uCi0gICByb3V0aW5lLiAgV2UgaGF2ZSBmaW5pc2hlZCByZWFkaW5nIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMsIGFuZCBub3cKLSAgIHdlIGp1c3Qgc2NhbiB0aGUgaGFzaCB0YWJsZXMgdG8gZmluZCBvdXQgaG93IG1hbnkgYWRkaXRpb25hbCBmaXh1cHMKLSAgIGFyZSByZXF1aXJlZC4gICovCi0KLWJvb2xlYW4KLWJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0IGZpbmQgdGhlIGZpeHVwcy4uLiAqLwotICBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIGxpbnV4X3RhbGx5X3N5bWJvbHMsCi0JCQkgICAgKFBUUikgaW5mbyk7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGJ1aWx0aW4gZml4dXBzLCBsZWF2ZSByb29tIGZvciBhIG1hcmtlci4gIFRoaXMgaXMKLSAgICAgdXNlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgc28gdGhhdCBpdCBrbm93cyB0aGF0IGFsbCB0aGF0IGZvbGxvdwotICAgICBhcmUgYnVpbHRpbiBmaXh1cHMgaW5zdGVhZCBvZiByZWd1bGFyIGZpeHVwcy4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotCXsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OwotCSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnM7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IDApCi0JYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZml4dXAgdGFibGUuICBXZSB3aWxsIGZpbGwgaXQgaW4gbGF0ZXIuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgcy0+X3Jhd19zaXplID0gOCArIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAqIDg7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgY29tZSBoZXJlIG9uY2Ugd2UgYXJlIHJlYWR5IHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBmaXh1cCB0YWJsZSB0bwotICAgdGhlIG91dHB1dCBmaWxlLiAgU2NhbiB0aGUgZml4dXAgdGFibGVzIGFuZCBzbyBmb3J0aCBhbmQgZ2VuZXJhdGUKLSAgIHRoZSBzdHVmZiB3ZSBuZWVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzLCAqb3MsICppczsKLSAgYmZkX2J5dGUgKmZpeHVwX3RhYmxlOwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIHVuc2lnbmVkIGludCBuZXdfYWRkcjsKLSAgaW50IHNlY3Rpb25fb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgZml4dXBzX3dyaXR0ZW47Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247Ci0gIGZpeHVwc193cml0dGVuID0gMDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgcHJpbnRmICgiRml4dXAgdGFibGUgZmlsZSBvZmZzZXQ6ICV4ICBWTUE6ICV4XG4iLCAKLQkgIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkgIG9zLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCi0gIGZpeHVwX3RhYmxlID0gcy0+Y29udGVudHM7Ci0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCwgZml4dXBfdGFibGUpOwotICBmaXh1cF90YWJsZSArPSA0OwotCi0gIC8qIEZpbGwgaW4gZml4dXAgdGFibGUuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQljb250aW51ZTsKLQotICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotCSAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJGaXh1cCglZCkgJXM6ICV4ICV4XG4iLGYtPmp1bXAsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICBpZiAoZi0+anVtcCkKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlICsgMiwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQl9Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zICE9IDApCi0gICAgewotICAgICAgLyogU3BlY2lhbCBtYXJrZXIgc28gd2Uga25vdyB0byBzd2l0Y2ggdG8gdGhlIG90aGVyIHR5cGUgb2YgZml4dXAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotCXsKLQkgIGlmICghIGYtPmJ1aWx0aW4pCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0JCSBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0JICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotCSAgcHJpbnRmICgiRml4dXAoQikgJXM6ICV4ICV4XG4iLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCQkgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgICsrZml4dXBzX3dyaXR0ZW47Ci0JfQotICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAhPSBmaXh1cHNfd3JpdHRlbikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iKSk7Ci0gICAgICB3aGlsZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gZml4dXBzX3dyaXR0ZW4pCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICArK2ZpeHVwc193cml0dGVuOwotCX0KLSAgICB9Ci0KLSAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCSAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAotCQkJICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICBpcyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkJ1aWx0aW4gZml4dXAgdGFibGUgYXQgJXhcbiIsIG5ld19hZGRyKTsKLSNlbmRpZgotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgIH0KLSAgZWxzZQotICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIG91dHB1dF9iZmQpCi0gICAgICAhPSBzLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgbGludXhfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0KLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9tNjhrbHlueC5jIGIvYmZkL202OGtseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhY2RmYmMuLjAwMDAwMDAKLS0tIGEvYmZkL202OGtseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIG02OGsgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tNjhrCi0KLSNkZWZpbmUgTVkoT1ApIENBVChtNjhrbHlueF9hb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4ay1seW54IgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLSNpZmRlZiBMWU5YX0NPUkUKLQotY2hhciAqbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwoKTsKLWJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AoKTsKLWNvbnN0IGJmZF90YXJnZXQgKmx5bnhfY29yZV9maWxlX3AoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9tNjhrbmV0YnNkLmMgYi9iZmQvbTY4a25ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQxNjY1Li4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9tNjhrIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotLyogT3VyIG02OGsgcG9ydHMgdXNlIGVpdGhlciA0SyBvciA4SyBwYWdlcywgYnV0IG9iamVjdCBmaWxlcyBhbHdheXMKLSAgIGFzc3VtZSA4SyBwYWdlIGFsaWdubWVudCBzbyB0aGV5IHdpbGwgd29yayBvbiBhbGwgbTY4ayBtYWNoaW5lcy4gKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRQkweDIwMDAKLQotI2RlZmluZSBERUZBVUxUX0FSQ0gJYmZkX2FyY2hfbTY4awotI2RlZmluZSBERUZBVUxUX01JRCAJTV82OEtfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChtNjhrbmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGstbmV0YnNkIgotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvbTg4a21hY2gzLmMgYi9iZmQvbTg4a21hY2gzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTY0MDguLjAwMDAwMDAKLS0tIGEvYmZkL204OGttYWNoMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSBtODhrIGEub3V0IChNYWNoIDMpIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkoNDA5NioyKQotI2RlZmluZSBTRUdNRU5UX1NJWkUJMHgyMDAwMAotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMAotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxIAkJLyogKE5fTUFHSUcoeCkgPT0gWk1BR0lDKSAqLwotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lIE5fVFhUU0laRSh4KQkoKHgpLmFfdGV4dCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTg4awotI2RlZmluZSBNWShPUCkgQ0FUKG04OGttYWNoM18sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW04OGstbWFjaDMiCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL21ha2VmaWxlLnZtcyBiL2JmZC9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmIxZmYuLjAwMDAwMDAKLS0tIGEvYmZkL21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGJmZCBsaWJyYXJ5IHVuZGVyIG9wZW5WTVMgKEFscGhhIGFuZCBWYXgpCi0jCi0jIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHJtaS5kZQotIwotIwotCi1DQz1jYwotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotSE9TVEZJTEU9YWxwaGF2bXMuaAotVEFSR0VUT0JKUyA9IGNwdS1hbHBoYS5vYmoKLWVsc2UKLUhPU1RGSUxFPXZheHZtcy5oCi1UQVJHRVRPQkpTID0gY3B1LXZheC5vYmoKLWVuZGlmCi0KLQotT0JKUz1hcmNoaXZlLm9iaixhcmNodXJlcy5vYmosYmZkLm9iaixjYWNoZS5vYmosY29mZmdlbi5vYmosY29yZWZpbGUub2JqLFwKLSAgZm9ybWF0Lm9iaixpbml0Lm9iaixsaWJiZmQub2JqLG9wbmNscy5vYmoscmVsb2Mub2JqLHNlY3Rpb24ub2JqLHN5bXMub2JqLFwKLSAgdGFyZ2V0cy5vYmosaGFzaC5vYmosbGlua2VyLm9iaixlbGYub2JqLHNyZWMub2JqLGJpbmFyeS5vYmosdGVraGV4Lm9iaixcCi0gIGloZXgub2JqLHN0YWItc3ltcy5vYmosdm1zLm9iaix2bXMtaGRyLm9iaix2bXMtZ3NkLm9iaix2bXMtdGlyLm9iaixcCi0gIHZtcy1taXNjLm9iaiwkKFRBUkdFVE9CSlMpCi0KLWlmZXEgKCQoQ0MpLGdjYykKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX2FscGhhX3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfYWxwaGFfYXJjaCIsXAotIkhBVkVfdm1zX2FscGhhX3ZlYz0xIikKLWVsc2UKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfdmF4X3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfdmF4X2FyY2giLFwKLSJIQVZFX3Ztc192YXhfdmVjPTEiLCJWTVNfREVCVUciKQotZW5kaWYKLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pJChERUZTKQotZWxzZQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfYWxwaGFfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF9hbHBoYV9hcmNoIixcCi0iSEFWRV92bXNfYWxwaGFfdmVjPTEiLCJ1bmxpbms9cmVtb3ZlIiwiY29uc3Q9IiwiVk1TX0RFQlVHIiwpCi1lbHNlCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX3ZheF92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX3ZheF9hcmNoIixcCi0iSEFWRV92bXNfdmF4X3ZlYz0xIiwidW5saW5rPXJlbW92ZSIsImNvbnN0PSIsIlZNU19ERUJVRyIpCi1lbmRpZgotQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkkKERFRlMpL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1lbmRpZgotCi0KLWxpYmJmZC5vbGI6IHN5c2RlcC5oIGJmZC5oICQoT0JKUykKLQlwdXJnZQotCWxpYi9jcmVhdGUgbGliYmZkICQoT0JKUykKLQotc3lzZGVwLmg6IFsuaG9zdHNdJChIT1NURklMRSkgY29uZmlnLmgKLQkkKENQKSAkPCAkQAotCi1iZmQuaDogYmZkLWluMi5oCi0JJCQgQGNvbmZpZ3VyZQotCi10YXJnbWF0Y2guaDogYmZkLmgKLWNvbmZpZy5oOiBiZmQuaAotCi12bXMuYzogdm1zLmgKLXZtcy1taGQuYzogdm1zLmgKLXZtcy1nc2QuYzogdm1zLmgKLXZtcy10aXIuYzogdm1zLmgKLXZtcy1taXNjLmM6IHZtcy5oCi10YXJnZXRzLmM6IHRhcmdtYXRjaC5oCi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgbGliYmZkLm9sYjsKLQkkKFJNKSBzeXNkZXAuaDsKLQkkKFJNKSBiZmQuaDsKLQkkKFJNKSB0YXJnbWF0Y2guaDsKLQkkKFJNKSBjb25maWcuaDsKLQkkKFJNKSAqLm9iajsKZGlmZiAtLWdpdCBhL2JmZC9taXBzYnNkLmMgYi9iZmQvbWlwc2JzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTY4MGZiLi4wMDAwMDAwCi0tLSBhL2JmZC9taXBzYnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIE1JUFMgQlNEIChhLm91dCkgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBSYWxwaCBDYW1wYmVsbC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotLyogI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVSTyAqLwotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgICAoTl9NQUdJQyh4KSAhPSBaTUFHSUMgPyAoeCkuYV9lbnRyeSA6CS8qIG9iamVjdCBmaWxlIG9yIE5NQUdJQyAqL1wKLQkgICAgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFCS8qIG5vIHBhZGRpbmcgKi9cCi0gICAgKQotI2RlZmluZSBOX0RBVEFERFIoeCkgKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCkpCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiA0MDk2Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbWlwcwotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9VTktOT1dOIFwKLQkJCSAgICB8fCAobXR5cGUpID09IE1fTUlQUzEgfHwgKG10eXBlKSA9PSBNX01JUFMyKQotI2RlZmluZSBNWV9zeW1ib2xfbGVhZGluZ19jaGFyICdcMCcKLQotI2RlZmluZSBNWShPUCkgQ0FUKG1pcHNic2RfLE9QKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goQUJGRCwgRVhFQykgXAotICBNWShzZXRfYXJjaF9tYWNoKShBQkZELCBOX01BQ0hUWVBFIChFWEVDKSk7IFwKLSAgTVkoY2hvb3NlX3JlbG9jX3NpemUpKEFCRkQpOwotc3RhdGljIHZvaWQgTVkoc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgbWFjaHR5cGUpKTsKLXN0YXRpYyB2b2lkIE1ZKGNob29zZV9yZWxvY19zaXplKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotc3RhdGljIGJvb2xlYW4gTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogV2UgY2FuJ3QgdXNlIE1ZKHgpIGhlcmUgYmVjYXVzZSBpdCBsZWFkcyB0byBhIHJlY3Vyc2l2ZSBjYWxsIHRvIENBVAotICAgd2hlbiBleHBhbmRlZCBpbnNpZGUgSlVNUF9UQUJMRS4gICovCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBtaXBzYnNkX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBtaXBzYnNkX2Nhbm9uaWNhbGl6ZV9yZWxvYwotCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgdW51c2VkCi0jZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0KLSNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCi0jZGVmaW5lIE1ZX0JGRF9UQVJHRVQKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0KLXN0YXRpYyB2b2lkCi1NWShzZXRfYXJjaF9tYWNoKSAoYWJmZCwgbWFjaHR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG1hY2h0eXBlOwotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgbG9uZyBtYWNoaW5lOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAqLwotICBzd2l0Y2ggKG1hY2h0eXBlKSB7Ci0KLSAgY2FzZSBNX01JUFMxOgotICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgIG1hY2hpbmUgPSAzMDAwOwotICAgIGJyZWFrOwotCi0gIGNhc2UgTV9NSVBTMjoKLSAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICBtYWNoaW5lID0gNDAwMDsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgIG1hY2hpbmUgPSAwOwotICAgIGJyZWFrOwotICB9Ci0gIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGFyY2gsIG1hY2hpbmUpOyAgCi19Ci0KLS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnksIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1NWShjaG9vc2VfcmVsb2Nfc2l6ZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gQlNEIGEub3V0IGZvcm1hdC4KLSAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1NWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaChhYmZkKSkgewotICAgIGNhc2UgYmZkX21hY2hfbTY4MDEwOgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4MDEwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjgwMjApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9TUEFSQyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMzg2KTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV8yOUspOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgc3dpdGNoIChiZmRfZ2V0X21hY2goYWJmZCkpIHsKLSAgICBjYXNlIDQwMDA6Ci0gICAgY2FzZSA2MDAwOgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX01JUFMyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fTUlQUzEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9VTktOT1dOKTsKLSAgfQotCi0gIE1ZKGNob29zZV9yZWxvY19zaXplKShhYmZkKTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLSAqIE1JUFMgcmVsb2NhdGlvbiB0eXBlcy4KLSAqLwotI2RlZmluZSBNSVBTX1JFTE9DXzMyCQkwCi0jZGVmaW5lIE1JUFNfUkVMT0NfSk1QCQkxCi0jZGVmaW5lIE1JUFNfUkVMT0NfV0RJU1AxNgkyCi0jZGVmaW5lIE1JUFNfUkVMT0NfSEkxNgkJMwotI2RlZmluZSBNSVBTX1JFTE9DX0hJMTZfUwk0Ci0jZGVmaW5lIE1JUFNfUkVMT0NfTE8xNgkJNQotCi0vKgotICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHBlcmZvcm1pbmcgYSBCRkRfUkVMT0NfTUlQU19KTVAgcmVsb2NhdGlvbi4KLSAqIFRoZSBqdW1wIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgZm9ybWVkIGZyb20gdGhlIHVwcGVyIDQgYml0cyBvZiB0aGUKLSAqICJjdXJyZW50IiBwcm9ncmFtIGNvdW50ZXIgY29uY2F0ZW5hdGVkIHdpdGggdGhlIGp1bXAgaW5zdHJ1Y3Rpb24ncwotICogMjYgYml0IGZpZWxkIGFuZCB0d28gdHJhaWxpbmcgemVyb3MuCi0gKiBJZiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBub3QgaW4gdGhlIHNhbWUgc2VnbWVudCBhcyB0aGUgImN1cnJlbnQiCi0gKiBwcm9ncmFtIGNvdW50ZXIsIHRoZW4gd2UgbmVlZCB0byBzaWduYWwgYW4gZXJyb3IuCi0gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZml4X2ptcF9hZGRyIChhYmZkLHJlbG9jX2VudHJ5LHN5bWJvbCxkYXRhLGlucHV0X3NlY3Rpb24sb3V0cHV0X2JmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbiwgcGM7Ci0gCi0gIC8qIElmIHRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGp1c3QgY29udGludWUuICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiAKLSAgICogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgKiBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4KLSAgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBwYyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArIDQ7Ci0KLSAgaWYgKChyZWxvY2F0aW9uICYgMHhGMDAwMDAwMCkgIT0gKHBjICYgMHhGMDAwMDAwMCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKgotICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHBlcmZvcm1pbmcgYSBCRkRfUkVMT0NfSEkxNl9TIHJlbG9jYXRpb24uCi0gKiBXZSBuZWVkIHRvIHNlZSBpZiBiaXQgMTUgaXMgc2V0IGluIHRoZSByZXN1bHQuIElmIGl0IGlzLCB3ZSBhZGQKLSAqIDB4MTAwMDAgYW5kIGNvbnRpbnVlIG5vcm1hbGx5LiBUaGlzIHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uCi0gKiB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQgYXQgcnVuIHRpbWUuCi0gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZml4X2hpMTZfcyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCSBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9oaTE2X3MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gCi0gIC8qIElmIHRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGp1c3QgY29udGludWUuICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiAKLSAgICogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgKiBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4KLSAgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBpZiAocmVsb2NhdGlvbiAmIDB4ODAwMCkKLSAgICByZWxvY19lbnRyeS0+YWRkZW5kICs9IDB4MTAwMDA7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19ob3d0b190YWJsZV9leHRbXSA9IHsKLSAge01JUFNfUkVMT0NfMzIsICAgICAgMCwgMiwgMzIsIGZhbHNlLCAwLCAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsCi0JIjMyIiwgICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfSk1QLCAgICAgMiwgMiwgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCW1pcHNfZml4X2ptcF9hZGRyLAotCSJNSVBTX0pNUCIsIGZhbHNlLCAwLCAweDAzZmZmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX1dESVNQMTYsIDIsIDIsIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotCSJXRElTUDE2IiwgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0hJMTYsICAgMTYsIDIsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsCi0JIkhJMTYiLCAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfSEkxNl9TLCAxNiwgMiwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICAgICAgbWlwc19maXhfaGkxNl9zLAotICAgICAgICAiSEkxNl9TIiwgICBmYWxzZSwgMCwgMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19MTzE2LCAgICAwLCAyLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JIkxPMTYiLCAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKSAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLQotICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9taXBzKQotICAgIHJldHVybiAwOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfMzJdKTsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSk1QXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX1dESVNQMTZdKTsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19ISTE2XSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19ISTE2X1NdKTsKLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19MTzE2XSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyoKLSAqIFRoaXMgaXMganVzdCBsaWtlIHRoZSBzdGFuZGFyZCBhb3V0eC5oIHZlcnNpb24gYnV0IHdlIG5lZWQgdG8gZG8gb3VyCi0gKiBvd24gbWFwcGluZyBvZiBleHRlcm5hbCByZWxvYyB0eXBlIHZhbHVlcyB0byBob3d0byBlbnRyaWVzLgotICovCi1sb25nCi1NWShjYW5vbmljYWxpemVfcmVsb2MpKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgIGJmZCAqYWJmZDsKLSAgICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50LCBjOwotICBleHRlcm4gcmVsb2NfaG93dG9fdHlwZSBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKVtdOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSByZWFkIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLCByZXR1cm4gdGhlIHZhbHVlcy4gKi8KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSB7Ci0gICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKSB7Ci0gICAgICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLSAgICAgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0gICAgfQotICAgICpyZWxwdHIgPSAwOwotICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgfQotICBpZiAodGJscHRyICYmIHNlY3Rpb24tPnJlbG9jX2NvdW50KSB7Ci0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspIAotICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgKnJlbHB0ciA9IDA7Ci0gICAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB9Ci0KLSAgaWYgKCFOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQotICAgIHJldHVybiAtMTsKLSAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAvKiBmaXggdXAgaG93dG8gZW50cmllcyAqLwotICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykgCi0gICAgewotICAgICAgYyA9IHRibHB0ci0+aG93dG8gLSBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKTsKLSAgICAgIHRibHB0ci0+aG93dG8gPSAmbWlwc19ob3d0b190YWJsZV9leHRbY107Ci0KLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICBUQVJHRVRfUEFHRV9TSVpFLAkJCS8qIHRleHQgdm1hICovCi0gIE1ZX3NldF9zaXplcywKLSAgMCwJCQkJLyogdGV4dCBzaXplIGluY2x1ZGVzIGV4ZWMgaGVhZGVyICovCi0gIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KLSAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KLSAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLwotICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLwotICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCi0gIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLwotfTsKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2JpZ192ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2xpdHRsZV92ZWMgPQotewotICAiYS5vdXQtbWlwcy1saXR0bGUiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBhb3V0X21pcHNfYmlnX3ZlYywKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YQotfTsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYyA9Ci17Ci0gICJhLm91dC1taXBzLWJpZyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIGFvdXRfbWlwc19saXR0bGVfdmVjLAotICAKLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhCi19OwpkaWZmIC0tZ2l0IGEvYmZkL21wdy1jb25maWcuaW4gYi9iZmQvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhZGRlZS4uMDAwMDAwMAotLS0gYS9iZmQvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgQkZELgotCi0jIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBjb3JyZWN0LgotCi1TZXQgc2VsYXJjaHMgIiZiZmRfe3RhcmdldF9jcHV9X2FyY2giCi1TZXQgZGVmdmVjICIiCi1TZXQgc2VsdmVjcyAiIgotU2V0IGhhdmV2ZWNzICIiCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLWFwcGxlLW1hY29zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1tNjhrLmMubyAie299ImNvZmZsaW5rLmMubycKLQlTZXQgZGVmdmVjIG02OGtjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmbTY4a2NvZmZfdmVjJwotCVNldCBoYXZldmVjcyAnLWQgSEFWRV9tNjhrY29mZl92ZWMnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3Bvd2VycGMtYXBwbGUtbWFjb3MvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLXBtYWMuYy5vICJ7b30ieGNvZmZsaW5rLmMubycKLQlTZXQgZGVmdmVjIHBtYWNfeGNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZwbWFjX3hjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfcG1hY194Y29mZl92ZWMnCi0JU2V0IHNlbGFyY2hzICImYmZkX3Bvd2VycGNfYXJjaCIKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvaTM4Ni1cT3B0aW9uLXgtZ28zMi8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtaTM4Ni5jLm8nCi0JU2V0IGRlZnZlYyBpMzg2Y29mZl92ZWMKLQlTZXQgc2VsdmVjcyAnJmkzODZjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfaTM4NmNvZmZfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1cT3B0aW9uLXgvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLW1pcHMuYy5vICJ7b30iZWNvZmYuYy5vICJ7b30iZWNvZmZsaW5rLmMubyAie299ImVsZjMyLmMubyAie299ImVsZjMyLW1pcHMuYy5vICJ7b30iZWxmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBlY29mZl9iaWdfdmVjCi0JU2V0IHNlbHZlY3MgJyZlY29mZl9iaWdfdmVjLCZlY29mZl9saXR0bGVfdmVjLCZiZmRfZWxmMzJfYmlnbWlwc192ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX2Vjb2ZmX2JpZ192ZWMgLWQgSEFWRV9lY29mZl9saXR0bGVfdmVjIC1kIEhBVkVfYmZkX2VsZjMyX2JpZ21pcHNfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1cT3B0aW9uLXgtaG1zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1zaC5jLm8gIntvfSJjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBzaGNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZzaGNvZmZfdmVjLCZzaGxjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfc2hjb2ZmX3ZlYyAtZCBIQVZFX3NobGNvZmZfdmVjJwotRW5kIElmCi0KLVNldCB0YSBgZWNobyB7c2VsYXJjaHN9IHwgc2VkIC1lICdzLyZiZmRfL3tvfWNwdS0vZycgLWUgJ3MvX2FyY2gvLmMuby9nJ2AKLQotU2V0IHRkZWZhdWx0cyAiLWQgREVGQVVMVF9WRUNUT1I9e2RlZnZlY30gLWQgU0VMRUNUX1ZFQ1M9e3NlbHZlY3N9IC1kIFNFTEVDVF9BUkNISVRFQ1RVUkVTPXtzZWxhcmNoc30ge2hhdmV2ZWNzfSIKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICdXT1JEU0laRSA9IDMyJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ0JGRF9NQUNISU5FUyA9ICcge3RhfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnQkZEX0JBQ0tFTkRTID0gJyB7QkZEX0JBQ0tFTkRTfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdUREVGQVVMVFMgPSAnIHt0ZGVmYXVsdHN9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdIREVQRklMRVMgPSAnCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnVERFUEZJTEVTID0gJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCQk+PiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCi0KLSMgV2UgY2FuIG9ubHkgaGFuZGxlIDMyLWJpdCB0YXJnZXRzIHJpZ2h0IG5vdy4KLQotc2VkIC1lICdzL0BXT1JEU0laRUAvMzIvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9Ad29yZHNpemVALzMyLycgXE9wdGlvbi1kCi0gICAgLWUgInMvQFZFUlNJT05AL2BDYXRlbmF0ZSB7c3JjZGlyfVZFUlNJT05gLyIgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQC8wLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0X0JJVEAvLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUX1VfNjRfQklUQC8vJyBcT3B0aW9uLWQKLSAgICAtZSAncy9AQkZEX0hPU1RfNjRCSVRfTE9OR0AvMC8nIFxPcHRpb24tZAotICAgICJ7c3JjZGlyfSJiZmQtaW4yLmggPiJ7b30iYmZkLmgtbmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImJmZC5oLW5ldyAie299ImJmZC5oCi0KLXNlZCAtZSAncy9OTi8zMi9nJyAie3NyY2Rpcn0iZWxmeHgtdGFyZ2V0LmggPiJ7b30iZWxmMzItdGFyZ2V0LmgtbmV3Ci1Nb3ZlSWZDaGFuZ2UgIntvfSJlbGYzMi10YXJnZXQuaC1uZXcgIntvfSJlbGYzMi10YXJnZXQuaAotCi0jIFByZS1leHBhbmQgc29tZSBtYWNyb3MgaW4gY29mZnN3YXAuaCwgc28gTVBXIEMgZG9lc24ndCBjaG9rZS4KLQotc2VkIC1lICdzL14gIFBVVF9BT1VUSERSX1RTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0RTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0JTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0VOVFJZICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgKC8gIGJmZF9oX3B1dF8zMiAoLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvXiAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAie3NyY2Rpcn0iY29mZnN3YXAuaCA+IntvfSJjb2Zmc3dhcC5oLW5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb2Zmc3dhcC5oLW5ldyAie299ImNvZmZzd2FwLmgKZGlmZiAtLWdpdCBhL2JmZC9tcHctbWFrZS5zZWQgYi9iZmQvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ2M2M3Li4wMDAwMDAwCi0tLSBhL2JmZC9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIFVuaXggQkZEIE1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KLQotIyBXaGFjayBvdXQgdW51c2VkIGhvc3QgYW5kIHRhcmdldCBkZWZpbmUgYml0cy4KLS9IREVGSU5FUy9zL0BIREVGSU5FU0AvLwotL1RERUZJTkVTL3MvQFRERUZJTkVTQC8vCi0KLSMgRml4IHBhdGhuYW1lcyB0byBpbmNsdWRlIGRpcmVjdG9yaWVzLgotL15JTkNESVIgPSAvcy9eSU5DRElSID0gLiokL0lOQ0RJUiA9ICJ7dG9wc3JjZGlyfSJpbmNsdWRlLwotL15DU0VBUkNIID0gL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0KLSMgQ29tbWVudCBvdXQgc2V0dGluZyBvZiB2YXJzLCBjb25maWd1cmUgc2NyaXB0IHdpbGwgYWRkIHRoZXNlIGl0c2VsZi4KLS9eV09SRFNJWkUgPS9zL14vIy8KLSMgL15BTExfQkFDS0VORFMvcy9eLyMvCi0vXkJGRF9CQUNLRU5EUy9zL14vIy8KLS9eQkZEX01BQ0hJTkVTL3MvXi8jLwotL15UREVGQVVMVFMvcy9eLyMvCi0KLSMgUmVtb3ZlIGV4dHJhLCB1c2VsZXNzLCAiYWxsIi4KLS9eYWxsIFxcT3B0aW9uLWYgX29sZGVzdC8sL14kL2QKLQotIyBSZW1vdmUgdGhlIE1ha2VmaWxlIHJlYnVpbGQgcnVsZS4KLS9eTWFrZWZpbGUgLywvLS1yZWNoZWNrL2QKLQotIyBEb24ndCBkbyBhbnkgcmVjdXJzaXZlIHN1YmRpciBzdHVmZi4KLS8gc3ViZGlyX2RvL3Mve01BS0V9L251bGwtY29tbWFuZC8KLQotL0JGRF9IL3MvXntCRkRfSH0vI3tCRkRfSH0vCi0KLSMgQWRkIGV4cGxpY2l0IHNyY2RpciBwYXRocyB0byBzcGVjaWFsIGZpbGVzLgotL2NvbmZpZy5iZmQvcy8gY29uZmlnLmJmZC8gIntzfSJjb25maWcuYmZkL2cKLS90YXJnbWF0Y2guc2VkL3MvIHRhcmdtYXRjaC5zZWQvICJ7c30idGFyZ21hdGNoLnNlZC9nCi0KLSMgUG9pbnQgYXQgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW4gdGhlIG9iamRpci4KLS9iZmQvcy8ie3N9ImJmZFwuaC8ie299ImJmZC5oL2cKLS9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKLS90YXJnbWF0Y2gvcy8ie3N9InRhcmdtYXRjaFwuaC8ie299InRhcmdtYXRjaC5oL2cKLS90YXJnbWF0Y2gvcy9edGFyZ21hdGNoXC5oLyJ7b30idGFyZ21hdGNoLmgvCi0vZWxmMzItdGFyZ2V0L3MvIntzfSJlbGYzMi10YXJnZXRcLmgvIntvfSJlbGYzMi10YXJnZXQuaC9nCi0vZWxmMzItdGFyZ2V0L3MvXmVsZjMyLXRhcmdldFwuaC8ie299ImVsZjMyLXRhcmdldC5oLwotL2VsZjY0LXRhcmdldC9zLyJ7c30iZWxmNjQtdGFyZ2V0XC5oLyJ7b30iZWxmNjQtdGFyZ2V0LmgvZwotL2VsZjY0LXRhcmdldC9zL15lbGY2NC10YXJnZXRcLmgvIntvfSJlbGY2NC10YXJnZXQuaC8KLQotLyJ7c30ie0lOQ0RJUn0vcy8ie3N9IntJTkNESVJ9LyJ7SU5DRElSfSIvZwotCi0vZGVwL3MvXC5kZXAvX19kZXAvZwotCi0jIFJlbW92aW5nIGR1cGxpY2F0ZXMgaXMgY29vbCBidXQgcHJlc2VudGx5IHVubmVjZXNzYXJ5LAotIyBzbyB3aGFjayB0aGlzIG91dC4KLS9eb2ZpbGVzIFxcT3B0aW9uLWYvLC9eJC9kCi0vb2ZpbGVzL3Mve09GSUxFU30gb2ZpbGVzL3tPRklMRVN9LwotL2VjaG8gb2ZpbGVzID0gL2QKLS9jYXQgb2ZpbGVzL3MvYGNhdCBvZmlsZXNgL3tPRklMRVN9LwotCi0jIE5vIGNvcmVmaWxlIHN1cHBvcnQuCi0vQ09SRUZJTEUvcy9AQ09SRUZJTEVALy8KLS9DT1JFRkxBRy9zL0BDT1JFRkxBR0AvLwotCi0jIE5vIFBJQyBmb29sZXJ5IGluIHRoaXMgZW52aXJvbm1lbnQuCi0vQEFMTExJQlNAL3MvQEFMTExJQlNAL3tUQVJHRVRMSUJ9LwotL0BQSUNMSVNUQC9zL0BQSUNMSVNUQC8vCi0vQFBJQ0ZMQUdAL3MvQFBJQ0ZMQUdALy8KLS9ee09GSUxFU30gXFxPcHRpb24tZiBzdGFtcC1waWNkaXIvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBwaWMgdHJpY2tlcnkgZnJvbSB0aGUgZGVmYXVsdCBidWlsZCBydWxlLgotL15cLmNcLm8gXFxPcHRpb24tZiAvLC9FbmQgSWYvY1wKLS5jLm8gXFxPcHRpb24tZiAuYwotCi0jIE1QVyBNYWtlIGRvZXNuJ3Qga25vdyBhYm91dCAkPC4KLS8ie299InRhcmdldHMuYy5vIFxcT3B0aW9uLWYgIntzfSJ0YXJnZXRzLmMgTWFrZWZpbGUvLC9eJC9jXAotIntvfSJ0YXJnZXRzLmMubyBcXE9wdGlvbi1mICJ7c30idGFyZ2V0cy5jIE1ha2VmaWxlXAotCXtDQ30gQERBU0hfQ19GTEFHQCB7QUxMX0NGTEFHU30ge1RERUZBVUxUU30gIntzfSJ0YXJnZXRzLmMgLW8gIntvfSJ0YXJnZXRzLmMubwotCi0vIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGUvLC9eJC9jXAotIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGVcCi0Je0NDfSBAREFTSF9DX0ZMQUdAIHtBTExfQ0ZMQUdTfSB7VERFRkFVTFRTfSAie3N9ImFyY2h1cmVzLmMgLW8gIntvfSJhcmNodXJlcy5jLm8KLQotIyBSZW1vdmUgdGhlIC5oIHJlYnVpbGRpbmcgcnVsZXMsIHdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgZG9jIHN1YmRpciwKLSMgb3IgYSB3YXkgdG8gYnVpbGQgdGhlIHByb3RvdHlwZS1oYWNraW5nIHRvb2wgdGhhdCdzIGluIGl0LgotL14ie3NyY2Rpcn0iYmZkLWluMi5oIFxcT3B0aW9uLWYgLywvXiQvZAotL14ie3NyY2Rpcn0ibGliYmZkLmggXFxPcHRpb24tZiAvLC9eJC9kCi0vXiJ7c3JjZGlyfSJsaWJjb2ZmLmggXFxPcHRpb24tZiAvLC9eJC9kCmRpZmYgLS1naXQgYS9iZmQvbmV0YnNkLWNvcmUuYyBiL2JmZC9uZXRic2QtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjhjMmExLi4wMDAwMDAwCi0tLSBhL2JmZC9uZXRic2QtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgTmV0QlNEIHN0eWxlIGNvcmUgZmlsZXMKLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBhdWwgS3JhbmVuYnVyZywgRVVSCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9jb3JlLmg+Ci0KLS8qCi0gKiBGSVhNRTogT24gTmV0QlNEL3NwYXJjIENPUkVfRlBVX09GRlNFVCBzaG91bGQgYmUgKHNpemVvZihzdHJ1Y3QgdHJhcGZyYW1lKSkKLSAqLwotCi1zdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0IHsKLQlzdHJ1Y3QgY29yZSBjb3JlOwotfSAqcmF3cHRyOwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCW5ldGJzZF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjaGFyICoJCW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGludCAJCW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbgkJbmV0YnNkX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkCQlzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogSGFuZGxlIE5ldEJTRC1zdHlsZSBjb3JlIGR1bXAgZmlsZS4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1uZXRic2RfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLQotewotCWludAkJaSwgdmFsLCBvZmZzZXQ7Ci0JYXNlY3Rpb24JKmFzZWN0LCAqYXNlY3QyOwotCXN0cnVjdCBjb3JlCWNvcmU7Ci0Jc3RydWN0IGNvcmVzZWcJY29yZXNlZzsKLQotCXZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZjb3JlLCAxLCBzaXplb2YgY29yZSwgYWJmZCk7Ci0JaWYgKHZhbCAhPSBzaXplb2YgY29yZSkgewotCQkvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKENPUkVfR0VUTUFHSUMoY29yZSkgIT0gQ09SRU1BR0lDKSB7Ci0JCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJhd3B0ciA9IChzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCkpOwotCWlmIChyYXdwdHIgPT0gTlVMTCkgewotCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYXdwdHItPmNvcmUgPSBjb3JlOwotCWFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLQlvZmZzZXQgPSBjb3JlLmNfaGRyc2l6ZTsKLQlmb3IgKGkgPSAwOyBpIDwgY29yZS5jX25zZWc7IGkrKykgewotCi0JCWlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkJCWdvdG8gcHVudDsKLQotCQl2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmY29yZXNlZywgMSwgc2l6ZW9mIGNvcmVzZWcsIGFiZmQpOwotCQlpZiAodmFsICE9IHNpemVvZiBjb3Jlc2VnKSB7Ci0JCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JCQlnb3RvIHB1bnQ7Ci0JCX0KLQkJaWYgKENPUkVfR0VUTUFHSUMoY29yZXNlZykgIT0gQ09SRVNFR01BR0lDKSB7Ci0JCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQkJZ290byBwdW50OwotCQl9Ci0KLQkJb2Zmc2V0ICs9IGNvcmUuY19zZWdoZHJzaXplOwotCi0JCWFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZihhc2VjdGlvbikpOwotCQlpZiAoYXNlY3QgPT0gTlVMTCkgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJCWdvdG8gcHVudDsKLQkJfQotCi0JCWFzZWN0LT5fcmF3X3NpemUgPSBjb3Jlc2VnLmNfc2l6ZTsKLQkJYXNlY3QtPnZtYSA9IGNvcmVzZWcuY19hZGRyOwotCQlhc2VjdC0+ZmlsZXBvcyA9IG9mZnNldDsKLQkJYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JCWFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0JCWFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0JCWFiZmQtPnNlY3Rpb25fY291bnQrKzsKLQkJb2Zmc2V0ICs9IGNvcmVzZWcuY19zaXplOwotCi0JCXN3aXRjaCAoQ09SRV9HRVRGTEFHKGNvcmVzZWcpKSB7Ci0JCWNhc2UgQ09SRV9DUFU6Ci0JCQlhc2VjdC0+bmFtZSA9ICIucmVnIjsKLQkJCWFzZWN0LT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFM7Ci0jaWZkZWYgQ09SRV9GUFVfT0ZGU0VUCi0JCQkvKiBIYWNraXNoLi4uICovCi0JCQlhc2VjdC0+X3Jhd19zaXplID0gQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyID0gKGFzZWN0aW9uICopYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkJCQkgc2l6ZW9mIChhc2VjdGlvbikpOwotCQkJaWYgKGFzZWN0MiA9PSBOVUxMKSB7Ci0JCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJCQlnb3RvIHB1bnQ7Ci0JCQl9Ci0JCQlhc2VjdDItPl9yYXdfc2l6ZSA9IGNvcmVzZWcuY19zaXplIC0gQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyLT52bWEgPSAwOwotCQkJYXNlY3QyLT5maWxlcG9zID0gYXNlY3QtPmZpbGVwb3MgKyBDT1JFX0ZQVV9PRkZTRVQ7Ci0JCQlhc2VjdDItPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JCQlhc2VjdDItPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKLQkJCWFzZWN0Mi0+bmFtZSA9ICIucmVnMiI7Ci0JCQlhc2VjdDItPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUzsKLQkJCWFiZmQtPnNlY3Rpb25zID0gYXNlY3QyOwotCQkJYWJmZC0+c2VjdGlvbl9jb3VudCsrOwotI2VuZGlmCi0KLQkJCWJyZWFrOwotCQljYXNlIENPUkVfREFUQToKLQkJCWFzZWN0LT5uYW1lID0gIi5kYXRhIjsKLQkJCWFzZWN0LT5mbGFncyA9IFNFQ19BTExPQytTRUNfTE9BRCtTRUNfSEFTX0NPTlRFTlRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09SRV9TVEFDSzoKLQkJCWFzZWN0LT5uYW1lID0gIi5zdGFjayI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MrU0VDX0xPQUQrU0VDX0hBU19DT05URU5UUzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0JcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLXB1bnQ6CXsKLQkJYXNlY3Rpb24JKmFuZXh0OwotCQlmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFuZXh0KSB7Ci0JCQlhbmV4dCA9IGFzZWN0LT5uZXh0OwotCQkJZnJlZSgodm9pZCAqKWFzZWN0KTsKLQkJfQotCX0KLQlmcmVlICgodm9pZCAqKXJhd3B0cik7Ci0JYWJmZC0+dGRhdGEubmV0YnNkX2NvcmVfZGF0YSA9IE5VTEw7Ci0JYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotCWFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhcioKLW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotCWJmZCAqYWJmZDsKLXsKLSAvKnJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOyovCi0gIHJldHVybiBhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhLT5jb3JlLmNfbmFtZTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0JYmZkICphYmZkOwotewotICAvKnJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ki8KLSAgcmV0dXJuIGFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEtPmNvcmUuY19zaWdubzsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1uZXRic2RfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgbmV0YnNkX2NvcmVfdmVjID0KLSAgewotICAgICJuZXRic2QtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIG5ldGJzZF9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChuZXRic2QpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL25ldGJzZC5oIGIvYmZkL25ldGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjBlZDk1Li4wMDAwMDAwCi0tLSBhL2JmZC9uZXRic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZGVmaW5pdGlvbnMgdXNlZCBieSBhbGwgTmV0QlNEIHRhcmdldHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgOTcsIDk4LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotVVNBLiAgKi8KLQotLyogQ2hlY2sgZm9yIG91ciBtYWNoaW5lIHR5cGUgKHBhcnQgb2YgbWFnaWMgbnVtYmVyKS4gKi8KLSNpZm5kZWYgTUFDSFRZUEVfT0sKLSNkZWZpbmUgTUFDSFRZUEVfT0sobSkgKChtKSA9PSBERUZBVUxUX01JRCB8fCAobSkgPT0gTV9VTktOT1dOKQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIG5vcm1hbCBsb2FkIGFkZHJlc3MgZm9yIGV4ZWN1dGFibGVzLiAqLwotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJCVRBUkdFVF9QQUdFX1NJWkUKLQotLyogTmV0QlNEIFpNQUdJQyBoYXMgaXRzIGhlYWRlciBpbiB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxCi0KLS8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkgdXNpbmcgdGhlIGZsYWdzLiAqLwotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgCShOX0RZTkFNSUMoeCkpCi0KLS8qIFdlIGhhdmUgNiBiaXRzIG9mIGZsYWdzIGFuZCAxMCBiaXRzIG9mIG1hY2hpbmUgSUQuICAqLwotI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpIFwKLQkoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweDAzZmYpKQotI2RlZmluZSBOX0ZMQUdTKGV4ZWMpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMjYpICYgMHgzZikKLQotI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAotCSgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpIFwKLQkgfCAoKChpbnQpKHR5cGUpICYgMHgzZmYpIDw8IDE2KSBcCi0JIHwgKCgoZmxhZ3MpICYgMHgzZikgPDwgMjQpKQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAotCSgoZXhlYykuYV9pbmZvID0gXAotICAgICAgICAgKChleGVjKS5hX2luZm8gJiAweGZiMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHgzZmYpIDw8IDE2KSkKLSNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLQkgKChleGVjKS5hX2luZm8gJiAweDAzZmZmZmZmKSB8ICgoZmxhZ3MgJiAweDAzZikgPDwgMjYpKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0vKiBPbiBOZXRCU0QsIHRoZSBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGluIG50b2hsJ3MgIm5ldHdvcmsiIChiaWctZW5kaWFuKQotICAgZm9ybWF0LiAgKi8KLSNkZWZpbmUgU1dBUF9NQUdJQyhleHQpIGJmZF9nZXRiMzIgKGV4dCkKLQotLyogT24gTmV0QlNELCB0aGUgZW50cnkgcG9pbnQgbWF5IGJlIHRha2VuIHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgdGV4dAotICAgc2VjdGlvbi4gICovCi0jZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAxCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogV2UgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCB0aGUgbWFnaWMgbnVtYmVyIGhhcyBiZWVuIHNldC4gIFRoaXMKLSAgICAgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gZG9uZSBieSBzZXRfc2VjdGlvbl9jb250ZW50cywgYnV0IG9ubHkgaWYKLSAgICAgdGhlcmUgYWN0dWFsbHkgYXJlIHNvbWUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7Ci0gICAgICBmaWxlX3B0ciB0ZXh0X2VuZDsKLQotICAgICAgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7Ci0gICAgfQotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBERUZBVUxUX0FSQ0g6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBERUZBVUxUX01JRCk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogVGhlIE5ldEJTRCBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGJpZy1lbmRpYW4gKi8KLSNpZm5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICAvKiBYWFggYXJlbid0IHRoZXJlIGFueSBtYWNybyB0byBjaGFuZ2UgYnl0ZW9yZGVyIG9mIGEgd29yZCBpbmRlcGVuZGVudCBvZgotICAgICB0aGUgaG9zdCdzIG9yIHRhcmdldCdzIGVuZGlhbmVzc2VzPyAgKi8KLSAgZXhlY3AtPmFfaW5mbwotICAgID0gKGV4ZWNwLT5hX2luZm8gJiAweGZmKSA8PCAyNCB8IChleGVjcC0+YV9pbmZvICYgMHhmZjAwKSA8PCA4Ci0gICAgICB8IChleGVjcC0+YV9pbmZvICYgMHhmZjAwMDApID4+IDggfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMDAwMDApID4+IDI0OwotI2VuZGlmCi0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvbmV3c29zMy5jIGIvYmZkL25ld3NvczMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjN2E3NS4uMDAwMDAwMAotLS0gYS9iZmQvbmV3c29zMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXdzT1MzIChTb255LCA2OGspIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTVkoT1ApIENBVChuZXdzb3MzXyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbmV3c29zMyIKLSNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgd2hlbiBjb21waWxlZCB3aXRoIC1XYWxsLiAqLwotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtLXRhcmdldC5oIGIvYmZkL25sbS10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxZTI1NS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtLXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qIFRhcmdldCBkZWZpbml0aW9ucyBmb3IgMzIvNjQtYml0IE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIG5sbV9jb3JlX2ZpbGVfcCBfYmZkX2R1bW15X3RhcmdldAotCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIG5sbU5BTUUoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2dldF9zeW10YWIgbmxtTkFNRShnZXRfc3ltdGFiKQotI2RlZmluZSBubG1fbWFrZV9lbXB0eV9zeW1ib2wgbmxtTkFNRShtYWtlX2VtcHR5X3N5bWJvbCkKLSNkZWZpbmUgbmxtX3ByaW50X3N5bWJvbCBubG1OQU1FKHByaW50X3N5bWJvbCkKLSNkZWZpbmUgbmxtX2dldF9zeW1ib2xfaW5mbyBubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSNkZWZpbmUgbmxtX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgbmxtX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBubG1fZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgbmxtX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgbmxtX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgbmxtX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgbmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9jYW5vbmljYWxpemVfcmVsb2MgbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0jZGVmaW5lIG5sbV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBubG1fc2V0X3NlY3Rpb25fY29udGVudHMgbmxtTkFNRShzZXRfc2VjdGlvbl9jb250ZW50cykKLQotI2RlZmluZSBubG1fc2l6ZW9mX2hlYWRlcnMgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgbmxtX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbmxtX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgbmxtX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBubG1fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgbmxtX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG5sbV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBubG1fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYSB0YXJnZXQuCi0gICBJdCBpbmNsdWRlcyB0aGluZ3MgbGlrZSBpdHMgYnl0ZSBvcmRlciwgbmFtZSwgd2hhdCByb3V0aW5lcyB0byBjYWxsCi0gICB0byBkbyB2YXJpb3VzIG9wZXJhdGlvbnMsIGV0Yy4gIEV2ZXJ5IEJGRCBwb2ludHMgdG8gYSB0YXJnZXQgc3RydWN0dXJlCi0gICB3aXRoIGl0cyAieHZlYyIgbWVtYmVyLgotCi0gICBUaGVyZSBhcmUgdHdvIHN1Y2ggc3RydWN0dXJlcyBoZXJlOiAgb25lIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzIGFuZAotICAgb25lIGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLiAgICovCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSB3aGVuIGluaXRpYWxpc2luZyBhbHRlcm5hdGl2ZV90YXJnZXQgZmllbGQuICAqLwotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfQklHX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgYmlnIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0JJRywKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUwotICAgfCBXUF9URVhUKSwKLSAgCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfQ09ERSB8IFNFQ19EQVRBKSwgCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICAgMCwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNSwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIG5sbU5BTUUob2JqZWN0X3ApLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJLyogYW4gYXJjaGl2ZSAqLwotICAgIG5sbV9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cyksCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIEluaXRpYWxpemUgYSBqdW1wIHRhYmxlIHdpdGggdGhlIHN0YW5kYXJkIG1hY3JvLiAgQWxsIG5hbWVzIHN0YXJ0IHdpdGgKLSAgICAgIm5sbSIgKi8KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAvKiBBbHRlcm5hdGl2ZSBlbmRpYW4gdGFyZ2V0LiAgKi8KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotICAmIFRBUkdFVF9MSVRUTEVfU1lNLAotI2Vsc2UKLSAgTlVMTCwKLSNlbmRpZgotICAKLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSBUQVJHRVRfQkFDS0VORF9EQVRBCi19OwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9MSVRUTEVfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGxpdHRsZSBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTCi0gICB8IFdQX1RFWFQpLAotICAKLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19EQVRBKSwgCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICAgMCwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNSwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIG5sbU5BTUUob2JqZWN0X3ApLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJLyogYW4gYXJjaGl2ZSAqLwotICAgIG5sbV9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cyksCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIEluaXRpYWxpemUgYSBqdW1wIHRhYmxlIHdpdGggdGhlIHN0YW5kYXJkIG1hY3JvLiAgQWxsIG5hbWVzIHN0YXJ0IHdpdGgKLSAgICAgIm5sbSIgKi8KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAvKiBBbHRlcm5hdGl2ZSBlbmRpYW4gdGFyZ2V0LiAgKi8KLSNpZmRlZiBUQVJHRVRfQklHX1NZTQotICAmIFRBUkdFVF9CSUdfU1lNLAotI2Vsc2UKLSAgTlVMTCwKLSNlbmRpZgotICAKLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSBUQVJHRVRfQkFDS0VORF9EQVRBCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvbmxtLmMgYi9iZmQvbmxtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzZiYWEuLjAwMDAwMDAKLS0tIGEvYmZkL25sbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYm5sbS5oIgotCi0vKiBNYWtlIGFuIE5MTSBvYmplY3QuICBXZSBqdXN0IG5lZWQgdG8gYWxsb2NhdGUgdGhlIGJhY2tlbmQKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotbmxtX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBubG1fdGRhdGEgKGFiZmQpID0KLSAgICAoc3RydWN0IG5sbV9vYmpfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbmxtX29ial90ZGF0YSkpOwotICBpZiAobmxtX3RkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIGlmIChubG1fYXJjaGl0ZWN0dXJlIChhYmZkKSAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIG5sbV9hcmNoaXRlY3R1cmUgKGFiZmQpLAotCQkJICAgICAgIG5sbV9tYWNoaW5lIChhYmZkKSk7Ci0KLSAgLyogc2luY2UgZXZlcnl0aGluZyBpcyBkb25lIGF0IGNsb3NlIHRpbWUsIGRvIHdlIG5lZWQgYW55IGluaXRpYWxpemF0aW9uPyAqLwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBmb3IgYW4gTkxNIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLW5sbV9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLSAgcmV0dXJuIGFyY2ggPT0gbmxtX2FyY2hpdGVjdHVyZSAoYWJmZCk7Ci19CmRpZmYgLS1naXQgYS9iZmQvbmxtMzItYWxwaGEuYyBiL2JmZC9ubG0zMi1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGM4ZTUxLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG0zMi1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsODkyICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBBbHBoYSBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSAzMiBiaXQgQWxwaGEgTkxNIGZvcm1hdC4gIFlvdSBtaWdodCB0aGluawotICAgdGhhdCBhbiBBbHBoYSBjaGlwIHdvdWxkIHVzZSBhIDY0IGJpdCBmb3JtYXQsIGJ1dCwgZm9yIHNvbWUgcmVhc29uLAotICAgaXQgZG9lc24ndC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgIm5sbS9hbHBoYS1leHQuaCIKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9hbHBoYV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIKLQotI2luY2x1ZGUgImxpYm5sbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfYmFja2VuZF9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3dyaXRlX3ByZWZpeAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9tYW5nbGVfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3dyaXRlX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfc2V0X3B1YmxpY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBubG1fYWxwaGFfZ2V0X3B1YmxpY19vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQwKLS8qIEFscGhhIE5MTSdzIGhhdmUgYSBwcmVmaXggaGVhZGVyIGJlZm9yZSB0aGUgc3RhbmRhcmQgTkxNLiAgVGhpcwotICAgZnVuY3Rpb24gcmVhZHMgaXQgaW4sIHZlcmlmaWVzIHRoZSB2ZXJzaW9uLCBhbmQgc2Vla3MgdGhlIGJmZCB0bwotICAgdGhlIGxvY2F0aW9uIGJlZm9yZSB0aGUgcmVndWxhciBOTE0gaGVhZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV9iYWNrZW5kX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIHMubWFnaWMpICE9IE5MTTMyX0FMUEhBX01BR0lDKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGSVhNRTogU2hvdWxkIHdlIGNoZWNrIHRoZSBmb3JtYXQgbnVtYmVyPyAgKi8KLQotICAvKiBTa2lwIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlci4gICovCi0gIHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHMuc2l6ZSk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2l6ZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfd3JpdGVfcHJlZml4IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0KLSAgbWVtc2V0ICgmcywgMCwgc2l6ZW9mIHMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBOTE0zMl9BTFBIQV9NQUdJQywgcy5tYWdpYyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIDIsIHMuZm9ybWF0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc2l6ZW9mIHMsIHMuc2l6ZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFJlbG9jIHR5cGUgMCBpcyBpZ25vcmVkIGJ5IGl0c2VsZi4gIEhvd2V2ZXIsIGl0IGFwcGVhcnMgYWZ0ZXIgYQotICAgICBHUERJU1AgcmVsb2MgdG8gaWRlbnRpZnkgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBsb3cgb3JkZXIgMTYgYml0cwotICAgICBvZiB0aGUgZ3AgcmVnaXN0ZXIgYXJlIGxvYWRlZC4gICovCi0gIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZMT05HLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPTkciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBHUCByZWxhdGl2ZSBvZmZzZXQuICBUaGlzIGlzIGp1c3QgbGlrZSBSRUZMT05HIGV4Y2VwdAotICAgICB0aGF0IHdoZW4gdGhlIHZhbHVlIGlzIHVzZWQgdGhlIHZhbHVlIG9mIHRoZSBncCByZWdpc3RlciB3aWxsIGJlCi0gICAgIGFkZGVkIGluLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIGZvciBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlZmVycyB0byBtZW1vcnkgb2ZmIHRoZSBHUAotICAgICByZWdpc3Rlci4gIFRoZSBvZmZzZXQgaXMgMTYgYml0cyBvZiB0aGUgMzIgYml0IGluc3RydWN0aW9uLiAgVGhpcwotICAgICByZWxvYyBhbHdheXMgc2VlbXMgdG8gYmUgYWdhaW5zdCB0aGUgLmxpdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVEVSQUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIG9ubHkgYXBwZWFycyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYSBMSVRFUkFMIHJlbG9jLgotICAgICBJdCBpZGVudGlmaWVzIGEgdXNlIG9mIHRoZSBsaXRlcmFsLiAgSXQgc2VlbXMgdGhhdCB0aGUgbGlua2VyIGNhbgotICAgICB1c2UgdGhpcyB0byBlbGltaW5hdGUgYSBwb3J0aW9uIG9mIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhlIHN5bWJvbAotICAgICBpbmRleCBpcyBzcGVjaWFsOiAxIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIGJhc2UKLSAgICAgcmVnaXN0ZXIgb2YgYSBtZW1vcnkgZm9ybWF0IGluc3RydWN0aW9uOyAyIG1lYW5zIHRoZSBsaXRlcmFsCi0gICAgIGFkZHJlc3MgaXMgaW4gdGhlIGJ5dGUgb2Zmc2V0IHJlZ2lzdGVyIG9mIGEgYnl0ZS1tYW5pcHVsYXRpb24KLSAgICAgaW5zdHJ1Y3Rpb247IDMgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgdGFyZ2V0Ci0gICAgIHJlZ2lzdGVyIG9mIGEganNyIGluc3RydWN0aW9uLiAgVGhpcyBkb2VzIG5vdCBhY3R1YWxseSBkbyBhbnkKLSAgICAgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0xJVFVTRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIG5leHQgcmVsb2MKLSAgICAgd2lsbCBiZSBhbiBJR05PUkUgcmVsb2Mgd2hpY2ggaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgbG93ZXIgMTYgYml0cy4gIFRoZSBzeW1ib2wgaW5kZXggb2YKLSAgICAgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBhcHBlYXJzIHRvIGFjdHVhbGx5IGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgYmV0d2VlbiB0aGUgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucy4gIFRoaXMgZ2l2ZXMgdHdvIGRpZmZlcmVudAotICAgICB3YXlzIHRvIGRldGVybWluZSB3aGVyZSB0aGUgbGRhIGluc3RydWN0aW9uIGlzOyBJIGRvbid0IGtub3cgd2h5Ci0gICAgIGJvdGggYXJlIHVzZWQuICBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgcmVsb2NhdGlvbiBpcyB0aGUKLSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlIGN1cnJlbnQgbG9jYXRpb247IHRoZQotICAgICBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGN1cnJlbnQKLSAgICAgYWRkcmVzcy4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQRElTUCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjEgYml0IGJyYW5jaC4gIFRoZSBuYXRpdmUgYXNzZW1ibGVyIGdlbmVyYXRlcyB0aGVzZSBmb3IKLSAgICAgYnJhbmNoZXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFuZCBhbHNvIGZpbGxzIGluIHRoZSBQQwotICAgICByZWxhdGl2ZSBvZmZzZXQgaW4gdGhlIGluc3RydWN0aW9uLiAgSXQgc2VlbXMgdG8gbWUgdGhhdCB0aGlzCi0gICAgIHJlbG9jLCB1bmxpa2UgdGhlIG90aGVycywgaXMgbm90IHBhcnRpYWxfaW5wbGFjZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMNjQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3VidHJhY3QgdGhlIHJlbG9jIGFkZHJlc3MgZnJvbSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BTVUIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBZGp1c3QgdGhlIEdQIHZhbHVlIGZvciBhIG5ldyByYW5nZSBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFZBTFVFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbTMyX2FscGhhX253X2hvd3RvID0KLSAgSE9XVE8gKEFMUEhBX1JfTldfUkVMT0MsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk5XX1JFTE9DIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogUmVhZCBhbiBBbHBoYSBOTE0gcmVsb2MuICBUaGlzIHJvdXRpbmUga2VlcHMgc29tZSBzdGF0aWMgZGF0YSB3aGljaAotICAgaXQgdXNlcyB3aGVuIGhhbmRsaW5nIGxvY2FsIHJlbG9jcy4gIFRoaXMgb25seSB3b3JrcyBjb3JyZWN0bHkKLSAgIGJlY2F1c2UgYWxsIHRoZSBsb2NhbCByZWxvY3MgYXJlIHJlYWQgYXQgb25jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIHN0YXRpYyBiZmRfdm1hIGdwX3ZhbHVlOwotICBzdGF0aWMgYmZkX3ZtYSBsaXRhX2FkZHJlc3M7Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9yZWxvYyBleHQ7Ci0gIGJmZF92bWEgcl92YWRkcjsKLSAgbG9uZyByX3N5bW5keDsKLSAgaW50IHJfdHlwZSwgcl9leHRlcm4sIHJfb2Zmc2V0LCByX3NpemU7Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjOwotCi0gIC8qIFJlYWQgdGhlIHJlbG9jIGZyb20gdGhlIGZpbGUuICAqLwotICBpZiAoYmZkX3JlYWQgKCZleHQsIHNpemVvZiBleHQsIDEsIGFiZmQpICE9IHNpemVvZiBleHQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN3YXAgaW4gdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLSAgcl92YWRkciA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC5yX3ZhZGRyKTsKLSAgcl9zeW1uZHggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQucl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSk7Ci0KLSAgcl90eXBlID0gKChleHQucl9iaXRzWzBdICYgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUpCi0JICAgID4+IFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFKTsKLSAgcl9leHRlcm4gPSAoZXh0LnJfYml0c1sxXSAmIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUpICE9IDA7Ci0gIHJfb2Zmc2V0ID0gKChleHQucl9iaXRzWzFdICYgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRSkKLQkgICAgICA+PiBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKTsKLSAgLyogSWdub3JlIHRoZSByZXNlcnZlZCBiaXRzLiAgKi8KLSAgcl9zaXplID0gKChleHQucl9iaXRzWzNdICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpCi0JICAgID4+IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKTsKLQotICAvKiBGaWxsIGluIHRoZSBCRkQgYXJlbGVudCBzdHJ1Y3R1cmUuICAqLwotICBjb2RlX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGlmIChyX2V4dGVybikKLSAgICB7Ci0gICAgICAvKiBFeHRlcm5hbCByZWxvY2F0aW9ucyBhcmUgb25seSB1c2VkIGZvciBpbXBvcnRzLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKHN5bSAhPSBOVUxMKTsKLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gc2V0IHN5bV9wdHJfcHRyIGZvciB0aGlzIGNhc2UuICBJdCBpcyBzZXQgaW4KLQkgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYy4gICovCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gTlVMTDsKLSAgICAgIHJlbC0+YWRkZW5kID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbnRlcm5hbCByZWxvY2F0aW9ucyBhcmUgb25seSB1c2VkIGZvciBsb2NhbCByZWxvY2F0aW9uCi0JIGZpeHVwcy4gIElmIHRoZXkgYXJlIG5vdCBOV19SRUxPQyBvciBHUERJU1Agb3IgSUdOT1JFLCB0aGV5Ci0JIG11c3QgYmUgYWdhaW5zdCAudGV4dCBvciAuZGF0YS4gICovCi0gICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQyB8fCBzeW0gPT0gTlVMTCk7Ci0gICAgICBpZiAocl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MKLQkgIHx8IHJfdHlwZSA9PSBBTFBIQV9SX0dQRElTUAotCSAgfHwgcl90eXBlID09IEFMUEhBX1JfSUdOT1JFKQotCXsKLQkgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJlbC0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChyX3N5bW5keCA9PSBBTFBIQV9SRUxPQ19TRUNUSU9OX1RFWFQpCi0JewotCSAgcmVsLT5zeW1fcHRyX3B0ciA9IGNvZGVfc2VjLT5zeW1ib2xfcHRyX3B0cjsKLQkgIEJGRF9BU1NFUlQgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGNvZGVfc2VjKSA9PSAwKTsKLQkgIHJlbC0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChyX3N5bW5keCA9PSBBTFBIQV9SRUxPQ19TRUNUSU9OX0RBVEEpCi0JewotCSAgcmVsLT5zeW1fcHRyX3B0ciA9IGRhdGFfc2VjLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJlbC0+YWRkZW5kID0gLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBkYXRhX3NlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKDApOwotCSAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogV2UgdXNlIHRoZSBhZGRyZXNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSByZWxvYyBpcyBpbiB0aGUgLnRleHQKLSAgICAgb3IgLmRhdGEgc2VjdGlvbi4gIFJfTldfUkVMT0MgcmVsb2NzIGRvbid0IHJlYWxseSBoYXZlIGEgc2VjdGlvbiwKLSAgICAgc28gd2UgcHV0IHRoZW0gaW4gLnRleHQuICAqLwotICBpZiAocl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MKLSAgICAgIHx8IHJfdmFkZHIgPCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYykpCi0gICAgewotICAgICAgKnNlY3AgPSBjb2RlX3NlYzsKLSAgICAgIHJlbC0+YWRkcmVzcyA9IHJfdmFkZHI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnNlY3AgPSBkYXRhX3NlYzsKLSAgICAgIHJlbC0+YWRkcmVzcyA9IHJfdmFkZHIgLSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgfQotCi0gIC8qIFdlIG11c3QgYWRqdXN0IHRoZSBhZGRlbmQgYmFzZWQgb24gdGhlIHR5cGUuICAqLwotICBCRkRfQVNTRVJUICgocl90eXBlID49IDAgJiYgcl90eXBlIDw9IEFMUEhBX1JfR1BWQUxVRSkKLQkgICAgICB8fCByX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQyk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgQUxQSEFfUl9CUkFERFI6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUwxNjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDMyOgotICAgIGNhc2UgQUxQSEFfUl9TUkVMNjQ6Ci0gICAgICAvKiBUaGUgUEMgcmVsYXRpdmUgcmVsb2NzIGRvIG5vdCBzZWVtIHRvIHVzZSB0aGUgc2VjdGlvbiBWTUEgYXMKLQkgYSBuZWdhdGl2ZSBhZGRlbmQuICAqLwotICAgICAgcmVsLT5hZGRlbmQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfR1BSRUwzMjoKLSAgICAgIC8qIENvcHkgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlIGludG8gdGhlIGFkZGVuZCwgdG8KLQkgZW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBjb25mdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLSAgICAgIGlmICghIHJfZXh0ZXJuKQotCXJlbC0+YWRkZW5kICs9IGdwX3ZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfTElURVJBTDoKLSAgICAgIEJGRF9BU1NFUlQgKCEgcl9leHRlcm4pOwotICAgICAgcmVsLT5hZGRlbmQgKz0gbGl0YV9hZGRyZXNzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfTElUVVNFOgotICAgIGNhc2UgQUxQSEFfUl9HUERJU1A6Ci0gICAgICAvKiBUaGUgTElUVVNFIGFuZCBHUERJU1AgcmVsb2NzIGRvIG5vdCB1c2UgYSBzeW1ib2wsIG9yIGFuCi0JIGFkZGVuZCwgYnV0IHRoZXkgZG8gdXNlIGEgc3BlY2lhbCBjb2RlLiAgUHV0IHRoaXMgY29kZSBpbiB0aGUKLQkgYWRkZW5kIGZpZWxkLiAgKi8KLSAgICAgIHJlbC0+YWRkZW5kID0gcl9zeW1uZHg7Ci0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLSAgICAgIC8qIFRoZSBTVE9SRSByZWxvYyBuZWVkcyB0aGUgc2l6ZSBhbmQgb2Zmc2V0IGZpZWxkcy4gIFdlIHN0b3JlCi0JIHRoZW0gaW4gdGhlIGFkZGVuZC4gICovCi0gICAgICBCRkRfQVNTRVJUIChyX29mZnNldCA8IDI1NiAmJiByX3NpemUgPCAyNTYpOwotICAgICAgcmVsLT5hZGRlbmQgPSAocl9vZmZzZXQgPDwgOCkgKyByX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9QVVNIOgotICAgIGNhc2UgQUxQSEFfUl9PUF9QU1VCOgotICAgIGNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotICAgICAgLyogVGhlIFBVU0gsIFBTVUIgYW5kIFBSU0hJRlQgcmVsb2NzIGRvIG5vdCBhY3R1YWxseSB1c2UgYW4KLQkgYWRkcmVzcy4gIEkgYmVsaWV2ZSB0aGF0IHRoZSBhZGRyZXNzIHN1cHBsaWVkIGlzIHJlYWxseSBhbgotCSBhZGRlbmQuICAqLwotICAgICAgcmVsLT5hZGRlbmQgPSByX3ZhZGRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfR1BWQUxVRToKLSAgICAgIC8qIFJlY29yZCB0aGUgbmV3IGdwIHZhbHVlLiAgKi8KLSAgICAgIGdwX3ZhbHVlICs9IHJfc3ltbmR4OwotICAgICAgcmVsLT5hZGRlbmQgPSBncF92YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0lHTk9SRToKLSAgICAgIC8qIElmIHRoZSB0eXBlIGlzIEFMUEhBX1JfSUdOT1JFLCBtYWtlIHN1cmUgdGhpcyBpcyBhIHJlZmVyZW5jZQotCSB0byB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzbyB0aGF0IHRoZSByZWxvYyBpcyBpZ25vcmVkLiAgRm9yCi0JIHNvbWUgcmVhc29uIHRoZSBhZGRyZXNzIG9mIHRoaXMgcmVsb2MgdHlwZSBpcyBub3QgYWRqdXN0ZWQgYnkKLQkgdGhlIHNlY3Rpb24gdm1hLiAgV2UgcmVjb3JkIHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZQotCSBoZXJlLCBmb3IgY29udmVuaWVuY2Ugd2hlbiBkb2luZyB0aGUgR1BESVNQIHJlbG9jYXRpb24uICAqLwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgcmVsLT5hZGRyZXNzID0gcl92YWRkcjsKLSAgICAgIHJlbC0+YWRkZW5kID0gZ3BfdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9OV19SRUxPQzoKLSAgICAgIC8qIElmIHRoaXMgaXMgU0VUR1AsIHdlIHNldCB0aGUgYWRkZW5kIHRvIDAuICBPdGhlcndpc2Ugd2Ugc2V0Ci0JIHRoZSBhZGRlbmQgdG8gdGhlIHNpemUgb2YgdGhlIC5saXRhIHNlY3Rpb24gKHRoaXMgaXMKLQkgcl9zeW1uZHgpIHBsdXMgMS4gIFdlIGhhdmUgYWxyZWFkeSBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0JIHJlbG9jIHRvIHJfdmFkZHIuICAqLwotICAgICAgaWYgKHJfc2l6ZSA9PSBBTFBIQV9SX05XX1JFTE9DX1NFVEdQKQotCXsKLQkgIGdwX3ZhbHVlID0gcl92YWRkcjsKLQkgIHJlbC0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChyX3NpemUgPT0gQUxQSEFfUl9OV19SRUxPQ19MSVRBKQotCXsKLQkgIGxpdGFfYWRkcmVzcyA9IHJfdmFkZHI7Ci0JICByZWwtPmFkZGVuZCA9IHJfc3ltbmR4ICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JQkZEX0FTU0VSVCAoMCk7Ci0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DKQotICAgIHJlbC0+aG93dG8gPSAmbmxtMzJfYWxwaGFfbndfaG93dG87Ci0gIGVsc2UKLSAgICByZWwtPmhvd3RvID0gJm5sbTMyX2FscGhhX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hbmdsZSBBbHBoYSBOTE0gcmVsb2NzIGZvciBvdXRwdXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFuIEFMUEhBIE5MTSBpbXBvcnQgcmVjb3JkICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KLSAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpuYW1lOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKLSAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKLSAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOwotICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHRlbXApOwotICBubG1fcmVsb2NzID0gKChzdHJ1Y3QgbmxtX3JlbGVudCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHJjb3VudCAqIHNpemVvZiAoc3RydWN0IG5sbV9yZWxlbnQpKSk7Ci0gIGlmICghbmxtX3JlbG9jcykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiByZWxvY3MgPSBubG1fcmVsb2NzOwotICBzeW0gLT4gcmNudCA9IDA7Ci0gIHdoaWxlIChzeW0gLT4gcmNudCA8IHJjb3VudCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIAotICAgICAgaWYgKG5sbV9hbHBoYV9yZWFkX3JlbG9jIChhYmZkLCBzeW0sICZzZWN0aW9uLAotCQkJCSZubG1fcmVsb2NzIC0+IHJlbG9jKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmxtX3JlbG9jcyAtPiBzZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5sbV9yZWxvY3MrKzsKLSAgICAgIHN5bSAtPiByY250Kys7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhbiBBbHBoYSBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBhc3ltYm9sICpzeW07Ci0gIGJmZF92bWEgcl92YWRkcjsKLSAgbG9uZyByX3N5bW5keDsKLSAgaW50IHJfdHlwZSwgcl9leHRlcm4sIHJfb2Zmc2V0LCByX3NpemU7Ci0gIHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9yZWxvYyBleHQ7Ci0KLSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgLyogR2V0IHZhbHVlcyBmb3IgdGhlIHJlbG9jYXRpb24gZmllbGRzLiAgKi8KLSAgcl90eXBlID0gcmVsLT5ob3d0by0+dHlwZTsKLSAgaWYgKHJfdHlwZSAhPSBBTFBIQV9SX05XX1JFTE9DKQotICAgIHsKLSAgICAgIHJfdmFkZHIgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpICsgcmVsLT5hZGRyZXNzOwotICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0Jcl92YWRkciArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLAotCQkJCSAgICAgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsCi0JCQkJCQkJICAgICAgTkxNX0NPREVfTkFNRSkpOwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICByX2V4dGVybiA9IDE7Ci0JICByX3N5bW5keCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfZXh0ZXJuID0gMDsKLQkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkgJiBTRUNfQ09ERSkKLQkgICAgcl9zeW1uZHggPSBBTFBIQV9SRUxPQ19TRUNUSU9OX1RFWFQ7Ci0JICBlbHNlCi0JICAgIHJfc3ltbmR4ID0gQUxQSEFfUkVMT0NfU0VDVElPTl9EQVRBOwotCX0KLSAgICAgIHJfb2Zmc2V0ID0gMDsKLSAgICAgIHJfc2l6ZSA9IDA7Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCWNhc2UgQUxQSEFfUl9HUERJU1A6Ci0JICByX3N5bW5keCA9IHJlbC0+YWRkZW5kOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0JICByX3NpemUgPSByZWwtPmFkZGVuZCAmIDB4ZmY7Ci0JICByX29mZnNldCA9IChyZWwtPmFkZGVuZCA+PiA4KSAmIDB4ZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QVVNIOgotCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotCSAgcl92YWRkciA9IHJlbC0+YWRkZW5kOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfSUdOT1JFOgotCSAgcl92YWRkciA9IHJlbC0+YWRkcmVzczsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQyAqLwotICAgICAgcl92YWRkciA9IHJlbC0+YWRkcmVzczsKLSAgICAgIGlmIChyZWwtPmFkZGVuZCA9PSAwKQotCXsKLQkgIHJfc3ltbmR4ID0gMDsKLQkgIHJfc2l6ZSA9IEFMUEhBX1JfTldfUkVMT0NfU0VUR1A7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfc3ltbmR4ID0gcmVsLT5hZGRlbmQgLSAxOwotCSAgcl9zaXplID0gQUxQSEFfUl9OV19SRUxPQ19MSVRBOwotCX0KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgLyogU3dhcCBvdXQgdGhlIHJlbG9jYXRpb24gZmllbGRzLiAgKi8KLSAgYmZkX2hfcHV0XzY0IChhYmZkLCByX3ZhZGRyLCAoYmZkX2J5dGUgKikgZXh0LnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHJfc3ltbmR4LCAoYmZkX2J5dGUgKikgZXh0LnJfc3ltbmR4KTsKLQotICBCRkRfQVNTRVJUIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOwotCi0gIGV4dC5yX2JpdHNbMF0gPSAoKHJfdHlwZSA8PCBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRSkKLQkJICAgJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSk7Ci0gIGV4dC5yX2JpdHNbMV0gPSAoKHJfZXh0ZXJuID8gUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSA6IDApCi0JCSAgIHwgKChyX29mZnNldCA8PCBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKQotCQkgICAgICAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpKTsKLSAgZXh0LnJfYml0c1syXSA9IDA7Ci0gIGV4dC5yX2JpdHNbM10gPSAoKHJfc2l6ZSA8PCBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSkKLQkJICAgJiBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRSk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBBbHBoYSBOZXRXYXJlIGRvZXMgbm90IHVzZSB0aGUgaGlnaCBiaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYQotICAgcHVibGljIHN5bWJvbCBpcyBpbiB0aGUgY29kZSBzZWdtZW50IG9yIHRoZSBkYXRhIHNlZ21lbnQuICBJbnN0ZWFkLAotICAgaXQganVzdCB1c2VzIHRoZSBhZGRyZXNzLiAgVGhlIHNldF9wdWJsaWNfc2VjdGlvbiBhbmQKLSAgIGdldF9wdWJsaWNfb2Zmc2V0IHJvdXRpbmVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvZGUgd2hpY2ggdXNlcyB0aGUKLSAgIGhpZ2ggYml0LiAgKi8KLQotLyogU2V0IHRoZSBzZWN0aW9uIGZvciBhIHB1YmxpYyBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX3NldF9wdWJsaWNfc2VjdGlvbiAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjOwotCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKHN5bS0+c3ltYm9sLnZhbHVlIDwgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpKQotICAgIHsKLSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBjb2RlX3NlYzsKLSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gZGF0YV9zZWM7Ci0gICAgICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgICAvKiBUaGUgZGF0YSBzZWdtZW50IGhhZCBiZXR0ZXIgYmUgYWxpZ25lZC4gICovCi0gICAgICBCRkRfQVNTRVJUICgoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpICYgMHhmKSA9PSAwKTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIG9mZnNldCB0byB3cml0ZSBvdXQgZm9yIGEgcHVibGljIHN5bWJvbC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1ubG1fYWxwaGFfZ2V0X3B1YmxpY19vZmZzZXQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIHJldHVybiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLX0KLQwKLS8qIFdyaXRlIGFuIEFscGhhIE5MTSBleHRlcm5hbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOwotewotICBpbnQgaTsKLSAgYmZkX2J5dGUgbGVuOwotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotICBhcmVsZW50IHI7Ci0KLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpICE9IHNpemVvZihiZmRfYnl0ZSkpCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50ICsgMiwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBmaXJzdCB0d28gcmVsb2NzIGZvciBlYWNoIGV4dGVybmFsIHN5bWJvbCBhcmUgdGhlIC5saXRhCi0gICAgIGFkZHJlc3MgYW5kIHRoZSBHUCB2YWx1ZS4gICovCi0gIHIuc3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgci5ob3d0byA9ICZubG0zMl9hbHBoYV9ud19ob3d0bzsKLQotICByLmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChhYmZkKS0+bGl0YV9hZGRyZXNzOwotICByLmFkZGVuZCA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKGFiZmQpLT5saXRhX3NpemUgKyAxOwotICBpZiAobmxtX2FscGhhX3dyaXRlX2ltcG9ydCAoYWJmZCwgKGFzZWN0aW9uICopIE5VTEwsICZyKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgci5hZGRyZXNzID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAoYWJmZCktPmdwOwotICByLmFkZGVuZCA9IDA7Ci0gIGlmIChubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgJnIpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmxtX2FscGhhX3dyaXRlX2ltcG9ydCAoYWJmZCwgcmVsb2NzW2ldLnNlYywKLQkJCQkgIHJlbG9jc1tpXS5yZWwpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9hbHBoYV9iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgQWxwaGEgTW9kdWxlICAgXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfYWxwaGFfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKLSAgc2l6ZW9mIChzdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciksCi0gIGJmZF9hcmNoX2FscGhhLAotICAwLAotICB0cnVlLCAvKiBubyB1bmluaXRpYWxpemVkIGRhdGEgcGVybWl0dGVkIGJ5IEFscGhhIE5ldFdhcmUuICAqLwotICBubG1fYWxwaGFfYmFja2VuZF9vYmplY3RfcCwKLSAgbmxtX2FscGhhX3dyaXRlX3ByZWZpeCwKLSAgbmxtX2FscGhhX3JlYWRfcmVsb2MsCi0gIG5sbV9hbHBoYV9tYW5nbGVfcmVsb2NzLAotICBubG1fYWxwaGFfcmVhZF9pbXBvcnQsCi0gIG5sbV9hbHBoYV93cml0ZV9pbXBvcnQsCi0gIG5sbV9hbHBoYV9zZXRfcHVibGljX3NlY3Rpb24sCi0gIG5sbV9hbHBoYV9nZXRfcHVibGljX29mZnNldCwKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1fYWxwaGFfd3JpdGVfZXh0ZXJuYWwsCi0gIDAsCS8qIHdyaXRlX2V4cG9ydCAqLwotfTsKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJubG0zMi1hbHBoYSIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCW5sbU5BTUUoYWxwaGFfdmVjKQotI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfYWxwaGFfYmFja2VuZAotCi0jaW5jbHVkZSAibmxtLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTMyLWkzODYuYyBiL2JmZC9ubG0zMi1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmM3NGQuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKiBTdXBwb3J0IGZvciAzMi1iaXQgaTM4NiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgIm5sbS9pMzg2LWV4dC5oIgotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX2kzODZfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCi0KLSNpbmNsdWRlICJsaWJubG0uaCIKLQotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfcmVhZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfd3JpdGVfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9pMzg2X21hbmdsZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfcmVhZF9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9pMzg2X3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQotLyogQWRqdXN0IHRoZSByZWxvYyBsb2NhdGlvbiBieSBhbiBhYnNvbHV0ZSB2YWx1ZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbV9pMzg2X2Fic19ob3d0byA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiMzIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogQWRqdXN0IHRoZSByZWxvYyBsb2NhdGlvbiBieSBhIFBDIHJlbGF0aXZlIGRpc3BsYWNlbWVudC4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbV9pMzg2X3BjcmVsX2hvd3RvID0KLSAgSE9XVE8gKDEsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiBSZWFkIGEgTmV0V2FyZSBpMzg2IHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9pMzg2X3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgc2VjcCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfYnl0ZSB0ZW1wWzRdOwotICBiZmRfdm1hIHZhbDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRlbXApOwotCi0gIC8qIFRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byBlaXRoZXIgdGhlIGNvZGUgb3IgZGF0YSBzZWdtZW50LgotICAgICBUaGlzIGlzIHRoZSBsb2NhdGlvbiB3aGljaCBuZWVkcyB0byBiZSBhZGp1c3RlZC4KLQotICAgICBJZiB0aGlzIGlzIGEgcmVsb2NhdGlvbiBmaXh1cCByYXRoZXIgdGhhbiBhbiBpbXBvcnRlZCBzeW1ib2wgKHRoZQotICAgICBzeW0gYXJndW1lbnQgaXMgTlVMTCkgdGhlbiB0aGUgaGlnaCBiaXQgaXMgMCBpZiB0aGUgbG9jYXRpb24KLSAgICAgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCwgb3IgMSBpZgotICAgICB0aGUgbG9jYXRpb24gbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvZGUKLSAgICAgc2VnbWVudC4gIElmIHRoaXMgaXMgYW4gaW1wb3J0ZWQgc3ltYm9sLCB0aGVuIHRoZSBoaWdoIGJpdCBpcyAwCi0gICAgIGlmIHRoZSBsb2NhdGlvbiBpcyAwIGlmIHRoZSBsb2NhdGlvbiBzaG91bGQgYmUgYWRqdXN0ZWQgYnkgdGhlCi0gICAgIG9mZnNldCB0byB0aGUgc3ltYm9sLCBvciAxIGlmIHRoZSBsb2NhdGlvbiBzaG91bGQgYWRqdXN0ZWQgYnkgdGhlCi0gICAgIGFic29sdXRlIHZhbHVlIG9mIHRoZSBzeW1ib2wuCi0KLSAgICAgVGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyAwIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQKLSAgICAgaW50byB0aGUgZGF0YSBzZWdtZW50LCBvciAxIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUKLSAgICAgY29kZSBzZWdtZW50LgotCi0gICAgIEFsbCB0aGlzIHRyYW5zbGF0ZXMgZmFpcmx5IGVhc2lseSBpbnRvIGEgQkZEIHJlbG9jLiAgKi8KLQotICBpZiAoc3ltID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCh2YWwgJiBOTE1fSElCSVQpID09IDApCi0JbmFtZSA9IE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gICAgICBlbHNlCi0JewotCSAgbmFtZSA9IE5MTV9DT0RFX05BTUU7Ci0JICB2YWwgJj1+IE5MTV9ISUJJVDsKLQl9Ci0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIHJlbC0+aG93dG8gPSAmbmxtX2kzODZfYWJzX2hvd3RvOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHRoaXMgY2FzZSB3ZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIHN5bV9wdHJfcHRyIGZpZWxkLiAgKi8KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBOVUxMOwotICAgICAgaWYgKCh2YWwgJiBOTE1fSElCSVQpID09IDApCi0JcmVsLT5ob3d0byA9ICZubG1faTM4Nl9wY3JlbF9ob3d0bzsKLSAgICAgIGVsc2UKLQl7Ci0JICByZWwtPmhvd3RvID0gJm5sbV9pMzg2X2Fic19ob3d0bzsKLQkgIHZhbCAmPX4gTkxNX0hJQklUOwotCX0KLSAgICB9Ci0KLSAgaWYgKCh2YWwgJiAoTkxNX0hJQklUID4+IDEpKSA9PSAwKQotICAgICpzZWNwID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBlbHNlCi0gICAgewotICAgICAgKnNlY3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gICAgICB2YWwgJj1+IChOTE1fSElCSVQgPj4gMSk7Ci0gICAgfQotCi0gIHJlbC0+YWRkcmVzcyA9IHZhbDsKLSAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhIE5ldFdhcmUgaTM4NiByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1faTM4Nl93cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYXN5bWJvbCAqc3ltOwotICBiZmRfdm1hIHZhbDsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLQotICAvKiBOZXRXYXJlIG9ubHkgc3VwcG9ydHMgdHdvIGtpbmRzIG9mIHJlbG9jcy4gIFdlIHNob3VsZCBjaGVjawotICAgICBzcGVjaWFsX2Z1bmN0aW9uIGhlcmUsIGFzIHdlbGwsIGJ1dCBhdCB0aGUgbW9tZW50IGNvZmYtaTM4NgotICAgICByZWxvY3MgdXNlcyBhIHNwZWNpYWxfZnVuY3Rpb24gd2hpY2ggZG9lcyBub3QgYWZmZWN0IHdoYXQgd2UgZG8KLSAgICAgaGVyZS4gICovCi0gIGlmIChyZWwtPmFkZGVuZCAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvID09IE5VTEwKLSAgICAgIHx8IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+c2l6ZSAhPSAyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRzaXplICE9IDMyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRwb3MgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+c3JjX21hc2sgIT0gMHhmZmZmZmZmZgotICAgICAgfHwgcmVsLT5ob3d0by0+ZHN0X21hc2sgIT0gMHhmZmZmZmZmZikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAvKiBUaGUgdmFsdWUgd2Ugd3JpdGUgb3V0IGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYXBwcm9wcmlhdGUKLSAgICAgc2VnbWVudC4gIFRoaXMgb2Zmc2V0IGlzIHRoZSBzZWN0aW9uIHZtYSwgYWRqdXN0ZWQgYnkgdGhlIHZtYSBvZgotICAgICB0aGUgbG93ZXN0IHNlY3Rpb24gaW4gdGhhdCBzZWdtZW50LCBwbHVzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICByZWxvY2F0aW9uLiAgKi8KLSAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKLQotICAvKiBUaGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDAgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldAotICAgICBpbnRvIHRoZSBkYXRhIHNlZ21lbnQsIG9yIDEgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZQotICAgICBjb2RlIHNlZ21lbnQuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpCi0gICAgewotICAgICAgdmFsIC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICAgICAgdmFsIHw9IE5MTV9ISUJJVCA+PiAxOwotICAgIH0KLSAgZWxzZQotICAgIHZhbCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLQotICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0gICAgewotICAgICAgLyogTmV0V2FyZSBvbmx5IHN1cHBvcnRzIGFic29sdXRlIGludGVybmFsIHJlbG9jcy4gICovCi0gICAgICBpZiAocmVsLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBoaWdoIGJpdCBpcyAxIGlmIHRoZSByZWxvYyBpcyBhZ2FpbnN0IHRoZSBjb2RlIHNlY3Rpb24sIDAKLQkgaWYgYWdhaW5zdCB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkgJiBTRUNfQ09ERSkKLQl2YWwgfD0gTkxNX0hJQklUOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBoaWdoIGJpdCBpcyAxIGlmIHRoaXMgaXMgYW4gYWJzb2x1dGUgcmVsb2MsIDAgaWYgaXQgaXMgUEMKLQkgcmVsYXRpdmUuICAqLwotICAgICAgaWYgKCEgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JdmFsIHw9IE5MTV9ISUJJVDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQQyByZWxhdGl2ZSByZWxvY3Mgb24gTmV0V2FyZSBtdXN0IGJlIHBjcmVsX29mZnNldC4gICovCi0JICBpZiAoISByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gdHVybiBhIGkzODYgYS5vdXQgb3IgQ09GRiBmaWxlCi0gICBpbnRvIGEgTmV0V2FyZSBpMzg2IG1vZHVsZS4gIFRoYXQgbWVhbnMgdGhhdCB0aGUgcmVsb2NzIGZyb20gdGhlCi0gICBzb3VyY2UgZmlsZSBoYXZlIHRvIGJlIG1hcHBlZCBpbnRvIHJlbG9jcyB0aGF0IGFwcGx5IHRvIHRoZSB0YXJnZXQKLSAgIGZpbGUuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBubG1fc2V0X3NlY3Rpb25fY29udGVudHMgdG8gZ2l2ZQotICAgaXQgYSBjaGFuY2UgdG8gcmV3b3JrIHRoZSByZWxvY3MuCi0KLSAgIFRoaXMgaXMgYWN0dWFsbHkgYSBmYWlybHkgZ2VuZXJhbCBjb25jZXB0LiAgSG93ZXZlciwgdGhpcyBpcyBub3QgYQotICAgZ2VuZXJhbCBpbXBsZW1lbnRhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1faTM4Nl9tYW5nbGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBhcmVsZW50ICoqcmVsX3B0cl9wdHIsICoqcmVsX2VuZDsKLQotICByZWxfcHRyX3B0ciA9IHNlYy0+b3JlbG9jYXRpb247Ci0gIHJlbF9lbmQgPSByZWxfcHRyX3B0ciArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWxfcHRyX3B0ciA8IHJlbF9lbmQ7IHJlbF9wdHJfcHRyKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgIHJlbCA9ICpyZWxfcHRyX3B0cjsKLSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gICAgICAvKiBOb3RlIHRoYXQgbm8gc2VyaW91cyBoYXJtIHdpbGwgZW5zdWUgaWYgd2UgZmFpbCB0byBjaGFuZ2UgYQotCSByZWxvYy4gIFdlIHdpbGwgd2luZCB1cCBmYWlsaW5nIGluIG5sbV9pMzg2X3dyaXRlX2ltcG9ydC4gICovCi0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHJlbG9jIGlzIHdpdGhpbiB0aGUgZGF0YSB3ZSBoYXZlLiAgV2Ugb25seSA0Ci0JIGJ5dGUgcmVsb2NzIGhlcmUsIHNvIHdlIGluc2lzdCBvbiBoYXZpbmcgNCBieXRlcy4gICovCi0gICAgICBpZiAocmVsLT5hZGRyZXNzIDwgb2Zmc2V0Ci0JICB8fCByZWwtPmFkZHJlc3MgKyA0ID4gb2Zmc2V0ICsgY291bnQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIE5ldFdhcmUgZG9lc24ndCBzdXBwb3J0IHJlbG9jIGFkZGVuZHMsIHNvIHdlIGdldCByaWQgb2YgdGhlbQotCSBoZXJlIGJ5IHNpbXBseSBhZGRpbmcgdGhlbSBpbnRvIHRoZSBvYmplY3QgZGF0YS4gIFdlIGhhbmRsZQotCSB0aGUgc3ltYm9sIHZhbHVlLCBpZiBhbnksIHRoZSBzYW1lIHdheS4gICovCi0gICAgICBhZGRlbmQgPSByZWwtPmFkZGVuZCArIHN5bS0+dmFsdWU7Ci0KLSAgICAgIC8qIFRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24uICBJZiB0aGUKLQkgc3ltYm9sIGlzIGluIHRoZSAuYnNzIHNlZ21lbnQsIHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgc2l6ZSBvZgotCSB0aGUgZGF0YSBzZWdtZW50IGluIHRoZSBvZmZzZXQgYXMgd2VsbC4gIEZvcnR1bmF0ZWx5LCB3ZSBrbm93Ci0JIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBzZWN0aW9uIGlzIGluIHRoZSBOTE0KLQkgaGVhZGVyLiAgKi8KLSAgICAgIGlmICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAmIFNFQ19MT0FEKSA9PSAwKQotCSAgJiYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICAgJiBTRUNfQUxMT0MpICE9IDApKQotCWFkZGVuZCArPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlU2l6ZTsKLQotICAgICAgaWYgKGFkZGVuZCAhPSAwCi0JICAmJiByZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgotCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWwtPmFkZHJlc3MgLSBvZmZzZXQpOwotCSAgdmFsICs9IGFkZGVuZDsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWwtPmFkZHJlc3MgLSBvZmZzZXQpOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLQotICAgICAgLyogTmV0V2FyZSB1c2VzIGEgcmVsb2Mgd2l0aCBwY3JlbF9vZmZzZXQgc2V0LiAgV2UgYWRqdXN0Ci0JIHBjX3JlbGF0aXZlIHJlbG9jcyBhY2NvcmRpbmdseS4gIFdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlCi0JIGhvd3RvIGZpZWxkLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGlmIHRoZSBjdXJyZW50IG9uZSBpcwotCSBjb21wYXRpYmxlLiAgV2Ugc2hvdWxkIGNoZWNrIHNwZWNpYWxfZnVuY3Rpb24gaGVyZSwgYnV0IGF0Ci0JIHRoZSBtb21lbnQgY29mZi1pMzg2IHVzZXMgYSBzcGVjaWFsX2Z1bmN0aW9uIHdoaWNoIGRvZXMgbm90Ci0JIGFmZmVjdCB3aGF0IHdlIGFyZSBkb2luZyBoZXJlLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0JICAmJiAhIHJlbC0+aG93dG8tPnBjcmVsX29mZnNldAotCSAgJiYgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zaXplID09IDIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHNpemUgPT0gMzIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHBvcyA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zcmNfbWFzayA9PSAweGZmZmZmZmZmCi0JICAmJiByZWwtPmhvd3RvLT5kc3RfbWFzayA9PSAweGZmZmZmZmZmKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICAvKiBXaGVuIHBjcmVsX29mZnNldCBpcyBub3Qgc2V0LCBpdCBtZWFucyB0aGF0IHRoZSBuZWdhdGl2ZQotCSAgICAgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBsb2NhdGlvbiBpcyBzdG9yZWQgaW4gdGhlCi0JICAgICBtZW1vcnkgbG9jYXRpb24uICBXZSBtdXN0IGFkZCBpdCBiYWNrIGluLiAgKi8KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsLT5hZGRyZXNzIC0gb2Zmc2V0KTsKLQkgIHZhbCArPSByZWwtPmFkZHJlc3M7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsLT5hZGRyZXNzIC0gb2Zmc2V0KTsKLQotCSAgcmVsLT5ob3d0byA9ICZubG1faTM4Nl9wY3JlbF9ob3d0bzsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgTmV0V2FyZSBpMzg2IGltcG9ydCByZWNvcmQgKi8KLXN0YXRpYyBib29sZWFuCi1ubG1faTM4Nl9yZWFkX2ltcG9ydCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIHN0cnVjdCBubG1fcmVsZW50ICpubG1fcmVsb2NzOwkvKiByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHN5bWJvbCAqLwotICBiZmRfc2l6ZV90eXBlIHJjb3VudDsJCQkvKiBudW1iZXIgb2YgcmVsb2NzICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiB0ZW1wb3JhcnkgMzItYml0IHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOwotICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOwotICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKLSAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0gIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKLSAgaWYgKCFubG1fcmVsb2NzKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX2kzODZfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCAmc2VjdGlvbiwKLQkJCSAgICAgICAmbmxtX3JlbG9jcyAtPiByZWxvYykKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBubG1fcmVsb2NzKys7Ci0gICAgICBzeW0gLT4gcmNudCsrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2kzODZfd3JpdGVfZXh0ZXJuYWwgKGFiZmQsIGNvdW50LCBzeW0sIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCByZWxvY19hbmRfc2VjICpyZWxvY3M7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBiZmRfYnl0ZSBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpICE9IHNpemVvZihiZmRfYnl0ZSkpCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmxtX2kzODZfd3JpdGVfaW1wb3J0IChhYmZkLCByZWxvY3NbaV0uc2VjLAotCQkJCSByZWxvY3NbaV0ucmVsKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaW5jbHVkZSAibmxtc3dhcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgbmxtMzJfaTM4Nl9iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgTG9hZGFibGUgTW9kdWxlXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfaTM4Nl9FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotICAwLAkvKiBvcHRpb25hbF9wcmVmaXhfc2l6ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICAwLAotICBmYWxzZSwKLSAgMCwJLyogYmFja2VuZF9vYmplY3RfcCAqLwotICAwLAkvKiB3cml0ZV9wcmVmaXhfZnVuYyAqLwotICBubG1faTM4Nl9yZWFkX3JlbG9jLAotICBubG1faTM4Nl9tYW5nbGVfcmVsb2NzLAotICBubG1faTM4Nl9yZWFkX2ltcG9ydCwKLSAgbmxtX2kzODZfd3JpdGVfaW1wb3J0LAotICAwLAkvKiBzZXRfcHVibGljX3NlY3Rpb24gKi8KLSAgMCwJLyogZ2V0X3B1YmxpY19vZmZzZXQgKi8KLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1faTM4Nl93cml0ZV9leHRlcm5hbCwKLSAgMCwJLyogd3JpdGVfZXhwb3J0ICovCi19OwotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJIm5sbTMyLWkzODYiCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQlubG1OQU1FKGkzODZfdmVjKQotI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfaTM4Nl9iYWNrZW5kCi0KLSNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzItcHBjLmMgYi9iZmQvbmxtMzItcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZjQ4MzQuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NSArMCwwIEBACi0vKiBTdXBwb3J0IGZvciAzMi1iaXQgUG93ZXJQQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogVGhlIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIGNoYW5nZWQuICBEZWZpbmUgT0xERk9STUFUIHRvIGdldCB0aGUKLSAgIG9sZCBmb3JtYXQuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL3BwYy1leHQuaCIKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9wb3dlcnBjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcgotCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLSNpZmRlZiBPTERGT1JNQVQKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX2JhY2tlbmRfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeAotICBQQVJBTVMgKChiZmQgKikpOwotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfcmVhZF9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLQotI2lmZGVmIE9MREZPUk1BVAotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiwgaW50KSk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQotI2lmbmRlZiBPTERGT1JNQVQKLXN0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3NldF9wdWJsaWNfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJmZF92bWEgbmxtX3Bvd2VycGNfZ2V0X3B1YmxpY19vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotI2VuZGlmCi0MCi0jaWZkZWYgT0xERk9STUFUCi0KLS8qIFRoZSBwcmVmaXggaGVhZGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgb2xkIGZvcm1hdC4gICovCi0KLS8qIFBvd2VyUEMgTkxNJ3MgaGF2ZSBhIHByZWZpeCBoZWFkZXIgYmVmb3JlIHRoZSBzdGFuZGFyZCBOTE0uICBUaGlzCi0gICBmdW5jdGlvbiByZWFkcyBpdCBpbiwgdmVyaWZpZXMgdGhlIHZlcnNpb24sIGFuZCBzZWVrcyB0aGUgYmZkIHRvCi0gICB0aGUgbG9jYXRpb24gYmVmb3JlIHRoZSByZWd1bGFyIE5MTSBoZWFkZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobWVtY21wIChzLnNpZ25hdHVyZSwgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUsIHNpemVvZiBzLnNpZ25hdHVyZSkgIT0gMAotICAgICAgfHwgYmZkX2hfZ2V0XzMyIChhYmZkLCBzLmhlYWRlclZlcnNpb24pICE9IE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9wcmVmaXggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciBzOwotCi0gIG1lbXNldCAoJnMsIDAsIHNpemVvZiBzKTsKLSAgbWVtY3B5IChzLnNpZ25hdHVyZSwgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUsIHNpemVvZiBzLnNpZ25hdHVyZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04sIHMuaGVhZGVyVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIDAsIHMub3JpZ2lucyk7Ci0KLSAgLyogRklYTUU6IFdoYXQgc2hvdWxkIHdlIGRvIGFib3V0IHRoZSBkYXRlPyAgKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qIE9MREZPUk1BVCAqLwotDAotI2lmbmRlZiBPTERGT1JNQVQKLQotLyogVGhlcmUgaXMgb25seSBvbmUgdHlwZSBvZiByZWxvYyBpbiBhIFBvd2VyUEMgTkxNLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX3Bvd2VycGNfaG93dG8gPQotICBIT1dUTyAoMCwJCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIjMyIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFJlYWQgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLQotICAvKiBUaGUgdmFsdWUgaXMgYSB3b3JkIG9mZnNldCBpbnRvIGVpdGhlciB0aGUgY29kZSBvciBkYXRhIHNlZ21lbnQuCi0gICAgIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoaWNoIG5lZWRzIHRvIGJlIGFkanVzdGVkLgotCi0gICAgIFRoZSBoaWdoIGJpdCBpcyAwIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUgZGF0YQotICAgICBzZWdtZW50LCBvciAxIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUgdGV4dCBzZWdtZW50LgotCi0gICAgIElmIHRoaXMgaXMgYSByZWxvY2F0aW9uIGZpeHVwIHJhdGhlciB0aGFuIGFuIGltcG9ydGVkIHN5bWJvbCAodGhlCi0gICAgIHN5bSBhcmd1bWVudCBpcyBOVUxMKSwgdGhlbiB0aGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDAKLSAgICAgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCi0gICAgIGxvY2F0aW9uIGFkZHJlc3NlZCBieSB0aGUgdmFsdWUsIG9yIDEgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIHRleHQKLSAgICAgc2VnbWVudCBzaG91bGQgYmUgYWRkZWQuCi0KLSAgICAgSWYgdGhpcyBpcyBhbiBpbXBvcnRlZCBzeW1ib2wsIHRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMKLSAgICAgbm90IHVzZWQgYW5kIG11c3QgYmUgMC4gICovCi0KLSAgaWYgKCh2YWwgJiBOTE1fSElCSVQpID09IDApCi0gICAgbmFtZSA9IE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gTkxNX0NPREVfTkFNRTsKLSAgICAgIHZhbCAmPX4gTkxNX0hJQklUOwotICAgIH0KLSAgKnNlY3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0KLSAgaWYgKHN5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgodmFsICYgKE5MTV9ISUJJVCA+PiAxKSkgPT0gMCkKLQluYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gTkxNX0NPREVfTkFNRTsKLQkgIHZhbCAmPX4gKE5MTV9ISUJJVCA+PiAxKTsKLQl9Ci0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLSAgcmVsLT5ob3d0byA9ICZubG1fcG93ZXJwY19ob3d0bzsKLQotICByZWwtPmFkZHJlc3MgPSB2YWwgPDwgMjsKLSAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZWxzZSAvKiBPTERGT1JNQVQgKi8KLQotLyogVGhpcyByZWxvYyBoYW5kbGluZyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIG9sZCBmb3JtYXQuICAqLwotCi0vKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvYyB0eXBlcy4gIFBvd2VyUEMgTkxNcyB1c2UgWENPRkYKLSAgIHJlbG9jIHR5cGVzLCBhbmQgSSBoYXZlIGp1c3QgY29waWVkIHRoZSBYQ09GRiByZWxvYyB0YWJsZSBoZXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX3Bvd2VycGNfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDAsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1BPUyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24sIGJ1dCBzdG9yZSBuZWdhdGl2ZSB2YWx1ZS4gICovCi0gIEhPV1RPICgxLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAtMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfTkVHIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPICgyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogMTYgYml0IFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UT0MiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGlzIGlzLiAgKi8KLSAgSE9XVE8gKDQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JUQiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBFeHRlcm5hbCBUT0MgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKDUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0dMIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTG9jYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UQ0wiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgNyB9LAotICAKLSAgLyogTm9uIG1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0JBIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyA5IH0sCi0KLSAgLyogTm9uIG1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4YSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQlIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4YiB9LAotCi0gIC8qIEluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHhjLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvYWQgYWRkcmVzcy4gICovCi0gIEhPV1RPICgweGQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JMQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweGUgfSwKLSAgCi0gIC8qIE5vbi1yZWxvY2F0aW5nIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPICgweGYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFRiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLCAgICAgCSAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4MTAgfSwKLSAgeyAweDExIH0sCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgaW5kaXJlY3QgbG9hZC4gICovCi0gIEhPV1RPICgweDEyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UUkwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIFRPQyByZWxhdGl2ZSBsb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHgxMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMQSIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIHJlbGF0aXZlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweDE0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SUlRCSSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkEiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgY2FsbCBhYnNvbHV0ZSBpbmRpcmVjdC4gICovCi0gIEhPV1RPICgweDE2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9DQUkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgY2FsbCByZWxhdGl2ZS4gICovCi0gIEhPV1RPICgweDE3LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxOSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJBQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCByZWxhdGl2ZS4gICovCi0gIEhPV1RPICgweDFhLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDFiLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLSNkZWZpbmUgSE9XVE9fQ09VTlQgKHNpemVvZiBubG1fcG93ZXJwY19ob3d0b190YWJsZQkJXAotCQkgICAgIC8gc2l6ZW9mIG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlWzBdKQotCi0vKiBSZWFkIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jIGV4dDsKLSAgYmZkX3ZtYSBsX3ZhZGRyOwotICB1bnNpZ25lZCBsb25nIGxfc3ltbmR4OwotICBpbnQgbF9ydHlwZTsKLSAgaW50IGxfcnNlY25tOwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYywgKmJzc19zZWM7Ci0KLSAgLyogUmVhZCB0aGUgcmVsb2MgZnJvbSB0aGUgZmlsZS4gICovCi0gIGlmIChiZmRfcmVhZCAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3dhcCBpbiB0aGUgZmllbGRzLiAgKi8KLSAgbF92YWRkciA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LmxfdmFkZHIpOwotICBsX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0Lmxfc3ltbmR4KTsKLSAgbF9ydHlwZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LmxfcnR5cGUpOwotICBsX3JzZWNubSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LmxfcnNlY25tKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb25zIG5vdywgZm9yIGNvbnZlbmllbmNlLiAgKi8KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0KLSAgLyogV29yayBvdXQgdGhlIGFyZWxlbnQgZmllbGRzLiAgKi8KLSAgaWYgKHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gaW1wb3J0LiAgc3ltX3B0cl9wdHIgaXMgZmlsbGVkIGluIGJ5Ci0JIG5sbV9jYW5vbmljYWxpemVfcmVsb2MuICAqLwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaWYgKGxfc3ltbmR4ID09IDApCi0Jc2VjID0gY29kZV9zZWM7Ci0gICAgICBlbHNlIGlmIChsX3N5bW5keCA9PSAxKQotCXNlYyA9IGRhdGFfc2VjOwotICAgICAgZWxzZSBpZiAobF9zeW1uZHggPT0gMikKLQlzZWMgPSBic3Nfc2VjOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IHNlYy0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0gIHJlbC0+YWRkZW5kID0gMDsKLQotICBCRkRfQVNTRVJUICgobF9ydHlwZSAmIDB4ZmYpIDwgSE9XVE9fQ09VTlQpOwotCi0gIHJlbC0+aG93dG8gPSBubG1fcG93ZXJwY19ob3d0b190YWJsZSArIChsX3J0eXBlICYgMHhmZik7Ci0KLSAgQkZEX0FTU0VSVCAocmVsLT5ob3d0by0+bmFtZSAhPSBOVUxMCi0JICAgICAgJiYgKChsX3J0eXBlICYgMHg4MDAwKSAhPSAwCi0JCSAgPyAocmVsLT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJICAgICA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCi0JCSAgOiAocmVsLT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJICAgICA9PSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCkpCi0JICAgICAgJiYgKChsX3J0eXBlID4+IDgpICYgMHgxZikgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZSAtIDEpOwotCi0gIGlmIChsX3JzZWNubSA9PSAwKQotICAgICpzZWNwID0gY29kZV9zZWM7Ci0gIGVsc2UgaWYgKGxfcnNlY25tID09IDEpCi0gICAgewotICAgICAgKnNlY3AgPSBkYXRhX3NlYzsKLSAgICAgIGxfdmFkZHIgLT0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZWwtPmFkZHJlc3MgPSBsX3ZhZGRyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogT0xERk9STUFUICovCi0KLS8qIE1hbmdsZSBQb3dlclBDIE5MTSByZWxvY3MgZm9yIG91dHB1dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19tYW5nbGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBQb3dlclBDIE5MTSBpbXBvcnQgcmVjb3JkICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19yZWFkX2ltcG9ydCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIHN0cnVjdCBubG1fcmVsZW50ICpubG1fcmVsb2NzOwkvKiByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHN5bWJvbCAqLwotICBiZmRfc2l6ZV90eXBlIHJjb3VudDsJCQkvKiBudW1iZXIgb2YgcmVsb2NzICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiB0ZW1wb3JhcnkgMzItYml0IHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIHN5bSAtPiBzeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkIChuYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpICE9IHN5bWxlbmd0aCkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKLSAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKLSAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOwotICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIHJjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0gIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKLSAgaWYgKG5sbV9yZWxvY3MgPT0gKHN0cnVjdCBubG1fcmVsZW50ICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gcmVsb2NzID0gbmxtX3JlbG9jczsKLSAgc3ltIC0+IHJjbnQgPSAwOwotICB3aGlsZSAoc3ltIC0+IHJjbnQgPCByY291bnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICAKLSAgICAgIGlmIChubG1fcG93ZXJwY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sICZzZWN0aW9uLAotCQkJCSAgJm5sbV9yZWxvY3MgLT4gcmVsb2MpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBubG1fcmVsb2NzIC0+IHNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgbmxtX3JlbG9jcysrOwotICAgICAgc3ltIC0+IHJjbnQrKzsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZuZGVmIE9MREZPUk1BVAotCi0vKiBXcml0ZSBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBhc3ltYm9sICpzeW07Ci0gIGJmZF92bWEgdmFsOwotICBiZmRfYnl0ZSB0ZW1wWzRdOwotCi0gIC8qIFBvd2VyUEMgTmV0V2FyZSBvbmx5IHN1cHBvcnRzIG9uZSBraW5kIG9mIHJlbG9jLiAgKi8KLSAgaWYgKHJlbC0+YWRkZW5kICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8gPT0gTlVMTAotICAgICAgfHwgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvLT5zaXplICE9IDIKLSAgICAgIHx8IHJlbC0+aG93dG8tPmJpdHNpemUgIT0gMzIKLSAgICAgIHx8IHJlbC0+aG93dG8tPmJpdHBvcyAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotICAgICAgfHwgKHJlbC0+aG93dG8tPnNyY19tYXNrICE9IDB4ZmZmZmZmZmYgJiYgcmVsLT5hZGRlbmQgIT0gMCkKLSAgICAgIHx8IHJlbC0+aG93dG8tPmRzdF9tYXNrICE9IDB4ZmZmZmZmZmYpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgLyogVGhlIHZhbHVlIHdlIHdyaXRlIG91dCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGFwcHJvcHJpYXRlCi0gICAgIHNlZ21lbnQsIHJpZ2h0c2hpZnRlZCBieSB0d28uICBUaGlzIG9mZnNldCBpcyB0aGUgc2VjdGlvbiB2bWEsCi0gICAgIGFkanVzdGVkIGJ5IHRoZSB2bWEgb2YgdGhlIGxvd2VzdCBzZWN0aW9uIGluIHRoYXQgc2VnbWVudCwgcGx1cwotICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7Ci0gIGlmICgodmFsICYgMykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHZhbCA+Pj0gMjsKLQotICAvKiBUaGUgaGlnaCBiaXQgaXMgMCBpZiB0aGUgcmVsb2MgaXMgaW4gdGhlIGRhdGEgc2VjdGlvbiwgb3IgMSBpZgotICAgICB0aGUgcmVsb2MgaXMgaW4gdGhlIGNvZGUgc2VjdGlvbi4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfREFUQSkKLSAgICB2YWwgLT0gbmxtX2dldF9kYXRhX2xvdyAoYWJmZCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0gICAgICB2YWwgfD0gTkxNX0hJQklUOwotICAgIH0KLSAgICAKLSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgcmVsb2NhdGlvbiBmaXh1cC4gIFRoZSBzZWNvbmQgbW9zdAotCSBzaWduaWZpY2FudCBiaXQgaXMgMCBpZiB0aGlzIGlzIGEgcmVsb2MgYWdhaW5zdCB0aGUgZGF0YQotCSBzZWdtZW50LCBvciAxIGlmIGl0IGlzIGEgcmVsb2MgYWdhaW5zdCB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkgJiBTRUNfQ09ERSkKLQl2YWwgfD0gTkxNX0hJQklUID4+IDE7Ci0gICAgfQotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZWxzZSAvKiBPTERGT1JNQVQgKi8KLQotLyogVGhpcyBpcyB1c2VkIGZvciB0aGUgcmVsb2MgaGFuZGxpbmcgaW4gdGhlIG9sZCBmb3JtYXQuICAqLwotCi0vKiBXcml0ZSBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCwgaW5keCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci0gICAgIGludCBpbmR4OwotewotICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9yZWxvYyBleHQ7Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjLCAqYnNzX3NlYzsKLSAgYXN5bWJvbCAqc3ltOwotICBhc2VjdGlvbiAqc3ltc2VjOwotICB1bnNpZ25lZCBsb25nIGxfc3ltbmR4OwotICBpbnQgbF9ydHlwZTsKLSAgaW50IGxfcnNlY25tOwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbnMgbm93LCBmb3IgY29udmVuaWVuY2UuICAqLwotICBjb2RlX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQotICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLSAgc3ltc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW0pOwotICBpZiAoaW5keCAhPSAtMSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bXNlYykpOwotICAgICAgbF9zeW1uZHggPSBpbmR4ICsgMzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3ltc2VjID09IGNvZGVfc2VjKQotCWxfc3ltbmR4ID0gMDsKLSAgICAgIGVsc2UgaWYgKHN5bXNlYyA9PSBkYXRhX3NlYykKLQlsX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzeW1zZWMgPT0gYnNzX3NlYykKLQlsX3N5bW5keCA9IDI7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBsX3N5bW5keCwgZXh0Lmxfc3ltbmR4KTsKLQotICBmb3IgKGhvd3RvID0gbmxtX3Bvd2VycGNfaG93dG9fdGFibGU7Ci0gICAgICAgaG93dG8gPCBubG1fcG93ZXJwY19ob3d0b190YWJsZSArIEhPV1RPX0NPVU5UOwotICAgICAgIGhvd3RvKyspCi0gICAgewotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQKLQkgICYmIGhvd3RvLT5zaXplID09IHJlbC0+aG93dG8tPnNpemUKLQkgICYmIGhvd3RvLT5iaXRzaXplID09IHJlbC0+aG93dG8tPmJpdHNpemUKLQkgICYmIGhvd3RvLT5wY19yZWxhdGl2ZSA9PSByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSAgJiYgaG93dG8tPmJpdHBvcyA9PSByZWwtPmhvd3RvLT5iaXRwb3MKLQkgICYmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IHJlbC0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgICAgIHx8ICghIHJlbC0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCQkgICYmIHJlbC0+YWRkZW5kID09IDApKQotCSAgJiYgKGhvd3RvLT5zcmNfbWFzayA9PSByZWwtPmhvd3RvLT5zcmNfbWFzawotCSAgICAgIHx8IChyZWwtPmhvd3RvLT5zcmNfbWFzayA9PSAwCi0JCSAgJiYgcmVsLT5hZGRlbmQgPT0gMCkpCi0JICAmJiBob3d0by0+ZHN0X21hc2sgPT0gcmVsLT5ob3d0by0+ZHN0X21hc2sKLQkgICYmIGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCWJyZWFrOwotICAgIH0KLSAgaWYgKGhvd3RvID49IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlICsgSE9XVE9fQ09VTlQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGxfcnR5cGUgPSBob3d0by0+dHlwZTsKLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCi0gICAgbF9ydHlwZSB8PSAweDgwMDA7Ci0gIGxfcnR5cGUgfD0gKGhvd3RvLT5iaXRzaXplIC0gMSkgPDwgODsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCAoYmZkX3ZtYSkgbF9ydHlwZSwgZXh0LmxfcnR5cGUpOwotCi0gIGFkZHJlc3MgPSByZWwtPmFkZHJlc3M7Ci0KLSAgaWYgKHNlYyA9PSBjb2RlX3NlYykKLSAgICBsX3JzZWNubSA9IDA7Ci0gIGVsc2UgaWYgKHNlYyA9PSBkYXRhX3NlYykKLSAgICB7Ci0gICAgICBsX3JzZWNubSA9IDE7Ci0gICAgICBhZGRyZXNzICs9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCAoYmZkX3ZtYSkgbF9yc2Vjbm0sIGV4dC5sX3JzZWNubSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGFkZHJlc3MsIGV4dC5sX3ZhZGRyKTsKLQotICBpZiAoYmZkX3dyaXRlICgmZXh0LCBzaXplb2YgZXh0LCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSBpbXBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIHJldHVybiBubG1fcG93ZXJwY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwsIC0xKTsKLX0KLQotI2VuZGlmIC8qIE9MREZPUk1BVCAqLwotCi0vKiBXcml0ZSBhIFBvd2VyUEMgTkxNIGV4dGVybmFsIHN5bWJvbC4gIFRoaXMgcm91dGluZSBrZWVwcyBhIHN0YXRpYwotICAgY291bnQgb2YgdGhlIHN5bWJvbCBpbmRleC4gIEZJWE1FOiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotICAgbmVjZXNzYXJ5LCBhbmQgdGhlIGluZGV4IG5ldmVyIGdldHMgcmVzZXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfd3JpdGVfZXh0ZXJuYWwgKGFiZmQsIGNvdW50LCBzeW0sIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCByZWxvY19hbmRfc2VjICpyZWxvY3M7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBiZmRfYnl0ZSBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0jaWZkZWYgT0xERk9STUFUCi0gIHN0YXRpYyBpbnQgaW5keDsKLSNlbmRpZgotCi0gIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLSAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKSAhPSBzaXplb2YoYmZkX2J5dGUpKQotICAgICAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBjb3VudCwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZih0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotI2lmbmRlZiBPTERGT1JNQVQKLSAgICAgIGlmICghIG5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydCAoYWJmZCwgcmVsb2NzW2ldLnNlYywgcmVsb2NzW2ldLnJlbCkpCi0JcmV0dXJuIGZhbHNlOwotI2Vsc2UKLSAgICAgIGlmICghIG5sbV9wb3dlcnBjX3dyaXRlX3JlbG9jIChhYmZkLCByZWxvY3NbaV0uc2VjLAotCQkJCSAgICAgcmVsb2NzW2ldLnJlbCwgaW5keCkpCi0JcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgT0xERk9STUFUCi0gICsraW5keDsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotDAotI2lmbmRlZiBPTERGT1JNQVQKLQotLyogUG93ZXJQQyBOZXR3YXJlIHVzZXMgYSB3b3JkIG9mZnNldCwgbm90IGEgYnl0ZSBvZmZzZXQsIGZvciBwdWJsaWMKLSAgIHN5bWJvbHMuICAqLwotCi0vKiBTZXQgdGhlIHNlY3Rpb24gZm9yIGEgcHVibGljIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19zZXRfcHVibGljX3NlY3Rpb24gKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBpZiAoc3ltLT5zeW1ib2wudmFsdWUgJiBOTE1fSElCSVQpCi0gICAgewotICAgICAgc3ltLT5zeW1ib2wudmFsdWUgJj0gfk5MTV9ISUJJVDsKLSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gICAgfQotCi0gIHN5bS0+c3ltYm9sLnZhbHVlIDw8PSAyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIG9mZnNldCB0byB3cml0ZSBvdXQgZm9yIGEgcHVibGljIHN5bWJvbC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1ubG1fcG93ZXJwY19nZXRfcHVibGljX29mZnNldCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgb2Zmc2V0ID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKLSAgaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLSAgICB7Ci0gICAgICBvZmZzZXQgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0gICAgICBvZmZzZXQgfD0gTkxNX0hJQklUOwotICAgIH0KLSAgZWxzZSBpZiAoc2VjLT5mbGFncyAmIChTRUNfREFUQSB8IFNFQ19BTExPQykpCi0gICAgewotICAgICAgLyogU0VDX0FMTE9DIGlzIGZvciB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLSAgICAgIG9mZnNldCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBjYW4ndCBoYW5kbGUgYW4gZXhwb3J0ZWQgc3ltYm9sIHRoYXQgaXMgbm90IGluIHRoZSBjb2RlIG9yCi0JIGRhdGEgc2VnbWVudC4gICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQ7Ci19Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKE9MREZPUk1BVCkgKi8KLQwKLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9wb3dlcnBjX2JhY2tlbmQgPQotewotICAiTmV0V2FyZSBQb3dlclBDIE1vZHVsZSBcMDMyIiwKLSAgc2l6ZW9mIChObG0zMl9wb3dlcnBjX0V4dGVybmFsX0ZpeGVkX0hlYWRlciksCi0jaWZuZGVmIE9MREZPUk1BVAotICAwLAkvKiBvcHRpb25hbF9wcmVmaXhfc2l6ZSAqLwotI2Vsc2UKLSAgc2l6ZW9mIChzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyKSwKLSNlbmRpZgotICBiZmRfYXJjaF9wb3dlcnBjLAotICAwLAotICBmYWxzZSwKLSNpZm5kZWYgT0xERk9STUFUCi0gIDAsCS8qIGJhY2tlbmRfb2JqZWN0X3AgKi8KLSAgMCwJLyogd3JpdGVfcHJlZml4ICovCi0jZWxzZQotICBubG1fcG93ZXJwY19iYWNrZW5kX29iamVjdF9wLAotICBubG1fcG93ZXJwY193cml0ZV9wcmVmaXgsCi0jZW5kaWYKLSAgbmxtX3Bvd2VycGNfcmVhZF9yZWxvYywKLSAgbmxtX3Bvd2VycGNfbWFuZ2xlX3JlbG9jcywKLSAgbmxtX3Bvd2VycGNfcmVhZF9pbXBvcnQsCi0gIG5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydCwKLSNpZm5kZWYgT0xERk9STUFUCi0gIG5sbV9wb3dlcnBjX3NldF9wdWJsaWNfc2VjdGlvbiwKLSAgbmxtX3Bvd2VycGNfZ2V0X3B1YmxpY19vZmZzZXQsCi0jZWxzZQotICAwLAkvKiBzZXRfcHVibGljX3NlY3Rpb24gKi8KLSAgMCwJLyogZ2V0X3B1YmxpY19vZmZzZXQgKi8KLSNlbmRpZgotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCi0gIG5sbV9wb3dlcnBjX3dyaXRlX2V4dGVybmFsLAotICAwLAkvKiB3cml0ZV9leHBvcnQgKi8KLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJIm5sbTMyLXBvd2VycGMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJbmxtTkFNRShwb3dlcnBjX3ZlYykKLSNkZWZpbmUgVEFSR0VUX0JBQ0tFTkRfREFUQQkJJm5sbTMyX3Bvd2VycGNfYmFja2VuZAotCi0jaW5jbHVkZSAibmxtLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTMyLXNwYXJjLmMgYi9iZmQvbmxtMzItc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0ZDgwYS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzItc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0vKiBTdXBwb3J0IGZvciAzMi1iaXQgU1BBUkMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkKLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNpbmNsdWRlICJubG0vc3BhcmMzMi1leHQuaCIKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9zcGFyY19FeHRlcm5hbF9GaXhlZF9IZWFkZXIKLQotI2luY2x1ZGUgImxpYm5sbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfcmVhZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3dyaXRlX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY19tYW5nbGVfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY19yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3dyaXRlX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIFJfU1BBUkNfTk9ORSA9IDAsCi0gICAgUl9TUEFSQ184LAkJUl9TUEFSQ18xNiwJCVJfU1BBUkNfMzIsIAotICAgIFJfU1BBUkNfRElTUDgsCVJfU1BBUkNfRElTUDE2LAkJUl9TUEFSQ19ESVNQMzIsIAotICAgIFJfU1BBUkNfV0RJU1AzMCwJUl9TUEFSQ19XRElTUDIyLAotICAgIFJfU1BBUkNfSEkyMiwJUl9TUEFSQ18yMiwKLSAgICBSX1NQQVJDXzEzLAkJUl9TUEFSQ19MTzEwLAotICAgIFJfU1BBUkNfR09UMTAsCVJfU1BBUkNfR09UMTMsCQlSX1NQQVJDX0dPVDIyLAotICAgIFJfU1BBUkNfUEMxMCwJUl9TUEFSQ19QQzIyLAotICAgIFJfU1BBUkNfV1BMVDMwLAotICAgIFJfU1BBUkNfQ09QWSwKLSAgICBSX1NQQVJDX0dMT0JfREFULAlSX1NQQVJDX0pNUF9TTE9ULAotICAgIFJfU1BBUkNfUkVMQVRJVkUsCi0gICAgUl9TUEFSQ19VQTMyLAotICAgIFJfU1BBUkNfbWF4Ci0gIH07Ci0KLSNpZiAwCi1zdGF0aWMgQ09OU1QgY2hhciAqQ09OU1QgcmVsb2NfdHlwZV9uYW1lc1tdID0KLXsKLSAgIlJfU1BBUkNfTk9ORSIsCi0gICJSX1NQQVJDXzgiLAkJIlJfU1BBUkNfMTYiLAkJIlJfU1BBUkNfMzIiLAotICAiUl9TUEFSQ19ESVNQOCIsCSJSX1NQQVJDX0RJU1AxNiIsCSJSX1NQQVJDX0RJU1AzMiIsCi0gICJSX1NQQVJDX1dESVNQMzAiLAkiUl9TUEFSQ19XRElTUDIyIiwKLSAgIlJfU1BBUkNfSEkyMiIsCSJSX1NQQVJDXzIyIiwKLSAgIlJfU1BBUkNfMTMiLAkJIlJfU1BBUkNfTE8xMCIsCi0gICJSX1NQQVJDX0dPVDEwIiwJIlJfU1BBUkNfR09UMTMiLAkiUl9TUEFSQ19HT1QyMiIsCi0gICJSX1NQQVJDX1BDMTAiLAkiUl9TUEFSQ19QQzIyIiwKLSAgIlJfU1BBUkNfV1BMVDMwIiwKLSAgIlJfU1BBUkNfQ09QWSIsCi0gICJSX1NQQVJDX0dMT0JfREFUIiwJIlJfU1BBUkNfSk1QX1NMT1QiLAotICAiUl9TUEFSQ19SRUxBVElWRSIsCi0gICJSX1NQQVJDX1VBMzIiLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG0zMl9zcGFyY19ob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzgsICAgICAgIDAsMCwgOCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfOCIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xNiwgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMzIsICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18zMiIsICAgICAgZmFsc2UsMCwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1A4LCAgIDAsMCwgOCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfRElTUDgiLCAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMTYsICAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX0RJU1AxNiIsICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDMyLCAgMCwyLDMyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19ESVNQMzIiLCAgZmFsc2UsMCwweDAwZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMzAsIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfV0RJU1AzMCIsIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDIyLCAyLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX1dESVNQMjIiLCBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEkyMiwgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19ISTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzIyLCAgICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMjIiLCAgICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMywgICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzEzIiwgICAgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE8xMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19MTzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEwLCAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfR09UMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMywgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX0dPVDEzIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMjIsICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19HT1QyMiIsICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfUEMxMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzIyLCAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX1BDMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV1BMVDMwLCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19XUExUMzAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0NPUFksICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfQ09QWSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HTE9CX0RBVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0dMT0JfREFUIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSk1QX1NMT1QsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19KTVBfU0xPVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFTEFUSVZFLDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfUkVMQVRJVkUiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTMyLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX1VBMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi19OwotCi0vKiBSZWFkIGEgTmV0V2FyZSBzcGFyYyByZWxvYy4gICovCi0KLXN0cnVjdCBubG0zMl9zcGFyY19yZWxvY19leHQgewotICB1bnNpZ25lZCBjaGFyIG9mZnNldFs0XTsKLSAgdW5zaWduZWQgY2hhciBhZGRlbmRbNF07Ci0gIHVuc2lnbmVkIGNoYXIgdHlwZVsxXTsKLSAgdW5zaWduZWQgY2hhciBwYWQxWzNdOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfdm1hIHZhbCwgYWRkZW5kOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCB0eXBlOwotICBzdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHRtcF9yZWxvYzsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmdG1wX3JlbG9jLCAxMiwgMSwgYWJmZCkgIT0gMTIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQotICAqc2VjcCA9IGNvZGVfc2VjOwotCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRtcF9yZWxvYy5vZmZzZXQpOwotICBhZGRlbmQgPSBiZmRfZ2V0XzMyIChhYmZkLCB0bXBfcmVsb2MuYWRkZW5kKTsKLSAgdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgdG1wX3JlbG9jLnR5cGUpOwotCi0gIHJlbC0+YWRkcmVzcyA9IHZhbDsKLSAgcmVsLT5hZGRlbmQgPSBhZGRlbmQ7Ci0gIHJlbC0+aG93dG8gPSBOVUxMOwotCi0gIGZvciAoaW5kZXggPSAwOwotICAgICAgIGluZGV4IDwgc2l6ZW9mKG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlKSAvIHNpemVvZihyZWxvY19ob3d0b190eXBlKTsKLSAgICAgICBpbmRleCsrKQotICAgIGlmIChubG0zMl9zcGFyY19ob3d0b190YWJsZVtpbmRleF0udHlwZSA9PSB0eXBlKSB7Ci0gICAgICByZWwtPmhvd3RvID0gJm5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW2luZGV4XTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgYWRkcmVzcyA9ICUwOGx4LCBhZGRlbmQgPSAlMDhseCwgdHlwZSA9ICVkLCBob3d0byA9ICUwOGx4XG4iLAotCSAgIF9fRlVOQ1RJT05fXywgcmVsLT5hZGRyZXNzLCByZWwtPmFkZGVuZCwgdHlwZSwgcmVsLT5ob3d0byk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci0KLX0KLQotLyogV3JpdGUgYSBOZXRXYXJlIHNwYXJjIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfdm1hIHZhbDsKLSAgc3RydWN0IG5sbTMyX3NwYXJjX3JlbG9jX2V4dCB0bXBfcmVsb2M7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgaW50IHR5cGUgPSAtMTsKLSAgcmVsb2NfaG93dG9fdHlwZSAqdG1wOwotCi0gIAotICBmb3IgKGluZGV4ID0gMDsKLSAgICAgICBpbmRleCA8IHNpemVvZiAobmxtMzJfc3BhcmNfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHJlbG9jX2hvd3RvX3R5cGUpOwotICAgICAgIGluZGV4KyspIHsKLSAgICB0bXAgPSAmbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbaW5kZXhdOwotCi0gICAgaWYgKHRtcC0+cmlnaHRzaGlmdCA9PSByZWwtPmhvd3RvLT5yaWdodHNoaWZ0Ci0JJiYgdG1wLT5zaXplID09IHJlbC0+aG93dG8tPnNpemUKLQkmJiB0bXAtPmJpdHNpemUgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZQotCSYmIHRtcC0+cGNfcmVsYXRpdmUgPT0gcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkmJiB0bXAtPmJpdHBvcyA9PSByZWwtPmhvd3RvLT5iaXRwb3MKLQkmJiB0bXAtPnNyY19tYXNrID09IHJlbC0+aG93dG8tPnNyY19tYXNrCi0JJiYgdG1wLT5kc3RfbWFzayA9PSByZWwtPmhvd3RvLT5kc3RfbWFzaykgewotICAgICAgdHlwZSA9IHRtcC0+dHlwZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAodHlwZSA9PSAtMSkKLSAgICBhYm9ydCgpOwotCi0gIC8qCi0gICAqIE5ldHdhcmUgd2FudHMgYSBsaXN0IG9mIHJlbG9jcyBmb3IgZWFjaCBhZGRyZXNzLgotICAgKiBGb3JtYXQgaXM6Ci0gICAqCWxvbmcJb2Zmc2V0Ci0gICAqCWxvbmcJYWRkZW5kCi0gICAqCWNoYXIJdHlwZQotICAgKiBUaGF0IHNob3VsZCBiZSBpdC4KLSAgICovCi0KLSAgLyogVGhlIHZhbHVlIHdlIHdyaXRlIG91dCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGFwcHJvcHJpYXRlCi0gICAgIHNlZ21lbnQuICBUaGlzIG9mZnNldCBpcyB0aGUgc2VjdGlvbiB2bWEsIGFkanVzdGVkIGJ5IHRoZSB2bWEgb2YKLSAgICAgdGhlIGxvd2VzdCBzZWN0aW9uIGluIHRoYXQgc2VnbWVudCwgcGx1cyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgcmVsb2NhdGlvbi4gICovCi0jaWYgMAotICB2YWwgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCAoKnJlbC0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKSArIHJlbC0+YWRkcmVzczsKLSNlbHNlCi0gIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7Ci0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgdmFsID0gJTA4bHgsIGFkZGVuZCA9ICUwOGx4LCB0eXBlID0gJWRcbiIsCi0JICAgX19GVU5DVElPTl9fLCB2YWwsIHJlbC0+YWRkZW5kLCByZWwtPmhvd3RvLT50eXBlKTsKLSNlbmRpZgotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHRtcF9yZWxvYy5vZmZzZXQpOwotICBiZmRfcHV0XzMyIChhYmZkLCByZWwtPmFkZGVuZCwgdG1wX3JlbG9jLmFkZGVuZCk7Ci0gIGJmZF9wdXRfOCAoYWJmZCwgKHNob3J0KShyZWwtPmhvd3RvLT50eXBlKSwgdG1wX3JlbG9jLnR5cGUpOwotCi0gIGlmIChiZmRfd3JpdGUgKCZ0bXBfcmVsb2MsIDEyLCAxLCBhYmZkKSAhPSAxMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hbmdsZSByZWxvY3MgZm9yIFNQQVJDIE5ldFdhcmUuICBXZSBjYW4ganVzdCB1c2UgdGhlIHN0YW5kYXJkCi0gICBTUEFSQyByZWxvY3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIE5ldFdhcmUgc3BhcmMgaW1wb3J0IHJlY29yZCAqLwotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY19yZWFkX2ltcG9ydCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIHN0cnVjdCBubG1fcmVsZW50ICpubG1fcmVsb2NzOwkvKiByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHN5bWJvbCAqLwotICBiZmRfc2l6ZV90eXBlIHJjb3VudDsJCQkvKiBudW1iZXIgb2YgcmVsb2NzICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiB0ZW1wb3JhcnkgMzItYml0IHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKm5hbWU7Ci0gIAotICAvKgotICAgKiBGaXJzdCwgcmVhZCBpbiB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb24KLSAgICogZW50cmllcyBmb3IgdGhpcyBzeW1ib2wKLSAgICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgNCwgMSwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICByY291bnQgPSBiZmRfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLSAgCi0gIC8qCi0gICAqIE5leHQsIHJlYWQgaW4gdGhlIGxlbmd0aCBvZiB0aGUgc3ltYm9sCi0gICAqLwotICAKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICAvKgotICAgKiBUaGVuIHJlYWQgaW4gdGhlIHN5bWJvbAotICAgKi8KLSAgCi0gIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOwotICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOwotICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKLSAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIAotICAvKgotICAgKiBOZXh0LCBzdGFydCByZWFkaW5nIGluIHRoZSByZWxvY3MuCi0gICAqLwotICAKLSAgbmxtX3JlbG9jcyA9ICgoc3RydWN0IG5sbV9yZWxlbnQgKikKLQkJYmZkX2FsbG9jIChhYmZkLCByY291bnQgKiBzaXplb2YgKHN0cnVjdCBubG1fcmVsZW50KSkpOwotICBpZiAoIW5sbV9yZWxvY3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gcmVsb2NzID0gbmxtX3JlbG9jczsKLSAgc3ltIC0+IHJjbnQgPSAwOwotICB3aGlsZSAoc3ltIC0+IHJjbnQgPCByY291bnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICAKLSAgICAgIGlmIChubG1fc3BhcmNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCAmc2VjdGlvbiwKLQkJCSAgICAgICZubG1fcmVsb2NzIC0+IHJlbG9jKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmxtX3JlbG9jcyAtPiBzZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5sbV9yZWxvY3MrKzsKLSAgICAgIHN5bSAtPiByY250Kys7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgY2hhciB0ZW1wWzRdOwotICBhc2VjdGlvbiAqY29kZSwgKmRhdGEsICpic3MsICpzeW1zZWM7Ci0gIGJmZF92bWEgYmFzZTsKLQotICBjb2RlID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBic3MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgc3ltc2VjID0gKCpyZWwtPnN5bV9wdHJfcHRyKS0+c2VjdGlvbjsKLQotICBpZiAoc3ltc2VjID09IGNvZGUpIHsKLSAgICBiYXNlID0gMDsKLSAgfSBlbHNlIGlmIChzeW1zZWMgPT0gZGF0YSkgewotICAgIGJhc2UgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlKTsKLSAgfSBlbHNlIGlmIChzeW1zZWMgPT0gYnNzKSB7Ci0gICAgYmFzZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGUpICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgZGF0YSk7Ci0gIH0gZWxzZQotICAgIGJhc2UgPSAwOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICA8JXgsIDE+XG5cdCIsCi0JICAgX19GVU5DVElPTl9fLCBiYXNlICsgKCpyZWwtPnN5bV9wdHJfcHRyKS0+dmFsdWUpOwotI2VuZGlmCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGJhc2UgKyAoKnJlbC0+c3ltX3B0cl9wdHIpLT52YWx1ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpdGVtcCwgNCwgMSwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIDEsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKXRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobmxtX3NwYXJjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwgKGFiZmQsIGNvdW50LCBzeW0sIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCByZWxvY19hbmRfc2VjICpyZWxvY3M7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBiZmRfYnl0ZSBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLSAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKSAhPSBzaXplb2YoYmZkX2J5dGUpKQotICAgICAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmxtX3NwYXJjX3dyaXRlX3JlbG9jIChhYmZkLCByZWxvY3NbaV0uc2VjLAotCQkJCSByZWxvY3NbaV0ucmVsKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX2V4cG9ydCAoYWJmZCwgc3ltLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGJmZF9ieXRlIGxlbjsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiA8JXgsICVkLCAlcz5cbiIsCi0JICAgX19GVU5DVElPTl9fLCB2YWx1ZSwgc3RybGVuIChzeW0tPm5hbWUpLCBzeW0tPm5hbWUpOwotI2VuZGlmCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCB0ZW1wKTsKLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotCi0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIDQsIDEsIGFiZmQpICE9IDQKLSAgICAgIHx8IGJmZF93cml0ZSAoJmxlbiwgMSwgMSwgYWJmZCkgIT0gMQotICAgICAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI3VuZGVmIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbgotI3VuZGVmIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQKLQotI2luY2x1ZGUgIm5sbXN3YXAuaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX3NwYXJjX2JhY2tlbmQgPQotewotICAiTmV0V2FyZSBTUEFSQyBNb2R1bGUgICBcMDMyIiwKLSAgc2l6ZW9mIChObG0zMl9zcGFyY19FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotICAwLAkvKiBvcHRpb25hbF9wcmVmaXhfc2l6ZSAqLwotICBiZmRfYXJjaF9zcGFyYywKLSAgMCwKLSAgZmFsc2UsCi0gIDAsCS8qIGJhY2tlbmRfb2JqZWN0X3AgKi8KLSAgMCwJLyogd3JpdGVfcHJlZml4X2Z1bmMgKi8KLSAgbmxtX3NwYXJjX3JlYWRfcmVsb2MsCi0gIG5sbV9zcGFyY19tYW5nbGVfcmVsb2NzLAotICBubG1fc3BhcmNfcmVhZF9pbXBvcnQsCi0gIG5sbV9zcGFyY193cml0ZV9pbXBvcnQsCi0gIDAsCS8qIHNldF9wdWJsaWNfc2VjdGlvbiAqLwotICAwLAkvKiBnZXRfcHVibGljX29mZnNldCAqLwotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCi0gIG5sbV9zcGFyY193cml0ZV9leHRlcm5hbCwKLSAgbmxtX3NwYXJjX3dyaXRlX2V4cG9ydAotfTsKLQotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJubG0zMi1zcGFyYyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCW5sbU5BTUUoc3BhcmNfdmVjKQotI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfc3BhcmNfYmFja2VuZAotCi0jaW5jbHVkZSAibmxtLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTMyLmMgYi9iZmQvbmxtMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMGU0Zi4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIDMyLWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotI2luY2x1ZGUgIm5sbWNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG02NC5jIGIvYmZkL25sbTY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2Q5NmEuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLSNpbmNsdWRlICJubG1jb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtY29kZS5oIGIvYmZkL25sbWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxYTJmOC4uMDAwMDAwMAotLS0gYS9iZmQvbmxtY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1NiArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgdXNpbmcgRUxGIHN1cHBvcnQgYXMgdGhlCi0gICB0ZW1wbGF0ZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLS8qIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGRvIG5vdCB1c2UgdGhlIG5hbWVzIHRoZXkgYXBwZWFyIHRvIHVzZS4KLSAgIFRoaXMgZmlsZSBpcyBhY3R1YWxseSBjb21waWxlZCBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaCBzaXplCi0gICBvZiBOTE0gdGFyZ2V0IHdlIGFyZSB1c2luZy4gIEF0IGVhY2ggc2l6ZSB3ZSB1c2UgYSBkaWZmZXJlbnQgbmFtZSwKLSAgIGNvbnN0cnVjdGVkIGJ5IHRoZSBtYWNybyBubG1OQU1FLiAgRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiB3aGljaAotICAgaXMgbmFtZWQgbmxtX3N5bWJvbF90eXBlIGJlbG93IGlzIGFjdHVhbGx5IG5hbWVkIG5sbTMyX3N5bWJvbF90eXBlCi0gICBpbiB0aGUgZmluYWwgZXhlY3V0YWJsZS4gICovCi0KLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0ZpeGVkX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKQotI2RlZmluZSBObG1fRXh0ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikKLQotI2RlZmluZSBubG1fc3ltYm9sX3R5cGUJCQlubG1OQU1FKHN5bWJvbF90eXBlKQotI2RlZmluZSBubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAlubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiCQkJbmxtTkFNRShnZXRfc3ltdGFiKQotI2RlZmluZSBubG1fbWFrZV9lbXB0eV9zeW1ib2wJCW5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCi0jZGVmaW5lIG5sbV9wcmludF9zeW1ib2wJCW5sbU5BTUUocHJpbnRfc3ltYm9sKQotI2RlZmluZSBubG1fZ2V0X3N5bWJvbF9pbmZvCQlubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSNkZWZpbmUgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZAlubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYwkJbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0jZGVmaW5lIG5sbV9vYmplY3RfcAkJCW5sbU5BTUUob2JqZWN0X3ApCi0jZGVmaW5lIG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cwlubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2RlZmluZSBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzCW5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbihhYmZkLHNyYyxkc3QpIFwKLSAgKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jKGFiZmQpKShhYmZkLHNyYyxkc3QpCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQoYWJmZCxzcmMsZHN0KSBcCi0gIChubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0X2Z1bmMoYWJmZCkpKGFiZmQsc3JjLGRzdCkKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RhdGljIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgYm9vbGVhbiBhZGRfYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGZpbmRfbm9uemVybwotICBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3N5bWJvbF90YWJsZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZQotICBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotCi0vKiBTaG91bGQgcGVyaGFwcyB1c2UgcHV0X29mZnNldCwgcHV0X3dvcmQsIGV0Yy4gIEZvciBub3csIHRoZSB0d28gdmVyc2lvbnMKLSAgIGNhbiBiZSBoYW5kbGVkIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZyAzMiBiaXRzIG9yICJ0aGUgbG9uZyB0eXBlIi4gICovCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF82NAotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfNjQKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfMzIKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLQotY29uc3QgYmZkX3RhcmdldCAqCi1ubG1fb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IG5sbV90ZGF0YSAoYWJmZCk7Ci0gIGJvb2xlYW4gKCpiYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotICBQVFIgeF9meGRoZHIgPSBOVUxMOwotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7Ci0gIHN0cnVjdCBubG1fb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOwotICBjb25zdCBjaGFyICpzaWduYXR1cmU7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qIFNvbWUgTkxNIGZvcm1hdHMgaGF2ZSBhIHByZWZpeCBiZWZvcmUgdGhlIHN0YW5kYXJkIE5MTSBmaXhlZAotICAgICBoZWFkZXIuICAqLwotICBiYWNrZW5kX29iamVjdF9wID0gbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYyAoYWJmZCk7Ci0gIGlmIChiYWNrZW5kX29iamVjdF9wKQotICAgIHsKLSAgICAgIGlmICghKCpiYWNrZW5kX29iamVjdF9wKSAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgIH0KLQotICAvKiBSZWFkIGluIHRoZSBmaXhlZCBsZW5ndGggcG9ydGlvbiBvZiB0aGUgTkxNIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICAqLwotCi0gIHhfZnhkaGRyID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSk7Ci0gIGlmICh4X2Z4ZGhkciA9PSBOVUxMKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgeF9meGRoZHIsIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCksIDEsIGFiZmQpICE9Ci0gICAgICBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBlbHNlCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBubG1fb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bwotICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KLQotICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBubG1fb2JqX3RkYXRhICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5sbV9vYmpfdGRhdGEpKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBubG1fdGRhdGEgKGFiZmQpID0gbmV3X3RkYXRhOwotCi0gIGlfZnhkaGRycCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpOwotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4gKGFiZmQsIHhfZnhkaGRyLCBpX2Z4ZGhkcnApOwotICBmcmVlICh4X2Z4ZGhkcik7Ci0gIHhfZnhkaGRyID0gTlVMTDsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbiBOTE0gZmlsZSBmb3IgdGhpcyBiYWNrZW5kIGJ5IG1hdGNoaW5nCi0gICAgIHRoZSBOTE0gc2lnbmF0dXJlLiAqLwotCi0gIHNpZ25hdHVyZSA9IG5sbV9zaWduYXR1cmUgKGFiZmQpOwotICBpZiAoc2lnbmF0dXJlICE9IE5VTEwKLSAgICAgICYmICpzaWduYXR1cmUgIT0gJ1wwJwotICAgICAgJiYgc3RybmNtcCAoKGNoYXIgKikgaV9meGRoZHJwLT5zaWduYXR1cmUsIHNpZ25hdHVyZSwKLQkJICBOTE1fU0lHTkFUVVJFX1NJWkUpICE9IDApCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIFRoZXJlJ3Mgbm8gc3VwcG9ydGVkIHdheSB0byBkaXNjb3ZlciB0aGUgZW5kaWFuZXNzIG9mIGFuIE5MTSwgc28gdGVzdCBmb3IKLSAgICAgYSBzYW5lIHZlcnNpb24gbnVtYmVyIGFmdGVyIGRvaW5nIGJ5dGUgc3dhcHBpbmcgYXBwcm9wcmlhdGUgZm9yIHRoaXMKLSAgICAgWFZFQy4gIChIYWNrIGFsZXJ0ISkgKi8KLQotICBpZiAoaV9meGRoZHJwLT52ZXJzaW9uID4gMHhGRkZGKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBUaGVyZSdzIG5vIHN1cHBvcnRlZCB3YXkgdG8gY2hlY2sgZm9yIDMyIGJpdCB2ZXJzdXMgNjQgYml0IGFkZHJlc3NlcywKLSAgICAgc28gaWdub3JlIHRoaXMgZGlzdGluY3Rpb24gZm9yIG5vdy4gIChGSVhNRSkgKi8KLQotICAvKiBTd2FwIGluIHRoZSByZXN0IG9mIHRoZSByZXF1aXJlZCBoZWFkZXIuICAqLwotICBpZiAoIW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9pbiAoYWJmZCkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGVsc2UKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogQWRkIHRoZSBzZWN0aW9ucyBzdXBwbGllZCBieSBhbGwgTkxNJ3MsIGFuZCB0aGVuIHJlYWQgaW4gdGhlCi0gICAgIGF1eGlsaWFyeSBoZWFkZXJzLiAgUmVhZGluZyB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMgbWF5IGNyZWF0ZQotICAgICBhZGRpdGlvbmFsIHNlY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGUgY3lnbnVzX2V4dCBoZWFkZXIuCi0gICAgIEZyb20gdGhpcyBwb2ludCBvbiB3ZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFuIE5MTSwgYW5kIGRvIG5vdAotICAgICB0cmVhdCBlcnJvcnMgYXMgaW5kaWNhdGluZyB0aGUgd3JvbmcgZm9ybWF0LiAgKi8KLQotICBpZiAoIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0NPREVfTkFNRSwKLQkJCWlfZnhkaGRycC0+Y29kZUltYWdlT2Zmc2V0LAotCQkJaV9meGRoZHJwLT5jb2RlSW1hZ2VTaXplLAotCQkJKFNFQ19DT0RFIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgfCBTRUNfUkVMT0MpKQotICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSwKLQkJCSAgIGlfZnhkaGRycC0+ZGF0YUltYWdlT2Zmc2V0LAotCQkJICAgaV9meGRoZHJwLT5kYXRhSW1hZ2VTaXplLAotCQkJICAgKFNFQ19EQVRBIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgICAgfCBTRUNfUkVMT0MpKQotICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FLAotCQkJICAgKGZpbGVfcHRyKSAwLAotCQkJICAgaV9meGRoZHJwLT51bmluaXRpYWxpemVkRGF0YVNpemUsCi0JCQkgICBTRUNfQUxMT0MpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmICghbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlB1YmxpY3MgIT0gMAotICAgICAgfHwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIGFyY2ggPSBubG1fYXJjaGl0ZWN0dXJlIChhYmZkKTsKLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCAodW5zaWduZWQgbG9uZykgMCk7Ci0KLSAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVTdGFydE9mZnNldDsKLQotICByZXR1cm4gKGFiZmQtPnh2ZWMpOwotCi1nb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLWdvdF9ub19tYXRjaDoKLSAgbmxtX3RkYXRhIChhYmZkKSA9IHByZXNlcnZlZF90ZGF0YTsKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEpOwotICBpZiAoeF9meGRoZHIgIT0gTlVMTCkKLSAgICBmcmVlICh4X2Z4ZGhkcik7Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qIEFkZCBhIHNlY3Rpb24gdG8gdGhlIGJmZC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgbmFtZSwgb2Zmc2V0LCBzaXplLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICB9Ci0gIG5ld3NlY3QtPnZtYSA9IDA7CQkvKiBOTE0ncyBhcmUgcmVsb2NhdGFibGUuICovCi0gIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IHNpemU7Ci0gIG5ld3NlY3QtPmZpbGVwb3MgPSBvZmZzZXQ7Ci0gIG5ld3NlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IGJmZF9sb2cyICgwKTsJLyogRklYTUUgKi8KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogUmVhZCBhbmQgc3dhcCBpbiB0aGUgdmFyaWFibGUgbGVuZ3RoIGhlYWRlci4gIEFsbCB0aGUgZmllbGRzIG11c3QKLSAgIGV4aXN0IGluIHRoZSBOTE0sIGFuZCBtdXN0IGV4aXN0IGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWFkIGhlcmUuICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBSZWFkIHRoZSBkZXNjcmlwdGlvbiBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uVGV4dCwKLQkJbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHN0YWNrU2l6ZSBmaWVsZC4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zdGFja1NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRlbXApOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHJlc2VydmVkIGZpZWxkLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnJlc2VydmVkID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLQotICAvKiBSZWFkIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSwKLQkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBSZWFkIHRoZSBzY3JlZW4gbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgsCi0JCXNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAotCQkxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWUsCi0JCW5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogUmVhZCB0aGUgdGhyZWFkIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAotCQlubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEsCi0JCTEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBTd2FwIGFuZCB3cml0ZSBvdXQgdGhlIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIuICBBbGwgdGhlIGZpZWxkcyBtdXN0Ci0gICBleGlzdCBpbiB0aGUgTkxNLCBhbmQgbXVzdCBleGlzdCBpbiB0aGlzIG9yZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBXcml0ZSB0aGUgZGVzY3JpcHRpb24gbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25UZXh0LAotCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBDb252ZXJ0IGFuZCB3cml0ZSB0aGUgc3RhY2tTaXplIGZpZWxkLiAqLwotCi0gIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnN0YWNrU2l6ZSwKLQkgICAgKGJmZF9ieXRlICopIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIENvbnZlcnQgYW5kIHdyaXRlIHRoZSByZXNlcnZlZCBmaWVsZC4gKi8KLQotICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZCwKLQkgICAgKGJmZF9ieXRlICopIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFdyaXRlIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBXcml0ZSB0aGUgc2NyZWVuIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCwKLQkJIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZSwKLQkJIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFdyaXRlIHRoZSB0aHJlYWQgbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAotCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAotCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJlYWQgYW5kIHN3YXAgaW4gdGhlIGNvbnRlbnRzIG9mIGFsbCB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMuICBCZWNhdXNlIG9mCi0gICB0aGUgYnJhaW5kZWFkIGRlc2lnbiwgd2UgaGF2ZSB0byBkbyBzdHJjbXBzIG9uIHN0cmluZ3Mgb2YgaW5kZXRlcm1pbmF0ZQotICAgbGVuZ3RoIHRvIGZpZ3VyZSBvdXQgd2hhdCBlYWNoIGF1eGlsaWFyeSBoZWFkZXIgaXMuICBFdmVuIHdvcnNlLCB3ZSBoYXZlCi0gICBubyB3YXkgb2Yga25vd2luZyBob3cgbWFueSBhdXhpbGlhcnkgaGVhZGVycyB0aGVyZSBhcmUgb3Igd2hlcmUgdGhlIGVuZAotICAgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzIGFyZSwgZXhjZXB0IGJ5IGZpbmRpbmcgc29tZXRoaW5nIHRoYXQgZG9lc24ndAotICAgbG9vayBsaWtlIGEga25vd24gYXV4aWxpYXJ5IGhlYWRlci4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlyc3QgbmV3IHR5cGUKLSAgIG9mIGF1eGlsaWFyeSBoZWFkZXIgYWRkZWQgd2lsbCBicmVhayBhbGwgZXhpc3RpbmcgdG9vbHMgdGhhdCBkb24ndAotICAgcmVjb2duaXplIGl0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciB0ZW1wc3RyWzE2XTsKLSAgbG9uZyBwb3NpdGlvbjsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHBvc2l0aW9uID0gYmZkX3RlbGwgKGFiZmQpOwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wc3RyLCBzaXplb2YgKHRlbXBzdHIpLCAxLCBhYmZkKSAhPQotCSAgc2l6ZW9mICh0ZW1wc3RyKSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgcG9zaXRpb24sIFNFRUtfU0VUKSA9PSAtMSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiVmVSc0lvTiMiLCA4KSA9PSAwKQotCXsKLQkgIE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlciB0aGRyOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgbWVtY3B5IChubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tYWpvclZlcnNpb24pOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1pbm9yVmVyc2lvbik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXZpc2lvbik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnllYXIpOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubW9udGgpOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRheSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIk1lU3NBZ0VzIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7Ci0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JICBtZW1jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlEID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmxhbmd1YWdlSUQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VGaWxlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuaGVscEZpbGVPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuUlBDRGF0YUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZENvZGVMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREYXRhTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc09mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZENvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5TaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucHJvZHVjdElEKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQwKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQxKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQyKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQzKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ1KTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiQ29QeVJpR2hUPSIsIDEwKSA9PSAwKQotCXsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwKLQkJCXNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCksCi0JCQkxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCkpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIChubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCkKLQkJCQkgLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoKSwKLQkJCTEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgLyogVGhlIGNvcHlyaWdodCBtZXNzYWdlIGlzIGEgdmFyaWFibGUgbGVuZ3RoIHN0cmluZy4gKi8KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlLAotCQkgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKLQkJCTEsIGFiZmQpICE9Ci0JICAgICAgKChiZmRfc2l6ZV90eXBlKQotCSAgICAgICBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIkN1U3RIZUFkIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlciB0aGRyOwotCSAgYmZkX3NpemVfdHlwZSBoZHJMZW5ndGg7Ci0JICBmaWxlX3B0ciBkYXRhT2Zmc2V0OwotCSAgYmZkX3NpemVfdHlwZSBkYXRhTGVuZ3RoOwotCSAgY2hhciBkYXRhU3RhbXBbOF07Ci0JICBQVFIgaGRyOwotCi0JICAvKiBSZWFkIHRoZSBzdGFtcCAoIkN1U3RIZUFkIikuICAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLnN0YW1wLCAxLCBzaXplb2YgKHRoZHIuc3RhbXApLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkci5zdGFtcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGlzIGN1c3RvbSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLmxlbmd0aCwgMSwgc2l6ZW9mICh0aGRyLmxlbmd0aCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mICh0aGRyLmxlbmd0aCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGhkckxlbmd0aCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5sZW5ndGgpOwotCSAgLyogUmVhZCBmdXJ0aGVyIGZpZWxkcyBpZiB3ZSBoYXZlIHRoZW0uICAqLwotCSAgaWYgKGhkckxlbmd0aCA8IE5MTV9UQVJHRVRfTE9OR19TSVpFKQotCSAgICBkYXRhT2Zmc2V0ID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhT2Zmc2V0LCAxLAotCQkJICAgIHNpemVvZiAodGhkci5kYXRhT2Zmc2V0KSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKHRoZHIuZGF0YU9mZnNldCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkYXRhT2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFPZmZzZXQpOwotCSAgICB9Ci0JICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFKQotCSAgICBkYXRhTGVuZ3RoID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhTGVuZ3RoLCAxLAotCQkJICAgIHNpemVvZiAodGhkci5kYXRhTGVuZ3RoKSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKHRoZHIuZGF0YUxlbmd0aCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkYXRhTGVuZ3RoID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFMZW5ndGgpOwotCSAgICB9Ci0JICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKLQkgICAgbWVtc2V0IChkYXRhU3RhbXAsIDAsIHNpemVvZiAoZGF0YVN0YW1wKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGRhdGFTdGFtcCwgMSwgc2l6ZW9mIChkYXRhU3RhbXApLCBhYmZkKQotCQkgICE9IHNpemVvZiAoZGF0YVN0YW1wKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciwgaWYgYW55LiAgKi8KLQkgIGlmIChoZHJMZW5ndGggPD0gMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKLQkgICAgewotCSAgICAgIGhkciA9IE5VTEw7Ci0JICAgICAgaGRyTGVuZ3RoID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaGRyTGVuZ3RoIC09IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDg7Ci0JICAgICAgaGRyID0gYmZkX2FsbG9jIChhYmZkLCBoZHJMZW5ndGgpOwotCSAgICAgIGlmIChoZHIgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCBoZHJMZW5ndGgsIGFiZmQpICE9IGhkckxlbmd0aCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGhhdmUgZm91bmQgYSBDeWdudXMgaGVhZGVyLCBwcm9jZXNzIGl0LiAgT3RoZXJ3aXNlLAotCSAgICAganVzdCBzYXZlIHRoZSBhc3NvY2lhdGVkIGRhdGEgd2l0aG91dCB0cnlpbmcgdG8gaW50ZXJwcmV0Ci0JICAgICBpdC4gICovCi0JICBpZiAoc3RybmNtcCAoZGF0YVN0YW1wLCAiQ3lHblVzRXgiLCA4KSA9PSAwKQotCSAgICB7Ci0JICAgICAgZmlsZV9wdHIgcG9zOwotCSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLQkgICAgICBiZmRfYnl0ZSAqcCwgKnBlbmQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChoZHJMZW5ndGggPT0gMCAmJiBoZHIgPT0gTlVMTCk7Ci0KLQkgICAgICBwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBkYXRhT2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YUxlbmd0aCk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3JlYWQgKGNvbnRlbnRzLCAxLCBkYXRhTGVuZ3RoLCBhYmZkKSAhPSBkYXRhTGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBwb3MsIFNFRUtfU0VUKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBtZW1jcHkgKG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCksICJDeUduVXNFeCIsIDgpOwotCSAgICAgIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPm9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0JICAgICAgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoID0gZGF0YUxlbmd0aDsKLQotCSAgICAgIC8qIFRoaXMgZGF0YSB0aGlzIGhlYWRlciBwb2ludHMgdG8gcHJvdmlkZXMgYSBsaXN0IG9mCi0JCSB0aGUgc2VjdGlvbnMgd2hpY2ggd2VyZSBpbiB0aGUgb3JpZ2luYWwgb2JqZWN0IGZpbGUKLQkJIHdoaWNoIHdhcyBjb252ZXJ0ZWQgdG8gYmVjb21lIGFuIE5MTS4gIFdlIGxvY2F0ZQotCQkgdGhvc2Ugc2VjdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBCRkQuICBOb3RlIHRoYXQKLQkJIHRoaXMgaXMgbGlrZWx5IHRvIGNyZWF0ZSBhIHNlY29uZCAudGV4dCwgLmRhdGEgYW5kCi0JCSAuYnNzIHNlY3Rpb247IHJldHJpZXZpbmcgdGhlIHNlY3Rpb25zIGJ5IG5hbWUgd2lsbAotCQkgZ2V0IHRoZSBhY3R1YWwgTkxNIHNlY3Rpb25zLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQgdG8KLQkJIGhhcHBlbi4gIFRoZSBzZWN0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCB3aGljaAotCQkgbWF5IGJlIHN1YnNldHMgb2YgdGhlIE5MTSBzZWN0aW9uLCBjYW4gb25seSBiZSBmb3VuZAotCQkgdXNpbmcgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQkgICAgICBwID0gY29udGVudHM7Ci0JICAgICAgcGVuZCA9IHAgKyBkYXRhTGVuZ3RoOwotCSAgICAgIHdoaWxlIChwIDwgcGVuZCkKLQkJewotCQkgIGNoYXIgKm5hbWU7Ci0JCSAgc2l6ZV90IGw7Ci0JCSAgZmlsZV9wdHIgZmlsZXBvczsKLQkJICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JCSAgYXNlY3Rpb24gKm5ld3NlYzsKLQotCQkgIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcwotCQkgICAgIG51bGwgdGVybWluYXRlZCBzZWN0aW9uIG5hbWUKLQkJICAgICB6ZXJvZXMgdG8gYWRqdXN0IHRvIDQgYnl0ZSBib3VuZGFyeQotCQkgICAgIDQgYnl0ZSBzZWN0aW9uIGRhdGEgZmlsZSBwb2ludGVyCi0JCSAgICAgNCBieXRlIHNlY3Rpb24gc2l6ZQotCQkgICAgICovCi0KLQkJICBuYW1lID0gKGNoYXIgKikgcDsKLQkJICBsID0gc3RybGVuIChuYW1lKSArIDE7Ci0JCSAgbCA9IChsICsgMykgJn4gMzsKLQkJICBwICs9IGw7Ci0JCSAgZmlsZXBvcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcCk7Ci0JCSAgcCArPSA0OwotCQkgIHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCQkgIHAgKz0gNDsKLQotCQkgIG5ld3NlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLQkJICBpZiAobmV3c2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIG5ld3NlYy0+X3Jhd19zaXplID0gc2l6ZTsKLQkJICBpZiAoZmlsZXBvcyAhPSAwKQotCQkgICAgewotCQkgICAgICBuZXdzZWMtPmZpbGVwb3MgPSBmaWxlcG9zOwotCQkgICAgICBuZXdzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPnN0YW1wLCB0aGRyLnN0YW1wLAotCQkgICAgICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCA9IGhkckxlbmd0aDsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQgPSBkYXRhT2Zmc2V0OwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCA9IGRhdGFMZW5ndGg7Ci0JICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwgZGF0YVN0YW1wLAotCQkgICAgICBzaXplb2YgKGRhdGFTdGFtcCkpOwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyID0gaGRyOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGEgbm9uLXplcm8gYnl0ZSBpbiBhIG1lbW9yeSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1maW5kX25vbnplcm8gKGJ1Ziwgc2l6ZSkKLSAgICAgUFRSIGJ1ZjsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIGNoYXIgKnAgPSAoY2hhciAqKSBidWY7Ci0KLSAgd2hpbGUgKHNpemUtLSAhPSAwKQotICAgIGlmICgqcCsrICE9IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTd2FwIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzLiAgV2UgY3JlYXRlIHRob3NlCi0gICBhdXhpbGlhcnkgaGVhZGVycyB3aGljaCBoYXZlIGJlZW4gc2V0IG5vbi16ZXJvLiAgV2UgZG8gbm90IHJlcXVpcmUKLSAgIHRoZSBjYWxsZXIgdG8gc2V0IHVwIHRoZSBzdGFtcCBmaWVsZHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIFdyaXRlIG91dCB0aGUgdmVyc2lvbiBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIlZlUnNJb04jIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIubWFqb3JWZXJzaW9uKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgdGhkci5taW5vclZlcnNpb24pOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIucmV2aXNpb24pOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyLAotCQkoYmZkX2J5dGUgKikgdGhkci55ZWFyKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1vbnRoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5LAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBleHRlbmRlZCBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKSkKLSAgICB7Ci0gICAgICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlELAotCQkoYmZkX2J5dGUgKikgdGhkci5sYW5ndWFnZUlEKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50LAotCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFB1YmxpY3NDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnByb2R1Y3RJRCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMSk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMyk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gIC8qIFdyaXRlIG91dCB0aGUgY29weXJpZ2h0IGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ29QeVJpR2hUPSIsIDEwKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRoZHIuc3RhbXAsIHNpemVvZiAodGhkci5zdGFtcCksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKHRoZHIuc3RhbXApKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHRoZHIuY29weXJpZ2h0TWVzc2FnZUxlbmd0aFswXSA9Ci0JbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGhkci5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFRoZSBjb3B5cmlnaHQgbWVzc2FnZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuICovCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2UsCi0JCSAgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKLQkJICAgICAxLCBhYmZkKSAhPQotCSAgKChiZmRfc2l6ZV90eXBlKQotCSAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBjdXN0b20gaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLSAgICAgIGJvb2xlYW4gZHM7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGhkckxlbmd0aDsKLQotICAgICAgZHMgPSBmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YVN0YW1wLAotCQkJIHNpemVvZiAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXApKTsKLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIkN1U3RIZUFkIiwgOCk7Ci0gICAgICBoZHJMZW5ndGggPSAoMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgKGRzID8gOCA6IDApCi0JCSAgICsgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIGhkckxlbmd0aCwgdGhkci5sZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQsCi0JCXRoZHIuZGF0YU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCwKLQkJdGhkci5kYXRhTGVuZ3RoKTsKLSAgICAgIGlmICghIGRzKQotCXsKLQkgIEJGRF9BU1NFUlQgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoID09IDApOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIDEsCi0JCQkgc2l6ZW9mICh0aGRyKSAtIHNpemVvZiAodGhkci5kYXRhU3RhbXApLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkcikgLSBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKHRoZHIuZGF0YVN0YW1wLCBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGJmZF93cml0ZSAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHIsIDEsCi0JCQkgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgsIGFiZmQpCi0JICAgICAgIT0gbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgQ3lnbnVzIGRlYnVnZ2luZyBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ3VTdEhlQWQiLCA4KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCwKLQkJKGJmZF9ieXRlICopIHRoZHIubGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+b2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhTGVuZ3RoKTsKLSAgICAgIG1lbWNweSAodGhkci5kYXRhU3RhbXAsICJDeUduVXNFeCIsIDgpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgcmVhZCB0aGUgTkxNJ3MgcHVibGljIHN5bWJvbHMgYW5kIHVzZSBpdCB0byBnZW5lcmF0ZSBhIGJmZCBzeW1ib2wKLSAgIHRhYmxlIChoZXksIGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZykgb24gYSBvbmUtZm9yLW9uZSBiYXNpcy4gIFRodXMKLSAgIHVzZSB0aGUgbnVtYmVyIG9mIHB1YmxpYyBzeW1ib2xzIGFzIHRoZSBudW1iZXIgb2YgYmZkIHN5bWJvbHMgd2Ugd2lsbAotICAgaGF2ZSBvbmNlIHdlIGFjdHVhbGx5IGdldCBhcm91bmQgdG8gcmVhZGluZyB0aGVtIGluLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLCBiYXNlZCBvbgotICAgdGhlIGNvdW50IHBsdXMgMSwgc2luY2Ugd2Ugd2lsbCBOVUxMIHRlcm1pbmF0ZSB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZAotICAgb24gdGhpcyBzaXplLiAqLwotCi1sb25nCi1ubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7CS8qIE5sbSBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplID0gMDsKLQotICBpX2Z4ZGhkcnAgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKTsKLSAgc3ltY291bnQgPSAoaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3MKLQkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMKLQkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCArIDEpICogKHNpemVvZiAoYXN5bWJvbCkpOwotICByZXR1cm4gKHN5bXRhYl9zaXplKTsKLX0KLQotLyogTm90ZSB0aGF0IGJmZF9nZXRfc3ltY291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIGlmIHNsdXJwaW5nIHRoZQotICAgc3ltYm9sIHRhYmxlIGZhaWxzLiAqLwotCi1sb25nCi1ubG1fZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIG5sbV9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLSAgYmZkX3NpemVfdHlwZSBjb3VudGVyID0gMDsKLQotICBpZiAobmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIC0xOwotICBzeW1iYXNlID0gbmxtX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgd2hpbGUgKGNvdW50ZXIgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICAqYWxvY2F0aW9uKysgPSAmc3ltYmFzZS0+c3ltYm9sOwotICAgICAgc3ltYmFzZSsrOwotICAgICAgY291bnRlcisrOwotICAgIH0KLSAgKmFsb2NhdGlvbiA9IChhc3ltYm9sICopIE5VTEw7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogTWFrZSBhbiBOTE0gc3ltYm9sLiAgVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuICAqLwotCi1hc3ltYm9sICoKLW5sbV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBubG1fc3ltYm9sX3R5cGUgKm5ldzsKLQotICBuZXcgPSAobmxtX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAobmxtX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIEdldCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi12b2lkCi1ubG1fZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLyogUHJpbnQgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQotdm9pZAotbmxtX3ByaW50X3N5bWJvbCAoYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBpZiAoc3ltYm9sLT5uYW1lKQotCWZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJS01cyIsIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0gICAgICBpZiAoc3ltYm9sLT5uYW1lKQotCWZwcmludGYgKGZpbGUsICIgJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBTbHVycCBpbiBubG0gc3ltYm9sIHRhYmxlLgotCi0gICBJbiB0aGUgZXh0ZXJuYWwgKGluLWZpbGUpIGZvcm0sIE5MTSBleHBvcnQgcmVjb3JkcyBhcmUgdmFyaWFibGUgbGVuZ3RoLAotICAgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLQkxIGJ5dGUJCWxlbmd0aCBvZiB0aGUgc3ltYm9sIG5hbWUgKE4pCi0JTiBieXRlcwkJdGhlIHN5bWJvbCBuYW1lCi0JNCBieXRlcwkJdGhlIHN5bWJvbCBvZmZzZXQgZnJvbSBzdGFydCBvZiBpdCdzIHNlY3Rpb24KLQotICAgV2UgYWxzbyByZWFkIGluIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scyBhbmQgaW1wb3J0IHJlY29yZHMuICBJbXBvcnQKLSAgIHJlY29yZHMgYXJlIHRyZWF0ZWQgYXMgdW5kZWZpbmVkIHN5bWJvbHMuICBBcyB3ZSByZWFkIHRoZSBpbXBvcnQKLSAgIHJlY29yZHMgd2UgYWxzbyByZWFkIGluIHRoZSBhc3NvY2lhdGVkIHJlbG9jIGluZm9ybWF0aW9uLCB3aGljaCBpcwotICAgYXR0YWNoZWQgdG8gdGhlIHN5bWJvbC4KLQotICAgVGhlIGJmZCBzeW1ib2xzIGFyZSBjb3BpZWQgdG8gU1lNUFRSUy4KLQotICAgV2hlbiB3ZSByZXR1cm4sIHRoZSBiZmQgc3ltY291bnQgaXMgZWl0aGVyIHplcm8gb3IgY29udGFpbnMgdGhlIGNvcnJlY3QKLSAgIG51bWJlciBvZiBzeW1ib2xzLgotKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqaV9meGRoZHJwOwkvKiBObG0gZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgYmZkX3NpemVfdHlwZSB0b3RzeW1jb3VudDsJLyogTnVtYmVyIG9mIE5MTSBzeW1ib2xzICovCi0gIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7CS8qIENvdW50ZXIgb2YgTkxNIHN5bWJvbHMgKi8KLSAgbmxtX3N5bWJvbF90eXBlICpzeW07CQkvKiBQb2ludGVyIHRvIGN1cnJlbnQgYmZkIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJLyogU3ltYm9sIGxlbmd0aCByZWFkIGludG8gaGVyZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bXR5cGU7CS8qIFR5cGUgb2YgZGVidWdnaW5nIHN5bWJvbCAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogU3ltYm9sIG9mZnNldHMgcmVhZCBpbnRvIGhlcmUgKi8KLSAgYm9vbGVhbiAoKnJlYWRfaW1wb3J0X2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBubG1fc3ltYm9sX3R5cGUgKikpOwotICBib29sZWFuICgqc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBubG1fc3ltYm9sX3R5cGUgKikpOwotCi0gIGlmIChubG1fZ2V0X3N5bWJvbHMgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuICh0cnVlKTsKLQotICAvKiBSZWFkIGVhY2ggcmF3IE5MTSBzeW1ib2wsIHVzaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBjcmVhdGUgYSBjYW5vbmljYWwgYmZkCi0gICAgIHN5bWJvbCB0YWJsZSBlbnRyeS4KLQotICAgICBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgdGhlIGluaXRpYWwgYmZkIGNhbm9uaWNhbCBzeW1ib2wgYnVmZmVyIGJhc2VkIG9uIGEKLSAgICAgb25lLXRvLW9uZSBtYXBwaW5nIG9mIHRoZSBOTE0gc3ltYm9scyB0byBjYW5vbmljYWwgc3ltYm9scy4gIFdlIGFjdHVhbGx5Ci0gICAgIHVzZSBhbGwgdGhlIE5MTSBzeW1ib2xzLCBzbyB0aGVyZSB3aWxsIGJlIG5vIHNwYWNlIGxlZnQgb3ZlciBhdCB0aGUgZW5kLgotICAgICBXaGVuIHdlIGhhdmUgYWxsIHRoZSBzeW1ib2xzLCB3ZSBidWlsZCB0aGUgY2FsbGVyJ3MgcG9pbnRlciB2ZWN0b3IuICovCi0KLSAgYWJmZC0+c3ltY291bnQgPSAwOwotICBpX2Z4ZGhkcnAgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKTsKLSAgdG90c3ltY291bnQgPSAoaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3MKLQkJICsgaV9meGRoZHJwLT5udW1iZXJPZkRlYnVnUmVjb3JkcwotCQkgKyBpX2Z4ZGhkcnAtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzKTsKLSAgaWYgKHRvdHN5bWNvdW50ID09IDApCi0gICAgewotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX2Z4ZGhkcnAtPnB1YmxpY3NPZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICBzeW0gPSAoKG5sbV9zeW1ib2xfdHlwZSAqKQotCSBiZmRfemFsbG9jIChhYmZkLCB0b3RzeW1jb3VudCAqIHNpemVvZiAobmxtX3N5bWJvbF90eXBlKSkpOwotICBpZiAoIXN5bSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5sbV9zZXRfc3ltYm9scyAoYWJmZCwgc3ltKTsKLQotICAvKiBXZSB1c2UgdGhlIGJmZCdzIHN5bWNvdW50IGRpcmVjdGx5IGFzIHRoZSBjb250cm9sIGNvdW50LCBzbyB0aGF0IGVhcmx5Ci0gICAgIHRlcm1pbmF0aW9uIG9mIHRoZSBsb29wIGxlYXZlcyB0aGUgc3ltY291bnQgY29ycmVjdCBmb3IgdGhlIHN5bWJvbHMgdGhhdAotICAgICB3ZXJlIHJlYWQuICovCi0KLSAgc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMgPSBubG1fc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMgKGFiZmQpOwotICBzeW1jb3VudCA9IGlfZnhkaGRycC0+bnVtYmVyT2ZQdWJsaWNzOwotICB3aGlsZSAoYWJmZC0+c3ltY291bnQgPCBzeW1jb3VudCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICBzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgICAgIHN5bS0+c3ltYm9sLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotICAgICAgaWYgKCFzeW0tPnN5bWJvbC5uYW1lKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgc3ltLT5zeW1ib2wubmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKQotCSAgIT0gc3ltbGVuZ3RoKQotCXJldHVybiAoZmFsc2UpOwotICAgICAgLyogQ2FzdCBhd2F5IGNvbnN0LiAgKi8KLSAgICAgICgoY2hhciAqKSAoc3ltLT5zeW1ib2wubmFtZSkpW3N5bWxlbmd0aF0gPSAnXDAnOwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotCXJldHVybiAoZmFsc2UpOwotICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVDsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlID0gZ2V0X3dvcmQgKGFiZmQsIHRlbXApOwotICAgICAgaWYgKHNldF9wdWJsaWNfc2VjdGlvbl9mdW5jKQotCXsKLQkgIC8qIE1vc3QgYmFja2VuZHMgY2FuIHVzZSB0aGUgY29kZSBiZWxvdywgYnV0IHVuZm9ydHVuYXRlbHkKLQkgICAgIHNvbWUgdXNlIGEgZGlmZmVyZW50IHNjaGVtZS4gICovCi0JICBpZiAoKCpzZXRfcHVibGljX3NlY3Rpb25fZnVuYykgKGFiZmQsIHN5bSkgPT0gZmFsc2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHN5bS0+c3ltYm9sLnZhbHVlICYgTkxNX0hJQklUKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wudmFsdWUgJj0gfk5MTV9ISUJJVDsKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQkgICAgfQotCX0KLSAgICAgIHN5bS0+cmNudCA9IDA7Ci0gICAgICBhYmZkLT5zeW1jb3VudCsrOwotICAgICAgc3ltKys7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGRlYnVnZ2luZyByZWNvcmRzLiAgKi8KLQotICBpZiAoaV9meGRoZHJwLT5udW1iZXJPZkRlYnVnUmVjb3JkcyA+IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX2Z4ZGhkcnAtPmRlYnVnSW5mb09mZnNldCwgU0VFS19TRVQpID09IC0xKQotCXJldHVybiAoZmFsc2UpOwotCi0gICAgICBzeW1jb3VudCArPSBpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzOwotICAgICAgd2hpbGUgKGFiZmQtPnN5bWNvdW50IDwgc3ltY291bnQpCi0JewotCSAgaWYgKChiZmRfcmVhZCAoKFBUUikgJiBzeW10eXBlLCBzaXplb2YgKHN5bXR5cGUpLCAxLCBhYmZkKQotCSAgICAgICAhPSBzaXplb2YgKHN5bXR5cGUpKQotCSAgIHx8IGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApCi0JICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSAmIHN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotCQkgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCSAgc3ltLT5zeW1ib2wubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0JICBpZiAoIXN5bS0+c3ltYm9sLm5hbWUpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgc3ltLT5zeW1ib2wubmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKQotCSAgICAgICE9IHN5bWxlbmd0aCkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JICAvKiBDYXN0IGF3YXkgY29uc3QuICAqLwotCSAgKChjaGFyICopIChzeW0tPnN5bWJvbC5uYW1lKSlbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0JICBzeW0tPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlID0gZ2V0X3dvcmQgKGFiZmQsIHRlbXApOwotCSAgaWYgKHN5bXR5cGUgPT0gMCkKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN5bXR5cGUgPT0gMSkKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQkJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgfQotCSAgc3ltLT5yY250ID0gMDsKLQkgIGFiZmQtPnN5bWNvdW50Kys7Ci0JICBzeW0rKzsKLQl9Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIGltcG9ydCByZWNvcmRzLiAgV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB3ZSBrbm93IGhvdwotICAgICB0byByZWFkIHJlbG9jcyBmb3IgdGhpcyB0YXJnZXQuICAqLwotCi0gIHJlYWRfaW1wb3J0X2Z1bmMgPSBubG1fcmVhZF9pbXBvcnRfZnVuYyAoYWJmZCk7Ci0gIGlmIChyZWFkX2ltcG9ydF9mdW5jICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX2Z4ZGhkcnAtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCwgU0VFS19TRVQpCi0JICA9PSAtMSkKLQlyZXR1cm4gKGZhbHNlKTsKLQotICAgICAgc3ltY291bnQgKz0gaV9meGRoZHJwLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlczsKLSAgICAgIHdoaWxlIChhYmZkLT5zeW1jb3VudCA8IHN5bWNvdW50KQotCXsKLQkgIGlmICgoKnJlYWRfaW1wb3J0X2Z1bmMpIChhYmZkLCBzeW0pID09IGZhbHNlKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzeW0rKzsKLQkgIGFiZmQtPnN5bWNvdW50Kys7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKHRydWUpOwotfQotDAotLyogR2V0IHRoZSByZWxvY3MgZm9yIGFuIE5MTSBmaWxlLiAgVGhlcmUgYXJlIHR3byB0eXBlcyBvZiByZWxvY3MuCi0gICBJbXBvcnRzIGFyZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gb3RoZXIgTkxNIGZpbGVzLiAgV2UKLSAgIHRyZWF0IHRoZXNlIGFzIHJlbG9jcyBhZ2FpbnN0IGdsb2JhbCBzeW1ib2xzLiAgUmVsb2NhdGlvbiBmaXh1cHMKLSAgIGFyZSBpbnRlcm5hbCByZWxvY3MuCi0KLSAgIFRoZSBhY3R1YWwgZm9ybWF0IHVzZWQgdG8gc3RvcmUgdGhlIHJlbG9jcyBpcyBtYWNoaW5lIHNwZWNpZmljLiAgKi8KLQotLyogUmVhZCBpbiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgc3RvcmVkIGluCi0gICBubG1fcmVsb2NhdGlvbl9maXh1cHMsIGFuIGFycmF5IG9mIGFyZWxlbnQgc3RydWN0dXJlcywgYW5kCi0gICBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzLCBhbiBhcnJheSBvZiBzZWN0aW9uIHBvaW50ZXJzLiAgVGhlCi0gICBzZWN0aW9uIHBvaW50ZXJzIGFyZSBuZWVkZWQgYmVjYXVzZSB0aGUgcmVsb2NzIGFyZSBub3Qgc29ydGVkIGJ5Ci0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zbHVycF9yZWxvY19maXh1cHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYm9vbGVhbiAoKnJlYWRfZnVuYykgUEFSQU1TICgoYmZkICosIG5sbV9zeW1ib2xfdHlwZSAqLCBhc2VjdGlvbiAqKiwKLQkJCQlhcmVsZW50ICopKTsKLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgYXJlbGVudCAqcmVsczsKLSAgYXNlY3Rpb24gKipzZWNzOwotCi0gIGlmIChubG1fcmVsb2NhdGlvbl9maXh1cHMgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIHJlYWRfZnVuYyA9IG5sbV9yZWFkX3JlbG9jX2Z1bmMgKGFiZmQpOwotICBpZiAocmVhZF9mdW5jID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY291bnQgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOwotICByZWxzID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotICBzZWNzID0gKGFzZWN0aW9uICoqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGlmICgocmVscyA9PSBOVUxMIHx8IHNlY3MgPT0gTlVMTCkgJiYgY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCkgPSByZWxzOwotICBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzIChhYmZkKSA9IHNlY3M7Ci0KLSAgLyogV2UgaGF2ZSB0byByZWFkIHBpZWNlIGJ5IHBpZWNlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IGxhcmdlCi0gICAgIHRoZSBtYWNoaW5lIHNwZWNpZmljIHJlbG9jIGluZm9ybWF0aW9uIGlzLiAgKi8KLSAgd2hpbGUgKGNvdW50LS0gIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKCpyZWFkX2Z1bmMpIChhYmZkLCAobmxtX3N5bWJvbF90eXBlICopIE5VTEwsIHNlY3MsIHJlbHMpID09IGZhbHNlKQotCXsKLQkgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCkgPSBOVUxMOwotCSAgbmxtX3JlbG9jYXRpb25fZml4dXBfc2VjcyAoYWJmZCkgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrc2VjczsKLSAgICAgICsrcmVsczsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgbnVtYmVyIG9mIHJlbG9jcy4gIFRoaXMgcmVhbGx5IGp1c3QgcmV0dXJucyBhbiB1cHBlciBib3VuZCwKLSAgIHNpbmNlIGl0IGRvZXMgbm90IGF0dGVtcHQgdG8gZGlzdGluZ3Vpc2ggdGhlbSBiYXNlZCBvbiB0aGUgc2VjdGlvbi4KLSAgIFRoYXQgd2lsbCBiZSBoYW5kbGVkIHdoZW4gdGhleSBhcmUgYWN0dWFsbHkgcmVhZC4gICovCi0KLWxvbmcKLW5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBubG1fc3ltYm9sX3R5cGUgKnN5bXM7Ci0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gIHVuc2lnbmVkIGludCByZXQ7Ci0KLSAgLyogSWYgd2UgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCByZWxvY3MsIGp1c3QgcmV0dXJuIDAuICAqLwotICBpZiAobmxtX3JlYWRfcmVsb2NfZnVuYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVpdGhlciB0aGUgY29kZSBvciB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiAoU0VDX0NPREUgfCBTRUNfREFUQSkpID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgc3ltcyA9IG5sbV9nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIGlmIChzeW1zID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKG5sbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotCXJldHVybiAtMTsKLSAgICAgIHN5bXMgPSBubG1fZ2V0X3N5bWJvbHMgKGFiZmQpOwotICAgIH0KLQotICByZXQgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOwotCi0gIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHdoaWxlIChjb3VudC0tICE9IDApCi0gICAgewotICAgICAgcmV0ICs9IHN5bXMtPnJjbnQ7Ci0gICAgICArK3N5bXM7Ci0gICAgfQotCi0gIHJldHVybiAocmV0ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIEdldCB0aGUgcmVsb2NzIHRoZW1zZWx2ZXMuICAqLwotCi1sb25nCi1ubG1fY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqcmVsczsKLSAgYXNlY3Rpb24gKipzZWNzOwotICBiZmRfc2l6ZV90eXBlIGNvdW50LCBpOwotICB1bnNpZ25lZCBpbnQgcmV0OwotCi0gIC8qIEdldCB0aGUgcmVsb2NhdGlvbiBmaXh1cHMuICAqLwotICByZWxzID0gbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKTsKLSAgaWYgKHJlbHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobmxtX3NsdXJwX3JlbG9jX2ZpeHVwcyAoYWJmZCkgPT0gZmFsc2UpCi0JcmV0dXJuIC0xOwotICAgICAgcmVscyA9IG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCk7Ci0gICAgfQotICBzZWNzID0gbmxtX3JlbG9jYXRpb25fZml4dXBfc2VjcyAoYWJmZCk7Ci0KLSAgcmV0ID0gMDsKLSAgY291bnQgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcmVscysrLCBzZWNzKyspCi0gICAgewotICAgICAgaWYgKCpzZWNzID09IHNlYykKLQl7Ci0JICAqcmVscHRyKysgPSByZWxzOwotCSAgKytyZXQ7Ci0JfQotICAgIH0KLQotICAvKiBHZXQgdGhlIGltcG9ydCBzeW1ib2xzLiAgKi8KLSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bWJvbHMrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHN5bSA9ICpzeW1ib2xzOwotICAgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKHN5bSkgPT0gYmZkX3RhcmdldF9ubG1fZmxhdm91cikKLQl7Ci0JICBubG1fc3ltYm9sX3R5cGUgKm5sbV9zeW07Ci0JICBiZmRfc2l6ZV90eXBlIGo7Ci0KLQkgIG5sbV9zeW0gPSAobmxtX3N5bWJvbF90eXBlICopIHN5bTsKLQkgIGZvciAoaiA9IDA7IGogPCBubG1fc3ltLT5yY250OyBqKyspCi0JICAgIHsKLQkgICAgICBpZiAobmxtX3N5bS0+cmVsb2NzW2pdLnNlY3Rpb24gPT0gc2VjKQotCQl7Ci0JCSAgKnJlbHB0ciA9ICZubG1fc3ltLT5yZWxvY3Nbal0ucmVsb2M7Ci0JCSAgKCpyZWxwdHIpLT5zeW1fcHRyX3B0ciA9IHN5bWJvbHM7Ci0JCSAgKytyZWxwdHI7Ci0JCSAgKytyZXQ7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgKnJlbHB0ciA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIENvbXB1dGUgdGhlIHNlY3Rpb24gZmlsZSBwb3NpdGlvbnMgZm9yIGFuIE5MTSBmaWxlLiAgQWxsIHZhcmlhYmxlCi0gICBsZW5ndGggZGF0YSBpbiB0aGUgZmlsZSBoZWFkZXJzIG11c3QgYmUgc2V0IGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzCi0gICBjYWxsZWQuICBJZiB0aGUgdmFyaWFibGUgbGVuZ3RoIGRhdGEgaXMgY2hhbmdlZCBsYXRlciwgdGhlCi0gICByZXN1bHRpbmcgb2JqZWN0IGZpbGUgd2lsbCBiZSBpbmNvcnJlY3QuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcwotICAgbm8gd2F5IHRvIGNoZWNrIHRoaXMuCi0KLSAgIFRoaXMgcm91dGluZSBhbHNvIHNldHMgdGhlIFNpemUgYW5kIE9mZnNldCBmaWVsZHMgaW4gdGhlIGZpeGVkCi0gICBoZWFkZXIuCi0KLSAgIEl0IGFsc28gbG9va3Mgb3ZlciB0aGUgc3ltYm9scyBhbmQgbW92ZXMgYW55IGNvbW1vbiBzeW1ib2xzIGludG8KLSAgIHRoZSAuYnNzIHNlY3Rpb247IE5MTSBoYXMgbm8gd2F5IHRvIHJlcHJlc2VudCBhIGNvbW1vbiBzeW1ib2wuCi0gICBUaGlzIGFwcHJvYWNoIG1lYW5zIHRoYXQgZWl0aGVyIHRoZSBzeW1ib2xzIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4KLSAgIHNldCBhdCB0aGlzIHBvaW50LCBvciB0aGVyZSBtdXN0IGJlIG5vIGNvbW1vbiBzeW1ib2xzLiAgV2UgbmVlZCB0bwotICAgbW92ZSB0aGUgc3ltYm9scyBhdCB0aGlzIHBvaW50IHNvIHRoYXQgbWFuZ2xlX3JlbG9jcyBjYW4gc2VlIHRoZQotICAgZmluYWwgdmFsdWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgc29mYXI7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgdGV4dCwgZGF0YSwgYnNzOwotICBiZmRfdm1hIHRleHRfbG93LCBkYXRhX2xvdzsKLSAgdW5zaWduZWQgaW50IHRleHRfYWxpZ24sIGRhdGFfYWxpZ24sIG90aGVyX2FsaWduOwotICBmaWxlX3B0ciB0ZXh0X3B0ciwgZGF0YV9wdHIsIG90aGVyX3B0cjsKLSAgYXNlY3Rpb24gKmJzc19zZWM7Ci0gIGFzeW1ib2wgKipzeW1fcHRyX3B0cjsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSB0cnVlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc2VjdGlvbiB0byBob2xkIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0gIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKGJzc19zZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FLAotCQkJICAgIChmaWxlX3B0cikgMCwgKGJmZF9zaXplX3R5cGUpIDAsCi0JCQkgICAgU0VDX0FMTE9DKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gICAgfQotCi0gIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCi0gIC8qIFRoZSBmaXhlZCBoZWFkZXIuICAqLwotICBzb2ZhciA9IG5sbV9vcHRpb25hbF9wcmVmaXhfc2l6ZSAoYWJmZCkgKyBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpOwotCi0gIC8qIFRoZSB2YXJpYWJsZSBoZWFkZXIuICAqLwotICBzb2ZhciArPSAoc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpCi0JICAgICsgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMQotCSAgICArIE5MTV9UQVJHRVRfTE9OR19TSVpFCS8qIHN0YWNrU2l6ZSAqLwotCSAgICArIE5MTV9UQVJHRVRfTE9OR19TSVpFCS8qIHJlc2VydmVkICovCi0JICAgICsgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSkKLQkgICAgKyBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoKQotCSAgICArIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMQotCSAgICArIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpCi0JICAgICsgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxKTsKLQotICAvKiBUaGUgYXV4aWxpYXJ5IGhlYWRlcnMuICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIpKSkKLSAgICBzb2ZhciArPSBzaXplb2YgKE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlcik7Ci0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKSkpCi0gICAgc29mYXIgKz0gc2l6ZW9mIChObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKTsKLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikpKQotICAgIHNvZmFyICs9IChzaXplb2YgKE5sbV9FeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKQotCSAgICAgICsgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSk7Ci0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIpKSkKLSAgICBzb2ZhciArPSAoc2l6ZW9mIChObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlcikKLQkgICAgICArIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoKTsKLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyKSkpCi0gICAgc29mYXIgKz0gc2l6ZW9mIChObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlcik7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucyBpbiB0d28gcGFzc2VzLiAgRmlyc3QgZ2V0IHRoZQotICAgICBzaXplcyBvZiB0aGUgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucywgYW5kIHRoZW4gc2V0IHRoZSBmaWxlCi0gICAgIHBvc2l0aW9ucy4gIFRoaXMgY29kZSBhbGlnbnMgdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHVzaW5nIHRoZQotICAgICBzYW1lIGFsaWdubWVudCByZXN0cmljdGlvbnMgdGhhdCBhcHBseSB0byB0aGUgc2VjdGlvbnMgaW4gbWVtb3J5OwotICAgICB0aGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5LiAgKi8KLSAgdGV4dCA9IDA7Ci0gIHRleHRfbG93ID0gKGJmZF92bWEpIC0gMTsKLSAgdGV4dF9hbGlnbiA9IDA7Ci0gIGRhdGEgPSAwOwotICBkYXRhX2xvdyA9IChiZmRfdm1hKSAtIDE7Ci0gIGRhdGFfYWxpZ24gPSAwOwotICBic3MgPSAwOwotICBvdGhlcl9hbGlnbiA9IDA7Ci0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGY7Ci0KLSAgICAgIHNlYy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzZWMtPl9yYXdfc2l6ZSwgMSA8PCBzZWMtPmFsaWdubWVudF9wb3dlcik7Ci0KLSAgICAgIGYgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYyk7Ci0gICAgICBpZiAoZiAmIFNFQ19DT0RFKQotCXsKLQkgIHRleHQgKz0gc2VjLT5fcmF3X3NpemU7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSA8IHRleHRfbG93KQotCSAgICB0ZXh0X2xvdyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0JICBpZiAoc2VjLT5hbGlnbm1lbnRfcG93ZXIgPiB0ZXh0X2FsaWduKQotCSAgICB0ZXh0X2FsaWduID0gc2VjLT5hbGlnbm1lbnRfcG93ZXI7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19EQVRBKQotCXsKLQkgIGRhdGEgKz0gc2VjLT5fcmF3X3NpemU7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSA8IGRhdGFfbG93KQotCSAgICBkYXRhX2xvdyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0JICBpZiAoc2VjLT5hbGlnbm1lbnRfcG93ZXIgPiBkYXRhX2FsaWduKQotCSAgICBkYXRhX2FsaWduID0gc2VjLT5hbGlnbm1lbnRfcG93ZXI7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JewotCSAgaWYgKHNlYy0+YWxpZ25tZW50X3Bvd2VyID4gb3RoZXJfYWxpZ24pCi0JICAgIG90aGVyX2FsaWduID0gc2VjLT5hbGlnbm1lbnRfcG93ZXI7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19BTExPQykKLQlic3MgKz0gc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotCi0gIG5sbV9zZXRfdGV4dF9sb3cgKGFiZmQsIHRleHRfbG93KTsKLSAgbmxtX3NldF9kYXRhX2xvdyAoYWJmZCwgZGF0YV9sb3cpOwotCi0gIGlmIChubG1fbm9fdW5pbml0aWFsaXplZF9kYXRhIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIE5ldFdhcmUgZm9ybWF0IGRvZXMgbm90IHVzZSB1bmluaXRpYWxpemVkIGRhdGEuICBXZSBtdXN0Ci0JIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBkYXRhIHNlY3Rpb24uICBXZSB3aWxsIG5ldmVyIHdpbmQgdXAKLQkgd3JpdGluZyB0aG9zZSBmaWxlIGxvY2F0aW9ucywgc28gdGhleSB3aWxsIHJlbWFpbiB6ZXJvLiAgKi8KLSAgICAgIGRhdGEgKz0gYnNzOwotICAgICAgYnNzID0gMDsKLSAgICB9Ci0KLSAgdGV4dF9wdHIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IHRleHRfYWxpZ24pOwotICBkYXRhX3B0ciA9IEJGRF9BTElHTiAodGV4dF9wdHIgKyB0ZXh0LCAxIDw8IGRhdGFfYWxpZ24pOwotICBvdGhlcl9wdHIgPSBCRkRfQUxJR04gKGRhdGFfcHRyICsgZGF0YSwgMSA8PCBvdGhlcl9hbGlnbik7Ci0KLSAgLyogRmlsbCBpbiBzb21lIGZpZWxkcyBpbiB0aGUgaGVhZGVyIGZvciB3aGljaCB3ZSBub3cgaGF2ZSB0aGUKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZUltYWdlT2Zmc2V0ID0gdGV4dF9wdHI7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VTaXplID0gdGV4dDsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRhdGFJbWFnZU9mZnNldCA9IGRhdGFfcHRyOwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlU2l6ZSA9IGRhdGE7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT51bmluaXRpYWxpemVkRGF0YVNpemUgPSBic3M7Ci0KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZjsKLQotICAgICAgZiA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLQotICAgICAgaWYgKGYgJiBTRUNfQ09ERSkKLQl7Ci0JICBzZWMtPmZpbGVwb3MgPSB0ZXh0X3B0cjsKLQkgIHRleHRfcHRyICs9IHNlYy0+X3Jhd19zaXplOwotCX0KLSAgICAgIGVsc2UgaWYgKGYgJiBTRUNfREFUQSkKLQl7Ci0JICBzZWMtPmZpbGVwb3MgPSBkYXRhX3B0cjsKLQkgIGRhdGFfcHRyICs9IHNlYy0+X3Jhd19zaXplOwotCX0KLSAgICAgIGVsc2UgaWYgKGYgJiBTRUNfSEFTX0NPTlRFTlRTKQotCXsKLQkgIHNlYy0+ZmlsZXBvcyA9IG90aGVyX3B0cjsKLQkgIG90aGVyX3B0ciArPSBzZWMtPl9yYXdfc2l6ZTsKLQl9Ci0gICAgfQotCi0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQgPSBvdGhlcl9wdHI7Ci0KLSAgLyogTW92ZSBhbGwgY29tbW9uIHN5bWJvbHMgaW50byB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLQotICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGlmIChzeW1fcHRyX3B0ciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKipzeW1fZW5kOwotICAgICAgYmZkX3ZtYSBhZGQ7Ci0KLSAgICAgIHN5bV9lbmQgPSBzeW1fcHRyX3B0ciArIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICAgICAgYWRkID0gMDsKLSAgICAgIGZvciAoOyBzeW1fcHRyX3B0ciA8IHN5bV9lbmQ7IHN5bV9wdHJfcHRyKyspCi0JewotCSAgYXN5bWJvbCAqc3ltOwotCSAgYmZkX3ZtYSBzaXplOwotCi0JICBzeW0gPSAqc3ltX3B0cl9wdHI7Ci0KLQkgIGlmICghYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogUHV0IHRoZSBjb21tb24gc3ltYm9sIGluIHRoZSAuYnNzIHNlY3Rpb24sIGFuZCBpbmNyZWFzZQotCSAgICAgdGhlIHNpemUgb2YgdGhlIC5ic3Mgc2VjdGlvbiBieSB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uCi0JICAgICBzeW1ib2wgKHdoaWNoIGlzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCkuICAqLwotCSAgc3ltLT5zZWN0aW9uID0gYnNzX3NlYzsKLQkgIHNpemUgPSBzeW0tPnZhbHVlOwotCSAgc3ltLT52YWx1ZSA9IGJzc19zZWMtPl9yYXdfc2l6ZSArIGFkZDsKLQkgIGFkZCArPSBzaXplOwotCSAgYWRkID0gQkZEX0FMSUdOIChhZGQsIDEgPDwgYnNzX3NlYy0+YWxpZ25tZW50X3Bvd2VyKTsKLQl9Ci0gICAgICBpZiAoYWRkICE9IDApCi0JewotCSAgaWYgKG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEgKGFiZmQpKQotCSAgICB7Ci0JICAgICAgLyogV2UgY291bGQgaGFuZGxlIHRoaXMgY2FzZSwgYnV0IHNvIGZhciBpdCBoYXNuJ3QgYmVlbgotCQkgbmVjZXNzYXJ5LiAgKi8KLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSArPSBhZGQ7Ci0JICBic3Nfc2VjLT5fcmF3X3NpemUgKz0gYWRkOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVG8gZG8gdGhpcyB3ZSBuZWVkIHRvIGtub3cgd2hlcmUKLSAgIHRoZSBzZWN0aW9uIGlzIGdvaW5nIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIG91dHB1dCBmaWxlLiAgVGhhdCBtZWFucwotICAgdGhhdCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBzZWN0aW9ucyBtdXN0IGJlIHNldCwgYW5kIGFsbCB0aGUKLSAgIHZhcmlhYmxlIHNpemUgaGVhZGVyIGluZm9ybWF0aW9uIG11c3QgYmUga25vd24uICAqLwotCi1ib29sZWFuCi1ubG1fc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UKLSAgICAgICYmIG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBpMzg2IE5ldFdhcmUgaGFzIGEgdmVyeSByZXN0cmljdGVkIHNldCBvZiByZWxvY3MuICBJbiBvcmRlciBmb3IKLSAgICAgb2JqY29weSB0byB3b3JrLCB0aGUgTkxNIGkzODYgYmFja2VuZCBuZWVkcyBhIGNoYW5jZSB0byByZXdvcmsKLSAgICAgdGhlIHNlY3Rpb24gY29udGVudHMgc28gdGhhdCBpdHMgc2V0IG9mIHJlbG9jcyB3aWxsIHdvcmsuICBJZiBhbGwKLSAgICAgdGhlIHJlbG9jcyBhcmUgYWxyZWFkeSBhY2NlcHRhYmxlLCB0aGlzIHdpbGwgbm90IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ICE9IDApCi0gICAgewotICAgICAgYm9vbGVhbiAoKm1hbmdsZV9yZWxvY3NfZnVuYykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwKLQkJCQkJICAgICBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgICAgIG1hbmdsZV9yZWxvY3NfZnVuYyA9IG5sbV9tYW5nbGVfcmVsb2NzX2Z1bmMgKGFiZmQpOwotICAgICAgaWYgKG1hbmdsZV9yZWxvY3NfZnVuYyAhPSBOVUxMKQotCXsKLQkgIGlmICghKCptYW5nbGVfcmVsb2NzX2Z1bmMpIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwKLQkJCQkgICAgICAoYmZkX3ZtYSkgb2Zmc2V0LCBjb3VudCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBuZWVkIHRvIHNvcnQgYSBsaXN0IG9mIHJlbG9jcyBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbnMgd2hlbiB3ZQotICAgd3JpdGUgb3V0IHRoZSBleHRlcm5hbCByZWxvY3MuICAqLwotCi1zdGF0aWMgaW50Ci1ubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSAocDEsIHAyKQotICAgICBjb25zdCB2b2lkICpwMTsKLSAgICAgY29uc3Qgdm9pZCAqcDI7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZWxvY19hbmRfc2VjICpyMSA9IChjb25zdCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSBwMTsKLSAgY29uc3Qgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnIyID0gKGNvbnN0IHN0cnVjdCByZWxvY19hbmRfc2VjICopIHAyOwotICBpbnQgY21wOwotCi0gIGNtcCA9IHN0cmNtcCAoKCpyMS0+cmVsLT5zeW1fcHRyX3B0ciktPm5hbWUsCi0JCSgqcjItPnJlbC0+c3ltX3B0cl9wdHIpLT5uYW1lKTsKLSAgaWYgKGNtcCAhPSAwKQotICAgIHJldHVybiBjbXA7Ci0KLSAgLyogV2Ugc29ydCBieSBhZGRyZXNzIHdpdGhpbiBzeW1ib2wgdG8gbWFrZSB0aGUgc29ydCBtb3JlIHN0YWJsZSBhbmQKLSAgICAgaW5jcmVhc2UgdGhlIGNoYW5jZXMgdGhhdCBkaWZmZXJlbnQgaG9zdHMgd2lsbCBnZW5lcmF0ZSBiaXQgZm9yCi0gICAgIGJpdCBlcXVpdmFsZW50IHJlc3VsdHMuICAqLwotICByZXR1cm4gKGludCkgKHIxLT5yZWwtPmFkZHJlc3MgLSByMi0+cmVsLT5hZGRyZXNzKTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIE5MTSBmaWxlLiAgV2Ugd3JpdGUgb3V0IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIG9yZGVyOgotICAgICBmaXhlZCBoZWFkZXIKLSAgICAgdmFyaWFibGUgaGVhZGVyCi0gICAgIGF1eGlsaWFyeSBoZWFkZXJzCi0gICAgIGNvZGUgc2VjdGlvbnMKLSAgICAgZGF0YSBzZWN0aW9ucwotICAgICBvdGhlciBzZWN0aW9ucyAoY3VzdG9tIGRhdGEsIG1lc3NhZ2VzLCBoZWxwLCBzaGFyZWQgTkxNLCBSUEMsCi0gICAgIAkJICAgICBtb2R1bGUgZGVwZW5kZW5jaWVzKQotICAgICByZWxvY2F0aW9uIGZpeHVwcwotICAgICBleHRlcm5hbCByZWZlcmVuY2VzIChpbXBvcnRzKQotICAgICBwdWJsaWMgc3ltYm9scyAoZXhwb3J0cykKLSAgICAgZGVidWdnaW5nIHJlY29yZHMKLSAgIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgb3JkZXIgdXNlZCBieSB0aGUgTmV0V2FyZSB0b29sczsgdGhlCi0gICBkaWZmZXJlbmNlIGlzIHRoYXQgTmV0V2FyZSBwdXRzIHRoZSBzZWN0aW9ucyBvdGhlciB0aGFuIGNvZGUsIGRhdGEKLSAgIGFuZCBjdXN0b20gZGF0YSBhdCB0aGUgZW5kIG9mIHRoZSBOTE0uICBJdCBpcyBjb252ZW5pZW50IGZvciB1cyB0bwotICAga25vdyB3aGVyZSB0aGUgc2VjdGlvbnMgYXJlIGdvaW5nIHRvIGJlIGJlZm9yZSB3b3JyeWluZyBhYm91dCB0aGUKLSAgIHNpemUgb2YgdGhlIG90aGVyIGluZm9ybWF0aW9uLgotCi0gICBCeSB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYWxsIHRoZSBzZWN0aW9uIGRhdGEgc2hvdWxkCi0gICBoYXZlIGJlZW4gb3V0cHV0IHVzaW5nIHNldF9zZWN0aW9uX2NvbnRlbnRzLiAgTm90ZSB0aGF0IGN1c3RvbQotICAgZGF0YSwgdGhlIG1lc3NhZ2UgZmlsZSwgdGhlIGhlbHAgZmlsZSwgdGhlIHNoYXJlZCBOTE0gZmlsZSwgdGhlIFJQQwotICAgZGF0YSwgYW5kIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBhbGwgY29uc2lkZXJlZCB0byBiZQotICAgc2VjdGlvbnM7IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gdGhlIG9mZnNldCBhbmQKLSAgIGxlbmd0aCBmaWVsZHMgaW4gdGhlIE5MTSBoZWFkZXJzLiAgVGhlIHJlbG9jYXRpb24gZml4dXBzIGFuZAotICAgaW1wb3J0cyBhcmUgYm90aCBvYnRhaW5lZCBmcm9tIHRoZSBsaXN0IG9mIHJlbG9jcyBhdHRhY2hlZCB0byBlYWNoCi0gICBzZWN0aW9uLiAgVGhlIGV4cG9ydHMgYW5kIGRlYnVnZ2luZyByZWNvcmRzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZQotICAgbGlzdCBvZiBvdXRzeW1ib2xzLiAgKi8KLQotYm9vbGVhbgotbmxtX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqc2VjOwotICBib29sZWFuICgqd3JpdGVfaW1wb3J0X2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19jb3VudCwgaW50ZXJuYWxfcmVsb2NfY291bnQsIGksIGM7Ci0gIHN0cnVjdCByZWxvY19hbmRfc2VjICpleHRlcm5hbF9yZWxvY3M7Ci0gIGFzeW1ib2wgKipzeW1fcHRyX3B0cjsKLSAgZmlsZV9wdHIgbGFzdDsKLSAgYm9vbGVhbiAoKndyaXRlX3ByZWZpeF9mdW5jKSBQQVJBTVMgKChiZmQgKikpOwotICB1bnNpZ25lZCBjaGFyICpmaXhlZF9oZWFkZXIgPSBOVUxMOwotCi0gIGZpeGVkX2hlYWRlciA9ICgodW5zaWduZWQgY2hhciAqKQotCQkgIGJmZF9tYWxsb2MgKChzaXplX3QpIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCkpKTsKLSAgaWYgKGZpeGVkX2hlYWRlciA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlCi0gICAgICAmJiBubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSA9PSBmYWxzZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXJzLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCSAgICAgbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplIChhYmZkKSArIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCksCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAobmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX291dCAoYWJmZCkgPT0gZmFsc2UKLSAgICAgIHx8IG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCAoYWJmZCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBBIHdlYWsgY2hlY2sgb24gd2hldGhlciB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucyB3ZXJlCi0gICAgIHJlYXNvbmFibGUuICAqLwotICBpZiAoYmZkX3RlbGwgKGFiZmQpID4gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZU9mZnNldCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIEFkdmFuY2UgdG8gdGhlIHJlbG9jcy4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnJlbG9jYXRpb25GaXh1cE9mZnNldCwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIGZvcm1hdCBvZiB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIGlzIGRlcGVuZGVudCB1cG9uIHRoZQotICAgICBwYXJ0aWN1bGFyIHRhcmdldC4gIFdlIHVzZSBhbiBleHRlcm5hbCByb3V0aW5lIHRvIHdyaXRlIHRoZSByZWxvYwotICAgICBvdXQuICAqLwotICB3cml0ZV9pbXBvcnRfZnVuYyA9IG5sbV93cml0ZV9pbXBvcnRfZnVuYyAoYWJmZCk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnRlcm5hbCByZWxvY2F0aW9uIGZpeHVwcy4gIFdoaWxlIHdlJ3JlIGxvb3BpbmcKLSAgICAgb3ZlciB0aGUgcmVsb2NzLCB3ZSBhbHNvIGNvdW50IHRoZSBleHRlcm5hbCByZWxvY3MsIHdoaWNoIGlzCi0gICAgIG5lZWRlZCB3aGVuIHRoZXkgYXJlIHdyaXR0ZW4gb3V0IGJlbG93LiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NfY291bnQgPSAwOwotICBleHRlcm5hbF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipyZWxfcHRyX3B0ciwgKipyZWxfZW5kOwotCi0gICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBjYW4gb25seSByZXByZXNlbnQgcmVsb2NzIHdpdGhpbiBhIGNvZGUgb3IgZGF0YQotCSBzZWN0aW9uLiAgV2UgaWdub3JlIHRoZW0gZm9yIGEgZGVidWdnaW5nIHNlY3Rpb24uICAqLwotICAgICAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiAoU0VDX0NPREUgfCBTRUNfREFUQSkpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8ga25vdyBob3cgdG8gd3JpdGUgb3V0IGltcG9ydHMgKi8KLSAgICAgIGlmICh3cml0ZV9pbXBvcnRfZnVuYyA9PSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIHJlbF9wdHJfcHRyID0gc2VjLT5vcmVsb2NhdGlvbjsKLSAgICAgIHJlbF9lbmQgPSByZWxfcHRyX3B0ciArIHNlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKDsgcmVsX3B0cl9wdHIgPCByZWxfZW5kOyByZWxfcHRyX3B0cisrKQotCXsKLQkgIGFyZWxlbnQgKnJlbDsKLQkgIGFzeW1ib2wgKnN5bTsKLQotCSAgcmVsID0gKnJlbF9wdHJfcHRyOwotCSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgewotCSAgICAgICsraW50ZXJuYWxfcmVsb2NfY291bnQ7Ci0JICAgICAgaWYgKCgqd3JpdGVfaW1wb3J0X2Z1bmMpIChhYmZkLCBzZWMsIHJlbCkgPT0gZmFsc2UpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgICsrZXh0ZXJuYWxfcmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyA9IGludGVybmFsX3JlbG9jX2NvdW50OwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW1wb3J0cyAocmVsb2NzIGFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scykuICBUaGVzZQotICAgICBhcmUgb3V0cHV0IGFzIGEgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgYWxsIHRoZSByZWxvY3MgZm9yIHRoYXQKLSAgICAgc3ltYm9sLCBzbyB3ZSBtdXN0IGZpcnN0IGdhdGhlciB0b2dldGhlciBhbGwgdGhlIHJlbG9jcyBhZ2FpbnN0Ci0gICAgIGV4dGVybmFsIHN5bWJvbHMgYW5kIHNvcnQgdGhlbS4gICovCi0gIGV4dGVybmFsX3JlbG9jcyA9Ci0gICAgKHN0cnVjdCByZWxvY19hbmRfc2VjICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJKGV4dGVybmFsX3JlbG9jX2NvdW50Ci0JCQkJCSAqIHNpemVvZiAoc3RydWN0IHJlbG9jX2FuZF9zZWMpKSk7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gKHN0cnVjdCByZWxvY19hbmRfc2VjICopIE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGkgPSAwOwotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcmVsX3B0cl9wdHIsICoqcmVsX2VuZDsKLQotICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsX3B0cl9wdHIgPSBzZWMtPm9yZWxvY2F0aW9uOwotICAgICAgcmVsX2VuZCA9IHJlbF9wdHJfcHRyICsgc2VjLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoOyByZWxfcHRyX3B0ciA8IHJlbF9lbmQ7IHJlbF9wdHJfcHRyKyspCi0JewotCSAgYXJlbGVudCAqcmVsOwotCSAgYXN5bWJvbCAqc3ltOwotCi0JICByZWwgPSAqcmVsX3B0cl9wdHI7Ci0JICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICBjb250aW51ZTsKLQotCSAgZXh0ZXJuYWxfcmVsb2NzW2ldLnJlbCA9IHJlbDsKLQkgIGV4dGVybmFsX3JlbG9jc1tpXS5zZWMgPSBzZWM7Ci0JICArK2k7Ci0JfQotICAgIH0KLQotICBCRkRfQVNTRVJUIChpID09IGV4dGVybmFsX3JlbG9jX2NvdW50KTsKLQotICAvKiBTb3J0IHRoZSBleHRlcm5hbCByZWxvY3MgYnkgbmFtZS4gICovCi0gIHFzb3J0ICgoUFRSKSBleHRlcm5hbF9yZWxvY3MsIChzaXplX3QpIGV4dGVybmFsX3JlbG9jX2NvdW50LAotCSBzaXplb2YgKHN0cnVjdCByZWxvY19hbmRfc2VjKSwgbmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgYyA9IDA7Ci0gIGkgPSAwOwotICB3aGlsZSAoaSA8IGV4dGVybmFsX3JlbG9jX2NvdW50KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaiwgY250OwotCi0gICAgICArK2M7Ci0KLSAgICAgIHJlbCA9IGV4dGVybmFsX3JlbG9jc1tpXS5yZWw7Ci0gICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAgICAgY250ID0gMDsKLSAgICAgIGZvciAoaiA9IGk7Ci0JICAgKGogPCBleHRlcm5hbF9yZWxvY19jb3VudAotCSAgICAmJiAqZXh0ZXJuYWxfcmVsb2NzW2pdLnJlbC0+c3ltX3B0cl9wdHIgPT0gc3ltKTsKLQkgICBqKyspCi0JKytjbnQ7Ci0KLSAgICAgIGlmICgoKm5sbV93cml0ZV9leHRlcm5hbF9mdW5jIChhYmZkKSkgKGFiZmQsIGNudCwgc3ltLAotCQkJCQkgICAgICZleHRlcm5hbF9yZWxvY3NbaV0pCi0JICA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaSArPSBjbnQ7Ci0gICAgfQotCi0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyA9IGM7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBwdWJsaWMgc3ltYm9scyAoZXhwb3J0cykuICAqLwotICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGlmIChzeW1fcHRyX3B0ciAhPSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hICgqZ2V0X3B1YmxpY19vZmZzZXRfZnVuYykgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotICAgICAgYm9vbGVhbiAoKndyaXRlX2V4cG9ydF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmRfdm1hKSk7Ci0KLSAgICAgIGFzeW1ib2wgKipzeW1fZW5kOwotCi0gICAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cHVibGljc09mZnNldCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgICAgIGdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMgPSBubG1fZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyAoYWJmZCk7Ci0gICAgICB3cml0ZV9leHBvcnRfZnVuYyA9IG5sbV93cml0ZV9leHBvcnRfZnVuYyAoYWJmZCk7Ci0gICAgICBjID0gMDsKLSAgICAgIHN5bV9lbmQgPSBzeW1fcHRyX3B0ciArIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICAgICAgZm9yICg7IHN5bV9wdHJfcHRyIDwgc3ltX2VuZDsgc3ltX3B0cl9wdHIrKykKLQl7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBiZmRfYnl0ZSBsZW47Ci0JICBiZmRfdm1hIG9mZnNldDsKLQkgIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0JICBzeW0gPSAqc3ltX3B0cl9wdHI7Ci0KLQkgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCkpID09IDAKLQkgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICArK2M7Ci0KLQkgIGlmIChnZXRfcHVibGljX29mZnNldF9mdW5jKQotCSAgICB7Ci0JICAgICAgLyogTW9zdCBiYWNrZW5kcyBjYW4gdXNlIHRoZSBjb2RlIGJlbG93LCBidXQKLQkJIHVuZm9ydHVuYXRlbHkgc29tZSB1c2UgYSBkaWZmZXJlbnQgc2NoZW1lLiAgKi8KLQkgICAgICBvZmZzZXQgPSAoKmdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMpIChhYmZkLCBzeW0pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvZmZzZXQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBzZWMgPSBzeW0tPnNlY3Rpb247Ci0JICAgICAgaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJewotCQkgIG9mZnNldCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLQkJICBvZmZzZXQgfD0gTkxNX0hJQklUOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc2VjLT5mbGFncyAmIChTRUNfREFUQSB8IFNFQ19BTExPQykpCi0JCXsKLQkJICAvKiBTRUNfQUxMT0MgaXMgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotCQkgIG9mZnNldCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIGNhbid0IGhhbmRsZSBhbiBleHBvcnRlZCBzeW1ib2wgdGhhdCBpcyBub3QgaW4KLQkJICAgICB0aGUgY29kZSBvciBkYXRhIHNlZ21lbnQuICAqLwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICBpZiAod3JpdGVfZXhwb3J0X2Z1bmMpCi0JICAgIHsKLQkgICAgICBpZiAoKCp3cml0ZV9leHBvcnRfZnVuYykgKGFiZmQsIHN5bSwgb2Zmc2V0KSA9PSBmYWxzZSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLQkgICAgICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpCi0JCSAgICE9IHNpemVvZiAoYmZkX2J5dGUpKQotCQkgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBwdXRfd29yZCAoYWJmZCwgb2Zmc2V0LCB0ZW1wKTsKLQkgICAgICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlB1YmxpY3MgPSBjOwotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyByZWNvcmRzLiAgVGhlIE5MTSBjb252ZXJzaW9uIHByb2dyYW0KLQkgd2FudHMgdG8gYmUgYWJsZSB0byBpbmhpYml0IHRoaXMsIHNvIGFzIGEgc3BlY2lhbCBoYWNrIGlmCi0JIGRlYnVnSW5mb09mZnNldCBpcyBzZXQgdG8gLTEgd2UgZG9uJ3Qgd3JpdGUgYW55IGRlYnVnZ2luZwotCSBpbmZvcm1hdGlvbi4gIFRoaXMgY2FuIG5vdCBiZSBoYW5kbGVkIGJ5IGZpZGRsaW5nIHdpdGggdGhlCi0JIHN5bWJvbCB0YWJsZSwgYmVjYXVzZSBleHBvcnRlZCBzeW1ib2xzIGFwcGVhciBpbiBib3RoIHRoZQotCSBleHBvcnRlZCBzeW1ib2wgbGlzdCBhbmQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9PSAoZmlsZV9wdHIpIC0gMSkKLQl7Ci0JICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID0gMDsKLQkgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkRlYnVnUmVjb3JkcyA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0JICBjID0gMDsKLQkgIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLQkgIHN5bV9lbmQgPSBzeW1fcHRyX3B0ciArIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCSAgZm9yICg7IHN5bV9wdHJfcHRyIDwgc3ltX2VuZDsgc3ltX3B0cl9wdHIrKykKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQkgICAgICBiZmRfYnl0ZSB0eXBlLCBsZW47Ci0JICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0JICAgICAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLQkgICAgICBzeW0gPSAqc3ltX3B0cl9wdHI7Ci0KLQkgICAgICAvKiBUaGUgTkxNIG5vdGlvbiBvZiBhIGRlYnVnZ2luZyBzeW1ib2wgaXMgYWN0dWFsbHkgd2hhdAotCQkgQkZEIGNhbGxzIGEgbG9jYWwgb3IgZ2xvYmFsIHN5bWJvbC4gIFdoYXQgQkZEIGNhbGxzIGEKLQkJIGRlYnVnZ2luZyBzeW1ib2wgTkxNIGRvZXMgbm90IHVuZGVyc3RhbmQgYXQgYWxsLiAgKi8KLQkgICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0xPQ0FMIHwgQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQpKSA9PSAwCi0JCSAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwCi0JCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCQljb250aW51ZTsKLQotCSAgICAgICsrYzsKLQotCSAgICAgIG9mZnNldCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIHNlYyA9IHN5bS0+c2VjdGlvbjsKLQkgICAgICBpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCQl7Ci0JCSAgb2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotCQkgIHR5cGUgPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc2VjLT5mbGFncyAmIChTRUNfREFUQSB8IFNFQ19BTExPQykpCi0JCXsKLQkJICAvKiBTRUNfQUxMT0MgaXMgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotCQkgIG9mZnNldCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLQkJICB0eXBlID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJdHlwZSA9IDI7Ci0KLQkgICAgICAvKiBUaGUgdHlwZSBpcyAwIGZvciBkYXRhLCAxIGZvciBjb2RlLCAyIGZvciBhYnNvbHV0ZS4gICovCi0JICAgICAgaWYgKGJmZF93cml0ZSAoJnR5cGUsIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKQotCQkgICE9IHNpemVvZiAoYmZkX2J5dGUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIHB1dF93b3JkIChhYmZkLCBvZmZzZXQsIHRlbXApOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotCSAgICAgIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkKLQkJICAgIT0gc2l6ZW9mIChiZmRfYnl0ZSkpCi0JCSAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzID0gYzsKLQl9Ci0gICAgfQotCi0gIC8qIE5MTUxJTksgZmlsbHMgaW4gb2Zmc2V0IHZhbHVlcyBldmVuIGlmIHRoZXJlIGlzIG5vIGRhdGEsIHNvIHdlIGRvCi0gICAgIHRoZSBzYW1lLiAgKi8KLSAgbGFzdCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZUltYWdlT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jdXN0b21EYXRhT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmN1c3RvbURhdGFPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnJlbG9jYXRpb25GaXh1cE9mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cHVibGljc09mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5wdWJsaWNzT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID0gbGFzdDsKLQotICAvKiBBdCB0aGlzIHBvaW50IGV2ZXJ5dGhpbmcgaGFzIGJlZW4gd3JpdHRlbiBvdXQgZXhjZXB0IHRoZSBmaXhlZAotICAgICBoZWFkZXIuICAqLwotICBtZW1jcHkgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5zaWduYXR1cmUsIG5sbV9zaWduYXR1cmUgKGFiZmQpLAotCSAgTkxNX1NJR05BVFVSRV9TSVpFKTsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnZlcnNpb24gPSBOTE1fSEVBREVSX1ZFUlNJT047Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlU3RhcnRPZmZzZXQgPQotICAgIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpCi0gICAgIC0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCkpOwotCi0gIC8qIFdlIGhhdmUgbm8gY29udmVuaWVudCB3YXkgZm9yIHRoZSBjYWxsZXIgdG8gcGFzcyBpbiB0aGUgZXhpdAotICAgICBwcm9jZWR1cmUgb3IgdGhlIGNoZWNrIHVubG9hZCBwcm9jZWR1cmUsIHNvIHRoZSBjYWxsZXIgbXVzdCBzZXQKLSAgICAgdGhlIHZhbHVlcyBpbiB0aGUgaGVhZGVyIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHN5bWJvbHMuICAqLwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXhpdFByb2NlZHVyZU9mZnNldCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCAhPSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCAtPQotICAgICAgbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICB3cml0ZV9wcmVmaXhfZnVuYyA9IG5sbV93cml0ZV9wcmVmaXhfZnVuYyAoYWJmZCk7Ci0gIGlmICh3cml0ZV9wcmVmaXhfZnVuYykKLSAgICB7Ci0gICAgICBpZiAoKCp3cml0ZV9wcmVmaXhfZnVuYykgKGFiZmQpID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBCRkRfQVNTRVJUICgoYmZkX3NpemVfdHlwZSkgYmZkX3RlbGwgKGFiZmQpCi0JICAgICAgPT0gbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplIChhYmZkKSk7Ci0KLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCAoYWJmZCwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCksIGZpeGVkX2hlYWRlcik7Ci0gIGlmIChiZmRfd3JpdGUgKGZpeGVkX2hlYWRlciwgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSwgMSwgYWJmZCkKLSAgICAgICE9IG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGZpeGVkX2hlYWRlciAhPSBOVUxMKQotICAgIGZyZWUgKGZpeGVkX2hlYWRlcik7Ci0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChmaXhlZF9oZWFkZXIgIT0gTlVMTCkKLSAgICBmcmVlIChmaXhlZF9oZWFkZXIpOwotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9iZmQvbmxtc3dhcC5oIGIvYmZkL25sbXN3YXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5Y2U3Mi4uMDAwMDAwMAotLS0gYS9iZmQvbmxtc3dhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN3YXBwaW5nIHJvdXRpbmVzIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIHVzaW5nIEVMRiBzdXBwb3J0IGFzIHRoZQotICAgdGVtcGxhdGUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQWx0aG91Z2ggdGhpcyBpcyBhIGhlYWRlciBmaWxlLCBpdCBkZWZpbmVzIGZ1bmN0aW9ucy4gIEl0IGlzCi0gICBpbmNsdWRlZCBieSBOTE0gYmFja2VuZHMgdG8gZGVmaW5lIHN3YXBwaW5nIGZ1bmN0aW9ucyB0aGF0IHZhcnkKLSAgIGZyb20gb25lIE5MTSB0byBhbm90aGVyLiAgVGhlIGJhY2tlbmQgY29kZSBtdXN0IGFycmFuZ2UgZm9yCi0gICBObG1fRXh0ZXJuYWxfeHh4eCB0byBiZSBkZWZpbmVkIGFwcHJvcHJpYXRlbHksIGFuZCBjYW4gdGhlbiBpbmNsdWRlCi0gICB0aGlzIGZpbGUgdG8gZ2V0IHRoZSBzd2FwcGluZyByb3V0aW5lcy4KLQotICAgQXQgdGhlIG1vbWVudCB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBvbmUgc3RydWN0dXJlLCB0aGUgZml4ZWQgTkxNCi0gICBmaWxlIGhlYWRlci4gICovCi0KLXN0YXRpYyB2b2lkIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLAotCQkJCQkgICAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICopKTsKLXN0YXRpYyB2b2lkIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICosCi0JCQkJCSAgICAgICBQVFIpKTsKLQotLyogVHJhbnNsYXRlIGFuIE5MTSBmaXhlZCBsZW5ndGggZmlsZSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4gTkxNCi0gICBmaWxlIGhlYWRlciBpbiBpbnRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1ubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4gKGFiZmQsIHJlYWxzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcmVhbHNyYzsKLSAgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqZHN0OwotewotICBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyICpzcmMgPSAoTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlciAqKSByZWFsc3JjOwotICBtZW1jcHkgKGRzdC0+c2lnbmF0dXJlLCBzcmMtPnNpZ25hdHVyZSwgTkxNX1NJR05BVFVSRV9TSVpFKTsKLSAgbWVtY3B5IChkc3QtPm1vZHVsZU5hbWUsIHNyYy0+bW9kdWxlTmFtZSwgTkxNX01PRFVMRV9OQU1FX1NJWkUpOwotICBkc3QtPnZlcnNpb24gPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+dmVyc2lvbik7Ci0gIGRzdC0+Y29kZUltYWdlT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmNvZGVJbWFnZU9mZnNldCk7Ci0gIGRzdC0+Y29kZUltYWdlU2l6ZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jb2RlSW1hZ2VTaXplKTsKLSAgZHN0LT5kYXRhSW1hZ2VPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZGF0YUltYWdlT2Zmc2V0KTsKLSAgZHN0LT5kYXRhSW1hZ2VTaXplID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmRhdGFJbWFnZVNpemUpOwotICBkc3QtPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT51bmluaXRpYWxpemVkRGF0YVNpemUpOwotICBkc3QtPmN1c3RvbURhdGFPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y3VzdG9tRGF0YU9mZnNldCk7Ci0gIGRzdC0+Y3VzdG9tRGF0YVNpemUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y3VzdG9tRGF0YVNpemUpOwotICBkc3QtPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMpOwotICBkc3QtPnJlbG9jYXRpb25GaXh1cE9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQpOwotICBkc3QtPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMpOwotICBkc3QtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQpOwotICBkc3QtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzKTsKLSAgZHN0LT5wdWJsaWNzT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnB1YmxpY3NPZmZzZXQpOwotICBkc3QtPm51bWJlck9mUHVibGljcyA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZlB1YmxpY3MpOwotICBkc3QtPmRlYnVnSW5mb09mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5kZWJ1Z0luZm9PZmZzZXQpOwotICBkc3QtPm51bWJlck9mRGVidWdSZWNvcmRzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mRGVidWdSZWNvcmRzKTsKLSAgZHN0LT5jb2RlU3RhcnRPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y29kZVN0YXJ0T2Zmc2V0KTsKLSAgZHN0LT5leGl0UHJvY2VkdXJlT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmV4aXRQcm9jZWR1cmVPZmZzZXQpOwotICBkc3QtPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0KTsKLSAgZHN0LT5tb2R1bGVUeXBlID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm1vZHVsZVR5cGUpOwotICBkc3QtPmZsYWdzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmZsYWdzKTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIE5MTSBmaXhlZCBsZW5ndGggZmlsZSBoZWFkZXIgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8KLSAgIGFuIE5MTSBmaWxlIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1ubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0IChhYmZkLCBzcmMsIHJlYWxkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqc3JjOwotICAgICBQVFIgcmVhbGRzdDsKLXsKLSAgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlciAqZHN0ID0gKE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIgKikgcmVhbGRzdDsKLSAgbWVtc2V0IChkc3QsIDAsIHNpemVvZiAqZHN0KTsKLSAgbWVtY3B5IChkc3QtPnNpZ25hdHVyZSwgc3JjLT5zaWduYXR1cmUsIE5MTV9TSUdOQVRVUkVfU0laRSk7Ci0gIG1lbWNweSAoZHN0LT5tb2R1bGVOYW1lLCBzcmMtPm1vZHVsZU5hbWUsIE5MTV9NT0RVTEVfTkFNRV9TSVpFKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT52ZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgZHN0LT52ZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jb2RlSW1hZ2VPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmNvZGVJbWFnZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y29kZUltYWdlU2l6ZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+Y29kZUltYWdlU2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZGF0YUltYWdlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5kYXRhSW1hZ2VPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmRhdGFJbWFnZVNpemUsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmRhdGFJbWFnZVNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+dW5pbml0aWFsaXplZERhdGFTaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jdXN0b21EYXRhT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5jdXN0b21EYXRhT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jdXN0b21EYXRhU2l6ZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+Y3VzdG9tRGF0YVNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzLAotCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5yZWxvY2F0aW9uRml4dXBPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcywKLQkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5wdWJsaWNzT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5wdWJsaWNzT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZlB1YmxpY3MsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mUHVibGljcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZGVidWdJbmZvT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5kZWJ1Z0luZm9PZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mRGVidWdSZWNvcmRzLAotCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZkRlYnVnUmVjb3Jkcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y29kZVN0YXJ0T2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5jb2RlU3RhcnRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmV4aXRQcm9jZWR1cmVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmV4aXRQcm9jZWR1cmVPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgZHN0LT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bW9kdWxlVHlwZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+bW9kdWxlVHlwZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZmxhZ3MsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmZsYWdzKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9uczMyay5oIGIvYmZkL25zMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2M2JhMDkuLjAwMDAwMDAKLS0tIGEvYmZkL25zMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBIZWFkZXIgZmlsZSBmb3IgbnMzMmsgcm91dGluZXMuCi0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICosCi0JICAgbG9uZyAoKikgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpLAotCSAgIGludCAoKikgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpKSk7Ci0KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJmZF92bWEsCi0JICAgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi1leHRlcm4gbG9uZyBfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotZXh0ZXJuIGxvbmcgX2JmZF9uczMya19nZXRfaW1tZWRpYXRlIFBBUkFNUyAoKGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLWV4dGVybiBpbnQgX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50IFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLWV4dGVybiBpbnQgX2JmZF9uczMya19wdXRfaW1tZWRpYXRlIFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NfaW1tCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwpkaWZmIC0tZ2l0IGEvYmZkL25zMzJrbmV0YnNkLmMgYi9iZmQvbnMzMmtuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyMzU2ZC4uMDAwMDAwMAotLS0gYS9iZmQvbnMzMmtuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL25zMzJrIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCTQwOTYKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfbnMzMmsKLSNkZWZpbmUJREVGQVVMVF9NSUQgCU1fNTMyX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQocGM1MzJuZXRic2RfLE9QKQotCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKG5zMzJrYW91dCxfMzJfLHkpCi0KLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW5zMzJrLW5ldGJzZCIKLQotI2RlZmluZSBuczMya2FvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDEKLQotLyogV2UgY2FuYHQgdXNlIHRoZSBNWU5TIG1hY3JvIGhlcmUgZm9yIGNwcCByZWFzb25zIHRvbyBzdWJ0bGUKLSAqIGZvciBtZSAtLSBJV0QKLSAqLwotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbnMzMmthb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAiYmZkLmgiCQkvKiBUbyBlbnN1cmUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIGlzIE9LICovCi0KLUNPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKgotTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUygoYmZkICphYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvb2FzeXMuYyBiL2JmZC9vYXN5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjkwNTNiLi4wMDAwMDAwCi0tLSBhL2JmZC9vYXN5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIG9hc3lzIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBVTkRFUlNDT1JFX0hBQ0sgMQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAib2FzeXMuaCIKLSNpbmNsdWRlICJsaWJvYXN5cy5oIgotCi0vKiBYWFggLSBGSVhNRS4gIG9mZnNldG9mIGJlbG9uZ3MgaW4gdGhlIHN5c3RlbS1zcGVjaWZpYyBmaWxlcyBpbgotICAgLi4vaW5jbHVkZS9zeXMuICovCi0vKiBEZWZpbmUgb2Zmc2V0b2YgZm9yIHRob3NlIHN5c3RlbXMgd2hpY2ggbGFjayBpdCAqLwotCi0jaWZuZGVmIG9mZnNldG9mCi0jZGVmaW5lIG9mZnNldG9mKHR5cGUsIGlkZW50aWZpZXIpIChzaXplX3QpICYoKCh0eXBlICopIDApLT5pZGVudGlmaWVyKQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIG9hc3lzX3JlYWRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9yZWNvcmQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgIG9hc3lzX3JlY29yZF9lbnVtX3R5cGUsCi0JCQkJCSAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICosCi0JCQkJCSAgIHNpemVfdCkpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9lbmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX2RhdGEgUEFSQU1TICgoYmZkICopKTsKLQotLyogUmVhZCBpbiBhbGwgdGhlIHNlY3Rpb24gZGF0YSBhbmQgcmVsb2NhdGlvbiBzdHVmZiB0b28gKi8KLVBST1RPIChzdGF0aWMgYm9vbGVhbiwgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhLCAoYmZkICogQ09OU1QgYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfcmVhZF9yZWNvcmQgKGFiZmQsIHJlY29yZCkKLSAgICAgYmZkICphYmZkOwotICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqcmVjb3JkOwotewotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJlY29yZCwgMSwgc2l6ZW9mIChyZWNvcmQtPmhlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKChzaXplX3QpIHJlY29yZC0+aGVhZGVyLmxlbmd0aCA8PSAoc2l6ZV90KSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAoKChjaGFyICopIHJlY29yZCkgKyBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSksCi0JCTEsIHJlY29yZC0+aGVhZGVyLmxlbmd0aCAtIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpLAotCQlhYmZkKQotICAgICAgIT0gcmVjb3JkLT5oZWFkZXIubGVuZ3RoIC0gc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLXN0YXRpYyBzaXplX3QKLW9hc3lzX3N0cmluZ19sZW5ndGggKHJlY29yZCkKLSAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKnJlY29yZDsKLXsKLSAgcmV0dXJuIHJlY29yZC0+aGVhZGVyLmxlbmd0aAotICAgIC0gKChjaGFyICopIHJlY29yZC0+c3ltYm9sLm5hbWUgLSAoY2hhciAqKSByZWNvcmQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0KLVNsdXJwIHRoZSBzeW1ib2wgdGFibGUgYnkgcmVhZGluZyBpbiBhbGwgdGhlIHJlY29yZHMgYXQgdGhlIHN0YXJ0IGZpbGUKLXRpbGwgd2UgZ2V0IHRvIHRoZSBmaXJzdCBzZWN0aW9uIHJlY29yZC4KLQotV2UnbGwgc29ydCB0aGUgc3ltYm9sc3MgaW50byAgdHdvIGxpc3RzLCBkZWZpbmVkIGFuZCB1bmRlZmluZWQuIFRoZQotdW5kZWZpbmVkIHN5bWJvbHMgd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgdGFibGUgYWNjb3JkaW5nIHRvIHRoZWlyCi1yZWZuby4KLQotV2UgZG8gdGhpcyBieSBwbGFjaW5nIGFsbCB1bmRlZmluZWQgc3ltYm9scyBhdCB0aGUgZnJvbnQgb2YgdGhlIHRhYmxlCi1tb3ZpbmcgaW4sIGFuZCB0aGUgZGVmaW5lZCBzeW1ib2xzIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlIG1vdmluZyBiYWNrLgotCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKkNPTlNUIGFiZmQ7Ci17Ci0gIG9hc3lzX3JlY29yZF91bmlvbl90eXBlIHJlY29yZDsKLSAgb2FzeXNfZGF0YV90eXBlICpkYXRhID0gT0FTWVNfREFUQSAoYWJmZCk7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGFzeW1ib2wgKmRlc3RfZGVmaW5lZDsKLSAgYXN5bWJvbCAqZGVzdDsKLSAgY2hhciAqc3RyaW5nX3B0cjsKLQotCi0gIGlmIChkYXRhLT5zeW1ib2xzICE9IChhc3ltYm9sICopIE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAvKiBCdXkgZW5vdWdoIG1lbW9yeSBmb3IgYWxsIHRoZSBzeW1ib2xzIGFuZCBhbGwgdGhlIG5hbWVzICovCi0gIGRhdGEtPnN5bWJvbHMgPQotICAgIChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSAqIGFiZmQtPnN5bWNvdW50KTsKLSNpZmRlZiBVTkRFUlNDT1JFX0hBQ0sKLSAgLyogYnV5IDEgbW9yZSBjaGFyIGZvciBlYWNoIHN5bWJvbCB0byBrZWVwIHRoZSB1bmRlcnNjb3JlIGluKi8KLSAgZGF0YS0+c3RyaW5ncyA9IGJmZF9hbGxvYyAoYWJmZCwgZGF0YS0+c3ltYm9sX3N0cmluZ19sZW5ndGggKwotCQkJICAgICBhYmZkLT5zeW1jb3VudCk7Ci0jZWxzZQotICBkYXRhLT5zdHJpbmdzID0gYmZkX2FsbG9jIChhYmZkLCBkYXRhLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCk7Ci0jZW5kaWYKLSAgaWYgKCFkYXRhLT5zeW1ib2xzIHx8ICFkYXRhLT5zdHJpbmdzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkZXN0X2RlZmluZWQgPSBkYXRhLT5zeW1ib2xzICsgYWJmZC0+c3ltY291bnQgLSAxOwotCi0gIHN0cmluZ19wdHIgPSBkYXRhLT5zdHJpbmdzOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0KLSAgICAgIGlmICghIG9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCAmcmVjb3JkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKHJlY29yZC5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW06Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3N5bWJvbF9lbnVtOgotCSAgewotCSAgICBpbnQgZmxhZyA9IHJlY29yZC5oZWFkZXIudHlwZSA9PSAoaW50KSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bSA/Ci0JICAgIChCU0ZfTE9DQUwpIDogKEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUKTsKLQotCi0JICAgIHNpemVfdCBsZW5ndGggPSBvYXN5c19zdHJpbmdfbGVuZ3RoICgmcmVjb3JkKTsKLQkgICAgc3dpdGNoIChyZWNvcmQuc3ltYm9sLnJlbGIgJiBSRUxPQ0FUSU9OX1RZUEVfQklUUykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQUJTOgotCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07Ci0JCWRlc3QtPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQlkZXN0LT5mbGFncyA9IDA7Ci0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfUkVMOgotCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07Ci0JCWRlc3QtPnNlY3Rpb24gPQotCQkgIE9BU1lTX0RBVEEgKGFiZmQpLT5zZWN0aW9uc1tyZWNvcmQuc3ltYm9sLnJlbGIgJgotCQkJCQkgICAgICBSRUxPQ0FUSU9OX1NFQ1RfQklUU107Ci0JCWlmIChyZWNvcmQuaGVhZGVyLnR5cGUgPT0gKGludCkgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0pCi0JCSAgewotCQkgICAgZGVzdC0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JCSAgICBpZiAoZGVzdC0+c2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgKH4wKSkKLQkJICAgICAgewotCQkJLyogSXQgc2VlbXMgdGhhdCBzb21ldGltZXMgaW50ZXJuYWwgc3ltYm9scyBhcmUgdGllZCB1cCwgYnV0Ci0JCSAgICAgICBzdGlsbCBnZXQgb3V0cHV0LCBldmVuIHRob3VnaCB0aGVyZSBpcyBubwotCQkgICAgICAgc2VjdGlvbiAqLwotCQkJZGVzdC0+c2VjdGlvbiA9IDA7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0KLQkJICAgIGRlc3QtPmZsYWdzID0gZmxhZzsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKLQkJZGVzdCA9IGRhdGEtPnN5bWJvbHMgKyBiZmRfaF9nZXRfMTYgKGFiZmQsIHJlY29yZC5zeW1ib2wucmVmbm8pOwotCQlkZXN0LT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgotCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07Ci0JCWRlc3QtPm5hbWUgPSBzdHJpbmdfcHRyOwotCQlkZXN0LT50aGVfYmZkID0gYWJmZDsKLQotCQlkZXN0LT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07Ci0JCUJGRF9BU1NFUlQgKDApOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGRlc3QtPm5hbWUgPSBzdHJpbmdfcHRyOwotCSAgICBkZXN0LT50aGVfYmZkID0gYWJmZDsKLQkgICAgZGVzdC0+dWRhdGEucCA9IChQVFIpIE5VTEw7Ci0JICAgIGRlc3QtPnZhbHVlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuc3ltYm9sLnZhbHVlKTsKLQotI2lmZGVmIFVOREVSU0NPUkVfSEFDSwotCSAgICBpZiAocmVjb3JkLnN5bWJvbC5uYW1lWzBdICE9ICdfJykKLQkgICAgICB7Ci0JCXN0cmluZ19wdHJbMF0gPSAnXyc7Ci0JCXN0cmluZ19wdHIrKzsKLQkgICAgICB9Ci0jZW5kaWYKLQkgICAgbWVtY3B5IChzdHJpbmdfcHRyLCByZWNvcmQuc3ltYm9sLm5hbWUsIGxlbmd0aCk7Ci0KLQotCSAgICBzdHJpbmdfcHRyW2xlbmd0aF0gPSAwOwotCSAgICBzdHJpbmdfcHRyICs9IGxlbmd0aCArIDE7Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgbG9vcCA9IGZhbHNlOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgbG9uZwotb2FzeXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICpDT05TVCBhYmZkOwotewotICBpZiAoISBvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGFiZmQtPnN5bWNvdW50ICsgMSkgKiAoc2l6ZW9mIChvYXN5c19zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLS8qCi0qLwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWM7Ci0KLWxvbmcKLW9hc3lzX2dldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgYXN5bWJvbCAqc3ltYmFzZTsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGlmIChvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHN5bWJhc2UgPSBPQVNZU19EQVRBIChhYmZkKS0+c3ltYm9sczsKLSAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IGFiZmQtPnN5bWNvdW50OyBjb3VudGVyKyspCi0gICAgewotICAgICAgKihsb2NhdGlvbisrKSA9IHN5bWJhc2UrKzsKLSAgICB9Ci0gICpsb2NhdGlvbiA9IDA7Ci0gIHJldHVybiBhYmZkLT5zeW1jb3VudDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBhcmNoaXZlIHN0dWZmCi0qLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vYXN5c19hcmNoaXZlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgb2FzeXNfYXJjaGl2ZV9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIG9hc3lzX2V4dGFyY2hpdmVfaGVhZGVyX3R5cGUgaGVhZGVyX2V4dDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZpbGVfcHRyIGZpbGVwb3M7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIGZhbHNlKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKChQVFIpICYgaGVhZGVyX2V4dCwgMSwgc2l6ZW9mIChoZWFkZXJfZXh0KSwgYWJmZCkKLQkgICE9IHNpemVvZiAoaGVhZGVyX2V4dCkpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBoZWFkZXIudmVyc2lvbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC52ZXJzaW9uKTsKLSAgaGVhZGVyLm1vZF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5tb2RfY291bnQpOwotICBoZWFkZXIubW9kX3RibF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQubW9kX3RibF9vZmZzZXQpOwotICBoZWFkZXIuc3ltX3RibF9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnN5bV90Ymxfc2l6ZSk7Ci0gIGhlYWRlci5zeW1fY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQuc3ltX2NvdW50KTsKLSAgaGVhZGVyLnN5bV90Ymxfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnN5bV90Ymxfb2Zmc2V0KTsKLSAgaGVhZGVyLnhyZWZfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQueHJlZl9jb3VudCk7Ci0gIGhlYWRlci54cmVmX2xzdF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQueHJlZl9sc3Rfb2Zmc2V0KTsKLQotICAvKgotICAgIFRoZXJlIGlzbid0IGEgbWFnaWMgbnVtYmVyIGluIGFuIE9hc3lzIGFyY2hpdmUsIHNvIHRoZSBiZXN0IHdlCi0gICAgY2FuIGRvIHRvIHZlcmlmeSByZWFzbmFibGVuZXNzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgaW4KLSAgICB0aGUgaGVhZGVyIGFyZSB0b28gd2VpcmQKLSAgICAqLwotCi0gIGlmIChoZWFkZXIudmVyc2lvbiA+IDEwMDAwIHx8Ci0gICAgICBoZWFkZXIubW9kX2NvdW50ID4gMTAwMDAgfHwKLSAgICAgIGhlYWRlci5zeW1fY291bnQgPiAxMDAwMDAgfHwKLSAgICAgIGhlYWRlci54cmVmX2NvdW50ID4gMTAwMDAwKQotICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotCi0gIC8qCi0gICAgVGhhdCBhbGwgd29ya2VkLCBsZXQncyBidXkgdGhlIHNwYWNlIGZvciB0aGUgaGVhZGVyIGFuZCByZWFkIGluCi0gICAgdGhlIGhlYWRlcnMuCi0gICAgKi8KLSAgewotICAgIG9hc3lzX2FyX2RhdGFfdHlwZSAqYXIgPQotICAgIChvYXN5c19hcl9kYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX2FyX2RhdGFfdHlwZSkpOwotCi0gICAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqbW9kdWxlID0KLSAgICAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19tb2R1bGVfaW5mb190eXBlKSAqIGhlYWRlci5tb2RfY291bnQpOwotICAgIG9hc3lzX21vZHVsZV90YWJsZV90eXBlIHJlY29yZDsKLQotICAgIGlmICghYXIgfHwgIW1vZHVsZSkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgYWJmZC0+dGRhdGEub2FzeXNfYXJfZGF0YSA9IGFyOwotICAgIGFyLT5tb2R1bGUgPSBtb2R1bGU7Ci0gICAgYXItPm1vZHVsZV9jb3VudCA9IGhlYWRlci5tb2RfY291bnQ7Ci0KLSAgICBmaWxlcG9zID0gaGVhZGVyLm1vZF90Ymxfb2Zmc2V0OwotICAgIGZvciAoaSA9IDA7IGkgPCBoZWFkZXIubW9kX2NvdW50OyBpKyspCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCBmaWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBOVUxMOwotCi0JLyogVGhlcmUgYXJlIHR3byB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlIGFyY2hpdmUgaGVhZGVyICovCi0KLQlpZiAoMCkKLQkgIHsKLQkgICAgb2FzeXNfZXh0bW9kdWxlX3RhYmxlX3R5cGVfYV90eXBlIHJlY29yZF9leHQ7Ci0JICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiByZWNvcmRfZXh0LCAxLCBzaXplb2YgKHJlY29yZF9leHQpLCBhYmZkKQotCQkhPSBzaXplb2YgKHJlY29yZF9leHQpKQotCSAgICAgIHJldHVybiBOVUxMOwotCi0JICAgIHJlY29yZC5tb2Rfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5tb2Rfc2l6ZSk7Ci0JICAgIHJlY29yZC5maWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5maWxlX29mZnNldCk7Ci0KLQkgICAgcmVjb3JkLmRlcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBfY291bnQpOwotCSAgICByZWNvcmQuZGVwZWVfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwZWVfY291bnQpOwotCSAgICByZWNvcmQuc2VjdF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5zZWN0X2NvdW50KTsKLQotCSAgICBtb2R1bGVbaV0ubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgMzMpOwotCSAgICBpZiAoIW1vZHVsZVtpXS5uYW1lKQotCSAgICAgIHJldHVybiBOVUxMOwotCi0JICAgIG1lbWNweSAobW9kdWxlW2ldLm5hbWUsIHJlY29yZF9leHQubW9kX25hbWUsIDMzKTsKLQkgICAgZmlsZXBvcyArPQotCSAgICAgIHNpemVvZiAocmVjb3JkX2V4dCkgKwotCSAgICAgIHJlY29yZC5kZXBfY291bnQgKiA0ICsKLQkgICAgICByZWNvcmQuZGVwZWVfY291bnQgKiA0ICsKLQkgICAgICByZWNvcmQuc2VjdF9jb3VudCAqIDggKyAxODc7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBvYXN5c19leHRtb2R1bGVfdGFibGVfdHlwZV9iX3R5cGUgcmVjb3JkX2V4dDsKLQkgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHJlY29yZF9leHQsIDEsIHNpemVvZiAocmVjb3JkX2V4dCksIGFiZmQpCi0JCSE9IHNpemVvZiAocmVjb3JkX2V4dCkpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0KLQkgICAgcmVjb3JkLm1vZF9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0Lm1vZF9zaXplKTsKLQkgICAgcmVjb3JkLmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmZpbGVfb2Zmc2V0KTsKLQotCSAgICByZWNvcmQuZGVwX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcF9jb3VudCk7Ci0JICAgIHJlY29yZC5kZXBlZV9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBlZV9jb3VudCk7Ci0JICAgIHJlY29yZC5zZWN0X2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LnNlY3RfY291bnQpOwotCSAgICByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5tb2RfbmFtZV9sZW5ndGgpOwotCi0JICAgIG1vZHVsZVtpXS5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSArIDEpOwotCSAgICBpZiAoIW1vZHVsZVtpXS5uYW1lKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICBpZiAoYmZkX3JlYWQgKChQVFIpIG1vZHVsZVtpXS5uYW1lLCAxLCByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSwKLQkJCSAgYWJmZCkKLQkJIT0gcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIG1vZHVsZVtpXS5uYW1lW3JlY29yZC5tb2R1bGVfbmFtZV9zaXplXSA9IDA7Ci0JICAgIGZpbGVwb3MgKz0KLQkgICAgICBzaXplb2YgKHJlY29yZF9leHQpICsKLQkgICAgICByZWNvcmQuZGVwX2NvdW50ICogNCArCi0JICAgICAgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUgKyAxOwotCi0JICB9Ci0KLQotCW1vZHVsZVtpXS5zaXplID0gcmVjb3JkLm1vZF9zaXplOwotCW1vZHVsZVtpXS5wb3MgPSByZWNvcmQuZmlsZV9vZmZzZXQ7Ci0JbW9kdWxlW2ldLmFiZmQgPSAwOwotICAgICAgfQotCi0gIH0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi0gIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID0gKG9hc3lzX2RhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfZGF0YV90eXBlKSk7Ci0gIHJldHVybiBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA/IHRydWUgOiBmYWxzZTsKLX0KLQotI2RlZmluZSBNQVhfU0VDUyAxNgotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb2FzeXNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgb2FzeXNfZGF0YV90eXBlICpvYXN5czsKLSAgb2FzeXNfZGF0YV90eXBlICpzYXZlID0gT0FTWVNfREFUQSAoYWJmZCk7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGJvb2xlYW4gaGFkX3VzZWZ1bGwgPSBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA9IDA7Ci0gIG9hc3lzX21rb2JqZWN0IChhYmZkKTsKLSAgb2FzeXMgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgbWVtc2V0ICgoUFRSKSBvYXN5cy0+c2VjdGlvbnMsIDB4ZmYsIHNpemVvZiAob2FzeXMtPnNlY3Rpb25zKSk7Ci0KLSAgLyogUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGZhaWw7Ci0gIG9hc3lzLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCA9IDA7Ci0gIC8qIEluc3BlY3QgdGhlIHJlY29yZHMsIGJ1dCBvbmx5IGtlZXAgdGhlIHNlY3Rpb24gaW5mbyAtCi0gICAgIHJlbWVtYmVyIHRoZSBzaXplIG9mIHRoZSBzeW1ib2xzCi0gICAgICovCi0gIG9hc3lzLT5maXJzdF9kYXRhX3JlY29yZCA9IDA7Ci0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlIHJlY29yZDsKLSAgICAgIGlmICghIG9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCAmcmVjb3JkKSkKLQlnb3RvIGZhaWw7Ci0gICAgICBpZiAoKHNpemVfdCkgcmVjb3JkLmhlYWRlci5sZW5ndGggPCAoc2l6ZV90KSBzaXplb2YgKHJlY29yZC5oZWFkZXIpKQotCWdvdG8gZmFpbDsKLQotCi0gICAgICBzd2l0Y2ggKChvYXN5c19yZWNvcmRfZW51bV90eXBlKSAocmVjb3JkLmhlYWRlci50eXBlKSkKLQl7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW06Ci0JICBoYWRfdXNlZnVsbCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtOgotCSAgLyogQ291bnQgc3ltYm9scyBhbmQgcmVtZW1iZXIgdGhlaXIgc2l6ZSBmb3IgYSBmdXR1cmUgbWFsbG9jICAgKi8KLQkgIGFiZmQtPnN5bWNvdW50Kys7Ci0JICBvYXN5cy0+c3ltYm9sX3N0cmluZ19sZW5ndGggKz0gMSArIG9hc3lzX3N0cmluZ19sZW5ndGggKCZyZWNvcmQpOwotCSAgaGFkX3VzZWZ1bGwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtOgotCSAgewotCSAgICBhc2VjdGlvbiAqczsKLQkgICAgY2hhciAqYnVmZmVyOwotCSAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9udW1iZXI7Ci0JICAgIGlmIChyZWNvcmQuc2VjdGlvbi5oZWFkZXIubGVuZ3RoICE9IHNpemVvZiAocmVjb3JkLnNlY3Rpb24pKQotCSAgICAgIHsKLQkJZ290byBmYWlsOwotCSAgICAgIH0KLQkgICAgYnVmZmVyID0gYmZkX2FsbG9jIChhYmZkLCAzKTsKLQkgICAgaWYgKCFidWZmZXIpCi0JICAgICAgZ290byBmYWlsOwotCSAgICBzZWN0aW9uX251bWJlciA9IHJlY29yZC5zZWN0aW9uLnJlbGIgJiBSRUxPQ0FUSU9OX1NFQ1RfQklUUzsKLQkgICAgc3ByaW50ZiAoYnVmZmVyLCAiJXUiLCBzZWN0aW9uX251bWJlcik7Ci0JICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBidWZmZXIpOwotCSAgICBvYXN5cy0+c2VjdGlvbnNbc2VjdGlvbl9udW1iZXJdID0gczsKLQkgICAgc3dpdGNoIChyZWNvcmQuc2VjdGlvbi5yZWxiICYgUkVMT0NBVElPTl9UWVBFX0JJVFMpCi0JICAgICAgewotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9SRUw6Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9DT006Ci0JCUJGRF9GQUlMICgpOwotCSAgICAgIH0KLQotCSAgICBzLT5fcmF3X3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZC5zZWN0aW9uLnZhbHVlKTsKLQkgICAgcy0+dm1hID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuc2VjdGlvbi52bWEpOwotCSAgICBzLT5mbGFncyA9IDA7Ci0JICAgIGhhZF91c2VmdWxsID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bToKLQkgIG9hc3lzLT5maXJzdF9kYXRhX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKSAtIHJlY29yZC5oZWFkZXIubGVuZ3RoOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2RlYnVnX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbW9kdWxlX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbmFtZWRfc2VjdGlvbl9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2VuZF9lbnVtOgotCSAgaWYgKGhhZF91c2VmdWxsID09IGZhbHNlKQotCSAgICBnb3RvIGZhaWw7Ci0JICBsb29wID0gZmFsc2U7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZ290byBmYWlsOwotCX0KLSAgICB9Ci0gIG9hc3lzLT5zeW1ib2xzID0gKGFzeW1ib2wgKikgTlVMTDsKLSAgLyoKLSAgICBPYXN5cyBzdXBwb3J0IHNldmVyYWwgYXJjaGl0ZWN0dXJlcywgYnV0IEkgY2FuJ3Qgc2VlIGEgc2ltcGxlIHdheQotICAgIHRvIGRpc2NvdmVyIHdoaWNoIG9uZSBpcyBpbiBhIHBhcnRpY3VsYXIgZmlsZSAtIHdlJ2xsIGd1ZXNzCi0gICAgKi8KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7Ci0gIGlmIChhYmZkLT5zeW1jb3VudCAhPSAwKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotICAgIH0KLQotICAvKgotICAgIFdlIGRvbid0IGtub3cgaWYgYSBzZWN0aW9uIGhhcyBkYXRhIHVudGlsIHdlJ3ZlIHJlYWQgaXQuLgotICAgICovCi0KLSAgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKTsKLQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi1mYWlsOgotICAodm9pZCkgYmZkX3JlbGVhc2UgKGFiZmQsIG9hc3lzKTsKLSAgYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPSBzYXZlOwotICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLX0KLQotCi1zdGF0aWMgdm9pZAotb2FzeXNfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLSAgaWYgKCFzeW1ib2wtPnNlY3Rpb24pCi0gICAgcmV0LT50eXBlID0gKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpID8gJ2EnIDogJ0EnOwotfQotCi1zdGF0aWMgdm9pZAotb2FzeXNfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMID8KLQkoQ09OU1QgY2hhciAqKSAiKmFicyIgOiBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkJIHNlY3Rpb25fbmFtZSwKLQkJIHN5bWJvbC0+bmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0vKgotIFRoZSBob3d0byB0YWJsZSBpcyBidWlsZCB1c2luZyB0aGUgdG9wIHR3byBiaXRzIG9mIGEgcmVsb2MgYnl0ZSB0bwotIGluZGV4IGludG8gaXQuIFRoZSBiaXRzIGFyZSBQQ1JFTCxXT1JEL0xPTkcKLSovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KLXsKLQotICBIT1dUTyAoMCwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgInBjcmVsMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPICgwLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicGNyZWwzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKQotfTsKLQotLyogUmVhZCBpbiBhbGwgdGhlIHNlY3Rpb24gZGF0YSBhbmQgcmVsb2NhdGlvbiBzdHVmZiB0b28gKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqQ09OU1QgYWJmZDsKLXsKLSAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgcmVjb3JkOwotICBvYXN5c19kYXRhX3R5cGUgKmRhdGEgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLQotICBvYXN5c19wZXJfc2VjdGlvbl90eXBlICpwZXI7Ci0KLSAgYXNlY3Rpb24gKnM7Ci0KLSAgLyogU2VlIGlmIHRoZSBkYXRhIGhhcyBiZWVuIHNsdXJwZWQgYWxyZWFkeSAuLiAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgcGVyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHMpOwotICAgICAgaWYgKHBlci0+aW5pdGlhbGl6ZWQgPT0gdHJ1ZSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGRhdGEtPmZpcnN0X2RhdGFfcmVjb3JkID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBkYXRhLT5maXJzdF9kYXRhX3JlY29yZCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3dpdGNoIChyZWNvcmQuaGVhZGVyLnR5cGUpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZGF0YV9lbnVtOgotCSAgewotCi0JICAgIGJmZF9ieXRlICpzcmMgPSByZWNvcmQuZGF0YS5kYXRhOwotCSAgICBiZmRfYnl0ZSAqZW5kX3NyYyA9ICgoYmZkX2J5dGUgKikgJiByZWNvcmQpICsgcmVjb3JkLmhlYWRlci5sZW5ndGg7Ci0JICAgIGJmZF9ieXRlICpkc3RfcHRyOwotCSAgICBiZmRfYnl0ZSAqZHN0X2Jhc2VfcHRyOwotCSAgICB1bnNpZ25lZCBpbnQgcmVsYml0OwotCSAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JICAgIGFzZWN0aW9uICpzZWN0aW9uID0KLQkgICAgZGF0YS0+c2VjdGlvbnNbcmVjb3JkLmRhdGEucmVsYiAmIFJFTE9DQVRJT05fU0VDVF9CSVRTXTsKLQkgICAgYmZkX3ZtYSBkc3Rfb2Zmc2V0OwotCi0JICAgIHBlciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKTsKLQotCSAgICBpZiAocGVyLT5pbml0aWFsaXplZCA9PSBmYWxzZSkKLQkgICAgICB7Ci0JCXBlci0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotCQlpZiAoIXBlci0+ZGF0YSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXBlci0+cmVsb2NfdGFpbF9wdHIgPSAob2FzeXNfcmVsb2NfdHlwZSAqKikgJiAoc2VjdGlvbi0+cmVsb2NhdGlvbik7Ci0JCXBlci0+aGFkX3ZtYSA9IGZhbHNlOwotCQlwZXItPmluaXRpYWxpemVkID0gdHJ1ZTsKLQkJc2VjdGlvbi0+cmVsb2NfY291bnQgPSAwOwotCQlzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgICB9Ci0KLQkgICAgZHN0X29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLmRhdGEuYWRkcik7Ci0JICAgIGlmIChwZXItPmhhZF92bWEgPT0gZmFsc2UpCi0JICAgICAgewotCQkvKiBUYWtlIHRoZSBmaXJzdCB2bWEgd2Ugc2VlIGFzIHRoZSBiYXNlICovCi0JCXNlY3Rpb24tPnZtYSA9IGRzdF9vZmZzZXQ7Ci0JCXBlci0+aGFkX3ZtYSA9IHRydWU7Ci0JICAgICAgfQotCi0JICAgIGRzdF9vZmZzZXQgLT0gc2VjdGlvbi0+dm1hOwotCi0JICAgIGRzdF9iYXNlX3B0ciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YTsKLQkgICAgZHN0X3B0ciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSArCi0JICAgICAgZHN0X29mZnNldDsKLQotCSAgICBpZiAoc3JjIDwgZW5kX3NyYykKLQkgICAgICB7Ci0JCXNlY3Rpb24tPmZsYWdzIHw9IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLQkgICAgICB9Ci0JICAgIHdoaWxlIChzcmMgPCBlbmRfc3JjKQotCSAgICAgIHsKLQkJdW5zaWduZWQgY2hhciBtb2RfYnl0ZSA9ICpzcmMrKzsKLQkJc2l6ZV90IGdhcCA9IGVuZF9zcmMgLSBzcmM7Ci0KLQkJY291bnQgPSA4OwotCQlpZiAobW9kX2J5dGUgPT0gMCAmJiBnYXAgPj0gOCkKLQkJICB7Ci0JCSAgICBkc3RfcHRyWzBdID0gc3JjWzBdOwotCQkgICAgZHN0X3B0clsxXSA9IHNyY1sxXTsKLQkJICAgIGRzdF9wdHJbMl0gPSBzcmNbMl07Ci0JCSAgICBkc3RfcHRyWzNdID0gc3JjWzNdOwotCQkgICAgZHN0X3B0cls0XSA9IHNyY1s0XTsKLQkJICAgIGRzdF9wdHJbNV0gPSBzcmNbNV07Ci0JCSAgICBkc3RfcHRyWzZdID0gc3JjWzZdOwotCQkgICAgZHN0X3B0cls3XSA9IHNyY1s3XTsKLQkJICAgIGRzdF9wdHIgKz0gODsKLQkJICAgIHNyYyArPSA4OwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGZvciAocmVsYml0ID0gMTsgY291bnQtLSAhPSAwICYmIHNyYyA8IGVuZF9zcmM7IHJlbGJpdCA8PD0gMSkKLQkJICAgICAgewotCQkJaWYgKHJlbGJpdCAmIG1vZF9ieXRlKQotCQkJICB7Ci0JCQkgICAgdW5zaWduZWQgY2hhciByZWxvYyA9ICpzcmM7Ci0JCQkgICAgLyogVGhpcyBpdGVtIG5lZWRzIHRvIGJlIHJlbG9jYXRlZCAqLwotCQkJICAgIHN3aXRjaCAocmVsb2MgJiBSRUxPQ0FUSU9OX1RZUEVfQklUUykKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKLQotCQkJCWJyZWFrOwotCi0JCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9SRUw6Ci0JCQkJewotCQkJCSAgLyogUmVsb2NhdGUgdGhlIGl0ZW0gcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24gKi8KLQkJCQkgIG9hc3lzX3JlbG9jX3R5cGUgKnIgPQotCQkJCSAgKG9hc3lzX3JlbG9jX3R5cGUgKikKLQkJCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgICBzaXplb2YgKG9hc3lzX3JlbG9jX3R5cGUpKTsKLQkJCQkgIGlmICghcikKLQkJCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJCSAgKihwZXItPnJlbG9jX3RhaWxfcHRyKSA9IHI7Ci0JCQkJICBwZXItPnJlbG9jX3RhaWxfcHRyID0gJnItPm5leHQ7Ci0JCQkJICByLT5uZXh0ID0gKG9hc3lzX3JlbG9jX3R5cGUgKikgTlVMTDsKLQkJCQkgIC8qIFJlZmVyZW5jZSB0byB1bmRlZmluZWQgc3ltYm9sICovCi0JCQkJICBzcmMrKzsKLQkJCQkgIC8qIFRoZXJlIGlzIG5vIHN5bWJvbCAqLwotCQkJCSAgci0+c3ltYm9sID0gMDsKLQkJCQkgIC8qIFdvcmsgb3V0IHRoZSBob3d0byAqLwotCQkJCSAgYWJvcnQgKCk7Ci0jaWYgMAotCQkJCSAgci0+cmVsZW50LnNlY3Rpb24gPQotCQkJCSAgICBkYXRhLT5zZWN0aW9uc1tyZWxvYyAmCi0JCQkJCQkgICBSRUxPQ0FUSU9OX1NFQ1RfQklUU107Ci0KLQkJCQkgIHItPnJlbGVudC5hZGRlbmQgPSAtCi0JCQkJICAgIHItPnJlbGVudC5zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQkJCQkgIHItPnJlbGVudC5hZGRyZXNzID0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKLQkJCQkgIHItPnJlbGVudC5ob3d0byA9ICZob3d0b190YWJsZVtyZWxvYyA+PiA2XTsKLQkJCQkgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBOVUxMOwotCQkJCSAgc2VjdGlvbi0+cmVsb2NfY291bnQrKzsKLQotCQkJCSAgLyogRmFrZSB1cCB0aGUgZGF0YSB0byBsb29rIGxpa2UgaXQncyBnb3QgdGhlIC12ZSBwYyBpbiBpdCwgdGhpcyBtYWtlcwotCQkJCSAgICAgICBpdCBtdWNoIGVhc2llciB0byBjb252ZXJ0IGludG8gb3RoZXIgZm9ybWF0cy4gVGhpcyBpcyBkb25lIGJ5Ci0JCQkJICAgICAgIGhpdHRpbmcgdGhlIGFkZGVuZC4KLQkJCQkgICAgICAgKi8KLQkJCQkgIGlmIChyLT5yZWxlbnQuaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0JCQkJICAgIHsKLQkJCQkgICAgICByLT5yZWxlbnQuYWRkZW5kIC09IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7Ci0JCQkJICAgIH0KLQotCi0JCQkJfQotCQkJCWJyZWFrOwotCi0KLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKLQkJCQl7Ci0JCQkJICBvYXN5c19yZWxvY190eXBlICpyID0KLQkJCQkgIChvYXN5c19yZWxvY190eXBlICopCi0JCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgICAgc2l6ZW9mIChvYXN5c19yZWxvY190eXBlKSk7Ci0JCQkJICBpZiAoIXIpCi0JCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCQkgICoocGVyLT5yZWxvY190YWlsX3B0cikgPSByOwotCQkJCSAgcGVyLT5yZWxvY190YWlsX3B0ciA9ICZyLT5uZXh0OwotCQkJCSAgci0+bmV4dCA9IChvYXN5c19yZWxvY190eXBlICopIE5VTEw7Ci0JCQkJICAvKiBSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIHN5bWJvbCAqLwotCQkJCSAgc3JjKys7Ci0JCQkJICAvKiBHZXQgc3ltYm9sIG51bWJlciAqLwotCQkJCSAgci0+c3ltYm9sID0gKHNyY1swXSA8PCA4KSB8IHNyY1sxXTsKLQkJCQkgIC8qIFdvcmsgb3V0IHRoZSBob3d0byAqLwotCQkJCSAgYWJvcnQgKCk7Ci0KLSNpZiAwCi0JCQkJICByLT5yZWxlbnQuc2VjdGlvbiA9IChhc2VjdGlvbgotCQkJCQkJICAgICAgICopIE5VTEw7Ci0jZW5kaWYKLQkJCQkgIHItPnJlbGVudC5hZGRlbmQgPSAwOwotCQkJCSAgci0+cmVsZW50LmFkZHJlc3MgPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmhvd3RvX3RhYmxlW3JlbG9jID4+IDZdOwotCQkJCSAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0JCQkJICBzZWN0aW9uLT5yZWxvY19jb3VudCsrOwotCi0JCQkJICBzcmMgKz0gMjsKLQkJCQkgIC8qIEZha2UgdXAgdGhlIGRhdGEgdG8gbG9vayBsaWtlIGl0J3MgZ290IHRoZSAtdmUgcGMgaW4gaXQsIHRoaXMgbWFrZXMKLQkJCQkgICAgICAgaXQgbXVjaCBlYXNpZXIgdG8gY29udmVydCBpbnRvIG90aGVyIGZvcm1hdHMuIFRoaXMgaXMgZG9uZSBieQotCQkJCSAgICAgICBoaXR0aW5nIHRoZSBhZGRlbmQuCi0JCQkJICAgICAgICovCi0JCQkJICBpZiAoci0+cmVsZW50Lmhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotCQkJCSAgICB7Ci0JCQkJICAgICAgci0+cmVsZW50LmFkZGVuZCAtPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgICB9Ci0KLQotCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgotCQkJCUJGRF9GQUlMICgpOwotCQkJICAgICAgfQotCQkJICB9Ci0JCQkqZHN0X3B0cisrID0gKnNyYysrOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICBuZXdzZWN0LT51c2VkX2J5X2JmZCA9IChQVFIpCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUpKTsKLSAgaWYgKCFuZXdzZWN0LT51c2VkX2J5X2JmZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPnNlY3Rpb24gPSBuZXdzZWN0OwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPm9mZnNldCA9IDA7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+aW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMTsKLSAgLyogVHVybiB0aGUgc2VjdGlvbiBzdHJpbmcgaW50byBhbiBpbmRleCAqLwotCi0gIHNzY2FuZiAobmV3c2VjdC0+bmFtZSwgIiV1IiwgJm5ld3NlY3QtPnRhcmdldF9pbmRleCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGxvbmcKLW9hc3lzX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKCEgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgb2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqcCA9IChvYXN5c19wZXJfc2VjdGlvbl90eXBlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpOwotICBpZiAocC0+aW5pdGlhbGl6ZWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgKHZvaWQpIG1lbXNldCAobG9jYXRpb24sIDAsIChpbnQpIGNvdW50KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAodm9pZCkgbWVtY3B5IChsb2NhdGlvbiwgKFBUUikgKHAtPmRhdGEgKyBvZmZzZXQpLCAoaW50KSBjb3VudCk7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1sb25nCi1vYXN5c19jYW5vbmljYWxpemVfcmVsb2MgKGlnbm9yZV9hYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBpbnQgcmVsb2NfY291bnQgPSAwOwotICBvYXN5c19yZWxvY190eXBlICpzcmMgPSAob2FzeXNfcmVsb2NfdHlwZSAqKSAoc2VjdGlvbi0+cmVsb2NhdGlvbik7Ci0gIHdoaWxlIChzcmMgIT0gKG9hc3lzX3JlbG9jX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLQotI2lmIDAKLSAgICAgIGlmIChzcmMtPnJlbGVudC5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0gc3ltYm9scyArIHNyYy0+c3ltYm9sOwotCX0KLSNlbmRpZgotCi0gICAgICAqcmVscHRyKysgPSAmc3JjLT5yZWxlbnQ7Ci0gICAgICBzcmMgPSBzcmMtPm5leHQ7Ci0gICAgICByZWxvY19jb3VudCsrOwotICAgIH0KLSAgKnJlbHB0ciA9IChhcmVsZW50ICopIE5VTEw7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudCA9IHJlbG9jX2NvdW50OwotfQotCi0KLQotCi0vKiBXcml0aW5nICovCi0KLQotLyogQ2FsY3VsYXRlIHRoZSBjaGVja3N1bSBhbmQgd3JpdGUgb25lIHJlY29yZCAqLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwgdHlwZSwgcmVjb3JkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG9hc3lzX3JlY29yZF9lbnVtX3R5cGUgdHlwZTsKLSAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKnJlY29yZDsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIGludCBjaGVja3N1bTsKLSAgc2l6ZV90IGk7Ci0gIHVuc2lnbmVkIGNoYXIgKnB0cjsKLQotICByZWNvcmQtPmhlYWRlci5sZW5ndGggPSBzaXplOwotICByZWNvcmQtPmhlYWRlci50eXBlID0gKGludCkgdHlwZTsKLSAgcmVjb3JkLT5oZWFkZXIuY2hlY2tfc3VtID0gMDsKLSAgcmVjb3JkLT5oZWFkZXIuZmlsbCA9IDA7Ci0gIHB0ciA9ICh1bnNpZ25lZCBjaGFyICopICZyZWNvcmQtPnBhZFswXTsKLSAgY2hlY2tzdW0gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGNoZWNrc3VtICs9ICpwdHIrKzsKLSAgICB9Ci0gIHJlY29yZC0+aGVhZGVyLmNoZWNrX3N1bSA9IDB4ZmYgJiAoLWNoZWNrc3VtKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcmVjb3JkLCAxLCBzaXplLCBhYmZkKSAhPSBzaXplKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogV3JpdGUgb3V0IGFsbCB0aGUgc3ltYm9scyAqLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX3N5bXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBhc3ltYm9sICoqZ2VuZXJpYyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpbmRleCA9IDA7Ci0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOyBjb3VudCsrKQotICAgIHsKLQotICAgICAgb2FzeXNfc3ltYm9sX3JlY29yZF90eXBlIHN5bWJvbDsKLSAgICAgIGFzeW1ib2wgKkNPTlNUIGcgPSBnZW5lcmljW2NvdW50XTsKLQotICAgICAgQ09OU1QgY2hhciAqc3JjID0gZy0+bmFtZTsKLSAgICAgIGNoYXIgKmRzdCA9IHN5bWJvbC5uYW1lOwotICAgICAgdW5zaWduZWQgaW50IGwgPSAwOwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChnLT5zZWN0aW9uKSkKLQl7Ci0JICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9DT007Ci0JICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluZGV4LCBzeW1ib2wucmVmbm8pOwotCSAgaW5kZXgrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGctPnNlY3Rpb24pKQotCXsKLQkgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX0FCUzsKLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgMCwgc3ltYm9sLnJlZm5vKTsKLQotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoZy0+c2VjdGlvbikpCi0JewotCSAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfVU5EOwotCSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbmRleCwgc3ltYm9sLnJlZm5vKTsKLQkgIC8qIE92ZXJsb2FkIHRoZSB2YWx1ZSBmaWVsZCB3aXRoIHRoZSBvdXRwdXQgaW5kZXggbnVtYmVyICovCi0JICBpbmRleCsrOwotCX0KLSAgICAgIGVsc2UgaWYgKGctPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLQl7Ci0JICAvKiB0aHJvdyBpdCBhd2F5ICovCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGctPnNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBTb21ldGltZSwgdGhlIG9hc3lzIHRvb2xzIGdpdmUgb3V0IGEgc3ltYm9sIHdpdGggaWxsZWdhbAotCSAgIGJpdHMgaW4gaXQsIHdlJ2xsIG91dHB1dCBpdCBpbiB0aGUgc2FtZSBicm9rZW4gd2F5ICovCi0KLQkgICAgICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9SRUwgfCAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9SRUwgfCBnLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgICB9Ci0JICBiZmRfaF9wdXRfMTYgKGFiZmQsIDAsIHN5bWJvbC5yZWZubyk7Ci0JfQotI2lmZGVmIFVOREVSU0NPUkVfSEFDSwotICAgICAgaWYgKHNyY1tsXSA9PSAnXycpCi0JZHN0W2wrK10gPSAnLic7Ci0jZW5kaWYKLSAgICAgIHdoaWxlIChzcmNbbF0pCi0JewotCSAgZHN0W2xdID0gc3JjW2xdOwotCSAgbCsrOwotCX0KLQotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBnLT52YWx1ZSwgc3ltYm9sLnZhbHVlKTsKLQotCi0gICAgICBpZiAoZy0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JewotCSAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJCSAgICBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bSwKLQkJCQkgICAgKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgc3ltYm9sLAotCQkJCSAgICBvZmZzZXRvZiAob2FzeXNfc3ltYm9sX3JlY29yZF90eXBlLAotCQkJCQkgICAgICBuYW1lWzBdKSArIGwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCQkgICAgb2FzeXNfcmVjb3JkX2lzX3N5bWJvbF9lbnVtLAotCQkJCSAgICAob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiBzeW1ib2wsCi0JCQkJICAgIG9mZnNldG9mIChvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGUsCi0JCQkJCSAgICAgIG5hbWVbMF0pICsgbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBnLT52YWx1ZSA9IGluZGV4IC0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotIC8qIFdyaXRlIGEgc2VjdGlvbiBoZWFkZXIgZm9yIGVhY2ggc2VjdGlvbiAqLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX3NlY3Rpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBzdGF0aWMgb2FzeXNfc2VjdGlvbl9yZWNvcmRfdHlwZSBvdXQ7Ci0KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHMtPm5hbWVbMF0pKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYCVzJyBpbiBvYXN5cyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHMtPm5hbWUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgb3V0LnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfUkVMIHwgcy0+dGFyZ2V0X2luZGV4OwotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzLT5fY29va2VkX3NpemUsIG91dC52YWx1ZSk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHMtPnZtYSwgb3V0LnZtYSk7Ci0KLSAgICAgIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCQlvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtLAotCQkJCShvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIG91dCwKLQkJCQlzaXplb2YgKG91dCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIENyZWF0ZSBhbmQgd3JpdGUgdGhlIGhlYWRlciAqLwotICBvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGUgcjsKLSAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbiAoYWJmZC0+ZmlsZW5hbWUpOwotICBpZiAobGVuZ3RoID4gKHNpemVfdCkgc2l6ZW9mIChyLm1vZHVsZV9uYW1lKSkKLSAgICB7Ci0gICAgICBsZW5ndGggPSBzaXplb2YgKHIubW9kdWxlX25hbWUpOwotICAgIH0KLQotICAodm9pZCkgbWVtY3B5IChyLm1vZHVsZV9uYW1lLAotCQkgYWJmZC0+ZmlsZW5hbWUsCi0JCSBsZW5ndGgpOwotICAodm9pZCkgbWVtc2V0IChyLm1vZHVsZV9uYW1lICsgbGVuZ3RoLAotCQkgJyAnLAotCQkgc2l6ZW9mIChyLm1vZHVsZV9uYW1lKSAtIGxlbmd0aCk7Ci0KLSAgci52ZXJzaW9uX251bWJlciA9IE9BU1lTX1ZFUlNJT05fTlVNQkVSOwotICByLnJldl9udW1iZXIgPSBPQVNZU19SRVZfTlVNQkVSOwotICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkgICAgb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtLAotCQkJICAgIChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIHIsCi0JCQkgICAgb2Zmc2V0b2YgKG9hc3lzX2hlYWRlcl9yZWNvcmRfdHlwZSwKLQkJCQkgICAgICBkZXNjcmlwdGlvblswXSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX2VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBvYXN5c19lbmRfcmVjb3JkX3R5cGUgZW5kOwotICB1bnNpZ25lZCBjaGFyIG51bGwgPSAwOwotICBlbmQucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9BQlM7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYWJmZC0+c3RhcnRfYWRkcmVzcywgZW5kLmVudHJ5KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCAwLCBlbmQuZmlsbCk7Ci0gIGVuZC56ZXJvID0gMDsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJICAgIG9hc3lzX3JlY29yZF9pc19lbmRfZW51bSwKLQkJCSAgICAob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiBlbmQsCi0JCQkgICAgc2l6ZW9mIChlbmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICYgbnVsbCwgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1jb21wIChhcCwgYnApCi0gICAgIENPTlNUIFBUUiBhcDsKLSAgICAgQ09OU1QgUFRSIGJwOwotewotICBhcmVsZW50ICphID0gKigoYXJlbGVudCAqKikgYXApOwotICBhcmVsZW50ICpiID0gKigoYXJlbGVudCAqKikgYnApOwotICByZXR1cm4gYS0+YWRkcmVzcyAtIGItPmFkZHJlc3M7Ci19Ci0KLS8qCi0gV3JpdGluZyBkYXRhLi4KLQotKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9kYXRhIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCi0JewotCSAgYmZkX2J5dGUgKnJhd19kYXRhID0gb2FzeXNfcGVyX3NlY3Rpb24gKHMpLT5kYXRhOwotCSAgb2FzeXNfZGF0YV9yZWNvcmRfdHlwZSBwcm9jZXNzZWRfZGF0YTsKLQkgIGJmZF9zaXplX3R5cGUgY3VycmVudF9ieXRlX2luZGV4ID0gMDsKLQkgIHVuc2lnbmVkIGludCByZWxvY3NfdG9fZ28gPSBzLT5yZWxvY19jb3VudDsKLQkgIGFyZWxlbnQgKipwID0gcy0+b3JlbG9jYXRpb247Ci0JICBpZiAocy0+cmVsb2NfY291bnQgIT0gMCkKLQkgICAgewotLyogU29ydCB0aGUgcmVsb2MgcmVjb3JkcyBzbyBpdCdzIGVhc3kgdG8gaW5zZXJ0IHRoZSByZWxvY3MgaW50byB0aGUKLQkgICBkYXRhICovCi0KLQkgICAgICBxc29ydCAocy0+b3JlbG9jYXRpb24sCi0JCSAgICAgcy0+cmVsb2NfY291bnQsCi0JCSAgICAgc2l6ZW9mIChhcmVsZW50ICoqKSwKLQkJICAgICBjb21wKTsKLQkgICAgfQotCSAgY3VycmVudF9ieXRlX2luZGV4ID0gMDsKLQkgIHByb2Nlc3NlZF9kYXRhLnJlbGIgPSBzLT50YXJnZXRfaW5kZXggfCBSRUxPQ0FUSU9OX1RZUEVfUkVMOwotCi0JICB3aGlsZSAoY3VycmVudF9ieXRlX2luZGV4IDwgcy0+X2Nvb2tlZF9zaXplKQotCSAgICB7Ci0JICAgICAgLyogU2NhbiBmb3J3YXJkcyBieSBlaWdodCBieXRlcyBvciBob3dldmVyIG11Y2ggaXMgbGVmdCBhbmQgc2VlIGlmCi0JICAgICAgIHRoZXJlIGFyZSBhbnkgcmVsb2NhdGlvbnMgZ29pbmcgb24gKi8KLQkgICAgICBiZmRfYnl0ZSAqbW9kID0gJnByb2Nlc3NlZF9kYXRhLmRhdGFbMF07Ci0JICAgICAgYmZkX2J5dGUgKmRzdCA9ICZwcm9jZXNzZWRfZGF0YS5kYXRhWzFdOwotCi0JICAgICAgdW5zaWduZWQgaW50IGkgPSAwOwotCSAgICAgICptb2QgPSAwOwotCi0KLQkgICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHMtPnZtYSArIGN1cnJlbnRfYnl0ZV9pbmRleCwKLQkJCSAgICBwcm9jZXNzZWRfZGF0YS5hZGRyKTsKLQotCSAgICAgIC8qIERvbid0IHN0YXJ0IGEgcmVsb2NhdGlvbiB1bmxlc3MgeW91J3JlIHN1cmUgeW91IGNhbiBmaW5pc2ggaXQKLSAJICAgICAgIHdpdGhpbiB0aGUgc2FtZSBkYXRhIHJlY29yZC4gIFRoZSB3b3JzdCBjYXNlIHJlbG9jYXRpb24gaXMgYQotIAkgICAgICAgNC1ieXRlIHJlbG9jYXRhYmxlIHZhbHVlIHdoaWNoIGlzIHNwbGl0IGFjcm9zcyB0d28gbW9kaWZpY2F0aW9uCi0gCSAgICAgICBieXRlcyAoMSByZWxvY2F0aW9uIGJ5dGUgKyAyIHN5bWJvbCByZWZlcmVuY2UgYnl0ZXMgKyAyIGRhdGEgKwotIAkgICAgICAgMSBtb2RpZmljYXRpb24gYnl0ZSArIDIgZGF0YSA9IDggYnl0ZXMgdG90YWwpLiAgVGhhdCdzIHdoZXJlCi0gCSAgICAgICB0aGUgbWFnaWMgbnVtYmVyIDggY29tZXMgZnJvbS4KLSAJICAgICovCi0JICAgICAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9yYXdfc2l6ZSAmJiBkc3QgPD0KLQkJICAgICAmcHJvY2Vzc2VkX2RhdGEuZGF0YVtzaXplb2YgKHByb2Nlc3NlZF9kYXRhLmRhdGEpIC0gOF0pCi0JCXsKLQotCi0JCSAgaWYgKHJlbG9jc190b19nbyAhPSAwKQotCQkgICAgewotCQkgICAgICBhcmVsZW50ICpyID0gKnA7Ci0JCSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmNvbnN0IGhvdyA9IHItPmhvd3RvOwotCQkgICAgICAvKiBUaGVyZSBpcyBhIHJlbG9jYXRpb24sIGlzIGl0IGZvciB0aGlzIGJ5dGUgPyAqLwotCQkgICAgICBpZiAoci0+YWRkcmVzcyA9PSBjdXJyZW50X2J5dGVfaW5kZXgpCi0JCQl7Ci0JCQkgIHVuc2lnbmVkIGNoYXIgcmVsX2J5dGU7Ci0KLQkJCSAgcCsrOwotCQkJICByZWxvY3NfdG9fZ28tLTsKLQotCQkJICAqbW9kIHw9ICgxIDw8IGkpOwotCQkJICBpZiAoaG93LT5wY19yZWxhdGl2ZSkKLQkJCSAgICB7Ci0JCQkgICAgICByZWxfYnl0ZSA9IFJFTE9DQVRJT05fUENSRUxfQklUOwotCi0JCQkgICAgICAvKiBBbHNvIHBhdGNoIHRoZSByYXcgZGF0YSBzbyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQotCQkJIHRoZSAtdmUgc3R1ZmYgYW55IG1vcmUgKi8KLQkJCSAgICAgIGlmIChob3ctPnNpemUgIT0gMikKLQkJCQl7Ci0JCQkJICBiZmRfcHV0XzE2IChhYmZkLAotCQkJCQkgICAgICBiZmRfZ2V0XzE2IChhYmZkLCByYXdfZGF0YSkgKwotCQkJCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXgsIHJhd19kYXRhKTsKLQkJCQl9Ci0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBiZmRfcHV0XzMyIChhYmZkLAotCQkJCQkgICAgICBiZmRfZ2V0XzMyIChhYmZkLCByYXdfZGF0YSkgKwotCQkJCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXgsIHJhd19kYXRhKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgcmVsX2J5dGUgPSAwOwotCQkJICAgIH0KLQkJCSAgaWYgKGhvdy0+c2l6ZSA9PSAyKQotCQkJICAgIHsKLQkJCSAgICAgIHJlbF9ieXRlIHw9IFJFTE9DQVRJT05fMzJCSVRfQklUOwotCQkJICAgIH0KLQotCQkJICAvKiBJcyB0aGlzIGEgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLCBvciBhIHN5bWJvbAotCQkgICAgICAgcmVsYXRpdmUgcmVsb2NhdGlvbiA/ICovCi0JCQkgIGFib3J0ICgpOwotCi0jaWYgMAotCQkJICBpZiAoci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBUaGUgcmVsZW50IGhhcyBhIHNlY3Rpb24gYXR0YWNoZWQsIHNvIGl0IG11c3QgYmUgc2VjdGlvbgotCQkJICAgICByZWxhdGl2ZSAqLwotCQkJICAgICAgcmVsX2J5dGUgfD0gUkVMT0NBVElPTl9UWVBFX1JFTDsKLQkJCSAgICAgIHJlbF9ieXRlIHw9IHItPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JCQkgICAgICAqZHN0KysgPSByZWxfYnl0ZTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLSNlbmRpZgotCQkJICAgIHsKLQkJCSAgICAgIGFzeW1ib2wgKnAgPSAqKHItPnN5bV9wdHJfcHRyKTsKLQotCQkJICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaGFzIGEgc2VjdGlvbiBhdHRhY2hlZCwgdGhlbiBpdAotCQkJICAgICBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkLiAgQ2hhbmdlIGZyb20gYSBzeW1ib2wKLQkJCSAgICAgcmVmIHRvIGEgc2VjdGlvbiByZWYgKi8KLQkJCSAgICAgIGlmIChwLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCQkJCXsKLQkJCQkgIHJlbF9ieXRlIHw9IFJFTE9DQVRJT05fVFlQRV9SRUw7Ci0JCQkJICByZWxfYnl0ZSB8PQotCQkJCSAgICBwLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQkJCSAgKmRzdCsrID0gcmVsX2J5dGU7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIHJlbF9ieXRlIHw9IFJFTE9DQVRJT05fVFlQRV9VTkQ7Ci0JCQkJICAqZHN0KysgPSByZWxfYnl0ZTsKLQkJCQkgIC8qIE5leHQgdHdvIGJ5dGVzIGFyZSBhIHN5bWJvbCBpbmRleCAtIHdlIGNhbiBnZXQKLQkJCSAgICAgICB0aGlzIGZyb20gdGhlIHN5bWJvbCB2YWx1ZSB3aGljaCBoYXMgYmVlbiB6YXBwZWQKLQkJCSAgICAgICBpbnRvIHRoZSBzeW1ib2wgaW5kZXggaW4gdGhlIHRhYmxlIHdoZW4gdGhlCi0JCQkgICAgICAgc3ltYm9sIHRhYmxlIHdhcyB3cml0dGVuCi0JCQkgICAgICAgKi8KLQkJCQkgICpkc3QrKyA9IHAtPnZhbHVlID4+IDg7Ci0JCQkJICAqZHN0KysgPSBwLT52YWx1ZTsKLQkJCQl9Ci0JCQkgICAgfQotI2RlZmluZSBBRFZBTkNFIHsgaWYgKCsraSA+PSA4KSB7IGkgPSAwOyBtb2QgPSBkc3QrKzsgKm1vZCA9IDA7IH0gY3VycmVudF9ieXRlX2luZGV4Kys7IH0KLQkJCSAgLyogcmVsb2NhdGlvbnMgbmV2ZXIgb2NjdXIgZnJvbSBhbiB1bmxvYWRhYmxlIHNlY3Rpb24sCi0JCSAgICAgICBzbyB3ZSBjYW4gYXNzdW1lIHRoYXQgcmF3X2RhdGEgaXMgbm90IE5VTEwKLQkJICAgICAqLwotCQkJICAqZHN0KysgPSAqcmF3X2RhdGErKzsKLQkJCSAgQURWQU5DRQotCQkJICAgICogZHN0KysgPSAqcmF3X2RhdGErKzsKLQkJCSAgQURWQU5DRQotCQkJICAgIGlmIChob3ctPnNpemUgPT0gMikKLQkJCSAgICB7Ci0JCQkgICAgICAqZHN0KysgPSAqcmF3X2RhdGErKzsKLQkJCSAgICAgIEFEVkFOQ0UKLQkJCQkqIGRzdCsrID0gKnJhd19kYXRhKys7Ci0JCQkgICAgICBBRFZBTkNFCi0JCQkgICAgfQotCQkJICBjb250aW51ZTsKLQkJCX0KLQkJICAgIH0KLQkJICAvKiBJZiB0aGlzIGlzIGNvbWluZyBmcm9tIGFuIHVubG9hZGFibGUgc2VjdGlvbiB0aGVuIGNvcHkKLQkJICAgemVyb3MgKi8KLQkJICBpZiAocmF3X2RhdGEgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgKmRzdCsrID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgICpkc3QrKyA9ICpyYXdfZGF0YSsrOwotCQkgICAgfQotCQkgIEFEVkFOQ0UKLQkJfQotCi0JICAgICAgLyogRG9uJ3Qgd3JpdGUgYSB1c2VsZXNzIG51bGwgbW9kaWZpY2F0aW9uIGJ5dGUgKi8KLQkgICAgICBpZiAoZHN0ID09IG1vZCArIDEpCi0JCXsKLQkJICAtLWRzdDsKLQkJfQotCi0JICAgICAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJCQlvYXN5c19yZWNvcmRfaXNfZGF0YV9lbnVtLAotCQkJCQkoKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopCi0JCQkJCSAmIHByb2Nlc3NlZF9kYXRhKSwKLQkJCQkJZHN0IC0gKGJmZF9ieXRlICopICYgcHJvY2Vzc2VkX2RhdGEpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghIG9hc3lzX3dyaXRlX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBvYXN5c193cml0ZV9zeW1zIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIG9hc3lzX3dyaXRlX3NlY3Rpb25zIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIG9hc3lzX3dyaXRlX2RhdGEgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfZW5kIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotCi0vKiogZXhlYyBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLS8qIHNldCBzZWN0aW9uIGNvbnRlbnRzIGlzIGNvbXBsaWNhdGVkIHdpdGggT0FTWVMgc2luY2UgdGhlIGZvcm1hdCBpcwotKiBub3QgYSBieXRlIGltYWdlLCBidXQgYSByZWNvcmQgc3RyZWFtLgotKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGNvdW50ICE9IDApCi0gICAgewotICAgICAgaWYgKG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQl7Ci0JICBvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgPQotCSAgICAoYmZkX2J5dGUgKikgKGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbi0+X2Nvb2tlZF9zaXplKSk7Ci0JICBpZiAoIW9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICh2b2lkKSBtZW1jcHkgKChQVFIpIChvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgKyBvZmZzZXQpLAotCQkgICAgIGxvY2F0aW9uLAotCQkgICAgIChzaXplX3QpIGNvdW50KTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotLyogTmF0aXZlLWxldmVsIGludGVyZmFjZSB0byBzeW1ib2xzLiAqLwotCi0vKiBXZSByZWFkIHRoZSBzeW1ib2xzIGludG8gYSBidWZmZXIsIHdoaWNoIGlzIGRpc2NhcmRlZCB3aGVuIHRoaXMKLWZ1bmN0aW9uIGV4aXRzLiAgV2UgcmVhZCB0aGUgc3RyaW5ncyBpbnRvIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0bwotaG9sZCB0aGVtIGFsbCBwbHVzIGFsbCB0aGUgY2FjaGVkIHN5bWJvbCBlbnRyaWVzLiAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi1vYXN5c19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi0gIG9hc3lzX3N5bWJvbF90eXBlICpuZXcgPQotICAob2FzeXNfc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19zeW1ib2xfdHlwZSkpOwotICBpZiAoIW5ldykKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0MCi0KLQotCi0vKiBVc2VyIHNob3VsZCBoYXZlIGNoZWNrZWQgdGhlIGZpbGUgZmxhZ3M7IHBlcmhhcHMgd2Ugc2hvdWxkIHJldHVybgotQkZEX05PX01PUkVfU1lNQk9MUyBpZiB0aGVyZSBhcmUgbm9uZT8gKi8KLQotc3RhdGljIGJmZCAqCi1vYXN5c19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2gsIHByZXYpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgYmZkICpwcmV2OwotewotICBvYXN5c19hcl9kYXRhX3R5cGUgKmFyID0gT0FTWVNfQVJfREFUQSAoYXJjaCk7Ci0gIG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKnA7Ci0gIC8qIHRha2UgdGhlIG5leHQgb25lIGZyb20gdGhlIGFyY2ggc3RhdGUsIG9yIHJlc2V0ICovCi0gIGlmIChwcmV2ID09IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZXNldCB0aGUgaW5kZXggLSB0aGUgZmlyc3QgdHdvIGVudHJpZXMgYXJlIGJvZ3VzKi8KLSAgICAgIGFyLT5tb2R1bGVfaW5kZXggPSAwOwotICAgIH0KLQotICBwID0gYXItPm1vZHVsZSArIGFyLT5tb2R1bGVfaW5kZXg7Ci0gIGFyLT5tb2R1bGVfaW5kZXgrKzsKLQotICBpZiAoYXItPm1vZHVsZV9pbmRleCA8PSBhci0+bW9kdWxlX2NvdW50KQotICAgIHsKLSAgICAgIGlmIChwLT5hYmZkID09IChiZmQgKikgTlVMTCkKLQl7Ci0JICBwLT5hYmZkID0gX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIChhcmNoKTsKLQkgIHAtPmFiZmQtPm9yaWdpbiA9IHAtPnBvczsKLQkgIHAtPmFiZmQtPmZpbGVuYW1lID0gcC0+bmFtZTsKLQotCSAgLyogRml4dXAgYSBwb2ludGVyIHRvIHRoaXMgZWxlbWVudCBmb3IgdGhlIG1lbWJlciAqLwotCSAgcC0+YWJmZC0+YXJlbHRfZGF0YSA9IChQVFIpIHA7Ci0JfQotICAgICAgcmV0dXJuIHAtPmFiZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotICAgICAgcmV0dXJuIChiZmQgKikgTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKLQkJCSBzZWN0aW9uLAotCQkJIHN5bWJvbHMsCi0JCQkgb2Zmc2V0LAotCQkJIGZpbGVuYW1lX3B0ciwKLQkJCSBmdW5jdGlvbm5hbWVfcHRyLAotCQkJIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmZpbGVuYW1lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBmYWxzZTsKLQotfQotCi1zdGF0aWMgaW50Ci1vYXN5c19nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBvYXN5c19tb2R1bGVfaW5mb190eXBlICptb2QgPSAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqKSBhYmZkLT5hcmVsdF9kYXRhOwotICBpZiAobW9kID09IChvYXN5c19tb2R1bGVfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYtPnN0X3NpemUgPSBtb2QtPnNpemU7Ci0gICAgICBidWYtPnN0X21vZGUgPSAwNjY2OwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1vYXN5c19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotI2RlZmluZQlvYXN5c19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgb2FzeXNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgb2FzeXNfc2x1cnBfYXJtYXAgYmZkX3RydWUKLSNkZWZpbmUgb2FzeXNfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfdHJ1ZQotI2RlZmluZSBvYXN5c19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfdHJ1ZSkKLSNkZWZpbmUgb2FzeXNfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBvYXN5c193cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX3RydWUpCi0jZGVmaW5lIG9hc3lzX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBvYXN5c19nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIG9hc3lzX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotI2RlZmluZSBvYXN5c19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG9hc3lzX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBvYXN5c19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIG9hc3lzX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgb2FzeXNfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgb2FzeXNfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgb2FzeXNfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgb2FzeXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIG9hc3lzX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgb2FzeXNfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBvYXN5c19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgb2FzeXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgb2FzeXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgb2FzeXNfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgb2FzeXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qU1VQUFJFU1MgNDYwICovCi1jb25zdCBiZmRfdGFyZ2V0IG9hc3lzX3ZlYyA9Ci17Ci0gICJvYXN5cyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X29hc3lzX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwKLSAgIG9hc3lzX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgb2FzeXNfYXJjaGl2ZV9wLAotICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgb2FzeXNfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgb2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG9hc3lzKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvb3BuY2xzLmMgYi9iZmQvb3BuY2xzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMTAxMzUuLjAwMDAwMDAKLS0tIGEvYmZkL29wbmNscy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjgzICswLDAgQEAKLS8qIG9wbmNscy5jIC0tIG9wZW4gYW5kIGNsb3NlIGEgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib2JqYWxsb2MuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotI2lmbmRlZiBTX0lYR1JQCi0jZGVmaW5lIFNfSVhHUlAgMDAxMAkvKiBFeGVjdXRlIGJ5IGdyb3VwLiAgKi8KLSNlbmRpZgotI2lmbmRlZiBTX0lYT1RICi0jZGVmaW5lIFNfSVhPVEggMDAwMQkvKiBFeGVjdXRlIGJ5IG90aGVycy4gICovCi0jZW5kaWYKLQotLyogZmRvcGVuIGlzIGEgbG9zZXIgLS0gd2Ugc2hvdWxkIHVzZSBzdGRpbyBleGNsdXNpdmVseS4gIFVuZm9ydHVuYXRlbHkKLSAgIGlmIHdlIGRvIHRoYXQgd2UgY2FuJ3QgdXNlIGZjbnRsLiAgKi8KLQotLyogRklYTUU6IFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuICAqLwotbG9uZyBfYmZkX2NodW5rc2l6ZSA9IC0xOwotCi0vKiBSZXR1cm4gYSBuZXcgQkZELiAgQWxsIEJGRCdzIGFyZSBhbGxvY2F0ZWQgdGhyb3VnaCB0aGlzIHJvdXRpbmUuICAqLwotCi1iZmQgKgotX2JmZF9uZXdfYmZkICgpCi17Ci0gIGJmZCAqbmJmZDsKLQotICBuYmZkID0gKGJmZCAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChiZmQpKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBuYmZkLT5tZW1vcnkgPSAoUFRSKSBvYmphbGxvY19jcmVhdGUgKCk7Ci0gIGlmIChuYmZkLT5tZW1vcnkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0KLSAgbmJmZC0+ZGlyZWN0aW9uID0gbm9fZGlyZWN0aW9uOwotICBuYmZkLT5pb3N0cmVhbSA9IE5VTEw7Ci0gIG5iZmQtPndoZXJlID0gMDsKLSAgbmJmZC0+c2VjdGlvbnMgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgbmJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gIG5iZmQtPm15X2FyY2hpdmUgPSAoYmZkICopIE5VTEw7Ci0gIG5iZmQtPm9yaWdpbiA9IDA7CQkJCQotICBuYmZkLT5vcGVuZWRfb25jZSA9IGZhbHNlOwotICBuYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gIG5iZmQtPnNlY3Rpb25fY291bnQgPSAwOwotICBuYmZkLT51c3JkYXRhID0gKFBUUikgTlVMTDsKLSAgbmJmZC0+Y2FjaGVhYmxlID0gZmFsc2U7Ci0gIG5iZmQtPmZsYWdzID0gQkZEX05PX0ZMQUdTOwotICBuYmZkLT5tdGltZV9zZXQgPSBmYWxzZTsKLQotICByZXR1cm4gbmJmZDsKLX0KLQotLyogQWxsb2NhdGUgYSBuZXcgQkZEIGFzIGEgbWVtYmVyIG9mIGFyY2hpdmUgT0JGRC4gICovCi0KLWJmZCAqCi1fYmZkX25ld19iZmRfY29udGFpbmVkX2luIChvYmZkKQotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGJmZCAqbmJmZDsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBuYmZkLT54dmVjID0gb2JmZC0+eHZlYzsKLSAgbmJmZC0+bXlfYXJjaGl2ZSA9IG9iZmQ7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOwotICBuYmZkLT50YXJnZXRfZGVmYXVsdGVkID0gb2JmZC0+dGFyZ2V0X2RlZmF1bHRlZDsKLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qCi1TRUNUSU9OCi0JT3BlbmluZyBhbmQgY2xvc2luZyBCRkRzCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9vcGVucgotCi1TWU5PUFNJUwotICAgICAgICBiZmQgKmJmZF9vcGVucihDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0KTsKLQotREVTQ1JJUFRJT04KLQlPcGVuIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9ICh1c2luZyA8PGZvcGVuPj4pIHdpdGggdGhlIHRhcmdldAotCUB2YXJ7dGFyZ2V0fS4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgQkZELgotCi0JQ2FsbHMgPDxiZmRfZmluZF90YXJnZXQ+Piwgc28gQHZhcnt0YXJnZXR9IGlzIGludGVycHJldGVkIGFzIGJ5Ci0JdGhhdCBmdW5jdGlvbi4KLQotCUlmIDw8TlVMTD4+IGlzIHJldHVybmVkIHRoZW4gYW4gZXJyb3IgaGFzIG9jY3VyZWQuICAgUG9zc2libGUgZXJyb3JzCi0JYXJlIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+LCA8PGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldD4+IG9yIDw8c3lzdGVtX2NhbGw+PiBlcnJvci4KLSovCi0KLWJmZCAqCi1iZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqbmJmZDsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOwotCi0gIGlmIChiZmRfb3Blbl9maWxlIChuYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZpbGUgZGlkbid0IGV4aXN0LCBvciBzb21lIHN1Y2ggKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gbmJmZDsKLX0KLQotLyogRG9uJ3QgdHJ5IHRvIGBvcHRpbWl6ZScgdGhpcyBmdW5jdGlvbjoKLQotICAgbyAtIFdlIGxvY2sgdXNpbmcgc3RhY2sgc3BhY2Ugc28gdGhhdCBpbnRlcnJ1cHRpbmcgdGhlIGxvY2tpbmcKLSAgICAgICB3b24ndCBjYXVzZSBhIHN0b3JhZ2UgbGVhay4KLSAgIG8gLSBXZSBvcGVuIHRoZSBmaWxlIHN0cmVhbSBsYXN0LCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGhhdmUgdG8KLSAgICAgICBjbG9zZSBpdCBpZiBhbnl0aGluZyBnb2VzIHdyb25nLiAgQ2xvc2luZyB0aGUgc3RyZWFtIG1lYW5zIGNsb3NpbmcKLSAgICAgICB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvbywgZXZlbiB0aG91Z2ggd2UgZGlkbid0IG9wZW4gaXQuCi0gKi8KLS8qCi1GVU5DVElPTgotICAgICAgICAgYmZkX2Zkb3BlbnIKLQotU1lOT1BTSVMKLSAgICAgICAgIGJmZCAqYmZkX2Zkb3BlbnIoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCwgaW50IGZkKTsKLQotREVTQ1JJUFRJT04KLSAgICAgICAgIDw8YmZkX2Zkb3BlbnI+PiBpcyB0byA8PGJmZF9mb3BlbnI+PiBtdWNoIGxpa2UgPDxmZG9wZW4+PiBpcyB0byA8PGZvcGVuPj4uCi0JIEl0IG9wZW5zIGEgQkZEIG9uIGEgZmlsZSBhbHJlYWR5IGRlc2NyaWJlZCBieSB0aGUgQHZhcntmZH0KLQkgc3VwcGxpZWQuCi0KLQkgV2hlbiB0aGUgZmlsZSBpcyBsYXRlciA8PGJmZF9jbG9zZT4+ZCwgdGhlIGZpbGUgZGVzY3JpcHRvciB3aWxsIGJlIGNsb3NlZC4KLQotCSBJZiB0aGUgY2FsbGVyIGRlc2lyZXMgdGhhdCB0aGlzIGZpbGUgZGVzY3JpcHRvciBiZSBjYWNoZWQgYnkgQkZECi0JIChvcGVuZWQgYXMgbmVlZGVkLCBjbG9zZWQgYXMgbmVlZGVkIHRvIGZyZWUgZGVzY3JpcHRvcnMgZm9yCi0JIG90aGVyIG9wZW5zKSwgd2l0aCB0aGUgc3VwcGxpZWQgQHZhcntmZH0gdXNlZCBhcyBhbiBpbml0aWFsCi0JIGZpbGUgZGVzY3JpcHRvciAoYnV0IHN1YmplY3QgdG8gY2xvc3VyZSBhdCBhbnkgdGltZSksIGNhbGwKLQkgYmZkX3NldF9jYWNoZWFibGUoYmZkLCAxKSBvbiB0aGUgcmV0dXJuZWQgQkZELiAgVGhlIGRlZmF1bHQgaXMgdG8KLQkgYXNzdW1lIG5vIGNhY2hlaW5nOyB0aGUgZmlsZSBkZXNjcmlwdG9yIHdpbGwgcmVtYWluIG9wZW4gdW50aWwKLQkgPDxiZmRfY2xvc2U+PiwgYW5kIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IEJGRCBvcGVyYXRpb25zIG9uIG90aGVyCi0JIGZpbGVzLgotCi0gICAgICAgICBQb3NzaWJsZSBlcnJvcnMgYXJlIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+LCA8PGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldD4+IGFuZCA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+LgotKi8KLQotYmZkICoKLWJmZF9mZG9wZW5yIChmaWxlbmFtZSwgdGFyZ2V0LCBmZCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLSAgICAgaW50IGZkOwotewotICBiZmQgKm5iZmQ7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7Ci0gIGludCBmZGZsYWdzOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0jaWYgISBkZWZpbmVkKEhBVkVfRkNOVEwpIHx8ICEgZGVmaW5lZChGX0dFVEZMKQotICBmZGZsYWdzID0gT19SRFdSOwkJCS8qIEFzc3VtZSBmdWxsIGFjY2VzcyAqLwotI2Vsc2UKLSAgZmRmbGFncyA9IGZjbnRsIChmZCwgRl9HRVRGTCwgTlVMTCk7Ci0jZW5kaWYKLSAgaWYgKGZkZmxhZ3MgPT0gLTEpIHJldHVybiBOVUxMOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKLSAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSNpZm5kZWYgSEFWRV9GRE9QRU4KLSAgbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1JCKTsKLSNlbHNlCi0gIC8qIChPX0FDQ01PREUpIHBhcmVucyBhcmUgdG8gYXZvaWQgVWx0cml4IGhlYWRlciBmaWxlIGJ1ZyAqLwotICBzd2l0Y2ggKGZkZmxhZ3MgJiAoT19BQ0NNT0RFKSkKLSAgICB7Ci0gICAgY2FzZSBPX1JET05MWTogbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmZG9wZW4gKGZkLCBGT1BFTl9SQik7ICAgYnJlYWs7Ci0gICAgY2FzZSBPX1dST05MWTogbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmZG9wZW4gKGZkLCBGT1BFTl9SVUIpOyAgYnJlYWs7Ci0gICAgY2FzZSBPX1JEV1I6ICAgbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmZG9wZW4gKGZkLCBGT1BFTl9SVUIpOyAgYnJlYWs7Ci0gICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKG5iZmQtPmlvc3RyZWFtID09IE5VTEwpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIHB1dCBldmVyeXRoaW5nIHdoZXJlIGl0IGJlbG9uZ3MgKi8KLQotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotCi0gIC8qIEFzIGEgc3BlY2lhbCBjYXNlIHdlIGFsbG93IGEgRkQgb3BlbiBmb3IgcmVhZC93cml0ZSB0bwotICAgICBiZSB3cml0dGVuIHRocm91Z2gsIGFsdGhvdWdoIGRvaW5nIHNvIHJlcXVpcmVzIHRoYXQgd2UgZW5kCi0gICAgIHRoZSBwcmV2aW91cyBjbGF1c2Ugd2l0aCBhIHByZXBvc2l0aW9uLiAgKi8KLSAgLyogKE9fQUNDTU9ERSkgcGFyZW5zIGFyZSB0byBhdm9pZCBVbHRyaXggaGVhZGVyIGZpbGUgYnVnICovCi0gIHN3aXRjaCAoZmRmbGFncyAmIE9fQUNDTU9ERSkKLSAgICB7Ci0gICAgY2FzZSBPX1JET05MWTogbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247IGJyZWFrOwotICAgIGNhc2UgT19XUk9OTFk6IG5iZmQtPmRpcmVjdGlvbiA9IHdyaXRlX2RpcmVjdGlvbjsgYnJlYWs7Ci0gICAgY2FzZSBPX1JEV1I6IG5iZmQtPmRpcmVjdGlvbiA9IGJvdGhfZGlyZWN0aW9uOyBicmVhazsKLSAgICBkZWZhdWx0OiBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2NhY2hlX2luaXQgKG5iZmQpKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBuYmZkLT5vcGVuZWRfb25jZSA9IHRydWU7Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9vcGVuc3RyZWFtcgotCi1TWU5PUFNJUwotCWJmZCAqYmZkX29wZW5zdHJlYW1yKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBQVFIpOwotCi1ERVNDUklQVElPTgotCi0JT3BlbiBhIEJGRCBmb3IgcmVhZCBhY2Nlc3Mgb24gYW4gZXhpc3Rpbmcgc3RkaW8gc3RyZWFtLiAgV2hlbgotCXRoZSBCRkQgaXMgcGFzc2VkIHRvIDw8YmZkX2Nsb3NlPj4sIHRoZSBzdHJlYW0gd2lsbCBiZSBjbG9zZWQuCi0qLwotCi1iZmQgKgotYmZkX29wZW5zdHJlYW1yIChmaWxlbmFtZSwgdGFyZ2V0LCBzdHJlYW1hcmcpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci0gICAgIFBUUiBzdHJlYW1hcmc7Ci17Ci0gIEZJTEUgKnN0cmVhbSA9IChGSUxFICopIHN0cmVhbWFyZzsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKLSAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBzdHJlYW07Ci0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOwotCQkJCQotICBpZiAoISBiZmRfY2FjaGVfaW5pdCAobmJmZCkpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0MCi0vKiogYmZkX29wZW53IC0tIG9wZW4gZm9yIHdyaXRpbmcuCi0gIFJldHVybnMgYSBwb2ludGVyIHRvIGEgZnJlc2hseS1hbGxvY2F0ZWQgQkZEIG9uIHN1Y2Nlc3MsIG9yIE5VTEwuCi0KLSAgU2VlIGNvbW1lbnQgYnkgYmZkX2Zkb3BlbnIgYmVmb3JlIHlvdSB0cnkgdG8gbW9kaWZ5IHRoaXMgZnVuY3Rpb24uICovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9vcGVudwotCi1TWU5PUFNJUwotCWJmZCAqYmZkX29wZW53KENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpOwotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIEJGRCwgYXNzb2NpYXRlZCB3aXRoIGZpbGUgQHZhcntmaWxlbmFtZX0sIHVzaW5nIHRoZQotCWZpbGUgZm9ybWF0IEB2YXJ7dGFyZ2V0fSwgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0KLQlQb3NzaWJsZSBlcnJvcnMgYXJlIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4sIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+LAotCTw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4uCi0qLwotCi1iZmQgKgotYmZkX29wZW53IChmaWxlbmFtZSwgdGFyZ2V0KQotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotewotICBiZmQgKm5iZmQ7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQotICAvKiBuYmZkIGhhcyB0byBwb2ludCB0byBoZWFkIG9mIG1hbGxvYydlZCBibG9jayBzbyB0aGF0IGJmZF9jbG9zZSBtYXkKLSAgICAgcmVjbGFpbSBpdCBjb3JyZWN0bHkuICovCi0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOwotICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IHdyaXRlX2RpcmVjdGlvbjsKLQotICBpZiAoYmZkX29wZW5fZmlsZSAobmJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwkvKiBGaWxlIG5vdCB3cml0ZWFibGUsIGV0YyAqLwotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBuYmZkOwotfQotCi0vKgotCi1GVU5DVElPTgotCWJmZF9jbG9zZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2Nsb3NlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlDbG9zZSBhIEJGRC4gSWYgdGhlIEJGRCB3YXMgb3BlbiBmb3Igd3JpdGluZywKLQl0aGVuIHBlbmRpbmcgb3BlcmF0aW9ucyBhcmUgY29tcGxldGVkIGFuZCB0aGUgZmlsZSB3cml0dGVuIG91dAotCWFuZCBjbG9zZWQuIElmIHRoZSBjcmVhdGVkIGZpbGUgaXMgZXhlY3V0YWJsZSwgdGhlbgotCTw8Y2htb2Q+PiBpcyBjYWxsZWQgdG8gbWFyayBpdCBhcyBzdWNoLgotCi0JQWxsIG1lbW9yeSBhdHRhY2hlZCB0byB0aGUgQkZEIGlzIHJlbGVhc2VkLgotCi0JVGhlIGZpbGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIEJGRCBpcyBjbG9zZWQgKGV2ZW4KLQlpZiBpdCB3YXMgcGFzc2VkIGluIHRvIEJGRCBieSA8PGJmZF9mZG9wZW5yPj4pLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LgotKi8KLQotCi1ib29sZWFuCi1iZmRfY2xvc2UgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgaWYgKCFiZmRfcmVhZF9wIChhYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoISBCRkRfU0VORF9GTVQgKGFiZmQsIF9iZmRfd3JpdGVfY29udGVudHMsIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBCRkRfU0VORCAoYWJmZCwgX2Nsb3NlX2FuZF9jbGVhbnVwLCAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXQgPSBiZmRfY2FjaGVfY2xvc2UgKGFiZmQpOwotCi0gIC8qIElmIHRoZSBmaWxlIHdhcyBvcGVuIGZvciB3cml0aW5nIGFuZCBpcyBub3cgZXhlY3V0YWJsZSwKLSAgICAgbWFrZSBpdCBzbyAqLwotICBpZiAocmV0Ci0gICAgICAmJiBhYmZkLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uCi0gICAgICAmJiBhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgICAgIGlmIChzdGF0IChhYmZkLT5maWxlbmFtZSwgJmJ1ZikgPT0gMCkKLQl7Ci0gCSAgaW50IG1hc2sgPSB1bWFzayAoMCk7Ci0JICB1bWFzayAobWFzayk7Ci0JICBjaG1vZCAoYWJmZC0+ZmlsZW5hbWUsCi0JCSAoMDc3NwotCQkgICYgKGJ1Zi5zdF9tb2RlIHwgKChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpICZ+IG1hc2spKSkpOwotCX0KLSAgICB9Ci0KLSAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBhYmZkLT5tZW1vcnkpOwotICBmcmVlIChhYmZkKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY2xvc2VfYWxsX2RvbmUKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jbG9zZV9hbGxfZG9uZShiZmQgKik7Ci0KLURFU0NSSVBUSU9OCi0JQ2xvc2UgYSBCRkQuICBEaWZmZXJzIGZyb20gPDxiZmRfY2xvc2U+PgotCXNpbmNlIGl0IGRvZXMgbm90IGNvbXBsZXRlIGFueSBwZW5kaW5nIG9wZXJhdGlvbnMuICBUaGlzCi0Jcm91dGluZSB3b3VsZCBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBoYWQganVzdCB1c2VkIEJGRCBmb3IKLQlzd2FwcGluZyBhbmQgZGlkbid0IHdhbnQgdG8gdXNlIGFueSBvZiB0aGUgd3JpdGluZyBjb2RlLgotCi0JSWYgdGhlIGNyZWF0ZWQgZmlsZSBpcyBleGVjdXRhYmxlLCB0aGVuIDw8Y2htb2Q+PiBpcyBjYWxsZWQKLQl0byBtYXJrIGl0IGFzIHN1Y2guCi0KLQlBbGwgbWVtb3J5IGF0dGFjaGVkIHRvIHRoZSBCRkQgaXMgcmVsZWFzZWQuCi0KLVJFVFVSTlMKLQk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uCi0KLSovCi0KLWJvb2xlYW4KLWJmZF9jbG9zZV9hbGxfZG9uZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBib29sZWFuIHJldDsKLQotICByZXQgPSBiZmRfY2FjaGVfY2xvc2UgKGFiZmQpOwotCi0gIC8qIElmIHRoZSBmaWxlIHdhcyBvcGVuIGZvciB3cml0aW5nIGFuZCBpcyBub3cgZXhlY3V0YWJsZSwKLSAgICAgbWFrZSBpdCBzbyAqLwotICBpZiAocmV0Ci0gICAgICAmJiBhYmZkLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uCi0gICAgICAmJiBhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgICAgIGlmIChzdGF0IChhYmZkLT5maWxlbmFtZSwgJmJ1ZikgPT0gMCkKLQl7Ci0JICBpbnQgbWFzayA9IHVtYXNrICgwKTsKLQkgIHVtYXNrIChtYXNrKTsKLQkgIGNobW9kIChhYmZkLT5maWxlbmFtZSwKLQkJICgweDc3NwotCQkgICYgKGJ1Zi5zdF9tb2RlIHwgKChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpICZ+IG1hc2spKSkpOwotCX0KLSAgICB9Ci0KLSAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBhYmZkLT5tZW1vcnkpOwotICBmcmVlIChhYmZkKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY3JlYXRlCi0KLVNZTk9QU0lTCi0JYmZkICpiZmRfY3JlYXRlKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBiZmQgKnRlbXBsKTsKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBuZXcgQkZEIGluIHRoZSBtYW5uZXIgb2YKLQk8PGJmZF9vcGVudz4+LCBidXQgd2l0aG91dCBvcGVuaW5nIGEgZmlsZS4gVGhlIG5ldyBCRkQKLQl0YWtlcyB0aGUgdGFyZ2V0IGZyb20gdGhlIHRhcmdldCB1c2VkIGJ5IEB2YXJ7dGVtcGxhdGV9LiBUaGUKLQlmb3JtYXQgaXMgYWx3YXlzIHNldCB0byA8PGJmZF9vYmplY3Q+Pi4KLQotKi8KLQotYmZkICoKLWJmZF9jcmVhdGUgKGZpbGVuYW1lLCB0ZW1wbCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJmZCAqdGVtcGw7Ci17Ci0gIGJmZCAqbmJmZDsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBpZiAodGVtcGwpCi0gICAgbmJmZC0+eHZlYyA9IHRlbXBsLT54dmVjOwotICBuYmZkLT5kaXJlY3Rpb24gPSBub19kaXJlY3Rpb247Ci0gIGJmZF9zZXRfZm9ybWF0IChuYmZkLCBiZmRfb2JqZWN0KTsKLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX3dyaXRhYmxlCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfbWFrZV93cml0YWJsZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVRha2VzIGEgQkZEIGFzIGNyZWF0ZWQgYnkgPDxiZmRfY3JlYXRlPj4gYW5kIGNvbnZlcnRzIGl0Ci0JaW50byBvbmUgbGlrZSBhcyByZXR1cm5lZCBieSA8PGJmZF9vcGVudz4+LiAgSXQgZG9lcyB0aGlzCi0JYnkgY29udmVydGluZyB0aGUgQkZEIHRvIEJGRF9JTl9NRU1PUlkuICBJdCdzIGFzc3VtZWQgdGhhdAotCXlvdSB3aWxsIGNhbGwgPDxiZmRfbWFrZV9yZWFkYWJsZT4+IG9uIHRoaXMgYmZkIGxhdGVyLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LgotKi8KLQotYm9vbGVhbgotYmZkX21ha2Vfd3JpdGFibGUoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotCi0gIGlmIChhYmZkLT5kaXJlY3Rpb24gIT0gbm9fZGlyZWN0aW9uKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaW5fbWVtb3J5KSk7Ci0gIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgYmltOwotICAvKiBiZmRfd3JpdGUgd2lsbCBncm93IHRoZXNlIGFzIG5lZWRlZCAqLwotICBiaW0tPnNpemUgPSAwOwotICBiaW0tPmJ1ZmZlciA9IDA7Ci0KLSAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lOX01FTU9SWTsKLSAgYWJmZC0+ZGlyZWN0aW9uID0gd3JpdGVfZGlyZWN0aW9uOwotICBhYmZkLT53aGVyZSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX3JlYWRhYmxlCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfbWFrZV9yZWFkYWJsZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVRha2VzIGEgQkZEIGFzIGNyZWF0ZWQgYnkgPDxiZmRfY3JlYXRlPj4gYW5kCi0JPDxiZmRfbWFrZV93cml0YWJsZT4+IGFuZCBjb252ZXJ0cyBpdCBpbnRvIG9uZSBsaWtlIGFzCi0JcmV0dXJuZWQgYnkgPDxiZmRfb3BlbnI+Pi4gIEl0IGRvZXMgdGhpcyBieSB3cml0aW5nIHRoZQotCWNvbnRlbnRzIG91dCB0byB0aGUgbWVtb3J5IGJ1ZmZlciwgdGhlbiByZXZlcnNpbmcgdGhlCi0JZGlyZWN0aW9uLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LiAgKi8KLQotYm9vbGVhbgotYmZkX21ha2VfcmVhZGFibGUoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+ZGlyZWN0aW9uICE9IHdyaXRlX2RpcmVjdGlvbiB8fCAhKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3dyaXRlX2NvbnRlbnRzLCAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBCRkRfU0VORCAoYWJmZCwgX2Nsb3NlX2FuZF9jbGVhbnVwLCAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotCi0gIGFiZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLQotICBhYmZkLT53aGVyZSA9IDA7Ci0gIGFiZmQtPnNlY3Rpb25zID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotICBhYmZkLT5teV9hcmNoaXZlID0gKGJmZCAqKSBOVUxMOwotICBhYmZkLT5vcmlnaW4gPSAwOwkJCQkKLSAgYWJmZC0+b3BlbmVkX29uY2UgPSBmYWxzZTsKLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgYWJmZC0+dXNyZGF0YSA9IChQVFIpIE5VTEw7Ci0gIGFiZmQtPmNhY2hlYWJsZSA9IGZhbHNlOwotICBhYmZkLT5mbGFncyA9IEJGRF9JTl9NRU1PUlk7Ci0gIGFiZmQtPm10aW1lX3NldCA9IGZhbHNlOwotCi0gIGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSB0cnVlOwotICBhYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLSAgYWJmZC0+c2VjdGlvbnMgPSAwOwotICBhYmZkLT5zeW1jb3VudCA9IDA7Ci0gIGFiZmQtPm91dHN5bWJvbHMgPSAwOwotICBhYmZkLT50ZGF0YS5hbnkgPSAwOwotCi0gIGJmZF9jaGVja19mb3JtYXQoYWJmZCwgYmZkX29iamVjdCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9hbGxvYwotCi1TWU5PUFNJUwotCVBUUiBiZmRfYWxsb2MgKGJmZCAqYWJmZCwgc2l6ZV90IHdhbnRlZCk7Ci0KLURFU0NSSVBUSU9OCi0JQWxsb2NhdGUgYSBibG9jayBvZiBAdmFye3dhbnRlZH0gYnl0ZXMgb2YgbWVtb3J5IGF0dGFjaGVkIHRvCi0JPDxhYmZkPj4gYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0qLwotCi0KLVBUUgotYmZkX2FsbG9jIChhYmZkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcmV0OwotCi0gIHJldCA9IG9iamFsbG9jX2FsbG9jIChhYmZkLT5tZW1vcnksICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICByZXR1cm4gcmV0OwotfQotCi1QVFIKLWJmZF96YWxsb2MgKGFiZmQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiByZXM7Ci0KLSAgcmVzID0gYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKHJlcykKLSAgICBtZW1zZXQgKHJlcywgMCwgc2l6ZSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIEZyZWUgYSBibG9jayBhbGxvY2F0ZWQgZm9yIGEgQkZELiAgKi8KLQotdm9pZAotYmZkX3JlbGVhc2UgKGFiZmQsIGJsb2NrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBibG9jazsKLXsKLSAgb2JqYWxsb2NfZnJlZV9ibG9jayAoKHN0cnVjdCBvYmphbGxvYyAqKSBhYmZkLT5tZW1vcnksIGJsb2NrKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9vc2YtY29yZS5jIGIvYmZkL29zZi1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGZjMTIuLjAwMDAwMDAKLS0tIGEvYmZkL29zZi1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBPU0YvMSBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIE9TRi8xIHN0eWxlCi0gICBjb3JlIGZpbGVzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgZmxhZ3dvcmQsIGJmZF9zaXplX3R5cGUsCi0JCQkgICBiZmRfdm1hLCBmaWxlX3B0cikpOwotc3RhdGljIGFzeW1ib2wgKgotb3NmX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50Ci1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuCi1vc2ZfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi0KLXN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGNoYXIgY21kW01BWENPTUxFTiArIDFdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEub3NmX2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDg7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1vc2ZfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBpbnQgaTsKLSAgY2hhciAqc2VjbmFtZTsKLSAgc3RydWN0IGNvcmVfZmlsZWhkciBjb3JlX2hlYWRlcjsKLQotICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmY29yZV9oZWFkZXIsIDEsIHNpemVvZiBjb3JlX2hlYWRlciwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIGNvcmVfaGVhZGVyKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChzdHJuY21wIChjb3JlX2hlYWRlci5tYWdpYywgIkNvcmUiLCA0KSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0ICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIGNvcmVfaGVhZGVyLm5hbWUsIE1BWENPTUxFTiArIDEpOwotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBjb3JlX2hlYWRlci5zaWdubzsKLQotICBmb3IgKGkgPSAwOyBpIDwgY29yZV9oZWFkZXIubnNjbnM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29yZV9zY25oZHIgY29yZV9zY25oZHI7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLQotICAgICAgdmFsID0gYmZkX3JlYWQgKChQVFIpJmNvcmVfc2NuaGRyLCAxLCBzaXplb2YgY29yZV9zY25oZHIsIGFiZmQpOwotICAgICAgaWYgKHZhbCAhPSBzaXplb2YgY29yZV9zY25oZHIpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFNraXAgZW1wdHkgc2VjdGlvbnMuICAqLwotICAgICAgaWYgKGNvcmVfc2NuaGRyLnNpemUgPT0gMCB8fCBjb3JlX3Njbmhkci5zY25wdHIgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChjb3JlX3Njbmhkci5zY250eXBlKQotCXsKLQljYXNlIFNDTlJHTjoKLQkgIHNlY25hbWUgPSAiLmRhdGEiOwotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBicmVhazsKLQljYXNlIFNDTlNUQUNLOgotCSAgc2VjbmFtZSA9ICIuc3RhY2siOwotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBicmVhazsKLQljYXNlIFNDTlJFR1M6Ci0JICBzZWNuYW1lID0gIi5yZWciOwotCSAgZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5oYW5kbGVkIE9TRi8xIGNvcmUgZmlsZSBzZWN0aW9uIHR5cGUgJWRcbiIpLAotCQkJCSBjb3JlX3Njbmhkci5zY250eXBlKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwgZmxhZ3MsCi0JCQkgICAgICAoYmZkX3NpemVfdHlwZSkgY29yZV9zY25oZHIuc2l6ZSwKLQkJCSAgICAgIChiZmRfdm1hKSBjb3JlX3Njbmhkci52YWRkciwKLQkJCSAgICAgIChmaWxlX3B0cikgY29yZV9zY25oZHIuc2NucHRyKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1vc2ZfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQwKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBvc2ZfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgb3NmX2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG9zZl9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIG9zZl9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgb3NmX2NvcmVfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG9zZl9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IG9zZl9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAib3NmLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgb3NmX2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChvc2ZfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG9zZl9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvcGM1MzItbWFjaC5jIGIvYmZkL3BjNTMyLW1hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3N2Q1ZC4uMDAwMDAwMAotLS0gYS9iZmQvcGM1MzItbWFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTWFjaDMvNTMyIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IElhbiBEYWxsCi0gKiAgICAgICAgICAgIDE5LUFwci05NAotICoKLSAqIEZvcm1lcmx5IHBhcnQgb2YgYW91dC1wYzUzMi1tYWNoLmMuIFNwbGl0IG91dCB0byBhbGxvdyBtb3JlCi0gKiBmbGV4aWJpbGl0eSB3aXRoIG11bHRpcGxlIGZvcm1hdHMuCi0gKgotICovCi0vKiBUaGlzIGFyY2hpdGVjdHVyZSBoYXMgTl9UWFRPRkYgYW5kIE5fVFhUQUREUiBkZWZpbmVkIGFzIGlmCi0gKiBOX0hFQURFUl9JTl9URVhULCBidXQgdGhlIGFfdGV4dCBlbnRyeSAodGV4dCBzaXplKSBkb2VzIG5vdCBpbmNsdWRlIHRoZQotICogc3BhY2UgZm9yIHRoZSBoZWFkZXIuIFNvIHdlIGhhdmUgTl9IRUFERVJfSU5fVEVYVCBkZWZpbmVkIHRvCi0gKiAxIGFuZCBzcGVjaWFsbHkgZGVmaW5lIG91ciBvd24gTl9UWFRTSVpFCi0gKi8KLQotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQotCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDB4MTAwMDAgICAgICAgLyogZnJvbSBvbGQgbGQgKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDEwMDAgICAgICAgLyogZnJvbSBvbGQgbGQsICAwMzIgJiA1MzIgYXJlIHJlYWxseSA1MTIvNGsgKi8KLQotLyogVXNlIGFfZW50cnkgb2YgMCB0byBkaXN0aW5ndWlzaCBvYmplY3QgZmlsZXMgZnJvbSBPTUFHSUMgZXhlY3V0YWJsZXMgKi8KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgKE5fTUFHSUMoeCkgPT0gT01BR0lDID8gXAotICAgKCh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSPyAwOiBURVhUX1NUQVJUX0FERFIpOiBcCi0gICAoTl9NQUdJQyh4KSA9PSBOTUFHSUM/IFRFWFRfU1RBUlRfQUREUjogXAotICAgIFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSkpCi0KLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbnMzMmsKLSAgCi0jZGVmaW5lIE1ZKE9QKSBDQVQocGM1MzJtYWNoYW91dF8sT1ApCi0KLS8qIE11c3QgYmUgdGhlIHNhbWUgYXMgYW91dC1uczMyay5jICovCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKG5zMzJrYW91dCxfMzJfLHkpCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtcGM1MzItbWFjaCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBXZSBjYW5gdCB1c2UgdGhlIE1ZTlMgbWFjcm8gaGVyZSBmb3IgY3BwIHJlYXNvbnMgdG9vIHN1YnRsZSBmb3IgbWUgLS0gSVdEICovCi0KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG5zMzJrYW91dF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogbGliYW91dCBkb2Vzbid0IHVzZSBOQU1FIGZvciB0aGVzZSAuLi4gKi8KLQotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMQotCi0jZGVmaW5lIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkIDEKLSAgICAgCi0jZGVmaW5lIE1ZTlNYKE9QKSBDQVQobnMzMmthb3V0XyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgKgotTVlOU1goYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBQQVJBTVMoKGJmZCAqYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWJvb2xlYW4KLU1ZTlNYKHdyaXRlX29iamVjdF9jb250ZW50cykKLSAgUEFSQU1TKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi1iZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAKLSAgQkZEX0FTU0VSVCAoYmZkX2dldF9hcmNoIChhYmZkKSA9PSBiZmRfYXJjaF9uczMyayk7Ci0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSAzMjAzMjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fTlMzMjAzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyNTMyOgotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX05TMzI1MzIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLSAgCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvcGUtYXJtLmMgYi9iZmQvcGUtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmI2NTkuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBUk0gUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybXBlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgInBlLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybXBlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgInBlLWFybS1iaWciCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaWZuZGVmIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIAotI2RlZmluZSBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2FybV9wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0jZGVmaW5lIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCi0JYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0jZW5kaWYKLQkKLSNpZmRlZiBBUk1fV0lOQ0UKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgMAotI2VuZGlmCi0KLSNpbmNsdWRlICJjb2ZmLWFybS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlLWkzODYuYyBiL2JmZC9wZS1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZWI3ODQuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotCi0jZGVmaW5lIFRBUkdFVF9TWU0gaTM4NnBlX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRSAicGUtaTM4NiIKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLmlkYXRhIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIucGRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfQotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtbWNvcmUuYyBiL2JmZC9wZS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTE5ZjgxLi4wMDAwMDAwCi0tLSBhL2JmZC9wZS1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNQ29yZSBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0JJR19TWU0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgbWNvcmVfcGVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGUtbWNvcmUtYmlnIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBtY29yZV9wZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJwZS1tY29yZS1saXR0bGUiCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgICAgdHJ1ZQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jZGVmaW5lIE1DT1JFX1BFCi0KLSNpbmNsdWRlICJjb2ZmLW1jb3JlLmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtbWlwcy5jIGIvYmZkL3BlLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4OTM2OS4uMDAwMDAwMAotLS0gYS9iZmQvcGUtbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTk4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUlQUyBQRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgTW9kaWZpZWQgZnJvbSBjb2ZmLWkzODYuYyBieSBESiBEZWxvcmllLCBkakBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL21pcHNwZS5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfbWlwc19yZWxvYyAKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9taXBzX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCi0JICAgYmZkX3ZtYSAqKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSAgICAgICBQVFIpKTsKLXN0YXRpYyB2b2lkIG1pcHNfYWRqdXN0X3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgIGFyZWxlbnQgKikpOwotc3RhdGljIHZvaWQgbWlwc19hZGp1c3RfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCi0JCQkJCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0jZW5kaWYKLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0KLS8qIEZvciBzb21lIHJlYXNvbiB3aGVuIHVzaW5nIG1pcHMgQ09GRiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24gc3ltYm9sIGlzIHRoZSB2YWx1ZSBpdHNlbGYgcGx1cwotICAgYW55IGRlc2lyZWQgb2Zmc2V0LiAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl9taXBzX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotI2Vsc2UKLSAgICAgIC8qIEluIFBFIG1vZGUsIHdlIGRvIG5vdCBvZmZzZXQgdGhlIGNvbW1vbiBzeW1ib2wuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgMzg2Ci0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpZiAwCi0gIC8qIGRqIC0gaGFuZGxlIGl0IGxpa2UgYW55IG90aGVyIHJlbG9jPyAqLwotICAvKiBGSVhNRTogSG93IHNob3VsZCB0aGlzIGNhc2UgYmUgaGFuZGxlZD8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+aG93dG8tPnR5cGUgPT0gTUlQU19SX1JWQSAmJiBkaWZmICE9IDApCi0gICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIChkaWZmID4+IGhvd3RvLT5yaWdodHNoaWZ0KSkgJiBob3d0by0+ZHN0X21hc2spKQotCi0gICAgaWYgKGRpZmYgIT0gMCkKLSAgICAgIHsKLQlyZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQl1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0Jc3dpdGNoIChob3d0by0+c2l6ZSkKLQkgIHsKLQkgIGNhc2UgMDoKLQkgICAgewotCSAgICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICB7Ci0JICAgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDI6Ci0JICAgIHsKLQkgICAgICBsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBNSVBTX1JfUlZBOwotfSAgICAgCi0jZW5kaWYKLQotI2lmbmRlZiBQQ1JFTE9GRlNFVAotI2RlZmluZSBQQ1JFTE9GRlNFVCBmYWxzZQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgLyogUmVsb2MgdHlwZSAwIGlzIGlnbm9yZWQuICBUaGUgcmVsb2MgcmVhZGluZyBjb2RlIGVuc3VyZXMgdGhhdAotICAgICB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAuYWJzIHNlY3Rpb24sIHdoaWNoIHdpbGwgY2F1c2UKLSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB0byBkbyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9BQlNPTFVURSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wsIG5vcm1hbGx5IGZyb20gYSBkYXRhIHNlY3Rpb24uICAqLwotICBIT1dUTyAoTUlQU19SX1JFRkhBTEYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfbWlwc19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGSEFMRiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbCwgbm9ybWFsbHkgZnJvbSBhIGRhdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGV09SRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9taXBzX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZXT1JEIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDI2IGJpdCBhYnNvbHV0ZSBqdW1wIGFkZHJlc3MuICAqLwotICBIT1dUTyAoTUlQU19SX0pNUEFERFIsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93Ci0JCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCi0JCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCi0JIGNvZmZfbWlwc19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSk1QQUREUiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIDE2IGJpdHMgb2YgYSBzeW1ib2wgdmFsdWUuICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICBtaXBzX3JlZmhpX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZISSwJCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX21pcHNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkhJIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGxvdyAxNiBiaXRzIG9mIGEgc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZMTywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9taXBzX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMTyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVmZXJlbmNlIHRvIGFuIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4gIEhhbmRsZWQgYnkgdGhlCi0gICAgIGZ1bmN0aW9uIG1pcHNfZ3ByZWxfcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX0dQUkVMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfbWlwc19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdXNpbmcgYW4gb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLgotICAgICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbiBtaXBzX2dwcmVsX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9taXBzX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRFUkFMIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDgpLAotICBFTVBUWV9IT1dUTyAoOSksCi0gIEVNUFRZX0hPV1RPICgxMCksCi0gIEVNUFRZX0hPV1RPICgxMSksCi0gIEVNUFRZX0hPV1RPICgxMiksCi0gIEVNUFRZX0hPV1RPICgxMyksCi0gIEVNUFRZX0hPV1RPICgxNCksCi0gIEVNUFRZX0hPV1RPICgxNSksCi0gIEVNUFRZX0hPV1RPICgxNiksCi0gIEVNUFRZX0hPV1RPICgxNyksCi0gIEVNUFRZX0hPV1RPICgxOCksCi0gIEVNUFRZX0hPV1RPICgxOSksCi0gIEVNUFRZX0hPV1RPICgyMCksCi0gIEVNUFRZX0hPV1RPICgyMSksCi0gIEVNUFRZX0hPV1RPICgyMiksCi0gIEVNUFRZX0hPV1RPICgyMyksCi0gIEVNUFRZX0hPV1RPICgyNCksCi0gIEVNUFRZX0hPV1RPICgyNSksCi0gIEVNUFRZX0hPV1RPICgyNiksCi0gIEVNUFRZX0hPV1RPICgyNyksCi0gIEVNUFRZX0hPV1RPICgyOCksCi0gIEVNUFRZX0hPV1RPICgyOSksCi0gIEVNUFRZX0hPV1RPICgzMCksCi0gIEVNUFRZX0hPV1RPICgzMSksCi0gIEVNUFRZX0hPV1RPICgzMiksCi0gIEVNUFRZX0hPV1RPICgzMyksCi0gIEhPV1RPIChNSVBTX1JfUlZBLCAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfbWlwc19yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAicnZhMzIiLAkgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICBFTVBUWV9IT1dUTyAoMzUpLAotICBFTVBUWV9IT1dUTyAoMzYpLAotICBIT1dUTyAoTUlQU19SX1BBSVIsICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX21pcHNfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlBBSVIiLAkgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIE1JUFNCQURNQUcoeCkKLSNkZWZpbmUgTUlQUyAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLS8qIENvbXB1dGUgdGhlIGFkZGVuZCBvZiBhIHJlbG9jLiAgSWYgdGhlIHJlbG9jIGlzIHRvIGEgY29tbW9uIHN5bWJvbCwKLSAgIHRoZSBvYmplY3QgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBCeSB0aGUKLSAgIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBsaW5rZXIgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IHN5bWJvbAotICAgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiAgVGhlcmVmb3JlLCB3ZQotICAgaGFjayB3aWxkbHkgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBzeW1ib2wgZnJvbSB0aGlzIGZpbGUgc28gdGhhdCB3ZQotICAgY2FuIG1ha2UgdGhlIGNvcnJlY3QgYWRqdXN0bWVudC4gIFRoaXMgbWFjcm8gc2V0cyBjb2Zmc3ltIHRvIHRoZQotICAgc3ltYm9sIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIGFuZCB1c2VzIGl0IHRvIHNldCB0aGUgYWRkZW5kIHZhbHVlCi0gICBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIG5vdCBhIGNvbW1vbiBzeW1ib2wsIHRoZSB1c3VhbCBhZGRlbmQKLSAgIGNhbGN1bGF0aW9uIGlzIGRvbmUsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgdHdlYWsgaXMgbmVlZGVkIGZvcgotICAgUEMgcmVsYXRpdmUgcmVsb2NzLgotICAgRklYTUU6IFRoaXMgbWFjcm8gcmVmZXJzIHRvIHN5bWJvbHMgYW5kIGFzZWN0OyB0aGVzZSBhcmUgZnJvbSB0aGUKLSAgIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCB0aGUgbWFjcm8gYXJndW1lbnRzLiAgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsJXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpCQkJXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkJCQkJXAotCSAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7CQlcCi0gICAgZWxzZSBpZiAocHRyKQkJCQkJCVwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOwkJCVwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCQkJXAotCSYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsJXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZAkJXAotCSAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOwlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7CQkJCQlcCi0gICAgaWYgKHB0ciAmJiBob3d0b190YWJsZVtyZWxvYy5yX3R5cGVdLnBjX3JlbGF0aXZlKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0KLQotLyogQ29udmVydCBhbiBydHlwZSB0byBob3d0byBmb3IgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX21pcHNfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICphZGRlbmRwID0gMDsKLSNlbmRpZgotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgLyogSSB0aGluayB3ZSAqZG8qIHdhbnQgdG8gYnlwYXNzIHRoaXMuICBJZiB3ZSBkb24ndCwgSSBoYXZlCi0JIHNlZW4gc29tZSBkYXRhIHBhcmFtZXRlcnMgZ2V0IHRoZSB3cm9uZyByZWxvY2F0aW9uIGFkZHJlc3MuCi0JIElmIEkgbGluayB0d28gdmVyc2lvbnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIHNlY3Rpb24gYnlwYXNzZWQKLQkgYW5kIHRoZW4gZG8gYSBiaW5hcnkgY29tcGFyaXNvbiwgdGhlIGFkZHJlc3NlcyB3aGljaCBhcmUKLQkgZGlmZmVyZW50IGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIG1hcC4gIFRoZSBjYXNlIGluIHdoaWNoCi0JIHRoaXMgc2VjdGlvbiBoYXMgYmVlbiBieXBhc3NlZCBoYXMgYWRkcmVzc2VzIHdoaWNoIGNvcnJlc3BvbmQKLQkgdG8gdmFsdWVzIEkgY2FuIGZpbmQgaW4gdGhlIG1hcC4gICovCi0gICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQotICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQotICAgICBjb21tb24gc3ltYm9sLiAgKi8KLSAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pIAotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IDQ7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCi0gICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KLSAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAotICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIGlmIChyZWwtPnJfdHlwZSA9PSBNSVBTX1JfUlZBKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IHBlX2RhdGEoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiBob3d0bzsKLX0KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfbWlwc19ydHlwZV90b19ob3d0bwotCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgY29mZl9taXBzX3JlbG9jX3R5cGVfbG9va3VwCi0KLQotCi0vKiBHZXQgdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgYSBnZW5lcmljIHJlbG9jIHR5cGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX21pcHNfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IG1pcHNfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhBTEY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRldPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9KTVBBRERSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhJOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZMTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfR1BSRUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotLyogRklYTUU/Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUENSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUzoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUxISTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0xPMTY6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVMTE87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1NXSVRDSDsKLSAgICAgIGJyZWFrOwotKi8KLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUlZBOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJmhvd3RvX3RhYmxlW21pcHNfdHlwZV07Ci19Ci0KLXN0YXRpYyB2b2lkCi1taXBzX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIHN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgcGFpcl9wcmV2OwotICBSRUxPQyAqcmVsb2Nfc3JjID0gKFJFTE9DICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19kc3QgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopIGRzdDsKLQotICByZWxvY19kc3QtPnJfdmFkZHIgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopcmVsb2Nfc3JjLT5yX3ZhZGRyKTsKLSAgcmVsb2NfZHN0LT5yX3N5bW5keCA9Ci0gICAgYmZkX2hfZ2V0X3NpZ25lZF8zMihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3N5bW5keCk7Ci0gIHJlbG9jX2RzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfdHlwZSk7Ci0gIHJlbG9jX2RzdC0+cl9zaXplID0gMDsKLSAgcmVsb2NfZHN0LT5yX2V4dGVybiA9IDA7Ci0gIHJlbG9jX2RzdC0+cl9vZmZzZXQgPSAwOwotCi0gIHN3aXRjaCAocmVsb2NfZHN0LT5yX3R5cGUpCi0gIHsKLSAgY2FzZSBNSVBTX1JfUkVGSEk6Ci0gICAgcGFpcl9wcmV2ID0gKnJlbG9jX2RzdDsKLSAgICBicmVhazsKLSAgY2FzZSBNSVBTX1JfUEFJUjoKLSAgICByZWxvY19kc3QtPnJfb2Zmc2V0ID0gcmVsb2NfZHN0LT5yX3N5bW5keDsKLSAgICBpZiAocmVsb2NfZHN0LT5yX29mZnNldCAmIDB4ODAwMCkKLSAgICAgIHJlbG9jX2RzdC0+cl9vZmZzZXQgLT0gMHgxMDAwMDsKLSAgICAvKnByaW50ZigiZGo6IHBhaXIgb2Zmc2V0IGlzICUwOHhcbiIsIHJlbG9jX2RzdC0+cl9vZmZzZXQpOyovCi0gICAgcmVsb2NfZHN0LT5yX3N5bW5keCA9IHBhaXJfcHJldi5yX3N5bW5keDsKLSAgICBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1taXBzX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJc3JjOwotICAgICBQVFIJZHN0OwotewotICBzdGF0aWMgaW50IHByZXZfb2Zmc2V0ID0gMTsKLSAgc3RhdGljIGJmZF92bWEgcHJldl9hZGRyID0gMDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0KLSAgc3dpdGNoIChyZWxvY19zcmMtPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBNSVBTX1JfUkVGSEk6Ci0gICAgICBwcmV2X2FkZHIgPSByZWxvY19zcmMtPnJfdmFkZHI7Ci0gICAgICBwcmV2X29mZnNldCA9IHJlbG9jX3NyYy0+cl9vZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1JUFNfUl9SRUZMTzoKLSAgICAgIGlmIChyZWxvY19zcmMtPnJfdmFkZHIgPT0gcHJldl9hZGRyKQotCXsKLQkgIC8qIEZJWE1FOiBvbmx5IHNsaWdodGx5IGhhY2tpc2guICBJZiB3ZSBzZWUgYSBSRUZMTyBwb2ludGluZyB0bwotCSAgICAgdGhlIHNhbWUgYWRkcmVzcyBhcyBhIFJFRkhJLCB3ZSBhc3N1bWUgdGhpcyBpcyB0aGUgbWF0Y2hpbmcKLQkgICAgIFBBSVIgcmVsb2MgYW5kIG91dHB1dCBpdCBhY2NvcmRpbmdseS4gIFRoZSBzeW1uZHggaXMgcmVhbGx5Ci0JICAgICB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCAqLwotCSAgYmZkX2hfcHV0XzMyIChhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsCi0JCQkoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3ZhZGRyKTsKLQkgIGJmZF9oX3B1dF8zMiAoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwKLQkJCShiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfc3ltbmR4KTsKLQotCSAgYmZkX2hfcHV0XzE2KGFiZmQsIE1JUFNfUl9QQUlSLCAoYmZkX2J5dGUgKikKLQkJICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLQkgIHJldHVybiBSRUxTWjsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIHJlbG9jX3NyYy0+cl92YWRkciwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl92YWRkcik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfc3ltbmR4LCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3N5bW5keCk7Ci0KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlLCAoYmZkX2J5dGUgKikKLQkgICAgICAgcmVsb2NfZHN0LT5yX3R5cGUpOwotICByZXR1cm4gUkVMU1o7Ci19Ci0KLSNkZWZpbmUgY29mZl9zd2FwX3JlbG9jX2luIG1pcHNfc3dhcF9yZWxvY19pbgotI2RlZmluZSBjb2ZmX3N3YXBfcmVsb2Nfb3V0IG1pcHNfc3dhcF9yZWxvY19vdXQKLSNkZWZpbmUgTk9fQ09GRl9SRUxPQ1MKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcGVfbWlwc19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCSAgICAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBiZmRfdm1hIGdwOwotICBib29sZWFuIGdwX3VuZGVmaW5lZDsKLSAgc2l6ZV90IGFkanVzdDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsX2VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJvb2xlYW4gZ290X2xvOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gIHsKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikoXygiXAotJXM6IGBsZCAtcicgbm90IHN1cHBvcnRlZCB3aXRoIFBFIE1JUFMgb2JqZWN0c1xuIiksCi0JCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyKTsKLQotI2lmIDAKLSAgcHJpbnRmKCJkajogcmVsb2NhdGUgJXMoJXMpICUwOHhcbiIsCi0JIGlucHV0X2JmZC0+ZmlsZW5hbWUsIGlucHV0X3NlY3Rpb24tPm5hbWUsCi0JIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMCkKLSAgICBncF91bmRlZmluZWQgPSB0cnVlOwotICBlbHNlCi0gICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0KLSAgZ290X2xvID0gZmFsc2U7Ci0KLSAgYWRqdXN0ID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbF9lbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yIChpID0gMDsgcmVsIDwgcmVsX2VuZDsgcmVsKyssIGkrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kID0gMDsKLSAgICAgIGJmZF92bWEgdmFsLCB0bXAsIHRhcmcsIHNyYywgbG93OwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBjaGFyICptZW0gPSBjb250ZW50cyArIHJlbC0+cl92YWRkcjsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIENPRkYgdHJlYXRzIGNvbW1vbiBzeW1ib2xzIGluIG9uZSBvZiB0d28gd2F5cy4gIEVpdGhlciB0aGUKLSAgICAgICAgIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgb3IgaXQKLSAgICAgICAgIGlzIG5vdC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzaXplIGlzIG5vdCBpbmNsdWRlZCwgYW5kIGZvcmNlCi0gICAgICAgICB0aGUgcnR5cGVfdG9faG93dG8gZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSBhZGRlbmQgYXMgbmVlZGVkLiAgKi8KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLQotICAgICAgaG93dG8gPSBiZmRfY29mZl9ydHlwZV90b19ob3d0byAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwsIGgsCi0JCQkJICAgICAgIHN5bSwgJmFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGVuIHdlIGNhbiBqdXN0IGlnbm9yZQotICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyB0aGF0IGlzIHBjcmVsX29mZnNldC4gIEl0IHdpbGwgYWxyZWFkeQotICAgICAgICAgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIElmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssCi0gICAgICAgICB0aGVuIHdlIHNob3VsZCBpZ25vcmUgdGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JewotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgY29udGludWU7Ci0JICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JICAgIGFkZGVuZCArPSBzeW0tPm5fdmFsdWU7Ci0JfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKGlucHV0X2JmZCkpCi0JCXZhbCAtPSBzZWMtPnZtYTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsIHRydWUpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBzcmMgPSByZWwtPnJfdmFkZHIgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotI2lmIDAKLSAgICAgIHByaW50ZigiZGo6IHJlbG9jICUwMnggJS04cyBhPSUwOHgvJTA4eCglMDh4KSB2PSUwOHgrJTA4eCAlc1xuIiwKLQkgICAgIHJlbC0+cl90eXBlLCBob3d0b190YWJsZVtyZWwtPnJfdHlwZV0ubmFtZSwKLQkgICAgIHNyYywgcmVsLT5yX3ZhZGRyLCAqKHVuc2lnbmVkIGxvbmcgKiltZW0sIHZhbCwgcmVsLT5yX29mZnNldCwKLQkgICAgIGg/aC0+cm9vdC5yb290LnN0cmluZzoiKG5vbmUpIik7Ci0jZW5kaWYKLQotICAgICAgLyogT0ssIGF0IHRoaXMgcG9pbnQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHNldCB1cDoKLQkgICBzcmMgPSBWTUEgb2YgdGhlIG1lbW9yeSB3ZSdyZSBmaXhpbmcgdXAKLQkgICBtZW0gPSBwb2ludGVyIHRvIG1lbW9yeSB3ZSdyZSBmaXhpbmcgdXAKLQkgICB2YWwgPSBWTUEgb2Ygd2hhdCB3ZSBuZWVkIHRvIHJlZmVyIHRvCi0gICAgICAqLwotCi0jZGVmaW5lIFVJKHgpICgqX2JmZF9lcnJvcl9oYW5kbGVyKShfKCIlczogdW5pbXBsZW1lbnRlZCAlc1xuIiksIFwKLQkJCQkgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgeCk7IFwKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JY2FzZSBNSVBTX1JfQUJTT0xVVEU6Ci0JICAvKiBpZ25vcmUgdGhlc2UgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfUkVGSEFMRjoKLQkgIFVJKCJyZWZoYWxmIik7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX1JFRldPUkQ6Ci0JICB0bXAgPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbWVtKTsKLQkgIC8qIHByaW50ZigicmVmd29yZDogc3JjPSUwOHggdGFyZz0lMDh4KyUwOHhcbiIsIHNyYywgdG1wLCB2YWwpOyAqLwotCSAgdG1wICs9IHZhbDsKLQkgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCB0bXAsIG1lbSk7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX0pNUEFERFI6Ci0JICB0bXAgPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbWVtKTsKLQkgIHRhcmcgPSB2YWwgKyAodG1wJjB4MDNmZmZmZmYpKjQ7Ci0JICBpZiAoKHNyYyAmIDB4ZjAwMDAwMDApICE9ICh0YXJnICYgMHhmMDAwMDAwMCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikoXygiJXM6IGp1bXAgdG9vIGZhciBhd2F5XG4iKSwKLQkJCQkgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICB0bXAgJj0gMHhmYzAwMDAwMDsKLQkgIHRtcCB8PSAodGFyZy80KSAmIDB4M2ZmZmZmZjsKLQkgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCB0bXAsIG1lbSk7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX1JFRkhJOgotCSAgdG1wID0gYmZkX2dldF8zMihpbnB1dF9iZmQsIG1lbSk7Ci0JICBzd2l0Y2ggKHJlbFsxXS5yX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBNSVBTX1JfUEFJUjoKLQkgICAgICAvKiBNUyBQRSBvYmplY3QgKi8KLQkgICAgICB0YXJnID0gdmFsICsgcmVsWzFdLnJfb2Zmc2V0ICsgKCh0bXAgJiAweGZmZmYpIDw8IDE2KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBNSVBTX1JfUkVGTE86Ci0JICAgICAgLyogR05VIENPRkYgb2JqZWN0ICovCi0JICAgICAgbG93ID0gYmZkX2dldF8zMihpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsWzFdLnJfdmFkZHIpOwotCSAgICAgIGxvdyAmPSAweGZmZmY7Ci0JICAgICAgaWYgKGxvdyAmIDB4ODAwMCkKLQkJbG93IC09IDB4MTAwMDA7Ci0JICAgICAgdGFyZyA9IHZhbCArIGxvdyArICgodG1wICYgMHhmZmZmKSA8PCAxNik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpKF8oIiVzOiBiYWQgcGFpci9yZWZsbyBhZnRlciByZWZoaVxuIiksCi0JCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgdG1wICY9IDB4ZmZmZjAwMDA7Ci0JICB0bXAgfD0gKHRhcmcgPj4gMTYpICYgMHhmZmZmOwotCSAgYmZkX3B1dF8zMihpbnB1dF9iZmQsIHRtcCwgbWVtKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfUkVGTE86Ci0JICB0bXAgPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbWVtKTsKLQkgIHRhcmcgPSB2YWwgKyAodG1wICYgMHhmZmZmKTsKLQkgIC8qIHByaW50ZigicmVmd29yZDogc3JjPSUwOHggdGFyZz0lMDh4XG4iLCBzcmMsIHRhcmcpOyAqLwotCSAgdG1wICY9IDB4ZmZmZjAwMDA7Ci0JICB0bXAgfD0gdGFyZyAmIDB4ZmZmZjsKLQkgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCB0bXAsIG1lbSk7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX0dQUkVMOgotCWNhc2UgTUlQU19SX0xJVEVSQUw6Ci0JICBVSSgiZ3ByZWwiKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfU0VDVElPTjoKLQkgIFVJKCJzZWN0aW9uIik7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX1NFQ1JFTDoKLQkgIFVJKCJzZWNyZWwiKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfU0VDUkVMTE86Ci0JICBVSSgic2VjcmVsbG8iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfU0VDUkVMSEk6Ci0JICBVSSgic2VjcmVsaGkiKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBNSVBTX1JfUlZBOgotCSAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBtZW0pOwotCSAgLyogcHJpbnRmKCJydmE6IHNyYz0lMDh4IHRhcmc9JTA4eCslMDh4XG4iLCBzcmMsIHRtcCwgdmFsKTsgKi8KLQkgIHRtcCArPSB2YWwKLQkgICAgLSBwZV9kYXRhIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB0bXAsIG1lbSk7Ci0JICBicmVhazsKLQotCWNhc2UgTUlQU19SX1BBSVI6Ci0JICAvKiBpZ25vcmUgdGhlc2UgKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfcGVfbWlwc19yZWxvY2F0ZV9zZWN0aW9uCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotCi0vKiBJZiBtaXBzIGdjYyB1c2VzIHVuZGVyc2NvcmVzIGZvciBzeW1ib2wgbmFtZXMsIHRoZW4gaXQgZG9lcyBub3QgdXNlCi0gICBhIGxlYWRpbmcgZG90IGZvciBsb2NhbCBsYWJlbHMsIHNvIGlmIFRBUkdFVF9VTkRFUlNDT1JFIGlzIGRlZmluZWQKLSAgIHdlIHRyZWF0IGFsbCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggTCBhcyBsb2NhbC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfbWlwc19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbWlwc19pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICdMJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgY29mZl9taXBzX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2VuZGlmIC8qIFRBUkdFVF9VTkRFUlNDT1JFICovCi0KLSNkZWZpbmUgQ09GRl9OT19IQUNLX1NDTkhEUl9TSVpFCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIG1pcHNscGVfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgInBlLW1pcHMiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0jZWxzZQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0gIFRBUkdFVF9VTkRFUlNDT1JFLAkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZWxzZQotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbmRpZgotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgQ09GRl9TV0FQX1RBQkxFCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3BlLXBwYy5jIGIvYmZkL3BlLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRhNTQ3Li4wMDAwMDAwCi0tLSBhL2JmZC9wZS1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUG93ZXJQQyBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNkZWZpbmUgRV9GSUxFTk1MRU4gICAgIDE4Ci0KLSNkZWZpbmUgUFBDX1BFCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICBiZmRfcG93ZXJwY2xlX3BlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgInBlLXBvd2VycGNsZSIKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgIGJmZF9wb3dlcnBjX3BlX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgInBlLXBvd2VycGMiCi0KLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotLyogRklYTUU6IHZlcmlmeSBQQ1JFTE9GRlNFVCBpcyBhbHdheXMgZmFsc2UgKi8KLQotLyogRklYTUU6IFRoaXMgdGFyZ2V0IG5vIGxvbmdlciB3b3Jrcy4gIFNlYXJjaCBmb3IgUE9XRVJQQ19MRV9QRSBpbgotICAgY29mZi1wcGMuYyBhbmQgcGVpZ2VuLmMuICAqLwotCi0jaW5jbHVkZSAiY29mZi1wcGMuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZS1zaC5jIGIvYmZkL3BlLXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDhiMGUuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFNIIFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotCi0jZGVmaW5lIFRBUkdFVF9TSExfU1lNIHNobHBlX3ZlYwotI2RlZmluZSBUQVJHRVRfU0hMX05BTUUgInBlLXNobCIKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJjb2ZmLXNoLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLWFybS5jIGIvYmZkL3BlaS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhZTAxZS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhcm0gUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmbmRlZiBUQVJHRVRfTElUVExFX1NZTQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgYXJtcGVpX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICJwZWktYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgIGFybXBlaV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGVpLWFybS1iaWciCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJjb2ZmLWFybS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1pMzg2LmMgYi9iZmQvcGVpLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwZjc3YS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IFBFIElNQUdFIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgVEFSR0VUX1NZTSBpMzg2cGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRSAicGVpLWkzODYiCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jZGVmaW5lIENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyBcCi17IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuaWRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5wZGF0YSIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9Ci0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktbWNvcmUuYyBiL2JmZC9wZWktbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjM2I5NS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLW1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1Db3JlIFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmbmRlZiBUQVJHRVRfQklHX1NZTQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBtY29yZV9wZWlfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGVpLW1jb3JlLWJpZyIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgbWNvcmVfcGVpX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgInBlaS1tY29yZS1saXR0bGUiCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNkZWZpbmUgTUNPUkVfUEUKLQotI2luY2x1ZGUgImNvZmYtbWNvcmUuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktbWlwcy5jIGIvYmZkL3BlaS1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmQzNWQuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1JUFMgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBUQVJHRVRfU1lNIG1pcHNscGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRSAicGVpLW1pcHMiCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJwZS1taXBzLmMiCi0KLQotCmRpZmYgLS1naXQgYS9iZmQvcGVpLXBwYy5jIGIvYmZkL3BlaS1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlMWE1ZC4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIFBFIElNQUdFIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0vKiBzZXR0aW5nIHVwIGZvciBhIFBFIGVudmlyb25tZW50IHN0b2xlbiBkaXJlY3RseSBmcm9tIHRoZSBpMzg2IHN0cnVjdHVyZSAqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLQotI2RlZmluZSBQUENfUEUKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgInBlaS1wb3dlcnBjbGUiCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICBiZmRfcG93ZXJwY19wZWlfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGVpLXBvd2VycGMiCi0KLSNkZWZpbmUgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLS8qIEZJWE1FOiBWZXJpZnkgUENSRUxPRkZTRVQgaXMgYWx3YXlzIGZhbHNlICovCi0KLS8qIEZJWE1FOiBUaGlzIHRhcmdldCBubyBsb25nZXIgd29ya3MuICBTZWFyY2ggZm9yIFBPV0VSUENfTEVfUEUgaW4KLSAgIGNvZmYtcHBjLmMgYW5kIHBlaWdlbi5jLiAgKi8KLQotI2luY2x1ZGUgImNvZmYtcHBjLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLXNoLmMgYi9iZmQvcGVpLXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjhiMWMuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTSCBQRSBJTUFHRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIFRBUkdFVF9TSExfU1lNIHNobHBlaV92ZWMKLSNkZWZpbmUgVEFSR0VUX1NITF9OQU1FICJwZWktc2hsIgotI2RlZmluZSBJTUFHRV9CQVNFIE5UX0lNQUdFX0JBU0UKLSNkZWZpbmUgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCB0cnVlCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICdfJwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAiY29mZi1zaC5jIgotCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL3BlaWNvZGUuaCBiL2JmZC9wZWljb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzhjNzguLjAwMDAwMDAKLS0tIGEvYmZkL3BlaWNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjcgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgUEUvUEVJLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20KLQotUEUvUEVJIHJlYXJyYW5nZW1lbnQgKGFuZCBjb2RlIGFkZGVkKTogRG9ubiBUZXJyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdheSBTeXN0ZW1zLCBJbmMuCi0qLwotCi0vKiBIZXkgbG9vaywgc29tZSBkb2N1bWVudGF0aW9uIFthbmQgaW4gYSBwbGFjZSB5b3UgZXhwZWN0IHRvIGZpbmQgaXRdIQotCi0gICBUaGUgbWFpbiByZWZlcmVuY2UgZm9yIHRoZSBwZWkgZm9ybWF0IGlzICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiA0LjEiLiAgR2V0IGl0IGlmIHlvdSBuZWVkIHRvCi0gICBkbyBzb21lIHNlcmlvdXMgaGFja2luZyBvbiB0aGlzIGNvZGUuCi0KLSAgIEFub3RoZXIgcmVmZXJlbmNlOgotICAgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOS4KLQotICAgVGhlICpzb2xlKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBlIGZvcm1hdCBhbmQgdGhlIHBlaSBmb3JtYXQgaXMgdGhhdCB0aGUKLSAgIGxhdHRlciBoYXMgYW4gTVNET1MgMi4wIC5leGUgaGVhZGVyIG9uIHRoZSBmcm9udCB0aGF0IHByaW50cyB0aGUgbWVzc2FnZQotICAgIlRoaXMgYXBwIG11c3QgYmUgcnVuIHVuZGVyIFdpbmRvd3MuIiAob3Igc29tZSBzdWNoKS4KLSAgIChGSVhNRTogV2hldGhlciB0aGF0IHN0YXRlbWVudCBpcyAqcmVhbGx5KiB0cnVlIG9yIG5vdCBpcyB1bmtub3duLgotICAgQXJlIHRoZXJlIG1vcmUgc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gcGUgYW5kIHBlaSBmb3JtYXRzPwotICAgRm9yIG5vdyBhc3N1bWUgdGhlcmUgYXJlbid0LiAgSWYgeW91IGZpbmQgb25lLCB0aGVuIGZvciBHb2Qgc2FrZXMKLSAgIGRvY3VtZW50IGl0IGhlcmUhKQotCi0gICBUaGUgTWljcm9zb2Z0IGRvY3MgdXNlIHRoZSB3b3JkICJpbWFnZSIgaW5zdGVhZCBvZiAiZXhlY3V0YWJsZSIgYmVjYXVzZQotICAgdGhlIGZvcm1lciBjYW4gYWxzbyByZWZlciB0byBhIERMTCAoc2hhcmVkIGxpYnJhcnkpLiAgQ29uZnVzaW9uIGNhbiBhcmlzZQotICAgYmVjYXVzZSB0aGUgYGknIGluIGBwZWknIGFsc28gcmVmZXJzIHRvICJpbWFnZSIuICBUaGUgYHBlJyBmb3JtYXQgY2FuCi0gICBhbHNvIGNyZWF0ZSBpbWFnZXMgKGkuZS4gZXhlY3V0YWJsZXMpLCBpdCdzIGp1c3QgdGhhdCB0byBydW4gb24gYSB3aW4zMgotICAgc3lzdGVtIHlvdSBuZWVkIHRvIHVzZSB0aGUgcGVpIGZvcm1hdC4KLQotICAgRklYTUU6IFBsZWFzZSBhZGQgbW9yZSBkb2NzIGhlcmUgc28gdGhlIG5leHQgcG9vciBmb29sIHRoYXQgaGFzIHRvIGhhY2sKLSAgIG9uIHRoaXMgY29kZSBoYXMgYSBjaGFuY2Ugb2YgZ2V0dGluZyBzb21ldGhpbmcgYWNjb21wbGlzaGVkIHdpdGhvdXQKLSAgIHdhc3RpbmcgdG9vIG11Y2ggdGltZS4KLSovCi0KLSNpbmNsdWRlICJsaWJwZWkuaCIKLQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKQotICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIpKSA9Ci0jaWZuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgICAgTlVMTDsKLSNlbHNlCi0gICAgIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGE7Ci0jdW5kZWYgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOwotI2RlZmluZSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotCi1zdGF0aWMgYm9vbGVhbiAoKnBlX3NhdmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkKLSAgICBQQVJBTVMgKChiZmQgKiwgYmZkICopKSA9Ci0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICAgICBOVUxMOwotI2Vsc2UKLSAgICAgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhOwotI3VuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgY29mZl9ta29iamVjdCAgICAgIHBlX21rb2JqZWN0Ci0jZGVmaW5lIGNvZmZfbWtvYmplY3RfaG9vayBwZV9ta29iamVjdF9ob29rCi0KLSNpZm5kZWYgTk9fQ09GRl9SRUxPQ1MKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgY29mZl9zd2FwX2ZpbGVoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfc2NuaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIGJvb2xlYW4gcGVfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBQVFIgcGVfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgc3RhdGljIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBJTEYgY29kZS4gICovCi10eXBlZGVmIGFzZWN0aW9uICogYXNlY3Rpb25fcHRyOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmQgKgkJCWFiZmQ7Ci0gIGJmZF9ieXRlICoJCWRhdGE7Ci0gIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICogYmltOwotICB1bnNpZ25lZCBzaG9ydCAgICAgICAgbWFnaWM7Ci0gIAotICBhcmVsZW50ICoJCXJlbHRhYjsKLSAgdW5zaWduZWQgaW50IAkJcmVsY291bnQ7Ci0KLSAgY29mZl9zeW1ib2xfdHlwZSAqIAlzeW1fY2FjaGU7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKiAJc3ltX3B0cjsKLSAgdW5zaWduZWQgaW50ICAgICAgIAlzeW1faW5kZXg7Ci0gIAotICB1bnNpZ25lZCBpbnQgKiAJc3ltX3RhYmxlOwotICB1bnNpZ25lZCBpbnQgKiAJdGFibGVfcHRyOwotICAKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqIG5hdGl2ZV9zeW1zOwotICBjb21iaW5lZF9lbnRyeV90eXBlICogbmF0aXZlX3B0cjsKLQotICBjb2ZmX3N5bWJvbF90eXBlICoqCXN5bV9wdHJfdGFibGU7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKioJc3ltX3B0cl9wdHI7Ci0gIAotICB1bnNpZ25lZCBpbnQJCXNlY19pbmRleDsKLQotICBjaGFyICogICAgICAgICAgICAgICAgc3RyaW5nX3RhYmxlOwotICBjaGFyICogICAgICAgICAgICAgICAgc3RyaW5nX3B0cjsKLSAgY2hhciAqCQllbmRfc3RyaW5nX3B0cjsKLSAgCi0gIFNZTUVOVCAqICAgICAgICAgICAgICBlc3ltX3RhYmxlOwotICBTWU1FTlQgKiAgICAgICAgICAgICAgZXN5bV9wdHI7Ci0KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogaW50X3JlbHRhYjsKLX0KLXBlX0lMRl92YXJzOwotCi1zdGF0aWMgYXNlY3Rpb25fcHRyICAgICAgIHBlX0lMRl9tYWtlX2Ffc2VjdGlvbiAgIFBBUkFNUyAoKHBlX0lMRl92YXJzICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBmbGFnd29yZCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBwZV9JTEZfbWFrZV9hX3JlbG9jICAgICBQQVJBTVMgKChwZV9JTEZfdmFycyAqLCBiZmRfdm1hLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsIGFzZWN0aW9uX3B0cikpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBwZV9JTEZfbWFrZV9hX3N5bWJvbCAgICBQQVJBTVMgKChwZV9JTEZfdmFycyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYXNlY3Rpb25fcHRyLCBmbGFnd29yZCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBwZV9JTEZfc2F2ZV9yZWxvY3MgICAgICBQQVJBTVMgKChwZV9JTEZfdmFycyAqLCBhc2VjdGlvbl9wdHIpKTsKLXN0YXRpYyB2b2lkCQkgIHBlX0lMRl9tYWtlX2Ffc3ltYm9sX3JlbG9jICBQQVJBTVMgKChwZV9JTEZfdmFycyAqLCBiZmRfdm1hLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsCSAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gICAgICAgICAgICBwZV9JTEZfYnVpbGRfYV9iZmQgICAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgc2hvcnQsIGJmZF9ieXRlICosIGJmZF9ieXRlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHBlX0lMRl9vYmplY3RfcCAgICAgICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHBlX2JmZF9vYmplY3RfcCAJICBQQVJBTVMgKChiZmQgKikpOwotI2VuZGlmIC8qIENPRkZfSU1BR0VfV0lUSF9QRSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBOT19DT0ZGX1JFTE9DUwotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKnJlbG9jX3NyYyA9IChSRUxPQyAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBkc3Q7Ci0KLSAgcmVsb2NfZHN0LT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKXJlbG9jX3NyYy0+cl92YWRkcik7Ci0gIHJlbG9jX2RzdC0+cl9zeW1uZHggPSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfc3ltbmR4KTsKLQotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3R5cGUpOwotCi0jaWZkZWYgU1dBUF9JTl9SRUxPQ19PRkZTRVQKLSAgcmVsb2NfZHN0LT5yX29mZnNldCA9IFNXQVBfSU5fUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQkJCSAgICAgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9vZmZzZXQpOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCXNyYzsKLSAgICAgUFRSCWRzdDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopCi0JICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotICBTV0FQX09VVF9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCXJlbG9jX3NyYy0+cl9vZmZzZXQsCi0JCQkoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX29mZnNldCk7Ci0jZW5kaWYKLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19FWFRSQQotICBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHJlbG9jX3NyYywgcmVsb2NfZHN0KTsKLSNlbmRpZgotICByZXR1cm4gUkVMU1o7Ci19Ci0jZW5kaWYgLyogbm90IE5PX0NPRkZfUkVMT0NTICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfZmlsZWhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIJICAgICBzcmM7Ci0gICAgIFBUUgkgICAgIGRzdDsKLXsKLSAgRklMSERSICpmaWxlaGRyX3NyYyA9IChGSUxIRFIgKikgc3JjOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9kc3QgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZHN0OwotICBmaWxlaGRyX2RzdC0+Zl9tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfbWFnaWMpOwotICBmaWxlaGRyX2RzdC0+Zl9uc2NucyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnNjbnMpOwotICBmaWxlaGRyX2RzdC0+Zl90aW1kYXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX3RpbWRhdCk7Ci0KLSAgZmlsZWhkcl9kc3QtPmZfbnN5bXMgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX25zeW1zKTsKLSAgZmlsZWhkcl9kc3QtPmZfZmxhZ3MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX2ZsYWdzKTsKLSAgZmlsZWhkcl9kc3QtPmZfc3ltcHRyID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfc3ltcHRyKTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAvKiBUaGVyZSBhcmUgcmVhbGx5IHR3byBtYWdpYyBudW1iZXJzIGludm9sdmVkOyB0aGUgbWFnaWMgbnVtYmVyCi0gICAgIHRoYXQgc2F5cyB0aGlzIGlzIGEgTlQgZXhlY3V0YWJsZSAoUEVJKSBhbmQgdGhlIG1hZ2ljIG51bWJlciB0aGF0Ci0gICAgIGRldGVybWluZXMgdGhlIGFyY2hpdGVjdHVyZS4gIFRoZSBmb3JtZXIgaXMgRE9TTUFHSUMsIHN0b3JlZCBpbgotICAgICB0aGUgZV9tYWdpYyBmaWVsZC4gIFRoZSBsYXR0ZXIgaXMgc3RvcmVkIGluIHRoZSBmX21hZ2ljIGZpZWxkLgotICAgICBJZiB0aGUgTlQgbWFnaWMgbnVtYmVyIGlzbid0IHZhbGlkLCB0aGUgYXJjaGl0ZWN0dXJlIG1hZ2ljIG51bWJlcgotICAgICBjb3VsZCBiZSBtaW1pY2tlZCBieSBzb21lIG90aGVyIGZpZWxkIChzcGVjaWZpY2FsbHksIHRoZSBudW1iZXIKLSAgICAgb2YgcmVsb2NzIGluIHNlY3Rpb24gMykuICBTaW5jZSB0aGlzIHJvdXRpbmUgY2FuIG9ubHkgYmUgY2FsbGVkCi0gICAgIGNvcnJlY3RseSBmb3IgYSBQRUkgZmlsZSwgY2hlY2sgdGhlIGVfbWFnaWMgbnVtYmVyIGhlcmUsIGFuZCwgaWYKLSAgICAgaXQgZG9lc24ndCBtYXRjaCwgY2xvYmJlciB0aGUgZl9tYWdpYyBudW1iZXIgc28gdGhhdCB3ZSBkb24ndCBnZXQKLSAgICAgYSBmYWxzZSBtYXRjaC4gICovCi0gIGlmIChiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+ZV9tYWdpYykgIT0gRE9TTUFHSUMpCi0gICAgZmlsZWhkcl9kc3QtPmZfbWFnaWMgPSAtMTsKLSNlbmRpZgotCi0gIC8qIE90aGVyIHBlb3BsZSdzIHRvb2xzIHNvbWV0aW1lcyBnZW5lcmF0ZSBoZWFkZXJzIHdpdGggYW4gbnN5bXMgYnV0Ci0gICAgIGEgemVybyBzeW1wdHIuICAqLwotICBpZiAoZmlsZWhkcl9kc3QtPmZfbnN5bXMgIT0gMCAmJiBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPT0gMCkKLSAgICB7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IDA7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9mbGFncyB8PSBGX0xTWU1TOwotICAgIH0KLQotICBmaWxlaGRyX2RzdC0+Zl9vcHRoZHIgPSBiZmRfaF9nZXRfMTYoYWJmZCwgCi0JCQkJICAgICAgIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9vcHRoZHIpOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX291dCBfYmZkX3BlaV9vbmx5X3N3YXBfZmlsZWhkcl9vdXQKLSNlbHNlCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX291dCBfYmZkX3BlX29ubHlfc3dhcF9maWxlaGRyX291dAotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9zY25oZHJfaW4gKGFiZmQsIGV4dCwgaW4pCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIJICAgICBleHQ7Ci0gICAgIFBUUgkgICAgIGluOwotewotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopIGV4dDsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotICBzY25oZHJfaW50LT5zX3NjbnB0ciA9Ci0gICAgR0VUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7Ci0gIHNjbmhkcl9pbnQtPnNfcmVscHRyID0KLSAgICBHRVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgc2NuaGRyX2ludC0+c19sbm5vcHRyID0KLSAgICBHRVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotICBzY25oZHJfaW50LT5zX2ZsYWdzID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLQotICAvKiBNUyBoYW5kbGVzIG92ZXJmbG93IG9mIGxpbmUgbnVtYmVycyBieSBjYXJyeWluZyBpbnRvIHRoZSByZWxvYwotICAgICBmaWVsZCAoaXQgYXBwZWFycykuICBTaW5jZSBpdCdzIHN1cHBvc2VkIHRvIGJlIHplcm8gZm9yIFBFCi0gICAgICpJTUFHRSogZm9ybWF0LCB0aGF0J3Mgc2FmZS4gIFRoaXMgaXMgc3RpbGwgYSBiaXQgaWZmeS4gICovCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIHNjbmhkcl9pbnQtPnNfbmxubm8gPQotICAgIChiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKQotICAgICArIChiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYykgPDwgMTYpKTsKLSAgc2NuaGRyX2ludC0+c19ucmVsb2MgPSAwOwotI2Vsc2UKLSAgc2NuaGRyX2ludC0+c19ucmVsb2MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsCi0JCQkJICAgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gIHNjbmhkcl9pbnQtPnNfbmxubm8gPSBiZmRfaF9nZXRfMTYgKGFiZmQsCi0JCQkJICAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotI2VuZGlmCi0KLSAgaWYgKHNjbmhkcl9pbnQtPnNfdmFkZHIgIT0gMCkgCi0gICAgewotICAgICAgc2NuaGRyX2ludC0+c192YWRkciArPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgICAgIHNjbmhkcl9pbnQtPnNfdmFkZHIgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0KLSNpZm5kZWYgQ09GRl9OT19IQUNLX1NDTkhEUl9TSVpFCi0gIC8qIElmIHRoaXMgc2VjdGlvbiBob2xkcyB1bmluaXRpYWxpemVkIGRhdGEsIHVzZSB0aGUgdmlydHVhbCBzaXplCi0gICAgIChzdG9yZWQgaW4gc19wYWRkcikgaW5zdGVhZCBvZiB0aGUgcGh5c2ljYWwgc2l6ZS4gICovCi0gIGlmICgoc2NuaGRyX2ludC0+c19mbGFncyAmIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBKSAhPSAwKQotICAgIHsKLSAgICAgIHNjbmhkcl9pbnQtPnNfc2l6ZSA9IHNjbmhkcl9pbnQtPnNfcGFkZHI7Ci0gICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBzZXQgc2NuaGRyX2ludC0+c19wYWRkciB0byAwLiAgSG93ZXZlciwKLSAgICAgICAgIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIHN0b3JlcyBzX3BhZGRyIGluIHZpcnRfc2l6ZSwgd2hpY2gKLSAgICAgICAgIG9ubHkgd29ya3MgaWYgaXQgY29ycmVjdGx5IGhvbGRzIHRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlCi0gICAgICAgICBzZWN0aW9uLiAgKi8KLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBwZV9kYXRhX3R5cGUgKnBlOwotICBhYmZkLT50ZGF0YS5wZV9vYmpfZGF0YSA9IAotICAgIChzdHJ1Y3QgcGVfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChwZV9kYXRhX3R5cGUpKTsKLQotICBpZiAoYWJmZC0+dGRhdGEucGVfb2JqX2RhdGEgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcGUgPSBwZV9kYXRhIChhYmZkKTsKLQotICBwZS0+Y29mZi5wZSA9IDE7Ci0KLSAgLyogaW5fcmVsb2NfcCBpcyBhcmNoaXRlY3R1cmUgZGVwZW5kZW50LiAgKi8KLSAgcGUtPmluX3JlbG9jX3AgPSBpbl9yZWxvY19wOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIHRoZSBDT0ZGIGJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotc3RhdGljIFBUUgotcGVfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci0gICAgIFBUUiBhb3V0aGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIHBlX2RhdGFfdHlwZSAqcGU7Ci0KLSAgaWYgKHBlX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBwZS0+Y29mZi5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbAotICAgICB0YWJsZSB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycKLSAgICAgdW5mb3J0dW5hdGVseSB2YXJ5IGFtb25nIGNvZmYgaW1wbGVtZW50YXRpb25zLi4uICAqLwotICBwZS0+Y29mZi5sb2NhbF9uX2J0bWFzayA9IE5fQlRNQVNLOwotICBwZS0+Y29mZi5sb2NhbF9uX2J0c2hmdCA9IE5fQlRTSEZUOwotICBwZS0+Y29mZi5sb2NhbF9uX3RtYXNrID0gTl9UTUFTSzsKLSAgcGUtPmNvZmYubG9jYWxfbl90c2hpZnQgPSBOX1RTSElGVDsKLSAgcGUtPmNvZmYubG9jYWxfc3ltZXN6ID0gU1lNRVNaOwotICBwZS0+Y29mZi5sb2NhbF9hdXhlc3ogPSBBVVhFU1o7Ci0gIHBlLT5jb2ZmLmxvY2FsX2xpbmVzeiA9IExJTkVTWjsKLQotICBwZS0+Y29mZi50aW1lc3RhbXAgPSBpbnRlcm5hbF9mLT5mX3RpbWRhdDsKLQotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPQotICAgIG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpID0KLSAgICAgIGludGVybmFsX2YtPmZfbnN5bXM7Ci0KLSAgcGUtPnJlYWxfZmxhZ3MgPSBpbnRlcm5hbF9mLT5mX2ZsYWdzOwotCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRExMKSAhPSAwKQotICAgIHBlLT5kbGwgPSAxOwotCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQpID09IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0RFQlVHOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIGlmIChhb3V0aGRyKSAKLSAgICBwZS0+cGVfb3B0aGRyID0gKChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHIpLT5wZTsKLSNlbmRpZgotCi0jaWZkZWYgQVJNIAotICBpZiAoISBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBpbnRlcm5hbF9mLT5mX2ZsYWdzKSkKLSAgICBjb2ZmX2RhdGEgKGFiZmQpIC0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gIAotICByZXR1cm4gKFBUUikgcGU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLQotICBpZiAoIV9iZmRfcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24gKGFiZmQsIHZmaWxlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgICAgIHJldHVybiBwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCB2ZmlsZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKLSAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIGlmICghX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbiAoaWJmZCwgb2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgcmV0dXJuIHBlX3NhdmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gIF9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLQotI2RlZmluZSBjb2ZmX2dldF9zeW1ib2xfaW5mbyBfYmZkX3BlX2dldF9zeW1ib2xfaW5mbwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0MCi0vKiBDb2RlIHRvIGhhbmRsZSBNaWNyb3NvZnQncyBJbWFnZSBMaWJyYXJ5IEZvcm1hdC4KLSAgIEFsc28ga25vd24gYXMgTElOSzYgZm9ybWF0LgotICAgRG9jdW1lbnRhdGlvbiBhYm91dCB0aGlzIGZvcm1hdCBjYW4gYmUgZm91bmQgYXQ6IAotCi0gICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvc3BlY3MvcGVjb2ZmX3NlY3Rpb244Lmh0bSAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgc3BlY2lmeSB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZGF0YQotICAgc3RydWN0dXJlcyB0aGF0IHdlIGhhdmUgdG8gY3JlYXRlIGluIG9yZGVyIHRvIGJ1aWxkIGEgYmZkIGRlc2NyaWJpbmcKLSAgIGFuIElMRiBvYmplY3QgZmlsZS4gIFRoZSBmaW5hbCAiKyAxIiBpbiB0aGUgZGVmaW5pdGlvbnMgb2YgU0laRU9GX0lEQVRBNgotICAgYW5kIFNJWkVPRl9JREFUQTcgYmVsb3cgaXMgdG8gYWxsb3cgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHdlIG1pZ2h0Ci0gICBuZWVkIGEgcGFkZGluZyBieXRlIGluIG9yZGVyIHRvIGVuc3VyZSAxNiBiaXQgYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbidzCi0gICBjb250ZW50cy4KLQotICAgVGhlIHZhbHVlIGZvciBTSVpFT0ZfSUxGX1NUUklOR1MgaXMgY29tcHV0ZWQgYXMgZm9sbG93czoKLQotICAgICAgVGhlcmUgd2lsbCBiZSBOVU1fSUxGX1NFQ1RJT05TIHNlY3Rpb24gc3ltYm9scy4gIEFsbG93IDkgY2hhcmFjdGVycwotICAgICAgcGVyIHN5bWJvbCBmb3IgdGhlaXIgbmFtZXMgKGxvbmdlc3Qgc2VjdGlvbiBuYW1lIGlzIC5pZGF0YSR4KS4KLQotICAgICAgVGhlcmUgd2lsbCBiZSB0d28gc3ltYm9scyBmb3IgdGhlIGltcG9ydGVkIHZhbHVlLCBvbmUgdGhlIHN5bWJvbCBuYW1lCi0gICAgICBhbmQgb25lIHdpdGggX2ltcF9fIHByZWZpeGVkLiAgQWxsb3dpbmcgZm9yIHRoZSB0ZXJtaW5hdGluZyBudWwncyB0aGlzCi0gICAgICBpcyBzdHJsZW4gKHN5bWJvbF9uYW1lKSAqIDIgKyA4ICsgMjEgKyBzdHJsZW4gKHNvdXJjZV9kbGwpLgotCi0gICAgICBUaGUgc3RyaW5ncyBpbiB0aGUgc3RyaW5nIHRhYmxlIG11c3Qgc3RhcnQgU1RSSU5HX19TSVpFX1NJWkUgYnl0ZXMgaW50bwotICAgICAgdGhlIHRhYmxlIGluIG9yZGVyIHRvIGZvciB0aGUgc3RyaW5nIGxvb2t1cCBjb2RlIGluIGNvZmZnZW4vY29mZmNvZGUgdG8KLSAgICAgIHdvcmsuICAqLwotI2RlZmluZSBOVU1fSUxGX1JFTE9DUwkJOAotI2RlZmluZSBOVU1fSUxGX1NFQ1RJT05TICAgICAgICA2Ci0jZGVmaW5lIE5VTV9JTEZfU1lNUyAJCSgyICsgTlVNX0lMRl9TRUNUSU9OUykKLSAgCi0jZGVmaW5lIFNJWkVPRl9JTEZfU1lNUwkJKE5VTV9JTEZfU1lNUyAqIHNpemVvZiAoKiB2YXJzLnN5bV9jYWNoZSkpCi0jZGVmaW5lIFNJWkVPRl9JTEZfU1lNX1RBQkxFCShOVU1fSUxGX1NZTVMgKiBzaXplb2YgKCogdmFycy5zeW1fdGFibGUpKQotI2RlZmluZSBTSVpFT0ZfSUxGX05BVElWRV9TWU1TCShOVU1fSUxGX1NZTVMgKiBzaXplb2YgKCogdmFycy5uYXRpdmVfc3ltcykpCi0jZGVmaW5lIFNJWkVPRl9JTEZfU1lNX1BUUl9UQUJMRSAoTlVNX0lMRl9TWU1TICogc2l6ZW9mICgqIHZhcnMuc3ltX3B0cl90YWJsZSkpCi0jZGVmaW5lIFNJWkVPRl9JTEZfRVhUX1NZTVMJKE5VTV9JTEZfU1lNUyAqIHNpemVvZiAoKiB2YXJzLmVzeW1fdGFibGUpKQotI2RlZmluZSBTSVpFT0ZfSUxGX1JFTE9DUwkoTlVNX0lMRl9SRUxPQ1MgKiBzaXplb2YgKCogdmFycy5yZWx0YWIpKQotI2RlZmluZSBTSVpFT0ZfSUxGX0lOVF9SRUxPQ1MJKE5VTV9JTEZfUkVMT0NTICogc2l6ZW9mICgqIHZhcnMuaW50X3JlbHRhYikpCi0jZGVmaW5lIFNJWkVPRl9JTEZfU1RSSU5HUwkoc3RybGVuIChzeW1ib2xfbmFtZSkgKiAyICsgOCBcCi0JCQkJCSsgMjEgKyBzdHJsZW4gKHNvdXJjZV9kbGwpIFwKLQkJCQkJKyBOVU1fSUxGX1NFQ1RJT05TICogOSBcCi0JCQkJCSsgU1RSSU5HX1NJWkVfU0laRSkKLSNkZWZpbmUgU0laRU9GX0lEQVRBMgkJKDUgKiA0KQotI2RlZmluZSBTSVpFT0ZfSURBVEE0CQkoMSAqIDQpCi0jZGVmaW5lIFNJWkVPRl9JREFUQTUJCSgxICogNCkKLSNkZWZpbmUgU0laRU9GX0lEQVRBNgkJKDIgKyBzdHJsZW4gKHN5bWJvbF9uYW1lKSArIDEgKyAxKQotI2RlZmluZSBTSVpFT0ZfSURBVEE3CQkoc3RybGVuIChzb3VyY2VfZGxsKSArIDEgKyAxKQotI2RlZmluZSBTSVpFT0ZfSUxGX1NFQ1RJT05TICAgICAoTlVNX0lMRl9TRUNUSU9OUyAqIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpCi0gIAotI2RlZmluZSBJTEZfREFUQV9TSVpFCQkJCVwKLSAgICAgIHNpemVvZiAoKiB2YXJzLmJpbSkJCQlcCi0gICAgKyBTSVpFT0ZfSUxGX1NZTVMJCQkJXAotICAgICsgU0laRU9GX0lMRl9TWU1fVEFCTEUJCQlcCi0gICAgKyBTSVpFT0ZfSUxGX05BVElWRV9TWU1TCQkJXAotICAgICsgU0laRU9GX0lMRl9TWU1fUFRSX1RBQkxFCQkJXAotICAgICsgU0laRU9GX0lMRl9FWFRfU1lNUwkJCVwKLSAgICArIFNJWkVPRl9JTEZfUkVMT0NTCQkJCVwKLSAgICArIFNJWkVPRl9JTEZfSU5UX1JFTE9DUwkJCVwKLSAgICArIFNJWkVPRl9JTEZfU1RSSU5HUwkJCVwKLSAgICArIFNJWkVPRl9JREFUQTIJCQkJXAotICAgICsgU0laRU9GX0lEQVRBNAkJCQlcCi0gICAgKyBTSVpFT0ZfSURBVEE1CQkJCVwKLSAgICArIFNJWkVPRl9JREFUQTYJCQkJXAotICAgICsgU0laRU9GX0lEQVRBNwkJCQlcCi0gICAgKyBTSVpFT0ZfSUxGX1NFQ1RJT05TCQkJXAotICAgICsgTUFYX1RFWFRfU0VDVElPTl9TSVpFCi0KLQotLyogQ3JlYXRlIGFuIGVtcHR5IHJlbG9jYXRpb24gYWdhaW5zdCB0aGUgZ2l2ZW4gc3ltYm9sLiAgKi8KLXN0YXRpYyB2b2lkCi1wZV9JTEZfbWFrZV9hX3N5bWJvbF9yZWxvYyAocGVfSUxGX3ZhcnMgKiAgICAgICAgICAgICAgICAgdmFycywKLQkJCSAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotCQkJICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgICAgIHJlbG9jLAotCQkJICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiogIHN5bSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICBzeW1faW5kZXgpCi17Ci0gIGFyZWxlbnQgKiBlbnRyeTsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogaW50ZXJuYWw7Ci0KLSAgZW50cnkgPSB2YXJzLT5yZWx0YWIgKyB2YXJzLT5yZWxjb3VudDsKLSAgaW50ZXJuYWwgPSB2YXJzLT5pbnRfcmVsdGFiICsgdmFycy0+cmVsY291bnQ7Ci0gIAotICBlbnRyeS0+YWRkcmVzcyAgICAgPSBhZGRyZXNzOwotICBlbnRyeS0+YWRkZW5kICAgICAgPSAwOwotICBlbnRyeS0+aG93dG8gICAgICAgPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHZhcnMtPmFiZmQsIHJlbG9jKTsKLSAgZW50cnktPnN5bV9wdHJfcHRyID0gc3ltOwotCi0gIGludGVybmFsLT5yX3ZhZGRyICA9IGFkZHJlc3M7Ci0gIGludGVybmFsLT5yX3N5bW5keCA9IHN5bV9pbmRleDsKLSAgaW50ZXJuYWwtPnJfdHlwZSAgID0gZW50cnktPmhvd3RvLT50eXBlOwotI2lmIDAgIC8qIFRoZXNlIGZpZWxkcyBkbyBub3QgbmVlZCB0byBiZSBpbml0aWFsaXNlZC4gICovCi0gIGludGVybmFsLT5yX3NpemUgICA9IDA7Ci0gIGludGVybmFsLT5yX2V4dGVybiA9IDA7Ci0gIGludGVybmFsLT5yX29mZnNldCA9IDA7Ci0jZW5kaWYKLSAgCi0gIHZhcnMtPnJlbGNvdW50ICsrOwotICAKLSAgQkZEX0FTU0VSVCAodmFycy0+cmVsY291bnQgPD0gTlVNX0lMRl9SRUxPQ1MpOwotfQotCi0vKiBDcmVhdGUgYW4gZW1wdHkgcmVsb2NhdGlvbiBhZ2FpbnN0IHRoZSBnaXZlbiBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wZV9JTEZfbWFrZV9hX3JlbG9jIChwZV9JTEZfdmFycyAqICAgICAgICAgICAgIHZhcnMsCi0JCSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotCQkgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgcmVsb2MsCi0JCSAgICAgYXNlY3Rpb25fcHRyICAgICAgICAgICAgICBzZWMpCi17Ci0gIHBlX0lMRl9tYWtlX2Ffc3ltYm9sX3JlbG9jICh2YXJzLCBhZGRyZXNzLCByZWxvYywgc2VjLT5zeW1ib2xfcHRyX3B0ciwKLQkJCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhICh2YXJzLT5hYmZkLCBzZWMpLT5pKTsKLX0KLQotLyogTW92ZSB0aGUgcXVldWVkIHJlbG9jcyBpbnRvIHRoZSBnaXZlbiBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wZV9JTEZfc2F2ZV9yZWxvY3MgKHBlX0lMRl92YXJzICogdmFycywKLQkJICAgIGFzZWN0aW9uX3B0ciAgc2VjKQotewotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBzb21ld2hlcmUgdG8gc3RvcmUgdGhlIGludGVybmFsIHJlbG9jcy4gICovCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAodmFycy0+YWJmZCwgc2VjKSA9PSBOVUxMKQotICAgIC8qIFdlIHNob3VsZCBwcm9iYWJseSByZXR1cm4gYW4gZXJyb3IgaW5kaWNhdGlvbiBoZXJlLiAgKi8KLSAgICBhYm9ydCAoKTsKLQotICBjb2ZmX3NlY3Rpb25fZGF0YSAodmFycy0+YWJmZCwgc2VjKS0+cmVsb2NzID0gdmFycy0+aW50X3JlbHRhYjsKLSAgY29mZl9zZWN0aW9uX2RhdGEgKHZhcnMtPmFiZmQsIHNlYyktPmtlZXBfcmVsb2NzID0gdHJ1ZTsKLQotICBzZWMtPnJlbG9jYXRpb24gID0gdmFycy0+cmVsdGFiOwotICBzZWMtPnJlbG9jX2NvdW50ID0gdmFycy0+cmVsY291bnQ7Ci0gIHNlYy0+ZmxhZ3MgICAgICB8PSBTRUNfUkVMT0M7Ci0KLSAgdmFycy0+cmVsdGFiICAgICArPSB2YXJzLT5yZWxjb3VudDsKLSAgdmFycy0+aW50X3JlbHRhYiArPSB2YXJzLT5yZWxjb3VudDsKLSAgdmFycy0+cmVsY291bnQgICA9IDA7Ci0KLSAgQkZEX0FTU0VSVCAoKGJmZF9ieXRlICopdmFycy0+aW50X3JlbHRhYiA8IChiZmRfYnl0ZSAqKXZhcnMtPnN0cmluZ190YWJsZSk7Ci19Ci0KLS8qIENyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgYW5kIGFkZCBpdCB0byB0aGUgcmVsZXZhbnQgdGFibGVzLiAgKi8KLXN0YXRpYyB2b2lkCi1wZV9JTEZfbWFrZV9hX3N5bWJvbCAocGVfSUxGX3ZhcnMgKiAgdmFycywKLQkJICAgICAgY29uc3QgY2hhciAqICAgcHJlZml4LAotCQkgICAgICBjb25zdCBjaGFyICogICBzeW1ib2xfbmFtZSwKLQkJICAgICAgYXNlY3Rpb25fcHRyICAgc2VjdGlvbiwKLQkJICAgICAgZmxhZ3dvcmQgICAgICAgZXh0cmFfZmxhZ3MpCi17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKiBzeW07Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiBlbnQ7Ci0gIFNZTUVOVCAqIGVzeW07Ci0gIHVuc2lnbmVkIHNob3J0IHNjbGFzczsKLQotICBpZiAoZXh0cmFfZmxhZ3MgJiBCU0ZfTE9DQUwpCi0gICAgc2NsYXNzID0gQ19TVEFUOwotICBlbHNlCi0gICAgc2NsYXNzID0gQ19FWFQ7Ci0gIAotI2lmZGVmIFRIVU1CUEVNQUdJQyAgCi0gIGlmICh2YXJzLT5tYWdpYyA9PSBUSFVNQlBFTUFHSUMpCi0gICAgewotICAgICAgaWYgKGV4dHJhX2ZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCXNjbGFzcyA9IENfVEhVTUJFWFRGVU5DOwotICAgICAgZWxzZSBpZiAoZXh0cmFfZmxhZ3MgJiBCU0ZfTE9DQUwpCi0Jc2NsYXNzID0gQ19USFVNQlNUQVQ7Ci0gICAgICBlbHNlCi0Jc2NsYXNzID0gQ19USFVNQkVYVDsKLSAgICB9Ci0jZW5kaWYKLQotICBCRkRfQVNTRVJUICh2YXJzLT5zeW1faW5kZXggPCBOVU1fSUxGX1NZTVMpOwotICAKLSAgc3ltID0gdmFycy0+c3ltX3B0cjsKLSAgZW50ID0gdmFycy0+bmF0aXZlX3B0cjsKLSAgZXN5bSA9IHZhcnMtPmVzeW1fcHRyOwotCi0gIC8qIENvcHkgdGhlIHN5bWJvbCdzIG5hbWUgaW50byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3ByaW50ZiAodmFycy0+c3RyaW5nX3B0ciwgIiVzJXMiLCBwcmVmaXgsIHN5bWJvbF9uYW1lKTsKLQotICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotICAgIHNlY3Rpb24gPSAoYXNlY3Rpb25fcHRyKSAmIGJmZF91bmRfc2VjdGlvbjsKLSAgCi0gIC8qIEluaXRpYWxpc2UgdGhlIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIGJmZF9oX3B1dF8zMiAodmFycy0+YWJmZCwgdmFycy0+c3RyaW5nX3B0ciAtIHZhcnMtPnN0cmluZ190YWJsZSwgKGJmZF9ieXRlICopIGVzeW0tPmUuZS5lX29mZnNldCk7Ci0gIGJmZF9oX3B1dF8xNiAodmFycy0+YWJmZCwgc2VjdGlvbi0+dGFyZ2V0X2luZGV4LCAoYmZkX2J5dGUgKikgZXN5bS0+ZV9zY251bSk7Ci0gIGVzeW0tPmVfc2NsYXNzWzBdID0gc2NsYXNzOwotCi0gIC8qIFRoZSBmb2xsb3dpbmcgaW5pdGlhbGlzYXRpb25zIGFyZSB1bm5lY2Vzc2FyeSAtIHRoZSBtZW1vcnkgaXMKLSAgICAgemVybyBpbml0aWFsaXNlZC4gIFRoZXkgYXJlIGp1c3Qga2VwdCBoZXJlIGFzIHJlbWluZGVycy4gICovCi0jaWYgMAotICBlc3ltLT5lLmUuZV96ZXJvZXMgPSAwOwotICBlc3ltLT5lX3ZhbHVlID0gMDsKLSAgZXN5bS0+ZV90eXBlID0gVF9OVUxMOwotICBlc3ltLT5lX251bWF1eCA9IDA7Ci0jZW5kaWYKLSAgCi0gIC8qIEluaXRpYWxpc2UgdGhlIGludGVybmFsIHN5bWJvbCBzdHJ1Y3R1cmUuICAqLwotICBlbnQtPnUuc3ltZW50Lm5fc2NsYXNzICAgICAgICAgID0gc2NsYXNzOwotICBlbnQtPnUuc3ltZW50Lm5fc2NudW0gICAgICAgICAgID0gc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICBlbnQtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKGxvbmcpIHN5bTsKLSAgCi0jaWYgMCAvKiBTZWUgY29tbWVudCBhYm92ZS4gICovCi0gIGVudC0+dS5zeW1lbnQubl92YWx1ZSAgPSAwOwotICBlbnQtPnUuc3ltZW50Lm5fZmxhZ3MgID0gMDsKLSAgZW50LT51LnN5bWVudC5uX3R5cGUgICA9IFRfTlVMTDsKLSAgZW50LT51LnN5bWVudC5uX251bWF1eCA9IDA7Ci0gIGVudC0+Zml4X3ZhbHVlICAgICAgICAgPSAwOwotI2VuZGlmCi0gIAotICBzeW0tPnN5bWJvbC50aGVfYmZkID0gdmFycy0+YWJmZDsKLSAgc3ltLT5zeW1ib2wubmFtZSAgICA9IHZhcnMtPnN0cmluZ19wdHI7Ci0gIHN5bS0+c3ltYm9sLmZsYWdzICAgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCB8IGV4dHJhX2ZsYWdzOwotICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gc2VjdGlvbjsKLSAgc3ltLT5uYXRpdmUgICAgICAgICA9IGVudDsKLSAgCi0jaWYgMCAvKiBTZWUgY29tbWVudCBhYm92ZS4gICovCi0gIHN5bS0+c3ltYm9sLnZhbHVlICAgPSAwOwotICBzeW0tPnN5bWJvbC51ZGF0YS5pID0gMDsKLSAgc3ltLT5kb25lX2xpbmVubyAgICA9IGZhbHNlOwotICBzeW0tPmxpbmVubyAgICAgICAgID0gTlVMTDsKLSNlbmRpZgotICAKLSAgKiB2YXJzLT50YWJsZV9wdHIgPSB2YXJzLT5zeW1faW5kZXg7Ci0gICogdmFycy0+c3ltX3B0cl9wdHIgPSBzeW07Ci0gIAotICAvKiBBZGp1c3QgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHN5bWJvbC4gICovCi0gIHZhcnMtPnN5bV9pbmRleCArKzsKLSAgdmFycy0+c3ltX3B0ciArKzsKLSAgdmFycy0+c3ltX3B0cl9wdHIgKys7Ci0gIHZhcnMtPnRhYmxlX3B0ciArKzsKLSAgdmFycy0+bmF0aXZlX3B0ciArKzsKLSAgdmFycy0+ZXN5bV9wdHIgKys7Ci0gIHZhcnMtPnN0cmluZ19wdHIgKz0gc3RybGVuIChzeW1ib2xfbmFtZSkgKyBzdHJsZW4gKHByZWZpeCkgKyAxOwotCi0gIEJGRF9BU1NFUlQgKHZhcnMtPnN0cmluZ19wdHIgPCB2YXJzLT5lbmRfc3RyaW5nX3B0cik7Ci19Ci0KLS8qIENyZWF0ZSBhIHNlY3Rpb24uICAqLwotc3RhdGljIGFzZWN0aW9uX3B0cgotcGVfSUxGX21ha2VfYV9zZWN0aW9uIChwZV9JTEZfdmFycyAqIHZhcnMsCi0JCSAgICAgICBjb25zdCBjaGFyICogIG5hbWUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgIHNpemUsCi0JCSAgICAgICBmbGFnd29yZCAgICAgIGV4dHJhX2ZsYWdzKQotewotICBhc2VjdGlvbl9wdHIgc2VjOwotICBmbGFnd29yZCAgICAgZmxhZ3M7Ci0gIAotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHZhcnMtPmFiZmQsIG5hbWUpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICBmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19LRUVQIHwgU0VDX0lOX01FTU9SWTsKLSAgCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAodmFycy0+YWJmZCwgc2VjLCBmbGFncyB8IGV4dHJhX2ZsYWdzKTsKLSAgICAgCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHZhcnMtPmFiZmQsIHNlYywgMik7Ci0gIAotICAvKiBDaGVjayB0aGF0IHdlIHdpbGwgbm90IHJ1biBvdXQgb2Ygc3BhY2UuICAqLwotICBCRkRfQVNTRVJUICh2YXJzLT5kYXRhICsgc2l6ZSA8IHZhcnMtPmJpbS0+YnVmZmVyICsgdmFycy0+YmltLT5zaXplKTsKLSAgCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBzaXplIGFuZCBjb250ZW50cy4gIFRoZSBhY3R1YWwKLSAgICAgY29udGVudHMgYXJlIGZpbGxlZCBpbiBieSBvdXIgcGFyZW50LiAgKi8KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHZhcnMtPmFiZmQsIHNlYywgc2l6ZSk7Ci0gIHNlYy0+Y29udGVudHMgPSB2YXJzLT5kYXRhOwotICBzZWMtPnRhcmdldF9pbmRleCA9IHZhcnMtPnNlY19pbmRleCArKzsKLQotICAvKiBBZHZhbmNlIGRhdGEgcG9pbnRlciBpbiB0aGUgdmFycyBzdHJ1Y3R1cmUuICAqLwotICB2YXJzLT5kYXRhICs9IHNpemU7Ci0gIAotICAvKiBTa2lwIHRoZSBwYWRkaW5nIGJ5dGUgaWYgaXQgd2FzIG5vdCBuZWVkZWQuCi0gICAgIFRoZSBsb2dpYyBoZXJlIGlzIHRoYXQgaWYgdGhlIHN0cmluZyBsZW5ndGggaXMgb2RkLAotICAgICB0aGVuIHRoZSBlbnRpcmUgc3RyaW5nIGxlbmd0aCwgaW5jbHVkaW5nIHRoZSBudWxsIGJ5dGUsCi0gICAgIGlzIGV2ZW4gYW5kIHNvIHRoZSBleHRyYSwgcGFkZGluZyBieXRlLCBpcyBub3QgbmVlZGVkLiAgKi8KLSAgaWYgKHNpemUgJiAxKQotICAgIHZhcnMtPmRhdGEgLS07Ci0gIAotICAvKiBDcmVhdGUgYSBjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlIGZvciBvdXIgdXNlLiAgKi8KLSAgc2VjLT51c2VkX2J5X2JmZCA9IChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIHZhcnMtPmRhdGE7Ci0gIHZhcnMtPmRhdGEgKz0gc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTsKLQotICBCRkRfQVNTRVJUICh2YXJzLT5kYXRhIDw9IHZhcnMtPmJpbS0+YnVmZmVyICsgdmFycy0+YmltLT5zaXplKTsKLSAgCi0gIC8qIENyZWF0ZSBhIHN5bWJvbCB0byByZWZlciB0byB0aGlzIHNlY3Rpb24uICAqLwotICBwZV9JTEZfbWFrZV9hX3N5bWJvbCAodmFycywgIiIsIG5hbWUsIHNlYywgQlNGX0xPQ0FMKTsKLQotICAvKiBDYWNoZSB0aGUgaW5kZXggdG8gdGhlIHN5bWJvbCBpbiB0aGUgY29mZl9zZWN0aW9uX2RhdGEgc3RydWN0dXJlLiAgKi8KLSAgY29mZl9zZWN0aW9uX2RhdGEgKHZhcnMtPmFiZmQsIHNlYyktPmkgPSB2YXJzLT5zeW1faW5kZXggLSAxOwotICAKLSAgcmV0dXJuIHNlYzsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBnb2VzIGludG8gdGhlIC50ZXh0IHNlY3Rpb24KLSAgIGluIG9yZGVyIHRvIHBlcmZvcm0gYSBqdW1wIGludG8gdGhlIERMTCBsb29rdXAgdGFibGUuICBUaGUgZW50cmllcwotICAgaW4gdGhlIHRhYmxlIGFyZSBpbmRleCBieSB0aGUgbWFnaWMgbnVtYmVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZQotICAgbWFjaGluZSB0eXBlIGluIHRoZSBQRSBmaWxlLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhW10gYXJyYXlzIGluCi0gICB0aGVzZSBlbnRyaWVzIGFyZSBzdG9sZW4gZnJvbSB0aGUganRhYltdIGFycmF5cyBpbiBsZC9wZS1kbGwuYy4KLSAgIFRoZSBTSVpFIGZpZWxkIHNheXMgaG93IG1hbnkgYnl0ZXMgaW4gdGhlIERBVEEgYXJyYXkgYXJlIGFjdHVhbGx5Ci0gICB1c2VkLiAgVGhlIE9GRlNFVCBmaWVsZCBzYXlzIHdoZXJlIGluIHRoZSBkYXRhIGFycmF5IHRoZSBhZGRyZXNzCi0gICBvZiB0aGUgLmlkYXRhJDUgc2VjdGlvbiBzaG91bGQgYmUgcGxhY2VkLiAgKi8KLSNkZWZpbmUgTUFYX1RFWFRfU0VDVElPTl9TSVpFIDMyCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIHNob3J0IG1hZ2ljOwotICB1bnNpZ25lZCBjaGFyICBkYXRhW01BWF9URVhUX1NFQ1RJT05fU0laRV07Ci0gIHVuc2lnbmVkIGludCAgIHNpemU7Ci0gIHVuc2lnbmVkIGludCAgIG9mZnNldDsKLX0KLWp1bXBfdGFibGU7Ci0KLXN0YXRpYyBqdW1wX3RhYmxlIGp0YWJbXSA9Ci17Ci0jaWZkZWYgSTM4Nk1BR0lDCi0gIHsgSTM4Nk1BR0lDLAotICAgIHsgMHhmZiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MCB9LAotICAgIDgsIDIKLSAgfSwKLSNlbmRpZgotICAKLSNpZmRlZiAgTUM2OE1BR0lDCi0gIHsgTUM2OE1BR0lDLCB7IC8qIFhYWCBmaWxsIG1lIGluICovIH0sIDAsIDAgfSwKLSNlbmRpZgotI2lmZGVmICBNSVBTX0FSQ0hfTUFHSUNfV0lOQ0UKLSAgeyBNSVBTX0FSQ0hfTUFHSUNfV0lOQ0UsCi0gICAgeyAweDAwLCAweDAwLCAweDA4LCAweDNjLCAweDAwLCAweDAwLCAweDA4LCAweDhkLAotICAgICAgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAotICAgIDE2LCAwCi0gIH0sCi0jZW5kaWYKLSAgCi0jaWZkZWYgIFNIX0FSQ0hfTUFHSUNfV0lOQ0UKLSAgeyBTSF9BUkNIX01BR0lDX1dJTkNFLAotICAgIHsgMHgwMSwgMHhkMCwgMHgwMiwgMHg2MCwgMHgyYiwgMHg0MCwKLSAgICAgIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKLSAgICAxMiwgOAotICB9LAotI2VuZGlmCi0gIAotI2lmZGVmICBBUk1QRU1BR0lDCi0gIHsgQVJNUEVNQUdJQywKLSAgICB7IDB4MDAsIDB4YzAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4ZjAsCi0gICAgICAweDljLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLSAgICAxMiwgOAotICB9LAotI2VuZGlmCi0gIAotI2lmZGVmICBUSFVNQlBFTUFHSUMKLSAgeyBUSFVNQlBFTUFHSUMsCi0gICAgeyAweDQwLCAweGI0LCAweDAyLCAweDRlLCAweDM2LCAweDY4LCAweGI0LCAweDQ2LAotICAgICAgMHg0MCwgMHhiYywgMHg2MCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAotICAgIDE2LCAxMgotICB9LAotI2VuZGlmCi0gIHsgMCwgeyAwIH0sIDAsIDAgfQotfTsKLQotI2lmbmRlZiBOVU1fRU5UUklFUwotI2RlZmluZSBOVU1fRU5UUklFUyhhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQotLyogQnVpbGQgYSBmdWxsIEJGRCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBzdXBwbGllZCBpbiBhIElMRiBvYmplY3QuICAqLwotc3RhdGljIGJvb2xlYW4KLXBlX0lMRl9idWlsZF9hX2JmZCAoYmZkICogICAgICAgICAgIGFiZmQsCi0JCSAgICB1bnNpZ25lZCBzaG9ydCAgbWFnaWMsCi0JCSAgICBiZmRfYnl0ZSAqICAgICAgc3ltYm9sX25hbWUsCi0JCSAgICBiZmRfYnl0ZSAqICAgICAgc291cmNlX2RsbCwKLQkJICAgIHVuc2lnbmVkIGludCAgICBvcmRpbmFsLAotCQkgICAgdW5zaWduZWQgaW50ICAgIHR5cGVzKQoteyAKLSAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgIHB0cjsKLSAgcGVfSUxGX3ZhcnMgICAgICAgICAgICAgIHZhcnM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICBpbnRlcm5hbF9mOwotICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgaW1wb3J0X3R5cGU7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICAgICBpbXBvcnRfbmFtZV90eXBlOwotICBhc2VjdGlvbl9wdHIgICAgICAgICAgICAgaWQ0LCBpZDUsIGlkNiA9IE5VTEwsIHRleHQgPSBOVUxMOwotICBjb2ZmX3N5bWJvbF90eXBlICoqICAgICAgaW1wX3N5bTsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGltcF9pbmRleDsKLQotICAvKiBEZWNvZGUgYW5kIHZlcmlmeSB0aGUgdHlwZXMgZmllbGQgb2YgdGhlIElMRiBzdHJ1Y3R1cmUuICAqLwotICBpbXBvcnRfdHlwZSA9IHR5cGVzICYgMHgzOwotICBpbXBvcnRfbmFtZV90eXBlID0gKHR5cGVzICYgMHgxYykgPj4gMjsKLQotICBzd2l0Y2ggKGltcG9ydF90eXBlKQotICAgIHsKLSAgICBjYXNlIElNUE9SVF9DT0RFOgotICAgIGNhc2UgSU1QT1JUX0RBVEE6Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU1QT1JUX0NPTlNUOgotICAgICAgLyogWFhYIGNvZGUgeWV0IHRvIGJlIHdyaXR0ZW4uICAqLwotICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogVW5oYW5kbGVkIGltcG9ydCB0eXBlOyAleCIpLAotCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgaW1wb3J0X3R5cGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFVucmVjb2duaXNlZCBpbXBvcnQgdHlwZTsgJXgiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGltcG9ydF90eXBlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3dpdGNoIChpbXBvcnRfbmFtZV90eXBlKQotICAgIHsKLSAgICBjYXNlIElNUE9SVF9PUkRJTkFMOgotICAgIGNhc2UgSU1QT1JUX05BTUU6Ci0gICAgY2FzZSBJTVBPUlRfTkFNRV9OT1BSRUZJWDoKLSAgICBjYXNlIElNUE9SVF9OQU1FX1VOREVDT1JBVEU6Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBVbnJlY29nbmlzZWQgaW1wb3J0IG5hbWUgdHlwZTsgJXgiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGltcG9ydF9uYW1lX3R5cGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJbml0aWFsaXNlIGxvY2FsIHZhcmlhYmxlcy4KLSAgICAgCi0gICAgIE5vdGUgdGhlc2UgYXJlIGtlcHQgaW4gYSBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gYmVpbmcKLSAgICAgZGVjbGFyZWQgYXMgc3RhdGljcyBzaW5jZSBiZmQgZnJvd25zIG9uIGdsb2JhbCB2YXJpYWJsZXMuCi0gICAgIAotICAgICBXZSBhcmUgZ29pbmcgdG8gY29uc3RydWN0IHRoZSBjb250ZW50cyBvZiB0aGUgQkZEIGluIG1lbW9yeSwKLSAgICAgc28gYWxsb2NhdGUgYWxsIHRoZSBzcGFjZSB0aGF0IHdlIHdpbGwgbmVlZCByaWdodCBub3cuICAqLwotICBwdHIgPSBiZmRfemFsbG9jIChhYmZkLCBJTEZfREFUQV9TSVpFKTsKLSAgaWYgKHB0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDcmVhdGUgYSBiZmRfaW5fbWVtb3J5IHN0cnVjdHVyZS4gICovCi0gIHZhcnMuYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIHB0cjsKLSAgdmFycy5iaW0tPmJ1ZmZlciA9IHB0cjsKLSAgdmFycy5iaW0tPnNpemUgICA9IElMRl9EQVRBX1NJWkU7Ci0gIHB0ciArPSBzaXplb2YgKCogdmFycy5iaW0pOwotICAKLSAgLyogSW5pdGlhbGlzZSB0aGUgcG9pbnRlcnMgdG8gcmVnaW9ucyBvZiB0aGUgbWVtb3J5IGFuZCB0aGUKLSAgICAgb3RoZXIgY29udGVudHMgb2YgdGhlIHBlX0lMRl92YXJzIHN0cnVjdHVyZSBhcyB3ZWxsLiAgKi8KLSAgdmFycy5zeW1fY2FjaGUgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBwdHI7Ci0gIHZhcnMuc3ltX3B0ciAgID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgcHRyOwotICB2YXJzLnN5bV9pbmRleCA9IDA7Ci0gIHB0ciArPSBTSVpFT0ZfSUxGX1NZTVM7Ci0gIAotICB2YXJzLnN5bV90YWJsZSA9ICh1bnNpZ25lZCBpbnQgKikgcHRyOwotICB2YXJzLnRhYmxlX3B0ciA9ICh1bnNpZ25lZCBpbnQgKikgcHRyOwotICBwdHIgKz0gU0laRU9GX0lMRl9TWU1fVEFCTEU7Ci0KLSAgdmFycy5uYXRpdmVfc3ltcyA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIHB0cjsKLSAgdmFycy5uYXRpdmVfcHRyICA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIHB0cjsKLSAgcHRyICs9IFNJWkVPRl9JTEZfTkFUSVZFX1NZTVM7Ci0KLSAgdmFycy5zeW1fcHRyX3RhYmxlID0gKGNvZmZfc3ltYm9sX3R5cGUgKiopIHB0cjsKLSAgdmFycy5zeW1fcHRyX3B0ciAgID0gKGNvZmZfc3ltYm9sX3R5cGUgKiopIHB0cjsKLSAgcHRyICs9IFNJWkVPRl9JTEZfU1lNX1BUUl9UQUJMRTsKLSAgCi0gIHZhcnMuZXN5bV90YWJsZSA9IChTWU1FTlQgKikgcHRyOwotICB2YXJzLmVzeW1fcHRyICAgPSAoU1lNRU5UICopIHB0cjsKLSAgcHRyICs9IFNJWkVPRl9JTEZfRVhUX1NZTVM7Ci0gIAotICB2YXJzLnJlbHRhYiAgID0gKGFyZWxlbnQgKikgcHRyOwotICB2YXJzLnJlbGNvdW50ID0gMDsKLSAgcHRyICs9IFNJWkVPRl9JTEZfUkVMT0NTOwotCi0gIHZhcnMuaW50X3JlbHRhYiAgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopIHB0cjsKLSAgcHRyICs9IFNJWkVPRl9JTEZfSU5UX1JFTE9DUzsKLQotICB2YXJzLnN0cmluZ190YWJsZSA9IHB0cjsKLSAgdmFycy5zdHJpbmdfcHRyICAgPSBwdHIgKyBTVFJJTkdfU0laRV9TSVpFOwotICBwdHIgKz0gU0laRU9GX0lMRl9TVFJJTkdTOwotICB2YXJzLmVuZF9zdHJpbmdfcHRyID0gcHRyOwotICAKLSAgLyogVGhlIHJlbWFpbmluZyBzcGFjZSBpbiBiaW0tPmJ1ZmZlciBpcyB1c2VkCi0gICAgIGJ5IHRoZSBwZV9JTEZfbWFrZV9hX3NlY3Rpb24oKSBmdW5jdGlvbi4gICovCi0gIHZhcnMuZGF0YSA9IHB0cjsKLSAgdmFycy5hYmZkID0gYWJmZDsKLSAgdmFycy5zZWNfaW5kZXggPSAwOwotICB2YXJzLm1hZ2ljID0gbWFnaWM7Ci0gIAotICAvKiBDcmVhdGUgdGhlIGluaXRpYWwgLmlkYXRhJDxuPiBzZWN0aW9uczoKLSAgICAgWy5pZGF0YSQyOiAgSW1wb3J0IERpcmVjdG9yeSBUYWJsZSAtLSBub3QgbmVlZGVkXQotICAgICAuaWRhdGEkNDogIEltcG9ydCBMb29rdXAgVGFibGUKLSAgICAgLmlkYXRhJDU6ICBJbXBvcnQgQWRkcmVzcyBUYWJsZQotCi0gICAgIE5vdGUgd2UgZG8gbm90IGNyZWF0ZSBhIC5pZGF0YSQzIHNlY3Rpb24gYXMgdGhpcyBpcwotICAgICBjcmVhdGVkIGZvciB1cyBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0gIGlkNCA9IHBlX0lMRl9tYWtlX2Ffc2VjdGlvbiAoJiB2YXJzLCAiLmlkYXRhJDQiLCBTSVpFT0ZfSURBVEE0LCAwKTsKLSAgaWQ1ID0gcGVfSUxGX21ha2VfYV9zZWN0aW9uICgmIHZhcnMsICIuaWRhdGEkNSIsIFNJWkVPRl9JREFUQTUsIDApOwotICBpZiAoaWQ0ID09IE5VTEwgfHwgaWQ1ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogRmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlc2Ugc2VjdGlvbnMuICAqLwotICBpZiAoaW1wb3J0X25hbWVfdHlwZSA9PSBJTVBPUlRfT1JESU5BTCkKLSAgICB7Ci0gICAgICBpZiAob3JkaW5hbCA9PSAwKQotCS8qIFhYWCAtIHRyZWF0IGFzIElNUE9SVF9OQU1FID8/PyAqLwotCWFib3J0ICgpOwotICAgICAgCi0gICAgICAqICh1bnNpZ25lZCBpbnQgKikgaWQ0LT5jb250ZW50cyA9IG9yZGluYWwgfCAweDgwMDAwMDAwVUw7Ci0gICAgICAqICh1bnNpZ25lZCBpbnQgKikgaWQ1LT5jb250ZW50cyA9IG9yZGluYWwgfCAweDgwMDAwMDAwVUw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqIHN5bWJvbDsKLSAgICAgIAotICAgICAgLyogQ3JlYXRlIC5pZGF0YSQ2IC0gdGhlIEhpbnQgTmFtZSBUYWJsZS4gICovCi0gICAgICBpZDYgPSBwZV9JTEZfbWFrZV9hX3NlY3Rpb24gKCYgdmFycywgIi5pZGF0YSQ2IiwgU0laRU9GX0lEQVRBNiwgMCk7Ci0gICAgICBpZiAoaWQ2ID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiBuZWNlc3NhcnksIHRyaW0gdGhlIGltcG9ydCBzeW1ib2wgbmFtZS4gICovCi0gICAgICBzeW1ib2wgPSBzeW1ib2xfbmFtZTsKLQotICAgICAgaWYgKGltcG9ydF9uYW1lX3R5cGUgIT0gSU1QT1JUX05BTUUpCi0JLyogU2tpcCBhbnkgcHJlZml4IGluIHN5bWJvbF9uYW1lLiAgKi8KLQl3aGlsZSAoKnN5bWJvbCA9PSAnQCcgfHwgKiBzeW1ib2wgPT0gJz8nIHx8ICogc3ltYm9sID09ICdfJykKLQkgICsrIHN5bWJvbDsKLQotICAgICAgaWYgKGltcG9ydF9uYW1lX3R5cGUgPT0gSU1QT1JUX05BTUVfVU5ERUNPUkFURSkKLQl7Ci0JICAvKiBUcnVuY2F0ZSBhdCB0aGUgZmlyc3QgJ0AnICAqLwotCSAgd2hpbGUgKCogc3ltYm9sICE9IDAgJiYgKiBzeW1ib2wgIT0gJ0AnKQotCSAgICBzeW1ib2wgKys7Ci0KLQkgICogc3ltYm9sID0gMDsKLQl9Ci0gICAgICAKLSAgICAgIGlkNi0+Y29udGVudHNbMF0gPSBvcmRpbmFsICYgMHhmZjsKLSAgICAgIGlkNi0+Y29udGVudHNbMV0gPSBvcmRpbmFsID4+IDg7Ci0gICAgICAKLSAgICAgIHN0cmNweSAoaWQ2LT5jb250ZW50cyArIDIsIHN5bWJvbCk7Ci0gICAgfQotCi0gIGlmIChpbXBvcnRfbmFtZV90eXBlICE9IElNUE9SVF9PUkRJTkFMKQotICAgIHsKLSAgICAgIHBlX0lMRl9tYWtlX2FfcmVsb2MgKCYgdmFycywgMCwgQkZEX1JFTE9DX1JWQSwgaWQ2KTsKLSAgICAgIHBlX0lMRl9zYXZlX3JlbG9jcyAoJiB2YXJzLCBpZDQpOwotICAgICAgCi0gICAgICBwZV9JTEZfbWFrZV9hX3JlbG9jICgmIHZhcnMsIDAsIEJGRF9SRUxPQ19SVkEsIGlkNik7Ci0gICAgICBwZV9JTEZfc2F2ZV9yZWxvY3MgKCYgdmFycywgaWQ1KTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGV4dHJhIHNlY3Rpb25zIGRlcGVuZGluZyB1cG9uIHRoZSB0eXBlIG9mIGltcG9ydCB3ZSBhcmUgZGVhbGluZyB3aXRoLiAgKi8KLSAgc3dpdGNoIChpbXBvcnRfdHlwZSkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIAotICAgIGNhc2UgSU1QT1JUX0NPREU6Ci0gICAgICAvKiBDcmVhdGUgYSAudGV4dCBzZWN0aW9uLgotCSBGaXJzdCB3ZSBuZWVkIHRvIGxvb2sgdXAgaXRzIGNvbnRlbnRzIGluIHRoZSBqdW1wIHRhYmxlLiAgKi8KLSAgICAgIGZvciAoaSA9IE5VTV9FTlRSSUVTIChqdGFiKTsgaS0tOykKLQl7Ci0JICBpZiAoanRhYltpXS5zaXplID09IDApCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKGp0YWJbaV0ubWFnaWMgPT0gbWFnaWMpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIC8qIElmIHdlIGRpZCBub3QgZmluZCBhIG1hdGNoaW5nIGVudHJ5IHNvbWV0aGluZyBpcyB3cm9uZy4gICovCi0gICAgICBpZiAoaSA8IDApCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIENyZWF0ZSB0aGUgLnRleHQgc2VjdGlvbi4gICovCi0gICAgICB0ZXh0ID0gcGVfSUxGX21ha2VfYV9zZWN0aW9uICgmIHZhcnMsICIudGV4dCIsIGp0YWJbaV0uc2l6ZSwgU0VDX0NPREUpOwotICAgICAgaWYgKHRleHQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIENvcHkgaW4gdGhlIGp1bXAgY29kZS4gICovCi0gICAgICBtZW1jcHkgKHRleHQtPmNvbnRlbnRzLCBqdGFiW2ldLmRhdGEsIGp0YWJbaV0uc2l6ZSk7Ci0KLSAgICAgIC8qIENyZWF0ZSBhbiBpbXBvcnQgc3ltYm9sLiAgKi8KLSAgICAgIHBlX0lMRl9tYWtlX2Ffc3ltYm9sICgmIHZhcnMsICJfX2ltcF8iLCBzeW1ib2xfbmFtZSwgaWQ1LCAwKTsKLSAgICAgIGltcF9zeW0gICA9IHZhcnMuc3ltX3B0cl9wdHIgLSAxOwotICAgICAgaW1wX2luZGV4ID0gdmFycy5zeW1faW5kZXggLSAxOwotICAgIAotICAgICAgLyogQ3JlYXRlIGEgcmVsb2MgZm9yIHRoZSBkYXRhIGluIHRoZSB0ZXh0IHNlY3Rpb24uICAqLwotI2lmZGVmIE1JUFNfQVJDSF9NQUdJQ19XSU5DRSAgICAgIAotICAgICAgaWYgKG1hZ2ljID09IE1JUFNfQVJDSF9NQUdJQ19XSU5DRSkKLQl7Ci0JICBwZV9JTEZfbWFrZV9hX3N5bWJvbF9yZWxvYyAoJiB2YXJzLCAwLCBCRkRfUkVMT0NfSEkxNl9TLAotCQkJCSAgICAgIChhc2VjdGlvbiAqKikgaW1wX3N5bSwgaW1wX2luZGV4KTsKLQkgIHBlX0lMRl9tYWtlX2FfcmVsb2MgKCYgdmFycywgMCwgQkZEX1JFTE9DX0xPMTYsIHRleHQpOwotCSAgcGVfSUxGX21ha2VfYV9zeW1ib2xfcmVsb2MgKCYgdmFycywgNCwgQkZEX1JFTE9DX0xPMTYsCi0JCQkJICAgICAgKGFzZWN0aW9uICoqKSBpbXBfc3ltLCBpbXBfaW5kZXgpOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZgotCXBlX0lMRl9tYWtlX2Ffc3ltYm9sX3JlbG9jICgmIHZhcnMsIGp0YWJbaV0ub2Zmc2V0LCBCRkRfUkVMT0NfMzIsCi0JCQkJICAgIChhc3ltYm9sICoqKSBpbXBfc3ltLCBpbXBfaW5kZXgpOwotICAgICAgCi0gICAgICBwZV9JTEZfc2F2ZV9yZWxvY3MgKCYgdmFycywgdGV4dCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSU1QT1JUX0RBVEE6Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBYWFggY29kZSBub3QgeWV0IHdyaXR0ZW4uICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAKLSAgLyogSW5pdGlhbGlzZSB0aGUgYmZkLiAgKi8KLSAgbWVtc2V0ICgmIGludGVybmFsX2YsIDAsIHNpemVvZiAoaW50ZXJuYWxfZikpOwotICAKLSAgaW50ZXJuYWxfZi5mX21hZ2ljICA9IG1hZ2ljOwotICBpbnRlcm5hbF9mLmZfc3ltcHRyID0gMDsKLSAgaW50ZXJuYWxfZi5mX25zeW1zICA9IDA7Ci0gIGludGVybmFsX2YuZl9mbGFncyAgPSBGX0FSMzJXUiB8IEZfTE5OTzsgLyogWFhYIGlzIHRoaXMgY29ycmVjdCA/ICAqLwotICAKLSAgaWYgKCAgICEgYmZkX3NldF9zdGFydF9hZGRyZXNzIChhYmZkLCAwKQotICAgICAgfHwgISBiZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsICYgaW50ZXJuYWxfZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfY29mZl9ta29iamVjdF9ob29rIChhYmZkLCAoUFRSKSAmIGludGVybmFsX2YsIE5VTEwpID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvZmZfZGF0YSAoYWJmZCktPnBlID0gMTsKLSNpZmRlZiBUSFVNQlBFTUFHSUMgIAotICBpZiAodmFycy5tYWdpYyA9PSBUSFVNQlBFTUFHSUMpCi0gICAgLyogU3RvcCBzb21lIGxpbmtlciB3YXJuaW5ncyBhYm91dCB0aHVtYiBjb2RlIG5vdCBzdXBwb3J0aW5nIGludGVyd29ya2luZy4gICovCi0gICAgY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgfD0gRl9JTlRFUldPUksgfCBGX0lOVEVSV09SS19TRVQ7Ci0jZW5kaWYKLSAgICAKLSAgLyogU3dpdGNoIGZyb20gZmlsZSBjb250ZW50cyB0byBtZW1vcnkgY29udGVudHMuICAqLwotICBiZmRfY2FjaGVfY2xvc2UgKGFiZmQpOwotCi0gIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgdmFycy5iaW07Ci0gIGFiZmQtPmZsYWdzIHw9IEJGRF9JTl9NRU1PUlkgLyogfCBIQVNfTE9DQUxTICovOwotICBhYmZkLT53aGVyZSA9IDA7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSAwOwotCi0gIC8qIE5vdyBjcmVhdGUgYSBzeW1ib2wgZGVzY3JpYmluZyB0aGUgaW1wb3J0ZWQgdmFsdWUuICAqLwotICBzd2l0Y2ggKGltcG9ydF90eXBlKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICogcHRyOwotICAgICAgCi0gICAgY2FzZSBJTVBPUlRfQ09ERToKLSAgICAgIHBlX0lMRl9tYWtlX2Ffc3ltYm9sICgmIHZhcnMsICIiLCBzeW1ib2xfbmFtZSwgdGV4dCwKLQkJCSAgICBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTik7Ci0gICAgICAKLSAgICAgIC8qIENyZWF0ZSBhbiBpbXBvcnQgc3ltYm9sIGZvciB0aGUgRExMLCB3aXRob3V0IHRoZQotICAgICAgIC5kbGwgc3VmZml4LiAgKi8KLSAgICAgIHB0ciA9IHN0cnJjaHIgKHNvdXJjZV9kbGwsICcuJyk7Ci0gICAgICBpZiAocHRyKQotCSogcHRyID0gMDsKLSAgICAgIHBlX0lMRl9tYWtlX2Ffc3ltYm9sICgmIHZhcnMsICJfX0lNUE9SVF9ERVNDUklQVE9SXyIsIHNvdXJjZV9kbGwsIE5VTEwsIDApOwotICAgICAgaWYgKHB0cikKLQkqIHB0ciA9ICcuJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJTVBPUlRfREFUQToKLSAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZS4gICovCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBYWFggY29kZSBub3QgeWV0IHdyaXR0ZW4uICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFBvaW50IHRoZSBiZmQgYXQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1ib2xzIChhYmZkKSA9IHZhcnMuc3ltX2NhY2hlOwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHZhcnMuc3ltX2luZGV4OwotICAKLSAgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSA9IHZhcnMubmF0aXZlX3N5bXM7Ci0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9IHZhcnMuc3ltX2luZGV4OwotCi0gIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpID0gKFBUUikgdmFycy5lc3ltX3RhYmxlOwotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0gdHJ1ZTsKLSAgCi0gIG9ial9jb252ZXJ0IChhYmZkKSA9IHZhcnMuc3ltX3RhYmxlOwotICBvYmpfY29udl90YWJsZV9zaXplIChhYmZkKSA9IHZhcnMuc3ltX2luZGV4OwotICAKLSAgb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgPSB2YXJzLnN0cmluZ190YWJsZTsKLSAgb2JqX2NvZmZfa2VlcF9zdHJpbmdzIChhYmZkKSA9IHRydWU7Ci0KLSAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGhhdmUgZGV0ZWN0ZWQgYSBJbWFnZSBMaWJyYXJ5IEZvcm1hdCBhcmNoaXZlIGVsZW1lbnQuCi0gICBEZWNvZGUgdGhlIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGFyZ2V0LiAgKi8KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXBlX0lMRl9vYmplY3RfcCAoYmZkICogYWJmZCkKLXsKLSAgYmZkX2J5dGUgICAgICAgIGJ1ZmZlclsxNl07Ci0gIGJmZF9ieXRlICogICAgICBwdHI7Ci0gIGJmZF9ieXRlICogICAgICBzeW1ib2xfbmFtZTsKLSAgYmZkX2J5dGUgKiAgICAgIHNvdXJjZV9kbGw7Ci0gIHVuc2lnbmVkIGludCAgICBtYWNoaW5lOwotICB1bnNpZ25lZCBsb25nICAgc2l6ZTsKLSAgdW5zaWduZWQgaW50ICAgIG9yZGluYWw7Ci0gIHVuc2lnbmVkIGludCAgICB0eXBlczsKLSAgdW5zaWduZWQgc2hvcnQgIG1hZ2ljOwotICAKLSAgLyogVXBvbiBlbnRyeSB0aGUgZmlyc3QgZm91ciBidXllcyBvZiB0aGUgSUxGIGhlYWRlciBoYXZlCi0gICAgICBhbHJlYWR5IGJlZW4gcmVhZC4gIE5vdyByZWFkIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIuICAqLwotICBpZiAoYmZkX3JlYWQgKGJ1ZmZlciwgMSwgMTYsIGFiZmQpICE9IDE2KQotICAgIHJldHVybiBOVUxMOwotCi0gIHB0ciA9IGJ1ZmZlcjsKLSAgCi0gIC8qICBXZSBkbyBub3QgYm90aGVyIHRvIGNoZWNrIHRoZSB2ZXJzaW9uIG51bWJlci4KLSAgICAgIHZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHB0cik7ICAqLwotICBwdHIgKz0gMjsKLQotICBtYWNoaW5lID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBwdHIpOwotICBwdHIgKz0gMjsKLQotICAvKiBDaGVjayB0aGF0IHRoZSBtYWNoaW5lIHR5cGUgaXMgcmVjb2duaXNlZC4gICovCi0gIG1hZ2ljID0gMDsKLSAgCi0gIHN3aXRjaCAobWFjaGluZSkKLSAgICB7Ci0gICAgY2FzZSBJTUFHRV9GSUxFX01BQ0hJTkVfVU5LTk9XTjoKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9BTFBIQToKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9BTFBIQTY0OgotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX0lBNjQ6Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX0kzODY6Ci0jaWZkZWYgSTM4Nk1BR0lDCi0gICAgICBtYWdpYyA9IEkzODZNQUdJQzsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9NNjhLOgotI2lmZGVmIE1DNjhBR0lDCi0gICAgICBtYWdpYyA9IE1DNjhNQUdJQzsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9SMzAwMDoKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9SNDAwMDoKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9SMTAwMDA6Ci0gICAgICAKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9NSVBTMTY6Ci0gICAgY2FzZSBJTUFHRV9GSUxFX01BQ0hJTkVfTUlQU0ZQVToKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9NSVBTRlBVMTY6Ci0jaWZkZWYgTUlQU19BUkNIX01BR0lDX1dJTkNFCi0gICAgICBtYWdpYyA9IE1JUFNfQVJDSF9NQUdJQ19XSU5DRTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9TSDM6Ci0gICAgY2FzZSBJTUFHRV9GSUxFX01BQ0hJTkVfU0g0OgotI2lmZGVmIFNIX0FSQ0hfTUFHSUNfV0lOQ0UKLSAgICAgIG1hZ2ljID0gU0hfQVJDSF9NQUdJQ19XSU5DRTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9BUk06Ci0jaWZkZWYgQVJNUEVNQUdJQwotICAgICAgbWFnaWMgPSBBUk1QRU1BR0lDOwotI2VuZGlmICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU1BR0VfRklMRV9NQUNISU5FX1RIVU1COgotI2lmZGVmIFRIVU1CUEVNQUdJQwotICAgICAgewotCWV4dGVybiBiZmRfdGFyZ2V0IGFybXBlaV9saXR0bGVfdmVjOwotCQotCWlmIChhYmZkLT54dmVjID09ICYgYXJtcGVpX2xpdHRsZV92ZWMpCi0JICBtYWdpYyA9IFRIVU1CUEVNQUdJQzsKLSAgICAgIH0KLSNlbmRpZiAgICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIElNQUdFX0ZJTEVfTUFDSElORV9QT1dFUlBDOgotICAgICAgLyogV2Ugbm8gbG9uZ2VyIHN1cHBvcnQgUG93ZXJQQy4gICovCi0gICAgZGVmYXVsdDoKLSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSgKLV8oIiVzOiBVbnJlY29nbmlzZWQgbWFjaGluZSB0eXBlICgweCV4KSBpbiBJbXBvcnQgTGlicmFyeSBGb3JtYXQgYXJjaGl2ZSIpLAotICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG1hY2hpbmUpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLQkKLSAgICAgIHJldHVybiBOVUxMOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChtYWdpYyA9PSAwKQotICAgIHsKLSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSgKLV8oIiVzOiBSZWNvZ25pc2VkIGJ1dCB1bmhhbmRsZWQgbWFjaGluZSB0eXBlICgweCV4KSBpbiBJbXBvcnQgTGlicmFyeSBGb3JtYXQgYXJjaGl2ZSIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbWFjaGluZSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0gIAotCi0gIC8qIFdlIGRvIG5vdCBib3RoZXIgdG8gY2hlY2sgdGhlIGRhdGUuCi0gICAgIGRhdGUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHB0cik7ICAqLwotICBwdHIgKz0gNDsKLSAgCi0gIHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHB0cik7Ci0gIHB0ciArPSA0OwotCi0gIGlmIChzaXplID09IDApCi0gICAgewotICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JKF8oIiVzOiBzaXplIGZpZWxkIGlzIHplcm8gaW4gSW1wb3J0IExpYnJhcnkgRm9ybWF0IGhlYWRlciIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotCQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG9yZGluYWwgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHB0cik7Ci0gIHB0ciArPSAyOwotCi0gIHR5cGVzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBwdHIpOwotICAvKiBwdHIgKz0gMjsgKi8KLQotICAvKiBOb3cgcmVhZCBpbiB0aGUgdHdvIHN0cmluZ3MgdGhhdCBmb2xsb3cuICAqLwotICBwdHIgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAocHRyID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICBpZiAoYmZkX3JlYWQgKHB0ciwgMSwgc2l6ZSwgYWJmZCkgIT0gc2l6ZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzeW1ib2xfbmFtZSA9IHB0cjsKLSAgc291cmNlX2RsbCAgPSBwdHIgKyBzdHJsZW4gKHB0cikgKyAxOwotICAKLSAgLyogVmVyaWZ5IHRoYXQgdGhlIHN0cmluZ3MgYXJlIG51bGwgdGVybWluYXRlZC4gICovCi0gIGlmIChwdHJbc2l6ZSAtIDFdICE9IDAgfHwgKCh1bnNpZ25lZCBsb25nKSAoc291cmNlX2RsbCAtIHB0cikgPj0gc2l6ZSkpCi0gICAgewotICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JKF8oIiVzOiBzdHJpbmcgbm90IG51bGwgdGVybWluYXRlZCBpbiBJTEYgb2JqZWN0IGZpbGUuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0JCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICAvKiBOb3cgY29uc3RydWN0IHRoZSBiZmQuICAqLwotICBpZiAoISBwZV9JTEZfYnVpbGRfYV9iZmQgKGFiZmQsIG1hZ2ljLCBzeW1ib2xfbmFtZSwKLQkJCSAgICBzb3VyY2VfZGxsLCBvcmRpbmFsLCB0eXBlcykpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotcGVfYmZkX29iamVjdF9wIChiZmQgKiBhYmZkKQotewotICAvKiBXZSBuZWVkIHRvIGhhbmRsZSBhIFBFIGltYWdlIGNvcnJlY3RseS4gIEluIFBFIGltYWdlcyBjcmVhdGVkIGJ5Ci0gICAgIHRoZSBHTlUgbGlua2VyLCB0aGUgb2Zmc2V0IHRvIHRoZSBDT0ZGIGhlYWRlciBpcyBhbHdheXMgdGhlIHNpemUuCi0gICAgIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHRoZSBjYXNlIGluIGltYWdlcyBnZW5lcmF0ZWQgYnkgb3RoZXIgUEUKLSAgICAgbGlua2Vycy4gIFRoZSBQRSBmb3JtYXQgc3RvcmVzIGEgZm91ciBieXRlIG9mZnNldCB0byB0aGUgUEUKLSAgICAgc2lnbmF0dXJlIGp1c3QgYmVmb3JlIHRoZSBDT0ZGIGhlYWRlciBhdCBsb2NhdGlvbiAweDNjIG9mIHRoZSBmaWxlLgotICAgICBXZSBwaWNrIHVwIHRoYXQgb2Zmc2V0LCB2ZXJpZnkgdGhhdCB0aGUgUEUgc2lnbmF0dXJlIGlzIHRoZXJlLCBhbmQKLSAgICAgdGhlbiBzZXQgb3Vyc2VsdmVzIHVwIHRvIHJlYWQgaW4gdGhlIENPRkYgaGVhZGVyLiAgKi8KLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBmaWxlX3B0ciBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlOwotCi0gIC8qIERldGVjdCBpZiB0aGlzIGEgTWljcm9zb2Z0IEltcG9ydCBMaWJyYXJ5IEZvcm1hdCBlbGVtZW50LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAweDAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGJ1ZmZlciwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBzaWduYXR1cmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ1ZmZlcik7Ci0gIAotICBpZiAoc2lnbmF0dXJlID09IDB4ZmZmZjAwMDApCi0gICAgcmV0dXJuIHBlX0lMRl9vYmplY3RfcCAoYWJmZCk7Ci0gIAotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDB4M2MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoYnVmZmVyLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBvZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ1ZmZlcik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoYnVmZmVyLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzaWduYXR1cmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ1ZmZlcik7Ci0KLSAgaWYgKHNpZ25hdHVyZSAhPSAweDQ1NTApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICAvKiBIZXJlIGlzIHRoZSBoYWNrLiAgY29mZl9vYmplY3RfcCB3YW50cyB0byByZWFkIGZpbGhzeiBieXRlcyB0bwotICAgICBwaWNrIHVwIHRoZSBDT0ZGIGhlYWRlci4gIFdlIGFkanVzdCBzbyB0aGF0IHRoYXQgd2lsbCB3b3JrLiAgMjAKLSAgICAgaXMgdGhlIHNpemUgb2YgdGhlIGkzODYgQ09GRiBmaWxlaGRyLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkoYmZkX3RlbGwgKGFiZmQpCi0JCSAtIGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkKLQkJICsgMjApLAotCQlTRUVLX1NFVCkKLSAgICAgICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKLX0KLQotI2RlZmluZSBjb2ZmX29iamVjdF9wIHBlX2JmZF9vYmplY3RfcAotI2VuZGlmIC8qIENPRkZfSU1BR0VfV0lUSF9QRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL3BlaWdlbi5jIGIvYmZkL3BlaWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzllYTg5Li4wMDAwMDAwCi0tLSBhL2JmZC9wZWlnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE5MTEgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgUEUvUEVJOyB0aGUgY29tbW9uIGV4ZWN1dGFibGUgcGFydHMuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbQotCi1QRS9QRUkgcmVhcnJhbmdlbWVudCAoYW5kIGNvZGUgYWRkZWQpOiBEb25uIFRlcnJ5Ci0JCQkJICAgICAgIFNvZnR3YXkgU3lzdGVtcywgSW5jLgotKi8KLQotLyogSGV5IGxvb2ssIHNvbWUgZG9jdW1lbnRhdGlvbiBbYW5kIGluIGEgcGxhY2UgeW91IGV4cGVjdCB0byBmaW5kIGl0XSEKLQotICAgVGhlIG1haW4gcmVmZXJlbmNlIGZvciB0aGUgcGVpIGZvcm1hdCBpcyAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gNC4xIi4gIEdldCBpdCBpZiB5b3UgbmVlZCB0bwotICAgZG8gc29tZSBzZXJpb3VzIGhhY2tpbmcgb24gdGhpcyBjb2RlLgotCi0gICBBbm90aGVyIHJlZmVyZW5jZToKLSAgICJQZWVyaW5nIEluc2lkZSB0aGUgUEU6IEEgVG91ciBvZiB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgRmlsZSBGb3JtYXQiLCBNU0ogMTk5NCwgVm9sdW1lIDkuCi0KLSAgIFRoZSAqc29sZSogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwZSBmb3JtYXQgYW5kIHRoZSBwZWkgZm9ybWF0IGlzIHRoYXQgdGhlCi0gICBsYXR0ZXIgaGFzIGFuIE1TRE9TIDIuMCAuZXhlIGhlYWRlciBvbiB0aGUgZnJvbnQgdGhhdCBwcmludHMgdGhlIG1lc3NhZ2UKLSAgICJUaGlzIGFwcCBtdXN0IGJlIHJ1biB1bmRlciBXaW5kb3dzLiIgKG9yIHNvbWUgc3VjaCkuCi0gICAoRklYTUU6IFdoZXRoZXIgdGhhdCBzdGF0ZW1lbnQgaXMgKnJlYWxseSogdHJ1ZSBvciBub3QgaXMgdW5rbm93bi4KLSAgIEFyZSB0aGVyZSBtb3JlIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBlIGFuZCBwZWkgZm9ybWF0cz8KLSAgIEZvciBub3cgYXNzdW1lIHRoZXJlIGFyZW4ndC4gIElmIHlvdSBmaW5kIG9uZSwgdGhlbiBmb3IgR29kIHNha2VzCi0gICBkb2N1bWVudCBpdCBoZXJlISkKLQotICAgVGhlIE1pY3Jvc29mdCBkb2NzIHVzZSB0aGUgd29yZCAiaW1hZ2UiIGluc3RlYWQgb2YgImV4ZWN1dGFibGUiIGJlY2F1c2UKLSAgIHRoZSBmb3JtZXIgY2FuIGFsc28gcmVmZXIgdG8gYSBETEwgKHNoYXJlZCBsaWJyYXJ5KS4gIENvbmZ1c2lvbiBjYW4gYXJpc2UKLSAgIGJlY2F1c2UgdGhlIGBpJyBpbiBgcGVpJyBhbHNvIHJlZmVycyB0byAiaW1hZ2UiLiAgVGhlIGBwZScgZm9ybWF0IGNhbgotICAgYWxzbyBjcmVhdGUgaW1hZ2VzIChpLmUuIGV4ZWN1dGFibGVzKSwgaXQncyBqdXN0IHRoYXQgdG8gcnVuIG9uIGEgd2luMzIKLSAgIHN5c3RlbSB5b3UgbmVlZCB0byB1c2UgdGhlIHBlaSBmb3JtYXQuCi0KLSAgIEZJWE1FOiBQbGVhc2UgYWRkIG1vcmUgZG9jcyBoZXJlIHNvIHRoZSBuZXh0IHBvb3IgZm9vbCB0aGF0IGhhcyB0byBoYWNrCi0gICBvbiB0aGlzIGNvZGUgaGFzIGEgY2hhbmNlIG9mIGdldHRpbmcgc29tZXRoaW5nIGFjY29tcGxpc2hlZCB3aXRob3V0Ci0gICB3YXN0aW5nIHRvbyBtdWNoIHRpbWUuCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0vKiBOT1RFOiBpdCdzIHN0cmFuZ2UgdG8gYmUgaW5jbHVkaW5nIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBoZWFkZXIKLSAgIGluIHdoYXQncyBzdXBwb3NlZCB0byBiZSBnZW5lcmFsICh0byBQRS9QRUkpIGNvZGUuICBIb3dldmVyLCB0aGF0J3MKLSAgIHdoZXJlIHRoZSBkZWZpbml0aW9ucyBhcmUsIGFuZCB0aGV5IGRvbid0IHZhcnkgcGVyIGFyY2hpdGVjdHVyZQotICAgd2l0aGluIFBFL1BFSSwgc28gd2UgZ2V0IHRoZW0gZnJvbSB0aGVyZS4gIEZJWE1FOiBUaGUgbGFjayBvZgotICAgdmFyaWFuY2UgaXMgYW4gYXNzdW1wdGlvbiB3aGljaCBtYXkgcHJvdmUgdG8gYmUgaW5jb3JyZWN0IGlmIG5ldwotICAgUEUvUEVJIHRhcmdldHMgYXJlIGNyZWF0ZWQuICAqLwotI2luY2x1ZGUgImNvZmYvaTM4Ni5oIgotCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJwZWkuaCIKLQotLyogRklYTUU6IFRoaXMgZmlsZSBoYXMgdmFyaW91cyB0ZXN0cyBvZiBQT1dFUlBDX0xFX1BFLiAgVGhvc2UgdGVzdHMKLSAgIHdvcmtlZCB3aGVuIHRoZSBjb2RlIHdhcyBpbiBwZWljb2RlLmgsIGJ1dCBubyBsb25nZXIgd29yayBub3cgdGhhdAotICAgdGhlIGNvZGUgaXMgaW4gcGVpZ2VuLmMuICBQb3dlclBDIE5UIGlzIHNhaWQgdG8gYmUgZGVhZC4gIElmCi0gICBhbnlib2R5IHdhbnRzIHRvIHJldml2ZSB0aGUgY29kZSwgeW91IHdpbGwgaGF2ZSB0byBmaWd1cmUgb3V0IGhvdwotICAgdG8gaGFuZGxlIHRob3NlIGlzc3Vlcy4gICovCi0KLXN0YXRpYyB2b2lkIGFkZF9kYXRhX2VudHJ5Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqLCBpbnQsIGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcGVfcHJpbnRfcGRhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gcGVfcHJpbnRfcmVsb2MgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotX2JmZF9wZWlfc3dhcF9zeW1faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgU1lNRU5UICpleHQgPSAoU1lNRU5UICopZXh0MTsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW4xOwotCi0gIGlmKCBleHQtPmUuZV9uYW1lWzBdID09IDApIHsKLSAgICBpbi0+X24uX25fbi5fbl96ZXJvZXMgPSAwOwotICAgIGluLT5fbi5fbl9uLl9uX29mZnNldCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotICAgIG1lbWNweShpbi0+X24uX25fbmFtZSwgZXh0LT5lLmVfbmFtZSwgU1lNTk1MRU4pOwotICB9Ci0KLSAgaW4tPm5fdmFsdWUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV92YWx1ZSk7Ci0gIGluLT5uX3NjbnVtID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKXsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICB9Ci0gIGluLT5uX3NjbGFzcyA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9zY2xhc3MpOwotICBpbi0+bl9udW1hdXggPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfbnVtYXV4KTsKLQotI2lmbmRlZiBTVFJJQ1RfUEVfRk9STUFUCi0gIC8qIFRoaXMgaXMgZm9yIEdudS1jcmVhdGVkIERMTHMgKi8KLQotICAvKiBUaGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgLmlkYXRhJCBzZWN0aW9ucyBoYXZlIGNsYXNzIDB4NjgKLSAgICAgKENfU0VDVElPTiksIHdoaWNoIE1TIGRvY3VtZW50YXRpb24gaW5kaWNhdGVzIGlzIGEgc2VjdGlvbgotICAgICBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5LCB0aGUgdmFsdWUgZmllbGQgaW4gdGhlIHN5bWJvbCBpcyBzaW1wbHkgYQotICAgICBjb3B5IG9mIHRoZSAuaWRhdGEgc2VjdGlvbidzIGZsYWdzIHJhdGhlciB0aGFuIHNvbWV0aGluZyB1c2VmdWwuCi0gICAgIFdoZW4gdGhlc2Ugc3ltYm9scyBhcmUgZW5jb3VudGVyZWQsIGNoYW5nZSB0aGUgdmFsdWUgdG8gMCBzbyB0aGF0Ci0gICAgIHRoZXkgd2lsbCBiZSBoYW5kbGVkIHNvbWV3aGF0IGNvcnJlY3RseSBpbiB0aGUgYmZkIGNvZGUuICAqLwotICBpZiAoaW4tPm5fc2NsYXNzID09IENfU0VDVElPTikKLSAgICB7Ci0gICAgICBpbi0+bl92YWx1ZSA9IDB4MDsKLQotI2lmIDAKLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGNsZWFybHkgd3JvbmcuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBiZSB0aGF0Ci0gICAgICAgICB1bmRlZmluZWQgQ19TRUNUSU9OIHN5bWJvbHMgYXBwZWFyIGluIHRoZSBmaXJzdCBvYmplY3Qgb2YgYQotICAgICAgICAgTVMgZ2VuZXJhdGVkIC5saWIgZmlsZSwgYW5kIHRoZSBzeW1ib2xzIGFyZSBub3QgZGVmaW5lZAotICAgICAgICAgYW55d2hlcmUuICAqLwotICAgICAgaW4tPm5fc2NudW0gPSAxOwotCi0gICAgICAvKiBJIGhhdmUgdHJpZWQgc2V0dGluZyB0aGUgY2xhc3MgdG8gMyBhbmQgdXNpbmcgdGhlIGZvbGxvd2luZwotCSB0byBzZXQgdGhlIHNlY3Rpb24gbnVtYmVyLiAgVGhpcyB3aWxsIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUKLQkgcG9pbnRlciB0byB0aGUgc3RyaW5nIGtlcm5lbDMyLmRsbCBhdCBhZGRyZXNzZXMgMCBhbmQgMHgxMAotCSBvZmYgc3RhcnQgb2YgaWRhdGEgc2VjdGlvbiB3aGljaCBpcyBub3QgY29ycmVjdCAqLwotICAgICAgLyogICAgaWYgKHN0cmNtcCAoaW4tPl9uLl9uX25hbWUsICIuaWRhdGEkNCIpID09IDApICovCi0gICAgICAvKiAgICAgIGluLT5uX3NjbnVtID0gMzsgKi8KLSAgICAgIC8qICAgIGVsc2UgKi8KLSAgICAgIC8qICAgICAgaW4tPm5fc2NudW0gPSAyOyAqLwotI2Vsc2UKLSAgICAgIC8qIENyZWF0ZSBzeW50aGV0aWMgZW1wdHkgc2VjdGlvbnMgYXMgbmVlZGVkLiAgREogKi8KLSAgICAgIGlmIChpbi0+bl9zY251bSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBmb3IgKHNlYz1hYmZkLT5zZWN0aW9uczsgc2VjOyBzZWM9c2VjLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCBpbi0+bl9uYW1lKSA9PSAwKQotCQl7Ci0JCSAgaW4tPm5fc2NudW0gPSBzZWMtPnRhcmdldF9pbmRleDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKGluLT5uX3NjbnVtID09IDApCi0JewotCSAgaW50IHVudXNlZF9zZWN0aW9uX251bWJlciA9IDA7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgY2hhciAqbmFtZTsKLQkgIGZvciAoc2VjPWFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYz1zZWMtPm5leHQpCi0JICAgIGlmICh1bnVzZWRfc2VjdGlvbl9udW1iZXIgPD0gc2VjLT50YXJnZXRfaW5kZXgpCi0JICAgICAgdW51c2VkX3NlY3Rpb25fbnVtYmVyID0gc2VjLT50YXJnZXRfaW5kZXgrMTsKLQotCSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChpbi0+bl9uYW1lKSArIDEwKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybjsKLQkgIHN0cmNweSAobmFtZSwgaW4tPm5fbmFtZSk7Ci0JICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0KLQkgIHNlYy0+dm1hID0gMDsKLQkgIHNlYy0+bG1hID0gMDsKLQkgIHNlYy0+X2Nvb2tlZF9zaXplID0gMDsKLQkgIHNlYy0+X3Jhd19zaXplID0gMDsKLQkgIHNlYy0+ZmlsZXBvcyA9IDA7Ci0JICBzZWMtPnJlbF9maWxlcG9zID0gMDsKLQkgIHNlYy0+cmVsb2NfY291bnQgPSAwOwotCSAgc2VjLT5saW5lX2ZpbGVwb3MgPSAwOwotCSAgc2VjLT5saW5lbm9fY291bnQgPSAwOwotCSAgc2VjLT51c2VyZGF0YSA9IE5VTEw7Ci0JICBzZWMtPm5leHQgPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgIHNlYy0+ZmxhZ3MgPSAwOwotCSAgc2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCSAgc2VjLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfREFUQSB8IFNFQ19MT0FEOwotCi0JICBzZWMtPnRhcmdldF9pbmRleCA9IHVudXNlZF9zZWN0aW9uX251bWJlcjsKLQotCSAgaW4tPm5fc2NudW0gPSB1bnVzZWRfc2VjdGlvbl9udW1iZXI7Ci0JfQotICAgICAgaW4tPm5fc2NsYXNzID0gQ19TVEFUOwotI2VuZGlmCi0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBjb2ZmX3N3YXBfc3ltX2luX2hvb2sKLSAgLyogVGhpcyB3b24ndCB3b3JrIGluIHBlaWdlbi5jLCBidXQgc2luY2UgaXQncyBmb3IgUFBDIFBFLCBpdCdzIG5vdAotICAgICB3b3J0aCBmaXhpbmcuICovCi0gIGNvZmZfc3dhcF9zeW1faW5faG9vayhhYmZkLCBleHQxLCBpbjEpOwotI2VuZGlmCi19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnAsIGV4dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbnA7Ci0gIFNZTUVOVCAqZXh0ID0oU1lNRU5UICopZXh0cDsKLSAgaWYoaW4tPl9uLl9uX25hbWVbMF0gPT0gMCkgewotICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV96ZXJvZXMpOwotICAgIGJmZF9oX3B1dF8zMihhYmZkLCBpbi0+X24uX25fbi5fbl9vZmZzZXQsIChiZmRfYnl0ZSAqKSAgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotICAgIG1lbWNweShleHQtPmUuZV9uYW1lLCBpbi0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotICB9Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl92YWx1ZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3NjbnVtICwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpCi0gICAgewotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgIH0KLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX3NjbGFzcyAsIGV4dC0+ZV9zY2xhc3MpOwotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fbnVtYXV4ICwgZXh0LT5lX251bWF1eCk7Ci0KLSAgcmV0dXJuIFNZTUVTWjsKLX0KLQotdm9pZAotX2JmZF9wZWlfc3dhcF9hdXhfaW4gKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIGV4dDE7Ci0gICAgIGludCAgICAgICAgICAgICB0eXBlOwotICAgICBpbnQgICAgICAgICAgICAgY2xhc3M7Ci0gICAgIGludAkgICAgIGluZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50CSAgICAgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiAJICAgICBpbjE7Ci17Ci0gIEFVWEVOVCAgICAqZXh0ID0gKEFVWEVOVCAqKWV4dDE7Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW4xOwotCi0gIHN3aXRjaCAoY2xhc3MpIHsKLSAgY2FzZSBDX0ZJTEU6Ci0gICAgaWYgKGV4dC0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgewotICAgICAgaW4tPnhfZmlsZS54X24ueF96ZXJvZXMgPSAwOwotICAgICAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQgPQotCWJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgbWVtY3B5IChpbi0+eF9maWxlLnhfZm5hbWUsIGV4dC0+eF9maWxlLnhfZm5hbWUsIEZJTE5NTEVOKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotCi0KLSAgY2FzZSBDX1NUQVQ6Ci0gIGNhc2UgQ19MRUFGU1RBVDoKLSAgY2FzZSBDX0hJRERFTjoKLSAgICBpZiAodHlwZSA9PSBUX05VTEwpIHsKLSAgICAgIGluLT54X3Njbi54X3NjbmxlbiA9IEdFVF9TQ05fU0NOTEVOKGFiZmQsIGV4dCk7Ci0gICAgICBpbi0+eF9zY24ueF9ucmVsb2MgPSBHRVRfU0NOX05SRUxPQyhhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc2NuLnhfbmxpbm5vID0gR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3Njbi54X2NoZWNrc3VtID0gYmZkX2hfZ2V0XzMyIChhYmZkLAotCQkJCQkgICAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2NoZWNrc3VtKTsKLSAgICAgIGluLT54X3Njbi54X2Fzc29jaWF0ZWQgPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9hc3NvY2lhdGVkKTsKLSAgICAgIGluLT54X3Njbi54X2NvbWRhdCA9IGJmZF9oX2dldF84IChhYmZkLAotCQkJCQkoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2NvbWRhdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgaW4tPnhfc3ltLnhfdGFnbmR4LmwgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90YWduZHgpOwotICBpbi0+eF9zeW0ueF90dm5keCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3R2bmR4KTsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gR0VUX0ZDTl9MTk5PUFRSIChhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBHRVRfRkNOX0VORE5EWCAoYWJmZCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOKHR5cGUpKSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8gPSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCk7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID0gR0VUX0xOU1pfU0laRShhYmZkLCBleHQpOwotICB9Ci19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfc3dhcF9hdXhfb3V0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAgKmFiZmQ7Ci0gICAgIFBUUiAgIGlucDsKLSAgICAgaW50ICAgdHlwZTsKLSAgICAgaW50ICAgY2xhc3M7Ci0gICAgIGludCAgIGluZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50ICAgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiAgIGV4dHA7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW5wOwotICBBVVhFTlQgKmV4dCA9IChBVVhFTlQgKilleHRwOwotCi0gIG1lbXNldCgoUFRSKWV4dCwgMCwgQVVYRVNaKTsKLSAgc3dpdGNoIChjbGFzcykgewotICBjYXNlIENfRklMRToKLSAgICBpZiAoaW4tPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfemVyb2VzKTsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0gICAgfQotICAgIHJldHVybiBBVVhFU1o7Ci0KLQotICBjYXNlIENfU1RBVDoKLSAgY2FzZSBDX0xFQUZTVEFUOgotICBjYXNlIENfSElEREVOOgotICAgIGlmICh0eXBlID09IFRfTlVMTCkgewotICAgICAgUFVUX1NDTl9TQ05MRU4oYWJmZCwgaW4tPnhfc2NuLnhfc2NubGVuLCBleHQpOwotICAgICAgUFVUX1NDTl9OUkVMT0MoYWJmZCwgaW4tPnhfc2NuLnhfbnJlbG9jLCBleHQpOwotICAgICAgUFVUX1NDTl9OTElOTk8oYWJmZCwgaW4tPnhfc2NuLnhfbmxpbm5vLCBleHQpOwotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+eF9zY24ueF9jaGVja3N1bSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY2hlY2tzdW0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zY24ueF9hc3NvY2lhdGVkLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9hc3NvY2lhdGVkKTsKLSAgICAgIGJmZF9oX3B1dF84IChhYmZkLCBpbi0+eF9zY24ueF9jb21kYXQsCi0JCSAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY29tZGF0KTsKLSAgICAgIHJldHVybiBBVVhFU1o7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT54X3N5bS54X3RhZ25keC5sLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBpbi0+eF9zeW0ueF90dm5keCAsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOwotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIFBVVF9GQ05fTE5OT1BUUihhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgZXh0KTsKLSAgICAgIFBVVF9GQ05fRU5ETkRYKGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotCi0gIGlmIChJU0ZDTiAodHlwZSkpCi0gICAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfZnNpemUsCi0JICAgICAoYmZkX2J5dGUgKikgIGV4dC0+eF9zeW0ueF9taXNjLnhfZnNpemUpOwotICBlbHNlCi0gICAgewotICAgICAgUFVUX0xOU1pfTE5OTyAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vLCBleHQpOwotICAgICAgUFVUX0xOU1pfU0laRSAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLCBleHQpOwotICAgIH0KLQotICByZXR1cm4gQVVYRVNaOwotfQotCi12b2lkCi1fYmZkX3BlaV9zd2FwX2xpbmVub19pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBQVFIgaW4xOwotewotICBMSU5FTk8gKmV4dCA9IChMSU5FTk8gKilleHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbjE7Ci0KLSAgaW4tPmxfYWRkci5sX3N5bW5keCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotICBpbi0+bF9sbm5vID0gR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCk7Ci19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfc3dhcF9saW5lbm9fb3V0IChhYmZkLCBpbnAsIG91dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCW91dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbnA7Ci0gIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmV4dCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICopb3V0cDsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT5sX2FkZHIubF9zeW1uZHgsIChiZmRfYnl0ZSAqKQotCSAgZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotCi0gIFBVVF9MSU5FTk9fTE5OTyAoYWJmZCwgaW4tPmxfbG5ubywgZXh0KTsKLSAgcmV0dXJuIExJTkVTWjsKLX0KLQotdm9pZAotX2JmZF9wZWlfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBhb3V0aGRyX2V4dDEsIGFvdXRoZHJfaW50MSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgYW91dGhkcl9leHQxOwotICAgICBQVFIgYW91dGhkcl9pbnQxOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqYTsKLSAgUEVBT1VUSERSICpzcmMgPSAoUEVBT1VUSERSICopKGFvdXRoZHJfZXh0MSk7Ci0gIEFPVVRIRFIgICAgICAgICphb3V0aGRyX2V4dCA9IChBT1VUSERSICopIGFvdXRoZHJfZXh0MTsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopYW91dGhkcl9pbnQxOwotCi0gIGFvdXRoZHJfaW50LT5tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPm1hZ2ljKTsKLSAgYW91dGhkcl9pbnQtPnZzdGFtcCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZzdGFtcCk7Ci0gIGFvdXRoZHJfaW50LT50c2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dHNpemUpOwotICBhb3V0aGRyX2ludC0+ZHNpemUgPQotICAgIEdFVF9BT1VUSERSX0RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRzaXplKTsKLSAgYW91dGhkcl9pbnQtPmJzaXplID0KLSAgICBHRVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5ic2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5lbnRyeSA9Ci0gICAgR0VUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZW50cnkpOwotICBhb3V0aGRyX2ludC0+dGV4dF9zdGFydCA9Ci0gICAgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50ZXh0X3N0YXJ0KTsKLSAgYW91dGhkcl9pbnQtPmRhdGFfc3RhcnQgPQotICAgIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZGF0YV9zdGFydCk7Ci0KLSAgYSA9ICZhb3V0aGRyX2ludC0+cGU7Ci0gIGEtPkltYWdlQmFzZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5JbWFnZUJhc2UpOwotICBhLT5TZWN0aW9uQWxpZ25tZW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNlY3Rpb25BbGlnbm1lbnQpOwotICBhLT5GaWxlQWxpZ25tZW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkZpbGVBbGlnbm1lbnQpOwotICBhLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPQotICAgIGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBhLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPQotICAgIGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBhLT5NYWpvckltYWdlVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NYWpvckltYWdlVmVyc2lvbik7Ci0gIGEtPk1pbm9ySW1hZ2VWZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk1pbm9ySW1hZ2VWZXJzaW9uKTsKLSAgYS0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk1ham9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGEtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NaW5vclN1YnN5c3RlbVZlcnNpb24pOwotICBhLT5SZXNlcnZlZDEgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+UmVzZXJ2ZWQxKTsKLSAgYS0+U2l6ZU9mSW1hZ2UgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U2l6ZU9mSW1hZ2UpOwotICBhLT5TaXplT2ZIZWFkZXJzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNpemVPZkhlYWRlcnMpOwotICBhLT5DaGVja1N1bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5DaGVja1N1bSk7Ci0gIGEtPlN1YnN5c3RlbSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TdWJzeXN0ZW0pOwotICBhLT5EbGxDaGFyYWN0ZXJpc3RpY3MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+RGxsQ2hhcmFjdGVyaXN0aWNzKTsKLSAgYS0+U2l6ZU9mU3RhY2tSZXNlcnZlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNpemVPZlN0YWNrUmVzZXJ2ZSk7Ci0gIGEtPlNpemVPZlN0YWNrQ29tbWl0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgYS0+U2l6ZU9mSGVhcFJlc2VydmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U2l6ZU9mSGVhcFJlc2VydmUpOwotICBhLT5TaXplT2ZIZWFwQ29tbWl0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNpemVPZkhlYXBDb21taXQpOwotICBhLT5Mb2FkZXJGbGFncyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5Mb2FkZXJGbGFncyk7Ci0gIGEtPk51bWJlck9mUnZhQW5kU2l6ZXMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+TnVtYmVyT2ZSdmFBbmRTaXplcyk7Ci0KLSAgewotICAgIGludCBpZHg7Ci0gICAgZm9yIChpZHg9MDsgaWR4IDwgMTY7IGlkeCsrKQotICAgICAgewotCWEtPkRhdGFEaXJlY3RvcnlbaWR4XS5WaXJ0dWFsQWRkcmVzcyA9Ci0JICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+RGF0YURpcmVjdG9yeVtpZHhdWzBdKTsKLQlhLT5EYXRhRGlyZWN0b3J5W2lkeF0uU2l6ZSA9Ci0JICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+RGF0YURpcmVjdG9yeVtpZHhdWzFdKTsKLSAgICAgIH0KLSAgfQotCi0gIGlmIChhb3V0aGRyX2ludC0+ZW50cnkpCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPmVudHJ5ICs9IGEtPkltYWdlQmFzZTsKLSAgICAgIGFvdXRoZHJfaW50LT5lbnRyeSAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKGFvdXRoZHJfaW50LT50c2l6ZSkgCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgKz0gYS0+SW1hZ2VCYXNlOwotICAgICAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0gIGlmIChhb3V0aGRyX2ludC0+ZHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ICs9IGEtPkltYWdlQmFzZTsKLSAgICAgIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICAvKiBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG5vcm1hbGx5IHNldCB1cCBieSBwcGNfcmVsb2NhdGVfc2VjdGlvbi4KLSAgICAgSW4gdGhlIGNhc2Ugb2YgcmVhZGluZyBhIGZpbGUgaW4sIHdlIGNhbiBwaWNrIHRoZW0gdXAgZnJvbSB0aGUKLSAgICAgRGF0YURpcmVjdG9yeS4gICovCi0gIGZpcnN0X3RodW5rX2FkZHJlc3MgPSBhLT5EYXRhRGlyZWN0b3J5WzEyXS5WaXJ0dWFsQWRkcmVzcyA7Ci0gIHRodW5rX3NpemUgPSBhLT5EYXRhRGlyZWN0b3J5WzEyXS5TaXplOwotICBpbXBvcnRfdGFibGVfc2l6ZSA9IGEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZTsKLSNlbmRpZgotCi19Ci0KLS8qIEEgc3VwcG9ydCBmdW5jdGlvbiBmb3IgYmVsb3cuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX2RhdGFfZW50cnkgKGFiZmQsIGFvdXQsIGlkeCwgbmFtZSwgYmFzZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqYW91dDsKLSAgICAgaW50IGlkeDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBiYXNlOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCi0gIC8qIGFkZCBpbXBvcnQgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGlmIGl0IGV4aXN0cyAqLwotICBpZiAoKHNlYyAhPSBOVUxMKQotICAgICAgJiYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwpCi0gICAgICAmJiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBhb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MgPSAoc2VjLT52bWEgLSBiYXNlKSAmIDB4ZmZmZmZmZmY7Ci0gICAgICBhb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF0uU2l6ZSA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnZpcnRfc2l6ZTsKLSAgICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0RBVEE7Ci0gICAgfQotfQotCi11bnNpZ25lZCBpbnQKLV9iZmRfcGVpX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWluOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkcjsKLSAgUEVBT1VUSERSICphb3V0aGRyX291dCA9IChQRUFPVVRIRFIgKilvdXQ7Ci0KLSAgYmZkX3ZtYSBzYSA9IGV4dHJhLT5TZWN0aW9uQWxpZ25tZW50OwotICBiZmRfdm1hIGZhID0gZXh0cmEtPkZpbGVBbGlnbm1lbnQ7Ci0gIGJmZF92bWEgaWIgPSBleHRyYS0+SW1hZ2VCYXNlIDsKLQotICBpZiAoYW91dGhkcl9pbi0+dHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPnRleHRfc3RhcnQgLT0gaWI7Ci0gICAgICBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbi0+ZHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQgLT0gaWI7Ci0gICAgICBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbi0+ZW50cnkpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPmVudHJ5IC09IGliOwotICAgICAgYW91dGhkcl9pbi0+ZW50cnkgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0KLSNkZWZpbmUgRkEoeCkgICgoKHgpICsgZmEgLTEgKSAmICgtIGZhKSkKLSNkZWZpbmUgU0EoeCkgICgoKHgpICsgc2EgLTEgKSAmICgtIHNhKSkKLQotICAvKiBXZSBsaWtlIHRvIGhhdmUgdGhlIHNpemVzIGFsaWduZWQgKi8KLQotICBhb3V0aGRyX2luLT5ic2l6ZSA9IEZBIChhb3V0aGRyX2luLT5ic2l6ZSk7Ci0KLQotICBleHRyYS0+TnVtYmVyT2ZSdmFBbmRTaXplcyA9IElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTOwotCi0gIC8qIGZpcnN0IG51bGwgb3V0IGFsbCBkYXRhIGRpcmVjdG9yeSBlbnRyaWVzIC4uICovCi0gIG1lbXNldCAoZXh0cmEtPkRhdGFEaXJlY3RvcnksIHNpemVvZiAoZXh0cmEtPkRhdGFEaXJlY3RvcnkpLCAwKTsKLQotICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDAsICIuZWRhdGEiLCAwKTsKLQotICAvKiBEb24ndCBjYWxsIGFkZF9kYXRhX2VudHJ5IGZvciAuaWRhdGEkMiBvciAuaWRhdGEkNS4gIEl0J3MgZG9uZSBpbgotICAgICBiZmRfY29mZl9maW5hbF9saW5rIHdoZXJlIGFsbCB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMKLSAgICAgYXZhaWxhYmxlLiAgKi8KLQotICAvKiBIb3dldmVyLCB1bnRpbCBvdGhlciAuaWRhdGEgZml4ZXMgYXJlIG1hZGUgKHBlbmRpbmcgcGF0Y2gpLCB0aGUKLSAgICAgZW50cnkgZm9yIC5pZGF0YSBpcyBuZWVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5LiAgRklYTUUuICAqLwotICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDEsICIuaWRhdGEiICwwKTsKLQotICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDIsICIucnNyYyIgLDApOwotCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMywgIi5wZGF0YSIsIDApOwotCi0gIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIHZpcnR1YWwgc2l6ZSAod2hpY2ggaXMgd2hhdCdzIHNldCBieQotICAgICBhZGRfZGF0YV9lbnRyeSkgZm9yIC5yZWxvYyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHNpemUgcmVjb3JkZWQKLSAgICAgaW4gdGhpcyBzbG90IGJ5IE1TVkM7IGl0IGRvZXNuJ3Qgc2VlbSB0byBjYXVzZSBwcm9ibGVtcyAoc28gZmFyKSwKLSAgICAgYnV0IHNpbmNlIGl0J3MgdGhlIGJlc3Qgd2UndmUgZ290LCB1c2UgaXQuICBJdCBkb2VzIGRvIHRoZSByaWdodAotICAgICB0aGluZyBmb3IgLnBkYXRhLiAgKi8KLSAgaWYgKHBlX2RhdGEgKGFiZmQpLT5oYXNfcmVsb2Nfc2VjdGlvbikKLSAgICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDUsICIucmVsb2MiLCAwKTsKLQotICB7Ci0gICAgYXNlY3Rpb24gKnNlYzsKLSAgICBiZmRfdm1hIGRzaXplPSAwOwotICAgIGJmZF92bWEgaXNpemUgPSBTQShhYmZkLT5zZWN0aW9ucy0+ZmlsZXBvcyk7Ci0gICAgYmZkX3ZtYSB0c2l6ZT0gMDsKLQotICAgIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgICAgewotCWludCByb3VuZGVkID0gRkEoc2VjLT5fcmF3X3NpemUpOwotCi0JaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfREFUQSkKLQkgIGRzaXplICs9IHJvdW5kZWQ7Ci0JaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgIHRzaXplICs9IHJvdW5kZWQ7Ci0JLyogVGhlIGltYWdlIHNpemUgaXMgdGhlIHRvdGFsIFZJUlRVQUwgc2l6ZSAod2hpY2ggaXMgd2hhdCBpcwotCSAgIGluIHRoZSB2aXJ0X3NpemUgZmllbGQpLiAgRmlsZXMgaGF2ZSBiZWVuIHNlZW4gKGZyb20gTVNWQwotCSAgIDUuMCBsaW5rLmV4ZSkgd2hlcmUgdGhlIGZpbGUgc2l6ZSBvZiB0aGUgLmRhdGEgc2VnbWVudCBpcwotCSAgIHF1aXRlIHNtYWxsIGNvbXBhcmVkIHRvIHRoZSB2aXJ0dWFsIHNpemUuICBXaXRob3V0IHRoaXMKLQkgICBmaXgsIHN0cmlwIG11bmdlcyB0aGUgZmlsZS4gICovCi0JaXNpemUgKz0gU0EgKEZBIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT52aXJ0X3NpemUpKTsKLSAgICAgIH0KLQotICAgIGFvdXRoZHJfaW4tPmRzaXplID0gZHNpemU7Ci0gICAgYW91dGhkcl9pbi0+dHNpemUgPSB0c2l6ZTsKLSAgICBleHRyYS0+U2l6ZU9mSW1hZ2UgPSBpc2l6ZTsKLSAgfQotCi0gIGV4dHJhLT5TaXplT2ZIZWFkZXJzID0gYWJmZC0+c2VjdGlvbnMtPmZpbGVwb3M7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT5tYWdpYywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC5tYWdpYyk7Ci0KLSNkZWZpbmUgTElOS0VSX1ZFUlNJT04gMjU2IC8qIFRoYXQgaXMsIDIuNTYgKi8KLQotICAvKiBUaGlzIHBpZWNlIG9mIG1hZ2ljIHNldHMgdGhlICJsaW5rZXIgdmVyc2lvbiIgZmllbGQgdG8KLSAgICAgTElOS0VSX1ZFUlNJT04uICAqLwotICBiZmRfaF9wdXRfMTYgKGFiZmQsCi0JCUxJTktFUl9WRVJTSU9OIC8gMTAwICsgKExJTktFUl9WRVJTSU9OICUgMTAwKSAqIDI1NiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC52c3RhbXApOwotCi0gIFBVVF9BT1VUSERSX1RTSVpFIChhYmZkLCBhb3V0aGRyX2luLT50c2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC50c2l6ZSk7Ci0gIFBVVF9BT1VUSERSX0RTSVpFIChhYmZkLCBhb3V0aGRyX2luLT5kc2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC5kc2l6ZSk7Ci0gIFBVVF9BT1VUSERSX0JTSVpFIChhYmZkLCBhb3V0aGRyX2luLT5ic2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC5ic2l6ZSk7Ci0gIFBVVF9BT1VUSERSX0VOVFJZIChhYmZkLCBhb3V0aGRyX2luLT5lbnRyeSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC5lbnRyeSk7Ci0gIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPnRleHRfc3RhcnQsCi0JCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQudGV4dF9zdGFydCk7Ci0KLSAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC5kYXRhX3N0YXJ0KTsKLQotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkltYWdlQmFzZSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5JbWFnZUJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TZWN0aW9uQWxpZ25tZW50LAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNlY3Rpb25BbGlnbm1lbnQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5GaWxlQWxpZ25tZW50LAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkZpbGVBbGlnbm1lbnQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9ySW1hZ2VWZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk1ham9ySW1hZ2VWZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWlub3JJbWFnZVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JJbWFnZVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NYWpvclN1YnN5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlJlc2VydmVkMSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5SZXNlcnZlZDEpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZJbWFnZSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZJbWFnZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkhlYWRlcnMsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mSGVhZGVycyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkNoZWNrU3VtLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkNoZWNrU3VtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+U3Vic3lzdGVtLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlN1YnN5c3RlbSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPkRsbENoYXJhY3RlcmlzdGljcywKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5EbGxDaGFyYWN0ZXJpc3RpY3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZTdGFja1Jlc2VydmUsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mU3RhY2tDb21taXQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mU3RhY2tDb21taXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZIZWFwUmVzZXJ2ZSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFwUmVzZXJ2ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkhlYXBDb21taXQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mSGVhcENvbW1pdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkxvYWRlckZsYWdzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkxvYWRlckZsYWdzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+TnVtYmVyT2ZSdmFBbmRTaXplcywKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5OdW1iZXJPZlJ2YUFuZFNpemVzKTsKLSAgewotICAgIGludCBpZHg7Ci0gICAgZm9yIChpZHg9MDsgaWR4IDwgMTY7IGlkeCsrKQotICAgICAgewotCWJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkRhdGFEaXJlY3RvcnlbaWR4XS5WaXJ0dWFsQWRkcmVzcywKLQkJICAgICAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF1bMF0pOwotCWJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkRhdGFEaXJlY3RvcnlbaWR4XS5TaXplLAotCQkgICAgICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRhdGFEaXJlY3RvcnlbaWR4XVsxXSk7Ci0gICAgICB9Ci0gIH0KLQotICByZXR1cm4gQU9VVFNaOwotfQotCi11bnNpZ25lZCBpbnQKLV9iZmRfcGVpX29ubHlfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIGludCBpZHg7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopaW47Ci0gIHN0cnVjdCBleHRlcm5hbF9QRUlfZmlsZWhkciAqZmlsZWhkcl9vdXQgPSAoc3RydWN0IGV4dGVybmFsX1BFSV9maWxlaGRyICopb3V0OwotCi0gIGlmIChwZV9kYXRhIChhYmZkKS0+aGFzX3JlbG9jX3NlY3Rpb24pCi0gICAgZmlsZWhkcl9pbi0+Zl9mbGFncyAmPSB+Rl9SRUxGTEc7Ci0KLSAgaWYgKHBlX2RhdGEgKGFiZmQpLT5kbGwpCi0gICAgZmlsZWhkcl9pbi0+Zl9mbGFncyB8PSBGX0RMTDsKLQotICBmaWxlaGRyX2luLT5wZS5lX21hZ2ljICAgID0gRE9TTUFHSUM7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY2JscCAgICAgPSAweDkwOwotICBmaWxlaGRyX2luLT5wZS5lX2NwICAgICAgID0gMHgzOwotICBmaWxlaGRyX2luLT5wZS5lX2NybGMgICAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX2NwYXJoZHIgID0gMHg0OwotICBmaWxlaGRyX2luLT5wZS5lX21pbmFsbG9jID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX21heGFsbG9jID0gMHhmZmZmOwotICBmaWxlaGRyX2luLT5wZS5lX3NzICAgICAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX3NwICAgICAgID0gMHhiODsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jc3VtICAgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9pcCAgICAgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcyAgICAgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9sZmFybGMgICA9IDB4NDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfb3ZubyAgICAgPSAweDA7Ci0KLSAgZm9yIChpZHg9MDsgaWR4IDwgNDsgaWR4KyspCi0gICAgZmlsZWhkcl9pbi0+cGUuZV9yZXNbaWR4XSA9IDB4MDsKLQotICBmaWxlaGRyX2luLT5wZS5lX29lbWlkICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfb2VtaW5mbyA9IDB4MDsKLQotICBmb3IgKGlkeD0wOyBpZHggPCAxMDsgaWR4KyspCi0gICAgZmlsZWhkcl9pbi0+cGUuZV9yZXMyW2lkeF0gPSAweDA7Ci0KLSAgZmlsZWhkcl9pbi0+cGUuZV9sZmFuZXcgPSAweDgwOwotCi0gIC8qIHRoaXMgbmV4dCBjb2xsZWN0aW9uIG9mIGRhdGEgYXJlIG1vc3RseSBqdXN0IGNoYXJhY3RlcnMuICBJdCBhcHBlYXJzCi0gICAgIHRvIGJlIGNvbnN0YW50IHdpdGhpbiB0aGUgaGVhZGVycyBwdXQgb24gTlQgZXhlcyAqLwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVswXSAgPSAweDBlYmExZjBlOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVsxXSAgPSAweGNkMDliNDAwOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVsyXSAgPSAweDRjMDFiODIxOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVszXSAgPSAweDY4NTQyMWNkOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVs0XSAgPSAweDcwMjA3MzY5OwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVs1XSAgPSAweDcyNjc2ZjcyOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVs2XSAgPSAweDYzMjA2ZDYxOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVs3XSAgPSAweDZmNmU2ZTYxOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVs4XSAgPSAweDY1NjIyMDc0OwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVs5XSAgPSAweDZlNzU3MjIwOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVsxMF0gPSAweDIwNmU2OTIwOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVsxMV0gPSAweDIwNTM0ZjQ0OwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVsxMl0gPSAweDY1NjQ2ZjZkOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVsxM10gPSAweDBhMGQwZDJlOwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVsxNF0gPSAweDI0OwotICBmaWxlaGRyX2luLT5wZS5kb3NfbWVzc2FnZVsxNV0gPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLm50X3NpZ25hdHVyZSA9IE5UX1NJR05BVFVSRTsKLQotCi0KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbWFnaWMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9tYWdpYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX25zY25zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnNjbnMpOwotCi0gIGJmZF9oX3B1dF8zMihhYmZkLCB0aW1lICgwKSwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3RpbWRhdCk7Ci0gIFBVVF9GSUxFSERSX1NZTVBUUiAoYWJmZCwgKGJmZF92bWEpIGZpbGVoZHJfaW4tPmZfc3ltcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfc3ltcHRyKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfbnN5bXMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc3ltcyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX29wdGhkciwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX29wdGhkcik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX2ZsYWdzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfZmxhZ3MpOwotCi0gIC8qIHB1dCBpbiBleHRyYSBkb3MgaGVhZGVyIHN0dWZmLiAgVGhpcyBkYXRhIHJlbWFpbnMgZXNzZW50aWFsbHkKLSAgICAgY29uc3RhbnQsIGl0IGp1c3QgaGFzIHRvIGJlIHRhY2tlZCBvbiB0byB0aGUgYmVnaW5uaW5nIG9mIGFsbCBleGVzCi0gICAgIGZvciBOVCAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9tYWdpYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX21hZ2ljKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfY2JscCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NibHApOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NwKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfY3JsYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NybGMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcGFyaGRyLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3Bhcmhkcik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21pbmFsbG9jLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWluYWxsb2MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9tYXhhbGxvYywKLQkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX21heGFsbG9jKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfc3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9zcyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX3NwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfc3ApOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jc3VtLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3N1bSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2lwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfaXApOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NzKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbGZhcmxjLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbGZhcmxjKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfb3ZubywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX292bm8pOwotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCA0OyBpZHgrKykKLSAgICAgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX3Jlc1tpZHhdLAotCQkgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfcmVzW2lkeF0pOwotICB9Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX29lbWlkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb2VtaWQpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vZW1pbmZvLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb2VtaW5mbyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDEwOyBpZHgrKykKLSAgICAgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX3JlczJbaWR4XSwKLQkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3JlczJbaWR4XSk7Ci0gIH0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbGZhbmV3LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbGZhbmV3KTsKLQotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbaWR4XSwKLQkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5kb3NfbWVzc2FnZVtpZHhdKTsKLSAgfQotCi0gIC8qIGFsc28gcHV0IGluIHRoZSBOVCBzaWduYXR1cmUgKi8KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLm50X3NpZ25hdHVyZSwKLQkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5udF9zaWduYXR1cmUpOwotCi0KLQotCi0gIHJldHVybiBGSUxIU1o7Ci19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZV9vbmx5X3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKWluOwotICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKW91dDsKLQotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9tYWdpYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX21hZ2ljKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbnNjbnMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc2Nucyk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX3RpbWRhdCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3RpbWRhdCk7Ci0gIFBVVF9GSUxFSERSX1NZTVBUUiAoYWJmZCwgKGJmZF92bWEpIGZpbGVoZHJfaW4tPmZfc3ltcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfc3ltcHRyKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfbnN5bXMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc3ltcyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX29wdGhkciwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX29wdGhkcik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX2ZsYWdzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfZmxhZ3MpOwotCi0gIHJldHVybiBGSUxIU1o7Ci19Ci0KLXVuc2lnbmVkIGludAotX2JmZF9wZWlfc3dhcF9zY25oZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopaW47Ci0gIFNDTkhEUiAqc2NuaGRyX2V4dCA9IChTQ05IRFIgKilvdXQ7Ci0gIHVuc2lnbmVkIGludCByZXQgPSBTQ05IU1o7Ci0gIGJmZF92bWEgcHM7Ci0gIGJmZF92bWEgc3M7Ci0KLSAgbWVtY3B5KHNjbmhkcl9leHQtPnNfbmFtZSwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2Yoc2NuaGRyX2ludC0+c19uYW1lKSk7Ci0KLSAgUFVUX1NDTkhEUl9WQUREUiAoYWJmZCwKLQkJICAgICgoc2NuaGRyX2ludC0+c192YWRkciAKLQkJICAgICAgLSBwZV9kYXRhKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKQotCQkgICAgICYgMHhmZmZmZmZmZiksCi0JCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0KLSAgLyogTlQgd2FudHMgdGhlIHNpemUgZGF0YSB0byBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0Ci0gICAgIE5UX0ZJTEVfQUxJR05NRU5ULCBidXQgemVybyBpZiBpdCBoYXMgbm8gY29udGVudCAoYXMgaW4gLmJzcywKLSAgICAgc29tZXRpbWVzKS4gICovCi0KLSAgaWYgKChzY25oZHJfaW50LT5zX2ZsYWdzICYgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEpICE9IDApCi0gICAgewotICAgICAgcHMgPSBzY25oZHJfaW50LT5zX3NpemU7Ci0gICAgICBzcyA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHMgPSBzY25oZHJfaW50LT5zX3BhZGRyOwotICAgICAgc3MgPSBzY25oZHJfaW50LT5zX3NpemU7Ci0gICAgfQotCi0gIFBVVF9TQ05IRFJfU0laRSAoYWJmZCwgc3MsCi0JCSAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0KLSAgLyogc19wYWRkciBpbiBQRSBpcyByZWFsbHkgdGhlIHZpcnR1YWwgc2l6ZS4gICovCi0gIFBVVF9TQ05IRFJfUEFERFIgKGFiZmQsIHBzLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7Ci0KLSAgUFVUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfc2NucHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7Ci0gIFBVVF9TQ05IRFJfUkVMUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX3JlbHB0ciwKLQkJICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19yZWxwdHIpOwotICBQVVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwKLQkJICAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbG5ub3B0cik7Ci0KLSAgLyogRXh0cmEgZmxhZ3MgbXVzdCBiZSBzZXQgd2hlbiBkZWFsaW5nIHdpdGggTlQuICBBbGwgc2VjdGlvbnMgc2hvdWxkIGFsc28KLSAgICAgaGF2ZSB0aGUgSU1BR0VfU0NOX01FTV9SRUFEICgweDQwMDAwMDAwKSBmbGFnIHNldC4gIEluIGFkZGl0aW9uLCB0aGUKLSAgICAgLnRleHQgc2VjdGlvbiBtdXN0IGhhdmUgSU1BR0VfU0NOX01FTV9FWEVDVVRFICgweDIwMDAwMDAwKSBhbmQgdGhlIGRhdGEKLSAgICAgc2VjdGlvbnMgKC5pZGF0YSwgLmRhdGEsIC5ic3MsIC5DUlQpIG11c3QgaGF2ZSBJTUFHRV9TQ05fTUVNX1dSSVRFIHNldAotICAgICAodGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgLmlkYXRhIHNlY3Rpb24gc2luY2UKLSAgICAgdGhlIGFkZHJlc3NlcyBmb3Igcm91dGluZXMgZnJvbSAuZGxscyBtdXN0IGJlIG92ZXJ3cml0dGVuKS4gIElmIC5yZWxvYwotICAgICBzZWN0aW9uIGRhdGEgaXMgZXZlciBnZW5lcmF0ZWQsIHdlIG11c3QgYWRkIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUKLSAgICAgKDB4MDIwMDAwMDApLiAgQWxzbywgdGhlIHJlc291cmNlIGRhdGEgc2hvdWxkIGFsc28gYmUgcmVhZCBhbmQKLSAgICAgd3JpdGFibGUuICAqLwotCi0gIC8qIEZJWE1FOiBhbGlnbm1lbnQgaXMgYWxzbyBlbmNvZGVkIGluIHRoaXMgZmllbGQsIGF0IGxlYXN0IG9uIHBwYyAoa3JrKSAqLwotICAvKiBGSVhNRTogZXZlbiB3b3JzZSwgSSBkb24ndCBzZWUgaG93IHRvIGdldCB0aGUgb3JpZ2luYWwgYWxpZ25tZW50IGZpZWxkKi8KLSAgLyogICAgICAgIGJhY2suLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgewotICAgIGludCBmbGFncyA9IHNjbmhkcl9pbnQtPnNfZmxhZ3M7Ci0gICAgYmZkX2hfcHV0XzMyKGFiZmQsIGZsYWdzLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19mbGFncyk7Ci0gIH0KLQotICBpZiAoY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvCi0gICAgICAmJiAhIGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mby0+c2hhcmVkCi0gICAgICAmJiBzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBCeSBpbmZlcmVuY2UgZnJvbSBsb29raW5nIGF0IE1TIG91dHB1dCwgdGhlIDMyIGJpdCBmaWVsZAotCSB3aGljaCBpcyB0aGUgY29tYmludGlvbiBvZiB0aGUgbnVtYmVyX29mX3JlbG9jcyBhbmQKLQkgbnVtYmVyX29mX2xpbmVub3MgaXMgdXNlZCBmb3IgdGhlIGxpbmUgbnVtYmVyIGNvdW50IGluCi0JIGV4ZWN1dGFibGVzLiAgQSAxNi1iaXQgZmllbGQgd29uJ3QgZG8gZm9yIGNjMS4gIFRoZSBNUwotCSBkb2N1bWVudCBzYXlzIHRoYXQgdGhlIG51bWJlciBvZiByZWxvY3MgaXMgemVybyBmb3IKLQkgZXhlY3V0YWJsZXMsIGJ1dCB0aGUgMTctdGggYml0IGhhcyBiZWVuIG9ic2VydmVkIHRvIGJlIHRoZXJlLgotCSBPdmVyZmxvdyBpcyBub3QgYW4gaXNzdWU6IGEgNEctbGluZSBwcm9ncmFtIHdpbGwgb3ZlcmZsb3cgYQotCSBidW5jaCBvZiBvdGhlciBmaWVsZHMgbG9uZyBiZWZvcmUgdGhpcyEgICovCi0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNjbmhkcl9pbnQtPnNfbmxubm8gJiAweGZmZmYsCi0JCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNjbmhkcl9pbnQtPnNfbmxubm8gPj4gMTYsCi0JCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzY25oZHJfaW50LT5zX25sbm5vIDw9IDB4ZmZmZikKLQliZmRfaF9wdXRfMTYgKGFiZmQsIHNjbmhkcl9pbnQtPnNfbmxubm8sCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBsaW5lIG51bWJlciBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJIHNjbmhkcl9pbnQtPnNfbmxubm8pOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgMHhmZmZmLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0JICByZXQgPSAwOwotCX0KLSAgICAgIGlmIChzY25oZHJfaW50LT5zX25yZWxvYyA8PSAweGZmZmYpCi0JYmZkX2hfcHV0XzE2IChhYmZkLCBzY25oZHJfaW50LT5zX25yZWxvYywKLQkJICAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJIHNjbmhkcl9pbnQtPnNfbnJlbG9jKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICBiZmRfaF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLQkgIHJldCA9IDA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNoYXIgKiBkaXJfbmFtZXNbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdID0KLXsKLSAgTl8gKCJFeHBvcnQgRGlyZWN0b3J5IFsuZWRhdGEgKG9yIHdoZXJlIGV2ZXIgd2UgZm91bmQgaXQpXSIpLAotICBOXyAoIkltcG9ydCBEaXJlY3RvcnkgW3BhcnRzIG9mIC5pZGF0YV0iKSwKLSAgTl8gKCJSZXNvdXJjZSBEaXJlY3RvcnkgWy5yc3JjXSIpLAotICBOXyAoIkV4Y2VwdGlvbiBEaXJlY3RvcnkgWy5wZGF0YV0iKSwKLSAgTl8gKCJTZWN1cml0eSBEaXJlY3RvcnkiKSwKLSAgTl8gKCJCYXNlIFJlbG9jYXRpb24gRGlyZWN0b3J5IFsucmVsb2NdIiksCi0gIE5fICgiRGVidWcgRGlyZWN0b3J5IiksCi0gIE5fICgiRGVzY3JpcHRpb24gRGlyZWN0b3J5IiksCi0gIE5fICgiU3BlY2lhbCBEaXJlY3RvcnkiKSwKLSAgTl8gKCJUaHJlYWQgU3RvcmFnZSBEaXJlY3RvcnkgWy50bHNdIiksCi0gIE5fICgiTG9hZCBDb25maWd1cmF0aW9uIERpcmVjdG9yeSIpLAotICBOXyAoIkJvdW5kIEltcG9ydCBEaXJlY3RvcnkiKSwKLSAgTl8gKCJJbXBvcnQgQWRkcmVzcyBUYWJsZSBEaXJlY3RvcnkiKSwKLSAgTl8gKCJSZXNlcnZlZCIpLAotICBOXyAoIlJlc2VydmVkIiksCi0gIE5fICgiUmVzZXJ2ZWQiKQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotLyogVGhlIGNvZGUgZm9yIHRoZSBQUEMgcmVhbGx5IGZhbGxzIGluIHRoZSAiYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCIKLSAgIGNhdGVnb3J5LiAgSG93ZXZlciwgaXQncyBub3QgY2xlYXIgdGhhdCBhbnlvbmUgd2lsbCBldmVyIGNhcmUsIHNvCi0gICB3ZSdyZSBpZ25vcmluZyB0aGUgaXNzdWUgZm9yIG5vdzsgaWYvd2hlbiBQUEMgbWF0dGVycywgc29tZSBvZiB0aGlzCi0gICBtYXkgbmVlZCB0byBnbyBpbnRvIHBlaWNvZGUuaCwgb3IgYXJndW1lbnRzIHBhc3NlZCB0byBlbmFibGUgdGhlCi0gICBQUEMtIHNwZWNpZmljIGNvZGUuICAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X2lkYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmlkYXRhIik7Ci0gIHVuc2lnbmVkIGxvbmcgYWRqOwotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICBhc2VjdGlvbiAqcmVsX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWxkYXRhIik7Ci0jZW5kaWYKLQotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplOwotICBiZmRfc2l6ZV90eXBlIGRhdGFvZmY7Ci0gIGJmZF9zaXplX3R5cGUgc2Vjc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBpbnQgb25hbGluZSA9IDIwOwotCi0gIHBlX2RhdGFfdHlwZSAqcGUgPSBwZV9kYXRhIChhYmZkKTsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmV4dHJhID0gJnBlLT5wZV9vcHRoZHI7Ci0KLSAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICAgICAgZGF0YW9mZiA9IDA7Ci0KLSAgICAgIGlmIChkYXRhc2l6ZSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmcHJpbnRmIChmaWxlLCBfKCJcblRoZSBpbXBvcnQgdGFibGUgaXMgdGhlIC5pZGF0YSBzZWN0aW9uXG4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogaWRhdGEgYnVyaWVkIGluIHNvbWUgb3RoZXIgc2VjdGlvbjogZS5nLiBLRVJORUwzMi5ETEwuICAqLwotICAgICAgYmZkX3ZtYSBhZGRyLCBzaXplOwotCi0gICAgICBhZGRyID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uVmlydHVhbEFkZHJlc3M7Ci0gICAgICBzaXplID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZTsKLQotICAgICAgaWYgKGFkZHIgPT0gMCB8fCBzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCXsKLQkgICBpZiAoYWRkciA+PSBzZWN0aW9uLT52bWEKLQkgICAgICAgJiYgYWRkciA8IHNlY3Rpb24tPnZtYSArIGJmZF9zZWN0aW9uX3NpemUoYWJmZCxzZWN0aW9uKSkKLQkgICAgICAgICBicmVhazsKLQl9Ci0gICAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgICBmcHJpbnRmIChmaWxlLAotCQkgICAgXygiXG5UaGVyZSBpcyBhbiBpbXBvcnQgdGFibGUsIGJ1dCB0aGUgc2VjdGlvbiBjb250YWluaW5nIGl0IGNvdWxkIG5vdCBiZSBmb3VuZFxuIikpOwotCSAgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgZnByaW50ZiAoZmlsZSwgXygiXG5UaGVyZSBpcyBhbiBpbXBvcnQgdGFibGUgaW4gJXMgYXQgMHglbHhcbiIpLAotCSAgICAgICBzZWN0aW9uLT5uYW1lLCAodW5zaWduZWQgbG9uZylhZGRyKTsKLQotICAgICAgZGF0YW9mZiA9IGFkZHIgLSBzZWN0aW9uLT52bWE7Ci0gICAgICBkYXRhc2l6ZSA9IHNpemU7Ci0gICAgfQotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICBpZiAocmVsX3NlY3Rpb24gIT0gMCAmJiBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbikgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgdG9jIGFkZHJlc3MgY2FuIGJlIGZvdW5kIGJ5IHRha2luZyB0aGUgc3RhcnRpbmcgYWRkcmVzcywKLQkgd2hpY2ggb24gdGhlIFBQQyBsb2NhdGVzIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gVGhlCi0JIGRlc2NyaXB0b3IgY29uc2lzdHMgb2YgdGhlIGZ1bmN0aW9uIGNvZGUgc3RhcnRpbmcgYWRkcmVzcwotCSBmb2xsb3dlZCBieSB0aGUgYWRkcmVzcyBvZiB0aGUgdG9jLiBUaGUgc3RhcnRpbmcgYWRkcmVzcyB3ZQotCSBnZXQgZnJvbSB0aGUgYmZkLCBhbmQgdGhlIGRlc2NyaXB0b3IgaXMgc3VwcG9zZWQgdG8gYmUgaW4gdGhlCi0JIC5yZWxkYXRhIHNlY3Rpb24uICAqLwotCi0gICAgICBiZmRfdm1hIGxvYWRhYmxlX3RvY19hZGRyZXNzOwotICAgICAgYmZkX3ZtYSB0b2NfYWRkcmVzczsKLSAgICAgIGJmZF92bWEgc3RhcnRfYWRkcmVzczsKLSAgICAgIGJmZF9ieXRlICpkYXRhID0gMDsKLSAgICAgIGludCBvZmZzZXQ7Ci0gICAgICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsCi0JCQkJCQkJCSByZWxfc2VjdGlvbikpOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCAmJiBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pOwotICAKLSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCQlyZWxfc2VjdGlvbiwKLQkJCQkoUFRSKSBkYXRhLCAwLAotCQkJCWJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbF9zZWN0aW9uKSk7Ci0KLSAgICAgIG9mZnNldCA9IGFiZmQtPnN0YXJ0X2FkZHJlc3MgLSByZWxfc2VjdGlvbi0+dm1hOwotCi0gICAgICBzdGFydF9hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK29mZnNldCk7Ci0gICAgICBsb2FkYWJsZV90b2NfYWRkcmVzcyA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStvZmZzZXQrNCk7Ci0gICAgICB0b2NfYWRkcmVzcyA9IGxvYWRhYmxlX3RvY19hZGRyZXNzIC0gMzI3Njg7Ci0KLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICBfKCJcbkZ1bmN0aW9uIGRlc2NyaXB0b3IgbG9jYXRlZCBhdCB0aGUgc3RhcnQgYWRkcmVzczogJTA0bHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGFiZmQtPnN0YXJ0X2FkZHJlc3MpKTsKLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgIF8oIlx0Y29kZS1iYXNlICUwOGx4IHRvYyAobG9hZGFibGUvYWN0dWFsKSAlMDhseC8lMDhseFxuIiksCi0JICAgICAgIHN0YXJ0X2FkZHJlc3MsIGxvYWRhYmxlX3RvY19hZGRyZXNzLCB0b2NfYWRkcmVzcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgIF8oIlxuTm8gcmVsZGF0YSBzZWN0aW9uISBGdW5jdGlvbiBkZXNjcmlwdG9yIG5vdCBkZWNvZGVkLlxuIikpOwotICAgIH0KLSNlbmRpZgotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuVGhlIEltcG9ydCBUYWJsZXMgKGludGVycHJldGVkIC5pZGF0YSBzZWN0aW9uIGNvbnRlbnRzKVxuIikpOwotICBmcHJpbnRmKGZpbGUsCi0JICBfKCIgdm1hOiAgICAgICAgICAgIEhpbnQgICAgVGltZSAgICAgIEZvcndhcmQgIERMTCAgICAgICBGaXJzdFxuIikpOwotICBmcHJpbnRmKGZpbGUsCi0JICBfKCIgICAgICAgICAgICAgICAgIFRhYmxlICAgU3RhbXAgICAgIENoYWluICAgIE5hbWUgICAgICBUaHVua1xuIikpOwotCi0gIHNlY3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWNzaXplKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCAmJiBzZWNzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgKFBUUikgZGF0YSwgMCwgc2Vjc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFkaiA9IC0gc2VjdGlvbi0+dm1hOwotCi0gIGZvciAoaSA9IDA7IGkgPCBkYXRhc2l6ZTsgaSArPSBvbmFsaW5lKQotICAgIHsKLSAgICAgIGJmZF92bWEgaGludF9hZGRyOwotICAgICAgYmZkX3ZtYSB0aW1lX3N0YW1wOwotICAgICAgYmZkX3ZtYSBmb3J3YXJkX2NoYWluOwotICAgICAgYmZkX3ZtYSBkbGxfbmFtZTsKLSAgICAgIGJmZF92bWEgZmlyc3RfdGh1bms7Ci0gICAgICBpbnQgaWR4ID0gMDsKLSAgICAgIGJmZF9zaXplX3R5cGUgajsKLSAgICAgIGNoYXIgKmRsbDsKLQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgIiAlMDhseFx0IiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSArIGRhdGFvZmYpKTsKLSAgICAgIAotICAgICAgaWYgKGkgKyAyMCA+IGRhdGFzaXplKQotCXsKLQkgIC8qIGNoZWNrIHN0dWZmICovCi0JICA7Ci0JfQotCi0gICAgICBoaW50X2FkZHIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaSArIGRhdGFvZmYpOwotICAgICAgdGltZV9zdGFtcCA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpICsgNCArIGRhdGFvZmYpOwotICAgICAgZm9yd2FyZF9jaGFpbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpICsgOCArIGRhdGFvZmYpOwotICAgICAgZGxsX25hbWUgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaSArIDEyICsgZGF0YW9mZik7Ci0gICAgICBmaXJzdF90aHVuayA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpICsgMTYgKyBkYXRhb2ZmKTsKLQotICAgICAgZnByaW50ZiAoZmlsZSwgIiUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLAotCSAgICAgICBoaW50X2FkZHIsCi0JICAgICAgIHRpbWVfc3RhbXAsCi0JICAgICAgIGZvcndhcmRfY2hhaW4sCi0JICAgICAgIGRsbF9uYW1lLAotCSAgICAgICBmaXJzdF90aHVuayk7Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgPT0gMCAmJiBmaXJzdF90aHVuayA9PSAwKQotCWJyZWFrOwotCi0gICAgICBkbGwgPSAoY2hhciAqKSBkYXRhICsgZGxsX25hbWUgLSBzZWN0aW9uLT52bWEgKyBkYXRhb2ZmOwotICAgICAgZnByaW50ZihmaWxlLCBfKCJcblx0RExMIE5hbWU6ICVzXG4iKSwgZGxsKTsKLQotICAgICAgaWYgKGhpbnRfYWRkciAhPSAwKQotCXsKLQkgIGZwcmludGYgKGZpbGUsIF8oIlx0dm1hOiAgSGludC9PcmQgTWVtYmVyLU5hbWVcbiIpKTsKLQotCSAgaWR4ID0gaGludF9hZGRyICsgYWRqOwotCi0JICBmb3IgKGogPSAwOyBqIDwgZGF0YXNpemU7IGogKz0gNCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGlkeCArIGopOwotCi0JICAgICAgaWYgKG1lbWJlciA9PSAwKQotCQlicmVhazsKLQkgICAgICBpZiAobWVtYmVyICYgMHg4MDAwMDAwMCkKLQkJZnByaW50ZiAoZmlsZSwgIlx0JTA0bHhcdCAlNGx1IiwgbWVtYmVyLAotCQkJIG1lbWJlciAmIDB4N2ZmZmZmZmYpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGludCBvcmRpbmFsOwotCQkgIGNoYXIgKm1lbWJlcl9uYW1lOwotCi0JCSAgb3JkaW5hbCA9IGJmZF9nZXRfMTYgKGFiZmQsIGRhdGEgKyBtZW1iZXIgKyBhZGopOwotCQkgIG1lbWJlcl9uYW1lID0gKGNoYXIgKikgZGF0YSArIG1lbWJlciArIGFkaiArIDI7Ci0JCSAgZnByaW50ZiAoZmlsZSwgIlx0JTA0bHhcdCAlNGQgICVzIiwKLQkJCSAgIG1lbWJlciwgb3JkaW5hbCwgbWVtYmVyX25hbWUpOwotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGUgdGltZSBzdGFtcCBpcyBub3QgemVybywgdGhlIGltcG9ydCBhZGRyZXNzCi0gICAgICAgICAgICAgICAgIHRhYmxlIGhvbGRzIGFjdHVhbCBhZGRyZXNzZXMuICAqLwotCSAgICAgIGlmICh0aW1lX3N0YW1wICE9IDAKLQkJICAmJiBmaXJzdF90aHVuayAhPSAwCi0JCSAgJiYgZmlyc3RfdGh1bmsgIT0gaGludF9hZGRyKQotCQlmcHJpbnRmIChmaWxlLCAiXHQlMDRseCIsCi0JCQkgYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGZpcnN0X3RodW5rICsgYWRqICsgaikpOwotCi0JICAgICAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgIT0gZmlyc3RfdGh1bmsgJiYgdGltZV9zdGFtcCA9PSAwKQotCXsKLQkgIGludCBkaWZmZXIgPSAwOwotCSAgaW50IGlkeDI7Ci0KLQkgIGlkeDIgPSBmaXJzdF90aHVuayArIGFkajsKLQotCSAgZm9yIChqID0gMDsgaiA8IGRhdGFzaXplOyBqICs9IDQpCi0JICAgIHsKLQkgICAgICBpbnQgb3JkaW5hbDsKLQkgICAgICBjaGFyICptZW1iZXJfbmFtZTsKLQkgICAgICBiZmRfdm1hIGhpbnRfbWVtYmVyID0gMDsKLQkgICAgICBiZmRfdm1hIGlhdF9tZW1iZXI7Ci0KLQkgICAgICBpZiAoaGludF9hZGRyICE9IDApCi0JCWhpbnRfbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGlkeCArIGopOwotCSAgICAgIGlhdF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaWR4MiArIGopOwotCi0JICAgICAgaWYgKGhpbnRfYWRkciA9PSAwICYmIGlhdF9tZW1iZXIgPT0gMCkKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoaGludF9hZGRyID09IDAgfHwgaGludF9tZW1iZXIgIT0gaWF0X21lbWJlcikKLQkJewotCQkgIGlmIChkaWZmZXIgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZmlsZSwKLQkJCSAgICAgICBfKCJcdFRoZSBJbXBvcnQgQWRkcmVzcyBUYWJsZSAoZGlmZmVyZW5jZSBmb3VuZClcbiIpKTsKLQkJICAgICAgZnByaW50ZihmaWxlLCBfKCJcdHZtYTogIEhpbnQvT3JkIE1lbWJlci1OYW1lXG4iKSk7Ci0JCSAgICAgIGRpZmZlciA9IDE7Ci0JCSAgICB9Ci0JCSAgaWYgKGlhdF9tZW1iZXIgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZihmaWxlLAotCQkJICAgICAgXygiXHQ+Pj4gUmFuIG91dCBvZiBJQVQgbWVtYmVycyFcbiIpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG9yZGluYWwgPSBiZmRfZ2V0XzE2KGFiZmQsCi0JCQkJCSAgIGRhdGEgKyBpYXRfbWVtYmVyICsgYWRqKTsKLQkJICAgICAgbWVtYmVyX25hbWUgPSAoY2hhciAqKSBkYXRhICsgaWF0X21lbWJlciArIGFkaiArIDI7Ci0JCSAgICAgIGZwcmludGYoZmlsZSwgIlx0JTA0bHhcdCAlNGQgICVzXG4iLAotCQkJICAgICAgaWF0X21lbWJlciwgb3JkaW5hbCwgbWVtYmVyX25hbWUpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoaGludF9hZGRyICE9IDAgJiYgaGludF9tZW1iZXIgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChkaWZmZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGZwcmludGYoZmlsZSwKLQkJICAgICAgXygiXHRUaGUgSW1wb3J0IEFkZHJlc3MgVGFibGUgaXMgaWRlbnRpY2FsXG4iKSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZwcmludGYoZmlsZSwgIlxuIik7Ci0KLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9lZGF0YSAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGJmZF9ieXRlICpkYXRhID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5lZGF0YSIpOwotCi0gIGJmZF9zaXplX3R5cGUgZGF0YXNpemU7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YW9mZjsKLSAgYmZkX3NpemVfdHlwZSBpOwotCi0gIGludCBhZGo7Ci0gIHN0cnVjdCBFRFRfdHlwZQotICAgIHsKLSAgICAgIGxvbmcgZXhwb3J0X2ZsYWdzOyAgICAgICAgICAgICAvKiByZXNlcnZlZCAtIHNob3VsZCBiZSB6ZXJvICovCi0gICAgICBsb25nIHRpbWVfc3RhbXA7Ci0gICAgICBzaG9ydCBtYWpvcl92ZXI7Ci0gICAgICBzaG9ydCBtaW5vcl92ZXI7Ci0gICAgICBiZmRfdm1hIG5hbWU7ICAgICAgICAgICAgICAgICAgLyogcnZhIC0gcmVsYXRpdmUgdG8gaW1hZ2UgYmFzZSAqLwotICAgICAgbG9uZyBiYXNlOyAgICAgICAgICAgICAgICAgICAgIC8qIG9yZGluYWwgYmFzZSAqLwotICAgICAgdW5zaWduZWQgbG9uZyBudW1fZnVuY3Rpb25zOyAgIC8qIE51bWJlciBpbiB0aGUgZXhwb3J0IGFkZHJlc3MgdGFibGUgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgbnVtX25hbWVzOyAgICAgICAvKiBOdW1iZXIgaW4gdGhlIG5hbWUgcG9pbnRlciB0YWJsZSAqLwotICAgICAgYmZkX3ZtYSBlYXRfYWRkcjsgICAgLyogcnZhIHRvIHRoZSBleHBvcnQgYWRkcmVzcyB0YWJsZSAqLwotICAgICAgYmZkX3ZtYSBucHRfYWRkcjsgICAgICAgIC8qIHJ2YSB0byB0aGUgRXhwb3J0IE5hbWUgUG9pbnRlciBUYWJsZSAqLwotICAgICAgYmZkX3ZtYSBvdF9hZGRyOyAvKiBydmEgdG8gdGhlIE9yZGluYWwgVGFibGUgKi8KLSAgICB9IGVkdDsKLQotICBwZV9kYXRhX3R5cGUgKnBlID0gcGVfZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICpleHRyYSA9ICZwZS0+cGVfb3B0aGRyOwotCi0gIGlmIChzZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgIGRhdGFvZmYgPSAwOwotICAgICAgZnByaW50ZiAoZmlsZSwgXygiXG5UaGUgZXhwb3J0IHRhYmxlIGlzIHRoZSAuZWRhdGEgc2VjdGlvblxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGVkYXRhIGlzIGJ1cmllZCBpbiBzb21lIG90aGVyIHNlY3Rpb246IGUuZy4gTlRETEwuRExMLiAgKi8KLSAgICAgIGJmZF92bWEgYWRkciwgc2l6ZTsKLQotICAgICAgYWRkciA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzBdLlZpcnR1YWxBZGRyZXNzOwotICAgICAgc2l6ZSA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzBdLlNpemU7Ci0KLSAgICAgIGlmIChhZGRyID09IDAgfHwgc2l6ZSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICAgaWYgKGFkZHIgPj0gc2VjdGlvbi0+dm1hCi0JICAgICAgICYmIGFkZHIgPCBzZWN0aW9uLT52bWEgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSkKLQkgICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JewotCSAgIGZwcmludGYgKGZpbGUsCi0JCSAgICBfKCJcblRoZXJlIGlzIGFuIGV4cG9ydCB0YWJsZSwgYnV0IHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgaXQgY291bGQgbm90IGJlIGZvdW5kXG4iKSk7Ci0JICAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmaWxlLCBfKCJcblRoZXJlIGlzIGFuIGV4cG9ydCB0YWJsZSBpbiAlcyBhdCAweCVseFxuIiksCi0JICAgICAgIHNlY3Rpb24tPm5hbWUsICh1bnNpZ25lZCBsb25nKSBhZGRyKTsKLQotICAgICAgZGF0YXNpemUgPSBzaXplOwotICAgICAgZGF0YW9mZiA9IGFkZHIgLSBzZWN0aW9uLT52bWE7Ci0gICAgfQotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoZGF0YXNpemUpOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIGRhdGFzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgKFBUUikgZGF0YSwgZGF0YW9mZiwKLQkJCQkgIGRhdGFzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR28gZ2V0IEV4cG9ydCBEaXJlY3RvcnkgVGFibGUgKi8KLSAgZWR0LmV4cG9ydF9mbGFncyAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzApOwotICBlZHQudGltZV9zdGFtcCAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErNCk7Ci0gIGVkdC5tYWpvcl92ZXIgICAgICA9IGJmZF9nZXRfMTYoYWJmZCwgZGF0YSs4KTsKLSAgZWR0Lm1pbm9yX3ZlciAgICAgID0gYmZkX2dldF8xNihhYmZkLCBkYXRhKzEwKTsKLSAgZWR0Lm5hbWUgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzEyKTsKLSAgZWR0LmJhc2UgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzE2KTsKLSAgZWR0Lm51bV9mdW5jdGlvbnMgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzIwKTsKLSAgZWR0Lm51bV9uYW1lcyAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzI0KTsKLSAgZWR0LmVhdF9hZGRyICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzI4KTsKLSAgZWR0Lm5wdF9hZGRyICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzMyKTsKLSAgZWR0Lm90X2FkZHIgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzM2KTsKLQotICBhZGogPSAtIChzZWN0aW9uLT52bWEgKyBkYXRhb2ZmKTsKLQotICAvKiBEdW1wIHRoZSBFRFQgZmlyc3QgZmlyc3QgKi8KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5UaGUgRXhwb3J0IFRhYmxlcyAoaW50ZXJwcmV0ZWQgLmVkYXRhIHNlY3Rpb24gY29udGVudHMpXG5cbiIpKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJFeHBvcnQgRmxhZ3MgXHRcdFx0JWx4XG4iKSwgKHVuc2lnbmVkIGxvbmcpIGVkdC5leHBvcnRfZmxhZ3MpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlRpbWUvRGF0ZSBzdGFtcCBcdFx0JWx4XG4iKSwgKHVuc2lnbmVkIGxvbmcpIGVkdC50aW1lX3N0YW1wKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJNYWpvci9NaW5vciBcdFx0XHQlZC8lZFxuIiksIGVkdC5tYWpvcl92ZXIsIGVkdC5taW5vcl92ZXIpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiTmFtZSBcdFx0XHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwKLQkgICAiICVzXG4iLCBkYXRhICsgZWR0Lm5hbWUgKyBhZGopOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIk9yZGluYWwgQmFzZSBcdFx0XHQlbGRcbiIpLCBlZHQuYmFzZSk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiTnVtYmVyIGluOlxuIikpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlx0RXhwb3J0IEFkZHJlc3MgVGFibGUgXHRcdCVseFxuIiksCi0JICBlZHQubnVtX2Z1bmN0aW9ucyk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXHRbTmFtZSBQb2ludGVyL09yZGluYWxdIFRhYmxlXHQlbHVcbiIpLCBlZHQubnVtX25hbWVzKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJUYWJsZSBBZGRyZXNzZXNcbiIpKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIlx0RXhwb3J0IEFkZHJlc3MgVGFibGUgXHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5lYXRfYWRkcik7Ci0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICBfKCJcdE5hbWUgUG9pbnRlciBUYWJsZSBcdFx0IikpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgZWR0Lm5wdF9hZGRyKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCJcdE9yZGluYWwgVGFibGUgXHRcdFx0IikpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgZWR0Lm90X2FkZHIpOwotICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICAKLSAgLyogVGhlIG5leHQgdGFibGUgdG8gZmluZCBpcyB0aGUgRXhwb3J0IEFkZHJlc3MgVGFibGUuIEl0J3MgYmFzaWNhbGx5Ci0gICAgIGEgbGlzdCBvZiBwb2ludGVycyB0aGF0IGVpdGhlciBsb2NhdGUgYSBmdW5jdGlvbiBpbiB0aGlzIGRsbCwgb3IKLSAgICAgZm9yd2FyZCB0aGUgY2FsbCB0byBhbm90aGVyIGRsbC4gU29tZXRoaW5nIGxpa2U6Ci0gICAgICB0eXBlZGVmIHVuaW9uCi0gICAgICB7Ci0gICAgICAgIGxvbmcgZXhwb3J0X3J2YTsKLSAgICAgICAgbG9uZyBmb3J3YXJkZXJfcnZhOwotICAgICAgfSBleHBvcnRfYWRkcmVzc190YWJsZV9lbnRyeTsKLSAgKi8KLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcbkV4cG9ydCBBZGRyZXNzIFRhYmxlIC0tIE9yZGluYWwgQmFzZSAlbGRcbiIpLAotCSAgZWR0LmJhc2UpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBlZHQubnVtX2Z1bmN0aW9uczsgKytpKQotICAgIHsKLSAgICAgIGJmZF92bWEgZWF0X21lbWJlciA9IGJmZF9nZXRfMzIgKGFiZmQsCi0JCQkJICAgICAgIGRhdGEgKyBlZHQuZWF0X2FkZHIgKyAoaSAqIDQpICsgYWRqKTsKLSAgICAgIGJmZF92bWEgZWF0X2FjdHVhbCA9IGVhdF9tZW1iZXI7Ci0gICAgICBiZmRfdm1hIGVkYXRhX3N0YXJ0ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBiZmRfdm1hIGVkYXRhX2VuZCA9IGVkYXRhX3N0YXJ0ICsgZGF0YXNpemU7Ci0KLSAgICAgIGlmIChlYXRfbWVtYmVyID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChlZGF0YV9zdGFydCA8IGVhdF9hY3R1YWwgJiYgZWF0X2FjdHVhbCA8IGVkYXRhX2VuZCkKLQl7Ci0JICAvKiB0aGlzIHJ2YSBpcyB0byBhIG5hbWUgKGZvcndhcmRpbmcgZnVuY3Rpb24pIGluIG91ciBzZWN0aW9uICovCi0JICAvKiBTaG91bGQgbG9jYXRlIGEgZnVuY3Rpb24gZGVzY3JpcHRvciAqLwotCSAgZnByaW50ZiAoZmlsZSwKLQkJICAgIlx0WyU0bGRdICtiYXNlWyU0bGRdICUwNGx4ICVzIC0tICVzXG4iLAotCQkgICAobG9uZykgaSwgKGxvbmcpIChpICsgZWR0LmJhc2UpLCBlYXRfbWVtYmVyLAotCQkgICBfKCJGb3J3YXJkZXIgUlZBIiksIGRhdGEgKyBlYXRfbWVtYmVyICsgYWRqKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogU2hvdWxkIGxvY2F0ZSBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgaW4gdGhlIHJlbGRhdGEgc2VjdGlvbiAqLwotCSAgZnByaW50ZiAoZmlsZSwKLQkJICAgIlx0WyU0bGRdICtiYXNlWyU0bGRdICUwNGx4ICVzXG4iLAotCQkgICAobG9uZykgaSwgKGxvbmcpIChpICsgZWR0LmJhc2UpLCBlYXRfbWVtYmVyLAotCQkgICBfKCJFeHBvcnQgUlZBIikpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIEV4cG9ydCBOYW1lIFBvaW50ZXIgVGFibGUgaXMgcGFpcmVkIHdpdGggdGhlIEV4cG9ydCBPcmRpbmFsIFRhYmxlICovCi0gIC8qIER1bXAgdGhlbSBpbiBwYXJhbGxlbCBmb3IgY2xhcml0eSAqLwotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcbltPcmRpbmFsL05hbWUgUG9pbnRlcl0gVGFibGVcbiIpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgZWR0Lm51bV9uYW1lczsgKytpKQotICAgIHsKLSAgICAgIGJmZF92bWEgbmFtZV9wdHIgPSBiZmRfZ2V0XzMyKGFiZmQsCi0JCQkJICAgIGRhdGEgKwotCQkJCSAgICBlZHQubnB0X2FkZHIKLQkJCQkgICAgKyAoaSo0KSArIGFkaik7Ci0gICAgICAKLSAgICAgIGNoYXIgKm5hbWUgPSAoY2hhciAqKSBkYXRhICsgbmFtZV9wdHIgKyBhZGo7Ci0KLSAgICAgIGJmZF92bWEgb3JkID0gYmZkX2dldF8xNihhYmZkLAotCQkJCSAgICBkYXRhICsKLQkJCQkgICAgZWR0Lm90X2FkZHIKLQkJCQkgICAgKyAoaSoyKSArIGFkaik7Ci0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgIlx0WyU0bGRdICVzXG4iLCAobG9uZykgb3JkLCBuYW1lKTsKLQotICAgIH0KLQotICBmcmVlIChkYXRhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X3BkYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGJmZF9ieXRlICpkYXRhID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5wZGF0YSIpOwotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBiZmRfc2l6ZV90eXBlIHN0YXJ0LCBzdG9wOwotICBpbnQgb25hbGluZSA9IDIwOwotCi0gIGlmIChzZWN0aW9uID09IE5VTEwKLSAgICAgIHx8IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKSA9PSBOVUxMCi0gICAgICB8fCBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKSA9PSBOVUxMKQotICAgICByZXR1cm4gdHJ1ZTsKLQotICBzdG9wID0gcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnZpcnRfc2l6ZTsKLSAgaWYgKChzdG9wICUgb25hbGluZSkgIT0gMCkKLSAgICBmcHJpbnRmIChmaWxlLCBfKCJXYXJuaW5nLCAucGRhdGEgc2VjdGlvbiBzaXplICglbGQpIGlzIG5vdCBhIG11bHRpcGxlIG9mICVkXG4iKSwKLQkgICAgIChsb25nKXN0b3AsIG9uYWxpbmUpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiXG5UaGUgRnVuY3Rpb24gVGFibGUgKGludGVycHJldGVkIC5wZGF0YSBzZWN0aW9uIGNvbnRlbnRzKVxuIikpOwotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIiB2bWE6XHRcdEJlZ2luICAgIEVuZCAgICAgIEVIICAgICAgIEVIICAgICAgIFByb2xvZ0VuZCAgRXhjZXB0aW9uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiICAgICBcdFx0QWRkcmVzcyAgQWRkcmVzcyAgSGFuZGxlciAgRGF0YSAgICAgQWRkcmVzcyAgICBNYXNrXG4iKSk7Ci0KLSAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0gIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0gIGlmIChkYXRhID09IE5VTEwgJiYgZGF0YXNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAotCQkJICAgIHNlY3Rpb24sCi0JCQkgICAgKFBUUikgZGF0YSwgMCwKLQkJCSAgICBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0KLSAgc3RhcnQgPSAwOwotCi0gIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBvbmFsaW5lKQotICAgIHsKLSAgICAgIGJmZF92bWEgYmVnaW5fYWRkcjsKLSAgICAgIGJmZF92bWEgZW5kX2FkZHI7Ci0gICAgICBiZmRfdm1hIGVoX2hhbmRsZXI7Ci0gICAgICBiZmRfdm1hIGVoX2RhdGE7Ci0gICAgICBiZmRfdm1hIHByb2xvZ19lbmRfYWRkcjsKLSAgICAgIGludCBlbV9kYXRhOwotCi0gICAgICBpZiAoaSArIDIwID4gc3RvcCkKLQlicmVhazsKLQotICAgICAgYmVnaW5fYWRkciA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKTsKLSAgICAgIGVuZF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krNCk7Ci0gICAgICBlaF9oYW5kbGVyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krOCk7Ci0gICAgICBlaF9kYXRhID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krMTIpOwotICAgICAgcHJvbG9nX2VuZF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krMTYpOwotICAgICAgCi0gICAgICBpZiAoYmVnaW5fYWRkciA9PSAwICYmIGVuZF9hZGRyID09IDAgJiYgZWhfaGFuZGxlciA9PSAwCi0JICAmJiBlaF9kYXRhID09IDAgJiYgcHJvbG9nX2VuZF9hZGRyID09IDApCi0JewotCSAgLyogV2UgYXJlIHByb2JhYmx5IGludG8gdGhlIHBhZGRpbmcgb2YgdGhlIHNlY3Rpb24gbm93LiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgIiAlMDhseFx0IiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSkpOwotCi0gICAgICBlbV9kYXRhID0gKChlaF9oYW5kbGVyICYgMHgxKSA8PCAyKSB8IChwcm9sb2dfZW5kX2FkZHIgJiAweDMpOwotICAgICAgZWhfaGFuZGxlciAmPSAweGZmZmZmZmZjOwotICAgICAgcHJvbG9nX2VuZF9hZGRyICY9IDB4ZmZmZmZmZmM7Ci0KLSAgICAgIGZwcmludGYgKGZpbGUsICIlMDhseCAlMDhseCAlMDhseCAlMDhseCAlMDhseCAgICV4IiwKLQkgICAgICAgYmVnaW5fYWRkciwKLQkgICAgICAgZW5kX2FkZHIsCi0JICAgICAgIGVoX2hhbmRsZXIsCi0JICAgICAgIGVoX2RhdGEsCi0JICAgICAgIHByb2xvZ19lbmRfYWRkciwKLQkgICAgICAgZW1fZGF0YSk7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gICAgICBpZiAoZWhfaGFuZGxlciA9PSAwICYmIGVoX2RhdGEgIT0gMCkKLQl7Ci0JICAvKiBTcGVjaWFsIGJpdHMgaGVyZSwgYWx0aG91Z2ggdGhlIG1lYW5pbmcgbWF5ICovCi0JICAvKiBiZSBhIGxpdHRsZSBteXN0ZXJpb3VzLiBUaGUgb25seSBvbmUgSSBrbm93ICovCi0JICAvKiBmb3Igc3VyZSBpcyAweDAzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAvKiBDb2RlIFNpZ25pZmljYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAvKiAweDAwIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAvKiAweDAxIFJlZ2lzdGVyIFNhdmUgTWlsbGljb2RlICAgICAgICAgICAgICAgICovCi0JICAvKiAweDAyIFJlZ2lzdGVyIFJlc3RvcmUgTWlsbGljb2RlICAgICAgICAgICAgICovCi0JICAvKiAweDAzIEdsdWUgQ29kZSBTZXF1ZW5jZSAgICAgICAgICAgICAgICAgICAgICovCi0JICBzd2l0Y2ggKGVoX2RhdGEpCi0JICAgIHsKLQkgICAgY2FzZSAweDAxOgotCSAgICAgIGZwcmludGYoZmlsZSwgXygiIFJlZ2lzdGVyIHNhdmUgbWlsbGljb2RlIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDB4MDI6Ci0JICAgICAgZnByaW50ZihmaWxlLCBfKCIgUmVnaXN0ZXIgcmVzdG9yZSBtaWxsaWNvZGUiKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHgwMzoKLQkgICAgICBmcHJpbnRmKGZpbGUsIF8oIiBHbHVlIGNvZGUgc2VxdWVuY2UiKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSAgICAgIGZwcmludGYoZmlsZSwgIlxuIik7Ci0gICAgfQotCi0gIGZyZWUgKGRhdGEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9ISUdIQURKIDQKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGJsW10gPQotewotIkFCU09MVVRFIiwKLSJISUdIIiwKLSJMT1ciLAotIkhJR0hMT1ciLAotIkhJR0hBREoiLAotIk1JUFNfSk1QQUREUiIsCi0iVU5LTk9XTiIsICAgLyogTVVTVCBiZSBsYXN0ICovCi19OwotCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfcmVsb2MgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsb2MiKTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKLQotICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiXG5cblBFIEZpbGUgQmFzZSBSZWxvY2F0aW9ucyAoaW50ZXJwcmV0ZWQgLnJlbG9jIHNlY3Rpb24gY29udGVudHMpXG4iKSk7Ci0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0gIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0gIGlmIChkYXRhID09IE5VTEwgJiYgZGF0YXNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAotCQkJICAgIHNlY3Rpb24sCi0JCQkgICAgKFBUUikgZGF0YSwgMCwKLQkJCSAgICBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0KLSAgc3RhcnQgPSAwOwotCi0gIHN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQotICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3A7KQotICAgIHsKLSAgICAgIGludCBqOwotICAgICAgYmZkX3ZtYSB2aXJ0dWFsX2FkZHJlc3M7Ci0gICAgICBsb25nIG51bWJlciwgc2l6ZTsKLQotICAgICAgLyogVGhlIC5yZWxvYyBzZWN0aW9uIGlzIGEgc2VxdWVuY2Ugb2YgYmxvY2tzLCB3aXRoIGEgaGVhZGVyIGNvbnNpc3RpbmcKLQkgb2YgdHdvIDMyIGJpdCBxdWFudGl0aWVzLCBmb2xsb3dlZCBieSBhIG51bWJlciBvZiAxNiBiaXQgZW50cmllcyAqLwotCi0gICAgICB2aXJ0dWFsX2FkZHJlc3MgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSk7Ci0gICAgICBzaXplID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krNCk7Ci0gICAgICBudW1iZXIgPSAoc2l6ZSAtIDgpIC8gMjsKLQotICAgICAgaWYgKHNpemUgPT0gMCkKLQl7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgIF8oIlxuVmlydHVhbCBBZGRyZXNzOiAlMDhseCBDaHVuayBzaXplICVsZCAoMHglbHgpIE51bWJlciBvZiBmaXh1cHMgJWxkXG4iKSwKLQkgICAgICAgdmlydHVhbF9hZGRyZXNzLCBzaXplLCBzaXplLCBudW1iZXIpOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyOyArK2opCi0JewotCSAgdW5zaWduZWQgc2hvcnQgZSA9IGJmZF9nZXRfMTYgKGFiZmQsIGRhdGEgKyBpICsgOCArIGogKiAyKTsKLQkgIHVuc2lnbmVkIGludCB0ID0gKGUgJiAweEYwMDApID4+IDEyOwotCSAgaW50IG9mZiA9IGUgJiAweDBGRkY7Ci0KLQkgIGlmICh0ID49IHNpemVvZiAodGJsKSAvIHNpemVvZiAodGJsWzBdKSkKLQkgICAgdCA9IChzaXplb2YgKHRibCkgLyBzaXplb2YgKHRibFswXSkpIC0gMTsKLQotCSAgZnByaW50ZiAoZmlsZSwKLQkJICAgXygiXHRyZWxvYyAlNGQgb2Zmc2V0ICU0eCBbJTRseF0gJXMiKSwKLQkJICAgaiwgb2ZmLCAobG9uZykgKG9mZiArIHZpcnR1YWxfYWRkcmVzcyksIHRibFt0XSk7Ci0KLQkgIC8qIEhJR0hBREogdGFrZXMgYW4gYXJndW1lbnQsIC0gdGhlIG5leHQgcmVjb3JkICppcyogdGhlCi0JICAgICBsb3cgMTYgYml0cyBvZiBhZGRlbmQuICAqLyAKLQkgIGlmICh0ID09IElNQUdFX1JFTF9CQVNFRF9ISUdIQURKKQotCSAgICB7Ci0JICAgICAgIGZwcmludGYgKGZpbGUsICIgKCU0eCkiLAotCQkJKCh1bnNpZ25lZCBpbnQpCi0JCQkgYmZkX2dldF8xNiAoYWJmZCwgZGF0YSArIGkgKyA4ICsgaiAqIDIgKyAyKSkpOwotCSAgICAgICBqKys7Ci0JICAgIH0KLQkgIAotCSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0JfQotICAgICAgaSArPSBzaXplOwotICAgIH0KLQotICBmcmVlIChkYXRhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJpbnQgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1ib29sZWFuCi1fYmZkX3BlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGFfY29tbW9uIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgaW50IGo7Ci0gIHBlX2RhdGFfdHlwZSAqcGUgPSBwZV9kYXRhIChhYmZkKTsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmkgPSAmcGUtPnBlX29wdGhkcjsKLQotICAvKiBUaGUgTVMgZHVtcGJpbiBwcm9ncmFtIHJlcG9ydGVkbHkgYW5kcyB3aXRoIDB4ZmYwZiBiZWZvcmUKLSAgICAgcHJpbnRpbmcgdGhlIGNoYXJhY3RlcmlzdGljcyBmaWVsZC4gIE5vdCBzdXJlIHdoeS4gIE5vIHJlYXNvbiB0bwotICAgICBlbXVsYXRlIGl0IGhlcmUuICAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJcbkNoYXJhY3RlcmlzdGljcyAweCV4XG4iKSwgcGUtPnJlYWxfZmxhZ3MpOwotI3VuZGVmIFBGCi0jZGVmaW5lIFBGKHgsIHkpICAgIGlmIChwZS0+cmVhbF9mbGFncyAmIHgpIHsgZnByaW50ZiAoZmlsZSwgIlx0JXNcbiIsIHkpOyB9Ci0gIFBGIChGX1JFTEZMRywgInJlbG9jYXRpb25zIHN0cmlwcGVkIik7Ci0gIFBGIChGX0VYRUMsICJleGVjdXRhYmxlIik7Ci0gIFBGIChGX0xOTk8sICJsaW5lIG51bWJlcnMgc3RyaXBwZWQiKTsKLSAgUEYgKEZfTFNZTVMsICJzeW1ib2xzIHN0cmlwcGVkIik7Ci0gIFBGICgweDgwLCAibGl0dGxlIGVuZGlhbiIpOwotICBQRiAoRl9BUjMyV1IsICIzMiBiaXQgd29yZHMiKTsKLSAgUEYgKDB4MjAwLCAiZGVidWdnaW5nIGluZm9ybWF0aW9uIHJlbW92ZWQiKTsKLSAgUEYgKDB4MTAwMCwgInN5c3RlbSBmaWxlIik7Ci0gIFBGIChGX0RMTCwgIkRMTCIpOwotICBQRiAoMHg4MDAwLCAiYmlnIGVuZGlhbiIpOwotI3VuZGVmIFBGCi0KLSAgLyogY3RpbWUgaW1wbGllcyAnXG4nLiAgKi8KLSAgZnByaW50ZiAoZmlsZSwgIlxuVGltZS9EYXRlXHRcdCVzIiwgY3RpbWUgKCZwZS0+Y29mZi50aW1lc3RhbXApKTsKLSAgZnByaW50ZiAoZmlsZSwiXG5JbWFnZUJhc2VcdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5JbWFnZUJhc2UpOwotICBmcHJpbnRmIChmaWxlLCJcblNlY3Rpb25BbGlnbm1lbnRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2VjdGlvbkFsaWdubWVudCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuRmlsZUFsaWdubWVudFx0XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPkZpbGVBbGlnbm1lbnQpOwotICBmcHJpbnRmIChmaWxlLCJcbk1ham9yT1N5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNaW5vck9TeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWFqb3JJbWFnZVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvckltYWdlVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1pbm9ySW1hZ2VWZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JJbWFnZVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNYWpvclN1YnN5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNaW5vclN1YnN5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NaW5vclN1YnN5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJSZXNlcnZlZDFcdFx0JTA4bHhcbiIsIGktPlJlc2VydmVkMSk7Ci0gIGZwcmludGYgKGZpbGUsIlNpemVPZkltYWdlXHRcdCUwOGx4XG4iLCBpLT5TaXplT2ZJbWFnZSk7Ci0gIGZwcmludGYgKGZpbGUsIlNpemVPZkhlYWRlcnNcdFx0JTA4bHhcbiIsIGktPlNpemVPZkhlYWRlcnMpOwotICBmcHJpbnRmIChmaWxlLCJDaGVja1N1bVx0XHQlMDhseFxuIiwgaS0+Q2hlY2tTdW0pOwotICBmcHJpbnRmIChmaWxlLCJTdWJzeXN0ZW1cdFx0JTA4eFxuIiwgaS0+U3Vic3lzdGVtKTsKLSAgZnByaW50ZiAoZmlsZSwiRGxsQ2hhcmFjdGVyaXN0aWNzXHQlMDh4XG4iLCBpLT5EbGxDaGFyYWN0ZXJpc3RpY3MpOwotICBmcHJpbnRmIChmaWxlLCJTaXplT2ZTdGFja1Jlc2VydmVcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKLSAgZnByaW50ZiAoZmlsZSwiXG5TaXplT2ZTdGFja0NvbW1pdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZTdGFja0NvbW1pdCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuU2l6ZU9mSGVhcFJlc2VydmVcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mSGVhcFJlc2VydmUpOwotICBmcHJpbnRmIChmaWxlLCJcblNpemVPZkhlYXBDb21taXRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mSGVhcENvbW1pdCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuTG9hZGVyRmxhZ3NcdFx0JTA4bHhcbiIsIGktPkxvYWRlckZsYWdzKTsKLSAgZnByaW50ZiAoZmlsZSwiTnVtYmVyT2ZSdmFBbmRTaXplc1x0JTA4bHhcbiIsIGktPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotCi0gIGZwcmludGYgKGZpbGUsIlxuVGhlIERhdGEgRGlyZWN0b3J5XG4iKTsKLSAgZm9yIChqID0gMDsgaiA8IElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTOyBqKyspCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIkVudHJ5ICUxeCAiLCBqKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBpLT5EYXRhRGlyZWN0b3J5W2pdLlZpcnR1YWxBZGRyZXNzKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJTA4bHggIiwgaS0+RGF0YURpcmVjdG9yeVtqXS5TaXplKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIlc1xuIiwgZGlyX25hbWVzW2pdKTsKLSAgICB9Ci0KLSAgcGVfcHJpbnRfaWRhdGEgKGFiZmQsIHZmaWxlKTsKLSAgcGVfcHJpbnRfZWRhdGEgKGFiZmQsIHZmaWxlKTsKLSAgcGVfcHJpbnRfcGRhdGEgKGFiZmQsIHZmaWxlKTsKLSAgcGVfcHJpbnRfcmVsb2MgKGFiZmQsIHZmaWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBhbnkgcHJpdmF0ZSBpbmZvIHdlIHVuZGVyc3RhbmQgZnJvbSB0aGUgaW5wdXQgYmZkCi0gICB0byB0aGUgb3V0cHV0IGJmZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24gKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIHBlX2RhdGEgKG9iZmQpLT5wZV9vcHRoZHIgPSBwZV9kYXRhIChpYmZkKS0+cGVfb3B0aGRyOwotICBwZV9kYXRhIChvYmZkKS0+ZGxsID0gcGVfZGF0YSAoaWJmZCktPmRsbDsKLQotICAvKiBmb3Igc3RyaXA6IGlmIHdlIHJlbW92ZWQgLnJlbG9jLCB3ZSdsbCBtYWtlIGEgcmVhbCBtZXNzIG9mIHRoaW5ncwotICAgICBpZiB3ZSBkb24ndCByZW1vdmUgdGhpcyBlbnRyeSBhcyB3ZWxsLiAgKi8KLSAgaWYgKCEgcGVfZGF0YSAob2JmZCktPmhhc19yZWxvY19zZWN0aW9uKQotICAgIHsKLSAgICAgIHBlX2RhdGEob2JmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzVdLlZpcnR1YWxBZGRyZXNzID0gMDsKLSAgICAgIHBlX2RhdGEob2JmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzVdLlNpemUgPSAwOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgcHJpdmF0ZSBzZWN0aW9uIGRhdGEuICovCi1ib29sZWFuCi1fYmZkX3BlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpICE9IE5VTEwKLSAgICAgICYmIHBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKSA9PSBOVUxMKQotCXsKLQkgIG9zZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAob2JmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAob3NlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKSA9PSBOVUxMKQotCXsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+dGRhdGEgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHBlaV9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT52aXJ0X3NpemUgPQotCXBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpLT52aXJ0X3NpemU7Ci0gICAgICBwZWlfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+cGVfZmxhZ3MgPQotICAgICAgICBwZWlfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjKS0+cGVfZmxhZ3M7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkCi1fYmZkX3BlX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBjb2ZmX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpOwotCi0gIGlmIChwZV9kYXRhIChhYmZkKSAhPSBOVUxMCi0gICAgICAmJiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwCi0JICB8fCAoc3ltYm9sLT5mbGFncyAmIEJTRl9ERUJVR0dJTkdfUkVMT0MpICE9IDApCi0gICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXQtPnZhbHVlICs9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotfQotCi0vKiBIYW5kbGUgdGhlIC5pZGF0YSBzZWN0aW9uIGFuZCBvdGhlciB0aGluZ3MgdGhhdCBuZWVkIHN5bWJvbCB0YWJsZQotICAgYWNjZXNzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9wZWlfZmluYWxfbGlua19wb3N0c2NyaXB0IChhYmZkLCBwZmluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpwZmluZm87Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDE7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gcGZpbmZvLT5pbmZvOwotCi0gIC8qIFRoZXJlIGFyZSBhIGZldyBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGZpbGxlZCBpbiBub3cgd2hpbGUgd2UKLSAgICAgaGF2ZSBzeW1ib2wgdGFibGUgYWNjZXNzLgotCi0gICAgIFRoZSAuaWRhdGEgc3Vic2VjdGlvbnMgYXJlbid0IGRpcmVjdGx5IGF2YWlsYWJsZSBhcyBzZWN0aW9ucywgYnV0Ci0gICAgIHRoZXkgYXJlIGluIHRoZSBzeW1ib2wgdGFibGUsIHNvIGdldCB0aGVtIGZyb20gdGhlcmUuICAqLwotCi0gIC8qIFRoZSBpbXBvcnQgZGlyZWN0b3J5LiAgVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiAuaWRhdGEkMiwgd2l0aCBzaXplCi0gICAgIG9mIC5pZGF0YSQyICsgLmlkYXRhJDMuICAqLwotICBoMSA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgICIuaWRhdGEkMiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIGlmIChoMSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHBlX2RhdGEoYWJmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzFdLlZpcnR1YWxBZGRyZXNzID0KLQkoaDEtPnJvb3QudS5kZWYudmFsdWUKLQkgKyBoMS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBoMSA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICIuaWRhdGEkNCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbMV0uU2l6ZSA9Ci0JKChoMS0+cm9vdC51LmRlZi52YWx1ZQotCSAgKyBoMS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpCi0JIC0gcGVfZGF0YShhYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbMV0uVmlydHVhbEFkZHJlc3MpOwotCi0gICAgICAvKiBUaGUgaW1wb3J0IGFkZHJlc3MgdGFibGUuICBUaGlzIGlzIHRoZSBzaXplL2FkZHJlc3Mgb2YKLSAgICAgICAgIC5pZGF0YSQ1LiAgKi8KLSAgICAgIGgxID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgIi5pZGF0YSQ1IiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVsxMl0uVmlydHVhbEFkZHJlc3MgPQotCShoMS0+cm9vdC51LmRlZi52YWx1ZQotCSArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgKyBoMS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGgxID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgIi5pZGF0YSQ2IiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVsxMl0uU2l6ZSA9Ci0JKChoMS0+cm9vdC51LmRlZi52YWx1ZQotCSAgKyBoMS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpCi0JIC0gcGVfZGF0YShhYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbMTJdLlZpcnR1YWxBZGRyZXNzKTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgY291bGRuJ3QgZmluZCBpZGF0YSQyLCB3ZSBlaXRoZXIgaGF2ZSBhbiBleGNlc3NpdmVseQotICAgICB0cml2aWFsIHByb2dyYW0gb3IgYXJlIGluIERFRVAgdHJvdWJsZTsgd2UgaGF2ZSB0byBhc3N1bWUgdHJpdmlhbAotICAgICBwcm9ncmFtLi4uLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvcG8vTWFrZS1pbiBiL2JmZC9wby9NYWtlLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyZGIxLi4wMDAwMDAwCi0tLSBhL2JmZC9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JmZC9wby9QT1RGSUxFUy5pbiBiL2JmZC9wby9QT1RGSUxFUy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFhOTgwYi4uMDAwMDAwMAotLS0gYS9iZmQvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotYWl4Mzg2LWNvcmUuYwotYW91dC1hZG9iZS5jCi1hb3V0LWFybS5jCi1hb3V0LW5zMzJrLmMKLWFvdXQtc3BhcmNsZS5jCi1hb3V0LXRhcmdldC5oCi1hb3V0LXRpYzMwLmMKLWFvdXQwLmMKLWFvdXQzMi5jCi1hb3V0NjQuYwotYW91dGYxLmgKLWFvdXR4LmgKLWFyY2hpdmUuYwotYXJjaHVyZXMuYwotYXJtbmV0YnNkLmMKLWJmZC5jCi1iaW5hcnkuYwotYm91dC5jCi1jYWNoZS5jCi1jZi1pMzg2bHlueC5jCi1jZi1tNjhrbHlueC5jCi1jZi1zcGFyY2x5bnguYwotY2lzY28tY29yZS5jCi1jb2ZmLWEyOWsuYwotY29mZi1hbHBoYS5jCi1jb2ZmLWFwb2xsby5jCi1jb2ZmLWFybS5jCi1jb2ZmLWF1eC5jCi1jb2ZmLWdvMzIuYwotY29mZi1oODMwMC5jCi1jb2ZmLWg4NTAwLmMKLWNvZmYtaTM4Ni5jCi1jb2ZmLWk4NjAuYwotY29mZi1pOTYwLmMKLWNvZmYtbTY4ay5jCi1jb2ZmLW04OGsuYwotY29mZi1taXBzLmMKLWNvZmYtcG1hYy5jCi1jb2ZmLXJzNjAwMC5jCi1jb2ZmLXNoLmMKLWNvZmYtc3BhcmMuYwotY29mZi1zdGdvMzIuYwotY29mZi1zdm02OGsuYwotY29mZi10aWMzMC5jCi1jb2ZmLXRpYzgwLmMKLWNvZmYtdTY4ay5jCi1jb2ZmLXc2NS5jCi1jb2ZmLXdlMzJrLmMKLWNvZmYtejhrLmMKLWNvZmZjb2RlLmgKLWNvZmZnZW4uYwotY29mZmxpbmsuYwotY29mZnN3YXAuaAotY29yZWZpbGUuYwotY3B1LWEyOWsuYwotY3B1LWFscGhhLmMKLWNwdS1hcmMuYwotY3B1LWFybS5jCi1jcHUtZDEwdi5jCi1jcHUtZDMwdi5jCi1jcHUtZnIzMC5jCi1jcHUtaDgzMDAuYwotY3B1LWg4NTAwLmMKLWNwdS1ocHBhLmMKLWNwdS1pMzcwLmMKLWNwdS1pMzg2LmMKLWNwdS1pODYwLmMKLWNwdS1pOTYwLmMKLWNwdS1tMTAyMDAuYwotY3B1LW0xMDMwMC5jCi1jcHUtbTMyci5jCi1jcHUtbTY4ay5jCi1jcHUtbTg4ay5jCi1jcHUtbWNvcmUuYwotY3B1LW1pcHMuYwotY3B1LW5zMzJrLmMKLWNwdS1wai5jCi1jcHUtcG93ZXJwYy5jCi1jcHUtcnM2MDAwLmMKLWNwdS1zaC5jCi1jcHUtc3BhcmMuYwotY3B1LXRpYzMwLmMKLWNwdS10aWM4MC5jCi1jcHUtdjg1MC5jCi1jcHUtdmF4LmMKLWNwdS13NjUuYwotY3B1LXdlMzJrLmMKLWNwdS16OGsuYwotZGVtbzY0LmMKLWR3YXJmMS5jCi1kd2FyZjIuYwotZWNvZmYuYwotZWNvZmZsaW5rLmMKLWVjb2Zmc3dhcC5oCi1lbGYtYmZkLmgKLWVsZi1tMTAyMDAuYwotZWxmLW0xMDMwMC5jCi1lbGYuYwotZWxmMzItYXJjLmMKLWVsZjMyLWFybS5oCi1lbGYzMi1kMTB2LmMKLWVsZjMyLWQzMHYuYwotZWxmMzItZnIzMC5jCi1lbGYzMi1nZW4uYwotZWxmMzItaTM3MC5jCi1lbGYzMi1pMzg2LmMKLWVsZjMyLWk4NjAuYwotZWxmMzItaTk2MC5jCi1lbGYzMi1tMzJyLmMKLWVsZjMyLW02OGsuYwotZWxmMzItbTg4ay5jCi1lbGYzMi1tY29yZS5jCi1lbGYzMi1taXBzLmMKLWVsZjMyLXBqLmMKLWVsZjMyLXBwYy5jCi1lbGYzMi1zaC5jCi1lbGYzMi1zcGFyYy5jCi1lbGYzMi12ODUwLmMKLWVsZjMyLmMKLWVsZjY0LWFscGhhLmMKLWVsZjY0LWdlbi5jCi1lbGY2NC1taXBzLmMKLWVsZjY0LXNwYXJjLmMKLWVsZjY0LmMKLWVsZmFybS1uYWJpLmMKLWVsZmFybS1vYWJpLmMKLWVsZmNvZGUuaAotZWxmY29yZS5oCi1lbGZsaW5rLmMKLWVsZmxpbmsuaAotZXBvYy1wZS1hcm0uYwotZXBvYy1wZWktYXJtLmMKLWZvcm1hdC5jCi1mcmVlYnNkLmgKLWdlbmxpbmsuaAotZ28zMnN0dWIuaAotaGFzaC5jCi1ocDMwMGJzZC5jCi1ocDMwMGhwdXguYwotaHB1eC1jb3JlLmMKLWkzODZhb3V0LmMKLWkzODZic2QuYwotaTM4NmR5bml4LmMKLWkzODZmcmVlYnNkLmMKLWkzODZsaW51eC5jCi1pMzg2bHlueC5jCi1pMzg2bWFjaDMuYwotaTM4Nm1zZG9zLmMKLWkzODZuZXRic2QuYwotaTM4Nm9zOWsuYwotaWVlZS5jCi1paGV4LmMKLWluaXQuYwotaXJpeC1jb3JlLmMKLWxpYmFvdXQuaAotbGliYmZkLmMKLWxpYmJmZC5oCi1saWJjb2ZmLmgKLWxpYmVjb2ZmLmgKLWxpYmhwcGEuaAotbGliaWVlZS5oCi1saWJubG0uaAotbGlib2FzeXMuaAotbGlicGVpLmgKLWxpbmtlci5jCi1seW54LWNvcmUuYwotbTY4azRrbmV0YnNkLmMKLW02OGtsaW51eC5jCi1tNjhrbHlueC5jCi1tNjhrbmV0YnNkLmMKLW04OGttYWNoMy5jCi1taXBzYnNkLmMKLW5ldGJzZC5oCi1uZXdzb3MzLmMKLW5sbS10YXJnZXQuaAotbmxtLmMKLW5sbTMyLWFscGhhLmMKLW5sbTMyLWkzODYuYwotbmxtMzItcHBjLmMKLW5sbTMyLXNwYXJjLmMKLW5sbTMyLmMKLW5sbTY0LmMKLW5sbWNvZGUuaAotbmxtc3dhcC5oCi1uczMyay5oCi1uczMya25ldGJzZC5jCi1vYXN5cy5jCi1vcG5jbHMuYwotb3NmLWNvcmUuYwotcGM1MzItbWFjaC5jCi1wZS1hcm0uYwotcGUtaTM4Ni5jCi1wZS1tY29yZS5jCi1wZS1wcGMuYwotcGVpLWFybS5jCi1wZWktaTM4Ni5jCi1wZWktbWNvcmUuYwotcGVpLXBwYy5jCi1wZWljb2RlLmgKLXBlaWdlbi5jCi1wcGNib290LmMKLXJlbG9jLmMKLXJlbG9jMTYuYwotcmlzY2l4LmMKLXNjbzUtY29yZS5jCi1zZWN0aW9uLmMKLXNvbS5jCi1zb20uaAotc3BhcmNsaW51eC5jCi1zcGFyY2x5bnguYwotc3BhcmNuZXRic2QuYwotc3JlYy5jCi1zdGFiLXN5bXMuYwotc3RhYnMuYwotc3Vub3MuYwotc3ltcy5jCi10YXJnZXRzLmMKLXRla2hleC5jCi10cmFkLWNvcmUuYwotdmF4bmV0YnNkLmMKLXZlcnNhZG9zLmMKLXZtcy1nc2QuYwotdm1zLWhkci5jCi12bXMtbWlzYy5jCi12bXMtdGlyLmMKLXZtcy5jCi12bXMuaAoteGNvZmZsaW5rLmMKZGlmZiAtLWdpdCBhL2JmZC9wby9iZmQucG90IGIvYmZkL3BvL2JmZC5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjM3OTIuLjAwMDAwMDAKLS0tIGEvYmZkL3BvL2JmZC5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAzICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAwLTAyLTI1IDIyOjEzLTA1MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhb3V0LWFkb2JlLmM6MTgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmtub3duIHNlY3Rpb24gdHlwZSBpbiBhLm91dC5hZG9iZSBmaWxlOiAleFxuIgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTI0NCBhb3V0eC5oOjE2NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYCVzJyBpbiBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogYW91dHguaDoxNjI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBmb3Igc3ltYm9sIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTYzMAotbXNnaWQgIip1bmtub3duKiIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjM2NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jYXRlYWJsZSBsaW5rIGZyb20gJXMgdG8gJXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcmNoaXZlLmM6MTcyNAotbXNnaWQgIldhcm5pbmc6IHdyaXRpbmcgYXJjaGl2ZSB3YXMgc2xvdzogcmV3cml0aW5nIHRpbWVzdGFtcFxuIgotbXNnc3RyICIiCi0KLSM6IGFyY2hpdmUuYzoxOTkwCi1tc2dpZCAiUmVhZGluZyBhcmNoaXZlIGZpbGUgbW9kIHRpbWVzdGFtcCIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogYmZkIGNhbid0IGNhbGwgcGVycm9yLgotIzogYXJjaGl2ZS5jOjIwMTQKLW1zZ2lkICJXcml0aW5nIHVwZGF0ZWQgYXJtYXAgdGltZXN0YW1wIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI3NAotbXNnaWQgIk5vIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI3NQotbXNnaWQgIlN5c3RlbSBjYWxsIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI3NgotbXNnaWQgIkludmFsaWQgYmZkIHRhcmdldCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzcKLW1zZ2lkICJGaWxlIGluIHdyb25nIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzgKLW1zZ2lkICJJbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzkKLW1zZ2lkICJNZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MAotbXNnaWQgIk5vIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjgxCi1tc2dpZCAiQXJjaGl2ZSBoYXMgbm8gaW5kZXg7IHJ1biByYW5saWIgdG8gYWRkIG9uZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODIKLW1zZ2lkICJObyBtb3JlIGFyY2hpdmVkIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MwotbXNnaWQgIk1hbGZvcm1lZCBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4NAotbXNnaWQgIkZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4NQotbXNnaWQgIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODYKLW1zZ2lkICJTZWN0aW9uIGhhcyBubyBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODcKLW1zZ2lkICJOb25yZXByZXNlbnRhYmxlIHNlY3Rpb24gb24gb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4OAotbXNnaWQgIlN5bWJvbCBuZWVkcyBkZWJ1ZyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4OQotbXNnaWQgIkJhZCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyOTAKLW1zZ2lkICJGaWxlIHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyOTEKLW1zZ2lkICJGaWxlIHRvbyBiaWciCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkyCi1tc2dpZCAiIzxJbnZhbGlkIGVycm9yIGNvZGU+IgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjY3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJiZmQgYXNzZXJ0aW9uIGZhaWwgJXM6JWQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Njk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJGRCBpbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJCRkQgaW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzo3MDMKLW1zZ2lkICJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIgotbXNnc3RyICIiCi0KLSM6IGJpbmFyeS5jOjI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBXcml0aW5nIHNlY3Rpb24gYCVzJyB0byBodWdlIChpZSBuZWdhdGl2ZSkgZmlsZSBvZmZzZXQgMHglbHguIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjEyMgotbXNnaWQgIk1pc3NpbmcgSUhDT05TVCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzoxODIKLW1zZ2lkICJNaXNzaW5nIElISUhBTEYiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hMjlrLmM6MjE0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjQyNwotbXNnaWQgIm1pc3NpbmcgSUhDT05TVCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzo1MTgKLW1zZ2lkICJtaXNzaW5nIElISUhBTEYgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjg4MCBjb2ZmLWFscGhhLmM6OTE3Ci1tc2dpZCAiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjE0ODYgZWxmNjQtYWxwaGEuYzozOTg0Ci1tc2dpZCAidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYWxwaGEuYzoxOTkyIGNvZmYtbWlwcy5jOjE0MzUKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzo4OTUgZWxmMzItYXJtLmg6MjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmFibGUgdG8gZmluZCBUSFVNQiBnbHVlICclcycgZm9yIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzo5MjQgZWxmMzItYXJtLmg6MjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmFibGUgdG8gZmluZCBBUk0gZ2x1ZSAnJXMnIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTE5OSBjb2ZmLWFybS5jOjEyOTMgZWxmMzItYXJtLmg6ODU3IGVsZjMyLWFybS5oOjk1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxMjAzIGVsZjMyLWFybS5oOjk1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiBhcm0gY2FsbCB0byB0aHVtYiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjEyOTcgZWxmMzItYXJtLmg6ODYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTMwMAotbXNnaWQgIiAgY29uc2lkZXIgcmVsaW5raW5nIHdpdGggLS1zdXBwb3J0LW9sZC1jb2RlIGVuYWJsZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxNTg2IGNvZmYtdGljODAuYzo2ODIgY29mZmxpbmsuYzoyOTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxOTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCBpbiByZWxvYzogJWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBFUlJPUjogY29tcGlsZWQgZm9yIEFQQ1MtJWQgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBBUENTLSVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjA2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGZsb2F0IHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGludGVnZXIgIgotInJlZ2lzdGVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGZsb2F0ICIKLSJyZWdpc3RlcnMiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogRVJST1I6IGNvbXBpbGVkIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzICIKLSJhYnNvbHV0ZSBwb3NpdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgYWJzb2x1dGUgcG9zaXRpb24gY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgcG9zaXRpb24gIgotImluZGVwZW5kZW50IgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjExNQotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIHN1cHBvcnRzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzIG5vdC4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcy4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAleDoiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTU0IGVsZjMyLWFybS5oOjIwODgKLW1zZ2lkICIgW2Zsb2F0cyBwYXNzZWQgaW4gZmxvYXQgcmVnaXN0ZXJzXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTYgZWxmMzItYXJtLmg6MjA5MAotbXNnaWQgIiBbZmxvYXRzIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVyc10iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTU5IGVsZjMyLWFybS5oOjIwOTMKLW1zZ2lkICIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNjEgZWxmMzItYXJtLmg6MjA5NQotbXNnaWQgIiBbYWJzb2x1dGUgcG9zaXRpb25dIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjE2NQotbXNnaWQgIiBbaW50ZXJ3b3JraW5nIGZsYWcgbm90IGluaXRpYWxpc2VkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNjcKLW1zZ2lkICIgW2ludGVyd29ya2luZyBzdXBwb3J0ZWRdIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjE2OQotbXNnaWQgIiBbaW50ZXJ3b3JraW5nIG5vdCBzdXBwb3J0ZWRdIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjIxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMsIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gIgotInNwZWNpZmllZCBhcyBub24taW50ZXJ3b3JraW5nIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjIyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWk5NjAuYzoxMzYgY29mZi1pOTYwLmM6NDg1Ci1tc2dpZCAidW5jZXJ0YWluIGNhbGxpbmcgY29udmVudGlvbiBmb3Igbm9uLUNPRkYgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjg3NSBlbGYzMi1taXBzLmM6MTMyMgotbXNnaWQgIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBfZ3Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1taXBzLmM6MjQzMwotbXNnaWQgInVuc3VwcG9ydGVkIHJlbG9jIHR5cGUiCi1tc2dzdHIgIiIKLQotIy4gTm8gb3RoZXIgc2VjdGlvbnMgc2hvdWxkIGFwcGVhciBpbiAtbWVtYmVkZGVkLXBpYwotIy4gY29kZS4KLSM6IGNvZmYtbWlwcy5jOjI0NzAKLW1zZ2lkICJyZWxvYyBhZ2FpbnN0IHVuc3VwcG9ydGVkIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29mZi1taXBzLmM6MjQ3OAotbXNnaWQgInJlbG9jIG5vdCBwcm9wZXJseSBhbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtdGljODAuYzo0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIHJlbG9jIHR5cGUgMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLXc2NS5jOjM4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpZ25vcmluZyByZWxvYyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6MzkyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIGxpbmUgbnVtYmVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjM5NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGR1cGxpY2F0ZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjQyOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFVucmVjb2duaXplZCBzdG9yYWdlIGNsYXNzICVkIGZvciAlcyBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjQ0MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2FybmluZzogJXM6IGxvY2FsIHN5bWJvbCBgJXMnIGhhcyBubyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6NDU0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjQ1NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlsbGVnYWwgcmVsb2NhdGlvbiB0eXBlICVkIGF0IGFkZHJlc3MgMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29mZmdlbi5jOjE2MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCBzdHJpbmcgdGFibGUgc2l6ZSAlbHUiCi1tc2dzdHIgIiIKLQotIzogY29mZmdlbi5jOjIwNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQVVYIHRhZ25keCAlbGQgdHRsc2l6IDB4JWx4IGxubm9zICVsZCBuZXh0ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjUxOCBlbGZsaW5rLmg6MTU2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjIyODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jcyBpbiBzZWN0aW9uIGAlcycsIGJ1dCBpdCBoYXMgbm8gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogY29mZmxpbmsuYzoyNjE5IGNvZmZzd2FwLmg6OTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogcmVsb2Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIgotbXNnc3RyICIiCi0KLSM6IGNvZmZsaW5rLmM6MjYyOCBjb2Zmc3dhcC5oOjg5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogJXM6IGxpbmUgbnVtYmVyIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo0MjkKLW1zZ2lkICJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfYWJicmV2IHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjQ0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJEd2FyZiBFcnJvcjogQWJicmV2IG9mZnNldCAoJXUpIGJpZ2dlciB0aGFuIGFiYnJldiBzaXplICgldSkuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjYyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJEd2FyZiBFcnJvcjogSW52YWxpZCBvciB1bmhhbmRsZWQgRk9STSB2YWx1ZTogJWQuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjcwMAotbXNnaWQgIkR3YXJmIEVycm9yOiBtYW5nbGVkIGxpbmUgbnVtYmVyIHNlY3Rpb24gKGJhZCBmaWxlIG51bWJlcikuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjc5MQotbXNnaWQgIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19saW5lIHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjk2MwotbXNnaWQgIkR3YXJmIEVycm9yOiBtYW5nbGVkIGxpbmUgbnVtYmVyIHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjExNTEgZHdhcmYyLmM6MTMwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJEd2FyZiBFcnJvcjogQ291bGQgbm90IGZpbmQgYWJicmV2IG51bWJlciAlZC4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6MTI2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iRHdhcmYgRXJyb3I6IGZvdW5kIGR3YXJmIHZlcnNpb24gJyVodScsIHRoaXMgcmVhZGVyIG9ubHkgaGFuZGxlcyB2ZXJzaW9uIDIgIgotImluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzoxMjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJEd2FyZiBFcnJvcjogZm91bmQgYWRkcmVzcyBzaXplICcldScsIHRoaXMgcmVhZGVyIGNhbiBub3QgaGFuZGxlIHNpemVzICIKLSJncmVhdGVyIHRoYW4gJyV1Jy4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6MTI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJEd2FyZiBFcnJvcjogQmFkIGFiYnJldiBudW1iZXI6ICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjEzMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBiYXNpYyB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTU5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgRW5kKzEgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjA0IGVjb2ZmLmM6MTYwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgRmlyc3Qgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBFbmQrMSBzeW1ib2w6ICUtN2xkICAgVHlwZTogICVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgTG9jYWwgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBzdHJ1Y3Q7IEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgdW5pb247IEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTY0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgZW51bTsgRW5kKzEgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBUeXBlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYtbTEwMjAwLmM6NDU1IGVsZi1tMTAzMDAuYzo2NzAgZWxmMzItYXJtLmg6MTg1MiBlbGYzMi1kMTB2LmM6NDkzCi0jOiBlbGYzMi1mcjMwLmM6NjUwIGVsZjMyLW0zMnIuYzoxMTU3IGVsZjMyLXY4NTAuYzoxNjc3Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBlbGYtbTEwMjAwLmM6NDU5IGVsZi1tMTAzMDAuYzo2NzQgZWxmMzItYXJtLmg6MTg1NiBlbGYzMi1kMTB2LmM6NDk3Ci0jOiBlbGYzMi1mcjMwLmM6NjU0IGVsZjMyLW0zMnIuYzoxMTYxIGVsZjMyLXY4NTAuYzoxNjgxCi1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ2MyBlbGYtbTEwMzAwLmM6Njc4IGVsZjMyLWFybS5oOjE4NjAgZWxmMzItZDEwdi5jOjUwMQotIzogZWxmMzItbTMyci5jOjExNjUKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NjcgZWxmLW0xMDMwMC5jOjY4MiBlbGYzMi1hcm0uaDoxODY0IGVsZjMyLWQxMHYuYzo1MDUKLSM6IGVsZjMyLWZyMzAuYzo2NjIgZWxmMzItbTMyci5jOjExNjkgZWxmMzItdjg1MC5jOjE3MDEKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzozMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgc3RyaW5nIG9mZnNldCAldSA+PSAlbHUgZm9yIHNlY3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo1NDYKLW1zZ2lkICIiCi0iXG4iCi0iUHJvZ3JhbSBIZWFkZXI6XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NTk0Ci1tc2dpZCAiIgotIlxuIgotIkR5bmFtaWMgU2VjdGlvbjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo2OTYKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBkZWZpbml0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo3MTkKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBSZWZlcmVuY2VzOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjcyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIHJlcXVpcmVkIGZyb20gJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MTI4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW52YWxpZCBsaW5rICVsdSBmb3IgcmVsb2Mgc2VjdGlvbiAlcyAoaW5kZXggJXUpIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjIwNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImNyZWF0aW5nIHNlY3Rpb24gc3ltYm9sLCBuYW1lID0gJXMsIHZhbHVlID0gMHglLjhseCwgaW5kZXggPSAlZCwgc2VjdGlvbiA9ICIKLSIweCUuOGx4XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjY0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMgKGFsbG9jYXRlZCAldSwgbmVlZCAldSkiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6Mjc0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMsIHRyeSBsaW5raW5nIHdpdGggLU4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6Mjg3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcjogRmlyc3Qgc2VjdGlvbiBpbiBzZWdtZW50ICglcykgc3RhcnRzIGF0IDB4JXgiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6Mjg3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgd2hlcmVhcyBzZWdtZW50IHN0YXJ0cyBhdCAweCV4IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjMxNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGFsbG9jYXRlZCBzZWN0aW9uIGAlcycgbm90IGluIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzUyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjM1MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIDB4JS44bHgsIG5hbWUgPSAlcywgc3ltIG51bSA9ICVkLCBmbGFncyA9ICIKLSIweCUuOGx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzozNjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBFbXB0eSBsb2FkYWJsZSBzZWdtZW50IGRldGVjdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NDk1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjE3ODcgZWxmMzItaTM4Ni5jOjEyOTkgZWxmMzItcHBjLmM6MzA5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjE4OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIldhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29yayBmbGFnIG9mICVzIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gIgotInNwZWNpZmllZCBhcyBub24taW50ZXJ3b3JraW5nIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjE4OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29yayBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MTk0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29yayBmbGFnIGluICVzIGJlY2F1c2Ugbm9uLWludGVyd29ya2luZyBjb2RlIGluICIKLSIlcyBoYXMgYmVlbiBsaW5rZWQgd2l0aCBpdCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoxOTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3I6ICVzIGNvbXBpbGVkIGZvciBBUENTLSVkLCB3aGVyZWFzICVzIGlzIGNvbXBpbGVkIGZvciBBUENTLSVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkVycm9yOiAlcyBwYXNzZXMgZmxvYXRzIGluICVzIHJlZ2lzdGVycywgd2hlcmVhcyAlcyBwYXNzZXMgdGhlbSBpbiAlcyAiCi0icmVnaXN0ZXJzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwMzMgZWxmMzItYXJtLmg6MjAzNQotbXNnaWQgImZsb2F0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwMzMgZWxmMzItYXJtLmg6MjAzNQotbXNnaWQgImludGVnZXIiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjAzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcjogJXMgaXMgY29tcGlsZWQgYXMgcG9zaXRpb24gJXMgY29kZSwgd2hlcmVhcyAlcyBpcyBub3QiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjA0MQotbXNnaWQgImluZGVwZW5kZW50IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwNDEKLW1zZ2lkICJkZXBlbmRlbnQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjA0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiAlcyAlcyBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjA1MAotbXNnaWQgInN1cHBvcnRzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwNTAKLW1zZ2lkICJkb2VzIG5vdCBzdXBwb3J0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWFybS5oOjIwNTIKLW1zZ2lkICJkb2VzIG5vdCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoyMDUyCi1tc2dpZCAiZG9lcyIKLW1zZ3N0ciAiIgotCi0jLiBJZ25vcmUgaW5pdCBmbGFnIC0gaXQgbWF5IG5vdCBiZSBzZXQsIGRlc3BpdGUgdGhlIGZsYWdzIGZpZWxkIGNvbnRhaW5pbmcgdmFsaWQgZGF0YS4KLSM6IGVsZjMyLWFybS5oOjIwNzUgZWxmMzItbTY4ay5jOjQzMCBlbGYzMi1taXBzLmM6MjUyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJwcml2YXRlIGZsYWdzID0gJWx4OiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoyMDc4Ci1tc2dpZCAiIFtpbnRlcndvcmtpbmcgZW5hYmxlZF0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItYXJtLmg6MjA4MAotbXNnaWQgIiBbaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoyMDgzCi1tc2dpZCAiIFtBUENTLTI2XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1hcm0uaDoyMDg1Ci1tc2dpZCAiIFtBUENTLTMyXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1mcjMwLmM6NjU4IGVsZjMyLXY4NTAuYzoxNjg1Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWkzODYuYzoyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgcmVsb2NhdGlvbiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzo4MDgKLW1zZ2lkICJTREEgcmVsb2NhdGlvbiB3aGVuIF9TREFfQkFTRV8gbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjg5MiBlbGYzMi1wcGMuYzoyOTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MTEwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVGhlIHRhcmdldCAoJXMpIG9mIGFuICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIHNlY3Rpb24gKCVzKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MTkwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSW5zdHJ1Y3Rpb24gc2V0IG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MTkyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJwcml2YXRlIGZsYWdzID0gJWx4IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxOTMwCi1tc2dpZCAiOiBtMzJyIGluc3RydWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MTkzMQotbXNnaWQgIjogbTMycnggaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW02OGsuYzo0MzMKLW1zZ2lkICIgW2NwdTMyXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tY29yZS5jOjMyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tY29yZS5jOjM3NyBlbGYzMi1tY29yZS5jOjUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1jb3JlLmM6NDYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmtub3duIHJlbG9jYXRpb24gdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoxNDgxCi1tc2dpZCAiMzJiaXRzIGdwIHJlbGF0aXZlIHJlbG9jYXRpb24gb2NjdXJzIGZvciBhbiBleHRlcm5hbCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjE2MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlua2luZyBtaXBzMTYgb2JqZWN0cyBpbnRvICVzIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzYwIGVsZjMyLXBwYy5jOjE0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhIGJpZyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjM2MiBlbGYzMi1wcGMuYzoxNDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGJpZyBlbmRpYW4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI0MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmtpbmcgUElDIGZpbGVzIHdpdGggbm9uLVBJQyBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjQyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbGlua2luZyBhYmljYWxscyBmaWxlcyB3aXRoIG5vbi1hYmljYWxscyBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSVNBIG1pc21hdGNoICgtbWlwcyVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKC1taXBzJWQpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJU0EgbWlzbWF0Y2ggKCVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQUJJIG1pc21hdGNoOiBsaW5raW5nICVzIG1vZHVsZSB3aXRoIHByZXZpb3VzICVzIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI0OTcgZWxmMzItcHBjLmM6MTQ3NyBlbGY2NC1zcGFyYy5jOjI4MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI1MjgKLW1zZ2lkICIgW2FiaT1PMzJdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNTMwCi1tc2dpZCAiIFthYmk9TzY0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjUzMgotbXNnaWQgIiBbYWJpPUVBQkkzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI1MzQKLW1zZ2lkICIgW2FiaT1FQUJJNjRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNTM2Ci1tc2dpZCAiIFthYmkgdW5rbm93bl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI1MzgKLW1zZ2lkICIgW2FiaT1OMzJdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNTQwCi1tc2dpZCAiIFthYmk9NjRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNTQyCi1tc2dpZCAiIFtubyBhYmkgc2V0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjU0NQotbXNnaWQgIiBbbWlwczFdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNTQ3Ci1tc2dpZCAiIFttaXBzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI1NDkKLW1zZ2lkICIgW21pcHMzXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjU1MQotbXNnaWQgIiBbbWlwczRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyNTUzCi1tc2dpZCAiIFt1bmtub3duIElTQV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI1NTYKLW1zZ2lkICIgWzMyYml0bW9kZV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjI1NTgKLW1zZ2lkICIgW25vdCAzMmJpdG1vZGVdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzo0MTYxCi1tc2dpZCAic3RhdGljIHByb2NlZHVyZSAobm8gbmFtZSkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjQ3NzggZWxmNjQtYWxwaGEuYzo0MzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzo1MzA1Ci1tc2dpZCAibm90IGVub3VnaCBHT1Qgc3BhY2UgZm9yIGxvY2FsIEdPVCBlbnRyaWVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzo2MzYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlcysweCVseDoganVtcCB0byBzdHViIHJvdXRpbmUgd2hpY2ggaXMgbm90IGphbCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6NzM0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ0FMTDE2IHJlbG9jIGF0IDB4JWx4IG5vdCBhZ2FpbnN0IGdsb2JhbCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MTQ0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCBub3JtYWxseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzoxNDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogY29tcGlsZWQgbm9ybWFsbHkgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgd2l0aCAtbXJlbG9jYXRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjE1NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFVua25vd24gc3BlY2lhbCBsaW5rZXIgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzoyMjUxIGVsZjMyLXBwYy5jOjIyODUgZWxmMzItcHBjLmM6MjMyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MzEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQgZm9yIHN5bWJvbCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzozNDg4IGVsZjMyLXBwYy5jOjM1MTAgZWxmMzItcHBjLmM6MzU1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MzYyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogUmVsb2NhdGlvbiAlcyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3Igc3ltYm9sICVzLiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjY4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6NjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogUl9TSF9VU0VTIHBvaW50cyB0byB1bnJlY29nbml6ZWQgaW5zbiAweCV4IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6NzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBsb2FkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjcyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6NzYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjg4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIENPVU5UIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6ODkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogYmFkIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6MTI3OSBlbGYzMi1zaC5jOjE2NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxNDg0IGVsZjY0LXNwYXJjLmM6MjI0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxODU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSB2OHBsdXMgc3lzdGVtIGFuZCB0YXJnZXQgaXMgdjgiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxODYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSB2OHBsdXNhIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4cGx1cyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zcGFyYy5jOjE4NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhIDY0IGJpdCBzeXN0ZW0gYW5kIHRhcmdldCBpcyAzMiBiaXQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxODgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsaW5raW5nIGxpdHRsZSBlbmRpYW4gZmlsZXMgd2l0aCBiaWcgZW5kaWFuIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzo2ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFyaWFibGUgYCVzJyBjYW5ub3Qgb2NjdXB5IGluIG11bHRpcGxlIHNtYWxsIGRhdGEgcmVnaW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6NjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbiBvbmx5IGJlIGluIG9uZSBvZiB0aGUgc21hbGwsIHplcm8sIGFuZCB0aW55IGRhdGEgcmVnaW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6Njg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB6ZXJvIGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6Njg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6NjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHplcm8gYW5kIHRpbnkgZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxMDcwCi1tc2dpZCAiRkFJTEVEIHRvIGZpbmQgcHJldmlvdXMgSEkxNiByZWxvY1xuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxNjg5Ci1tc2dpZCAiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19ncCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTY5MwotbXNnaWQgImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZXAiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE2OTcKLW1zZ2lkICJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2N0YnAiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEFyY2hpdGVjdHVyZSBtaXNtYXRjaCB3aXRoIHByZXZpb3VzIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE5MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJpdmF0ZSBmbGFncyA9ICVseDogIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxOTEwCi1tc2dpZCAidjg1MCBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE5MTEKLW1zZ2lkICJ2ODUwZSBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE5MTIKLW1zZ2lkICJ2ODUwZWEgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LWFscGhhLmM6OTQ3Ci1tc2dpZCAiR1BESVNQIHJlbG9jYXRpb24gZGlkIG5vdCBmaW5kIGxkYWggYW5kIGxkYSBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmNjQtYWxwaGEuYzoyOTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAuZ290IHN1YnNlZ21lbnQgZXhjZWVkcyA2NEsgKHNpemUgJWQpIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LXNwYXJjLmM6MTI0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2hlY2tfcmVsb2NzOiB1bmhhbmRsZWQgcmVsb2MgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjEyODUKLW1zZ2lkICIlczogT25seSByZWdpc3RlcnMgJSVnWzIzNjddIGNhbiBiZSBkZWNsYXJlZCB1c2luZyBTVFRfUkVHSVNURVIiCi1tc2dzdHIgIiIKLQotIzogZWxmNjQtc3BhcmMuYzoxMzA1Ci1tc2dpZCAiIgotIlJlZ2lzdGVyICUlZyVkIHVzZWQgaW5jb21wYXRpYmx5OiBwcmV2aW91c2x5IGRlY2xhcmVkIGluICVzIHRvICVzLCBpbiAlcyAiCi0icmVkZWZpbmVkIHRvICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LXNwYXJjLmM6MTMyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgYCVzJyBoYXMgZGlmZmVyaW5nIHR5cGVzOiBwcmV2aW91c2x5ICVzLCBSRUdJU1RFUiBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjEzNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sIGAlcycgaGFzIGRpZmZlcmluZyB0eXBlczogUkVHSVNURVIgaW4gJXMsICVzIGluICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LXNwYXJjLmM6MjgwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbGlua2luZyBVbHRyYVNQQVJDIHNwZWNpZmljIHdpdGggSEFMIHNwZWNpZmljIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogZWxmY29kZS5oOjEwNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHZlcnNpb24gY291bnQgKCVsZCkgZG9lcyBub3QgbWF0Y2ggc3ltYm9sIGNvdW50ICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGVsZmxpbmsuYzo0MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFNlY3Rpb24gJXMgaXMgYWxyZWFkeSB0byBsYXJnZSB0byBwdXQgaG9sZSBvZiAlbGQgYnl0ZXMgaW4iCi1tc2dzdHIgIiIKLQotIzogZWxmbGluay5oOjEzODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBpbnZhbGlkIHZlcnNpb24gJXUgKG1heCAlZCkiCi1tc2dzdHIgIiIKLQotIzogZWxmbGluay5oOjE0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBpbnZhbGlkIG5lZWRlZCB2ZXJzaW9uICVkIgotbXNnc3RyICIiCi0KLSM6IGVsZmxpbmsuaDoxNTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHNpemUgb2Ygc3ltYm9sIGAlcycgY2hhbmdlZCBmcm9tICVsdSB0byAlbHUgaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmbGluay5oOjE3OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IHVuZXhwZWN0ZWQgcmVkZWZpbml0aW9uIG9mIGAlcyciCi1tc2dzdHIgIiIKLQotIzogZWxmbGluay5oOjM0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2FybmluZzogdHlwZSBhbmQgc2l6ZSBvZiBkeW5hbWljIHN5bWJvbCBgJXMnIGFyZSBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGZsaW5rLmg6Mzc1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5kZWZpbmVkIHZlcnNpb25lZCBzeW1ib2wgbmFtZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGZsaW5rLmg6NDk4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY291bGQgbm90IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXMgZm9yIGlucHV0IHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogaTM4NmxpbnV4LmM6NDUwIG02OGtsaW51eC5jOjQ1NCBzcGFyY2xpbnV4LmM6NDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBpMzg2bGludXguYzo0NTggbTY4a2xpbnV4LmM6NDYyIHNwYXJjbGludXguYzo0NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGkzODZsaW51eC5jOjY0NiBpMzg2bGludXguYzo2OTYgbTY4a2xpbnV4LmM6NjUzIG02OGtsaW51eC5jOjcwMQotIzogc3BhcmNsaW51eC5jOjY0OSBzcGFyY2xpbnV4LmM6Njk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iCi1tc2dzdHIgIiIKLQotIzogaTM4NmxpbnV4LmM6NzIwIG02OGtsaW51eC5jOjcyNSBzcGFyY2xpbnV4LmM6NzIzCi1tc2dpZCAiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdHJpbmcgdG9vIGxvbmcgKCVkIGNoYXJzLCBtYXggNjU1MzUpIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCBzeW1ib2wgYCVzJyBmbGFncyAweCV4IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo3OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuaW1wbGVtZW50ZWQgQVRJIHJlY29yZCAgJXUgZm9yIHN5bWJvbCAldSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6ODE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmV4cGVjdGVkIEFUTiB0eXBlICVkIGluIGV4dGVybmFsIHBhcnQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjg0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCB0eXBlIGFmdGVyIEFUTiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6MjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiB1bmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIEludGVsIEhleCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjM2OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogYmFkIGNoZWNrc3VtIGluIEludGVsIEhleCBmaWxlIChleHBlY3RlZCAldSwgZm91bmQgJXUpIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjQzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogYmFkIGV4dGVuZGVkIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogdW5yZWNvZ25pemVkIGloZXggdHlwZSAldSBpbiBJbnRlbCBIZXggZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludGVybmFsIGVycm9yIGluIGloZXhfcmVhZF9zZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCBzZWN0aW9uIGxlbmd0aCBpbiBpaGV4X3JlYWRfc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6ODU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBhZGRyZXNzIDB4JXMgb3V0IG9mIHJhbmdlIGZvciBJbnRleCBIZXggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJiZmQuYzo0ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm90IG1hcHBpbmc6IGRhdGE9JWx4IG1hcHBlZD0lZFxuIgotbXNnc3RyICIiCi0KLSM6IGxpYmJmZC5jOjQ4NwotbXNnaWQgIm5vdCBtYXBwaW5nOiBlbnYgdmFyIG5vdCBzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaW5rZXIuYzoyNjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkF0dGVtcHQgdG8gZG8gcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCAlcyBpbnB1dCBhbmQgJXMgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IG9hc3lzLmM6MTAxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIG9hc3lzIgotbXNnc3RyICIiCi0KLSM6IG9zZi1jb3JlLmM6MTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuaGFuZGxlZCBPU0YvMSBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpY29kZS5oOjM5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSW1wb3J0IExpYnJhcnkgRm9ybWF0IGFyY2hpdmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmUgbnVtYmVyIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NjMKLW1zZ2lkICJFeHBvcnQgRGlyZWN0b3J5IFsuZWRhdGEgKG9yIHdoZXJlIGV2ZXIgd2UgZm91bmQgaXQpXSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NjQKLW1zZ2lkICJJbXBvcnQgRGlyZWN0b3J5IFtwYXJ0cyBvZiAuaWRhdGFdIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjk2NQotbXNnaWQgIlJlc291cmNlIERpcmVjdG9yeSBbLnJzcmNdIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjk2NgotbXNnaWQgIkV4Y2VwdGlvbiBEaXJlY3RvcnkgWy5wZGF0YV0iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTY3Ci1tc2dpZCAiU2VjdXJpdHkgRGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjk2OAotbXNnaWQgIkJhc2UgUmVsb2NhdGlvbiBEaXJlY3RvcnkgWy5yZWxvY10iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTY5Ci1tc2dpZCAiRGVidWcgRGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjk3MAotbXNnaWQgIkRlc2NyaXB0aW9uIERpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NzEKLW1zZ2lkICJTcGVjaWFsIERpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NzIKLW1zZ2lkICJUaHJlYWQgU3RvcmFnZSBEaXJlY3RvcnkgWy50bHNdIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjk3MwotbXNnaWQgIkxvYWQgQ29uZmlndXJhdGlvbiBEaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTc0Ci1tc2dpZCAiQm91bmQgSW1wb3J0IERpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzo5NzUKLW1zZ2lkICJJbXBvcnQgQWRkcmVzcyBUYWJsZSBEaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6OTc2IHBlaWdlbi5jOjk3NyBwZWlnZW4uYzo5NzgKLW1zZ2lkICJSZXNlcnZlZCIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMDIyCi1tc2dpZCAiIgotIlxuIgotIlRoZSBpbXBvcnQgdGFibGUgaXMgdGhlIC5pZGF0YSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTA0NAotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBpcyBhbiBpbXBvcnQgdGFibGUsIGJ1dCB0aGUgc2VjdGlvbiBjb250YWluaW5nIGl0IGNvdWxkIG5vdCBiZSBmb3VuZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEwNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGlzIGFuIGltcG9ydCB0YWJsZSBpbiAlcyBhdCAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEwODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkZ1bmN0aW9uIGRlc2NyaXB0b3IgbG9jYXRlZCBhdCB0aGUgc3RhcnQgYWRkcmVzczogJTA0bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlx0Y29kZS1iYXNlICUwOGx4IHRvYyAobG9hZGFibGUvYWN0dWFsKSAlMDhseC8lMDhseFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEwOTgKLW1zZ2lkICIiCi0iXG4iCi0iTm8gcmVsZGF0YSBzZWN0aW9uISBGdW5jdGlvbiBkZXNjcmlwdG9yIG5vdCBkZWNvZGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjExMDMKLW1zZ2lkICIiCi0iXG4iCi0iVGhlIEltcG9ydCBUYWJsZXMgKGludGVycHJldGVkIC5pZGF0YSBzZWN0aW9uIGNvbnRlbnRzKVxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjExMDUKLW1zZ2lkICIgdm1hOiAgICAgICAgICAgIEhpbnQgICAgVGltZSAgICAgIEZvcndhcmQgIERMTCAgICAgICBGaXJzdFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjExMDcKLW1zZ2lkICIgICAgICAgICAgICAgICAgIFRhYmxlICAgU3RhbXAgICAgIENoYWluICAgIE5hbWUgICAgICBUaHVua1xuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjExNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlx0RExMIE5hbWU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTE2MSBwZWlnZW4uYzoxMjI0Ci1tc2dpZCAiXHR2bWE6ICBIaW50L09yZCBNZW1iZXItTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEyMjMKLW1zZ2lkICJcdFRoZSBJbXBvcnQgQWRkcmVzcyBUYWJsZSAoZGlmZmVyZW5jZSBmb3VuZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMjMwCi1tc2dpZCAiXHQ+Pj4gUmFuIG91dCBvZiBJQVQgbWVtYmVycyFcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMjQ4Ci1tc2dpZCAiXHRUaGUgSW1wb3J0IEFkZHJlc3MgVGFibGUgaXMgaWRlbnRpY2FsXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTI5NwotbXNnaWQgIiIKLSJcbiIKLSJUaGUgZXhwb3J0IHRhYmxlIGlzIHRoZSAuZWRhdGEgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzMTkKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgaXMgYW4gZXhwb3J0IHRhYmxlLCBidXQgdGhlIHNlY3Rpb24gY29udGFpbmluZyBpdCBjb3VsZCBub3QgYmUgZm91bmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBpcyBhbiBleHBvcnQgdGFibGUgaW4gJXMgYXQgMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzU1Ci1tc2dpZCAiIgotIlxuIgotIlRoZSBFeHBvcnQgVGFibGVzIChpbnRlcnByZXRlZCAuZWRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkV4cG9ydCBGbGFncyBcdFx0XHQlbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRpbWUvRGF0ZSBzdGFtcCBcdFx0JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTM2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJNYWpvci9NaW5vciBcdFx0XHQlZC8lZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzNjcKLW1zZ2lkICJOYW1lIFx0XHRcdFx0IgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3JkaW5hbCBCYXNlIFx0XHRcdCVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzNzYKLW1zZ2lkICJOdW1iZXIgaW46XG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTM3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQlbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxMzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlx0W05hbWUgUG9pbnRlci9PcmRpbmFsXSBUYWJsZVx0JWx1XG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTM4NgotbXNnaWQgIlRhYmxlIEFkZHJlc3Nlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjEzODkKLW1zZ2lkICJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTM5NAotbXNnaWQgIlx0TmFtZSBQb2ludGVyIFRhYmxlIFx0XHQiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTM5OQotbXNnaWQgIlx0T3JkaW5hbCBUYWJsZSBcdFx0XHQiCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTQxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRXhwb3J0IEFkZHJlc3MgVGFibGUgLS0gT3JkaW5hbCBCYXNlICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjE0MzYKLW1zZ2lkICJGb3J3YXJkZXIgUlZBIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjE0NDQKLW1zZ2lkICJFeHBvcnQgUlZBIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjE0NTEKLW1zZ2lkICIiCi0iXG4iCi0iW09yZGluYWwvTmFtZSBQb2ludGVyXSBUYWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjE0OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZywgLnBkYXRhIHNlY3Rpb24gc2l6ZSAoJWxkKSBpcyBub3QgYSBtdWx0aXBsZSBvZiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjE1MDAKLW1zZ2lkICIiCi0iXG4iCi0iVGhlIEZ1bmN0aW9uIFRhYmxlIChpbnRlcnByZXRlZCAucGRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNTAyCi1tc2dpZCAiIHZtYTpcdFx0QmVnaW4gICAgRW5kICAgICAgRUggICAgICAgRUggICAgICAgUHJvbG9nRW5kICBFeGNlcHRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNTA0Ci1tc2dpZCAiICAgICBcdFx0QWRkcmVzcyAgQWRkcmVzcyAgSGFuZGxlciAgRGF0YSAgICAgQWRkcmVzcyAgICBNYXNrXG4iCi1tc2dzdHIgIiIKLQotIzogcGVpZ2VuLmM6MTU3NgotbXNnaWQgIiBSZWdpc3RlciBzYXZlIG1pbGxpY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNTc5Ci1tc2dpZCAiIFJlZ2lzdGVyIHJlc3RvcmUgbWlsbGljb2RlIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjE1ODIKLW1zZ2lkICIgR2x1ZSBjb2RlIHNlcXVlbmNlIgotbXNnc3RyICIiCi0KLSM6IHBlaWdlbi5jOjE2MjgKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iUEUgRmlsZSBCYXNlIFJlbG9jYXRpb25zIChpbnRlcnByZXRlZCAucmVsb2Mgc2VjdGlvbiBjb250ZW50cylcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWaXJ0dWFsIEFkZHJlc3M6ICUwOGx4IENodW5rIHNpemUgJWxkICgweCVseCkgTnVtYmVyIG9mIGZpeHVwcyAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZWlnZW4uYzoxNjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlx0cmVsb2MgJTRkIG9mZnNldCAlNHggWyU0bHhdICVzIgotbXNnc3RyICIiCi0KLSMuIFRoZSBNUyBkdW1wYmluIHByb2dyYW0gcmVwb3J0ZWRseSBhbmRzIHdpdGggMHhmZjBmIGJlZm9yZQotIy4gcHJpbnRpbmcgdGhlIGNoYXJhY3RlcmlzdGljcyBmaWVsZC4gIE5vdCBzdXJlIHdoeS4gIE5vIHJlYXNvbiB0bwotIy4gZW11bGF0ZSBpdCBoZXJlLgotIzogcGVpZ2VuLmM6MTcxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ2hhcmFjdGVyaXN0aWNzIDB4JXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDE4Ci1tc2dpZCAiIgotIlxuIgotInBwY2Jvb3QgaGVhZGVyOlxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRW50cnkgb2Zmc2V0ICAgICAgICA9IDB4JS44bHggKCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxlbmd0aCAgICAgICAgICAgICAgPSAweCUuOGx4ICglbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJGbGFnIGZpZWxkICAgICAgICAgID0gMHglLjJ4XG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJQYXJ0aXRpb24gbmFtZSAgICAgID0gXCIlc1wiXG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQ0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUGFydGl0aW9uWyVkXSBzdGFydCAgPSB7IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCB9XG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQ1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJQYXJ0aXRpb25bJWRdIGVuZCAgICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlBhcnRpdGlvblslZF0gc2VjdG9yID0gMHglLjhseCAoJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUGFydGl0aW9uWyVkXSBsZW5ndGggPSAweCUuOGx4ICglbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogc29tLmM6NTMzNQotbXNnaWQgInNvbV9zaXplb2ZfaGVhZGVycyB1bmltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHNyZWMuYzoyOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGAlcycgaW4gUy1yZWNvcmQgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHN5bXMuYzo5NzQKLW1zZ2lkICJVbnN1cHBvcnRlZCAuc3RhYiByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IHZtcy1nc2QuYzozNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkX21ha2Vfc2VjdGlvbiAoJXMpIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtZ3NkLmM6MzcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJmZF9zZXRfc2VjdGlvbl9mbGFncyAoJXMsICV4KSBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLWdzZC5jOjQwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJTaXplIG1pc21hdGNoIHNlY3Rpb24gJXM9JWx4LCAlcz0lbHgiCi1tc2dzdHIgIiIKLQotIzogdm1zLWdzZC5jOjcwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIGdzZC9lZ3NkIHN1YnR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLWhkci5jOjQwNQotbXNnaWQgIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6NTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlN0YWNrIG92ZXJmbG93ICglZCkgaW4gX2JmZF92bXNfcHVzaCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtbWlzYy5jOjU2MAotbXNnaWQgIlN0YWNrIHVuZGVyZmxvdyBpbiBfYmZkX3Ztc19wb3AiCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzo5MzEKLW1zZ2lkICJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB6ZXJvIGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6OTM2Ci1tc2dpZCAiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggdG9vIG1hbnkgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzoxMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyByZXBsYWNlZCBieSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6MTEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gZW50ZXIgJXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY5Ci1tc2dpZCAiTm8gTWVtICEiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjMwOQotbXNnaWQgIkJhZCBzZWN0aW9uIGluZGV4IGluIEVUSVJfU19DX1NUQV9QUSIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuc3VwcG9ydGVkIFNUQSBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjMyOSB2bXMtdGlyLmM6MTI4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBTVEEgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRVRJUl9TX0NfU1RPX0dCTDogbm8gc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NDU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVUSVJfU19DX1NUT19DQTogbm8gc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NDcwCi1tc2dpZCAiRVRJUl9TX0NfU1RPX1JCL0FCOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1MjgKLW1zZ2lkICJFVElSX1NfQ19TVE9fTFBfUFNCOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1MzQKLW1zZ2lkICJFVElSX1NfQ19TVE9fSElOVF9HQkw6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTQwCi1tc2dpZCAiRVRJUl9TX0NfU1RPX0hJTlRfUFM6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTQ0IHZtcy10aXIuYzoxNDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIFNUTyBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY1NwotbXNnaWQgIkVUSVJfU19DX09QUl9JTlNWOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2NzUKLW1zZ2lkICJFVElSX1NfQ19PUFJfVVNIOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2ODEKLW1zZ2lkICJFVElSX1NfQ19PUFJfUk9UOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo3MDAKLW1zZ2lkICJFVElSX1NfQ19PUFJfUkVERUY6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjcwNgotbXNnaWQgIkVUSVJfU19DX09QUl9ERkxJVDogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NzEwIHZtcy10aXIuYzoxNjU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIE9QUiBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjc3OSB2bXMtdGlyLmM6MTcyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBDVEwgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo4MDgKLW1zZ2lkICJFVElSX1NfQ19TVENfTFA6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjgyNgotbXNnaWQgIkVUSVJfU19DX1NUQ19HQkw6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjgzNAotbXNnaWQgIkVUSVJfU19DX1NUQ19HQ0E6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjg0MwotbXNnaWQgIkVUSVJfU19DX1NUQ19QUzogbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKiBzdGFjayBieXRlIGZyb20gaW1hZ2UKLSMuICogYXJnOiAtCi0jLiAqCi0jLgotIzogdm1zLXRpci5jOjExODcKLW1zZ2lkICJTdGFjay1mcm9tLWltYWdlIG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTIwNwotbXNnaWQgIlN0YWNrLWVudHJ5LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSMuCi0jLiAqIGNvbXBhcmUgcHJvY2VkdXJlIGFyZ3VtZW50Ci0jLiAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLSMuICoJYnkJYXJndW1lbnQgaW5kZXgKLSMuICoJZGEJYXJndW1lbnQgZGVzY3JpcHRvcgotIy4gKgotIy4gKiBjb21wYXJlIGFyZ3VtZW50IGRlc2NyaXB0b3Igd2l0aCBzeW1ib2wgYXJndW1lbnQgKEFSRyRWX1BBU1NNRUNIKQotIy4gKiBhbmQgc3RhY2sgVFJVRSAoYXJncyBtYXRjaCkgb3IgRkFMU0UgKGFyZ3MgZG9udCBtYXRjaCkgdmFsdWUKLSMuCi0jOiB2bXMtdGlyLmM6MTIyMwotbXNnaWQgIlBBU1NNRUNIIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTI0MwotbXNnaWQgIlN0YWNrLWxvY2FsLXN5bWJvbCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjEyNTgKLW1zZ2lkICJTdGFjay1saXRlcmFsIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTI4MAotbXNnaWQgIlN0YWNrLWxvY2FsLXN5bWJvbC1lbnRyeS1wb2ludC1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmltcGxlbWVudGVkIFNUTyBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE1OTYKLW1zZ2lkICJUSVJfU19DX09QUl9BU0ggaW5jb21wbGV0ZSIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTYxMAotbXNnaWQgIlRJUl9TX0NfT1BSX1VTSCBpbmNvbXBsZXRlIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNjI0Ci1tc2dpZCAiVElSX1NfQ19PUFJfUk9UIGluY29tcGxldGUiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogcmVkZWZpbmUgc3ltYm9sIHRvIGN1cnJlbnQgbG9jYXRpb24KLSMuCi0jOiB2bXMtdGlyLmM6MTY0NQotbXNnaWQgIlRJUl9TX0NfT1BSX1JFREVGIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogZGVmaW5lIGEgbGl0ZXJhbAotIy4KLSM6IHZtcy10aXIuYzoxNjUyCi1tc2dpZCAiVElSX1NfQ19PUFJfREZMSVQgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcwNwotbXNnaWQgIlRJUl9TX0NfQ1RMX0RGTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcxNQotbXNnaWQgIlRJUl9TX0NfQ1RMX1NUTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcyMwotbXNnaWQgIlRJUl9TX0NfQ1RMX1NUS0RMIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTc3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJPYmogY29kZSAlZCBub3QgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjIxMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU0VDX1JFTE9DIHdpdGggbm8gcmVsb2NzIGluIHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjI0MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5oYW5kbGVkIHJlbG9jYXRpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTY2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYCVzJyBoYXMgbGluZSBudW1iZXJzIGJ1dCBubyBlbmNsb3Npbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjbGFzcyAlZCBzeW1ib2wgYCVzJyBoYXMgbm8gYXV4IGVudHJpZXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTczNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBjc2VjdCB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE3NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCBYVFlfRVIgc3ltYm9sIGAlcyc6IGNsYXNzICVkIHNjbnVtICVkIHNjbmxlbiAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBYTUNfVEMwIHN5bWJvbCBgJXMnIGlzIGNsYXNzICVkIHNjbmxlbiAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxOTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzeW1ib2wgYCVzJyBoYXMgdW5yZWNvZ25pemVkIHNtY2xhcyAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxOTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjc2VjdCBgJXMnIG5vdCBpbiBlbmNsb3Npbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyMDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBtaXNwbGFjZWQgWFRZX0xEIGAlcyciCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MjM0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVsb2MgJXM6JWQgbm90IGluIGNzZWN0IgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjI0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFhDT0ZGIHNoYXJlZCBvYmplY3Qgd2hlbiBub3QgcHJvZHVjaW5nIFhDT0ZGIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyNTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkeW5hbWljIG9iamVjdCB3aXRoIG5vIC5sb2FkZXIgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzozMTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBzdWNoIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzozNzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIndhcm5pbmc6IGF0dGVtcHQgdG8gZXhwb3J0IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo0NzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRPQyBvdmVyZmxvdzogMHglbHggPiAweDEwMDAwOyB0cnkgLW1taW5pbWFsLXRvYyB3aGVuIGNvbXBpbGluZyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTM0IHhjb2ZmbGluay5jOjU4OTAgeGNvZmZsaW5rLmM6NTkyNyB4Y29mZmxpbmsuYzo2MjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTU2IHhjb2ZmbGluay5jOjYyNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGAlcycgaW4gbG9hZGVyIHJlbG9jIGJ1dCBub3QgbG9hZGVyIHN5bSIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsb2FkZXIgcmVsb2MgaW4gcmVhZC1vbmx5IHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6NjQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo2NDk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBUT0MgcmVsb2MgYXQgMHgleCB0byBzeW1ib2wgYCVzJyB3aXRoIG5vIFRPQyBlbnRyeSIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvYmZkL3BwY2Jvb3QuYyBiL2JmZC9wcGNib290LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZGI4MjYuLjAwMDAwMDAKLS0tIGEvYmZkL3BwY2Jvb3QuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFBQQ2J1ZyBib290IHJlY29yZHMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQsIDxtZWlzc25lckBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBCRkQgYmFja2VuZCB3aGljaCBtYXkgYmUgdXNlZCB0byB3cml0ZSBQb3dlclBDQnVnIGJvb3Qgb2JqZWN0cy4KLSAgIEl0IG1heSBvbmx5IGJlIHVzZWQgZm9yIG91dHB1dCwgbm90IGlucHV0LiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHRoaXMgbWF5Ci0gICBiZSB1c2VkIGFzIGFuIG91dHB1dCBmb3JtYXQgZm9yIG9iamNvcHkgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgcmF3IGJpbmFyeQotICAgZGF0YS4KLQotICAgVGhpcyBpcyB2ZXJ5IHNpbXBsZS4gIFRoZSBvbmx5IGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSByZWFsIGRhdGEKLSAgIHdpbGwgc3RhcnQgYXQgc29tZSBhZGRyZXNzIFgsIGFuZCBpbiBzb21lIGNhc2VzIHdlIHdpbGwgbm90IHdhbnQgdG8KLSAgIGluY2x1ZGUgWCB6ZXJvZXMganVzdCB0byBnZXQgdG8gdGhhdCBwb2ludC4gIFNpbmNlIHRoZSBzdGFydAotICAgYWRkcmVzcyBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQsIHdlIHVzZSBpdAotICAgaW5zdGVhZCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBzdGFydCBvZgotICAgdGhlIGZpbGUuICBvYmpjb3B5IGNvb3BlcmF0ZXMgYnkgc3BlY2lhbGx5IHNldHRpbmcgdGhlIHN0YXJ0Ci0gICBhZGRyZXNzIHRvIHplcm8gYnkgZGVmYXVsdC4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFBQQ2J1ZyBsb2NhdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfbG9jYXRpb24gewotICBiZmRfYnl0ZQlpbmQ7Ci0gIGJmZF9ieXRlCWhlYWQ7Ci0gIGJmZF9ieXRlCXNlY3RvcjsKLSAgYmZkX2J5dGUJY3lsaW5kZXI7Ci19IHBwY2Jvb3RfbG9jYXRpb25fdDsKLQotLyogUFBDYnVnIHBhcnRpdGlvbiB0YWJsZSBsYXlvdXQgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfcGFydGl0aW9uIHsKLSAgcHBjYm9vdF9sb2NhdGlvbl90CXBhcnRpdGlvbl9iZWdpbjsJLyogcGFydGl0aW9uIGJlZ2luICovCi0gIHBwY2Jvb3RfbG9jYXRpb25fdAlwYXJ0aXRpb25fZW5kOwkJLyogcGFydGl0aW9uIGVuZCAqLwotICBiZmRfYnl0ZQkJc2VjdG9yX2JlZ2luWzRdOwkvKiAzMi1iaXQgc3RhcnQgUkJBICh6ZXJvLWJhc2VkKSwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJc2VjdG9yX2xlbmd0aFs0XTsJLyogMzItYml0IFJCQSBjb3VudCAob25lLWJhc2VkKSwgbGl0dGxlIGVuZGlhbiAqLwotfSBwcGNib290X3BhcnRpdGlvbl90OwotCi0vKiBQUENidWcgYm9vdCBsYXlvdXQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9oZHIgewotICBiZmRfYnl0ZQkJcGNfY29tcGF0aWJpbGl0eVs0NDZdOwkvKiB4ODYgaW5zdHJ1Y3Rpb24gZmllbGQgKi8KLSAgcHBjYm9vdF9wYXJ0aXRpb25fdAlwYXJ0aXRpb25bNF07CQkvKiBwYXJ0aXRpb24gaW5mb3JtYXRpb24gKi8KLSAgYmZkX2J5dGUJCXNpZ25hdHVyZVsyXTsJCS8qIDB4NTUgYW5kIDB4YWEgKi8KLSAgYmZkX2J5dGUJCWVudHJ5X29mZnNldFs0XTsJLyogZW50cnkgcG9pbnQgb2Zmc2V0LCBsaXR0bGUgZW5kaWFuICovCi0gIGJmZF9ieXRlCQlsZW5ndGhbNF07CQkvKiBsb2FkIGltYWdlIGxlbmd0aCwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJZmxhZ3M7CQkJLyogZmxhZyBmaWVsZCAqLwotICBiZmRfYnl0ZQkJb3NfaWQ7CQkJLyogT1NfSUQgKi8KLSAgY2hhcgkJCXBhcnRpdGlvbl9uYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUgKi8KLSAgYmZkX2J5dGUJCXJlc2VydmVkMVs0NzBdOwkJLyogcmVzZXJ2ZWQgKi8KLX0gcHBjYm9vdF9oZHJfdDsKLQotLyogU2lnbmF0dXJlIGJ5dGVzIGZvciBsYXN0IDIgYnl0ZXMgb2YgdGhlIDUxMiBieXRlIHJlY29yZCAqLwotI2RlZmluZSBTSUdOQVRVUkUwIDB4NTUKLSNkZWZpbmUgU0lHTkFUVVJFMSAweGFhCi0KLS8qIFBvd2VyUEMgYm9vdCB0eXBlICovCi0jZGVmaW5lIFBQQ19JTkQgMHg0MQotCi0vKiBJbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHBwY2Jvb3QgaGVhZGVyICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X2RhdGEgewotICBwcGNib290X2hkcl90CWhlYWRlcjsJCQkJLyogcmF3IGhlYWRlciAqLwotICBhc2VjdGlvbiAqc2VjOwkJCQkvKiBzaW5nbGUgc2VjdGlvbiAqLwotfSBwcGNib290X2RhdGFfdDsKLQotLyogQW55IGJmZCB3ZSBjcmVhdGUgYnkgcmVhZGluZyBhIHBwY2Jvb3QgZmlsZSBoYXMgdGhyZWUgc3ltYm9sczoKLSAgIGEgc3RhcnQgc3ltYm9sLCBhbiBlbmQgc3ltYm9sLCBhbmQgYW4gYWJzb2x1dGUgbGVuZ3RoIHN5bWJvbC4gICovCi0jZGVmaW5lIFBQQ0JPT1RfU1lNUyAzCi0KLXN0YXRpYyBib29sZWFuIHBwY2Jvb3RfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpwcGNib290X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGxvbmcgcHBjYm9vdF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqbWFuZ2xlX25hbWUgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotc3RhdGljIGxvbmcgcHBjYm9vdF9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqcHBjYm9vdF9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgcHBjYm9vdF9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGludCBwcGNib290X3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotI2RlZmluZSBwcGNib290X3NldF90ZGF0YShhYmZkLCBwdHIpICgoYWJmZCktPnRkYXRhLmFueSA9IChQVFIpIChwdHIpKQotI2RlZmluZSBwcGNib290X2dldF90ZGF0YShhYmZkKSAoKHBwY2Jvb3RfZGF0YV90ICopICgoYWJmZCktPnRkYXRhLmFueSkpCi0MCi0vKiBDcmVhdGUgYSBwcGNib290IG9iamVjdC4gIEludm9rZWQgdmlhIGJmZF9zZXRfZm9ybWF0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3RfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFwcGNib290X2dldF90ZGF0YSAoYWJmZCkpCi0gICAgcHBjYm9vdF9zZXRfdGRhdGEgKGFiZmQsIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAocHBjYm9vdF9kYXRhX3QpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIHRvIFBvd2VyUEMgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNib290X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQotICBlbHNlIGlmIChhcmNoICE9IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotDAotLyogQW55IGZpbGUgbWF5IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBwcGNib290IGZpbGUsIHByb3ZpZGVkIHRoZSB0YXJnZXQKLSAgIHdhcyBub3QgZGVmYXVsdGVkLiAgVGhhdCBpcywgaXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBhcwotICAgYmVpbmcgcHBjYm9vdC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXBwY2Jvb3Rfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgcHBjYm9vdF9oZHJfdCBoZHI7Ci0gIHNpemVfdCBpOwotICBwcGNib290X2RhdGFfdCAqdGRhdGE7Ci0KLSAgQkZEX0FTU0VSVCAoc2l6ZW9mIChwcGNib290X2hkcl90KSA9PSAxMDI0KTsKLQotICBpZiAoYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBGaW5kIHRoZSBmaWxlIHNpemUuICAqLwotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoKHNpemVfdCkgc3RhdGJ1Zi5zdF9zaXplIDwgc2l6ZW9mIChwcGNib290X2hkcl90KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIHNpemVvZiAoaGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mIChoZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyBzb21lIGJhc2ljIGNoZWNrcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGhkci5wY19jb21wYXRpYmlsaXR5KTsgaSsrKQotICAgIGlmIChoZHIucGNfY29tcGF0aWJpbGl0eVtpXSkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICBpZiAoaGRyLnNpZ25hdHVyZVswXSAhPSBTSUdOQVRVUkUwIHx8IGhkci5zaWduYXR1cmVbMV0gIT0gU0lHTkFUVVJFMSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoaGRyLnBhcnRpdGlvblswXS5wYXJ0aXRpb25fZW5kLmluZCAhPSBQUENfSU5EKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFiZmQtPnN5bWNvdW50ID0gUFBDQk9PVF9TWU1TOwotCi0gIC8qIE9uZSBkYXRhIHNlY3Rpb24uICAqLwotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRhdGEiKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzZWMtPmZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUzsKLSAgc2VjLT52bWEgPSAwOwotICBzZWMtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZSAtIHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci0gIHNlYy0+ZmlsZXBvcyA9IHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci0KLSAgcHBjYm9vdF9ta29iamVjdCAoYWJmZCk7Ci0gIHRkYXRhID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpOwotICB0ZGF0YS0+c2VjID0gc2VjOwotICBtZW1jcHkgKChQVFIpICZ0ZGF0YS0+aGVhZGVyLCAoUFRSKSAmaGRyLCBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpKTsKLQotICBwcGNib290X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Bvd2VycGMsIDApOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2RlZmluZSBwcGNib290X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBwcGNib290X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBwcGNib290X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotDAotLyogR2V0IGNvbnRlbnRzIG9mIHRoZSBvbmx5IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0ICsgc2l6ZW9mKHBwY2Jvb3RfaGRyX3QpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotcHBjYm9vdF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIChQUENCT09UX1NZTVMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotDAotLyogQ3JlYXRlIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGJmZCdzIGZpbGVuYW1lLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbWFuZ2xlX25hbWUgKGFiZmQsIHN1ZmZpeCkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdWZmaXg7Ci17Ci0gIGludCBzaXplOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnA7Ci0KLSAgc2l6ZSA9IChzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCSAgKyBzdHJsZW4gKHN1ZmZpeCkKLQkgICsgc2l6ZW9mICJfcHBjYm9vdF9fIik7Ci0KLSAgYnVmID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAiIjsKLQotICBzcHJpbnRmIChidWYsICJfcHBjYm9vdF8lc18lcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdWZmaXgpOwotCi0gIC8qIENoYW5nZSBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHRvIHVuZGVyc2NvcmVzLiAgKi8KLSAgZm9yIChwID0gYnVmOyAqcDsgcCsrKQotICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkpCi0gICAgICAqcCA9ICdfJzsKLQotICByZXR1cm4gYnVmOwotfQotCi0MCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1wcGNib290X2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBhc2VjdGlvbiAqc2VjID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpLT5zZWM7Ci0gIGFzeW1ib2wgKnN5bXM7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIFBQQ0JPT1RfU1lNUyAqIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAoc3ltcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTdGFydCBzeW1ib2wuICAqLwotICBzeW1zWzBdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzBdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInN0YXJ0Iik7Ci0gIHN5bXNbMF0udmFsdWUgPSAwOwotICBzeW1zWzBdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1swXS5zZWN0aW9uID0gc2VjOwotICBzeW1zWzBdLnVkYXRhLnAgPSBOVUxMOwotCi0gIC8qIEVuZCBzeW1ib2wuICAqLwotICBzeW1zWzFdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzFdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgImVuZCIpOwotICBzeW1zWzFdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMV0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzFdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMV0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogU2l6ZSBzeW1ib2wuICAqLwotICBzeW1zWzJdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzJdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInNpemUiKTsKLSAgc3ltc1syXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICBzeW1zWzJdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1syXS5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgc3ltc1syXS51ZGF0YS5wID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgUFBDQk9PVF9TWU1TOyBpKyspCi0gICAgKmFsb2NhdGlvbisrID0gc3ltcysrOwotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gUFBDQk9PVF9TWU1TOwotfQotCi0MCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXBwY2Jvb3RfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci19Ci0KLQwKLSNkZWZpbmUgcHBjYm9vdF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0KLS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNib290X2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLSNkZWZpbmUgcHBjYm9vdF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHBwY2Jvb3RfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHBwY2Jvb3RfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBwcGNib290X21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfMGwpCi0jZGVmaW5lIHBwY2Jvb3RfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0MCi0vKiBXcml0ZSBzZWN0aW9uIGNvbnRlbnRzIG9mIGEgcHBjYm9vdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3Rfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxvdzsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBUaGUgbG93ZXN0IHNlY3Rpb24gVk1BIHNldHMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQKLSAgICAgICAgIG9mIHRoZSBmaWxlLiAgV2UgdXNlIHRoZSBzZXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgYWxsIHRoZQotICAgICAgICAgc2VjdGlvbnMuICAqLwotICAgICAgbG93ID0gYWJmZC0+c2VjdGlvbnMtPnZtYTsKLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zLT5uZXh0OyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmIChzLT52bWEgPCBsb3cpCi0JICBsb3cgPSBzLT52bWE7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXMtPmZpbGVwb3MgPSBzLT52bWEgLSBsb3c7Ci0KLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLQwKLXN0YXRpYyBpbnQKLXBwY2Jvb3Rfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci19Ci0KLQwKLS8qIFByaW50IG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIGZhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZhcmc7Ci17Ci0gIEZJTEUgKmYgPSAoRklMRSAqKWZhcmc7Ci0gIHBwY2Jvb3RfZGF0YV90ICp0ZGF0YSA9IHBwY2Jvb3RfZ2V0X3RkYXRhIChhYmZkKTsKLSAgbG9uZyBlbnRyeV9vZmZzZXQgPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIuZW50cnlfb2Zmc2V0KTsKLSAgbG9uZyBsZW5ndGggPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIubGVuZ3RoKTsKLSAgaW50IGk7Ci0KLSAgZnByaW50ZiAoZiwgXygiXG5wcGNib290IGhlYWRlcjpcbiIpKTsKLSAgZnByaW50ZiAoZiwgXygiRW50cnkgb2Zmc2V0ICAgICAgICA9IDB4JS44bHggKCVsZClcbiIpLCBlbnRyeV9vZmZzZXQsIGVudHJ5X29mZnNldCk7Ci0gIGZwcmludGYgKGYsIF8oIkxlbmd0aCAgICAgICAgICAgICAgPSAweCUuOGx4ICglbGQpXG4iKSwgbGVuZ3RoLCBsZW5ndGgpOwotCi0gIGlmICh0ZGF0YS0+aGVhZGVyLmZsYWdzKQotICAgIGZwcmludGYgKGYsIF8oIkZsYWcgZmllbGQgICAgICAgICAgPSAweCUuMnhcbiIpLCB0ZGF0YS0+aGVhZGVyLmZsYWdzKTsKLQotICBpZiAodGRhdGEtPmhlYWRlci5vc19pZCkKLSAgICBmcHJpbnRmIChmLCAiT1NfSUQgICAgICAgICAgICAgICA9IDB4JS4yeFxuIiwgdGRhdGEtPmhlYWRlci5vc19pZCk7Ci0KLSAgaWYgKHRkYXRhLT5oZWFkZXIucGFydGl0aW9uX25hbWUpCi0gICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uIG5hbWUgICAgICA9IFwiJXNcIlxuIiksIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uX25hbWUpOwotCi0gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgbG9uZyBzZWN0b3JfYmVnaW4gID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5zZWN0b3JfYmVnaW4pOwotICAgICAgbG9uZyBzZWN0b3JfbGVuZ3RoID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5zZWN0b3JfbGVuZ3RoKTsKLQotICAgICAgLyogU2tpcCBhbGwgMCBlbnRyaWVzICovCi0gICAgICBpZiAoIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5pbmQKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaGVhZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5zZWN0b3IKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uY3lsaW5kZXIKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmluZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaGVhZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuc2VjdG9yCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5jeWxpbmRlcgotCSAgJiYgIXNlY3Rvcl9iZWdpbiAmJiAhc2VjdG9yX2xlbmd0aCkKLQljb250aW51ZTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5QYXJ0aXRpb25bJWRdIHN0YXJ0ICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIpLCBpLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaW5kLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaGVhZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLnNlY3RvciwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmN5bGluZGVyKTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uWyVkXSBlbmQgICAgPSB7IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCB9XG4iKSwgaSwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5pbmQsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaGVhZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5zZWN0b3IsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuY3lsaW5kZXIpOwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIHNlY3RvciA9IDB4JS44bHggKCVsZClcbiIpLCBpLCBzZWN0b3JfYmVnaW4sIHNlY3Rvcl9iZWdpbik7Ci0gICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIGxlbmd0aCA9IDB4JS44bHggKCVsZClcbiIpLCBpLCBzZWN0b3JfbGVuZ3RoLCBzZWN0b3JfbGVuZ3RoKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZiwgIlxuIik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0MCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBwcGNib290X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgcHBjYm9vdF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBwcGNib290X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBwcGNib290X2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdCBwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLWNvbnN0IGJmZF90YXJnZXQgcHBjYm9vdF92ZWMgPQotewotICAicHBjYm9vdCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwJLyogZmxhdm91ciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGJ5dGVvcmRlciBpcyBiaWcgZW5kaWFuIGZvciBjb2RlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyX2J5dGVvcmRlciAqLwotICBFWEVDX1AsCQkJLyogb2JqZWN0X2ZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMpLCAvKiBzZWN0aW9uX2ZsYWdzICovCi0gIDAsCQkJCS8qIHN5bWJvbF9sZWFkaW5nX2NoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCi0gIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHBwY2Jvb3Rfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgcHBjYm9vdF9ta29iamVjdCwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfdHJ1ZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9iZmQvcHRyYWNlLWNvcmUuYyBiL2JmZC9wdHJhY2UtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTY5ZGNlLi4wMDAwMDAwCi0tLSBhL2JmZC9wdHJhY2UtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBjb3JlIGZpbGVzIHdoaWNoIHVzZSB0aGUgcHRyYWNlX3VzZXIgc3RydWN0dXJlCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRyYWQtY29yZS5jIHdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlCi0gICBvZiBDeWdudXMgU3VwcG9ydC4KLSAgIE1vZGlmaWVkIHRvIHdvcmsgd2l0aCB0aGUgcHRyYWNlX3VzZXIgc3RydWN0dXJlIGJ5IEtldmluIEEuIEJ1ZXR0bmVyLgotICAgKExvbmd0ZXJtIGl0IG1heSBiZSBiZXR0ZXIgdG8gbWVyZ2UgdGhpcyBmaWxlIHdpdGggdHJhZC1jb3JlLmMpCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIFBUUkFDRV9DT1JFCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0KLQotc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QKLSAgewotICAgIGFzZWN0aW9uICpkYXRhX3NlY3Rpb247Ci0gICAgYXNlY3Rpb24gKnN0YWNrX3NlY3Rpb247Ci0gICAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOwotICAgIHN0cnVjdCBwdHJhY2VfdXNlciB1OwotICB9OwotCi0jZGVmaW5lIGNvcmVfdXBhZ2UoYmZkKSAoJigoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUpKQotI2RlZmluZSBjb3JlX2RhdGFzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5kYXRhX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfc3RhY2tzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5zdGFja19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnJlZ19zZWN0aW9uKQotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICpwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNoYXIgKgkJcHRyYWNlX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWludAkJcHRyYWNlX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbgkJcHRyYWNlX3VuaXhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0JCQkgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCkpOwotc3RhdGljIHZvaWQJc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEFSR1NVU0VEICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXB0cmFjZV91bml4X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0KLXsKLSAgaW50IHZhbDsKLSAgc3RydWN0IHB0cmFjZV91c2VyIHU7Ci0gIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICpyYXdwdHI7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJnUsIDEsIHNpemVvZiB1LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgdSB8fCB1LnB0X21hZ2ljICE9IF9CQ1NfUFRSQUNFX01BR0lDIAotICAgICAgfHwgdS5wdF9yZXYgIT0gX0JDU19QVFJBQ0VfUkVWKQotICAgIHsKLSAgICAgIC8qIFRvbyBzbWFsbCB0byBiZSBhIGNvcmUgZmlsZSAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgLyogQWxsb2NhdGUgYm90aCB0aGUgdXBhZ2UgYW5kIHRoZSBzdHJ1Y3QgY29yZV9kYXRhIGF0IG9uY2UsIHNvCi0gICAgIGEgc2luZ2xlIGZyZWUoKSB3aWxsIGZyZWUgdGhlbSBib3RoLiAgKi8KLSAgcmF3cHRyID0gKHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QpKTsKLQotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YSA9IHJhd3B0cjsKLQotICByYXdwdHItPnUgPSB1OyAvKkNvcHkgdGhlIHVhcmVhIGludG8gdGhlIHRkYXRhIHBhcnQgb2YgdGhlIGJmZCAqLwotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHJhdW5jaHksIGJ1dCBiZmRfY2xvc2Ugd2FudHMgdG8gZnJlZQotICAgICB0aGVtIHNlcGFyYXRlbHkuICAqLwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfc3RhY2tzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9kYXRhc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5hbWUgPSAiLnN0YWNrIjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmFtZSA9ICIuZGF0YSI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKLQotICAvKiBGSVhNRTogIE5lZWQgdG8gd29ycnkgYWJvdXQgc2hhcmVkIG1lbW9yeSwgbGlicmFyeSBkYXRhLCBhbmQgbGlicmFyeQotICAgICB0ZXh0LiAgSSBkb24ndCB0aGluayB0aGF0IGFueSBvZiB0aGVzZSB0aGluZ3MgYXJlIHN1cHBvcnRlZCBvbiB0aGUKLSAgICAgc3lzdGVtIG9uIHdoaWNoIEkgYW0gZGV2ZWxvcGluZyB0aGlzIGZvciB0aG91Z2guICovCi0KLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSAgdS5wdF9kc2l6ZTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHUucHRfc3NpemU7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+X3Jhd19zaXplID0gc2l6ZW9mKHUpOwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IHUucHRfb19kYXRhX3N0YXJ0OwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gVVNSU1RBQ0sgLSB1LnB0X3NzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IDAgLSBzaXplb2YodSk7CS8qIHNlZSB0cmFkLWNvcmUuYyAqLwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSAoaW50KSB1LnB0X2RhdGFwdHI7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5maWxlcG9zID0gKGludCkgKHUucHRfZGF0YXB0ciArIHUucHRfZHNpemUpOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZpbGVwb3MgPSAwOyAvKiBSZWdpc3RlciBzZWdtZW50IGlzIHB0cmFjZV91c2VyICovCi0KLSAgLyogQWxpZ24gdG8gd29yZCBhdCBsZWFzdCAqLwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGFiZmQtPnNlY3Rpb25zID0gY29yZV9zdGFja3NlYyAoYWJmZCk7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9kYXRhc2VjIChhYmZkKTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWNoYXIgKgotcHRyYWNlX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpjb20gPSBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS5wdF9jb21tOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUucHRfc2lnZnJhbWUuc2lnX251bTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWJvb2xlYW4KLXB0cmFjZV91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICAvKiBGSVhNRTogVXNlIHB0X3RpbWRhdCBmaWVsZCBvZiB0aGUgcHRyYWNlX3VzZXIgc3RydWN0dXJlIHRvIG1hdGNoIAotICAgICB0aGUgZGF0ZSBvZiB0aGUgZXhlY3V0YWJsZSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IHB0cmFjZV9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAidHJhZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgcHRyYWNlX3VuaXhfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChwdHJhY2VfdW5peCksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLSNlbmRpZiAvKiBQVFJBQ0VfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL3JlbG9jLmMgYi9iZmQvcmVsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzMThlNi4uMDAwMDAwMAotLS0gYS9iZmQvcmVsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NzggKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIGhhbmRsaW5nIHJlbG9jYXRpb24gZW50cmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JUmVsb2NhdGlvbnMKLQotCUJGRCBtYWludGFpbnMgcmVsb2NhdGlvbnMgaW4gbXVjaCB0aGUgc2FtZSB3YXkgaXQgbWFpbnRhaW5zCi0Jc3ltYm9sczogdGhleSBhcmUgbGVmdCBhbG9uZSB1bnRpbCByZXF1aXJlZCwgdGhlbiByZWFkIGluCi0JZW4tbWFzc2UgYW5kIHRyYW5zbGF0ZWQgaW50byBhbiBpbnRlcm5hbCBmb3JtLiAgQSBjb21tb24KLQlyb3V0aW5lIDw8YmZkX3BlcmZvcm1fcmVsb2NhdGlvbj4+IGFjdHMgdXBvbiB0aGUKLQljYW5vbmljYWwgZm9ybSB0byBkbyB0aGUgZml4dXAuCi0KLQlSZWxvY2F0aW9ucyBhcmUgbWFpbnRhaW5lZCBvbiBhIHBlciBzZWN0aW9uIGJhc2lzLAotCXdoaWxlIHN5bWJvbHMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgQkZEIGJhc2lzLgotCi0JQWxsIHRoYXQgYSBiYWNrIGVuZCBoYXMgdG8gZG8gdG8gZml0IHRoZSBCRkQgaW50ZXJmYWNlIGlzIHRvIGNyZWF0ZQotCWEgPDxzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnk+PiBmb3IgZWFjaCByZWxvY2F0aW9uCi0JaW4gYSBwYXJ0aWN1bGFyIHNlY3Rpb24sIGFuZCBmaWxsIGluIHRoZSByaWdodCBiaXRzIG9mIHRoZSBzdHJ1Y3R1cmVzLgotCi1AbWVudQotQCogdHlwZWRlZiBhcmVsZW50OjoKLUAqIGhvd3RvIG1hbmFnZXI6OgotQGVuZCBtZW51Ci0KLSovCi0KLS8qIERPIGNvbXBpbGUgaW4gdGhlIHJlbG9jX2NvZGUgbmFtZSB0YWJsZSBmcm9tIGxpYmJmZC5oLiAgKi8KLSNkZWZpbmUgX0JGRF9NQUtFX1RBQkxFX2JmZF9yZWxvY19jb2RlX3JlYWwKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLS8qCi1ET0NERAotSU5PREUKLQl0eXBlZGVmIGFyZWxlbnQsIGhvd3RvIG1hbmFnZXIsIFJlbG9jYXRpb25zLCBSZWxvY2F0aW9ucwotCi1TVUJTRUNUSU9OCi0JdHlwZWRlZiBhcmVsZW50Ci0KLQlUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgYSByZWxvY2F0aW9uIGVudHJ5OgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBlbnVtIGJmZF9yZWxvY19zdGF0dXMKLS57Ci0uICAgICAgIHsqIE5vIGVycm9ycyBkZXRlY3RlZCAqfQotLiAgYmZkX3JlbG9jX29rLAotLgotLiAgICAgICB7KiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgdGhlcmUgd2FzIGFuIG92ZXJmbG93LiAqfQotLiAgYmZkX3JlbG9jX292ZXJmbG93LAotLgotLiAgICAgICB7KiBUaGUgYWRkcmVzcyB0byByZWxvY2F0ZSB3YXMgbm90IHdpdGhpbiB0aGUgc2VjdGlvbiBzdXBwbGllZC4gKn0KLS4gIGJmZF9yZWxvY19vdXRvZnJhbmdlLAotLgotLiAgICAgICB7KiBVc2VkIGJ5IHNwZWNpYWwgZnVuY3Rpb25zICp9Ci0uICBiZmRfcmVsb2NfY29udGludWUsCi0uCi0uICAgICAgIHsqIFVuc3VwcG9ydGVkIHJlbG9jYXRpb24gc2l6ZSByZXF1ZXN0ZWQuICp9Ci0uICBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkLAotLgotLiAgICAgICB7KiBVbnVzZWQgKn0KLS4gIGJmZF9yZWxvY19vdGhlciwKLS4KLS4gICAgICAgeyogVGhlIHN5bWJvbCB0byByZWxvY2F0ZSBhZ2FpbnN0IHdhcyB1bmRlZmluZWQuICp9Ci0uICBiZmRfcmVsb2NfdW5kZWZpbmVkLAotLgotLiAgICAgICB7KiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgbWF5IG5vdCBiZSBvayAtIHByZXNlbnRseQotLiAgICAgICAgICBnZW5lcmF0ZWQgb25seSB3aGVuIGxpbmtpbmcgaTk2MCBjb2ZmIGZpbGVzIHdpdGggaTk2MCBiLm91dAotLiAgICAgICAgICBzeW1ib2xzLiAgSWYgdGhpcyB0eXBlIGlzIHJldHVybmVkLCB0aGUgZXJyb3JfbWVzc2FnZSBhcmd1bWVudAotLiAgICAgICAgICB0byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHdpbGwgYmUgc2V0LiAgKn0KLS4gIGJmZF9yZWxvY19kYW5nZXJvdXMKLS4gfQotLiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGU7Ci0uCi0uCi0udHlwZWRlZiBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkKLS57Ci0uICAgICAgIHsqIEEgcG9pbnRlciBpbnRvIHRoZSBjYW5vbmljYWwgdGFibGUgb2YgcG9pbnRlcnMgICp9Ci0uICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltX3B0cl9wdHI7Ci0uCi0uICAgICAgIHsqIG9mZnNldCBpbiBzZWN0aW9uICp9Ci0uICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7Ci0uCi0uICAgICAgIHsqIGFkZGVuZCBmb3IgcmVsb2NhdGlvbiB2YWx1ZSAqfQotLiAgYmZkX3ZtYSBhZGRlbmQ7Ci0uCi0uICAgICAgIHsqIFBvaW50ZXIgdG8gaG93IHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIHJlbG9jYXRpb24gKn0KLS4gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotLgotLn0gYXJlbGVudDsKLQotKi8KLQotLyoKLURFU0NSSVBUSU9OCi0KLSAgICAgICAgSGVyZSBpcyBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggb2YgdGhlIGZpZWxkcyB3aXRoaW4gYW4gPDxhcmVsZW50Pj46Ci0KLSAgICAgICAgbyA8PHN5bV9wdHJfcHRyPj4KLQotICAgICAgICBUaGUgc3ltYm9sIHRhYmxlIHBvaW50ZXIgcG9pbnRzIHRvIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sCi0gICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2NhdGlvbiByZXF1ZXN0LiAgSXQgaXMKLSAgICAgICAgdGhlIHBvaW50ZXIgaW50byB0aGUgdGFibGUgcmV0dXJuZWQgYnkgdGhlIGJhY2sgZW5kJ3MKLSAgICAgICAgPDxnZXRfc3ltdGFiPj4gYWN0aW9uLiBAeHJlZntTeW1ib2xzfS4gVGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkCi0gICAgICAgIHRocm91Z2ggYSBwb2ludGVyIHRvIGEgcG9pbnRlciBzbyB0aGF0IHRvb2xzIGxpa2UgdGhlIGxpbmtlcgotICAgICAgICBjYW4gZml4IHVwIGFsbCB0aGUgc3ltYm9scyBvZiB0aGUgc2FtZSBuYW1lIGJ5IG1vZGlmeWluZyBvbmx5Ci0gICAgICAgIG9uZSBwb2ludGVyLiBUaGUgcmVsb2NhdGlvbiByb3V0aW5lIGxvb2tzIGluIHRoZSBzeW1ib2wgYW5kCi0gICAgICAgIHVzZXMgdGhlIGJhc2Ugb2YgdGhlIHNlY3Rpb24gdGhlIHN5bWJvbCBpcyBhdHRhY2hlZCB0byBhbmQgdGhlCi0gICAgICAgIHZhbHVlIG9mIHRoZSBzeW1ib2wgYXMgdGhlIGluaXRpYWwgcmVsb2NhdGlvbiBvZmZzZXQuIElmIHRoZQotICAgICAgICBzeW1ib2wgcG9pbnRlciBpcyB6ZXJvLCB0aGVuIHRoZSBzZWN0aW9uIHByb3ZpZGVkIGlzIGxvb2tlZCB1cC4KLQotICAgICAgICBvIDw8YWRkcmVzcz4+Ci0KLSAgICAgICAgVGhlIDw8YWRkcmVzcz4+IGZpZWxkIGdpdmVzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgYmFzZSBvZgotICAgICAgICB0aGUgc2VjdGlvbiBkYXRhIHdoaWNoIG93bnMgdGhlIHJlbG9jYXRpb24gcmVjb3JkIHRvIHRoZSBmaXJzdAotICAgICAgICBieXRlIG9mIHJlbG9jYXRhYmxlIGluZm9ybWF0aW9uLiBUaGUgYWN0dWFsIGRhdGEgcmVsb2NhdGVkCi0gICAgICAgIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcyBwb2ludDsgZm9yIGV4YW1wbGUsIGEgcmVsb2NhdGlvbgotICAgICAgICB0eXBlIHdoaWNoIG1vZGlmaWVzIHRoZSBib3R0b20gdHdvIGJ5dGVzIG9mIGEgZm91ciBieXRlIHdvcmQKLSAgICAgICAgd291bGQgbm90IHRvdWNoIHRoZSBmaXJzdCBieXRlIHBvaW50ZWQgdG8gaW4gYSBiaWcgZW5kaWFuCi0gICAgICAgIHdvcmxkLgotCi0JbyA8PGFkZGVuZD4+Ci0KLQlUaGUgPDxhZGRlbmQ+PiBpcyBhIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBiYWNrIGVuZCB0byBiZSBhZGRlZCAoISkKLQl0byB0aGUgcmVsb2NhdGlvbiBvZmZzZXQuIEl0cyBpbnRlcnByZXRhdGlvbiBpcyBkZXBlbmRlbnQgdXBvbgotCXRoZSBob3d0by4gRm9yIGV4YW1wbGUsIG9uIHRoZSA2OGsgdGhlIGNvZGU6Ci0KLQotfCAgICAgICAgY2hhciBmb29bXTsKLXwgICAgICAgIG1haW4oKQotfCAgICAgICAgICAgICAgICB7Ci18ICAgICAgICAgICAgICAgIHJldHVybiBmb29bMHgxMjM0NTY3OF07Ci18ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBDb3VsZCBiZSBjb21waWxlZCBpbnRvOgotCi18ICAgICAgICBsaW5rdyBmcCwjLTQKLXwgICAgICAgIG1vdmViIEBAIzEyMzQ1Njc4LGQwCi18ICAgICAgICBleHRibCBkMAotfCAgICAgICAgdW5sayBmcAotfCAgICAgICAgcnRzCi0KLQotICAgICAgICBUaGlzIGNvdWxkIGNyZWF0ZSBhIHJlbG9jIHBvaW50aW5nIHRvIDw8Zm9vPj4sIGJ1dCBsZWF2ZSB0aGUKLSAgICAgICAgb2Zmc2V0IGluIHRoZSBkYXRhLCBzb21ldGhpbmcgbGlrZToKLQotCi18UkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbLnRleHRdOgotfG9mZnNldCAgIHR5cGUgICAgICB2YWx1ZQotfDAwMDAwMDA2IDMyICAgICAgICBfZm9vCi18Ci18MDAwMDAwMDAgNGU1NiBmZmZjICAgICAgICAgIDsgbGlua3cgZnAsIy00Ci18MDAwMDAwMDQgMTAzOSAxMjM0IDU2NzggICAgIDsgbW92ZWIgQEAjMTIzNDU2NzgsZDAKLXwwMDAwMDAwYSA0OWMwICAgICAgICAgICAgICAgOyBleHRibCBkMAotfDAwMDAwMDBjIDRlNWUgICAgICAgICAgICAgICA7IHVubGsgZnAKLXwwMDAwMDAwZSA0ZTc1ICAgICAgICAgICAgICAgOyBydHMKLQotCi0gICAgICAgIFVzaW5nIGNvZmYgYW5kIGFuIDg4aywgc29tZSBpbnN0cnVjdGlvbnMgZG9uJ3QgaGF2ZSBlbm91Z2gKLSAgICAgICAgc3BhY2UgaW4gdGhlbSB0byByZXByZXNlbnQgdGhlIGZ1bGwgYWRkcmVzcyByYW5nZSwgYW5kCi0gICAgICAgIHBvaW50ZXJzIGhhdmUgdG8gYmUgbG9hZGVkIGluIHR3byBwYXJ0cy4gU28geW91J2QgZ2V0IHNvbWV0aGluZyBsaWtlOgotCi0KLXwgICAgICAgIG9yLnUgICAgIHIxMyxyMCxoaTE2KF9mb28rMHgxMjM0NTY3OCkKLXwgICAgICAgIGxkLmIgICAgIHIyLHIxMyxsbzE2KF9mb28rMHgxMjM0NTY3OCkKLXwgICAgICAgIGptcCAgICAgIHIxCi0KLQotICAgICAgICBUaGlzIHNob3VsZCBjcmVhdGUgdHdvIHJlbG9jcywgYm90aCBwb2ludGluZyB0byA8PF9mb28+PiwgYW5kIHdpdGgKLSAgICAgICAgMHgxMjM0MDAwMCBpbiB0aGVpciBhZGRlbmQgZmllbGQuIFRoZSBkYXRhIHdvdWxkIGNvbnNpc3Qgb2Y6Ci0KLQotfFJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWy50ZXh0XToKLXxvZmZzZXQgICB0eXBlICAgICAgdmFsdWUKLXwwMDAwMDAwMiBIVlJUMTYgICAgX2ZvbysweDEyMzQwMDAwCi18MDAwMDAwMDYgTFZSVDE2ICAgIF9mb28rMHgxMjM0MDAwMAotfAotfDAwMDAwMDAwIDVkYTA1Njc4ICAgICAgICAgICA7IG9yLnUgcjEzLHIwLDB4NTY3OAotfDAwMDAwMDA0IDFjNGQ1Njc4ICAgICAgICAgICA7IGxkLmIgcjIscjEzLDB4NTY3OAotfDAwMDAwMDA4IGY0MDBjMDAxICAgICAgICAgICA7IGptcCByMQotCi0KLSAgICAgICAgVGhlIHJlbG9jYXRpb24gcm91dGluZSBkaWdzIG91dCB0aGUgdmFsdWUgZnJvbSB0aGUgZGF0YSwgYWRkcwotICAgICAgICBpdCB0byB0aGUgYWRkZW5kIHRvIGdldCB0aGUgb3JpZ2luYWwgb2Zmc2V0LCBhbmQgdGhlbiBhZGRzIHRoZQotICAgICAgICB2YWx1ZSBvZiA8PF9mb28+Pi4gTm90ZSB0aGF0IGFsbCAzMiBiaXRzIGhhdmUgdG8gYmUga2VwdCBhcm91bmQKLSAgICAgICAgc29tZXdoZXJlLCB0byBjb3BlIHdpdGggY2FycnkgZnJvbSBiaXQgMTUgdG8gYml0IDE2LgotCi0gICAgICAgIE9uZSBmdXJ0aGVyIGV4YW1wbGUgaXMgdGhlIHNwYXJjIGFuZCB0aGUgYS5vdXQgZm9ybWF0LiBUaGUKLSAgICAgICAgc3BhcmMgaGFzIGEgc2ltaWxhciBwcm9ibGVtIHRvIHRoZSA4OGssIGluIHRoYXQgc29tZQotICAgICAgICBpbnN0cnVjdGlvbnMgZG9uJ3QgaGF2ZSByb29tIGZvciBhbiBlbnRpcmUgb2Zmc2V0LCBidXQgb24gdGhlCi0gICAgICAgIHNwYXJjIHRoZSBwYXJ0cyBhcmUgY3JlYXRlZCBpbiBvZGQgc2l6ZWQgbHVtcHMuIFRoZSBkZXNpZ25lcnMgb2YKLSAgICAgICAgdGhlIGEub3V0IGZvcm1hdCBjaG9zZSB0byBub3QgdXNlIHRoZSBkYXRhIHdpdGhpbiB0aGUgc2VjdGlvbgotICAgICAgICBmb3Igc3RvcmluZyBwYXJ0IG9mIHRoZSBvZmZzZXQ7IGFsbCB0aGUgb2Zmc2V0IGlzIGtlcHQgd2l0aGluCi0gICAgICAgIHRoZSByZWxvYy4gQW55dGhpbmcgaW4gdGhlIGRhdGEgc2hvdWxkIGJlIGlnbm9yZWQuCi0KLXwgICAgICAgIHNhdmUgJXNwLC0xMTIsJXNwCi18ICAgICAgICBzZXRoaSAlaGkoX2ZvbysweDEyMzQ1Njc4KSwlZzIKLXwgICAgICAgIGxkc2IgWyVnMislbG8oX2ZvbysweDEyMzQ1Njc4KV0sJWkwCi18ICAgICAgICByZXQKLXwgICAgICAgIHJlc3RvcmUKLQotICAgICAgICBCb3RoIHJlbG9jcyBjb250YWluIGEgcG9pbnRlciB0byA8PGZvbz4+LCBhbmQgdGhlIG9mZnNldHMKLSAgICAgICAgY29udGFpbiBqdW5rLgotCi0KLXxSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFsudGV4dF06Ci18b2Zmc2V0ICAgdHlwZSAgICAgIHZhbHVlCi18MDAwMDAwMDQgSEkyMiAgICAgIF9mb28rMHgxMjM0NTY3OAotfDAwMDAwMDA4IExPMTAgICAgICBfZm9vKzB4MTIzNDU2NzgKLXwKLXwwMDAwMDAwMCA5ZGUzYmY5MCAgICAgOyBzYXZlICVzcCwtMTEyLCVzcAotfDAwMDAwMDA0IDA1MDAwMDAwICAgICA7IHNldGhpICVoaShfZm9vKzApLCVnMgotfDAwMDAwMDA4IGYwNDhhMDAwICAgICA7IGxkc2IgWyVnMislbG8oX2ZvbyswKV0sJWkwCi18MDAwMDAwMGMgODFjN2UwMDggICAgIDsgcmV0Ci18MDAwMDAwMTAgODFlODAwMDAgICAgIDsgcmVzdG9yZQotCi0KLSAgICAgICAgbyA8PGhvd3RvPj4KLQotICAgICAgICBUaGUgPDxob3d0bz4+IGZpZWxkIGNhbiBiZSBpbWFnaW5lZCBhcyBhCi0gICAgICAgIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb24uIEl0IGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aGljaAotICAgICAgICBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB3aGF0IHRvIGRvIHdpdGggYWxsIG9mIHRoZSBvdGhlcgotICAgICAgICBpbmZvcm1hdGlvbiBpbiB0aGUgcmVsb2MgcmVjb3JkIGFuZCBkYXRhIHNlY3Rpb24uIEEgYmFjayBlbmQKLSAgICAgICAgd291bGQgbm9ybWFsbHkgaGF2ZSBhIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb24gc2V0IGFuZCB0dXJuCi0gICAgICAgIHJlbG9jYXRpb25zIGludG8gcG9pbnRlcnMgdG8gdGhlIGNvcnJlY3Qgc3RydWN0dXJlIG9uIGlucHV0IC0KLSAgICAgICAgYnV0IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGNyZWF0ZSBlYWNoIGhvd3RvIGZpZWxkIG9uIGRlbWFuZC4KLQotKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQk8PGVudW0gY29tcGxhaW5fb3ZlcmZsb3c+PgotCi0JSW5kaWNhdGVzIHdoYXQgc29ydCBvZiBvdmVyZmxvdyBjaGVja2luZyBzaG91bGQgYmUgZG9uZSB3aGVuCi0JcGVyZm9ybWluZyBhIHJlbG9jYXRpb24uCi0KLUNPREVfRlJBR01FTlQKLS4KLS5lbnVtIGNvbXBsYWluX292ZXJmbG93Ci0uewotLgl7KiBEbyBub3QgY29tcGxhaW4gb24gb3ZlcmZsb3cuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd19kb250LAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgYml0ZmllbGQgb3ZlcmZsb3dzLCB3aGV0aGVyIGl0IGlzIGNvbnNpZGVyZWQKLS4JICAgYXMgc2lnbmVkIG9yIHVuc2lnbmVkLiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0uCi0uCXsqIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIHNpZ25lZAotLgkgICBudW1iZXIuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0uCi0uCXsqIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIGFuCi0uCSAgIHVuc2lnbmVkIG51bWJlci4gKn0KLS4gIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkCi0ufTsKLQotKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLSAgICAgICAgPDxyZWxvY19ob3d0b190eXBlPj4KLQotICAgICAgICBUaGUgPDxyZWxvY19ob3d0b190eXBlPj4gaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYWxsIHRoZQotICAgICAgICBpbmZvcm1hdGlvbiB0aGF0IGxpYmJmZCBuZWVkcyB0byBrbm93IHRvIHRpZSB1cCBhIGJhY2sgZW5kJ3MgZGF0YS4KLQotQ09ERV9GUkFHTUVOVAotLnN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7CQl7KiBGb3J3YXJkIGRlY2xhcmF0aW9uICp9Ci0uCi0uc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAotLnsKLS4gICAgICAgeyogIFRoZSB0eXBlIGZpZWxkIGhhcyBtYWlubHkgYSBkb2N1bWVudGFyeSB1c2UgLSB0aGUgYmFjayBlbmQgY2FuCi0uICAgICAgICAgICBkbyB3aGF0IGl0IHdhbnRzIHdpdGggaXQsIHRob3VnaCBub3JtYWxseSB0aGUgYmFjayBlbmQncwotLiAgICAgICAgICAgZXh0ZXJuYWwgaWRlYSBvZiB3aGF0IGEgcmVsb2MgbnVtYmVyIGlzIHN0b3JlZAotLiAgICAgICAgICAgaW4gdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGUsIGEgUEMgcmVsYXRpdmUgd29yZCByZWxvY2F0aW9uCi0uICAgICAgICAgICBpbiBhIGNvZmYgZW52aXJvbm1lbnQgaGFzIHRoZSB0eXBlIDAyMyAtIGJlY2F1c2UgdGhhdCdzCi0uICAgICAgICAgICB3aGF0IHRoZSBvdXRzaWRlIHdvcmxkIGNhbGxzIGEgUl9QQ1JXT1JEIHJlbG9jLiAqfQotLiAgdW5zaWduZWQgaW50IHR5cGU7Ci0uCi0uICAgICAgIHsqICBUaGUgdmFsdWUgdGhlIGZpbmFsIHJlbG9jYXRpb24gaXMgc2hpZnRlZCByaWdodCBieS4gVGhpcyBkcm9wcwotLiAgICAgICAgICAgdW53YW50ZWQgZGF0YSBmcm9tIHRoZSByZWxvY2F0aW9uLiAgKn0KLS4gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotLgotLgl7KiAgVGhlIHNpemUgb2YgdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyAqbm90KiBhCi0uCSAgICBwb3dlci1vZi10d28gbWVhc3VyZS4gIFRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9wZXJhdGVkCi0uCSAgICBvbiBieSBhIHR5cGUgb2YgcmVsb2NhdGlvbiwgdXNlIGJmZF9nZXRfcmVsb2Nfc2l6ZS4gICp9Ci0uICBpbnQgc2l6ZTsKLS4KLS4gICAgICAgeyogIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzIHVzZWQKLS4JICAgIHdoZW4gZG9pbmcgb3ZlcmZsb3cgY2hlY2tpbmcuICAqfQotLiAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0uCi0uICAgICAgIHsqICBOb3RlcyB0aGF0IHRoZSByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUKLS4gICAgICAgICAgIGRhdGEgc2VjdGlvbiBvZiB0aGUgYWRkZW5kLiBUaGUgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aWxsCi0uICAgICAgICAgICBzdWJ0cmFjdCBmcm9tIHRoZSByZWxvY2F0aW9uIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbgotLiAgICAgICAgICAgYmVpbmcgcmVsb2NhdGVkLiAqfQotLiAgYm9vbGVhbiBwY19yZWxhdGl2ZTsKLS4KLS4JeyogIFRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIHJlbG9jIHZhbHVlIGluIHRoZSBkZXN0aW5hdGlvbi4KLS4JICAgIFRoZSByZWxvY2F0ZWQgdmFsdWUgaXMgbGVmdCBzaGlmdGVkIGJ5IHRoaXMgYW1vdW50LiAqfQotLiAgdW5zaWduZWQgaW50IGJpdHBvczsKLS4KLS4JeyogV2hhdCB0eXBlIG9mIG92ZXJmbG93IGVycm9yIHNob3VsZCBiZSBjaGVja2VkIGZvciB3aGVuCi0uCSAgIHJlbG9jYXRpbmcuICp9Ci0uICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGNvbXBsYWluX29uX292ZXJmbG93OwotLgotLiAgICAgICB7KiBJZiB0aGlzIGZpZWxkIGlzIG5vbiBudWxsLCB0aGVuIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBpcwotLiAgICAgICAgICBjYWxsZWQgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBmdW5jdGlvbi4gVGhpcyBhbGxvd3MgcmVhbGx5Ci0uICAgICAgICAgIHN0cmFuZ2UgcmVsb2NhdGlvbiBtZXRob2RzIHRvIGJlIGFjY29tb2RhdGVkIChlLmcuLCBpOTYwIGNhbGxqCi0uICAgICAgICAgIGluc3RydWN0aW9ucykuICp9Ci0uICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgKCpzcGVjaWFsX2Z1bmN0aW9uKQotLgkJCQkgICAgUEFSQU1TICgoYmZkICphYmZkLAotLgkJCQkJICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotLgotLiAgICAgICB7KiBUaGUgdGV4dHVhbCBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUuICp9Ci0uICBjaGFyICpuYW1lOwotLgotLiAgICAgICB7KiBTb21lIGZvcm1hdHMgcmVjb3JkIGEgcmVsb2NhdGlvbiBhZGRlbmQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMKLS4gICAgICAgICAgcmF0aGVyIHRoYW4gd2l0aCB0aGUgcmVsb2NhdGlvbi4gIEZvciBFTEYgZm9ybWF0cyB0aGlzIGlzIHRoZQotLiAgICAgICAgICBkaXN0aW5jdGlvbiBiZXR3ZWVuIFVTRV9SRUwgYW5kIFVTRV9SRUxBICh0aG91Z2ggdGhlIGNvZGUgY2hlY2tzCi0uICAgICAgICAgIGZvciBVU0VfUkVMID09IDEvMCkuICBUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyBUUlVFIGlmIHRoZQotLiAgICAgICAgICBhZGRlbmQgaXMgcmVjb3JkZWQgd2l0aCB0aGUgc2VjdGlvbiBjb250ZW50czsgd2hlbiBwZXJmb3JtaW5nIGEKLS4gICAgICAgICAgcGFydGlhbCBsaW5rIChsZCAtcikgdGhlIHNlY3Rpb24gY29udGVudHMgKHRoZSBkYXRhKSB3aWxsIGJlCi0uICAgICAgICAgIG1vZGlmaWVkLiAgVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgRkFMU0UgaWYgYWRkZW5kcyBhcmUKLS4gICAgICAgICAgcmVjb3JkZWQgd2l0aCB0aGUgcmVsb2NhdGlvbiAoaW4gYXJlbGVudC5hZGRlbmQpOyB3aGVuIHBlcmZvcm1pbmcKLS4gICAgICAgICAgYSBwYXJ0aWFsIGxpbmsgdGhlIHJlbG9jYXRpb24gd2lsbCBiZSBtb2RpZmllZC4KLS4gICAgICAgICAgQWxsIHJlbG9jYXRpb25zIGZvciBhbGwgRUxGIFVTRV9SRUxBIHRhcmdldHMgc2hvdWxkIHNldCB0aGlzIGZpZWxkCi0uICAgICAgICAgIHRvIEZBTFNFICh2YWx1ZXMgb2YgVFJVRSBzaG91bGQgYmUgbG9va2VkIG9uIHdpdGggc3VzcGljaW9uKS4KLS4gICAgICAgICAgSG93ZXZlciwgdGhlIGNvbnZlcnNlIGlzIG5vdCB0cnVlOiBub3QgYWxsIHJlbG9jYXRpb25zIG9mIGFsbCBFTEYKLS4gICAgICAgICAgVVNFX1JFTCB0YXJnZXRzIHNldCB0aGlzIGZpZWxkIHRvIFRSVUUuICBXaHkgdGhpcyBpcyBzbyBpcyBwZWN1bGlhcgotLiAgICAgICAgICB0byBlYWNoIHBhcnRpY3VsYXIgdGFyZ2V0LiAgRm9yIHJlbG9jcyB0aGF0IGFyZW4ndCB1c2VkIGluIHBhcnRpYWwKLS4gICAgICAgICAgbGlua3MgKGUuZy4gR09UIHN0dWZmKSBpdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoaXMgaXMgc2V0IHRvLiAgKn0KLS4gIGJvb2xlYW4gcGFydGlhbF9pbnBsYWNlOwotLgotLiAgICAgICB7KiBUaGUgc3JjX21hc2sgc2VsZWN0cyB3aGljaCBwYXJ0cyBvZiB0aGUgcmVhZCBpbiBkYXRhCi0uICAgICAgICAgIGFyZSB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uIHN1bS4gIEUuZy4sIGlmIHRoaXMgd2FzIGFuIDggYml0Ci0uICAgICAgICAgIGJ5dGUgb2YgZGF0YSB3aGljaCB3ZSByZWFkIGFuZCByZWxvY2F0ZWQsIHRoaXMgd291bGQgYmUKLS4gICAgICAgICAgMHgwMDAwMDBmZi4gV2hlbiB3ZSBoYXZlIHJlbG9jcyB3aGljaCBoYXZlIGFuIGFkZGVuZCwgc3VjaCBhcwotLiAgICAgICAgICBzdW40IGV4dGVuZGVkIHJlbG9jcywgdGhlIHZhbHVlIGluIHRoZSBvZmZzZXQgcGFydCBvZiBhCi0uICAgICAgICAgIHJlbG9jYXRpbmcgZmllbGQgaXMgZ2FyYmFnZSBzbyB3ZSBuZXZlciB1c2UgaXQuIEluIHRoaXMgY2FzZQotLiAgICAgICAgICB0aGUgbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAqfQotLiAgYmZkX3ZtYSBzcmNfbWFzazsKLS4KLS4gICAgICAgeyogVGhlIGRzdF9tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSByZXBsYWNlZAotLiAgICAgICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gSW4gbW9zdCBjYXNlcyBzcmNfbWFzayA9PSBkc3RfbWFzaywKLS4gICAgICAgICAgZXhjZXB0IGluIHRoZSBhYm92ZSBzcGVjaWFsIGNhc2UsIHdoZXJlIGRzdF9tYXNrIHdvdWxkIGJlCi0uICAgICAgICAgIDB4MDAwMDAwZmYsIGFuZCBzcmNfbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAgICp9Ci0uICBiZmRfdm1hIGRzdF9tYXNrOwotLgotLiAgICAgICB7KiBXaGVuIHNvbWUgZm9ybWF0cyBjcmVhdGUgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zLCB0aGV5IGxlYXZlCi0uICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcGMgb2YgdGhlIHBsYWNlIGJlaW5nIHJlbG9jYXRlZCBpbiB0aGUgb2Zmc2V0Ci0uICAgICAgICAgIHNsb3Qgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB0aGF0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBjYW4KLS4gICAgICAgICAgYmUgbWFkZSBqdXN0IGJ5IGFkZGluZyBpbiBhbiBvcmRpbmFyeSBvZmZzZXQgKGUuZy4sIHN1bjMgYS5vdXQpLgotLiAgICAgICAgICBTb21lIGZvcm1hdHMgbGVhdmUgdGhlIGRpc3BsYWNlbWVudCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uCi0uICAgICAgICAgIGVtcHR5IChlLmcuLCBtODhrIGJjcyk7IHRoaXMgZmxhZyBzaWduYWxzIHRoZSBmYWN0Lip9Ci0uICBib29sZWFuIHBjcmVsX29mZnNldDsKLS4KLS59OwotCi0qLwotCi0vKgotRlVOQ1RJT04KLQlUaGUgSE9XVE8gTWFjcm8KLQotREVTQ1JJUFRJT04KLQlUaGUgSE9XVE8gZGVmaW5lIGlzIGhvcnJpYmxlIGFuZCB3aWxsIGdvIGF3YXkuCi0KLQotLiNkZWZpbmUgSE9XVE8oQywgUixTLEIsIFAsIEJJLCBPLCBTRiwgTkFNRSwgSU5QTEFDRSwgTUFTS1NSQywgTUFTS0RTVCwgUEMpIFwKLS4gIHsodW5zaWduZWQpQyxSLFMsQiwgUCwgQkksIE8sU0YsTkFNRSxJTlBMQUNFLE1BU0tTUkMsTUFTS0RTVCxQQ30KLQotREVTQ1JJUFRJT04KLQlBbmQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b3RhbGx5IG1hZ2ljIHdheS4gQnV0IGZvciB0aGUKLQltb21lbnQsIHdlIGFyZSBjb21wYXRpYmxlLCBzbyBkbyBpdCB0aGlzIHdheS4KLQotCi0uI2RlZmluZSBORVdIT1dUTyggRlVOQ1RJT04sIE5BTUUsU0laRSxSRUwsSU4pIEhPV1RPKDAsMCxTSVpFLDAsUkVMLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCxGVU5DVElPTiwgTkFNRSxmYWxzZSwwLDAsSU4pCi0uCi0KLURFU0NSSVBUSU9OCi0JVGhpcyBpcyB1c2VkIHRvIGZpbGwgaW4gYW4gZW1wdHkgaG93dG8gZW50cnkgaW4gYW4gYXJyYXkuCi0KLS4jZGVmaW5lIEVNUFRZX0hPV1RPKEMpIFwKLS4gIEhPV1RPKChDKSwwLDAsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsTlVMTCxOVUxMLGZhbHNlLDAsMCxmYWxzZSkKLS4KLQotREVTQ1JJUFRJT04KLQlIZWxwZXIgcm91dGluZSB0byB0dXJuIGEgc3ltYm9sIGludG8gYSByZWxvY2F0aW9uIHZhbHVlLgotCi0uI2RlZmluZSBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbCkgICAgICBcCi0uICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICBpZiAoc3ltYm9sICE9IChhc3ltYm9sICopTlVMTCkgeyAgICAgICAgICAgICBcCi0uICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpIHsgXAotLiAgICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOyAgICAgICAgICAgICAgXAotLiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLn0KLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9yZWxvY19zaXplCi0KLVNZTk9QU0lTCi0JdW5zaWduZWQgaW50IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG9fdHlwZSAqKTsKLQotREVTQ1JJUFRJT04KLQlGb3IgYSByZWxvY19ob3d0b190eXBlIHRoYXQgb3BlcmF0ZXMgb24gYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMsCi0JdGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3BlcmF0ZWQgb24uCi0gKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOiByZXR1cm4gMTsKLSAgICBjYXNlIDE6IHJldHVybiAyOwotICAgIGNhc2UgMjogcmV0dXJuIDQ7Ci0gICAgY2FzZSAzOiByZXR1cm4gMDsKLSAgICBjYXNlIDQ6IHJldHVybiA4OwotICAgIGNhc2UgODogcmV0dXJuIDE2OwotICAgIGNhc2UgLTI6IHJldHVybiA0OwotICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgIH0KLX0KLQotLyoKLVRZUEVERUYKLQlhcmVsZW50X2NoYWluCi0KLURFU0NSSVBUSU9OCi0KLQlIb3cgcmVsb2NzIGFyZSB0aWVkIHRvZ2V0aGVyIGluIGFuIDw8YXNlY3Rpb24+PjoKLQotLnR5cGVkZWYgc3RydWN0IHJlbGVudF9jaGFpbiB7Ci0uICBhcmVsZW50IHJlbGVudDsKLS4gIHN0cnVjdCAgIHJlbGVudF9jaGFpbiAqbmV4dDsKLS59IGFyZWxlbnRfY2hhaW47Ci0KLSovCi0KLS8qIE5fT05FUyBwcm9kdWNlcyBOIG9uZSBiaXRzLCB3aXRob3V0IG92ZXJmbG93aW5nIG1hY2hpbmUgYXJpdGhtZXRpYy4gICovCi0jZGVmaW5lIE5fT05FUyhuKSAoKCgoKGJmZF92bWEpIDEgPDwgKChuKSAtIDEpKSAtIDEpIDw8IDEpIHwgMSkKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NoZWNrX292ZXJmbG93Ci0KLVNZTk9QU0lTCi0JYmZkX3JlbG9jX3N0YXR1c190eXBlCi0JCWJmZF9jaGVja19vdmVyZmxvdwotCQkJKGVudW0gY29tcGxhaW5fb3ZlcmZsb3cgaG93LAotCQkJIHVuc2lnbmVkIGludCBiaXRzaXplLAotCQkJIHVuc2lnbmVkIGludCByaWdodHNoaWZ0LAotCQkJIHVuc2lnbmVkIGludCBhZGRyc2l6ZSwKLQkJCSBiZmRfdm1hIHJlbG9jYXRpb24pOwotCi1ERVNDUklQVElPTgotCVBlcmZvcm0gb3ZlcmZsb3cgY2hlY2tpbmcgb24gQHZhcntyZWxvY2F0aW9ufSB3aGljaCBoYXMKLQlAdmFye2JpdHNpemV9IHNpZ25pZmljYW50IGJpdHMgYW5kIHdpbGwgYmUgc2hpZnRlZCByaWdodCBieQotCUB2YXJ7cmlnaHRzaGlmdH0gYml0cywgb24gYSBtYWNoaW5lIHdpdGggYWRkcmVzc2VzIGNvbnRhaW5pbmcKLQlAdmFye2FkZHJzaXplfSBzaWduaWZpY2FudCBiaXRzLiAgVGhlIHJlc3VsdCBpcyBlaXRoZXIgb2YKLQlAY29kZXtiZmRfcmVsb2Nfb2t9IG9yIEBjb2Rle2JmZF9yZWxvY19vdmVyZmxvd30uCi0KLSovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2NoZWNrX292ZXJmbG93IChob3csIGJpdHNpemUsIHJpZ2h0c2hpZnQsIGFkZHJzaXplLCByZWxvY2F0aW9uKQotICAgICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGhvdzsKLSAgICAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0gICAgIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotICAgICB1bnNpZ25lZCBpbnQgYWRkcnNpemU7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLXsKLSAgYmZkX3ZtYSBmaWVsZG1hc2ssIGFkZHJtYXNrLCBzaWdubWFzaywgc3MsIGE7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotCi0gIGEgPSByZWxvY2F0aW9uOwotCi0gIC8qIE5vdGU6IEJJVFNJWkUgc2hvdWxkIGFsd2F5cyBiZSA8PSBBRERSU0laRSwgYnV0IGluIGNhc2UgaXQncyBub3QsCi0gICAgIHdlJ2xsIGJlIHBlcm1pc3NpdmU6IGV4dHJhIGJpdHMgaW4gdGhlIGZpZWxkIG1hc2sgd2lsbAotICAgICBhdXRvbWF0aWNhbGx5IGV4dGVuZCB0aGUgYWRkcmVzcyBtYXNrIGZvciBwdXJwb3NlcyBvZiB0aGUKLSAgICAgb3ZlcmZsb3cgY2hlY2suICAqLwotICBmaWVsZG1hc2sgPSBOX09ORVMgKGJpdHNpemUpOwotICBhZGRybWFzayA9IE5fT05FUyAoYWRkcnNpemUpIHwgZmllbGRtYXNrOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X2RvbnQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotICAgICAgLyogSWYgYW55IHNpZ24gYml0cyBhcmUgc2V0LCBhbGwgc2lnbiBiaXRzIG11c3QgYmUgc2V0LiAgVGhhdAotICAgICAgICAgaXMsIEEgbXVzdCBiZSBhIHZhbGlkIG5lZ2F0aXZlIGFkZHJlc3MgYWZ0ZXIgc2hpZnRpbmcuICAqLwotICAgICAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0gICAgICBzaWdubWFzayA9IH4gKGZpZWxkbWFzayA+PiAxKTsKLSAgICAgIHNzID0gYSAmIHNpZ25tYXNrOwotICAgICAgaWYgKHNzICE9IDAgJiYgc3MgIT0gKChhZGRybWFzayA+PiByaWdodHNoaWZ0KSAmIHNpZ25tYXNrKSkKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotICAgICAgLyogV2UgaGF2ZSBhbiBvdmVyZmxvdyBpZiB0aGUgYWRkcmVzcyBkb2VzIG5vdCBmaXQgaW4gdGhlIGZpZWxkLiAgKi8KLSAgICAgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotICAgICAgaWYgKChhICYgfiBmaWVsZG1hc2spICE9IDApCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDoKLSAgICAgIC8qIEJpdGZpZWxkcyBhcmUgc29tZXRpbWVzIHNpZ25lZCwgc29tZXRpbWVzIHVuc2lnbmVkLiAgV2UKLQkgZXhwbGljaXRseSBhbGxvdyBhbiBhZGRyZXNzIHdyYXAgdG9vLCB3aGljaCBtZWFucyBhIGJpdGZpZWxkCi0JIG9mIG4gYml0cyBpcyBhbGxvd2VkIHRvIHN0b3JlIC0yKipuIHRvIDIqKm4tMS4gIFRodXMgb3ZlcmZsb3cKLQkgaWYgdGhlIHZhbHVlIGhhcyBzb21lLCBidXQgbm90IGFsbCwgYml0cyBzZXQgb3V0c2lkZSB0aGUKLQkgZmllbGQuICAqLwotICAgICAgYSA+Pj0gcmlnaHRzaGlmdDsKLSAgICAgIHNzID0gYSAmIH4gZmllbGRtYXNrOwotICAgICAgaWYgKHNzICE9IDAgJiYgc3MgIT0gKCgoYmZkX3ZtYSkgLTEgPj4gcmlnaHRzaGlmdCkgJiB+IGZpZWxkbWFzaykpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3BlcmZvcm1fcmVsb2NhdGlvbgotCi1TWU5PUFNJUwotCWJmZF9yZWxvY19zdGF0dXNfdHlwZQotICAgICAgICAgICAgICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFRSIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJIGNoYXIgKiplcnJvcl9tZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQlJZiBAdmFye291dHB1dF9iZmR9IGlzIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24sIHRoZQotCWdlbmVyYXRlZCBpbWFnZSB3aWxsIGJlIHJlbG9jYXRhYmxlOyB0aGUgcmVsb2NhdGlvbnMgYXJlCi0JY29waWVkIHRvIHRoZSBvdXRwdXQgZmlsZSBhZnRlciB0aGV5IGhhdmUgYmVlbiBjaGFuZ2VkIHRvCi0JcmVmbGVjdCB0aGUgbmV3IHN0YXRlIG9mIHRoZSB3b3JsZC4gVGhlcmUgYXJlIHR3byB3YXlzIG9mCi0JcmVmbGVjdGluZyB0aGUgcmVzdWx0cyBvZiBwYXJ0aWFsIGxpbmthZ2UgaW4gYW4gb3V0cHV0IGZpbGU6Ci0JYnkgbW9kaWZ5aW5nIHRoZSBvdXRwdXQgZGF0YSBpbiBwbGFjZSwgYW5kIGJ5IG1vZGlmeWluZyB0aGUKLQlyZWxvY2F0aW9uIHJlY29yZC4gIFNvbWUgbmF0aXZlIGZvcm1hdHMgKGUuZy4sIGJhc2ljIGEub3V0IGFuZAotCWJhc2ljIGNvZmYpIGhhdmUgbm8gd2F5IG9mIHNwZWNpZnlpbmcgYW4gYWRkZW5kIGluIHRoZQotCXJlbG9jYXRpb24gdHlwZSwgc28gdGhlIGFkZGVuZCBoYXMgdG8gZ28gaW4gdGhlIG91dHB1dCBkYXRhLgotCVRoaXMgaXMgbm8gYmlnIGRlYWwgc2luY2UgaW4gdGhlc2UgZm9ybWF0cyB0aGUgb3V0cHV0IGRhdGEKLQlzbG90IHdpbGwgYWx3YXlzIGJlIGJpZyBlbm91Z2ggZm9yIHRoZSBhZGRlbmQuIENvbXBsZXggcmVsb2MKLQl0eXBlcyB3aXRoIGFkZGVuZHMgd2VyZSBpbnZlbnRlZCB0byBzb2x2ZSBqdXN0IHRoaXMgcHJvYmxlbS4KLQlUaGUgQHZhcntlcnJvcl9tZXNzYWdlfSBhcmd1bWVudCBpcyBzZXQgdG8gYW4gZXJyb3IgbWVzc2FnZSBpZgotCXRoaXMgcmV0dXJuIEBjb2Rle2JmZF9yZWxvY19kYW5nZXJvdXN9LgotCi0qLwotCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF9zaXplX3R5cGUgb2N0ZXRzID0gcmVsb2NfZW50cnktPmFkZHJlc3MgKiBiZmRfb2N0ZXRzX3Blcl9ieXRlIChhYmZkKTsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBhc3ltYm9sICpzeW1ib2w7Ci0KLSAgc3ltYm9sID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOwotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgcmV0dXJuIGFuIGVycm9yIGlmCi0gICAgIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQuICBBbiB1bmRlZmluZWQgd2VhayBzeW1ib2wgaXMKLSAgICAgY29uc2lkZXJlZCB0byBoYXZlIGEgdmFsdWUgb2YgemVybyAoU1ZSNCBBQkksIHAuIDQtMjcpLiAgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBmdW5jdGlvbiBzdXBwbGllZCB0byBoYW5kbGUgdGhpcyByZWxvY2F0aW9uIHR5cGUsCi0gICAgIGNhbGwgaXQuICBJdCdsbCByZXR1cm4gYGJmZF9yZWxvY19jb250aW51ZScgaWYgZnVydGhlciBwcm9jZXNzaW5nCi0gICAgIGNhbiBiZSBkb25lLiAgKi8KLSAgaWYgKGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uKQotICAgIHsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb250OwotICAgICAgY29udCA9IGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCQkJICAgICAgZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBpZiAoY29udCAhPSBiZmRfcmVsb2NfY29udGludWUpCi0JcmV0dXJuIGNvbnQ7Ci0gICAgfQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgLwotICAgICAgYmZkX29jdGV0c19wZXJfYnl0ZSAoYWJmZCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICBXZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OCi0JIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYW5kIHRoZQotCSBsb2NhdGlvbi4gIFJFTE9DQVRJT04gaXMgYWxyZWFkeSB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLgotCi0JIFdlIHN0YXJ0IGJ5IHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcKLQkgdGhlIGxvY2F0aW9uLgotCi0JIElmIHBjcmVsX29mZnNldCBpcyBzZXQsIHdlIG11c3QgZnVydGhlciBzdWJ0cmFjdCB0aGUgcG9zaXRpb24KLQkgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFNvbWUgdGFyZ2V0cyBhcnJhbmdlIGZvcgotCSB0aGUgYWRkZW5kIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uCi0JIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIGV4YW1wbGUsIGkzODYtYW91dCBkb2VzIHRoaXMuICBGb3IKLQkgaTM4Ni1hb3V0LCBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBTb21lIG90aGVyIHRhcmdldHMgZG8gbm90Ci0JIGluY2x1ZGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbjsgZm9yIGV4YW1wbGUsIG04OGtiY3MsCi0JIG9yIEVMRi4gIEZvciB0aG9zZSB0YXJnZXRzLCBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4KLQotCSBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZW4gd2UgbXVzdCBlbnN1cmUKLQkgdGhhdCB0aGlzIHJlbG9jIHdpbGwgYmUgY29ycmVjdGx5IGNvbXB1dGVkIHdoZW4gdGhlIGZpbmFsCi0JIHJlbG9jYXRpb24gaXMgZG9uZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSB3YW50IHRvIHdpbmQKLQkgdXAgd2l0aCB0aGUgbmVnYXRpdmUgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwKLQkgd2hpY2ggbWVhbnMgd2UgbXVzdCBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBieSB0aGUgY2hhbmdlCi0JIGluIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBJZiBwY3JlbF9vZmZzZXQgaXMgdHJ1ZQotCSB3ZSBkbyBub3Qgd2FudCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBhdCBhbGwuCi0KLQkgRklYTUU6IFRoaXMgc2VlbXMgbG9naWNhbCB0byBtZSwgYnV0IGZvciB0aGUgY2FzZSBvZgotCSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBpdCBpcyBub3Qgd2hhdCB0aGUgY29kZQotCSBhY3R1YWxseSBkb2VzLiAgSSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdCwgYmVjYXVzZSBpdCBzZWVtcwotCSBmYXIgdG9vIGxpa2VseSB0aGF0IHNvbWV0aGluZyB3aWxsIGJyZWFrLiAgKi8KLQotICAgICAgcmVsb2NhdGlvbiAtPQotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUgcmVsb2NhdGlvbgotCSAgICAgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSAgICAgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGZsYWc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGJ1dCBpbnBsYWNlLCBzbyBtb2RpZnkgdGhlCi0JICAgICByZWxvYyByZWNvcmQgYSBiaXQuCi0KLQkgICAgIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgICAgIGludG8gYSByZWYgdG8gdGhlIHNlY3Rpb24gYmVsb25naW5nIHRvIHRoZSBzeW1ib2wuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0JICAvKiBXVEY/PyAqLwotCSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhaXhjb2ZmLXJzNjAwMCIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWxpdHRsZSIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWJpZyIpICE9IDApCi0JICAgIHsKLSNpZiAxCi0JICAgICAgLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKLQkJIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAotCQkgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KLQotSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKLXdoaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KLQotSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKLWxpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCi1TQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKLXByb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQotY29kZSB3b3JrcyBhcyBpdCBkb2VzLgotCi1IbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHNob3VsZAotbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQotZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKLWlzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKLXJlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQotaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KLQotQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgotdGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKLXJlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKLWxvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCi0KLUJGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCi12YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKLW5vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCi1kaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCi12YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCi0KLVNvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KLXdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Ci13aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCi1wYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAotcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bwotYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAotd2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgotZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCi10aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KLQotV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCi1pbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0Ci1saW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKLWZ1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgotc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0Ci1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCi1jb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCi10cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgotCi1UaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQotd29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKLXdheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQotc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzawotc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgotICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKLSAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCi0gICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAotICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgotICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCi0gICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKLSAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKLSAgICA1KSByZXBlYXQgc3RlcCAyCi0gICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAotICAgICAgIG1hZGUgaXQgbm8gd29yc2UKLSAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCi0gICAgICAgcmlnaHQKLSovCi0JICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotICAgIH0KLQotICAvKiBGSVhNRTogVGhpcyBvdmVyZmxvdyBjaGVja2luZyBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICBtaWdodCBoYXZlIG92ZXJmbG93ZWQgYmVmb3JlIHdlIGdldCBoZXJlLiAgRm9yIGEgY29ycmVjdCBjaGVjayB3ZQotICAgICBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIGluIGEgc2l6ZSBsYXJnZXIgdGhhbiBiaXRzaXplLCBidXQgd2UKLSAgICAgY2FuJ3QgcmVhc29uYWJseSBkbyB0aGF0IGZvciBhIHJlbG9jIHRoZSBzYW1lIHNpemUgYXMgYSBob3N0Ci0gICAgIG1hY2hpbmUgd29yZC4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGRvIG92ZXJmbG93IGNoZWNraW5nIG9uIHRoZSByZXN1bHQgYWZ0ZXIKLSAgICAgYWRkaW5nIGluIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250Ci0gICAgICAmJiBmbGFnID09IGJmZF9yZWxvY19vaykKLSAgICBmbGFnID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkgICAgICAgaG93dG8tPmJpdHNpemUsCi0JCQkgICAgICAgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkgICAgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCksCi0JCQkgICAgICAgcmVsb2NhdGlvbik7Ci0KLSAgLyoKLSAgICBFaXRoZXIgd2UgYXJlIHJlbG9jYXRpbmcgYWxsIHRoZSB3YXksIG9yIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkKLSAgICB0aGUgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgKHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgaXNuJ3QKLSAgICBhbnkgcm9vbSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB0byBkZXNjcmliZSBhZGRlbmRzIHRvIHJlbG9jcykKLSAgICAqLwotCi0gIC8qIFRoZSBjYXN0IHRvIGJmZF92bWEgYXZvaWRzIGEgYnVnIGluIHRoZSBBbHBoYSBPU0YvMSBDIGNvbXBpbGVyCi0gICAgIChPU0YgdmVyc2lvbiAxLjMsIGNvbXBpbGVyIHZlcnNpb24gMy4xMSkuICBJdCBtaXNjb21waWxlcyB0aGUKLSAgICAgZm9sbG93aW5nIHByb2dyYW06Ci0KLSAgICAgc3RydWN0IHN0cgotICAgICB7Ci0gICAgICAgdW5zaWduZWQgaW50IGkwOwotICAgICB9IHMgPSB7IDAgfTsKLQotICAgICBpbnQKLSAgICAgbWFpbiAoKQotICAgICB7Ci0gICAgICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICAgICAgeCA9IDB4MTAwMDAwMDAwOwotICAgICAgIHggPDw9ICh1bnNpZ25lZCBsb25nKSBzLmkwOwotICAgICAgIGlmICh4ID09IDApCi0JIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICAgZWxzZQotCSBwcmludGYgKCJzdWNjZWVkZWQgKCVseClcbiIsIHgpOwotICAgICB9Ci0gICAgICovCi0KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0gIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogV2FpdCBmb3IgdGhlIGRheSB3aGVuIGFsbCBoYXZlIHRoZSBtYXNrIGluIHRoZW0gKi8KLQotICAvKiBXaGF0IHdlIGRvOgotICAgICBpIGluc3RydWN0aW9uIHRvIGJlIGxlZnQgYWxvbmUKLSAgICAgbyBvZmZzZXQgd2l0aGluIGluc3RydWN0aW9uCi0gICAgIHIgcmVsb2NhdGlvbiBvZmZzZXQgdG8gYXBwbHkKLSAgICAgUyBzcmMgbWFzawotICAgICBEIGRzdCBtYXNrCi0gICAgIE4gfmRzdCBtYXNrCi0gICAgIEEgcGFydCAxCi0gICAgIEIgcGFydCAyCi0gICAgIFIgcmVzdWx0Ci0KLSAgICAgRG8gdGhpczoKLSAgICAgKCggIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUykgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50Ci0gICAgICsgICByIHIgciByIHIgciByIHIgciByKSB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCi0gICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgPSAgICAgICAgICAgICBBIEEgQSBBIEEKLSAgICAgQW5kIHRoaXM6Ci0gICAgICggICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kIE4gTiBOIE4gTiAgICAgICAgICApIGdldCBpbnN0cnVjdGlvbgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICA9ICAgQiBCIEIgQiBCCi0KLSAgICAgQW5kIHRoZW46Ci0gICAgICggICBCIEIgQiBCIEIKLSAgICAgb3IgICAgICAgICAgICBBIEEgQSBBIEEpCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgID0gICBSIFIgUiBSIFIgUiBSIFIgUiBSICBwdXQgaW50byBiZmRfcHV0PHNpemU+Ci0gICAgICovCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGNoYXIgKikgZGF0YSArIG9jdGV0cyk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF84IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgb2N0ZXRzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgewotCXNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIG9jdGV0cyk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIG9jdGV0cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBvY3RldHMpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgb2N0ZXRzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgLTI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBvY3RldHMpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIG9jdGV0cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgLTE6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBvY3RldHMpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzE2IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIG9jdGV0cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIERvIG5vdGhpbmcgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgICB7Ci0JYmZkX3ZtYSB4ID0gYmZkX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBvY3RldHMpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfNjQgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgb2N0ZXRzKTsKLSAgICAgIH0KLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgfQotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfaW5zdGFsbF9yZWxvY2F0aW9uCi0KLVNZTk9QU0lTCi0JYmZkX3JlbG9jX3N0YXR1c190eXBlCi0gICAgICAgICAgICAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwgYmZkX3ZtYSBkYXRhX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJIGNoYXIgKiplcnJvcl9tZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQlUaGlzIGxvb2tzIHJlbWFya2FibHkgbGlrZSA8PGJmZF9wZXJmb3JtX3JlbG9jYXRpb24+PiwgZXhjZXB0IGl0Ci0JZG9lcyBub3QgZXhwZWN0IHRoYXQgdGhlIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIGZpbGxlZCBpbi4KLQlJLmUuLCBpdCdzIHN1aXRhYmxlIGZvciB1c2Ugd2hlbiBjcmVhdGluZywgcmF0aGVyIHRoYW4gYXBwbHlpbmcKLQlhIHJlbG9jYXRpb24uCi0KLQlGb3Igbm93LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIHJlc2VydmVkIGZvciB0aGUKLQlhc3NlbWJsZXIuCi0KLSovCi0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgZGF0YV9zdGFydCwgZGF0YV9zdGFydF9vZmZzZXQsCi0JCQlpbnB1dF9zZWN0aW9uLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBQVFIgZGF0YV9zdGFydDsKLSAgICAgYmZkX3ZtYSBkYXRhX3N0YXJ0X29mZnNldDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfc2l6ZV90eXBlIG9jdGV0cyA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzICogYmZkX29jdGV0c19wZXJfYnl0ZSAoYWJmZCk7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICBiZmRfYnl0ZSAqZGF0YTsKLQotICBzeW1ib2wgPSAqKHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0cik7Ci0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGEgZnVuY3Rpb24gc3VwcGxpZWQgdG8gaGFuZGxlIHRoaXMgcmVsb2NhdGlvbiB0eXBlLAotICAgICBjYWxsIGl0LiAgSXQnbGwgcmV0dXJuIGBiZmRfcmVsb2NfY29udGludWUnIGlmIGZ1cnRoZXIgcHJvY2Vzc2luZwotICAgICBjYW4gYmUgZG9uZS4gICovCi0gIGlmIChob3d0by0+c3BlY2lhbF9mdW5jdGlvbikKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29udDsKLQotICAgICAgLyogWFhYIC0gVGhlIHNwZWNpYWxfZnVuY3Rpb24gY2FsbHMgaGF2ZW4ndCBiZWVuIGZpeGVkIHVwIHRvIGRlYWwKLQkgd2l0aCBjcmVhdGluZyBuZXcgcmVsb2NhdGlvbnMgYW5kIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgY29udCA9IGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLAotCQkJCSAgICAgIC8qIFhYWCAtIE5vbi1wb3J0YWJsZSEgKi8KLQkJCQkgICAgICAoKGJmZF9ieXRlICopIGRhdGFfc3RhcnQKLQkJCQkgICAgICAgLSBkYXRhX3N0YXJ0X29mZnNldCksCi0JCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgYWJmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBpZiAoY29udCAhPSBiZmRfcmVsb2NfY29udGludWUpCi0JcmV0dXJuIGNvbnQ7Ci0gICAgfQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIG91dHB1dF9iYXNlID0gMDsKLSAgZWxzZQotICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04KLQkgdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBhbmQgdGhlCi0JIGxvY2F0aW9uLiAgUkVMT0NBVElPTiBpcyBhbHJlYWR5IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuCi0KLQkgV2Ugc3RhcnQgYnkgc3VidHJhY3RpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZwotCSB0aGUgbG9jYXRpb24uCi0KLQkgSWYgcGNyZWxfb2Zmc2V0IGlzIHNldCwgd2UgbXVzdCBmdXJ0aGVyIHN1YnRyYWN0IHRoZSBwb3NpdGlvbgotCSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgU29tZSB0YXJnZXRzIGFycmFuZ2UgZm9yCi0JIHRoZSBhZGRlbmQgdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb24KLQkgd2l0aGluIHRoZSBzZWN0aW9uOyBmb3IgZXhhbXBsZSwgaTM4Ni1hb3V0IGRvZXMgdGhpcy4gIEZvcgotCSBpMzg2LWFvdXQsIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIFNvbWUgb3RoZXIgdGFyZ2V0cyBkbyBub3QKLQkgaW5jbHVkZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uOyBmb3IgZXhhbXBsZSwgbTg4a2JjcywKLQkgb3IgRUxGLiAgRm9yIHRob3NlIHRhcmdldHMsIHBjcmVsX29mZnNldCBpcyB0cnVlLgotCi0JIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlbiB3ZSBtdXN0IGVuc3VyZQotCSB0aGF0IHRoaXMgcmVsb2Mgd2lsbCBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiB0aGUgZmluYWwKLQkgcmVsb2NhdGlvbiBpcyBkb25lLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIHdhbnQgdG8gd2luZAotCSB1cCB3aXRoIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLAotCSB3aGljaCBtZWFucyB3ZSBtdXN0IGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGJ5IHRoZSBjaGFuZ2UKLQkgaW4gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIElmIHBjcmVsX29mZnNldCBpcyB0cnVlCi0JIHdlIGRvIG5vdCB3YW50IHRvIGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGF0IGFsbC4KLQotCSBGSVhNRTogVGhpcyBzZWVtcyBsb2dpY2FsIHRvIG1lLCBidXQgZm9yIHRoZSBjYXNlIG9mCi0JIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0IGl0IGlzIG5vdCB3aGF0IHRoZSBjb2RlCi0JIGFjdHVhbGx5IGRvZXMuICBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LCBiZWNhdXNlIGl0IHNlZW1zCi0JIGZhciB0b28gbGlrZWx5IHRoYXQgc29tZXRoaW5nIHdpbGwgYnJlYWsuICAqLwotCi0gICAgICByZWxvY2F0aW9uIC09Ci0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGZsYWc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYnV0IGlucGxhY2UsIHNvIG1vZGlmeSB0aGUKLQkgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgaW50byBhIHJlZiB0byB0aGUgc2VjdGlvbiBiZWxvbmdpbmcgdG8gdGhlIHN5bWJvbC4gICovCi0KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIC8qIFdURj8/ICovCi0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpICE9IDAKLQkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtbGl0dGxlIikgIT0gMAotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiY29mZi1JbnRlbC1iaWciKSAhPSAwKQotCXsKLSNpZiAxCi0vKiBGb3IgbTY4ay1jb2ZmLCB0aGUgYWRkZW5kIHdhcyBiZWluZyBzdWJ0cmFjdGVkIHR3aWNlIGR1cmluZwotICAgcmVsb2NhdGlvbiB3aXRoIC1yLiAgUmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3cgdGhpcyBjb21tZW50Ci0gICBmaXhlcyB0aGF0IHByb2JsZW07IHNlZSBQUiAyOTUzLgotCi1Ib3dldmVyLCBJYW4gd3JvdGUgdGhlIGZvbGxvd2luZywgcmVnYXJkaW5nIHJlbW92aW5nIHRoZSBsaW5lIGJlbG93LAotd2hpY2ggZXhwbGFpbnMgd2h5IGl0IGlzIHN0aWxsIGVuYWJsZWQ6ICAtLWRqbQotCi1JZiB5b3UgcHV0IGEgcGF0Y2ggbGlrZSB0aGF0IGludG8gQkZEIHlvdSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgQ09GRgotbGlua2Vycy4gIEkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCBwYXRjaCB3aWxsIGJyZWFrIGNvZmYtaTM4NiAoZS5nLiwKLVNDTyk7IHNlZSBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMgd2hlcmUgSSB3b3JrZWQgYXJvdW5kIHRoZQotcHJvYmxlbSBpbiBhIGRpZmZlcmVudCB3YXkuICBUaGVyZSBtYXkgdmVyeSB3ZWxsIGJlIGEgcmVhc29uIHRoYXQgdGhlCi1jb2RlIHdvcmtzIGFzIGl0IGRvZXMuCi0KLUhtbW0uICBUaGUgZmlyc3Qgb2J2aW91cyBwb2ludCBpcyB0aGF0IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gc2hvdWxkCi1ub3QgaGF2ZSBhbnkgdGVzdHMgdGhhdCBkZXBlbmQgdXBvbiB0aGUgZmxhdm91ci4gIEl0J3Mgc2VlbSBsaWtlCi1lbnRpcmVseSB0aGUgd3JvbmcgcGxhY2UgZm9yIHN1Y2ggYSB0aGluZy4gIFRoZSBzZWNvbmQgb2J2aW91cyBwb2ludAotaXMgdGhhdCB0aGUgY3VycmVudCBjb2RlIGlnbm9yZXMgdGhlIHJlbG9jIGFkZGVuZCB3aGVuIHByb2R1Y2luZwotcmVsb2NhdGVhYmxlIG91dHB1dCBmb3IgQ09GRi4gIFRoYXQncyBwZWN1bGlhci4gIEluIGZhY3QsIEkgcmVhbGx5Ci1oYXZlIG5vIGlkZWEgd2hhdCB0aGUgcG9pbnQgb2YgdGhlIGxpbmUgeW91IHdhbnQgdG8gcmVtb3ZlIGlzLgotCi1BIHR5cGljYWwgQ09GRiByZWxvYyBzdWJ0cmFjdHMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBhZGRzIGluCi10aGUgbmV3IHZhbHVlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUgKGlmIGl0J3MgYSBwYwotcmVsYXRpdmUgcmVsb2MgaXQgYWRkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZQotbG9jYXRpb24pLiAgV2hlbiByZWxvY2F0aW5nIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhhdCBwcm9wZXJ0eS4KLQotQkZEIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBhZGRlbmQgdG8gdGhlIG5lZ2F0aXZlIG9mIHRoZSBvbGQKLXZhbHVlIG9mIHRoZSBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5IGl0IGhhbmRsZXMgY29tbW9uIHN5bWJvbHMgaW4gYQotbm9uLXN0YW5kYXJkIHdheSAoaXQgZG9lc24ndCBzdWJ0cmFjdCB0aGUgb2xkIHZhbHVlKSBidXQgdGhhdCdzIGEKLWRpZmZlcmVudCBzdG9yeSAod2UgY2FuJ3QgY2hhbmdlIGl0IHdpdGhvdXQgbG9zaW5nIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5IHdpdGggb2xkIG9iamVjdCBmaWxlcykgKGNvZmYtaTM4NiBkb2VzIHN1YnRyYWN0IHRoZSBvbGQKLXZhbHVlLCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgY29mZi1pMzg2IHRhcmdldHMsIGxpa2UgU0NPKS4KLQotU28gZXZlcnl0aGluZyB3b3JrcyBmaW5lIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgV2hlbgotd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBsb2dpY2FsbHkgd2Ugc2hvdWxkIGRvIGV4YWN0bHkKLXdoYXQgd2UgZG8gd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGVyZWZvcmUsIHlvdXIKLXBhdGNoIGlzIGNvcnJlY3QuICBJbiBmYWN0LCBpdCBzaG91bGQgcHJvYmFibHkgYWx3YXlzIGp1c3Qgc2V0Ci1yZWxvY19lbnRyeS0+YWRkZW5kIHRvIDAgZm9yIGFsbCBjYXNlcywgc2luY2UgaXQgaXMsIGluIGZhY3QsIGdvaW5nIHRvCi1hZGQgdGhlIHZhbHVlIGludG8gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyB3b24ndCBodXJ0IHRoZSBDT0ZGIGNvZGUsCi13aGljaCBkb2Vzbid0IHVzZSB0aGUgYWRkZW5kOyBJJ20gbm90IHN1cmUgd2hhdCBpdCB3aWxsIGRvIHRvIG90aGVyCi1mb3JtYXRzICh0aGUgdGhpbmcgdG8gY2hlY2sgZm9yIHdvdWxkIGJlIHdoZXRoZXIgYW55IGZvcm1hdHMgYm90aCB1c2UKLXRoZSBhZGRlbmQgYW5kIHNldCBwYXJ0aWFsX2lucGxhY2UpLgotCi1XaGVuIEkgd2FudGVkIHRvIG1ha2UgY29mZi1pMzg2IHByb2R1Y2UgcmVsb2NhdGVhYmxlIG91dHB1dCwgSSByYW4KLWludG8gdGhlIHByb2JsZW0gdGhhdCB5b3UgYXJlIHJ1bm5pbmcgaW50bzogSSB3YW50ZWQgdG8gcmVtb3ZlIHRoYXQKLWxpbmUuICBSYXRoZXIgdGhhbiByaXNrIGl0LCBJIG1hZGUgdGhlIGNvZmYtaTM4NiByZWxvY3MgdXNlIGEgc3BlY2lhbAotZnVuY3Rpb247IGl0J3MgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jLiAgVGhlIGZ1bmN0aW9uCi1zcGVjaWZpY2FsbHkgYWRkcyB0aGUgYWRkZW5kIGZpZWxkIGludG8gdGhlIG9iamVjdCBmaWxlLCBrbm93aW5nIHRoYXQKLWJmZF9pbnN0YWxsX3JlbG9jYXRpb24gaXMgbm90IGdvaW5nIHRvLiAgSWYgeW91IHJlbW92ZSB0aGF0IGxpbmUsIHRoZW4KLWNvZmYtaTM4Ni5jIHdpbGwgd2luZCB1cCBhZGRpbmcgdGhlIGFkZGVuZCBmaWVsZCBpbiB0d2ljZS4gIEl0J3MKLXRyaXZpYWwgdG8gZml4OyBpdCBqdXN0IG5lZWRzIHRvIGJlIGRvbmUuCi0KLVRoZSBwcm9ibGVtIHdpdGggcmVtb3ZpbmcgdGhlIGxpbmUgaXMganVzdCB0aGF0IGl0IG1heSBicmVhayBzb21lCi13b3JraW5nIGNvZGUuICBXaXRoIEJGRCBpdCdzIGhhcmQgdG8gYmUgc3VyZSBvZiBhbnl0aGluZy4gIFRoZSByaWdodAotd2F5IHRvIGRlYWwgd2l0aCB0aGlzIGlzIHNpbXBseSB0byBidWlsZCBhbmQgdGVzdCBhdCBsZWFzdCBhbGwgdGhlCi1zdXBwb3J0ZWQgQ09GRiB0YXJnZXRzLiAgSXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCBpZiB0aW1lIGFuZCBkaXNrCi1zcGFjZSBjb25zdW1pbmcuICBGb3IgZWFjaCB0YXJnZXQ6Ci0gICAgMSkgYnVpbGQgdGhlIGxpbmtlcgotICAgIDIpIGdlbmVyYXRlIHNvbWUgZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgdXNpbmcgLXIgKEkgd291bGQKLSAgICAgICBwcm9iYWJseSB1c2UgcGFyYW5vaWEubyBhbmQgbGluayBhZ2FpbnN0IG5ld2xpYi9saWJjLmEsIHdoaWNoCi0gICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHRhcmdldHMgd291bGQgYmUgYXZhaWxhYmxlIGluCi0gICAgICAgL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvSC1ob3N0L3RhcmdldC9saWIvbGliYy5hKS4KLSAgICAzKSBtYWtlIHRoZSBjaGFuZ2UgdG8gcmVsb2MuYwotICAgIDQpIHJlYnVpbGQgdGhlIGxpbmtlcgotICAgIDUpIHJlcGVhdCBzdGVwIDIKLSAgICA2KSBpZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlcyBhcmUgdGhlIHNhbWUsIHlvdSBoYXZlIGF0IGxlYXN0Ci0gICAgICAgbWFkZSBpdCBubyB3b3JzZQotICAgIDcpIGlmIHRoZXkgYXJlIGRpZmZlcmVudCB5b3UgaGF2ZSB0byBmaWd1cmUgb3V0IHdoaWNoIHZlcnNpb24gaXMKLSAgICAgICByaWdodAotKi8KLQkgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCX0KLSAgICB9Ci0KLSAgLyogRklYTUU6IFRoaXMgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aGUgdmFsdWUKLSAgICAgbWlnaHQgaGF2ZSBvdmVyZmxvd2VkIGJlZm9yZSB3ZSBnZXQgaGVyZS4gIEZvciBhIGNvcnJlY3QgY2hlY2sgd2UKLSAgICAgbmVlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBpbiBhIHNpemUgbGFyZ2VyIHRoYW4gYml0c2l6ZSwgYnV0IHdlCi0gICAgIGNhbid0IHJlYXNvbmFibHkgZG8gdGhhdCBmb3IgYSByZWxvYyB0aGUgc2FtZSBzaXplIGFzIGEgaG9zdAotICAgICBtYWNoaW5lIHdvcmQuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYWxzbyBkbyBvdmVyZmxvdyBjaGVja2luZyBvbiB0aGUgcmVzdWx0IGFmdGVyCi0gICAgIGFkZGluZyBpbiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICBmbGFnID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkgICAgICAgaG93dG8tPmJpdHNpemUsCi0JCQkgICAgICAgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkgICAgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCksCi0JCQkgICAgICAgcmVsb2NhdGlvbik7Ci0KLSAgLyoKLSAgICBFaXRoZXIgd2UgYXJlIHJlbG9jYXRpbmcgYWxsIHRoZSB3YXksIG9yIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkKLSAgICB0aGUgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgKHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgaXNuJ3QKLSAgICBhbnkgcm9vbSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB0byBkZXNjcmliZSBhZGRlbmRzIHRvIHJlbG9jcykKLSAgICAqLwotCi0gIC8qIFRoZSBjYXN0IHRvIGJmZF92bWEgYXZvaWRzIGEgYnVnIGluIHRoZSBBbHBoYSBPU0YvMSBDIGNvbXBpbGVyCi0gICAgIChPU0YgdmVyc2lvbiAxLjMsIGNvbXBpbGVyIHZlcnNpb24gMy4xMSkuICBJdCBtaXNjb21waWxlcyB0aGUKLSAgICAgZm9sbG93aW5nIHByb2dyYW06Ci0KLSAgICAgc3RydWN0IHN0cgotICAgICB7Ci0gICAgICAgdW5zaWduZWQgaW50IGkwOwotICAgICB9IHMgPSB7IDAgfTsKLQotICAgICBpbnQKLSAgICAgbWFpbiAoKQotICAgICB7Ci0gICAgICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICAgICAgeCA9IDB4MTAwMDAwMDAwOwotICAgICAgIHggPDw9ICh1bnNpZ25lZCBsb25nKSBzLmkwOwotICAgICAgIGlmICh4ID09IDApCi0JIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICAgZWxzZQotCSBwcmludGYgKCJzdWNjZWVkZWQgKCVseClcbiIsIHgpOwotICAgICB9Ci0gICAgICovCi0KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0gIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogV2FpdCBmb3IgdGhlIGRheSB3aGVuIGFsbCBoYXZlIHRoZSBtYXNrIGluIHRoZW0gKi8KLQotICAvKiBXaGF0IHdlIGRvOgotICAgICBpIGluc3RydWN0aW9uIHRvIGJlIGxlZnQgYWxvbmUKLSAgICAgbyBvZmZzZXQgd2l0aGluIGluc3RydWN0aW9uCi0gICAgIHIgcmVsb2NhdGlvbiBvZmZzZXQgdG8gYXBwbHkKLSAgICAgUyBzcmMgbWFzawotICAgICBEIGRzdCBtYXNrCi0gICAgIE4gfmRzdCBtYXNrCi0gICAgIEEgcGFydCAxCi0gICAgIEIgcGFydCAyCi0gICAgIFIgcmVzdWx0Ci0KLSAgICAgRG8gdGhpczoKLSAgICAgKCggIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUykgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50Ci0gICAgICsgICByIHIgciByIHIgciByIHIgciByKSB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCi0gICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgPSAgICAgICAgICAgICBBIEEgQSBBIEEKLSAgICAgQW5kIHRoaXM6Ci0gICAgICggICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kIE4gTiBOIE4gTiAgICAgICAgICApIGdldCBpbnN0cnVjdGlvbgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICA9ICAgQiBCIEIgQiBCCi0KLSAgICAgQW5kIHRoZW46Ci0gICAgICggICBCIEIgQiBCIEIKLSAgICAgb3IgICAgICAgICAgICBBIEEgQSBBIEEpCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgID0gICBSIFIgUiBSIFIgUiBSIFIgUiBSICBwdXQgaW50byBiZmRfcHV0PHNpemU+Ci0gICAgICovCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBkYXRhX3N0YXJ0ICsgKG9jdGV0cyAtIGRhdGFfc3RhcnRfb2Zmc2V0KTsKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICB7Ci0JY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCAoY2hhciAqKSBkYXRhKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzggKGFiZmQsIHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICB7Ci0Jc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzE2IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHsKLQlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAtMjoKLSAgICAgIHsKLQlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0JcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgLyogRG8gbm90aGluZyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgICB7Ci0JYmZkX3ZtYSB4ID0gYmZkX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfNjQgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotICAgIH0KLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyogVGhpcyByZWxvY2F0aW9uIHJvdXRpbmUgaXMgdXNlZCBieSBzb21lIG9mIHRoZSBiYWNrZW5kIGxpbmtlcnMuCi0gICBUaGV5IGRvIG5vdCBjb25zdHJ1Y3QgYXN5bWJvbCBvciBhcmVsZW50IHN0cnVjdHVyZXMsIHNvIHRoZXJlIGlzIG5vCi0gICByZWFzb24gZm9yIHRoZW0gdG8gdXNlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBBbHNvLAotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBzbyBoYWNrZWQgdXAgaXQgaXMgZWFzaWVyIHRvIHdyaXRlIGEgbmV3Ci0gICBmdW5jdGlvbiB0aGFuIHRvIHRyeSB0byBkZWFsIHdpdGggaXQuCi0KLSAgIFRoaXMgcm91dGluZSBkb2VzIGEgZmluYWwgcmVsb2NhdGlvbi4gIFdoZXRoZXIgaXQgaXMgdXNlZnVsIGZvciBhCi0gICByZWxvY2F0ZWFibGUgbGluayBkZXBlbmRzIHVwb24gaG93IHRoZSBvYmplY3QgZm9ybWF0IGRlZmluZXMKLSAgIHJlbG9jYXRpb25zLgotCi0gICBGSVhNRTogVGhpcyByb3V0aW5lIGlnbm9yZXMgYW55IHNwZWNpYWxfZnVuY3Rpb24gaW4gdGhlIEhPV1RPLAotICAgc2luY2UgdGhlIGV4aXN0aW5nIHNwZWNpYWxfZnVuY3Rpb24gdmFsdWVzIGhhdmUgYmVlbiB3cml0dGVuIGZvcgotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQotICAgSE9XVE8gaXMgdGhlIHJlbG9jIGhvd3RvIGluZm9ybWF0aW9uLgotICAgSU5QVVRfQkZEIGlzIHRoZSBCRkQgd2hpY2ggdGhlIHJlbG9jIGFwcGxpZXMgdG8uCi0gICBJTlBVVF9TRUNUSU9OIGlzIHRoZSBzZWN0aW9uIHdoaWNoIHRoZSByZWxvYyBhcHBsaWVzIHRvLgotICAgQ09OVEVOVFMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLgotICAgQUREUkVTUyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2Mgd2l0aGluIElOUFVUX1NFQ1RJT04uCi0gICBWQUxVRSBpcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0aGUgcmVsb2MgcmVmZXJzIHRvLgotICAgQURERU5EIGlzIHRoZSBhZGRlbmQgb2YgdGhlIHJlbG9jLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBhZGRyZXNzLAotCQkJICB2YWx1ZSwgYWRkZW5kKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MuICAqLwotICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJhc2ljIHJlbG9jYXRpb24KLSAgICAgYWdhaW5zdCBhIHN5bWJvbC4gIFdlIHdhbnQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0bwotICAgICByZWxvY2F0ZSB0by4gIFRoaXMgaXMganVzdCBWQUxVRSwgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIHBsdXMKLSAgICAgQURERU5ELCBhbnkgYWRkZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2MuICAqLwotICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7Ci0KLSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgUEMgcmVsYXRpdmUsIHdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04gdG8KLSAgICAgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN5bWJvbCAoY3VycmVudGx5IGluIFJFTE9DQVRJT04pIGFuZCB0aGUKLSAgICAgbG9jYXRpb24gd2UgYXJlIHJlbG9jYXRpbmcuICBTb21lIHRhcmdldHMgKGUuZy4sIGkzODYtYW91dCkKLSAgICAgYXJyYW5nZSBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUKLSAgICAgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBzdWNoIHRhcmdldHMKLSAgICAgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgT3RoZXIgdGFyZ2V0cyAoZS5nLiwgbTg4a2JjcyBvciBFTEYpCi0gICAgIHNpbXBseSBsZWF2ZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYXMgemVybzsgZm9yIHN1Y2gKLSAgICAgdGFyZ2V0cyBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSBkbyBub3QKLSAgICAgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZQotICAgICBzZWN0aW9uICh3aGljaCBpcyBqdXN0IEFERFJFU1MpLiAgKi8KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQotCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgZ2l2ZW4gbG9jYXRpb24gdXNpbmcgYSBnaXZlbiB2YWx1ZSBhbmQgaG93dG8uICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgYmZkX2J5dGUgKmxvY2F0aW9uOwotewotICBpbnQgc2l6ZTsKLSAgYmZkX3ZtYSB4ID0gMDsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWc7Ci0gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0ID0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHVuc2lnbmVkIGludCBiaXRwb3MgPSBob3d0by0+Yml0cG9zOwotCi0gIC8qIElmIHRoZSBzaXplIGlzIG5lZ2F0aXZlLCBuZWdhdGUgUkVMT0NBVElPTi4gIFRoaXMgaXNuJ3QgdmVyeQotICAgICBnZW5lcmFsLiAgKi8KLSAgaWYgKGhvd3RvLT5zaXplIDwgMCkKLSAgICByZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0KLSAgLyogR2V0IHRoZSB2YWx1ZSB3ZSBhcmUgZ29pbmcgdG8gcmVsb2NhdGUuICAqLwotICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIDE6Ci0gICAgICB4ID0gYmZkX2dldF84IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSNpZmRlZiBCRkQ2NAotICAgICAgeCA9IGJmZF9nZXRfNjQgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAgRklYTUU6IFdlIG1heSBkcm9wIGJpdHMgZHVyaW5nIHRoZSBhZGRpdGlvbgotICAgICB3aGljaCB3ZSBkb24ndCBjaGVjayBmb3IuICBXZSBtdXN0IGVpdGhlciBjaGVjayBhdCBldmVyeSBzaW5nbGUKLSAgICAgb3BlcmF0aW9uLCB3aGljaCB3b3VsZCBiZSB0ZWRpb3VzLCBvciB3ZSBtdXN0IGRvIHRoZSBjb21wdXRhdGlvbnMKLSAgICAgaW4gYSB0eXBlIGxhcmdlciB0aGFuIGJmZF92bWEsIHdoaWNoIHdvdWxkIGJlIGluZWZmaWNpZW50LiAgKi8KLSAgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkcm1hc2ssIGZpZWxkbWFzaywgc2lnbm1hc2ssIHNzOwotICAgICAgYmZkX3ZtYSBhLCBiLCBzdW07Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWVzIHRvIGJlIGFkZGVkIHRvZ2V0aGVyLiAgRm9yIHNpZ25lZCBhbmQgdW5zaWduZWQKLSAgICAgICAgIHJlbG9jYXRpb25zLCB3ZSBhc3N1bWUgdGhhdCBhbGwgdmFsdWVzIHNob3VsZCBiZSB0cnVuY2F0ZWQgdG8KLSAgICAgICAgIHRoZSBzaXplIG9mIGFuIGFkZHJlc3MuICBGb3IgYml0ZmllbGRzLCBhbGwgdGhlIGJpdHMgbWF0dGVyLgotICAgICAgICAgU2VlIGFsc28gYmZkX2NoZWNrX292ZXJmbG93LiAgKi8KLSAgICAgIGZpZWxkbWFzayA9IE5fT05FUyAoaG93dG8tPmJpdHNpemUpOwotICAgICAgYWRkcm1hc2sgPSBOX09ORVMgKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGlucHV0X2JmZCkpIHwgZmllbGRtYXNrOwotICAgICAgYSA9IHJlbG9jYXRpb247Ci0gICAgICBiID0geCAmIGhvd3RvLT5zcmNfbWFzazsKLQotICAgICAgc3dpdGNoIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cpCi0JewotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotCSAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0KLQkgIC8qIElmIGFueSBzaWduIGJpdHMgYXJlIHNldCwgYWxsIHNpZ24gYml0cyBtdXN0IGJlIHNldC4KLQkgICAgIFRoYXQgaXMsIEEgbXVzdCBiZSBhIHZhbGlkIG5lZ2F0aXZlIGFkZHJlc3MgYWZ0ZXIKLQkgICAgIHNoaWZ0aW5nLiAgKi8KLQkgIHNpZ25tYXNrID0gfiAoZmllbGRtYXNrID4+IDEpOwotCSAgc3MgPSBhICYgc2lnbm1hc2s7Ci0JICBpZiAoc3MgIT0gMCAmJiBzcyAhPSAoKGFkZHJtYXNrID4+IHJpZ2h0c2hpZnQpICYgc2lnbm1hc2spKQotCSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0JICAvKiBXZSBvbmx5IG5lZWQgdGhpcyBuZXh0IGJpdCBvZiBjb2RlIGlmIHRoZSBzaWduIGJpdCBvZiBCCi0gICAgICAgICAgICAgaXMgYmVsb3cgdGhlIHNpZ24gYml0IG9mIEEuICBUaGlzIHdvdWxkIG9ubHkgaGFwcGVuIGlmCi0gICAgICAgICAgICAgU1JDX01BU0sgaGFkIGZld2VyIGJpdHMgdGhhbiBCSVRTSVpFLiAgTm90ZSB0aGF0IGlmCi0gICAgICAgICAgICAgU1JDX01BU0sgaGFzIG1vcmUgYml0cyB0aGFuIEJJVFNJWkUsIHdlIGNhbiBnZXQgaW50bwotICAgICAgICAgICAgIHRyb3VibGU7IHdlIHdvdWxkIG5lZWQgdG8gdmVyaWZ5IHRoYXQgQiBpcyBpbiByYW5nZSwgYXMKLSAgICAgICAgICAgICB3ZSBkbyBmb3IgQSBhYm92ZS4gICovCi0JICBzaWdubWFzayA9ICgofiBob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrOwotCSAgaWYgKChiICYgc2lnbm1hc2spICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBTZXQgYWxsIHRoZSBiaXRzIGFib3ZlIHRoZSBzaWduIGJpdC4gICovCi0JICAgICAgYiAtPSBzaWdubWFzayA8PCAxOwotCSAgICB9Ci0KLQkgIGIgPSAoYiAmIGFkZHJtYXNrKSA+PiBiaXRwb3M7Ci0KLQkgIC8qIE5vdyB3ZSBjYW4gZG8gdGhlIGFkZGl0aW9uLiAgKi8KLQkgIHN1bSA9IGEgKyBiOwotCi0JICAvKiBTZWUgaWYgdGhlIHJlc3VsdCBoYXMgdGhlIGNvcnJlY3Qgc2lnbi4gIEJpdHMgYWJvdmUgdGhlCi0gICAgICAgICAgICAgc2lnbiBiaXQgYXJlIGp1bmsgbm93OyBpZ25vcmUgdGhlbS4gIElmIHRoZSBzdW0gaXMKLSAgICAgICAgICAgICBwb3NpdGl2ZSwgbWFrZSBzdXJlIHdlIGRpZCBub3QgaGF2ZSBhbGwgbmVnYXRpdmUgaW5wdXRzOwotICAgICAgICAgICAgIGlmIHRoZSBzdW0gaXMgbmVnYXRpdmUsIG1ha2Ugc3VyZSB3ZSBkaWQgbm90IGhhdmUgYWxsCi0gICAgICAgICAgICAgcG9zaXRpdmUgaW5wdXRzLiAgVGhlIHRlc3QgYmVsb3cgbG9va3Mgb25seSBhdCB0aGUgc2lnbgotICAgICAgICAgICAgIGJpdHMsIGFuZCBpdCByZWFsbHkganVzdAotCSAgICAgICAgIFNJR04gKEEpID09IFNJR04gKEIpICYmIFNJR04gKEEpICE9IFNJR04gKFNVTSkKLQkgICAgICovCi0JICBzaWdubWFzayA9IChmaWVsZG1hc2sgPj4gMSkgKyAxOwotCSAgaWYgKCgofiAoYSBeIGIpKSAmIChhIF4gc3VtKSkgJiBzaWdubWFzaykKLQkgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotCSAgLyogQ2hlY2tpbmcgZm9yIGFuIHVuc2lnbmVkIG92ZXJmbG93IGlzIHJlbGF0aXZlbHkgZWFzeToKLSAgICAgICAgICAgICB0cmltIHRoZSBhZGRyZXNzZXMgYW5kIGFkZCwgYW5kIHRyaW0gdGhlIHJlc3VsdCBhcyB3ZWxsLgotICAgICAgICAgICAgIE92ZXJmbG93IGlzIG5vcm1hbGx5IGluZGljYXRlZCB3aGVuIHRoZSByZXN1bHQgZG9lcyBub3QKLSAgICAgICAgICAgICBmaXQgaW4gdGhlIGZpZWxkLiAgSG93ZXZlciwgd2UgYWxzbyBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgICAgICAgICAgIGNhc2Ugd2hlbiwgZS5nLiwgZmllbGRtYXNrIGlzIDB4N2ZmZmZmZmYgb3Igc21hbGxlciwgYW4KLSAgICAgICAgICAgICBpbnB1dCBpcyAweDgwMDAwMDAwLCBhbmQgYmZkX3ZtYSBpcyBvbmx5IDMyIGJpdHM7IHRoZW4gd2UKLSAgICAgICAgICAgICB3aWxsIGdldCBzdW0gPT0gMCwgYnV0IHRoZXJlIGlzIGFuIG92ZXJmbG93LCBzaW5jZSB0aGUKLSAgICAgICAgICAgICBpbnB1dHMgZGlkIG5vdCBmaXQgaW4gdGhlIGZpZWxkLiAgSW5zdGVhZCBvZiBkb2luZyBhCi0gICAgICAgICAgICAgc2VwYXJhdGUgdGVzdCwgd2UgY2FuIGNoZWNrIGZvciB0aGlzIGJ5IG9yLWluZyBpbiB0aGUKLSAgICAgICAgICAgICBvcGVyYW5kcyB3aGVuIHRlc3RpbmcgZm9yIHRoZSBzdW0gb3ZlcmZsb3dpbmcgaXRzIGZpbmFsCi0gICAgICAgICAgICAgZmllbGQuICAqLwotCSAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0JICBiID0gKGIgJiBhZGRybWFzaykgPj4gYml0cG9zOwotCSAgc3VtID0gKGEgKyBiKSAmIGFkZHJtYXNrOwotCSAgaWYgKChhIHwgYiB8IHN1bSkgJiB+IGZpZWxkbWFzaykKLQkgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgLyogTXVjaCBsaWtlIHRoZSBzaWduZWQgY2hlY2ssIGJ1dCBmb3IgYSBmaWVsZCBvbmUgYml0Ci0JICAgICB3aWRlciwgYW5kIG5vIHRyaW1taW5nIHdpdGggYWRkcm1hc2suICBXZSBhbGxvdyBhCi0JICAgICBiaXRmaWVsZCB0byByZXByZXNlbnQgbnVtYmVycyBpbiB0aGUgcmFuZ2UgLTIqKm4gdG8KLQkgICAgIDIqKm4tMSwgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZpZWxkLgotCSAgICAgTm90ZSB0aGF0IHdoZW4gYmZkX3ZtYSBpcyAzMiBiaXRzLCBhIDMyLWJpdCByZWxvYyBjYW4ndAotCSAgICAgb3ZlcmZsb3csIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LiAgKi8KLQkgIGEgPj49IHJpZ2h0c2hpZnQ7Ci0KLQkgIHNpZ25tYXNrID0gfiBmaWVsZG1hc2s7Ci0JICBzcyA9IGEgJiBzaWdubWFzazsKLQkgIGlmIChzcyAhPSAwICYmIHNzICE9ICgoKGJmZF92bWEpIC0xID4+IHJpZ2h0c2hpZnQpICYgc2lnbm1hc2spKQotCSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0JICBzaWdubWFzayA9ICgofiBob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrOwotCSAgaWYgKChiICYgc2lnbm1hc2spICE9IDApCi0JICAgIGIgLT0gc2lnbm1hc2sgPDwgMTsKLQotCSAgYiA+Pj0gYml0cG9zOwotCi0JICBzdW0gPSBhICsgYjsKLQotCSAgc2lnbm1hc2sgPSBmaWVsZG1hc2sgKyAxOwotCSAgaWYgKCgofiAoYSBeIGIpKSAmIChhIF4gc3VtKSkgJiBzaWdubWFzaykKLQkgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICAvKiBQdXQgUkVMT0NBVElPTiBpbiB0aGUgcmlnaHQgYml0cy4gICovCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSByaWdodHNoaWZ0OwotICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgYml0cG9zOwotCi0gIC8qIEFkZCBSRUxPQ0FUSU9OIHRvIHRoZSByaWdodCBiaXRzIG9mIFguICAqLwotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykKLSAgICAgICB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKTsKLQotICAvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIDE6Ci0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSNpZmRlZiBCRkQ2NAotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyoKLURPQ0RECi1JTk9ERQotCWhvd3RvIG1hbmFnZXIsICAsIHR5cGVkZWYgYXJlbGVudCwgUmVsb2NhdGlvbnMKLQotU0VDVElPTgotCVRoZSBob3d0byBtYW5hZ2VyCi0KLQlXaGVuIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNyZWF0ZSBhIHJlbG9jYXRpb24sIGJ1dCBkb2Vzbid0Ci0Ja25vdyB3aGF0IHRoZSB0YXJnZXQgbWFjaGluZSBtaWdodCBjYWxsIGl0LCBpdCBjYW4gZmluZCBvdXQgYnkKLQl1c2luZyB0aGlzIGJpdCBvZiBjb2RlLgotCi0qLwotCi0vKgotVFlQRURFRgotCWJmZF9yZWxvY19jb2RlX3R5cGUKLQotREVTQ1JJUFRJT04KLQlUaGUgaW5zaWRlcyBvZiBhIHJlbG9jIGNvZGUuICBUaGUgaWRlYSBpcyB0aGF0LCBldmVudHVhbGx5LCB0aGVyZQotCXdpbGwgYmUgb25lIGVudW1lcmF0b3IgZm9yIGV2ZXJ5IHR5cGUgb2YgcmVsb2NhdGlvbiB3ZSBldmVyIGRvLgotCVBhc3Mgb25lIG9mIHRoZXNlIHZhbHVlcyB0byA8PGJmZF9yZWxvY190eXBlX2xvb2t1cD4+LCBhbmQgaXQnbGwKLQlyZXR1cm4gYSBob3d0byBwb2ludGVyLgotCi0JVGhpcyBkb2VzIG1lYW4gdGhhdCB0aGUgYXBwbGljYXRpb24gbXVzdCBkZXRlcm1pbmUgdGhlIGNvcnJlY3QKLQllbnVtZXJhdG9yIHZhbHVlOyB5b3UgY2FuJ3QgZ2V0IGEgaG93dG8gcG9pbnRlciBmcm9tIGEgcmFuZG9tIHNldAotCW9mIGF0dHJpYnV0ZXMuCi0KLVNFTlVNCi0gICBiZmRfcmVsb2NfY29kZV9yZWFsCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzY0Ci1FTlVNWAotICBCRkRfUkVMT0NfMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yNgotRU5VTVgKLSAgQkZEX1JFTE9DXzI0Ci1FTlVNWAotICBCRkRfUkVMT0NfMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNAotRU5VTVgKLSAgQkZEX1JFTE9DXzgKLUVOVU1ET0MKLSAgQmFzaWMgYWJzb2x1dGUgcmVsb2NhdGlvbnMgb2YgTiBiaXRzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182NF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMjRfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzEyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9QQ1JFTAotRU5VTURPQwotICBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4gIFNvbWV0aW1lcyB0aGVzZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MKLW9mIHRoZSByZWxvY2F0aW9uIGl0c2VsZjsgc29tZXRpbWVzIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgotdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbi4gIEl0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHRhcmdldC4KLQotVGhlIDI0LWJpdCByZWxvY2F0aW9uIGlzIHVzZWQgaW4gc29tZSBJbnRlbCA5NjAgY29uZmlndXJhdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfR09UX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X1BMVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X1BMVE9GRgotRU5VTURPQwotICBGb3IgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182OEtfR0xPQl9EQVQKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfUkVMQVRJVkUKLUVOVU1ET0MKLSAgUmVsb2NhdGlvbnMgdXNlZCBieSA2OEsgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ18zMl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfUlZBCi1FTlVNRE9DCi0gIExpbmthZ2UtdGFibGUgcmVsYXRpdmUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzhfRkZubgotRU5VTURPQwotICBBYnNvbHV0ZSA4LWJpdCByZWxvY2F0aW9uLCBidXQgdXNlZCB0byBmb3JtIGFuIGFkZHJlc3MgbGlrZSAweEZGbm4uCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUENSRUxfUzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yM19QQ1JFTF9TMgotRU5VTURPQwotICBUaGVzZSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGFzIHdvcmQgZGlzcGxhY2VtZW50cyAtLQotaS5lLiwgYnl0ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuICBUaGUgMzAtYml0IHdvcmQKLWRpc3BsYWNlbWVudCAoPDwzMl9QQ1JFTF9TMj4+IC0tIDMyIGJpdHMsIHNoaWZ0ZWQgMikgaXMgdXNlZCBvbiB0aGUKLVNQQVJDLiAgKFNQQVJDIHRvb2xzIGdlbmVyYWxseSByZWZlciB0byB0aGlzIGFzIDw8V0RJU1AzMD4+LikgIFRoZQotc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgTUlQUywgYW5kIHRoZSAyMy1iaXQKLWRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBBbHBoYS4KLQotRU5VTQotICBCRkRfUkVMT0NfSEkyMgotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTAKLUVOVU1ET0MKLSAgSGlnaCAyMiBiaXRzIGFuZCBsb3cgMTAgYml0cyBvZiAzMi1iaXQgdmFsdWUsIHBsYWNlZCBpbnRvIGxvd2VyIGJpdHMgb2YKLXRoZSB0YXJnZXQgd29yZC4gIFRoZXNlIGFyZSB1c2VkIG9uIHRoZSBTUEFSQy4KLQotRU5VTQotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTVgKLSAgQkZEX1JFTE9DX0dQUkVMMzIKLUVOVU1ET0MKLSAgRm9yIHN5c3RlbXMgdGhhdCBhbGxvY2F0ZSBhIEdsb2JhbCBQb2ludGVyIHJlZ2lzdGVyLCB0aGVzZSBhcmUKLWRpc3BsYWNlbWVudHMgb2ZmIHRoYXQgcmVnaXN0ZXIuICBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZQotaGFuZGxlZCBzcGVjaWFsbHksIGJlY2F1c2UgdGhlIHZhbHVlIHRoZSByZWdpc3RlciB3aWxsIGhhdmUgaXMKLWRlY2lkZWQgcmVsYXRpdmVseSBsYXRlLgotCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0k5NjBfQ0FMTEoKLUVOVU1ET0MKLSAgUmVsb2MgdHlwZXMgdXNlZCBmb3IgaTk2MC9iLm91dC4KLQotRU5VTQotICBCRkRfUkVMT0NfTk9ORQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkMxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTMKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1VBMzIKLUVOVU1ET0MKLSAgU1BBUkMgRUxGIHJlbG9jYXRpb25zLiAgVGhlcmUgaXMgcHJvYmFibHkgc29tZSBvdmVybGFwIHdpdGggb3RoZXIKLSAgcmVsb2NhdGlvbiB0eXBlcyBhbHJlYWR5IGRlZmluZWQuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UyMgotRU5VTURPQwotICBJIHRoaW5rIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBTUEFSQyBhLm91dCAoZS5nLiwgU3VuIDQpLgotCi1FTlVNRVEKLSAgQkZEX1JFTE9DX1NQQVJDXzY0Ci0gIEJGRF9SRUxPQ182NAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfMTEKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19PTE8xMAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfNwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ181Ci1FTlVNRVFYCi0gIEJGRF9SRUxPQ19TUEFSQ19ESVNQNjQKLSAgQkZEX1JFTE9DXzY0X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUExUNjQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ISVgyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0xPWDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTTQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIKLUVOVU1ET0MKLSAgU1BBUkM2NCByZWxvY2F0aW9ucwotCi1FTlVNCi0gIEJGRF9SRUxPQ19TUEFSQ19SRVYzMgotRU5VTURPQwotICBTUEFSQyBsaXR0bGUgZW5kaWFuIHJlbG9jYXRpb24KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYKLUVOVU1ET0MKLSAgQWxwaGEgRUNPRkYgYW5kIEVMRiByZWxvY2F0aW9ucy4gIFNvbWUgb2YgdGhlc2UgdHJlYXQgdGhlIHN5bWJvbCBvcgotICAgICAiYWRkZW5kIiBpbiBzb21lIHNwZWNpYWwgd2F5LgotICBGb3IgR1BESVNQX0hJMTYgKCJncGRpc3AiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBpZ25vcmVkIHdoZW4KLSAgICAgd3JpdGluZzsgd2hlbiByZWFkaW5nLCBpdCB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gIFRoZQotICAgICBhZGRlbmQgaXMgdGhlIGRpc3BsYWNlbWVudCBpbiBieXRlcyBvZiB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZnJvbQotICAgICB0aGUgImxkYWgiIGluc3RydWN0aW9uICh3aGljaCBpcyBhdCB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jKS4KLUVOVU0KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2Ci1FTlVNRE9DCi0gIEZvciBHUERJU1BfTE8xNiAoImlnbm9yZSIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGhhbmRsZWQgYXMKLSAgICAgd2l0aCBHUERJU1BfSEkxNiByZWxvY3MuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nIHRoZQotICAgICByZWxvY2F0aW9ucyBvdXQsIGFuZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uCi0gICAgIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZS4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQCi1FTlVNRE9DCi0gIFRoZSBFTEYgR1BESVNQIHJlbG9jYXRpb24gaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgR1BESVNQX0hJMTYKLSAgICAgcmVsb2NhdGlvbiBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBhY2NvbXBhbnlpbmcgR1BESVNQX0xPMTYKLSAgICAgcmVsb2NhdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfTElUVVNFCi1FTlVNRE9DCi0gIFRoZSBBbHBoYSBMSVRFUkFML0xJVFVTRSByZWxvY3MgYXJlIHByb2R1Y2VkIGJ5IGEgc3ltYm9sIHJlZmVyZW5jZTsKLSAgICAgdGhlIGFzc2VtYmxlciB0dXJucyBpdCBpbnRvIGEgTERRIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIHN5bWJvbCwgYW5kIHRoZW4gZmlsbHMgaW4gYSByZWdpc3RlciBpbiB0aGUgcmVhbCBpbnN0cnVjdGlvbi4KLQotICAgICBUaGUgTElURVJBTCByZWxvYywgYXQgdGhlIExEUSBpbnN0cnVjdGlvbiwgcmVmZXJzIHRvIHRoZSAubGl0YQotICAgICBzZWN0aW9uIHN5bWJvbC4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcsIGJ1dCBpcyBmaWxsZWQKLSAgICAgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZSwgYXMgd2l0aCB0aGUKLSAgICAgR1BESVNQX0xPMTYgcmVsb2MuCi0KLSAgICAgVGhlIEVMRl9MSVRFUkFMIHJlbG9jIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDE2X0dPVE9GRiBhbmQgR1BESVNQX0xPMTYuCi0gICAgIEl0IHNob3VsZCByZWZlciB0byB0aGUgc3ltYm9sIHRvIGJlIHJlZmVyZW5jZWQsIGFzIHdpdGggMTZfR09UT0ZGLAotICAgICBidXQgaXQgZ2VuZXJhdGVzIG91dHB1dCBub3QgYmFzZWQgb24gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgLmdvdAotICAgICBzZWN0aW9uLCBidXQgcmVsYXRpdmUgdG8gdGhlIEdQIHZhbHVlIGNob3NlbiBmb3IgdGhlIGZpbGUgZHVyaW5nIHRoZQotICAgICBmaW5hbCBsaW5rIHN0YWdlLgotCi0gICAgIFRoZSBMSVRVU0UgcmVsb2MsIG9uIHRoZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUgbG9hZGVkIGFkZHJlc3MsIGdpdmVzCi0gICAgIGluZm9ybWF0aW9uIHRvIHRoZSBsaW5rZXIgdGhhdCBpdCBtaWdodCBiZSBhYmxlIHRvIHVzZSB0byBvcHRpbWl6ZQotICAgICBhd2F5IHNvbWUgbGl0ZXJhbCBzZWN0aW9uIHJlZmVyZW5jZXMuICBUaGUgc3ltYm9sIGlzIGlnbm9yZWQgKHJlYWQKLSAgICAgYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sKSwgYW5kIHRoZSAiYWRkZW5kIiBpbmRpY2F0ZXMgdGhlIHR5cGUKLSAgICAgb2YgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIHJlZ2lzdGVyOgotICAgICAgICAgICAgICAxIC0gIm1lbW9yeSIgZm10IGluc24KLSAgICAgICAgICAgICAgMiAtIGJ5dGUtbWFuaXB1bGF0aW9uIChieXRlIG9mZnNldCByZWcpCi0gICAgICAgICAgICAgIDMgLSBqc3IgKHRhcmdldCBvZiBicmFuY2gpCi0KLSAgICAgVGhlIEdOVSBsaW5rZXIgY3VycmVudGx5IGRvZXNuJ3QgZG8gYW55IG9mIHRoaXMgb3B0aW1pemluZy4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRQotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUgotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BESVNQCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0gKLUVOVU1YCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XCi1FTlVNRE9DCi0gIFRoZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl8qIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgdG8KLSAgICAgcHJvY2VzcyB0aGUgZXhwbGljaXQgITxyZWxvYz4hc2VxdWVuY2UgcmVsb2NhdGlvbnMsIGFuZCBhcmUgbWFwcGVkCi0gICAgIGludG8gdGhlIG5vcm1hbCByZWxvY2F0aW9ucyBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0FMUEhBX0hJTlQKLUVOVU1ET0MKLSAgVGhlIEhJTlQgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgYSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBmaWxsZWQgaW50byB0aGUKLSAgICAgImhpbnQiIGZpZWxkIG9mIGEgam1wL2pzci9yZXQgaW5zdHJ1Y3Rpb24sIGZvciBwb3NzaWJsZSBicmFuY2gtCi0gICAgIHByZWRpY3Rpb24gbG9naWMgd2hpY2ggbWF5IGJlIHByb3ZpZGVkIG9uIHNvbWUgcHJvY2Vzc29ycy4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRQotRU5VTURPQwotICBUaGUgTElOS0FHRSByZWxvY2F0aW9uIG91dHB1dHMgYSBsaW5rYWdlIHBhaXIgaW4gdGhlIG9iamVjdCBmaWxlLAotICAgICB3aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIKLUVOVU1ET0MKLSAgVGhlIENPREVBRERSIHJlbG9jYXRpb24gb3V0cHV0cyBhIFNUT19DQSBpbiB0aGUgb2JqZWN0IGZpbGUsCi0gICAgIHdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NSVBTX0pNUAotRU5VTURPQwotICBCaXRzIDI3Li4yIG9mIHRoZSByZWxvY2F0aW9uIGFkZHJlc3Mgc2hpZnRlZCByaWdodCAyIGJpdHM7Ci0gICAgIHNpbXBsZSByZWxvYyBvdGhlcndpc2UuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFMxNl9KTVAKLUVOVU1ET0MKLSAgVGhlIE1JUFMxNiBqdW1wIGluc3RydWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwKLUVOVU1ET0MKLSAgTUlQUzE2IEdQIHJlbGF0aXZlIHJlbG9jLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19ISTE2Ci1FTlVNRE9DCi0gIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWU7IHNpbXBsZSByZWxvYy4KLUVOVU0KLSAgQkZEX1JFTE9DX0hJMTZfUwotRU5VTURPQwotICBIaWdoIDE2IGJpdHMgb2YgMzItYml0IHZhbHVlIGJ1dCB0aGUgbG93IDE2IGJpdHMgd2lsbCBiZSBzaWduCi0gICAgIGV4dGVuZGVkIGFuZCBhZGRlZCB0byBmb3JtIHRoZSBmaW5hbCByZXN1bHQuICBJZiB0aGUgbG93IDE2Ci0gICAgIGJpdHMgZm9ybSBhIG5lZ2F0aXZlIG51bWJlciwgd2UgbmVlZCB0byBhZGQgb25lIHRvIHRoZSBoaWdoIHZhbHVlCi0gICAgIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBib3Jyb3cgd2hlbiB0aGUgbG93IGJpdHMgYXJlIGFkZGVkLgotRU5VTQotICBCRkRfUkVMT0NfTE8xNgotRU5VTURPQwotICBMb3cgMTYgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUwotRU5VTURPQwotICBMaWtlIEJGRF9SRUxPQ19ISTE2X1MsIGJ1dCBQQyByZWxhdGl2ZS4KLUVOVU0KLSAgQkZEX1JFTE9DX1BDUkVMX0xPMTYKLUVOVU1ET0MKLSAgTGlrZSBCRkRfUkVMT0NfTE8xNiwgYnV0IFBDIHJlbGF0aXZlLgotCi1FTlVNRVEKLSAgQkZEX1JFTE9DX01JUFNfR1BSRUwKLSAgQkZEX1JFTE9DX0dQUkVMMTYKLUVOVU1ET0MKLSAgUmVsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgZ2xvYmFsIHBvaW50ZXIuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFNfTElURVJBTAotRU5VTURPQwotICBSZWxvY2F0aW9uIGFnYWluc3QgYSBNSVBTIGxpdGVyYWwgc2VjdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQU19HT1QxNgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfQ0FMTDE2Ci1FTlVNRVFYCi0gIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIKLSAgQkZEX1JFTE9DX0dQUkVMMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX1NVQgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX1BBR0UKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNUCi1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19HT1RfRElTUAotQ09NTUVOVAotRU5VTURPQwotICBNSVBTIEVMRiByZWxvY2F0aW9ucy4KLQotQ09NTUVOVAotCi1FTlVNCi0gIEJGRF9SRUxPQ18zODZfR09UMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfUExUMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfUkVMQVRJVkUKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0dPVFBDCi1FTlVNRE9DCi0gIGkzODYvZWxmIHJlbG9jYXRpb25zCi0KLUVOVU0KLSAgQkZEX1JFTE9DX05TMzJLX0lNTV84Ci1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzgKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMgotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMCi1FTlVNRE9DCi0gIG5zMzJrIHJlbG9jYXRpb25zCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1BKX0NPREVfSEkxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BKX0NPREVfTE8xNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BKX0NPREVfRElSMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyCi1FTlVNWAotICBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BKX0NPREVfUkVMMzIKLUVOVU1ET0MKLSAgUGljb2phdmEgcmVsb2NzLiAgTm90IGFsbCBvZiB0aGVzZSBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19QUENfQjI2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0JBMjYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfVE9DMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQjE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CQTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0NPUFkKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfUkVMQVRJVkUKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfTE9DQUwyNFBDCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTIxCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTwotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEkKLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxECi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEKLUVOVU1ET0MKLSAgUG93ZXIocnM2MDAwKSBhbmQgUG93ZXJQQyByZWxvY2F0aW9ucy4KLQotRU5VTQotICBCRkRfUkVMT0NfSTM3MF9EMTIKLUVOVU1ET0MKLSAgSUJNIDM3MC8zOTAgcmVsb2NhdGlvbnMKLQotRU5VTQotICBCRkRfUkVMT0NfQ1RPUgotRU5VTURPQwotICBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIHRvIGJ1aWxkIGEgY29udHJ1Y3RvciB0YWJsZSAtIGF0IHRoZSBtb21lbnQKLSAgcHJvYmFibHkgYSAzMiBiaXQgd2lkZSBhYnNvbHV0ZSByZWxvY2F0aW9uLCBidXQgdGhlIHRhcmdldCBjYW4gY2hvb3NlLgotICBJdCBnZW5lcmFsbHkgZG9lcyBtYXAgdG8gb25lIG9mIHRoZSBvdGhlciByZWxvY2F0aW9uIHR5cGVzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNICi1FTlVNRE9DCi0gIEFSTSAyNiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQotICBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEUKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEUKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fU1dJCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX01VTFRJCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fQURSX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9MRFJfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0xJVEVSQUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fSU5fUE9PTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfQURECi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fR09UMTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fR09UMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fSlVNUF9TTE9UCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0NPUFkKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fR0xPQl9EQVQKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fUExUMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fUkVMQVRJVkUKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVFBDCi1FTlVNRE9DCi0gIFRoZXNlIHJlbG9jcyBhcmUgb25seSB1c2VkIHdpdGhpbiB0aGUgQVJNIGFzc2VtYmxlci4gIFRoZXkgYXJlIG5vdAotICAoYXQgcHJlc2VudCkgd3JpdHRlbiB0byBhbnkgb2JqZWN0IGZpbGVzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU00Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NNEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTRCWTQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU04Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NOEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTThCWTQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9TV0lUQ0gxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1NXSVRDSDMyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfVVNFUwotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0NPVU5UCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfQUxJR04KLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9DT0RFCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfREFUQQotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0xBQkVMCi1FTlVNRE9DCi0gIEhpdGFjaGkgU0ggcmVsb2NzLiAgTm90IGFsbCBvZiB0aGVzZSBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5Ci1FTlVNWAotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMwotRU5VTURPQwotICBUaHVtYiAyMy0sIDEyLSBhbmQgOS1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoZXMuICBUaGUgbG93ZXN0IGJpdCBtdXN0Ci0gIGJlIHplcm8gYW5kIGlzIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMCi1FTlVNRE9DCi0gIEFyZ29uYXV0IFJJU0MgQ29yZSAoQVJDKSByZWxvY3MuCi0gIEFSQyAyMiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQotICBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIDIwIGJpdHMgYXJlIGluc3RhbGxlZCBpbiBiaXRzIDI2Ci0gIHRocm91Z2ggNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BUkNfQjI2Ci1FTlVNRE9DCi0gIEFSQyAyNiBiaXQgYWJzb2x1dGUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZSBub3QKLSAgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIDI0IGJpdHMgYXJlIGluc3RhbGxlZCBpbiBiaXRzIDIzCi0gIHRocm91Z2ggMC4KLQotRU5VTQotICBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SCi1FTlVNRE9DCi0gIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCi0gIFRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi0gIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTAotRU5VTURPQwotICBNaXRzdWJpc2hpIEQxMFYgcmVsb2NzLgotICBUaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyByZWxvYwotICBleGNlcHQgaXQgaXMgaW4gdGhlIGxlZnQgY29udGFpbmVyLCBpLmUuLAotICBzaGlmdGVkIGxlZnQgMTUgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0QxMFZfMTgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi0gIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi0gIGFzc3VtZWQgdG8gYmUgMC4KLQotRU5VTQotICBCRkRfUkVMT0NfRDMwVl82Ci1FTlVNRE9DCi0gIE1pdHN1YmlzaGkgRDMwViByZWxvY3MuCi0gIFRoaXMgaXMgYSA2LWJpdCBhYnNvbHV0ZSByZWxvYy4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgNi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi0gIGFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLSAgb2YgdGhlIGNvbnRhaW5lci4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMTUKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDEyLWJpdCBhYnNvbHV0ZSByZWxvYyB3aXRoIHRoZQotICByaWdodCAzIGJpdHNhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUgotRU5VTURPQwotICBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLSAgYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotICBvZiB0aGUgY29udGFpbmVyLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8yMQotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCBhYnNvbHV0ZSByZWxvYyB3aXRoCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLSAgYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotICBvZiB0aGUgY29udGFpbmVyLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8zMgotRU5VTURPQwotICBUaGlzIGlzIGEgMzItYml0IGFic29sdXRlIHJlbG9jLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMzItYml0IHBjLXJlbGF0aXZlIHJlbG9jLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzI0Ci1FTlVNRE9DCi0gIE1pdHN1YmlzaGkgTTMyUiByZWxvY3MuCi0gIFRoaXMgaXMgYSAyNCBiaXQgYWJzb2x1dGUgYWRkcmVzcy4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMTBfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDEwLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMjYtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKLSAgdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHVuc2lnbmVkLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTwotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGhpZ2ggMTYgYml0cyBvZiBhbiBhZGRyZXNzCi0gIHVzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyBzaWduZWQuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSX0xPMTYKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBsb3dlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSX1NEQTE2Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgc21hbGwgZGF0YSBhcmVhIG9mZnNldCBmb3IgdXNlIGluCi0gIGFkZDMsIGxvYWQsIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgOS1iaXQgcmVsb2MKLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfMjJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDIyLWJpdCByZWxvYwotCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLSAgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotICB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGFuIDggYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA2IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi0gIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gOGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNyBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci0gIGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNyBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLUNPTU1FTlQKLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDUgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA0IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlIHRpbnkKLSAgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA0IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKLSAgYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQotICBiaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4KLUNPTU1FTlQKLQotRU5VTQotICBCRkRfUkVMT0NfTU4xMDMwMF8zMl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMzJiaXQgcGNyZWwgcmVsb2MgZm9yIHRoZSBtbjEwMzAwLCBvZmZzZXQgYnkgdHdvIGJ5dGVzIGluIHRoZQotICBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX01OMTAzMDBfMTZfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2Yml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLSAgaW5zdHJ1Y3Rpb24uCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1RJQzMwX0xEUAotRU5VTURPQwotICBUaGlzIGlzIGEgOGJpdCBEUCByZWxvYyBmb3IgdGhlIHRtczMyMGMzMCwgd2hlcmUgdGhlIG1vc3QKLSAgc2lnbmlmaWNhbnQgOCBiaXRzIG9mIGEgMjQgYml0IHdvcmQgYXJlIHBsYWNlZCBpbnRvIHRoZSBsZWFzdAotICBzaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIG9wY29kZS4KLQotRU5VTQotICBCRkRfUkVMT0NfRlIzMF80OAotRU5VTURPQwotICBUaGlzIGlzIGEgNDggYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyAzMiBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF8yMAotRU5VTURPQwotICBUaGlzIGlzIGEgMzIgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyAyMCBiaXRzIHNwbGl0IHVwIGludG8KLSAgdHdvIHNlY3Rpb25zLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF82X0lOXzQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA2IGJpdCB3b3JkIG9mZnNldCBpbgotICA0IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzhfSU5fOAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhbiA4IGJpdCBieXRlIG9mZnNldAotICBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfOV9JTl84Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgOSBiaXQgc2hvcnQgb2Zmc2V0Ci0gIGludG8gOCBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF8xMF9JTl84Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTAgYml0IHdvcmQgb2Zmc2V0Ci0gIGludG8gOCBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF85X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgOSBiaXQgcGMgcmVsYXRpdmUKLSAgc2hvcnQgb2Zmc2V0IGludG8gOCBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEyIGJpdCBwYyByZWxhdGl2ZQotICBzaG9ydCBvZmZzZXQgaW50byAxMSBiaXRzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9SVkEKLUVOVU1ET0MKLSAgTW90b3JvbGEgTWNvcmUgcmVsb2NhdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl83X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgOCBiaXQgcGMgcmVsYXRpdmUKLSAgc2hvcnQgb2Zmc2V0IGludG8gNyBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfQVZSXzEzX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgMTMgYml0IHBjIHJlbGF0aXZlCi0gIHNob3J0IG9mZnNldCBpbnRvIDEyIGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19BVlJfMTZfUE0KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyAxNyBiaXQgdmFsdWUgKHVzdWFsbHkKLSAgcHJvZ3JhbSBtZW1vcnkgYWRkcmVzcykgaW50byAxNiBiaXRzLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19BVlJfTE84X0xESQotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDggYml0IHZhbHVlICh1c3VhbGx5Ci0gIGRhdGEgbWVtb3J5IGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIExESSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0hJOF9MREkKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyA4IGJpdCB2YWx1ZSAoaGlnaCA4IGJpdAotICBvZiBkYXRhIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl9ISDhfTERJCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgOCBiaXQgdmFsdWUgKG1vc3QgaGlnaCA4IGJpdAotICBvZiBwcm9ncmFtIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl9MTzhfTERJX05FRwotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIG5lZ2F0ZWQgOCBiaXQgdmFsdWUKLSAgKHVzdWFsbHkgZGF0YSBtZW1vcnkgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUgb2YgU1VCSSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0hJOF9MRElfTkVHCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgbmVnYXRlZCA4IGJpdCB2YWx1ZQotICAoaGlnaCA4IGJpdCBvZiBkYXRhIG1lbW9yeSBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZgotICBTVUJJIGluc24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BVlJfSEg4X0xESV9ORUcKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEFWUiB0aGF0IHN0b3JlcyBuZWdhdGVkIDggYml0IHZhbHVlCi0gIChtb3N0IGhpZ2ggOCBiaXQgb2YgcHJvZ3JhbSBtZW1vcnkgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUKLSAgb2YgTERJIG9yIFNVQkkgaW5zbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl9MTzhfTERJX1BNCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgOCBiaXQgdmFsdWUgKHVzdWFsbHkKLSAgY29tbWFuZCBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl9ISThfTERJX1BNCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgOCBiaXQgdmFsdWUgKGhpZ2ggOCBiaXQKLSAgb2YgY29tbWFuZCBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZSB2YWx1ZSBvZiBMREkgaW5zbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl9ISDhfTERJX1BNCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgOCBiaXQgdmFsdWUgKG1vc3QgaGlnaCA4IGJpdAotICBvZiBjb21tYW5kIGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIExESSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0xPOF9MRElfUE1fTkVHCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgbmVnYXRlZCA4IGJpdCB2YWx1ZQotICAodXN1YWxseSBjb21tYW5kIGFkZHJlc3MpIGludG8gOCBiaXQgaW1tZWRpYXRlIHZhbHVlIG9mIFNVQkkgaW5zbi4KLUVOVU0KLSAgQkZEX1JFTE9DX0FWUl9ISThfTERJX1BNX05FRwotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIG5lZ2F0ZWQgOCBiaXQgdmFsdWUKLSAgKGhpZ2ggOCBiaXQgb2YgMTYgYml0IGNvbW1hbmQgYWRkcmVzcykgaW50byA4IGJpdCBpbW1lZGlhdGUgdmFsdWUKLSAgb2YgU1VCSSBpbnNuLgotRU5VTQotICBCRkRfUkVMT0NfQVZSX0hIOF9MRElfUE1fTkVHCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBBVlIgdGhhdCBzdG9yZXMgbmVnYXRlZCA4IGJpdCB2YWx1ZQotICAoaGlnaCA2IGJpdCBvZiAyMiBiaXQgY29tbWFuZCBhZGRyZXNzKSBpbnRvIDggYml0IGltbWVkaWF0ZQotICB2YWx1ZSBvZiBTVUJJIGluc24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BVlJfQ0FMTAotRU5VTURPQwotICBUaGlzIGlzIGEgMzIgYml0IHJlbG9jIGZvciB0aGUgQVZSIHRoYXQgc3RvcmVzIDIzIGJpdCB2YWx1ZQotICBpbnRvIDIyIGJpdHMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi1FTlVNWAotICBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi1FTlVNRE9DCi0gIFRoZXNlIHR3byByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgbGlua2VyIHRvIGRldGVybWluZSB3aGljaCBvZgotICB0aGUgZW50cmllcyBpbiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGFyZSBhY3R1YWxseSB1c2VkLiAgV2hlbgotICB0aGUgLS1nYy1zZWN0aW9ucyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBsaW5rZXIgd2lsbCB6ZXJvIG91dCB0aGUgZW50cmllcwotICB0aGF0IGFyZSBub3QgdXNlZCwgc28gdGhhdCB0aGUgY29kZSBmb3IgdGhvc2UgZnVuY3Rpb25zIG5lZWQgbm90IGJlCi0gIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0KLSAgVlRBQkxFX0lOSEVSSVQgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdXNlZCB0byBkZXNjcmliZSB0byB0aGUKLSAgbGlua2VyIHRoZSBpbmhlcml0ZW5jZSB0cmVlIG9mIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICBUaGUKLSAgcmVsb2NhdGlvbidzIHN5bWJvbCBzaG91bGQgYmUgdGhlIHBhcmVudCBjbGFzcycgdnRhYmxlLCBhbmQgdGhlCi0gIHJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2F0ZWQgYXQgdGhlIGNoaWxkIHZ0YWJsZS4KLQotICBWVEFCTEVfRU5UUlkgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdGhhdCBkZXNjcmliZXMgdGhlIHVzZSBvZiBhCi0gIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZW50cnkuICBUaGUgcmVsb2MncyBzeW1ib2wgc2hvdWxkIHJlZmVyIHRvIHRoZQotICB0YWJsZSBvZiB0aGUgY2xhc3MgbWVudGlvbmVkIGluIHRoZSBjb2RlLiAgT2ZmIG9mIHRoYXQgYmFzZSwgYW4gb2Zmc2V0Ci0gIGRlc2NyaWJlcyB0aGUgZW50cnkgdGhhdCBpcyBiZWluZyB1c2VkLiAgRm9yIFJlbGEgaG9zdHMsIHRoaXMgb2Zmc2V0Ci0gIGlzIHN0b3JlZCBpbiB0aGUgcmVsb2MncyBhZGRlbmQuICBGb3IgUmVsIGhvc3RzLCB3ZSBhcmUgZm9yY2VkIHRvIHB1dAotICB0aGlzIG9mZnNldCBpbiB0aGUgcmVsb2MncyBzZWN0aW9uIG9mZnNldC4KLQotRU5EU0VOVU0KLSAgQkZEX1JFTE9DX1VOVVNFRAotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZTsKLSovCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLVNZTk9QU0lTCi0JcmVsb2NfaG93dG9fdHlwZSAqCi0JYmZkX3JlbG9jX3R5cGVfbG9va3VwIChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwb2ludGVyIHRvIGEgaG93dG8gc3RydWN0dXJlIHdoaWNoLCB3aGVuCi0JaW52b2tlZCwgd2lsbCBwZXJmb3JtIHRoZSByZWxvY2F0aW9uIEB2YXJ7Y29kZX0gb24gZGF0YSBmcm9tIHRoZQotCWFyY2hpdGVjdHVyZSBub3RlZC4KLQotKi8KLQotCi1yZWxvY19ob3d0b190eXBlICoKLWJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCByZWxvY190eXBlX2xvb2t1cCwgKGFiZmQsIGNvZGUpKTsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYmZkX2hvd3RvXzMyID0KLUhPV1RPICgwLCAwMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlZSVDMyIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpOwotCi0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0KLVNZTk9QU0lTCi0JcmVsb2NfaG93dG9fdHlwZSAqYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLQkoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGNvZGUpOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVzIGEgZGVmYXVsdCByZWxvY2F0aW9uIGxvb2t1cCByb3V0aW5lIGZvciBhbnkgYXJjaGl0ZWN0dXJlLgotCi0KLSovCi0KLXJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIC8qIFRoZSB0eXBlIG9mIHJlbG9jIHVzZWQgaW4gYSBjdG9yLCB3aGljaCB3aWxsIGJlIGFzIHdpZGUgYXMgdGhlCi0JIGFkZHJlc3MgLSBzbyBlaXRoZXIgYSA2NCwgMzIsIG9yIDE2IGJpdHRlci4gICovCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLQl7Ci0JY2FzZSA2NDoKLQkgIEJGRF9GQUlMICgpOwotCWNhc2UgMzI6Ci0JICByZXR1cm4gJmJmZF9ob3d0b18zMjsKLQljYXNlIDE2OgotCSAgQkZEX0ZBSUwgKCk7Ci0JZGVmYXVsdDoKLQkgIEJGRF9GQUlMICgpOwotCX0KLSAgICBkZWZhdWx0OgotICAgICAgQkZEX0ZBSUwgKCk7Ci0gICAgfQotICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9yZWxvY19jb2RlX25hbWUKLQotU1lOT1BTSVMKLQljb25zdCBjaGFyICpiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVzIGEgcHJpbnRhYmxlIG5hbWUgZm9yIHRoZSBzdXBwbGllZCByZWxvY2F0aW9uIGNvZGUuCi0JVXNlZnVsIG1haW5seSBmb3IgcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMuCi0qLwotCi1jb25zdCBjaGFyICoKLWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKQotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaWYgKGNvZGUgPiBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHJldHVybiAwOwotICByZXR1cm4gYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lc1soaW50KWNvZGVdOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0JIChiZmQgKmFiZmQsCi0JICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICBib29sZWFuICopOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVzIGRlZmF1bHQgaGFuZGxpbmcgZm9yIHJlbGF4aW5nIGZvciBiYWNrIGVuZHMgd2hpY2gKLQlkb24ndCBkbyByZWxheGluZyAtLSBpLmUuLCBkb2VzIG5vdGhpbmcuCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICAqYWdhaW4gPSBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCSAoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVzIGRlZmF1bHQgaGFuZGxpbmcgZm9yIHJlbGF4aW5nIGZvciBiYWNrIGVuZHMgd2hpY2gKLQlkb24ndCBkbyBzZWN0aW9uIGdjIC0tIGkuZS4sIGRvZXMgbm90aGluZy4KLSovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi1TWU5PUFNJUwotCWJmZF9ieXRlICoKLQkgICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGJmZCAqYWJmZCwKLQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0JICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0JICAgICBiZmRfYnl0ZSAqZGF0YSwKLQkgICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotCSAgICAgYXN5bWJvbCAqKnN5bWJvbHMpOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVzIGRlZmF1bHQgaGFuZGxpbmcgb2YgcmVsb2NhdGlvbiBlZmZvcnQgZm9yIGJhY2sgZW5kcwotCXdoaWNoIGNhbid0IGJlIGJvdGhlcmVkIHRvIGRvIGl0IGVmZmljaWVudGx5LgotCi0qLwotCi1iZmRfYnl0ZSAqCi1iZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJICAgIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiByZWFkIGluIHRoZSBzZWN0aW9uICovCi0gIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJIChQVFIpIGRhdGEsCi0JCQkJIDAsCi0JCQkJIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2UncmUgbm90IHJlbGF4aW5nIHRoZSBzZWN0aW9uLCBzbyBqdXN0IGNvcHkgdGhlIHNpemUgaW5mbyAqLwotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSB0cnVlOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudDsKLSAgICAgIGZvciAocGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50ICE9IChhcmVsZW50ICopIE5VTEw7Ci0JICAgcGFyZW50KyspCi0JewotCSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgciA9Ci0JICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwKLQkJCQkgICAgKnBhcmVudCwKLQkJCQkgICAgKFBUUikgZGF0YSwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTCwKLQkJCQkgICAgJmVycm9yX21lc3NhZ2UpOwotCi0JICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKm9zID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgICAgICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzICovCi0JICAgICAgb3MtPm9yZWxvY2F0aW9uW29zLT5yZWxvY19jb3VudF0gPSAqcGFyZW50OwotCSAgICAgIG9zLT5yZWxvY19jb3VudCsrOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcywKLQkJCSB0cnVlKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCQkgIEJGRF9BU1NFUlQgKGVycm9yX21lc3NhZ2UgIT0gKGNoYXIgKikgTlVMTCk7Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkJKGxpbmtfaW5mbywgZXJyb3JfbWVzc2FnZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKigqcGFyZW50KS0+c3ltX3B0cl9wdHIpLAotCQkJICgqcGFyZW50KS0+aG93dG8tPm5hbWUsICgqcGFyZW50KS0+YWRkZW5kLAotCQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0KLWVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3JlbG9jMTYuYyBiL2JmZC9yZWxvYzE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2MxOGEuLjAwMDAwMDAKLS0tIGEvYmZkL3JlbG9jMTYuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKiA4IGFuZCAxNiBiaXQgQ09GRiByZWxvY2F0aW9uIGZ1bmN0aW9ucywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIAotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbSAKLSovCi0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIGJ5IGNvZmYtaDgzMDAgYW5kIGNvZmYtejhrIHRvIGRvCi0gICByZWxvY2F0aW9uLgotCi0gICBGSVhNRTogVGhpcyBjb2RlIHNob3VsZCBiZSByZXdyaXR0ZW4gdG8gc3VwcG9ydCB0aGUgbmV3IENPRkYKLSAgIGxpbmtlci4gIEJhc2ljYWxseSwgdGhleSBuZWVkIHRvIGRlYWwgd2l0aCBDT0ZGIHJlbG9jcyByYXRoZXIgdGhhbgotICAgQkZEIGdlbmVyaWMgcmVsb2NzLiAgVGhleSBzaG91bGQgc3RvcmUgdGhlIHJlbG9jcyBpbiBzb21lIGxvY2F0aW9uCi0gICB3aGVyZSBjb2ZmX2xpbmtfaW5wdXRfYmZkIGNhbiBmaW5kIHRoZW0gKGFuZCBjb2ZmX2xpbmtfaW5wdXRfYmZkCi0gICBzaG91bGQgYmUgY2hhbmdlZCB0byB1c2UgdGhpcyBsb2NhdGlvbiByYXRoZXIgdGhhbiByZXJlYWRpbmcgdGhlCi0gICBmaWxlKSAodW5sZXNzIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCBpbiB3aGljaCBjYXNlIHRoZXkgc2hvdWxkCi0gICBmcmVlIHVwIHRoZSByZWxvY3MgYWZ0ZXIgZGVhbGluZyB3aXRoIHRoZW0pLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotYmZkX3ZtYQotYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgYXN5bWJvbCAqc3ltYm9sID0gKihyZWxvYy0+c3ltX3B0cl9wdHIpOwotICAvKiBBIHN5bWJvbCBob2xkcyBhIHBvaW50ZXIgdG8gYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0IGZyb20gdGhlCi0gICAgIGJhc2Ugb2YgdGhlIHNlY3Rpb24uICBUbyByZWxvY2F0ZSwgd2UgZmluZCB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsCi0gICAgIGxpdmUgaW4gdGhlIG91dHB1dCBhbmQgYWRkIHRoYXQgaW4gKi8KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgQkZELiAgTG9vayBpdCB1cCBpbiB0aGUKLQkgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgd2hlbgotCSB3ZSBjb252ZXJ0IHRoaXMgc3R1ZmYgdG8gdXNlIGEgc3BlY2lmaWMgZmluYWxfbGluayBmdW5jdGlvbgotCSBhbmQgY2hhbmdlIHRoZSBpbnRlcmZhY2UgdG8gYmZkX3JlbGF4X3NlY3Rpb24gdG8gbm90IHJlcXVpcmUKLQkgdGhlIGdlbmVyaWMgc3ltYm9scy4gICovCi0gICAgICBoID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoaW5wdXRfc2VjdGlvbi0+b3duZXIsIGxpbmtfaW5mbywKLQkJCQkJYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwKLQkJCQkJZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JdmFsdWUgPSAoaC0+dS5kZWYudmFsdWUKLQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsc2UgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQl2YWx1ZSA9IGgtPnUuYy5zaXplOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwKLQkJICBpbnB1dF9zZWN0aW9uLT5vd25lciwgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MsCi0JCSAgdHJ1ZSkpKQotCSAgICBhYm9ydCAoKTsKLQkgIHZhbHVlID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHZhbHVlID0gc3ltYm9sLT52YWx1ZSArCi0Jc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsKLQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0gIAotICAvKiBBZGQgdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgcmVsb2NhdGlvbiAqLwotICB2YWx1ZSArPSByZWxvYy0+YWRkZW5kOwotICAKLSAgcmV0dXJuIHZhbHVlOwotfQotCi12b2lkCi1iZmRfcGVyZm9ybV9zbGlwKGFiZmQsIHNsaXAsIGlucHV0X3NlY3Rpb24sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzbGlwOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYXN5bWJvbCAqKnM7Ci0KLSAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7Ci0KLSAgLyogRmluZCBhbGwgc3ltYm9scyBwYXN0IHRoaXMgcG9pbnQsIGFuZCBtYWtlIHRoZW0ga25vdwotICAgICB3aGF0J3MgaGFwcGVuZWQgKi8KLSAgd2hpbGUgKCpzKSAKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwID0gKnM7Ci0gICAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKSAKLQl7Ci0JICAvKiBUaGlzIHdhcyBwb2ludGluZyBpbnRvIHRoaXMgc2VjdGlvbiwgc28gbWFuZ2xlIGl0ICovCi0JICBpZiAocC0+dmFsdWUgPiB2YWx1ZSkKLQkgICAgewotCSAgICAgIHAtPnZhbHVlIC09IHNsaXA7Ci0JICAgICAgaWYgKHAtPnVkYXRhLnAgIT0gTlVMTCkKLQkJewotCQkgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIHAtPnVkYXRhLnA7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0JCSAgaC0+cm9vdC51LmRlZi52YWx1ZSAtPSBzbGlwOwotCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudS5kZWYudmFsdWUgPT0gcC0+dmFsdWUpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBzKys7Ci0gICAgfSAgICAKLX0KLQotYm9vbGVhbiAKLWJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgaSwgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gaS0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gaTsKLSAgaW50ICpzaHJpbmtzOwotICBpbnQgc2hyaW5rID0gMDsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgLyogV2Ugb25seSBkbyBnbG9iYWwgcmVsYXhhdGlvbiBvbmNlLiAgSXQgaXMgbm90IHNhZmUgdG8gZG8gaXQgbXVsdGlwbGUKLSAgICAgdGltZXMgKHNlZSBkaXNjdXNzaW9uIG9mIHRoZSAic2hyaW5rcyIgYXJyYXkgYmVsb3cpLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NfdmVjdG9yICYmIHJlbG9jX3NpemUgPiAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgdGhlIHJlbG9jcyBhbmQgdGhpbmsgYWJvdXQgdGhlbSAqLwotICByZWxvY19jb3VudCA9Ci0gICAgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY192ZWN0b3IsCi0JCQkgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCkpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSByZWxvYzE2LmMgYW5kIHJlbGF0ZWQgcmVsYXhpbmcgY29kZSBpcyB2ZXJ5IHNpbXBsZSwgdGhlIHByaWNlCi0gICAgIGZvciB0aGF0IHNpbXBsaWNpdHkgaXMgd2UgY2FuIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UgZm9yCi0gICAgIGVhY2ggc2VjdGlvbi4KLQotICAgICBTbywgdG8gZ2V0IHRoZSBiZXN0IHJlc3VsdHMgd2l0aGluIHRoYXQgbGltaXRhdGlvbiwgd2UgZG8gbXVsdGlwbGUKLSAgICAgcmVsYXhpbmcgcGFzc2VzIG92ZXIgZWFjaCBzZWN0aW9uIGhlcmUuICBUaGF0IGludm9sdmVzIGtlZXBpbmcgdHJhY2sKLSAgICAgb2YgdGhlICJzaHJpbmsiIGF0IGVhY2ggcmVsb2MgaW4gdGhlIHNlY3Rpb24uICBUaGlzIGFsbG93cyB1cyB0bwotICAgICBhY2N1cmF0ZWx5IGRldGVybWluZSB0aGUgcmVsYXRpdmUgbG9jYXRpb24gb2YgdHdvIHJlbG9jcyB3aXRoaW4KLSAgICAgdGhpcyBzZWN0aW9uLgotCi0gICAgIEluIHRoZW9yeSwgaWYgd2Uga2VwdCB0aGUgInNocmlua3MiIGFycmF5IGZvciBlYWNoIHNlY3Rpb24gZm9yIHRoZQotICAgICBlbnRpcmUgbGluaywgd2UgY291bGQgdXNlIHRoZSBnZW5lcmljIHJlbGF4aW5nIGNvZGUgaW4gdGhlIGxpbmtlcgotICAgICBhbmQgZ2V0IGJldHRlciByZXN1bHRzLCBwYXJ0aWN1bGFybHkgZm9yIGpzci0+YnNyIGFuZCAyNC0+MTYgYml0Ci0gICAgIG1lbW9yeSByZWZlcmVuY2UgcmVsYXhhdGlvbnMuICAqLwotICAgICAKLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBpbnQgYW5vdGhlcl9wYXNzID0gMDsKLQotICAgICAgLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHNocmlua3MgYXJyYXkgZm9yIHRoaXMgc2VjdGlvbi4KLSAgICAgICAgIFRoZSBsYXN0IGVsZW1lbnQgaXMgdXNlZCBhcyBhbiBhY2N1bWxhdG9yIG9mIHNocmlua3MuICAqLwotICAgICAgc2hyaW5rcyA9IChpbnQgKikgYmZkX21hbGxvYyAoKHJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGludCkpOwotICAgICAgbWVtc2V0IChzaHJpbmtzLCAwLCAocmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoaW50KSk7Ci0KLSAgICAgIC8qIExvb3AgdW50aWwgbm90aGluZyBjaGFuZ2VzIGluIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBkbyB7Ci0JYXJlbGVudCAqKnBhcmVudDsKLQl1bnNpZ25lZCBpbnQgaTsKLQlsb25nIGo7Ci0KLQlhbm90aGVyX3Bhc3MgPSAwOwotCi0JZm9yIChpID0gMCwgcGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50OyBwYXJlbnQrKywgaSsrKSAKLQkgIHsKLQkgICAgLyogTGV0IHRoZSB0YXJnZXQvbWFjaGluZSBkZXBlbmRlbnQgY29kZSBleGFtaW5lIGVhY2ggcmVsb2MKLQkgICAgICAgaW4gdGhpcyBzZWN0aW9uIGFuZCBhdHRlbXB0IHRvIHNocmluayBpdC4gICovCi0JICAgIHNocmluayA9IGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUgKGFiZmQsIGlucHV0X3NlY3Rpb24sICpwYXJlbnQsCi0JCQkJCQlzaHJpbmtzW2ldLCBsaW5rX2luZm8pOwotCi0JICAgIC8qIElmIGl0IHNocnVuaywgbm90ZSBpdCBpbiB0aGUgc2hyaW5rcyBhcnJheSBhbmQgc2V0IHVwIGZvcgotCSAgICAgICBhbm90aGVyIHBhc3MuICAqLwotCSAgICBpZiAoc2hyaW5rICE9IHNocmlua3NbaV0pCi0JICAgICAgewotCSAgICAgICAgYW5vdGhlcl9wYXNzID0gMTsKLQkJZm9yIChqID0gaSArIDE7IGogPD0gcmVsb2NfY291bnQ7IGorKykKLQkJICBzaHJpbmtzW2pdICs9IHNocmluayAtIHNocmlua3NbaV07Ci0JICAgICAgfQotCSAgfQotICAKLSAgICAgIH0gd2hpbGUgKGFub3RoZXJfcGFzcyk7Ci0KLSAgICAgIHNocmluayA9IHNocmlua3NbcmVsb2NfY291bnRdOwotICAgICAgZnJlZSgoY2hhciAqKXNocmlua3MpOwotICAgIH0KLQotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgLT0gc2hyaW5rOyAgCi0gIGZyZWUoKGNoYXIgKilyZWxvY192ZWN0b3IpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYmZkX2J5dGUgKgotYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMoaW5fYWJmZCwKLQkJCQkJCWxpbmtfaW5mbywKLQkJCQkJCWxpbmtfb3JkZXIsCi0JCQkJCQlkYXRhLAotCQkJCQkJcmVsb2NhdGVhYmxlLAotCQkJCQkJc3ltYm9scykKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3I7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIElmIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBkb24ndCBib3RoZXIgdG8gcmVsYXguICAqLwotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGluX2FiZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLAotCQkJCQkJICAgICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICAvKiByZWFkIGluIHRoZSBzZWN0aW9uICovCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJIGRhdGEsCi0JCQkJIDAsCi0JCQkJIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICAKLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MoKHNpemVfdCkgcmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NfdmVjdG9yICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLCAKLQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLAotCQkJCQlzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIAotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQgPSByZWxvY192ZWN0b3I7Ci0gICAgICBhcmVsZW50ICpyZWxvYyA7Ci0gICAgICB1bnNpZ25lZCBpbnQgZHN0X2FkZHJlc3MgPSAwOwotICAgICAgdW5zaWduZWQgaW50IHNyY19hZGRyZXNzID0gMDsKLSAgICAgIHVuc2lnbmVkIGludCBydW47Ci0gICAgICB1bnNpZ25lZCBpbnQgaWR4OwotICAgIAotICAgICAgLyogRmluZCBob3cgbG9uZyBhIHJ1biB3ZSBjYW4gZG8gKi8KLSAgICAgIHdoaWxlIChkc3RfYWRkcmVzcyA8IGxpbmtfb3JkZXItPnNpemUpIAotCXsKLQkgIHJlbG9jID0gKnBhcmVudDsKLQkgIGlmIChyZWxvYykgCi0JICAgIHsKLQkgICAgICAvKiBOb3RlIHRoYXQgdGhlIHJlbGF4aW5nIGRpZG4ndCB0aWUgdXAgdGhlIGFkZHJlc3NlcyBpbiB0aGUKLQkJIHJlbG9jYXRpb24sIHNvIHdlIHVzZSB0aGUgb3JpZ2luYWwgYWRkcmVzcyB0byB3b3JrIG91dCB0aGUKLQkJIHJ1biBvZiBub24tcmVsb2NhdGVkIGRhdGEgKi8KLQkgICAgICBydW4gPSByZWxvYy0+YWRkcmVzcyAtIHNyY19hZGRyZXNzOwotCSAgICAgIHBhcmVudCsrOwotCSAgICB9Ci0JICBlbHNlIAotCSAgICB7Ci0JICAgICAgcnVuID0gbGlua19vcmRlci0+c2l6ZSAtIGRzdF9hZGRyZXNzOwotCSAgICB9Ci0JICAvKiBDb3B5IHRoZSBieXRlcyAqLwotCSAgZm9yIChpZHggPSAwOyBpZHggPCBydW47IGlkeCsrKQotCSAgICB7Ci0JICAgICAgZGF0YVtkc3RfYWRkcmVzcysrXSA9IGRhdGFbc3JjX2FkZHJlc3MrK107Ci0JICAgIH0KLSAgICAKLQkgIC8qIE5vdyBkbyB0aGUgcmVsb2NhdGlvbiAqLwotICAgIAotCSAgaWYgKHJlbG9jKSAKLQkgICAgewotCSAgICAgIGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgKGlucHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQkgICAgcmVsb2MsIGRhdGEsICZzcmNfYWRkcmVzcywKLQkJCQkJICAgICZkc3RfYWRkcmVzcyk7Ci0JICAgIH0gICAgCi0JfQotICAgIH0KLSAgZnJlZSgoY2hhciAqKXJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotfQotCmRpZmYgLS1naXQgYS9iZmQvcmlzY2l4LmMgYi9iZmQvcmlzY2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWIxOGMuLjAwMDAwMDAKLS0tIGEvYmZkL3Jpc2NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUklTQyBpWCAoQWNvcm4sIGFybSkgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLSAgIAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFJJU0MgaVggb3ZlcmxvYWRzIHRoZSBNQUdJQyBmaWVsZCB0byBpbmRpY2F0ZSBtb3JlIHRoYW4ganVzdCB0aGUgdXN1YWwKLSAgIFtaTk9dTUFHSUMgdmFsdWVzLiAgQWxzbyBpbmNsdWRlZCBhcmUgc3F1ZWV6aW5nIGluZm9ybWF0aW9uIGFuZAotICAgc2hhcmVkIGxpYnJhcnkgdXNhZ2UuICAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGNvbWUgZnJvbSB0aGUgbWFuIHBhZ2UuICAqLwotI2RlZmluZSBTSExJQkxFTiA2MAotCi0jZGVmaW5lIE1GX0lNUFVSRSAgICAgICAwMDIwMAotI2RlZmluZSBNRl9TUVVFRVpFRCAgICAgMDEwMDAKLSNkZWZpbmUgTUZfVVNFU19TTCAgICAgIDAyMDAwCi0jZGVmaW5lIE1GX0lTX1NMICAgICAgICAwNDAwMAotCi0vKiBDb21tb24gY29tYmluYXRpb25zLiAgKi8KLSNkZWZpbmUgSU1BR0lDICAgICAgICAgIChNRl9JTVBVUkV8Wk1BR0lDKSAgICAgIC8qIERlbWFuZCBsb2FkIChpbXB1cmUgdGV4dCkgKi8KLSNkZWZpbmUgU1BPTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfE9NQUdJQykgICAgIC8qIE9NQUdJQyB3aXRoIGxhcmdlIGhlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIG1heSBjb250YWluIGEgcmVmIHRvIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFyZWQgbGliIHJlcXVpcmVkIGJ5IHRoZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iamVjdC4gKi8KLSNkZWZpbmUgU0xPTUFHSUMgICAgICAgIChNRl9JU19TTHxPTUFHSUMpIC8qIEEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0ZXh0IHBvcnRpb24gb2YgdGhlIG9iamVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGFpbnMgIm92ZXJmbG93IHRleHQiIGZyb20gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBzaGFyZWQgbGlicmFyeSB0byBiZSBsaW5rZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHdpdGggYW4gb2JqZWN0ICovCi0jZGVmaW5lIFFNQUdJQyAgICAgICAgICAoTUZfU1FVRUVaRUR8Wk1BR0lDKSAgICAvKiBTcWVlemVkIGRlbWFuZCBwYWdlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IFRoaXMgaW50ZXJwcmV0YXRpb24gb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNQUdJQyBzZWVtcyB0byBiZSBhdCB2YXJpYW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2l0aCB0aGF0IHVzZWQgb24gb3RoZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyY2hpdGVjdHVyZXMuICovCi0jZGVmaW5lIFNQWk1BR0lDICAgICAgICAoTUZfVVNFU19TTHxaTUFHSUMpICAgICAvKiBwcm9ncmFtIHdoaWNoIHVzZXMgc2wgKi8KLSNkZWZpbmUgU1BRTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfFFNQUdJQykgICAgIC8qIHNxZWV6ZWQgZGl0dG8gKi8KLSNkZWZpbmUgU0xaTUFHSUMgICAgICAgIChNRl9JU19TTHxaTUFHSUMpICAgICAgIC8qIHNoYXJlZCBsaWIgcGFydCBvZiBwcm9nICovCi0jZGVmaW5lIFNMUFpNQUdJQyAgICAgICAoTUZfVVNFU19TTHxTTFpNQUdJQykgICAvKiBzbCB3aGljaCB1c2VzIGFub3RoZXIgKi8KLQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKCh4KS5hX2luZm8gJiBNRl9VU0VTX1NMKQotCi0vKiBPbmx5IGEgcHVyZSBPTUFHSUMgZmlsZSBoYXMgdGhlIG1pbmltYWwgaGVhZGVyICovCi0jZGVmaW5lIE5fVFhUT0ZGKHgpICAgICAgICAgICAgICAgICAgICAgXAotICgoeCkuYV9pbmZvID09IE9NQUdJQyA/IDMyICAgICAgICAgICAgIFwKLSAgOiAoTl9NQUdJQyh4KSA9PSBaTUFHSUMpID8gVEFSR0VUX1BBR0VfU0laRSAgXAotICA6IDk5OSkKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChOX01BR0lDKHgpICE9IFpNQUdJQyA/IDAgLyogb2JqZWN0IGZpbGUgb3IgTk1BR0lDICovICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIC8qIFByb2dyYW1zIHdpdGggc2hhcmVkIGxpYnMgYXJlIGxvYWRlZCBhdCB0aGUgZmlyc3QgcGFnZSBhZnRlciBhbGwgdGhlICAgXAotICAgICAgdGV4dCBzZWdtZW50cyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgcHJvZ3JhbXMuICBXaXRob3V0IGxvb2tpbmcgdGhpcyAgICBcCi0gICAgICB1cCB3ZSBjYW4ndCBrbm93IGV4YWN0bHkgd2hhdCB0aGUgYWRkcmVzcyB3aWxsIGJlLiAgQSByZWFzb25hYmxlIGd1ZXNzIFwKLSAgICAgIGlzIHRoYXQgYV9lbnRyeSB3aWxsIGJlIGluIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBleGVjdXRhYmxlLiAgKi8gICAgICAgXAotICAgOiBOX1NIQVJFRF9MSUIoeCkgPyAoKHgpLmFfZW50cnkgJiB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgOiBURVhUX1NUQVJUX0FERFIpCi0KLSNkZWZpbmUgTl9TWU1PRkYoeCkgXAotICAoTl9UWFRPRkYgKHgpICsgKHgpLmFfdGV4dCArICh4KS5hX2RhdGEgKyAoeCkuYV90cnNpemUgKyAoeCkuYV9kcnNpemUpCi0KLSNkZWZpbmUgTl9TVFJPRkYoeCkgKE5fU1lNT0ZGICh4KSArICh4KS5hX3N5bXMpCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDMyNzY4Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMzI3NjgKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2FybQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQocmlzY2l4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtcmlzY2l4IgotI2RlZmluZSBOX0JBRE1BRyh4KSAoKCgoeCkuYV9pbmZvICYgfjAwNzIwMCkgIT0gWk1BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKCh4KS5hX2luZm8gJiB+MDA2MDAwKSAhPSBPTUFHSUMpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICgoeCkuYV9pbmZvICE9IE5NQUdJQykpCi0jZGVmaW5lIE5fTUFHSUMoeCkgKCh4KS5hX2luZm8gJiB+MDcyMDApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgXAotICB7CQkJCQkJCQkJICAgXAotICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJCSAgIFwKLSAgICBmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkJICAgXAotICAgIGlmIChhZGF0YShhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCQkJCSAgIFwKLSAgICAgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwkgICBcCi0gICAgCQkJCQkJCQkJICAgXAotICAgIGV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7CSAgIFwKLSAgICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CQkJICAgXAotICAgIAkJCQkJCQkJCSAgIFwKLSAgICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgIFwKLQkJICAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkJICAgXAotICAgIGV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgXAotCQkgICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCQkgICBcCi0gICAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJCSAgIFwKLSAgICAJCQkJCQkJCQkgICBcCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgIFwKLSAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkJICAgXAotCSE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICBcCi0gICAgICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLSAgICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgXAotCQkJCQkJCQkJICAgXAotICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkJICAgXAotCSYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCQkJCSAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fU1lNT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmICghIE5BTUUoYW91dCx3cml0ZV9zeW1zKShhYmZkKSkgcmV0dXJuIGZhbHNlOwkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoISByaXNjaXhfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCSAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkJICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0gICAgICB9CQkJCQkJCQkJICAgXAotICB9Ci0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNl9kb25lIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJCSAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNiBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCSAgICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tdID0gewotICAvKiB0eXBlICAgICAgICAgICAgICBycyBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgIHNldG1hc2sgICAgcGNkb25lICovCi0gIEhPV1RPKCAwLCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI4IiwgICAgICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyggMSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMTYiLCAgICAgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCAyLCAgICAgICAgICAgICAgMCwgIDIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIzMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDMsICAgICAgICAgICAgICAyLCAgMywgICAyNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgcmlzY2l4X2ZpeF9wY3JlbF8yNiAsICJBUk0yNiIsICAgICAgdHJ1ZSwgMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCA0LCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQOCIsICAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyggNSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDE2IiwgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8oIDYsICAgICAgICAgICAgICAwLCAgMiwgICAzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AzMiIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPKCA3LCAgICAgICAgICAgICAgMiwgIDMsICAgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICByaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUsICJBUk0yNkQiLHRydWUsMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCi0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPKCA5LCAgICAgICAgICAgICAgMCwgLTEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUcxNiIsICAgICAgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDEwLCAgICAgICAgICAgICAgMCwgLTIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUczMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKQotfTsKLQotI2RlZmluZSBSSVNDSVhfVEFCTEVfU0laRSBcCi0gIChzaXplb2YgKHJpc2NpeF9zdGRfcmVsb2NfaG93dG8pIC8gc2l6ZW9mIChyZWxvY19ob3d0b190eXBlKSkKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFRoaXMgaXMgZGVhZCBzaW1wbGUgYXQgcHJlc2VudC4gICovCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJpc2NpeF9maXhfcGNyZWxfMjYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB0YXJnZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19jb250aW51ZSA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb25zIGFyZSBkaWZmZXJlbnQsIGFuZCB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24sCi0gICAgIGp1c3QgaWdub3JlIGl0IGZvciBub3cuICAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lICE9IGlucHV0X3NlY3Rpb24tPm5hbWUKLSAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKU5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZWxvY2F0aW9uID0gKHRhcmdldCAmIDB4MDBmZmZmZmYpIDw8IDI7Ci0gIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiBeIDB4MDIwMDAwMDApIC0gMHgwMjAwMDAwMDsgLyogU2lnbiBleHRlbmQgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnZhbHVlOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcjsKLSAgaWYgKHJlbG9jYXRpb24gJiAzKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgMHgwMjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweDAzZmZmZmZmKSAhPSB+IChiZmRfdm1hKSAweDAzZmZmZmZmKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfjB4MDNmZmZmZmYpCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfjB4MDBmZmZmZmY7Ci0gIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1s3XTsKLSAgCi0gIHJldHVybiBmbGFnOwotfQotCi1yZWxvY19ob3d0b190eXBlICoKLURFRlVOKHJpc2NpeF9yZWxvY190eXBlX2xvb2t1cCwoYWJmZCxjb2RlKSwKLSAgICAgIGJmZCAqYWJmZCBBTkQKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKQotewotI2RlZmluZSBBU1REKGksaikgICAgICAgY2FzZSBpOiByZXR1cm4gJnJpc2NpeF9zdGRfcmVsb2NfaG93dG9bal0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotICAgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgICAgfQotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTYsIDEpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAzKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCA0KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgNSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzJfUENSRUwsIDYpOwotICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLX0KLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHNob3VsZF9ub3RfYmVfdXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCByaXNjaXhfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX3JlbG9jIHJpc2NpeF9jYW5vbmljYWxpemVfcmVsb2MKLSNkZWZpbmUgTVlfb2JqZWN0X3AgcmlzY2l4X29iamVjdF9wCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpyaXNjaXhfY2FsbGJhY2sgUEFSQU1TICgoYmZkICopKTsKLQotdm9pZAotcmlzY2l4X3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25lZyA9IDA7CS8qIE5lZ2F0aXZlIHJlbG9jcyB1c2UgdGhlIEJBU0VSRUwgYml0LiAgKi8KLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl9sZW5ndGggPSBnLT5ob3d0by0+c2l6ZSA7ICAgLyogU2l6ZSBhcyBhIHBvd2VyIG9mIHR3byAqLwotICBpZiAocl9sZW5ndGggPCAwKQotICAgIHsKLSAgICAgIHJfbGVuZ3RoID0gLXJfbGVuZ3RoOwotICAgICAgcl9uZWcgPSAxOwotICAgIH0KLQotICByX3BjcmVsICA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsgLyogUmVsYXRpdmUgdG8gUEM/ICovCi0KLSAgLyogRm9yIFJJU0MgaVgsIGluIHBjLXJlbGF0aXZlIHJlbG9jcyB0aGUgcl9wY3JlbCBiaXQgbWVhbnMgdGhhdCB0aGUKLSAgICAgcmVsb2NhdGlvbiBoYXMgYmVlbiBkb25lIGFscmVhZHkgKE9ubHkgZm9yIHRoZSAyNi1iaXQgb25lIEkgdGhpbmspPz8/ISEhCi0gICAgICovCi0gIAotICBpZiAocl9sZW5ndGggPT0gMykKLSAgICByX3BjcmVsID0gcl9wY3JlbCA/IDAgOiAxOwotICAKLQotI2lmIDAKLSAgLyogRm9yIGEgc3RhbmRhcmQgcmVsb2MsIHRoZSBhZGRlbmQgaXMgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotI2VuZGlmCi0KLSAgLyogbmFtZSB3YXMgY2xvYmJlcmVkIGJ5IGFvdXRfd3JpdGVfc3ltcyB0byBiZSBzeW1ib2wgaW5kZXggKi8KLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgdGhlbiBzZXQgdGhlCi0gICAgIHJfaW5kZXggdG8gdGhlIHN5bWJvbHMgaW5kZXgsIGFuZCB0aGUgcl9leHRlcm4gYml0LgotCi0gICAgIEFic29sdXRlIHN5bWJvbHMgY2FuIGNvbWUgaW4gaW4gdHdvIHdheXMsIGVpdGhlciBhcyBhbiBvZmZzZXQKLSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24sIG9yIGFzIGEgc3ltYm9sIHdoaWNoIGhhcyBhbiBhYnMgdmFsdWUuCi0gICAgIGNoZWNrIGZvciB0aGF0IGhlcmUKLSAgICAgKi8KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24KLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbi5zeW1ib2wgPT0gc3ltKQotCXsKLQkgIC8qIFdob29wcywgbG9va2VkIGxpa2UgYW4gYWJzIHN5bWJvbCwgYnV0IGlzIHJlYWxseSBhbiBvZmZzZXQKLQkgICAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0JICByX2luZGV4ID0gMDsKLQkgIHJfZXh0ZXJuID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRmlsbCBpbiBzeW1ib2wgKi8KLQkgIHJfZXh0ZXJuID0gMTsKLQkgIHJfaW5kZXggPSAoKmctPnN5bV9wdHJfcHRyKS0+dWRhdGEuaTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCSggIChyX2V4dGVybiA/ICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRzogMCkKLQkgfCAocl9wY3JlbCAgPyAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzogMCkKLQkgfCAocl9uZWcgICAgPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHOiAwKQotCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCSggIChyX2V4dGVybiA/ICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLQkgfCAocl9wY3JlbCAgPyAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRTogMCkKLQkgfCAocl9uZWcgICAgPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFOiAwKQotCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotICAgIH0KLX0KLQotYm9vbGVhbgotcmlzY2l4X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBhcmVsZW50ICoqZ2VuZXJpYzsKLSAgdW5zaWduZWQgY2hhciAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgZWFjaF9zaXplOwotICAKLSAgdW5zaWduZWQgaW50IGNvdW50ID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIHNpemVfdCBuYXRzaXplOwotCi0gIGlmIChjb3VudCA9PSAwKSByZXR1cm4gdHJ1ZTsKLQotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG5hdHNpemUgPSBlYWNoX3NpemUgKiBjb3VudDsKLSAgbmF0aXZlID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX3phbGxvYyAoYWJmZCwgbmF0c2l6ZSk7Ci0gIGlmICghbmF0aXZlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBnZW5lcmljID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0KLSAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0gICAgICAgY291bnQgIT0gMDsKLSAgICAgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0gICAgcmlzY2l4X3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgKmdlbmVyaWMsCi0JCQkgICAgICAgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKLQotICBpZiAoIGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlKGFiZmQsIG5hdGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotICogVGhpcyBpcyBqdXN0IGxpa2UgdGhlIHN0YW5kYXJkIGFvdXR4LmggdmVyc2lvbiBidXQgd2UgbmVlZCB0byBkbyBvdXIKLSAqIG93biBtYXBwaW5nIG9mIGV4dGVybmFsIHJlbG9jIHR5cGUgdmFsdWVzIHRvIGhvd3RvIGVudHJpZXMuCi0gKi8KLWxvbmcKLU1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICAgYmZkICphYmZkOwotICAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQsIGM7Ci0gIGV4dGVybiByZWxvY19ob3d0b190eXBlIE5BTUUoYW91dCxzdGRfaG93dG9fdGFibGUpW107Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUsIHJldHVybiB0aGUgdmFsdWVzLiAqLwotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKLSAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotCi0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspIHsKLSAgICAgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotICAgICAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLSAgICB9Ci0gICAgKnJlbHB0ciA9IDA7Ci0gICAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB9Ci0gIGlmICh0YmxwdHIgJiYgc2VjdGlvbi0+cmVsb2NfY291bnQpIHsKLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgICpyZWxwdHIgPSAwOwotICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgfQotCi0gIGlmICghTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKShhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKLSAgICByZXR1cm4gLTE7Ci0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgLyogZml4IHVwIGhvd3RvIGVudHJpZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0gICAgewotICAgICAgYyA9IHRibHB0ci0+aG93dG8gLSBOQU1FKGFvdXQsc3RkX2hvd3RvX3RhYmxlKTsKLSAgICAgIEJGRF9BU1NFUlQgKGMgPCBSSVNDSVhfVEFCTEVfU0laRSk7Ci0gICAgICB0YmxwdHItPmhvd3RvID0gJnJpc2NpeF9zdGRfcmVsb2NfaG93dG9bY107Ci0KLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotLyogVGhpcyBpcyB0aGUgc2FtZSBhcyBOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSwgYnV0IGhhcyBkaWZmZXJlbnQgCi0gICBleHBhbnNpb25zIG9mIHRoZSBtYWNybyBkZWZpbml0aW9ucy4gICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotcmlzY2l4X3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgZXhlY3AsIGNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7Ci17Ci0gIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICpyYXdwdHIsICpvbGRyYXdwdHI7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnJlc3VsdDsKLQotICByYXdwdHIgPSAoKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICAqKSAKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCApKSk7Ci0KLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIG9sZHJhd3B0ciA9IGFiZmQtPnRkYXRhLmFvdXRfZGF0YTsKLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotCi0gIC8qIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvbGQgdGRhdGEgc3RydWN0LgotICAgICBJbiBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRoZSBzdWJmb3JtYXQsIHNpbmNlIGZvciBocHV4IGl0IHdhcyBzZXQgaW4KLSAgICAgaHAzMDBocHV4LmM6c3dhcF9leGVjX2hlYWRlcl9pbiBhbmQgd2lsbCBiZSB1c2VkIGluCi0gICAgIGhwMzAwaHB1eC5jOmNhbGxiYWNrLiAgKi8KLSAgaWYgKG9sZHJhd3B0ciAhPSBOVUxMKQotICAgICphYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSAqb2xkcmF3cHRyOwotCi0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIgPSAmcmF3cHRyLT5lOwotICAqKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIpID0gKmV4ZWNwOyAgICAgLyogQ29weSBpbiB0aGUgaW50ZXJuYWxfZXhlYwotCQkJCQkJICAgc3RydWN0ICovCi0gIGV4ZWNwID0gYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkcjsKLQotICAvKiBTZXQgdGhlIGZpbGUgZmxhZ3MgKi8KLSAgYWJmZC0+ZmxhZ3MgPSBCRkRfTk9fRkxBR1M7Ci0gIGlmIChleGVjcC0+YV9kcnNpemUgfHwgZXhlY3AtPmFfdHJzaXplKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgLyogU2V0dGluZyBvZiBFWEVDX1AgaGFzIGJlZW4gZGVmZXJyZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGlzIGZ1bmN0aW9uICovCi0gIGlmIChleGVjcC0+YV9zeW1zKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFM7Ci0gIGlmIChOX0RZTkFNSUMoKmV4ZWNwKSkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0JCQkJCQkJCSAgCi0gIGlmICgoZXhlY3AtPmFfaW5mbyAmIE1GX1NRVUVFWkVEKSAhPSAwKSAvKiBTcXVlZXplZCBmaWxlcyBhcmVuJ3Qgc3VwcG9ydGVkIAotCQkJCQkgICAgICh5ZXQpISAqLwotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICgoZXhlY3AtPmFfaW5mbyAmIE1GX0lTX1NMKSAhPSAwKQkvKiBOb3IgYXJlIHNoYXJlZCBsaWJyYXJpZXMgKi8KLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBaTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRCB8IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBOTUFHSUMpCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG5fbWFnaWM7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE9NQUdJQykKLSAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSBvX21hZ2ljOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2hvdWxkIGhhdmUgYmVlbiBjaGVja2VkIHdpdGggTl9CQURNQUcgYmVmb3JlIHRoaXMgcm91dGluZQotICAgICAgICAgd2FzIGNhbGxlZC4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGV4ZWNwLT5hX2VudHJ5OwotCi0gIG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpID0gKGFvdXRfc3ltYm9sX3R5cGUgKilOVUxMOwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGV4ZWNwLT5hX3N5bXMgLyBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0KLSAgLyogVGhlIGRlZmF1bHQgcmVsb2NhdGlvbiBlbnRyeSBzaXplIGlzIHRoYXQgb2YgdHJhZGl0aW9uYWwgVjcgVW5peC4gICovCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIC8qIFRoZSBkZWZhdWx0IHN5bWJvbCBlbnRyeSBzaXplIGlzIHRoYXQgb2YgdHJhZGl0aW9uYWwgVW5peC4gKi8KLSAgb2JqX3N5bWJvbF9lbnRyeV9zaXplIChhYmZkKSA9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0KLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOwotICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IE5VTEw7Ci0gIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpID0gTlVMTDsKLQotICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfZGF0YTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX2JzczsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZsYWdzID0KLSAgICAoZXhlY3AtPmFfdHJzaXplICE9IDAKLSAgICAgPyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVMT0MpCi0gICAgIDogKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPQotICAgIChleGVjcC0+YV9kcnNpemUgIT0gMAotICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKLSAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DOwotCi0gIHJlc3VsdCA9ICgqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkoYWJmZCk7Ci0KLSNpZiBkZWZpbmVkKE1BQ0gpIHx8IGRlZmluZWQoU1RBVF9GT1JfRVhFQykKLSAgLyogVGhlIG9yaWdpbmFsIGhldXJpc3RpYyBkb2Vzbid0IHdvcmsgaW4gc29tZSBpbXBvcnRhbnQgY2FzZXMuIFRoZQotICAgKiBhLm91dCBmaWxlIGhhcyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGV4dCBzdGFydCBhZGRyZXNzLiBGb3IKLSAgICogZmlsZXMgKGxpa2Uga2VybmVscykgbGlua2VkIHRvIG5vbi1zdGFuZGFyZCBhZGRyZXNzZXMgKGxkIC1UdGV4dAotICAgKiBubm4pIHRoZSBlbnRyeSBwb2ludCBtYXkgbm90IGJlIGJldHdlZW4gdGhlIGRlZmF1bHQgdGV4dCBzdGFydAotICAgKiAob2JqX3RleHRzZWMoYWJmZCktPnZtYSkgYW5kIChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSArIHRleHQgc2l6ZQotICAgKiBUaGlzIGlzIG5vdCBqdXN0IGEgbWFjaCBpc3N1ZS4gTWFueSBrZXJuZWxzIGFyZSBsb2FkZWQgYXQgbm9uCi0gICAqIHN0YW5kYXJkIGFkZHJlc3Nlcy4KLSAgICovCi0gIHsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKLSAgICBpZiAoYWJmZC0+aW9zdHJlYW0gIT0gTlVMTAotCSYmIChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpID09IDAKLSAgICAgICAgJiYgKGZzdGF0KGZpbGVubygoRklMRSAqKSAoYWJmZC0+aW9zdHJlYW0pKSwgJnN0YXRfYnVmKSA9PSAwKQotICAgICAgICAmJiAoKHN0YXRfYnVmLnN0X21vZGUgJiAwMTExKSAhPSAwKSkKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgfQotI2Vsc2UgLyogISBNQUNIICovCi0gIC8qIE5vdyB0aGF0IHRoZSBzZWdtZW50IGFkZHJlc3NlcyBoYXZlIGJlZW4gd29ya2VkIG91dCwgdGFrZSBhIGJldHRlcgotICAgICBndWVzcyBhdCB3aGV0aGVyIHRoZSBmaWxlIGlzIGV4ZWN1dGFibGUuICBJZiB0aGUgZW50cnkgcG9pbnQKLSAgICAgaXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFzc3VtZSBpdCBpcy4gIChUaGlzIG1ha2VzIGZpbGVzCi0gICAgIGV4ZWN1dGFibGUgZXZlbiBpZiB0aGVpciBlbnRyeSBwb2ludCBhZGRyZXNzIGlzIDAsIGFzIGxvbmcgYXMKLSAgICAgdGhlaXIgdGV4dCBzdGFydHMgYXQgemVyby4pCi0KLSAgICAgQXQgc29tZSBwb2ludCB3ZSBzaG91bGQgcHJvYmFibHkgYnJlYWsgZG93biBhbmQgc3RhdCB0aGUgZmlsZSBhbmQKLSAgICAgZGVjbGFyZSBpdCBleGVjdXRhYmxlIGlmIChvbmUgb2YpIGl0cyAneCcgYml0cyBhcmUgb24uLi4gICovCi0gIGlmICgoZXhlY3AtPmFfZW50cnkgPj0gb2JqX3RleHRzZWMoYWJmZCktPnZtYSkgJiYKLSAgICAgIChleGVjcC0+YV9lbnRyeSA8IG9ial90ZXh0c2VjKGFiZmQpLT52bWEgKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKSkKLSAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0jZW5kaWYgLyogTUFDSCAqLwotICBpZiAocmVzdWx0KQotICAgIHsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcmVlIChyYXdwdHIpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gb2xkcmF3cHRyOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWShvYmplY3RfcCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsgICAgICAvKiBSYXcgZXhlYyBoZWFkZXIgZnJvbSBmaWxlICovCi0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7ICAgICAgICAgICAgLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotICAgICAgIT0gRVhFQ19CWVRFU19TSVpFKSB7Ci0gICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBleGVjLmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXhlY19ieXRlcy5lX2luZm8pOwotCi0gIGlmIChOX0JBRE1BRyAoZXhlYykpIHJldHVybiAwOwotI2lmZGVmIE1BQ0hUWVBFX09LCi0gIGlmICghKE1BQ0hUWVBFX09LIChOX01BQ0hUWVBFIChleGVjKSkpKSByZXR1cm4gMDsKLSNlbmRpZgotCi0gIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKShhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0gIHRhcmdldCA9IHJpc2NpeF9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZleGVjLCBNWShjYWxsYmFjaykpOwotCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvcnM2MDAwLWNvcmUuYyBiL2JmZC9yczYwMDAtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGU3NDQxLi4wMDAwMDAwCi0tLSBhL2JmZC9yczYwMDAtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM4ICswLDAgQEAKLS8qIElCTSBSUy82MDAwICJYQ09GRiIgYmFjay1lbmQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/Ci0gICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAotICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0Ci0gICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgotICAgV3JpdHRlbiBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUsIAotICAgICBhbmQgSm9obiBHaWxtb3JlLgotICAgQXJjaGl2ZSBzdXBwb3J0IGZyb20gRGFtb24gQS4gUGVybWV6ZWwuCi0gICBDb250cmlidXRlZCBieSBJQk0gQ29ycG9yYXRpb24gYW5kIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgcG9ydCBjdXJyZW50bHkgb25seSBoYW5kbGVzIHJlYWRpbmcgb2JqZWN0IGZpbGVzLCBleGNlcHQgd2hlbgotICAgY29tcGlsZWQgb24gYW4gUlMvNjAwMCBob3N0LiAgLS0gbm8gYXJjaGl2ZSBzdXBwb3J0LCBubyBjb3JlIGZpbGVzLgotICAgSW4gYWxsIGNhc2VzLCBpdCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcuCi0KLSAgIEZJWE1FbWdvIGNvbW1lbnRzIGFyZSBsZWZ0IGZyb20gTWV0aW4gT3ppc2lrJ3Mgb3JpZ2luYWwgcG9ydC4KLQotICAgVGhpcyBpcyBpbiBhIHNlcGFyYXRlIGZpbGUgZnJvbSBjb2ZmLXJzNjAwMC5jLCBiZWNhdXNlIGl0IGluY2x1ZGVzCi0gICBzeXN0ZW0gaW5jbHVkZSBmaWxlcyB0aGF0IGNvbmZsaWN0IHdpdGggY29mZi9yczYwMDAuaC4KLSAgKi8KLQotLyogSW50ZXJuYWxjb2ZmLmggYW5kIGNvZmZjb2RlLmggbW9kaWZ5IHRoZW1zZWx2ZXMgYmFzZWQgb24gdGhpcyBmbGFnLiAgKi8KLSNkZWZpbmUgUlM2MDAwQ09GRl9DIDEKLQotLyogVGhlIEFJWCA0LjEga2VybmVsIGlzIG9idmlvdXNseSBjb21waWxlZCB3aXRoIC1EX0xPTkdfTE9ORywgc28KLSAgIHdlIGhhdmUgdG8gZGVmaW5lIF9MT05HX0xPTkcgZm9yIG9sZGVyIHZlcnNpb25zIG9mIGdjYyB0byBnZXQgdGhlCi0gICBwcm9wZXIgYWxpZ25tZW50cyBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUuICAqLwotI2lmIGRlZmluZWQoX0FJWDQxKSAmJiAhZGVmaW5lZChfTE9OR19MT05HKQotI2RlZmluZSBfTE9OR19MT05HCi0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZkZWYgQUlYX0NPUkUKLQotLyogQU9VVEhEUiBpcyBkZWZpbmVkIGJ5IHRoZSBhYm92ZS4gIFdlIG5lZWQgYW5vdGhlciBkZWZuIG9mIGl0LCBmcm9tIHRoZQotICAgc3lzdGVtIGluY2x1ZGUgZmlsZXMuICBQdW50IHRoZSBvbGQgb25lIGFuZCBnZXQgdXMgYSBuZXcgbmFtZSBmb3IgdGhlCi0gICB0eXBlZGVmIGluIHRoZSBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gICovCi0jaWZkZWYgQU9VVEhEUgotI3VuZGVmIEFPVVRIRFIKLSNlbmRpZgotI2RlZmluZQlBT1VUSERSCXNlY29uZF9BT1VUSERSCi0KLSN1bmRlZglTQ05IRFIKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCVN1cHBvcnQgZm9yIGNvcmUgZmlsZSBzdHVmZi4uIAkJCQkJICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2luY2x1ZGUgPHN5cy91c2VyLmg+Ci0jaW5jbHVkZSA8c3lzL2xkci5oPgotI2luY2x1ZGUgPHN5cy9jb3JlLmg+Ci0KLQotLyogTnVtYmVyIG9mIHNwZWNpYWwgcHVycG9zZSByZWdpc3RlcnMgc3VwcG9ydGVkIGJ5IGdkYi4gIFRoaXMgdmFsdWUKLSAgIHNob3VsZCBtYXRjaCBgdG0uaCcgaW4gZ2RiIGRpcmVjdG9yeS4gIENsZWFuIHRoaXMgbWVzcyB1cCBhbmQgdXNlCi0gICB0aGUgbWFjcm9zIGluIHN5cy9yZWcuaC4gIEZJWE1FbWdvLiAqLwotCi0jZGVmaW5lCU5VTV9PRl9TUEVDX1JFR1MgIDcKLQotI2RlZmluZQljb3JlX2hkcihiZmQpCQkoKChSczZrQ29yRGF0YSopKGJmZC0+dGRhdGEuYW55KSktPmhkcikKLQotLyogQUlYIDQuMSBDaGFuZ2VkIHRoZSBuYW1lcyBhbmQgbG9jYXRpb25zIG9mIGEgZmV3IGl0ZW1zIGluIHRoZSBjb3JlIGZpbGUsCi0gICB0aGlzIHNlZW1zIHRvIGJlIHRoZSBxdWlja2VzdC9lYXNpZXN0IHdheSB0byBkZWFsIHdpdGggaXQuIAotCi0gICBOb3RlIGhvd2V2ZXIgdGhhdCBlbmNvZGluZyBtYWdpYyBhZGRyZXNzZXMgKFNUQUNLX0VORF9BRERSKSBpcyBnb2luZwotICAgdG8gYmUgX3ZlcnlfIGZyYWdpbGUuICBCdXQgSSBkb24ndCBzZWUgYW55IGVhc3kgd2F5IHRvIGdldCB0aGF0IGluZm8KLSAgIHJpZ2h0IG5vdy4KLSAgIAotICAgQUlYIDQuMyBkZWZpbmVzIGFuIGVudGlyZWx5IG5ldyBzdHJ1Y3R1cmUgKGNvcmVfZHVtcHgpLiAgWWV0IHRoZQotICAgYmFzaWMgbG9naWMgc3RheXMgdGhlIHNhbWUgYW5kIHdlIGNhbiBzdGlsbCB1c2Ugb3VyIG1hY3JvCi0gICByZWRlZmluaXRpb24gbWVjaGFuaXNtIHRvIGVmZmVjdCB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMuICAqLwotCi0jaWZkZWYgQUlYX0NPUkVfRFVNUFhfQ09SRQotI2RlZmluZSBDT1JFX0RBVEFfU0laRV9GSUVMRCBjX2RhdGFvcmcKLSNkZWZpbmUgQ09SRV9DT01NX0ZJRUxEIGNfdS5VX3Byb2MucGlfY29tbQotI2RlZmluZSBTQVZFX0ZJRUxEIGNfZmx0LmhjdHgucjMyCi0jZGVmaW5lIFNUQUNLX0VORF9BRERSIGNvcmVkYXRhLmNfc3RhY2tvcmcgKyBjb3JlZGF0YS5jX3NpemUKLSNkZWZpbmUgTE9BREVSX09GRlNFVF9GSUVMRCBjX2xvYWRlcgotI2RlZmluZSBMT0FERVJfUkVHSU9OX1NJWkUgY29yZWRhdGEuY19sc2l6ZQotI2RlZmluZSBDT1JFX0RVTVAgY29yZV9kdW1weAotI2Vsc2UKLSNpZmRlZiBDT1JFX1ZFUlNJT05fMQotI2RlZmluZSBDT1JFX0RBVEFfU0laRV9GSUVMRCBjX3UuVV9kc2l6ZQotI2RlZmluZSBDT1JFX0NPTU1fRklFTEQgY191LlVfY29tbQotI2RlZmluZSBTQVZFX0ZJRUxEIGNfbXN0Ci0jZGVmaW5lCVNUQUNLX0VORF9BRERSIDB4MmZmMjMwMDAKLSNkZWZpbmUgTE9BREVSX09GRlNFVF9GSUVMRCBjX3RhYgotI2RlZmluZSBMT0FERVJfUkVHSU9OX1NJWkUgMHg3ZmZmZmZmCi0jZGVmaW5lIENPUkVfRFVNUCBjb3JlX2R1bXAKLSNlbHNlCi0jZGVmaW5lIENPUkVfREFUQV9TSVpFX0ZJRUxEIGNfdS51X2RzaXplCi0jZGVmaW5lIENPUkVfQ09NTV9GSUVMRCBjX3UudV9jb21tCi0jZGVmaW5lIFNBVkVfRklFTEQgY191LnVfc2F2ZQotI2RlZmluZQlTVEFDS19FTkRfQUREUiAweDJmZjgwMDAwCi0jZGVmaW5lIExPQURFUl9PRkZTRVRfRklFTEQgY190YWIKLSNkZWZpbmUgTE9BREVSX1JFR0lPTl9TSVpFIDB4N2ZmZmZmZgotI2RlZmluZSBDT1JFX0RVTVAgY29yZV9kdW1wCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QgQ09SRV9EVU1QIGhkcjsJCS8qIGNvcmUgZmlsZSBoZWFkZXIgKi8KLX0gUnM2a0NvckRhdGE7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgZmxhZ3dvcmQsCi0JCQkJCSAgICBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hLCBmaWxlX3B0cikpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDg7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi0vKiBEZWNpZGUgaWYgYSBnaXZlbiBiZmQgcmVwcmVzZW50cyBhIGBjb3JlJyBmaWxlIG9yIG5vdC4gVGhlcmUgcmVhbGx5IGlzIG5vCi0gICBtYWdpYyBudW1iZXIgb3IgYW55dGhpbmcgbGlrZSwgaW4gcnM2MDAwY29mZi4gKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1yczYwMDBjb2ZmX2NvcmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgQ09SRV9EVU1QIGNvcmVkYXRhOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICBiZmRfc2l6ZV90eXBlIG5yZWFkOwotICBjaGFyICp0bXBwdHI7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBucmVhZCA9IGJmZF9yZWFkICgmY29yZWRhdGEsIDEsIHNpemVvZiAoc3RydWN0IENPUkVfRFVNUCksIGFiZmQpOwotICBpZiAobnJlYWQgIT0gc2l6ZW9mIChzdHJ1Y3QgQ09SRV9EVU1QKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmc3RhdGJ1ZikgPCAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGNvcmUgZmlsZSB1bGltaXQgaXMgdG9vIHNtYWxsLCB0aGUgc3lzdGVtIHdpbGwgZmlyc3QKLSAgICAgb21pdCB0aGUgZGF0YSBzZWdtZW50LCB0aGVuIG9taXQgdGhlIHN0YWNrLCB0aGVuIGRlY2xpbmUgdG8KLSAgICAgZHVtcCBjb3JlIGFsdG9nZXRoZXIgKGFzIGZhciBhcyBJIGtub3cgVUJMT0NLX1ZBTElEIGFuZCBMRV9WQUxJRAotICAgICBhcmUgYWx3YXlzIHNldCkgKHRoaXMgaXMgYmFzZWQgb24gZXhwZXJpbWVudGF0aW9uIG9uIEFJWCAzLjIpLgotICAgICBOb3csIHRoZSB0aGluZyBpcyB0aGF0IEdEQiB1c2VycyB3aWxsIGJlIHN1cnByaXNlZAotICAgICBpZiBzZWdtZW50cyBqdXN0IHNpbGVudGx5IGRvbid0IGFwcGVhciAod2VsbCwgbWF5YmUgdGhleSB3b3VsZAotICAgICB0aGluayB0byBjaGVjayAiaW5mbyBmaWxlcyIsIEkgZG9uJ3Qga25vdykuCi0KLSAgICAgRm9yIHRoZSBkYXRhIHNlZ21lbnQsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBrZWVwIGdvaW5nIGlmIGl0J3MKLSAgICAgbm90IHRoZXJlLCBzaW5jZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBub3QgdG8gZHVtcCBpdCAocmVnYXJkbGVzcwotICAgICBvZiB0aGUgdWxpbWl0LCBpdCdzIGJhc2VkIG9uIFNBX0ZVTExEVU1QKS4gIEJ1dCBmb3IgdGhlIHN0YWNrIHNlZ21lbnQsCi0gICAgIGlmIGl0J3Mgbm90IHRoZXJlLCB3ZSByZWZ1c2UgdG8gaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoaXMgY29yZQotICAgICBmaWxlLiAgVGhlIHVzZWZ1bG5lc3Mgb2YgYSBjb3JlIGR1bXAgd2l0aG91dCBhIHN0YWNrIHNlZ21lbnQgaXMgcHJldHR5Ci0gICAgIGxpbWl0ZWQgYW55d2F5LiAgKi8KLSAgICAgCi0gIGlmICghKGNvcmVkYXRhLmNfZmxhZyAmIFVCTE9DS19WQUxJRCkKLSAgICAgIHx8ICEoY29yZWRhdGEuY19mbGFnICYgTEVfVkFMSUQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghKGNvcmVkYXRhLmNfZmxhZyAmIFVTVEFDS19WQUxJRCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBEb24ndCBjaGVjayB0aGUgY29yZSBmaWxlIHNpemUgZm9yIGEgZnVsbCBjb3JlLCBBSVggNC4xIGluY2x1ZGVzCi0gICAgIGFkZGl0aW9uYWwgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbnMgaW4gYSBmdWxsIGNvcmUuICAqLwotICBpZiAoIShjb3JlZGF0YS5jX2ZsYWcgJiAoRlVMTF9DT1JFIHwgQ09SRV9UUlVOQykpCi0gICAgICAmJiAoKGJmZF92bWEpY29yZWRhdGEuY19zdGFjayArIGNvcmVkYXRhLmNfc2l6ZSkgIT0gc3RhdGJ1Zi5zdF9zaXplKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBzaXplIGlzIHdyb25nLCBpdCBtZWFucyB3ZSdyZSBtaXNpbnRlcnByZXRpbmcgc29tZXRoaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWZkZWYgQUlYX0NPUkVfRFVNUFhfQ09SRQotICAvKiBGb3IgdGhlIGNvcmVfZHVtcHggZm9ybWF0LCBtYWtlIHN1cmUgY19lbnRyaWVzID09IDAgIElmIGl0IGRvZXMKLSAgICAgbm90LCB0aGUgY29yZSBmaWxlIHVzZXMgdGhlIG9sZCBmb3JtYXQgKi8KLSAgaWYgKGNvcmVkYXRhLmNfZW50cmllcyAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotI2Vsc2UKLSAgLyogU2FuaXR5IGNoZWNrIG9uIHRoZSBjX3RhYiBmaWVsZC4gICovCi0gIGlmICgodV9sb25nKSBjb3JlZGF0YS5jX3RhYiA8IHNpemVvZiBjb3JlZGF0YSB8fAotICAgICAgKHVfbG9uZykgY29yZWRhdGEuY190YWIgPj0gc3RhdGJ1Zi5zdF9zaXplIHx8Ci0gICAgICAobG9uZykgY29yZWRhdGEuY190YWIgPj0gKGxvbmcpY29yZWRhdGEuY19zdGFjaykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIElzc3VlIHdhcm5pbmcgaWYgdGhlIGNvcmUgZmlsZSB3YXMgdHJ1bmNhdGVkIGR1cmluZyB3cml0aW5nLiAgKi8KLSAgaWYgKGNvcmVkYXRhLmNfZmxhZyAmIENPUkVfVFJVTkMpCi0gICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogd2FybmluZyBjb3JlIGZpbGUgdHJ1bmNhdGVkIiksCi0JCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgLyogQWxsb2NhdGUgY29yZSBmaWxlIGhlYWRlci4gICovCi0gIHRtcHB0ciA9IChjaGFyKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChSczZrQ29yRGF0YSkpOwotICBpZiAoIXRtcHB0cikKLSAgICByZXR1cm4gTlVMTDsKLSAgICAgIAotICBzZXRfdGRhdGEgKGFiZmQsIHRtcHB0cik7Ci0KLSAgLyogQ29weSBjb3JlIGZpbGUgaGVhZGVyLiAgKi8KLSAgY29yZV9oZHIgKGFiZmQpID0gY29yZWRhdGE7Ci0KLSAgLyogLnN0YWNrIHNlY3Rpb24uICovCi0gIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuc3RhY2siLAotICAJCQkgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCSAgKGJmZF9zaXplX3R5cGUpIGNvcmVkYXRhLmNfc2l6ZSwKLQkJCSAgKGJmZF92bWEpIChTVEFDS19FTkRfQUREUiAtIGNvcmVkYXRhLmNfc2l6ZSksCi0JCQkgIChmaWxlX3B0cikgY29yZWRhdGEuY19zdGFjaykpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogLnJlZyBzZWN0aW9uIGZvciBHUFJzIGFuZCBzcGVjaWFsIHJlZ2lzdGVycy4gKi8KLSAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotICAJCQkgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgIChiZmRfc2l6ZV90eXBlKSAoKDMyICsgTlVNX09GX1NQRUNfUkVHUykgKiA0KSwKLQkJCSAgKGJmZF92bWEpIDAsCi0JCQkgIChmaWxlX3B0cikgKChjaGFyICopICZjb3JlZGF0YS5TQVZFX0ZJRUxECi0JCQkJICAgICAgLSAoY2hhciAqKSAmY29yZWRhdGEpKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiAucmVnMiBzZWN0aW9uIGZvciBGUFJzIChmbG9hdGluZyBwb2ludCByZWdpc3RlcnMpLiAqLwotICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZzIiLAotICAJCQkgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgIChiZmRfc2l6ZV90eXBlKSA4ICogMzIsCS8qIDMyIEZQUnMuICovCi0JCQkgIChiZmRfdm1hKSAwLAotCQkJICAoZmlsZV9wdHIpICgoY2hhciAqKSAmY29yZWRhdGEuU0FWRV9GSUVMRC5mcHJbMF0KLQkJCQkgICAgICAtIChjaGFyICopICZjb3JlZGF0YSkpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIC5sZGluZm8gc2VjdGlvbi4KLSAgICAgVG8gYWN0dWFsbHkgZmluZCBvdXQgaG93IGxvbmcgdGhpcyBzZWN0aW9uIGlzIGluIHRoaXMgcGFydGljdWxhcgotICAgICBjb3JlIGR1bXAgd291bGQgcmVxdWlyZSBnb2luZyBkb3duIHRoZSB3aG9sZSBsaXN0IG9mIHN0cnVjdCBsZF9pbmZvJ3MuCi0gICAgIFNlZSBpZiB3ZSBjYW4ganVzdCBmYWtlIGl0LiAgKi8KLSAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5sZGluZm8iLAotICAJCQkgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgIChiZmRfc2l6ZV90eXBlKSBMT0FERVJfUkVHSU9OX1NJWkUsCi0JCQkgIChiZmRfdm1hKSAwLAotCQkJICAoZmlsZV9wdHIpIGNvcmVkYXRhLkxPQURFUl9PRkZTRVRfRklFTEQpKQotICAgIHJldHVybiBOVUxMOwotCi0jaWZuZGVmIENPUkVfVkVSU0lPTl8xCi0gIC8qIC5kYXRhIHNlY3Rpb24gaWYgcHJlc2VudC4KLSAgICAgQUlYIDMgZHVtcHMgdGhlIGNvbXBsZXRlIGRhdGEgc2VjdGlvbiBhbmQgc2V0cyBGVUxMX0NPUkUgaWYgdGhlCi0gICAgIHVsaW1pdCBpcyBsYXJnZSBlbm91Z2gsIG90aGVyd2lzZSB0aGUgZGF0YSBzZWN0aW9uIGlzIG9taXR0ZWQuCi0gICAgIEFJWCA0IHNldHMgRlVMTF9DT1JFIGV2ZW4gaWYgdGhlIGNvcmUgZmlsZSBpcyB0cnVuY2F0ZWQsIHdlIGhhdmUKLSAgICAgdG8gZXhhbWluZSBjb3JlZGF0YS5jX2RhdGFzaXplIGJlbG93IHRvIGZpbmQgb3V0IHRoZSBhY3R1YWwgc2l6ZSBvZgotICAgICB0aGUgLmRhdGEgc2VjdGlvbi4gICovCi0gIGlmIChjb3JlZGF0YS5jX2ZsYWcgJiBGVUxMX0NPUkUpCi0gICAgewotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCSAgICAgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCSAgICAgIChiZmRfc2l6ZV90eXBlKSBjb3JlZGF0YS5DT1JFX0RBVEFfU0laRV9GSUVMRCwKLQkJCSAgICAgIChiZmRfdm1hKQotCQkJCUNEQVRBX0FERFIgKGNvcmVkYXRhLkNPUkVfREFUQV9TSVpFX0ZJRUxEKSwKLQkJCSAgICAgIChmaWxlX3B0cikgY29yZWRhdGEuY19zdGFjayArIGNvcmVkYXRhLmNfc2l6ZSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT1JFX1ZFUlNJT05fMQotICAvKiBBSVggNCBhZGRzIGRhdGEgc2VjdGlvbnMgZnJvbSBsb2FkZWQgb2JqZWN0cyB0byB0aGUgY29yZSBmaWxlLAotICAgICB3aGljaCBjYW4gYmUgZm91bmQgYnkgZXhhbWluaW5nIGxkaW5mbywgYW5kIGFub255bW91c2x5IG1tYXBwZWQKLSAgICAgcmVnaW9ucy4gICovCi0gIHsKLSAgICBzdHJ1Y3QgbGRfaW5mbyBsZGluZm87Ci0gICAgYmZkX3NpemVfdHlwZSBsZGluZm9fc2l6ZTsKLSAgICBmaWxlX3B0ciBsZGluZm9fb2Zmc2V0ID0gKGZpbGVfcHRyKSBjb3JlZGF0YS5MT0FERVJfT0ZGU0VUX0ZJRUxEOwotCi0gICAgLyogLmRhdGEgc2VjdGlvbiBmcm9tIGV4ZWN1dGFibGUuICAqLwotICAgIGlmIChjb3JlZGF0YS5jX2RhdGFzaXplKQotICAgICAgewotCWlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkJU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCShiZmRfc2l6ZV90eXBlKSBjb3JlZGF0YS5jX2RhdGFzaXplLAotCQkJCShiZmRfdm1hKQotCQkJCSAgQ0RBVEFfQUREUiAoY29yZWRhdGEuQ09SRV9EQVRBX1NJWkVfRklFTEQpLAotCQkJCShmaWxlX3B0cikgY29yZWRhdGEuY19kYXRhKSkKLQkgIHJldHVybiBOVUxMOwotICAgICAgfQotCi0gICAgLyogLmRhdGEgc2VjdGlvbnMgZnJvbSBsb2FkZWQgb2JqZWN0cy4gICovCi0gICAgbGRpbmZvX3NpemUgPSAoY2hhciAqKSAmbGRpbmZvLmxkaW5mb19maWxlbmFtZVswXQotCQkgIC0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fbmV4dDsKLSAgICB3aGlsZSAoMSkKLSAgICAgIHsKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIGxkaW5mb19vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGJmZF9yZWFkICgmbGRpbmZvLCBsZGluZm9fc2l6ZSwgMSwgYWJmZCkgIT0gbGRpbmZvX3NpemUpCi0JICByZXR1cm4gTlVMTDsKLQlpZiAobGRpbmZvLmxkaW5mb19jb3JlKQotCSAgewotCSAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAotCQkJCSAgICBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJICAgIChiZmRfc2l6ZV90eXBlKSBsZGluZm8ubGRpbmZvX2RhdGFzaXplLAotCQkJCSAgICAoYmZkX3ZtYSkgbGRpbmZvLmxkaW5mb19kYXRhb3JnLAotCQkJCSAgICAoZmlsZV9wdHIpIGxkaW5mby5sZGluZm9fY29yZSkpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICB9Ci0JaWYgKGxkaW5mby5sZGluZm9fbmV4dCA9PSAwKQotCSAgYnJlYWs7Ci0JbGRpbmZvX29mZnNldCArPSBsZGluZm8ubGRpbmZvX25leHQ7Ci0gICAgICB9Ci0KLSAgICAvKiAudm1kYXRhIHNlY3Rpb25zIGZyb20gYW5vbnltb3VzbHkgbW1hcHBlZCByZWdpb25zLiAgKi8KLSAgICBpZiAoY29yZWRhdGEuY192bXJlZ2lvbnMpCi0gICAgICB7Ci0JaW50IGk7Ci0KLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgY29yZWRhdGEuY192bW0sIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIE5VTEw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY29yZWRhdGEuY192bXJlZ2lvbnM7IGkrKykKLQkgIHsKLQkgICAgc3RydWN0IHZtX2luZm8gdm1pbmZvOwotCi0JICAgIGlmIChiZmRfcmVhZCAoJnZtaW5mbywgc2l6ZW9mICh2bWluZm8pLCAxLCBhYmZkKSAhPSBzaXplb2YgKHZtaW5mbykpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIGlmICh2bWluZm8udm1pbmZvX29mZnNldCkKLQkgICAgICB7Ci0JCWlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIudm1kYXRhIiwKLQkJCQkJU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkoYmZkX3NpemVfdHlwZSkgdm1pbmZvLnZtaW5mb19zaXplLAotCQkJCQkoYmZkX3ZtYSkgdm1pbmZvLnZtaW5mb19hZGRyLAotCQkJCQkoZmlsZV9wdHIpIHZtaW5mby52bWluZm9fb2Zmc2V0KSkKLQkJICByZXR1cm4gTlVMTDsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiBhYmZkLT54dmVjOwkJCQkvKiB0aGlzIGlzIGdhcmJhZ2UgZm9yIG5vdy4gKi8KLX0KLQotCi0KLS8qIHJldHVybiBgdHJ1ZScgaWYgZ2l2ZW4gY29yZSBpcyBmcm9tIHRoZSBnaXZlbiBleGVjdXRhYmxlLi4gKi8KLWJvb2xlYW4KLXJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIHN0cnVjdCBDT1JFX0RVTVAgY29yZWRhdGE7Ci0gIHN0cnVjdCBsZF9pbmZvIGxkaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBjaGFyICpwYXRoLCAqczsKLSAgc2l6ZV90IGFsbG9jOwotICBjb25zdCBjaGFyICpzdHIxLCAqc3RyMjsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgaWYgKGJmZF9zZWVrIChjb3JlX2JmZCwgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkICgmY29yZWRhdGEsIHNpemVvZiBjb3JlZGF0YSwgMSwgY29yZV9iZmQpICE9IHNpemVvZiBjb3JlZGF0YSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChjb3JlX2JmZCwgKGxvbmcpIGNvcmVkYXRhLkxPQURFUl9PRkZTRVRfRklFTEQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzaXplID0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fZmlsZW5hbWVbMF0gLSAoY2hhciAqKSAmbGRpbmZvLmxkaW5mb19uZXh0OwotICBpZiAoYmZkX3JlYWQgKCZsZGluZm8sIHNpemUsIDEsIGNvcmVfYmZkKSAhPSBzaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhbGxvYyA9IDEwMDsKLSAgcGF0aCA9IGJmZF9tYWxsb2MgKGFsbG9jKTsKLSAgaWYgKHBhdGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHMgPSBwYXRoOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAocywgMSwgMSwgY29yZV9iZmQpICE9IDEpCi0JewotCSAgZnJlZSAocGF0aCk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCpzID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICArK3M7Ci0gICAgICBpZiAocyA9PSBwYXRoICsgYWxsb2MpCi0JewotCSAgY2hhciAqbjsKLQotCSAgYWxsb2MgKj0gMjsKLQkgIG4gPSBiZmRfcmVhbGxvYyAocGF0aCwgYWxsb2MpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHBhdGgpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgcyA9IG4gKyAocGF0aCAtIHMpOwotCSAgcGF0aCA9IG47Ci0JfQotICAgIH0KLSAgCi0gIHN0cjEgPSBzdHJyY2hyIChwYXRoLCAnLycpOwotICBzdHIyID0gc3RycmNociAoZXhlY19iZmQtPmZpbGVuYW1lLCAnLycpOwotCi0gIC8qIHN0ZXAgb3ZlciBjaGFyYWN0ZXIgJy8nICovCi0gIHN0cjEgPSBzdHIxICE9IE5VTEwgPyBzdHIxICsgMSA6IHBhdGg7Ci0gIHN0cjIgPSBzdHIyICE9IE5VTEwgPyBzdHIyICsgMSA6IGV4ZWNfYmZkLT5maWxlbmFtZTsKLQotICBpZiAoc3RyY21wIChzdHIxLCBzdHIyKSA9PSAwKQotICAgIHJldCA9IHRydWU7Ci0gIGVsc2UKLSAgICByZXQgPSBmYWxzZTsKLQotICBmcmVlIChwYXRoKTsKLQotICByZXR1cm4gcmV0OwotfQotCi1jaGFyICoKLXJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpjb20gPSBjb3JlX2hkciAoYWJmZCkuQ09SRV9DT01NX0ZJRUxEOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludAotcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS5jX3NpZ25vOwotfQotCi0KLWJvb2xlYW4KLXJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gICAgaWYgKGNvdW50ID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAvKiBSZWFkaW5nIGEgY29yZSBmaWxlJ3Mgc2VjdGlvbnMgd2lsbCBiZSBzbGlnaHRseSBkaWZmZXJlbnQuIEZvciB0aGUKLSAgICAgICByZXN0IG9mIHRoZW0gd2UgY2FuIHVzZSBiZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAoKSBJIHN1cHBvc2UuICovCi0gICAgLyogTWFrZSBzdXJlIHRoaXMgcm91dGluZSB3b3JrcyBmb3IgYW55IGJmZCBhbmQgYW55IHNlY3Rpb24uIEZJWE1FbWdvLiAqLwotCi0gICAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfY29yZSAmJiBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIucmVnIikgPT0gMCkgewotCi0gICAgICBzdHJ1Y3QgbXN0c2F2ZSBtc3RhdHVzOwotICAgICAgaW50ICAgIHJlZ29mZnNldCA9IChjaGFyKikmbXN0YXR1cy5ncHJbMF0gLSAoY2hhciopJm1zdGF0dXM7Ci0KLSAgICAgIC8qIEFzc2VydCB0aGF0IHRoZSBvbmx5IHdheSB0aGlzIGNvZGUgd2lsbCBiZSBleGVjdXRlZCBpcyByZWFkaW5nIHRoZQotICAgICAgICAgd2hvbGUgc2VjdGlvbi4gKi8KLSAgICAgIGlmIChvZmZzZXQgfHwgY291bnQgIT0gKHNpemVvZihtc3RhdHVzLmdwcikgKyAoNCAqIE5VTV9PRl9TUEVDX1JFR1MpKSkKLSAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAoXygiRVJST1IhIGluIHJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMoKVxuIikpOwotCi0gICAgICAvKiBmb3IgYC5yZWcnIHNlY3Rpb24sIGBmaWxlcG9zJyBpcyBhIHBvaW50ZXIgdG8gdGhlIGBtc3RzYXZlJyBzdHJ1Y3R1cmUKLSAgICAgICAgIGluIHRoZSBjb3JlIGZpbGUuICovCi0KLSAgICAgIC8qIHJlYWQgR1BSJ3MgaW50byB0aGUgbG9jYXRpb24uICovCi0gICAgICBpZiAoIGJmZF9zZWVrKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyByZWdvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMQotCXx8IGJmZF9yZWFkKGxvY2F0aW9uLCBzaXplb2YgKG1zdGF0dXMuZ3ByKSwgMSwgYWJmZCkgIT0gc2l6ZW9mIChtc3RhdHVzLmdwcikpCi0JcmV0dXJuIChmYWxzZSk7IC8qIG9uIGVycm9yICovCi0KLSAgICAgIC8qIGluY3JlbWVudCBsb2NhdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHNwZWNpYWwgcmVnaXN0ZXJzIGluIHRoZSBzZWN0aW9uLAotICAgICAgICAgcmVzZXQgcmVnaXN0ZXIgb2Zmc2V0IHZhbHVlIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlyc3Qgc3BlY2lhbCByZWdpc3RlcgotCSBpbiBtc3RzYXZlIHN0cnVjdHVyZSwgYW5kIHJlYWQgc3BlY2lhbCByZWdpc3RlcnMuICovCi0KLSAgICAgIGxvY2F0aW9uID0gKFBUUikgKChjaGFyKilsb2NhdGlvbiArIHNpemVvZiAobXN0YXR1cy5ncHIpKTsKLSAgICAgIHJlZ29mZnNldCA9IChjaGFyKikmbXN0YXR1cy5pYXIgLSAoY2hhciopJm1zdGF0dXM7Ci0KLSAgICAgIGlmICggYmZkX3NlZWsoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIHJlZ29mZnNldCwgU0VFS19TRVQpID09IC0xCi0JfHwgYmZkX3JlYWQobG9jYXRpb24sIDQgKiBOVU1fT0ZfU1BFQ19SRUdTLCAxLCBhYmZkKSAhPSAKLQkJCQkJCQk0ICogTlVNX09GX1NQRUNfUkVHUykKLQlyZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KLSAgICAgIAotICAgICAgLyogaW5jcmVtZW50IGxvY2F0aW9uIGFkZHJlc3MsIGFuZCByZWFkIHRoZSBzcGVjaWFsIHJlZ2lzdGVycy4uICovCi0gICAgICAvKiBGSVhNRW1nbyAqLwotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKiBlbHNlLCB1c2UgZGVmYXVsdCBiZmQgc2VjdGlvbiBjb250ZW50IHRyYW5zZmVyLiAqLwotICAgIGVsc2UKLSAgICAgIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgCi0gICAgICAJCQkoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpOwotfQotCi0jZW5kaWYgLyogQUlYX0NPUkUgKi8KZGlmZiAtLWdpdCBhL2JmZC9zY281LWNvcmUuYyBiL2JmZC9zY281LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjOTdkMi4uMDAwMDAwMAotLS0gYS9iZmQvc2NvNS1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyogQkZEIGJhY2sgZW5kIGZvciBTQ081IGNvcmUgZmlsZXMgKFUtYXJlYSBhbmQgcmF3IHNlY3Rpb25zKQotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEpvdWtlIE51bWFuIDxqbnVtYW5AaGlzY29tLm5sPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgPHN5cy91c2VyLmg+ICAgICAgICAgICAvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9wYWNjZXNzLmg+Ci0jaW5jbHVkZSA8c3lzL3JlZ2lvbi5oPgotCi1zdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdAotewotICBzdHJ1Y3QgdXNlciB1OwotfTsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKLXN0YXRpYyBhc3ltYm9sICpzY281X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgdXNlciAqcmVhZF91YXJlYSBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpzY281X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY2hhciAqc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotaW50IHNjbzVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBzY281X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLAotCQkJCQkJICAgICBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLXNjbzVfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotIAotc3RhdGljIHN0cnVjdCB1c2VyICoKLXJlYWRfdWFyZWEoYWJmZCwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgZmlsZXBvczsKLQotewotICBzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqcmF3cHRyOwotCi0gIHJhd3B0ciA9ICgoc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKikKLQkgICAgYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QpKSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YSA9IHJhd3B0cjsKLQotICBpZiAoKGJmZF9zZWVrIChhYmZkLCBmaWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmcmF3cHRyLT51LCAxLCBzaXplb2YgcmF3cHRyLT51LCBhYmZkKQotCSAgIT0gc2l6ZW9mIHJhd3B0ci0+dSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHBlcmhhcHM/Pz8gKi8KLSAgaWYgKHJhd3B0ci0+dS51X2RzaXplID4gMHgxMDAwMDAwKSAgICAvKiBSZW1lbWJlciwgaXQncyBpbiBwYWdlcy4uLiAqLwotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBpZiAocmF3cHRyLT51LnVfc3NpemUgPiAweDEwMDAwMDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmF3cHRyLT51OwotfQotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1zY281X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjb2Zmc2V0X3NpeiwgdmFsLCBuc2VjcywgY2hlYWRvZmZzOwotICBpbnQgY29yZXNpemU7Ci0gIHN0cnVjdCB1c2VyICp1OwotICBzdHJ1Y3QgY29yZW9mZnNldHMgY29mZnNldHM7Ci0gIHN0cnVjdCBjb3Jlc2VjdGhlYWQgY2hlYWQ7Ci0gIGNoYXIgKnNlY25hbWU7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIC8qIFJlYWQgY29yZW9mZnNldHMgcmVnaW9uIGF0IGVuZCBvZiBjb3JlIChzZWUgY29yZShGUCkpICovCi0KLSAgewotICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCi0gICAgICB7Ci0gICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgIGNvcmVzaXplID0gc3RhdGJ1Zi5zdF9zaXplOwotICB9Ci0gIC8qIExhc3QgbG9uZyBpbiBjb3JlIGlzIHNpemVvZiBzdHJ1Y3QgY29yZW9mZnNldHMsIHJlYWQgaXQgKi8KLSAgaWYgKChiZmRfc2VlayAoYWJmZCwgY29yZXNpemUtc2l6ZW9mIGNvZmZzZXRfc2l6LCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY29mZnNldF9zaXosIDEsIHNpemVvZiBjb2Zmc2V0X3NpeiwgYWJmZCkKLQkgICE9IHNpemVvZiBjb2Zmc2V0X3NpeikgKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBVc2UgaXQgdG8gc2VlayBzdGFydCBvZiBjb3Jlb2Zmc2V0cyByZWdpb24sIHJlYWQgaXQgYW5kIGRldGVybWluZQotICAgICB2YWxpZGl0eSAqLwotICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjb3Jlc2l6ZS1jb2Zmc2V0X3NpeiwgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNvZmZzZXRzLCAxLCBzaXplb2YgY29mZnNldHMsIGFiZmQpCi0JICAhPSBzaXplb2YgY29mZnNldHMpCi0gICAgICB8fCAoKGNvZmZzZXRzLnVfaW5mbyAhPSAxKSAmJiAoY29mZnNldHMudV9pbmZvICE9IENfVkVSU0lPTikpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gIGlmIChjb2Zmc2V0cy51X2luZm8gPT0gMSkgCi0gICAgeyAKLSAgICAgIC8qIE9sZCB2ZXJzaW9uLCBubyBzZWN0aW9uIGhlYWRzLCByZWFkIGluZm8gZnJvbSB1c2VyIHN0cnVjdCAqLwotCi0gICAgICB1ID0gcmVhZF91YXJlYShhYmZkLCBjb2Zmc2V0cy51X3VzZXIpOwotICAgICAgaWYgKCEgdSkKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLCBTRUNfSEFTX0NPTlRFTlRTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfc2l6ZV90eXBlKSBjb2Zmc2V0cy51X3VzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIChiZmRfdm1hKSB1LT51X2FyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV91c2VyKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLCAKLQkJCSAgICAgIFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmZkX3NpemVfdHlwZSkgdS0+dV9leGRhdGEudXhfZHNpemUKLQkJCSAgICAgICArIHUtPnVfZXhkYXRhLnV4X2JzaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfdm1hKSB1LT51X2V4ZGF0YS51eF9kYXRvcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZV9wdHIpIGNvZmZzZXRzLnVfZGF0YSkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIAotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsIAotCQkJICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfc2l6ZV90eXBlKSB1LT51X3NzaXplICogTkJQQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfdm1hKSB1LT51X3N1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV9zdGFjaykpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICByZXR1cm4gYWJmZC0+eHZlYzsJCS8qIERvbmUgZm9yIHZlcnNpb24gMSAqLwotICAgIH0gICAgICAKLQotICAvKiBJbW1lZGlhdGVseSBiZWZvcmUgY29yZW9mZnNldHMgcmVnaW9uIGlzIGEgbG9uZyB3aXRoIG9mZnNldCBpbiBjb3JlCi0gICAgIHRvIGZpcnN0IGNvcmVzZWN0aGVhZCAoQ09SRVNfT0ZGU0VUUyksIHRoZSBsb25nIGJlZm9yZSB0aGlzIGlzIHRoZQotICAgICBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkcyBpbiB0aGUgbGlzdC4gUmVhZCBib3RoIGxvbmdzIGFuZCByZWFkIHRoZQotICAgICBjb3Jlc2VjdGhlYWQgYW5kIGNoZWNrIGl0cyB2YWxpZGl0eSAqLwotICAgIAotICBpZiAoKGJmZF9zZWVrIChhYmZkLCAKLQkJIGNvcmVzaXplIC0gY29mZnNldF9zaXogLSAyICogc2l6ZW9mIGNvZmZzZXRfc2l6LCAKLQkJIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZuc2VjcywgMSwgc2l6ZW9mIG5zZWNzLCBhYmZkKSAhPSBzaXplb2YgbnNlY3MpCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkb2ZmcywgMSwgc2l6ZW9mIGNoZWFkb2ZmcywgYWJmZCkKLQkgICE9IHNpemVvZiBjaGVhZG9mZnMpCi0gICAgICB8fCAoYmZkX3NlZWsgKGFiZmQsIGNoZWFkb2ZmcywgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkLCAxLCBzaXplb2YgY2hlYWQsIGFiZmQpICE9IHNpemVvZiBjaGVhZCkKLSAgICAgIHx8IChjaGVhZC5jc19zdHlwZSAhPSBDT1JFU19PRkZTRVRTKQotICAgICAgfHwgKGNoZWFkLmNzX3guY3N4X21hZ2ljICE9IENPUkVNQUdJQ19OVU1CRVIpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIE5vdyBsb29wIG92ZXIgYWxsIHJlZ2lvbnMgYW5kIG1hcCB0aGVtICovCi0gIG5zZWNzLS07CQkJCS8qIFdlJ3ZlIHNlZW4gQ09SRVNfT0ZGU0VUUyBhbHJlYWR5ICovCi0gIGZvciAoOyBuc2VjczsgbnNlY3MtLSkgCi0gICAgewotICAgICAgaWYgKChiZmRfc2VlayAoYWJmZCwgY2hlYWQuY3NfaHNlZWssIFNFRUtfU0VUKSAhPSAwKQotCSAgfHwgYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkLCAxLCBzaXplb2YgY2hlYWQsIGFiZmQpICE9IHNpemVvZiBjaGVhZCkKLSAgICAgICAgewotICAgICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICBzd2l0Y2ggKGNoZWFkLmNzX3N0eXBlKSAKLQl7Ci0JY2FzZSBDT1JFU19NQUdJQzoJCQkvKiBDb3JlIGhlYWRlciwgY2hlY2sgbWFnaWMgKi8KLQkgIGlmIChjaGVhZC5jc194LmNzeF9tYWdpYyAhPSBDT1JFTUFHSUNfTlVNQkVSKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIHNlY25hbWUgPSBOVUxMOwotCSAgbnNlY3MrKzsJCQkJLyogTUFHSUMgbm90IGluIHNlY3Rpb24gY250ISovCi0JICBicmVhazsKLQljYXNlIENPUkVTX1VBUkVBOgkJCS8qIFUtYXJlYSwgcmVhZCBpbiB0ZGF0YSAqLwotCSAgdSA9IHJlYWRfdWFyZWEoYWJmZCwgY2hlYWQuY3Nfc3NlZWspOwotCSAgaWYgKCEgdSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgICAvKiBUaGlzIGlzIHRyaWNreS4gIEFzIHRoZSAicmVnaXN0ZXIgc2VjdGlvbiIsIHdlIGdpdmUgdGhlbQotCSAgICAgdGhlIGVudGlyZSB1cGFnZSBhbmQgc3RhY2suICB1LnVfYXIwIHBvaW50cyB0byB3aGVyZQotCSAgICAgInJlZ2lzdGVyIDAiIGlzIHN0b3JlZC4gIFRoZXJlIGFyZSB0d28gdHJpY2tzIHdpdGggdGhpcywKLQkgICAgIHRob3VnaC4gIE9uZSBpcyB0aGF0IHRoZSByZXN0IG9mIHRoZSByZWdpc3RlcnMgbWlnaHQgYmUKLQkgICAgIGF0IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIChvciBib3RoKSBkaXNwbGFjZW1lbnRzIGZyb20KLQkgICAgICp1X2FyMC4gIFRoZSBvdGhlciBpcyB0aGF0IHVfYXIwIGlzIHNvbWV0aW1lcyBhbiBhYnNvbHV0ZQotCSAgICAgYWRkcmVzcyBpbiBrZXJuZWwgbWVtb3J5LCBhbmQgb24gb3RoZXIgc3lzdGVtcyBpdCBpcyBhbgotCSAgICAgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYHN0cnVjdCB1c2VyJy4KLQkKLQkgICAgIEFzIGEgcHJhY3RpY2FsIG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVnaXN0ZXJzCi0JICAgICBhY3R1YWxseSBhcmUsIHNvIHdlIGhhdmUgdG8gcGFzcyB0aGUgd2hvbGUgYXJlYSB0byBHREIuCi0JICAgICBXZSBlbmNvZGUgdGhlIHZhbHVlIG9mIHVfYXIwIGJ5IHNldHRpbmcgdGhlIC5yZWdzIHNlY3Rpb24KLQkgICAgIHVwIHNvIHRoYXQgaXRzIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MgMCBpcyBhdCB0aGUgcGxhY2UKLQkgICAgIHBvaW50ZWQgdG8gYnkgdV9hcjAgKGJ5IHNldHRpbmcgdGhlIHZtYSBvZiB0aGUgc3RhcnQgb2YKLQkgICAgIHRoZSBzZWN0aW9uIHRvIC11X2FyMCkuICBHREIgdXNlcyB0aGlzIGluZm8gdG8gbG9jYXRlIHRoZQotCSAgICAgcmVncywgdXNpbmcgbWlub3IgdHJpY2tlcnkgdG8gZ2V0IGFyb3VuZCB0aGUKLQkgICAgIG9mZnNldC1vci1hYnNvbHV0ZS1hZGRyIHByb2JsZW0uICovCi0KLQkgIGNoZWFkLmNzX3ZhZGRyID0gMCAtIChiZmRfdm1hKSB1LT51X2FyMDsKLQotCi0gICAgICAgICAgc2VjbmFtZSA9ICIucmVnIjsKLSAgICAgICAgICBmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgICAgICBicmVhazsKLQljYXNlIENPUkVTX1BSRUdJT046CQkJLyogQSBwcm9ncmFtIHJlZ2lvbiwgbWFwIGl0ICovCi0JICBzd2l0Y2ggKGNoZWFkLmNzX3guY3N4X3ByZWcuY3N4cF9ydHlwKQotCSAgICB7Ci0JICAgIGNhc2UgUFRfREFUQToKLQkgICAgICBzZWNuYW1lID0gIi5kYXRhIjsgIAkvKiBEYXRhIHJlZ2lvbi4gICAgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9TVEFDSzoKLQkgICAgICBzZWNuYW1lID0gIi5zdGFjayI7IAkvKiBTdGFjayByZWdpb24uICAgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9TSE1FTToKLQkgICAgICBzZWNuYW1lID0gIi5zaG1lbSI7IAkvKiBTaGFyZWQgbWVtb3J5ICAgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9MSUJEQVQ6Ci0JICAgICAgc2VjbmFtZSA9ICIubGliZGF0IjsJLyogU2hhcmVkIGxpYnJhcnkgZGF0YSAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfVjg2OgotCSAgICAgIHNlY25hbWUgPSAiLnZpcnQ4NiI7CS8qIFZpcnR1YWwgODA4NiBtb2RlICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1NIRklMOgotCSAgICAgIHNlY25hbWUgPSAiLm1tZmlsZSI7CS8qIE1lbW9yeSBtYXBwZWQgZmlsZSAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1hEQVRBMDoKLQkgICAgICBzZWNuYW1lID0gIi5YZGF0MCI7IAkvKiBYRU5JWCBkYXRhIHJlZ2lvbiwgdmlydHVhbCAwICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc2VjbmFtZSA9ICIiOwotCSAgICB9Ci0JICBmbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgQ09SRVNfUFJPQzoJCQkvKiBzdHJ1Y3QgcHJvYyAqLwotCWNhc2UgQ09SRVNfSVRJTUVSOgkJCS8qIGludGVydmFsIHRpbWVycyAqLwotCWNhc2UgQ09SRVNfU0NPVVRTTkFNRToJCQkvKiBzdHJ1Y3Qgc2NvdXRzbmFtZSAqLwotCSAgc2VjbmFtZSA9IE5VTEw7CS8qIElnbm9yZSB0aGVzZSAqLwotCSAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiVW5oYW5kbGVkIFNDTyBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlYWQuY3Nfc3R5cGUpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChzZWNuYW1lCi0JICAmJiAhbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsIGZsYWdzLAotCQkJCSAoYmZkX3NpemVfdHlwZSkgY2hlYWQuY3NfdnNpemUsCi0JCQkJIChiZmRfdm1hKSBjaGVhZC5jc192YWRkciwKLQkJCQkgKGZpbGVfcHRyKSBjaGVhZC5jc19zc2VlaykpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi19Ci0KLWNoYXIgKgotc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbSA9IGFiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhLT51LnVfY29tbTsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBBUkdTVVNFRCAqLwotaW50Ci1zY281X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci17Ci0gIHJldHVybiAoKGlnbm9yZV9hYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YS0+dS51X3N5c2Fib3J0ICE9IDApIAotCSAgPyBpZ25vcmVfYWJmZC0+dGRhdGEuc2NvNV9jb3JlX2RhdGEtPnUudV9zeXNhYm9ydCAKLQkgIDogLTEpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotYm9vbGVhbgotc2NvNV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7ICAgICAgICAgIC8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KLX0KLQotI2RlZmluZSBzY281X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgc2NvNV9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgc2NvNV9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgc2NvNV9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIHNjbzVfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHNjbzVfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgc2NvNV9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lIE5PX0dFVCAgKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZSBOT19QVVQgICgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUgTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgc2NvNV9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAic2NvNS1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fTElUVExFLCAgICAgICAgIC8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogYXJjaGl2ZSAqLwotICAgICBzY281X2NvcmVfZmlsZV9wICAgICAgCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0KLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoc2NvNSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNjbzVfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwICAgICAgICAgICAgICAgICAgICAgLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3NlY3Rpb24uYyBiL2JmZC9zZWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjc2MDguLjAwMDAwMDAKLS0tIGEvYmZkL3NlY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDExNzQgKzAsMCBAQAotLyogT2JqZWN0IGZpbGUgInNlY3Rpb24iIHN1cHBvcnQgZm9yIHRoZSBCRkQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlTZWN0aW9ucwotCi0JVGhlIHJhdyBkYXRhIGNvbnRhaW5lZCB3aXRoaW4gYSBCRkQgaXMgbWFpbnRhaW5lZCB0aHJvdWdoIHRoZQotCXNlY3Rpb24gYWJzdHJhY3Rpb24uICBBIHNpbmdsZSBCRkQgbWF5IGhhdmUgYW55IG51bWJlciBvZgotCXNlY3Rpb25zLiAgSXQga2VlcHMgaG9sZCBvZiB0aGVtIGJ5IHBvaW50aW5nIHRvIHRoZSBmaXJzdDsKLQllYWNoIG9uZSBwb2ludHMgdG8gdGhlIG5leHQgaW4gdGhlIGxpc3QuCi0KLQlTZWN0aW9ucyBhcmUgc3VwcG9ydGVkIGluIEJGRCBpbiA8PHNlY3Rpb24uYz4+LgotCi1AbWVudQotQCogU2VjdGlvbiBJbnB1dDo6Ci1AKiBTZWN0aW9uIE91dHB1dDo6Ci1AKiB0eXBlZGVmIGFzZWN0aW9uOjoKLUAqIHNlY3Rpb24gcHJvdG90eXBlczo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLVNlY3Rpb24gSW5wdXQsIFNlY3Rpb24gT3V0cHV0LCBTZWN0aW9ucywgU2VjdGlvbnMKLVNVQlNFQ1RJT04KLQlTZWN0aW9uIGlucHV0Ci0KLQlXaGVuIGEgQkZEIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhlIHNlY3Rpb24gc3RydWN0dXJlcyBhcmUKLQljcmVhdGVkIGFuZCBhdHRhY2hlZCB0byB0aGUgQkZELgotCi0JRWFjaCBzZWN0aW9uIGhhcyBhIG5hbWUgd2hpY2ggZGVzY3JpYmVzIHRoZSBzZWN0aW9uIGluIHRoZQotCW91dHNpZGUgd29ybGQtLS1mb3IgZXhhbXBsZSwgPDxhLm91dD4+IHdvdWxkIGNvbnRhaW4gYXQgbGVhc3QKLQl0aHJlZSBzZWN0aW9ucywgY2FsbGVkIDw8LnRleHQ+PiwgPDwuZGF0YT4+IGFuZCA8PC5ic3M+Pi4KLQotCU5hbWVzIG5lZWQgbm90IGJlIHVuaXF1ZTsgZm9yIGV4YW1wbGUgYSBDT0ZGIGZpbGUgbWF5IGhhdmUgc2V2ZXJhbAotCXNlY3Rpb25zIG5hbWVkIDw8LmRhdGE+Pi4KLQotCVNvbWV0aW1lcyBhIEJGRCB3aWxsIGNvbnRhaW4gbW9yZSB0aGFuIHRoZSBgYG5hdHVyYWwnJyBudW1iZXIgb2YKLQlzZWN0aW9ucy4gQSBiYWNrIGVuZCBtYXkgYXR0YWNoIG90aGVyIHNlY3Rpb25zIGNvbnRhaW5pbmcKLQljb25zdHJ1Y3RvciBkYXRhLCBvciBhbiBhcHBsaWNhdGlvbiBtYXkgYWRkIGEgc2VjdGlvbiAodXNpbmcKLQk8PGJmZF9tYWtlX3NlY3Rpb24+PikgdG8gdGhlIHNlY3Rpb25zIGF0dGFjaGVkIHRvIGFuIGFscmVhZHkgb3BlbgotCUJGRC4gRm9yIGV4YW1wbGUsIHRoZSBsaW5rZXIgY3JlYXRlcyBhbiBleHRyYSBzZWN0aW9uCi0JPDxDT01NT04+PiBmb3IgZWFjaCBpbnB1dCBmaWxlJ3MgQkZEIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQKLQljb21tb24gc3RvcmFnZS4KLQotCVRoZSByYXcgZGF0YSBpcyBub3QgbmVjZXNzYXJpbHkgcmVhZCBpbiB3aGVuCi0JdGhlIHNlY3Rpb24gZGVzY3JpcHRvciBpcyBjcmVhdGVkLiBTb21lIHRhcmdldHMgbWF5IGxlYXZlIHRoZQotCWRhdGEgaW4gcGxhY2UgdW50aWwgYSA8PGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cz4+IGNhbGwgaXMKLQltYWRlLiBPdGhlciBiYWNrIGVuZHMgbWF5IHJlYWQgaW4gYWxsIHRoZSBkYXRhIGF0IG9uY2UuICBGb3IKLQlleGFtcGxlLCBhbiBTLXJlY29yZCBmaWxlIGhhcyB0byBiZSByZWFkIG9uY2UgdG8gZGV0ZXJtaW5lIHRoZQotCXNpemUgb2YgdGhlIGRhdGEuIEFuIElFRUUtNjk1IGZpbGUgZG9lc24ndCBjb250YWluIHJhdyBkYXRhIGluCi0Jc2VjdGlvbnMsIGJ1dCBkYXRhIGFuZCByZWxvY2F0aW9uIGV4cHJlc3Npb25zIGludGVybWl4ZWQsIHNvCi0JdGhlIGRhdGEgYXJlYSBoYXMgdG8gYmUgcGFyc2VkIHRvIGdldCBvdXQgdGhlIGRhdGEgYW5kCi0JcmVsb2NhdGlvbnMuCi0KLUlOT0RFCi1TZWN0aW9uIE91dHB1dCwgdHlwZWRlZiBhc2VjdGlvbiwgU2VjdGlvbiBJbnB1dCwgU2VjdGlvbnMKLQotU1VCU0VDVElPTgotCVNlY3Rpb24gb3V0cHV0Ci0KLQlUbyB3cml0ZSBhIG5ldyBvYmplY3Qgc3R5bGUgQkZELCB0aGUgdmFyaW91cyBzZWN0aW9ucyB0byBiZQotCXdyaXR0ZW4gaGF2ZSB0byBiZSBjcmVhdGVkLiBUaGV5IGFyZSBhdHRhY2hlZCB0byB0aGUgQkZEIGluCi0JdGhlIHNhbWUgd2F5IGFzIGlucHV0IHNlY3Rpb25zOyBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlCi0Jc2VjdGlvbnMgdXNpbmcgPDxiZmRfc2V0X3NlY3Rpb25fY29udGVudHM+Pi4KLQotCUFueSBwcm9ncmFtIHRoYXQgY3JlYXRlcyBvciBjb21iaW5lcyBzZWN0aW9ucyAoZS5nLiwgdGhlIGFzc2VtYmxlcgotCWFuZCBsaW5rZXIpIG11c3QgdXNlIHRoZSA8PGFzZWN0aW9uPj4gZmllbGRzIDw8b3V0cHV0X3NlY3Rpb24+PiBhbmQKLQk8PG91dHB1dF9vZmZzZXQ+PiB0byBpbmRpY2F0ZSB0aGUgZmlsZSBzZWN0aW9ucyB0byB3aGljaCBlYWNoCi0Jc2VjdGlvbiBtdXN0IGJlIHdyaXR0ZW4uICAoSWYgdGhlIHNlY3Rpb24gaXMgYmVpbmcgY3JlYXRlZCBmcm9tCi0Jc2NyYXRjaCwgPDxvdXRwdXRfc2VjdGlvbj4+IHNob3VsZCBwcm9iYWJseSBwb2ludCB0byB0aGUgc2VjdGlvbgotCWl0c2VsZiBhbmQgPDxvdXRwdXRfb2Zmc2V0Pj4gc2hvdWxkIHByb2JhYmx5IGJlIHplcm8uKQotCi0JVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBjb21lcyBmcm9tIGlucHV0IHNlY3Rpb25zIGF0dGFjaGVkCi0JKHZpYSA8PG91dHB1dF9zZWN0aW9uPj4gcG9pbnRlcnMpIHRvCi0JdGhlIG91dHB1dCBzZWN0aW9ucy4gIFRoZSBvdXRwdXQgc2VjdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlCi0JY29uc2lkZXJlZCBhIGZpbHRlciBmb3IgdGhlIGlucHV0IHNlY3Rpb246IHRoZSBvdXRwdXQgc2VjdGlvbgotCWRldGVybWluZXMgdGhlIHZtYSBvZiB0aGUgb3V0cHV0IGRhdGEgYW5kIHRoZSBuYW1lLCBidXQgdGhlCi0JaW5wdXQgc2VjdGlvbiBkZXRlcm1pbmVzIHRoZSBvZmZzZXQgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gb2YKLQl0aGUgZGF0YSB0byBiZSB3cml0dGVuLgotCi0JRS5nLiwgdG8gY3JlYXRlIGEgc2VjdGlvbiAiTyIsIHN0YXJ0aW5nIGF0IDB4MTAwLCAweDEyMyBsb25nLAotCWNvbnRhaW5pbmcgdHdvIHN1YnNlY3Rpb25zLCAiQSIgYXQgb2Zmc2V0IDB4MCAoaS5lLiwgYXQgdm1hCi0JMHgxMDApIGFuZCAiQiIgYXQgb2Zmc2V0IDB4MjAgKGkuZS4sIGF0IHZtYSAweDEyMCkgdGhlIDw8YXNlY3Rpb24+PgotCXN0cnVjdHVyZXMgd291bGQgbG9vayBsaWtlOgotCi18ICAgc2VjdGlvbiBuYW1lICAgICAgICAgICJBIgotfCAgICAgb3V0cHV0X29mZnNldCAgIDB4MDAKLXwgICAgIHNpemUgICAgICAgICAgICAweDIwCi18ICAgICBvdXRwdXRfc2VjdGlvbiAtLS0tLS0tLS0tLT4gIHNlY3Rpb24gbmFtZSAgICAiTyIKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgdm1hICAgICAgICAgICAgIDB4MTAwCi18ICAgc2VjdGlvbiBuYW1lICAgICAgICAgICJCIiB8ICAgIHNpemUgICAgICAgICAgICAweDEyMwotfCAgICAgb3V0cHV0X29mZnNldCAgIDB4MjAgICAgfAotfCAgICAgc2l6ZSAgICAgICAgICAgIDB4MTAzICAgfAotfCAgICAgb3V0cHV0X3NlY3Rpb24gIC0tLS0tLS0tfAotCi0KLVNVQlNFQ1RJT04KLQlMaW5rIG9yZGVycwotCi0JVGhlIGRhdGEgd2l0aGluIGEgc2VjdGlvbiBpcyBzdG9yZWQgaW4gYSBAZGZue2xpbmtfb3JkZXJ9LgotCVRoZXNlIGFyZSBtdWNoIGxpa2UgdGhlIGZpeHVwcyBpbiA8PGdhcz4+LiAgVGhlIGxpbmtfb3JkZXIKLQlhYnN0cmFjdGlvbiBhbGxvd3MgYSBzZWN0aW9uIHRvIGdyb3cgYW5kIHNocmluayB3aXRoaW4gaXRzZWxmLgotCi0JQSBsaW5rX29yZGVyIGtub3dzIGhvdyBiaWcgaXQgaXMsIGFuZCB3aGljaCBpcyB0aGUgbmV4dAotCWxpbmtfb3JkZXIgYW5kIHdoZXJlIHRoZSByYXcgZGF0YSBmb3IgaXQgaXM7IGl0IGFsc28gcG9pbnRzIHRvCi0JYSBsaXN0IG9mIHJlbG9jYXRpb25zIHdoaWNoIGFwcGx5IHRvIGl0LgotCi0JVGhlIGxpbmtfb3JkZXIgaXMgdXNlZCBieSB0aGUgbGlua2VyIHRvIHBlcmZvcm0gcmVsYXhpbmcgb24KLQlmaW5hbCBjb2RlLiAgVGhlIGNvbXBpbGVyIGNyZWF0ZXMgY29kZSB3aGljaCBpcyBhcyBiaWcgYXMKLQluZWNlc3NhcnkgdG8gbWFrZSBpdCB3b3JrIHdpdGhvdXQgcmVsYXhpbmcsIGFuZCB0aGUgdXNlciBjYW4KLQlzZWxlY3Qgd2hldGhlciB0byByZWxheC4gIFNvbWV0aW1lcyByZWxheGluZyB0YWtlcyBhIGxvdCBvZgotCXRpbWUuICBUaGUgbGlua2VyIHJ1bnMgYXJvdW5kIHRoZSByZWxvY2F0aW9ucyB0byBzZWUgaWYgYW55Ci0JYXJlIGF0dGFjaGVkIHRvIGRhdGEgd2hpY2ggY2FuIGJlIHNocnVuaywgaWYgc28gaXQgZG9lcyBpdCBvbgotCWEgbGlua19vcmRlciBieSBsaW5rX29yZGVyIGJhc2lzLgotCi0qLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qCi1ET0NERAotSU5PREUKLXR5cGVkZWYgYXNlY3Rpb24sIHNlY3Rpb24gcHJvdG90eXBlcywgU2VjdGlvbiBPdXRwdXQsIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JdHlwZWRlZiBhc2VjdGlvbgotCi0JSGVyZSBpcyB0aGUgc2VjdGlvbiBzdHJ1Y3R1cmU6Ci0KLUNPREVfRlJBR01FTlQKLS4KLS4geyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYSBjb21kYXQgc2VjdGlvbiwgYXMgaW4gUEUuICBBIGNvbWRhdAotLiAgICBzZWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc3ltYm9sLiAgV2hlbiB0aGUgbGlua2VyCi0uICAgIHNlZXMgYSBjb21kYXQgc2VjdGlvbiwgaXQga2VlcHMgb25seSBvbmUgb2YgdGhlIHNlY3Rpb25zIHdpdGggYQotLiAgICBnaXZlbiBuYW1lIGFuZCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBzeW1ib2wuICp9Ci0uCi0uc3RydWN0IGJmZF9jb21kYXRfaW5mbwotLnsKLS4gIHsqIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgY29tZGF0IHNlY3Rpb24uICAqfQotLiAgY29uc3QgY2hhciAqbmFtZTsKLS4KLS4gIHsqIFRoZSBsb2NhbCBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYQotLiAgICAgY29tZGF0IHNlY3Rpb24uICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0uICAgICBzcGVjaWZpYyBjb2RlOyBpdCBpcyBub3QgYW4gaW5kZXggaW50byB0aGUgbGlzdCByZXR1cm5lZCBieQotLiAgICAgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuICAqfQotLiAgbG9uZyBzeW1ib2w7Ci0uCi0uICB7KiBJZiB0aGlzIHNlY3Rpb24gaXMgYmVpbmcgZGlzY2FyZGVkLCB0aGUgbGlua2VyIHVzZXMgdGhpcyBmaWVsZAotLiAgICAgdG8gcG9pbnQgdG8gdGhlIGlucHV0IHNlY3Rpb24gd2hpY2ggaXMgYmVpbmcga2VwdC4gICp9Ci0uICBzdHJ1Y3Qgc2VjICpzZWM7Ci0ufTsKLS4KLS50eXBlZGVmIHN0cnVjdCBzZWMKLS57Ci0uICAgICAgICB7KiBUaGUgbmFtZSBvZiB0aGUgc2VjdGlvbjsgdGhlIG5hbWUgaXNuJ3QgYSBjb3B5LCB0aGUgcG9pbnRlciBpcwotLiAgICAgICAgdGhlIHNhbWUgYXMgdGhhdCBwYXNzZWQgdG8gYmZkX21ha2Vfc2VjdGlvbi4gKn0KLS4KLS4gICAgQ09OU1QgY2hhciAqbmFtZTsKLS4KLS4gICAgICAgIHsqIFdoaWNoIHNlY3Rpb24gaXMgaXQ7IDAuLm50aC4gICAgICAqfQotLgotLiAgIGludCBpbmRleDsKLS4KLS4gICAgICAgIHsqIFRoZSBuZXh0IHNlY3Rpb24gaW4gdGhlIGxpc3QgYmVsb25naW5nIHRvIHRoZSBCRkQsIG9yIE5VTEwuICp9Ci0uCi0uICAgIHN0cnVjdCBzZWMgKm5leHQ7Ci0uCi0uICAgICAgICB7KiBUaGUgZmllbGQgZmxhZ3MgY29udGFpbnMgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbi4gU29tZQotLiAgICAgICAgICAgZmxhZ3MgYXJlIHJlYWQgaW4gZnJvbSB0aGUgb2JqZWN0IGZpbGUsIGFuZCBzb21lIGFyZQotLiAgICAgICAgICAgc3ludGhlc2l6ZWQgZnJvbSBvdGhlciBpbmZvcm1hdGlvbi4gICp9Ci0uCi0uICAgIGZsYWd3b3JkIGZsYWdzOwotLgotLiNkZWZpbmUgU0VDX05PX0ZMQUdTICAgMHgwMDAKLS4KLS4gICAgICAgIHsqIFRlbGxzIHRoZSBPUyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBzZWN0aW9uIHdoZW4gbG9hZGluZy4KLS4gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgc2VjdGlvbiBjb250YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uCi0uICAgICAgICAgICBvbmx5LiAqfQotLiNkZWZpbmUgU0VDX0FMTE9DICAgICAgMHgwMDEKLS4KLS4gICAgICAgIHsqIFRlbGxzIHRoZSBPUyB0byBsb2FkIHRoZSBzZWN0aW9uIGZyb20gdGhlIGZpbGUgd2hlbiBsb2FkaW5nLgotLiAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSAuYnNzIHNlY3Rpb24uICp9Ci0uI2RlZmluZSBTRUNfTE9BRCAgICAgICAweDAwMgotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBzdGlsbCB0byBiZSByZWxvY2F0ZWQsIHNvIHRoZXJlIGlzCi0uICAgICAgICAgICBzb21lIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG9vLiAqfQotLiNkZWZpbmUgU0VDX1JFTE9DICAgICAgMHgwMDQKLS4KLS4jaWYgMCAgIHsqIE9ic29sZXRlID8gKn0KLS4jZGVmaW5lIFNFQ19CQUxJR04gICAgIDB4MDA4Ci0uI2VuZGlmCi0uCi0uICAgICAgICB7KiBBIHNpZ25hbCB0byB0aGUgT1MgdGhhdCB0aGUgc2VjdGlvbiBjb250YWlucyByZWFkIG9ubHkKLS4gICAgICAgICAgZGF0YS4gKn0KLS4jZGVmaW5lIFNFQ19SRUFET05MWSAgIDB4MDEwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBjb2RlIG9ubHkuICp9Ci0uI2RlZmluZSBTRUNfQ09ERSAgICAgICAweDAyMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBvbmx5LiAqfQotLiNkZWZpbmUgU0VDX0RBVEEgICAgICAgMHgwNDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIHdpbGwgcmVzaWRlIGluIFJPTS4gKn0KLS4jZGVmaW5lIFNFQ19ST00gICAgICAgIDB4MDgwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBjb25zdHJ1Y3RvciBpbmZvcm1hdGlvbi4gVGhpcyBzZWN0aW9uCi0uICAgICAgICAgICB0eXBlIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBjcmVhdGUgbGlzdHMgb2YgY29uc3RydWN0b3JzIGFuZAotLiAgICAgICAgICAgZGVzdHJ1Y3RvcnMgdXNlZCBieSA8PGcrKz4+LiBXaGVuIGEgYmFjayBlbmQgc2VlcyBhIHN5bWJvbAotLiAgICAgICAgICAgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gYSBjb25zdHJ1Y3RvciBsaXN0LCBpdCBjcmVhdGVzIGEgbmV3Ci0uICAgICAgICAgICBzZWN0aW9uIGZvciB0aGUgdHlwZSBvZiBuYW1lIChlLmcuLCA8PF9fQ1RPUl9MSVNUX18+PiksIGF0dGFjaGVzCi0uICAgICAgICAgICB0aGUgc3ltYm9sIHRvIGl0LCBhbmQgYnVpbGRzIGEgcmVsb2NhdGlvbi4gVG8gYnVpbGQgdGhlIGxpc3RzCi0uICAgICAgICAgICBvZiBjb25zdHJ1Y3RvcnMsIGFsbCB0aGUgbGlua2VyIGhhcyB0byBkbyBpcyBjYXRlbmF0ZSBhbGwgdGhlCi0uICAgICAgICAgICBzZWN0aW9ucyBjYWxsZWQgPDxfX0NUT1JfTElTVF9fPj4gYW5kIHJlbG9jYXRlIHRoZSBkYXRhCi0uICAgICAgICAgICBjb250YWluZWQgd2l0aGluIC0gZXhhY3RseSB0aGUgb3BlcmF0aW9ucyBpdCB3b3VsZCBwZWZvcm0gb24KLS4gICAgICAgICAgIHN0YW5kYXJkIGRhdGEuICp9Ci0uI2RlZmluZSBTRUNfQ09OU1RSVUNUT1IgMHgxMDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGlzIGEgY29uc3RydWN0b3IsIGFuZCBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZQotLiAgICAgICAgICBlbmQgb2YgdGhlIHRleHQsIGRhdGEsIG9yIGJzcyBzZWN0aW9uKD8pLiAqfQotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX1RFWFQgMHgxMTAwCi0uI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfREFUQSAweDIxMDAKLS4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9CU1MgIDB4MzEwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gaGFzIGNvbnRlbnRzIC0gYSBkYXRhIHNlY3Rpb24gY291bGQgYmUKLS4gICAgICAgICAgIDw8U0VDX0FMTE9DPj4gfCA8PFNFQ19IQVNfQ09OVEVOVFM+PjsgYSBkZWJ1ZyBzZWN0aW9uIGNvdWxkIGJlCi0uICAgICAgICAgICA8PFNFQ19IQVNfQ09OVEVOVFM+PiAqfQotLiNkZWZpbmUgU0VDX0hBU19DT05URU5UUyAweDIwMAotLgotLiAgICAgICAgeyogQW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGxpbmtlciB0byBub3Qgb3V0cHV0IHRoZSBzZWN0aW9uCi0uICAgICAgICAgICBldmVuIGlmIGl0IGhhcyBpbmZvcm1hdGlvbiB3aGljaCB3b3VsZCBub3JtYWxseSBiZSB3cml0dGVuLiAqfQotLiNkZWZpbmUgU0VDX05FVkVSX0xPQUQgMHg0MDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgVGhpcyBmbGFnIGlzCi0uICAgICAgICAgICBvbmx5IGZvciB0aGUgbGlua2VyLiAgSWYgdGhpcyB0eXBlIG9mIHNlY3Rpb24gYXBwZWFycyBpbgotLiAgICAgICAgICAgdGhlIGlucHV0IGZpbGUsIHRoZSBsaW5rZXIgbXVzdCBjb3B5IGl0IHRvIHRoZSBvdXRwdXQgZmlsZQotLiAgICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgdm1hIG9yIHNpemUuICBGSVhNRTogQWx0aG91Z2ggdGhpcwotLiAgICAgICAgICAgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gYmUgZ2VuZXJhbCwgaXQgcmVhbGx5IGlzIENPRkYKLS4gICAgICAgICAgIHNwZWNpZmljIChhbmQgdGhlIGZsYWcgd2FzIHJlbmFtZWQgdG8gaW5kaWNhdGUgdGhpcykuICBJdAotLiAgICAgICAgICAgbWlnaHQgYmUgY2xlYW5lciB0byBoYXZlIHNvbWUgbW9yZSBnZW5lcmFsIG1lY2hhbmlzbSB0bwotLiAgICAgICAgICAgYWxsb3cgdGhlIGJhY2sgZW5kIHRvIGNvbnRyb2wgd2hhdCB0aGUgbGlua2VyIGRvZXMgd2l0aAotLiAgICAgICAgICAgc2VjdGlvbnMuICp9Ci0uI2RlZmluZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSAweDgwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29tbW9uIHN5bWJvbHMgKHN5bWJvbHMgbWF5IGJlIGRlZmluZWQKLS4gICAgICAgICAgIG11bHRpcGxlIHRpbWVzLCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgaXMgdGhlIGFtb3VudCBvZgotLiAgICAgICAgICAgc3BhY2UgaXQgcmVxdWlyZXMsIGFuZCB0aGUgbGFyZ2VzdCBzeW1ib2wgdmFsdWUgaXMgdGhlIG9uZQotLiAgICAgICAgICAgdXNlZCkuICBNb3N0IHRhcmdldHMgaGF2ZSBleGFjdGx5IG9uZSBvZiB0aGVzZSAod2hpY2ggd2UKLS4JICAgIHRyYW5zbGF0ZSB0byBiZmRfY29tX3NlY3Rpb25fcHRyKSwgYnV0IEVDT0ZGIGhhcyB0d28uICp9Ci0uI2RlZmluZSBTRUNfSVNfQ09NTU9OIDB4ODAwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgb25seSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBGb3IKLS4gICAgICAgICAgIGV4YW1wbGUsIHRoaXMgaXMgc2V0IGZvciBFTEYgLmRlYnVnIGFuZCAuc3RhYiBzZWN0aW9ucy4KLS4gICAgICAgICAgIHN0cmlwIHRlc3RzIHRoaXMgZmxhZyB0byBzZWUgaWYgYSBzZWN0aW9uIGNhbiBiZQotLiAgICAgICAgICAgZGlzY2FyZGVkLiAqfQotLiNkZWZpbmUgU0VDX0RFQlVHR0lORyAweDEwMDAwCi0uCi0uICAgICAgICB7KiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSBoZWxkIGluIG1lbW9yeSBwb2ludGVkIHRvCi0uICAgICAgICAgICBieSB0aGUgY29udGVudHMgZmllbGQuICBUaGlzIGlzIGNoZWNrZWQgYnkKLS4gICAgICAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cywgYW5kIHRoZSBkYXRhIGlzIHJldHJpZXZlZCBmcm9tCi0uICAgICAgICAgICBtZW1vcnkgaWYgYXBwcm9wcmlhdGUuICAqfQotLiNkZWZpbmUgU0VDX0lOX01FTU9SWSAweDIwMDAwCi0uCi0uICAgICAgICB7KiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSB0byBiZSBleGNsdWRlZCBieSB0aGUKLS4JICAgIGxpbmtlciBmb3IgZXhlY3V0YWJsZSBhbmQgc2hhcmVkIG9iamVjdHMgdW5sZXNzIHRob3NlCi0uCSAgICBvYmplY3RzIGFyZSB0byBiZSBmdXJ0aGVyIHJlbG9jYXRlZC4gICp9Ci0uI2RlZmluZSBTRUNfRVhDTFVERSAweDQwMDAwCi0uCi0uCXsqIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIHNvcnRlZCBieSB0aGUKLS4JICAgYmFzZWQgb24gdGhlIGFkZHJlc3Mgc3BlY2lmaWVkIGluIHRoZSBhc3NvY2lhdGVkIHN5bWJvbAotLgkgICB0YWJsZS4gICp9Ci0uI2RlZmluZSBTRUNfU09SVF9FTlRSSUVTIDB4ODAwMDAKLS4KLS4JeyogV2hlbiBsaW5raW5nLCBkdXBsaWNhdGUgc2VjdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBzaG91bGQgYmUKLS4JICAgZGlzY2FyZGVkLCByYXRoZXIgdGhhbiBiZWluZyBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIHNlY3Rpb24gYXMKLS4JICAgaXMgdXN1YWxseSBkb25lLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBjb21tb24gc3ltYm9scyBhcmUKLS4JICAgaGFuZGxlZC4gIFNlZSBTRUNfTElOS19EVVBMSUNBVEVTIGJlbG93LiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX09OQ0UgMHgxMDAwMDAKLS4KLS4JeyogSWYgU0VDX0xJTktfT05DRSBpcyBzZXQsIHRoaXMgYml0ZmllbGQgZGVzY3JpYmVzIGhvdyB0aGUgbGlua2VyCi0uCSAgIHNob3VsZCBoYW5kbGUgZHVwbGljYXRlIHNlY3Rpb25zLiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVMgMHg2MDAwMDAKLS4KLS4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IGR1cGxpY2F0ZQotLgkgICBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgc2hvdWxkIHNpbXBseSBiZSBkaXNjYXJkZWQuICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQgMHgwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0uCSAgIHNob3VsZCB3YXJuIGlmIHRoZXJlIGFyZSBhbnkgZHVwbGljYXRlIHNlY3Rpb25zLCBhbHRob3VnaAotLgkgICBpdCBzaG91bGQgc3RpbGwgb25seSBsaW5rIG9uZSBjb3B5LiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkgMHgyMDAwMDAKLS4KLS4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLS4JICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBhcmUgYSBkaWZmZXJlbnQgc2l6ZS4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSAweDQwMDAwMAotLgotLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgd2FybiBpZiBhbnkgZHVwbGljYXRlIHNlY3Rpb25zIGNvbnRhaW4gZGlmZmVyZW50Ci0uCSAgIGNvbnRlbnRzLiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUyAweDYwMDAwMAotLgotLgl7KiBUaGlzIHNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlciBhcyBwYXJ0IG9mIGR5bmFtaWMKLS4JICAgcmVsb2NhdGlvbiBvciBvdGhlciBhcmNhbmUgcHJvY2Vzc2luZy4gIEl0IGlzIHNraXBwZWQgd2hlbgotLgkgICBnb2luZyB0aHJvdWdoIHRoZSBmaXJzdC1wYXNzIG91dHB1dCwgdHJ1c3RpbmcgdGhhdCBzb21lb25lCi0uCSAgIGVsc2UgdXAgdGhlIGxpbmUgd2lsbCB0YWtlIGNhcmUgb2YgaXQgbGF0ZXIuICAqfQotLiNkZWZpbmUgU0VDX0xJTktFUl9DUkVBVEVEIDB4ODAwMDAwCi0uCi0uCXsqIFRoaXMgc2VjdGlvbiBzaG91bGQgbm90IGJlIHN1YmplY3QgdG8gZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKn0KLS4jZGVmaW5lIFNFQ19LRUVQIDB4MTAwMDAwMAotLgotLgl7KiBUaGlzIHNlY3Rpb24gY29udGFpbnMgInNob3J0IiBkYXRhLCBhbmQgc2hvdWxkIGJlIHBsYWNlZAotLgkgICAibmVhciIgdGhlIEdQLiAgKn0KLS4jZGVmaW5lIFNFQ19TTUFMTF9EQVRBIDB4MjAwMDAwMAotLgotLiAJeyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgd2hpY2ggbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyCi0uCSAgIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzLiAgKn0KLS4jZGVmaW5lIFNFQ19TSEFSRUQgMHg0MDAwMDAwCi0uCi0uCXsqICBFbmQgb2Ygc2VjdGlvbiBmbGFncy4gICp9Ci0uCi0uCXsqIFNvbWUgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKn0KLS4KLS4JeyogU2VlIHRoZSB2bWEgZmllbGQuICAqfQotLgl1bnNpZ25lZCBpbnQgdXNlcl9zZXRfdm1hIDogMTsKLS4KLS4JeyogV2hldGhlciByZWxvY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKn0KLS4JdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotLgotLgl7KiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGxpbmtlciBiYWNrZW5kcy4gICp9Ci0uCXVuc2lnbmVkIGludCBsaW5rZXJfbWFyayA6IDE7Ci0uCi0uCXsqIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9Ci0uCXVuc2lnbmVkIGludCBnY19tYXJrIDogMTsKLS4KLS4JeyogRW5kIG9mIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICp9Ci0uCi0uICAgICAgIHsqICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLS4gICAgICAgICAgIGF0IHJ1biB0aW1lLiAgVGhlIHN5bWJvbHMgYXJlIHJlbG9jYXRlZCBhZ2FpbnN0IHRoaXMuICBUaGUKLS4JICAgIHVzZXJfc2V0X3ZtYSBmbGFnIGlzIG1haW50YWluZWQgYnkgYmZkOyBpZiBpdCdzIG5vdCBzZXQsIHRoZQotLgkgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLS4JICAgIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIDw8LmRhdGE+PiBpcyBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljCi0uCSAgICB0YXJnZXQgYW5kIHZhcmlvdXMgZmxhZ3MpLiAgKn0KLS4KLS4gICBiZmRfdm1hIHZtYTsKLS4KLS4gICAgICAgeyogIFRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gLSB3aGVyZSBpdCB3b3VsZCBiZSBpbiBhCi0uICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLS4JICAgIGluZm9ybWF0aW9uLiAqfQotLgotLiAgIGJmZF92bWEgbG1hOwotLgotLiAgICAgICAgeyogVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaW4gb2N0ZXRzLCBhcyBpdCB3aWxsIGJlIG91dHB1dC4KLS4gICAgICAgICAgIENvbnRhaW5zIGEgdmFsdWUgZXZlbiBpZiB0aGUgc2VjdGlvbiBoYXMgbm8gY29udGVudHMgKGUuZy4sIHRoZQotLiAgICAgICAgICAgc2l6ZSBvZiA8PC5ic3M+PikuICBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIGFmdGVyIHJlbG9jYXRpb24uICAqfQotLgotLiAgIGJmZF9zaXplX3R5cGUgX2Nvb2tlZF9zaXplOwotLgotLiAgICAgICAgeyogVGhlIG9yaWdpbmFsIHNpemUgb24gZGlzayBvZiB0aGUgc2VjdGlvbiwgaW4gb2N0ZXRzLiAgTm9ybWFsbHkgdGhpcwotLgkgICAgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUsIGJ1dCBpZiBzb21lIHJlbGF4aW5nIGhhcwotLgkgICAgYmVlbiBkb25lLCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBiaWdnZXIuICAqfQotLgotLiAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotLgotLiAgICAgICAgeyogSWYgdGhpcyBzZWN0aW9uIGlzIGdvaW5nIHRvIGJlIG91dHB1dCwgdGhlbiB0aGlzIHZhbHVlIGlzIHRoZQotLiAgICAgICAgICAgb2Zmc2V0IGluICpieXRlcyogaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlCi0uICAgICAgICAgICBpbnB1dCBzZWN0aW9uIChieXRlID09PiBzbWFsbGVzdCBhZGRyZXNzYWJsZSB1bml0IG9uIHRoZQotLiAgICAgICAgICAgdGFyZ2V0KS4gIEluIG1vc3QgY2FzZXMsIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZQotLiAgICAgICAgICAgMTAwdGggb2N0ZXQgKDgtYml0IHF1YW50aXR5KSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoaXMgdmFsdWUKLS4gICAgICAgICAgIHdvdWxkIGJlIDEwMC4gIEhvd2V2ZXIsIGlmIHRoZSB0YXJnZXQgYnl0ZSBzaXplIGlzIDE2IGJpdHMKLS4gICAgICAgICAgIChiZmRfb2N0ZXRzX3Blcl9ieXRlIGlzICIyIiksIHRoaXMgdmFsdWUgd291bGQgYmUgNTAuICp9Ci0uCi0uICAgYmZkX3ZtYSBvdXRwdXRfb2Zmc2V0OwotLgotLiAgICAgICAgeyogVGhlIG91dHB1dCBzZWN0aW9uIHRocm91Z2ggd2hpY2ggdG8gbWFwIG9uIG91dHB1dC4gKn0KLS4KLS4gICBzdHJ1Y3Qgc2VjICpvdXRwdXRfc2VjdGlvbjsKLS4KLS4gICAgICAgIHsqIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhlIHNlY3Rpb24sIGFzIGFuIGV4cG9uZW50IG9mIDIgLQotLiAgICAgICAgICAgZS5nLiwgMyBhbGlnbnMgdG8gMl4zIChvciA4KS4gKn0KLS4KLS4gICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotLgotLiAgICAgICAgeyogSWYgYW4gaW5wdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHJlbG9jYXRpb24KLS4gICAgICAgICAgIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKn0KLS4KLS4gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKnJlbG9jYXRpb247Ci0uCi0uICAgICAgICB7KiBJZiBhbiBvdXRwdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHBvaW50ZXJzIHRvCi0uICAgICAgICAgICByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKn0KLS4KLS4gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKipvcmVsb2NhdGlvbjsKLS4KLS4gICAgICAgIHsqIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzIGluIG9uZSBvZiB0aGUgYWJvdmUgICp9Ci0uCi0uICAgdW5zaWduZWQgcmVsb2NfY291bnQ7Ci0uCi0uICAgICAgICB7KiBJbmZvcm1hdGlvbiBiZWxvdyBpcyBiYWNrIGVuZCBzcGVjaWZpYyAtIGFuZCBub3QgYWx3YXlzIHVzZWQKLS4gICAgICAgICAgIG9yIHVwZGF0ZWQuICAqfQotLgotLiAgICAgICAgeyogRmlsZSBwb3NpdGlvbiBvZiBzZWN0aW9uIGRhdGEgICAgKn0KLS4KLS4gICBmaWxlX3B0ciBmaWxlcG9zOwotLgotLiAgICAgICAgeyogRmlsZSBwb3NpdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gKn0KLS4KLS4gICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2YgbGluZSBkYXRhICAgICAgICp9Ci0uCi0uICAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotLgotLiAgICAgICAgeyogUG9pbnRlciB0byBkYXRhIGZvciBhcHBsaWNhdGlvbnMgKn0KLS4KLS4gICBQVFIgdXNlcmRhdGE7Ci0uCi0uICAgICAgICB7KiBJZiB0aGUgU0VDX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhpcyBwb2ludHMgdG8gdGhlIGFjdHVhbAotLiAgICAgICAgICAgY29udGVudHMuICAqfQotLiAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotLgotLiAgICAgICAgeyogQXR0YWNoZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKn0KLS4KLS4gICBhbGVudCAqbGluZW5vOwotLgotLiAgICAgICAgeyogTnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgICAqfQotLgotLiAgIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0uCi0uCSB7KiBPcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIENPTURBVCBlbnRyeTsgTlVMTCBpZiBub3QgQ09NREFUICp9Ci0uCi0uICAgc3RydWN0IGJmZF9jb21kYXRfaW5mbyAqY29tZGF0OwotLgotLiAgICAgICAgeyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotLiAgICAgICAgICAgbGluZW51bWJlcnMgYXJlIHdyaXR0ZW4gb3V0ICp9Ci0uCi0uICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFdoYXQgdGhlIHNlY3Rpb24gbnVtYmVyIGlzIGluIHRoZSB0YXJnZXQgd29ybGQgICp9Ci0uCi0uICAgaW50IHRhcmdldF9pbmRleDsKLS4KLS4gICBQVFIgdXNlZF9ieV9iZmQ7Ci0uCi0uICAgICAgICB7KiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotLiAgICAgICAgICAgcmVsb2NhdGlvbnMgY3JlYXRlZCB0byByZWxvY2F0ZSBpdGVtcyB3aXRoaW4gaXQuICp9Ci0uCi0uICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0uCi0uICAgICAgICB7KiBUaGUgQkZEIHdoaWNoIG93bnMgdGhlIHNlY3Rpb24uICp9Ci0uCi0uICAgYmZkICpvd25lcjsKLS4KLS4JIHsqIEEgc3ltYm9sIHdoaWNoIHBvaW50cyBhdCB0aGlzIHNlY3Rpb24gb25seSAqfQotLiAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLS4gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0uCi0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX2hlYWQ7Ci0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci0ufSBhc2VjdGlvbiA7Ci0uCi0uICAgIHsqIFRoZXNlIHNlY3Rpb25zIGFyZSBnbG9iYWwsIGFuZCBhcmUgbWFuYWdlZCBieSBCRkQuICBUaGUgYXBwbGljYXRpb24KLS4gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotLgl0aGVzZSBzZWN0aW9ucy4gIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIHNlY3Rpb25fcHRyIG1hY3JvcyByYXRoZXIKLS4gICAgICAgdGhhbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIGNvbnN0IHNlY3Rpb25zLiAgVGhlIGNvbnN0IHNlY3Rpb25zCi0uICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICp9Ci0uI2RlZmluZSBCRkRfQUJTX1NFQ1RJT05fTkFNRSAiKkFCUyoiCi0uI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCi0uI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0uI2RlZmluZSBCRkRfSU5EX1NFQ1RJT05fTkFNRSAiKklORCoiCi0uCi0uICAgIHsqIHRoZSBhYnNvbHV0ZSBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9hYnNfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2Fic19zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2Fic19zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIHVuZGVmaW5lZCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF91bmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX3VuZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX3VuZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9jb21fc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2NvbV9zZWN0aW9uKQotLiAgICB7KiBQb2ludGVyIHRvIHRoZSBpbmRpcmVjdCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9pbmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2luZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9pbmRfc2VjdGlvbl9wdHIpCi0uCi0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLS5leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9jb21fc3ltYm9sOwotLmV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX3VuZF9zeW1ib2w7Ci0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhzZWN0aW9uKSBcCi0uICAgICAoKHNlY3Rpb24pLT5yZWxvY19kb25lID8gKGFib3J0ICgpLCAoYmZkX3NpemVfdHlwZSkgMSkgXAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChzZWN0aW9uKS0+X3Jhd19zaXplKQotLiNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2Moc2VjdGlvbikgXAotLiAgICAgKChzZWN0aW9uKS0+cmVsb2NfZG9uZSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplIFwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksIChiZmRfc2l6ZV90eXBlKSAxKSkKLSovCi0KLS8qIFdlIHVzZSBhIG1hY3JvIHRvIGluaXRpYWxpemUgdGhlIHN0YXRpYyBhc3ltYm9sIHN0cnVjdHVyZXMgYmVjYXVzZQotICAgdHJhZGl0aW9uYWwgQyBkb2VzIG5vdCBwZXJtaXQgdXMgdG8gaW5pdGlhbGl6ZSBhIHVuaW9uIG1lbWJlciB3aGlsZQotICAgZ2NjIHdhcm5zIGlmIHdlIGRvbid0IGluaXRpYWxpemUgaXQuICAqLwotIC8qIHRoZV9iZmQsIG5hbWUsIHZhbHVlLCBhdHRyLCBzZWN0aW9uIFssIHVkYXRhXSAqLwotI2lmZGVmIF9fU1REQ19fCi0jZGVmaW5lIEdMT0JBTF9TWU1fSU5JVChOQU1FLCBTRUNUSU9OKSBcCi0gIHsgMCwgTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgU0VDVElPTiwgeyAwIH19Ci0jZWxzZQotI2RlZmluZSBHTE9CQUxfU1lNX0lOSVQoTkFNRSwgU0VDVElPTikgXAotICB7IDAsIE5BTUUsIDAsIEJTRl9TRUNUSU9OX1NZTSwgKGFzZWN0aW9uICopIFNFQ1RJT04gfQotI2VuZGlmCi0KLS8qIFRoZXNlIHN5bWJvbHMgYXJlIGdsb2JhbCwgbm90IHNwZWNpZmljIHRvIGFueSBCRkQuICBUaGVyZWZvcmUsIGFueXRoaW5nCi0gICB0aGF0IHRyaWVzIHRvIGNoYW5nZSB0aGVtIGlzIGJyb2tlbiwgYW5kIHNob3VsZCBiZSByZXBhaXJlZC4gICovCi0KLXN0YXRpYyBjb25zdCBhc3ltYm9sIGdsb2JhbF9zeW1zW10gPQotewotICBHTE9CQUxfU1lNX0lOSVQgKEJGRF9DT01fU0VDVElPTl9OQU1FLCAmYmZkX2NvbV9zZWN0aW9uKSwKLSAgR0xPQkFMX1NZTV9JTklUIChCRkRfVU5EX1NFQ1RJT05fTkFNRSwgJmJmZF91bmRfc2VjdGlvbiksCi0gIEdMT0JBTF9TWU1fSU5JVCAoQkZEX0FCU19TRUNUSU9OX05BTUUsICZiZmRfYWJzX3NlY3Rpb24pLAotICBHTE9CQUxfU1lNX0lOSVQgKEJGRF9JTkRfU0VDVElPTl9OQU1FLCAmYmZkX2luZF9zZWN0aW9uKQotfTsKLQotI2RlZmluZSBTVERfU0VDVElPTihTRUMsIEZMQUdTLCBTWU0sIE5BTUUsIElEWCkJXAotICBjb25zdCBhc3ltYm9sICogY29uc3QgU1lNID0gKGFzeW1ib2wgKikgJmdsb2JhbF9zeW1zW0lEWF07IFwKLSAgY29uc3QgYXNlY3Rpb24gU0VDID0gXAotICAgIC8qIG5hbWUsIGluZGV4LCBuZXh0LCBmbGFncywgc2V0X3ZtYSwgcmVsb2NfZG9uZSwgbGlua2VyX21hcmssIGdjX21hcmsgKi8gXAotICAgIHsgTkFNRSwgIDAsICAgICAwLCAgICBGTEFHUywgMCwgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgIDAsCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLSAgICAvKiB2bWEsIGxtYSwgX2Nvb2tlZF9zaXplLCBfcmF3X3NpemUsIG91dHB1dF9vZmZzZXQsIG91dHB1dF9zZWN0aW9uLCAqLyAgIFwKLSAgICAgICAwLCAgIDAsICAgMCwgICAgICAgICAgICAwLCAgICAgICAgIDAsICAgICAgICAgICAgIChzdHJ1Y3Qgc2VjICopICZTRUMsIFwKLQkJCQkJCQkJCSAgICAgIFwKLSAgICAvKiBhbGlnLi4uLCByZWxvYy4uLiwgb3JlbC4uLiwgcmVsb2NfY291bnQsIGZpbGVwb3MsIHJlbF8uLi4sIGxpbmVfLi4uICovIFwKLSAgICAgICAwLCAgICAgICAwLCAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgIDAsICAgICAgIDAsIAkgICAwLAkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgLyogdXNlcmRhdGEsIGNvbnRlbnRzLCBsaW5lbm8sIGxpbmVub19jb3VudCAqLyAJCQkgICAgICBcCi0gICAgICAgMCwgICAgICAgIDAsICAgICAgICAwLCAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIAkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotICAgIC8qIGNvbWRhdF9pbmZvLCBtb3ZpbmdfbGluZV9maWxlcG9zLCB0YXJnZXRfaW5kZXgsIHVzZWRfYnlfYmZkLCAgKi8gICAgICAgXAotICAgICAgIE5VTEwsICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgIDAsIAkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotICAgIC8qIGNvbnMuLi4sIG93bmVyLCBzeW1ib2wgKi8gCQkJCQkgICAgICBcCi0gICAgICAgMCwgICAgICAgMCwgICAgIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopICZnbG9iYWxfc3ltc1tJRFhdLCAgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgLyogc3ltYm9sX3B0cl9wdHIsICAgICAgICAgICAgICAgICAgICAgIGxpbmtfb3JkZXJfaGVhZCwgLi4uX3RhaWwgKi8gICAgICBcCi0gICAgICAgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopICZTWU0sIDAsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1TVERfU0VDVElPTiAoYmZkX2NvbV9zZWN0aW9uLCBTRUNfSVNfQ09NTU9OLCBiZmRfY29tX3N5bWJvbCwKLQkgICAgIEJGRF9DT01fU0VDVElPTl9OQU1FLCAwKTsKLVNURF9TRUNUSU9OIChiZmRfdW5kX3NlY3Rpb24sIDAsIGJmZF91bmRfc3ltYm9sLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMSk7Ci1TVERfU0VDVElPTiAoYmZkX2Fic19zZWN0aW9uLCAwLCBiZmRfYWJzX3N5bWJvbCwgQkZEX0FCU19TRUNUSU9OX05BTUUsIDIpOwotU1REX1NFQ1RJT04gKGJmZF9pbmRfc2VjdGlvbiwgMCwgYmZkX2luZF9zeW1ib2wsIEJGRF9JTkRfU0VDVElPTl9OQU1FLCAzKTsKLSN1bmRlZiBTVERfU0VDVElPTgotCi0vKgotRE9DREQKLUlOT0RFCi1zZWN0aW9uIHByb3RvdHlwZXMsICAsIHR5cGVkZWYgYXNlY3Rpb24sIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBwcm90b3R5cGVzCi0KLVRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBzZWN0aW9uIGhhbmRsaW5nIHBhcnQgb2YgQkZELgotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlSdW4gdGhyb3VnaCBAdmFye2FiZmR9IGFuZCByZXR1cm4gdGhlIG9uZSBvZiB0aGUKLQk8PGFzZWN0aW9uPj5zIHdob3NlIG5hbWUgbWF0Y2hlcyBAdmFye25hbWV9LCBvdGhlcndpc2UgPDxOVUxMPj4uCi0JQHhyZWZ7U2VjdGlvbnN9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotCVRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBzcGVjaWFsIGNhc2VzOyB0aGUgbm9ybWFsIHdheSB0byBwcm9jZXNzCi0JYWxsIHNlY3Rpb25zIG9mIGEgZ2l2ZW4gbmFtZSBpcyB0byB1c2UgPDxiZmRfbWFwX292ZXJfc2VjdGlvbnM+PiBhbmQKLQk8PHN0cmNtcD4+IG9uIHRoZSBuYW1lIChvciBiZXR0ZXIgeWV0LCBiYXNlIGl0IG9uIHRoZSBzZWN0aW9uIGZsYWdzCi0Jb3Igc29tZXRoaW5nIGVsc2UpIGZvciBlYWNoIHNlY3Rpb24uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjdDsKLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdCAhPSBOVUxMOyBzZWN0ID0gc2VjdC0+bmV4dCkKLSAgICBpZiAoIXN0cmNtcCAoc2VjdC0+bmFtZSwgbmFtZSkpCi0gICAgICByZXR1cm4gc2VjdDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5Ci0KLVNZTk9QU0lTCi0JYXNlY3Rpb24gKmJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheShiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9Ci0JYW5kIGF0dGFjaCBpdCB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbiBvZiBzZWN0aW9ucyBmb3IgdGhlCi0JQkZEIEB2YXJ7YWJmZH0uIEFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgc2VjdGlvbiB3aXRoIGEgbmFtZSB3aGljaAotCWlzIGFscmVhZHkgaW4gdXNlIHJldHVybnMgaXRzIHBvaW50ZXIgd2l0aG91dCBjaGFuZ2luZyB0aGUKLQlzZWN0aW9uIGNoYWluLgotCi0JSXQgaGFzIHRoZSBmdW5ueSBuYW1lIHNpbmNlIHRoaXMgaXMgdGhlIHdheSBpdCB1c2VkIHRvIGJlCi0JYmVmb3JlIGl0IHdhcyByZXdyaXR0ZW4uLi4uCi0KLQlQb3NzaWJsZSBlcnJvcnMgYXJlOgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JSWYgb3V0cHV0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQgZm9yIHRoaXMgQkZELgotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCUlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgotCi0qLwotCi0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgIH0KLSAgcmV0dXJuIHNlYzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIENyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9IGFuZCBhdHRhY2ggaXQgdG8gdGhlIGVuZCBvZgotICAgdGhlIGNoYWluIG9mIHNlY3Rpb25zIGZvciBAdmFye2FiZmR9LiAgQ3JlYXRlIGEgbmV3IHNlY3Rpb24gZXZlbiBpZiB0aGVyZQotICAgaXMgYWxyZWFkeSBhIHNlY3Rpb24gd2l0aCB0aGF0IG5hbWUuCi0KLSAgIFJldHVybiA8PE5VTEw+PiBhbmQgc2V0IDw8YmZkX2Vycm9yPj4gb24gZXJyb3I7IHBvc3NpYmxlIGVycm9ycyBhcmU6Ci0gICBvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLSBJZiBvdXRwdXQgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgQHZhcnthYmZkfS4KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLSBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KLSovCi0KLXNlY19wdHIKLWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBhc2VjdGlvbiAqKnByZXYgPSAmYWJmZC0+c2VjdGlvbnM7Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB3aGlsZSAoc2VjdCkKLSAgICB7Ci0gICAgICBwcmV2ID0gJnNlY3QtPm5leHQ7Ci0gICAgICBzZWN0ID0gc2VjdC0+bmV4dDsKLSAgICB9Ci0KLSAgbmV3c2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChuZXdzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmV3c2VjdC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPmluZGV4ID0gYWJmZC0+c2VjdGlvbl9jb3VudCsrOwotICBuZXdzZWN0LT5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQotICBuZXdzZWN0LT51c2VyZGF0YSA9IE5VTEw7Ci0gIG5ld3NlY3QtPmNvbnRlbnRzID0gTlVMTDsKLSAgbmV3c2VjdC0+bmV4dCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBuZXdzZWN0LT5yZWxvY2F0aW9uID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgbmV3c2VjdC0+cmVsb2NfY291bnQgPSAwOwotICBuZXdzZWN0LT5saW5lX2ZpbGVwb3MgPSAwOwotICBuZXdzZWN0LT5vd25lciA9IGFiZmQ7Ci0gIG5ld3NlY3QtPmNvbWRhdCA9IE5VTEw7Ci0KLSAgLyogQ3JlYXRlIGEgc3ltYm9sIHdob3Mgb25seSBqb2IgaXMgdG8gcG9pbnQgdG8gdGhpcyBzZWN0aW9uLiBUaGlzIGlzCi0gICAgIHVzZWZ1bCBmb3IgdGhpbmdzIGxpa2UgcmVsb2NzIHdoaWNoIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiBhCi0gICAgIHNlY3Rpb24uICAqLwotICBuZXdzZWN0LT5zeW1ib2wgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAobmV3c2VjdC0+c3ltYm9sID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+dmFsdWUgPSAwOwotICBuZXdzZWN0LT5zeW1ib2wtPnNlY3Rpb24gPSBuZXdzZWN0OwotICBuZXdzZWN0LT5zeW1ib2wtPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCi0gIG5ld3NlY3QtPnN5bWJvbF9wdHJfcHRyID0gJm5ld3NlY3QtPnN5bWJvbDsKLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9uZXdfc2VjdGlvbl9ob29rLCAoYWJmZCwgbmV3c2VjdCkpICE9IHRydWUpCi0gICAgewotICAgICAgZnJlZSAobmV3c2VjdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgKnByZXYgPSBuZXdzZWN0OwotICByZXR1cm4gbmV3c2VjdDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbgotCi1TWU5PUFNJUwotCWFzZWN0aW9uICpiZmRfbWFrZV9zZWN0aW9uKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIExpa2UgPDxiZmRfbWFrZV9zZWN0aW9uX2FueXdheT4+LCBidXQgcmV0dXJuIDw8TlVMTD4+ICh3aXRob3V0IGNhbGxpbmcKLSAgIGJmZF9zZXRfZXJyb3IgKCkpIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlY3Rpb24gY2hhaW4gaWYgdGhlcmUgaXMgYWxyZWFkeSBhCi0gICBzZWN0aW9uIG5hbWVkIEB2YXJ7bmFtZX0uICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgcmV0dXJuIDw8TlVMTD4+IGFuZCBzZXQKLSAgIDw8YmZkX2Vycm9yPj4uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgQkZEX0FCU19TRUNUSU9OX05BTUUpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfQ09NX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICB9Ci0gIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9VTkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgIH0KLQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfSU5EX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2luZF9zZWN0aW9uX3B0cjsKLSAgICB9Ci0KLSAgd2hpbGUgKHNlY3QpCi0gICAgewotICAgICAgaWYgKCFzdHJjbXAgKHNlY3QtPm5hbWUsIG5hbWUpKQotCXJldHVybiBOVUxMOwotICAgICAgc2VjdCA9IHNlY3QtPm5leHQ7Ci0gICAgfQotCi0gIC8qIFRoZSBuYW1lIGlzIG5vdCBhbHJlYWR5IHVzZWQ7IGdvIGFoZWFkIGFuZCBtYWtlIGEgbmV3IHNlY3Rpb24uICAqLwotICByZXR1cm4gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc2VjdGlvbl9mbGFncwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9zZWN0aW9uX2ZsYWdzKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgZmxhZ3dvcmQgZmxhZ3MpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbiBAdmFye3NlY30gaW4gdGhlIEJGRAotCUB2YXJ7YWJmZH0gdG8gdGhlIHZhbHVlIEB2YXJ7ZmxhZ3N9LiBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywKLQk8PGZhbHNlPj4gb24gZXJyb3IuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlUaGUgc2VjdGlvbiBjYW5ub3QgaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGUgYXR0cmlidXRlcwotCXJlcXVlc3RlZC4gRm9yIGV4YW1wbGUsIGEgLmJzcyBzZWN0aW9uIGluIDw8YS5vdXQ+PiBtYXkgbm90Ci0JaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4gZmllbGQgc2V0LgotCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotI2lmIDAKLSAgLyogSWYgeW91IHRyeSB0byBjb3B5IGEgdGV4dCBzZWN0aW9uIGZyb20gYW4gaW5wdXQgZmlsZSAod2hlcmUgaXQKLSAgICAgaGFzIHRoZSBTRUNfQ09ERSBmbGFnIHNldCkgdG8gYW4gb3V0cHV0IGZpbGUsIHRoaXMgbG9zZXMgYmlnIGlmCi0gICAgIHRoZSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChhYmZkKSBkb2Vzbid0IGhhdmUgdGhlIFNFQ19DT0RFCi0gICAgIHNldCAtIHdoaWNoIGl0IGRvZXNuJ3QsIGF0IGxlYXN0IG5vdCBmb3IgYS5vdXQuICBGSVhNRSAqLwotCi0gIGlmICgoZmxhZ3MgJiBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChhYmZkKSkgIT0gZmxhZ3MpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICBzZWN0aW9uLT5mbGFncyA9IGZsYWdzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFwX292ZXJfc2VjdGlvbnMKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyhiZmQgKmFiZmQsCi0JCQkJICAgdm9pZCAoKmZ1bmMpKGJmZCAqYWJmZCwKLQkJCQkJCWFzZWN0aW9uICpzZWN0LAotCQkJCQkJUFRSIG9iaiksCi0JCQkJICAgUFRSIG9iaik7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gQHZhcntmdW5jfSBmb3IgZWFjaCBzZWN0aW9uCi0JYXR0YWNoZWQgdG8gdGhlIEJGRCBAdmFye2FiZmR9LCBwYXNzaW5nIEB2YXJ7b2JqfSBhcyBhbgotCWFyZ3VtZW50LiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYXMgaWYgYnkKLQotfAlmdW5jKGFiZmQsIHRoZV9zZWN0aW9uLCBvYmopOwotCi0JVGhpcyBpcyB0aGUgcHJlZmVyZWQgbWV0aG9kIGZvciBpdGVyYXRpbmcgb3ZlciBzZWN0aW9uczsgYW4KLQlhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byB1c2UgYSBsb29wOgotCi18CSAgIHNlY3Rpb24gKnA7Ci18CSAgIGZvciAocCA9IGFiZmQtPnNlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotfAkgICAgICBmdW5jKGFiZmQsIHAsIC4uLikKLQotCi0qLwotCi0vKlZBUkFSR1MyKi8KLXZvaWQKLWJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgb3BlcmF0aW9uLCB1c2VyX3N0b3JhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm9pZCAoKm9wZXJhdGlvbikgUEFSQU1TICgoYmZkICogYWJmZCwgYXNlY3Rpb24gKiBzZWN0LCBQVFIgb2JqKSk7Ci0gICAgIFBUUiB1c2VyX3N0b3JhZ2U7Ci17Ci0gIGFzZWN0aW9uICpzZWN0OwotICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3QgIT0gTlVMTDsgaSsrLCBzZWN0ID0gc2VjdC0+bmV4dCkKLSAgICAoKm9wZXJhdGlvbikgKGFiZmQsIHNlY3QsIHVzZXJfc3RvcmFnZSk7Ci0KLSAgaWYgKGkgIT0gYWJmZC0+c2VjdGlvbl9jb3VudCkJLyogRGVidWdnaW5nICovCi0gICAgYWJvcnQgKCk7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zZWN0aW9uX3NpemUKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfc2VjdGlvbl9zaXplKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3NpemVfdHlwZSB2YWwpOwotCi1ERVNDUklQVElPTgotCVNldCBAdmFye3NlY30gdG8gdGhlIHNpemUgQHZhcnt2YWx9LiBJZiB0aGUgb3BlcmF0aW9uIGlzCi0Jb2ssIHRoZW4gPDx0cnVlPj4gaXMgcmV0dXJuZWQsIGVsc2UgPDxmYWxzZT4+LgotCi0JUG9zc2libGUgZXJyb3IgcmV0dXJuczoKLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCVdyaXRpbmcgaGFzIHN0YXJ0ZWQgdG8gdGhlIEJGRCwgc28gc2V0dGluZyB0aGUgc2l6ZSBpcyBpbnZhbGlkLgotCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcHRyLCB2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBwdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgdmFsOwotewotICAvKiBPbmNlIHlvdSd2ZSBzdGFydGVkIHdyaXRpbmcgdG8gYW55IHNlY3Rpb24geW91IGNhbm5vdCBjcmVhdGUgb3IgY2hhbmdlCi0gICAgIHRoZSBzaXplIG9mIGFueSBvdGhlcnMuICovCi0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcHRyLT5fY29va2VkX3NpemUgPSB2YWw7Ci0gIHB0ci0+X3Jhd19zaXplID0gdmFsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotICAgICAgICAgUFRSIGRhdGEsCi0gICAgICAgICBmaWxlX3B0ciBvZmZzZXQsCi0gICAgICAgICBiZmRfc2l6ZV90eXBlIGNvdW50KTsKLQotCi1ERVNDUklQVElPTgotCVNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIEB2YXJ7c2VjdGlvbn0gaW4gQkZECi0JQHZhcnthYmZkfSB0byB0aGUgZGF0YSBzdGFydGluZyBpbiBtZW1vcnkgYXQgQHZhcntkYXRhfS4gVGhlCi0JZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGFydGluZyBhdCBvZmZzZXQKLQlAdmFye29mZnNldH0gZm9yIEB2YXJ7Y291bnR9IG9jdGV0cy4KLQotCi0KLQlOb3JtYWxseSA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZSA8PGZhbHNlPj4uIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0JbyA8PGJmZF9lcnJvcl9ub19jb250ZW50cz4+IC0KLQlUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4KLQlhdHRyaWJ1dGUsIHNvIG5vdGhpbmcgY2FuIGJlIHdyaXR0ZW4gdG8gaXQuCi0JbyBhbmQgc29tZSBtb3JlIHRvbwotCi0JVGhpcyByb3V0aW5lIGlzIGZyb250IGVuZCB0byB0aGUgYmFjayBlbmQgZnVuY3Rpb24KLQk8PF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHM+Pi4KLQotCi0qLwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX25vdyhhYmZkLHNlYykgXAotKHNlYy0+cmVsb2NfZG9uZSBcCi0gPyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9hZnRlcl9yZWxvYyAoc2VjKSBcCi0gOiBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykpCi0KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzejsKLQotICBpZiAoIShiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0hBU19DT05URU5UUykpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKLSAgICAgIHJldHVybiAoZmFsc2UpOwotICAgIH0KLQotICBpZiAob2Zmc2V0IDwgMCkKLSAgICB7Ci0gICAgYmFkX3ZhbDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc3ogPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3cgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoKGJmZF9zaXplX3R5cGUpIG9mZnNldCA+IHN6Ci0gICAgICB8fCBjb3VudCA+IHN6Ci0gICAgICB8fCBvZmZzZXQgKyBjb3VudCA+IHN6KQotICAgIGdvdG8gYmFkX3ZhbDsKLQotICBzd2l0Y2ggKGFiZmQtPmRpcmVjdGlvbikKLSAgICB7Ci0gICAgY2FzZSByZWFkX2RpcmVjdGlvbjoKLSAgICBjYXNlIG5vX2RpcmVjdGlvbjoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIHdyaXRlX2RpcmVjdGlvbjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBib3RoX2RpcmVjdGlvbjoKLSAgICAgIC8qIEZpbGUgaXMgb3BlbmVkIGZvciB1cGRhdGUuIGBvdXRwdXRfaGFzX2JlZ3VuJyBzb21lIHRpbWUgYWdvIHdoZW4KLQkgICB0aGUgZmlsZSB3YXMgY3JlYXRlZC4gIERvIG5vdCByZWNvbXB1dGUgc2VjdGlvbnMgc2l6ZXMgb3IgYWxpZ25tZW50cwotCSAgIGluIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudC4gICovCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMsCi0JCShhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpKQotICAgIHsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgICAgICAgKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBsb2NhdGlvbiwKLSAgICAgICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCk7Ci0KLURFU0NSSVBUSU9OCi0JUmVhZCBkYXRhIGZyb20gQHZhcntzZWN0aW9ufSBpbiBCRkQgQHZhcnthYmZkfQotCWludG8gbWVtb3J5IHN0YXJ0aW5nIGF0IEB2YXJ7bG9jYXRpb259LiBUaGUgZGF0YSBpcyByZWFkIGF0IGFuCi0Jb2Zmc2V0IG9mIEB2YXJ7b2Zmc2V0fSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgc2VjdGlvbiwKLQlhbmQgaXMgcmVhZCBmb3IgQHZhcntjb3VudH0gYnl0ZXMuCi0KLQlJZiB0aGUgY29udGVudHMgb2YgYSBjb25zdHJ1Y3RvciB3aXRoIHRoZSA8PFNFQ19DT05TVFJVQ1RPUj4+Ci0JZmxhZyBzZXQgYXJlIHJlcXVlc3RlZCBvciBpZiB0aGUgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHRoZQotCTw8U0VDX0hBU19DT05URU5UUz4+IGZsYWcgc2V0LCB0aGVuIHRoZSBAdmFye2xvY2F0aW9ufSBpcyBmaWxsZWQKLQl3aXRoIHplcm9lcy4gSWYgbm8gZXJyb3JzIG9jY3VyLCA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZQotCTw8ZmFsc2U+Pi4KLQotCi0KLSovCi1ib29sZWFuCi1iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3o7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIG1lbXNldCAobG9jYXRpb24sIDAsICh1bnNpZ25lZCkgY291bnQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChvZmZzZXQgPCAwKQotICAgIHsKLSAgICBiYWRfdmFsOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBFdmVuIGlmIHJlbG9jX2RvbmUgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiByZWFkcyB1bnJlbG9jYXRlZAotICAgICBjb250ZW50cywgc28gd2Ugd2FudCB0aGUgcmF3IHNpemUuICAqLwotICBzeiA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBvZmZzZXQgPiBzeiB8fCBjb3VudCA+IHN6IHx8IG9mZnNldCArIGNvdW50ID4gc3opCi0gICAgZ290byBiYWRfdmFsOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIC8qIERvbid0IGJvdGhlci4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0gICAgewotICAgICAgbWVtc2V0IChsb2NhdGlvbiwgMCwgKHVuc2lnbmVkKSBjb3VudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgbWVtY3B5IChsb2NhdGlvbiwgc2VjdGlvbi0+Y29udGVudHMgKyBvZmZzZXQsIChzaXplX3QpIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsCi0JCSAgIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYyk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzZWN9IGluIHRoZSBCRkQKLQlAdmFye2liZmR9IHRvIHRoZSBzZWN0aW9uIEB2YXJ7b3NlY30gaW4gdGhlIEJGRCBAdmFye29iZmR9LgotCVJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgotCXJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b3NlY30uCi0KLS4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSwgXAotLgkJKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikpCi0qLwotCi0vKgotRlVOQ1RJT04KLQlfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLQotU1lOT1BTSVMKLQl2b2lkIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dAotCShzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKnNlY3Rpb24pOwotCi1ERVNDUklQVElPTgotCVJlbW92ZSBAdmFye3NlY3Rpb259IGZyb20gdGhlIG91dHB1dC4gIElmIHRoZSBvdXRwdXQgc2VjdGlvbgotCWJlY29tZXMgZW1wdHksIHJlbW92ZSBpdCBmcm9tIHRoZSBvdXRwdXQgYmZkLiAgQHZhcntpbmZvfSBtYXkKLQliZSBOVUxMOyBpZiBpdCBpcyBub3QsIGl0IGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIG91dHB1dAotCXNlY3Rpb24gaXMgZW1wdHkuCi0qLwotdm9pZAotX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChpbmZvLCBzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGFzZWN0aW9uICoqc3BwLCAqb3M7Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcCwgKnBwOwotICBib29sZWFuIGtlZXBfb3M7Ci0KLSAgLyogRXhjaXNlIHRoZSBpbnB1dCBzZWN0aW9uIGZyb20gdGhlIGxpbmsgb3JkZXIuCi0KLSAgICAgRklYTUU6IEZvciBhbGwgY2FsbHMgdGhhdCBJIGNhbiBzZWUgdG8gdGhpcyBmdW5jdGlvbiwgdGhlIGxpbmsKLSAgICAgb3JkZXJzIGhhdmUgbm90IHlldCBiZWVuIHNldCB1cC4gIFNvIHdoeSBhcmUgd2UgY2hlY2tpbmcgdGhlbT8gLS0KLSAgICAgSWFuICovCi0gIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247Ci0gIGZvciAocCA9IG9zLT5saW5rX29yZGVyX2hlYWQsIHBwID0gTlVMTDsgcCAhPSBOVUxMOyBwcCA9IHAsIHAgPSBwLT5uZXh0KQotICAgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JJiYgcC0+dS5pbmRpcmVjdC5zZWN0aW9uID09IHMpCi0gICAgICB7Ci0JaWYgKHBwKQotCSAgcHAtPm5leHQgPSBwLT5uZXh0OwotCWVsc2UKLQkgIG9zLT5saW5rX29yZGVyX2hlYWQgPSBwLT5uZXh0OwotCWlmICghcC0+bmV4dCkKLQkgIG9zLT5saW5rX29yZGVyX3RhaWwgPSBwcDsKLQlicmVhazsKLSAgICAgIH0KLQotICBrZWVwX29zID0gb3MtPmxpbmtfb3JkZXJfaGVhZCAhPSBOVUxMOwotCi0gIGlmICghIGtlZXBfb3MgJiYgaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZCAqYWJmZDsKLSAgICAgIGZvciAoYWJmZCA9IGluZm8tPmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLQl7Ci0JICBhc2VjdGlvbiAqaXM7Ci0JICBmb3IgKGlzID0gYWJmZC0+c2VjdGlvbnM7IGlzICE9IE5VTEw7IGlzID0gaXMtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoaXMgIT0gcyAmJiBpcy0+b3V0cHV0X3NlY3Rpb24gPT0gb3MpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoaXMgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgaWYgKGFiZmQgIT0gTlVMTCkKLQlrZWVwX29zID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG91dHB1dCBzZWN0aW9uIGlzIGVtcHR5LCByZW1vdmUgaXQgdG9vLiAgQ2FyZWZ1bCBhYm91dCBzZWN0aW9ucwotICAgICB0aGF0IGhhdmUgYmVlbiBkaXNjYXJkZWQgaW4gdGhlIGxpbmsgc2NyaXB0IC0tIHRoZXkgYXJlIG1hcHBlZCB0byAKLSAgICAgYmZkX2Fic19zZWN0aW9uLCB3aGljaCBoYXMgbm8gb3duZXIuICAqLwotICBpZiAoIWtlZXBfb3MgJiYgb3MtPm93bmVyICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChzcHAgPSAmb3MtPm93bmVyLT5zZWN0aW9uczsgKnNwcDsgc3BwID0gJigqc3BwKS0+bmV4dCkKLQlpZiAoKnNwcCA9PSBvcykKLQkgIHsKLQkgICAgKnNwcCA9IG9zLT5uZXh0OwotCSAgICBvcy0+b3duZXItPnNlY3Rpb25fY291bnQtLTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmZkL3NvbS5jIGIvYmZkL3NvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDYxY2M2Li4wMDAwMDAwCi0tLSBhL2JmZC9zb20uYworKysgL2Rldi9udWxsCkBAIC0xLDYzMjQgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciBIUCBQQS1SSVNDIFNPTSBvYmplY3RzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpIHx8IGRlZmluZWQoSE9TVF9IUFBBTVBFSVgpCi0KLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJzb20uaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBNYWdpYyBub3QgZGVmaW5lZCBpbiBzdGFuZGFyZCBIUC1VWCBoZWFkZXIgZmlsZXMgdW50aWwgOC4wICovCi0KLSNpZm5kZWYgQ1BVX1BBX1JJU0MxXzAKLSNkZWZpbmUgQ1BVX1BBX1JJU0MxXzAgMHgyMEIKLSNlbmRpZiAvKiBDUFVfUEFfUklTQzFfMCAqLwotCi0jaWZuZGVmIENQVV9QQV9SSVNDMV8xCi0jZGVmaW5lIENQVV9QQV9SSVNDMV8xIDB4MjEwCi0jZW5kaWYgLyogQ1BVX1BBX1JJU0MxXzEgKi8KLQotI2lmbmRlZiBDUFVfUEFfUklTQzJfMAotI2RlZmluZSBDUFVfUEFfUklTQzJfMCAweDIxNAotI2VuZGlmIC8qIENQVV9QQV9SSVNDMl8wICovCi0KLSNpZm5kZWYgX1BBX1JJU0MxXzBfSUQKLSNkZWZpbmUgX1BBX1JJU0MxXzBfSUQgQ1BVX1BBX1JJU0MxXzAKLSNlbmRpZiAvKiBfUEFfUklTQzFfMF9JRCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDMV8xX0lECi0jZGVmaW5lIF9QQV9SSVNDMV8xX0lEIENQVV9QQV9SSVNDMV8xCi0jZW5kaWYgLyogX1BBX1JJU0MxXzFfSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQzJfMF9JRAotI2RlZmluZSBfUEFfUklTQzJfMF9JRCBDUFVfUEFfUklTQzJfMAotI2VuZGlmIC8qIF9QQV9SSVNDMl8wX0lEICovCi0KLSNpZm5kZWYgX1BBX1JJU0NfTUFYSUQKLSNkZWZpbmUgX1BBX1JJU0NfTUFYSUQJMHgyRkYKLSNlbmRpZiAvKiBfUEFfUklTQ19NQVhJRCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDX0lECi0jZGVmaW5lIF9QQV9SSVNDX0lEKF9fbV9udW0pCQlcCi0gICAgKCgoX19tX251bSkgPT0gX1BBX1JJU0MxXzBfSUQpIHx8CVwKLSAgICAgKChfX21fbnVtKSA+PSBfUEFfUklTQzFfMV9JRCAmJiAoX19tX251bSkgPD0gX1BBX1JJU0NfTUFYSUQpKQotI2VuZGlmIC8qIF9QQV9SSVNDX0lEICovCi0KLQotLyogSElVWCBpbiBpdCdzIGluZmluaXRlIHN0dXBpZGl0eSBjaGFuZ2VkIHRoZSBuYW1lcyBmb3Igc2V2ZXJhbCAid2VsbAotICAga25vd24iIGNvbnN0YW50cy4gIFdvcmsgYXJvdW5kIHN1Y2ggYnJhaW5kYW1hZ2UuICBUcnkgdGhlIEhQVVggdmVyc2lvbgotICAgZmlyc3QsIHRoZW4gdGhlIEhJVVggdmVyc2lvbiwgYW5kIGZpbmFsbHkgcHJvdmlkZSBhIGRlZmF1bHQuICAqLwotI2lmZGVmIEhQVVhfQVVYX0lECi0jZGVmaW5lIEVYRUNfQVVYX0lEIEhQVVhfQVVYX0lECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChFWEVDX0FVWF9JRCkgJiYgZGVmaW5lZCAoSElVWF9BVVhfSUQpCi0jZGVmaW5lIEVYRUNfQVVYX0lEIEhJVVhfQVVYX0lECi0jZW5kaWYKLQotI2lmbmRlZiBFWEVDX0FVWF9JRAotI2RlZmluZSBFWEVDX0FVWF9JRCAwCi0jZW5kaWYKLQotLyogU2l6ZSAoaW4gY2hhcnMpIG9mIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyB1c2VkIGR1cmluZyBmaXh1cCBhbmQgc3RyaW5nCi0gICB0YWJsZSB3cml0ZXMuICAgKi8KLSAgIAotI2RlZmluZSBTT01fVE1QX0JVRlNJWkUgODE5MgotCi0vKiBTaXplIG9mIHRoZSBoYXNoIHRhYmxlIGluIGFyY2hpdmVzLiAgKi8KLSNkZWZpbmUgU09NX0xTVF9IQVNIX1NJWkUgMzEKLQotLyogTWF4IG51bWJlciBvZiBTT01zIHRvIGJlIGZvdW5kIGluIGFuIGFyY2hpdmUuICAqLwotI2RlZmluZSBTT01fTFNUX01PRFVMRV9MSU1JVCAxMDI0Ci0KLS8qIEdlbmVyaWMgYWxpZ25tZW50IG1hY3JvLiAgKi8KLSNkZWZpbmUgU09NX0FMSUdOKHZhbCwgYWxpZ25tZW50KSBcCi0gICgoKHZhbCkgKyAoYWxpZ25tZW50KSAtIDEpICYgfigoYWxpZ25tZW50KSAtIDEpKQotCi0vKiBTT00gYWxsb3dzIGFueSBvbmUgb2YgdGhlIGZvdXIgcHJldmlvdXMgcmVsb2NhdGlvbnMgdG8gYmUgcmV1c2VkCi0gICB3aXRoIGEgIlJfUFJFVl9GSVhVUCIgcmVsb2NhdGlvbiBlbnRyeS4gIFNpbmNlIFJfUFJFVl9GSVhVUAotICAgcmVsb2NhdGlvbnMgYXJlIGFsd2F5cyBhIHNpbmdsZSBieXRlLCB1c2luZyBhIFJfUFJFVl9GSVhVUCBpbnN0ZWFkCi0gICBvZiBzb21lIG11bHRpLWJ5dGUgcmVsb2NhdGlvbiBtYWtlcyBvYmplY3QgZmlsZXMgc21hbGxlci4gCi0KLSAgIE5vdGUgb25lIHNpZGUgZWZmZWN0IG9mIHVzaW5nIGEgUl9QUkVWX0ZJWFVQIGlzIHRoZSByZWxvY2F0aW9uIHRoYXQKLSAgIGlzIGJlaW5nIHJlcGVhdGVkIG1vdmVzIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuICAqLwotc3RydWN0IHJlbG9jX3F1ZXVlCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyICpyZWxvYzsKLSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgfSByZWxvY19xdWV1ZVs0XTsKLQotLyogVGhpcyBmdWxseSBkZXNjcmliZXMgdGhlIHN5bWJvbCB0eXBlcyB3aGljaCBtYXkgYmUgYXR0YWNoZWQgdG8KLSAgIGFuIEVYUE9SVCBvciBJTVBPUlQgZGlyZWN0aXZlLiAgT25seSBTT00gdXNlcyB0aGlzIGZvcm1hdGlvbgotICAgKEVMRiBoYXMgbm8gbmVlZCBmb3IgaXQpLiAgKi8KLXR5cGVkZWYgZW51bQotewotICBTWU1CT0xfVFlQRV9VTktOT1dOLAotICBTWU1CT0xfVFlQRV9BQlNPTFVURSwKLSAgU1lNQk9MX1RZUEVfQ09ERSwKLSAgU1lNQk9MX1RZUEVfREFUQSwKLSAgU1lNQk9MX1RZUEVfRU5UUlksCi0gIFNZTUJPTF9UWVBFX01JTExJQ09ERSwKLSAgU1lNQk9MX1RZUEVfUExBQkVMLAotICBTWU1CT0xfVFlQRV9QUklfUFJPRywKLSAgU1lNQk9MX1RZUEVfU0VDX1BST0csCi19IHBhX3N5bWJvbF90eXBlOwotCi1zdHJ1Y3Qgc2VjdGlvbl90b190eXBlCi17Ci0gIGNoYXIgKnNlY3Rpb247Ci0gIGNoYXIgdHlwZTsKLX07Ci0KLS8qIEFzc29ydGVkIHN5bWJvbCBpbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGRlcml2ZWQgZnJvbSB0aGUgQkZEIHN5bWJvbAotICAgYW5kL29yIHRoZSBCRkQgYmFja2VuZCBwcml2YXRlIHN5bWJvbCBkYXRhLiAgKi8KLXN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbwotewotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3R5cGU7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfc2NvcGU7Ci0gIHVuc2lnbmVkIGludCBhcmdfcmVsb2M7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfaW5mbzsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF92YWx1ZTsKLSAgdW5zaWduZWQgaW50IHByaXZfbGV2ZWw7Ci0gIHVuc2lnbmVkIGludCBzZWNvbmRhcnlfZGVmOwotfTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGJvb2xlYW4gc29tX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3Rfc2V0dXAgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgc3RydWN0IGhlYWRlciAqLAotCQkJCQkJICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzZXR1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGhlYWRlciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzb21fc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLQkJCQkJICAgIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBsb25nIHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc29tX3NldF9yZWxvY19pbmZvIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICAgICBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzeW1ib2wgKiBzb21fbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmludF9zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkgICAgICBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc29tX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCQkJICBiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIHNvbV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgc29tX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCi0JCQkJCQkgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgYXN5bWJvbCAqKiwgYmZkX3ZtYSwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyB2b2lkIHNvbV9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGFzZWN0aW9uICogYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCAKLQkJCQkJc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqKSk7Ci1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGhwcGFfc29tX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJCQkgICAgIGFzeW1ib2wgKiwgUFRSLAotCQkJCQkJICAgICBhc2VjdGlvbiAqLCBiZmQgKiwKLQkJCQkJCSAgICAgY2hhciAqKikpOwotc3RhdGljIHZvaWQgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgUEFSQU1TICgoc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB2b2lkIHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotc3RhdGljIHZvaWQgc29tX3JlbG9jX3F1ZXVlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgcmVsb2NfcXVldWUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50IHNvbV9yZWxvY19xdWV1ZV9maW5kIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogdHJ5X3ByZXZfZml4dXAgUEFSQU1TICgoYmZkICosIGludCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19za2lwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCAqLAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogc29tX3JlbG9jX2FkZGVuZCBQQVJBTVMgKChiZmQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICAgIHVuc2lnbmVkIGludCAqLAotCQkJCQkJIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19jYWxsIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKiwKLQkJCQkJICAgICAgIGFyZWxlbnQgKiwgaW50LAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zdWJzcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9zeW1zIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfc3Vic3BhY2VzIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb21fY29tcHV0ZV9jaGVja3N1bSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3ByZXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzb21fc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5pc2hfd3JpdGluZyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmVwX2Zvcl9maXh1cHMgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV93cml0ZV9maXh1cHMgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywKLQkJCQkJCXVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQkgYXN5bWJvbCAqKiwgdW5zaWduZWQgaW50LAotCQkJCQkJIHVuc2lnbmVkICosCi0JCQkJCQkgQ09NUFVOSVQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JlZ2luX3dyaXRpbmcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBjaGFyIHNvbV9zZWN0aW9uX3R5cGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IHNvbV9kZWNvZGVfc3ltY2xhc3MgUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBsc3RfaGVhZGVyICosCi0JCQkJCQkgc3ltaW5kZXggKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGxzdF9oZWFkZXIgKiwKLQkJCQkJCSAgIGNhcnN5bSAqKnN5bXMpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwKLQkJCQkJdW5zaWduZWQgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50ICosCi0JCQkJCQkgIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHNvbV9iZmRfYXJfc3ltYm9sX2hhc2ggUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgc3RydWN0IGxzdF9oZWFkZXIsCi0JCQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9pc19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21faXNfc3Vic3BhY2UgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2lzX2NvbnRhaW5lciBQQVJBTVMgKChhc2VjdGlvbiAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0JCi0vKiBNYXAgU09NIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgotCi0gICBUaGlzIHRhYmxlIGluY2x1ZGVzIGFsbCB0aGUgc3RhbmRhcmQgc3Vic3BhY2VzIGFzIGRlZmluZWQgaW4gdGhlIAotICAgY3VycmVudCAiUFJPIEFCSSBmb3IgUEEtUklTQyBTeXN0ZW1zIiwgJFVOV0lORCQgd2hpY2ggZm9yIAotICAgc29tZSByZWFzb24gd2FzIGxlZnQgb3V0LCBhbmQgc2VjdGlvbnMgc3BlY2lmaWMgdG8gZW1iZWRkZWQgc3RhYnMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSBzdHRbXSA9IHsKLSAgeyIkVEVYVCQiLCAndCd9LAotICB7IiRTSExJQl9JTkZPJCIsICd0J30sCi0gIHsiJE1JTExJQ09ERSQiLCAndCd9LAotICB7IiRMSVQkIiwgJ3QnfSwKLSAgeyIkQ09ERSQiLCAndCd9LAotICB7IiRVTldJTkRfU1RBUlQkIiwgJ3QnfSwKLSAgeyIkVU5XSU5EJCIsICd0J30sCi0gIHsiJFBSSVZBVEUkIiwgJ2QnfSwKLSAgeyIkUExUJCIsICdkJ30sCi0gIHsiJFNITElCX0RBVEEkIiwgJ2QnfSwKLSAgeyIkREFUQSQiLCAnZCd9LAotICB7IiRTSE9SVERBVEEkIiwgJ2cnfSwKLSAgeyIkRExUJCIsICdkJ30sCi0gIHsiJEdMT0JBTCQiLCAnZyd9LAotICB7IiRTSE9SVEJTUyQiLCAncyd9LAotICB7IiRCU1MkIiwgJ2InfSwKLSAgeyIkR0RCX1NUUklOR1MkIiwgJ04nfSwKLSAgeyIkR0RCX1NZTUJPTFMkIiwgJ04nfSwKLSAgezAsIDB9Ci19OwotCi0vKiBBYm91dCB0aGUgcmVsb2NhdGlvbiBmb3JtYXR0aW5nIHRhYmxlLi4uCi0KLSAgIFRoZXJlIGFyZSAyNTYgZW50cmllcyBpbiB0aGUgdGFibGUsIG9uZSBmb3IgZWFjaCBwb3NzaWJsZQotICAgcmVsb2NhdGlvbiBvcGNvZGUgYXZhaWxhYmxlIGluIFNPTS4gIFdlIGluZGV4IHRoZSB0YWJsZSBieQotICAgdGhlIHJlbG9jYXRpb24gb3Bjb2RlLiAgVGhlIG5hbWVzIGFuZCBvcGVyYXRpb25zIGFyZSB0aG9zZQotICAgZGVmaW5lZCBieSBhLm91dF84MDAgKDQpLgotCi0gICBSaWdodCBub3cgdGhpcyB0YWJsZSBpcyBvbmx5IHVzZWQgdG8gY291bnQgYW5kIHBlcmZvcm0gbWluaW1hbAotICAgcHJvY2Vzc2luZyBvbiByZWxvY2F0aW9uIHN0cmVhbXMgc28gdGhhdCB0aGV5IGNhbiBiZSBpbnRlcm5hbGl6ZWQKLSAgIGludG8gQkZEIGFuZCBzeW1ib2xpY2FsbHkgcHJpbnRlZCBieSB1dGlsaXRpZXMuICBUbyBtYWtlIGFjdHVhbCB1c2UgCi0gICBvZiB0aGVtIHdvdWxkIGJlIG11Y2ggbW9yZSBkaWZmaWN1bHQsIEJGRCdzIGNvbmNlcHQgb2YgcmVsb2NhdGlvbnMKLSAgIGlzIGZhciB0b28gc2ltcGxlIHRvIGhhbmRsZSBTT00gcmVsb2NhdGlvbnMuICBUaGUgYmFzaWMgYXNzdW1wdGlvbgotICAgdGhhdCBhIHJlbG9jYXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgcHJvY2Vzc2VkIGluZGVwZW5kZW50IG9mIG90aGVyCi0gICByZWxvY2F0aW9ucyBiZWZvcmUgYW4gb2JqZWN0IGZpbGUgaXMgd3JpdHRlbiBpcyBpbnZhbGlkIGZvciBTT00uCi0KLSAgIFRoZSBTT00gcmVsb2NhdGlvbnMgYXJlIG1lYW50IHRvIGJlIHByb2Nlc3NlZCBhcyBhIHN0cmVhbSwgdGhleQotICAgc3BlY2lmeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24KLSAgIHdoaWxlIHBvc3NpYmx5IG1vZGlmeWluZyB0aGUgZGF0YSBpbiBzb21lIG1hbm5lci4gIFRoZXkgYWxzbyBjYW4gCi0gICBzcGVjaWZ5IHRoYXQgYSB2YXJpYWJsZSBudW1iZXIgb2YgemVyb3Mgb3IgdW5pbml0aWFsaXplZCBkYXRhIGJlCi0gICBpbnNlcnRlZCBvbiBpbiB0aGUgb3V0cHV0IHNlZ21lbnQgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0LiAgU29tZQotICAgcmVsb2NhdGlvbnMgc3BlY2lmeSB0aGF0IHNvbWUgcHJldmlvdXMgcmVsb2NhdGlvbiBiZSByZS1hcHBsaWVkIGF0Ci0gICB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaW5wdXQvb3V0cHV0IHNlY3Rpb25zLiAgQW5kIGZpbmFsbHkgYSBudW1iZXIKLSAgIG9mIHJlbG9jYXRpb25zIGhhdmUgZWZmZWN0cyBvbiBvdGhlciBzZWN0aW9ucyAoUl9FTlRSWSwgUl9FWElULAotICAgUl9VTldJTkRfQVVYIGFuZCBhIHZhcmlldHkgb2Ygb3RoZXJzKS4gIFRoZXJlIGlzbid0IGV2ZW4gZW5vdWdoIHJvb20KLSAgIGluIHRoZSBCRkQgcmVsb2NhdGlvbiBkYXRhIHN0cnVjdHVyZSB0byBzdG9yZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8KLSAgIHBlcmZvcm0gYWxsIHRoZSByZWxvY2F0aW9ucy4KLQotICAgRWFjaCBlbnRyeSBpbiB0aGUgdGFibGUgaGFzIHRocmVlIGZpZWxkcy4gCi0KLSAgIFRoZSBmaXJzdCBlbnRyeSBpcyBhbiBpbmRleCBpbnRvIHRoaXMgImNsYXNzIiBvZiByZWxvY2F0aW9ucy4gIFRoaXMKLSAgIGluZGV4IGNhbiB0aGVuIGJlIHVzZWQgYXMgYSB2YXJpYWJsZSB3aXRoaW4gdGhlIHJlbG9jYXRpb24gaXRzZWxmLgotCi0gICBUaGUgc2Vjb25kIGZpZWxkIGlzIGEgZm9ybWF0IHN0cmluZyB3aGljaCBhY3R1YWxseSBjb250cm9scyBwcm9jZXNzaW5nCi0gICBvZiB0aGUgcmVsb2NhdGlvbi4gIEl0IHVzZXMgYSBzaW1wbGUgcG9zdGZpeCBtYWNoaW5lIHRvIGRvIGNhbGN1bGF0aW9ucwotICAgYmFzZWQgb24gdmFyaWFibGVzL2NvbnN0YW50cyBmb3VuZCBpbiB0aGUgc3RyaW5nIGFuZCB0aGUgcmVsb2NhdGlvbgotICAgc3RyZWFtLiAgCi0KLSAgIFRoZSB0aGlyZCBmaWVsZCBzcGVjaWZ5cyB3aGV0aGVyIG9yIG5vdCB0aGlzIHJlbG9jYXRpb24gbWF5IHVzZSAKLSAgIGEgY29uc3RhbnQgKFYpIGZyb20gdGhlIHByZXZpb3VzIFJfREFUQV9PVkVSUklERSByYXRoZXIgdGhhbiBhIGNvbnN0YW50Ci0gICBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgotCi0gICBWYXJpYWJsZXM6ICAKLSAgCi0gICBMID0gaW5wdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgRCA9IGluZGV4IGludG8gY2xhc3Mgb2YgcmVsb2NhdGlvbnMKLSAgIE0gPSBvdXRwdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgTiA9IHN0YXRlbWVudCBudW1iZXIgKHVudXNlZD8pCi0gICBPID0gc3RhY2sgb3BlcmF0aW9uCi0gICBSID0gcGFyYW1ldGVyIHJlbG9jYXRpb24gYml0cwotICAgUyA9IHN5bWJvbCBpbmRleAotICAgVCA9IGZpcnN0IDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBVID0gc2Vjb25kIDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBWID0gYSBsaXRlcmFsIGNvbnN0YW50ICh1c3VhbGx5IHVzZWQgaW4gdGhlIG5leHQgcmVsb2NhdGlvbikKLSAgIFAgPSBhIHByZXZpb3VzIHJlbG9jYXRpb24KLSAgCi0gICBMb3dlciBjYXNlIGxldHRlcnMgKHN0YXJ0aW5nIHdpdGggJ2InKSByZWZlciB0byBmb2xsb3dpbmcgCi0gICBieXRlcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0uICAnYicgaXMgdGhlIG5leHQgMSBieXRlLAotICAgYyBpcyB0aGUgbmV4dCAyIGJ5dGVzLCBkIGlzIHRoZSBuZXh0IDMgYnl0ZXMsIGV0Yy4uLiAgCi0gICBUaGlzIGlzIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgdGhhdAotICAgbWFrZXMgb3VyIGxpZmUgYSBsaXZpbmcgaGVsbC4KLQotICAgbnVtZXJpY2FsIGNvbnN0YW50cyBhcmUgYWxzbyB1c2VkIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgTm90ZQotICAgdGhlIGNvbnN0YW50cyBhcmUgcmVwcmVzZW50ZWQgaW4gZGVjaW1hbC4gCi0KLSAgICcrJywgIioiIGFuZCAiPSIgcmVwcmVzZW50cyB0aGUgb2J2aW91cyBwb3N0Zml4IG9wZXJhdG9ycy4KLSAgICc8JyByZXByZXNlbnRzIGEgbGVmdCBzaGlmdC4gCi0KLSAgIFN0YWNrIE9wZXJhdGlvbnM6Ci0KLSAgIFBhcmFtZXRlciBSZWxvY2F0aW9uIEJpdHM6Ci0KLSAgIFVud2luZCBFbnRyaWVzOiAgCi0gICAKLSAgIFByZXZpb3VzIFJlbG9jYXRpb25zOiAgVGhlIGluZGV4IGZpZWxkIHJlcHJlc2VudHMgd2hpY2ggaW4gdGhlIHF1ZXVlCi0gICBvZiA0IHByZXZpb3VzIGZpeHVwcyBzaG91bGQgYmUgcmUtYXBwbGllZC4KLQotICAgTGl0ZXJhbCBDb25zdGFudHM6ICBUaGVzZSBhcmUgZ2VuZXJhbGx5IHVzZWQgdG8gcmVwcmVzZW50IGFkZGVuZAotICAgcGFydHMgb2YgcmVsb2NhdGlvbnMgd2hlbiB0aGVzZSBjb25zdGFudHMgYXJlIG5vdCBzdG9yZWQgaW4gdGhlCi0gICBmaWVsZHMgb2YgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUgdGhlIGluc3RydWN0aW9uCi0gICBhZGRpbCBmb28tJGdsb2JhbCQtMHgxMjM0IHdvdWxkIHVzZSBhbiBvdmVycmlkZSBmb3IgIjB4MTIzNCIgcmF0aGVyCi0gICB0aGFuIHN0b3JpbmcgaXQgaW50byB0aGUgYWRkaWwgaXRzZWxmLiAgKi8KLQotc3RydWN0IGZpeHVwX2Zvcm1hdAotewotICBpbnQgRDsKLSAgY2hhciAqZm9ybWF0OwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaXh1cF9mb3JtYXQgc29tX2ZpeHVwX2Zvcm1hdHNbMjU2XSA9Ci17Ci0gIC8qIFJfTk9fUkVMT0NBVElPTiAqLwotICAwLCAgICJMRDErNCo9IiwgICAgICAgLyogMHgwMCAqLwotICAxLCAgICJMRDErNCo9IiwJLyogMHgwMSAqLwotICAyLCAgICJMRDErNCo9IiwJLyogMHgwMiAqLwotICAzLCAgICJMRDErNCo9IiwJLyogMHgwMyAqLwotICA0LCAgICJMRDErNCo9IiwJLyogMHgwNCAqLwotICA1LCAgICJMRDErNCo9IiwJLyogMHgwNSAqLwotICA2LCAgICJMRDErNCo9IiwJLyogMHgwNiAqLwotICA3LCAgICJMRDErNCo9IiwJLyogMHgwNyAqLwotICA4LCAgICJMRDErNCo9IiwJLyogMHgwOCAqLwotICA5LCAgICJMRDErNCo9IiwJLyogMHgwOSAqLwotICAxMCwgICJMRDErNCo9IiwJLyogMHgwYSAqLwotICAxMSwgICJMRDErNCo9IiwJLyogMHgwYiAqLwotICAxMiwgICJMRDErNCo9IiwJLyogMHgwYyAqLwotICAxMywgICJMRDErNCo9IiwJLyogMHgwZCAqLwotICAxNCwgICJMRDErNCo9IiwJLyogMHgwZSAqLwotICAxNSwgICJMRDErNCo9IiwJLyogMHgwZiAqLwotICAxNiwgICJMRDErNCo9IiwJLyogMHgxMCAqLwotICAxNywgICJMRDErNCo9IiwJLyogMHgxMSAqLwotICAxOCwgICJMRDErNCo9IiwJLyogMHgxMiAqLwotICAxOSwgICJMRDErNCo9IiwJLyogMHgxMyAqLwotICAyMCwgICJMRDErNCo9IiwJLyogMHgxNCAqLwotICAyMSwgICJMRDErNCo9IiwJLyogMHgxNSAqLwotICAyMiwgICJMRDErNCo9IiwJLyogMHgxNiAqLwotICAyMywgICJMRDErNCo9IiwJLyogMHgxNyAqLwotICAwLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MTggKi8KLSAgMSwgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDE5ICovCi0gIDIsICAgIkxEODxiKzErNCo9IiwJLyogMHgxYSAqLwotICAzLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MWIgKi8KLSAgMCwgICAiTEQxNjxjKzErNCo9IiwJLyogMHgxYyAqLwotICAxLCAgICJMRDE2PGMrMSs0Kj0iLAkvKiAweDFkICovCi0gIDIsICAgIkxEMTY8YysxKzQqPSIsCS8qIDB4MWUgKi8KLSAgMCwgICAiTGQxKz0iLCAgICAgICAgIC8qIDB4MWYgKi8KLSAgLyogUl9aRVJPRVMgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIwICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjEgKi8KLSAgLyogUl9VTklOSVQgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIyICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjMgKi8KLSAgLyogUl9SRUxPQ0FUSU9OICovCi0gIDAsICAgICJMND0iLCAgICAgICAgICAvKiAweDI0ICovCi0gIC8qIFJfREFUQV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TYj0iLAkvKiAweDI1ICovCi0gIDEsICAgICJMND1TZD0iLAkvKiAweDI2ICovCi0gIC8qIFJfREFUQV9QTEVCRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4MjcgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4MjggKi8KLSAgLyogUl9TUEFDRV9SRUYgKi8KLSAgMCwgICAgIkw0PSIsICAgICAgICAgIC8qIDB4MjkgKi8KLSAgLyogUl9SRVBFQVRFRF9JTklUICovCi0gIDAsICAgICJMND1NYjErNCo9IiwJLyogMHgyYSAqLwotICAxLCAgICAiTGI0Kj1NYjErTCo9IiwJLyogMHgyYiAqLwotICAyLCAgICAiTGI0Kj1NZDErNCo9IiwJLyogMHgyYyAqLwotICAzLCAgICAiTGQxKz1NZTErPSIsCS8qIDB4MmQgKi8KLSAgMCwgICAJIiIsCSAgICAgICAgLyogMHgyZSAqLwotICAwLCAgIAkiIiwJICAgICAgICAvKiAweDJmICovCi0gIC8qIFJfUENSRUxfQ0FMTCAqLwotICAwLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMCAqLwotICAxLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMSAqLwotICAyLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMiAqLwotICAzLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMyAqLwotICA0LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNCAqLwotICA1LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNSAqLwotICA2LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNiAqLwotICA3LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNyAqLwotICA4LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOCAqLwotICA5LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOSAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYSAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYiAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzYyAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzZCAqLwotICAvKiBSX1NIT1JUX1BDUkVMX01PREUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHgzZSAqLwotICAvKiBSX0xPTkdfUENSRUxfTU9ERSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDNmICovCi0gIC8qIFJfQUJTX0NBTEwgKi8KLSAgMCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDAgKi8KLSAgMSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDEgKi8KLSAgMiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDIgKi8KLSAgMywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDMgKi8KLSAgNCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDQgKi8KLSAgNSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDUgKi8KLSAgNiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDYgKi8KLSAgNywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDcgKi8KLSAgOCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDggKi8KLSAgOSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDkgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGEgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGIgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGMgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGQgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZSAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZiAqLwotICAvKiBSX0RQX1JFTEFUSVZFICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDUwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDUxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDUyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDUzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDU0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDU1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDU2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDU3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDU4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDU5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDVhICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDViICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDVjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDVkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDVlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDVmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDYwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDYxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDYyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDYzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDY0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDY1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDY2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDY3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDY4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDY5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDZhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDZiICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDZjICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDZkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDZlICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDZmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweDcwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweDcxICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3MiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDczICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3NSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDc2ICovCi0gIDAsICAgICIiLCAgICAgIAkvKiAweDc3ICovCi0gIC8qIFJfRExUX1JFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHg3OCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHg3OSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLCAgICAgICAgCS8qIDB4N2EgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3YiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2QgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3ZSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdmICovCi0gIC8qIFJfQ09ERV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDgwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDgxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDgyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDgzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDg0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDg1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDg2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDg3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDg4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDg5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDhxICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDhiICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDhjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDhkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDhlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDhmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDkwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDkxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDkyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDkzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDk0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDk1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDk2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDk3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDk4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDk5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDlhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDliICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDljICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDlkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDllICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDlmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweGEwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweGExICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhMiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGEzICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhNSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE2ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTcgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhOCAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE5ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWEgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhYiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGFjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWQgKi8KLSAgLyogUl9NSUxMSV9SRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4YWUgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4YWYgKi8KLSAgLyogUl9DT0RFX1BMQUJFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHhiMCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHhiMSAqLwotICAvKiBSX0JSRUFLUE9JTlQgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhiMiAqLwotICAvKiBSX0VOVFJZICovCi0gIDAsICAgICJUZT1VZT0iLCAgICAgICAvKiAweGIzICovCi0gIDEsICAgICJVZj0iLAkgICAgICAgIC8qIDB4YjQgKi8KLSAgLyogUl9BTFRfRU5UUlkgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiNSAqLwotICAvKiBSX0VYSVQgKi8KLSAgMCwgICAgIiIsCQkvKiAweGI2ICovCi0gIC8qIFJfQkVHSU5fVFJZICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YjcgKi8KLSAgLyogUl9FTkRfVFJZICovCi0gIDAsICAgICJSMD0iLAkgICAgICAgIC8qIDB4YjggKi8KLSAgMSwgICAgIlJiNCo9IiwJLyogMHhiOSAqLwotICAyLCAgICAiUmQ0Kj0iLAkvKiAweGJhICovCi0gIC8qIFJfQkVHSU5fQlJUQUIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiYiAqLwotICAvKiBSX0VORF9CUlRBQiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGJjICovCi0gIC8qIFJfU1RBVEVNRU5UICovCi0gIDAsICAgICJOYj0iLAkgICAgICAgIC8qIDB4YmQgKi8KLSAgMSwgICAgIk5jPSIsCSAgICAgICAgLyogMHhiZSAqLwotICAyLCAgICAiTmQ9IiwJICAgICAgICAvKiAweGJmICovCi0gIC8qIFJfREFUQV9FWFBSICovCi0gIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YzAgKi8KLSAgLyogUl9DT0RFX0VYUFIgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhjMSAqLwotICAvKiBSX0ZTRUwgKi8KLSAgMCwgICAgIiIsCQkvKiAweGMyICovCi0gIC8qIFJfTFNFTCAqLwotICAwLCAgICAiIiwJCS8qIDB4YzMgKi8KLSAgLyogUl9SU0VMICovCi0gIDAsICAgICIiLAkJLyogMHhjNCAqLwotICAvKiBSX05fTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzUgKi8KLSAgLyogUl9TX01PREUgKi8KLSAgMCwgICAgIiIsCQkvKiAweGM2ICovCi0gIC8qIFJfRF9NT0RFICovCi0gIDAsICAgICIiLAkJLyogMHhjNyAqLwotICAvKiBSX1JfTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzggKi8KLSAgLyogUl9EQVRBX09WRVJSSURFICovCi0gIDAsICAgICJWMD0iLAkgICAgICAgIC8qIDB4YzkgKi8KLSAgMSwgICAgIlZiPSIsCSAgICAgICAgLyogMHhjYSAqLwotICAyLCAgICAiVmM9IiwJICAgICAgICAvKiAweGNiICovCi0gIDMsICAgICJWZD0iLAkgICAgICAgIC8qIDB4Y2MgKi8KLSAgNCwgICAgIlZlPSIsCSAgICAgICAgLyogMHhjZCAqLwotICAvKiBSX1RSQU5TTEFURUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhjZSAqLwotICAvKiBSX0FVWF9VTldJTkQgKi8KLSAgMCwgICAgIlNkPVZmPUVmPSIsICAgIC8qIDB4Y2YgKi8KLSAgLyogUl9DT01QMSAqLwotICAwLCAgICAiT2I9IiwJICAgICAgICAvKiAweGQwICovCi0gIC8qIFJfQ09NUDIgKi8KLSAgMCwgICAgIk9iPVNkPSIsCS8qIDB4ZDEgKi8KLSAgLyogUl9DT01QMyAqLwotICAwLCAgICAiT2I9VmU9IiwJLyogMHhkMiAqLwotICAvKiBSX1BSRVZfRklYVVAgKi8KLSAgMCwgICAgIlAiLCAgIAkgICAgICAgIC8qIDB4ZDMgKi8KLSAgMSwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDQgKi8KLSAgMiwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDUgKi8KLSAgMywgICAgIlAiLAkgICAgICAgIC8qIDB4ZDYgKi8KLSAgLyogUl9TRUNfU1RNVCAqLwotICAwLAkiIiwJCS8qIDB4ZDcgKi8KLSAgLyogUl9OMFNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDggKi8KLSAgLyogUl9OMVNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDkgKi8KLSAgLyogUl9MSU5FVEFCICovCi0gIDAsCSJFYj1TZD1WZT0iLAkvKiAweGRhICovCi0gIC8qIFJfTElORVRBQl9FU0MgKi8KLSAgMCwJIkViPU1iPSIsCS8qIDB4ZGIgKi8KLSAgLyogUl9MVFBfT1ZFUlJJREUgKi8KLSAgMCwJIiIsCQkvKiAweGRjICovCi0gIC8qIFJfQ09NTUVOVCAqLwotICAwLCAgICAiT2I9VmU9IiwJLyogMHhkZCAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsCSIiLAkJLyogMHhkZSAqLwotICAwLAkiIiwJCS8qIDB4ZGYgKi8KLSAgMCwJIiIsCQkvKiAweGUwICovCi0gIDAsCSIiLAkJLyogMHhlMSAqLwotICAwLAkiIiwJCS8qIDB4ZTIgKi8KLSAgMCwJIiIsCQkvKiAweGUzICovCi0gIDAsCSIiLAkJLyogMHhlNCAqLwotICAwLAkiIiwJCS8qIDB4ZTUgKi8KLSAgMCwJIiIsCQkvKiAweGU2ICovCi0gIDAsCSIiLAkJLyogMHhlNyAqLwotICAwLAkiIiwJCS8qIDB4ZTggKi8KLSAgMCwJIiIsCQkvKiAweGU5ICovCi0gIDAsCSIiLAkJLyogMHhlYSAqLwotICAwLAkiIiwJCS8qIDB4ZWIgKi8KLSAgMCwJIiIsCQkvKiAweGVjICovCi0gIDAsCSIiLAkJLyogMHhlZCAqLwotICAwLAkiIiwJCS8qIDB4ZWUgKi8KLSAgMCwJIiIsCQkvKiAweGVmICovCi0gIDAsCSIiLAkJLyogMHhmMCAqLwotICAwLAkiIiwJCS8qIDB4ZjEgKi8KLSAgMCwJIiIsCQkvKiAweGYyICovCi0gIDAsCSIiLAkJLyogMHhmMyAqLwotICAwLAkiIiwJCS8qIDB4ZjQgKi8KLSAgMCwJIiIsCQkvKiAweGY1ICovCi0gIDAsCSIiLAkJLyogMHhmNiAqLwotICAwLAkiIiwJCS8qIDB4ZjcgKi8KLSAgMCwJIiIsCQkvKiAweGY4ICovCi0gIDAsCSIiLAkJLyogMHhmOSAqLwotICAwLAkiIiwJCS8qIDB4ZmEgKi8KLSAgMCwJIiIsCQkvKiAweGZiICovCi0gIDAsCSIiLAkJLyogMHhmYyAqLwotICAwLAkiIiwJCS8qIDB4ZmQgKi8KLSAgMCwJIiIsCQkvKiAweGZlICovCi0gIDAsCSIiLAkJLyogMHhmZiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMV9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDQwLAotICAweDQxLAotICAweDQyLAotICAweDQzLAotICAweDQ0LAotICAweDQ1LAotICAweDQ2LAotICAweDQ3LAotICAweDQ4LAotICAweDQ5LAotICAweDRhLAotICAweDRiLAotICAweDYwLAotICAweDgwLAotICAweGEwLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMl9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDgwLAotICAweDgyLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wM19vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDAyLAotICAtMQotfTsKLQotLyogVGhlc2UgYXBwYXJlbnRseSBhcmUgbm90IGluIG9sZGVyIHZlcnNpb25zIG9mIGhwdXggcmVsb2MuaCAoaHB1eDcpLiAgKi8KLSNpZm5kZWYgUl9ETFRfUkVMCi0jZGVmaW5lIFJfRExUX1JFTCAweDc4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0FVWF9VTldJTkQKLSNkZWZpbmUgUl9BVVhfVU5XSU5EIDB4Y2YKLSNlbmRpZgotCi0jaWZuZGVmIFJfU0VDX1NUTVQKLSNkZWZpbmUgUl9TRUNfU1RNVCAweGQ3Ci0jZW5kaWYKLQotLyogQW5kIHRoZXNlIGZpcnN0IGFwcGVhcmVkIGluIGhwdXgxMC4gICovCi0jaWZuZGVmIFJfU0hPUlRfUENSRUxfTU9ERQotI2RlZmluZSBOT19QQ1JFTF9NT0RFUwotI2RlZmluZSBSX1NIT1JUX1BDUkVMX01PREUgMHgzZQotI2VuZGlmCi0KLSNpZm5kZWYgUl9MT05HX1BDUkVMX01PREUKLSNkZWZpbmUgUl9MT05HX1BDUkVMX01PREUgMHgzZgotI2VuZGlmCi0KLSNpZm5kZWYgUl9OMFNFTAotI2RlZmluZSBSX04wU0VMIDB4ZDgKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjFTRUwKLSNkZWZpbmUgUl9OMVNFTCAweGQ5Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0xJTkVUQUIKLSNkZWZpbmUgUl9MSU5FVEFCIDB4ZGEKLSNlbmRpZgotCi0jaWZuZGVmIFJfTElORVRBQl9FU0MKLSNkZWZpbmUgUl9MSU5FVEFCX0VTQyAweGRiCi0jZW5kaWYKLQotI2lmbmRlZiBSX0xUUF9PVkVSUklERQotI2RlZmluZSBSX0xUUF9PVkVSUklERSAweGRjCi0jZW5kaWYKLQotI2lmbmRlZiBSX0NPTU1FTlQKLSNkZWZpbmUgUl9DT01NRU5UIDB4ZGQKLSNlbmRpZgotCi0jZGVmaW5lIFNPTV9IT1dUTyhUWVBFLCBOQU1FKQlcCi0gIEhPV1RPKFRZUEUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsIE5BTUUsIGZhbHNlLCAwLCAwLCBmYWxzZSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc29tX2hwcGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAotICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAotICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAotICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAotICB7Ul9SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRUxPQ0FUSU9OIn0sCi0gIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCi0gIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCi0gIHtSX0RBVEFfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX1BMQUJFTCJ9LAotICB7Ul9EQVRBX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9QTEFCRUwifSwKLSAge1JfU1BBQ0VfUkVGLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TUEFDRV9SRUYifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfU0hPUlRfUENSRUxfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0hPUlRfUENSRUxfTU9ERSJ9LAotICB7Ul9MT05HX1BDUkVMX01PREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xPTkdfUENSRUxfTU9ERSJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX0RMVF9SRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RMVF9SRUwifSwKLSAge1JfRExUX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRExUX1JFTCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCi0gIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCi0gIHtSX0NPREVfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX1BMQUJFTCJ9LAotICB7Ul9DT0RFX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9QTEFCRUwifSwKLSAge1JfQlJFQUtQT0lOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQlJFQUtQT0lOVCJ9LAotICB7Ul9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5UUlkifSwKLSAge1JfRU5UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VOVFJZIn0sCi0gIHtSX0FMVF9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUxUX0VOVFJZIn0sCi0gIHtSX0VYSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VYSVQifSwKLSAge1JfQkVHSU5fVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9CRUdJTl9UUlkifSwKLSAge1JfRU5EX1RSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX1RSWSJ9LAotICB7Ul9FTkRfVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfVFJZIn0sCi0gIHtSX0VORF9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VORF9UUlkifSwKLSAge1JfQkVHSU5fQlJUQUIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0JFR0lOX0JSVEFCIn0sCi0gIHtSX0VORF9CUlRBQiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX0JSVEFCIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCi0gIHtSX0RBVEFfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9FWFBSIn0sCi0gIHtSX0NPREVfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9FWFBSIn0sCi0gIHtSX0ZTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0ZTRUwifSwKLSAge1JfTFNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTFNFTCJ9LAotICB7Ul9SU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SU0VMIn0sCi0gIHtSX05fTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTl9NT0RFIn0sCi0gIHtSX1NfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU19NT0RFIn0sCi0gIHtSX0RfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRF9NT0RFIn0sCi0gIHtSX1JfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUl9NT0RFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9UUkFOU0xBVEVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9UUkFOU0xBVEVEIn0sCi0gIHtSX0FVWF9VTldJTkQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FVWF9VTldJTkQifSwKLSAge1JfQ09NUDEsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTVAxIn0sCi0gIHtSX0NPTVAyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01QMiJ9LAotICB7Ul9DT01QMywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09NUDMifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1BSRVZfRklYVVAsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BSRVZfRklYVVAifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9TRUNfU1RNVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0VDX1NUTVQifSwKLSAge1JfTjBTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX04wU0VMIn0sCi0gIHtSX04xU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OMVNFTCJ9LAotICB7Ul9MSU5FVEFCLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCIn0sCi0gIHtSX0xJTkVUQUJfRVNDLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCX0VTQyJ9LAotICB7Ul9MVFBfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xUUF9PVkVSUklERSJ9LAotICB7Ul9DT01NRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01NRU5UIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9fTsKLSAgCi0vKiBJbml0aWFsaXplIHRoZSBTT00gcmVsb2NhdGlvbiBxdWV1ZS4gIEJ5IGRlZmluaXRpb24gdGhlIHF1ZXVlIGhvbGRzCi0gICB0aGUgbGFzdCBmb3VyIG11bHRpYnl0ZSBmaXh1cHMuICAqLwotICAKLXN0YXRpYyB2b2lkCi1zb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSAocXVldWUpCi0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIHF1ZXVlWzBdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMF0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzFdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMV0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzJdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbMl0uc2l6ZSA9IDA7Ci0gIHF1ZXVlWzNdLnJlbG9jID0gTlVMTDsKLSAgcXVldWVbM10uc2l6ZSA9IDA7Ci19Ci0KLS8qIEluc2VydCBhIG5ldyByZWxvY2F0aW9uIGludG8gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3JlbG9jX3F1ZXVlX2luc2VydCAocCwgc2l6ZSwgcXVldWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOwotICBxdWV1ZVszXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgcXVldWVbMl0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gIHF1ZXVlWzFdLnJlbG9jID0gcXVldWVbMF0ucmVsb2M7Ci0gIHF1ZXVlWzFdLnNpemUgPSBxdWV1ZVswXS5zaXplOwotICBxdWV1ZVswXS5yZWxvYyA9IHA7Ci0gIHF1ZXVlWzBdLnNpemUgPSBzaXplOwotfQotCi0vKiBXaGVuIGFuIGVudHJ5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlIGlzIHJldXNlZCwgdGhlIGVudHJ5IG1vdmVzCi0gICB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9yZWxvY19xdWV1ZV9maXggKHF1ZXVlLCBpbmRleCkKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICBpZiAoaW5kZXggPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGluZGV4ID09IDEpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqdG1wMSA9IHF1ZXVlWzBdLnJlbG9jOwotICAgICAgdW5zaWduZWQgaW50IHRtcDIgPSBxdWV1ZVswXS5zaXplOwotICAgICAgcXVldWVbMF0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzBdLnNpemUgPSBxdWV1ZVsxXS5zaXplOwotICAgICAgcXVldWVbMV0ucmVsb2MgPSB0bXAxOwotICAgICAgcXVldWVbMV0uc2l6ZSA9IHRtcDI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmRleCA9PSAyKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnRtcDEgPSBxdWV1ZVswXS5yZWxvYzsKLSAgICAgIHVuc2lnbmVkIGludCB0bXAyID0gcXVldWVbMF0uc2l6ZTsKLSAgICAgIHF1ZXVlWzBdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gICAgICBxdWV1ZVswXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgICAgIHF1ZXVlWzJdLnJlbG9jID0gcXVldWVbMV0ucmVsb2M7Ci0gICAgICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgICAgIHF1ZXVlWzFdLnJlbG9jID0gdG1wMTsKLSAgICAgIHF1ZXVlWzFdLnNpemUgPSB0bXAyOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5kZXggPT0gMykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICp0bXAxID0gcXVldWVbMF0ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBpbnQgdG1wMiA9IHF1ZXVlWzBdLnNpemU7Ci0gICAgICBxdWV1ZVswXS5yZWxvYyA9IHF1ZXVlWzNdLnJlbG9jOwotICAgICAgcXVldWVbMF0uc2l6ZSA9IHF1ZXVlWzNdLnNpemU7Ci0gICAgICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOwotICAgICAgcXVldWVbM10uc2l6ZSA9IHF1ZXVlWzJdLnNpemU7Ci0gICAgICBxdWV1ZVsyXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICAgICAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gICAgICBxdWV1ZVsxXS5yZWxvYyA9IHRtcDE7Ci0gICAgICBxdWV1ZVsxXS5zaXplID0gdG1wMjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGFib3J0KCk7Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBwYXJ0aWN1bGFyIHJlbG9jYXRpb24gaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCi1zdGF0aWMgaW50Ci1zb21fcmVsb2NfcXVldWVfZmluZCAocCwgc2l6ZSwgcXVldWUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpZiAocXVldWVbMF0ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbMF0ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzBdLnNpemUpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChxdWV1ZVsxXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVsxXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbMV0uc2l6ZSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHF1ZXVlWzJdLnJlbG9jICYmICFtZW1jbXAgKHAsIHF1ZXVlWzJdLnJlbG9jLCBzaXplKQotICAgICAgJiYgc2l6ZSA9PSBxdWV1ZVsyXS5zaXplKQotICAgIHJldHVybiAyOwotICBpZiAocXVldWVbM10ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbM10ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzNdLnNpemUpCi0gICAgcmV0dXJuIDM7Ci0gIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCBzaXplLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgKnN1YnNwYWNlX3JlbG9jX3NpemVwOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaW50IHF1ZXVlX2luZGV4ID0gc29tX3JlbG9jX3F1ZXVlX2ZpbmQgKHAsIHNpemUsIHF1ZXVlKTsKLQotICBpZiAocXVldWVfaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgLyogRm91bmQgdGhpcyBpbiBhIHByZXZpb3VzIGZpeHVwLiAgVW5kbyB0aGUgZml4dXAgd2UKLQkganVzdCBidWlsdCBhbmQgdXNlIFJfUFJFVl9GSVhVUCBpbnN0ZWFkLiAgV2Ugc2F2ZWQgCi0JIGEgdG90YWwgb2Ygc2l6ZSAtIDEgYnl0ZXMgaW4gdGhlIGZpeHVwIHN0cmVhbS4gICovCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfUFJFVl9GSVhVUCArIHF1ZXVlX2luZGV4LCBwKTsKLSAgICAgIHAgKz0gMTsKLSAgICAgICpzdWJzcGFjZV9yZWxvY19zaXplcCArPSAxOwotICAgICAgc29tX3JlbG9jX3F1ZXVlX2ZpeCAocXVldWUsIHF1ZXVlX2luZGV4KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzb21fcmVsb2NfcXVldWVfaW5zZXJ0IChwLCBzaXplLCBxdWV1ZSk7Ci0gICAgICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gc2l6ZTsKLSAgICAgIHAgKz0gc2l6ZTsKLSAgICB9Ci0gIHJldHVybiBwOwotfQotCi0vKiBFbWl0IHRoZSBwcm9wZXIgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgdGhlIG5leHQgU0tJUAotICAgYnl0ZXMgd2l0aG91dCBhbnkgcmVsb2NhdGlvbi4gIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3Vic3BhY2UKLSAgIHJlbG9jYXRpb24gc3RyZWFtIHZpYSBTVUJTUEFDRV9SRUxPQ19TSVpFX1A7IGFsc28gcmV0dXJuIHRoZSAKLSAgIGN1cnJlbnQgcG9pbnRlciBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNraXA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIC8qIFVzZSBhIDQgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkgd2l0aCBhIG1heGltYWwgdmFsdWUKLSAgICAgdGhlbiBSX1BSRVZfRklYVVBzIHRvIGdldCB0aGUgZGlmZmVyZW5jZSBkb3duIHRvIGEKLSAgICAgcmVhc29uYWJsZSBzaXplLiAgKi8KLSAgaWYgKHNraXAgPj0gMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIHNraXAgLT0gMHgxMDAwMDAwOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAzMSwgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmYsIHAgKyAxKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgcCArIDIpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOwotICAgICAgd2hpbGUgKHNraXAgPj0gMHgxMDAwMDAwKQotCXsKLQkgIHNraXAgLT0gMHgxMDAwMDAwOwotCSAgYmZkX3B1dF84IChhYmZkLCBSX1BSRVZfRklYVVAsIHApOwotCSAgcCsrOwotCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0JICAvKiBObyBuZWVkIHRvIGFkanVzdCBxdWV1ZSBoZXJlIHNpbmNlIHdlIGFyZSByZXBlYXRpbmcgdGhlCi0JICAgICBtb3N0IHJlY2VudCBmaXh1cC4gICovCi0JfQotICAgIH0KLSAgCi0gIC8qIFRoZSBkaWZmZXJlbmNlIG11c3QgYmUgbGVzcyB0aGFuIDB4MTAwMDAwMC4gIFVzZSBvbmUgCi0gICAgIG1vcmUgUl9OT19SRUxPQ0FUSU9OIGVudHJ5IHRvIGdldCB0byB0aGUgcmlnaHQgZGlmZmVyZW5jZS4gICovCi0gIGlmICgoc2tpcCAmIDMpID09IDAgJiYgc2tpcCA8PSAweGMwMDAwICYmIHNraXAgPiAwKQotICAgIHsKLSAgICAgIC8qIERpZmZlcmVuY2UgY2FuIGJlIGhhbmRsZWQgaW4gYSBzaW1wbGUgc2luZ2xlLWJ5dGUKLQkgUl9OT19SRUxPQ0FUSU9OIGVudHJ5LiAgKi8KLSAgICAgIGlmIChza2lwIDw9IDB4NjApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAoc2tpcCA+PiAyKSAtIDEsIHApOwotCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0JICBwKys7Ci0JfQotICAgICAgLyogSGFuZGxlIGl0IHdpdGggYSB0d28gYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgZWxzZSBpZiAoc2tpcCA8PSAweDEwMDApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAyNCArICgoKHNraXAgPj4gMikgLSAxKSA+PiA4KSwgcCk7Ci0JICBiZmRfcHV0XzggKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMiwgcXVldWUpOwotCX0KLSAgICAgIC8qIEhhbmRsZSBpdCB3aXRoIGEgdGhyZWUgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMjggKyAoKChza2lwID4+IDIpIC0gMSkgPj4gMTYpLCBwKTsKLQkgIGJmZF9wdXRfMTYgKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOwotCX0KLSAgICB9Ci0gIC8qIFVnaC4gIFB1bnQgYW5kIHVzZSBhIDQgYnl0ZSBlbnRyeS4gICovCi0gIGVsc2UgaWYgKHNraXAgPiAwKQotICAgIHsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMzEsIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCAoc2tpcCAtIDEpID4+IDE2LCBwICsgMSk7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBza2lwIC0gMSwgcCArIDIpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEVtaXQgdGhlIHByb3BlciBSX0RBVEFfT1ZFUlJJREUgZml4dXBzIHRvIGhhbmRsZSBhIG5vbnplcm8gYWRkZW5kCi0gICBmcm9tIGEgQkZEIHJlbG9jYXRpb24uICBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIHN1YnNwYWNlIHJlbG9jYXRpb24KLSAgIHN0cmVhbSB2aWEgU1VCU1BBQ0VfUkVMT0NfU0laRV9QOyBhbHNvIHJldHVybiB0aGUgY3VycmVudCBwb2ludGVyCi0gICBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19hZGRlbmQgKGFiZmQsIGFkZGVuZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHF1ZXVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBhZGRlbmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIGlmICgodW5zaWduZWQpKGFkZGVuZCkgKyAweDgwIDwgMHgxMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAxLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7IAotICAgIH0KLSAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMCA8IDB4MTAwMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAyLCBwKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGFkZGVuZCwgcCArIDEpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMDAwIDwgMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9EQVRBX09WRVJSSURFICsgMywgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIGFkZGVuZCA+PiAxNiwgcCArIDEpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYWRkZW5kLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyA0LCBwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGFkZGVuZCwgcCArIDEpOwotICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEhhbmRsZSBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1zb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIGJmZF9yZWxvYywgc3ltX251bSwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBpbnQgc3ltX251bTsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaW50IGFyZ19iaXRzID0gSFBQQV9SX0FSR19SRUxPQyAoYmZkX3JlbG9jLT5hZGRlbmQpOwotICBpbnQgcnRuX2JpdHMgPSBhcmdfYml0cyAmIDB4MzsKLSAgaW50IHR5cGUsIGRvbmUgPSAwOwotICAKLSAgLyogWW91J2xsIG5ldmVyIGJlbGlldmUgYWxsIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSByZWxvY2F0aW9ucwotICAgICBmb3IgZnVuY3Rpb24gY2FsbHMuICBIYXZpbmcgdG8gY29tcHV0ZSBhbmQgcGFjayB0aGUgYXJndW1lbnQKLSAgICAgcmVsb2NhdGlvbiBiaXRzIGlzIHRoZSByZWFsIG5pZ2h0bWFyZS4KLSAgICAgCi0gICAgIElmIHlvdSdyZSBpbnRlcmVzdGVkIGluIGhvdyB0aGlzIHdvcmtzLCBqdXN0IGZvcmdldCBpdC4gIFlvdSByZWFsbHkKLSAgICAgZG8gbm90IHdhbnQgdG8ga25vdyBhYm91dCB0aGlzIGJyYWluZGFtYWdlLiAgKi8KLQotICAvKiBGaXJzdCBzZWUgaWYgdGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgInNpbXBsZSIgcmVsb2NhdGlvbi4gIFNpbXBsZQotICAgICByZWxvY2F0aW9ucyBoYXZlIGEgc3ltYm9sIG51bWJlciA8IDB4MTAwIGFuZCBoYXZlIHNpbXBsZSBlbmNvZGluZ3MKLSAgICAgb2YgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotCi0gIGlmIChzeW1fbnVtIDwgMHgxMDApCi0gICAgewotICAgICAgc3dpdGNoIChhcmdfYml0cykKLQl7Ci0JY2FzZSAwOgotCWNhc2UgMToKLQkgIHR5cGUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDg6Ci0JY2FzZSAxIDw8IDggfCAxOgotCSAgdHlwZSA9IDE7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgOCB8IDEgPDwgNjoKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDE6Ci0JICB0eXBlID0gMjsKLQkgIGJyZWFrOwotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0OgotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0IHwgMToKLQkgIHR5cGUgPSAzOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDI6Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDIgfCAxOgotCSAgdHlwZSA9IDQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgLyogTm90IG9uZSBvZiB0aGUgZWFzeSBlbmNvZGluZ3MuICBUaGlzIHdpbGwgaGF2ZSB0byBiZQotCSAgICAgaGFuZGxlZCBieSB0aGUgbW9yZSBjb21wbGV4IGNvZGUgYmVsb3cuICAqLwotCSAgdHlwZSA9IC0xOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHR5cGUgIT0gLTEpCi0JewotCSAgLyogQWNjb3VudCBmb3IgdGhlIHJldHVybiB2YWx1ZSB0b28uICAqLwotCSAgaWYgKHJ0bl9iaXRzKQotCSAgICB0eXBlICs9IDU7Ci0KLQkgIC8qIEVtaXQgYSAyIGJ5dGUgcmVsb2NhdGlvbi4gIFRoZW4gc2VlIGlmIGl0IGNhbiBiZSBoYW5kbGVkCi0JICAgICB3aXRoIGEgcmVsb2NhdGlvbiB3aGljaCBpcyBhbHJlYWR5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIHR5cGUsIHApOwotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7Ci0JICBkb25lID0gMTsKLQl9Ci0gICAgfQotICAKLSAgLyogSWYgdGhpcyBjb3VsZCBub3QgYmUgaGFuZGxlZCB3aXRoIGEgc2ltcGxlIHJlbG9jYXRpb24sIHRoZW4gZG8gYSBoYXJkCi0gICAgIG9uZS4gIEhhcmQgcmVsb2NhdGlvbnMgb2NjdXIgaWYgdGhlIHN5bWJvbCBudW1iZXIgd2FzIHRvbyBoaWdoIG9yIGlmCi0gICAgIHRoZSBlbmNvZGluZyBvZiBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaXMgdG9vIGNvbXBsZXguICAqLwotICBpZiAoISBkb25lKQotICAgIHsKLSAgICAgIC8qIERvbid0IGFzayBhYm91dCB0aGVzZSBtYWdpYyBzZXF1ZW5jZXMuICBJIHRvb2sgdGhlbSBzdHJhaWdodAotCSBmcm9tIGdhcy0xLjM2IHdoaWNoIHRvb2sgdGhlbSBmcm9tIHRoZSBhLm91dCBtYW4gcGFnZS4gICovCi0gICAgICB0eXBlID0gcnRuX2JpdHM7Ci0gICAgICBpZiAoKGFyZ19iaXRzID4+IDYgJiAweGYpID09IDB4ZSkKLQl0eXBlICs9IDkgKiA0MDsKLSAgICAgIGVsc2UKLQl0eXBlICs9ICgzICogKGFyZ19iaXRzID4+IDggJiAzKSArIChhcmdfYml0cyA+PiA2ICYgMykpICogNDA7Ci0gICAgICBpZiAoKGFyZ19iaXRzID4+IDIgJiAweGYpID09IDB4ZSkKLQl0eXBlICs9IDkgKiA0OwotICAgICAgZWxzZQotCXR5cGUgKz0gKDMgKiAoYXJnX2JpdHMgPj4gNCAmIDMpICsgKGFyZ19iaXRzID4+IDIgJiAzKSkgKiA0OwotICAgICAgCi0gICAgICAvKiBPdXRwdXQgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgcmVsb2NhdGlvbi4gIFRoZXNlIGRlc2NyaWJlCi0JIHRoZSBsZW5ndGggb2YgdGhlIHJlbG9jYXRpb24gYW5kIGVuY29kaW5nIHN0eWxlLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEwCi0JCSArIDIgKiAoc3ltX251bSA+PSAweDEwMCkgKyAodHlwZSA+PSAweDEwMCksCi0JCSBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdHlwZSwgcCArIDEpOwotICAgICAgCi0gICAgICAvKiBOb3cgb3V0cHV0IHRoZSBzeW1ib2wgaW5kZXggYW5kIHNlZSBpZiB0aGlzIGJpemFycmUgcmVsb2NhdGlvbgotCSBqdXN0IGhhcHBlbmVkIHRvIGJlIGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KLSAgICAgIGlmIChzeW1fbnVtIDwgMHgxMDApCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMik7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDIpOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOwotCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOwotCX0KLSAgICB9Ci0gIHJldHVybiBwOwotfQotCi0KLS8qIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIFgsIGJhc2UgMiwgY29uc2lkZXJpbmcgWCB1bnNpZ25lZC4gCi0gICBBYm9ydCAtMSBpZiBYIGlzIG5vdCBhIHBvd2VyIG9yIHR3byBvciBpcyB6ZXJvLiAgKi8KLQotc3RhdGljIGludAotbG9nMiAoeCkKLSAgICAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIGludCBsb2cgPSAwOwotCi0gIC8qIFRlc3QgZm9yIDAgb3IgYSBwb3dlciBvZiAyLiAgKi8KLSAgaWYgKHggPT0gMCB8fCB4ICE9ICh4ICYgLXgpKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoKHggPj49IDEpICE9IDApCi0gICAgbG9nKys7Ci0gIHJldHVybiBsb2c7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhwcGFfc29tX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBHaXZlbiBhIGdlbmVyaWMgSFBQQSByZWxvY2F0aW9uIHR5cGUsIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXQsCi0gICBhbmQgYSBmaWVsZCBzZWxlY3RvciwgcmV0dXJuIG9uZSBvciBtb3JlIGFwcHJvcHJpYXRlIFNPTSByZWxvY2F0aW9ucy4gICovCi0KLWludCAqKgotaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUgKGFiZmQsIGJhc2VfdHlwZSwgZm9ybWF0LCBmaWVsZCwgc3ltX2RpZmYsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYmFzZV90eXBlOwotICAgICBpbnQgZm9ybWF0OwotICAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgZmllbGQ7Ci0gICAgIGludCBzeW1fZGlmZjsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpbnQgKmZpbmFsX3R5cGUsICoqZmluYWxfdHlwZXM7Ci0KLSAgZmluYWxfdHlwZXMgPSAoaW50ICoqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50ICopICogNik7Ci0gIGZpbmFsX3R5cGUgPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLSAgaWYgKCFmaW5hbF90eXBlcyB8fCAhZmluYWxfdHlwZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgZmllbGQgc2VsZWN0b3IgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCByZWxvY2F0aW9ucyB0byBiZSAKLSAgICAgZ2VuZXJhdGVkLiAgSXQncyBpbXBvc3NpYmxlIHRvIGtub3cgYXQgdGhpcyBtb21lbnQgaWYgYWRkaXRpb25hbAotICAgICByZWxvY2F0aW9ucyB3aWxsIGJlIG5lZWRlZCwgc28gd2UgbWFrZSB0aGVtLiAgVGhlIGNvZGUgdG8gYWN0dWFsbHkKLSAgICAgd3JpdGUgdGhlIHJlbG9jYXRpb24vZml4dXAgc3RyZWFtIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZwotICAgICBhbnkgcmVkdW5kYW50IHJlbG9jYXRpb25zLiAgKi8KLSAgc3dpdGNoIChmaWVsZCkKLSAgICB7Ci0gICAgICBjYXNlIGVfZnNlbDoKLSAgICAgIGNhc2UgZV9wc2VsOgotICAgICAgY2FzZSBlX2xwc2VsOgotICAgICAgY2FzZSBlX3Jwc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1sxXSA9IE5VTEw7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfdHNlbDoKLSAgICAgIGNhc2UgZV9sdHNlbDoKLSAgICAgIGNhc2UgZV9ydHNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoZmllbGQgPT0gZV90c2VsKQotCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCWVsc2UgaWYgKGZpZWxkID09IGVfbHRzZWwpCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JZWxzZQotCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sc3NlbDoKLSAgICAgIGNhc2UgZV9yc3NlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX1NfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbHNlbDoKLSAgICAgIGNhc2UgZV9yc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfTl9NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sZHNlbDoKLSAgICAgIGNhc2UgZV9yZHNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX0RfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbHJzZWw6Ci0gICAgICBjYXNlIGVfcnJzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9SX01PREU7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX25zZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OMVNFTDsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbmxzZWw6Ci0gICAgICBjYXNlIGVfbmxyc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfTjBTRUw7Ci0JZmluYWxfdHlwZXNbMV0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzFdKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGZpZWxkID09IGVfbmxzZWwpCi0JICAqZmluYWxfdHlwZXNbMV0gPSBSX05fTU9ERTsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMV0gPSBSX1JfTU9ERTsKLQlmaW5hbF90eXBlc1syXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbM10gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotICAgIH0KLSAgCi0gIHN3aXRjaCAoYmFzZV90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSFBQQToKLSAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChzeW1fZGlmZikKLQl7Ci0JICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKLQkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKLQkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7Ci0JICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7Ci0JICBpZiAoZm9ybWF0ID09IDMyKQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7Ci0JICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBQTEFCRUxzIGdldCB0aGVpciBvd24gcmVsb2NhdGlvbiB0eXBlLiAgKi8KLSAgICAgIGVsc2UgaWYgKGZpZWxkID09IGVfcHNlbAotCSAgfHwgZmllbGQgPT0gZV9scHNlbAotCSAgfHwgZmllbGQgPT0gZV9ycHNlbCkKLQl7Ci0JICAvKiBBIFBMQUJFTCByZWxvY2F0aW9uIHRoYXQgaGFzIGEgc2l6ZSBvZiAzMiBiaXRzIG11c3QKLQkgICAgIGJlIGEgUl9EQVRBX1BMQUJFTC4gIEFsbCBvdGhlcnMgYXJlIFJfQ09ERV9QTEFCRUxzLiAgKi8KLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGUgPSBSX0NPREVfUExBQkVMOwotCX0KLSAgICAgIC8qIFBJQyBzdHVmZi4gICovCi0gICAgICBlbHNlIGlmIChmaWVsZCA9PSBlX3RzZWwKLQkgIHx8IGZpZWxkID09IGVfbHRzZWwKLQkgIHx8IGZpZWxkID09IGVfcnRzZWwpCi0JKmZpbmFsX3R5cGUgPSBSX0RMVF9SRUw7Ci0gICAgICAvKiBBIHJlbG9jYXRpb24gaW4gdGhlIGRhdGEgc3BhY2UgaXMgYWx3YXlzIGEgZnVsbCAzMmJpdHMuICAqLwotICAgICAgZWxzZSBpZiAoZm9ybWF0ID09IDMyKQotCXsKLQkgICpmaW5hbF90eXBlID0gUl9EQVRBX09ORV9TWU1CT0w7Ci0KLQkgIC8qIElmIHRoZXJlJ3Mgbm8gU09NIHN5bWJvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJGRAotCSAgICAgc3ltYm9sLCB0aGVuIHNldCB0aGUgc3ltYm9sIHR5cGUgdG8gU1RfREFUQS4KLQotCSAgICAgT25seSBkbyB0aGlzIGlmIHRoZSB0eXBlIGlzIGdvaW5nIHRvIGRlZmF1bHQgbGF0ZXIgd2hlbgotCSAgICAgd2Ugd3JpdGUgdGhlIG9iamVjdCBmaWxlLgotCi0JICAgICBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgbGlua2VyIG5ldmVyIGVuY291bnRlcnMgYW4KLQkgICAgIFJfREFUQV9PTkVfU1lNQk9MIHJlbG9jIGludm9sdmluZyBhbiBTVF9DT0RFIHN5bWJvbC4KLQotCSAgICAgVGhpcyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiBoYW5kbGluZwotCSAgICAgdGFibGVzLgotCi0JICAgICBOb3RlIHRoYXQgb25lIGRheSB3ZSBtYXkgbmVlZCB0byBhbHNvIGVtaXQgQkVHSU5fQlJUQUIgYW5kCi0JICAgICBFTkRfQlJUQUIgdG8gcHJldmVudCB0aGUgbGlua2VyIGZyb20gb3B0aW1pemluZyBhd2F5IGluc25zCi0JICAgICBpbiBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9ucy4gICovCi0JICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOCi0JICAgICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLQkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMAotCSAgICAgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfREFUQTsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0hQUEFfR09UT0ZGOgotICAgICAgLyogTW9yZSBQTEFCRUwgc3BlY2lhbCBjYXNlcy4gICovCi0gICAgICBpZiAoZmllbGQgPT0gZV9wc2VsCi0JICB8fCBmaWVsZCA9PSBlX2xwc2VsCi0JICB8fCBmaWVsZCA9PSBlX3Jwc2VsKQotCSpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0hQUEFfQ09NUExFWDoKLSAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChzeW1fZGlmZikKLQl7Ci0JICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKLQkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7Ci0JICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKLQkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7Ci0JICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7Ci0JICBpZiAoZm9ybWF0ID09IDMyKQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKLQkgIGVsc2UKLQkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7Ci0JICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0KLSAgICBjYXNlIFJfSFBQQV9OT05FOgotICAgIGNhc2UgUl9IUFBBX0FCU19DQUxMOgotICAgICAgLyogUmlnaHQgbm93IHdlIGNhbiBkZWZhdWx0IGFsbCB0aGVzZS4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IUFBBX1BDUkVMX0NBTEw6Ci0gICAgICB7Ci0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0JLyogSWYgd2UgaGF2ZSBzaG9ydCBhbmQgbG9uZyBwY3JlbCBtb2RlcywgdGhlbiBnZW5lcmF0ZSB0aGUgcHJvcGVyCi0JICAgbW9kZSBzZWxlY3RvciwgdGhlbiB0aGUgcGNyZWwgcmVsb2NhdGlvbi4gIFJlZHVuZGFudCBzZWxlY3RvcnMKLQkgICB3aWxsIGJlIGVsaW1pbnRlZCBhcyB0aGUgcmVsb2NzIGFyZSBzaXplZCBhbmQgZW1pdHRlZC4gICovCi0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGZvcm1hdCA9PSAxNykKLQkgICpmaW5hbF90eXBlc1swXSA9IFJfU0hPUlRfUENSRUxfTU9ERTsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0xPTkdfUENSRUxfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotI2VuZGlmCi0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICByZXR1cm4gZmluYWxfdHlwZXM7Ci19Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVjdCBlbnRyeSBpbiB0aGUgUEEgU09NIHJlbG9jYXRpb24KLSAgIGhvd3RvIHRhYmxlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1zb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpZiAoKGludCkgY29kZSA8IChpbnQpIFJfTk9fUkVMT0NBVElPTiArIDI1NSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICgoaW50KSBzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXS50eXBlID09IChpbnQpIGNvZGUpOwotICAgICAgcmV0dXJuICZzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXTsKLSAgICB9Ci0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIDA7Ci19Ci0KLS8qIFBlcmZvcm0gc29tZSBpbml0aWFsaXphdGlvbiBmb3IgYW4gb2JqZWN0LiAgU2F2ZSByZXN1bHRzIG9mIHRoaXMKLSAgIGluaXRpYWxpemF0aW9uIGluIHRoZSBCRkQuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zb21fb2JqZWN0X3NldHVwIChhYmZkLCBmaWxlX2hkcnAsIGF1eF9oZHJwLCBjdXJyZW50X29mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcnA7Ci0gICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmF1eF9oZHJwOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaW50IGZvdW5kOwotCi0gIC8qIHNvbV9ta29iamVjdCB3aWxsIHNldCBiZmRfZXJyb3IgaWYgc29tX21rb2JqZWN0IGZhaWxzLiAgKi8KLSAgaWYgKHNvbV9ta29iamVjdCAoYWJmZCkgIT0gdHJ1ZSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZXQgQkZEIGZsYWdzIGJhc2VkIG9uIHdoYXQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBTT00uICAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGZpbGVfaGRycC0+c3ltYm9sX3RvdGFsKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFM7Ci0KLSAgc3dpdGNoIChmaWxlX2hkcnAtPmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgREVNQU5EX01BR0lDOgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gKERfUEFHRUQgfCBXUF9URVhUIHwgRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoV1BfVEVYVCB8IEVYRUNfUCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVYRUNfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gICAgICBicmVhazsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICBjYXNlIFNITF9NQUdJQzoKLSNlbmRpZgotI2lmZGVmIERMX01BR0lDCi0gICAgY2FzZSBETF9NQUdJQzoKLSNlbmRpZgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBob2xkIHRoZSBzYXZlZCBleGVjIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIG9ial9zb21fZXhlY19kYXRhIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2RhdGEgKSk7Ci0gIGlmIChvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgYnJhaW5kYW1hZ2VkIE9TRjEgbGlua2VyIHN3aXRjaGVkIGV4ZWNfZmxhZ3MgYW5kIGV4ZWNfZW50cnkhCi0KLSAgICAgV2UgdXNlZCB0byBpZGVudGlmeSBPU0YxIGJpbmFyaWVzIGJhc2VkIG9uIE5FV19WRVJTSU9OX0lELCBidXQKLSAgICAgYXBwYXJlbnRseSB0aGUgbGF0ZXN0IEhQVVggbGlua2VyIGlzIHVzaW5nIE5FV19WRVJTSU9OX0lEIG5vdy4KLQotICAgICBJdCdzIGFib3V0IHRpbWUsIE9TRiBoYXMgdXNlZCB0aGUgbmV3IGlkIHNpbmNlIGF0IGxlYXN0IDE5OTI7Ci0gICAgIEhQVVggZGlkbid0IHN0YXJ0IHRpbGwgbmVhcmx5IDE5OTUhLgotICAgIAotICAgICBUaGUgbmV3IGFwcHJvYWNoIGV4YW1pbmVzIHRoZSBlbnRyeSBmaWVsZC4gIElmIGl0J3MgemVybyBvciBub3QgNAotICAgICBieXRlIGFsaWduZWQgdGhlbiBpdCdzIG5vdCBhIHByb3BlciBjb2RlIGFkZHJlc3MgYW5kIHdlIGd1ZXNzIGl0J3MKLSAgICAgcmVhbGx5IHRoZSBleGVjdXRhYmxlIGZsYWdzLiAgKi8KLSAgZm91bmQgPSAwOwotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID49IHNlY3Rpb24tPnZtYQotCSAgJiYgYXV4X2hkcnAtPmV4ZWNfZW50cnkgPCBzZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5fY29va2VkX3NpemUpCi0JZm91bmQgPSAxOwotICAgIH0KLSAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID09IDAKLSAgICAgIHx8IChhdXhfaGRycC0+ZXhlY19lbnRyeSAmIDB4MykgIT0gMAotICAgICAgfHwgISBmb3VuZCkKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZmxhZ3M7Ci0gICAgICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPmV4ZWNfZmxhZ3MgPSBhdXhfaGRycC0+ZXhlY19lbnRyeTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZW50cnkgKyBjdXJyZW50X29mZnNldDsKLSAgICAgIG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFncyA9IGF1eF9oZHJwLT5leGVjX2ZsYWdzOwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9ocHBhLCBwYTEwKTsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF90b3RhbDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBzYXZlZCBzeW1ib2wgdGFibGUgYW5kIHN0cmluZyB0YWJsZSB0byBOVUxMLiAgCi0gICAgIFNhdmUgaW1wb3J0YW50IG9mZnNldHMgYW5kIHNpemVzIGZyb20gdGhlIFNPTSBoZWFkZXIgaW50bwotICAgICB0aGUgQkZELiAgKi8KLSAgb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpID0gKGNoYXIgICopIE5VTEw7Ci0gIG9ial9zb21fc3ltdGFiIChhYmZkKSA9IChzb21fc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCkgPSBOVUxMOwotICBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSA9IGZpbGVfaGRycC0+c3ltYm9sX3N0cmluZ3Nfc2l6ZTsKLSAgb2JqX3NvbV9zeW1fZmlsZXBvcyAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF9sb2NhdGlvbiArIGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX3N0cl9maWxlcG9zIChhYmZkKSA9IChmaWxlX2hkcnAtPnN5bWJvbF9zdHJpbmdzX2xvY2F0aW9uCi0JCQkJKyBjdXJyZW50X29mZnNldCk7Ci0gIG9ial9zb21fcmVsb2NfZmlsZXBvcyAoYWJmZCkgPSAoZmlsZV9oZHJwLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uCi0JCQkJICArIGN1cnJlbnRfb2Zmc2V0KTsKLSAgb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5zeXN0ZW1faWQgPSBmaWxlX2hkcnAtPnN5c3RlbV9pZDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogQ29udmVydCBhbGwgb2YgdGhlIHNwYWNlIGFuZCBzdWJzcGFjZSBpbmZvIGludG8gQkZEIHNlY3Rpb25zLiAgRWFjaCBzcGFjZQotICAgY29udGFpbnMgYSBudW1iZXIgb2Ygc3Vic3BhY2VzLCB3aGljaCBpbiB0dXJuIGRlc2NyaWJlIHRoZSBtYXBwaW5nIGJldHdlZW4KLSAgIHJlZ2lvbnMgb2YgdGhlIGV4ZWMgZmlsZSwgYW5kIHRoZSBhZGRyZXNzIHNwYWNlIHRoYXQgdGhlIHByb2dyYW0gcnVucyBpbi4KLSAgIEJGRCBzZWN0aW9ucyB3aGljaCBjb3JyZXNwb25kIHRvIHNwYWNlcyB3aWxsIG92ZXJsYXAgdGhlIHNlY3Rpb25zIGZvciB0aGUKLSAgIGFzc29jaWF0ZWQgc3Vic3BhY2VzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNldHVwX3NlY3Rpb25zIChhYmZkLCBmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGhlYWRlciAqZmlsZV9oZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci17Ci0gIGNoYXIgKnNwYWNlX3N0cmluZ3M7Ci0gIHVuc2lnbmVkIGludCBzcGFjZV9pbmRleCwgaTsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3N1YnNwYWNlcyA9IDA7Ci0gIGFzZWN0aW9uICoqc3Vic3BhY2Vfc2VjdGlvbnMsICpzZWN0aW9uOwotCi0gIC8qIEZpcnN0LCByZWFkIGluIHNwYWNlIG5hbWVzICovCi0KLSAgc3BhY2Vfc3RyaW5ncyA9IGJmZF9tYWxsb2MgKGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUpOwotICBpZiAoIXNwYWNlX3N0cmluZ3MgJiYgZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19sb2NhdGlvbiwgCi0gIAkJU0VFS19TRVQpIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9yZWFkIChzcGFjZV9zdHJpbmdzLCAxLCBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19zaXplLCBhYmZkKQotICAgICAgIT0gZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBMb29wIG92ZXIgYWxsIG9mIHRoZSBzcGFjZSBkaWN0aW9uYXJpZXMsIGJ1aWxkaW5nIHVwIHNlY3Rpb25zICovCi0gIGZvciAoc3BhY2VfaW5kZXggPSAwOyBzcGFjZV9pbmRleCA8IGZpbGVfaGRyLT5zcGFjZV90b3RhbDsgc3BhY2VfaW5kZXgrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3BhY2U7Ci0gICAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3Vic3BhY2UsIHNhdmVfc3Vic3BhY2U7Ci0gICAgICBpbnQgc3Vic3BhY2VfaW5kZXg7Ci0gICAgICBhc2VjdGlvbiAqc3BhY2VfYXNlY3Q7Ci0gICAgICBjaGFyICpuZXduYW1lOwotCi0gICAgICAvKiBSZWFkIHRoZSBzcGFjZSBkaWN0aW9uYXJ5IGVsZW1lbnQgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChjdXJyZW50X29mZnNldCArIGZpbGVfaGRyLT5zcGFjZV9sb2NhdGlvbgotCQkgICAgICsgc3BhY2VfaW5kZXggKiBzaXplb2Ygc3BhY2UpLAotCQkgICAgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfcmVhZCAoJnNwYWNlLCAxLCBzaXplb2Ygc3BhY2UsIGFiZmQpICE9IHNpemVvZiBzcGFjZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogU2V0dXAgdGhlIHNwYWNlIG5hbWUgc3RyaW5nICovCi0gICAgICBzcGFjZS5uYW1lLm5fbmFtZSA9IHNwYWNlLm5hbWUubl9zdHJ4ICsgc3BhY2Vfc3RyaW5nczsKLQotICAgICAgLyogTWFrZSBhIHNlY3Rpb24gb3V0IG9mIGl0ICovCi0gICAgICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotICAgICAgaWYgKCFuZXduYW1lKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBzcGFjZS5uYW1lLm5fbmFtZSk7Ci0JCQkgICAKLSAgICAgIHNwYWNlX2FzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICAgICAgaWYgKCFzcGFjZV9hc2VjdCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgIGlmIChzcGFjZS5pc19sb2FkYWJsZSA9PSAwKQotCXNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0gICAgICAvKiBTZXQgdXAgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgc3BhY2UuICAqLwotICAgICAgaWYgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc3BhY2VfYXNlY3QsIHNwYWNlLmlzX2RlZmluZWQsCi0JCQkJCSAgc3BhY2UuaXNfcHJpdmF0ZSwgc3BhY2Uuc29ydF9rZXksCi0JCQkJCSAgc3BhY2Uuc3BhY2VfbnVtYmVyKSA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSWYgdGhlIHNwYWNlIGhhcyBubyBzdWJzcGFjZXMsIHRoZW4gd2UncmUgZG9uZS4gICovCi0gICAgICBpZiAoc3BhY2Uuc3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogTm93LCByZWFkIGluIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnN1YnNwYWNlX2xvY2F0aW9uCi0JCSAgICAgKyBzcGFjZS5zdWJzcGFjZV9pbmRleCAqIHNpemVvZiBzdWJzcGFjZSksCi0JCSAgICBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkgIT0gc2l6ZW9mIHN1YnNwYWNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgLyogU2VlayBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3Vic3BhY2VzIGZvciBsb29wIGJlbG93ICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAoY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3Vic3BhY2VfbG9jYXRpb24KLQkJICAgICArIHNwYWNlLnN1YnNwYWNlX2luZGV4ICogc2l6ZW9mIHN1YnNwYWNlKSwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFNldHVwIHRoZSBzdGFydCBhZGRyZXNzIGFuZCBmaWxlIGxvYyBmcm9tIHRoZSBmaXJzdCBzdWJzcGFjZSByZWNvcmQgKi8KLSAgICAgIHNwYWNlX2FzZWN0LT52bWEgPSBzdWJzcGFjZS5zdWJzcGFjZV9zdGFydDsKLSAgICAgIHNwYWNlX2FzZWN0LT5maWxlcG9zID0gc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSArIGN1cnJlbnRfb2Zmc2V0OwotICAgICAgc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0gICAgICBpZiAoc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSW5pdGlhbGl6ZSBzYXZlX3N1YnNwYWNlIHNvIHdlIGNhbiByZWxpYWJseSBkZXRlcm1pbmUgaWYgdGhpcwotCSBsb29wIHBsYWNlZCBhbnkgdXNlZnVsIHZhbHVlcyBpbnRvIGl0LiAgKi8KLSAgICAgIG1lbXNldCAoJnNhdmVfc3Vic3BhY2UsIDAsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0KLSAgICAgIC8qIExvb3Agb3ZlciB0aGUgcmVzdCBvZiB0aGUgc3Vic3BhY2VzLCBidWlsZGluZyB1cCBtb3JlIHNlY3Rpb25zICovCi0gICAgICBmb3IgKHN1YnNwYWNlX2luZGV4ID0gMDsgc3Vic3BhY2VfaW5kZXggPCBzcGFjZS5zdWJzcGFjZV9xdWFudGl0eTsKLQkgICBzdWJzcGFjZV9pbmRleCsrKQotCXsKLQkgIGFzZWN0aW9uICpzdWJzcGFjZV9hc2VjdDsKLQotCSAgLyogUmVhZCBpbiB0aGUgbmV4dCBzdWJzcGFjZSAqLwotCSAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2Ygc3Vic3BhY2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBTZXR1cCB0aGUgc3Vic3BhY2UgbmFtZSBzdHJpbmcgKi8KLQkgIHN1YnNwYWNlLm5hbWUubl9uYW1lID0gc3Vic3BhY2UubmFtZS5uX3N0cnggKyBzcGFjZV9zdHJpbmdzOwotCi0JICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN1YnNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotCSAgaWYgKCFuZXduYW1lKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHN0cmNweSAobmV3bmFtZSwgc3Vic3BhY2UubmFtZS5uX25hbWUpOwotCi0JICAvKiBNYWtlIGEgc2VjdGlvbiBvdXQgb2YgdGhpcyBzdWJzcGFjZSAqLwotCSAgc3Vic3BhY2VfYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmV3bmFtZSk7Ci0JICBpZiAoIXN1YnNwYWNlX2FzZWN0KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogU3RvcmUgcHJpdmF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzdWJzcGFjZV9hc2VjdCwgc3BhY2VfYXNlY3QsCi0JCQkJCQkgc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cywKLQkJCQkJCSBzdWJzcGFjZS5zb3J0X2tleSwKLQkJCQkJCSBzdWJzcGFjZS5xdWFkcmFudCkgPT0gZmFsc2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBLZWVwIGFuIGVhc3kgbWFwcGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBhbmQgc2VjdGlvbnMuIAotCSAgICAgTm90ZSB3ZSBkbyBub3QgbmVjZXNzYXJpbHkgcmVhZCB0aGUgc3Vic3BhY2VzIGluIHRoZQotCSAgICAgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLQkgICAgIFNvIHRvIG1ha2UgdGhlIHRhcmdldCBpbmRleCBjb21lIG91dCBjb3JyZWN0bHksIHdlCi0JICAgICBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlIHN1YnNwYWNlIGhlYWRlciBpbiB0YXJnZXQKLQkgICAgIGluZGV4LCB0aGVuIHNvcnQgdXNpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdWJzcGFjZQotCSAgICAgaGVhZGVyIGFzIHRoZSBrZXkuICBUaGVuIHdlIGNhbiBhc3NpZ24gY29ycmVjdAotCSAgICAgc3Vic3BhY2UgaW5kaWNlcy4gICovCi0JICB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIHN1YnNwYWNlX2FzZWN0LT50YXJnZXRfaW5kZXggPSBiZmRfdGVsbCAoYWJmZCkgLSBzaXplb2YgKHN1YnNwYWNlKTsKLQotCSAgLyogU2V0IFNFQ19SRUFET05MWSBhbmQgU0VDX0NPREUvU0VDX0RBVEEgYXMgc3BlY2lmaWVkCi0JICAgICBieSB0aGUgYWNjZXNzX2NvbnRyb2xfYml0cyBpbiB0aGUgc3Vic3BhY2UgaGVhZGVyLiAgKi8KLQkgIHN3aXRjaCAoc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cyA+PiA0KQotCSAgICB7Ci0JICAgIC8qIFJlYWRvbmx5IGRhdGEuICAqLyAgCi0JICAgIGNhc2UgMHgwOgotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19SRUFET05MWTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBOb3JtYWwgZGF0YS4gICovICAKLQkgICAgY2FzZSAweDE6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19EQVRBOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIFJlYWRvbmx5IGNvZGUgYW5kIHRoZSBnYXRld2F5cy4KLQkgICAgICAgR2F0ZXdheXMgaGF2ZSBvdGhlciBhdHRyaWJ1dGVzIHdoaWNoIGRvIG5vdCBtYXAKLQkgICAgICAgaW50byBhbnl0aGluZyBCRkQga25vd3MgYWJvdXQuICAqLwotCSAgICBjYXNlIDB4MjoKLQkgICAgY2FzZSAweDQ6Ci0JICAgIGNhc2UgMHg1OgotCSAgICBjYXNlIDB4NjoKLQkgICAgY2FzZSAweDc6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIGR5bmFtaWMgKHdyaXRhYmxlKSBjb2RlLiAgKi8KLQkgICAgY2FzZSAweDM6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAKLQkgIGlmIChzdWJzcGFjZS5kdXBfY29tbW9uIHx8IHN1YnNwYWNlLmlzX2NvbW1vbikgCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgZWxzZSBpZiAoc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoID4gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLQkgIGlmIChzdWJzcGFjZS5pc19sb2FkYWJsZSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCSAgZWxzZQotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLQotCSAgaWYgKHN1YnNwYWNlLmNvZGVfb25seSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCi0JICAvKiBCb3RoIGZpbGVfbG9jX2luaXRfdmFsdWUgYW5kIGluaXRpYWxpemF0aW9uX2xlbmd0aCB3aWxsCi0JICAgICBiZSB6ZXJvIGZvciBhIEJTUyBsaWtlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlID09IDAKLQkgICAgICAmJiBzdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGggPT0gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzICY9IH4oU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotCi0JICAvKiBUaGlzIHN1YnNwYWNlIGhhcyByZWxvY2F0aW9ucy4KLQkgICAgIFRoZSBmaXh1cF9yZXF1ZXN0X3F1YW50aXR5IGlzIGEgYnl0ZSBjb3VudCBmb3IgdGhlIG51bWJlciBvZgotCSAgICAgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW07IGl0IGlzIG5vdCB0aGUgYWN0dWFsIG51bWJlcgotCSAgICAgb2YgcmVsb2NhdGlvbnMgaW4gdGhlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maXh1cF9yZXF1ZXN0X3F1YW50aXR5ICE9IDApCi0JICAgIHsKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5yZWxfZmlsZXBvcyA9IHN1YnNwYWNlLmZpeHVwX3JlcXVlc3RfaW5kZXg7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2VfYXNlY3QpLT5yZWxvY19zaXplCi0JCT0gc3Vic3BhY2UuZml4dXBfcmVxdWVzdF9xdWFudGl0eTsKLQkgICAgICAvKiBXZSBjYW4gbm90IGRldGVybWluZSB0aGlzIHlldC4gIFdoZW4gd2UgcmVhZCBpbiB0aGUgCi0JCSByZWxvY2F0aW9uIHRhYmxlIHRoZSBjb3JyZWN0IHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluLiAgKi8KLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+cmVsb2NfY291bnQgPSAtMTsKLQkgICAgfQotCi0JICAvKiBVcGRhdGUgc2F2ZV9zdWJzcGFjZSBpZiBhcHByb3ByaWF0ZS4gICovCi0JICBpZiAoc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSA+IHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSkKLQkgICAgc2F2ZV9zdWJzcGFjZSA9IHN1YnNwYWNlOwotCi0JICBzdWJzcGFjZV9hc2VjdC0+dm1hID0gc3Vic3BhY2Uuc3Vic3BhY2Vfc3RhcnQ7Ci0JICBzdWJzcGFjZV9hc2VjdC0+X2Nvb2tlZF9zaXplID0gc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoOwotCSAgc3Vic3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IHN1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aDsKLQkgIHN1YnNwYWNlX2FzZWN0LT5maWxlcG9zID0gKHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJCQkgICAgICsgY3VycmVudF9vZmZzZXQpOwotCSAgc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0JICBpZiAoc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIGEgLm8gd2hpY2ggZGVmaW5lcyBzeW1ib2xzIGluIG90aGVyd2lzZQotICAgICAgICAgZW1wdHkgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGlmICghc2F2ZV9zdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlKQotCXsKLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAwOwotCSAgc3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFNldHVwIHRoZSBzaXplcyBmb3IgdGhlIHNwYWNlIHNlY3Rpb24gYmFzZWQgdXBvbiB0aGUgaW5mbyBpbiB0aGUKLQkgICAgIGxhc3Qgc3Vic3BhY2Ugb2YgdGhlIHNwYWNlLiAgKi8KLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAoc2F2ZV9zdWJzcGFjZS5zdWJzcGFjZV9zdGFydAotCQkJCSAgICAgICAtIHNwYWNlX2FzZWN0LT52bWEKLQkJCQkgICAgICAgKyBzYXZlX3N1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aCk7Ci0JICBzcGFjZV9hc2VjdC0+X3Jhd19zaXplID0gKHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZQotCQkJCSAgICAtIHNwYWNlX2FzZWN0LT5maWxlcG9zCi0JCQkJICAgICsgc2F2ZV9zdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGgpOwotCX0KLSAgICB9Ci0gIC8qIE5vdyB0aGF0IHdlJ3ZlIHJlYWQgaW4gYWxsIHRoZSBzdWJzcGFjZSByZWNvcmRzLCB3ZSBuZWVkIHRvIGFzc2lnbgotICAgICBhIHRhcmdldCBpbmRleCB0byBlYWNoIHN1YnNwYWNlLiAgKi8KLSAgc3Vic3BhY2Vfc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHRvdGFsX3N1YnNwYWNlcwotCQkJCQkJKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldID0gc2VjdGlvbjsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIHFzb3J0IChzdWJzcGFjZV9zZWN0aW9ucywgdG90YWxfc3Vic3BhY2VzLAotCSBzaXplb2YgKGFzZWN0aW9uICopLCBjb21wYXJlX3N1YnNwYWNlcyk7Ci0gIAotICAvKiBzdWJzcGFjZV9zZWN0aW9ucyBpcyBub3cgc29ydGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc3Vic3BhY2VzCi0gICAgIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICBBc3NpZ24gYW4gaW5kZXggdG8gZWFjaCBvbmUgbm93LiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3N1YnNwYWNlczsgaSsrKQotICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldLT50YXJnZXRfaW5kZXggPSBpOwotCi0gIGlmIChzcGFjZV9zdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2Vfc3RyaW5ncyk7Ci0KLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc3Vic3BhY2Vfc2VjdGlvbnMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3BhY2Vfc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlX3N0cmluZ3MpOwotCi0gIGlmIChzdWJzcGFjZV9zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHN1YnNwYWNlX3NlY3Rpb25zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIGEgU09NIG9iamVjdCBhbmQgbWFrZSBpdCBpbnRvIGEgQkZELiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc29tX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBoZWFkZXIgZmlsZV9oZHI7Ci0gIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgYXV4X2hkcjsKLSAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldCA9IDA7Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdF9oZWFkZXI7Ci0gIHN0cnVjdCBzb21fZW50cnkgc29tX2VudHJ5OwotI2RlZmluZSBFTlRSWV9TSVpFIHNpemVvZihzdHJ1Y3Qgc29tX2VudHJ5KQotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBmaWxlX2hkciwgMSwgRklMRV9IRFJfU0laRSwgYWJmZCkgIT0gRklMRV9IRFJfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCFfUEFfUklTQ19JRCAoZmlsZV9oZHIuc3lzdGVtX2lkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzd2l0Y2ggKGZpbGVfaGRyLmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgY2FzZSBFWEVDX01BR0lDOgotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgY2FzZSBERU1BTkRfTUFHSUM6Ci0jaWZkZWYgRExfTUFHSUMKLSAgICBjYXNlIERMX01BR0lDOgotI2VuZGlmCi0jaWZkZWYgU0hMX01BR0lDCi0gICAgY2FzZSBTSExfTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBTSEFSRURfTUFHSUNfQ05YCi0gICAgY2FzZSBTSEFSRURfTUFHSUNfQ05YOgotI2VuZGlmCi0gICAgICBicmVhazsKLQotI2lmZGVmIEVYRUNMSUJNQUdJQwotICAgIGNhc2UgRVhFQ0xJQk1BR0lDOgotICAgICAgLyogUmVhZCB0aGUgbHN0IGhlYWRlciBhbmQgZGV0ZXJtaW5lIHdoZXJlIHRoZSBTT00gZGlyZWN0b3J5IGJlZ2lucyAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9oZWFkZXIsIDEsIFNMU1RIRFIsIGFiZmQpICE9IFNMU1RIRFIpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIFBvc2l0aW9uIHRvIGFuZCByZWFkIHRoZSBmaXJzdCBkaXJlY3RvcnkgZW50cnkgKi8KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfaGVhZGVyLmRpcl9sb2MsIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBzb21fZW50cnksIDEsIEVOVFJZX1NJWkUsIGFiZmQpICE9IEVOVFJZX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIE5vdyBwb3NpdGlvbiB0byB0aGUgZmlyc3QgU09NICovCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc29tX2VudHJ5LmxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBjdXJyZW50X29mZnNldCA9IHNvbV9lbnRyeS5sb2NhdGlvbjsKLQotICAgICAgLyogQW5kIGZpbmFsbHksIHJlLXJlYWQgdGhlIHNvbSBoZWFkZXIgKi8KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGZpbGVfaGRyLCAxLCBGSUxFX0hEUl9TSVpFLCBhYmZkKSAhPSBGSUxFX0hEUl9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChmaWxlX2hkci52ZXJzaW9uX2lkICE9IFZFUlNJT05fSUQKLSAgICAgICYmIGZpbGVfaGRyLnZlcnNpb25faWQgIT0gTkVXX1ZFUlNJT05fSUQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGF1eF9oZWFkZXJfc2l6ZSBmaWVsZCBpbiB0aGUgZmlsZSBoZWFkZXIgaXMgemVybywgdGhlbiB0aGlzCi0gICAgIG9iamVjdCBpcyBhbiBpbmNvbXBsZXRlIGV4ZWN1dGFibGUgKGEgLm8gZmlsZSkuICBEbyBub3QgdHJ5IHRvIHJlYWQKLSAgICAgYSBub24tZXhpc3RhbnQgYXV4aWxpYXJ5IGhlYWRlci4gICovCi0gIG1lbXNldCAoJmF1eF9oZHIsIDAsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcikpOwotICBpZiAoZmlsZV9oZHIuYXV4X2hlYWRlcl9zaXplICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGF1eF9oZHIsIDEsIEFVWF9IRFJfU0laRSwgYWJmZCkgIT0gQVVYX0hEUl9TSVpFKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIGlmICghc2V0dXBfc2VjdGlvbnMgKGFiZmQsICZmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpKQotICAgIHsKLSAgICAgIC8qIHNldHVwX3NlY3Rpb25zIGRvZXMgbm90IGJ1YmJsZSB1cCBhIGJmZCBlcnJvciBjb2RlLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbGlkIFNPTSBvYmplY3QuICBEbyBzb21lIGluaXRpYWxpemF0aW9uLiAgKi8KLSAgcmV0dXJuIHNvbV9vYmplY3Rfc2V0dXAgKGFiZmQsICZmaWxlX2hkciwgJmF1eF9oZHIsIGN1cnJlbnRfb2Zmc2V0KTsKLX0KLQotLyogQ3JlYXRlIGEgU09NIG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCi0gIGFiZmQtPnRkYXRhLnNvbV9kYXRhID0gKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnNvbV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5pdGlhbGl6ZSBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBmaWxlIGhlYWRlci4gIFRoaXMgcm91dGluZSBtYWtlcwotICAgbm90IGF0dGVtcHQgYXQgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGZvciBhIGZ1bGwgZXhlY3V0YWJsZTsgaXQKLSAgIGlzIG9ubHkgbWVhbnQgdG8gaGFuZGxlIHJlbG9jYXRhYmxlIG9iamVjdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3ByZXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgLyogTWFrZSBhbmQgYXR0YWNoIGEgZmlsZSBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gIGZpbGVfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKSk7Ci0gIGlmIChmaWxlX2hkciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCkgPSBmaWxlX2hkcjsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotCi0gICAgICAvKiBNYWtlIGFuZCBhdHRhY2ggYW4gZXhlYyBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gICAgICBvYmpfc29tX2V4ZWNfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICopCi0JYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyKSk7Ci0gICAgICBpZiAob2JqX3NvbV9leGVjX2hkciAoYWJmZCkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBERU1BTkRfTUFHSUM7Ci0gICAgICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBTSEFSRV9NQUdJQzsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykKLQlmaWxlX2hkci0+YV9tYWdpYyA9IFNITF9NQUdJQzsKLSNlbmRpZgotICAgICAgZWxzZQotCWZpbGVfaGRyLT5hX21hZ2ljID0gRVhFQ19NQUdJQzsKLSAgICB9Ci0gIGVsc2UKLSAgICBmaWxlX2hkci0+YV9tYWdpYyA9IFJFTE9DX01BR0lDOwotCi0gIC8qIE9ubHkgbmV3IGZvcm1hdCBTT00gaXMgc3VwcG9ydGVkLiAgKi8KLSAgZmlsZV9oZHItPnZlcnNpb25faWQgPSBORVdfVkVSU0lPTl9JRDsKLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsLCBhbmQgZW1iZWRkaW5nIHRpbWVzdGFtcHMgaXMgbm90IGFsd2F5cwotICAgICBhIHdpc2UgdGhpbmcgdG8gZG8sIGl0IG1ha2VzIGNvbXBhcmluZyBvYmplY3RzIGR1cmluZyBhIG11bHRpLXN0YWdlCi0gICAgIGJvb3RzdHJhcCBkaWZmaWN1bHQuICAqLwotICBmaWxlX2hkci0+ZmlsZV90aW1lLnNlY3MgPSAwOwotICBmaWxlX2hkci0+ZmlsZV90aW1lLm5hbm9zZWNzID0gMDsgCi0KLSAgZmlsZV9oZHItPmVudHJ5X3NwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X3N1YnNwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X29mZnNldCA9IDA7Ci0gIGZpbGVfaGRyLT5wcmVzdW1lZF9kcCA9IDA7Ci0KLSAgLyogTm93IGl0ZXJhdGUgb3ZlciB0aGUgc2VjdGlvbnMgdHJhbnNsYXRpbmcgaW5mb3JtYXRpb24gZnJvbQotICAgICBCRkQgc2VjdGlvbnMgdG8gU09NIHNwYWNlcy9zdWJzcGFjZXMuICAqLwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIElnbm9yZSBhbnl0aGluZyB3aGljaCBoYXMgbm90IGJlZW4gbWFya2VkIGFzIGEgc3BhY2Ugb3IKLQkgc3Vic3BhY2UuICAqLwotICAgICAgaWYgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICBpZiAoc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQl7Ci0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNwYWNlIGRpY3Rpb25hcnkuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QKLQkgICAgPSAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICopCi0JICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKTsKLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBTZXQgc3BhY2UgYXR0cmlidXRlcy4gIE5vdGUgbW9zdCBhdHRyaWJ1dGVzIG9mIFNPTSBzcGFjZXMKLQkgICAgIGFyZSBzZXQgYmFzZWQgb24gdGhlIHN1YnNwYWNlcyBpdCBjb250YWlucy4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+bG9hZGVyX2ZpeF9pbmRleCA9IC0xOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmluaXRfcG9pbnRlcl9pbmRleCA9IC0xOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zb3J0X2tleSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19kZWZpbmVkID0gCi0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX2RlZmluZWQ7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfcHJpdmF0ZSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19wcml2YXRlOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnNwYWNlX251bWJlciA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNwYWNlX251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5LiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0Ci0JICAgID0gKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqKQotCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTZXQgc3Vic3BhY2UgYXR0cmlidXRlcy4gIEJhc2ljIHN0dWZmIGlzIGRvbmUgaGVyZSwgYWRkaXRpb25hbAotCSAgICAgYXR0cmlidXRlcyBhcmUgZmlsbGVkIGluIGxhdGVyIGFzIG1vcmUgaW5mb3JtYXRpb24gYmVjb21lcwotCSAgICAgYXZhaWxhYmxlLiAgKi8KLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19JU19DT01NT04pCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZHVwX2NvbW1vbiA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmlzX2NvbW1vbiA9IDE7Ci0JICAgIH0KLQotCSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAxOwotCi0JICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmNvZGVfb25seSA9IDE7Ci0KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zdWJzcGFjZV9zdGFydCA9IAotCSAgICBzZWN0aW9uLT52bWE7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3Vic3BhY2VfbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aW5pdGlhbGl6YXRpb25fbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+YWxpZ25tZW50ID0gCi0JICAgIDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zb3J0X2tleSA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5OwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmFjY2Vzc19jb250cm9sX2JpdHMgPQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5hY2Nlc3NfY29udHJvbF9iaXRzOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnF1YWRyYW50ID0KLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+cXVhZHJhbnQ7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZWN0aW9uIGlzIGEgU09NIHNwYWNlLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2lzX3NwYWNlIChzZWN0aW9uKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgLyogSWYgbm8gY29weSBkYXRhIGlzIGF2YWlsYWJsZSwgdGhlbiBpdCdzIG5laXRoZXIgYSBzcGFjZSBub3IgYQotICAgICBzdWJzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZSBjb250YWluaW5nIHNwYWNlIGlzbid0IHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBzZWN0aW9uLAotICAgICB0aGVuIHRoaXMgaXNuJ3QgYSBzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgIT0gc2VjdGlvbgotICAgICAgJiYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb24KLQkgICE9IHNlY3Rpb24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPSy4gIE11c3QgYmUgYSBzcGFjZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VjdGlvbiBpcyBhIFNPTSBzdWJzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIC8qIElmIG5vIGNvcHkgZGF0YSBpcyBhdmFpbGFibGUsIHRoZW4gaXQncyBuZWl0aGVyIGEgc3BhY2Ugbm9yIGEKLSAgICAgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGUgY29udGFpbmluZyBzcGFjZSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gc2VjdGlvbiwKLSAgICAgdGhlbiB0aGlzIGlzbid0IGEgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID09IHNlY3Rpb24KLSAgICAgIHx8IChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICA9PSBzZWN0aW9uKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT0suICBNdXN0IGJlIGEgc3Vic3BhY2UuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNwYWNlIGNvbnRhaW5pbnMgdGhlIGdpdmVuIHN1YnNwYWNlLiAgSXQKLSAgIGlzIHNhZmUgdG8gYXNzdW1lIHNwYWNlIHJlYWxseSBpcyBhIHNwYWNlLCBhbmQgc3Vic3BhY2UgcmVhbGx5Ci0gICBpcyBhIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19jb250YWluZXIgKHNwYWNlLCBzdWJzcGFjZSkKLSAgICAgYXNlY3Rpb24gKnNwYWNlLCAqc3Vic3BhY2U7Ci17Ci0gIHJldHVybiAoc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2UpLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9PSBzcGFjZQotCSAgfHwgKHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNwYWNlKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICAgICAgPT0gc3BhY2UpKTsKLX0KLQotLyogQ291bnQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIHNwYWNlcyBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXNvbV9jb3VudF9zcGFjZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGNvdW50ID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgICBjb3VudCArPSBzb21faXNfc3BhY2UgKHNlY3Rpb24pOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFjZXMgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY291bnRfc3Vic3BhY2VzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjb3VudCA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIGNvdW50ICs9IHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbik7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXR1cm4gLTEsIDAsIDEgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2Ygc3ltMSBhbmQgc3ltMi4KLQotICAgV2UgZGVzaXJlIHN5bWJvbHMgdG8gYmUgb3JkZXJlZCBzdGFydGluZyB3aXRoIHRoZSBzeW1ib2wgd2l0aCB0aGUKLSAgIGhpZ2hlc3QgcmVsb2NhdGlvbiBjb3VudCBkb3duIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgbG93ZXN0IHJlbG9jYXRpb24KLSAgIGNvdW50LiAgRG9pbmcgc28gY29tcGFjdHMgdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zeW1zIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci0KLXsKLSAgYXN5bWJvbCAqKnN5bTEgPSAoYXN5bWJvbCAqKikgYXJnMTsKLSAgYXN5bWJvbCAqKnN5bTIgPSAoYXN5bWJvbCAqKikgYXJnMjsKLSAgdW5zaWduZWQgaW50IGNvdW50MSwgY291bnQyOwotICAKLSAgLyogR2V0IHJlbG9jYXRpb24gY291bnQgZm9yIGVhY2ggc3ltYm9sLiAgTm90ZSB0aGF0IHRoZSBjb3VudAotICAgICBpcyBzdG9yZWQgaW4gdGhlIHVkYXRhIHBvaW50ZXIgZm9yIHNlY3Rpb24gc3ltYm9scyEgICovCi0gIGlmICgoKnN5bTEpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDEgPSAoKnN5bTEpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQxID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMSktPnJlbG9jX2NvdW50OwotCi0gIGlmICgoKnN5bTIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDIgPSAoKnN5bTIpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQyID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMiktPnJlbG9jX2NvdW50OwotCi0gIC8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuICAqLwotICBpZiAoY291bnQxIDwgY291bnQyKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChjb3VudDEgPiBjb3VudDIpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIC0xLCAwLCAxIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHN1YnNwYWNlMQotICAgYW5kIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zdWJzcGFjZXMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLQotewotICBhc2VjdGlvbiAqKnN1YnNwYWNlMSA9IChhc2VjdGlvbiAqKikgYXJnMTsKLSAgYXNlY3Rpb24gKipzdWJzcGFjZTIgPSAoYXNlY3Rpb24gKiopIGFyZzI7Ci0gIHVuc2lnbmVkIGludCBjb3VudDEsIGNvdW50MjsKLSAgCi0gIGlmICgoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCA8ICgqc3Vic3BhY2UyKS0+dGFyZ2V0X2luZGV4KQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKCpzdWJzcGFjZTIpLT50YXJnZXRfaW5kZXggPCAoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQZXJmb3JtIHZhcmlvdXMgd29yayBpbiBwcmVwYXJhdGlvbiBmb3IgZW1pdHRpbmcgdGhlIGZpeHVwIHN0cmVhbS4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcHJlcF9mb3JfZml4dXBzIChhYmZkLCBzeW1zLCBudW1fc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1fc3ltczsKLXsKLSAgaW50IGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBhc3ltYm9sICoqc29ydGVkX3N5bXM7Ci0KLSAgLyogTW9zdCBTT00gcmVsb2NhdGlvbnMgaW52b2x2aW5nIGEgc3ltYm9sIGhhdmUgYSBsZW5ndGggd2hpY2ggaXMKLSAgICAgZGVwZW5kZW50IG9uIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sLiAgU28gc3ltYm9scyB3aGljaCBhcmUKLSAgICAgdXNlZCBvZnRlbiBpbiByZWxvY2F0aW9ucyBzaG91bGQgaGF2ZSBhIHNtYWxsIGluZGV4LiAgKi8KLQotICAvKiBGaXJzdCBpbml0aWFsaXplIHRoZSBjb3VudGVycyBmb3IgZWFjaCBzeW1ib2wuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBIYW5kbGUgYSBzZWN0aW9uIHN5bWJvbDsgdGhlc2UgaGF2ZSBubyBwb2ludGVycyBiYWNrIHRvIHRoZQotCSBTT00gc3ltYm9sIGluZm8uICBTbyB3ZSBqdXN0IHVzZSB0aGUgdWRhdGEgZmllbGQgdG8gaG9sZCB0aGUKLQkgcmVsb2NhdGlvbiBjb3VudC4gICovCi0gICAgICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKSA9PSBOVUxMCi0JICB8fCBzeW1zW2ldLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQl7Ci0JICBzeW1zW2ldLT5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0JICBzeW1zW2ldLT51ZGF0YS5pID0gMDsKLQl9Ci0gICAgICBlbHNlCi0Jc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKS0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB0aGUgY291bnRlcnMgYXJlIGluaXRpYWxpemVkLCBtYWtlIGEgd2VpZ2h0ZWQgY291bnQKLSAgICAgb2YgaG93IG9mdGVuIGEgZ2l2ZW4gc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIERvZXMgdGhpcyBzZWN0aW9uIGhhdmUgYW55IHJlbG9jYXRpb25zPyAgKi8KLSAgICAgIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCA8PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXYWxrIHRocm91Z2ggZWFjaCByZWxvY2F0aW9uIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZm9yIChpID0gMTsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyspCi0JewotCSAgYXJlbGVudCAqcmVsb2MgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbltpXTsKLQkgIGludCBzY2FsZTsKLQotCSAgLyogQSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlICpBQlMqIHNlY3Rpb24gcmVhbGx5Ci0JICAgICBkb2VzIG5vdCBoYXZlIGEgc3ltYm9sLiAgTGlrZXdpc2UgaWYgdGhlIHN5bWJvbCBpc24ndCBhc3NvY2lhdGVkCi0JICAgICB3aXRoIGFueSBzZWN0aW9uLiAgKi8KLQkgIGlmIChyZWxvYy0+c3ltX3B0cl9wdHIgPT0gTlVMTAotCSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNjYWxpbmcgdG8gZW5jb3VyYWdlIHN5bWJvbHMgaW52b2x2ZWQgaW4gUl9EUF9SRUxBVElWRSAKLQkgICAgIGFuZCBSX0NPREVfT05FX1NZTUJPTCByZWxvY2F0aW9ucyB0byBjb21lIGZpcnN0LiAgVGhlc2UKLQkgICAgIHR3byByZWxvY2F0aW9ucyBoYXZlIHNpbmdsZSBieXRlIHZlcnNpb25zIGlmIHRoZSBzeW1ib2wKLQkgICAgIGluZGV4IGlzIHZlcnkgc21hbGwuICAqLwotCSAgaWYgKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0RQX1JFTEFUSVZFCi0JICAgICAgfHwgcmVsb2MtPmhvd3RvLT50eXBlID09IFJfQ09ERV9PTkVfU1lNQk9MKQotCSAgICBzY2FsZSA9IDI7Ci0JICBlbHNlCi0JICAgIHNjYWxlID0gMTsKLQotCSAgLyogSGFuZGxlIHNlY3Rpb24gc3ltYm9scyBieSBzdG9yaW5nIHRoZSBjb3VudCBpbiB0aGUgdWRhdGEKLQkgICAgIGZpZWxkLiAgSXQgd2lsbCBub3QgYmUgdXNlZCBhbmQgdGhlIGNvdW50IGlzIHZlcnkgaW1wb3J0YW50Ci0JICAgICBmb3IgdGhlc2Ugc3ltYm9scy4gICovCi0JICBpZiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgICAgewotCSAgICAgICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSA9Ci0JCSgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSArIHNjYWxlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEEgbm9ybWFsIHN5bWJvbC4gIEluY3JlbWVudCB0aGUgY291bnQuICAqLwotCSAgc29tX3N5bWJvbF9kYXRhICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+cmVsb2NfY291bnQgKz0gc2NhbGU7Ci0JfQotICAgIH0KLQotICAvKiBTb3J0IGEgY29weSBvZiB0aGUgc3ltYm9sIHRhYmxlLCByYXRoZXIgdGhhbiB0aGUgY2Fub25pY2FsCi0gICAgIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLwotICBzb3J0ZWRfc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBudW1fc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG1lbWNweSAoc29ydGVkX3N5bXMsIHN5bXMsIG51bV9zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgcXNvcnQgKHNvcnRlZF9zeW1zLCBudW1fc3ltcywgc2l6ZW9mIChhc3ltYm9sICopLCBjb21wYXJlX3N5bXMpOwotICBvYmpfc29tX3NvcnRlZF9zeW1zIChhYmZkKSA9IHNvcnRlZF9zeW1zOwotCi0gIC8qIENvbXB1dGUgdGhlIHN5bWJvbCBpbmRleGVzLCB0aGV5IHdpbGwgYmUgbmVlZGVkIGJ5IHRoZSByZWxvY2F0aW9uCi0gICAgIGNvZGUuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBBIHNlY3Rpb24gc3ltYm9sLiAgQWdhaW4sIHRoZXJlIGlzIG5vIHBvaW50ZXIgdG8gYmFja2VuZCBzeW1ib2wKLQkgaW5mb3JtYXRpb24sIHNvIHdlIHJldXNlIHRoZSB1ZGF0YSBmaWVsZCBhZ2Fpbi4gICovCi0gICAgICBpZiAoc29ydGVkX3N5bXNbaV0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCXNvcnRlZF9zeW1zW2ldLT51ZGF0YS5pID0gaTsKLSAgICAgIGVsc2UKLSAgICAgICAgc29tX3N5bWJvbF9kYXRhIChzb3J0ZWRfc3ltc1tpXSktPmluZGV4ID0gaTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfZml4dXBzIChhYmZkLCBjdXJyZW50X29mZnNldCwgdG90YWxfcmVsb2Nfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9yZWxvY19zaXplcDsKLXsKLSAgdW5zaWduZWQgaW50IGksIGo7Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgdG90YWxfcmVsb2Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBzdWJzcGFjZV9yZWxvY19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IG51bV9zcGFjZXMgPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfdG90YWw7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogQWxsIHRoZSBmaXh1cHMgZm9yIGEgcGFydGljdWxhciBzdWJzcGFjZSBhcmUgZW1pdHRlZCBpbiBhIHNpbmdsZQotICAgICBzdHJlYW0uICBBbGwgdGhlIHN1YnNwYWNlcyBmb3IgYSBwYXJ0aWN1bGFyIHNwYWNlIGFyZSBlbWl0dGVkCi0gICAgIGFzIGEgc2luZ2xlIHN0cmVhbS4KLQotICAgICBTbywgdG8gZ2V0IGFsbCB0aGUgbG9jYXRpb25zIGNvcnJlY3Qgb25lIG11c3QgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUKLSAgICAgc3BhY2VzLCBmb3IgZWFjaCBzcGFjZSBpdGVyYXRlIHRocm91Z2ggaXRzIHN1YnNwYWNlcyBhbmQgb3V0cHV0IGEKLSAgICAgZml4dXBzIHN0cmVhbS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKLQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpbnQgcmVsb2Nfb2Zmc2V0LCBjdXJyZW50X3JvdW5kaW5nX21vZGU7Ci0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0gCSAgaW50IGN1cnJlbnRfY2FsbF9tb2RlOwotI2VuZGlmCi0KLQkgIC8qIEZpbmQgYSBzdWJzcGFjZSBvZiB0aGlzIHNwYWNlLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgc3Vic3BhY2UgZG9lcyBub3QgaGF2ZSByZWFsIGRhdGEsIHRoZW4gd2UgYXJlCi0JICAgICBmaW5pc2VkIHdpdGggaXQuICAqLwotCSAgaWYgKChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9pbmRleAotCQk9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFRoaXMgc3Vic3BhY2UgaGFzIHNvbWUgcmVsb2NhdGlvbnMuICBQdXQgdGhlIHJlbG9jYXRpb24gc3RyZWFtCi0JICAgICBpbmRleCBpbnRvIHRoZSBzdWJzcGFjZSByZWNvcmQuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpeHVwX3JlcXVlc3RfaW5kZXgKLQkgICAgPSB0b3RhbF9yZWxvY19zaXplOwotCi0JICAvKiBUbyBtYWtlIGxpZmUgZWFzaWVyIHN0YXJ0IG92ZXIgd2l0aCBhIGNsZWFuIHNsYXRlIGZvciAKLQkgICAgIGVhY2ggc3Vic3BhY2UuICBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0KLQkgICAgIGZvciB0aGlzIHN1YnNwYWNlIGluIHByZXBhcmF0aW9uIGZvciB3cml0aW5nIG91dCBpdHMgZml4dXAKLQkgICAgIHN0cmVhbS4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0ICsgdG90YWxfcmVsb2Nfc2l6ZSwgU0VFS19TRVQpIDwgMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBCdWZmZXIgc3BhY2UgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuICBKdXN0IHBlcmZvcm0gc29tZQotCSAgICAgaW5pdGlhbGl6YXRpb24gaGVyZS4gICovCi0JICBwID0gdG1wX3NwYWNlOwotCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSA9IDA7Ci0JICByZWxvY19vZmZzZXQgPSAwOwotCSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLQkgIGN1cnJlbnRfcm91bmRpbmdfbW9kZSA9IFJfTl9NT0RFOwotI2lmbmRlZiBOT19QQ1JFTF9NT0RFUwotCSAgY3VycmVudF9jYWxsX21vZGUgPSBSX1NIT1JUX1BDUkVMX01PREU7Ci0jZW5kaWYKLQotCSAgLyogVHJhbnNsYXRlIGVhY2ggQkZEIHJlbG9jYXRpb24gaW50byBvbmUgb3IgbW9yZSBTT00gCi0JICAgICByZWxvY2F0aW9ucy4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgc3Vic2VjdGlvbi0+cmVsb2NfY291bnQ7IGorKykKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKmJmZF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW2pdOwotCSAgICAgIHVuc2lnbmVkIGludCBza2lwOwotCSAgICAgIGludCBzeW1fbnVtOwotCi0JICAgICAgLyogR2V0IHRoZSBzeW1ib2wgbnVtYmVyLiAgUmVtZW1iZXIgaXQncyBzdG9yZWQgaW4gYSAKLQkJIHNwZWNpYWwgcGxhY2UgZm9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0JICAgICAgaWYgKCgqYmZkX3JlbG9jLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCQlzeW1fbnVtID0gKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaTsKLQkgICAgICBlbHNlCi0JCXN5bV9udW0gPSBzb21fc3ltYm9sX2RhdGEgKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+aW5kZXg7Ci0JICAgICAgCi0JICAgICAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBjb3VwbGUgcmVsb2NhdGlvbnMsCi0JCSB0aGVuIGR1bXAgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gIEFsc28gcmVpbml0aWFsaXplCi0JCSB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gCi0KLQkJIE5vIHNpbmdsZSBCRkQgcmVsb2NhdGlvbiBjb3VsZCBldmVyIHRyYW5zbGF0ZSBpbnRvIG1vcmUKLQkJIHRoYW4gMTAwIGJ5dGVzIG9mIFNPTSByZWxvY2F0aW9ucyAoMjBieXRlcyBpcyBwcm9iYWJseSB0aGUKLQkJIHVwcGVyIGxpbWl0LCBidXQgbGVhdmUgbG90cyBvZiBzcGFjZSBmb3IgZ3Jvd3RoKS4gICovCi0JICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyAxMDAgPiBTT01fVE1QX0JVRlNJWkUpCi0JCXsKLQkJICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0bXBfc3BhY2UsIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBwID0gdG1wX3NwYWNlOwotCQkgIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7Ci0JCX0KLQotCSAgICAgIC8qIEVtaXQgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgYW55IGJ5dGVzIHdoaWNoIHdlcmUKLQkJIHNraXBwZWQuICAqLwotCSAgICAgIHNraXAgPSBiZmRfcmVsb2MtPmFkZHJlc3MgLSByZWxvY19vZmZzZXQ7Ci0JICAgICAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLAotCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCSAgICAgIC8qIFVwZGF0ZSByZWxvY19vZmZzZXQgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KLQotCQkgTWFueSByZWxvY2F0aW9ucyBkbyBub3QgY29uc3VtZSBpbnB1dCBieXRlcy4gIFRoZXkKLQkJIGFyZSBtYXJrZXJzLCBvciBzZXQgc3RhdGUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gc29tZQotCQkgbGF0ZXIgcmVsb2NhdGlvbi4gICovCi0JICAgICAgc3dpdGNoIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgUl9FTlRSWToKLQkJY2FzZSBSX0FMVF9FTlRSWToKLQkJY2FzZSBSX0VYSVQ6Ci0JCWNhc2UgUl9OX01PREU6Ci0JCWNhc2UgUl9TX01PREU6Ci0JCWNhc2UgUl9EX01PREU6Ci0JCWNhc2UgUl9SX01PREU6Ci0JCWNhc2UgUl9GU0VMOgotCQljYXNlIFJfTFNFTDoKLQkJY2FzZSBSX1JTRUw6Ci0JCWNhc2UgUl9DT01QMToKLQkJY2FzZSBSX0NPTVAyOgotCQljYXNlIFJfQkVHSU5fQlJUQUI6Ci0JCWNhc2UgUl9FTkRfQlJUQUI6Ci0JCWNhc2UgUl9CRUdJTl9UUlk6Ci0JCWNhc2UgUl9FTkRfVFJZOgotCQljYXNlIFJfTjBTRUw6Ci0JCWNhc2UgUl9OMVNFTDoKLSNpZm5kZWYgTk9fUENSRUxfTU9ERVMKLQkJY2FzZSBSX1NIT1JUX1BDUkVMX01PREU6Ci0JCWNhc2UgUl9MT05HX1BDUkVMX01PREU6Ci0jZW5kaWYKLQkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3M7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3MgKyA0OwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBOb3cgdGhlIGFjdHVhbCByZWxvY2F0aW9uIHdlIGNhcmUgYWJvdXQuICAqLwotCSAgICAgIHN3aXRjaCAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIFJfUENSRUxfQ0FMTDoKLQkJY2FzZSBSX0FCU19DQUxMOgotCQkgIHAgPSBzb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgYmZkX3JlbG9jLCBzeW1fbnVtLCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPREVfT05FX1NZTUJPTDoKLQkJY2FzZSBSX0RQX1JFTEFUSVZFOgotCQkgIC8qIEFjY291bnQgZm9yIGFueSBhZGRlbmQuICAqLwotCQkgIGlmIChiZmRfcmVsb2MtPmFkZGVuZCkKLQkJICAgIHAgPSBzb21fcmVsb2NfYWRkZW5kIChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCwgcCwgCi0JCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCQkgIGlmIChzeW1fbnVtIDwgMHgyMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgc3ltX251bSwgcCk7Ci0JCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICAgICAgcCArPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN5bV9udW0gPCAweDEwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMzIsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKLQkJCQkJICAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDMzLCBwKTsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMSk7Ci0JCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHN5bV9udW0sIHAgKyAyKTsgCi0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9EQVRBX09ORV9TWU1CT0w6Ci0JCWNhc2UgUl9EQVRBX1BMQUJFTDoKLQkJY2FzZSBSX0NPREVfUExBQkVMOgotCQljYXNlIFJfRExUX1JFTDoKLQkJICAvKiBBY2NvdW50IGZvciBhbnkgYWRkZW5kIHVzaW5nIFJfREFUQV9PVkVSUklERS4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgIT0gUl9EQVRBX09ORV9TWU1CT0wKLQkJICAgICAgJiYgYmZkX3JlbG9jLT5hZGRlbmQpCi0JCSAgICBwID0gc29tX3JlbG9jX2FkZGVuZCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQsIHAsIAotCQkJCQkgICZzdWJzcGFjZV9yZWxvY19zaXplLCByZWxvY19xdWV1ZSk7Ci0KLQkJICBpZiAoc3ltX251bSA8IDB4MTAwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKLQkJCQkJICAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0gPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDIpOyAKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJICBwLCA0LCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0VOVFJZOgotCQkgIHsKLQkJICAgIGludCB0bXA7Ci0JCSAgICBhcmVsZW50ICp0bXBfcmVsb2MgPSBOVUxMOwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBSX0VOVFJZLCBwKTsKLQotCQkgICAgLyogUl9FTlRSWSByZWxvY2F0aW9ucyBoYXZlIDY0IGJpdHMgb2YgYXNzb2NpYXRlZAotCQkgICAgICAgZGF0YS4gIFVuZm9ydHVuYXRlbHkgdGhlIGFkZGVuZCBmaWVsZCBvZiBhIGJmZAotCQkgICAgICAgcmVsb2NhdGlvbiBpcyBvbmx5IDMyIGJpdHMuICBTbywgd2Ugc3BsaXQgdXAKLQkJICAgICAgIHRoZSA2NGJpdCB1bndpbmQgaW5mb3JtYXRpb24gYW5kIHN0b3JlIHBhcnQgaW4KLQkJICAgICAgIHRoZSBSX0VOVFJZIHJlbG9jYXRpb24sIGFuZCB0aGUgcmVzdCBpbiB0aGUgUl9FWElUCi0JCSAgICAgICByZWxvY2F0aW9uLiAgKi8KLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kLCBwICsgMSk7Ci0JCQotCQkgICAgLyogRmluZCB0aGUgbmV4dCBSX0VYSVQgcmVsb2NhdGlvbi4gICovCi0JCSAgICBmb3IgKHRtcCA9IGo7IHRtcCA8IHN1YnNlY3Rpb24tPnJlbG9jX2NvdW50OyB0bXArKykKLQkJICAgICAgewotCQkgICAgICAgIHRtcF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW3RtcF07Ci0JCQlpZiAodG1wX3JlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0VYSVQpCi0JCQkgIGJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGlmICh0bXAgPT0gc3Vic2VjdGlvbi0+cmVsb2NfY291bnQpCi0JCSAgICAgIGFib3J0ICgpOwotCi0JCSAgICBiZmRfcHV0XzMyIChhYmZkLCB0bXBfcmVsb2MtPmFkZGVuZCwgcCArIDUpOwotCQkgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJcCwgOSwgcmVsb2NfcXVldWUpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQkgIAotCQljYXNlIFJfTl9NT0RFOgotCQljYXNlIFJfU19NT0RFOgotCQljYXNlIFJfRF9NT0RFOgotCQljYXNlIFJfUl9NT0RFOgotCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiByZXF1ZXN0cyB0aGUgY3VycmVudCByb3VuZGluZwotCQkgICAgIG1vZGUsIHRoZW4gaXQgaXMgcmVkdW5kYW50LiAgKi8KLQkJICBpZiAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSAhPSBjdXJyZW50X3JvdW5kaW5nX21vZGUpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICAgICAgcCArPSAxOwotCQkgICAgICBjdXJyZW50X3JvdW5kaW5nX21vZGUgPSBiZmRfcmVsb2MtPmhvd3RvLT50eXBlOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0JCWNhc2UgUl9MT05HX1BDUkVMX01PREU6Ci0JCWNhc2UgUl9TSE9SVF9QQ1JFTF9NT0RFOgotCQkgIGlmIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlICE9IGN1cnJlbnRfY2FsbF9tb2RlKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgICAgICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgICAgIHAgKz0gMTsKLQkJICAgICAgY3VycmVudF9jYWxsX21vZGUgPSBiZmRfcmVsb2MtPmhvd3RvLT50eXBlOwotCQkgICAgfQotCQkgIGJyZWFrOwotI2VuZGlmCi0KLQkJY2FzZSBSX0VYSVQ6Ci0JCWNhc2UgUl9BTFRfRU5UUlk6Ci0JCWNhc2UgUl9GU0VMOgotCQljYXNlIFJfTFNFTDoKLQkJY2FzZSBSX1JTRUw6Ci0JCWNhc2UgUl9CRUdJTl9CUlRBQjoKLQkJY2FzZSBSX0VORF9CUlRBQjoKLQkJY2FzZSBSX0JFR0lOX1RSWToKLQkJY2FzZSBSX04wU0VMOgotCQljYXNlIFJfTjFTRUw6Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9FTkRfVFJZOgotCQkgIC8qIFRoZSBlbmQgb2YgYSBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9uLiAgVGhlIHJlbG9jJ3MKLQkJICAgICBhZGRlbmQgY29udGFpbnMgdGhlIG9mZnNldCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nCi0JCSAgICAgY29kZS4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+YWRkZW5kID09IDApCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgIGVsc2UgaWYgKGJmZF9yZWxvYy0+YWRkZW5kIDwgMTAyNCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMSk7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgMiwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMiwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgKGJmZF9yZWxvYy0+YWRkZW5kIC8gNCkgPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMik7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgICAgICAKLQkJY2FzZSBSX0NPTVAxOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDQ0LCBwICsgMSk7Ci0JCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkgICAgICBwLCAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPTVAyOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDgwLCBwICsgMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMik7Ci0JCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOwotCQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgcCwgNSwgcmVsb2NfcXVldWUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9DT0RFX0VYUFI6Ci0JCWNhc2UgUl9EQVRBX0VYUFI6Ci0JCSAgLyogVGhlIG9ubHkgdGltZSB3ZSBnZW5lcmF0ZSBSX0NPTVAxLCBSX0NPTVAyIGFuZCAKLQkJICAgICBSX0NPREVfRVhQUiByZWxvY3MgaXMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgICAgIHN5bWJvbHMuICBIZW5jZSB3ZSBjYW4gY2hlYXQgaGVyZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCS8qIFB1dCBhICJSX1JFU0VSVkVEIiByZWxvY2F0aW9uIGluIHRoZSBzdHJlYW0gaWYKLQkJICAgd2UgaGl0IHNvbWV0aGluZyB3ZSBkbyBub3QgdW5kZXJzdGFuZC4gIFRoZSBsaW5rZXIKLQkJICAgd2lsbCBjb21wbGFpbiBsb3VkbHkgaWYgdGhpcyBldmVyIGhhcHBlbnMuICAqLwotCQlkZWZhdWx0OgotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgcCk7Ci0JCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgIHAgKz0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIExhc3QgQkZEIHJlbG9jYXRpb24gZm9yIGEgc3Vic3BhY2UgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCSAgICAgTWFwIHRoZSByZXN0IG9mIHRoZSBzdWJzcGFjZSB3aXRoIFJfTk9fUkVMT0NBVElPTiBmaXh1cHMuICAqLwotCSAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKSAKLQkJCSAgICAgICAgICAgICAgLSByZWxvY19vZmZzZXQsCi0JCQkgICAgICBwLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JICAvKiBTY3JpYmJsZSBvdXQgdGhlIHJlbG9jYXRpb25zLiAgKi8KLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRtcF9zcGFjZSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkgICAgICAhPSBwIC0gdG1wX3NwYWNlKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBwID0gdG1wX3NwYWNlOwotCi0JICB0b3RhbF9yZWxvY19zaXplICs9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9xdWFudGl0eQotCSAgICA9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JfQotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotICAqdG90YWxfcmVsb2Nfc2l6ZXAgPSB0b3RhbF9yZWxvY19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBzdHJpbmdfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICpzdHJpbmdfc2l6ZXA7Ci17Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXYWxrIHRocm91Z2ggYWxsIHRoZSBzcGFjZXMgYW5kIHN1YnNwYWNlcyAob3JkZXIgaXMgbm90IGltcG9ydGFudCkKLSAgICAgYnVpbGRpbmcgdXAgYW5kIHdyaXRpbmcgc3RyaW5nIHRhYmxlIGVudHJpZXMgZm9yIHRoZWlyIG5hbWVzLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgLyogT25seSB3b3JrIHdpdGggc3BhY2Uvc3Vic3BhY2VzOyBhdm9pZCBhbnkgb3RoZXIgc2VjdGlvbnMKLQkgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIG1hZGUgKC50ZXh0IGZvciBleGFtcGxlKS4gICovCi0gICAgICBpZiAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikgJiYgIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzcGFjZS9zdWJzcGFjZSBuYW1lLiAgKi8KLSAgICAgIGxlbmd0aCA9IHN0cmxlbiAoc2VjdGlvbi0+bmFtZSk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBmb3IgdGhlIG5leHQgZW50cnksIHRoZW4gZHVtcCB0aGUKLQkgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgRWFjaCBlbnRyeSB3aWxsIHRha2UgNCBieXRlcyB0bwotCSBob2xkIHRoZSBzdHJpbmcgbGVuZ3RoICsgdGhlIHN0cmluZyBpdHNlbGYgKyBudWxsIHRlcm1pbmF0b3IuICAqLwotICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JICAgICAgIT0gcCAtIHRtcF9zcGFjZSkgCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIEFsaWdubWVudCBpc3N1ZXMgYXJlIGFscmVhZHkgaGFuZGxlZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgcCArPSA0OwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgaW5kZXggaW4gdGhlIHNwYWNlL3N1YnNwYWNlIHJlY29yZHMuICAqLwotICAgICAgaWYgKHNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPm5hbWUubl9zdHJ4ID0gc3RyaW5nc19zaXplOwotICAgICAgZWxzZQotCXNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5uYW1lLm5fc3RyeCA9IHN0cmluZ3Nfc2l6ZTsKLQotICAgICAgLyogTmV4dCBjb21lcyB0aGUgc3RyaW5nIGl0c2VsZiArIGEgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KLSAgICAgIHN0cmNweSAocCwgc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgIHArKzsKLQkgIHN0cmluZ3Nfc2l6ZSsrOwotCX0KLSAgICB9Ci0KLSAgLyogRG9uZSB3aXRoIHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmdzLiAgV3JpdGUgb3V0IGFueSBpbmZvcm1hdGlvbgotICAgICBjb250YWluZWQgaW4gYSBwYXJ0aWFsIGJsb2NrLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkgIT0gcCAtIHRtcF9zcGFjZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpzdHJpbmdfc2l6ZXAgPSBzdHJpbmdzX3NpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgc3ltcywgbnVtX3N5bXMsIHN0cmluZ19zaXplcCwKLQkJCSAgY29tcGlsYXRpb25fdW5pdCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgaW50IG51bV9zeW1zOwotICAgICB1bnNpZ25lZCBpbnQgKnN0cmluZ19zaXplcDsKLSAgICAgQ09NUFVOSVQgKmNvbXBpbGF0aW9uX3VuaXQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICAKLSAgLyogQ2h1bmsgb2YgbWVtb3J5IHRoYXQgd2UgY2FuIHVzZSBhcyBidWZmZXIgc3BhY2UsIHRoZW4gdGhyb3cKLSAgICAgYXdheS4gICovCi0gIHVuc2lnbmVkIGNoYXIgdG1wX3NwYWNlW1NPTV9UTVBfQlVGU0laRV07Ci0gIHVuc2lnbmVkIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzX3NpemUgPSAwOwotICB1bnNpZ25lZCBjaGFyICpjb21wWzRdOwotCi0gIC8qIFRoaXMgZ2V0cyBhIGJpdCBncnVlc29tZSBiZWNhdXNlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAgVGhlCi0gICAgIHN0cmluZ3Mgd2l0aGluIHRoZSBjb21waWxhdGlvbiB1bml0IGFyZSBwYXJ0IG9mIHRoZSBzeW1ib2wKLSAgICAgc3RyaW5ncywgYnV0IGRvbid0IGhhdmUgc3ltYm9sX2RpY3Rpb25hcnkgZW50cmllcy4gIFNvLCBtYW51YWxseQotICAgICB3cml0ZSB0aGVtIGFuZCB1cGRhdGUgdGhlIGNvbXBsaWF0aW9uIHVuaXQgaGVhZGVyLiAgT24gaW5wdXQsIHRoZQotICAgICBjb21waWxhdGlvbiB1bml0IGhlYWRlciBjb250YWlucyBsb2NhbCBjb3BpZXMgb2YgdGhlIHN0cmluZ3MuCi0gICAgIE1vdmUgdGhlbSBhc2lkZS4gICovCi0gIGlmIChjb21waWxhdGlvbl91bml0KQotICAgIHsKLSAgICAgIGNvbXBbMF0gPSBjb21waWxhdGlvbl91bml0LT5uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMV0gPSBjb21waWxhdGlvbl91bml0LT5sYW5ndWFnZV9uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMl0gPSBjb21waWxhdGlvbl91bml0LT5wcm9kdWN0X2lkLm5fbmFtZTsKLSAgICAgIGNvbXBbM10gPSBjb21waWxhdGlvbl91bml0LT52ZXJzaW9uX2lkLm5fbmFtZTsKLSAgICB9Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY29tcGlsYXRpb25fdW5pdCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkgIGludCBsZW5ndGggPSBzdHJsZW4gKGNvbXBbaV0pOwotCi0JICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAKLQkgICAgIHRoZSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBub3cuICAqLwotCSAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkJICAhPSBwIC0gdG1wX3NwYWNlKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogUmVzZXQgdG8gYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc3BhY2UuICAqLwotCSAgICAgIHAgPSB0bXBfc3BhY2U7Ci0JICAgIH0KLQotCSAgLyogRmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyB0YWJsZSBlbnRyeSBpcyB0aGUgbGVuZ3RoIG9mCi0JICAgICB0aGUgc3RyaW5nLiAgVGhpcyBtdXN0IGFsd2F5cyBiZSA0IGJ5dGUgYWxpZ25lZC4gIFRoaXMgaXMKLQkgICAgIGFsc28gYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXgKLQkgICAgIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgZW50cnkuICAqLwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgbGVuZ3RoLCBwKTsKLQkgIHN0cmluZ3Nfc2l6ZSArPSA0OwotCSAgcCArPSA0OwotCi0JICAvKiBOZXh0IGNvbWVzIHRoZSBzdHJpbmcgaXRzZWxmICsgYSBudWxsIHRlcm1pbmF0b3IuICAqLwotCSAgc3RyY3B5IChwLCBjb21wW2ldKTsKLQotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgMDoJCi0JICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+bmFtZS5uX3N0cnggPSBzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5sYW5ndWFnZV9uYW1lLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5wcm9kdWN0X2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT52ZXJzaW9uX2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgcCArPSBsZW5ndGggKyAxOwotCSAgc3RyaW5nc19zaXplICs9IGxlbmd0aCArIDE7Ci0KLQkgIC8qIEFsd2F5cyBhbGlnbiB1cCB0byB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LiAgKi8KLQkgIHdoaWxlIChzdHJpbmdzX3NpemUgJSA0KQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgICAgICBzdHJpbmdzX3NpemUrKzsKLQkgICAgICBwKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltczsgaSsrKQotICAgIHsKLSAgICAgIGludCBsZW5ndGggPSBzdHJsZW4gKHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAgdGhlCi0JIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gICovCi0gICAgIGlmIChwIC0gdG1wX3NwYWNlICsgNSArIGxlbmd0aCA+IFNPTV9UTVBfQlVGU0laRSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKQotCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIFRoaXMgbXVzdCBhbHdheXMgYmUgNCBieXRlIGFsaWduZWQuICBUaGlzIGlzIGFsc28KLQkgYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXggZmllbGQgaW4gdGhlCi0JIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIE5leHQgY29tZXMgdGhlIHN0cmluZyBpdHNlbGYgKyBhIG51bGwgdGVybWluYXRvci4gICovCi0gICAgICBzdHJjcHkgKHAsIHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICBzb21fc3ltYm9sX2RhdGEoc3ltc1tpXSktPnN0cmluZ3RhYl9vZmZzZXQgPSBzdHJpbmdzX3NpemU7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0gICAgICAgIHsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7Ci0JICBzdHJpbmdzX3NpemUrKzsKLQkgIHArKzsKLSAgICAgICAgfQotICAgIH0KLQotICAvKiBTY3JpYmJsZSBvdXQgYW55IHBhcnRpYWwgYmxvY2suICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKSAhPSBwIC0gdG1wX3NwYWNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqc3RyaW5nX3NpemVwID0gc3RyaW5nc19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29tcHV0ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiB0byBiZSBwbGFjZWQgaW4gdGhlIFNPTSBoZWFkZXJzLCAKLSAgIHNwYWNlL3N1YnNwYWNlIGRpY3Rpb25hcmllcywgcmVsb2NhdGlvbiBzdHJlYW1zLCBldGMuICBCZWdpbgotICAgd3JpdGluZyBwYXJ0cyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNvbV9iZWdpbl93cml0aW5nIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQgPSAwOwotICBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3JlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIG51bV9zcGFjZXMsIG51bV9zdWJzcGFjZXMsIGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgdG90YWxfc3Vic3BhY2VzID0gMDsKLSAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXIgPSBOVUxMOwotCi0gIC8qIFRoZSBmaWxlIGhlYWRlciB3aWxsIGFsd2F5cyBiZSBmaXJzdCBpbiBhbiBvYmplY3QgZmlsZSwgCi0gICAgIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgaW4gcmFuZG9tIGxvY2F0aW9ucy4gIFRvIGtlZXAgdGhpbmdzCi0gICAgICJzaW1wbGUiIEJGRCB3aWxsIGxheSBvdXQgdGhlIG9iamVjdCBmaWxlIGluIHRoZSBtYW5uZXIgc3VnZ2VzdGVkCi0gICAgIGJ5IHRoZSBQUk8gQUJJIGZvciBQQS1SSVNDIFN5c3RlbXMuICAqLwotCi0gIC8qIEJlZm9yZSBhbnkgb3V0cHV0IGNhbiByZWFsbHkgYmVnaW4gb2Zmc2V0cyBmb3IgYWxsIHRoZSBtYWpvcgotICAgICBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUgbXVzdCBiZSBjb21wdXRlZC4gIFNvLCBzdGFydGluZwotICAgICB3aXRoIHRoZSBpbml0aWFsIGZpbGUgaGVhZGVyIGNvbXB1dGUgKGFuZCBzb21ldGltZXMgd3JpdGUpCi0gICAgIGVhY2ggcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi0gIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGZpbGUgaGVhZGVyLCBpdCdzIGNvbnRlbnRzIGFyZSBub3QgY29tcGxldGUKLSAgICAgeWV0LCBzbyBpdCBjYW4gbm90IGJlIHdyaXR0ZW4gYXQgdGhpcyB0aW1lLiAgKi8KLSAgY3VycmVudF9vZmZzZXQgKz0gc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKTsgIAotCi0gIC8qIEFueSBhdXhpbGlhcnkgaGVhZGVycyB3aWxsIGZvbGxvdyB0aGUgZmlsZSBoZWFkZXIuICBSaWdodCBub3cKLSAgICAgd2Ugc3VwcG9ydCBvbmx5IHRoZSBjb3B5cmlnaHQgYW5kIHZlcnNpb24gaGVhZGVycy4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgPSAwOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotICAgICAgLyogUGFydHMgb2YgdGhlIGV4ZWMgaGVhZGVyIHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyLCBzbwotCSBkZWxheSB3cml0aW5nIHRoZSBoZWFkZXIgaXRzZWxmLiAgRmlsbCBpbiB0aGUgZGVmYXVsdHMsCi0JIGFuZCB3cml0ZSBpdCBsYXRlci4gICovCi0gICAgICBjdXJyZW50X29mZnNldCArPSBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpOwotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZQotCSs9IHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcik7Ci0gICAgICBleGVjX2hlYWRlciA9IG9ial9zb21fZXhlY19oZHIgKGFiZmQpOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIudHlwZSA9IEVYRUNfQVVYX0lEOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIubGVuZ3RoID0gNDA7Ci0gICAgfQotICBpZiAob2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSB2ZXJzaW9uIHN0cmluZy4gICovCi0gICAgICBsZW4gPSBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPnVzZXJfc3RyaW5nLAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCksIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGNvcHlyaWdodCBzdHJpbmcuICAqLwotICAgICAgbGVuID0gb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+Y29weXJpZ2h0LAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTmV4dCBjb21lcyB0aGUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnM7IHdlIGhhdmUgbm8gaW5pdGlhbGl6YXRpb24KLSAgICAgcG9pbnRlcnMsIHNvIGN1cnJlbnQgb2Zmc2V0IGRvZXMgbm90IGNoYW5nZS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X3RvdGFsID0gMDsKLQotICAvKiBOZXh0IGFyZSB0aGUgc3BhY2UgcmVjb3Jkcy4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3BhY2UgcmVjb3Jkcy4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHNwYWNlcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgc3RyaW5nIHRhYmxlLAotICAgICBhbmQgdGhlIGluZGV4IGZvciBlYWNoIHNwYWNlIGludG8gdGhlIHN0cmluZyB0YWJsZSBpcyBjb21wdXRlZAotICAgICBiZWxvdy4gIFRoZXJlZm9yZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIHRoZSBzcGFjZSBoZWFkZXJzCi0gICAgIGF0IHRoaXMgdGltZS4gICovCi0gIG51bV9zcGFjZXMgPSBzb21fY291bnRfc3BhY2VzIChhYmZkKTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV90b3RhbCA9IG51bV9zcGFjZXM7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IG51bV9zcGFjZXMgKiBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0KLSAgLyogTmV4dCBhcmUgdGhlIHN1YnNwYWNlIHJlY29yZHMuICBUaGVzZSBhcmUgZml4ZWQgbGVuZ3RoIHJlY29yZHMuCi0KLSAgICAgQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3Vic3BhY2UgcmVjb3Jkcy4KLQotICAgICBBIHZhcmlldHkgaWYgZmllbGRzIGluIHRoZSBzdWJzcGFjZSByZWNvcmQgYXJlIHN0aWxsIHVua25vd24gYXQKLSAgICAgdGhpcyB0aW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSwgZml4dXAgc3RyZWFtIGxvY2F0aW9uL3NpemUsIGV0YykuICAqLwotICBudW1fc3Vic3BhY2VzID0gc29tX2NvdW50X3N1YnNwYWNlcyAoYWJmZCk7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zdWJzcGFjZV9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3Vic3BhY2VfdG90YWwgPSBudW1fc3Vic3BhY2VzOwotICBjdXJyZW50X29mZnNldCArPSBudW1fc3Vic3BhY2VzICogc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgaXMgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWVzLiAgV2Ugd2lsbAotICAgICBidWlsZCBhbmQgd3JpdGUgdGhlIHN0cmluZyB0YWJsZSBvbiB0aGUgZmx5LiAgQXQgdGhlIHNhbWUgdGltZQotICAgICB3ZSB3aWxsIGZpbGwgaW4gdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWUgaW5kZXggZmllbGRzLiAgKi8KLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIG5lZWRzIHRvIGJlIGFsaWduZWQgb24gYSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsKLQotICAvKiBNYXJrIHRoZSBvZmZzZXQgb2YgdGhlIHNwYWNlL3N1YnNwYWNlIHN0cmluZyB0YWJsZSBpbiB0aGUgCi0gICAgIGZpbGUgaGVhZGVyLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHNwYWNlIHN0cmluZ3MuICAqLwotICBpZiAoc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmc3RyaW5nc19zaXplKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVjb3JkIHRvdGFsIHN0cmluZyB0YWJsZSBzaXplIGluIHRoZSBoZWFkZXIgYW5kIHVwZGF0ZSB0aGUKLSAgICAgY3VycmVudCBvZmZzZXQuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2Vfc3RyaW5nc19zaXplID0gc3RyaW5nc19zaXplOwotICBjdXJyZW50X29mZnNldCArPSBzdHJpbmdzX3NpemU7Ci0KLSAgLyogTmV4dCBpcyB0aGUgY29tcGlsYXRpb24gdW5pdC4gKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl90b3RhbCA9IDA7Ci0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKSAKLSAgICB7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y29tcGlsZXJfdG90YWwgPSAxOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gQ09NUFVOSVRTWjsgCi0gICAgfQotCi0gIC8qIE5vdyBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIGxvYWRhYmxlIHN1YnNwYWNlcywgdGFraW5nCi0gICAgIGNhcmUgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgc3RheXMgcHJvcGVybHkgYWxpZ25lZC4gICovCi0KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotICAgICAgaW50IGZpcnN0X3N1YnNwYWNlOwotICAgICAgdW5zaWduZWQgaW50IHN1YnNwYWNlX29mZnNldCA9IDA7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMTsKLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBpbiB0aGUgc3BhY2UsIGFuZCB3ZSBhcmUKLQkgICAgIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHRoZW4gdGFrZSBjYXJlIHRvIG1ha2Ugc3VyZSBhbGwKLQkgICAgIHRoZSBhbGlnbm1lbnRzIGFyZSBjb3JyZWN0IGFuZCB1cGRhdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLQkgIGlmIChmaXJzdF9zdWJzcGFjZQotCSAgICAgICYmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkpCi0JICAgIHsKLQkgICAgICAvKiBEZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMgaGF2ZSBlYWNoIHNwYWNlIGFsaWduZWQgdG8gYQotCQkgcGFnZSBib3VuZGFyeS4gIFNoYXJhYmxlIGV4ZWN1dGFibGVzICh3cml0ZS1wcm90ZWN0ZWQKLQkJIHRleHQpIGhhdmUganVzdCB0aGUgcHJpdmF0ZSAoYWthIGRhdGEgJiBic3MpIHNwYWNlIGFsaWduZWQKLQkJIHRvIGEgcGFnZSBib3VuZGFyeS4gIFVnaC4gIE5vdCB0cnVlIGZvciBIUFVYLgotCi0JCSBUaGUgSFBVWCBrZXJuZWwgcmVxdWlyZXMgdGhlIHRleHQgdG8gYWx3YXlzIGJlIHBhZ2UgYWxpZ25lZAotCQkgd2l0aGluIHRoZSBmaWxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGV4ZWN1dGFibGUncyB0eXBlLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRF9QQUdFRCB8IERZTkFNSUMpCi0JCSAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCi0JCSAgfHwgKChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JCSAgICAgICYmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKSkpCi0JCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0JICAgICAgLyogVXBkYXRlIHRoZSBleGVjIGhlYWRlci4gICovCi0JICAgICAgaWYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUgJiYgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPT0gMCkKLQkJewotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX3RtZW0gPSBzZWN0aW9uLT52bWE7Ci0JCSAgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPSBjdXJyZW50X29mZnNldDsKLQkJfQotCSAgICAgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBICYmIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID09IDApCi0JCXsKLQkJICBleGVjX2hlYWRlci0+ZXhlY19kbWVtID0gc2VjdGlvbi0+dm1hOwotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID0gY3VycmVudF9vZmZzZXQ7Ci0JCX0KLQotCSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgZXhhY3RseSB3aGVyZSB3ZSBhcmUgd2l0aGluIGEgcGFydGljdWxhcgotCQkgc3BhY2UuICBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGUgYnJhaW5kYW1hZ2VkIEhQVVgKLQkJIGxvYWRlciB3aWxsIGNyZWF0ZSBob2xlcyBiZXR3ZWVuIHN1YnNwYWNlcyAqYW5kKiAKLQkJIHN1YnNwYWNlIGFsaWdubWVudHMgYXJlICpOT1QqIHByZXNlcnZlZC4gIFdoYXQgYSBjcm9jay4gICovCi0JICAgICAgc3Vic3BhY2Vfb2Zmc2V0ID0gc3Vic2VjdGlvbi0+dm1hOwotCi0JICAgICAgLyogT25seSBkbyB0aGlzIGZvciB0aGUgZmlyc3Qgc3Vic3BhY2Ugd2l0aGluIGVhY2ggc3BhY2UuICAqLwotCSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgYnJhaW5kYW1hZ2VkIEhQVVggbG9hZGVyIG1heSBoYXZlIGNyZWF0ZWQgYSBob2xlCi0JCSBiZXR3ZWVuIHR3byBzdWJzcGFjZXMuICBJdCBpcyAqbm90KiBzdWZmaWNpZW50IHRvIHVzZQotCQkgdGhlIGFsaWdubWVudCBzcGVjaWZpY2F0aW9ucyB3aXRoaW4gdGhlIHN1YnNwYWNlcyB0bwotCQkgYWNjb3VudCBmb3IgdGhlc2UgaG9sZXMgLS0gSSd2ZSBydW4gaW50byBhdCBsZWFzdCBvbmUKLQkJIGNhc2Ugd2hlcmUgdGhlIGxvYWRlciBsZWZ0IG9uZSBjb2RlIHN1YnNwYWNlIHVuYWxpZ25lZAotCQkgaW4gYSBmaW5hbCBleGVjdXRhYmxlLgotCi0JCSBUbyBjb21iYXQgdGhpcyB3ZSBrZWVwIGEgY3VycmVudCBvZmZzZXQgd2l0aGluIGVhY2ggc3BhY2UsCi0JCSBhbmQgdXNlIHRoZSBzdWJzcGFjZSB2bWEgZmllbGRzIHRvIGRldGVjdCBhbmQgcHJlc2VydmUKLQkJIGhvbGVzLiAgV2hhdCBhIGNyb2NrIQotCi0JCSBwcy4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdW5sb2FkYWJsZSBzcGFjZS9zdWJzcGFjZXMuICAqLwotCSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKLQkgICAgICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBzdWJzZWN0aW9uLT52bWEgLSBzdWJzcGFjZV9vZmZzZXQ7Ci0JICAgIH0KLQotCi0JICBzdWJzZWN0aW9uLT50YXJnZXRfaW5kZXggPSB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIC8qIFRoaXMgaXMgcmVhbCBkYXRhIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBmaWxlLiAgKi8KLQkgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBjb2RlICYgZGF0YS4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgJiYgc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgICAgICAmJiBzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKQotCQlleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBzdWJzZWN0aW9uLT5maWxlcG9zID0gY3VycmVudF9vZmZzZXQ7Ci0JICAgICAgY3VycmVudF9vZmZzZXQgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7IAotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsKLQkgICAgfQotCSAgLyogTG9va3MgbGlrZSB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBic3Mgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCQlleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0KLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IDA7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPgotCQlpbml0aWFsaXphdGlvbl9sZW5ndGggPSAwOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogRmluYWxseSBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuCi0gICAgIElmIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHN0YXJ0IHRoZSB1bmxvYWRhYmxlIHN0dWZmIG9uIGl0cwotICAgICBvd24gcGFnZS4gICovCi0KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLwotICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgc3Vic2VjdGlvbiAhPSBOVUxMOwotCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotCXsKLQkgIAotCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCi0JICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCi0JICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3Vic2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdG90YWxfc3Vic3BhY2VzKys7Ci0JICAvKiBUaGlzIGlzIHJlYWwgZGF0YSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgZmlsZS4gICovCi0JICBpZiAoKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IGN1cnJlbnRfb2Zmc2V0OwotCSAgICAgIHN1YnNlY3Rpb24tPmZpbGVwb3MgPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBjdXJyZW50X29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsgCi0JICAgIH0KLQkgIC8qIExvb2tzIGxpa2UgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlCi0JCT0gMDsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Ci0JCWluaXRpYWxpemF0aW9uX2xlbmd0aCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogSWYgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgdGhlbiBtYWtlIHN1cmUgdG8gc2VlayB0byBhbmQgd3JpdGUKLSAgICAgb25lIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBtYWtlIHN1cmUgYW55IG5lY2Vzc2FyeQotICAgICB6ZXJvcyBhcmUgZmlsbGVkIGluLiAgVWdoLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0IC0gMSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICIiLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+dW5sb2FkYWJsZV9zcF9zaXplCi0gICAgPSBjdXJyZW50X29mZnNldCAtIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uOwotCi0gIC8qIExvYWRlciBmaXh1cHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYW55IHdheSBzaGFwZSBvciBmb3JtLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmxvYWRlcl9maXh1cF9sb2NhdGlvbiA9IDA7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5sb2FkZXJfZml4dXBfdG90YWwgPSAwOwotCi0gIC8qIERvbmUuICBTdG9yZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgU09NIHNvIGZhci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmFsbHksIHNjcmliYmxlIG91dCB0aGUgdmFyaW91cyBoZWFkZXJzIHRvIHRoZSBkaXNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9maW5pc2hfd3JpdGluZyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbnVtX3NwYWNlcyA9IHNvbV9jb3VudF9zcGFjZXMgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGludCBpLCBudW1fc3ltcywgc3RyaW5nc19zaXplOwotICBpbnQgc3Vic3BhY2VfaW5kZXggPSAwOwotICBmaWxlX3B0ciBsb2NhdGlvbjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9yZWxvY19zaXplOwotCi0gIC8qIE5leHQgaXMgdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHJvb20gaXMgbmVlZGVkCi0gICAgIGluIHRoZSBvYmplY3QgZmlsZSBmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHN5bWJvbHMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIHN0cmluZyB0YWJsZSwKLSAgICAgYW5kIHRoZSBpbmRleCBmb3IgZWFjaCBzeW1ib2wgbmFtZSBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaXMgY29tcHV0ZWQKLSAgICAgYmVsb3cuICBUaGVyZWZvcmUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIGF0IHRoaXMgdGltZS4gCi0KLSAgICAgVGhlc2UgdXNlZCB0byBiZSBvdXRwdXQgYmVmb3JlIHRoZSBzdWJzcGFjZSBjb250ZW50cywgYnV0IHRoZXkKLSAgICAgd2VyZSBtb3ZlZCBoZXJlIHRvIHdvcmsgYXJvdW5kIGEgc3R1cGlkIGJ1ZyBpbiB0aGUgaHB1eCBsaW5rZXIKLSAgICAgKGZpeGVkIGluIGhwdXgxMCkuICAqLwotICBjdXJyZW50X29mZnNldCA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOyAKLQotICBudW1fc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfdG90YWwgPSBudW1fc3ltczsKLSAgY3VycmVudF9vZmZzZXQgKz0gbnVtX3N5bXMgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgYXJlIHRoZSBzeW1ib2wgc3RyaW5ncy4KLSAgICAgQWxpZ24gdGhlbSB0byBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmdzLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHN5bXMsCi0JCQkJbnVtX3N5bXMsICZzdHJpbmdzX3NpemUsCi0JCQkJb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWNvcmQgdG90YWwgc3RyaW5nIHRhYmxlIHNpemUgaW4gaGVhZGVyIGFuZCB1cGRhdGUgdGhlCi0gICAgIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9zdHJpbmdzX3NpemUgPSBzdHJpbmdzX3NpemU7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IHN0cmluZ3Nfc2l6ZTsKLQotICAvKiBEbyBwcmVwIHdvcmsgYmVmb3JlIGhhbmRsaW5nIGZpeHVwcy4gICovCi0gIHNvbV9wcmVwX2Zvcl9maXh1cHMgKGFiZmQsCi0JCSAgICAgICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpLAotCQkgICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCi0gIC8qIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgdGhlIGZpeHVwIHN0cmVhbSB3aGljaCBzdGFydHMgb24gYQotICAgICB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsgCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgLyogV3JpdGUgdGhlIGZpeHVwcyBhbmQgdXBkYXRlIGZpZWxkcyBpbiBzdWJzcGFjZSBoZWFkZXJzIHdoaWNoCi0gICAgIHJlbGF0ZSB0byB0aGUgZml4dXAgc3RyZWFtLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9maXh1cHMgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmdG90YWxfcmVsb2Nfc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlY29yZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZml4dXAgc3RyZWFtIGluIHRoZSBmaWxlIGhlYWRlci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X3RvdGFsID0gdG90YWxfcmVsb2Nfc2l6ZTsKLQotICAvKiBEb25lLiAgU3RvcmUgdGhlIHRvdGFsIHNpemUgb2YgdGhlIFNPTS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQgKyB0b3RhbF9yZWxvY19zaXplOwotIAotICAvKiBOb3cgdGhhdCB0aGUgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGlzIGNvbXBsZXRlLCBidWlsZCBhbmQKLSAgICAgd3JpdGUgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN1YnNwYWNlcyBhcmUgd3JpdHRlbiBmaXJzdCBzbyB0aGF0IHdlIGNhbiBzZXQgdXAgaW5mb3JtYXRpb24KLSAgICAgYWJvdXQgdGhlbSBpbiB0aGVpciBjb250YWluaW5nIHNwYWNlcyBhcyB0aGUgc3Vic3BhY2UgaXMgd3JpdHRlbi4gICovCi0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4gICovCi0gIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN1YnNwYWNlX2xvY2F0aW9uOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBsb2FkYWJsZSBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZQotCSAgICAgb3Igc3Vic3BhY2UuICBPciBkb2VzIG5vdCBoYXZlIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUKLQkgICAgIGhhcyBubyByZWFsIGJpdHMgb24gdGhlIGRpc2spLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKQotCSAgICAgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN1YnNwYWNlIGZvciB0aGlzIHNwYWNlLCB0aGVuIHNhdmUKLQkgICAgIHRoZSBpbmRleCBvZiB0aGUgc3Vic3BhY2UgaW4gaXRzIGNvbnRhaW5pbmcgc3BhY2UuICBBbHNvCi0JICAgICBzZXQgImlzX2xvYWRhYmxlIiBpbiB0aGUgY29udGFpbmluZyBzcGFjZS4gICovCi0KLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19sb2FkYWJsZSA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX2luZGV4Ci0JCT0gc3Vic3BhY2VfaW5kZXg7Ci0JICAgIH0KLQotCSAgLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhY2VzIHNlZW4gYW5kIHRoZSBudW1iZXIgb2YKLQkgICAgIHN1YnNwYWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KLQkgIHN1YnNwYWNlX2luZGV4Kys7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQotCSAgLyogTWFyayB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3BhY2Ugd2l0aGluIHRoZSBzdWJzcGFjZSdzCi0JICAgICBkaWN0aW9uYXJ5IHJlY29yZC4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3BhY2VfaW5kZXggPSBpOwotCSAgCi0JICAvKiBEdW1wIHRoZSBjdXJyZW50IHN1YnNwYWNlIGhlYWRlci4gICovCi0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdCwKLQkJCSBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCksIDEsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogTm93IHJlcGVhdCB0aGUgcHJvY2VzcyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuICAqLwotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZSBvcgotCSAgICAgc3Vic3BhY2UsIG9yIHdoaWNoIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUgaGFuZGxlZAotCSAgICAgaW4gdGhlIGxvYWRhYmxlIHNwYWNlcy9zdWJzcGFjZXMgY29kZSBhYm92ZSkuICAqLwotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSwgdGhlbiBzYXZlCi0JICAgICB0aGUgaW5kZXggb2YgdGhlIHN1YnNwYWNlIGluIGl0cyBjb250YWluaW5nIHNwYWNlLiAgQ2xlYXIKLQkgICAgICJpc19sb2FkYWJsZSIuICAqLwotCi0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5ID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAwOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9pbmRleAotCQk9IHN1YnNwYWNlX2luZGV4OwotCSAgICB9Ci0KLQkgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHN1YnNwYWNlcyBzZWVuIGFuZCB0aGUgbnVtYmVyIG9mCi0JICAgICBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgY3VycmVudCBzcGFjZS4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQkgIHN1YnNwYWNlX2luZGV4Kys7IAotCi0JICAvKiBNYXJrIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzcGFjZSB3aXRoaW4gdGhlIHN1YnNwYWNlJ3MKLQkgICAgIGRpY3Rpb25hcnkgcmVjb3JkLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zcGFjZV9pbmRleCA9IGk7Ci0JICAKLQkgIC8qIER1bXAgdGhpcyBzdWJzcGFjZSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QsCi0JCQkgc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCi0gICAgfQotCi0gIC8qIEFsbCB0aGUgc3Vic3BhY2UgZGljdGlvbmRhcnkgcmVjb3JkcyBhcmUgd3JpdHRlbiwgYW5kIGFsbCB0aGUKLSAgICAgZmllbGRzIGFyZSBzZXQgdXAgaW4gdGhlIHNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4KLQotICAgICBTZWVrIHRvIHRoZSByaWdodCBsb2NhdGlvbiBhbmQgc3RhcnQgd3JpdGluZyB0aGUgc3BhY2UKLSAgICAgZGljdGlvbmFyeSByZWNvcmRzLiAgKi8KLSAgbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfbG9jYXRpb247Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgbG9jYXRpb24sIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIER1bXAgaXRzIGhlYWRlciAgKi8KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LAotCQkgICAgIHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVjb3JkIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKQotICAgIHsKLSAgICAgIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLAotCQkgICAgIENPTVBVTklUU1osIDEsIGFiZmQpICE9IENPTVBVTklUU1opCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2V0dGluZyBvZiB0aGUgc3lzdGVtX2lkIGhhcyB0byBoYXBwZW4gdmVyeSBsYXRlIG5vdyB0aGF0IGNvcHlpbmcgb2YKLSAgICAgQkZEIHByaXZhdGUgZGF0YSBoYXBwZW5zICphZnRlciogc2VjdGlvbiBjb250ZW50cyBhcmUgc2V0LiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+c3lzdGVtX2lkOwotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IHBhMjApCi0gICAgb2JqX3NvbV9maWxlX2hkcihhYmZkKS0+c3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MyXzA7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gcGExMSkKLSAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzFfMTsKLSAgZWxzZQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8wOwotCi0gIC8qIENvbXB1dGUgdGhlIGNoZWNrc3VtIGZvciB0aGUgZmlsZSBoZWFkZXIganVzdCBiZWZvcmUgd3JpdGluZwotICAgICB0aGUgaGVhZGVyIHRvIGRpc2suICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y2hlY2tzdW0gPSBzb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCk7Ci0KLSAgLyogT25seSB0aGluZyBsZWZ0IHRvIGRvIGlzIHdyaXRlIG91dCB0aGUgZmlsZSBoZWFkZXIuICBJdCBpcyBhbHdheXMKLSAgICAgYXQgbG9jYXRpb24gemVyby4gIFNlZWsgdGhlcmUgYW5kIHdyaXRlIGl0LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKSwKLQkJIHNpemVvZiAoc3RydWN0IGhlYWRlciksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIHsKLSAgICAgIGxvbmcgdG1wLCBzb21fbGVuZ3RoOwotICAgICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXI7Ci0KLSAgICAgIGV4ZWNfaGVhZGVyID0gb2JqX3NvbV9leGVjX2hkciAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19mbGFncyA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFnczsKLQotICAgICAgLyogT2ggam95cy4gIFJhbSBzb21lIG9mIHRoZSBCU1MgZGF0YSBpbnRvIHRoZSBEQVRBIHNlY3Rpb24KLQkgdG8gYmUgY29tcGF0YWJsZSB3aXRoIGhvdyB0aGUgaHAgbGlua2VyIG1ha2VzIG9iamVjdHMKLQkgKHNhdmVzIG1lbW9yeSBzcGFjZSkuICAqLwotICAgICAgdG1wID0gZXhlY19oZWFkZXItPmV4ZWNfZHNpemU7Ci0gICAgICB0bXAgPSBTT01fQUxJR04gKHRtcCwgUEFfUEFHRVNJWkUpOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgLT0gKHRtcCAtIGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplKTsKLSAgICAgIGlmIChleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSA8IDApCi0JZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgPSAwOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPSB0bXA7Ci0KLSAgICAgIC8qIE5vdyBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcy4gIFRoZSBpZGVhIGlzIHRvIGNhdGNoIGJvZ29ucyBub3cgYW5kCi0JIGluZm9ybSB0aGUgdXNlciwgaW5zdGVhZCBvZiBzaWxlbnRseSBnZW5lcmF0aW5nIGEgYm9ndXMgZmlsZS4gICovCi0gICAgICBzb21fbGVuZ3RoID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNvbV9sZW5ndGg7Ci0gICAgICBpZiAoZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgKyBleGVjX2hlYWRlci0+ZXhlY190c2l6ZSA+IHNvbV9sZW5ndGgKLQkgIHx8IGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlICsgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPiBzb21fbGVuZ3RoKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9sb2NhdGlvbiwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBleGVjX2hlYWRlciwgQVVYX0hEUl9TSVpFLCAxLCBhYmZkKQotCSAgIT0gQVVYX0hEUl9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGNoZWNrc3VtIGZvciBhIFNPTSBmaWxlIGhlYWRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIGNoZWNrc3VtLCBjb3VudCwgaTsKLSAgdW5zaWduZWQgbG9uZyAqYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcgKikgb2JqX3NvbV9maWxlX2hkciAoYWJmZCk7Ci0KLSAgY2hlY2tzdW0gPSAwOwotICBjb3VudCA9IHNpemVvZiAoc3RydWN0IGhlYWRlcikgLyBzaXplb2YgKHVuc2lnbmVkIGxvbmcpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICBjaGVja3N1bSBePSAqKGJ1ZmZlciArIGkpOwotCi0gIHJldHVybiBjaGVja3N1bTsKLX0KLQotc3RhdGljIHZvaWQKLXNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGFiZmQsIHN5bSwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyAqaW5mbzsKLXsKLSAgLyogSW5pdGlhbGl6ZS4gICovCi0gIG1lbXNldCAoaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8pKTsKLQotICAvKiBUaGUgSFAgU09NIGxpbmtlciByZXF1aXJlcyBkZXRhaWxlZCB0eXBlIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgIGFsbCBzeW1ib2xzIChpbmNsdWRpbmcgdW5kZWZpbmVkIHN5bWJvbHMhKS4gIFVuZm9ydHVuYXRlbHksCi0gICAgIHRoZSB0eXBlIHNwZWNpZmllZCBpbiBhbiBpbXBvcnQvZXhwb3J0IHN0YXRlbWVudCBkb2VzIG5vdAotICAgICBhbHdheXMgbWF0Y2ggd2hhdCB0aGUgbGlua2VyIHdhbnRzLiAgU2V2ZXJlIGJyYWluZGFtYWdlLiAgKi8KLQkgCi0gIC8qIFNlY3Rpb24gc3ltYm9scyB3aWxsIG5vdCBoYXZlIGEgU09NIHN5bWJvbCB0eXBlIGFzc2lnbmVkIHRvCi0gICAgIHRoZW0geWV0LiAgQXNzaWduIGFsbCBzZWN0aW9uIHN5bWJvbHMgdHlwZSBTVF9EQVRBLiAgKi8KLSAgaWYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICBlbHNlCi0gICAgewotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbXVzdCBoYXZlIHNjb3BlIFNTX1VOU0FUIGFuZCB0eXBlCi0JIFNUX1NUT1JBR0Ugb3IgdGhlIGxpbmtlciB3aWxsIGNob2tlLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JewotCSAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfVU5TQVQ7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1NUT1JBR0U7Ci0JfQotCi0gICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3ltYm9sIHdpdGhvdXQgYW4gYXNzb2NpYXRlZAotCSB0eXBlLiAgVGhpcyBoYXBwZW5zIGlmIHRoZSB1c2VyIGltcG9ydGVkIHRoZSBzeW1ib2wKLQkgd2l0aG91dCBhIHR5cGUgYW5kIHRoZSBzeW1ib2wgd2FzIG5ldmVyIGRlZmluZWQKLQkgbG9jYWxseS4gIElmIEJTRl9GVU5DVElPTiBpcyBzZXQgZm9yIHRoaXMgc3ltYm9sLCB0aGVuCi0JIGFzc2lnbiBpdCB0eXBlIFNUX0NPREUgKHRoZSBIUCBsaW5rZXIgcmVxdWlyZXMgdW5kZWZpbmVkCi0JIGV4dGVybmFsIGZ1bmN0aW9ucyB0byBoYXZlIHR5cGUgU1RfQ09ERSByYXRoZXIgdGhhbiBTVF9FTlRSWSkuICAqLwotICAgICAgZWxzZSBpZiAoKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTgotCQl8fCBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0NPREUpCi0JICAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgICAgICAmJiBzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfQ09ERTsKLQotICAgICAgLyogSGFuZGxlIGZ1bmN0aW9uIHN5bWJvbHMgd2hpY2ggd2VyZSBkZWZpbmVkIGluIHRoaXMgZmlsZS4KLQkgVGhleSBzaG91bGQgaGF2ZSB0eXBlIFNUX0VOVFJZLiAgQWxzbyByZXRyaWV2ZSB0aGUgYXJndW1lbnQKLQkgcmVsb2NhdGlvbiBiaXRzIGZyb20gdGhlIFNPTSBiYWNrZW5kIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfRU5UUlkKLQkgICAgICAgfHwgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERQotCQkgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikpCi0JICAgICAgIHx8IChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KLQkJICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKSkKLQl7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0VOVFJZOwotCSAgaW5mby0+YXJnX3JlbG9jID0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jOwotCSAgaW5mby0+cHJpdl9sZXZlbD0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbDsKLQl9Ci0KLSAgICAgIC8qIEZvciB1bmtub3duIHN5bWJvbHMgc2V0IHRoZSBzeW1ib2wncyB0eXBlIGJhc2VkIG9uIHRoZSBzeW1ib2wncwotCSBzZWN0aW9uIChTVF9EQVRBIGZvciBEQVRBIHNlY3Rpb25zLCBTVF9DT0RFIGZvciBDT0RFIHNlY3Rpb25zKS4gICovCi0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04pCi0JewotCSAgaWYgKHN5bS0+c2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9DT0RFOwotCSAgZWxzZQotCSAgICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0JfQotICAKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTikKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0KLSAgICAgIC8qIEZyb20gbm93IG9uIGl0J3MgYSB2ZXJ5IHNpbXBsZSBtYXBwaW5nLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQUJTT0xVVEUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9BQlNPTFVURTsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERSkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0NPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0RBVEEpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9NSUxMSUNPREUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9NSUxMSUNPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1BMQUJFTCkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1BMQUJFTDsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfUFJJX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9QUklfUFJPRzsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfU0VDX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9TRUNfUFJPRzsKLSAgICB9Ci0JCi0gIC8qIE5vdyBoYW5kbGUgdGhlIHN5bWJvbCdzIHNjb3BlLiAgRXhwb3J0ZWQgZGF0YSB3aGljaCBpcyBub3QKLSAgICAgaW4gdGhlIGNvbW1vbiBzZWN0aW9uIGhhcyBzY29wZSBTU19VTklWRVJTQUwuICBOb3RlIHNjb3BlCi0gICAgIG9mIGNvbW1vbiBzeW1ib2xzIHdhcyBoYW5kbGVkIGVhcmxpZXIhICAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotICAgIGluZm8tPnN5bWJvbF9zY29wZSA9IFNTX1VOU0FUOwotICBlbHNlIGlmIChzeW0tPmZsYWdzICYgQlNGX0VYUE9SVCAmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19VTklWRVJTQUw7Ci0gIC8qIEFueXRoaW5nIGVsc2Ugd2hpY2ggaXMgbm90IGluIHRoZSBjb21tb24gc2VjdGlvbiBoYXMgc2NvcGUKLSAgICAgU1NfTE9DQUwuICAqLwotICBlbHNlIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19MT0NBTDsKLQotICAvKiBOb3cgc2V0IHRoZSBzeW1ib2xfaW5mbyBmaWVsZC4gIEl0IGhhcyBubyByZWFsIG1lYW5pbmcKLSAgICAgZm9yIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9scywgYnV0IHRoZSBIUCBsaW5rZXIgd2lsbAotICAgICBjaG9rZSBpZiBpdCdzIG5vdCBzZXQgdG8gc29tZSAicmVhc29uYWJsZSIgdmFsdWUuICBXZQotICAgICB1c2UgemVybyBhcyBhIHJlYXNvbmFibGUgdmFsdWUuICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IDA7Ci0gIC8qIEZvciBhbGwgb3RoZXIgc3ltYm9scywgdGhlIHN5bWJvbF9pbmZvIGZpZWxkIGNvbnRhaW5zIHRoZSAKLSAgICAgc3Vic3BhY2UgaW5kZXggb2YgdGhlIHNwYWNlIHRoaXMgc3ltYm9sIGlzIGNvbnRhaW5lZCBpbi4gICovCi0gIGVsc2UKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IHN5bS0+c2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCi0gIC8qIFNldCB0aGUgc3ltYm9sJ3MgdmFsdWUuICAqLwotICBpbmZvLT5zeW1ib2xfdmFsdWUgPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWE7Ci0KLSAgLyogVGhlIHNlY29uZGFyeV9kZWYgZmllbGQgaXMgZm9yIHdlYWsgc3ltYm9scy4gICovCi0gIGlmIChzeW0tPmZsYWdzICYgQlNGX1dFQUspCi0gICAgaW5mby0+c2Vjb25kYXJ5X2RlZiA9IHRydWU7Ci0gIGVsc2UKLSAgICBpbmZvLT5zZWNvbmRhcnlfZGVmID0gZmFsc2U7Ci0KLX0KLQotLyogQnVpbGQgYW5kIHdyaXRlLCBpbiBvbmUgYmlnIGNodW5rLCB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZSBmb3IKLSAgIHRoaXMgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1fc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBmaWxlX3B0ciBzeW10YWJfbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX2xvY2F0aW9uOwotICBhc3ltYm9sICoqYmZkX3N5bXMgPSBvYmpfc29tX3NvcnRlZF9zeW1zIChhYmZkKTsKLSAgc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqc29tX3N5bXRhYiA9IE5VTEw7Ci0gIGludCBpLCBzeW10YWJfc2l6ZTsKLQotICAvKiBDb21wdXRlIHRvdGFsIHN5bWJvbCB0YWJsZSBzaXplIGFuZCBhbGxvY2F0ZSBhIGNodW5rIG9mIG1lbW9yeQotICAgICB0byBob2xkIHRoZSBzeW1ib2wgdGFibGUgYXMgd2UgYnVpbGQgaXQuICAqLwotICBzeW10YWJfc2l6ZSA9IG51bV9zeW1zICogc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkKTsKLSAgc29tX3N5bXRhYiA9IChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICopIGJmZF9tYWxsb2MgKHN5bXRhYl9zaXplKTsKLSAgaWYgKHNvbV9zeW10YWIgPT0gTlVMTCAmJiBzeW10YWJfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKHNvbV9zeW10YWIsIDAsIHN5bXRhYl9zaXplKTsKLQotICAvKiBXYWxrIG92ZXIgZWFjaCBzeW1ib2wuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gaW5mbzsKLQotICAgICAgLyogVGhpcyBpcyByZWFsbHkgYW4gaW5kZXggaW50byB0aGUgc3ltYm9sIHN0cmluZ3MgdGFibGUuICAKLQkgQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUsIHRoZSBpbmRleCBoYXMgYWxyZWFkeSBiZWVuIAotCSBjb21wdXRlZCBhbmQgc3RvcmVkIGludG8gdGhlIG5hbWUgZmllbGQgaW4gdGhlIEJGRCBzeW1ib2wuICAqLwotICAgICAgc29tX3N5bXRhYltpXS5uYW1lLm5fc3RyeCA9IHNvbV9zeW1ib2xfZGF0YShiZmRfc3ltc1tpXSktPnN0cmluZ3RhYl9vZmZzZXQ7Ci0KLSAgICAgIC8qIERlcml2ZSBTT00gaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIHN5bWJvbC4gICovCi0gICAgICBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChhYmZkLCBiZmRfc3ltc1tpXSwgJmluZm8pOwotCi0gICAgICAvKiBOb3cgdXNlIGl0LiAgKi8KLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX3R5cGUgPSBpbmZvLnN5bWJvbF90eXBlOwotICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfc2NvcGUgPSBpbmZvLnN5bWJvbF9zY29wZTsKLSAgICAgIHNvbV9zeW10YWJbaV0uYXJnX3JlbG9jID0gaW5mby5hcmdfcmVsb2M7Ci0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF9pbmZvID0gaW5mby5zeW1ib2xfaW5mbzsKLSAgICAgIHNvbV9zeW10YWJbaV0ueGxlYXN0ID0gMzsKLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX3ZhbHVlID0gaW5mby5zeW1ib2xfdmFsdWUgfCBpbmZvLnByaXZfbGV2ZWw7Ci0gICAgICBzb21fc3ltdGFiW2ldLnNlY29uZGFyeV9kZWYgPSBpbmZvLnNlY29uZGFyeV9kZWY7Ci0gICAgfQotCi0gIC8qIEV2ZXJ5dGhpbmcgaXMgcmVhZHksIHNlZWsgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uIGFuZAotICAgICBzY3JpYmJsZSBvdXQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2xvY2F0aW9uLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3N5bXRhYiwgc3ltdGFiX3NpemUsIDEsIGFiZmQpICE9IHN5bXRhYl9zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChzb21fc3ltdGFiICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX3N5bXRhYik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHNvbV9zeW10YWIgIT0gTlVMTCkKLSAgICBmcmVlIChzb21fc3ltdGFiKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgaW4gU09NIGZvcm1hdC4gICovICAKLQotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogU2V0IHVwIGZpeGVkIHBhcnRzIG9mIHRoZSBmaWxlLCBzcGFjZSwgYW5kIHN1YnNwYWNlIGhlYWRlcnMuCi0JIE5vdGlmeSB0aGUgd29ybGQgdGhhdCBvdXRwdXQgaGFzIGJlZ3VuLiAgKi8KLSAgICAgIHNvbV9wcmVwX2hlYWRlcnMgKGFiZmQpOwotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgICAvKiBTdGFydCB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaW5jbHVkZSBhbGwgdGhlIHN0cmluZwotCSB0YWJsZXMsIGZpeHVwIHN0cmVhbXMsIGFuZCBvdGhlciBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgc29tX2JlZ2luX3dyaXRpbmcgKGFiZmQpOwotICAgIH0KLQotICByZXR1cm4gKHNvbV9maW5pc2hfd3JpdGluZyAoYWJmZCkpOwotfQotCi0MCi0vKiBSZWFkIGFuZCBzYXZlIHRoZSBzdHJpbmcgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NsdXJwX3N0cmluZ190YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpzdHJpbmd0YWI7Ci0KLSAgLyogVXNlIHRoZSBzYXZlZCB2ZXJzaW9uIGlmIGl0cyBhdmFpbGFibGUuICAqLwotICBpZiAob2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSSBkb24ndCB0aGluayB0aGlzIGNhbiBjdXJyZW50bHkgaGFwcGVuLCBhbmQgSSdtIG5vdCBzdXJlIGl0IHNob3VsZAotICAgICByZWFsbHkgYmUgYW4gZXJyb3IsIGJ1dCBpdCdzIGJldHRlciB0aGFuIGdldHRpbmcgdW5wcmVkaWN0YWJsZSByZXN1bHRzCi0gICAgIGZyb20gdGhlIGhvc3QncyBtYWxsb2Mgd2hlbiBwYXNzZWQgYSBzaXplIG9mIHplcm8uICAqLwotICBpZiAob2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuZCByZWFkIGluIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBzdHJpbmd0YWIgPSBiZmRfbWFsbG9jIChvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSk7Ci0gIGlmIChzdHJpbmd0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1lbXNldCAoc3RyaW5ndGFiLCAwLCBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX3N0cl9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBpZiAoYmZkX3JlYWQgKHN0cmluZ3RhYiwgb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCksIDEsIGFiZmQpCi0gICAgICAhPSBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2F2ZSBvdXIgcmVzdWx0cyBhbmQgcmV0dXJuIHN1Y2Nlc3MuICovCi0gIG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSA9IHN0cmluZ3RhYjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgKGluIGJ5dGVzKSByZXF1aXJlZCB0byBob2xkIHRoZSBzeW1ib2wKLSAgIHRhYmxlIGZvciB0aGlzIG9iamVjdC4gICovCi0KLXN0YXRpYyBsb25nCi1zb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIXNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChhc3ltYm9sICopKTsKLX0KLQotLyogQ29udmVydCBmcm9tIGEgU09NIHN1YnNwYWNlIGluZGV4IHRvIGEgQkZEIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIChhYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqc3ltYm9sOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAvKiBUaGUgbWVhbmluZyBvZiB0aGUgc3ltYm9sX2luZm8gZmllbGQgY2hhbmdlcyBmb3IgZnVuY3Rpb25zCi0gICAgIHdpdGhpbiBleGVjdXRhYmxlcy4gIFNvIG9ubHkgdXNlIHRoZSBxdWljayBzeW1ib2xfaW5mbyBtYXBwaW5nIGZvcgotICAgICBpbmNvbXBsZXRlIG9iamVjdHMgYW5kIG5vbi1mdW5jdGlvbiBzeW1ib2xzIGluIGV4ZWN1dGFibGVzLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMAotICAgICAgfHwgKHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfRU5UUlkKLQkgICYmIHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfUFJJX1BST0cKLQkgICYmIHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfU0VDX1BST0cKLQkgICYmIHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfTUlMTElDT0RFKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBzeW1ib2wtPnN5bWJvbF9pbmZvOwotICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JaWYgKHNlY3Rpb24tPnRhcmdldF9pbmRleCA9PSBpbmRleCAmJiBzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCSAgcmV0dXJuIHNlY3Rpb247Ci0KLSAgICAgIC8qIENvdWxkIGJlIGEgc3ltYm9sIGZyb20gYW4gZXh0ZXJuYWwgbGlicmFyeSAoc3VjaCBhcyBhbiBPTU9TCi0JIHNoYXJlZCBsaWJyYXJ5KS4gIERvbid0IGFib3J0LiAgKi8KLSAgICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gc3ltYm9sLT5zeW1ib2xfdmFsdWU7Ci0KLSAgICAgIC8qIEZvciBleGVjdXRhYmxlcyB3ZSB3aWxsIGhhdmUgdG8gdXNlIHRoZSBzeW1ib2wncyBhZGRyZXNzIGFuZAotCSBmaW5kIG91dCB3aGF0IHNlY3Rpb24gd291bGQgY29udGFpbiB0aGF0IGFkZHJlc3MuICAgWXVrLiAgKi8KLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpZiAodmFsdWUgPj0gc2VjdGlvbi0+dm1hCi0JICAgICAgJiYgdmFsdWUgPD0gc2VjdGlvbi0+dm1hICsgc2VjdGlvbi0+X2Nvb2tlZF9zaXplCi0JICAgICAgJiYgc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKLQkgICAgcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0gICAgICAvKiBDb3VsZCBiZSBhIHN5bWJvbCBmcm9tIGFuIGV4dGVybmFsIGxpYnJhcnkgKHN1Y2ggYXMgYW4gT01PUwotCSBzaGFyZWQgbGlicmFyeSkuICBEb24ndCBhYm9ydC4gICovCi0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotICAgIH0KLX0KLQotLyogUmVhZCBhbmQgc2F2ZSB0aGUgc3ltYm9sIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgc3ltYm9sX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGludCBzeW1zaXplID0gc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkKTsKLSAgY2hhciAqc3RyaW5ndGFiOwotICBzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICpidWYgPSBOVUxMLCAqYnVmcCwgKmVuZGJ1ZnA7Ci0gIHNvbV9zeW1ib2xfdHlwZSAqc3ltLCAqc3ltYmFzZTsKLQotICAvKiBSZXR1cm4gc2F2ZWQgdmFsdWUgaWYgaXQgZXhpc3RzLiAgKi8KLSAgaWYgKG9ial9zb21fc3ltdGFiIChhYmZkKSAhPSBOVUxMKQotICAgIGdvdG8gc3VjY2Vzc2Z1bF9yZXR1cm47Ci0KLSAgLyogU3BlY2lhbCBjYXNlLiAgVGhpcyBpcyAqbm90KiBhbiBlcnJvci4gICovCi0gIGlmIChzeW1ib2xfY291bnQgPT0gMCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIGlmICghc29tX3NsdXJwX3N0cmluZ190YWJsZSAoYWJmZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3RyaW5ndGFiID0gb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpOwotCi0gIHN5bWJhc2UgPSAoKHNvbV9zeW1ib2xfdHlwZSAqKQotCSAgICAgYmZkX21hbGxvYyAoc3ltYm9sX2NvdW50ICogc2l6ZW9mIChzb21fc3ltYm9sX3R5cGUpKSk7Ci0gIGlmIChzeW1iYXNlID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG1lbXNldCAoc3ltYmFzZSwgMCwgc3ltYm9sX2NvdW50ICogc2l6ZW9mIChzb21fc3ltYm9sX3R5cGUpKTsKLQotICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBTT00gcmVwcmVzZW50YXRpb24uICAqLwotICBidWYgPSBiZmRfbWFsbG9jIChzeW1ib2xfY291bnQgKiBzeW1zaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMICYmIHN5bWJvbF9jb3VudCAqIHN5bXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9yZWFkIChidWYsIHN5bWJvbF9jb3VudCAqIHN5bXNpemUsIDEsIGFiZmQpIAotICAgICAgIT0gc3ltYm9sX2NvdW50ICogc3ltc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBzeW1ib2xzIGFuZCBpbnRlcm5hbGl6ZSB0aGVtLiAgKi8KLSAgZW5kYnVmcCA9IGJ1ZiArIHN5bWJvbF9jb3VudDsKLSAgZm9yIChidWZwID0gYnVmLCBzeW0gPSBzeW1iYXNlOyBidWZwIDwgZW5kYnVmcDsgKytidWZwKQotICAgIHsKLQotICAgICAgLyogSSBkb24ndCB0aGluayB3ZSBjYXJlIGFib3V0IHRoZXNlLiAgKi8KLSAgICAgIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9TWU1fRVhUCi0JICB8fCBidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9BUkdfRVhUKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZXQgc29tZSBwcml2YXRlIGRhdGEgd2UgY2FyZSBhYm91dC4gICovCi0gICAgICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfTlVMTCkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfVU5LTk9XTjsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0FCU09MVVRFKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9BQlNPTFVURTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0RBVEEpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0RBVEE7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9DT0RFKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9DT0RFOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfUFJJX1BST0cpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1BSSV9QUk9HOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfU0VDX1BST0cpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1NFQ19QUk9HOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfRU5UUlkpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfTUlMTElDT0RFKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9NSUxMSUNPREU7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9QTEFCRUwpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1BMQUJFTDsKLSAgICAgIGVsc2UKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfVU5LTk9XTjsKLSAgICAgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyA9IGJ1ZnAtPmFyZ19yZWxvYzsKLQotICAgICAgLyogU29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgICAgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICAgICAgc3ltLT5zeW1ib2wubmFtZSA9IGJ1ZnAtPm5hbWUubl9zdHJ4ICsgc3RyaW5ndGFiOwotICAgICAgc3ltLT5zeW1ib2wudmFsdWUgPSBidWZwLT5zeW1ib2xfdmFsdWU7Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gMDsKLSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzID0gMDsKLQotICAgICAgc3dpdGNoIChidWZwLT5zeW1ib2xfdHlwZSkKLQl7Ci0JY2FzZSBTVF9FTlRSWToKLQljYXNlIFNUX01JTExJQ09ERToKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX3ByaXZfbGV2ZWwgPQotCSAgICBzeW0tPnN5bWJvbC52YWx1ZSAmIDB4MzsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH4weDM7Ci0JICBicmVhazsKLQotCWNhc2UgU1RfU1RVQjoKLQljYXNlIFNUX0NPREU6Ci0JY2FzZSBTVF9QUklfUFJPRzoKLQljYXNlIFNUX1NFQ19QUk9HOgotCSAgc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbCA9Ci0JICAgIHN5bS0+c3ltYm9sLnZhbHVlICYgMHgzOwotCSAgc3ltLT5zeW1ib2wudmFsdWUgJj0gfjB4MzsKLQkgIC8qIElmIHRoZSBzeW1ib2wncyBzY29wZSBpcyBTU19VTlNBVCwgdGhlbiB0aGVzZSBhcmUKLQkgICAgIHVuZGVmaW5lZCBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLQkgIGlmIChidWZwLT5zeW1ib2xfc2NvcGUgPT0gU1NfVU5TQVQpCi0JICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgIAotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSGFuZGxlIHNjb3BpbmcgYW5kIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICAgICAgc3dpdGNoIChidWZwLT5zeW1ib2xfc2NvcGUpCi0JewotCS8qIHN5bWJvbF9pbmZvIGZpZWxkIGlzIHVuZGVmaW5lZCBmb3IgU1NfRVhURVJOQUwgYW5kIFNTX1VOU0FUIHN5bWJvbHMsCi0JICAgc28gdGhlIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3ltYm9sIGNhbid0IGJlIGtub3duLiAgKi8KLQljYXNlIFNTX0VYVEVSTkFMOgotCSAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCk7Ci0JICBicmVhazsKLQotCWNhc2UgU1NfVU5TQVQ6Ci0JICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKLQkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNTX1VOSVZFUlNBTDoKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCk7Ci0JICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIChhYmZkLCBidWZwKTsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlIC09IHN5bS0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCi0jaWYgMAotCS8qIFNTX0dMT0JBTCBhbmQgU1NfTE9DQUwgYXJlIHR3byBuYW1lcyBmb3IgdGhlIHNhbWUgdGhpbmcuCi0JICAgU291bmQgZHVtYj8gIEl0IGlzLiAgKi8KLQljYXNlIFNTX0dMT0JBTDoKLSNlbmRpZgotCWNhc2UgU1NfTE9DQUw6Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIChhYmZkLCBidWZwKTsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlIC09IHN5bS0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ2hlY2sgZm9yIGEgd2VhayBzeW1ib2wuICAqLwotICAgICAgaWYgKGJ1ZnAtPnNlY29uZGFyeV9kZWYpCi0gICAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9XRUFLOwotCi0gICAgICAvKiBNYXJrIHNlY3Rpb24gc3ltYm9scyBhbmQgc3ltYm9scyB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4KLQkgTm90ZSAkU1RBUlQkIGlzIGEgbWFnaWMgY29kZSBzeW1ib2wsIE5PVCBhIHNlY3Rpb24gc3ltYm9sLiAgKi8KLSAgICAgIGlmIChzeW0tPnN5bWJvbC5uYW1lWzBdID09ICckJwotCSAgJiYgc3ltLT5zeW1ib2wubmFtZVtzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpIC0gMV0gPT0gJyQnCi0JICAmJiAhc3RyY21wIChzeW0tPnN5bWJvbC5uYW1lLCBzeW0tPnN5bWJvbC5zZWN0aW9uLT5uYW1lKSkKLQlzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0gICAgICBlbHNlIGlmICghc3RybmNtcCAoc3ltLT5zeW1ib2wubmFtZSwgIkwkMFwwMDIiLCA0KSkKLQl7Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0JICBzeW0tPnN5bWJvbC5uYW1lID0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+bmFtZTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RybmNtcCAoc3ltLT5zeW1ib2wubmFtZSwgIkwkMFwwMDEiLCA0KSkKLQlzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0gICAgICAvKiBOb3RlIGluY3JlbWVudCBhdCBib3R0b20gb2YgbG9vcCwgc2luY2Ugd2Ugc2tpcCBzb21lIHN5bWJvbHMKLSAgICAgICAgIHdlIGNhbiBub3QgaW5jbHVkZSBpdCBhcyBwYXJ0IG9mIHRoZSBmb3Igc3RhdGVtZW50LiAgKi8KLSAgICAgIHN5bSsrOwotICAgIH0KLQotICAvKiBXZSBtb2RpZnkgdGhlIHN5bWJvbCBjb3VudCB0byByZWNvcmQgdGhlIG51bWJlciBvZiBCRkQgc3ltYm9scyB3ZQotICAgICBjcmVhdGVkLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW0gLSBzeW1iYXNlOwotCi0gIC8qIFNhdmUgb3VyIHJlc3VsdHMgYW5kIHJldHVybiBzdWNjZXNzLiAgKi8KLSAgb2JqX3NvbV9zeW10YWIgKGFiZmQpID0gc3ltYmFzZTsKLSBzdWNjZXNzZnVsX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiAodHJ1ZSk7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENhbm9uaWNhbGl6ZSBhIFNPTSBzeW1ib2wgdGFibGUuICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzCi0gICBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXNvbV9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gIGludCBpOwotICBzb21fc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgaWYgKCFzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaSA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBzeW1iYXNlID0gb2JqX3NvbV9zeW10YWIgKGFiZmQpOwotCi0gIGZvciAoOyBpID4gMDsgaS0tLCBsb2NhdGlvbisrLCBzeW1iYXNlKyspCi0gICAgKmxvY2F0aW9uID0gJnN5bWJhc2UtPnN5bWJvbDsKLQotICAvKiBGaW5hbCBudWxsIHBvaW50ZXIuICAqLwotICAqbG9jYXRpb24gPSAwOwotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLX0KLQotLyogTWFrZSBhIFNPTSBzeW1ib2wuICBUaGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXNvbV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzb21fc3ltYm9sX3R5cGUgKm5ldyA9Ci0gIChzb21fc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzb21fc3ltYm9sX3R5cGUpKTsKLSAgaWYgKG5ldyA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBQcmludCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgInNvbSAiKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIHN5bWJvbC0+ZmxhZ3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpzZWN0aW9uX25hbWU7Ci0Jc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uID8gc3ltYm9sLT5zZWN0aW9uLT5uYW1lIDogIigqbm9uZSopIjsKLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCWZwcmludGYgKGZpbGUsICIgJXNcdCVzIiwgc2VjdGlvbl9uYW1lLCBzeW1ib2wtPm5hbWUpOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyQnKTsKLX0KLQotLyogQ291bnQgb3IgcHJvY2VzcyB2YXJpYWJsZS1sZW5ndGggU09NIGZpeHVwIHJlY29yZHMuCi0KLSAgIFRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24gd2UgdXNlIHRoaXMgY29kZSBib3RoIHRvIGNvbXB1dGUgdGhlIG51bWJlcgotICAgb2YgcmVsb2NhdGlvbnMgcmVxdWVzdGVkIGJ5IGEgc3RyZWFtLCBhbmQgdG8gaW50ZXJuYWxpemUgdGhlIHN0cmVhbS4KLQotICAgV2hlbiBjb21wdXRpbmcgdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyByZXF1ZXN0ZWQgYnkgYSBzdHJlYW0gdGhlCi0gICB2YXJpYWJsZXMgcnB0ciwgc2VjdGlvbiwgYW5kIHN5bWJvbHMgaGF2ZSBubyBtZWFuaW5nLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyByZXF1ZXN0ZWQgYnkgdGhlIGZpeHVwIHN0cmVhbS4gIFdoZW4KLSAgIG5vdCBqdXN0IGNvdW50aW5nIAotCi0gICBUaGlzIG5lZWRzIGF0IGxlYXN0IHR3byBvciB0aHJlZSBtb3JlIHBhc3NlcyB0byBnZXQgaXQgY2xlYW5lZCB1cC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXNvbV9zZXRfcmVsb2NfaW5mbyAoZml4dXAsIGVuZCwgaW50ZXJuYWxfcmVsb2NzLCBzZWN0aW9uLCBzeW1ib2xzLCBqdXN0X2NvdW50KQotICAgICB1bnNpZ25lZCBjaGFyICpmaXh1cDsKLSAgICAgdW5zaWduZWQgaW50IGVuZDsKLSAgICAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4ganVzdF9jb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IG9wLCB2YXJuYW1lLCBkZWFsbG9jYXRlX2NvbnRlbnRzID0gMDsKLSAgdW5zaWduZWQgY2hhciAqZW5kX2ZpeHVwcyA9ICZmaXh1cFtlbmRdOwotICBjb25zdCBzdHJ1Y3QgZml4dXBfZm9ybWF0ICpmcDsKLSAgY2hhciAqY3A7Ci0gIHVuc2lnbmVkIGNoYXIgKnNhdmVfZml4dXA7Ci0gIGludCB2YXJpYWJsZXNbMjZdLCBzdGFja1syMF0sIGMsIHYsIGNvdW50LCBwcmV2X2ZpeHVwLCAqc3AsIHNhdmVkX3Vud2luZF9iaXRzOwotICBjb25zdCBpbnQgKnN1Ym9wOwotICBhcmVsZW50ICpycHRyPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwotCi0jZGVmaW5lCXZhcihjKQkJdmFyaWFibGVzWyhjKSAtICdBJ10KLSNkZWZpbmUJcHVzaCh2KQkJKCpzcCsrID0gKHYpKQotI2RlZmluZQlwb3AoKQkJKCotLXNwKQotI2RlZmluZQllbXB0eXN0YWNrKCkJKHNwID09IHN0YWNrKQotCi0gIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7Ci0gIG1lbXNldCAodmFyaWFibGVzLCAwLCBzaXplb2YgKHZhcmlhYmxlcykpOwotICBtZW1zZXQgKHN0YWNrLCAwLCBzaXplb2YgKHN0YWNrKSk7Ci0gIGNvdW50ID0gMDsKLSAgcHJldl9maXh1cCA9IDA7Ci0gIHNhdmVkX3Vud2luZF9iaXRzID0gMDsKLSAgc3AgPSBzdGFjazsKLQotICB3aGlsZSAoZml4dXAgPCBlbmRfZml4dXBzKQotICAgIHsKLQotICAgICAgLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGZpeHVwLiAgV2UnbGwgdXNlCi0JIGl0IGxhdGVyIHRvIGRldGVybWluZSBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gcHV0IHRoaXMgZml4dXAKLQkgb24gdGhlIHF1ZXVlLiAgKi8KLSAgICAgIHNhdmVfZml4dXAgPSBmaXh1cDsKLQotICAgICAgLyogR2V0IHRoZSBmaXh1cCBjb2RlIGFuZCBpdHMgYXNzb2NpYXRlZCBmb3JtYXQuICAqLwotICAgICAgb3AgPSAqZml4dXArKzsKLSAgICAgIGZwID0gJnNvbV9maXh1cF9mb3JtYXRzW29wXTsKLQotICAgICAgLyogSGFuZGxlIGEgcmVxdWVzdCBmb3IgYSBwcmV2aW91cyBmaXh1cC4gICovCi0gICAgICBpZiAoKmZwLT5mb3JtYXQgPT0gJ1AnKQotCXsKLQkgIC8qIEdldCBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByZXYgZml4dXAsIG1vdmUKLQkgICAgIHRoZSByZXBlYXRlZCBmaXh1cCB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUuICAqLwotCSAgZml4dXAgPSByZWxvY19xdWV1ZVtmcC0+RF0ucmVsb2M7Ci0JICBzb21fcmVsb2NfcXVldWVfZml4IChyZWxvY19xdWV1ZSwgZnAtPkQpOwotCSAgcHJldl9maXh1cCA9IDE7Ci0KLQkgIC8qIEdldCB0aGUgZml4dXAgY29kZSBhbmQgaXRzIGFzc29jaWF0ZWQgZm9ybWF0LiAgKi8KLQkgIG9wID0gKmZpeHVwKys7Ci0JICBmcCA9ICZzb21fZml4dXBfZm9ybWF0c1tvcF07Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGZpeHVwIHdpbGwgYmUgcGFzc2VkIHRvIEJGRCwgc2V0IHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cy4gICovCi0gICAgICBpZiAoISBqdXN0X2NvdW50Ci0JICAmJiBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX05PX1JFTE9DQVRJT04KLQkgICYmIHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfREFUQV9PVkVSUklERSkKLQl7Ci0JICBycHRyLT5hZGRyZXNzID0gb2Zmc2V0OwotCSAgcnB0ci0+aG93dG8gPSAmc29tX2hwcGFfaG93dG9fdGFibGVbb3BdOwotCSAgcnB0ci0+YWRkZW5kID0gMDsKLQkgIHJwdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JfQotCi0gICAgICAvKiBTZXQgZGVmYXVsdCBpbnB1dCBsZW5ndGggdG8gMC4gIEdldCB0aGUgb3Bjb2RlIGNsYXNzIGluZGV4Ci0JIGludG8gRC4gICovCi0gICAgICB2YXIgKCdMJykgPSAwOwotICAgICAgdmFyICgnRCcpID0gZnAtPkQ7Ci0gICAgICB2YXIgKCdVJykgPSBzYXZlZF91bndpbmRfYml0czsKLQotICAgICAgLyogR2V0IHRoZSBvcGNvZGUgZm9ybWF0LiAgKi8KLSAgICAgIGNwID0gZnAtPmZvcm1hdDsKLQotICAgICAgLyogUHJvY2VzcyB0aGUgZm9ybWF0IHN0cmluZy4gIFBhcnNpbmcgaGFwcGVucyBpbiB0d28gcGhhc2VzLAotCSBwYXJzZSBSSFMsIHRoZW4gYXNzaWduIHRvIExIUy4gIFJlcGVhdCB1bnRpbCBubyBtb3JlIAotCSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgKi8KLSAgICAgIHdoaWxlICgqY3ApCi0JewotCSAgLyogVGhlIHZhcmlhYmxlIHRoaXMgcGFzcyBpcyBnb2luZyB0byBjb21wdXRlIGEgdmFsdWUgZm9yLiAgKi8KLQkgIHZhcm5hbWUgPSAqY3ArKzsKLQotCSAgLyogU3RhcnQgcHJvY2Vzc2luZyBSSFMuICBDb250aW51ZSB1bnRpbCBhIE5VTEwgb3IgJz0nIGlzIGZvdW5kLiAgKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICBjID0gKmNwKys7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgdmFyaWFibGUsIHB1c2ggaXQgb24gdGhlIHN0YWNrLiAgKi8KLQkgICAgICBpZiAoaXN1cHBlciAoYykpCi0JCXB1c2ggKHZhciAoYykpOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIGxvd2VyIGNhc2UgbGV0dGVyLCB0aGVuIGl0IHJlcHJlc2VudHMKLQkJIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHRoZSBmaXh1cCBzdHJlYW0gdG8gYmUgcHVzaGVkIG9udG8KLQkJIHRoZSBzdGFjay4gICovCi0JICAgICAgZWxzZSBpZiAoaXNsb3dlciAoYykpCi0JCXsKLQkJICBpbnQgYml0cyA9IChjIC0gJ2EnKSAqIDg7Ci0JCSAgZm9yICh2ID0gMDsgYyA+ICdhJzsgLS1jKQotCQkgICAgdiA9ICh2IDw8IDgpIHwgKmZpeHVwKys7Ci0JCSAgaWYgKHZhcm5hbWUgPT0gJ1YnKQotCQkgICAgdiA9IHNpZ25fZXh0ZW5kICh2LCBiaXRzKTsKLQkJICBwdXNoICh2KTsKLQkJfQotCi0JICAgICAgLyogQSBkZWNpbWFsIGNvbnN0YW50LiAgUHVzaCBpdCBvbiB0aGUgc3RhY2suICAqLwotCSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKGMpKQotCQl7Ci0JCSAgdiA9IGMgLSAnMCc7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCpjcCkpCi0JCSAgICB2ID0gKHYgKiAxMCkgKyAoKmNwKysgLSAnMCcpOwotCQkgIHB1c2ggKHYpOwotCQl9Ci0JICAgICAgZWxzZQotCi0JCS8qIEFuIG9wZXJhdG9yLiAgUG9wIHR3byB0d28gdmFsdWVzIGZyb20gdGhlIHN0YWNrIGFuZAotCQkgICB1c2UgdGhlbSBhcyBvcGVyYW5kcyB0byB0aGUgZ2l2ZW4gb3BlcmF0aW9uLiAgUHVzaAotCQkgICB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gYmFjayBvbiB0aGUgc3RhY2suICAqLwotCQlzd2l0Y2ggKGMpCi0JCSAgewotCQkgIGNhc2UgJysnOgotCQkgICAgdiA9IHBvcCAoKTsKLQkJICAgIHYgKz0gcG9wICgpOwotCQkgICAgcHVzaCAodik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICcqJzoKLQkJICAgIHYgPSBwb3AgKCk7Ci0JCSAgICB2ICo9IHBvcCAoKTsKLQkJICAgIHB1c2ggKHYpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnPCc6Ci0JCSAgICB2ID0gcG9wICgpOwotCQkgICAgdiA9IHBvcCAoKSA8PCB2OwotCQkgICAgcHVzaCAodik7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgYWJvcnQgKCk7Ci0JCSAgfQotCSAgICB9Ci0JICB3aGlsZSAoKmNwICYmICpjcCAhPSAnPScpOwotCi0JICAvKiBNb3ZlIG92ZXIgdGhlIGVxdWFsIG9wZXJhdG9yLiAgKi8KLQkgIGNwKys7Ci0KLQkgIC8qIFBvcCB0aGUgUkhTIG9mZiB0aGUgc3RhY2suICAqLwotCSAgYyA9IHBvcCAoKTsKLQotCSAgLyogUGVyZm9ybSB0aGUgYXNzaWdubWVudC4gICovCi0JICB2YXIgKHZhcm5hbWUpID0gYzsKLQotCSAgLyogSGFuZGxlIHNpZGUgZWZmZWN0cy4gYW5kIHNwZWNpYWwgJ08nIHN0YWNrIGNhc2VzLiAgKi8KLQkgIHN3aXRjaCAodmFybmFtZSkKLQkgICAgewotCSAgICAvKiBDb25zdW1lIHNvbWUgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgc3BhY2UuICAqLwotCSAgICBjYXNlICdMJzoKLQkgICAgICBvZmZzZXQgKz0gYzsKLQkgICAgICBicmVhazsKLQkgICAgLyogQSBzeW1ib2wgdG8gdXNlIGluIHRoZSByZWxvY2F0aW9uLiAgTWFrZSBhIG5vdGUKLQkgICAgICAgb2YgdGhpcyBpZiB3ZSBhcmUgbm90IGp1c3QgY291bnRpbmcuICAqLwotCSAgICBjYXNlICdTJzoKLQkgICAgICBpZiAoISBqdXN0X2NvdW50KQotCQlycHRyLT5zeW1fcHRyX3B0ciA9ICZzeW1ib2xzW2NdOwotCSAgICAgIGJyZWFrOwotCSAgICAvKiBBcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgZm9yIGEgZnVuY3Rpb24gY2FsbC4gICovCi0JICAgIGNhc2UgJ1InOgotCSAgICAgIGlmICghIGp1c3RfY291bnQpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdG1wID0gdmFyICgnUicpOwotCQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0KLQkJICBpZiAoKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfUENSRUxfQ0FMTAotCQkgICAgICAgJiYgUl9QQ1JFTF9DQUxMICsgMTAgPiBvcCkKLQkJICAgICAgfHwgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfQUJTX0NBTEwKLQkJCSAgJiYgUl9BQlNfQ0FMTCArIDEwID4gb3ApKQotCQkgICAgewotCQkgICAgICAvKiBTaW1wbGUgZW5jb2RpbmcuICAqLwotCQkgICAgICBpZiAodG1wID4gNCkKLQkJCXsKLQkJCSAgdG1wIC09IDU7Ci0JCQkgIHJwdHItPmFkZGVuZCB8PSAxOwotCQkJfQotCQkgICAgICBpZiAodG1wID09IDQpCi0JCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0IHwgMSA8PCAyOwotCQkgICAgICBlbHNlIGlmICh0bXAgPT0gMykKLQkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQ7Ci0JCSAgICAgIGVsc2UgaWYgKHRtcCA9PSAyKQotCQkJcnB0ci0+YWRkZW5kIHw9IDEgPDwgOCB8IDEgPDwgNjsKLQkJICAgICAgZWxzZSBpZiAodG1wID09IDEpCi0JCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4OwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgdW5zaWduZWQgaW50IHRtcDEsIHRtcDI7Ci0KLQkJICAgICAgLyogRmlyc3QgcGFydCBpcyBlYXN5IC0tIGxvdyBvcmRlciB0d28gYml0cyBhcmUKLQkJCSBkaXJlY3RseSBjb3BpZWQsIHRoZW4gc2hpZnRlZCBhd2F5LiAgKi8KLQkJICAgICAgcnB0ci0+YWRkZW5kID0gdG1wICYgMHgzOwotCQkgICAgICB0bXAgPj49IDI7Ci0KLQkJICAgICAgLyogRGl2aW5nIHRoZSByZXN1bHQgYnkgMTAgZ2l2ZXMgdXMgdGhlIHNlY29uZAotCQkJIHBhcnQuICBJZiBpdCBpcyA5LCB0aGVuIHRoZSBmaXJzdCB0d28gd29yZHMKLQkJCSBhcmUgYSBkb3VibGUgcHJlY2lzaW9uIHBhcmFtYXRlciwgZWxzZSBpdCBpcwotCQkJIDMgKiB0aGUgZmlyc3QgYXJnIGJpdHMgKyB0aGUgMm5kIGFyZyBiaXRzLiAgKi8KLQkJICAgICAgdG1wMSA9IHRtcCAvIDEwOwotCQkgICAgICB0bXAgLT0gdG1wMSAqIDEwOwotCQkgICAgICBpZiAodG1wMSA9PSA5KQotCQkJcnB0ci0+YWRkZW5kICs9ICgweGUgPDwgNik7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogR2V0IHRoZSB0d28gcGllY2VzLiAgKi8KLQkJCSAgdG1wMiA9IHRtcDEgLyAzOwotCQkJICB0bXAxIC09IHRtcDIgKiAzOwotCQkJICAvKiBQdXQgdGhlbSBpbiB0aGUgYWRkZW5kLiAgKi8KLQkJCSAgcnB0ci0+YWRkZW5kICs9ICh0bXAyIDw8IDgpICsgKHRtcDEgPDwgNik7Ci0JCQl9Ci0KLQkJICAgICAgLyogV2hhdCdzIGxlZnQgaXMgdGhlIHRoaXJkIHBhcnQuICBJdCdzIHVucGFja2VkCi0JCQkganVzdCBsaWtlIHRoZSBzZWNvbmQuICAqLwotCQkgICAgICBpZiAodG1wID09IDkpCi0JCQlycHRyLT5hZGRlbmQgKz0gKDB4ZSA8PCAyKTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICB0bXAyID0gdG1wIC8gMzsKLQkJCSAgdG1wIC09IHRtcDIgKiAzOwotCQkJICBycHRyLT5hZGRlbmQgKz0gKHRtcDIgPDwgNCkgKyAodG1wIDw8IDIpOwotCQkJfQotCQkgICAgfQotCQkgIHJwdHItPmFkZGVuZCA9IEhQUEFfUl9BRERFTkQgKHJwdHItPmFkZGVuZCwgMCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgLyogSGFuZGxlIHRoZSBsaW5rZXIgZXhwcmVzc2lvbiBzdGFjay4gICovCi0JICAgIGNhc2UgJ08nOgotCSAgICAgIHN3aXRjaCAob3ApCi0JCXsKLQkJY2FzZSBSX0NPTVAxOgotCQkgIHN1Ym9wID0gY29tcDFfb3Bjb2RlczsKLQkJICBicmVhazsKLQkJY2FzZSBSX0NPTVAyOgotCQkgIHN1Ym9wID0gY29tcDJfb3Bjb2RlczsKLQkJICBicmVhazsKLQkJY2FzZSBSX0NPTVAzOgotCQkgIHN1Ym9wID0gY29tcDNfb3Bjb2RlczsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIHdoaWxlICgqc3Vib3AgPD0gKHVuc2lnbmVkIGNoYXIpIGMpCi0JCSsrc3Vib3A7Ci0JICAgICAgLS1zdWJvcDsKLQkgICAgICBicmVhazsKLQkgICAgLyogVGhlIGxvd2VyIDMydW53aW5kIGJpdHMgbXVzdCBiZSBwZXJzaXN0ZW50LiAgKi8KLQkgICAgY2FzZSAnVSc6Ci0JICAgICAgc2F2ZWRfdW53aW5kX2JpdHMgPSB2YXIgKCdVJyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgdXNlZCBhIHByZXZpb3VzIGZpeHVwLCBjbGVhbiB1cCBhZnRlciBpdC4gICovCi0gICAgICBpZiAocHJldl9maXh1cCkKLQl7Ci0JICBmaXh1cCA9IHNhdmVfZml4dXAgKyAxOwotCSAgcHJldl9maXh1cCA9IDA7Ci0JfQotICAgICAgLyogUXVldWUgaXQuICAqLwotICAgICAgZWxzZSBpZiAoZml4dXAgPiBzYXZlX2ZpeHVwICsgMSkKLQlzb21fcmVsb2NfcXVldWVfaW5zZXJ0IChzYXZlX2ZpeHVwLCBmaXh1cCAtIHNhdmVfZml4dXAsIHJlbG9jX3F1ZXVlKTsKLQotICAgICAgLyogV2UgZG8gbm90IHBhc3MgUl9EQVRBX09WRVJSSURFIG9yIFJfTk9fUkVMT0NBVElPTiAKLQkgZml4dXBzIHRvIEJGRC4gICovCi0gICAgICBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgIT0gUl9EQVRBX09WRVJSSURFCi0JICAmJiBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX05PX1JFTE9DQVRJT04pCi0JewotCSAgLyogRG9uZSB3aXRoIGEgc2luZ2xlIHJlbG9jdGlvbi4gTG9vcCBiYWNrIHRvIHRoZSB0b3AuICAqLwotCSAgaWYgKCEganVzdF9jb3VudCkKLQkgICAgewotCSAgICAgIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0VOVFJZKQotCQlycHRyLT5hZGRlbmQgPSB2YXIgKCdUJyk7Ci0JICAgICAgZWxzZSBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9FWElUKQotCQlycHRyLT5hZGRlbmQgPSB2YXIgKCdVJyk7Ci0JICAgICAgZWxzZSBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9QQ1JFTF9DQUxMCi0JCSAgICAgICB8fCBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0FCU19DQUxMKQotCQk7Ci0JICAgICAgZWxzZSBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9EQVRBX09ORV9TWU1CT0wpCi0JCXsKLQkJICB1bnNpZ25lZCBhZGRlbmQgPSB2YXIgKCdWJyk7Ci0KLQkJICAvKiBUcnkgd2hhdCB3YXMgc3BlY2lmaWVkIGluIFJfREFUQV9PVkVSUklERSBmaXJzdAotCQkgICAgIChpZiBhbnl0aGluZykuICBUaGVuIHRoZSBoYXJkIHdheSB1c2luZyB0aGUKLQkJICAgICBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLQkJICBycHRyLT5hZGRlbmQgPSB2YXIgKCdWJyk7Ci0KLQkJICBpZiAocnB0ci0+YWRkZW5kID09IDAgJiYgIXNlY3Rpb24tPmNvbnRlbnRzKQotCQkgICAgewotCQkgICAgICAvKiBHb3QgdG8gcmVhZCB0aGUgZGFtbiBjb250ZW50cyBmaXJzdC4gIFdlIGRvbid0Ci0JCSAgICAgICAgIGJvdGhlciBzYXZpbmcgdGhlIGNvbnRlbnRzICh5ZXQpLiAgQWRkIGl0IG9uZQotCQkJIGRheSBpZiB0aGUgbmVlZCBhcmlzZXMuICAqLwotCQkgICAgICBzZWN0aW9uLT5jb250ZW50cyA9IGJmZF9tYWxsb2MgKHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCi0JCSAgICAgIGRlYWxsb2NhdGVfY29udGVudHMgPSAxOwotCQkgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHNlY3Rpb24tPm93bmVyLAotCQkJCQkJc2VjdGlvbiwKLQkJCQkJCXNlY3Rpb24tPmNvbnRlbnRzLAotCQkJCQkJMCwKLQkJCQkJCXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAocnB0ci0+YWRkZW5kID09IDApCi0JCSAgICBycHRyLT5hZGRlbmQgPSBiZmRfZ2V0XzMyIChzZWN0aW9uLT5vd25lciwKLQkJCQkJICAgICAgIChzZWN0aW9uLT5jb250ZW50cwotCQkJCQkJKyBvZmZzZXQgLSB2YXIgKCdMJykpKTsKLQkJCQotCQl9Ci0JICAgICAgZWxzZQotCQlycHRyLT5hZGRlbmQgPSB2YXIgKCdWJyk7Ci0JICAgICAgcnB0cisrOwotCSAgICB9Ci0JICBjb3VudCsrOwotCSAgLyogTm93IHRoYXQgd2UndmUgaGFuZGxlZCBhICJmdWxsIiByZWxvY2F0aW9uLCByZXNldAotCSAgICAgc29tZSBzdGF0ZS4gICovCi0JICBtZW1zZXQgKHZhcmlhYmxlcywgMCwgc2l6ZW9mICh2YXJpYWJsZXMpKTsKLQkgIG1lbXNldCAoc3RhY2ssIDAsIHNpemVvZiAoc3RhY2spKTsKLQl9Ci0gICAgfQotICBpZiAoZGVhbGxvY2F0ZV9jb250ZW50cykKLSAgICBmcmVlIChzZWN0aW9uLT5jb250ZW50cyk7Ci0KLSAgcmV0dXJuIGNvdW50OwotCi0jdW5kZWYgdmFyCi0jdW5kZWYgcHVzaAotI3VuZGVmIHBvcAotI3VuZGVmIGVtcHR5c3RhY2sKLX0KLQotLyogUmVhZCBpbiB0aGUgcmVsb2NzIChha2EgZml4dXBzIGluIFNPTSB0ZXJtcykgZm9yIGEgc2VjdGlvbi4gCi0KLSAgIHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgY2FsbHMgdGhpcyByb3V0aW5lIHdpdGggSlVTVF9DT1VOVCAKLSAgIHNldCB0byB0cnVlIHRvIGluZGljYXRlIGl0IG9ubHkgbmVlZHMgYSBjb3VudCBvZiB0aGUgbnVtYmVyCi0gICBvZiBhY3R1YWwgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBqdXN0X2NvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBqdXN0X2NvdW50OwotewotICBjaGFyICpleHRlcm5hbF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBmaXh1cF9zdHJlYW1fc2l6ZTsKLSAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOwotICB1bnNpZ25lZCBpbnQgbnVtX3JlbG9jczsKLQotICBmaXh1cF9zdHJlYW1fc2l6ZSA9IHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zaXplOwotICAvKiBJZiB0aGVyZSB3ZXJlIG5vIHJlbG9jYXRpb25zLCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICAqLwotICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiByZWxvY19jb3VudCBpcyAtMSwgdGhlbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0gaGFzIG5vdCBiZWVuIAotICAgICBwYXJzZWQuICBXZSBtdXN0IGRvIHNvIG5vdyB0byBrbm93IGhvdyBtYW55IHJlbG9jYXRpb25zIGV4aXN0LiAgKi8KLSAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ID09IC0xKQotICAgIHsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IChjaGFyICopIGJmZF9tYWxsb2MgKGZpeHVwX3N0cmVhbV9zaXplKTsKLSAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gKGNoYXIgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBmb3Jtcy4gKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIG9ial9zb21fcmVsb2NfZmlsZXBvcyAoYWJmZCkgKyBzZWN0aW9uLT5yZWxfZmlsZXBvcywKLQkJICAgIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZml4dXBfc3RyZWFtX3NpemUsIGFiZmQpCi0JICAhPSBmaXh1cF9zdHJlYW1fc2l6ZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIExldCBjYWxsZXJzIGtub3cgaG93IG1hbnkgcmVsb2NhdGlvbnMgZm91bmQuCi0JIGFsc28gc2F2ZSB0aGUgcmVsb2NhdGlvbiBzdHJlYW0gYXMgd2Ugd2lsbAotCSBuZWVkIGl0IGFnYWluLiAgKi8KLSAgICAgIHNlY3Rpb24tPnJlbG9jX2NvdW50ID0gc29tX3NldF9yZWxvY19pbmZvIChleHRlcm5hbF9yZWxvY3MsCi0JCQkJCQkgZml4dXBfc3RyZWFtX3NpemUsCi0JCQkJCQkgTlVMTCwgTlVMTCwgTlVMTCwgdHJ1ZSk7Ci0KLSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zdHJlYW0gPSBleHRlcm5hbF9yZWxvY3M7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBjYWxsZXIgb25seSB3YW50ZWQgYSBjb3VudCwgdGhlbiByZXR1cm4gbm93LiAgKi8KLSAgaWYgKGp1c3RfY291bnQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbnVtX3JlbG9jcyA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICBleHRlcm5hbF9yZWxvY3MgPSBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2Nfc3RyZWFtOwotICAvKiBSZXR1cm4gc2F2ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbG9jYXRpb25zIGlmIGl0IGlzIGF2YWlsYWJsZS4gICovCi0gIGlmIChzZWN0aW9uLT5yZWxvY2F0aW9uICE9IChhcmVsZW50ICopIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW50ZXJuYWxfcmVsb2NzID0gKGFyZWxlbnQgKikgCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgKG51bV9yZWxvY3MgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gKGFyZWxlbnQgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUHJvY2VzcyBhbmQgaW50ZXJuYWxpemUgdGhlIHJlbG9jYXRpb25zLiAgKi8KLSAgc29tX3NldF9yZWxvY19pbmZvIChleHRlcm5hbF9yZWxvY3MsIGZpeHVwX3N0cmVhbV9zaXplLAotCQkgICAgICBpbnRlcm5hbF9yZWxvY3MsIHNlY3Rpb24sIHN5bWJvbHMsIGZhbHNlKTsKLQotICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zLiAgRnJlZSB0aGVtLiAgKi8KLSAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3N0cmVhbSA9IE5VTEw7Ci0KLSAgLyogU2F2ZSBvdXIgcmVzdWx0cyBhbmQgcmV0dXJuIHN1Y2Nlc3MuICAqLwotICBzZWN0aW9uLT5yZWxvY2F0aW9uID0gaW50ZXJuYWxfcmVsb2NzOwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgcmVsb2NhdGlvbgotICAgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzZWN0aW9uLiAgKi8gCi0KLXN0YXRpYyBsb25nCi1zb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICAvKiBJZiBzZWN0aW9uIGhhcyByZWxvY2F0aW9ucywgdGhlbiByZWFkIGluIHRoZSByZWxvY2F0aW9uIHN0cmVhbQotICAgICBhbmQgcGFyc2UgaXQgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbG9jYXRpb25zIGV4aXN0LiAgKi8KLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykKLSAgICB7Ci0gICAgICBpZiAoISBzb21fc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBOVUxMLCB0cnVlKSkKLQlyZXR1cm4gLTE7Ci0gICAgICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotICAgIH0KLSAgLyogVGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbnZlcnQgcmVsb2NhdGlvbnMgZnJvbSBTT00gKGV4dGVybmFsKSBmb3JtIGludG8gQkZEIGludGVybmFsCi0gICBmb3JtLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgbG9uZwotc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0cjsKLSAgaW50IGNvdW50OwotCi0gIGlmIChzb21fc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIGZhbHNlKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICB3aGlsZSAoY291bnQtLSkKLSAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzb21fdmVjOwotCi0vKiBBIGhvb2sgdG8gc2V0IHVwIG9iamVjdCBmaWxlIGRlcGVuZGVudCBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICBuZXdzZWN0LT51c2VkX2J5X2JmZCA9Ci0gICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKCFuZXdzZWN0LT51c2VkX2J5X2JmZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IDM7Ci0KLSAgLyogV2UgYWxsb3cgbW9yZSB0aGFuIHRocmVlIHNlY3Rpb25zIGludGVybmFsbHkgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IHN5bWJvbAotICAgdG8gdGhlIG91dHB1dCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXN5bWJvbCAqaXN5bWJvbDsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc3ltYm9sICpvc3ltYm9sOwotewotICBzdHJ1Y3Qgc29tX3N5bWJvbCAqaW5wdXRfc3ltYm9sID0gKHN0cnVjdCBzb21fc3ltYm9sICopIGlzeW1ib2w7Ci0gIHN0cnVjdCBzb21fc3ltYm9sICpvdXRwdXRfc3ltYm9sID0gKHN0cnVjdCBzb21fc3ltYm9sICopIG9zeW1ib2w7Ci0KLSAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgb25seSBwcml2YXRlIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gY29weSBpcyB0aGUgYXJndW1lbnQgcmVsb2NhdGlvbgotICAgICBiaXRzLiAgKi8KLSAgb3V0cHV0X3N5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyA9Ci0gICAgaW5wdXRfc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uCi0gICB0byB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjdGlvbjsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlY3Rpb247Ci17Ci0gIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotICAgICAgfHwgKCFzb21faXNfc3BhY2UgKGlzZWN0aW9uKSAmJiAhc29tX2lzX3N1YnNwYWNlIChpc2VjdGlvbikpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhCi0gICAgPSAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0ICopCi0gICAgICBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbWVtY3B5IChzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YSwKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKGlzZWN0aW9uKS0+Y29weV9kYXRhLAotCSAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKLQotICAvKiBSZXBhcmVudCBpZiBuZWNlc3NhcnkuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lcikKLSAgICBzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID0KLSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKLSAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQsICpvYmZkOwotewotICAvKiBPbmUgZGF5IHdlIG1heSB0cnkgdG8gZ3JvayBvdGhlciBwcml2YXRlIGRhdGEuICAqLwotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgdG8gaG9sZCB0aGUgZGF0YSB3ZSBuZWVkLiAgKi8KLSAgb2JqX3NvbV9leGVjX2RhdGEgKG9iZmQpID0gKHN0cnVjdCBzb21fZXhlY19kYXRhICopCi0gICAgYmZkX3phbGxvYyAob2JmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSkpOwotICBpZiAob2JqX3NvbV9leGVjX2RhdGEgKG9iZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyBjb3B5IHRoZSBkYXRhLiAgKi8KLSAgbWVtY3B5IChvYmpfc29tX2V4ZWNfZGF0YSAob2JmZCksIG9ial9zb21fZXhlY19kYXRhIChpYmZkKSwKLQkgIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2RhdGEpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IGJhY2tlbmQgaW5mbyBmb3Igc2VjdGlvbnMgd2hpY2ggY2FuIG5vdCBiZSBkZXNjcmliZWQKLSAgIGluIHRoZSBCRkQgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLQotYm9vbGVhbgotYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzZWN0aW9uLCBkZWZpbmVkLCBwcml2YXRlLCBzb3J0X2tleSwgc3BudW0pCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBpbnQgZGVmaW5lZDsKLSAgICAgaW50IHByaXZhdGU7Ci0gICAgIHVuc2lnbmVkIGludCBzb3J0X2tleTsKLSAgICAgaW50IHNwbnVtOwotewotICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0aGUgbWFnaWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEKLQk9IChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKLQkgIGJmZF96YWxsb2MgKHNlY3Rpb24tPm93bmVyLAotCQkgICAgICBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotICAgICAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleSA9IHNvcnRfa2V5OwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19kZWZpbmVkID0gZGVmaW5lZDsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+aXNfcHJpdmF0ZSA9IHByaXZhdGU7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9IHNlY3Rpb247Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNwYWNlX251bWJlciA9IHNwbnVtOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IGJhY2tlbmQgaW5mbyBmb3Igc3Vic2VjdGlvbnMgd2hpY2ggY2FuIG5vdCBiZSBkZXNjcmliZWQgCi0gICBpbiB0aGUgQkZEIGRhdGEgc3RydWN0dXJlcy4gICovCi0KLWJvb2xlYW4KLWJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VjdGlvbiwgY29udGFpbmVyLCBhY2Nlc3MsCi0JCQkJICAgc29ydF9rZXksIHF1YWRyYW50KQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXNlY3Rpb24gKmNvbnRhaW5lcjsKLSAgICAgaW50IGFjY2VzczsKLSAgICAgdW5zaWduZWQgaW50IHNvcnRfa2V5OwotICAgICBpbnQgcXVhZHJhbnQ7Ci17Ci0gIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBtYWdpYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YQotCT0gKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotCSAgYmZkX3phbGxvYyAoc2VjdGlvbi0+b3duZXIsCi0JCSAgICAgIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0gICAgICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5ID0gc29ydF9rZXk7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmFjY2Vzc19jb250cm9sX2JpdHMgPSBhY2Nlc3M7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnF1YWRyYW50ID0gcXVhZHJhbnQ7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgZnVsbCBTT00gc3ltYm9sIHR5cGUuICBTT00gbmVlZHMgZmFyIG1vcmUgc3ltYm9sIGluZm9ybWF0aW9uCi0gICB0aGFuIGFueSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXQgSSdtIGF3YXJlIG9mLiAgSXQgaXMgbWFuZGF0b3J5Ci0gICB0byBiZSBhYmxlIHRvIGtub3cgaWYgYSBzeW1ib2wgaXMgYW4gZW50cnkgcG9pbnQsIG1pbGxpY29kZSwgZGF0YSwKLSAgIGNvZGUsIGFic29sdXRlLCBzdG9yYWdlIHJlcXVlc3QsIG9yIHByb2NlZHVyZSBsYWJlbC4gIElmIHlvdSBnZXQKLSAgIHRoZSBzeW1ib2wgdHlwZSB3cm9uZyB5b3VyIHByb2dyYW0gd2lsbCBub3QgbGluay4gICovCi0KLXZvaWQKLWJmZF9zb21fc2V0X3N5bWJvbF90eXBlIChzeW1ib2wsIHR5cGUpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci17Ci0gIHNvbV9zeW1ib2xfZGF0YSAoc3ltYm9sKS0+c29tX3R5cGUgPSB0eXBlOwotfQotCi0vKiBBdHRhY2ggYW4gYXV4aWxpYXJ5IGhlYWRlciB0byB0aGUgQkZEIGJhY2tlbmQgc28gdGhhdCBpdCBtYXkgYmUKLSAgIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0IGZpbGUuICAqLwotYm9vbGVhbgotYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoYWJmZCwgdHlwZSwgc3RyaW5nKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmICh0eXBlID09IFZFUlNJT05fQVVYX0lEKQotICAgIHsKLSAgICAgIGludCBsZW4gPSBzdHJsZW4gKHN0cmluZyk7Ci0gICAgICBpbnQgcGFkID0gMDsKLQotICAgICAgaWYgKGxlbiAlIDQpCi0JcGFkID0gKDQgLSAobGVuICUgNCkpOwotICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkgPSAoc3RydWN0IHVzZXJfc3RyaW5nX2F1eF9oZHIgKikKLQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhdXhfaWQpCi0JCQkgICAgICArIHNpemVvZiAodW5zaWduZWQgaW50KSArIGxlbiArIHBhZCk7Ci0gICAgICBpZiAoIW9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5oZWFkZXJfaWQudHlwZSA9IFZFUlNJT05fQVVYX0lEOwotICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggPSBsZW4gKyBwYWQ7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCArPSBzaXplb2YgKGludCk7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+c3RyaW5nX2xlbmd0aCA9IGxlbjsKLSAgICAgIHN0cm5jcHkgKG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT51c2VyX3N0cmluZywgc3RyaW5nLCBsZW4pOwotICAgIH0KLSAgZWxzZSBpZiAodHlwZSA9PSBDT1BZUklHSFRfQVVYX0lEKQotICAgIHsKLSAgICAgIGludCBsZW4gPSBzdHJsZW4gKHN0cmluZyk7Ci0gICAgICBpbnQgcGFkID0gMDsKLQotICAgICAgaWYgKGxlbiAlIDQpCi0JcGFkID0gKDQgLSAobGVuICUgNCkpOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKSA9IChzdHJ1Y3QgY29weXJpZ2h0X2F1eF9oZHIgKikKLQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhdXhfaWQpCi0JCQkgICAgKyBzaXplb2YgKHVuc2lnbmVkIGludCkgKyBsZW4gKyBwYWQpOwotICAgICAgaWYgKCFvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC50eXBlID0gQ09QWVJJR0hUX0FVWF9JRDsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggPSBsZW4gKyBwYWQ7Ci0gICAgICBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoICs9IHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPnN0cmluZ19sZW5ndGggPSBsZW47Ci0gICAgICBzdHJjcHkgKG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmNvcHlyaWdodCwgc3RyaW5nKTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBdHRhY2ggYW4gY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgdG8gdGhlIEJGRCBiYWNrZW5kIHNvIHRoYXQgaXQgbWF5IGJlCi0gICB3cml0dGVuIGludG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotYm9vbGVhbgotYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdCAoYWJmZCwgbmFtZSwgbGFuZ3VhZ2VfbmFtZSwgcHJvZHVjdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25faWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2VfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcHJvZHVjdF9pZDsKLSAgICAgY29uc3QgY2hhciAqdmVyc2lvbl9pZDsKLXsKLSAgQ09NUFVOSVQgKm4gPSAoQ09NUFVOSVQgKikgYmZkX3phbGxvYyAoYWJmZCwgQ09NUFVOSVRTWik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0jZGVmaW5lIFNUUkRVUChmKSBcCi0gIGlmIChmICE9IE5VTEwpIFwKLSAgICB7IFwKLSAgICAgIG4tPmYubl9uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGYpICsgMSk7IFwKLSAgICAgIGlmIChuLT5mLm5fbmFtZSA9PSBOVUxMKSBcCi0JcmV0dXJuIGZhbHNlOyBcCi0gICAgICBzdHJjcHkgKG4tPmYubl9uYW1lLCBmKTsgXAotICAgIH0KLQotICBTVFJEVVAgKG5hbWUpOwotICBTVFJEVVAgKGxhbmd1YWdlX25hbWUpOwotICBTVFJEVVAgKHByb2R1Y3RfaWQpOwotICBTVFJEVVAgKHZlcnNpb25faWQpOwotCi0jdW5kZWYgU1RSRFVQCi0KLSAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSA9IG47Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChjb3VudCA9PSAwIHx8ICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKShvZmZzZXQrY291bnQpID4gc2VjdGlvbi0+X3Jhd19zaXplCi0gICAgICB8fCBiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpID09IC0xCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKTEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogU2V0IHVwIGZpeGVkIHBhcnRzIG9mIHRoZSBmaWxlLCBzcGFjZSwgYW5kIHN1YnNwYWNlIGhlYWRlcnMuCi0JIE5vdGlmeSB0aGUgd29ybGQgdGhhdCBvdXRwdXQgaGFzIGJlZ3VuLiAgKi8KLSAgICAgIHNvbV9wcmVwX2hlYWRlcnMgKGFiZmQpOwotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgICAvKiBTdGFydCB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaW5jbHVkZSBhbGwgdGhlIHN0cmluZwotCSB0YWJsZXMsIGZpeHVwIHN0cmVhbXMsIGFuZCBvdGhlciBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgc29tX2JlZ2luX3dyaXRpbmcgKGFiZmQpOwotICAgIH0KLQotICAvKiBPbmx5IHdyaXRlIHN1YnNwYWNlcyB3aGljaCBoYXZlICJyZWFsIiBjb250ZW50cyAoZWcuIHRoZSBjb250ZW50cwotICAgICBhcmUgbm90IGdlbmVyYXRlZCBhdCBydW4gdGltZSBieSB0aGUgT1MpLiAgKi8KLSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pCi0gICAgICB8fCAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlayB0byB0aGUgcHJvcGVyIG9mZnNldCB3aXRoaW4gdGhlIG9iamVjdCBmaWxlIGFuZCB3cml0ZSB0aGUKLSAgICAgZGF0YS4gICovCi0gIG9mZnNldCArPSBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZTsgCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIC8qIEFsbG93IGFueSBhcmNoaXRlY3R1cmUgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZSBTT00gYmFja2VuZCAqLwotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAotCQkJZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIHJldHVybiAoZmFsc2UpOwotfQotCi1zdGF0aWMgaW50Ci1zb21fc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygic29tX3NpemVvZl9oZWFkZXJzIHVuaW1wbGVtZW50ZWQiKSk7Ci0gIGZmbHVzaCAoc3RkZXJyKTsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgdHlwZSBjb3JyZXNwb25kaW5nIHRvCi0gICBTT00gc2VjdGlvbiBTLCBvciAnPycgZm9yIGFuIHVua25vd24gU09NIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgY2hhcgotc29tX3NlY3Rpb25fdHlwZSAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgY29uc3Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSAqdDsKLQotICBmb3IgKHQgPSAmc3R0WzBdOyB0LT5zZWN0aW9uOyB0KyspCi0gICAgaWYgKCFzdHJjbXAgKHMsIHQtPnNlY3Rpb24pKQotICAgICAgcmV0dXJuIHQtPnR5cGU7Ci0gIHJldHVybiAnPyc7Ci19Ci0KLXN0YXRpYyBpbnQKLXNvbV9kZWNvZGVfc3ltY2xhc3MgKHN5bWJvbCkKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBjaGFyIGM7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ0MnOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnVSc7Ci0gIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdJJzsKLSAgaWYgKCEoc3ltYm9sLT5mbGFncyAmIChCU0ZfR0xPQkFMfEJTRl9MT0NBTCkpKQotICAgIHJldHVybiAnPyc7Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgfHwgKHNvbV9zeW1ib2xfZGF0YSAoc3ltYm9sKSAhPSBOVUxMCi0JICAmJiBzb21fc3ltYm9sX2RhdGEgKHN5bWJvbCktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0FCU09MVVRFKSkKLSAgICBjID0gJ2EnOwotICBlbHNlIGlmIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgYyA9IHNvbV9zZWN0aW9uX3R5cGUgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gJz8nOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0gICAgYyA9IHRvdXBwZXIgKGMpOwotICByZXR1cm4gYzsKLX0KLQotLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IFNPTSBzeW1ib2wgU1lNQk9MIGluIFJFVC4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgcmV0LT50eXBlID0gc29tX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKTsKLSAgaWYgKHJldC0+dHlwZSAhPSAnVScpCi0gICAgcmV0LT52YWx1ZSA9IHN5bWJvbC0+dmFsdWUrc3ltYm9sLT5zZWN0aW9uLT52bWE7Ci0gIGVsc2UKLSAgICByZXQtPnZhbHVlID0gMDsKLSAgcmV0LT5uYW1lID0gc3ltYm9sLT5uYW1lOwotfQotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlLiAgTmVjZXNzYXJ5Ci0gICBzbyB0aGF0IHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIHRoZSBjYXJzeW1zIGF0IG9uY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzIChhYmZkLCBsc3RfaGVhZGVyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgbHN0X2hlYWRlciAqbHN0X2hlYWRlcjsKLSAgICAgc3ltaW5kZXggKmNvdW50OwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50ICpoYXNoX3RhYmxlID0gTlVMTDsKLSAgZmlsZV9wdHIgbHN0X2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCkgLSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQotICBoYXNoX3RhYmxlID0gCi0gICAgKHVuc2lnbmVkIGludCAqKSBiZmRfbWFsbG9jIChsc3RfaGVhZGVyLT5oYXNoX3NpemUKLQkJCQkgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOwotICBpZiAoaGFzaF90YWJsZSA9PSBOVUxMICYmIGxzdF9oZWFkZXItPmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIERvbid0IGZvcmdldCB0byBpbml0aWFsaXplIHRoZSBjb3VudGVyISAgKi8KLSAgKmNvdW50ID0gMDsKLQotICAvKiBSZWFkIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGhhcyB0YWJsZSBpcyBhbiBhcnJheSBvZiAzMmJpdCBmaWxlIG9mZnNldHMKLSAgICAgd2hpY2ggcG9pbnQgdG8gdGhlIGhhc2ggY2hhaW5zLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBoYXNoX3RhYmxlLCBsc3RfaGVhZGVyLT5oYXNoX3NpemUsIDQsIGFiZmQpCi0gICAgICAhPSBsc3RfaGVhZGVyLT5oYXNoX3NpemUgKiA0KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdhbGsgZWFjaCBjaGFpbiBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZm91bmQgb24gdGhhdCBwYXJ0aWN1bGFyCi0gICAgIGNoYWluLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGxzdF9oZWFkZXItPmhhc2hfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCBsc3Rfc3ltYm9sOwotCi0gICAgICAvKiBBbiBlbXB0eSBjaGFpbiBoYXMgemVybyBhcyBpdCdzIGZpbGUgb2Zmc2V0LiAgKi8KLSAgICAgIGlmIChoYXNoX3RhYmxlW2ldID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZWsgdG8gdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGlzIGhhc2ggY2hhaW4uICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGhhc2hfdGFibGVbaV0sIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFJlYWQgaW4gdGhpcyBzeW1ib2wgYW5kIHVwZGF0ZSB0aGUgY291bnRlci4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X3N5bWJvbCwgMSwgc2l6ZW9mIChsc3Rfc3ltYm9sKSwgYWJmZCkKLQkgICE9IHNpemVvZiAobHN0X3N5bWJvbCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgICgqY291bnQpKys7Ci0KLSAgICAgIC8qIE5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIHN5bWJvbHMgb24gdGhpcyBjaGFpbi4gICovCi0gICAgICB3aGlsZSAobHN0X3N5bWJvbC5uZXh0X2VudHJ5KQotCXsKLQotCSAgLyogU2VlayB0byB0aGUgbmV4dCBzeW1ib2wuICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9zeW1ib2wubmV4dF9lbnRyeSwgU0VFS19TRVQpCi0JICAgICAgPCAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogUmVhZCB0aGUgc3ltYm9sIGluIGFuZCB1cGRhdGUgdGhlIGNvdW50ZXIuICAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9zeW1ib2wsIDEsIHNpemVvZiAobHN0X3N5bWJvbCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICgqY291bnQpKys7Ci0JfQotICAgIH0KLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRmlsbCBpbiB0aGUgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scyAoU1lNUykgZnJvbSB0aGUgYXJjaGl2ZSBkZXNjcmliZWQKLSAgIGJ5IEFCRkQgYW5kIExTVF9IRUFERVIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMgKGFiZmQsIGxzdF9oZWFkZXIsIHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGxzdF9oZWFkZXIgKmxzdF9oZWFkZXI7Ci0gICAgIGNhcnN5bSAqKnN5bXM7Ci17Ci0gIHVuc2lnbmVkIGludCBpLCBsZW47Ci0gIGNhcnN5bSAqc2V0ID0gc3ltc1swXTsKLSAgdW5zaWduZWQgaW50ICpoYXNoX3RhYmxlID0gTlVMTDsKLSAgc3RydWN0IHNvbV9lbnRyeSAqc29tX2RpY3QgPSBOVUxMOwotICBmaWxlX3B0ciBsc3RfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSAtIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCi0gIGhhc2hfdGFibGUgPSAKLSAgICAodW5zaWduZWQgaW50ICopIGJmZF9tYWxsb2MgKGxzdF9oZWFkZXItPmhhc2hfc2l6ZQotCQkJCSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0gIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0X2hlYWRlci0+aGFzaF9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc29tX2RpY3QgPQotICAgIChzdHJ1Y3Qgc29tX2VudHJ5ICopIGJmZF9tYWxsb2MgKGxzdF9oZWFkZXItPm1vZHVsZV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKTsKLSAgaWYgKHNvbV9kaWN0ID09IE5VTEwgJiYgbHN0X2hlYWRlci0+bW9kdWxlX2NvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogUmVhZCBpbiB0aGUgaGFzaCB0YWJsZS4gIFRoZSBoYXMgdGFibGUgaXMgYW4gYXJyYXkgb2YgMzJiaXQgZmlsZSBvZmZzZXRzCi0gICAgIHdoaWNoIHBvaW50IHRvIHRoZSBoYXNoIGNoYWlucy4gICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgaGFzaF90YWJsZSwgbHN0X2hlYWRlci0+aGFzaF9zaXplLCA0LCBhYmZkKQotICAgICAgIT0gbHN0X2hlYWRlci0+aGFzaF9zaXplICogNCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBTZWVrIHRvIGFuZCByZWFkIGluIHRoZSBTT00gZGljdGlvbmFyeS4gIFdlIHdpbGwgbmVlZCB0aGlzIHRvIGZpbGwKLSAgICAgaW4gdGhlIGNhcnN5bSdzIGZpbGVwb3MgZmllbGQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgbHN0X2hlYWRlci0+ZGlyX2xvYywgU0VFS19TRVQpIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHNvbV9kaWN0LCBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQsIAotCQlzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpLCBhYmZkKQotICAgICAgIT0gbHN0X2hlYWRlci0+bW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXYWxrIGVhY2ggY2hhaW4gZmlsbGluZyBpbiB0aGUgY2Fyc3ltcyBhcyB3ZSBnbyBhbG9uZy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBsc3RfaGVhZGVyLT5oYXNoX3NpemU7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgbHN0X3N5bWJvbDsKLQotICAgICAgLyogQW4gZW1wdHkgY2hhaW4gaGFzIHplcm8gYXMgaXQncyBmaWxlIG9mZnNldC4gICovCi0gICAgICBpZiAoaGFzaF90YWJsZVtpXSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWVrIHRvIGFuZCByZWFkIHRoZSBmaXJzdCBzeW1ib2wgb24gdGhlIGNoYWluLiAgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBoYXNoX3RhYmxlW2ldLCBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X3N5bWJvbCwgMSwgc2l6ZW9mIChsc3Rfc3ltYm9sKSwgYWJmZCkKLQkgICE9IHNpemVvZiAobHN0X3N5bWJvbCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLCBmaXJzdCBnZXQgdGhlIGxlbmd0aCB3aGljaCBpcyBzdG9yZWQKLQkgYXMgYSAzMmJpdCBpbnRlZ2VyIGp1c3QgYmVmb3JlIHRoZSBzeW1ib2wuCi0KLQkgT25lIG1pZ2h0IGFzayB3aHkgd2UgZG9uJ3QganVzdCByZWFkIGluIHRoZSBlbnRpcmUgc3RyaW5nIHRhYmxlCi0JIGFuZCBpbmRleCBpbnRvIGl0LiAgV2VsbCwgYWNjb3JkaW5nIHRvIHRoZSBTT00gQUJJIHRoZSBzdHJpbmcKLQkgaW5kZXggY2FuIHBvaW50ICphbnl3aGVyZSogaW4gdGhlIGFyY2hpdmUgdG8gc2F2ZSBzcGFjZSwgc28ganVzdAotCSB1c2luZyB0aGUgc3RyaW5nIHRhYmxlIHdvdWxkIG5vdCBiZSBzYWZlLiAgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3RfaGVhZGVyLT5zdHJpbmdfbG9jCi0JCQkgICAgKyBsc3Rfc3ltYm9sLm5hbWUubl9zdHJ4IC0gNCwgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGJmZF9yZWFkICgmbGVuLCAxLCA0LCBhYmZkKSAhPSA0KQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG5hbWUgYW5kIG51bGwgdGVybWluYXRlIGl0IHRvby4gICovCi0gICAgICBzZXQtPm5hbWUgPSBiZmRfemFsbG9jIChhYmZkLCBsZW4gKyAxKTsKLSAgICAgIGlmICghc2V0LT5uYW1lKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkIChzZXQtPm5hbWUsIDEsIGxlbiwgYWJmZCkgIT0gbGVuKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZXQtPm5hbWVbbGVuXSA9IDA7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpbGUgb2Zmc2V0LiAgTm90ZSB0aGF0IHRoZSAibG9jYXRpb24iIGZpZWxkIHBvaW50cwotCSB0byB0aGUgU09NIGl0c2VsZiwgbm90IHRoZSBhcl9oZHIgaW4gZnJvbnQgb2YgaXQuICAqLwotICAgICAgc2V0LT5maWxlX29mZnNldCA9IHNvbV9kaWN0W2xzdF9zeW1ib2wuc29tX2luZGV4XS5sb2NhdGlvbgotCQkJICAtIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0KLSAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0gICAgICBzZXQrKzsKLQotICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBjaGFpbi4gICovCi0gICAgICB3aGlsZSAobHN0X3N5bWJvbC5uZXh0X2VudHJ5KQotCXsKLQkgIC8qIFNlZWsgdG8gdGhlIG5leHQgc3ltYm9sIGFuZCByZWFkIGl0IGluLiAgKi8KLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3Rfc3ltYm9sLm5leHRfZW50cnksIFNFRUtfU0VUKSA8MCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAobHN0X3N5bWJvbCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBTZWVrIHRvIHRoZSBuYW1lIGxlbmd0aCAmIHN0cmluZyBhbmQgcmVhZCB0aGVtIGluLiAgKi8KLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3RfaGVhZGVyLT5zdHJpbmdfbG9jIAotCQkJCSsgbHN0X3N5bWJvbC5uYW1lLm5fc3RyeCAtIDQsIFNFRUtfU0VUKSA8IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoYmZkX3JlYWQgKCZsZW4sIDEsIDQsIGFiZmQpICE9IDQpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG5hbWUgYW5kIG51bGwgdGVybWluYXRlIGl0IHRvby4gICovCi0JICBzZXQtPm5hbWUgPSBiZmRfemFsbG9jIChhYmZkLCBsZW4gKyAxKTsKLQkgIGlmICghc2V0LT5uYW1lKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGJmZF9yZWFkIChzZXQtPm5hbWUsIDEsIGxlbiwgYWJmZCkgIT0gbGVuKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHNldC0+bmFtZVtsZW5dID0gMDsKLQotCSAgLyogRmlsbCBpbiB0aGUgZmlsZSBvZmZzZXQuICBOb3RlIHRoYXQgdGhlICJsb2NhdGlvbiIgZmllbGQgcG9pbnRzCi0JICAgICB0byB0aGUgU09NIGl0c2VsZiwgbm90IHRoZSBhcl9oZHIgaW4gZnJvbnQgb2YgaXQuICAqLwotCSAgc2V0LT5maWxlX29mZnNldCA9IHNvbV9kaWN0W2xzdF9zeW1ib2wuc29tX2luZGV4XS5sb2NhdGlvbgotCQkJICAgICAgIC0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLQotCSAgLyogR28gb24gdG8gdGhlIG5leHQgc3ltYm9sLiAgKi8KLQkgIHNldCsrOwotCX0KLSAgICB9Ci0gIC8qIElmIHdlIGhhdmVuJ3QgZGllZCBieSBub3csIHRoZW4gd2Ugc3VjY2Vzc2Z1bGx5IHJlYWQgdGhlIGVudGlyZSAKLSAgICAgYXJjaGl2ZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfdGFibGUpOwotICBpZiAoc29tX2RpY3QgIT0gTlVMTCkKLSAgICBmcmVlIChzb21fZGljdCk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfdGFibGUpOwotICBpZiAoc29tX2RpY3QgIT0gTlVMTCkKLSAgICBmcmVlIChzb21fZGljdCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiB0aGUgTFNUIGZyb20gdGhlIGFyY2hpdmUuICAqLwotc3RhdGljIGJvb2xlYW4KLXNvbV9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbHN0X2hlYWRlciBsc3RfaGVhZGVyOwotICBzdHJ1Y3QgYXJfaGRyIGFyX2hlYWRlcjsKLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICBpbnQgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotCi0gIC8qIFNwZWNpYWwgY2FzZXMuICAqLwotICBpZiAoaSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoaSAhPSAxNikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZvciBhcmNoaXZlcyB3aXRob3V0IC5vIGZpbGVzIHRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikpCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogUmVhZCBpbiBhbmQgc2FuaXR5IGNoZWNrIHRoZSBhcmNoaXZlIGhlYWRlci4gICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmFyX2hlYWRlciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChzdHJuY21wIChhcl9oZWFkZXIuYXJfZm1hZywgQVJGTUFHLCAyKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBIb3cgYmlnIGlzIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBlbnRyeT8gICovCi0gIGVycm5vID0gMDsKLSAgcGFyc2VkX3NpemUgPSBzdHJ0b2wgKGFyX2hlYWRlci5hcl9zaXplLCBOVUxMLCAxMCk7Ci0gIGlmIChlcnJubyAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFNhdmUgb2ZmIHRoZSBmaWxlIG9mZnNldCBvZiB0aGUgZmlyc3QgcmVhbCB1c2VyIGRhdGEuICAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSArIHBhcnNlZF9zaXplOwotCi0gIC8qIFJlYWQgaW4gdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgV2UnbGwgbWFrZSBoZWF2eSB1c2Ugb2YgdGhpcwotICAgICBpbiBqdXN0IGEgbWludXRlLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9oZWFkZXIsIDEsIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNhbml0eSBjaGVjay4gICovCi0gIGlmIChsc3RfaGVhZGVyLmFfbWFnaWMgIT0gTElCTUFHSUMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ291bnQgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIHRoZSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgKGFiZmQsICZsc3RfaGVhZGVyLCAmYXJkYXRhLT5zeW1kZWZfY291bnQpCi0gICAgICA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2V0IGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgLSBwYXJzZWRfc2l6ZSAKLQkJCSsgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEluaXRpYWxpemFlIHRoZSBjYWNoZSBhbmQgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBsaWJyYXJ5IHN5bWJvbHMuICAqLwotICBhcmRhdGEtPmNhY2hlID0gMDsKLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgKGFyZGF0YS0+c3ltZGVmX2NvdW50Ci0JCQkJCSAgICogc2l6ZW9mIChjYXJzeW0pKSk7Ci0gIGlmICghYXJkYXRhLT5zeW1kZWZzKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgZmlsbCBpbiB0aGUgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scy4gICovCi0gIGlmIChzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyAoYWJmZCwgJmxzdF9oZWFkZXIsICZhcmRhdGEtPnN5bWRlZnMpCi0gICAgICA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2VlayBiYWNrIHRvIHRoZSAiZmlyc3QiIGZpbGUgaW4gdGhlIGFyY2hpdmUuICBOb3RlIHRoZSAiZmlyc3QiCi0gICAgIGZpbGUgbWF5IGJlIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcywgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm90aWZ5IHRoZSBnZW5lcmljIGFyY2hpdmUgY29kZSB0aGF0IHdlIGhhdmUgYSBzeW1ib2wgbWFwLiAgKi8KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEJlZ2luIHByZXBhcmluZyB0byB3cml0ZSBhIFNPTSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4KLQotICAgQXMgcGFydCBvZiB0aGUgcHJlcCB3b3JrIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc3ltYm9scwotICAgYW5kIHRoZSBzaXplIG9mIHRoZSBhc3NvY2lhdGVkIHN0cmluZyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUgKGFiZmQsIG51bV9zeW1zLCBzdHJpbmdzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCAqbnVtX3N5bXMsICpzdHJpbmdzaXplOwotewotICBiZmQgKmN1cnJfYmZkID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotCi0gIC8qIFNvbWUgaW5pdGlhbGl6YXRpb24uICAqLwotICAqbnVtX3N5bXMgPSAwOwotICAqc3RyaW5nc2l6ZSA9IDA7Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIGVhY2ggQkZEIHdpdGhpbiB0aGlzIGFyY2hpdmUuICAqLwotICB3aGlsZSAoY3Vycl9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY3Vycl9jb3VudCwgaTsKLSAgICAgIHNvbV9zeW1ib2xfdHlwZSAqc3ltOwotCi0gICAgICAvKiBEb24ndCBib3RoZXIgZm9yIG5vbi1TT00gb2JqZWN0cy4gICovCi0gICAgICBpZiAoY3Vycl9iZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0Ci0JICB8fCBjdXJyX2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyKQotCXsKLQkgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIHJlYWQsIHRoZW4gc25hZyBhIHBvaW50ZXIKLQkgdG8gaXQuICBJdCdzIGEgbGl0dGxlIHNsaW1leSB0byBncmFiIHRoZSBzeW1ib2xzIHZpYSBvYmpfc29tX3N5bXRhYiwKLQkgYnV0IGRvaW5nIHNvIGF2b2lkcyBhbGxvY2F0aW5nIGxvdHMgb2YgZXh0cmEgbWVtb3J5LiAgKi8KLSAgICAgIGlmIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChjdXJyX2JmZCkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeW0gPSBvYmpfc29tX3N5bXRhYiAoY3Vycl9iZmQpOwotICAgICAgY3Vycl9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGN1cnJfYmZkKTsKLQotICAgICAgLyogRXhhbWluZSBlYWNoIHN5bWJvbCB0byBkZXRlcm1pbmUgaWYgaXQgYmVsb25ncyBpbiB0aGUKLQkgbGlicmFyeSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJfY291bnQ7IGkrKywgc3ltKyspCi0JewotCSAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvIGluZm87Ci0KLQkgIC8qIERlcml2ZSBTT00gaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIHN5bWJvbC4gICovCi0JICBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChjdXJyX2JmZCwgJnN5bS0+c3ltYm9sLCAmaW5mbyk7Ci0KLQkgIC8qIFNob3VsZCB3ZSBpbmNsdWRlIHRoaXMgc3ltYm9sPyAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF90eXBlID09IFNUX05VTEwKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX1NZTV9FWFQKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX0FSR19FWFQpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBPbmx5IGdsb2JhbCBzeW1ib2xzIGFuZCB1bnNhdGlzZmllZCBjb21tb25zLiAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF9zY29wZSAhPSBTU19VTklWRVJTQUwKLQkgICAgICAmJiBpbmZvLnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBEbyBubyBpbmNsdWRlIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c3ltYm9sLnNlY3Rpb24pKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQnVtcCB0aGUgdmFyaW91cyBjb3VudGVycywgYmVpbmcgY2FyZWZ1bCB0byBob25vcgotCSAgICAgYWxpZ25tZW50IGNvbnNpZGVyYXRpb25zIGluIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgKCpudW1fc3ltcykrKzsKLQkgICpzdHJpbmdzaXplID0gKnN0cmluZ3NpemUgKyBzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpICsgNTsKLQkgIHdoaWxlICgqc3RyaW5nc2l6ZSAlIDQpCi0JICAgICgqc3RyaW5nc2l6ZSkrKzsKLQl9Ci0KLSAgICAgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFzaCBhIHN5bWJvbCBuYW1lIGJhc2VkIG9uIHRoZSBoYXNoaW5nIGFsZ29yaXRobSBwcmVzZW50ZWQgaW4gdGhlCi0gICBTT00gQUJJLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXNvbV9iZmRfYXJfc3ltYm9sX2hhc2ggKHN5bWJvbCkKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICB1bnNpZ25lZCBpbnQgbGVuID0gc3RybGVuIChzeW1ib2wtPm5hbWUpOwotCi0gIC8qIE5hbWVzIHdpdGggbGVuZ3RoIDEgYXJlIHNwZWNpYWwuICAqLwotICBpZiAobGVuID09IDEpCi0gICAgcmV0dXJuIDB4MTAwMDEwMCB8IChzeW1ib2wtPm5hbWVbMF0gPDwgMTYpIHwgc3ltYm9sLT5uYW1lWzBdOwotCi0gIHJldHVybiAoKGxlbiAmIDB4N2YpIDw8IDI0KSB8IChzeW1ib2wtPm5hbWVbMV0gPDwgMTYpCi0JICB8IChzeW1ib2wtPm5hbWVbbGVuLTJdIDw8IDgpIHwgc3ltYm9sLT5uYW1lW2xlbi0xXTsKLX0KLQotLyogRG8gdGhlIGJ1bGsgb2YgdGhlIHdvcmsgcmVxdWlyZWQgdG8gd3JpdGUgdGhlIFNPTSBsaWJyYXJ5Ci0gICBzeW1ib2wgdGFibGUuICAqLwotICAgCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYgKGFiZmQsIG5zeW1zLCBzdHJpbmdfc2l6ZSwgbHN0LCBlbGVuZ3RoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBuc3ltcywgc3RyaW5nX3NpemU7Ci0gICAgIHN0cnVjdCBsc3RfaGVhZGVyIGxzdDsKLSAgICAgdW5zaWduZWQgZWxlbmd0aDsKLXsKLSAgZmlsZV9wdHIgbHN0X2ZpbGVwb3M7Ci0gIGNoYXIgKnN0cmluZ3MgPSBOVUxMLCAqcDsKLSAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICpsc3Rfc3ltcyA9IE5VTEwsICpjdXJyX2xzdF9zeW07Ci0gIGJmZCAqY3Vycl9iZmQ7Ci0gIHVuc2lnbmVkIGludCAqaGFzaF90YWJsZSA9IE5VTEw7Ci0gIHN0cnVjdCBzb21fZW50cnkgKnNvbV9kaWN0ID0gTlVMTDsKLSAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICoqbGFzdF9oYXNoX2VudHJ5ID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IGN1cnJfc29tX29mZnNldCwgc29tX2luZGV4ID0gMDsKLQotICBoYXNoX3RhYmxlID0KLSAgICAodW5zaWduZWQgaW50ICopIGJmZF9tYWxsb2MgKGxzdC5oYXNoX3NpemUgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOwotICBpZiAoaGFzaF90YWJsZSA9PSBOVUxMICYmIGxzdC5oYXNoX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgc29tX2RpY3QgPQotICAgIChzdHJ1Y3Qgc29tX2VudHJ5ICopIGJmZF9tYWxsb2MgKGxzdC5tb2R1bGVfY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSk7Ci0gIGlmIChzb21fZGljdCA9PSBOVUxMICYmIGxzdC5tb2R1bGVfY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBsYXN0X2hhc2hfZW50cnkgPQotICAgICgoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICoqKQotICAgICBiZmRfbWFsbG9jIChsc3QuaGFzaF9zaXplICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKikpKTsKLSAgaWYgKGxhc3RfaGFzaF9lbnRyeSA9PSBOVUxMICYmIGxzdC5oYXNoX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBMb3RzIG9mIGZpZWxkcyBhcmUgZmlsZSBwb3NpdGlvbnMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0Ci0gICAgIG9mIHRoZSBsc3QgcmVjb3JkLiAgU28gc2F2ZSBpdHMgbG9jYXRpb24uICAqLwotICBsc3RfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSAtIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCi0gIC8qIFNvbWUgaW5pdGlhbGl6YXRpb24uICAqLwotICBtZW1zZXQgKGhhc2hfdGFibGUsIDAsIDQgKiBsc3QuaGFzaF9zaXplKTsKLSAgbWVtc2V0IChzb21fZGljdCwgMCwgbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpOwotICBtZW1zZXQgKGxhc3RfaGFzaF9lbnRyeSwgMCwgCQotCSAgbHN0Lmhhc2hfc2l6ZSAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICopKTsKLQotICAvKiBTeW1ib2xzIGhhdmUgc29tX2luZGV4IGZpZWxkcywgc28gd2UgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHRoZQotICAgICBpbmRleCBvZiBlYWNoIFNPTSBpbiB0aGUgYXJjaGl2ZS4KLQotICAgICBUaGUgU09NIGRpY3Rpb25hcnkgaGFzIChhbW9uZyBvdGhlciB0aGluZ3MpIHRoZSBhYnNvbHV0ZSBmaWxlCi0gICAgIHBvc2l0aW9uIGZvciB0aGUgU09NIHdoaWNoIGEgcGFydGljdWxhciBkaWN0aW9uYXJ5IGVudHJ5Ci0gICAgIGRlc2NyaWJlcy4gIFdlIGhhdmUgdG8gY29tcHV0ZSB0aGF0IGluZm9ybWF0aW9uIGFzIHdlIGl0ZXJhdGUKLSAgICAgdGhyb3VnaCB0aGUgU09Ncy9zeW1ib2xzLiAgKi8KLSAgc29tX2luZGV4ID0gMDsKLQotICAvKiBXZSBhZGQgaW4gdGhlIHNpemUgb2YgdGhlIGFyY2hpdmUgaGVhZGVyIHR3aWNlIGFzIHRoZSBsb2NhdGlvbgotICAgICBpbiB0aGUgU09NIGRpY3Rpb25hcnkgaXMgdGhlIGFjdHVhbCBvZmZzZXQgb2YgdGhlIFNPTSwgbm90IHRoZQotICAgICBhcmNoaXZlIGhlYWRlciBiZWZvcmUgdGhlIFNPTS4gICovCi0gIGN1cnJfc29tX29mZnNldCA9IDggKyAyICogc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIGxzdC5maWxlX2VuZDsKLQotICAvKiBNYWtlIHJvb20gZm9yIHRoZSBhcmNoaXZlIGhlYWRlciBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZQotICAgICBleHRlbmRlZCBzdHJpbmcgdGFibGUuICBOb3RlIHRoYXQgZWxlbmd0aCBpbmNsdWRlcyB0aGUgc2l6ZQotICAgICBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlISAgKi8KLSAgaWYgKGVsZW5ndGgpCi0gICAgY3Vycl9zb21fb2Zmc2V0ICs9IGVsZW5ndGg7Ci0KLSAgLyogTWFrZSBzdXJlIHdlJ3JlIHByb3Blcmx5IGFsaWduZWQuICAqLwotICBjdXJyX3NvbV9vZmZzZXQgPSAoY3Vycl9zb21fb2Zmc2V0ICsgMHgxKSAmIH4weDE7Ci0KLSAgLyogRklYTUUgc2hvdWxkIGJlIGRvbmUgd2l0aCBidWZmZXJzIGp1c3QgbGlrZSBldmVyeXRoaW5nIGVsc2UuLi4gKi8KLSAgbHN0X3N5bXMgPSBiZmRfbWFsbG9jIChuc3ltcyAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSk7Ci0gIGlmIChsc3Rfc3ltcyA9PSBOVUxMICYmIG5zeW1zICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHN0cmluZ3MgPSBiZmRfbWFsbG9jIChzdHJpbmdfc2l6ZSk7Ci0gIGlmIChzdHJpbmdzID09IE5VTEwgJiYgc3RyaW5nX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBwID0gc3RyaW5nczsKLSAgY3Vycl9sc3Rfc3ltID0gbHN0X3N5bXM7Ci0KLSAgY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIHdoaWxlIChjdXJyX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjdXJyX2NvdW50LCBpOwotICAgICAgc29tX3N5bWJvbF90eXBlICpzeW07Ci0KLSAgICAgIC8qIERvbid0IGJvdGhlciBmb3Igbm9uLVNPTSBvYmplY3RzLiAgKi8KLSAgICAgIGlmIChjdXJyX2JmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QKLQkgIHx8IGN1cnJfYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0JewotCSAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gcmVhZCwgdGhlbiBzbmFnIGEgcG9pbnRlcgotCSB0byBpdC4gIEl0J3MgYSBsaXR0bGUgc2xpbWV5IHRvIGdyYWIgdGhlIHN5bWJvbHMgdmlhIG9ial9zb21fc3ltdGFiLAotCSBidXQgZG9pbmcgc28gYXZvaWRzIGFsbG9jYXRpbmcgbG90cyBvZiBleHRyYSBtZW1vcnkuICAqLwotICAgICAgaWYgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGN1cnJfYmZkKSA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc3ltID0gb2JqX3NvbV9zeW10YWIgKGN1cnJfYmZkKTsKLSAgICAgIGN1cnJfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChjdXJyX2JmZCk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyX2NvdW50OyBpKyssIHN5bSsrKQotCXsKLQkgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyBpbmZvOwotCi0JICAvKiBEZXJpdmUgU09NIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBzeW1ib2wuICAqLwotCSAgc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyAoY3Vycl9iZmQsICZzeW0tPnN5bWJvbCwgJmluZm8pOwotCi0JICAvKiBTaG91bGQgd2UgaW5jbHVkZSB0aGlzIHN5bWJvbD8gICovCi0JICBpZiAoaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9OVUxMCi0JICAgICAgfHwgaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9TWU1fRVhUCi0JICAgICAgfHwgaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9BUkdfRVhUKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogT25seSBnbG9iYWwgc3ltYm9scyBhbmQgdW5zYXRpc2ZpZWQgY29tbW9ucy4gICovCi0JICBpZiAoaW5mby5zeW1ib2xfc2NvcGUgIT0gU1NfVU5JVkVSU0FMCi0JICAgICAgJiYgaW5mby5zeW1ib2xfdHlwZSAhPSBTVF9TVE9SQUdFKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogRG8gbm8gaW5jbHVkZSB1bmRlZmluZWQgc3ltYm9scy4gICovCi0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnN5bWJvbC5zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN5bWJvbCBmcm9tIHRoaXMgU09NLCB0aGVuIHVwZGF0ZQotCSAgICAgdGhlIFNPTSBkaWN0aW9uYXJ5IHRvby4gICovCi0JICBpZiAoc29tX2RpY3Rbc29tX2luZGV4XS5sb2NhdGlvbiA9PSAwKQotCSAgICB7Ci0JICAgICAgc29tX2RpY3Rbc29tX2luZGV4XS5sb2NhdGlvbiA9IGN1cnJfc29tX29mZnNldDsKLQkgICAgICBzb21fZGljdFtzb21faW5kZXhdLmxlbmd0aCA9IGFyZWx0X3NpemUgKGN1cnJfYmZkKTsKLQkgICAgfQotCi0JICAvKiBGaWxsIGluIHRoZSBsc3Qgc3ltYm9sIHJlY29yZC4gICovCi0JICBjdXJyX2xzdF9zeW0tPmhpZGRlbiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnNlY29uZGFyeV9kZWYgPSBpbmZvLnNlY29uZGFyeV9kZWY7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF90eXBlID0gaW5mby5zeW1ib2xfdHlwZTsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3Njb3BlID0gaW5mby5zeW1ib2xfc2NvcGU7Ci0JICBjdXJyX2xzdF9zeW0tPmNoZWNrX2xldmVsID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+bXVzdF9xdWFsaWZ5ID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+aW5pdGlhbGx5X2Zyb3plbiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPm1lbW9yeV9yZXNpZGVudCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPmlzX2NvbW1vbiA9IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zeW1ib2wuc2VjdGlvbik7Ci0JICBjdXJyX2xzdF9zeW0tPmR1cF9jb21tb24gPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT54bGVhc3QgPSAzOwotCSAgY3Vycl9sc3Rfc3ltLT5hcmdfcmVsb2MgPSBpbmZvLmFyZ19yZWxvYzsKLQkgIGN1cnJfbHN0X3N5bS0+bmFtZS5uX3N0cnggPSBwIC0gc3RyaW5ncyArIDQ7Ci0JICBjdXJyX2xzdF9zeW0tPnF1YWxpZmllcl9uYW1lLm5fc3RyeCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9pbmZvID0gaW5mby5zeW1ib2xfaW5mbzsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3ZhbHVlID0gaW5mby5zeW1ib2xfdmFsdWUgfCBpbmZvLnByaXZfbGV2ZWw7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9kZXNjcmlwdG9yID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+cmVzZXJ2ZWQgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5zb21faW5kZXggPSBzb21faW5kZXg7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgPSBzb21fYmZkX2FyX3N5bWJvbF9oYXNoICgmc3ltLT5zeW1ib2wpOwotCSAgY3Vycl9sc3Rfc3ltLT5uZXh0X2VudHJ5ID0gMDsKLQotCSAgLyogSW5zZXJ0IGludG8gdGhlIGhhc2ggdGFibGUuICAqLwotCSAgaWYgKGhhc2hfdGFibGVbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0pCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKnRtcDsKLQotCSAgICAgIC8qIFRoZXJlIGlzIGFscmVhZHkgc29tZXRoaW5nIGF0IHRoZSBoZWFkIG9mIHRoaXMgaGFzaCBjaGFpbiwKLQkJIHNvIHRhY2sgdGhpcyBzeW1ib2wgb250byB0aGUgZW5kIG9mIHRoZSBjaGFpbi4gICovCi0JICAgICAgdG1wID0gbGFzdF9oYXNoX2VudHJ5W2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdOwotCSAgICAgIHRtcC0+bmV4dF9lbnRyeQotCQk9IChjdXJyX2xzdF9zeW0gLSBsc3Rfc3ltcykgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkKLQkJICArIGxzdC5oYXNoX3NpemUgKiA0IAotCQkgICsgbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkKLQkJICArIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGaXJzdCBlbnRyeSBpbiB0aGlzIGhhc2ggY2hhaW4uICAqLwotCSAgICAgIGhhc2hfdGFibGVbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0KLQkJPSAoY3Vycl9sc3Rfc3ltIC0gbHN0X3N5bXMpICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpCi0JCSAgKyBsc3QuaGFzaF9zaXplICogNCAKLQkJICArIGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQkgICAgfQotCi0JICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN5bWJvbCB3ZSBhZGRlZCB0byB0aGlzIGNoYWluIHNvIHdlIGNhbgotCSAgICAgZWFzaWx5IHVwZGF0ZSBpdHMgbmV4dF9lbnRyeSBwb2ludGVyLiAgKi8KLQkgIGxhc3RfaGFzaF9lbnRyeVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXQotCSAgICA9IGN1cnJfbHN0X3N5bTsKLQotCi0JICAvKiBVcGRhdGUgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICBiZmRfcHV0XzMyIChhYmZkLCBzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpLCBwKTsKLQkgIHAgKz0gNDsKLQkgIHN0cmNweSAocCwgc3ltLT5zeW1ib2wubmFtZSk7Ci0JICBwICs9IHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgKyAxOwotCSAgd2hpbGUgKChpbnQpcCAlIDQpCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDAsIHApOwotCSAgICAgIHArKzsKLQkgICAgfQotCi0JICAvKiBIZWFkIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0JICBjdXJyX2xzdF9zeW0rKzsKLQl9Ci0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2Ygd2hlcmUgZWFjaCBTT00gd2lsbCBmaW5hbGx5IHJlc2lkZTsgdGhlbiBsb29rCi0JIGF0IHRoZSBuZXh0IEJGRC4gICovCi0gICAgICBjdXJyX3NvbV9vZmZzZXQgKz0gYXJlbHRfc2l6ZSAoY3Vycl9iZmQpICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLSAKLSAgICAgIC8qIEEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIGFyY2hpdmUgbWF5IGhhdmUgYW4gb2RkIGxlbmd0aDsgdGhlCi0JIGxpbmtlciByZXF1aXJlcyBvYmplY3RzIGJlZ2luIG9uIGFuIGV2ZW4gYm91bmRhcnkuICBTbyByb3VuZAotCSB1cCB0aGUgY3VycmVudCBvZmZzZXQgYXMgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGN1cnJfc29tX29mZnNldCA9IChjdXJyX3NvbV9vZmZzZXQgKyAweDEpICYgfjB4MTsKLSAgICAgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7Ci0gICAgICBzb21faW5kZXgrKzsKLSAgICB9Ci0KLSAgLyogTm93IHNjcmliYmxlIG91dCB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGhhc2hfdGFibGUsIGxzdC5oYXNoX3NpemUsIDQsIGFiZmQpCi0gICAgICAhPSBsc3QuaGFzaF9zaXplICogNCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGVuIHRoZSBTT00gZGljdGlvbmFyeS4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9kaWN0LCBsc3QubW9kdWxlX2NvdW50LAotCQkgc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSwgYWJmZCkKLSAgICAgICE9IGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBsaWJyYXJ5IHN5bWJvbHMuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBsc3Rfc3ltcywgbnN5bXMsIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSwgYWJmZCkKLSAgICAgICE9IG5zeW1zICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEFuZCBmaW5hbGx5IHRoZSBzdHJpbmdzLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc3RyaW5ncywgc3RyaW5nX3NpemUsIDEsIGFiZmQpICE9IHN0cmluZ19zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgaWYgKGxhc3RfaGFzaF9lbnRyeSAhPSBOVUxMKQotICAgIGZyZWUgKGxhc3RfaGFzaF9lbnRyeSk7Ci0gIGlmIChsc3Rfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGxzdF9zeW1zKTsKLSAgaWYgKHN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzdHJpbmdzKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgaWYgKGxhc3RfaGFzaF9lbnRyeSAhPSBOVUxMKQotICAgIGZyZWUgKGxhc3RfaGFzaF9lbnRyeSk7Ci0gIGlmIChsc3Rfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGxzdF9zeW1zKTsKLSAgaWYgKHN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzdHJpbmdzKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgTFNUIGZvciB0aGUgYXJjaGl2ZS4KLQotICAgWW91J2xsIG5ldmVyIGJlbGlldmUgdGhpcyBpcyByZWFsbHkgaG93IGFybWFwcyBhcmUgaGFuZGxlZCBpbiBTT00uLi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBiZmQgKmN1cnJfYmZkOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICB1bnNpZ25lZCBpbnQgaSwgbHN0X3NpemUsIG5zeW1zLCBzdHJpbmdzaXplOwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IGxzdF9oZWFkZXIgbHN0OwotICBpbnQgKnA7Ci0gCi0gIC8qIFdlJ2xsIHVzZSB0aGlzIGZvciB0aGUgYXJjaGl2ZSdzIGRhdGUgYW5kIG1vZGUgbGF0ZXIuICAqLwotICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZzdGF0YnVmKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBGdWRnZSBmYWN0b3IuICAqLwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJtYXBfdGltZXN0YW1wID0gc3RhdGJ1Zi5zdF9tdGltZSArIDYwOwotCi0gIC8qIEFjY291bnQgZm9yIHRoZSBsc3QgaGVhZGVyIGZpcnN0LiAgKi8KLSAgbHN0X3NpemUgPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQotICAvKiBTdGFydCBidWlsZGluZyB0aGUgTFNUIGhlYWRlci4gICovCi0gIC8qIEZJWE1FOiAgRG8gd2UgbmVlZCB0byBleGFtaW5lIGVhY2ggZWxlbWVudCB0byBkZXRlcm1pbmUgdGhlCi0gICAgIGxhcmdlc3QgaWQgbnVtYmVyPyAgKi8KLSAgbHN0LnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8wOwotICBsc3QuYV9tYWdpYyA9IExJQk1BR0lDOwotICBsc3QudmVyc2lvbl9pZCA9IFZFUlNJT05fSUQ7Ci0gIGxzdC5maWxlX3RpbWUuc2VjcyA9IDA7Ci0gIGxzdC5maWxlX3RpbWUubmFub3NlY3MgPSAwOwotCi0gIGxzdC5oYXNoX2xvYyA9IGxzdF9zaXplOwotICBsc3QuaGFzaF9zaXplID0gU09NX0xTVF9IQVNIX1NJWkU7Ci0KLSAgLyogSGFzaCB0YWJsZSBpcyBhIFNPTV9MU1RfSEFTSF9TSVpFIDMyYml0IG9mZnNldHMuICAqLwotICBsc3Rfc2l6ZSArPSA0ICogU09NX0xTVF9IQVNIX1NJWkU7Ci0KLSAgLyogV2UgbmVlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIFNPTXMgaW4gdGhpcyBhcmNoaXZlLiAgKi8KLSAgY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIGxzdC5tb2R1bGVfY291bnQgPSAwOwotICB3aGlsZSAoY3Vycl9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBPbmx5IHRydWUgU09NIG9iamVjdHMgY291bnQuICAqLwotICAgICAgaWYgKGN1cnJfYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdAotCSAgJiYgY3Vycl9iZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLQlsc3QubW9kdWxlX2NvdW50Kys7Ci0gICAgICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotICAgIH0KLSAgbHN0Lm1vZHVsZV9saW1pdCA9IGxzdC5tb2R1bGVfY291bnQ7Ci0gIGxzdC5kaXJfbG9jID0gbHN0X3NpemU7Ci0gIGxzdF9zaXplICs9IHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkgKiBsc3QubW9kdWxlX2NvdW50OwotCi0gIC8qIFdlIGRvbid0IHN1cHBvcnQgaW1wb3J0L2V4cG9ydCB0YWJsZXMsIGF1eGlsaWFyeSBoZWFkZXJzLAotICAgICBvciBmcmVlIGxpc3RzIHlldC4gIE1ha2UgdGhlIGxpbmtlciB3b3JrIGEgbGl0dGxlIGhhcmRlcgotICAgICB0byBtYWtlIG91ciBsaWZlIGVhc2llci4gICovCi0KLSAgbHN0LmV4cG9ydF9sb2MgPSAwOwotICBsc3QuZXhwb3J0X2NvdW50ID0gMDsKLSAgbHN0LmltcG9ydF9sb2MgPSAwOwotICBsc3QuYXV4X2xvYyA9IDA7Ci0gIGxzdC5hdXhfc2l6ZSA9IDA7Ci0KLSAgLyogQ291bnQgaG93IG1hbnkgc3ltYm9scyB3ZSB3aWxsIGhhdmUgb24gdGhlIGhhc2ggY2hhaW5zIGFuZCB0aGUKLSAgICAgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSAoYWJmZCwgJm5zeW1zLCAmc3RyaW5nc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxzdF9zaXplICs9IHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSAqIG5zeW1zOwotCi0gIC8qIEZvciB0aGUgc3RyaW5nIHRhYmxlLiAgT25lIGRheSB3ZSBtaWdodCBhY3R1YWxseSB1c2UgdGhpcyBpbmZvCi0gICAgIHRvIGF2b2lkIHNtYWxsIHNlZWtzL3JlYWRzIHdoZW4gcmVhZGluZyBhcmNoaXZlcy4gICovCi0gIGxzdC5zdHJpbmdfbG9jID0gbHN0X3NpemU7Ci0gIGxzdC5zdHJpbmdfc2l6ZSA9IHN0cmluZ3NpemU7Ci0gIGxzdF9zaXplICs9IHN0cmluZ3NpemU7Ci0KLSAgLyogU09NIEFCSSBzYXlzIHRoaXMgbXVzdCBiZSB6ZXJvLiAgKi8KLSAgbHN0LmZyZWVfbGlzdCA9IDA7Ci0gIGxzdC5maWxlX2VuZCA9IGxzdF9zaXplOwotCi0gIC8qIENvbXB1dGUgdGhlIGNoZWNrc3VtLiAgTXVzdCBoYXBwZW4gYWZ0ZXIgdGhlIGVudGlyZSBsc3QgaGVhZGVyCi0gICAgIGhhcyBmaWxsZWQgaW4uICAqLwotICBwID0gKGludCAqKSZsc3Q7Ci0gIGxzdC5jaGVja3N1bSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKS9zaXplb2YgKGludCkgLSAxOyBpKyspCi0gICAgbHN0LmNoZWNrc3VtIF49ICpwKys7Ci0KLSAgc3ByaW50ZiAoaGRyLmFyX25hbWUsICIvICAgICAgICAgICAgICAgIik7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYWJmZCktPmFybWFwX3RpbWVzdGFtcCk7Ci0gIHNwcmludGYgKGhkci5hcl91aWQsICIlbGQiLCAobG9uZykgZ2V0dWlkICgpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2dpZCwgIiVsZCIsIChsb25nKSBnZXRnaWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfbW9kZSwgIiUtOG8iLCAodW5zaWduZWQgaW50KSBzdGF0YnVmLnN0X21vZGUpOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbHN0X3NpemUpOwotICBoZHIuYXJfZm1hZ1swXSA9ICdgJzsKLSAgaGRyLmFyX2ZtYWdbMV0gPSAnXDAxMic7Ci0KLSAgLyogVHVybiBhbnkgbnVsbHMgaW50byBzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIGFyIGhlYWRlci4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgc2NyaWJibGUgb3V0IHRoZSBsc3QgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmxzdCwgMSwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQnVpbGQgYW5kIHdyaXRlIHRoZSBhcm1hcC4gICovCi0gIGlmIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiAoYWJmZCwgbnN5bXMsIHN0cmluZ3NpemUsIGxzdCwgZWxlbmd0aCkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qIERvbmUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnJlZSBhbGwgaW5mb3JtYXRpb24gd2UgaGF2ZSBjYWNoZWQgZm9yIHRoaXMgQkZELiAgV2UgY2FuIGFsd2F5cwotICAgcmVhZCBpdCBhZ2FpbiBsYXRlciBpZiB3ZSBuZWVkIGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbzsKLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNkZWZpbmUgRlJFRSh4KSBpZiAoeCAhPSBOVUxMKSB7IGZyZWUgKHgpOyB4ID0gTlVMTDsgfQotICAvKiBGcmVlIHRoZSBuYXRpdmUgc3RyaW5nIGFuZCBzeW1ib2wgdGFibGVzLiAgKi8KLSAgRlJFRSAob2JqX3NvbV9zeW10YWIgKGFiZmQpKTsKLSAgRlJFRSAob2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpKTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIEZyZWUgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IC0xOwotICAgICAgRlJFRSAoc29tX3NlY3Rpb25fZGF0YSAobyktPnJlbG9jX3N0cmVhbSk7Ci0gICAgICAvKiBGcmVlIHRoZSBnZW5lcmljIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIEZSRUUgKG8tPnJlbG9jYXRpb24pOwotICAgIH0KLSN1bmRlZiBGUkVFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBvZiBtaXNjZWxsYW5lb3VzIHN1cHBvcnQgZnVuY3Rpb25zLiAqLwotCi0vKiBMaW5rZXIgc3VwcG9ydCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIChzb21faXNfc3Vic3BhY2UgKHNlYykgJiYgc2VjLT5fcmF3X3NpemUgPiAyNDAwMDApOwotfQotCi0jZGVmaW5lCXNvbV9jbG9zZV9hbmRfY2xlYW51cAkJc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgc29tX3JlYWRfYXJfaGRyCQkJX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIHNvbV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIHNvbV9nZXRfZWx0X2F0X2luZGV4CQlfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBzb21fZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgc29tX3RydW5jYXRlX2FybmFtZQkJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgc29tX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIHNvbV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIHNvbV91cGRhdGVfYXJtYXBfdGltZXN0YW1wCWJmZF90cnVlCi0jZGVmaW5lIHNvbV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgc29tX2dldF9saW5lbm8gICAgICAgICAgICAgICAgICBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHNvbV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wJX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHNvbV9yZWFkX21pbmlzeW1ib2xzCQlfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBzb21fbWluaXN5bWJvbF90b19zeW1ib2wJX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIHNvbV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgc29tX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBzb21fYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBzb21fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgc29tX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHNvbV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIHNvbV9iZmRfZ2Nfc2VjdGlvbnMJCWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLQotY29uc3QgYmZkX3RhcmdldCBzb21fdmVjID0KLXsKLSAgInNvbSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCB8IERZTkFNSUMpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLQotLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gIDAsCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTQsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsCi0gICBzb21fb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNvbV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNvbV93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSN1bmRlZiBzb20KLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKLQotI2VuZGlmIC8qIEhPU1RfSFBQQUhQVVggfHwgSE9TVF9IUFBBQlNEIHx8IEhPU1RfSFBQQU9TRiAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NvbS5oIGIvYmZkL3NvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM3ODA0Li4wMDAwMDAwCi0tLSBhL2JmZC9zb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKiBIUCBQQS1SSVNDIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQ6ICBkZWZpbml0aW9ucyBpbnRlcm5hbCB0byBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX1NPTV9ICi0jZGVmaW5lIF9TT01fSAotCi0jaW5jbHVkZSAibGliaHBwYS5oIgotCi0jaW5jbHVkZSA8YS5vdXQuaD4KLSNpbmNsdWRlIDxsc3QuaD4KLSNpbmNsdWRlIDxhci5oPgotCi0vKiBUaGUgU09NIEJGRCBiYWNrZW5kIGRvZXNuJ3QgY3VycmVudGx5IHVzZSBhbnl0aGluZyBmcm9tIHRoZXNlCi0gICB0d28gaW5jbHVkZSBmaWxlcywgYnV0IGl0J3MgbGlrZWx5IHRvIG5lZWQgdGhlbSBpbiB0aGUgZnV0dXJlLiAgKi8KLSNpZmRlZiBSX0RMVF9SRUwKLSNpbmNsdWRlIDxzaGwuaD4KLSNpbmNsdWRlIDxkbC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKQotLyogQlNEIHVzZXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzY2hlbWUgZm9yIG9iamVjdCBmaWxlIGlkZW50aWZpY2F0aW9uLgotICAgc28gZm9yIG5vdywgZGVmaW5lIF9QQV9SSVNDX0lEIHRvIGFjY2VwdCBhbnkgcmFuZG9tIHZhbHVlIGZvciBhIG1vZGVsCi0gICBudW1iZXIuICAqLwotI3VuZGVmIF9QQV9SSVNDX0lECi0jZGVmaW5lIF9QQV9SSVNDX0lEKF9fbV9udW0pIDEKLSNlbmRpZiAvKiBIT1NUX0hQUEFCU0QgKi8KLQotI2RlZmluZSBGSUxFX0hEUl9TSVpFIHNpemVvZihzdHJ1Y3QgaGVhZGVyKQotI2RlZmluZSBBVVhfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpCi0KLXR5cGVkZWYgc3RydWN0IHNvbV9zeW1ib2wKLSAgewotICAgIGFzeW1ib2wgc3ltYm9sOwotICAgIHVuc2lnbmVkIGludCBzb21fdHlwZTsKLQotICAgIC8qIFN0cnVjdHVyZWQgbGlrZSB0aGUgRUxGIHRjX2RhdGEgdW5pb24uICBBbGxvd3MgbW9yZSBjb2RlIHNoYXJpbmcKLSAgICAgICBpbiBHQVMgdGhpcyB3YXkuICAqLwotICAgIHVuaW9uCi0gICAgICB7Ci0Jc3RydWN0Ci0JewotCSAgdW5zaWduZWQgaW50IGhwcGFfYXJnX3JlbG9jOwotCSAgdW5zaWduZWQgaW50IGhwcGFfcHJpdl9sZXZlbDsKLQl9IGFwOwotCVBUUiBhbnk7Ci0gICAgICB9Ci0gICAgdGNfZGF0YTsKLQotICAgIC8qIEluZGV4IG9mIHRoaXMgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUuICBPbmx5IHVzZWQgd2hlbgotICAgICAgIGJ1aWxkaW5nIHJlbG9jYXRpb24gc3RyZWFtcyBmb3IgaW5jb21wbGV0ZSBvYmplY3RzLiAgKi8KLSAgICBpbnQgaW5kZXg7Ci0KLSAgICAvKiBIb3cgbWFueSB0aW1lcyB0aGlzIHN5bWJvbCBpcyB1c2VkIGluIGEgcmVsb2NhdGlvbi4gIEJ5IHNvcnRpbmcKLSAgICAgICB0aGUgc3ltYm9scyBmcm9tIG1vc3QgdXNlZCB0byBsZWFzdCB1c2VkIHdlIGNhbiBzaWduaWZpY2FudGx5Ci0gICAgICAgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSByZWxvY2F0aW9uIHN0cmVhbSBmb3IgaW5jb21wbGV0ZSBvYmplY3RzLiAgKi8KLSAgICBpbnQgcmVsb2NfY291bnQ7Ci0KLSAgICAvKiBEdXJpbmcgb2JqZWN0IGZpbGUgd3JpdGluZywgdGhlIG9mZnNldCBvZiB0aGUgbmFtZSBvZiB0aGlzIHN5bWJvbAotICAgICAgIGluIHRoZSBTT00gc3RyaW5nIHRhYmxlLiAqLwotICAgIGludCBzdHJpbmd0YWJfb2Zmc2V0OwotICB9Ci1zb21fc3ltYm9sX3R5cGU7Ci0KLS8qIEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIHRoZSBtYWdpYyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gYSBCRkQncwotICAgcHJpdmF0ZSBkYXRhIHdoaWNoIG5lZWRzIHRvIGJlIGNvcGllZCBkdXJpbmcgYW4gb2JqY29weS9zdHJpcCBydW4uICAqLwotc3RydWN0IHNvbV9leGVjX2RhdGEKLSAgewotICAgIC8qIFNvcnQtb2YgYSBtYWdpYyBudW1iZXIuICBCU0QgdXNlcyBpdCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCi0gICAgICAgbmF0aXZlIGV4ZWN1dGFibGVzIGFuZCBocHV4IGV4ZWN1dGFibGVzLiAgKi8KLSAgICBzaG9ydCBzeXN0ZW1faWQ7Ci0KLSAgICAvKiBNYWdpYyBleGVjIGZsYWdzLiAgVGhlc2UgY29udHJvbCB0aGluZ3MgbGlrZSB3aGV0aGVyIG9yIG5vdAotICAgICAgIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jaW5nIGlzIGFsbG93ZWQgYW5kIHRoZSBsaWtlLiAgKi8KLSAgICBsb25nIGV4ZWNfZmxhZ3M7Ci0KLSAgICAvKiBBZGQgbW9yZSBzdHVmZiBoZXJlIGFzIG5lZWRlZC4gIEdvb2QgZXhhbXBsZXMgb2YgaW5mb3JtYXRpb24KLSAgICAgICB3ZSBtaWdodCB3YW50IHRvIHBhc3Mgd291bGQgYmUgcHJlc3VtZWRfZHAsIGVudHJ5XyogYW5kIG1heWJlCi0gICAgICAgb3RoZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVyLiAgKi8KLSAgfTsKLQotc3RydWN0IHNvbWRhdGEKLSAgewotICAgIC8qIEFsbCB0aGUgbWFnaWMgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXhlY3V0YWJsZSB3aGljaCBsaXZlcwotICAgICAgIGluIHRoZSBwcml2YXRlIEJGRCBzdHJ1Y3R1cmUgYW5kIG5lZWRzIHRvIGJlIGNvcGllZCBmcm9tCi0gICAgICAgdGhlIGlucHV0IGJmZCB0byB0aGUgb3V0cHV0IGJmZCBkdXJpbmcgYSBvYmpjb3B5L3N0cmlwLiAgKi8KLSAgICBzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSAqZXhlY19kYXRhOwotCi0gICAgLyogVGhlc2UgdGhyZWUgZmllbGRzIGFyZSBvbmx5IHVzZWQgd2hlbiB3cml0aW5nIGZpbGVzIGFuZCBhcmUKLSAgICAgICBnZW5lcmF0ZWQgZnJvbSBzY3JhdGNoLiAgVGhleSBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkKLSAgICAgICBvciBzdHJpcCB0byB3b3JrLiAgKi8KLSAgICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcjsKLSAgICBzdHJ1Y3QgY29weXJpZ2h0X2F1eF9oZHIgKmNvcHlyaWdodF9hdXhfaGRyOwotICAgIHN0cnVjdCB1c2VyX3N0cmluZ19hdXhfaGRyICp2ZXJzaW9uX2F1eF9oZHI7Ci0gICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZHI7Ci0gICAgQ09NUFVOSVQgKmNvbXBfdW5pdDsKLQotICAgIC8qIFBvaW50ZXJzIHRvIGEgc2F2ZWQgY29weSBvZiB0aGUgc3ltYm9sIGFuZCBzdHJpbmcgdGFibGVzLiAgVGhlc2UKLSAgICAgICBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkgb3Igc3RyaXAgdG8gd29yay4gICovCi0gICAgc29tX3N5bWJvbF90eXBlICpzeW10YWI7Ci0gICAgY2hhciAqc3RyaW5ndGFiOwotICAgIGFzeW1ib2wgKipzb3J0ZWRfc3ltczsKLQotICAgIC8qIFdlIHJlbWVtYmVyIHRoZXNlIG9mZnNldHMgc28gdGhhdCBhZnRlciBjaGVja19maWxlX2Zvcm1hdCwgd2UgaGF2ZQotICAgICAgIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFydGljdWxhciBmb3JtYXQgb2YgdGhlIGV4ZWNfaGRyLgotICAgICAgIFRoZXNlIG9mZnNldHMgbmVlZCBub3QgYmUgY29waWVkIGZvciBvYmpjb3B5IG9yIHN0cmlwIHRvIHdvcmsuICAqLwotCi0gICAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0gICAgZmlsZV9wdHIgc3RyX2ZpbGVwb3M7Ci0gICAgZmlsZV9wdHIgcmVsb2NfZmlsZXBvczsKLSAgICB1bnNpZ25lZCBzdHJpbmd0YWJfc2l6ZTsKLSAgfTsKLQotc3RydWN0IHNvbV9kYXRhX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IHNvbWRhdGEgYTsKLSAgfTsKLQotLyogU3Vic3RydWN0dXJlIG9mIHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0IHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbgotICAgd2hpY2ggY2FuJ3QgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGdlbmVyaWMgQkZEIHNlY3Rpb24gc3RydWN0dXJlLAotICAgYnV0IHdoaWNoIG11c3QgYmUgY29waWVkIGR1cmluZyBvYmpjb3B5IG9yIHN0cmlwLiAgKi8KLXN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdAotICB7Ci0gICAgLyogVmFyaW91cyBmaWVsZHMgaW4gc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMgdGhhdCB3ZSBuZWVkCi0gICAgICAgdG8gcGFzcyBhcm91bmQuICAqLwotICAgIHVuc2lnbmVkIGludCBzb3J0X2tleSA6IDg7Ci0gICAgdW5zaWduZWQgaW50IGFjY2Vzc19jb250cm9sX2JpdHMgOiA3OwotICAgIHVuc2lnbmVkIGludCBpc19kZWZpbmVkIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgaXNfcHJpdmF0ZSA6IDE7Ci0gICAgdW5zaWduZWQgaW50IHF1YWRyYW50IDogMjsKLQotICAgIC8qIEZvciBzdWJzcGFjZXMsIHRoaXMgcG9pbnRzIHRvIHRoZSBzZWN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlCi0gICAgICAgc3BhY2UgaW4gd2hpY2ggdGhlIHN1YnNwYWNlIGlzIGNvbnRhaW5lZC4gIEZvciBzcGFjZXMgaXQgcG9pbnRzCi0gICAgICAgYmFjayB0byB0aGUgc2VjdGlvbiBmb3IgdGhpcyBzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKmNvbnRhaW5lcjsKLQotICAgIC8qIFRoZSB1c2VyLXNwZWNpZmllZCBzcGFjZSBudW1iZXIuICBJdCBpcyB3cm9uZyB0byB1c2UgdGhpcyBhcwotICAgICAgIGFuIGluZGV4IHNpbmNlIGR1cGxpY2F0ZXMgYW5kIGhvbGVzIGFyZSBhbGxvd2VkLiAgKi8KLSAgICBpbnQgc3BhY2VfbnVtYmVyOwotCi0gICAgLyogQWRkIG1vcmUgc3R1ZmYgaGVyZSBhcyBuZWVkZWQuICBHb29kIGV4YW1wbGVzIG9mIGluZm9ybWF0aW9uCi0gICAgICAgd2UgbWlnaHQgd2FudCB0byBwYXNzIHdvdWxkIGJlIGluaXRpYWxpemF0aW9uIHBvaW50ZXJzLCAKLSAgICAgICBhbmQgdGhlIG1hbnkgc3Vic3BhY2UgZmxhZ3Mgd2UgZG8gbm90IHJlcHJlc2VudCB5ZXQuICAqLwotICB9OwotCi0vKiBVc2VkIHRvIGtlZXAgZXh0cmEgU09NIHNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIHNlY3Rpb24uCi0KLSAgIHJlbG9jX3NpemUgaG9sZHMgdGhlIHNpemUgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtLCBub3RlIHRoaXMKLSAgIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyBhcyBTT00gcmVsb2NhdGlvbnMKLSAgIGFyZSB2YXJpYWJsZSBsZW5ndGguIAotCi0gICByZWxvY19zdHJlYW0gaXMgdGhlIGFjdHVhbCBzdHJlYW0gb2YgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLQotc3RydWN0IHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKmNvcHlfZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQgcmVsb2Nfc2l6ZTsKLSAgICBjaGFyICpyZWxvY19zdHJlYW07Ci0gICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICpzcGFjZV9kaWN0OwotICAgIHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqc3Vic3BhY2VfZGljdDsKLSAgfTsKLQotI2RlZmluZSBzb21kYXRhKGJmZCkJCQkoKGJmZCktPnRkYXRhLnNvbV9kYXRhLT5hKQotI2RlZmluZSBvYmpfc29tX2V4ZWNfZGF0YShiZmQpCQkoc29tZGF0YShiZmQpLmV4ZWNfZGF0YSkKLSNkZWZpbmUgb2JqX3NvbV9maWxlX2hkcihiZmQpCQkoc29tZGF0YShiZmQpLmZpbGVfaGRyKQotI2RlZmluZSBvYmpfc29tX2V4ZWNfaGRyKGJmZCkJCShzb21kYXRhKGJmZCkuZXhlY19oZHIpCi0jZGVmaW5lIG9ial9zb21fY29weXJpZ2h0X2hkcihiZmQpCShzb21kYXRhKGJmZCkuY29weXJpZ2h0X2F1eF9oZHIpCi0jZGVmaW5lIG9ial9zb21fdmVyc2lvbl9oZHIoYmZkKQkoc29tZGF0YShiZmQpLnZlcnNpb25fYXV4X2hkcikKLSNkZWZpbmUgb2JqX3NvbV9jb21waWxhdGlvbl91bml0KGJmZCkJKHNvbWRhdGEoYmZkKS5jb21wX3VuaXQpCi0jZGVmaW5lIG9ial9zb21fc3ltdGFiKGJmZCkJCShzb21kYXRhKGJmZCkuc3ltdGFiKQotI2RlZmluZSBvYmpfc29tX3N0cmluZ3RhYihiZmQpCQkoc29tZGF0YShiZmQpLnN0cmluZ3RhYikKLSNkZWZpbmUgb2JqX3NvbV9zeW1fZmlsZXBvcyhiZmQpCShzb21kYXRhKGJmZCkuc3ltX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc3RyX2ZpbGVwb3MoYmZkKQkoc29tZGF0YShiZmQpLnN0cl9maWxlcG9zKQotI2RlZmluZSBvYmpfc29tX3N0cmluZ3RhYl9zaXplKGJmZCkJKHNvbWRhdGEoYmZkKS5zdHJpbmd0YWJfc2l6ZSkKLSNkZWZpbmUgb2JqX3NvbV9yZWxvY19maWxlcG9zKGJmZCkJKHNvbWRhdGEoYmZkKS5yZWxvY19maWxlcG9zKQotI2RlZmluZSBvYmpfc29tX3NvcnRlZF9zeW1zKGJmZCkJKHNvbWRhdGEoYmZkKS5zb3J0ZWRfc3ltcykKLSNkZWZpbmUgc29tX3NlY3Rpb25fZGF0YShzZWMpIFwKLSAgKChzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKilzZWMtPnVzZWRfYnlfYmZkKQotI2RlZmluZSBzb21fc3ltYm9sX2RhdGEoc3ltYm9sKQkJKChzb21fc3ltYm9sX3R5cGUgKikgc3ltYm9sKQotCi0KLS8qIERlZmluZXMgZ3JvdXBzIG9mIGJhc2ljIHJlbG9jYXRpb25zLiAgRklYTUU6ICBUaGVzZSBzaG91bGQKLSAgIGJlIHRoZSBvbmx5IGJhc2ljIHJlbG9jYXRpb25zIGNyZWF0ZWQgYnkgR0FTLiAgVGhlIHJlc3QKLSAgIHNob3VsZCBiZSBpbnRlcm5hbCB0byB0aGUgQkZEIGJhY2tlbmQuCi0KLSAgIFRoZSBpZGVhIGlzIGJvdGggU09NIGFuZCBFTEYgZGVmaW5lIHRoZXNlIGJhc2ljIHJlbG9jYXRpb24KLSAgIHR5cGVzIHNvIHRoZXkgbWFwIGludG8gYSBTT00gb3IgRUxGIHNwZWNpZmljIHJlbG9hdGlvbiBhcwotICAgYXBwcm9wcmlhdGUuICBUaGlzIGFsbG93cyBHQVMgdG8gc2hhcmUgbXVjaCBtb3JlIGNvZGUgCi0gICBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0IGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIFJfSFBQQV9OT05FCQkJUl9OT19SRUxPQ0FUSU9OCi0jZGVmaW5lCVJfSFBQQQkJCQlSX0NPREVfT05FX1NZTUJPTAotI2RlZmluZQlSX0hQUEFfUENSRUxfQ0FMTAkJUl9QQ1JFTF9DQUxMCi0jZGVmaW5lIFJfSFBQQV9BQlNfQ0FMTAkJCVJfQUJTX0NBTEwKLSNkZWZpbmUJUl9IUFBBX0dPVE9GRgkJCVJfRFBfUkVMQVRJVkUKLSNkZWZpbmUgUl9IUFBBX0VOVFJZCQkJUl9FTlRSWQotI2RlZmluZSBSX0hQUEFfRVhJVAkJCVJfRVhJVAotI2RlZmluZSBSX0hQUEFfQ09NUExFWAkJCVJfQ09NUDEKLSNkZWZpbmUgUl9IUFBBX0JFR0lOX0JSVEFCCQlSX0JFR0lOX0JSVEFCCi0jZGVmaW5lIFJfSFBQQV9FTkRfQlJUQUIJCVJfRU5EX0JSVEFCCi0jZGVmaW5lIFJfSFBQQV9CRUdJTl9UUlkJCVJfQkVHSU5fVFJZCi0jZGVmaW5lIFJfSFBQQV9FTkRfVFJZCQkJUl9FTkRfVFJZCi0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucywgbW9zdGx5IGZvciB1c2UgYnkgR0FTLiAgKi8KLWJvb2xlYW4gYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIFBBUkFNUyAoKGFzZWN0aW9uICosIGludCwgaW50LAotCQkJCQkJdW5zaWduZWQgaW50LCBpbnQpKTsKLWJvb2xlYW4gYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIFBBUkFNUyAoKGFzZWN0aW9uICosIGFzZWN0aW9uICosCi0JCQkJCQkgICBpbnQsIHVuc2lnbmVkIGludCwgaW50KSk7Ci12b2lkIGJmZF9zb21fc2V0X3N5bWJvbF90eXBlIFBBUkFNUyAoKGFzeW1ib2wgKiwgdW5zaWduZWQgaW50KSk7Ci1ib29sZWFuIGJmZF9zb21fYXR0YWNoX2F1eF9oZHIgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqKSk7Ci1pbnQgKiogaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIGludCwgaW50LCBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQsCi0JICAgaW50LCBhc3ltYm9sICopKTsKLWJvb2xlYW4gYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0KLSNlbmRpZiAvKiBfU09NX0ggKi8KZGlmZiAtLWdpdCBhL2JmZC9zcGFyY2xpbnV4LmMgYi9iZmQvc3BhcmNsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2EyOWIzLi4wMDAwMDAwCi0tLSBhL2JmZC9zcGFyY2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBsaW51eCBmbGF2b3JlZCBzcGFyYyBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLVVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAgICAgICAgNDA5NgotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIDEwMjQKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSICAgICAgICAweDAKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fU1BBUkMgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9zcGFyYwotI2RlZmluZSBNWShPUCkgQ0FUKHNwYXJjbGludXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1saW51eCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgTVkodmVjKTsKLQotLyogV2UgYWx3YXlzIGdlbmVyYXRlIFFNQUdJQyBmaWxlcyBpbiBwcmVmZXJlbmNlIHRvIFpNQUdJQyBmaWxlcy4gIEl0Ci0gICB3b3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoaXMgYSBsaW5rZXIgb3B0aW9uLCBpZiB0aGF0IGV2ZXIKLSAgIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyY2xpbnV4X2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjbGludXhfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgc3BhcmNsaW51eF9iZmRfZmluYWxfbGluawotCi0vKiBTZXQgdGhlIG1hY2hpbmUgdHlwZSBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyY2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgc3BhcmNsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMKLS8qIENvZGUgdG8gbGluayBhZ2FpbnN0IExpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLSNpZm5kZWYgR09UX1JFRl9QUkVGSVgKLSNkZWZpbmUgICAgICAgIEdPVF9SRUZfUFJFRklYICAiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAqLwotCi0jaWZuZGVmIFBMVF9SRUZfUFJFRklYCi0jZGVmaW5lICAgICAgICBQTFRfUkVGX1BSRUZJWCAgIl9fUExUXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX1BMVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgUExUX1JFRl9QUkVGSVgsIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFRoaXMgc3RyaW5nIGlzIHVzZWQgdG8gZ2VuZXJhdGUgc3BlY2lhbGl6ZWQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZuZGVmIE5FRURTX1NIUkxJQgotI2RlZmluZSBORUVEU19TSFJMSUIgIl9fTkVFRFNfU0hSTElCXyIKLSNlbmRpZgotCi0vKiBUaGlzIHNwZWNpYWwgc3ltYm9sIGlzIGEgc2V0IHZlY3RvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZgotICAgcG9pbnRlcnMgdG8gZml4dXAgdGFibGVzLiAgSXQgd2lsbCBiZSBwcmVzZW50IGluIGFueSBkeW5hbWljbHkKLSAgIGxpbmtlZCBmaWxlLiAgVGhlIGxpbmtlciBnZW5lcmF0ZWQgZml4dXAgdGFibGUgc2hvdWxkIGFsc28gYmUgYWRkZWQKLSAgIHRvIHRoZSBsaXN0LCBhbmQgaXQgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNlY29uZCBzbG90ICh0aGUKLSAgIGZpcnN0IG9uZSBpcyBhIGR1bW15IHdpdGggYSBtYWdpYyBudW1iZXIgdGhhdCBpcyBkZWZpbmVkIGluCi0gICBjcnQwLm8pLiAgKi8KLQotI2lmbmRlZiBTSEFSQUJMRV9DT05GTElDVFMKLSNkZWZpbmUgU0hBUkFCTEVfQ09ORkxJQ1RTICJfX1NIQVJBQkxFX0NPTkZMSUNUU19fIgotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFRoZSB0ZXJtaW5vbG9neSBpcyBhIGJpdCBzdHJhbmdlLCBidXQKLSAgIGVhY2ggZml4dXAgY29udGFpbnMgdHdvIDMyIGJpdCBudW1iZXJzLiAgQSByZWd1bGFyIGZpeHVwIGNvbnRhaW5zCi0gICBhbiBhZGRyZXNzIGFuZCBhIHBvaW50ZXIsIGFuZCBhdCBydW50aW1lIHdlIHNob3VsZCBzdG9yZSB0aGUKLSAgIGFkZHJlc3MgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXIuICBBIGJ1aWx0aW4gZml4dXAKLSAgIGNvbnRhaW5zIHR3byBwb2ludGVycywgYW5kIHdlIHNob3VsZCByZWFkIHRoZSBhZGRyZXNzIHVzaW5nIG9uZQotICAgcG9pbnRlciBhbmQgc3RvcmUgaXQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIG90aGVyCi0gICBwb2ludGVyLiAgQnVpbHRpbiBmaXh1cHMgY29tZSBpbnRvIHBsYXkgd2hlbiB3ZSBoYXZlIGR1cGxpY2F0ZQotICAgX19HT1RfXyBzeW1ib2xzIGZvciB0aGUgc2FtZSB2YXJpYWJsZS4gIFRoZSBidWlsdGluIGZpeHVwIHdpbGwgY29weQotICAgdGhlIEdPVCBwb2ludGVyIGZyb20gb25lIG92ZXIgaW50byB0aGUgb3RoZXIuICAqLwotCi1zdHJ1Y3QgZml4dXAKLXsKLSAgc3RydWN0IGZpeHVwICpuZXh0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSBmaXhlZCwKLSAgICAgemVybyBpZiB0aGlzIGlzIGp1c3QgYSBwb2ludGVyICovCi0gIGNoYXIganVtcDsKLQotICBjaGFyIGJ1aWx0aW47Ci19OwotCi0vKiBXZSBkb24ndCBuZWVkIGEgc3BlY2lhbCBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgYnV0IHdlIGRvIG5lZWQKLSAgIHRvIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIGxpbmtlciBwYXNzZXMsIHNvIHdlIHVzZSBhIHNwZWNpYWwKLSAgIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OwotfTsKLQotc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBGaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiBsaW5rLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0KLSAgLyogTnVtYmVyIG9mIGZpeHVwcy4gICovCi0gIHNpemVfdCBmaXh1cF9jb3VudDsKLQotICAvKiBOdW1iZXIgb2YgYnVpbHRpbiBmaXh1cHMuICAqLwotICBzaXplX3QgbG9jYWxfYnVpbHRpbnM7Ci0KLSAgLyogTGlzdCBvZiBmaXh1cHMuICAqLwotICBzdHJ1Y3QgZml4dXAgKmZpeHVwX2xpc3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpsaW51eF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGZpeHVwICpuZXdfZml4dXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLAotICAgICAgICAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0gICAgICAgICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF90YWxseV9zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbGludXhfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCi0gICAgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICAgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHM7IHRoZXJlIGFyZW4ndCBhbnkuICAqLwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1saW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikKLSAgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXhfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+ZHlub2JqID0gTlVMTDsKLSAgcmV0LT5maXh1cF9jb3VudCA9IDA7Ci0gIHJldC0+bG9jYWxfYnVpbHRpbnMgPSAwOwotICByZXQtPmZpeHVwX2xpc3QgPSBOVUxMOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGFvdXRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pICAgICAgICAgICAgICAgICAgICBcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICgmKHRhYmxlKS0+cm9vdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwgXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBmaXh1cCkpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHJldHVybiBmOwotICBmLT5uZXh0ID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0gIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0ID0gZjsKLSAgZi0+aCA9IGg7Ci0gIGYtPnZhbHVlID0gdmFsdWU7Ci0gIGYtPmJ1aWx0aW4gPSBidWlsdGluOwotICBmLT5qdW1wID0gMDsKLSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0gIHJldHVybiBmOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSByZWFsaXplIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGxpbmsgdG8gYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBXZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotICAgZml4dXAgdGFibGUsIGFuZCB3ZSB1bHRpbWF0ZWx5IG5lZWQgdG8gYWRkIGEgcG9pbnRlciB0byB0aGlzIGludG8KLSAgIHRoZSBzZXQgdmVjdG9yIGZvciBTSEFSQUJMRV9DT05GTElDVFMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdAotICAga25vdyB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgYnV0IHRoYXQncyBPSyAtIHdlIGp1c3QgbmVlZCB0bwotICAgY3JlYXRlIGl0IGZvciBub3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGluc2VydDsKLQotICAvKiBMb29rIHVwIGFuZCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLgotICAgICBJZiB3ZSBkbywgYW5kIHRoZSBkZWZpbmluZyBlbnRyeSBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHdlCi0gICAgIG5lZWQgdG8gY3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zLgotCi0gICAgIEZJWE1FOiBXaGF0IGlmIGFiZmQtPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcj8gIFdlIG1heSB3YW50IHRvCi0gICAgIGJlIGFibGUgdG8gbGluayBMaW51eCBhLm91dCBhbmQgRUxGIG9iamVjdHMgdG9nZXRoZXIsIGJ1dCBzZXJpb3VzCi0gICAgIGNvbmZ1c2lvbiBpcyBwb3NzaWJsZS4gICovCi0KLSAgaW5zZXJ0ID0gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgU0hBUkFCTEVfQ09ORkxJQ1RTKSA9PSAwCi0gICAgICAmJiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBpZiAoISBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgICAgIGluc2VydCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0gICAgICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICAgICB7Ci0gICAgICAgICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLSAgICAgICAgIGlmIChoYXNocCAhPSBOVUxMKQotICAgICAgICAgICAqaGFzaHAgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotICAgICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsICEgSVNfUExUX1NZTSAobmFtZSkpOwotICAgICAgICAgaWYgKGYgPT0gTlVMTCkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgZi0+anVtcCA9IElTX1BMVF9TWU0gKG5hbWUpOwotCi0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICB9Ci0gICAgfQotCi0gIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCi0gIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotICAgICAgICBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICAgICAgICAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLSAgICAgICAgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotICAgICAgICAgICAgICAgICBzaXplb2YgTkVFRFNfU0hSTElCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciAqcDsKLSAgICAgIGNoYXIgKmFsbG9jID0gTlVMTDsKLQotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyArIHNpemVvZiBORUVEU19TSFJMSUIgLSAxOwotICAgICAgcCA9IHN0cnJjaHIgKG5hbWUsICdfJyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotICAgICAgIGFsbG9jID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotCi0gICAgICBpZiAocCA9PSBOVUxMIHx8IGFsbG9jID09IE5VTEwpCi0gICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotICAgICAgICAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotICAgICAgICAgKnArKyA9ICdcMCc7Ci0gICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotICAgICAgICAgICAgYWxsb2MsIHApOwotICAgICAgICAgZnJlZSAoYWxsb2MpOwotICAgICAgIH0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdAotICAgICBpdC4gICovCi0gIGlzX3BsdCA9IElTX1BMVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0KLSAgaWYgKGlzX3BsdCB8fCBJU19HT1RfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpKQotICAgIHsKLSAgICAgIC8qIExvb2sgdXAgdGhpcyBzeW1ib2wgdHdpY2UuICBPbmNlIGp1c3QgYXMgYSByZWd1bGFyIGxvb2t1cCwKLSAgICAgICAgYW5kIHRoZW4gYWdhaW4gZm9sbG93aW5nIGFsbCBvZiB0aGUgaW5kaXJlY3QgbGlua3MgdW50aWwgd2UKLSAgICAgICAgcmVhY2ggYSByZWFsIHN5bWJvbC4gICovCi0gICAgICBoMSA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgLyogaDIgZG9lcyBub3QgZm9sbG93IGluZGlyZWN0IHN5bWJvbHMuICovCi0gICAgICBoMiA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogVGhlIHJlYWwgc3ltYm9sIG11c3QgZXhpc3QgYnV0IGlmIGl0IGlzIGFsc28gYW4gQUJTIHN5bWJvbCwKLSAgICAgICAgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgZml4dXAuICBUaGlzIGlzIGJlY2F1c2UgdGhleSBib3RoCi0gICAgICAgIGNhbWUgZnJvbSB0aGUgc2FtZSBsaWJyYXJ5LiAgSWYgb24gdGhlIG90aGVyIGhhbmQsIHdlIGhhZCB0bwotICAgICAgICB1c2UgYW4gaW5kaXJlY3Qgc3ltYm9sIHRvIGdldCB0byB0aGUgcmVhbCBzeW1ib2wsIHdlIGFkZCB0aGUKLSAgICAgICAgZml4dXAgYW55d2F5LCBzaW5jZSB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlc2Ugc3ltYm9scyBjb21lCi0gICAgICAgIGZyb20gZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJpZXMgKi8KLSAgICAgIGlmIChoMSAhPSBOVUxMCi0gICAgICAgICAmJiAoKChoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgICB8fCBoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgICAgICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaDEtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLSAgICAgICAgICAgICB8fCBoMi0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkpCi0gICAgICAgewotICAgICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGEgImJ1aWx0aW4iIGZpeHVwIGFscmVhZHkgcHJlc2VudAotICAgICAgICAgICAgaW52b2x2aW5nIHRoaXMgc3ltYm9sLiAgSWYgc28sIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyCi0gICAgICAgICAgICBmaXh1cC4gIEluIHRoZSBlbmQsIHRoaXMgcmVsYXhlcyBzb21lIG9mIHRoZSByZXF1aXJlbWVudHMKLSAgICAgICAgICAgIGFib3V0IHRoZSBvcmRlciBvZiBwZXJmb3JtaW5nIGZpeHVwcy4gICovCi0gICAgICAgICBleGlzdHMgPSBmYWxzZTsKLSAgICAgICAgIGZvciAoZjEgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgICAgICAgICAgICAgZjEgIT0gTlVMTDsKLSAgICAgICAgICAgICAgZjEgPSBmMS0+bmV4dCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGlmICgoZjEtPmggIT0gaCAmJiBmMS0+aCAhPSBoMSkKLSAgICAgICAgICAgICAgICAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0gICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICBpZiAoZjEtPmggPT0gaDEpCi0gICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgaWYgKCEgZXhpc3RzCi0gICAgICAgICAgICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgZjEtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0gICAgICAgICAgICAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZjEtPmggPSBoMTsKLSAgICAgICAgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLSAgICAgICAgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0gICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgfQotICAgICAgICAgaWYgKCEgZXhpc3RzCi0gICAgICAgICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLSAgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCi0gICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgIC8qIFF1aWNrIGFuZCBkaXJ0eSB3YXkgb2Ygc3RyaXBwaW5nIHRoZXNlIHN5bWJvbHMgZnJvbSB0aGUKLSAgICAgICAgc3ltdGFiLiAqLwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgIGgtPnJvb3Qud3JpdHRlbiA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIC5saW51eC1keW5hbWljIHNlY3Rpb24gaXMuCi0gICBJdCBpcyBjYWxsZWQgYnkgdGhlIExpbnV4IGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24KLSAgIHJvdXRpbmUuICBXZSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgYW5kIG5vdwotICAgd2UganVzdCBzY2FuIHRoZSBoYXNoIHRhYmxlcyB0byBmaW5kIG91dCBob3cgbWFueSBhZGRpdGlvbmFsIGZpeHVwcwotICAgYXJlIHJlcXVpcmVkLiAgKi8KLQotYm9vbGVhbgotYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0IGZpbmQgdGhlIGZpeHVwcy4uLiAqLwotICBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXhfdGFsbHlfc3ltYm9scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLSAgICAgICB7Ci0gICAgICAgICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgICAgICAgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZml4dXAgdGFibGUuICBXZSB3aWxsIGZpbGwgaXQgaW4gbGF0ZXIuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzLT5fcmF3X3NpemUgPSA4ICsgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICogODsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSBhcmUgcmVhZHkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGZpeHVwIHRhYmxlIHRvCi0gICB0aGUgb3V0cHV0IGZpbGUuICBTY2FuIHRoZSBmaXh1cCB0YWJsZXMgYW5kIHNvIGZvcnRoIGFuZCBnZW5lcmF0ZQotICAgdGhlIHN0dWZmIHdlIG5lZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfZmluaXNoX2R5bmFtaWNfbGluayAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnMsICpvcywgKmlzOwotICBiZmRfYnl0ZSAqZml4dXBfdGFibGU7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgdW5zaWduZWQgaW50IG5ld19hZGRyOwotICBpbnQgc2VjdGlvbl9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBmaXh1cHNfd3JpdHRlbjsKLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwKLSAgICAgICAgIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLSAgICAgICAgIG9zLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCi0gIGZpeHVwX3RhYmxlID0gcy0+Y29udGVudHM7Ci0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCwgZml4dXBfdGFibGUpOwotICBmaXh1cF90YWJsZSArPSA0OwotCi0gIC8qIEZpbGwgaW4gZml4dXAgdGFibGUuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLSAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgIHsKLSAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotICAgICAgICAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgIH0KLQotICAgICAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJGaXh1cCglZCkgJXM6ICV4ICV4XG4iLGYtPmp1bXAsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICBpZiAoZi0+anVtcCkKLSAgICAgICB7Ci0gICAgICAgICAvKiBSZWxhdGl2ZSBhZGRyZXNzICovCi0gICAgICAgICBuZXdfYWRkciA9IG5ld19hZGRyIC0gKGYtPnZhbHVlICsgNSk7Ci0JIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUgKyAxLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgIH0KLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTcGVjaWFsIG1hcmtlciBzbyB3ZSBrbm93IHRvIHN3aXRjaCB0byB0aGUgb3RoZXIgdHlwZSBvZiBmaXh1cCAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgICAgewotICAgICAgICAgaWYgKCEgZi0+YnVpbHRpbikKLSAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0gICAgICAgICAgICAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgICAgIHByaW50ZiAoIkZpeHVwKEIpICVzOiAleCAleFxuIiwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLSAgICAgICAgICAgICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgICB9Ci0gIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICE9IGZpeHVwc193cml0dGVuKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIpKTsKLSAgICAgIHdoaWxlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiBmaXh1cHNfd3JpdHRlbikKLSAgICAgICB7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICAgfQotICAgIH0KLQotICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICBpZiAoaCAhPSBOVUxMCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGlzID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiQnVpbHRpbiBmaXh1cCB0YWJsZSBhdCAleFxuIiwgbmV3X2FkZHIpOwotI2VuZGlmCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgb3V0cHV0X2JmZCkKLSAgICAgICE9IHMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBsaW51eF9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLQotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbHlueC5jIGIvYmZkL3NwYXJjbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZjYWU1Li4wMDAwMDAwCi0tLSBhL2JmZC9zcGFyY2x5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgU3BhcmMgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0KLSNlbmRpZgotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1seW54IgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJhb3V0L3N1bjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLS8qIFRoaXMgaXMgbmVlZGVkIHRvIHJlamVjdCBhIE5ld3NPUyBmaWxlLCBlLmcuIGluCi0gICBnZGIvdGVzdHN1aXRlL2dkYi50MTAvY3Jvc3Nsb2FkLmV4cC4gPGtpbmdkb25AY3lnbnVzLmNvbT4KLSAgIEkgbmVlZGVkIHRvIGFkZCBNX1VOS05PV04gdG8gcmVjb2duaXplIGEgNjgwMDAgb2JqZWN0LCBzbyB0aGlzIHdpbGwKLSAgIHByb2JhYmx5IG5vIGxvbmdlciByZWplY3QgYSBOZXdzT1Mgb2JqZWN0LiAgPGlhbkBjeWdudXMuY29tPi4gKi8KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fVU5LTk9XTiBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNXzY4MDEwIFwKLQkJCSAgICB8fCAobXR5cGUpID09IE1fNjgwMjAgXAotCQkJICAgIHx8IChtdHlwZSkgPT0gTV9TUEFSQykKLQotLyoKLVRoZSBmaWxlIEBjb2Rle2FvdXRmMS5ofSBjb250YWlucyB0aGUgY29kZSBmb3IgQkZEJ3MKLWEub3V0IGJhY2sgZW5kLiBDb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBiYWNrIGVuZCBpcyBnaXZlbiBieSB0aGVzZQotdHdvIHByZXByb2Nlc3NvciBuYW1lczoKLUB0YWJsZSBAY29kZQotQGl0ZW0gQVJDSF9TSVpFCi1UaGlzIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgMzIgb3IgNjQsIGRlcGVuZGluZyB1cG9uIHRoZSBzaXplIG9mIGFuCi1pbnQgaW4gdGhlIHRhcmdldCBmb3JtYXQuIEl0IGNoYW5nZXMgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3RzIHdoaWNoCi1wZXJmb3JtIHRoZSBtZW1vcnkvZGlzayBtYXBwaW5nIG9mIHN0cnVjdHVyZXMuCi0KLVRoZSA2NCBiaXQgYmFja2VuZCBtYXkgb25seSBiZSB1c2VkIGlmIHRoZSBob3N0IGNvbXBpbGVyIHN1cHBvcnRzIDY0Ci1pbnRzIChlZyBsb25nIGxvbmcgd2l0aCBnY2MpLCBieSBkZWZpbmluZyB0aGUgbmFtZSBAY29kZXtCRkRfSE9TVF82NF9CSVR9IGluIEBjb2Rle2JmZC5ofS4KLVdpdGggdGhpcyBuYW1lIGRlZmluZWQsIEBlbXBoe2FsbH0gYmZkIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoIDY0Yml0Ci1hcml0aG1ldGljLCBub3QganVzdCB0aG9zZSB0byBhIDY0Yml0IHRhcmdldC4KLQotQGl0ZW0gVEFSR0VUTkFNRQotVGhlIG5hbWUgcHV0IGludG8gdGhlIHRhcmdldCB2ZWN0b3IuCi1AaXRlbQotQGVuZCB0YWJsZQotCi0qLwotCi0vKlNVUFBSRVNTNTU4Ki8KLS8qU1VQUFJFU1M1MjkqLwotCi12b2lkCi1OQU1FKGx5bngsc2V0X2FyY2hfbWFjaCkgKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgbG9uZyBtYWNoaW5lOwotICBzd2l0Y2ggKG1hY2h0eXBlKQotICAgIHsKLQotICAgIGNhc2UgTV9VTktOT1dOOgotICAgICAgLyogU29tZSBTdW4zcyBtYWtlIG1hZ2ljIG51bWJlcnMgd2l0aG91dCBjcHUgdHlwZXMgaW4gdGhlbSwgc28KLQkgd2UnbGwgZGVmYXVsdCB0byB0aGUgNjgwMDAuICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAxMDoKLSAgICBjYXNlIE1fSFAyMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAyMDoKLSAgICBjYXNlIE1fSFAzMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMzg2OgotICAgIGNhc2UgTV8zODZfRFlOSVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMjlLOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2EyOWs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0hQVVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goQUJGRCwgRVhFQykgXAotICBOQU1FKGx5bngsc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIGNob29zZV9yZWxvY19zaXplKEFCRkQpOwotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZSBpbiBMeW54T1MgZm9ybWF0LgotICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMTA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDEwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMjlLKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIH0KLQotICBjaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCk7Ci0KLSAgTl9TRVRfRkxBR1MgKCpleGVjcCwgYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5leGVjX2hkcl9mbGFncyk7Ci0KLSAgV1JJVEVfSEVBREVSUyAoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3NldF9zaXplcyBzcGFyY2x5bnhfc2V0X3NpemVzCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNseW54X3NldF9zaXplcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgc3BhcmNseW54X2FvdXRfYmFja2VuZCA9Ci17Ci0gIDAsIDEsIDAsIDEsIDAsIHNwYXJjbHlueF9zZXRfc2l6ZXMsIDAsCi0gIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KLSAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KLSAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLwotICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLwotICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCi0gIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLwotfTsKLQwKLQotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKLQkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCU5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEJCQkmc3BhcmNseW54X2FvdXRfYmFja2VuZAotCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2lmZGVmIExZTlhfQ09SRQotCi1jaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCAoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcGFyY25ldGJzZC5jIGIvYmZkL3NwYXJjbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzdiYjguLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9zcGFyYyBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLS8qIFNQQVJDIGNoaXBzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCi0gICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gZWl0aGVyIG9uZS4gKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDIwMDAKLQotI2RlZmluZSBERUZBVUxUX0FSQ0gJYmZkX2FyY2hfc3BhcmMKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fU1BBUkNfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChzcGFyY25ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcmVjLmMgYi9iZmQvc3JlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWY2OWIwLi4wMDAwMDAwCi0tLSBhL2JmZC9zcmVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzc4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igcy1yZWNvcmQgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TVUJTRUNUSU9OCi0JUy1SZWNvcmQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQkKLQlPcmRpbmFyeSBTLVJlY29yZHMgY2Fubm90IGhvbGQgYW55dGhpbmcgYnV0IGFkZHJlc3NlcyBhbmQKLQlkYXRhLCBzbyB0aGF0J3MgYWxsIHRoYXQgd2UgaW1wbGVtZW50LgotCi0JVGhlIG9ubHkgaW50ZXJlc3RpbmcgdGhpbmcgaXMgdGhhdCBTLVJlY29yZHMgbWF5IGNvbWUgb3V0IG9mCi0Jb3JkZXIgYW5kIHRoZXJlIGlzIG5vIGhlYWRlciwgc28gYW4gaW5pdGlhbCBzY2FuIGlzIHJlcXVpcmVkCi0JdG8gZGlzY292ZXIgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYWRkcmVzc2VzIHVzZWQgdG8gY3JlYXRlCi0JdGhlIHZtYSBhbmQgc2l6ZSBvZiB0aGUgb25seSBzZWN0aW9uIHdlIGNyZWF0ZS4gIFdlCi0JYXJiaXRyYXJpbHkgY2FsbCB0aGlzIHNlY3Rpb24gIi50ZXh0Ii4KLQotCVdoZW4gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIGlzIGNhbGxlZCB0aGUgZmlsZSBpcyByZWFkCi0JYWdhaW4sIGFuZCB0aGlzIHRpbWUgdGhlIGRhdGEgaXMgcGxhY2VkIGludG8gYSBiZmRfYWxsb2MnZAotCWFyZWEuCi0KLQlBbnkgbnVtYmVyIG9mIHNlY3Rpb25zIG1heSBiZSBjcmVhdGVkIGZvciBvdXRwdXQsIHdlIHNhdmUgdGhlbQotCXVwIGFuZCBvdXRwdXQgdGhlbSB3aGVuIGl0J3MgdGltZSB0byBjbG9zZSB0aGUgYmZkLgotCi0JQW4gcyByZWNvcmQgbG9va3MgbGlrZToKLQkKLUVYQU1QTEUKLQlTPHR5cGU+PGxlbmd0aD48YWRkcmVzcz48ZGF0YT48Y2hlY2tzdW0+Ci0JCi1ERVNDUklQVElPTgotCVdoZXJlCi0JbyBsZW5ndGgKLQlpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvbGxvd2luZyB1cHRvIHRoZSBjaGVja3N1bS4gTm90ZSB0aGF0Ci0JdGhpcyBpcyBub3QgdGhlIG51bWJlciBvZiBjaGFycyBmb2xsb3dpbmcsIHNpbmNlIGl0IHRha2VzIHR3bwotCWNoYXJzIHRvIHJlcHJlc2VudCBhIGJ5dGUuCi0JbyB0eXBlCi0JaXMgb25lIG9mOgotCTApIGhlYWRlciByZWNvcmQKLQkxKSB0d28gYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCi0JMikgdGhyZWUgYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCi0JMykgZm91ciBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKLQk3KSBmb3VyIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQk4KSB0aHJlZSBieXRlIGFkZHJlc3MgdGVybWluYXRpb24gcmVjb3JkCi0JOSkgdHdvIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQkKLQlvIGFkZHJlc3MKLQlpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSBmb2xsb3dpbmcsIG9yIGluIHRoZSBjYXNlIG9mCi0JYSB0ZXJtaW5hdGlvbiByZWNvcmQsIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBpbWFnZQotCW8gZGF0YQotCWlzIHRoZSBkYXRhLgotCW8gY2hlY2tzdW0KLQlpcyB0aGUgc3VtIG9mIGFsbCB0aGUgcmF3IGJ5dGUgZGF0YSBpbiB0aGUgcmVjb3JkLCBmcm9tIHRoZSBsZW5ndGgKLQl1cHdhcmRzLCBtb2R1bG8gMjU2IGFuZCBzdWJ0cmFjdGVkIGZyb20gMjU1LgotCi0KLVNVQlNFQ1RJT04KLQlTeW1ib2wgUy1SZWNvcmQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQlTb21lIElDRSBlcXVpcG1lbnQgdW5kZXJzdGFuZHMgYW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkCi0JUy1SZWNvcmQgZm9ybWF0OyBzeW1ib2xzIGFuZCB0aGVpciBhZGRyZXNzZXMgY2FuIGJlIHNlbnQKLQliZWZvcmUgdGhlIGRhdGEuCi0KLQlUaGUgZm9ybWF0IG9mIHRoaXMgaXM6Ci0JKCQkIDxtb2R1bGVuYW1lPgotCQkoPHNwYWNlPiA8c3ltYm9sPiA8YWRkcmVzcz4pKikKLQkkJAotCi0Jc28gYSBzaG9ydCBzeW1ib2wgdGFibGUgY291bGQgbG9vayBsaWtlOgotCi1FWEFNUExFCi0JJCQgZmxhc2gueAotCSQkIGZsYXNoLmMKLQkgIF9wb3J0NiAkMAotCSAgX2RlbGF5ICQ0Ci0JICBfc3RhcnQgJDE0Ci0JICBfZXRleHQgJDgwMzYKLQkgIF9lZGF0YSAkODAzNgotIAkgIF9lbmQgJDgwMzYKLQkkJAotCi1ERVNDUklQVElPTgotCVdlIGFsbG93IHN5bWJvbHMgdG8gYmUgYW55d2hlcmUgaW4gdGhlIGRhdGEgc3RyZWFtIC0gdGhlIG1vZHVsZSBuYW1lcwotCWFyZSBhbHdheXMgaWdub3JlZC4KLQkJCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIHZvaWQgc3JlY19nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIHZvaWQgc3JlY19wcmludF9zeW1ib2wKLSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIHZvaWQgc3JlY19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc3JlY19nZXRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBzcmVjX2JhZF9ieXRlIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zY2FuIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqc3JlY19vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnN5bWJvbHNyZWNfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfcmVhZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGJmZF92bWEsCi0JCQkJCSAgY29uc3QgYmZkX2J5dGUgKiwKLQkJCQkJICBjb25zdCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX25ld19zeW1ib2wgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzcmVjX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYXN5bWJvbCAqc3JlY19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzcmVjX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLQotLyogTWFjcm9zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gaGV4IGFuZCBiaW5hcnkuICovCi0KLXN0YXRpYyBDT05TVCBjaGFyIGRpZ3NbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLQotI2RlZmluZSBOSUJCTEUoeCkgaGV4X3ZhbHVlKHgpCi0jZGVmaW5lIEhFWChidWZmZXIpICgoTklCQkxFKChidWZmZXIpWzBdKTw8NCkgKyBOSUJCTEUoKGJ1ZmZlcilbMV0pKQotI2RlZmluZSBUT0hFWChkLCB4LCBjaCkgXAotCWRbMV0gPSBkaWdzWyh4KSAmIDB4Zl07IFwKLQlkWzBdID0gZGlnc1soKHgpPj40KSYweGZdOyBcCi0JY2ggKz0gKCh4KSAmIDB4ZmYpOwotI2RlZmluZQlJU0hFWCh4KSAgaGV4X3AoeCkKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gKi8KLQotc3RhdGljIHZvaWQKLXNyZWNfaW5pdCAoKQotewotICBzdGF0aWMgYm9vbGVhbiBpbml0ZWQgPSBmYWxzZTsKLQotICBpZiAoaW5pdGVkID09IGZhbHNlKQotICAgIHsKLSAgICAgIGluaXRlZCA9IHRydWU7Ci0gICAgICBoZXhfaW5pdCAoKTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvbiBhIGxpbmUgaXMgRkYgKi8KLSNkZWZpbmUgTUFYQ0hVTksgMHhmZgotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBmaXQgb250byBhIGxpbmUgb24gb3V0cHV0ICovCi0jZGVmaW5lIENIVU5LIDE2Ci0KLS8qIFdoZW4gd3JpdGluZyBhbiBTLXJlY29yZCBmaWxlLCB0aGUgUy1yZWNvcmRzIGNhbiBub3QgYmUgb3V0cHV0IGFzCi0gICB0aGV5IGFyZSBzZWVuLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIHRoZW0gaW4gbWVtb3J5LiAgKi8KLQotc3RydWN0IHNyZWNfZGF0YV9saXN0X3N0cnVjdAotewotICBzdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0ICpuZXh0OwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSB3aGVyZTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0IHNyZWNfZGF0YV9saXN0X3R5cGU7Ci0KLS8qIFdoZW4gc2Nhbm5pbmcgdGhlIFMtcmVjb3JkIGZpbGUsIGEgbGlua2VkIGxpc3Qgb2Ygc3JlY19zeW1ib2wKLSAgIHN0cnVjdHVyZXMgaXMgYnVpbHQgdG8gcmVwcmVzZW50IHRoZSBzeW1ib2wgdGFibGUgKGlmIHRoZXJlIGlzCi0gICBvbmUpLiAgKi8KLQotc3RydWN0IHNyZWNfc3ltYm9sCi17Ci0gIHN0cnVjdCBzcmVjX3N5bWJvbCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBUaGUgUy1yZWNvcmQgdGRhdGEgaW5mb3JtYXRpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBzcmVjX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzcmVjX2RhdGFfbGlzdF90eXBlICpoZWFkOwotICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKnRhaWw7Ci0gICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgc3RydWN0IHNyZWNfc3ltYm9sICpzeW1ib2xzOwotICAgIHN0cnVjdCBzcmVjX3N5bWJvbCAqc3ltdGFpbDsKLSAgICBhc3ltYm9sICpjc3ltYm9sczsKLSAgfQotdGRhdGFfdHlwZTsKLQotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCB0ZGF0YV90eXBlICosCi0JCQkJCSAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV90ZXJtaW5hdG9yIFBBUkFNUyAoKGJmZCAqLCB0ZGF0YV90eXBlICopKTsKLQotLyogU2V0IHVwIHRoZSBTLXJlY29yZCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYWJmZC0+dGRhdGEuc3JlY19kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgdGRhdGFfdHlwZSAqdGRhdGEgPSAodGRhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAodGRhdGFfdHlwZSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+dHlwZSA9IDE7Ci0gICAgICB0ZGF0YS0+aGVhZCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+dGFpbCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+c3ltYm9scyA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+c3ltdGFpbCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+Y3N5bWJvbHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIGJ5dGUgZnJvbSBhbiBTIHJlY29yZCBmaWxlLiAgU2V0ICpFUlJPUlBUUiBpZiBhbiBlcnJvcgotICAgb2NjdXJyZWQuICBSZXR1cm4gRU9GIG9uIGVycm9yIG9yIGVuZCBvZiBmaWxlLiAgKi8KLQotc3RhdGljIGludAotc3JlY19nZXRfYnl0ZSAoYWJmZCwgZXJyb3JwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiAqZXJyb3JwdHI7Ci17Ci0gIGJmZF9ieXRlIGM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCi0JKmVycm9ycHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotCi0gIHJldHVybiAoaW50KSAoYyAmIDB4ZmYpOwotfQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIFMgcmVjb3JkIGZpbGUuICBGSVhNRTogVGhpcyBwcm9iYWJseSBzaG91bGQKLSAgIG5vdCBjYWxsIGZwcmludGYsIGJ1dCB3ZSByZWFsbHkgZG8gbmVlZCBzb21lIG1lY2hhbmlzbSBmb3IgcHJpbnRpbmcKLSAgIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgaW50IGM7Ci0gICAgIGJvb2xlYW4gZXJyb3I7Ci17Ci0gIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBpZiAoISBlcnJvcikKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKCEgaXNwcmludCAoYykpCi0Jc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgYyk7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYzsKLQkgIGJ1ZlsxXSA9ICdcMCc7Ci0JfQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiVkOiBVbmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIFMtcmVjb3JkIGZpbGVcbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCBidWYpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgfQotfQotCi0vKiBBZGQgYSBuZXcgc3ltYm9sIGZvdW5kIGluIGFuIFMtcmVjb3JkIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19uZXdfc3ltYm9sIChhYmZkLCBuYW1lLCB2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzcmVjX3N5bWJvbCAqbjsKLQotICBuID0gKHN0cnVjdCBzcmVjX3N5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNyZWNfc3ltYm9sKSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT52YWwgPSB2YWw7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scyA9PSBOVUxMKQotICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scyA9IG47Ci0gIGVsc2UKLSAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bXRhaWwtPm5leHQgPSBuOwotICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bXRhaWwgPSBuOwotICBuLT5uZXh0ID0gTlVMTDsKLQotICArK2FiZmQtPnN5bWNvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIHRoZSBTIHJlY29yZCBmaWxlIGFuZCB0dXJuIGl0IGludG8gc2VjdGlvbnMuICBXZSBjcmVhdGUgYSBuZXcKLSAgIHNlY3Rpb24gZm9yIGVhY2ggY29udGlndW91cyBzZXQgb2YgYnl0ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19zY2FuIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjOwotICB1bnNpZ25lZCBpbnQgbGluZW5vID0gMTsKLSAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemUgPSAwOwotICBhc2VjdGlvbiAqc2VjID0gTlVMTDsKLSAgY2hhciAqc3ltYnVmID0gTlVMTDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIC8qIFdlIG9ubHkgYnVpbGQgc2VjdGlvbnMgZnJvbSBjb250aWd1b3VzIFMtcmVjb3Jkcywgc28gaWYgdGhpcwotICAgICAgICAgaXMgbm90IGFuIFMtcmVjb3JkLCB0aGVuIHN0b3AgYnVpbGRpbmcgYSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChjICE9ICdTJyAmJiBjICE9ICdccicgJiYgYyAhPSAnXG4nKQotCXNlYyA9IE5VTEw7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JZGVmYXVsdDoKLQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQljYXNlICdcbic6Ci0JICArK2xpbmVubzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXHInOgotCSAgYnJlYWs7Ci0KLQljYXNlICckJzoKLQkgIC8qIFN0YXJ0aW5nIGEgbW9kdWxlIG5hbWUsIHdoaWNoIHdlIGlnbm9yZS4gICovCi0JICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSAnXG4nCi0JCSAmJiBjICE9IEVPRikKLQkgICAgOwotCSAgaWYgKGMgPT0gRU9GKQotCSAgICB7Ci0JICAgICAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgKytsaW5lbm87Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSAnICc6Ci0JICBkbwotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFsYzsKLQkgICAgICBjaGFyICpwLCAqc3ltbmFtZTsKLQkgICAgICBiZmRfdm1hIHN5bXZhbDsKLQotCSAgICAgIC8qIFN0YXJ0aW5nIGEgc3ltYm9sIGRlZmluaXRpb24uICAqLwotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpKQotCQk7Ci0KLQkgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgYWxjID0gMTA7Ci0JICAgICAgc3ltYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoYWxjICsgMSk7Ci0JICAgICAgaWYgKHN5bWJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIHAgPSBzeW1idWY7Ci0KLQkgICAgICAqcCsrID0gYzsKLQkgICAgICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YKLQkJICAgICAmJiAhIGlzc3BhY2UgKGMpKQotCQl7Ci0JCSAgaWYgKCh1bnNpZ25lZCBpbnQpIChwIC0gc3ltYnVmKSA+PSBhbGMpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKm47Ci0KLQkJICAgICAgYWxjICo9IDI7Ci0JCSAgICAgIG4gPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAoc3ltYnVmLCBhbGMgKyAxKTsKLQkJICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBwID0gbiArIChwIC0gc3ltYnVmKTsKLQkJICAgICAgc3ltYnVmID0gbjsKLQkJICAgIH0KLQotCQkgICpwKysgPSBjOwotCQl9Ci0KLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgKnArKyA9ICdcMCc7Ci0JICAgICAgc3ltbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgcCAtIHN5bWJ1Zik7Ci0JICAgICAgaWYgKHN5bW5hbWUgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgc3RyY3B5IChzeW1uYW1lLCBzeW1idWYpOwotCSAgICAgIGZyZWUgKHN5bWJ1Zik7Ci0JICAgICAgc3ltYnVmID0gTlVMTDsKLQotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpKQotCQk7Ci0JICAgICAgaWYgKGMgPT0gRU9GKQotCQl7Ci0JCSAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIFNraXAgYSBkb2xsYXIgc2lnbiBiZWZvcmUgdGhlIGhleCB2YWx1ZS4gICovCi0JICAgICAgaWYgKGMgPT0gJyQnKQotCQl7Ci0JCSAgYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcik7Ci0JCSAgaWYgKGMgPT0gRU9GKQotCQkgICAgewotCQkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHN5bXZhbCA9IDA7Ci0JICAgICAgd2hpbGUgKElTSEVYIChjKSkKLQkJewotCQkgIHN5bXZhbCA8PD0gNDsKLQkJICBzeW12YWwgKz0gTklCQkxFIChjKTsKLQkJICBjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKTsKLQkJfQotCi0JICAgICAgaWYgKCEgc3JlY19uZXdfc3ltYm9sIChhYmZkLCBzeW1uYW1lLCBzeW12YWwpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7Ci0KLQkgIGlmIChjID09ICdcbicpCi0JICAgICsrbGluZW5vOwotCSAgZWxzZSBpZiAoYyAhPSAnXHInKQotCSAgICB7Ci0JICAgICAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0gICAgCi0JY2FzZSAnUyc6Ci0JICB7Ci0JICAgIGZpbGVfcHRyIHBvczsKLQkgICAgY2hhciBoZHJbM107Ci0JICAgIHVuc2lnbmVkIGludCBieXRlczsKLQkgICAgYmZkX3ZtYSBhZGRyZXNzOwotCSAgICBiZmRfYnl0ZSAqZGF0YTsKLQotCSAgICAvKiBTdGFydGluZyBhbiBTLXJlY29yZC4gICovCi0KLQkgICAgcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gMTsKLQotCSAgICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgMywgYWJmZCkgIT0gMykKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICBpZiAoISBJU0hFWCAoaGRyWzFdKSB8fCAhIElTSEVYIChoZHJbMl0pKQotCSAgICAgIHsKLQkJaWYgKCEgSVNIRVggKGhkclsxXSkpCi0JCSAgYyA9IGhkclsxXTsKLQkJZWxzZQotCQkgIGMgPSBoZHJbMl07Ci0JCXNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgYnl0ZXMgPSBIRVggKGhkciArIDEpOwotCSAgICBpZiAoYnl0ZXMgKiAyID4gYnVmc2l6ZSkKLQkgICAgICB7Ci0JCWlmIChidWYgIT0gTlVMTCkKLQkJICBmcmVlIChidWYpOwotCQlidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoYnl0ZXMgKiAyKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQlidWZzaXplID0gYnl0ZXMgKiAyOwotCSAgICAgIH0KLQotCSAgICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgYnl0ZXMgKiAyLCBhYmZkKSAhPSBieXRlcyAqIDIpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgLyogSWdub3JlIHRoZSBjaGVja3N1bSBieXRlLiAgKi8KLQkgICAgLS1ieXRlczsKLQotCSAgICBhZGRyZXNzID0gMDsKLQkgICAgZGF0YSA9IGJ1ZjsKLQkgICAgc3dpdGNoIChoZHJbMF0pCi0JICAgICAgewotCSAgICAgIGNhc2UgJzAnOgotCSAgICAgIGNhc2UgJzUnOgotCQkvKiBQcm9sb2d1ZS0taWdub3JlIHRoZSBmaWxlIG5hbWUsIGJ1dCBzdG9wIGJ1aWxkaW5nIGEKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGF0IHRoaXMgcG9pbnQuICAqLwotCQlzZWMgPSBOVUxMOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzMnOgotCQlhZGRyZXNzID0gSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQktLWJ5dGVzOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzInOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS0tYnl0ZXM7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnMSc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQlieXRlcyAtPSAyOwotCi0JCWlmIChzZWMgIT0gTlVMTAotCQkgICAgJiYgc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZSA9PSBhZGRyZXNzKQotCQkgIHsKLQkJICAgIC8qIFRoaXMgZGF0YSBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBidWlsZGluZy4gICovCi0JCSAgICBzZWMtPl9yYXdfc2l6ZSArPSBieXRlczsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBjaGFyIHNlY2J1ZlsyMF07Ci0JCSAgICBjaGFyICpzZWNuYW1lOwotCi0JCSAgICBzcHJpbnRmIChzZWNidWYsICIuc2VjJWQiLCBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMSk7Ci0JCSAgICBzZWNuYW1lID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNlY2J1ZikgKyAxKTsKLQkJICAgIHN0cmNweSAoc2VjbmFtZSwgc2VjYnVmKTsKLQkJICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY25hbWUpOwotCQkgICAgaWYgKHNlYyA9PSBOVUxMKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIHNlYy0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0JCSAgICBzZWMtPnZtYSA9IGFkZHJlc3M7Ci0JCSAgICBzZWMtPmxtYSA9IGFkZHJlc3M7Ci0JCSAgICBzZWMtPl9yYXdfc2l6ZSA9IGJ5dGVzOwotCQkgICAgc2VjLT5maWxlcG9zID0gcG9zOwotCQkgIH0KLQotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzcnOgotCQlhZGRyZXNzID0gSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzgnOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnOSc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCi0JCS8qIFRoaXMgaXMgYSB0ZXJtaW5hdGlvbiByZWNvcmQuICAqLwotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gYWRkcmVzczsKLQotCQlpZiAoYnVmICE9IE5VTEwpCi0JCSAgZnJlZSAoYnVmKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChlcnJvcikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN5bWJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKHN5bWJ1Zik7Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc3JlY19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSBiWzRdOwotCi0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICdTJyB8fCAhSVNIRVggKGJbMV0pIHx8ICFJU0hFWCAoYlsyXSkgfHwgIUlTSEVYIChiWzNdKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoISBzcmVjX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgISBzcmVjX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhbiBTLXJlY29yZCBmaWxlIHdpdGggc3ltYm9scy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXN5bWJvbHNyZWNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBiWzJdOwotCi0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCAyLCBhYmZkKSAhPSAyKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICckJyB8fCBiWzFdICE9ICckJykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoISBzcmVjX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgISBzcmVjX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfcmVhZF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBjb250ZW50cykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBpbnQgYzsKLSAgYmZkX3NpemVfdHlwZSBzb2ZhciA9IDA7Ci0gIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBidWZzaXplID0gMDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRikKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBoZHJbM107Ci0gICAgICB1bnNpZ25lZCBpbnQgYnl0ZXM7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgICBiZmRfYnl0ZSAqZGF0YTsKLQotICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHNyZWNfc2NhbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCwgc28gd2UKLSAgICAgICAgIG91Z2h0IHRvIGtub3cgdGhlIGV4YWN0IGZvcm1hdC4gICovCi0gICAgICBCRkRfQVNTRVJUIChjID09ICdTJyk7Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCAzLCBhYmZkKSAhPSAzKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBCRkRfQVNTRVJUIChJU0hFWCAoaGRyWzFdKSAmJiBJU0hFWCAoaGRyWzJdKSk7Ci0KLSAgICAgIGJ5dGVzID0gSEVYIChoZHIgKyAxKTsKLQotICAgICAgaWYgKGJ5dGVzICogMiA+IGJ1ZnNpemUpCi0JewotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGJ5dGVzICogMik7Ci0JICBpZiAoYnVmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgYnVmc2l6ZSA9IGJ5dGVzICogMjsKLQl9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoYnVmLCAxLCBieXRlcyAqIDIsIGFiZmQpICE9IGJ5dGVzICogMikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgYWRkcmVzcyA9IDA7Ci0gICAgICBkYXRhID0gYnVmOwotICAgICAgc3dpdGNoIChoZHJbMF0pCi0JewotCWRlZmF1bHQ6Ci0JICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgcmV0dXJuIHRydWU7Ci0KLQljYXNlICczJzoKLQkgIGFkZHJlc3MgPSBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgLS1ieXRlczsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnMic6Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgLS1ieXRlczsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnMSc6Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkgIGRhdGEgKz0gMjsKLQkgIGJ5dGVzIC09IDI7Ci0KLQkgIGlmIChhZGRyZXNzICE9IHNlY3Rpb24tPnZtYSArIHNvZmFyKQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgY29tZSB0byB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoc29mYXIgPT0gc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgY29uc2lkZXIgY2hlY2tzdW0uICAqLwotCSAgLS1ieXRlczsKLQotCSAgd2hpbGUgKGJ5dGVzLS0gIT0gMCkKLQkgICAgewotCSAgICAgIGNvbnRlbnRzW3NvZmFyXSA9IEhFWCAoZGF0YSk7Ci0JICAgICAgZGF0YSArPSAyOwotCSAgICAgICsrc29mYXI7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZXJyb3IpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgQkZEX0FTU0VSVCAoc29mYXIgPT0gc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24gaW4gYW4gUy1yZWNvcmQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChzZWN0aW9uLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0gYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwKLQkgICYmIHNlY3Rpb24tPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgc3JlY19yZWFkX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIHNlY3Rpb24tPnVzZWRfYnlfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG1lbWNweSAobG9jYXRpb24sIChiZmRfYnl0ZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZCArIG9mZnNldCwKLQkgIChzaXplX3QpIGNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUuICBXZSBhY2NlcHQgYW4gdW5rbm93biBhcmNoaXRlY3R1cmUgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICB7Ci0gICAgICBhYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKTsKLX0KLQotLyogd2UgaGF2ZSB0byBzYXZlIHVwIGFsbCB0aGUgU3JlY29yZHMgZm9yIGEgc3BsdXJnZSBiZWZvcmUgb3V0cHV0ICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvOwotewotICB0ZGF0YV90eXBlICp0ZGF0YSA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YTsKLSAgcmVnaXN0ZXIgc3JlY19kYXRhX2xpc3RfdHlwZSAqZW50cnk7Ci0KLSAgZW50cnkgPSAoKHNyZWNfZGF0YV9saXN0X3R5cGUgKikKLQkgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3JlY19kYXRhX2xpc3RfdHlwZSkpKTsKLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChieXRlc190b19kbwotICAgICAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotICAgICAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpkYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgYnl0ZXNfdG9fZG8pOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1jcHkgKChQVFIpIGRhdGEsIGxvY2F0aW9uLCAoc2l6ZV90KSBieXRlc190b19kbyk7Ci0KLSAgICAgIGlmICgoc2VjdGlvbi0+bG1hICsgb2Zmc2V0ICsgYnl0ZXNfdG9fZG8gLSAxKSA8PSAweGZmZmYpCi0JewotCi0JfQotICAgICAgZWxzZSBpZiAoKHNlY3Rpb24tPmxtYSArIG9mZnNldCArIGJ5dGVzX3RvX2RvIC0gMSkgPD0gMHhmZmZmZmYKLQkgICAgICAgJiYgdGRhdGEtPnR5cGUgPD0gMikKLQl7Ci0JICB0ZGF0YS0+dHlwZSA9IDI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRkYXRhLT50eXBlID0gMzsKLQl9Ci0KLSAgICAgIGVudHJ5LT5kYXRhID0gZGF0YTsKLSAgICAgIGVudHJ5LT53aGVyZSA9IHNlY3Rpb24tPmxtYSArIG9mZnNldDsKLSAgICAgIGVudHJ5LT5zaXplID0gYnl0ZXNfdG9fZG87Ci0KLSAgICAgIC8qIFNvcnQgdGhlIHJlY29yZHMgYnkgYWRkcmVzcy4gIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKLSAgICAgICAgIGFkZGluZyBhIHJlY29yZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgKi8KLSAgICAgIGlmICh0ZGF0YS0+dGFpbCAhPSBOVUxMCi0JICAmJiBlbnRyeS0+d2hlcmUgPj0gdGRhdGEtPnRhaWwtPndoZXJlKQotCXsKLQkgIHRkYXRhLT50YWlsLT5uZXh0ID0gZW50cnk7Ci0JICBlbnRyeS0+bmV4dCA9IE5VTEw7Ci0JICB0ZGF0YS0+dGFpbCA9IGVudHJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWdpc3RlciBzcmVjX2RhdGFfbGlzdF90eXBlICoqbG9vazsKLQotCSAgZm9yIChsb29rID0gJnRkYXRhLT5oZWFkOwotCSAgICAgICAqbG9vayAhPSBOVUxMICYmICgqbG9vayktPndoZXJlIDwgZW50cnktPndoZXJlOwotCSAgICAgICBsb29rID0gJigqbG9vayktPm5leHQpCi0JICAgIDsKLQkgIGVudHJ5LT5uZXh0ID0gKmxvb2s7Ci0JICAqbG9vayA9IGVudHJ5OwotCSAgaWYgKGVudHJ5LT5uZXh0ID09IE5VTEwpCi0JICAgIHRkYXRhLT50YWlsID0gZW50cnk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgcmVjb3JkIG9mIHR5cGUsIG9mIHRoZSBzdXBwbGllZCBudW1iZXIgb2YgYnl0ZXMuIFRoZQotICAgc3VwcGxpZWQgYnl0ZXMgYW5kIGxlbmd0aCBkb24ndCBoYXZlIGEgY2hlY2tzdW0uIFRoYXQncyB3b3JrZWQgb3V0Ci0gICBoZXJlCi0qLwotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLCB0eXBlLCBhZGRyZXNzLCBkYXRhLCBlbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgY29uc3QgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGNvbnN0IGJmZF9ieXRlICplbmQ7Ci17Ci0gIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgdW5zaWduZWQgaW50IGNoZWNrX3N1bSA9IDA7Ci0gIENPTlNUIGJmZF9ieXRlICpzcmMgPSBkYXRhOwotICBjaGFyICpkc3QgPSBidWZmZXI7Ci0gIGNoYXIgKmxlbmd0aDsKLSAgYmZkX3NpemVfdHlwZSB3cmxlbjsKLQotICAqZHN0KysgPSAnUyc7Ci0gICpkc3QrKyA9ICcwJyArIHR5cGU7Ci0KLSAgbGVuZ3RoID0gZHN0OwotICBkc3QgKz0gMjsJCQkvKiBsZWF2ZSByb29tIGZvciBkc3QqLwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNzoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDI0KSwgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIGNhc2UgODoKLSAgICBjYXNlIDI6Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyA+PiAxNiksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICBjYXNlIDk6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMDoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDgpLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotICBmb3IgKHNyYyA9IGRhdGE7IHNyYyA8IGVuZDsgc3JjKyspCi0gICAgewotICAgICAgVE9IRVggKGRzdCwgKnNyYywgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBsZW5ndGggKi8KLSAgVE9IRVggKGxlbmd0aCwgKGRzdCAtIGxlbmd0aCkgLyAyLCBjaGVja19zdW0pOwotICBjaGVja19zdW0gJj0gMHhmZjsKLSAgY2hlY2tfc3VtID0gMjU1IC0gY2hlY2tfc3VtOwotICBUT0hFWCAoZHN0LCBjaGVja19zdW0sIGNoZWNrX3N1bSk7Ci0gIGRzdCArPSAyOwotCi0gICpkc3QrKyA9ICdccic7Ci0gICpkc3QrKyA9ICdcbic7Ci0gIHdybGVuID0gZHN0IC0gYnVmZmVyOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIHdybGVuLCBhYmZkKSAhPSB3cmxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcltNQVhDSFVOS107Ci0gIGJmZF9ieXRlICpkc3QgPSBidWZmZXI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEknbGwgcHV0IGFuIGFyYml0YXJ5IDQwIGNoYXIgbGltaXQgb24gaGVhZGVyIHNpemUgKi8KLSAgZm9yIChpID0gMDsgaSA8IDQwICYmIGFiZmQtPmZpbGVuYW1lW2ldOyBpKyspCi0gICAgewotICAgICAgKmRzdCsrID0gYWJmZC0+ZmlsZW5hbWVbaV07Ci0gICAgfQotICByZXR1cm4gc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsIDAsIDAsIGJ1ZmZlciwgZHN0KTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfc2VjdGlvbiAoYWJmZCwgdGRhdGEsIGxpc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdGRhdGFfdHlwZSAqdGRhdGE7Ci0gICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKmxpc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCBvY3RldHNfd3JpdHRlbiA9IDA7Ci0gIGJmZF9ieXRlICpsb2NhdGlvbiA9IGxpc3QtPmRhdGE7Ci0KLSAgd2hpbGUgKG9jdGV0c193cml0dGVuIDwgbGlzdC0+c2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2N0ZXRzX3RoaXNfY2h1bmsgPSBsaXN0LT5zaXplIC0gb2N0ZXRzX3dyaXR0ZW47Ci0KLSAgICAgIGlmIChvY3RldHNfdGhpc19jaHVuayA+IENIVU5LKQotCW9jdGV0c190aGlzX2NodW5rID0gQ0hVTks7Ci0KLSAgICAgIGFkZHJlc3MgPSBsaXN0LT53aGVyZSArIG9jdGV0c193cml0dGVuIC8gYmZkX29jdGV0c19wZXJfYnl0ZSAoYWJmZCk7Ci0KLSAgICAgIGlmICghIHNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJICAgICAgIHRkYXRhLT50eXBlLAotCQkJICAgICAgIGFkZHJlc3MsCi0JCQkgICAgICAgbG9jYXRpb24sCi0JCQkgICAgICAgbG9jYXRpb24gKyBvY3RldHNfdGhpc19jaHVuaykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBvY3RldHNfd3JpdHRlbiArPSBvY3RldHNfdGhpc19jaHVuazsKLSAgICAgIGxvY2F0aW9uICs9IG9jdGV0c190aGlzX2NodW5rOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfdGVybWluYXRvciAoYWJmZCwgdGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdGRhdGFfdHlwZSAqdGRhdGE7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlclsyXTsKLQotICByZXR1cm4gc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsIDEwIC0gdGRhdGEtPnR5cGUsCi0JCQkgICAgYWJmZC0+c3RhcnRfYWRkcmVzcywgYnVmZmVyLCBidWZmZXIpOwotfQotCi0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIGJ1ZmZlcltNQVhDSFVOS107Ci0gIC8qIER1bXAgb3V0IHRoZSBzeW1ib2xzIG9mIGEgYmZkICovCi0gIGludCBpOwotICBpbnQgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQotICBpZiAoY291bnQpCi0gICAgewotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIGFzeW1ib2wgKip0YWJsZSA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gICAgICBzcHJpbnRmIChidWZmZXIsICIkJCAlc1xyXG4iLCBhYmZkLT5maWxlbmFtZSk7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmZmVyKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQl7Ci0JICBhc3ltYm9sICpzID0gdGFibGVbaV07Ci0JICBpZiAoISBiZmRfaXNfbG9jYWxfbGFiZWwgKGFiZmQsIHMpCi0JICAgICAgJiYgKHMtPmZsYWdzICYgQlNGX0RFQlVHR0lORykgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEp1c3QgZHVtcCBvdXQgbm9uIGRlYnVnIHN5bWJvbHMgKi8KLQkgICAgICBiZmRfc2l6ZV90eXBlIGw7Ci0JICAgICAgY2hhciBidWYyWzQwXSwgKnA7Ci0KLQkgICAgICBzcHJpbnRmX3ZtYSAoYnVmMiwKLQkJCSAgIHMtPnZhbHVlICsgcy0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxtYQotCQkJICAgKyBzLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICBwID0gYnVmMjsKLQkgICAgICB3aGlsZSAocFswXSA9PSAnMCcgJiYgcFsxXSAhPSAwKQotCQlwKys7Ci0JICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiICAlcyAkJXNcclxuIiwgcy0+bmFtZSwgcCk7Ci0JICAgICAgbCA9IHN0cmxlbiAoYnVmZmVyKTsKLQkgICAgICBpZiAoYmZkX3dyaXRlIChidWZmZXIsIGwsIDEsIGFiZmQpICE9IGwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiQkIFxyXG4iKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmZmVyKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzeW1ib2xzOwotewotICB0ZGF0YV90eXBlICp0ZGF0YSA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YTsKLSAgc3JlY19kYXRhX2xpc3RfdHlwZSAqbGlzdDsKLQotICBpZiAoc3ltYm9scykKLSAgICB7Ci0gICAgICBpZiAoISBzcmVjX3dyaXRlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgc3JlY193cml0ZV9oZWFkZXIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd2FuZGVyIHRob3VnaCBhbGwgdGhlIHNlY3Rpb25zIHByb3ZpZGVkIGFuZCBvdXRwdXQgdGhlbSAqLwotICBsaXN0ID0gdGRhdGEtPmhlYWQ7Ci0KLSAgd2hpbGUgKGxpc3QgIT0gKHNyZWNfZGF0YV9saXN0X3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBzcmVjX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHRkYXRhLCBsaXN0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiBzcmVjX3dyaXRlX3Rlcm1pbmF0b3IgKGFiZmQsIHRkYXRhKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCwgMCk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQsIDEpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLXNyZWNfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLXNyZWNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotLyogUmV0dXJuIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotc3JlY19nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGFzeW1ib2wgKmNzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBjc3ltYm9scyA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+Y3N5bWJvbHM7Ci0gIGlmIChjc3ltYm9scyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKmM7Ci0gICAgICBzdHJ1Y3Qgc3JlY19zeW1ib2wgKnM7Ci0KLSAgICAgIGNzeW1ib2xzID0gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzeW1jb3VudCAqIHNpemVvZiAoYXN5bWJvbCkpOwotICAgICAgaWYgKGNzeW1ib2xzID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPmNzeW1ib2xzID0gY3N5bWJvbHM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scywgYyA9IGNzeW1ib2xzOwotCSAgIHMgIT0gTlVMTDsKLQkgICBzID0gcy0+bmV4dCwgKytjKQotCXsKLQkgIGMtPnRoZV9iZmQgPSBhYmZkOwotCSAgYy0+bmFtZSA9IHMtPm5hbWU7Ci0JICBjLT52YWx1ZSA9IHMtPnZhbDsKLQkgIGMtPmZsYWdzID0gQlNGX0dMT0JBTDsKLQkgIGMtPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgYy0+dWRhdGEucCA9IE5VTEw7Ci0JfQotICAgIH0KLQkKLSAgZm9yIChpID0gMDsgaSA8IHN5bWNvdW50OyBpKyspCi0gICAgKmFsb2NhdGlvbisrID0gY3N5bWJvbHMrKzsKLSAgKmFsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIHN5bWNvdW50OwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1zcmVjX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNyZWNfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JICAgICAgIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSwKLQkgICAgICAgc3ltYm9sLT5uYW1lKTsKLQotICAgIH0KLX0KLQotI2RlZmluZQlzcmVjX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBzcmVjX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBzcmVjX25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSBzcmVjX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgc3JlY19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgc3JlY19maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBzcmVjX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgc3JlY19yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHNyZWNfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgc3JlY19nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF8wbCkKLSNkZWZpbmUgc3JlY19jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgc3JlY19iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBzcmVjX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgc3JlY19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHNyZWNfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIHNyZWNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgc3JlY19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBzcmVjX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIHNyZWNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgc3JlY192ZWMgPQotewotICAic3JlYyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgc3JlY19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBzcmVjX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKLQotCi0KLWNvbnN0IGJmZF90YXJnZXQgc3ltYm9sc3JlY192ZWMgPQotewotICAic3ltYm9sc3JlYyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgc3ltYm9sc3JlY19vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNyZWNfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIHN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3N0YWItc3ltcy5jIGIvYmZkL3N0YWItc3ltcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGZlNmM4Li4wMDAwMDAwCi0tLSBhL2JmZC9zdGFiLXN5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qIFRhYmxlIG9mIHN0YWIgbmFtZXMgZm9yIHRoZSBCRkQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCQkvKiBWYWx1ZSBkb2Vzbid0IG1hdHRlci4gKi8KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotLyogSWdub3JlIGR1cGxpY2F0ZSBzdGFiIGNvZGVzOyBqdXN0IHJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgZmlyc3QKLSAgIG9uZS4gICovCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWIoTkFNRSwgQ09ERSwgU1RSSU5HKSBfX2RlZmluZV9uYW1lKENPREUsIFNUUklORykKLSNkZWZpbmUgX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUoTkFNRSwgQ09ERSwgU1RSSU5HKQotCi0vKiBUaGVzZSBhcmUgbm90IHJlYWxseSBzdGFiIHN5bWJvbHMsIGJ1dCBpdCBpcwotICAgY29udmVuaWVudCB0byBoYXZlIHRoZW0gaGVyZSBmb3IgdGhlIHNha2Ugb2Ygbm0uCi0gICBGb3IgY29tcGxldGVuZXNzLCB3ZSBjb3VsZCBhbHNvIGFkZCBOX1RFWFQgZXRjLCBidXQgdGhvc2UKLSAgIGFyZSBuZXZlciBuZWVkZWQsIHNpbmNlIG5tIHRyZWF0cyB0aG9zZSBzcGVjaWFsbHkuICovCi0jZGVmaW5lIEVYVFJBX1NZTUJPTFMgXAotICBfX2RlZmluZV9uYW1lIChOX1NFVEEsICJTRVRBIikvKiBBYnNvbHV0ZSBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVFQsICJTRVRUIikvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VURCwgIlNFVEQiKS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRCLCAiU0VUQiIpLyogQnNzIHNldCBlbGVtZW50IHN5bWJvbCAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUViwgIlNFVFYiKS8qIFBvaW50ZXIgdG8gc2V0IHZlY3RvciBpbiBkYXRhIGFyZWEuICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9JTkRSLCAiSU5EUiIpIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9XQVJOSU5HLCAiV0FSTklORyIpCi0KLWNvbnN0IGNoYXIgKgotYmZkX2dldF9zdGFiX25hbWUgKGNvZGUpCi0gICAgIGludCBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotI2RlZmluZSBfX2RlZmluZV9uYW1lKHZhbCwgc3RyKSBjYXNlIHZhbDogcmV0dXJuIHN0cjsKLSNpbmNsdWRlICJhb3V0L3N0YWIuZGVmIgotICAgICAgRVhUUkFfU1lNQk9MUwotICAgIH0KLQotICByZXR1cm4gKGNvbnN0IGNoYXIgKikgMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zdGFicy5jIGIvYmZkL3N0YWJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YWMxNjcuLjAwMDAwMDAKLS0tIGEvYmZkL3N0YWJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTMgKzAsMCBAQAotLyogU3RhYnMgaW4gc2VjdGlvbnMgbGlua2luZyBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0IGZvciBsaW5raW5nIHN0YWJzIGluIHNlY3Rpb25zLCBhcyB1c2VkCi0gICBvbiBDT0ZGIGFuZCBFTEYuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogU3RhYnMgZW50cmllcyB1c2UgYSAxMiBieXRlIGZvcm1hdDoKLSAgICAgNCBieXRlIHN0cmluZyB0YWJsZSBpbmRleAotICAgICAxIGJ5dGUgc3RhYiB0eXBlCi0gICAgIDEgYnl0ZSBzdGFiIG90aGVyIGZpZWxkCi0gICAgIDIgYnl0ZSBzdGFiIGRlc2MgZmllbGQKLSAgICAgNCBieXRlIHN0YWIgdmFsdWUKLSAgIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgZm9yIGEgNjQgYml0IG9iamVjdCBmb3JtYXQuCi0KLSAgIFRoZSBzdGFicyBzeW1ib2xzIGFyZSBkaXZpZGVkIGludG8gY29tcGlsYXRpb24gdW5pdHMuICBGb3IgdGhlCi0gICBmaXJzdCBlbnRyeSBpbiBlYWNoIHVuaXQsIHRoZSB0eXBlIG9mIDAsIHRoZSB2YWx1ZSBpcyB0aGUgbGVuZ3RoIG9mCi0gICB0aGUgc3RyaW5nIHRhYmxlIGZvciB0aGlzIHVuaXQsIGFuZCB0aGUgZGVzYyBmaWVsZCBpcyB0aGUgbnVtYmVyIG9mCi0gICBzdGFicyBzeW1ib2xzIGZvciB0aGlzIHVuaXQuICAqLwotCi0jZGVmaW5lIFNUUkRYT0ZGICgwKQotI2RlZmluZSBUWVBFT0ZGICg0KQotI2RlZmluZSBPVEhFUk9GRiAoNSkKLSNkZWZpbmUgREVTQ09GRiAoNikKLSNkZWZpbmUgVkFMT0ZGICg4KQotI2RlZmluZSBTVEFCU0laRSAoMTIpCi0KLS8qIEEgaGFzaCB0YWJsZSB1c2VkIGZvciBoZWFkZXIgZmlsZXMgd2l0aCBOX0JJTkNMIGVudHJpZXMuICAqLwotCi1zdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogQSBsaW5rZWQgbGlzdCBvZiB0b3RhbHMgdGhhdCB3ZSBoYXZlIGZvdW5kIGZvciBhIHBhcnRpY3VsYXIgaGVhZGVyCi0gICBmaWxlLiAgKi8KLQotc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMKLXsKLSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKm5leHQ7Ci0gIGJmZF92bWEgdG90YWw7Ci19OwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIExpc3Qgb2YgdG90YWxzIHdlIGhhdmUgZm91bmQgZm9yIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzICp0b3RhbHM7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBzdGFiX2xpbmtfaW5jbHVkZXNfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgYSBsaXN0IG9mIE5fQklOQ0wgc3ltYm9scywgc29tZSBvZgotICAgd2hpY2ggbWlnaHQgYmUgY29udmVydGVkIGludG8gTl9FWENMIHN5bWJvbHMuICAqLwotCi1zdHJ1Y3Qgc3RhYl9leGNsX2xpc3QKLXsKLSAgLyogVGhlIG5leHQgc3ltYm9sIHRvIGNvbnZlcnQuICAqLwotICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKm5leHQ7Ci0gIC8qIFRoZSBvZmZzZXQgdG8gdGhpcyBzeW1ib2wgaW4gdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBiZmRfc2l6ZV90eXBlIG9mZnNldDsKLSAgLyogVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIGJmZF92bWEgdmFsOwotICAvKiBUaGUgdHlwZSBvZiB0aGlzIHN5bWJvbCAoTl9CSU5DTCBvciBOX0VYQ0wpLiAgKi8KLSAgaW50IHR5cGU7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyBzdG9yZWQgd2l0aCBlYWNoIC5zdGFiIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8KLXsKLSAgLyogVGhpcyBpcyBhIGxpbmtlZCBsaXN0IG9mIE5fQklOQ0wgc3ltYm9scyB3aGljaCBzaG91bGQgYmUKLSAgICAgY29udmVydGVkIGludG8gTl9FWENMIHN5bWJvbHMuICAqLwotICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKmV4Y2xzOwotCi0gIC8qIFRoaXMgaXMgdXNlZCB0byBtYXAgaW5wdXQgc3RhYiBvZmZzZXRzIHdpdGhpbiB0aGVpciBzZWN0aW9ucwotICAgICB0byBvdXRwdXQgc3RhYiBvZmZzZXRzLCB0byB0YWtlIGludG8gYWNjb3VudCBzdGFicyB0aGF0IGhhdmUKLSAgICAgYmVlbiBkZWxldGVkLiAgSWYgaXQgaXMgTlVMTCwgdGhlIG91dHB1dCBvZmZzZXRzIGFyZSB0aGUgc2FtZQotICAgICBhcyB0aGUgaW5wdXQgb2Zmc2V0cywgYmVjYXVzZSBubyBzdGFicyBoYXZlIGJlZW4gZGVsZXRlZCBmcm9tCi0gICAgIHRoaXMgc2VjdGlvbi4gIE90aGVyd2lzZSB0aGUgaSd0aCBlbnRyeSBpcyB0aGUgbnVtYmVyIG9mCi0gICAgIGJ5dGVzIG9mIHN0YWJzIHRoYXQgaGF2ZSBiZWVuIGRlbGV0ZWQgcHJpb3IgdG8gdGhlIGkndGgKLSAgICAgc3RhYi4gKi8KLSAgYmZkX3NpemVfdHlwZSAqY3VtdWxhdGl2ZV9za2lwczsKLQotICAvKiBUaGlzIGlzIGFuIGFycmF5IG9mIHN0cmluZyBpbmRpY2VzLiAgRm9yIGVhY2ggc3RhYiBzeW1ib2wsIHdlCi0gICAgIHN0b3JlIHRoZSBzdHJpbmcgaW5kZXggaGVyZS4gIElmIGEgc3RhYiBzeW1ib2wgc2hvdWxkIG5vdCBiZQotICAgICBpbmNsdWRlZCBpbiB0aGUgZmluYWwgb3V0cHV0LCB0aGUgc3RyaW5nIGluZGV4IGlzIC0xLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzdHJpZHhzWzFdOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHN0YWJzIGluIHNlY3Rpb25zCi0gICBpbmZvcm1hdGlvbiB3aGlsZSBsaW5raW5nLiAgKi8KLQotc3RydWN0IHN0YWJfaW5mbwotewotICAvKiBBIGhhc2ggdGFibGUgdXNlZCB0byBob2xkIHN0YWJzIHN0cmluZ3MuICAqLwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJpbmdzOwotICAvKiBUaGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdGFibGUgaW5jbHVkZXM7Ci0gIC8qIFRoZSBmaXJzdCAuc3RhYnN0ciBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0YWJzdHI7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdGFiX2xpbmtfaW5jbHVkZXNfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotDAotLyogVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBlbnRyeSBpbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotc3RhYl9saW5rX2luY2x1ZGVzX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dG90YWxzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggaW5wdXQgZmlsZSBmcm9tIHRoZSBhZGRfc3ltYm9scwotICAgcGFzcyBvZiB0aGUgbGlua2VyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMgKGFiZmQsIHBzaW5mbywgc3RhYnNlYywgc3RhYnN0cnNlYywgcHNlY2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSICpwc2luZm87Ci0gICAgIGFzZWN0aW9uICpzdGFic2VjOwotICAgICBhc2VjdGlvbiAqc3RhYnN0cnNlYzsKLSAgICAgUFRSICpwc2VjaW5mbzsKLXsKLSAgYm9vbGVhbiBmaXJzdDsKLSAgc3RydWN0IHN0YWJfaW5mbyAqc2luZm87Ci0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gIHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqc2VjaW5mbzsKLSAgYmZkX2J5dGUgKnN0YWJidWYgPSBOVUxMOwotICBiZmRfYnl0ZSAqc3RhYnN0cmJ1ZiA9IE5VTEw7Ci0gIGJmZF9ieXRlICpzeW0sICpzeW1lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgc3Ryb2ZmLCBuZXh0X3N0cm9mZiwgc2tpcDsKLSAgYmZkX3NpemVfdHlwZSAqcHN0cmlkeDsKLQotICBpZiAoc3RhYnNlYy0+X3Jhd19zaXplID09IDAKLSAgICAgIHx8IHN0YWJzdHJzZWMtPl9yYXdfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgZmlsZSBkb2VzIG5vdCBjb250YWluIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKHN0YWJzZWMtPl9yYXdfc2l6ZSAlIFNUQUJTSVpFICE9IDApCi0gICAgewotICAgICAgLyogU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIGZvcm1hdCBvZiB0aGVzZSBzdGFiIHN5bWJvbHMuCi0gICAgICAgICBEb24ndCB0cnkgdG8gb3B0aW1pemUgdGhlbS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKChzdGFic3Ryc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBzaG91bGRuJ3Qgc2VlIHJlbG9jYXRpb25zIGluIHRoZSBzdHJpbmdzLCBhbmQgd2UgYXJlbid0Ci0gICAgICAgICBwcmVwYXJlZCB0byBoYW5kbGUgdGhlbS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKChzdGFic2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzdGFic2VjLT5vdXRwdXRfc2VjdGlvbikpCi0gICAgICB8fCAoc3RhYnN0cnNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzdGFic3Ryc2VjLT5vdXRwdXRfc2VjdGlvbikpKQotICAgIHsKLSAgICAgIC8qIEF0IGxlYXN0IG9uZSBvZiB0aGUgc2VjdGlvbnMgaXMgYmVpbmcgZGlzY2FyZGVkIGZyb20gdGhlCi0gICAgICAgICBsaW5rLCBzbyB3ZSBzaG91bGQganVzdCBpZ25vcmUgdGhlbS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZmlyc3QgPSBmYWxzZTsKLQotICBpZiAoKnBzaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIHN0YWJzIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZi4gICovCi0gICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAqcHNpbmZvID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzdGFiX2luZm8pKTsKLSAgICAgIGlmICgqcHNpbmZvID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87Ci0gICAgICBzaW5mby0+c3RyaW5ncyA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gICAgICBpZiAoc2luZm8tPnN0cmluZ3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZmlyc3QgYnl0ZSBpcyB6ZXJvLiAgKi8KLSAgICAgICh2b2lkKSBfYmZkX3N0cmluZ3RhYl9hZGQgKHNpbmZvLT5zdHJpbmdzLCAiIiwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKCZzaW5mby0+aW5jbHVkZXMucm9vdCwKLQkJCQkgICBzdGFiX2xpbmtfaW5jbHVkZXNfbmV3ZnVuYywKLQkJCQkgICAyNTEpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc2luZm8tPnN0YWJzdHIgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zdGFic3RyIik7Ci0gICAgICBzaW5mby0+c3RhYnN0ci0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSB8IFNFQ19ERUJVR0dJTkc7Ci0gICAgfQotCi0gIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLQotICAvKiBJbml0aWFsaXplIHRoZSBpbmZvcm1hdGlvbiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgZm9yIHRoaXMgLnN0YWIKLSAgICAgc2VjdGlvbi4gICovCi0KLSAgY291bnQgPSBzdGFic2VjLT5fcmF3X3NpemUgLyBTVEFCU0laRTsKLQotICAqcHNlY2luZm8gPSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgKHNpemVvZiAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvKQotCQkJICArIChjb3VudCAtIDEpICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSkpOwotICBpZiAoKnBzZWNpbmZvID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc2VjaW5mbyA9IChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKikgKnBzZWNpbmZvOwotICBzZWNpbmZvLT5leGNscyA9IE5VTEw7Ci0gIHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMgPSBOVUxMOwotICBtZW1zZXQgKHNlY2luZm8tPnN0cmlkeHMsIDAsIGNvdW50ICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgLyogUmVhZCB0aGUgc3RhYnMgaW5mb3JtYXRpb24gZnJvbSBhYmZkLiAgKi8KLQotICBzdGFiYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN0YWJzZWMtPl9yYXdfc2l6ZSk7Ci0gIHN0YWJzdHJidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3RhYnN0cnNlYy0+X3Jhd19zaXplKTsKLSAgaWYgKHN0YWJidWYgPT0gTlVMTCB8fCBzdGFic3RyYnVmID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic2VjLCBzdGFiYnVmLCAwLAotCQkJCSAgc3RhYnNlYy0+X3Jhd19zaXplKQotICAgICAgfHwgISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzdHJzZWMsIHN0YWJzdHJidWYsIDAsCi0JCQkJICAgICBzdGFic3Ryc2VjLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3RhYnMgc3ltYm9scywgd29yayBvdXQgdGhlIG5ldyBzdHJpbmcgaW5kaWNlcywKLSAgICAgYW5kIGlkZW50aWZ5IE5fQklOQ0wgc3ltYm9scyB3aGljaCBjYW4gYmUgZWxpbWluYXRlZC4gICovCi0KLSAgc3Ryb2ZmID0gMDsKLSAgbmV4dF9zdHJvZmYgPSAwOwotICBza2lwID0gMDsKLQotICBzeW1lbmQgPSBzdGFiYnVmICsgc3RhYnNlYy0+X3Jhd19zaXplOwotICBmb3IgKHN5bSA9IHN0YWJidWYsIHBzdHJpZHggPSBzZWNpbmZvLT5zdHJpZHhzOwotICAgICAgIHN5bSA8IHN5bWVuZDsKLSAgICAgICBzeW0gKz0gU1RBQlNJWkUsICsrcHN0cmlkeCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotICAgICAgaWYgKCpwc3RyaWR4ICE9IDApCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkIGJ5IGFuIE5fQklOQ0wgcGFzcy4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHR5cGUgPSBzeW1bVFlQRU9GRl07Ci0KLSAgICAgIGlmICh0eXBlID09IDApCi0JewotCSAgLyogU3BlY2lhbCB0eXBlIDAgc3RhYnMgaW5kaWNhdGUgdGhlIG9mZnNldCB0byB0aGUgbmV4dAotICAgICAgICAgICAgIHN0cmluZyB0YWJsZS4gIFdlIG9ubHkgY29weSB0aGUgdmVyeSBmaXJzdCBvbmUuICAqLwotCSAgc3Ryb2ZmID0gbmV4dF9zdHJvZmY7Ci0JICBuZXh0X3N0cm9mZiArPSBiZmRfZ2V0XzMyIChhYmZkLCBzeW0gKyA4KTsKLQkgIGlmICghIGZpcnN0KQotCSAgICB7Ci0JICAgICAgKnBzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JICAgICAgKytza2lwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBmaXJzdCA9IGZhbHNlOwotCX0KLQotICAgICAgLyogU3RvcmUgdGhlIHN0cmluZyBpbiB0aGUgaGFzaCB0YWJsZSwgYW5kIHJlY29yZCB0aGUgaW5kZXguICAqLwotICAgICAgc3RyaW5nID0gKChjaGFyICopIHN0YWJzdHJidWYKLQkJKyBzdHJvZmYKLQkJKyBiZmRfZ2V0XzMyIChhYmZkLCBzeW0gKyBTVFJEWE9GRikpOwotICAgICAgKnBzdHJpZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHNpbmZvLT5zdHJpbmdzLCBzdHJpbmcsIHRydWUsIHRydWUpOwotCi0gICAgICAvKiBBbiBOX0JJTkNMIHN5bWJvbCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBzdGFicyBlbnRyaWVzCi0JIGZvciBhIGhlYWRlciBmaWxlLiAgV2UgbmVlZCB0byBzY2FuIGFoZWFkIHRvIHRoZSBuZXh0IE5fRUlOQ0wKLQkgc3ltYm9sLCBpZ25vcmluZyBuZXN0aW5nLCBhZGRpbmcgdXAgYWxsIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQotCSBzeW1ib2wgbmFtZXMsIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUgbnVtYmVycyBpbiB0eXBlcyAodGhlCi0JIGZpcnN0IG51bWJlciBhZnRlciBhbiBvcGVuIHBhcmVudGhlc2lzKS4gICovCi0gICAgICBpZiAodHlwZSA9PSBOX0JJTkNMKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCSAgaW50IG5lc3Q7Ci0JICBiZmRfYnl0ZSAqaW5jbF9zeW07Ci0JICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICppbmNsX2VudHJ5OwotCSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKnQ7Ci0JICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKm5lOwotCi0JICB2YWwgPSAwOwotCSAgbmVzdCA9IDA7Ci0JICBmb3IgKGluY2xfc3ltID0gc3ltICsgU1RBQlNJWkU7Ci0JICAgICAgIGluY2xfc3ltIDwgc3ltZW5kOwotCSAgICAgICBpbmNsX3N5bSArPSBTVEFCU0laRSkKLQkgICAgewotCSAgICAgIGludCBpbmNsX3R5cGU7Ci0KLQkgICAgICBpbmNsX3R5cGUgPSBpbmNsX3N5bVtUWVBFT0ZGXTsKLQkgICAgICBpZiAoaW5jbF90eXBlID09IDApCi0JCWJyZWFrOwotCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQl7Ci0JCSAgaWYgKG5lc3QgPT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIC0tbmVzdDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQotCQkrK25lc3Q7Ci0JICAgICAgZWxzZSBpZiAobmVzdCA9PSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqc3RyOwotCi0JCSAgc3RyID0gKChjaGFyICopIHN0YWJzdHJidWYKLQkJCSArIHN0cm9mZgotCQkJICsgYmZkX2dldF8zMiAoYWJmZCwgaW5jbF9zeW0gKyBTVFJEWE9GRikpOwotCQkgIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKQotCQkgICAgewotCQkgICAgICB2YWwgKz0gKnN0cjsKLQkJICAgICAgaWYgKCpzdHIgPT0gJygnKQotCQkJewotCQkJICAvKiBTa2lwIHRoZSBmaWxlIG51bWJlci4gICovCi0JCQkgICsrc3RyOwotCQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzdHIpKQotCQkJICAgICsrc3RyOwotCQkJICAtLXN0cjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIGhlYWRlciBmaWxlIHdpdGggdGhlIHNhbWUKLQkgICAgIHZhbHVlLCB0aGVuIHJlcGxhY2VkIHRoaXMgb25lIHdpdGggYW4gTl9FWENMIHN5bWJvbC4gICovCi0JICBpbmNsX2VudHJ5ID0gc3RhYl9saW5rX2luY2x1ZGVzX2xvb2t1cCAoJnNpbmZvLT5pbmNsdWRlcywgc3RyaW5nLAotCQkJCQkJICB0cnVlLCB0cnVlKTsKLQkgIGlmIChpbmNsX2VudHJ5ID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBmb3IgKHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JICAgIGlmICh0LT50b3RhbCA9PSB2YWwpCi0JICAgICAgYnJlYWs7Ci0KLQkgIC8qIFJlY29yZCB0aGlzIHN5bWJvbCwgc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSB2YWx1ZQotICAgICAgICAgICAgIGNvcnJlY3RseS4gICovCi0JICBuZSA9IChzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKm5lKTsKLQkgIGlmIChuZSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG5lLT5vZmZzZXQgPSBzeW0gLSBzdGFiYnVmOwotCSAgbmUtPnZhbCA9IHZhbDsKLQkgIG5lLT50eXBlID0gTl9CSU5DTDsKLQkgIG5lLT5uZXh0ID0gc2VjaW5mby0+ZXhjbHM7Ci0JICBzZWNpbmZvLT5leGNscyA9IG5lOwotCi0JICBpZiAodCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHNlZW4gdGhpcyBoZWFkZXIgZmlsZQotCQkgd2l0aCB0aGlzIHNldCBvZiBzdGFicyBzdHJpbmdzLiAgKi8KLQkgICAgICB0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqKQotCQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJnNpbmZvLT5pbmNsdWRlcy5yb290LCBzaXplb2YgKnQpKTsKLQkgICAgICBpZiAodCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB0LT50b3RhbCA9IHZhbDsKLQkgICAgICB0LT5uZXh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOwotCSAgICAgIGluY2xfZW50cnktPnRvdGFscyA9IHQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgKmluY2xfcHN0cmlkeDsKLQotCSAgICAgIC8qIFdlIGhhdmUgc2VlbiB0aGlzIGhlYWRlciBmaWxlIGJlZm9yZS4gIFRlbGwgdGhlIGZpbmFsCi0JCSBwYXNzIHRvIGNoYW5nZSB0aGUgdHlwZSB0byBOX0VYQ0wuICAqLwotCSAgICAgIG5lLT50eXBlID0gTl9FWENMOwotCi0JICAgICAgLyogTWFyayB0aGUgc2tpcHBlZCBzeW1ib2xzLiAgKi8KLQotCSAgICAgIG5lc3QgPSAwOwotCSAgICAgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyBTVEFCU0laRSwgaW5jbF9wc3RyaWR4ID0gcHN0cmlkeCArIDE7Ci0JCSAgIGluY2xfc3ltIDwgc3ltZW5kOwotCQkgICBpbmNsX3N5bSArPSBTVEFCU0laRSwgKytpbmNsX3BzdHJpZHgpCi0JCXsKLQkJICBpbnQgaW5jbF90eXBlOwotCi0JCSAgaW5jbF90eXBlID0gaW5jbF9zeW1bVFlQRU9GRl07Ci0KLQkJICBpZiAoaW5jbF90eXBlID09IE5fRUlOQ0wpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChuZXN0ID09IDApCi0JCQl7Ci0JCQkgICppbmNsX3BzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JCQkgICsrc2tpcDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIC0tbmVzdDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJICAgICsrbmVzdDsKLQkJICBlbHNlIGlmIChuZXN0ID09IDApCi0JCSAgICB7Ci0JCSAgICAgICppbmNsX3BzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JCSAgICAgICsrc2tpcDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBmcmVlIChzdGFiYnVmKTsKLSAgc3RhYmJ1ZiA9IE5VTEw7Ci0gIGZyZWUgKHN0YWJzdHJidWYpOwotICBzdGFic3RyYnVmID0gTlVMTDsKLQotICAvKiBXZSBuZWVkIHRvIHNldCB0aGUgc2VjdGlvbiBzaXplcyBzdWNoIHRoYXQgdGhlIGxpbmtlciB3aWxsCi0gICAgIGNvbXB1dGUgdGhlIG91dHB1dCBzZWN0aW9uIHNpemVzIGNvcnJlY3RseS4gIFdlIHNldCB0aGUgLnN0YWIKLSAgICAgc2l6ZSB0byBub3QgaW5jbHVkZSB0aGUgZW50cmllcyB3ZSBkb24ndCB3YW50LiAgV2Ugc2V0Ci0gICAgIFNFQ19FWENMVURFIGZvciB0aGUgLnN0YWJzdHIgc2VjdGlvbiwgc28gdGhhdCBpdCB3aWxsIGJlIGRyb3BwZWQKLSAgICAgZnJvbSB0aGUgbGluay4gIFdlIHJlY29yZCB0aGUgc2l6ZSBvZiB0aGUgc3RydGFiIGluIHRoZSBmaXJzdAotICAgICAuc3RhYnN0ciBzZWN0aW9uIHdlIHNhdywgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBzZXQgU0VDX0VYQ0xVREUKLSAgICAgZm9yIHRoYXQgc2VjdGlvbi4gICovCi0gIHN0YWJzZWMtPl9jb29rZWRfc2l6ZSA9IChjb3VudCAtIHNraXApICogU1RBQlNJWkU7Ci0gIGlmIChzdGFic2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzdGFic2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgc3RhYnN0cnNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gIHNpbmZvLT5zdGFic3RyLT5fY29va2VkX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChzaW5mby0+c3RyaW5ncyk7Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBgY3VtdWxhdGl2ZV9za2lwcycgYXJyYXkgbm93IHRoYXQgc3RhYnMgaGF2ZSBiZWVuCi0gICAgIGRlbGV0ZWQgZm9yIHRoaXMgc2VjdGlvbi4gKi8KLQotICBpZiAoc2tpcCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgaSwgb2Zmc2V0OwotICAgICAgYmZkX3NpemVfdHlwZSAqcHNraXBzOwotCi0gICAgICBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzID0KLQkoYmZkX3NpemVfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0gICAgICBpZiAoc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBwc2tpcHMgPSBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzOwotICAgICAgcHN0cmlkeCA9IHNlY2luZm8tPnN0cmlkeHM7Ci0gICAgICBvZmZzZXQgPSAwOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcHNraXBzKyssIHBzdHJpZHgrKykKLQl7Ci0JICAqcHNraXBzID0gb2Zmc2V0OwotCSAgaWYgKCpwc3RyaWR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkgICAgb2Zmc2V0ICs9IFNUQUJTSVpFOwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAob2Zmc2V0ICE9IDApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN0YWJidWYgIT0gTlVMTCkKLSAgICBmcmVlIChzdGFiYnVmKTsKLSAgaWYgKHN0YWJzdHJidWYgIT0gTlVMTCkKLSAgICBmcmVlIChzdGFic3RyYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHN0YWIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIHJlbG9jYXRlZAotICAgY29udGVudHMuICAqLwotCi1ib29sZWFuCi1fYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMgKG91dHB1dF9iZmQsIHBzaW5mbywgc3RhYnNlYywgcHNlY2luZm8sIGNvbnRlbnRzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgICAgUFRSICpwc2VjaW5mbzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKmU7Ci0gIGJmZF9ieXRlICpzeW0sICp0b3N5bSwgKnN5bWVuZDsKLSAgYmZkX3NpemVfdHlwZSAqcHN0cmlkeDsKLQotICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87Ci0gIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKLQotICBpZiAoc2VjaW5mbyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgICAgY29udGVudHMsIHN0YWJzZWMtPm91dHB1dF9vZmZzZXQsCi0JCQkJICAgICBzdGFic2VjLT5fcmF3X3NpemUpOwotCi0gIC8qIEhhbmRsZSBlYWNoIE5fQklOQ0wgZW50cnkuICAqLwotICBmb3IgKGUgPSBzZWNpbmZvLT5leGNsczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqZXhjbF9zeW07Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGUtPm9mZnNldCA8IHN0YWJzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBleGNsX3N5bSA9IGNvbnRlbnRzICsgZS0+b2Zmc2V0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZS0+dmFsLCBleGNsX3N5bSArIFZBTE9GRik7Ci0gICAgICBleGNsX3N5bVtUWVBFT0ZGXSA9IGUtPnR5cGU7Ci0gICAgfQotCi0gIC8qIENvcHkgb3ZlciBhbGwgdGhlIHN0YWJzIHN5bWJvbHMsIG9taXR0aW5nIHRoZSBvbmVzIHdlIGRvbid0IHdhbnQsCi0gICAgIGFuZCBjb3JyZWN0aW5nIHRoZSBzdHJpbmcgaW5kaWNlcyBmb3IgdGhvc2Ugd2UgZG8gd2FudC4gICovCi0gIHRvc3ltID0gY29udGVudHM7Ci0gIHN5bWVuZCA9IGNvbnRlbnRzICsgc3RhYnNlYy0+X3Jhd19zaXplOwotICBmb3IgKHN5bSA9IGNvbnRlbnRzLCBwc3RyaWR4ID0gc2VjaW5mby0+c3RyaWR4czsKLSAgICAgICBzeW0gPCBzeW1lbmQ7Ci0gICAgICAgc3ltICs9IFNUQUJTSVpFLCArK3BzdHJpZHgpCi0gICAgewotICAgICAgaWYgKCpwc3RyaWR4ICE9IChiZmRfc2l6ZV90eXBlKSAtMSkKLQl7Ci0JICBpZiAodG9zeW0gIT0gc3ltKQotCSAgICBtZW1jcHkgKHRvc3ltLCBzeW0sIFNUQUJTSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsICpwc3RyaWR4LCB0b3N5bSArIFNUUkRYT0ZGKTsKLQotCSAgaWYgKHN5bVtUWVBFT0ZGXSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgaGVhZGVyIHN5bWJvbCBmb3IgdGhlIHN0YWJzIHNlY3Rpb24uICBXZQotICAgICAgICAgICAgICAgICBkb24ndCByZWFsbHkgbmVlZCBvbmUsIHNpbmNlIHdlIGhhdmUgbWVyZ2VkIGFsbCB0aGUKLSAgICAgICAgICAgICAgICAgaW5wdXQgc3RhYnMgc2VjdGlvbnMgaW50byBvbmUsIGJ1dCB3ZSBnZW5lcmF0ZSBvbmUKLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBiZW5lZml0IG9mIHJlYWRlcnMgd2hpY2ggZXhwZWN0IHRvIHNlZSBvbmUuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKHN5bSA9PSBjb250ZW50cyk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoc2luZm8tPnN0cmluZ3MpLAotCQkJICB0b3N5bSArIFZBTE9GRik7Ci0JICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwKLQkJCSAgc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSAvIFNUQUJTSVpFIC0gMSwKLQkJCSAgdG9zeW0gKyBERVNDT0ZGKTsKLQkgICAgfQotCi0JICB0b3N5bSArPSBTVEFCU0laRTsKLQl9Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSAodG9zeW0gLSBjb250ZW50cykgPT0gc3RhYnNlYy0+X2Nvb2tlZF9zaXplKTsKLQotICByZXR1cm4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBzdGFic2VjLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICBjb250ZW50cywgc3RhYnNlYy0+b3V0cHV0X29mZnNldCwKLQkJCQkgICBzdGFic2VjLT5fY29va2VkX3NpemUpOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAob3V0cHV0X2JmZCwgcHNpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotewotICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKLQotICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87Ci0KLSAgaWYgKHNpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc2VjdGlvbiB3YXMgZGlzY2FyZGVkIGZyb20gdGhlIGxpbmsuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChzaW5mby0+c3RhYnN0ci0+b3V0cHV0X29mZnNldAotCSAgICAgICArIF9iZmRfc3RyaW5ndGFiX3NpemUgKHNpbmZvLT5zdHJpbmdzKSkKLQkgICAgICA8PSBzaW5mby0+c3RhYnN0ci0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkoc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zCi0JCSArIHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfb2Zmc2V0KSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKG91dHB1dF9iZmQsIHNpbmZvLT5zdHJpbmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHN0YWJzIGluZm9ybWF0aW9uLiAgKi8KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoc2luZm8tPnN0cmluZ3MpOwotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmc2luZm8tPmluY2x1ZGVzLnJvb3QpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYW4gYWRkcmVzcyBpbiB0aGUgLnN0YWIgc2VjdGlvbi4gIEdpdmVuIE9GRlNFVCB3aXRoaW4KLSAgIFNUQUJTRUMsIHRoaXMgcmV0dXJucyB0aGUgbmV3IG9mZnNldCBpbiB0aGUgYWRqdXN0ZWQgc3RhYiBzZWN0aW9uLAotICAgb3IgLTEgaWYgdGhlIGFkZHJlc3MgcmVmZXJzIHRvIGEgc3RhYiB3aGljaCBoYXMgYmVlbiByZW1vdmVkLiAgKi8KLQotYmZkX3ZtYQotX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0IChvdXRwdXRfYmZkLCBwc2luZm8sIHN0YWJzZWMsIHBzZWNpbmZvLCBvZmZzZXQpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgKnBzaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgICAgUFRSICpwc2VjaW5mbzsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqc2VjaW5mbzsKLQotICBzZWNpbmZvID0gKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqKSAqcHNlY2luZm87Ci0KLSAgaWYgKHNlY2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm4gb2Zmc2V0OwotCi0gIGlmIChvZmZzZXQgPj0gc3RhYnNlYy0+X3Jhd19zaXplKQotICAgIHJldHVybiBvZmZzZXQgLSAoc3RhYnNlYy0+X2Nvb2tlZF9zaXplIC0gc3RhYnNlYy0+X3Jhd19zaXplKTsKLQotICBpZiAoc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGk7Ci0KLSAgICAgIGkgPSBvZmZzZXQgLyBTVEFCU0laRTsKLQotICAgICAgaWYgKHNlY2luZm8tPnN0cmlkeHMgW2ldID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlyZXR1cm4gKGJmZF92bWEpIC0xOwotCi0gICAgICByZXR1cm4gb2Zmc2V0IC0gc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyBbaV07Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQ7Ci19CmRpZmYgLS1naXQgYS9iZmQvc3RhbXAtaC5pbiBiL2JmZC9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2JmZC9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9iZmQvc3Vub3MuYyBiL2JmZC9zdW5vcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGE2ODU3Li4wMDAwMDAwCi0tLSBhL2JmZC9zdW5vcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk0OCArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgU3VuT1MgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtc3Vub3MtYmlnIgotI2RlZmluZSBNWShPUCkgQ0FUKHN1bm9zX2JpZ18sT1ApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0vKiBTdGF0aWMgcm91dGluZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc3Vub3NfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgbG9uZyBzdW5vc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN1bm9zX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKiosCi0JICAgYmZkX3NpemVfdHlwZSAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19zY2FuX3N0ZF9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgY29uc3Qgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19zY2FuX2V4dF9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgY29uc3Qgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19saW5rX2R5bmFtaWNfb2JqZWN0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqLAotCSAgIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBzdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2RlZmluZSBNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBzdW5vc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMgc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBzdW5vc19hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IHN1bm9zX2xpbmtfZHluYW1pY19vYmplY3QKLSNkZWZpbmUgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wgc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgTVlfY2hlY2tfZHluYW1pY19yZWxvYyBzdW5vc19jaGVja19keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluawotCi0vKiA/Pz8gV2hlcmUgc2hvdWxkIHRoaXMgZ28/ICAqLwotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgXAotICAoKChtdHlwZSkgPT0gTV9TUEFSQyAmJiBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX3NwYXJjLCAwKSAhPSBOVUxMKSBcCi0gICB8fCAoKG10eXBlKSA9PSBNX1NQQVJDTEVUIFwKLSAgICAgICAmJiBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCkgIT0gTlVMTCkgXAotICAgfHwgKChtdHlwZSkgPT0gTV9TUEFSQ0xJVEVfTEUgXAotICAgICAgICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0KSAhPSBOVUxMKSBcCi0gICB8fCAoKChtdHlwZSkgPT0gTV9VTktOT1dOIHx8IChtdHlwZSkgPT0gTV82ODAxMCB8fCAobXR5cGUpID09IE1fNjgwMjApIFwKLSAgICAgICAmJiBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX202OGssIDApICE9IE5VTEwpKQotCi0vKiBJbmNsdWRlIHRoZSB1c3VhbCBhLm91dCBzdXBwb3J0LiAgKi8KLSNpbmNsdWRlICJhb3V0ZjEuaCIKLQotLyogVGhlIFN1bk9TIDQuMS40IC91c3IvaW5jbHVkZS9sb2NhbGUuaCBkZWZpbmVzIHZhbGlkIGFzIGEgbWFjcm8uICAqLwotI3VuZGVmIHZhbGlkCi0KLS8qIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuICBXZSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUKLSAgIGluIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkuICAqLwotCi1zdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvCi17Ci0gIC8qIFdoZXRoZXIgd2UgZm91bmQgYW55IGR5bmFtaWMgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuIHZhbGlkOwotICAvKiBEeW5hbWljIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N1bjRfZHluYW1pY19saW5rIGR5bmluZm87Ci0gIC8qIE51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMuICAqLwotICB1bnNpZ25lZCBsb25nIGR5bnN5bV9jb3VudDsKLSAgLyogUmVhZCBpbiBubGlzdHMgZm9yIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZHluc3ltOwotICAvKiBhc3ltYm9sIHN0cnVjdHVyZXMgZm9yIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGFvdXRfc3ltYm9sX3R5cGUgKmNhbm9uaWNhbF9keW5zeW07Ci0gIC8qIFJlYWQgaW4gZHluYW1pYyBzdHJpbmcgdGFibGUuICAqLwotICBjaGFyICpkeW5zdHI7Ci0gIC8qIE51bWJlciBvZiBkeW5hbWljIHJlbG9jcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZHlucmVsX2NvdW50OwotICAvKiBSZWFkIGluIGR5bmFtaWMgcmVsb2NzLiAgVGhpcyBtYXkgYmUgcmVsb2Nfc3RkX2V4dGVybmFsIG9yCi0gICAgIHJlbG9jX2V4dF9leHRlcm5hbC4gICovCi0gIFBUUiBkeW5yZWw7Ci0gIC8qIGFyZWxlbnQgc3RydWN0dXJlcyBmb3IgZHluYW1pYyByZWxvY3MuICAqLwotICBhcmVsZW50ICpjYW5vbmljYWxfZHlucmVsOwotfTsKLQotLyogVGhlIGhhc2ggdGFibGUgb2YgZHluYW1pYyBzeW1ib2xzIGlzIGNvbXBvc2VkIG9mIHR3byB3b3JkIGVudHJpZXMuCi0gICBTZWUgaW5jbHVkZS9hb3V0L3N1bjQuaCBmb3IgZGV0YWlscy4gICovCi0KLSNkZWZpbmUgSEFTSF9FTlRSWV9TSVpFICgyICogQllURVNfSU5fV09SRCkKLQotLyogUmVhZCBpbiB0aGUgYmFzaWMgZHluYW1pYyBpbmZvcm1hdGlvbi4gIFRoaXMgbG9jYXRlcyB0aGUgX19EWU5BTUlDCi0gICBzdHJ1Y3R1cmUgYW5kIHVzZXMgaXQgdG8gZmluZCB0aGUgZHluYW1pY19saW5rIHN0cnVjdHVyZS4gIEl0Ci0gICBjcmVhdGVzIGFuZCBzYXZlcyBhIHN1bm9zX2R5bmFtaWNfaW5mbyBzdHJ1Y3R1cmUuICBJZiBpdCBjYW4ndCBmaW5kCi0gICBfX0RZTkFNSUMsIGl0IHNldHMgdGhlIHZhbGlkIGZpZWxkIG9mIHRoZSBzdW5vc19keW5hbWljX2luZm8KLSAgIHN0cnVjdHVyZSB0byBmYWxzZSB0byBhdm9pZCBkb2luZyB0aGlzIHdvcmsgYWdhaW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfcmVhZF9keW5hbWljX2luZm8gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLSAgYXNlY3Rpb24gKmR5bnNlYzsKLSAgYmZkX3ZtYSBkeW5vZmY7Ci0gIHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMgZHluaW5mbzsKLSAgdW5zaWduZWQgbG9uZyBkeW52ZXI7Ci0gIHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWNfbGluayBsaW5raW5mbzsKLQotICBpZiAob2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKSAhPSAoUFRSKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8gPSAoKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikKLQkgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbykpKTsKLSAgaWYgKCFpbmZvKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+dmFsaWQgPSBmYWxzZTsKLSAgaW5mby0+ZHluc3ltID0gTlVMTDsKLSAgaW5mby0+ZHluc3RyID0gTlVMTDsKLSAgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSA9IE5VTEw7Ci0gIGluZm8tPmR5bnJlbCA9IE5VTEw7Ci0gIGluZm8tPmNhbm9uaWNhbF9keW5yZWwgPSBOVUxMOwotICBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpID0gKFBUUikgaW5mbzsKLQotICAvKiBUaGlzIGNvZGUgdXNlZCB0byBsb29rIGZvciB0aGUgX19EWU5BTUlDIHN5bWJvbCB0byBsb2NhdGUgdGhlIGR5bmFtaWMKLSAgICAgbGlua2luZyBpbmZvcm1hdGlvbi4KLSAgICAgSG93ZXZlciB0aGlzIGluaGliaXRzIHJlY292ZXJpbmcgdGhlIGR5bmFtaWMgc3ltYm9scyBmcm9tIGEKLSAgICAgc3RyaXBwZWQgb2JqZWN0IGZpbGUsIHNvIGJsaW5kbHkgYXNzdW1lIHRoYXQgdGhlIGR5bmFtaWMgbGlua2luZwotICAgICBpbmZvcm1hdGlvbiBpcyBsb2NhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWN0aW9uLgotICAgICBXZSBjb3VsZCB2ZXJpZnkgdGhpcyBhc3N1bXB0aW9uIGxhdGVyIGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUgZHluYW1pYwotICAgICBzeW1ib2xzIGZvciB0aGUgX19EWU5BTUlDIHN5bWJvbC4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSwgKFBUUikgJmR5bmluZm8sCi0JCQkJICAoZmlsZV9wdHIpIDAsIHNpemVvZiBkeW5pbmZvKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW52ZXIgPSBHRVRfV09SRCAoYWJmZCwgZHluaW5mby5sZF92ZXJzaW9uKTsKLSAgaWYgKGR5bnZlciAhPSAyICYmIGR5bnZlciAhPSAzKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9mZiA9IEdFVF9XT1JEIChhYmZkLCBkeW5pbmZvLmxkKTsKLQotICAvKiBkeW5vZmYgaXMgYSB2aXJ0dWFsIGFkZHJlc3MuICBJdCBpcyBwcm9iYWJseSBhbHdheXMgaW4gdGhlIC5kYXRhCi0gICAgIHNlY3Rpb24sIGJ1dCB0aGlzIGNvZGUgc2hvdWxkIHdvcmsgZXZlbiBpZiBpdCBtb3Zlcy4gICovCi0gIGlmIChkeW5vZmYgPCBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKQotICAgIGR5bnNlYyA9IG9ial90ZXh0c2VjIChhYmZkKTsKLSAgZWxzZQotICAgIGR5bnNlYyA9IG9ial9kYXRhc2VjIChhYmZkKTsKLSAgZHlub2ZmIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGR5bnNlYyk7Ci0gIGlmIChkeW5vZmYgPiBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkeW5zZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoaXMgZXhlY3V0YWJsZSBhcHBlYXJzIHRvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZCBpbiBhIHdheSB0aGF0IHdlCi0gICAgIGNhbiB1bmRlcnN0YW5kLiAgKi8KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBkeW5zZWMsIChQVFIpICZsaW5raW5mbywgZHlub2ZmLAotCQkJCSAgKGJmZF9zaXplX3R5cGUpIHNpemVvZiBsaW5raW5mbykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU3dhcCBpbiB0aGUgZHluYW1pYyBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgaW5mby0+ZHluaW5mby5sZF9sb2FkZWQgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfbG9hZGVkKTsKLSAgaW5mby0+ZHluaW5mby5sZF9uZWVkID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX25lZWQpOwotICBpbmZvLT5keW5pbmZvLmxkX3J1bGVzID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3J1bGVzKTsKLSAgaW5mby0+ZHluaW5mby5sZF9nb3QgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfZ290KTsKLSAgaW5mby0+ZHluaW5mby5sZF9wbHQgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfcGx0KTsKLSAgaW5mby0+ZHluaW5mby5sZF9yZWwgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfcmVsKTsKLSAgaW5mby0+ZHluaW5mby5sZF9oYXNoID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX2hhc2gpOwotICBpbmZvLT5keW5pbmZvLmxkX3N0YWIgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfc3RhYik7Ci0gIGluZm8tPmR5bmluZm8ubGRfc3RhYl9oYXNoID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3N0YWJfaGFzaCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfYnVja2V0cyA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9idWNrZXRzKTsKLSAgaW5mby0+ZHluaW5mby5sZF9zeW1ib2xzID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3N5bWJvbHMpOwotICBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9zeW1iX3NpemUpOwotICBpbmZvLT5keW5pbmZvLmxkX3RleHQgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfdGV4dCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfcGx0X3N6ID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3BsdF9zeik7Ci0KLSAgLyogUmVwb3J0ZWRseSB0aGUgYWRkcmVzc2VzIG5lZWQgdG8gYmUgb2Zmc2V0IGJ5IHRoZSBzaXplIG9mIHRoZQotICAgICBleGVjIGhlYWRlciBpbiBhbiBOTUFHSUMgZmlsZS4gICovCi0gIGlmIChhZGF0YSAoYWJmZCkubWFnaWMgPT0gbl9tYWdpYykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGV4ZWNfYnl0ZXNfc2l6ZSA9IGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0KLSAgICAgIGluZm8tPmR5bmluZm8ubGRfbmVlZCArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgICBpbmZvLT5keW5pbmZvLmxkX3J1bGVzICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKLSAgICAgIGluZm8tPmR5bmluZm8ubGRfcmVsICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKLSAgICAgIGluZm8tPmR5bmluZm8ubGRfaGFzaCArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgICBpbmZvLT5keW5pbmZvLmxkX3N0YWIgKz0gZXhlY19ieXRlc19zaXplOwotICAgICAgaW5mby0+ZHluaW5mby5sZF9zeW1ib2xzICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKLSAgICB9Ci0KLSAgLyogVGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGluZm9ybWF0aW9uIGFwcGVhcnMgdG8KLSAgICAgYmUgdG8gZGV0ZXJtaW5lIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGl0IGFuZCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaW5mby0+ZHluc3ltX2NvdW50ID0gKChpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMgLSBpbmZvLT5keW5pbmZvLmxkX3N0YWIpCi0JCQkvIEVYVEVSTkFMX05MSVNUX1NJWkUpOwotICBCRkRfQVNTRVJUIChpbmZvLT5keW5zeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFCi0JICAgICAgPT0gKHVuc2lnbmVkIGxvbmcpIChpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMKLQkJCQkgIC0gaW5mby0+ZHluaW5mby5sZF9zdGFiKSk7Ci0KLSAgLyogU2ltaWxhcmx5LCB0aGUgcmVsb2NzIGVuZCBhdCB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGluZm8tPmR5bnJlbF9jb3VudCA9ICgoaW5mby0+ZHluaW5mby5sZF9oYXNoIC0gaW5mby0+ZHluaW5mby5sZF9yZWwpCi0JCQkvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gIEJGRF9BU1NFUlQgKGluZm8tPmR5bnJlbF9jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKQotCSAgICAgID09ICh1bnNpZ25lZCBsb25nKSAoaW5mby0+ZHluaW5mby5sZF9oYXNoCi0JCQkJICAtIGluZm8tPmR5bmluZm8ubGRfcmVsKSk7Ci0KLSAgaW5mby0+dmFsaWQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgZm9yIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgbG9uZwotc3Vub3NfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87Ci0KLSAgaWYgKCEgc3Vub3NfcmVhZF9keW5hbWljX2luZm8gKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBpbmZvID0gKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKTsKLSAgaWYgKCEgaW5mby0+dmFsaWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gKGluZm8tPmR5bnN5bV9jb3VudCArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0vKiBSZWFkIHRoZSBleHRlcm5hbCBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLQotICAvKiBHZXQgdGhlIGdlbmVyYWwgZHluYW1pYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgc3Vub3NfcmVhZF9keW5hbWljX2luZm8gKGFiZmQpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvID0gKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKTsKLSAgaWYgKCEgaW5mby0+dmFsaWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBHZXQgdGhlIGR5bmFtaWMgbmxpc3Qgc3RydWN0dXJlcy4gICovCi0gIGlmIChpbmZvLT5keW5zeW0gPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGluZm8tPmR5bnN5bSA9ICgoc3RydWN0IGV4dGVybmFsX25saXN0ICopCi0JCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgKGluZm8tPmR5bnN5bV9jb3VudAotCQkJCSAgKiBFWFRFUk5BTF9OTElTVF9TSVpFKSkpOwotICAgICAgaWYgKGluZm8tPmR5bnN5bSA9PSBOVUxMICYmIGluZm8tPmR5bnN5bV9jb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaW5mby0+ZHluaW5mby5sZF9zdGFiLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBpbmZvLT5keW5zeW0sIGluZm8tPmR5bnN5bV9jb3VudCwKLQkJCUVYVEVSTkFMX05MSVNUX1NJWkUsIGFiZmQpCi0JICAgICAgIT0gaW5mby0+ZHluc3ltX2NvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRSkpCi0JewotCSAgaWYgKGluZm8tPmR5bnN5bSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGluZm8tPmR5bnN5bSk7Ci0JICAgICAgaW5mby0+ZHluc3ltID0gTlVMTDsKLQkgICAgfQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBkeW5hbWljIHN0cmluZ3MuICAqLwotICBpZiAoaW5mby0+ZHluc3RyID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgaW5mby0+ZHluc3RyID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSk7Ci0gICAgICBpZiAoaW5mby0+ZHluc3RyID09IE5VTEwgJiYgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfc3ltYm9scywgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfcmVhZCAoKFBUUikgaW5mby0+ZHluc3RyLCAxLCBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSwKLQkJCWFiZmQpCi0JICAgICAgIT0gaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUpKQotCXsKLQkgIGlmIChpbmZvLT5keW5zdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpbmZvLT5keW5zdHIpOwotCSAgICAgIGluZm8tPmR5bnN0ciA9IE5VTEw7Ci0JICAgIH0KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgbG9uZwotc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIChhYmZkLCBzdG9yYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzdG9yYWdlOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotICB1bnNpZ25lZCBsb25nIGk7Ci0KLSAgaWYgKCEgc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBpbmZvID0gKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKTsKLQotI2lmZGVmIENIRUNLX0RZTkFNSUNfSEFTSAotICAvKiBDaGVjayBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBkeW5hbWljIGhhc2ggdGFibGUgYnkgbWFraW5nIHN1cmUKLSAgICAgdGhhdCBlYWNoIHN5bWJvbCBjYW4gYmUgbG9jYXRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHsKLSAgICBiZmRfc2l6ZV90eXBlIHRhYmxlX3NpemU7Ci0gICAgYmZkX2J5dGUgKnRhYmxlOwotICAgIGJmZF9zaXplX3R5cGUgaTsKLQotICAgIGlmIChpbmZvLT5keW5pbmZvLmxkX2J1Y2tldHMgPiBpbmZvLT5keW5zeW1fY291bnQpCi0gICAgICBhYm9ydCAoKTsKLSAgICB0YWJsZV9zaXplID0gaW5mby0+ZHluaW5mby5sZF9zdGFiIC0gaW5mby0+ZHluaW5mby5sZF9oYXNoOwotICAgIHRhYmxlID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHRhYmxlX3NpemUpOwotICAgIGlmICh0YWJsZSA9PSBOVUxMICYmIHRhYmxlX3NpemUgIT0gMCkKLSAgICAgIGFib3J0ICgpOwotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaW5mby0+ZHluaW5mby5sZF9oYXNoLCBTRUVLX1NFVCkgIT0gMAotCXx8IGJmZF9yZWFkICgoUFRSKSB0YWJsZSwgMSwgdGFibGVfc2l6ZSwgYWJmZCkgIT0gdGFibGVfc2l6ZSkKLSAgICAgIGFib3J0ICgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5keW5zeW1fY291bnQ7IGkrKykKLSAgICAgIHsKLQl1bnNpZ25lZCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGxvbmcgaGFzaDsKLQotCW5hbWUgPSAoKHVuc2lnbmVkIGNoYXIgKikgaW5mby0+ZHluc3RyCi0JCSsgR0VUX1dPUkQgKGFiZmQsIGluZm8tPmR5bnN5bVtpXS5lX3N0cngpKTsKLQloYXNoID0gMDsKLQl3aGlsZSAoKm5hbWUgIT0gJ1wwJykKLQkgIGhhc2ggPSAoaGFzaCA8PCAxKSArICpuYW1lKys7Ci0JaGFzaCAmPSAweDdmZmZmZmZmOwotCWhhc2ggJT0gaW5mby0+ZHluaW5mby5sZF9idWNrZXRzOwotCXdoaWxlIChHRVRfV09SRCAoYWJmZCwgdGFibGUgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFKSAhPSBpKQotCSAgewotCSAgICBoYXNoID0gR0VUX1dPUkQgKGFiZmQsCi0JCQkgICAgIHRhYmxlICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRSArIEJZVEVTX0lOX1dPUkQpOwotCSAgICBpZiAoaGFzaCA9PSAwIHx8IGhhc2ggPj0gdGFibGVfc2l6ZSAvIEhBU0hfRU5UUllfU0laRSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLSAgICBmcmVlICh0YWJsZSk7Ci0gIH0KLSNlbmRpZiAvKiBDSEVDS19EWU5BTUlDX0hBU0ggKi8KLQotICAvKiBHZXQgdGhlIGFzeW1ib2wgc3RydWN0dXJlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkeW5hbWljIG5saXN0Ci0gICAgIHN0cnVjdHVyZXMuICAqLwotICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnN5bSA9PSAoYW91dF9zeW1ib2xfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChpbmZvLT5keW5zeW1fY291bnQKLQkJCQkJICAgICogc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSkpKTsKLSAgICAgIGlmIChpbmZvLT5jYW5vbmljYWxfZHluc3ltID09IE5VTEwgJiYgaW5mby0+ZHluc3ltX2NvdW50ICE9IDApCi0JcmV0dXJuIC0xOwotCi0gICAgICBpZiAoISBhb3V0XzMyX3RyYW5zbGF0ZV9zeW1ib2xfdGFibGUgKGFiZmQsIGluZm8tPmNhbm9uaWNhbF9keW5zeW0sCi0JCQkJCSAgICBpbmZvLT5keW5zeW0sIGluZm8tPmR5bnN5bV9jb3VudCwKLQkJCQkJICAgIGluZm8tPmR5bnN0ciwKLQkJCQkJICAgIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplLAotCQkJCQkgICAgdHJ1ZSkpCi0JewotCSAgaWYgKGluZm8tPmNhbm9uaWNhbF9keW5zeW0gIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpbmZvLT5jYW5vbmljYWxfZHluc3ltKTsKLQkgICAgICBpbmZvLT5jYW5vbmljYWxfZHluc3ltID0gTlVMTDsKLQkgICAgfQotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgLyogUmV0dXJuIHBvaW50ZXJzIHRvIHRoZSBkeW5hbWljIGFzeW1ib2wgc3RydWN0dXJlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5keW5zeW1fY291bnQ7IGkrKykKLSAgICAqc3RvcmFnZSsrID0gKGFzeW1ib2wgKikgKGluZm8tPmNhbm9uaWNhbF9keW5zeW0gKyBpKTsKLSAgKnN0b3JhZ2UgPSBOVUxMOwotCi0gIHJldHVybiBpbmZvLT5keW5zeW1fY291bnQ7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLQotc3RhdGljIGxvbmcKLXN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87Ci0KLSAgaWYgKCEgc3Vub3NfcmVhZF9keW5hbWljX2luZm8gKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBpbmZvID0gKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKTsKLSAgaWYgKCEgaW5mby0+dmFsaWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gKGluZm8tPmR5bnJlbF9jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLXN0YXRpYyBsb25nCi1zdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgc3RvcmFnZSwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICoqc3RvcmFnZTsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci17Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLQotICAvKiBHZXQgdGhlIGdlbmVyYWwgZHluYW1pYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpID09IChQVFIpIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgc3Vub3NfcmVhZF9keW5hbWljX2luZm8gKGFiZmQpKQotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0gIGlmICghIGluZm8tPnZhbGlkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBkeW5hbWljIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGluZm8tPmR5bnJlbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluZm8tPmR5bnJlbCA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgICAoaW5mby0+ZHlucmVsX2NvdW50Ci0JCQkJICAgICAgICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKSk7Ci0gICAgICBpZiAoaW5mby0+ZHlucmVsID09IE5VTEwgJiYgaW5mby0+ZHlucmVsX2NvdW50ICE9IDApCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX3JlbCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfcmVhZCAoKFBUUikgaW5mby0+ZHlucmVsLCBpbmZvLT5keW5yZWxfY291bnQsCi0JCQlvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCksIGFiZmQpCi0JICAgICAgIT0gaW5mby0+ZHlucmVsX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKSkKLQl7Ci0JICBpZiAoaW5mby0+ZHlucmVsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaW5mby0+ZHlucmVsKTsKLQkgICAgICBpbmZvLT5keW5yZWwgPSBOVUxMOwotCSAgICB9Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICAvKiBHZXQgdGhlIGFyZWxlbnQgc3RydWN0dXJlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkeW5hbWljIHJlbG9jCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGluZm8tPmNhbm9uaWNhbF9keW5yZWwgPT0gKGFyZWxlbnQgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICp0bzsKLQotICAgICAgaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9ICgoYXJlbGVudCAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgKGluZm8tPmR5bnJlbF9jb3VudAotCQkJCQkgICAgKiBzaXplb2YgKGFyZWxlbnQpKSkpOwotICAgICAgaWYgKGluZm8tPmNhbm9uaWNhbF9keW5yZWwgPT0gTlVMTCAmJiBpbmZvLT5keW5yZWxfY291bnQgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICAKLSAgICAgIHRvID0gaW5mby0+Y2Fub25pY2FsX2R5bnJlbDsKLQotICAgICAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19FWFRfU0laRSkKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpwOwotCSAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcGVuZDsKLQotCSAgcCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIGluZm8tPmR5bnJlbDsKLQkgIHBlbmQgPSBwICsgaW5mby0+ZHlucmVsX2NvdW50OwotCSAgZm9yICg7IHAgPCBwZW5kOyBwKyssIHRvKyspCi0JICAgIE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHAsIHRvLCBzeW1zLAotCQkJCQkgIGluZm8tPmR5bnN5bV9jb3VudCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnA7Ci0JICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpwZW5kOwotCi0JICBwID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgaW5mby0+ZHlucmVsOwotCSAgcGVuZCA9IHAgKyBpbmZvLT5keW5yZWxfY291bnQ7Ci0JICBmb3IgKDsgcCA8IHBlbmQ7IHArKywgdG8rKykKLQkgICAgTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgcCwgdG8sIHN5bXMsCi0JCQkJCSAgaW5mby0+ZHluc3ltX2NvdW50KTsKLQl9Ci0gICAgfQotCi0gIC8qIFJldHVybiBwb2ludGVycyB0byB0aGUgZHluYW1pYyBhcmVsZW50IHN0cnVjdHVyZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+ZHlucmVsX2NvdW50OyBpKyspCi0gICAgKnN0b3JhZ2UrKyA9IGluZm8tPmNhbm9uaWNhbF9keW5yZWwgKyBpOwotICAqc3RvcmFnZSA9IE5VTEw7Ci0KLSAgcmV0dXJuIGluZm8tPmR5bnJlbF9jb3VudDsKLX0KLQwKLS8qIENvZGUgdG8gaGFuZGxlIGxpbmtpbmcgb2YgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIEEgU1BBUkMgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgaXMgMTIgYnl0ZXMuICBUaGUgZmlyc3QgZW50cnkKLSAgIGluIHRoZSB0YWJsZSBpcyBhIGp1bXAgd2hpY2ggaXMgZmlsbGVkIGluIGJ5IHRoZSBydW50aW1lIGxpbmtlci4KLSAgIFRoZSByZW1haW5pbmcgZW50cmllcyBhcmUgYnJhbmNoZXMgYmFjayB0byB0aGUgZmlyc3QgZW50cnksCi0gICBmb2xsb3dlZCBieSBhbiBpbmRleCBpbnRvIHRoZSByZWxvY2F0aW9uIHRhYmxlIGVuY29kZWQgdG8gbG9vayBsaWtlCi0gICBhIHNldGhpIG9mICVnMC4gICovCi0KLSNkZWZpbmUgU1BBUkNfUExUX0VOVFJZX1NJWkUgKDEyKQotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgc3BhcmNfcGx0X2ZpcnN0X2VudHJ5W1NQQVJDX1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIC8qIHNldGhpICVoaSgwKSwlZzE7IGFkZHJlc3MgZmlsbGVkIGluIGJ5IHJ1bnRpbWUgbGlua2VyLiAgKi8KLSAgMHgzLCAwLCAwLCAwLAotICAvKiBqbXAgJWcxOyBvZmZzZXQgZmlsbGVkIGluIGJ5IHJ1bnRpbWUgbGlua2VyLiAgKi8KLSAgMHg4MSwgMHhjMCwgMHg2MCwgMCwKLSAgLyogbm9wICovCi0gIDB4MSwgMCwgMCwgMAotfTsKLQotLyogc2F2ZSAlc3AsIC05NiwgJXNwICovCi0jZGVmaW5lIFNQQVJDX1BMVF9FTlRSWV9XT1JEMCAweDlkZTNiZmEwCi0vKiBjYWxsOyBhZGRyZXNzIGZpbGxlZCBpbiBsYXRlci4gICovCi0jZGVmaW5lIFNQQVJDX1BMVF9FTlRSWV9XT1JEMSAweDQwMDAwMDAwCi0vKiBzZXRoaTsgcmVsb2MgaW5kZXggZmlsbGVkIGluIGxhdGVyLiAgKi8KLSNkZWZpbmUgU1BBUkNfUExUX0VOVFJZX1dPUkQyIDB4MDEwMDAwMDAKLQotLyogVGhpcyBzZXF1ZW5jZSBpcyB1c2VkIHdoZW4gZm9yIHRoZSBqdW1wIHRhYmxlIGVudHJ5IHRvIGEgZGVmaW5lZAotICAgc3ltYm9sIGluIGEgY29tcGxldGUgZXhlY3V0YWJsZS4gIEl0IGlzIHVzZWQgd2hlbiBsaW5raW5nIFBJQwotICAgY29tcGlsZWQgY29kZSB3aGljaCBpcyBub3QgYmVpbmcgcHV0IGludG8gYSBzaGFyZWQgbGlicmFyeS4gICovCi0vKiBzZXRoaSA8YWRkcmVzcyB0byBiZSBmaWxsZWQgaW4gbGF0ZXI+LCAlZzEgKi8KLSNkZWZpbmUgU1BBUkNfUExUX1BJQ19XT1JEMCAweDAzMDAwMDAwCi0vKiBqbXAgJWcxICsgPGFkZHJlc3MgdG8gYmUgZmlsbGVkIGluIGxhdGVyPiAqLwotI2RlZmluZSBTUEFSQ19QTFRfUElDX1dPUkQxIDB4ODFjMDYwMDAKLS8qIG5vcCAqLwotI2RlZmluZSBTUEFSQ19QTFRfUElDX1dPUkQyIDB4MDEwMDAwMDAKLQotLyogQW4gbTY4ayBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBpcyA4IGJ5dGVzLiAgVGhlIGZpcnN0IGVudHJ5Ci0gICBpbiB0aGUgdGFibGUgaXMgYSBqdW1wIHdoaWNoIGlzIGZpbGxlZCBpbiB0aGUgYnkgdGhlIHJ1bnRpbWUKLSAgIGxpbmtlci4gIFRoZSByZW1haW5pbmcgZW50cmllcyBhcmUgYnJhbmNoZXMgYmFjayB0byB0aGUgZmlyc3QKLSAgIGVudHJ5LCBmb2xsb3dlZCBieSBhIHR3byBieXRlIGluZGV4IGludG8gdGhlIHJlbG9jYXRpb24gdGFibGUuICAqLwotCi0jZGVmaW5lIE02OEtfUExUX0VOVFJZX1NJWkUgKDgpCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBtNjhrX3BsdF9maXJzdF9lbnRyeVtNNjhLX1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIC8qIGptcHMgQCMgKi8KLSAgMHg0ZSwgMHhmOSwKLSAgLyogRmlsbGVkIGluIGJ5IHJ1bnRpbWUgbGlua2VyIHdpdGggYSBtYWdpYyBhZGRyZXNzLiAgKi8KLSAgMCwgMCwgMCwgMCwKLSAgLyogTm90IHVzZWQ/ICAqLwotICAwLCAwCi19OwotCi0vKiBic3JsICovCi0jZGVmaW5lIE02OEtfUExUX0VOVFJZX1dPUkQwICgweDYxZmYpCi0vKiBSZW1haW5pbmcgd29yZHMgZmlsbGVkIGluIGxhdGVyLiAgKi8KLQotLyogQW4gZW50cnkgaW4gdGhlIFN1bk9TIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBzeW1ib2wsIHRoaXMgaXMgaXRzIGluZGV4IGludG8gdGhlIGR5bmFtaWMKLSAgICAgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBpbml0aWFsaXplZCB0byAtMS4gIEFzIHRoZSBsaW5rZXIgbG9va3MgYXQKLSAgICAgdGhlIGlucHV0IGZpbGVzLCBpdCBjaGFuZ2VzIHRoaXMgdG8gLTIgaWYgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUKLSAgICAgZHluYW1pYyBzeW1ib2wgdGFibGUuICBBZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBzZWVuLAotICAgICB0aGUgbGlua2VyIHdpbGwga25vdyB3aGV0aGVyIHRvIGJ1aWxkIGEgZHluYW1pYyBzeW1ib2wgdGFibGU7IGlmCi0gICAgIGl0IGRvZXMgYnVpbGQgb25lLCB0aGlzIGJlY29tZXMgdGhlIGluZGV4IGludG8gdGhlIHRhYmxlLiAgKi8KLSAgbG9uZyBkeW5pbmR4OwotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIHN5bWJvbCwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIG5hbWUgaW4gdGhlCi0gICAgIGR5bmFtaWMgc3ltYm9sIHN0cmluZyB0YWJsZS4gICovCi0gIGxvbmcgZHluc3RyX2luZGV4OwotCi0gIC8qIFRoZSBvZmZzZXQgaW50byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB1c2VkIGZvciB0aGlzIHN5bWJvbC4gIElmCi0gICAgIHRoZSBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIEdPVCBlbnRyeSwgdGhpcyBpcyAwLiAgKi8KLSAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OwotCi0gIC8qIFRoZSBvZmZzZXQgaW50byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgdXNlZCBmb3IgdGhpcyBzeW1ib2wuCi0gICAgIElmIHRoZSBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIFBMVCBlbnRyeSwgdGhpcyBpcyAwLiAgKi8KLSAgYmZkX3ZtYSBwbHRfb2Zmc2V0OwotCi0gIC8qIFNvbWUgbGlua2VyIGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBmbGFnczsKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFNVTk9TX1JFRl9SRUdVTEFSIDAxCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBTVU5PU19ERUZfUkVHVUxBUiAwMgotICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSNkZWZpbmUgU1VOT1NfUkVGX0RZTkFNSUMgMDQKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIFNVTk9TX0RFRl9EWU5BTUlDIDAxMAotICAvKiBTeW1ib2wgaXMgYSBjb25zdHJ1Y3RvciBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFNVTk9TX0NPTlNUUlVDVE9SIDAyMAotfTsKLQotLyogVGhlIFN1bk9TIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgb2JqZWN0IHdoaWNoIGhvbGRzIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0KLSAgLyogV2hldGhlciB3ZSBoYXZlIGNyZWF0ZWQgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotICBib29sZWFuIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZDsKLQotICAvKiBXaGV0aGVyIHdlIG5lZWQgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotICBib29sZWFuIGR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkOwotCi0gIC8qIFdoZXRoZXIgd2UgbmVlZCB0aGUgLmdvdCB0YWJsZS4gICovCi0gIGJvb2xlYW4gZ290X25lZWRlZDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIHNpemVfdCBkeW5zeW1jb3VudDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICBzaXplX3QgYnVja2V0Y291bnQ7Ci0KLSAgLyogVGhlIGxpc3Qgb2YgZHluYW1pYyBvYmplY3RzIG5lZWRlZCBieSBkeW5hbWljIG9iamVjdHMgaW5jbHVkZWQgaW4KLSAgICAgdGhlIGxpbmsuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZDsKLQotICAvKiBUaGUgb2Zmc2V0IG9mIF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gaW50byB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgYmZkX3ZtYSBnb3RfYmFzZTsKLX07Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIFN1bk9TIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotc3Vub3NfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikKLQkgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5keW5pbmR4ID0gLTE7Ci0gICAgICByZXQtPmR5bnN0cl9pbmRleCA9IC0xOwotICAgICAgcmV0LT5nb3Rfb2Zmc2V0ID0gMDsKLSAgICAgIHJldC0+cGx0X29mZnNldCA9IDA7Ci0gICAgICByZXQtPmZsYWdzID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYSBTdW5PUyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICBpZiAoISBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpICgmcmV0LT5yb290LCBhYmZkLAotCQkJCQkgc3Vub3NfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmR5bm9iaiA9IE5VTEw7Ci0gIHJldC0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkID0gZmFsc2U7Ci0gIHJldC0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQgPSBmYWxzZTsKLSAgcmV0LT5nb3RfbmVlZGVkID0gZmFsc2U7Ci0gIHJldC0+ZHluc3ltY291bnQgPSAwOwotICByZXQtPmJ1Y2tldGNvdW50ID0gMDsKLSAgcmV0LT5uZWVkZWQgPSBOVUxMOwotICByZXQtPmdvdF9iYXNlID0gMDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIFN1bk9TIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3Vub3NfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgXAotICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAotCQkJICAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgU3VuT1MgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBzdW5vc19saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYW91dF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIFN1bk9TIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBzdW5vc19oYXNoX3RhYmxlKHApICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBDcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMgbmVlZGVkIGlmIHdlIGFyZSBsaW5raW5nIGFnYWluc3QgYQotICAgZHluYW1pYyBvYmplY3QsIG9yIGlmIHdlIGFyZSBsaW5raW5nIFBJQyBjb21waWxlZCBjb2RlLiAgQUJGRCBpcyBhCi0gICBiZmQgd2UgY2FuIGF0dGFjaCB0aGUgZHluYW1pYyBzZWN0aW9ucyB0by4gIFRoZSBsaW5rZXIgc2NyaXB0IHdpbGwKLSAgIGxvb2sgZm9yIHRoZXNlIHNwZWNpYWwgc2VjdGlvbnMgbmFtZXMgYW5kIHB1dCB0aGVtIGluIHRoZSByaWdodAotICAgcGxhY2UgaW4gdGhlIG91dHB1dCBmaWxlLiAgU2VlIGluY2x1ZGUvYW91dC9zdW40LmggZm9yIG1vcmUgZGV0YWlscwotICAgb2YgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywgbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuIG5lZWRlZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKCEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGFiZmQ7Ci0KLSAgICAgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gICAgICAvKiBUaGUgLmR5bmFtaWMgc2VjdGlvbiBob2xkcyB0aGUgYmFzaWMgZHluYW1pYyBpbmZvcm1hdGlvbjogdGhlCi0JIHN1bjRfZHluYW1pYyBzdHJ1Y3R1cmUsIHRoZSBkeW5hbWljIGRlYnVnZ2VyIGluZm9ybWF0aW9uLCBhbmQKLQkgdGhlIHN1bjRfZHluYW1pY19saW5rIHN0cnVjdHVyZS4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5hbWljIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5nb3Qgc2VjdGlvbiBob2xkcyB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFRoZSBhZGRyZXNzCi0JIGlzIHB1dCBpbiB0aGUgbGRfZ290IGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSAucGx0IHNlY3Rpb24gaG9sZHMgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgVGhlCi0JIGFkZHJlc3MgaXMgcHV0IGluIHRoZSBsZF9wbHQgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucGx0Iik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfQ09ERSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLmR5bnJlbCBzZWN0aW9uIGhvbGRzIHRoZSBkeW5hbWljIHJlbG9jcy4gIFRoZSBhZGRyZXNzIGlzCi0JIHB1dCBpbiB0aGUgbGRfcmVsIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnJlbCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSAuaGFzaCBzZWN0aW9uIGhvbGRzIHRoZSBkeW5hbWljIGhhc2ggdGFibGUuICBUaGUgYWRkcmVzcwotCSBpcyBwdXQgaW4gdGhlIGxkX2hhc2ggZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuaGFzaCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSAuZHluc3ltIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgc3ltYm9scy4gIFRoZSBhZGRyZXNzCi0JIGlzIHB1dCBpbiB0aGUgbGRfc3RhYiBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zeW0iKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLmR5bnN0ciBzZWN0aW9uIGhvbGRzIHRoZSBkeW5hbWljIHN5bWJvbCBzdHJpbmcgdGFibGUuCi0JIFRoZSBhZGRyZXNzIGlzIHB1dCBpbiB0aGUgbGRfc3ltYm9scyBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zdHIiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKChuZWVkZWQgJiYgISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQpCi0gICAgICB8fCBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYmZkICpkeW5vYmo7Ci0KLSAgICAgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IEJZVEVTX0lOX1dPUkQ7Ci0KLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCA9IHRydWU7Ci0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgZHluYW1pYyBzeW1ib2xzIGR1cmluZyBhIGxpbmsuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYS5vdXQKLSAgIGJhY2tlbmQgbGlua2VyIGZvciBlYWNoIG9iamVjdCBpdCBlbmNvdW50ZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMgKGFiZmQsIGluZm8sIHN5bXNwLCBzeW1fY291bnRwLCBzdHJpbmdzcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICoqc3ltc3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN5bV9jb3VudHA7Ci0gICAgIGNoYXIgKipzdHJpbmdzcDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICpkaW5mbzsKLSAgdW5zaWduZWQgbG9uZyBuZWVkOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCB0aGUgcmVxdWlyZWQgc2VjdGlvbnMuICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLAotCQkJCQkgICAoKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLQkJCQkJICAgICAmJiAhIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJCQkJICAgID8gdHJ1ZQotCQkJCQkgICAgOiBmYWxzZSkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIGRvIGZvciBhIG5vcm1hbCBvYmplY3QuICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIFdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgdGhlIHNlY3Rpb25zIGluIGEgZHluYW1pYyBvYmplY3QgaW4gdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgV2UgaGFjayBieSBzaW1wbHkgY2xvYmJlcmluZyB0aGUgbGlzdCBvZiBzZWN0aW9ucwotICAgICBpbiB0aGUgQkZELiAgVGhpcyBjb3VsZCBiZSBoYW5kbGVkIG1vcmUgY2xlYW5seSBieSwgc2F5LCBhIG5ldwotICAgICBzZWN0aW9uIGZsYWc7IHRoZSBleGlzdGluZyBTRUNfTkVWRVJfTE9BRCBmbGFnIGlzIG5vdCB0aGUgb25lIHdlCi0gICAgIHdhbnQsIGJlY2F1c2UgdGhhdCBvbmUgc3RpbGwgaW1wbGllcyB0aGF0IHRoZSBzZWN0aW9uIHRha2VzIHVwCi0gICAgIHNwYWNlIGluIHRoZSBvdXRwdXQgZmlsZS4gIElmIHRoaXMgaXMgdGhlIGZpcnN0IG9iamVjdCB3ZSBoYXZlCi0gICAgIHNlZW4sIHdlIG11c3QgcHJlc2VydmUgdGhlIGR5bmFtaWMgc2VjdGlvbnMgd2UganVzdCBjcmVhdGVkLiAgKi8KLSAgaWYgKGFiZmQgIT0gZHlub2JqKQotICAgIGFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsKLQkgICAocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDA7Ci0JICAgcyA9IHMtPm5leHQpCi0JOwotICAgICAgYWJmZC0+c2VjdGlvbnMgPSBzOwotICAgIH0KLQotICAvKiBUaGUgbmF0aXZlIGxpbmtlciBzZWVtcyB0byBqdXN0IGlnbm9yZSBkeW5hbWljIG9iamVjdHMgd2hlbiAtciBpcwotICAgICB1c2VkLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBUaGVyZSdzIG5vIGhvcGUgb2YgdXNpbmcgYSBkeW5hbWljIG9iamVjdCB3aGljaCBkb2VzIG5vdCBleGFjdGx5Ci0gICAgIG1hdGNoIHRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIC5uZWVkIGFuZCBhIC5ydWxlcyBzZWN0aW9ucy4gIFRoZXNlIGFyZSBvbmx5Ci0gICAgIG5lZWRlZCBpZiB0aGVyZSByZWFsbHkgaXMgYSBkeW5hbWljIG9iamVjdCBpbiB0aGUgbGluaywgc28gdGhleQotICAgICBhcmUgbm90IGFkZGVkIGJ5IHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIubmVlZCIpID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhlIC5uZWVkIHNlY3Rpb24gaG9sZHMgdGhlIGxpc3Qgb2YgbmFtZXMgb2Ygc2hhcmVkIG9iamV0cwotCSB3aGljaCBtdXN0IGJlIGluY2x1ZGVkIGF0IHJ1bnRpbWUuICBUaGUgYWRkcmVzcyBvZiB0aGlzCi0JIHNlY3Rpb24gaXMgcHV0IGluIHRoZSBsZF9uZWVkIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIubmVlZCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgcywKLQkJCQkgICAgICAoU0VDX0FMTE9DCi0JCQkJICAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5ydWxlcyIpID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhlIC5ydWxlcyBzZWN0aW9uIGhvbGRzIHRoZSBwYXRoIHRvIHNlYXJjaCBmb3Igc2hhcmVkCi0JIG9iamVjdHMuICBUaGUgYWRkcmVzcyBvZiB0aGlzIHNlY3Rpb24gaXMgcHV0IGluIHRoZSBsZF9ydWxlcwotCSBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJ1bGVzIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLAotCQkJCSAgICAgIChTRUNfQUxMT0MKLQkJCQkgICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgICAgIHwgU0VDX1JFQURPTkxZKSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFBpY2sgdXAgdGhlIGR5bmFtaWMgc3ltYm9scyBhbmQgcmV0dXJuIHRoZW0gdG8gdGhlIGNhbGxlci4gICovCi0gIGlmICghIHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotICAqc3ltc3AgPSBkaW5mby0+ZHluc3ltOwotICAqc3ltX2NvdW50cCA9IGRpbmZvLT5keW5zeW1fY291bnQ7Ci0gICpzdHJpbmdzcCA9IGRpbmZvLT5keW5zdHI7Ci0KLSAgLyogUmVjb3JkIGluZm9ybWF0aW9uIGFib3V0IGFueSBvdGhlciBvYmplY3RzIG5lZWRlZCBieSB0aGlzIG9uZS4gICovCi0gIG5lZWQgPSBkaW5mby0+ZHluaW5mby5sZF9uZWVkOwotICB3aGlsZSAobmVlZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGJ1ZlsxNl07Ci0gICAgICB1bnNpZ25lZCBsb25nIG5hbWUsIGZsYWdzOwotICAgICAgdW5zaWduZWQgc2hvcnQgbWFqb3Jfdm5vLCBtaW5vcl92bm87Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZCwgKipwcDsKLSAgICAgIGNoYXIgKm5hbWVidWYsICpwOwotICAgICAgc2l6ZV90IGFsYzsKLSAgICAgIGJmZF9ieXRlIGI7Ci0gICAgICBjaGFyICpuYW1lY29weTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBuZWVkLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3JlYWQgKGJ1ZiwgMSwgMTYsIGFiZmQpICE9IDE2KQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRm9yIHRoZSBmb3JtYXQgb2YgYW4gbGRfbmVlZCBlbnRyeSwgc2VlIGFvdXQvc3VuNC5oLiAgV2UKLSAgICAgICAgIHNob3VsZCBwcm9iYWJseSBkZWZpbmUgc3RydWN0cyBmb3IgdGhpcyBtYW5pcHVsYXRpb24uICAqLwotCi0gICAgICBuYW1lID0gYmZkX2dldF8zMiAoYWJmZCwgYnVmKTsKLSAgICAgIGZsYWdzID0gYmZkX2dldF8zMiAoYWJmZCwgYnVmICsgNCk7Ci0gICAgICBtYWpvcl92bm8gPSAodW5zaWduZWQgc2hvcnQpYmZkX2dldF8xNiAoYWJmZCwgYnVmICsgOCk7Ci0gICAgICBtaW5vcl92bm8gPSAodW5zaWduZWQgc2hvcnQpYmZkX2dldF8xNiAoYWJmZCwgYnVmICsgMTApOwotICAgICAgbmVlZCA9IGJmZF9nZXRfMzIgKGFiZmQsIGJ1ZiArIDEyKTsKLQotICAgICAgbmVlZGVkID0gKChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKikKLQkJYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCkpKTsKLSAgICAgIGlmIChuZWVkZWQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuZWVkZWQtPmJ5ID0gYWJmZDsKLQotICAgICAgLyogV2UgcmV0dXJuIHRoZSBuYW1lIGFzIFstbF1uYW1lWy5tYWpdWy5taW5dLiAgKi8KLSAgICAgIGFsYyA9IDMwOwotICAgICAgbmFtZWJ1ZiA9IChjaGFyICopIGJmZF9tYWxsb2MgKGFsYyArIDEpOwotICAgICAgaWYgKG5hbWVidWYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBwID0gbmFtZWJ1ZjsKLQotICAgICAgaWYgKChmbGFncyAmIDB4ODAwMDAwMDApICE9IDApCi0JewotCSAgKnArKyA9ICctJzsKLQkgICpwKysgPSAnbCc7Ci0JfQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBuYW1lLCBTRUVLX1NFVCkgIT0gMCkKLQl7Ci0JICBmcmVlIChuYW1lYnVmKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGRvCi0JewotCSAgaWYgKGJmZF9yZWFkICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQkgICAgewotCSAgICAgIGZyZWUgKG5hbWVidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoKHNpemVfdCkgKHAgLSBuYW1lYnVmKSA+PSBhbGMpCi0JICAgIHsKLQkgICAgICBjaGFyICpuOwotCi0JICAgICAgYWxjICo9IDI7Ci0JICAgICAgbiA9IChjaGFyICopIGJmZF9yZWFsbG9jIChuYW1lYnVmLCBhbGMgKyAxKTsKLQkgICAgICBpZiAobiA9PSBOVUxMKQotCQl7Ci0JCSAgZnJlZSAobmFtZWJ1Zik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgcCA9IG4gKyAocCAtIG5hbWVidWYpOwotCSAgICAgIG5hbWVidWYgPSBuOwotCSAgICB9Ci0KLQkgICpwKysgPSBiOwotCX0KLSAgICAgIHdoaWxlIChiICE9ICdcMCcpOwotCi0gICAgICBpZiAobWFqb3Jfdm5vID09IDApCi0JKnAgPSAnXDAnOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgbWFqYnVmWzMwXTsKLQkgIGNoYXIgbWluYnVmWzMwXTsKLQotCSAgc3ByaW50ZiAobWFqYnVmLCAiLiVkIiwgbWFqb3Jfdm5vKTsKLQkgIGlmIChtaW5vcl92bm8gPT0gMCkKLQkgICAgbWluYnVmWzBdID0gJ1wwJzsKLQkgIGVsc2UKLQkgICAgc3ByaW50ZiAobWluYnVmLCAiLiVkIiwgbWlub3Jfdm5vKTsKLQotCSAgaWYgKChwIC0gbmFtZWJ1ZikgKyBzdHJsZW4gKG1hamJ1ZikgKyBzdHJsZW4gKG1pbmJ1ZikgPj0gYWxjKQotCSAgICB7Ci0JICAgICAgY2hhciAqbjsKLQotCSAgICAgIGFsYyA9IChwIC0gbmFtZWJ1ZikgKyBzdHJsZW4gKG1hamJ1ZikgKyBzdHJsZW4gKG1pbmJ1Zik7Ci0JICAgICAgbiA9IChjaGFyICopIGJmZF9yZWFsbG9jIChuYW1lYnVmLCBhbGMgKyAxKTsKLQkgICAgICBpZiAobiA9PSBOVUxMKQotCQl7Ci0JCSAgZnJlZSAobmFtZWJ1Zik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgcCA9IG4gKyAocCAtIG5hbWVidWYpOwotCSAgICAgIG5hbWVidWYgPSBuOwotCSAgICB9Ci0KLQkgIHN0cmNweSAocCwgbWFqYnVmKTsKLQkgIHN0cmNhdCAocCwgbWluYnVmKTsKLQl9Ci0KLSAgICAgIG5hbWVjb3B5ID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWVidWYpICsgMSk7Ci0gICAgICBpZiAobmFtZWNvcHkgPT0gTlVMTCkKLQl7Ci0JICBmcmVlIChuYW1lYnVmKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBzdHJjcHkgKG5hbWVjb3B5LCBuYW1lYnVmKTsKLSAgICAgIGZyZWUgKG5hbWVidWYpOwotICAgICAgbmVlZGVkLT5uYW1lID0gbmFtZWNvcHk7Ci0KLSAgICAgIG5lZWRlZC0+bmV4dCA9IE5VTEw7Ci0KLSAgICAgIGZvciAocHAgPSAmc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPm5lZWRlZDsKLQkgICAqcHAgIT0gTlVMTDsKLQkgICBwcCA9ICYoKnBwKS0+bmV4dCkKLQk7Ci0gICAgICAqcHAgPSBuZWVkZWQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBhZGQgYSBzaW5nbGUgc3ltYm9sIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoaXMgaXMKLSAgIGEgd3JhcHBlciBhcm91bmQgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgd2hpY2ggaGFuZGxlcyB0aGUKLSAgIHR3ZWFraW5nIG5lZWRlZCBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLAotCQkgICAgICBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOwotICBpbnQgbmV3X2ZsYWc7Ci0KLSAgaWYgKChmbGFncyAmIChCU0ZfSU5ESVJFQ1QgfCBCU0ZfV0FSTklORyB8IEJTRl9DT05TVFJVQ1RPUikpICE9IDAKLSAgICAgIHx8ICEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICBoID0gc3Vub3NfbGlua19oYXNoX2xvb2t1cCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsIGNvcHksCi0JCQkJZmFsc2UpOwotICBlbHNlCi0gICAgaCA9ICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaGFzaHAgIT0gTlVMTCkKLSAgICAqaGFzaHAgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotICAvKiBUcmVhdCBhIGNvbW1vbiBzeW1ib2wgaW4gYSBkeW5hbWljIG9iamVjdCBhcyBkZWZpbmVkIGluIHRoZSAuYnNzCi0gICAgIHNlY3Rpb24gb2YgdGhlIGR5bmFtaWMgb2JqZWN0LiAgV2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBzcGFjZQotICAgICBmb3IgaXQgaW4gb3VyIHByb2Nlc3MgaW1hZ2UuICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0KLSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKQotICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9uZXcKLSAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgLyogV2UgYXJlIGRlZmluaW5nIHRoZSBzeW1ib2wsIGFuZCBpdCBpcyBhbHJlYWR5IGRlZmluZWQuICBUaGlzCi0JIGlzIGEgcG90ZW50aWFsIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3IuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JewotCSAgLyogVGhlIGRlZmluaXRpb24gd2UgYXJlIGFkZGluZyBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuCi0JICAgICBXZSBkbyBub3Qgd2FudCB0aGlzIG5ldyBkZWZpbml0aW9uIHRvIG92ZXJyaWRlIHRoZQotCSAgICAgZXhpc3RpbmcgZGVmaW5pdGlvbiwgc28gd2UgcHJldGVuZCBpdCBpcyBqdXN0IGEKLQkgICAgIHJlZmVyZW5jZS4gICovCi0JICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAgJiYgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICAgJiYgKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCXsKLQkgIC8qIFRoZSBleGlzdGluZyBkZWZpbml0aW9uIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4gIFdlCi0JICAgICB3YW50IHRvIG92ZXJyaWRlIGl0IHdpdGggdGhlIGRlZmluaXRpb24gd2UganVzdCBmb3VuZC4KLQkgICAgIENsb2JiZXIgdGhlIGV4aXN0aW5nIGRlZmluaXRpb24uICAqLwotCSAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAgJiYgKGgtPnJvb3Qucm9vdC51LmMucC0+c2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQl7Ci0JICAvKiBUaGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBXZQotCSAgICAgd2FudCB0byBvdmVycmlkZSBpdCB3aXRoIHRoZSBkZWZpbml0aW9uIHdlIGp1c3QgZm91bmQuCi0JICAgICBDbG9iYmVyIHRoZSBleGlzdGluZyBkZWZpbml0aW9uLiAgV2UgY2FuJ3Qgc2V0IGl0IHRvIG5ldywKLQkgICAgIGJlY2F1c2UgaXQgaXMgb24gdGhlIHVuZGVmaW5lZCBsaXN0LiAgKi8KLQkgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC5yb290LnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLQl9Ci0gICAgfQotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IKLSAgICAgICYmIChoLT5mbGFncyAmIFNVTk9TX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoZSBleGlzdGluZyBzeW1ib2wgaXMgYSBjb25zdHJ1Y3RvciBzeW1ib2wsIGFuZCB0aGlzIHN5bWJvbAotICAgICAgICAgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LiAgQSBjb25zdHJ1Y3RvciBzeW1ib2wgaXMgYWN0dWFsbHkgYQotICAgICAgICAgZGVmaW5pdGlvbiwgYWx0aG91Z2ggdGhlIHR5cGUgd2lsbCBiZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgICAgYXQgdGhpcyBwb2ludC4gIFdlIHdhbnQgdG8gaWdub3JlIHRoZSBkZWZpbml0aW9uIGZyb20gdGhlCi0gICAgICAgICBkeW5hbWljIG9iamVjdC4gICovCi0gICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICB9Ci0gIGVsc2UgaWYgKChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotCSAgICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDAKLQkgICAmJiBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAmJiBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgICYmIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgZXhpc3Rpbmcgc3ltYm9sIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYW5kIHRoaXMKLSAgICAgICAgIGlzIGEgY29uc3RydWN0b3Igc3ltYm9sLiAgQXMgYWJvdmUsIHdlIHdhbnQgdG8gZm9yY2UgdGhlIHVzZQotICAgICAgICAgb2YgdGhlIGNvbnN0cnVjdG9yIHN5bWJvbCBmcm9tIHRoZSByZWd1bGFyIG9iamVjdC4gICovCi0gICAgICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfbmV3OwotICAgIH0KLQotICAvKiBEbyB0aGUgdXN1YWwgcHJvY2VkdXJlIGZvciBhZGRpbmcgYSBzeW1ib2wuICAqLwotICBpZiAoISBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sCi0JCQkJCSAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLQkJCQkJICBoYXNocCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgLyogU2V0IGEgZmxhZyBpbiB0aGUgaGFzaCB0YWJsZSBlbnRyeSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mCi0JIHJlZmVyZW5jZSBvciBkZWZpbml0aW9uIHdlIGp1c3QgZm91bmQuICBLZWVwIGEgY291bnQgb2YgdGhlCi0JIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMgd2UgZmluZC4gIEEgZHluYW1pYyBzeW1ib2wgaXMgb25lCi0JIHdoaWNoIGlzIHJlZmVyZW5jZWQgb3IgZGVmaW5lZCBieSBib3RoIGEgcmVndWxhciBvYmplY3QgYW5kIGEKLQkgc2hhcmVkIG9iamVjdC4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLQl7Ci0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLQkgICAgbmV3X2ZsYWcgPSBTVU5PU19SRUZfUkVHVUxBUjsKLQkgIGVsc2UKLQkgICAgbmV3X2ZsYWcgPSBTVU5PU19ERUZfUkVHVUxBUjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0JICAgIG5ld19mbGFnID0gU1VOT1NfUkVGX0RZTkFNSUM7Ci0JICBlbHNlCi0JICAgIG5ld19mbGFnID0gU1VOT1NfREVGX0RZTkFNSUM7Ci0JfQotICAgICAgaC0+ZmxhZ3MgfD0gbmV3X2ZsYWc7Ci0KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xCi0JICAmJiAoaC0+ZmxhZ3MgJiAoU1VOT1NfREVGX1JFR1VMQVIgfCBTVU5PU19SRUZfUkVHVUxBUikpICE9IDApCi0JewotCSAgKytzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0JICBoLT5keW5pbmR4ID0gLTI7Ci0JfQotCi0gICAgICBpZiAoKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotCWgtPmZsYWdzIHw9IFNVTk9TX0NPTlNUUlVDVE9SOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBsaXN0IG9mIG9iamVjdHMgbmVlZGVkIGJ5IEJGRC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICoKLWJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotfQotCi0vKiBSZWNvcmQgYW4gYXNzaWdubWVudCBtYWRlIHRvIGEgc3ltYm9sIGJ5IGEgbGlua2VyIHNjcmlwdC4gIFdlIG5lZWQKLSAgIHRoaXMgaW4gY2FzZSBzb21lIGR5bmFtaWMgb2JqZWN0IHJlZmVycyB0byB0aGlzIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHdlIGhhdmUgZXhhbWluZWQgYWxsIHRoZSBpbnB1dCBvYmplY3RzLiAgSWYKLSAgICAgdGhlIHN5bWJvbCBkb2VzIG5vdCBleGlzdCwgaXQgbWVyZWx5IG1lYW5zIHRoYXQgbm8gb2JqZWN0IHJlZmVycwotICAgICB0byBpdCwgYW5kIHdlIGNhbiBqdXN0IGlnbm9yZSBpdCBhdCB0aGlzIHBvaW50LiAgKi8KLSAgaCA9IHN1bm9zX2xpbmtfaGFzaF9sb29rdXAgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLAotCQkJICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSW4gYSBzaGFyZWQgbGlicmFyeSwgdGhlIF9fRFlOQU1JQyBzeW1ib2wgZG9lcyBub3QgYXBwZWFyIGluIHRoZQotICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmICghIGluZm8tPnNoYXJlZCB8fCBzdHJjbXAgKG5hbWUsICJfX0RZTkFNSUMiKSAhPSAwKQotICAgIHsKLSAgICAgIGgtPmZsYWdzIHw9IFNVTk9TX0RFRl9SRUdVTEFSOwotCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQkgIGgtPmR5bmluZHggPSAtMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdXAgdGhlIHNpemVzIGFuZCBjb250ZW50cyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucyBjcmVhdGVkIGluCi0gICBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIFN1bk9TIGxpbmtlcgotICAgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZSBtdXN0IHNldCB0aGUgc2l6ZXMgb2YgdGhlCi0gICBzZWN0aW9ucyBiZWZvcmUgdGhlIGxpbmtlciBzZXRzIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHZhcmlvdXMKLSAgIHNlY3Rpb25zLiAgVGhpcyB1bmZvcnR1bmF0ZWx5IHJlcXVpcmVzIHJlYWRpbmcgYWxsIHRoZSByZWxvY3Mgc28KLSAgIHRoYXQgd2UgY2FuIHdvcmsgb3V0IHdoaWNoIG9uZXMgbmVlZCB0byBiZWNvbWUgZHluYW1pYyByZWxvY3MuICBJZgotICAgaW5mby0+a2VlcF9tZW1vcnkgaXMgdHJ1ZSwgd2Uga2VlcCB0aGUgcmVsb2NzIGluIG1lbW9yeTsgb3RoZXJ3aXNlLAotICAgd2UgZGlzY2FyZCB0aGVtLCBhbmQgd2lsbCByZWFkIHRoZW0gYWdhaW4gbGF0ZXIuICAqLwotCi1ib29sZWFuCi1iZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvLCBzZHlucHRyLCBzbmVlZHB0ciwKLQkJCQkgc3J1bGVzcHRyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqKnNkeW5wdHI7Ci0gICAgIGFzZWN0aW9uICoqc25lZWRwdHI7Ci0gICAgIGFzZWN0aW9uICoqc3J1bGVzcHRyOwotewotICBiZmQgKmR5bm9iajsKLSAgc2l6ZV90IGR5bnN5bWNvdW50OwotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOwotICBhc2VjdGlvbiAqczsKLSAgc2l6ZV90IGJ1Y2tldGNvdW50OwotICBzaXplX3QgaGFzaGFsbG9jOwotICBzaXplX3QgaTsKLSAgYmZkICpzdWI7Ci0KLSAgKnNkeW5wdHIgPSBOVUxMOwotICAqc25lZWRwdHIgPSBOVUxMOwotICAqc3J1bGVzcHRyID0gTlVMTDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIGlucHV0IEJGRCdzIGFuZCByZWFkIHRoZWlyIHJlbG9jcy4gIEl0IHdvdWxkCi0gICAgIGJlIGJldHRlciBpZiB3ZSBkaWRuJ3QgaGF2ZSB0byBkbyB0aGlzLCBidXQgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Ci0gICAgIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgcmVsb2NzIHdlIG5lZWQsIGFuZCwgbW9yZQotICAgICBpbXBvcnRhbnRseSwgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIGtub3cgd2hpY2ggc3ltYm9scyBzaG91bGQKLSAgICAgZ2V0IGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGlmICgoc3ViLT5mbGFncyAmIERZTkFNSUMpID09IDAKLQkgICYmIHN1Yi0+eHZlYyA9PSBvdXRwdXRfYmZkLT54dmVjKQotCXsKLQkgIGlmICghIHN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBzdWIsIG9ial90ZXh0c2VjIChzdWIpLAotCQkJCSAgIGV4ZWNfaGRyIChzdWIpLT5hX3Ryc2l6ZSkKLQkgICAgICB8fCAhIHN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBzdWIsIG9ial9kYXRhc2VjIChzdWIpLAotCQkJCSAgICAgIGV4ZWNfaGRyIChzdWIpLT5hX2Ryc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGR5bnN5bWNvdW50ID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gIC8qIElmIHRoZXJlIHdlcmUgbm8gZHluYW1pYyBvYmplY3RzIGluIHRoZSBsaW5rLCBhbmQgd2UgZG9uJ3QgbmVlZAotICAgICB0byBidWlsZCBhIGdsb2JhbCBvZmZzZXQgdGFibGUsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZS4gICovCi0gIGlmICghIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZAotICAgICAgJiYgISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiBfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHdhcyBtZW50aW9uZWQsIGRlZmluZSBpdC4gICovCi0gIGggPSBzdW5vc19saW5rX2hhc2hfbG9va3VwIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gIGlmIChoICE9IE5VTEwgJiYgKGgtPmZsYWdzICYgU1VOT1NfUkVGX1JFR1VMQVIpICE9IDApCi0gICAgewotICAgICAgaC0+ZmxhZ3MgfD0gU1VOT1NfREVGX1JFR1VMQVI7Ci0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQkgIGgtPmR5bmluZHggPSAtMjsKLQl9Ci0gICAgICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgICAgIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQotICAgICAgLyogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlIHRoYW4gMHgxMDAwIGJ5dGVzLCB3ZSBzZXQKLSAgICAgICAgIF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gdG8gYmUgMHgxMDAwIGJ5dGVzIGludG8gdGhlIHNlY3Rpb24sCi0gICAgICAgICBzbyB0aGF0IDEzIGJpdCByZWxvY2F0aW9ucyBoYXZlIGEgZ3JlYXRlciBjaGFuY2Ugb2Ygd29ya2luZy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplID49IDB4MTAwMCkKLQloLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSAweDEwMDA7Ci0gICAgICBlbHNlCi0JaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlID0gMDsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9iYXNlID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBhcmUgYW55IHNoYXJlZCBvYmplY3RzIGluIHRoZSBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gc2V0Ci0gICAgIHVwIHRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotICBpZiAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkKQotICAgIHsKLSAgICAgICpzZHlucHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgICAgIC8qIFRoZSAuZHluYW1pYyBzZWN0aW9uIGlzIGFsd2F5cyB0aGUgc2FtZSBzaXplLiAgKi8KLSAgICAgIHMgPSAqc2R5bnB0cjsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSAoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljKQotCQkgICAgICArIEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFCi0JCSAgICAgICsgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmspKTsKLQotICAgICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAuZHluc3ltIGFuZCAuaGFzaCBzZWN0aW9ucy4gIFdlIGNvdW50ZWQKLQkgdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMgYXMgd2UgcmVhZCB0aGUgaW5wdXQgZmlsZXMuICBXZQotCSB3aWxsIGJ1aWxkIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSAoLmR5bnN5bSkgYW5kIHRoZSBoYXNoCi0JIHRhYmxlICguaGFzaCkgd2hlbiB3ZSBidWlsZCB0aGUgZmluYWwgc3ltYm9sIHRhYmxlLCBiZWNhdXNlCi0JIHVudGlsIHRoZW4gd2UgZG8gbm90IGtub3cgdGhlIGNvcnJlY3QgdmFsdWUgdG8gZ2l2ZSB0aGUKLQkgc3ltYm9scy4gIFdlIGJ1aWxkIHRoZSBkeW5hbWljIHN5bWJvbCBzdHJpbmcgdGFibGUgKC5keW5zdHIpCi0JIGluIGEgdHJhdmVyc2FsIG9mIHRoZSBzeW1ib2wgdGFibGUgdXNpbmcKLQkgc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGlzIGp1c3QgdGhlIG51bWJlciBvZiBzeW1ib2xzIGRpdmlkZWQKLQkgYnkgZm91ci4gIFRvIGNvbXB1dGUgdGhlIGZpbmFsIHNpemUgb2YgdGhlIGhhc2ggdGFibGUsIHdlCi0JIG11c3QgYWN0dWFsbHkgY29tcHV0ZSB0aGUgaGFzaCB0YWJsZS4gIE5vcm1hbGx5IHdlIG5lZWQKLQkgZXhhY3RseSBhcyBtYW55IGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUgYXMgdGhlcmUgYXJlCi0JIGR5bmFtaWMgc3ltYm9scywgYnV0IGlmIHNvbWUgb2YgdGhlIGJ1Y2tldHMgYXJlIG5vdCB1c2VkIHdlCi0JIHdpbGwgbmVlZCBhZGRpdGlvbmFsIGVudHJpZXMuICBJbiB0aGUgd29yc3QgY2FzZSwgZXZlcnkKLQkgc3ltYm9sIHdpbGwgaGFzaCB0byB0aGUgc2FtZSBidWNrZXQsIGFuZCB3ZSB3aWxsIG5lZWQKLQkgQlVDS0VUQ09VTlQgLSAxIGV4dHJhIGVudHJpZXMuICAqLwotICAgICAgaWYgKGR5bnN5bWNvdW50ID49IDQpCi0JYnVja2V0Y291bnQgPSBkeW5zeW1jb3VudCAvIDQ7Ci0gICAgICBlbHNlIGlmIChkeW5zeW1jb3VudCA+IDApCi0JYnVja2V0Y291bnQgPSBkeW5zeW1jb3VudDsKLSAgICAgIGVsc2UKLQlidWNrZXRjb3VudCA9IDE7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5oYXNoIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgaGFzaGFsbG9jID0gKGR5bnN5bWNvdW50ICsgYnVja2V0Y291bnQgLSAxKSAqIEhBU0hfRU5UUllfU0laRTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBoYXNoYWxsb2MpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgZHluc3ltY291bnQgPiAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIGhhc2hhbGxvYyk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYnVja2V0Y291bnQ7IGkrKykKLQlQVVRfV09SRCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIC0xLCBzLT5jb250ZW50cyArIGkgKiBIQVNIX0VOVFJZX1NJWkUpOwotICAgICAgcy0+X3Jhd19zaXplID0gYnVja2V0Y291bnQgKiBIQVNIX0VOVFJZX1NJWkU7Ci0KLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudCA9IGJ1Y2tldGNvdW50OwotCi0gICAgICAvKiBTY2FuIGFsbCB0aGUgc3ltYm9scywgcGxhY2UgdGhlbSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsCi0JIGFuZCBidWlsZCB0aGUgZHluYW1pYyBoYXNoIHRhYmxlLiAgV2UgcmV1c2UgZHluc3ltY291bnQgYXMgYQotCSBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgd2UgaGF2ZSBhZGRlZCBzbyBmYXIuICAqLwotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID0gMDsKLSAgICAgIHN1bm9zX2xpbmtfaGFzaF90cmF2ZXJzZSAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCwKLQkJCQkoUFRSKSBpbmZvKTsKLSAgICAgIEJGRF9BU1NFUlQgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9PSBkeW5zeW1jb3VudCk7Ci0KLSAgICAgIC8qIFRoZSBTdW5PUyBuYXRpdmUgbGlua2VyIHNlZW1zIHRvIGFsaWduIHRoZSB0b3RhbCBzaXplIG9mIHRoZQotCSBzeW1ib2wgc3RyaW5ncyB0byBhIG11bHRpcGxlIG9mIDguICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotCSBpbXBvcnRhbnQsIGJ1dCBpdCBjYW4ndCBodXJ0IG11Y2guICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3RyIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgaWYgKChzLT5fcmF3X3NpemUgJiA3KSAhPSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgYWRkOwotCSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCi0JICBhZGQgPSA4IC0gKHMtPl9yYXdfc2l6ZSAmIDcpOwotCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKHMtPmNvbnRlbnRzLAotCQkJCQkgICAgICAgKHNpemVfdCkgKHMtPl9yYXdfc2l6ZSArIGFkZCkpOwotCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG1lbXNldCAoY29udGVudHMgKyBzLT5fcmF3X3NpemUsIDAsIChzaXplX3QpIGFkZCk7Ci0JICBzLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgcy0+X3Jhd19zaXplICs9IGFkZDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgd29ya2VkIG91dCB0aGUgc2l6ZXMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlCi0gICAgIHRhYmxlIGFuZCB0aGUgZHluYW1pYyByZWxvY3MsIGFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZW0uICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUuICAqLwotICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGR5bm9iaikpCi0JewotCWNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0JICBtZW1jcHkgKHMtPmNvbnRlbnRzLCBzcGFyY19wbHRfZmlyc3RfZW50cnksIFNQQVJDX1BMVF9FTlRSWV9TSVpFKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfYXJjaF9tNjhrOgotCSAgbWVtY3B5IChzLT5jb250ZW50cywgbTY4a19wbHRfZmlyc3RfZW50cnksIE02OEtfUExUX0VOVFJZX1NJWkUpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLSAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IG9mIHRoZQotICAgICByZWxvY3Mgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgcy0+cmVsb2NfY291bnQgPSAwOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnNuZWVkcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIik7Ci0gICpzcnVsZXNwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJ1bGVzIik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLCByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgUFRSIHJlbG9jczsKLSAgUFRSIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotICBpZiAocmVsX3NpemUgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICByZWxvY3MgPSBmcmVlX3JlbG9jcyA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9zaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKm47Ci0KLSAgICAgIG4gPSAoKHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKLQkgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCkpKTsKLSAgICAgIGlmIChuID09IE5VTEwpCi0JcmVsb2NzID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzZXRfYW91dF9zZWN0aW9uX2RhdGEgKHNlYywgbik7Ci0JICByZWxvY3MgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxfc2l6ZSk7Ci0JICBhb3V0X3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gcmVsb2NzOwotCX0KLSAgICB9Ci0gIGlmIChyZWxvY3MgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKHJlbG9jcywgMSwgcmVsX3NpemUsIGFiZmQpICE9IHJlbF9zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0gICAgewotICAgICAgaWYgKCEgc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsCi0JCQkJICAgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzLAotCQkJCSAgIHJlbF9zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19zY2FuX2V4dF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywKLQkJCQkgICAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvY3MsCi0JCQkJICAgcmVsX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTY2FuIHRoZSByZWxvY3MgZm9yIGFuIGlucHV0IHNlY3Rpb24gdXNpbmcgc3RhbmRhcmQgcmVsb2NzLiAgV2UKLSAgIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvIGZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBkeW5hbWljCi0gICBzeW1ib2wuICBJZiB0aGUgc3ltYm9sIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLCBhbiBlbnRyeSBpcyBtYWRlIGluCi0gICB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGRvIHRoZSB3cm9uZwotICAgdGhpbmcgaWYgdGhlIHN5bWJvbCBpcyBhY3R1YWxseSBkYXRhOyBJIGRvbid0IHRoaW5rIHRoZSBTdW4gMwotICAgbmF0aXZlIGxpbmtlciBoYW5kbGVzIHRoaXMgY2FzZSBjb3JyZWN0bHkgZWl0aGVyLiAgSWYgdGhlIHN5bWJvbCBpcwotICAgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLCB3ZSBtdXN0IHByZXNlcnZlIHRoZSByZWxvYyBhcyBhIGR5bmFtaWMKLSAgIHJlbG9jLiAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGhhbmRsZSB0aGUgUElDIHJlbG9jcyBoZXJlIGJ5Ci0gICBidWlsZGluZyBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbG9jcywgcmVsX3NpemUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3Qgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNwbHQgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbCA9IE5VTEw7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBjb25zdCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWwsICpyZWxlbmQ7Ci0KLSAgLyogV2Ugb25seSBrbm93IGhvdyB0byBoYW5kbGUgbTY4ayBwbHQgZW50cmllcy4gICovCi0gIGlmIChiZmRfZ2V0X2FyY2ggKGFiZmQpICE9IGJmZF9hcmNoX202OGspCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZHlub2JqID0gTlVMTDsKLQotICBzeW1faGFzaGVzID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKiopIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHJlbF9zaXplIC8gUkVMT0NfU1REX1NJWkU7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX2luZGV4OwotICAgICAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogV2Ugb25seSB3YW50IHJlbG9jcyBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgaWYgKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpID09IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkgPT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLQlyX2luZGV4ID0gKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0gICAgICBlbHNlCi0Jcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgfCByZWwtPnJfaW5kZXhbMF0pOwotCi0gICAgICAvKiBHZXQgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBoYXBwZW4sIGJ1dCBpdCB3aWxsIGluIGFueSBjYXNlCi0JICAgICBiZSBjYXVnaHQgaW4gdGhlIHJlbG9jYXRpb24gcGhhc2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBdCB0aGlzIHBvaW50IGNvbW1vbiBzeW1ib2xzIGhhdmUgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgc28KLQkgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGVtLiAgV2UgbmVlZCB0byBjb25zaWRlciB0aGF0Ci0JIHdlIG1heSBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIHN5bWJvbCBhbmQgbWFya2VkIGl0IHVuZGVmaW5lZDsKLQkgaWYgdGhlIHN5bWJvbCBpcyByZWFsbHkgdW5kZWZpbmVkLCB0aGVuIFNVTk9TX0RFRl9EWU5BTUlDCi0JIHdpbGwgYmUgemVyby4gICovCi0gICAgICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKLQkgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNnb3Q7Ci0KLQkgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBmYWxzZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0JICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCSAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLQkgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPT0gMCkKLQkgICAgc2dvdC0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKLQkgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKChoLT5mbGFncyAmIFNVTk9TX1JFRl9SRUdVTEFSKSAhPSAwKTsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPnBsdF9vZmZzZXQgIT0gMAotCQkgIHx8ICgoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICAgID8gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAmIERZTkFNSUMpICE9IDAKLQkJICAgICAgOiAoaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKSk7Ci0KLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIG9ubHkgYnkgYSBkeW5hbWljCi0JIG9iamVjdC4gICovCi0KLSAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICAvKiBQcmVzdW1hYmx5IHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgYXMgYmVpbmcgdW5kZWZpbmVkIGJ5Ci0JICAgICBhbiBlYXJsaWVyIHJlbG9jLiAgKi8KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19TVERfU0laRTsKLQl9Ci0gICAgICBlbHNlIGlmICgoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0JewotCSAgYmZkICpzdWI7Ci0KLQkgIC8qIFRoaXMgcmVsb2MgaXMgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLiAgSXQgbXVzdCBiZQotCSAgICAgY29waWVkIGludG8gdGhlIGR5bmFtaWMgcmVsb2NzLiAgV2UgbWFyayB0aGUgc3ltYm9sIGFzCi0JICAgICBiZWluZyB1bmRlZmluZWQuICAqLwotCSAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX1NURF9TSVpFOwotCSAgc3ViID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBzdWI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgV2UgbXVzdCBnaXZlIGl0IGFuCi0JICAgICBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGlmIHdlIGhhdmUgbm90Ci0JICAgICBhbHJlYWR5IGRvbmUgc28uICBXZSBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgdGhlIHN5bWJvbAotCSAgICAgdG8gdGhlIC5wbHQgc2VjdGlvbjsgdGhpcyB3aWxsIGNhdXNlIHJlbG9jcyBhZ2FpbnN0IGl0IHRvCi0JICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0JICBpZiAoaC0+cGx0X29mZnNldCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA9PSAwKQotCQlzcGx0LT5fcmF3X3NpemUgPSBNNjhLX1BMVF9FTlRSWV9TSVpFOwotCSAgICAgIGgtPnBsdF9vZmZzZXQgPSBzcGx0LT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXsKLQkJICBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9IHNwbHQ7Ci0JCSAgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlID0gc3BsdC0+X3Jhd19zaXplOwotCQl9Ci0KLQkgICAgICBzcGx0LT5fcmF3X3NpemUgKz0gTTY4S19QTFRfRU5UUllfU0laRTsKLQotCSAgICAgIC8qIFdlIG1heSBhbHNvIG5lZWQgYSBkeW5hbWljIHJlbG9jIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19TVERfU0laRTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbiB1c2luZyBleHRlbmRlZCByZWxvY3MuICBXZQotICAgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGR5bmFtaWMKLSAgIHN5bWJvbC4gIElmIHRoZSByZWxvYyBpcyBhIFdESVNQMzAsIGFuZCB0aGUgc3ltYm9sIGlzIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiwgYW4gZW50cnkgaXMgbWFkZSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICBPdGhlcndpc2UsIHdlIG11c3QgcHJlc2VydmUgdGhlIHJlbG9jIGFzIGEgZHluYW1pYyByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX2V4dF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywgcmVsb2NzLCByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWxvY3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgY29uc3Qgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsLCAqcmVsZW5kOwotICBhc2VjdGlvbiAqc3BsdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzZ290ID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNyZWwgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkga25vdyBob3cgdG8gaGFuZGxlIFNQQVJDIHBsdCBlbnRyaWVzLiAgKi8KLSAgaWYgKGJmZF9nZXRfYXJjaCAoYWJmZCkgIT0gYmZkX2FyY2hfc3BhcmMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZHlub2JqID0gTlVMTDsKLQotICBzeW1faGFzaGVzID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKiopIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHJlbF9zaXplIC8gUkVMT0NfRVhUX1NJWkU7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCByX2luZGV4OwotICAgICAgaW50IHJfZXh0ZXJuOwotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotCi0gICAgICAvKiBTd2FwIGluIHRoZSByZWxvYyBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLQl7Ci0JICByX2luZGV4ID0gKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCSAgICAgfCByZWwtPnJfaW5kZXhbMl0pOwotCSAgcl9leHRlcm4gPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHKSk7Ci0JICByX3R5cGUgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCi0JCSAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfaW5kZXggPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkJICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICB8IHJlbC0+cl9pbmRleFswXSk7Ci0JICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLQkgIHJfdHlwZSA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRSkKLQkJICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLQl9Ci0KLSAgICAgIGlmIChyX2V4dGVybikKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuLCBidXQgaXQgd2lsbCBpbiBhbnkKLQkJIGNhc2UgYmUgY2F1Z2h0IGluIHRoZSByZWxvY2F0aW9uIHBoYXNlLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhIGJhc2UgcmVsYXRpdmUgcmVsb2MsIHdlIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbgotICAgICAgICAgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gICAgICBpZiAocl90eXBlID09IFJFTE9DX0JBU0UxMAotCSAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCSAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKLQl7Ci0JICBpZiAoZHlub2JqID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywgZmFsc2UpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBpbml0aWFsIGVudHJ5IGluIHRoZSAuZ290IHRhYmxlLiAgKi8KLQkgICAgICBpZiAoc2dvdC0+X3Jhd19zaXplID09IDApCi0JCXNnb3QtPl9yYXdfc2l6ZSA9IEJZVEVTX0lOX1dPUkQ7Ci0JICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQgPSB0cnVlOwotCSAgICB9Ci0KLQkgIGlmIChyX2V4dGVybikKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Rfb2Zmc2V0ICE9IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaC0+Z290X29mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHJfaW5kZXggPj0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFibm9ybWFsLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiB0aGUKLQkJICAgICByZWxvY2F0aW9uIHBoYXNlLiAgKi8KLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaWYgKGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQl7Ci0JCSAgYWRhdGEgKGFiZmQpLmxvY2FsX2dvdF9vZmZzZXRzID0KLQkJICAgIChiZmRfdm1hICopIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJCSAgICAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkKLQkJCQkJICAgICAqIHNpemVvZiAoYmZkX3ZtYSkpKTsKLQkJICBpZiAoYWRhdGEgKGFiZmQpLmxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIGlmIChhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHNbcl9pbmRleF0gIT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHNbcl9pbmRleF0gPSBzZ290LT5fcmF3X3NpemU7Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IEJZVEVTX0lOX1dPUkQ7Ci0KLQkgIC8qIElmIHdlIGFyZSBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSwgb3IgaWYgdGhlIHN5bWJvbCBpcwotCSAgICAgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCB3ZSB3aWxsIG5lZWQgYSBkeW5hbWljIHJlbG9jCi0JICAgICBlbnRyeS4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgfHwgKGggIT0gTlVMTAotCQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApKQotCSAgICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMKLSAgICAgICAgIGRlZmluZWQgaW4gZHluYW1pYyBvYmplY3RzIGJ1dCBub3QgaW4gcmVndWxhciBvYmplY3RzLiAgV2UKLSAgICAgICAgIG9ubHkgbmVlZCB0byBjb25zaWRlciByZWxvY3MgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghIHJfZXh0ZXJuKQotCXsKLQkgIC8qIEJ1dCwgaWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICBnZW5lcmF0ZSBhbiBhYnNvbHV0ZSByZWxvYy4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sIHRydWUpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0JCSAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JCSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0JCSAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCQl9Ci0KLQkgICAgICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBdCB0aGlzIHBvaW50IGNvbW1vbiBzeW1ib2xzIGhhdmUgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgc28KLQkgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGVtLiAgV2UgbmVlZCB0byBjb25zaWRlciB0aGF0Ci0JIHdlIG1heSBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIHN5bWJvbCBhbmQgbWFya2VkIGl0IHVuZGVmaW5lZDsKLQkgaWYgdGhlIHN5bWJvbCBpcyByZWFsbHkgdW5kZWZpbmVkLCB0aGVuIFNVTk9TX0RFRl9EWU5BTUlDCi0JIHdpbGwgYmUgemVyby4gICovCi0gICAgICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAocl90eXBlICE9IFJFTE9DX0pNUF9UQkwKLQkgICYmICEgaW5mby0+c2hhcmVkCi0JICAmJiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKLQkgICAgICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMCkpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUkVMT0NfSk1QX1RCTAotCSAgJiYgISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBpcyBhcHBhcmVudGx5IHVuZGVmaW5lZC4gIERvbid0IGRvIGFueXRoaW5nCi0gICAgICAgICAgICAgaGVyZTsganVzdCBsZXQgdGhlIHJlbG9jYXRpb24gcm91dGluZSByZXBvcnQgYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQl7Ci0JICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywgZmFsc2UpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCSAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCSAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0JICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBpbml0aWFsIGVudHJ5IGluIHRoZSAuZ290IHRhYmxlLiAgKi8KLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPT0gMCkKLQkgICAgc2dvdC0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKLQkgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA9PSBSRUxPQ19KTVBfVEJMCi0JCSAgfHwgaW5mby0+c2hhcmVkCi0JCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfUkVGX1JFR1VMQVIpICE9IDApOwotICAgICAgQkZEX0FTU0VSVCAocl90eXBlID09IFJFTE9DX0pNUF9UQkwKLQkJICB8fCBpbmZvLT5zaGFyZWQKLQkJICB8fCBoLT5wbHRfb2Zmc2V0ICE9IDAKLQkJICB8fCAoKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgICA/IChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzCi0JCQkgJiBEWU5BTUlDKSAhPSAwCi0JCSAgICAgIDogKGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkpOwotCi0gICAgICAvKiBUaGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBvbmx5IGJ5IGEgZHluYW1pYwotCSBvYmplY3QsIG9yIGl0IGlzIGEganVtcCB0YWJsZSByZWxvYyBmcm9tIFBJQyBjb21waWxlZCBjb2RlLiAgKi8KLQotICAgICAgaWYgKHJfdHlwZSAhPSBSRUxPQ19KTVBfVEJMCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICAvKiBQcmVzdW1hYmx5IHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgYXMgYmVpbmcgdW5kZWZpbmVkIGJ5Ci0JICAgICBhbiBlYXJsaWVyIHJlbG9jLiAgKi8KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQl9Ci0gICAgICBlbHNlIGlmIChyX3R5cGUgIT0gUkVMT0NfSk1QX1RCTAotCSAgICAgICAmJiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0JewotCSAgYmZkICpzdWI7Ci0KLQkgIC8qIFRoaXMgcmVsb2MgaXMgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLiAgSXQgbXVzdCBiZQotCSAgICAgY29waWVkIGludG8gdGhlIGR5bmFtaWMgcmVsb2NzLiAgV2UgbWFyayB0aGUgc3ltYm9sIGFzCi0JICAgICBiZWluZyB1bmRlZmluZWQuICAqLwotCSAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCSAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3ViID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICAgICAgaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZCA9IHN1YjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBpcyBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIFdlIG11c3QgZ2l2ZSBpdCBhbgotCSAgICAgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBpZiB3ZSBoYXZlIG5vdAotCSAgICAgYWxyZWFkeSBkb25lIHNvLiAgV2UgY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wKLQkgICAgIHRvIHRoZSAucGx0IHNlY3Rpb247IHRoaXMgd2lsbCBjYXVzZSByZWxvY3MgYWdhaW5zdCBpdCB0bwotCSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotCSAgaWYgKGgtPnBsdF9vZmZzZXQgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPT0gMCkKLQkJc3BsdC0+X3Jhd19zaXplID0gU1BBUkNfUExUX0VOVFJZX1NJWkU7Ci0JICAgICAgaC0+cGx0X29mZnNldCA9IHNwbHQtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkJewotCQkgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkJICAgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCQkgIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID0gc3BsdDsKLQkJICBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSBzcGx0LT5fcmF3X3NpemU7Ci0JCX0KLQotCSAgICAgIHNwbHQtPl9yYXdfc2l6ZSArPSBTUEFSQ19QTFRfRU5UUllfU0laRTsKLQotCSAgICAgIC8qIFdlIHdpbGwgYWxzbyBuZWVkIGEgZHluYW1pYyByZWxvYyBlbnRyeSwgdW5sZXNzIHRoaXMKLSAgICAgICAgICAgICAgICAgaXMgYSBKTVBfVEJMIHJlbG9jIHByb2R1Y2VkIGJ5IGxpbmtpbmcgUElDIGNvbXBpbGVkCi0gICAgICAgICAgICAgICAgIGNvZGUsIGFuZCB3ZSBhcmUgbm90IG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCQlzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG5lZWQgdG8gY29weSBvdmVyCi0gICAgICAgICAgICAgYW55IHJlbG9jIG90aGVyIHRoYW4gYSBqdW1wIHRhYmxlIHJlbG9jLiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQgJiYgcl90eXBlICE9IFJFTE9DX0pNUF9UQkwpCi0JICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBCdWlsZCB0aGUgaGFzaCB0YWJsZSBvZiBkeW5hbWljIHN5bWJvbHMsIGFuZCB0byBtYXJrIGFzIHdyaXR0ZW4gYWxsCi0gICBzeW1ib2xzIGZyb20gZHluYW1pYyBvYmplY3RzIHdoaWNoIHdlIGRvIG5vdCBwbGFuIHRvIHdyaXRlIG91dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgZGF0YTsKLQotICAvKiBTZXQgdGhlIHdyaXR0ZW4gZmxhZyBmb3Igc3ltYm9scyB3ZSBkbyBub3Qgd2FudCB0byB3cml0ZSBvdXQgYXMKLSAgICAgcGFydCBvZiB0aGUgcmVndWxhciBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGFsbCBzeW1ib2xzIHdoaWNoIGFyZQotICAgICBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuICBGb3Igc29tZSByZWFzb24gc3ltYm9scwotICAgICB3aGljaCBhcmUgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGFuZCBkZWZpbmVkIGJ5IGEgZHluYW1pYwotICAgICBvYmplY3QgZG8gbm90IHNlZW0gdG8gc2hvdyB1cCBpbiB0aGUgcmVndWxhciBzeW1ib2wgdGFibGUuICBJdCBpcwotICAgICBwb3NzaWJsZSBmb3IgYSBzeW1ib2wgdG8gaGF2ZSBvbmx5IFNVTk9TX1JFRl9SRUdVTEFSIHNldCBoZXJlLCBpdAotICAgICBpcyBhbiB1bmRlZmluZWQgc3ltYm9sIHdoaWNoIHdhcyB0dXJuZWQgaW50byBhIGNvbW1vbiBzeW1ib2wKLSAgICAgYmVjYXVzZSBpdCB3YXMgZm91bmQgaW4gYW4gYXJjaGl2ZSBvYmplY3Qgd2hpY2ggd2FzIG5vdCBpbmNsdWRlZAotICAgICBpbiB0aGUgbGluay4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCAiX19EWU5BTUlDIikgIT0gMCkKLSAgICBoLT5yb290LndyaXR0ZW4gPSB0cnVlOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICAgIHJlZ3VsYXIgb2JqZWN0LCBzZWUgd2hldGhlciB3ZSBnYXZlIGl0IGEgcmVhc29uYWJsZSB2YWx1ZSB3aGlsZQotICAgICBzY2FubmluZyB0aGUgcmVsb2NzLiAgKi8KLQotICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmICgoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JICAmJiBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBiZmQgKnN1YjsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgY3VycmVudGx5IGRlZmluZWQgaW4gYSBkeW5hbWljIHNlY3Rpb24KLQkgICAgIHdoaWNoIGlzIG5vdCBiZWluZyBwdXQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBUaGlzCi0JICAgICBpbXBsaWVzIHRoYXQgdGhlcmUgaXMgbm8gcmVsb2MgYWdhaW5zdCB0aGUgc3ltYm9sLiAgSSdtCi0JICAgICBub3Qgc3VyZSB3aHkgdGhpcyBjYXNlIHdvdWxkIGV2ZXIgb2NjdXIuICBJbiBhbnkgY2FzZSwgd2UKLQkgICAgIGNoYW5nZSB0aGUgc3ltYm9sIHRvIGJlIHVuZGVmaW5lZC4gICovCi0JICBzdWIgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZCA9IHN1YjsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgb3IgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgZmlsZSwgYWRkIGl0Ci0gICAgIHRvIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotICBpZiAoKGgtPmZsYWdzICYgKFNVTk9TX0RFRl9SRUdVTEFSIHwgU1VOT1NfUkVGX1JFR1VMQVIpKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKm5hbWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gICAgICBiZmQgKmR5bm9iajsKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCA9PSAtMik7Ci0KLSAgICAgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgICAgIGgtPmR5bmluZHggPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gICAgICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQotICAgICAgbGVuID0gc3RybGVuIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gICAgICAvKiBXZSBkb24ndCBib3RoZXIgdG8gY29uc3RydWN0IGEgQkZEIGhhc2ggdGFibGUgZm9yIHRoZSBzdHJpbmdzCi0JIHdoaWNoIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGR5bmFtaWMgc3ltYm9scy4gIFVzaW5nIGEgaGFzaAotCSB0YWJsZSBmb3IgdGhlIHJlZ3VsYXIgc3ltYm9scyBpcyBiZW5lZmljaWFsLCBiZWNhdXNlIHRoZQotCSByZWd1bGFyIHN5bWJvbHMgaW5jbHVkZXMgdGhlIGRlYnVnZ2luZyBzeW1ib2xzLCB3aGljaCBoYXZlCi0JIGxvbmcgbmFtZXMgYW5kIGFyZSBvZnRlbiBkdXBsaWNhdGVkIGluIHNldmVyYWwgb2JqZWN0IGZpbGVzLgotCSBUaGVyZSBhcmUgbm8gZGVidWdnaW5nIHN5bWJvbHMgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zdHIiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAocy0+Y29udGVudHMsCi0JCQkJCSAgIHMtPl9yYXdfc2l6ZSArIGxlbiArIDEpOwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcy0+Y29udGVudHMgPSBjb250ZW50czsKLQotICAgICAgaC0+ZHluc3RyX2luZGV4ID0gcy0+X3Jhd19zaXplOwotICAgICAgc3RyY3B5ICgoY2hhciAqKSBjb250ZW50cyArIHMtPl9yYXdfc2l6ZSwgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBsZW4gKyAxOwotCi0gICAgICAvKiBBZGQgaXQgdG8gdGhlIGR5bmFtaWMgaGFzaCB0YWJsZS4gICovCi0gICAgICBuYW1lID0gKHVuc2lnbmVkIGNoYXIgKikgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotICAgICAgaGFzaCA9IDA7Ci0gICAgICB3aGlsZSAoKm5hbWUgIT0gJ1wwJykKLQloYXNoID0gKGhhc2ggPDwgMSkgKyAqbmFtZSsrOwotICAgICAgaGFzaCAmPSAweDdmZmZmZmZmOwotICAgICAgaGFzaCAlPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+YnVja2V0Y291bnQ7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmIChHRVRfU1dPUkQgKGR5bm9iaiwgcy0+Y29udGVudHMgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFKSA9PSAtMSkKLQlQVVRfV09SRCAoZHlub2JqLCBoLT5keW5pbmR4LCBzLT5jb250ZW50cyArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF92bWEgbmV4dDsKLQotCSAgbmV4dCA9IEdFVF9XT1JEIChkeW5vYmosCi0JCQkgICAocy0+Y29udGVudHMKLQkJCSAgICArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUKLQkJCSAgICArIEJZVEVTX0lOX1dPUkQpKTsKLQkgIFBVVF9XT1JEIChkeW5vYmosIHMtPl9yYXdfc2l6ZSAvIEhBU0hfRU5UUllfU0laRSwKLQkJICAgIHMtPmNvbnRlbnRzICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRSArIEJZVEVTX0lOX1dPUkQpOwotCSAgUFVUX1dPUkQgKGR5bm9iaiwgaC0+ZHluaW5keCwgcy0+Y29udGVudHMgKyBzLT5fcmF3X3NpemUpOwotCSAgUFVUX1dPUkQgKGR5bm9iaiwgbmV4dCwgcy0+Y29udGVudHMgKyBzLT5fcmF3X3NpemUgKyBCWVRFU19JTl9XT1JEKTsKLQkgIHMtPl9yYXdfc2l6ZSArPSBIQVNIX0VOVFJZX1NJWkU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTGluayBhIGR5bmFtaWMgb2JqZWN0LiAgV2UgYWN0dWFsbHkgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBkbyBhdAotICAgdGhpcyBwb2ludC4gIFRoaXMgZW50cnkgcG9pbnQgZXhpc3RzIHRvIHByZXZlbnQgdGhlIHJlZ3VsYXIgbGlua2VyCi0gICBjb2RlIGZyb20gZG9pbmcgYW55dGhpbmcgd2l0aCB0aGUgb2JqZWN0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfbGlua19keW5hbWljX29iamVjdCAoaW5mbywgYWJmZCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBkeW5hbWljIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBmaW5hbCB0cmF2ZXJzYWwKLSAgIG92ZXIgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgaGFyZzsKLSAgaW50IHR5cGU7Ci0gIGJmZF92bWEgdmFsOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvdXRzeW07Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBmaWxsIGluIHRoZQotICAgICB0YWJsZSBlbnRyeS4gICovCi0gIGlmIChoLT5wbHRfb2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgYmZkICpkeW5vYmo7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBiZmRfdm1hIHJfYWRkcmVzczsKLQotICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgcCA9IHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0X29mZnNldDsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0KLSAgICAgIHJfYWRkcmVzcyA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICArIGgtPnBsdF9vZmZzZXQpOwotCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAob3V0cHV0X2JmZCkpCi0JewotCWNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0JICBpZiAoaW5mby0+c2hhcmVkIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1BBUkNfUExUX0VOVFJZX1dPUkQwLCBwKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICAoU1BBUkNfUExUX0VOVFJZX1dPUkQxCi0JCQkgICArICgoKC0gKGgtPnBsdF9vZmZzZXQgKyA0KSA+PiAyKQotCQkJICAgICAgICYgMHgzZmZmZmZmZikpKSwKLQkJCSAgcCArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX1BMVF9FTlRSWV9XT1JEMiArIHMtPnJlbG9jX2NvdW50LAotCQkJICBwICsgOCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgICsgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBTUEFSQ19QTFRfUElDX1dPUkQwICsgKCh2YWwgPj4gMTApICYgMHgzZmZmZmYpLAotCQkJICBwKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBTUEFSQ19QTFRfUElDX1dPUkQxICsgKHZhbCAmIDB4M2ZmKSwKLQkJCSAgcCArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX1BMVF9QSUNfV09SRDIsIHAgKyA4KTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9hcmNoX202OGs6Ci0JICBpZiAoISBpbmZvLT5zaGFyZWQgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDApCi0JICAgIGFib3J0ICgpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgTTY4S19QTFRfRU5UUllfV09SRDAsIHApOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKC0gKGgtPnBsdF9vZmZzZXQgKyAyKSksIHAgKyAyKTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHMtPnJlbG9jX2NvdW50LCBwICsgNik7Ci0JICByX2FkZHJlc3MgKz0gMjsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIGFkZCBhIGp1bXAgdGFibGUgcmVsb2MsIHVubGVzcyB0aGlzIGlzIHRoZQotICAgICAgICAgcmVzdWx0IG9mIGEgSk1QX1RCTCByZWxvYyBmcm9tIFBJQyBjb21waWxlZCBjb2RlLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCA+PSAwKTsKLQkgIEJGRF9BU1NFUlQgKHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikKLQkJICAgICAgPCBzLT5fcmF3X3NpemUpOwotCSAgcCA9IHMtPmNvbnRlbnRzICsgcy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAob3V0cHV0X2JmZCk7Ci0JICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKG91dHB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKLQotCSAgICAgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBwOwotCSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCByX2FkZHJlc3MsIHNyZWwtPnJfYWRkcmVzcyk7Ci0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCXsKLQkJICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHgpOwotCQkgIHNyZWwtPnJfdHlwZVswXSA9IChSRUxPQ19TVERfQklUU19FWFRFUk5fQklHCi0JCQkJICAgICB8IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaC0+ZHluaW5keDsKLQkJICBzcmVsLT5yX3R5cGVbMF0gPSAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQotCQkJCSAgICAgfCBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmVyZWw7Ci0KLQkgICAgICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcDsKLQkgICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgcl9hZGRyZXNzLCBlcmVsLT5yX2FkZHJlc3MpOwotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQl7Ci0JCSAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7Ci0JCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKLQkJICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWgtPmR5bmluZHg7Ci0JCSAgZXJlbC0+cl90eXBlWzBdID0KLQkJICAgIChSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCi0JCSAgICAgfCAoUkVMT0NfSk1QX1NMT1QgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOwotCQkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7Ci0JCSAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSloLT5keW5pbmR4OwotCQkgIGVyZWwtPnJfdHlwZVswXSA9Ci0JCSAgICAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQotCQkgICAgIHwgKFJFTE9DX0pNUF9TTE9UIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKSk7Ci0JCX0KLQkgICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIGVyZWwtPnJfYWRkZW5kKTsKLQkgICAgfQotCi0JICArK3MtPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBub3QgYSBkeW5hbWljIHN5bWJvbCwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZwotICAgICBlbHNlLiAgV2Ugb25seSBjaGVjayB0aGlzIGFmdGVyIGhhbmRsaW5nIHRoZSBQTFQgZW50cnksIGJlY2F1c2UKLSAgICAgd2UgY2FuIGhhdmUgYSBQTFQgZW50cnkgZm9yIGEgbm9uZHluYW1pYyBzeW1ib2wgd2hlbiBsaW5raW5nIFBJQwotICAgICBjb21waWxlZCBjb2RlIGZyb20gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmIChoLT5keW5pbmR4IDwgMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGgtPnJvb3Qucm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIC8qIEF2b2lkIHZhcmlhYmxlIG5vdCBpbml0aWFsaXplZCB3YXJuaW5ncy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWFzZWN0aW9uICpzZWM7Ci0JYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0Jc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0Jb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCUJGRF9BU1NFUlQgKGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0JCSAgICB8fCBvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0JaWYgKGgtPnBsdF9vZmZzZXQgIT0gMAotCSAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkgIHsKLQkgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotCSAgICB2YWwgPSAwOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkgICAgICB0eXBlID0gKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICA/IE5fVEVYVAotCQkgICAgICA6IE5fV0VBS1QpOwotCSAgICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX0RBVEEKLQkJICAgICAgOiBOX1dFQUtEKTsKLQkgICAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX0JTUwotCQkgICAgICA6IE5fV0VBS0IpOwotCSAgICBlbHNlCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX0FCUwotCQkgICAgICA6IE5fV0VBS0EpOwotCSAgICB0eXBlIHw9IE5fRVhUOwotCSAgICB2YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCSAgICsgb3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gaC0+cm9vdC5yb290LnUuYy5zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIHR5cGUgPSBOX1dFQUtVOwotICAgICAgdmFsID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgIi5keW5zeW0iKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgb3V0c3ltID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkgICAgKHMtPmNvbnRlbnRzICsgaC0+ZHluaW5keCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKTsKLQotICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgdHlwZSwgb3V0c3ltLT5lX3R5cGUpOwotICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX290aGVyKTsKLQotICAvKiBGSVhNRTogVGhlIG5hdGl2ZSBsaW5rZXIgZG9lc24ndCB1c2UgMCBmb3IgZGVzYy4gIEl0IHNlZW1zIHRvIHVzZQotICAgICBvbmUgbGVzcyB0aGFuIHRoZSBkZXNjIHZhbHVlIGluIHRoZSBzaGFyZWQgbGlicmFyeSwgYWx0aG91Z2ggdGhhdAotICAgICBzZWVtcyB1bmxpa2VseS4gICovCi0gIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX2Rlc2MpOwotCi0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBoLT5keW5zdHJfaW5kZXgsIG91dHN5bS0+ZV9zdHJ4KTsKLSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbCwgb3V0c3ltLT5lX3ZhbHVlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wuICBJZiB0aGlzCi0gICBpcyBhIHJlbG9jIHdoaWNoIGFyZSBhcmUgZ29pbmcgdG8gY29weSBhcyBhIGR5bmFtaWMgcmVsb2MsIHRoZW4KLSAgIGNvcHkgaXQgb3ZlciwgYW5kIHRlbGwgdGhlIGNhbGxlciB0byBub3QgYm90aGVyIHByb2Nlc3NpbmcgdGhpcwotICAgcmVsb2MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zdW5vc19jaGVja19keW5hbWljX3JlbG9jIChpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGhhcmcsIHJlbG9jLAotCQkJICAgY29udGVudHMsIHNraXAsIHJlbG9jYXRpb25wKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci0gICAgIFBUUiByZWxvYzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gKnNraXA7Ci0gICAgIGJmZF92bWEgKnJlbG9jYXRpb25wOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgaGFyZzsKLSAgYmZkICpkeW5vYmo7Ci0gIGJvb2xlYW4gYmFzZXJlbDsKLSAgYm9vbGVhbiBqbXB0Ymw7Ci0gIGJvb2xlYW4gcGNyZWw7Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqcDsKLSAgbG9uZyBpbmR4OwotCi0gICpza2lwID0gZmFsc2U7Ci0KLSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaCAhPSBOVUxMCi0gICAgICAmJiBoLT5wbHRfb2Zmc2V0ICE9IDAKLSAgICAgICYmIChpbmZvLT5zaGFyZWQKLQkgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLQotICAgICAgLyogUmVkaXJlY3QgdGhlIHJlbG9jYXRpb24gdG8gdGhlIFBMVCBlbnRyeS4gICovCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgICpyZWxvY2F0aW9ucCA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIGgtPnBsdF9vZmZzZXQpOwotICAgIH0KLQotICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0gICAgewotICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKLQotICAgICAgc3JlbCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHJlbG9jOwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQl7Ci0JICBiYXNlcmVsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHKSk7Ci0JICBqbXB0YmwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKSk7Ci0JICBwY3JlbCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmFzZXJlbCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSkpOwotCSAgam1wdGJsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSkpOwotCSAgcGNyZWwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmVyZWw7Ci0gICAgICBpbnQgcl90eXBlOwotCi0gICAgICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2M7Ci0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCXJfdHlwZSA9ICgoZXJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCi0JCSAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpOwotICAgICAgZWxzZQotCXJfdHlwZSA9ICgoZXJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCi0JCSAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpOwotICAgICAgYmFzZXJlbCA9IChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JCSB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JCSB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKTsKLSAgICAgIGptcHRibCA9IHJfdHlwZSA9PSBSRUxPQ19KTVBfVEJMOwotICAgICAgcGNyZWwgPSAocl90eXBlID09IFJFTE9DX0RJU1A4Ci0JICAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19ESVNQMTYKLQkgICAgICAgfHwgcl90eXBlID09IFJFTE9DX0RJU1AzMgotCSAgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfV0RJU1AzMAotCSAgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfV0RJU1AyMik7Ci0gICAgICAvKiBXZSBkb24ndCBjb25zaWRlciB0aGUgUEMxMCBhbmQgUEMyMiB0eXBlcyB0byBiZSBQQyByZWxhdGl2ZSwKLSAgICAgICAgIGJlY2F1c2UgdGhleSBhcmUgcGNyZWxfb2Zmc2V0LiAgKi8KLSAgICB9Ci0KLSAgaWYgKGJhc2VyZWwpCi0gICAgewotICAgICAgYmZkX3ZtYSAqZ290X29mZnNldHA7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQlnb3Rfb2Zmc2V0cCA9ICZoLT5nb3Rfb2Zmc2V0OwotICAgICAgZWxzZSBpZiAoYWRhdGEgKGlucHV0X2JmZCkubG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQlnb3Rfb2Zmc2V0cCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKLQkgIGludCByX2luZGV4OwotCi0JICBzcmVsID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2M7Ci0JICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCQlyX2luZGV4ID0gKChzcmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkJICAgfCAoc3JlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJICAgfCBzcmVsLT5yX2luZGV4WzJdKTsKLQkgICAgICBlbHNlCi0JCXJfaW5kZXggPSAoKHNyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCQkgICB8IChzcmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgICB8IHNyZWwtPnJfaW5kZXhbMF0pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOwotCi0JICAgICAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jOwotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXJfaW5kZXggPSAoKGVyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCQkgICB8IChlcmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgICB8IGVyZWwtPnJfaW5kZXhbMl0pOwotCSAgICAgIGVsc2UKLQkJcl9pbmRleCA9ICgoZXJlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkJCSAgIHwgKGVyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSAgIHwgZXJlbC0+cl9pbmRleFswXSk7Ci0JICAgIH0KLQotCSAgZ290X29mZnNldHAgPSBhZGF0YSAoaW5wdXRfYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0cyArIHJfaW5kZXg7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChnb3Rfb2Zmc2V0cCAhPSBOVUxMICYmICpnb3Rfb2Zmc2V0cCAhPSAwKTsKLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0KLSAgICAgIC8qIFdlIHNldCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIGluZGljYXRlIHdoZXRoZXIgd2UgaGF2ZQotCSBhbHJlYWR5IGluaXRpYWxpemVkIHRoZSBHT1QgZW50cnkuICAqLwotICAgICAgaWYgKCgqZ290X29mZnNldHAgJiAxKSA9PSAwKQotCXsKLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCAoISBpbmZvLT5zaGFyZWQKLQkJICAmJiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKLQkJICAgICAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDApKSkKLQkgICAgUFVUX1dPUkQgKGR5bm9iaiwgKnJlbG9jYXRpb25wLCBzZ290LT5jb250ZW50cyArICpnb3Rfb2Zmc2V0cCk7Ci0JICBlbHNlCi0JICAgIFBVVF9XT1JEIChkeW5vYmosIDAsIHNnb3QtPmNvbnRlbnRzICsgKmdvdF9vZmZzZXRwKTsKLQotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgIHx8IChoICE9IE5VTEwKLQkJICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgIT0gMAotCQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkgICAgewotCSAgICAgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgR0xPQl9EQVQgb3IgMzIgcmVsb2MgdG8gdGVsbCB0aGUKLSAgICAgICAgICAgICAgICAgZHluYW1pYyBsaW5rZXIgdG8gZmlsbCBpbiB0aGlzIGVudHJ5IGluIHRoZSB0YWJsZS4gICovCi0KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikKLQkJCSAgPCBzLT5fcmF3X3NpemUpOwotCi0JICAgICAgcCA9IChzLT5jb250ZW50cwotCQkgICArIHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikpOwotCi0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJaW5keCA9IGgtPmR5bmluZHg7Ci0JICAgICAgZWxzZQotCQlpbmR4ID0gMDsKLQotCSAgICAgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKSA9PSBSRUxPQ19TVERfU0laRSkKLQkJewotCQkgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7Ci0KLQkJICBzcmVsID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcDsKLQkJICBQVVRfV09SRCAoZHlub2JqLAotCQkJICAgICgqZ290X29mZnNldHAKLQkJCSAgICAgKyBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCksCi0JCQkgICAgc3JlbC0+cl9hZGRyZXNzKTsKLQkJICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChkeW5vYmopKQotCQkgICAgewotCQkgICAgICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkJICAgICAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkJICAgICAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSlpbmR4OwotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc3JlbC0+cl90eXBlWzBdID0gMiA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHOwotCQkgICAgICBlbHNlCi0JCQlzcmVsLT5yX3R5cGVbMF0gPQotCQkJICAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwotCQkJICAgfCBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwotCQkJICAgfCBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcKLQkJCSAgIHwgKDIgPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRykpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaW5keDsKLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNyZWwtPnJfdHlwZVswXSA9IDIgPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRTsKLQkJICAgICAgZWxzZQotCQkJc3JlbC0+cl90eXBlWzBdID0KLQkJCSAgKFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUKLQkJCSAgIHwgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUKLQkJCSAgIHwgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCi0JCQkgICB8ICgyIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmVyZWw7Ci0KLQkJICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcDsKLQkJICBQVVRfV09SRCAoZHlub2JqLAotCQkJICAgICgqZ290X29mZnNldHAKLQkJCSAgICAgKyBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCksCi0JCQkgICAgZXJlbC0+cl9hZGRyZXNzKTsKLQkJICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChkeW5vYmopKQotCQkgICAgewotCQkgICAgICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkJICAgICAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkJICAgICAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSlpbmR4OwotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJZXJlbC0+cl90eXBlWzBdID0KLQkJCSAgUkVMT0NfMzIgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUc7Ci0JCSAgICAgIGVsc2UKLQkJCWVyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIChSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCi0JCQkgICB8IChSRUxPQ19HTE9CX0RBVCA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRykpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaW5keDsKLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCWVyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIFJFTE9DXzMyIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFOwotCQkgICAgICBlbHNlCi0JCQllcmVsLT5yX3R5cGVbMF0gPQotCQkJICAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQotCQkJICAgfCAoUkVMT0NfR0xPQl9EQVQKLQkJCSAgICAgIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKSk7Ci0JCSAgICB9Ci0JCSAgUFVUX1dPUkQgKGR5bm9iaiwgMCwgZXJlbC0+cl9hZGRlbmQpOwotCQl9Ci0KLQkgICAgICArK3MtPnJlbG9jX2NvdW50OwotCSAgICB9Ci0KLQkgICpnb3Rfb2Zmc2V0cCB8PSAxOwotCX0KLQotICAgICAgKnJlbG9jYXRpb25wID0gKHNnb3QtPnZtYQotCQkgICAgICArICgqZ290X29mZnNldHAgJn4gMSkKLQkJICAgICAgLSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X2Jhc2UpOwotCi0gICAgICAvKiBUaGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gZG8gZm9yIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaWYgKGggPT0gTlVMTAotCSAgfHwgaC0+ZHluaW5keCA9PSAtMQotCSAgfHwgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwCi0JICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAotCSAgfHwgKGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+ZHluaW5keCA9PSAtMQotCSAgICAgIHx8IGptcHRibAotCSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLAotCQkJICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEl0IGxvb2tzIGxpa2UgdGhpcyBpcyBhIHJlbG9jIHdlIGFyZSBzdXBwb3NlZCB0byBjb3B5LiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKSA8IHMtPl9yYXdfc2l6ZSk7Ci0KLSAgcCA9IHMtPmNvbnRlbnRzICsgcy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKTsKLQotICAvKiBDb3B5IHRoZSByZWxvYyBvdmVyLiAgKi8KLSAgbWVtY3B5IChwLCByZWxvYywgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikpOwotCi0gIGlmIChoICE9IE5VTEwpCi0gICAgaW5keCA9IGgtPmR5bmluZHg7Ci0gIGVsc2UKLSAgICBpbmR4ID0gMDsKLQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgYW5kIHN5bWJvbCBpbmRleC4gICovCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOwotCi0gICAgICBzcmVsID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcDsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCShHRVRfV09SRCAoZHlub2JqLCBzcmVsLT5yX2FkZHJlc3MpCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCXNyZWwtPnJfYWRkcmVzcyk7Ci0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChkeW5vYmopKQotCXsKLQkgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCSAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpaW5keDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCSAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSlpbmR4OwotCX0KLSAgICAgIC8qIEZJWE1FOiBXZSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZQotICAgICAgICAgcmVsb2MuICAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmVyZWw7Ci0KLSAgICAgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBwOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJKEdFVF9XT1JEIChkeW5vYmosIGVyZWwtPnJfYWRkcmVzcykKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSwKLQkJZXJlbC0+cl9hZGRyZXNzKTsKLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCi0JewotCSAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCSAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSlpbmR4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWluZHg7Ci0JfQotICAgICAgaWYgKHBjcmVsICYmIGggIT0gTlVMTCkKLQl7Ci0JICAvKiBBZGp1c3QgdGhlIGFkZGVuZCBmb3IgdGhlIGNoYW5nZSBpbiBhZGRyZXNzLiAgKi8KLQkgIFBVVF9XT1JEIChkeW5vYmosCi0JCSAgICAoR0VUX1dPUkQgKGR5bm9iaiwgZXJlbC0+cl9hZGRlbmQpCi0JCSAgICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQktIGlucHV0X3NlY3Rpb24tPnZtYSkpLAotCQkgICAgZXJlbC0+cl9hZGRlbmQpOwotCX0KLSAgICB9Ci0KLSAgKytzLT5yZWxvY19jb3VudDsKLQotICBpZiAoaCAhPSBOVUxMKQotICAgICpza2lwID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpvOwotICBhc2VjdGlvbiAqczsKLSAgYXNlY3Rpb24gKnNkeW47Ci0KLSAgaWYgKCEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkCi0gICAgICAmJiAhIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzZHluICE9IE5VTEwpOwotCi0gIC8qIEZpbmlzaCB1cCB0aGUgLm5lZWQgc2VjdGlvbi4gIFRoZSBsaW5rZXIgZW11bGF0aW9uIGNvZGUgZmlsbGVkIGl0Ci0gICAgIGluLCBidXQgd2l0aCBvZmZzZXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGluc3RlYWQgb2YKLSAgICAgcmVhbCBhZGRyZXNzZXMuICBOb3cgdGhhdCB3ZSBrbm93IHRoZSBzZWN0aW9uIGxvY2F0aW9uLCB3ZSBjYW4KLSAgICAgZmlsbCBpbiB0aGUgZmluYWwgdmFsdWVzLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIubmVlZCIpOwotICBpZiAocyAhPSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci0gICAgICBiZmRfYnl0ZSAqcDsKLQotICAgICAgZmlsZXBvcyA9IHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIHAgPSBzLT5jb250ZW50czsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICBQVVRfV09SRCAoZHlub2JqLCBHRVRfV09SRCAoZHlub2JqLCBwKSArIGZpbGVwb3MsIHApOwotCSAgdmFsID0gR0VUX1dPUkQgKGR5bm9iaiwgcCArIDEyKTsKLQkgIGlmICh2YWwgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICBQVVRfV09SRCAoZHlub2JqLCB2YWwgKyBmaWxlcG9zLCBwICsgMTIpOwotCSAgcCArPSAxNjsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgLmdvdCBzZWN0aW9uIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICBkeW5hbWljIGluZm9ybWF0aW9uLCB1bmxlc3MgdGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIGlmIChpbmZvLT5zaGFyZWQgfHwgc2R5bi0+X3Jhd19zaXplID09IDApCi0gICAgUFVUX1dPUkQgKGR5bm9iaiwgMCwgcy0+Y29udGVudHMpOwotICBlbHNlCi0gICAgUFVUX1dPUkQgKGR5bm9iaiwgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JICAgICAgcy0+Y29udGVudHMpOwotCi0gIGZvciAobyA9IGR5bm9iai0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAKLQkgICYmIG8tPmNvbnRlbnRzICE9IE5VTEwpCi0JewotCSAgQkZEX0FTU0VSVCAoby0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotCQkgICAgICAmJiBvLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gYWJmZCk7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgIG8tPmNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCQkgIG8tPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChzZHluLT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMgZXNkOwotICAgICAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pY19saW5rIGVzZGw7Ci0KLSAgICAgIC8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSAzLCBlc2QubGRfdmVyc2lvbik7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLAotCQlzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCArIHNpemVvZiBlc2QsCi0JCWVzZC5sZGQpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJKHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgc2R5bi0+b3V0cHV0X29mZnNldAotCQkgKyBzaXplb2YgZXNkCi0JCSArIEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFKSwKLQkJZXNkLmxkKTsKLQotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZHluLT5vdXRwdXRfc2VjdGlvbiwgJmVzZCwKLQkJCQkgICAgICBzZHluLT5vdXRwdXRfb2Zmc2V0LCBzaXplb2YgZXNkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSAwLCBlc2RsLmxkX2xvYWRlZCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLm5lZWQiKTsKLSAgICAgIGlmIChzID09IE5VTEwgfHwgcy0+X3Jhd19zaXplID09IDApCi0JUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDAsIGVzZGwubGRfbmVlZCk7Ci0gICAgICBlbHNlCi0JUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQkgIGVzZGwubGRfbmVlZCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJ1bGVzIik7Ci0gICAgICBpZiAocyA9PSBOVUxMIHx8IHMtPl9yYXdfc2l6ZSA9PSAwKQotCVBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSAwLCBlc2RsLmxkX3J1bGVzKTsKLSAgICAgIGVsc2UKLQlQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JCSAgZXNkbC5sZF9ydWxlcyk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQllc2RsLmxkX2dvdCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQllc2RsLmxkX3BsdCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5fcmF3X3NpemUsIGVzZGwubGRfcGx0X3N6KTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgQkZEX0FTU0VSVCAocy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKQotCQkgID09IHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfcmVsKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9oYXNoKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQllc2RsLmxkX3N0YWIpOwotCi0gICAgICBQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMCwgZXNkbC5sZF9zdGFiX2hhc2gpOwotCi0gICAgICBQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50LAotCQllc2RsLmxkX2J1Y2tldHMpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zdHIiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfc3ltYm9scyk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5fcmF3X3NpemUsIGVzZGwubGRfc3ltYl9zaXplKTsKLQotICAgICAgLyogVGhlIHNpemUgb2YgdGhlIHRleHQgYXJlYSBpcyB0aGUgc2l6ZSBvZiB0aGUgLnRleHQgc2VjdGlvbgotCSByb3VuZGVkIHVwIHRvIGEgcGFnZSBib3VuZGFyeS4gIEZJWE1FOiBTaG91bGQgdGhlIHBhZ2Ugc2l6ZSBiZQotCSBjb25kaXRpb25hbCBvbiBzb21ldGhpbmc/ICAqLwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJQkZEX0FMSUdOIChvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgMHgyMDAwKSwKLQkJZXNkbC5sZF90ZXh0KTsKLSAgCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNkeW4tPm91dHB1dF9zZWN0aW9uLCAmZXNkbCwKLQkJCQkgICAgICAoc2R5bi0+b3V0cHV0X29mZnNldAotCQkJCSAgICAgICArIHNpemVvZiBlc2QKLQkJCQkgICAgICAgKyBFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRSksCi0JCQkJICAgICAgc2l6ZW9mIGVzZGwpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvc3ltcy5jIGIvYmZkL3N5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0NmY1OC4uMDAwMDAwMAotLS0gYS9iZmQvc3ltcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNiArMCwwIEBACi0vKiBHZW5lcmljIHN5bWJvbC10YWJsZSBzdXBwb3J0IGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JU3ltYm9scwotCi0JQkZEIHRyaWVzIHRvIG1haW50YWluIGFzIG11Y2ggc3ltYm9sIGluZm9ybWF0aW9uIGFzIGl0IGNhbiB3aGVuCi0JaXQgbW92ZXMgaW5mb3JtYXRpb24gZnJvbSBmaWxlIHRvIGZpbGUuIEJGRCBwYXNzZXMgaW5mb3JtYXRpb24KLQl0byBhcHBsaWNhdGlvbnMgdGhvdWdoIHRoZSA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUuIFdoZW4gdGhlCi0JYXBwbGljYXRpb24gcmVxdWVzdHMgdGhlIHN5bWJvbCB0YWJsZSwgQkZEIHJlYWRzIHRoZSB0YWJsZSBpbgotCXRoZSBuYXRpdmUgZm9ybSBhbmQgdHJhbnNsYXRlcyBwYXJ0cyBvZiBpdCBpbnRvIHRoZSBpbnRlcm5hbAotCWZvcm1hdC4gVG8gbWFpbnRhaW4gbW9yZSB0aGFuIHRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8KLQlhcHBsaWNhdGlvbnMsIHNvbWUgdGFyZ2V0cyBrZWVwIHNvbWUgaW5mb3JtYXRpb24gYGBiZWhpbmQgdGhlCi0Jc2NlbmVzJycgaW4gYSBzdHJ1Y3R1cmUgb25seSB0aGUgcGFydGljdWxhciBiYWNrIGVuZCBrbm93cwotCWFib3V0LiBGb3IgZXhhbXBsZSwgdGhlIGNvZmYgYmFjayBlbmQga2VlcHMgdGhlIG9yaWdpbmFsCi0Jc3ltYm9sIHRhYmxlIHN0cnVjdHVyZSBhcyB3ZWxsIGFzIHRoZSBjYW5vbmljYWwgc3RydWN0dXJlIHdoZW4KLQlhIEJGRCBpcyByZWFkIGluLiBPbiBvdXRwdXQsIHRoZSBjb2ZmIGJhY2sgZW5kIGNhbiByZWNvbnN0cnVjdAotCXRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlIHNvIHRoYXQgbm8gaW5mb3JtYXRpb24gaXMgbG9zdCwgZXZlbgotCWluZm9ybWF0aW9uIHVuaXF1ZSB0byBjb2ZmIHdoaWNoIEJGRCBkb2Vzbid0IGtub3cgb3IKLQl1bmRlcnN0YW5kLiBJZiBhIGNvZmYgc3ltYm9sIHRhYmxlIHdlcmUgcmVhZCwgYnV0IHdlcmUgd3JpdHRlbgotCXRocm91Z2ggYW4gYS5vdXQgYmFjayBlbmQsIGFsbCB0aGUgY29mZiBzcGVjaWZpYyBpbmZvcm1hdGlvbgotCXdvdWxkIGJlIGxvc3QuIFRoZSBzeW1ib2wgdGFibGUgb2YgYSBCRkQKLQlpcyBub3QgbmVjZXNzYXJpbHkgcmVhZCBpbiB1bnRpbCBhIGNhbm9uaWNhbGl6ZSByZXF1ZXN0IGlzCi0JbWFkZS4gVGhlbiB0aGUgQkZEIGJhY2sgZW5kIGZpbGxzIGluIGEgdGFibGUgcHJvdmlkZWQgYnkgdGhlCi0JYXBwbGljYXRpb24gd2l0aCBwb2ludGVycyB0byB0aGUgY2Fub25pY2FsIGluZm9ybWF0aW9uLiAgVG8KLQlvdXRwdXQgc3ltYm9scywgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIEJGRCB3aXRoIGEgdGFibGUgb2YKLQlwb2ludGVycyB0byBwb2ludGVycyB0byA8PGFzeW1ib2w+PnMuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucwotCWxpa2UgdGhlIGxpbmtlciB0byBvdXRwdXQgYSBzeW1ib2wgYXMgaXQgd2FzIHJlYWQsIHNpbmNlIHRoZSBgYGJlaGluZAotCXRoZSBzY2VuZXMnJyBpbmZvcm1hdGlvbiB3aWxsIGJlIHN0aWxsIGF2YWlsYWJsZS4KLUBtZW51Ci1AKiBSZWFkaW5nIFN5bWJvbHM6OgotQCogV3JpdGluZyBTeW1ib2xzOjoKLUAqIE1pbmkgU3ltYm9sczo6Ci1AKiB0eXBlZGVmIGFzeW1ib2w6OgotQCogc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9uczo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLVJlYWRpbmcgU3ltYm9scywgV3JpdGluZyBTeW1ib2xzLCBTeW1ib2xzLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JUmVhZGluZyBzeW1ib2xzCi0KLQlUaGVyZSBhcmUgdHdvIHN0YWdlcyB0byByZWFkaW5nIGEgc3ltYm9sIHRhYmxlIGZyb20gYSBCRkQ6Ci0JYWxsb2NhdGluZyBzdG9yYWdlLCBhbmQgdGhlIGFjdHVhbCByZWFkaW5nIHByb2Nlc3MuIFRoaXMgaXMgYW4KLQlleGNlcnB0IGZyb20gYW4gYXBwbGljYXRpb24gd2hpY2ggcmVhZHMgdGhlIHN5bWJvbCB0YWJsZToKLQotfAkgIGxvbmcgc3RvcmFnZV9uZWVkZWQ7Ci18CSAgYXN5bWJvbCAqKnN5bWJvbF90YWJsZTsKLXwJICBsb25nIG51bWJlcl9vZl9zeW1ib2xzOwotfAkgIGxvbmcgaTsKLXwKLXwJICBzdG9yYWdlX25lZWRlZCA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLXwKLXwgICAgICAgICBpZiAoc3RvcmFnZV9uZWVkZWQgPCAwKQotfCAgICAgICAgICAgRkFJTAotfAotfAkgIGlmIChzdG9yYWdlX25lZWRlZCA9PSAwKSB7Ci18CSAgICAgcmV0dXJuIDsKLXwJICB9Ci18CSAgc3ltYm9sX3RhYmxlID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2VfbmVlZGVkKTsKLXwJICAgIC4uLgotfAkgIG51bWJlcl9vZl9zeW1ib2xzID0KLXwJICAgICBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltYm9sX3RhYmxlKTsKLXwKLXwgICAgICAgICBpZiAobnVtYmVyX29mX3N5bWJvbHMgPCAwKQotfCAgICAgICAgICAgRkFJTAotfAotfAkgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2Zfc3ltYm9sczsgaSsrKSB7Ci18CSAgICAgcHJvY2Vzc19zeW1ib2wgKHN5bWJvbF90YWJsZVtpXSk7Ci18CSAgfQotCi0JQWxsIHN0b3JhZ2UgZm9yIHRoZSBzeW1ib2xzIHRoZW1zZWx2ZXMgaXMgaW4gYW4gb2JqYWxsb2MKLQljb25uZWN0ZWQgdG8gdGhlIEJGRDsgaXQgaXMgZnJlZWQgd2hlbiB0aGUgQkZEIGlzIGNsb3NlZC4KLQotCi1JTk9ERQotV3JpdGluZyBTeW1ib2xzLCBNaW5pIFN5bWJvbHMsIFJlYWRpbmcgU3ltYm9scywgU3ltYm9scwotU1VCU0VDVElPTgotCVdyaXRpbmcgc3ltYm9scwotCi0JV3JpdGluZyBvZiBhIHN5bWJvbCB0YWJsZSBpcyBhdXRvbWF0aWMgd2hlbiBhIEJGRCBvcGVuIGZvcgotCXdyaXRpbmcgaXMgY2xvc2VkLiBUaGUgYXBwbGljYXRpb24gYXR0YWNoZXMgYSB2ZWN0b3Igb2YKLQlwb2ludGVycyB0byBwb2ludGVycyB0byBzeW1ib2xzIHRvIHRoZSBCRkQgYmVpbmcgd3JpdHRlbiwgYW5kCi0JZmlsbHMgaW4gdGhlIHN5bWJvbCBjb3VudC4gVGhlIGNsb3NlIGFuZCBjbGVhbnVwIGNvZGUgcmVhZHMKLQl0aHJvdWdoIHRoZSB0YWJsZSBwcm92aWRlZCBhbmQgcGVyZm9ybXMgYWxsIHRoZSBuZWNlc3NhcnkKLQlvcGVyYXRpb25zLiBUaGUgQkZEIG91dHB1dCBjb2RlIG11c3QgYWx3YXlzIGJlIHByb3ZpZGVkIHdpdGggYW4KLQlgYG93bmVkJycgc3ltYm9sOiBvbmUgd2hpY2ggaGFzIGNvbWUgZnJvbSBhbm90aGVyIEJGRCwgb3Igb25lCi0Jd2hpY2ggaGFzIGJlZW4gY3JlYXRlZCB1c2luZyA8PGJmZF9tYWtlX2VtcHR5X3N5bWJvbD4+LiAgSGVyZSBpcyBhbgotCWV4YW1wbGUgc2hvd2luZyB0aGUgY3JlYXRpb24gb2YgYSBzeW1ib2wgdGFibGUgd2l0aCBvbmx5IG9uZSBlbGVtZW50OgotCi18CSNpbmNsdWRlICJiZmQuaCIKLXwJbWFpbigpCi18CXsKLXwJICBiZmQgKmFiZmQ7Ci18CSAgYXN5bWJvbCAqcHRyc1syXTsKLXwJICBhc3ltYm9sICpuZXc7Ci18Ci18CSAgYWJmZCA9IGJmZF9vcGVudygiZm9vIiwiYS5vdXQtc3Vub3MtYmlnIik7Ci18CSAgYmZkX3NldF9mb3JtYXQoYWJmZCwgYmZkX29iamVjdCk7Ci18CSAgbmV3ID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotfAkgIG5ldy0+bmFtZSA9ICJkdW1teV9zeW1ib2wiOwotfAkgIG5ldy0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheShhYmZkLCAiLnRleHQiKTsKLXwJICBuZXctPmZsYWdzID0gQlNGX0dMT0JBTDsKLXwJICBuZXctPnZhbHVlID0gMHgxMjM0NTsKLXwKLXwJICBwdHJzWzBdID0gbmV3OwotfAkgIHB0cnNbMV0gPSAoYXN5bWJvbCAqKTA7Ci18Ci18CSAgYmZkX3NldF9zeW10YWIoYWJmZCwgcHRycywgMSk7Ci18CSAgYmZkX2Nsb3NlKGFiZmQpOwotfAl9Ci18Ci18CS4vbWFrZXN5bQotfAlubSBmb28KLXwJMDAwMTIzNDUgQSBkdW1teV9zeW1ib2wKLQotCU1hbnkgZm9ybWF0cyBjYW5ub3QgcmVwcmVzZW50IGFyYml0YXJ5IHN5bWJvbCBpbmZvcm1hdGlvbjsgZm9yCi0gCWluc3RhbmNlLCB0aGUgPDxhLm91dD4+IG9iamVjdCBmb3JtYXQgZG9lcyBub3QgYWxsb3cgYW4KLQlhcmJpdGFyeSBudW1iZXIgb2Ygc2VjdGlvbnMuIEEgc3ltYm9sIHBvaW50aW5nIHRvIGEgc2VjdGlvbgotCXdoaWNoIGlzIG5vdCBvbmUgIG9mIDw8LnRleHQ+PiwgPDwuZGF0YT4+IG9yIDw8LmJzcz4+IGNhbm5vdAotCWJlIGRlc2NyaWJlZC4KLQotSU5PREUKLU1pbmkgU3ltYm9scywgdHlwZWRlZiBhc3ltYm9sLCBXcml0aW5nIFN5bWJvbHMsIFN5bWJvbHMKLVNVQlNFQ1RJT04KLQlNaW5pIFN5bWJvbHMKLQotCU1pbmkgc3ltYm9scyBwcm92aWRlIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQlUaGV5IHVzZSBsZXNzIG1lbW9yeSBzcGFjZSwgYnV0IHJlcXVpcmUgbW9yZSB0aW1lIHRvIGFjY2Vzcy4KLQlUaGV5IGNhbiBiZSB1c2VmdWwgZm9yIHRvb2xzIGxpa2Ugbm0gb3Igb2JqZHVtcCwgd2hpY2ggbWF5Ci0JaGF2ZSB0byBoYW5kbGUgc3ltYm9sIHRhYmxlcyBvZiBleHRyZW1lbHkgbGFyZ2UgZXhlY3V0YWJsZXMuCi0KLQlUaGUgPDxiZmRfcmVhZF9taW5pc3ltYm9scz4+IGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgc3ltYm9scwotCWludG8gbWVtb3J5IGluIGFuIGludGVybmFsIGZvcm0uICBJdCB3aWxsIHJldHVybiBhIDw8dm9pZCAqPj4KLQlwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5LCBhIHN5bWJvbCBjb3VudCwgYW5kIHRoZSBzaXplIG9mCi0JZWFjaCBzeW1ib2wuICBUaGUgcG9pbnRlciBpcyBhbGxvY2F0ZWQgdXNpbmcgPDxtYWxsb2M+PiwgYW5kCi0Jc2hvdWxkIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgotCi0JVGhlIGZ1bmN0aW9uIDw8YmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sPj4gd2lsbCB0YWtlIGEgcG9pbnRlcgotCXRvIGEgbWluaXN5bWJvbCwgYW5kIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSByZXR1cm5lZCBieQotCTw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4sIGFuZCByZXR1cm4gYSA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUuCi0JVGhlIHJldHVybiB2YWx1ZSBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgZnJvbQotCTw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4gd2hpY2ggd2FzIHBhc3NlZCBpbi4KLQotKi8KLQotCi0KLS8qCi1ET0NERAotSU5PREUKLXR5cGVkZWYgYXN5bWJvbCwgc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucywgTWluaSBTeW1ib2xzLCBTeW1ib2xzCi0KLSovCi0vKgotU1VCU0VDVElPTgotCXR5cGVkZWYgYXN5bWJvbAotCi0JQW4gPDxhc3ltYm9sPj4gaGFzIHRoZSBmb3JtOgotCi0qLwotCi0vKgotQ09ERV9GUkFHTUVOVAotCi0uCi0udHlwZWRlZiBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Ci0uewotLgl7KiBBIHBvaW50ZXIgdG8gdGhlIEJGRCB3aGljaCBvd25zIHRoZSBzeW1ib2wuIFRoaXMgaW5mb3JtYXRpb24KLS4JICAgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgYSBiYWNrIGVuZCBjYW4gd29yayBvdXQgd2hhdCBhZGRpdGlvbmFsCi0uICAgCSAgIGluZm9ybWF0aW9uIChpbnZpc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uIHdyaXRlcikgaXMgY2FycmllZAotLgkgICB3aXRoIHRoZSBzeW1ib2wuCi0uCi0uCSAgIFRoaXMgZmllbGQgaXMgKmFsbW9zdCogcmVkdW5kYW50LCBzaW5jZSB5b3UgY2FuIHVzZSBzZWN0aW9uLT5vd25lcgotLgkgICBpbnN0ZWFkLCBleGNlcHQgdGhhdCBzb21lIHN5bWJvbHMgcG9pbnQgdG8gdGhlIGdsb2JhbCBzZWN0aW9ucwotLgkgICBiZmRfe2Ficyxjb20sdW5kfV9zZWN0aW9uLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBtYWtpbmcKLS4JICAgdGhlc2UgZ2xvYmFscyBiZSBwZXItYmZkIChvciBwZXItdGFyZ2V0LWZsYXZvcikuICBGSVhNRS4gKn0KLS4KLS4gIHN0cnVjdCBfYmZkICp0aGVfYmZkOyB7KiBVc2UgYmZkX2FzeW1ib2xfYmZkKHN5bSkgdG8gYWNjZXNzIHRoaXMgZmllbGQuICp9Ci0uCi0uCXsqIFRoZSB0ZXh0IG9mIHRoZSBzeW1ib2wuIFRoZSBuYW1lIGlzIGxlZnQgYWxvbmUsIGFuZCBub3QgY29waWVkOyB0aGUKLS4JICAgYXBwbGljYXRpb24gbWF5IG5vdCBhbHRlciBpdC4gKn0KLS4gIENPTlNUIGNoYXIgKm5hbWU7Ci0uCi0uCXsqIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgdW5pb24gb2YgYQotLiAgICAgICAgICBudW1lcmljIHZhbHVlIHdpdGggYSBwb2ludGVyLCBzaW5jZSBzb21lIGZsYWdzIGluZGljYXRlIHRoYXQKLS4gICAgICAgICAgYSBwb2ludGVyIHRvIGFub3RoZXIgc3ltYm9sIGlzIHN0b3JlZCBoZXJlLiAgKn0KLS4gIHN5bXZhbHVlIHZhbHVlOwotLgotLgl7KiBBdHRyaWJ1dGVzIG9mIGEgc3ltYm9sOiAqfQotLgotLiNkZWZpbmUgQlNGX05PX0ZMQUdTICAgIDB4MDAKLS4KLS4JeyogVGhlIHN5bWJvbCBoYXMgbG9jYWwgc2NvcGU7IDw8c3RhdGljPj4gaW4gPDxDPj4uIFRoZSB2YWx1ZQotLiAJICAgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQotLiNkZWZpbmUgQlNGX0xPQ0FMCTB4MDEKLS4KLS4JeyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlOyBpbml0aWFsaXplZCBkYXRhIGluIDw8Qz4+LiBUaGUKLS4JICAgdmFsdWUgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQotLiNkZWZpbmUgQlNGX0dMT0JBTAkweDAyCi0uCi0uCXsqIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZSBhbmQgaXMgZXhwb3J0ZWQuIFRoZSB2YWx1ZSBpcwotLgkgICB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICp9Ci0uI2RlZmluZSBCU0ZfRVhQT1JUCUJTRl9HTE9CQUwgeyogbm8gcmVhbCBkaWZmZXJlbmNlICp9Ci0uCi0uCXsqIEEgbm9ybWFsIEMgc3ltYm9sIHdvdWxkIGJlIG9uZSBvZjoKLS4JICAgPDxCU0ZfTE9DQUw+PiwgPDxCU0ZfRk9SVF9DT01NPj4sICA8PEJTRl9VTkRFRklORUQ+PiBvcgotLgkgICA8PEJTRl9HTE9CQUw+PiAqfQotLgotLgl7KiBUaGUgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHJlY29yZC4gVGhlIHZhbHVlIGhhcyBhbiBhcmJpdGFyeQotLgkgICBtZWFuaW5nLCB1bmxlc3MgQlNGX0RFQlVHR0lOR19SRUxPQyBpcyBhbHNvIHNldC4gICp9Ci0uI2RlZmluZSBCU0ZfREVCVUdHSU5HCTB4MDgKLS4KLS4JeyogVGhlIHN5bWJvbCBkZW5vdGVzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQuICBVc2VkIGluIEVMRiwKLS4JICAgcGVyaGFwcyBvdGhlcnMgc29tZWRheS4gICp9Ci0uI2RlZmluZSBCU0ZfRlVOQ1RJT04gICAgMHgxMAotLgotLgl7KiBVc2VkIGJ5IHRoZSBsaW5rZXIuICp9Ci0uI2RlZmluZSBCU0ZfS0VFUCAgICAgICAgMHgyMAotLiNkZWZpbmUgQlNGX0tFRVBfRyAgICAgIDB4NDAKLS4KLS4JeyogQSB3ZWFrIGdsb2JhbCBzeW1ib2wsIG92ZXJyaWRhYmxlIHdpdGhvdXQgd2FybmluZ3MgYnkKLS4JICAgYSByZWd1bGFyIGdsb2JhbCBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZS4gICp9Ci0uI2RlZmluZSBCU0ZfV0VBSyAgICAgICAgMHg4MAotLgotLiAgICAgICB7KiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCB0byBwb2ludCB0byBhIHNlY3Rpb24sIGUuZy4gRUxGJ3MKLS4JICAgU1RUX1NFQ1RJT04gc3ltYm9scy4gICp9Ci0uI2RlZmluZSBCU0ZfU0VDVElPTl9TWU0gMHgxMDAKLS4KLS4JeyogVGhlIHN5bWJvbCB1c2VkIHRvIGJlIGEgY29tbW9uIHN5bWJvbCwgYnV0IG5vdyBpdCBpcwotLgkgICBhbGxvY2F0ZWQuICp9Ci0uI2RlZmluZSBCU0ZfT0xEX0NPTU1PTiAgMHgyMDAKLS4KLS4JeyogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGNvbW1vbiBkYXRhLiAqfQotLiNkZWZpbmUgQkZEX0ZPUlRfQ09NTV9ERUZBVUxUX1ZBTFVFIDAKLS4KLS4JeyogSW4gc29tZSBmaWxlcyB0aGUgdHlwZSBvZiBhIHN5bWJvbCBzb21ldGltZXMgYWx0ZXJzIGl0cwotLgkgICBsb2NhdGlvbiBpbiBhbiBvdXRwdXQgZmlsZSAtIGllIGluIGNvZmYgYSA8PElTRkNOPj4gc3ltYm9sCi0uCSAgIHdoaWNoIGlzIGFsc28gPDxDX0VYVD4+IHN5bWJvbCBhcHBlYXJzIHdoZXJlIGl0IHdhcwotLgkgICBkZWNsYXJlZCBhbmQgbm90IGF0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgVGhpcyBiaXQgaXMgc2V0Ci0uICAJICAgYnkgdGhlIHRhcmdldCBCRkQgcGFydCB0byBjb252ZXkgdGhpcyBpbmZvcm1hdGlvbi4gKn0KLS4KLS4jZGVmaW5lIEJTRl9OT1RfQVRfRU5EICAgIDB4NDAwCi0uCi0uCXsqIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgdGhlIGxhYmVsIG9mIGNvbnN0cnVjdG9yIHNlY3Rpb24uICp9Ci0uI2RlZmluZSBCU0ZfQ09OU1RSVUNUT1IgICAweDgwMAotLgotLgl7KiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIGEgd2FybmluZyBzeW1ib2wuICBUaGUgbmFtZSBpcyBhCi0uCSAgIHdhcm5pbmcuICBUaGUgbmFtZSBvZiB0aGUgbmV4dCBzeW1ib2wgaXMgdGhlIG9uZSB0byB3YXJuIGFib3V0OwotLgkgICBpZiBhIHJlZmVyZW5jZSBpcyBtYWRlIHRvIGEgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgbmV4dAotLgkgICBzeW1ib2wsIGEgd2FybmluZyBpcyBpc3N1ZWQgYnkgdGhlIGxpbmtlci4gKn0KLS4jZGVmaW5lIEJTRl9XQVJOSU5HICAgICAgIDB4MTAwMAotLgotLgl7KiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIGluZGlyZWN0LiAgVGhpcyBzeW1ib2wgaXMgYW4gaW5kaXJlY3QKLS4JICAgcG9pbnRlciB0byB0aGUgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgbmV4dCBzeW1ib2wuICp9Ci0uI2RlZmluZSBCU0ZfSU5ESVJFQ1QgICAgICAweDIwMDAKLS4KLS4JeyogQlNGX0ZJTEUgbWFya3Mgc3ltYm9scyB0aGF0IGNvbnRhaW4gYSBmaWxlIG5hbWUuICBUaGlzIGlzIHVzZWQKLS4JICAgZm9yIEVMRiBTVFRfRklMRSBzeW1ib2xzLiAgKn0KLS4jZGVmaW5lIEJTRl9GSUxFICAgICAgICAgIDB4NDAwMAotLgotLgl7KiBTeW1ib2wgaXMgZnJvbSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqfQotLiNkZWZpbmUgQlNGX0RZTkFNSUMJICAgMHg4MDAwCi0uCi0uICAgICAgIHsqIFRoZSBzeW1ib2wgZGVub3RlcyBhIGRhdGEgb2JqZWN0LiAgVXNlZCBpbiBFTEYsIGFuZCBwZXJoYXBzCi0uICAgICAgICAgIG90aGVycyBzb21lZGF5LiAgKn0KLS4jZGVmaW5lIEJTRl9PQkpFQ1QJICAgMHgxMDAwMAotLgotLiAgICAgICB7KiBUaGlzIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyBzeW1ib2wuICBUaGUgdmFsdWUgaXMgdGhlIG9mZnNldAotLiAgICAgICAgICBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAgQlNGX0RFQlVHR0lORyBzaG91bGQgYmUgc2V0Ci0uICAgICAgICAgIGFzIHdlbGwuICAqfQotLiNkZWZpbmUgQlNGX0RFQlVHR0lOR19SRUxPQyAweDIwMDAwCi0uCi0uICBmbGFnd29yZCBmbGFnczsKLS4KLS4JeyogQSBwb2ludGVyIHRvIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoaXMgc3ltYm9sIGlzCi0uCSAgIHJlbGF0aXZlLiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBub24gTlVMTCwgdGhlcmUgYXJlIHNwZWNpYWwKLS4gICAgICAgICAgc2VjdGlvbnMgZm9yIHVuZGVmaW5lZCBhbmQgYWJzb2x1dGUgc3ltYm9scy4gICp9Ci0uICBzdHJ1Y3Qgc2VjICpzZWN0aW9uOwotLgotLgl7KiBCYWNrIGVuZCBzcGVjaWFsIGRhdGEuICAqfQotLiAgdW5pb24KLS4gICAgewotLiAgICAgIFBUUiBwOwotLiAgICAgIGJmZF92bWEgaTsKLS4gICAgfSB1ZGF0YTsKLS4KLS59IGFzeW1ib2w7Ci0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotc3RhdGljIGNoYXIgY29mZl9zZWN0aW9uX3R5cGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qCi1ET0NERAotSU5PREUKLXN5bWJvbCBoYW5kbGluZyBmdW5jdGlvbnMsICAsIHR5cGVkZWYgYXN5bWJvbCwgU3ltYm9scwotU1VCU0VDVElPTgotCVN5bWJvbCBoYW5kbGluZyBmdW5jdGlvbnMKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYSB2ZWN0b3Igb2YgcG9pbnRlcnMKLQl0byA8PGFzeW1ib2xzPj4gZm9yIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0sCi0JaW5jbHVkaW5nIGEgdGVybWluYWwgTlVMTCBwb2ludGVyLiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBpbgotCXRoZSBCRkQsIHRoZW4gcmV0dXJuIDAuICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4KLQotLiNkZWZpbmUgYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQoYWJmZCkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfaXNfbG9jYWxfbGFiZWwKLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfaXNfbG9jYWxfbGFiZWwoYmZkICphYmZkLCBhc3ltYm9sICpzeW0pOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzeW1ib2wgQHZhcntzeW19IGluIHRoZSBCRkQgQHZhcnthYmZkfSBpcwotCWEgY29tcGlsZXIgZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLCBlbHNlIHJldHVybiBmYWxzZS4KLSovCi0KLWJvb2xlYW4KLWJmZF9pc19sb2NhbF9sYWJlbCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoc3ltLT5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIHN5bS0+bmFtZSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0KLVNZTk9QU0lTCi0gICAgICAgIGJvb2xlYW4gYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoYmZkICphYmZkLCBjb25zdCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdHJ1ZSBpZiBhIHN5bWJvbCB3aXRoIHRoZSBuYW1lIEB2YXJ7bmFtZX0gaW4gdGhlIEJGRAotCUB2YXJ7YWJmZH0gaXMgYSBjb21waWxlciBnZW5lcmF0ZWQgbG9jYWwgbGFiZWwsIGVsc2UgcmV0dXJuCi0JZmFsc2UuICBUaGlzIGp1c3QgY2hlY2tzIHdoZXRoZXIgdGhlIG5hbWUgaGFzIHRoZSBmb3JtIG9mIGEKLQlsb2NhbCBsYWJlbC4KLQotLiNkZWZpbmUgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoYWJmZCwgbmFtZSkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSwgKGFiZmQsIG5hbWUpKQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIKLQotREVTQ1JJUFRJT04KLQlSZWFkIHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRCBAdmFye2FiZmR9LCBhbmQgZmlsbHMgaW4KLQl0aGUgdmVjdG9yIEB2YXJ7bG9jYXRpb259IHdpdGggcG9pbnRlcnMgdG8gdGhlIHN5bWJvbHMgYW5kCi0JYSB0cmFpbGluZyBOVUxMLgotCVJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiBzeW1ib2wgcG9pbnRlcnMsIG5vdAotCWluY2x1ZGluZyB0aGUgTlVMTC4KLQotCi0uI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYihhYmZkLCBsb2NhdGlvbikgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX3N5bXRhYixcCi0uICAgICAgICAgICAgICAgICAgKGFiZmQsIGxvY2F0aW9uKSkKLQotKi8KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3N5bXRhYgotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9zeW10YWIgKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uLCB1bnNpZ25lZCBpbnQgY291bnQpOwotCi1ERVNDUklQVElPTgotCUFycmFuZ2UgdGhhdCB3aGVuIHRoZSBvdXRwdXQgQkZEIEB2YXJ7YWJmZH0gaXMgY2xvc2VkLAotCXRoZSB0YWJsZSBAdmFye2xvY2F0aW9ufSBvZiBAdmFye2NvdW50fSBwb2ludGVycyB0byBzeW1ib2xzCi0Jd2lsbCBiZSB3cml0dGVuLgotKi8KLQotYm9vbGVhbgotYmZkX3NldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci0gICAgIHVuc2lnbmVkIGludCBzeW1jb3VudDsKLXsKLSAgaWYgKChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkgfHwgKGJmZF9yZWFkX3AgKGFiZmQpKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID0gbG9jYXRpb247Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltY291bnQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKFBUUiBmaWxlLCBhc3ltYm9sICpzeW1ib2wpOwotCi1ERVNDUklQVElPTgotCVByaW50IHRoZSB2YWx1ZSBhbmQgZmxhZ3Mgb2YgdGhlIEB2YXJ7c3ltYm9sfSBzdXBwbGllZCB0byB0aGUKLQlzdHJlYW0gQHZhcntmaWxlfS4KLSovCi12b2lkCi1iZmRfcHJpbnRfc3ltYm9sX3ZhbmRmIChhcmcsIHN5bWJvbCkKLSAgICAgUFRSIGFyZzsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYXJnOwotICBmbGFnd29yZCB0eXBlID0gc3ltYm9sLT5mbGFnczsKLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgc3ltYm9sLT52YWx1ZSArIHN5bWJvbC0+c2VjdGlvbi0+dm1hKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgc3ltYm9sLT52YWx1ZSk7Ci0gICAgfQotCi0gIC8qIFRoaXMgcHJlc3VtZXMgdGhhdCBhIHN5bWJvbCBjYW4gbm90IGJlIGJvdGggQlNGX0RFQlVHR0lORyBhbmQKLSAgICAgQlNGX0RZTkFNSUMsIG5vciBtb3JlIHRoYW4gb25lIG9mIEJTRl9GVU5DVElPTiwgQlNGX0ZJTEUsIGFuZAotICAgICBCU0ZfT0JKRUNULiAgKi8KLSAgZnByaW50ZiAoZmlsZSwgIiAlYyVjJWMlYyVjJWMlYyIsCi0JICAgKCh0eXBlICYgQlNGX0xPQ0FMKQotCSAgICA/ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnIScgOiAnbCcKLQkgICAgOiAodHlwZSAmIEJTRl9HTE9CQUwpID8gJ2cnIDogJyAnKSwKLQkgICAodHlwZSAmIEJTRl9XRUFLKSA/ICd3JyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9DT05TVFJVQ1RPUikgPyAnQycgOiAnICcsCi0JICAgKHR5cGUgJiBCU0ZfV0FSTklORykgPyAnVycgOiAnICcsCi0JICAgKHR5cGUgJiBCU0ZfSU5ESVJFQ1QpID8gJ0knIDogJyAnLAotCSAgICh0eXBlICYgQlNGX0RFQlVHR0lORykgPyAnZCcgOiAodHlwZSAmIEJTRl9EWU5BTUlDKSA/ICdEJyA6ICcgJywKLQkgICAoKHR5cGUgJiBCU0ZfRlVOQ1RJT04pCi0JICAgID8gJ0YnCi0JICAgIDogKCh0eXBlICYgQlNGX0ZJTEUpCi0JICAgICAgID8gJ2YnCi0JICAgICAgIDogKCh0eXBlICYgQlNGX09CSkVDVCkgPyAnTycgOiAnICcpKSkpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX2VtcHR5X3N5bWJvbAotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUgZm9yIHRoZSBCRkQgQHZhcnthYmZkfQotCWFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotCi0JVGhpcyByb3V0aW5lIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGVhY2ggYmFjayBlbmQgaGFzIHByaXZhdGUKLQlpbmZvcm1hdGlvbiBzdXJyb3VuZGluZyB0aGUgPDxhc3ltYm9sPj4uIEJ1aWxkaW5nIHlvdXIgb3duCi0JPDxhc3ltYm9sPj4gYW5kIHBvaW50aW5nIHRvIGl0IHdpbGwgbm90IGNyZWF0ZSB0aGUgcHJpdmF0ZQotCWluZm9ybWF0aW9uLCBhbmQgd2lsbCBjYXVzZSBwcm9ibGVtcyBsYXRlciBvbi4KLQotLiNkZWZpbmUgYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZW1wdHlfc3ltYm9sLCAoYWJmZCkpCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBuZXcgPDxhc3ltYm9sPj4gc3RydWN0dXJlIGZvciB0aGUgQkZEIEB2YXJ7YWJmZH0sCi0JdG8gYmUgdXNlZCBhcyBhIGRlYnVnZ2luZyBzeW1ib2wuICBGdXJ0aGVyIGRldGFpbHMgb2YgaXRzIHVzZSBoYXZlCi0JeWV0IHRvIGJlIHdvcmtlZCBvdXQuCi0KLS4jZGVmaW5lIGJmZF9tYWtlX2RlYnVnX3N5bWJvbChhYmZkLHB0cixzaXplKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCwgKGFiZmQsIHB0ciwgc2l6ZSkpCi0qLwotCi1zdHJ1Y3Qgc2VjdGlvbl90b190eXBlCi17Ci0gIENPTlNUIGNoYXIgKnNlY3Rpb247Ci0gIGNoYXIgdHlwZTsKLX07Ci0KLS8qIE1hcCBzZWN0aW9uIG5hbWVzIHRvIFBPU0lYL0JTRCBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCB0eXBlcy4KLSAgIFRoaXMgdGFibGUgaXMgcHJvYmFibHkgaW5jb21wbGV0ZS4gIEl0IGlzIHNvcnRlZCBmb3IgY29udmVuaWVuY2Ugb2YKLSAgIGFkZGluZyBlbnRyaWVzLiAgU2luY2UgaXQgaXMgc28gc2hvcnQsIGEgbGluZWFyIHNlYXJjaCBpcyB1c2VkLiAgKi8KLXN0YXRpYyBDT05TVCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlIHN0dFtdID0KLXsKLSAgeyIqREVCVUcqIiwgJ04nfSwKLSAgeyIuYnNzIiwgJ2InfSwKLSAgeyJ6ZXJvdmFycyIsICdiJ30sCQkvKiBNUkkgLmJzcyAqLwotICB7Ii5kYXRhIiwgJ2QnfSwKLSAgeyJ2YXJzIiwgJ2QnfSwJCS8qIE1SSSAuZGF0YSAqLwotICB7Ii5yZGF0YSIsICdyJ30sCQkvKiBSZWFkIG9ubHkgZGF0YS4gICovCi0gIHsiLnJvZGF0YSIsICdyJ30sCQkvKiBSZWFkIG9ubHkgZGF0YS4gICovCi0gIHsiLnNic3MiLCAncyd9LAkJLyogU21hbGwgQlNTICh1bmluaXRpYWxpemVkIGRhdGEpLiAgKi8KLSAgeyIuc2NvbW1vbiIsICdjJ30sCQkvKiBTbWFsbCBjb21tb24uICAqLwotICB7Ii5zZGF0YSIsICdnJ30sCQkvKiBTbWFsbCBpbml0aWFsaXplZCBkYXRhLiAgKi8KLSAgeyIudGV4dCIsICd0J30sCi0gIHsiY29kZSIsICd0J30sCQkvKiBNUkkgLnRleHQgKi8KLSAgeyIuZHJlY3R2ZSIsICdpJ30sICAgICAgICAgICAgLyogTVNWQydzIC5kcmVjdGl2ZSBzZWN0aW9uICovCi0gIHsiLmlkYXRhIiwgJ2knfSwgICAgICAgICAgICAgIC8qIE1TVkMncyAuaWRhdGEgKGltcG9ydCkgc2VjdGlvbiAqLwotICB7Ii5lZGF0YSIsICdlJ30sICAgICAgICAgICAgICAvKiBNU1ZDJ3MgLmVkYXRhIChleHBvcnQpIHNlY3Rpb24gKi8KLSAgeyIucGRhdGEiLCAncCd9LCAgICAgICAgICAgICAgLyogTVNWQydzIC5wZGF0YSAoc3RhY2sgdW53aW5kKSBzZWN0aW9uICovCi0gIHsiLmRlYnVnIiwgJ04nfSwgICAgICAgICAgICAgIC8qIE1TVkMncyAuZGVidWcgKG5vbi1zdGFuZGFyZCBkZWJ1ZyBzeW1zKSAqLwotICB7MCwgMH0KLX07Ci0KLS8qIFJldHVybiB0aGUgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgdHlwZSBjb3JyZXNwb25kaW5nIHRvCi0gICBzZWN0aW9uIFMsIG9yICc/JyBmb3IgYW4gdW5rbm93biBDT0ZGIHNlY3Rpb24uICAKLQotICAgQ2hlY2sgZm9yIGFueSBsZWFkaW5nIHN0cmluZyB3aGljaCBtYXRjaGVzLCBzbyAudGV4dDUgcmV0dXJucwotICAgJ3QnIGFzIHdlbGwgYXMgLnRleHQgKi8KLQotc3RhdGljIGNoYXIKLWNvZmZfc2VjdGlvbl90eXBlIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBDT05TVCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlICp0OwotCi0gIGZvciAodCA9ICZzdHRbMF07IHQtPnNlY3Rpb247IHQrKykgCi0gICAgaWYgKCFzdHJuY21wIChzLCB0LT5zZWN0aW9uLCBzdHJsZW4gKHQtPnNlY3Rpb24pKSkKLSAgICAgIHJldHVybiB0LT50eXBlOwotCi0gIHJldHVybiAnPyc7Ci19Ci0KLSNpZm5kZWYgaXNsb3dlcgotI2RlZmluZSBpc2xvd2VyKGMpICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpCi0jZW5kaWYKLSNpZm5kZWYgdG91cHBlcgotI2RlZmluZSB0b3VwcGVyKGMpIChpc2xvd2VyKGMpID8gKChjKSAmIH4weDIwKSA6IChjKSkKLSNlbmRpZgotCi0vKgotRlVOQ1RJT04KLQliZmRfZGVjb2RlX3N5bWNsYXNzCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN5bWJvbAotCWNsYXNzIG9mIEB2YXJ7c3ltYm9sfSwgb3IgJz8nIGZvciBhbiB1bmtub3duIGNsYXNzLgotCi1TWU5PUFNJUwotCWludCBiZmRfZGVjb2RlX3N5bWNsYXNzKGFzeW1ib2wgKnN5bWJvbCk7Ci0qLwotaW50Ci1iZmRfZGVjb2RlX3N5bWNsYXNzIChzeW1ib2wpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgY2hhciBjOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdDJzsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKQotCXsKLQkgIC8qIElmIHdlYWssIGRldGVybWluZSBpZiBpdCdzIHNwZWNpZmljYWxseSBhbiBvYmplY3QKLQkgICAgIG9yIG5vbi1vYmplY3Qgd2Vhay4gICovCi0JICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9PQkpFQ1QpCi0JICAgIHJldHVybiAndic7Ci0JICBlbHNlCi0JICAgIHJldHVybiAndyc7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAnVSc7Ci0gICAgfQotICBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnSSc7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCi0gICAgewotICAgICAgLyogSWYgd2VhaywgZGV0ZXJtaW5lIGlmIGl0J3Mgc3BlY2lmaWNhbGx5IGFuIG9iamVjdAotCSBvciBub24tb2JqZWN0IHdlYWsuICAqLwotICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfT0JKRUNUKQotCXJldHVybiAnVic7Ci0gICAgICBlbHNlCi0JcmV0dXJuICdXJzsKLSAgICB9Ci0gIGlmICghKHN5bWJvbC0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9MT0NBTCkpKQotICAgIHJldHVybiAnPyc7Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICBjID0gJ2EnOwotICBlbHNlIGlmIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgYyA9IGNvZmZfc2VjdGlvbl90eXBlIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUpOwotICBlbHNlCi0gICAgcmV0dXJuICc/JzsKLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotICAgIGMgPSB0b3VwcGVyIChjKTsKLSAgcmV0dXJuIGM7Ci0KLSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBoYW5kbGUgdGhlc2UgY2FzZXMganVzdCB5ZXQsIGJ1dCB3ZSB3aWxsIHNvb246Ci0gICAgIE5fU0VUVjogJ3YnOwotICAgICBOX1NFVEE6ICdsJzsKLSAgICAgTl9TRVRUOiAneCc7Ci0gICAgIE5fU0VURDogJ3onOwotICAgICBOX1NFVEI6ICdzJzsKLSAgICAgTl9JTkRSOiAnaSc7Ci0gICAgICovCi19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9pc191bmRlZmluZWRfc3ltY2xhc3MgCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyBub24temVybyBpZiB0aGUgY2xhc3Mgc3ltYm9sIHJldHVybmVkIGJ5Ci0JYmZkX2RlY29kZV9zeW1jbGFzcyByZXByZXNlbnRzIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0JUmV0dXJucyB6ZXJvIG90aGVyd2lzZS4KLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9pc191bmRlZmluZWRfc3ltY2xhc3MgKGludCBzeW1jbGFzcyk7Ci0qLwotCi1ib29sZWFuCi1iZmRfaXNfdW5kZWZpbmVkX3N5bWNsYXNzIChzeW1jbGFzcykKLSAgICAgaW50IHN5bWNsYXNzOwotewotICByZXR1cm4gc3ltY2xhc3MgPT0gJ1UnIHx8IHN5bWNsYXNzID09ICd3JyB8fCBzeW1jbGFzcyA9PSAndic7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zeW1ib2xfaW5mbwotCi1ERVNDUklQVElPTgotCUZpbGwgaW4gdGhlIGJhc2ljIGluZm8gYWJvdXQgc3ltYm9sIHRoYXQgbm0gbmVlZHMuCi0JQWRkaXRpb25hbCBpbmZvIG1heSBiZSBhZGRlZCBieSB0aGUgYmFjay1lbmRzIGFmdGVyCi0JY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3N5bWJvbF9pbmZvKGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCk7Ci0qLwotCi12b2lkCi1iZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIHJldC0+dHlwZSA9IGJmZF9kZWNvZGVfc3ltY2xhc3MgKHN5bWJvbCk7Ci0gIAotICBpZiAoYmZkX2lzX3VuZGVmaW5lZF9zeW1jbGFzcyAocmV0LT50eXBlKSkKLSAgICByZXQtPnZhbHVlID0gMDsKLSAgZWxzZQotICAgIHJldC0+dmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWE7Ci0gIAotICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pOwotCi1ERVNDUklQVElPTgotCUNvcHkgcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzeW19IGluIHRoZSBCRkQKLQlAdmFye2liZmR9IHRvIHRoZSBzeW1ib2wgQHZhcntvc3ltfSBpbiB0aGUgQkZEIEB2YXJ7b2JmZH0uCi0JUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvc2VjfS4KLQotLiNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSBcCi0uICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEsIFwKLS4JCShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSkKLQotKi8KLQotLyogVGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBtaW5pIHN5bWJvbHMuCi0gICBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYmFja2VuZCBkb2VzIG5vdCBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKLSAgIHZlcnNpb24uICBJdCBqdXN0IHVzZXMgQkZEIGFzeW1ib2wgc3RydWN0dXJlcyBhcyBtaW5pIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiAqbWluaXN5bXNwOwotICAgICB1bnNpZ25lZCBpbnQgKnNpemVwOwotewotICBsb25nIHN0b3JhZ2U7Ci0gIGFzeW1ib2wgKipzeW1zID0gTlVMTDsKLSAgbG9uZyBzeW1jb3VudDsKLQotICBpZiAoZHluYW1pYykKLSAgICBzdG9yYWdlID0gYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzdG9yYWdlKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoZHluYW1pYykKLSAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5bXMpOwotICBlbHNlCi0gICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgKm1pbmlzeW1zcCA9IChQVFIpIHN5bXM7Ci0gICpzaXplcCA9IHNpemVvZiAoYXN5bWJvbCAqKTsKLSAgcmV0dXJuIHN5bWNvdW50OwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKHN5bXMpOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIFRoZSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGEgbWluaXN5bWJvbCB0bwotICAgYW4gYXN5bWJvbC4gIFdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBzeW0gYXJndW1lbnQgd2UgYXJlIHBhc3NlZDsKLSAgIHdlIGp1c3QgcmV0dXJuIHRoZSBhc3ltYm9sIHRoZSBtaW5pc3ltYm9sIHBvaW50cyB0by4gICovCi0KLS8qQVJHU1VTRUQqLwotYXN5bWJvbCAqCi1fYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBQVFIgbWluaXN5bTsKLSAgICAgYXN5bWJvbCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAqKGFzeW1ib2wgKiopIG1pbmlzeW07Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gLnN0YWIgYW5kIC5zdGFic3RyCi0gICBzZWN0aW9ucyB0byBmaW5kIHRoZSBzb3VyY2UgZmlsZSBhbmQgbGluZSBjbG9zZXN0IHRvIGEgZGVzaXJlZAotICAgbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgYnkgQ09GRiBhbmQgRUxGIHRhcmdldHMuICBJdCBzZXRzICpwZm91bmQKLSAgIHRvIHRydWUgaWYgaXQgZmluZHMgc29tZSBpbmZvcm1hdGlvbi4gIFRoZSAqcGluZm8gZmllbGQgaXMgdXNlZCB0bwotICAgcGFzcyBjYWNoZWQgaW5mb3JtYXRpb24gaW4gYW5kIG91dCBvZiB0aGlzIHJvdXRpbmU7IHRoaXMgZmlyc3QgdGltZQotICAgdGhlIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBhIEJGRCwgKnBpbmZvIHNob3VsZCBiZSBOVUxMLiAgVGhlIHZhbHVlCi0gICBwbGFjZWQgaW4gKnBpbmZvIHNob3VsZCBiZSBzYXZlZCB3aXRoIHRoZSBCRkQsIGFuZCBwYXNzZWQgYmFjayBlYWNoCi0gICB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgKi8KLQotLyogV2UgdXNlIGEgY2FjaGUgYnkgZGVmYXVsdC4gICovCi0KLSNkZWZpbmUgRU5BQkxFX0NBQ0hJTkcKLQotLyogV2Uga2VlcCBhbiBhcnJheSBvZiBpbmRleGVudHJ5IHN0cnVjdHVyZXMgdG8gcmVjb3JkIHdoZXJlIGluIHRoZQotICAgc3RhYnMgc2VjdGlvbiB3ZSBzaG91bGQgbG9vayB0byBmaW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBhCi0gICBwYXJ0aWN1bGFyIGFkZHJlc3MuICAqLwotCi1zdHJ1Y3QgaW5kZXhlbnRyeQotewotICBiZmRfdm1hIHZhbDsKLSAgYmZkX2J5dGUgKnN0YWI7Ci0gIGJmZF9ieXRlICpzdHI7Ci0gIGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICBjaGFyICpmaWxlX25hbWU7Ci0gIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci19OwotCi0vKiBDb21wYXJlIHR3byBpbmRleGVudHJ5IHN0cnVjdHVyZXMuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1jbXBpbmRleGVudHJ5IChhLCBiKQotICAgICBjb25zdCBQVFIgKmE7Ci0gICAgIGNvbnN0IFBUUiAqYjsKLXsKLSAgY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKmNvbnRlc3RhbnRBID0gKGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICopIGE7Ci0gIGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICpjb250ZXN0YW50QiA9IChjb25zdCBzdHJ1Y3QgaW5kZXhlbnRyeSAqKSBiOwotCi0gIGlmIChjb250ZXN0YW50QS0+dmFsIDwgY29udGVzdGFudEItPnZhbCkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGNvbnRlc3RhbnRBLT52YWwgPiBjb250ZXN0YW50Qi0+dmFsKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBpcyBzdG9yZWQgaW4gKnBpbmZvLiAgKi8KLQotc3RydWN0IHN0YWJfZmluZF9pbmZvCi17Ci0gIC8qIFRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gIC8qIFRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0cnNlYzsKLSAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKnN0YWJzOwotICAvKiBUaGUgY29udGVudHMgb2YgdGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqc3RyczsKLQotICAvKiBBIHRhYmxlIHRoYXQgaW5kZXhlcyBzdGFicyBieSBtZW1vcnkgYWRkcmVzcy4gICovCi0gIHN0cnVjdCBpbmRleGVudHJ5ICppbmRleHRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kZXh0YWJsZS4gICovCi0gIGludCBpbmRleHRhYmxlc2l6ZTsKLQotI2lmZGVmIEVOQUJMRV9DQUNISU5HCi0gIC8qIENhY2hlZCB2YWx1ZXMgdG8gcmVzdGFydCBxdWlja2x5LiAgKi8KLSAgc3RydWN0IGluZGV4ZW50cnkgKmNhY2hlZF9pbmRleGVudHJ5OwotICBiZmRfdm1hIGNhY2hlZF9vZmZzZXQ7Ci0gIGJmZF9ieXRlICpjYWNoZWRfc3RhYjsKLSAgY2hhciAqY2FjaGVkX2ZpbGVfbmFtZTsKLSNlbmRpZgotCi0gIC8qIFNhdmVkIHB0ciB0byBtYWxsb2MnZWQgZmlsZW5hbWUuICAqLwotICBjaGFyICpmaWxlbmFtZTsKLX07Ci0KLWJvb2xlYW4KLV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsIHBmb3VuZCwKLQkJCQkgICAgIHBmaWxlbmFtZSwgcGZubmFtZSwgcGxpbmUsIHBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gKnBmb3VuZDsKLSAgICAgY29uc3QgY2hhciAqKnBmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBmbm5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCAqcGxpbmU7Ci0gICAgIFBUUiAqcGluZm87Ci17Ci0gIHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBzdGFic2l6ZSwgc3Ryc2l6ZTsKLSAgYmZkX2J5dGUgKnN0YWIsICpzdHI7Ci0gIGJmZF9ieXRlICpsYXN0X3N0YWIgPSBOVUxMOwotICBiZmRfc2l6ZV90eXBlIHN0cm9mZjsKLSAgc3RydWN0IGluZGV4ZW50cnkgKmluZGV4ZW50cnk7Ci0gIGNoYXIgKmRpcmVjdG9yeV9uYW1lLCAqZmlsZV9uYW1lOwotICBpbnQgc2F3X2Z1bjsKLQotICAqcGZvdW5kID0gZmFsc2U7Ci0gICpwZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgKnBmbm5hbWUgPSBOVUxMOwotICAqcGxpbmUgPSAwOwotCi0gIC8qIFN0YWJzIGVudHJpZXMgdXNlIGEgMTIgYnl0ZSBmb3JtYXQ6Ci0gICAgICAgNCBieXRlIHN0cmluZyB0YWJsZSBpbmRleAotICAgICAgIDEgYnl0ZSBzdGFiIHR5cGUKLSAgICAgICAxIGJ5dGUgc3RhYiBvdGhlciBmaWVsZAotICAgICAgIDIgYnl0ZSBzdGFiIGRlc2MgZmllbGQKLSAgICAgICA0IGJ5dGUgc3RhYiB2YWx1ZQotICAgICBGSVhNRTogVGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlIGZvciBhIDY0IGJpdCBvYmplY3QgZm9ybWF0LgotCi0gICAgIFRoZSBzdGFicyBzeW1ib2xzIGFyZSBkaXZpZGVkIGludG8gY29tcGlsYXRpb24gdW5pdHMuICBGb3IgdGhlCi0gICAgIGZpcnN0IGVudHJ5IGluIGVhY2ggdW5pdCwgdGhlIHR5cGUgb2YgMCwgdGhlIHZhbHVlIGlzIHRoZSBsZW5ndGgKLSAgICAgb2YgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhpcyB1bml0LCBhbmQgdGhlIGRlc2MgZmllbGQgaXMgdGhlCi0gICAgIG51bWJlciBvZiBzdGFicyBzeW1ib2xzIGZvciB0aGlzIHVuaXQuICAqLwotCi0jZGVmaW5lIFNUUkRYT0ZGICgwKQotI2RlZmluZSBUWVBFT0ZGICg0KQotI2RlZmluZSBPVEhFUk9GRiAoNSkKLSNkZWZpbmUgREVTQ09GRiAoNikKLSNkZWZpbmUgVkFMT0ZGICg4KQotI2RlZmluZSBTVEFCU0laRSAoMTIpCi0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3RhYl9maW5kX2luZm8gKikgKnBpbmZvOwotICBpZiAoaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChpbmZvLT5zdGFic2VjID09IE5VTEwgfHwgaW5mby0+c3Ryc2VjID09IE5VTEwpCi0JewotCSAgLyogTm8gc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgc3RhYnNpemUgPSBpbmZvLT5zdGFic2VjLT5fcmF3X3NpemU7Ci0gICAgICBzdHJzaXplID0gaW5mby0+c3Ryc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyByZWxvY19zaXplLCByZWxvY19jb3VudDsKLSAgICAgIGFyZWxlbnQgKipyZWxvY192ZWN0b3I7Ci0gICAgICBpbnQgaTsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpmaWxlX25hbWU7Ci0gICAgICBjaGFyICpkaXJlY3RvcnlfbmFtZTsKLSAgICAgIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci0KLSAgICAgIGluZm8gPSAoc3RydWN0IHN0YWJfZmluZF9pbmZvICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqaW5mbyk7Ci0gICAgICBpZiAoaW5mbyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IFdoZW4gdXNpbmcgdGhlIGxpbmtlciAtLXNwbGl0LWJ5LWZpbGUgb3IKLQkgLS1zcGxpdC1ieS1yZWxvYyBvcHRpb25zLCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIC5zdGFiIGFuZAotCSAuc3RhYnN0ciBzZWN0aW9ucyB0byBiZSBzcGxpdC4gIFdlIHNob3VsZCBoYW5kbGUgdGhhdC4gICovCi0KLSAgICAgIGluZm8tPnN0YWJzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFiIik7Ci0gICAgICBpbmZvLT5zdHJzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFic3RyIik7Ci0KLSAgICAgIGlmIChpbmZvLT5zdGFic2VjID09IE5VTEwgfHwgaW5mby0+c3Ryc2VjID09IE5VTEwpCi0JewotCSAgLyogTm8gc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgU2V0ICpwaW5mbyBzbyB0aGF0IHdlCi0gICAgICAgICAgICAgY2FuIHJldHVybiBxdWlja2x5IGluIHRoZSBpbmZvICE9IE5VTEwgY2FzZSBhYm92ZS4gICovCi0JICAqcGluZm8gPSAoUFRSKSBpbmZvOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzdGFic2l6ZSA9IGluZm8tPnN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0cnNpemUgPSBpbmZvLT5zdHJzZWMtPl9yYXdfc2l6ZTsKLQotICAgICAgaW5mby0+c3RhYnMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzdGFic2l6ZSk7Ci0gICAgICBpbmZvLT5zdHJzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgc3Ryc2l6ZSk7Ci0gICAgICBpZiAoaW5mby0+c3RhYnMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGluZm8tPnN0YWJzZWMsIGluZm8tPnN0YWJzLCAwLAotCQkJCSAgICAgIHN0YWJzaXplKQotCSAgfHwgISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGluZm8tPnN0cnNlYywgaW5mby0+c3RycywgMCwKLQkJCQkJIHN0cnNpemUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSwgd2UgaGF2ZSB0byByZWxvY2F0ZQotCSB0aGUgZW50cmllcyBpbiAuc3RhYi4gIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzaW1wbGUgMzIgYml0Ci0JIHJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgb2JqZWN0IGZpbGUsIHNvCi0JIHRoaXMgc2hvdWxkIGJlIG5vIGJpZyBkZWFsLiAgKi8KLSAgICAgIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBpbmZvLT5zdGFic2VjKTsKLSAgICAgIGlmIChyZWxvY19zaXplIDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gICAgICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgaW5mby0+c3RhYnNlYywgcmVsb2NfdmVjdG9yLAotCQkJCQkgICAgc3ltYm9scyk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPCAwKQotCXsKLQkgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLQkgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAocmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGFyZWxlbnQgKipwcjsKLQotCSAgZm9yIChwciA9IHJlbG9jX3ZlY3RvcjsgKnByICE9IE5VTEw7IHByKyspCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICpyOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQotCSAgICAgIHIgPSAqcHI7Ci0JICAgICAgaWYgKHItPmhvd3RvLT5yaWdodHNoaWZ0ICE9IDAKLQkJICB8fCByLT5ob3d0by0+c2l6ZSAhPSAyCi0JCSAgfHwgci0+aG93dG8tPmJpdHNpemUgIT0gMzIKLQkJICB8fCByLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkJICB8fCByLT5ob3d0by0+Yml0cG9zICE9IDAKLQkJICB8fCByLT5ob3d0by0+ZHN0X21hc2sgIT0gMHhmZmZmZmZmZikKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIlVuc3VwcG9ydGVkIC5zdGFiIHJlbG9jYXRpb24iKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkJICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0JCSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgaW5mby0+c3RhYnMgKyByLT5hZGRyZXNzKTsKLQkgICAgICB2YWwgJj0gci0+aG93dG8tPnNyY19tYXNrOwotCSAgICAgIHN5bSA9ICpyLT5zeW1fcHRyX3B0cjsKLQkgICAgICB2YWwgKz0gc3ltLT52YWx1ZSArIHN5bS0+c2VjdGlvbi0+dm1hICsgci0+YWRkZW5kOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgaW5mby0+c3RhYnMgKyByLT5hZGRyZXNzKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotCWZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0KLSAgICAgIC8qIEZpcnN0IHRpbWUgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLCBidWlsZCBhIHRhYmxlIG1hdGNoaW5nCi0JIGZ1bmN0aW9uIFZNIGFkZHJlc3NlcyB0byBzdGFicywgdGhlbiBzb3J0IGJhc2VkIG9uIHN0YXJ0aW5nCi0JIFZNIGFkZHJlc3MuICBEbyB0aGlzIGluIHR3byBwYXNzZXM6IG9uY2UgdG8gY291bnQgaG93IG1hbnkKLQkgdGFibGUgZW50cmllcyB3ZSdsbCBuZWVkLCBhbmQgYSBzZWNvbmQgdG8gYWN0dWFsbHkgYnVpbGQgdGhlCi0JIHRhYmxlLiAgKi8KLQotICAgICAgaW5mby0+aW5kZXh0YWJsZXNpemUgPSAwOwotICAgICAgc2F3X2Z1biA9IDE7Ci0gICAgICBmb3IgKHN0YWIgPSBpbmZvLT5zdGFiczsgc3RhYiA8IGluZm8tPnN0YWJzICsgc3RhYnNpemU7IHN0YWIgKz0gU1RBQlNJWkUpCi0JewotCSAgaWYgKHN0YWJbVFlQRU9GRl0gPT0gTl9TTykKLQkgICAgewotCSAgICAgIC8qIE5fU08gd2l0aCBudWxsIG5hbWUgaW5kaWNhdGVzIEVPRiAqLwotCSAgICAgIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogaWYgd2UgZGlkIG5vdCBzZWUgYSBmdW5jdGlvbiBkZWYsIGxlYXZlIHNwYWNlIGZvciBvbmUuICovCi0JICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkJKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLQotCSAgICAgIHNhd19mdW4gPSAwOwotCi0JICAgICAgLyogdHdvIE5fU08ncyBpbiBhIHJvdyBpcyBhIGZpbGVuYW1lIGFuZCBkaXJlY3RvcnkuIFNraXAgKi8KLQkgICAgICBpZiAoc3RhYiArIFNUQUJTSVpFIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZQotCQkgICYmICooc3RhYiArIFNUQUJTSVpFICsgVFlQRU9GRikgPT0gTl9TTykKLQkJewotCQkgIHN0YWIgKz0gU1RBQlNJWkU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhYltUWVBFT0ZGXSA9PSBOX0ZVTikKLQkgICAgewotCSAgICAgIHNhd19mdW4gPSAxOwotCSAgICAgICsraW5mby0+aW5kZXh0YWJsZXNpemU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzYXdfZnVuID09IDApCi0JKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLSAgICAgIAotICAgICAgaWYgKGluZm8tPmluZGV4dGFibGVzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgICArK2luZm8tPmluZGV4dGFibGVzaXplOwotCi0gICAgICBpbmZvLT5pbmRleHRhYmxlID0gKChzdHJ1Y3QgaW5kZXhlbnRyeSAqKQotCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICAoc2l6ZW9mIChzdHJ1Y3QgaW5kZXhlbnRyeSkKLQkJCQkgICAgICAqIGluZm8tPmluZGV4dGFibGVzaXplKSkpOwotICAgICAgaWYgKGluZm8tPmluZGV4dGFibGUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gICAgICBzYXdfZnVuID0gMTsKLQotICAgICAgZm9yIChpID0gMCwgc3Ryb2ZmID0gMCwgc3RhYiA9IGluZm8tPnN0YWJzLCBzdHIgPSBpbmZvLT5zdHJzOwotCSAgIGkgPCBpbmZvLT5pbmRleHRhYmxlc2l6ZSAmJiBzdGFiIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsKLQkgICBzdGFiICs9IFNUQUJTSVpFKQotCXsKLQkgIHN3aXRjaCAoc3RhYltUWVBFT0ZGXSkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgZW50cnkgaW4gYSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQkgICAgICBpZiAoKGJmZF9zaXplX3R5cGUpICgoaW5mby0+c3RycyArIHN0cnNpemUpIC0gc3RyKSA8IHN0cm9mZikKLQkJYnJlYWs7Ci0JICAgICAgc3RyICs9IHN0cm9mZjsKLQkgICAgICBzdHJvZmYgPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgVkFMT0ZGKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fU086Ci0JICAgICAgLyogVGhlIG1haW4gZmlsZSBuYW1lLiAgKi8KLQotCSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBjcmVhdGVzIGEgbmV3IGluZGV4dGFibGUgZW50cnkgd2l0aAotCSAgICAgICAgIGEgTlVMTCBmdW5jdGlvbiBuYW1lIGlmIHRoZXJlIHdlcmUgbm8gTl9GVU5zIGluIGEgZmlsZS4KLQkgICAgICAgICBOb3RlIHRoYXQgYSBOX1NPIHdpdGhvdXQgYSBmaWxlIG5hbWUgaXMgYW4gRU9GIGFuZAotCSAgICAgICAgIHRoZXJlIGNvdWxkIGJlIDIgTl9TTyBmb2xsb3dpbmcgaXQgd2l0aCB0aGUgbmV3IGZpbGVuYW1lIAotCSAgICAgICAgIGFuZCBkaXJlY3RvcnkuICovCi0JICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkJewotCQkgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gYmZkX2dldF8zMiAoYWJmZCwgbGFzdF9zdGFiICsgVkFMT0ZGKTsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBsYXN0X3N0YWI7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0JCSAgKytpOwotCQl9Ci0JICAgICAgc2F3X2Z1biA9IDA7Ci0JICAgICAgCi0JICAgICAgZmlsZV9uYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQkgICAgICBpZiAoKmZpbGVfbmFtZSA9PSAnXDAnKQotCQl7Ci0JCSAgZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotCQkgIGZpbGVfbmFtZSA9IE5VTEw7Ci0JCSAgc2F3X2Z1biA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBsYXN0X3N0YWIgPSBzdGFiOwotCQkgIGlmIChzdGFiICsgU1RBQlNJWkUgPj0gaW5mby0+c3RhYnMgKyBzdGFic2l6ZQotCQkgICAgICB8fCAqKHN0YWIgKyBTVEFCU0laRSArIFRZUEVPRkYpICE9IE5fU08pCi0JCSAgICB7Ci0JCSAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFR3byBjb25zZWN1dGl2ZSBOX1NPcyBhcmUgYSBkaXJlY3RvcnkgYW5kIGEKLQkJCSBmaWxlIG5hbWUuICAqLwotCQkgICAgICBzdGFiICs9IFNUQUJTSVpFOwotCQkgICAgICBkaXJlY3RvcnlfbmFtZSA9IGZpbGVfbmFtZTsKLQkJICAgICAgZmlsZV9uYW1lID0gKChjaGFyICopIHN0cgotCQkJCSAgICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fU09MOgotCSAgICAgIC8qIFRoZSBuYW1lIG9mIGFuIGluY2x1ZGUgZmlsZS4gICovCi0JICAgICAgZmlsZV9uYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fRlVOOgotCSAgICAgIC8qIEEgZnVuY3Rpb24gbmFtZS4gICovCi0JICAgICAgc2F3X2Z1biA9IDE7Ci0JICAgICAgbmFtZSA9IChjaGFyICopIHN0ciArIGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBTVFJEWE9GRik7Ci0KLQkgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJbmFtZSA9IE5VTEw7Ci0KLQkgICAgICBmdW5jdGlvbl9uYW1lID0gbmFtZTsKLQotCSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgVkFMT0ZGKTsKLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBzdGFiOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uc3RyID0gc3RyOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZGlyZWN0b3J5X25hbWUgPSBkaXJlY3RvcnlfbmFtZTsKLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmZ1bmN0aW9uX25hbWUgPSBmdW5jdGlvbl9uYW1lOwotCSAgICAgICsraTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQl7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLnZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIGxhc3Rfc3RhYiArIFZBTE9GRik7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBsYXN0X3N0YWI7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0ciA9IHN0cjsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uZGlyZWN0b3J5X25hbWUgPSBkaXJlY3RvcnlfbmFtZTsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5mdW5jdGlvbl9uYW1lID0gTlVMTDsKLQkgICsraTsKLQl9Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gKGJmZF92bWEpIC0xOwotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdGFiID0gaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uc3RyID0gc3RyOwotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmZ1bmN0aW9uX25hbWUgPSBOVUxMOwotICAgICAgKytpOwotCi0gICAgICBpbmZvLT5pbmRleHRhYmxlc2l6ZSA9IGk7Ci0gICAgICBxc29ydCAoaW5mby0+aW5kZXh0YWJsZSwgaSwgc2l6ZW9mIChzdHJ1Y3QgaW5kZXhlbnRyeSksIGNtcGluZGV4ZW50cnkpOwotCi0gICAgICAqcGluZm8gPSAoUFRSKSBpbmZvOwotICAgIH0KLQotICAvKiBXZSBhcmUgcGFzc2VkIGEgc2VjdGlvbiByZWxhdGl2ZSBvZmZzZXQuICBUaGUgb2Zmc2V0cyBpbiB0aGUKLSAgICAgc3RhYnMgaW5mb3JtYXRpb24gYXJlIGFic29sdXRlLiAgKi8KLSAgb2Zmc2V0ICs9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCi0jaWZkZWYgRU5BQkxFX0NBQ0hJTkcKLSAgaWYgKGluZm8tPmNhY2hlZF9pbmRleGVudHJ5ICE9IE5VTEwKLSAgICAgICYmIG9mZnNldCA+PSBpbmZvLT5jYWNoZWRfb2Zmc2V0Ci0gICAgICAmJiBvZmZzZXQgPCAoaW5mby0+Y2FjaGVkX2luZGV4ZW50cnkgKyAxKS0+dmFsKQotICAgIHsKLSAgICAgIHN0YWIgPSBpbmZvLT5jYWNoZWRfc3RhYjsKLSAgICAgIGluZGV4ZW50cnkgPSBpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeTsKLSAgICAgIGZpbGVfbmFtZSA9IGluZm8tPmNhY2hlZF9maWxlX25hbWU7Ci0gICAgfQotICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICAvKiBDYWNoZSBub24tZXhpc3RhbnQgb3IgaW52YWxpZC4gIERvIGJpbmFyeSBzZWFyY2ggb24KLSAgICAgICAgIGluZGV4dGFibGUuICAqLwotCi0gICAgICBsb25nIGxvdywgaGlnaDsKLSAgICAgIGxvbmcgbWlkID0gLTE7Ci0KLSAgICAgIGluZGV4ZW50cnkgPSBOVUxMOwotCi0gICAgICBsb3cgPSAwOwotICAgICAgaGlnaCA9IGluZm8tPmluZGV4dGFibGVzaXplIC0gMTsKLSAgICAgIHdoaWxlIChsb3cgIT0gaGlnaCkKLQl7Ci0JICBtaWQgPSAoaGlnaCArIGxvdykgLyAyOwotCSAgaWYgKG9mZnNldCA+PSBpbmZvLT5pbmRleHRhYmxlW21pZF0udmFsCi0JICAgICAgJiYgb2Zmc2V0IDwgaW5mby0+aW5kZXh0YWJsZVttaWQgKyAxXS52YWwpCi0JICAgIHsKLQkgICAgICBpbmRleGVudHJ5ID0gJmluZm8tPmluZGV4dGFibGVbbWlkXTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoaW5mby0+aW5kZXh0YWJsZVttaWRdLnZhbCA+IG9mZnNldCkKLQkgICAgaGlnaCA9IG1pZDsKLQkgIGVsc2UKLQkgICAgbG93ID0gbWlkICsgMTsKLQl9Ci0KLSAgICAgIGlmIChpbmRleGVudHJ5ID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHN0YWIgPSBpbmRleGVudHJ5LT5zdGFiICsgU1RBQlNJWkU7Ci0gICAgICBmaWxlX25hbWUgPSBpbmRleGVudHJ5LT5maWxlX25hbWU7Ci0gICAgfQotCi0gIGRpcmVjdG9yeV9uYW1lID0gaW5kZXhlbnRyeS0+ZGlyZWN0b3J5X25hbWU7Ci0gIHN0ciA9IGluZGV4ZW50cnktPnN0cjsKLQotICBmb3IgKDsgc3RhYiA8IChpbmRleGVudHJ5KzEpLT5zdGFiOyBzdGFiICs9IFNUQUJTSVpFKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZG9uZTsKLSAgICAgIGJmZF92bWEgdmFsOwotCi0gICAgICBkb25lID0gZmFsc2U7Ci0KLSAgICAgIHN3aXRjaCAoc3RhYltUWVBFT0ZGXSkKLQl7Ci0JY2FzZSBOX1NPTDoKLQkgIC8qIFRoZSBuYW1lIG9mIGFuIGluY2x1ZGUgZmlsZS4gICovCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgVkFMT0ZGKTsKLQkgIGlmICh2YWwgPD0gb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgZmlsZV9uYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQkgICAgICAqcGxpbmUgPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgTl9TTElORToKLQljYXNlIE5fRFNMSU5FOgotCWNhc2UgTl9CU0xJTkU6Ci0JICAvKiBBIGxpbmUgbnVtYmVyLiAgVGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgICAgICAgICBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLQkgIHZhbCA9IGluZGV4ZW50cnktPnZhbCArIGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgaWYgKHZhbCA8PSBvZmZzZXQpCi0JICAgIHsKLQkgICAgICAqcGxpbmUgPSBiZmRfZ2V0XzE2IChhYmZkLCBzdGFiICsgREVTQ09GRik7Ci0KLSNpZmRlZiBFTkFCTEVfQ0FDSElORwotCSAgICAgIGluZm8tPmNhY2hlZF9zdGFiID0gc3RhYjsKLQkgICAgICBpbmZvLT5jYWNoZWRfb2Zmc2V0ID0gdmFsOwotCSAgICAgIGluZm8tPmNhY2hlZF9maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JICAgICAgaW5mby0+Y2FjaGVkX2luZGV4ZW50cnkgPSBpbmRleGVudHJ5OwotI2VuZGlmCi0JICAgIH0KLQkgIGlmICh2YWwgPiBvZmZzZXQpCi0JICAgIGRvbmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIE5fRlVOOgotCWNhc2UgTl9TTzoKLQkgIGRvbmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoZG9uZSkKLQlicmVhazsKLSAgICB9Ci0KLSAgKnBmb3VuZCA9IHRydWU7Ci0KLSAgaWYgKGZpbGVfbmFtZVswXSA9PSAnLycgfHwgZGlyZWN0b3J5X25hbWUgPT0gTlVMTCkKLSAgICAqcGZpbGVuYW1lID0gZmlsZV9uYW1lOwotICBlbHNlCi0gICAgewotICAgICAgc2l6ZV90IGRpcmxlbjsKLQotICAgICAgZGlybGVuID0gc3RybGVuIChkaXJlY3RvcnlfbmFtZSk7Ci0gICAgICBpZiAoaW5mby0+ZmlsZW5hbWUgPT0gTlVMTAotCSAgfHwgc3RybmNtcCAoaW5mby0+ZmlsZW5hbWUsIGRpcmVjdG9yeV9uYW1lLCBkaXJsZW4pICE9IDAKLQkgIHx8IHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUgKyBkaXJsZW4sIGZpbGVfbmFtZSkgIT0gMCkKLQl7Ci0JICBpZiAoaW5mby0+ZmlsZW5hbWUgIT0gTlVMTCkKLQkgICAgZnJlZSAoaW5mby0+ZmlsZW5hbWUpOwotCSAgaW5mby0+ZmlsZW5hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChkaXJsZW4gKwotCQkJCQkJc3RybGVuIChmaWxlX25hbWUpCi0JCQkJCQkrIDEpOwotCSAgaWYgKGluZm8tPmZpbGVuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN0cmNweSAoaW5mby0+ZmlsZW5hbWUsIGRpcmVjdG9yeV9uYW1lKTsKLQkgIHN0cmNweSAoaW5mby0+ZmlsZW5hbWUgKyBkaXJsZW4sIGZpbGVfbmFtZSk7Ci0JfQotCi0gICAgICAqcGZpbGVuYW1lID0gaW5mby0+ZmlsZW5hbWU7Ci0gICAgfQotCi0gIGlmIChpbmRleGVudHJ5LT5mdW5jdGlvbl9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqczsKLQotICAgICAgLyogVGhpcyB3aWxsIHR5cGljYWxseSBiZSBzb21ldGhpbmcgbGlrZSBtYWluOkYoMCwxKSwgc28gd2Ugd2FudAotICAgICAgICAgdG8gY2xvYmJlciB0aGUgY29sb24uICBJdCdzIE9LIHRvIGNoYW5nZSB0aGUgbmFtZSwgc2luY2UgdGhlCi0gICAgICAgICBzdHJpbmcgaXMgaW4gb3VyIG93biBsb2NhbCBzdG9yYWdlIGFueWhvdy4gICovCi0KLSAgICAgIHMgPSBzdHJjaHIgKGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWUsICc6Jyk7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCSpzID0gJ1wwJzsKLQotICAgICAgKnBmbm5hbWUgPSBpbmRleGVudHJ5LT5mdW5jdGlvbl9uYW1lOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zeXNkZXAuaCBiL2JmZC9zeXNkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ODk4My4uMDAwMDAwMAotLS0gYS9iZmQvc3lzZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyogc3lzZGVwLmggLS0gaGFuZGxlIGhvc3QgZGVwZW5kZW5jaWVzIGZvciB0aGUgQkZEIGxpYnJhcnkKLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEJGRF9TWVNERVBfSAotI2RlZmluZSBCRkRfU1lTREVQX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1REREVGX0gKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAhKGRlZmluZWQoZXJybm8pIHx8IGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0lOQ19FUlJOTykpCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLWV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci1leHRlcm4gY2hhciAqc3RycmNociAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFRJTUVfV0lUSF9TWVNfVElNRQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9GQ05UTF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TWVNfRklMRV9ICi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgT19SRE9OTFkKLSNkZWZpbmUgT19SRE9OTFkgMAotI2VuZGlmCi0jaWZuZGVmIE9fV1JPTkxZCi0jZGVmaW5lIE9fV1JPTkxZIDEKLSNlbmRpZgotI2lmbmRlZiBPX1JEV1IKLSNkZWZpbmUgT19SRFdSIDIKLSNlbmRpZgotI2lmbmRlZiBPX0FDQ01PREUKLSNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgMAotI2VuZGlmCi0jaWZuZGVmIFNFRUtfQ1VSCi0jZGVmaW5lIFNFRUtfQ1VSIDEKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLWV4dGVybiBjaGFyICpzdHJzdHIgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi1leHRlcm4gUFRSIG1hbGxvYyAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DCi1leHRlcm4gUFRSIHJlYWxsb2MgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotZXh0ZXJuIHZvaWQgZnJlZSAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLWV4dGVybiBjaGFyICpnZXRlbnYgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9OTFMKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZGVmaW5lIF8oU3RyaW5nKSBkZ2V0dGV4dCAoUEFDS0FHRSwgU3RyaW5nKQotI2lmZGVmIGdldHRleHRfbm9vcAotI2RlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotI2Vsc2UKLSNkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSNkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotI2RlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSNkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSNkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfU1lTREVQX0gpICovCmRpZmYgLS1naXQgYS9iZmQvdGFyZ2V0cy5jIGIvYmZkL3RhcmdldHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyMjE3Yi4uMDAwMDAwMAotLS0gYS9iZmQvdGFyZ2V0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzOSArMCwwIEBACi0vKiBHZW5lcmljIHRhcmdldC1maWxlLXR5cGUgc3VwcG9ydCBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZm5tYXRjaC5oIgotCi0vKgotU0VDVElPTiAKLQlUYXJnZXRzCi0KLURFU0NSSVBUSU9OCi0JRWFjaCBwb3J0IG9mIEJGRCB0byBhIGRpZmZlcmVudCBtYWNoaW5lIHJlcXVyaWVzIHRoZSBjcmVhdGlvbgotCW9mIGEgdGFyZ2V0IGJhY2sgZW5kLiBBbGwgdGhlIGJhY2sgZW5kIHByb3ZpZGVzIHRvIHRoZSByb290Ci0JcGFydCBvZiBCRkQgaXMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBwb2ludGVycyB0byBmdW5jdGlvbnMKLQl3aGljaCBwZXJmb3JtIGNlcnRhaW4gbG93IGxldmVsIG9wZXJhdGlvbnMgb24gZmlsZXMuIEJGRAotCXRyYW5zbGF0ZXMgdGhlIGFwcGxpY2F0aW9ucydzIHJlcXVlc3RzIHRocm91Z2ggYSBwb2ludGVyIGludG8KLQljYWxscyB0byB0aGUgYmFjayBlbmQgcm91dGluZXMuIAotCi0JV2hlbiBhIGZpbGUgaXMgb3BlbmVkIHdpdGggPDxiZmRfb3BlbnI+PiwgaXRzIGZvcm1hdCBhbmQKLQl0YXJnZXQgYXJlIHVua25vd24uIEJGRCB1c2VzIHZhcmlvdXMgbWVjaGFuaXNtcyB0byBkZXRlcm1pbmUKLQlob3cgdG8gaW50ZXJwcmV0IHRoZSBmaWxlLiBUaGUgb3BlcmF0aW9ucyBwZXJmb3JtZWQgYXJlOgotCi0JbyBDcmVhdGUgYSBCRkQgYnkgY2FsbGluZyB0aGUgaW50ZXJuYWwgcm91dGluZQotCTw8X2JmZF9uZXdfYmZkPj4sIHRoZW4gY2FsbCA8PGJmZF9maW5kX3RhcmdldD4+IHdpdGggdGhlCi0JdGFyZ2V0IHN0cmluZyBzdXBwbGllZCB0byA8PGJmZF9vcGVucj4+IGFuZCB0aGUgbmV3IEJGRCBwb2ludGVyLiAKLQotCW8gSWYgYSBudWxsIHRhcmdldCBzdHJpbmcgd2FzIHByb3ZpZGVkIHRvIDw8YmZkX2ZpbmRfdGFyZ2V0Pj4sCi0JbG9vayB1cCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPDxHTlVUQVJHRVQ+PiBhbmQgdXNlCi0JdGhhdCBhcyB0aGUgdGFyZ2V0IHN0cmluZy4gCi0KLQlvIElmIHRoZSB0YXJnZXQgc3RyaW5nIGlzIHN0aWxsIDw8TlVMTD4+LCBvciB0aGUgdGFyZ2V0IHN0cmluZyBpcwotCTw8ZGVmYXVsdD4+LCB0aGVuIHVzZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgdGFyZ2V0IHZlY3RvcgotCWFzIHRoZSB0YXJnZXQgdHlwZSwgYW5kIHNldCA8PHRhcmdldF9kZWZhdWx0ZWQ+PiBpbiB0aGUgQkZEIHRvCi0JY2F1c2UgPDxiZmRfY2hlY2tfZm9ybWF0Pj4gdG8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgdGFyZ2V0cy4KLQlAeHJlZntiZmRfdGFyZ2V0fS4gIEB4cmVme0Zvcm1hdHN9LgotCi0JbyBPdGhlcndpc2UsIGluc3BlY3QgdGhlIGVsZW1lbnRzIGluIHRoZSB0YXJnZXQgdmVjdG9yCi0Jb25lIGJ5IG9uZSwgdW50aWwgYSBtYXRjaCBvbiB0YXJnZXQgbmFtZSBpcyBmb3VuZC4gV2hlbiBmb3VuZCwKLQl1c2UgaXQuIAotCi0JbyBPdGhlcndpc2UgcmV0dXJuIHRoZSBlcnJvciA8PGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldD4+IHRvCi0JPDxiZmRfb3BlbnI+Pi4KLQotCW8gPDxiZmRfb3BlbnI+PiBhdHRlbXB0cyB0byBvcGVuIHRoZSBmaWxlIHVzaW5nCi0JPDxiZmRfb3Blbl9maWxlPj4sIGFuZCByZXR1cm5zIHRoZSBCRkQuCi0KLQlPbmNlIHRoZSBCRkQgaGFzIGJlZW4gb3BlbmVkIGFuZCB0aGUgdGFyZ2V0IHNlbGVjdGVkLCB0aGUgZmlsZQotCWZvcm1hdCBtYXkgYmUgZGV0ZXJtaW5lZC4gVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcKLQk8PGJmZF9jaGVja19mb3JtYXQ+PiBvbiB0aGUgQkZEIHdpdGggYSBzdWdnZXN0ZWQgZm9ybWF0LiAKLQlJZiA8PHRhcmdldF9kZWZhdWx0ZWQ+PiBoYXMgYmVlbiBzZXQsIGVhY2ggcG9zc2libGUgdGFyZ2V0Ci0JdHlwZSBpcyB0cmllZCB0byBzZWUgaWYgaXQgcmVjb2duaXplcyB0aGUgc3BlY2lmaWVkIGZvcm1hdC4KLQk8PGJmZF9jaGVja19mb3JtYXQ+PiByZXR1cm5zIDw8dHJ1ZT4+IHdoZW4gdGhlIGNhbGxlciBndWVzc2VzIHJpZ2h0LgotQG1lbnUKLUAqIGJmZF90YXJnZXQ6OgotQGVuZCBtZW51Ci0qLwotCi0KLS8qCi0KLUlOT0RFCi0JYmZkX3RhcmdldCwgICwgVGFyZ2V0cywgVGFyZ2V0cwotRE9DREQKLVNVQlNFQ1RJT04KLQliZmRfdGFyZ2V0Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0IEJGRCBrbm93cyBhYm91dCBhCi0JdGFyZ2V0LiBJdCBpbmNsdWRlcyB0aGluZ3MgbGlrZSBpdHMgYnl0ZSBvcmRlciwgbmFtZSwgYW5kIHdoaWNoCi0Jcm91dGluZXMgdG8gY2FsbCB0byBkbyB2YXJpb3VzIG9wZXJhdGlvbnMuICAgCi0KLQlFdmVyeSBCRkQgcG9pbnRzIHRvIGEgdGFyZ2V0IHN0cnVjdHVyZSB3aXRoIGl0cyA8PHh2ZWM+PgotCW1lbWJlci4gCi0KLQlUaGUgbWFjcm9zIGJlbG93IGFyZSB1c2VkIHRvIGRpc3BhdGNoIHRvIGZ1bmN0aW9ucyB0aHJvdWdoIHRoZQotCTw8YmZkX3RhcmdldD4+IHZlY3Rvci4gVGhleSBhcmUgdXNlZCBpbiBhIG51bWJlciBvZiBtYWNyb3MgZnVydGhlcgotCWRvd24gaW4gQGZpbGV7YmZkLmh9LCBhbmQgYXJlIGFsc28gdXNlZCB3aGVuIGNhbGxpbmcgdmFyaW91cwotCXJvdXRpbmVzIGJ5IGhhbmQgaW5zaWRlIHRoZSBCRkQgaW1wbGVtZW50YXRpb24uICBUaGUgQHZhcnthcmdsaXN0fQotCWFyZ3VtZW50IG11c3QgYmUgcGFyZW50aGVzaXplZDsgaXQgY29udGFpbnMgYWxsIHRoZSBhcmd1bWVudHMKLQl0byB0aGUgY2FsbGVkIGZ1bmN0aW9uLiAKLQotCVRoZXkgbWFrZSB0aGUgZG9jdW1lbnRhdGlvbiAobW9yZSkgdW5wbGVhc2FudCB0byByZWFkLCBzbyBpZgotCXNvbWVvbmUgd2FudHMgdG8gZml4IHRoaXMgYW5kIG5vdCBicmVhayB0aGUgYWJvdmUsIHBsZWFzZSBkby4KLQotLiNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0uICAgICAgICAgICAgICAgKCgqKChiZmQpLT54dmVjLT5tZXNzYWdlKSkgYXJnbGlzdCkKLS4KLS4jaWZkZWYgREVCVUdfQkZEX1NFTkQKLS4jdW5kZWYgQkZEX1NFTkQKLS4jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgKCgoYmZkKSAmJiAoYmZkKS0+eHZlYyAmJiAoYmZkKS0+eHZlYy0+bWVzc2FnZSkgPyBcCi0uICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpIDogXAotLiAgICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKLS4jZW5kaWYKLQotCUZvciBvcGVyYXRpb25zIHdoaWNoIGluZGV4IG9uIHRoZSBCRkQgZm9ybWF0OgotCi0uI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0uICAgICAgICAgICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpCi0uCi0uI2lmZGVmIERFQlVHX0JGRF9TRU5ECi0uI3VuZGVmIEJGRF9TRU5EX0ZNVAotLiNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgKCgoYmZkKSAmJiAoYmZkKS0+eHZlYyAmJiAoYmZkKS0+eHZlYy0+bWVzc2FnZSkgPyBcCi0uICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpIDogXAotLiAgIChiZmRfYXNzZXJ0IChfX0ZJTEVfXyxfX0xJTkVfXyksIE5VTEwpKQotLiNlbmRpZgotCi0JVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdoaWNoIGRlZmluZXMgdGhlIHR5cGUgb2YgQkZEIHRoaXMgaXMuICBUaGUKLQk8PHh2ZWM+PiBtZW1iZXIgb2YgdGhlIHN0cnVjdCA8PGJmZD4+IGl0c2VsZiBwb2ludHMgaGVyZS4gIEVhY2gKLQltb2R1bGUgdGhhdCBpbXBsZW1lbnRzIGFjY2VzcyB0byBhIGRpZmZlcmVudCB0YXJnZXQgdW5kZXIgQkZELAotCWRlZmluZXMgb25lIG9mIHRoZXNlLgotCi0KLQlGSVhNRSwgdGhlc2UgbmFtZXMgc2hvdWxkIGJlIHJhdGlvbmFsaXNlZCB3aXRoIHRoZSBuYW1lcyBvZgotCXRoZSBlbnRyeSBwb2ludHMgd2hpY2ggY2FsbCB0aGVtLiBUb28gYmFkIHdlIGNhbid0IGhhdmUgb25lCi0JbWFjcm8gdG8gZGVmaW5lIHRoZW0gYm90aCEgCi0KLS5lbnVtIGJmZF9mbGF2b3VyIHsKLS4gIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2llZWVfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X29hc3lzX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfc29tX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X29zOWtfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfdmVyc2Fkb3NfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKLS59OwotLgotLmVudW0gYmZkX2VuZGlhbiB7IEJGRF9FTkRJQU5fQklHLCBCRkRfRU5ESUFOX0xJVFRMRSwgQkZEX0VORElBTl9VTktOT1dOIH07Ci0uCi0ueyogRm9yd2FyZCBkZWNsYXJhdGlvbi4gICp9Ci0udHlwZWRlZiBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyBfYmZkX2xpbmtfaW5mbzsKLS4KLS50eXBlZGVmIHN0cnVjdCBiZmRfdGFyZ2V0Ci0uewotCi1JZGVudGlmaWVzIHRoZSBraW5kIG9mIHRhcmdldCwgZS5nLiwgU3VuT1M0LCBVbHRyaXgsIGV0Yy4KLQotLiAgY2hhciAqbmFtZTsKLQotVGhlICJmbGF2b3VyIiBvZiBhIGJhY2sgZW5kIGlzIGEgZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IHRoZSBjb250ZW50cwotb2YgYSBmaWxlLgotCi0uICBlbnVtIGJmZF9mbGF2b3VyIGZsYXZvdXI7Ci0KLVRoZSBvcmRlciBvZiBieXRlcyB3aXRoaW4gdGhlIGRhdGEgYXJlYSBvZiBhIGZpbGUuCi0KLS4gIGVudW0gYmZkX2VuZGlhbiBieXRlb3JkZXI7Ci0KLVRoZSBvcmRlciBvZiBieXRlcyB3aXRoaW4gdGhlIGhlYWRlciBwYXJ0cyBvZiBhIGZpbGUuCi0KLS4gIGVudW0gYmZkX2VuZGlhbiBoZWFkZXJfYnl0ZW9yZGVyOwotCi1BIG1hc2sgb2YgYWxsIHRoZSBmbGFncyB3aGljaCBhbiBleGVjdXRhYmxlIG1heSBoYXZlIHNldCAtCi1mcm9tIHRoZSBzZXQgPDxCRkRfTk9fRkxBR1M+PiwgPDxIQVNfUkVMT0M+PiwgLi4uPDxEX1BBR0VEPj4uCi0KLS4gIGZsYWd3b3JkIG9iamVjdF9mbGFnczsgICAgICAgCi0KLUEgbWFzayBvZiBhbGwgdGhlIGZsYWdzIHdoaWNoIGEgc2VjdGlvbiBtYXkgaGF2ZSBzZXQgLSBmcm9tCi10aGUgc2V0IDw8U0VDX05PX0ZMQUdTPj4sIDw8U0VDX0FMTE9DPj4sIC4uLjw8U0VUX05FVkVSX0xPQUQ+Pi4KLQotLiAgZmxhZ3dvcmQgc2VjdGlvbl9mbGFnczsKLQotVGhlIGNoYXJhY3RlciBub3JtYWxseSBmb3VuZCBhdCB0aGUgZnJvbnQgb2YgYSBzeW1ib2wgCi0oaWYgYW55KSwgcGVyaGFwcyBgXycuCi0KLS4gIGNoYXIgc3ltYm9sX2xlYWRpbmdfY2hhcjsKLQotVGhlIHBhZCBjaGFyYWN0ZXIgZm9yIGZpbGUgbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyLgotCi0uICBjaGFyIGFyX3BhZF9jaGFyOyAgICAgICAgICAgIAotCi1UaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlci4KLQotLiAgdW5zaWduZWQgc2hvcnQgYXJfbWF4X25hbWVsZW47Ci0KLUVudHJpZXMgZm9yIGJ5dGUgc3dhcHBpbmcgZm9yIGRhdGEuIFRoZXNlIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIKLWVudHJ5IHBvaW50cywgc2luY2UgdGhleSBkb24ndCB0YWtlIGEgQkZEIGFzdGhlIGZpcnN0IGFyZ3VtZW50LgotQ2VydGFpbiBvdGhlciBoYW5kbGVycyBjb3VsZCBkbyB0aGUgc2FtZS4KLQotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHg2NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfNjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLS4gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4MzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8xNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi1CeXRlIHN3YXBwaW5nIGZvciB0aGUgaGVhZGVycwotCi0uICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfNjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHg2NCkgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4MzIpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLS4gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8xNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDE2KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLUZvcm1hdCBkZXBlbmRlbnQgcm91dGluZXM6IHRoZXNlIGFyZSB2ZWN0b3JzIG9mIGVudHJ5IHBvaW50cwotd2l0aGluIHRoZSB0YXJnZXQgdmVjdG9yIHN0cnVjdHVyZSwgb25lIGZvciBlYWNoIGZvcm1hdCB0byBjaGVjay4KLQotQ2hlY2sgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgcmVhZC4gIFJldHVybiBhIDw8YmZkX3RhcmdldCAqPj4gb3IgemVyby4gCi0KLS4gIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICooKl9iZmRfY2hlY2tfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLVNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuLiAgCi0KLS4gIGJvb2xlYW4gICAgICAgICAgICAgKCpfYmZkX3NldF9mb3JtYXRbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLQotV3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4sIGF0IDw8YmZkX2Nsb3NlPj4uIAotCi0uICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF93cml0ZV9jb250ZW50c1tiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi1UaGUgZ2VuZXJhbCB0YXJnZXQgdmVjdG9yLiAgVGhlc2UgdmVjdG9ycyBhcmUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlCi1CRkRfSlVNUF9UQUJMRSBtYWNyb3MuCi0KLS4KLS4gIHsqIEdlbmVyaWMgZW50cnkgcG9pbnRzLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMoTkFNRSlcCi0uQ0FUKE5BTUUsX2Nsb3NlX2FuZF9jbGVhbnVwKSxcCi0uQ0FUKE5BTUUsX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSxcCi0uQ0FUKE5BTUUsX25ld19zZWN0aW9uX2hvb2spLFwKLS5DQVQoTkFNRSxfZ2V0X3NlY3Rpb25fY29udGVudHMpLFwKLS5DQVQoTkFNRSxfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotLgotLiAgeyogQ2FsbGVkIHdoZW4gdGhlIEJGRCBpcyBiZWluZyBjbG9zZWQgdG8gZG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfY2xvc2VfYW5kX2NsZWFudXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICB7KiBBc2sgdGhlIEJGRCB0byBmcmVlIGFsbCBjYWNoZWQgaW5mb3JtYXRpb24uICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZnJlZV9jYWNoZWRfaW5mbykgUEFSQU1TICgoYmZkICopKTsKLS4gIHsqIENhbGxlZCB3aGVuIGEgbmV3IHNlY3Rpb24gaXMgY3JlYXRlZC4gICp9Ci0uICBib29sZWFuICAgICAgICgqX25ld19zZWN0aW9uX2hvb2spIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci0uICB7KiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsIAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKLS4gICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBiZmRfd2luZG93ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotLgotLiAgeyogRW50cnkgcG9pbnRzIHRvIGNvcHkgcHJpdmF0ZSBkYXRhLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0NPUFkoTkFNRSlcCi0uQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpLFwKLS5DQVQoTkFNRSxfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpLFwKLS5DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpLFwKLS5DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpLFwKLS5DQVQoTkFNRSxfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpXAotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhbm90aGVyLiAgKn0KLS4gIGJvb2xlYW4JICgqX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotLiAgeyogQ2FsbGVkIHRvIG1lcmdlIEJGRCBnZW5lcmFsIHByaXZhdGUgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotLiAgICAgdG8gYSBjb21tb24gb3V0cHV0IGZpbGUgd2hlbiBsaW5raW5nLiAgKn0KLS4gIGJvb2xlYW4JICgqX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLS4gIHsqIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHNlY3Rpb24gZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotLiAgICAgdG8gYW5vdGhlci4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICosIHNlY19wdHIpKTsKLS4gIHsqIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHN5bWJvbCBkYXRhIGZyb20gb25lIHN5bWJvbCAKLS4gICAgIHRvIGFub3RoZXIuICAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotLgkJCQkJCQkgICBiZmQgKiwgYXN5bWJvbCAqKSk7Ci0uICB7KiBDYWxsZWQgdG8gc2V0IHByaXZhdGUgYmFja2VuZCBmbGFncyAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX3NldF9wcml2YXRlX2ZsYWdzKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLS4KLS4gIHsqIENhbGxlZCB0byBwcmludCBwcml2YXRlIEJGRCBkYXRhICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0uCi0uICB7KiBDb3JlIGZpbGUgZW50cnkgcG9pbnRzLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0NPUkUoTkFNRSlcCi0uQ0FUKE5BTUUsX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpLFwKLS5DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKSxcCi0uQ0FUKE5BTUUsX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkKLS4gIGNoYXIgKiAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBpbnQgICAgICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBib29sZWFuICAoKl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotLgotLiAgeyogQXJjaGl2ZSBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQVJDSElWRShOQU1FKVwKLS5DQVQoTkFNRSxfc2x1cnBfYXJtYXApLFwKLS5DQVQoTkFNRSxfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSksXAotLkNBVChOQU1FLF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSksXAotLkNBVChOQU1FLF90cnVuY2F0ZV9hcm5hbWUpLFwKLS5DQVQoTkFNRSxfd3JpdGVfYXJtYXApLFwKLS5DQVQoTkFNRSxfcmVhZF9hcl9oZHIpLFwKLS5DQVQoTkFNRSxfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKSxcCi0uQ0FUKE5BTUUsX2dldF9lbHRfYXRfaW5kZXgpLFwKLS5DQVQoTkFNRSxfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KSxcCi0uQ0FUKE5BTUUsX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApCi0uICBib29sZWFuICAoKl9iZmRfc2x1cnBfYXJtYXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBib29sZWFuICAoKl9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSkKLS4gICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotLiAgdm9pZCAgICAgKCpfYmZkX3RydW5jYXRlX2FybmFtZSkgUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgY2hhciAqKSk7Ci0uICBib29sZWFuICAoKndyaXRlX2FybWFwKSBQQVJBTVMgKChiZmQgKmFyY2gsIAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcmwgKm1hcCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCAKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWR4KSk7Ci0uICBQVFIgKCpfYmZkX3JlYWRfYXJfaGRyX2ZuKSBQQVJBTVMgKChiZmQgKikpOwotLiAgYmZkICogICAgKCpvcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpIFBBUkFNUyAoKGJmZCAqYXJjaCwgYmZkICpwcmV2KSk7Ci0uI2RlZmluZSBiZmRfZ2V0X2VsdF9hdF9pbmRleChiLGkpIEJGRF9TRU5EKGIsIF9iZmRfZ2V0X2VsdF9hdF9pbmRleCwgKGIsaSkpCi0uICBiZmQgKiAgICAoKl9iZmRfZ2V0X2VsdF9hdF9pbmRleCkgUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci0uICBpbnQgICAgICAoKl9iZmRfc3RhdF9hcmNoX2VsdCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzdGF0ICopKTsKLS4gIGJvb2xlYW4gICgqX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKSBQQVJBTVMgKChiZmQgKikpOwotLgotLiAgeyogRW50cnkgcG9pbnRzIHVzZWQgZm9yIHN5bWJvbHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyhOQU1FKVwKLS5DQVQoTkFNRSxfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCksXAotLkNBVChOQU1FLF9nZXRfc3ltdGFiKSxcCi0uQ0FUKE5BTUUsX21ha2VfZW1wdHlfc3ltYm9sKSxcCi0uQ0FUKE5BTUUsX3ByaW50X3N5bWJvbCksXAotLkNBVChOQU1FLF9nZXRfc3ltYm9sX2luZm8pLFwKLS5DQVQoTkFNRSxfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpLFwKLS5DQVQoTkFNRSxfZ2V0X2xpbmVubyksXAotLkNBVChOQU1FLF9maW5kX25lYXJlc3RfbGluZSksXAotLkNBVChOQU1FLF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpLFwKLS5DQVQoTkFNRSxfcmVhZF9taW5pc3ltYm9scyksXAotLkNBVChOQU1FLF9taW5pc3ltYm9sX3RvX3N5bWJvbCkKLS4gIGxvbmcgICgqX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIpIFBBUkFNUyAoKGJmZCAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLS4gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgICoKLS4gICAgICAgICAgICAgICAgKCpfYmZkX21ha2VfZW1wdHlfc3ltYm9sKSBQQVJBTVMgKChiZmQgKikpOwotLiAgdm9pZCAgICAgICAgICAoKl9iZmRfcHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgUFRSLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci0uI2RlZmluZSBiZmRfcHJpbnRfc3ltYm9sKGIscCxzLGUpIEJGRF9TRU5EKGIsIF9iZmRfcHJpbnRfc3ltYm9sLCAoYixwLHMsZSkpCi0uICB2b2lkICAgICAgICAgICgqX2JmZF9nZXRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKGJmZCAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2luZm8gKikpOwotLiNkZWZpbmUgYmZkX2dldF9zeW1ib2xfaW5mbyhiLHAsZSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfc3ltYm9sX2luZm8sIChiLHAsZSkpCi0uICBib29sZWFuCSAoKl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSkgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotLgotLiAgYWxlbnQgKiAgICAoKl9nZXRfbGluZW5vKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKSk7Ci0uICBib29sZWFuICAgICgqX2JmZF9maW5kX25lYXJlc3RfbGluZSkgUEFSQU1TICgoYmZkICphYmZkLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlYyAqc2VjdGlvbiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bWJvbHMsCi0uICAgICAgICAgICAgICAgICAgICBiZmRfdm1hIG9mZnNldCwgQ09OU1QgY2hhciAqKmZpbGUsIENPTlNUIGNoYXIgKipmdW5jLAotLiAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpsaW5lKSk7Ci0uIHsqIEJhY2stZG9vciB0byBhbGxvdyBmb3JtYXQtYXdhcmUgYXBwbGljYXRpb25zIHRvIGNyZWF0ZSBkZWJ1ZyBzeW1ib2xzCi0uICAgIHdoaWxlIHVzaW5nIEJGRCBmb3IgZXZlcnl0aGluZyBlbHNlLiAgQ3VycmVudGx5IHVzZWQgYnkgdGhlIGFzc2VtYmxlcgotLiAgICB3aGVuIGNyZWF0aW5nIENPRkYgZmlsZXMuICAqfQotLiAgYXN5bWJvbCAqICAoKl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIHZvaWQgKnB0ciwKLS4gICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSk7Ci0uI2RlZmluZSBiZmRfcmVhZF9taW5pc3ltYm9scyhiLCBkLCBtLCBzKSBcCi0uICBCRkRfU0VORCAoYiwgX3JlYWRfbWluaXN5bWJvbHMsIChiLCBkLCBtLCBzKSkKLS4gIGxvbmcgICgqX3JlYWRfbWluaXN5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqKSk7Ci0uI2RlZmluZSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2woYiwgZCwgbSwgZikgXAotLiAgQkZEX1NFTkQgKGIsIF9taW5pc3ltYm9sX3RvX3N5bWJvbCwgKGIsIGQsIG0sIGYpKQotLiAgYXN5bWJvbCAqKCpfbWluaXN5bWJvbF90b19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bWJvbCAqKSk7Ci0uCi0uICB7KiBSb3V0aW5lcyBmb3IgcmVsb2NzLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyhOQU1FKVwKLS5DQVQoTkFNRSxfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9yZWxvYyksXAotLkNBVChOQU1FLF9iZmRfcmVsb2NfdHlwZV9sb29rdXApCi0uICBsb25nICAoKl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci0uICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgYXJlbGVudCAqKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLS4gIHsqIFNlZSBkb2N1bWVudGF0aW9uIG9uIHJlbG9jIHR5cGVzLiAgKn0KLS4gIHJlbG9jX2hvd3RvX3R5cGUgKgotLiAgICAgICAoKnJlbG9jX3R5cGVfbG9va3VwKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0uCi0uICB7KiBSb3V0aW5lcyB1c2VkIHdoZW4gd3JpdGluZyBhbiBvYmplY3QgZmlsZS4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9XUklURShOQU1FKVwKLS5DQVQoTkFNRSxfc2V0X2FyY2hfbWFjaCksXAotLkNBVChOQU1FLF9zZXRfc2VjdGlvbl9jb250ZW50cykKLS4gIGJvb2xlYW4gICAgKCpfYmZkX3NldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCi0uICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKSk7Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9zZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0uCi0uICB7KiBSb3V0aW5lcyB1c2VkIGJ5IHRoZSBsaW5rZXIuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfTElOSyhOQU1FKVwKLS5DQVQoTkFNRSxfc2l6ZW9mX2hlYWRlcnMpLFwKLS5DQVQoTkFNRSxfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyksXAotLkNBVChOQU1FLF9iZmRfcmVsYXhfc2VjdGlvbiksXAotLkNBVChOQU1FLF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSksXAotLkNBVChOQU1FLF9iZmRfbGlua19hZGRfc3ltYm9scyksXAotLkNBVChOQU1FLF9iZmRfZmluYWxfbGluayksXAotLkNBVChOQU1FLF9iZmRfbGlua19zcGxpdF9zZWN0aW9uKSxcCi0uQ0FUKE5BTUUsX2JmZF9nY19zZWN0aW9ucykKLS4gIGludCAgICAgICAgKCpfYmZkX3NpemVvZl9oZWFkZXJzKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotLiAgYmZkX2J5dGUgKiAoKl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwKLS4gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotLiAgICAgICAgICAgICAgICAgICAgYmZkX2J5dGUgKmRhdGEsIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLgotLiAgYm9vbGVhbiAgICAoKl9iZmRfcmVsYXhfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKiwKLS4gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKmFnYWluKSk7Ci0uCi0uICB7KiBDcmVhdGUgYSBoYXNoIHRhYmxlIGZvciB0aGUgbGlua2VyLiAgRGlmZmVyZW50IGJhY2tlbmRzIHN0b3JlCi0uICAgICBkaWZmZXJlbnQgaW5mb3JtYXRpb24gaW4gdGhpcyB0YWJsZS4gICp9Ci0uICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCpfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uCi0uICB7KiBBZGQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgaGFzaCB0YWJsZS4gICp9Ci0uICBib29sZWFuICgqX2JmZF9saW5rX2FkZF9zeW1ib2xzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotLgotLiAgeyogRG8gYSBsaW5rIGJhc2VkIG9uIHRoZSBsaW5rX29yZGVyIHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaAotLiAgICAgc2VjdGlvbiBvZiB0aGUgQkZELiAgKn0KLS4gIGJvb2xlYW4gKCpfYmZkX2ZpbmFsX2xpbmspIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBTaG91bGQgdGhpcyBzZWN0aW9uIGJlIHNwbGl0IHVwIGludG8gc21hbGxlciBwaWVjZXMgZHVyaW5nIGxpbmtpbmcuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfbGlua19zcGxpdF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSk7Ci0uCi0uICB7KiBSZW1vdmUgc2VjdGlvbnMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgZnJvbSB0aGUgb3V0cHV0LiAgKn0KLS4gIGJvb2xlYW4gKCpfYmZkX2djX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotLgotLiAgeyogUm91dGluZXMgdG8gaGFuZGxlIGR5bmFtaWMgc3ltYm9scyBhbmQgcmVsb2NzLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMoTkFNRSlcCi0uQ0FUKE5BTUUsX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCksXAotLkNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpLFwKLS5DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpLFwKLS5DQVQoTkFNRSxfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCi0uICB7KiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAqfQotLiAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICopKTsKLS4gIHsqIFJlYWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICp9Ci0uICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKQotLiAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgeyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgcmVsb2NzLiAgKn0KLS4gIGxvbmcgICgqX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICopKTsKLS4gIHsqIFJlYWQgaW4gdGhlIGR5bmFtaWMgcmVsb2NzLiAgKn0KLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLS4gICAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLS4KLQotQSBwb2ludGVyIHRvIGFuIGFsdGVybmF0aXZlIGJmZF90YXJnZXQgaW4gY2FzZSB0aGUgY3VycmVudCBvbmUgaXMgbm90Ci1zYXRpc2ZhY3RvcnkuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgdGFyZ2V0IGNwdSBzdXBwb3J0cyBib3RoIGJpZwotYW5kIGxpdHRsZSBlbmRpYW4gY29kZSwgYW5kIHRhcmdldCBjaG9zZW4gYnkgdGhlIGxpbmtlciBoYXMgdGhlIHdyb25nCi1lbmRpYW5uZXNzLiAgVGhlIGZ1bmN0aW9uIG9wZW5fb3V0cHV0KCkgaW4gbGQvbGRsYW5nLmMgdXNlcyB0aGlzIGZpZWxkCi10byBmaW5kIGFuIGFsdGVybmF0aXZlIG91dHB1dCBmb3JtYXQgdGhhdCBpcyBzdWl0YWJsZS4KLQotLiB7KiBPcHBvc2l0ZSBlbmRpYW4gdmVyc2lvbiBvZiB0aGlzIHRhcmdldC4gICp9ICAKLS4gY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKiBhbHRlcm5hdGl2ZV90YXJnZXQ7Ci0uIAotCi1EYXRhIGZvciB1c2UgYnkgYmFjay1lbmQgcm91dGluZXMsIHdoaWNoIGlzbid0IGdlbmVyaWMgZW5vdWdoIHRvIGJlbG9uZwotaW4gdGhpcyBzdHJ1Y3R1cmUuCi0KLS4gUFRSIGJhY2tlbmRfZGF0YTsKLS4gCi0ufSBiZmRfdGFyZ2V0OwotCi0qLwotCi0vKiBBbGwga25vd24geHZlY3MgKGV2ZW4gdGhvc2UgdGhhdCBkb24ndCBjb21waWxlIG9uIGFsbCBzeXN0ZW1zKS4KLSAgIEFscGhhYmV0aXplZCBmb3IgZWFzeSByZWZlcmVuY2UuCi0gICBUaGV5IGFyZSBsaXN0ZWQgYSBzZWNvbmQgdGltZSBiZWxvdywgc2luY2UKLSAgIHdlIGNhbid0IGludGVybWl4IGV4dGVybidzIGFuZCBpbml0aWFsaXplcnMuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYTI5a2NvZmZfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXQwX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcG9sbG9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybWNvZmZfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybWNvZmZfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybW5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZV9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtcGVfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlaV9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtcGVpX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZV9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtX2Vwb2NfcGVfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlaV9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtX2Vwb2NfcGVpX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfYmlnX2hvc3Q7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfbGl0dGxlX2hvc3Q7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2F2cl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnYXJjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdhcm1fdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9iaWdtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9kMTB2X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9kMzB2X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9ocHBhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9pMzcwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9pMzg2X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9pODYwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9pOTYwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbTMycl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbTY4a192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbTg4a192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbW4xMDIwMF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbW4xMDMwMF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfcGpfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3BqbF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfcG93ZXJwY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zaF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfc2hsX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zcGFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfdjg1MF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfZnIzMF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfc3BhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZGVtb182NF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZWNvZmZfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZmFscGhhX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBoODMwMGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaDg1MDBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhvc3RfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBocDMwMGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBocDMwMGhwdXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc29tX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZhb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmR5bml4X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZmcmVlYnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZvczlrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9wb3dlcnBjX3BlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9wb3dlcnBjbGVfcGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNfcGVpX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9wb3dlcnBjbGVfcGVpX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZwZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2cGVpX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGdvMzJjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGdvMzJzdHViYmVkY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nmx5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bHlueF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZtYWNoM192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bXNkb3NfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpODYwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWNvZmZfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGllZWVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2F1eF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtjb2ZmdW5fdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2xpbnV4X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtseW54X2FvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2x5bnhfY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtzeXN2Y29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrNGtuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTg4a2Jjc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtODhrbWFjaDNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWlwc2xwZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtaXBzbHBlaV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtY29yZV9wZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1jb3JlX3BlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVpX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBuZXdzb3MzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5sbTMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfc3BhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfcG93ZXJwY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm1hY2hhb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBwY2Jvb3RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcmlzY2l4X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBtYWNfeGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcnM2MDAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfc21hbGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGxwZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGxwZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNsZV9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHNwYXJjbGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNseW54X2FvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNseW54X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHN1bm9zX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0ZWtoZXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdGljMzBfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWMzMF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzgwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2YXhuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdmVyc2Fkb3NfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdm1zX2FscGhhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHZtc192YXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgd2UzMmtjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHc2NV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB6OGtjb2ZmX3ZlYzsKLQotLyogc3JlYyBpcyBhbHdheXMgaW5jbHVkZWQuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3JlY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzeW1ib2xzcmVjX3ZlYzsKLQotLyogYmluYXJ5IGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiaW5hcnlfdmVjOwotCi0vKiBpaGV4IGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpaGV4X3ZlYzsKLQotLyogQWxsIG9mIHRoZSB4dmVjcyBmb3IgY29yZSBmaWxlcy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhaXgzODZfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBjaXNjb19jb3JlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBocHV4X2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaHBwYWJzZF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGlyaXhfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBuZXRic2RfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvc2ZfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzY281X2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdHJhZF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHB0cmFjZV9jb3JlX3ZlYzsKLQotY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW10gPSB7Ci0KLSNpZmRlZiBTRUxFQ1RfVkVDUwotCi0JU0VMRUNUX1ZFQ1MsCi0KLSNlbHNlIC8qIG5vdCBTRUxFQ1RfVkVDUyAqLwotCi0jaWZkZWYgREVGQVVMVF9WRUNUT1IKLQkmREVGQVVMVF9WRUNUT1IsCi0jZW5kaWYKLQkvKiBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzeSB0byBjb21wYXJlCi0JICAgd2l0aCBvdGhlciB2ZWN0b3IgbGlzdHMgLS0gdGhlIGRlY2xzIGFib3ZlIGFuZAotCSAgIHRoZSBjYXNlIHN0YXRlbWVudCBpbiBjb25maWd1cmUuaW4uCi0JICAgVmVjdG9ycyB0aGF0IGRvbid0IGNvbXBpbGUgb24gYWxsIHN5c3RlbXMsIG9yIGFyZW4ndCBmaW5pc2hlZCwKLQkgICBzaG91bGQgaGF2ZSBhbiBlbnRyeSBoZXJlIHdpdGggI2lmIDAgYXJvdW5kIGl0LCB0byBzaG93IHRoYXQKLQkgICBpdCB3YXNuJ3Qgb21pdHRlZCBieSBtaXN0YWtlLiAgKi8KLQkmYTI5a2NvZmZfYmlnX3ZlYywKLQkmYV9vdXRfYWRvYmVfdmVjLAotI2lmIDAJCQkJLyogTm8gb25lIHNlZW1zIHRvIHVzZSB0aGlzLiAgKi8KLQkmYW91dF9taXBzX2JpZ192ZWMsCi0jZW5kaWYKLQkmYW91dF9taXBzX2xpdHRsZV92ZWMsCi0JJmJfb3V0X3ZlY19iaWdfaG9zdCwKLQkmYl9vdXRfdmVjX2xpdHRsZV9ob3N0LAotCi0JLyogVGhpcywgYW5kIG90aGVyIHZlY3RvcnMsIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgKi5tdCBjb25maWd1cmF0aW9uLgotCSAgIEJ1dCB0aGF0IGRvZXMgbm90IG1lYW4gdGhleSBhcmUgdW5uZWNlc3NhcnkuICBJZiBjb25maWd1cmVkIHdpdGgKLQkgICAtLWVuYWJsZS10YXJnZXRzPWFsbCwgb2JqZHVtcCBvciBnZGIgc2hvdWxkIGJlIGFibGUgdG8gZXhhbWluZQotCSAgIHRoZSBmaWxlIGV2ZW4gaWYgd2UgZG9uJ3QgcmVjb2duaXplIHRoZSBtYWNoaW5lIHR5cGUuICAqLwotCSZiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJmJmZF9lbGY2NF9hbHBoYV92ZWMsCi0jZW5kaWYKLQkmYmZkX2VsZjMyX2F2cl92ZWMsCi0JJmJmZF9lbGYzMl9iaWdhcmNfdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2JpZ2FybV92ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjLAotCSZiZmRfZWxmMzJfYmlnbWlwc192ZWMsCi0jaWZkZWYgQkZENjQKLQkmYmZkX2VsZjY0X2JpZ21pcHNfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9kMTB2X3ZlYywKLQkmYmZkX2VsZjMyX2QzMHZfdmVjLAotI2lmIDAKLQkmYmZkX2VsZjMyX2hwcGFfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9pMzcwX3ZlYywKLQkmYmZkX2VsZjMyX2kzODZfdmVjLAotCSZiZmRfZWxmMzJfaTg2MF92ZWMsCi0JJmJmZF9lbGYzMl9pOTYwX3ZlYywKLQkmYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYywKLQkmYmZkX2VsZjMyX2xpdHRsZWFyY192ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYywKLSAgICAgICAgJmJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMsCi0JJmJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMsCi0jZW5kaWYKLQkmYmZkX2VsZjMyX20zMnJfdmVjLAotCSZiZmRfZWxmMzJfbW4xMDIwMF92ZWMsCi0JJmJmZF9lbGYzMl9tbjEwMzAwX3ZlYywKLQkmYmZkX2VsZjMyX202OGtfdmVjLAotCSZiZmRfZWxmMzJfbTg4a192ZWMsCi0JJmJmZF9lbGYzMl9zcGFyY192ZWMsCi0JJmJmZF9lbGYzMl9wal92ZWMsCi0JJmJmZF9lbGYzMl9wamxfdmVjLAotCSZiZmRfZWxmMzJfcG93ZXJwY192ZWMsCi0JJmJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjLAotCSZiZmRfZWxmMzJfdjg1MF92ZWMsCi0JJmJmZF9lbGYzMl9mcjMwX3ZlYywKLQkmYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMsCi0JJmJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjLAotI2lmZGVmIEJGRDY0CQkJLyogTm8gb25lIHNlZW1zIHRvIHVzZSB0aGlzLiAgKi8KLQkmYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYywKLQkmYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYywKLSNlbmRpZgotI2lmIDAKLQkmYmZkX2VsZjY0X3NwYXJjX3ZlYywKLSNlbmRpZgotCS8qIFdlIGRvbid0IGluY2x1ZGUgY2lzY29fY29yZV8qX3ZlYy4gIEFsdGhvdWdoIGl0IGhhcyBhIG1hZ2ljIG51bWJlciwKLQkgICB0aGUgbWFnaWMgbnVtYmVyIGlzbid0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUsIGFuZCB0aHVzCi0JICAgbWlnaHQgc3B1cmlvdXNseSBtYXRjaCBvdGhlciBraW5kcyBvZiBmaWxlcy4gICovCi0jaWZkZWYgQkZENjQKLQkmZGVtb182NF92ZWMsCS8qIE9ubHkgY29tcGlsZWQgaWYgaG9zdCBoYXMgbG9uZy1sb25nIHN1cHBvcnQgKi8KLSNlbmRpZgotCSZlY29mZl9iaWdfdmVjLAotCSZlY29mZl9saXR0bGVfdmVjLAotCSZlY29mZl9iaWdsaXR0bGVfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJmVjb2ZmYWxwaGFfbGl0dGxlX3ZlYywKLSNlbmRpZgotCSZoODMwMGNvZmZfdmVjLAotCSZoODUwMGNvZmZfdmVjLAotI2lmIDAKLQkvKiBTaW5jZSBhLm91dCBmaWxlcyBsYWNrIGRlY2VudCBtYWdpYyBudW1iZXJzLCBubyB3YXkgdG8gcmVjb2duaXplCi0JICAgd2hpY2gga2luZCBvZiBhLm91dCBmaWxlIGl0IGlzLiAgKi8KLQkmaG9zdF9hb3V0X3ZlYywKLSNlbmRpZgotI2lmIDAJCQkJLyogQ2xhc2hlcyB3aXRoIHN1bm9zX2JpZ192ZWMgbWFnaWMgbm8uICAqLwotCSZocDMwMGJzZF92ZWMsCi0jZW5kaWYKLQkmaHAzMDBocHV4X3ZlYywKLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikKLSAgICAgICAgJnNvbV92ZWMsCi0jZW5kaWYKLQkmaTM4NmFvdXRfdmVjLAotCSZpMzg2YnNkX3ZlYywKLQkmaTM4NmNvZmZfdmVjLAotCSZpMzg2ZnJlZWJzZF92ZWMsCi0JJmk4NjBjb2ZmX3ZlYywKLQkmYmZkX3Bvd2VycGNfcGVfdmVjLAotCSZiZmRfcG93ZXJwY2xlX3BlX3ZlYywKLQkmYmZkX3Bvd2VycGNfcGVpX3ZlYywKLQkmYmZkX3Bvd2VycGNsZV9wZWlfdmVjLAotCSZnbzMyY29mZl92ZWMsCi0JJmdvMzJzdHViYmVkY29mZl92ZWMsCi0jaWYgMAotCS8qIFNpbmNlIGEub3V0IGZpbGVzIGxhY2sgZGVjZW50IG1hZ2ljIG51bWJlcnMsIG5vIHdheSB0byByZWNvZ25pemUKLQkgICB3aGljaCBraW5kIG9mIGEub3V0IGZpbGUgaXQgaXMuICAqLwotCSZpMzg2bGludXhfdmVjLAotI2VuZGlmCi0JJmkzODZseW54X2FvdXRfdmVjLAotCSZpMzg2bHlueF9jb2ZmX3ZlYywKLSNpZiAwCi0JLyogTm8gZGlzdGluZ3Vpc2hpbmcgZmVhdHVyZXMgZm9yIE1hY2ggMyBleGVjdXRhYmxlcy4gICovCi0JJmkzODZtYWNoM192ZWMsCi0jZW5kaWYKLQkmaTM4Nm1zZG9zX3ZlYywKLQkmaTM4Nm5ldGJzZF92ZWMsCi0JJmkzODZvczlrX3ZlYywKLQkmaTM4NnBlX3ZlYywKLQkmaTM4NnBlaV92ZWMsCi0JJmFybWNvZmZfbGl0dGxlX3ZlYywKLQkmYXJtY29mZl9iaWdfdmVjLAotCSZhcm1uZXRic2RfdmVjLAotCSZhcm1wZV9saXR0bGVfdmVjLAotCSZhcm1wZV9iaWdfdmVjLAotCSZhcm1wZWlfbGl0dGxlX3ZlYywKLQkmYXJtcGVpX2JpZ192ZWMsCi0JJmFybV9lcG9jX3BlX2xpdHRsZV92ZWMsCi0JJmFybV9lcG9jX3BlX2JpZ192ZWMsCi0JJmFybV9lcG9jX3BlaV9saXR0bGVfdmVjLAotCSZhcm1fZXBvY19wZWlfYmlnX3ZlYywKLQkmaWNvZmZfYmlnX3ZlYywKLQkmaWNvZmZfbGl0dGxlX3ZlYywKLQkmaWVlZV92ZWMsCi0JJm02OGtjb2ZmX3ZlYywKLQkmbTY4a2NvZmZ1bl92ZWMsCi0jaWYgMAotCS8qIFNpbmNlIGEub3V0IGZpbGVzIGxhY2sgZGVjZW50IG1hZ2ljIG51bWJlcnMsIG5vIHdheSB0byByZWNvZ25pemUKLQkgICB3aGljaCBraW5kIG9mIGEub3V0IGZpbGUgaXQgaXMuICAqLwotCSZtNjhrbGludXhfdmVjLAotI2VuZGlmCi0JJm02OGtseW54X2FvdXRfdmVjLAotCSZtNjhrbHlueF9jb2ZmX3ZlYywKLQkmbTY4a25ldGJzZF92ZWMsCi0JJm02OGtzeXN2Y29mZl92ZWMsCi0JJm04OGtiY3NfdmVjLAotCSZtODhrbWFjaDNfdmVjLAotCSZtY29yZV9wZV9iaWdfdmVjLAotCSZtY29yZV9wZV9saXR0bGVfdmVjLAotCSZtY29yZV9wZWlfYmlnX3ZlYywKLQkmbWNvcmVfcGVpX2xpdHRsZV92ZWMsCi0JJm5ld3NvczNfdmVjLAotCSZubG0zMl9pMzg2X3ZlYywKLQkmbmxtMzJfc3BhcmNfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJm5sbTMyX2FscGhhX3ZlYywKLSNlbmRpZgotCSZwYzUzMm5ldGJzZF92ZWMsCi0jaWYgMAotCS8qIFdlIGhhdmUgbm8gb2FzeXMgdG9vbHMgYW55bW9yZSwgc28gd2UgY2FuJ3QgdGVzdCBhbnkgb2YgdGhpcwotCSAgIGFueW1vcmUuIElmIHlvdSB3YW50IHRvIHRlc3QgdGhlIHN0dWZmIHlvdXJzZWxmLCBnbyBhaGVhZC4uLgotCSAgIHN0ZXZlQGN5Z251cy5jb20KLQkgICBXb3JzZSwgc2luY2UgdGhlcmUgaXMgbm8gbWFnaWMgbnVtYmVyIGZvciBhcmNoaXZlcywgdGhlcmUKLQkgICBjYW4gYmUgYW5ub3lpbmcgdGFyZ2V0IG1pcy1tYXRjaGVzLiAgKi8KLQkmb2FzeXNfdmVjLAotI2VuZGlmCi0JJnBjNTMybWFjaGFvdXRfdmVjLAotI2lmIDAKLQkvKiBXZSBoYXZlIG5vIHdheSBvZiBkaXN0aW5ndWlzaGluZyB0aGVzZSBmcm9tIG90aGVyIGEub3V0IHZhcmlhbnRzICovCi0JJmFvdXRfYXJtX2JpZ192ZWMsCi0JJmFvdXRfYXJtX2xpdHRsZV92ZWMsCi0JJnJpc2NpeF92ZWMsCi0jZW5kaWYKLSNpZiAwCi0JLyogVGhpcyBoYXMgdGhlIHNhbWUgbWFnaWMgbnVtYmVyIGFzIFJTLzYwMDAuICovCi0JJnBtYWNfeGNvZmZfdmVjLAotI2VuZGlmCi0JJnJzNjAwMGNvZmZfdmVjLAotCSZwcGNib290X3ZlYywKLQkmc2hjb2ZmX3ZlYywKLQkmc2hsY29mZl92ZWMsCi0JJnNoY29mZl9zbWFsbF92ZWMsCi0JJnNobGNvZmZfc21hbGxfdmVjLAotCSZzcGFyY2xlX2FvdXRfdmVjLAotCSZzcGFyY2xpbnV4X3ZlYywKLQkmc3BhcmNseW54X2FvdXRfdmVjLAotCSZzcGFyY2x5bnhfY29mZl92ZWMsCi0JJnNwYXJjbmV0YnNkX3ZlYywKLQkmc3Vub3NfYmlnX3ZlYywKLQkmYW91dDBfYmlnX3ZlYywKLQkmdGljMzBfYW91dF92ZWMsCi0JJnRpYzMwX2NvZmZfdmVjLAotCSZ0aWM4MGNvZmZfdmVjLAotCSZ2YXhuZXRic2RfdmVjLAotCSZ2ZXJzYWRvc192ZWMsCi0jaWZkZWYgQkZENjQKLQkmdm1zX2FscGhhX3ZlYywKLSNlbmRpZgotCSZ2bXNfdmF4X3ZlYywKLQkmd2UzMmtjb2ZmX3ZlYywKLQkmejhrY29mZl92ZWMsCi0KLSNlbmRpZiAvKiBub3QgU0VMRUNUX1ZFQ1MgKi8KLQotLyogQWx3YXlzIHN1cHBvcnQgUy1yZWNvcmRzLCBmb3IgY29udmVuaWVuY2UuICAqLwotCSZzcmVjX3ZlYywKLQkmc3ltYm9sc3JlY192ZWMsCi0vKiBBbmQgdGVraGV4ICovCi0JJnRla2hleF92ZWMsCi0vKiBMaWtld2lzZSBmb3IgYmluYXJ5IG91dHB1dC4gICovCi0JJmJpbmFyeV92ZWMsCi0vKiBMaWtld2lzZSBmb3IgaWhleC4gICovCi0JJmloZXhfdmVjLAotCi0vKiBBZGQgYW55IHJlcXVpcmVkIHRyYWRpdGlvbmFsLWNvcmUtZmlsZS1oYW5kbGVyLiAgKi8KLQotI2lmZGVmIEFJWDM4Nl9DT1JFCi0JJmFpeDM4Nl9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIEhQVVhfQ09SRQotCSZocHV4X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgSFBQQUJTRF9DT1JFCi0JJmhwcGFic2RfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBJUklYX0NPUkUKLQkmaXJpeF9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIE5FVEJTRF9DT1JFCi0JJm5ldGJzZF9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIE9TRl9DT1JFCi0JJm9zZl9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIFNDTzVfQ09SRQotCSZzY281X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYJVFJBRF9DT1JFCi0JJnRyYWRfY29yZV92ZWMsCi0jZW5kaWYKLQotI2lmZGVmCVBUUkFDRV9DT1JFCi0JJnB0cmFjZV9jb3JlX3ZlYywKLSNlbmRpZgotCi0JTlVMTCAvKiBlbmQgb2YgbGlzdCBtYXJrZXIgKi8KLX07Ci0KLS8qIGJmZF9kZWZhdWx0X3ZlY3RvclswXSBjb250YWlucyBlaXRoZXIgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlZmF1bHQgdmVjdG9yLAotICAgaWYgdGhlcmUgaXMgb25lLCBvciB6ZXJvIGlmIHRoZXJlIGlzbid0LiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqYmZkX2RlZmF1bHRfdmVjdG9yW10gPSB7Ci0jaWZkZWYgREVGQVVMVF9WRUNUT1IKLQkmREVGQVVMVF9WRUNUT1IsCi0jZW5kaWYKLQlOVUxMCi19OwotCi0vKiBXaGVuIHRoZXJlIGlzIGFuIGFtYmlndW91cyBtYXRjaCwgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIHB1dHMgdGhlCi0gICBuYW1lcyBvZiB0aGUgbWF0Y2hpbmcgdGFyZ2V0cyBpbiBhbiBhcnJheS4gIFRoaXMgdmFyaWFibGUgaXMgdGhlIG1heGltdW0KLSAgIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgdGhlIGFycmF5IGNvdWxkIHBvc3NpYmx5IG5lZWQuICAqLwotY29uc3Qgc2l6ZV90IF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzID0gc2l6ZW9mKGJmZF90YXJnZXRfdmVjdG9yKS9zaXplb2YoKmJmZF90YXJnZXRfdmVjdG9yKTsKLQwKLS8qIFRoaXMgYXJyYXkgbWFwcyBjb25maWd1cmF0aW9uIHRyaXBsZXRzIG9udG8gQkZEIHZlY3RvcnMuICAqLwotCi1zdHJ1Y3QgdGFyZ21hdGNoCi17Ci0gIC8qIFRoZSBjb25maWd1cmF0aW9uIHRyaXBsZXQuICAqLwotICBjb25zdCBjaGFyICp0cmlwbGV0OwotICAvKiBUaGUgQkZEIHZlY3Rvci4gIElmIHRoaXMgaXMgTlVMTCwgdGhlbiB0aGUgdmVjdG9yIGlzIGZvdW5kIGJ5Ci0gICAgIHNlYXJjaGluZyBmb3J3YXJkIGZvciB0aGUgbmV4dCBzdHJ1Y3R1cmUgd2l0aCBhIG5vbiBOVUxMIHZlY3RvcgotICAgICBmaWVsZC4gICovCi0gIGNvbnN0IGJmZF90YXJnZXQgKnZlY3RvcjsKLX07Ci0KLS8qIHRhcmdtYXRjaC5oIGlzIGJ1aWx0IGJ5IE1ha2VmaWxlIG91dCBvZiBjb25maWcuYmZkLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFyZ21hdGNoIGJmZF90YXJnZXRfbWF0Y2hbXSA9IHsKLSNpbmNsdWRlICJ0YXJnbWF0Y2guaCIKLSAgeyBOVUxMLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpmaW5kX3RhcmdldCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogRmluZCBhIHRhcmdldCB2ZWN0b3IsIGdpdmVuIGEgbmFtZSBvciBjb25maWd1cmF0aW9uIHRyaXBsZXQuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1maW5kX3RhcmdldCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXQ7Ci0gIGNvbnN0IHN0cnVjdCB0YXJnbWF0Y2ggKm1hdGNoOwotCi0gIGZvciAodGFyZ2V0ID0gJmJmZF90YXJnZXRfdmVjdG9yWzBdOyAqdGFyZ2V0ICE9IE5VTEw7IHRhcmdldCsrKQotICAgIGlmIChzdHJjbXAgKG5hbWUsICgqdGFyZ2V0KS0+bmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiAqdGFyZ2V0OwotCi0gIC8qIElmIHdlIGNvdWxkbid0IG1hdGNoIG9uIHRoZSBleGFjdCBuYW1lLCB0cnkgbWF0Y2hpbmcgb24gdGhlCi0gICAgIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gIEZJWE1FOiBXZSBzaG91bGQgcnVuIHRoZSB0cmlwbGV0IHRocm91Z2gKLSAgICAgY29uZmlnLnN1YiBmaXJzdCwgYnV0IHRoYXQgaXMgaGFyZC4gICovCi0gIGZvciAobWF0Y2ggPSAmYmZkX3RhcmdldF9tYXRjaFswXTsgbWF0Y2gtPnRyaXBsZXQgIT0gTlVMTDsgbWF0Y2grKykKLSAgICB7Ci0gICAgICBpZiAoZm5tYXRjaCAobWF0Y2gtPnRyaXBsZXQsIG5hbWUsIDApID09IDApCi0JewotCSAgd2hpbGUgKG1hdGNoLT52ZWN0b3IgPT0gTlVMTCkKLQkgICAgKyttYXRjaDsKLQkgIHJldHVybiBtYXRjaC0+dmVjdG9yOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9kZWZhdWx0X3RhcmdldAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9kZWZhdWx0X3RhcmdldCAoY29uc3QgY2hhciAqbmFtZSk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBkZWZhdWx0IHRhcmdldCB2ZWN0b3IgdG8gdXNlIHdoZW4gcmVjb2duaXppbmcgYSBCRkQuCi0JVGhpcyB0YWtlcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LCB3aGljaCBtYXkgYmUgYSBCRkQgdGFyZ2V0Ci0JbmFtZSBvciBhIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldDsKLQotICBpZiAoYmZkX2RlZmF1bHRfdmVjdG9yWzBdICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgYmZkX2RlZmF1bHRfdmVjdG9yWzBdLT5uYW1lKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHRhcmdldCA9IGZpbmRfdGFyZ2V0IChuYW1lKTsKLSAgaWYgKHRhcmdldCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfZGVmYXVsdF92ZWN0b3JbMF0gPSB0YXJnZXQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZmluZF90YXJnZXQKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfdGFyZ2V0ICpiZmRfZmluZF90YXJnZXQoQ09OU1QgY2hhciAqdGFyZ2V0X25hbWUsIGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdHJhbnNmZXIgdmVjdG9yIGZvciB0aGUgb2JqZWN0IHRhcmdldAotCW5hbWVkIEB2YXJ7dGFyZ2V0X25hbWV9LiAgSWYgQHZhcnt0YXJnZXRfbmFtZX0gaXMgPDxOVUxMPj4sIGNob29zZSB0aGUKLQlvbmUgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDw8R05VVEFSR0VUPj47IGlmIHRoYXQgaXMgbnVsbCBvciBub3QKLQlkZWZpbmVkLCB0aGVuIGNob29zZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhcmdldCBsaXN0LgotCVBhc3NpbmcgaW4gdGhlIHN0cmluZyAiZGVmYXVsdCIgb3Igc2V0dGluZyB0aGUgZW52aXJvbm1lbnQKLQl2YXJpYWJsZSB0byAiZGVmYXVsdCIgd2lsbCBjYXVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhcmdldAotCWxpc3QgdG8gYmUgcmV0dXJuZWQsIGFuZCAidGFyZ2V0X2RlZmF1bHRlZCIgd2lsbCBiZSBzZXQgaW4gdGhlCi0JQkZELiAgVGhpcyBjYXVzZXMgPDxiZmRfY2hlY2tfZm9ybWF0Pj4gdG8gbG9vcCBvdmVyIGFsbCB0aGUKLQl0YXJnZXRzIHRvIGZpbmQgdGhlIG9uZSB0aGF0IG1hdGNoZXMgdGhlIGZpbGUgYmVpbmcgcmVhZC4gICAKLSovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXRfbmFtZSwgYWJmZCkKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0X25hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgY2hhciAqdGFyZ25hbWU7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldDsKLQotICBpZiAodGFyZ2V0X25hbWUgIT0gTlVMTCkKLSAgICB0YXJnbmFtZSA9IHRhcmdldF9uYW1lOwotICBlbHNlCi0gICAgdGFyZ25hbWUgPSBnZXRlbnYgKCJHTlVUQVJHRVQiKTsKLQotICAvKiBUaGlzIGlzIHNhZmU7IHRoZSB2ZWN0b3IgY2Fubm90IGJlIG51bGwgKi8KLSAgaWYgKHRhcmduYW1lID09IE5VTEwgfHwgc3RyY21wICh0YXJnbmFtZSwgImRlZmF1bHQiKSA9PSAwKQotICAgIHsKLSAgICAgIGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSB0cnVlOwotICAgICAgaWYgKGJmZF9kZWZhdWx0X3ZlY3RvclswXSAhPSBOVUxMKQotCWFiZmQtPnh2ZWMgPSBiZmRfZGVmYXVsdF92ZWN0b3JbMF07Ci0gICAgICBlbHNlCi0JYWJmZC0+eHZlYyA9IGJmZF90YXJnZXRfdmVjdG9yWzBdOwotICAgICAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0gICAgfQotCi0gIGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSBmYWxzZTsKLQotICB0YXJnZXQgPSBmaW5kX3RhcmdldCAodGFyZ25hbWUpOwotICBpZiAodGFyZ2V0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYWJmZC0+eHZlYyA9IHRhcmdldDsKLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3RhcmdldF9saXN0Ci0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqKmJmZF90YXJnZXRfbGlzdCh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBmcmVzaGx5IG1hbGxvY2VkIE5VTEwtdGVybWluYXRlZAotCXZlY3RvciBvZiB0aGUgbmFtZXMgb2YgYWxsIHRoZSB2YWxpZCBCRkQgdGFyZ2V0cy4gRG8gbm90Ci0JbW9kaWZ5IHRoZSBuYW1lcy4KLQotKi8KLQotY29uc3QgY2hhciAqKgotYmZkX3RhcmdldF9saXN0ICgpCi17Ci0gIGludCB2ZWNfbGVuZ3RoPSAwOwotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpICYmICEgZGVmaW5lZCAoX19TVERDX18pCi0gIC8qIFRoZSBuYXRpdmUgY29tcGlsZXIgb24gdGhlIEhQOTAwMC83MDAgaGFzIGEgYnVnIHdoaWNoIGNhdXNlcyBpdAotICAgICB0byBsb29wIGVuZGxlc3NseSB3aGVuIGNvbXBpbGluZyB0aGlzIGZpbGUuICBUaGlzIGF2b2lkcyBpdC4gICovCi0gIHZvbGF0aWxlCi0jZW5kaWYKLSAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldDsKLSAgQ09OU1QgIGNoYXIgKipuYW1lX2xpc3QsICoqbmFtZV9wdHI7Ci0KLSAgZm9yICh0YXJnZXQgPSAmYmZkX3RhcmdldF92ZWN0b3JbMF07ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspCi0gICAgdmVjX2xlbmd0aCsrOwotCi0gIG5hbWVfcHRyID0gbmFtZV9saXN0ID0gKENPTlNUIGNoYXIgKiopCi0gICAgYmZkX3ptYWxsb2MgKCh2ZWNfbGVuZ3RoICsgMSkgKiBzaXplb2YgKGNoYXIgKiopKTsKLQotICBpZiAobmFtZV9saXN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yICh0YXJnZXQgPSAmYmZkX3RhcmdldF92ZWN0b3JbMF07ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspCi0gICAgKihuYW1lX3B0cisrKSA9ICgqdGFyZ2V0KS0+bmFtZTsKLQotICByZXR1cm4gbmFtZV9saXN0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2VhY2hfZm9yX3RhcmdldAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF90YXJnZXQgKiBiZmRfc2VhcmNoX2Zvcl90YXJnZXQgKGludCAoKiBzZWFyY2hfZnVuYykoY29uc3QgYmZkX3RhcmdldCAqLCB2b2lkICopLCB2b2lkICopOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHRyYW5zZmVyIHZlY3RvciBpbiB0aGUgbGlzdCBvZgotCXRyYW5zZmVyIHZlY3RvcnMgbWFpbnRhaW5lZCBieSBCRkQgdGhhdCBwcm9kdWNlcyBhIG5vbi16ZXJvCi0JcmVzdWx0IHdoZW4gcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBAdmFye3NlYXJjaF9mdW5jfS4gIFRoZQotCXBhcmFtZXRlciBAdmFye2RhdGF9IGlzIHBhc3NlZCwgdW5leGFtaW5lZCwgdG8gdGhlIHNlYXJjaAotCWZ1bmN0aW9uLgotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1iZmRfc2VhcmNoX2Zvcl90YXJnZXQgKHNlYXJjaF9mdW5jLCBkYXRhKQotICAgICBpbnQgKCogc2VhcmNoX2Z1bmMpIFBBUkFNUyAoKGNvbnN0IGJmZF90YXJnZXQgKiB0YXJnZXQsIHZvaWQgKiBkYXRhKSk7Ci0gICAgIHZvaWQgKiBkYXRhOwotewotICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKiB0YXJnZXQ7Ci0KLSAgZm9yICh0YXJnZXQgPSBiZmRfdGFyZ2V0X3ZlY3RvcjsgKiB0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0ICsrKQotICAgIGlmIChzZWFyY2hfZnVuYyAoKiB0YXJnZXQsIGRhdGEpKQotICAgICAgcmV0dXJuICogdGFyZ2V0OwotCi0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3RhcmdtYXRjaC5zZWQgYi9iZmQvdGFyZ21hdGNoLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0MGU3Mi4uMDAwMDAwMAotLS0gYS9iZmQvdGFyZ21hdGNoLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTEsL1NUQVJUIE9GIHRhcmdtYXRjaC5oLwlkCi0vRU5EIE9GIHRhcmdtYXRjaC5oLywkCQlkCi1zL14jaWYvS0VFUCAjaWYvCi1zL14jZW5kaWYvS0VFUCAjZW5kaWYvCi1zL15bIAldKiMuKiQvLwotcy9eS0VFUCAjLyMvCi1zL1sgCV0qXFwkLy8KLXQgbGFiMQotCTpsYWIxCi1zL1t8IAldW3wgCV0qXChbXnwoKSAJXVtefCgpIAldKlwpWyAJXSp8L3sgIlwxIiwgTlVMTCB9LC9nCi1zL1t8IAldW3wgCV0qXChbXnwoKSAJXVtefCgpIAldKlwpWyAJXSopL3sgIlwxIiwvZwotdCBsYWIyCi1zL15bIAldKnRhcmdfZGVmdmVjPVwoW14gCV0qXCkvI2lmICFkZWZpbmVkIChTRUxFQ1RfVkVDUykgfHwgZGVmaW5lZCAoSEFWRV9cMSkvCi10IGxhYjMKLXMvLio9LiovLwotcy87Oy8vCi1iCi0JOmxhYjIKLUgKLWQKLQk6bGFiMwotRwotcy9cbi8lRU9MJS9nCi1zL1woZGVmaW5lZCAoSEFWRV9cKVwoW14pXSpcKVwoLipcKS9cMVwyXDNcCi1cJlwyIH0sXAotI2VuZGlmLwotcy8lRU9MJS9cCi0vZwotcAotcy8uKi8vZwotcy9cbi8vZwotaApkaWZmIC0tZ2l0IGEvYmZkL3Rla2hleC5jIGIvYmZkL3Rla2hleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZmZTc1Li4wMDAwMDAwCi0tLSBhL2JmZC90ZWtoZXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwNjggKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIEV4dGVuZGVkIFRla3Ryb25peCBIZXggRm9ybWF0ICBvYmplY3RzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU1VCU0VDVElPTgotCVRla3Ryb25peCBIZXggRm9ybWF0IGhhbmRsaW5nCi0KLURFU0NSSVBUSU9OCi0JCi0JVGVrIEhleCByZWNvcmRzIGNhbiBob2xkIHN5bWJvbHMgYW5kIGRhdGEsIGJ1dCBub3QKLQlyZWxvY2F0aW9ucy4gVGhlaXIgbWFpbiBhcHBsaWNhdGlvbiBpcyBjb21tdW5pY2F0aW9uIHdpdGgKLQlkZXZpY2VzIGxpa2UgUFJPTSBwcm9ncmFtbWVycyBhbmQgSUNFIGVxdWlwbWVudC4KLQkKLQlJdCBzZWVtcyB0aGF0IHRoZSBzZWN0aW9ucyBhcmUgZGVzY2liZWQgYXMgYmVpbmcgcmVhbGx5IGJpZywKLSAgICAgICAgdGhlIGV4YW1wbGUgSSBoYXZlIHNheXMgdGhhdCB0aGUgdGV4dCBzZWN0aW9uIGlzIDAuLmZmZmZmZmZmLgotCUJGRCB3b3VsZCBiYXJmIHdpdGggdGhpcywgbWFueSBhcHBzIHdvdWxkIHRyeSB0byBhbGxvYyA0R0IgdG8KLQlyZWFkIGluIHRoZSBmaWxlLgotCi0JVGV4IEhleCBtYXkgY29udGFpbiBtYW55IHNlY3Rpb25zLCBidXQgdGhlIGRhdGEgd2hpY2ggY29tZXMgaW4KLQloYXMgbm8gdGFnIHNheWluZyB3aGljaCBzZWN0aW9uIGl0IGJlbG9uZ3MgdG8sIHNvIHdlIGNyZWF0ZQotCW9uZSBzZWN0aW9uIGZvciBlYWNoIGJsb2NrIG9mIGRhdGEsIGNhbGxlZCAiYmxrbm5ubiIgd2hpY2ggd2UKLQlzdGljayBhbGwgdGhlIGRhdGEgaW50by4KLQotCVRla0hleCBtYXkgY29tZSBvdXQgb2YgCW9yZGVyIGFuZCB0aGVyZSBpcyBubyBoZWFkZXIsIHNvIGFuCi0JaW5pdGlhbCBzY2FuIGlzIHJlcXVpcmVkICB0byBkaXNjb3ZlciB0aGUgbWluaW11bSBhbmQgbWF4aW11bQotCWFkZHJlc3NlcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdm1hIGFuZCBzaXplIG9mIHRoZSBzZWN0aW9ucyB3ZQotCWNyZWF0ZS4KLQlXZSByZWFkIGluIHRoZSBkYXRhIGludG8gcGFnZXMgb2YgQ0hVTktfTUFTSysxIHNpemUgYW5kIHJlYWQKLQl0aGVtIG91dCBmcm9tIHRoYXQgd2hlbmV2ZXIgd2UgbmVlZCB0by4KLQotCUFueSBudW1iZXIgb2Ygc2VjdGlvbnMgbWF5IGJlIGNyZWF0ZWQgZm9yIG91dHB1dCwgd2Ugc2F2ZSB0aGVtCi0JdXAgYW5kIG91dHB1dCB0aGVtIHdoZW4gaXQncyB0aW1lIHRvIGNsb3NlIHRoZSBiZmQuCi0KLQotCUEgVGVrSGV4IHJlY29yZCBsb29rcyBsaWtlOgotRVhBTVBMRQotCSU8YmxvY2sgbGVuZ3RoPjx0eXBlPjxjaGVja3N1bT48c3R1ZmY+PGNyPgotCQotREVTQ1JJUFRJT04KLQlXaGVyZQotCW8gbGVuZ3RoCi0JaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVjb3JkIG5vdCBpbmNsdWRpbmcgdGhlICUgc2lnbi4KLQlvIHR5cGUKLQlpcyBvbmUgb2Y6Ci0JMykgc3ltYm9sIHJlY29yZAotCTYpIGRhdGEgcmVjb3JkCi0JOCkgdGVybWluYXRpb24gcmVjb3JkCi0JCi0KLVRoZSBkYXRhIGNhbiBjb21lIG91dCBvZiBvcmRlciwgYW5kIG1heSBiZSBkaXNjb250aWdvdXMuIFRoaXMgaXMgYQotc2VyaWFsIHByb3RvY29sLCBzbyBiaWcgZmlsZXMgYXJlIHVubGlrZWx5LCBzbyB3ZSBrZWVwIGEgbGlzdCBvZiA4ayBjaHVua3MKLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGJmZF92bWEgbG93OwotICAgIGJmZF92bWEgaGlnaDsKLSAgfSBhZGRyX3JhbmdlX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0Ci0gIHsKLQotICAgIGFzeW1ib2wgc3ltYm9sOwotICAgIHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqcHJldjsKLQotICB9IHRla2hleF9zeW1ib2xfdHlwZTsKLQotc3RhdGljIGNvbnN0IGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotCi1zdGF0aWMgY2hhciBzdW1fYmxvY2tbMjU2XTsKLQotI2RlZmluZSBOT1RfSEVYIDIwCi0jZGVmaW5lIE5JQkJMRSh4KSBoZXhfdmFsdWUoeCkKLSNkZWZpbmUgSEVYKGJ1ZmZlcikgKChOSUJCTEUoKGJ1ZmZlcilbMF0pPDw0KSArIE5JQkJMRSgoYnVmZmVyKVsxXSkpCi0jZGVmaW5lIFRPSEVYKGQseCkgXAotKGQpWzFdID0gZGlnc1soeCkgJiAweGZdOyBcCi0oZClbMF0gPSBkaWdzWygoeCk+PjQpJjB4Zl07Ci0jZGVmaW5lCUlTSEVYKHgpICBoZXhfcCh4KQotCi1zdGF0aWMgdm9pZCB0ZWtoZXhfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkX3ZtYSBnZXR2YWx1ZSBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCB0ZWtoZXhfcHJpbnRfc3ltYm9sCi0gUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHRla2hleF9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGFzeW1ib2wgKnRla2hleF9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCB0ZWtoZXhfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIG91dCBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgd3JpdGVzeW0gUEFSQU1TICgoY2hhciAqKiwgQ09OU1QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZXZhbHVlIFBBUkFNUyAoKGNoYXIgKiosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF9zZXRfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCosIHNlY19wdHIsIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF9zZXRfYXJjaF9tYWNoCi0gUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyB2b2lkIG1vdmVfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlLCBib29sZWFuKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqdGVraGV4X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyB0ZWtoZXhfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIHZvaWQgcGFzc19vdmVyIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqKShiZmQqLCBpbnQsIGNoYXIgKikpKTsKLXN0YXRpYyB2b2lkIGZpcnN0X3BoYXNlIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgaW5zZXJ0X2J5dGUgUEFSQU1TICgoYmZkICosIGludCwgYmZkX3ZtYSkpOwotc3RhdGljIHN0cnVjdCBkYXRhX3N0cnVjdCAqZmluZF9jaHVuayBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotc3RhdGljIHVuc2lnbmVkIGludCBnZXRzeW0gUEFSQU1TICgoY2hhciAqLCBjaGFyICoqKSk7Ci0KLS8qCi1IZXJlJ3MgYW4gZXhhbXBsZQotJTNBNkM2NDgwMDA0RTU2RkZGQzRFNzE3MDYzQjBBRUZGRkM2RDA2NTJBRUZGRkM2MEYyNEU1RTRFNzUKLSUxQjM3MDlUX1NFR01FTlQxMTA4RkZGRkZGRkYKLSUyQjNBQjlUX1NFR01FTlQ3RGdjY19jb21waWxlZCQxMDg3aGVsbG8kYzEwCi0lMzczODI5VF9TRUdNRU5UODBpbnQkdDEkcjEkJDIxNDc0MTA4MGNoYXIkdDIkcjIkMCQxMjcxMAotJTM3Mzc2OVRfU0VHTUVOVDgwbG9uZyRpbnQkdDMkcjEkJDEwODB1bnNpZ25lZCRpbnQkdDQkMTAKLSUzNzNDQTlUX1NFR01FTlQ4MGxvbmckdW5zaWduZWQkaW4xMDgwc2hvcnQkaW50JHQ2JHIxJDEwCi0lMzczMDQ5VF9TRUdNRU5UODBsb25nJGxvbmckaW50JHQ3MTA4MHNob3J0JHVuc2lnbmVkJGkxMAotJTM3M0EyOVRfU0VHTUVOVDgwbG9uZyRsb25nJHVuc2lnbjEwODBzaWduZWQkY2hhciR0MTAkMTAKLSUzNzNENjlUX1NFR01FTlQ4MHVuc2lnbmVkJGNoYXIkdDExMDgwZmxvYXQkdDEyJHIxJDQkMDEwCi0lMzczRDE5VF9TRUdNRU5UODBkb3VibGUkdDEzJHIxJDgkMTA4MGxvbmckZG91YmxlJHQxNCQxMAotJTI3MzREOVRfU0VHTUVOVDhCdm9pZCR0MTUkMTUxMDM1X21haW4xMAotJTJGM0NBOVRfU0VHTUVOVDgxJDEwODEkMTY4MSQxRTgxJDIxNDg3bWFpbiRGMTEwCi0lMjgzMkY5VF9TRUdNRU5UODNpJDE4RkZGRkZGRkM4MSQxNDgxJDIxNAotJTA3IDggMTAgMTAKLQotZXhwbGFuYXRpb246Ci0lM0E2QzY0ODAwMDRFNTZGRkZDNEU3MTcwNjNCMEFFRkZGQzZEMDY1MkFFRkZGQzYwRjI0RTVFNEU3NQotIF4gXl4gXiAgICAgXi1kYXRhCi0gfCB8fCArLS0tLS0tIDQgY2hhciBpbnRlZ2VyIDB4ODAwMAotIHwgfCstLS0tLS0tLSBjaGVja3N1bQotIHwgKy0tLS0tLS0tLSB0eXBlIDYgKGRhdGEgcmVjb3JkKQotICstLS0tLS0tLS0tLSBsZW5ndGggM2EgY2hhcnMKLSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAzYSAoNTggY2hhcnMpIC0tLS0tLS0tLS0tLS0tLS0tLS0+Ci0KLSUxQjM3MDlUX1NFR01FTlQxMTA4RkZGRkZGRkYKLSAgICAgIF4gICAgICAgICBeXiBeLSA4IGNoYXJhY3RlciBpbnRlZ2VyIDB4ZmZmZmZmZmYKLSAgICAgIHwgICAgICAgICB8Ky0gICAxIGNoYXJhY3RlciBpbnRlZ2VyIDAKLSAgICAgIHwgICAgICAgICArLS0gICB0eXBlIDEgc3ltYm9sIChzZWN0aW9uIGRlZmluaXRpb24pCi0gICAgICArLS0tLS0tLS0tLS0tICAgOSBjaGFyIHN5bWJvbCBUX1NFR01FTlQKLQotJTJCM0FCOVRfU0VHTUVOVDdEZ2NjX2NvbXBpbGVkJDEwODdoZWxsbyRjMTAKLSUzNzM4MjlUX1NFR01FTlQ4MGludCR0MSRyMSQkMjE0NzQxMDgwY2hhciR0MiRyMiQwJDEyNzEwCi0lMzczNzY5VF9TRUdNRU5UODBsb25nJGludCR0MyRyMSQkMTA4MHVuc2lnbmVkJGludCR0NCQxMAotJTM3M0NBOVRfU0VHTUVOVDgwbG9uZyR1bnNpZ25lZCRpbjEwODBzaG9ydCRpbnQkdDYkcjEkMTAKLSUzNzMwNDlUX1NFR01FTlQ4MGxvbmckbG9uZyRpbnQkdDcxMDgwc2hvcnQkdW5zaWduZWQkaTEwCi0lMzczQTI5VF9TRUdNRU5UODBsb25nJGxvbmckdW5zaWduMTA4MHNpZ25lZCRjaGFyJHQxMCQxMAotJTM3M0Q2OVRfU0VHTUVOVDgwdW5zaWduZWQkY2hhciR0MTEwODBmbG9hdCR0MTIkcjEkNCQwMTAKLSUzNzNEMTlUX1NFR01FTlQ4MGRvdWJsZSR0MTMkcjEkOCQxMDgwbG9uZyRkb3VibGUkdDE0JDEwCi0lMjczNEQ5VF9TRUdNRU5UOEJ2b2lkJHQxNSQxNTEwMzVfbWFpbjEwCi0lMkYzQ0E5VF9TRUdNRU5UODEkMTA4MSQxNjgxJDFFODEkMjE0ODdtYWluJEYxMTAKLSUyODMyRjlUX1NFR01FTlQ4M2kkMThGRkZGRkZGQzgxJDE0ODEkMjE0Ci0lMDc4MTAxMAotCi1UdXJucyBpbnRvCi1zYWNAdGhlcHViJCAuL29iamR1bXAgLWR4IC1tIG02OGsgZgotCi1mOiAgICAgZmlsZSBmb3JtYXQgdGVraGV4Ci0tLS0tLXgtLS0gOS81NTcyOCAtMTM0MjE5NDE2IFNlcCAyOSAxNToxMyAxOTk1IGYKLWFyY2hpdGVjdHVyZTogVU5LTk9XTiEsIGZsYWdzIDB4MDAwMDAwMTA6Ci1IQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwCi1TRUNUSU9OIDAgW0QwMDAwMDAwMF0JOiBzaXplIDAwMDIwMDAwIHZtYSAwMDAwMDAwMCBhbGlnbiAyKiowCi0gQUxMT0MsIExPQUQKLVNFQ1RJT04gMSBbRDAwMDA4MDAwXQk6IHNpemUgMDAwMDIwMDEgdm1hIDAwMDA4MDAwIGFsaWduIDIqKjAKLQotU0VDVElPTiAyIFtUX1NFR01FTlRdCTogc2l6ZSBmZmZmZmZmZiB2bWEgMDAwMDAwMDAgYWxpZ24gMioqMAotCi1TWU1CT0wgVEFCTEU6Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgZ2NjX2NvbXBpbGVkJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGhlbGxvJGMKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBpbnQkdDEkcjEkJDIxNDc0Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgY2hhciR0MiRyMiQwJDEyNwotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckaW50JHQzJHIxJCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCB1bnNpZ25lZCRpbnQkdDQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyR1bnNpZ25lZCRpbgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHNob3J0JGludCR0NiRyMSQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGxvbmckaW50JHQ3Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgc2hvcnQkdW5zaWduZWQkaQotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckbG9uZyR1bnNpZ24KLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBzaWduZWQkY2hhciR0MTAkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgdW5zaWduZWQkY2hhciR0MQotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGZsb2F0JHQxMiRyMSQ0JDAKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBkb3VibGUkdDEzJHIxJDgkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRkb3VibGUkdDE0JAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHZvaWQkdDE1JDE1Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgX21haW4KLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDEwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbWFpbiRGMQotZmNmZmZmZmYgIGcgICAgICAgVF9TRUdNRU5UIGkkMQotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDEwICBnICAgICAgIFRfU0VHTUVOVCAkCi0KLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbRDAwMDAwMDAwXTogKG5vbmUpCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgW0QwMDAwODAwMF06IChub25lKQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFtUX1NFR01FTlRdOiAobm9uZSkKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBEMDAwMDAwMDA6Ci0uLi4KLTAwMDA4MDAwICgkKyk3ZmYwIGxpbmt3IGZwLCMtNAotMDAwMDgwMDQgKCQrKTdmZjQgbm9wCi0wMDAwODAwNiAoJCspN2ZmNiBtb3ZlbCAjOTksZDAKLTAwMDA4MDA4ICgkKyk3ZmY4IGNtcGwgZnBAKC00KSxkMAotMDAwMDgwMGMgKCQrKTdmZmMgYmx0cyAwMDAwODAxNCAoJCspODAwNAotMDAwMDgwMGUgKCQrKTdmZmUgYWRkcWwgIzEsZnBAKC00KQotMDAwMDgwMTIgKCQrKTgwMDIgYnJhcyAwMDAwODAwNiAoJCspN2ZmNgotMDAwMDgwMTQgKCQrKTgwMDQgdW5sayBmcAotMDAwMDgwMTYgKCQrKTgwMDYgcnRzCi0uLi4KLQotKi8KLQotc3RhdGljIHZvaWQKLXRla2hleF9pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdGF0aWMgYm9vbGVhbiBpbml0ZWQgPSBmYWxzZTsKLSAgaW50IHZhbDsKLQotICBpZiAoaW5pdGVkID09IGZhbHNlKQotICAgIHsKLSAgICAgIGluaXRlZCA9IHRydWU7Ci0gICAgICBoZXhfaW5pdCAoKTsKLSAgICAgIHZhbCA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQl7Ci0JICBzdW1fYmxvY2tbaSArICcwJ10gPSB2YWwrKzsKLQl9Ci0gICAgICBmb3IgKGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspCi0JewotCSAgc3VtX2Jsb2NrW2ldID0gdmFsKys7Ci0JfQotICAgICAgc3VtX2Jsb2NrWyckJ10gPSB2YWwrKzsKLSAgICAgIHN1bV9ibG9ja1snJSddID0gdmFsKys7Ci0gICAgICBzdW1fYmxvY2tbJy4nXSA9IHZhbCsrOwotICAgICAgc3VtX2Jsb2NrWydfJ10gPSB2YWwrKzsKLSAgICAgIGZvciAoaSA9ICdhJzsgaSA8PSAneic7IGkrKykKLQl7Ci0JICBzdW1fYmxvY2tbaV0gPSB2YWwrKzsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgb24gYSBsaW5lIGlzIEZGICovCi0jZGVmaW5lIE1BWENIVU5LIDB4ZmYKLS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgZml0IG9udG8gYSBsaW5lIG9uIG91dHB1dCAqLwotI2RlZmluZSBDSFVOSyAyMQotCi0vKiBXZSBjYW5ub3Qgb3V0cHV0IG91ciB0ZWtoZXhvcmRzIGFzIHdlIHNlZSB0aGVtLCB3ZSBoYXZlIHRvIGdsdWUgdGhlbQotICAgdG9nZXRoZXIsIHRoaXMgaXMgZG9uZSBpbiB0aGlzIHN0cnVjdHVyZSA6ICovCi0KLXN0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3N0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBiZmRfdm1hIHdoZXJlOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIHN0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3N0cnVjdCAqbmV4dDsKLQotfTsKLXR5cGVkZWYgc3RydWN0IHRla2hleF9kYXRhX2xpc3Rfc3RydWN0IHRla2hleF9kYXRhX2xpc3RfdHlwZTsKLQotI2RlZmluZSBDSFVOS19NQVNLIDB4MWZmZgotCi1zdHJ1Y3QgZGF0YV9zdHJ1Y3QKLSAgewotICAgIGNoYXIgY2h1bmtfZGF0YVtDSFVOS19NQVNLICsgMV07Ci0gICAgY2hhciBjaHVua19pbml0W0NIVU5LX01BU0sgKyAxXTsKLSAgICBiZmRfdm1hIHZtYTsKLSAgICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKm5leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHRla2hleF9kYXRhX3N0cnVjdAotewotICB0ZWtoZXhfZGF0YV9saXN0X3R5cGUgKmhlYWQ7Ci0gIHVuc2lnbmVkIGludCB0eXBlOwotICBzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7Ci0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZGF0YTsKLX0gdGRhdGFfdHlwZTsKLQotI2RlZmluZSBlbmRhKHgpICh4LT52bWEgKyB4LT5zaXplKQotCi1zdGF0aWMgYmZkX3ZtYQotZ2V0dmFsdWUgKHNyY3ApCi0gICAgIGNoYXIgKipzcmNwOwotewotICBjaGFyICpzcmMgPSAqc3JjcDsKLSAgYmZkX3ZtYSB2YWx1ZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBsZW4gPSBoZXhfdmFsdWUoKnNyYysrKTsKLQotICBpZiAobGVuID09IDApCi0gICAgbGVuID0gMTY7Ci0gIHdoaWxlIChsZW4tLSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHZhbHVlIDw8IDQgfCBoZXhfdmFsdWUoKnNyYysrKTsKLSAgICB9Ci0gICpzcmNwID0gc3JjOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWdldHN5bSAoZHN0cCwgc3JjcCkKLSAgICAgY2hhciAqZHN0cDsKLSAgICAgY2hhciAqKnNyY3A7Ci17Ci0gIGNoYXIgKnNyYyA9ICpzcmNwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGxlbiA9IGhleF92YWx1ZSgqc3JjKyspOwotCi0gIGlmIChsZW4gPT0gMCkKLSAgICBsZW4gPSAxNjsKLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgIGRzdHBbaV0gPSBzcmNbaV07Ci0gIGRzdHBbaV0gPSAwOwotICAqc3JjcCA9IHNyYyArIGk7Ci0gIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKgotZmluZF9jaHVuayAoYWJmZCwgdm1hKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdm1hOwotewotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKLQotICB2bWEgJj0gfkNIVU5LX01BU0s7Ci0gIHdoaWxlIChkICYmIChkLT52bWEpICE9IHZtYSkKLSAgICB7Ci0gICAgICBkID0gZC0+bmV4dDsKLSAgICB9Ci0gIGlmICghZCkKLSAgICB7Ci0gICAgICBjaGFyICpzbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgMTIpOwotCi0gICAgICAvKiBObyBjaHVuayBmb3IgdGhpcyBhZGRyZXNzLCBzbyBtYWtlIG9uZSB1cCAqLwotICAgICAgZCA9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikKLQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGRhdGFfc3RydWN0KSk7Ci0KLSAgICAgIGlmICghc25hbWUgfHwgIWQpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG1lbXNldCAoZC0+Y2h1bmtfaW5pdCwgMCwgQ0hVTktfTUFTSyArIDEpOwotICAgICAgbWVtc2V0IChkLT5jaHVua19kYXRhLCAwLCBDSFVOS19NQVNLICsgMSk7Ci0gICAgICBkLT5uZXh0ID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGE7Ci0gICAgICBkLT52bWEgPSB2bWE7Ci0gICAgICBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YSA9IGQ7Ci0gICAgfQotICByZXR1cm4gZDsKLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9ieXRlIChhYmZkLCB2YWx1ZSwgYWRkcikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgLyogRmluZCB0aGUgY2h1bmsgdGhhdCB0aGlzIGJ5dGUgbmVlZHMgYW5kIHB1dCBpdCBpbiAqLwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQgPSBmaW5kX2NodW5rIChhYmZkLCBhZGRyKTsKLQotICBkLT5jaHVua19kYXRhW2FkZHIgJiBDSFVOS19NQVNLXSA9IHZhbHVlOwotICBkLT5jaHVua19pbml0W2FkZHIgJiBDSFVOS19NQVNLXSA9IDE7Ci19Ci0KLS8qIFRoZSBmaXJzdCBwYXNzIGlzIHRvIGZpbmQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgc2VjdGlvbnMsIGFuZCBzZWUKLSAgaG93IGJpZyB0aGUgZGF0YSBpcyAqLwotc3RhdGljIHZvaWQKLWZpcnN0X3BoYXNlIChhYmZkLCB0eXBlLCBzcmMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKnNyYzsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBpbnQgbGVuOwotICBjaGFyIHN5bVsxN107CQkJLyogQSBzeW1ib2wgY2FuIG9ubHkgYmUgMTZjaGFycyBsb25nICovCi0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICc2JzoKLSAgICAgIC8qIERhdGEgcmVjb3JkIC0gcmVhZCBpdCBhbmQgc3RvcmUgaXQgKi8KLSAgICAgIHsKLQliZmRfdm1hIGFkZHIgPSBnZXR2YWx1ZSAoJnNyYyk7Ci0KLQl3aGlsZSAoKnNyYykKLQkgIHsKLQkgICAgaW5zZXJ0X2J5dGUgKGFiZmQsIEhFWCAoc3JjKSwgYWRkcik7Ci0JICAgIHNyYyArPSAyOwotCSAgICBhZGRyKys7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybjsKLSAgICBjYXNlICczJzoKLSAgICAgIC8qIFN5bWJvbCByZWNvcmQsIHJlYWQgdGhlIHNlZ21lbnQgKi8KLSAgICAgIGxlbiA9IGdldHN5bSAoc3ltLCAmc3JjKTsKLSAgICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3ltKTsKLSAgICAgIGlmIChzZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIGNoYXIgKm4gPSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpOwotCi0JICBpZiAoIW4pCi0JICAgIGFib3J0KCk7CQkvKiBGSVhNRSAqLwotCSAgbWVtY3B5IChuLCBzeW0sIGxlbiArIDEpOwotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG4pOwotCX0KLSAgICAgIHdoaWxlICgqc3JjKQotCXsKLQkgIHN3aXRjaCAoKnNyYykKLQkgICAgewotCSAgICBjYXNlICcxJzoJCS8qIHNlY3Rpb24gcmFuZ2UgKi8KLQkgICAgICBzcmMrKzsKLQkgICAgICBzZWN0aW9uLT52bWEgPSBnZXR2YWx1ZSAoJnNyYyk7Ci0JICAgICAgc2VjdGlvbi0+X3Jhd19zaXplID0gZ2V0dmFsdWUgKCZzcmMpIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICcwJzoKLQkgICAgY2FzZSAnMic6Ci0JICAgIGNhc2UgJzMnOgotCSAgICBjYXNlICc0JzoKLQkgICAgY2FzZSAnNic6Ci0JICAgIGNhc2UgJzcnOgotCSAgICBjYXNlICc4JzoKLQkgICAgICAvKiBTeW1ib2xzLCBhZGQgdG8gc2VjdGlvbiAqLwotCSAgICAgIHsKLQkJdGVraGV4X3N5bWJvbF90eXBlICpuZXcgPQotCQkodGVraGV4X3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgICAgIHNpemVvZiAodGVraGV4X3N5bWJvbF90eXBlKSk7Ci0JCWNoYXIgdHlwZSA9ICgqc3JjKTsKLQotCQlpZiAoIW5ldykKLQkJICBhYm9ydCgpOwkvKiBGSVhNRSAqLwotCQluZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQkJc3JjKys7Ci0JCWFiZmQtPnN5bWNvdW50Kys7Ci0JCWFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCQluZXctPnByZXYgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+c3ltYm9sczsKLQkJYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPnN5bWJvbHMgPSBuZXc7Ci0JCWxlbiA9IGdldHN5bSAoc3ltLCAmc3JjKTsKLQkJbmV3LT5zeW1ib2wubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSk7Ci0JCWlmICghbmV3LT5zeW1ib2wubmFtZSkKLQkJICBhYm9ydCgpOwkvKiBGSVhNRSAqLwotCQltZW1jcHkgKChjaGFyICopIChuZXctPnN5bWJvbC5uYW1lKSwgc3ltLCBsZW4gKyAxKTsKLQkJbmV3LT5zeW1ib2wuc2VjdGlvbiA9IHNlY3Rpb247Ci0JCWlmICh0eXBlIDw9ICc0JykKLQkJICBuZXctPnN5bWJvbC5mbGFncyA9IChCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCk7Ci0JCWVsc2UKLQkJICBuZXctPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQkJbmV3LT5zeW1ib2wudmFsdWUgPSBnZXR2YWx1ZSAoJnNyYykgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogUGFzcyBvdmVyIGFuIHRla2hleCwgY2FsbGluZyBvbmUgb2YgdGhlIGFib3ZlIGZ1bmN0aW9ucyBvbiBlYWNoCi0gICByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFzc19vdmVyIChhYmZkLCBmdW5jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKLXsKLSAgdW5zaWduZWQgaW50IGNoYXJzX29uX2xpbmU7Ci0gIGJvb2xlYW4gZW9mID0gZmFsc2U7Ci0KLSAgLyogVG8gdGhlIGZyb250IG9mIHRoZSBmaWxlICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgd2hpbGUgKGVvZiA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZmZlcltNQVhDSFVOS107Ci0gICAgICBjaGFyICpzcmMgPSBidWZmZXI7Ci0gICAgICBjaGFyIHR5cGU7Ci0KLSAgICAgIC8qIEZpbmQgZmlyc3QgJyUnICovCi0gICAgICBlb2YgPSAoYm9vbGVhbikgKGJmZF9yZWFkIChzcmMsIDEsIDEsIGFiZmQpICE9IDEpOwotICAgICAgd2hpbGUgKCpzcmMgIT0gJyUnICYmICFlb2YpCi0JewotCSAgZW9mID0gKGJvb2xlYW4pIChiZmRfcmVhZCAoc3JjLCAxLCAxLCBhYmZkKSAhPSAxKTsKLQl9Ci0gICAgICBpZiAoZW9mKQotCWJyZWFrOwotICAgICAgc3JjKys7Ci0KLSAgICAgIC8qIEZldGNoIHRoZSB0eXBlIGFuZCB0aGUgbGVuZ3RoIGFuZCB0aGUgY2hlY2tzdW0gKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoc3JjLCAxLCA1LCBhYmZkKSAhPSA1KQotCWFib3J0ICgpOyAvKiBGSVhNRSAqLwotCi0gICAgICB0eXBlID0gc3JjWzJdOwotCi0gICAgICBpZiAoIUlTSEVYIChzcmNbMF0pIHx8ICFJU0hFWCAoc3JjWzFdKSkKLQlicmVhazsKLQotICAgICAgY2hhcnNfb25fbGluZSA9IEhFWCAoc3JjKSAtIDU7CS8qIEFscmVhZHkgcmVhZCBmaXZlIGNoYXIgKi8KLQotICAgICAgaWYgKGJmZF9yZWFkIChzcmMsIDEsIGNoYXJzX29uX2xpbmUsIGFiZmQpICE9IGNoYXJzX29uX2xpbmUpCi0JYWJvcnQgKCk7IC8qIEZJWE1FICovCi0gICAgICBzcmNbY2hhcnNfb25fbGluZV0gPSAwOwkvKiBwdXQgYSBudWxsIGF0IHRoZSBlbmQgKi8KLQotICAgICAgZnVuYyAoYWJmZCwgdHlwZSwgc3JjKTsKLSAgICB9Ci0KLX0KLQotc3RhdGljIGxvbmcKLXRla2hleF9nZXRfc3ltdGFiIChhYmZkLCB0YWJsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqdGFibGU7Ci17Ci0gIHRla2hleF9zeW1ib2xfdHlwZSAqcCA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5zeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgYyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gIHRhYmxlW2NdID0gMDsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgdGFibGVbLS1jXSA9ICYocC0+c3ltYm9sKTsKLSAgICAgIHAgPSBwLT5wcmV2OwotICAgIH0KLQotICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci19Ci0KLXN0YXRpYyBsb25nCi10ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGFiZmQtPnN5bWNvdW50ICsgMSkgKiAoc2l6ZW9mIChzdHJ1Y3QgdGVraGV4X2FzeW1ib2xfc3RydWN0ICopKTsKLQotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHRkYXRhX3R5cGUgKnRkYXRhID0gKHRkYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHRkYXRhX3R5cGUpKTsKLQotICBpZiAoIXRkYXRhKQotICAgIHJldHVybiBmYWxzZTsKLSAgYWJmZC0+dGRhdGEudGVraGV4X2RhdGEgPSB0ZGF0YTsKLSAgdGRhdGEtPnR5cGUgPSAxOwotICB0ZGF0YS0+aGVhZCA9ICh0ZWtoZXhfZGF0YV9saXN0X3R5cGUgKikgTlVMTDsKLSAgdGRhdGEtPnN5bWJvbHMgPSAoc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICopIE5VTEw7Ci0gIHRkYXRhLT5kYXRhID0gKHN0cnVjdCBkYXRhX3N0cnVjdCAqKSBOVUxMOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLSAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgbG9va3MgbGlrZSBpdCdzIGluIFRla0hleCBmb3JtYXQuIEp1c3QgbG9vawotICBmb3IgYSBwZXJjZW50IHNpZ24gYW5kIHNvbWUgaGV4IGRpZ2l0cyAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10ZWtoZXhfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBiWzRdOwotCi0gIHRla2hleF9pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGIsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJbMF0gIT0gJyUnIHx8ICFJU0hFWCAoYlsxXSkgfHwgIUlTSEVYIChiWzJdKSB8fCAhSVNIRVggKGJbM10pKQotICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotCi0gIHRla2hleF9ta29iamVjdCAoYWJmZCk7Ci0KLSAgcGFzc19vdmVyIChhYmZkLCBmaXJzdF9waGFzZSk7Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgdm9pZAotbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQsIGdldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9ucDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGJvb2xlYW4gZ2V0OwotewotICBiZmRfdm1hIGFkZHI7Ci0gIGNoYXIgKmxvY2F0aW9uID0gKGNoYXIgKikgbG9jYXRpb25wOwotICBiZmRfdm1hIHByZXZfbnVtYmVyID0gMTsJLyogTm90aGluZyBjYW4gaGF2ZSB0aGlzIGFzIGEgaGlnaCBiaXQqLwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQgPSAoc3RydWN0IGRhdGFfc3RydWN0ICopIE5VTEw7Ci0KLSAgZm9yIChhZGRyID0gc2VjdGlvbi0+dm1hOyBjb3VudCAhPSAwOyBjb3VudC0tLCBhZGRyKyspCi0gICAgewotCi0gICAgICBiZmRfdm1hIGNodW5rX251bWJlciA9IGFkZHIgJiB+Q0hVTktfTUFTSzsJLyogR2V0IGhpZ2ggYml0cyBvZiBhZGRyZXNzICovCi0gICAgICBiZmRfdm1hIGxvd19iaXRzID0gYWRkciAmIENIVU5LX01BU0s7Ci0KLSAgICAgIGlmIChjaHVua19udW1iZXIgIT0gcHJldl9udW1iZXIpCi0JewotCSAgLyogRGlmZmVyZW50IGNodW5rLCBzbyBtb3ZlIHBvaW50ZXIgKi8KLQkgIGQgPSBmaW5kX2NodW5rIChhYmZkLCBjaHVua19udW1iZXIpOwotCX0KLQotICAgICAgaWYgKGdldCkKLQl7Ci0JICBpZiAoZC0+Y2h1bmtfaW5pdFtsb3dfYml0c10pCi0JICAgIHsKLQkgICAgICAqbG9jYXRpb24gPSBkLT5jaHVua19kYXRhW2xvd19iaXRzXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKmxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkLT5jaHVua19kYXRhW2xvd19iaXRzXSA9ICpsb2NhdGlvbjsKLQkgIGQtPmNodW5rX2luaXRbbG93X2JpdHNdID0gKCpsb2NhdGlvbiAhPSAwKTsKLQl9Ci0KLSAgICAgIGxvY2F0aW9uKys7Ci0KLSAgICB9Ci0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXRla2hleF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb25wOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChzZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0gICAgewotICAgICAgbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQsIHRydWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0vKiB3ZSBoYXZlIHRvIHNhdmUgdXAgYWxsIHRoZSBUZWtoZXhvcmRzIGZvciBhIHNwbHVyZ2UgYmVmb3JlIG91dHB1dCwKLSAgICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgYnl0ZXNfdG9fZG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb25wOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgYnl0ZXNfdG9fZG87Ci17Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogVGhlIGZpcnN0IHRpbWUgYXJvdW5kLCBhbGxvY2F0ZSBlbm91Z2ggc2VjdGlvbnMgdG8gaG9sZCBhbGwgdGhlIGNodW5rcyAqLwotICAgICAgYXNlY3Rpb24gKnMgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgIGJmZF92bWEgdm1hOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCi0JICAgIHsKLQkgICAgICBmb3IgKHZtYSA9IHMtPnZtYSAmIH5DSFVOS19NQVNLOwotCQkgICB2bWEgPCBzLT52bWEgKyBzLT5fcmF3X3NpemU7Ci0JCSAgIHZtYSArPSBDSFVOS19NQVNLKQotCQlmaW5kX2NodW5rIChhYmZkLCB2bWEpOwotCSAgICB9Ci0JfQotCi0gICAgfQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQotICAgIHsKLSAgICAgIG1vdmVfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGJ5dGVzX3RvX2RvLCBmYWxzZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0KLX0KLQotc3RhdGljIHZvaWQKLXdyaXRldmFsdWUgKGRzdCwgdmFsdWUpCi0gICAgIGNoYXIgKipkc3Q7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGNoYXIgKnAgPSAqZHN0OwotICBpbnQgbGVuOwotICBpbnQgc2hpZnQ7Ci0KLSAgZm9yIChsZW4gPSA4LCBzaGlmdCA9IDI4OyBzaGlmdDsgc2hpZnQgLT0gNCwgbGVuLS0pCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSA+PiBzaGlmdCkgJiAweGYpCi0JewotCSAgKnArKyA9IGxlbiArICcwJzsKLQkgIHdoaWxlIChsZW4pCi0JICAgIHsKLQkgICAgICAqcCsrID0gZGlnc1sodmFsdWUgPj4gc2hpZnQpICYgMHhmXTsKLQkgICAgICBzaGlmdCAtPSA0OwotCSAgICAgIGxlbi0tOwotCSAgICB9Ci0JICAqZHN0ID0gcDsKLQkgIHJldHVybjsKLQotCX0KLSAgICB9Ci0gICpwKysgPSAnMSc7Ci0gICpwKysgPSAnMCc7Ci0gICpkc3QgPSBwOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVzeW0gKGRzdCwgc3ltKQotICAgICBjaGFyICoqZHN0OwotICAgICBDT05TVCBjaGFyICpzeW07Ci17Ci0gIGNoYXIgKnAgPSAqZHN0OwotICBpbnQgbGVuID0gKHN5bSA/IHN0cmxlbiAoc3ltKSA6IDApOwotCi0gIGlmIChsZW4gPj0gMTYpCi0gICAgewotICAgICAgKnArKyA9ICcwJzsKLSAgICAgIGxlbiA9IDE2OwotICAgIH0KLQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxlbiA9PSAwKQotCXsKLQkgICpwKysgPSAnMSc7Ci0JICBzeW0gPSAiJCI7Ci0JICBsZW4gPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqcCsrID0gZGlnc1tsZW5dOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKGxlbi0tKQotICAgIHsKLSAgICAgICpwKysgPSAqc3ltKys7Ci0gICAgfQotICAqZHN0ID0gcDsKLX0KLQotc3RhdGljIHZvaWQKLW91dCAoYWJmZCwgdHlwZSwgc3RhcnQsIGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqc3RhcnQ7Ci0gICAgIGNoYXIgKmVuZDsKLXsKLSAgaW50IHN1bSA9IDA7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgZnJvbnRbNl07Ci0gIGJmZF9zaXplX3R5cGUgd3JsZW47Ci0KLSAgZnJvbnRbMF0gPSAnJSc7Ci0gIFRPSEVYIChmcm9udCArIDEsIGVuZCAtIHN0YXJ0ICsgNSk7Ci0gIGZyb250WzNdID0gdHlwZTsKLQotICBmb3IgKHMgPSBzdGFydDsgcyA8IGVuZDsgcysrKQotICAgIHsKLSAgICAgIHN1bSArPSBzdW1fYmxvY2tbKHVuc2lnbmVkIGNoYXIpICpzXTsKLSAgICB9Ci0KLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbMV1dOwkvKiAgbGVuZ3RoICovCi0gIHN1bSArPSBzdW1fYmxvY2tbKHVuc2lnbmVkIGNoYXIpIGZyb250WzJdXTsKLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbM11dOwkvKiB0eXBlICovCi0gIFRPSEVYIChmcm9udCArIDQsIHN1bSk7Ci0gIGlmIChiZmRfd3JpdGUgKGZyb250LCAxLCA2LCBhYmZkKSAhPSA2KQotICAgIGFib3J0ICgpOwotICBlbmRbMF0gPSAnXG4nOwotICB3cmxlbiA9IGVuZCAtIHN0YXJ0ICsgMTsKLSAgaWYgKGJmZF93cml0ZSAoc3RhcnQsIDEsIHdybGVuLCBhYmZkKSAhPSB3cmxlbikKLSAgICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGJ5dGVzX3dyaXR0ZW47Ci0gIGNoYXIgYnVmZmVyWzEwMF07Ci0gIGFzeW1ib2wgKipwOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkOwotCi0gIHRla2hleF9pbml0ICgpOwotCi0gIGJ5dGVzX3dyaXR0ZW4gPSAwOwotCi0gIC8qIEFuZCB0aGUgcmF3IGRhdGEgKi8KLSAgZm9yIChkID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGE7Ci0gICAgICAgZCAhPSAoc3RydWN0IGRhdGFfc3RydWN0ICopIE5VTEw7Ci0gICAgICAgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaW50IGxvdzsKLQotICAgICAgQ09OU1QgaW50IHNwYW4gPSAzMjsKLSAgICAgIGludCBhZGRyOwotCi0gICAgICAvKiBXcml0ZSBpdCBpbiBibG9ja3Mgb2YgMzIgYnl0ZXMgKi8KLQotICAgICAgZm9yIChhZGRyID0gMDsgYWRkciA8IENIVU5LX01BU0sgKyAxOyBhZGRyICs9IHNwYW4pCi0JewotCSAgaW50IG5lZWQgPSAwOwotCi0JICAvKiBDaGVjayB0byBzZWUgaWYgbmVjZXNzYXJ5ICovCi0JICBmb3IgKGxvdyA9IDA7ICFuZWVkICYmIGxvdyA8IHNwYW47IGxvdysrKQotCSAgICB7Ci0JICAgICAgaWYgKGQtPmNodW5rX2luaXRbYWRkciArIGxvd10pCi0JCW5lZWQgPSAxOwotCSAgICB9Ci0JICBpZiAobmVlZCkKLQkgICAgewotCSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotCSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIGFkZHIgKyBkLT52bWEpOwotCSAgICAgIGZvciAobG93ID0gMDsgbG93IDwgc3BhbjsgbG93KyspCi0JCXsKLQkJICBUT0hFWCAoZHN0LCBkLT5jaHVua19kYXRhW2FkZHIgKyBsb3ddKTsKLQkJICBkc3QgKz0gMjsKLQkJfQotCSAgICAgIG91dCAoYWJmZCwgJzYnLCBidWZmZXIsIGRzdCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiB3cml0ZSBhbGwgdGhlIHNlY3Rpb24gaGVhZGVycyBmb3IgdGhlIHNlY3Rpb25zICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyICpkc3QgPSBidWZmZXI7Ci0KLSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5uYW1lKTsKLSAgICAgICpkc3QrKyA9ICcxJzsKLSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIHMtPnZtYSk7Ci0gICAgICB3cml0ZXZhbHVlICgmZHN0LCBzLT52bWEgKyBzLT5fcmF3X3NpemUpOwotICAgICAgb3V0IChhYmZkLCAnMycsIGJ1ZmZlciwgZHN0KTsKLSAgICB9Ci0KLSAgLyogQW5kIHRoZSBzeW1ib2xzICovCi0gIGlmIChhYmZkLT5vdXRzeW1ib2xzKQotICAgIHsKLSAgICAgIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHM7ICpwOyBwKyspCi0JewotCSAgaW50IHNlY3Rpb25fY29kZSA9IGJmZF9kZWNvZGVfc3ltY2xhc3MgKCpwKTsKLQotCSAgaWYgKHNlY3Rpb25fY29kZSAhPSAnPycpCi0JICAgIHsJCQkvKiBkbyBub3QgaW5jbHVkZSBkZWJ1ZyBzeW1ib2xzICovCi0JICAgICAgYXN5bWJvbCAqcyA9ICpwOwotCSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotCSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5zZWN0aW9uLT5uYW1lKTsKLQotCSAgICAgIHN3aXRjaCAoc2VjdGlvbl9jb2RlKQotCQl7Ci0JCWNhc2UgJ0EnOgotCQkgICpkc3QrKyA9ICcyJzsKLQkJICBicmVhazsKLQkJY2FzZSAnYSc6Ci0JCSAgKmRzdCsrID0gJzYnOwotCQkgIGJyZWFrOwotCQljYXNlICdEJzoKLQkJY2FzZSAnQic6Ci0JCWNhc2UgJ08nOgotCQkgICpkc3QrKyA9ICc0JzsKLQkJICBicmVhazsKLQkJY2FzZSAnZCc6Ci0JCWNhc2UgJ2InOgotCQljYXNlICdvJzoKLQkJICAqZHN0KysgPSAnOCc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1QnOgotCQkgICpkc3QrKyA9ICczJzsKLQkJICBicmVhazsKLQkJY2FzZSAndCc6Ci0JCSAgKmRzdCsrID0gJzcnOwotCQkgIGJyZWFrOwotCQljYXNlICdDJzoKLQkJY2FzZSAnVSc6Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICB3cml0ZXN5bSAoJmRzdCwgcy0+bmFtZSk7Ci0JICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgcy0+dmFsdWUgKyBzLT5zZWN0aW9uLT52bWEpOwotCSAgICAgIG91dCAoYWJmZCwgJzMnLCBidWZmZXIsIGRzdCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFuZCB0aGUgdGVybWluYXRvciAqLwotICBpZiAoYmZkX3dyaXRlICgiJTA3ODEwMTBcbiIsIDEsIDksIGFiZmQpICE9IDkpCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci10ZWtoZXhfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLQotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotdGVraGV4X21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHRla2hleF9zeW1ib2xfdHlwZSAqbmV3ID0KLSAgKHRla2hleF9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCkpOwotCi0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmV3LT5wcmV2ID0gKHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqKSBOVUxMOwotICByZXR1cm4gJihuZXctPnN5bWJvbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10ZWtoZXhfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotc3RhdGljIHZvaWQKLXRla2hleF9wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBmaWxlcCwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uLT5uYW1lOwotCi0JYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQotCWZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JCSBzZWN0aW9uX25hbWUsCi0JCSBzeW1ib2wtPm5hbWUpOwotICAgICAgfQotICAgIH0KLX0KLQotI2RlZmluZQl0ZWtoZXhfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHRla2hleF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgdGVraGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSB0ZWtoZXhfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSB0ZWtoZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHRla2hleF9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSB0ZWtoZXhfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSB0ZWtoZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSB0ZWtoZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgdGVraGV4X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgdGVraGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgdGVraGV4X2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgdGVraGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHRla2hleF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLSNkZWZpbmUgdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotY29uc3QgYmZkX3RhcmdldCB0ZWtoZXhfdmVjID0KLXsKLSAgInRla2hleCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChFWEVDX1AgfAkJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX1NZTVMgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1JFTE9DIHwgSEFTX0xPQ0FMUyB8Ci0gICBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgdGVraGV4X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHRla2hleF9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHRla2hleCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh0ZWtoZXgpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3RyYWQtY29yZS5jIGIvYmZkL3RyYWQtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNjNTNkLi4wMDAwMDAwCi0tLSBhL2JmZC90cmFkLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKiBCRkQgYmFjayBlbmQgZm9yIHRyYWRpdGlvbmFsIFVuaXggY29yZSBmaWxlcyAoVS1hcmVhIGFuZCByYXcgc2VjdGlvbnMpCi0gICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4JCS8qIEFmdGVyIGEub3V0LmggICovCi0KLSNpZmRlZiBUUkFEX0hFQURFUgotI2luY2x1ZGUgVFJBRF9IRUFERVIKLSNlbmRpZgotCi0gIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0IAotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhX3NlY3Rpb247Ci0gICAgICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKLSAgICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgICAgIHN0cnVjdCB1c2VyIHU7Ci0gICAgfTsKLQotI2RlZmluZSBjb3JlX3VwYWdlKGJmZCkgKCYoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51KSkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+ZGF0YV9zZWN0aW9uKQotI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5yZWdfc2VjdGlvbikKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqdHJhZF91bml4X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY2hhciAqCQl0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWludAkJdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JCXRyYWRfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQkJCSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZAlzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogSGFuZGxlIDQuMi1zdHlsZSAoYW5kIHBlcmhhcHMgYWxzbyBzeXNWLXN0eWxlKSBjb3JlIGR1bXAgZmlsZS4gICovCi0KLS8qIEFSR1NVU0VEICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXRyYWRfdW5peF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotCi17Ci0gIGludCB2YWw7Ci0gIHN0cnVjdCB1c2VyIHU7Ci0gIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICpyYXdwdHI7Ci0KLSNpZmRlZiBUUkFEX0NPUkVfVVNFUl9PRkZTRVQKLSAgLyogSWYgZGVmaW5lZCwgdGhpcyBtYWNybyBpcyB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGUgdXNlciBzdHJ1Y3QuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIFRSQURfQ09SRV9VU0VSX09GRlNFVCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICAKLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJnUsIDEsIHNpemVvZiB1LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgdSkKLSAgICB7Ci0gICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayBwZXJoYXBzPz8/ICovCi0gIGlmICh1LnVfZHNpemUgPiAweDEwMDAwMDApCS8qIFJlbWVtYmVyLCBpdCdzIGluIHBhZ2VzLi4uICovCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmICh1LnVfc3NpemUgPiAweDEwMDAwMDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgc2l6ZSBjbGFpbWVkIGlzIG5vIGdyZWF0ZXIgdGhhbiB0aGUgZmlsZSBzaXplLiAgKi8KLSAgewotICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIChOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZQotI2lmZGVmIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQotCQkJCSAtIHUudV90c2l6ZQotI2VuZGlmCi0JCQkJICsgdS51X3NzaXplKSkKLQk+ICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSNpZm5kZWYgVFJBRF9DT1JFX0FMTE9XX0FOWV9FWFRSQV9TSVpFCi0gICAgaWYgKCh1bnNpZ25lZCBsb25nKSAoTkJQRyAqIChVUEFHRVMgKyB1LnVfZHNpemUgKyB1LnVfc3NpemUpCi0jaWZkZWYgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRAotCS8qIFNvbWUgc3lzdGVtcyB3cml0ZSB0aGUgZmlsZSB0b28gYmlnLiAgKi8KLQkJCSArIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQKLSNlbmRpZgotCQkJICkKLQk8ICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JLyogVGhlIGZpbGUgaXMgdG9vIGJpZy4gIE1heWJlIGl0J3Mgbm90IGEgY29yZSBmaWxlCi0JICAgb3Igd2Ugb3RoZXJ3aXNlIGhhdmUgYmFkIHZhbHVlcyBmb3IgdV9kc2l6ZSBhbmQgdV9zc2l6ZSkuICAqLwotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotI2VuZGlmCi0gIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICAvKiBBbGxvY2F0ZSBib3RoIHRoZSB1cGFnZSBhbmQgdGhlIHN0cnVjdCBjb3JlX2RhdGEgYXQgb25jZSwgc28KLSAgICAgYSBzaW5nbGUgZnJlZSgpIHdpbGwgZnJlZSB0aGVtIGJvdGguICAqLwotICByYXdwdHIgPSAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKikKLQkJYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLSAgcmF3cHRyLT51ID0gdTsgLypDb3B5IHRoZSB1YXJlYSBpbnRvIHRoZSB0ZGF0YSBwYXJ0IG9mIHRoZSBiZmQgKi8KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIGZyZWUKLSAgICAgdGhlbSBzZXBhcmF0ZWx5LiAgKi8KLQotICBjb3JlX3N0YWNrc2VjKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfc3RhY2tzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9kYXRhc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5hbWUgPSAiLnN0YWNrIjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmFtZSA9ICIuZGF0YSI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSAgTkJQRyAqIHUudV9kc2l6ZQotI2lmZGVmIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQotICAgIC0gTkJQRyAqIHUudV90c2l6ZQotI2VuZGlmCi0gICAgICA7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOQlBHICogdS51X3NzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5CUEcgKiBVUEFHRVM7IC8qIExhcmdlciB0aGFuIHNpemVvZiBzdHJ1Y3QgdSAqLwotCi0gIC8qIFdoYXQgYSBoYWNrLi4uIHdlJ2QgbGlrZSB0byBzdGVhbCBpdCBmcm9tIHRoZSBleGVjIGZpbGUsCi0gICAgIHNpbmNlIHRoZSB1cGFnZSBkb2VzIG5vdCBzZWVtIHRvIHByb3ZpZGUgaXQuICBGSVhNRS4gICovCi0jaWZkZWYgSE9TVF9EQVRBX1NUQVJUX0FERFIKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gSE9TVF9EQVRBX1NUQVJUX0FERFI7Ci0jZWxzZQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1RFWFRfU1RBUlRfQUREUiArIChOQlBHICogdS51X3RzaXplKTsKLSNlbmRpZgotCi0jaWZkZWYgSE9TVF9TVEFDS19TVEFSVF9BRERSCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1NUQUNLX1NUQVJUX0FERFI7Ci0jZWxzZQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gSE9TVF9TVEFDS19FTkRfQUREUiAtIChOQlBHICogdS51X3NzaXplKTsKLSNlbmRpZgotCi0gIC8qIFRoaXMgaXMgdHJpY2t5LiAgQXMgdGhlICJyZWdpc3RlciBzZWN0aW9uIiwgd2UgZ2l2ZSB0aGVtIHRoZSBlbnRpcmUKLSAgICAgdXBhZ2UgYW5kIHN0YWNrLiAgdS51X2FyMCBwb2ludHMgdG8gd2hlcmUgInJlZ2lzdGVyIDAiIGlzIHN0b3JlZC4KLSAgICAgVGhlcmUgYXJlIHR3byB0cmlja3Mgd2l0aCB0aGlzLCB0aG91Z2guICBPbmUgaXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUKLSAgICAgcmVnaXN0ZXJzIG1pZ2h0IGJlIGF0IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIChvciBib3RoKSBkaXNwbGFjZW1lbnRzCi0gICAgIGZyb20gKnVfYXIwLiAgVGhlIG90aGVyIGlzIHRoYXQgdV9hcjAgaXMgc29tZXRpbWVzIGFuIGFic29sdXRlIGFkZHJlc3MKLSAgICAgaW4ga2VybmVsIG1lbW9yeSwgYW5kIG9uIG90aGVyIHN5c3RlbXMgaXQgaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgYHN0cnVjdCB1c2VyJy4KLSAgICAgCi0gICAgIEFzIGEgcHJhY3RpY2FsIG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVnaXN0ZXJzIGFjdHVhbGx5IGFyZSwKLSAgICAgc28gd2UgaGF2ZSB0byBwYXNzIHRoZSB3aG9sZSBhcmVhIHRvIEdEQi4gIFdlIGVuY29kZSB0aGUgdmFsdWUgb2YgdV9hcjAKLSAgICAgYnkgc2V0dGluZyB0aGUgLnJlZ3Mgc2VjdGlvbiB1cCBzbyB0aGF0IGl0cyB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzCi0gICAgIDAgaXMgYXQgdGhlIHBsYWNlIHBvaW50ZWQgdG8gYnkgdV9hcjAgKGJ5IHNldHRpbmcgdGhlIHZtYSBvZiB0aGUgc3RhcnQKLSAgICAgb2YgdGhlIHNlY3Rpb24gdG8gLXVfYXIwKS4gIEdEQiB1c2VzIHRoaXMgaW5mbyB0byBsb2NhdGUgdGhlIHJlZ3MsCi0gICAgIHVzaW5nIG1pbm9yIHRyaWNrZXJ5IHRvIGdldCBhcm91bmQgdGhlIG9mZnNldC1vci1hYnNvbHV0ZS1hZGRyIHByb2JsZW0uICovCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gLSAoYmZkX3ZtYSkgdS51X2FyMDsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTkJQRyAqIFVQQUdFUzsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoTkJQRyAqIFVQQUdFUykgKyBOQlBHICogdS51X2RzaXplCi0jaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCi0gICAgLSBOQlBHICogdS51X3RzaXplCi0jZW5kaWYKLSAgICAgIDsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gMDsgLyogUmVnaXN0ZXIgc2VnbWVudCBpcyB0aGUgdXBhZ2UgKi8KLQotICAvKiBBbGlnbiB0byB3b3JkIGF0IGxlYXN0ICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgYWJmZC0+c2VjdGlvbnMgPSBjb3JlX3N0YWNrc2VjIChhYmZkKTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX2RhdGFzZWMgKGFiZmQpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWdzZWMgKGFiZmQpOwotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotY2hhciAqCi10cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmbmRlZiBOT19DT1JFX0NPTU1BTkQKLSAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9jb21tOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0jZW5kaWYKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMCi0gIHJldHVybiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGlnbm9yZV9hYmZkKTsKLSNlbHNlCi0gIHJldHVybiAtMTsJCS8qIEZJWE1FLCB3aGVyZSBpcyBpdD8gKi8KLSNlbmRpZgotfQotCi0vKiBBUkdTVVNFRCAqLwotYm9vbGVhbgotdHJhZF91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmV4ZWNfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgdHJhZF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAidHJhZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgdHJhZF91bml4X2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAodHJhZF91bml4KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC92YXhuZXRic2QuYyBiL2JmZC92YXhuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzN2QwOS4uMDAwMDAwMAotLS0gYS9iZmQvdmF4bmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9WQVggYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLSN1bmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkxMDI0Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX3ZheAotI2RlZmluZQlERUZBVUxUX01JRCAJTV9WQVhfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVCh2YXhuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtdmF4LW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3ZlcnNhZG9zLmMgYi9iZmQvdmVyc2Fkb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmNGY4OC4uMDAwMDAwMAotLS0gYS9iZmQvdmVyc2Fkb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkyNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFZFUlNBZG9zLUUgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+LgotCi0gICBWZXJzYWRvcyBpcyBhIE1vdG9yb2xhIHRyYWRlbWFyay4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgU1VCU0VDVElPTgotICAgVkVSU0Fkb3MtRSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0KLSAgIERFU0NSSVBUSU9OCi0KLSAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHJlYWRpbmcgb2YgVkVSU0Fkb3MgcmVsb2NhdGVhYmxlCi0gICBvYmplY3QgZmlsZXMuCi0KLSAgIEEgVkVSU0Fkb3MgZmlsZSBsb29rcyBsaWtlIGNvbnRhaW5zCi0KLSAgIG8gSW5kZW50aWZpY2F0aW9uIFJlY29yZAotICAgbyBFeHRlcm5hbCBTeW1ib2wgRGVmaW5pdGlvbiBSZWNvcmQKLSAgIG8gT2JqZWN0IFRleHQgUmVjcm9kCi0gICBvIEVuZCBSZWNvcmQKLQotCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0KLXN0YXRpYyBib29sZWFuIHZlcnNhZG9zX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ZXJzYWRvc19zY2FuIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqdmVyc2Fkb3Nfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLQotCi0jZGVmaW5lIFZIRUFERVIgJzEnCi0jZGVmaW5lIFZFU1RERUYgJzInCi0jZGVmaW5lIFZPVFIgJzMnCi0jZGVmaW5lIFZFTkQgJzQnCi0KLQotI2RlZmluZSBFU19CQVNFIDE3CQkvKiBmaXJzdCBzeW1ib2wgaGFzIGVzZGlkIDE3ICovCi0KLS8qIFBlciBmaWxlIHRhcmdldCBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KLQotLyogb25lIGZvciBlYWNoIHNlY3Rpb24gKi8KLXN0cnVjdCBlc2RpZAotICB7Ci0gICAgYXNlY3Rpb24gKnNlY3Rpb247CQkvKiBwdHIgdG8gYmZkIHZlcnNpb24gKi8KLSAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsJLyogdXNlZCB0byBidWlsZCBpbWFnZSAqLwotICAgIGludCBwYzsKLSAgICBpbnQgcmVsb2NzOwkJCS8qIHJlbG9jIGNvdW50LCB2YWxpZCBlbmQgb2YgcGFzcyAxICovCi0gICAgaW50IGRvbmVyZWw7CQkvKiBoYXZlIHJlbG9jcyBiZWVuIHRyYW5zbGF0ZWQgKi8KLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgdmVyc2Fkb3NfZGF0YV9zdHJ1Y3QKLSAgewotICAgIGludCBlc19kb25lOwkJLyogY291bnQgb2Ygc3ltYm9sIGluZGV4LCBzdGFydHMgYXQgRVNfQkFTRSAqLwotICAgIGFzeW1ib2wgKnN5bWJvbHM7CQkvKiBwb2ludGVyIHRvIGxvY2FsIHN5bWJvbHMgKi8KLSAgICBjaGFyICpzdHJpbmdzOwkJLyogc3RyaW5ncyBvZiBhbGwgdGhlIGFib3ZlICovCi0gICAgaW50IHN0cmluZ2xlbjsJCS8qIGxlbiBvZiBzdHJpbmcgdGFibGUgKHZhbGlkIGVuZCBvZiBwYXNzMSkgKi8KLSAgICBpbnQgbnNlY3N5bXM7CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMgKi8KLQotICAgIGludCBuZGVmczsJCQkvKiBudW1iZXIgb2YgZXhwb3J0ZWQgc3ltYm9scyAodGhleSBkb250IGdldCBlc2RpZHMpICovCi0gICAgaW50IG5yZWZzOwkJCS8qIG51bWJlciBvZiBpbXBvcnRlZCBzeW1ib2xzICAodmFsaWQgZW5kIG9mIHBhc3MxKSAqLwotCi0gICAgaW50IHJlZl9pZHg7CQkvKiBjdXJyZW50IHByb2Nlc3NlZCB2YWx1ZSBvZiB0aGUgYWJvdmUgKi8KLSAgICBpbnQgZGVmX2lkeDsKLQotICAgIGludCBwYXNzXzJfZG9uZTsKLQotICAgIHN0cnVjdCBlc2RpZCBlWzE2XTsJCS8qIHBlciBzZWN0aW9uIGluZm8gKi8KLSAgICBpbnQgYWxlcnQ7CQkJLyogdG8gc2VlIGlmIHdlJ3JlIHRyYW1wbGluZyAqLwotICAgIGFzeW1ib2wgKnJlc3RbMjU2IC0gMTZdOwkvKiBwZXIgc3ltYm9sIGluZm8gKi8KLQotICB9Ci10ZGF0YV90eXBlOwotCi0jZGVmaW5lIFZEQVRBKGFiZmQpICAgICAgIChhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhKQotI2RlZmluZSBFREFUQShhYmZkLCBuKSAgICAoYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YS0+ZVtuXSkKLSNkZWZpbmUgUkRBVEEoYWJmZCwgbikgICAgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEtPnJlc3Rbbl0pCi0KLXN0cnVjdCBleHRfb3RyCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gICAgY2hhciB0eXBlOwotICAgIHVuc2lnbmVkIGNoYXIgbWFwWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgZXNkaWQ7Ci0gICAgdW5zaWduZWQgY2hhciBkYXRhWzIwMF07Ci0gIH07Ci0KLXN0cnVjdCBleHRfdmhlYWRlcgotICB7Ci0gICAgdW5zaWduZWQgY2hhciBzaXplOwotICAgIGNoYXIgdHlwZTsJCQkvKiByZWNvcmQgdHlwZSAqLwotICAgIGNoYXIgbmFtZVsxMF07CQkvKiBtb2R1bGUgbmFtZSAqLwotICAgIGNoYXIgcmV2OwkJCS8qIG1vZHVsZSByZXYgbnVtYmVyICovCi0gICAgY2hhciBsYW5nOwotICAgIGNoYXIgdm9sWzRdOwotICAgIGNoYXIgdXNlclsyXTsKLSAgICBjaGFyIGNhdFs4XTsKLSAgICBjaGFyIGZuYW1lWzhdOwotICAgIGNoYXIgZXh0WzJdOwotICAgIGNoYXIgdGltZVszXTsKLSAgICBjaGFyIGRhdGVbM107Ci0gICAgY2hhciByZXN0WzIxMV07Ci0gIH07Ci0KLXN0cnVjdCBleHRfZXNkCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gICAgY2hhciB0eXBlOwotICAgIHVuc2lnbmVkIGNoYXIgZXNkX2VudHJpZXNbMV07Ci0gIH07Ci0jZGVmaW5lIEVTRF9BQlMgCTAKLSNkZWZpbmUgRVNEX0NPTU1PTiAJMQotI2RlZmluZSBFU0RfU1REX1JFTF9TRUMgMgotI2RlZmluZSBFU0RfU0hSVF9SRUxfU0VDIDMKLSNkZWZpbmUgRVNEX1hERUZfSU5fU0VDIDQKLSNkZWZpbmUgRVNEX1hSRUZfU1lNICAgIDcKLSNkZWZpbmUgRVNEX1hSRUZfU0VDCTYKLSNkZWZpbmUgRVNEX1hERUZfSU5fQUJTIDUKLXVuaW9uIGV4dF9hbnkKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgICBzdHJ1Y3QgZXh0X3ZoZWFkZXIgaGVhZGVyOwotICAgIHN0cnVjdCBleHRfZXNkIGVzZDsKLSAgICBzdHJ1Y3QgZXh0X290ciBvdHI7Ci0gIH07Ci0KLS8qIEluaXRpYWxpemUgYnkgZmlsbGluZyBpbiB0aGUgaGV4IGNvbnZlcnNpb24gYXJyYXkuICovCi0KLQotCi0KLQotLyogU2V0IHVwIHRoZSB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHRkYXRhX3R5cGUgKnRkYXRhID0gKHRkYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHRkYXRhX3R5cGUpKTsKLSAgICAgIGlmICh0ZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEgPSB0ZGF0YTsKLSAgICAgIHRkYXRhLT5zeW1ib2xzID0gTlVMTDsKLSAgICAgIFZEQVRBIChhYmZkKS0+YWxlcnQgPSAweDEyMzQ1Njc4OwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9tNjhrLCAwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogUmVwb3J0IGEgcHJvYmxlbSBpbiBhbiBTIHJlY29yZCBmaWxlLiAgRklYTUU6IFRoaXMgcHJvYmFibHkgc2hvdWxkCi0gICBub3QgY2FsbCBmcHJpbnRmLCBidXQgd2UgcmVhbGx5IGRvIG5lZWQgc29tZSBtZWNoYW5pc20gZm9yIHByaW50aW5nCi0gICBlcnJvciBtZXNzYWdlcy4gICovCi0KLQotCi1zdGF0aWMgYXN5bWJvbCAqCi12ZXJzYWRvc19uZXdfc3ltYm9sIChhYmZkLCBzbnVtLCBuYW1lLCB2YWwsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgc251bTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIGFzeW1ib2wgKm4gPSBWREFUQSAoYWJmZCktPnN5bWJvbHMgKyBzbnVtOwotICBuLT5uYW1lID0gbmFtZTsKLSAgbi0+dmFsdWUgPSB2YWw7Ci0gIG4tPnNlY3Rpb24gPSBzZWM7Ci0gIG4tPnRoZV9iZmQgPSBhYmZkOwotICBuLT5mbGFncyA9IDA7Ci0gIHJldHVybiBuOwotfQotCi0KLXN0YXRpYyBpbnQKLWdldF9yZWNvcmQgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICB1bmlvbiBleHRfYW55ICpwdHI7Ci17Ci0gIGJmZF9yZWFkICgmcHRyLT5zaXplLCAxLCAxLCBhYmZkKTsKLSAgaWYgKGJmZF9yZWFkICgoY2hhciAqKSBwdHIgKyAxLCAxLCBwdHItPnNpemUsIGFiZmQpICE9IHB0ci0+c2l6ZSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotZ2V0XzQgKHBwKQotICAgICB1bnNpZ25lZCBjaGFyICoqcHA7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnAgPSAqcHA7Ci0gICpwcCArPSA0OwotICByZXR1cm4gKHBbMF0gPDwgMjQpIHwgKHBbMV0gPDwgMTYpIHwgKHBbMl0gPDwgOCkgfCAocFszXSA8PCAwKTsKLX0KLQotdm9pZAotZ2V0XzEwIChwcCwgbmFtZSkKLSAgICAgdW5zaWduZWQgY2hhciAqKnBwOwotICAgICBjaGFyICpuYW1lOwotewotICBjaGFyICpwID0gKGNoYXIgKikgKnBwOwotICBpbnQgbGVuID0gMTA7Ci0gICpwcCArPSBsZW47Ci0gIHdoaWxlICgqcCAhPSAnICcKLQkgJiYgbGVuKQotICAgIHsKLSAgICAgICpuYW1lKysgPSAqcCsrOwotICAgICAgbGVuLS07Ci0gICAgfQotICAqbmFtZSA9IDA7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW5ld19zeW1ib2xfc3RyaW5nIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKm4gPSBWREFUQSAoYWJmZCktPnN0cmluZ3M7Ci0gIHN0cmNweSAoVkRBVEEgKGFiZmQpLT5zdHJpbmdzLCBuYW1lKTsKLSAgVkRBVEEgKGFiZmQpLT5zdHJpbmdzICs9IHN0cmxlbiAoVkRBVEEgKGFiZmQpLT5zdHJpbmdzKSArIDE7Ci0gIHJldHVybiBuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2VzZCAoYWJmZCwgZXNkLCBwYXNzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRfZXNkICplc2Q7Ci0gICAgIGludCBwYXNzOwotewotICAvKiBSZWFkIHRocm91Z2ggdGhlIGV4dCBkZWYgZm9yIHRoZSBlc3QgZW50cmllcyAqLwotICBpbnQgdG9nbyA9IGVzZC0+c2l6ZSAtIDI7Ci0gIGJmZF92bWEgc2l6ZTsKLSAgYmZkX3ZtYSBzdGFydDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgY2hhciBuYW1lWzExXTsKLSAgdW5zaWduZWQgY2hhciAqcHRyID0gZXNkLT5lc2RfZW50cmllczsKLSAgdW5zaWduZWQgY2hhciAqZW5kID0gcHRyICsgdG9nbzsKLSAgd2hpbGUgKHB0ciA8IGVuZCkKLSAgICB7Ci0gICAgICBpbnQgc2NuID0gKnB0ciAmIDB4ZjsKLSAgICAgIGludCB0eXAgPSAoKnB0ciA+PiA0KSAmIDB4ZjsKLQotICAgICAgLyogRGVjbGFyZSB0aGlzIHNlY3Rpb24gKi8KLSAgICAgIHNwcmludGYgKG5hbWUsICIlZCIsIHNjbik7Ci0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIHN0cmR1cCAobmFtZSkpOwotICAgICAgc2VjLT50YXJnZXRfaW5kZXggPSBzY247Ci0gICAgICBFREFUQSAoYWJmZCwgc2NuKS5zZWN0aW9uID0gc2VjOwotICAgICAgcHRyKys7Ci0gICAgICBzd2l0Y2ggKHR5cCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgRVNEX1hSRUZfU0VDOgotCWNhc2UgRVNEX1hSRUZfU1lNOgotCSAgewotCSAgICBpbnQgc251bSA9IFZEQVRBIChhYmZkKS0+cmVmX2lkeCsrOwotCSAgICBnZXRfMTAgKCZwdHIsIG5hbWUpOwotCSAgICBpZiAocGFzcyA9PSAxKQotCSAgICAgIHsKLQkJVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4gKz0gc3RybGVuIChuYW1lKSArIDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgZXNpZHg7Ci0JCWFzeW1ib2wgKnM7Ci0JCWNoYXIgKm4gPSBuZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgbmFtZSk7Ci0JCXMgPSB2ZXJzYWRvc19uZXdfc3ltYm9sIChhYmZkLCBzbnVtLCBuLCAwLAotCQkJCQkgJmJmZF91bmRfc2VjdGlvbiwgc2NuKTsKLQkJZXNpZHggPSBWREFUQSAoYWJmZCktPmVzX2RvbmUrKzsKLQkJUkRBVEEgKGFiZmQsIGVzaWR4IC0gRVNfQkFTRSkgPSBzOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0KLQljYXNlIEVTRF9BQlM6Ci0JICBzaXplID0gZ2V0XzQgKCZwdHIpOwotCSAgc3RhcnQgPSBnZXRfNCAoJnB0cik7Ci0JICBicmVhazsKLQljYXNlIEVTRF9TVERfUkVMX1NFQzoKLQljYXNlIEVTRF9TSFJUX1JFTF9TRUM6Ci0JICB7Ci0JICAgIHNlYy0+X3Jhd19zaXplID0gZ2V0XzQgKCZwdHIpOwotCSAgICBzZWMtPmZsYWdzIHw9IFNFQ19BTExPQzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgRVNEX1hERUZfSU5fQUJTOgotCSAgc2VjID0gKGFzZWN0aW9uICopICYgYmZkX2Fic19zZWN0aW9uOwotCWNhc2UgRVNEX1hERUZfSU5fU0VDOgotCSAgewotCSAgICBpbnQgc251bSA9IFZEQVRBIChhYmZkKS0+ZGVmX2lkeCsrOwotCSAgICBsb25nIHZhbDsKLQkgICAgZ2V0XzEwICgmcHRyLCBuYW1lKTsKLQkgICAgdmFsID0gZ2V0XzQgKCZwdHIpOwotCSAgICBpZiAocGFzcyA9PSAxKQotCSAgICAgIHsKLQkJLyogSnVzdCByZW1lbWJlciB0aGUgc3ltYm9sICovCi0JCVZEQVRBIChhYmZkKS0+c3RyaW5nbGVuICs9IHN0cmxlbiAobmFtZSkgKyAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYXN5bWJvbCAqczsKLQkJY2hhciAqbiA9IG5ld19zeW1ib2xfc3RyaW5nIChhYmZkLCBuYW1lKTsKLQkJcyA9IHZlcnNhZG9zX25ld19zeW1ib2wgKGFiZmQsIHNudW0gKyBWREFUQSAoYWJmZCktPm5yZWZzLCBuLCB2YWwsIHNlYywgc2NuKTsKLQkJcy0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0jZGVmaW5lIFJfUkVMV09SRCAxCi0jZGVmaW5lIFJfUkVMTE9ORyAyCi0jZGVmaW5lIFJfUkVMV09SRF9ORUcgMwotI2RlZmluZSBSX1JFTExPTkdfTkVHIDQKLQotcmVsb2NfaG93dG9fdHlwZSB2ZXJzYWRvc19ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKFJfUkVMV09SRCwgMCwgMSwgMTYsIGZhbHNlLAotCSAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSAiK3YxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMTE9ORywgMCwgMiwgMzIsIGZhbHNlLAotCSAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSAiK3YzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLQotICBIT1dUTyAoUl9SRUxXT1JEX05FRywgMCwgLTEsIDE2LCBmYWxzZSwKLQkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKLQkgIi12MTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTExPTkdfTkVHLCAwLCAtMiwgMzIsIGZhbHNlLAotCSAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSAiLXYzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLX07Ci0KLQotc3RhdGljIGludAotZ2V0X29mZnNldCAobGVuLCBwdHIpCi0gICAgIGludCBsZW47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgaW50IHZhbCA9IDA7Ci0gIGlmIChsZW4pCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICB2YWwgPSAqcHRyKys7Ci0gICAgICBpZiAodmFsICYgMHg4MCkKLQl2YWwgfD0gfjB4ZmY7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspCi0JdmFsID0gKHZhbCA8PCA4KSB8ICpwdHIrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3Nfb3RyIChhYmZkLCBvdHIsIHBhc3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dF9vdHIgKm90cjsKLSAgICAgaW50IHBhc3M7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgc2hpZnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKnNyY3AgPSBvdHItPmRhdGE7Ci0gIHVuc2lnbmVkIGNoYXIgKmVuZHAgPSAodW5zaWduZWQgY2hhciAqKSBvdHIgKyBvdHItPnNpemU7Ci0gIHVuc2lnbmVkIGludCBiaXRzID0gKG90ci0+bWFwWzBdIDw8IDI0KQotICB8IChvdHItPm1hcFsxXSA8PCAxNikKLSAgfCAob3RyLT5tYXBbMl0gPDwgOCkKLSAgfCAob3RyLT5tYXBbM10gPDwgMCk7Ci0KLSAgc3RydWN0IGVzZGlkICplc2RpZCA9ICZFREFUQSAoYWJmZCwgb3RyLT5lc2RpZCAtIDEpOwotICB1bnNpZ25lZCBjaGFyICpjb250ZW50cyA9IGVzZGlkLT5jb250ZW50czsKLSAgaW50IG5lZWRfY29udGVudHMgPSAwOwotICB1bnNpZ25lZCBpbnQgZHN0X2lkeCA9IGVzZGlkLT5wYzsKLQotICBmb3IgKHNoaWZ0ID0gKDEgPDwgMzEpOyBzaGlmdCAmJiBzcmNwIDwgZW5kcDsgc2hpZnQgPj49IDEpCi0gICAgewotICAgICAgaWYgKGJpdHMgJiBzaGlmdCkKLQl7Ci0JICBpbnQgZmxhZyA9ICpzcmNwKys7Ci0JICBpbnQgZXNkaWRzID0gKGZsYWcgPj4gNSkgJiAweDc7Ci0JICBpbnQgc2l6ZWlud29yZHMgPSAoKGZsYWcgPj4gMykgJiAxKSA/IDIgOiAxOwotCSAgaW50IG9mZnNldGxlbiA9IGZsYWcgJiAweDc7Ci0JICBpbnQgajsKLQotCi0JICBpZiAoZXNkaWRzID09IDApCi0JICAgIHsKLQkgICAgICAvKiBBIHplcm8gZXNkaWQgbWVhbnMgdGhlIG5ldyBwYyBpcyB0aGUgb2Zmc2V0IGdpdmVuICovCi0JICAgICAgZHN0X2lkeCArPSBnZXRfb2Zmc2V0IChvZmZzZXRsZW4sIHNyY3ApOwotCSAgICAgIHNyY3AgKz0gb2Zmc2V0bGVuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgdmFsID0gZ2V0X29mZnNldCAob2Zmc2V0bGVuLCBzcmNwICsgZXNkaWRzKTsKLQkgICAgICBpZiAocGFzcyA9PSAxKQotCQluZWVkX2NvbnRlbnRzID0gMTsKLQkgICAgICBlbHNlCi0JCWZvciAoaiA9IDA7IGogPCBzaXplaW53b3JkcyAqIDI7IGorKykKLQkJICB7Ci0JCSAgICBjb250ZW50c1tkc3RfaWR4ICsgKHNpemVpbndvcmRzICogMikgLSBqIC0gMV0gPSB2YWw7Ci0JCSAgICB2YWwgPj49IDg7Ci0JCSAgfQotCi0JICAgICAgZm9yIChqID0gMDsgaiA8IGVzZGlkczsgaisrKQotCQl7Ci0JCSAgaW50IGVzZGlkID0gKnNyY3ArKzsKLQotCQkgIGlmIChlc2RpZCkKLQkJICAgIHsKLQkJICAgICAgaW50IHJuID0gRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKS5yZWxvY3MrKzsKLQkJICAgICAgaWYgKHBhc3MgPT0gMSkKLQkJCXsKLQkJCSAgLyogdGhpcyBpcyB0aGUgZmlyc3QgcGFzcyBvdmVyIHRoZSBkYXRhLCAKLQkJCSAgICAganVzdCByZW1lbWJlciB0aGF0IHdlIG5lZWQgYSByZWxvYyAqLwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFyZWxlbnQgKm4gPQotCQkJICBFREFUQSAoYWJmZCwgb3RyLT5lc2RpZCAtIDEpLnNlY3Rpb24tPnJlbG9jYXRpb24gKyBybjsKLQkJCSAgbi0+YWRkcmVzcyA9IGRzdF9pZHg7Ci0KLQkJCSAgbi0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgZXNkaWQ7Ci0JCQkgIG4tPmFkZGVuZCA9IDA7Ci0JCQkgIG4tPmhvd3RvID0gdmVyc2Fkb3NfaG93dG9fdGFibGUgKyAoKGogJiAxKSAqIDIpICsgKHNpemVpbndvcmRzIC0gMSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBzcmNwICs9IG9mZnNldGxlbjsKLQkgICAgICBkc3RfaWR4ICs9IHNpemVpbndvcmRzICogMjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuZWVkX2NvbnRlbnRzID0gMTsKLQkgIGlmIChkc3RfaWR4IDwgZXNkaWQtPnNlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgaWYgKHBhc3MgPT0gMikKLQkgICAgICB7Ci0JCS8qIGFic29sdXRlIGNvZGUsIGNvbWVzIGluIDE2IGJpdCBsdW1wcyAqLwotCQljb250ZW50c1tkc3RfaWR4XSA9IHNyY3BbMF07Ci0JCWNvbnRlbnRzW2RzdF9pZHggKyAxXSA9IHNyY3BbMV07Ci0JICAgICAgfQotCSAgZHN0X2lkeCArPSAyOwotCSAgc3JjcCArPSAyOwotCX0KLSAgICB9Ci0gIEVEQVRBIChhYmZkLCBvdHItPmVzZGlkIC0gMSkucGMgPSBkc3RfaWR4OwotCi0gIGlmICghY29udGVudHMgJiYgbmVlZF9jb250ZW50cykKLSAgICBlc2RpZC0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIGVzZGlkLT5zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX3NjYW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGxvb3AgPSAxOwotICBpbnQgaTsKLSAgaW50IGo7Ci0gIGludCBuc2VjcyA9IDA7Ci0KLSAgVkRBVEEgKGFiZmQpLT5ucmVmcyA9IDA7Ci0gIFZEQVRBIChhYmZkKS0+bmRlZnMgPSAwOwotICBWREFUQSAoYWJmZCktPnJlZl9pZHggPSAwOwotICBWREFUQSAoYWJmZCktPmRlZl9pZHggPSAwOwotCi0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIHVuaW9uIGV4dF9hbnkgYW55OwotICAgICAgaWYgKCFnZXRfcmVjb3JkIChhYmZkLCAmYW55KSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIHN3aXRjaCAoYW55LmhlYWRlci50eXBlKQotCXsKLQljYXNlIFZIRUFERVI6Ci0JICBicmVhazsKLQljYXNlIFZFTkQ6Ci0JICBsb29wID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgVkVTVERFRjoKLQkgIHByb2Nlc3NfZXNkIChhYmZkLCAmYW55LmVzZCwgMSk7Ci0JICBicmVhazsKLQljYXNlIFZPVFI6Ci0JICBwcm9jZXNzX290ciAoYWJmZCwgJmFueS5vdHIsIDEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSByZWxvY3MgYW5kIHNlY3Rpb25zICovCi0KLSAgVkRBVEEgKGFiZmQpLT5ucmVmcyA9IFZEQVRBIChhYmZkKS0+cmVmX2lkeDsKLSAgVkRBVEEgKGFiZmQpLT5uZGVmcyA9IFZEQVRBIChhYmZkKS0+ZGVmX2lkeDsKLSAgVkRBVEEgKGFiZmQpLT5yZWZfaWR4ID0gMDsKLSAgVkRBVEEgKGFiZmQpLT5kZWZfaWR4ID0gMDsKLQotICBhYmZkLT5zeW1jb3VudCA9IFZEQVRBIChhYmZkKS0+bnJlZnMgKyBWREFUQSAoYWJmZCktPm5kZWZzOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlc2RpZCAqZXNkaWQgPSAmRURBVEEgKGFiZmQsIGkpOwotICAgICAgaWYgKGVzZGlkLT5zZWN0aW9uKQotCXsKLQkgIGVzZGlkLT5zZWN0aW9uLT5yZWxvY2F0aW9uCi0JICAgID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnQpICogZXNkaWQtPnJlbG9jcyk7Ci0KLQkgIGVzZGlkLT5wYyA9IDA7Ci0KLQkgIGlmIChlc2RpZC0+Y29udGVudHMpCi0JICAgIGVzZGlkLT5zZWN0aW9uLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQ7Ci0KLQkgIGVzZGlkLT5zZWN0aW9uLT5yZWxvY19jb3VudCA9IGVzZGlkLT5yZWxvY3M7Ci0JICBpZiAoZXNkaWQtPnJlbG9jcykKLQkgICAgZXNkaWQtPnNlY3Rpb24tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQotCSAgZXNkaWQtPnJlbG9jcyA9IDA7Ci0KLQkgIC8qIEFkZCBhbiBlbnRyeSBpbnRvIHRoZSBzeW1ib2wgdGFibGUgZm9yIGl0ICovCi0JICBuc2VjcysrOwotCSAgVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4gKz0gc3RybGVuIChlc2RpZC0+c2VjdGlvbi0+bmFtZSkgKyAxOwotCX0KLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgKz0gbnNlY3M7Ci0KLSAgVkRBVEEgKGFiZmQpLT5zeW1ib2xzID0gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgICAgICBzaXplb2YgKGFzeW1ib2wpICogKGFiZmQtPnN5bWNvdW50KSk7Ci0KLSAgVkRBVEEgKGFiZmQpLT5zdHJpbmdzID0gYmZkX2FsbG9jIChhYmZkLCBWREFUQSAoYWJmZCktPnN0cmluZ2xlbik7Ci0KLSAgaWYgKChWREFUQSAoYWJmZCktPnN5bWJvbHMgPT0gTlVMTCAmJiBhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgICB8fCAoVkRBVEEgKGFiZmQpLT5zdHJpbmdzID09IE5VTEwgJiYgVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4gPiAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQWN0dWFsbHkgZmlsbCBpbiB0aGUgc2VjdGlvbiBzeW1ib2xzLAotICAgICB3ZSBzdGljayB0aGVtIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlICovCi0KLSAgZm9yIChqID0gVkRBVEEgKGFiZmQpLT5ucmVmcyArIFZEQVRBIChhYmZkKS0+bmRlZnMsIGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZXNkaWQgKmVzZGlkID0gJkVEQVRBIChhYmZkLCBpKTsKLSAgICAgIGFzZWN0aW9uICpzZWMgPSBlc2RpZC0+c2VjdGlvbjsKLSAgICAgIGlmIChzZWMpCi0JewotCSAgYXN5bWJvbCAqcyA9IFZEQVRBIChhYmZkKS0+c3ltYm9scyArIGo7Ci0JICBzLT5uYW1lID0gbmV3X3N5bWJvbF9zdHJpbmcgKGFiZmQsIHNlYy0+bmFtZSk7Ci0JICBzLT5zZWN0aW9uID0gc2VjOwotCSAgcy0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JICBzLT52YWx1ZSA9IDA7Ci0JICBzLT50aGVfYmZkID0gYWJmZDsKLQkgIGorKzsKLQl9Ci0gICAgfQotICBpZiAoYWJmZC0+c3ltY291bnQpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgLyogU2V0IHRoaXMgdG8gbnNlY3MgLSBzaW5jZSB3ZSd2ZSBhbHJlYWR5IHBsYW50ZWQgdGhlIHNlY3Rpb24KLSAgICAgc3ltYm9scyAqLwotICBWREFUQSAoYWJmZCktPm5zZWNzeW1zID0gbnNlY3M7Ci0KLSAgVkRBVEEgKGFiZmQpLT5yZWZfaWR4ID0gMDsKLQotICByZXR1cm4gMTsKLX0KLQotCi0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhIHZlcnNhZG9zICBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotdmVyc2Fkb3Nfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dF92aGVhZGVyIGV4dDsKLSAgdW5zaWduZWQgY2hhciBsZW47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiZmRfcmVhZCAoJmxlbiwgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgmZXh0LnR5cGUsIDEsIGxlbiwgYWJmZCkgIT0gbGVuKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBndWVzcyB0aGF0IHRoZSBsYW5ndWFnZSBmaWVsZCB3aWxsIG5ldmVyIGJlIGxhcmdlciB0aGFuIDEwLgotICAgICBJbiBzYW1wbGUgZmlsZXMsIGl0IGlzIGFsd2F5cyBlaXRoZXIgMCBvciAxLiAgQ2hlY2tpbmcgZm9yIHRoaXMKLSAgICAgcHJldmVudHMgY29uZnVzaW9uIHdpdGggSW50ZWwgSGV4IGZpbGVzLiAgKi8KLSAgaWYgKGV4dC50eXBlICE9IFZIRUFERVIKLSAgICAgIHx8IGV4dC5sYW5nID4gMTApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIGxvb2tzIGxpa2UgYSByZWNvcmQsIGJ1aWxkIHRoZSB0ZGF0YSBhbmQgcmVhZCBpbi4gICovCi0KLSAgaWYgKCF2ZXJzYWRvc19ta29iamVjdCAoYWJmZCkKLSAgICAgIHx8ICF2ZXJzYWRvc19zY2FuIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3NfcGFzc18yIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuaW9uIGV4dF9hbnkgYW55OwotCi0gIGlmIChWREFUQSAoYWJmZCktPnBhc3NfMl9kb25lKQotICAgIHJldHVybiAxOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgVkRBVEEgKGFiZmQpLT5lc19kb25lID0gRVNfQkFTRTsKLQotCi0gIC8qIHJlYWQgcmVjb3JkcyB0aWxsIHdlIGdldCB0byB3aGVyZSB3ZSB3YW50IHRvIGJlICovCi0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgZ2V0X3JlY29yZCAoYWJmZCwgJmFueSk7Ci0gICAgICBzd2l0Y2ggKGFueS5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBWRU5EOgotCSAgVkRBVEEgKGFiZmQpLT5wYXNzXzJfZG9uZSA9IDE7Ci0JICByZXR1cm4gMTsKLQljYXNlIFZFU1RERUY6Ci0JICBwcm9jZXNzX2VzZCAoYWJmZCwgJmFueS5lc2QsIDIpOwotCSAgYnJlYWs7Ci0JY2FzZSBWT1RSOgotCSAgcHJvY2Vzc19vdHIgKGFiZmQsICZhbnkub3RyLCAyKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoIXZlcnNhZG9zX3Bhc3NfMiAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1lbWNweSAobG9jYXRpb24sCi0JICBFREFUQSAoYWJmZCwgc2VjdGlvbi0+dGFyZ2V0X2luZGV4KS5jb250ZW50cyArIG9mZnNldCwKLQkgIChzaXplX3QpIGNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSB2ZXJzYWRvc19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgYnl0ZXNfdG9fZG8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGxvY2F0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZpbGVfcHRyIG9mZnNldCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKkFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci12ZXJzYWRvc19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotdmVyc2Fkb3NfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotdmVyc2Fkb3NfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXZlcnNhZG9zX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGFzeW1ib2wgKnM7Ci0KLSAgdmVyc2Fkb3NfcGFzc18yIChhYmZkKTsKLQotICBmb3IgKGkgPSAwLCBzID0gVkRBVEEgKGFiZmQpLT5zeW1ib2xzOwotICAgICAgIGkgPCBzeW1jb3VudDsKLSAgICAgICBzKyssIGkrKykKLSAgICB7Ci0gICAgICAqYWxvY2F0aW9uKysgPSBzOwotICAgIH0KLQotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLS8qQVJHU1VTRUQgKi8KLXZvaWQKLXZlcnNhZG9zX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qQVJHU1VTRUQgKi8KLXZvaWQKLXZlcnNhZG9zX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMiLAotCSAgICAgICBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsCi0JICAgICAgIHN5bWJvbC0+bmFtZSk7Ci0KLSAgICB9Ci19Ci0KLWxvbmcKLXZlcnNhZG9zX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0KLWxvbmcKLXZlcnNhZG9zX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYXJlbGVudCAqc3JjOwotCi0gIHZlcnNhZG9zX3Bhc3NfMiAoYWJmZCk7Ci0gIHNyYyA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIGlmICghRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuZG9uZXJlbCkKLSAgICB7Ci0gICAgICBFREFUQSAoYWJmZCwgc2VjdGlvbi0+dGFyZ2V0X2luZGV4KS5kb25lcmVsID0gMTsKLSAgICAgIC8qIHRyYW5zbGF0ZSBmcm9tIGluZGV4ZXMgdG8gc3ltcHRyIHB0cnMgKi8KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgIGludCBlc2RpZCA9IChpbnQpIHNyY1tjb3VudF0uc3ltX3B0cl9wdHI7Ci0KLQkgIGlmIChlc2RpZCA9PSAwKQotCSAgICB7Ci0JICAgICAgc3JjW2NvdW50XS5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbi5zeW1ib2xfcHRyX3B0cjsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXNkaWQgPCBFU19CQVNFKQkvKiBTZWN0aW9uIHJlbGF0aXZlIHRoaW5nICovCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZXNkaWQgKmUgPSAmRURBVEEgKGFiZmQsIGVzZGlkIC0gMSk7Ci0JICAgICAgaWYgKCFzZWN0aW9uKQotCQl7Ci0JCSAvKiogcmVsb2NhdGlvbiByZWxhdGl2ZSB0byBzZWN0aW9uIHdoaWNoIHdhcwotCQkgICBuZXZlciBkZWNsYXJlZCAhICovCi0JCX0KLQkgICAgICBzcmNbY291bnRdLnN5bV9wdHJfcHRyID0gZS0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNyY1tjb3VudF0uc3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgZXNkaWQgLSBFU19CQVNFOwotCSAgICB9Ci0KLQl9Ci0gICAgfQotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgICpyZWxwdHIrKyA9IHNyYysrOwotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotI2RlZmluZQl2ZXJzYWRvc19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIHZlcnNhZG9zX25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSB2ZXJzYWRvc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHZlcnNhZG9zX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSB2ZXJzYWRvc19maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSB2ZXJzYWRvc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHZlcnNhZG9zX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgdmVyc2Fkb3NfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgdmVyc2Fkb3Nfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSB2ZXJzYWRvc19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSB2ZXJzYWRvc19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCB2ZXJzYWRvc192ZWMgPQotewotICAidmVyc2Fkb3MiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHZlcnNhZG9zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHZlcnNhZG9zX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC92bXMtZ3NkLmMgYi9iZmQvdm1zLWdzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzNmZTY5Li4wMDAwMDAwCi0tLSBhL2JmZC92bXMtZ3NkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MjcgKzAsMCBAQAotLyogdm1zLWdzZC5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBJbmMuCi0KLSAgIGdvIGFuZCByZWFkIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgKGVzcC4gYXBwZW5kaXggQikKLSAgIGlmIHlvdSBkb24ndCBrbm93IHdoYXQncyBnb2luZyBvbiBoZXJlIDotKQotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHR5cGljYWwgc2VjdGlvbnMgZm9yIHZheCBvYmplY3QgZmlsZXMgICovCi0KLSNkZWZpbmUgVkFYX0NPREVfTkFNRQkJIiRDT0RFIgotI2RlZmluZSBWQVhfREFUQV9OQU1FCQkiJERBVEEiCi0jZGVmaW5lIFZBWF9BRERSRVNTX0RBVEFfTkFNRQkiJEFERFJFU1NfREFUQSIKLQotLyogdHlwaWNhbCBzZWN0aW9ucyBmb3IgZXZheCBvYmplY3QgZmlsZXMgICovCi0KLSNkZWZpbmUgRVZBWF9BQlNfTkFNRQkJIiRBQlMkIgotI2RlZmluZSBFVkFYX0NPREVfTkFNRQkJIiRDT0RFJCIKLSNkZWZpbmUgRVZBWF9MSU5LX05BTUUJCSIkTElOSyQiCi0jZGVmaW5lIEVWQVhfREFUQV9OQU1FCQkiJERBVEEkIgotI2RlZmluZSBFVkFYX0JTU19OQU1FCQkiJEJTUyQiCi0jZGVmaW5lIEVWQVhfUkVBRE9OTFlBRERSX05BTUUJIiRSRUFET05MWV9BRERSJCIKLSNkZWZpbmUgRVZBWF9SRUFET05MWV9OQU1FCSIkUkVBRE9OTFkkIgotI2RlZmluZSBFVkFYX0xJVEVSQUxfTkFNRQkiJExJVEVSQUwkIgotI2RlZmluZSBFVkFYX0NPTU1PTl9OQU1FCSIkQ09NTU9OJCIKLSNkZWZpbmUgRVZBWF9MT0NBTF9OQU1FCQkiJExPQ0FMJCIKLQotc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgewotICBjaGFyICpuYW1lOwkJCS8qIG5hbWUgb2Ygc2VjdGlvbiAqLwotICBpbnQgdmZsYWdzX2Fsd2F5czsKLSAgZmxhZ3dvcmQgZmxhZ3NfYWx3YXlzOwkvKiBmbGFncyB3ZSBzZXQgYWx3YXlzICovCi0gIGludCB2ZmxhZ3NfaGFzc2l6ZTsKLSAgZmxhZ3dvcmQgZmxhZ3NfaGFzc2l6ZTsJLyogZmxhZ3Mgd2Ugc2V0IGlmIHRoZSBzZWN0aW9uIGhhcyBhIHNpemUgPiAwICovCi19OwotCi0vKiBUaGVzZSBmbGFncyBhcmUgZGVjY3J0bC92YXhjcnRsIChvcGVuVk1TIDYuMiBWQVgpIGNvbXBhdGlibGUgICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCB2YXhfc2VjdGlvbl9mbGFnc1tdID0gewotICB7IFZBWF9DT0RFX05BTUUsCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fU0hSfEdQU19TX01fRVhFfEdQU19TX01fUkQpLAotCShTRUNfQ09ERSksCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fU0hSfEdQU19TX01fRVhFfEdQU19TX01fUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IFZBWF9EQVRBX05BTUUsCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfREFUQSksCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IFZBWF9BRERSRVNTX0RBVEFfTkFNRSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBOVUxMLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0RBVEEpLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfQotfTsKLQotCi0vKiBUaGVzZSBmbGFncyBhcmUgZGVjY3J0bC92YXhjcnRsIChvcGVuVk1TIDYuMiBBbHBoYSkgY29tcGF0aWJsZSAgKi8KLQotc3RhdGljIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0IGV2YXhfc2VjdGlvbl9mbGFnc1tdID0gewotICB7IEVWQVhfQUJTX05BTUUsCi0JKEVHUFNfU19WX1NIUiksCi0JKFNFQ19EQVRBKSwKLQkoRUdQU19TX1ZfU0hSKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0NPREVfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfRVhFKSwKLQkoU0VDX0NPREUpLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9FWEUpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfTElURVJBTF9OQU1FLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9MSU5LX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfREFUQV9OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0RBVEEpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0JTU19OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX05PX0ZMQUdTKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9SRUFET05MWUFERFJfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX1JFQURPTkxZX05BTUUsCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0xPQ0FMX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IE5VTEwsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9Ci19OwotCi0vKiBSZXRyaWV2ZSBiZmQgc2VjdGlvbiBmbGFncyBieSBuYW1lIGFuZCBzaXplICAqLwotCi1zdGF0aWMgZmxhZ3dvcmQKLXZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIHNlY3Rpb25fZmxhZ3MsIG5hbWUsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgKnNlY3Rpb25fZmxhZ3M7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaSA9IDA7Ci0KLSAgd2hpbGUgKHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgoUFJJVihpc192YXgpPwotCSAgICBzdHJjYXNlY21wIChuYW1lLCBzZWN0aW9uX2ZsYWdzW2ldLm5hbWUpOgotCSAgICBzdHJjbXAgKG5hbWUsIHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSkpID09IDApCi0JewotCSAgaWYgKHNpemUgPiAwKQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19oYXNzaXplOwotCSAgZWxzZQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19hbHdheXM7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLSAgaWYgKHNpemUgPiAwKQotICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2hhc3NpemU7Ci0gIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2Fsd2F5czsKLX0KLQotCi0vKiBSZXRyaWV2ZSB2bXMgc2VjdGlvbiBmbGFncyBieSBuYW1lIGFuZCBzaXplICAqLwotCi1zdGF0aWMgZmxhZ3dvcmQKLXZtc19lc2VjZmxhZ19ieV9uYW1lIChzZWN0aW9uX2ZsYWdzLCBuYW1lLCBzaXplKQotICAgICBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCAqc2VjdGlvbl9mbGFnczsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpID0gMDsKLQotICB3aGlsZSAoc2VjdGlvbl9mbGFnc1tpXS5uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgc2VjdGlvbl9mbGFnc1tpXS5uYW1lKSA9PSAwKQotCXsKLQkgIGlmIChzaXplID4gMCkKLQkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2hhc3NpemU7Ci0JICBlbHNlCi0JICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19hbHdheXM7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLSAgaWYgKHNpemUgPiAwKQotICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19oYXNzaXplOwotICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfYWx3YXlzOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiBWTVNfREVCVUcKLS8qIGRlYnVnICovCi0KLXN0cnVjdCBmbGFnZGVzY3N0cnVjdCB7IGNoYXIgKm5hbWU7IGZsYWd3b3JkIHZhbHVlOyB9OwotCi0vKiBDb252ZXJ0IGZsYWcgdG8gcHJpbnRhYmxlIHN0cmluZyAgKi8KLQotc3RhdGljIGNoYXIgKgotZmxhZzJzdHIoZmxhZ2Rlc2MsIGZsYWdzKQotICAgICBzdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgKmZsYWdkZXNjOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLQotICBzdGF0aWMgY2hhciByZXNbNjRdOwotICBpbnQgbmV4dCA9IDA7Ci0KLSAgcmVzWzBdID0gMDsKLSAgd2hpbGUgKGZsYWdkZXNjLT5uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKChmbGFncyAmIGZsYWdkZXNjLT52YWx1ZSkgIT0gMCkKLQl7Ci0JICBpZiAobmV4dCkKLQkgICAgc3RyY2F0KHJlcywgIiwiKTsKLQkgIGVsc2UKLQkgICAgbmV4dCA9IDE7Ci0JICBzdHJjYXQgKHJlcywgZmxhZ2Rlc2MtPm5hbWUpOwotCX0KLSAgICAgIGZsYWdkZXNjKys7Ci0gICAgfQotICByZXR1cm4gcmVzOwotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogaW5wdXQgcm91dGluZXMgKi8KLQotLyogUHJvY2VzcyBHU0QvRUdTRCByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2dzZCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgc3RhdGljIHN0cnVjdCBmbGFnZGVzY3N0cnVjdCBncHNmbGFnZGVzY1tdID0KLSAgewotICAgIHsgIlBJQyIsIDB4MDAwMSB9LAotICAgIHsgIkxJQiIsIDB4MDAwMiB9LAotICAgIHsgIk9WUiIsIDB4MDAwNCB9LAotICAgIHsgIlJFTCIsIDB4MDAwOCB9LAotICAgIHsgIkdCTCIsIDB4MDAxMCB9LAotICAgIHsgIlNIUiIsIDB4MDAyMCB9LAotICAgIHsgIkVYRSIsIDB4MDA0MCB9LAotICAgIHsgIlJEIiwgIDB4MDA4MCB9LAotICAgIHsgIldSVCIsIDB4MDEwMCB9LAotICAgIHsgIlZFQyIsIDB4MDIwMCB9LAotICAgIHsgIk5PTU9EIiwgMHgwNDAwIH0sCi0gICAgeyAiQ09NIiwgMHgwODAwIH0sCi0gICAgeyBOVUxMLCAwIH0KLSAgfTsKLQotICBzdGF0aWMgc3RydWN0IGZsYWdkZXNjc3RydWN0IGdzeWZsYWdkZXNjW10gPQotICB7Ci0gICAgeyAiV0VBSyIsIDB4MDAwMSB9LAotICAgIHsgIkRFRiIsICAweDAwMDIgfSwKLSAgICB7ICJVTkkiLCAgMHgwMDA0IH0sCi0gICAgeyAiUkVMIiwgIDB4MDAwOCB9LAotICAgIHsgIkNPTU0iLCAweDAwMTAgfSwKLSAgICB7ICJWRUNFUCIsIDB4MDAyMCB9LAotICAgIHsgIk5PUk0iLCAweDAwNDAgfSwKLSAgICB7IE5VTEwsIDAgfQotICB9OwotI2VuZGlmCi0KLSAgaW50IGdzZF90eXBlLCBnc2Rfc2l6ZTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7Ci0gIGZsYWd3b3JkIG5ld19mbGFncywgb2xkX2ZsYWdzOwotICBjaGFyICpuYW1lOwotICBhc3ltYm9sICpzeW1ib2w7Ci0gIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotICB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKLSAgdW5zaWduZWQgbG9uZyBhbGlnbl9hZGRyOwotICBzdGF0aWMgdW5zaWduZWQgaW50IHBzZWN0X2lkeCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAiR1NEL0VHU0QgKCVkLyV4KVxuIiwgb2JqdHlwZSwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9ianR5cGUpCi0gICAgewotICAgICAgY2FzZSBFT0JKX1NfQ19FR1NEOgotIAlQUklWKHZtc19yZWMpICs9IDg7CS8qIHNraXAgdHlwZSwgc2l6ZSwgbF90ZW1wICovCi0JUFJJVihyZWNfc2l6ZSkgLT0gODsKLQlicmVhazsKLSAgICAgIGNhc2UgT0JKX1NfQ19HU0Q6Ci0JUFJJVih2bXNfcmVjKSArPSAxOwotCVBSSVYocmVjX3NpemUpIC09IDE7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogY2FsY3VsYXRlIGJhc2UgYWRkcmVzcyBmb3IgZWFjaCBzZWN0aW9uICAqLwotICBiYXNlX2FkZHIgPSAwTDsKLQotICBhYmZkLT5zeW1jb3VudCA9IDA7Ci0KLSAgd2hpbGUgKFBSSVYocmVjX3NpemUpID4gMCkKLSAgICB7Ci0gICAgICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKLQotICAgICAgaWYgKG9ianR5cGUgPT0gT0JKX1NfQ19HU0QpCi0JewotCSAgZ3NkX3R5cGUgPSAqdm1zX3JlYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIHZtc19yZWMsICZnc2RfdHlwZSwgJmdzZF9zaXplKTsKLQkgIGdzZF90eXBlICs9IEVWQVhfT0ZGU0VUOwotCX0KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICJnc2RfdHlwZSAlZFxuIiwgZ3NkX3R5cGUpOwotI2VuZGlmCi0KLSAgICAgIHN3aXRjaCAoZ3NkX3R5cGUpCi0JewotCSAgY2FzZSBHU0RfU19DX1BTQzoKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogcHJvZ3JhbSBzZWN0aW9uIGRlZmluaXRpb24KLQkgICAgICAgKi8KLQotCSAgICAgIGFzZWN0aW9uICpvbGRfc2VjdGlvbiA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg0LCAiR1NEX1NfQ19QU0NcbiIpOwotI2VuZGlmCi0JICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzbid0IGEgYmZkIHNlY3Rpb24uICAqLwotCi0JICAgICAgaWYgKFBSSVYoaXNfdmF4KSAmJiAocHNlY3RfaWR4IDwgKGFiZmQtPnNlY3Rpb25fY291bnQtMSkpKQotCQl7Ci0JCSAgLyogY2hlY2sgZm9yIHRlbXBvcmFyeSBzZWN0aW9uIGZyb20gVElSIHJlY29yZC4gICovCi0KLQkJICBpZiAocHNlY3RfaWR4IDwgUFJJVihzZWN0aW9uX2NvdW50KSkKLQkJICAgIG9sZF9zZWN0aW9uID0gUFJJVihzZWN0aW9ucylbcHNlY3RfaWR4XTsKLQkJICBlbHNlCi0JCSAgICBvbGRfc2VjdGlvbiA9IDA7Ci0JCX0KLQotCSAgICAgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgOCk7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotCSAgICAgIGlmICghc2VjdGlvbikKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiYmZkX21ha2Vfc2VjdGlvbiAoJXMpIGZhaWxlZCIpLAotCQkJCQkgbmFtZSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgb2xkX2ZsYWdzID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDIpOwotCSAgICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGJmZF9nZXRsMzIodm1zX3JlYyArIDQpOwkvKiBhbGxvY2F0aW9uICovCi0JICAgICAgbmV3X2ZsYWdzID0gdm1zX3NlY2ZsYWdfYnlfbmFtZSAoYWJmZCwgdmF4X3NlY3Rpb25fZmxhZ3MsIG5hbWUsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKG9sZF9mbGFncyAmIEVHUFNfU19WX1JFTCkKLQkJbmV3X2ZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1BTX1NfTV9PVlIpCi0JCW5ld19mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uLCBuZXdfZmxhZ3MpKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiYmZkX3NldF9zZWN0aW9uX2ZsYWdzICglcywgJXgpIGZhaWxlZCIpLAotCQkgICAgIG5hbWUsIG5ld19mbGFncyk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gdm1zX3JlY1sxXTsKLQkgICAgICBhbGlnbl9hZGRyID0gKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgICAgICBpZiAoKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpICE9IDApCi0JCWJhc2VfYWRkciArPSAoYWxpZ25fYWRkciAtIChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSk7Ci0JICAgICAgc2VjdGlvbi0+dm1hID0gKGJmZF92bWEpYmFzZV9hZGRyOwotCSAgICAgIGJhc2VfYWRkciArPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0KLQkgICAgICAvKiBnbG9iYWwgc2VjdGlvbiBpcyBjb21tb24gc3ltYm9sICAqLwotCi0JICAgICAgaWYgKG9sZF9mbGFncyAmIEdQU19TX01fR0JMKQotCQl7Ci0JCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkgICAgICByZXR1cm4gLTE7Ci0JCSAgICB9Ci0JCSAgc3ltYm9sID0gZW50cnktPnN5bWJvbDsKLQotCQkgIHN5bWJvbC0+dmFsdWUgPSAwOwotCQkgIHN5bWJvbC0+c2VjdGlvbiA9IHNlY3Rpb247Ci0JCSAgc3ltYm9sLT5mbGFncyA9IChCU0ZfR0xPQkFMfEJTRl9TRUNUSU9OX1NZTXxCU0ZfT0xEX0NPTU1PTik7Ci0JCX0KLQotCSAgICAgIC8qIGNvcHkgc2F2ZWQgY29udGVudHMgaWYgb2xkX3NlY3Rpb24gc2V0ICAqLwotCi0JICAgICAgaWYgKG9sZF9zZWN0aW9uICE9IDApCi0JCXsKLQkJICBzZWN0aW9uLT5jb250ZW50cyA9IG9sZF9zZWN0aW9uLT5jb250ZW50czsKLQkJICBpZiAoc2VjdGlvbi0+X3Jhd19zaXplIDwgb2xkX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkJICAgIHsKLQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiU2l6ZSBtaXNtYXRjaCBzZWN0aW9uICVzPSVseCwgJXM9JWx4IiksCi0JCQkgb2xkX3NlY3Rpb24tPm5hbWUsCi0JCQkgKHVuc2lnbmVkIGxvbmcpIG9sZF9zZWN0aW9uLT5fcmF3X3NpemUsCi0JCQkgc2VjdGlvbi0+bmFtZSwKLQkJCSAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICAgICAgcmV0dXJuIC0xOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNlY3Rpb24tPl9yYXdfc2l6ZSA+IG9sZF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JCSAgICB7Ci0JCSAgICAgIHNlY3Rpb24tPmNvbnRlbnRzID0gKCh1bnNpZ25lZCBjaGFyICopCi0JCQkJICAgIGJmZF9yZWFsbG9jIChvbGRfc2VjdGlvbi0+Y29udGVudHMsIHNlY3Rpb24tPl9yYXdfc2l6ZSkpOwotCQkgICAgICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCQkgIHJldHVybiAtMTsKLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJCQliZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkJICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBtZW1zZXQgKHNlY3Rpb24tPmNvbnRlbnRzLCAwLCAoc2l6ZV90KXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCX0KLQkgICAgICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0jaWYgVk1TX0RFQlVHCi0JICAgICAgdm1zX2RlYnVnICg0LCAiZ3NkIHBzYyAlZCAoJXMsIGZsYWdzICUwNHg9JXMpICIsCi0JCQkgc2VjdGlvbi0+aW5kZXgsIG5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIgKGdwc2ZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKLQkgICAgICB2bXNfZGVidWcgKDQsICIlZCBieXRlcyBhdCAweCUwOGx4IChtZW0gJXApXG4iLAotCQkJIHNlY3Rpb24tPl9yYXdfc2l6ZSwgc2VjdGlvbi0+dm1hLCBzZWN0aW9uLT5jb250ZW50cyk7Ci0jZW5kaWYKLQotCSAgICAgIGdzZF9zaXplID0gdm1zX3JlY1s4XSArIDk7Ci0KLQkgICAgICBwc2VjdF9pZHgrKzsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkgIGNhc2UgR1NEX1NfQ19FUE06Ci0JICBjYXNlIEdTRF9TX0NfRVBNVzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgZXBtXG4iKTsKLSNlbmRpZgotCSAgLypGQUxMVEhSVSovCi0JICBjYXNlIEdTRF9TX0NfU1lNOgotCSAgY2FzZSBHU0RfU19DX1NZTVc6Ci0JICAgIHsKLQkgICAgICBpbnQgbmFtZV9vZmZzZXQsIHZhbHVlX29mZnNldDsKLQotCSAgICAgIC8qCi0JICAgICAgICogc3ltYm9sIHNwZWNpZmljYXRpb24gKGRlZmluaXRpb24gb3IgcmVmZXJlbmNlKQotCSAgICAgICAqLwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNCwgIkdTRF9TX0NfU1lNKFcpXG4iKTsKLSNlbmRpZgotCSAgICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAyKTsKLQkgICAgICBuZXdfZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0KLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9XRUFLKQotCQluZXdfZmxhZ3MgfD0gQlNGX1dFQUs7Ci0KLQkgICAgICBzd2l0Y2ggKGdzZF90eXBlKQotCQl7Ci0JCSAgY2FzZSBHU0RfU19DX0VQTToKLQkJICAgIG5hbWVfb2Zmc2V0ID0gMTE7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA1OwotCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgR1NEX1NfQ19FUE1XOgotCQkgICAgbmFtZV9vZmZzZXQgPSAxMjsKLQkJICAgIHZhbHVlX29mZnNldCA9IDY7Ci0JCSAgICBuZXdfZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBHU0RfU19DX1NZTToKLQkJICAgIGlmIChvbGRfZmxhZ3MgJiBHU1lfU19NX0RFRikJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQkJICAgICAgbmFtZV9vZmZzZXQgPSA5OwotCQkgICAgZWxzZQotCQkgICAgICBuYW1lX29mZnNldCA9IDQ7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA1OwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBHU0RfU19DX1NZTVc6Ci0JCSAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JCSAgICAgIG5hbWVfb2Zmc2V0ID0gMTA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIG5hbWVfb2Zmc2V0ID0gNTsKLQkJICAgIHZhbHVlX29mZnNldCA9IDY7Ci0JCSAgICBicmVhazsKLQkJfQotCi0JICAgICAgLyogc2F2ZSBzeW1ib2wgaW4gdm1zX3N5bWJvbF90YWJsZSAqLwotCi0JICAgICAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsCi0JCQlfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgbmFtZV9vZmZzZXQpKTsKLQkgICAgICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCQl7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgc3ltYm9sID0gZW50cnktPnN5bWJvbDsKLQotCSAgICAgIGlmIChvbGRfZmxhZ3MgJiBHU1lfU19NX0RFRikJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQkJewotCQkgIGludCBwc2VjdDsKLQotCQkgIHN5bWJvbC0+dmFsdWUgPSBiZmRfZ2V0bDMyICh2bXNfcmVjK3ZhbHVlX29mZnNldCk7Ci0JCSAgaWYgKChnc2RfdHlwZSA9PSBHU0RfU19DX1NZTVcpCi0JCSAgICAgIHx8IChnc2RfdHlwZSA9PSBHU0RfU19DX0VQTVcpKQotCQkgICAgcHNlY3QgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgdmFsdWVfb2Zmc2V0IC0gMik7Ci0JCSAgZWxzZQotCQkgICAgcHNlY3QgPSB2bXNfcmVjW3ZhbHVlX29mZnNldC0xXTsKLQotCQkgIHN5bWJvbC0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKXBzZWN0OwotI2lmIFZNU19ERUJVRwotCQkgIHZtc19kZWJ1Zyg0LCAiZ3NkIHN5bSBkZWYgIyVkICglcywgJWQgWyVwXSwgJTA0eD0lcylcbiIsIGFiZmQtPnN5bWNvdW50LAotCQkJCXN5bWJvbC0+bmFtZSwgKGludClzeW1ib2wtPnNlY3Rpb24sIHN5bWJvbC0+c2VjdGlvbiwgb2xkX2ZsYWdzLCBmbGFnMnN0cihnc3lmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGVsc2UJLyogc3ltYm9sIHJlZmVyZW5jZSAqLwotCQl7Ci0JCSAgc3ltYm9sLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQkZEX1VORF9TRUNUSU9OX05BTUUpOwotI2lmIFZNU19ERUJVRwotCQkgIHZtc19kZWJ1ZyAoNCwgImdzZCBzeW0gcmVmICMlZCAoJXMsICVzIFslcF0sICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCQlzeW1ib2wtPm5hbWUsIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSwgc3ltYm9sLT5zZWN0aW9uLCBvbGRfZmxhZ3MsIGZsYWcyc3RyIChnc3lmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0jZW5kaWYKLQkJfQotCi0JICAgICAgZ3NkX3NpemUgPSB2bXNfcmVjW25hbWVfb2Zmc2V0XSArIG5hbWVfb2Zmc2V0ICsgMTsKLQkgICAgICBzeW1ib2wtPmZsYWdzID0gbmV3X2ZsYWdzOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JICBjYXNlIEdTRF9TX0NfUFJPOgotCSAgY2FzZSBHU0RfU19DX1BST1c6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHByb1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX0lEQzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgaWRjXG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfRU5WOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBlbnZcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19MU1k6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGxzeVxuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX0xFUE06Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGxlcG1cbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19MUFJPOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBscHJvXG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfU1BTQzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2Qgc3BzY1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX1NZTVY6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHN5bXZcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19FUE1WOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBlcG12XG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfUFJPVjoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgcHJvdlxuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCi0JY2FzZSBFR1NEX1NfQ19QU0MgKyBFVkFYX09GRlNFVDoKLQkgIHsKLQkgICAgLyogcHJvZ3JhbSBzZWN0aW9uIGRlZmluaXRpb24gICovCi0KLQkgICAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrMTIpOwotCSAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0JICAgIGlmICghc2VjdGlvbikKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA2KTsKLQkgICAgc2VjdGlvbi0+X3Jhd19zaXplID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDgpOwkvKiBhbGxvY2F0aW9uICovCi0JICAgIG5ld19mbGFncyA9IHZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIGV2YXhfc2VjdGlvbl9mbGFncywgbmFtZSwgKGludCkgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgaWYgKG9sZF9mbGFncyAmIEVHUFNfU19WX1JFTCkKLQkgICAgICBuZXdfZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgbmV3X2ZsYWdzKSkKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHZtc19yZWNbNF07Ci0JICAgIGFsaWduX2FkZHIgPSAoMSA8PCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpOwotCSAgICBpZiAoKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpICE9IDApCi0JICAgICAgYmFzZV9hZGRyICs9IChhbGlnbl9hZGRyIC0gKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpKTsKLQkgICAgc2VjdGlvbi0+dm1hID0gKGJmZF92bWEpYmFzZV9hZGRyOwotCSAgICBiYXNlX2FkZHIgKz0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJCSBiZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBtZW1zZXQgKHNlY3Rpb24tPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0jaWYgVk1TX0RFQlVHCi0JICAgIHZtc19kZWJ1Zyg0LCAiZWdzZCBwc2MgJWQgKCVzLCBmbGFncyAlMDR4PSVzKSAiLAotCQkgICAgICAgc2VjdGlvbi0+aW5kZXgsIG5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIoZ3BzZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotCSAgICB2bXNfZGVidWcoNCwgIiVkIGJ5dGVzIGF0IDB4JTA4bHggKG1lbSAlcClcbiIsCi0JCSAgICAgICBzZWN0aW9uLT5fcmF3X3NpemUsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+Y29udGVudHMpOwotI2VuZGlmCi0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUdTRF9TX0NfU1lNICsgRVZBWF9PRkZTRVQ6Ci0JICB7Ci0JICAgIC8qIHN5bWJvbCBzcGVjaWZpY2F0aW9uIChkZWZpbml0aW9uIG9yIHJlZmVyZW5jZSkgICovCi0KLQkgICAgc3ltYm9sID0gX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotCSAgICBpZiAoc3ltYm9sID09IDApCi0JICAgICAgcmV0dXJuIC0xOwotCi0JICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA2KTsKLQkgICAgbmV3X2ZsYWdzID0gQlNGX05PX0ZMQUdTOwotCi0JICAgIGlmIChvbGRfZmxhZ3MgJiBFR1NZX1NfVl9XRUFLKQotCSAgICAgIG5ld19mbGFncyB8PSBCU0ZfV0VBSzsKLQotCSAgICBpZiAodm1zX3JlY1s2XSAmIEVHU1lfU19WX0RFRikJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQkgICAgICB7Ci0JCXN5bWJvbC0+bmFtZSA9Ci0JCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyszMik7Ci0JCWlmIChvbGRfZmxhZ3MgJiBFR1NZX1NfVl9OT1JNKQotCQkgIHsgICAgICAgICAvKiBwcm9jIGRlZiAqLwotCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkJICB9Ci0JCXN5bWJvbC0+dmFsdWUgPSBiZmRfZ2V0bDY0ICh2bXNfcmVjKzgpOwotCQlzeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikoKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRsMzIgKHZtc19yZWMrMjgpKTsKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJlZ3NkIHN5bSBkZWYgIyVkICglcywgJWQsICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCSAgIHN5bWJvbC0+bmFtZSwgKGludClzeW1ib2wtPnNlY3Rpb24sIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JICAgICAgfQotCSAgICBlbHNlCS8qIHN5bWJvbCByZWZlcmVuY2UgKi8KLQkgICAgICB7Ci0JICAgICAgICBzeW1ib2wtPm5hbWUgPQotCQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrOCk7Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZWdzZCBzeW0gcmVmICMlZCAoJXMsICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCSAgIHN5bWJvbC0+bmFtZSwgb2xkX2ZsYWdzLCBmbGFnMnN0cihnc3lmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0jZW5kaWYKLQkgICAgICAgIHN5bWJvbC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEJGRF9VTkRfU0VDVElPTl9OQU1FKTsKLQkgICAgICB9Ci0KLQkgICAgc3ltYm9sLT5mbGFncyA9IG5ld19mbGFnczsKLQotCSAgICAvKiBzYXZlIHN5bWJvbCBpbiB2bXNfc3ltYm9sX3RhYmxlICAqLwotCi0JICAgIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKikgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBzeW1ib2wtPm5hbWUsIHRydWUsIGZhbHNlKTsKLQkgICAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgICB7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQlyZXR1cm4gLTE7Ci0JICAgICAgfQotCSAgICBpZiAoZW50cnktPnN5bWJvbCAhPSAoYXN5bWJvbCAqKU5VTEwpCi0JICAgICAgewkJCQkJLyogRklYTUUgPywgREVDIEMgZ2VuZXJhdGVzIHRoaXMgKi8KLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJFR1NEX1NfQ19TWU06IGR1cGxpY2F0ZSBcIiVzXCJcbiIsIHN5bWJvbC0+bmFtZSk7Ci0jZW5kaWYKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWVudHJ5LT5zeW1ib2wgPSBzeW1ib2w7Ci0JCVBSSVYoZ3NkX3N5bV9jb3VudCkrKzsKLQkJYWJmZC0+c3ltY291bnQrKzsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUdTRF9TX0NfSURDICsgRVZBWF9PRkZTRVQ6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oInVua25vd24gZ3NkL2Vnc2Qgc3VidHlwZSAlZCIpLCBnc2RfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAtMTsKLQotCX0gLyogc3dpdGNoICovCi0KLSAgICAgIFBSSVYocmVjX3NpemUpIC09IGdzZF9zaXplOwotICAgICAgUFJJVih2bXNfcmVjKSArPSBnc2Rfc2l6ZTsKLQotICAgIH0gLyogd2hpbGUgKHJlY3NpemUgPiAwKSAqLwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogb3V0cHV0IHJvdXRpbmVzICovCi0KLS8qIFdyaXRlIHNlY3Rpb24gYW5kIHN5bWJvbCBkaXJlY3Rvcnkgb2YgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBhc3ltYm9sICpzeW1ib2w7Ci0gIHVuc2lnbmVkIGludCBzeW1udW07Ci0gIGludCBsYXN0X2luZGV4ID0gLTE7Ci0gIGNoYXIgZHVtbXlfbmFtZVsxMF07Ci0gIGNoYXIgKnNuYW1lOwotICBmbGFnd29yZCBuZXdfZmxhZ3MsIG9sZF9mbGFnczsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZ3NkICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIC8qIG91dHB1dCBzZWN0aW9ucyAgKi8KLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMywgIiVkIHNlY3Rpb25zIGZvdW5kXG4iLCBhYmZkLT5zZWN0aW9uX2NvdW50KTsKLSNlbmRpZgotCi0gIC8qIGVnc2QgaXMgcXVhZHdvcmQgYWxpZ25lZCAgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA4KTsKLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VHU0QsIC0xKTsKLSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLwotCi0gIHdoaWxlIChzZWN0aW9uICE9IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICJTZWN0aW9uICMlZCAlcywgJWQgYnl0ZXNcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0jZW5kaWYKLQotCS8qIDEzIGJ5dGVzIGVnc2QsIG1heCAzMSBjaGFycyBuYW1lIC0+IHNob3VsZCBiZSA0NCBieXRlcyAqLwotICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgNjQpIDwgMCkKLQl7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLwotCX0KLQotCS8qIENyZWF0ZSBkdW1teSBzZWN0aW9ucyB0byBrZWVwIGNvbnNlY3V0aXZlIGluZGljZXMgKi8KLQotICAgICAgd2hpbGUgKHNlY3Rpb24tPmluZGV4IC0gbGFzdF9pbmRleCA+IDEpCi0JewotI2lmIFZNU19ERUJVRwotCSAgdm1zX2RlYnVnICgzLCAiaW5kZXggJWQsIGxhc3QgJWRcbiIsIHNlY3Rpb24tPmluZGV4LCBsYXN0X2luZGV4KTsKLSNlbmRpZgotCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19QU0MsIC0xKTsKLQkgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwotCSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotCSAgc3ByaW50ZiAoZHVtbXlfbmFtZSwgIi5EVU1NWSUwMmQiLCBsYXN0X2luZGV4KTsKLQkgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBkdW1teV9uYW1lKTsKLQkgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JICBsYXN0X2luZGV4Kys7Ci0JfQotCi0gICAgICAvKiBEb24ndCBrbm93IGlmIHRoaXMgaXMgbmVjY2VzYXJ5IGZvciB0aGUgbGlua2VyIGJ1dCBmb3Igbm93IGl0IGtlZXBzCi0JIHZtc19zbHVycF9nc2QgaGFwcHkgICovCi0KLSAgICAgIHNuYW1lID0gKGNoYXIgKilzZWN0aW9uLT5uYW1lOwotICAgICAgaWYgKCpzbmFtZSA9PSAnLicpCi0JewotCSAgc25hbWUrKzsKLQkgIGlmICgoKnNuYW1lID09ICd0JykgJiYgKHN0cmNtcCAoc25hbWUsICJ0ZXh0IikgPT0gMCkpCi0JICAgIHNuYW1lID0gUFJJVihpc192YXgpP1ZBWF9DT0RFX05BTUU6RVZBWF9DT0RFX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdkJykgJiYgKHN0cmNtcCAoc25hbWUsICJkYXRhIikgPT0gMCkpCi0JICAgIHNuYW1lID0gUFJJVihpc192YXgpP1ZBWF9EQVRBX05BTUU6RVZBWF9EQVRBX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdiJykgJiYgKHN0cmNtcCAoc25hbWUsICJic3MiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0JTU19OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnbCcpICYmIChzdHJjbXAgKHNuYW1lLCAibGluayIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfTElOS19OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAncicpICYmIChzdHJjbXAgKHNuYW1lLCAicmRhdGEiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX1JFQURPTkxZX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdsJykgJiYgKHN0cmNtcCAoc25hbWUsICJsaXRlcmFsIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9MSVRFUkFMX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdjJykgJiYgKHN0cmNtcCAoc25hbWUsICJjb21tIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9DT01NT05fTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2wnKSAmJiAoc3RyY21wIChzbmFtZSwgImxjb21tIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9MT0NBTF9OQU1FOwotCX0KLSAgICAgIGVsc2UKLQlzbmFtZSA9IF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc25hbWUsIEVPQkpfU19DX1NFQ1NJWik7Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRUdTRF9TX0NfUFNDLCAtMSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciAmIDB4ZmYpOwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0JewotCSAgbmV3X2ZsYWdzID0gKEVHUFNfU19WX09WUnxFR1BTX1NfVl9SRUx8RUdQU19TX1ZfR0JMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRHxFR1BTX1NfVl9DT00pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuZXdfZmxhZ3MgPSB2bXNfZXNlY2ZsYWdfYnlfbmFtZSAoZXZheF9zZWN0aW9uX2ZsYWdzLCBzbmFtZSwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIG5ld19mbGFncyk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBzbmFtZSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gICAgICBsYXN0X2luZGV4ID0gc2VjdGlvbi0+aW5kZXg7Ci0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgLyogb3V0cHV0IHN5bWJvbHMgICovCi0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgzLCAiJWQgc3ltYm9scyBmb3VuZFxuIiwgYWJmZC0+c3ltY291bnQpOwotI2VuZGlmCi0KLSAgYmZkX3NldF9zdGFydF9hZGRyZXNzIChhYmZkLCAoYmZkX3ZtYSktMSk7Ci0KLSAgZm9yIChzeW1udW0gPSAwOyBzeW1udW0gPCBhYmZkLT5zeW1jb3VudDsgc3ltbnVtKyspCi0gICAgewotCi0gICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07Ci0gICAgICBpZiAoKihzeW1ib2wtPm5hbWUpID09ICdfJykKLQl7Ci0JICBpZiAoc3RyY21wIChzeW1ib2wtPm5hbWUsICJfX21haW4iKSA9PSAwKQotCSAgICBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIChiZmRfdm1hKXN5bWJvbC0+dmFsdWUpOwotCX0KLSAgICAgIG9sZF9mbGFncyA9IHN5bWJvbC0+ZmxhZ3M7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRklMRSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKCgob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKSA9PSAwKQkvKiBub3QgeGRlZiAqLwotCSAgJiYgKCFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpKQkvKiBhbmQgbm90IHhyZWYgKi8KLQljb250aW51ZTsJCQkJCS8qIGRvbnQgb3V0cHV0ICovCi0KLSAgICAgIC8qIDEzIGJ5dGVzIGVnc2QsIG1heCA2NCBjaGFycyBuYW1lIC0+IHNob3VsZCBiZSA3NyBieXRlcyAgKi8KLQotICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgODApIDwgMCkKLQl7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLwotCX0KLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19TWU0sIC0xKTsKLQotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsJCQkvKiBkYXRhIHR5cGUsIGFsaWdubWVudCAqLwotCi0gICAgICBuZXdfZmxhZ3MgPSAwOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX1dFQUspCi0JbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1dFQUs7Ci0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQkJLyogLmNvbW0gICovCi0JbmV3X2ZsYWdzIHw9IChFR1NZX1NfVl9XRUFLfEVHU1lfU19WX0NPTU0pOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCXsKLQkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9OT1JNOwotCSAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1JFTDsKLQl9Ci0gICAgICBpZiAob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKQotCXsKLQkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9ERUY7Ci0JICBpZiAoIWJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1JFTDsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIG5ld19mbGFncyk7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfV0VBSykpCQkvKiBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCXsKLQkgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pCi0JICAgIHsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgc3ltYm9sLT52YWx1ZSk7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJICAgICAoKGFzeW1ib2wgKikoc3ltYm9sLT51ZGF0YS5wKSktPnZhbHVlKTsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkgICAgICgoKGFzeW1ib2wgKikoc3ltYm9sLT51ZGF0YS5wKSkKLQkJCQkgICAgICAtPnNlY3Rpb24tPmluZGV4KSk7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgc3ltYm9sLT52YWx1ZSk7CS8qIExfVkFMVUUgKi8KLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgMCk7CQkJLyogTF9DT0RFX0FERFJFU1MgKi8KLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CQkJLyogTF9DQV9QU0lORFggKi8KLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc3ltYm9sLT5zZWN0aW9uLT5pbmRleCk7LyogTF9QU0lORFggKi8KLQkgICAgfQotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bWJvbC0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgOCk7Ci0gIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsgCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLWhkci5jIGIvYmZkL3Ztcy1oZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzNmIzMi4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLWhkci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS8qIHZtcy1oZHIuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZNUy9WQVggKG9wZW5WTVMvVkFYKSBhbmQKLSAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIEhEUiByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0gICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgYW5kCi0gICBFT00gcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qIFJlYWQgJiBwcm9jZXNzIGVtaCByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2hkciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqcHRyOwotICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwotICBpbnQgc3VidHlwZTsKLQotICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoMiwgIkhEUi9FTUhcbiIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChvYmp0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgT0JKX1NfQ19IRFI6Ci0Jc3VidHlwZSA9IHZtc19yZWNbMV07Ci0JYnJlYWs7Ci0gICAgICBjYXNlIEVPQkpfU19DX0VNSDoKLQlzdWJ0eXBlID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDQpICsgRVZBWF9PRkZTRVQ7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXN1YnR5cGUgPSAtMTsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDMsICJzdWJ0eXBlICVkXG4iLCBzdWJ0eXBlKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoc3VidHlwZSkKLSAgICB7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19NSEQ6Ci0JLyoKLQkgKiBtb2R1bGUgaGVhZGVyCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1syXTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgMyk7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA1KTsKLQlwdHIgPSB2bXNfcmVjICsgNSArIHZtc19yZWNbNV0gKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCXB0ciArPSAqcHRyICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX0xOTToKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX1NSQzoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Nfc3JjID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX1RUTDoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX0NQUjoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX01UQzoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX0dUWDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX01IRCArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICogbW9kdWxlIGhlYWRlcgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbNl07Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDEgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgOCk7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOwotCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9Ci0JICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgMjApOwotCXB0ciA9IHZtc19yZWMgKyAyMCArIHZtc19yZWNbMjBdICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0KLQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JcHRyICs9ICpwdHIgKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX0xOTSArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX1NSQyArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX1RUTCArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX0NQUiArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfTVRDICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19HVFggKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAtMTsKLQotICAgIH0gLyogc3dpdGNoICovCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBPdXRwdXQgcm91dGluZXMuICAqLwotCi0KLS8qIE1hbnVmYWN1cmUgYSBWTVMgbGlrZSB0aW1lIG9uIGEgdW5peCBiYXNlZCBzeXN0ZW0uCi0gICBzdG9sZW4gZnJvbSBvYmotdm1zLmMgICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLWdldF92bXNfdGltZV9zdHJpbmcgKCkKLXsKLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07Ci0jaWZuZGVmIFZNUwotI2luY2x1ZGUgPHRpbWUuaD4KLQotICBjaGFyICpwbnQ7Ci0gIHRpbWVfdCB0aW1lYjsKLSAgdGltZSAoJnRpbWViKTsKLSAgcG50ID0gY3RpbWUgKCZ0aW1lYik7Ci0gIHBudFszXSA9IDA7Ci0gIHBudFs3XSA9IDA7Ci0gIHBudFsxMF0gPSAwOwotICBwbnRbMTZdID0gMDsKLSAgcG50WzI0XSA9IDA7Ci0gIHNwcmludGYgKHRidWYsICIlMnMtJTNzLSVzICVzIiwgcG50ICsgOCwgcG50ICsgNCwgcG50ICsgMjAsIHBudCArIDExKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3RhcmxldC5oPgotICBzdHJ1Y3QKLSAgewotICAgIGludCBTaXplOwotICAgIHVuc2lnbmVkIGNoYXIgKlB0cjsKLSAgfSBEZXNjcmlwdG9yOwotICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKLSAgRGVzY3JpcHRvci5QdHIgPSB0YnVmOwotICBTWVMkQVNDVElNICgwLCAmRGVzY3JpcHRvciwgMCwgMCk7Ci0jZW5kaWYgLyogbm90IFZNUyAqLwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7Ci0jZW5kaWYKLQotICByZXR1cm4gdGJ1ZjsKLX0KLQotCi0vKiB3cml0ZSBvYmplY3QgaGVhZGVyIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV9oZHIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLSAgdW5zaWduZWQgaW50IHN5bW51bTsKLSAgaW50IGhhZF9jYXNlID0gMDsKLSAgaW50IGhhZF9maWxlID0gMDsKLQotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9oZHIgKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCAyKTsKLQotICAvKiBNSEQgKi8KLQotICBpZiAob2JqdHlwZSA9PSBPQkpfU19DX0hEUikKLSAgICB7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTUhEKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgRU9CSl9TX0NfU1RSTFZMKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBNQVhfT1VUUkVDX1NJWkUpOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBzdHJpcCBwYXRoIGFuZCBzdWZmaXggaW5mb3JtYXRpb24gKi8KLQotICAgICAgY2hhciAqZm5hbWUsICpmb3V0LCAqZnB0cjsKLQotICAgICAgZnB0ciA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoZnB0cikgKyAxKTsKLSAgICAgIHN0cmNweSAoZm5hbWUsIGZwdHIpOwotICAgICAgZm91dCA9IHN0cnJjaHIgKGZuYW1lLCAnXScpOwotICAgICAgaWYgKGZvdXQgPT0gMCkKLQlmb3V0ID0gc3RyY2hyIChmbmFtZSwgJzonKTsKLSAgICAgIGlmIChmb3V0ICE9IDApCi0JZm91dCsrOwotICAgICAgZWxzZQotCWZvdXQgPSBmbmFtZTsKLQotICAgICAgLyogc3RyaXAgLm9iaiBzdWZmaXggICovCi0KLSAgICAgIGZwdHIgPSBzdHJyY2hyIChmbmFtZSwgJy4nKTsKLSAgICAgIGlmICgoZnB0ciAhPSAwKQotCSAgJiYgKHN0cmNhc2VjbXAgKGZwdHIsICIuT0JKIikgPT0gMCkpCi0JKmZwdHIgPSAwOwotCi0gICAgICBmcHRyID0gZm91dDsKLSAgICAgIHdoaWxlICgqZnB0ciAhPSAwKQotCXsKLQkgIGlmIChpc2xvd2VyICgqZnB0cikpCi0JICAgICpmcHRyID0gdG91cHBlciAoKmZwdHIpOwotCSAgZnB0cisrOwotCSAgaWYgKCgqZnB0ciA9PSAnOycpCi0JICAgICB8fCAoKGZwdHIgLSBmb3V0KSA+IDMxKSkKLQkgICAgKmZwdHIgPSAwOwotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBmb3V0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgIk5PTkFNRSIpOwotCi0gIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBCRkRfVkVSU0lPTik7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBnZXRfdm1zX3RpbWVfc3RyaW5nICgpLCAxNyk7Ci0gIF9iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCAwLCAxNyk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogTE1OICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTE5NKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIkdBUyBwcm9HSVMiLCAxMCk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogU1JDICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfU1JDKTsKLQotICBmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IGFiZmQtPnN5bWNvdW50OyBzeW1udW0rKykKLSAgICB7Ci0gICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07Ci0KLSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0ZJTEUpCi0JewotCSAgaWYgKHN0cm5jbXAgKChjaGFyICopc3ltYm9sLT5uYW1lLCAiPENBU0U6IiwgNikgPT0gMCkKLQkgICAgewotCSAgICAgIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpID0gc3ltYm9sLT5uYW1lWzZdIC0gJzAnOwotCSAgICAgIFBSSVYoZmxhZ19zaG93X2FmdGVyX3RydW5jKSA9IHN5bWJvbC0+bmFtZVs3XSAtICcwJzsKLQotCSAgICAgIGlmIChoYWRfZmlsZSkKLQkJYnJlYWs7Ci0JICAgICAgaGFkX2Nhc2UgPSAxOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKXN5bWJvbC0+bmFtZSwgc3RybGVuIChzeW1ib2wtPm5hbWUpKTsKLQkgIGlmIChoYWRfY2FzZSkKLQkgICAgYnJlYWs7Ci0JICBoYWRfZmlsZSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAoc3ltbnVtID09IGFiZmQtPnN5bWNvdW50KQotICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJub25hbWUiLCA2KTsKLQotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIC8qIFRUTCAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1RUTCk7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJUVEwiLCAzKTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAvKiBDUFIgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19DUFIpOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwKLQkJCSAodW5zaWduZWQgY2hhciAqKSJHTlUgQkZEIHBvcnRlZCBieSBLbGF1cyBL5G1wZiAxOTk0LTE5OTYiLAotCQkJIDM5KTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFByb2Nlc3MgRU9NL0VFT00gcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9lb20gKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDIsICJFT00vRUVPTVxuIik7Ci0jZW5kaWYKLQotICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKLQotICBpZiAoKG9ianR5cGUgPT0gT0JKX1NfQ19FT00pIAotICAgICB8fCAob2JqdHlwZSA9PSBPQkpfU19DX0VPTVcpKQotICAgIHsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQUklWKGVvbV9kYXRhKS5lb21fbF90b3RhbF9scHMgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgNCk7Ci0gICAgICBQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPSAqKHZtc19yZWMgKyA4KTsKLSAgICAgIGlmIChQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPiAxKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqZWN0IG1vZHVsZSBOT1QgZXJyb3ItZnJlZSAhXG4iKSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gZmFsc2U7Ci0gICAgICBpZiAoUFJJVihyZWNfc2l6ZSkgPiAxMCkKLQl7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IHRydWU7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2JfdGZyZmxnID0gKih2bXNfcmVjICsgOSk7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2xfcHNpbmR4ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKLQkgICBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwotCi0JICAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkcjsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBXcml0ZSBlb20gcmVjb3JkIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9lb20gKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBvYmp0eXBlLCAtMSk7Ci0gIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykoUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPj4gMSkpOwotICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGNvbXBsZXRpb24gY29kZSAqLwotICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGZpbGwgYnl0ZSAqLwotCi0gIGlmIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpICE9IChiZmRfdm1hKS0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubGluayIpOwotICAgICAgaWYgKHNlY3Rpb24gPT0gMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShzZWN0aW9uLT5pbmRleCkpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkgICAgICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy1taXNjLmMgYi9iZmQvdm1zLW1pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExMTkyYy4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLW1pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDExNDYgKzAsMCBAQAotLyogdm1zLW1pc2MuYyAtLSBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiBWTVNfREVCVUcKLS8qIGRlYnVnIGZ1bmN0aW9ucyAqLwotCi0vKiBkZWJ1ZyBmdW5jdGlvbiBmb3IgYWxsIHZtcyBleHRlbnNpb25zCi0gICBldmFsdWF0ZXMgZW52aXJvbm1lbnQgdmFyaWFibGUgVk1TX0RFQlVHIGZvciBhCi0gICBudW1lcmljYWwgdmFsdWUgb24gdGhlIGZpcnN0IGNhbGwKLSAgIGFsbCBlcnJvciBsZXZlbHMgYmVsb3cgdGhpcyB2YWx1ZSBhcmUgcHJpbnRlZAotICAKLSAgIGxldmVsczoKLSAgIDEJdG9wbGV2ZWwgYmZkIGNhbGxzIChmdW5jdGlvbnMgZnJvbSB0aGUgYmZkIHZlY3RvcikKLSAgIDIJZnVuY3Rpb25zIGNhbGxlZCBieSBiZmQgY2FsbHMKLSAgIC4uLgotICAgOQlhbG1vc3QgZXZlcnl0aGluZwotCi0gICBsZXZlbCBpcyBhbHNvIGlkZW50YXRpb24gbGV2ZWwuIEluZGVudGF0aW9uIGlzIHBlcmZvcm1lZAotICAgaWYgbGV2ZWwgPiAwCi0JKi8KLQotI2lmIF9fU1REQ19fCi12b2lkCi1fYmZkX3Ztc19kZWJ1ZyAoaW50IGxldmVsLCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgc3RhdGljIGludCBtaW5fbGV2ZWwgPSAtMTsKLSAgc3RhdGljIEZJTEUgKm91dHB1dCA9IE5VTEw7Ci0gIGNoYXIgKmVwdHI7Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IGFic2x2bCA9IChsZXZlbCA+IDApP2xldmVsOi1sZXZlbDsKLQotICBpZiAobWluX2xldmVsID09IC0xKQotICAgIHsKLSAgICAgIGlmICgoZXB0ciA9IGdldGVudigiVk1TX0RFQlVHIikpICE9IE5VTEwpCi0JewotCSAgbWluX2xldmVsID0gYXRvaShlcHRyKTsKLQkgIG91dHB1dCA9IHN0ZGVycjsKLQl9Ci0gICAgICBlbHNlCi0JbWluX2xldmVsID0gMDsKLSAgICB9Ci0gIGlmIChvdXRwdXQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChhYnNsdmwgPiBtaW5fbGV2ZWwpCi0gICAgcmV0dXJuOwotCi0gIHdoaWxlKC0tbGV2ZWw+MCkKLSAgICBmcHJpbnRmKG91dHB1dCwgIiAiKTsKLSAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLSAgdmZwcmludGYob3V0cHV0LCBmb3JtYXQsIGFyZ3MpOwotICBmZmx1c2gob3V0cHV0KTsKLSAgdmFfZW5kKGFyZ3MpOwotCi0gIHJldHVybjsKLX0KLQotI2Vsc2UgLyogbm90IF9fU1REQ19fICovCi0KLXZvaWQKLV9iZmRfdm1zX2RlYnVnIChsZXZlbCwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KQotICAgICBpbnQgbGV2ZWw7Ci0gICAgIGNoYXIgKmZvcm1hdDsKLSAgICAgbG9uZyBhMTsgbG9uZyBhMjsgbG9uZyBhMzsKLSAgICAgbG9uZyBhNDsgbG9uZyBhNTsgbG9uZyBhNjsKLXsKLSAgc3RhdGljIGludCBtaW5fbGV2ZWwgPSAtMTsKLSAgc3RhdGljIEZJTEUgKm91dHB1dCA9IE5VTEw7Ci0gIGNoYXIgKmVwdHI7Ci0KLSAgaWYgKG1pbl9sZXZlbCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoKGVwdHIgPSBnZXRlbnYoIlZNU19ERUJVRyIpKSAhPSBOVUxMKQotCXsKLQkgIG1pbl9sZXZlbCA9IGF0b2koZXB0cik7Ci0JICBvdXRwdXQgPSBzdGRlcnI7Ci0JfQotICAgICAgZWxzZQotCW1pbl9sZXZlbCA9IDA7Ci0gICAgfQotICBpZiAob3V0cHV0ID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBpZiAobGV2ZWwgPiBtaW5fbGV2ZWwpCi0gICAgcmV0dXJuOwotCi0gIHdoaWxlKC0tbGV2ZWw+MCkKLSAgICBmcHJpbnRmKG91dHB1dCwgIiAiKTsKLSAgZnByaW50ZihvdXRwdXQsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7Ci0gIGZmbHVzaChvdXRwdXQpOwotCi0gIHJldHVybjsKLX0KLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0KLS8qIGEgZGVidWcgZnVuY3Rpb24KLSAgIGhleCBkdW1wICdzaXplJyBieXRlcyBzdGFydGluZyBhdCAncHRyJyAgKi8KLQotdm9pZAotX2JmZF9oZXhkdW1wIChsZXZlbCwgcHRyLCBzaXplLCBvZmZzZXQpCi0gICAgIGludCBsZXZlbDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG9mZnNldDsKLXsKLSAgdW5zaWduZWQgY2hhciAqbHB0ciA9IHB0cjsKLSAgaW50IGNvdW50ID0gMDsKLSAgbG9uZyBzdGFydCA9IG9mZnNldDsKLQotICB3aGlsZSAoc2l6ZS0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKGNvdW50JTE2KSA9PSAwKQotCXZtc19kZWJ1ZyAobGV2ZWwsICIlMDhseDoiLCBzdGFydCk7Ci0gICAgICB2bXNfZGVidWcgKC1sZXZlbCwgIiAlMDJ4IiwgKnB0cisrKTsKLSAgICAgIGNvdW50Kys7Ci0gICAgICBzdGFydCsrOwotICAgICAgaWYgKHNpemUgPT0gMCkKLQl7Ci0JICB3aGlsZSAoKGNvdW50JTE2KSAhPSAwKQotCSAgICB7Ci0JICAgICAgdm1zX2RlYnVnICgtbGV2ZWwsICIgICAiKTsKLQkgICAgICBjb3VudCsrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKChjb3VudCUxNikgPT0gMCkKLQl7Ci0JICB2bXNfZGVidWcgKC1sZXZlbCwgIiAiKTsKLQkgIHdoaWxlIChscHRyIDwgcHRyKQotCSAgICB7Ci0JICAgICAgdm1zX2RlYnVnICgtbGV2ZWwsICIlYyIsICgqbHB0ciA8IDMyKT8nLic6KmxwdHIpOwotCSAgICAgIGxwdHIrKzsKLQkgICAgfQotCSAgdm1zX2RlYnVnICgtbGV2ZWwsICJcbiIpOwotCX0KLSAgICB9Ci0gIGlmICgoY291bnQlMTYpICE9IDApCi0gICAgdm1zX2RlYnVnICgtbGV2ZWwsICJcbiIpOwotCi0gIHJldHVybjsKLX0KLSNlbmRpZgotCi0MCi0vKiBoYXNoIGZ1bmN0aW9ucwotCi0gICBUaGVzZSBhcmUgbmVlZGVkIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gICovCi0KLS8qIGFsbG9jYXRlIG5ldyB2bXNfaGFzaF9lbnRyeQotICAga2VlcCB0aGUgc3ltYm9sIG5hbWUgYW5kIGEgcG9pbnRlciB0byB0aGUgYmZkIHN5bWJvbCBpbiB0aGUgdGFibGUgICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX3Ztc19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHZtc19zeW1ib2xfZW50cnkgKnJldDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDUsICJfYmZkX3Ztc19oYXNoX25ld2Z1bmMoJXAsICVwLCAlcylcbiIsIGVudHJ5LCB0YWJsZSwgc3RyaW5nKTsKLSNlbmRpZgotCi0gIGlmIChlbnRyeSA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopTlVMTCkKLSAgICB7Ci0gICAgICByZXQgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mICh2bXNfc3ltYm9sX2VudHJ5KSk7Ci0gICAgICBpZiAocmV0ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopIE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKU5VTEw7Ci0JfQotICAgICAgZW50cnkgPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLSAgICB9Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotCi0gIHJldCA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKTsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfaGFzaF9uZXdmdW5jIHJldCAlcFxuIiwgcmV0KTsKLSNlbmRpZgotCi0gIHJldC0+c3ltYm9sID0gKGFzeW1ib2wgKilOVUxMOwotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopcmV0OwotfQotCi0MCi0vKiBvYmplY3QgZmlsZSBpbnB1dCBmdW5jdGlvbnMgKi8KLQotLyogUmV0dXJuIHR5cGUgYW5kIGxlbmd0aCBmcm9tIHJlY29yZCBoZWFkZXIgKGJ1Zikgb24gQWxwaGEuICAqLwotCi12b2lkCi1fYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgYnVmLCB0eXBlLCBsZW5ndGgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCAqdHlwZTsKLSAgICAgaW50ICpsZW5ndGg7Ci17Ci0gIGlmICh0eXBlICE9IDApCi0gICAgKnR5cGUgPSBiZmRfZ2V0bDE2IChidWYpOwotICBidWYgKz0gMjsKLSAgaWYgKGxlbmd0aCAhPSAwKQotICAgICpsZW5ndGggPSBiZmRfZ2V0bDE2IChidWYpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMTAsICJfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyB0eXBlICV4LCBsZW5ndGggJXhcbiIsICh0eXBlPyp0eXBlOjApLCAobGVuZ3RoPypsZW5ndGg6MCkpOwotI2VuZGlmCi0KLQotICByZXR1cm47Ci19Ci0KLQotLyogR2V0IG5leHQgcmVjb3JkIGZyb20gb2JqZWN0IGZpbGUgdG8gdm1zX2J1ZgotICAgc2V0IFBSSVYoYnVmX3NpemUpIGFuZCByZXR1cm4gaXQKLSAgCi0gICB0aGlzIGlzIGEgbGl0dGxlIHRyaWNreSBzaW5jZSBpdCBzaG91bGQgYmUgcG9ydGFibGUuCi0gIAotICAgdGhlIG9wZW5WTVMgb2JqZWN0IGZpbGUgaGFzICd2YXJpYWJsZSBsZW5ndGgnIHdoaWNoIG1lYW5zIHRoYXQKLSAgIHJlYWQoKSByZXR1cm5zIGRhdGEgaW4gY2h1bmtzIG9mIChob3BlZnVsbHkpIGNvcnJlY3QgYW5kIGV4cGVjdGVkCi0gICBzaXplLiBUaGUgbGlua2VyIChhbmQgb3RoZXIgdG9vbHMgb24gdm1zKSBkZXBlbmQgb24gdGhhdC4gVW5peCBkb2Vzbid0Ci0gICBrbm93IGFib3V0ICdmb3JtYXR0ZWQnIGZpbGVzLCBzbyByZWFkaW5nIGFuZCB3cml0aW5nIHN1Y2ggYW4gb2JqZWN0Ci0gICBmaWxlIGluIGEgdW5peCBlbnZpcm9ubWVudCBpcyBub3QgdHJpdmlhbC4KLSAgCi0gICBXaXRoIHRoZSB0b29sICdmaWxlJyAoYXZhaWxhYmxlIG9uIGFsbCB2bXMgZnRwIHNpdGVzKSwgb25lCi0gICBjYW4gdmlldyBhbmQgY2hhbmdlIHRoZSBhdHRyaWJ1dGVzIG9mIGEgZmlsZS4gQ2hhbmdpbmcgZnJvbQotICAgJ3ZhcmlhYmxlIGxlbmd0aCcgdG8gJ2ZpeGVkIGxlbmd0aCwgNTEyIGJ5dGVzJyByZXZlYWxzIHRoZQotICAgcmVjb3JkIGxlbmd0aCBhdCB0aGUgZmlyc3QgMiBieXRlcyBvZiBldmVyeSByZWNvcmQuIFRoZSBzYW1lCi0gICBoYXBwZW5zIGR1cmluZyB0aGUgdHJhbnNmZXIgb2Ygb2JqZWN0IGZpbGVzIGZyb20gdm1zIHRvIHVuaXgsCi0gICBhdCBsZWFzdCB3aXRoIHVjeCwgZGVjJ3MgaW1wbGVtZW50YXRpb24gb2YgdGNwL2lwLgotICAKLSAgIFRoZSB2bXMgZm9ybWF0IHJlcGVhdHMgdGhlIGxlbmd0aCBhdCBieXRlcyAyICYgMyBvZiBldmVyeSByZWNvcmQuCi0gIAotICAgT24gdGhlIGZpcnN0IGNhbGwgKGZpbGVfZm9ybWF0ID09IEZGX1VOS05PV04pIHdlIGNoZWNrIGlmCi0gICB0aGUgZmlyc3QgYW5kIHRoZSB0aGlyZCBieXRlIHBhaXIgKCEpIG9mIHRoZSByZWNvcmQgbWF0Y2guCi0gICBJZiB0aGV5IGRvIGl0J3MgYW4gb2JqZWN0IGZpbGUgaW4gYW4gdW5peCBlbnZpcm9ubWVudCBvciB3aXRoCi0gICB3cm9uZyBhdHRyaWJ1dGVzIChGRl9GT1JFSUdOKSwgZWxzZSB3ZSBzaG91bGQgYmUgaW4gYSB2bXMKLSAgIGVudmlyb25tZW50IHdoZXJlIHJlYWQoKSByZXR1cm5zIHRoZSByZWNvcmQgc2l6ZSAoRkZfTkFUSVZFKS4KLSAgCi0gICByZWFkaW5nIGlzIGFsd2F5cyBkb25lIGluIDIgc3RlcHMuCi0gICBmaXJzdCBqdXN0IHRoZSByZWNvcmQgaGVhZGVyIGlzIHJlYWQgYW5kIHRoZSBsZW5ndGggZXh0cmFjdGVkCi0gICBieSBnZXRfaGVhZGVyX3ZhbHVlcwotICAgdGhlbiB0aGUgcmVhZCBidWZmZXIgaXMgYWRqdXN0ZWQgYW5kIHRoZSByZW1haW5pbmcgYnl0ZXMgYXJlCi0gICByZWFkIGluLgotICAKLSAgIGFsbCBmaWxlIGkvbyBpcyBhbHdheXMgZG9uZSBvbiBldmVuIGZpbGUgcG9zaXRpb25zICAqLwotCi1pbnQKLV9iZmRfdm1zX2dldF9yZWNvcmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHRlc3RfbGVuLCB0ZXN0X3N0YXJ0LCByZW1haW5pbmc7Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19idWY7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfZ2V0X3JlY29yZFxuIik7Ci0jZW5kaWYKLQotICAvKiBtaW5pbXVtIGlzIDYgYnl0ZXMgb24gQWxwaGEKLSAgICAgKDIgYnl0ZXMgbGVuZ3RoLCAyIGJ5dGVzIHJlY29yZCBpZCwgMiBieXRlcyBsZW5ndGggcmVwZWF0ZWQpCi0KLSAgICAgb24gVkFYIHRoZXJlJ3Mgbm8gbGVuZ3RoIGluZm9ybWF0aW9uIGluIHRoZSByZWNvcmQKLSAgICAgc28gc3RhcnQgd2l0aCBPQkpfU19DX01BWFJFQ1NJWiAgKi8KLQotICBpZiAoUFJJVihidWZfc2l6ZSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoUFJJVihpc192YXgpKQotCXsKLQkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE9CSl9TX0NfTUFYUkVDU0laKTsKLQkgIFBSSVYoYnVmX3NpemUpID0gT0JKX1NfQ19NQVhSRUNTSVo7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX1ZBWDsKLQl9Ci0gICAgICBlbHNlCi0JUFJJVih2bXNfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyAoNik7Ci0gICAgfQotCi0gIHZtc19idWYgPSBQUklWKHZtc19idWYpOwotCi0gIGlmICh2bXNfYnVmID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN3aXRjaCAoUFJJVihmaWxlX2Zvcm1hdCkpCi0gICAgewotICAgICAgY2FzZSBGRl9VTktOT1dOOgotICAgICAgY2FzZSBGRl9GT1JFSUdOOgotCXRlc3RfbGVuID0gNjsJCQkvKiBwcm9iZSA2IGJ5dGVzICovCi0JdGVzdF9zdGFydCA9IDI7CQkJLyogd2hlcmUgdGhlIHJlY29yZCBzdGFydHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZGX05BVElWRToKLQl0ZXN0X2xlbiA9IDQ7Ci0JdGVzdF9zdGFydCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBGRl9WQVg6Ci0JdGVzdF9sZW4gPSAwOwotCXRlc3Rfc3RhcnQgPSAwOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvKiBza2lwIG9kZCBhbGlnbm1lbnQgYnl0ZSAgKi8KLQotICBpZiAoYmZkX3RlbGwgKGFiZmQpICYgMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3JlYWQgKFBSSVYodm1zX2J1ZiksIDEsIDEsIGFiZmQpICE9IDEpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgLyogcmVhZCB0aGUgcmVjb3JkIGhlYWRlciBvbiBBbHBoYS4gICovCi0KLSAgaWYgKCh0ZXN0X2xlbiAhPSAwKQotICAgICAgJiYgKGJmZF9yZWFkIChQUklWKHZtc19idWYpLCAxLCB0ZXN0X2xlbiwgYWJmZCkKLQkgICE9IChiZmRfc2l6ZV90eXBlKSB0ZXN0X2xlbikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBjaGVjayBmaWxlIGZvcm1hdCBvbiBmaXJzdCBjYWxsICAqLwotCi0gIGlmIChQUklWKGZpbGVfZm9ybWF0KSA9PSBGRl9VTktOT1dOKQotICAgIHsJCQkJCQkvKiByZWNvcmQgbGVuZ3RoIHJlcGVhdHMgPyAqLwotICAgICAgaWYgKCAodm1zX2J1ZlswXSA9PSB2bXNfYnVmWzRdKQotICAgICAgICAmJiAodm1zX2J1ZlsxXSA9PSB2bXNfYnVmWzVdKSkKLQl7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX0ZPUkVJR047CS8qIFk6IGZvcmVpZ24gZW52aXJvbm1lbnQgKi8KLQkgIHRlc3Rfc3RhcnQgPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX05BVElWRTsJLyogTjogbmF0aXZlIGVudmlyb25tZW50ICovCi0JICB0ZXN0X3N0YXJ0ID0gMDsKLQl9Ci0gICAgfQotCi0gIGlmIChQUklWKGlzX3ZheCkpCi0gICAgewotICAgICAgUFJJVihyZWNfbGVuZ3RoKSA9IGJmZF9yZWFkICh2bXNfYnVmLCAxLCBQUklWKGJ1Zl9zaXplKSwgYWJmZCk7Ci0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA8PSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBQUklWKHZtc19yZWMpID0gdm1zX2J1ZjsKLSAgICB9Ci0gIGVsc2UJCS8qIEFscGhhICAqLwotICAgIHsKLSAgICAgIC8qIGV4dHJhY3Qgdm1zIHJlY29yZCBsZW5ndGggICovCi0KLSAgICAgIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCB2bXNfYnVmK3Rlc3Rfc3RhcnQsIE5VTEwsCi0JCQkJICAmUFJJVihyZWNfbGVuZ3RoKSk7Ci0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpIDw9IDApCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogdGhhdCdzIHdoYXQgdGhlIGxpbmtlciBtYW51YWwgc2F5cyAgKi8KLQotICAgICAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPiBFT0JKX1NfQ19NQVhSRUNTSVopCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogYWRqdXN0IHRoZSBidWZmZXIgICovCi0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpID4gUFJJVihidWZfc2l6ZSkpCi0JewotCSAgUFJJVih2bXNfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIHJlYWxsb2MgKHZtc19idWYsIFBSSVYocmVjX2xlbmd0aCkpOwotCSAgdm1zX2J1ZiA9IFBSSVYodm1zX2J1Zik7Ci0JICBpZiAodm1zX2J1ZiA9PSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICBQUklWKGJ1Zl9zaXplKSA9IFBSSVYocmVjX2xlbmd0aCk7Ci0JfQotCi0gICAgICAvKiByZWFkIHRoZSByZW1haW5pbmcgcmVjb3JkICAqLwotCi0gICAgICByZW1haW5pbmcgPSBQUklWKHJlY19sZW5ndGgpIC0gdGVzdF9sZW4gKyB0ZXN0X3N0YXJ0OwotCi0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDEwLCAiYmZkX3JlYWQgcmVtYWluaW5nICVkXG4iLCByZW1haW5pbmcpOwotI2VuZGlmCi0gICAgICBpZiAoYmZkX3JlYWQgKHZtc19idWYgKyB0ZXN0X2xlbiwgMSwgcmVtYWluaW5nLCBhYmZkKSAhPQotCSAgKGJmZF9zaXplX3R5cGUpIHJlbWFpbmluZykKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgUFJJVih2bXNfcmVjKSA9IHZtc19idWYgKyB0ZXN0X3N0YXJ0OwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDExLCAiYmZkX3JlYWQgcmVjX2xlbmd0aCAlZFxuIiwgUFJJVihyZWNfbGVuZ3RoKSk7Ci0jZW5kaWYKLQotICByZXR1cm4gUFJJVihyZWNfbGVuZ3RoKTsKLX0KLQotCi0vKiBnZXQgbmV4dCB2bXMgcmVjb3JkIGZyb20gZmlsZQotICAgdXBkYXRlIHZtc19yZWMgYW5kIHJlY19sZW5ndGggdG8gbmV3IChyZW1haW5pbmcpIHZhbHVlcyAgKi8KLQotaW50Ci1fYmZkX3Ztc19uZXh0X3JlY29yZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDgsICJfYmZkX3Ztc19uZXh0X3JlY29yZCAobGVuICVkLCBzaXplICVkKVxuIiwKLQkgICAgICBQUklWKHJlY19sZW5ndGgpLCBQUklWKHJlY19zaXplKSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA+IDApCi0gICAgewotICAgICAgUFJJVih2bXNfcmVjKSArPSBQUklWKHJlY19zaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoX2JmZF92bXNfZ2V0X3JlY29yZCAoYWJmZCkgPD0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChQUklWKGlzX3ZheCkpCi0gICAgewotICAgICAgUFJJVihyZWNfdHlwZSkgPSAqKFBSSVYodm1zX3JlYykpOwotICAgICAgUFJJVihyZWNfc2l6ZSkgPSBQUklWKHJlY19sZW5ndGgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCBQUklWKHZtc19yZWMpLCAmUFJJVihyZWNfdHlwZSksCi0JCQkJICAmUFJJVihyZWNfc2l6ZSkpOwotICAgIH0KLSAgUFJJVihyZWNfbGVuZ3RoKSAtPSBQUklWKHJlY19zaXplKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDgsICJfYmZkX3Ztc19uZXh0X3JlY29yZDogcmVjICVwLCBzaXplICVkLCBsZW5ndGggJWQsIHR5cGUgJWRcbiIsCi0JICAgICAgUFJJVih2bXNfcmVjKSwgUFJJVihyZWNfc2l6ZSksIFBSSVYocmVjX2xlbmd0aCksCi0JICAgICAgUFJJVihyZWNfdHlwZSkpOwotI2VuZGlmCi0KLSAgcmV0dXJuIFBSSVYocmVjX3R5cGUpOwotfQotCi0KLQwKLS8qIENvcHkgc2l6ZWQgc3RyaW5nIChzdHJpbmcgd2l0aCBmaXhlZCBsZW5ndGgpIHRvIG5ldyBhbGxvY2F0ZWQgYXJlYQotICAgc2l6ZSBpcyBzdHJpbmcgbGVuZ3RoIChzaXplIG9mIHJlY29yZCkgICovCi0KLWNoYXIgKgotX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHN0ciwgc2l6ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqc3RyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgY2hhciAqbmV3c3RyID0gYmZkX21hbGxvYyAoc2l6ZSArIDEpOwotCi0gIGlmIChuZXdzdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgc3RybmNweSAobmV3c3RyLCAoY2hhciAqKXN0ciwgc2l6ZSk7Ci0gIG5ld3N0cltzaXplXSA9IDA7Ci0KLSAgcmV0dXJuIG5ld3N0cjsKLX0KLQotLyogQ29weSBjb3VudGVkIHN0cmluZyAoc3RyaW5nIHdpdGggbGVuZ3RoIGF0IGZpcnN0IGJ5dGUpIHRvIG5ldyBhbGxvY2F0ZWQgYXJlYQotICAgcHRyIHBvaW50cyB0byBsZW5ndGggYnl0ZSBvbiBlbnRyeSAgKi8KLQotY2hhciAqCi1fYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgaW50IGxlbiA9ICpwdHIrKzsKLQotICByZXR1cm4gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgbGVuKTsKLX0KLQotDAotLyogc3RhY2sgcm91dGluZXMgZm9yIHZtcyBFVElSIGNvbW1hbmRzICovCi0KLS8qIFB1c2ggdmFsdWUgYW5kIHNlY3Rpb24gaW5kZXggICovCi0KLXZvaWQKLV9iZmRfdm1zX3B1c2ggKGFiZmQsIHZhbCwgcHNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdXF1YWQgdmFsOwotICAgICBpbnQgcHNlY3Q7Ci17Ci0gIHN0YXRpYyBpbnQgbGFzdF9wc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICI8cHVzaCAlMDE2bHgoJWQpIGF0ICVkPlxuIiwgdmFsLCBwc2VjdCwgUFJJVihzdGFja3B0cikpOwotI2VuZGlmCi0KLSAgaWYgKHBzZWN0ID49IDApCi0gICAgbGFzdF9wc2VjdCA9IHBzZWN0OwotCi0gIFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS52YWx1ZSA9IHZhbDsKLSAgUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0ID0gbGFzdF9wc2VjdDsKLSAgUFJJVihzdGFja3B0cikrKzsKLSAgaWYgKFBSSVYoc3RhY2twdHIpID49IFNUQUNLU0laRSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2sgb3ZlcmZsb3cgKCVkKSBpbiBfYmZkX3Ztc19wdXNoIiksIFBSSVYoc3RhY2twdHIpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFBvcCB2YWx1ZSBhbmQgc2VjdGlvbiBpbmRleCAgKi8KLQotdXF1YWQKLV9iZmRfdm1zX3BvcCAoYWJmZCwgcHNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50ICpwc2VjdDsKLXsKLSAgdXF1YWQgdmFsdWU7Ci0KLSAgaWYgKFBSSVYoc3RhY2twdHIpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrIHVuZGVyZmxvdyBpbiBfYmZkX3Ztc19wb3AiKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIFBSSVYoc3RhY2twdHIpLS07Ci0gIHZhbHVlID0gUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnZhbHVlOwotICBpZiAoKHBzZWN0ICE9IE5VTEwpICYmIChQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3QgPj0gMCkpCi0gICAgKnBzZWN0ID0gUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNCwgIjxwb3AgJTAxNmx4KCVkKT5cbiIsIHZhbHVlLCBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3QpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0MCi0vKiBvYmplY3QgZmlsZSBvdXRwdXQgZnVuY3Rpb25zICovCi0KLS8qIEdBUyB0ZW5kcyB0byB3cml0ZSBzZWN0aW9ucyBpbiBsaXR0bGUgY2h1bmtzIChiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpCi0gICB3aGljaCB3ZSBjYW4ndCB1c2UgZGlyZWN0bHkuIFNvIHdlIHNhdmUgdGhlIGxpdHRsZSBjaHVua3MgaW4gbGlua2VkCi0gICBsaXN0cyAob25lIHBlciBzZWN0aW9uKSBhbmQgd3JpdGUgdGhlbSBsYXRlci4gICovCi0KLS8qIEFkZCBhIG5ldyB2bXNfc2VjdGlvbiBzdHJ1Y3R1cmUgdG8gdm1zX3NlY3Rpb25fdGFibGUKLSAgIC0gZm9yd2FyZCBjaGFpbmluZyAtICAqLwotCi1zdGF0aWMgdm1zX3NlY3Rpb24gKgotYWRkX25ld19jb250ZW50cyAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci17Ci0gIHZtc19zZWN0aW9uICpzcHRyLCAqbmV3cHRyOwotCi0gIHNwdHIgPSBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtzZWN0aW9uLT5pbmRleF07Ci0gIGlmIChzcHRyICE9IE5VTEwpCi0gICAgcmV0dXJuIHNwdHI7Ci0KLSAgbmV3cHRyID0gKHZtc19zZWN0aW9uICopIGJmZF9tYWxsb2MgKHNpemVvZiAodm1zX3NlY3Rpb24pKTsKLSAgaWYgKG5ld3B0ciA9PSAodm1zX3NlY3Rpb24gKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3cHRyLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgKGludClzZWN0aW9uLT5fcmF3X3NpemUpOwotICBpZiAobmV3cHRyLT5jb250ZW50cyA9PSAodW5zaWduZWQgY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3B0ci0+b2Zmc2V0ID0gMDsKLSAgbmV3cHRyLT5zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotICBuZXdwdHItPm5leHQgPSAwOwotICBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtzZWN0aW9uLT5pbmRleF0gPSBuZXdwdHI7Ci0gIHJldHVybiBuZXdwdHI7Ci19Ci0KLQotLyogU2F2ZSBzZWN0aW9uIGRhdGEgJiBvZmZzZXQgdG8gYW4gdm1zX3NlY3Rpb24gc3RydWN0dXJlCi0gICB2bXNfc2VjdGlvbl90YWJsZVtdIGhvbGRzIHRoZSB2bXNfc2VjdGlvbiBjaGFpbiAgKi8KLQotYm9vbGVhbgotX2JmZF9zYXZlX3Ztc19zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBkYXRhLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgdm1zX3NlY3Rpb24gKnNwdHI7Ci0KLSAgaWYgKHNlY3Rpb24tPmluZGV4ID49IFZNU19TRUNUSU9OX0NPVU5UKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKGNvdW50ID09IChiZmRfc2l6ZV90eXBlKTApCi0gICAgcmV0dXJuIHRydWU7Ci0gIHNwdHIgPSBhZGRfbmV3X2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKHNwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1lbWNweSAoc3B0ci0+Y29udGVudHMgKyBvZmZzZXQsIGRhdGEsIChzaXplX3QpIGNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBHZXQgdm1zX3NlY3Rpb24gcG9pbnRlciB0byBzYXZlZCBjb250ZW50cyBmb3Igc2VjdGlvbiAjIGluZGV4ICAqLwotCi12bXNfc2VjdGlvbiAqCi1fYmZkX2dldF92bXNfc2VjdGlvbiAoYWJmZCwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGluZGV4OwotewotICBpZiAoaW5kZXggPj0gIFZNU19TRUNUSU9OX0NPVU5UKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaW5kZXhdOwotfQotCi0MCi0vKiBPYmplY3Qgb3V0cHV0IHJvdXRpbmVzICAqLwotCi0vKiBCZWdpbiBuZXcgcmVjb3JkIG9yIHJlY29yZCBoZWFkZXIKLSAgIHdyaXRlIDIgYnl0ZXMgcmVjdHlwZQotICAgd3JpdGUgMiBieXRlcyByZWNvcmQgbGVuZ3RoIChmaWxsZWQgaW4gYXQgZmx1c2gpCi0gICB3cml0ZSAyIGJ5dGVzIGhlYWRlciB0eXBlIChvbW1pdHRlZCBpZiByZWNoZWFkID09IC0xKSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCByZWN0eXBlLCByZWNoZWFkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCByZWN0eXBlOwotICAgICBpbnQgcmVjaGVhZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2JlZ2luKHR5cGUgJWQsIGhlYWQgJWQpXG4iLCByZWN0eXBlLAotCSAgICAgIHJlY2hlYWQpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLHJlY3R5cGUpOwotCi0gIC8qIHNhdmUgY3VycmVudCBvdXRwdXQgcG9zaXRpb24gdG8gZmlsbCBpbiBsZW5naHQgbGF0ZXIgICovCi0KLSAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPiAwKQotICAgIFBSSVYobGVuZ3RoX3BvcykgPSBQUklWKG91dHB1dF9zaXplKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYmVnaW46IGxlbmd0aF9wb3MgPSAlZFxuIiwKLQkgICAgICBQUklWKGxlbmd0aF9wb3MpKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwwKTsJCS8qIHBsYWNlaG9sZGVyIGZvciBsZW5ndGggKi8KLQotICBpZiAocmVjaGVhZCAhPSAtMSkKLSAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQscmVjaGVhZCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFNldCByZWNvcmQvc3VicmVjb3JkIGFsaWdubWVudCAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgYWxpZ250bykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYWxpZ250bzsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCglZClcbiIsIGFsaWdudG8pOwotI2VuZGlmCi0KLSAgUFJJVihvdXRwdXRfYWxpZ25tZW50KSA9IGFsaWdudG87Ci0gIHJldHVybjsKLX0KLQotCi0vKiBQcmVwYXJlIGZvciBzdWJyZWNvcmQgZmllbGRzICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJ2bXNfb3V0cHV0X3B1c2gocHVzaGVkX3NpemUgPSAlZClcbiIsIFBSSVYob3V0cHV0X3NpemUpKTsKLSNlbmRpZgotCi0gIFBSSVYocHVzaF9sZXZlbCkrKzsKLSAgUFJJVihwdXNoZWRfc2l6ZSkgPSBQUklWKG91dHB1dF9zaXplKTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIEVuZCBvZiBzdWJyZWNvcmQgZmllbGRzICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInZtc19vdXRwdXRfcG9wKHB1c2hlZF9zaXplID0gJWQpXG4iLCBQUklWKHB1c2hlZF9zaXplKSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotICBQUklWKGxlbmd0aF9wb3MpID0gMjsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJ2bXNfb3V0cHV0X3BvcDogbGVuZ3RoX3BvcyA9ICVkXG4iLCBQUklWKGxlbmd0aF9wb3MpKTsKLSNlbmRpZgotCi0gIFBSSVYocHVzaGVkX3NpemUpID0gMDsKLSAgUFJJVihwdXNoX2xldmVsKS0tOwotICByZXR1cm47Ci19Ci0KLQotLyogRmx1c2ggdW53cml0dGVuIG91dHB1dCwgZW5kcyBjdXJyZW50IHJlY29yZCAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCByZWFsX3NpemUgPSBQUklWKG91dHB1dF9zaXplKTsKLSAgaW50IGFsaWduY291bnQ7Ci0gIGludCBsZW5ndGg7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2ZsdXNoKHJlYWxfc2l6ZSA9ICVkLCBwdXNoZWRfc2l6ZSAlZCBhdCBsZW5wb3MgJWQpXG4iLAotCSAgICAgIHJlYWxfc2l6ZSwgUFJJVihwdXNoZWRfc2l6ZSksIFBSSVYobGVuZ3RoX3BvcykpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPiAwKQotICAgIGxlbmd0aCA9IHJlYWxfc2l6ZSAtIFBSSVYocHVzaGVkX3NpemUpOwotICBlbHNlCi0gICAgbGVuZ3RoID0gcmVhbF9zaXplOwotCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICByZXR1cm47Ci0gIGFsaWduY291bnQgPSAoUFJJVihvdXRwdXRfYWxpZ25tZW50KQotCQktIChsZW5ndGggJSBQUklWKG91dHB1dF9hbGlnbm1lbnQpKSkgJSBQUklWKG91dHB1dF9hbGlnbm1lbnQpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgImFsaWduOiBhZGRpbmcgJWQgYnl0ZXNcbiIsIGFsaWduY291bnQpOwotI2VuZGlmCi0KLSAgd2hpbGUoYWxpZ25jb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICBQUklWKG91dHB1dF9idWYpW3JlYWxfc2l6ZSsrXSA9IDA7Ci0jaWYgMAotICAgICAgLyogdGhpcyBpcyB3aHkgSSAqbG92ZSogdm1zOiBpbmNvbnNpc3RlbmN5IDotfQotCSBhbGlnbm1lbnQgaXMgYWRkZWQgdG8gdGhlIHN1YnJlY29yZCBsZW5ndGgKLQkgYnV0IG5vdCB0byB0aGUgcmVjb3JkIGxlbmd0aCAgKi8KLSAgICAgIGlmIChQUklWKHB1c2hfbGV2ZWwpID4gMCkKLSNlbmRpZgotCWxlbmd0aCsrOwotICAgIH0KLQotICAvKiBwdXQgbGVuZ3RoIHRvIGJ1ZmZlciAgKi8KLSAgUFJJVihvdXRwdXRfc2l6ZSkgPSBQUklWKGxlbmd0aF9wb3MpOwotICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsICh1bnNpZ25lZCBpbnQpbGVuZ3RoKTsKLQotICBpZiAoUFJJVihwdXNoX2xldmVsKSA9PSAwKQotICAgIHsKLSNpZm5kZWYgVk1TCi0JLyogd3JpdGUgbGVuZ3RoIGZpcnN0LCBzZWUgRkZfRk9SRUlHTiBpbiB0aGUgaW5wdXQgcm91dGluZXMgKi8KLSAgICAgIGZ3cml0ZSAoUFJJVihvdXRwdXRfYnVmKSsyLCAyLCAxLCAoRklMRSAqKWFiZmQtPmlvc3RyZWFtKTsKLSNlbmRpZgotICAgICAgZndyaXRlIChQUklWKG91dHB1dF9idWYpLCByZWFsX3NpemUsIDEsIChGSUxFICopYWJmZC0+aW9zdHJlYW0pOwotCi0gICAgICBQUklWKG91dHB1dF9zaXplKSA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgUFJJVihvdXRwdXRfc2l6ZSkgPSByZWFsX3NpemU7Ci0gICAgICBQUklWKHB1c2hlZF9zaXplKSA9IFBSSVYob3V0cHV0X3NpemUpOwotICAgIH0KLQotICByZXR1cm47Ci19Ci0KLQotLyogRW5kIHJlY29yZCBvdXRwdXQgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2VuZFxuIik7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBjaGVjayByZW1haW5pbmcgYnVmZmVyIHNpemUKLQotICAgcmV0dXJuIHdoYXQncyBsZWZ0LiAgKi8KLQotaW50Ci1fYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIHNpemUpCi0gICAgYmZkICphYmZkOwotICAgIGludCBzaXplOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfY2hlY2soJWQpXG4iLCBzaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiAoTUFYX09VVFJFQ19TSVpFIC0gKFBSSVYob3V0cHV0X3NpemUpICsgc2l6ZSArIE1JTl9PVVRSRUNfTFVGVCkpOwotfQotCi0KLS8qIE91dHB1dCBieXRlICg4IGJpdCkgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9ieXRlKCUwMngpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gMTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBzaG9ydCAoMTYgYml0KSB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9zaG9ydCAoJTA0eClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIHZhbHVlICYgMHhmZmZmLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOwotICBQUklWKG91dHB1dF9zaXplKSArPSAyOwotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IGxvbmcgKDMyIGJpdCkgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfbG9uZyAoJTA4bHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gNDsKLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBxdWFkICg2NCBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdXF1YWQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9xdWFkKCUwMTZseClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGJmZF9wdXRfNjQoYWJmZCwgdmFsdWUsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDg7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgYy1zdHJpbmcgYXMgY291bnRlZCBzdHJpbmcgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICp2YWx1ZTsKLXsKLWludCBsZW47Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQoJXMpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBsZW4gPSBzdHJsZW4gKHZhbHVlKTsKLSAgaWYgKGxlbiA9PSAwKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggemVybyBieXRlcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChsZW4gPiAyNTUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB0b28gbWFueSBieXRlcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCBsZW4gJiAweGZmKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopdmFsdWUsIGxlbik7Ci19Ci0KLQotLyogT3V0cHV0IGNoYXJhY3RlciBhcmVhICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgZGF0YSwgbGVuZ3RoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9kdW1wKCVkKVxuIiwgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgbWVtY3B5IChQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSksIGRhdGEsIGxlbmd0aCk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IGxlbmd0aDsKLQotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IGNvdW50IGJ5dGVzIG9mIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfZmlsbCAoYWJmZCwgdmFsdWUsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgaW50IGNvdW50OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZmlsbCh2YWwgJTAyeCB0aW1lcyAlZClcbiIsIHZhbHVlLCBjb3VudCk7Ci0jZW5kaWYKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm47Ci0gIG1lbXNldCAoUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpLCB2YWx1ZSwgY291bnQpOwotICBQUklWKG91dHB1dF9zaXplKSArPSBjb3VudDsKLQotICByZXR1cm47Ci19Ci0KLS8qIHRoaXMgaGFzaCByb3V0aW5lIGJvcnJvd2VkIGZyb20gR05VLUVNQUNTLCBhbmQgc3RyZW5ndGhlbmVkIHNsaWdodGx5ICBFUlkqLwotCi1zdGF0aWMgaW50Ci1oYXNoX3N0cmluZyAocHRyKQotICAgICBjb25zdCBjaGFyICpwdHI7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSBwdHI7Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCA9IHAgKyBzdHJsZW4gKHB0cik7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgYzsKLSAgcmVnaXN0ZXIgaW50IGhhc2ggPSAwOwotCi0gIHdoaWxlIChwICE9IGVuZCkKLSAgICB7Ci0gICAgICBjID0gKnArKzsKLSAgICAgIGhhc2ggPSAoKGhhc2ggPDwgMykgKyAoaGFzaCA8PCAxNSkgKyAoaGFzaCA+PiAyOCkgKyBjKTsKLSAgICB9Ci0gIHJldHVybiBoYXNoOwotfQotCi0vKiBHZW5lcmF0ZSBhIGxlbmd0aC1oYXNoZWQgVk1TIHN5bWJvbCBuYW1lIChsaW1pdGVkIHRvIG1heGxlbiBjaGFycykuICAqLwotCi1jaGFyICoKLV9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgaW4sIG1heGxlbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICppbjsKLSAgICAgaW50IG1heGxlbjsKLXsKLSAgbG9uZyBpbnQgcmVzdWx0OwotICBpbnQgaW5fbGVuOwotICBjaGFyICpuZXdfbmFtZTsKLSAgY29uc3QgY2hhciAqb2xkX25hbWU7Ci0gIGludCBpOwotICBzdGF0aWMgY2hhciBvdXRidWZbRU9CSl9TX0NfU1lNU0laKzFdOwotICBjaGFyICpvdXQgPSBvdXRidWY7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDQsICJfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgXCIlc1wiXG4iLCBpbik7Ci0jZW5kaWYKLQotICBpZiAobWF4bGVuID4gRU9CSl9TX0NfU1lNU0laKQotICAgIG1heGxlbiA9IEVPQkpfU19DX1NZTVNJWjsKLQotICBuZXdfbmFtZSA9IG91dDsJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIuICAqLwotCi0gIC8qIFdlIG1heSBuZWVkIHRvIHRydW5jYXRlIHRoZSBzeW1ib2wsIHNhdmUgdGhlIGhhc2ggZm9yIGxhdGVyLiAgKi8KLQotICBpbl9sZW4gPSBzdHJsZW4gKGluKTsKLQotICByZXN1bHQgPSAoaW5fbGVuID4gbWF4bGVuKSA/IGhhc2hfc3RyaW5nIChpbikgOiAwOwotCi0gIG9sZF9uYW1lID0gaW47Ci0KLSAgLyogRG8gdGhlIGxlbmd0aCBjaGVja2luZy4gICovCi0KLSAgaWYgKGluX2xlbiA8PSBtYXhsZW4pCi0gICAgewotICAgICAgaSA9IGluX2xlbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykpCi0JaSA9IG1heGxlbi05OwotICAgICAgZWxzZQotCWkgPSBtYXhsZW47Ci0gICAgfQotCi0gIHN0cm5jcHkgKG91dCwgaW4sIGkpOwotICBpbiArPSBpOwotICBvdXQgKz0gaTsKLQotICBpZiAoKGluX2xlbiA+IG1heGxlbikKLSAgICAgICYmIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpKQotICAgIHNwcmludGYgKG91dCwgIl8lMDhseCIsIHJlc3VsdCk7Ci0gIGVsc2UKLSAgICAqb3V0ID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoNCwgIi0tPiBbJWRdXCIlc1wiXG4iLCBzdHJsZW4gKG91dGJ1ZiksIG91dGJ1Zik7Ci0jZW5kaWYKLQotICBpZiAoaW5fbGVuID4gbWF4bGVuCi0JJiYgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQkmJiBQUklWKGZsYWdfc2hvd19hZnRlcl90cnVuYykpCi0gICAgcHJpbnRmIChfKCJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIpLCBvbGRfbmFtZSwgbmV3X25hbWUpOwotCi0gIHJldHVybiBvdXRidWY7Ci19Ci0KLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgc3ltYm9sLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotbmV3X3N5bWJvbCAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBhc3ltYm9sICpzeW1ib2w7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDcsICAibmV3X3N5bWJvbCAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLQotICBzeW1ib2wgPSBfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzeW1ib2wgPT0gMCkKLSAgICByZXR1cm4gc3ltYm9sOwotICBzeW1ib2wtPm5hbWUgPSBuYW1lOwotICBzeW1ib2wtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSk7Ci0KLSAgcmV0dXJuIHN5bWJvbDsKLX0KLQotCi0vKiBBbGxvY2F0ZSBhbmQgZW50ZXIgYSBuZXcgcHJpdmF0ZSBzeW1ib2wuICAqLwotCi12bXNfc3ltYm9sX2VudHJ5ICoKLV9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgICJfYmZkX3Ztc19lbnRlcl9zeW1ib2wgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0KLSAgZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCSAgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotICBpZiAoZW50cnkgPT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoOCwgICJjcmVhdGluZyBoYXNoIGVudHJ5IGZvciAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICAgIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmIChlbnRyeSAhPSAwKQotCXsKLQkgIGFzeW1ib2wgKnN5bWJvbDsKLQkgIHN5bWJvbCA9IG5ld19zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKHN5bWJvbCAhPSAwKQotCSAgICB7Ci0JICAgICAgZW50cnktPnN5bWJvbCA9IHN5bWJvbDsKLQkgICAgICBQUklWKGdzZF9zeW1fY291bnQpKys7Ci0JICAgICAgYWJmZC0+c3ltY291bnQrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBlbnRyeSA9IDA7Ci0JfQotICAgICAgZWxzZQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiZmFpbGVkIHRvIGVudGVyICVzIiksIG5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICg4LCAgImZvdW5kIGhhc2ggZW50cnkgZm9yICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNywgIi0+IGVudHJ5ICVwLCBlbnRyeS0+c3ltYm9sICVwXG4iLCBlbnRyeSwgZW50cnktPnN5bWJvbCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGVudHJ5OwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy10aXIuYyBiL2JmZC92bXMtdGlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNGIxYjMuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy10aXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI0ODcgKzAsMCBAQAotLyogdm1zLXRpci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUSVIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgRVRJUiByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0KLSAgIGdvIGFuZCByZWFkIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgKGVzcC4gYXBwZW5kaXggQikKLSAgIGlmIHlvdSBkb24ndCBrbm93IHdoYXQncyBnb2luZyBvbiBoZXJlIDotKQotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhlIGZvbGxvd2luZyB0eXBlIGFiYnJldmlhdGlvbnMgYXJlIHVzZWQ6Ci0KLQljcwljb3VudGVkIHN0cmluZyAoYXNjaWkgc3RyaW5nIHdpdGggbGVuZ3RoIGJ5dGUpCi0JYnkJYnl0ZSAoMSBieXRlKQotCXNoCXNob3J0ICgyIGJ5dGUsIDE2IGJpdCkKLQlsdwlsb25nd29yZCAoNCBieXRlLCAzMiBiaXQpCi0JcXcJcXVhZHdvcmQgKDggYnl0ZSwgNjQgYml0KQotCWRhCWRhdGEgc3RyZWFtICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi1zdGF0aWMgdm9pZCBpbWFnZV9zZXRfcHRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHBzZWN0LCB1cXVhZCBvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIGltYWdlX2luY19wdHIgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCBvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIGltYWdlX2R1bXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV93cml0ZV9iIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV93cml0ZV93IFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV93cml0ZV9sIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfcSBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbHVlKSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50Ci1jaGVja19zZWN0aW9uIChhYmZkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IFBSSVYoaW1hZ2VfcHRyKSAtIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzOwotICBpZiAoKGJmZF9zaXplX3R5cGUpIChvZmZzZXQgKyBzaXplKSA+IFBSSVYoaW1hZ2Vfc2VjdGlvbiktPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyA9IGJmZF9yZWFsbG9jIChQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cywgb2Zmc2V0ICsgc2l6ZSk7Ci0gICAgICBpZiAoUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMgPT0gMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk5vIE1lbSAhIikpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPl9yYXdfc2l6ZSA9IG9mZnNldCArIHNpemU7Ci0gICAgICBQUklWKGltYWdlX3B0cikgPSBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyArIG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHJvdXRpbmVzIHRvIGZpbGwgc2VjdGlvbnMgY29udGVudHMgZHVyaW5nIHRpci9ldGlyIHJlYWQgKi8KLQotLyogSW5pdGlhbGl6ZSBpbWFnZSBidWZmZXIgcG9pbnRlciB0byBiZSBmaWxsZWQgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgb2Zmc2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBwc2VjdDsKLSAgICAgdXF1YWQgb2Zmc2V0OwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImltYWdlX3NldF9wdHIgKCVkPSVzLCAlZClcbiIsCi0JCXBzZWN0LCBQUklWKHNlY3Rpb25zKVtwc2VjdF0tPm5hbWUsIG9mZnNldCk7Ci0jZW5kaWYKLQotICBQUklWKGltYWdlX3B0cikgPSBQUklWKHNlY3Rpb25zKVtwc2VjdF0tPmNvbnRlbnRzICsgb2Zmc2V0OwotICBQUklWKGltYWdlX3NlY3Rpb24pID0gUFJJVihzZWN0aW9ucylbcHNlY3RdOwotICByZXR1cm47Ci19Ci0KLQotLyogSW5jcmVtZW50IGltYWdlIGJ1ZmZlciBwb2ludGVyIGJ5IG9mZnNldCAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX2luY19wdHIgKGFiZmQsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICB1cXVhZCBvZmZzZXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAiaW1hZ2VfaW5jX3B0ciAoJWQpXG4iLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgUFJJVihpbWFnZV9wdHIpICs9IG9mZnNldDsKLQotICByZXR1cm47Ci19Ci0KLQotLyogRHVtcCBtdWx0aXBsZSBieXRlcyB0byBzZWN0aW9uIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBzaXplLCBvZmZzZXQpCi0gICAgYmZkICphYmZkOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICBpbnQgc2l6ZTsKLSAgICBpbnQgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg4LCAiaW1hZ2VfZHVtcCBmcm9tICglcCwgJWQpIHRvICglcClcbiIsIHB0ciwgc2l6ZSwgUFJJVihpbWFnZV9wdHIpKTsKLSAgX2JmZF9oZXhkdW1wICg5LCBwdHIsIHNpemUsIG9mZnNldCk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIHNpemUpKQotICAgIHJldHVybjsKLQotICB3aGlsZSAoc2l6ZS0tID4gMCkKLSAgICAqUFJJVihpbWFnZV9wdHIpKysgPSAqcHRyKys7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSBieXRlIHRvIHNlY3Rpb24gaW1hZ2UgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV93cml0ZV9iIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfYiglMDJ4KVxuIiwgKGludCl2YWx1ZSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIDEpKQotICAgIHJldHVybjsKLQotICAqUFJJVihpbWFnZV9wdHIpKysgPSAodmFsdWUgJiAweGZmKTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIFdyaXRlIDItYnl0ZSB3b3JkIHRvIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX3coJTA0eClcbiIsIChpbnQpdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCAyKSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGwxNiAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSAyOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSA0LWJ5dGUgbG9uZyB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX2wgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfbCAoJTA4bHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIDQpKQotICAgIHJldHVybjsKLQotICBiZmRfcHV0bDMyICh2YWx1ZSwgUFJJVihpbWFnZV9wdHIpKTsKLSAgUFJJVihpbWFnZV9wdHIpICs9IDQ7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFdyaXRlIDgtYnl0ZSBxdWFkIHRvIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdXF1YWQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfcSAoJTAxNmx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCA4KSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGw2NCAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSA4OwotCi0gIHJldHVybjsKLX0KLQwKLQotI2RlZmluZSBISUdIQklUKG9wKSAoKG9wICYgMHg4MDAwMDAwMEwpID09IDB4ODAwMDAwMDBMKQotCi0vKiBldGlyX3N0YQotICAKLSAgIHZtcyBzdGFjayBjb21tYW5kcwotICAKLSAgIGhhbmRsZSBzdGFfeHh4IGNvbW1hbmRzIGluIGV0aXIgc2VjdGlvbgotICAgcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gIAotICAgc2VlIHRhYmxlIEItOCBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9zdGEgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RhICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogc3RhY2sgKi8KLQotICAgICAgLyogc3RhY2sgZ2xvYmFsCi0JICAgYXJnOiBjcwlzeW1ib2wgbmFtZQotCi0JICAgc3RhY2sgMzIgYml0IHZhbHVlIG9mIHN5bWJvbCAoaGlnaCBiaXRzIHNldCB0byAwKSAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfR0JMOgotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopCi0JCSAgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgewotI2lmIFZNU19ERUJVRwotCSAgICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiRVRJUl9TX0NfU1RBX0dCTDogbm8gc3ltYm9sIFwiJXNcIlxuIiwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpMCwgLTEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSwgLTEpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBsb25nd29yZAotCSAgIGFyZzogbHcJdmFsdWUKLQotCSAgIHN0YWNrIDMyIGJpdCB2YWx1ZSwgc2lnbiBleHRlbmQgdG8gNjQgYml0ICAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9MVzoKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpYmZkX2dldGwzMiAocHRyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBnbG9iYWwKLQkgICBhcmc6IHF3CXZhbHVlCi0KLQkgICBzdGFjayA2NCBiaXQgdmFsdWUgb2Ygc3ltYm9sCSAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9RVzoKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpYmZkX2dldGw2NChwdHIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotCS8qIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyBxdWFkd29yZCBvZmZzZXQKLQkgICBhcmc6IGx3CXNlY3Rpb24gaW5kZXgKLQkgIAlxdwlzaWduZWQgcXVhZHdvcmQgb2Zmc2V0IChsb3cgMzIgYml0cykKLQotCSAgIHN0YWNrIHF3IGFyZ3VtZW50IGFuZCBzZWN0aW9uIGluZGV4Ci0JICAgKHNlZSBFVElSX1NfQ19TVE9fT0ZGLCBFVElSX1NfQ19DVExfU0VUUkIpICAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9QUToKLSAgCXsKLQkgIHVxdWFkIGR1bW15OwotCSAgdW5zaWduZWQgaW50IHBzZWN0OwotCi0JICBwc2VjdCA9IGJmZF9nZXRsMzIgKHB0cik7Ci0JICBpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiQmFkIHNlY3Rpb24gaW5kZXggaW4gRVRJUl9TX0NfU1RBX1BRIikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZHVtbXkgPSBiZmRfZ2V0bDY0IChwdHIrNCk7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotCS8qIGFsbCBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9MSToKLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX01PRDoKLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX0NLQVJHOgotCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbnN1cHBvcnRlZCBTVEEgY21kICVkIiksIGNtZCk7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVEEgY21kICVkIiksIGNtZCk7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RhIHRydWVcbiIpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi0gICBldGlyX3N0bwotICAKLSAgIHZtcyBzdG9yZSBjb21tYW5kcwotICAKLSAgIGhhbmRsZSBzdG9feHh4IGNvbW1hbmRzIGluIGV0aXIgc2VjdGlvbgotICAgcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gIAotICAgc2VlIHRhYmxlIEItOSBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9zdG8gKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgdXF1YWQgZHVtbXk7Ci0gIGludCBwc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RvICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotCi0gICAgICAvKiBzdG9yZSBieXRlOiBwb3Agc3RhY2ssIHdyaXRlIGJ5dGUKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fQjoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotI2lmIDAKLSAgICAgIGlmIChpc19zaGFyZSkJCS8qIEZJWE1FICovCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRVRJUl9TX0NfU1RPX0I6IGJ5dGUgZml4dXBzIG5vdCBzdXBwb3J0ZWQiKTsKLSNlbmRpZgotICAgICAgaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgd29yZDogcG9wIHN0YWNrLCB3cml0ZSB3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1c6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSNpZiAwCi0gICAgICBpZiAoaXNfc2hhcmUpCQkvKiBGSVhNRSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUT19COiB3b3JkIGZpeHVwcyBub3Qgc3VwcG9ydGVkIik7Ci0jZW5kaWYKLSAgICAgIGltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgbG9uZ3dvcmQ6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fTFc6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0gICAgICBpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIHF1YWR3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIHF1YWR3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1FXOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotICAgICAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgZHVtbXkpOwkJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgaW1tZWRpYXRlIHJlcGVhdGVkOiBwb3Agc3RhY2sgZm9yIHJlcGVhdCBjb3VudAotCSBhcmc6IGx3CWJ5dGUgY291bnQKLQkgZGEJZGF0YSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0lNTVI6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCi0Jc2l6ZSA9IGJmZF9nZXRsMzIgKHB0cik7Ci0JZHVtbXkgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCXdoaWxlIChkdW1teS0tID4gMEwpCi0JICBpbWFnZV9kdW1wIChhYmZkLCBwdHIrNCwgc2l6ZSwgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgZ2xvYmFsOiB3cml0ZSBzeW1ib2wgdmFsdWUKLQkgYXJnOiBjcwlnbG9iYWwgc3ltYm9sIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19HQkw6Ci0gICAgICB7Ci0Jdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0JY2hhciAqbmFtZTsKLQotCW5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCWVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fR0JMOiBubyBzeW1ib2wgXCIlc1wiIiksCi0JCQkJICAgbmFtZSk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQllbHNlCi0JICBpbWFnZV93cml0ZV9xIChhYmZkLCAodXF1YWQpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSk7CS8qIEZJWE1FLCByZWxvYyAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGNvZGUgYWRkcmVzczogd3JpdGUgYWRkcmVzcyBvZiBlbnRyeSBwb2ludAotCSBhcmc6IGNzCWdsb2JhbCBzeW1ib2wgbmFtZSAocHJvY2VkdXJlKSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0NBOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQlpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgewotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19DQTogbm8gc3ltYm9sIFwiJXNcIiIpLAotCQkJCSAgIG5hbWUpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fUkI6Ci0gICAgY2FzZSBFVElSX1NfQ19TVE9fQUI6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19SQi9BQjogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogc3RvcmUgb2Zmc2V0IHRvIHBzZWN0OiBwb3Agc3RhY2ssIGFkZCBsb3cgMzIgYml0cyB0byBiYXNlIG9mIHBzZWN0Ci0gICAgICAgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fT0ZGOgotICAgICAgewotCXVxdWFkIHE7Ci0JaW50IHBzZWN0OwotCi0JcSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlxICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgcSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgaW1tZWRpYXRlCi0JIGFyZzogbHcJY291bnQgb2YgYnl0ZXMKLQkgZGEJZGF0YSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0lNTToKLSAgICAgIHsKLQlpbnQgc2l6ZTsKLQotCXNpemUgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWltYWdlX2R1bXAgKGFiZmQsIHB0cis0LCBzaXplLCAwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiB0aGlzIGNvZGUgaXMgJ3Jlc2VydmVkIHRvIGRpZ2l0YWwnIGFjY29yZGluZyB0byB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsLAotCSBob3dldmVyIGl0IGlzIGdlbmVyYXRlZCBieSB0aGUgREVDIEMgY29tcGlsZXIgYW5kIGRlZmluZWQgaW4gdGhlIGluY2x1ZGUgZmlsZS4KLQkgRklYTUUsIHNpbmNlIHRoZSBmb2xsb3dpbmcgaXMganVzdCBhIGd1ZXNzCi0JIHN0b3JlIGdsb2JhbCBsb25nd29yZDogc3RvcmUgMzJiaXQgdmFsdWUgb2Ygc3ltYm9sCi0JIGFyZzogY3MJc3ltYm9sIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19HQkxfTFc6Ci0gICAgICB7Ci0Jdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0JY2hhciAqbmFtZTsKLQotCW5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCWVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLSNpZiBWTVNfREVCVUcKLQkgICAgX2JmZF92bXNfZGVidWcgKDMsICJFVElSX1NfQ19TVE9fR0JMX0xXOiBubyBzeW1ib2wgXCIlc1wiXG4iLCBuYW1lKTsKLSNlbmRpZgotCSAgICBpbWFnZV93cml0ZV9sIChhYmZkLCAodW5zaWduZWQgbG9uZykwKTsJLyogRklYTUUsIHJlbG9jICovCi0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSk7CS8qIEZJWE1FLCByZWxvYyAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19MUF9QU0I6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19MUF9QU0I6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19ISU5UX0dCTDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0hJTlRfR0JMOiBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19ISU5UX1BTOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fSElOVF9QUzogbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVE8gY21kICVkIiksIGNtZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIHN0YWNrIG9wZXJhdG9yIGNvbW1hbmRzCi0gICBhbGwgMzIgYml0IHNpZ25lZCBhcml0aG1ldGljCi0gICBhbGwgd29yZCBqdXN0IGxpa2UgYSBzdGFjayBjYWxjdWxhdG9yCi0gICBhcmd1bWVudHMgYXJlIHBvcHBlZCBmcm9tIHN0YWNrLCByZXN1bHRzIGFyZSBwdXNoZWQgb24gc3RhY2sKLSAgCi0gICBzZWUgdGFibGUgQi0xMCBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9vcHIgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0ciBBVFRSSUJVVEVfVU5VU0VEOwotewotICBsb25nIG9wMSwgb3AyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAiZXRpcl9vcHIgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGNtZCkKLSAgICB7Ci0gICAgICAvKiBvcGVyYXRpb24gKi8KLQotICAgICAgLyogbm8tb3AgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9OT1A6Ci0gICAgICBicmVhazsKLQotICAgICAgLyogYWRkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfQUREOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSArIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdWJ0cmFjdCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1NVQjoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDIgLSBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbXVsdGlwbHkgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9NVUw6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxICogb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGRpdmlkZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0RJVjoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgaWYgKG9wMiA9PSAwKQotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkwTCwgLTEpOwotICAgICAgZWxzZQotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AyIC8gb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGxvZ2ljYWwgYW5kICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfQU5EOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSAmIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBsb2dpY2FsIGluY2x1c2l2ZSBvcgkgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0lPUjoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgfCBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbG9naWNhbCBleGNsdXNpdmUgb3IgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9FT1I6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxIF4gb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIG5lZ2F0ZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX05FRzoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKC1vcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogY29tcGxlbWVudCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0NPTToKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSBeIC0xTCksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBpbnNlcnQgZmllbGQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9JTlNWOgotICAgICAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX0lOU1Y6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIGFyaXRobWV0aWMgc2hpZnQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9BU0g6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIGlmIChvcDIgPCAwKQkJLyogc2hpZnQgcmlnaHQgKi8KLQlvcDEgPj49IC1vcDI7Ci0gICAgICBlbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCW9wMSA8PD0gb3AyOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKW9wMSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHVuc2lnbmVkIHNoaWZ0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfVVNIOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfVVNIOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHJvdGF0ZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1JPVDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX1JPVDogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzZWxlY3QgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9TRUw6Ci0gICAgICBpZiAoKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKSAmIDB4MDFMKQotCSh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBlbHNlCi0JewotCSAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpb3AxLCAtMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHJlZGVmaW5lIHN5bWJvbCB0byBjdXJyZW50IGxvY2F0aW9uICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfUkVERUY6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9SRURFRjogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBkZWZpbmUgYSBsaXRlcmFsICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfREZMSVQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9ERkxJVDogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgT1BSIGNtZCAlZCIpLCBjbWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIGNvbnRyb2wgY29tbWFuZHMKLSAgCi0gICBzZWUgdGFibGUgQi0xMSBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9jdGwgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgdXF1YWQJIGR1bW15OwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX2N0bCAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIHNldCByZWxvY2F0aW9uIGJhc2U6IHBvcCBzdGFjaywgc2V0IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfU0VUUkI6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIGltYWdlX3NldF9wdHIgKGFiZmQsIHBzZWN0LCBkdW1teSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogYXVnbWVudCByZWxvY2F0aW9uIGJhc2U6IGluY3JlbWVudCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyIGJ5IG9mZnNldAotCSBhcmc6IGx3CW9mZnNldCB2YWx1ZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX0FVR1JCOgotICAgICAgZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOwotICAgICAgaW1hZ2VfaW5jX3B0ciAoYWJmZCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGRlZmluZSBsb2NhdGlvbjogcG9wIGluZGV4LCBzYXZlIGxvY2F0aW9uIGNvdW50ZXIgdW5kZXIgaW5kZXgKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfREZMT0M6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHNldCBsb2NhdGlvbjogcG9wIGluZGV4LCByZXN0b3JlIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9TVExPQzoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgLyogRklYTUUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdGFjayBkZWZpbmVkIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHB1c2ggbG9jYXRpb24gY291bnRlciBmcm9tIGluZGV4Ci0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX1NUS0RMOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBDVEwgY21kICVkIiksIGNtZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIHN0b3JlIGNvbmRpdGlvbmFsIGNvbW1hbmRzCi0gIAotICAgc2VlIHRhYmxlIEItMTIgYW5kIEItMTMgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RjIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RjICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogMjAwIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpcgotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTFA6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19MUDogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDEgU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZQotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgY3MJcHJvY2VkdXJlIG5hbWUKLQkgYnkJc2lnbmF0dXJlIGxlbmd0aAotCSBkYQlzaWduYXR1cmUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19MUF9QU0I6Ci0gICAgICBpbWFnZV9pbmNfcHRyIChhYmZkLCAxNik7CS8qIHNraXAgZW50cnkscHJvY3ZhbCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIDIwMiBTdG9yZS1jb25kaXRpb25hbCBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBjcwlnbG9iYWwgbmFtZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0dCTDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0dCTDogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDMgU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBjcwlwcm9jZWR1cmUgbmFtZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0dDQToKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0dDQTogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDQgU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBwc2VjdCArIG9mZnNldAotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgbHcJcHNlY3QgaW5kZXgKLQkgcXcJb2Zmc2V0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfUFM6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19QUzogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDUgU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IGFkZHJlc3Mgb2YgZ2xvYmFsCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OT1BfR0JMOgotCi0gICAgICAvKiAyMDYgU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX05PUF9QUzoKLQotICAgICAgLyogMjA3IFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQlNSX0dCTDoKLQotICAgICAgLyogMjA4IFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBwZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CU1JfUFM6Ci0KLSAgICAgIC8qIDIwOSBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xEQV9HQkw6Ci0KLSAgICAgIC8qIDIxMCBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgcHNlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xEQV9QUzoKLQotICAgICAgLyogMjExIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBvciBIaW50IGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CT0hfR0JMOgotCi0gICAgICAvKiAyMTIgU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQk9IX1BTOgotCi0gICAgICAvKiAyMTMgU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OQkhfR0JMOgotCi0gICAgICAvKiAyMTQgU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IHBzZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OQkhfUFM6Ci0vKiBGSVhNRSAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRVRJUl9TX0NfU1RDX3h4OiAoJWQpIG5vdCBzdXBwb3J0ZWQiLCBjbWQpOyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDMsICAiUmVzZXJ2ZWQgU1RDIGNtZCAlZCIsIGNtZCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGFzZWN0aW9uICoKLW5ld19zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgaWR4OwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgY2hhciBzbmFtZVsxNl07Ci0gIGNoYXIgKm5hbWU7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICAibmV3X3NlY3Rpb24gJWRcbiIsIGlkeCk7Ci0jZW5kaWYKLSAgc3ByaW50ZiAoc25hbWUsIFNFQ1RJT05fTkFNRV9URU1QTEFURSwgaWR4KTsKLQotICBuYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzbmFtZSkgKyAxKTsKLSAgaWYgKG5hbWUgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgc3RyY3B5IChuYW1lLCBzbmFtZSk7Ci0KLSAgc2VjdGlvbiA9IGJmZF9tYWxsb2MgKHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKHNlY3Rpb24gPT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoNiwgICJiZmRfbWFrZV9zZWN0aW9uICglcykgZmFpbGVkIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzZWN0aW9uLT5fcmF3X3NpemUgPSAwOwotICBzZWN0aW9uLT52bWEgPSAwOwotICBzZWN0aW9uLT5jb250ZW50cyA9IDA7Ci0gIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IDA7Ci0gIHNlY3Rpb24tPm5hbWUgPSBuYW1lOwotICBzZWN0aW9uLT5pbmRleCA9IGlkeDsKLQotICByZXR1cm4gc2VjdGlvbjsKLX0KLQotCi1zdGF0aWMgaW50Ci1hbGxvY19zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGlkeDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICAiYWxsb2Nfc2VjdGlvbiAlZFxuIiwgaWR4KTsKLSNlbmRpZgotCi0gIFBSSVYoc2VjdGlvbnMpID0gKChhc2VjdGlvbiAqKikKLQkJICAgIGJmZF9yZWFsbG9jIChQUklWKHNlY3Rpb25zKSwgKGlkeCsxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKFBSSVYoc2VjdGlvbnMpID09IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHdoaWxlIChQUklWKHNlY3Rpb25fY291bnQpIDw9IGlkeCkKLSAgICB7Ci0gICAgICBQUklWKHNlY3Rpb25zKVtQUklWKHNlY3Rpb25fY291bnQpXSA9IG5ld19zZWN0aW9uIChhYmZkLCBQUklWKHNlY3Rpb25fY291bnQpKTsKLSAgICAgIGlmIChQUklWKHNlY3Rpb25zKVtQUklWKHNlY3Rpb25fY291bnQpXSA9PSAwKQotCXJldHVybiAtMTsKLSAgICAgIFBSSVYoc2VjdGlvbl9jb3VudCkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIHRpcl9zdGEKLSAqCi0gKiB2YXggc3RhY2sgY29tbWFuZHMKLSAqCi0gKiBoYW5kbGUgc3RhX3h4eCBjb21tYW5kcyBpbiB0aXIgc2VjdGlvbgotICogcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gKgotICogc2VlIHRhYmxlIDctMyBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX3N0YSAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIGludCBjbWQgPSAqcHRyKys7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfc3RhICVkXG4iLCBjbWQpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAvKiBzdGFjayAqLwotICAgICAgY2FzZSBUSVJfU19DX1NUQV9HQkw6Ci0JLyoKLQkgKiBzdGFjayBnbG9iYWwKLQkgKiBhcmc6IGNzCXN5bWJvbCBuYW1lCi0JICoKLQkgKiBzdGFjayAzMiBiaXQgdmFsdWUgb2Ygc3ltYm9sIChoaWdoIGJpdHMgc2V0IHRvIDApCi0JICovCi0JewotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQotICAgICAgICAgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHJldHVybiAwOwotCi0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykoZW50cnktPnN5bWJvbC0+dmFsdWUpLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfU0I6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgYnl0ZQotCSAqIGFyZzogYnkJdmFsdWUKLQkgKgotCSAqIHN0YWNrIGJ5dGUgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDMyIGJpdAotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKSpwdHIrKywgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfU1c6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgc2hvcnQgd29yZAotCSAqIGFyZzogc2gJdmFsdWUKLQkgKgotCSAqIHN0YWNrIDE2IGJpdCB2YWx1ZSwgc2lnbiBleHRlbmQgdG8gMzIgYml0Ci0JICovCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKGxvbmcpYmZkX2dldGwxNihwdHIpLCAtMSk7Ci0JcHRyICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MVzoKLQkvKgotCSAqIHN0YWNrIHNpZ25lZCBsb25nd29yZAotCSAqIGFyZzogbHcJdmFsdWUKLQkgKgotCSAqIHN0YWNrIDMyIGJpdCB2YWx1ZQotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKWJmZF9nZXRsMzIgKHB0ciksIC0xKTsKLQlwdHIgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1BCOgotICAgICAgY2FzZSBUSVJfU19DX1NUQV9XUEI6Ci0JLyoKLQkgKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgYnl0ZSBvZmZzZXQgKHdvcmQgaW5kZXgpCi0JICogYXJnOiBieQlzZWN0aW9uIGluZGV4Ci0JICoJKHNoCXNlY3Rpb24gaW5kZXgpCi0JICoJYnkJc2lnbmVkIGJ5dGUgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICB1bnNpZ25lZCBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUEIpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSAobG9uZykqcHRyKys7Ci0JICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfUFc6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dQVzoKLQkvKgotCSAqIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyB3b3JkIG9mZnNldCAod29yZCBpbmRleCkKLQkgKiBhcmc6IGJ5CXNlY3Rpb24gaW5kZXgKLQkgKgkoc2gJc2VjdGlvbiBpbmRleCkKLQkgKglzaAlzaWduZWQgc2hvcnQgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICB1bnNpZ25lZCBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUFcpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSBiZmRfZ2V0bDE2KHB0cik7IHB0cis9MjsKLQkgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9QTDoKLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV1BMOgotCS8qCi0JICogc3RhY2sgcHNlY3QgYmFzZSBwbHVzIGxvbmcgb2Zmc2V0ICh3b3JkIGluZGV4KQotCSAqIGFyZzogYnkJc2VjdGlvbiBpbmRleAotCSAqCShzaAlzZWN0aW9uIGluZGV4KQotCSAqCWx3CXNpZ25lZCBsb25nd29yZCBvZmZzZXQKLQkgKgotCSAqLwotICAJewotCSAgdW5zaWduZWQgbG9uZyBkdW1teTsKLQkgIHVuc2lnbmVkIGludCBwc2VjdDsKLQotCSAgaWYgKGNtZCA9PSBUSVJfU19DX1NUQV9QTCkKLQkgICAgcHNlY3QgPSAqcHRyKys7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwc2VjdCA9IGJmZF9nZXRsMTYocHRyKTsKLQkgICAgICBwdHIgKz0gMjsKLQkgICAgfQotCi0JICBpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKLQkgICAgewotCSAgICAgIGFsbG9jX3NlY3Rpb24gKGFiZmQsIHBzZWN0KTsKLQkgICAgfQotCi0JICBkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7IHB0ciArPSA0OwotCSAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIGR1bW15LCBwc2VjdCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1VCOgotCS8qCi0JICogc3RhY2sgdW5zaWduZWQgYnl0ZQotCSAqIGFyZzogYnkJdmFsdWUKLQkgKgotCSAqIHN0YWNrIGJ5dGUgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykqcHRyKyssIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1VXOgotCS8qCi0JICogc3RhY2sgdW5zaWduZWQgc2hvcnQgd29yZAotCSAqIGFyZzogc2gJdmFsdWUKLQkgKgotCSAqIHN0YWNrIDE2IGJpdCB2YWx1ZQotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKWJmZF9nZXRsMTYocHRyKSwgLTEpOwotCXB0ciArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfQkZJOgotCS8qCi0JICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0JICogYXJnOiAtCi0JICoKLQkgKi8KLQkvKkZBTExUSFJVKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV0ZJOgotCS8qCi0JICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0JICogYXJnOiAtCi0JICoKLQkgKi8KLQkvKkZBTExUSFJVKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTEZJOgotCS8qCi0JICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0JICogYXJnOiAtCi0JICoKLQkgKi8KLSAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1mcm9tLWltYWdlIG5vdCBpbXBsZW1lbnRlZCIpKTsKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9FUE06Ci0JLyoKLQkgKiBzdGFjayBlbnRyeSBwb2ludCBtYXNrCi0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgKHVuc2lnbmVkKSBlbnRyeSBwb2ludCBtYXNrIG9mIHN5bWJvbAotCSAqIGVyciBpZiBzeW1ib2wgaXMgbm8gZW50cnkgcG9pbnQKLQkgKi8KLQl7Ci0JICBjaGFyICpuYW1lOwotCSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWVudHJ5LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9DS0FSRzoKLQkvKgotCSAqIGNvbXBhcmUgcHJvY2VkdXJlIGFyZ3VtZW50Ci0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCWJ5CWFyZ3VtZW50IGluZGV4Ci0JICoJZGEJYXJndW1lbnQgZGVzY3JpcHRvcgotCSAqCi0JICogY29tcGFyZSBhcmd1bWVudCBkZXNjcmlwdG9yIHdpdGggc3ltYm9sIGFyZ3VtZW50IChBUkckVl9QQVNTTUVDSCkKLQkgKiBhbmQgc3RhY2sgVFJVRSAoYXJncyBtYXRjaCkgb3IgRkFMU0UgKGFyZ3MgZG9udCBtYXRjaCkgdmFsdWUKLQkgKi8KLSAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJQQVNTTUVDSCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgMUwsIC0xKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MU1k6Ci0JLyoKLQkgKiBzdGFjayBsb2NhbCBzeW1ib2wgdmFsdWUKLQkgKiBhcmc6CXNoCWVudmlyb25tZW50IGluZGV4Ci0JICoJY3MJc3ltYm9sIG5hbWUKLQkgKi8KLQl7Ci0JICBpbnQgZW52aWR4OwotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBlbnZpZHggPSBiZmRfZ2V0bDE2KHB0cik7IHB0ciArPSAyOwotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxvY2FsLXN5bWJvbCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAwTCwgLTEpOwotCSAgcHRyICs9ICpwdHIgKyAxOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xJVDoKLQkvKgotCSAqIHN0YWNrIGxpdGVyYWwKLSAJICogYXJnOglieQlsaXRlcmFsIGluZGV4Ci0JICoKLQkgKiBzdGFjayBsaXRlcmFsCi0JICovCi0JcHRyKys7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxpdGVyYWwgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xFUE06Ci0JLyoKLQkgKiBzdGFjayBsb2NhbCBzeW1ib2wgZW50cnkgcG9pbnQgbWFzawotCSAqIGFyZzoJc2gJZW52aXJvbm1lbnQgaW5kZXgKLQkgKgljcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgKHVuc2lnbmVkKSBlbnRyeSBwb2ludCBtYXNrIG9mIHN5bWJvbAotCSAqIGVyciBpZiBzeW1ib2wgaXMgbm8gZW50cnkgcG9pbnQKLQkgKi8KLQl7Ci0JICBpbnQgZW52aWR4OwotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBlbnZpZHggPSBiZmRfZ2V0bDE2KHB0cik7IHB0ciArPSAyOwotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2stbG9jYWwtc3ltYm9sLWVudHJ5LXBvaW50LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIFNUQSBjbWQgJWQiKSwgcHRyWy0xXSk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLQotLyoKLSAqIHRpcl9zdG8KLSAqCi0gKiB2YXggc3RvcmUgY29tbWFuZHMKLSAqCi0gKiBoYW5kbGUgc3RvX3h4eCBjb21tYW5kcyBpbiB0aXIgc2VjdGlvbgotICogcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gKgotICogc2VlIHRhYmxlIDctNCBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX3N0byAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0gIGludCBzaXplOwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfc3RvICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fU0I6Ci0JLyoKLQkgKiBzdG9yZSBzaWduZWQgYnl0ZTogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUT19TVzoKLQkvKgotCSAqIHN0b3JlIHNpZ25lZCB3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIHdvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fTFc6Ci0JLyoKLQkgKiBzdG9yZSBsb25nd29yZDogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWltYWdlX3dyaXRlX2wgKGFiZmQsIGR1bW15ICYgMHhmZmZmZmZmZik7LyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUT19CRDoKLQkvKgotCSAqIHN0b3JlIGJ5dGUgZGlzcGxhY2VkOiBwb3Agc3RhY2ssIHN1YiBsYysxLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JZHVtbXkgLT0gKChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWEgKyAxKTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fV0Q6Ci0JLyoKLQkgKiBzdG9yZSB3b3JkIGRpc3BsYWNlZDogcG9wIHN0YWNrLCBzdWIgbGMrMiwgd3JpdGUgd29yZAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWR1bW15IC09ICgoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hICsgMik7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xEOgotCS8qCi0JICogc3RvcmUgbG9uZyBkaXNwbGFjZWQ6IHBvcCBzdGFjaywgc3ViIGxjKzQsIHdyaXRlIGxvbmcKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlkdW1teSAtPSAoKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYSArIDQpOwotCWltYWdlX3dyaXRlX2wgKGFiZmQsIGR1bW15ICYgMHhmZmZmZmZmZik7LyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fTEk6Ci0JLyoKLQkgKiBzdG9yZSBzaG9ydCBsaXRlcmFsOiBwb3Agc3RhY2ssIHdyaXRlIGJ5dGUKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1BJRFI6Ci0JLyoKLQkgKiBzdG9yZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBkYXRhIHJlZmVyZW5jZTogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAotCSAqIGFyZzogLQotCSAqIEZJWE1FOiBpbmNvbXBsZXRlICEKLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1BJQ1I6Ci0JLyoKLQkgKiBzdG9yZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHJlZmVyZW5jZTogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAotCSAqIGFyZzogLQotCSAqIEZJWE1FOiBpbmNvbXBsZXRlICEKLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCAweDlmKTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JJVkI6Ci0JLyoKLQkgKiBzdG9yZSByZXBlYXRlZCBpbW1lZGlhdGUgdmFyaWFibGUgYnl0ZXMKLQkgKiAxLWJ5dGUgY291bnQgbiBmaWVsZCBmb2xsb3dlZCBieSBuIGJ5dGVzIG9mIGRhdGEKLQkgKiBwb3Agc3RhY2ssIHdyaXRlIG4gYnl0ZXMgPHN0YWNrPiB0aW1lcwotCSAqLwotCXNpemUgPSAqcHRyKys7Ci0JZHVtbXkgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCXdoaWxlIChkdW1teS0tID4gMEwpCi0JICBpbWFnZV9kdW1wIChhYmZkLCBwdHIsIHNpemUsIDApOwotCXB0ciArPSBzaXplOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19COgotCS8qCi0JICogc3RvcmUgYnl0ZSBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19XOgotCS8qCi0JICogc3RvcmUgd29yZCBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JCOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgYnl0ZSBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCXNpemUgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoc2l6ZS0tID4gMCkKLQkgIGltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JXOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgd29yZCBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCXNpemUgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoc2l6ZS0tID4gMCkKLQkgIGltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUT19SU0I6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JTVzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUkw6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1ZQUzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVVNCOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19VU1c6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JVQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUlVXOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSVJSOgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5pbXBsZW1lbnRlZCBTVE8gY21kICVkIiksIHB0clstMV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVE8gY21kICVkIiksIHB0clstMV0pOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiBzdGFjayBvcGVyYXRvciBjb21tYW5kcwotICogYWxsIDMyIGJpdCBzaWduZWQgYXJpdGhtZXRpYwotICogYWxsIHdvcmQganVzdCBsaWtlIGEgc3RhY2sgY2FsY3VsYXRvcgotICogYXJndW1lbnRzIGFyZSBwb3BwZWQgZnJvbSBzdGFjaywgcmVzdWx0cyBhcmUgcHVzaGVkIG9uIHN0YWNrCi0gKgotICogc2VlIHRhYmxlIDctNSBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX29wciAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIGxvbmcgb3AxLCBvcDI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfb3ByICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgLyogb3BlcmF0aW9uICovCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX05PUDoKLQkvKgotCSAqIG5vLW9wCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9BREQ6Ci0JLyoKLQkgKiBhZGQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSArIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1NVQjoKLQkvKgotCSAqIHN1YnRyYWN0Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDIgLSBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9NVUw6Ci0JLyoKLQkgKiBtdWx0aXBseQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxICogb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfRElWOgotCS8qCi0JICogZGl2aWRlCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWlmIChvcDIgPT0gMCkKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKTBMLCAtMSk7Ci0JZWxzZQotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMiAvIG9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0FORDoKLQkvKgotCSAqIGxvZ2ljYWwgYW5kCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgJiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9JT1I6Ci0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkvKgotCSAqIGxvZ2ljYWwgaW5jbHVzaXZlIG9yCi0JICovCi0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxIHwgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfRU9SOgotCS8qCi0JICogbG9naWNhbCBleGNsdXNpdmUgb3IKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSBeIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX05FRzoKLQkvKgotCSAqIG5lZ2F0ZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKC1vcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9DT006Ci0JLyoKLQkgKiBjb21wbGVtZW50Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxIF4gLTFMKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfSU5TVjoKLQkvKgotCSAqIGluc2VydCBmaWVsZAotCSAqLwotCSh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpICAoIlRJUl9TX0NfT1BSX0lOU1YgaW5jb21wbGV0ZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQVNIOgotCS8qCi0JICogYXJpdGhtZXRpYyBzaGlmdAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAoSElHSEJJVChvcDEpKQkJLyogc2hpZnQgcmlnaHQgKi8KLQkgIG9wMiA+Pj0gb3AxOwotCWVsc2UJCQkvKiBzaGlmdCBsZWZ0ICovCi0JICBvcDIgPDw9IG9wMTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZylvcDIsIC0xKTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfT1BSX0FTSCBpbmNvbXBsZXRlIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfVVNIOgotCS8qCi0JICogdW5zaWduZWQgc2hpZnQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQob3AxKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9VU0ggaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1JPVDoKLQkvKgotCSAqIHJvdGF0ZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAoSElHSEJJVCgwKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9ST1QgaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1NFTDoKLQkvKgotCSAqIHNlbGVjdAotCSAqLwotCWlmICgobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpICYgMHgwMUwpCi0JICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWVsc2UKLQkgIHsKLQkgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgICAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AxLCAtMSk7Ci0JICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9SRURFRjoKLQkvKgotCSAqIHJlZGVmaW5lIHN5bWJvbCB0byBjdXJyZW50IGxvY2F0aW9uCi0JICovCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9SRURFRiBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfREZMSVQ6Ci0JLyoKLQkgKiBkZWZpbmUgYSBsaXRlcmFsCi0JICovCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9ERkxJVCBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBPUFIgY21kICVkIiksIHB0clstMV0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX2N0bCAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi0vKgotICogY29udHJvbCBjb21tYW5kcwotICoKLSAqIHNlZSB0YWJsZSA3LTYgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi17Ci0gIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0gIHVuc2lnbmVkIGludCBwc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgInRpcl9jdGwgJWRcbiIsICpwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoICgqcHRyKyspCi0gICAgewotICAgICAgY2FzZSBUSVJfU19DX0NUTF9TRVRSQjoKLQkvKgotCSAqIHNldCByZWxvY2F0aW9uIGJhc2U6IHBvcCBzdGFjaywgc2V0IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKLQkgIHsKLQkgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgfQotCWltYWdlX3NldF9wdHIgKGFiZmQsIHBzZWN0LCBkdW1teSk7Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfQVVHUkI6Ci0JLyoKLQkgKiBhdWdtZW50IHJlbG9jYXRpb24gYmFzZTogaW5jcmVtZW50IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIgYnkgb2Zmc2V0Ci0JICogYXJnOiBsdwlvZmZzZXQgdmFsdWUKLQkgKi8KLQlkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7Ci0JaW1hZ2VfaW5jX3B0ciAoYWJmZCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfQ1RMX0RGTE9DOgotCS8qCi0JICogZGVmaW5lIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHNhdmUgbG9jYXRpb24gY291bnRlciB1bmRlciBpbmRleAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX0RGTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX0NUTF9TVExPQzoKLQkvKgotCSAqIHNldCBsb2NhdGlvbjogcG9wIGluZGV4LCByZXN0b3JlIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19DVExfU1RMT0Mgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUSVJfU19DX0NUTF9TVEtETDoKLQkvKgotCSAqIHN0YWNrIGRlZmluZWQgbG9jYXRpb246IHBvcCBpbmRleCwgcHVzaCBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX1NUS0RMIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgQ1RMIGNtZCAlZCIpLCBwdHJbLTFdKTsKLQlicmVhazsKLSAgfQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiBoYW5kbGUgY29tbWFuZCBmcm9tIFRJUiBzZWN0aW9uCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX2NtZCAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIHN0cnVjdCB7Ci0gICAgaW50IG1pbmNvZDsKLSAgICBpbnQgbWF4Y29kOwotICAgIHVuc2lnbmVkIGNoYXIgKiAoKmV4cGxhaW4pKGJmZCAqLCB1bnNpZ25lZCBjaGFyICopOwotICB9IHRpcl90YWJsZVtdID0gewotICAgIHsgMCwJCSBUSVJfU19DX01BWFNUQUNPRCwgdGlyX3N0YSB9Ci0gICAseyBUSVJfU19DX01JTlNUT0NPRCwgVElSX1NfQ19NQVhTVE9DT0QsIHRpcl9zdG8gfQotICAgLHsgVElSX1NfQ19NSU5PUFJDT0QsIFRJUl9TX0NfTUFYT1BSQ09ELCB0aXJfb3ByIH0KLSAgICx7IFRJUl9TX0NfTUlOQ1RMQ09ELCBUSVJfU19DX01BWENUTENPRCwgdGlyX2N0bCB9Ci0gICAseyAtMSwgLTEsIE5VTEwgfQotICB9OwotICBpbnQgaSA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJ0aXJfY21kICVkLyV4XG4iLCAqcHRyLCAqcHRyKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICBpZiAoKnB0ciAmIDB4ODApCQkJCS8qIHN0b3JlIGltbWVkaWF0ZSAqLwotICAgIHsKLSAgICAgIGkgPSAxMjggLSAoKnB0cisrICYgMHg3Zik7Ci0gICAgICBpbWFnZV9kdW1wIChhYmZkLCBwdHIsIGksIDApOwotICAgICAgcHRyICs9IGk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKHRpcl90YWJsZVtpXS5taW5jb2QgPj0gMCkKLQl7Ci0JICBpZiAoICh0aXJfdGFibGVbaV0ubWluY29kIDw9ICpwdHIpIAotCSAgICAmJiAoKnB0ciA8PSB0aXJfdGFibGVbaV0ubWF4Y29kKSkKLQkgICAgewotCSAgICAgIHB0ciA9IHRpcl90YWJsZVtpXS5leHBsYWluIChhYmZkLCBwdHIpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpKys7Ci0JfQotICAgICAgaWYgKHRpcl90YWJsZVtpXS5taW5jb2QgPCAwKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqIGNvZGUgJWQgbm90IGZvdW5kIiksICpwdHIpOwotCSAgcHRyID0gMDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLQotLyogaGFuZGxlIGNvbW1hbmQgZnJvbSBFVElSIHNlY3Rpb24gICovCi0KLXN0YXRpYyBpbnQKLWV0aXJfY21kIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHN0YXRpYyBzdHJ1Y3QgewotICAgIGludCBtaW5jb2Q7Ci0gICAgaW50IG1heGNvZDsKLSAgICBib29sZWFuICgqZXhwbGFpbikgUEFSQU1TKChiZmQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICopKTsKLSAgfSBldGlyX3RhYmxlW10gPSB7Ci0gICAgeyBFVElSX1NfQ19NSU5TVEFDT0QsIEVUSVJfU19DX01BWFNUQUNPRCwgZXRpcl9zdGEgfSwKLSAgICB7IEVUSVJfU19DX01JTlNUT0NPRCwgRVRJUl9TX0NfTUFYU1RPQ09ELCBldGlyX3N0byB9LAotICAgIHsgRVRJUl9TX0NfTUlOT1BSQ09ELCBFVElSX1NfQ19NQVhPUFJDT0QsIGV0aXJfb3ByIH0sCi0gICAgeyBFVElSX1NfQ19NSU5DVExDT0QsIEVUSVJfU19DX01BWENUTENPRCwgZXRpcl9jdGwgfSwKLSAgICB7IEVUSVJfU19DX01JTlNUQ0NPRCwgRVRJUl9TX0NfTUFYU1RDQ09ELCBldGlyX3N0YyB9LAotICAgIHsgLTEsIC0xLCBOVUxMIH0KLSAgfTsKLQotICBpbnQgaSA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJldGlyX2NtZCAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHdoaWxlIChldGlyX3RhYmxlW2ldLm1pbmNvZCA+PSAwKQotICAgIHsKLSAgICAgIGlmICggKGV0aXJfdGFibGVbaV0ubWluY29kIDw9IGNtZCkgCi0JJiYgKGNtZCA8PSBldGlyX3RhYmxlW2ldLm1heGNvZCkpCi0JewotCSAgaWYgKCFldGlyX3RhYmxlW2ldLmV4cGxhaW4gKGFiZmQsIGNtZCwgcHRyKSkKLQkgICAgcmV0dXJuIC0xOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImV0aXJfY21kOiA9IDBcbiIpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFRleHQgSW5mb3JtYXRpb24gYW5kIFJlbG9jYXRpb24gUmVjb3JkcyAoT0JKJENfVElSKQotICAgaGFuZGxlIHRpciByZWNvcmQgICovCi0KLXN0YXRpYyBpbnQKLWFuYWx5emVfdGlyIChhYmZkLCBwdHIsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKm1heHB0cjsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfdGlyOiAlZCBieXRlc1xuIiwgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIG1heHB0ciA9IHB0ciArIGxlbmd0aDsKLQotICB3aGlsZSAocHRyIDwgbWF4cHRyKQotICAgIHsKLSAgICAgIHB0ciA9IHRpcl9jbWQgKGFiZmQsIHB0cik7Ci0gICAgICBpZiAocHRyID09IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIFJlY29yZHMgKEVPQkokQ19FVElSKQotICAgaGFuZGxlIGV0aXIgcmVjb3JkICAqLwotCi1zdGF0aWMgaW50Ci1hbmFseXplX2V0aXIgKGFiZmQsIHB0ciwgbGVuZ3RoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKLXsKLSAgaW50IGNtZDsKLSAgdW5zaWduZWQgY2hhciAqbWF4cHRyOwotICBpbnQgcmVzdWx0ID0gMDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfZXRpcjogJWQgYnl0ZXNcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBtYXhwdHIgPSBwdHIgKyBsZW5ndGg7Ci0KLSAgd2hpbGUgKHB0ciA8IG1heHB0cikKLSAgICB7Ci0gICAgICBjbWQgPSBiZmRfZ2V0bDE2IChwdHIpOwotICAgICAgbGVuZ3RoID0gYmZkX2dldGwxNiAocHRyICsgMik7Ci0gICAgICByZXN1bHQgPSBldGlyX2NtZCAoYWJmZCwgY21kLCBwdHIrNCk7Ci0gICAgICBpZiAocmVzdWx0ICE9IDApCi0JYnJlYWs7Ci0gICAgICBwdHIgKz0gbGVuZ3RoOwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfZXRpcjogPSAlZFxuIiwgcmVzdWx0KTsKLSNlbmRpZgotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogcHJvY2VzcyBFVElSIHJlY29yZAotICAKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX3RpciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgaW50IHJlc3VsdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIlRJUi9FVElSXG4iKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAob2JqdHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIEVPQkpfU19DX0VUSVI6Ci0JUFJJVih2bXNfcmVjKSArPSA0OwkvKiBza2lwIHR5cGUsIHNpemUgKi8KLQlQUklWKHJlY19zaXplKSAtPSA0OwotCXJlc3VsdCA9IGFuYWx5emVfZXRpciAoYWJmZCwgUFJJVih2bXNfcmVjKSwgUFJJVihyZWNfc2l6ZSkpOwotCWJyZWFrOwotICAgICAgY2FzZSBPQkpfU19DX1RJUjoKLQlQUklWKHZtc19yZWMpICs9IDE7CS8qIHNraXAgdHlwZSAqLwotCVBSSVYocmVjX3NpemUpIC09IDE7Ci0JcmVzdWx0ID0gYW5hbHl6ZV90aXIgKGFiZmQsIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JcmVzdWx0ID0gLTE7Ci0JYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogcHJvY2VzcyBFREJHIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAgCi0gICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2RiZyAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIkRCRy9FREJHXG4iKTsKLSNlbmRpZgotCi0gIGFiZmQtPmZsYWdzIHw9IChIQVNfREVCVUcgfCBIQVNfTElORU5PKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogcHJvY2VzcyBFVEJUIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAgCi0gICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX3RidCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvYmp0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAiVEJUL0VUQlRcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogcHJvY2VzcyBMTksgcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgotICAKLSAgIG5vdCBpbXBsZW1lbnRlZCB5ZXQgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfbG5rIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJMTktcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoJCQkJCQkJCQkqLwotLyoJV1JJVEUgRVRJUiBTRUNUSU9OCQkJCQkJKi8KLS8qCQkJCQkJCQkJKi8KLS8qCXRoaXMgaXMgc3RpbGwgdW5kZXIgY29uc3RydWN0aW9uIGFuZCB0aGVyZWZvcmUgbm90IGRvY3VtZW50ZWQJKi8KLS8qCQkJCQkJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHN0YXJ0X2V0aXJfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IGluZGV4LCB1cXVhZCBvZmZzZXQsIGJvb2xlYW4ganVzdG9mZnNldCkpOwotc3RhdGljIHZvaWQgc3RvX2ltbSBQQVJBTVMgKChiZmQgKmFiZmQsIHZtc19zZWN0aW9uICpzcHRyLCBiZmRfdm1hIHZhZGRyLCBpbnQgaW5kZXgpKTsKLXN0YXRpYyB2b2lkIGVuZF9ldGlyX3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICB2bXNfc2VjdGlvbiAqc3B0cjsKLSAgICAgYmZkX3ZtYSB2YWRkcjsKLSAgICAgaW50IGluZGV4OwotewotICBpbnQgc2l6ZTsKLSAgaW50IHNzaXplOwotICB1bnNpZ25lZCBjaGFyICpjcHRyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg4LCAic3RvX2ltbSAlZCBieXRlc1xuIiwgc3B0ci0+c2l6ZSk7Ci0gIF9iZmRfaGV4ZHVtcCAoOSwgc3B0ci0+Y29udGVudHMsIChpbnQpc3B0ci0+c2l6ZSwgKGludCl2YWRkcik7Ci0jZW5kaWYKLQotICBzc2l6ZSA9IHNwdHItPnNpemU7Ci0gIGNwdHIgPSBzcHRyLT5jb250ZW50czsKLQotICB3aGlsZSAoc3NpemUgPiAwKQotICAgIHsKLQotICAgICAgc2l6ZSA9IHNzaXplOwkJCQkvKiB0cnkgYWxsIHRoZSByZXN0ICovCi0KLSAgICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIHNpemUpIDwgMCkKLQl7CQkJCQkvKiBkb2Vzbid0IGZpdCwgc3BsaXQgISAqLwotCSAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBpbmRleCwgdmFkZHIsIGZhbHNlKTsKLQkgIHNpemUgPSBfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDApOwkvKiBnZXQgbWF4IHNpemUgKi8KLQkgIGlmIChzaXplID4gc3NpemUpCQkJLyogbW9yZSB0aGFuIHdoYXQncyBsZWZ0ID8gKi8KLQkgICAgc2l6ZSA9IHNzaXplOwotCX0KLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19TVE9fSU1NLCAtMSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNpemUpKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBjcHRyLCBzaXplKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICgxMCwgImR1bXBlZCAlZCBieXRlc1xuIiwgc2l6ZSk7Ci0gICAgICBfYmZkX2hleGR1bXAgKDEwLCBjcHRyLCAoaW50KXNpemUsIChpbnQpdmFkZHIpOwotI2VuZGlmCi0KLSAgICAgIHZhZGRyICs9IHNpemU7Ci0gICAgICBzc2l6ZSAtPSBzaXplOwotICAgICAgY3B0ciArPSBzaXplOwotICAgIH0KLQotICByZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHN0YXJ0IEVUSVIgcmVjb3JkIGZvciBzZWN0aW9uICNpbmRleCBhdCB2aXJ0dWFsIGFkZHIgb2Zmc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBpbmRleCwgb2Zmc2V0LCBqdXN0b2Zmc2V0KQotICAgIGJmZCAqYWJmZDsKLSAgICBpbnQgaW5kZXg7Ci0gICAgdXF1YWQgb2Zmc2V0OwotICAgIGJvb2xlYW4ganVzdG9mZnNldDsKLXsKLSAgaWYgKCFqdXN0b2Zmc2V0KQotICAgIHsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRVRJUiwgLTEpOwkvKiBvbmUgRVRJUiBwZXIgc2VjdGlvbiAqLwotICAgICAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVUSVJfU19DX1NUQV9QUSwgLTEpOwkvKiBwdXNoIHN0YXJ0IG9mZnNldCAqLwotICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpaW5kZXgpOwotICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgKHVxdWFkKW9mZnNldCk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19DVExfU0VUUkIsIC0xKTsJLyogc3RhcnQgPSBwb3AgKCkgKi8KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogZW5kIGV0aXIgcmVjb3JkICAqLwotc3RhdGljIHZvaWQKLWVuZF9ldGlyX3JlY29yZCAoYWJmZCkKLSAgICBiZmQgKmFiZmQ7Ci17Ci0gIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsgCi19Ci0KLS8qIHdyaXRlIHNlY3Rpb24gY29udGVudHMgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX3RpciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgdm1zX3NlY3Rpb24gKnNwdHI7Ci0gIGludCBuZXh0b2Zmc2V0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX3RpciAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA0KTsKLQotICBuZXh0b2Zmc2V0ID0gMDsKLSAgUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPSAxOwotCi0gIC8qIGR1bXAgYWxsIG90aGVyIHNlY3Rpb25zICAqLwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQotICB3aGlsZSAoc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLQotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDQsICJ3cml0aW5nICVkLiBzZWN0aW9uICclcycgKCVkIGJ5dGVzKVxuIiwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIChpbnQpKHNlY3Rpb24tPl9yYXdfc2l6ZSkpOw0KLSNlbmRpZgotCi0gICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmICgoaSA9IHNlY3Rpb24tPnJlbG9jX2NvdW50KSA8PSAwKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTRUNfUkVMT0Mgd2l0aCBubyByZWxvY3MgaW4gc2VjdGlvbiAlcyIpLAotCQkJCSAgICAgc2VjdGlvbi0+bmFtZSk7Ci0JICAgIH0KLSNpZiBWTVNfREVCVUcKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKipycHRyOwotCSAgICAgIF9iZmRfdm1zX2RlYnVnICg0LCAiJWQgcmVsb2NhdGlvbnM6XG4iLCBpKTsKLQkgICAgICBycHRyID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0JICAgICAgd2hpbGUgKGktLSA+IDApCi0JCXsKLQkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgInN5bSAlcyBpbiBzZWMgJXMsIHZhbHVlICUwOGx4LCBhZGRyICUwOGx4LCBvZmYgJTA4bHgsIGxlbiAlZDogJXNcbiIsCi0JCQkgICAgICAoKigqcnB0ciktPnN5bV9wdHJfcHRyKS0+bmFtZSwKLQkJCSAgICAgICgqKCpycHRyKS0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uLT5uYW1lLAotCQkJICAgICAgKGxvbmcpKCooKnJwdHIpLT5zeW1fcHRyX3B0ciktPnZhbHVlLAotCQkJICAgICAgKCpycHRyKS0+YWRkcmVzcywgKCpycHRyKS0+YWRkZW5kLAotCQkJICAgICAgYmZkX2dldF9yZWxvY19zaXplKCgqcnB0ciktPmhvd3RvKSwKLQkJCSAgICAgICgqcnB0ciktPmhvd3RvLT5uYW1lKTsKLQkJICBycHRyKys7Ci0JCX0KLQkgICAgfQotI2VuZGlmCi0JfQotCi0gICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykKLQkmJiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKSkKLQl7Ci0JICBiZmRfdm1hIHZhZGRyOwkJLyogdmlydHVhbCBhZGRyIGluIHNlY3Rpb24gKi8KLQotCSAgc3B0ciA9IF9iZmRfZ2V0X3Ztc19zZWN0aW9uIChhYmZkLCBzZWN0aW9uLT5pbmRleCk7Ci0JICBpZiAoc3B0ciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQotCSAgdmFkZHIgPSAoYmZkX3ZtYSkoc3B0ci0+b2Zmc2V0KTsKLQotCSAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIHNlY3Rpb24tPmluZGV4LCAodXF1YWQpIHNwdHItPm9mZnNldCwKLQkJCSAgICAgZmFsc2UpOwotCi0JICB3aGlsZSAoc3B0ciAhPSBOVUxMKQkJCQkvKiBvbmUgU1RBX1BRLCBDVExfU0VUUkIgcGVyIHZtc19zZWN0aW9uICovCi0JICAgIHsKLQotCSAgICAgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykJCQkvKiBjaGVjayBmb3IgcmVsb2NzICovCi0JCXsKLQkJICBhcmVsZW50ICoqcnB0ciA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCQkgIGludCBpID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JCSAgZm9yICg7OykKLQkJICAgIHsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBhZGRyID0gKCpycHRyKS0+YWRkcmVzczsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBsZW4gPSBiZmRfZ2V0X3JlbG9jX3NpemUgKCgqcnB0ciktPmhvd3RvKTsKLQkJICAgICAgaWYgKHNwdHItPm9mZnNldCA8IGFkZHIpCQkvKiBzcHRyIHN0YXJ0cyBiZWZvcmUgcmVsb2MgKi8KLQkJCXsKLQkJCSAgYmZkX3NpemVfdHlwZSBiZWZvcmUgPSBhZGRyIC0gc3B0ci0+b2Zmc2V0OwotCQkJICBpZiAoc3B0ci0+c2l6ZSA8PSBiZWZvcmUpCQkvKiBjb21wbGV0ZSBiZWZvcmUgKi8KLQkJCSAgICB7Ci0JCQkgICAgICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwotCQkJICAgICAgdmFkZHIgKz0gc3B0ci0+c2l6ZTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgZWxzZQkJCQkvKiBwYXJ0bHkgYmVmb3JlICovCi0JCQkgICAgewotCQkJICAgICAgaW50IGFmdGVyID0gc3B0ci0+c2l6ZSAtIGJlZm9yZTsKLQkJCSAgICAgIHNwdHItPnNpemUgPSBiZWZvcmU7Ci0JCQkgICAgICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwotCQkJICAgICAgdmFkZHIgKz0gc3B0ci0+c2l6ZTsKLQkJCSAgICAgIHNwdHItPmNvbnRlbnRzICs9IGJlZm9yZTsKLQkJCSAgICAgIHNwdHItPm9mZnNldCArPSBiZWZvcmU7Ci0JCQkgICAgICBzcHRyLT5zaXplID0gYWZ0ZXI7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlIGlmIChzcHRyLT5vZmZzZXQgPT0gYWRkcikJLyogc3B0ciBzdGFydHMgYXQgcmVsb2MgKi8KLQkJCXsKLQkJCSAgYXN5bWJvbCAqc3ltID0gKigqcnB0ciktPnN5bV9wdHJfcHRyOwotCQkJICBhc2VjdGlvbiAqc2VjID0gc3ltLT5zZWN0aW9uOwotCi0JCQkgIHN3aXRjaCAoKCpycHRyKS0+aG93dG8tPnR5cGUpCi0JCQkgICAgewotCQkJICAgIGNhc2UgQUxQSEFfUl9JR05PUkU6Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9SRUZMT05HOgotCQkJICAgICAgewotCQkJCWlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCi0JCQkJCQkJCXN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCi0JCQkJCTwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19HQkxfTFcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCi0JCQkJCQkJICAgICAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMTYpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9MVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAodXF1YWQpc3ltLT52YWx1ZSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkJZWxzZQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAzMikgPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX1BRLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJCQkJCSAgICh1bnNpZ25lZCBsb25nKShzZWMtPmluZGV4KSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCQkJCSAgICgodXF1YWQpKCpycHRyKS0+YWRkZW5kCi0JCQkJCQkJICAgICsgKHVxdWFkKXN5bS0+dmFsdWUpKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fTFcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgY2FzZSBBTFBIQV9SX1JFRlFVQUQ6Ci0JCQkgICAgICB7Ci0JCQkJaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwKLQkJCQkJCQkJc3RybGVuKChjaGFyICopc3ltLT5uYW1lKSkKLQkJCQkJPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0dCTCwKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgICAgICBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkJZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAxNikgPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX1FXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCQkJCSAgICh1cXVhZClzeW0tPnZhbHVlKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fUVcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCQllbHNlCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDMyKSA8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfUFEsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKHNlYy0+aW5kZXgpKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJCQkJICAgKCh1cXVhZCkoKnJwdHIpLT5hZGRlbmQKLQkJCQkJCQkgICAgKyAodXF1YWQpc3ltLT52YWx1ZSkpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19PRkYsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgY2FzZSBBTFBIQV9SX0hJTlQ6Ci0JCQkgICAgICB7Ci0JCQkJaW50IGhpbnRfc2l6ZTsKLQotCQkJCWhpbnRfc2l6ZSA9IHNwdHItPnNpemU7Ci0JCQkJc3B0ci0+c2l6ZSA9IGxlbjsKLQkJCQlzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwotCQkJCXNwdHItPnNpemUgPSBoaW50X3NpemU7Ci0jaWYgMAotCQkJCXZtc19vdXRwdXRfYmVnaW4oYWJmZCwgRVRJUl9TX0NfU1RPX0hJTlRfR0JMLCAtMSk7Ci0JCQkJdm1zX291dHB1dF9sb25nKGFiZmQsICh1bnNpZ25lZCBsb25nKShzZWMtPmluZGV4KSk7Ci0JCQkJdm1zX291dHB1dF9xdWFkKGFiZmQsICh1cXVhZClhZGRyKTsKLQotCQkJCXZtc19vdXRwdXRfY291bnRlZChhYmZkLCBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJdm1zX291dHB1dF9mbHVzaChhYmZkKTsKLSNlbmRpZgotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSBBTFBIQV9SX0xJTktBR0U6Ci0JCQkgICAgICB7Ci0JCQkJaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgNjQpIDwgMCkKLQkJCQkgIHsKLQkJCQkgICAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkgICAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJICAgICAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICB9Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCUVUSVJfU19DX1NUQ19MUF9QU0IsCi0JCQkJCQkJLTEpOwotCQkJCV9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKVBSSVYodm1zX2xpbmthZ2VfaW5kZXgpKTsKLQkJCQlQUklWKHZtc19saW5rYWdlX2luZGV4KSArPSAyOwotCQkJCV9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAotCQkJCQkJCSAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCV9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBjYXNlIEFMUEhBX1JfQ09ERUFERFI6Ci0JCQkgICAgICB7Ci0JCQkJaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwKLQkJCQkJCQkgICAgc3RybGVuKChjaGFyICopc3ltLT5uYW1lKSkKLQkJCQkgICAgPCAwKQotCQkJCSAgewotCQkJCSAgICBlbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCSAgICBzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCSAgICAgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCSAgICAgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgfQotCQkJCV9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQlFVElSX1NfQ19TVE9fQ0EsCi0JCQkJCQkJLTEpOwotCQkJCV9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAotCQkJCQkJCSAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCV9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGRlZmF1bHQ6Ci0JCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVuaGFuZGxlZCByZWxvY2F0aW9uICVzIiksCi0JCQkJCQkgICAgICgqcnB0ciktPmhvd3RvLT5uYW1lKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQotCQkJICB2YWRkciArPSBsZW47Ci0KLQkJCSAgaWYgKGxlbiA9PSBzcHRyLT5zaXplKQotCQkJICAgIHsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIHNwdHItPmNvbnRlbnRzICs9IGxlbjsKLQkJCSAgICAgIHNwdHItPm9mZnNldCArPSBsZW47Ci0JCQkgICAgICBzcHRyLT5zaXplIC09IGxlbjsKLQkJCSAgICAgIGktLTsKLQkJCSAgICAgIHJwdHIrKzsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UJCQkJCS8qIHNwdHIgc3RhcnRzIGFmdGVyIHJlbG9jICovCi0JCQl7Ci0JCQkgIGktLTsJCQkJLyogY2hlY2sgbmV4dCByZWxvYyAqLwotCQkJICBycHRyKys7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGk9PTApCQkJCS8qIGFsbCByZWxvYyBjaGVja2VkICovCi0JCQl7Ci0JCQkgIGlmIChzcHRyLT5zaXplID4gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwkvKiBkdW1wIHJlc3QgKi8KLQkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCQkgICAgfQotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0gLyogZm9yICg7OykgKi8KLQkJfSAvKiBpZiBTRUNfUkVMT0MgKi8KLQkgICAgICBlbHNlCQkJCQkJLyogbm8gcmVsb2NzLCBqdXN0IGR1bXAgKi8KLQkJewotCQkgIHN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7Ci0JCSAgdmFkZHIgKz0gc3B0ci0+c2l6ZTsKLQkJfQotCi0JICAgICAgc3B0ciA9IHNwdHItPm5leHQ7Ci0KLQkgICAgfSAvKiB3aGlsZSAoc3B0ciAhPSAwKSAqLwotCi0JICBlbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCi0JfSAvKiBoYXNfY29udGVudHMgKi8KLQotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotCi0gIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQoYWJmZCwgMik7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIHdyaXRlIHRyYWNlYmFjayBkYXRhIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV90YnQgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogd3JpdGUgZGVidWcgaW5mbyBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZGJnICglcCwgb2JqdHlwZSlcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLmMgYi9iZmQvdm1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWE2M2YuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0NiArMCwwIEBACi0vKiB2bXMuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLXN0YXRpYyBib29sZWFuIHZtc19pbml0aWFsaXplIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHByaXZfc2VjdGlvbl9jb3VudDsKLXN0YXRpYyBib29sZWFuIGZpbGxfc2VjdGlvbl9wdHIgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2ZpeHVwX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb3B5X3N5bWJvbHMgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZWxvY19uaWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnZtc19vYmplY3RfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqdm1zX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19ta29iamVjdCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfY2xvc2VfYW5kX2NsZWFudXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfbmV3X3NlY3Rpb25faG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIHgxLCBmaWxlX3B0ciB4MiwKLQkgICBiZmRfc2l6ZV90eXBlIHgzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIGJmZF93aW5kb3cgKncsIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKnNyYywgYmZkICpkZXN0KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSAgUEFSQU1TICgoYmZkICpzcmNiZmQsIGFzZWN0aW9uICpzcmNzZWMsIGJmZCAqZHN0YmZkLCBhc2VjdGlvbiAqZHN0c2VjKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotICBQQVJBTVMgKChiZmQgKmliZmQsIGFzeW1ib2wgKmlzeW0sIGJmZCAqb2JmZCwgYXN5bWJvbCAqb3N5bSkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqZmlsZSkpOwotc3RhdGljIGNoYXIgKnZtc19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGludCB2bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZCAqYmJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICoqdGFibG9jLCBiZmRfc2l6ZV90eXBlICp0YWJsZW4sCi0JICAgY29uc3QgY2hhciAqKm5hbWUpKTsKLXN0YXRpYyB2b2lkIHZtc190cnVuY2F0ZV9hcm5hbWUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpwYXRobmFtZSwgY2hhciAqYXJoZHIpKTsKLXN0YXRpYyBib29sZWFuIHZtc193cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLCBzdHJ1Y3Qgb3JsICptYXAsCi0JICAgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotc3RhdGljIFBUUiB2bXNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYmZkICp2bXNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKmFiZmQsIHN5bWluZGV4IGluZGV4KSk7Ci1zdGF0aWMgYmZkICp2bXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaCwgYmZkICpwcmV2KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBpbnQgdm1zX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICpzdGF0KSk7Ci1zdGF0aWMgbG9uZyB2bXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyB2b2lkIHZtc19wcmludF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZSwgYXN5bWJvbCAqc3ltYm9sLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93KSk7Ci1zdGF0aWMgdm9pZCB2bXNfZ2V0X3N5bWJvbF9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBhbGVudCAqdm1zX2dldF9saW5lbm8gUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICpzeW1ib2wpKTsKLXN0YXRpYyBib29sZWFuIHZtc19maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsCi0JICAgY29uc3QgY2hhciAqKmZpbGUsIGNvbnN0IGNoYXIgKipmdW5jLCB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLXN0YXRpYyBhc3ltYm9sICp2bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpKTsKLXN0YXRpYyBsb25nIHZtc19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiBkeW5hbWljLCBQVFIgKm1pbmlzeW1zcCwgdW5zaWduZWQgaW50ICpzaXplcCkpOwotc3RhdGljIGFzeW1ib2wgKnZtc19taW5pc3ltYm9sX3RvX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYywgY29uc3QgUFRSIG1pbmlzeW0sIGFzeW1ib2wgKnN5bSkpOwotc3RhdGljIGxvbmcgdm1zX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0KSk7Ci1zdGF0aWMgbG9uZyB2bXNfY2Fub25pY2FsaXplX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNyY3NlYywgYXJlbGVudCAqKmxvY2F0aW9uLAotCSAgIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqdm1zX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2gpKTsKLXN0YXRpYyBib29sZWFuIHZtc19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1zdGF0aWMgaW50IHZtc19zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gcmVsb2MpKTsKLXN0YXRpYyBiZmRfYnl0ZSAqdm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwgYmZkX2J5dGUgKmRhdGEsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgICBib29sZWFuICphZ2FpbikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9nY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdm1zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotc3RhdGljIGxvbmcgdm1zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGxvbmcgdm1zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGxvbmcgdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqKmFyZWwsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBiZmQgKm9iZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotCi0jZGVmaW5lIHZtc19tYWtlX2VtcHR5X3N5bWJvbCBfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbAotDAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1jb25zdCBiZmRfdGFyZ2V0IHZtc19hbHBoYV92ZWMgPQotewotICAidm1zLWFscGhhIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgSEFTX1NZTVMKLSAgIHwgV1BfVEVYVCB8IERfUEFHRUQpLAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0gICB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkpLAkJLyogc2VjdCBmbGFncyAqLwotICAwLAkJCQkvKiBzeW1ib2xfbGVhZGluZ19jaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCB2bXNfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICB2bXNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIHZtc19ta29iamVjdCwJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgdm1zX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAodm1zKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKLQotY29uc3QgYmZkX3RhcmdldCB2bXNfdmF4X3ZlYyA9Ci17Ci0gICJ2bXMtdmF4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgSEFTX1NZTVMgCS8qIG9iamVjdCBmbGFncyAqLwotICAgfCBXUF9URVhUIHwgRF9QQUdFRAotICAgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX0xPQ0FMUyksCi0KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0gICB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkpLAkJLyogc2VjdCBmbGFncyAqLwotICAwLAkJCQkvKiBzeW1ib2xfbGVhZGluZ19jaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgdm1zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgdm1zX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCB2bXNfbWtvYmplY3QsCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIHZtc193cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKHZtcyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07Ci0MCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIEluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2luaXRpYWxpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLmFueSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCwgKGJmZF92bWEpLTEpOwotCi0gIGFiZmQtPnRkYXRhLmFueSA9ICgoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0KikKLQkJICAgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmFueSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmZGVmIF9fQUxQSEEKLSAgUFJJVihpc192YXgpID0gMDsKLSNlbHNlCi0gIFBSSVYoaXNfdmF4KSA9IDE7Ci0jZW5kaWYKLSAgUFJJVih2bXNfYnVmKSA9IDA7Ci0gIFBSSVYoYnVmX3NpemUpID0gMDsKLSAgUFJJVihyZWNfbGVuZ3RoKSA9IDA7Ci0gIFBSSVYoZmlsZV9mb3JtYXQpID0gRkZfVU5LTk9XTjsKLSAgUFJJVihmaXh1cF9kb25lKSA9IGZhbHNlOwotICBQUklWKHNlY3Rpb25zKSA9IE5VTEw7Ci0KLSAgUFJJVihzdGFjaykgPSAoKHN0cnVjdCBzdGFja19zdHJ1Y3QgKikKLQkJIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0YWNrX3N0cnVjdCkgKiBTVEFDS1NJWkUpKTsKLSAgaWYgKFBSSVYoc3RhY2spID09IDApCi0gICAgewotICAgICB2bXNfaW5pdF9ub19tZW0xOgotICAgICAgZnJlZSAoYWJmZC0+dGRhdGEuYW55KTsKLSAgICAgIGFiZmQtPnRkYXRhLmFueSA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBQUklWKHN0YWNrcHRyKSA9IDA7Ci0KLSAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotICBpZiAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9PSAwKQotICAgIHsKLSAgICAgdm1zX2luaXRfbm9fbWVtMjoKLSAgICAgIGZyZWUgKFBSSVYoc3RhY2spKTsKLSAgICAgIFBSSVYoc3RhY2spID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMTsKLSAgICB9Ci0KLSAgaWYgKCFiZmRfaGFzaF90YWJsZV9pbml0IChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBfYmZkX3Ztc19oYXNoX25ld2Z1bmMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBQUklWKGxvY2F0aW9uX3N0YWNrKSA9ICgoc3RydWN0IGxvY2F0aW9uX3N0cnVjdCAqKQotCQkJICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2NhdGlvbl9zdHJ1Y3QpCi0JCQkJICAgICAgKiBMT0NBVElPTl9TQVZFX1NJWkUpKTsKLSAgaWYgKFBSSVYobG9jYXRpb25fc3RhY2spID09IDApCi0gICAgewotICAgICB2bXNfaW5pdF9ub19tZW0zOgotICAgICAgZnJlZSAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSk7Ci0gICAgICBQUklWKHZtc19zeW1ib2xfdGFibGUpID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IFZNU19TRUNUSU9OX0NPVU5UOyBpKyspCi0gICAgUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaV0gPSBOVUxMOwotCi0gIFBSSVYob3V0cHV0X2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE1BWF9PVVRSRUNfU0laRSk7Ci0gIGlmIChQUklWKG91dHB1dF9idWYpID09IDApCi0gICAgewotICAgICAgZnJlZSAoUFJJVihsb2NhdGlvbl9zdGFjaykpOwotICAgICAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAwOwotICAgICAgZ290byB2bXNfaW5pdF9ub19tZW0zOwotICAgIH0KLSAgUFJJVihwdXNoX2xldmVsKSA9IDA7Ci0gIFBSSVYocHVzaGVkX3NpemUpID0gMDsKLSAgUFJJVihsZW5ndGhfcG9zKSA9IDI7Ci0gIFBSSVYob3V0cHV0X3NpemUpID0gMDsKLSAgUFJJVihvdXRwdXRfYWxpZ25tZW50KSA9IDE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRmlsbCBzeW1ib2wtPnNlY3Rpb24gd2l0aCBzZWN0aW9uIHB0cgotICAgc3ltYm9sLT5zZWN0aW9uIGlzIGZpbGxlZCB3aXRoIHRoZSBzZWN0aW9uIGluZGV4IGZvciBkZWZpbmVkIHN5bWJvbHMKLSAgIGR1cmluZyByZWFkaW5nIHRoZSBHU0QvRUdTRCBzZWN0aW9uLiBCdXQgd2UgbmVlZCB0aGUgcG9pbnRlciB0byB0aGUKLSAgIGJmZCBzZWN0aW9uIGxhdGVyLgotCi0gICBJdCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHJlZmVyZW5jZWQgKHVuZGVmaW5lZCBzZWN0aW9uKSBzeW1ib2xzCi0KLSAgIGNhbGxlZCBmcm9tIGJmZF9oYXNoX3RyYXZlcnNlIGluIHZtc19maXh1cF9zZWN0aW9ucyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZpbGxfc2VjdGlvbl9wdHIgKGVudHJ5LCBzZWN0aW9ucykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgUFRSIHNlY3Rpb25zOwotewotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICpzeW07Ci0KLSAgc3ltID0gICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sOwotICBzZWMgPSBzeW0tPnNlY3Rpb247Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiZmlsbF9zZWN0aW9uX3B0cjogc3ltICVwLCBzZWMgJXBcbiIsIHN5bSwgc2VjKTsKLSNlbmRpZgotCi0gIC8qIGZpbGwgZm9yd2FyZCByZWZlcmVuY2VzICh0aGVzZSBjb250YWluIHNlY3Rpb24gbnVtYmVyLCBub3Qgc2VjdGlvbiBwdHIpLiAgKi8KLQotICBpZiAoKHVuc2lnbmVkIGludCkgc2VjIDwgcHJpdl9zZWN0aW9uX2NvdW50KQotICAgIHsKLSAgICAgIHNlYyA9ICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sLT5zZWN0aW9uID0KLQkoKGFzZWN0aW9uICoqKXNlY3Rpb25zKVsoaW50KXNlY107Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHN5bS0+bmFtZSwgc2VjLT5uYW1lKSA9PSAwKQotICAgIHN5bS0+ZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEZpeHVwIHNlY3Rpb25zCi0gICBzZXQgdXAgYWxsIHBvaW50ZXJzIGFuZCBhcnJheXMsIGNvdW50ZXJzIGFuZCBzaXplcyBhcmUgZml4ZWQgbm93Ci0KLSAgIHdlIGJ1aWxkIGEgcHJpdmF0ZSBzZWN0aW9ucyB2ZWN0b3IgZm9yIGVhc3kgYWNjZXNzIHNpbmNlIHNlY3Rpb25zCi0gICBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgYnkgYW4gaW5kZXggbnVtYmVyLgotCi0gICBhbGxvYyBQUklWKHNlY3Rpb25zKSBhY2NvcmRpbmcgdG8gYWJmZC0+c2VjdGlvbl9jb3VudAotCWNvcHkgYWJmZC0+c2VjdGlvbnMgdG8gUFJJVihzZWN0aW9ucykgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZml4dXBfc2VjdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKFBSSVYoZml4dXBfZG9uZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyoKLSAgICogdHJhdmVyc2Ugc3ltYm9sIHRhYmxlIGFuZCBmaWxsIGluIGFsbCBzZWN0aW9uIHBvaW50ZXJzCi0gICAqLwotCi0gIC8qIGNhbid0IHByb3ZpZGUgc2VjdGlvbiBjb3VudCBhcyBhcmd1bWVudCB0byBmaWxsX3NlY3Rpb25fcHRyKCkuICAqLwotICBwcml2X3NlY3Rpb25fY291bnQgPSBQUklWKHNlY3Rpb25fY291bnQpOwotICBiZmRfaGFzaF90cmF2ZXJzZSAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgZmlsbF9zZWN0aW9uX3B0ciwKLQkJICAgIChQVFIpKFBSSVYoc2VjdGlvbnMpKSk7Ci0KLSAgUFJJVihmaXh1cF9kb25lKSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogQ2hlY2sgdGhlIGZvcm1hdCBmb3IgYSBmaWxlIGJlaW5nIHJlYWQuCi0gICBSZXR1cm4gYSAoYmZkX3RhcmdldCAqKSBpZiBpdCdzIGFuIG9iamVjdCBmaWxlIG9yIHplcm8gaWYgbm90LiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICoKLXZtc19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgZXJyID0gMDsKLSAgaW50IHByZXZfdHlwZTsKLSAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWN0b3IgPSAwOwotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19vYmplY3RfcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKCF2bXNfaW5pdGlhbGl6ZSAoYWJmZCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAidm1zX2luaXRpYWxpemUgKCkgZmFpbGVkICEhXG4iKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDBMLCBTRUVLX1NFVCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBwcmV2X3R5cGUgPSAtMTsKLQotICBkbwotICAgIHsKLSNpZiBWTVNfREVCVUcKLSAgICAgIHZtc19kZWJ1ZyAoNywgInJlYWRpbmcgYXQgJTA4bHhcbiIsIGJmZF90ZWxsKGFiZmQpKTsKLSNlbmRpZgotICAgICAgaWYgKF9iZmRfdm1zX25leHRfcmVjb3JkIChhYmZkKSA8IDApCi0JewotI2lmIFZNU19ERUJVRwotCSAgdm1zX2RlYnVnICgyLCAibmV4dF9yZWNvcmQgZmFpbGVkXG4iKTsgICAgICAKLSNlbmRpZgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmICgocHJldl90eXBlID09IEVPQkpfU19DX0VHU0QpCi0JICAgJiYgKFBSSVYocmVjX3R5cGUpICE9IEVPQkpfU19DX0VHU0QpKQotCXsKLQkgIGlmICh2bXNfZml4dXBfc2VjdGlvbnMgKGFiZmQpID09IGZhbHNlKQotCSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0JICAgICAgdm1zX2RlYnVnICgyLCAidm1zX2ZpeHVwX3NlY3Rpb25zIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLQotICAgICAgcHJldl90eXBlID0gUFJJVihyZWNfdHlwZSk7Ci0KLSAgICAgIGlmICh0YXJnZXRfdmVjdG9yID09IDApCi0JewotCSAgaWYgKHByZXZfdHlwZSA8PSBPQkpfU19DX01BWFJFQ1RZUCkKLQkgICAgdGFyZ2V0X3ZlY3RvciA9ICZ2bXNfdmF4X3ZlYzsKLQkgIGVsc2UKLQkgICAgdGFyZ2V0X3ZlY3RvciA9ICZ2bXNfYWxwaGFfdmVjOwotCX0KLQotICAgICAgc3dpdGNoIChwcmV2X3R5cGUpCi0JewotCSAgY2FzZSBPQkpfU19DX0hEUjoKLQkgIGNhc2UgRU9CSl9TX0NfRU1IOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9oZHIgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX0VPTToKLQkgIGNhc2UgT0JKX1NfQ19FT01XOgotCSAgY2FzZSBFT0JKX1NfQ19FRU9NOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9lb20gKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX0dTRDoKLQkgIGNhc2UgRU9CSl9TX0NfRUdTRDoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfZ3NkIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19USVI6Ci0JICBjYXNlIEVPQkpfU19DX0VUSVI6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX3RpciAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfREJHOgotCSAgY2FzZSBFT0JKX1NfQ19FREJHOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9kYmcgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX1RCVDoKLQkgIGNhc2UgRU9CSl9TX0NfRVRCVDoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfdGJ0IChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19MTks6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2xuayAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBlcnIgPSAtMTsKLQl9Ci0gICAgICBpZiAoZXJyICE9IDApCi0JewotI2lmIFZNU19ERUJVRwotCSAgdm1zX2RlYnVnICgyLCAic2x1cnAgdHlwZSAlZCBmYWlsZWQgd2l0aCAlZFxuIiwgcHJldl90eXBlLCBlcnIpOwotI2VuZGlmCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gIHdoaWxlICgocHJldl90eXBlICE9IEVPQkpfU19DX0VFT00pICYmIChwcmV2X3R5cGUgIT0gT0JKX1NfQ19FT00pICYmIChwcmV2X3R5cGUgIT0gT0JKX1NfQ19FT01XKSk7Ci0KLSAgaWYgKHRhcmdldF92ZWN0b3IgPT0gJnZtc192YXhfdmVjKQotICAgIHsKLSAgICAgIGlmICh2bXNfZml4dXBfc2VjdGlvbnMgKGFiZmQpID09IGZhbHNlKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMiwgInZtc19maXh1cF9zZWN0aW9ucyBmYWlsZWRcbiIpOwotI2VuZGlmCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogc2V0IGFyY2hfaW5mbyB0byB2YXggICovCi0gCi0gICAgICBhcmNoID0gYmZkX3NjYW5fYXJjaCAoInZheCIpOwotICAgICAgUFJJViAoaXNfdmF4KSA9IDE7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDIsICJhcmNoIGlzIHZheFxuIik7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UgaWYgKHRhcmdldF92ZWN0b3IgPT0gJnZtc19hbHBoYV92ZWMpCi0gICAgewotICAgICAgLyogc2V0IGFyY2hfaW5mbyB0byBhbHBoYSAgKi8KLSAKLSAgICAgIGFyY2ggPSBiZmRfc2Nhbl9hcmNoICgiYWxwaGEiKTsKLSAgICAgIFBSSVYgKGlzX3ZheCkgPSAwOwotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgyLCAiYXJjaCBpcyBhbHBoYVxuIik7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKGFyY2ggPT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDIsICJhcmNoIG5vdCBmb3VuZFxuIik7Ci0jZW5kaWYKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBhYmZkLT5hcmNoX2luZm8gPSBhcmNoOwotCi0gIHJldHVybiB0YXJnZXRfdmVjdG9yOwotfQotCi0KLS8qIENoZWNrIHRoZSBmb3JtYXQgZm9yIGEgZmlsZSBiZWluZyByZWFkLgotICAgUmV0dXJuIGEgKGJmZF90YXJnZXQgKikgaWYgaXQncyBhbiBhcmNoaXZlIGZpbGUgb3IgemVyby4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqCi12bXNfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2FyY2hpdmVfcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogU2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19ta29iamVjdCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKCF2bXNfaW5pdGlhbGl6ZSAoYWJmZCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAidm1zX2luaXRpYWxpemUgKCkgZmFpbGVkICEhXG4iKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICB7Ci0jaWZkZWYgX19WQVgKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSBiZmRfc2Nhbl9hcmNoICgidmF4Iik7Ci0jZWxzZQotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJhbHBoYSIpOwotI2VuZGlmCi0gICAgaWYgKGFyY2ggPT0gMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFyY2g7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBXcml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiwgYXQgYmZkX2Nsb3NlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3dyaXRlX29iamVjdF9jb250ZW50cyglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiAwKQkJCS8qIHdlIGhhdmUgc2VjdGlvbnMgKi8KLSAgICB7Ci0gICAgICBpZiAoUFJJVihpc192YXgpKQotCXsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9oZHIgKGFiZmQsIE9CSl9TX0NfSERSKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBPQkpfU19DX0dTRCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX3RpciAoYWJmZCwgT0JKX1NfQ19USVIpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIE9CSl9TX0NfVEJUKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBPQkpfU19DX0RCRykgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiAyNTUpCi0JICAgIHsKLQkgICAgICBpZiAoX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBPQkpfU19DX0VPTVcpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKF9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgT0JKX1NfQ19FT00pICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBFT0JKX1NfQ19FTUgpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9nc2QgKGFiZmQsIEVPQkpfU19DX0VHU0QpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90aXIgKGFiZmQsIEVPQkpfU19DX0VUSVIpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIEVPQkpfU19DX0VUQlQpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9kYmcgKGFiZmQsIEVPQkpfU19DX0VEQkcpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIEVPQkpfU19DX0VFT00pICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyotLSA0LjEsIGdlbmVyaWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHZtc19zZWN0aW9uICplcywgKmVzMTsKLSAgaW50IGk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nsb3NlX2FuZF9jbGVhbnVwKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgaWYgKGFiZmQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoUFJJVih2bXNfYnVmKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYodm1zX2J1ZikpOwotICAgICAgUFJJVih2bXNfYnVmKSA9IE5VTEw7Ci0gICAgfQotICBQUklWKGJ1Zl9zaXplKSA9IDA7Ci0KLSAgaWYgKFBSSVYob3V0cHV0X2J1ZikgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKG91dHB1dF9idWYpKTsKLSAgICAgIFBSSVYob3V0cHV0X2J1ZikgPSAwOwotICAgIH0KLQotICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKLSAgd2hpbGUgKHNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzZWMtPmNvbnRlbnRzKQotCWZyZWUgKHNlYy0+Y29udGVudHMpOwotICAgICAgc2VjID0gc2VjLT5uZXh0OwotICAgIH0KLQotICBpZiAoUFJJVihzZWN0aW9ucykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHNlY3Rpb25zKSk7Ci0gICAgICBQUklWKHNlY3Rpb25zKSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChQUklWKHZtc19zeW1ib2xfdGFibGUpKQotICAgIHsKLSAgICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkpOwotICAgICAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9IDA7Ci0gICAgfQotCi0gIGlmIChQUklWKHN0YWNrKSkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHN0YWNrKSk7Ci0gICAgICBQUklWKHN0YWNrKSA9IDA7Ci0gICAgfQotCi0gIGlmIChQUklWKGxvY2F0aW9uX3N0YWNrKSkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKGxvY2F0aW9uX3N0YWNrKSk7Ci0gICAgICBQUklWKGxvY2F0aW9uX3N0YWNrKSA9IDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBWTVNfU0VDVElPTl9DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGVzID0gUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaV07Ci0gICAgICB3aGlsZSAoZXMgIT0gTlVMTCkKLQl7Ci0JICBlczEgPSBlcy0+bmV4dDsKLQkgIGZyZWUgKGVzKTsKLQkgIGVzID0gZXMxOwotCX0KLSAgICAgIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldID0gTlVMTDsKLSAgIH0KLQotICBmcmVlIChhYmZkLT50ZGF0YS5hbnkpOwotICBhYmZkLT50ZGF0YS5hbnkgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfbmV3X3NlY3Rpb25faG9vayAoJXAsIFslZF0lcyksIGNvdW50ICVkXG4iLCBhYmZkLCBzZWN0aW9uLT5pbmRleCwgc2VjdGlvbi0+bmFtZSwgYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0jZW5kaWYKLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChhYmZkLCBzZWN0aW9uLCA0KTsKLQotICBpZiAoYWJmZC0+c2VjdGlvbl9jb3VudCA+IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0gICAgewotICAgICAgUFJJVihzZWN0aW9ucykgPSAoKGFzZWN0aW9uICoqKQotCQkJICAgIGJmZF9yZWFsbG9jIChQUklWKHNlY3Rpb25zKSwgYWJmZC0+c2VjdGlvbl9jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgICAgIGlmIChQUklWKHNlY3Rpb25zKSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIFBSSVYoc2VjdGlvbl9jb3VudCkgPSBhYmZkLT5zZWN0aW9uX2NvdW50OwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAic2VjdGlvbl9jb3VudDogJWRcbiIsIFBSSVYoc2VjdGlvbl9jb3VudCkpOwotI2VuZGlmCi0gIFBSSVYoc2VjdGlvbnMpW3NlY3Rpb24tPmluZGV4XSA9IHNlY3Rpb247Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNywgIiVkOiAlc1xuIiwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLgotICAgYnVmIHBvaW50cyB0byBhIGJ1ZmZlciBvZiBidWZfc2l6ZSBieXRlcyB0byBiZSBmaWxsZWQgd2l0aAotICAgc2VjdGlvbiBkYXRhIChzdGFydGluZyBhdCBvZmZzZXQgaW50byBzZWN0aW9uKSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgYnVmLCBvZmZzZXQsIGJ1Zl9zaXplKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGJ1ZiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaWxlX3B0ciBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBidWZfc2l6ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3NlY3Rpb25fY29udGVudHMoJXAsICVzLCAlcCwgb2ZmICVsZCwgc2l6ZSAlZClcbiIsCi0JCSBhYmZkLCBzZWN0aW9uLT5uYW1lLCBidWYsIG9mZnNldCwgKGludClidWZfc2l6ZSk7Ci0jZW5kaWYKLQotICAvKiBzaG91bGRuJ3QgYmUgY2FsbGVkLCBzaW5jZSBhbGwgc2VjdGlvbnMgYXJlIElOX01FTU9SWSAgKi8KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4KLSAgIGJ1ZiBwb2ludHMgdG8gYSBidWZmZXIgb2YgYnVmX3NpemUgYnl0ZXMgdG8gYmUgZmlsbGVkIHdpdGgKLSAgIHNlY3Rpb24gZGF0YSAoc3RhcnRpbmcgYXQgb2Zmc2V0IGludG8gc2VjdGlvbikgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IChhYmZkLCBzZWN0aW9uLCB3LCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3dpbmRvdyAqdyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaWxlX3B0ciBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KCVwLCAlcywgJXAsIG9mZiAlbGQsIGNvdW50ICVkKVxuIiwKLQkJIGFiZmQsIHNlY3Rpb24tPm5hbWUsIHcsIG9mZnNldCwgKGludCljb3VudCk7Ci0jZW5kaWYKLQotICAvKiBzaG91bGRuJ3QgYmUgY2FsbGVkLCBzaW5jZSBhbGwgc2VjdGlvbnMgYXJlIElOX01FTU9SWSAgKi8KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qLS0gUGFydCA0LjIsIGNvcHkgcHJpdmF0ZSBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQ2FsbGVkIHRvIGNvcHkgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChzcmMsIGRlc3QpCi0gICAgIGJmZCAqc3JjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqZGVzdCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSglcCwgJXApXG4iLCBzcmMsIGRlc3QpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIE1lcmdlIHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZQotICAgdGhlIG91dHB1dCBmaWxlIEJGRCBAdmFye29iZmR9IHdoZW4gbGlua2luZy4gIFJldHVybiA8PHRydWU+PgotICAgb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6Ci0KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotICAgICBOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCJ2bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoJXAsICVwKVxuIiwgaWJmZCwgb2JmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogU2V0IHByaXZhdGUgQkZEIGZsYWcgaW5mb3JtYXRpb24gaW4gdGhlIEJGRCBAdmFye2FiZmR9LgotICAgUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0gICByZXR1cm5zIGFyZToKLQotICAgbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0gICAgIE5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCJ2bXNfYmZkX3NldF9wcml2YXRlX2ZsYWdzKCVwLCAlbHgpXG4iLCBhYmZkLCAobG9uZylmbGFncyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoc3JjYmZkLCBzcmNzZWMsIGRzdGJmZCwgZHN0c2VjKQotICAgICBiZmQgKnNyY2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc3Jjc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqZHN0YmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpkc3RzZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKCVwLCAlcywgJXAsICVzKVxuIiwKLQkJIHNyY2JmZCwgc3Jjc2VjLT5uYW1lLCBkc3RiZmQsIGRzdHNlYy0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHN5bWJvbCBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bSwgb2JmZCwgb3N5bSkKLSAgICAgYmZkICppYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKmlzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKm9zeW0gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoJXAsICVzLCAlcCwgJXMpXG4iLAotCQkgaWJmZCwgaXN5bS0+bmFtZSwgb2JmZCwgb3N5bS0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qLS0gUGFydCA0LjMsIGNvcmUgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUmV0dXJuIGEgcmVhZC1vbmx5IHN0cmluZyBleHBsYWluaW5nIHdoaWNoIHByb2dyYW0gd2FzIHJ1bm5pbmcKLSAgIHdoZW4gaXQgZmFpbGVkIGFuZCBwcm9kdWNlZCB0aGUgY29yZSBmaWxlIGFiZmQuICAqLwotCi1zdGF0aWMgY2hhciAqCi12bXNfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBjYXVzZWQgdGhlIGNvcmUgZHVtcCB3aGljaAotICAgZ2VuZXJhdGVkIHRoZSBmaWxlIHRoZSBCRkQgYWJmZCBpcyBhdHRhY2hlZCB0by4gICovCi0KLXN0YXRpYyBpbnQKLXZtc19jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGNvcmUgZmlsZSBhdHRhY2hlZCB0byBjb3JlX2JmZCB3YXMgZ2VuZXJhdGVkCi0gICBieSBhIHJ1biBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIGF0dGFjaGVkIHRvIGV4ZWNfYmZkLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoYWJmZCwgYmJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqYmJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKCVwLCAlcClcbiIsIGFiZmQsIGJiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLSBQYXJ0IDQuNCwgYXJjaGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gYXJjaGl2ZSBtYXAuCi0gICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19zbHVycF9hcm1hcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLSAgIFJldHVybiBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLSAgIFJldHVybiBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0YWJsb2MsIHRhYmxlbiwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKip0YWJsb2MgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBUcnVuY2F0ZSB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIHRvIG1hdGNoIHN5c3RlbS1kZXBlbmRlbnQgcmVzdHJpY3Rpb25zICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqYXJoZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3RydW5jYXRlX2FybmFtZSglcCwgJXMsICVzKVxuIiwgYWJmZCwgcGF0aG5hbWUsIGFyaGRyKTsKLSNlbmRpZgotICByZXR1cm47Ci19Ci0KLQotLyogPz8/CXdyaXRlIGFyY2hpdmUgbWFwICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFyY2ggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IG9ybCAqbWFwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHN0cmlkeCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfd3JpdGVfYXJtYXAoJXAsICVkLCAlcCwgJWQgJWQpXG4iLAotCWFyY2gsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFyY2hpdmUgaGVhZGVyID8/PyAgKi8KLQotc3RhdGljIFBUUgotdm1zX3JlYWRfYXJfaGRyIChhYmZkKQotICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3JlYWRfYXJfaGRyKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIChQVFIpMDsKLX0KLQotCi0vKiBQcm92aWRlZCBhIEJGRCwgQHZhcnthcmNoaXZlfSwgY29udGFpbmluZyBhbiBhcmNoaXZlIGFuZCBOVUxMLCBvcGVuCi0gICBhbiBpbnB1dCBCRkQgb24gdGhlIGZpcnN0IGNvbnRhaW5lZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoYXQuCi0gICBTdWJzZXF1ZW50IGNhbGxzIHNob3VsZCBwYXNzIHRoZSBhcmNoaXZlIGFuZCB0aGUgcHJldmlvdXMgcmV0dXJuIHZhbHVlCi0gICB0byByZXR1cm4gYSBjcmVhdGVkIEJGRCB0byB0aGUgbmV4dCBjb250YWluZWQgZWxlbWVudC4KLSAgIE5VTEwgaXMgcmV0dXJuZWQgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZS4gICovCi0KLXN0YXRpYyBiZmQgKgotdm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgcHJldikKLSAgICAgYmZkICphcmNoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqcHJldiBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKCVwLCAlcClcbiIsIGFyY2gsIHByZXYpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBSZXR1cm4gdGhlIEJGRCB3aGljaCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBzeW1ib2wgaW4gQUJGRCBpbmRleGVkIGJ5Ci0gICBJTkRFWC4gIElOREVYIHNob3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgYmZkX2dldF9uZXh0X21hcGVudC4gICovCi0KLXN0YXRpYyBiZmQgKgotdm1zX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN5bWluZGV4IGluZGV4OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2VsdF9hdF9pbmRleCglcCwgJXApXG4iLCBhYmZkLCBpbmRleCk7Ci0jZW5kaWYKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4KGFiZmQsIGluZGV4KTsKLX0KLQotCi0vKiA/Pz8KLSAgIC0+IGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgICovCi0KLXN0YXRpYyBpbnQKLXZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIHN0YXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKnN0YXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQoJXAsICVwKVxuIiwgYWJmZCwgc3RhdCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCk7Ci19Ci0KLQotLyogVGhpcyBpcyBhIG5ldyBmdW5jdGlvbiBpbiBiZmQgMi41ICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKi0tIFBhcnQgNC41LCBzeW1ib2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYSB2ZWN0b3Igb2YgcG9pbnRlcnMKLSAgIHRvIGFzeW1ib2xzIGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIEJGRCBhYmZkLCBpbmNsdWRpbmcgYQotICAgdGVybWluYWwgTlVMTCBwb2ludGVyLiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBpbiB0aGUgQkZELAotICAgdGhlbiByZXR1cm4gMC4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKCVwKSwgJWQgc3ltYm9sc1xuIiwgYWJmZCwgUFJJVihnc2Rfc3ltX2NvdW50KSk7Ci0jZW5kaWYKLSAgcmV0dXJuIChQUklWKGdzZF9zeW1fY291bnQpKzEpICogc2l6ZW9mKGFzeW1ib2wgKik7Ci19Ci0KLQotLyogQ29weSBzeW1ib2xzIGZyb20gaGFzaCB0YWJsZSB0byBzeW1ib2wgdmVjdG9yCi0KLSAgIGNhbGxlZCBmcm9tIGJmZF9oYXNoX3RyYXZlcnNlIGluIHZtc19nZXRfc3ltdGFiCi0gICBpbml0IGNvdW50ZXIgdG8gMCBpZiBlbnRyeSA9PSAwICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29weV9zeW1ib2xzIChlbnRyeSwgYXJnKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBQVFIgYXJnOwotewotICBiZmQgKmFiZmQgPSAoYmZkICopIGFyZzsKLQotICBpZiAoZW50cnkgPT0gTlVMTCkJLyogaW5pdCBjb3VudGVyICovCi0gICAgUFJJVihzeW1udW0pID0gMDsKLSAgZWxzZQkJCS8qIGZpbGwgdmVjdG9yLCBpbmMgY291bnRlciAqLwotICAgIFBSSVYoc3ltY2FjaGUpW1BSSVYoc3ltbnVtKSsrXSA9ICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFJlYWQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZEIGFiZmQsIGFuZCBmaWxscyBpbiB0aGUgdmVjdG9yCi0gICBsb2NhdGlvbiB3aXRoIHBvaW50ZXJzIHRvIHRoZSBzeW1ib2xzIGFuZCBhIHRyYWlsaW5nIE5VTEwuCi0KLSAgIHJldHVybiAjIG9mIHN5bWJvbHMgcmVhZCAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfc3ltdGFiIChhYmZkLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3N5bXRhYiglcCwgPHJldD4pXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0JLyogaW5pdCBjb3VudGVyICovCi0gICh2b2lkKWNvcHlfc3ltYm9scygoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopMCwgYWJmZCk7Ci0KLQkvKiB0cmF2ZXJzZSB0YWJsZSBhbmQgZmlsbCBzeW1ib2xzIHZlY3RvciAqLwotCi0gIFBSSVYoc3ltY2FjaGUpID0gc3ltYm9sczsKLSAgYmZkX2hhc2hfdHJhdmVyc2UoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgY29weV9zeW1ib2xzLCAoUFRSKWFiZmQpOwotCi0gIHN5bWJvbHNbUFJJVihnc2Rfc3ltX2NvdW50KV0gPSBOVUxMOwotCi0gIHJldHVybiBQUklWKGdzZF9zeW1fY291bnQpOwotfQotCi0KLS8qIENyZWF0ZSBhIG5ldyBhc3ltYm9sIHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBhYmZkIGFuZCByZXR1cm4gYSBwb2ludGVyCi0gICB0byBpdC4KLSAgIFRoaXMgcm91dGluZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBlYWNoIGJhY2sgZW5kIGhhcyBwcml2YXRlIGluZm9ybWF0aW9uCi0gICBzdXJyb3VuZGluZyB0aGUgYXN5bWJvbC4gQnVpbGRpbmcgeW91ciBvd24gYXN5bWJvbCBhbmQgcG9pbnRpbmcgdG8gaXQKLSAgIHdpbGwgbm90IGNyZWF0ZSB0aGUgcHJpdmF0ZSBpbmZvcm1hdGlvbiwgYW5kIHdpbGwgY2F1c2UgcHJvYmxlbXMgbGF0ZXIgb24uICAqLwotCi1hc3ltYm9sICoKLV9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKnN5bWJvbCA9IChhc3ltYm9sICopYmZkX3phbGxvYyhhYmZkLCBzaXplb2YoYXN5bWJvbCkpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgIl9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBpZiAoc3ltYm9sID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHN5bWJvbC0+dGhlX2JmZCA9IGFiZmQ7Ci0KLSAgcmV0dXJuIHN5bWJvbDsKLX0KLQotCi0vKiBQcmludCBzeW1ib2wgdG8gZmlsZSBhY2NvcmRpbmcgdG8gaG93LiBob3cgaXMgb25lIG9mCi0gICBiZmRfcHJpbnRfc3ltYm9sX25hbWUJanVzdCBwcmludCB0aGUgbmFtZQotICAgYmZkX3ByaW50X3N5bWJvbF9tb3JlCXByaW50IG1vcmUgKD8/PykKLSAgIGJmZF9wcmludF9zeW1ib2xfYWxsCXByaW50IGFsbCB3ZSBrbm93LCB3aGljaCBpcyBub3QgbXVjaCByaWdodCBub3cgOi0pICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX3ByaW50X3N5bWJvbCAoYWJmZCwgZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfcHJpbnRfc3ltYm9sKCVwLCAlcCwgJXAsICVkKVxuIiwgYWJmZCwgZmlsZSwgc3ltYm9sLCBob3cpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLQlmcHJpbnRmKChGSUxFICopZmlsZSwiICVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLQl7Ci0JICBDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQkgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoKFBUUilmaWxlLHN5bWJvbCk7Ci0KLQkgIGZwcmludGYoKEZJTEUgKilmaWxlLCIgJS04cyAlcyIsIHNlY3Rpb25fbmFtZSwgc3ltYm9sLT5uYW1lKTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCBpbiByZXQuCi0KLSAgIGZpbGwgdHlwZSwgdmFsdWUgYW5kIG5hbWUKLSAgIHR5cGU6Ci0JQQlhYnNvbHV0ZQotCUIJYnNzIHNlZ21lbnQgc3ltYm9sCi0JQwljb21tb24gc3ltYm9sCi0JRAlkYXRhIHNlZ21lbnQgc3ltYm9sCi0JZglmaWxlbmFtZQotCXQJYSBzdGF0aWMgZnVuY3Rpb24gc3ltYm9sCi0JVAl0ZXh0IHNlZ21lbnQgc3ltYm9sCi0JVQl1bmRlZmluZWQKLQktCWRlYnVnICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zeW1ib2xfaW5mbyglcCwgJXAsICVwKVxuIiwgYWJmZCwgc3ltYm9sLCByZXQpOwotI2VuZGlmCi0KLSAgc2VjID0gc3ltYm9sLT5zZWN0aW9uOwotCi0gIGlmIChyZXQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnQyc7Ci0gIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnQSc7Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnVSc7Ci0gIGVsc2UgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnSSc7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKQotICAgIHJldC0+dHlwZSA9ICdUJzsKLSAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0RBVEEpCi0gICAgcmV0LT50eXBlID0gJ0QnOwotICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpCi0gICAgcmV0LT50eXBlID0gJ0InOwotICBlbHNlCi0gICAgcmV0LT50eXBlID0gJy0nOwotCi0gIGlmIChyZXQtPnR5cGUgIT0gJ1UnKQotICAgIHJldC0+dmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWE7Ci0gIGVsc2UKLSAgICByZXQtPnZhbHVlID0gMDsKLSAgcmV0LT5uYW1lID0gc3ltYm9sLT5uYW1lOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ltYm9sIHN5bSBpbiB0aGUgQkZEIGFiZmQgaXMKLSAgIGEgY29tcGlsZXIgZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLCBlbHNlIHJldHVybiBmYWxzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoJXAsICVzKVxuIiwgYWJmZCwgbmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJyQnOwotfQotCi0KLS8qIEdldCBzb3VyY2UgbGluZSBudW1iZXIgZm9yIHN5bWJvbCAgKi8KLQotc3RhdGljIGFsZW50ICoKLXZtc19nZXRfbGluZW5vIChhYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9saW5lbm8oJXAsICVwKVxuIiwgYWJmZCwgc3ltYm9sKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlIGFuZAotICAgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUgd2FudGVkCi0gICBsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZSwgZnVuYywgbGluZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZmluZF9uZWFyZXN0X2xpbmUoJXAsICVzLCAlcCwgJWxkLCA8cmV0PiwgPHJldD4sIDxyZXQ+KVxuIiwKLQkgICAgICBhYmZkLCBzZWN0aW9uLT5uYW1lLCBzeW1ib2xzLCAobG9uZyBpbnQpb2Zmc2V0KTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLSAgIHdoaWxlIHVzaW5nIEJGRCBmb3IgZXZlcnl0aGluZyBlbHNlLiAgQ3VycmVudGx5IHVzZWQgYnkgdGhlIGFzc2VtYmxlcgotICAgd2hlbiBjcmVhdGluZyBDT0ZGIGZpbGVzLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotdm1zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCAoYWJmZCwgcHRyLCBzaXplKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdm9pZCAqcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sKCVwLCAlcCwgJWxkKVxuIiwgYWJmZCwgcHRyLCBzaXplKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZWFkIG1pbmlzeW1ib2xzLiAgRm9yIG1pbmlzeW1ib2xzLCB3ZSB1c2UgdGhlIHVubW9kaWZpZWQgYS5vdXQKLSAgIHN5bWJvbHMuICBUaGUgbWluaXN5bWJvbF90b19zeW1ib2wgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGVzZSBpbnRvCi0gICBCRkQgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSICptaW5pc3ltc3A7Ci0gICAgIHVuc2lnbmVkIGludCAqc2l6ZXA7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19yZWFkX21pbmlzeW1ib2xzKCVwLCAlZCwgJXAsICVkKVxuIiwgYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCAqc2l6ZXApOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7Ci19Ci0KLS8qIENvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgQkZEIGFzeW1ib2wuICBBIG1pbmlzeW1ib2wgaXMganVzdCBhbgotICAgdW5tb2RpZmllZCBhLm91dCBzeW1ib2wuICBUaGUgU1lNIGFyZ3VtZW50IGlzIGEgc3RydWN0dXJlIHJldHVybmVkCi0gICBieSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wsIHdoaWNoIHdlIGZpbGwgaW4gaGVyZS4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXZtc19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgY29uc3QgUFRSIG1pbmlzeW07Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX21pbmlzeW1ib2xfdG9fc3ltYm9sKCVwLCAlZCwgJXAsICVwKVxuIiwgYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKTsKLSNlbmRpZgotICByZXR1cm4gX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pOwotfQotCi0vKi0tIFBhcnQgNC42LCByZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uCi0gICBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbiBzZWN0IGF0dGFjaGVkIHRvIGJmZCBhYmZkLgotICAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gLTEuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfcmVsb2NfdXBwZXJfYm91bmQoJXAsICVzKVxuIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIC0xTDsKLX0KLQotCi0vKiBDYWxsIHRoZSBiYWNrIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gQkZEIGFiZmQgYW5kIHRyYW5zbGF0ZSB0aGUKLSAgIGV4dGVybmFsIGZvcm0gb2YgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gc2VjIGludG8gdGhlCi0gICBpbnRlcm5hbCBjYW5vbmljYWwgZm9ybS4gIFBsYWNlIHRoZSB0YWJsZSBpbnRvIG1lbW9yeSBhdCBsb2MsIHdoaWNoIGhhcwotICAgYmVlbiBwcmVhbGxvY2F0ZWQsIHVzdWFsbHkgYnkgYSBjYWxsIHRvIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQuCi0gICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVsb2NzLCBvciAtMSBvbiBlcnJvci4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgc3ltYm9scykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKipsb2NhdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY2Fub25pY2FsaXplX3JlbG9jKCVwLCAlcywgPHJldD4sIDxyZXQ+KVxuIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiB0aGlzIGlzIGp1c3QgY29waWVkIGZyb20gZWNvZmYtYWxwaGEsIG5lZWRzIHRvIGJlIGZpeGVkIHByb2JhYmx5ICovCi0KLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmVsb2NfbmlsIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBzZWMsIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAicmVsb2NfbmlsKGFiZmQgJXAsIG91dHB1dF9iZmQgJXApXG4iLCBhYmZkLCBvdXRwdXRfYmZkKTsKLSAgdm1zX2RlYnVnICgyLCAiSW4gc2VjdGlvbiAlcywgc3ltYm9sICVzXG4iLAotCXNlYy0+bmFtZSwgc3ltLT5uYW1lKTsKLSAgdm1zX2RlYnVnICgyLCAicmVsb2Mgc3ltICVzLCBhZGRyICUwOGx4LCBhZGRlbmQgJTA4bHgsIHJlbG9jIGlzIGEgJXNcbiIsCi0JCXJlbG9jLT5zeW1fcHRyX3B0clswXS0+bmFtZSwKLQkJKHVuc2lnbmVkIGxvbmcpcmVsb2MtPmFkZHJlc3MsCi0JCSh1bnNpZ25lZCBsb25nKXJlbG9jLT5hZGRlbmQsIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gIHZtc19kZWJ1ZyAoMiwgImRhdGEgYXQgJXBcbiIsIGRhdGEpOwotLyogIF9iZmRfaGV4ZHVtcCAoMiwgZGF0YSwgYmZkX2dldF9yZWxvY19zaXplKHJlbG9jLT5ob3d0byksMCk7ICovCi0jZW5kaWYKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRlFVQUQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQlJBRERSIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIYWNrLiBMaW5rYWdlIGlzIGRvbmUgYnkgbGlua2VyLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElOS0FHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgOCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjU2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElOS0FHRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgcHJvY2VkdXJlLCB3cml0dGVuIGFzIDMyIGJpdCB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0NPREVBRERSLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJDT0RFQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgaG93dG8gc3RydWN0dXJlIHdoaWNoLCB3aGVuIGludm9rZWQsIHdpbGwgcGVyZm9ybQotICAgdGhlIHJlbG9jYXRpb24gY29kZSBvbiBkYXRhIGZyb20gdGhlIGFyY2hpdGVjdHVyZSBub3RlZC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLXZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IGFscGhhX3R5cGU7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9yZWxvY190eXBlX2xvb2t1cCglcCwgJWQpXHQiLCBhYmZkLCBjb2RlKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18xNjoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1JFRkxPTkc7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfNjQ6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOglhbHBoYV90eXBlID0gQUxQSEFfUl9CUkFERFI7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfSElOVDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwzMjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ182NF9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUw2NDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOglhbHBoYV90eXBlID0gQUxQSEFfUl9MSU5LQUdFOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOglhbHBoYV90eXBlID0gQUxQSEFfUl9DT0RFQUREUjsJYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoInJlbG9jICglZCkgaXMgKlVOS05PV04qIiwgY29kZSk7Ci0JcmV0dXJuIChjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIE5VTEw7Ci0gICAgfQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJyZWxvYyBpcyAlc1xuIiwgYWxwaGFfaG93dG9fdGFibGVbYWxwaGFfdHlwZV0ubmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuICZhbHBoYV9ob3d0b190YWJsZVthbHBoYV90eXBlXTsKLX0KLQotCi0vKi0tIFBhcnQgNC43LCB3cml0aW5nIGFuIG9iamVjdCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgaW4gQkZEIGFiZmQgdG8gYXJjaCBhbmQgbWFjaC4KLSAgIEZpbmQgdGhlIGNvcnJlY3QgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGFyY2hfaW5mbwotICAgcG9pbnRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2ggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9hcmNoX21hY2goJXAsICVkLCAlbGQpXG4iLCBhYmZkLCBhcmNoLCBtYWNoKTsKLSNlbmRpZgotICBhYmZkLT5hcmNoX2luZm8gPSBiZmRfc2Nhbl9hcmNoKCJhbHBoYSIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHNlY3Rpb24gaW4gQkZEIGFiZmQgdG8gdGhlIGRhdGEgc3RhcnRpbmcKLSAgIGluIG1lbW9yeSBhdCBkYXRhLiBUaGUgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGFydGluZyBhdAotICAgb2Zmc2V0IG9mZnNldCBmb3IgY291bnQgYnl0ZXMuCi0KLSAgIE5vcm1hbGx5IHRydWUgaXMgcmV0dXJuZWQsIGVsc2UgZmFsc2UuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotICAgbyBiZmRfZXJyb3Jfbm9fY29udGVudHMgLSBUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUKLQlTRUNfSEFTX0NPTlRFTlRTIGF0dHJpYnV0ZSwgc28gbm90aGluZyBjYW4gYmUgd3JpdHRlbiB0byBpdC4KLSAgIG8gYW5kIHNvbWUgbW9yZSB0b28gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9zZWN0aW9uX2NvbnRlbnRzKCVwLCBzZWMgJXMsIGxvYyAlcCwgb2ZmICVsZCwgY291bnQgJWQpXG4iLAotCQkJCQlhYmZkLCBzZWN0aW9uLT5uYW1lLCBsb2NhdGlvbiwgKGxvbmcgaW50KW9mZnNldCwgKGludCljb3VudCk7Ci0gIHZtc19kZWJ1ZyAoMiwgInNlY3JhdyAlZCwgc2VjY29va2VkICVkXG4iLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSwgKGludClzZWN0aW9uLT5fY29va2VkX3NpemUpOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpOwotfQotCi0KLS8qLS0gUGFydCA0LjgsIGxpbmtlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgaW50Ci12bXNfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiByZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2l6ZW9mX2hlYWRlcnMoJXAsICVzKVxuIiwgYWJmZCwgKHJlbG9jKT8iVHJ1ZSI6IkZhbHNlIik7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBvZiByZWxvY2F0aW9uIGVmZm9ydCBmb3IgYmFjayBlbmRzCi0gICB3aGljaCBjYW4ndCBiZSBib3RoZXJlZCB0byBkbyBpdCBlZmZpY2llbnRseS4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi12bXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX2J5dGUgKmRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMoJXAsICVwLCAlcCwgJXAsICVzLCAlcClcbiIsCi0JCQlhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsIChyZWxvY2F0ZWFibGUpPyJUcnVlIjoiRmFsc2UiLCBzeW1ib2xzKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiA/Pz8gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gKmFnYWluIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfcmVsYXhfc2VjdGlvbiglcCwgJXMsICVwLCA8cmV0PilcbiIsCi0JCQkJCWFiZmQsIHNlY3Rpb24tPm5hbWUsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2djX3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZ2Nfc2VjdGlvbnMoJXAsICVwKVxuIiwgYWJmZCwgbGlua19pbmZvKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDcmVhdGUgYSBoYXNoIHRhYmxlIGZvciB0aGUgbGlua2VyLiAgRGlmZmVyZW50IGJhY2tlbmRzIHN0b3JlCi0gICBkaWZmZXJlbnQgaW5mb3JtYXRpb24gaW4gdGhpcyB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi12bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIERvIGEgbGluayBiYXNlZCBvbiB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIGVhY2gKLSAgIHNlY3Rpb24gb2YgdGhlIEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9maW5hbF9saW5rKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbGlua19zcGxpdF9zZWN0aW9uKCVwLCAlcylcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLSBQYXJ0IDQuOSwgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIGZpbGUpCi0gICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgdm9pZCAqZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIoJXAsIDxyZXQ+KVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDBMOwotfQotCi0KLS8qIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMEw7Ci19Ci0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBhcmVsLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqKmFyZWwgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDBMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy5oIGIvYmZkL3Ztcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQzOTg2Li4wMDAwMDAwCi0tLSBhL2JmZC92bXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0jdW5kZWYgdm1zCi0vKiB2bXMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVk1TIChBbHBoYSBhbmQgVmF4KSBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFZNU19ICi0jZGVmaW5lIFZNU19ICi0KLQotLyogQ29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggJ0V4eHhfJyBhcmUgZm9yIG9wZW5WTVMvQWxwaGEgKEVWQVggb2JqZWN0IGxhbmd1YWdlKSAgKi8KLQotLyogVk1TIFRleHQsIGluZm9ybWF0aW9uIGFuZCByZWxvY2F0aW9uIHJlY29yZCAoVElSL0VUSVIpIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBUSVJfU19DX1NUQV9HQkwJCTAKLSNkZWZpbmUgVElSX1NfQ19TVEFfU0IJCTEKLSNkZWZpbmUgVElSX1NfQ19TVEFfU1cJCTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFcJCTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEIJCTQKLSNkZWZpbmUgVElSX1NfQ19TVEFfUFcJCTUKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEwJCTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfVUIgIAk3Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1VXICAJOAotI2RlZmluZSBUSVJfU19DX1NUQV9CRkkgCTkKLSNkZWZpbmUgVElSX1NfQ19TVEFfV0ZJIAkxMAotI2RlZmluZSBUSVJfU19DX1NUQV9MRkkgCTExCi0jZGVmaW5lIFRJUl9TX0NfU1RBX0VQTSAJMTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfQ0tBUkcgICAgICAgMTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfV1BCIAkxNAotI2RlZmluZSBUSVJfU19DX1NUQV9XUFcgCTE1Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1dQTCAJMTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFNZIAkxNwotI2RlZmluZSBUSVJfU19DX1NUQV9MSVQgCTE4Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX0xFUE0gICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUFYU1RBQ09EICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUlOU1RPQ09EICAgICAgIDIwCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1NCICAJMjAKLSNkZWZpbmUgVElSX1NfQ19TVE9fU1cgIAkyMQotI2RlZmluZSBUSVJfU19DX1NUT19MICAgCTIyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX0xXICAJMjIKLSNkZWZpbmUgVElSX1NfQ19TVE9fQkQgIAkyMwotI2RlZmluZSBUSVJfU19DX1NUT19XRCAgCTI0Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX0xEICAJMjUKLSNkZWZpbmUgVElSX1NfQ19TVE9fTEkgIAkyNgotI2RlZmluZSBUSVJfU19DX1NUT19QSURSICAgICAgICAyNwotI2RlZmluZSBUSVJfU19DX1NUT19QSUNSICAgICAgICAyOAotI2RlZmluZSBUSVJfU19DX1NUT19SU0IgCTI5Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JTVyAJMzAKLSNkZWZpbmUgVElSX1NfQ19TVE9fUkwgIAkzMQotI2RlZmluZSBUSVJfU19DX1NUT19WUFMgCTMyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1VTQiAJMzMKLSNkZWZpbmUgVElSX1NfQ19TVE9fVVNXIAkzNAotI2RlZmluZSBUSVJfU19DX1NUT19SVUIgCTM1Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JVVyAJMzYKLSNkZWZpbmUgVElSX1NfQ19TVE9fQiAgIAkzNwotI2RlZmluZSBUSVJfU19DX1NUT19XICAgCTM4Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JCICAJMzkKLSNkZWZpbmUgVElSX1NfQ19TVE9fUlcgIAk0MAotI2RlZmluZSBUSVJfU19DX1NUT19SSVZCICAgICAgICA0MQotI2RlZmluZSBUSVJfU19DX1NUT19QSVJSICAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01BWFNUT0NPRCAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01JTk9QUkNPRCAgICAgICA1MAotI2RlZmluZSBUSVJfU19DX09QUl9OT1AgCTUwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FERCAJNTEKLSNkZWZpbmUgVElSX1NfQ19PUFJfU1VCIAk1MgotI2RlZmluZSBUSVJfU19DX09QUl9NVUwgCTUzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0RJViAJNTQKLSNkZWZpbmUgVElSX1NfQ19PUFJfQU5EIAk1NQotI2RlZmluZSBUSVJfU19DX09QUl9JT1IgCTU2Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0VPUiAJNTcKLSNkZWZpbmUgVElSX1NfQ19PUFJfTkVHIAk1OAotI2RlZmluZSBUSVJfU19DX09QUl9DT00gCTU5Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0lOU1YgICAgICAgIDYwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FTSCAJNjEKLSNkZWZpbmUgVElSX1NfQ19PUFJfVVNIIAk2MgotI2RlZmluZSBUSVJfU19DX09QUl9ST1QgCTYzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX1NFTCAJNjQKLSNkZWZpbmUgVElSX1NfQ19PUFJfUkVERUYgICAgICAgNjUKLSNkZWZpbmUgVElSX1NfQ19PUFJfREZMSVQgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NQVhPUFJDT0QgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NSU5DVExDT0QgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfU0VUUkIgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfQVVHUkIgICAgICAgODEKLSNkZWZpbmUgVElSX1NfQ19DVExfREZMT0MgICAgICAgODIKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RMT0MgICAgICAgODMKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RLREwgICAgICAgODQKLSNkZWZpbmUgVElSX1NfQ19NQVhDVExDT0QgICAgICAgODQKLQotI2RlZmluZSBFVElSX1NfQ19NSU5TVEFDT0QgMAkJLyogTWluaW11bSBzdG9yZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfR0JMIDAJCS8qIFN0YWNrIGdsb2JhbCBzeW1ib2wgdmFsdWUJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX0xXIDEJCS8qIFN0YWNrIGxvbmd3b3JkCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfUVcgMgkJLyogU3RhY2sgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9QUSAzCQkvKiBTdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0ICAqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfTEkgNAkJLyogU3RhY2sgbGl0ZXJhbAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX01PRCA1CQkvKiBTdGFjayBtb2R1bGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfQ0tBUkcgNgkJLyogQ2hlY2sgQXJndW1lbnRzCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhTVEFDT0QgNgkJLyogTWF4aW11bSBzdGFjayBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19NSU5TVE9DT0QgNTAJCS8qIE1pbmltdW0gc3RvcmUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0IgNTAJCS8qIFN0b3JlIGJ5dGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fVyA1MQkJLyogU3RvcmUgd29yZAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19MVyA1MgkJLyogU3RvcmUgbG9uZ3dvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19RVyA1MwkJLyogU3RvcmUgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19JTU1SIDU0CQkvKiBTdG9yZSBpbW1lZGlhdGUgUmVwZWF0ZWQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0dCTCA1NQkJLyogU3RvcmUgZ2xvYmFsCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0NBIDU2CQkvKiBTdG9yZSBjb2RlIGFkZHJlc3MJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19SQiA1NwkJLyogU3RvcmUgcmVsYXRpdmUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19BQiA1OAkJLyogU3RvcmUgYWJzb2x1dGUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19PRkYgNTkJCS8qIFN0b3JlIG9mZnNldCB3aXRoaW4gcHNlY3QJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0lNTSA2MQkJLyogU3RvcmUgaW1tZWRpYXRlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fR0JMX0xXIDYyCQkvKiBTdG9yZSBnbG9iYWwgTG9uZ3dvcmQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0xQX1BTQiA2MwkJLyogU1RPX0xQX1BTQiBub3QgdmFsaWQgaW4gbGV2ZWwgMiB1c2UgU1RDX0xQX1BTQgkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19ISU5UX0dCTCA2NAkvKiBTdG9yZSAxNCBiaXQgSElOVCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fSElOVF9QUyA2NQkJLyogU3RvcmUgMTQgYml0IEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RPQ09EIDY1CQkvKiBNYXhpbXVtIHN0b3JlIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX01JTk9QUkNPRCAxMDAJCS8qIE1pbmltdW0gb3BlcmF0ZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfTk9QIDEwMAkJLyogTm8tb3AJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQUREIDEwMQkJLyogQWRkCQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9TVUIgMTAyCQkvKiBTdWJ0cmFjdAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9NVUwgMTAzCQkvKiBNdWx0aXBseQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9ESVYgMTA0CQkvKiBEaXZpZGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQU5EIDEwNQkJLyogTG9naWNhbCBBTkQJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfSU9SIDEwNgkJLyogTG9naWNhbCBpbmNsdXNpdmUgT1IJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9FT1IgMTA3CQkvKiBMb2dpY2FsIGV4Y2x1c2l2ZSBPUgkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX05FRyAxMDgJCS8qIE5lZ2F0ZQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9DT00gMTA5CQkvKiBDb21wbGVtZW50CQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0lOU1YgMTEwCQkvKiBJbnNlcnQgYml0IGZpZWxkCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQVNIIDExMQkJLyogQXJpdGhtZXRpYyBzaGlmdAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1VTSCAxMTIJCS8qIFVuc2lnbmVkIHNoaWZ0CQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfUk9UIDExMwkJLyogUm90YXRlCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1NFTCAxMTQJCS8qIFNlbGVjdCBvbmUgb2YgdGhyZWUgbG9uZ3dvcmRzIG9uIHRvcCBvZiBzdGFjayAgKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1JFREVGIDExNQkJLyogUmVkZWZpbmUgdGhpcyBzeW1ib2wgYWZ0ZXIgcGFzcyAyICAqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfREZMSVQgMTE2CQkvKiBEZWZpbmUgYSBsaXRlcmFsCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhPUFJDT0QgMTE2CQkvKiBNYXhpbXVtIG9wZXJhdGUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOQ1RMQ09EIDE1MAkJLyogTWluaW11bSBjb250cm9sIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TRVRSQiAxNTAJCS8qIFNldCByZWxvY2F0aW9uIGJhc2UJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9BVUdSQiAxNTEJCS8qIEF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9ERkxPQyAxNTIJCS8qIERlZmluZSBkZWJ1ZyBsb2NhdGlvbgkqLwotI2RlZmluZSBFVElSX1NfQ19DVExfU1RMT0MgMTUzCQkvKiBTZXQgZGVidWcgbG9jYXRpb24JCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TVEtETCAxNTQJCS8qIFN0YWNrIGRlYnVnIGxvY2F0aW9uCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhDVExDT0QgMTU0CQkvKiBNYXhpbXVtIGNvbnRyb2wgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOU1RDQ09EIDIwMAkJLyogTWluaW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19MUCAyMDAJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpciAgICAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTFBfUFNCIDIwMQkJLyogU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZSAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0JMIDIwMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0NBIDIwMwkJLyogU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19QUyAyMDQJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX05PUF9HQkwgMjA1CS8qIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBhZGRyZXNzIG9mIGdsb2JhbCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTk9QX1BTIDIwNgkJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0JTUl9HQkwgMjA3CS8qIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQlNSX1BTIDIwOAkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0xEQV9HQkwgMjA5CS8qIFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTERBX1BTIDIxMAkJLyogU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IHBzZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19CT0hfR0JMIDIxMQkvKiBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQk9IX1BTIDIxMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTkJIX0dCTCAyMTMJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19OQkhfUFMgMjE0CQkvKiBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RDQ09EIDIxNAkJLyogTWF4aW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0KLS8qIFZNUyBHbG9iYWwgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkIChHU0QvRUdTRCkuICAqLwotCi0jZGVmaW5lIEdTRF9TX0tfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfUFNDICAgICAwCi0jZGVmaW5lIEdTRF9TX0NfU1lNICAgICAxCi0jZGVmaW5lIEdTRF9TX0NfRVBNICAgICAyCi0jZGVmaW5lIEdTRF9TX0NfUFJPICAgICAzCi0jZGVmaW5lIEdTRF9TX0NfU1lNVyAgICA0Ci0jZGVmaW5lIEdTRF9TX0NfRVBNVyAgICA1Ci0jZGVmaW5lIEdTRF9TX0NfUFJPVyAgICA2Ci0jZGVmaW5lIEdTRF9TX0NfSURDICAgICA3Ci0jZGVmaW5lIEdTRF9TX0NfRU5WICAgICA4Ci0jZGVmaW5lIEdTRF9TX0NfTFNZICAgICA5Ci0jZGVmaW5lIEdTRF9TX0NfTEVQTSAgICAxMAotI2RlZmluZSBHU0RfU19DX0xQUk8gICAgMTEKLSNkZWZpbmUgR1NEX1NfQ19TUFNDICAgIDEyCi0jZGVmaW5lIEdTRF9TX0NfU1lNViAgICAxMwotI2RlZmluZSBHU0RfU19DX0VQTVYgICAgMTQKLSNkZWZpbmUgR1NEX1NfQ19QUk9WICAgIDE1Ci0jZGVmaW5lIEdTRF9TX0NfTUFYUkVDVFlQICAgICAgIDE1Ci0KLSNkZWZpbmUgRUdTRF9TX0tfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfUFNDIDAJCS8qIFBzZWN0IGRlZmluaXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19TWU0gMQkJLyogU3ltYm9sIHNwZWNpZmljYXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19JREMgMgkJLyogUmFuZG9tIGVudGl0eSBjaGVjawkJCSovCi0jZGVmaW5lIEVHU0RfU19DX1NQU0MgNQkJLyogU2hhcmVhYmxlIGltYWdlIHBzZWN0IGRlZmluaXRpb24JKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNViA2CQkvKiBWZWN0b3JlZCAoZHVhbC12YWx1ZWQpIHZlcnNpb25zIG9mIFNZTSwgKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNTSA3CQkvKiBNYXNrZWQgdmVyc2lvbnMgb2YgU1lNLAkJKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNRyA4CQkvKiBFR1NUIC0gZ3N0IHZlcnNpb24gb2YgU1lNCQkqLwotI2RlZmluZSBFR1NEX1NfQ19NQVhSRUNUWVAgOAkvKiBNYXhpbXVtIGVudHJ5IHR5cGUgZGVmaW5lZAkJKi8KLQotI2RlZmluZSBHUFNfU19NX1BJQyAgICAgMQotI2RlZmluZSBHUFNfU19NX0xJQiAgICAgMgotI2RlZmluZSBHUFNfU19NX09WUiAgICAgNAotI2RlZmluZSBHUFNfU19NX1JFTCAgICAgOAotI2RlZmluZSBHUFNfU19NX0dCTCAgICAgMTYKLSNkZWZpbmUgR1BTX1NfTV9TSFIgICAgIDMyCi0jZGVmaW5lIEdQU19TX01fRVhFICAgICA2NAotI2RlZmluZSBHUFNfU19NX1JEICAgICAgMTI4Ci0jZGVmaW5lIEdQU19TX01fV1JUICAgICAyNTYKLSNkZWZpbmUgR1BTX1NfTV9WRUMgICAgIDUxMgotI2RlZmluZSBHUFNfU19LX05BTUUgICAgOQotI2RlZmluZSBHUFNfU19DX05BTUUgICAgOQotCi0jZGVmaW5lIEVHUFNfU19WX1BJQwkweDAwMDEKLSNkZWZpbmUgRUdQU19TX1ZfTElCCTB4MDAwMgotI2RlZmluZSBFR1BTX1NfVl9PVlIJMHgwMDA0Ci0jZGVmaW5lIEVHUFNfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdQU19TX1ZfR0JMCTB4MDAxMAotI2RlZmluZSBFR1BTX1NfVl9TSFIJMHgwMDIwCi0jZGVmaW5lIEVHUFNfU19WX0VYRQkweDAwNDAKLSNkZWZpbmUgRUdQU19TX1ZfUkQJMHgwMDgwCi0jZGVmaW5lIEVHUFNfU19WX1dSVAkweDAxMDAKLSNkZWZpbmUgRUdQU19TX1ZfVkVDCTB4MDIwMAotI2RlZmluZSBFR1BTX1NfVl9OT01PRAkweDA0MDAKLSNkZWZpbmUgRUdQU19TX1ZfQ09NCTB4MDgwMAotCi0jZGVmaW5lIEdTWV9TX01fV0VBSyAgICAxCi0jZGVmaW5lIEdTWV9TX01fREVGICAgICAyCi0jZGVmaW5lIEdTWV9TX01fVU5JICAgICA0Ci0jZGVmaW5lIEdTWV9TX01fUkVMICAgICA4Ci0KLSNkZWZpbmUgRUdTWV9TX1ZfV0VBSwkweDAwMDEKLSNkZWZpbmUgRUdTWV9TX1ZfREVGCTB4MDAwMgotI2RlZmluZSBFR1NZX1NfVl9VTkkJMHgwMDA0Ci0jZGVmaW5lIEVHU1lfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdTWV9TX1ZfQ09NTQkweDAwMTAKLSNkZWZpbmUgRUdTWV9TX1ZfVkVDRVAJMHgwMDIwCi0jZGVmaW5lIEVHU1lfU19WX05PUk0JMHgwMDQwCi0KLSNkZWZpbmUgTFNZX1NfTV9ERUYgICAgIDIKLSNkZWZpbmUgTFNZX1NfTV9SRUwgICAgIDgKLQotI2RlZmluZSBFTlZfU19NX0RFRiAgICAgMQotI2RlZmluZSBFTlZfU19NX05FU1RFRCAgMgotCi0vKgotICoJRGVidWdnZXIgc3ltYm9sIGRlZmluaXRpb25zOiAgVGhlc2UgYXJlIGRvbmUgYnkgaGFuZCwgYXMgbm8KLSAqCQkJCQltYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gc2VlbXMKLSAqCQkJCQl0byBiZSBhdmFpbGFibGUuCi0gKi8KLSNkZWZpbmUgRFNUX1NfQ19DCQkgIDcJLyogTGFuZ3VhZ2UgPT0gIkMiCSovCi0jZGVmaW5lIERTVF9TX0NfQ1hYCQkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCQkxNTMKLSNkZWZpbmUJRFNUX1NfQ19TT1VSQ0UJCTE1NQkvKiBTb3VyY2UgZmlsZQkJKi8KLSNkZWZpbmUgRFNUX1NfQ19QUk9MT0cJCTE2MgotI2RlZmluZQlEU1RfU19DX0JMS0JFRwkJMTc2CS8qIEJlZ2lubmluZyBvZiBibG9jawkqLwotI2RlZmluZQlEU1RfU19DX0JMS0VORAkJMTc3CS8qIEVuZCBvZiBibG9jawkqLwotI2RlZmluZSBEU1RfU19DX0VOVFJZCQkxODEKLSNkZWZpbmUgRFNUX1NfQ19QU0VDVAkJMTg0Ci0jZGVmaW5lCURTVF9TX0NfTElORV9OVU0JMTg1CS8qIExpbmUgTnVtYmVyCQkqLwotI2RlZmluZSBEU1RfU19DX0xCTE9STElUCTE4NgotI2RlZmluZSBEU1RfU19DX0xBQkVMCQkxODcKLSNkZWZpbmUJRFNUX1NfQ19NT0RCRUcJCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfTU9ERU5ECQkxODkJLyogRW5kIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkJFRwkJMTkwCS8qIEJlZ2lubmluZyBvZiByb3V0aW5lCSovCi0jZGVmaW5lCURTVF9TX0NfUlRORU5ECQkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cgNQotI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IgNgotI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNwotI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAotI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJMTEKLSNkZWZpbmUgRFNUX1NfQ19TRVRfUENfTAkxMgotI2RlZmluZSBEU1RfU19DX1NFVF9TVE1UTlVNCTEzCi0jZGVmaW5lIERTVF9TX0NfVEVSTQkJMTQJLyogRW5kIG9mIGxpbmVzCSovCi0jZGVmaW5lIERTVF9TX0NfVEVSTV9XCQkxNQkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUJRFNUX1NfQ19TRVRfQUJTX1BDCTE2CS8qIFNldCBQQwkqLwotI2RlZmluZQlEU1RfU19DX0RFTFRBX1BDX0wJMTcJLyogSW5jciBQQwkqLwotI2RlZmluZSBEU1RfU19DX0lOQ1JfTElOVU1fTAkxOAkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9CCTE5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fTAkyMAkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lCURTVF9TX0NfVEVSTV9MCQkyMQkvKiBFbmQgb2YgbGluZXMJKi8KLS8qIHRoZXNlIGFyZSB1c2VkIHdpdGggRFNUX1NfQ19TT1VSQ0UgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVDTEZJTEUJIDEJLyogRGVjbGFyZSBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRGSUxFCSAyCS8qIFNldCBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfTAkgMwkvKiBTZXQgcmVjb3JkLCBsb25nd29yZCB2YWx1ZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfVwkgNAkvKiBTZXQgcmVjb3JkLCB3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0RFRkxJTkVTX1cJMTAJLyogIyBvZiBsaW5lLCB3b3JkIGNvdW50ZXIgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfQgkxMQkvKiAjIG9mIGxpbmUsIGJ5dGUgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19GT1JNRkVFRAkxNgkvKiBeTCBjb3VudHMgYXMgYSByZWNvcmQgKi8KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgZGF0YSB0eXBlcy4gIEFueXRoaW5nIG5vdCBvbgotICogdGhlIGxpc3QgaXMgaW5jbHVkZWQgdW5kZXIgJ2FkdmFuY2VkX3R5cGUnCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQ0hBUgkJMHgwMgotI2RlZmluZSBEQkdfU19DX1VTSU5UCQkweDAzCi0jZGVmaW5lIERCR19TX0NfVUxJTlQJCTB4MDQKLSNkZWZpbmUgREJHX1NfQ19VUVVBRAkJMHgwNQotI2RlZmluZSBEQkdfU19DX1NDSEFSCQkweDA2Ci0jZGVmaW5lIERCR19TX0NfU1NJTlQJCTB4MDcKLSNkZWZpbmUgREJHX1NfQ19TTElOVAkJMHgwOAotI2RlZmluZSBEQkdfU19DX1NRVUFECQkweDA5Ci0jZGVmaW5lIERCR19TX0NfUkVBTDQJCTB4MGEKLSNkZWZpbmUgREJHX1NfQ19SRUFMOAkJMHgwYgkJLyogRF9mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg0CQkweDBjCQkvKiAyeEZfZmxvYXQgY29tcGxleCBmbG9hdCAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDgJCTB4MGQJCS8qIDJ4RF9mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX1JFQUw4X0cJCTB4MWIJCS8qIEdfZmxvYXQgZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOF9HCTB4MWQJCS8qIDJ4R19mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0ZVTkNUSU9OX0FERFIJMHgxNwotI2RlZmluZSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUJMHhhMwotLyogIFNvbWUgb2YgdGhlc2UgYXJlIGp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICBbcHJdCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUQQkJMHgwMQkvKiB1bnNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUVQkJMHgyMgkvKiB1bnNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRBCQkweDI5CS8qIHNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19TQklUVQkJMHgyYQkvKiBzaWduZWQsIHVuYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19DU1RSSU5HCQkweDJlCS8qIGFzY2l6ICgnXDAnIHRlcm1pbmF0ZWQpIHN0cmluZyAqLwotI2RlZmluZSBEQkdfU19DX1dDSEFSCQkweDM4CS8qIHdjaGFyX3QgKi8KLS8qICBUaGVzZSBhcmUgZGVzY3JpcHRvciBjbGFzcyBjb2Rlcy4KLSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19TCQkweDAxCS8qIHN0YXRpYyAoZml4ZWQgbGVuZ3RoKSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19ECQkweDAyCS8qIGR5bmFtaWMgc3RyaW5nIChub3QgdmlhIG1hbGxvYyEpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0EJCTB4MDQJLyogYXJyYXkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfVUJTCQkweDBkCS8qIHVuYWxpZ25lZCBiaXQgc3RyaW5nICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBvZiBzdHJ1Y3QKLSAqICB1bmlvbiBhbmQgZW51bSByZWNvcmRzCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19FTlVNX0lURU0JCTB4YTQKLSNkZWZpbmUgREJHX1NfQ19FTlVNX1NUQVJUCQkweGE1Ci0jZGVmaW5lIERCR19TX0NfRU5VTV9FTkQJCTB4YTYKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfSVRFTQkJRFNUX0tfVkZMQUdTX0JJVE9GRlMJLyogMHhmZiAqLwotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9TVEFSVAkJMHhhYgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9FTkQJCTB4YWMKLSNkZWZpbmUgRFNUX0tfVFlQU1BFQwkJCTB4YWYJCS8qIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotLyogVGhlc2UgY29kZXMgYXJlIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZHMKLSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfTk9WQUwJCTB4ODAJLyogc3RydWN0IGRlZmluaXRpb24gb25seSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfRFNDCQkweGZhCS8qIGRlc2NyaXB0b3IgdXNlZCAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfVFZTCQkweGZiCS8qIHRyYWlsaW5nIHZhbHVlIHNwZWNpZmllZCAqLwotI2RlZmluZSBEU1RfS19WU19GT0xMT1dTCQkweGZkCS8qIHZhbHVlIHNwZWMgZm9sbG93cyAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfQklUT0ZGUwkJMHhmZgkvKiB2YWx1ZSBjb250YWlucyBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfTElURVJBTAkwCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfQUREUgkxCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfREVTQwkyCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfUkVHCTMKLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9BUAkweDBjCS8qIFIxMiAqLwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0ZQCTB4MGQJLyogUjEzICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfU1AJMHgwZQkvKiBSMTQgKi8KLSNkZWZpbmUgRFNUX1ZfVkFMS0lORAkJMAkvKiBvZmZzZXQgb2YgdmFsa2luZCBmaWVsZCAqLwotI2RlZmluZSBEU1RfVl9JTkRJUkVDVAkJMgkvKiBvZmZzZXQgdG8gaW5kaXJlY3QgYml0ICovCi0jZGVmaW5lIERTVF9WX0RJU1AJCTMJLyogb2Zmc2V0IHRvIGRpc3BsYWNlbWVudCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfUkVHTlVNCQk0CS8qIG9mZnNldCB0byByZWdpc3RlciBudW1iZXIgKi8KLSNkZWZpbmUgRFNUX01fSU5ESVJFQ1QJCSgxPDxEU1RfVl9JTkRJUkVDVCkKLSNkZWZpbmUgRFNUX01fRElTUAkJKDE8PERTVF9WX0RJU1ApCi0jZGVmaW5lIERCR19DX0ZVTkNUSU9OX1BBUkFNCS8qIDB4YzkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9BUDw8RFNUX1ZfUkVHTlVNKSkKLSNkZWZpbmUgREJHX0NfTE9DQUxfU1lNCQkvKiAweGQ5ICovCVwKLQkoRFNUX0tfVkFMS0lORF9BRERSfERTVF9NX0RJU1B8KERTVF9LX1JFR19WQVhfRlA8PERTVF9WX1JFR05VTSkpCi0vKiBLaW5kcyBvZiB2YWx1ZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1ZTX0FMTE9DX1NQTElUCTMJLyogc3BsaXQgbGlmZXRpbWUgKi8KLS8qIEtpbmRzIG9mIHR5cGUgc3BlY2lmaWNhdGlvbnMKLSAqLwotI2RlZmluZSBEU1RfS19UU19BVE9NCQkweDAxCS8qIGF0b21pYyB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfRFNDCQkweDAyCS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX0lORAkJMHgwMwkvKiBpbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfVFBUUgkJMHgwNAkvKiB0eXBlZCBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19QVFIJCTB4MDUJLyogcG9pbnRlciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfQVJSQVkJCTB4MDcJLyogYXJyYXkgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX05PVl9MRU5HCTB4MGUJLyogbm92ZWwgbGVuZ3RoIHR5cGUgc3BlYyAqLwotLyogIFRoZXNlIGFyZSB0aGUgY29kZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgc3VmZml4IHJlY29yZHMgdG8gZGV0ZXJtaW5lIHRoZQotICogIGFjdHVhbCBkYXRhIHR5cGUKLSAqLwotI2RlZmluZSBEQkdfU19DX0JBU0lDCQkJRFNUX0tfVFNfQVRPTQotI2RlZmluZSBEQkdfU19DX0JBU0lDX0FSUkFZCQlEU1RfS19UU19EU0MKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1QJCQlEU1RfS19UU19JTkQKLSNkZWZpbmUgREJHX1NfQ19QT0lOVEVSCQkJRFNUX0tfVFNfVFBUUgotI2RlZmluZSBEQkdfU19DX1ZPSUQJCQlEU1RfS19UU19QVFIKLSNkZWZpbmUgREJHX1NfQ19DT01QTEVYX0FSUkFZCQlEU1RfS19UU19BUlJBWQotCi0vKiBWTVMgTW9kdWxlIGhlYWRlciByZWNvcmQgKEVNSCkgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIE1IRF9TX0NfTUhEIDAKLSNkZWZpbmUgTUhEX1NfQ19MTk0gMQotI2RlZmluZSBNSERfU19DX1NSQyAyCi0jZGVmaW5lIE1IRF9TX0NfVFRMIDMKLSNkZWZpbmUgTUhEX1NfQ19DUFIgNAotI2RlZmluZSBNSERfU19DX01UQyA1Ci0jZGVmaW5lIE1IRF9TX0NfR1RYIDYKLSNkZWZpbmUgTUhEX1NfQ19NQVhIRFJUWVAgNgotCi0jZGVmaW5lIEVNSF9TX0NfTUhEIDAJCS8qIE1haW4gaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgRU1IX1NfQ19MTk0gMQkJLyogTGFuZ3VhZ2UgbmFtZSBhbmQgdmVyc2lvbgkqLwotI2RlZmluZSBFTUhfU19DX1NSQyAyCQkvKiBTb3VyY2UgZmlsZSBzcGVjaWZpY2F0aW9uCSovCi0jZGVmaW5lIEVNSF9TX0NfVFRMIDMJCS8qIFRpdGxlIHRleHQgb2YgbW9kdWxlCQkqLwotI2RlZmluZSBFTUhfU19DX0NQUiA0CQkvKiBDb3B5cmlnaHQgbm90aWNlCQkqLwotI2RlZmluZSBFTUhfU19DX01UQyA1CQkvKiBNYWludGVuYW5jZSBzdGF0dXMJCSovCi0jZGVmaW5lIEVNSF9TX0NfR1RYIDYJCS8qIEdlbmVyYWwgdGV4dAkJCSovCi0jZGVmaW5lIEVNSF9TX0NfTUFYSERSVFlQIDYJLyogTWF4aW11bSBhbGxvd2FibGUgdHlwZQkqLwotCi0vKiB2bXMuYy4gICovCi0KLWV4dGVybiBhc3ltYm9sICpfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogdm1zLWdzZC5jLiAgKi8KLQotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiB2bXMtbWhkLmMuICAqLwotCi1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci0KLS8qIHZtcy10aXIuYy4gICovCi0KLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGlyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfZGJnIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGJ0IFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfbG5rIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLQotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90aXIgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90YnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9kYmcgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkxCi0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQkyCi0jZGVmaW5lIEFMUEhBX1JfSElOVAkJMwotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJNAotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkJNQotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkJNgotI2RlZmluZSBBTFBIQV9SX09QX1BVU0gJCTcKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRQk4Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkJOQotI2RlZmluZSBBTFBIQV9SX09QX1BSU0hJRlQJMTAKLSNkZWZpbmUgQUxQSEFfUl9MSU5LQUdFCQkxMQotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEyCi0jZGVmaW5lIEFMUEhBX1JfQ09ERUFERFIJMTMKLQotLyogT2JqZWN0IGxhbmd1YWdlIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBPQkpfU19DX0hEUiAwCQkvKlZBWCBtb2R1bGUgaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19HU0QgMQkJLypWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RJUiAyCQkvKlZBWCB0ZXh0IGluZm9ybWF0aW9uIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT00gMwkJLypWQVggZW5kIG9mIG1vZHVsZSByZWNvcmQJCSovCi0jZGVmaW5lIE9CSl9TX0NfREJHIDQJCS8qVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RCVCA1CQkvKlZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIE9CSl9TX0NfTE5LIDYJCS8qVkFYIGxpbmtlciBvcHRpb25zIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT01XIDcJCS8qVkFYIGVuZCBvZiBtb2R1bGUgd29yZC1wc2VjdCByZWNvcmQJKi8KLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNUWVAgNwkvKlZBWCBMYXN0IGFzc2lnbmVkIHJlY29yZCB0eXBlCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FTUggOAkJLypFVkFYIG1vZHVsZSBoZWFkZXIgcmVjb3JkCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FRU9NIDkJCS8qRVZBWCBlbmQgb2YgbW9kdWxlIHJlY29yZAkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfRUdTRCAxMAkvKkVWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZCAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfRVRJUiAxMQkvKkVWQVggdGV4dCBpbmZvcm1hdGlvbiByZWNvcmQJCSovCi0jZGVmaW5lIEVPQkpfU19DX0VEQkcgMTIJLypFVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBFT0JKX1NfQ19FVEJUIDEzCS8qRVZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIEVPQkpfU19DX01BWFJFQ1RZUCAxMwkvKkVWQVggTGFzdCBhc3NpZ25lZCByZWNvcmQgdHlwZQkqLwotI2RlZmluZSBPQkpfU19LX1NVQlRZUCAxCi0jZGVmaW5lIE9CSl9TX0NfU1VCVFlQIDEKLSNkZWZpbmUgRU9CSl9TX0tfU1VCVFlQIDQKLSNkZWZpbmUgRU9CSl9TX0NfU1VCVFlQIDQKLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNTSVogMjA0OAkvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBFT0JKX1NfQ19NQVhSRUNTSVogODE5MiAvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBPQkpfU19DX1NUUkxWTCAwCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVPQkpfU19DX1NUUkxWTCAyCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9CSl9TX0NfU1lNU0laIDMxCS8qTWF4aW11bSBzeW1ib2wgbGVuZ3RoCQkqLwotI2RlZmluZSBFT0JKX1NfQ19TWU1TSVogNjQJLypNYXhpbXVtIHN5bWJvbCBsZW5ndGgJCSovCi0jZGVmaW5lIEVPQkpfU19DX1NFQ1NJWiAzMQkvKk1heGltdW0gc2VjdGlvbiBuYW1lIGxlbmd0aAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19TVE9SRVBMSU0gLTEJLypNYXhpbXVtIHJlcGVhdCBjb3VudCBvbiBzdG9yZSBjb21tYW5kcyAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfU1RPUkVQTElNIC0xCS8qTWF4aW11bSByZXBlYXQgY291bnQgb24gc3RvcmUgY29tbWFuZHMgICovCi0jZGVmaW5lIE9CSl9TX0NfUFNDQUxJTElNIDkJLypNYXhpbXVtIHAtc2VjdCBhbGlnbm1lbnQgICAgICAgICAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfUFNDQUxJTElNIDE2CS8qTWF4aW11bSBwLXNlY3QgYWxpZ25tZW50ICAgICAgICAgICovCi0KLSNkZWZpbmUgRVZBWF9PRkZTRVQJMjU2CS8qdHlwZSBvZmZzZXQgZm9yIEVWQVggY29kZXMgaW4gc3dpdGNoICAqLwotLyogTWlzY2VsbGFuZW91cyBkZWZpbml0aW9ucy4gICovCi0KLSNpZiBfX0dOVUNfXwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdXF1YWQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVxdWFkOwotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX09VVFJFQ19TSVpFIDQwOTYKLSNkZWZpbmUgTUlOX09VVFJFQ19MVUZUIDY0Ci0KLXR5cGVkZWYgc3RydWN0IF92bXNfc2VjdGlvbiB7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBzdHJ1Y3QgX3Ztc19zZWN0aW9uICpuZXh0OwotfSB2bXNfc2VjdGlvbjsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zYXZlX3Ztc19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBkYXRhLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIHZtc19zZWN0aW9uICpfYmZkX2dldF92bXNfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpbmRleCkpOwotCi10eXBlZGVmIHN0cnVjdCBfdm1zX3JlbG9jIHsKLSAgc3RydWN0IF92bXNfcmVsb2MgKm5leHQ7Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLX0gdm1zX3JlbG9jOwotCi0vKiB2bXMgbW9kdWxlIGhlYWRlciAgKi8KLQotc3RydWN0IGhkcl9zdHJ1YyB7Ci0gIGludCBoZHJfYl9zdHJsdmw7Ci0gIGxvbmcgaGRyX2xfYXJjaDE7Ci0gIGxvbmcgaGRyX2xfYXJjaDI7Ci0gIGxvbmcgaGRyX2xfcmVjc2l6OwotICBjaGFyICpoZHJfdF9uYW1lOwotICBjaGFyICpoZHJfdF92ZXJzaW9uOwotICBjaGFyICpoZHJfdF9kYXRlOwotICBjaGFyICpoZHJfY19sbm07Ci0gIGNoYXIgKmhkcl9jX3NyYzsKLSAgY2hhciAqaGRyX2NfdHRsOwotfTsKLQotCi0vKiB2bXMgZW5kIG9mIG1vZHVsZSAgKi8KLQotc3RydWN0IGVvbV9zdHJ1YyB7Ci0gIGxvbmcgZW9tX2xfdG90YWxfbHBzOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX2NvbWNvZDsKLSAgYm9vbGVhbiBlb21faGFzX3RyYW5zZmVyOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX3RmcmZsZzsKLSAgbG9uZyBlb21fbF9wc2luZHg7Ci0gIGxvbmcgZW9tX2xfdGZyYWRyOwotfTsKLQotZW51bSBmaWxlX2Zvcm1hdF9lbnVtIHsgRkZfVU5LTk9XTiwgRkZfRk9SRUlHTiwgRkZfTkFUSVZFLCBGRl9WQVggfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgdm1zX3N5bWJvbF9zdHJ1Y3QgewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgYmZkX2hhc2g7Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLX0gdm1zX3N5bWJvbF9lbnRyeTsKLQotLyogc3RhY2sgdmFsdWUgZm9yIHB1c2gvcG9wIGNvbW1hbmRzICAqLwotCi1zdHJ1Y3Qgc3RhY2tfc3RydWN0IHsKLSAgdXF1YWQgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIFNUQUNLU0laRSA4MTkyCi0KLS8qIGxvY2F0aW9uIHN0YWNrIGRlZmluaXRpb25zIGZvciBDVExfREZMT0MsIENUTF9TVExPQywgYW5kIENUTF9TVEtETCAgKi8KLQotc3RydWN0IGxvY2F0aW9uX3N0cnVjdCB7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIExPQ0FUSU9OX1NBVkVfU0laRSAzMgotCi0jZGVmaW5lIFZNU19TRUNUSU9OX0NPVU5UIDEwMjQKLQotc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0IHsKLSAgaW50IGlzX3ZheDsKLSAgYm9vbGVhbiBmaXh1cF9kb25lOwkJCS8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgYWxsCi0JCQkJCSAgIHNlY3Rpb24gcG9pbnRlcnMgYW5kIFBSSVYoc2VjdGlvbnMpCi0JCQkJCSAgIGFyZSBzZXQgdXAgY29ycmVjdGx5ICAqLwotICB1bnNpZ25lZCBjaGFyICp2bXNfYnVmOwkJLyogYnVmZmVyIHRvIHJlY29yZCAgKi8KLSAgaW50IGJ1Zl9zaXplOwkJCQkvKiBtYXggc2l6ZSBvZiBidWZmZXIgICovCi0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CQkvKiBhY3R1YWwgcmVjb3JkIHB0ciAgKi8KLSAgaW50IHJlY19sZW5ndGg7CQkJLyogcmVtYWluaW5nIHJlY29yZCBsZW5ndGggICovCi0gIGludCByZWNfc2l6ZTsJCQkJLyogYWN0dWFsIHJlY29yZCBzaXplICAqLwotICBpbnQgcmVjX3R5cGU7CQkJCS8qIGFjdHVhbCByZWNvcmQgdHlwZSAgKi8KLSAgZW51bSBmaWxlX2Zvcm1hdF9lbnVtIGZpbGVfZm9ybWF0OwotCi0gIHN0cnVjdCBoZHJfc3RydWMgaGRyX2RhdGE7CQkvKiBkYXRhIGZyb20gSERSL0VNSCByZWNvcmQgICovCi0gIHN0cnVjdCBlb21fc3RydWMgZW9tX2RhdGE7CQkvKiBkYXRhIGZyb20gRU9NL0VFT00gcmVjb3JkICAqLwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsJCS8qICMgb2Ygc2VjdGlvbnMgaW4gZm9sbG93aW5nIGFycmF5ICAqLwotICBhc2VjdGlvbiAqKnNlY3Rpb25zOwkJCS8qIGFycmF5IG9mIEdTRC9FR1NEIHNlY3Rpb25zICAqLwotICBpbnQgZ3NkX3N5bV9jb3VudDsJCQkvKiAjIG9mIEdTRC9FR1NEIHN5bWJvbHMgICovCi0gIGFzeW1ib2wgKipzeW1ib2xzOwkJCS8qIHZlY3RvciBvZiBHU0QvRUdTRCBzeW1ib2xzICAqLwotICBzdHJ1Y3QgcHJvY192YWx1ZSAqcHJvY2VkdXJlOwotCi0gIHN0cnVjdCBzdGFja19zdHJ1Y3QgKnN0YWNrOwotICBpbnQgc3RhY2twdHI7Ci0KLSAgdm1zX3NlY3Rpb24gKnZtc19zZWN0aW9uX3RhYmxlW1ZNU19TRUNUSU9OX0NPVU5UXTsKLQotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnZtc19zeW1ib2xfdGFibGU7Ci0gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1jYWNoZTsKLSAgaW50IHN5bW51bTsKLQotICBzdHJ1Y3QgbG9jYXRpb25fc3RydWN0ICpsb2NhdGlvbl9zdGFjazsKLQotICBhc2VjdGlvbiAqaW1hZ2Vfc2VjdGlvbjsJCS8qIHNlY3Rpb24gZm9yIGltYWdlX3B0ciAgKi8KLSAgdW5zaWduZWQgY2hhciAqaW1hZ2VfcHRyOwkJLyogYSBwb2ludGVyIHRvIHNlY3Rpb24tPmNvbnRlbnRzICovCi0KLSAgdW5zaWduZWQgY2hhciBwZHNjWzhdOwkJLyogcHJvY2VkdXJlIGRlc2NyaXB0b3IgKi8KLQotICAvKiBPdXRwdXQgcm91dGluZSBzdG9yYWdlICAqLwotCi0gIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9idWY7CQkvKiBvdXRwdXQgZGF0YSAgKi8KLSAgaW50IHB1c2hfbGV2ZWw7Ci0gIGludCBwdXNoZWRfc2l6ZTsKLSAgaW50IGxlbmd0aF9wb3M7Ci0gIGludCBvdXRwdXRfc2l6ZTsKLSAgaW50IG91dHB1dF9hbGlnbm1lbnQ7Ci0KLSAgLyogbGlua2FnZSBpbmRleCBjb3VudGVyCi0gICB1c2VkIGJ5IGNvbmRpdGlvbmFsIHN0b3JlIGNvbW1hbmRzIChFVElSX1NfQ19TVENfKSAgKi8KLQotICBpbnQgdm1zX2xpbmthZ2VfaW5kZXg7Ci0KLSAgLyogc2VlIHRjLWFscGhhLmMgb2YgZ2FzIGZvciBhIGRlc2NyaXB0aW9uLiAgKi8KLSAgaW50IGZsYWdfaGFzaF9sb25nX25hbWVzOwkvKiAtKywgaGFzaCBpbnN0ZWFkIG9mIHRydW5jYXRlICovCi0gIGludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1ILCBzaG93IGhhc2hpbmcvdHJ1bmNhdGlvbiAqLwotfTsKLQotI2RlZmluZSBQUklWKG5hbWUpCSgoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0ICopYWJmZC0+dGRhdGEuYW55KS0+bmFtZQotCi0jZGVmaW5lIFNFQ1RJT05fTkFNRV9URU1QTEFURSAiX19TRUNfXyVkIgotCi0jaWYgVk1TX0RFQlVHCi1leHRlcm4gdm9pZCBfYmZkX3Ztc19kZWJ1ZyBQQVJBTVMoKGludCBsZXZlbCwgY2hhciAqZm9ybWF0LCAuLi4pKTsKLWV4dGVybiB2b2lkIF9iZmRfaGV4ZHVtcAotICBQQVJBTVMgKChpbnQgbGV2ZWwsIHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBvZmZzZXQpKTsKLQotI2RlZmluZSB2bXNfZGVidWcgX2JmZF92bXNfZGVidWcKLSNlbmRpZgotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX3Ztc19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZSwKLQkgICBjb25zdCBjaGFyICpzdHJpbmcpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgKnR5cGUsIGludCAqbGVuZ3RoKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX2dldF9yZWNvcmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX25leHRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1leHRlcm4gY2hhciAqX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqc3RyLCBpbnQgc2l6ZSkpOwotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqcHRyKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19wdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCwgdXF1YWQgdmFsLCBpbnQgcHNlY3QpKTsKLWV4dGVybiB1cXVhZCBfYmZkX3Ztc19wb3AgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgKnBzZWN0KSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfc2F2ZV92bXNfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgZGF0YSwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9iZWdpbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGludCByZWN0eXBlLCBpbnQgcmVjaGVhZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBhbGlnbnRvKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcHVzaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9wb3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19vdXRwdXRfY2hlY2sgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2J5dGUgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgdmFsdWUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9zaG9ydCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2xvbmcgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBsb25nIHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcXVhZCBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKnZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZHVtcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JCQkJCSAgIGludCBsZW5ndGgpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9maWxsIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHZhbHVlLCBpbnQgbGVuZ3RoKSk7Ci1leHRlcm4gY2hhciAqX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqaW4sIGludCBtYXhsZW4pKTsKLQotZXh0ZXJuIHZtc19zeW1ib2xfZW50cnkgKl9iZmRfdm1zX2VudGVyX3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKm5hbWUpKTsKLQotI2VuZGlmIC8qIFZNU19IICovCmRpZmYgLS1naXQgYS9iZmQveGNvZmZsaW5rLmMgYi9iZmQveGNvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNDg4ZDcuLjAwMDAwMDAKLS0tIGEvYmZkL3hjb2ZmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY0MCArMCwwIEBACi0vKiBQT1dFUi9Qb3dlclBDIFhDT0ZGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIFhDT0ZGIGxpbmtlciBjb2RlLiAgKi8KLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi0vKiBJbiBvcmRlciB0byBzdXBwb3J0IGxpbmtpbmcgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgaW50byBhbgotICAgWENPRkYgZm9ybWF0LCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyCi0gICBiZmRfdGFyZ2V0IGlzIGFuIFhDT0ZGIHZlY3Rvci4gIEZJWE1FOiBXZSBuZWVkIHRvIHJldGhpbmsgdGhpcwotICAgd2hvbGUgYXBwcm9hY2guICAqLwotI2RlZmluZSBYQ09GRl9YVkVDUCh4dikgXAotICAoc3RyY21wICgoeHYpLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSA9PSAwIFwKLSAgIHx8IHN0cmNtcCAoKHh2KS0+bmFtZSwgInhjb2ZmLXBvd2VybWFjIikgPT0gMCkKLQotLyogR2V0IHRoZSBYQ09GRiBoYXNoIHRhYmxlIGVudHJpZXMgZm9yIGEgQkZELiAgKi8KLSNkZWZpbmUgb2JqX3hjb2ZmX3N5bV9oYXNoZXMoYmZkKSBcCi0gICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2NvZmZfc3ltX2hhc2hlcyAoYmZkKSkKLQotLyogWENPRkYgcmVsb2NhdGlvbiB0eXBlcy4gIFRoZXNlIHByb2JhYmx5IGJlbG9uZyBpbiBhIGhlYWRlciBmaWxlCi0gICBzb21ld2hlcmUuICBUaGUgcmVsb2NhdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZnVuY3Rpb24KLSAgIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaW4gdGhpcyBmaWxlLiAgKi8KLQotI2RlZmluZSBSX1BPUyAgICgweDAwKQotI2RlZmluZSBSX05FRyAgICgweDAxKQotI2RlZmluZSBSX1JFTCAgICgweDAyKQotI2RlZmluZSBSX1RPQyAgICgweDAzKQotI2RlZmluZSBSX1JUQiAgICgweDA0KQotI2RlZmluZSBSX0dMICAgICgweDA1KQotI2RlZmluZSBSX1RDTCAgICgweDA2KQotI2RlZmluZSBSX0JBICAgICgweDA4KQotI2RlZmluZSBSX0JSICAgICgweDBhKQotI2RlZmluZSBSX1JMICAgICgweDBjKQotI2RlZmluZSBSX1JMQSAgICgweDBkKQotI2RlZmluZSBSX1JFRiAgICgweDBmKQotI2RlZmluZSBSX1RSTCAgICgweDEyKQotI2RlZmluZSBSX1RSTEEgICgweDEzKQotI2RlZmluZSBSX1JSVEJJICgweDE0KQotI2RlZmluZSBSX1JSVEJBICgweDE1KQotI2RlZmluZSBSX0NBSSAgICgweDE2KQotI2RlZmluZSBSX0NSRUwgICgweDE3KQotI2RlZmluZSBSX1JCQSAgICgweDE4KQotI2RlZmluZSBSX1JCQUMgICgweDE5KQotI2RlZmluZSBSX1JCUiAgICgweDFhKQotI2RlZmluZSBSX1JCUkMgICgweDFiKQotCi0vKiBUaGUgZmlyc3Qgd29yZCBvZiBnbG9iYWwgbGlua2FnZSBjb2RlLiAgVGhpcyBtdXN0IGJlIG1vZGlmaWVkIGJ5Ci0gICBmaWxsaW5nIGluIHRoZSBjb3JyZWN0IFRPQyBvZmZzZXQuICAqLwotCi0jZGVmaW5lIFhDT0ZGX0dMSU5LX0ZJUlNUICgweDgxODIwMDAwKQkvKiBsd3ogcjEyLDAocjIpICovCi0KLS8qIFRoZSByZW1haW5pbmcgd29yZHMgb2YgZ2xvYmFsIGxpbmthZ2UgY29kZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHhjb2ZmX2dsaW5rX2NvZGVbXSA9Ci17Ci0gIDB4OTA0MTAwMTQsCS8qIHN0dyByMiwyMChyMSkgKi8KLSAgMHg4MDBjMDAwMCwJLyogbHd6IHIwLDAocjEyKSAqLwotICAweDgwNGMwMDA0LAkvKiBsd3ogcjIsNChyMTIpICovCi0gIDB4N2MwOTAzYTYsCS8qIG10Y3RyIHIwICovCi0gIDB4NGU4MDA0MjAsCS8qIGJjdHIgKi8KLSAgMHgwLAkJLyogc3RhcnQgb2YgdHJhY2ViYWNrIHRhYmxlICovCi0gIDB4MDAwYzgwMDAsCS8qIHRyYWNlYmFjayB0YWJsZSAqLwotICAweDAJCS8qIHRyYWNlYmFjayB0YWJsZSAqLwotfTsKLQotI2RlZmluZSBYQ09GRl9HTElOS19TSVpFIFwKLSAgKCgoc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGUgLyBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZVswXSkgKiA0KSArIDQpCi0KLS8qIFdlIHJldXNlIHRoZSBTRUNfUk9NIGZsYWcgYXMgYSBtYXJrIGZsYWcgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KLSAgIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgdXNlZCBvbiBpbnB1dCBzZWN0aW9ucy4gICovCi0KLSNkZWZpbmUgU0VDX01BUksgKFNFQ19ST00pCi0KLS8qIFRoZSBsZGhkciBzdHJ1Y3R1cmUuICBUaGlzIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSAubG9hZGVyCi0gICBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGludGVybmFsX2xkaGRyCi17Ci0gIC8qIFRoZSB2ZXJzaW9uIG51bWJlcjogY3VycmVudGx5IGFsd2F5cyAxLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX3ZlcnNpb247Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfbnN5bXM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiB0YWJsZSBlbnRyaWVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX25yZWxvYzsKLSAgLyogVGhlIGxlbmd0aCBvZiB0aGUgaW1wb3J0IGZpbGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX2lzdGxlbjsKLSAgLyogVGhlIG51bWJlciBvZiBpbXBvcnQgZmlsZXMuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfbmltcGlkOwotICAvKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSAubG9hZGVyIHNlY3Rpb24gdG8gdGhlIGZpcnN0Ci0gICAgIGVudHJ5IGluIHRoZSBpbXBvcnQgZmlsZSB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9pbXBvZmY7Ci0gIC8qIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9zdGxlbjsKLSAgLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlciBzZWN0aW9uIHRvIHRoZSBmaXJzdAotICAgICBlbnRyeSBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX3N0b2ZmOwotfTsKLQotc3RydWN0IGV4dGVybmFsX2xkaGRyCi17Ci0gIGJmZF9ieXRlIGxfdmVyc2lvbls0XTsKLSAgYmZkX2J5dGUgbF9uc3ltc1s0XTsKLSAgYmZkX2J5dGUgbF9ucmVsb2NbNF07Ci0gIGJmZF9ieXRlIGxfaXN0bGVuWzRdOwotICBiZmRfYnl0ZSBsX25pbXBpZFs0XTsKLSAgYmZkX2J5dGUgbF9pbXBvZmZbNF07Ci0gIGJmZF9ieXRlIGxfc3RsZW5bNF07Ci0gIGJmZF9ieXRlIGxfc3RvZmZbNF07Ci19OwotCi0jZGVmaW5lIExESERSU1ogKDggKiA0KQotCi0vKiBUaGUgbGRzeW0gc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHN5bWJvbCBpbiB0aGUKLSAgIC5sb2FkZXIgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9sZHN5bQotewotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgbmFtZSBpZiA8PSBTWU1OTUxFTiBjaGFyYWN0ZXJzLiAgKi8KLSAgICAgIGNoYXIgX2xfbmFtZVtTWU1OTUxFTl07Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBaZXJvIGlmIHRoZSBzeW1ib2wgbmFtZSBpcyBtb3JlIHRoYW4gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCi0JICBsb25nIF9sX3plcm9lczsKLQkgIC8qIFRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSBpZiB0aGUgc3ltYm9sIG5hbWUgaXMgbW9yZQotICAgICAgICAgICAgIHRoYW4gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCi0JICBsb25nIF9sX29mZnNldDsKLQl9IF9sX2w7Ci0gICAgfSBfbDsKLSAgLyogVGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gIGJmZF92bWEgbF92YWx1ZTsKLSAgLyogVGhlIHN5bWJvbCBzZWN0aW9uIG51bWJlci4gICovCi0gIHNob3J0IGxfc2NudW07Ci0gIC8qIFRoZSBzeW1ib2wgdHlwZSBhbmQgZmxhZ3MuICAqLwotICBjaGFyIGxfc210eXBlOwotICAvKiBUaGUgc3ltYm9sIHN0b3JhZ2UgY2xhc3MuICAqLwotICBjaGFyIGxfc21jbGFzOwotICAvKiBUaGUgaW1wb3J0IGZpbGUgSUQuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfaWZpbGU7Ci0gIC8qIE9mZnNldCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgY2hlY2sgc3RyaW5nLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX3Bhcm07Ci19OwotCi1zdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0KLXsKLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBfbF9uYW1lW1NZTU5NTEVOXTsKLSAgICAgIHN0cnVjdAotCXsKLQkgIGJmZF9ieXRlIF9sX3plcm9lc1s0XTsKLQkgIGJmZF9ieXRlIF9sX29mZnNldFs0XTsKLQl9IF9sX2w7Ci0gICAgfSBfbDsKLSAgYmZkX2J5dGUgbF92YWx1ZVs0XTsKLSAgYmZkX2J5dGUgbF9zY251bVsyXTsKLSAgYmZkX2J5dGUgbF9zbXR5cGVbMV07Ci0gIGJmZF9ieXRlIGxfc21jbGFzWzFdOwotICBiZmRfYnl0ZSBsX2lmaWxlWzRdOwotICBiZmRfYnl0ZSBsX3Bhcm1bNF07Ci19OwotCi0jZGVmaW5lIExEU1lNU1ogKDggKyAzICogNCArIDIgKyAyKQotCi0vKiBUaGVzZSBmbGFncyBhcmUgZm9yIHRoZSBsX3NtdHlwZSBmaWVsZCAodGhlIGxvd2VyIHRocmVlIGJpdHMgYXJlIGFuCi0gICBYVFlfKiB2YWx1ZSkuICAqLwotCi0vKiBJbXBvcnRlZCBzeW1ib2wuICAqLwotI2RlZmluZSBMX0lNUE9SVCAoMHg0MCkKLS8qIEVudHJ5IHBvaW50LiAgKi8KLSNkZWZpbmUgTF9FTlRSWSAoMHgyMCkKLS8qIEV4cG9ydGVkIHN5bWJvbC4gICovCi0jZGVmaW5lIExfRVhQT1JUICgweDEwKQotCi0vKiBUaGUgbGRyZWwgc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHJlbG9jIGluIHRoZQotICAgLmxvYWRlciBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGludGVybmFsX2xkcmVsCi17Ci0gIC8qIFRoZSByZWxvYyBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBsX3ZhZGRyOwotICAvKiBUaGUgc3ltYm9sIHRhYmxlIGluZGV4IGluIHRoZSAubG9hZGVyIHNlY3Rpb24gc3ltYm9sIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX3N5bW5keDsKLSAgLyogVGhlIHJlbG9jYXRpb24gdHlwZSBhbmQgc2l6ZS4gICovCi0gIHNob3J0IGxfcnR5cGU7Ci0gIC8qIFRoZSBzZWN0aW9uIG51bWJlciB0aGlzIHJlbG9jYXRpb24gYXBwbGllcyB0by4gICovCi0gIHNob3J0IGxfcnNlY25tOwotfTsKLQotc3RydWN0IGV4dGVybmFsX2xkcmVsCi17Ci0gIGJmZF9ieXRlIGxfdmFkZHJbNF07Ci0gIGJmZF9ieXRlIGxfc3ltbmR4WzRdOwotICBiZmRfYnl0ZSBsX3J0eXBlWzJdOwotICBiZmRfYnl0ZSBsX3JzZWNubVsyXTsKLX07Ci0KLSNkZWZpbmUgTERSRUxTWiAoMiAqIDQgKyAyICogMikKLQotLyogVGhlIGxpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLQotc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlCi17Ci0gIC8qIFRoZSBuZXh0IGVudHJ5IGluIHRoZSBsaXN0LiAgKi8KLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpuZXh0OwotICAvKiBUaGUgcGF0aC4gICovCi0gIGNvbnN0IGNoYXIgKnBhdGg7Ci0gIC8qIFRoZSBmaWxlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpmaWxlOwotICAvKiBUaGUgbWVtYmVyIG5hbWUuICAqLwotICBjb25zdCBjaGFyICptZW1iZXI7Ci19OwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgWENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgU2V0IHRvIC0xIGluaXRpYWxseS4gIFNldCB0byAtMiBpZgotICAgICB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgdGhpcyBzeW1ib2wuICAqLwotICBsb25nIGluZHg7Ci0KLSAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGEgVE9DIGVudHJ5IGZvciB0aGlzIHN5bWJvbCwgdGhpcyBpcyB0aGUgLnRjCi0gICAgIHNlY3Rpb24gd2hpY2ggaG9sZHMgaXQuICAqLwotICBhc2VjdGlvbiAqdG9jX3NlY3Rpb247Ci0KLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGNyZWF0ZWQgYSBUT0MgZW50cnkgKHRoZSBYQ09GRl9TRVRfVE9DIGZsYWcgaXMKLQkgc2V0KSwgdGhpcyBpcyB0aGUgb2Zmc2V0IGluIHRvY19zZWN0aW9uLiAgKi8KLSAgICAgIGJmZF92bWEgdG9jX29mZnNldDsKLSAgICAgIC8qIElmIHRoZSBUT0MgZW50cnkgY29tZXMgZnJvbSBhbiBpbnB1dCBmaWxlLCB0aGlzIGlzIHNldCB0byB0aGUKLSAgICAgICAgIHN5bWJvbCBpbmRleCBvZiB0aGUgQ19ISURFWFQgWE1DX1RDIG9yIFhNQ19URCBzeW1ib2wuICAqLwotICAgICAgbG9uZyB0b2NfaW5keDsKLSAgICB9IHU7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCB3aGljaCBpcyBjYWxsZWQsIHRoaXMKLSAgICAgZmllbGQgaG9sZHMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgSWYgdGhpcyBzeW1ib2wKLSAgICAgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCB0aGlzIGZpZWxkIGhvbGRzIGEgcG9pbnRlciB0byB0aGUKLSAgICAgZnVuY3Rpb24gZW50cnkgcG9pbnQuICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpkZXNjcmlwdG9yOwotCi0gIC8qIFRoZSAubG9hZGVyIHN5bWJvbCB0YWJsZSBlbnRyeSwgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKLQotICAvKiBJZiBYQ09GRl9CVUlMVF9MRFNZTSBpcyBzZXQsIHRoaXMgaXMgdGhlIC5sb2FkZXIgc3ltYm9sIHRhYmxlCi0gICAgIGluZGV4LiAgSWYgWENPRkZfQlVJTERfTERTWU0gaXMgY2xlYXIsIGFuZCBYQ09GRl9JTVBPUlQgaXMgc2V0LAotICAgICB0aGlzIGlzIHRoZSBsX2lmaWxlIHZhbHVlLiAgKi8KLSAgbG9uZyBsZGluZHg7Ci0KLSAgLyogU29tZSBsaW5rZXIgZmxhZ3MuICAqLwotICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFhDT0ZGX1JFRl9SRUdVTEFSICgwMSkKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFhDT0ZGX0RFRl9SRUdVTEFSICgwMikKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIFhDT0ZGX0RFRl9EWU5BTUlDICgwNCkKLSAgLyogU3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvYyBiZWluZyBjb3BpZWQgaW50byB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgWENPRkZfTERSRUwgKDAxMCkKLSAgLyogU3ltYm9sIGlzIHRoZSBlbnRyeSBwb2ludC4gICovCi0jZGVmaW5lIFhDT0ZGX0VOVFJZICgwMjApCi0gIC8qIFN5bWJvbCBpcyBjYWxsZWQ7IHRoaXMgaXMsIGl0IGFwcGVhcnMgaW4gYSBSX0JSIHJlbG9jLiAgKi8KLSNkZWZpbmUgWENPRkZfQ0FMTEVEICgwNDApCi0gIC8qIFN5bWJvbCBuZWVkcyB0aGUgVE9DIGVudHJ5IGZpbGxlZCBpbi4gICovCi0jZGVmaW5lIFhDT0ZGX1NFVF9UT0MgKDAxMDApCi0gIC8qIFN5bWJvbCBpcyBleHBsaWNpdGx5IGltcG9ydGVkLiAgKi8KLSNkZWZpbmUgWENPRkZfSU1QT1JUICgwMjAwKQotICAvKiBTeW1ib2wgaXMgZXhwbGljaXRseSBleHBvcnRlZC4gICovCi0jZGVmaW5lIFhDT0ZGX0VYUE9SVCAoMDQwMCkKLSAgLyogU3ltYm9sIGhhcyBiZWVuIHByb2Nlc3NlZCBieSB4Y29mZl9idWlsZF9sZHN5bXMuICAqLwotI2RlZmluZSBYQ09GRl9CVUlMVF9MRFNZTSAoMDEwMDApCi0gIC8qIFN5bWJvbCBpcyBtZW50aW9uZWQgYnkgYSBzZWN0aW9uIHdoaWNoIHdhcyBub3QgZ2FyYmFnZSBjb2xsZWN0ZWQuICAqLwotI2RlZmluZSBYQ09GRl9NQVJLICgwMjAwMCkKLSAgLyogU3ltYm9sIHNpemUgaXMgcmVjb3JkZWQgaW4gc2l6ZV9saXN0IGxpc3QgZnJvbSBoYXNoIHRhYmxlLiAgKi8KLSNkZWZpbmUgWENPRkZfSEFTX1NJWkUgKDA0MDAwKQotICAvKiBTeW1ib2wgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgWENPRkZfREVTQ1JJUFRPUiAoMDEwMDAwKQotICAvKiBNdWx0aXBsZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gZm9yIHRoZSBzeW1ib2wuICAqLwotI2RlZmluZSBYQ09GRl9NVUxUSVBMWV9ERUZJTkVEICgwMjAwMDApCi0KLSAgLyogVGhlIHN0b3JhZ2UgbWFwcGluZyBjbGFzcy4gICovCi0gIHVuc2lnbmVkIGNoYXIgc21jbGFzOwotfTsKLQotLyogVGhlIFhDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSAuZGVidWcgc3RyaW5nIGhhc2ggdGFibGUuICBXZSBuZWVkIHRvIGNvbXB1dGUgdGhpcyB3aGlsZQotICAgICByZWFkaW5nIHRoZSBpbnB1dCBmaWxlcywgc28gdGhhdCB3ZSBrbm93IGhvdyBsYXJnZSB0aGUgLmRlYnVnCi0gICAgIHNlY3Rpb24gd2lsbCBiZSBiZWZvcmUgd2UgYXNzaWduIHNlY3Rpb24gcG9zaXRpb25zLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZGVidWdfc3RydGFiOwotCi0gIC8qIFRoZSAuZGVidWcgc2VjdGlvbiB3ZSB3aWxsIHVzZSBmb3IgdGhlIGZpbmFsIG91dHB1dC4gICovCi0gIGFzZWN0aW9uICpkZWJ1Z19zZWN0aW9uOwotCi0gIC8qIFRoZSAubG9hZGVyIHNlY3Rpb24gd2Ugd2lsbCB1c2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQuICAqLwotICBhc2VjdGlvbiAqbG9hZGVyX3NlY3Rpb247Ci0KLSAgLyogQSBjb3VudCBvZiBub24gVE9DIHJlbGF0aXZlIHJlbG9jcyB3aGljaCB3aWxsIG5lZWQgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGluIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLwotICBzaXplX3QgbGRyZWxfY291bnQ7Ci0KLSAgLyogVGhlIC5sb2FkZXIgc2VjdGlvbiBoZWFkZXIuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0KLSAgLyogVGhlIC5nbCBzZWN0aW9uIHdlIHVzZSB0byBob2xkIGdsb2JhbCBsaW5rYWdlIGNvZGUuICAqLwotICBhc2VjdGlvbiAqbGlua2FnZV9zZWN0aW9uOwotCi0gIC8qIFRoZSAudGMgc2VjdGlvbiB3ZSB1c2UgdG8gaG9sZCB0b2MgZW50cmllcyB3ZSBidWlsZCBmb3IgZ2xvYmFsCi0gICAgIGxpbmthZ2UgY29kZS4gICovCi0gIGFzZWN0aW9uICp0b2Nfc2VjdGlvbjsKLQotICAvKiBUaGUgLmRzIHNlY3Rpb24gd2UgdXNlIHRvIGhvbGQgZnVuY3Rpb24gZGVzY3JpcHRvcnMgd2hpY2ggd2UKLSAgICAgY3JlYXRlIGZvciBleHBvcnRlZCBzeW1ib2xzLiAgKi8KLSAgYXNlY3Rpb24gKmRlc2NyaXB0b3Jfc2VjdGlvbjsKLQotICAvKiBUaGUgbGlzdCBvZiBpbXBvcnQgZmlsZXMuICAqLwotICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKmltcG9ydHM7Ci0KLSAgLyogUmVxdWlyZWQgYWxpZ25tZW50IG9mIHNlY3Rpb25zIHdpdGhpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247Ci0KLSAgLyogV2hldGhlciB0aGUgLnRleHQgc2VjdGlvbiBtdXN0IGJlIHJlYWQtb25seS4gICovCi0gIGJvb2xlYW4gdGV4dHJvOwotCi0gIC8qIFdoZXRoZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBkb25lLiAgKi8KLSAgYm9vbGVhbiBnYzsKLQotICAvKiBBIGxpbmtlZCBsaXN0IG9mIHN5bWJvbHMgZm9yIHdoaWNoIHdlIGhhdmUgc2l6ZSBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdAotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCAqbmV4dDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgfSAqc2l6ZV9saXN0OwotCi0gIC8qIE1hZ2ljIHNlY3Rpb25zOiBfdGV4dCwgX2V0ZXh0LCBfZGF0YSwgX2VkYXRhLCBfZW5kLCBlbmQuICAqLwotICBhc2VjdGlvbiAqc3BlY2lhbF9zZWN0aW9uc1s2XTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgZHVyaW5nIHRoZQotICAgZmluYWwgbGluayBwaGFzZS4gICovCi0KLXN0cnVjdCB4Y29mZl9saW5rX3NlY3Rpb25faW5mbwotewotICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCi0gICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hlczsKLSAgLyogSWYgdGhlcmUgaXMgYSBUT0MgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIGFuZCB0aGUKLSAgICAgaW5kZXggb2YgdGhlIFRPQyBzeW1ib2wgaXMgbm90IGtub3duIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLAotICAgICBhbiBlbnRyeSBpcyBhZGRlZCB0byB0aGlzIGxpbmtlZCBsaXN0LiAgVGhpcyBpcyBub3QgYW4gYXJyYXksCi0gICAgIGxpa2UgcmVsX2hhc2hlcywgYmVjYXVzZSB0aGlzIGNhc2UgaXMgcXVpdGUgdW5jb21tb24uICAqLwotICBzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqbmV4dDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICB9ICp0b2NfcmVsX2hhc2hlczsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHRoYXQgd2UgcGFzcyBhcm91bmQgd2hpbGUgZG9pbmcgdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLXN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBBcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZQotICAgICB0YXJnZXRfaW5kZXggZmllbGQuICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8gKnNlY3Rpb25faW5mbzsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGxhc3QgQ19GSUxFIHN5bWJvbCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfZmlsZV9pbmRleDsKLSAgLyogQ29udGVudHMgb2YgbGFzdCBDX0ZJTEUgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBsYXN0X2ZpbGU7Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBUT0Mgc3ltYm9sLiAgKi8KLSAgbG9uZyB0b2Nfc3ltaW5keDsKLSAgLyogU3RhcnQgb2YgLmxvYWRlciBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX2xkc3ltICpsZHN5bTsKLSAgLyogTmV4dCAubG9hZGVyIHJlbG9jIHRvIHN3YXAgb3V0LiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX2xkcmVsICpsZHJlbDsKLSAgLyogRmlsZSBwb3NpdGlvbiBvZiBzdGFydCBvZiBsaW5lIG51bWJlcnMuICAqLwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKLSAgICAgaW5wdXQgZmlsZS4gICovCi0gIGxvbmcgKnN5bV9pbmRpY2VzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKm91dHN5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAotICAgICBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci19OwotCi1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkaGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKiwgc3RydWN0IGludGVybmFsX2xkaGRyICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKiwgc3RydWN0IGV4dGVybmFsX2xkaGRyICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRzeW1faW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqLCBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKikpOwotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHN5bV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikpOwotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHJlbF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkcmVsICosIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkcmVsX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX2xkcmVsICosIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICp4Y29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHhjb2ZmX2ZpbmRfcmVsb2MKLSAgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF9zaXplX3R5cGUsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbWFya19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9tYXJrIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3ZWVwIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2J1aWxkX2xkc3ltcwotICBQQVJBTVMgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci1zdGF0aWMgaW50IHhjb2ZmX3NvcnRfcmVsb2NzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0MCi0vKiBSb3V0aW5lcyB0byBzd2FwIGluZm9ybWF0aW9uIGluIHRoZSBYQ09GRiAubG9hZGVyIHNlY3Rpb24uICBJZiB3ZQotICAgZXZlciBuZWVkIHRvIHdyaXRlIGFuIFhDT0ZGIGxvYWRlciwgdGhpcyBzdHVmZiB3aWxsIG5lZWQgdG8gYmUKLSAgIG1vdmVkIHRvIGFub3RoZXIgZmlsZSBzaGFyZWQgYnkgdGhlIGxpbmtlciAod2hpY2ggWENPRkYgY2FsbHMgdGhlCi0gICBgYGJpbmRlcicnKSBhbmQgdGhlIGxvYWRlci4gICovCi0KLS8qIFN3YXAgaW4gdGhlIGxkaGRyIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKnNyYzsKLSAgICAgc3RydWN0IGludGVybmFsX2xkaGRyICpkc3Q7Ci17Ci0gIGRzdC0+bF92ZXJzaW9uID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZlcnNpb24pOwotICBkc3QtPmxfbnN5bXMgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfbnN5bXMpOwotICBkc3QtPmxfbnJlbG9jID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX25yZWxvYyk7Ci0gIGRzdC0+bF9pc3RsZW4gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfaXN0bGVuKTsKLSAgZHN0LT5sX25pbXBpZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9uaW1waWQpOwotICBkc3QtPmxfaW1wb2ZmID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2ltcG9mZik7Ci0gIGRzdC0+bF9zdGxlbiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zdGxlbik7Ci0gIGRzdC0+bF9zdG9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zdG9mZik7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBsZGhkciBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZGhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqc3JjOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKmRzdDsKLXsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZlcnNpb24sIGRzdC0+bF92ZXJzaW9uKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX25zeW1zLCBkc3QtPmxfbnN5bXMpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfbnJlbG9jLCBkc3QtPmxfbnJlbG9jKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2lzdGxlbiwgZHN0LT5sX2lzdGxlbik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9uaW1waWQsIGRzdC0+bF9uaW1waWQpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfaW1wb2ZmLCBkc3QtPmxfaW1wb2ZmKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3N0bGVuLCBkc3QtPmxfc3RsZW4pOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfc3RvZmYsIGRzdC0+bF9zdG9mZik7Ci19Ci0KLS8qIFN3YXAgaW4gdGhlIGxkc3ltIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKnNyYzsKLSAgICAgc3RydWN0IGludGVybmFsX2xkc3ltICpkc3Q7Ci17Ci0gIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPl9sLl9sX2wuX2xfemVyb2VzKSAhPSAwKQotICAgIG1lbWNweSAoZHN0LT5fbC5fbF9uYW1lLCBzcmMtPl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRzdC0+X2wuX2xfbC5fbF96ZXJvZXMgPSAwOwotICAgICAgZHN0LT5fbC5fbF9sLl9sX29mZnNldCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+X2wuX2xfbC5fbF9vZmZzZXQpOwotICAgIH0KLSAgZHN0LT5sX3ZhbHVlID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZhbHVlKTsKLSAgZHN0LT5sX3NjbnVtID0gYmZkX2dldF8xNiAoYWJmZCwgc3JjLT5sX3NjbnVtKTsKLSAgZHN0LT5sX3NtdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3JjLT5sX3NtdHlwZSk7Ci0gIGRzdC0+bF9zbWNsYXMgPSBiZmRfZ2V0XzggKGFiZmQsIHNyYy0+bF9zbWNsYXMpOwotICBkc3QtPmxfaWZpbGUgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfaWZpbGUpOwotICBkc3QtPmxfcGFybSA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9wYXJtKTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGxkc3ltIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkc3ltX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX2xkc3ltICpzcmM7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZHN0OwotewotICBpZiAoc3JjLT5fbC5fbF9sLl9sX3plcm9lcyAhPSAwKQotICAgIG1lbWNweSAoZHN0LT5fbC5fbF9uYW1lLCBzcmMtPl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIDAsIGRzdC0+X2wuX2xfbC5fbF96ZXJvZXMpOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5fbC5fbF9sLl9sX29mZnNldCwgZHN0LT5fbC5fbF9sLl9sX29mZnNldCk7Ci0gICAgfQotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfdmFsdWUsIGRzdC0+bF92YWx1ZSk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHNyYy0+bF9zY251bSwgZHN0LT5sX3NjbnVtKTsKLSAgYmZkX3B1dF84IChhYmZkLCBzcmMtPmxfc210eXBlLCBkc3QtPmxfc210eXBlKTsKLSAgYmZkX3B1dF84IChhYmZkLCBzcmMtPmxfc21jbGFzLCBkc3QtPmxfc21jbGFzKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2lmaWxlLCBkc3QtPmxfaWZpbGUpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfcGFybSwgZHN0LT5sX3Bhcm0pOwotfQotCi0vKiBTd2FwIGluIHRoZSBsZHJlbCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHJlbF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkcmVsICpzcmM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqZHN0OwotewotICBkc3QtPmxfdmFkZHIgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfdmFkZHIpOwotICBkc3QtPmxfc3ltbmR4ID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3N5bW5keCk7Ci0gIGRzdC0+bF9ydHlwZSA9IGJmZF9nZXRfMTYgKGFiZmQsIHNyYy0+bF9ydHlwZSk7Ci0gIGRzdC0+bF9yc2Vjbm0gPSBiZmRfZ2V0XzE2IChhYmZkLCBzcmMtPmxfcnNlY25tKTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGxkcmVsIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkcmVsX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX2xkcmVsICpzcmM7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqZHN0OwotewotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfdmFkZHIsIGRzdC0+bF92YWRkcik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9zeW1uZHgsIGRzdC0+bF9zeW1uZHgpOwotICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfcnR5cGUsIGRzdC0+bF9ydHlwZSk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHNyYy0+bF9yc2Vjbm0sIGRzdC0+bF9yc2Vjbm0pOwotfQotDAotLyogUm91dGluZXMgdG8gcmVhZCBYQ09GRiBkeW5hbWljIGluZm9ybWF0aW9uLiAgVGhpcyBkb24ndCByZWFsbHkKLSAgIGJlbG9uZyBoZXJlLCBidXQgd2UgYWxyZWFkeSBoYXZlIHRoZSBsZHN5bSBtYW5pcHVsYXRpb24gcm91dGluZXMKLSAgIGhlcmUuICAqLwotCi0vKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWMtPnVzZWRfYnlfYmZkID0gYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPQotCShiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKLQkJCQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzaXplIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpsc2VjOwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKLQotICByZXR1cm4gKGxkaGRyLmxfbnN5bXMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotLyogR2V0IHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgcHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnBzeW1zOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZWxzeW0sICplbHN5bWVuZDsKLSAgY29mZl9zeW1ib2xfdHlwZSAqc3ltYnVmOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gLTE7Ci0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotCi0gIHhjb2ZmX3N3YXBfbGRoZHJfaW4gKGFiZmQsIChzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKikgY29udGVudHMsICZsZGhkcik7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGNvbnRlbnRzICsgbGRoZHIubF9zdG9mZjsKLQotICBzeW1idWYgPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgbGRoZHIubF9uc3ltcyAqIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpKTsKLSAgaWYgKHN5bWJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGNvbnRlbnRzICsgTERIRFJTWik7Ci0gIGVsc3ltZW5kID0gZWxzeW0gKyBsZGhkci5sX25zeW1zOwotICBmb3IgKDsgZWxzeW0gPCBlbHN5bWVuZDsgZWxzeW0rKywgc3ltYnVmKyssIHBzeW1zKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOwotCi0gICAgICB4Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBlbHN5bSwgJmxkc3ltKTsKLQotICAgICAgc3ltYnVmLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLSAgICAgIGlmIChsZHN5bS5fbC5fbF9sLl9sX3plcm9lcyA9PSAwKQotCXN5bWJ1Zi0+c3ltYm9sLm5hbWUgPSBzdHJpbmdzICsgbGRzeW0uX2wuX2xfbC5fbF9vZmZzZXQ7Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBTWU1OTUxFTjsgaSsrKQotCSAgICBpZiAobGRzeW0uX2wuX2xfbmFtZVtpXSA9PSAnXDAnKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGkgPCBTWU1OTUxFTikKLQkgICAgc3ltYnVmLT5zeW1ib2wubmFtZSA9IChjaGFyICopIGVsc3ltLT5fbC5fbF9uYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqYzsKLQotCSAgICAgIGMgPSBiZmRfYWxsb2MgKGFiZmQsIFNZTU5NTEVOICsgMSk7Ci0JICAgICAgaWYgKGMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCSAgICAgIG1lbWNweSAoYywgbGRzeW0uX2wuX2xfbmFtZSwgU1lNTk1MRU4pOwotCSAgICAgIGNbU1lNTk1MRU5dID0gJ1wwJzsKLQkgICAgICBzeW1idWYtPnN5bWJvbC5uYW1lID0gYzsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxkc3ltLmxfc21jbGFzID09IFhNQ19YTykKLQlzeW1idWYtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UKLQlzeW1idWYtPnN5bWJvbC5zZWN0aW9uID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLAotCQkJCQkJCSAgICAgIGxkc3ltLmxfc2NudW0pOwotICAgICAgc3ltYnVmLT5zeW1ib2wudmFsdWUgPSBsZHN5bS5sX3ZhbHVlIC0gc3ltYnVmLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCi0gICAgICBzeW1idWYtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKLSAgICAgIGlmICgobGRzeW0ubF9zbXR5cGUgJiBMX0VYUE9SVCkgIT0gMCkKLQlzeW1idWYtPnN5bWJvbC5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCi0gICAgICAvKiBGSVhNRTogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBzdG9yZWQKLSAgICAgICAgIHdpdGggdGhlIGxvYWRlciBzeW1ib2wuICAqLwotCi0gICAgICAqcHN5bXMgPSAoYXN5bWJvbCAqKSBzeW1idWY7Ci0gICAgfQotCi0gICpwc3ltcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIGxkaGRyLmxfbnN5bXM7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gLTE7Ci0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOwotCi0gIHJldHVybiAobGRoZHIubF9ucmVsb2MgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotLyogVGhlIHR5cGljYWwgZHluYW1pYyByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHhjb2ZmX2R5bmFtaWNfcmVsb2MgPQotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpOyAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogR2V0IHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIHByZWxvY3MsIHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqKnByZWxvY3M7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0gIGFyZWxlbnQgKnJlbGJ1ZjsKLSAgc3RydWN0IGV4dGVybmFsX2xkcmVsICplbHJlbCwgKmVscmVsZW5kOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gLTE7Ci0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOwotCi0gIHJlbGJ1ZiA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgbGRoZHIubF9ucmVsb2MgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgaWYgKHJlbGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBlbHJlbCA9ICgoc3RydWN0IGV4dGVybmFsX2xkcmVsICopCi0JICAgKGNvbnRlbnRzICsgTERIRFJTWiArIGxkaGRyLmxfbnN5bXMgKiBMRFNZTVNaKSk7Ci0gIGVscmVsZW5kID0gZWxyZWwgKyBsZGhkci5sX25yZWxvYzsKLSAgZm9yICg7IGVscmVsIDwgZWxyZWxlbmQ7IGVscmVsKyssIHJlbGJ1ZisrLCBwcmVsb2NzKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotCi0gICAgICB4Y29mZl9zd2FwX2xkcmVsX2luIChhYmZkLCBlbHJlbCwgJmxkcmVsKTsKLQotICAgICAgaWYgKGxkcmVsLmxfc3ltbmR4ID49IDMpCi0JcmVsYnVmLT5zeW1fcHRyX3B0ciA9IHN5bXMgKyAobGRyZWwubF9zeW1uZHggLSAzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgc3dpdGNoIChsZHJlbC5sX3N5bW5keCkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgbmFtZSA9ICIudGV4dCI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBuYW1lID0gIi5kYXRhIjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAyOgotCSAgICAgIG5hbWUgPSAiLmJzcyI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgaWYgKHNlYyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIHJlbGJ1Zi0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgcmVsYnVmLT5hZGRyZXNzID0gbGRyZWwubF92YWRkcjsKLSAgICAgIHJlbGJ1Zi0+YWRkZW5kID0gMDsKLQotICAgICAgLyogTW9zdCBkeW5hbWljIHJlbG9jcyBoYXZlIHRoZSBzYW1lIHR5cGUuICBGSVhNRTogVGhpcyBpcyBvbmx5Ci0gICAgICAgICBjb3JyZWN0IGlmIGxkcmVsLmxfcnR5cGUgPT0gMC4gIEluIG90aGVyIGNhc2VzLCB3ZSBzaG91bGQgdXNlCi0gICAgICAgICBhIGRpZmZlcmVudCBob3d0by4gICovCi0gICAgICByZWxidWYtPmhvd3RvID0gJnhjb2ZmX2R5bmFtaWNfcmVsb2M7Ci0KLSAgICAgIC8qIEZJWE1FOiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGxfcnNlY25tIGZpZWxkLiAgKi8KLQotICAgICAgKnByZWxvY3MgPSByZWxidWY7Ci0gICAgfQotCi0gICpwcmVsb2NzID0gTlVMTDsKLQotICByZXR1cm4gbGRoZHIubF9ucmVsb2M7Ci19Ci0MCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXhjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT50b2Nfc2VjdGlvbiA9IE5VTEw7Ci0gICAgICByZXQtPnUudG9jX2luZHggPSAtMTsKLSAgICAgIHJldC0+ZGVzY3JpcHRvciA9IE5VTEw7Ci0gICAgICByZXQtPmxkc3ltID0gTlVMTDsKLSAgICAgIHJldC0+bGRpbmR4ID0gLTE7Ci0gICAgICByZXQtPmZsYWdzID0gMDsKLSAgICAgIHJldC0+c21jbGFzID0gWE1DX1VBOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLV9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwgeGNvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmRlYnVnX3N0cnRhYiA9IF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIHJldC0+ZGVidWdfc2VjdGlvbiA9IE5VTEw7Ci0gIHJldC0+bG9hZGVyX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPmxkcmVsX2NvdW50ID0gMDsKLSAgbWVtc2V0ICgmcmV0LT5sZGhkciwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIpKTsKLSAgcmV0LT5saW5rYWdlX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPnRvY19zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT5kZXNjcmlwdG9yX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPmltcG9ydHMgPSBOVUxMOwotICByZXQtPmZpbGVfYWxpZ24gPSAwOwotICByZXQtPnRleHRybyA9IGZhbHNlOwotICByZXQtPmdjID0gZmFsc2U7Ci0gIG1lbXNldCAocmV0LT5zcGVjaWFsX3NlY3Rpb25zLCAwLCBzaXplb2YgcmV0LT5zcGVjaWFsX3NlY3Rpb25zKTsKLQotICAvKiBUaGUgbGlua2VyIHdpbGwgYWx3YXlzIGdlbmVyYXRlIGEgZnVsbCBhLm91dCBoZWFkZXIuICBXZSBuZWVkIHRvCi0gICAgIHJlY29yZCB0aGF0IGZhY3Qgbm93LCBiZWZvcmUgdGhlIHNpemVvZl9oZWFkZXJzIHJvdXRpbmUgY291bGQgYmUKLSAgICAgY2FsbGVkLiAgKi8KLSAgeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkciA9IHRydWU7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gWENPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSB4Y29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLQkJCSAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGFuIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgWENPRkYgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIHhjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotDAotLyogUmVhZCBpbnRlcm5hbCByZWxvY3MgZm9yIGFuIFhDT0ZGIGNzZWN0LiAgVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kCi0gICBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3Mgd2hpY2ggdHJpZXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgYW55Ci0gICByZWxvY3Mgd2hpY2ggbWF5IGhhdmUgYmVlbiBjYWNoZWQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKgoteGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKLQkJCSAgICByZXF1aXJlX2ludGVybmFsLCBpbnRlcm5hbF9yZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYm9vbGVhbiBjYWNoZTsKLSAgICAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgICAgYm9vbGVhbiByZXF1aXJlX2ludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLXsKLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKLSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPT0gTlVMTAotICAgICAgJiYgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQotICAgICAgZW5jbG9zaW5nID0geGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5lbmNsb3Npbmc7Ci0KLSAgICAgIGlmIChlbmNsb3NpbmcgIT0gTlVMTAotCSAgJiYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpID09IE5VTEwKLQkgICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzID09IE5VTEwpCi0JICAmJiBjYWNoZQotCSAgJiYgZW5jbG9zaW5nLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgaWYgKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgZW5jbG9zaW5nLCB0cnVlLAotCQkJCQkgICAgICBleHRlcm5hbF9yZWxvY3MsIGZhbHNlLAotCQkJCQkgICAgICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpCi0JICAgICAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICBpZiAoZW5jbG9zaW5nICE9IE5VTEwKLQkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpICE9IE5VTEwKLQkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpLT5yZWxvY3MgIT0gTlVMTCkKLQl7Ci0JICBzaXplX3Qgb2ZmOwotCi0JICBvZmYgPSAoKHNlYy0+cmVsX2ZpbGVwb3MgLSBlbmNsb3NpbmctPnJlbF9maWxlcG9zKQotCQkgLyBiZmRfY29mZl9yZWxzeiAoYWJmZCkpOwotCSAgaWYgKCEgcmVxdWlyZV9pbnRlcm5hbCkKLQkgICAgcmV0dXJuIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpLT5yZWxvY3MgKyBvZmY7Ci0JICBtZW1jcHkgKGludGVybmFsX3JlbG9jcywKLQkJICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICsgb2ZmLAotCQkgIHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOwotCSAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKLQkJCQkJIHJlcXVpcmVfaW50ZXJuYWwsIGludGVybmFsX3JlbG9jcyk7Ci19Ci0MCi0vKiBHaXZlbiBhbiBYQ09GRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1fYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIHhjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLQotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICAvKiBJZiB0aGUgYXJjaGl2ZSBoYXMgYSBtYXAsIGRvIHRoZSB1c3VhbCBzZWFyY2guICBXZSB0aGVuIG5lZWQKLSAgICAgICAgIHRvIGNoZWNrIHRoZSBhcmNoaXZlIGZvciBzdHJpcHBlZCBkeW5hbWljIG9iamVjdHMsIGJlY2F1c2UKLSAgICAgICAgIHRoZXkgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBhcmNoaXZlIG1hcCBldmVuIHRob3VnaCB0aGV5Ci0gICAgICAgICBzaG91bGQsIHBlcmhhcHMsIGJlIGluY2x1ZGVkLiAgSWYgdGhlIGFyY2hpdmUgaGFzIG5vIG1hcCwgd2UKLSAgICAgICAgIGp1c3QgY29uc2lkZXIgZWFjaCBvYmplY3QgZmlsZSBpbiB0dXJuLCBzaW5jZSB0aGF0IGFwcGFyZW50bHkKLSAgICAgICAgIGlzIHdoYXQgdGhlIEFJWCBuYXRpdmUgbGlua2VyIGRvZXMuICAqLwotICAgICAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKLQl7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCQkgKGFiZmQsIGluZm8sIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHsKLQliZmQgKm1lbWJlcjsKLQotCW1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7Ci0Jd2hpbGUgKG1lbWJlciAhPSBOVUxMKQotCSAgewotCSAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAobWVtYmVyLCBiZmRfb2JqZWN0KQotCQkmJiAoISBiZmRfaGFzX21hcCAoYWJmZCkKLQkJICAgIHx8ICgobWVtYmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLQkJCSYmIChtZW1iZXItPmZsYWdzICYgSEFTX1NZTVMpID09IDApKSkKLQkgICAgICB7Ci0JCWJvb2xlYW4gbmVlZGVkOwotCi0JCWlmICghIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChtZW1iZXIsIGluZm8sICZuZWVkZWQpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKG5lZWRlZCkKLQkJICBtZW1iZXItPmFyY2hpdmVfcGFzcyA9IC0xOwotCSAgICAgIH0KLQkgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgbWVtYmVyKTsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIFhDT0ZGIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgeGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hlY2sgYSBzaW5nbGUgYXJjaGl2ZSBlbGVtZW50IHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGluY2x1ZGUgaXQgaW4KLSAgIHRoZSBsaW5rLiAgKlBORUVERUQgaXMgc2V0IGFjY29yZGluZyB0byB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcwotICAgbmVlZGVkIGluIHRoZSBsaW5rIG9yIG5vdC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgeGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCpwbmVlZGVkKQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgISAqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgb2JqZWN0IGZpbGUgc2hvdWxkIGJlCi0gICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmsKLSAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLSAgICByZXR1cm4geGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUICYmIHN5bS5uX3NjbnVtICE9IE5fVU5ERUYpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLCBhbmQgaXMgZGVmaW5lZCBieSB0aGlzCi0gICAgICAgICAgICAgb2JqZWN0IGZpbGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JICAgICB1bmRlZmluZWQuICBJZiBhIHN5bWJvbCBpcyBjdXJyZW50bHkga25vd24gdG8gYmUgY29tbW9uLAotCSAgICAgWENPRkYgbGlua2VycyBkbyBub3QgYnJpbmcgaW4gYW4gb2JqZWN0IGZpbGUgd2hpY2gKLQkgICAgIGRlZmluZXMgaXQuICBXZSBhbHNvIGRvbid0IGJyaW5nIGluIHN5bWJvbHMgdG8gc2F0aXNmeQotCSAgICAgdW5kZWZpbmVkIHJlZmVyZW5jZXMgaW4gc2hhcmVkIG9iamVjdHMuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYwotCQkgIHx8ICgoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmZsYWdzCi0JCSAgICAgICYgWENPRkZfREVGX0RZTkFNSUMpID09IDApKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBsb2FkZXIgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBkeW5hbWljIG9iamVjdAotICAgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgVGhlIG5hdGl2ZSBsaW5rZXIgdXNlcyB0aGUgbG9hZGVyCi0gICBzeW1ib2xzLCBub3QgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUsIHNvIHdlIGRvIHRvby4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpidWY7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgc3RydWN0IGV4dGVybmFsX2xkc3ltICplbHN5bSwgKmVsc3ltZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICBpZiAobHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBubyBzeW1ib2xzLCBzbyBkb24ndCB0cnkgdG8gaW5jbHVkZSBpdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxzZWMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgYnVmID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGJ1ZiwgJmxkaGRyKTsKLQotICBzdHJpbmdzID0gKGNoYXIgKikgYnVmICsgbGRoZHIubF9zdG9mZjsKLQotICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGJ1ZiArIExESERSU1opOwotICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKLSAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOwotICAgICAgY2hhciBuYW1idWZbU1lNTk1MRU4gKyAxXTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgeGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgZWxzeW0sICZsZHN5bSk7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZXhwb3J0ZWQgc3ltYm9scy4gICovCi0gICAgICBpZiAoKGxkc3ltLmxfc210eXBlICYgTF9FWFBPUlQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChsZHN5bS5fbC5fbF9sLl9sX3plcm9lcyA9PSAwKQotCW5hbWUgPSBzdHJpbmdzICsgbGRzeW0uX2wuX2xfbC5fbF9vZmZzZXQ7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChuYW1idWYsIGxkc3ltLl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLQkgIG5hbWJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCSAgbmFtZSA9IG5hbWJ1ZjsKLQl9Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseQotICAgICAgICAgdW5kZWZpbmVkLiAgQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgd2UgYXJlIHVzaW5nIGFuIFhDT0ZGCi0gICAgICAgICBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmICgoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmZsYWdzCi0JICAgICAgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMCkKLQl7Ci0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAqcG5lZWRlZCA9IHRydWU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgc2hhcmVkIG9iamVjdC4gICovCi0KLSAgaWYgKGJ1ZiAhPSBOVUxMICYmICEgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMpOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIHRoZSBpbmRleCBvZiByZWxvYyBpbiBSRUxPQ1Mgd2l0aCB0aGUgbGVhc3QgYWRkcmVzcyBncmVhdGVyCi0gICB0aGFuIG9yIGVxdWFsIHRvIEFERFJFU1MuICBUaGUgcmVsb2NzIGFyZSBzb3J0ZWQgYnkgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlCi14Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGNvdW50LCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBiZmRfc2l6ZV90eXBlIG1pbiwgbWF4LCB0aGlzOwotCi0gIGlmIChjb3VudCA8IDIpCi0gICAgewotICAgICAgaWYgKGNvdW50ID09IDEgJiYgcmVsb2NzWzBdLnJfdmFkZHIgPCBhZGRyZXNzKQotCXJldHVybiAxOwotICAgICAgZWxzZQotCXJldHVybiAwOwotICAgIH0KLQotICBtaW4gPSAwOwotICBtYXggPSBjb3VudDsKLQotICAvKiBEbyBhIGJpbmFyeSBzZWFyY2ggb3ZlciAobWluLG1heF0uICAqLwotICB3aGlsZSAobWluICsgMSA8IG1heCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHJhZGRyOwotCi0gICAgICB0aGlzID0gKG1heCArIG1pbikgLyAyOwotICAgICAgcmFkZHIgPSByZWxvY3NbdGhpc10ucl92YWRkcjsKLSAgICAgIGlmIChyYWRkciA+IGFkZHJlc3MpCi0JbWF4ID0gdGhpczsKLSAgICAgIGVsc2UgaWYgKHJhZGRyIDwgYWRkcmVzcykKLQltaW4gPSB0aGlzOwotICAgICAgZWxzZQotCXsKLQkgIG1pbiA9IHRoaXM7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChyZWxvY3NbbWluXS5yX3ZhZGRyIDwgYWRkcmVzcykKLSAgICByZXR1cm4gbWluICsgMTsKLQotICB3aGlsZSAobWluID4gMAotCSAmJiByZWxvY3NbbWluIC0gMV0ucl92YWRkciA9PSBhZGRyZXNzKQotICAgIC0tbWluOwotCi0gIHJldHVybiBtaW47Ci19Ci0KLS8qIEFkZCBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgWENPRkYgaXMgYSB3ZWlyZCBmb3JtYXQuICBBIG5vcm1hbCBYQ09GRiAubyBmaWxlcyB3aWxsIGhhdmUgdGhyZWUKLSAgIENPRkYgc2VjdGlvbnMtLS50ZXh0LCAuZGF0YSwgYW5kIC5ic3MtLWJ1dCBlYWNoIENPRkYgc2VjdGlvbiB3aWxsCi0gICBjb250YWluIG1hbnkgY3NlY3RzLiAgVGhlc2UgY3NlY3RzIGFyZSBkZXNjcmliZWQgaW4gdGhlIHN5bWJvbAotICAgdGFibGUuICBGcm9tIHRoZSBsaW5rZXIncyBwb2ludCBvZiB2aWV3LCBlYWNoIGNzZWN0IG11c3QgYmUKLSAgIGNvbnNpZGVyZWQgYSBzZWN0aW9uIGluIGl0cyBvd24gcmlnaHQuICBGb3IgZXhhbXBsZSwgYSBUT0MgZW50cnkgaXMKLSAgIGhhbmRsZWQgYXMgYSBzbWFsbCBYTUNfVEMgY3NlY3QuICBUaGUgbGlua2VyIG11c3QgYmUgYWJsZSB0byBtZXJnZQotICAgZGlmZmVyZW50IFRPQyBlbnRyaWVzIHRvZ2V0aGVyLCB3aGljaCBtZWFucyB0aGF0IGl0IG11c3QgYmUgYWJsZSB0bwotICAgZXh0cmFjdCB0aGUgWE1DX1RDIGNzZWN0cyBmcm9tIHRoZSAuZGF0YSBzZWN0aW9uIG9mIHRoZSBpbnB1dCAubwotICAgZmlsZS4KLQotICAgRnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiBvdXIgbGlua2VyLCB0aGlzIGlzLCBvZiBjb3Vyc2UsIGEgaGlkZW91cwotICAgbmlnaHRtYXJlLiAgV2UgY29wZSBieSBhY3R1YWxseSBjcmVhdGluZyBzZWN0aW9ucyBmb3IgZWFjaCBjc2VjdCwKLSAgIGFuZCBkaXNjYXJkaW5nIHRoZSBvcmlnaW5hbCBzZWN0aW9ucy4gIFdlIHRoZW4gaGF2ZSB0byBoYW5kbGUgdGhlCi0gICByZWxvY2F0aW9uIGVudHJpZXMgY2FyZWZ1bGx5LCBzaW5jZSB0aGUgb25seSB3YXkgdG8gdGVsbCB3aGljaAotICAgY3NlY3QgdGhleSBiZWxvbmcgdG8gaXMgdG8gZXhhbWluZSB0aGUgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgbl90bWFzazsKLSAgdW5zaWduZWQgaW50IG5fYnRzaGZ0OwotICBib29sZWFuIGRlZmF1bHRfY29weTsKLSAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBhc2VjdGlvbiAqKmNzZWN0X2NhY2hlOwotICBiZmRfc2l6ZV90eXBlIGxpbmVzejsKLSAgYXNlY3Rpb24gKm87Ci0gIGFzZWN0aW9uICpsYXN0X3JlYWw7Ci0gIGJvb2xlYW4ga2VlcF9zeW1zOwotICBhc2VjdGlvbiAqY3NlY3Q7Ci0gIHVuc2lnbmVkIGludCBjc2VjdF9pbmRleDsKLSAgYXNlY3Rpb24gKmZpcnN0X2NzZWN0OwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLSAgc3RydWN0IHJlbG9jX2luZm9fc3RydWN0Ci0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgICBhc2VjdGlvbiAqKmNzZWN0czsKLSAgICAgIGJmZF9ieXRlICpsaW5lbm9zOwotICAgIH0gKnJlbG9jX2luZm8gPSBOVUxMOwotCi0gIGtlZXBfc3ltcyA9IG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCk7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmspCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBidWlsZCBhIC5sb2FkZXIgc2VjdGlvbiwgc28gd2UgZG8gaXQgaGVyZS4gIFRoaXMKLQkgd29uJ3Qgd29yayBpZiB3ZSdyZSBwcm9kdWNpbmcgYW4gWENPRkYgb3V0cHV0IGZpbGUgd2l0aCBubwotCSBYQ09GRiBpbnB1dCBmaWxlcy4gIEZJWE1FLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbHNlYzsKLQotCSAgbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmxvYWRlciIpOwotCSAgaWYgKGxzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24gPSBsc2VjOwotCSAgbHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSBsaW5rYWdlIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbHNlYzsKLQotCSAgbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmdsIik7Ci0JICBpZiAobHNlYyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24gPSBsc2VjOwotCSAgbHNlYy0+ZmxhZ3MgfD0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJICB8IFNFQ19JTl9NRU1PUlkpOwotCSAgbHNlYy0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQl9Ci0gICAgICAvKiBMaWtld2lzZSBmb3IgdGhlIFRPQyBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqdHNlYzsKLQotCSAgdHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnRjIik7Ci0JICBpZiAodHNlYyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbiA9IHRzZWM7Ci0JICB0c2VjLT5mbGFncyB8PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgIHwgU0VDX0lOX01FTU9SWSk7Ci0JICB0c2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgZGVzY3JpcHRvciBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKmRzZWM7Ci0KLQkgIGRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5kcyIpOwotCSAgaWYgKGRzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uID0gZHNlYzsKLQkgIGRzZWMtPmZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSAgfCBTRUNfSU5fTUVNT1JZKTsKLQkgIGRzZWMtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb24gPT0gTlVMTAotCSAgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuZGVidWciKTsKLQkgIGlmIChkc2VjID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb24gPSBkc2VjOwotCSAgZHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0JfQotICAgIH0KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgISBpbmZvLT5zdGF0aWNfbGluaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuX3RtYXNrID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzazsKLSAgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0c2hmdDsKLQotICAvKiBEZWZpbmUgbWFjcm9zIHNvIHRoYXQgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotCi0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBkZWZhdWx0X2NvcHkgPSBmYWxzZTsKLSAgZWxzZQotICAgIGRlZmF1bHRfY29weSA9IHRydWU7Ci0KLSAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIGVhY2ggZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIChzeW1jb3VudAotCQkJICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpKTsKLSAgaWYgKHN5bV9oYXNoID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlcyA9IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoOwotICBtZW1zZXQgKHN5bV9oYXNoLCAwLAotCSAgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotCi0gIC8qIEJlY2F1c2Ugb2YgdGhlIHdlaXJkIHN0dWZmIHdlIGFyZSBkb2luZyB3aXRoIFhDT0ZGIGNzZWN0cywgd2UgY2FuCi0gICAgIG5vdCBlYXNpbHkgZGV0ZXJtaW5lIHdoaWNoIHNlY3Rpb24gYSBzeW1ib2wgaXMgaW4sIHNvIHdlIHN0b3JlCi0gICAgIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGRhdGEgZm9yIHRoZSBpbnB1dCBmaWxlLiAgKi8KLSAgY3NlY3RfY2FjaGUgPSAoKGFzZWN0aW9uICoqKQotCQkgYmZkX2FsbG9jIChhYmZkLCBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKGNzZWN0X2NhY2hlID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgeGNvZmZfZGF0YSAoYWJmZCktPmNzZWN0cyA9IGNzZWN0X2NhY2hlOwotICBtZW1zZXQgKGNzZWN0X2NhY2hlLCAwLCAoc2l6ZV90KSBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotCi0gIC8qIFdoaWxlIHNwbGl0dGluZyBzZWN0aW9ucyBpbnRvIGNzZWN0cywgd2UgbmVlZCB0byBhc3NpZ24gdGhlCi0gICAgIHJlbG9jcyBjb3JyZWN0bHkuICBUaGUgcmVsb2NzIGFuZCB0aGUgY3NlY3RzIG11c3QgYm90aCBiZSBpbgotICAgICBvcmRlciBieSBWTUEgd2l0aGluIGEgZ2l2ZW4gc2VjdGlvbiwgc28gd2UgaGFuZGxlIHRoaXMgYnkKLSAgICAgc2Nhbm5pbmcgYWxvbmcgdGhlIHJlbG9jcyBhcyB3ZSBwcm9jZXNzIHRoZSBjc2VjdHMuICBXZSBpbmRleAotICAgICBpbnRvIHJlbG9jX2luZm8gdXNpbmcgdGhlIHNlY3Rpb24gdGFyZ2V0X2luZGV4LiAgKi8KLSAgcmVsb2NfaW5mbyA9ICgoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0ICopCi0JCWJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJCSAgICAqIHNpemVvZiAoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0KSkpOwotICBpZiAocmVsb2NfaW5mbyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKChQVFIpIHJlbG9jX2luZm8sIDAsCi0JICAoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NfaW5mb19zdHJ1Y3QpKTsKLQotICAvKiBSZWFkIGluIHRoZSByZWxvY3MgYW5kIGxpbmUgbnVtYmVycyBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgbGFzdF9yZWFsID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgbGFzdF9yZWFsID0gbzsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9Ci0JICAgIHhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBvLCB0cnVlLCAoYmZkX2J5dGUgKikgTlVMTCwKLQkJCQkJZmFsc2UsIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCk7Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID0KLQkgICAgKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotCSAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBtZW1zZXQgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMsIDAsCi0JCSAgby0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQl9Ci0KLSAgICAgIGlmICgoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCSAgJiYgby0+bGluZW5vX2NvdW50ID4gMCkKLQl7Ci0JICBiZmRfYnl0ZSAqbGluZW5vczsKLQotCSAgbGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5saW5lbm9fY291bnQgKiBsaW5lc3opOwotCSAgaWYgKGxpbmVub3MgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyA9IGxpbmVub3M7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LCBhYmZkKQotCQkgICE9IGxpbmVzeiAqIG8tPmxpbmVub19jb3VudCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogRG9uJ3QgbGV0IHRoZSBsaW5rZXIgcmVsb2NhdGlvbiByb3V0aW5lcyBkaXNjYXJkIHRoZSBzeW1ib2xzLiAgKi8KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7Ci0KLSAgY3NlY3QgPSBOVUxMOwotICBjc2VjdF9pbmRleCA9IDA7Ci0gIGZpcnN0X2NzZWN0ID0gTlVMTDsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBCRkRfQVNTRVJUIChzeW1lc3ogPT0gYmZkX2NvZmZfYXV4ZXN6IChhYmZkKSk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIHN5bWNvdW50ICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotICAgICAgaW50IHNtdHlwOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpzZXRfdG9jOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJnN5bSk7Ci0KLSAgICAgIC8qIEluIHRoaXMgcGFzcyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgd2l0aCBjc2VjdAotICAgICAgICAgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCAmJiBzeW0ubl9zY2xhc3MgIT0gQ19ISURFWFQpCi0JewotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUgJiYgY3NlY3QgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9Ci0JCSgoZXN5bQotCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkgLyBzeW1lc3opOwotCSAgICAgIGNzZWN0ID0gTlVMTDsKLQkgICAgfQotCi0JICBpZiAoY3NlY3QgIT0gTlVMTCkKLQkgICAgKmNzZWN0X2NhY2hlID0gY3NlY3Q7Ci0JICBlbHNlIGlmIChmaXJzdF9jc2VjdCA9PSBOVUxMIHx8IHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgICpjc2VjdF9jYWNoZSA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgZWxzZQotCSAgICAqY3NlY3RfY2FjaGUgPSBOVUxMOwotCSAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0JICBzeW1faGFzaCArPSBzeW0ubl9udW1hdXggKyAxOwotCSAgY3NlY3RfY2FjaGUgKz0gc3ltLm5fbnVtYXV4ICsgMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJnN5bSwgYnVmKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBpdCwKLSAgICAgICAgIGFuZCB3ZSdyZSBub3Qgc3RyaXBwaW5nIGl0LCBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kCi0gICAgICAgICBhZGQgdGhlbSB0byB0aGUgY291bnQgZm9yIHRoaXMgY3NlY3QuICBJbiB0aGUgZmluYWwgbGluayBwYXNzCi0gICAgICAgICB3ZSBhcmUgZ29pbmcgdG8gYXR0YWNoIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGJ5IHN5bWJvbCwKLSAgICAgICAgIHJhdGhlciB0aGFuIGJ5IHNlY3Rpb24sIGluIG9yZGVyIHRvIG1vcmUgZWFzaWx5IGhhbmRsZQotICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgICAgIGlmICgoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCSAgJiYgc3ltLm5fbnVtYXV4ID4gMQotCSAgJiYgY3NlY3QgIT0gTlVMTAotCSAgJiYgSVNGQ04gKHN5bS5uX3R5cGUpKQotCXsKLQkgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhsaW47Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSAoZXN5bSArIHN5bWVzeiksCi0JCQkJc3ltLm5fdHlwZSwgc3ltLm5fc2NsYXNzLAotCQkJCTAsIHN5bS5uX251bWF1eCwgKFBUUikgJmF1eGxpbik7Ci0JICBpZiAoYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciAhPSAwKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGxpbm9mZjsKLQotCSAgICAgIGVuY2xvc2luZyA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5lbmNsb3Npbmc7Ci0JICAgICAgaWYgKGVuY2xvc2luZyA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IGAlcycgaGFzIGxpbmUgbnVtYmVycyBidXQgbm8gZW5jbG9zaW5nIHNlY3Rpb24iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBsaW5vZmYgPSAoYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cgotCQkJLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyk7Ci0JICAgICAgaWYgKGxpbm9mZiA8IGVuY2xvc2luZy0+bGluZW5vX2NvdW50ICogbGluZXN6KQotCQl7Ci0JCSAgc3RydWN0IGludGVybmFsX2xpbmVubyBsaW47Ci0JCSAgYmZkX2J5dGUgKmxpbnBzdGFydDsKLQotCQkgIGxpbnBzdGFydCA9IChyZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5saW5lbm9zCi0JCQkgICAgICAgKyBsaW5vZmYpOwotCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCAoUFRSKSBsaW5wc3RhcnQsIChQVFIpICZsaW4pOwotCQkgIGlmIChsaW4ubF9sbm5vID09IDAKLQkJICAgICAgJiYgKChiZmRfc2l6ZV90eXBlKSBsaW4ubF9hZGRyLmxfc3ltbmR4Ci0JCQkgID09ICgoZXN5bQotCQkJICAgICAgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkJICAgICAgLyBzeW1lc3opKSkKLQkJICAgIHsKLQkJICAgICAgYmZkX2J5dGUgKmxpbnBlbmQsICpsaW5wOwotCi0JCSAgICAgIGxpbnBlbmQgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ubGluZW5vcwotCQkJCSArIGVuY2xvc2luZy0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKLQkJICAgICAgZm9yIChsaW5wID0gbGlucHN0YXJ0ICsgbGluZXN6OwotCQkJICAgbGlucCA8IGxpbnBlbmQ7Ci0JCQkgICBsaW5wICs9IGxpbmVzeikKLQkJCXsKLQkJCSAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIChQVFIpIGxpbnAsCi0JCQkJCQkgICAoUFRSKSAmbGluKTsKLQkJCSAgaWYgKGxpbi5sX2xubm8gPT0gMCkKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgICAgY3NlY3QtPmxpbmVub19jb3VudCArPSAobGlucCAtIGxpbnBzdGFydCkgLyBsaW5lc3o7Ci0JCSAgICAgIC8qIFRoZSBzZXR0aW5nIG9mIGxpbmVfZmlsZXBvcyB3aWxsIG9ubHkgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgaWYgYWxsIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzIGZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3NlY3QgYXJlIGNvbnRpZ3VvdXM7IHRoaXMgb25seSBtYXR0ZXJzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIHJlcG9ydGluZy4gICovCi0JCSAgICAgIGlmIChjc2VjdC0+bGluZV9maWxlcG9zID09IDApCi0JCQljc2VjdC0+bGluZV9maWxlcG9zID0KLQkJCSAgYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBQaWNrIHVwIHRoZSBjc2VjdCBhdXhpbGlhcnkgaW5mb3JtYXRpb24uICAqLwotCi0gICAgICBpZiAoc3ltLm5fbnVtYXV4ID09IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogY2xhc3MgJWQgc3ltYm9sIGAlcycgaGFzIG5vIGF1eCBlbnRyaWVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3ltLm5fc2NsYXNzLCBuYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwKLQkJCSAgICAoUFRSKSAoZXN5bSArIHN5bWVzeiAqIHN5bS5uX251bWF1eCksCi0JCQkgICAgc3ltLm5fdHlwZSwgc3ltLm5fc2NsYXNzLAotCQkJICAgIHN5bS5uX251bWF1eCAtIDEsIHN5bS5uX251bWF1eCwKLQkJCSAgICAoUFRSKSAmYXV4KTsKLQotICAgICAgc210eXAgPSBTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCk7Ci0KLSAgICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIHNlY3Rpb24gPSBOVUxMOwotICAgICAgdmFsdWUgPSAwOwotICAgICAgc2V0X3RvYyA9IE5VTEw7Ci0KLSAgICAgIHN3aXRjaCAoc210eXApCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBzeW1ib2wgYCVzJyBoYXMgdW5yZWNvZ25pemVkIGNzZWN0IHR5cGUgJWQiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzbXR5cCk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JY2FzZSBYVFlfRVI6Ci0JICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfSElERVhUCi0JICAgICAgfHwgc3ltLm5fc2NudW0gIT0gTl9VTkRFRgotCSAgICAgIHx8IGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgIT0gMCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IGJhZCBYVFlfRVIgc3ltYm9sIGAlcyc6IGNsYXNzICVkIHNjbnVtICVkIHNjbmxlbiAlZCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHN5bS5uX3NjbGFzcywgc3ltLm5fc2NudW0sCi0JCSBhdXgueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBBbiBYTUNfWE8gZXh0ZXJuYWwgcmVmZXJlbmNlIGlzIGFjdHVhbGx5IGEgcmVmZXJlbmNlIHRvCi0gICAgICAgICAgICAgYW4gYWJzb2x1dGUgbG9jYXRpb24uICAqLwotCSAgaWYgKGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19YTykKLQkgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWx1ZSA9IHN5bS5uX3ZhbHVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgWFRZX1NEOgotCSAgLyogVGhpcyBpcyBhIGNzZWN0IGRlZmluaXRpb24uICAqLwotCi0JICBpZiAoY3NlY3QgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9Ci0JCSgoZXN5bQotCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkgLyBzeW1lc3opOwotCSAgICB9Ci0KLQkgIGNzZWN0ID0gTlVMTDsKLQkgIGNzZWN0X2luZGV4ID0gLTE7Ci0KLQkgIC8qIFdoZW4gd2Ugc2VlIGEgVE9DIGFuY2hvciwgd2UgcmVjb3JkIHRoZSBUT0MgdmFsdWUuICAqLwotCSAgaWYgKGF1eC54X2NzZWN0Lnhfc21jbGFzID09IFhNQ19UQzApCi0JICAgIHsKLQkgICAgICBpZiAoc3ltLm5fc2NsYXNzICE9IENfSElERVhUCi0JCSAgfHwgYXV4LnhfY3NlY3QueF9zY25sZW4ubCAhPSAwKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IFhNQ19UQzAgc3ltYm9sIGAlcycgaXMgY2xhc3MgJWQgc2NubGVuICVkIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHN5bS5uX3NjbGFzcywKLQkJICAgICBhdXgueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIHhjb2ZmX2RhdGEgKGFiZmQpLT50b2MgPSBzeW0ubl92YWx1ZTsKLQkgICAgfQotCi0JICAvKiBXZSBtdXN0IG1lcmdlIFRPQyBlbnRyaWVzIGZvciB0aGUgc2FtZSBzeW1ib2wuICBXZSBjYW4KLQkgICAgIG1lcmdlIHR3byBUT0MgZW50cmllcyBpZiB0aGV5IGFyZSBib3RoIENfSElERVhULCB0aGV5Ci0JICAgICBib3RoIGhhdmUgdGhlIHNhbWUgbmFtZSwgdGhleSBhcmUgYm90aCA0IGJ5dGVzIGxvbmcsIGFuZAotCSAgICAgdGhleSBib3RoIGhhdmUgYSByZWxvY2F0aW9uIHRhYmxlIGVudHJ5IGZvciBhbiBleHRlcm5hbAotCSAgICAgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMKLQkgICAgIHRoYXQgd2UgbXVzdCBsb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zLiAgSWNrLiAgKi8KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMKLQkgICAgICAmJiBzeW0ubl9zY2xhc3MgPT0gQ19ISURFWFQKLQkgICAgICAmJiBhdXgueF9jc2VjdC54X3Njbmxlbi5sID09IDQKLQkgICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotCSAgICAgIGJmZF9zaXplX3R5cGUgcmVsaW5keDsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLQotCSAgICAgIGVuY2xvc2luZyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICByZWxvY3MgPSByZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICAgICAgcmVsaW5keCA9IHhjb2ZmX2ZpbmRfcmVsb2MgKHJlbG9jcywgZW5jbG9zaW5nLT5yZWxvY19jb3VudCwKLQkJCQkJICBzeW0ubl92YWx1ZSk7Ci0JICAgICAgcmVsID0gcmVsb2NzICsgcmVsaW5keDsKLQkgICAgICBpZiAocmVsaW5keCA8IGVuY2xvc2luZy0+cmVsb2NfY291bnQKLQkJICAmJiByZWwtPnJfdmFkZHIgPT0gKGJmZF92bWEpIHN5bS5uX3ZhbHVlCi0JCSAgJiYgcmVsLT5yX3NpemUgPT0gMzEKLQkJICAmJiByZWwtPnJfdHlwZSA9PSBSX1BPUykKLQkJewotCQkgIGJmZF9ieXRlICplcmVsc3ltOwotCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgcmVsc3ltOwotCi0JCSAgZXJlbHN5bSA9ICgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCSAgICAgKyByZWwtPnJfc3ltbmR4ICogc3ltZXN6KTsKLQkJICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXJlbHN5bSwgKFBUUikgJnJlbHN5bSk7Ci0JCSAgaWYgKHJlbHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqcmVsbmFtZTsKLQkJICAgICAgY2hhciByZWxidWZbU1lNTk1MRU4gKyAxXTsKLQkJICAgICAgYm9vbGVhbiBjb3B5OwotCQkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHRoZSBUT0MgZW50cnkgaXMKLQkJCSBmb3IgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbC4gICovCi0JCSAgICAgIHJlbG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZyZWxzeW0sCi0JCQkJCQkJCXJlbGJ1Zik7Ci0JCSAgICAgIGlmIChyZWxuYW1lID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBXZSBvbmx5IG1lcmdlIFRPQyBlbnRyaWVzIGlmIHRoZSBUQyBuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhlIHN5bWJvbCBuYW1lLiAgVGhpcyBoYW5kbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5vcm1hbCBjYXNlLCBidXQgbm90IGNvbW1vbiBjYXNlcyBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgU1lNLlA0IHdoaWNoIGdjYyBnZW5lcmF0ZXMgdG8gc3RvcmUgU1lNICsgNAotICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBUT0MuICBGSVhNRS4gICovCi0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHJlbG5hbWUpID09IDApCi0JCQl7Ci0JCQkgIGNvcHkgPSAoISBpbmZvLT5rZWVwX21lbW9yeQotCQkJCSAgfHwgcmVsc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkJCQkgIHx8IHJlbHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKTsKLQkJCSAgaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAgcmVsbmFtZSwgdHJ1ZSwgY29weSwKLQkJCQkJCSAgICAgIGZhbHNlKTsKLQkJCSAgaWYgKGggPT0gTlVMTCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICAvKiBBdCB0aGlzIHBvaW50IGgtPnJvb3QudHlwZSBjb3VsZCBiZQotCQkJICAgICBiZmRfbGlua19oYXNoX25ldy4gIFRoYXQgc2hvdWxkIGJlIE9LLAotCQkJICAgICBzaW5jZSB3ZSBrbm93IGZvciBzdXJlIHRoYXQgd2Ugd2lsbCBjb21lCi0JCQkgICAgIGFjcm9zcyB0aGlzIHN5bWJvbCBhcyB3ZSBzdGVwIHRocm91Z2ggdGhlCi0JCQkgICAgIGZpbGUuICAqLwotCi0JCQkgIC8qIFdlIHN0b3JlIGggaW4gKnN5bV9oYXNoIGZvciB0aGUKLQkJCSAgICAgY29udmVuaWVuY2Ugb2YgdGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkJCSAgICAgZnVuY3Rpb24uICAqLwotCQkJICAqc3ltX2hhc2ggPSBoOwotCi0JCQkgIGlmIChoLT50b2Nfc2VjdGlvbiAhPSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIGFzZWN0aW9uICoqcmVsX2NzZWN0czsKLQotCQkJICAgICAgLyogV2UgYWxyZWFkeSBoYXZlIGEgVE9DIGVudHJ5IGZvciB0aGlzCi0JCQkJIHN5bWJvbCwgc28gd2UgY2FuIGp1c3QgaWdub3JlIHRoaXMKLQkJCQkgb25lLiAgKi8KLQkJCSAgICAgIHJlbF9jc2VjdHMgPQotCQkJCXJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmNzZWN0czsKLQkJCSAgICAgIHJlbF9jc2VjdHNbcmVsaW5keF0gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCi0JCQkgIC8qIFdlIGFyZSBhYm91dCB0byBjcmVhdGUgYSBUT0MgZW50cnkgZm9yCi0JCQkgICAgIHRoaXMgc3ltYm9sLiAgKi8KLQkJCSAgc2V0X3RvYyA9IGg7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBzZWN0aW9uLiAgV2UgZ2V0IHRoZSBuYW1lIGZyb20KLQkgICAgIHRoZSBjc2VjdCBzdG9yYWdlIG1hcHBpbmcgY2xhc3MsIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4KLQkgICAgIGFjY3VtdWxhdGUgc2ltaWxhciBjc2VjdHMgdG9nZXRoZXIuICAqLwotCSAgewotCSAgICBzdGF0aWMgY29uc3QgY2hhciAqY3NlY3RfbmFtZV9ieV9jbGFzc1tdID0KLQkgICAgICB7Ci0JCSIucHIiLCAiLnJvIiwgIi5kYiIsICIudGMiLCAiLnVhIiwgIi5ydyIsICIuZ2wiLCAiLnhvIiwKLQkJIi5zdiIsICIuYnMiLCAiLmRzIiwgIi51YyIsICIudGkiLCAiLnRiIiwgTlVMTCwgIi50YzAiLAotCQkiLnRkIgotCSAgICAgIH07Ci0JICAgIGNvbnN0IGNoYXIgKmNzZWN0X25hbWU7Ci0JICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0KLQkgICAgaWYgKChhdXgueF9jc2VjdC54X3NtY2xhcyA+PQotCQkgc2l6ZW9mIGNzZWN0X25hbWVfYnlfY2xhc3MgLyBzaXplb2YgY3NlY3RfbmFtZV9ieV9jbGFzc1swXSkKLQkJfHwgY3NlY3RfbmFtZV9ieV9jbGFzc1thdXgueF9jc2VjdC54X3NtY2xhc10gPT0gTlVMTCkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBzbWNsYXMgJWQiKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIGF1eC54X2NzZWN0Lnhfc21jbGFzKTsKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIH0KLQotCSAgICBjc2VjdF9uYW1lID0gY3NlY3RfbmFtZV9ieV9jbGFzc1thdXgueF9jc2VjdC54X3NtY2xhc107Ci0JICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIGNzZWN0X25hbWUpOwotCSAgICBpZiAoY3NlY3QgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgZW5jbG9zaW5nID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBzeW0ubl9zY251bSk7Ci0JICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChlbmNsb3NpbmcpCi0JCSYmICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPCBlbmNsb3NpbmctPnZtYQotCQkgICAgfHwgKChiZmRfdm1hKSBzeW0ubl92YWx1ZSArIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwKLQkJCT4gZW5jbG9zaW5nLT52bWEgKyBlbmNsb3NpbmctPl9yYXdfc2l6ZSkpKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiBjc2VjdCBgJXMnIG5vdCBpbiBlbmNsb3Npbmcgc2VjdGlvbiIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0JICAgIGNzZWN0LT52bWEgPSBzeW0ubl92YWx1ZTsKLQkgICAgY3NlY3QtPmZpbGVwb3MgPSAoZW5jbG9zaW5nLT5maWxlcG9zCi0JCQkgICAgICArIHN5bS5uX3ZhbHVlCi0JCQkgICAgICAtIGVuY2xvc2luZy0+dm1hKTsKLQkgICAgY3NlY3QtPl9yYXdfc2l6ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIGNzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBTTVRZUF9BTElHTiAoYXV4LnhfY3NlY3QueF9zbXR5cCk7Ci0KLQkgICAgLyogUmVjb3JkIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiBpbiB0aGUgdGRhdGEgZm9yIHRoaXMgbmV3Ci0JICAgICAgIHNlY3Rpb24uICAqLwotCSAgICBjc2VjdC0+dXNlZF9ieV9iZmQgPQotCSAgICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgICBpZiAoY3NlY3QtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID0KLQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9PSBOVUxMKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+ZW5jbG9zaW5nID0gZW5jbG9zaW5nOwotCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGluZW5vX2NvdW50ID0KLQkgICAgICBlbmNsb3NpbmctPmxpbmVub19jb3VudDsKLQotCSAgICBpZiAoZW5jbG9zaW5nLT5vd25lciA9PSBhYmZkKQotCSAgICAgIHsKLQkJc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0JCWJmZF9zaXplX3R5cGUgcmVsaW5keDsKLQkJc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0JCWFzZWN0aW9uICoqcmVsX2NzZWN0OwotCi0JCXJlbG9jcyA9IHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLQkJcmVsaW5keCA9IHhjb2ZmX2ZpbmRfcmVsb2MgKHJlbG9jcywgZW5jbG9zaW5nLT5yZWxvY19jb3VudCwKLQkJCQkJICAgIGNzZWN0LT52bWEpOwotCQlyZWwgPSByZWxvY3MgKyByZWxpbmR4OwotCQlyZWxfY3NlY3QgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0uY3NlY3RzCi0JCQkgICAgICsgcmVsaW5keCk7Ci0JCWNzZWN0LT5yZWxfZmlsZXBvcyA9IChlbmNsb3NpbmctPnJlbF9maWxlcG9zCi0JCQkJICAgICAgKyByZWxpbmR4ICogYmZkX2NvZmZfcmVsc3ogKGFiZmQpKTsKLQkJd2hpbGUgKHJlbGluZHggPCBlbmNsb3NpbmctPnJlbG9jX2NvdW50Ci0JCSAgICAgICAmJiAqcmVsX2NzZWN0ID09IE5VTEwKLQkJICAgICAgICYmIHJlbC0+cl92YWRkciA8IGNzZWN0LT52bWEgKyBjc2VjdC0+X3Jhd19zaXplKQotCQkgIHsKLQkJICAgICpyZWxfY3NlY3QgPSBjc2VjdDsKLQkJICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JCSAgICArK2NzZWN0LT5yZWxvY19jb3VudDsKLQkJICAgICsrcmVsaW5keDsKLQkJICAgICsrcmVsOwotCQkgICAgKytyZWxfY3NlY3Q7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygb3RoZXIgZmllbGRzIGFuZCBzZWN0aW9uIGZsYWdzCi0JICAgICAgIHdoaWNoIHdlIGRvIG5vdCBib3RoZXIgdG8gc2V0LiAgKi8KLQotCSAgICBjc2VjdF9pbmRleCA9ICgoZXN5bQotCQkJICAgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkJICAgLyBzeW1lc3opOwotCi0JICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5maXJzdF9zeW1uZHggPSBjc2VjdF9pbmRleDsKLQotCSAgICBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCkKLQkgICAgICBmaXJzdF9jc2VjdCA9IGNzZWN0OwotCi0JICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIENfRVhULCB3ZSB0cmVhdCBpdCBhcyBzdGFydGluZyBhdCB0aGUKLQkgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBuZXdseSBjcmVhdGVkIHNlY3Rpb24uICAqLwotCSAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQotCSAgICAgIHsKLQkJc2VjdGlvbiA9IGNzZWN0OwotCQl2YWx1ZSA9IDA7Ci0JICAgICAgfQotCi0JICAgIC8qIElmIHRoaXMgaXMgYSBUT0Mgc2VjdGlvbiBmb3IgYSBzeW1ib2wsIHJlY29yZCBpdC4gICovCi0JICAgIGlmIChzZXRfdG9jICE9IE5VTEwpCi0JICAgICAgc2V0X3RvYy0+dG9jX3NlY3Rpb24gPSBjc2VjdDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBYVFlfTEQ6Ci0JICAvKiBUaGlzIGlzIGEgbGFiZWwgZGVmaW5pdGlvbi4gIFRoZSB4X3NjbmxlbiBmaWVsZCBpcyB0aGUKLSAgICAgICAgICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIGNzZWN0LiAgSSBiZWxpZXZlIHRoYXQgdGhpcyBtdXN0Ci0gICAgICAgICAgICAgYWx3YXlzIGZvbGxvdyB0aGUgYXBwcm9wcmlhdGUgWFRZX1NEIHN5bWJvbCwgc28gSSB3aWxsCi0gICAgICAgICAgICAgaW5zaXN0IG9uIGl0LiAgKi8KLQkgIHsKLQkgICAgYm9vbGVhbiBiYWQ7Ci0KLQkgICAgYmFkID0gZmFsc2U7Ci0JICAgIGlmIChhdXgueF9jc2VjdC54X3Njbmxlbi5sIDwgMAotCQl8fCAoYXV4LnhfY3NlY3QueF9zY25sZW4ubAotCQkgICAgPj0gZXN5bSAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkpCi0JICAgICAgYmFkID0gdHJ1ZTsKLQkgICAgaWYgKCEgYmFkKQotCSAgICAgIHsKLQkJc2VjdGlvbiA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHNbYXV4LnhfY3NlY3QueF9zY25sZW4ubF07Ci0JCWlmIChzZWN0aW9uID09IE5VTEwKLQkJICAgIHx8IChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JCSAgYmFkID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgIGlmIChiYWQpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IG1pc3BsYWNlZCBYVFlfTEQgYCVzJyIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgdmFsdWUgPSBzeW0ubl92YWx1ZSAtIGNzZWN0LT52bWE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgWFRZX0NNOgotCSAgLyogVGhpcyBpcyBhbiB1bml0aWFsaXplZCBjc2VjdC4gIFdlIGNvdWxkIGJhc2UgdGhlIG5hbWUgb24KLSAgICAgICAgICAgICB0aGUgc3RvcmFnZSBtYXBwaW5nIGNsYXNzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGV4Y2VwdCBmb3IKLSAgICAgICAgICAgICBhbiBYTUNfVEQgc3ltYm9sLiAgSWYgdGhpcyBjc2VjdCBpcyBleHRlcm5hbGx5IHZpc2libGUsCi0gICAgICAgICAgICAgaXQgaXMgYSBjb21tb24gc3ltYm9sLiAgV2UgcHV0IFhNQ19URCBzeW1ib2xzIGluIHNlY3Rpb25zCi0gICAgICAgICAgICAgbmFtZWQgLnRvY2JzcywgYW5kIHJlbHkgb24gdGhlIGxpbmtlciBzY3JpcHQgdG8gcHV0IHRoYXQKLSAgICAgICAgICAgICBpbiB0aGUgVE9DIGFyZWEuICAqLwotCi0JICBpZiAoY3NlY3QgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9Ci0JCSgoZXN5bQotCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkgLyBzeW1lc3opOwotCSAgICB9Ci0KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEQpCi0JICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIudG9jYnNzIik7Ci0JICBlbHNlCi0JICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuYnNzIik7Ci0JICBpZiAoY3NlY3QgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBjc2VjdC0+dm1hID0gc3ltLm5fdmFsdWU7Ci0JICBjc2VjdC0+X3Jhd19zaXplID0gYXV4LnhfY3NlY3QueF9zY25sZW4ubDsKLQkgIGNzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gU01UWVBfQUxJR04gKGF1eC54X2NzZWN0Lnhfc210eXApOwotCSAgLyogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIGZpZWxkcyBhbmQgc2VjdGlvbiBmbGFncwotCSAgICAgd2hpY2ggd2UgZG8gbm90IGJvdGhlciB0byBzZXQuICAqLwotCi0JICBjc2VjdF9pbmRleCA9ICgoZXN5bQotCQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJCSAvIHN5bWVzeik7Ci0KLQkgIGNzZWN0LT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNzZWN0LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID0KLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmZpcnN0X3N5bW5keCA9IGNzZWN0X2luZGV4OwotCi0JICBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCkKLQkgICAgZmlyc3RfY3NlY3QgPSBjc2VjdDsKLQotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgewotCSAgICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICAgIGNzZWN0LT5fcmF3X3NpemUgPSAwOwotCSAgICAgIHNlY3Rpb24gPSBjc2VjdDsKLQkgICAgICB2YWx1ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBDaGVjayBmb3IgbWFnaWMgc3ltYm9sIG5hbWVzLiAgKi8KLSAgICAgIGlmICgoc210eXAgPT0gWFRZX1NEIHx8IHNtdHlwID09IFhUWV9DTSkKLQkgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19UQwotCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgIT0gWE1DX1REKQotCXsKLQkgIGludCBpOwotCi0JICBpID0gLTE7Ci0JICBpZiAobmFtZVswXSA9PSAnXycpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiX3RleHQiKSA9PSAwKQotCQlpID0gMDsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZXRleHQiKSA9PSAwKQotCQlpID0gMTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZGF0YSIpID09IDApCi0JCWkgPSAyOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9lZGF0YSIpID09IDApCi0JCWkgPSAzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9lbmQiKSA9PSAwKQotCQlpID0gNDsKLQkgICAgfQotCSAgZWxzZSBpZiAobmFtZVswXSA9PSAnZScgJiYgc3RyY21wIChuYW1lLCAiZW5kIikgPT0gMCkKLQkgICAgaSA9IDU7Ci0KLQkgIGlmIChpICE9IC0xKQotCSAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3BlY2lhbF9zZWN0aW9uc1tpXSA9IGNzZWN0OwotCX0KLQotICAgICAgLyogTm93IHdlIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFkZCB0aGUgc3ltYm9sIHRvIHRoZQotICAgICAgICAgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0gICAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQotCXsKLQkgIGJvb2xlYW4gY29weTsKLQotCSAgQkZEX0FTU0VSVCAoc2VjdGlvbiAhPSBOVUxMKTsKLQotCSAgLyogV2UgbXVzdCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5IGlmIHdlIGdvdCBpdCBmcm9tIHRoZQotICAgICAgICAgICAgIHN5bWVudCBpdHNlbGYsIHJhdGhlciB0aGFuIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgY29weSA9IGRlZmF1bHRfY29weTsKLQkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgIT0gMAotCSAgICAgIHx8IHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotCSAgICBjb3B5ID0gdHJ1ZTsKLQotCSAgLyogVGhlIEFJWCBsaW5rZXIgYXBwZWFycyB0byBvbmx5IGRldGVjdCBtdWx0aXBsZSBzeW1ib2wKLQkgICAgIGRlZmluaXRpb25zIHdoZW4gdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbC4gIElmCi0JICAgICBhIHN5bWJvbCBpcyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzLCBhbmQgdGhlIG9ubHkKLQkgICAgIHJlZmVyZW5jZXMgYXJlIGZyb20gdGhlIHNhbWUgb2JqZWN0IGZpbGUsIHRoZSBBSVggbGlua2VyCi0JICAgICBhcHBlYXJzIHRvIHBlcm1pdCBpdC4gIEl0IGRvZXMgbm90IG1lcmdlIHRoZSBkaWZmZXJlbnQKLQkgICAgIGRlZmluaXRpb25zLCBidXQgaGFuZGxlcyB0aGVtIGluZGVwZW5kZW50bHkuICBPbiB0aGUKLQkgICAgIG90aGVyIGhhbmQsIGlmIHRoZXJlIGlzIGEgcmVmZXJlbmNlLCB0aGUgbGlua2VyIHJlcG9ydHMKLQkgICAgIGFuIGVycm9yLgotCi0JICAgICBUaGlzIG1hdHRlcnMgYmVjYXVzZSB0aGUgQUlYIDxuZXQvbmV0X2dsb2JhbHMuaD4gaGVhZGVyCi0JICAgICBmaWxlIGFjdHVhbGx5IGRlZmluZXMgYW4gaW5pdGlhbGl6ZWQgYXJyYXksIHNvIHdlIGhhdmUgdG8KLQkgICAgIGFjdHVhbGx5IHBlcm1pdCB0aGF0IHRvIHdvcmsuCi0KLQkgICAgIEp1c3QgdG8gbWFrZSBtYXR0ZXJzIGV2ZW4gbW9yZSBjb25mdXNpbmcsIHRoZSBBSVggbGlua2VyCi0JICAgICBhcHBlYXJzIHRvIHBlcm1pdCBtdWx0aXBsZSBzeW1ib2wgZGVmaW5pdGlvbnMgd2hlbmV2ZXIKLQkgICAgIHRoZSBzZWNvbmQgZGVmaW5pdGlvbiBpcyBpbiBhbiBhcmNoaXZlIHJhdGhlciB0aGFuIGFuCi0JICAgICBvYmplY3QgZmlsZS4gIFRoaXMgbWF5IGJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIG1hbm5lciBpbgotCSAgICAgd2hpY2ggaXQgaGFuZGxlcyBhcmNoaXZlczogSSB0aGluayBpdCBtYXkgbG9hZCB0aGUgZW50aXJlCi0JICAgICBhcmNoaXZlIGluIGFzIHNlcGFyYXRlIGNzZWN0cywgYW5kIHRoZW4gbGV0IGdhcmJhZ2UKLQkgICAgIGNvbGxlY3Rpb24gZGlzY2FyZCBzeW1ib2xzLgotCi0JICAgICBXZSBhbHNvIGhhdmUgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHN0YXRpY2FsbHkgbGlua2luZyBhCi0JICAgICBzaGFyZWQgb2JqZWN0LCB3aGljaCB3aWxsIGNhdXNlIHN5bWJvbCByZWRlZmluaXRpb25zLAotCSAgICAgYWx0aG91Z2ggdGhpcyBpcyBhbiBlYXNpZXIgY2FzZSB0byBkZXRlY3QuICAqLwotCi0JICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLQkJKnN5bV9oYXNoID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgICAgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOwotCSAgICAgIGVsc2UKLQkJKnN5bV9oYXNoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsCi0JCQkJCQkJICAgdHJ1ZSwgY29weSwgZmFsc2UpKTsKLQkgICAgICBpZiAoKnN5bV9oYXNoID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGlmICgoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgJiYgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0JCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHNlY29uZCBkZWZpbml0aW9uIG9mIGEgZGVmaW5lZCBzeW1ib2wuICAqLwotCQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmICgoKnN5bV9oYXNoKS0+c21jbGFzICE9IFhNQ19HTAotCQkJICB8fCBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfR0wKLQkJCSAgfHwgKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICAgICAgJiBEWU5BTUlDKSA9PSAwKSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIG5ldyBzeW1ib2wgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBub3QgZ2xvYmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZSBjb2RlIG9yIHRoaXMgc3ltYm9sIGlzIGdsb2JhbCBsaW5rYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29kZS4gIElmIHRoZSBleGlzdGluZyBzeW1ib2wgaXMgZ2xvYmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZSBjb2RlIGFuZCB0aGUgbmV3IHN5bWJvbCBpcyBub3QsIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB3ZSB3YW50IHRvIHVzZSB0aGUgbmV3IHN5bWJvbC4gICovCi0JCSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkgICAgICB2YWx1ZSA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICAgICYgRFlOQU1JQykgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZSBpdC4gICovCi0JCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkJICAgICAgKCpzeW1faGFzaCktPnJvb3QudS51bmRlZi5hYmZkID0KLQkJCSgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIHJlZGVmaW5pdGlvbiBpbiBhbiBvYmplY3QgY29udGFpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4gYW4gYXJjaGl2ZS4gIEp1c3QgaWdub3JlIGl0LiAgU2VlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgYWJvdmUuICAqLwotCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCgqc3ltX2hhc2gpLT5yb290Lm5leHQgIT0gTlVMTAotCQkJICAgfHwgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgPT0gJigqc3ltX2hhc2gpLT5yb290KQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLiAgSW4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UsIHdlIGp1c3QgY29udGludWUgYW5kIHBlcm1pdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgU2VlIHRoZSBjb21tZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgYWJvdXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4gICovCi0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKCpzeW1faGFzaCktPnNtY2xhcyA9PSBhdXgueF9jc2VjdC54X3NtY2xhcykKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIHN5bWJvbHMgYXJlIGJvdGggY3NlY3RzIG9mIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuICBUaGVyZSBpcyBhdCBsZWFzdCBhIGNoYW5jZSB0aGF0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhIHNlbWktbGVnaXRpbWF0ZSByZWRlZmluaXRpb24uICAqLwotCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgICAoKnN5bV9oYXNoKS0+ZmxhZ3MgfD0gWENPRkZfTVVMVElQTFlfREVGSU5FRDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKCgoKnN5bV9oYXNoKS0+ZmxhZ3MgJiBYQ09GRl9NVUxUSVBMWV9ERUZJTkVEKSAhPSAwCi0JCSAgICAgICAmJiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgICAgJiYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikKLQkJCSAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIG11bHRpcGx5IGRlZmluZWQgc3ltYm9sLgotCQkgICAgIFJlcG9ydCB0aGUgZXJyb3Igbm93LiAgU2VlIHRoZSBjb21tZW50IGFib3ZlCi0JCSAgICAgYWJvdXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4gIFdlIGNvdWxkCi0JCSAgICAgYWxzbyBkbyB0aGlzIHdpdGggd2FybmluZyBzeW1ib2xzLCBidXQgSSdtIG5vdAotCQkgICAgIHN1cmUgdGhlIFhDT0ZGIGxpbmtlciBpcyB3aG9sbHkgcHJlcGFyZWQgdG8KLQkJICAgICBoYW5kbGUgdGhlbSwgYW5kIHRoYXQgd291bGQgb25seSBiZSBhIHdhcm5pbmcsCi0JCSAgICAgbm90IGFuIGVycm9yLiAgKi8KLQkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2RlZmluaXRpb24pCi0JCQkgKGluZm8sICgqc3ltX2hhc2gpLT5yb290LnJvb3Quc3RyaW5nLAotCQkJICAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLCAwLAotCQkJICAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiwKLQkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIC8qIFRyeSBub3QgdG8gZ2l2ZSB0aGlzIGVycm9yIHRvbyBtYW55IHRpbWVzLiAgKi8KLQkJICAoKnN5bV9oYXNoKS0+ZmxhZ3MgJj0gflhDT0ZGX01VTFRJUExZX0RFRklORUQ7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCBtYXkgY2FsbCB0aGUgbGlua2VyIHRvCi0JICAgICBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIGxpbmtlciBtYXkgdHJ5IHRvIHJlYWQKLQkgICAgIHRoZSBzeW1ib2wgdGFibGUgdG8gZ2l2ZSBhIGdvb2QgZXJyb3IuICBSaWdodCBub3csIHRoZQotCSAgICAgbGluZSBudW1iZXJzIGFyZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUsIHNpbmNlIHRoZXkgYXJlCi0JICAgICBjb3VudGVkIGJvdGggaW4gdGhlIHJlYWwgc2VjdGlvbnMgYW5kIGluIHRoZSBuZXcgY3NlY3RzLgotCSAgICAgV2UgbmVlZCB0byBsZWF2ZSB0aGUgY291bnQgaW4gdGhlIHJlYWwgc2VjdGlvbnMgc28gdGhhdAotCSAgICAgdGhlIGxpbmtlciBjYW4gcmVwb3J0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXJyb3IKLQkgICAgIGNvcnJlY3RseSwgc28gdGVtcG9yYXJpbHkgY2xvYmJlciB0aGUgbGluayB0byB0aGUgY3NlY3RzCi0JICAgICBzbyB0aGF0IHRoZSBsaW5rZXIgd2lsbCBub3QgdHJ5IHRvIHJlYWQgdGhlIGxpbmUgbnVtYmVycwotCSAgICAgYSBzZWNvbmQgdGltZSBmcm9tIHRoZSBjc2VjdHMuICAqLwotCSAgQkZEX0FTU0VSVCAobGFzdF9yZWFsLT5uZXh0ID09IGZpcnN0X2NzZWN0KTsKLQkgIGxhc3RfcmVhbC0+bmV4dCA9IE5VTEw7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCSAgKGNvbnN0IGNoYXIgKikgTlVMTCwgY29weSwgdHJ1ZSwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbGFzdF9yZWFsLT5uZXh0ID0gZmlyc3RfY3NlY3Q7Ci0KLQkgIGlmIChzbXR5cCA9PSBYVFlfQ00pCi0JICAgIHsKLQkgICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbgotCQkgIHx8ICgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5zZWN0aW9uICE9IGNzZWN0KQotCQl7Ci0JCSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgY29tbW9uIGNzZWN0IHdlIGp1c3QgY3JlYXRlZC4gICovCi0JCSAgY3NlY3QtPl9yYXdfc2l6ZSA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyCi0JCSAgICAgPSBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIGludCBmbGFnOwotCi0JICAgICAgaWYgKHNtdHlwID09IFhUWV9FUiB8fCBzbXR5cCA9PSBYVFlfQ00pCi0JCWZsYWcgPSBYQ09GRl9SRUZfUkVHVUxBUjsKLQkgICAgICBlbHNlCi0JCWZsYWcgPSBYQ09GRl9ERUZfUkVHVUxBUjsKLQkgICAgICAoKnN5bV9oYXNoKS0+ZmxhZ3MgfD0gZmxhZzsKLQotCSAgICAgIGlmICgoKnN5bV9oYXNoKS0+c21jbGFzID09IFhNQ19VQQotCQkgIHx8IGZsYWcgPT0gWENPRkZfREVGX1JFR1VMQVIpCi0JCSgqc3ltX2hhc2gpLT5zbWNsYXMgPSBhdXgueF9jc2VjdC54X3NtY2xhczsKLQkgICAgfQotCX0KLQotICAgICAgKmNzZWN0X2NhY2hlID0gY3NlY3Q7Ci0KLSAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgICAgc3ltX2hhc2ggKz0gc3ltLm5fbnVtYXV4ICsgMTsKLSAgICAgIGNzZWN0X2NhY2hlICs9IHN5bS5uX251bWF1eCArIDE7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGxhc3RfcmVhbCA9PSBOVUxMIHx8IGxhc3RfcmVhbC0+bmV4dCA9PSBmaXJzdF9jc2VjdCk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gZmlyc3RfY3NlY3Q7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIFJlc2V0IHRoZSBzZWN0aW9uIHNpemUgYW5kIHRoZSBsaW5lIG51bWJlciBjb3VudCwgc2luY2UgdGhlCi0JIGRhdGEgaXMgbm93IGF0dGFjaGVkIHRvIHRoZSBjc2VjdHMuICBEb24ndCByZXNldCB0aGUgc2l6ZSBvZgotCSB0aGUgLmRlYnVnIHNlY3Rpb24sIHNpbmNlIHdlIG5lZWQgdG8gcmVhZCBpdCBiZWxvdyBpbgotCSBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgIi5kZWJ1ZyIpICE9IDApCi0Jby0+X3Jhd19zaXplID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBpOwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0JICBhc2VjdGlvbiAqKnJlbF9jc2VjdDsKLQotCSAgcmVsID0gcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLQkgIHJlbF9jc2VjdCA9IHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHM7Ci0JICBmb3IgKGkgPSAwOyBpIDwgby0+cmVsb2NfY291bnQ7IGkrKywgcmVsKyssIHJlbF9jc2VjdCsrKQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfY3NlY3QgPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiByZWxvYyAlczolZCBub3QgaW4gY3NlY3QiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSwgaSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIFdlIGlkZW50aWZ5IGFsbCBzeW1ib2xzIHdoaWNoIGFyZSBjYWxsZWQsIHNvIHRoYXQgd2UKLQkJIGNhbiBjcmVhdGUgZ2x1ZSBjb2RlIGZvciBjYWxscyB0byBmdW5jdGlvbnMgaW1wb3J0ZWQKLQkJIGZyb20gZHluYW1pYyBvYmplY3RzLiAgKi8KLQkgICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjCi0JCSAgJiYgKnJlbF9jc2VjdCAhPSBiZmRfdW5kX3NlY3Rpb25fcHRyCi0JCSAgJiYgKHJlbC0+cl90eXBlID09IFJfQlIKLQkJICAgICAgfHwgcmVsLT5yX3R5cGUgPT0gUl9SQlIpCi0JCSAgJiYgb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3JlbC0+cl9zeW1uZHhdICE9IE5VTEwpCi0JCXsKLQkJICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChhYmZkKVtyZWwtPnJfc3ltbmR4XTsKLQkJICBoLT5mbGFncyB8PSBYQ09GRl9DQUxMRUQ7Ci0JCSAgLyogSWYgdGhlIHN5bWJvbCBuYW1lIHN0YXJ0cyB3aXRoIGEgcGVyaW9kLCBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGUgb2YgYSBmdW5jdGlvbi4gIElmIHRoZSBzeW1ib2wgaXMKLSAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSB1bmRlZmluZWQsIHRoZW4gYWRkIGFuIHVuZGVmaW5lZCBzeW1ib2wKLSAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4gIFRoaXMgc2hvdWxkIGRvIG5vCi0gICAgICAgICAgICAgICAgICAgICBoYXJtLCBiZWNhdXNlIGFueSByZWd1bGFyIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgYWxzbyBkZWZpbmUgdGhlIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLiAgSXQgaGVscHMsIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCB3ZQotICAgICAgICAgICAgICAgICAgICAgd2lsbCBpZGVudGlmeSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciB3aXRoIGEKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgb2JqZWN0IGlmIGEgZHluYW1pYyBvYmplY3QgZGVmaW5lcyBpdC4gICovCi0JCSAgaWYgKGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0JCSAgICAgICYmIGgtPmRlc2NyaXB0b3IgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0JCSAgICAgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcgKyAxLAotCQkJCQkJICAgIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJICAgICAgaWYgKGhkcyA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICAgIGlmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkJCXsKLQkJCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCQkJIChpbmZvLCBhYmZkLCBoZHMtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAoZmxhZ3dvcmQpIDAsIGJmZF91bmRfc2VjdGlvbl9wdHIsCi0JCQkJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCQkJICB0cnVlLAotCQkJCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaGRzKSkpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLQkJICAgICAgQkZEX0FTU0VSVCAoKGhkcy0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpID09IDAKLQkJCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDApOwotCQkgICAgICBoZHMtPmRlc2NyaXB0b3IgPSBoOwotCQkgICAgICBoLT5kZXNjcmlwdG9yID0gaGRzOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgZnJlZSAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyk7Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID0gTlVMTDsKLQotCSAgLyogUmVzZXQgU0VDX1JFTE9DIGFuZCB0aGUgcmVsb2NfY291bnQsIHNpbmNlIHRoZSByZWxvYwotCSAgICAgaW5mb3JtYXRpb24gaXMgbm93IGF0dGFjaGVkIHRvIHRoZSBjc2VjdHMuICAqLwotCSAgby0+ZmxhZ3MgJj1+IFNFQ19SRUxPQzsKLQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQotCSAgLyogSWYgd2UgYXJlIG5vdCBrZWVwaW5nIG1lbW9yeSwgZnJlZSB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbykgIT0gTlVMTAotCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+cmVsb2NzICE9IE5VTEwKLQkgICAgICAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+a2VlcF9yZWxvY3MpCi0JICAgIHsKLQkgICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPnJlbG9jcyk7Ci0JICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5yZWxvY3MgPSBOVUxMOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGcmVlIHVwIHRoZSBsaW5lIG51bWJlcnMuICBGSVhNRTogV2UgY291bGQgY2FjaGUgdGhlc2UKLSAgICAgICAgIHNvbWV3aGVyZSBmb3IgdGhlIGZpbmFsIGxpbmssIHRvIGF2b2lkIHJlYWRpbmcgdGhlbSBhZ2Fpbi4gICovCi0gICAgICBpZiAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgIT0gTlVMTCkKLQl7Ci0JICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyk7Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBmcmVlIChyZWxvY19pbmZvKTsKLQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzICE9IE5VTEwpCi0JICAgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMpOwotCSAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zICE9IE5VTEwpCi0JICAgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zKTsKLQl9Ci0gICAgZnJlZSAocmVsb2NfaW5mbyk7Ci0gICAgfQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSN1bmRlZiBOX1RNQVNLCi0jdW5kZWYgTl9CVFNIRlQKLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBzeW1ib2xzIGZyb20gYSBkeW5hbWljIG9iamVjdCB0byB0aGUKLSAgIGdsb2JhbCBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmJ1ZjsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmVsc3ltLCAqZWxzeW1lbmQ7Ci0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbjsKLSAgY29uc3QgY2hhciAqYm5hbWU7Ci0gIGNvbnN0IGNoYXIgKm1uYW1lOwotICBjb25zdCBjaGFyICpzOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICoqcHA7Ci0KLSAgLyogV2UgY2FuIG9ubHkgaGFuZGxlIGEgZHluYW1pYyBvYmplY3QgaWYgd2UgYXJlIGdlbmVyYXRpbmcgYW4gWENPRkYKLSAgICAgb3V0cHV0IGZpbGUuICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogWENPRkYgc2hhcmVkIG9iamVjdCB3aGVuIG5vdCBwcm9kdWNpbmcgWENPRkYgb3V0cHV0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzeW1ib2xzIHdlIHVzZSBmcm9tIGEgZHluYW1pYyBvYmplY3QgYXJlIG5vdCB0aGUgc3ltYm9scyBpbgotICAgICB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZSwgYnV0LCByYXRoZXIsIHRoZSBzeW1ib2xzIGluIHRoZSBleHBvcnQKLSAgICAgdGFibGUuICBJZiB0aGVyZSBpcyBhIGdsb2JhbCBzeW1ib2wgaW4gYSBkeW5hbWljIG9iamVjdCB3aGljaCBpcwotICAgICBub3QgaW4gdGhlIGV4cG9ydCB0YWJsZSwgdGhlIGxvYWRlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgaXQsCi0gICAgIHNvIHdlIGRvbid0IHdhbnQgdG8gZmluZCBpdCBlaXRoZXIuICBBbHNvLCBvbiBBSVggNC4xLjMsIHNoci5vIGluCi0gICAgIGxpYmMuYSBoYXMgc3ltYm9scyBpbiB0aGUgZXhwb3J0IHRhYmxlIHdoaWNoIGFyZSBub3QgaW4gdGhlCi0gICAgIHN5bWJvbCB0YWJsZS4gICovCi0KLSAgLyogUmVhZCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgRklYTUU6IFdlIHNob3VsZCByZWFsbHkgdXNlIHRoZQotICAgICBvX3NubG9hZGVyIGZpZWxkIGluIHRoZSBhLm91dCBoZWFkZXIsIHJhdGhlciB0aGFuIGdyYWJiaW5nIHRoZQotICAgICBzZWN0aW9uIGJ5IG5hbWUuICAqLwotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBkeW5hbWljIG9iamVjdCB3aXRoIG5vIC5sb2FkZXIgc2VjdGlvbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJ1ZiA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgLyogUmVtb3ZlIHRoZSBzZWN0aW9ucyBmcm9tIHRoaXMgb2JqZWN0LCBzbyB0aGF0IHRoZXkgZG8gbm90IGdldAotICAgICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0gIGFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGJ1ZiwgJmxkaGRyKTsKLQotICBzdHJpbmdzID0gKGNoYXIgKikgYnVmICsgbGRoZHIubF9zdG9mZjsKLQotICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGJ1ZiArIExESERSU1opOwotICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKLSAgQkZEX0FTU0VSVCAoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pID09IExEU1lNU1opOwotICBmb3IgKDsgZWxzeW0gPCBlbHN5bWVuZDsgZWxzeW0rKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gbGRzeW07Ci0gICAgICBjaGFyIG5hbWJ1ZltTWU1OTUxFTiArIDFdOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHhjb2ZmX3N3YXBfbGRzeW1faW4gKGFiZmQsIGVsc3ltLCAmbGRzeW0pOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGV4cG9ydGVkIHN5bWJvbHMuICAqLwotICAgICAgaWYgKChsZHN5bS5sX3NtdHlwZSAmIExfRVhQT1JUKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKLQluYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAobmFtYnVmLCBsZHN5bS5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0JICBuYW1idWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkgIG5hbWUgPSBuYW1idWY7Ci0JfQotCi0gICAgICAvKiBOb3JtYWxseSB3ZSBjb3VsZCBub3QgY2FsbCB4Y29mZl9saW5rX2hhc2hfbG9va3VwIGluIGFuIGFkZAotCSBzeW1ib2xzIHJvdXRpbmUsIHNpbmNlIHdlIG1pZ2h0IG5vdCBiZSB1c2luZyBhbiBYQ09GRiBoYXNoCi0JIHRhYmxlLiAgSG93ZXZlciwgd2UgdmVyaWZpZWQgYWJvdmUgdGhhdCB3ZSBhcmUgdXNpbmcgYW4gWENPRkYKLQkgaGFzaCB0YWJsZS4gICovCi0KLSAgICAgIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwKLQkJCQkgIHRydWUsIHRydWUpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9EWU5BTUlDOwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgYW5kIHRoZSBCRkQgaXQgd2FzIGZvdW5kIGluIGlzCi0JIG5vdCBhIGR5bmFtaWMgb2JqZWN0LCBjaGFuZ2UgdGhlIEJGRCB0byB0aGlzIGR5bmFtaWMgb2JqZWN0LAotCSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGNvcnJlY3QgaW1wb3J0IGZpbGUgSUQuICAqLwotICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAmJiAoaC0+cm9vdC51LnVuZGVmLmFiZmQgPT0gTlVMTAotCSAgICAgIHx8IChoLT5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKSkKLQloLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JewotCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JICAvKiBXZSBkbyBub3Qgd2FudCB0byBhZGQgdGhpcyB0byB0aGUgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LiAgKi8KLQl9Ci0KLSAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX1VBCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQloLT5zbWNsYXMgPSBsZHN5bS5sX3NtY2xhczsKLQotICAgICAgLyogVW5sZXNzIHRoaXMgaXMgYW4gWE1DX1hPIHN5bWJvbCwgd2UgZG9uJ3QgYm90aGVyIHRvIGFjdHVhbGx5Ci0gICAgICAgICBkZWZpbmUgaXQsIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBzZWN0aW9uIHRvIHB1dCBpdCBpbiBhbnlob3cuCi0gICAgICAgICBJbnN0ZWFkLCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lcyBoYW5kbGUgdGhlIERFRl9EWU5BTUlDIGZsYWcKLSAgICAgICAgIGNvcnJlY3RseS4gICovCi0KLSAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX1hPCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gYWJzb2x1dGUgdmFsdWUuICAqLwotCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBsZHN5bS5sX3ZhbHVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgZGVmaW5lcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIHRoZW4gaXQKLQkgaW1wbGljaXRseSBkZWZpbmVzIHRoZSBmdW5jdGlvbiBjb2RlIGFzIHdlbGwuICAqLwotICAgICAgaWYgKGgtPnNtY2xhcyA9PSBYTUNfRFMKLQkgIHx8IChoLT5zbWNsYXMgPT0gWE1DX1hPICYmIG5hbWVbMF0gIT0gJy4nKSkKLQloLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOwotICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpICE9IDApCi0JewotCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0JICBoZHMgPSBoLT5kZXNjcmlwdG9yOwotCSAgaWYgKGhkcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqZHNubTsKLQotCSAgICAgIGRzbm0gPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMik7Ci0JICAgICAgaWYgKGRzbm0gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGRzbm1bMF0gPSAnLic7Ci0JICAgICAgc3RyY3B5IChkc25tICsgMSwgbmFtZSk7Ci0JICAgICAgaGRzID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIGRzbm0sCi0JCQkJCSAgICB0cnVlLCB0cnVlLCB0cnVlKTsKLQkgICAgICBmcmVlIChkc25tKTsKLQkgICAgICBpZiAoaGRzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkJewotCQkgIGhkcy0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JCSAgaGRzLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JCSAgLyogV2UgZG8gbm90IHdhbnQgdG8gYWRkIHRoaXMgdG8gdGhlIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgc3ltYm9sIGxpc3QuICAqLwotCQl9Ci0KLQkgICAgICBoZHMtPmRlc2NyaXB0b3IgPSBoOwotCSAgICAgIGgtPmRlc2NyaXB0b3IgPSBoZHM7Ci0JICAgIH0KLQotCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9ERUZfRFlOQU1JQzsKLQkgIGlmIChoZHMtPnNtY2xhcyA9PSBYTUNfVUEpCi0JICAgIGhkcy0+c21jbGFzID0gWE1DX1BSOwotCi0JICAvKiBBbiBhYnNvbHV0ZSBzeW1ib2wgYXBwZWFycyB0byBhY3R1YWxseSBkZWZpbmUgY29kZSwgbm90IGEKLQkgICAgIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBUaGlzIGlzIGhvdyBzb21lIG1hdGggZnVuY3Rpb25zIGFyZQotCSAgICAgaW1wbGVtZW50ZWQgb24gQUlYIDQuMS4gICovCi0JICBpZiAoaC0+c21jbGFzID09IFhNQ19YTwotCSAgICAgICYmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkgIHx8IGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQkgICAgewotCSAgICAgIGhkcy0+c21jbGFzID0gWE1DX1hPOwotCSAgICAgIGhkcy0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgICAgIGhkcy0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBoZHMtPnJvb3QudS5kZWYudmFsdWUgPSBsZHN5bS5sX3ZhbHVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYnVmICE9IE5VTEwgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmtlZXBfY29udGVudHMpCi0gICAgewotICAgICAgZnJlZSAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyk7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogUmVjb3JkIHRoaXMgZmlsZSBpbiB0aGUgaW1wb3J0IGZpbGVzLiAgKi8KLQotICBuID0gKChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlKSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbi0+bmV4dCA9IE5VTEw7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgcGF0aCBlbnRyeSBpbiB0aGUgaW1wb3J0IGZpbGUgbGlzdCBmb3IgYQotICAgICBzaGFyZWQgb2JqZWN0IGFwcGVhcnMgdG8gYWx3YXlzIGJlIGVtcHR5LiAgVGhlIGZpbGUgbmFtZSBpcyB0aGUKLSAgICAgYmFzZSBuYW1lLiAgKi8KLSAgbi0+cGF0aCA9ICIiOwotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gICAgICBtbmFtZSA9ICIiOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZC0+bXlfYXJjaGl2ZSk7Ci0gICAgICBtbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgIH0KLSAgcyA9IHN0cnJjaHIgKGJuYW1lLCAnLycpOwotICBpZiAocyAhPSBOVUxMKQotICAgIGJuYW1lID0gcyArIDE7Ci0gIG4tPmZpbGUgPSBibmFtZTsKLSAgbi0+bWVtYmVyID0gbW5hbWU7Ci0KLSAgLyogV2Ugc3RhcnQgYyBhdCAxIGJlY2F1c2UgdGhlIGZpcnN0IGltcG9ydCBmaWxlIG51bWJlciBpcyByZXNlcnZlZAotICAgICBmb3IgTElCUEFUSC4gICovCi0gIGZvciAocHAgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHMsIGMgPSAxOwotICAgICAgICpwcCAhPSBOVUxMOwotICAgICAgIHBwID0gJigqcHApLT5uZXh0LCArK2MpCi0gICAgOwotICAqcHAgPSBuOwotCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5pbXBvcnRfZmlsZV9pZCA9IGM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSb3V0aW5lcyB0aGF0IGFyZSBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4KLSAgIGhhbmRsZWQsIGJ1dCBiZWZvcmUgdGhlIHNlY3Rpb25zIGFyZSBsYWlkIG91dCBpbiBtZW1vcnkuICAqLwotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIG5vdCBiZWluZyBnYXJiYWdlLCBpbmNsdWRpbmcgdGhlIHNlY3Rpb24gaW4gd2hpY2gKLSAgIGl0IGlzIGRlZmluZWQuICAqLwotCi1zdGF0aWMgSU5MSU5FIGJvb2xlYW4KLXhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX01BUkspICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfTUFSSzsKLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0KLSAgICAgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGhzZWMpCi0JICAmJiAoaHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQl7Ci0JICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBoc2VjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPnRvY19zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmIChoLT50b2Nfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBoLT50b2Nfc2VjdGlvbikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIG1hcmsgcGhhc2Ugb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgRm9yIGEgZ2l2ZW4gc2VjdGlvbiwgbWFyawotICAgaXQsIGFuZCBhbGwgdGhlIHNlY3Rpb25zIHdoaWNoIGRlZmluZSBzeW1ib2xzIHRvIHdoaWNoIGl0IHJlZmVycy4KLSAgIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBsb29rIGF0IHRoZSByZWxvY3MsIHdlIGFsc28gY291bnQKLSAgIHRoZSBudW1iZXIgb2YgcmVsb2NzIHdoaWNoIG5lZWQgdG8gYmUgY29waWVkIGludG8gdGhlIC5sb2FkZXIKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbWFyayAoaW5mbywgc2VjKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWMtPmZsYWdzIHw9IFNFQ19NQVJLOwotCi0gIGlmIChzZWMtPm93bmVyLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IKLSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLSAgICAgICYmIHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipocCwgKipocGVuZDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLCAqcmVsZW5kOwotCi0gICAgICAvKiBNYXJrIGFsbCB0aGUgc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24uICAqLwotCi0gICAgICBocCA9IChvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcikKLQkgICAgKyB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmZpcnN0X3N5bW5keCk7Ci0gICAgICBocGVuZCA9IChvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcikKLQkgICAgICAgKyB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxhc3Rfc3ltbmR4KTsKLSAgICAgIGZvciAoOyBocCA8IGhwZW5kOyBocCsrKQotCXsKLQkgIHJlZ2lzdGVyIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSAqaHA7Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVsb2NzLiAgKi8KLQotICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICByZWwgPSB4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoc2VjLT5vd25lciwgc2VjLCB0cnVlLAotCQkJCQkgICAgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAotCQkJCQkgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKTsKLQkgIGlmIChyZWwgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcmVsZW5kID0gcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLQkgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnJzZWM7Ci0JICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGlmICgodW5zaWduZWQgaW50KSByZWwtPnJfc3ltbmR4Ci0JCSAgPiBvYmpfcmF3X3N5bWVudF9jb3VudCAoc2VjLT5vd25lcikpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChzZWMtPm93bmVyKVtyZWwtPnJfc3ltbmR4XTsKLQkgICAgICBpZiAoaCAhPSBOVUxMCi0JCSAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLQkJewotCQkgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgcnNlYyA9IHhjb2ZmX2RhdGEgKHNlYy0+b3duZXIpLT5jc2VjdHNbcmVsLT5yX3N5bW5keF07Ci0JICAgICAgaWYgKHJzZWMgIT0gTlVMTAotCQkgICYmIChyc2VjLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCQl7Ci0JCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgcnNlYykpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSAubG9hZGVyCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24uICAqLwotCSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBpZiAoaCA9PSBOVUxMCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkJICAgICAgfHwgKChoLT5mbGFncyAmIFhDT0ZGX0NBTExFRCkgIT0gMAotCQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCQkgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0JCQkgICYmIGgtPmRlc2NyaXB0b3IgIT0gTlVMTAotCQkJICAmJiAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDAKLQkJCSAgICAgIHx8ICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDAKLQkJCQkgICYmIChoLT5kZXNjcmlwdG9yLT5mbGFncwotCQkJCSAgICAgICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApKSkpCi0JCSAgICBicmVhazsKLQkJICAvKiBGYWxsIHRocm91Z2guICAqLwotCQljYXNlIFJfUE9TOgotCQljYXNlIFJfTkVHOgotCQljYXNlIFJfUkw6Ci0JCWNhc2UgUl9STEE6Ci0JCSAgKyt4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRyZWxfY291bnQ7Ci0JCSAgaWYgKGggIT0gTlVMTCkKLQkJICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0xEUkVMOwotCQkgIGJyZWFrOwotCQljYXNlIFJfVE9DOgotCQljYXNlIFJfR0w6Ci0JCWNhc2UgUl9UQ0w6Ci0JCWNhc2UgUl9UUkw6Ci0JCWNhc2UgUl9UUkxBOgotCQkgIC8qIFdlIHNob3VsZCBuZXZlciBuZWVkIGEgLmxvYWRlciByZWxvYyBmb3IgYSBUT0MKLQkJICAgICByZWxhdGl2ZSByZWxvYy4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeQotCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzICE9IE5VTEwKLQkgICAgICAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5rZWVwX3JlbG9jcykKLQkgICAgewotCSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5yZWxvY3MpOwotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5yZWxvY3MgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIHN3ZWVwIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIFJlbW92ZSBhbGwgZ2FyYmFnZQotICAgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dlZXAgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKnN1YjsKLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAoKG8tPmZsYWdzICYgU0VDX01BUkspID09IDApCi0JICAgIHsKLQkgICAgICAvKiBLZWVwIGFsbCBzZWN0aW9ucyBmcm9tIG5vbi1YQ09GRiBpbnB1dCBmaWxlcy4gIEtlZXAKLSAgICAgICAgICAgICAgICAgc3BlY2lhbCBzZWN0aW9ucy4gIEtlZXAgLmRlYnVnIHNlY3Rpb25zIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgbW9tZW50LiAgKi8KLQkgICAgICBpZiAoc3ViLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3IKLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24KLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24KLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbgotCQkgIHx8IG8gPT0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbgotCQkgIHx8IHN0cmNtcCAoby0+bmFtZSwgIi5kZWJ1ZyIpID09IDApCi0JCW8tPmZsYWdzIHw9IFNFQ19NQVJLOwotCSAgICAgIGVsc2UKLQkJewotCQkgIG8tPl9yYXdfc2l6ZSA9IDA7Ci0JCSAgby0+cmVsb2NfY291bnQgPSAwOwotCQkgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFJlY29yZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgc2V0LiAgVGhpcyBpcyB1c2VkIHRvIG91dHB1dCB0aGUKLSAgIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZywgc2l6ZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCAqbjsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhpcyB3aWxsIGhhcmRseSBldmVyIGJlIGNhbGxlZC4gIEkgZG9uJ3Qgd2FudCB0byBidXJuIGZvdXIgYnl0ZXMKLSAgICAgcGVyIGdsb2JhbCBzeW1ib2wsIHNvIGluc3RlYWQgdGhlIHNpemUgaXMga2VwdCBvbiBhIGxpbmtlZCBsaXN0Ci0gICAgIGF0dGFjaGVkIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotICBuID0gKChzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKikKLSAgICAgICBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0KSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbi0+bmV4dCA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zaXplX2xpc3Q7Ci0gIG4tPmggPSBoOwotICBuLT5zaXplID0gc2l6ZTsKLSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnNpemVfbGlzdCA9IG47Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfSEFTX1NJWkU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEltcG9ydCBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9pbXBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoYXJnLCB2YWwsIGltcHBhdGgsIGltcGZpbGUsCi0JCQkgaW1wbWVtYmVyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLSAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgIGNvbnN0IGNoYXIgKmltcHBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKmltcGZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKmltcG1lbWJlcjsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEEgc3ltYm9sIG5hbWUgd2hpY2ggc3RhcnRzIHdpdGggYSBwZXJpb2QgaXMgdGhlIGNvZGUgZm9yIGEKLSAgICAgZnVuY3Rpb24uICBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgdGhlbiBhZGQgYW4gdW5kZWZpbmVkCi0gICAgIHN5bWJvbCBmb3IgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBpbXBvcnQgdGhhdCBpbnN0ZWFkLiAgKi8KLSAgaWYgKGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHZhbCA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0gICAgICBoZHMgPSBoLT5kZXNjcmlwdG9yOwotICAgICAgaWYgKGhkcyA9PSBOVUxMKQotCXsKLQkgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQloLT5yb290LnJvb3Quc3RyaW5nICsgMSwKLQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUpOwotCSAgaWYgKGhkcyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgICAgIGhkcy0+cm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnUudW5kZWYuYWJmZDsKLQkgICAgfQotCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOwotCSAgQkZEX0FTU0VSVCAoKGhkcy0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpID09IDAKLQkJICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgPT0gMCk7Ci0JICBoZHMtPmRlc2NyaXB0b3IgPSBoOwotCSAgaC0+ZGVzY3JpcHRvciA9IGhkczsKLQl9Ci0KLSAgICAgIC8qIE5vdywgaWYgdGhlIGRlc2NyaXB0b3IgaXMgdW5kZWZpbmVkLCBpbXBvcnQgdGhlIGRlc2NyaXB0b3IKLSAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wgd2Ugd2VyZSB0b2xkIHRvIGltcG9ydC4gIEZJWE1FOiBJcwotICAgICAgICAgdGhpcyBjb3JyZWN0IGluIGFsbCBjYXNlcz8gICovCi0gICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JaCA9IGhkczsKLSAgICB9Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfSU1QT1JUOwotCi0gIGlmICh2YWwgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3QudS5kZWYuc2VjdGlvbikKLQkgICAgICB8fCBoLT5yb290LnUuZGVmLnZhbHVlICE9IHZhbCkpCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9kZWZpbml0aW9uKQotCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uLCBoLT5yb290LnUuZGVmLnZhbHVlLAotCQkgIG91dHB1dF9iZmQsIGJmZF9hYnNfc2VjdGlvbl9wdHIsIHZhbCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHZhbDsKLSAgICB9Ci0KLSAgLyogV2Ugb3ZlcmxvYWQgdGhlIGxkaW5keCBmaWVsZCB0byBob2xkIHRoZSBsX2lmaWxlIHZhbHVlIGZvciB0aGlzCi0gICAgIHN5bWJvbC4gICovCi0gIEJGRF9BU1NFUlQgKGgtPmxkc3ltID09IE5VTEwpOwotICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9CVUlMVF9MRFNZTSkgPT0gMCk7Ci0gIGlmIChpbXBwYXRoID09IE5VTEwpCi0gICAgaC0+bGRpbmR4ID0gLTE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYzsKLSAgICAgIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqKnBwOwotCi0gICAgICAvKiBXZSBzdGFydCBjIGF0IDEgYmVjYXVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGltcG9ydCBsaXN0IGlzCi0gICAgICAgICByZXNlcnZlZCBmb3IgdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGguICAqLwotICAgICAgZm9yIChwcCA9ICZ4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0cywgYyA9IDE7Ci0JICAgKnBwICE9IE5VTEw7Ci0JICAgcHAgPSAmKCpwcCktPm5leHQsICsrYykKLQl7Ci0JICBpZiAoc3RyY21wICgoKnBwKS0+cGF0aCwgaW1wcGF0aCkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoKCpwcCktPmZpbGUsIGltcGZpbGUpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKCgqcHApLT5tZW1iZXIsIGltcG1lbWJlcikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoKnBwID09IE5VTEwpCi0JewotCSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpuOwotCi0JICBuID0gKChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKikKLQkgICAgICAgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSkpKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG4tPm5leHQgPSBOVUxMOwotCSAgbi0+cGF0aCA9IGltcHBhdGg7Ci0JICBuLT5maWxlID0gaW1wZmlsZTsKLQkgIG4tPm1lbWJlciA9IGltcG1lbWJlcjsKLQkgICpwcCA9IG47Ci0JfQotCi0gICAgICBoLT5sZGluZHggPSBjOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRXhwb3J0IGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcsIHN5c2NhbGwpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotICAgICBib29sZWFuIHN5c2NhbGwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0VYUE9SVDsKLQotICAvKiBGSVhNRTogSSdtIG5vdCBhdCBhbGwgc3VyZSB3aGF0IHN5c2NhbGwgaXMgc3VwcG9zZWQgdG8gbWVhbiwgc28KLSAgICAgSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIGl0IHVudGlsIHNvbWVib2R5IGV4cGxhaW5zIGl0LiAgKi8KLQotICAvKiBTZWUgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBJdCBtYXkgYmUgb25lIGV2ZW4gdGhvdWdoCi0gICAgIGl0IGlzIG5vdCBzbyBtYXJrZWQuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgPT0gMAotICAgICAgJiYgaC0+cm9vdC5yb290LnN0cmluZ1swXSAhPSAnLicpCi0gICAgewotICAgICAgY2hhciAqZm5uYW1lOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGZuOwotCi0gICAgICBmbm5hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpICsgMik7Ci0gICAgICBpZiAoZm5uYW1lID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm5uYW1lWzBdID0gJy4nOwotICAgICAgc3RyY3B5IChmbm5hbWUgKyAxLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgIGhmbiA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICBmbm5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBmcmVlIChmbm5hbWUpOwotICAgICAgaWYgKGhmbiAhPSBOVUxMCi0JICAmJiBoZm4tPnNtY2xhcyA9PSBYTUNfUFIKLQkgICYmIChoZm4tPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoZm4tPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFU0NSSVBUT1I7Ci0JICBoLT5kZXNjcmlwdG9yID0gaGZuOwotCSAgaGZuLT5kZXNjcmlwdG9yID0gaDsKLQl9Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnYXJiYWdlIGNvbGxlY3QgdGhpcyBzeW1ib2wuICAqLwotICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2FyYmFnZQotICAgICBjb2xsZWN0IHRoZSBhc3NvY2lhdGVkIGZ1bmN0aW9uIGNvZGUuICBXZSBub3JtYWxseSBkb24ndCBoYXZlIHRvCi0gICAgIHdvcnJ5IGFib3V0IHRoaXMsIGJlY2F1c2UgdGhlIGRlc2NyaXB0b3Igd2lsbCBiZSBhdHRhY2hlZCB0byBhCi0gICAgIHNlY3Rpb24gd2l0aCByZWxvY3MsIGJ1dCBpZiB3ZSBhcmUgY3JlYXRpbmcgdGhlIGRlc2NyaXB0b3IKLSAgICAgb3Vyc2VsdmVzIHRob3NlIHJlbG9jcyB3aWxsIG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBtYXJrIGNvZGUuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaC0+ZGVzY3JpcHRvcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ291bnQgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgZm9yIHJlbG9jcwotICAgZ2VuZXJhdGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LCB0eXBpY2FsbHkgZm9yIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLSAgIGFuZCBkZXN0cnVjdG9ycy4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0gICAgICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSwgZmFsc2UsIGZhbHNlLAotCQkJCSAgICAgZmFsc2UpKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBubyBzdWNoIHN5bWJvbCIpLCBuYW1lKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfUkVGX1JFR1VMQVIgfCBYQ09GRl9MRFJFTDsKLSAgKyt4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRyZWxfY291bnQ7Ci0gIAotICAvKiBNYXJrIHRoZSBzeW1ib2wgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgaWYgKCEgeGNvZmZfbWFya19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggc3ltYm9sIHRvIHdoaWNoIHRoZSBsaW5rZXIgc2NyaXB0Ci0gICBhc3NpZ25zIGEgdmFsdWUuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCB0cnVlLAotCQkJICAgICAgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfUkVHVUxBUjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2gKLSAgIHhjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbwotewotICAvKiBTZXQgaWYgYSBwcm9ibGVtIG9jY3VycmVkLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIExpbmsgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIFdoZXRoZXIgYWxsIGRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgZXhwb3J0ZWQuICAqLwotICBib29sZWFuIGV4cG9ydF9kZWZpbmVkczsKLSAgLyogTnVtYmVyIG9mIGxkc3ltIHN0cnVjdHVyZXMuICAqLwotICBzaXplX3QgbGRzeW1fY291bnQ7Ci0gIC8qIFNpemUgb2Ygc3RyaW5nIHRhYmxlLiAgKi8KLSAgc2l6ZV90IHN0cmluZ19zaXplOwotICAvKiBTdHJpbmcgdGFibGUuICAqLwotICBiZmRfYnl0ZSAqc3RyaW5nczsKLSAgLyogQWxsb2NhdGVkIHNpemUgb2Ygc3RyaW5nIHRhYmxlLiAgKi8KLSAgc2l6ZV90IHN0cmluZ19hbGM7Ci19OwotCi0vKiBCdWlsZCB0aGUgLmxvYWRlciBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIFhDT0ZGIGxpbmtlcgotICAgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZSBtdXN0IHNldCB0aGUgc2l6ZSBvZiB0aGUKLSAgIC5sb2FkZXIgc2VjdGlvbiBiZWZvcmUgdGhlIGxpbmtlciBsYXlzIG91dCB0aGUgb3V0cHV0IGZpbGUuCi0gICBMSUJQQVRIIGlzIHRoZSBsaWJyYXJ5IHBhdGggdG8gc2VhcmNoIGZvciBzaGFyZWQgb2JqZWN0czsgdGhpcyBpcwotICAgbm9ybWFsbHkgYnVpbHQgZnJvbSB0aGUgLUwgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbGlua2VyLiAgRU5UUlkKLSAgIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBwb2ludCBzeW1ib2wgKHRoZSAtZSBsaW5rZXIgb3B0aW9uKS4KLSAgIEZJTEVfQUxJR04gaXMgdGhlIGFsaWdubWVudCB0byB1c2UgZm9yIHNlY3Rpb25zIHdpdGhpbiB0aGUgZmlsZQotICAgKHRoZSAtSCBsaW5rZXIgb3B0aW9uKS4gIE1BWFNUQUNLIGlzIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgKHRoZQotICAgLWJtYXhzdGFjayBsaW5rZXIgb3B0aW9uKS4gIE1BWERBVEEgaXMgdGhlIG1heGltdW0gZGF0YSBzaXplICh0aGUKLSAgIC1ibWF4ZGF0YSBsaW5rZXIgb3B0aW9uKS4gIEdDIGlzIHdoZXRoZXIgdG8gZG8gZ2FyYmFnZSBjb2xsZWN0aW9uCi0gICAodGhlIC1iZ2MgbGlua2VyIG9wdGlvbikuICBNT0RUWVBFIGlzIHRoZSBtb2R1bGUgdHlwZSAodGhlCi0gICAtYm1vZHR5cGUgbGlua2VyIG9wdGlvbikuICBURVhUUk8gaXMgd2hldGhlciB0aGUgdGV4dCBzZWN0aW9uIG11c3QKLSAgIGJlIHJlYWQgb25seSAodGhlIC1idGV4dHJvIGxpbmtlciBvcHRpb24pLiAgRVhQT1JUX0RFRklORURTIGlzCi0gICB3aGV0aGVyIGFsbCBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIGV4cG9ydGVkICh0aGUgLXVuaXggbGlua2VyCi0gICBvcHRpb24pLiAgU1BFQ0lBTF9TRUNUSU9OUyBpcyBzZXQgYnkgdGhpcyByb3V0aW5lIHRvIGNzZWN0cyB3aXRoCi0gICBtYWdpYyBuYW1lcyBsaWtlIF9lbmQuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvLCBsaWJwYXRoLCBlbnRyeSwKLQkJCQkgZmlsZV9hbGlnbiwgbWF4c3RhY2ssIG1heGRhdGEsIGdjLAotCQkJCSBtb2R0eXBlLCB0ZXh0cm8sIGV4cG9ydF9kZWZpbmVkcywKLQkJCQkgc3BlY2lhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbGlicGF0aDsKLSAgICAgY29uc3QgY2hhciAqZW50cnk7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmlsZV9hbGlnbjsKLSAgICAgdW5zaWduZWQgbG9uZyBtYXhzdGFjazsKLSAgICAgdW5zaWduZWQgbG9uZyBtYXhkYXRhOwotICAgICBib29sZWFuIGdjOwotICAgICBpbnQgbW9kdHlwZTsKLSAgICAgYm9vbGVhbiB0ZXh0cm87Ci0gICAgIGJvb2xlYW4gZXhwb3J0X2RlZmluZWRzOwotICAgICBhc2VjdGlvbiAqKnNwZWNpYWxfc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhlbnRyeTsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIHN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbyBsZGluZm87Ci0gIGludCBpOwotICBzaXplX3QgaW1wc2l6ZSwgaW1wY291bnQ7Ci0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqZmw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqbGRoZHI7Ci0gIGJmZF9zaXplX3R5cGUgc3RvZmY7Ci0gIHJlZ2lzdGVyIGNoYXIgKm91dDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkICpzdWI7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKLSAgYmZkX2J5dGUgKmRlYnVnX2NvbnRlbnRzID0gTlVMTDsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQlzcGVjaWFsX3NlY3Rpb25zW2ldID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBsZGluZm8uZmFpbGVkID0gZmFsc2U7Ci0gIGxkaW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLSAgbGRpbmZvLmluZm8gPSBpbmZvOwotICBsZGluZm8uZXhwb3J0X2RlZmluZWRzID0gZXhwb3J0X2RlZmluZWRzOwotICBsZGluZm8ubGRzeW1fY291bnQgPSAwOwotICBsZGluZm8uc3RyaW5nX3NpemUgPSAwOwotICBsZGluZm8uc3RyaW5ncyA9IE5VTEw7Ci0gIGxkaW5mby5zdHJpbmdfYWxjID0gMDsKLQotICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+bWF4c3RhY2sgPSBtYXhzdGFjazsKLSAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPm1heGRhdGEgPSBtYXhkYXRhOwotICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+bW9kdHlwZSA9IG1vZHR5cGU7Ci0KLSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZpbGVfYWxpZ24gPSBmaWxlX2FsaWduOwotICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dGV4dHJvID0gdGV4dHJvOwotCi0gIGlmIChlbnRyeSA9PSBOVUxMKQotICAgIGhlbnRyeSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZW50cnkgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgZW50cnksCi0JCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaGVudHJ5ICE9IE5VTEwpCi0JaGVudHJ5LT5mbGFncyB8PSBYQ09GRl9FTlRSWTsKLSAgICB9Ci0KLSAgLyogR2FyYmFnZSBjb2xsZWN0IHVudXNlZCBzZWN0aW9ucy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8ICEgZ2MKLSAgICAgIHx8IGhlbnRyeSA9PSBOVUxMCi0gICAgICB8fCAoaGVudHJ5LT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoZW50cnktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGdjID0gZmFsc2U7Ci0gICAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+Z2MgPSBmYWxzZTsKLQotICAgICAgLyogV2Ugc3RpbGwgbmVlZCB0byBjYWxsIHhjb2ZmX21hcmssIGluIG9yZGVyIHRvIHNldCBsZHJlbF9jb3VudAotICAgICAgICAgY29ycmVjdGx5LiAgKi8KLSAgICAgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpvOwotCi0JICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCQl7Ci0JCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgbykpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX21hcmsgKGluZm8sIGhlbnRyeS0+cm9vdC51LmRlZi5zZWN0aW9uKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHhjb2ZmX3N3ZWVwIChpbmZvKTsKLSAgICAgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5nYyA9IHRydWU7Ci0gICAgfQotCi0gIC8qIFJldHVybiBzcGVjaWFsIHNlY3Rpb25zIHRvIHRoZSBjYWxsZXIuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zcGVjaWFsX3NlY3Rpb25zW2ldOwotICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JICAmJiBnYwotCSAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQlzZWMgPSBOVUxMOwotICAgICAgc3BlY2lhbF9zZWN0aW9uc1tpXSA9IHNlYzsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmlucHV0X2JmZHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0byBkbyBpbiB0aGlzIGJpemFycmUgY2FzZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgeGNvZmZfYnVpbGRfbGRzeW1zLAotCQkJICAgIChQVFIpICZsZGluZm8pOwotICBpZiAobGRpbmZvLmZhaWxlZCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgaW1wb3J0IGZpbGUgbmFtZXMuICBFYWNoIGltcG9ydCBmaWxlIElECi0gICAgIGNvbnNpc3RzIG9mIHRocmVlIG51bGwgdGVybWluYXRlZCBzdHJpbmdzOiB0aGUgcGF0aCwgdGhlIGZpbGUKLSAgICAgbmFtZSwgYW5kIHRoZSBhcmNoaXZlIG1lbWJlciBuYW1lLiAgVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0Ci0gICAgIG9mIG5hbWVzIGlzIHRoZSBwYXRoIHRvIHVzZSB0byBmaW5kIG9iamVjdHMsIHdoaWNoIHRoZSBsaW5rZXIgaGFzCi0gICAgIHBhc3NlZCBpbiBhcyB0aGUgbGlicGF0aCBhcmd1bWVudC4gIEZvciBzb21lIHJlYXNvbiwgdGhlIHBhdGgKLSAgICAgZW50cnkgaW4gdGhlIG90aGVyIGltcG9ydCBmaWxlIG5hbWVzIGFwcGVhcnMgdG8gYWx3YXlzIGJlIGVtcHR5LiAgKi8KLSAgaW1wc2l6ZSA9IHN0cmxlbiAobGlicGF0aCkgKyAzOwotICBpbXBjb3VudCA9IDE7Ci0gIGZvciAoZmwgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0czsgZmwgIT0gTlVMTDsgZmwgPSBmbC0+bmV4dCkKLSAgICB7Ci0gICAgICArK2ltcGNvdW50OwotICAgICAgaW1wc2l6ZSArPSAoc3RybGVuIChmbC0+cGF0aCkKLQkJICArIHN0cmxlbiAoZmwtPmZpbGUpCi0JCSAgKyBzdHJsZW4gKGZsLT5tZW1iZXIpCi0JCSAgKyAzKTsKLSAgICB9Ci0KLSAgLyogU2V0IHVwIHRoZSAubG9hZGVyIHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgbGRoZHIgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyOwotICBsZGhkci0+bF92ZXJzaW9uID0gMTsKLSAgbGRoZHItPmxfbnN5bXMgPSBsZGluZm8ubGRzeW1fY291bnQ7Ci0gIGxkaGRyLT5sX25yZWxvYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZHJlbF9jb3VudDsKLSAgbGRoZHItPmxfaXN0bGVuID0gaW1wc2l6ZTsKLSAgbGRoZHItPmxfbmltcGlkID0gaW1wY291bnQ7Ci0gIGxkaGRyLT5sX2ltcG9mZiA9IChMREhEUlNaCi0JCSAgICAgKyBsZGhkci0+bF9uc3ltcyAqIExEU1lNU1oKLQkJICAgICArIGxkaGRyLT5sX25yZWxvYyAqIExEUkVMU1opOwotICBsZGhkci0+bF9zdGxlbiA9IGxkaW5mby5zdHJpbmdfc2l6ZTsKLSAgc3RvZmYgPSBsZGhkci0+bF9pbXBvZmYgKyBpbXBzaXplOwotICBpZiAobGRpbmZvLnN0cmluZ19zaXplID09IDApCi0gICAgbGRoZHItPmxfc3RvZmYgPSAwOwotICBlbHNlCi0gICAgbGRoZHItPmxfc3RvZmYgPSBzdG9mZjsKLQotICAvKiBXZSBub3cga25vdyB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgQWxsb2NhdGUKLSAgICAgc3BhY2UgZm9yIGl0LiAgKi8KLSAgbHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbjsKLSAgbHNlYy0+X3Jhd19zaXplID0gc3RvZmYgKyBsZGhkci0+bF9zdGxlbjsKLSAgbHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgbHNlYy0+X3Jhd19zaXplKTsKLSAgaWYgKGxzZWMtPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU2V0IHVwIHRoZSBoZWFkZXIuICAqLwotICB4Y29mZl9zd2FwX2xkaGRyX291dCAob3V0cHV0X2JmZCwgbGRoZHIsCi0JCQkoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGxzZWMtPmNvbnRlbnRzKTsKLQotICAvKiBTZXQgdXAgdGhlIGltcG9ydCBmaWxlIG5hbWVzLiAgKi8KLSAgb3V0ID0gKGNoYXIgKikgbHNlYy0+Y29udGVudHMgKyBsZGhkci0+bF9pbXBvZmY7Ci0gIHN0cmNweSAob3V0LCBsaWJwYXRoKTsKLSAgb3V0ICs9IHN0cmxlbiAobGlicGF0aCkgKyAxOwotICAqb3V0KysgPSAnXDAnOwotICAqb3V0KysgPSAnXDAnOwotICBmb3IgKGZsID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLQotICAgICAgcyA9IGZsLT5wYXRoOwotICAgICAgd2hpbGUgKCgqb3V0KysgPSAqcysrKSAhPSAnXDAnKQotCTsKLSAgICAgIHMgPSBmbC0+ZmlsZTsKLSAgICAgIHdoaWxlICgoKm91dCsrID0gKnMrKykgIT0gJ1wwJykKLQk7Ci0gICAgICBzID0gZmwtPm1lbWJlcjsKLSAgICAgIHdoaWxlICgoKm91dCsrID0gKnMrKykgIT0gJ1wwJykKLQk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSAoKGJmZF9ieXRlICopIG91dCAtIGxzZWMtPmNvbnRlbnRzKSA9PSBzdG9mZik7Ci0KLSAgLyogU2V0IHVwIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKGxkaW5mby5zdHJpbmdfc2l6ZSA+IDApCi0gICAgewotICAgICAgbWVtY3B5IChvdXQsIGxkaW5mby5zdHJpbmdzLCBsZGluZm8uc3RyaW5nX3NpemUpOwotICAgICAgZnJlZSAobGRpbmZvLnN0cmluZ3MpOwotICAgICAgbGRpbmZvLnN0cmluZ3MgPSBOVUxMOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBzZXQgdXAgdGhlIHN5bWJvbCB0YWJsZSBvciB0aGUgcmVsb2NzIHlldCwgYmVjYXVzZSB3ZQotICAgICBkb24ndCB5ZXQga25vdyB0aGUgZmluYWwgcG9zaXRpb24gb2YgdGhlIHZhcmlvdXMgc2VjdGlvbnMuICBUaGUKLSAgICAgLmxvYWRlciBzeW1ib2xzIGFyZSB3cml0dGVuIG91dCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG5vcm1hbAotICAgICBzeW1ib2xzIGFyZSB3cml0dGVuIG91dCBpbiB4Y29mZl9saW5rX2lucHV0X2JmZCBvcgotICAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLiAgVGhlIC5sb2FkZXIgcmVsb2NzIGFyZSB3cml0dGVuIG91dAotICAgICB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG5vcm1hbCByZWxvY3MgYXJlIGhhbmRsZWQgaW4KLSAgICAgeGNvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbWFnaWMgc2VjdGlvbnMuICAqLwotICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uOwotICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbjsKLSAgaWYgKHNlYy0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKG91dHB1dF9iZmQsIHNlYy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzZWMtPmNvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOwotICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UndmUgZG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24sIGZpZ3VyZSBvdXQgdGhlIGNvbnRlbnRzCi0gICAgIG9mIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0gIGRlYnVnX3N0cnRhYiA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zdHJ0YWI7Ci0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YmRlYjsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0gICAgICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRleDsKLSAgICAgIGFzZWN0aW9uICoqY3NlY3RwcDsKLSAgICAgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotCi0gICAgICBpZiAoc3ViLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0JY29udGludWU7Ci0gICAgICBzdWJkZWIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3ViLCAiLmRlYnVnIik7Ci0gICAgICBpZiAoc3ViZGViID09IE5VTEwgfHwgc3ViZGViLT5fcmF3X3NpemUgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIKLQkgIHx8IGluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwpCi0JewotCSAgc3ViZGViLT5fcmF3X3NpemUgPSAwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKHN1YikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHN5bWNvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBkZWJ1Z19pbmRleCA9ICgodW5zaWduZWQgbG9uZyAqKQotCQkgICAgIGJmZF96YWxsb2MgKHN1Yiwgc3ltY291bnQgKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKSk7Ci0gICAgICBpZiAoZGVidWdfaW5kZXggPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHhjb2ZmX2RhdGEgKHN1YiktPmRlYnVnX2luZGljZXMgPSBkZWJ1Z19pbmRleDsKLQotICAgICAgLyogR3JhYiB0aGUgY29udGVudHMgb2YgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgV2UgdXNlIG1hbGxvYyBhbmQKLQkgY29weSB0aGUgbmFtZXMgaW50byB0aGUgZGVidWcgc3RyaW5ndGFiLCByYXRoZXIgdGhhbgotCSBiZmRfYWxsb2MsIGJlY2F1c2UgSSBleHBlY3QgdGhhdCwgd2hlbiBsaW5raW5nIG1hbnkgZmlsZXMKLQkgdG9nZXRoZXIsIG1hbnkgb2YgdGhlIHN0cmluZ3Mgd2lsbCBiZSB0aGUgc2FtZS4gIFN0b3JpbmcgdGhlCi0JIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgc2hvdWxkIHNhdmUgc3BhY2UgaW4gdGhpcyBjYXNlLiAgKi8KLSAgICAgIGRlYnVnX2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN1YmRlYi0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChkZWJ1Z19jb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChzdWIsIHN1YmRlYiwgKFBUUikgZGVidWdfY29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzdWJkZWItPl9yYXdfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNzZWN0cHAgPSB4Y29mZl9kYXRhIChzdWIpLT5jc2VjdHM7Ci0KLSAgICAgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoc3ViKTsKLSAgICAgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoc3ViKTsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltY291bnQgKiBzeW1lc3o7Ci0gICAgICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCi0JewotCSAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChzdWIsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0JICAqZGVidWdfaW5kZXggPSAodW5zaWduZWQgbG9uZykgLTE7Ci0KLQkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgPT0gMAotCSAgICAgICYmICpjc2VjdHBwICE9IE5VTEwKLQkgICAgICAmJiAoISBnYwotCQkgIHx8ICgoKmNzZWN0cHApLT5mbGFncyAmIFNFQ19NQVJLKSAhPSAwCi0JCSAgfHwgKmNzZWN0cHAgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLQkgICAgICAmJiBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIChzdWIsICZzeW0pKQotCSAgICB7Ci0JICAgICAgY2hhciAqbmFtZTsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBuYW1lID0gKGNoYXIgKikgZGVidWdfY29udGVudHMgKyBzeW0uX24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZGVidWdfc3RydGFiLCBuYW1lLCB0cnVlLCB0cnVlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgICpkZWJ1Z19pbmRleCA9IGluZHg7Ci0JICAgIH0KLQotCSAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0JICBjc2VjdHBwICs9IHN5bS5uX251bWF1eCArIDE7Ci0JICBkZWJ1Z19pbmRleCArPSBzeW0ubl9udW1hdXggKyAxOwotCX0KLQotICAgICAgZnJlZSAoZGVidWdfY29udGVudHMpOwotICAgICAgZGVidWdfY29udGVudHMgPSBOVUxMOwotCi0gICAgICAvKiBDbGVhciB0aGUgc2l6ZSBvZiBzdWJkZWIsIHNvIHRoYXQgaXQgaXMgbm90IGluY2x1ZGVkIGRpcmVjdGx5Ci0JIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBzdWJkZWItPl9yYXdfc2l6ZSA9IDA7Ci0KLSAgICAgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotCXsKLQkgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKHN1YikpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLSAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc2VjdGlvbi0+X3Jhd19zaXplID0KLSAgICAgIF9iZmRfc3RyaW5ndGFiX3NpemUgKGRlYnVnX3N0cnRhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChsZGluZm8uc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKGxkaW5mby5zdHJpbmdzKTsKLSAgaWYgKGRlYnVnX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWdfY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgLmxvYWRlciBzeW1ib2xzLCBpZiBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfYnVpbGRfbGRzeW1zIChoLCBwKQotICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvICpsZGluZm8gPSAoc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvICopIHA7Ci0gIHNpemVfdCBsZW47Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIGFuZCB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbgotICAgICBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvcgotICAgICB0aGUgc3ltYm9sIGluIGEgY29tbW9uIHNlY3Rpb24gYnV0IHRoZSBYQ09GRl9ERUZfUkVHVUxBUiBmbGFnCi0gICAgIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX1JFRl9SRUdVTEFSKSAhPSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKQotCSAgfHwgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgPT0gMCkpCi0gICAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0KLSAgLyogSWYgYWxsIGRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgZXhwb3J0ZWQsIG1hcmsgdGhlbSBub3cuICBXZQotICAgICBkb24ndCB3YW50IHRvIGV4cG9ydCB0aGUgYWN0dWFsIGZ1bmN0aW9ucywganVzdCB0aGUgZnVuY3Rpb24KLSAgICAgZGVzY3JpcHRvcnMuICAqLwotICBpZiAobGRpbmZvLT5leHBvcnRfZGVmaW5lZHMKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCi0gICAgICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdICE9ICcuJykKLSAgICB7Ci0gICAgICBib29sZWFuIGV4cG9ydDsKLQotICAgICAgLyogV2UgZG9uJ3QgZXhwb3J0IGEgc3ltYm9sIHdoaWNoIGlzIGJlaW5nIGRlZmluZWQgYnkgYW4gb2JqZWN0Ci0JIGluY2x1ZGVkIGZyb20gYW4gYXJjaGl2ZSB3aGljaCBjb250YWlucyBhIHNoYXJlZCBvYmplY3QuICBUaGUKLQkgcmF0aW9uYWxlIGlzIHRoYXQgaWYgYW4gYXJjaGl2ZSBjb250YWlucyBib3RoIGFuIHVuc2hhcmVkIGFuZAotCSBhIHNoYXJlZCBvYmplY3QsIHRoZW4gdGhlcmUgbXVzdCBiZSBzb21lIHJlYXNvbiB0aGF0IHRoZQotCSB1bnNoYXJlZCBvYmplY3QgaXMgdW5zaGFyZWQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0Ci0JIHByb3ZpZGluZyBhIHNoYXJlZCB2ZXJzaW9uIG9mIGl0LiAgSW4gcGFydGljdWxhciwgdGhpcyBzb2x2ZXMKLQkgYSBidWcgaW52b2x2aW5nIHRoZSBfc2F2ZWZOTiBzZXQgb2YgZnVuY3Rpb25zLiAgZ2NjIHdpbGwgY2FsbAotCSB0aG9zZSBmdW5jdGlvbnMgd2l0aG91dCBwcm92aWRpbmcgYSBzbG90IHRvIHJlc3RvcmUgdGhlIFRPQywKLQkgc28gaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGJlIGxpbmtlZCBpbiBkaXJlY3RseQotCSBhbmQgbm90IGZyb20gYSBzaGFyZWQgb2JqZWN0LCB3aGljaCBtZWFucyB0aGF0IGEgc2hhcmVkCi0JIG9iamVjdCB3aGljaCBhbHNvIGhhcHBlbnMgdG8gbGluayB0aGVtIGluIG11c3Qgbm90IGV4cG9ydAotCSB0aGVtLiAgVGhpcyBpcyBjb25mdXNpbmcsIGJ1dCBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mCi0JIGEgZGlmZmVyZW50IGFwcHJvYWNoLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2xzIGNhbiwgb2YgY291cnNlLAotCSBiZSBleHBvcnRlZCBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGV4cG9ydCA9IHRydWU7Ci0gICAgICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5teV9hcmNoaXZlICE9IE5VTEwpCi0JewotCSAgYmZkICphcmJmZCwgKm1lbWJlcjsKLQotCSAgYXJiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5teV9hcmNoaXZlOwotCSAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJiZmQsIChiZmQgKikgTlVMTCk7Ci0JICB3aGlsZSAobWVtYmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKG1lbWJlci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCQl7Ci0JCSAgZXhwb3J0ID0gZmFsc2U7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmJmZCwgbWVtYmVyKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGV4cG9ydCkKLQloLT5mbGFncyB8PSBYQ09GRl9FWFBPUlQ7Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gZ2FyYmFnZSBjb2xsZWN0IHN5bWJvbHMgd2hpY2ggYXJlIG5vdCBkZWZpbmVkIGluCi0gICAgIFhDT0ZGIGZpbGVzLiAgVGhpcyBpcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gbWFyayB0aGVtLiAgKi8KLSAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmdjCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyID09IE5VTEwKLQkgIHx8IChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT54dmVjCi0JICAgICAgIT0gbGRpbmZvLT5pbmZvLT5oYXNoLT5jcmVhdG9yKSkpCi0gICAgaC0+ZmxhZ3MgfD0gWENPRkZfTUFSSzsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBjYWxsZWQgYW5kIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCwgb3IgaXQKLSAgICAgaXMgaW1wb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBzZXQgdXAgZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgaXQuCi0gICAgIChVbmxlc3Mgd2UgZGlkIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgd2UgZGlkbid0IG5lZWQgdGhpcwotICAgICBzeW1ib2wuKSAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0NBTExFRCkgIT0gMAotICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotICAgICAgJiYgaC0+cm9vdC5yb290LnN0cmluZ1swXSA9PSAnLicKLSAgICAgICYmIGgtPmRlc2NyaXB0b3IgIT0gTlVMTAotICAgICAgJiYgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCi0JICB8fCAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwCi0JICAgICAgJiYgKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApKQotICAgICAgJiYgKCEgeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKLQkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX01BUkspICE9IDApKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZHM7Ci0KLSAgICAgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmxpbmthZ2Vfc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHNlYzsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIGgtPnNtY2xhcyA9IFhNQ19HTDsKLSAgICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9SRUdVTEFSOwotICAgICAgc2VjLT5fcmF3X3NpemUgKz0gWENPRkZfR0xJTktfU0laRTsKLQotICAgICAgLyogVGhlIGdsb2JhbCBsaW5rYWdlIGNvZGUgcmVxdWlyZXMgYSBUT0MgZW50cnkgZm9yIHRoZQotICAgICAgICAgZGVzY3JpcHRvci4gICovCi0gICAgICBoZHMgPSBoLT5kZXNjcmlwdG9yOwotICAgICAgQkZEX0FTU0VSVCAoKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JCSAgIHx8IGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQkgICYmIChoZHMtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApOwotICAgICAgaGRzLT5mbGFncyB8PSBYQ09GRl9NQVJLOwotICAgICAgaWYgKGhkcy0+dG9jX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBoZHMtPnRvY19zZWN0aW9uID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+dG9jX3NlY3Rpb247Ci0JICBoZHMtPnUudG9jX29mZnNldCA9IGhkcy0+dG9jX3NlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgIGhkcy0+dG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSArPSA0OwotCSAgKyt4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5sZHJlbF9jb3VudDsKLQkgICsraGRzLT50b2Nfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICBoZHMtPmluZHggPSAtMjsKLQkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfU0VUX1RPQyB8IFhDT0ZGX0xEUkVMOwotCi0JICAvKiBXZSBuZWVkIHRvIGNhbGwgeGNvZmZfYnVpbGRfbGRzeW1zIHJlY3Vyc2l2ZWx5IGhlcmUsCi0gICAgICAgICAgICAgYmVjYXVzZSB3ZSBtYXkgYWxyZWFkeSBoYXZlIHBhc3NlZCBoZHMgb24gdGhlIHRyYXZlcnNhbC4gICovCi0JICB4Y29mZl9idWlsZF9sZHN5bXMgKGhkcywgcCk7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBleHBvcnRlZCwgYnV0IG5vdCBkZWZpbmVkLCB3ZSBuZWVkIHRvIHRyeSB0bwotICAgICBkZWZpbmUgaXQuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSAhPSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMAotCSAgJiYgKGgtPmRlc2NyaXB0b3ItPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5kZXNjcmlwdG9yLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICAvKiBUaGlzIGlzIGFuIHVuZGVmaW5lZCBmdW5jdGlvbiBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgICAgIGEgZGVmaW5lZCBlbnRyeSBwb2ludC4gIFdlIGNhbiBidWlsZCB1cCBhIGZ1bmN0aW9uCi0gICAgICAgICAgICAgZGVzY3JpcHRvciBvdXJzZWx2ZXMuICBCZWxpZXZlIGl0IG9yIG5vdCwgdGhlIEFJWCBsaW5rZXIKLSAgICAgICAgICAgICBhY3R1YWxseSBkb2VzIHRoaXMsIGFuZCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0bwotICAgICAgICAgICAgIGRvIGl0IGFzIHdlbGwuICAqLwotCSAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOwotCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gc2VjOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgaC0+c21jbGFzID0gWE1DX0RTOwotCSAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0JICBzZWMtPl9yYXdfc2l6ZSArPSAxMjsKLQotCSAgLyogQSBmdW5jdGlvbiBkZXNjcmlwdG9yIHVzZXMgdHdvIHJlbG9jczogb25lIGZvciB0aGUKLSAgICAgICAgICAgICBhc3NvY2lhdGVkIGNvZGUsIGFuZCBvbmUgZm9yIHRoZSBUT0MgYWRkcmVzcy4gICovCi0JICB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5sZHJlbF9jb3VudCArPSAyOwotCSAgc2VjLT5yZWxvY19jb3VudCArPSAyOwotCi0JICAvKiBXZSBoYW5kbGUgd3JpdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZXNjcmlwdG9yIGluCi0gICAgICAgICAgICAgeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbC4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygid2FybmluZzogYXR0ZW1wdCB0byBleHBvcnQgdW5kZWZpbmVkIHN5bWJvbCBgJXMnIiksCi0JICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGgtPmxkc3ltID0gTlVMTDsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBzdGlsbCBhIGNvbW1vbiBzeW1ib2wsIGFuZCBpdCB3YXNuJ3QgZ2FyYmFnZQotICAgICBjb2xsZWN0ZWQsIHdlIG5lZWQgdG8gYWN0dWFsbHkgYWxsb2NhdGUgc3BhY2UgZm9yIGl0IGluIHRoZSAuYnNzCi0gICAgIHNlY3Rpb24uICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0gICAgICAmJiAoISB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5nYwotCSAgfHwgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgIT0gMCkKLSAgICAgICYmIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPl9yYXdfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc19jb21fc2VjdGlvbiAoaC0+cm9vdC51LmMucC0+c2VjdGlvbikpOwotICAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+X3Jhd19zaXplID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBhZGQgYSBzeW1ib2wgdG8gdGhlIC5sb2FkZXIgc2VjdGlvbiBpZiBpdCBpcyBtZW50aW9uZWQKLSAgICAgaW4gYSByZWxvYyB3aGljaCB3ZSBhcmUgY29weWluZyB0byB0aGUgLmxvYWRlciBzZWN0aW9uIGFuZCBpdCB3YXMKLSAgICAgbm90IGRlZmluZWQgb3IgY29tbW9uLCBvciBpZiBpdCBpcyB0aGUgZW50cnkgcG9pbnQsIG9yIGlmIGl0IGlzCi0gICAgIGJlaW5nIGV4cG9ydGVkLiAgKi8KLQotICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0xEUkVMKSA9PSAwCi0gICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9FTlRSWSkgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSA9PSAwKQotICAgIHsKLSAgICAgIGgtPmxkc3ltID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBkb24ndCBuZWVkIHRvIGFkZCB0aGlzIHN5bWJvbCBpZiB3ZSBkaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZAotICAgICB3ZSBkaWQgbm90IG1hcmsgdGhpcyBzeW1ib2wuICAqLwotICBpZiAoeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0gICAgewotICAgICAgaC0+bGRzeW0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFdlIG1heSBoYXZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgc3ltYm9sIGR1ZSB0byB0aGUgcmVjdXJzaXZlCi0gICAgIGNhbGwgYWJvdmUuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfQlVJTFRfTERTWU0pICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbmVlZCB0byBhZGQgdGhpcyBzeW1ib2wgdG8gdGhlIC5sb2FkZXIgc3ltYm9scy4gICovCi0KLSAgQkZEX0FTU0VSVCAoaC0+bGRzeW0gPT0gTlVMTCk7Ci0gIGgtPmxkc3ltID0gKChzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKikKLQkgICAgICBiZmRfemFsbG9jIChsZGluZm8tPm91dHB1dF9iZmQsCi0JCQkgIHNpemVvZiAoc3RydWN0IGludGVybmFsX2xkc3ltKSkpOwotICBpZiAoaC0+bGRzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZGluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDApCi0gICAgaC0+bGRzeW0tPmxfaWZpbGUgPSBoLT5sZGluZHg7Ci0KLSAgLyogVGhlIGZpcnN0IDMgc3ltYm9sIHRhYmxlIGluZGljZXMgYXJlIHJlc2VydmVkIHRvIGluZGljYXRlIHRoZQotICAgICBzZWN0aW9ucy4gICovCi0gIGgtPmxkaW5keCA9IGxkaW5mby0+bGRzeW1fY291bnQgKyAzOwotCi0gICsrbGRpbmZvLT5sZHN5bV9jb3VudDsKLQotICBsZW4gPSBzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotICBpZiAobGVuIDw9IFNZTU5NTEVOKQotICAgIHN0cm5jcHkgKGgtPmxkc3ltLT5fbC5fbF9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGRpbmZvLT5zdHJpbmdfc2l6ZSArIGxlbiArIDMgPiBsZGluZm8tPnN0cmluZ19hbGMpCi0JewotCSAgc2l6ZV90IG5ld2FsYzsKLQkgIGJmZF9ieXRlICpuZXdzdHJpbmdzOwotCi0JICBuZXdhbGMgPSBsZGluZm8tPnN0cmluZ19hbGMgKiAyOwotCSAgaWYgKG5ld2FsYyA9PSAwKQotCSAgICBuZXdhbGMgPSAzMjsKLQkgIHdoaWxlIChsZGluZm8tPnN0cmluZ19zaXplICsgbGVuICsgMyA+IG5ld2FsYykKLQkgICAgbmV3YWxjICo9IDI7Ci0KLQkgIG5ld3N0cmluZ3MgPSAoKGJmZF9ieXRlICopCi0JCQliZmRfcmVhbGxvYyAoKFBUUikgbGRpbmZvLT5zdHJpbmdzLCBuZXdhbGMpKTsKLQkgIGlmIChuZXdzdHJpbmdzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBsZGluZm8tPmZhaWxlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBsZGluZm8tPnN0cmluZ19hbGMgPSBuZXdhbGM7Ci0JICBsZGluZm8tPnN0cmluZ3MgPSBuZXdzdHJpbmdzOwotCX0KLQotICAgICAgYmZkX3B1dF8xNiAobGRpbmZvLT5vdXRwdXRfYmZkLCBsZW4gKyAxLAotCQkgIGxkaW5mby0+c3RyaW5ncyArIGxkaW5mby0+c3RyaW5nX3NpemUpOwotICAgICAgc3RyY3B5IChsZGluZm8tPnN0cmluZ3MgKyBsZGluZm8tPnN0cmluZ19zaXplICsgMiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0gICAgICBoLT5sZHN5bS0+X2wuX2xfbC5fbF96ZXJvZXMgPSAwOwotICAgICAgaC0+bGRzeW0tPl9sLl9sX2wuX2xfb2Zmc2V0ID0gbGRpbmZvLT5zdHJpbmdfc2l6ZSArIDI7Ci0gICAgICBsZGluZm8tPnN0cmluZ19zaXplICs9IGxlbiArIDM7Ci0gICAgfQotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0JVSUxUX0xEU1lNOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLWJvb2xlYW4KLV9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzaXplX3QgbWF4X2NvbnRlbnRzX3NpemU7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBzaXplX3QgbWF4X2xpbmVub19jb3VudDsKLSAgc2l6ZV90IG1heF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9vdXRwdXRfcmVsb2NfY291bnQ7Ci0gIGZpbGVfcHRyIHJlbF9maWxlcG9zOwotICB1bnNpZ25lZCBpbnQgcmVsc3o7Ci0gIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IGxpbmVzejsKLSAgYmZkICpzdWI7Ci0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBjaGFyIHN0cmJ1ZltTVFJJTkdfU0laRV9TSVpFXTsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby50b2Nfc3ltaW5keCA9IC0xOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOwotICBmaW5mby5vdXRzeW1zID0gTlVMTDsKLSAgZmluZm8ubGluZW5vcyA9IE5VTEw7Ci0gIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLQotICBmaW5mby5sZHN5bSA9ICgoc3RydWN0IGV4dGVybmFsX2xkc3ltICopCi0JCSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cwotCQkgICsgTERIRFJTWikpOwotICBmaW5mby5sZHJlbCA9ICgoc3RydWN0IGV4dGVybmFsX2xkcmVsICopCi0JCSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cwotCQkgICsgTERIRFJTWgotCQkgICsgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyLmxfbnN5bXMgKiBMRFNZTVNaKSk7Ci0KLSAgeGNvZmZfZGF0YSAoYWJmZCktPmNvZmYubGlua19pbmZvID0gaW5mbzsKLQotICBmaW5mby5zdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoZmluZm8uc3RydGFiID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVyIGFuZCByZWxvY2F0aW9uIGVudHJpZXMgcmVxdWlyZWQgZm9yIHRoZQotICAgICBvdXRwdXQgZmlsZS4gIERldGVybWluZSBhIGZldyBtYXhpbXVtIHNpemVzLiAgKi8KLSAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOwotICBtYXhfbGluZW5vX2NvdW50ID0gMDsKLSAgbWF4X3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCi0JCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAotCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCi0JICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7Ci0KLQkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQotCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCi0JCW8tPmxpbmVub19jb3VudCArPSBzZWMtPmxpbmVub19jb3VudDsKLQotCSAgICAgIG8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoc2VjLT5saW5lbm9fY291bnQgPiBtYXhfbGluZW5vX2NvdW50KQotCQltYXhfbGluZW5vX2NvdW50ID0gc2VjLT5saW5lbm9fY291bnQ7Ci0JICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLQkJICAmJiB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYykgIT0gTlVMTAotCQkgICYmICh4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxpbmVub19jb3VudAotCQkgICAgICA+IG1heF9saW5lbm9fY291bnQpKQotCQltYXhfbGluZW5vX2NvdW50ID0KLQkJICB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICArK28tPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMuICAqLwotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZpbGVfYWxpZ24gIT0gMCkKLQlhYm9ydCAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfdm1hIGZpbGVfYWxpZ247Ci0KLSAgICAgIGZpbGVfYWxpZ24gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZmlsZV9hbGlnbjsKLSAgICAgIGlmIChmaWxlX2FsaWduICE9IDApCi0JewotCSAgYm9vbGVhbiBzYXdfY29udGVudHM7Ci0JICBpbnQgaW5keDsKLQkgIGFzZWN0aW9uICoqb3A7Ci0JICBmaWxlX3B0ciBzb2ZhcjsKLQotCSAgLyogSW5zZXJ0IC5wYWQgc2VjdGlvbnMgYmVmb3JlIGV2ZXJ5IHNlY3Rpb24gd2hpY2ggaGFzCi0gICAgICAgICAgICAgY29udGVudHMgYW5kIGlzIGxvYWRlZCwgaWYgaXQgaXMgcHJlY2VkZWQgYnkgc29tZSBvdGhlcgotICAgICAgICAgICAgIHNlY3Rpb24gd2hpY2ggaGFzIGNvbnRlbnRzIGFuZCBpcyBsb2FkZWQuICAqLwotCSAgc2F3X2NvbnRlbnRzID0gdHJ1ZTsKLQkgIGZvciAob3AgPSAmYWJmZC0+c2VjdGlvbnM7ICpvcCAhPSBOVUxMOyBvcCA9ICYoKm9wKS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKCgqb3ApLT5uYW1lLCAiLnBhZCIpID09IDApCi0JCXNhd19jb250ZW50cyA9IGZhbHNlOwotCSAgICAgIGVsc2UgaWYgKCgoKm9wKS0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCi0JCSAgICAgICAmJiAoKCpvcCktPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXsKLQkJICBpZiAoISBzYXdfY29udGVudHMpCi0JCSAgICBzYXdfY29udGVudHMgPSB0cnVlOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKm4sICpob2xkOwotCi0JCSAgICAgIGhvbGQgPSAqb3A7Ci0JCSAgICAgICpvcCA9IE5VTEw7Ci0JCSAgICAgIG4gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5wYWQiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoKm9wID09IG4pOwotCQkgICAgICBuLT5uZXh0ID0gaG9sZDsKLQkJICAgICAgbi0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCQkgICAgICBuLT5hbGlnbm1lbnRfcG93ZXIgPSAwOwotCQkgICAgICBzYXdfY29udGVudHMgPSBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIFJlc2V0IHRoZSBzZWN0aW9uIGluZGljZXMgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBuZXcKLSAgICAgICAgICAgICBzZWN0aW9ucy4gICovCi0JICBpbmR4ID0gMDsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgKytpbmR4OwotCSAgICAgIG8tPnRhcmdldF9pbmRleCA9IGluZHg7Ci0JICAgIH0KLQkgIEJGRF9BU1NFUlQgKCh1bnNpZ25lZCBpbnQpIGluZHggPT0gYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0KLQkgIC8qIFdvcmsgb3V0IGFwcHJvcHJpYXRlIHNpemVzIGZvciB0aGUgLnBhZCBzZWN0aW9ucyB0byBmb3JjZQotICAgICAgICAgICAgIGVhY2ggc2VjdGlvbiB0byBsYW5kIG9uIGEgcGFnZSBib3VuZGFyeS4gIFRoaXMgYml0IG9mCi0gICAgICAgICAgICAgY29kZSBrbm93cyB3aGF0IGNvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBpcyBnb2luZwotICAgICAgICAgICAgIHRvIGRvLiAgKi8KLQkgIHNvZmFyID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLQkgIHNvZmFyICs9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0JICBzb2ZhciArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICBpZiAoby0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IG8tPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0JICAgICAgc29mYXIgKz0gYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLQotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLnBhZCIpID09IDApCi0JCXsKLQkJICBiZmRfdm1hIHBhZ2VvZmY7Ci0KLQkJICBCRkRfQVNTRVJUIChvLT5fcmF3X3NpemUgPT0gMCk7Ci0JCSAgcGFnZW9mZiA9IHNvZmFyICYgKGZpbGVfYWxpZ24gLSAxKTsKLQkJICBpZiAocGFnZW9mZiAhPSAwKQotCQkgICAgewotCQkgICAgICBvLT5fcmF3X3NpemUgPSBmaWxlX2FsaWduIC0gcGFnZW9mZjsKLQkJICAgICAgc29mYXIgKz0gZmlsZV9hbGlnbiAtIHBhZ2VvZmY7Ci0JCSAgICAgIG8tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkJICAgIHNvZmFyICs9IEJGRF9BTElHTiAoby0+X3Jhd19zaXplLAotCQkJCQkxIDw8IG8tPmFsaWdubWVudF9wb3dlcik7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwb2ludGVycyB3ZSBuZWVkIHRvIGtlZXAgZm9yIHRoZSByZWxvY3MuICAqLwotICB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAvKiBXZSB1c2Ugc2VjdGlvbl9jb3VudCArIDEsIHJhdGhlciB0aGFuIHNlY3Rpb25fY291bnQsIGJlY2F1c2UKLSAgICAgICB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkcyBhcmUgMSBiYXNlZC4gICovCi0gICAgZmluZm8uc2VjdGlvbl9pbmZvID0KLSAgICAgICgoc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCi0gICAgICAgYmZkX21hbGxvYyAoKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKQotCQkgICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvKSkpOwotICAgIGlmIChmaW5mby5zZWN0aW9uX2luZm8gPT0gTlVMTCkKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIGZvciAoaSA9IDA7IGkgPD0gYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotICAgICAgewotCWZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgPSBOVUxMOwotCWZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKLQlmaW5mby5zZWN0aW9uX2luZm9baV0udG9jX3JlbF9oYXNoZXMgPSBOVUxMOwotICAgICAgfQotICB9Ci0KLSAgLyogU2V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHJlbF9maWxlcG9zID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0Jby0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgc3RyaXBwZWQgZmlsZSBoYXMgbm8gcmVsb2NzLiAgSG93ZXZlciwgd2Ugc3RpbGwKLSAgICAgICAgICAgICBhbGxvY2F0ZSB0aGUgYnVmZmVycywgc28gdGhhdCBsYXRlciBjb2RlIGRvZXNuJ3QgaGF2ZSB0bwotICAgICAgICAgICAgIHdvcnJ5IGFib3V0IHdoZXRoZXIgd2UgYXJlIHN0cmlwcGluZyBvciBub3QuICAqLwotCSAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQkgICAgby0+cmVsX2ZpbGVwb3MgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICAgIG8tPnJlbF9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0JICAgICAgcmVsX2ZpbGVwb3MgKz0gby0+cmVsb2NfY291bnQgKiByZWxzejsKLQkgICAgfQotCi0JICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKLSAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKLSAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQotICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KLSAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKLSAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgotCi0JICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KLQkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LgotCSAgICAgV2UgY291bGQgYmFja3BhdGNoIHRoZSBmaWxlIGxhdGVyLCBJIHN1cHBvc2UsIGFsdGhvdWdoIGl0Ci0JICAgICB3b3VsZCBiZSBzbG93LiAgKi8KLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9Ci0JICAgICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9Ci0JICAgICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50Ci0JCSAgICAgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAotCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCi0JICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLwotICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLSAgZmluZm8ubGluZV9maWxlcG9zID0gbGluZV9maWxlcG9zOwotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoby0+bGluZW5vX2NvdW50ID09IDApCi0Jby0+bGluZV9maWxlcG9zID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvLT5saW5lX2ZpbGVwb3MgPSBsaW5lX2ZpbGVwb3M7Ci0JICBsaW5lX2ZpbGVwb3MgKz0gby0+bGluZW5vX2NvdW50ICogbGluZXN6OwotCX0KLQotICAgICAgLyogUmVzZXQgdGhlIHJlbG9jIGFuZCBsaW5lbm8gY291bnRzLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0bwotCSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgfQotCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBsaW5lX2ZpbGVwb3M7Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygc3ltYm9scyBpbiBhbiBpbnB1dCBCRkQuICBUYWtlCi0gICAgIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhciB0aGUgb3V0cHV0X2hhc19iZWd1biBmaWVsZHMgb2YgYWxsIHRoZQotICAgICBpbnB1dCBCRkQncy4gIFdlIHdhbnQgYXQgbGVhc3QgNiBzeW1ib2xzLCBzaW5jZSB0aGF0IGlzIHRoZQotICAgICBudW1iZXIgd2hpY2ggeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCBtYXkgbmVlZC4gICovCi0gIG1heF9zeW1fY291bnQgPSA2OwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc3o7Ci0KLSAgICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICAgICAgc3ogPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKLSAgICAgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCi0JbWF4X3N5bV9jb3VudCA9IHN6OwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgdXNlZCB3aGlsZSBsaW5raW5nLiAgKi8KLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KSkpOwotICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKLQkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7Ci0gIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAotCQkJCQkgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnN5bV9pbmRpY2VzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCBmaW5mby5vdXRzeW1zID09IE5VTEwKLSAgICAgIHx8IChmaW5mby5saW5lbm9zID09IE5VTEwgJiYgbWF4X2xpbmVub19jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSA+IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gMDsKLSAgeGNvZmZfZGF0YSAoYWJmZCktPnRvYyA9IChiZmRfdm1hKSAtMTsKLQotICAvKiBXZSBub3cga25vdyB0aGUgcG9zaXRpb24gb2YgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgZXhjZXB0IHRoYXQKLSAgICAgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGVyZWZvcmUgd2UgZG9uJ3QKLSAgICAga25vdyB3aGVyZSB0aGUgc3RyaW5nIHRhYmxlIHN0YXJ0cy4gIFdlIGp1c3QgYnVpbGQgdGhlIHN0cmluZwotICAgICB0YWJsZSBpbiBtZW1vcnkgYXMgd2UgZ28gYWxvbmcuICBXZSBwcm9jZXNzIGFsbCB0aGUgcmVsb2NhdGlvbnMKLSAgICAgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXItPnh2ZWMgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotCQl7Ci0JCSAgaWYgKCEgeGNvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgeGNvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgJmZpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEZyZWUgdXAgdGhlIGJ1ZmZlcnMgdXNlZCBieSB4Y29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgICAgIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICAgICAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKLSAgICAgIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICAgICAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gICAgICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBzdXBwb3NlZCB0byBiZSAtMS4gIFdyaXRlCi0gICAgIGl0IG91dCBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgPSAtMTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scyB3aGljaCBkbyBub3QgY29tZSBmcm9tIFhDT0ZGCi0gICAgIGlucHV0IGZpbGVzLiAgKi8KLSAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLAotCQkJICAgIChQVFIpICZmaW5mbyk7Ci0KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUgZ2xvYmFsIHN5bWJvbHMsIHdlIGtub3cgdGhlCi0gICAgIHN5bWJvbCBpbmRpY2VzIHRvIHVzZSBmb3IgcmVsb2NzIGFnYWluc3QgdGhlbSwgYW5kIHdlIGNhbiBmaW5hbGx5Ci0gICAgIHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotICAgICAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqdG9jX3JlbF9oYXNoOwotICAgICAgYmZkX2J5dGUgKmVyZWw7Ci0KLSAgICAgIC8qIEEgc3RyaXBwZWQgZmlsZSBoYXMgbm8gcmVsb2NzLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JewotCSAgby0+cmVsb2NfY291bnQgPSAwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaXJlbCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLSAgICAgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICByZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXM7Ci0gICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKywgZXJlbCArPSByZWxzeikKLQl7Ci0JICBpZiAoKnJlbF9oYXNoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKCpyZWxfaGFzaCktPmluZHggPCAwKQotCQl7Ci0JCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJIChpbmZvLCAoKnJlbF9oYXNoKS0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgKGJmZCAqKSBOVUxMLCBvLCBpcmVsLT5yX3ZhZGRyKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAoKnJlbF9oYXNoKS0+aW5keCA9IDA7Ci0JCX0KLQkgICAgICBpcmVsLT5yX3N5bW5keCA9ICgqcmVsX2hhc2gpLT5pbmR4OwotCSAgICB9Ci0JfQotCi0gICAgICBmb3IgKHRvY19yZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnRvY19yZWxfaGFzaGVzOwotCSAgIHRvY19yZWxfaGFzaCAhPSBOVUxMOwotCSAgIHRvY19yZWxfaGFzaCA9IHRvY19yZWxfaGFzaC0+bmV4dCkKLQl7Ci0JICBpZiAodG9jX3JlbF9oYXNoLT5oLT51LnRvY19pbmR4IDwgMCkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJICAgICAoaW5mbywgdG9jX3JlbF9oYXNoLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAgICAoYmZkICopIE5VTEwsIG8sIHRvY19yZWxfaGFzaC0+cmVsLT5yX3ZhZGRyKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIHRvY19yZWxfaGFzaC0+aC0+dS50b2NfaW5keCA9IDA7Ci0JICAgIH0KLQkgIHRvY19yZWxfaGFzaC0+cmVsLT5yX3N5bW5keCA9IHRvY19yZWxfaGFzaC0+aC0+dS50b2NfaW5keDsKLQl9Ci0KLSAgICAgIC8qIFhDT0ZGIHJlcXVpcmVzIHRoYXQgdGhlIHJlbG9jcyBiZSBzb3J0ZWQgYnkgYWRkcmVzcy4gIFdlIHRlbmQKLSAgICAgICAgIHRvIHByb2R1Y2UgdGhlbSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlaXIgY29udGFpbmluZyBjc2VjdHMKLSAgICAgICAgIGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgYnkKLSAgICAgICAgIGFkZHJlc3MuICBTbyB3ZSBzb3J0IHRoZW0gaGVyZS4gIFRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8KLSAgICAgICAgIGRvIHRoaXMuICAqLwotICAgICAgcXNvcnQgKChQVFIpIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcywKLQkgICAgIG8tPnJlbG9jX2NvdW50LCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyksCi0JICAgICB4Y29mZl9zb3J0X3JlbG9jcyk7Ci0KLSAgICAgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0gICAgICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCWJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQlhYmZkKSAhPSByZWxzeiAqIG8tPnJlbG9jX2NvdW50KQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIEZyZWUgdXAgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOwotCX0KLSAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7Ci0gICAgICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGxvYWRlciBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgQkZEX0FTU0VSVCAoKGJmZF9ieXRlICopIGZpbmZvLmxkcmVsCi0JICAgICAgPT0gKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbi0+Y29udGVudHMKLQkJICArIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZGhkci5sX2ltcG9mZikpOwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgby0+Y29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJICBvLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgbWFnaWMgc2VjdGlvbnMuICAqLwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxpbmthZ2Vfc2VjdGlvbjsKLSAgaWYgKG8tPl9yYXdfc2l6ZSA+IDAKLSAgICAgICYmICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwgby0+Y29udGVudHMsCi0JCQkJICAgICBvLT5vdXRwdXRfb2Zmc2V0LCBvLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRvY19zZWN0aW9uOwotICBpZiAoby0+X3Jhd19zaXplID4gMAotICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKLQkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOwotICBpZiAoby0+X3Jhd19zaXplID4gMAotICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKLQkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzeiksCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsCi0JCV9iZmRfc3RyaW5ndGFiX3NpemUgKGZpbmZvLnN0cnRhYikgKyBTVFJJTkdfU0laRV9TSVpFLAotCQkoYmZkX2J5dGUgKikgc3RyYnVmKTsKLSAgaWYgKGJmZF93cml0ZSAoc3RyYnVmLCAxLCBTVFJJTkdfU0laRV9TSVpFLCBhYmZkKSAhPSBTVFJJTkdfU0laRV9TSVpFKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zdHJ0YWIpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgc3RyaW5nIHRhYmxlLiAgKi8KLSAgbyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uOwotICBpZiAobyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKLQotICAgICAgZGVidWdfc3RydGFiID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3N0cnRhYjsKLSAgICAgIEJGRF9BU1NFUlQgKG8tPm91dHB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLSBvLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgPj0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZGVidWdfc3RydGFiKSk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBvLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIG8tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGRlYnVnX3N0cnRhYikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCi0gICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgotICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBzeW1lbnRfYmFzZTsKLSAgdW5zaWduZWQgaW50IG5fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdDsKLSAgYm9vbGVhbiBjb3B5LCBoYXNoOwotICBiZmRfc2l6ZV90eXBlIGlzeW1lc3o7Ci0gIGJmZF9zaXplX3R5cGUgb3N5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXN5bXA7Ci0gIGFzZWN0aW9uICoqY3NlY3RwcDsKLSAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kZXg7Ci0gIGxvbmcgKmluZGV4cDsKLSAgdW5zaWduZWQgbG9uZyBvdXRwdXRfaW5kZXg7Ci0gIGJmZF9ieXRlICpvdXRzeW07Ci0gIHVuc2lnbmVkIGludCBpbmNsczsKLSAgYXNlY3Rpb24gKm9saW5lOwotICBib29sZWFuIGtlZXBfc3ltczsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgLyogV2UgY2FuIGp1c3Qgc2tpcCBEWU5BTUlDIGZpbGVzLCB1bmxlc3MgdGhpcyBpcyBhIHN0YXRpYyBsaW5rLiAgKi8KLSAgaWYgKChpbnB1dF9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgISBmaW5mby0+aW5mby0+c3RhdGljX2xpbmspCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTW92ZSBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN0cmluZ3MgPSBOVUxMOwotICBzeW1lbnRfYmFzZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgaXN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgb3N5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoaW5wdXRfYmZkKTsKLSAgQkZEX0FTU0VSVCAobGluZXN6ID09IGJmZF9jb2ZmX2xpbmVzeiAob3V0cHV0X2JmZCkpOwotCi0gIG5fdG1hc2sgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fdG1hc2s7Ci0gIG5fYnRzaGZ0ID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX2J0c2hmdDsKLQotICAvKiBEZWZpbmUgbWFjcm9zIHNvIHRoYXQgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotCi0gIGNvcHkgPSBmYWxzZTsKLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIGNvcHkgPSB0cnVlOwotICBoYXNoID0gdHJ1ZTsKLSAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgaGFzaCA9IGZhbHNlOwotCi0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIHN5bV9oYXNoID0gb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGNzZWN0cHAgPSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5jc2VjdHM7Ci0gIGRlYnVnX2luZGV4ID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5kaWNlczsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotICBvdXRwdXRfaW5kZXggPSBzeW1lbnRfYmFzZTsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0gIGluY2xzID0gMDsKLSAgb2xpbmUgPSBOVUxMOwotCi0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLSAgICAgIGludCBzbXR5cCA9IDA7Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBib29sZWFuIHJlcXVpcmU7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBDX0VYVCBvciBDX0hJREVYVCBzeW1ib2wsIHdlIG5lZWQgdGhlIGNzZWN0Ci0gICAgICAgICBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAoaXN5bXAtPm5fc2NsYXNzID09IENfRVhUIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLQl7Ci0JICBCRkRfQVNTRVJUIChpc3ltcC0+bl9udW1hdXggPiAwKTsKLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsCi0JCQkJKFBUUikgKGVzeW0gKyBpc3ltZXN6ICogaXN5bXAtPm5fbnVtYXV4KSwKLQkJCQlpc3ltcC0+bl90eXBlLCBpc3ltcC0+bl9zY2xhc3MsCi0JCQkJaXN5bXAtPm5fbnVtYXV4IC0gMSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCShQVFIpICZhdXgpOwotCSAgc210eXAgPSBTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCk7Ci0JfQotCi0gICAgICAvKiBNYWtlIGEgY29weSBvZiAqaXN5bXAgc28gdGhhdCB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbgotCSBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgdmFsdWVzLiAgVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KLQkgYWx3YXlzIHJlY29tcHV0aW5nIHRoZSBzeW1ib2wgdmFsdWUgZXZlbiBpZiB3ZSBhcmUgc3RyaXBwaW5nCi0JIHRoZSBzeW1ib2wuICAqLwotICAgICAgaXN5bSA9ICppc3ltcDsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gdGhlIC5sb2FkZXIgc2VjdGlvbiwgc3dhcCBvdXQgdGhlCi0gICAgICAgICAubG9hZGVyIHN5bWJvbCBpbmZvcm1hdGlvbi4gIElmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sCi0gICAgICAgICByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHN5bWJvbCwgdGhvdWdoLCB0aGVuIHdhaXQgdW50aWwgd2UgZ2V0Ci0gICAgICAgICB0byB0aGUgZGVmaW5pdGlvbi4gICovCi0gICAgICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgJiYgKnN5bV9oYXNoICE9IE5VTEwKLQkgICYmICgqc3ltX2hhc2gpLT5sZHN5bSAhPSBOVUxMCi0JICAmJiAoc210eXAgIT0gWFRZX0VSCi0JICAgICAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkpCi0JewotCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqbGRzeW07Ci0KLQkgIGggPSAqc3ltX2hhc2g7Ci0JICBsZHN5bSA9IGgtPmxkc3ltOwotCSAgaWYgKGlzeW0ubl9zY251bSA+IDApCi0JICAgIHsKLQkgICAgICBsZHN5bS0+bF9zY251bSA9ICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgICAgbGRzeW0tPmxfdmFsdWUgPSAoaXN5bS5uX3ZhbHVlCi0JCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJLSAoKmNzZWN0cHApLT52bWEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsZHN5bS0+bF9zY251bSA9IGlzeW0ubl9zY251bTsKLQkgICAgICBsZHN5bS0+bF92YWx1ZSA9IGlzeW0ubl92YWx1ZTsKLQkgICAgfQotCi0JICBsZHN5bS0+bF9zbXR5cGUgPSBzbXR5cDsKLQkgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLQkgICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCi0JICAgICAgfHwgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwKQotCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9JTVBPUlQ7Ci0JICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCi0JICAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwKQotCSAgICAgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0VYUE9SVCkgIT0gMCkKLQkgICAgbGRzeW0tPmxfc210eXBlIHw9IExfRVhQT1JUOwotCSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwKQotCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9FTlRSWTsKLQotCSAgbGRzeW0tPmxfc21jbGFzID0gYXV4LnhfY3NlY3QueF9zbWNsYXM7Ci0KLQkgIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIGxkc3ltLT5sX2lmaWxlID0gMDsKLQkgIGVsc2UgaWYgKGxkc3ltLT5sX2lmaWxlID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoKGxkc3ltLT5sX3NtdHlwZSAmIExfSU1QT1JUKSA9PSAwKQotCQlsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkICppbXBiZmQ7Ci0KLQkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgaW1wYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkJICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJICAgIGltcGJmZCA9IGgtPnJvb3QudS51bmRlZi5hYmZkOwotCQkgIGVsc2UKLQkJICAgIGltcGJmZCA9IE5VTEw7Ci0KLQkJICBpZiAoaW1wYmZkID09IE5VTEwpCi0JCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChpbXBiZmQtPnh2ZWMgPT0gZmluZm8tPm91dHB1dF9iZmQtPnh2ZWMpOwotCQkgICAgICBsZHN5bS0+bF9pZmlsZSA9IHhjb2ZmX2RhdGEgKGltcGJmZCktPmltcG9ydF9maWxlX2lkOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgbGRzeW0tPmxfcGFybSA9IDA7Ci0KLQkgIEJGRF9BU1NFUlQgKGgtPmxkaW5keCA+PSAwKTsKLQkgIEJGRF9BU1NFUlQgKExEU1lNU1ogPT0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pKTsKLQkgIHhjb2ZmX3N3YXBfbGRzeW1fb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgbGRzeW0sCi0JCQkJZmluZm8tPmxkc3ltICsgaC0+bGRpbmR4IC0gMyk7Ci0JICBoLT5sZHN5bSA9IE5VTEw7Ci0KLQkgIC8qIEZpbGwgaW4gc25lbnRyeSBub3cgdGhhdCB3ZSBrbm93IHRoZSB0YXJnZXRfaW5kZXguICAqLwotCSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkgICAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnNuZW50cnkgPQotCSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQl9Ci0KLSAgICAgICppbmRleHAgPSAtMTsKLQotICAgICAgc2tpcCA9IGZhbHNlOwotICAgICAgcmVxdWlyZSA9IGZhbHNlOwotICAgICAgYWRkID0gMSArIGlzeW0ubl9udW1hdXg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBza2lwcGluZyB0aGlzIGNzZWN0LCB3ZSB3YW50IHRvIHNraXAgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKCpjc2VjdHBwID09IE5VTEwpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIElmIHdlIGdhcmJhZ2UgY29sbGVjdGVkIHRoaXMgY3NlY3QsIHdlIHdhbnQgdG8gc2tpcCB0aGlzCi0gICAgICAgICBzeW1ib2wuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5nYwotCSAgJiYgKCgqY3NlY3RwcCktPmZsYWdzICYgU0VDX01BUkspID09IDAKLQkgICYmICpjc2VjdHBwICE9IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIEFuIFhDT0ZGIGxpbmtlciBhbHdheXMgc2tpcHMgQ19TVEFUIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgaXN5bXAtPm5fc2NsYXNzID09IENfU1RBVCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogV2Ugc2tpcCBhbGwgYnV0IHRoZSBmaXJzdCBUT0MgYW5jaG9yLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVAotCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDMCkKLQl7Ci0JICBpZiAoZmluZm8tPnRvY19zeW1pbmR4ICE9IC0xKQotCSAgICBza2lwID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgdG9jdmFsLCB0b2NlbmQ7Ci0KLQkgICAgICB0b2N2YWwgPSAoKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGlzeW0ubl92YWx1ZQotCQkJLSAoKmNzZWN0cHApLT52bWEpOwotCSAgICAgIC8qIFdlIHdhbnQgdG8gZmluZCBvdXQgaWYgdG9jdmFsIGlzIGEgZ29vZCB2YWx1ZSB0byB1c2UKLSAgICAgICAgICAgICAgICAgYXMgdGhlIFRPQyBhbmNob3ItLXRoYXQgaXMsIHdoZXRoZXIgd2UgY2FuIGFjY2VzcyBhbGwKLSAgICAgICAgICAgICAgICAgb2YgdGhlIFRPQyB1c2luZyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0b2N2YWwuICBUaGlzCi0gICAgICAgICAgICAgICAgIHRlc3QgYXNzdW1lcyB0aGF0IHRoZSBUT0MgY29tZXMgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgb3V0cHV0IHNlY3Rpb24sIGFzIGl0IGRvZXMgaW4gdGhlIGRlZmF1bHQgbGlua2VyCi0gICAgICAgICAgICAgICAgIHNjcmlwdC4gIEZJWE1FOiBUaGlzIGRvZXNuJ3QgaGFuZGxlIC50b2Nic3Mgc2VjdGlvbnMKLSAgICAgICAgICAgICAgICAgY3JlYXRlZCBmcm9tIFhNQ19URCBjb21tb24gc3ltYm9scyBjb3JyZWN0bHkuICAqLwotCi0JICAgICAgdG9jZW5kID0gKCgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQkgICAgICBpZiAodG9jdmFsICsgMHgxMDAwMCA8IHRvY2VuZCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIlRPQyBvdmVyZmxvdzogMHglbHggPiAweDEwMDAwOyB0cnkgLW1taW5pbWFsLXRvYyB3aGVuIGNvbXBpbGluZyIpLAotCQkgICAgICh1bnNpZ25lZCBsb25nKSAodG9jZW5kIC0gdG9jdmFsKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAodG9jdmFsICsgMHg4MDAwIDwgdG9jZW5kKQotCQl7Ci0JCSAgYmZkX3ZtYSB0b2NhZGQ7Ci0KLQkJICB0b2NhZGQgPSB0b2NlbmQgLSAodG9jdmFsICsgMHg4MDAwKTsKLQkJICB0b2N2YWwgKz0gdG9jYWRkOwotCQkgIGlzeW0ubl92YWx1ZSArPSB0b2NhZGQ7Ci0JCX0KLQotCSAgICAgIGZpbmZvLT50b2Nfc3ltaW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgICB4Y29mZl9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnRvYyA9IHRvY3ZhbDsKLQkgICAgICB4Y29mZl9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnNudG9jID0KLQkJKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICAgICByZXF1aXJlID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHN0cmlwcGluZyBhbGwgc3ltYm9scywgd2Ugd2FudCB0byBza2lwIHRoaXMgb25lLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIFdlIGNhbiBza2lwIHJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgJiYgc210eXAgPT0gWFRZX0VSCi0JICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBXZSBjYW4gc2tpcCBjb21tb24gc3ltYm9scyBpZiB0aGV5IGdvdCBkZWZpbmVkIHNvbWV3aGVyZQotICAgICAgICAgZWxzZS4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAmJiBzbXR5cCA9PSBYVFlfQ00KLQkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgfHwgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPnNlY3Rpb24gIT0gKmNzZWN0cHApCi0JICAmJiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uICE9ICpjc2VjdHBwKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogU2tpcCBsb2NhbCBzeW1ib2xzIGlmIHdlIGFyZSBkaXNjYXJkaW5nIHRoZW0uICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwKLQkgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkgICYmIChpc3ltLm5fc2NsYXNzICE9IENfSElERVhUCi0JICAgICAgfHwgc210eXAgIT0gWFRZX1NEKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgd2Ugc3RyaXBwaW5nIGRlYnVnZ2luZyBzeW1ib2xzLCBhbmQgdGhpcyBpcyBhIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9sLCB0aGVuIHNraXAgaXQuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyCi0JICAmJiBpc3ltLm5fc2NudW0gPT0gTl9ERUJVRykKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgc29tZSBzeW1ib2xzIGFyZSBzdHJpcHBlZCBiYXNlZCBvbiB0aGUgbmFtZSwgd29yayBvdXQgdGhlCi0JIG5hbWUgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHNraXAgdGhpcyBzeW1ib2wuICBXZSBkb24ndCBoYW5kbGUKLQkgdGhpcyBjb3JyZWN0bHkgZm9yIHN5bWJvbHMgd2hvc2UgbmFtZXMgYXJlIGluIHRoZSAuZGVidWcKLQkgc2VjdGlvbjsgdG8gZ2V0IGl0IHJpZ2h0IHdlIHdvdWxkIG5lZWQgYSBuZXcgYmZkX3N0cnRhYl9oYXNoCi0JIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgc3RyaW5nIGdpdmVuIHRoZSBpbmRleC4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wpCi0JICAmJiAoZGVidWdfaW5kZXggPT0gTlVMTCB8fCAqZGVidWdfaW5kZXggPT0gKHVuc2lnbmVkIGxvbmcpIC0xKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwKLQkJCQkgICAgZmFsc2UpID09IE5VTEwpKQotCSAgICAgIHx8IChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKLQkJICAmJiAoaXN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCQkgICAgICAmJiAoaXN5bS5uX3NjbGFzcyAhPSBDX0hJREVYVAotCQkJICB8fCBzbXR5cCAhPSBYVFlfU0QpKQotCQkgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkKLQkgICAgc2tpcCA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBXZSBjYW4gbm90IHNraXAgdGhlIGZpcnN0IFRPQyBhbmNob3IuICAqLwotICAgICAgaWYgKHNraXAKLQkgICYmIHJlcXVpcmUKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCi0Jc2tpcCA9IGZhbHNlOwotCi0gICAgICAvKiBXZSBub3cga25vdyB3aGV0aGVyIHdlIGFyZSB0byBza2lwIHRoaXMgc3ltYm9sIG9yIG5vdC4gICovCi0gICAgICBpZiAoISBza2lwKQotCXsKLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIGluIG9yZGVyIHRvIG91dHB1dCBpdC4gICovCi0KLQkgIGlmIChpc3ltLl9uLl9uX24uX25femVyb2VzID09IDAKLQkgICAgICAmJiBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYSBsb25nIG5hbWUuICBFbnRlciBpdCBpbiB0aGUgc3RyaW5nCi0JCSB0YWJsZSB3ZSBhcmUgYnVpbGRpbmcuICBJZiAqZGVidWdfaW5kZXggIT0gLTEsIHRoZQotCQkgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGVudGVyZWQgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZGVidWdfaW5kZXggIT0gTlVMTCAmJiAqZGVidWdfaW5kZXggIT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCQlpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gKmRlYnVnX2luZGV4OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwKLQkJCQkJCQkgKGNoYXIgKikgTlVMTCk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBuYW1lLCBoYXNoLCBjb3B5KTsKLQkJICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGlzeW0ubl9zY2xhc3MgIT0gQ19CU1RBVAotCSAgICAgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19FU1RBVAotCSAgICAgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19ERUNMCi0JICAgICAgJiYgaXN5bS5uX3NjbnVtID4gMCkKLQkgICAgewotCSAgICAgIGlzeW0ubl9zY251bSA9ICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgICAgaXN5bS5uX3ZhbHVlICs9ICgoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICAgKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICAgLSAoKmNzZWN0cHApLT52bWEpOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB2YWx1ZSBvZiBhIENfRklMRSBzeW1ib2wgaXMgdGhlIHN5bWJvbCBpbmRleCBvZiB0aGUKLQkgICAgIG5leHQgQ19GSUxFIHN5bWJvbC4gIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sCi0JICAgICBpcyAtMS4gIFdlIHRyeSB0byBnZXQgdGhpcyByaWdodCwgYmVsb3csIGp1c3QgYmVmb3JlIHdlCi0JICAgICB3cml0ZSB0aGUgc3ltYm9scyBvdXQsIGJ1dCBpbiB0aGUgZ2VuZXJhbCBjYXNlIHdlIG1heQotCSAgICAgaGF2ZSB0byB3cml0ZSB0aGUgc3ltYm9sIG91dCB0d2ljZS4gICovCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgIHsKLQkgICAgICBpZiAoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAhPSAtMQotCQkgICYmIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSAhPSAobG9uZykgb3V0cHV0X2luZGV4KQotCQl7Ci0JCSAgLyogV2UgbXVzdCBjb3JyZWN0IHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgZW50cnkuICAqLwotCQkgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLQkJICBpZiAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dCBmaWxlLiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4Ci0JCQkJCQkJLSBzeW1lbnRfYmFzZSkKLQkJCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgdGhlIGxhc3QgQ19GSUxFCi0JCQkgc3ltYm9sLiAgV2UgbmVlZCB0byB3cml0ZSBpdCBvdXQgYWdhaW4uICBXZQotCQkJIGJvcnJvdyAqb3V0c3ltIHRlbXBvcmFyaWx5LiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJCQkgICAgICsgZmluZm8tPmxhc3RfZmlsZV9pbmRleCAqIG9zeW1lc3opLAotCQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkJICB8fCAoYmZkX3dyaXRlIChvdXRzeW0sIG9zeW1lc3osIDEsIG91dHB1dF9iZmQpCi0JCQkgICAgICAhPSBvc3ltZXN6KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA9IG91dHB1dF9pbmRleDsKLQkgICAgICBmaW5mby0+bGFzdF9maWxlID0gaXN5bTsKLQkgICAgfQotCi0JICAvKiBUaGUgdmFsdWUgb2YgYSBDX0JJTkNMIG9yIENfRUlOQ0wgc3ltYm9sIGlzIGEgZmlsZSBvZmZzZXQKLSAgICAgICAgICAgICBpbnRvIHRoZSBsaW5lIG51bWJlcnMuICBXZSB1cGRhdGUgdGhlIHN5bWJvbCB2YWx1ZXMgd2hlbgotICAgICAgICAgICAgIHdlIGhhbmRsZSB0aGUgbGluZSBudW1iZXJzLiAgKi8KLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfQklOQ0wKLQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRUlOQ0wpCi0JICAgIHsKLQkgICAgICBpc3ltLm5fdmFsdWUgPSBmaW5mby0+bGluZV9maWxlcG9zOwotCSAgICAgICsraW5jbHM7Ci0JICAgIH0KLQotCSAgLyogT3V0cHV0IHRoZSBzeW1ib2wuICAqLwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOwotCi0JICAqaW5kZXhwID0gb3V0cHV0X2luZGV4OwotCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgewotCSAgICAgIGxvbmcgaW5keDsKLQkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaW5keCA9ICgoZXN5bSAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKQotCQkgICAgICAvIGlzeW1lc3opOwotCSAgICAgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkgICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgICAgIGgtPmluZHggPSBvdXRwdXRfaW5kZXg7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBpcyBhIHN5bWJvbCBpbiB0aGUgVE9DIHdoaWNoIHdlIG1heSBoYXZlIG1lcmdlZAotICAgICAgICAgICAgIChjbGFzcyBYTUNfVEMpLCByZW1lbWJlciB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZSBUT0MKLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19ISURFWFQKLQkgICAgICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMKLQkgICAgICAmJiAqc3ltX2hhc2ggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKCgoKnN5bV9oYXNoKS0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKLQkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+dG9jX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICAgICAgKCpzeW1faGFzaCktPnUudG9jX2luZHggPSBvdXRwdXRfaW5kZXg7Ci0JICAgIH0KLQotCSAgb3V0cHV0X2luZGV4ICs9IGFkZDsKLQkgIG91dHN5bSArPSBhZGQgKiBvc3ltZXN6OwotCX0KLQotICAgICAgZXN5bSArPSBhZGQgKiBpc3ltZXN6OwotICAgICAgaXN5bXAgKz0gYWRkOwotICAgICAgY3NlY3RwcCArPSBhZGQ7Ci0gICAgICBzeW1faGFzaCArPSBhZGQ7Ci0gICAgICBpZiAoZGVidWdfaW5kZXggIT0gTlVMTCkKLQlkZWJ1Z19pbmRleCArPSBhZGQ7Ci0gICAgICArK2luZGV4cDsKLSAgICAgIGZvciAoLS1hZGQ7IGFkZCA+IDA7IC0tYWRkKQotCSppbmRleHArKyA9IC0xOwotICAgIH0KLQotICAvKiBGaXggdXAgdGhlIGF1eCBlbnRyaWVzIGFuZCB0aGUgQ19CU1RBVCBzeW1ib2xzLiAgVGhpcyBtdXN0IGJlCi0gICAgIGRvbmUgaW4gYSBzZXBhcmF0ZSBwYXNzLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3Qgc3ltYm9sCi0gICAgIGluZGljZXMgdW50aWwgd2UgaGF2ZSBhbHJlYWR5IGRlY2lkZWQgd2hpY2ggc3ltYm9scyB3ZSBhcmUgZ29pbmcKLSAgICAgdG8ga2VlcC4gICovCi0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIGluZGV4cCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLSAgY3NlY3RwcCA9IHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0czsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgaW50IGFkZDsKLQotICAgICAgYWRkID0gMSArIGlzeW1wLT5uX251bWF1eDsKLQotICAgICAgaWYgKCppbmRleHAgPCAwKQotCWVzeW0gKz0gYWRkICogaXN5bWVzejsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgaTsKLQotCSAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0JTVEFUKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiBhIENfQlNUQVQgc3ltYm9sIGlzIHRoZSBzeW1ib2wgdGFibGUKLSAgICAgICAgICAgICAgICAgaW5kZXggb2YgdGhlIGNvbnRhaW5pbmcgY3NlY3QuICAqLwotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLCAoUFRSKSBvdXRzeW0sIChQVFIpICZpc3ltKTsKLQkgICAgICBpbmR4ID0gaXN5bS5uX3ZhbHVlOwotCSAgICAgIGlmIChpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCXsKLQkJICBsb25nIHN5bWluZHg7Ci0KLQkJICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgIGlmIChzeW1pbmR4IDwgMCkKLQkJICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0JCSAgZWxzZQotCQkgICAgaXN5bS5uX3ZhbHVlID0gc3ltaW5keDsKLQkJICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLAotCQkJCQkgKFBUUikgb3V0c3ltKTsKLQkJfQotCSAgICB9Ci0KLQkgIGVzeW0gKz0gaXN5bWVzejsKLQkgIG91dHN5bSArPSBvc3ltZXN6OwotCi0JICBmb3IgKGkgPSAwOyBpIDwgaXN5bXAtPm5fbnVtYXV4ICYmIGVzeW0gPCBlc3ltX2VuZDsgaSsrKQotCSAgICB7Ci0JICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIGlzeW1wLT5uX3R5cGUsCi0JCQkJICAgIGlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCSAgICAoUFRSKSAmYXV4KTsKLQotCSAgICAgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgLyogVGhpcyBpcyB0aGUgZmlsZSBuYW1lIChvciBzb21lIGNvbW1lbnQgcHV0IGluIGJ5Ci0JCSAgICAgdGhlIGNvbXBpbGVyKS4gIElmIGl0IGlzIGxvbmcsIHdlIG11c3QgcHV0IGl0IGluCi0JCSAgICAgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JCSAgaWYgKGF1eC54X2ZpbGUueF9uLnhfemVyb2VzID09IDAKLQkJICAgICAgJiYgYXV4LnhfZmlsZS54X24ueF9vZmZzZXQgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCQkgICAgICBCRkRfQVNTRVJUIChhdXgueF9maWxlLnhfbi54X29mZnNldAotCQkJCSAgPj0gU1RSSU5HX1NJWkVfU0laRSk7Ci0JCSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQl7Ci0JCQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGlucHV0X2JmZCk7Ci0JCQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBmaWxlbmFtZSA9IHN0cmluZ3MgKyBhdXgueF9maWxlLnhfbi54X29mZnNldDsKLQkJICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgZmlsZW5hbWUsCi0JCQkJCQkgaGFzaCwgY29weSk7Ci0JCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgYXV4LnhfZmlsZS54X24ueF9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChpc3ltcC0+bl9zY2xhc3MgPT0gQ19FWFQKLQkJCXx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLQkJICAgICAgICYmIGkgKyAxID09IGlzeW1wLT5uX251bWF1eCkKLQkJewotCQkgIC8qIFdlIGRvbid0IHN1cHBvcnQgdHlwZSBjaGVja2luZy4gIEkgZG9uJ3Qga25vdyBpZgotICAgICAgICAgICAgICAgICAgICAgYW55Ym9keSBkb2VzLiAgKi8KLQkJICBhdXgueF9jc2VjdC54X3Bhcm1oYXNoID0gMDsKLQkJICAvKiBJIGRvbid0IHRoaW5rIGFueWJvZHkgdXNlcyB0aGVzZSBmaWVsZHMsIGJ1dCB3ZSdkCi0gICAgICAgICAgICAgICAgICAgICBiZXR0ZXIgY2xvYmJlciB0aGVtIGp1c3QgaW4gY2FzZS4gICovCi0JCSAgYXV4LnhfY3NlY3QueF9zdGFiID0gMDsKLQkJICBhdXgueF9jc2VjdC54X3Nuc3RhYiA9IDA7Ci0JCSAgaWYgKFNNVFlQX1NNVFlQIChhdXgueF9jc2VjdC54X3NtdHlwKSA9PSBYVFlfTEQpCi0JCSAgICB7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCQkgICAgICBpbmR4ID0gYXV4LnhfY3NlY3QueF9zY25sZW4ubDsKLQkJICAgICAgaWYgKGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCXsKLQkJCSAgbG9uZyBzeW1pbmR4OwotCi0JCQkgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCQkgIGlmIChzeW1pbmR4IDwgMCkKLQkJCSAgICBhdXgueF9zeW0ueF90YWduZHgubCA9IDA7Ci0JCQkgIGVsc2UKLQkJCSAgICBhdXgueF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc3ltcC0+bl9zY2xhc3MgIT0gQ19TVEFUIHx8IGlzeW1wLT5uX3R5cGUgIT0gVF9OVUxMKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JCSAgaWYgKElTRkNOIChpc3ltcC0+bl90eXBlKQotCQkgICAgICB8fCBJU1RBRyAoaXN5bXAtPm5fc2NsYXNzKQotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19CTE9DSwotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04pCi0JCSAgICB7Ci0JCSAgICAgIGluZHggPSBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLQkJICAgICAgaWYgKGluZHggPiAwCi0JCQkgICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCXsKLQkJCSAgLyogV2UgbG9vayBmb3J3YXJkIHRocm91Z2ggdGhlIHN5bWJvbCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHN5bWJvbCB3ZSBhcmUgZ29pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5jbHVkZS4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZWx5IHJpZ2h0LiAgKi8KLQkJCSAgd2hpbGUgKGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XSA8IDAKLQkJCQkgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJICAgICsraW5keDsKLQkJCSAgaWYgKGluZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQkgICAgaW5keCA9IG91dHB1dF9pbmRleDsKLQkJCSAgZWxzZQotCQkJICAgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCQkgIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gaW5keDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGluZHggPSBhdXgueF9zeW0ueF90YWduZHgubDsKLQkJICBpZiAoaW5keCA+IDAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkgICAgewotCQkgICAgICBsb25nIHN5bWluZHg7Ci0KLQkJICAgICAgc3ltaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJICAgICAgaWYgKHN5bWluZHggPCAwKQotCQkJYXV4Lnhfc3ltLnhfdGFnbmR4LmwgPSAwOwotCQkgICAgICBlbHNlCi0JCQlhdXgueF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENvcHkgb3ZlciB0aGUgbGluZSBudW1iZXJzLCB1bmxlc3Mgd2UgYXJlIHN0cmlwcGluZwotCQkgdGhlbS4gIFdlIGRvIHRoaXMgb24gYSBzeW1ib2wgYnkgc3ltYm9sIGJhc2lzIGluCi0JCSBvcmRlciB0byBtb3JlIGVhc2lseSBoYW5kbGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0VYVAotCQkgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19ISURFWFQpCi0JCSAgJiYgaSA9PSAwCi0JCSAgJiYgaXN5bXAtPm5fbnVtYXV4ID4gMQotCQkgICYmIElTRkNOIChpc3ltcC0+bl90eXBlKQotCQkgICYmIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgIT0gMCkKLQkJewotCQkgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfbm9uZQotCQkgICAgICAmJiBmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfc29tZSkKLQkJICAgIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPSAwOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQkJICAgICAgdW5zaWduZWQgaW50IGVuY19jb3VudDsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBsaW5vZmY7Ci0JCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gbGluOwotCi0JCSAgICAgIG8gPSAqY3NlY3RwcDsKLQkJICAgICAgZW5jbG9zaW5nID0geGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+ZW5jbG9zaW5nOwotCQkgICAgICBlbmNfY291bnQgPSB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5saW5lbm9fY291bnQ7Ci0JCSAgICAgIGlmIChvbGluZSAhPSBlbmNsb3NpbmcpCi0JCQl7Ci0JCQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLAotCQkJCQllbmNsb3NpbmctPmxpbmVfZmlsZXBvcywKLQkJCQkJU0VFS19TRVQpICE9IDAKLQkJCSAgICAgIHx8IChiZmRfcmVhZCAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwKLQkJCQkJICAgIGVuY19jb3VudCwgaW5wdXRfYmZkKQotCQkJCSAgIT0gbGluZXN6ICogZW5jX2NvdW50KSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIG9saW5lID0gZW5jbG9zaW5nOwotCQkJfQotCi0JCSAgICAgIGxpbm9mZiA9IChhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyCi0JCQkJLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyk7Ci0KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwKLQkJCQkJICAgICAgIChQVFIpIChmaW5mby0+bGluZW5vcyArIGxpbm9mZiksCi0JCQkJCSAgICAgICAoUFRSKSAmbGluKTsKLQkJICAgICAgaWYgKGxpbi5sX2xubm8gIT0gMAotCQkJICB8fCAoKGJmZF9zaXplX3R5cGUpIGxpbi5sX2FkZHIubF9zeW1uZHgKLQkJCSAgICAgICE9ICgoZXN5bQotCQkJCSAgIC0gaXN5bWVzegotCQkJCSAgIC0gKChiZmRfYnl0ZSAqKQotCQkJCSAgICAgIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpKQotCQkJCSAgLyBpc3ltZXN6KSkpCi0JCQlhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gMDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBiZmRfYnl0ZSAqbGlucGVuZCwgKmxpbnA7Ci0JCQkgIGJmZF92bWEgb2Zmc2V0OwotCQkJICBiZmRfc2l6ZV90eXBlIGNvdW50OwotCi0JCQkgIGxpbi5sX2FkZHIubF9zeW1uZHggPSAqaW5kZXhwOwotCQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsIChQVFIpICZsaW4sCi0JCQkJCQkgICAgKFBUUikgKGZpbmZvLT5saW5lbm9zCi0JCQkJCQkJICAgKyBsaW5vZmYpKTsKLQotCQkJICBsaW5wZW5kID0gKGZpbmZvLT5saW5lbm9zCi0JCQkJICAgICArIGVuY19jb3VudCAqIGxpbmVzeik7Ci0JCQkgIG9mZnNldCA9IChvLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICsgby0+b3V0cHV0X29mZnNldAotCQkJCSAgICAtIG8tPnZtYSk7Ci0JCQkgIGZvciAobGlucCA9IGZpbmZvLT5saW5lbm9zICsgbGlub2ZmICsgbGluZXN6OwotCQkJICAgICAgIGxpbnAgPCBsaW5wZW5kOwotCQkJICAgICAgIGxpbnAgKz0gbGluZXN6KQotCQkJICAgIHsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChpbnB1dF9iZmQsIChQVFIpIGxpbnAsCi0JCQkJCQkgICAgICAgKFBUUikgJmxpbik7Ci0JCQkgICAgICBpZiAobGluLmxfbG5ubyA9PSAwKQotCQkJCWJyZWFrOwotCQkJICAgICAgbGluLmxfYWRkci5sX3BhZGRyICs9IG9mZnNldDsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAob3V0cHV0X2JmZCwKLQkJCQkJCQkoUFRSKSAmbGluLAotCQkJCQkJCShQVFIpIGxpbnApOwotCQkJICAgIH0KLQotCQkJICBjb3VudCA9IChsaW5wIC0gKGZpbmZvLT5saW5lbm9zICsgbGlub2ZmKSkgLyBsaW5lc3o7Ci0KLQkJCSAgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9Ci0JCQkgICAgKG8tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJCSAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKLQotCQkJICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkJCWF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsCi0JCQkJCVNFRUtfU0VUKSAhPSAwCi0JCQkgICAgICB8fCAoYmZkX3dyaXRlIChmaW5mby0+bGluZW5vcyArIGxpbm9mZiwKLQkJCQkJICAgICBsaW5lc3osIGNvdW50LCBvdXRwdXRfYmZkKQotCQkJCSAgIT0gbGluZXN6ICogY291bnQpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkJICBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICs9IGNvdW50OwotCi0JCQkgIGlmIChpbmNscyA+IDApCi0JCQkgICAgewotCQkJICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaWlzcCwgKmlpc3BlbmQ7Ci0JCQkgICAgICBsb25nICppaW5kcDsKLQkJCSAgICAgIGJmZF9ieXRlICpvb3M7Ci0JCQkgICAgICBpbnQgaWlhZGQ7Ci0KLQkJCSAgICAgIC8qIFVwZGF0ZSBhbnkgQ19CSU5DTCBvciBDX0VJTkNMIHN5bWJvbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVmZXIgdG8gYSBsaW5lIG51bWJlciBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIHdlIGp1c3Qgb3V0cHV0LiAgKi8KLQkJCSAgICAgIGlpc3AgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLQkJCSAgICAgIGlpc3BlbmQgPSAoaWlzcAotCQkJCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSk7Ci0JCQkgICAgICBpaW5kcCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLQkJCSAgICAgIG9vcyA9IGZpbmZvLT5vdXRzeW1zOwotCQkJICAgICAgd2hpbGUgKGlpc3AgPCBpaXNwZW5kKQotCQkJCXsKLQkJCQkgIGlmICgqaWluZHAgPj0gMAotCQkJCSAgICAgICYmIChpaXNwLT5uX3NjbGFzcyA9PSBDX0JJTkNMCi0JCQkJCSAgfHwgaWlzcC0+bl9zY2xhc3MgPT0gQ19FSU5DTCkKLQkJCQkgICAgICAmJiAoKGJmZF9zaXplX3R5cGUpIGlpc3AtPm5fdmFsdWUKLQkJCQkJICA+PSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyArIGxpbm9mZikKLQkJCQkgICAgICAmJiAoKGJmZF9zaXplX3R5cGUpIGlpc3AtPm5fdmFsdWUKLQkJCQkJICA8IChlbmNsb3NpbmctPmxpbmVfZmlsZXBvcwotCQkJCQkgICAgICsgZW5jX2NvdW50ICogbGluZXN6KSkpCi0JCQkJICAgIHsKLQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlpczsKLQotCQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLAotCQkJCQkJCSAgICAoUFRSKSBvb3MsCi0JCQkJCQkJICAgIChQVFIpICZpaXMpOwotCQkJCSAgICAgIGlpcy5uX3ZhbHVlID0KLQkJCQkJKGlpc3AtPm5fdmFsdWUKLQkJCQkJIC0gZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MKLQkJCQkJIC0gbGlub2ZmCi0JCQkJCSArIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpOwotCQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwKLQkJCQkJCQkgICAgIChQVFIpICZpaXMsCi0JCQkJCQkJICAgICAoUFRSKSBvb3MpOwotCQkJCSAgICAgIC0taW5jbHM7Ci0JCQkJICAgIH0KLQotCQkJCSAgaWlhZGQgPSAxICsgaWlzcC0+bl9udW1hdXg7Ci0JCQkJICBpZiAoKmlpbmRwID49IDApCi0JCQkJICAgIG9vcyArPSBpaWFkZCAqIG9zeW1lc3o7Ci0JCQkJICBpaXNwICs9IGlpYWRkOwotCQkJCSAgaWluZHAgKz0gaWlhZGQ7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBpc3ltcC0+bl90eXBlLAotCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJICAgICAoUFRSKSBvdXRzeW0pOwotCSAgICAgIG91dHN5bSArPSBvc3ltZXN6OwotCSAgICAgIGVzeW0gKz0gaXN5bWVzejsKLQkgICAgfQotCX0KLQotICAgICAgaW5kZXhwICs9IGFkZDsKLSAgICAgIGlzeW1wICs9IGFkZDsKLSAgICAgIGNzZWN0cHAgKz0gYWRkOwotICAgIH0KLQotICAvKiBJZiB3ZSBzd2FwcGVkIG91dCBhIENfRklMRSBzeW1ib2wsIGd1ZXNzIHRoYXQgdGhlIG5leHQgQ19GSUxFCi0gICAgIHN5bWJvbCB3aWxsIGJlIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG5leHQgaW5wdXQgZmlsZS4gIEluIHRoZQotICAgICBub3JtYWwgY2FzZSwgdGhpcyB3aWxsIHNhdmUgdXMgZnJvbSB3cml0aW5nIG91dCB0aGUgQ19GSUxFIHN5bWJvbAotICAgICBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0gICAgICAmJiAoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLSAgICB7Ci0gICAgICBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgPSBvdXRwdXRfaW5kZXg7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJICAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLSAJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4IC0gc3ltZW50X2Jhc2UpCi0gCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0gICAgfQotCi0gIC8qIFdyaXRlIHRoZSBtb2RpZmllZCBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0c3ltcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgICBvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpICsgc3ltZW50X2Jhc2UgKiBvc3ltZXN6LAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKLQkJCW91dHB1dF9iZmQpCi0JICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgQkZEX0FTU0VSVCAoKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkgICArIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBvc3ltZXN6KQotCQkgID09IG91dHB1dF9pbmRleCk7Ci0KLSAgICAgIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSA9IG91dHB1dF9pbmRleDsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgbGV0IHRoZSBsaW5rZXIgcmVsb2NhdGlvbiByb3V0aW5lcyBkaXNjYXJkIHRoZSBzeW1ib2xzLiAgKi8KLSAga2VlcF9zeW1zID0gb2JqX2NvZmZfa2VlcF9zeW1zIChpbnB1dF9iZmQpOwotICBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCkgPSB0cnVlOwotCi0gIC8qIFJlbG9jYXRlIHRoZSBjb250ZW50cyBvZiBlYWNoIHNlY3Rpb24uICAqLwotICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLQotICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JewotCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgby0+X3Jhd19zaXplID09IDAKLQkgIHx8IChvLT5mbGFncyAmIFNFQ19JTl9NRU1PUlkpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGhhdmUgc2V0IGZpbGVwb3MgY29ycmVjdGx5IGZvciB0aGUgc2VjdGlvbnMgd2UgY3JlYXRlZCB0bwotICAgICAgICAgcmVwcmVzZW50IGNzZWN0cywgc28gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIHNob3VsZCB3b3JrLiAgKi8KLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKSAhPSBOVUxMCi0JICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKS0+Y29udGVudHMgIT0gTlVMTCkKLQljb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgbywgZmluZm8tPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwgby0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgY29udGVudHMgPSBmaW5mby0+Y29udGVudHM7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGludCB0YXJnZXRfaW5kZXg7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLQkgIGJmZF92bWEgb2Zmc2V0OwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotCSAgbG9uZyByX3N5bW5keDsKLQotCSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLiAgKi8KLQkgIHRhcmdldF9pbmRleCA9IG8tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9yZWxvY3MgPSAoeGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJCSAgICAgKGlucHV0X2JmZCwgbywgZmFsc2UsIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JCQkgICAgICB0cnVlLAotCQkJICAgICAgKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkJCSAgICAgICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCkpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBDYWxsIHByb2Nlc3NvciBzcGVjaWZpYyBjb2RlIHRvIHJlbG9jYXRlIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgY29udGVudHMuICAqLwotCSAgaWYgKCEgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSAgIGlucHV0X2JmZCwgbywKLQkJCQkJICAgY29udGVudHMsCi0JCQkJCSAgIGludGVybmFsX3JlbG9jcywKLQkJCQkJICAgZmluZm8tPmludGVybmFsX3N5bXMsCi0JCQkJCSAgIHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0cykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7Ci0JICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLQkgIHJlbF9oYXNoID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCi0JCSAgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0JICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotCSAgICAgIGJvb2xlYW4gcXVpZXQ7Ci0KLQkgICAgICAqcmVsX2hhc2ggPSBOVUxMOwotCi0JICAgICAgLyogQWRqdXN0IHRoZSByZWxvYyBhZGRyZXNzIGFuZCBzeW1ib2wgaW5kZXguICAqLwotCi0JICAgICAgaXJlbC0+cl92YWRkciArPSBvZmZzZXQ7Ci0KLQkgICAgICByX3N5bW5keCA9IGlyZWwtPnJfc3ltbmR4OwotCi0JICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQotCQloID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCWggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtyX3N5bW5keF07Ci0KLQkgICAgICBpZiAocl9zeW1uZHggIT0gLTEgJiYgZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQkJewotCQkgIGlmIChoICE9IE5VTEwKLQkJICAgICAgJiYgaC0+c21jbGFzICE9IFhNQ19URAotCQkgICAgICAmJiAoaXJlbC0+cl90eXBlID09IFJfVE9DCi0JCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX0dMCi0JCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX1RDTAotCQkJICB8fCBpcmVsLT5yX3R5cGUgPT0gUl9UUkwKLQkJCSAgfHwgaXJlbC0+cl90eXBlID09IFJfVFJMQSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBUT0MgcmVsYXRpdmUgcmVsb2Mgd2l0aCBhIHN5bWJvbAotICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkLiAgVGhlIHN5bWJvbCBzaG91bGQgYmUgdGhlIG9uZSB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmVsb2MgaXMgZm9yLiAgV2Ugd2FudCB0byBtYWtlIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWxvYyBhZ2FpbnN0IHRoZSBUT0MgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCB0aGUgc3ltYm9sIGl0c2VsZi4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKGgtPnRvY19zZWN0aW9uICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKLQkJICAgICAgaWYgKGgtPnUudG9jX2luZHggIT0gLTEpCi0JCQlpcmVsLT5yX3N5bW5keCA9IGgtPnUudG9jX2luZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqbjsKLQkJCSAgc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzaTsKLQotCQkJICBuID0gKChzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoICopCi0JCQkgICAgICAgYmZkX2FsbG9jIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkJICBzaXplb2YgKHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2gpKSk7Ci0JCQkgIGlmIChuID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICBzaSA9IGZpbmZvLT5zZWN0aW9uX2luZm8gKyB0YXJnZXRfaW5kZXg7Ci0JCQkgIG4tPm5leHQgPSBzaS0+dG9jX3JlbF9oYXNoZXM7Ci0JCQkgIG4tPmggPSBoOwotCQkJICBuLT5yZWwgPSBpcmVsOwotCQkJICBzaS0+dG9jX3JlbF9oYXNoZXMgPSBuOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wuICAqLwotCQkgICAgICBpZiAoaC0+aW5keCA+PSAwKQotCQkJaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGJlaW5nIHdyaXR0ZW4gYXQgdGhlIGVuZAotCQkJICAgICBvZiB0aGUgZmlsZSwgYW5kIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUKLQkJCSAgICAgc3ltYm9sIGluZGV4LiAgV2Ugc2F2ZSB0aGUgcG9pbnRlciB0byB0aGUKLQkJCSAgICAgaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUgcmVsX2hhc2ggbGlzdC4KLQkJCSAgICAgV2Ugc2V0IHRoZSBpbmR4IGZpZWxkIHRvIC0yIHRvIGluZGljYXRlCi0JCQkgICAgIHRoYXQgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgc3RyaXBwZWQuICAqLwotCQkJICAqcmVsX2hhc2ggPSBoOwotCQkJICBoLT5pbmR4ID0gLTI7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tyX3N5bW5keF07Ci0KLQkJICAgICAgaWYgKGluZHggPT0gLTEpCi0JCQl7Ci0JCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzOwotCi0JCQkgIC8qIFJlbG9jYXRpb25zIGFnYWluc3QgYSBUQzAgVE9DIGFuY2hvciBhcmUKLQkJCSAgICAgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCB0byBiZSBhZ2FpbnN0Ci0JCQkgICAgIHRoZSBUT0MgYW5jaG9yIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCQkgIGlzID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKLQkJCSAgaWYgKGlzLT5uX3NjbGFzcyA9PSBDX0hJREVYVAotCQkJICAgICAgJiYgaXMtPm5fbnVtYXV4ID4gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBQVFIgYXV4cHRyOwotCQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCQkJICAgICAgYXV4cHRyID0gKChQVFIpCi0JCQkJCSgoKGJmZF9ieXRlICopCi0JCQkJCSAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJCQkJICsgKChyX3N5bW5keCArIGlzLT5uX251bWF1eCkKLQkJCQkJICAgICogaXN5bWVzeikpKTsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIGF1eHB0ciwKLQkJCQkJCSAgICBpcy0+bl90eXBlLCBpcy0+bl9zY2xhc3MsCi0JCQkJCQkgICAgaXMtPm5fbnVtYXV4IC0gMSwKLQkJCQkJCSAgICBpcy0+bl9udW1hdXgsCi0JCQkJCQkgICAgKFBUUikgJmF1eCk7Ci0JCQkgICAgICBpZiAoU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApID09IFhUWV9TRAotCQkJCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDMCkKLQkJCQlpbmR4ID0gZmluZm8tPnRvY19zeW1pbmR4OwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBpZiAoaW5keCAhPSAtMSkKLQkJCWlyZWwtPnJfc3ltbmR4ID0gaW5keDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppczsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCQkJICAvKiBUaGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgd2UgYXJlCi0JCQkgICAgIHN0cmlwcGluZy4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGhhbmRsZQotCQkJICAgICB0aGlzIGNhc2UsIGJ1dCBJIGRvbid0IHRoaW5rIGl0J3Mgd29ydGggaXQuICAqLwotCQkJICBpcyA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zICsgcl9zeW1uZHg7Ci0KLQkJCSAgbmFtZSA9IChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLQkJCQkgIChpbnB1dF9iZmQsIGlzLCBidWYpKTsKLQkJCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCQkgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG8sCi0JCQkJICBpcmVsLT5yX3ZhZGRyKSkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBxdWlldCA9IGZhbHNlOwotCSAgICAgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCSAgaWYgKGggPT0gTlVMTAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCQkgICAgYnJlYWs7Ci0JCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJY2FzZSBSX1BPUzoKLQkJY2FzZSBSX05FRzoKLQkJY2FzZSBSX1JMOgotCQljYXNlIFJfUkxBOgotCQkgIC8qIFRoaXMgcmVsb2MgbmVlZHMgdG8gYmUgY29waWVkIGludG8gdGhlIC5sb2FkZXIKLQkJICAgICBzZWN0aW9uLiAgKi8KLQkJICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLQkJICBpZiAocl9zeW1uZHggPT0gLTEpCi0JCSAgICBsZHJlbC5sX3N5bW5keCA9IC0xOwotCQkgIGVsc2UgaWYgKGggPT0gTlVMTAotCQkJICAgfHwgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCQkgICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSkKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3NlY3RzW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCQkJc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkJICAgICAgZWxzZQotCQkJc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCi0JCSAgICAgIGlmIChzdHJjbXAgKHNlYy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJCWxkcmVsLmxfc3ltbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWMtPm5hbWUsICIuZGF0YSIpID09IDApCi0JCQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLmJzcyIpID09IDApCi0JCQlsZHJlbC5sX3N5bW5keCA9IDI7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJICAgICBzZWMtPm5hbWUpOwotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAotCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpID09IDApCi0JCQl7Ci0JCQkgIC8qIFdlIGFscmVhZHkgY2FsbGVkIHRoZSB1bmRlZmluZWRfc3ltYm9sCi0JCQkgICAgIGNhbGxiYWNrIGZvciB0aGlzIHJlbG9jYXRpb24sIGluCi0JCQkgICAgIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24uICBEb24ndAotCQkJICAgICBpc3N1ZSBhbnkgbW9yZSB3YXJuaW5ncy4gICovCi0JCQkgIHF1aWV0ID0gdHJ1ZTsKLQkJCX0KLQkJICAgICAgaWYgKGgtPmxkaW5keCA8IDAgJiYgISBxdWlldCkKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiBgJXMnIGluIGxvYWRlciByZWxvYyBidXQgbm90IGxvYWRlciBzeW0iKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGxkcmVsLmxfc3ltbmR4ID0gaC0+bGRpbmR4OwotCQkgICAgfQotCQkgIGxkcmVsLmxfcnR5cGUgPSAoaXJlbC0+cl9zaXplIDw8IDgpIHwgaXJlbC0+cl90eXBlOwotCQkgIGxkcmVsLmxfcnNlY25tID0gby0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT50ZXh0cm8KLQkJICAgICAgJiYgc3RyY21wIChvLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi50ZXh0IikgPT0gMAotCQkgICAgICAmJiAhIHF1aWV0KQotCQkgICAgewotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogbG9hZGVyIHJlbG9jIGluIHJlYWQtb25seSBzZWN0aW9uICVzIiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJCSAgICAgICBvLT5vdXRwdXRfc2VjdGlvbikpOwotCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwKLQkJCQkJZmluZm8tPmxkcmVsKTsKLQkJICBCRkRfQVNTRVJUIChzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9sZHJlbCkgPT0gTERSRUxTWik7Ci0JCSAgKytmaW5mby0+bGRyZWw7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1RPQzoKLQkJY2FzZSBSX0dMOgotCQljYXNlIFJfVENMOgotCQljYXNlIFJfVFJMOgotCQljYXNlIFJfVFJMQToKLQkJICAvKiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgVE9DCi0JCSAgICAgcmVsYXRpdmUgcmVsb2MuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICs9IG8tPnJlbG9jX2NvdW50OwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgICAgY29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJICAgICAgKG8tPl9jb29rZWRfc2l6ZSAhPSAwCi0JCQkJICAgICAgID8gby0+X2Nvb2tlZF9zaXplCi0JCQkJICAgICAgIDogby0+X3Jhd19zaXplKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCkgPSBrZWVwX3N5bXM7Ci0KLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI3VuZGVmIE5fVE1BU0sKLSN1bmRlZiBOX0JUU0hGVAotCi0vKiBXcml0ZSBvdXQgYSBub24tWENPRkYgZ2xvYmFsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sIChoLCBwKQotICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSAoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSBwOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJmZF9ieXRlICpvdXRzeW07Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIHdhcyBnYXJiYWdlIGNvbGxlY3RlZCwganVzdCBza2lwIGl0LiAgKi8KLSAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+Z2MKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgbmVlZCBhIC5sb2FkZXIgc2VjdGlvbiBlbnRyeSwgd3JpdGUgaXQgb3V0LiAgKi8KLSAgaWYgKGgtPmxkc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKLSAgICAgIGJmZCAqaW1wYmZkOwotCi0gICAgICBsZHN5bSA9IGgtPmxkc3ltOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JewotCSAgbGRzeW0tPmxfdmFsdWUgPSAwOwotCSAgbGRzeW0tPmxfc2NudW0gPSBOX1VOREVGOwotCSAgbGRzeW0tPmxfc210eXBlID0gWFRZX0VSOwotCSAgaW1wYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGxkc3ltLT5sX3ZhbHVlID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyBoLT5yb290LnUuZGVmLnZhbHVlKTsKLQkgIGxkc3ltLT5sX3NjbnVtID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgbGRzeW0tPmxfc210eXBlID0gWFRZX1NEOwotCSAgaW1wYmZkID0gc2VjLT5vd25lcjsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMCkKLQkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKLQlsZHN5bS0+bF9zbXR5cGUgfD0gTF9JTVBPUlQ7Ci0gICAgICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCi0JICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCi0JICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9FWFBPUlQpICE9IDApCi0JbGRzeW0tPmxfc210eXBlIHw9IExfRVhQT1JUOwotICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwKQotCWxkc3ltLT5sX3NtdHlwZSB8PSBMX0VOVFJZOwotCi0gICAgICBsZHN5bS0+bF9zbWNsYXMgPSBoLT5zbWNsYXM7Ci0KLSAgICAgIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JbGRzeW0tPmxfaWZpbGUgPSAwOwotICAgICAgZWxzZSBpZiAobGRzeW0tPmxfaWZpbGUgPT0gMCkKLQl7Ci0JICBpZiAoKGxkc3ltLT5sX3NtdHlwZSAmIExfSU1QT1JUKSA9PSAwKQotCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JICBlbHNlIGlmIChpbXBiZmQgPT0gTlVMTCkKLQkgICAgbGRzeW0tPmxfaWZpbGUgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoaW1wYmZkLT54dmVjID09IG91dHB1dF9iZmQtPnh2ZWMpOwotCSAgICAgIGxkc3ltLT5sX2lmaWxlID0geGNvZmZfZGF0YSAoaW1wYmZkKS0+aW1wb3J0X2ZpbGVfaWQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGxkc3ltLT5sX3Bhcm0gPSAwOwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5sZGluZHggPj0gMCk7Ci0gICAgICBCRkRfQVNTRVJUIChMRFNZTVNaID09IHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkc3ltKSk7Ci0gICAgICB4Y29mZl9zd2FwX2xkc3ltX291dCAob3V0cHV0X2JmZCwgbGRzeW0sIGZpbmZvLT5sZHN5bSArIGgtPmxkaW5keCAtIDMpOwotICAgICAgaC0+bGRzeW0gPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBuZWVkcyBnbG9iYWwgbGlua2FnZSBjb2RlLCB3cml0ZSBpdCBvdXQuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbgotCSAgPT0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5saW5rYWdlX3NlY3Rpb24pKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX3ZtYSB0b2NvZmY7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgcCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+Y29udGVudHMgKyBoLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICAvKiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIGdsb2JhbCBsaW5rYWdlIGNvZGUgbG9hZHMgYQotICAgICAgICAgc3BlY2lmaWMgVE9DIGVsZW1lbnQuICAqLwotICAgICAgdG9jb2ZmID0gKGgtPmRlc2NyaXB0b3ItPnRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaC0+ZGVzY3JpcHRvci0+dG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJLSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jKTsKLSAgICAgIGlmICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSAhPSAwKQotCXRvY29mZiArPSBoLT5kZXNjcmlwdG9yLT51LnRvY19vZmZzZXQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBYQ09GRl9HTElOS19GSVJTVCB8ICh0b2NvZmYgJiAweGZmZmYpLCBwKTsKLSAgICAgIGZvciAoaSA9IDAsIHAgKz0gNDsKLQkgICBpIDwgc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGUgLyBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZVswXTsKLQkgICBpKyssIHAgKz0gNCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB4Y29mZl9nbGlua19jb2RlW2ldLCBwKTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgY3JlYXRlZCBhIFRPQyBlbnRyeSBmb3IgdGhpcyBzeW1ib2wsIHdyaXRlIG91dCB0aGUgcmVxdWlyZWQKLSAgICAgcmVsb2NzLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnRvY3NlYzsKLSAgICAgIGFzZWN0aW9uICpvc2VjOwotICAgICAgaW50IG9pbmR4OwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpcnN5bTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBpcmF1eDsKLQotICAgICAgdG9jc2VjID0gaC0+dG9jX3NlY3Rpb247Ci0gICAgICBvc2VjID0gdG9jc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgICAgIG9pbmR4ID0gb3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgaXJlbCA9IGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbG9jcyArIG9zZWMtPnJlbG9jX2NvdW50OwotICAgICAgaXJlbC0+cl92YWRkciA9IChvc2VjLT52bWEKLQkJICAgICAgICsgdG9jc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnUudG9jX29mZnNldCk7Ci0gICAgICBpZiAoaC0+aW5keCA+PSAwKQotCWlyZWwtPnJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGVsc2UKLQl7Ci0JICBoLT5pbmR4ID0gLTI7Ci0JICBpcmVsLT5yX3N5bW5keCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQl9Ci0gICAgICBpcmVsLT5yX3R5cGUgPSBSX1BPUzsKLSAgICAgIGlyZWwtPnJfc2l6ZSA9IDMxOwotICAgICAgZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsX2hhc2hlc1tvc2VjLT5yZWxvY19jb3VudF0gPSBOVUxMOwotICAgICAgKytvc2VjLT5yZWxvY19jb3VudDsKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+bGRpbmR4ID49IDApOwotICAgICAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7Ci0gICAgICBsZHJlbC5sX3N5bW5keCA9IGgtPmxkaW5keDsKLSAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKLSAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7Ci0gICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICAgICAgKytmaW5mby0+bGRyZWw7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZW1pdCBhIHN5bWJvbCB0byBkZWZpbmUgYSBjc2VjdCB3aGljaCBob2xkcyB0aGUKLSAgICAgICAgIHJlbG9jLiAgKi8KLSAgICAgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCXsKLQkgIGlmIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpIDw9IFNZTU5NTEVOKQotCSAgICBzdHJuY3B5IChpcnN5bS5fbi5fbl9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBib29sZWFuIGhhc2g7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgaGFzaCA9IHRydWU7Ci0JICAgICAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JCWhhc2ggPSBmYWxzZTsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgaGFzaCwgZmFsc2UpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlyc3ltLl9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICAgICBpcnN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCSAgICB9Ci0KLQkgIGlyc3ltLm5fdmFsdWUgPSBpcmVsLT5yX3ZhZGRyOwotCSAgaXJzeW0ubl9zY251bSA9IG9zZWMtPnRhcmdldF9pbmRleDsKLQkgIGlyc3ltLm5fc2NsYXNzID0gQ19ISURFWFQ7Ci0JICBpcnN5bS5uX3R5cGUgPSBUX05VTEw7Ci0JICBpcnN5bS5uX251bWF1eCA9IDE7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlyc3ltLCAoUFRSKSBvdXRzeW0pOwotCSAgb3V0c3ltICs9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLQkgIG1lbXNldCAoJmlyYXV4LCAwLCBzaXplb2YgaXJhdXgpOwotCSAgaXJhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX1NEOwotCSAgaXJhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gNDsKLQkgIGlyYXV4LnhfY3NlY3QueF9zbWNsYXMgPSBYTUNfVEM7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlyYXV4LCBUX05VTEwsIENfSElERVhULAotCQkJCSAwLCAxLCAoUFRSKSBvdXRzeW0pOwotCSAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7Ci0KLQkgIGlmIChoLT5pbmR4ID49IDApCi0JICAgIHsKLQkgICAgICAvKiBXZSBhcmVuJ3QgZ29pbmcgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzIGJlbG93LCBzbyB3ZQotCQkgbmVlZCB0byB3cml0ZSB0aGVtIG91dCBub3cuICAqLwotCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJICAgICArIChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKLQkJCQkqIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCkpKSwKLQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKLQkJCQkgb3V0cHV0X2JmZCkKLQkJICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpICs9Ci0JCShvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotCi0JICAgICAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGEgc3BlY2lhbGx5IGRlZmluZWQgZnVuY3Rpb24gZGVzY3JpcHRvciwgd3JpdGUKLSAgICAgaXQgb3V0LiAgVGhlIGZpcnN0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNvZGUKLSAgICAgaXRzZWxmLCB0aGUgc2Vjb25kIHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFRPQywgYW5kIHRoZSB0aGlyZAotICAgICB3b3JkIGlzIHplcm8uICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMAotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbgotCSAgPT0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb24pKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBhc2VjdGlvbiAqb3NlYzsKLSAgICAgIGludCBvaW5keDsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGVudHJ5OwotICAgICAgYXNlY3Rpb24gKmVzZWM7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7Ci0gICAgICBhc2VjdGlvbiAqdHNlYzsKLQotICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBvaW5keCA9IG9zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIHAgPSBzZWMtPmNvbnRlbnRzICsgaC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICAgICAgaGVudHJ5ID0gaC0+ZGVzY3JpcHRvcjsKLSAgICAgIEJGRF9BU1NFUlQgKGhlbnRyeSAhPSBOVUxMCi0JCSAgJiYgKGhlbnRyeS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoZW50cnktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLSAgICAgIGVzZWMgPSBoZW50cnktPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBlc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaGVudHJ5LT5yb290LnUuZGVmLnZhbHVlKSwKLQkJICBwKTsKLQotICAgICAgaXJlbCA9IGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbG9jcyArIG9zZWMtPnJlbG9jX2NvdW50OwotICAgICAgaXJlbC0+cl92YWRkciA9IChvc2VjLT52bWEKLQkJICAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnJvb3QudS5kZWYudmFsdWUpOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSBlc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgaXJlbC0+cl90eXBlID0gUl9QT1M7Ci0gICAgICBpcmVsLT5yX3NpemUgPSAzMTsKLSAgICAgIGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbF9oYXNoZXNbb3NlYy0+cmVsb2NfY291bnRdID0gTlVMTDsKLSAgICAgICsrb3NlYy0+cmVsb2NfY291bnQ7Ci0KLSAgICAgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotICAgICAgaWYgKHN0cmNtcCAoZXNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIudGV4dCIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChlc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLmJzcyIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAyOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkgICAgIGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKLSAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7Ci0gICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICAgICAgKytmaW5mby0+bGRyZWw7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2MsIHAgKyA0KTsKLQotICAgICAgdHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAob3V0cHV0X2JmZCwKLQkJCQkJICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+c250b2MpOwotCi0gICAgICArK2lyZWw7Ci0gICAgICBpcmVsLT5yX3ZhZGRyID0gKG9zZWMtPnZtYQotCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyA0KTsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gdHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGlyZWwtPnJfdHlwZSA9IFJfUE9TOwotICAgICAgaXJlbC0+cl9zaXplID0gMzE7Ci0gICAgICBmaW5mby0+c2VjdGlvbl9pbmZvW29pbmR4XS5yZWxfaGFzaGVzW29zZWMtPnJlbG9jX2NvdW50XSA9IE5VTEw7Ci0gICAgICArK29zZWMtPnJlbG9jX2NvdW50OwotCi0gICAgICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLSAgICAgIGlmIChzdHJjbXAgKHRzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIuZGF0YSIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wICh0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5ic3MiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMjsKLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksCi0JICAgICB0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBsZHJlbC5sX3J0eXBlID0gKDMxIDw8IDgpIHwgUl9QT1M7Ci0gICAgICBsZHJlbC5sX3JzZWNubSA9IG9pbmR4OwotICAgICAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKLSAgICAgICsrZmluZm8tPmxkcmVsOwotICAgIH0KLQotICBpZiAoaC0+aW5keCA+PSAwIHx8IGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaC0+aW5keCAhPSAtMgotICAgICAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKQotCQkgID09IE5VTEwpKSkpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaC0+aW5keCAhPSAtMgotICAgICAgJiYgKGgtPmZsYWdzICYgKFhDT0ZGX1JFRl9SRUdVTEFSIHwgWENPRkZfREVGX1JFR1VMQVIpKSA9PSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKG91dHN5bSA9PSBmaW5mby0+b3V0c3ltcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbWVtc2V0ICgmYXV4LCAwLCBzaXplb2YgYXV4KTsKLQotICBoLT5pbmR4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotCi0gIGlmIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpIDw9IFNZTU5NTEVOKQotICAgIHN0cm5jcHkgKGlzeW0uX24uX25fbmFtZSwgaC0+cm9vdC5yb290LnN0cmluZywgU1lNTk1MRU4pOwotICBlbHNlCi0gICAgewotICAgICAgYm9vbGVhbiBoYXNoOwotICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0gICAgICBoYXNoID0gdHJ1ZTsKLSAgICAgIGlmICgob3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotCWhhc2ggPSBmYWxzZTsKLSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGhhc2gsCi0JCQkJIGZhbHNlKTsKLSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpc3ltLl9uLl9uX24uX25femVyb2VzID0gMDsKLSAgICAgIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9FUjsKLSAgICB9Ci0gIGVsc2UgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgJiYgaC0+c21jbGFzID09IFhNQ19YTykKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3QudS5kZWYuc2VjdGlvbikpOwotICAgICAgaXN5bS5uX3ZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIGlzeW0ubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX0VSOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0ICpsOwotCi0gICAgICBpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19ISURFWFQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX1NEOwotCi0gICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfSEFTX1NJWkUpICE9IDApCi0JewotCSAgZm9yIChsID0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5zaXplX2xpc3Q7Ci0JICAgICAgIGwgIT0gTlVMTDsKLQkgICAgICAgbCA9IGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAobC0+aCA9PSBoKQotCQl7Ci0JCSAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9IGwtPnNpemU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICB7Ci0gICAgICBpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaXN5bS5uX3NjbnVtID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfQ007Ci0gICAgICBhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBpc3ltLm5fdHlwZSA9IFRfTlVMTDsKLSAgaXN5bS5uX251bWF1eCA9IDE7Ci0KLSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLSAgb3V0c3ltICs9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgYXV4LnhfY3NlY3QueF9zbWNsYXMgPSBoLT5zbWNsYXM7Ci0KLSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBUX05VTEwsIGlzeW0ubl9zY2xhc3MsIDAsIDEsCi0JCQkgKFBUUikgb3V0c3ltKTsKLSAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIGgtPnNtY2xhcyAhPSBYTUNfWE8pCi0gICAgewotICAgICAgLyogV2UganVzdCBvdXRwdXQgYW4gU0Qgc3ltYm9sLiAgTm93IG91dHB1dCBhbiBMRCBzeW1ib2wuICAqLwotCi0gICAgICBoLT5pbmR4ICs9IDI7Ci0KLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sIChQVFIpIG91dHN5bSk7Ci0gICAgICBvdXRzeW0gKz0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9MRDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmF1eCwgVF9OVUxMLCBDX0VYVCwgMCwgMSwKLQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLSAgICAgIG91dHN5bSArPSBiZmRfY29mZl9hdXhlc3ogKG91dHB1dF9iZmQpOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCSArIChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKLQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKSkpLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zLCAxLCBvdXRwdXRfYmZkKQotCSAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpICs9Ci0gICAgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSAvIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBmaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYXNlY3Rpb24gKmhzZWM7Ci0gIGJmZF92bWEgaHZhbDsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKLSAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBzb21laG93IGxvY2F0ZSBhIHN5bWJvbCBpbiB0aGUgcmlnaHQgc2VjdGlvbi4gIFRoZQotICAgICAgICAgc3ltYm9sIG11c3QgZWl0aGVyIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvLCBvciB3ZSBtdXN0IGFkanVzdAotICAgICAgICAgdGhlIGFkZGVuZCBieSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEZJWE1FOiBXcml0ZSB0aGlzCi0gICAgICAgICB3aGVuIHdlIG5lZWQgaXQuICBUaGUgb2xkIGxpbmtlciBjb3VsZG4ndCBoYW5kbGUgdGhpcyBhbnlob3cuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKGhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkgICAgIChmaW5mby0+aW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkgICAgICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICB7Ci0gICAgICBoc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLSAgICAgIGh2YWwgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGh2YWwgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhzZWMgPSBOVUxMOwotICAgICAgaHZhbCA9IDA7Ci0gICAgfQotCi0gIGFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOwotICBpZiAoaHNlYyAhPSBOVUxMKQotICAgIGFkZGVuZCArPSAoaHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBodmFsKTsKLQotICBpZiAoYWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLCBhZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoZmluZm8tPmluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkgIGhvd3RvLT5uYW1lLCBhZGRlbmQsIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCSAgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSByZWxvYyBpbmZvcm1hdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuICBJdCB3aWxsIGdldAotICAgICBzd2FwcGVkIGFuZCB3cml0dGVuIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUuICAqLwotCi0gIGlyZWwgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLSAgcmVsX2hhc2hfcHRyID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcwotCQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQotICBtZW1zZXQgKGlyZWwsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7Ci0gICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotCi0gIGlyZWwtPnJfdmFkZHIgPSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgbGlua19vcmRlci0+b2Zmc2V0OwotCi0gIGlmIChoLT5pbmR4ID49IDApCi0gICAgaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotICBlbHNlCi0gICAgewotICAgICAgLyogU2V0IHRoZSBpbmRleCB0byAtMiB0byBmb3JjZSB0aGlzIHN5bWJvbCB0byBnZXQgd3JpdHRlbiBvdXQuICAqLwotICAgICAgaC0+aW5keCA9IC0yOwotICAgICAgKnJlbF9oYXNoX3B0ciA9IGg7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IDA7Ci0gICAgfQotCi0gIGlyZWwtPnJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBpcmVsLT5yX3NpemUgPSBob3d0by0+Yml0c2l6ZSAtIDE7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQotICAgIGlyZWwtPnJfc2l6ZSB8PSAweDgwOwotCi0gICsrb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIC8qIE5vdyBvdXRwdXQgdGhlIHJlbG9jIHRvIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLwotCi0gIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotCi0gIGlmIChoc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLQotICAgICAgc2VjbmFtZSA9IGhzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lOwotCi0gICAgICBpZiAoc3RyY21wIChzZWNuYW1lLCAiLnRleHQiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjbmFtZSwgIi5kYXRhIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHNlY25hbWUsICIuYnNzIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDI7Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogbG9hZGVyIHJlbG9jIGluIHVucmVjb2duaXplZCBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLCBzZWNuYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaC0+bGRpbmR4IDwgMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBgJXMnIGluIGxvYWRlciByZWxvYyBidXQgbm90IGxvYWRlciBzeW0iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAotCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBsZHJlbC5sX3N5bW5keCA9IGgtPmxkaW5keDsKLSAgICB9Ci0KLSAgbGRyZWwubF9ydHlwZSA9IChpcmVsLT5yX3NpemUgPDwgOCkgfCBpcmVsLT5yX3R5cGU7Ci0gIGxkcmVsLmxfcnNlY25tID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKLSAgKytmaW5mby0+bGRyZWw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNvcnQgcmVsb2NzIGJ5IFZNQS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCi0KLXN0YXRpYyBpbnQKLXhjb2ZmX3NvcnRfcmVsb2NzIChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnIxID0gKGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBwMTsKLSAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICpyMiA9IChjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgcDI7Ci0KLSAgaWYgKHIxLT5yX3ZhZGRyID4gcjItPnJfdmFkZHIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKHIxLT5yX3ZhZGRyIDwgcjItPnJfdmFkZHIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBSUy82MDAwL1BPV0VSL1Bvd2VyUEMuCi0gICBUaGlzIGlzIGN1cnJlbnRseSB0aGUgb25seSBwcm9jZXNzb3Igd2hpY2ggdXNlcyBYQ09GRjsgSSBob3BlIHRoYXQKLSAgIHdpbGwgbmV2ZXIgY2hhbmdlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAotCQkJCSBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0KLSAgICAgIC8qIFJlbG9jYXRpb24gdHlwZSBSX1JFRiBpcyBhIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlIHdoaWNoIGlzCi0gICAgICAgICBtZXJlbHkgdXNlZCB0byBwcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbiBmcm9tIG9jY3VycmluZyBmb3IKLSAgICAgICAgIHRoZSBjc2VjdCBpbmNsdWRpbmcgdGhlIHN5bWJvbCB3aGljaCBpdCByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1JFRikKLQljb250aW51ZTsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JICBhZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCSAgYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0JfQotCi0gICAgICAvKiBXZSBidWlsZCB0aGUgaG93dG8gaW5mb3JtYXRpb24gb24gdGhlIGZseS4gICovCi0KLSAgICAgIGhvd3RvLnR5cGUgPSByZWwtPnJfdHlwZTsKLSAgICAgIGhvd3RvLnJpZ2h0c2hpZnQgPSAwOwotICAgICAgaG93dG8uc2l6ZSA9IDI7Ci0gICAgICBob3d0by5iaXRzaXplID0gKHJlbC0+cl9zaXplICYgMHgxZikgKyAxOwotICAgICAgaG93dG8ucGNfcmVsYXRpdmUgPSBmYWxzZTsKLSAgICAgIGhvd3RvLmJpdHBvcyA9IDA7Ci0gICAgICBpZiAoKHJlbC0+cl9zaXplICYgMHg4MCkgIT0gMCkKLQlob3d0by5jb21wbGFpbl9vbl9vdmVyZmxvdyA9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDsKLSAgICAgIGVsc2UKLQlob3d0by5jb21wbGFpbl9vbl9vdmVyZmxvdyA9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOwotICAgICAgaG93dG8uc3BlY2lhbF9mdW5jdGlvbiA9IE5VTEw7Ci0gICAgICBob3d0by5uYW1lID0gImludGVybmFsIjsKLSAgICAgIGhvd3RvLnBhcnRpYWxfaW5wbGFjZSA9IHRydWU7Ci0gICAgICBpZiAoaG93dG8uYml0c2l6ZSA9PSAzMikKLQlob3d0by5zcmNfbWFzayA9IGhvd3RvLmRzdF9tYXNrID0gMHhmZmZmZmZmZjsKLSAgICAgIGVsc2UKLQl7Ci0JICBob3d0by5zcmNfbWFzayA9IGhvd3RvLmRzdF9tYXNrID0gKDEgPDwgaG93dG8uYml0c2l6ZSkgLSAxOwotCSAgaWYgKGhvd3RvLmJpdHNpemUgPT0gMTYpCi0JICAgIGhvd3RvLnNpemUgPSAxOwotCX0KLSAgICAgIGhvd3RvLnBjcmVsX29mZnNldCA9IGZhbHNlOwotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgLyogSGFjayB0byBtYWtlIHN1cmUgd2UgdXNlIHRoZSByaWdodCBUT0MgYW5jaG9yIHZhbHVlCi0gICAgICAgICAgICAgICAgIGlmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCB0aGUgVE9DIGFuY2hvci4gICovCi0JICAgICAgaWYgKHNlYy0+bmFtZVszXSA9PSAnMCcKLQkJICAmJiBzdHJjbXAgKHNlYy0+bmFtZSwgIi50YzAiKSA9PSAwKQotCQl2YWwgPSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jOwotCSAgICAgIGVsc2UKLQkJdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgICAtIHNlYy0+dm1hKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIEV2ZXJ5IHN5bWJvbCBpbiBhIHNoYXJlZCBvYmplY3QgaXMgZGVmaW5lZCBzb21ld2hlcmUuICAqLwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwgdHJ1ZSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBEb24ndCB0cnkgdG8gcHJvY2VzcyB0aGUgcmVsb2MuICBJdCBjYW4ndCBoZWxwLCBhbmQKLSAgICAgICAgICAgICAgICAgaXQgbWF5IGdlbmVyYXRlIGFub3RoZXIgZXJyb3IuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJIHRvb2sgdGhlIHJlbG9jYXRpb24gdHlwZSBkZWZpbml0aW9ucyBmcm9tIHR3byBkb2N1bWVudHM6Ci0JIHRoZSBQb3dlclBDIEFJWCBWZXJzaW9uIDQgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgRmlyc3QKLQkgRWRpdGlvbiAoQXByaWwgMTk5MiksIGFuZCB0aGUgUG93ZXJPcGVuIEFCSSwgQmlnLUVuZGlhbgotCSAzMi1CaXQgSGFyZHdhcmUgSW1wbGVtZW50YXRpb24gKEp1bmUgMzAsIDE5OTQpLiAgRGlmZmVyZW5jZXMKLQkgYmV0d2VlbiB0aGUgZG9jdW1lbnRzIGFyZSBub3RlZCBiZWxvdy4gICovCi0KLSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JewotCWNhc2UgUl9SVEI6Ci0JY2FzZSBSX1JSVEJJOgotCWNhc2UgUl9SUlRCQToKLQkgIC8qIFRoZXNlIHJlbG9jcyBhcmUgZGVmaW5lZCBieSB0aGUgUG93ZXJQQyBBQkkgdG8gYmUKLSAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2hlcyB3aGljaCB1c2UgaGFsZiBvZiB0aGUgZGlmZmVyZW5jZQotICAgICAgICAgICAgIGJldHdlZW4gdGhlIHN5bWJvbCBhbmQgdGhlIHByb2dyYW0gY291bnRlci4gIEkgY2FuJ3QKLSAgICAgICAgICAgICBxdWl0ZSBmaWd1cmUgb3V0IHdoZW4gdGhpcyBpcyB1c2VmdWwuICBUaGVzZSByZWxvY3MgYXJlCi0gICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgdGhlIFBvd2VyT3BlbiBBQkkuICAqLwotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCAodW5zaWduZWQgaW50KSByZWwtPnJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIFJfUE9TOgotCSAgLyogU2ltcGxlIHBvc2l0aXZlIHJlbG9jYXRpb24uICAqLwotCSAgYnJlYWs7Ci0JY2FzZSBSX05FRzoKLQkgIC8qIFNpbXBsZSBuZWdhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQkgIHZhbCA9IC0gdmFsOwotCSAgYnJlYWs7Ci0JY2FzZSBSX1JFTDoKLQkgIC8qIFNpbXBsZSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQkgIGhvd3RvLnBjX3JlbGF0aXZlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgUl9UT0M6Ci0JICAvKiBUT0MgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFRoZSB2YWx1ZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gaW4KLSAgICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGlucHV0IGZpbGUgVE9DIHRvCi0gICAgICAgICAgICAgdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSB3YW50IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmluYWwKLSAgICAgICAgICAgICBUT0MgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSBoYXZlOgotCSAgICAgICAgIGlzeW0gPSBpVE9DICsgaW4KLQkJIGlpbnNuID0gaW4gKyBvCi0JCSBvc3ltID0gb1RPQyArIG9uCi0JCSBvaW5zbiA9IG9uICsgbwotCSAgICAgc28gd2UgbXVzdCBjaGFuZ2UgaW5zbiBieSBvbiAtIGluLgotCSAgICAgKi8KLQljYXNlIFJfR0w6Ci0JICAvKiBHbG9iYWwgbGlua2FnZSByZWxvY2F0aW9uLiAgVGhlIHZhbHVlIG9mIHRoaXMgcmVsb2NhdGlvbgotICAgICAgICAgICAgIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBpbiB0aGUgVE9DIHNlY3Rpb24uICAqLwotCWNhc2UgUl9UQ0w6Ci0JICAvKiBMb2NhbCBvYmplY3QgVE9DIGFkZHJlc3MuICBJIGNhbid0IGZpZ3VyZSBvdXQgdGhlCi0gICAgICAgICAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGNhc2UgUl9HTC4gICovCi0JY2FzZSBSX1RSTDoKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgQSBUT0MgcmVsYXRpdmUgbG9hZCBpbnN0cnVjdGlvbgotICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzIGluc3RydWN0aW9uLgotICAgICAgICAgICAgIEZJWE1FOiBXZSBkb24ndCBjdXJyZW50bHkgaW1wbGVtZW50IHRoaXMgb3B0aW1pemF0aW9uLiAgKi8KLQljYXNlIFJfVFJMQToKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIFRPQyByZWxhdGl2ZSBsb2FkCi0gICAgICAgICAgICAgYWRkcmVzcyBpbnN0cnVjdGlvbiB3aGljaCBtYXkgYmUgY2hhbmdlZCB0byBhIGxvYWQKLSAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEZJWE1FOiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyB0aGUgY29ycmVjdAotICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLiAgKi8KLQkgIGlmIChoICE9IE5VTEwgJiYgaC0+c21jbGFzICE9IFhNQ19URCkKLQkgICAgewotCSAgICAgIGlmIChoLT50b2Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IFRPQyByZWxvYyBhdCAweCV4IHRvIHN5bWJvbCBgJXMnIHdpdGggbm8gVE9DIGVudHJ5IiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgcmVsLT5yX3ZhZGRyLAotCQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgWENPRkZfU0VUX1RPQykgPT0gMCk7Ci0JICAgICAgdmFsID0gKGgtPnRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBoLT50b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQotCSAgdmFsID0gKCh2YWwgLSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jKQotCQkgLSAoc3ltLT5uX3ZhbHVlIC0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+dG9jKSk7Ci0JICBhZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSBSX0JBOgotCSAgLyogQWJzb2x1dGUgYnJhbmNoLiAgV2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggdGhlIGxvd2VyCi0gICAgICAgICAgICAgdHdvIGJpdHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQljYXNlIFJfQ0FJOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBjYWxsIHdoaWNoCi0gICAgICAgICAgICAgbWF5IGJlIG1vZGlmaWVkIHRvIGJlY29tZSBhIHJlbGF0aXZlIGNhbGwuICBUaGUgUG93ZXJPcGVuCi0gICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCQToKLQkgIC8qIEFic29sdXRlIGJyYW5jaCB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGEKLSAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2guICAqLwotCWNhc2UgUl9SQkFDOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQotICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGFuIGFic29sdXRlIGJyYW5jaAotICAgICAgICAgICAgIHRvIGEgc3ltYm9sLiAgVGhlIFBvd2VyT3BlbiBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMKLSAgICAgICAgICAgICByZWxvY2F0aW9uIHR5cGUuICAqLwotCWNhc2UgUl9SQlJDOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQotICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGEgcmVsYXRpdmUgYnJhbmNoLgotICAgICAgICAgICAgIFRoZSBQb3dlck9wZW4gQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JICBob3d0by5zcmNfbWFzayAmPSB+MzsKLQkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7Ci0JICBicmVhazsKLQljYXNlIFJfQlI6Ci0JICAvKiBSZWxhdGl2ZSBicmFuY2guICBXZSBkb24ndCB3YW50IHRvIG1lc3Mgd2l0aCB0aGUgbG93ZXIKLSAgICAgICAgICAgICB0d28gYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCWNhc2UgUl9DUkVMOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhIHJlbGF0aXZlIGNhbGwgd2hpY2ggbWF5Ci0gICAgICAgICAgICAgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGFuIGFic29sdXRlIGNhbGwuICBUaGUgUG93ZXJPcGVuCi0gICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCUjoKLQkgIC8qIEEgcmVsYXRpdmUgYnJhbmNoIHdoaWNoIG1heSBiZSBtb2RpZmllZCB0byBiZWNvbWUgYW4KLSAgICAgICAgICAgICBhYnNvbHV0ZSBicmFuY2guICBGSVhNRTogV2UgZG9uJ3QgaW1wbGVtZW50IHRoaXMsCi0gICAgICAgICAgICAgYWx0aG91Z2ggd2Ugc2hvdWxkIGZvciBzeW1ib2xzIG9mIHN0b3JhZ2UgbWFwcGluZyBjbGFzcwotICAgICAgICAgICAgIFhNQ19YTy4gICovCi0JICBob3d0by5wY19yZWxhdGl2ZSA9IHRydWU7Ci0JICBob3d0by5zcmNfbWFzayAmPSB+MzsKLQkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7Ci0JICBicmVhazsKLQljYXNlIFJfUkw6Ci0JICAvKiBUaGUgUG93ZXJQQyBBSVggQUJJIGRlc2NyaWJlcyB0aGlzIGFzIGEgbG9hZCB3aGljaCBtYXkgYmUKLSAgICAgICAgICAgICBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzLiAgVGhlIFBvd2VyT3BlbiBBQkkgc2F5cyB0aGlzCi0gICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgY2FzZSBSX1BPUy4gICovCi0JICBicmVhazsKLQljYXNlIFJfUkxBOgotCSAgLyogVGhlIFBvd2VyUEMgQUlYIEFCSSBkZXNjcmliZXMgdGhpcyBhcyBhIGxvYWQgYWRkcmVzcwotICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZC4gIFRoZSBQb3dlck9wZW4gQUJJIHNheXMKLSAgICAgICAgICAgICB0aGlzIGlzIHRoZSBzYW1lIGFzIFJfUE9TLiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSWYgd2Ugc2VlIGFuIFJfQlIgb3IgUl9SQlIgcmVsb2Mgd2hpY2ggaXMganVtcGluZyB0byBnbG9iYWwKLSAgICAgICAgIGxpbmthZ2UgY29kZSwgYW5kIGl0IGlzIGZvbGxvd2VkIGJ5IGFuIGFwcHJvcHJpYXRlIGNyb3Igbm9wCi0gICAgICAgICBpbnN0cnVjdGlvbiwgd2UgcmVwbGFjZSB0aGUgY3JvciB3aXRoIGx3eiByMiwyMChyMSkuICBUaGlzCi0gICAgICAgICByZXN0b3JlcyB0aGUgVE9DIGFmdGVyIHRoZSBnbGluayBjb2RlLiAgQ29udHJhcml3aXNlLCBpZiB0aGUKLSAgICAgICAgIGNhbGwgaXMgZm9sbG93ZWQgYnkgYSBsd3ogcjIsMjAocjEpLCBidXQgdGhlIGNhbGwgaXMgbm90Ci0gICAgICAgICBnb2luZyB0byBnbG9iYWwgbGlua2FnZSBjb2RlLCB3ZSBjYW4gcmVwbGFjZSB0aGUgbG9hZCB3aXRoIGEKLSAgICAgICAgIGNyb3IuICAqLwotICAgICAgaWYgKChyZWwtPnJfdHlwZSA9PSBSX0JSIHx8IHJlbC0+cl90eXBlID09IFJfUkJSKQotCSAgJiYgaCAhPSBOVUxMCi0JICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hICsgOAotCSAgICAgIDw9IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkpCi0JewotCSAgYmZkX2J5dGUgKnBuZXh0OwotCSAgdW5zaWduZWQgbG9uZyBuZXh0OwotCi0JICBwbmV4dCA9IGNvbnRlbnRzICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkgKyA0OwotCSAgbmV4dCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgcG5leHQpOwotCi0JICAvKiBUaGUgX3B0cmdsIGZ1bmN0aW9uIGlzIG1hZ2ljLiAgSXQgaXMgdXNlZCBieSB0aGUgQUlYCi0gICAgICAgICAgICAgY29tcGlsZXIgdG8gY2FsbCBhIGZ1bmN0aW9uIHRocm91Z2ggYSBwb2ludGVyLiAgKi8KLQkgIGlmIChoLT5zbWNsYXMgPT0gWE1DX0dMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiLl9wdHJnbCIpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAobmV4dCA9PSAweDRkZWY3YjgyCQkvKiBjcm9yIDE1LDE1LDE1ICovCi0JCSAgfHwgbmV4dCA9PSAweDRmZmZmYjgyKQkvKiBjcm9yIDMxLDMxLDMxICovCi0JCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg4MDQxMDAxNCwgcG5leHQpOyAvKiBsd3ogcjEsMjAocjEpICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChuZXh0ID09IDB4ODA0MTAwMTQpCQkvKiBsd3ogcjEsMjAocjEpICovCi0JCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg0ZmZmZmI4MiwgcG5leHQpOyAvKiBjcm9yIDMxLDMxLDMxICovCi0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaW5jbHVkZXMgdGhlIHNlY3Rpb24gYWRkcmVzcy4gICovCi0gICAgICBpZiAoaG93dG8ucGNfcmVsYXRpdmUpCi0JYWRkZW5kICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKCZob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywKLQkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQl2YWwsIGFkZGVuZCk7Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICBjaGFyIGhvd3RvX25hbWVbMTBdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgc3ByaW50ZiAoaG93dG9fbmFtZSwgIjB4JTAyeCIsIHJlbC0+cl90eXBlKTsKLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG9fbmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvQ2hhbmdlTG9nIGIvYmludXRpbHMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODlhNGU4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDcyOTUgKzAsMCBAQAotMjAwMC0wMy0zMSAgSm9obiBEYXZpZCBBbmdsaW4gIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4KLQotCSogcmVhZGVsZi5jOiBJbmNsdWRlIHN5cy90eXBlcy5oIGJlZm9yZSBzeXMvc3RhdC5oIGZvciB1bHRyaXguCi0KLTIwMDAtMDMtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IENhdGNoIG91dCBvZiByYW5nZQotCXN0cmluZyBvZmZzZXRzIGluIGNvcnJ1cHQgc3RhYnMgZW50cmllcy4KLQotMjAwMC0wMy0yNyAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbT4KLQotCSogcmVhZGVsZi5jOiBJbmNsdWRlIGVsZi9hdnIuaAotCShkdW1wX3JlbG9jYXRpb25zKTogQWRkIEVNX0FWUiBjYXNlLgotCi0yMDAwLTAzLTA5ICBUaW0gV2F1Z2ggIDx0d2F1Z2hAcmVkaGF0LmNvbT4KLQotCSogc3RyaW5ncy4xOiBDb3JyZWN0ICctYnl0ZXMnIHRvICctLWJ5dGVzJy4KLQotMjAwMC0wMy0wOCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRGVwZW5kIG9uCi0JaW5zdGFsbC1iaW5QUk9HUkFNUyBmb3IgcGFyYWxsZWwgbWFrZS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotMjAwMC0wMi0yNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEJyYWQgTHVjaWVyIDxsdWNpZXJAbWF0aC5wdXJkdWUuZWR1PjoKLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBBZGQgY2FzdCB0byBtYWtlIHN1cmUKLQlhcmd1bWVudCB0byAlKiBpcyBpbnQuCi0KLTIwMDAtMDItMjUgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlndXJlLmluIChBQ19TRUFSQ0hfTElCUyk6IFBhc3MgbSwgbm90IC1sbS4KLQotMjAwMC0wMi0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgYXJtLXdpbmNlLCBtaXBzLXBlIGFuZCBzaC1wZSB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBkbGx0b29sYy46IEFkZCBzdXBwb3J0IGZvciBzaC1wZSBhbmQgbWlwcy1wZSB0YXJnZXRzLgotCSogcmVzY29mZi5jOiBBZGQgc3VwcG9ydCBmb3Igc2gtcGUgYW5kIG1pcHMtcGUgdGFyZ2V0cy4KLQotMjAwMC0wMi0yMyAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiByZWFkZWxmLmMgKGdldF9vc2FiaV9uYW1lKTogSGFuZGxlIEVMRk9TQUJJX0xJTlVYLgotCi0yMDAwLTAyLTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogUmVtb3ZlIHVzZSBvZiBFTEZfU1RfT1RIRVIuCi0KLTIwMDAtMDItMjIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBCcmFkIEx1Y2llciA8bHVjaWVyQG1hdGgucHVyZHVlLmVkdT46Ci0JKiByZWFkZWxmLmMgKHByb2Nlc3NfdmVyc2lvbl9zZWN0aW9ucyk6IEFkZCBjYXN0cyB0byBtYWtlIHN1cmUKLQlhcmd1bWVudCB0byAlKiBpcyBhbiBpbnQuCi0JKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IEFkZCBjYXN0cyB0byBtYWtlIHByaW50ZiBhcmd1bWVudHMgbWF0Y2gKLQlmb3JtYXQuCi0KLTIwMDAtMDItMjEgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogQ2hhbmdlIGBvcGInIHRvIHVuc2lnbmVkLgotCShmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcyk6IFNhbWUgaGVyZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IEFuZCBoZXJlLiAgQ2hhbmdlIGBhZGRyX29mZnNldCcsCi0JYHN0b3Bfb2Zmc2V0JywgYG5leHRzdG9wX29mZnNldCcgdG8gdW5zaWduZWQgbG9uZy4KLQkoZHVtcF9kYXRhKTogQ2hhbmdlIG9wYiB0byB1bnNpZ25lZC4KLQotMjAwMC0wMi0xOCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAcmVkaGF0LmNvbT4KLQotCSogcmVzcmMuYzogUmVtb3ZlIHVubWF0Y2hlZCAjaWYgZm9yIGN5Z3dpbi4KLQotMjAwMC0wMi0xNCAgRmVybmFuZG8gTmFzc2VyICA8Zm5hc3NlckB0b3RlbS50by5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCB0aGUgY2hhbmdlIG9mIGZsYXZvciBuYW1lIGZyb20gYXRwY3Mtc3BlY2lhbAotCXRvIHNwZWNpYWwtYXRwY3MgdG8gcHJldmVudCBuYW1lIGNvbmZsaWN0IGluIGdkYi4KLQotMjAwMC0wMi0wOCAgVGltb3RoeSBXYWxsICA8dHdhbGxAcmVkaGF0LmNvbT4KLQotCSogb2JqZHVtcC5jIChzaG93X2xpbmUpOiBGaXggYnVnIHByZXZlbnRpbmcgcHJpbnRpbmcgb2YgdGhlIHZlcnkKLQlmaXJzdCBsaW5lIChsaW5lIHplcm8pIG9mIGEgZmlsZSB3aGVuIGludGVybGlzdGluZyBzb3VyY2UgYW5kCi0JYXNzZW1ibHkuICBBZGRlZCBvcHRpb24gdG8gcHJpbnQgZW50aXJlIGNvbnRleHQgZnJvbSBzdGFydCBvZiBmaWxlCi0Jd2hlbiB0aGUgZmlyc3QgbGluZSBmcm9tIHRoYXQgZmlsZSBpcyBlbmNvdW50ZXJlZC4KLQotMjAwMC0wMi0wMyAgVGltb3RoeSBXYWxsIDx0d2FsbEByZWRoYXQuY29tPgotCi0JKiBiaW51dGlscy9vYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIsIGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzLAotCXNob3dfbGluZSwgZGlzYXNzZW1ibGVfYnl0ZXMsIGRpc2Fzc2VtYmxlX2RhdGEsIGR1bXBfZGF0YSk6Ci0JZGlzdGluZ3Vpc2ggYmV0d2VlbiBvY3RldHMgYW5kIGJ5dGVzLgotCQotMjAwMC0wMS0yNyAgVGhvbWFzIGRlIExlbGxpcyAgPHRkZWxAd2luZHJpdmVyLmNvbT4KLQotICAgICAgICAqIG5tLmMgKHByaW50X3N5bWJvbF9pbmZvX2JzZCk6IFVzZSBiZmRfaXNfdW5kZWZpbmVkX3N5bWNsYXNzIHRvCi0JY2hlY2sgdG8gdW5yZXNvbHZlZCBzeW1ib2xzLgotICAgICAgICAocHJpbnRfc3ltYm9sX2luZm9fc3lzdik6ICBEaXR0by4KLSAgICAgICAgKHByaW50X3N5bWJvbF9pbmZvX3Bvc2l4KTogIERpdHRvLgotCi0gICAgICAgICogYmludXRpbHMudGV4aTogRG9jdW1lbnQgbmV3ICdWJyBzeW1jbGFzcyBmbGFnIGZvciBubS4KLQotMjAwMC0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAcmVkaGF0LmNvbT4KLQotCSogYmludXRpbHMudGV4aSAob2JqZHVtcCk6IERvY3VtZW50IG5ldyBBUk0gc3BlY2lmaWMKLQlkaXNhc3NlbWJsZXIgb3B0aW9ucy4KLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IENhbGwgZGlzYXNzZW1ibGVyX3VzYWdlKCkuCi0KLTIwMDAtMDEtMjcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogcmVhZGVsZi5jIChnZXRfZHluYW1pY19mbGFncyk6IFJldHVybiBidWZmLgotCShwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IERvbid0IHBhc3MgZXJyb3Igc3RyaW5ncyB0byBwcmludGYKLQlhcyBmb3JtYXQgYXJnLgotCShyZWFkX2FuZF9kaXNwbGF5X2F0dHIpOiBVc2UgbHggYW5kIGxkIHRvIHByaW50IGxvbmdzLgotCShwcm9jZXNzX2NvcmVmaWxlX25vdGVfc2VnbWVudCk6IENhc3QgYmZkX3ZtYSB0byB1bnNpZ25lZCBsb25nCi0JYmVmb3JlIHByaW50aW5nLgotCVVwZGF0ZSBjb3B5cmlnaHQuCi0KLTIwMDAtMDEtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X29zYWJpX25hbWUpOiBSZWNvZ25pc2UgRUxGT1NBQklfQVJNLgotCi0yMDAwLTAxLTE1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRlYnVnLmMgKGRlYnVnX25hbWVfdHlwZSk6IFJldHVybiBERUJVR19UWVBFX05VTEwgcmF0aGVyIHRoYW4KLQlmYWxzZS4KLQkoZGVidWdfdGFnX3R5cGUpOiBIZXJlIHRvby4KLQkqIGllZWUuYyAoaWVlZV9idWlsdGluX3R5cGUpOiBBbmQgaGVyZS4KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfdHlwZSwgcGFyc2Vfc3RhYl9hcnJheV90eXBlKTogQW5kIGhlcmUuCi0KLTIwMDAtMDEtMTMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X21hY2hpbmVfbmFtZSk6IENoYW5nZSBFTV9TMzcwIHRvIHJldHVybiAiSUJNCi0JU3lzdGVtLzM3MCIuCi0KLTIwMDAtMDEtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X2R5bmFtaWNfdHlwZSk6IFJlbW92ZSBEVF9FTkNPRElORy4KLQotMjAwMC0wMS0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfbm90ZV90eXBlKTogRGlzcGxheSBOVF9XSU4zMlBTVEFUVVMgbm90ZXMuCi0KLTIwMDAtMDEtMDcgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiB3aW5kcmVzLmMgKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXVzZS10ZW1wLWZpbGUgYW5kIAotCS0tbm8tdXNlLXRlbXAtZmlsZSBvcHRpb25zLgotCSh1c2FnZSk6IERvY3VtZW50LgotCShtYWluKTogSGFuZGxlLgotCQotCSogd2luZHJlcy5oOiBVcGRhdGUgcmVhZF9yY19maWxlIHByb3RvdHlwZS4KLQkKLQkqIHJlc3JjLmMgKGNwcF90ZW1wX2ZpbGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpc3RyZWFtX3R5cGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjbG9zZV9waXBlKTogRGVsZXRlIGZ1bmN0aW9uLgotCShydW5fY21kKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3Blbl9pbnB1dF9zdHJlYW0pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjbG9zZV9pbnB1dF9zdHJlYW0pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsb29rX2Zvcl9kZWZhdWx0KTogSGFuZGxlIERPUyBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBVc2UgCi0Jb3Blbl9pbnB1dF9zdHJlYW0gaW5zdGVhZCBvZiBwb3Blbi4KLQkocmVhZF9yY19maWxlKTogTGlrZXdpc2UuCi0JCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCAtLXVzZS10ZW1wLWZpbGUsIC0tbm8tdXNlLXRlbXAtZmlsZQotCW9wdGlvbnMuIAotCi0yMDAwLTAxLTA0ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLSAKLQkqIGRsbHRvb2wuYyAoY3JlYXRlX2NvbXBhdF9pbXBsaWIpOiBOZXcgdmFyaWFibGUuCi0JKGdlbl9leHBfZmlsZSk6IFVzZS4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBVc2UuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLWNvbXBhdC1pbXBsaWIgb3B0aW9uLgotCSh1c2FnZSk6IEhhbmRsZS4KLQkobWFpbik6IEhhbmRsZS4KLQotCSogZGxsd3JhcC5jIChlbnVtIHRhcmdldF90eXBlKTogUmVuYW1lIE1JTkdXMzJfVEFSR0VUIHRvIE1JTkdXX1RBUkdFVC4KLQkobWFpbik6IFVzZS4gRG9uJ3QgbG9vayBmb3IgIjMyIiBpbiBjeWd3aW4gYW5kIG1pbmd3IHRhcmdldCBuYW1lcy4KLQotMjAwMC0wMS0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgbmV3LCBBUk0gc3BlY2lmaWMgZGlzYXNzZW1ibGVyCi0gICAgICAgICAgY29tbWFuZCBsaW5lIHN3aXRjaCAiLU0gZm9yY2UtdGh1bWIiLgotCi0xOTk5LTEyLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFVwZGF0ZSB3aXRoIG5ldyBjb25zdGFudHMgYWRkZWQgYnkgT2N0IDQsIDE5OTkKLQlFTEYgQUJJIGRyYWZ0LgotCShndWVzc19pc19yZWxhKTogQWRkIG5ldyBtYWNoaW5lIGNvZGVzLCBidXQgbGVhdmUKLQlyZWwgdHlwZSB1bmRldGVybWluZWQuCi0JKGdldF9tYWNoaW5lX25hbWUpOiBBZGQgbmV3IG1hY2hpbmUgY29kZXMuCi0JKGdldF9zZWN0aW9uX3R5cGVfbmFtZSk6IEFkZCBuZXcgc2VjdGlvbiB0eXBlcy4KLQkoZ2V0X2VsZl9zZWN0aW9uX2ZsYWdzKTogTmV3IGZ1bmNpdG9uOiBEZWNvZGUgc2VjdGlvbiBmbGFncy4KLQkocHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMpOiBDYWxsIGdldF9lbGZfc2VjdGlvbl9mbGFncygpIGluCi0Jb3JkZXIgdG8gZGVjb2RlIGZsYWdzIGluIHNlY3Rpb24gaGVhZGVyLgotCShnZXRfZHluYW1pY19mbGFncyk6IE5ldyBmdW5jdGlvbjogRGVjb2RlIGR5bmFtaWMgc2VjdGlvbgotCWZsYWdzLgotCShwcm9jZXNzX2R5bmFtaWNfc2VjdGlvbik6IERpc3BsYXkgZmxhZ3MgKGlmIHByZXNlbnQpLgotCShnZXRfc3ltYm9sX3R5cGUpOiBBZGQgU1RUX0NPTU1PTi4KLQkoZ2V0X3N5bWJvbF92aXNpYmlsaXR5KTogTmV3IGZ1bmN0aW9uOiBEZWNvZGUgYSBzeW1ib2wncwotCXZpc2liaWxpdHkuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogQ2FsbCBnZXRfc3ltYm9sX3Zpc2liaWxpdHkoKS4KLQkoZ2V0X25vdGVfdHlwZSk6IEFkZCBOVF9QUlhGUFJFR1MuCi0KLTE5OTktMTItMjYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBDb3JyZWN0IGhhbmRsaW5nIG9mIG51bWVyaWMgYXJndW1lbnQuCi0KLTE5OTktMTItMjMgIEFuZHJldyBIYWxleSAgPGFwaEBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG10YWJsZSk6IG1jb3JlIGhvd19qdGFiX3JvZmYgaXMgNCBieXRlcyBpbnRvIHRoZQotCWp0YWI7IHdhcyA4LgotCi0xOTk5LTEyLTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG10YWJsZSk6IFN0b3AgY29tcGlsZSB0aW1lIHdhcm5pbmdzIGFib3V0IG1pc3NpbmcKLQlpbml0aWFsaXNlcnMuCi0JKHl5ZXJyb3IpOiBTdG9wIGNvbXBpbGUgdGltZSB3YXJuaW5ncyBhYm91dCB1bnVzZWQgcGFyYW1hdGVyLgotCShJTklUX1NFQ19EQVRBKTogTmV3IG1hY3JvOiBpbml0aWFsaXNlIGFuIGVudHJ5IGluIHRoZSBzZWNkYXRhCi0JYXJyYXkuCi0JKHNlY2RhdGEpOiBTdG9wIGNjb21waWxlIHRpbWUgd2FybmluZ3MgYWJvdXQgdW5pbml0aWFsaXNlZAotCWZpZWxkcy4KLQkoZHRhYik6IFN0b3AgY29tcGlsZSB0aW1lIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXIuCi0JKGxvbmdfb3B0aW9ucyk6IFN0b3AgY29tcGlsZSB0aW1lIHdhcm5pbmcgYWJvdXQgbWlzc2luZwotCWluaXRpYWxpc2VyLiAKLQotMTk5OS0xMi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF92bWEpOiBTdXBwb3J0IG5hdGl2ZSA2NGJpdCBFTEYgc3lzdGVtcy4KLQotMTk5OS0xMi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtdGFibGUpOiBBZGQgZXBvYy1hcm0gc3BlY2lmaWMgZW50cnkuCi0JTWFrZSBkZWZhdWx0IGFybSBlbnRyeSBwYXNzIC1tcGFjcy0yNiB0byBhc3NlbWJsZXIuCi0JKGZsdXNoX3BhZ2UpOiBEbyBub3QgbWFuZ2xlIG51bGwgZW50cmllcy4KLQkKLTE5OTktMTItMDcgIEggLiBKIC4gTHUgIGhqbEB2YWxpbnV4LmNvbQotCi0JKiByZWFkZWxmLmM6IEZpeCBjb21waWxlIHRpbWUgd2FybmluZ3MuICBTdXBwb3J0IG1vcmUgdGhhbiA5OTkKLQlzeW1ib2xzLgotCi0xOTk5LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGVudW0gcHJpbnRfbW9kZSk6IE5ldyB0eXBlLgotCShwcmludF92bWEpOiBOZXcgZnVuY3Rpb24uCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBVc2UgcHJpbnRfdm1hIHRvIGRpc3BsYXkgYmZkX3ZtYSB2YWx1ZXMuCi0JKHByb2Nlc3NfZmlsZV9oZWFkZXIpOiBVc2UgcHJpbnRfdm1hIHRvIGRpc3BsYXkgYmZkX3ZtYSB2YWx1ZXMuCi0JKHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzKTogVXNlIHByaW50X3ZtYSB0byBkaXNwbGF5IGJmZF92bWEgdmFsdWVzLgotCShwcm9jZXNzX3NlY3Rpb25faGVhZGVycyk6IFVzZSBwcmludF92bWEgdG8gZGlzcGxheSBiZmRfdm1hIHZhbHVlcy4KLQkoZHluYW1pY19zZWdtZW50X3BhcmlzY192YWwpOiBVc2UgcHJpbnRfdm1hIHRvIGRpc3BsYXkgYmZkX3ZtYSB2YWx1ZXMuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogVXNlIHByaW50X3ZtYSB0byBkaXNwbGF5IGJmZF92bWEgdmFsdWVzLgotCShwcm9jZXNzX3N5bWJvbF90YWJsZSk6IFVzZSBwcmludF92bWEgdG8gZGlzcGxheSBiZmRfdm1hIHZhbHVlcy4KLQkocHJvY2Vzc19taXBzX3NwZWNpZmljKTogVXNlIHByaW50X3ZtYSB0byBkaXNwbGF5IGJmZF92bWEgdmFsdWVzLgotCi0xOTk5LTExLTI1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX25vdGUpOiBDaGFuZ2UgYXJnIGZyb20gRWxmX0V4dGVybmFsX05vdGUKLQl0byBFbGYzMl9JbnRlcm5hbF9Ob3RlLCB3aGljaCBhbHNvIHR1cm5zIHRoZSBmdW5jdGlvbiBib2R5Ci0JaW50byBsaXR0bGUgbW9yZSB0aGFuIGEgY2FsbCB0byBwcmludGYuCi0JKHByb2Nlc3NfY29yZWZpbGVfbm90ZV9zZWdtZW50KTogIFN1YnN0YW50aWFsbHkgcmV3cml0dGVuCi0JdG8gcHJvcGVybHkgaGFuZGxlIGNhc2Ugd2hlcmUgdGFyZ2V0IGFuZCBob3N0IGFyZSBkaWZmZXJlbnQKLQllbmRpYW5uZXNzLCBoYW5kbGUgbm90ZSBzZWN0aW9ucyB3aXRoIHBhZGRpbmcsIGFuZCBhZGQgc29tZQotCWNydWZ0IHRvIGhhbmRsZSBub3RlcyB3aXRoIHVudGVybWluYXRlZCBuYW1lIGRhdGEuCi0KLTE5OTktMTEtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IFJlZm9ybWF0LgotCShzdHJpcF91c2FnZSk6IFJlZm9ybWF0LgotCi0xOTk5LTExLTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogT3ZlcmhhdWwgb3V0cHV0OiAgT25lIGxpbmUgcGVyIHN3aXRjaC4KLQlUZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGVhY2ggc3dpdGNoLiAgRGlzdGluZ3Vpc2ggYmV0d2VlbgotCW9wdGlvbmFsIHN3aXRjaGVzIGFuZCByZXF1aXJlZCBzd2l0Y2hlcy4KLQkobG9uZ19vcHRpb25zKTogQWRkICdnJywgJ0cnIGFuZCAneicgc2hvcnQgb3B0aW9ucy4KLQkobWFpbik6IERpc3Rpbmd1aXNoIGJldHdlZW4gb3B0aW9uYWwgc3dpdGNoZXMgYW5kIHJlcXVpcmVkCi0Jc3dpdGNoZXMuCi0KLQkqIGJpbnV0aWxzLnRleGk6IEFkZCAtZyAtRyBhbmQgLXogc2hvcnQgb3B0aW9ucyBmb3IKLQktLWRlYnVnZ2luZywgLS1zdGFicyBhbmQgLS1kaXNhc3NlbWJsZS16ZXJvZXMuCi0KLTE5OTktMTEtMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZmx1c2hfcGFnZSk6IENsaXAgc2hvcnQgdmFsdWVzIHRvIHByZXZlbnQgd2FybmluZ3MKLQlmcm9tIHRoZSBhc3NlbWJsZXIuCi0JQ2hhbmdlIGRlZmF1bHQgbWNvcmUgbWFjaGluZSBuYW1lIHRvICdtY29yZS1sZScgYW5kIHJlbmFtZQotCWJpZy1lbmRpYW4gdmVyc2lvbiB0byAnbWNvcmUtYmUnLiAKLQotMTk5OS0xMC0yNyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9iZmQpOiBCcmVhayBpbnRvIHR3byBmdW5jdGlvbnMuICBUaGUKLQlhY3R1YWwgZHVtcGluZyBjb2RlIG1vdmVzIHRvIGR1bXBfYmZkLiAgSWYgYmZkIGlzIG5vdAotCXVuYW1iaWd1b3VzbHkgcmVjb2duaXplZCBhcyBhIGJmZF9vYmplY3QsIGF0dGVtcHQgdG8gZHVtcAotCWl0IGFzIGEgYmZkX2NvcmUuCi0JKGR1bXBfYmZkKTogTmV3IGZ1bmN0aW9uLgotCi0xOTk5LTEwLTI2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGFzc2VtYmxlX2ZpbGUpOiBSZW1vdmUgc3B1cmlvdXMgdGVzdCBvZiBleHBfbmFtZS4KLQotMTk5OS0xMC0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChzdHJ1Y3QgbWFjKTogQWRkIG5ldyBmaWVsZCAnaG93X2RlZmF1bHRfYXNfc3dpdGNoZXMnLgotCShtdGFibGUpOiBJbml0aWFsaXNlIG5ldyBmaWVsZC4gIFNvbWUgbWFjaGluZXMgaGF2ZSBhIG5vbiBlbXB0eQotCXN0cmluZyBmb3IgdGhpcyBmaWVsZC4KLQkoSE9XX0JGRF9UQVJHRVQpOiBVbmRlZmluZSBhbmQgcmVwbGFjZSB3aXRoLi4uCi0JKEhPV19CRkRfUkVBRF9UQVJHRVQpOiBOZXcgbWFjcm86IGJmZCB0YXJnZXQgdG8gdXNlIHdoZW4gb3BlbmluZyBhCi0JZmlsZSBmb3IgcmVhZGluZy4gIFRoaXMgaXMgc2V0IHRvIDAgc28gdGhhdCBhbnkgcmVjb2duaXNhYmxlIGJmZAotCWZvcm1hdCBjYW4gYmUgcmVhZC4KLQkoSE9XX0JGRF9XUklURV9UQVJHRVQpOiBOZXcgbWFjcm86IGJmZCB0YXJnZXQgdG8gdXNlIHdoZW4gb3BlbmluZwotCWEgZmlsZSBmb3Igd3JpdGluZy4gIFRoaXMgaXMgc2V0IHRvIHRoZSB0YXJnZXQgbWFjaGluZSB0eXBlLgotCShBU01fU1dJVENIRVMpOiBOZXcgbWFjcm86IGRlZmF1bHQgc3dpdGNoZXMgdG8gdXNlIHdoZW4gYXNzZW1ibGluZwotCWEgZmlsZS4KLQkoYXNzZW1ibGVfZmlsZSk6IE5ldyBmdW5jdGlvbjogQXNzZW1ibGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEKLQlkZXN0aW5hdGlvbiBvYmplY3QgZmlsZS4KLQkoZ2VuX2V4cF9maWxlKTogVXNlIGFzc2VtYmxlX2ZpbGUgdG8gY3JlYXRlIHRoZSBleHAgZmlsZS4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBVc2UgYXNzZW1ibGVfZmlsZSB0byBjcmVhdGUgdGhlIGxpYiBmaWxlLgotCU9wZW4gb3V0cHV0IGZpbGUgdXNlIEhPV19CRkRfV1JJVEVfVEFSR0VUIGFuZCBpbnB1dCBmaWxlcyB1c2luZwotCUhPV19CRkRfUkVBRF9UQVJHRVQuCi0JKG1ha2VfaGVhZCk6IFVzZSBhc3NlbWJsZV9maWxlIHRvIGNyZWF0ZSB0aGUgaGVhZCBmaWxlLgotCShtYWtlX3RhaWwpOiBVc2UgYXNzZW1ibGVfZmlsZSB0byBjcmVhdGUgdGhlIHRhaWwgZmlsZS4KLQkoZ2VuX2xpYl9maWxlKTogT3BlbiBvdXRwdXQgZmlsZSB1c2UgSE9XX0JGRF9XUklURV9UQVJHRVQuCi0KLTE5OTktMTAtMTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhci5jIChub3JtYWxpemUpOiBGaXggZnVsbF9wYXRobmFtZSBjb2RlLgotCi0xOTk5LTEwLTA4ICBCZW4gRWxsaXN0b24gIDxiamVAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGJpbnV0aWxzLnRleGk6IFNvbWUgcmV3b3JkaW5nIGFuZCBjbGFyaWZpY2F0aW9ucy4KLQotMTk5OS0wOS0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHluYW1pY19zZWdtZW50X3BhcmlzY192YWwpOiBQcmludCAwIGZvciBETERfRkxBR1MgaWYKLQl0aGUgdmFsdWUgaXMgemVyby4KLQkocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBEb24ndCBwcmludCBoaXN0b2dyYW0gaWYgaGFzaCB0YWJsZSBpcyBlbXB0eS4KLQotMTk5OS0wOS0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3BhcmlzY19keW5hbWljX3R5cGUpOiBIYW5kbGUgRFRfSFBfR1NUXyogdmFsdWVzLgotCi0xOTk5LTA5LTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfc3ltYm9sX3R5cGUpOiBBZGQgc3VwcG9ydCBmb3IgSFBVWCBhbmQgUEFSSVNDCi0Jc3BlY2lmaWMgc3ltYm9sIHR5cGVzLgotCi0JKiByZWFkZWxmLmM6IEFkZCBIUFVYIGFuZCBQQVJJU0MgZXh0ZW5zaW9ucyB0byBkeW5hbWljIGFuZCBwcm9ncmFtCi0JaGVhZGVyIHRhYmxlIHByaW50aW5nLgotCi0JKiByZWFkZWxmLmMgKGdldF9tYWNoaW5lX2ZsYWdzKTogQWRkIGhhbmRsaW5nIG9mIFBBUklTQy4KLQotMTk5OS0wOS0yOSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRsbHRvb2wuYyAoc2Nhbl9kcmVjdHZlX3N5bWJvbHMpOiBIYW5kbGUgdHlwZSB0YWdzIGluIGV4cG9ydGVkCi0Jc3ltYm9scy4KLQkoc2Nhbl9maWx0ZXJlZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLTE5OTktMDktMTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiByZXNyYy5jICh3cml0ZV9yY19yY2RhdGEpOiBGaXggbG9jYWwgdmFyaWFibGUgc2hhZG93aW5nCi0JcHJvYmxlbS4gIElmIFJDREFUQV9CVUZGRVIgZGF0YSBjYW4gYmUgcmVhZCBhcyBzdHJpbmdzLCBtb2RpZnkKLQljb2RlIHRvIHByaW50IHRoZSBzdHJpbmdzIGFzIGNvbW1lbnRzLgotCSogcmVzcmVzLmM6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkod3JpdGVfcmVzX2RhdGEsIHJlYWRfcmVzX2RhdGEpOiBEb24ndCBwdXQgdGhlIHByb2dyYW0gbmFtZSBpbiB0aGUKLQllcnJvciBtZXNzYWdlOyBmYXRhbCBhbHJlYWR5IHB1dHMgaXQgdGhlcmUuCi0KLTE5OTktMDktMTQgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKENhbm9uaWNhbGl6YXRpb24gb2YgdGFyZ2V0IG5hbWVzKTogUmVtb3ZlIGFkZGluZwotCSR7Q09ORklHX1NIRUxMfSBpbiBmcm9udCBvZiAkYWNfY29uZmlnX3N1Yiwgc2luY2UgYXV0b2NvbmZpZyAyLjE0Ci0JZ2VuZXJhdGVzICRhY19jb25maWdfc3ViIHdpdGggYSAke0NPTkZJR19TSEVMTH0gYWxyZWFkeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFyLmMgKG1haW4pOiBDbGVhciBvdXRwdXRfZmlsZSBpZiB3ZSBkb24ndCBjaGFuZ2UgdGhlIGFyY2hpdmUuCi0JKGRlbGV0ZV9tZW1iZXJzLCByZXBsYWNlX21lbWJlcnMpOiBMaWtld2lzZS4KLQotMTk5OS0wOS0xMiAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9oZWFkZXJzKTogSWYgd2lkZV9vdXRwdXQsIHByaW50IEZsYWdzIGhlYWRlci4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogUHJpbnQgYW55IGNvbWRhdCBpbmZvcm1hdGlvbi4KLQotCSogb2JqY29weS5jIChwYXJzZV9mbGFncyk6IEhhbmRsZSAibm9sb2FkIiwgImRlYnVnIiwgYW5kICJzaGFyZSIuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IG5ldyBmbGFncy4KLQotCSogYXIuYyAoY291bnRlZF9uYW1lX21vZGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb3VudGVkX25hbWVfY291bnRlcik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1hcF9vdmVyX21lbWJlcnMpOiBIYW5kbGUgY291bnRlZCBtb2RlLgotCSh1c2FnZSk6IE1lbnRpb24gTiBtb2RpZmllci4KLQkobWFpbik6IEhhbmRsZSBOIG1vZGlmaWVyLgotCShkZWxldGVfbWVtYmVycyk6IEhhbmRsZSBjb3VudGVkIG1vZGUuCi0JKiBiaW51dGlscy50ZXhpLCBhci4xOiBEb2N1bWVudCBOIG1vZGlmaWVyLgotCi0JKiBhci5jIChwcmludF9jb250ZW50cyk6IENoYW5nZSBwcmludGluZyBvZiBtZW1iZXIgbmFtZSBmb3IKLQlQT1NJWC4yIGNvbmZvcm1hbmNlLgotCi0JKiBhci5jIChvdXRwdXRfZmlsZW5hbWUpOiBNYWtlIGNvbnN0LgotCShvcGVuX2luYXJjaCk6IElmIGNyZWF0aW5nIGEgbmV3IGVtcHR5IGFyY2hpdmUsIHNldAotCW91dHB1dF9maWxlbmFtZS4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFyLmMgKGZ1bGxfcGF0aG5hbWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtYXBfb3Zlcl9tZW1iZXJzKTogQ2FsbCBub3JtYWxpemUgb24gY29tbWFuZCBsaW5lIHBhcmFtZXRlci4KLQkodXNhZ2UpOiBNZW50aW9uIFAgbW9kaWZpZXIuCi0JKG5vcm1hbGl6ZSk6IElmIGZ1bGxfcGF0aG5hbWUgaXMgdHJ1ZSwgZG9uJ3QgZG8gYW55dGhpbmcuCi0JKG1haW4pOiBBY2NlcHQgUCBtb2RpZmllci4KLQkoZGVsZXRlX21lbWJlcnMpOiBDYWxsIG5vcm1hbGl6ZSBvbiBjb21tYW5kIGxpbmUgcGFyYW1ldGVyLgotCSogYmludXRpbHMudGV4aSwgYXIuMTogRG9jdW1lbnQgUCBtb2RpZmllci4KLQotMTk5OS0wOS0wOSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogYmludXRpbHMudGV4aTogQWRkIGluZm8gZGlyIGVudHJpZXMgZm9yIGFsbCBwcm9ncmFtcyBkZXNjcmliZWQKLQloZXJlLiAgRml4IGFyZ3VtZW50cyBvZiBAdmFyIHRvIG5vdCBjb250YWluIHB1bmN0dWF0aW9uLgotCi0xOTk5LTA5LTA2ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogbm0uYyAocHJpbnRfc3ltYm9sX2luZm9fYnNkKTogQ2hlY2sgZm9yICd3JyBhcyB3ZWxsIGFzICdVJy4KLQkocHJpbnRfc3ltYm9sX2luZm9fc3lzdik6IExpa2V3aXNlLgotCShwcmludF9zeW1ib2xfaW5mb19wb3NpeCk6IExpa2V3aXNlLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIHJlYWRlbGYuYzogSW5jbHVkZSAiZWxmL3BqLmgiLgotCShkdW1wX3JlbG9jYXRpb25zKTogSGFuZGxlIEVNX1BKLgotCShnZXRfbWFjaGluZV9uYW1lKTogTGlrZXdpc2UuCi0JKGdldF9tYWNoaW5lX2ZsYWdzKTogTGlrZXdpc2UuCi0KLTE5OTktMDgtMzEgIFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQG5ldHdpbmRlci5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X25vdGVfdHlwZSk6IE5ldyBmdW5jdGlvbjogIERlY29kZSB0aGUgZV90eXBlCi0JdmFsdWUgb2YgYSBub3RlLgotCShwcm9jZXNzX25vdGUpOiBOZXcgZnVuY3Rpb246IERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIGEgY29yZSBub3RlLgotCShwcm9jZXNzX2NvcmVmaWxlX25vdGVfc2VnbWVudCk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnRzKTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2NvcmVmaWxlX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2ZpbGUpOiBBZGQgY2FsbCB0byBwcm9jZXNzX2NvcmVmaWxlX2NvbnRlbnRzLgotCShwYXJzZV9hcmdzKTogQWRkIHBhcnNpbmcgb2YgLW4vLS1ub3RlcyBjb21tYW5kIGxpbmUgc3dpdGNoLgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoLgotCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVtbnQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8gcmVhZGVsZi4KLQotMTk5OS0wOC0zMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkgKEJ1ZyBSZXBvcnRpbmcpOiBDbGFyaWZ5IHRoYXQgbGFyZ2UgZmlsZXMgc2hvdWxkCi0Jbm90IGJlIHNlbnQgdG8gYnVnLWdudS11dGlscy4KLQotMTk5OS0wOC0yOCAgU3RlcGhhbmUgQ2FycmV6ICA8c3RjYXJyZXpAd29ybGRuZXQuZnI+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19leHRlbmRlZF9saW5lX29wKTogTmV3IHBhcmFtZXRlciBwb2ludGVyX3NpemUsCi0JcmVhZCB0aGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8gcG9pbnRlcl9zaXplLgotCShkZWJ1Z19saW5lX3BvaW50ZXJfc2l6ZSk6IE5ldyBnbG9iYWwgdG8gaW5kaWNhdGUgdGhlCi0Jc2l6ZSBvZiBhZGRyZXNzIGluIC5kZWJ1Z19saW5lIHNlY3Rpb24uCi0JKGRlYnVnX2Rpc3BsYXlzLCBwcmVzY2FuX2RlYnVnX2luZm8pOiBQcmVzY2FuIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uCi0JdG8gcmVjb3JkIHRoZSBzaXplIG9mIGFkZHJlc3MgaW4gYGRlYnVnX2xpbmVfcG9pbnRlcl9zaXplJy4KLQkocHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzKTogQmVmb3JlIGR1bXBpbmcgYW55IHNlY3Rpb24sIGV4ZWN1dGUKLQl0aGUgcHJlLXNjYW4gb3BlcmF0aW9uIGRlZmluZWQgZm9yIHNvbWUgZGVidWcgc2VjdGlvbnMuCi0KLTE5OTktMDgtMjcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkaXNwbGF5X2RlYnVnX2xpbmVzKTogVXNlIGktMSBub3QgaSBpbiBzdGFuZGFyZF9vcGNvZGVzCi0JYWNjZXNzLgotCShkaXNwbGF5X2RlYnVnX2FyYW5nZXMpOiBOZXcgbG9jYWwgZXhjZXNzLiAgVXNlIGZvciBjYWxjdWxhdGluZyBwYWRkaW5nCi0JYW5kIGFkZCB0aGF0IGludG8gcmFuZ2VzLiAgQnJlYWsgZnJvbSBsb29wIG9ubHkgaWYgbGVuZ3RoIGlzIGFsc28gMC4KLQotMTk5OS0wOC0yNyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGRpc3BsYXlfZGVidWdfbGluZXMsIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYyk6IE11bHRpcGx5Ci0JYWR2IGJ5IGluZm8ubGlfbWluX2luc25fbGVuZ3RoLgotCi0xOTk5LTA4LTI2ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3NwYXJjNjRfZHluYW1pY190eXBlKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfZHluYW1pY190eXBlKTogVXNlIGl0LgotCi0xOTk5LTA4LTI2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZGlzcGxheV9kZWJ1Z19saW5lcywgY2FzZSBkZWZhdWx0KTogQ2hhbmdlIHNlY29uZCBsaW5lCi0Jc2V0dGluZwlhZHYgdG8gdXNlID0gbm90ICs9LgotCi0xOTk5LTA4LTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmM6IEFkZGVkIG1vcmUgZXhhbXBsZXMgdG8gdGhlIGNvbW1lbnQgYXQgdGhlIHN0YXJ0LgotCi0xOTk5LTA4LTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1ha2VfaGVhZCk6IE9ubHkgZW1pdCBpbnRlcndvcmtpbmcgZGlyZWN0aXZlIGlmCi0JbmVjZXNzYXJ5LgotCi1UaHUgSnVsIDE1IDIyOjQ0OjIxIDE5OTkgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGJpdHJhbmdlLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2FiYnJldl9zZWN0aW9uKTogSGFuZGxlIHN0YW5kYXJkLWNvbmZvcm1pbmcKLQlzaW5nbGUgemVybyBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLgotCi0xOTk5LTA4LTA5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogb2JqZHVtcC5jIChleGl0X3N0YXR1cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG5vbmZhdGFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBleGl0X3N0YXR1cyBvbiBlcnJvci4KLQkocmVhZF9zZWN0aW9uX3N0YWJzKTogTGlrZXdpc2UuCi0JKGRpc3BsYXlfYmZkKTogTGlrZXdpc2UuICBDYWxsIG5vbmZhdGFsIHJhdGhlciB0aGFuIGJmZF9ub25mYXRhbC4KLQkoZGlzcGxheV9maWxlKTogQ2FsbCBub25mYXRhbCByYXRoZXIgdGhhbiBiZmRfbm9uZmF0YWwuCi0JKGRpc3BsYXlfdGFyZ2V0X2xpc3QsIGRpc3BsYXlfaW5mb190YWJsZSk6IExpa2V3aXNlLgotCShtYWluKTogUmV0dXJuIGV4aXRfc3RhdHVzIHJhdGhlciB0aGFuIDAuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBVcGRhdGUgZm9yIHJlbmFtaW5nIG9mCi0JU0VDX1NIT1JUIHRvIFNFQ19TTUFMTF9EQVRBLiAgUHJpbnQgU0VDX1NIQVJFRCBmbGFnLgotCi0JRnJvbSBFbGkgWmFyZXRza2lpIDxlbGl6QGdudS5vcmc+OgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgY3h4ZmlsdCBhcyBNUy1ET1MgbmFtZSBmb3IgYysrZmlsdC4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgYW5kIHN1YnN0aXR1dGUgREVNQU5HTEVSX05BTUUuCi0JKiBNYWtlZmlsZS5hbSAoREVNQU5HTEVSX1BST0cpOiBTZXQgdG8gY3h4ZmlsdC4KLQkobWFuX01BTlMpOiBVc2UgREVNQU5HTEVSX05BTUUgcmF0aGVyIHRoYW4gREVNQU5HTEVSX1BST0cuCi0JKGJpbl9QUk9HUkFNUyk6IFJlbW92ZSAkKERFTUFOR0xFUl9QUk9HKS4KLQkobm9pbnN0X1BST0dSQU1TKTogQWRkICQoREVNQU5HTEVSX1BST0cpLgotCShjeHhmaWx0X1NPVVJDRVMpOiBSZW5hbWUgZnJvbSBjX19maWx0X1NPVVJDRVMuCi0JKGN4eGZpbHRfTERBREQpOiBSZW5hbWUgZnJvbSBjX19maWx0X0xEQURELgotCSgkKERFTUFOR0xFUl9OQU1FKS4xKTogUmVuYW1lIGZyb20gJChERU1BTkdMRVJfUFJPRykuMS4gIFVzZQotCURFTUFOR0xFUl9OQU1FIHJhdGhlciB0aGFuIERFTUFOR0xFUl9QUk9HIGluIHN1YnN0aXR1dGlvbi4KLQkoTU9TVExZQ0xFQU5GSUxFUyk6IFVzZSBERU1BTkdMRVJfTkFNRSByYXRoZXIgdGhhbgotCURFTUFOR0xFUl9QUk9HLgotCShpbnN0YWxsLWV4ZWMtbG9jYWwpOiBXaGVuIGluc3RhbGxpbmcgbm9pbnN0X1BST0dSQU1TLCBjaGFuZ2UKLQljeHhmaWx0IHRvICQoREVNQU5HTEVSX05BTUUpLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW06IFJlbmFtZSAuZGVwKiBmaWxlcyB0byBERVAqLiAgQ2hhbmdlIERFUCB2YXJpYWJsZSB0bwotCU1LREVQLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDgtMDUgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoWUFDQyk6IElmIGJpc29uIGlzIG5vdCBpbiB0aGUgc291cmNlIHRyZWUsIHVzZQotCUBZQUNDQCByYXRoZXIgdGhhbiBiaXNvbiAteS4KLQkoTEVYKTogSWYgZmxleCBpcyBub3QgaW4gdGhlIHNvdXJjZSB0cmVlLCB1c2UgQExFWEAgcmF0aGVyIHRoYW4KLQlmbGV4LgotCSogY29uZmlndXJlLmluOiBCdWlsZCBkbGx0b29sIGZvciBpWzMtNl04Ni0qLWludGVyaXguCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gTWFyayBFbGJyZWNodDoKLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogcmVhZGVsZi5jIChnZXRfbWFjaGluZV9mbGFncyk6IFByaW50IEVGX1NQQVJDX1NVTl9VUzMuCi0KLTE5OTktMDctMTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi45LjUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDctMTQgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IFByaW50IFNFQ19TSE9SVC4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBBZGQgQVRUUklCVVRFX1VOVVNFRAotCWFzIGFwcHJvcHJpYXRlLiAgQWRkIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucy4gIEFkZCBjYXN0cy4KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBDaGFuZ2UgaiB0byBiZmRfdm1hLgotCSogcmVhZGVsZi5jIChwcm9jZXNzX3N5bWluZm8pOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBpbnQuCi0JKGRpc3BsYXlfZGVidWdfaW5mbyk6IENoYW5nZSBhYmJyZXZfbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmcuCi0JKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IENoYW5nZSBmY250IHRvIHNpemVfdC4KLQotMTk5OS0wNy0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBPbmx5IHN1cHBvcnQgZGVjb2RpbmcgNjRiaXQgRUxGIGZpbGVzIGlmIHRoZSBjb21waWxlcgotCXN1cHBvcnRzIGEgNjQgYml0IGRhdGEgdHlwZS4KLQlBZGQgLUkgZXF1aXZhbGVudCBmb3IgLS1oaXN0b2dyYW0uCi0JQWRkIC1BIGNvbW1hbmQtbGluZSBvcHRpb24gdG8gZGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0KLTE5OTktMDctMDggIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogcmVhZGVsZi5jIChndWVzc19pc19yZWxhKTogU3BhcmN2OSBhbmQgdjhwbHVzIHVzZSByZWxhLgotCShkdW1wX3JlbG9jYXRpb25zKTogVXNlIEVMRjY0X1JfVFlQRV9JRCBmb3IgU3BhcmMsIGZvciBSX1NQQVJDX09MTzEwCi0JcHJpbnQgdGhlIHNlY29uZGFyeSBhZGRlbmQuCi0JKGdldF9tYWNoaW5lX2ZsYWdzKTogUHJpbnQgU3BhcmMgbWFjaGluZSBmbGFncy4KLQkoZ2V0X3N5bWJvbF90eXBlKTogUHJpbnQgU1RUX1JFR0lTVEVSLgotCi0xOTk5LTA3LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl90eXBlKTogRml4IGhhbmRsaW5nIG9mIHRlbXBsYXRlIG5hbWVzIHdpdGgKLQl0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgYDo6Jy4KLQkoc3RhYl9kZW1hbmdsZV90eXBlKTogSGFuZGxlIGEgcXVhbGlmaWVkIG5hbWUgaW4gYSBwb2ludGVyIHRvCi0JbWVtYmVyLgotCi0xOTk5LTA2LTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRsbHRvb2xfU09VUkNFUyk6IEFkZCBkeW4tc3RyaW5nLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0yMyAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoSEFWRV9FWEVDVVRBQkxFX1NVRkZJWCk6IERlZmluZS4KLQkqIGRsbHRvb2wuYyAobG9va19mb3JfcHJvZyk6IFVzZSBIQVZFX0VYRUNVVEFCTEVfU1VGRklYLgotCSogZGxsd3JhcC5jIChsb29rX2Zvcl9wcm9nKTogTGlrZXdpc2UuCi0JKiByZXNyYy5jIChsb29rX2Zvcl9kZWZhdWx0KTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gTXVtaXQgS2hhbiA8a2hhbkB4cmF5bGl0aC53aXNjLkVEVT46Ci0JKiBjb25maWd1cmUuaW46IERlZmluZSBFWEVDVVRBQkxFX1NVRkZJWC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSAiZHluLXN0cmluZy5oIi4gIEluY2x1ZGUgPHN0ZGFyZy5oPiBiYXNlZCBvbgotCUFOU0lfUFJPVE9UWVBFUywgbm90IF9fU1REQ19fLgotCShvdXRmaWxlKTogUmVtb3ZlLgotCShnZW5fZXhwX2ZpbGUpOiBDaGFuZ2UgdXNlcyBvZiBvdXRmaWxlIHRvIHVzZSBhbGxvY2EuCi0JKG1ha2Vfb25lX2xpYl9maWxlLCBtYWtlX2hlYWQsIG1ha2VfdGFpbCk6IExpa2V3aXNlLgotCShnZW5fbGliX2ZpbGUpOiBMaWtld2lzZS4KLQkobG9va19mb3JfcHJvZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlZHVjZV9uYW1lKTogUmV3cml0ZSB0byB1c2UgbG9va19mb3JfcHJvZy4KLQkobWNvcmVfZWxmX2dlbl9vdXRfZmlsZSk6IFVzZSBkeW5fc3RyaW5nX3QgcmF0aGVyIHRoYW4gb3V0ZmlsZS4KLQkqIGRsbHdyYXAuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4sIDxlcnJuby5oPiwgPHN0cmluZy5oPiwKLQk8c3RkbGliLmg+LCBvciA8dW5pc3RkLmg+LiAgSW5jbHVkZSA8c3lzL3N0YXQuaD4gYW5kIGVpdGhlcgotCTxzdGRhcmcuaD4gb3IgPHZhcmFyZ3MuaD4uCi0JKGRyaXZlcl9uYW1lKTogSW5pdGlhbGl6ZSB0byBOVUxMLCBub3QgImdjYyIuCi0JKGRsbHRvb2xfbmFtZSk6IEluaXRpYWxpemUgdG8gTlVMTCwgbm90ICJkbGx0b29sIi4KLQkoZGlzcGxheSwgaW5mb3JtLCBsb29rX2Zvcl9wcm9nLCBkZWR1Y2VfbmFtZSk6IE5ldyBzdGF0aWMKLQlmdW5jdGlvbnMuCi0JKHVzYWdlKTogTWVudGlvbiAtbW5vLWN5Z3dpbi4KLQkoT1BUSU9OX01OT19DWUdXSU4pOiBEZWZpbmUuCi0JKG1haW4pOiBIYW5kbGUgLW1uby1jeWd3aW4uICBEZWR1Y2UgZHJpdmVyX25hbWUgYW5kIGRsbHRvb2xfbmFtZS4KLQkqIHJlc3JjLmMgKGxvb2tfZm9yX2RlZmF1bHQpOiBNYWtlIHN0YXRpYy4gIFJlbW92ZSB1bnVzZWQgbG9jYWwKLQlwYXRoLiAgQ2hlY2sgdXNpbmcgRVhFQ1VUQUJMRV9TVUZGSVguCi0JKHJlYWRfcmNfZmlsZSk6IEFsbG9jYXRlIGVub3VnaCBzcGFjZSB0byBob2xkIEVYRUNVVEFCTEVfU1VGRklYLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShkbGx3cmFwX0xEQUREKTogQWRkICQoSU5UTExJQlMpLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVuIDIxIDE2OjQ5OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IFVzZSBlbGZfaHBwYV9yZWxvY190eXBlIGluc3RlYWQgb2YKLSAgICAgICAgZWxmMzJfaHBwYV9yZWxvY190eXBlLgotCi0xOTk5LTA2LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUpOiBMaW5rIG9iamVjdCBmaWxlcyB3aXRoIHRoZQotCS5leHAgZmlsZSwgbm90IHRoZSAubGliIGZpbGUuCi0KLUZyaSBKdW4gMTggMjA6MTc6NTEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRlZmxleC5sOiBBY2NlcHQgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgbmFtZXMuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3N5bWJvbF90eXBlKTogRGV0ZWN0IEFSTSBzeW1ib2xzIHR5cGVkIGFzIFRodW1iCi0JZnVuY3Rpb25zLgotCi0xOTk5LTA2LTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlcl9vcHRpb25zKTogTmV3IHZhcmlhYmxlLgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyAtTS8tLWRpc2Fzc2VtYmxlci1vcHRpb25zIG9wdGlvbi4KLQkobG9uZ19vcHRpb25zKTogQWRkIC0tZGlzYXNzZW1ibGVyLW9wdGlvbnMuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBJbml0aWFsaXNlIGRpc2Fzc2VtYmxlcl9vcHRpb25zIGZpZWxkIG9mCi0JZGlzYXNzZW1ibGVyX2luZm8gc3RydWN0dXJlLgotCShtYWluKTogQWRkIHBhcnNpbmcgb2YgLU0gb3B0aW9uLgotCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCB0byBvYmpkdW1wLgotCi0JKiBORVdTOiBEZXNjcmliZSBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCB0byBvYmpkdW1wLgotCi0KLU1vbiBKdW4gMTQgMTA6Mjc6NTQgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBiaW51dGlscy50ZXhpOiBGaXggdHlwb3MuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogSWYgdGhlIGRpc2Fzc2VtYmxlciByZXR1cm5zIGFuCi0JZXJyb3IsIHByaW50IG91dCBhbnl0aGluZyBpdCBtYXkgaGF2ZSBwcmludGVkIHRvIHRoZSBidWZmZXIuICBGcm9tCi0JSC5KLiBMdSA8aGpsQGdudS5vcmc+LgotCi0JKiBkZWZwYXJzZS55IChleHBsaXN0KTogUmVtb3ZlIHNlcGFyYXRlIGV4cGxpbmUgdG8gZWxpbWluYXRlCi0Jc2hpZnQvcmVkdWNlIGNvbmZsaWN0LgotCi0JRnJvbSBLYWktVXdlIFJvbW1lbCA8cm9tbWVsQGFycy5kZT46Ci0JKiBkZWZwYXJzZS55OiBBZGQgdG9rZW5zIE5PTlNIQVJFRCwgU0lOR0xFLCBNVUxUSVBMRSwKLQlJTklUSU5TVEFOQ0UsIElOSVRHTE9CQUwsIFRFUk1JTlNUQU5DRSwgYW5kIFRFUk1HTE9CQUwuCi0JKGNvbW1hbmQpOiBBZGQgb3B0aW9uX2xpc3QgYWZ0ZXIgTElCUkFSWS4KLQkoYXR0cik6IEFjY2VwdCBhbmQgaWdub3JlIE5PTlNIQVJFRCwgU0lOR0xFLCBhbmQgTVVMVElQTEUuCi0JKG9wdGlvbl9saXN0LCBvcHRpb24pOiBOZXcgbm9udGVybWluYWxzLgotCSogZGVmbGV4Lmw6IFJlY29nbml6ZSBOT05TSEFSRUQsIFNJTkdMRSwgTVVMVElQTEUsIElOSVRJTlNUQU5DRSwKLQlJTklUR0xPQkFMLCBURVJNSU5TVEFOQ0UsIGFuZCBURVJNR0xPQkFMLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYXIuYyAoT19CSU5BUlkpOiBEZWZpbmUgYXMgMCBpZiBub3QgZGVmaW5lZC4KLQkocmFubGliX3RvdWNoKTogT3BlbiBmaWxlIHdpdGggT19CSU5BUlkuCi0KLQkqIHJlbmFtZS5jIChPX0JJTkFSWSk6IERlZmluZSBhcyAwIGlmIG5vdCBkZWZpbmVkLgotCShzaW1wbGVfY29weSk6IE9wZW4gZmlsZXMgd2l0aCBPX0JJTkFSWS4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC4gUGV0ZXIgQW52aW4gPGhwYUB0cmFuc21ldGEuY29tPjoKLQkqIG9iamNvcHkuYyAoc3RydWN0IHNlY3Rpb25fbGlzdCk6IEFkZCBjb3B5IGZpZWxkLgotCShzZWN0aW9uc19jb3BpZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb3B5X29wdGlvbnMpOiBBZGQgIm9ubHktc2VjdGlvbiIuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC1qIGFuZCAtLW9ubHktc2VjdGlvbi4KLQkoZmluZF9zZWN0aW9uX2xpc3QpOiBJbml0aWFsaXplIGNvcHkgZmllbGQuCi0JKGlzX3N0cmlwX3NlY3Rpb24pOiBDaGVjayBmb3IgY29weWluZyBzZWN0aW9ucy4KLQkoY29weV9vYmplY3QpOiBDaGVjayBzZWN0aW9uc19jb3BpZWQgd2hlbiBjYWxsaW5nIGZpbHRlcl9zeW1ib2xzLgotCShzZXR1cF9zZWN0aW9uKTogQ2hlY2sgZm9yIGNvcHlpbmcgc2VjdGlvbnMuCi0JKGNvcHlfc2VjdGlvbik6IExpa2V3aXNlLgotCShjb3B5X21haW4pOiBIYW5kbGUgLWovLS1vbmx5LXNlY3Rpb24uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC1qLy0tb25seS1zZWN0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IElmIGZyZXhwIGlzIG5vdCBhdmFpbGFibGUsIGNoZWNrIGluIC1sbS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogcmVhZGVsZi5jIChnZXRfZWxmX2NsYXNzKTogVXNlIGNvcnJlY3QgcHJpbnRmIGZvcm1hdCBmb3IgdHlwZS4KLQkoZ2V0X2RhdGFfZW5jb2RpbmcpOiBMaWtld2lzZS4KLQkoZ2V0X29zYWJpX25hbWUpOiBMaWtld2lzZS4KLQkocHJvY2Vzc19maWxlX2hlYWRlcik6IERvbid0IHBhc3MgYW4gZXh0cmEgYXJndW1lbnQgdG8gcHJpbnRmLgotCShwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IENhc3QgZHluYW1pY19zaXplIHRvIGxvbmcgYmVmb3JlCi0JcHJpbnRpbmcuCi0JKGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uKTogQ2FzdCBieXRlX2dldCB0byBsb25nIGJlZm9yZQotCXByaW50aW5nLgotCi1XZWQgSnVuICA5IDExOjQwOjE2IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3NlY3Rpb24pOiBDYXN0IHZhbHVlcyBmcm9tIGJ5dGVfZ2V0IHRvCi0gCVt1bnNpZ25lZF0gbG9uZyBmb3IgcHJpbnRpbmcsIGluIGNhc2UgaXQgaXMgd2lkZXIgdGhhbiBsb25nLgotCShkaXNwbGF5X2Jsb2NrKTogTGlrZXdpc2UuCi0JKHJlYWRfYW5kX2Rpc3BsYXlfYXR0cik6IExpa2V3aXNlLgotCShkZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbik6IExpa2V3aXNlLiAgRG9uJ3QgZGVwZW5kIG9uCi0gCWV2YWx1YXRpb24gb3JkZXIuCi0KLU1vbiBKdW4gIDcgMTI6MTQ6NTcgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiB3aW5kcmVzLmMgKHVzYWdlKTogRml4IHR5cG8uCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogVXNlIDY0Yml0IHdpZGUgZmllbGRzIGluIGludGVybmFsIHN0cmN1dHVyZXMgZXZlbiBpZgotCXRhcmdldHRpbmcgYSAzMmJpdCBhcmNoaXRlY3R1cmUuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBUYWtlIGEgbmV3IHBhcmFtZXRlciAtIHRoZSBudW1iZXIgb2Ygc3ltYm9scwotCWluIHRoZSBzeW1ib2wgdGFibGUuCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQWRkIHN1cHBvcnQgZm9yIDY0Yml0IEVMRiBmaWxlcy4KLQotMTk5OS0wNi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtY29yZV9lbGZfZ2VuX291dF9maWxlKTogVXNlIGNvbnN0YW50cyBmb3IgdGVtcG9yYXJ5Ci0JZmlsZSBuYW1lcy4KLQotV2VkIEp1biAgMiAxMjozNDozNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IFJldmVydCAxOTk5MDQxMSBjaGFuZ2UuCi0KLU1vbiBNYXkgMzEgMDk6NTY6MjIgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfcmVsb2NzKTogRGV0ZXJtaW5lIHR5cGUgb2YgcmVsb2MgZnJvbQotCURUX1BMVFJFTCBhbmQgZnJvbSBzZWN0aW9uIHR5cGUuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X2VsZl9jbGFzcyk6IERpc3BsYXkgdW5rbm93biBjbGFzcyBudW1iZXIuCi0JKGdldF9kYXRhX2VuY29kaW5nKTogRGlzcGxheSB1bmtub3duIGVuY29kaW5nIG51bWJlci4KLQkoZ2V0X29zYWJpX25hbWUpOiBEaXNwbGF5IHVua25vd24gQUJJIG51bWJlci4KLQkocHJvY2Vzc19maWxlX2hlYWRlcik6IERpc3BsYXkgdW5rbm93biB2ZXJzaW9uIG51bWJlci4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogRml4IHR5cG8uCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFkZCBleHRyYSBwYXJhbWV0ZXI6IGlzX3JlbGEgdG8KLQlzcGVjaWZ5IHRoZSBraW5kIG9mIHJlbG9jYXRpb25zIHRvIGJlIGR1bXBlZC4gIENhbGwgZ3Vlc3NfaXNfcmVsYQotCWlmIHRoaXMgcGFyYW1ldGVyIGhhcyBhIHZhbHVlIG9mIFVOS05PV04uCi0JKGd1ZXNzX2lzX3JlbGEpOiBOZXcgZnVuY3Rpb246ICBHdWVzcyB0aGUga2luZCBvZiByZWxvYyBiZWluZyB1c2VkCi0JYmFjZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLgotCShwcm9jZXNzX3JlbG9jcyk6IERldGVybWluZSB0eXBlIG9mIHJlbG9jIGJlZm9yZSBjYWxsaW5nCi0JZHVtcF9yZWxvY2F0aW9ucy4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlYWRlbGYuYzogSW5jbHVkZSAiZWxmL2k5NjAuaCIuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBIYW5kbGUgRU1fOTYwLgotCi1UaHUgTWF5IDI3IDExOjU4OjMzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBQcmVzZXJ2ZSBkYXRlcyBvZiBhcmNoaXZlIG1lbWJlcnMgaWYKLQlyZXF1ZXN0ZWQuCi0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFsd2F5cyBwcmludCB0aGUgYWRkZW5kIG9uIFJFTEEKLQlzeXN0ZW1zIGV2ZW4gaWYgdGhlcmUgaXMgbm8gc3ltYm9sLgotCShwcm9jZXNzX3Byb2dyYW1faGVhZGVycyk6IFJlc2V0IGR5bmFtaWNfc2l6ZSBiZWZvcmUgbG9vcGluZwotCXRocm91Z2ggdGhlIHByb2dyYW0gaGVhZGVycy4KLQkocHJvY2Vzc192ZXJzaW9uX3NlY3Rpb25zKTogQ2FzdCBzaF9vZmZzZXQgdG8gdW5zaWduZWQgbG9uZyBmb3IKLQlwcmludGluZyBpbiBjYXNlIGJmZF92bWEgaXMgd2lkZXIuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogVXNlIGdldF9zeW1ib2xfaW5kZXhfdHlwZSB3aGVuIHByaW50aW5nCi0Jc3Rfc2huZHguCi0KLTE5OTktMDUtMTcgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmM6IGFkZCB2ZXJib3NlIG9wdGlvbgotCShtYWluKTogcHJvY2VzcyB2ZXJib3NlIG9wdGlvbgotCSogcmVzcmMuYyAobG9va19mb3JfZGVmYXVsdCk6IG5ldy4gIExvb2sgZm9yIHRoZSBkZWZhdWx0Ci0JcHJlcHJvY2Vzc29yIGluIGEgZ2l2ZW4gbG9jYXRpb24uCi0JKHJlYWRfcmNfZmlsZSk6IGZvciBmb28vYmFyLXdpbmRyZXMsIGxvb2sgZm9yIGZvby9iYXItZ2NjLAotCWZvby9nY2MgKGluIGNhc2Ugb2YgZm9vL3dpbmRyZXMpLCBhbmQgdGhlbiBnY2MgKHRoZSBvbGQgZGVmYXVsdCkuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZGVkdWNlX25hbWUpOiBOZXcgZnVuY3Rpb246IERlZHVjZSBuYW1lIG9mIHByb2dyYW0gdG8KLQlydW4uCi0JKG1jb3JlX2VsZl9vdXRfZmlsZSk6IE5ldyB2YXJpYWJsZTogTmFtZSBvZiBtY29yZS1lbGYgb3V0cHV0IGZpbGUuCi0JKG1jb3JlX2VsZl9saW5rZXIpOiBOZXcgdmFyaWFibGU6IE5hbWUgb2YgbGlua2VyIHRvIHVzZS4KLQkobWNvcmVfZWxmX2xpbmtlcl9mbGFncyk6IE5ldyB2YXJpYWJsZTogTGlua2VyIGZsYWdzIHRvIHBhc3MuCi0JKHNjYW5fb2JqX2ZpbGUpOiBDYWNoZSBmaWxlbmFtZXMgaWYgbmVjZXNzYXJ5LgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQkobWFpbik6IFN1cHBvcnQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtTSAoZ2VuZXJhdGUgYW4KLQltY29yZS1lbGYgb3V0cHV0IGZpbGUpIC1MIChuYW1lIG9mIGxpbmtlciB0byB1c2UpIC1GIChmbGFncyB0bwotCXBhc3MgdG8gbGlua2VyKS4KLQkobWNvcmVfZWxmX2NhY2hlX2ZpbGVuYW1lKTogU3RvcmUgYSBmaWxlbmFtZSBpbiBhIGNhY2hlLgotCShtY29yZV9lbGZfZ2VuX291dF9maWxlKTogTmV3IGZ1bmN0aW9uOiBHZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZQotCXBlciB0aGUgbWNvcmUtZWxmIHNwZWMuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQlVJTERfTUlTQyk6IEJ1aWxkIGRsbHRvb2wgZm9yIG1jb3JlCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBkbGx0b29sLmM6IFVwZGF0ZSBleGFtcGxlIGluIGNvbW1lbnQuCi0JKERMTFRPT0xfTUNPUkUpOiBEZWZpbmUuCi0JKERMTFRPT0xfTUNPUkVfRUxGKTogRGVmaW5lLgotCShEUkVDVFZFX1NFQ1RJT05fTkFNRSk6IERlZmluZS4KLQkobWNvcmVfYmVfanRhYiwgbWNvcmVfbGVfanRhYik6IEJpbmFyeSBmb3IgcGVyZm9ybWluZyBhbiBtY29yZQotCWp1bXAgdG8gYWRkcmVzcy4KLQkobXRhYmxlKTogQWRkIGVudHJpZXMgZm9yIG1jb3JlIHZhcmlhbnRzLgotCShydmFhZnRlciwgcnZhYmVmb3JlLCBhc21fcHJlZml4KTogQWRkIG1jb3JlIHN1cHBwb3J0LgotCShzY2FuX2RyZWN0dmVfc3ltYm9scyk6IFVzZSBEUkVDVFZFX1NFQ1RJT05fTkFNRS4KLQkobWFrZV9oZWFkLCBtYWtlX3RhaWwpOiBDb3BlIGlmIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQuCi0JKHVzYWdlKTogSW1wcm92ZSBsYXlvdXQuCi0KLTE5OTktMDUtMTMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiByY2xleC5sOiBhZGQgY29kZSB0byBzdXBwcmVzcyBjZXJ0YWluIG91dHB1dCBmcm9tIGNwcCwgcmVwbGFjZQotCWFsbCByZXR1cm5zIHdpdGggTUFZQkVfUkVUVVJOCi0JKE1BWUJFX1JFVFVSTik6IG5ldywgaW1wbGVtZW50IHRoZSBzdXBwcmVzc2lvbiBieSByZXR1cm5pbmcKLQlJR05PUkVEX1RPS0VOIGFzIG5lZWRlZC4KLQkoY3BwX2xpbmUpOiByZW1lbWJlciB3aGljaCBmaWxlIHdlJ3JlIGluLCBtYXJrIGRhdGEgZnJvbSBpbmNsdWRlZAotCSouaCBmaWxlcyBmb3Igc3VwcHJlc3Npb24uCi0JKiByY3BhcnNlLnkgKGlucHV0KTogYWxsb3cgSUdOT1JFRF9UT0tFTiBvdXRzaWRlIG9mIGtub3duIGNvbnN0cnVjdHMKLQotMTk5OS0wNS0xMCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYyAocXVvdCk6IFF1b3RlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIGluIGEgc3RyaW5nCi0JKG1haW4pOiBxdW90ZSBwYXJhbWV0ZXJzIHRvIGNwcCB0aGF0IG1pZ2h0IGhhdmUgbWV0YWNoYXJhY3RlcnMgaW4KLQl0aGVtLiAgQWxsb3cgLUQgYXMgYW4gYWxpYXMgZm9yIC0tZGVmaW5lIHRvIGFsbG93IGZvciBzaGFyaW5nIG1ha2UKLQltYWNyb3Mgd2l0aCBnY2MuCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY19zZXQpOiBkb24ndCBjb3JlIGlmIGhvd3RvLT5uYW1lIGlzIE5VTEwKLQotCSogTWFrZWZpbGUuYW06IEdpdmUgcmVzY29mZi5jIGEgY3B1LXNwZWNpZmljIC1EIHNvIGl0IGNhbiBzZXQKLQl0aGUgY29ycmVjdCBCRkQuCi0JKiBNYWtlZmlsZS5pbjogZGl0dG8KLQkqIHJlc2NvZmYuYyAod3JpdGVfY29mZl9maWxlKTogU2V0IHRoZSBjb3JyZWN0IEJGRAotCi0xOTk5LTA1LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVuYW1lLmMgKHNtYXJ0X3JlbmFtZSk6IEZpeCB0ZXN0IG9mIHdoZXRoZXIgZmlsZSBleGlzdHMuCi0KLTE5OTktMDUtMDYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBkaXNwbGF5X2VuZGlhbiBiYXNlZCBvbiB0YXJnZXQKLQllbmRpYW5pc20uCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGludGVyd29yayk6IFJlbW92ZS4KLQkoYXJtX2ludGVyd29ya19qdGFiKTogVXNlIGJ4IGluc24uCi0JKHRodW1iX2p0YWIpOiBMaWtld2lzZS4KLQkoTUFSTV9JTlRFUldPUkspOiBOZXcgbWFjaGluZSB0eXBlLgotCShydmFhZnRlcik6IEhhbmRsZSBpdC4KLQkocnZhYmVmb3JlKSBMaWtld2lzZS4KLQkoYXNtX3ByZWZpeCk6IExpa2V3aXNlLgotCShnZW5fZXhwX3R5cGUpOiBDaGVjayBtYWNoaW5lIHR5cGUgaW5zdGVhZCBvZgotCWludGVyd29yayBmbGFnLgotCShtYWtlX29uZV9saWJfZmlsZSk6IExpa2V3aXNlLgotCShtYWtlX2hlYWQpOiBMaWtld2lzZS4KLQkobWFrZV90YWlsKTogTGlrZXdpc2UuCi0JKHVzYWdlKTogVXBkYXRlIG1hY2hpbmUgdHlwZXMuCi0JKG1haW4pOiBSZW1vdmUgLWludGVyd29yayBzdXBwb3J0LgotCi0xOTk5LTA1LTA1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHJlYWRlbGYuYyAoZ2V0X21hY2hpbmVfZmxhZ3MpOiAgQ2hlY2sgZm9yIEVGX0NQVTMyLgotICAgICAgICAoZ2V0X2RhdGFfZW5jb2RpbmcpOiBGaXggdHlwby4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gaW4KLQlCRkQ2NCBjYXNlLgotCi0JKiByZWFkZWxmLmMgKGdldF9zZWN0aW9uX3R5cGVfbmFtZSk6IFVzZSBjb3JyZWN0IHR5cGVzIGluIHByaW50ZgotCWZvcm1hdHMuCi0JKHByb2Nlc3NfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogTGlrZXdpc2UuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IExpa2V3aXNlLgotCi1UdWUgQXByIDEzIDIxOjIyOjAwIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1ha2Vfb25lX2xpYl9maWxlKTogTWFyayB0aHVtYiBmdW5jdGlvbnMgYXMKLQlDX1RIVU1CRVhURlVOQy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmggKGVudmlyb24pOiBEZWNsYXJlIGl0LCBpZiBuZWVkZWQuCi0JKGFsbG9jYSkgW0NfQUxMT0NBXTogRG9uJ3QgdXNlIGdjYydzIGJ1aWx0aW4gb3IgPGFsbG9jYS5oPi4KLQkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KLQkqIG5tLmMgKG1haW4pOiBEb24ndCBkZWNsYXJlIGVudmlyb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotCSogZGxsdG9vbC5jIChnZW5fZXhwX2ZpbGUpOiBQYWQgb3V0IHRoZSAucmVsb2Mgc2VjdGlvbiB0byBhCi0JMzItYnl0ZSBib3VuZGFyeSB3aXRoIGR1bW15IHJlbG9jYXRpb25zLCB0byBtYWtlIHRoZSBCZU9TIGxvYWRlcgotCWhhcHB5LiAgUGF0Y2ggZnJvbSBCb2IgTWFuc29uIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPi4KLQotMTk5OS0wNC0wOCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpIChjKytmaWx0KTogVXBkYXRlZCBmb3IgLWovLS1qYXZhLCBhbmQgaHAvZWRnCi0JZm9ybWF0cy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBBZGQgYWJpbGl0eSB0byBkZWNvZGUgbmV3IGNvbnN0YW50cyBmb3VuZCBpbiBBcHJpbCAyNQotCTE5OTggRHJhZnQgb2YgU3lzdGVtIFYgQUJJIHNwZWMuCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBidWNvbW0uaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0JKiBhZGRyMmxpbmUuYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZQotCXN5c3RlbSBkb2VzIG5vdCBkZWZpbmUgaXQuCi0JKiBhci5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBjb2ZmZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBkbGx0b29sLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3Jjb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3lzZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYyAobWFpbik6IENhbGwgbG9jYWxlIHNldHRpbmcgZnVuY3Rpb25zLgotCi0xOTk5LTA0LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uKTogRml4IERXX09QX2NvbnN0OHtzfHV9Ci0JZGVjb2Rlcy4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlbmFtZS5jOiBOZXcgZmlsZSwgY29waWVkIG91dCBvZiBvYmpjb3B5LmMgd2l0aCBhIGZldyBjaGFuZ2VzLgotCSogYnVjb21tLmggKHNldF90aW1lcywgc21hcnRfcmVuYW1lKTogRGVjbGFyZS4KLQkqIGFyLmM6IERvbid0IGluY2x1ZGUgPHV0aW1lLmg+LgotCShleHRyYWN0X2ZpbGUpOiBDYWxsIHNldF90aW1lcyByYXRoZXIgdGhhbiB1dGltZS4KLQkod3JpdGVfYXJjaGl2ZSk6IENhbGwgc21hcnRfcmVuYW1lIHJhdGhlciB0aGFuIHVubGluayBhbmQgcmVuYW1lLgotCSogb2JqY29weS5jOiBEb24ndCBpbmNsdWRlIDx1dGltZS5oPi4KLQkoc2ltcGxlX2NvcHksIHNtYXJ0X3JlbmFtZSwgc2V0X3RpbWVzKTogTW92ZSB0byByZW5hbWUuYy4KLQkoc3RyaXBfbWFpbik6IFVwZGF0ZSBzbWFydF9yZW5hbWUgY2FsbCBmb3IgbmV3IHBhcmFtZXRlci4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCByZW5hbWUuYy4KLQkob2JqY29weV9TT1VSQ0VTLCBzdHJpcF9uZXdfU09VUkNFUyk6IEFkZCByZW5hbWUuYy4KLQkoYXJfU09VUkNFUywgcmFubGliX1NPVVJDRVMpOiBBZGQgcmVuYW1lLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShFWFRSQV9QUk9HUkFNUyk6IFJlbW92ZSBiYWNrc2xhc2ggd2hpY2ggdHJvdWJsZXMgY3VycmVudCB2ZXJzaW9uCi0Jb2YgYXV0b21ha2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogZGxsd3JhcC5jIChtYWluKTogRXhwZWN0IGNvcnJlY3QgdHlwZSBpbiBmb3JtYXQgc3RyaW5nLgotCSogcmVzcmVzLmM6IEluY2x1ZGUgImJmZC5oIiwgImJ1Y29tbS5oIiwgImxpYmliZXJ0eS5oIiwgYW5kCi0JPHRpbWUuaD4uICBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiBhbmQgPGVycm5vLmg+LgotCSh3cml0ZV9yZXNfZmlsZSk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGUgYW5kIGkuCi0JKHJlYWRfcmVzb3VyY2VfZW50cnkpOiBSZW1vdmUgdW51c2VkIGxvY2FscyBydHlwZSBhbmQgbi4KLQkocmVhZF91bmlzdHJpbmcpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG4uCi0KLTE5OTktMDQtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhcnBhcnNlLnk6IERlY2xhcmUgeXlsZXguCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogSW5pdGlhbGl6ZSBieXRlcy4gIEFkZCBjb21tZW50Ci0JZm9yIGluY29ycmVjdCB1c2Ugb2YgYnl0ZXMuCi0JKiByZWFkZWxmLmM6IENoYW5nZSBtYW55IGZvcm1hdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLTE5OTktMDQtMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocmVzZXRfc3RhdGVfbWFjaGluZSk6IE5ldyBmdW5jdGlvbi4gIFJlc2V0cyB0aGUKLQlyZWdpc3RlcnMgb2YgdGhlIHNvdXJjZSBsaW5lIG51bWJlciBzdGF0ZSBtYWNoaW5lLgotCShwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3ApOiBVc2Ugc3RhdGUgbWFjaGluZS4KLQkoZGlzcGxheV9kZWJ1Z19saW5lcyk6IFVzZSBzdGF0ZSBtYWNoaW5lLiAgSGFuZGxlIG11bHRpcGxlIGxpbmUKLQludW1iZXIgYmxvY2tzIHdpdGhpbiB0aGUgc2FtZSBzZWN0aW9uLgotCi0xOTk5LTAzLTI5ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19leHRlbmRlZF9saW5lX29wKTogZW5kX3NlcXVlbmNlIGFsc28gcmVzZXRzCi0JdGhlIGxpbmUgbnVtYmVyLgotCShkaXNwbGF5X2RlYnVnX2xpbmVzKTogYWR2YW5jZV9saW5lIHRha2VzIGEgc2lnbmVkIG9wZXJhbmQuCi0JKHJlYWRfYW5kX2Rpc3BsYXlfYXR0cik6IFByaW50IHJlZnMgYXMgPCV4PiwgYWRkcmVzc2VzIGFzICUjeCwKLQlvdGhlcnMgYXMgJWQuICBIYW5kbGUgb3RoZXIgbG9jYXRpb24gZXhwcmVzc2lvbiBhdHRyaWJ1dGVzLgotCShkaXNwbGF5X2RlYnVnX2luZm8pOiBIYW5kbGUgbmVzdGluZy4gIEFsd2F5cyBwcmludCB0aGUJb2Zmc2V0LgotCi0xOTk5LTAzLTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IFdoZW4gY2hlY2tpbmcgd2hldGhlciB0byBrZWVwIGEKLQlzeW1ib2wsIGNoZWNrIHRoZSBCRkQgc2VjdGlvbiBzeW1ib2wgZm9yIGEgc3ltYm9sIHdpdGgKLQlCU0ZfU0VDVElPTl9TWU0gc2V0LgotCi0xOTk5LTAzLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IFByaW50IG5ldyBTb2xhcmlzIGR5bmFtaWMKLQlzZWN0aW9uIGVudHJpZXMuICBDb3JyZWN0IHByaW50aW5nIG9mIERUX1BPU0ZMQUdfMSBhbmQgRFRfRkxBR1NfMS4KLQotMTk5OS0wMy0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChyZXF1ZXN0X2R1bXApOiBOZXcgZnVuY3Rpb24uCi0JUmVtb3ZlZCBhcmJpdGFyeSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIHRoYXQgY2FuIGJlCi0JZHVtcGVkLgotCi1XZWQgTWFyIDEwIDE1OjEwOjE0IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1ha2Vfb25lX2xpYl9maWxlKTogVXNlICUwNWQgdG8gb3V0cHV0IHRoZSBzdHViIG5hbWUgc28KLQlvcmRlciBpbiB0aGUgaW1wb3J0IGxpYnJhcnkgaXMgcHJlc2VydmVkLgotCi0xOTk5LTAyLTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEZpeCBjb21waWxlIHRpbWUgd2FyaW5ncy4KLQotMTk5OS0wMi0xNyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiByZXNiaW4uYyAocmVzX3RvX2Jpbl92ZXJzaW9uaW5mbyk6IEluc3RlYWQgb2YgZW50ZXJpbmcgYSB2YWx1ZQotCWxlbmd0aCBvZiB6ZXJvIGluIGEgdmVyc2lvbiBpbmZvIHN0cmluZywgZW50ZXIgdGhlIGFwcHJvcHJpYXRlCi0JbGVuZ3RoLgotCi1UdWUgRmViIDE2IDE2OjAwOjMzIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTMuICBDaGFuZ2UgQU1fUFJPR19JTlNUQUxMIHRvCi0JQUNfUFJPR19JTlNUQUxMLiAgQWRkIGNvbW1lbnRzIGZvciBBQ19ERUZJTkUgY2FsbHMuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogQWRkIGRpc3BsYXkgb2YgYmFzaWMgdHlwZQotCWVuY29kaW5ncy4KLQkoZGlzcGxheV9kZWJ1Z19hcmFuZ2VzKTogTmV3IGZ1bmN0aW9uOiBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBhCi0JLmRlYnVnX2FyYW5nZXMgc2VjdGlvbi4KLQkoZGlzcGxheV9kZWJ1Z19pbmZvKTogRHVtcCB0YWdzIGZvdW5kIGFmdGVyIGNvbXB1bml0IGVudHJ5LgotCi0JKiBiaW51dGlscy50ZXhpOiBGaXhlZCBidWcgaW4gcmVhZGVsZiBkb2N1bWVudGF0aW9uLgotCi1Nb24gRmViICAxIDEyOjM4OjAxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogIEhhbmRsZSBFTV9BUk0gYXMgUkVMLgotCi0xOTk5LTAxLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogRG8gbm90IHByb2R1Y2UgYSBoaXN0b2dyYW0gb2YKLQlidWNrZXQgY2hhaW5zIGlmIG5vbmUgd2VyZSBmb3VuZC4KLQotMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdmVyc2lvbi5jOiBBZGQgMTk5OSBjb3B5cmlnaHQuCi0KLQkqIGJpbnV0aWxzLnRleGkgKHJlYWRlbGYpOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMKLQktLWRlYnVnLWR1bXAgYW5kIC0taGlzdG9ncmFtLgotCi0JKiByZWFkZWxmLmM6IEFkZCBhYmlsaXR5IHRvIGRpc3BsYXkgY29udGVudHMgb2Ygc29tZSBvciBhbGwgb2YgdGhlCi0JRHdhcmYyIGRlYnVnIHNlY3Rpb25zLiAge1dvcmsgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkfS4KLQkoZGlzcGxheV9kZWJ1Z19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9kZWJ1Z19saW5lKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2FiYnJldik6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19hYmJyZXZfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkocmVhZF9sZWIxMjgpOiBOZXcgZnVuY3Rpb24uCi0JKHByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCk6IE5ldyBmdW5jdGlvbi4KLQkoZ2V0X1RBR19uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfQVRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZ2V0X0ZPUk1fbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZnJlZV9hYmJyZXZzKTogTmV3IGZ1bmN0aW9uLgotCShhZGRfYWJicmV2KTogTmV3IGZ1bmN0aW9uLgotCShhZGRfYWJicmV2X2F0dHIpOiBOZXcgZnVuY3Rpb24uCi0JKHJlYWRfYW5kX2Rpc3BsYXlfYXR0cik6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9ibG9jayk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IEphbiAxNCAyMzozNjoxMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmZkdW1wLmMgKHhjYWxsb2MpOiBSZW1vdmUsIGluIGxpYmliZXJ0eSBub3cuCi0JKiBzcmNvbnYuYyAoeGNhbGxvYyk6IExpa2V3aXNlLgotCSogc3lzZHVtcC5jICh4Y2FsbG9jKTogTGlrZXdpc2UuCi0KLTE5OTktMDEtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMpOiBPbWl0IHRyYWlsaW5nIHNwYWNlIGF0IGVuZAotCW9mIHNlY3Rpb24gaGVhZGVyIGNvbnRlbnRzIGxpbmUuCi0KLVdlZCBEZWMgMTYgMTc6MjA6MDUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZS4KLQotTW9uIERlYyAxNCAxMjo1NTozNiAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGRsbHdyYXAuYzogSW5jbHVkZSBiZmQuaCBhbmQgYnVjb21tLmguICBNb3ZlIGdldG9wdC5oIGluY2x1ZGUKLQlhZnRlciBsaWJpYmVydHkuaCBpbmNsdWRlLgotCi1UdWUgRGVjICA4IDE2OjI5OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC4xOiBGaXggdHlwbyAoLWQgdG8gLUQpLiAgRnJvbSBOb2t1YmkgSGlyb3Rha2EKLQk8aG5va3ViaUB5eXkub3IuanA+LgotCi1TdW4gRGVjICA2IDEzOjI4OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChTRklMRSk6IEFkZCBzaXplIGZpZWxkLgotCShvYmpkdW1wX3NwcmludGYpOiBNZXJnZSBib3RoIHZlcnNpb25zIGludG8gb25lLiAgSW5jcmVhc2UgYnVmZmVyCi0Jc2l6ZSBhcyBuZWVkZWQgdG8gYXZvaWQgb3ZlcmZsb3cuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogQ2hhbmdlIGJ1ZiBmcm9tIDEwMDAgYnl0ZXMgdG8gNTAuICBDaGFuZ2UKLQlpbml0aWFsaXphdGlvbiBhbmQgdXNlIG9mIHNmaWxlIHRvIG1hdGNoIGNoYW5nZXMgdG8KLQlvYmpkdW1wX3NwcmludGYuCi0KLQkqIHN0cmlwLjE6IEZpeCB0eXBvICgtViB0byAtdikuICBGcm9tIElzc2VpIEhpcmF5YW1hCi0JPGlzc0BtYWlsLndicy5vci5qcD4uCi0KLTE5OTgtMTItMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogSW1wcm92ZSBvdXRwdXQgZm9ybWF0IGZvcgotCXZhcmlvdXMgRFRfKiB2YWx1ZXMuCi0KLTE5OTgtMTItMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IFByaW50IC5jb25mbGljdCBzZWN0aW9uCi0JY29udGVudC4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX21pcHNfc3BlY2lmaWMpOiBQcmludCBsX2ZsYWdzIGluIGxpYmxpc3QgaW4KLQl0ZXh0dWFsIGZvcm0uCi0KLTE5OTgtMTEtMzAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKGV4dHJhY3RfZmlsZSk6IEFkZCBzb21lIHBhcmFub2lhIGNoZWNrcyBmb3IgbmVnYXRpdmVseQotCXNpemVkIGZpbGVzLgotCi1UdWUgTm92IDI0IDA5OjM5OjI0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKERJUl9TRVBBUkFUT1IpOiBEZWZpbmUgYXMgJ1xcJyBpZiBXSU4zMiBpcyBkZWZpbmVkLgotCi1UdWUgTm92IDE3IDEwOjI1OjI2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi1Nb24gTm92IDE2IDE5OjE3OjIzIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vYmludXRpbHMucG90OiBSZWdlbmVyYXRlLgotCi1Nb24gTm92IDE2IDEwOjE4OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWdlcm5hdGVkIGRlcGVuZGVuY2llcy4KLQkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotU2F0IE5vdiAxNCAxNDo1MDo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlYnVnLmMgKGRlYnVnX25hbWVfdHlwZSk6IENvcnJlY3QgcmV0dXJuIHR5cGUgZnJvbSBmYWxzZSB0bwotCURFQlVHX1RZUEVfTlVMTC4KLQotU2F0IE5vdiAxNCAxNDo0ODoyMSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNraXAgb3ZlciByZWxvY3MgYmVsb3cgc3RhcnQKLQlhZGRyZXNzLgotCi1UdWUgTm92IDEwIDE1OjMxOjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgZGVwZW5kZW5jeSBvZiByZWFkZWxmLmMgb24gZWxmL2ZyMzAuaAotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLVdlZCBOb3YgIDQgMTY6MjU6NTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEZSMzAuCi0KLU1vbiBOb3YgIDIgMTQ6NTk6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLSAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotRnJpIE9jdCAzMCAxNToxNDo0OSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogZGxsd3JhcC5jOiBjaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gY3lnd2luMzJfIHRvIGN5Z3dpbl8sCi0JY2hhbmdlIEN5Z3dpbiB0YXJnZXQgZGVmIHRvIENZR1dJTi4KLQotV2VkIE9jdCAyOCAxMDozMToxOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBSZXBsYWNlICd1bnNpZ25lZCBsb25nJyB3aXRoCi0JJ2JmZF92bWEnLgotCi1UdWUgT2N0IDI3IDE0OjM5OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBBcHBsaWVkIHRoaXMgcGF0Y2ggZnJvbSBQaGlsaXAKLQlCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+OiAgTWFrZSBhZGRyZXNzIHZhcmlhYmxlcyB1bnNpZ25lZCB0bwotCWF2b2lkIHByb2JsZW1zIHdoZW4gZGlzYXNzZW1ibGluZyBjb2RlIGF0IGhpZ2gtYml0LXNldCBhZGRyZXNzZXMuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmMgKHN0cmhhc2gpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChtYWluKTogVXNlIGl0IHRvIHN1cHBseSBpbWFnZSBiYXNlIGlmIG5vdCBzdXBwbGllZCBieSB1c2VyLgotICAgICAgICAocHJvZ3JhbV92ZXJzaW9uKTogVXAgdG8gMC4yLjQuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx0b29sLmMgKGFkZF9zdGRjYWxsX2FsaWFzKTogTmV3IGdsb2JhbC4KLSAgICAgICAgKGxvbmdfb3B0aW9ucyk6IEFkZCAtLWFkZC1zdGRjYWxsLWFsaWFzIG9wdGlvbi4KLSAgICAgICAgKG1haW4pOiBIYW5kbGUgaXQuCi0gICAgICAgIChzY2FuX2RyZWN0dmVfc3ltYm9scyk6IEFkZCBhbGlhcyBpZiAtLWFkZC1zdGRjYWxsLWFsaWFzIGlzCi0gICAgICAgIHNwZWNpZmllZC4KLSAgICAgICAgKHNjYW5fZmlsdGVyZWRfc3ltYm9scyk6IExpa2V3aXNlLgotICAgICAgICAoZ2VuX2RlZl9maWxlKTogT3V0cHV0IGFsaWFzIGZvciBzdGRjYWxsIHN5bXMgaWYgYXBwcm9wcmlhdGUuCi0KLSAgICAgICAgKiBiaW51dGlscy50ZXhpIChkbGx0b29sKTogRG9jdW1lbnQgLS1hZGQtc3RkY2FsbC1hbGlhcyBvcHRpb24uCi0KLSAgICAgICAgKiBkbGx3cmFwLmMgKGxvbmdfb3B0aW9ucyk6IEFkZCAtLWFkZC1zdGRjYWxsLWFsaWFzIG9wdGlvbi4KLSAgICAgICAgKG1haW4pOiBIYW5kbGUgaXQuCi0KLSAgICAgICAgKiBkZWZwYXJzZS55IChvcHRfbmFtZSk6IEFsbG93ICIuIiBpbiBuYW1lLgotICAgICAgICAqIGRsbHRvb2wuYyAoZGVmX25hbWUpOiBTZXQgZGxsX25hbWUgZnJvbSBOQU1FIGVudHJ5IGluIGRlZiBmaWxlLgotICAgICAgICAoZGVmX2xpYnJhcnkpOiBTZXQgZGxsX25hbWUgZnJvbSBMSUJSQVJZIGVudHJ5IGluIGRlZiBmaWxlLgotCi1Nb24gT2N0IDI2IDE0OjA3OjU5IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0gICAgICAgICogZGxsd3JhcC5jIChsb25nX29wdGlvbnMpOiAtLWltcGxpYiBzeW5vbnltIGZvciAtLW91dHB1dC1saWIuCi0gICAgICAgIChtYWluKTogUGFzcyAtLWV4cG9ydC1hbGwgdG8gZGxsdG9vbCBvbmx5IGlmIHNwZWNpZmllZC4KLSAgICAgICAgKHByb2dyYW1fdmVyc2lvbik6IFVwIHRvIDAuMi4zLgotCi1Nb24gT2N0IDI2IDE0OjA3OjU5IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0gICAgICAgICogZGxsd3JhcC5jIChteWJhc2VuYW1lKTogTmV3IGZ1bmN0aW9uLgotICAgICAgICAobWFpbik6IFJ1biBkbGx0b29sIHRvIGNyZWF0ZSBleHBvcnQgZGVmaW5pdGlvbiBmaWxlIGFuZCBpbXBvcnQKLSAgICAgICAgbGlicmFyeSBmaWxlIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgQ2hhbmdlIGV4cF9maWxlX25hbWUgc28gdGhhdCBpdCdzIGJhc2VkIG9uIHRoZSBkbGwgbmFtZS4KLQotU3VuIE9jdCAyNSAxMDozNzo0NSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHRvb2wuYyAoc2Nhbl9hbGxfc3ltYm9scyk6IEZpeCBwYXRjaCBlcnJvci4KLQotRnJpIE9jdCAxNiAyMjo1NjoyMCAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKGRpc3BsYXlfcmVsX2ZpbGUpOiBmaXggIm5vIHN5bWJvbHMiIG1lc3NhZ2VzLgotCSogb2JqZHVtcC5jIChzbHVycF9zeW10YWIpOiBkaXR0by4KLQkqIHBvL1BPVEZJTEVTLmluLCBwby9iaW51dGlscy5wb3Q6IHJlYnVpbHQKLQotTW9uIE9jdCAxMiAxNDoyODowMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiBSZW5hbWUgZmllbGQgZnJvbSBWYWx1ZSB0byBJbmZvIHRvCi0JbWF0Y2ggbmFtZSBvZiBmaWVsZCBpbiBFTEYgc3RydWN0dXJlcy4KLQotVGh1IE9jdCAgOCAxNTozMzowOCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGNhbGwgQUNfRVhFRVhUIGluc3RlYWQgb2YgQU1fRVhFRVhUIGFuZAotCUFNX0NZR1dJTjMyLgotCSogYWNsb2NhbC5tNDogcmVtb3ZlIGxvY2FsIEFNX0VYRUVYVC9BTV9DWUdXSU4zMiBtYWNyb3MuCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVGh1IE9jdCAgOCAxNTozMzowOCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JRnJvbSBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT46Ci0gICAgICAgICogZGxsdG9vbC5jIChzY2FuX2FsbF9zeW1ib2xzKTogRG9uJ3QgcmUtZXhwb3J0IHN5bWJvbHMgZXhwb3J0ZWQKLSAgICAgICAgYnkgb3RoZXIgRExMcy4KLQotVGh1IE9jdCAgOCAxNTozMzowOCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQlVJTERfRExMV1JBUCk6IEFkZC4KLQkoQlVJTERfRExMV1JBUCwgRExMV1JBUF9QUk9HKTogQWRkLgotCShiaW5fUFJPR1JBTVMpOiBBZGQgZGxsd3JhcC4KLQkqIE1ha2VmaWxlLmluOiByZWdlbmVyYXRlIHdpdGggYXV0b21ha2UKLQotCUZyb20gTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+OgotICAgICAgICAqIGRsbHdyYXAuYzogTmV3IGZpbGUgZnJvbSBkbGxoZWxwZXJzIHYwLjIuMS4KLQkocHJpbnRfdmVyc2lvbik6IE5ldyBmdW5jdGlvbi4KLQkobG9uZ19vcHRpb25zKTogQWRkIC0tdmVyc2lvbi4KLQkobWFpbik6IEhhbmRsZS4KLSAgICAgICAgKiBkeW4tc3RyaW5nLmgsIGR5bi1zdHJpbmcuYzogTmV3IGZpbGVzIGZyb20gZWdjcy0xLjEvZ2NjLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQlVJTERfRExMV1JBUCk6IEFkZC4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBPY3QgIDYgMTg6MjA6MTAgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKHdpbmRyZXNfU09VUkNFUyk6IEFkZCByZXNyZXMuYy4KLQkod2luZHJlc19PQkpFQ1RTKTogQWRkIHJlc3Jlcy5vLgotCSogTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGUgd2l0aCBhdXRvbWFrZQotCi0gICAgICAgIEZyb20gQW5kZXJzIE5vcmxhbmRlciA8YW5vcmxhbmRAaGVtMi5wYXNzYWdlbi5zZT4uCi0gICAgICAgICogcmVzcmVzLmM6IE5ldyBmaWxlLiAgSW1wbGVtZW50YXRpb24gb2YgcmVhZF9yZXNfZmlsZSBhbmQKLSAgICAgICAgd3JpdGVfcmVzX2ZpbGUgZnVuY3Rpb25zIGZvciB3aW5kcmVzLgotICAgICAgICAqIHJjcGFyc2UueTogSGFuZGxlIENPTlRST0wncyB3aXRoIG5hbWVkIGNsYXNzZXMuCi0gICAgICAgICogcmVzYmluLmM6IEJ1ZyBpbiByZXNfdG9fYmluX2RpYWxvZyBhbmQgYmluX3RvX3Jlc19kaWFsb2cKLSAgICAgICAgd2hlbiBkaWFsb2cgaXMgZXh0ZW5kZWQ6IFRoZSB2ZXJzaW9uIGFuZCBzaWduYXR1cmUgZmllbGRzIHNob3VsZAotICAgICAgICBiZSByZXZlcnNlZCAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuIElkIGlzIDMyIGJpdHMgbG9uZyBpbgotICAgICAgICBleHRlbmRlZCBkaWFsb2dzLgotICAgICAgICAqIHJlc3JjLmMgKHdyaXRlX3JjX2RpYWxvZyk6IHByb3Blcmx5IHByaW50IGNvbnRyb2xzIHdpdGggbmFtZWQKLSAgICAgICAgY2xhc3Nlcy4KLSAgICAgICAgKiB3aW5kcmVzLmMgKHJlYWRfcmVzX2ZpbGUsIHdyaXRlX3Jlc19maWxlKTogUmVtb3ZlIHN0dWJzLgotICAgICAgICAqIHJlc3Jlcy5jICh3cml0ZV9yZXMpOiBSZW5hbWUgUlRfQUNDRUxFUkFUT1JTIHRvIFJUX0FDQ0VMRVJBVE9SLgotCi1TdW4gT2N0ICA0IDIwOjM0OjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gTm9rdWJpIEhpcm90YWthIDxobm9rdWJpQHl5eS5vci5qcD46Ci0JKiBvYmpjb3B5LjE6IEZpeCB0eXBvIGluIC0tcmVtb3ZlLWxlYWRpbmctY2hhciBkb2NzLgotCSogb2JqZHVtcC4xOiBGaXggZm9ybWF0dGluZyBpbiAtLXN0YWJzIGRvY3MuCi0KLVNhdCBTZXAgMTkgMjM6MzM6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByY3BhcnNlLnkgKG1lbWZsYWdzX21vdmUpOiBDb3JyZWN0IHJlY3Vyc2lvbi4KLQotMTk5OC0wOS0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBQcmludCBpbiBoaXN0b2dyYW0gaG93IG1hbnkKLQlzeW1ib2xzIGFyZSBjb3ZlcmVkIGJ5IHRoZSBjdXJyZW50IGNoYWluIGxlbmd0aC4KLQotU3VuIFNlcCAgNiAxNjoxNTo0NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyk6IERvIG5vdCB0cnkgdG8gZHVtcCBlbXB0eQotCXNlY3Rpb25zLgotCi1TYXQgU2VwICA1IDE5OjE3OjEwIDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBkbGx0b29sLmMgKHNjYW5fYWxsX3N5bWJvbHMpOiBEb24ndCByZS1leHBvcnQgc3ltYm9scyBleHBvcnRlZAotCWJ5IG90aGVyIERMTHMuCi0KLTE5OTgtMDktMDIgMTQ6NTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogUHJpbnQgRFRfKiB2YWx1ZSBvbmx5IGlmCi0JZG9fZHluYW1pYy4KLQkoZG9faGlzdG9ncmFtKTogTmV3IHZhcmlhYmxlLgotCShvcHRpb25zKTogTmV3IGxvbmcgb3B0aW9uIGhpc3RvZ3JhbS4gIFNldCBkb19oaXN0b2dyYW0gaWYgdGhpcwotCW9wdGlvbiBpcyB1c2VkLgotCSh1c2FnZSk6IERvY3VtZW50IC0taGlzdG9ncmFtLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIDAgcmV0dXJuIHZhbHVlIGZyb20gZ2V0b3B0X2xvbmcuICBFbmFibGUKLQlkb19oaXN0b2dyYW0gZm9yIC1hLgotCShwcm9jZXNzX3N5bWJvbF90YWJsZSk6IFJlYWQgaGFzaCB0YWJsZSBhbHNvIGlmIG9ubHkgZG9faGlzdG9ncmFtLgotCUFkZCBjb2RlIHRvIHByaW50IGhhc2ggdGFibGUgaGlzdG9ncmFtLgotCi0xOTk4LTA4LTI1IDE2OjQ1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IFJlYWQgc3ltaW5mbyBzZWN0aW9uIGlmCi0JYXZhaWxhYmxlLgotCShwcm9jZXNzX3N5bWluZm8pOiBOZXcgZnVuY3Rpb24uICBQcmludCBzeW1pbmZvIGluZm9ybWF0aW9uLgotCShwcm9jZXNzX2ZpbGUpOiBDYWxsIHByb2Nlc3Nfc3ltaW5mbyBhbmQgZnJlZSBzeW1pbmZvIGRhdGEgYXQgdGhlIGVuZC4KLQotV2VkIEF1ZyAxOSAxNjoxOTo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAodXNhZ2UpOiBBZGQgZmlsZSBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKG1haW4pOiBEb24ndCB0cmVhdCAnPycgYXMgYSBzcGVjaWFsIGNhc2UgaW4gZ2V0b3B0IHJldHVybi4KLQotCSogYmludXRpbHMudGV4aSAoZGxsdG9vbCk6IERvY3VtZW50IG5ldyBvcHRpb25zLiAgQWRkIHNvbWUgdXNlcyBvZgotCUB2YXIuCi0KLVdlZCBBdWcgMTkgMTY6MTk6MDcgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRsbHRvb2wuYyAoZ2VuX2RlZl9maWxlKTogUGx1ZyBtZW1vcnkgbGVhay4gIERvbid0IHByaW50Ci0JZGVtYW5nbGVkIG5hbWUgaWYgaXQgaXMgTlVMTC4KLQotCVN1cHBvcnQgZm9yIGV4cG9ydGluZyBhbGwgc3ltYm9scyB0byBhbiBvdXRwdXQgZXhwb3J0IGRlZiBmaWxlOgotCSogZGxsdG9vbC5jICh7ZXhwb3J0X2FsbF9zeW1ib2xzLCBub19kZWZhdWx0X2V4Y2x1ZGVzLAotCW5vX2RlZmF1bHRfZXhjbHVkZXMsIGV4Y2x1ZGVzfSk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBzdHJpbmdfbGlzdCk6IFR5cGUgdG8gaG9sZCBsaXN0IG9mIHN5bWJvbHMgdG8gZXhjbHVkZS4KLQkoc2Nhbl9kcmVjdHZlX3N5bWJvbHMpOiBSZW5hbWVkIGZyb20gc2Nhbl9vcGVuX29ial9maWxlLgotCShzY2FuX2ZpbHRlcmVkX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhZGRfZXhjbHVkZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYXRjaF9leGNsdWRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2V0X2RlZmF1bHRfZXhjbHVkZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmaWx0ZXJfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNjYW5fYWxsX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzY2FuX29wZW5fb2JqX2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCShsb25nX29wdGlvbnMpOiBBZGQgbmV3IG9wdGlvbnMuCi0JKG1haW4pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0KLTE5OTgtMDctMzEgMjE6MjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzKTogUHJpbnQgcF9vZmZzZXQgdmFsdWUgd2l0aAotCXNpeCBoZXggZGlnaXRzLgotCShkeW5hbWljX3NlZ21lbnRfbWlwc192YWwpOiBBZGQgc3VwcG9ydCBmb3IgRFRfTUlQU19GTEFHUywKLQlEVF9NSVBTX0lWRVJTSU9OLCBhbmQgRFRfTUlQU19USU1FX1NUQU1QLgotCShwcm9jZXNzX21pcHNfc3BlY2lmaWMpOiBBbHNvIHByaW50IHNlY29uZHMgb2YgdGltZSBzdGFtcC4KLQotRnJpIEp1bCAzMSAxMDowNDoyMyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6ICBFTV9BUk0gdXNlcyByZWxhIHJlbG9jcy4KLQotMTk5OC0wNy0zMCAxNjoyNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X2R5bmFtaWNfdHlwZSk6IERvbid0IHVzZWQgZ2V0dGV4dCBvbiB0aGUgbmFtZXMuCi0JQWRkIG5ldyBEVF8qIHZhbHVlcyBmcm9tIFNvbGFyaXMuICBEb24ndCBwcmludCBudWVtcmljIHZhbHVlIGluCi0JY2FzZSBvZiBhbiB1bmtub3duIGVudHJ5LgotCShwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IEhhbmRsZSBuZXcgRFRfKiBlbnRyaWVzLiAgUHJpbnQgbnVtZXJpYwotCXZhbHVlcyBpbiBkZWNpbWFsLCBub3QgaGV4LgotCi1GcmkgSnVsIDI0IDE2OjI4OjU3IDE5OTggIEplZmYgSG9sY29tYiAgPGplZmZoQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X2R5bmFtaWNfdHlwZSk6IFJlbW92ZSBlbXB0eSBkZWZhdWx0IGZyb20gc3dpdGNoCi0Jc3RhdGVtZW50LgotCi1GcmkgSnVsIDI0IDE2OjI4OjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IHJlbW92ZSB0aGUgZmlsZSBiZWZvcmUKLQljaGVja2luZyB3aGV0aGVyICQoYmluZGlyKSA9PSAkKHRvb2xkaXIpL2Jpbi4gIEZyb20gTWFjaWVqCi0JVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEp1bCAyNCAwOTozODo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmM6IFJlbW92ZWQgc3B1cmlvdXMgaW5jbHVzaW9uIG9mIGVsZi9pbnRlcm5hbC5oIGFuZAotCWVsZi1iZmQuaC4KLQotMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQ29uc2lzdGFudGx5IHVzZSBlbGZfIHByZWZpeCBmb3IgKl9yZWxvY190eXBlCi0JZnVuY3Rpb25zLgotCi1XZWQgSnVsIDIyIDE2OjI5OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFkZCBkdW1wcyBvZiBIUFBBIGFuZCBBUkMKLQlyZWxvY2F0aW9ucy4KLQotCShwcm9jZXNzX3JlbG9jcyk6IERvIG5vdCBhYm9ydCBpZiBubyBzdHJpbmcgdGFibGUgY2FuIGJlIGZvdW5kLgotCi0xOTk4LTA3LTIyIDE0OjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBSZW1vdmUgZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgdG8gcmV0dXJuIHJlbG9jYXRpb24KLQlzeW1ib2wgc3RyaW5ncy4gIFRoZXkgbm93IGdldCBpbXBsaWNpdGx5IGRlZmluZWQgd2hlbiBpbmNsdWRlIHRoZQotCXN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyLgotCi0xOTk4LTA3LTIyIDEzOjUxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBCZWZvcmUgaW5jbHVkZSBzeXN0ZW0gc3BlY2lmaWMgRUxGIGhlYWRlciBkZWZpbmUKLQlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIGFuZCBFTkRfUkVMT0NfTlVNQkVSUy4gIEZvciBub3cKLQl1c2VkIGZvciBwcGMsIG1pcHMsIGFuZCBtbjEwMzAwLgotCi1XZWQgSnVsIDIyIDEwOjI2OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IERpc3BsYXkgbnVtYmVyIG9mIHVucmVjb2duaXNlZAotCXJlbG9jYXRpb25zLgotCi0xOTk4LTA3LTIxIDEzOjEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBVc2Ugc3ltYm9saWMgbmFtZXMgb2YgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGUgdmFyaW91cwotCWFyY2hpdGVjdHVyZXMuICBDb3JyZWN0IG1vcmUgbGF5b3V0IGRldGFpbHMuCi0JUHJpbnQgbmFtZXMgb2YgTUlQUyBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgUHJpbnQgQWxwaGEsIEFSTSwgYW5kCi0JTUlQUyByZWxvY2F0aW9uIHR5cGUgbmFtZXMuCi0KLTE5OTgtMDctMjAgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogQWRkIGNvZGUgZm9yIHN0cmlwIGFsbCBzeW1ib2xzIGNhc2UuCi0gICAgICAgIChjb3B5X29iamVjdHMpOiBTdHJpcCBhbGwgY2FzZSBpcyBub3cgcHJvY2Vzc2VkIGFsc28gdGhyb3VnaAotCWZpbHRlcl9zeW1ib2xzLiAgTm8gbWFya2luZyBzeW1ib2xzIHVzZWQgaW4gcmVsb2NhdGlvbnMgd2hlbiBzdHJpcAotCWFsbCBzeW1ib2xzIGNhc2UuCi0JKGNvcHlfc2VjdGlvbik6IFdoZW4gc3RyaXAgYWxsIHN5bWJvbHMgY2FzZSwgcmVtb3ZlIHJlbG9jYXRpb25zCi0Jd2hpY2ggYXJlIG5vdCBpbiBrZWVwIHN0cmlwIHNwZWNpZmljIGxpc3QuCi0JKHN0cmlwX21haW4pOiBSZW1vdmUgZ3VhcmQgYHN0cmlwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCcgZm9yCi0Jc2V0dGluZyB1cCBzdHJpcCBhbGwgc3ltYm9scyBieSBkZWZhdWx0LgotCi1Nb24gSnVsIDIwIDEyOjUxOjE2IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBhZGRyMmxpbmUuYyAoZmluZF9hZGRyZXNzX2luX3NlY3Rpb24pOiBPbmx5IGNvbnNpZGVyIGEgc2VjdGlvbgotCWlmIHRoZSBwYyB2YWx1ZSBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gaXQuCi0JKHRyYW5zbGF0ZV9hZGRyZXNzZXMpOiBEb24ndCBjcmFzaCBpZiBmdW5jdGlvbm5hbWUgb3IgZmlsZW5hbWUgYXJlCi0JbnVsbC4KLQotMTk5OC0wNy0yMCAwNzo0NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBGaXggbGl0dGxlIGFsaWdubWVudCBwcm9ibGVtCi0JaW4gcHJpbnRlZCB0YWJsZSBoZWFkZXIuCi0KLTE5OTgtMDctMjAgMDc6MTQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IENvcnJlY3QgcmVhZGluZyBvZiAuZHluYW1pYyBzZWN0aW9uLgotCShkeW5hbWljX3NlY3Rpb24pOiBOb3cgYSBnbG9iYWwgdmFyaWFibGUuCi0JKHByb2Nlc3NfbWlwc19mcGVfZXhjZXB0aW9uLCBwcm9jZXNzX21pcHNfc3BlY2lmaWMsCi0JcHJvY2Vzc19hcmNoX3NwZWNpZmljKTogTmV3IGZ1bmN0aW9ucy4KLQkoZ2V0X2ZpbGVfaGVhZGVyKTogQ2FsbCBwcm9jZXNzX2FyY2hfc3BlY2lmaWMuCi0KLTE5OTgtMDctMTkgMTU6MTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEZpeCBzZXZlcmFsIHZlcnNpb25pbmcgcmVsYXRlZCBidWdzLiAgUHJvZHVjZSBuaWNlcgotCW91dHB1dC4KLQlBZGQgc3VwcG9ydCBmb3IgcHJvY2Vzc29yIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIE1JUFMuCi0KLUZyaSBKdWwgMTAgMTU6NTc6NTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBTd2l0Y2ggcHJvdG90eXBlcyBmcm9tIHVuc2lnbmVkIHNob3J0IHRvIHVuc2lnbmVkCi0JaW50LgotCi1GcmkgSnVsIDEwIDE2OjE3OjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQ2hyaXN0aWFuIEhvbGxhbmQgPENIb2xsYW5kQGRlLmx1Y2VudC5jb20+OgotCSogaWVlZS5jIChwYXJzZV9pZWVlKTogSW5pdGlhbGl6ZSBpbmZvLmdsb2JhbF92YXJzIGFuZAotCWluZm8uZ2xvYmFsX3R5cGVzLgotCShwYXJzZV9pZWVlX2F0bik6IElnbm9yZSByZWdpc3RlciBsaWZldGltZSBpbmZvcm1hdGlvbiByZXBvcnRlZGx5Ci0JZW1pdHRlZCBieSBNUkkgY29tcGlsZXIuCi0KLVRodSBKdWwgIDkgMTM6MDg6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTUFJTlRBSU5FUkNMRUFORklMRVMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1bCAgNyAyMTo0ODo1NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHJlYWRlbGYuYyAoYnl0ZV9nZXQpOiBVc2UgUEFSQU1TIGluIHByb3RvdHlwZS4KLQkoZXJyb3IpOiBNYWtlIGl0IHdvcmsgd2l0aCBub24tQU5TSSBjb21waWxlcnMuCi0JKHdhcm4pOiBMaWtld2lzZS4KLQkoZ2V0X3Zlcl9mbGFncyk6IERvbid0IHVzZSBhbiBBTlNJIHByb3RvdHlwZSBpbiB0aGUgZGVmaW5pdGlvbi4KLQotVHVlIEp1bCAgNyAxMzoyNjoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogU2V0IHNpemUgY29ycmVjdGx5IGlmIHRoZSBzaXplIG9mIHRoZQotCXNlY3Rpb24gaXMgbm90IGFuIGV2ZW4gbXVsdGlwbGUgb2YgdGhlIGludGVybGVhdmUuICBCYXNlZCBvbiBwYXRjaAotCWZyb20gQnJpb24gU3RvbmUgPEJyaW9uLlN0b25lQGF0dHdzLmNvbT4uCi0KLVRodSBKdWwgIDIgMTQ6MDE6MzQgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IEFkZCB2YXgvdm1zIHN1cHBvcnQuCi0JKiBtYWtlZmlsZS52bXMtaW46IFJlbmFtZWQgZnJvbSBtYWtlZmlsZS52bXMuICBBZGQgc3Vic3RpdHV0aW9ucwotCW5vdyBkb25lIGJ5IGNvbmZpZ3VyZS5jb20uCi0KLVdlZCBKdWwgIDEgMjA6NDM6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBIYW5kbGUgNCBhbmQgOCBieXRlIHNpZ25lZAotIAlpbnRlZ2VycyB3aXRoIHJlYWwgdXBwZXIgYm91bmRzLiAgSGFuZGxlIGEgbG93ZXIgYm91bmQgb25lIGxhcmdlcgotIAl0aGFuIHRoZSB1cHBlciBib3VuZCBhcyBhIHNpZ25lZCBpbnRlZ2VyLiAgSGFuZGxlIDggYnl0ZSBzaWduZWQKLQlpbnRlZ2Vycy4KLQkoc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSk6IE9wdGlvbmFsbHkgcmV0dXJuIHRoZSBkZW1hbmdsZWQgbmFtZSBvZgotCXRoZSB0ZW1wbGF0ZS4KLQkoc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQpOiBUcmVhdCBhIHRlbXBsYXRlIG5hbWUgYXMgYSB0YWdnZWQKLQl0eXBlLgotCShzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSk6IExpa2V3aXNlLgotCi1XZWQgSnVsICAxIDE2OjI5OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogTWlub3IgZm9ybWF0dGluZyBpbXByb3ZlbWVudHMuCi0JKiByZWFkZWxmLmM6IE1pbm9yIG91dHB1dCBmb3JtYXR0aW5nIGltcHJvdmVtZW50LgotCi1XZWQgSnVsICAxIDE0OjIzOjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmNsZXgubDogQWRkIGNhc3RzIGFuZCBjaGFuZ2UgdHlwZXMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiByY3BhcnNlLnk6IExpa2V3aXNlLgotCSogcmVzYmluLmM6IExpa2V3aXNlLgotCSogcmVzY29mZi5jOiBMaWtld2lzZS4KLQkqIHJlc3JjLmM6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShIRklMRVMpOiBSZW1vdmUgcmVhZGVsZi5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gQW5kcmV3IEtvemluCi0JPEFuZHJldy5Lb3ppbkBwMTQuZjk2MC5uNTAyMC56Mi5maWRvbmV0Lm9yZz46Ci0JKiB3aW5kdW5pLmg6IE5ldyBmaWxlLCBmcm9tIHdpbmRyZXMuaC4KLQkqIHdpbmR1bmkuYzogTmV3IGZpbGUsIGZyb20gd2luZHJlcy5jLgotCSogd2luZHJlcy5jOiBNb3ZlIFVuaWNvZGUgZnVuY3Rpb25zIGludG8gd2luZHVuaS5jLgotCSogd2luZHJlcy5oOiBNb3ZlIFVuaWNvZGUgZGVjbGFyYXRpb25zIGludG8gd2luZHVuaS5oLiAgSW5jbHVkZQotCXdpbmR1bmkuaC4KLSAJKFJUX0FDQ0VMRVJBVE9SKTogUmVuYW1lIGZyb20gUlRfQUNDRUxFUkFUT1JTIHRvIG1hdGNoIFdpbmRvd3MKLQltYWNyby4gIENoYW5nZSBhbGwgdXNlcy4KLQkoUlRfUExVR1BMQVksIFJUX1ZYRCk6IENvcnJlY3QgdmFsdWVzLgotCSogTWFrZWZpbGUuYW0gKEhGSUxFUyk6IEFkZCB3aW5kcmVzLmguCi0JKENGSUxFUyk6IEFkZCB3aW5kdW5pLmMuCi0JKHdpbmRyZXNfU09VUkNFUyk6IEFkZCB3aW5kdW5pLmMuCi0KLU1vbiBKdW4gMjkgMTc6MDE6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBVc2UgQkZEIEludGVybmFsIGFuZCBFeHRlcm5hbCBFbGYgc3RydWN0dXJlcy4KLQkqIHJlYWRlbGYuaDogUmVtb3ZlZCAtIG5vIGxvbmdlciBuZWVkZWQuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlYWRlbGYuYydzIGRlcGVuZGVuY3kgdXBvbiByZWFkZWxmLmguCi0KLTE5OTgtMDYtMjYgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4pOiBrZWVwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCBhcyBhZGRpdGlvbmFsCi0JY29uZGl0aW9uIHRvIHNldCB1cCBzdHJpcCBhbGwgc3ltYm9scyBieSBkZWZhdWx0LgotCShjb3B5X2FyY2hpdmUpOiBkb24ndCBjaGFuZ2UgYXJjaGl2ZSB3aGVuIGVycm9yIGluIG9iamVjdCBmaWxlcyBvZgotCXRoZSBhcmNoaXZlLgotCi1XZWQgSnVuIDI0IDE3OjUzOjQ3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2VfbnVtYmVyKTogU2lnbiBleHRlbmQgbmVnYXRpdmUgdmFsdWVzIGNvcnJlY3RseSBpZgotCWJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gdW5zaWduZWQgbG9uZy4KLQotVHVlIEp1biAyMyAxNDo1NTowNSAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQotCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1biAyMyAxMTowODo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFJld3JpdGUgdG8gdXNlIGZvcGVuL2ZyZWFkIHJhdGVociB0aGFuIG1tYXAuCi0KLQlBZGQgLS1zZWN0aW9uLWhlYWRlcnMgY29tbWFuZCBsaW5lIHN3aXRjaCwgd2hpY2ggaXMgYW4gYWxpYXMgZm9yCi0JLS1zZWN0aW9ucy4KLQotCUluY29ycG9yYXRlIGltcHJvdmVtbnRzIG1hZGUgYnkgQW5kcmVhcyBTY2h3YWIKLQk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPiBpbmNsdWRpbmcgb3V0cHV0Ci0JZm9ybWF0dGluZyBhbmQgdmVyc2lvbiBpbmZvIGRpc3BsYXkuCi0KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC0tc2VjdGlvbi1oZWFkZXJzIHN3aXRjaCB0byByZWFkZWxmLgotCi1Nb24gSnVuIDIyIDE4OjI4OjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBJbmNsdWRlIGJmZC5oIGFuZCBidWNvbW0uaCBiZWZvcmUgc3lzdGVtIGhlYWRlcgotCWZpbGVzLgotCShwYXJzZV9hcmdzKTogQ2hhbmdlIHR5cGUgb2YgYyBmcm9tIGNoYXIgdG8gaW50LgotCi1TdW4gSnVuIDE0IDE0OjI2OjI4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAodXNhZ2UpOiBXcml0ZSB0byBzdGRvdXQsIG5vdCBzdGRlcnIuCi0KLUZyaSBKdW4gMTIgMTM6MzM6NTEgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogRGVwZW5kIG9uIC5wb3QgZmlsZSBpZiBtYWludGFpbmVyIG1vZGUKLQllbmFibGVkLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLUZyaSBKdW4gMTIgMTY6MDY6MTUgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3BwY19yZWxfdHlwZSk6IE5ldyBQb3dlclBDIHN1cHBvcnQuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBQb3dlclBDIHVzZXMgUkVMQSByZWxvY2F0aW9ucy4KLQkoZ2V0X21hY2hpbmVfbmFtZSk6IFNwZWxsIFBvd2VyUEMgY29ycmVjdGx5LgotCShnZXRfZmlsZV90eXBlKTogQ2hhbmdlIHVuc2lnbmVkIHNob3J0IHBhcmFtZXRlciB0byB1bnNpZ25lZC4KLQkoZ2V0X21hY2hpbmVfbmFtZSk6IERpdHRvLgotCShnZXRfbWFjaGluZV9kYXRhKTogUmV0dXJuIHdoZXRoZXIgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuLgotCShnZXRfbWFjaGluZV9mbGFncyk6IEludGVycHJldCBQb3dlclBDLCBNMzJSLCBhbmQgTUlQUyBmbGFncy4KLQkocHJvY2Vzc19lbGZfaGVhZGVyKTogUHJpbnQgZW5kaWFuLWVzcy4gIENvbnZlcnQgYWxsIG51bWVyaWMKLQlmb3JtYXRzIHRvIGxvbmcgb3IgdW5zaWduZWQgbG9uZy4gIFByaW50IG91dCBtYWNoaW5lIHNwZWNpZmljIGZsYWcKLQliaXRzLgotCShwcm9jZXNzX3NlY3Rpb25faGVhZGVycyk6IEluY3JlYXNlIG5hbWUgYnkgMyBjb2x1bW5zIGFuZCBkZWNyZWFzZQotCXR5cGUgYnkgdGhlIHNhbWUgc28gdGhhdCAuZ2NjX2V4Y2VwdF90YWJsZSBmaXRzIGluIHRoZSBzcGFjZS4KLQotCSogcmVhZGVsZi5oOiBJbmNsdWRlIGVsZi9wcGMuaCwgZWxmL21pcHMuaCwgYW5kIGVsZi9tMzJyLmggdG8gZ2V0Ci0JbWFjaGluZSBzcGVjaWZpYyBmbGFnIGJpdHMuCi0KLVRodSBKdW4gMTEgMTc6NTQ6MjYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBSZW1vdmUgZXh0cmFuZW91cyAjaW5jbHVkZXMuICBGaXggd2FybmluZ3MgcHJvZHVjZWQKLQlieSAtV2FsbCB3aGVuIGNvbXBpbGluZyB1bmRlciBMaW51eC4KLQotCSogTWFrZWZpbGUuYW0gKHJlYWRlbGZfTERBREQpOiBBZGQgJChMSUJJQkVSVFkpLgotCi1UaHUgSnVuIDExIDE4OjMwOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIHNlbGZfY3Jvc3NyZWYgZmllbGQuCi0JKHBhcnNlX3N0YWJfc3RyaW5nKTogSWYgYSB0YWcgaXMgYSBjcm9zcyByZWZlcmVuY2UgdG8gaXRzZWxmLAotCWRvbid0IGRlZmluZSBpdCBpbiB0aGUgdGFncyBsaXN0LgotCShwYXJzZV9zdGFiX3R5cGUpOiBTZXQgaW5mby0+c2VsZl9jcm9zc3JlZi4KLQotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0KTogRGVmaW5lLgotCShkZWJ1Z19nZXRfcmVhbF90eXBlKTogQWRkIGxpc3QgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCUNoZWNrIGZvciBjaXJjdWxhcml0eSB0byBhdm9pZCBjcmFzaGluZyB3aGVuIGl0IG9jY3Vycy4KLQotVGh1IEp1biAxMSAxNDo0ODozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IE5ldyBmaWxlOiBEaXNwbGF5IGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZS4KLQkqIHJlYWRlbGYuaDogTmV3IGZpbGU6IEhlYWRlciBmaWxlIGZvciByZWFkZWxmLmMKLQkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZXMgdG8gYnVpbGQgcmVhZGVsZi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgcmVhZGVsZi4KLQkqIE5FV1M6IE1lbnRpb24gaW5jbHVzaW9uIG9mIHJlYWRlbGYgaW50byBiaW51dGlscy4KLQkqIHBvL1BPVEZJTEVTLmluOyBSZWJ1aWx0LgotCi1GcmkgSnVuICA1IDE4OjQzOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzZXR1cF9zZWN0aW9uKTogQWRqdXN0IHRoZSBzZWN0aW9uIHNpemUgaWYgY29weV9ieXRlCi0JaXMgPj0gMC4KLQkoY29weV9zZWN0aW9uKTogRG8gbm90IGNhbGwgYmZkX3NldF9zZWN0aW9uX3NpemUuCi0KLVRodSBKdW4gIDQgMDk6MTI6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogQWRkIG1pc3NpbmcgXG5cIGZyb20gaGVscCBkZXNjcmlwdGlvbi4KLQotV2VkIEp1biAgMyAxOTozMTozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChZQUNDKTogQ29ycmVjdCBiaXNvbiAtTCBvcHRpb24uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtcC8tLXByaXZhdGUtaGVhZGVycy4KLQotV2VkIEp1biAgMyAxMjowOTo0MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmM6IEFkZCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnM6IC0tY2hhbmdlLXNlY3Rpb24tbG1hCi0JYW5kIC0tY2hhbmdlLXNlY3Rpb24tdm1hLiAgUmVuYW1lIG9sZCBjb21tYW5kIGxpbmUgb3B0aW9uCi0JLS1hZGp1c3Qtc2VjdGlvbi12bWEgdG8gLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzLiAgUmVuYW1lCi0JLS1hZGp1c3Qtdm1hIHRvIC0tY2hhbmdlLWFkZHJlc3NlcyBhbmQgLS1hZGp1c3Qtc3RhcnQgdG8KLQktLWNoYW5nZS1zdGFydC4gIFByb3ZpZGUgYWxpYXNlcyB0byBzdXBwb3J0IHRoZSBvbGQgdmVyc2lvbnMgb2YKLQl0aGVzZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQotCUNoYW5nZSB0aGUgbmFtZXMgb2YgbWFjcm9zIGFuZCBlbnVtIGVsZW1lbnRzIHRvIHVwcGVyIGNhc2UgdG8KLQltYXRjaCB0aGUgR05VIGNvZGluZyBzdGFuZGFyZC4KLQotCVJlcGxhY2UgY2FsbHMgdG8gZnByaW50ZiAoc3RkZXJyLC4uLikgd2l0aCBjYWxscyB0byBmYXRhbCAoKSBvcgotCW5vbl9mYXRhbCAoKSBhcyBhcHByb3ByaWF0ZS4KLQotCSogb2JqY29weS4xOiBEb2N1bWVudCBjb21tYW5kIGxpbmUgb3B0aW9uIGNoYW5nZXMuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBjb21tYW5kIGxpbmUgb3B0aW9uIGNoYW5nZXMuCi0KLQkqIGJ1Y29tbS5oOiBOZXcgZXhwb3J0ZWQgZnVudGlvbiBmcm9tIGJ1Y29tbS5jOiBub25fZmF0YWwoKS4KLQkqIGJ1Y29tbS5jIChub25fZmF0YWwpOiBOZXcgZXhwb3J0ZWQgZnVuY3Rpb24uICBKdXN0IGxpa2UgZmF0YWwoKQotCWV4Y2VwdCB0aGF0IGl0IHJldHVybnMgcmF0aGVyIHRoYW4gY2FsbGluZyB4ZXhpdCgpLgotCi0JKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IENhbGwgZmF0YWwoKSByYXRoZXIgdGhhbiBiZmRfZmF0YWwoKS4KLQotCShjaGVja19tYXRjaGluZ19mb3JtYXRzKTogRml4IEMgZm9ybWF0aW5nLgotCi0JKHBhcnNlX3ZtYSk6IENhbGwgZmF0YWwoKS4KLQotTW9uIEp1biAgMSAxODoyNjo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFl1bGkgQmFyY29oZW4gPHl1bGkuYmFyY29oZW5AdGVscmFkLmNvLmlsPjoKLQkqIGRlYnVnLmMgKGRlYnVnX3R5cGVfc2FtZXApOiBBdm9pZCBlbmRsZXNzIGxvb3BzIGNvbXBhcmluZwotCWZ1bmN0aW9uIGFuZCBtZXRob2QgcGFyYW1ldGVyIHR5cGVzLgotCi1GcmkgTWF5IDIyIDE0OjAyOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChkdW1wX2lhdCk6IENvbW1lbnQgb3V0OyBub3QgdXNlZC4KLQkoZGlzcGxheSk6IFJlbmFtZSBmcm9tIHRlbGwuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0KLVRodSBNYXkgMTQgMTQ6MDA6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jOiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgRExMcy4gIEFkZCBzdXBwb3J0IGZvcgotCWludGVyd29ya2luZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgcHJvZ3JhbXMgYW5kIERMTHMuICBUaWR5IHRoZQotCWNvZGUuCi0KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGRsbHRvb2wuCi0KLQkqIGNvbmZpZ3VyZTogQnVpbGQgZGxsdG9vbCBmb3IgdGh1bWItcGUgdGFyZ2V0cy4KLQotCSogdmVyc2lvbi5jIChwcmludF92ZXJzaW9uKTogSW5jbHVkZSAxOTk4IGluIGNvcHlyaWdodCBzdHJpbmdzLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiKTogU3VwcG9ydCBXaW4zMiBzdHlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9ycy4KLQotU3VuIE1heSAxMCAyMjozNDo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLUZyaSBNYXkgIDggMTA6MzM6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXIuYyAodXNhZ2UpOiBFeHRlbmQgaW5mb3JtYXRpb24gcHJvdmlkZWQgYWJvdXQgY29tbWFuZCBsaW5lCi0Jb3B0aW9ucy4KLQotV2VkIE1heSAgNiAxNToyODo1MSAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBSdW4gZGVjIGMgd2l0aCAvbm9kZWJ1Zy4gIFBhc3MgQ0MgdmFsdWUgd2hlbgotCWNhbGxpbmcgbWFrZS4KLQotVHVlIE1heSAgNSAxNToxOTowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEJ1aWxkIGRsbHRvb2wgZm9yIHRodW1iLXBlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZGxsdG9vbCBmb3IgdGh1bWItcGUgdGFyZ2V0LgotCi1TdW4gTWF5ICAzIDIyOjA0OjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX1BST0dSQU1TKTogQ2hhbmdlICQoU1JDT05WX1BST0cpIHRvIHN5c2NvbmYKLQlzeXNkdW1wIGNvZmZkdW1wIHRvIGF2b2lkIGV4dHJhICQoRVhFRVhUKS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgQXByIDI5IDIyOjIyOjU1IDE5OTggIEdlb2ZmcmV5IE5vZXIgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTdG9wIGFwcGVuZGluZyBFWEVFWFQgdG8gdGhlIGVuZCBvZgotCVNSQ09OVl9QUk9HICh3cm9uZyBiZWNhdXNlIHRoYXQgdmFyaWFibGUgbWF5IGNvbnRhaW4gbXVsdGlwbGUKLQlwcm9ncmFtcykKLQkqIE1ha2VmaWxlLmFtOiBpbnN0ZWFkLCBhZGQgRVhFRVhUcyB0byBlYWNoIFNSQ09OVl9QUk9HCi0JcHJvZ3JhbQotCSogTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGUKLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgQXByIDI4IDE5OjE0OjM0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgotCSogd2luZHJlcy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzeXNkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3Jjb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5tLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogZGxsdG9vbC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBjb2ZmZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhci5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBidWNvbW0uaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCi0JKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgotCi1UdWUgQXByIDI4IDEwOjMzOjA3IDE5OTggIEJpbGwgTW95ZXIgIDx0dGtAY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBJTVBPUlRTOgotCSogZGVmcGFyc2UueSAoaW1wbGluZSk6IEFkZCBJTVBPUlRTIHN5bnRheGVzLgotCSogZGxsdG9vbC5jIChpZnVuY3R5cGUsIGloZWFkdHlwZSk6IE5ldyB0eXBlZGVmcy4KLQkoaW1wb3J0X2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhcHBlbmRfaW1wb3J0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGVmX2ltcG9ydCk6IEFkZCBhbiBlbnRyeSB0byBpbXBvcnRfbGlzdC4KLQkoZ2VuZXJhdGVfaWRhdGFfb2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnZW5fZXhwX2ZpbGUpOiBDYWxsIGdlbmVyYXRlX2lkYXRhX29maWxlLgotCSogZGxsdG9vbC5oIChkZWZfaW1wb3J0KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1Nb24gQXByIDI3IDE2OjM5OjIyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEFwciAyMiAxNjowMDozNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCi0KLVdlZCBBcHIgMjIgMDA6MzM6NTYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBzY3JpYmJsZXMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogU2VhcmNoIGludGwgZGlycyBmb3IgaGVhZGVyczsgZGVmaW5lCi0JTE9DQUxFRElSLgotCSogYWRkcjJsaW5lLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIHRleHRkb21haW4uCi0JKiBhci5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBjb2ZmZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBkbGx0b29sLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3Jjb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3lzZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBMaWtld2lzZS4KLQotVHVlIEFwciAyMSAyMjoxMzowOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYW55IGZpbGVzOiBBZGRlZCBnZXR0ZXh0IGludm9jYXRpb25zIGFyb3VuZCB1c2VyLXZpc2libGUKLQlzdHJpbmdzLgotCSogYnVjb21tLmg6IEFkZGVkIGdldHRleHQtcmVsYXRlZCBpbmNsdWRlcyBhbmQgZGVmaW5lcy4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLiAgVXNlIEFNX1BST0dfTEVYLgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBOZXcgbWFjcm8uCi0JKFBPVEZJTEVTKTogTGlrZXdpc2UuCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkoTERBREQpOiBBZGRlZCBJTlRMTElCUy4KLQkob2JqZHVtcF9MREFERCk6IExpa2V3aXNlLgotCShjX19maWx0X0xEQUREKTogTGlrZXdpc2UuCi0JKGFyX0xEQUREKTogTGlrZXdpc2UuCi0JKHJhbmxpYl9MREFERCk6IExpa2V3aXNlLgotCShkbGx0b29sX0xEQUREKTogTGlrZXdpc2UuCi0JKHdpbmRyZXNfTERBREQpOiBMaWtld2lzZS4KLQkqIHBvL01ha2UtaW4sIHBvL1BPVEZJTEVTLmluLCBwby9iaW51dGlscy5wb3Q6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAyMSAxNjowNzoxOCAxOTk4ICBTdGFuaXNsYXYgQnJhYmVjICA8dXR4QGszMzIuZmVsZC5jdnV0LmN6PgotCi0JKiBvYmpjb3B5LmMgKHByZXNlcnZlX2RhdGVzKTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShzbWFydF9yZW5hbWUpOiBJZiBwcmVzZXJ2ZV9kYXRlcywgY2FsbCBzZXRfdGltZXMgd2hlbiBjb3B5aW5nLgotCShzdHJpcF9tYWluKTogUmVtb3ZlIHByZXNlcnZlX2RhdGVzIGxvY2FsIHZhcmlhYmxlLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQotVHVlIEFwciAgNyAxNTo0MToxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChESVNUU1RVRkYpOiBBZGQgZGVmcGFyc2UuaCwgZGVmcGFyc2UuYywgcmNsZXguYywKLQlyY3BhcnNlLmgsIGFuZCByY3BhcnNlLmMKLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByICA2IDE2OjI0OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFBST0dTKTogTW92ZSAkKEFERFIyTElORV9QUk9HKSB0byBlbmQsIHNvIHRoYXQKLQlNYWtlZmlsZS5pbiBkb2Vzbid0IGhhdmUgYW4gZW1wdHkgY29udGludWF0aW9uIGxpbmUuCi0JKGJpbl9QUk9HUkFNUyk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDMgMTQ6NDg6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBBZGQgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLgotCShNT1NUTFlDTEVBTkZJTEVTKTogQWRkIGJpbnV0aWxzLmxvZywgYmludXRpbHMuc3VtLCBhbmQgYWJjZGVmZ2gqLgotCShtb3N0bHljbGVhbi1sb2NhbCk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEFwciAgMSAxNTo1NDoxNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFphY2sgV2VpbmJlcmcgPHphY2tAcmFiaS5waHlzLmNvbHVtYmlhLmVkdT4gYW5kIEguSi4gTHUKLQk8aGpsQGdudS5vcmc+OgotCSogYXIuYyAodXNhZ2UpOiBNZW50aW9uIFMgbW9kaWZpZXIuCi0JKG1haW4pOiBBZGQgUyBtb2RpZmllci4KLQkqIGFyLjEsIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IFMgbW9kaWZpZXIuCi0KLVdlZCBBcHIgIDEgMTM6MTE6MjMgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IFVzZSBAaXRlbXggZm9yIGEgc2Vjb25kYXJ5IGl0ZW0gaW4gYSB0YWJsZS4KLQotVHVlIE1hciAzMSAxODo0NDoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlcC1pbi5zZWQ6IEFkZCBydWxlIHRvIHJlbW92ZSBAT0JKRElSQC4KLQkqIE1ha2VmaWxlLmFtIChkZXAuc2VkKTogU3Vic3RpdHV0ZSBmb3IgQE9CSkRJUkAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIE1hciAzMCAxMjo0NzoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogUmVtb3ZlIGRlZnBhcnNlLmgsIGFycGFyc2UuaCwKLQlyY3BhcnNlLmgsIGFuZCBubG1oZWFkZXIuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TYXQgTWFyIDI4IDE3OjM5OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIG5sbWNvbnYuYyAobWFpbik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkoYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkqIHNpemUuYyAocHJpbnRfc3lzdl9mb3JtYXQpOiBMaWtld2lzZS4KLQkqIHNyY2NvbnYuYyAod3Jfb2IpOiBMaWtld2lzZS4KLQkqIHdyc3RhYnMuYyAoc3RhYl9tb2RpZnlfdHlwZSk6IExpa2V3aXNlLgotCShzdGFiX3ZhcmlhYmxlKTogTGlrZXdpc2UuCi0JKiBubG1jb252LmMgKG1haW4pOiBJbml0aWFsaXplIHZhcmlhYmxlcyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIG5tLmMgKHNvcnRfc3ltYm9sc19ieV9zaXplKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogTGlrZXdpc2UuCi0JKiB3cnN0YWJzLmMgKHN0YWJfZW5kX2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQkqIGNvZmZncm9rLmMgKGRvX3NlY3Rpb25zX3AyKTogQ2hhbmdlIGogdG8gdW5zaWduZWQgaW50LgotCShkb19saW5lcyk6IENoYW5nZSBsIHRvIHVuc2lnbmVkIGludC4KLQkqIG5sbWhlYWRlci55ICh5eWxleCk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkqIG5tLmMgKHByaW50X3N5bWJvbCk6IENoYW5nZSBqIHRvIGxvbmcuCi0JKiBzaXplLmMgKGxwcmludF9udW1iZXIpOiBDb21tZW50IG91dC4KLQkqIHNyY29udi5jICh3cl9vYik6IENoYW5nZSBpIHRvIGJmZF9zaXplX3R5cGUuCi0JKiBzeXNkdW1wLmMgKHVuaXRfaW5mb19saXN0KTogQ29tbWVudCBvdXQuCi0JKG9iamVjdF9ib2R5X2xpc3QsIHByb2dyYW1fc3RydWN0dXJlLCBkZWJ1Z19saXN0KTogTGlrZXdpc2UuCi0JKiBzeXNpbmZvLnkgKHl5ZXJyb3IpOiBSZXR1cm4gdmFsdWUuCi0KLVRodSBNYXIgMjYgMTc6MDY6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZGVmcGFyc2UueSAoZXhwbGlzdCk6IEFsbG93IGVwc2lsb24uCi0JU3VnZ2VzdGlvbiBmcm9tIEpvbmF0aGFuLUhhcnJpc0Bwc2lvbi5jb20uCi0KLVRodSBNYXIgMjYgMTY6NTk6MDkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29mZmdyb2suYyAoZG9fc2VjdGlvbnNfcDEpOiBVc2UgdGhlIHNlY3Rpb24ncyBsbWEgaW5zdGVhZCBvZiB2bWEKLQlmb3IgdGhlIGJlbmVmaXQgb2YgcHJvbSBsb2FkZXJzLgotCi1XZWQgTWFyIDI1IDEzOjA1OjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSAgPGhqbEBnbnUub3JnPjoKLQkqIE1ha2VmaWxlLmFtIChESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUuCi0JKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKERJU1RDTEVBTkZJTEVTKTogTmV3IHZhcmlhYmxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBNYXIgMjQgMTk6MzM6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByY2xleC5sOiBBY2NlcHQgeyBhbmQgfSBhcyBzeW5vbnltcyBmb3IgQkVHSU4gYW5kIEVORC4KLQotRnJpIE1hciAyMCAxOToxODowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1UdWUgRmViIDI0IDEzOjA3OjUwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IERlbGV0ZSAiKytwbGFjZSIgYWZ0ZXIgY2FsbCB0bwotCWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzLiAgU2V0IGRpc2FzbV9pbmZvLnN5bWJvbHMgdG8gYXJyYXkgb2YKLQlzeW1ib2xzIGF0IHRoZSBjdXJyZW50IGFkZHJlc3MuCi0KLVdlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgotCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgotCi1UdWUgRmViIDE3IDE4OjQwOjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29tcGFyZV9zZWN0aW9uX2xtYSk6IFJlbmFtZSBmcm9tIF92bWEuCi0gICAgICAgIChjb3B5X29iamVjdCk6IEdhcCBmaWxsIGJhc2VkIG9uIExNQSBub3QgVk1BLgotCSogYmludXRpbHMudGV4aTogVXBkYXRlIGFuZCBjbGFyaWZ5LgotCSogb2JqY29weS4xOiBMaWtld2lzZS4KLQotVHVlIEZlYiAxNyAyMDozNDoxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZ2VuX2V4cF9maWxlKTogR2VuZXJhdGUgX2ltcF9fJXMgYXMgd2VsbCBhcyBfX2ltcF8lcywKLQlmb3IgTWljcm9zb2Z0IGNvbXBhdGliaWxpdHkuCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogTGlrZXdpc2UuCi0KLQkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBEb24ndCBhZGQgMSB0byBoaW50LgotCi1GcmkgRmViIDEzIDE2OjM3OjQ0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQotVGh1IEZlYiAxMiAxNDoxMzo0NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlZmxleC5sOiBBY2NlcHQgJz8nIGluIHN5bWJvbCBuYW1lcywgZm9yIFZDKysgbWFuZ2xlZCBuYW1lcy4KLQlGcm9tIE1pa2V5IDxqZWZmZGJAbmV0em9uZS5jb20+LgotCi0JKiBhZGRyMmxpbmUuYyAodXNhZ2UpOiBVcGRhdGUgYnVnLWdudS11dGlscyBhZGRyZXNzLgotCSogYXIuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAoc2hvd191c2FnZSk6IExpa2V3aXNlLgotCSogbm0uYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IExpa2V3aXNlLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc2l6ZS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogd2luZHJlcy5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogYmludXRpbHMudGV4aSAoQnVnIFJlcG9ydGluZyk6IExpa2V3aXNlLgotCi1TYXQgRmViICA3IDE1OjM2OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVRodSBGZWIgIDUgMTI6MjE6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLUZyaSBKYW4gMzAgMTk6MTY6MjggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENDX0ZPUl9UQVJHRVQsbmxtY29tdi5vKTogQ2hhbmdlIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKLQl0byB0cmFuc2Zvcm0uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotVGh1IEphbiAyOSAxNjoyNDowNCAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogZGxsdG9vbC5jOiBEZWZpbmUgZXhpdCBzdGF0dXMgbWFjcm9zIGZvciBfV0lOMzIgYnV0IG5vdAotCV9fQ1lHV0lOMzJfXy4KLQkoZ2VuX2xpYl9maWxlKTogQ2hlY2sgZm9yIGV4aXQgc3RhdHVzIG9mIHVubGluay4KLQkqIHJlc3JjLmM6IERlZmluZSBwb3BlbiBhbmQgcGNsb3NlIGlmIF9XSU4zMiBidXQgbm90Ci0JX19DWUdXSU4zMl9fLgotCi1XZWQgSmFuIDI4IDE3OjQ1OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgdmZvcmsgY2hlY2suCi0JKiBubG1jb252LmM6IE5ldmVyIGluY2x1ZGUgdmZvcmsuaC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGNvbmZpZy5pbjogUmVidWlsZC4KLQotV2VkIEphbiAyOCAxNzo0MzowMiAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IE9ubHkgcGFzcyBvbmUgYXJndW1lbnQgdG8gbWtkaXIgaWYKLQlfV0lOMzIgYnV0IG5vdCBfX0NZR1dJTjMyX18uCi0JKHNtYXJ0X3JlbmFtZSk6IEFkZCBjb2RlIGZvciBfV0lOMzIgKG5vdCBfX0NZR1dJTjMyX18pLCB0byBjb3BlCi0Jd2l0aCBkaWZmZXJlbnQgcmVuYW1lIGJlaGF2aW91ciBhbmQgbGFjayBvZiBjaG93bi4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgbWluZ3czMiB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gYnVpbGQKLQlkbGx0b29sLgotCSogZGxsdG9vbC5jOiBOZXZlciBpbmNsdWRlIHZmb3JrLmguCi0JKHJ1bik6IFVzZSBwZXhlY3V0ZSByYXRoZXIgdGhhbiB2Zm9yay4KLQkoZ2VuX2xpYl9maWxlKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9zZXRfYXJjaGl2ZV9oZWFkIGFuZAotCWJmZF9jbG9zZS4gIENsb3NlIGFsbCB0aGUgQkZEcyBpbiB0aGUgYXJjaGl2ZSBiZWZvcmUgZGVsZXRpbmcgdGhlCi0JdGVtcG9yYXJ5IGZpbGVzLgotCi1UaHUgSmFuIDIyIDE2OjIyOjU1IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogQWRkIGZsYWcgSU5TTl9IQVNfUkVMT0MgdG8gdGVsbAotCWRpc2Fzc2VtYmx5IGZ1bmN0aW9uIHRoZXJlIGlzIGEgcmVsb2Mgb24gdGhpcyBsaW5lLgotCi1XZWQgSmFuIDE0IDE1OjI5OjQzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jIChzaCwgaDgzMDApOiBEZWxldGUgdmFyaWFibGVzLgotCShhZGRyc2l6ZSwgdG9vbG5hbWUsIHJuYW1lcyk6IE5ldyB2YXJpYWJsZXMuCi0JKHdyaXRlSU5UKTogVXNlIGFkZHJzaXplLgotCSh3cl91bik6IFVzZSB0b29sbmFtZS4KLQkod3JfaGQpOiBTZXQgdXAgYWRkcnNpemUgZXQgYWwgcHJvcGVybHkgZm9yIGg4MzAwW2hzXS4KLQkod2Fsa190cmVlX3N5bWJvbCk6IFplcm8gZHN5LiAgVXNlIHJuYW1lcy4KLQkod3JfdW4sIHdyX2hkLCB3cl9vYiwgd3JfZHUpOiBVc2UgcHJvcGVyIGJmZCBhY2Nlc3MgbWFjcm9zLgotCSogc3lzZHVtcC5jIChzaCwgaDgzMDApOiBEZWxldGUgdmFyaWFibGVzLgotCShhZGRyc2l6ZSk6IE5ldyB2YXJpYWJsZS4KLQkoZ2V0SU5UKTogVXNlIGl0LgotCShnZXRvbmUpOiBJbml0aWFsaXplIGl0LgotCShnZXRCSVRTKTogUmFuZ2UgY2hlY2sgb24gTUFYLgotCi1Nb24gRGVjIDI5IDE2OjU4OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gTWF0dGhldyBCZWxsYW50b25pIDxtYXR0aGV3QGNocnlzYWxpcy5jb20+OgotCSogYXIuYyAoZ2V0X3Bvc19iZmQpOiBBZGQgZGVmYXVsdF9wb3NuYW1lIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShyZXBsYWNlX21lbWJlcnMpOiBEZWZhdWx0IHRvIHJlcGxhY2luZyBpbiB0aGUgc2FtZSBwb3NpdGlvbi4KLQotTW9uIERlYyAyMiAxMToyNzoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJjbGV4Lmw6IERvbid0IHBlcm1pdCBhIGNvbW1hIGluIGEgU1RSSU5HLgotCSogcmNwYXJzZS55IChhY2NfZW50cnkpOiBXYXJuIGlmIGFuIGluYXBwcm9wcmlhdGUgbW9kaWZpZXIgaXMgdXNlZAotCXdpdGggYSBub24gVklSVEtFWS4KLQkoYWNjX2V2ZW50KTogRm9yIGEgY29udHJvbCBjaGFyYWN0ZXIsIHNldCBWSVJUS0VZLCBhbmQgZm9yY2UgdGhlCi0JY2hhcmFjdGVyIHRvIHVwcGVyY2FzZS4KLQkoYWNjX29wdGlvbnMpOiBEb24ndCByZXF1aXJlIGEgY29tbWEgc2VwYXJhdG9yLgotCi1UdWUgRGVjICA5IDEzOjI1OjQyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaXplLmMgKHNpemVfbnVtYmVyKTogTmV3IGZ1bmN0aW9uIHRvIHByb3ZpZGUgc2l6ZSBvZiBmaWVsZC4KLQkoe2wscn1wcmludF9udW1iZXIpOiBGb3Igb2N0YWwgYW5kIGhleCBmaWVsZHMsIHByaW50IGZpZWxkIHVzaW5nCi0JJzAnIGFuZCAnMHgnIHN1ZmZpeGVzLiAgRG8gbm90IGluY2x1ZGUgZm9sbG93aW5nIHRhYi4KLQkoc3lzdl9pbnRlcm5hbF9zaXplcik6IFNpemUgc2VjdGlvbiBuYW1lLCBzZWN0aW9uIHNpemUsIGFuZCB2bWEKLQlhZGRyZXNzIGZpZWxkcy4KLQkoc3lzdl9pbnRlcm5hbF9wcmludGVyKTogVXNlIGNhbGN1bGF0ZWQgc2l6ZXMgZm9yIHRoZSBjb2x1bW5zLgotCShwcmludF9zeXN2X2Zvcm1hdCk6IFNpemUgY29sdW1ucyBiZWZvcmUgcHJpbnRpbmcuCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCk6IFByaW50IHRhYnMgYmV0d2VlbiBudW1iZXJzIG5vdyB0aGF0Ci0Je2wscn1wcmludF9udW1iZXIgZG9lc24ndC4gIFByaW50IGZpZWxkcyByaWdodCBqdXN0aWZpZWQuCi0KLU1vbiBEZWMgIDggMTE6MjI6MDQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBSZW1vdmUgY2FsbCB0bwotCWRpc2FzbV9zeW1hZGRyKCkgYXMgdGhpcyBmdW5jdGlvbiBubyBsb25nZXIgZXhpc3RzLgotCi1UdWUgRGVjICAyIDEwOjIzOjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogQ2FsbCBkaXNhc21fc3ltYWRkcigpCi0JdG8gYWxsb3cgYmFja2VuZCB0byBrbm93IHdoaWNoIHN5bWJvbCBoYXMganVzdCBiZWVuIGRpc3BsYXllZC4KLQotVHVlIERlYyAgMiAxMzowNjo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuaCAoRVNDQVBFXyopOiBEZWZpbmUgc3RhbmRhcmQgZXNjYXBlIHNlcXVlbmNlcy4KLQkqIHJjbGV4LmwgKGhhbmRsZV9xdW90ZXMpOiBIYW5kbGUgc3RhbmRhcmQgZXNjYXBlIHNlcXVlbmNlcy4gIFdhcm4KLQlhYm91dCBhbiB1bnJlY29nbml6ZWQgZXNjYXBlIGNoYXJhY3Rlci4KLQkqIHdpbmRyZXMuYyAodW5pY29kZV9wcmludCk6IFByaW50IHN0YW5kYXJkIGVzY2FwZSBzZXF1ZW5jZXMuCi0JKiByY3BhcnNlLnkgKGFjY19ldmVudCk6IEluaXRpYWxpemUgJCQubmV4dC4KLQkqIHJlc2Jpbi5jIChiaW5fdG9fcmVzX21lbnVpdGVtcyk6IERvbid0IHNldCBNRU5VSVRFTV9QT1BVUCBvcgotCU1FTlVJVEVNX0VORE1FTlUgaW4gdGhlIG1lbnUgaXRlbSBmbGFncy4KLQkoYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMpOiBBbGxvY2F0ZSBhIHN0cnVjdHVyZSAodGhlIG9sZCBjb2RlCi0JbmV2ZXIgd29ya2VkKS4KLQkocmVzX3RvX2Jpbl9hY2NlbGVyYXRvcik6IENvcnJlY3QgdGhlIHRlc3QgZm9yIHNldHRpbmcgQUNDX0xBU1QuCi0JKHJlc190b19iaW5fZGlhbG9nKTogU2F2ZSB0aGUgZXh0ZW5kZWQgc3R5bGUgcmF0aGVyIHRoYW4gc2F2aW5nCi0JdGhlIHN0eWxlIHR3aWNlLiAgUmVtb3ZlIHVzZWxlc3Mgc2hhZG93aW5nIGxlbmd0aCB2YXJpYWJsZS4gIFNldAotCXRoZSBsZW5ndGggb2YgY29udHJvbCBkYXRhIGNvcnJlY3RseS4KLQkqIHJlc3JjLmMgKHdyaXRlX3JjX2RpYWxvZyk6IERvbid0IHByaW50IHRoZSBjbGFzcyBvciBtZW51IGlmIHRoZQotCXN0cmluZyBsZW5ndGggaXMgemVyby4KLQotTW9uIE5vdiAyNCAxODo1Mjo0MyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9hcmd0eXBlcyk6IERvbid0IHRyeSB0byBwYXJzZSB0aGUgbmFtZSBvZiBhCi0JZGVzdHJ1Y3RvciBhcyBtYW5nbGVkIGFyZ3VtZW50IHR5cGVzLgotCi1Nb24gTm92IDEwIDE3OjUxOjQxIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAodHJhbnNsYXRlX2FkZHJlc3Nlcyk6IFVzZSBiZmRfc2Nhbl92bWEgcmF0aGVyCi0JdGhhbiBzdHJ0b2wgdG8gc2NhbiBhZGRyZXNzZXMuCi0KLVN1biBOb3YgIDkgMTE6MDE6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogRG9uJ3QgdXNlIGxpbmUgY29udGludWF0aW9ucyBoZXJlLgotCi1UdWUgTm92ICA0IDExOjU2OjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X3NlY3Rpb24pOiBEb24ndCBjcmFzaCBpZiB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyCi0JaW5mb3JtYXRpb24gZm9yIGEgc2VjdGlvbi4KLQotTW9uIE5vdiAgMyAxMjozNjoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAocGFyc2VfZmxhZ3MpOiBNYWtlIGZsYWcgY2hlY2sgY2FzZSBpbnNlbnNpdGl2ZS4KLQlDaGVjayBmb3IgYGNvbnRlbnRzJyBmbGFnLiAgR2l2ZSBhbiBlcnJvciBmb3IgdW5yZWNvZ25pemVkIGZsYWdzLgotCShjb3B5X3NlY3Rpb24pOiBJZiB0aGUgY29udGVudHMgZmxhZyB3YXMgc2V0IGZvciBhIHNlY3Rpb24gdGhhdAotCWhhZCBubyBjb250ZW50cywgemVybyBvdXQgdGhlIG5ldyBjb250ZW50cy4KLQkqIGJpbnV0aWxzLnRleGkgKG9iamNvcHkpOiBEb2N1bWVudCBjb250ZW50cyBzZWN0aW9uIGZsYWcuCi0KLVN1biBOb3YgIDIgMTQ6NDk6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmM6IE1vdmUgbmV3IHN0cnVjdCBhbmQgdmFyaWFibGUgZGVmaW5pdGlvbnMgdG8gdG9wIG9mCi0JZmlsZS4gIFJlbW92ZSBvYnNvbGV0ZSBhZGRfc3RyaXBfc3ltYm9sIGFuZCBpc19zdHJpcF9zeW1ib2wKLQlkZWNsYXJhdGlvbnMuICBBZGQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgYWRkX3NwZWNpZmljX3N5bWJvbAotCWFuZCBpc19zcGVjaWZpZWRfc3ltYm9sLgotCi1Nb24gT2N0IDIwIDE1OjMxOjQzIDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWd1cmUuY29tIChIQVZFX1NCUkspOiBVbmRlZmluZS4KLQotVHVlIE9jdCAxNCAxNjoxNDozNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfc3ltYm9sX2F0X2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uICBSZXR1cm5zCi0JdHJ1ZSBpZiBhIHN5bWJvbCBjYW4gYmUgZm91bmQgYXQgdGhlIGFkZHJlc3MgcGFzc2VkIGluLgotCShkaXNhc3NlbWJsZV9kYXRhKTogU2V0IHRoZSBzeW1ib2xfYXRfYWRkcmVzc19mdW5jIGZpZWxkIHRvIHBvaW50Ci0JdG8gb2JqZHVtcF9zeW1ib2xfYXRfYWRkcmVzcy4KLQotRnJpIE9jdCAxMCAxNDoxMzowOSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMsIG9iamNvcHkuMSwgYmludXRpbHMudGV4aTogImxvY2FsaXplIiBpcyBhIGJldHRlciBuYW1lCi0JdGhhbiAicHJpdmF0aXplIi4gIFVwZGF0ZSBhbGwgcmVmZXJlbmNlcy4KLQotVGh1IE9jdCAgOSAxNTo1NzoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkgKHN0cmlwKTogUmVtb3ZlIGR1cGxpY2F0ZSAtLXRhcmdldC4gIEZyb20gTWFydHkKLQlMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KLQotCSogbm0uYyAobGluZW5vX2NhY2hlX2JmZCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkobGluZW5vX2NhY2hlX3JlbF9iZmQpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGRpc3BsYXlfYXJjaGl2ZSk6IENsZWFyIGxpbmVub19jYWNoZV9iZmQgYW5kIGxpbmVub19jYWNoZV9yZWxfYmZkCi0Jd2hlbiBjbG9zaW5nIGEgQkZELgotCShkaXNwbGF5X2ZpbGUpOiBMaWtld2lzZS4KLQkocHJpbnRfc3ltYm9sKTogVXNlIGxpbmVub19jYWNoZV9iZmQgYW5kIGxpbmVub19jYWNoZV9yZWxfYmZkCi0JaW5zdGVhZCBvZiBjYWNoZV9iZmQgYW5kIGNhY2hlX3JlbF9iZmQuICBNYWtlIHNlY2NvdW50IHN0YXRpYywgYW5kCi0Jb25seSBzZXQgaXQgd2hlbiBzZXR0aW5nIHJlbG9jcy4KLQotV2VkIE9jdCAgOCAyMToxOToxMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGtlZXBfc3BlY2lmaWNfbGlzdCwgcHJpdmF0aXplX3NwZWNpZmljX2xpc3QsCi0Jd2Vha2VuX3NwZWNpZmljX2xpc3QpOiBOZXcgdmFyaWFibGVzLgotCShrZWVwX3N5bWJvbHMpOiBSZW1vdmVkLgotCShhZGRfc3BlY2lmaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uIGZyb20gdGhlIGNhcmNhcyBvZgotCWFkZF9zdHJpcF9zeW1ib2wuICBUYWtlcyBhIGxpc3QgYXMgYW4gYXJndW1lbnQuCi0JKGlzX3NwZWNpZmllZF9zeW1ib2wpOiBMaWtld2lzZSBmcm9tIGlzX3N0cmlwX3N5bWJvbC4KLQkoZmlsdGVyX3N5bWJvbHMpOiBIb25vciB0aGUgbmV3IHByaXZhdGl6ZSBhbmQgd2Vha2VuIGxpc3RzLgotCU9wdGltaXplIGJmZF9hc3ltYm9sX25hbWUgaGFuZGxpbmcuCi0JKGNvcHlfb2JqZWN0LCBjb3B5X29wdGlvbnMsIGNvcHlfdXNhZ2UpOiBBZGQgcHJpdmF0aXplLXN5bWJvbCAmCi0Jd2Vha2VuLXN5bWJvbCBvcHRpb25zLgotCi0JKiBvYmpjb3B5LjEsIGJpbnV0aWxzLnRleGk6IFVwZGF0ZSBkb2NzLgotCi1TdW4gT2N0ICA1IDA5OjA1OjQ0IDE5OTcgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IE1ha2UgIi0tcHJlZml4LWFkZHJlc3NlcyIKLSAJZGlzYXNzZW1ibHkgYWRqdXN0IHRvIG1peGVkLWxlbmd0aCBpbnN0cnVjdGlvbnMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IEFkZCAiMHgiIHByZWZpeCBmb3IgaGV4YWRlY2ltYWwKLSAJc3ltYm9sLW9mZnNldHMgaW4gZGlzYXNzZW1ibHkuCi0KLUZyaSBPY3QgIDMgMTI6MDQ6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNldF90aW1lcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHJlcGxhY2luZwotCW1ha2Vfc2FtZV9kYXRlcy4KLQkoc3RyaXBfbWFpbik6IElmIHByZXNlcnZlX2RhdGVzLCBzdGF0IHRoZSBpbnB1dCBmaWxlIGJlZm9yZQotCWNvcHlpbmcgaXQsIGFuZCBjYWxsIHNldF90aW1lcyBhZnRlcndhcmQuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCi0JKiB3cnN0YWJzLmMgKHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvKTogQ2FzdCBwIHRvCi0JY2hhciAqIHdoZW4gY2FsbGluZyBzdHJjcHkgYW5kIHN0cmxlbi4KLQotV2VkIFNlcCAyNCAxMTozNDowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkJKGFyIGNtZGxpbmUpOiBEb2N1bWVudCB0aGF0IHEgbm93IHdvcmtzIGxpa2Ugci4KLQlGcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgotCi0JKiBiaW51dGlscy50ZXhpIChzaXplKTogVGhlIG9iamVjdCBmaWxlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLgotCUZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT4uCi0KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEF1ZyAyNiAxNzo0ODozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWEVFWFRfRk9SX0JVSUxEKTogTmV3IHZhcmlhYmxlLiAgVXNlIGl0IGluIGFsbAotCXJlZmVyZW5jZXMgdG8gdGhlIHN5c2luZm8gcHJvZ3JhbS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVidWlsZCB3aXRoIG5ldyBiZmQvYWNpbmNsdWRlLm00LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDggMTU6MzI6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmM6IEluY2x1ZGUgPHRpbWUuaD4uCi0JKGRlZmluZV9yZXNvdXJjZSk6IFNldCBhIHRpbWVzdGFtcCBmb3IgdGhlIHJlc291cmNlLgotCi1XZWQgQXVnICA2IDEzOjM3OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgVEFSR0VUIGluIGhlYWRlciBmaWxlLgotCSogYWNjb25maWcuaCAoVEFSR0VUKTogQWRkICN1bmRlZi4KLQkqIE1ha2VmaWxlLmFtICh2ZXJzaW9uLm8sIGJ1Y29tbS5vKTogUmVtb3ZlIHNwZWNpYWwgdGFyZ2V0cy4KLQkqIGJ1Y29tbS5jICh0YXJnZXQpOiBSZW1vdmUuCi0JKiBubS5jIChwcm9ncmFtX25hbWUpOiBEb24ndCBkZWNsYXJlLgotCSh0YXJnZXQpOiBNYWtlIHN0YXRpYy4KLQkqIHNpemUuYyAodGFyZ2V0KTogTWFrZSBzdGF0aWMuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbiwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBBdWcgIDUgMDA6MDE6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2stREVKQUdOVSk6IEV4cG9ydCByLgotCSguZGVwMSk6IFVzZSAkKElOQ0xVREVTKSByYXRoZXIgdGhhbiAkKEFMTF9DRkxBR1MpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIG5sbWhlYWRlci55OiBVc2UgVkVSU0lPTksgcmF0aGVyIHRoYW4gVkVSU0lPTi4KLQotCSogTWFrZWZpbGUuYW0gKFNUUklQX1BST0cpOiBDaGFuZ2UgZnJvbSBzdHJpcC5uZXcgdG8gc3RyaXAtbmV3LgotCShOTV9QUk9HKTogQ2hhbmdlIGZyb20gbm0ubmV3IHRvIG5tLW5ldy4KLQkoVE9PTF9QUk9HUywgaW5zdGFsbC1leGVjLWxvY2FsKTogQWRqdXN0IGFjY29yZGluZ2x5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBdWcgIDQgMTE6NDc6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBBQ19BUkdfUFJPR1JBTTsgaXQncyBpbnZva2VkIGJ5Ci0JQU1fSU5JVF9BVVRPTUFLRS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IENyZWF0ZSAkKHRvb2xkaXIpL2JpbiBiZWZvcmUKLQl0cnlpbmcgdG8gaW5zdGFsbCBhbnl0aGluZyBpbnRvIGl0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmFtIChUT09MX1BST0dTKTogVXNlIGFuIGV4cGxpY2l0ICQoRVhFRVhUKS4KLQkoaW5zdGFsbC1leGVjLWxvY2FsKTogV2hlbiBoYW5kbGluZyAkKG5vaW5zdF9QUk9HUkFNUyksIG9ubHkgdXNlCi0JJChFWEVFWFQpIG9uIHRoZSBpbnN0YWxsZWQgZmlsZS4gIFdoZW4gaGFuZGxpbmcgJChUT09MX1BST0dTKSwKLQloYW5kbGUgJChFWEVFWFQpIGNvcnJlY3RseS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGFuIGV4cGxpY2l0ICQoRVhFRVhUKSB3aGVuIHN1YnN0aXR1dGluZyBmb3IKLQl0aGUgbmFtZSBvZiBhIHByb2dyYW0gdG8gYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlCi0JcGF0Y2hlcy4KLQotCSogZGVmbGV4LmwsIGRlZnBhcnNlLnk6IFVzZSBWRVJTSU9OSyByYXRoZXIgdGhhbiBWRVJTSU9OLgotCSogcmNsZXgubCwgcmNwYXJzZS55OiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtICh3aW5kcmVzX1NPVVJDRVMpOiBBZGQgJChCVUxJQlMpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDEgMTM6MDg6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IEluY2x1ZGUgYmZkL2FjaW5jbHVkZS5tNCwgbm90IGJmZC9hY21hY3Jvcy5tNC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UaHUgSnVsIDMxIDExOjUxOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLCBmcm9tIG9sZCBhY2xvY2FsLm00LgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX0lOSVRfQVVUT01BS0UgYW5kIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZQotCXNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZQotCUFDX0NPTkZJR19IRUFERVIgd2l0aCBBTV9DT05GSUdfSEVBREVSLiAgQ2FsbCBBQ19QUk9HX1lBQ0MsCi0JQUNfUFJPR19MRVgsIEFDX0RFQ0xfWVlURVNULCBBTV9NQUlOVEFJTkVSX01PREUsIEFNX0NZR1dJTjMyLCBhbmQKLQlBTV9FWEVFWFQuICBSZXBsYWNlIEFDX1BST0dfSU5TVEFMTCB3aXRoIEFNX1BST0dfSU5TVEFMTC4gIFJlbW92ZQotCXN0YW1wLWggaGFuZGxpbmcgaW4gQUNfT1VUUFVULgotCSogYWNjb25maWcuaDogTWVudGlvbiBQQUNLQUdFIGFuZCBWRVJTSU9OLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQlGcm9tIFRvbiB2YW4gT3ZlcmJlZWsgPHR2b3ZlcmJlQHdrLmVzdGVjLmVzYS5ubD46Ci0JKiByY3BhcnNlLnkgKGRpYWxvZyk6IERlZmF1bHQgbWVudSBhbmQgY2xhc3MgdG8gYmUgbmFtZWQuCi0JKHN0eWxlcyk6IElmIEZPTlQgaXMgc2Vlbiwgc2V0IERTX1NFVEZPTlQgaW4gZGlhbG9nIHN0eWxlLgotCSogcmVzYmluLmMgKHJlc190b19iaW5fZGlhbG9nKTogQ29ycmVjdCBjb21wdXRhdGlvbiBvZiBmb250Ci0JaW5mb3JtYXRpb24gbGVuZ3RoLgotCi1XZWQgSnVsIDMwIDExOjIxOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gVG9uIHZhbiBPdmVyYmVlayA8dHZvdmVyYmVAd2suZXN0ZWMuZXNhLm5sPjoKLQkqIHJlc2Jpbi5jIChyZXNfdG9fYmluX21lbnUpOiBDb3JyZWN0IGNvbXB1dGF0aW9uIG9mIG1lbnUKLQl2cy4gbWVudWV4IGxlbmd0aC4KLQkqIHJlc3JjLmMgKGRlZmluZV9zdHJpbmd0YWJsZSk6IEFkZCAxIHRvIHJlc291cmNlIElELgotCi1UdWUgSnVsIDI5IDExOjA2OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVzYmluLmMgKGJpbl90b19yZXNfc3RyaW5nKTogQ29ycmVjdCBhZGp1c3RtZW50IG9mIGRhdGEgYW5kCi0JbGVuZ3RoLiAgRnJvbSBUb24gdmFuIE92ZXJiZWVrIDx0dm92ZXJiZUB3ay5lc3RlYy5lc2Eubmw+LgotCi1UdWUgSnVsIDIyIDE4OjAxOjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbmxtY29udi5jIChsaW5rX2lucHV0cyk6IENhbGwgbGliaWJlcnR5IHBleGVjdXRlIGZ1bmN0aW9uLgotCShwZXhlY3V0ZSkgW211bHRpcGxlIHZlcnNpb25zXTogUmVtb3ZlLgotCi1UdWUgSnVsIDIyIDE2OjE5OjM0IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogYnVjb21tLmMgKG1ha2VfdGVtcG5hbWUpOiBJZiB3ZSBtaWdodCBiZSB1c2luZyBhIERPUyBmaWxlc3lzdGVtLAotCWNoZWNrIGZvciBhIGJhY2tzbGFzaCBhcyB3ZWxsIGFzIGEgc2xhc2guCi0KLVRodSBKdW4gMjYgMTM6NTM6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBRdWl0IGlmIHdlIGRpZG4ndCBnZXQgYW55IHJlc291cmNlcy4KLQkodXNhZ2UpOiBGaXggLS15eWRlYnVnIHVzYWdlIG1lc3NhZ2UuCi0JKiByZXNjb2ZmLmMgKHdyaXRlX2NvZmZfZmlsZSk6IERvbid0IGZyZWUgdGhlIHJlbG9jYXRpb24gYXJyYXkKLQl1bnRpbCBhZnRlciB3ZSd2ZSBjbG9zZWQgdGhlIEJGRC4KLQkocmVhZF9jb2ZmX3JzcmMpOiBRdWl0IHJhdGhlciB0aGFuIHRyeSB0byByZWFkIHN0YW5kYXJkIGlucHV0LgotCSh3cml0ZV9jb2ZmX2ZpbGUpOiBRdWl0IHJhdGhlciB0aGFuIHRyeSB0byB3cml0ZSB0byBzdGFuZGFyZAotCW91dHB1dC4KLQkqIHJjcGFyc2UueTogQWRkIGEgY291cGxlIG9mIG1pc3Npbmcgc2VtaWNvbG9ucyAoYWNjZXB0ZWQgYnkgYmlzb24KLQlidXQgbm90IGJ5YWNjKS4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IHdpbmRyZXMuCi0KLVdlZCBKdW4gMjUgMjA6NTc6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZXNiaW4uYzogTmV3IGZpbGUuCi0JKiByY2xleC5sLCByY3BhcnNlLnksIHJlc2NvZmYuYywgcmVzcmMuYywgd2luZHJlcy5jLCB3aW5kcmVzLmg6Ci0JTnVtZXJvdXMgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKENGSUxFUyk6IEFkZCByZXNiaW4uYy4KLQkoV0lORFJFU19PQkpTKTogQWRkIHJlc2Jpbi5vLgotCi1TdW4gSnVuIDIyIDE3OjI5OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZpcnN0IHN0YWIgYXQgV2luZG93cyByZXNvdXJjZSBjb21waWxlcjoKLQkqIHdpbmRyZXMuaDogTmV3IGZpbGUuCi0JKiB3aW5kcmVzLmM6IE5ldyBmaWxlLgotCSogcmVzcmMuYzogTmV3IGZpbGUuCi0JKiByY3BhcnNlLnk6IE5ldyBmaWxlLgotCSogcmNsZXgubDogTmV3IGZpbGUuCi0JKiByZXNjb2ZmLmM6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBEZWZpbmUgYW5kIHN1YnN0aXR1dGUgQlVJTERfV0lORFJFUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKFdJTkRSRVNfUFJPRyk6IE5ldyB2YXJpYWJsZS4KLQkoUFJPR1MpOiBBZGQgQEJVSUxEX1dJTkRSRVNALgotCShIRklMRVMpOiBBZGQgZGxsdG9vbC5oIGFuZCB3aW5kcmVzLmguCi0JKENGSUxFUyk6IEFkZCB3aW5kcmVzLmMgYW5kIHJlc3JjLmMuCi0JKEdFTkVSQVRFRF9DRklMRVMpOiBBZGQgcmNwYXJzZS5jIGFuZCByY2xleC5jLgotCShXSU5EUkVTX09CSlMpOiBOZXcgdmFyaWFibGUuCi0JJChXSU5EUkVTX1BST0cpOiBOZXcgdGFyZ2V0LgotCShyY3BhcnNlLmMsIHJjcGFyc2UuaCwgcmNsZXguYyk6IE5ldyB0YXJnZXRzLgotCi1UaHUgSnVuIDEyIDEyOjI3OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChleHBvcnRfdHlwZSk6IEFkZCBkYXRhIGZpZWxkLgotCShkZWZfZXhwb3J0cyk6IEFkZCBkYXRhIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZHVtcF9kZWZfaW5mbyk6IFByaW50IGRhdGEgZmllbGQuCi0JKGdlbl9kZWZfZmlsZSk6IExpa2V3aXNlLgotCShtYWtlX29uZV9saWJfZmlsZSk6IEhhbmRsZSBkYXRhIGZpZWxkIGJ5IG5vdCBlbWl0dGluZyBzaW1wbGUKLQlsYWJlbCBhbmQgbm90IGVtaXR0aW5nIGFueXRoaW5nIGluIFNFQ19URVhULgotCShkdGFiKTogUHJpbnQgZGF0YSBmaWVsZC4KLQkocHJvY2Vzc19kdXBsaWNhdGVzKTogTWVyZ2UgZGF0YSBmaWVsZC4KLQkqIGRsbHRvb2wuaCAoZGVmX2V4cG9ydHMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBkZWZwYXJzZS55IChleHBsaW5lKTogQWNjZXB0IG9wdF9EQVRBLiAgUGFzcyBpdCB0byBkZWZfZXhwb3J0cy4KLQkob3B0X0RBVEEpOiBOZXcgbm9uLXRlcm1pbmFsLgotCi1XZWQgSnVuIDExIDE3OjE1OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5oOiBOZXcgZmlsZS4KLQkqIGRlZmxleC5sOiBJbmNsdWRlIGRsbHRvb2wuaCBhbmQgbGliaWJlcnR5LmguICBEb24ndCBkZWNsYXJlCi0Jc3RyZHVwLiAgVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCSogZGVmcGFyc2UueTogSW5jbHVkZSBiZmQuaCwgYnVjb21tLmgsIGFuZCBkbGx0b29sLmguCi0JKiBkbGx0b29sLmM6IEluY2x1ZGUgZGxsdG9vbC5oIGFuZCB0aW1lLmguICBNYWtlIGEgbG90IG9mCi0JdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgc3RhdGljLiAgTWFrZSBhIGxvdCBvZiBjaGFyICogdmFyaWFibGVzCi0JYW5kIHBhcmFtZXRlcnMgY29uc3QuICBBZGQgZGVjbGFyYXRpb25zIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgRG8KLQlzb21lIHJlaW5kZW50aW5nLiAgSGlkZSBtb3JlIFBvd2VyUEMgc3R1ZmYgaW5zaWRlIERMTFRPT0xfUFBDLgotCi1XZWQgSnVuIDExIDEyOjA1OjUyIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGFyLmMgKGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlKTogQWRkIGNvbnN0LgotCi1Nb24gTWF5IDEyIDIyOjA5OjM1IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBQYXNzIENDX0ZPUl9UQVJHRVQgYW5kIENGTEFHU19GT1JfVEFSR0VUCi0JdG8gcnVudGVzdC4KLQotTW9uIE1heSAxMiAxMzoxNDoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2xlYXIgT1BDT0RFUyB3aGVuIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBpcwotCXVzZWQgb24gSFAvVVguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgMjUgMTQ6MjI6MDggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogQ2hhbmdlICouaW5mbyoKLQl0byBiaW51dGlscy5pbmZvKiB0byBzYXZlIHN5c3JvZmYuaW5mby4KLQotVHVlIEFwciAxNSAxMzo0MjoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9YRk9STSwgSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCi0JKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4gIFVzZSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi0JZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nICQoSU5TVEFMTF9YRk9STSkgYW5kCi0JJChJTlNUQUxMX1hGT1JNMSkuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbC1pbmZvKTogUnVuIG1raW5zdGFsbGRpcnMuCi0KLU1vbiBBcHIgMTQgMTE6NTI6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCi0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBNYWtlZmlsZS5pbjogQWx3YXlzIHVzZSAkKFNIRUxMKSB3aGVuIHJ1bm5pbmcgbW92ZS1pZi1jaGFuZ2UuCi0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByICA0IDEzOjI4OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQUNfRlVOQ19BTExPQ0EuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGJ1Y29tbS5oOiBBZGQgYWxsb2NhIGhhbmRsaW5nLCBjb3BpZWQgZnJvbSBnYXMvYXMuaC4KLQkqIGRsbHRvb2wuYzogQWRkICNwcmFnbWEgYWxsb2NhIGZvciBBSVggdG8gc3RhcnQgb2YgZmlsZS4KLQkqIG5sbWNvbnYuYzogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLiAgUmVtb3ZlCi0JZXZlcnl0aGluZyB0aGF0IGNsZWFuIHJlbW92ZXMuCi0KLVRodSBBcHIgIDMgMTM6MTg6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byAyLjguMS4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1UdWUgQXByICAxIDE2OjIxOjQ0IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWd1cmUuY29tOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLXZtczogUmVtb3ZlIGZpbGUuCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBmb3IgbmV3IGNvbmZpZ3VyZSBzY2hlbWUuCi0KLU1vbiBNYXIgMzEgMTU6MzA6NDMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogb2JqY29weS5jIChtYWtlX3NhbWVfZGF0ZXMpOiBVc2Ugc3RhdGJ1Ziwgbm90IGJ1ZiwgaWYgbm90Ci0JSEFWRV9HT09EX1VUSU1FX0guCi0KLUZyaSBNYXIgMjggMTc6NTc6NTMgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBNYWtlZmlsZS5pbiAoJChPQkpEVU1QX1BST0cpKTogRG9uJ3QgbGluayBhZ2FpbnN0IEJGRExJQiB0d2ljZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIGNvbW1vbmJmZGxpYi4gIElmIGl0IGlzIHNldCwKLQlzZXQgT1BDT0RFUyB0byBlbXB0eS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE1hciAyNyAxNjowMzowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+OgotCSogb2JqY29weS5jOiBJbmNsdWRlIDx1dGltZS5oPiBvciA8c3lzL3RpbWUuaD4uCi0JKHN0cmlwX29wdGlvbnMpOiBBZGQgInByZXNlcnZlLWRhdGVzIi4KLQkoY29weV9vcHRpb25zKTogTGlrZXdpc2UuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC1wIGFuZCAtLXByZXNlcnZlLWRhdGVzLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCShtYWtlX3NhbWVfZGF0ZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJpcF9tYWluKTogSGFuZGxlIC1wLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmlwLjEsIG9iamNvcHkuMTogRG9jdW1lbnQgbmV3IG9wdGlvbi4KLQotCWFkZHIybGluZS5jIGNvbnRyaWJ1dGVkIGJ5IFVscmljaCBMYXV0aGVyCi0JPFVscmljaC5MYXV0aGVyQHpmZS5zaWVtZW5zLmRlPjoKLQkqIGFkZHIybGluZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEFERFIyTElORV9QUk9HKTogTmV3IHZhcmlhYmxlLgotCShNQU5QQUdFUyk6IEFkZCBhZGRyMmxpbmUuCi0JKFBST0dTKTogQWRkICQoQUREUjJMSU5FX1BST0cpLgotCShDRklMRVMpOiBBZGQgYWRkcjJsaW5lLmMuCi0JKCQoQUREUjJMSU5FX1BST0cpKTogTmV3IHRhcmdldC4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGFkZHIybGluZS4KLQkqIGFkZHIybGluZS4xOiBOZXcgZmlsZS4KLQotCSogdmVyc2lvbi5jIChwcmludF92ZXJzaW9uKTogVXBkYXRlIGNvcHlyaWdodCBkYXRlLgotCi1Nb24gTWFyIDI0IDEwOjUyOjQ1IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBleGl0IGlmIGEgZmlsZSBjYW5ub3QgYmUKLQlkaXNhc3NlbWJsZWQsIGluc3RlYWQganVzdCByZXR1cm4uCi0KLVRodSBNYXIgMjAgMjE6MTY6NTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaXplLmMgKHVzYWdlKTogTWFrZSBkZWZpbml0aW9uIG1hdGNoIGl0cyBwcm90b3R5cGUuCi0JKGRpc3BsYXlfYmZkLCBscHJpbnRfbnVtYmVyLCBycHJpbnRfbnVtYmVyKTogTGlrZXdpc2UuCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCwgc3lzdl9pbnRlcm5hbF9wcmludGVyKTogTGlrZXdpc2UuCi0JKHByaW50X3N5c3ZfZm9ybWF0KTogTGlrZXdpc2UuCi0JKiBubS5jIChzZXRfcHJpbnRfcmFkaXgsIHNldF9vdXRwdXRfZm9ybWF0KTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9ieXRlcyk6IExpa2V3aXNlLgotCi1UdWUgTWFyIDE4IDE2OjM5OjU1IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBNYW55IGZpbGVzOiBBZGQgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkqIGFyLmMgKG1yaV9lbXVsLCBnZXRfcG9zX2JmZCk6IE1ha2Ugc3RhdGljLgotCSogYXJsZXgubDogSW5jbHVkZSAibGliaWJlcnR5LmgiLiAgRG9uJ3QgZGVjbGFyZSBzdHJkdXAuICBVc2UKLQl4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQkqIGFycGFyc2UueSAoeXllcnJvcik6IE1ha2UgYXJndW1lbnQgY29uc3QuICBDb3JyZWN0IHR5cG8uCi0JKiBhcnN1cC5jIChzdHJkdXApOiBEb24ndCBkZWNsYXJlLgotCShhcl9zYXZlKTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCSogZmlsZW1vZGUuYzogSW5jbHVkZSAiYnVjb21tLmgiLgotCSogbm0uYyAodXNhZ2UpOiBNYWtlIHN0YXRpYy4KLQkocHJpbnRfc3ltbmFtZSk6IE1ha2UgZm9ybWF0IGFuZCBuYW1lIGNvbnN0LgotCSogb2JqY29weS5jIChjYXQpOiBSZW1vdmUuCi0JKGNvcHlfYXJjaGl2ZSk6IE1ha2Ugb3V0cHV0X3RhcmdldCBjb25zdC4gIFVzZSBjb25jYXQsIG5vdCBjYXQuCi0JKGNvcHlfZmlsZSwgc2ltcGxlX2NvcHksIHNtYXJ0X3JlbmFtZSk6IE1ha2UgYXJndW1lbnRzIGNvbnN0LgotCSogb2JqZHVtcC5jIChyZWFkX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkocHJpbnRfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCShkaXNwbGF5X3RhcmdldF90YWJsZXMpOiBEb24ndCBkZWNsYXJlIGdldGVudi4KLQkqIHN0cmluZ3MuYyAoc3RyaW5nc19vYmplY3RfZmlsZSk6IENoYW5nZSBmaWxlIHRvIGNvbnN0LgotCShwcmludF9zdHJpbmdzKTogQ2hhbmdlIGZpbGVuYW1lIHRvIGNvbnN0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1UdWUgTWFyIDE4IDExOjM3OjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KS4KLQkqIGFjY29uZmlnLmg6IEFkZCBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVi4KLQkqIGJ1Y29tbS5oIChnZXRlbnYpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBubG1jb252LmMgKGdldGVudik6IERvbid0IGRlY2xhcmUuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotU2F0IE1hciAxNSAxNTozNTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSmFtaWUgTG9raWVyIDxqYW1pZUByZWJlbGxpb24uY28udWs+OgotCSogb2JqZHVtcC5jOiBJbmNsdWRlICJkZW1hbmdsZS5oIi4KLQkoZG9fZGVtYW5nbGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLUMvLS1kZW1hbmdsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkZW1hbmdsZSIuCi0JKG9iamR1bXBfcHJpbnRfc3ltbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IFVzZSBvYmpkdW1wX3ByaW50X3N5bW5hbWUuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogTGlrZXdpc2UuCi0JKGR1bXBfcmVsb2Nfc2V0KTogTGlrZXdpc2UuCi0JKGR1bXBfc3ltYm9scyk6IERlbWFuZ2xlIHN5bWJvbCBuYW1lLgotCShtYWluKTogSGFuZGxlIC1DLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtQy8tLWRlbWFuZ2xlLgotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTWVudGlvbiAtLW5vLXNob3ctcmF3LWluc24uCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAibm8tc2hvdy1yYXctaW5zbiIuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogSGFuZGxlIC0tbm8tc2hvdy1yYXctaW5zbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1uby1zaG93LXJhdy1pbnNuLgotCi1XZWQgTWFyIDEyIDExOjQyOjAwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiByZGRiZy5jIChmcmVlX3NhdmVkX3N0YWJzKTogU2V0IHRoZSBzdHJpbmdzIHRvIE5VTEwgYWZ0ZXIgYmVpbmcKLQlmcmVlZC4KLQotRnJpIEZlYiAyOCAxNzoxODo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5jIChzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uLgotCSogYnVjb21tLmggKHNldF9kZWZhdWx0X2JmZF90YXJnZXQpOiBEZWNsYXJlLgotCSogYXIuYyAobWFpbik6IENhbGwgc2V0X2RlZmF1bHRfYmZkX3RhcmdldC4KLQkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoYnVjb21tLm8pOiBOZXcgdGFyZ2V0LCB0byBkZWZpbmUgVEFSR0VULgotCi1UdWUgRmViIDI1IDIxOjI4OjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChhZGp1c3Rfc2VjdGlvbl92bWEpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLS1hZGp1c3Qtc2VjdGlvbi12bWEuCi0JKE9QVElPTl9BREpVU1RfVk1BKTogRGVmaW5lLgotCShsb25nX29wdGlvbnMpOiBBZGQgImFkZGp1c3Qtdm1hIi4KLQkoZGlzcGxheV9iZmQpOiBJZiBhZGp1c3Rfc2VjdGlvbl92bWEgaXMgbm90IDAsIGFkZCBpdCB0byBhbGwgdGhlCi0Jc2VjdGlvbiBhZGRyZXNzZXMuCi0JKG1haW4pOiBIYW5kbGUgT1BUSU9OX0FESlVTVF9WTUEuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC0tYWRqdXN0LXZtYS4KLQotRnJpIEZlYiAxNCAxODo0Njo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHByaW50X3N5bWJvbCk6IENhY2hlIHRoZSBCRkQgYXMgd2VsbCBhcyB0aGUgc3ltYm9scyBhbmQKLSAJcmVsb2NzLCBhbmQgZG9uJ3QgdHJ5IHRvIHVzZSB0aGUgc3ltYm9scyBvciByZWxvY3Mgd2l0aCBhCi0gCWRpZmZlcmVudCBCRkQuCi0KLVRodSBGZWIgMTMgMjE6MzQ6NDMgMTk5NyAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBwcm9naXMuZGUpCi0KLQkqIGNvbmZpZy5oLXZtczogc2JyaygpIGlzIHByb3ZpZGVkIG9uIG9wZW5WTVMvQWxwaGEuCi0JKiBtYWtlZmlsZS52bXM6IGFsbG93IGNvbXBpbGluZyB3aXRoIGN1cnJlbnQgZ2NjIHNuYXBzaG90LgotCi1UaHUgRmViIDEzIDIwOjE0OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJzdXAuYywgY29mZmdyb2suYywgZGxsdG9vbC5jLCBubG1jb252LmM6IFVzZSB4bWFsbG9jIHJhdGhlcgotCXRoYW4gbWFsbG9jLgotCi1XZWQgRmViIDEyIDE2OjEyOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQ29ycmVjdCBWTUEgYXJndW1lbnQgdG8KLQlmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcy4gIEltcHJvdmUgaGFuZGxpbmcgb2YgY29kZSB3aXRoIG5vIHN5bWJvbAotCWZvbGxvd2VkIGJ5IGNvZGUgd2l0aCBhIHN5bWJvbC4KLQotV2VkIEZlYiAxMiAxMjoxNjo0NyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IE1ha2Ugb3V0cHV0IG9mIHJhdyBpbnN0cnVjdGlvbnMKLQl3b3JrIGJldHRlciBmb3Igbm9uLXN0YW5kYXJkIHZhbHVlcyBvZiBieXRlc19wZXJfY2h1bmsgYW5kCi0JYnl0ZXNfcGVyX2xpbmUuCi0KLVRodSBGZWIgIDYgMTQ6MTQ6NTkgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBBZGRlZCBjb2RlIHRvIGFsbG93IHNvbWUgY29udHJvbAotIAlvdmVyIHRoZSB3YXkgcmF3IGluc3RydWN0aW9ucyBhcmUgZGlzcGxheWVkLgotCi1UaHUgRmViICA2IDEyOjM2OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IGJpbmNsX2ZpbGUpOiBBZGQgbmV4dF9zdGFjayBmaWVsZC4KLQkocHVzaF9iaW5jbCk6IFB1dCB0aGUgbmV3IGZpbGUgb24gYm90aCBiaW5jbF9saXN0IGFuZAotCWJpbmNsX3N0YWNrLiAgQ2xlYXIgdGhlIGZpbGVfdHlwZXMgZmllbGQuCi0JKHBvcF9iaW5jbCk6IFVzZSB0aGUgbmV4dF9zdGFjayBmaWVsZCB3aGVuIHBvcHBpbmcgdGhlIHN0YWNrLgotCURvbid0IHB1dCB0aGUgZmlsZSBvbiBiaW5jbF9saXN0LgotCShmaW5kX2V4Y2wpOiBJbmNsdWRlIHRoZSBmaWxlIG5hbWUgd2hlbiB3YXJuaW5nIGFib3V0IGFuIHVuZm91bmQKLQlOX0VYQ0wuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX3R5cGVfc2FtZXApOiBEb24ndCBjcmFzaCBpZiB3ZSBhcmUgcGFzc2VkIE5VTEwuCi0KLVRodSBGZWIgIDYgMTE6NTQ6MjQgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBvYmpjb3B5LjE6IEFkZCBtaXNzaW5nIHNwYWNlIGFmdGVyIC5CLgotCi1GcmkgSmFuIDMxIDEwOjMzOjA3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBJbml0aWFsaXplIGBhdXgucmVxdWlyZV9zZWMnLgotCi1XZWQgSmFuIDI5IDEzOjIxOjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X3ZhbHVlKTogQWRkIHNraXBfemVyb2VzIHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IExpa2V3aXNlLiAgQ2FsbCBvYmpkdW1wX3ByaW50X3ZhbHVlCi0JdG8gcHJpbnQgYWRkcmVzcy4KLQkob2JqZHVtcF9wcmludF9hZGRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogSnVzdCBjYWxsIG9iamR1bXBfcHJpbnRfYWRkci4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBQcmludCByZWFsIGFkZHJlc3MsIG5vdCBmdW5jdGlvbiBvZmZzZXQuCi0JU2tpcCBhIGNlcnRhaW4gbnVtYmVyIG9mIGxlYWRpbmcgemVyb2VzLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX3plcm9lcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtLWRpc2Fzc2VtYmxlLXplcm9lcy4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkaXNhc3NlbWJsZS16ZXJvZXMiLgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IENoZWNrIGRpc2Fzc2VtYmxlX3plcm9lcy4KLQotVHVlIEphbiAyOCAxNjo0NzoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBEb24ndCBza2lwIHplcm9lcyBpZiB0aGUKLQlkaXNhc3NlbWJsZXIgaGFzIHRvbGQgdXMgdGhhdCB3ZSBhcmUgaW4gYSBicmFuY2ggZGVsYXkgc2xvdC4KLQotTW9uIEphbiAyMCAxNDoyNDowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNpemUuYyAoYmVya2VsZXlfc3VtKTogUmV3cml0ZS4gIFNraXAgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdAotCVNFQ19BTExPQy4gIENvdW50IFNFQ19SRUFET05MWSBzZWN0aW9ucyBhcyB0ZXh0LgotCi1UdWUgSmFuIDE0IDE1OjE0OjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogUmVtb3ZlICouaW5mbyosIG5vdAotCWp1c3QgKi5pbmZvLiAgRnJvbSBILkouIEx1IDxoamxAbHVjb24ub3JnPi4KLQotVHVlIERlYyAzMSAxNTo0Mjo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLUZyaSBEZWMgMjcgMTE6MTk6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFdvcmsgYXJvdW5kIGJ1ZyBpbiBBQ19GVU5DX1ZGT1JLIGluIGF1dG9jb25mIDIuMTIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBEZWMgMTkgMTM6MTE6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBBbmRyZXcgSiBLbG9zc25lciA8YW5kcmV3QHBvZ28ud3YudGVrLmNvbT46Ci0JKiBvYmpjb3B5LmMgKE9QVElPTl9XRUFLRU4pOiBEZWZpbmUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAid2Vha2VuIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS13ZWFrZW4uCi0JKHdlYWtlbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGZpbHRlcl9zeW1ib2xzKTogSGFuZGxlIHdlYWtlbi4KLQkoY29weV9vYmplY3QpOiBDYWxsIGZpbHRlcl9zeW1ib2xzIGlmIHdlYWtlbi4KLQkoY29weV9tYWluKTogSGFuZGxlIE9QVElPTl9XRUFLRU4uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0td2Vha2VuLgotCi1XZWQgRGVjIDE4IDIyOjQ5OjEzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVc2UgTmV3Rm9sZGVyUmVjdXJzaXZlIGZvciBpbnN0YWxsYXRpb24uCi0KLVNhdCBEZWMgIDcgMTA6MTc6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEFkZCAiZWxzZSB0cnVlIiBjbGF1c2UgdG8gY2F0ZXIgdG8KLQlicm9rZW4gIm1ha2UiIG9uIHNvbWUgc3lzdGVtcy4KLQotRnJpIERlYyAgNiAxNzoyMTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAocGFyc2VfaWVlZV9iYik6IEFsd2F5cyBpbml0aWFsaXplIG5hbWNvcHkgdG8gYXZvaWQgZ2NjCi0Jd2FybmluZyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlLgotCShpZWVlX3JlYWRfY3h4X2NsYXNzKTogTGlrZXdpc2UsIGZvciBwZi4KLQkoaWVlZV9lbnVtX3R5cGUpOiBMaWtld2lzZSwgZm9yIGkuCi0KLVR1ZSBOb3YgMjYgMTc6MDE6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmMgKHN0YWJfYXJyYXlfdHlwZSk6IEFkZCBjYXN0cyB3aGVuIHByaW50aW5nCi0JYmZkX3NpZ25lZF92bWEgdmFsdWVzLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi1Nb24gTm92IDI1IDE2OjUzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgY3Jhc2ggaWYgdGhlcmUgaXMgbm8KLQlzeW1ib2wuCi0KLUZyaSBOb3YgMjIgMTc6Mjk6MTQgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFyLmMgKG9wZW5faW5hcmNoKTogRG9uJ3QgY2FsbCBiZmRfb3BlbnIgd2l0aCBhIG51bGwgbmFtZS4KLQotRnJpIE5vdiAgMSAxMjowODoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IEFkZCBzZWN0aW9uIG9uIHJlcG9ydGluZyBidWdzLgotCi1UaHUgT2N0IDMxIDE4OjIwOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIGJpbmNsX2xpc3QgZmllbGQuCi0JKHBhcnNlX3N0YWIpOiBQYXNzIHZhbHVlIHRvIHB1c2hfYmluY2wuICBDYWxsIGZpbmRfZXhjbCBmb3IKLQlOX0VYQ0wuCi0JKHN0cnVjdCBiaW5jbF9maWxlKTogQWRkIGhhc2gsIGZpbGUgYW5kIGZpbGVfdHlwZXMgZmllbGRzLgotCShwdXNoX2JpbmNsKTogQWRkIGhhc2ggcGFyYW1ldGVyLiAgU2F2ZSBpdCBpbiB0aGUgbmV3IGhhc2ggZmllbGQuCi0JU2F2ZSB0aGUgZmlsZSBudW1iZXIgaW4gdGhlIG5ldyBmaWxlIGZpZWxkLgotCShwb3BfYmluY2wpOiBQdXQgdGhlIGJpbmNsX2ZpbGUgb24gYmluY2xfbGlzdCwgcmF0aGVyIHRoYW4gZnJlZWluZwotCWl0LiAgU2F2ZSB0aGUgZmlsZSB0eXBlcyBpbiB0aGUgbmV3IGZpbGVfdHlwZXMgZmllbGQuCi0JKGZpbmRfZXhjbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGllZWUuYyAoaWVlZV9saW5lbm8pOiBEb24ndCBjb21wYXJlIGxpbmUgbnVtYmVyIGFkZHJlc3NlcyB0bwotCWluZm8tPmhpZ2hhZGRyICh1bmRvIHBhcnQgb2YgT2N0b2JlciAyOCBwYXRjaCkuCi0KLVR1ZSBPY3QgMjkgMTY6NDA6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBEb24ndCBwcmludCB0aGUgZW1wdHkgc3RyaW5nCi0JZm9yIHplcm8uCi0KLU1vbiBPY3QgMjggMTY6NTg6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgZnVuY3Rpb25fZW5kIGZpZWxkLgotCShzdGFydF9zdGFiKTogSW5pdGlhbGl6ZSBmdW5jdGlvbl9lbmQuCi0JKGZpbmlzaF9zdGFiKTogUGFzcyBpbmZvLT5mdW5jdGlvbl9lbmQgdG8gZGVidWdfZW5kX2Z1bmN0aW9uLgotCShwYXJzZV9zdGFiKTogSWYgaW5mby0+ZnVuY3Rpb25fZW5kIGlzIHNldCwgdXNlIGl0IGFzIHRoZSBhZGRyZXNzCi0Jd2hpY2ggZW5kcyBhIGZ1bmN0aW9uLgotCi0JKiBpZWVlLmMgKGllZWVfYXJyYXlfdHlwZSk6IFJlbWVtYmVyIHRoZSBjb3JyZWN0IHNpemUuCi0KLQkqIGllZWUuYyAoaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCk6IFBlcm1pdCBjb2FsZXNjaW5nIHJhbmdlcwotCXRoYXQgYXJlIHVwIHRvIDB4MTAwMCBieXRlcyBhcGFydCwgbm90IGp1c3QgNjQuCi0JKGllZWVfYWRkX2JiMTFfYmxvY2tzKTogRG9uJ3QgYm90aGVyIHRvIGVtaXQgYSBCQjExIHRoYXQgaXMgbGVzcwotCXRoYW4gMHgxMDAgYnl0ZXMuCi0JKGllZWVfbGluZW5vKTogT25seSBlbWl0IGxpbmUgbnVtYmVycyB0aGF0IGFyZSBsZXNzIHRoYW4KLQlpbmZvLT5oaWdoYWRkci4KLQotRnJpIE9jdCAyNSAxMjoxMjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtKTogQWRkIGRlZmluZWQgZmllbGQuCi0JKGllZWVfZW51bV90eXBlKTogSWYgdGhlIGVudW0gdGFnIGhhcyBiZWVuIHNlZW4gYmVmb3JlIGJ1dCBub3QKLQlkZWZpbmVkLCByZXVzZSB0aGUgc2FtZSB0eXBlIGluZGV4LCBhbmQgZGVmaW5lIGl0LgotCShpZWVlX3RhZ190eXBlKTogSWYgdGhpcyBlbnVtIGhhcyBub3QgYmVlbiBkZWZpbmVkLCBhZGQgYW4KLQl1bmRlZmluZWQgZW50cnkgdG8gdGhlIGxpc3Qgb2YgZW51bXMuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBMZXQgdGhlIGRpc2Fzc2VtYmxlciBvdmVycmlkZSB0aGUKLQludW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCBvbiBhIGxpbmUuCi0KLVRodSBPY3QgMjQgMTY6NDI6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHByZWZpeF9hZGRyZXNzZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGQgInByZWZpeC1hZGRyZXNzZXMiLgotCShjb21wYXJlX3N5bWJvbHMpOiBTb3J0IEJTRl9GVU5DVElPTiBzeW1ib2xzIGJlZm9yZSBvdGhlcgotCXN5bWJvbHMuCi0JKGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW9iamR1bXBfcHJpbnRfYWRkcmVzcy4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW9iamR1bXBfcHJpbnRfYWRkcmVzcy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ2FsbCBuZXcgZnVuY3Rpb25zLgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlkaXNhc3NlbWJsZV9kYXRhLiAgQ2hhbmdlIGRpc2Fzc2VtYmx5IGZvcm1hdCwgdW5sZXNzCi0JcHJlZml4X2FkZHJlc3NlcyBpcyBzZXQuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYWxsIGRpc2Fzc2VtYmxlX2J5dGVzLiAgVW5sZXNzCi0JcHJlZml4X2FkZHJlc3NlcyBpcyBzZXQsIGRpc2Fzc2VtYmxlIGluIGNodW5rcyBoZWFkZWQgYnkgYQotCXN5bWJvbC4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1wcmVmaXgtYWRkcmVzc2VzLgotCi0JKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBQcmVzZXJ2ZSB0aGUKLQliYWNrc2xhc2ggd2hlbiBjb25jYXRlbmF0aW5nIG11bHRpcGxlIHN0YWJzIHN0cmluZ3MuCi0KLVRodSBPY3QgMTAgMTE6MzY6MzEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChzY2FuX29wZW5fb2JqX2ZpbGUpOiBGaXggbG9vcCBleGl0IHRlc3QuCi0JQWRkIG1pc3NpbmcgcGFyYW1ldGVyIHRvIGRlZl9leHBvcnRzLgotCi1UdWUgT2N0ICA4IDEyOjA2OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKExFWF9PUFRJT05TKTogU2V0IHRvIGVtcHR5IHN0cmluZy4gIC1JIC1DZW0gaXMgdGhlCi0JZGVmYXVsdCBmb3IgZmxleCwgYW5kIGlzIG5vdCByZWNvZ25pemVkIGJ5IGxleC4KLQotVGh1IE9jdCAgMyAxNzo0MToyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkgKFRhcmdldCBTZWxlY3Rpb24pOiBEb2N1bWVudCB0aGF0IHlvdSBjYW4gbm93Ci0Jc3BlY2lmeSB0YXJnZXRzIHVzaW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMuCi0KLQkqIGFyLmMgKHVzYWdlKTogRGVjbGFyZS4gIE1ha2Ugc3VyZSBhbGwgY2FsbGVycyBwYXNzIGFuIGFyZ3VtZW50LgotCi1UaHUgT2N0ICAzIDE1OjM5OjQyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgotCi1XZWQgT2N0ICAyIDE1OjQ5OjE2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IEJ1bXAgdmVyc2lvbiBkYXRlLgotCi1UdWUgT2N0ICAxIDE1OjAwOjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdmVyc2lvbi5jIChwcmludF92ZXJzaW9uKTogTmV3IGZ1bmN0aW9uLgotCSogYnVjb21tLmggKHByaW50X3ZlcnNpb24pOiBEZWNsYXJlLgotCSogYXIuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkoZG9fc2hvd192ZXJzaW9uKTogUmVtb3ZlLgotCSh1c2FnZSk6IEFkZCBoZWxwIHBhcmFtZXRlci4gIFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IFNldCBpc19yYW5saWIgYXQgc3RhcnQuICBDaGVjayBmb3IgLS1oZWxwIGFuZCAtLXZlcnNpb24uCi0JQ2FsbCBwcmludF92ZXJzaW9uLCBub3QgZG9fc2hvd192ZXJzaW9uLgotCSogbmxtY29udi5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCShtYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgotCShzaG93X3VzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCSogbm0uYyAocHJvZ3JhbV92ZXJzaW9uLCBwcmludF92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKiBvYmpjb3B5LmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKGNvcHlfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkqIHNpemUuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKiBzdHJpbmdzLmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKHVzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0KLVRodSBTZXAgMTkgMTQ6NTM6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IFJldmVydCBNb25kYXkncyByZWZsb2NhbHAgcGF0Y2gsIGFuZCBhcHBseSB0aGlzIHBhdGNoCi0JaW5zdGVhZDoKLSAJKHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8pOiBXcml0ZSBhIGR1bW15IHR5cGUgYXQgdGhlIGVuZCBvZiB0aGUKLQlnbG9iYWwgdHlwZSBibG9jay4KLQotTW9uIFNlcCAxNiAxNTozMDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfd3JpdGVfdHlwZSk6IEFkZCByZWZsb2NhbHAgZmllbGQuCi0JKGllZWVfcG9pbnRlcl90eXBlKTogU2V0IHJlZmxvY2FscCBhZnRlciBwdXNoaW5nIHR5cGUuCi0JKGllZWVfZnVuY3Rpb25fdHlwZSk6IElmIHJlZmxvY2FscCBpcyBzZXQsIG1ha2UgdGhpcyB0eXBlIGxvY2FsLgotCShpZWVlX3JhbmdlX3R5cGUsIGllZWVfYXJyYXlfdHlwZSwgaWVlZV9zZXRfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX2NvbnN0X3R5cGUsIGllZWVfdm9sYXRpbGVfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX3N0cnVjdF9maWVsZCwgaWVlZV9jbGFzc19iYXNlY2xhc3MpOiBMaWtld2lzZS4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9pbmZvKTogQWRkIGdsb2JhbF90eXBlcyBmaWVsZC4KLQkocGFyc2VfaWVlZV9iYik6IFdoZW4gc3RhcnRpbmcgYSBCQjEsIGluaXRpYWxpemUgdGhlIHR5cGVzIGZpZWxkCi0JdG8gdGhlIGdsb2JhbF90eXBlcyBmaWVsZC4KLQkocGFyc2VfaWVlZV9iZSk6IFdoZW4gZW5kaW5nIGEgQkIyLCBjb3B5IHRoZSB0eXBlcyBmaWVsZCB0byB0aGUKLQlnbG9iYWxfdHlwZXMgZmllbGQuCi0KLUZyaSBTZXAgMTMgMTc6MzI6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNoYW5nZV9sZWFkaW5nX2NoYXIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUik6IERlZmluZS4KLQkoY29weV9vcHRpb25zKTogQWRkICJjaGFuZ2UtbGVhZGluZy1jaGFyIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1jaGFuZ2UtbGVhZGluZy1jaGFyLgotCShmaWx0ZXJfc3ltYm9scyk6IEFkZCBvYmZkIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQlJbXBsZW1lbnQgY2hhbmdlX2xlYWRpbmdfY2hhci4KLQkoY29weV9vYmplY3QpOiBDYWxsIGZpbHRlcl9zeW1ib2xzIGlmIGNoYW5nZV9sZWFkaW5nX2NoYXIuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1jaGFuZ2UtbGVhZGluZy1jaGFyLgotCi1UdWUgU2VwICAzIDE0OjA1OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX2VudW1fdHlwZSk6IERvbid0IGNoZWNrIGluZGV4IGludG8gYSBOVUxMIG5hbWVzCi0JYXJyYXkuCi0JKiBubS5jIChzb3J0X3N5bWJvbHNfYnlfc2l6ZSk6IEFsd2F5cyBpbml0aWFsaXplIG5leHQuCi0JKiByZGNvZmYuYyAocGFyc2VfY29mZl90eXBlKTogV2FybiBhYm91dCBhbiBpbmNvbXByZWhlbnNpYmxlCi0JdHlwZSByYXRoZXIgdGhhbiBjcmFzaGluZy4KLQkqIHJkZGJnLmMgKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogSW5pdGlhbGl6ZSBmLgotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9tZW1iZXJzKTogU2V0IGNvbnRleHQgaW4gYWxsIGNhc2VzLgotCi1UaHUgQXVnIDI5IDE2OjU2OjUyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBBdWcgMjkgMTE6Mjk6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKExfdG1wbmFtKTogTmV2ZXIgZGVmaW5lLgotCShkaXNwbGF5X3RhcmdldF9saXN0KTogVXNlIGNob29zZV90ZW1wX2Jhc2UgaW5zdGVhZCBvZiB0bXBuYW0uCi0JKGRpc3BsYXlfaW5mb190YWJsZSk6IExpa2V3aXNlLgotCi1UdWUgQXVnIDI3IDE4OjE1OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYik6IEFuIE5fRlVOIHN5bWJvbCB3aXRoIGFuIGVtcHR5IHN0cmluZwotCWluZGljYXRlcyB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uCi0KLVRodSBBdWcgMjIgMTc6MDg6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmMgKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSk6IEFkZCBuZXh0IGZpZWxkLgotCShzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUpOiBDaGFuZ2Ugc3RyaW5ncyB0byBhIHBvaW50ZXIgdG8KLQlzdHJpbmdfaGFzaF9lbnRyeS4gIEFkZCBsYXN0X3N0cmluZ3MgZmllbGQuICBSZW1vdmUgc3RyaW5nc19hbGxvYwotCWZpZWxkLgotCShzdHJpbmdfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXh0IGZpZWxkLgotCShzdGFiX3dyaXRlX3N5bWJvbCk6IENvcHkgc3RyaW5nIGludG8gaGFzaCB0YWJsZSByYXRoZXIgdGhhbiBpbnRvCi0JYnVmZmVyLiAgS2VlcCBhIGxpc3Qgb2YgaGFzaCB0YWJsZSBlbnRyaWVzLgotCSh3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyk6IEluaXRpYWxpemUgbGFzdF9zdHJpbmcuCi0JQ29weSBzdHJpbmdzIGZyb20gbGlzdCBvZiBoYXNoIHRhYmxlIGVudHJpZXMgaW4gbWVtb3J5LgotCShzdGFiX21vZGlmeV90eXBlKTogSWYgdGhlIGVudHJ5IG9uIHRoZSBzdGFjayBpcyBhIGRlZmluaXRpb24sCi0JbWFrZSBhIG5ldyBkZWZpbml0aW9uIHJhdGhlciB0aGFuIGZhaWxpbmcgYW4gYXNzZXJ0LgotCShzdGFiX2FycmF5X3R5cGUpOiBUaGUgc2l6ZSBpcyBvbmx5IHplcm8gaWYgaGlnaCBpcyBzdHJpY3RseSBsZXNzCi0JdGhhbiBsb3cuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfaW5mbyk6IEFkZCBzYXdfZmlsZW5hbWUgZmllbGQuCi0JKHBhcnNlX2llZWUpOiBJbml0aWFsaXplIHNhd19maWxlbmFtZS4KLQkocGFyc2VfaWVlZV9iYik6IFNldCBzYXdfZmlsZW5hbWUgZm9yIGEgQkIxIG9yIEJCMi4gIEluIGEgQkIxLAotCWRpc2NhcmQgdGhlIGN1cnJlbnQgdmFyaWFibGVzIGFuZCB0eXBlcy4gIEluIGEgQkIxMCwgaWYgbm8KLQlmaWxlbmFtZSBoYXMgYmVlbiBzZWVuLCBjYWxsIGRlYnVnX3NldF9maWxlbmFtZS4KLQkocGFyc2VfaWVlZV90eSk6IEluIGNhc2UgJ2cnLCB0aGUgdHlwZSBpcyBvcHRpb25hbC4KLQotCSogcHJkYmcuYyAocHJfZml4X3Zpc2liaWxpdHkpOiBEb24ndCBhYm9ydCBvbgotCURFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFLgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z19uYW1lX3R5cGUpOiBDb3JyZWN0IGVycm9yIG1lc3NhZ2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBITERFTlYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSExERU5WKTogTmV3IHZhcmlhYmxlLiAgVXNlIGl0IHdoZW5ldmVyIGxpbmtpbmcgYQotCXByb2dyYW0uCi0KLVRodSBBdWcgMTUgMTk6MzA6NDEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEFkZCBzeW1ib2xpYyBkb3VibGVxdW90ZXMgYXJvdW5kIHRoZSB2ZXJzaW9uCi0JbnVtYmVyLgotCi1UaHUgQXVnICA4IDEyOjI3OjUyIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IEFkZCBiZXR0ZXIgc3VwcG9ydCBmb3IgREVDIEMgY29tcGlsYXRpb24uCi0JQWRkIG5ldyBtYWNyb3MgYXMgaW4gTWFrZWZpbGUuaW4uCi0KLVdlZCBBdWcgIDcgMTQ6Mjc6MzMgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVEX0RFQ0xBUkFUSU9OIG9uIHN0cnN0ciBhbmQgc2Jyay4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fU1RSU1RSKTogTmV3IG1hY3JvLgotCShORUVEX0RFQ0xBUkFUSU9OX1NCUkspOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGJ1Y29tbS5oIChzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgotCShzYnJrKTogRGVjbGFyZSBpZiBIQVZFX1NCUksgYW5kIE5FRURfREVDTEFSQVRJT05fU0JSSy4KLQotCSogcHJkYmcuYyAocHJfZW5kX3N0cnVjdF90eXBlKTogQXZvaWQgdXNpbmcgYSBzdHJpbmcgY29uc3RhbnQgaW4KLQlhc3NlcnQsIGZvciB0aGUgYmVuZWZpdCBvZiBicm9rZW4gYXNzZXJ0IG1hY3Jvcy4KLQotRnJpIEp1bCAyNiAxNDowNjo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBkaXNhc21faW5mby5mbGF2b3VyIGZyb20KLQlhYmZkLgotCi1UdWUgSnVsIDIzIDEzOjU5OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChzZWNkYXRhKTogSW4gbm9uIERMTFRPT0xfUFBDIGNhc2UsIGNoYW5nZSBhbGlnbm1lbnQKLQlvZiAudGV4dCBzZWN0aW9uIHRvIDIuCi0KLU1vbiBKdWwgMjIgMDg6NDY6MTUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6ICBGaXggdGVzdCBmb3Igc3RhYnMgc2VjdGlvbnMKLQllbmRpbmcgd2l0aCBudW1iZXJzLiAgVGhpcyBmaXhlcyBhIHByb2JsZW0gd2l0aCAuc3RhYiBiZWluZwotCWNvbmZ1c2VkIHdpdGggLnN0YWIuaW5kZXguCi0KLVdlZCBKdWwgMTAgMTM6MzI6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSk6IFJldHVybiBhIHZvaWQgKiBmb3IgYQotCXRlbXBsYXRlLCByYXRoZXIgdGhhbiBzaW1wbHkgYWJvcnRpbmcuCi0KLU1vbiBKdWwgIDggMTU6Mjg6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhci5jIChvcGVuX2luYXJjaCk6IEFkZCBmaWxlIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4gIElmCi0JdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgYXJjaGl2ZSwgc2V0IHRoZSB0YXJnZXQgYmFzZWQgb24gdGhlCi0JZmlsZS4KLQkqIGFyc3VwLmggKG9wZW5faW5hcmNoKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1UaHUgSnVsICA0IDEyOjAwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBTZXQgdG8gY3lnbnVzLTIuNy4xLgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLQkqIHJkY29mZi5jIChwYXJzZV9jb2ZmKTogR2V0IGFkZHJlc3MgdG8gcGFzcyB0byBkZWJ1Z19lbmRfZnVuY3Rpb24KLQlmcm9tIGZ1bmN0aW9uIHNpemUsIG5vdCB2YWx1ZSBvZiAuZWYgc3ltYm9sLiAgRnJvbSBOaW5nCi0JTW9zYmVyZ2VyLVRhbmcgPG5pbmdAQVpTdGFyTmV0LmNvbT4uCi0KLVNhdCBKdW4gMjkgMjE6MTg6MDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4pOiBBZGQgLW8gb3B0aW9uLCBhbmQgaGFuZGxlIGl0LgotCShzdHJpcF91c2FnZSk6IE1lbnRpb24gLW8uCi0JKiBiaW51dGlscy50ZXhpLCBzdHJpcC4xOiBNZW50aW9uIC1vLgotCi1Nb24gSnVuIDI0IDE3OjE5OjAyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAotCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mIHNldCB2YWx1ZXMuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IEF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0KLU1vbiBKdW4gMjQgMTE6NTk6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGVuZGlhbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtRUIvLUVMLy0tZW5kaWFuLgotCShsb25nX29wdGlvbnMpOiBBZGQgImVuZGlhbiIuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBJZiBlbmRpYW5uZXNzIHdhcyBzcGVjaWZpZWQsIHJlcGxhY2UKLQlhYmZkLT54dmVjIHdpdGggYSBjb3B5IG9mIGl0c2VsZiB3aXRoIHRoZSBnaXZlbiBlbmRpYW5uZXNzLgotCShtYWluKTogSGFuZGxlIC1FQi8tRUwvLS1lbmRpYW4uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IE1lbnRpb24gLUVCLy1FTC8tLWVuZGlhbi4KLQotCSogb2JqZHVtcC5jOiBNYWtlIG1vc3QgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgc3RhdGljLgotCi0JKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKLQl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQotU3VuIEp1biAyMyAxNDo0NzozNiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChzZWNkYXRhKTogQ2hhbmdlZCAucmRhdGEgdG8gLnJlbGRhdGEgc28gLnJlbG9jIHdpbGwgd29yay4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBSZW1vdmVkIGNydWZ0LiAoI2lmIDEpCi0KLVdlZCBKdW4gMTkgMTQ6NDY6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHN0YWJzKTogQ2hhbmdlIGZyb20gc3RydWN0IGludGVybmFsX25saXN0ICogdG8KLQliZmRfYnl0ZSAqLgotCShwcmludF9zZWN0aW9uX3N0YWJzKTogRmV0Y2ggc3RhYnMgaW5mb3JtYXRpb24gZGlyZWN0bHksIHJhdGhlcgotCXRoYW4gYXNzdW1pbmcgdGhhdCBzdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgaXMgdGhlIHJpZ2h0IHNpemUuCi0KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGNoYW5nZSB0byBiaW5hcnkgZm9ybWF0OiBmaWxlIHBvc2l0aW9uCi0JYmFzZWQgb24gbG9hZCBhZGRyZXNzLCBub3Qgc2VjdGlvbiBWTUEuCi0KLQkqIGJ1Y29tbS5oOiBEZWZpbmUgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQgaWYgdGhleSBhcmUKLQlub3QgYWxyZWFkeSBkZWZpbmVkLgotCi1UdWUgSnVuIDE4IDE4OjI1OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEFkZCBkZWZsZXguYy4KLQotVHVlIEp1biAxOCAxNTowMzo0NCAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnLmgtdm1zLCBtYWtlZmlsZS52bXM6IE5ldyBmaWxlcy4KLQotTW9uIEp1biAxNyAwOTo0NzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBVc2UgQkZEX1JFTE9DX1JWQSByYXRoZXIgdGhhbgotCUJGRF9SRUxPQ18zMiBpbiBJREFUQTcuCi0KLVdlZCBKdW4gMTIgMTE6NTI6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvKTogRGVmaW5lLgotCShsaW5lX251bWJlcnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGQgImxpbmUtbnVtYmVycyIuCi0JKHVzYWdlKTogTWVudGlvbiAtbCBhbmQgLS1saW5lLW51bWJlcnMuCi0JKG1haW4pOiBIYW5kbGUgLWwuCi0JKHByaW50X3N5bWJvbCk6IFByaW50IGxpbmUgbnVtYmVycyBpZiByZXF1ZXN0ZWQuCi0JKGdldF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogYmludXRpbHMudGV4aSwgbm0uMTogRG9jdW1lbnQgLWwvLS1saW5lLW51bWJlcnMuCi0KLVR1ZSBKdW4gMTEgMjA6MTI6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfcmVsb2Nfc2V0KTogQWRkIHNlYyBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIElmIHdpdGhfbGluZV9udW1iZXJzIGlzIHNldCwgZGlzcGxheSBsaW5lIG51bWJlcnMgb2YKLQlyZWxvY2F0aW9uIGVudHJpZXMuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1sIHdpdGggLXIuCi0KLU1vbiBKdW4gMTAgMjM6NDI6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhci5jIChvcGVuX2luYXJjaCk6IFJlcG9ydCBCRkQgZXJyb3IgbWVzc2FnZSBpZiBhbiBhcmNoaXZlIGNhbgotCW5vdCBiZSByZWNvZ25pemVkLiAgTGlzdCBtYXRjaGluZyBmb3JtYXRzIGlmIHRoZSBmaWxlIGlzCi0JYW1iaWd1b3VzbHkgcmVjb2duaXplZC4KLQkocmFubGliX3RvdWNoKTogTGlrZXdpc2UuCi0KLVRodSBKdW4gIDYgMTM6NTY6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBSRUFETUU6IEFkZCBub3RlcyBvbiBob3cgdG8gYnVpbGQgaWYgeW91IGRvbid0IGhhdmUgYXIuCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgb2xkIGluY29ycmVjdCBzZXR0aW5nIG9mIENDLgotCi1UdWUgSnVuICA0IDEwOjUyOjQ5IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGNoZWNrIHRvIHNlZSBpZiB0b29sZGlyIGV4aXN0cy4KLQlNYWtlICQodG9vbGRpcikgYW5kICQodG9vbGRpcikvYmluLgotCi1Nb24gSnVuICAzIDE3OjQwOjIzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jIChtYWluKTogTWFrZSBtYWluIGFuIGludCBmdW5jdGlvbiwgbm90IHZvaWQuCi0KLUZyaSBNYXkgMzEgMTM6NTk6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChmaWx0ZXJfc3ltYm9scyk6IENoZWNrIGZvciBCU0ZfV0VBSyBhcyB3ZWxsIGFzCi0JQlNGX0dMT0JBTC4KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotV2VkIE1heSAgOCAxNjo1NzoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBNYWtlIGNsZWFyIHRoYXQgaXQgaXMgb25seSBhIHdhcm5pbmcKLQl3aGVuIHRoZSBvdXRwdXQgZmlsZSBjYW4gbm90IHJlcHJlc2VudCB0aGUgYXJjaGl0ZWN0dXJlLgotCi1GcmkgTWF5ICAzIDExOjMwOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgcmVmZXIgdG8gYnl0ZXMgcGFzdCB0aGUgZW5kCi0Jb2YgZGF0YS4KLQotV2VkIEFwciAyNCAxNDoxMDoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJkZGJnLmMgKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogTW92ZSBjYWxsIHRvCi0JZnJlZV9zYXZlZF9zdGFicyBvdXRzaWRlIHRoZSBsb29wIG92ZXIgdGhlIHN5bWJvbHMuCi0KLVR1ZSBBcHIgMjMgMTI6NTY6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgc3ltYm9scyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoCi0gCWAuJyBhZnRlciBvdGhlciBzeW1ib2xzLiAgSWYgbm8gb3RoZXIgZGVjaXNpb24gY2FuIGJlIG1hZGUsIHNvcnQKLQlzeW1ib2xzIGJ5IG5hbWUuCi0KLVRodSBBcHIgMTggMTY6MDI6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkZXAtaW4uc2VkOiBTdWJzdGl0dXRlICQoQkZERElSKSBmb3IgQEJGRERJUkAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKGRlcC5zZWQpOiBTdWJzdGl0dXRlICQoQkZERElSKSBmb3IgQEJGRERJUkAuCi0KLVR1ZSBBcHIgMTYgMTM6NTA6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZGNvZmYuYzogTmV3IGZpbGUuCi0JKiByZGRiZy5jIChyZWFkX2RlYnVnZ2luZ19pbmZvKTogUmVhZCBDT0ZGIHN5bWJvbHMgaWYgQ09GRiBmbGF2b3VyCi0JYW5kIG5vIHN0YWJzIHdlcmUgZm91bmQuCi0JKiBidWRiZy5oIChwYXJzZV9jb2ZmKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHJkY29mZi5jLgotCShERUJVR19PQkpTKTogQWRkIHJkY29mZi5vLgotCi1Nb24gQXByIDE1IDE1OjU1OjAxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG5sbWNvbnYuYyAoY2hvb3NlX3RlbXBfYmFzZXssX3RyeX0pOiBEZWxldGUsIGluIGxpYmliZXJ0eSBub3cuCi0JKGxpbmtfaW5wdXRzKTogVXBkYXRlIGNhbGwgdG8gY2hvb3NlX3RlbXBfYmFzZS4KLQotTW9uIEFwciAgOCAxNDo0MDowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI5IDE2OjExOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogUHJpbnQgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZwotCWFuZCB0aGUgU0VDX0xJTktfRFVQTElDQVRFUyBmaWVsZC4KLQotRnJpIE1hciAyOSAxMTozNTo1NSAxOTk2ICBKLlQuIENvbmtsaW4gIChqdGNAbGlzYS5jeWdudXMuY29tKQotCi0JKiBubG1jb252LjE6IENoYW5nZWQgdG8gYmUgcmVjb2duaXplZCBieSBjYXRtYW4gLXcgb24gU29sYXJpcy4KLQotVGh1IE1hciAyOCAxNDoxNzowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYyAoc3RhYl9lbnVtX3R5cGUpOiBTZXQgYnVmIGJlZm9yZSB1c2luZyBpdC4KLQotRnJpIE1hciAyMiAxNTo0OTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBmaWVsZCBhYmZkLgotCShzdGFydF9zdGFiKTogQWRkIGFiZmQgcGFyYW1ldGVyLgotCShwYXJzZV9zdGFiX3N0cmluZyk6IFNraXAgdGhlIHN5bWJvbCBsZWFkaW5nIGNoYXIgd2hlbiBzZWFyY2hpbmcKLQlmb3IgdGhlIHZhbHVlIG9mIGEgZ2xvYmFsIHN5bWJvbC4KLQkqIGJ1ZGJnLmggKHN0YXJ0X3N0YWIpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBQYXNzIGFiZmQgdG8KLQlzdGFydF9zdGFiLgotCShyZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IExpa2V3aXNlLgotCi1UaHUgTWFyIDIxIDEyOjQwOjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JzdGFicy5jIChzdGFiX2Z1bmN0aW9uX3R5cGUpOiBPdXRwdXQgYW4gZW1wdHkgdHlwZWRlZiBmb3IgYW4KLQl1bnVzZWQgYXJndW1lbnQsIHJhdGhlciB0aGFuIG1ha2luZyB1cCBhIG1lYW5pbmdsZXNzIG5hbWUuCi0JKHN0YWJfdmFyaWFibGUpOiBVc2UgTl9SU1lNIGZvciBhIERFQlVHX1JFR0lTVEVSIHZhcmlhYmxlLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2luZm8pOiBBZGQgZ2xvYmFsX3ZhcnMgZmllbGQuCi0JKHBhcnNlX2llZWVfYmUpOiBXaGVuIGVuZGluZyB0aGUgZ2xvYmFsIHR5cGVkZWYgYmxvY2ssIGNvcHkgdGhlCi0JdmFyaWFibGVzIGludG8gaW5mby0+Z2xvYmFsX3ZhcnMuCi0JKHBhcnNlX2llZWVfYXRuKTogRG9uJ3QgcmVxdWlyZSBhbiBOTiByZWNvcmQgZm9yIGEgcG1pc2MgQVROLgotCShpZWVlX3JlYWRfcmVmZXJlbmNlKTogU2VhcmNoIHRoZSBnbG9iYWwgdmFyaWFibGVzIGFmdGVyIHRoZSBsb2NhbAotCXZhcmlhYmxlcy4KLQotV2VkIE1hciAyMCAxODowODoxOSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogTWFrZSBzdXJlIHN5bV9uYW1lIGlzIGFsd2F5cyBzZXQuCi0JKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBBbHdheXMgcHV0IGEgc3BhY2UgYWZ0ZXIgdGhlIHNlY3Rpb24gbmFtZS4KLQkoZHVtcF9iZmRfaGVhZGVyKTogVGVybWluYXRlIG91dHB1dCB3aXRoIG5ld2xpbmUuCi0KLVdlZCBNYXIgMjAgMTY6MzU6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmM6IE5ldyBmaWxlLgotCSogYnVkYmcuaCAod3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8pOiBEZWNsYXJlLgotCSogb2JqY29weS5jICh3cml0ZV9kZWJ1Z2dpbmdfaW5mbyk6IEZvciBDT0ZGIG9yIEVMRiwgb3V0cHV0IHN0YWJzCi0JaW4gc2VjdGlvbnMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCB3cnN0YWJzLmMuCi0JKFdSSVRFX0RFQlVHX09CSlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoT0JKQ09QWV9QUk9HKSk6IFVzZSAkKFdSSVRFX0RFQlVHX09CSlMpLCBub3QgJChERUJVR19PQkpTKS4KLQkoJChTVFJJUF9QUk9HKSk6IExpa2V3aXNlLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX21lbWJlcnMpOiBNYWtlIHR5cGUgc3R1YiBkZXRlY3Rpb24gbW9yZSBsaWtlCi0JZ2RiLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2hhbmRsZSk6IEFkZCBmaWVsZHMgY29tcGxleF9mbG9hdF9pbmRleCBhbmQKLQljb21wbGV4X2RvdWJsZV9pbmRleC4KLQkoaWVlZV9jb21wbGV4X3R5cGUpOiBDYWNoZSB0eXBlIGluZGV4IGluIGNvbXBsZXhfZmxvYXRfaW5kZXggYW5kCi0JY29tcGxleF9kb3VibGVfaW5kZXgsIGRlcGVuZGluZyB1cG9uIHNpemUuICBTZXQgc2l6ZSBvbiB0eXBlIHN0YWNrCi0JdG8gc2l6ZSAqIDIuCi0KLQkqIGllZWUuYyAoaWVlZV9lbXB0eV90eXBlKTogVXNlIGJ1aWx0aW5fdW5rbm93biwgbm90IDAuCi0JKGllZWVfdm9pZF90eXBlKTogVXNlIGJ1aWx0aW5fdm9pZCwgbm90IDEuCi0KLQkqIGllZWUuYyAocGFyc2VfaWVlZV90eSk6IEhhbmRsZSAnVicgdHlwZSBjb2RlLgotCShwYXJzZV9pZWVlX2F0bik6IERvbid0IHJlcXVpcmUgdHdvIG51bWJlcnMgZm9yIHR5cGUgMTAuCi0KLQkqIGllZWUuYyAocGFyc2VfaWVlZV9iZSk6IEFkZCBvbmUgdG8gb2Zmc2V0IGF0IGVuZCBvZiBmdW5jdGlvbiBvcgotCWJsb2NrLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2Jsb2NrKTogQWRkIGZpZWxkIHNraXAuCi0JKHBhcnNlX2llZWVfYmIpOiBEb24ndCBjYWxsIGRlYnVnX3JlY29yZF9mdW5jdGlvbiBmb3IgX19YUllDUFAKLQlmdW5jdGlvbiwgYW5kIHNldCBza2lwIGZpZWxkLgotCShwYXJzZV9pZWVlX2JlKTogRG9uJ3QgY2FsbCBkZWJ1Z19lbmRfZnVuY3Rpb24gaWYgc2tpcCBpcyBzZXQuCi0KLQkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19oYW5kbGUpOiBBZGQgZmllbGRzIGN1cnJlbnRfd3JpdGVfbGluZW5vCi0JYW5kIGN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4LgotCShkZWJ1Z193cml0ZSk6IEluaXRpYWxpemUgY3VycmVudF93cml0ZV9saW5lbm8gYW5kCi0JY3VycmVudF93cml0ZV9saW5lbm9faW5kZXggZm9yIGVhY2ggdW5pdC4gIENhbGwKLQlkZWJ1Z193cml0ZV9saW5lbm9zIHJhdGhlciB0aGFuIHdyaXRpbmcgb3V0IHRoZSBsaW5lIG51bWJlcnMKLQlkaXJlY3RseS4KLQkoZGVidWdfd3JpdGVfZnVuY3Rpb24pOiBDYWxsIGRlYnVnX3dyaXRlX2xpbmVub3MuCi0JKGRlYnVnX3dyaXRlX2Jsb2NrKTogTGlrZXdpc2UuCi0JKGRlYnVnX3dyaXRlX2xpbmVub3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z193cml0ZV90eXBlKTogRm9yIERFQlVHX0tJTkRfRlVOQ1RJT04sIHB1c2ggcmV0dXJuCi0JdHlwZSBiZWZvcmUgYXJndW1lbnRzLgotCi1Nb24gTWFyIDE4IDE4OjA1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQUNfRlVOQ19WRk9SSy4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogZGxsdG9vbC5jLCBubG1jb252LmM6IEluY2x1ZGUgPHZmb3JrLmg+IGlmIEhBVkVfVkZPUktfSCBpcwotCWRlZmluZWQuCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IEEgY29tcGxleCB0eXBlIGlzIGRlZmluZWQgYXMgYQotCXN1YnJhbmdlIG9mIGl0c2VsZiB3aXRoIHRoZSBoaWdoIGJvdW5kIHplcm8uCi0JKiBpZWVlLmMgKGllZWVfY29tcGxleF90eXBlKTogRG9uJ3QgY3Jhc2ggb24gc2l6ZXMgb2YgMTIgb3IgMTYuCi0KLVR1ZSBNYXIgMTIgMTI6MDk6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZyk6IFN3aXRjaCB0byBnbG9iYWxfdHlwZXMgZXZlbgotCWlmIGl0IGlzIG5vdCBlbXB0eS4KLQkoaWVlZV90YWdfdHlwZSk6IEZvciBhbiBlbnVtLCBsb29rIHRocm91Z2ggaW5mby0+ZW51bXMuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotCSogZGVidWcuYyAoZGVidWdfdHlwZV9zYW1lcCk6IERvbid0IGxvb3AgZW5kbGVzc2x5IGluCi0JREVCVUdfS0lORF9FTlVNIGNhc2UuICBGcm9tIEVyaWMgQmF1ciA8ZWNiQG5leGVuLmNvbT4uCi0KLU1vbiBNYXIgMTEgMTI6MzU6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBDYWxsIHNhdmVfc3RhYiBmb3IKLQllYWNoIHN0YWIgZW50cnksIGNhbGwgc3RhYl9jb250ZXh0IG9uIGFuIGVycm9yLCBhbmQgY2FsbAotCWZyZWVfc2F2ZWRfc3RhYnMgYmVmb3JlIHJ0dXJuaW5nLgotCShyZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IExpa2V3aXNlLgotCShTQVZFX1NUQUJTX0NPVU5UKTogRGVmaW5lLgotCShzdHJ1Y3Qgc2F2ZWRfc3RhYik6IERlZmluZS4KLQkoc2F2ZWRfc3RhYnMsIHNhdmVkX3N0YWJzX2luZGV4KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHNhdmVfc3RhYiwgc3RhYl9jb250ZXh0LCBmcmVlX3NhdmVkX3N0YWJzKTogTmV3IHN0YXRpYyBmdW5jdGlvcy4KLQotCSogb2JqZHVtcC5jIChzdGFiX25hbWUpOiBSZW1vdmUuCi0JKHN0cnVjdCBzdGFiX3ByaW50KTogUmVtb3ZlLgotCShzdGFiX3ByaW50KTogUmVtb3ZlLgotCShkdW1wX3N0YWJzKTogRG9uJ3QgaW5pdGlhbGl6ZSBzdGFiX25hbWUuCi0JKHByaW50X3NlY3Rpb25fc3RhYnMpOiBDYWxsIGJmZF9nZXRfc3RhYl9uYW1lIHJhdGhlciB0aGFuIHVzaW5nCi0JdGhlIHN0YWJfbmFtZSBhcnJheS4KLQotVHVlIEZlYiAyNyAxOTo1MjowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHByZGJnLmMgKHByX2ludF9jb25zdGFudCk6IEluaXRpYWxpemUgaW5mbyBjb3JyZWN0bHkuCi0JKHByX2Zsb2F0X2NvbnN0YW50KTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMjYgMTg6MTE6MzcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSB0byBoYW5kbGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KLQotU2F0IEZlYiAyNCAxMToyMTo0OSAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCi0JKiBNYWtlZmlsZS5pbiAoJChPQkpEVU1QX1BST0cpKTogU2VhcmNoICQoQkZETElCKSBiZWZvcmUKLQkkKE9QQ09ERVMpLgotCi1UaHUgRmViIDE1IDEyOjQ0OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCB0YW1wZXIgd2l0aCBMREZMQUdTLiAgQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZQotCWNvbmZpZ3VyZS5ob3N0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgUlBBVEhfRU5WVkFSLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFJQQVRIX0VOVlZBUik6IE5ldyB2YXJpYWJsZS4KLQkoY2hlY2spOiBVc2UgJChSUEFUSF9FTlZWQVIpIHJhdGhlciB0aGFuIExEX0xJQlJBUllfUEFUSC4KLQotCSogb2JqY29weS5jIChzbWFydF9yZW5hbWUpOiBSYXRoZXIgdGhhbiBkb2luZyBjaG1vZCB0aGVuIGNob3duLCBkbwotCWNobW9kIHdpdGhvdXQgc2V0dWlkLCB0aGVuIGNob3duLCB0aGVuIGNobW9kIHdpdGggc2V0dWlkLgotCi1XZWQgRmViIDE0IDE2OjQ2OjQyIDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIGFyc3VwLmMgKG1hcF9vdmVyX2xpc3QpOiBSZWluZGVudC4gIERvbid0IGFzc3VtZSB0aGF0IHRoZQotCWZ1bmN0aW9uIGRvZXMgbm90IGRlbGV0ZSB0aGUgQkZELgotCShhcl9hZGRsaWJfZG9lcik6IERvbid0IHNldCBwcmV2LT5uZXh0IGlmIHByZXYgaXMgTlVMTC4KLQotV2VkIEZlYiAxNCAxNToxMjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9yZWdub190b19nZW5yZWcpOiBDb252ZXJ0IHJlZ2lzdGVyIG51bWJlcnMgZm9yIG02OGsKLQlhbmQgaTk2MC4KLQkoaWVlZV9nZW5yZWdfdG9fcmVnbm8pOiBMaWtld2lzZS4KLQotTW9uIEZlYiAxMiAxNDoxOTo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gd3JpdGUgY29kZSB0byBwdXQgdHlwZXMgaW4gdGhlCi0JZ2xvYmFsIHR5cGUgYmxvY2sgd2hlbiBwb3NzaWJsZSwgdG8gb3V0cHV0IHJhbmdlcyBmb3IgYWxsIG1lbW9yeQotCW9jY3VwaWVkIGJ5IHRoZSBtb2R1bGUsIGFuZCB0byBpbXByb3ZlIGVmZmljaWVuY3kuCi0KLQkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19oYW5kbGUpOiBSZW1vdmUgY2xhc3NfbWFyayBmaWVsZC4gIEFkZAotCWlkX2xpc3QgYW5kIGNvbXBhcmVfbGlzdCBmaWVsZHMuCi0JKHN0cnVjdCBkZWJ1Z19jbGFzc19pZCk6IERlZmluZS4KLQkoc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0KTogRGVmaW5lLgotCShkZWJ1Z193cml0ZSk6IEluaXRpYWxpemUgaW5mby0+aWRfbGlzdAotCShkZWJ1Z193cml0ZV9uYW1lKTogUmVtb3ZlIHJlZmVyZW5jZSB0byBpbmZvLT5jbGFzc19tYXJrLgotCShkZWJ1Z193cml0ZV90eXBlKTogR2V0IGlkIGZvciBhbGwgc3RydWN0cyBhbmQgY2xhc3Nlcy4gIFNpbXBsaWZ5Ci0JdGVzdCBmb3Igd2hldGhlciBzdHJ1Y3QgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgotCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogR2V0IGlkIGZvciBhbGwgY2xhc3Nlcy4gIFNpbXBsaWZ5IHRlc3QKLQlmb3Igd2hldGhlciBjbGFzcyBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCi0JKGRlYnVnX3dyaXRlX2Jsb2NrKTogRG9uJ3Qgd3JpdGUgb3V0IGJsb2NrcyBvdGhlciB0aGFuIHRoZSB0b3AKLQlsZXZlbCBibG9jayBpZiB0aGV5IGhhdmUgbm8gbG9jYWwgdmFyaWFibGVzLgotCShkZWJ1Z19zZXRfY2xhc3NfaWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkZWJ1Z190eXBlX3NhbWVwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGVidWdfY2xhc3NfdHlwZV9zYW1lcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBwcmRiZy5jIChwcl9zdGFydF9zdHJ1Y3RfdHlwZSk6IEFsd2F5cyBwcmludCBpZC4KLQkocHJfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCShwcl90YWdfdHlwZSk6IExpa2V3aXNlLgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgc3ltcyBhbmQgc3ltY291bnQgZmllbGRzLgotCShzdGFydF9zdGFiKTogQWRkIHN5bXMgYW5kIHN5bWNvdW50IHBhcmFtZXRlcnMuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkocGFyc2Vfc3RhYl9zdHJpbmcpOiBMb29rIHVwIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIHN5bWJvbCB0YWJsZQotCXRvIGdldCB0aGUgcmlnaHQgdmFsdWUuCi0JKiBidWRiZy5oIChzdGFydF9zdGFiKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogcmRkYmcuYyAocmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogQWRkIHN5bXMgYW5kCi0Jc3ltY291bnQgcGFyYW1ldGVycy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9hcnJheV90eXBlKTogSWYgdGhlIGluZGV4IHR5cGUgaXMgMCwgdXNlCi0JaW50LgotCi1XZWQgRmViICA3IDE0OjE3OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQpOiBDbGVhciBtb2RpZmllZCBhbmQKLQltb2RpZmllZF9hbGxvYyBmaWVsZHMgb2YgaW5mby4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgU3Vic3RpdHV0ZSBuZXcKLQl2YXJpYWJsZXMgQkZETElCIGFuZCBPUENPREVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEJGRExJQik6IFNldCB0byBAQkZETElCQC4KLQkoT1BDT0RFUyk6IFNldCB0byBAT1BDT0RFU0AuCi0KLU1vbiBGZWIgIDUgMTY6MTg6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYmZkIGFuZCBvcGNvZGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMsIGJhc2VkIG9uCi0JcGF0Y2hlcyBmcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbiAoSExERkxBR1MpOiBOZXcgc3Vic3RpdHV0aW9uLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEhMREZMQUdTKTogTmV3IHZhcmlhYmxlLiAgTWFrZSBhbGwgbGlua3MgdXNlCi0JJChITERGTEFHUykgYmVmb3JlICQoQ0ZMQUdTKSBhbmQgJChMREZMQUdTKS4KLQkoQkZETElCX0RFUCk6IE5ldyB2YXJpYWJsZS4gIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mICQoQkZEKSBhcwotCWEgZGVwZW5kZW5jeSB3aXRoICQoQkZETElCX0RFUCkuICBSZW1vdmUgJChCRkQpIGFzIGEgZGVwZW5kZW5jeSBpZgotCXRoZXJlIGlzIGFsc28gYSBkZXBlbmRlbmN5IG9uICQoQURETF9ERVBTKS4KLQkoQkZETElCKTogUmVuYW1lIGZyb20gQkZEOyBjaGFuZ2UgYWxsIHVzZXM7IHNldCB0byAtTC4uL2JmZCAtbGJmZC4KLQkoT1BDT0RFU19ERVApOiBOZXcgdmFyaWFibGUuICBSZXBsYWNlIGFsbCBvY2N1cnJlbmRzIG9mICQoT1BDT0RFUykKLQlhcyBhIGRlcGVuZGVuY3kgd2l0aCAkKE9QQ09ERVNfREVQKS4KLQkoT1BDT0RFUyk6IFNldCB0byAtTC4uL29wY29kZXMgLWxvcGNvZGVzLgotCShBRERMX0RFUFMpOiBOZXcgdmFyaWFibGUuICBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZgotCSQoQURETF9MSUJTKSBhcyBhIGRlcGVuZGVuY3kgd2l0aCAkKEFERExfREVQUykuCi0JKGNoZWNrKTogU2V0IExEX0xJQlJBUllfUEFUSCBpbiB0aGUgZW52aXJvbm1lbnQuCi0JKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBCRkQgY29uZmlndXJlLmhvc3QgYW5kIGNvbmZpZy5iZmQuCi0KLUZyaSBGZWIgIDIgMTc6MDI6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYzogI2luY2x1ZGUgc3RkYXJnLmggb3IgdmFyYXJncy5oLgotCShvYmpkdW1wX3ByaW50X3ZhbHVlKTogQ2hhbmdlIEZJTEUqIGFyZyB0byBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyouCi0JQWxsIGNhbGxlcnMgdXBkYXRlZC4gIFVzZSBmcHJpbnRmX2Z1bmMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IENvbnNpc3RlbnRseSB1c2UgZnByaW50Zl9mdW5jLgotCShvYmpkdW1wX3NwcmludGYpOiBOZXcgZnVuY3Rpb24uCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBQcmludCBpbnNuIGludG8gYSBidWZmZXIsIHByaW50IHJhdyBpbnNuIG91cnNlbHZlcywKLQl0aGVuIHByaW50IGluc24gbW5lbW9uaWMuCi0KLUZyaSBGZWIgIDIgMTY6NDg6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgIDEgMDk6Mzg6MTggMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzMtNl04Ni0qLXdpbjMyKTogQmVjb21lcyBpWzMtNl04Ni0qLWN5Z3dpbjMyLgotCShwb3dlcnBjKi0qLWN5Z3dpbjMyKTogTmV3LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotV2VkIEphbiAzMSAxMzoyMjowMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSAkKERFTUFOR0xFUl9QUk9HKS4xLgotCi1Nb24gSmFuIDI5IDE3OjM2OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBIIEogTHUgPGhqbEB6b29tLmNvbT46Ci0JKiBvYmpjb3B5LmMgKHJlbW92ZV9sZWFkaW5nX2NoYXIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUik6IERlZmluZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1yZW1vdmUtbGVhZGluZy1jaGFyLgotCShmaWx0ZXJfc3ltYm9scyk6IElmIHJlbW92ZV9sZWFkaW5nX2NoYXIsIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyCi0Jb2YgYSBnbG9iYWwgc3ltYm9sIG1hdGNoZXMgdGhlIHN5bWJvbCBsZWFkaW5nIGNoYXIgb2YgdGhlIEJGRCwKLQlyZW1vdmUgdGhlIGZpcnN0IGNoYXJhY3Rlci4KLQkoY29weV9vYmplY3QpOiBGaWx0ZXIgdGhlIHN5bWJvbHMgaWYgcmVtb3ZlX2xlYWRpbmdfY2hhciBpcyBzZXQuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtLXJlbW92ZS1sZWFkaW5nLWNoYXIuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tcmVtb3ZlLWxlYWRpbmctY2hhci4KLQotU2F0IEphbiAyNyAxNTo0MDoxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZnByaW50Zik6IEFkZCBwcm90b3R5cGUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyBvbgotCVN1bk9TLgotCi1GcmkgSmFuIDI2IDExOjUzOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAobm0pOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb24gc3ltYm9sIHR5cGVzLgotCShvYmpkdW1wKTogUmVmZXJlbmNlIHRoZSBzdGFicyBtYW51YWwgZnJvbSB0aGUgZGlzY3Vzc2lvbiBvZiB0aGUKLQktLXN0YWJzIG9wdGlvbi4KLQotVGh1IEphbiAyNSAxMToyMTo0NiAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEFkZCBhICJzdGFtcHMiIHRhcmdldC4KLQotVGh1IEphbiAyNSAxMzo1MTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9oZWFkZXJzLCBkdW1wX3NlY3Rpb25faGVhZGVyKTogQ2hhbmdlIG9iamR1bXAgLWgKLQlvdXRwdXQgdG8gYmUgc2ltcGxlciBhbmQgdG8gaW5jbHVkZSBzZWN0aW9uIGZpbGUgb2Zmc2V0cy4KLQotV2VkIEphbiAyNCAxMjowNjowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfbWVtYmVycyk6IERvbid0IGFkanVzdCB2b2Zmc2V0LgotCi0JKiBpZWVlLmMgKGllZWVfcmVhZF9jeHhfY2xhc3MpOiBEb24ndCBtdWx0aXBseSB2b2Zmc2V0IGJ5IDQuCi0JKHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUpOiBBZGQgbmFtZSBmaWVsZC4KLQkoc3RydWN0IGllZWVfdHlwZV9jbGFzcyk6IFJlbW92ZSBuYW1lIGZpZWxkLiAgQ2hhbmdlIGFsbCB1c2VzIHRvCi0JdXNlIG5ldyBuYW1lIGZpZWxkIGluIHR5cGUgaW5zdGVhZC4KLQkoc3RydWN0IGllZWVfbmFtZV90eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfc3RhcnRfc3RydWN0X3R5cGUpOiBJbml0aWFsaXplIG5hbWUgZmllbGQgb2YgdHlwZS4KLQkoaWVlZV9zdGFydF9jbGFzc190eXBlKTogRG9uJ3QgaW5pdGlhbGl6ZSBjbGFzc2RlZiBlbnRyeSBvZiB0YWcuCi0JKGllZWVfY2xhc3NfbWV0aG9kX3Zhcik6IERvbid0IGFkanVzdCB2b2Zmc2V0LgotCShpZWVlX2VuZF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfdGFnX3R5cGUpOiBJbml0aWFsaXplIG5ldyBuYW1lIGZpZWxkIG9mIHR5cGUuCi0JKGllZWVfdHlwZGVmKTogU2V0IG5hbWUgYWZ0ZXIgY29weWluZyBpbiB0eXBlIGluZm9ybWF0aW9uLgotCi0JKiBkZWJ1Zy5jIChWT0ZGU0VUX1NUQVRJQ19NRVRIT0QpOiBEZWZpbmUgYXMgLTEsIG5vdCAxLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBpZWVlX2hhbmRsZSk6IEFkZCBtb2RpZmllZCBhbmQgbW9kaWZpZWRfYWxsb2MgZmllbGRzLgotCShpZWVlX2dldF9tb2RpZmllZF9pbmZvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9wb2ludGVyX3R5cGUpOiBDYWNoZSB0eXBlIGluZGV4LgotCShpZWVlX2NvbnN0X3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV92b2xhdGlsZV90eXBlKTogTGlrZXdpc2UuCi0KLQkqIGllZWUuYyAoaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSk6IFdoZW4gY3JlYXRpbmcgYSB0YWcgZm9yIGFuCi0JYW5vbnltb3VzIHN0cnVjdCwgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeS4KLQkoaWVlZV90YWdfdHlwZSk6IExpa2V3aXNlLgotCSogZGVidWcuYyAoZGVidWdfd3JpdGVfdHlwZSk6IE9ubHkgY2hlY2sgYW5kIHNldCBpZCBmaWVsZCBmb3IgYW4KLQl1bm5hbWVkIG9iamVjdC4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCi0JKiBpZWVlLmM6IFZhcmlvdXMgY2hhbmdlcyB0byB3cml0ZSBvdXQgdHlwZXMgZm9yIGZ1bmN0aW9ucyBhbmQKLQlyZWZlcmVuY2VzLCBhbmQgdG8gbm90IHdyaXRlIG91dCB1bm5lY2Vzc2FyeSBmdW5jdGlvbiB0eXBlcy4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV92YXIpOiBSZW1vdmUgdmFyaWFibGUgZmllbGQuICBBZGQga2luZAotCWZpZWxkLCBhbmQgZGVmaW5lIHNvbWUgZW51bSBjb25zdGFudHMgZm9yIGl0LgotCShwYXJzZV9pZWVlX3R5KTogU2V0IGtpbmQgZmllbGQgb2YgdmFyaWFibGUgZm9yICd4JyBhbmQgJ1gnIHR5cGVzLgotCShwYXJzZV9pZWVlX2F0bik6IE1ha2UgYW4gaW5kaXJlY3Qgc2xvdCBmb3IgYW4gZXh0ZXJuYWwgdmFyaWFibGUsCi0JYWx0aG91Z2ggd2Ugb3RoZXJ3aXNlIGRvbid0IHJlY29yZCBpdC4gIFNldCBraW5kIGZpZWxkIHJhdGhlciB0aGFuCi0JdmFyaWFibGUgZmllbGQgb2YgcHZhci4KLQkoaWVlZV9yZWFkX2N4eF9jbGFzcyk6IFRyeSB0byBnZXQgdGhlIHR5cGUgb2YgYSBzdGF0aWMgbWVtYmVyLgotCShpZWVlX3JlYWRfcmVmZXJlbmNlKTogQ2hlY2sga2luZCBmaWVsZCByYXRoZXIgdGhhbiB2YXJpYWJsZQotCWZpZWxkLgotCi1UdWUgSmFuIDIzIDE1OjU0OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBWYXJpb3VzIGNoYW5nZXMgdG8gaGFuZGxlIHJlYWRpbmcgQysrIHJlZmVyZW5jZSB0eXBlCi0JaW5mb3JtYXRpb24uCi0KLQkqIGRlYnVnLmggKGVudW0gZGVidWdfdmFyX2tpbmQpOiBBZGQgREVCVUdfVkFSX0lMTEVHQUwuCi0JKGVudW0gZGVidWdfcGFybV9raW5kKTogQWRkIERFQlVHX1BBUk1fSUxMRUdBTC4KLQkqIGRlYnVnLmMgKGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMpOiBIYW5kbGUgREVCVUdfS0lORF9GVU5DVElPTi4KLQotCSogaWVlZS5jOiBWYXJpb3VzIGNoYW5nZXMgdG8gd3JpdGUgb3V0IGRlZmluaXRpb25zIG9mIEMrKyBjbGFzc2VzLgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z19hcHBlbmRfZmlsZW5hbWUpOiBSZW1vdmUuCi0JKiBkZWJ1Zy5oIChkZWJ1Z19hcHBlbmRfZmlsZW5hbWUpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBSZW1vdmUgbGFzdF90eXBlIGZpZWxkLiAgQWRkCi0Jc29fc3RyaW5nIGFuZCBzb192YWx1ZSBmaWVsZHMuCi0JKGZpbmlzaF9zdGFiKTogQ2FsbCBzdGFiX2VtaXRfcGVuZGluZ192YXJzIGJlZm9yZSBjYWxsaW5nCi0JZGVidWdfZW5kX2Z1bmN0aW9uLiAgRG9uJ3Qgd2FybiBhYm91dCBwZW5kaW5nIHZhcmlhYmxlcy4KLQkocGFyc2Vfc3RhYik6IEFjY3VtdWxhdGUgTl9TTyBzdHJpbmdzIHVudGlsIGEgbm9uIE5fU08gc3ltYm9sIGlzCi0Jc2VlbiwgcmF0aGVyIHRoYW4gY2FsbGluZyBkZWJ1Z19hcHBlbmRfZmlsZW5hbWUuICBDYWxsCi0Jc3RhYl9lbWl0X3BlbmRpbmdfdmFycyBiZWZvcmUgY2FsbGluZyBkZWJ1Z19lbmRfZnVuY3Rpb24uICBEb24ndAotCXNldCBpbmZvLT5sYXN0X3R5cGUuCi0KLVR1ZSBKYW4gMjMgMDk6NTM6NTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSB1bmtub3duIGVuZGlhbm5lc3MuCi0JUGFzcyBmcHJpbnRmIHRvIElOSVRfRElTQVNTRU1CTEVfSU5GTy4KLQotTW9uIEphbiAyMiAxNjo0Njo0MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCUFkZCBuZXcgb3B0aW9uIC0tc2hvdy1yYXctaW5zbi4KLQkqIG9iamR1bXAuYyAoc2hvd19yYXdfaW5zbik6IE5ldyBnbG9iYWwuCi0JKHVzYWdlKTogVXBkYXRlLgotCShsb25nX29wdGlvbnMpOiBVcGRhdGUuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgZGlzYXNtX2luZm8uZmxhZ3MgaWYgLS1zaG93LXJhdy1pbnNuLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgbmV3IGFyY2gsbWFjaCxlbmRpYW4gZmllbGRzIGluCi0JZGlzYXNtX2luZm8uCi0KLU1vbiBKYW4gMjIgMTk6Mjk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHBhc3MgYSBzaW5nbGUgaW5mbyBhcmd1bWVudCBhcm91bmQKLQlpbiB0aGUgcmVhZGluZyByb3V0aW5lcywgcmF0aGVyIHRoYW4gc2V2ZXJhbCBhcmd1bWVudHMuICBBZGQgY29kZQotCXRvIHJlYWQgQysrIGRlYnVnZ2luZyByZWNvcmRzLgotCi0JKiBkZWJ1Zy5oIChkZWJ1Z19nZXRfdHlwZV9zaXplKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX25hbWUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfYml0cG9zKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfdmlzaWJpbGl0eSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF9waHlzbmFtZSk6IERlY2xhcmUuCi0JKiBkZWJ1Zy5jIChkZWJ1Z19nZXRfcmVhbF90eXBlKTogSGFuZGxlIERFQlVHX0tJTkRfVEFHR0VELgotCShkZWJ1Z19nZXRfdHlwZV9zaXplKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF92aXNpYmlsaXR5KTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfcGh5c25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBNYWtlIHN1cmUgd2UgcGFzcyB0aGUgcmVhbCBraW5kLCBub3QgSU5ESVJFQ1QsCi0JdG8gdGFnX3R5cGUuICBQYXNzIHRoZSBuYW1lIHJlY3Vyc2l2ZWx5IGZvciBJTkRJUkVDVC4KLQotRnJpIEphbiAxOSAxMjozMTo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlYnVnLmggKHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMpOiBSZW1vdmUgZWxsaXBzaXNfdHlwZS4gIEFkZCBpbnQKLQlhbmQgYm9vbGVhbiBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9uX3R5cGUuICBBZGQgYm9vbGVhbiBwYXJhbWV0ZXIgdG8KLQltZXRob2RfdHlwZS4KLQkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogRG9uJ3QgZGVjbGFyZS4KLQkoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlKTogQWRkIGRlYnVnX3R5cGUgKiBhbmQgYm9vbGVhbgotCXBhcmFtZXRlcnMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGRlYnVnX21ha2VfbWV0aG9kX3R5cGUpOiBBZGQgYm9vbGVhbiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IEFkZCBib29sZWFuICogcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKGRlYnVnX2dldF90YXJnZXRfdHlwZSk6IERlY2xhcmUuCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSk6IEFkZCBmaWVsZHMgYXJnX3R5cGVzIGFuZAotCXZhcmFyZ3MuCi0JKHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSk6IEFkZCBmaWVsZCB2YXJhcmdzLgotCShkZWJ1Z19lbGxpcHNpc190eXBlLCBFTExJUFNJU19QKTogUmVtb3ZlLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBSZW1vdmUuCi0JKGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSk6IEFkZCBhcmdfdHlwZXMgYW5kIHZhcmFyZ3MgcGFyYW1ldGVycy4KLQkoZGVidWdfbWFrZV9tZXRob2RfdHlwZSk6IEFkZCB2YXJhcmdzIHBhcmFtZXRlci4KLQkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IEFkZCBwdmFyYXJncyBwYXJhbWV0ZXIuCi0JKGRlYnVnX2dldF90YXJnZXRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IEluIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTiwgcHVzaCBhcmd1bWVudAotCXR5cGVzIGFuZCBwYXNzIGNvdW50IHRvIGZ1bmN0aW9uX3R5cGUuICBJbiBERUJVR19LSU5EX01FVEhPRCwgdXNlCi0JYSBzaWduZWQgaW50IGZvciB0aGUgY291bnQsIGRvbid0IGNhbGwgZWxsaXBzaXNfdHlwZSwgYW5kIHBhc3MKLQl2YXJhcmdzIHRvIG1ldGhvZF90eXBlLgotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyk6IEFkZCB2YXJhcmdzIGZpZWxkLgotCShzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzKTogQWRkIHB2YXJhcmdzIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShzdGFiX2RlbWFuZ2xlX2FyZ3MpOiBMaWtld2lzZS4KLQkoc3RhYl9kZW1hbmdsZV90eXBlKTogSW4gY2FzZSAnRicsIHBpY2sgdXAgYXJndW1lbnQgdHlwZXMuCi0JKiBwcmRiZy5jIChwcl9lbGxpcHNpc190eXBlKTogUmVtb3ZlLgotCShwcl9mdW5jdGlvbl90eXBlKTogQWRkIGFyZ2NvdW50IGFuZCB2YXJhcmdzIHBhcmFtZXRlcnMuCi0JKHByX21ldGhvZF90eXBlKTogQWRkIHZhcmFyZ3MgcGFyYW1ldGVyLgotCSogaWVlZS5jIChpZWVlX2VsbGlwc2lzX3R5cGUpOiBSZW1vdmUuCi0JKGllZWVfZnVuY3Rpb25fdHlwZSk6IEFkZCBhcmdjb3VudCBhbmQgdmFyYXJncyBwYXJhbWV0ZXJzLgotCShpZWVlX21ldGhvZF90eXBlKTogQWRkIHZhcmFyZ3MgcGFyYW1ldGVyLiAgUmVtb3ZlIG1vc3Qgb2YKLQlmdW5jdGlvbiBib2R5LCBhbmQganVzdCBjYWxsIGllZWVfZnVuY3Rpb25fdHlwZS4KLQotCSogc3RhYnMuYzogSW5jbHVkZSAiZGVtYW5nbGUuaCIuICBBZGRlZCBzZXZlcmFsIG5ldyBzdGF0aWMKLQlmdW5jdGlvbnMgbm90IGxpc3RlZCBiZWxvdyB0byBkZW1hbmdsZSBhcmd1bWVudCB0eXBlczsgdGhleSBhcmUKLQlhbGwgY2FsbGVkIHZpYSBzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzLgotCShmaW5pc2hfc3RhYik6IElmIHRoZSBraW5kIG9mIGFuIHVuZGVmaW5lZCB0YWcgaXMKLQlERUJVR19LSU5EX0lMTEVHQUwsIHVzZSBERUJVR19LSU5EX1NUUlVDVCBpbnN0ZWFkLiAgV2FybiBpZiB0aGVyZQotCWFyZSBhbnkgcGVuZGluZyB2YXJpYWJsZS4KLQkocGFyc2Vfc3RhYik6IERvbid0IGNsb3NlIHRoZSBmdW5jdGlvbiB3aGVuIHRoZSBibG9jayBkZXB0aCBnb2VzCi0JdG8gemVyby4gIFBhc3MgdmFsdWUgdG8gZGVidWdfZW5kX2Z1bmN0aW9uLgotCShwYXJzZV9zdGFiX3N0cmluZyk6IEluIGNhc2UgJ1QnLCBwYXNzIHRoZSBuYW1lIHRvCi0JcGFyc2Vfc3RhYl90eXBlLgotCShwYXJzZV9zdGFiX3R5cGUpOiBJbiBjYXNlICd4JywgdXNlIHN0YWJfZmluZF90YWdnZWRfdHlwZS4gIEluCi0JY2FzZSAnIycsIGhhbmRsZSBmdW5jdGlvbnMgd2l0aCB2YXJpYWJsZSBudW1iZXJzIG9mIGFyZ3VtZW50cy4KLQkocGFyc2Vfc3RhYl9zdHJ1Y3RfdHlwZSk6IEFkZCB0YWduYW1lIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShwYXJzZV9zdGFiX21lbWJlcnMpOiBBZGQgdGFnbmFtZSBhbmQgdHlwZW51bXMgcGFyYW1ldGVycy4gIENoYW5nZQotCWFsbCBjYWxsZXJzLiAgSWYgdGhlIHR5cGUgb2YgYSBtZXRob2QgaXMgYSBzdHViLCBjYWxsCi0JcGFyc2Vfc3RhYl9hcmd0eXBlcyB0byBkZW1hbmdsZSB0aGUgYXJndW1lbnQgdHlwZXMgYW5kIGdldCB0aGUKLQlwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KLQkocGFyc2Vfc3RhYl9hcmd0eXBlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0YWJfcmVjb3JkX3ZhcmlhYmxlKTogRm9yIGEgREVCVUdfR0xPQkFMIG9yIERFQlVHX1NUQVRJQwotCXZhcmlhYmxlLCBjYWxsIGRlYnVnX3JlY29yZF92YXJpYWJsZSBpbW1lZGlhdGVseS4KLQkoc3RhYl9maW5kX3RhZ2dlZF90eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogZGVidWcuaCAoZW51bSBkZWJ1Z190eXBlX2tpbmQpOiBBZGQgREVCVUdfS0lORF9JTExFR0FMLgotCShzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zKTogQWRkIGZpZWxkIGVsbGlwc2lzX3R5cGUuICBBZGQgaWQKLQlwYXJhbWV0ZXIgdG8gc3RhcnRfc3RydWN0X3R5cGUsIHN0YXJ0X2NsYXNzX3R5cGUsIGFuZCB0YWdfdHlwZS4KLQkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogRGVjbGFyZS4KLQkoZGVidWdfZmluZF9uYW1lZF90eXBlKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X3R5cGVfa2luZCk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9yZXR1cm5fdHlwZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRzKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX3R5cGUpOiBEZWNsYXJlLgotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2hhbmRsZSk6IEFkZCBmaWVsZHMgY2xhc3NfaWQgYW5kIGJhc2VfaWQuCi0JKHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlKTogQWRkIGZpZWxkIGlkLgotCShzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgYXJndHlwZXMgdG8gcGh5c25hbWUuCi0JQ2hhbmdlIGFsbCB1c2VzLgotCShkZWJ1Z19lbGxpcHNpc190eXBlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoRUxMSVBTSVNfUCk6IE5ldyBtYWNyby4KLQkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50KTogUmVuYW1lIGFyZ3R5cGVzIHRvIHBoeXNuYW1lLgotCShkZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCk6IExpa2V3aXNlLgotCShkZWJ1Z19uYW1lX3R5cGUpOiBBbHdheXMgcHV0IHR5cGVzIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgotCShkZWJ1Z19maW5kX25hbWVkX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUpOiBUcmVhdCBERUJVR19LSU5EX0lMTEVHQUwgc3BlY2lhbGx5LAotCXJhdGhlciB0aGFuIERFQlVHX0tJTkRfVk9JRC4KLQkoZGVidWdfZ2V0X3JlYWxfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF90eXBlX2tpbmQpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9yZXR1cm5fdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkcyk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX3dyaXRlKTogSW5pdGlhbGl6ZSBiYXNlX2lkLgotCShkZWJ1Z193cml0ZV90eXBlKTogUGFzcyBuZXcgaWQgYXJndW1lbnQgdG8gdGFnX3R5cGUuICBIYW5kbGUKLQlERUJVR19LSU5EX0lMTEVHQUwuICBVc2UgaWQgZm9yCURFQlVHX0tJTkRfU1RSVUNUIGFuZAotCURFQlVHX0tJTkRfVU5JT04uICBIYW5kbGUgZWxsaXBzaXMgZm9yIG1ldGhvZCBhcmd1bWVudHMuCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBEb24ndCBkZXJlZmVyZW5jZSBrY2xhc3MgaWYgaXQgaXMgTlVMTC4KLQlVc2UgaWQuCi0JKiBwcmRiZy5jIChwcl9mbnMpOiBBZGQgcHJfZWxsaXBzaXNfdHlwZS4KLQkocHJfZWxsaXBzaXNfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByX3BvaW50ZXJfdHlwZSk6IElmIHRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5LCBwYXJlbnRoZXNpemUKLQlpdCBjb3JyZWN0bHkuCi0JKHByX3N0YXJ0X3N0cnVjdF90eXBlKTogQWRkIGlkIHBhcmFtZXRlci4KLQkocHJfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCShwcl90YWdfdHlwZSk6IExpa2V3aXNlLgotCShwcl9maXhfdmlzaWJpbGl0eSk6IEFkZCB0aGUgdmlzaWJpbGl0eSB0byB0aGUgdG9wIG9mIHRoZSBzdGFjaywKLQlub3QgdGhlIHNlY29uZCBlbGVtZW50IG9uIHRoZSBzdGFjay4KLQkocHJfc3RydWN0X2ZpZWxkKTogUG9wIHRoZSBzdGFjayBiZWZvcmUgY2FsbGluZyBwcl9maXhfdmlzaWJpbGl0eS4KLQkocHJfY2xhc3Nfc3RhdGljX21lbWJlcik6IExpa2V3aXNlLgotCShwcl9jbGFzc19zdGFydF9tZXRob2QpOiBEb24ndCBwdXNoIGEgdHlwZSwganVzdCBzZXQgdGhlIG1ldGhvZAotCW5hbWUgaW4gdGhlIHR5cGUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JKHByX2NsYXNzX2VuZF9tZXRob2QpOiBEb24ndCBwb3AgdGhlIHN0YWNrLgotCShwcl9jbGFzc19tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBhcmd0eXBlcyBwYXJhbWV0ZXIgdG8gcGh5c25hbWUuCi0JQXBwZW5kIGNvbnN0IGFuZCB2b2xhdGlsZSByYXRoZXIgdGhhbiBwcmVwZW5kaW5nIHRoZW0uICBBZGQgYQotCXNwYWNlIGFmdGVyIHRoZSBwaHlzbmFtZS4KLQkocHJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KTogTGlrZXdpc2UuCi0JKiBpZWVlLmMgKGllZWVfZm5zKTogQWRkIGllZWVfZWxsaXBzaXNfdHlwZS4KLQkoaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSk6IFVzZSBERUJVR19LSU5EX0lMTEVHQUwgcmF0aGVyIHRoYW4KLQlERUJVR19LSU5EX1ZPSUQuCi0JKHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8pOiBMaWtld2lzZS4KLQkoaWVlZV90eXBkZWYpOiBMaWtld2lzZS4KLQkoaWVlZV9lbGxpcHNpc190eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSk6IEFkZCBpZCBwYXJhbWV0ZXIuCi0JKGllZWVfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX3RhZ190eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfY2xhc3NfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgbmFtZSB0byBwaHlzbmFtZS4KLQkoaWVlZV9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKERFQlVHX09CSlMpOiBSZW1vdmUgcHJkYmcuby4KLQkoJChPQkpEVU1QX1BST0cpKTogRGVwZW5kIHVwb24sIGFuZCBsaW5rIGFnYWluc3QsIHByZGJnLm8uCi0KLVRodSBKYW4gMTggMTc6MzU6MDYgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWFrZV90YWlsKTogQ2hhbmdlZCB0aGUgb3JkZXIgb2YgdGhlIHNlY3Rpb25zIHRvIGF2b2lkCi0JYW4gYWxpZ25tZW50IHByb2JsZW0uCi0KLVdlZCBKYW4gMTcgMTQ6MjM6MDAgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAod3JfZHUpOiBTZXQgZHUuc3RhY2tmcm10IHRvIDAuCi0JKHdyX3VuLCB3cl9zYyk6IEVtaXQgYWxsIHNlY3Rpb25zLCBldmVuIHRob3NlIHdpdGggMCBzaXplLgotCi1UdWUgSmFuIDE2IDE2OjE1OjQ5IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHdyX2hkKTogU3BhY2Ugc2l6ZSB3aXRoaW4gc2VnbWVudCB3YXMgYmVpbmcKLQlzdG9yZWQgaW4gc2VnbWVudCBpZGVudGlmaWVyIGZpZWxkLgotCi1UdWUgSmFuIDE2IDEyOjA3OjI1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiAoQlVJTERfTkxNQ09OViwgQlVJTERfU1JDT05WLCBTWVNJTkZPX1BST0csCi0JQlVJTERfRExMVE9PTCk6IFB1dCBkZWZpbml0aW9ucyBmb3IgdGhlc2UgaW50byBtYWtlZmlsZSB3aGVuCi0JY29uZmlndXJpbmcsIGluc3RlYWQgb2YgYWx3YXlzIGNsZWFyaW5nIGluIG1wdy1tYWtlLnNlZC4KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgYW55IGhvc3RfYWxpYXMgb3IgdGFyZ2V0X2FsaWFzIHNldHRpbmdzLAotCWZpeCBwYXRobmFtZSB0byBCRkQgaW50ZXJuYWwgaW5jbHVkZSBmaWxlcywgcmVtb3ZlIGRlcGVuZGVuY3kKLQljYWxjdWxhdGlvbiBydWxlcy4KLQotVGh1IEphbiAxMSAxNzozMTozOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IEFkZCBuZXcgc2VjdGlvbiBmbGFncwotCVNFQ197RVhDTFVERSxTT1JUX0VOVFJJRVN9LgotCi1UaHUgSmFuIDExIDExOjQ1OjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IE5VTEwgdGVybWluYXRlIHRoZSBvdXRwdXQgc3ltYm9scy4KLQkoY29weV9vYmplY3QpOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBwb3NzaWJsZSBleHRyYSBOVUxMIHBvaW50ZXIuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX21ha2VfdW5kZWZpbmVkX3RhZ2dlZF90eXBlKTogTWFrZSBzdXJlIHdlIGFyZQotCWdpdmVuIGEga2luZCBvZiB0eXBlIHdlIGNhbiBoYW5kbGUuCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBIYW5kbGUgdW5kZWZpbmVkIGVudW1zIGFuZCBzdHJ1Y3RzLgotCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogSGFuZGxlIHVuZGVmaW5lZCBjbGFzc2VzLgotCSogcHJkYmcuYyAocHJfZW51bV90eXBlKTogSGFuZGxlIGFuIHVuZGVmaW5lZCBlbnVtLgotCSogaWVlZS5jIChpZWVlX2VudW1fdHlwZSk6IExpa2V3aXNlLgotCi1XZWQgSmFuIDEwIDE1OjMzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgZGVwZW5kZW5jaWVzLgotCShBTExPQ0EsIE1BTExPQyk6IFJlbW92ZSB2YXJpYWJsZXMuCi0JKEFERExfTElCUyk6IFJlbW92ZSAkKE1BTExPQykgZnJvbSBkZWZpbml0aW9uLgotCSogYWxsb2NhLmMsIGdtYWxsb2MuYzogUmVtb3ZlLgotCi1Nb24gSmFuICA4IDE4OjAyOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBBZGQgZ2xvYmFsIGZ1bmN0aW9uIHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gYW5kIGEKLQlidW5jaCBvZiBzdGF0aWMgZnVuY3Rpb25zIGFuZCBzdHJ1Y3RzIHVzZWQgdG8gd3JpdGUgb3V0IElFRUUKLQlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKiBidWRiZy5oICh3cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvKTogRGVjbGFyZS4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV90eXBlKTogQWRkIHBzbG90IGZpZWxkLgotCShlbnVtIGJ1aWx0aW5fdHlwZXMpOiBEZWZpbmUuCi0JKGllZWVfYnVpbHRpbl90eXBlKTogRm9yIGEgcG9pbnRlciwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmFtZWQKLQl0eXBlLiAgVXNlIGVudW0gdmFsdWVzIHJhdGhlciB0aGFuIG51bWJlcnMuCi0JKGllZWVfYWxsb2NfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGllZWVfcmVhZF90eXBlX2luZGV4KTogVXNlIGllZWVfYWxsb2NfdHlwZS4KLQkocGFyc2VfaWVlZV9iYik6IExpa2V3aXNlLgotCShwYXJzZV9pZWVlX3R5KTogTGlrZXdpc2UuICBVc2UgaWVlZV9idWlsdGluX3R5cGUgZm9yIGFycmF5IHJhbmdlLAotCXJhdGhlciB0aGFuIG1ha2luZyBhIG5ldyBpbnRlZ2VyIHR5cGUuICBTdG9yZSB0aGUgbmV3IHR5cGUgaW4gdGhlCi0Jc2xvdCwgaWYgdGhlcmUgaXMgb25lLgotCShwYXJzZV9pZWVlX2F0bik6IFRyZWF0IEFUTjEwIGFzIGRlZmluaW5nIGEgcmVnaXN0ZXIgdmFyaWFibGUuCi0JKGllZWVfcmVnbm9fdG9fZ2VucmVnKTogUmVuYW1lIGZyb20gaWVlZV9yZWdub190b19nZW4uICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoaWVlZV9nZW5yZWdfdG9fcmVnbm8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX3R5cGUpOiBBZGQgbmV3IHR5cGVuYW1lIHBhcmFtZXRlci4gIENoYW5nZQotCWFsbCBjYWxsZXJzLgotCShwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBBZGQgbmV3IHR5cGVuYW1lIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCi0JKiBkZWJ1Zy5oIChzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zKTogQWRkIHRhZyBwYXJhbWV0ZXIgdG8KLQllbnVtX3R5cGUsIHN0YXJ0X3N0cnVjdF90eXBlLCBhbmQgc3RhcnRfY2xhc3NfdHlwZS4KLQkqIGRlYnVnLmMgKGRlYnVnX3dyaXRlX3R5cGUpOiBQYXNzIGFueSB0YWcgbmFtZSB0bwotCXN0YXJ0X3N0cnVjdF90eXBlLCBkZWJ1Z193cml0ZV9jbGFzc190eXBlLCBhbmQgZW51bV90eXBlLiAgSWYKLQlERUJVR19LSU5EX1RBR0dFRCwgcGFzcyB0aGUgbmFtZSBpbiB0aGUgcmVjdXJzaXZlIGNhbGwuCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBBY2NlcHQgYSBuZXcgdGFnIHBhcmFtZXRlciwgYW5kIHBhc3MgaXQKLQl0byBzdGFydF9jbGFzc190eXBlLgotCSogcHJkYmcuYyAocG9wX3R5cGUpOiBEb24ndCByZW1vdmUgJysnIGNoYXJhY3Rlci4KLQkocHJfZW51bV90eXBlKTogQWNjZXB0IGFuZCB1c2UgdGFnIHBhcmFtZXRlci4KLQkocHJfc3RhcnRfc3RydWN0X3R5cGUpOiBMaWtld2lzZS4KLQkocHJfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCShwcl9jbGFzc19iYXNlY2xhc3MpOiBBZGp1c3QgYWxnb3JpdGhtIHVzZWQgdG8gZmluZCB3aGVyZSB0byBwdXQKLQl0aGUgYmFzZWNsYXNzIG5hbWUuCi0JKHByX3RhZyk6IERvbid0IGJvdGhlciB0byBpbnNlcnQgdGhlIHRhZyBuYW1lLgotCi0JKiBvYmpjb3B5LmM6IEluY2x1ZGUgYnVkYmcuaC4KLQkoY29udmVydF9kZWJ1Z2dpbmcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShPUFRJT05fREVCVUdHSU5HKTogRGVmaW5lLgotCShjb3B5X29wdGlvbnMpOiBBZGQgImRlYnVnZ2luZyIuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tZGVidWdnaW5nLgotCShpc19zdHJpcF9zZWN0aW9uKTogU2tpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgY29udmVydF9kZWJ1Z2dpbmcuCi0JKHNldHVwX3NlY3Rpb24sIGNvcHlfc2VjdGlvbik6IExpa2V3aXNlLgotCShmaWx0ZXJfc3ltYm9scyk6IFNraXAgZGVidWdnaW5nIHN5bWJvbHMgaWYgY29udmVydF9kZWJ1Z2dpbmcuCi0JKGNvcHlfb2JqZWN0KTogSWYgY29udmVydF9kZWJ1Z2dpbmcsIHJlYWQgYW5kIHdyaXRlIGRlYnVnZ2luZwotCWluZm9ybWF0aW9uLgotCSh3cml0ZV9kZWJ1Z2dpbmdfaW5mbyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtLWRlYnVnZ2luZy4KLQkqIE1ha2VmaWxlLmluIChERUJVR19PQkpTKTogTmV3IHZhcmlhYmxlLgotCSgkKE9CSkNPUFlfUFJPRykpOiBEZXBlbmQgdXBvbiBhbmQgbGluayBhZ2FpbnN0ICQoREVCVUdfT0JKUykuCi0JKCQoU1RSSVBfUFJPRykpOiBMaWtld2lzZS4KLQkoT0JKRFVNUF9PQkpTKTogUmVtb3ZlIHZhcmlhYmxlLgotCSgkKE9CSkRVTVBfUFJPRykpOiBVc2Ugb2JqZHVtcC5vICQoREVCVUdfT0JKUykgcmF0aGVyIHRoYW4KLQkkKE9CSkRVTVBfT0JKUykuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tZGVidWdnaW5nLgotCi1UaHUgSmFuICA0IDE2OjMxOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBOZXcgZmlsZSB3aXRoIGNvZGUgdG8gcmVhZCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGJ1ZGJnLmggKHBhcnNlX2llZWUpOiBEZWNsYXJlLgotCSogcmRkYmcuYyAocmVhZF9kZWJ1Z2dpbmdfaW5mbyk6IEhhbmRsZSBJRUVFIGZsYXZvdXIgZmlsZXMuCi0JKHJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCBpZWVlLmMuCi0JKE9CSkRVTVBfT0JKUyk6IEFkZCBpZWVlLm8uCi0KLQkqIGJ1Y29tbS5oICh4cmVhbGxvYyk6IENoYW5nZSB0eXBlIG9mIGZpcnN0IHBhcmFtZXRlciBmcm9tIGNoYXIgKgotCXRvIFBUUi4KLQotVHVlIEphbiAgMiAxNzo0NDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgdGFyZ2V0cyB0byBhdXRvbWF0aWNhbGx5IHJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCVJlbW92ZSB0YXJnZXRzIHdoaWNoIGp1c3QgbGlzdGVkIGRlcGVuZGVuY2llcyBvZiAubyBmaWxlcy4KLQkoREVQKTogTmV3IHZhcmlhYmxlLgotCShIRklMRVMsIEdFTkVSQVRFRF9IRklMRVMpOiBOZXcgdmFyaWFibGVzLgotCShDRklMRVMsIEdFTkVSQVRFRF9DRklMRVMpOiBOZXcgdmFyaWFibGVzLgotCSh1bmRlcnNjb3JlLmMpOiBEb24ndCBkbyBhbnl0aGluZywganVzdCBkZXBlbmQgdXBvbiBzdGFtcC11bmRlci4KLQkoc3RhbXAtdW5kZXIpOiBOZXcgdGFyZ2V0OyBkbyB3aGF0IHVuZGVyc2NvcmUuYyB1c2VkIHRvIGRvLgotCShubG1jb252Lm8pOiBEZXBlbmQgdXBvbiBzeW0uaCBhbmQgZWNvZmYuaC4KLQkoLmRlcCwgLmRlcDEsIGRlcC5zZWQsIGRlcCwgZGVwLWluKTogTmV3IHRhcmdldHMuCi0JKHN0YWdlMSwgc3RhZ2UyLCBzdGFnZTMsIGFnYWluc3QsIGNvbXBhcmlzb24pOiBSZW1vdmUuCi0JKGRlLXN0YWdlMSwgZGUtc3RhZ2UyLCBkZS1zdGFnZTMpOiBSZW1vdmUuCi0JKGNsZWFuLCBkaXN0Y2xlYW4pOiBSZW1vdmUgc3RhbXAtdW5kZXIgYW5kIGRlcC5zZWQuCi0JKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KLQotCUltcGxlbWVudCBnZW5lcmljIGRlYnVnZ2luZyBzdXBwb3J0LiAgSW1wbGVtZW50IGEgc3RhYnMgcmVhZGVyIGFuZAotCWEgZ2VuZXJpYyBwcmludGVyLgotCSogYnVkYmcuaCwgZGVidWcuYywgZGVidWcuaCwgcHJkYmcuYywgcmRkYmcuYywgc3RhYnMuYzogTmV3IGZpbGVzLgotCSogb2JqZHVtcC5jOiBJbmNsdWRlICJkZWJ1Zy5oIiBhbmQgImJ1ZGJnLmgiLgotCShkdW1wX2RlYnVnZ2luZyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtLWRlYnVnZ2luZy4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkZWJ1Z2dpbmciLgotCShkaXNwbGF5X2JmZCk6IEhhbmRsZSAtLWRlYnVnZ2luZy4KLQkqIE1ha2VmaWxlLmluIChPQkpEVU1QX09CSlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoT0JKRFVNUF9QUk9HKSk6IFVzZSAkKE9CSkRVTVBfT0JKUykuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC0tZGVidWdnaW5nLgotCi1TYXQgRGVjIDMwIDA5OjU5OjUxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbm0uYyAoIGxvbmdfb3B0aW9ucyk6IEFkZCAiLS1kZWZpbmVkLW9ubHkiIG9wdGlvbi4KLQkodXNhZ2UpOiBVcGRhdGUgZm9yIG5ldyAiLS1kZWZpbmVkLW9ubHkiIG9wdGlvbi4KLQkoZmlsdGVyX3N5bWJvbHMpOiBIYW5kbGUgIi0tZGVmaW5lZC1vbmx5Ii4KLQotRnJpIERlYyAyOSAxNjowNDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFycGFyc2UueTogSW5jbHVkZSAiYnVjb21tLmgiLCBub3QgPHN5c2RlcC5oPi4KLQkqIG5sbWhlYWRlci55OiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCi0KLVR1ZSBEZWMgMjYgMTg6MjM6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChwcmludF9zeW1kZWZfZW50cnkpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfZ2V0X2VsdF9hdF9pbmRleC4KLQotU2F0IERlYyAyMyAxMTowMzoxNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmNneW5zdS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoRExMVE9PTF9ERUZTKTogQnVpbGQgZGxsdG9vbCBmb3IgUG93ZXJQQyBpZiB0YXJnZXQKLQlpcyBwb3dlcnBjKi0qLXdpbiogaW4gYWRkaXRpb24gdG8gcG93ZXJwYyotKi0qcGUqLgotCi1GcmkgRGVjIDE1IDE2OjMwOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChlbmRpYW5fc3RyaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGlzcGxheV90YXJnZXRfbGlzdCk6IFVzZSBpdC4KLQkqIG5sbWNvbnYuYyAobWFpbik6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCi0KLUZyaSBEZWMgMTUgMDc6NTE6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogU3RhcnQgZnJvbSAxIGlmIG5vIG90aGVyIGluc3RydWN0aW9ucwotIAlnaXZlbi4KLQotVHVlIERlYyAxMiAxMjowNToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSAkKERFTUFOR0xFUl9QUk9HKS4xLiAgRnJvbSBSb25hbGQKLQlGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT4uCi0KLU1vbiBEZWMgMTEgMTQ6MzM6MDUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtYWMtYmludXRpbHMucjogRml4IGNvcHlyaWdodCBhbmQgdmVyc2lvbiBzdHJpbmdzLgotCi0JKiBNYWtlZmlsZS5pbiAodmVyc2lvbik6IFJlbW92ZSwgbm8gbG9uZ2VyIHVzZWQuCi0KLUZyaSBEZWMgIDEgMTQ6NDE6NTYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQgKGluc3RhbGwsIGluc3RhbGwtb25seSk6IEVkaXQgaW4gTWFjLXNwZWNpZmljCi0JaW5zdGFsbCBwcm9jZWR1cmUuCi0KLVRodSBOb3YgMzAgMjA6MjY6MDIgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAocHBjX2p0YWIpOiBUaGUgYmluYXJ5IGdsdWUgZm9yIFBvd2VyUEMgZGxsIGxpbmthZ2UsCi0JaW5jbHVkaW5nIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24uCi0Jc2luZm86IGFkZGVkIGEgcHJlZmVycmVkIGFsaWdubWVudCBmaWVsZC4KLQkoc2VjZGF0YSk6IHNlY3Rpb24gZGF0YSBmb3IgdGhlIFBvd2VyUEMgdmVyc2lvbi4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBNb3JlIHN5bWJvbHMsIE1vcmUgc2VjdGlvbnMgKHBkYXRhLCByZGF0YSkKLQkobWFrZV90YWlsKTogVXNlIGlkYXRhJDYgaW5zdGVhZCBvZiBpZGF0YSQ3IGZvciBwcGMuIEFsc28gYWRkZWQgYQotCU5VTEwgaWRhdGEkMyBkZXNjcmlwdG9yICh0ZW1wb3JhcnkpLgotCi1UdWUgTm92IDI4IDE3OjIzOjQ0IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZmlsbF9vcmRpbmFscyk6IERvbid0IHJlZmVyZW5jZSBkX2V4cG9ydF92ZWMgaWYKLQl0aGVyZSBhcmUgbm8gZXhwb3J0ZWQgZnVuY3Rpb25zLgotCi1Nb24gTm92IDI3IDEzOjA1OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgotCi1XZWQgTm92IDIyIDEzOjE3OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogU3RhcnQgYXNzaWduaW5nIG9yZGluYWxzIGF0IDEuCi0KLQkqIE1ha2VmaWxlLmluIChFWFBFQ1QpOiBVc2UgJCRyLCBub3QgJCR7cm9vdG1lfS4KLQkoY2hlY2spOiBTZXQgciwgbm90IHJvb3RtZS4KLQotVHVlIE5vdiAyMSAxODowNDowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEJGRF9ORUVEX0RFQ0xBUkFUSU9OLgotCSogYWNjb25maWcuaDogUHV0IE5FRURfREVDTEFSQVRJT05fRlBSSU5URiBpbiBAVE9QQCBzZWN0aW9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCi0KLUZyaSBOb3YgMTcgMTA6MzQ6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFVzZSBAaG9zdEAgYW5kIEB0YXJnZXRALCBub3QKLQkkKGhvc3RfY2Fub25pY2FsKSBhbmQgJCh0YXJnZXRfY2Fub25pY2FsKS4KLQotVGh1IE5vdiAxNiAwMzozOToyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVZlcnNpb24gMi42IHJlbGVhc2VkLgotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGUgdG8gMi42LgotCi1XZWQgTm92IDE1IDEyOjE0OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBEZWZpbmUuCi0JKGNoZWNrKTogUGFzcyBDQyBhbmQgQ0ZMQUdTIHRvIHJ1bnRlc3QuCi0KLQkqIG5tLmMgKGRpc3BsYXlfcmVsX2ZpbGUpOiBEb24ndCByZXF1aXJlIGEgRFlOQU1JQyBvYmplY3Qgd2hlbgotCWR1bXBpbmcgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCi0JKiBvYmpkdW1wLmMgKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgZ2xvYmFsIHN5bWJvbHMgYmVmb3JlIGxvY2FsCi0Jc3ltYm9scyBiZWZvcmUgZGVidWdnaW5nIHN5bWJvbHMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IERvbid0IGZ1dHogYXJvdW5kIGxvb2tpbmcgZm9yIGEgZ2xvYmFsCi0Jc3ltYm9sIHdpdGggdGhlIHNhbWUgdmFsdWUuCi0KLVR1ZSBOb3YgMTQgMTc6MTk6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmM6IFVzZSBGT1BFTl8qIG1hY3JvcyByYXRoZXIgdGhhbiAiciIgb3IgInciLgotCi0JKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBDb3JyZWN0IG1lbXNldCBjYWxsLgotCi1TdW4gTm92IDEyIDEyOjU2OjA1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkIChERU1BTkdMRVJfUFJPRyk6IEVkaXQgb3V0IGF0dGVtcHRzIHRvIGRvIGFueXRoaW5nCi0gCXdpdGggdGhlIG1hbiBwYWdlLgotCi1GcmkgTm92IDEwIDExOjQxOjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzZXR1cF9zZWN0aW9uKTogQ29weSB0aGUgc2VjdGlvbiBsbWEgaW5kZXBlbmRlbnRseSBvZgotCXRoZSB2bWEuCi0KLVdlZCBOb3YgIDggMTE6MzM6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcnN1cC5jIChhcl9vcGVuKTogQ2FzdCBtYWxsb2MgcmV0dXJuIHZhbHVlLgotCi1UdWUgTm92ICA3IDA5OjAxOjI2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZSAoRExMVE9PTF9ERUZTKTogQWRkZWQgcHBjIHRhcmdldC4KLQkqIGRsbHRvb2wuYyAoTVBQQyk6IEFkZGVkIGJhc2ljIFBQQyBkZWZpbml0aW9ucy4KLQotVHVlIE5vdiAgNyAxNDowMjo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdHJlYXQgcnM2MDAwLSotbHlueCogc3BlY2lhbGx5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3JzbHlueDogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBAdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50QC4KLQotTW9uIE5vdiAgNiAxNTowMDo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5oOiBJbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0JKiBhci5jOiBEb24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gb3IgPHN0ZGlvLmg+LgotCSogYnVjb21tLmMsIGRsbHRvb2wuYywgbmxtY29udi5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYzogTGlrZXdpc2UuCi0KLUZyaSBOb3YgIDMgMTI6Mzg6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQotCVBlcm1pdCB1c2VyIHRvIG92ZXJyaWRlIERFTUFOR0xFUl9QUk9HIGZyb20gY29tbWFuZCBsaW5lLiAgRnJvbQotCU1hbmZyZWQgSG9sbHN0ZWluIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4uCi0JKiBNYWtlZmlsZS5pbiAoJChERU1BTkdMRVJfUFJPRykpOiBEZXBlbmQgdXBvbgotCSQoREVNQU5HTEVSX1BST0cpLjEuCi0JKGluc3RhbGwpOiBEb24ndCBkZXBlbmQgdXBvbiAkKERFTUFOR0xFUl9QUk9HKS4xLiAgT25seSBpbnN0YWxsCi0JJChERU1BTkdMRVJfUFJPRykuMSBpZiAkKERFTUFOR0xFUl9QUk9HKSBpcyBub3QgZW1wdHkuCi0KLVdlZCBOb3YgIDEgMTU6MDQ6NTcgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChzeXNsZXgubyk6IGFkZCAtSSQoc3JjZGlyKSBpZiBjb21waWxpbmcgaW4gYQotCXNlcGFyYXRlIGRpcmVjdG9yeS4KLQotTW9uIE9jdCAzMCAxNDoyNDoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF92YWx1ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFVzZSBpdC4gIElmIHdlIG5lZWQgdGhlIHJpZ2h0IHNlY3Rpb24gZm9yCi0JdGhlIHN5bWJvbCwgYW5kIHdlIGNhbid0IGZpbmQgaXQsIHByaW50IGFuIG9mZnNldCBmcm9tIHRoZSBzZWN0aW9uCi0JcmF0aGVyIHRoYW4gdXNpbmcgYSBzeW1ib2wgZnJvbSBzb21lIG90aGVyIHNlY3Rpb24uCi0KLVRodSBPY3QgMjYgMTA6MjM6MTQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChub19pZGF0YTQsIG5vX2lkYXRhNSk6IE5ldy4KLQkoYXJtX2p0YWIpOiBVc2UgY29ycmVjdCBlbmNvZGluZyBvZiBqdW1wIGluc3RydWN0aW9uLgotCSh1c2FnZSwgbWFpbiwgbWFrZV9oZWFkLCBtYWtlX3RhaWwpOiBBY3Qgb24gbm9faWRhdGE0LCBub19pZGF0YTUuCi0KLVdlZCBPY3QgMjUgMTI6MTA6MDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgcGF0aHMgdG8gZ2VuZXJhdGVkIHkudGFiLltjaF0gZmlsZXMuCi0KLUZyaSBPY3QgMjAgMTg6NDA6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cy4KLQotVGh1IE9jdCAxOSAxNzo0Nzo0MSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgZXh0cmFuZW91cyB0YWIgb24gb3RoZXJ3aXNlIGVtcHR5IGxpbmUsCi0Jd2hpY2ggY29uZnVzZXMgbWFueSBub24tR05VIHZlcnNpb25zIG9mICJtYWtlIi4KLQotV2VkIE9jdCAxOCAxNjozMTo1OCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGkzODZfanRhYiwgYXJtX2p0YWIpOiBOZXcKLQkoZ2VuX2xpYl9maWxlKTogUmV3cml0dGVuIHRvIHVzZSBiZmQuCi0KLUZyaSBPY3QgMTMgMTY6MTA6MDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGdpdmUgZXJyb3IgbWVzc2FnZSBpZiBkbGx0b29sCi0Jd2Fzbid0IGJ1aWx0LgotCi1GcmkgT2N0IDEzIDExOjA0OjM3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRlZmxleC5sOiBBbGxvdyBxdW90aW5nIG9mIElEcy4KLQkqIGRlZnBhcnNlLnkgKCV1bmlvbik6IHN0cmluZyBkZWxldGVkLgotCShjb21tYW5kKTogREVTQ1JJUFRJT04gdGFrZXMgSUQuCi0JKiBkbGx0b29sLmMgKGdlbl9kZWZfZmlsZSk6IFF1b3RlIG91dGdvaW5nIG5hbWUgaWYKLQluZWNlc3NhcnkuICBQcmVzZXJ2ZSBOT05BTUUuCi0JKGdlbl9saWJfZmlsZSk6IFJ1biByYW5saWIuCi0JKHdvcmtvdXRfcHJlZml4KTogRGVsZXRlZC4KLQkobWFpbiwgdXNhZ2UsIGxvbmdfb3B0aW9ucyk6IEFkZCAtLWFzLCAtLXJhbmxpYiwgLS1hciBvcHRpb25zLgotCi1XZWQgT2N0IDExIDEzOjM2OjEzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobXRhYmxlKTogSE9XX0FMSUdOX0xPTkcsIG5ldy4KLQkoZF9vcmQpOiBEZWxldGVkLgotCShkX2xvd19vcmQsIGRfaGlnaF9vcmQsIGRfbmFtZWRfZnVuY3MpOiBOZXcuCi0JKGdlbl9leHBfZmlsZSk6IENyZWF0ZSBub25hbWUgZW50cmllcyBjb3JyZWN0bHkuCi0JKGdlbl9saWJfZmlsZSk6IER1bXAgZXhwb3J0cyBhbHBoYWJldGljYWxseS4KLQkocHJvY2Vzc19kdXBsaWNhdGVzKTogIENvdW50IG5vbmFtZWQgZnVuY3Rpb25zLgotCShmaWxsX29yZGluYWxzKTogS2VlcCB0cmFjayBvZiBoaWdoZXN0IG9yZCB0b28uCi0JKG1hbmdsZV9kZWZzKTogQ3JlYXRlIGFscGhhYmV0aWNhbGx5IG9yZGVyZWQgbGlzdCBvZiBuYW1lcy4KLQotVHVlIE9jdCAxMCAwOTozOTowOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVE9PTF9QUk9HUyk6IEluY2x1ZGUgRExMVE9PTF9QUk9HLgotCi1Nb24gT2N0ICA5IDEzOjA2OjMxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoYWRkX3VuZGVyc2NvcmUpOiBOZXcuCi0JKHhsYXRlKTogVXNlIG5ldyBuYW1lLgotCShtYWluLCB1c2FnZSk6IFVwZGF0ZS4KLQotRnJpIE9jdCAgNiAxNDowODo1MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3lzaW5mby55OiBFbGltaW5hdGUgdW51c2VkIHRlcm1pbmFscyAiWyIgYW5kICJdIiBhbmQgdW51c2VkCi0Jbm9udGVybWluYWwgIm5hbWUiLiAgT25lIHMvciBjb25mbGljdCByZW1haW5zLgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbm0uYyAocHJpbnRfc3ltbmFtZSk6IERvbid0IHRyeSB0byBkZW1hbmdsZSBhbiBlbXB0eQotCW5hbWUuCi0JKiBvYmpkdW1wLmMgKHNsdXJwX3N5bXRhYik6IFJlc2V0IHN5bWNvdW50IGlmIHRoZXJlIGFyZQotCW5vIHN5bWJvbHMuCi0JKHNsdXJwX2R5bmFtaWNfc3ltdGFiKTogTGlrZXdpc2UsIGZvciBkeW5zeW1jb3VudC4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IEZpeCBtZW1vcnkgbGVhazogZnJlZSBzb3J0ZWRfc3ltcyB3aGVuIGRvbmUuCi0JKGRpc3BsYXlfYmZkKTogTGlrZXdpc2UsIGZvciBzeW1zIGFuZCBkeW5zeW1zLgotCShkdW1wX3JlbG9jcyk6IERvbid0IHByaW50IGhlYWRlciBiZWZvcmUgcG9zc2libHkgZ2VuZXJhdGluZyBhbgotCWVycm9yIG1lc3NhZ2UuCi0JKGR1bXBfZHluYW1pY19yZWxvY3MpOiBMaWtld2lzZS4KLQotCSogYXIuMSwgbm0uMSwgb2JqZHVtcC4xLCBzaXplLjEsIHN0cmluZ3MuMSwgc3RyaXAuMTogRml4IHR5cG9zIGFuZAotCWZvcm1hdHRpbmcgYnVncy4KLQotRnJpIE9jdCAgNiAxMjowMDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKGRvX3F1aWNrX2FwcGVuZCk6IENvbW1lbnQgb3V0LgotCShyZXBsYWNlX21lbWJlcnMpOiBBZGQgcXVpY2sgYXJndW1lbnQuCi0JKG1haW4pOiBEb24ndCBjYWxsIGRvX3F1aWNrX2FwcGVuZC4KLQkob3Blbl9pbmFyY2gpOiBEb24ndCBjYWxsIHF1aWNrX2FwcGVuZCB0byBjcmVhdGUgYW4gZW1wdHkgYXJjaGl2ZS4KLQlJbnN0ZWFkIGNhbGwgYmZkX29wZW53L2JmZF9zZXRfZm9ybWF0L2JmZF9jbG9zZS4KLQotVGh1IE9jdCAgNSAyMDo1MzowOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmM6IEFsd2F5cyBpbmNsdWRlIHRpbWUuaC4KLQotVGh1IE9jdCAgNSAxNzoyNToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogU29ydCBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQKLQlzeW1ib2xzIGFmdGVyIG90aGVyIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4gIExpa2V3aXNlIGZvcgotCXN5bWJvbHMgd2hpY2ggbG9vayBsaWtlIGZpbGUgbmFtZXMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IEFsd2F5cyBjaG9zZSB0aGUgZmlyc3QgcmVhc29uYWJsZSBzeW1ib2wKLQl3aXRoIGEgZ2l2ZW4gdmFsdWUuCi0KLVR1ZSBPY3QgIDMgMjI6Mzg6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcnN1cC5jIChhcl9zYXZlKTogVXNlIHJlbmFtZSwgbm90IHVubGluay9saW5rL3VubGluay4KLQotTW9uIE9jdCAgMiAxMjoxMDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cmluZ3MuYyAobWFpbik6IEV4aXQgd2l0aCB6ZXJvIHN0YXR1cyBpZiBubyBmaWxlcyBhcmUgZ2l2ZW4KLQlhbmQgc3RhbmRhcmQgaW5wdXQgaXMgcmVhZC4KLQotVGh1IFNlcCAyOCAyMDowMzowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IENhbGN1bGF0ZSB1bmRlcnNjb3JlIGFuZCBwdXQgaW50byBtYWtlZmlsZQotCWZyYWdtZW50LCBnZW5lcmF0ZSBjb25maWcuaC4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHNlZCBjb21tYW5kcyB0byBlZGl0IFVuaXggbWFrZWZpbGUKLQlpbnRvIE1QVyBzeW50YXguCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogbWFjLWJpbnV0aWxzLnI6IE5ldyBmaWxlLCBNYWMgcmVzb3VyY2VzLgotCi1UaHUgU2VwIDI4IDE1OjQ5OjAwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYzogKGdlbl9leHBfZmlsZSk6IEFsd2F5cyBlbWl0IGEgLnJlbG9jIHNlY3Rpb24gaWYKLQlyZWxvY2F0YWJsZS4KLQkoaW1wX25hbWVfbGFiKTogTmV3LgotCShnZW5fZGVmX2ZpbGUpOiBOZXcuCi0JKGdlbl9saWJfZmlsZSk6IFVzZSBpbXBfbmFtZV9sYWIuCi0JKG1haW4pOiBJbml0aWFsaXplIGltcF9uYW1lX2xhYi4KLQotTW9uIFNlcCAyNSAxMjowNTozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19IRUFERVJfU1lTX1dBSVQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBkbGx0b29sLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIiBhbmQgImJ1Y29tbS5oIi4gIERvbid0IGluY2x1ZGUKLQk8c3RkaW8uaD4sIDxzdGRsaWIuaD4sIG9yIDxzdHJpbmcuaD4uICBEb24ndCBpbmNsdWRlIDx3YWl0Lmg+LgotCUluY2x1ZGUgPHN5cy90eXBlcy5oPi4gIFVzZSBIQVZFX1NZU19XQUlUX0ggdG8gY29udHJvbCB3aGV0aGVyIHRvCi0JaW5jbHVkZSA8c3lzL3dhaXQuaD4gb3IgZGVmaW5lIHRoZSB3YWl0IG1hY3JvcyBieSBoYW5kLiAgRG9uJ3QKLQlkZWNsYXJlIHhtYWxsb2MuCi0JKGdlbl9saWJfZmlsZSk6IERvbid0IGFzc3VtZSB0aGF0IHNwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0JY2hhcmFjdGVyczsgdXNlIHN0cmxlbiBpbnN0ZWFkLgotCi1GcmkgU2VwIDIyIDE3OjE2OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgdXNlIHRoZSBvbGQgQkZEIGJhc2VkCi0JZGlzYXNzZW1ibGVyIGludGVyZmFjZS4gIE1ha2UgaW5mbyBhIGNvbnN0IHBvaW50ZXIuCi0KLVdlZCBTZXAgMTMgMTg6MzM6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHN0YXJ0X2FkZHJlc3MpOiBOZXcgdmFyaWFibGUuCi0JKHN0b3BfYWRkcmVzcyk6IE5ldyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tc3RhcnQtYWRkcmVzcyBhbmQgLS1zdG9wLWFkZHJlc3MuCi0JKE9QVElPTl9TVEFSVF9BRERSRVNTLCBPUFRJT05fU1RPUF9BRERSRVNTKTogRGVmaW5lLgotCShsb25nX29wdGlvbnMpOiBBZGQgInN0YXJ0LWFkZHJlc3MiIGFuZCAic3RvcC1hZGRyZXNzIi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSBzdGFydF9hZGRyZXNzIGFuZCBzdG9wX2FkZHJlc3MuCi0JKGR1bXBfZGF0YSwgZHVtcF9yZWxvY19zZXQpOiBMaWtld2lzZS4KLQkobWFpbik6IERvbid0IHNldCBzZWVuZmxhZyBmb3IgLWwuICBIYW5kbGUgT1BUSU9OX1NUQVJUX0FERFJFU1MKLQlhbmQgT1BUSU9OX1NUT1BfQUREUkVTUy4KLQkqIG9iamNvcHkuYyAocGFyc2Vfdm1hKTogTW92ZSB0byBidWNvbW0uYy4KLQkqIGJ1Y29tbS5jIChwYXJzZV92bWEpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZyb20gb2JqY29weS5jLgotCSogYnVjb21tLmggKHBhcnNlX3ZtYSk6IERlY2xhcmUuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IG5ldyBvYmpkdW1wIG9wdGlvbnMuCi0KLVR1ZSBTZXAgMTIgMTI6Mzc6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0KLQkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IERvbid0IGNhbGwgd3JpdGVfYXJjaGl2ZSBpZiBub3RoaW5nCi0JY2hhbmdlZC4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQWRkIGNhc3RzIHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KLQotVGh1IFNlcCAgNyAxMjoxMjoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5pbjogUmVuYW1lIGZyb20gY29uZmlnLmguaW4uCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiB3aXRoIGNvbmZpZy5oOmNvbmZpZy5pbi4KLQlDaGVjayBmb3IgY29uZmlnLmg6Y29uZmlnLmluIHdoZW4gY3JlYXRpbmcgc3RhbXAtaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gY29uZmlnLmluIHJhdGhlciB0aGFuCi0JY29uZmlnLmguaW4uICBTZXQgQ09ORklHX0hFQURFUlMgdG8gY29uZmlnLmg6Y29uZmlnLmluIHdoZW4KLQljYWxsaW5nIGNvbmZpZy5zdGF0dXMuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmgsIHN0YW1wLWgsIGFuZAotICAgICAgICBjb25maWcubG9nLgotCi0JKiBubS5jICh2YWx1ZV9mb3JtYXQpOiBJbml0aWFsaXplIGJhc2VkIG9uIEJGRDY0IGFuZAotCUJGRF9IT1NUXzY0QklUX0xPTkcuCi0JKHByaW50X3JhZGl4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc2V0X3ByaW50X3JhZGl4KTogU2V0IHByaW50X3JhZGl4LiAgQWRqdXN0IGNoYW5nZXMgdG8KLQl2YWx1ZV9mb3JtYXQuCi0JKHByaW50X3ZhbHVlKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgdG8gcHJpbnQgNjQgYml0IG9jdGFsIGFuZAotCWRlY2ltYWwgdmFsdWVzIGNvcnJlY3RseS4KLQkocHJpbnRfc3ltYm9sX2luZm9fYnNkKTogQ2hlY2sgQkZENjQsIG5vdCBCRkRfSE9TVF82NF9CSVQuICBVc2UKLQlwcmludF92YWx1ZS4KLQkocHJpbnRfc3ltYm9sX2luZm9fc3lzdik6IFVzZSBwcmludF92YWx1ZS4KLQkocHJpbnRfc3ltYm9sX2luZm9fcG9zaXgpOiBMaWtld2lzZS4KLQotV2VkIFNlcCAgNiAxNTowMjo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgqLm8pOiBSZW1vdmUgaW5jb3JyZWN0IGRlcGVuZGVuY2llcyBvbgotCSQoQkZERElSKS9ob3N0cy9zdGQtaG9zdC5oLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9EQVRBKTogQWRkIC1tIDY0NC4KLQkoSU5TVEFMTF9YRk9STTEpOiBMaWtld2lzZS4KLQkoQ0NfRk9SX0JVSUxEKTogU2V0IHRvIEBDQ19GT1JfQlVJTERAIHJhdGhlciB0aGFuICQoQ0MpLgotCShtb3N0bHljbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX0NDX0ZPUl9CVUlMRCBhbmQgQkZEX0JJTkFSWV9GT1BFTi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAgNSAyMDoyMjo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSB0byB1c2UgYXV0b2NvbmYuCi0JKiBhY2xvY2FsLm00OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9jb25mLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWcuaC5pbjogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9oZWFkZXIuCi0JKiBNYWtlZmlsZS5pbjogVmFyaW91cyBjaGFuZ2VzIGZvciBuZXcgY29uZmlndXJlIHNjcmlwdC4gIEFsc286Ci0JKFBST0dTKTogUmVtb3ZlICQoU1lTSU5GT19QUk9HKS4KLQkoQUxMX0NGTEFHUyk6IFJlbW92ZSAkKFRERUZJTkVTKS4KLQkodmVyc2lvbi5vKTogVXNlICQoQUxMX0NGTEFHUykuCi0JKGNwbHVzLWRlbS5vLCBkbGx0b29sLm8sIG5sbWNvbnYubyk6IExpa2V3aXNlLgotCShzeXNkdW1wLm8pOiBEZXBlbmQgdXBvbiBidWNvbW0uaCBhbmQgY29uZmlnLmguCi0JKHNyY29udi5vLCBhcnN1cC5vLCBzdHJpbmdzLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQkoZmlsZW1vZGUubyk6IERvbid0IGRlcGVuZCB1cG9uIC4uL2JmZC9zeXNkZXAuaC4KLQkoYnVjb21tLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaCwgbm90IC4uL2JmZC9zeXNkZXAuaC4KLQkoc2l6ZS5vLCBvYmpkdW1wLm8sIG5tLm8sIGFyLm8sIG9iamNvcHkubyk6IExpa2V3aXNlLgotCShubG1oZWFkZXIubywgbmxtY29udi5vKTogTGlrZXdpc2UuCi0JKGRpc3RjbGVhbik6IERvbid0IHJlbW92ZSBzeXNkZXAuaC4KLQkqIGJ1Y29tbS5oOiBJbmNsdWRlICJhbnNpZGVjbC5oIiwgPHN0ZGlvLmg+LCBhbmQgImNvbmZpZy5oIi4KLSAgCUluY2x1ZGUgImZvcGVuLXNhbWUuaCIgb3IgImZvcGVuLWJpbi5oIiwgYmFzZWQgb24KLSAJVVNFX0JJTkFSWV9GT1BFTi4gIEluY2x1ZGUgPGVycm5vLmg+LCBhbmQgZGVjbGFyZSBlcnJubyBpZiBpdCBpcwotIAlub3QgYSBtYWNyby4gIEluY2x1ZGUgPHVuaXN0ZC5oPiwgPHN0cmluZy5oPiwgPHN0cmluZ3MuaD4sCi0gCTxzdGRsaWIuaD4sIGFuZCA8ZmNudGwuaD4gaWYgdGhleSBhcmUgcHJlc2VudC4gIERlY2xhcmUgc3RyY2hyLAotIAlzdHJyY2hyLCBhbmQgc3Ryc3RyIGlmIG5vIHN0cmluZyBoZWFkZXIgZmlsZSBleGlzdHMuICBJbmNsdWRlCi0JPHN5cy9maWxlLmg+IGlmIGl0IGV4aXN0cyBhbmQgPGZjbnRsLmg+IGRvZXMgbm90LiAgRGVmaW5lCi0JT19SRE9OTFkgYW5kIE9fUkRXUiBpZiBuZWNlc3NhcnkuCi0JKiBhci5jOiAgRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgRG8gaW5jbHVkZSA8c3lzL3R5cGVzLmg+IGFuZAotCTxzeXMvc3RhdC5oPi4gIFVzZSBIQVZFX0dPT0RfVVRJTUVfSCByYXRoZXIgdGhhbiBQT1NJWF9VVElNRS4gIFVzZQotCUhBVkVfVVRJTUVTIHJhdGhlciB0aGFuICFVU0VfVVRJTUUuICBEb24ndCBpbmNsdWRlIDxlcnJuby5oPiwgYW5kCi0JZG9uJ3QgZGVjbGFyZSBlcnJuby4KLQkqIGFyc3VwLmM6IERvbid0IGluY2x1ZGUgPHN5c2RlcC5oPi4KLQkqIGJ1Y29tbS5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlIDxzdGRpby5oPiwKLQk8c3lzL3R5cGVzLmg+LCBhbmQgPHN5cy9zdGF0Lmg+LiAgSW5jbHVkZSA8dGltZS5oPiBpZiBpdCBkZWZpbmVzCi0JdGltZV90LiAgRGVmaW5lIHRpbWVfdCBpZiBuZWNlc3NhcnkuCi0JKiBjb2ZmZHVtcC5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCi0JKiBjb2ZmZ3Jvay5jLCBmaWxlbW9kZS5jLCBubG1jb252LmMsIHNpemUuYzogTGlrZXdpc2UuCi0JKiBzcmNvbnYuYywgc3RyaW5ncy5jOiBMaWtld2lzZS4KLQkqIG5tLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIERvbid0IHRyeSB0byBkZWZpbmUgSEFWRV9TQlJLLgotCSogb2JqY29weS5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlIDxzeXMvdHlwZXMuaD4gYW5kCi0JPHN5cy9zdGF0Lmg+LgotCShzaW1wbGVfY29weSk6IFVzZSBjcmVhdCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGF0IE9fQ1JFQVQgaXMKLQlkZWZpbmVkLgotCSogb2JqZHVtcC5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBVc2UKLQlORUVEX0RFQ0xBUkFUSU9OX1BSSU5URiByYXRoZXIgdGhhbiAhRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVELgotCSogc3lzZHVtcC5jOiBJbmNsdWRlICJiZmQuaCIgYW5kICJidWNvbW0uaCIuICBEb24ndCBpbmNsdWRlCi0JInN5c2RlcC5oIiBvciA8c3RkbGliLmg+LgotCShkdW1wX3N5bWJvbF9pbmZvKTogUmVuYW1lIGZyb20gc3ltYm9sX2luZm8uICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0KLU1vbiBTZXAgIDQgMTQ6MzA6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6IERvbid0IHNldC4gIFN1YnN0aXR1dGUgZm9yCi0JQENDQCwgQENGTEFHU0AsIEBIREVGSU5FU0AgYW5kIEBMREZMQUdTQCBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6IFNldCB0byByYyByYXRoZXIgdGhhbiBxdi4KLQkoQ0MpOiBEZWZpbmUgYXMgQENDQC4KLQkoQ0ZMQUdTKTogU2V0IHRvIEBDRkxBR1NALgotCShMREZMQUdTKTogRGVmaW5lIGFzIEBMREZMQUdTQC4KLQkoQUxMX0NGTEFHUyk6IFVzZSBASERFRklORVNAIHJhdGhlciB0aGFuICQoSERFRklORVMpLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJvdGhlciB0byBjYWxsIGNvbmZpZy5iZmQgZm9yIGVhY2ggdGFyZ2V0LgotCUp1c3QgY2FsbCBpdCBmb3IgdGhlIGRlZmF1bHQgdGFyZ2V0LCBhbmQgdXNlIHRoZSBzaGVsbCB2YXJpYWJsZSB0bwotCWRlY2lkZSB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZSB1c2VkLgotCi1UaHUgQXVnIDMxIDE5OjIxOjQ4IDE5OTUgIEphc29uIE1vbGVuZGEgICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogbWF0Y2ggaVszLTZdODYtKi13aW4zMiwgbm90IGp1c3QgaTM4Ni0qLXdpbjMyLgotCi1UaHUgQXVnIDMxIDE2OjMwOjIyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoYWRkX2luZGlyZWN0KTogTmV3LgotCShhc21fcHJlZml4KTogTmV3Ci0JKGdlbl9leHBfZmlsZSk6IFRpbWVzdGFtcCBzaG91bGQgYmUgMC4gSW5zZXJ0IHByZWZpeCB3aGVuCi0JbmVlZGVkLiBOZXcgY29kZSBmb3IgaW5kaXJlY3Rpb24uCi0JKGdlbl9saWJfZmlsZSk6IFRpbWVzdGFtcCBzaG91bGQgYmUgMC4gSW5zZXJ0IHByZWZpeAotCXdoZW4gbmVlZGVkLgotCSh1c2FnZSk6IERvY3VtZW50IC0tYWRkLWluZGlyZWN0LgotCShtYWluKTogQ29wZSB3aXRoIG5ldyBvcHRpb24uCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9wcml2YXRlX2hlYWRlcnMpOiBOZXcuCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbi4KLQkobG9uZ19vcHRpb24pOiBBZGQgcHJpdmF0ZS1oZWFkZXJzLgotCShkdW1wX2JmZF9wcml2YXRlX2hlYWRlcik6IE5ldy4KLQkobWFpbik6IENvcGUgd2l0aCBuZXcgb3B0aW9uLgotCi1UaHUgQXVnIDMxIDA0OjA5OjE2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAocnVuKTogQWRkIG1pc3NpbmcgM3JkIGFyZyB0byB3YWl0cGlkLgotCi1XZWQgQXVnIDMwIDExOjAyOjExIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChUT09MX1BST0dTKTogSW5jbHVkZSBkbGx0b29sIGlmIG5lZWRlZC4KLQotVHVlIEF1ZyAyOSAxMzoyNToyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHJ2YSk6IERlbGV0ZWQuCi0JKHJ2YWFmdGVyLCBydmFfYmVmb3JlKTogVXNlIG5ldyBhc3NlbWJsZXIgcHNldWRvLgotCShmbHVzaF9wYWdlLCBnZW5fZXhwX2ZpbGUsIGdlbl9saWJfZmlsZSk6IFVzZSBuZXcgd2F5IG9mIFJWQWluZy4KLQkoZ2VuX2V4cF9maWxlKTogRG9uJ3QgZ2VuZXJhdGUgLmVkYXRhIGlmIG5vIG5lZWQuCi0JKGdlbl9saWJfZmlsZSk6IERvbid0IG1ha2UgdGltZXN0YW1wLgotCVB1dCBfaW5hbWUgaW4gaWRhdGEkNy4KLQkod29ya291dF9wcmVmaXgpOiBGaXggbWVtb3J5IGluaXRpYWxpemF0aW9uIGJ1Zy4KLQkodXNhZ2UpOiBUaWR5IHVwLCBkZWxldGUgbWFueSBzaW5nbGUgY2hhciBvcHRpb25zLgotCShtYWluKTogcnZhIG9wdGlvbiBpcyBnb25lLgotCi1Nb24gQXVnIDIxIDE4OjQxOjI4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAob3B0aW9ucyk6IGltYWdlLWJhc2UgaXMgYSBzeW5vbnltIGZvciBydmEuCi0JKGdlbl9saWJfZmlsZSk6IFB1dCBkbGwgbmFtZSBpbnRvIGliYXNlJDcuCi0KLVN1biBBdWcgMjAgMDk6NTk6MDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCU1vZGlmaWVkIHRvIGdlbmVyYXRlIGFyY2hpdmVzIGFuZCBvYmplY3RzIHJhdGhlciB0aGFuIC5zIGZpbGVzLgotCSogZGxsdG9vbC5jIChydW4pIE5ldyBmdW5jdGlvbi4KLSAJKGdlbl9leHBfZmlsZSwgZ2VuX2xpYl9maWxlKTogVXNlIHJ1bi4KLQkod29ya291dF9wcmVmaXgpOiBOZXcuCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0JKG1haW4pOiBQYXJzZSBuZXcgb3B0aW9ucy4KLQotV2VkIEF1ZyAxNiAxNjoyNjo1MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IEZpeCBSVkEgaGFuZGxpbmcuCi0JKHJ2YV9zLCBydmFfbik6IERlbGV0ZS4KLQotRnJpIEF1ZyAxMSAxODoyNzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKG1haW4pOiBJZ25vcmUgLWUuCi0KLVRodSBBdWcgMTAgMTc6MzU6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb25maWcudGV4aSk6IE5ldyB0YXJnZXQuICBXcml0ZSBvdXQgYSBzZXR0aW5nIGZvcgotCXRleGluZm8gdmFyaWFibGUgVkVSU0lPTi4KLQkoYmludXRpbHMuZHZpLCBiaW51dGlscy5pbmZvKTogRGVwZW5kIG9uIGl0LgotCSogYmludXRpbHMudGV4aTogSW5jbHVkZSBpdCwgYW5kIHJlZmVyZW5jZSBAdmFsdWV7VkVSU0lPTn0gaW5zdGVhZAotCW9mIGV4cGxpY2l0bHkgc3BlY2lmeWluZyAyLjIoISkuCi0KLVRodSBBdWcgMTAgMTY6MDc6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ3Jvay5jIChkb190eXBlKTogSGFuZGxlIGFycmF5IGRpbWVuc2lvbnMgdGhlIHNhbWUgd2F5IGdkYgotCWRvZXMuCi0KLVR1ZSBBdWcgIDggMTc6MTA6NDIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtdGFibGUpOiBOZXcgZmllbGRzLgotCShBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUik6IE5ldy4KLQkoZmx1c2hfcGFnZSk6IFVzZSBuZXcgbWFjcm9zLgotCi1TYXQgQXVnICA1IDAwOjE2OjM3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpjb3B5LmMgKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogSGFuZGxlIHNlY3Rpb25zCi0Jd2l0aCBubyByZWxvY2F0aW9ucy4KLQkqIGNvZmZncm9rLmMgKGRvX3NlY3Rpb25zX3AxKTogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMzEgMTI6NTE6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmMgKHByaW50X3N0cmluZ3MpOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nCi0Jc3RyaW5ncyBwcm9ncmFtcywgcHJpbnQgc3RyaW5ncyB3aGljaCBhcmUgbm90IHRlcm1pbmF0ZWQgd2l0aCBhCi0JbnVsbCBieXRlIG9yIGEgbmV3bGluZS4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmluZ3MuMTogVXBkYXRlIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCi0KLQkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYXIKLQlwcm9ncmFtcywgcGVybWl0IHVzZXJzIHRvIGFkZCB0aGUgc2FtZSBmaWxlIG11bHRpcGxlIHRpbWVzLgotCi1UdWUgSnVsIDI1IDExOjIxOjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jIChEQVRBX0ZMQUdTKTogUmVtb3ZlIFNFQ19EQVRBLgotCShtYWluKTogSWYgbm8gZmlsZSBuYW1lcyBhcmUgZ2l2ZW4sIHNjYW4gc3RhbmRhcmQgaW5wdXQuCi0JKiBiaW51dGlscy50ZXhpLCBzdHJpbmdzLjE6IHN0cmluZ3Mgbm93IHNjYW5zIG5vbi1kYXRhIHNlY3Rpb25zIGJ5Ci0JZGVmYXVsdC4KLQotTW9uIEp1bCAyNCAxMzo1MjoyOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jICh3cl9oZCk6IFNldCBhZmwgZmllbGQgdG8gNCBmb3IgYmZkX2FyY2hfc2guCi0JKHdyaXRlSU5UKTogV2hlbiBzaXplID09IC0yLCB1c2UgMiBieXRlcyBmb3IgdGhlIGg4MzAwIGFuZCA0IGJ5dGVzCi0JZm9yIHRoZQlzaC4KLQotCSogc3lzZHVtcC5jIChmaWxsdXApOiBSZXR1cm4gc2l6ZSAtIDEsIHRoZSBsYXN0IGJ5dGUgaXMgYSBjaGVja3N1bQotCWFuZCBzaG91bGRuJ3QgYmUgY291bnRlZC4KLQkqIHN5c3JvZmYuaW5mbyAoaGQpOiBDaGFuZ2VkIHNlZ21lbnQgaWRlbnRpZmllciBmcm9tIGEgYnl0ZSB0byBhIDEKLQliaXQgZmllbGQuICBUaGUgc3lzcm9mZiAyLjAtMDEgc3BlY2lmaWNhdGlvbiBzZWVtcyB0byBiZSBpbiBlcnJvcgotCWhlcmUuICBSZWR1Y2Ugd2lkdGggb2YgZm9sbG93aW5nICJzcGFyZSIgZmllbGQgZnJvbSA0IHRvIDMgYml0cy4KLQkocmwpOiBDaGFuZ2VkIG9yZGVyIGFuZCB3aWR0aCBvZiBmaXJzdCA0IGJpdGZpZWxkcyB0byBjb3JyZXNwb25kCi0JdG8gc3lzcm9mZiBzcGVjaWZpY2F0aW9uLgotCShkbG5faGVhZCwgZGxuX2luc2lkZSwgZGxuX3RhaWwpOiBSZW1vdmVkLgotCi1UdWUgSnVsIDE4IDIzOjAwOjAzIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBubS5jIChzb3J0X3N5bWJvbHNfYnlfc2l6ZSk6ICBFbmNsb3NlIGV4cHJlc3Npb24gYmVpbmcgY2FzdGVkCi0JaW4gcGFyZW5zIHNvIHJlc3VsdCBpcyBjYXN0ZWQsIG5vdCBqdXN0IGZpcnN0IG9wZXJhbmQuICBDYW4ndAotCWRvIHBvaW50ZXIgYXJpdGhtZXRpYyBvbiB2b2lkKiBwb2ludGVycy4KLQotRnJpIEp1bCAxNCAxMzo0Mjo0MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHN5c2R1bXAuYyAoZGgpOiBDaGFuZ2VkIGZvcm1hdCBvZiBvdXRwdXQgdG8gYmUgMTYgaGV4IGRpZ2l0cwotCWZvbGxvd2VkIGJ5IDE2IGFzY2lpIGNoYXJhY3RlcnMsIHNpbWlsYXIgdG8gRW1hY3MnIGhleGwtbW9kZSwKLQl0byBtYWtlIGl0IGVhc2llciB0byByZWFkLgotCSh4Y2FsbG9jKTogZml4IHR5cG8uCi0KLVRodSBKdWwgMTMgMTU6Mjc6NDQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAod3JfdHIpOiBXcml0ZSBvdXQgaGFuZGNyYWZ0ZWQgdHIgYmxvY2suCi0JKHdhbGtfdHJlZV9zeW1ib2wpOiBVc2UgZXZhbGxlbiBhbmQgZXZhbHVlIGluc3RlYWQgb2YKLQl2YWxsZW4gJiB2YWx1ZSBiZWNhdXNlIG9mIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBpbgotCXN5c3JvZmYuaW5mby4KLQotCSogc3lzZHVtcC5jIChzeXNyb2ZmX3N3YXBfdHJfaW4sIHN5c3JvZmZfcHJpbnRfdHJfb3V0KTogTmV3Ci0JZnVuY3Rpb25zLgotCi0JKiBzeXNyb2ZmLmluZm8gKHRyKTogdGhlIHRyIGJsb2NrIGlzIGEgc3BlY2lhbCBjYXNlIC0tLSBhIGJsb2NrCi0Jd2l0aG91dCBjb250ZW50cyAtLS0gd2hpY2ggY2FuJ3QgYmUgaGFuZGxlZCBieSBnZW5lcmF0ZWQgY29kZS4KLQkoZGVuLCBkcHApOiBvbmx5IGZpcnN0IGJ5dGUgaXMgcHJlc2VudCBmb3IgREVOZW5kLCBEUFBlbmQuCi0JKGRzeSk6IGRlc2NyaWJlIGEgY29uZGl0aW9uYWwgcG9ydGlvbiBvZiBibG9jaywgcmVuYW1lIHNvbWUgZmllbGRzLgotCShkcHMpOiBkZXNjcmliZSBhIGNvbmRpdGlvbmFsIHBvcnRpb24gb2YgYmxvY2suCi0JKGRmbCk6IHJlbW92ZWQuCi0KLQkqIHN5c2luZm8ueSAoeXllcnJvcik6IHdyaXRlIGVycm9yIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCi0KLVRodSBKdWwgMTMgMTA6NDM6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIGFycGFyc2UuaCBhbmQgc3lzaW5mby5oLgotCShtb3N0bHljbGVhbik6IFJlbW92ZSB5Lm91dHB1dC4KLQkoY2xlYW4pOiBSZW1vdmUgc3lzcm9mZiwgc3lzcm9mZi5jLCBzeXNyb2ZmLmgsIGFuZCBzeXNpbmZvLgotCi0JKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IENhc3QgbWVtc2V0IGFyZyB0byBzaXplX3QuCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogTGlrZXdpc2UuCi0KLQkqIG5tLmMgKEhBVkVfU0JSSyk6IERlZmluZSBleGVjcHQgb24gYW1pZ2Fkb3MgYW5kIFdJTkRPV1NfTlQuCi0JKHN0cnVjdCBzaXplX3N5bSk6IERlZmluZS4KLQkoc2hvd19zdGF0cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCB1bmRvY3VtZW50ZWQgb3B0aW9uICJzdGF0cyIuCi0JKG1haW4pOiBQcmludCBtZW1vcnkgc3RhdHMgaWYgcmVxdWVzdGVkLgotCShzb3J0X2JmZCwgc29ydF9keW5hbWljLCBzb3J0X3gsIHNvcnRfeSk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShudW1lcmljX2ZvcndhcmQpOiBVc2UgbWluaXN5bWJvbHMgcmF0aGVyIHRoYW4gYXN5bWJvbHMuCi0JKG5vbl9udW1lcmljX2ZvcndhcmQpOiBMaWtld2lzZS4KLQkoc2l6ZV9mb3J3YXJkMSk6IFJlbmFtZSBmcm9tIHNpemVfZm9yd2FyZC4gIFVzZSBtaW5pc3ltYm9scy4KLQkoc2l6ZV9mb3J3YXJkMik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNvcnRfc3ltYm9sc19ieV9zaXplKTogVGFrZSBuZXcgYXJndW1lbnRzIGR5bmFtaWMsIHNpemUsIGFuZAotCXN5bXNpemVwLiAgVXNlIG1pbmlzeW1ib2xzLiAgRG9uJ3Qgc3RvcmUgdGhlIHNpemUgYmFjayBpbiB0aGUKLQlzeW1ib2w7IHN0b3JlIGluIGEgbmV3bHkgYWxsb2NhdGUgc3RydWN0IHNpemVfc3ltIGFycmF5LgotCShkaXNwbGF5X3JlbF9maWxlKTogUmVhZCBtaW5pc3ltYm9scyByYXRoZXIgdGhhbiBhc3ltYm9scy4gIFNldAotCXNvcnRfKiB2YXJpYWJsZXMuICBDYWxsIHByaW50X3NpemVfc3ltYm9scyBpZiBzb3J0aW5nIGJ5IHNpemUuCi0JKGZpbHRlcl9zeW1ib2xzKTogVGFrZSBuZXcgYXJndW1lbnRzIGR5bmFtaWMgYW5kIHNpemUuICBVc2UKLQltaW5pc3ltYm9scy4KLQkocHJpbnRfc3ltYm9scyk6IExpa2V3aXNlLiAgQ2FsbCBwcmludF9zeW1ib2wgZm9yIGFjdHVhbCBwcmludGluZy4KLQkocHJpbnRfc2l6ZV9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotV2VkIEp1bCAxMiAxMDo0MzowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzKTogT25seSBwcmludCBlYWNoIHN0YWJzIHNlY3Rpb24KLQlvbmNlLgotCShjb21wYXJlX3JlbG9jcyk6IE1ha2UgaXQgY2xlYXIgdG8gZ2NjIHRoYXQgdGhpcyBhbHdheXMgcmV0dXJucyBhCi0JdmFsdWUuCi0KLVdlZCBKdWwgMTIgMTA6NDA6MjMgMTk5NSAgSC5KLiBMdSAgPGhqbEBueW5leHN0LmNvbT4KLQotCSogb2JqY29weS5jIChzaW1wbGVfY29weSk6IFByZXNlcnZlIGVycm5vIG9uIGZhaWx1cmUuCi0JKHNtYXJ0X3JlbmFtZSk6IFByaW50IGVycm9yIG1lc2FnZSBpZiBzaW1wbGVfY29weSBmYWlscy4KLQotVHVlIEp1bCAxMSAxMzoxMDo1MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHN5c2R1bXAuYzogcmUtaW5kZW50ZWQgZmlsZS4KLQkobW9kdWxlKTogcmVhZCBibG9ja3Mgc2VxdWVudGlhbGx5IGluc3RlYWQgb2YgdHJ5aW5nIHRvIHBhcnNlCi0JdGhlbSwgYXMgdGhhdCB3b3VsZCByZXF1aXJlIGNoYW5naW5nIHRoZSBwYXJzZXIgcmVjb2duaXplIHRoZQotCWRpZmZlcmVuY2UgYmV0d2VlbiBhIERQU3N0YXJ0IGFuZCBEUFNlbmQgYmxvY2suCi0JKGdldG9uZSk6IEFkZCBicmVhaydzIGJldHdlZW4gc3dpdGNoIGJsb2NrcyBhcyBhcHByb3ByaWF0ZS4KLQkob2JqZWN0X2JvZHlfbGlzdCk6IHBhcnNlIGJsb2NrcyBhY2NvcmRpbmcgdG8gc3lzcm9mZiBzcGVjLgotCi1Nb24gSnVsIDEwIDEyOjM3OjI1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0Bwb3NlaWRvbi5jeWdudXMuY29tPgotCi0JKiBzeXNyb2ZmLmluZm86IHJlLWluZGVudGVkIGZpbGUsIHByaW9yIGZvcm1hdHRpbmcgd2FzIGNvbmZ1c2luZwotCWJlY2F1c2UgaXQgd2FzIGluZGVudGF0aW9uIGRpZCBub3QgcmVmbGVjdCBuZXN0aW5nIG9mIGNvbmRpdGlvbmFsCi0JcmVjb3Jkcy4gIENoYW5nZSAic3BhY2Ugc2l6ZSB3aXRoaW4gc2VnbWVudCIgcmVjb3JkIGluIGhkIHJlY29yZAotCWZyb20gYml0IHRvIGJ5dGUuCi0KLQkqIHN5c2luZm8ueSAoY29uZF9pdF9maWVsZCk6IFVzZSB4Y2FsbG9jIGluc3RlYWQgb2YgY2FsbG9jLgotCi0JKiBzcmNvbnYuYyAod3JfY3MpOiBSZWZvcm1hdHRlZCBjcyBoZWFkZXIgYXJyYXksIHRhZyBlYWNoIGJ5dGUKLQl3aXRoIGEgY29tbWVudCBkZXNjcmliaW5nIHRoZSBmaWVsZC4KLQkod3JfdW5pdF9pbmZvKTogVXNlIFNFRUtfU0VUIG1hY3JvIGluc3RlYWQgb2YgY29uc3RhbnQgMC4KLQkobWFpbik6IFVzZSBGT1BFTl9XQiBtYWNybyBpbnN0ZWFkIG9mIGxpdGVyYWwgIndiIi4KLQkqIHN5c3JvZmYuaW5mbzogUmVtb3ZlIGZkbCAoZGZsKSBmaWVsZCBmcm9tIGNzIGJsb2NrLiAgQ29tcGFyZQotCXB0ci0+dHlwZSB3aXRoIEVEX1RZUEVfQ09OU1QgaW5zdGVhZCBvZiBjb25zdGFudCAyIGluIGVkIGJsb2NrLgotCi1UdWUgSnVsICA0IDE0OjQ4OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAoc2l6ZV9mb3J3YXJkKTogQ2hlY2sgeWYgYWdhaW5zdCB5biwgbm90IHhuLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IFJlY29yZCBhbGwgb3V0cHV0IEJGRCdzLCBhbmQgY2xvc2UKLQl0aGVtIGJlZm9yZSB1bmxpbmtpbmcgdGhlbSBhbmQgcmVtb3ZpbmcgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JdG8gYXZvaWQgTkZTIHByb2JsZW1zLgotCi0JKiBhci5jIChyZXBsYWNlX21lbWJlcnMpOiBJbiB2ZXJib3NlIG1lc3NhZ2VzLCB1c2UgJ3InIHdoZW4KLSAgICAgICAgcmVwbGFjaW5nIGEgbWVtYmVyLCBhbmQgJ2EnIHdoZW4gYWRkaW5nIG9uZS4KLQotCSogYXIuYyAoYXJfdHJ1bmNhdGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShub3JtYWxpemUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gY29uc3QgY2hhciAqLiAgQWRkIGFiZmQKLQlhcmd1bWVudC4gIENoYW5nZSBhbGwgY2FsbGVycy4gIElmIGFyX3RydW5jYXRlLCBjaG9wIHRoZSBmaWxlbmFtZQotCXRvIGFiZmQtPmFyX21heF9uYW1lbGVuLgotCShtYWluKTogRm9yIHRoZSAnZicgbW9kaWZpZXIsIHNldCBhcl90cnVuY2F0ZSB0byB0cnVlLiAgRG9uJ3QKLQljaGFuZ2UgcXVpY2tfYXBwZW5kIHRvIHJlcGxhY2UgaWYgYXJfdHJ1bmNhdGUgaXMgdHJ1ZS4KLQkoZG9fcXVpY2tfYXBwZW5kKTogSWYgYXJfdHJ1bmNhdGUsIHNldCBCRkRfVFJBRElUSU9OQUxfRk9STUFULgotCSh3cml0ZV9hcmNoaXZlKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpLCBhci4xOiBEb2N1bWVudCAnZicgbW9kaWZpZXIuCi0KLQkqIG9iamNvcHkuYyAoZW51bSBzdHJpcF9hY3Rpb24pOiBEZWZpbmUgc3RyaXBfdW5uZWVkZWQuCi0JKE9QVElPTl9TVFJJUF9VTk5FRURFRCk6IERlZmluZS4KLQkoc3RyaXBfb3B0aW9ucyk6IEFkZCAic3RyaXAtdW5uZWVkZWQiLgotCShjb3B5X29wdGlvbnMpOiBMaWtld2lzZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1zdHJpcC11bm5lZWRlZC4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkoaXNfc3RyaXBfc2VjdGlvbik6IFN0cmlwIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiBzdHJpcF91bm5lZWRlZC4KLQkoZmlsdGVyX3N5bWJvbHMpOiBJZiBzdHJpcF91bm5lZWRlZCwgb25seSBrZWVwIEJTRl9LRUVQIHN5bWJvbHMuCi0JKGNvcHlfb2JqZWN0KTogSWYgc3RyaXBfYWxsLCBkaXNjYXJkIHN5bWJvbHMgd2l0aG91dCBjaGVja2luZwotCWRpc2NhcmRfbG9jYWxzLgotCShjb3B5X29iamVjdCk6IENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgc3RyaXBfdW5uZWVkZWQuCi0JKHNldHVwX3NlY3Rpb24pOiBTdHJpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgc3RyaXBfdW5uZWVkZWQuCi0JKGNvcHlfc2VjdGlvbik6IExpa2V3aXNlLgotCShzdHJpcF9tYWluKTogSGFuZGxlIE9QVElPTl9TVFJJUF9VTk5FRURFRC4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjEsIHN0cmlwLjE6IERvY3VtZW50IC0tc3RyaXAtdW5uZWVkZWQuCi0KLU1vbiBKdWwgIDMgMTQ6MTY6NDcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotd2luMzIpOiBOZXcgY29uZmlndXJhdGlvbi4KLQkqIGRsbHRvb2wuYyAoa2lsbGF0LCB4bGF0ZSwgdXNhZ2UsIGxvbmdfb3B0aW9ucywgbWFpbik6Ci0JVW5kZXJzdGFuZCBhbmQgY29wZSB3aXRoIC1rIG9wdGlvbi4KLQotU2F0IEp1bCAgMSAxMjoyNToxNSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogYXIuYzogKGV4dHJhY3RfZmlsZSk6ICBDaGFuZ2UgIiNpZiBQT1NJWF9VVElNRSIgdG8KLQkiI2lmZGVmIFBPU0lYX1VUSU1FIiB0byBtYXRjaCBvdGhlciB0ZXN0cyBvZiBQT1NJWF9VVElNRQotCWFuZCBhdm9pZCBsb3NzYWdlIHdoZW4gUE9TSVhfVVRJTUUgaXMgbm90IGRlZmluZWQgYXQgYWxsLgotCi1XZWQgSnVuIDI4IDE3OjUxOjI0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGFyLmM6IChwcmludF9jb250ZW50cy5jLCBleHRyYWN0X2ZpbGUsIGRvX3F1aWNrX2FwcGVuZCk6Ci0JTWFsbG9jIGJ1ZmZlcnMgcmF0aGVyIHRoYW4gYWxsb2NhdGUgb24gc3RhY2sgKHNvIGl0IHdvcmtzCi0Jb24gTlQpLgotCSogZGVmbGV4Lmw6IE5hbWVzIGNhbiBoYXZlIGFuIEAgaW4gdGhlbS4KLQkqIGRsbHRvb2wuYzogTG9hZHMgb2Ygc3R1ZmYuIENhbiBub3cgZ2VuZXJhdGUgLmltcCBmaWxlcyB3aGljaAotCXdvcmsgd2l0aCBOVCAuZGxscy4KLQotVGh1IEp1biAyMiAxOToxMDo1MCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLmluIChkZW1hbmdsZS5jLm8pOiBSZW1vdmUuCi0JKGFycGFyc2UuaCk6IERlcGVuZCBvbiBhcnBhcnNlLmMgaW5zdGVhZCBvZiBhcnBhcnNlLnkuCi0KLVdlZCBKdW4gMjEgMTc6MzI6NDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IERvbid0IGluY2x1ZGUgaW5mbyBoZXJlLgotCShkaXN0c3R1ZmYpOiBJbmNsdWRlIGl0IGhlcmUuCi0JKHJlYWxjbGVhbik6IFJlbW92ZSAqLmluZm8uCi0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9yZWxvY3MpOiBJZiByZWxvY2F0aW9uIGVudHJpZXMgaGF2ZSB0aGUgc2FtZQotCWFkZHJlc3MsIGtlZXAgdGhlbSBpbiBmaWxlIG9yZGVyLgotCi1Nb24gSnVuIDE5IDA5OjA2OjQ5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYzogQ2hhbmdlIG5hbWVzIG9mIGdlbmVyYXRlZCBmaWxlcy4gLioucy0+IC0qLnMKLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiAgQ2hlY2sgZm9yIG5hbWVzCi0Jd2hpY2ggYXJlIHN1cGVyc2V0cyBvZiBzZWxlY3RlZCBuYW1lcy4KLQotV2VkIEp1biAxNCAxOTo0Mzo1MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG10YWJsZSwgQVJNIGp1bXApOiBNdXN0IHJlZGlyZWN0IHZpYSBwYyBvZmZzZXRhYmxlIHB0ci4KLQotV2VkIEp1biAxNCAxMzoyNzoyMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkZWZsZXgubCwgZGVmcGFyc2UueSwgZGxsdG9vbC5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBTdXBwb3J0IGZvciB0aGVtLgotCi1Nb24gSnVuIDEyIDExOjI3OjU0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHN5c2R1bXAuYzogSW5jbHVkZSBzeXNkZXAuaAotCShtYWluKTogT3BlbiBpbnB1dCB3aXRoIEZPUEVOX1JCLgotCi1GcmkgSnVuICA5IDE3OjI2OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jICh3aWRlX291dHB1dCk6IE5ldyBmbGFnIHZhcmlhYmxlLgotCSh1c2FnZSk6IFByaW50IG5ldyAtdywgLS13aWRlIG9wdGlvbnMuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXdpZGUgc3VwcG9ydC4KLQkoZHVtcF9zZWN0aW9uX2hlYWRlcik6IElmIC0td2lkZSwgZG9uJ3QgcHJpbnQgYSBuZXdsaW5lIGJldHdlZW4KLQl0aGUgc2VjdGlvbidzIGZpcnN0IGxpbmUgYW5kIHRoZSBmbGFncy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogVXNlIHVuc2lnbmVkIGNvbXBhcmlzb25zIGZvciB0aGUgYmluYXJ5Ci0Jc2VhcmNoLCBub3Qgc2lnbmVkLgotCShkaXNhc3NlbWJsZV9kYXRhKTogSWYgLS13aWRlLCBkb24ndCBwdXQgYSBcbiBiZXR3ZWVuIHRoZQotCWRpc2Fzc2VtYmx5IG91dHB1dCBhbmQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQkobWFpbik6IFN1cHBvcnQgLXcgb3B0aW9uIGJlaW5nIHRoZSBzYW1lIGFzIC0td2lkZS4KLQotVGh1IEp1biAgMSAxNzowOToyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU2F0IE1heSAgNiAwODo1MjoyNCAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIG9iamNvcHkuYyAoc21hcnRfcmVuYW1lKTogbWFrZSBpdCBzbWFydGVyLCBjbGVhbiB1cAotCSAgaWYgcmVuYW1lICgpIGZhaWxzLgotCi1UdWUgTWF5IDMwIDE0OjI0OjE1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBEZWxldGUgbGluZXMgd2l0aCBsb3RzIG9mICMjIyMgYmVjYXVzZSBmb3VyIG9yIG1vcmUKLQlpbmRpY2F0ZSBhIHBvaW50IGZvciBtYWtlZmlsZSBmcmFnbWVudCBzdWJzdGl0dXRpb24uCi0KLVR1ZSBNYXkgIDkgMTc6MTc6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG5sbWNvbnYgb24gUG93ZXJQQyBlYWJpIGFueSBtb3JlLCBpdAotCWlzIG5vdCBuZWVkZWQuCi0KLVRodSBBcHIgMjcgMjA6MjE6MjQgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYUEVDVCk6IERlZmluZS4KLQkoUlVOVEVTVCk6IFVzZSBvbmUgaW4gc291cmNlIHRyZWUgaWYgcHJlc2VudC4KLQkoY2hlY2spOiBTZXQgYHJvb3RtZScgZm9yICQoRVhQRUNUKS4KLQotV2VkIEFwciAyNiAxODoyNjoyMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAobWFpbik6IEFkZCBzdXBwb3J0IGZvciAtbiBvcHRpb24gd2hpY2ggZGlzYWJsZXMKLQlwcmVzY2FuIG9mIGNvbW1vbiBzeW1ib2xzLgotCSh3cl9vYik6IElmIHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgc2VjdGlvbiwgZmlsbCB3aXRoIHplcm9zLgotCi1UdWUgQXByIDI1IDE5OjE0OjM3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IERpc3BsYXkgbG9hZCBhZGRyZXNzIGFmdGVyCi0JdmlydHVhbCBtZW1vcnkgKHJ1bi10aW1lKSBhZGRyZXNzLgotCi1XZWQgQXByIDE5IDA5OjQ0OjA2IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY3BsdXMtZGVtLm8pOiBQYXNzIC1EVkVSU0lPTj0nIiQoVkVSU0lPTikiJyB0byB0aGUKLSAgICAgICAgY29tcGlsZS4KLQkoREVNQU5HTEVSX1BST0cpOiBObyBsb25nZXIgdXNlcyB2ZXJzaW9uLm8uCi0KLU1vbiBBcHIgMTAgMTM6Mjk6NDkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCi0JKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKLQotCSogbXB3LWNvbmZpZy5pbiAoVERFRklORVMpOiBEZWZpbmUgYXMgZW1wdHkgaW4gbWFrZWZpbGUgZnJhZy4KLQotCSogbXB3LWNvbmZpZy5pbjogQ3JlYXRlIG1rLnRtcCwgZGVmaW5lIEFSQ0hERUZTIGluIGl0LgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIGNvbmZpZ3VyZSBmcmFnbWVudCBmb3IgYmludXRpbHMuCi0JKiBtcHctbWFrZS5pbiAoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IEFsc28gZGVwZW5kIG9uIGluc3RhbGwtb25seS4KLQotCSogbXB3LW1ha2UuaW4gKGNwbHVzZmlsdCk6IFJlbmFtZWQgZnJvbSBjKytmaWx0LgotCShJTkNMVURFUyk6IEFkZCBtb3JlIHBhdGhzLgotCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyBtYWtlZmlsZSBmcmFnbWVudCBmb3IgYmludXRpbHMuCi0JKE5vcm1hbGx5IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4uKQotCi1Nb24gTWFyIDI3IDExOjUyOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXIuYyAod3JpdGVfYXJjaGl2ZSk6IENhbGwgbWFrZV90ZW1wbmFtZSB0byBnZXQgb3V0cHV0IGZpbGUKLQluYW1lLCByYXRoZXIgdGhhbiB1c2luZyBhIGZpeGVkIG5hbWUgYmFzZWQgb24gdGhlIGlucHV0IGZpbGUuCi0KLQkqIG9iamNvcHkuYyAobWFrZV90ZW1wbmFtZSk6IENvcHkgZnJvbSBoZXJlLi4uCi0JKiBidWNvbW0uYyAobWFrZV90ZW1wbmFtZSk6IC4uLnRvIGhlcmUsIGFuZCBtYWtlIGdsb2JhbC4KLQkqIGJ1Y29tbS5oIChtYWtlX3RlbXBuYW1lKTogRGVjbGFyZS4KLQotRnJpIE1hciAyNCAxMTo0Nzo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cmluZ3MuYzogSW5jbHVkZSAiYmZkLmgiIGJlZm9yZSBvdGhlciBoZWFkZXJzLiAgSW5jbHVkZQotCSJzeXNkZXAuaCIuCi0JKiBidWNvbW0uYyAocHJpbnRfYXJlbHRfZGVzY3IpOiBDYXN0IHN0X3VpZCBhbmQgc3RfZ2lkIHRvIGxvbmcsCi0JYW5kIHByaW50IHRoZW0gd2l0aCAlbGQuCi0KLUZyaSBNYXIgMTAgMTM6MDk6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX29wdGlvbnMpOiBBZGQgLS1rZWVwLXN5bWJvbC4KLQkoY29weV9vcHRpb25zKTogTGlrZXdpc2UuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0ta2VlcC1zeW1ib2wgYW5kIC1LLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCShrZWVwX3N5bWJvbHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpc19zdHJpcF9zeW1ib2wpOiBBZGp1c3QgdGhlIHJldHVybiB2YWx1ZSBhY2NvcmRpbmcgdG8KLQlrZWVwX3N5bWJvbHMuCi0JKHN0cmlwX21haW4pOiBIYW5kbGUgLUsuICBGb3IgLU4sIGNoZWNrIHRoYXQgLUsgd2FzIG5vdCBnaXZlbi4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjEsIHN0cmlwLjE6IERvY3VtZW50IC1LLgotCi1Nb24gTWFyICA2IDEzOjMzOjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBDaGVjayByZXN1bHQgb2YgbWtkaXIuCi0JKGNvcHlfbWFpbik6IENhc3QgYW4geG1hbGxvYyByZXN1bHQuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBCcmVhayBsb25nIGZvcm1hdCBzdHJpbmcgaW50byBzaG9ydGVyIG9uZXMuCi0KLU1vbiBNYXIgIDYgMTM6NDY6MTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBidWNvbW0uYyAobGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyk6IE5ldyBmdW5jdGlvbi4KLQkqIGJ1Y29tbS5oIChsaXN0X3N1cHBvcnRlZF90YXJnZXRzKTogRGVjbGFyZS4KLQkqIGFyLmMgKHVzYWdlKTogQ2FsbCBsaXN0X3N1cHBvcnRlZF90YXJnZXRzLgotCSogbm0uYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSwgc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIHNpemUuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQotVHVlIEZlYiAyOCAxNToxMzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6IENhc3Qgc3Rfc2l6ZSB0byBsb25nIGJlZm9yZQotCXBhc3NpbmcgaXQgdG8gZnByaW50Zi4KLQotRnJpIEZlYiAxNyAxMzozNjo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RydWN0IHNlY3Rpb25fbGlzdCk6IEFkZCBmaWVsZHMgcmVtb3ZlLCBzZXRfZmxhZ3MsCi0JYW5kIGZsYWdzLiAgQ2hhbmdlIGFkanVzdCBmcm9tIGJvb2xlYW4gdG8gZW51bS4KLQkocmVtb3ZlX3NlY3Rpb25zKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoc2VjdGlvbnNfcmVtb3ZlZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAtLXNldC1zZWN0aW9uLWZsYWdzLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXNldC1zZWN0aW9uLWZsYWdzLgotCShwYXJzZV9mbGFncyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpbmRfc2VjdGlvbl9saXN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaXNfc3RyaXBfc3ltYm9sKTogQ2hhbmdlIHJldHVybiB0eXBlIGZyb20gaW50IHRvIGJvb2xlYW4uCi0JKGlzX3N0cmlwX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmaWx0ZXJfc3ltYm9scyk6IENhbGwgaXNfc3RyaXBfc2VjdGlvbi4KLQkoY29weV9vYmplY3QpOiBXaGVuIGFkZGluZyBzZWN0aW9ucywgY2hlY2sgZm9yIHNwZWNpZmllZCBmbGFncyBvcgotCVZNQS4gIENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgYW55IHNlY3Rpb25zIGFyZSBiZWluZyByZW1vdmVkLgotCShzZXR1cF9zZWN0aW9uKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IGZ1bmN0aW9uIHJhdGhlciB0aGFuCi0JbG9va2luZyB0aHJvdWdoIHJlbW92ZV9zZWN0aW9ucyBhbmQgYWRqdXN0X3NlY3Rpb25zLiAgSGFuZGxlCi0JLS1zZXQtc2VjdGlvbi1mbGFncy4KLQkoY29weV9zZWN0aW9uKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IHJhdGhlciB0aGFuIGxvb2tpbmcgdGhyb3VnaAotCXJlbW92ZV9zZWN0aW9ucy4KLQkoc3RyaXBfbWFpbik6IFVzZSBmaW5kX3NlY3Rpb25fbGlzdCBpbnN0ZWFkIG9mIGFkZGluZyBpdGVtcyB0bwotCXNlY3Rpb25zX3JlbW92ZWQuCi0JKGNvcHlfbWFpbik6IFVzZSBmaW5kX3NlY3Rpb25fbGlzdCBpbnN0ZWFkIG9mIGFkZGluZyBpdGVtcyB0bwotCXNlY3Rpb25zX3JlbW92ZWQgYW5kIGFkanVzdF9zZWN0aW9ucy4gIEhhbmRsZSAtLXNldC1zZWN0aW9uLWZsYWdzLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLXNldC1zZWN0aW9uLWZsYWdzLgotCi1UdWUgRmViIDE0IDE4OjAzOjAzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jICh3aXRoX3NvdXJjZV9jb2RlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC1TLy0tc291cmNlLgotCShsb25nX29wdGlvbnMpOiBBZGQgLS1zb3VyY2UuCi0JKHByZXZfZnVuY3Rpb25uYW1lLCBwcmV2X2xpbmUpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc3RydWN0IHByaW50X2ZpbGVfbGlzdCk6IERlZmluZS4KLQkocHJpbnRfZmlsZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShza2lwX3RvX2xpbmUsIHNob3dfbGluZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShkaXNhc3NlbWJsZV9kYXRhKTogQ2FsbCBzaG93X2xpbmUgdG8gaGFuZGxlIC1sIGFuZCAtUy4KLQkobWFpbik6IEhhbmRsZSAtUy4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLVMvLS1zb3VyY2UuCi0KLVRodSBGZWIgIDkgMTY6MTE6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfdXNhZ2UpOiBSZW5hbWUgcGFyYW1ldGVyIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9hZGQpOiBEZWZpbmUuCi0JKGFkZF9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvcHlfb3B0aW9ucyk6IEFjY2VwdCAtLWFkZC1zZWN0aW9uLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLWFkZC1zZWN0aW9uLgotCShjb3B5X29iamVjdCk6IEFkZCBzZWN0aW9ucyBmcm9tIHRoZSBhZGRfc2VjdGlvbnMgbGlzdC4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tYWRkLXNlY3Rpb24uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tYWRkLXNlY3Rpb24uCi0KLVdlZCBGZWIgIDEgMTU6MDQ6NTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogUGFzcyBzZWN0aW9uIG9mZnNldCwgbm90IGFic29sdXRlCi0JYWRkcmVzcywgdG8gYmZkX2ZpbmRfbmVhcmVzdF9saW5lLgotCi0JKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IERvbid0IHVzZSBjb25zdCB3aXRoCi0JcmVsb2NfaG93dG9fdHlwZS4KLQotVGh1IEphbiAyNiAxODo1MDowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogVXNlIGJmZF9hc3ltYm9sX3ZhbHVlIChWQVIpIHJhdGhlcgotCXRoYW4gVkFSLT52YWx1ZS4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogTGlrZXdpc2UuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBjaGFuZ2UgdGhlIHN5bWJvbCB2YWx1ZXMuICBJdCBjYW4KLQljb25mdXNlIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0KLVRodSBKYW4gMjYgMTI6MDM6NTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBwb3dlcnBjLSotZWJhaS4KLQotV2VkIEphbiAxOCAxMDowMjoxMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29mZmR1bXAuYzogSW5jbHVkZSBzeXNkZXAuaC4KLQkoZHVtcF9jb2ZmX3R5cGUpOiBIYW5kbGUgY29mZl9zZWNkZWZfdHlwZS4KLQkqIGNvZmZncm9rLmMgOiBJbmNsdWRlIHN5c2RlcC5oLgotCSogc3Jjb252LmM6IEluY2x1ZGUgbGliaWJlcnR5LmgKLQkoYWJzb2x1dGVfcCwgZHR5X3N0YXJ0LCBkdHlfZW5kLCBkdW1wX3RyZWVfc3RydWN0dXJlKTogUmVtb3ZlLgotCi1XZWQgSmFuIDE4IDEyOjI0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29mZmR1bXAuYyAoZHVtcF9jb2ZmX3Njb3BlKTogQ2FzdCBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yCi0JcHJpbnRmLgotCSogY29mZmdyb2suYzogSW5jbHVkZSBidWNvbW0uaC4gIERvbid0IGRlY2xhcmUgeG1hbGxvYy4KLQkocHVzaF9zY29wZSk6IERlY2xhcmUgdHlwZSBvZiBwYXJhbWV0ZXIgbGluay4KLQkqIHNpemUuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkqIHNyY29udi5jOiBJbmNsdWRlIGJ1Y29tbS5oLgotCShmaW5kX2Jhc2UpOiBEZWNsYXJlIGF0IHRvcCBvZiBmaWxlLgotCSh3cl9oZCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gYXJjaGl0ZWN0dXJlIHN3aXRjaC4KLQkod3JfZHBzX3N0YXJ0KTogRGVjbGFyZSB0eXBlIG9mIHBhcmFtZXRlciBuZXN0LgotCSh3cl9kdSk6IENvbW1lbnQgb3V0IHZhcmlhYmxlcyB1c2VkIG9ubHkgaW4gY29tbWVudGVkIG91dCBibG9ja3MuCi0JKHdyX2R1cyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaS4KLQkod3Jfc2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBteWluZm8sIGxvdywgYW5kIGhpZ2guCi0JKiBzdHJpbmdzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKiBzeXNkdW1wLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCi1UdWUgRGVjIDIwIDE5OjEzOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXIuYyAobWFpbik6IElnbm9yZSAnZicgbW9kaWZpZXIgdXNlZCBvbiBIUC9VWCA5LgotCi1UaHUgRGVjIDE1IDE3OjM0OjEyIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogYXIuYywgbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmM6IEluY2x1ZGUgcHJvZ3Jlc3MuaC4KLQkqIGFyLmMsIG5tLmMsIG9iamNvcHkuYywgb2JqZHVtcC5jIChtYWluKTogQWRkIFNUQVJUX1BST0dSRVNTCi0JYW5kIEVORF9QUk9HUkVTUy4KLQkqIGFyLmMgKG1hcF9vdmVyX21lbWJlcnMsIG9wZW5faW5hcmNoKTogQ2FsbCBQUk9HUkVTUy4KLQkqIG5tLmMgKG1haW4sIGRpc3BsYXlfYXJjaGl2ZSwgZmlsdGVyX3N5bWJvbHMsIHByaW50X3N5bWJvbHMpOgotCUNhbGwgUFJPR1JFU1MuCi0KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IEJyZWFrIHVwIGxvbmcgdXNhZ2Ugc3RyaW5nLgotCi1XZWQgRGVjIDE0IDE1OjUxOjU2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBEb24ndCBib3RoZXIgc2V0dGluZyBzdGF0dXMgYWZ0ZXIKLQlub25mYXRhbCgpICJjYWxsIiwgYmVjYXVzZSBpdCB3b24ndCByZXR1cm4uCi0KLUZyaSBEZWMgIDkgMDA6MjI6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IERvbid0IHN3aXRjaCBhIHJlbG9jIHRvIHVzZQotCXRoZSBzZWN0aW9uIHN5bWJvbCBpZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotVGh1IERlYyAgOCAxNDo0NTo1MCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGFkZF9zdHJpcF9zeW1ib2wpOiBDYXN0IHJldHVybiB2YWx1ZSBvZiB4bWFsbG9jLgotCi1XZWQgTm92IDMwIDExOjA1OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AcnRsLmN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IFBhc3MgY3VycmVudC0+ZmlsZW5hbWUgdG8gbm9ybWFsaXplIHdoZW4KLQljaGVja2luZyBmb3IgZHVwbGljYXRlcywgYmVjYXVzZSB0aGUgZmlsZW5hbWUgb2YgYSBuZXdseSBhZGRlZAotCWZpbGUgd2lsbCBub3QgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgeWV0LgotCi1UaHUgTm92IDE3IDE1OjAwOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXIuYyAobWFpbik6IERvbid0IGNhbGwgZG9fcXVpY2tfYXBwZW5kIGlmIGFueSBvZiB0aGUgYXJjaGl2ZQotCW5hbWVzIGFyZSBsb25nZXIgdGhhbiAxNCBjaGFyYWN0ZXJzLgotCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBGaXggaXNfc3RyaXAgdGVzdC4gIEZyb20KLQlwaXJrZXJAZWl1bml4LnR1d2llbi5hYy5hdCAoTWFydGluIFBpcmtlcikuCi0KLVRodSBOb3YgMTcgMTU6Mzc6MTkgMTk5NCAgTWFyayBXLiBFaWNoaW4gIDxlaWNoaW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChhZGRfc3RyaXBfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLCBhZGRzIGEgbmFtZSB0byBhbgotCWV4cGxpY2l0IGxpc3Qgb2Ygc3ltYm9scyB0byBzdHJpcC4KLQkoaXNfc3RyaXBfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLCByZXBvcnRzIHdoZXRoZXIgdGhlIG5hbWUgYXJndW1lbnQKLQlpcyBpbiB0aGUgZXhwbGljaXQgbGlzdC4KLQkoZmlsdGVyX3N5bWJvbHMpOiBDaGVjayBhZ2FpbnN0IGlzX3N0cmlwX3N5bWJvbCBhYm92ZSBhbGwuCi0JKHN0cmlwX21haW4pOiBSZWNvZ25pemUgLU4gb3B0aW9uLiBJZiB1c2VkLCBkb24ndCBkZWZhdWx0IHRvCi0Jc3RyaXBfYWxsLgotCShjb3B5X21haW4pOiBSZWNvZ25pemUgLU4gb3B0aW9uLgotCShzdHJpcF91c2FnZSk6IERvY3VtZW50IC1OIGFuZCAtLXN0cmlwLXN5bWJvbCBvcHRpb25zLgotCShjb3B5X3VzYWdlKTogRGl0dG8uCi0JKiBvYmpjb3B5LjEsIHN0cmlwLjEsIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC1OIGFuZAotCS0tc3RyaXAtc3ltYm9sIG9wdGlvbnMuCi0KLVR1ZSBOb3YgIDggMTM6MTI6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X2xpc3QsIGRpc3BsYXlfaW5mb190YWJsZSk6IFBhc3MgYW4KLQlhcnJheSB0byB0bXBhcmcsIHJhdGhlciB0aGFuIE5VTEwsIHNpbmNlIHNvbWUgc3lzdGVtcyBjYW4ndCBoYW5kbGUKLQlOVUxMLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IEtlZXAgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUKLSAgICAgICAgdGVtcG9yYXJ5IGZpbGVzIHdlIGNyZWF0ZWQuICBDbG9zZSBlYWNoIGlucHV0IEJGRCBhZnRlciB3ZSBvcGVuCi0gICAgICAgIGl0cyBzdWNjZXNzb3IuCi0KLU1vbiBOb3YgIDcgMTU6NDg6MzkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBCdW1wIHRvIDIuNS4zLgotCi1UaHUgTm92ICAzIDE5OjA0OjM0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBJbnN0YWxsIGluZm8gZmlsZXMgZnJvbSB3aGF0ZXZlcgotCWRpcmVjdG9yeSB0aGV5IHdlcmUgZm91bmQgaW4uCi0KLQlQYXRjaCBmcm9tIERKIERlbG9yaWU6Ci0JKiBjb25maWd1cmUuYmF0OiBkbyBjKytmaWx0IC0+IGN4eGZpbHQgcmlnaHQKLQotCSogc3lzaW5mby55OiBJbmNsdWRlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZWFybHksIHNvIGFueSBwb3RlbnRpYWwKLQlkZWNsYXJhdGlvbiBvZiBhYm9ydCgpIG9jY3VycyBiZWZvcmUgaXRzIHVzZS4KLQotCSogc3RyaW5ncy5jIChzdHJpbmdzX2ZpbGUpOiBUcnkgb3BlbmluZyB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZQotCWZpcnN0LgotCi1XZWQgTm92ICAyIDE1OjQ0OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXIuYyAobWFpbik6IFRyZWF0IGFyIHFzIGxpa2UgYXIgcnMuCi0KLVR1ZSBPY3QgMjUgMTY6MTk6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGdhcF9maWxsKTogRXhwbGljaXRseSBpbml0aWFsaXplLCBmb3IgY2xhcml0eS4KLQkocGFkX3RvX3NldCwgcGFkX3RvKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGNvcHlfb3B0aW9ucyk6IEFjY2VwdCAtLXBhZC10by4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1wYWQtdG8uCi0JKGNvcHlfb2JqZWN0KTogU3VwcG9ydCAtLXBhZC10by4KLQkoY29tcGFyZV9zZWN0aW9uX3ZtYSk6IFNvcnQgbm9uIGxvYWRhYmxlIHNlY3Rpb25zIHRvIHRoZSBmcm9udC4KLQlTb3J0IHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgVk1BIGJ5IHNpemUuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtLXBhZC10by4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1wYWQtdG8uCi0KLVRodSBPY3QgMjAgMTM6NTE6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGdhcF9maWxsX3NldCwgZ2FwX2ZpbGwpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoY29weV9vcHRpb25zKTogQWNjZXB0IC0tZ2FwLWZpbGwuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tZ2FwLWZpbGwuCi0JKGNvcHlfb2JqZWN0KTogU3VwcG9ydCAtLWdhcC1maWxsLgotCShnZXRfc2VjdGlvbnMsIGNvbXBhcmVfc2VjdGlvbl92bWEpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tZ2FwLWZpbGwuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tZ2FwLWZpbGwuCi0KLVdlZCBPY3QgMTkgMTQ6MDk6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBBZGQgYSBkdW1teSBlbHNlIGNsYXVzZSB0byB0aGUgaWYKLQlzdGF0ZW1lbnQuCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBSZW1vdmUgc3BlY2lhbCBtZW50aW9uIG9mIC0tc2V0LXN0YXJ0Ci0JYW5kIGBiaW5hcnknIG91dHB1dCBmb3JtYXQuCi0KLVR1ZSBPY3QgMTggMTE6MTI6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogSWYgdGhlIG91dHB1dCBmaWxlIGZvcm1hdCBpcyBgYmluYXJ5JywKLQlhbmQgdGhlIHN0YXJ0IGFkZHJlc3Mgd2FzIG5vdCBzZXQgdXNpbmcgLS1zZXQtc3RhcnQsIGRlZmF1bHQgdGhlCi0Jc3RhcnQgYWRkcmVzcyB0byB6ZXJvLiAgVGhpcyBoYWNrIGlzIGJlY2F1c2UgdGhlIGBiaW5hcnknIG91dHB1dAotCWZpbGUgZm9ybWF0IHVzZXMgdGhlIHN0YXJ0IGFkZHJlc3MgdG8gc2V0IHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YKLQl0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgZmlsZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogQWRkIHNvbWUgbm90ZXMgb24gZ2VuZXJhdGluZyBTLXJlY29yZHMKLQlhbmQgYmluYXJ5IGZpbGVzLgotCi0JKiBubS5jIChwcmludF9zeW1kZWZfZW50cnkpOiBDYWxsIHByaW50X3N5bW5hbWUgdG8gcHJpbnQgdGhlCi0Jc3ltYm9sIG5hbWUsIHNvIHRoYXQgLS1kZW1hbmdsZSB3b3Jrcy4KLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIHRtcGRpci4KLQotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogQWRkIGZpZWxkcyB1c2VkLCBhZGp1c3QsIHZhbC4KLQkoYWRqdXN0X3N0YXJ0LCBzZXRfc3RhcnRfc2V0LCBzZXRfc3RhcnQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoYWRqdXN0X3NlY3Rpb25fdm1hLCBhZGp1c3Rfc2VjdGlvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoY29weV9vcHRpb25zKTogQWRkIC0tYWRqdXN0LXN0YXJ0LCAtLWFkanVzdC12bWEsCi0JLS1hZGp1c3Qtc2VjdGlvbi12bWEsIC0tYWRqdXN0LXdhcm5pbmdzLCAtLW5vLWFkanVzdC13YXJuaW5ncywKLQktLXNldC1zdGFydC4KLQkocGFyc2Vfdm1hKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gbmV3IG9wdGlvbnMuCi0JKGNvcHlfb2JqZWN0KTogSGFuZGxlIC0tc2V0LXN0YXJ0IGFuZCAtLWFkanVzdC1zdGFydC4KLQkoc2V0dXBfc2VjdGlvbik6IENvcnJlY3QgdHlwZSBvZiBsYXN0IGFyZ3VtZW50IHRvIFBUUi4gIFNldCB1c2VkCi0JZmllbGQgaWYgc2VjdGlvbiBpcyByZW1vdmVkLiAgSGFuZGxlIC0tYWRqdXN0LXZtYSBhbmQKLQktLWFkanVzdC1zZWN0aW9uLXZtYS4KLQkoY29weV9zZWN0aW9uKTogQ29ycmVjdCB0eXBlIG9mIGxhc3QgYXJndW1lbnQgdG8gUFRSLgotCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IExpa2V3aXNlLgotCShzdHJpcF9tYWluKTogQ2xlYXIgdXNlZCBmaWVsZCB3aGVuIGhhbmRsaW5nIC1SLgotCShjb3B5X21haW4pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0JKiBiaW51dGlscy50ZXhpIChvYmpjb3B5KTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0JKiBvYmpjb3B5LjE6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi1GcmkgT2N0IDE0IDE0OjM4OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogUmVtb3ZlIGRlZmluaXRpb24tLXRlc3RzdWl0ZSBpcyBubwotCWxvbmdlciBjb25maWd1cmVkLgotCSogTWFrZWZpbGUuaW4gKHRlc3RzdWl0ZSk6IFJlbW92ZSB0YXJnZXQuCi0JKHNpdGUuZXhwKTogTmV3IHRhcmdldC4KLQkoY2hlY2spOiBSZXdyaXRlLgotCShjbGVhbiwgZGlzdGNsZWFuKTogRG9uJ3QgcmVjdXIgaW50byB0ZXN0c3VpdGUgZGlyZWN0b3J5LgotCi1UaHUgT2N0IDEzIDE5OjI0OjA5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byAyLjUuCi0JKiBWZXJzaW9uIDIuNSByZWxlYXNlZC4KLQotVHVlIE9jdCAxMSAxNToyNjo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzeXNkdW1wLm8pOiBEZXBlbmRzIHVwb24gc3lzcm9mZi5jLgotCi1Nb24gT2N0IDEwIDEzOjUwOjMwIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChsaW5rX2lucHV0cyk6IFBhc3MgLVVyIGZsYWcgdG8gbGQgc28gdGhhdCB0aGUKLQkgIGN0b3IvZHRvciB0YWJsZXMgbmVlZGVkIGJ5IEMrKyBwcm9ncmFtcyBhcmUgYnVpbHQuCi0KLVN1biBPY3QgIDkgMTg6MDQ6MDAgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3Jjb252Lm8pOiBBZGQgZGVwZW5kZW5jZSBvbiBzeXNyb2ZmLmMuCi0KLVR1ZSBPY3QgIDQgMTI6MTk6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nIGNvbmZpZy5iZmQuCi0KLQkqIE1ha2VmaWxlLmluIChzeXNyb2ZmLmgpOiBTcGxpdCB0YXJnZXQgYXdheSBmcm9tIHN5c3JvZmYuYy4KLQkoc3Jjb252Lm8sIHN5c2R1bXAubyk6IE5ldyB0YXJnZXRzLgotCShzcmNvbnYsIHN5c2R1bXApOiBEb24ndCBkZXBlbmQgdXBvbiBzeXNyb2ZmLmMuCi0KLVdlZCBTZXAgMjggMTM6MDQ6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXJwYXJzZS5jKTogRG9uJ3QgaWdub3JlIGVycm9ycyBmcm9tIG12LgotCShzeXNpbmZvLmMpOiBMaWtld2lzZS4gIEFsc28sIGRlcGVuZCB1cG9uIGFycGFyc2UuYywgdG8gcHJldmVudCBhCi0JcGFyYWxsZWwgbWFrZSBmcm9tIHRyeWluZyB0byBidWlsZCBib3RoIGFycGFyc2UuYyBhbmQgc3lzaW5mby5jCi0Jc2ltdWx0YW5lb3VzbHkuCi0JKG5sbWhlYWRlci5jKTogU2ltaWxhciBjaGFuZ2UuCi0JKGFycGFyc2UuaCk6IFNlcGFyYXRlIHRhcmdldCBmcm9tIGFycGFyc2UuYywgc28gdGhhdCBhIHBhcmFsbGVsCi0JbWFrZSBkb2VzIG5vdCB0cnkgdG8gYnVpbGQgYm90aCBhdCBvbmNlLiAgRGVwZW5kIHVwb24gYXJwYXJzZS5jLgotCShzeXNpbmZvLmgpOiBTaW1pbGFyIGNoYW5nZS4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogUGFzcyB0aGUgcmVsb2MgYnVmZmVyIHRvIGZyZWUsIG5vdAotCXRoZSBwb2ludGVyIHVzZWQgdG8gbG9vcCBvdmVyIHRoZSByZWxvY3MuCi0KLVNhdCBTZXAgMjQgMTY6MTY6NTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYXN0IHJlc3VsdCBvZiB4bWFsbG9jLgotCi1XZWQgU2VwIDIxIDE5OjMwOjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzb3J0ZWRfc3ltcywgc29ydGVkX3N5bWNvdW50KTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFVzZSBzb3J0ZWRfc3ltcyBhbmQgc29ydGVkX3N5bWNvdW50Ci0JaW5zdGVhZCBvZiBzeW1zIGFuZCBzeW1jb3VudC4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGJvdGhlciB0byBnZXQgdGhlIHJlbG9jcyBiZWZvcmUgbG9vcGluZwotCW92ZXIgdGhlIHNlY3Rpb25zLiAgQmVmb3JlIGZpbHRlcmluZyBhbmQgc29ydGluZyB0aGUgc3ltYm9sIHRhYmxlLAotCWNvcHkgaXQgaW50byBzb3J0ZWRfc3ltcy4KLQotRnJpIFNlcCAxNiAxMToyNzozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8pOiBBZGQgZmllbGQgcmVxdWlyZV9zZWMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IElmIGF1eC0+cmVxdWlyZV9zZWMsIHJlcXVpcmUgdGhhdCB0aGUKLQlzeW1ib2wgYmUgaW4gYXV4LT5zZWMgZXZlbiBpZiBIQVNfUkVMT0MgaXMgbm90IHNldC4gIElmIHdlIGNhbid0Ci0JZmluZCBhIHNtYWxsZXIgc3ltYm9sIGluIHRoZSByaWdodCBzZWN0aW9uLCBsb29rIGZvciBhIGxhcmdlciBvbmUuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgYXV4LnJlcXVpcmVfc2VjIGFyb3VuZCB0aGUKLQlvYmpkdW1wX3ByaW50X2FkZHJlc3MgY2FsbCBmb3IgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MuCi0KLVRodSBTZXAgMTUgMjE6NDM6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhci5jOiBDYWxsIHhleGl0IHJhdGhlciB0aGFuIGV4aXQuCi0JKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X2ZpbGUsIG91dHB1dF9iZmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkocmVtb3ZlX291dHB1dCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1haW4pOiBDYWxsIHhhdGV4aXQgKHJlbW92ZV9vdXRwdXQpLiAgQ2FsbCB4ZXhpdCByYXRoZXIgdGhhbgotCXJldHVybmluZy4KLQkoZXh0cmFjdF9maWxlKTogU2V0IG91dHB1dF9maWxlbmFtZSBhbmQgb3V0cHV0X2ZpbGUgd2hpbGUgb3V0cHV0Ci0JZmlsZSBpcyBvcGVuLgotCSh3cml0ZV9hcmNoaXZlKTogTGlrZXdpc2UsIGJ1dCB1c2Ugb3V0cHV0X2JmZCwgbm90IG91dHB1dF9maWxlLgotCSogYXJzdXAuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4gIENhbGwgeGV4aXQgcmF0aGVyIHRoYW4gZXhpdC4KLQkqIGJ1Y29tbS5jOiBMaWtld2lzZS4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9hbGwpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCSh1c2FnZSk6IERvY3VtZW50IC0tZGlzYXNzZW1ibGUtYWxsLgotCShsb25nX29wdGlvbnMpOiBBZGQgZGlzYXNzZW1ibGUtYWxsIGFzIGEgc3lub255bSBmb3IgLUQuCi0JKGNvbXBhcmVfc3ltYm9scyk6IE1ha2UgcG9pbnRlcnMgY29uc3QuCi0JKGNvbXBhcmVfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFJlbmFtZSBkaXNhc3NlbWJsZSB0byBkaXNhc3NlbWJsZV9mbiB0byBhdm9pZAotCXNoYWRvd2luZy4gIElmIGR1bXBfcmVsb2NfaW5mbywgcHJpbnQgcmVsb2NzIGFsb25nIHdpdGgKLQlkaXNhc3NlbWJseS4gIFNraXAgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBTRUNfQ09ERSB1bmxlc3MKLQlkaXNhc3NlbWJsZV9hbGwgb3Igb25seSBpcyBzZXQuCi0JKGRpc3BsYXlfYmZkKTogRG9uJ3QgY2FsbCBkdW1wX3JlbG9jcyBpZiBkaXNhc3NlbWJsZSBpcyBzZXQuCi0JKG1haW4pOiBBY2NlcHQgYW5kIGhhbmRsZSAtRC4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC1ELy0tZGlzYXNzZW1ibGUtYWxsLgotCSogb2JqZHVtcC4xOiBMaWtld2lzZS4KLQotV2VkIFNlcCAxNCAxMjoxOTowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEluaXRpYWxpemUgcHJldmxpbmUgdG8gMC4gIE1ha2UKLQlwcmV2X2Z1bmN0aW9uIG5vbiBjb25zdC4gIENvcHkgZnVuY3Rpb25uYW1lIGludG8gYW4gbWFsbG9jIGJ1ZmZlcgotCXdoZW4gc2V0dGluZyBwcmV2X2Z1bmN0aW9uLCBpbnN0ZWFkIG9mIGFzc3VtaW5nIHRoYXQgdGhlIHN0cmluZwotCXdpbGwgbGFzdCBmb3JldmVyLgotCi0JKiBubS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShzb3J0X2J5X3NpemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGQgLS1zaXplLXNvcnQuCi0JKHVzYWdlKTogTWVudGlvbiAtLXNpemUtc29ydC4KLQkobnVtZXJpY19mb3J3YXJkKTogTWFrZSBzdGF0aWMuICBDaGFuZ2UgZnJvbSB2b2lkICogdG8gUFRSLgotCShudW1lcmljX3JldmVyc2UpOiBMaWtld2lzZS4KLQkobm9uX251bWVyaWNfZm9yd2FyZCwgbm9uX251bWVyaWNfcmV2ZXJzZSk6IExpa2V3aXNlLgotCShzb3J0ZXJzKTogQ2hhbmdlIGRlY2xhcmF0aW9uIGZyb20gdm9pZCAqIHRvIFBUUi4KLQkoc2l6ZV9mb3J3YXJkLCBzb3J0X3N5bWJvbF9ieV9zaXplKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBIYW5kbGUgc29ydF9ieV9zaXplLgotCShmaWx0ZXJfc3ltYm9scyk6IElmIHNvcnRfYnlfc2l6ZSwgZGlzY2FyZCBhYnNvbHV0ZSBhbmQgdW5kZWZpbmVkCi0Jc3ltYm9scy4KLQkqIGJpbnV0aWxzLnRleGkgKG5tKTogRG9jdW1lbnQgLS1zaXplLXNvcnQuCi0JKiBubS4xOiBEb2N1bWVudCAtLXNpemUtc29ydC4KLQotVHVlIFNlcCAxMyAyMTowNjowNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqY29weS5jIChjb3B5X21haW4pOiBJbml0aWFsaXplIGlucHV0X2ZpbGVuYW1lIGFuZAotCW91dHB1dF9maWxlbmFtZSB0byBOVUxMLgotCi1UdWUgU2VwIDEzIDE0OjE3OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHZlcnNpb24ubyk6IERlcGVuZCB1cG9uIE1ha2VmaWxlLCBzbyB0aGF0IHZlcnNpb24ubwotCWdldHMgcmVidWlsdCB3aGVuIG1ha2UgdmFyaWFibGUgVkVSU0lPTiBpcyBjaGFuZ2VkLgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBQcmludCB0aGUgU0VDX05FVkVSX0xPQUQgZmxhZy4KLQotV2VkIEF1ZyAyNCAxMjo0MDowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLVR1ZSBBdWcgMjMgMTE6MDA6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhci5jIChyYW5saWJfdG91Y2gpOiBEb24ndCB1cGRhdGUgdGhlIGFyY2hpdmUgbWFwIGlmIHRoZXJlIGlzbid0Ci0Jb25lLgotCi1Nb24gQXVnIDIyIDE2OjAyOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYXIuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoaW5hcmNoKTogUmVtb3ZlIHZhcmlhYmxlLgotCShtYXBfb3Zlcl9tZW1iZXJzKTogTWFrZSBzdGF0aWMuICBBZGQgYXJjaCBhcmd1bWVudCwgYW5kIHVzZSBpdAotCWluc3RlYWQgb2YgaW5hcmNoLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShtYWluKTogVHJlYXQgLS12ZXJzaW9uIGFzIC12LiAgQWNjZXB0IC10IGFyZ3VtZW50LiAgQWNjZXB0IGFueQotCW51bWJlciBvZiBhcmNoaXZlIGFyZ3VtZW50cy4gIENhdGNoIGFuZCB1c2Ugb3Blbl9pbmFyY2ggcmV0dXJuCi0JdmFsdWUsIHJhdGhlciB0aGFuIHVzaW5nIGluYXJjaC4KLQkob3Blbl9pbmFyY2gpOiBSZXR1cm4gbmV3bHkgb3BlbmVkIEJGRCwgcmF0aGVyIHRoYW4gdXNpbmcgaW5hcmNoLgotCShkb19xdWlja19hcHBlbmQpOiBNYWtlIGFyY2hpdmVfZmlsZW5hbWUgY29uc3QuCi0JKHdyaXRlX2FyY2hpdmUpOiBBZGQgaWFyY2ggYXJndW1lbnQsIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBpbmFyY2guCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShkZWxldGVfbWVtYmVycywgbW92ZV9tZW1iZXJzLCByZXBsYWNlX21lbWJlcnMpOiBMaWtld2lzZS4KLQkocmFubGliX29ubHkpOiBEb24ndCBleGl0IG9uIHN1Y2Nlc3MuICBDYXRjaCBhbmQgdXNlIG9wZW5faW5hcmNoCi0JcmV0dXJuIHZhbHVlLgotCShyYW5saWJfdG91Y2gpOiBOZXcgZnVuY3Rpb24uCi0JKiBhcnN1cC5oIChtYXBfb3Zlcl9tZW1iZXJzKTogRG9uJ3QgZGVjbGFyZS4KLQkoYXJfZW5kLCBhcl9leHRyYWN0KTogRGVjbGFyZS4KLQkob3Blbl9pbmFyY2gpOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGluIGRlY2xhcmF0aW9uIHRvIGJmZCAqLgotCSogYXJzdXAuYyAobWFwX292ZXJfbGlzdCk6IE1ha2Ugc3RhdGljLiBBbHdheXMgcGFzcyB0d28gYXJndW1lbnRzCi0JdG8gZnVuY3Rpb24uICBBZGQgYXJjaCBhcmd1bWVudCwgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGluYXJjaC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGFyX2RpcmVjdG9yeV9kb2VyKTogTWFrZSBzdGF0aWMuICBBZGQgaWdub3JlZCBzZWNvbmQgYXJndW1lbnQuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShhcl9kaXJlY3RvcnkpOiBVc2Ugb3Blbl9pbmFyY2ggcmV0dXJuIHZhbHVlIHJhdGhlciB0aGFuIGluYXJjaC4KLQkoYXJfYWRkbGliX2RvZXIpOiBNYWtlIHN0YXRpYy4KLQkoYXJfYWRkbGliKTogVXNlIG9wZW5faW5hcmNoIHJldHVybiB2YWx1ZSByYXRoZXIgdGhhbiBpbmFyY2guCi0JKGFyX2V4dHJhY3QpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGFiZmQuCi0KLVRodSBBdWcgMTEgMTQ6NTU6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JQWRkIHN1cHBvcnQgZm9yIHJlbW92aW5nIG5hbWVkIHNlY3Rpb25zIHRvIG9iamNvcHkgYW5kIHN0cmlwLgotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogRGVmaW5lLgotCShyZW1vdmVfc2VjdGlvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzdHJpcF9vcHRpb25zLCBjb3B5X29wdGlvbnMpOiBBZGQgcmVtb3ZlLXNlY3Rpb24uCi0JKGNvcHlfdXNhZ2UsIHN0cmlwX3VzYWdlKTogTWVudGlvbiAtUiBhbmQgLS1yZW1vdmUtc2VjdGlvbi4KLQkoc2V0dXBfc2VjdGlvbik6IElmIHNlY3Rpb24gaXMgaW4gcmVtb3ZlX3NlY3Rpb25zIGxpc3QsIGlnbm9yZSBpdC4KLQkoY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IEhhbmRsZSAtUi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMSwgc3RyaXAuMTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLVdlZCBBdWcgMTAgMTA6MTk6NTUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IFJlbmFtZSBzeW12YWx1ZSB0byBzeW1fdmFsdWUsCi0Jc28gYXMgbm90IHRvIGNvbmZsaWN0IHdpdGggdGhlIHN5bXZhbHVlIHR5cGVkZWYgaW4gYmZkLmguCi0KLU1vbiBBdWcgIDEgMTM6MTk6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueTogUGVyIGN1cnJlbnQgTmV0V2FyZSBkb2NzLCBhY2NlcHQgYSByZXZpc2lvbiBudW1iZXIKLQlvZiAwIGFuZCB0cmVhdCBhIHJldmlzaW9uIG51bWJlciBncmVhdGVyIHRoYW4gMjYgYXMgMC4KLQotTW9uIEp1bCAyNSAxMjo1ODozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ29ycmVjdCBoYW5kbGluZyBvZiBlbmQgb2YKLQlzeW1ib2xzIHdoZW4gbG9va2luZyBmb3IgbmV4dCBzeW1ib2wgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4KLQotRnJpIEp1bCAyMiAxNjo0ODozNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBubS5jIChudW1lcmljX2ZvcndhcmQpOiBUcmVhdCB1bmRlZmluZWQgc3ltYm9scyBhcyAibGVzcyB0aGFuIgotCWRlZmluZWQgc3ltYm9scyB3aXRoIHplcm8gdmFsdWVzLiAgSWYgbnVtZXJpYyB2YWx1ZXMgYXJlIGVxdWFsLCBvcgotCWJvdGggc3ltYm9scyBhcmUgdW5kZWZpbmVkLCBzb3J0IGFscGhhYmV0aWNhbGx5LiAgRG9uJ3QgYXNzdW1lCi0JdGhhdCB0aGUgZGlmZmVyZW5jZSBvZiB0d28gYmZkX3ZtYSB2YWx1ZXMgd2lsbCB0cnVuY2F0ZSB0byAiaW50IgotCWFuZCBzdGlsbCBoYXZlIHRoZSBzYW1lIHNpZ24uCi0JKG51bWVyaWNfcmV2ZXJzZSk6IENhbGwgbnVtZXJpY19mb3J3YXJkIGFuZCBuZWdhdGUgdGhlIHJlc3VsdC4KLQkocHJpbnRfc3ltYm9sX2luZm9fYnNkKTogRm9yIHVuZGVmaW5lZCBzeW1ib2xzLCBwcmludCBsZWFkaW5nCi0Jc3BhY2VzIGVxdWl2YWxlbnQgdG8gdGhlIHdpZHRoIG9mIGEgcHJpbnRlZCBiZmRfdm1hLCByYXRoZXIgdGhhbgotCWFzc3VtaW5nIHRoYXQgOCB3aWxsIGxvb2sgcmlnaHQuCi0KLUZyaSBKdWwgMjIgMTA6MzY6NTAgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZmdyb2suYyAoZG9pdCk6ICBaZXJvIGFsbCBmaWVsZHMgb2YgbmV3IHN0cnVjdHVyZS4KLQkqIHNyY29udi5jIChzeXNyb2ZmX3N3YXBfKl9vdXQpOiBSZW1vdmUgcmVkdW5kYW50IHRyYWlsaW5nIGFyZy4KLQkqIHN5c2luZm8ueTogR2VuZXJhdGUgc3lzcm9mZl9zd2FwXypfb3V0IHdpdGhvdXQgcmVxdWlyaW5nIGV4dHJhCi0JYXJnLgotCi1GcmkgSnVsIDIyIDEwOjA5OjUzIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbmxtaGVhZGVyLnk6IE1ha2UgInN0YWNrIiBhbmQgInN0YWNrc2l6ZSIgc3lub255bXMgaW4gdGhlIGxleGVyCi0JICByYXRoZXIgdGhhbiB0aGUgcGFyc2VyLgotCi1UaHUgSnVsIDIxIDEwOjI1OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFscGhhb3NmLCBjb25maWcvbWgtYXBvbGxvNjh2LCBjb25maWcvbWgtZGVsdGE4ODoKLQlSZW1vdmU7IG9ic29sZXRlLgotCi1TYXQgSnVsIDE2IDIyOjM0OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzbHVycF9keW5hbWljX3N5bXRhYik6IFRyeSB0byBnZXQgdGhlIGR5bmFtaWMgc3ltYm9scwotCWV2ZW4gaWYgdGhlIGJmZCBpcyBub3QgbWFya2VkIERZTkFNSUMuICBFTEYgZXhlY3V0YWJsZXMgYXJlIG5vdAotCW1hcmtlZCBEWU5BTUlDLCBidXQgZG8gaGF2ZSBkeW5hbWljIHN5bWJvbHMuCi0KLUZyaSBKdWwgMTUgMDE6NDE6MzUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZmdyb2suYyAoZG9fd2hlcmUpOiBNYWtlIGRhdGEgd2l0aCBubyB0eXBlICdpbnQnLgotCShkb19kZWZpbmUpOiAgS2VlcCBpbmZvIG9uIHNvdXJjZSBmaWxlIG9mIGEgc3ltYm9sLgotCSogY29mZmdyb2suaCAoY29mZl9zeW1ib2wpOiBOZXcgZmllbGQuCi0JKiBzcmNvbnYuYyAoUFJPR1JBTV9WRVJTSU9OKTogTm93IDEuMwotCSh3cl9ybCk6IFVzZSBleHRlcm5hbCByZWYgbnVtYmVyIGZvciBzeW1ib2wuCi0JKHdyX2R1cyk6IE9ubHkga2VlcCBvbmUgc291cmNlIGZpbGUgcGVyIGRlYnVnIHVuaXQuCi0JKHdyX2Rsbik6IEFsd2F5cyBlbWl0IGxpbmUgbnVtYmVycyBmb3IgZmlyc3Qgc291cmNlIGZpbGUsCi0JKHdyX2dsb2JhbHMpOiAgRW1pdCBnbG9iYWxzIGluIHRoZSBkdSBvZiB0aGVpciBvd25pbmcgc291cmNlIGZpbGUuCi0KLU1vbiBKdWwgMTEgMTU6NTk6MDMgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueTogTnVsbCB0ZXJtaW5hdGUgdmFyX2hkci0+dGhyZWFkTmFtZS4KLQotRnJpIEp1bCAgOCAxNzozMzoyMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3lzbGV4Lm8sIHN5c2luZm8ubyk6IFBlcm1pdCBDIHNvdXJjZSBmaWxlcyB0byBiZQotCWluICQoc3JjZGlyKSwgYXMgdGhleSB3aWxsIGJlIGZvciBGU0YgcmVsZWFzZXMuCi0KLVdlZCBKdWwgIDYgMDE6MTM6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHNldHVwX3NlY3Rpb25zKTogUHJlc2VydmUgZXhpc3Rpbmcgc2VjdGlvbiBmbGFncyB3aGVuCi0JY29weWluZyBpbiBmbGFncyBmcm9tIGEgbmV3IHNlY3Rpb24uCi0KLVR1ZSBKdWwgIDUgMTU6NTY6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGNvcHlfZmlsZSk6IElmIG91dHB1dF90YXJnZXQgaXMgTlVMTCwgc2V0IGl0IHRvIHRoZSB0YXJnZXQgb2YgdGhlCi0JaW5wdXQgZmlsZS4KLQotV2VkIEp1biAyOSAxNzoxNzoxNCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobGlua19pbnB1dHMpOiBGaXhlZCBtZW1vcnkgYWxsb2NhdGlvbiBidWcuCi0KLVRodSBKdW4gMjMgMTI6NTI6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgotCi1UdWUgSnVuIDIxIDEyOjUzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN5c2luZm8pOiBEb2VzIG5vdCBkZXBlbmQgdXBvbiAkKEFERExfTElCUykuCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19idWlsZF9zdHVicyk6IERvbid0IGdlbmVyYXRlIHRoZSBQb3dlclBDCi0JTmV0V2FyZSBjdXN0b20gaGVhZGVyOyBubyBsb25nZXIgbmVlZGVkLgotCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBDb252ZXJ0IHJlbG9jcyBhZ2FpbnN0IHRoZSB1bmluaXRpYWxpemVkCi0JZGF0YSBzZWN0aW9uIGludG8gcmVsb2NzIGFnYWluc3QgdGhlIGRhdGEgc2VjdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBTZXQgbmxtY29udl9kZWZzIHRvIC1ETkxNQ09OVl9jcHV0eXBlIGZvciBhbGwgdGhlCi0JbmV0d2FyZSB0YXJnZXRzLiAgV3JpdGUgaXQgaW50byBNYWtlZmlsZSBhcyBOTE1DT05WX0RFRlMuCi0JKiBNYWtlZmlsZS5pbiAobmxtY29udi5vKTogUGFzcyAkKE5MTUNPTlZfREVGUykgdG8gJChDQykuCi0JKiBubG1jb252LmM6IE9ubHkgY29tcGlsZSBjb2RlIGZvciBzcGVjaWZpYyBDUFUgdHlwZXMgaWYKLQlOTE1DT05WX2NwdXR5cGUgaXMgZGVmaW5lZC4KLQotCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIHVzZXMgb2YgYmZkX2Fic19zZWN0aW9uLCBldGMuLCB0byB1c2UKLQliZmRfYWJzX3NlY3Rpb25fcHRyIG9yIGJmZF9pc19hYnNfc2VjdGlvbiwgZXRjLgotCShpMzg2X21hbmdsZV9yZWxvY3MsIGFscGhhX21hbmdsZV9yZWxvY3MpOiBMaWtld2lzZS4KLQkocG93ZXJwY19idWlsZF9zdHVicyk6IExpa2V3aXNlLgotCSogbm0uYyAoZmlsdGVyX3N5bWJvbHMsIHByaW50X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scywgZHVtcF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIHNpemUuYyAoc3lzdl9pbnRlcm5hbF9wcmludGVyKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMjAgMTY6NDM6MDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1BTlBBR0VTKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLgotCShpbnN0YWxsKTogSW5zdGFsbCBpdCBleHBsaWNpdGx5LCBmcm9tIGJ1aWxkIGRpciwgbm90IHNyY2Rpci4KLQotTW9uIEp1biAyMCAxNjoyOTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogRG9uJ3QgaW5jbHVkZSBlbGYvaW50ZXJuYWwuaC4KLQkoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBEb24ndCBkZWNsYXJlLgotCShyZWFkX3NlY3Rpb25fc3RhYnMpOiBObyBzcGVjaWFsIGhhbmRsaW5nIGZvciBFTEYuICBBbHdheXMgcmVhZAotCXVzaW5nIEJGRCBzZWN0aW9ucy4KLQotVGh1IEp1biAxNiAxNzoyNToyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IFVOREVSU0NPUkUgaW4gTWFrZWZpbGUgYmFzZWQgb24gcmVzdWx0IG9mCi0JaW52b2tpbmcgY29uZmlnLmJmZCB3aXRoIGEgc2Vjb25kIGFyZ3VtZW50IG9mIGBgXycnLgotCSogTWFrZWZpbGUuaW4gKHVuZGVyc2NvcmUuYyk6IERlcGVuZCB1cG9uIE1ha2VmaWxlLiAgRG9uJ3QgdHJ5IHRvCi0JcnVuICQoQ0MpIGFuZCAkKE5NKSwganVzdCB1c2UgJChVTkRFUlNDT1JFKS4gIENyZWF0ZSB2aWEgdGVtcG9yYXJ5Ci0JZmlsZS4KLQkoZGVtYW5nbGUubyk6IFJlbW92ZSB0YXJnZXQuCi0JKCQoTk1fUFJPRykpOiBEb24ndCBkZXBlbmQgdXBvbiBkZW1hbmdsZS5vLCBhbmQJZG9uJ3QgbGluayBhZ2FpbnN0Ci0JZGVtYW5nbGUuby4gIEl0J3MgaW4gbGliaWJlcnR5IGFueWhvdy4KLQkoY3BsdXMtZGVtLm8pOiBEb24ndCBkZXBlbmQgdXBvbiBkZW1hbmdsZS5vLgotCSogYmludXRpbHMudGV4aTogTWVudGlvbiAtbiBhbmQgLS1uby1zdHJpcC11bmRlcnNjb3JlcyBhcmd1bWVudHMKLQl0byBjKytmaWx0LgotCi1XZWQgSnVuIDE1IDEyOjEwOjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbm0uYyAobG9uZ19vcHRpb25zKTogQWRkIC0tbm8tZGVtYW5nbGUgdG8gdHVybiBvZmYgLS1kZW1hbmdsZSwKLQlhbmQgLS1uby1jcGx1cyBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tbm8tZGVtYW5nbGUuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCAtLW5vLWRlbWFuZ2xlLgotCi1GcmkgSnVuIDEwIDE1OjQxOjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogSE9TVF82NF9CSVQgd2FzIHJlbmFtZWQgdG8gQkZEX0hPU1RfNjRfQklULgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IE1ha2UgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gdGhlCi0Jc2FtZSBkaXJlY3RvcnkgYXMgdGhlIG91dHB1dCBCRkQsIHNpbmNlIHdlIG1heSBub3QgaGF2ZSB3cml0ZQotCXBlcm1pc3Npb24gb24gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUKLQluZXcgZGlyZWN0b3J5IHRvIDA3MDAsIG5vdCAwNzc3LgotCi1Nb24gSnVuICA2IDIxOjM2OjQzIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBpZiB0aGlzIGlzIGFuIHJzNjAwMCAoYW5kIHdlJ3JlIG5vdCBidWlsZGluZyBmb3IKLQlhbnkgb3RoZXIgYmZkIHRhcmdldHMpIHRoZW4gYnVpbGQgb25seSBubSAoY29sbGVjdCBuZWVkcyBpdCBvbgotCXJzNjAwMC1seW54KS4KLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBUT09MX1BST0dTIHdoaWNoIHRoZSBsaXN0IG9mIHByb2dyYW1lcyB0bwotCWluc3RhbGwgaW4gJHRvb2xkaXIgLS0gcmVwbGFjZXMgYSBoYXJkLWNvZGVkIGxpc3QuCi0KLUZyaSBKdW4gIDMgMTA6NTk6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG9rLgotCi1UaHUgTWF5IDI2IDE4OjA1OjUyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1hbHBoYW9zZiAoQ0ZMQUdTKTogRG9uJ3Qgc3BlY2lmeSBib3RoIC1nIGFuZCAtTzsKLQl0aGV5J3JlIG5vdCBjb21wYXRpYmxlIHVuZGVyIG5hdGl2ZSBjYy4gIFVzZSAtTzEgaW5zdGVhZC4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIGN5Z251cy0yLjQuMS4KLQotCUNoYW5nZXMgZnJvbSBiaW51dGlscy0yLjQgbmV0IHJlbGVhc2U6Ci0KLQkqIE1ha2VmaWxlLmluIChNQU5QQUdFUyk6IFVzZSAkKERFTUFOR0xFUl9QUk9HKS4KLQkoJChERU1BTkdMRVJfUFJPRykuMSk6IEJ1aWxkIGZyb20gY3h4ZmlsdC5tYW4sIHVzaW5nIHNlZC4KLQkqIGN4eGZpbHQubWFuOiBSZW5hbWVkIGZyb20gYysrZmlsdC4xLCByZXBsYWNlZCAiYysrZmlsdCIgd2l0aAotCW1hZ2ljIHRva2VuIHRvIGJlIHJlcGxhY2VkIGJ5IHNlZC4KLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgZm9yIGxhdGVzdCBtYWtlZmlsZS5pbgotCi1GcmkgTWF5IDEzIDIzOjI1OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmM6IENoZWNrIEFOU0lfUFJPVE9UWVBFUyByYXRoZXIgdGhhbiBfX1NURENfXy4KLQotVHVlIE1heSAxMCAxODoyMjowNiAxOTk0ICBKYXNvbiBNb2xlbmRhICAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChjb3B5X3NlY3Rpb24pOiBTZXQgc2VjdGlvbiBzaXplIGNvcnJlY3RseSBpZiB1c2luZwotCWludGVybGVhdmUuCi0KLVNhdCBNYXkgIDcgMTY6NDk6MzYgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlIGZvciBzeXNpbmZvLmgKLQotRnJpIE1heSAgNiAxMjoxODozMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoU1JDT05WX1BST0cpOiBEZWZpbmUuCi0JKFBST0dTKTogVXNlICQoU1JDT05WX1BST0cpIHRvby4KLQotVGh1IE1heSAgNSAxOTo0MTo0MyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIHN5c2luZm8uYywgc3lzbGV4LmMsIGluIGNhc2UKLQlzb21lb25lIGNvbmZpZ3VyZXMgd2l0aCBgdGFyZ2V0cz1hbGwnLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgeS4qLgotCShzeXNsZXgubyk6IERlcGVuZCBvbiBzeXNpbmZvLmguCi0JKHN5c2luZm8uYyk6IFJlbmFtZSB5LnRhYi5oIHRvIHN5c2luZm8uaC4KLQkoaW5zdGFsbC1pbmZvKTogRG9uJ3QgdHJ5IHRvIGluc3RhbGwgaW50byAkKGluZm9kaXIpLyQoc3JjZGlyKS4KLQkqIHN5c2xleC5sOiBJbmNsdWRlIHN5c2luZm8uaCwgbm90IHkudGFiLmguCi0KLVRodSBNYXkgIDUgMTE6NTA6NTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHN5c2xleC5sICh5eXdyYXApOiBEZWZpbmUgYXMgZnVuY3Rpb24gaWYgbm90IGRlZmluZWQgYXMgYSBtYWNyby4KLQotCSogTWFrZWZpbGUuaW4gKG9iamR1bXAubyk6IERlbGV0ZWQgc3BlY2lhbCBydWxlLgotCSogY29uZmlndXJlLmluOiBEb24ndCBib3RoZXIgYnVpbGRpbmcgQVJDSERFRlMgdmFyaWFibGUgZm9yCi0JTWFrZWZpbGUuCi0JKiBvYmpkdW1wLmMgKEFSQ0hfKik6IERlbGV0ZWQgaGFuZGxpbmcuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYWxsIGBkaXNhc3NlbWJsZXInIGZyb20gb3Bjb2RlcyBsaWJyYXJ5LgotCi1UaHUgTWF5ICA1IDEzOjI4OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBDb3JyZWN0IGhhbmRsaW5nIG9mICQodG9vbGRpcikgYW5kCi0JJChiaW5kaXIpIGJlaW5nIG9uIGRpZmZlcmVudCBkZXZpY2VzLgotCi1GcmkgQXByIDI5IDA5OjUwOjM4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIHN5c2R1bXAuYyAoaDgzMDAsIHNoKTogQWRkIGRlY2xhcmF0aW9ucy4KLQotV2VkIEFwciAyNyAxMToyNToxOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3lzbGV4LCBzeXNpbmZvKTogVXNlIENDX0ZPUl9CVUlMRC4KLQkqIGNvZmZkdW1wLmMsIGNvZmZncm9jLmMsIGNvZmZncm9nLmgsIHNyY29udi5jLCBzeXNkdW1wLmMsCi0Jc3lzcm9mZi5pbmZvOiBNYWpvciBjaGFuZ2VzLgotCi1UdWUgQXByIDI2IDE4OjE4OjI0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChwcmludF9zZWN0aW9uX3N0YWJzKTogSW5kaWNhdGUgdGhlIHN0YWIgaGVhZGVyIHN5bWJvbAotCW1vcmUgY2xlYXJseSwgcHJpbnQgbnVtYmVycyBvZiB1bnJlY29nbml6ZWQgc3RhYiBuX3R5cGUgdmFsdWVzLgotCi1UdWUgQXByIDI2IDE2OjIyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChjb3B5X3NlY3Rpb25zKTogQ29weSBhcmVsZW50IHBvaW50ZXJzLCBub3QgYXJlbGVudHMuCi0KLU1vbiBBcHIgMjUgMTY6MTQ6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlICQoUFJPR1MpIGFuZCB1bmRlcnNjb3JlLmMuCi0KLUZyaSBBcHIgMjIgMTE6MTQ6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHNldHVwX3NlY3Rpb25zKTogUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YgLnJlZ2luZm8KLQlzZWN0aW9uLgotCShjb3B5X3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGFscGhhX21hbmdsZV9yZWxvY3MpOiBVc2UgYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSByYXRoZXIgdGhhbiB0aGUKLQlzcGVjaWFsIEVDT0ZGIC5yZWdpbmZvIHNlY3Rpb24uCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBDYWxsIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgYWZ0ZXIKLQljb3B5aW5nIGV2ZXJ5dGhpbmcgZWxzZSwgdG8gbGV0IGl0IGZpZGRsZSB3aXRoIHRoZSBmaWxlIGluIGl0cwotCWZpbmFsIHN0YXRlLgotCi0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBJZiBhIGZvcm1hdCBmYWlscywganVzdCBnbyBvbiB0byB0aGUgbmV4dAotCW9uZS4gIENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfc2V0X2Zvcm1hdC4KLQkoZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuICBEb24ndCBpbmNyZW1lbnQgbG9vcCB2YXJpYWJsZSBpbgotCWZvciBsb29wIHRlc3QsIHNpbmNlIHRoYXQgc2tpcHMgdGhlIGZpcnN0IGVsZW1lbnQuCi0JKGRpc3BsYXlfdGFyZ2V0X3RhYmxlcyk6IFJld3JpdGUgbG9vcCBmb3IgY2xhcml0eS4gIEVuc3VyZSB0aGF0IGl0Ci0JYWx3YXlzIHByaW50cyBhdCBsZWFzdCBvbmUgZWxlbWVudC4KLQotCSogbmxtY29udi5jIChtYWluKTogVXNlIEN5R25Vc0V4IHJhdGhlciB0aGFuIEN5R25Vc1NlQ3MgZm9yCi0Jc2VjdGlvbnMgaGVhZGVyLiAgUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb25zIHRvIGN5Z251c19leHQuCi0KLVRodSBBcHIgMjEgMTI6MTI6MjYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKF9EVU1NWV9OQU1FXyk6IERvbid0IGRlZmluZS4KLQkoZGlzcGxheV90YXJnZXRfbGlzdCk6IFVzZSB0bXBuYW0gdG8gZ2V0IGEgZmlsZSBuYW1lIHJhdGhlciB0aGFuCi0JdXNpbmcgX0RVTU1ZX05BTUVfLiAgVW5saW5rIGl0IHdoZW4gZG9uZS4KLQkoZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuCi0KLQkqIG5sbWNvbnYuYyAoc2Vjc2VjKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWFpbik6IENyZWF0ZSAubmxtc2VjdGlvbnMgc2VjdGlvbiBpbiBvdXRwdXQgQkZELiAgU3RvcmUKLQlpbmZvcm1hdGlvbiBhYm91dCBpdCBpbiBzZWN0aW9ucyBoZWFkZXIuCi0JKHNldHVwX3NlY3Rpb25zKTogQWxsb2NhdGUgc3BhY2UgaW4gc2VjdGlvbnMgaGVhZGVyLgotCShjb3B5X3NlY3Rpb25zKTogQ29weSB6ZXJvIHNpemVkIHNlY3Rpb25zLiAgUHV0IGluZm9ybWF0aW9uIGFib3V0Ci0JZWFjaCBzZWN0aW9uIGluIHRoZSBzZWN0aW9ucyBoZWFkZXIuCi0KLVdlZCBBcHIgMjAgMTQ6MzQ6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHBvd2VycGNfYnVpbGRfc3R1YnMpOiBUYWtlIG5ldyBvdXRiZmQgYXJndW1lbnQuCi0JQ2hhbmdlIGNhbGxlci4gIENyZWF0ZSBjdXN0b20gaGVhZGVyIGZvciBuZXcgUG93ZXJQQyBOZXRXYXJlCi0JZm9ybWF0LgotCi0JKiBNYWtlZmlsZS5pbiAobmxtaGVhZGVyLm8sIG5sbWNvbnYubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBubG1jb252LmM6IEluY2x1ZGUgYmZkLmggYW5kIGxpYmliZXJ0eS5oIHdpdGggIiIsIG5vdCA8Pi4KLQkqIG5sbWhlYWRlci55OiBJbmNsdWRlIGJmZC5oIHdpdGggIiIsIG5vdCA8Pi4KLQotV2VkIEFwciAxMyAxMDo1Mjo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogRG8gYW4gaWZkZWYgb24gX19HTzMyX18sIG5vdCB1bml4LgotCi1XZWQgQXByICA2IDIxOjU0OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZGVkIC1EICgtLWR5bmFtaWMpIG9wdGlvbiB0byBubSBhbmQgLVQgKC0tZHluYW1pYy1zeW1zKSBhbmQgLVIKLQkoLS1keW5hbWljLXJlbG9jKSBhcmd1bWVudHMgdG8gb2JqZHVtcC4KLQkqIG5tLmMgKGR5bmFtaWMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGRlZCAiZHluYW1pYyIuCi0JKHVzYWdlKTogTWVudGlvbiAtRCBhbmQgLS1keW5hbWljLgotCShtYWluKTogQWRkIEQgdG8gZ2V0b3B0IHN0cmluZy4gIEhhbmRsZSAtRCBieSBzZXR0aW5nIGR5bmFtaWMuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBJZiBkeW5hbWljIGlzIG5vbi16ZXJvLCByZWFkIGR5bmFtaWMgc3ltYm9scwotCXJhdGhlciB0aGFuIG5vcm1hbCBzeW1ib2xzLgotCSogbm0uMTogVXBkYXRlZCBmb3IgLUQgKC0tZHluYW1pYykgb3B0aW9uLgotCSogb2JqZHVtcC5jIChkdW1wX2R5bmFtaWNfc3ltdGFiKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoZHVtcF9keW5hbWljX3JlbG9jX2luZm8pOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShkeW5zeW1zLCBkeW5zeW1jb3VudCk6IE5ldyBnbG9iYWwgdmFyaWFibGVzLgotCSh1c2FnZSk6IE1lbnRpb24gLVIsIC1ULCAtLWR5bmFtaWMtc3ltcyBhbmQgLS1keW5hbWljLXJlbG9jLgotCShsb25nX29wdGlvbnMpOiBBZGRlZCAiZHluYW1pYy1yZWxvYyIgYW5kICJkeW5hbWljLXN5bXMiLgotCShzbHVycF9zeW10YWIpOiBJZiBubyBzeW1ib2xzLCByZXR1cm4gcmF0aGVyIHRoYW4gZXhpdC4KLQkoc2x1cnBfZHluYW1pY19zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfYmZkKTogSGFuZGxlIGR1bXBfZHluYW1pY19zeW10YWIgYW5kCi0JZHVtcF9keW5hbWljX3JlbG9jX2luZm8uCi0JKGR1bXBfc3ltYm9scyk6IFRha2UgbmV3IGR5bmFtaWMgYXJndW1lbnQsIGluZGljYXRpbmcgd2hldGhlciB0bwotCWRpc3BsYXkgZHluYW1pYyBzeW1ib2xzLgotCShkdW1wX3JlbG9jcyk6IE1vdmUgbW9zdCBwcmludGluZyBpbnRvIGR1bXBfcmVsb2Nfc2V0LgotCShkdW1wX2R5bmFtaWNfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShkdW1wX3JlbG9jX3NldCk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20gZHVtcF9yZWxvY3MuCi0JKG1haW4pOiBBZGQgUiBhbmQgVCB0byBnZXRvcHQgc3RyaW5nLiAgSGFuZGxlIC1UIGJ5IHNldHRpbmcKLQlkdW1wX2R5bmFtaWNfc3ltdGFiIGFuZCAtUiBieSBzZXR0aW5nIGR1bXBfZHluYW1pY19yZWxvY19pbmZvLgotCSogb2JqZHVtcC4xOiBVcGRhdGVkIGZvciAtUiAoLS1keW5hbWljLXJlbG9jKSBhbmQgLVQKLQkoLS1keW5hbWljLXN5bXMpIG9wdGlvbnMuCi0JKiBiaW51dGlscy50ZXhpOiBVcGRhdGVkIGZvciBuZXcgbm0gYW5kIG9iamR1bXAgb3B0aW9ucy4KLQotV2VkIE1hciAzMCAxNTo1Mjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlVcGRhdGUgZm9yIHJlY2VudCBCRkQgY2hhbmdlcyB0byBzeW1ib2wgYW5kIHJlbG9jIHJlYWRpbmcuICBSZW5hbWUKLQlhbGwgdXNlcyBvZiBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHRvIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLgotCUFsc286Ci0JKiBjb2ZmZ3Jvay5jIChzeW1jb3VudCk6IENoYW5nZSB0byBsb25nLgotCShkb19zZWN0aW9uc19wMSk6IENoZWNrIGZvciBlcnJvciByZXR1cm4gZnJvbQotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQuICBDaGFuZ2UgcmVsY291bnQgdG8gbG9uZywgYW5kIGNoZWNrIGZvcgotCWVycm9yIGZyb20gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkoY29mZl9ncm9rKTogQ2hhbmdlIHN0b3JhZ2UgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvciBmcm9tCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIHN5bWNvdW50LCBuZXdzeW1hbGxvYywgbmV3c3ltY291bnQsIGFuZAotCWkgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvciBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCShjb3B5X3NlY3Rpb25zKTogQ2hhbmdlIHJlbG9jX3NpemUgYW5kIHJlbG9jX2NvdW50IHRvIGxvbmcuICBDaGVjawotCWZvciBlcnJvciBmcm9tIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkobWFuZ2xlX3JlbG9jcywgaTM4Nl9tYW5nbGVfcmVsb2NzLCBhbHBoYV9tYW5nbGVfcmVsb2NzKTogQ2hhbmdlCi0JcmVsb2NfY291bnRfcHRyIGFyZ3VtZW50IHRvIGxvbmcgKi4gIE1ha2UgY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRvCi0JdmFyaWFibGVzIGxvYWRlZCBmcm9tICpyZWxvY19jb3VudF9wdHIuCi0JKiBubS5jIChkaXNwbGF5X3JlbF9maWxlKTogQ2hhbmdlIHN0b3JhZ2UgYW5kIHN5bWNvdW50IHRvIGxvbmcuCi0JQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IENoYW5nZSBzeW1jb3VudCwgc3JjX2NvdW50IGFuZAotCWRzdF9jb3VudCB0byBsb25nLgotCShjb3B5X29iamVjdCk6IENoYW5nZSBzeW1jb3VudCB0byBsb25nLiAgUGFzcyBhbm90aGVyIGFyZ3VtZW50IHRvCi0JZnByaW50Zi4gIENoZWNrIGZvciBlcnJvcnMgZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkoY29weV9zZWN0aW9uKTogQ2hhbmdlIHJlbGNvdW50IHRvIGxvbmcuICBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IENoYW5nZSByZWxjb3VudCBhbmQgaSB0byBsb25nLgotCUNoZWNrIGZvciBlcnJvcnMgZm9ybSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKiBvYmpkdW1wLmMgKHN0b3JhZ2UpOiBSZW1vdmUgZ2xvYmFsIHZhcmlhYmxlLgotCShzeW1jb3VudCk6IENoYW5nZWQgdG8gbG9uZy4KLQkoc2x1cnBfc3ltdGFiKTogTmV3IGxvY2FsIHZhcmlhYmxlIHN0b3JhZ2UuICBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGFuZCBjb3VudCB0byBsb25nLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDaGFuZ2UgbWluLCBtYXgsIHRoaXNwbGFjZSBhbmQgaSB0byBsb25nLgotCShkaXNhc3NlbWJsZV9kYXRhKTogQ2hhbmdlIGkgdG8gbG9uZy4KLQkoZHVtcF9zeW1ib2xzKTogQ2hhbmdlIGNvdW50IHRvIGxvbmcuCi0JKGR1bXBfcmVsb2NzKTogQ2hhbmdlIHJlbGNvdW50IHRvIGxvbmcuICBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfcmV0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShkaXNwbGF5X2luZm9fdGFibGUpOiBBZGQgY2FzdHMgd2hlbiBwYXNzaW5nIExPTkdFU1RfQVJDSCBmb3IKLQlwcmludGYgJSogYXJndW1lbnQuCi0KLVR1ZSBNYXIgMjkgMTQ6NTk6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubS5jIChkaXNwbGF5X2FyY2hpdmUpOiBDbG9zZSBlYWNoIGFyY2hpdmUgZWxlbWVudCBhZnRlciBpdCBoYXMKLQliZWVuIGRpc3BsYXllZC4KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9maWxlKTogTGlrZXdpc2UuCi0KLU1vbiBNYXIgMjggMTM6MDQ6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBlcnJvciBtZXNzYWdlIHRvIHJlZmVyIHRvIGJmZC9jb25maWcuYmZkCi0JcmF0aGVyIHRoYW4gYmZkL2NvbmZpZ3VyZS5pbi4KLQotU3VuIE1hciAyNyAxNjoyMzozOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTW9yZSBmaXhlcyBmb3Igb2JqZWN0IGZvcm1hdHMgd2hpY2ggYWxsb3cgbXVsdGlwbGUgc2VjdGlvbnMKLQl3aXRoIHRoZSBzYW1lIG5hbWU6Ci0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb24pOiBNYWtlIGEgbmV3IG91dHB1dCBzZWN0aW9uIGV2ZW4gaWYKLQlvbmUgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkoY29weV9zZWN0aW9uKTogVXNlIGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiByYXRoZXIgdGhhbiB0cnlpbmcKLQl0byBsb29rIHRoZSBvdXRwdXQgc2VjdGlvbiB1cCBieSBpdHMgKHBvc3NpYmx5IG5vbi11bmlxdWUpIG5hbWUuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBMb29rIGZvciBiaW51dGlscy5pbmZvIGluIHRoZQotCWN1cnJlbnQgZGlyZWN0b3J5LCB0aGVuIGluICQoc3JjZGlyKS4gIERvbid0IHVzZSAkPC4KLQotTW9uIE1hciAyMSAxMjo1NTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlIHdpdGgKLQlwcm90b3R5cGUuICBDaGFuZ2UgdmFyZGlmZiBmcm9tIGludCB0byBiZmRfc2lnbmVkX3ZtYS4gIENvcnJlY3QKLQliaW5hcnkgc2VhcmNoIHRlcm1pbmF0aW9uIGNvbmRpdGlvbi4gIFdoZW4gbG9va2luZyBmb3Igc2FtZQotCXNlY3Rpb24gc3ltYm9sIGluIHJlbG9jYXRhYmxlIGZpbGUsIGhhbmRsZSBmaW5hbCBzeW1ib2wgY29ycmVjdGx5LgotCi1TdW4gTWFyIDIwIDExOjI2OjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbjogQXZvaWQgYnVnIGluIGhwdXggc2VkLgotCi0JKiBvYmpjb3B5LmM6IENoYW5nZXMgdG8ga2VlcCBpdCBmcm9tIHN0cmlwcGluZyBzeW1ib2xzIHVzZWQKLQlpbiBvdXRwdXQgcmVsb2NhdGlvbnMuCi0JKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogTmV3IGZ1bmN0aW9uLiAgTWFyayBzeW1ib2xzCi0JdXNlZCBpbiBvdXRwdXQgcmVsb2NhdGlvbnMgd2l0aCBCU0ZfS0VFUC4KLQkoZmlsdGVyX3N5bWJvbHMpOiBEbyBub3Qgc3RyaXAgc3ltYm9scyBtYXJrZWQgd2l0aCBCU0ZfS0VFUC4KLQkoY29weV9vYmplY3QpOiBSZW9yZGVyIGFjdGlvbnMuICBGaXJzdCBzZXR1cCBzZWN0aW9ucywgdGhlbgotCWJ1aWxkIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLCB0aGVuIGNvcHkgdGhlIHNlY3Rpb24gY29udGVudHMuCi0KLUZyaSBNYXIgMTggMTA6NTM6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhci5jICh3cml0ZV9hcmNoaXZlKTogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBudWxsIGJ5dGUuICBGcm9tCi0JUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotVGh1IE1hciAxNyAxNjoyMDoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBCdWlsdCBubS5uZXcgYW5kIHN0cmlwLm5ldyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCi0JY29sbGVjdCB3aGVuIC4gaXMgaW4gUEFUSC4KLQkoU1RSSVBfUFJPRyk6IENoYW5nZSBmcm9tIHN0cmlwIHRvIHN0cmlwLm5ldy4KLQkoTk1fUFJPRyk6IENoYW5nZSBmcm9tIG5tIHRvIG5tLm5ldy4KLQkoaW5zdGFsbCk6IFJlbW92ZSB0aGUgLm5ldyB3aGVuIGluc3RhbGxpbmcuCi0KLVdlZCBNYXIgMTYgMTY6Mjc6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHBvd2VycGNfYnVpbGRfc3R1YnMpOiBTZXQgQlNGX0RZTkFNSUMgZmxhZyBmb3IgZWFjaAotCXN5bWJvbCBmb3Igd2hpY2ggd2UgYnVpbGQgYSBzdHViLgotCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBPbmx5IHJlc2V0IFRPQyBwb2ludGVyIGZvciBhIGNhbGwgdG8gYQotCXN5bWJvbCB3aXRoIEJTRl9EWU5BTUlDIGZsYWcgc2V0LgotCi1UdWUgTWFyIDE1IDIzOjA0OjEzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogVXNlIGJmZF9pc19sb2NhbF9sYWJlbCB0byBkZXRlcm1pbmUKLQlpZiBhIHN5bWJvbCByZXByZXNlbnRzIGEgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLgotCShjb3B5X29iamVjdCk6IEdpdmUgdGhlIEJGRCBiYWNrZW5kcyBhIGNoYW5jZSB0byBjb3B5IGFueSBwcml2YXRlCi0JYmZkIGRhdGEgZnJvbSB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELgotCShzZXR1cF9zZWN0aW9uKTogR2l2ZSB0aGUgQkZEIGJhY2tlbmRzIGEgY2hhbmNlIHRvIGNvcHkgYW55IHByaXZhdGUKLQlzZWN0aW9uIGRhdGEgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24uCi0KLU1vbiBNYXIgMTQgMTE6MTU6NTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamNvcHkuYyAobWFuZ2xlX3NlY3Rpb24pOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCShzZXR1cF9zZWN0aW9uKTogU2V0IG9zZWN0aW9uIGhlcmUgaW5zdGVhZCBvZiBjYWxsaW5nCi0JbWFuZ2xlIHNlY3Rpb24gdG8gZG8gaXQuCi0KLU1vbiBNYXIgMTQgMTI6MTE6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhci5jICh3cml0ZV9hcmNoaXZlKTogQ2xvc2UgaW5hcmNoIGJlZm9yZSB1bmxpbmtpbmcgaXQuCi0KLUZyaSBNYXIgMTEgMjI6MjA6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBGb3IgUG93ZXJQQywgY2FsbCBwb3dlcnBjX2J1aWxkX3N0dWJzIGFuZAotCXBvd2VycGNfcmVzb2x2ZV9zdHVicy4gIFVzZSBfX0dPVDAsIG5vdCBfX3RvY19zdGFydC4gIEhhbmRsZSBpdCBpZgotCXRoZSBzdGFydCBhbmQgZW5kIHN5bWJvbHMgYXJlIG5vdCBpbiB0aGUgdGV4dCBzZWN0aW9uLgotCShzdHJ1Y3QgcG93ZXJwY19zdHViKTogTmV3IHN0cnVjdCBkZWZpbml0aW9uLgotCShwb3dlcnBjX3N0dWJzLCBwb3dlcnBjX3N0dWJfaW5zbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkocG93ZXJwY19pbml0aWFsX2dvdF9zaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocG93ZXJwY19idWlsZF9zdHVicyk6IE5ldyBmdW5jdGlvbi4KLQkocG93ZXJwY19yZXNvbHZlX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBDbGVhciBleHRyYW5lb3VzIGRhdGEgaW4gLmdvdCBzZWN0aW9uLgotCVJlYXJyYW5nZSByZWxvYyBoYW5kbGluZyB0byBoYW5kbGUgRUxGIHJlbG9jcyB0aGF0IGFyZSBub3QKLQlwYXJ0aWFsX2lucGxhY2UuICBSZXNvbHZlIFBDIHJlbGF0aXZlIHJlbG9jcy4KLQotV2VkIE1hciAgOSAxMzo0ODoxMSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBhci5jIChtb3ZlX21lbWJlcnMpOiBGaXggaXQgc28gdGhhdCB0aGUgYWJpIHBvc2l0aW9uYWwgbW9kaWZpZXJzCi0JZG9uJ3QgZGVsZXRlIGFsbCBhcmNoaXZlIG1lbWJlcnMgZm9sbG93aW5nIHRoZSBpbnNlcnQgcG9pbnQuCi0KLVR1ZSBNYXIgIDggMTM6MTQ6NDMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZmdyb2suW2NoXTogTmV3IGZpbGVzLCB1bmRlcnN0YW5kIGNvZmYgb2JqZWN0cy4KLQkqIGNvZmZkdW1wLmM6IFVzZXMgY29mZmdyb2sgdG8gZHVtcCBvdXQgdGhlIGRlYnVnIGluZm8gb2YgYSBjb2ZmCi0JZmlsZS4KLQkqIHN5c3JvZmYuaW5mbzogRGVzY3JpcHRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlLgotCSogc3lzaW5mby55LCBzeXNsZXgubDogUGFyc2UgaW5mbyBmaWxlLCBnZW5lcmF0ZSBhIHJlYWRlciwgd3JpdGVyLAotCWhlYWRlciBmaWxlcyBhbmQgYSBwcmludGVyLgotCSogc3Jjb252LmM6IFVzZXMgY29mZmdyb2suYyBhbmQgc3lzcm9mZi5pbmZvIHRvIGNvbnZlcnQgYSBjb2ZmCi0JZmlsZSB0byBhIFNZU1JPRkYgZmlsZS4KLQotU2F0IEZlYiAyNiAxMzozNToyNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKGRvX3F1aWNrX2FwcGVuZCk6IFBhZCB3aXRoIGEgZ2VudWluZSBjaGFyYWN0ZXIgMTAsCi0JcmF0aGVyIHRoYW4gd2hhdGV2ZXIgJ1xuJyBtaWdodCBoYXBwZW4gdG8gYmUuCi0KLVR1ZSBGZWIgMjIgMTg6MjU6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBJZ25vcmUgZGVidWdnaW5nIHN5bWJvbHMgd2hlbiBsb29raW5nIGZvcgotCXNwZWNpYWwgc3ltYm9scyBieSBuYW1lLgotCi1TdW4gRmViIDIwIDE4OjQ3OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0KLQlTdXBwb3J0IGZvciBQb3dlclBDIE5ldFdhcmUuCi0JKiBubG1jb252LmMgKG1haW4pOiBGb3IgUG93ZXJQQyBOZXRXYXJlLCBhdXRvbWF0aWNhbGx5IGRlZmluZSB0aGUKLQlzcGVjaWFsIHN5bWJvbHMgX190b2Nfc3RhcnQuCi0JKHNlbGVjdF9vdXRwdXRfZm9ybWF0KTogSGFuZGxlIGJmZF9hcmNoX3Bvd2VycGMuCi0JKG1hbmdsZV9yZWxvY3MpOiBMaWtld2lzZS4KLQkocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgRmViIDE3IDA5OjI4OjIzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXIuYywgYnVjb21tLmMsIG5sbWNvbnYuYywgbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmMsCi0Jc2l6ZS5jOiBVc2UgYmZkX2dldF9lcnJvciBhbmQgYmZkX3NldF9lcnJvciBhbmQgbmV3IGVycm9yIG5hbWVzLgotCi1GcmkgRmViIDExIDE1OjU0OjUxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChzdHJpcF9tYWluLCBjb3B5X21haW4pOiBBZGQgbWlzc2luZyAnYnJlYWsnIGluIHN3aXRjaC4KLQotTW9uIEZlYiAgNyAxOTo0NTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSBiZmRfYXJjaF9wb3dlcnBjLgotCi1TdW4gRmViICA2IDIyOjA4OjIwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3RyaW5ncy5jIG9iamR1bXAuYyBubG1jb252LmMgb2JqY29weS5jIG5tLmMgYXIuYyBzaXplLmMgKG1haW4pOgotCUNhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lLgotCi1GcmkgRmViICA0IDEwOjQ2OjAxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBNYWtlIE1FTUhVTksgYSBjaGFyICosIG5vdCBQVFIsIHNvIHdlCi0JY2FuIGRvIGFyaXRobWV0aWMgb24gaXQuCi0KLVRodSBGZWIgIDMgMTQ6MDY6NDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicywgcmVhZF9zZWN0aW9uX3N0YWJzLAotCXByaW50X3NlY3Rpb25fc3RhYnMpOiBGdW5jdGlvbnMgYnJva2VuIG91dCBvZiBkdW1wX3N0YWJzXzEuCi0JRnJlZSB0aGUgc3RhYnMgYW5kIHN0cmluZ3Mgd2hlbiBkb25lIHdpdGggdGhlbS4KLQotV2VkIEZlYiAgMiAxMzo0MjoyMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFVzZSBiZmRfZ2V0X2ZsYXZvdXIgaW5zdGVhZCBvZiBzdHJ1Y3QgbWVtYmVyLgotCSogYXIuYyAocHJpbnRfY29udGVudHMsIGV4dHJhY3RfZmlsZSksIHNpemUuYwotCShwcmludF9iZXJrZWxleV9mb3JtYXQsIHByaW50X3N5c3ZfZm9ybWF0KTogVXNlIGJmZF9nZXRfZmlsZW5hbWUgYW5kCi0JYmZkX215X2FyY2hpdmUgaW5zdGVhZCBvZiBkZXJlZmVyZW5jaW5nIHRoZSBzdHJ1Y3RzIGRpcmVjdGx5LgotCi0JKiBhci5jOiBVc2UgYmZkX2ZhdGFsIGFuZCBiZmRfbm9uZmF0YWwgaW5zdGVhZCBvZiBiZmRfcGVycm9yIGFuZCBleGl0LgotCUluZGVudC4gIFJlbW92ZSBERUZVTnMuCi0KLQkqIG5sbWNvbnYuYyAobWFpbiksIG9iamNvcHkuYyAoY29weV9maWxlKTogUHJpbnQgbWF0Y2hpbmcgZm9ybWF0cwotCWlmIGFtYmlndW91cyBtYXRjaC4KLQkqIG5tLmMgKGRpc3BsYXlfZmlsZSwgZGlzcGxheV9hcmNoaXZlKSwgc2l6ZS5jIChkaXNwbGF5X2JmZCk6Ci0JRWxpbWluYXRlIGdvdG9zLgotCVByaW50IG1hdGNoaW5nIGZvcm1hdHMgaWYgdGhlcmUgaXMgYW4gYW1iaWd1b3VzIG1hdGNoLiAgVXNlCi0JYmZkX25vbmZhdGFsIGluc3RlYWQgb2YgaGFyZGNvZGVkIGVycm9yIG1lc3NhZ2UgaWYgbm90aGluZyBtYXRjaGVzLgotCi0JKiBhcnN1cC5jLCBhci5jLCBvYmpkdW1wLmM6IFVzZSBiZmRfZ2V0X2ZpbGVuYW1lIGluc3RlYWQgb2YKLQlhYmZkLT5maWxlbmFtZS4KLQotCSogbm0uYyAoZGlzcGxheV9hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLCBmcm9tIGNvZGUgaW4gZGlzcGxheV9maWxlLgotCShkaXNwbGF5X3JlbF9maWxlKTogUmVuYW1lZCBmcm9tIGRvX29uZV9yZWxfZmlsZS4KLQotCSogc2l6ZS5jOiBJbmRlbnQuCi0JKGRpc3BsYXlfYXJjaGl2ZSk6IE5ldyBmdW5jdGlvbiBmcm9tIGNvZGUgaW4gZGlzcGxheV9maWxlLgotCShkaXNwbGF5X2ZpbGUpOiBDaGVjayBiZmRfY2xvc2UgZXJyb3IgcmV0dXJuLgotCi0JKiBzdHJpbmdzLmMgKHN0cmluZ3Nfb2JqZWN0X2ZpbGUpOiBDaGVjayBiZmRfY2hlY2tfZm9ybWF0Ci0JZXJyb3IgcmV0dXJuLgotCi0JKiBzdHJpbmdzLmMsIG9iamR1bXAuYywgc2l6ZS5jOiBVc2UgYmZkX25vbmZhdGFsIGluc3RlYWQgb2YgYmZkX3BlcnJvci4KLQotCSogYnVjb21tLmM6IERlbGV0ZSByZWZlcmVuY2VzIHRvIGV4aXRfaGFuZGxlci4gIEl0IHdhc24ndCBzZXQKLQlhbnl3aGVyZSwgYW5kIG5vdyB0aGF0IHdlJ3JlIHVzaW5nIHRoZSBsaWJpYmVydHkgeG1hbGxvYywgaXQKLQl3b3VsZG4ndCBhbHdheXMgZ2V0IGNhbGxlZCBiZWZvcmUgZXhpdGluZy4KLQkobGlzdF9tYXRjaGluZ19mb3JtYXRzKTogRnVuY3Rpb24gbW92ZWQgZnJvbSBvYmpkdW1wLmMuCi0JKiBidWNvbW0uaDogRGVjbGFyZSBpdC4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogTW92ZSBzb21lIHZhcmlhYmxlIGRlY2xzIGNsb3NlciB0bwotCXRoZWlyIHVzZS4gIEFkZCBzb21lIGNvbW1lbnRzLiAgUmVwbGFjZSBhIG5lc3RlZCBibG9jayB3aXRoIGEKLQlyZXR1cm4uCi0KLU1vbiBKYW4gMzEgMTg6NTA6NDEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X2xpc3QsIGRpc3BsYXlfaW5mb190YWJsZSk6IENoZWNrIHRoYXQKLQl0aGUgYmZkIG9mIHRoZSBkdW1teSBvdXRwdXQgZmlsZSBpcyBub3QgbnVsbC4KLQotV2VkIEphbiAyNiAxMzoxMzoxOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogTmV3IGZ1bmN0aW9uLgotCShjb3B5X3NlY3Rpb24pOiBDYWxsIGl0LgotCShjb3B5X29wdGlvbnMsIGNvcHlfdXNhZ2UsIGNvcHlfbWFpbik6IEFkZCAtLWJ5dGUgb3B0aW9uIHRvCi0JYWN0aXZhdGUgaXQuICBBcHByb3ByaWF0ZSB0aGUgLWIgb3B0aW9uICh3aGljaCB3YXMgYW4gdW5kb2N1bWVudGVkCi0Jc3lub255bSBmb3IgLUYpIGZvciBpdCwgYWxzby4gIEFkZCAtLWludGVybGVhdmUsIC1pIG9wdGlvbiBmb3IKLQlhZGRpdGlvbmFsIGNvbnRyb2wuCi0JKHNldHVwX3NlY3Rpb24sIGNvcHlfc2VjdGlvbiwgbWFuZ2xlX3NlY3Rpb24pOiBSZW5hbWVkIHdpdGggbm8gYHMnCi0Jb24gdGhlIGVuZC4KLQkqIG9iamNvcHkuMSwgYmludXRpbHMudGV4aTogRG9jdW1lbnQgdGhlIG5ldyBvcHRpb25zLgotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X3RhYmxlcywgZGlzcGxheV90YXJnZXRfbGlzdCk6Ci0JTmV3IGZ1bmN0aW9ucyBicm9rZW4gb3V0IG9mIGRpc3BsYXlfaW5mby4KLQlFbGltaW5hdGUgc29tZSBtYWdpYyBjb25zdGFudHMuICBVc2UgbW9yZSBtZWFuaW5nZnVsIHZhcmlhYmxlIG5hbWVzLgotCShkdW1wX2JmZF9oZWFkZXIpOiBOZXcgZnVuY3Rpb24gYnJva2VuIG91dCBvZiBkaXNwbGF5X2JmZC4KLQkoZHVtcF9zZWN0aW9uX2hlYWRlcik6IE5ldyBmdW5jdGlvbiBicm9rZW4gb3V0IG9mIGR1bXBfaGVhZGVycy4KLQkocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyk6IERvbid0IHNoYWRvdyBnbG9iYWwgdmFyaWFibGUgbmFtZSB3aXRoCi0JcGFyYW1ldGVyLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBGaXggYmFja3dhcmQgdGVzdC4KLQotVHVlIEphbiAyNSAxOTo0MDo1NCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6IENoYW5nZSBkZWNsIG9mIGB3aGVuJyB0byB0aW1lX3QuCi0JKiBvYmpkdW1wLmg6IFJlbW92ZWQuCi0KLU1vbiBKYW4gMjQgMTM6Mjk6MDIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfZmlsZSk6IFJlbW92ZSBjYWxsIHRvIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cy4KLQlJdCB3b3VsZCBuZXZlciBiZSBjYWxsZWQuCi0JKGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyk6IFRha2UgYW4gYXJnIGdpdmluZyB0aGUgbGlzdCBvZiBtYXRjaGluZwotCWZvcm1hdHMuCi0JKGRpc3BsYXlfYmZkKTogUGFzcyB0aGUgYXJnLCBhbmQgZ2V0IGl0IGZpbGxlZCBpbiBieSBjYWxsaW5nCi0JYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIGluc3RlYWQgb2YgYmZkX2NoZWNrX2Zvcm1hdC4KLQkoZGlzcGxheV9pbmZvLCBkaXNwbGF5X2luZm9fdGFibGUpOiB0YXJnZXRfdmVjdG9yIHdhcyByZW5hbWVkIHRvCi0JYmZkX3RhcmdldF92ZWN0b3IuCi0KLQkqIGJpbnV0aWxzLnRleGkgKG9iamR1bXApOiBOb3RlIHNvbWUgbGltaXRhdGlvbnMgb2YgLWggc2VjdGlvbgotCWFkZHJlc3MgcHJpbnRpbmcuCi0KLVNhdCBKYW4gMjIgMTY6MjA6NDYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFMTE9DKTogU2V0IHRvIGVtcHRpbmVzcyBieSBkZWZhdWx0LgotCShBTExfQ0ZMQUdTKTogQWRkIGFuZCB1c2UuCi0JKGFycGFyc2UuaCk6IE1ha2UgaXQgZGVwZW5kIG9uIGFycGFyc2UueS4KLQkqIGFyLmMgKGxpYmJmZC5oKTogRG9uJ3QgcmVxdWlyZSB0byBiZSBpbiAuLi9iZmQuCi0JKiBvYmpkdW1wLmMgKGNvbXApOiBSZW5hbWUgdG8gY29tcGFyZV9zeW1ib2xzLgotCi1GcmkgSmFuIDIxIDIwOjIyOjMwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChsaXN0X21hdGNoaW5nX2Zvcm1hdHMpOiBJZiB0aGUgZmlsZSBmb3JtYXQgaXMgYW1iaWd1b3VzLAotCXByaW50IHRoZSBtYXRjaGluZyBuYW1lcyBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIG9uZS4KLQkoZGlzcGxheV9iZmQpOiBDYWxsIGl0LgotCShkaXNwbGF5X2ZpbGUpOiBDYWxsIGl0LgotCi1GcmkgSmFuIDIxIDE5OjE3OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU3VwcG9ydCBiZmRfYXJjaF9yczYwMDAuCi0KLU1vbiBKYW4gMTcgMTM6NTc6MjUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHN0YWJfbmFtZSk6IEFsbG9jYXRlIGR5bmFtaWNhbGx5LgotCShzdGFiX3ByaW50KTogVXNlIHBvaW50ZXJzIHRvIHN0cmluZ3MgaW5zdGVhZCBvZiBjaGFyIGFycmF5cy4KLQkoZHVtcF9zdGFicyk6IENoYW5nZSBhbGxvYyBhbmQgaW5pdCBvZiBhcnJheXMgYXBwcm9wcmlhdGVseS4KLQkoZHVtcF9zdGFic18xKTogQWx3YXlzIGRlY2lkZSB3aGV0aGVyIHRvIHByaW50IHN0YWJfbmFtZSBvcgotCXRoZSBzdGFiJ3MgdHlwZSBudW1iZXIsIGlmIHVubmFtZWQuCi0KLUZyaSBKYW4gMTQgMTQ6NDI6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IERvbid0IGNsb2JiZXIgdGhlIGlucHV0IGZpbGUKLQlpZiBjb3B5X2ZpbGUgZmFpbHMuCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdCB0byB1c2UgYSBzaGFyZWQgbGlicmFyeQotCXdpdGggdW5pbml0aWFsaXplZCBkYXRhLgotCi0JKiBubG1jb252LmMgKHNldHVwX3NlY3Rpb25zKTogTWFrZSBzdXJlIHRoYXQgd2UgYWxpZ24gdGhlCi0Jb3V0cHV0X29mZnNldCBvZiBlYWNoIGlucHV0IHNlY3Rpb24gYXBwcm9wcmlhdGVseS4KLQotVGh1IEphbiAxMyAxNzozMjo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY3MpOiBEb24ndCBjcmFzaCBpZiBzZWN0aW9uIG5hbWUgaXMgTlVMTC4KLQotVHVlIEphbiAxMSAxOTo0NjozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGZpbGVtb2RlLmMgKGZpbGVtb2Rlc3RyaW5nKTogQ29tbWVudGVkIG91dDsgbm90IHVzZWQuCi0JKG1vZGVfc3RyaW5nKTogVXNlIFBPU0lYIGRlZmluaXRpb25zLgotCShmdHlwZWxldCk6IExpa2V3aXNlLgotCShyd3gpOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KLQkqIGJ1Y29tbS5jOiBJbmNsdWRlIGJ1Y29tbS5oLgotCShiZmRfbm9uZmF0YWwsIGJmZF9mYXRhbCk6IEFyZ3VtZW50IGlzIGNvbnN0LgotCShmYXRhbCk6IE1ha2UgX19TVERDX18gdmVyc2lvbi4KLQkqIGJ1Y29tbS5oIChtb2RlX3N0cmluZyk6IERlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbiAoYnVjb21tLm8pOiBEZXBlbmQgdXBvbiBidWNvbW0uaAotCi1TdW4gSmFuICA5IDEyOjAzOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogRGVsZXRlZC4KLQkqIGJ1Y29tbS5oICh4bWFsbG9jLCB4cmVhbGxvYyk6IEZpeCBwcm90b3R5cGVzLCB0byBjb3JyZXNwb25kIHRvCi0JbGliaWJlcnR5IHZlcnNpb24gb2YgZnVuY3Rpb25zLgotCi1UaHUgSmFuICA2IDA2OjE4OjE1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogQWRkIGEgY2hhcHRlciBzdW1tYXJpemluZyB0aGUgd2F5cyB0byBzZWxlY3QKLQlhc3BlY3RzIG9mIHRoZSB0YXJnZXQgZm9yIGVhY2ggcHJvZ3JhbS4KLQotCSogb2JqZHVtcC5jIChsb25nX29wdGlvbnMsIHVzYWdlKTogQWRkIGxvbmcgZXF1aXZhbGVudHMgZm9yIGFsbAotCXJlbWFpbmluZyBzaG9ydCBvcHRpb25zIHRoYXQgbGFja2VkIHRoZW0uCi0JKiBiaW51dGlscy50ZXhpIG9iamR1bXAuMTogRG9jdW1lbnQgdGhlbS4KLQotCSogc2l6ZS5jICh1c2FnZSk6IFR3ZWFrIHVzYWdlIG1lc3NhZ2UuCi0JKiBzaXplLjE6IEFkZCBtaXNzaW5nIGA9JyBpbiBleGFtcGxlcy4KLQotCSogYmludXRpbHMudGV4aSBzdHJpcC4xIG9iamNvcHkuMSBubG1jb252LjEgb2JqY29weS5jIG5sbWNvbnYuYzoKLQlVc2UgIi0tdGFyZ2V0PWJmZG5hbWUiIGFzIHRoZSBvcHRpb24gdG8gc2VsZWN0IHRoZSBCRkQgdGFyZ2V0LAotCWxpa2Ugbm0gYW5kIHNpemUgYWxyZWFkeSBkby4KLQlSZXNlcnZlICItLWZvcm1hdD1mb3JtYXQiIGZvciB0ZXh0dWFsIG91dHB1dCBzZWxlY3Rpb24gb3B0aW9ucywgYnV0Ci0JZm9yIG5vdyBrZWVwIG9sZCBvcHRpb24gbmFtZXMgYXMgb2Jzb2xldGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0KLQkqIHN0cmluZ3MuYyAobWFpbiwgc3RyaW5nc19vYmplY3RfZmlsZSwgdXNhZ2UpOiBBZGQgLS10YXJnZXQgb3B0aW9uLgotCSogYmludXRpbHMudGV4aSBzdHJpbmdzLjE6IERvY3VtZW50IGl0LgotCi1TYXQgSmFuICAxIDEzOjU4OjI0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAobWFpbik6IEFkZCBcbiBpbiBlcnJvciBtZXNzYWdlLgotCi1UaHUgRGVjIDIzIDEyOjIzOjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCWdjYyAtV2FsbCBsaW50OgotCSogYXIuYyAobWFpbik6IFB1dCBwYXJlbnMgYXJvdW5kIGFzc2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZS4KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgUmV0dXJuIDAuCi0JKGNvcHlfbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgUmV0dXJuIDAuCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfYmZkKTogRGVjbGFyZSByZXR1cm4gdmFsdWUgYXMgdm9pZC4KLQkoc3RhYl9wcmludCk6IFVzZSAiIiBpbnN0ZWFkIG9mIDAgdG8gaW5pdGlhbGl6ZSBhcnJheS4KLQkoZHVtcF9zdGFic18xKTogUHJpbnQgdm1hIHVzaW5nIHByaW50Zl92bWEuCi0JKGRpc3BsYXlfaW5mbyk6IFB1dCBwYXJlbnMgYXJvdW5kIGFzc2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZS4KLQkqIHN0cmluZ3MuYyAocHJpbnRfc3RyaW5ncyk6IENhc3QgcHJpbnRmIGFyZ3VtZW50cy4KLQotCSogb2JqY29weS5jIChjb3B5X21haW4pOiBVc2UgY29weV9vcHRpb25zLCBub3Qgc3RyaXBfb3B0aW9ucy4KLQotCSogbmxtaGVhZGVyLnkgKGNvbW1hbmQpOiBXYXJuIGFib3V0IGlsbGVnYWwgZGF0ZSB2YWx1ZXMuCi0KLVdlZCBEZWMgMTUgMTE6MTg6MDMgMTk5MyAgRGF2aWQgSi4gTWFjS2VuemllICAoZGptQGZyb3N0eS5lbmcudW1kLmVkdSkKLQotCSogYnVjb21tLmMgYnVjb21tLmg6IFJ1biB0aHJvdWdoIGluZGVudC4gIERlLWFuc2lkZWNsLWlmeS4KLQkoYmZkX25vbmZhdGFsKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZmF0YWwpOiBDYWxsIGl0LgotCi0JKiBvYmpjb3B5LmMgKHNtYXJ0X3JlbmFtZSk6IERvIGEgY29weSBpZiB0aGUgZGVzdCBmaWxlIGhhcwotCW11bHRpcGxlIGhhcmQgbGlua3MuICBSZW1vdmUgc291cmNlIGZpbGUgb24gc3VjY2Vzc2Z1bCBjb3B5LgotCVRyeSB0byBwcmVzZXJ2ZSBtb2RlIGFuZCBvd25lciBvbiBzdWNjZXNzZnVsIHJlbmFtZS4KLQotCSogb2JqY29weS5jOiBSdW4gdGhyb3VnaCBpbmRlbnQuICBDbGVhbiB1cCBhIGJpdC4KLQlNYWtlIGdsb2JhbCB2YXJpYWJsZXMgc3RhdGljLgotCU1ha2Uge2lucHV0LG91dHB1dH1fe3RhcmdldCxmaWxlbmFtZX0sIHNob3dfdmVyc2lvbiBsb2NhbAotCXRvIHZhcmlvdXMgZnVuY3Rpb25zLgotCU5ldyBnbG9iYWwgdmFyaWFibGUgYHN0YXR1cycgZm9yIGV4aXQgc3RhdHVzLgotCShzdHJpcF9tYWluLCBjb3B5X21haW4pOiBOZXcgZnVuY3Rpb25zIHdpdGggY29kZSBmcm9tIG1haW4uCi0JKG5vbmZhdGFsKTogTmV3IG1hY3JvLiAgVXNlIGl0IGdsb2JhbGx5IGluc3RlYWQgb2YgYmZkX3BlcnJvciBhbmQKLQliZmRfZmF0YWwuCi0KLQkoY29weV9vYmplY3QpOiBDYWxsIG1hbmdsZV9zZWN0aW9ucyB3aXRoIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KLQkobWFuZ2xlX3NlY3Rpb25zKTogQWRqdXN0IGZvciBuZXcgY2FsbGluZyBjb252ZW50aW9uLgotCi1GcmkgRGVjIDEwIDExOjI4OjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtaGVhZGVyLnkgKGNvbW1hbmQpOiBBY2NlcHQgTUFQIGFuZCBGVUxMTUFQIHdpdGhvdXQgYXJndW1lbnRzLgotCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgZm9yIE1BUCBhbmQgRlVMTE1BUC4KLQotVGh1IERlYyAgOSAxNzo0NzoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFdhcm4gYWJvdXQgaW1wb3J0ZWQgc3ltYm9scyB0aGF0IGFyZSBub3QgaW4KLQl0aGUgSU1QT1JUIGxpc3QgZXZlbiBpZiB0aGUgSU1QT1JUIGtleXdvcmQgaXMgbm90IHVzZWQuCi0KLQkqIG5sbWNvbnYuYyAoZGVidWcsIHVubGlua19vbl9leGl0KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZGVidWciIGFuZCAibGlua2VyIi4KLQkobWFpbik6IEhhbmRsZSAtZCBhbmQgLWwgYXJndW1lbnRzLiAgTWFrZSBjb21tYW5kIGxpbmUgaW5wdXQgYW5kCi0Jb3V0cHV0IGZpbGVzIG9wdGlvbmFsLiAgUGFyc2UgdGhlIGNvbW1hbmQgZmlsZSBiZWZvcmUgb3BlbmluZyB0aGUKLQlCRkQncywgd2hpY2ggcmVxdWlyZXMgc3RvcmluZyBtb3JlIGluZm9ybWF0aW9uIGluIGxvY2FsIHZhcmlhYmxlcy4KLQlJZiBJTlBVVCBuYW1lcyBtdWx0aXBsZSBmaWxlcywgbGluayB0aGVtIHRvZ2V0aGVyLiAgVXNlIE9VVFBVVCBmb3IKLQl0aGUgb3V0cHV0IGZpbGUgbmFtZSBpZiBub3QgbmFtZWQgb24gY29tbWFuZCBsaW5lLgotCShzaG93X3VzYWdlKTogQ2hhbmdlZCBmb3IgbmV3IG9wdGlvbnMuCi0JKGxpbmtfaW5wdXRzKTogTmV3IGZ1bmN0aW9uIHRvIGF1dG9tYXRpY2FsbHkgaW52b2tlIGxpbmtlciB0bwotCWhhbmRsZSBtdWx0aXBsZSBJTlBVVCBmaWxlcy4KLQkoY2hvb3NlX3RlbXBfYmFzZV90cnksIGNob29zZV90ZW1wX2Jhc2UsIHBleGVjdXRlKTogTmV3IGZ1bmN0aW9ucywKLQltb3N0bHkgY29waWVkIGZyb20gZ2NjL2djYy5jLgotCSogbmxtY29udi5oIChpbnB1dF9maWxlcywgb3V0cHV0X2ZpbGUpOiBEZWNsYXJlLgotCSogbmxtaGVhZGVyLnkgKGlucHV0X2ZpbGVzLCBvdXRwdXRfZmlsZSk6IERlZmluZS4KLQkoY29tbWFuZCk6IFN1cHBvcnQgSU5QVVQgd2l0aCBhIHN0cmluZ19saXN0IGFyZ3VtZW50LiAgU3VwcG9ydAotCU9VVFBVVC4KLQkoc3RyaW5nX2xpc3QpOiBSZW5hbWVkIGZyb20gbW9kdWxlX2xpc3QuCi0JKiBNYWtlZmlsZS5pbiAobmxtY29udi5vKTogRGVmaW5lIExEX05BTUUgYmFzZWQgb24KLQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLgotCi1XZWQgRGVjICA4IDEwOjA5OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtaGVhZGVyLnkgKG5sbWhlYWRlcl9pZGVudGlmeSk6IE5ldyBmdW5jdGlvbi4gIFVzZSBpdCB0byBwcmludAotCXRoZSBwcm9ncmFtIG5hbWUganVzdCBvbmNlLCBpbnN0ZWFkIG9mIHdpdGggZXZlcnkgZXJyb3IgbWVzc2FnZS4KLQotTW9uIERlYyAgNiAxNjoxMTozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobG9uZ19vcHRpb25zKTogQ2hhbmdlZCAtLWhlYWRlci1pbmZvIHRvIC0taGVhZGVyLWZpbGUKLQl0byBtYXRjaCBkb2N1bWVudGF0aW9uIGFuZCB1c2FnZSBtZXNzYWdlLgotCi1TdW4gRGVjICA1IDAxOjMxOjAxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfcmVsb2NzKTogQXZvaWQgZGVyZWZlcmVuY2luZyBhIE5VTEwgc3ltX3B0cl9wdHIKLQlpbiBhIHJlbG9jYXRpb24uCi0KLVRodSBEZWMgIDIgMTY6MDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2UgdmFyaW91cyB0eXBlcyBmcm9tIGJmZF9zaXplX3R5cGUgdG8KLQlzaXplX3QsIHNpbmNlIHRoZXkgaGF2ZSB0byBiZSBhcmd1bWVudHMgdG8gZnJlYWQgYW5kIGZ3cml0ZS4KLQlDaGFuZ2Ugc2V0IGZyb20gY2hhciAqIHRvIHVuc2lnbmVkIGNoYXIgKi4KLQkoc2VsZWN0X291dHB1dF9mb3JtYXQpOiBNYWtlIG1hY2ggYXJndW1lbnQgdW5zaWduZWQuICBIYW5kbGUKLQliZmRfYXJjaF9hbHBoYS4KLQkoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBjb3B5IHRoZSAucmVnaW5mbyBzZWN0aW9uIG9mIGFuIEVDT0ZGCi0JZmlsZS4gIENhbGwgYmZkX3NldF9yZWxvYyB0byBpbml0aWFsaXplIHRoZSByZWxvY2F0aW9uIGZpZWxkcy4KLQkoY29weV9zZWN0aW9ucyk6IERvbid0IGNvcHkgdGhlIC5yZWdpbmZvIHNlY3Rpb24gb2YgYW4gRUNPRkYgZmlsZS4KLQlDb21iaW5lIGFsbCByZWxvY3MgZm9yIGEgc2VjdGlvbi4KLQkobWFuZ2xlX3JlbG9jcyk6IENoYW5nZSB0eXBlIG9mIHJlbG9jcyB0byBwZXJtaXQgc3BlY2lmaWMKLQlmdW5jdGlvbnMgdG8gY2hhbmdlIGl0LiAgQ2FsbCBhbHBoYV9tYW5nbGVfcmVsb2NzIGZvciBhbHBoYSwKLQlkZWZhdWx0X21hbmdsZV9yZWxvY3MgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMuCi0JKGRlZmF1bHRfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4gIEFkanVzdCB0aGUgYWRkcmVzcyBvZiBhbGwKLQlyZWxvY3MgYnkgdGhlIG91dHB1dF9vZmZzZXQuCi0JKGkzODZfbWFuZ2xlX3JlbG9jcyk6IENoYW5nZSB0eXBlIG9mIHJlbG9jcyBhcmd1bWVudC4gIENhc3QgbGVuZ3RoCi0JYXJndW1lbnQgdG8gbWVtbW92ZSB0byBzaXplX3QuCi0JKGFscGhhX21hbmdsZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBOb3YgMTcgMTc6Mzg6NTggMTk5MyAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoc2VsZWN0X291dHB1dF9mb3JtYXQpOiBVc2UgbmxtMzItc3BhcmMgZm9yCi0JYmZkX2FyY2hfc3BhcmMuCi0KLVdlZCBOb3YgMTcgMTQ6NDE6MzUgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBubG1jb252LjE6ICAgYWRkZWQgbWFuIHBhZ2UKLQkqIG9iamNvcHkuMTogICBmaXhlZCBmb3JtYXQgZXJyb3JzCi0KLVdlZCBOb3YgMTcgMTI6MDM6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVXNlIENGTEFHUyBhcyB3ZWxsIGFzIExERkxBR1Mgd2hlbiBsaW5raW5nLgotCi1XZWQgTm92IDE3IDA0OjUwOjU1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3RyaW5ncy4xOiBGaXggdHlwby4KLQotTW9uIE5vdiAxNSAxMjowMzoyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBCdWlsZCAiaW5mbyIuCi0JKFZFUlNJT04pOiBVcGRhdGVkIHRvIGN5Z251cy0yLjMuMTsgMi4zIGhhcyBnb25lIG91dC4KLQotU3VuIE5vdiAxNCAwMDoyNzoyNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqZHVtcC5jIChkdW1wX3N0YWJzKTogSGFuZGxlIHN0YWJzLWluLXNvbSBhcyBpbXBsZW1lbnRlZAotCWJ5IHRoZSBuZXcgQkZEIFNPTSBhc3NlbWJsZXIuCi0KLVNhdCBOb3YgMTMgMDc6MTQ6MDUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhci4xIGMrK2ZpbHQuMSBubS4xIG9iamNvcHkuMSBvYmpkdW1wLjEgcmFubGliLjEgc2l6ZS4xCi0Jc3RyaW5ncy4xIHN0cmlwLjE6IFJlcGxhY2UgXChlbSBpbiBOQU1FIHNlY3Rpb24gd2l0aCBcLSBzbwotCW1ha2V3aGF0aXMgY2FuIGdyb2sgaXQuCi0KLVR1ZSBOb3YgIDkgMTU6MjI6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGkzODZfbWFuZ2xlX3JlbG9jcyk6IEFkanVzdCByZWxvYyBhZGRyZXNzIGJ5Ci0Jc2VjdGlvbiBvdXRwdXRfb2Zmc2V0LgotCi1GcmkgTm92ICA1IDEyOjExOjUyIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpOiAgYWRkZWQgbmxtY29udiBjaGFwdGVyCi0KLVdlZCBOb3YgIDMgMTY6MTA6NTAgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNURkxBR1MgdG8gUlVOVEVTVF9GTEFHUwotCi1XZWQgTm92ICAzIDE1OjA5OjIzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG9uJ3QgZ2V0IHJpZCBvZiBkdmkgb3IgaW5mbyBmaWxlcy4KLQotVHVlIE5vdiAgMiAxMzoyOTo1OSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoU19JU0xOSyk6IERlZmluZSBhcyAwIGlmIHRoZXJlJ3Mgbm8gU19JRkxOSy4KLQotRnJpIE9jdCAyOSAxNjowMjozNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6IE1vdmUgb2JqY29weSBkb2NzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLgotCi0JKiBvYmpkdW1wLmM6IFVzZSB4bWFsbG9jIGluc3RlYWQgb2YgbWFsbG9jLgotCi1GcmkgT2N0IDI5IDExOjExOjE0IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChpbmZvKTogUmVuYW1lIHRvIGZvcm1hdHNfaW5mby4KLQkoZHVtcF9zdGFic18xKTogQmV0dGVyIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nLgotCi1UaHUgT2N0IDI4IDE5OjQzOjE2IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAobWFpbik6IEFsd2F5cyBjcmVhdGUgdGhlIGFyY2hpdmUgd2hlbiBxdWljayBhcHBlbmRpbmcsCi0JZXZlbiBpZiBubyBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gZ2l2ZW4uCi0KLVdlZCBPY3QgMjcgMTI6MDM6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBTZXQgc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQgYW5kCi0Jc2hhcmVkRGVidWdSZWNvcmRDb3VudCBmaWVsZHMgaW4gZXh0ZW5kZWQgaGVhZGVyLgotCi0JKiBubG1jb252LmMgKG1haW4pOiBGb3JjZSBtb2R1bGVOYW1lIGZpZWxkIHRvIHVwcGVyIGNhc2UuCi0KLU1vbiBPY3QgMjUgMTY6NDU6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBHaXZlIGEgdXNhZ2UgbWVzc2FnZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkKLQlhcmd1bWVudHMuCi0KLU1vbiBPY3QgMjUgMTA6Mzc6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBSZXdyaXRlIHRvIHRha2UgYWR2YW50YWdlIG9mIFZQQVRILAotCXNvIEZTRiBkaXN0cmlidXRpb25zICh3aXRoIGluZm8gZmlsZXMgaW4gJChzcmNkaXIpKSBpbnN0YWxsCi0JcHJvcGVybHkuCi0JKERJU1RTVFVGRik6IEJ1aWxkIG5sbWhlYWRlci5jIHRvby4KLQotRnJpIE9jdCAyMiAxMTo0MzoyMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVmaW5lIGhlcmUuCi0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgImJ1Y29tbS5oIi4KLQkoeG1hbGxvYyk6IERvbid0IGRlY2xhcmUgaGVyZS4KLQkocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVmaW5lIGhlcmUuCi0JKHByb2dyYW1fdmVyc2lvbik6IEZpeGVkIHR5cGUgaW4gZGVjbGFyYXRpb24uCi0JKiBzaXplLmM6IEluY2x1ZGUgImJ1Y29tbS5oIi4KLQkocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVjbGFyZSBoZXJlLgotCi1GcmkgT2N0IDIyIDE0OjEwOjQxIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZnByaW50Zik6IGhpZGUgZGVjbGFyYXRpb24gaW4gRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVECi0KLUZyaSBPY3QgIDEgMTI6NDM6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGkzODZfbWFuZ2xlX3JlbG9jcyk6IFJlc29sdmUgYW5kIHJlbW92ZSBQQyByZWxhdGl2ZQotCXJlbG9jcyBhZ2FpbnN0IGRlZmluZWQgc3ltYm9scyBpbiB0aGUgc2FtZSBzZWN0aW9uLgotCi1UaHUgU2VwIDMwIDE2OjQ2OjI2IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChiaW51dGlscy5kdmkpOiB1c2UgVEVYSURJUiB0byBmaW5kIHRleGluZm8udGV4Ci0KLVNhdCBTZXAgMjUgMTg6MDk6MjkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKHNpbXBsZV9jb3B5LCBzbWFydF9yZW5hbWUpOiBOZXcgZnVuY3Rpb25zLgotCShtYWluKTogVXNlIHRoZW0uCi0KLUZyaSBTZXAgMjQgMTU6Mzg6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4sIGRpc3RjbGVhbik6IFJlY3Vyc2UgaW50byB0ZXN0c3VpdGUuCi0KLVRodSBTZXAgMjMgMDE6MDU6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb25zLCBjb3B5X3NlY3Rpb25zKTogSWYgc3RyaXBwaW5nLCBkb24ndAotCWNvcHkgU0VDX0RFQlVHR0lORyBzZWN0aW9ucy4KLQkqIG9iamR1bXAuYyAoZHVtcF9oZWFkZXJzKTogUHJpbnQgU0VDX0RFQlVHR0lORyBmbGFnLgotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTWVudGlvbiAtLXN0YWJzLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogQ29weSBhbGwgYXBwbGljYWJsZSBmaWxlIGZsYWdzLgotCShjb3B5X2ZpbGUpOiBEb24ndCBjb3B5IEVYRUNfUCBzcGVjaWFsbHkgaGVyZS4KLQotTW9uIFNlcCAyMCAxOToyODo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEFkanVzdCBkYXRhIHNlY3Rpb24gc2l6ZSB0byBjb3JyZXNwb25kIHRvIGJzcwotCWFsaWdubWVudCBhZGp1c3RtZW50LiAgQ2xlYXIgQlNGX1NFQ1RJT05fU1lNIGlmIHN5bWJvbCBpcyBtb3ZlZCB0bwotCWEgZGlmZmVyZW50IHNlY3Rpb24uICBVc2UgdGltZV90IGZvciB0aW1lIHZhcmlhYmxlLgotCShzZXR1cF9zZWN0aW9ucyk6IE9ubHkgcHV0IHNlY3Rpb25zIHdpdGggY29udGVudHMgaW4gb3V0cHV0IE5MTS4KLQkoaTM4Nl9tYW5nbGVfcmVsb2NzKTogTm8gc3ltYm9scyBhcmUgY29tbW9uIGF0IHRoaXMgcG9pbnQuICBBZGQKLQljYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotRnJpIFNlcCAxMCAxMTowMDo0MCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogTWFkZSB0aGUgLS1zdGFicyBvcHRpb24gd29yayBmb3Igc3RhYnMtaW4tY29mZi4KLQkoRUxGX1NUQUJfRElTUExBWSk6IFJlbW92ZWQuCi0JKGR1bXBfZWxmX3N0YWJzKTogUmVuYW1lZCB0byBkdW1wX3N0YWJzLCBjaGFuZ2VkIHRvIHJ1biBmb3IKLQlhbnkgb2JqZWN0IGZpbGUgZm9ybWF0LgotCShkdW1wX2VsZl9zdGFic18xKTogUmVuYW1lZCB0byBkdW1wX3N0YWJzXzEsIGFkZGVkIGNhbGxzIHRvCi0JZ2VuZXJpYyBCRkQgcm91dGluZXMgZm9yIG5vbi1FTEYgY2FzZSwgY2hhbmdlZCBmb3JtYXQgb2YgbWVzc2FnZQotCWZvciBuby1zZWN0aW9uLWZvdW5kIGNhc2UuCi0JKGRpc3BsYXlfYmZkKTogQWx3YXlzIGNhbGwgZHVtcF9zdGFicyBpZiByZXF1ZXN0ZWQuCi0JKGR1bXBfZGF0YSk6IENhbGwgYmZkX3NlY3Rpb25fc2l6ZSB0byBnZXQgc2VjdGlvbiBzaXplLgotCi1GcmkgU2VwIDEwIDA4OjEyOjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBwdXQgc3RyaW5ncyBpbiB0b29sZGlyL2Jpbi4KLQotTW9uIFNlcCAgNiAxNTozOTowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAodG90YWxfYnNzX3NpemUpOiBSZW1vdmVkLgotCShtYWluKTogU2V0IHRoZSBic3Mgdm1hIHRvIGFsd2F5cyBmb2xsb3cgdGhlIGRhdGEgc2VjdGlvbi4gIE1vdmUKLQlzeW1ib2xzIGludG8gbmV3IHNlY3Rpb25zLCBhbmQgYWRqdXN0IHZhbHVlcyBieSBvdXRwdXRfb2Zmc2V0LgotCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGNvcHkgYWxsIHNlY3Rpb25zLCBidXQgaW5zdGVhZCBwb2ludCBhbGwKLQl0ZXh0IHNlY3Rpb25zIHRvIC50ZXh0LCBhbGwgZGF0YSBzZWN0aW9ucyB0byAuZGF0YSwgYW5kIGFsbCBic3MKLQlzZWN0aW9ucyB0byAuYnNzLgotCShjb3B5X3NlY3Rpb25zKTogQWRqdXN0IGFjY29yZGluZ2x5LgotCi1UaHUgU2VwICAyIDEyOjM0OjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCU9ubHkgYnVpbGQgbmxtY29udiBpZiBjb25maWd1cmVkIGZvciBhIE5ldFdhcmUgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBJZiB3ZSBoYXZlIHNvbWUgKi0qLW5ldHdhcmUqIHRhcmdldCwgb3IgYXJlIHVzaW5nCi0JYWxsIHRhcmdldHMsIHNldCBCVUlMRF9OTE1DT05WIHRvICQoTkxNQ09OVl9QUk9HKSBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChQUk9HUyk6IFVzZSAkKEJVSUxEX05MTUNPTlYpIHJhdGhlciB0aGFuCi0JJChOTE1DT05WX1BST0cpLgotCi1UdWUgQXVnIDMxIDE0OjEzOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChBUkNIX2FsbCk6IERlZmluZSBBUkNIX2hwcGEgdG9vLgotCShkdW1wX2hlYWRlcnMpOiBEb24ndCB0ZXN0IGZvciBTRUNfQkFMSUdOIGlmIGl0J3Mgbm90IGRlZmluZWQgYnkKLQliZmQuaC4KLQotVHVlIEF1ZyAzMSAxMzoyOToxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvcmNlIGNyZWF0aW9uIG9mIC5ic3Mgc2VjdGlvbi4gIFNldCB1cCB0aGUKLQlzZWN0aW9ucyBiZWZvcmUgbG9va2luZyBhdCB0aGUgc3ltYm9scy4gIE1vdmUgYWxsIGNvbW1vbiBzeW1ib2xzCi0JaW50byAuYnNzIHNlY3Rpb24uICBBdXRvbWF0aWNhbGx5IGRlZmluZSBfZWRhdGEgYW5kIF9lbmQuICBPbmx5Ci0JZXhwb3J0IHN5bWJvbHMgaW4gdGhlIGV4cG9ydCBsaXN0LCB3aXRoIG11bHRpcGxlIHByZWZpeGVzIGlmCi0JbmVjZXNzYXJ5LiAgV2FybiBpZiBubyB2ZXJzaW9uLiAgQWx3YXlzIGNyZWF0ZSBleHRlbmRlZCBoZWFkZXIuCi0JU2V0IGRhdGUgYXV0b21hdGljYWxseSBpZiBub3QgYWxyZWFkeSBzZXQuCi0JKHNldHVwX3NlY3Rpb25zKTogQ291bnQgc2l6ZSBvZiBic3Mgc2VjdGlvbnMuCi0JKG1hbmdsZV9yZWxvY3MsIGkzODZfbWFuZ2xlX3JlbG9jcyk6IEFjY2VwdCBzZWN0aW9uIGFyZ3VtZW50LCBhbmQKLQl0YWtlIHJlbG9jX2NvdW50IGFzIGEgY2hhbmdlYWJsZSBwb2ludGVyOyBjaGFuZ2VkIGNhbGxlcnMuCi0JKGkzODZfbWFuZ2xlX3JlbG9jcyk6IFJlbW92ZSBQQyByZWxhdGl2ZSByZWxvY3Mgd2l0aGluIGEgc2VjdGlvbiwKLQlhcyB0aGV5IHJlcXVpcmUgbm8gYWRqdXN0bWVudC4KLQkqIG5sbWhlYWRlci55OiBGaXhlZCBtZW1vcnkgYWxsb2NhdGlvbiB0aHJvdWdob3V0OiB0b2tlbiBTVFJJTkcgaXMKLQlub3cgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBhbmQgZnJlZWQgaWYgbm90IG5lZWRlZC4gIE51bGwKLQl0ZXJtaW5hdGVkIGNvcHlyaWdodCBtZXNzYWdlLiAgQWNjZXB0IHZlcnNpb24gd2l0aCBvbmx5IHR3bwotCXN0cmluZ3MuCi0JKHN5bWJvbF9saXN0X29wdCk6IE5ldyBub250ZXJtaW5hbCwgZWl0aGVyIHN5bWJvbF9saXN0IG9yIGVtcHR5LgotCShzeW1ib2xfbGlzdCk6IFVzZSBsZWZ0IHJlY3Vyc2lvbiB0byBhdm9pZCBvdmVyZmxvd2luZyBwYXJzZXIKLQlzdGFjay4KLQkoeXlsZXgpOiBSZWFycmFuZ2VkIGJlZ2lubmluZyBvZiBsaW5lIGNoZWNrLiAgQWNjZXB0IHF1b3RlZAotCXN0cmluZ3MgdXNpbmcgc2luZ2xlIHF1b3Rlcy4gIEVuZCBnZW5lcmljIGFyZ3VtZW50IGF0IGNvbW1lbnQKLQljaGFyYWN0ZXIgb3IgcGFyZW50aGVzZXMuCi0JKHN0cmluZ19saXN0X2FwcGVuZCk6IEZpeGVkLgotCShzdHJpbmdfbGlzdF9hcHBlbmQxKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBidWNvbW0uaDogVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHhyZWFsbG9jIGlzIFBUUiwgbm90IGNoYXIgKi4KLQkqIGJ1Y29tbS5jICh4cmVhbGxvYyk6IFVzZSBQVFIgcmF0aGVyIHRoYW4gY2hhciAqLgotCSogTWFrZWZpbGUuaW4gKG9iamR1bXAubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5zdGF0dXMgdG8gbm90aWNlCi0JLS13aXRoLXRhcmdldHMgY2hhbmdlcy4KLQkobmxtY29udi5vKTogRGVwZW5kIHVwb24gYnVjb21tLmguCi0KLVR1ZSBBdWcgMTcgMDk6NDY6MDEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHBhc3MgY3B1IHRvIGNvbmZpZy5iZmQuCi0KLVRodSBBdWcgMTIgMTY6NDM6MDQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoJChOTV9QUk9HKSk6IERlcGVuZCBvbiBkZW1hbmdsZS5vLgotCShkZW1hbmdsZS5vKTogTmV3IHRhcmdldC4KLQkoY3BsdXMtZGVtLm8pOiBEZXBlbmQgb24gaXQsIHRvIGZvcmNlIGNvbXBpbGF0aW9uIG9yZGVyIHdoZW4gZG9pbmcKLQlwYXJhbGxlbCBjb21waWxlcy4KLQotCSogbm0uYyAocHJpbnRfc3ltYm9sX2luZm9fe2JzZCxzeXN2LHBvc2l4fSk6IFRha2UgYSBiZmQgYXJnLgotCShzdHJ1Y3Qgb3V0cHV0X2ZucyBwcmludF9zeW1ib2xfaW5mbyk6IERpdHRvLgotCShsb25nX29wdGlvbnMsIHVzYWdlLCBtYWluKTogQWRkIC1DIC0tZGVtYW5nbGUgb3B0aW9uLgotCShwcmludF9zeW1uYW1lKTogTmV3IGZ1bmN0aW9uLCBkZW1hbmdsaW5nIGlmIHJlcXVlc3RlZC4KLQkocHJpbnRfc3ltYm9scywgcHJpbnRfc3ltYm9sX2luZm9fe2JzZCxzeXN2LHBvc2l4fSk6IFVzZSBpdC4KLQotV2VkIEF1ZyAxMSAyMjo1NzoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBQdXQgQ0ZMQUdTIGxhc3QgaW4gY29tcGlsYXRpb24gcnVsZXMgYW5kIG9taXQgZnJvbQotCWxpbmtpbmcgcnVsZXMuICBVc2UgQVJDSERFRlMgdG8gY29tcGlsZSBvYmpkdW1wLmMuCi0JVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGNvbmZpZ3VyZS5pbjogQ29uc3RydWN0IEFSQ0hERUZTIGJhc2VkIG9uIHRoZSBCRkQgdGFyZ2V0IG1ha2VmaWxlCi0JZnJhZ21lbnRzLgotCSogb2JqZHVtcC5jOiBDb25kaXRpb25hbGl6ZSBjYWxscyB0byB0aGUgcHJpbnRfaW5zbl9BUkNIIGZ1bmN0aW9ucwotCWFjY29yZGluZyB0byBBUkNIREVGUy4KLQotVGh1IEF1ZyAxMiAwODowNjoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyLmM6IFJlbW92ZWQgb2Jzb2xldGUgYW5kIG5vbi1mdW5jdGlvbmFsIEdOVTk2MCBjb2RlLgotCi1XZWQgQXVnIDExIDEzOjA4OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2l6ZS5jIChiZXJrZWxleV9zdW0pOiBOZXcgZnVuY3Rpb24uCi0JKGJzc3NpemUsIGRhdGFzaXplLCB0ZXh0c2l6ZSk6IE5ldyBnbG9iYWwgdmFyaWFibGVzLgotCShic3Nfc2VjdGlvbl9uYW1lLCBkYXRhX3NlY3Rpb25fbmFtZSwgdGV4dF9zZWN0aW9uX25hbWUpOiBSZW1vdmVkLgotCShwcmludF9iZXJrZWxleV9mb3JtYXQpOiBNYXAgYmVya2VsZXlfc3VtIG92ZXIgYWxsIHRoZSBzZWN0aW9ucywKLQlyYXRoZXIgdGhhbiBvbmx5IHJlcG9ydGluZyBzaXplcyBvZiBzcGVjaWZpY2FsbHkgbmFtZWQgc2VjdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoJChPQkpEVU1QX1BST0cpKTogUmVtb3ZlZCBkZXBlbmRlbmN5IG9uIHNpemUuby4KLQotVHVlIEF1ZyAxMCAxMDo0NjowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYywgbmxtY29udi5oLCBubG1oZWFkZXIueTogTmV3IGZpbGVzIGZvciBwcm9ncmFtIHRvCi0JY29udmVydCBvYmplY3QgZmlsZXMgaW50byBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMuCi0JKiBNYWtlZmlsZS5pbiAoTkxNQ09OVl9QUk9HKTogTmV3IG1hY3JvLCBkZWZpbmUgdG8gYmUgbmxtY29udi4KLQkoUFJPR1MpOiBBZGQgTkxNQ09OVl9QUk9HLgotCShubG1oZWFkZXIuYywgbmxtaGVhZGVyLm8sIG5sbWNvbnYubywgJChOTE1DT05WX1BST0cpKTogTmV3Ci0JdGFyZ2V0cy4KLQotVGh1IEF1ZyAgNSAxNTo0ODozMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgTUFLRU9WRVJSSURFUyB0byBhbiBlbXB0eSBzdHJpbmcKLQotV2VkIEF1ZyAgNCAxNzowODowOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoY29weV9maWxlKTogTWFrZSBmYWlsdXJlcyB0byBwcm9jZXNzIGEgZmlsZSBub25mYXRhbC4KLQotTW9uIEF1ZyAgMiAxMToyODoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6IEFkZCAtQiBvcHRpb24sIGxpa2UgLS1mb3JtYXQ9YnNkLgotCi1UdWUgSnVsIDI3IDE2OjI5OjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChjb3B5X2ZpbGUpOiBJZiB0aGUgZmlsZSBpcyBuZWl0aGVyIGFuIG9iamVjdCBub3IgYW4KLQlhcmNoaXZlLCBnaXZlIGFuIGVycm9yIHJhdGhlciB0aGFuIHJldHVybmluZyBzdWNjZXNzLgotCi1Nb24gSnVsIDE5IDE2OjEzOjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBQcmVmZXIgbm9uLWxvY2FsIHN5bWJvbHMgb3ZlcgotCWxvY2FsIG9uZXMsIGFuZCBlc3BlY2lhbGx5IGRpc2NyaW1pbmF0ZSBhZ2FpbnN0IGRlYnVnZ2luZyBzeW1ib2xzLgotCUFsc28sIGZvciByZWxvY2F0ZWFibGUgZmlsZXMsIHRyeSB0byBmaW5kIGEgc3ltYm9sIGluIHRoZSBjdXJyZW50Ci0Jc2VjdGlvbiwgaW5zdGVhZCBvZiBwaWNraW5nIG9uZSBmcm9tIHNvbWUgcmFuZG9tIHNlY3Rpb24gd2l0aCBhCi0JY29udmVuaWVudCB2YWx1ZSAocmVhZCwgc2VjdGlvbiBvZmZzZXQpLgotCShkaXNhc3NlbWJsZV9kYXRhKTogQ2FzdCBhcmd1bWVudCB0byBtYWxsb2MgdG8gc2l6ZV90IGZpcnN0LgotCShkdW1wX2RhdGEpOiBMaWtld2lzZS4KLQkoZHVtcF9yZWxvY3MpOiBJZiBhIHNpbmdsZSBzZWN0aW9uIG5hbWUgaXMgc3BlY2lmaWVkLCBzaG93IHJlbG9jcwotCW9ubHkgZm9yIHRoYXQgc2VjdGlvbi4gIE90aGVyd2lzZSwgc2lsZW50bHkgb21pdCBzZWN0aW9ucyB3aXRob3V0Ci0JcmVsb2NzLiAgRm9ybWF0IHRhYmxlIG5pY2VseSBldmVuIGlmIHZhbHVlcyBhcmUgcHJpbnRlZCB1c2luZyAxNgotCWRpZ2l0cyBpbnN0ZWFkIG9mIDguCi0KLUZyaSBKdWwgMTYgMTU6MTk6NTkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBubS5jOiBDaGFuZ2VzIGZvciBmaW5hbCB2ZXJzaW9uIG9mIFBPU0lYLjIuCi0JKHByaW50X3N5bWJvbF9maWxlbmFtZV97YnNkLHN5c3YscG9zaXh9KTogTmV3IGZ1bmN0aW9ucy4KLQkoZm9ybWF0cyk6IEFkZCBhbiBlbGVtZW50IGZvciBhIHBvaW50ZXIgdG8gdGhlbS4KLQkocHJpbnRfc3ltYm9scyk6IENhbGwgaXQuCi0JKHByaW50X29iamVjdF9maWxlbmFtZV9wb3NpeCwgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXgpOiBQcm9kdWNlCi0Jb3V0cHV0IGFjY29yZGluZyB0byBuZXcgUE9TSVguMiBzcGVjLgotCi0JKiBzdHJpbmdzLmMgKHByaW50X3N0cmluZ3MpOiBIYW5kbGUgU1RSRUFNIGJlaW5nIE5VTEwuCi0JKHN0cmluZ3NfYV9zZWN0aW9uKTogUGFzcyBhIE5VTEwuCi0JKG1haW4pOiBEb24ndCBvcGVuIC9kZXYvbnVsbC4KLQotVGh1IEp1bCAxNSAxMjo0NDowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSB0aGUgbTg4ay4KLQkoZGlzcGxheV9iZmQpOiBVc2UgYmZkX2Vycm1zZywgcmF0aGVyIHRoYW4ganVzdCBjbGFpbWluZyB0aGF0IHRoZQotCWJmZCBpcyBub3QgYW4gb2JqZWN0IGZpbGUuCi0KLU1vbiBKdWwgMTIgMTc6NTU6MzQgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogbWFrZSB3b3JrIGFnYWluIGJ5IG5hbWluZyBkaXJlY3RvcmllcwotCSAgZXhwbGljaXRseSByYXRoZXIgdGhhbiBkZXBlbmRpbmcgb24gdW5kZWZpbmVkIG1hY3Jvcy4KLQkgIChJTlNUQUxMX1hGT1JNKTogY29ycmVjdCBiYWQgaW5zdGFsbCB0YXJnZXQuCi0KLUZyaSBKdWwgIDIgMTY6NTg6MzQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLmM6IERvYyBmaXhlcy4KLQotU3VuIEp1biAyNyAxMzozNToyNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBOb3RlIGRlcGVuZGVuY2llcyBvbiBidWNvbW0uaC4KLQkoY3BsdXMtZGVtLm8pOiBMaW5rIGMrK2ZpbHQgd2l0aCB2ZXJzaW9uLm8uCi0KLQkqIHN0cmluZ3MuYzogSW5jbHVkZSBidWNvbW0uaCBhbmQgYWRkIHByb3RvdHlwZXMgdG8gb3RoZXIgZGVjbHMuCi0JUmVtb3ZlIC1oIG9wdGlvbi4KLQotCSogYnVjb21tLmg6IERlY2xhcmUgeHJlYWxsb2MuCi0KLQkqIG5tLmMsIG9iamNvcHkuYywgb2JqZHVtcC5jLCBzaXplLmMsIHN0cmluZ3MuYyAobWFpbiwgdXNhZ2UpOiBBZGQKLQktLWhlbHAgb3B0aW9uLiAgUHV0ICJHTlUiIGluIHRoZSB2ZXJzaW9uIG1lc3NhZ2UuCi0JKHVzYWdlKTogVGFrZSBzdHJlYW0gYW5kIGV4aXQgc3RhdHVzIGFzIGFyZ3MuCi0JKG1haW4pOiBQYXNzIG5ldyBhcmdzIHRvIHVzYWdlLgotCi1GcmkgSnVuIDI1IDIzOjEyOjEyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3RyaW5ncy5jLCBzdHJpbmdzLjE6IE5ldyBmaWxlcy4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IHN0cmluZ3MuCi0JKiBNYWtlZmlsZS5pbjogQWRkIHJ1bGVzIGZvciBpdC4KLQotRnJpIEp1biAyNSAyMDo0NDo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBVc2Ugc2l6ZS1pbmRlcGVuZGVudCBiZmQgZWxmIHNlY3Rpb24gbmFtZXMuCi0KLVN1biBKdW4gMjAgMjM6MDk6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogSGFuZGxlIHdpZGUgb2Zmc2V0cyBieQotCWNhbGxpbmcgc3ByaW50Zl92bWEuCi0KLUZyaSBKdW4gMTggMTQ6Mjk6MTIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc3ltczIpOiAgUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUuCi0JKiBvYmpkdW1wLmMgKHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpOiAgTmV3IGZ1bmN0aW9uLgotCSogb2JqZHVtcC5jIChjb21wKTogIFNpbXBsaWZ5LgotCSogb2JqZHVtcC5jIChkaXMtYXNzZW1ibGVfZGF0YSk6ICBNYWtlIHNpbXBsZXIgYW5kIG1vcmUKLQllZmZpY2llbnQgaG93IHdlIGZpbHRlciBvdXQgdXNlbGVzcyBzeW1ib2xzOiAgSnVzdCBmaWx0ZXIKLQlCRUZPUkUgdGhlIHNvcnQgKHVzaW5nIHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpLgotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiAgU2ltcGxpZnkuCi0JQ2hhbmdlIG91dHB1dCBzeW50YXggdG8gbWF0Y2ggZ2RiLgotCi1UaHUgSnVuIDE3IDE2OjUzOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KLQl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCi0KLU1vbiBKdW4gMTQgMTI6MTM6MjIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCwgaW5zdGFsbC1pbmZvKTogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0LAotCXVzZSBJTlNUQUxMX1hGT1JNOyBkZWZpbmUgSU5TVEFMTF9YRk9STQotCi1UaHUgSnVuIDEwIDE3OjI5OjIxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogIEZpeCBiYWQgc2l6ZSBwYXNzZWQgdG8geG1hbGxvYygpLgotCi1Nb24gSnVuICA3IDEyOjQxOjEyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogIEFkZCAtSS4uL2JmZCBmb3Igc3lzZGVwLmggYW5kIGJmZC5oLgotCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgdG8gY29uZmlndXJlIHRvIGdldCBzeXNkZXAuaC4KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiAgRml4IHN5bWJvbCB0YWJsZSBoYW5kbGluZy4KLQotRnJpIEp1biAgNCAxNzoyMDowMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6ICBDYW5ub3QgZmlsdGVyIHRoZSBzeW1ib2xzCi0JaW4gcGxhY2UsIGJlY2F1c2UgdGhhdCBjb25mdXNlcyB0aGUgcmVsb2NzLCBzbyB0YWtlIHNlcGFyYXRlCi0JcGFyYW1ldGVyIGZvciBvdXRwdXQgYXJyYXkuCi0JKiBvYmpjb3B5LmMgKHN5bXBwKTogIE1ha2UgdHdvIHZhcmlhYmxlczogaXN5bXBwIGFuZCBvc3ltcHAuCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogIEFsbG9jYXRlIHNlcGFyYXRlIGFycmF5IChvc3ltcHApCi0JZm9yIGZpbHRlcmVkIHN5bWJvbHMuCi0KLUZyaSBKdW4gIDQgMTA6NTE6NDQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlIHJlY3Vyc2lvbiB0ZXN0IHRvIHByZXNlbmNlIG9mIGEgY29uZmlndXJlZAotCXRlc3RzdWl0ZSBkaXJlY3RvcnkKLQotVGh1IEp1biAgMyAxNDowNTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh1bmRlcnNjb3JlLmMpOiBIYWNrIHRoZSBiYWNrcXVvdGVkIGNvbW1hbmQgc28gaXQKLQlkb2Vzbid0IGNhdXNlIFNvbGFyaXMgbWFrZSB0byBib21iLgotCi1UaHUgSnVuICAzIDEwOjQwOjE5IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgYWRkZWQgYysrZmlsdCBhbmQgb2JqY29weSB0byBNQU5QQUdFUyB2YXJpYWJsZQotCi1UaHUgSnVuICAzIDAwOjMyOjUyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbmFtZSBMT0FETElCRVMgdG8gRVhUUkFMSUJTCi0KLVdlZCBKdW4gIDIgMTg6MzA6MjQgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogYysrZmlsdC4xLCBvYmpjb3B5LjE6ICBuZXcgbWFuIHBhZ2VzCi0KLUZyaSBNYXkgMjggMTU6MDE6MjQgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6ICBBbHNvIGluc3RhbGwgYXIgYW5kIHJhbmxpYiBpbgotCSQodG9vbGRpcikvYmluOyAgbmVlZGVkIGZvciBidWlsZGluZyBsaWJnY2MuYS4KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogIEZpeCB0aGUgY2hlY2sKLQkiY29pbmNpZGVudGFsIiBsYWJlbCBtYXRjaGVzIGJ5IGRpcy1hbGxvd2luZyB1bmRlZmluZWQKLQlvciBjb20gc3ltYm9scy4KLQotVGh1IE1heSAyNyAxNjo1ODozMSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0gICAgICAgICogYml1dGlscy50ZXhpOiAgcmV2aXNlZCBjKytmaWx0IGNoYXB0ZXIKLQotV2VkIE1heSAyNiAxNzoyNDoxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIENDIGFuZCBDRkxBR1MuCi0KLVR1ZSBNYXkgMjUgMDA6MjY6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc2x1cnBfc3ltdGFiKTogUHJpbnQgd2FybmluZyBmb3IgYmFkIHN5bWJvbCB0YWJsZS4KLQkoYmZkX2VsZjMyX2ZpbmRfc2VjdGlvbiwgRWxmMzJfSW50ZXJuYWxfU2hkcik6IFVwZGF0ZWQKLQlkZWNsYXJhdGlvbnMgYW5kIHVzZXMuCi0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBEb24ndCBidWlsZCBiaW51dGlscy5tbS4KLQotRnJpIE1heSAyMSAxMDo1MToxOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6IEFkZCAtZi8tLWZvcm1hdCwgLVAvLS1wb3J0YWJpbGl0eSwgLXQvLS1yYWRpeCBvcHRpb25zLgotCU1ha2UgZ2xvYmFsIHZhcmlhYmxlcyBzdGF0aWMuCi0JKG1haW4pOiBNYWtlIC12IGxpa2UgLW4sIG5vdCAtViwgYW5kIG1ha2UgLUEgbGlrZSAtbywgZm9yIFBPU0lYLjIuCi0JKHNldF9wcmludF9yYWRpeCwgc2V0X291dHB1dF9mb3JtYXQsCi0JcHJpbnRfe29iamVjdF9maWxlbmFtZSxhcmNoaXZlX2ZpbGVuYW1lLGFyY2hpdmVfbWVtYmVyLHN5bWJvbF9pbmZvfQotCXtic2Qsc3lzdixwb3NpeH0pOiBOZXcgZnVuY3Rpb25zLgotCShkaXNwbGF5X2ZpbGUsIHByaW50X3N5bWJvbHMpOiBDYWxsIHRoZW0uCi0KLQkqIGFyLmM6IEltcHJvdmUgZXJyb3IgbWVzc2FnZXMuCi0KLQkqIG5tLmMgKG1haW4pOiBIYW5kbGUgbG9uZyBvcHRpb25zIHRoYXQganVzdCBzZXQgYSBmbGFnLgotCi0JKiBubS5jIChtYWluKSwgYXIuYyAoZG9fc2hvd192ZXJzaW9uKSwgb2JqY29weS5jIChtYWluKSwgc2l6ZS5jCi0JKG1haW4pOiBFeGl0IGFmdGVyIHByaW50aW5nIHRoZSB2ZXJzaW9uIG51bWJlciwgcGVyIHRoZSBHTlUgY29kaW5nCi0Jc3RhbmRhcmRzLgotCi1Nb24gTWF5IDE3IDEzOjIwOjI1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBSRUFETUUsIE1ha2VmaWxlLmluOiAgTWlub3IgdXBkYXRlcyBmb3IgMi4yLgotCi1GcmkgTWF5IDE0IDExOjEyOjI2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodW5kZXJzY29yZS5jKTogIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUKLQkodXNpbmcgbm0pIGEgZmlsZSB3aXRoIHRoZSB2YXJpYWJsZSBwcmVwZW5kc191bmRlcnNjb3JlLgotCSogTWFrZWZpbGUuaW4gKGMrK2ZpbHQpOiAgTGluayB1bmRlcnNjb3JlLm8gd2l0aCBjcGx1cy1kZW0ubwotCXNvIHRoYXQgaW5pdGlhbCB1bmRlcnNjb3JlcyBnZXQgcmVtb3ZlZCBpZmYgYXBwcm9wcmlhdGUuCi0JKiBiaW51dGlscy50ZXhpOiAgUHJlbGltaW5hcnkgZG9jdW1lbnRhdGlvbiBmb3IgYysrZmlsdC4KLQkqIE1ha2VmaWxlLmluLCBiaW51dGlscy50ZXhpOiAgU2V0IHRvIHZlcnNpb24gMi4yLgotCi0JKiBORVdTOiAgTWVudGlvbiBjb3B5LT5vYmpjb3B5IHJlbmFtaW5nIGFuZCBuZXcgYysrZmlsdCBwcm9ncmFtLgotCi1XZWQgTWF5IDEyIDEyOjA1OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNwbHVzLWRlbS5vLCAkKERFTUFOR0xFUl9QUk9HKSk6IEJ1aWxkIHRoZQotCWRlbWFuZ2xlciB2aWEgY3BsdXMtZGVtLm8sIHJhdGhlciB0aGFuIGRpcmVjdGx5IGZyb20gdGhlIC5jIGZpbGUuCi0KLQkqIG9iamNvcHkuYzogUmVuYW1lZCBmcm9tIGNvcHkuYywgdXBkYXRlZCBjb21tZW50cyBhY2NvcmRpbmdseS4KLQkqIE1ha2VmaWxlLmluLCBiaW51dGlscy50ZXhpOiBSZW5hbWVkIGNvcHkgdG8gb2JqY29weS4KLQkqIGlzLXN0cmlwLmMsIG1heWJlLXN0cmlwLmMsIG5vdC1zdHJpcC5jOiBVcGRhdGVkIGNvbW1lbnRzIGZvcgotCXJlbmFtZSBvZiBjb3B5IHRvIG9iamNvcHkuCi0KLU1vbiBNYXkgMTAgMTc6MjA6MTggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGkgKHN0cmlwLCAtdiBvcHRpb24pOiAgRml4IHR5cG8uCi0KLUZyaSBNYXkgIDcgMTM6NTc6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCk6IERlZmluZS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBSVU5URVNULgotCi1UdWUgTWF5ICA0IDEwOjA2OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFTUFOR0xFUl9QUk9HKTogTmFtZSBpdCBjKytmaWx0LgotCShQUk9HKTogQWxzbyBidWlsZCBhbmQgaW5zdGFsbCBDT1BZX1BST0cuCi0KLU1vbiBNYXkgIDMgMTk6MTE6NDggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIGRlZmluaXRpb24gb2YgJCh0b29sZGlyKSB0byBtYXRjaCBGU0YuCi0KLVdlZCBBcHIgMjggMjM6NDE6MzIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzaXplLmMgKHVzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KLQkobWFpbik6IENsZWFuIHVwIG9wdGlvbiBwYXJzZXIuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgotCShkaXNwbGF5X2ZpbGUpOiBQcmludCBwcm9ncmFtIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQliZGZfcGVycm9yLgotCi0JKiBubS5jICh1c2FnZSk6IEFkZCBtaXNzaW5nIG9wdGlvbnMuCi0JKG1haW4pOiBDbGVhbiB1cCBvcHRpb24gcGFyc2VyLgotCShkaXNwbGF5X2ZpbGUpOiBQcmludCBwcm9ncmFtIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQliZGZfcGVycm9yLgotCi0JKiBjb3B5LmMgKGNvcHlfdXNhZ2UsIHN0cmlwX3VzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KLQotCSogYXIuYyAodXNhZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKG1haW4pOiBDYWxsIGl0LgotCShvcGVuX2luYXJjaCwgZG9fcXVpY2tfYXBwZW5kKTogUHJpbnQgcHJvZ3JhbSBuYW1lIGJlZm9yZSBjYWxsaW5nCi0JYmRmX3BlcnJvci4KLQotVGh1IEFwciAyMiAxNTowMTozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG5tLmMgKG1haW4pOiBBY2NlcHQgYW5kIGlnbm9yZSAtQSBhbmQgLUIgZm9yIE1JUFMgY29tcGF0aWJpbGl0eS4KLQotTW9uIEFwciAxOSAxNDowNjo1OSAxOTkzICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBGTEFHU19UT19QQVNTIHNvIHRlc3RzIGdldCBydW4gb24gZnJlc2hseQotCWJ1aWx0IGJpbmFyaWVzIGlmIHRoZXkgZXhpc3QuIChvdGhlcndpc2UgdGhlIHBhdGgpCi0KLVdlZCBBcHIgIDcgMjI6MjI6NTAgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBjaGVjayB0YXJnZXQgdG8gdXNlIERlamFHbnUuCi0KLVRodSBBcHIgIDEgMTI6Mzc6MTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgYW0yOWstcGluc24uYywgaTk2MC1waW5zbi5jLgotCW9iamR1bXAuYzogYTI5ayBhbmQgaTk2MCBhcmUgYGRpc2Fzc2VtYmxlJyBub3QgYHByaW50Jy4KLQotCSogb2JqZHVtcC5jOiBSZW5hbWUgcHJpbnRfYWRkcmVzcyB0byBvYmpkdW1wX3ByaW50X2FkZHJlc3MKLQlhbmQgY2hhbmdlIHBhcmFtZXRlcnMuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBVc2Ugb2JqZHVtcF9wcmludF9hZGRyZXNzLgotCi1XZWQgTWFyIDMxIDEwOjI1OjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBwcmludF9pbnNuX3NwYXJjIGlzIG5vdyBhCi0JYGRpc2Fzc2VtYmxlJyBub3QgYSBgcHJpbnQnLgotCU1ha2VmaWxlLmluOiBSZW1vdmUgc3BhcmMtcGluc24uYyAobm93IGluIGxpYm9wY29kZXMuYSkuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFVzZSBuZXcgcmVhZF9tZW1vcnlfZnVuYyBzdHVmZi4KLQotVGh1IE1hciAyNSAxMDozODoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZnByaW50Zik6IERlY2xhcmF0aW9uIG9mIHZhcmlhZGljIGZ1bmN0aW9uIGhhZCBiZXR0ZXIKLQliZSBhIHByb3RvdHlwZSBmb3IgQU5TSSBDIHN5c3RlbXMuCi0KLU1vbiBNYXIgMjIgMjM6MTk6NDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVuYW1lIHRlc3QtaW5zdGFsbCB0byBpbnN0YWxsLWNoZWNrCi0KLUZyaSBNYXIgMTkgMTQ6NDA6MDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEFkZCBIODUwMC4KLQotRnJpIE1hciAxOSAxMDo1Njo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IE1lbnRpb24gbG9uZyBvcHRpb25zLgotCi1UaHUgTWFyIDE4IDE0OjIyOjE3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogIE1vZGlmeSBiZWhhdmlvciBvZiAtbyBmbGFnIGZvciBhcmNoaXZlcyB0byBtYXRjaAotCUJTRDQuNCBhbmQgU3Vub3MgNDogIFByZWZpeCBhcmNoaXZlIG5hbWUgYmVmb3JlIGVhY2ggbGluZS4KLQotCSogbTY4ay1waW5zbi5jOiAgUmVtb3ZlZC4gIFN1YnN1bWVkIGJ5IC4uL29wY29kZXMvbTY4ay1kaXMuYy4KLQkqIGkzODYtcGluc24uYzogIFJlbW92ZWQuICBTdWJzdW1lZCBieSAuLi9vcGNvZGVzL2kzODYtZGlzLmMuCi0JKiBNYWtlZmlsZS5pbjogIEFkanVzdCBhY2NvcmRpbmdseS4KLQkqIG9iamR1bXAuYzogIFN1cHBvcnQgbmV3LXN0eWxlIGRpc2Fzc2VtYmxlcnMgKG9uZXMgdGhhdCB1c2UKLQl0aGUgaW50ZXJmYWNlIG9mIC4uL2luY2x1ZGUvZGlzLWFzbS5oKS4KLQotVGh1IEZlYiAyNSAxNTo1NzowMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgV2hlbiBtYWtpbmcgdGFyIGZpbGUsIHJlbW92ZSB0ZXhpbmZvLyosCi0JZXhjZXB0IGZvciB0ZXhpbmZvL3RleGluZm8udGV4LgotCSogYXJkdXAuYzogIEFkZCBleHRlcm4gZGVjbGFyYXRpb24gb2Ygc3RyZHVwLgotCSogTWFrZWZpbGUuaW4gKHRlc3RzdWl0ZSk6ICBBZGQgJ2Vsc2UgdHJ1ZScgc2luY2Ugb3RoZXJ3aXNlCi0JVWx0cml4IC9iaW4vc2ggY29tcGxhaW5zLgotCi1XZWQgRmViIDI0IDE5OjQ0OjE4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBTZXQgVkVSU0lPTiB0byAyLjEuCi0JKiBSRUFETUUsIE5FV1M6IFVwZGF0ZXMuCi0JKiBubS5jOiAgQWRkIC12IGFzIGEgc3lub255bSBmb3IgLVYuCi0KLVR1ZSBGZWIgMjMgMTk6MDA6NTAgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGRlZCB0ZXN0c3VpdGUgdG8gY29uZmlnZGlycy4KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdXBwb3J0IGZvciBidWlsZGluZyB0ZXN0c3VpdGUuCi0KLU1vbiBGZWIgMjIgMjI6NTI6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiAgUHJpbnQgZnVuY3Rpb24gbmFtZXMgd2hlbgotCWdpdmVuIGJ5IGJmZF9maW5kX25lYXJlc3RfbGluZS4gIElmIG5vdCAtIHN0aWxsIHByaW50Ci0JbGluZSBudW1iZXJzLgotCi1Nb24gRmViIDIyIDA3OjU0OjAzIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogbWFkZSBtb2RpZmljYXRpb25zIHRvIHRlc3RjYXNlcywgZXRjLiwgdG8gYWxsb3cKLSAgICAgICAgdGhlbSB0byB3b3JrIHByb3Blcmx5ICBnaXZlbiB0aGUgcmVvcmdhbml6YXRpb24gb2YgZGVqYS1nbnUgYW5kIHRoZQotCXJlbG9jYXRpb24gb2YgdGhlIHRlc3RjYXNlcyBmcm9tIGRlamEtZ251IHRvIGEgInRvb2wiIHN1YmRpcmVjdG9yeS4KLQotTW9uIEZlYiAyMiAxMDoyNzoyNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9kYXRhKTogRnJlZSB1cCBzZWN0aW9uIGNvbnRlbnRzIGVhY2ggdGltZQotCXRocm91Z2ggdGhlIGxvb3AuICBSZXBvcnRlZCBieSBtaW55YXJkQGJuci5jYS4KLQotU3VuIEZlYiAyMSAxMDo1NTo1NSAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy90ZXN0c3VpdGU6IEluaXRpYWwgY3JlYXRpb24gb2YgYmludXRpbHMvdGVzdHN1aXRlLgotCU1pZ3JhdGVkIGRlamFnbnUgdGVzdGNhc2VzIGFuZCBzdXBwb3J0IGZpbGVzIGZvciB0ZXN0aW5nIG5tIHRvCi0JYmludXRpbHMvdGVzdHN1aXRlIGZyb20gZGVqYS1nbnUuICBUaGVzZSBmaWxlcyB3ZXJlIG1vdmVkICJhcyBpcyIKLQl3aXRoIG5vIG1vZGlmaWNhdGlvbnMuCVRoaXMgbWlncmF0aW9uIGlzIHBhcnQgb2YgYSBtYWpvciBvdmVyaGF1bAotCW9mIGRlamFnbnUuICBUaGUgbW9kaWZpY2F0aW9ucyB0byB0aGVzZSB0ZXN0Y2FzZXMsIGV0Yy4sIHdoaWNoCi0Jd2lsbCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgbmV3IHZlcnNpb24gb2YgZGVqYWdudSB3aWxsIGJlCi0JbWFkZSBpbiBhIGZ1dHVyZSB1cGRhdGUuCi0KLUZyaSBGZWIgMTIgMTA6MDU6MjAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChMSUJJQkVSVFlfU1JDX0RJUiwgTElCSUJFUlRZX0JJTl9ESVIpOiBOZXcgbWFjcm9zLgotCSogTWFrZWZpbGUuaW4gKExJQklCRVJUWSk6ICBVc2UgTElCSUJFUlRZX0JJTl9ESVIuCi0JKiBNYWtlZmlsZS5pbiAoREVNQU5HTEVSX1BST0cpOiAgTmV3IHByb2dyYW0gdG8gYnVpbGQuICBBZGQgbWFjcm8KLQlhbmQgcnVsZS4KLQkqIE1ha2VmaWxlLmluIChQUk9HUyk6ICBBZGQgREVNQU5HTEVSX1BST0cuCi0KLVR1ZSBKYW4gMjYgMTE6NTY6MzMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb3B5LmMsIG5tLmMsIG9iamR1bXAuYywgc2l6ZS5jOiBVc2UgbmV3IGJmZF9pc19jb21fc2VjdGlvbgotCW1hY3JvIHJhdGhlciB0aGFuIGNoZWNraW5nIGZvciBlcXVhbGl0eSB0byBiZmRfY29tX3NlY3Rpb24uCi0KLUZyaSBKYW4gIDggMTU6NTA6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBGaXggY29kZSB0byBmaW5kIGZpcnN0IHVzZWxlc3MKLQlzeW1ib2wuCi0KLVRodSBKYW4gIDcgMTM6MTM6MzEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBVc2UgbWlwc19wcmludF9pbnNuIGZvciBNSVBTLgotCURvbid0IGNvcmUgZHVtcCBpZiBiZmRfZmluZF9uZWFyZXN0X2xpbmUgcmV0dXJucyBmYWxzZS4KLQotV2VkIEphbiAgNiAxNzoxNDowMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKToga25vdyBob3cgdG8gZGlzYXNzZW1ibGUgejgwMDBzCi0JdG9vLgotCi1XZWQgSmFuICA2IDE1OjE2OjI3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcnN1cC5oIChpbnRlcmFjdGl2ZSksIGJ1Y29tbS5oIChwcm9ncmFtX25hbWUpOiAgUHJlZml4Ci0Jd2l0aCAnZXh0ZXJuJywgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBzb21lIGNvbXBpbGVycy4KLQotV2VkIEphbiAgNiAxNToxNDoxMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFycGFyc2UueTogZml4IHVubmVjZXNzYXJ5IHNoaWZ0L3JlZHVjZQotCi1UdWUgRGVjIDIyIDE1OjQ2OjU2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBNYWtlIGNoZWNrIGRlcGVuZCBvbiBhbGwuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIHN5c2RlcC5oLgotCSogc2l6ZS5jOiAgVXNlICV1IGZvcm1hdCB3aGVyZSBhcHByb3ByaWF0ZS4KLQkqIG9iamR1bXAuYzogIFN0YW5kYXJkaXplOiAgTF9TRVQgLT4gU0VFS19TRVQuCi0JKiBvYmpkdW1wLmM6ICBVc2UgbmV3IG1hY3JvIGJmZF9hc3ltYm9sX2JmZC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IHN0ZC1ob3N0IGFzIHRoZSBkZWZhdWx0ICR7bXlzX2hvc3R9LgotCi1UaHUgRGVjIDE3IDE5OjM4OjE5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGR2aSB0YXJnZXQsIGRlZmluZSBhbmQgdXNlIFRFWEkyRFZJCi0KLVR1ZSBEZWMgMTUgMTg6MDU6MDcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0KTogIEZpeCBwZXJtaXNzaW9ucyBiZWZvcmUgcmVsZWFzZS4KLQkqIHNpemUuYzogIFVzZSBiZmRfc2l6ZV90eXBlIChhbmQgbG9uZykgd2hlcmUgYXBwcm9wcmlhdGUuCi0JKiBhci5jOiAgTWFrZSB3cml0aW5nIGEgbWFwIHRoZSBkZWZhdWx0LCB0byBiZSBjb21wYXRpYmxlCi0Jd2l0aCBTWVNWIGFuZCBQb3NpeC4yLiAgUmVtb3ZlIHNvbWUgYm9ndXMga2x1ZGdlcyB0aGF0Ci0JaGFuZGxlZCBfXy5TWU1ERUYgZGlyZWN0bHkuCi0JKiBORVdTOiAgTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDkgMTM6MzY6NTMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZmxleCBubyBsb25nZXIgbmVlZHMgdGhlIC1TIGZsYWcKLQotU2F0IE5vdiAgNyAxNTowNjoxMyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBhci5jIChleHRyYWN0X2ZpbGUpOiB1dGltZSBuZWVkcyBhIHBvaW50ZXIgdG8gYSB1dGltYnVmCi0KLQkqIE1ha2VmaWxlLmluOiBoYW5kbGUgLUkgaW5jbHVkZXMgYmV0dGVyLCBhZGRpbmcgJChCQVNFRElSKS9iZmQgdG8KLQl0aGUgbGlzdCAoc2luY2Ugc29tZSBvZiB0aGUgYmZkL2hvc3RzLyouaCBmaWxlcyBpbmNsdWRlIG90aGVyCi0JZmlsZXMgZnJvbSB0aGF0IGRpcmVjdG9yeSkKLQotRnJpIE5vdiAgNiAwMDoxMjo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaTk2MC1waW5zbi5jIChNRU1fTUFYLCBNRU1fU0laKTogIFNldCB1cHBlciBib3VuZCBwcm9wZXJseS4KLQotVGh1IE5vdiAgNSAwMzozNzoxNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNsZWFuIHVwIHNvbWUgb2xkIEJGRCBhbnNpZmljYXRpb24gbWFjcm9zLgotCi0JKiBhcnN1cC5oLCBidWNvbW0uaCwgb2JqZHVtcC5oOiAgUmVtb3ZlIEVYRlVOIGZyb20gYmludXRpbHMuCi0JSXQgc3RpbGwgcmVtYWlucyBhcyBhIGxvY2FsIG1hY3JvIGluIGdtYWxsb2MuYywgd2hpY2ggaXMgZGVyaXZlZAotCWZyb20gc29tZSBvdGhlciBjb3B5IG9mIEdOVSBNYWxsb2Mgc29tZXdoZXJlIChGSVhNRSkuCi0KLQkqIGFyLmMsIG9iamR1bXAuYywgc2l6ZS5jOiAgUmVwbGFjZSBFWEZVTiB3aXRoIFBST1RPLiAgTWFrZSBzdGF0aWMKLQlmbnMgcmVhbGx5IHN0YXRpYy4KLQkqIGFyc3VwLmg6ICBEZWNsYXJlIGV4dHJhY3RfZmlsZXMuCi0KLU1vbiBOb3YgIDIgMTI6NDI6MTEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhci5jIChleHRyYWN0X2ZpbGUpOiBpbnN0ZWFkIG9mIGNoZWNraW5nIFVTRzogaWYgUE9TSVhfVVRJTUUsCi0JdXNlIHV0aW1lIGFuZCB1dGltYnVmIHN0cnVjdHVyZSwgb3RoZXJ3aXNlIGlmIFVTRV9VVElNRSB1c2UgdXRpbWUKLQlhbmQgYXJyYXkgb2YgdHdvIGxvbmdzLCBvdGhlcndpc2UgdXNlIHV0aW1lcy4KLQotVGh1IE9jdCAxNSAxMzo1NzozNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4OiAgRG9jdW1lbnQgeWVzdGVyZGF5J3MgY2hhbmdlcyB0byBzdHJpcCBhbmQgY29weS4KLQotV2VkIE9jdCAxNCAxMzoyMjoxNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29weS5jOiAgUmUtZG8gY29tbWFuZC1saW5lIHBhcnNpbmcgdG8gdXNlIGdldG9wdF9sb25nKCkuCi0JQWRkIGxvbmcgb3B0aW9uIG5hbWVzLiAgUmUtdGhpbmsgb3B0aW9uIGxldHRlcnMgdG8gYmUgbW9yZQotCWNvbnNpc3RlbnQuCi0JKiBjb3B5LmM6ICBOZXcgZnVuY3Rpb24gZmlsdGVyX3N5bWJvbHMoKSBmb3Igc3RyaXBwaW5nIG9ubHkKLQlkZWJ1Zy1zeW1ib2xzIGFuZC9vciBsb2NhbCBzeW1ib2xzLiAgVXNlIHRoZXNlIHRvIHN1cHBvcnQKLQl0aGUgcHJldmlvdXNseS1taXNzaW5nIG9wdGlvbnMgb2YgdGhlIG9sZCBGU0Ygc3RyaXAuCi0KLVR1ZSBPY3QgMTMgMDE6MjQ6MjAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdCk6ICBVc2UgJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdCByYXRoZXIKLQl0aGFuIHJlcGVhdGluZyBhIGNvcHkgb2YgaXQgaGVyZS4KLQotV2VkIE9jdCAgNyAxMjo1Mzo1MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29weS5jIChtYWluKTogRXZlbiBpZiBpc19zdHJpcCwgYWNjZXB0IC1kIGFyZ3VtZW50IGluZGljYXRpbmcKLQlhbHRlcm5hdGUgb3V0cHV0IGZvcm1hdC4gIE5lZWRlZCBieSBnZGIgZm9yIE5pbmR5LgotCi0JKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyAiYCIgb3BlcmFuZCB0eXBlLgotCi1UdWUgT2N0ICA2IDE2OjMzOjU2IDE5OTIgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6ICBhZGRlZCBkb2N1bWVudGF0aW9uIGZvciAiY29weSIKLQotVHVlIE9jdCAgNiAxNDoyMjo1NiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgUGVyc1NvbnkpCi0KLQkqIE1ha2VmaWxlLmluICgqY2xlYW4gcnVsZXMpOiBTb21lIGNsZWFuaW5nIHVwLgotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBNYWtlIGRpc3RzdHVmZiBpbiBncHJvZiBmb3IgYSBkaXN0LgotCi0JKiBhci5jIChkb19zaG93X3ZlcnNpb24pOiAgTmV3IGZ1bmN0aW9uLgotCSogYXIuYyAobWFpbik6ICBGaXggc28gImFyIC1WIiB3b3Jrcy4KLQotVGh1IE9jdCAgMSAyMjo0NDo0NSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogbm93IHVzZXMgdGhlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGluc3RlYWQgb2YKLQluZXN0ZWQgY2FzZXMuCi0KLUZyaSBTZXAgMjUgMjI6NDE6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGk5NjAtcGluc24uYzogIENoYW5nZSBiemVybyB0byBtZW1zZXQuCi0JKiBzcGFyYy1waW5zbi5jOiAgQ2hhbmdlIGluZGV4IHRvIHN0cmNoci4KLQotTW9uIFNlcCAyMSAxNDozOTo1NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGstcGluc24gKHByaW50X2luc25fYXJnLCBmZXRjaF9hcmcpOiBhZGRlZCBzdXBwb3J0IGZvcgotCW9wZXJhbmRzIHRvIG1lbW9yeSBtYW5hZ2VtZW50IGluc3RydWN0aW9ucywgZnJvbSBXUlMuCi0KLVR1ZSBTZXAgMTUgMTU6MjY6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGlmICQodG9vbGRpcikgZXhpc3RzLCBpbnN0YWxsIG5tIGFuZAotCXN0cmlwIGluICQodG9vbGRpcikvYmluLgotCi1UaHUgU2VwICAzIDExOjU3OjQwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBMZXQncyBjYWxsIGl0IHZlcnNpb24gMi4wLgotCi1XZWQgU2VwICAyIDAwOjI1OjEzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMC45OC4KLQkqIFRPRE8sIFJFQURNRTogIE1pbm9yIHVwZGF0ZXMuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkZWQgbW9zdGx5Y2xlYW4sIGRpc3RjbGVhbiBydWxlcywKLQlhbmQgY2xlYW5lZCB1cCBjbGVhbiwgcmVhbGNsZWFuLgotCi1TdW4gQXVnIDMwIDIxOjE4OjU5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1hcCBwcm9ncmFtIG5hbWVzIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotCXdoZW4gaW5zdGFsbGluZy4KLQotU3VuIEF1ZyAzMCAxODowOTowMyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9ucyAxLjk3LjkwLgotCSogY3BsdXMtZGVtLmM6ICBSZW1vdmVkLiAgV2FzIG5vd2hlcmUgdXNlZCAtIGFuZCBpZiBzb21lCi0JcHJvZ3JhbXMgYXJlIGNoYW5nZWQgdG8gdG8gZGVtYW5nbGluZyBzaG91bGQgbm93IHVzZSB0aGUKLQl2ZXJzaW9ucyBpbiBsaWJpYmVydHkuCi0KLVRodSBBdWcgMjcgMTI6NTg6MDkgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgd2UzMmsKLQotTW9uIEF1ZyAyNCAxNDo1Mzo0MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAobWFwX292ZXJfbWVtYmVycyk6IGlmIHRoZSBlbGVtZW50IG9mIHRoZSBhcmNoaXZlIGhhcyBhCi0JbnVsbCBuYW1lLCBmaWxsIGl0IGluLgotCi0JKiBubS5jIChkb19vbmVfcmVsX2ZpbGUpOiBvbmx5IHdhcm4gaWYgYSBiZmQncyBmbGFncyBzYXkgdGhlcmUKLQl3aWxsIGJlIHN5bWJvbHMgYW5kIHRoZXJlIGFyZW4ndCBhbnkuCi0KLVdlZCBBdWcgMTkgMTE6MjA6MjUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLXBpbnNuLmM6IGhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlICdyJywgaW50cm9kdWNlZCBmb3IgY2FzMi4KLQotVHVlIEF1ZyAxOCAyMDo0NTo0OCAxOTkyICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIG5tLmMgb2JqZHVtcC5jOiBBZGRlZCBzdXBwb3J0IGZvciBhICt2ZXJzaW9uICgtVikKLQl0byBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIuCi0KLQkqIGFyLmMsIGNvcHkuYzogQWRkZWQgc3VwcG9ydCBmb3IgYSAtViBvcHRpb24gdG8gcHJpbnQKLQl0aGUgdmVyc2lvbiBudW1iZXIuCi0KLVR1ZSBBdWcgMTggMTM6Mjg6NDQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYXBvbGxvNjh2OiByZW1vdmVkIC1nIGZyb20gQ0MgZGVmaW5pdGlvbi4KLQotCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotCi1Nb24gQXVnIDE3IDE4OjMzOjQxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbTY4ay1waW5zbi5jOiAgTWlub3IgZml4IGluIHN0eWxlIG9mIG91dHB1dCAoZG9uJ3QgdXNlCi0JcmFuZ2UgdG8gaW5kaWNhdGUgZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlcnMpLgotCi1UdWUgQXVnIDExIDIzOjQyOjIxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhci5jIChtYWluKTogIERvbid0ICphbHdheXMqIHNldCB0aGUgdmVyYm9zZSBmbGFnIQotCi1XZWQgQXVnICA1IDExOjI1OjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29weS5jOiAgV2hlbiBpc19zdHJpcCAoYmVjYXVzZSBpdCBpcyBpbnZva2VkIGFzIHRoZSBzdHJpcAotCXByb2dyYW0pLCBmb2xsb3cgdHJhZGl0aW9uYWwgYXJndiBwcm9jZXNzaW5nOgotCSdzdHJpcCBmaWxlMSBmaWxlMicgbm93IHN0cmlwcyBmaWxlMSBhbmQgZmlsZTIsIHJhdGhlcgotCXRoYW4gc3RyaXBwaW5nIGZpbGUxIChhcyBpbnB1dCksIGxlYXZpbmcgb3V0cHV0IGluIGZpbGUyLgotCi1Nb24gSnVsIDI3IDE2OjI4OjA4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2luZm8sIGRpc3BsYXlfaW5mb190YWJsZSk6ICBDYWxsCi0JYmZkX3NldF9mb3JtYXQoKSBvbiBkdW1teSBiZmQgYmVmb3JlIHVzaW5nIGl0ICh0d2ljZSkuCi0JKiBhci5jOiAgTWFrZSBzdXJlIGFyY2hpdmUgaXMgY3JlYXRlZCBvbiBjb21tYW5kICdyJwotCWV2ZW4gd2hlbiBubyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQuICAoQ2xlYW4gdXAgYW5kCi0Jc2ltcGxpZnkgc29tZSBub24td29ya2luZyByZWxhdGVkIGNvZGUuKQotCi1Nb24gSnVsIDIwIDAyOjQ4OjM4IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBocHBhIHN1cHBvcnQgZG9lc24ndCBhc3N1bWUgaHAgT1MgKGZyb20gc2VmKS4KLQotU2F0IEp1bCAxOCAxNDozNToyMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGhwcGEgaG9zdHMgKGJzZCAmIGhwdXgpLCBlcnJvciBtZXNzYWdlcwotCXRvIHN0ZGVyciwgbm90IHN0ZG91dAotCi1GcmkgSnVsIDE3IDE4OjM5OjQ0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogYXIuMSwgYmludXRpbHMudGV4aSwgaTk2MC1waW5zbi5jLCBubS4xLCBvYmpkdW1wLjEsIHJhbmxpYi4xLAotCSAgc2l6ZS4xLCBzcGFyYy1waW5zbi5jLCBzdHJpcC4xOiByZW1vdmVkIHJjc2lkJ3MuCi0KLVRodSBKdWwgMTYgMTY6NTU6MjQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5kb3M6IHJlbW92ZWQgcmNzaWQuCi0KLVRodSBKdWwgMTYgMDg6MjM6MDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9iZmQpOiBwcmludCBzdGF0ZSBvZiBCRkRfSVNfUkVMQVhBQkxFIHRvbwotCi1UdWUgSnVuIDMwIDIwOjI2OjE1IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBwcm9ncmFtX3N1ZmZpeCAocGFyYWxsZWwgdG8gcHJvZ3JhbV9wcmVmaXgpCi0KLVRodSBKdW4gMjUgMDQ6NTI6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG5tLmMgKHNvcnRlcnMpOiAgTGludC4gIFJlbW92ZSBleGNlc3Mgd2hpdGVzcGFjZS4KLQotV2VkIEp1biAyNCAxMzo0ODowNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogbm0uYyAodmFsdWVvZiBtYWNybyk6ICBBZGQgbWlzc2luZyBwYXJlbnRoZXNlcy4KLQkoVGhlaXIgbGFjayBzY3Jld2VkIHVwIG51bWVyaWNfZm9yd2FyZCgpLikKLQotU3VuIEp1biAxNCAxMDozMzoyNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX2VsZl9zdGFicyk6ICBBbHNvIGR1bXAgLnN0YWIuaW5kZXggYW5kCi0JLnN0YWIuZXhjbCBzZWN0aW9ucy4KLQkoZHVtcF9lbGZfc3RhYnNfMSk6ICBTcGxpdCBvdXQgbWFpbiBib2R5IG9mIG9sZCBkdW1wX2VsZl9zdGFicy4KLQkqIG9iamR1bXAuMSwgYmludXRpbHMudGV4aTogIERvY3VtZW50IG5ldyBzZWN0aW9ucyBkdW1wZWQuCi0KLUZyaSBKdW4gMTIgMjI6MjM6MzUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNpemUuYywgb2JqZHVtcC5jLCBidWNvbW0uYzogIExpbnQuCi0KLVRodSBKdW4gMTEgMDE6MTk6MDYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9lbGZfc3RhYnMpOiBOZXcgZmVhdHVyZTogLS1zdGFicyBwcmludHMgb3V0IGEKLQkuc3RhYiBzZWN0aW9uIGZyb20gYW4gRUxGIGZpbGUuICBJbnN0YWxsZWQgdW5kZXIgI2lmZGVmCi0JRUxGX1NUQUJfRElTUExBWSBzbyBpdCBjYW4gYmUgZWFzaWx5IGRpc2FibGVkLCBzaW5jZSBpdCByZXF1aXJlcwotCWJmZC1pbnRlcm5hbHMgaGVhZGVyIGZpbGVzIGFuZCBzdWNoLgotCSogb2JqZHVtcC4xLCBiaW51dGlscy50ZXhpOiAgVXBkYXRlIGZvciAtLXN0YWJzLiAgQWxzbyBmaXgKLQlvYmpkdW1wJ3MgZG9jIHRvIHVzZSAtLSByYXRoZXIgdGhhbiArIGZvciBsb25nIG9wdGlvbnMuCi0JKEZJWE1FOiAgTm90IHlldCBmaXhlZCBldmVyeXdoZXJlIGluIGJpbnV0aWxzLnRleGluZm8uKQotCi1XZWQgSnVuIDEwIDA3OjUzOjI0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMoZGlzcGxheV9pbmZvKSwgcGF0Y2hlcyBmcm9tCi0JbW9ocmluZ0BpbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlIHRvIHByaW50IHRoZSB0YWJsZSBtdWNoIG1vcmUKLQluaWNlbHkuCi0KLVRodSBNYXkgMjggMTM6MzY6MTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6ICBBZGQgYW5vdGhlciBlbnVtLT5pbnQgY2FzdCwgZm9yIHRoZSBzYWtlIG9mCi0Jb2xkIGNvbXBpbGVycyAoc3VjaCBhcyBQQ0MpLgotCi1XZWQgTWF5IDI3IDEzOjAxOjQ0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYXJsZXgubDogIERvbid0IGluY2x1ZGUgPHN5c2RlcC5oPiAodW5uZWVkZWQgY29uZmxpY3RzKS4KLQlBZGQgZGVjbGFyYXRpb24gb2Ygc3RyZHVwKCkuCi0KLUZyaSBNYXkgMjIgMTM6NDA6MzcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVXNlIHNyY2RpciBpbnN0ZWFkIG9mIFZQQVRIIGluIGxkZ3JhbS9sZGxleAotCXJ1bGVzLCBzaW5jZSB0aGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgZGlzdHJpYnV0aW9uLgotCSogTWFrZWZpbGUuaW4gKGFybGV4LmMpOiAgRG9uJ3QgcmUtZGlyZWN0IG91dHB1dCwgc2luY2UgdGhhdAotCWxlYXZlcyBhIGJvZ3VzIG91dHB1dCBmaWxlcyBpZiBpdCBmYWlscy4KLQotCSogYXJsZXgubDogIE1ha2Ugd29yayB3aXRoIGxleCwgZm9yIHdoYXQgaXQncyB3b3J0aC4KLQkqIE1ha2VmaWxlLmluOiAgQmV0dGVyIGxleCBzdXBwb3J0LgotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiAgR2VuZXJhdGUgZmxleCBhbmQgYmlzb24gb3V0cHV0cwotCWZvciBkaXN0cmlidXRpb24uCi0KLVRodSBNYXkgMTQgMTc6MTc6NTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZ2V0IEJJU09OIGRlZmluaXRpb24gcmlnaHQuCi0KLUZyaSBNYXkgIDggMDc6NDc6MDggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIHNhbml0eS5zaDogZGVmYXVsdCBUTVBESVIgdG8gIi4iLgotCi1UaHUgTWF5ICA3IDEyOjM0OjUwIDE5OTIgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6IGFkZCBkb2MgZm9yIGFyIGNvbW1hbmQgbGFuZ3VhZ2UuCi0KLVdlZCBNYXkgIDYgMTg6MDU6MzYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFycGFyc2UueTogbWFrZSBFTkQgY2FsbCBhcl9lbmQKLQkqIGFyc3VwLmMgKGFyX2VuZCk6IGFkZGVkLCBkZWxldGVzIHRlbXAgZmlsZSBpZiBhcmNoaXZlIHNlc3Npb24KLQlhYm9ydGVkLgotCi0KLVdlZCBNYXkgIDYgMTE6MDg6NTMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIGJpc29uICYgZmxleCBmcm9tIC4uLyBpZiB0aGV5IGV4aXN0LiAgQWxzbywKLQkgIEZMRVgtPkxFWC4KLQotCSogc2FuaXR5LnNoOiByZW1vdmUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aGVuIGZpbmlzaGVkLgotCi1UdWUgTWF5ICA1IDEyOjAwOjU4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMS45Ny4KLQkqIGFyLmM6ICBEZWNsYXJlIGVycm5vIGZvciBtYWNoaW5lcyB0aGF0IG5lZWQgaXQuCi0KLU1vbiBNYXkgIDQgMjM6Mjk6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9pbmZvKTogIEhhbmRsZSBlcnJvciBjYXNlcyB3aXRob3V0IGNvcmVkdW1wLgotCUNsb3NlIHRoZSBkdW1teSB0ZW1wb3JhcnkgZmlsZSB3ZSBvcGVuIGluIHRoZSBsb29wLgotCSogTWFrZWZpbGUuaW4gKGFyc3VwLm8pOiAgQWRkIGtsdWRnZSB0byBidWlsZCB3aXRoIFN1biBNYWtlLgotCi1GcmkgTWF5ICAxIDE2OjIwOjIzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdGVzdC1pbnN0YWxsIHRhcmdldC4KLQotCSogc2FuaXR5LnNoOiBuZXcgZmlsZS4KLQotCSogTWFrZWZpbGUuaW46IHVzZSBzYW5pdHkgdGVzdCBvbiBtYWtlIGNoZWNrLgotCi1UdWUgQXByIDIxIDEzOjM4OjM3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHBhc3NlZCBvbiB0aGUKLQkgIGNvbW1hbmQgbGluZSB0byBtYWtlLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotV2VkIEFwciAxNSAxNDozMzowNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJzdXAuYywgYXJzdXAuaCwgYXJwYXJzZS55LCBhcmxleC5sOiBzdXBwb3J0IGZvciBhcmNoaXZlCi0Jc2NyaXB0aW5nIGxhbmd1YWdlLgotCi1GcmkgTWFyICA2IDIxOjU0OjUzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1UaHUgTWFyICA1IDIxOjM1OjQ5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2xlYW4taW5mbyB0YXJnZXQuCi0KLVR1ZSBNYXIgIDMgMTU6MzY6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlICQoQ09QWV9QUk9HKSBmcm9tIFBST0dTLiAgSXQgc2hvdWxkbid0IGJlCi0JICBpbnN0YWxsZWQuIGFkZGVkIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotU3VuIEZlYiAxNiAxMjo1MzowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHZlcnNpb24gdG8gMS45NiwgYW5kIHJlbW92ZSAtYmV0YQotCXN1ZmZpeCBmcm9tIGRpc3RyaWJ1dGlvbiBuYW1lLgotCSogbTY4ay1waW5zbi5jOiAgTmV3IG1hY3JvIENPRVJDRV9TSUdORURfQ0hBUiB0byBleHRyYWN0Ci0JdGhlIHNpZ25lZCB2YWx1ZSBvZiBhIGNoYXJhY3RlciAoZXZlbiBpZiBjaGFycyBhcmUgdW5zaWduZWQpLgotCSogc3BhcmMtcGluc24uYzogIEFkZCBuZXcgb3BlcmFuZCB0eXBlcy4KLQotVGh1IEZlYiAgNiAxMjoxNDoxOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogZG9uJ3QgcHJpbnQgYSBzZWN0aW9uJ3MgY29udGVudHMKLQlpZiBpdCdzIG5vdCBsb2FkYWJsZSAoZWcgYnNzKQotCi1UdWUgSmFuIDI4IDExOjExOjA2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogZml4ZWQgc28gdGhhdCAtdmUgYnJhbmNoCi0JZGlzcGxhY2VtZW50cyBkb24ndCBnZXQgcHJpbnRlZCBhcyBsYXJnZSArdmUgb25lcy4KLQotRnJpIEphbiAyNCAxNDo0Nzo1MyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29weS5jLCBubS5jLCBvYmpkdW1wLmMsIHNpemUuYyA6IGNoYW5nZWQgdG8gdXNlIHRoZQotCW5ldyByZWxvYyBzY2hlbWUuCi0KLQotTW9uIERlYyAzMCAxODozNDo0MSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogIFR3ZWVrIHRoZSBvdXRwdXQgZm9ybWF0Ci0Jc28gdGhhdCAnYXIgdHYnIG91dHB1dCBmb2xsb3dzIFBvc2l4IDEwMDMuMi9EMTEuCi0JT3V0cHV0IGlzIG5vdyBhbHNvIGlkZW50aWNhbCB0byBTdW4ncyAoZXhjZXB0IF9fLlNZTURFRikuCi0KLU1vbiBEZWMgMzAgMDY6MDk6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTWFrZSBgbWFrZScgb3V0cHV0IG1vcmUgcmVhZGFibGUuCi0KLVdlZCBEZWMgMTggMTU6MDQ6NDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTQuCi0KLVdlZCBEZWMgMTEgMTY6NDg6MDkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYzogYWRkZWQgImIiIHRvIGZvcGVucyBmb3IgZG9zCi0JKiBjb25maWdkai5iYXQsIG1ha2VmaWxlLmRvcyBuZXcgZmlsZXMgZnJvbSBESgotCi1UdWUgRGVjIDEwIDA0OjA3OjI2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1TYXQgRGVjICA3IDE3OjA5OjM3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBidWNvbW0uaDogY3JlYXRlZCB0byBob2xkIHByb3RvdHlwZXMgb2YgYnVjb21tLmMKLQkqIG9iamR1bXAuaDogY3JlYXRlZCB0byBob2xkIHByb3RvdHllcyBvZiBvYmpkdW1wLmMKLQkqIGFtMjlrLXBpbnNuLmM6IGluY2x1ZGUgb2JqZHVtcC5oCi0JKiBhci5jOiBpbmNsdWRlIGJ1Y29tbS5oLCBnZXQgYXIuaCBmcm9tIHRoZSByaWdodCBwbGFjZSBhbmQKLQlpbmNsdWRlIGxpYmJmZC5oCi0JKiBidWNvbW0uYzogZGVmdW5pemUgYmZkX2ZhdGFsCi0JKiBjb3B5LmM6IGluY2x1ZGUgYnVjb21tLmgsIGxpbnQuCi0JKiBpOTYwLXBpbnNuLmg6IGluY2x1ZGUgYnVjb21tLmgKLQkqIG02OGstcGluc24uaDogbGludAotCSogbm0uYzogaW5jbHVkZSBidWNvbW0uaCwgbGludAotCSogb2JqZHVtcC5jOiBsaW50Ci0JKiBzcGFyYy1waW5zbi5jOiBpbmNsdWRlIG9iamR1bXAuaAotCi0KLQotRnJpIERlYyAgNiAyMzowMjoxNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdGFuZGFyZHMudGV4dCBzdXBwb3J0LiAgaW5zdGFsbCB1c2luZwotCSAgSU5TVEFMTF9QUk9HUkFNIGFuZCBJTlNUQUxMX0RBVEEuCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJlIG5vdyBkb2VzIGFsbCBvZiBpdCdzIHdvcmsgZnJvbSBvYmpkaXIgc28KLQkgIG1ha2UgZmlsZSBleGlzdGVuY2UgdGVzdHMgYWdhaW5zdCAke3NyY2Rpcn0uCi0KLVRodSBEZWMgIDUgMjI6NDY6MjIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1XZWQgRGVjICA0IDIyOjQyOjAzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjkzLgotCSogTWFrZWZpbGUuaW46ICBBZGQgbWFrZS1zdHJpcC5vOm1heWJlLXN0cmlwLmMgZGVwZW5kZW5jeQotCWZvciBtYWtlIHZlcnNpb25zIHRoYXQgcHJvdmlkZSBoYWxmLWJha2VkIFZQQVRILXN1cHBvcnQgKGUuZy4gU3VuJ3MpLgotCSogc2l6ZS5jOiAgSW1wcm92ZW1lbnRzIHN1Z2dlc3RlZCBieQotCSJkYXZpZCBkIFt6b29dIHp1aG4iIDx6b29AYXBzMS5zcGEudW1uLmVkdT46Ci0JLSBEb24ndCBlbWl0IChCZXJrZWxleSkgaGVhZGVycyBpZiBubyBmaWxlcyB3ZXJlIGZvdW5kLgotCS0gUmV0dXJuIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUgb24gZmFpbHVyZS4KLQotU2F0IE5vdiAzMCAyMTozNDoxOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgZHVlIHRvIGluY2x1ZGUgZmlsZSByZW5hbWluZzoKLQkqIGFtMjlrLXBpbnNuLmM6IGEyOWstb3Bjb2RlLmgJLT4gb3Bjb2RlL2EyOWsuaAotCSogc3BhcmMtcGluc24uYzogc3BhcmMtb3Bjb2RlLmgJLT4gb3Bjb2RlL3NwYXJjLmgKLQkqIG02OGstcGluc24uYzoJIG02OGstb3Bjb2RlLmgJLT4gb3Bjb2RlL202OGsuaAotCSogbm0uYzoJCSBzdGFiLmdudS5oCS0+IGFvdXQvc3RhYl9nbnUuaAotCi1UdWUgTm92IDE5IDE5OjIwOjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBNZW50aW9uIE1JTklNSVpFIGZsYWcgZm9yIGJmZCdzIG1ha2UuCi0KLU1vbiBOb3YgMTggMTI6MDU6MzcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIFZhcmlvdXMgaW1wcm92ZW1lbnRzLgotCi1TdW4gTm92IDE3IDIzOjQwOjU5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjkyLgotCSogdmVyc2lvbi5jLCBNYWtlZmlsZS5pbjogIEdldCB2ZXJzaW9uIHN0cmluZyBmcm9tIE1ha2VmaWxlLgotCSogY29weS5jLCBpcy1zdHJpcC5jLCBub3Qtc3RyaXAuYywgbWF5YmUtc3RyaXAuYywgTWFrZWZpbGUuaW46Ci0JTWFrZSB0aGUgc2FtZSBjaGFuZ2UgdGhhdCB3ZSBlYXJsaWVyIGRpZCBmb3IgYXIvcmFubGliOgotCUdlbmVyYXRlIHR3byBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIHN0cmlwIGFuZCBjb3B5IGFuZCB1c2UKLQlhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgdG8gZGlzdGluZ3Vpc2gKLQlvc3RyaXAgZnJvbSBjb3B5LiAgKC0xIG1lYW5zIHRvIHVzZSBhcmd2WzBdIHRvIGRlY2lkZSwKLQlzbyB5b3UgY2FuIGdldCB0aGUgb2xkIGJlaGF2aW9yLCBidXQgaXQgaXMgbm8gbG9uZ2VyIHRoZSBkZWZhdWx0KS4KLQkqIGNvcHkuYyAoY29weV9maWxlKTogIFNldCBFWEVDX1Agb2Ygb3V0cHV0IGJmZCBpZiBpbnB1dCBpcyBzby4KLQkqIGNvcHkuYyAobWFpbik6ICBJZiBpc19zdHJpcD09LTEsIGNvbXBhcmUgbGFzdCA1IGNoYXJzCi0Jb2YgYXJndlswXSwgbm90IHRoZSB3aG9sZSBwYXRoLgotCSogY29weS5jIChtYWluKTogUmV0dXJuIDAsIG5vdCAxLgotCSogY29weS5jIChzZXR1cF9zZWN0aW9ucyk6ICBGaXggZHVlIHRvIGNoYW5nZSBpbiBiZmRfbWFrZV9zZWN0aW9uCi0Jbm93IGZhaWxpbmcgaWYgYXNrZWQgZm9yIGEgZHVwbGljYXRlIHNlY3Rpb24uCi0JKiBzdHJpcC5jLCBvc3RyaXAuYzogIFJlbW92ZWQgb2Jzb2xldGUgZmlsZXMuCi0JKiBhci5jLCBub3QtcmFubGliLmMsIG1heWJlLXJhbmxpYi5jOgotCUNoYW5nZSBlbmNvZGluZyBvZiBpc19yYW5saWIgdmFyaWFibGUgdG8gYmUgY29uc2lzdGVudAotCXdpdGggaXNfc3RyaXAgZm9yIHN0cmlwLmNvcHkgKGkuZSAtMSB0byBtZWFucyB1c2UgYXJndlswXSkuCi0KLVRodSBOb3YgMTQgMjA6MTE6MDIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHZlcnNpb24uYyAocHJvZ3JhbV92ZXJzaW9uKTogVXBkYXRlIHRvIHZlcnNpb24gMS45Mi4KLQotVHVlIE5vdiAxMiAxNjoxNzo1MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYyAoZ2V0X3Bvc19iZmQpOiAgUHJldmlvdXMgZml4IHdhcyBtaXNzaW5nIGEgImJyZWFrIi4KLQotVGh1IE5vdiAgNyAwODo1NTo1NiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBhbTI5ay1waW5zbi5jOiBGaXhlZCBidWcgaW4gbXRhY2MsIGRtYWMgYW5kIGZtYWMgaW5zdHJ1Y3Rpb24KLQllbmNvZGluZ3MuIChUaGFrcyB0byBEYXZpZCBXb29kKQotCi1TdW4gTm92ICAzIDE0OjUwOjIzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoJChESVNUX05BTUUpLnRhci5aKSwgVE9ETzogIFZhcmlvdXMgZml4ZXMuCi0JKiBhci5jIChnZXRfcG9zX2JmZCk6IEZpeCB0byBoYW5kbGluZyBvZiBiZWZvcmUvYWZ0ZXIKLQlwb3NpdGlvbmluZyBvcHRpb25zLgotCSogYnVjb21tLmMgKGZhdGFsKTogIE1JU1NJTkdfVkZQUklOVEYgaXMgbm8gbG9uZ2VyIGFuIGlzc3VlLAotCXNpbmNlIGxpYmliZXJ0eSBjb250YWlucyB2ZnByaW50ZiBldGMgaWYgb3RoZXJ3aXNlIG1pc3NpbmcuCi0JKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogIFN1cHBvcnQgQkIvQlcvQkwKLQl0eXBlIG9wZXJhbmRzLCBhcyB1c2VkIGJ5IGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0JKiBubS5jOiAgRGVsZWdhdGUgcHJpbnRpbmcgb2Ygc3ltYm9scyB0byBCRkQsCi0JYnkgdXNpbmcgYmZkX3ByaW50X3N5bWJvbCB0byBkbyB0aGUgZm9ybWF0dGluZy4KLQotTW9uIE9jdCAyOCAxMToyMDo0NyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHdyaXRlX2FyY2hpdmUuYyk6IGFkZGVkIHVubGluayBiZWZvcmUgcmVuYW1lIHNpbmNlIHNvbWUKLQlzeXN0ZW1zIGNhbid0IHJlbmFtZSBvbnRvIGFuIGV4aXN0YW50IGZpbGUuCi0KLU1vbiBPY3QgMjEgMDk6NDc6MjMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogbm93IGRvZXNuJ3QgY3Jhc2ggaWYgYSBzeW1ib2wgd2l0aCBubyBzZWN0aW9uIGFuZCBubwotCVNFQ19BQlMgYXBwZWFycy4KLQotVGh1IE9jdCAxNyAxNToyNTo1MCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIHZlcnNpb24uYzogIEJ1bXAgdG8gdmVyc2lvbiAxLjkxLgotCi1XZWQgT2N0IDE2IDExOjQ1OjM2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYXIuYywgYnVjb21tLmMsIGNvcHkuYywgY3BsdXMtZGVtLmMsIGZpbGVtb2RlLmMsCi0JaTk2MC1waW5zbi5jLCBtNjhrLXBpbnNuLmMsIG5tLmMsIG9iamR1bXAuYywgc2l6ZS5jLCBzcGFyYy1waW5zbi5jLAotCSogc3RyaXAuYzogQWRkIG9yIHVwZGF0ZSBDb3B5cmlnaHQgbm90aWNlLgotCSogVE9ETzogIEFkZCBub3RlIG9uICdubSAtYScuCi0JKiB2ZXJzaW9uLmM6IFVwZGF0ZSB2ZXJzaW9uIG51bWJlciB0byAxLjkwLgotCSogTWFrZWZpbGUuaW46IEZpeCBtYWtpbmcgb2YgZG9jdW1lbnRhdGlvbiBmb3IgZGlzdC4KLQotVHVlIE9jdCAxNSAwMDoxNzoxNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBOZXcga2x1ZGd5IHJ1bGVzIGZvciBtYWtpbmcgYSB0YXJmaWxlLgotCSogTWFrZWZpbGUuaW46IEZpeCBiaW5kaXIgcGF0aC4KLQotTW9uIE9jdCAxNCAxNzozNDoyOSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIHRhcmdldHMgYmludXRpbHMubW0sIGJpbnV0aWxzLm1lCi0KLUZyaSBPY3QgMTEgMjI6NDQ6MjEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQXZvaWQgU3VuIE1ha2UgVlBBVEggYnVncyBieSBhZGRpbmcgZGVwZW5kZW5jaWVzLgotCi1GcmkgT2N0IDExIDEyOjUxOjMzIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgdGFyZ2V0ICJiaW51dGlscy5tcyIKLQotCSogYmludXRpbHMudGV4aW5mbzogbWlub3IgcmVzdHJ1Y3R1cmluZyBmb3IgdGV4aTJyb2ZmIGNvbWZvcnQuCi0KLUZyaSBPY3QgMTEgMDQ6MTI6MjggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSZXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIHNjaGVtZSBmb3IgYmZkLCBiaW51dGlscywgbGQuCi0KLQkqIGluY2x1ZGUvc3lzL2gtKi5oOiAgTW92ZSB0byBiZmQvaG9zdHMvaC0qLmguCi0JKiBjb25maWd1cmUuaW46ICBSZXZpc2UgdG8gc3ltbGluayBzeXNkZXAuaCB0byAuLi9iZmQvaG9zdHMvaC14eHguaC4KLQlDaGFuZ2Ugc29tZSBjb25maWcgbmFtZXMgdG8gbWF0Y2ggb3RoZXIgZGlycy4KLQkqICouYzogIEluY2x1ZGUgYmZkLmggYmVmb3JlIHN5c2RlcC5oLCBzbyBhbnNpZGVjbCBhbmQgUFJPVE8oKQotCWdldCBkZWZpbmVkIGZpcnN0LgotCSogTWFrZWZpbGUuaW46ICBVc2UgLUkuIHRvIGdldCBzeXNkZXAuaC4KLQotV2VkIE9jdCAgOSAyMjo0Mjo1NiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbm0uYyAocHJpbnRfc3ltYm9scyk6ICBIYW5kbGUgTlVMTCBuYW1lIGZpZWxkIG9mIHN5bWJvbC4KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmVkIHNwdXJpb3VzIGNvbW1lbnQuCi0KLVR1ZSBPY3QgIDggMTY6NTU6MDMgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aW5mbzogbWlub3IgdHlwb3MsIHBocmFzaW5nLCBmb3JtYXR0aW5nIGZpeGVzLgotCi1UdWUgT2N0ICA4IDE1OjEzOjIwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEdldCBob3N0IGZpbGUgZnJvbSAuLi9iZmQvY29uZmlnLCBub3QgY29uZmlnLgotCSogY29uZmlnLyo6IFJlbW92ZSBjb25maWcgZGlyZWN0b3J5IGFuZCBpdHMgZmlsZXMuCi0KLVR1ZSBPY3QgIDggMTM6NTg6NTkgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG5ldyB0YXJnZXRzIGJpbnV0aWxzLmR2aSwgYmludXRpbHMuaW5mbwotCi0JKiBiaW51dGlscy50ZXhpbmZvOiByZW1vdmUgbW9zdCByZW1haW5pbmcgRklYTUUncywgZGVsZXRlCi0JcmVmZXJlbmNlcyB0byBfXy5TWU1ERUYgYnkgbmFtZQotCi0KLVR1ZSBPY3QgIDggMTA6MjM6NDQgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHByaW50X2FkZHJlc3MpIFByaW50IGFkZHJlc3NlcyBuaWNlbHkuCi0KLU1vbiBPY3QgIDcgMTE6MzE6MDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyLmMsIE1ha2VmaWxlLmluLCBuZXcgZmlsZXMge2lzLG5vdCxtYXliZX0tcmFubGliLmM6Ci0JTWFrZSB0d28gZGlmZmVyZW50IGJpbmFyaWVzIGZvciBhciBhbmQgcmFubGliLCBpbnN0ZWFkIG9mCi0JZGlzdGluZ3Vpc2hpbmcgdGhlbSBhdCBydW4gdGltZSB1c2luZyBhcmd2WzBdLgotCShPbGQgYmVoYXZpb3IgaXMgc3RpbGwgYXZhaWxhYmxlIGlmIHlvdSAibWFrZSBhcl93aXRoX3JhbmxpYiIsCi0JYnV0IGl0IGlzIG5vdCB0aGUgZGVmYXVsdC4pCi0JKiByYW5saWIuc2ggKG5ldyk6ICBBbiBhbHRlcm5hdGl2ZSBvbmUtbGluZQotCXNoZWxsIGltcGxlbWVudGF0aW9uIG9mIHJhbmxpYi4KLQotRnJpIE9jdCAgNCAyMTo0OTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiAgQ29wZSB3aXRoIHJlbmFtZXMgb2YgYSBmZXcgQkZEIHR5cGVzICYgZW51bXMuCi0KLUZyaSBPY3QgIDQgMTk6MDg6MDkgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aW5mbzogYWRkIG5ldyBmaWxlIChydWRpbWVudGFyeSBkb2NuKQotCi1Nb24gU2VwIDMwIDEyOjMwOjM5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaG1ha2UtbmV3czogQWRkIG5ldyBmaWxlIChmb3IgU29ueSBORVdTT1MzKS4KLQkqIGJ1Y29tbS5jIChmYXRhbCk6ICBDb25kaXRpb25hbGx5IGNvbXBpbGUgZmF0YWwoKSBkZXBlbmRpbmcgb24KLQlNSVNTSU5HX1ZGUFJJTlRGLCBhbmQgZG9uJ3QgY29uZnVzZSB0aGUgaXNzdWUgd2l0aCBOT19WQVJBUkdTLgotCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMpOiAgVHJpdmlhbCBvdXRwdXQgZm9ybWF0IGNoYW5nZS4KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9pbmZvKTogTG9vcCBvdmVyIGludGVnZXJzLCBub3QgZW51bXMsCi0JdG8gYXBwZWFzZSBvbGQgY29tcGlsZXJzLgotCi1Nb24gTWF5IDIwIDE2OjE0OjA3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLSAgICAgICAgKm9iamR1bXAuYyAqbm0uYyAqY29weS5jIDpoYW5nZWQgc29tZSB0eXBlcyB0byB3b3JrIHdpdGggNjQgYml0IG9iamVjdCBmaWxlcwotCi1UaHUgTWF5IDE2IDE2OjA2OjU1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0gICAgIGZyb20gYm90aGVyCi0JKiBvYmpkdW1wLmMgKHByaW50X2FkZHJlc3MpOiBNYWtlIGRpc2FzZW1ibGVkIG91dHB1dCBtb3JlCi0JY29uc2lzdGVudCB3aXRoIGdkYiBhbmQgYXM6IEFkZCAweCB3aGVuIHByaW50aW5nIGhleC4KLQlEb24ndCBwcmludCBleHRyYSBsZWFkaW5nIHplcm9zLgotCUF0dGVtcHQgdG8gbm90IHByaW50ICJmaWxlbmFtZS5vIi4KLQkqIG9iamR1bXAuYzogQWRkIHNvbWUgZW51bS10by1pbnQgY2FzdHMgdG8gYWNjb21vZGF0ZSBvbGQgY29tcGlsZXJzLgotCi0KLUZyaSBNYXkgIDMgMjI6MjE6NDQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb3B5LmM6ICBDaGFuZ2UgPSYgY29uc3RydWN0cyB0byA9ICYsIHNpbmNlIHRoZXkgY29uZnVzZSBvbGRlcgotCUMgY29tcGlsZXJzLgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iaW51dGlscy9NYWtlZmlsZS5hbSBiL2JpbnV0aWxzL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTg0MzhlLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotIyMgRklYTUU6IFdvcmsgYXJvdW5kIGFwcGFyZW50IGJ1ZyBpbiBhdXRvbWFrZS4KLUlOVExMSUJTID0gQElOVExMSUJTQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKLQotU1VCRElSUyA9IHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotIyMgVGhlc2UgYXJlbid0IHNldCBieSBhdXRvbWFrZSwgYmVjYXVzZSB0aGV5IGFwcGVhciBpbgotIyMgYmZkL2FjaW5jbHVkZS5tNCwgd2hpY2ggaXMgaW5jbHVkZWQgYnkgYmludXRpbHMvYWNpbmNsdWRlLm00LCBhbmQKLSMjIHRodXMgaXMgbm90IHNlZW4gYnkgYXV0b21ha2UuCi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotCi1ZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXTsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLzsgZWxzZSBlY2hvIEBZQUNDQDsgZmlgCi1ZRkxBR1MgPSAtZAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF07IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXg7IGVsc2UgZWNobyBATEVYQDsgZmlgCi0KLSMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQotQVJfUFJPRz1hcgotUkFOTElCX1BST0c9cmFubGliCi0KLSMgb2JqY29weSBhbmQgc3RyaXAgc2hvdWxkIGJlIHRoZSBzYW1lIHByb2dyYW0KLU9CSkNPUFlfUFJPRz1vYmpjb3B5Ci1TVFJJUF9QUk9HPXN0cmlwLW5ldwotCi1TVFJJTkdTX1BST0c9c3RyaW5ncwotCi1SRUFERUxGX1BST0c9cmVhZGVsZgotCi0jIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCi1TSVpFX1BST0c9c2l6ZQotTk1fUFJPRz1ubS1uZXcKLU9CSkRVTVBfUFJPRz1vYmpkdW1wCi0KLSMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLSMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgotREVNQU5HTEVSX1BST0c9Y3h4ZmlsdAotCi1BRERSMkxJTkVfUFJPRz1hZGRyMmxpbmUKLQotTkxNQ09OVl9QUk9HPW5sbWNvbnYKLURMTFRPT0xfUFJPRz1kbGx0b29sCi1XSU5EUkVTX1BST0c9d2luZHJlcwotRExMV1JBUF9QUk9HPWRsbHdyYXAKLQotU1JDT05WX1BST0c9c3Jjb252JChFWEVFWFQpIHN5c2R1bXAkKEVYRUVYVCkgY29mZmR1bXAkKEVYRUVYVCkgCi0KLW1hbl9NQU5TID0gYXIuMSBubS4xIG9iamR1bXAuMSByYW5saWIuMSBzaXplLjEgc3RyaW5ncy4xIHN0cmlwLjEgb2JqY29weS4xIFwKLQlhZGRyMmxpbmUuMSBubG1jb252LjEgJChERU1BTkdMRVJfTkFNRSkuMQotCi1QUk9HUyA9ICQoU0laRV9QUk9HKSAkKE9CSkRVTVBfUFJPRykgJChOTV9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFNUUklQX1BST0cpICQoUkFOTElCX1BST0cpICQoREVNQU5HTEVSX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi1iaW5fUFJPR1JBTVMgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoQVJfUFJPRykgJChTVFJJTkdTX1BST0cpICQoUkFOTElCX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi0jIyBXZSBuZWVkIGEgc3BlY2lhbCBydWxlIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIHdoaWNoIGFyZSBidWlsdCB3aXRoCi0jIyAtbmV3LCBhbmQgdG8gcmVuYW1lIGN4eGZpbHQgdG8gYysrZmlsdC4KLW5vaW5zdF9QUk9HUkFNUyA9ICQoTk1fUFJPRykgJChTVFJJUF9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKQotCi1FWFRSQV9QUk9HUkFNUyA9ICQoTkxNQ09OVl9QUk9HKSBzcmNvbnYgc3lzZHVtcCBjb2ZmZHVtcCAkKERMTFRPT0xfUFJPRykgJChXSU5EUkVTX1BST0cpICQoRExMV1JBUF9QUk9HKQotCi0jIFN0dWZmIHRoYXQgZ29lcyBpbiB0b29sZGlyLyBpZiBhcHByb3ByaWF0ZQotVE9PTF9QUk9HUyA9IG5tLW5ldyBzdHJpcC1uZXcgYXIgcmFubGliIGRsbHRvb2wKLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUgk9ICQoQkFTRURJUikvaW5jbHVkZQotCi1NS0RFUCA9IG1rZGVwCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLUhGSUxFUyA9IGFyc3VwLmggYnVjb21tLmggYnVkYmcuaCBjb2ZmZ3Jvay5oIGRlYnVnLmggbmxtY29udi5oIGRsbHRvb2wuaCBcCi0Jd2luZHJlcy5oIHdpbmR1bmkuaCBkeW4tc3RyaW5nLmgKLQotR0VORVJBVEVEX0hGSUxFUyA9IGFycGFyc2UuaCBzeXNyb2ZmLmggc3lzaW5mby5oIGRlZnBhcnNlLmgKLQotQ0ZJTEVTID0gYWRkcjJsaW5lLmMgYXIuYyBhcnN1cC5jIGJ1Y29tbS5jIGNvZmZkdW1wLmMgY29mZmdyb2suYyBkZWJ1Zy5jIFwKLQlkbGx0b29sLmMgZmlsZW1vZGUuYyBpZWVlLmMgaXMtcmFubGliLmMgaXMtc3RyaXAuYyBtYXliZS1yYW5saWIuYyBcCi0JbWF5YmUtc3RyaXAuYyBubG1jb252LmMgbm0uYyBub3QtcmFubGliLmMgbm90LXN0cmlwLmMgXAotCW9iamNvcHkuYyBvYmpkdW1wLmMgcHJkYmcuYyByZGNvZmYuYyByZGRiZy5jIHNpemUuYyBzcmNvbnYuYyBcCi0Jc3RhYnMuYyBzdHJpbmdzLmMgc3lzZHVtcC5jIHZlcnNpb24uYyB3cnN0YWJzLmMgXAotCXdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyB3aW5kdW5pLmMgcmVhZGVsZi5jIFwKLQlyZXNyZXMuYyBkeW4tc3RyaW5nLmMgZGxsd3JhcC5jIHJlbmFtZS5jCi0KLUdFTkVSQVRFRF9DRklMRVMgPSBcCi0JdW5kZXJzY29yZS5jIGFycGFyc2UuYyBhcmxleC5jIHN5c3JvZmYuYyBzeXNpbmZvLmMgc3lzbGV4LmMgXAotCWRlZnBhcnNlLmMgZGVmbGV4LmMgbmxtaGVhZGVyLmMgcmNwYXJzZS5jIHJjbGV4LmMKLQotREVCVUdfU1JDUyA9IHJkZGJnLmMgZGVidWcuYyBzdGFicy5jIGllZWUuYyByZGNvZmYuYwotV1JJVEVfREVCVUdfU1JDUyA9ICQoREVCVUdfU1JDUykgd3JzdGFicy5jCi0KLSMgQ29kZSBzaGFyZWQgYnkgYWxsIHRoZSBiaW51dGlscy4KLUJVTElCUyA9IGJ1Y29tbS5jIHZlcnNpb24uYyBmaWxlbW9kZS5jCi0KLUJGRExJQiA9IC4uL2JmZC9saWJiZmQubGEKLQotT1BDT0RFUyA9IC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChERUJVR19TUkNTKSAkKEhGSUxFUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKLSAgICAgICAgICBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKLVJVTlRFU1QgPSBgaWYgWyAtZiAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKLSAgICAgICAgICAgZWNobyAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgXAotICAgICAgICAgICBlbHNlIGVjaG8gcnVudGVzdCA7ICBmaWAKLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlzcmNkaXI9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3JjZGlyOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCi0JCUNDX0ZPUl9UQVJHRVQ9IiQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkJQ0ZMQUdTX0ZPUl9UQVJHRVQ9IiQoQ0ZMQUdTKSIgJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi1pbnN0YWxsY2hlY2s6Ci0JL2Jpbi9zaCAkKHNyY2Rpcikvc2FuaXR5LnNoICQoYmluZGlyKQotCi1pbmZvX1RFWElORk9TID0gYmludXRpbHMudGV4aQotCi1MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotc2l6ZV9TT1VSQ0VTID0gc2l6ZS5jICQoQlVMSUJTKQotCi1vYmpjb3B5X1NPVVJDRVMgPSBvYmpjb3B5LmMgbm90LXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotc3RyaW5nc19TT1VSQ0VTID0gc3RyaW5ncy5jICQoQlVMSUJTKQotCi1yZWFkZWxmX1NPVVJDRVMgPSByZWFkZWxmLmMgdmVyc2lvbi5jCi1yZWFkZWxmX0xEQUREICAgPSAkKElOVExMSUJTKSAkKExJQklCRVJUWSkKLQotc3RyaXBfbmV3X1NPVVJDRVMgPSBvYmpjb3B5LmMgaXMtc3RyaXAuYyByZW5hbWUuYyAkKFdSSVRFX0RFQlVHX1NSQ1MpICQoQlVMSUJTKQotCi1ubV9uZXdfU09VUkNFUyA9IG5tLmMgJChCVUxJQlMpCi0KLW9iamR1bXBfU09VUkNFUyA9IG9iamR1bXAuYyBwcmRiZy5jICQoREVCVUdfU1JDUykgJChCVUxJQlMpCi1vYmpkdW1wX0xEQUREID0gJChPUENPREVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLXVuZGVyc2NvcmUuYzogc3RhbXAtdW5kZXIgOyBAdHJ1ZQotCi1zdGFtcC11bmRlcjogTWFrZWZpbGUKLQllY2hvICcvKldBUk5JTkc6IFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEqLycgPnVuZGVyc2NvcmUudAotCWVjaG8gImludCBwcmVwZW5kc191bmRlcnNjb3JlID0gQFVOREVSU0NPUkVAOyIgPj51bmRlcnNjb3JlLnQKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdW5kZXJzY29yZS50IHVuZGVyc2NvcmUuYwotCXRvdWNoIHN0YW1wLXVuZGVyCi0KLWNwbHVzLWRlbS5vOiAkKEJBU0VESVIpL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyAkKElOQ0RJUikvZ2V0b3B0LmgKLQkkKENPTVBJTEUpIC1jIC1ETUFJTiAtRFZFUlNJT049JyIkKFZFUlNJT04pIicgJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMKLQotY3h4ZmlsdF9TT1VSQ0VTID0KLWN4eGZpbHRfTERBREQgPSBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLWFyX1NPVVJDRVMgPSBhcnBhcnNlLnkgYXJsZXgubCBhci5jIG5vdC1yYW5saWIuYyBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotYXJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLXJhbmxpYl9TT1VSQ0VTID0gYXIuYyBpcy1yYW5saWIuYyBhcnBhcnNlLnkgYXJsZXgubCBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotcmFubGliX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1hZGRyMmxpbmVfU09VUkNFUyA9IGFkZHIybGluZS5jICQoQlVMSUJTKQotCi0jIFRoZSBmb2xsb3dpbmcgaXMgY29tbWVudGVkIG91dCBmb3IgdGhlIGNvbnZlcnRpb24gdG8gYXV0b21ha2UuCi0jIFRoaXMgcnVsZSBjcmVhdGVzIGEgc2luZ2xlIGJpbmFyeSB0aGF0IHN3aXRjaGVzIGJldHdlZW4gYXIgYW5kIHJhbmxpYgotIyBieSBsb29raW5nIGF0IGFyZ3ZbMF0uICBVc2UgdGhpcyBrbHVkZ2UgdG8gc2F2ZSBzb21lIGRpc2sgc3BhY2UuCi0jIEhvd2V2ZXIsIHlvdSBoYXZlIHRvIGluc3RhbGwgdGhpbmdzIGJ5IGhhbmQuCi0jIChUaGF0IGlzIGFmdGVyICdtYWtlIGluc3RhbGwnLCByZXBsYWNlIHRoZSBpbnN0YWxsZWQgcmFubGliIGJ5IGEgbGluayB0byBhci4pCi0jIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gaW5zdGFsbCByYW5saWIuc2ggYXMgcmFubGliLgotIyBhcl93aXRoX3JhbmxpYjogJChBRERMX0RFUFMpIGFyLm8gbWF5YmUtcmFubGliLm8KLSMJJChITERFTlYpICQoQ0MpICQoSExERkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICQoQVJfUFJPRykgYXIubyBtYXliZS1yYW5saWIubyAkKEFERExfTElCUykgJChFWFRSQUxJQlMpCi0jCS1ybSAtZiAkKFJBTkxJQl9QUk9HKQotIwktbG4gJChBUl9QUk9HKSAkKFJBTkxJQl9QUk9HKQotIwotIyBvYmpjb3B5IGFuZCBzdHJpcCBpbiBvbmUgYmluYXJ5IHRoYXQgdXNlcyBhcmd2WzBdIHRvIGRlY2lkZSBpdHMgYWN0aW9uLgotIwotI29iamNvcHlfd2l0aF9zdHJpcDogJChBRERMX0RFUFMpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vCi0jCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKE9CSkNPUFlfUFJPRykgb2JqY29weS5vIG1heWJlLXN0cmlwLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQotIwktcm0gLWYgJChTVFJJUF9QUk9HKQotIwktbG4gJChPQkpDT1BZX1BST0cpICQoU1RSSVBfUFJPRykKLQotc3lzcm9mZi5jOiBzeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSBzeXNyb2ZmLmluZm8gCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtYyA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5jCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtaSA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+PnN5c3JvZmYuYwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWcgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKLQotc3lzcm9mZi5oOiBzeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSBzeXNyb2ZmLmluZm8KLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1kIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID5zeXNyb2ZmLmgKLQotc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCk6IHN5c2luZm8ubyBzeXNsZXgubwotCSQoQ0NfRk9SX0JVSUxEKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQCBzeXNpbmZvLm8gc3lzbGV4Lm8gCi0KLXN5c2xleC5vOiBzeXNsZXguYyBzeXNpbmZvLmgKLQlpZiBbIC1yIHN5c2xleC5jIF07IHRoZW4gXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2xleC5jICA7IFwKLQllbHNlIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gLUkkKHNyY2RpcikgJChDRkxBR1MpICQoc3JjZGlyKS9zeXNsZXguYyA7XAotCWZpCi0KLXN5c2luZm8ubzogc3lzaW5mby5jCi0JaWYgWyAtciBzeXNpbmZvLmMgXTsgdGhlbiBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAgc3lzaW5mby5jICA7IFwKLQllbHNlIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICQoc3JjZGlyKS9zeXNpbmZvLmMgOyBcCi0JZmkKLQotc3Jjb252X1NPVVJDRVMgPSBzcmNvbnYuYyBjb2ZmZ3Jvay5jICQoQlVMSUJTKQotCi1kbGx0b29sX1NPVVJDRVMgPSBkbGx0b29sLmMgZGVmcGFyc2UueSBkZWZsZXgubCBkeW4tc3RyaW5nLmMgJChCVUxJQlMpCi1kbGx0b29sX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1kbGx0b29sLm86ZGxsdG9vbC5jCi0JJChDT01QSUxFKSAtYyAkKERMTFRPT0xfREVGUykgJChzcmNkaXIpL2RsbHRvb2wuYwotCi1yZXNjb2ZmLm86cmVzY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKERMTFRPT0xfREVGUykgJChzcmNkaXIpL3Jlc2NvZmYuYwotCi1jb2ZmZHVtcF9TT1VSQ0VTID0gY29mZmR1bXAuYyBjb2ZmZ3Jvay5jICQoQlVMSUJTKQotCi1zeXNkdW1wX1NPVVJDRVMgPSBzeXNkdW1wLmMgJChCVUxJQlMpCi0KLSMgY29mZi9zeW0uaCBhbmQgY29mZi9lY29mZi5oIHdvbid0IGJlIGZvdW5kIGJ5IHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeQotIyBzY3JpcHRzLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGluY2x1ZGVkIGNvbmRpdGlvbmFsbHkuCi1ubG1jb252Lm86IG5sbWNvbnYuYyAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0JbGRuYW1lPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSQoQ09NUElMRSkgLWMgLURMRF9OQU1FPSJcIiQke2xkbmFtZX1cIiIgQE5MTUNPTlZfREVGU0AgJChzcmNkaXIpL25sbWNvbnYuYwotCi1ubG1jb252X1NPVVJDRVMgPSBubG1jb252LmMgbmxtaGVhZGVyLnkgJChCVUxJQlMpCi0KLXdpbmRyZXNfU09VUkNFUyA9IHdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyByY3BhcnNlLnkgcmNsZXgubCBcCi0Jd2luZHVuaS5jIHJlc3Jlcy5jICQoQlVMSUJTKQotd2luZHJlc19MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotZGxsd3JhcF9TT1VSQ0VTID0gZGxsd3JhcC5jIGR5bi1zdHJpbmcuYyAKLWRsbHdyYXBfTERBREQgPSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotCi1ESVNUU1RVRkYgPSBhcnBhcnNlLmMgYXJwYXJzZS5oIGFybGV4LmMgbmxtaGVhZGVyLmMgc3lzaW5mby5jIHN5c2luZm8uaCBcCi0Jc3lzbGV4LmMgZGVmbGV4LmMgZGVmcGFyc2UuaCBkZWZwYXJzZS5jIHJjbGV4LmMgcmNwYXJzZS5oIHJjcGFyc2UuYwotCi1kaXN0c3R1ZmY6ICQoRElTVFNUVUZGKSBpbmZvCi0KLURJU1RDTEVBTkZJTEVTID0gc3RhbXAtdW5kZXIgc3lzaW5mbyB1bmRlcnNjb3JlLmMgc3lzcm9mZi5jIHN5c3JvZmYuaCBcCi0Jc2l0ZS5leHAgc2l0ZS5iYWsKLQotIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiBERVAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPERFUDEgPkRFUAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotREVQMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKLQlybSAtZiBERVAyCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JJChNS0RFUCkgLWYgREVQMiAkKElOQ0xVREVTKSAkPwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVAyIERFUDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jb2JqZGlyPWBwd2RgOyBcCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwlcCi0JCS1lICJzIUBPQkpESVJAISQke29iamRpcn0hIgotCi1kZXA6IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIyMKLSMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCi1jb25maWcudGV4aTogTWFrZWZpbGUKLQlybSAtZiBjb25maWcudGV4aQotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+IGNvbmZpZy50ZXhpCi0KLWJpbnV0aWxzLmR2aTogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKLQotYmludXRpbHMuaW5mbzogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBjb25maWcudGV4aQotCi0kKERFTUFOR0xFUl9OQU1FKS4xOiBjeHhmaWx0Lm1hbiBNYWtlZmlsZQotCXNlZCAtZSAncy9AUFJPR1JBTUAvJChERU1BTkdMRVJfTkFNRSkvJyA8ICQoc3JjZGlyKS9jeHhmaWx0Lm1hbiBcCi0JCT4gJChERU1BTkdMRVJfTkFNRSkuMQotCi1NT1NUTFlDTEVBTkZJTEVTID0gc3lzaW5mbyAkKERFTUFOR0xFUl9OQU1FKS4xIGJpbnV0aWxzLmxvZyBiaW51dGlscy5zdW0gXAotCWFiY2RlZmdoKgotbW9zdGx5Y2xlYW4tbG9jYWw6Ci0JLXJtIC1yZiB0bXBkaXIKLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgREVQIERFUDEKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBpbnN0YWxsLWJpblBST0dSQU1TICQoYmluX1BST0dSQU1TKSAkKG5vaW5zdF9QUk9HUkFNUykKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLycgLWUgJ3MvY3h4ZmlsdC8kKERFTUFOR0xFUl9OQU1FKS8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLycgLWUgJ3MvY3h4ZmlsdC8kKERFTUFOR0xFUl9OQU1FKS8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCSQobWtpbnN0YWxsZGlycykgJCh0b29sZGlyKS9iaW4KLQlmb3IgaSBpbiAkKFRPT0xfUFJPR1MpOyBkbyBcCi0JICBpZiBbIC1mICQkaSQoRVhFRVhUKSBdOyB0aGVuIFwKLQkgICAgaj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvLW5ldy8vJ2A7IFwKLQkgICAgaz1gZWNobyAkJGogfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JICAgIGlmIFsgIiQoYmluZGlyKS8kJGskKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgICAgIHJtIC1mICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAotCSAgICAgIGxuICQoYmluZGlyKS8kJGskKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCQl8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGkkKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpOyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIHRydWU7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hZGRyMmxpbmUubzogYWRkcjJsaW5lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWFyLm86IGFyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvYW91dC9hci5oICQoQkZERElSKS9saWJiZmQuaCBhcnN1cC5oCi1hcnN1cC5vOiBhcnN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGFyc3VwLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWJ1Y29tbS5vOiBidWNvbW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmR1bXAubzogY29mZmR1bXAuYyBjb2ZmZ3Jvay5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmdyb2subzogY29mZmdyb2suYyBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmZ3Jvay5oCi1kZWJ1Zy5vOiBkZWJ1Zy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaAotZGxsdG9vbC5vOiBkbGx0b29sLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2RlbWFuZ2xlLmggZHluLXN0cmluZy5oIFwKLSAgZGxsdG9vbC5oCi1maWxlbW9kZS5vOiBmaWxlbW9kZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWllZWUubzogaWVlZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvaWVlZS5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLWlzLXJhbmxpYi5vOiBpcy1yYW5saWIuYwotaXMtc3RyaXAubzogaXMtc3RyaXAuYwotbWF5YmUtcmFubGliLm86IG1heWJlLXJhbmxpYi5jCi1tYXliZS1zdHJpcC5vOiBtYXliZS1zdHJpcC5jCi1ubG1jb252Lm86IG5sbWNvbnYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoQkZERElSKS9saWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1jb252LmgKLW5tLm86IG5tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1ub3QtcmFubGliLm86IG5vdC1yYW5saWIuYwotbm90LXN0cmlwLm86IG5vdC1zdHJpcC5jCi1vYmpjb3B5Lm86IG9iamNvcHkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWRiZy5oCi1vYmpkdW1wLm86IG9iamR1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1wcmRiZy5vOiBwcmRiZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1yZGNvZmYubzogcmRjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggXAotICBidWRiZy5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotcmRkYmcubzogcmRkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotc2l6ZS5vOiBzaXplLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9nZXRvcHQuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcmNvbnYubzogc3Jjb252LmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIHN5c3JvZmYuaCBjb2ZmZ3Jvay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3lzcm9mZi5jCi1zdGFicy5vOiBzdGFicy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RyaW5ncy5vOiBzdHJpbmdzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN5c2R1bXAubzogc3lzZHVtcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggc3lzcm9mZi5oIFwKLSAgc3lzcm9mZi5jCi12ZXJzaW9uLm86IHZlcnNpb24uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi13cnN0YWJzLm86IHdyc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXdpbmRyZXMubzogd2luZHJlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9vYnN0YWNrLmggd2luZHJlcy5oIFwKLSAgd2luZHVuaS5oCi1yZXNyYy5vOiByZXNyYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotcmVzY29mZi5vOiByZXNjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLXJlc2Jpbi5vOiByZXNiaW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXdpbmR1bmkubzogd2luZHVuaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggd2luZHVuaS5oCi1yZWFkZWxmLm86IHJlYWRlbGYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvbWlwcy5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9tNjhrLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL2QzMHYuaCAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvaTk2MC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLXJlc3Jlcy5vOiByZXNyZXMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLWR5bi1zdHJpbmcubzogZHluLXN0cmluZy5jIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgZHluLXN0cmluZy5oCi1kbGx3cmFwLm86IGRsbHdyYXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBkeW4tc3RyaW5nLmgKLXJlbmFtZS5vOiByZW5hbWUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi11bmRlcnNjb3JlLm86IHVuZGVyc2NvcmUuYwotYXJwYXJzZS5vOiBhcnBhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBhcnN1cC5oCi1hcmxleC5vOiBhcmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCBhcnBhcnNlLmgKLXN5c3JvZmYubzogc3lzcm9mZi5jCi1zeXNpbmZvLm86IHN5c2luZm8uYwotc3lzbGV4Lm86IHN5c2xleC5jIHN5c2luZm8uaAotZGVmcGFyc2UubzogZGVmcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGRsbHRvb2wuaAotZGVmbGV4Lm86IGRlZmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGRlZnBhcnNlLmggZGxsdG9vbC5oCi1ubG1oZWFkZXIubzogbmxtaGVhZGVyLmMgLi4vYmZkL2JmZC5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gIG5sbWNvbnYuaAotcmNwYXJzZS5vOiByY3BhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi1yY2xleC5vOiByY2xleC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaCByY3BhcnNlLmgKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9iaW51dGlscy9NYWtlZmlsZS5pbiBiL2JpbnV0aWxzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2Q0MzYwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MCArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQlVJTERfRExMVE9PTCA9IEBCVUlMRF9ETExUT09MQAotQlVJTERfRExMV1JBUCA9IEBCVUlMRF9ETExXUkFQQAotQlVJTERfTUlTQyA9IEBCVUlMRF9NSVNDQAotQlVJTERfTkxNQ09OViA9IEBCVUlMRF9OTE1DT05WQAotQlVJTERfU1JDT05WID0gQEJVSUxEX1NSQ09OVkAKLUJVSUxEX1dJTkRSRVMgPSBAQlVJTERfV0lORFJFU0AKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ERU1BTkdMRVJfTkFNRSA9IEBERU1BTkdMRVJfTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLURMTFRPT0xfREVGUyA9IEBETExUT09MX0RFRlNACi1FWEVFWFQgPSBARVhFRVhUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5MTUNPTlZfREVGUyA9IEBOTE1DT05WX0RFRlNACi1PQkpEVU1QID0gQE9CSkRVTVBACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1VTkRFUlNDT1JFID0gQFVOREVSU0NPUkVACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWwgPSBAbEAKLQotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotCi1ZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXTsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLzsgZWxzZSBlY2hvIEBZQUNDQDsgZmlgCi1ZRkxBR1MgPSAtZAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF07IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXg7IGVsc2UgZWNobyBATEVYQDsgZmlgCi0KLSMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQotQVJfUFJPRyA9IGFyCi1SQU5MSUJfUFJPRyA9IHJhbmxpYgotCi0jIG9iamNvcHkgYW5kIHN0cmlwIHNob3VsZCBiZSB0aGUgc2FtZSBwcm9ncmFtCi1PQkpDT1BZX1BST0cgPSBvYmpjb3B5Ci1TVFJJUF9QUk9HID0gc3RyaXAtbmV3Ci0KLVNUUklOR1NfUFJPRyA9IHN0cmluZ3MKLQotUkVBREVMRl9QUk9HID0gcmVhZGVsZgotCi0jIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCi1TSVpFX1BST0cgPSBzaXplCi1OTV9QUk9HID0gbm0tbmV3Ci1PQkpEVU1QX1BST0cgPSBvYmpkdW1wCi0KLSMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLSMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgotREVNQU5HTEVSX1BST0cgPSBjeHhmaWx0Ci0KLUFERFIyTElORV9QUk9HID0gYWRkcjJsaW5lCi0KLU5MTUNPTlZfUFJPRyA9IG5sbWNvbnYKLURMTFRPT0xfUFJPRyA9IGRsbHRvb2wKLVdJTkRSRVNfUFJPRyA9IHdpbmRyZXMKLURMTFdSQVBfUFJPRyA9IGRsbHdyYXAKLQotU1JDT05WX1BST0cgPSBzcmNvbnYkKEVYRUVYVCkgc3lzZHVtcCQoRVhFRVhUKSBjb2ZmZHVtcCQoRVhFRVhUKSAKLQotbWFuX01BTlMgPSBhci4xIG5tLjEgb2JqZHVtcC4xIHJhbmxpYi4xIHNpemUuMSBzdHJpbmdzLjEgc3RyaXAuMSBvYmpjb3B5LjEgXAotCWFkZHIybGluZS4xIG5sbWNvbnYuMSAkKERFTUFOR0xFUl9OQU1FKS4xCi0KLQotUFJPR1MgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoTk1fUFJPRykgJChBUl9QUk9HKSAkKFNUUklOR1NfUFJPRykgJChTVFJJUF9QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotYmluX1BST0dSQU1TID0gJChTSVpFX1BST0cpICQoT0JKRFVNUF9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotbm9pbnN0X1BST0dSQU1TID0gJChOTV9QUk9HKSAkKFNUUklQX1BST0cpICQoREVNQU5HTEVSX1BST0cpCi0KLUVYVFJBX1BST0dSQU1TID0gJChOTE1DT05WX1BST0cpIHNyY29udiBzeXNkdW1wIGNvZmZkdW1wICQoRExMVE9PTF9QUk9HKSAkKFdJTkRSRVNfUFJPRykgJChETExXUkFQX1BST0cpCi0KLSMgU3R1ZmYgdGhhdCBnb2VzIGluIHRvb2xkaXIvIGlmIGFwcHJvcHJpYXRlCi1UT09MX1BST0dTID0gbm0tbmV3IHN0cmlwLW5ldyBhciByYW5saWIgZGxsdG9vbAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLU1LREVQID0gbWtkZXAKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoQkZERElSKSAtSSQoSU5DRElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotSEZJTEVTID0gYXJzdXAuaCBidWNvbW0uaCBidWRiZy5oIGNvZmZncm9rLmggZGVidWcuaCBubG1jb252LmggZGxsdG9vbC5oIFwKLQl3aW5kcmVzLmggd2luZHVuaS5oIGR5bi1zdHJpbmcuaAotCi0KLUdFTkVSQVRFRF9IRklMRVMgPSBhcnBhcnNlLmggc3lzcm9mZi5oIHN5c2luZm8uaCBkZWZwYXJzZS5oCi0KLUNGSUxFUyA9IGFkZHIybGluZS5jIGFyLmMgYXJzdXAuYyBidWNvbW0uYyBjb2ZmZHVtcC5jIGNvZmZncm9rLmMgZGVidWcuYyBcCi0JZGxsdG9vbC5jIGZpbGVtb2RlLmMgaWVlZS5jIGlzLXJhbmxpYi5jIGlzLXN0cmlwLmMgbWF5YmUtcmFubGliLmMgXAotCW1heWJlLXN0cmlwLmMgbmxtY29udi5jIG5tLmMgbm90LXJhbmxpYi5jIG5vdC1zdHJpcC5jIFwKLQlvYmpjb3B5LmMgb2JqZHVtcC5jIHByZGJnLmMgcmRjb2ZmLmMgcmRkYmcuYyBzaXplLmMgc3Jjb252LmMgXAotCXN0YWJzLmMgc3RyaW5ncy5jIHN5c2R1bXAuYyB2ZXJzaW9uLmMgd3JzdGFicy5jIFwKLQl3aW5kcmVzLmMgcmVzcmMuYyByZXNjb2ZmLmMgcmVzYmluLmMgd2luZHVuaS5jIHJlYWRlbGYuYyBcCi0JcmVzcmVzLmMgZHluLXN0cmluZy5jIGRsbHdyYXAuYyByZW5hbWUuYwotCi0KLUdFTkVSQVRFRF9DRklMRVMgPSBcCi0JdW5kZXJzY29yZS5jIGFycGFyc2UuYyBhcmxleC5jIHN5c3JvZmYuYyBzeXNpbmZvLmMgc3lzbGV4LmMgXAotCWRlZnBhcnNlLmMgZGVmbGV4LmMgbmxtaGVhZGVyLmMgcmNwYXJzZS5jIHJjbGV4LmMKLQotCi1ERUJVR19TUkNTID0gcmRkYmcuYyBkZWJ1Zy5jIHN0YWJzLmMgaWVlZS5jIHJkY29mZi5jCi1XUklURV9ERUJVR19TUkNTID0gJChERUJVR19TUkNTKSB3cnN0YWJzLmMKLQotIyBDb2RlIHNoYXJlZCBieSBhbGwgdGhlIGJpbnV0aWxzLgotQlVMSUJTID0gYnVjb21tLmMgdmVyc2lvbi5jIGZpbGVtb2RlLmMKLQotQkZETElCID0gLi4vYmZkL2xpYmJmZC5sYQotCi1PUENPREVTID0gLi4vb3Bjb2Rlcy9saWJvcGNvZGVzLmxhCi0KLUxJQklCRVJUWSA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKERFQlVHX1NSQ1MpICQoSEZJTEVTKQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHIvLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKLSAgICAgICAgICAgZWNobyAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgXAotICAgICAgICAgICBlbHNlIGVjaG8gcnVudGVzdCA7ICBmaWAKLQotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLWluZm9fVEVYSU5GT1MgPSBiaW51dGlscy50ZXhpCi0KLUxEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1zaXplX1NPVVJDRVMgPSBzaXplLmMgJChCVUxJQlMpCi0KLW9iamNvcHlfU09VUkNFUyA9IG9iamNvcHkuYyBub3Qtc3RyaXAuYyByZW5hbWUuYyAkKFdSSVRFX0RFQlVHX1NSQ1MpICQoQlVMSUJTKQotCi1zdHJpbmdzX1NPVVJDRVMgPSBzdHJpbmdzLmMgJChCVUxJQlMpCi0KLXJlYWRlbGZfU09VUkNFUyA9IHJlYWRlbGYuYyB2ZXJzaW9uLmMKLXJlYWRlbGZfTERBREQgPSAkKElOVExMSUJTKSAkKExJQklCRVJUWSkKLQotc3RyaXBfbmV3X1NPVVJDRVMgPSBvYmpjb3B5LmMgaXMtc3RyaXAuYyByZW5hbWUuYyAkKFdSSVRFX0RFQlVHX1NSQ1MpICQoQlVMSUJTKQotCi1ubV9uZXdfU09VUkNFUyA9IG5tLmMgJChCVUxJQlMpCi0KLW9iamR1bXBfU09VUkNFUyA9IG9iamR1bXAuYyBwcmRiZy5jICQoREVCVUdfU1JDUykgJChCVUxJQlMpCi1vYmpkdW1wX0xEQUREID0gJChPUENPREVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLWN4eGZpbHRfU09VUkNFUyA9IAotY3h4ZmlsdF9MREFERCA9IGNwbHVzLWRlbS5vIHVuZGVyc2NvcmUubyAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotYXJfU09VUkNFUyA9IGFycGFyc2UueSBhcmxleC5sIGFyLmMgbm90LXJhbmxpYi5jIGFyc3VwLmMgcmVuYW1lLmMgJChCVUxJQlMpCi1hcl9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotcmFubGliX1NPVVJDRVMgPSBhci5jIGlzLXJhbmxpYi5jIGFycGFyc2UueSBhcmxleC5sIGFyc3VwLmMgcmVuYW1lLmMgJChCVUxJQlMpCi1yYW5saWJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWFkZHIybGluZV9TT1VSQ0VTID0gYWRkcjJsaW5lLmMgJChCVUxJQlMpCi0KLXNyY29udl9TT1VSQ0VTID0gc3Jjb252LmMgY29mZmdyb2suYyAkKEJVTElCUykKLQotZGxsdG9vbF9TT1VSQ0VTID0gZGxsdG9vbC5jIGRlZnBhcnNlLnkgZGVmbGV4LmwgZHluLXN0cmluZy5jICQoQlVMSUJTKQotZGxsdG9vbF9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotY29mZmR1bXBfU09VUkNFUyA9IGNvZmZkdW1wLmMgY29mZmdyb2suYyAkKEJVTElCUykKLQotc3lzZHVtcF9TT1VSQ0VTID0gc3lzZHVtcC5jICQoQlVMSUJTKQotCi1ubG1jb252X1NPVVJDRVMgPSBubG1jb252LmMgbmxtaGVhZGVyLnkgJChCVUxJQlMpCi0KLXdpbmRyZXNfU09VUkNFUyA9IHdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyByY3BhcnNlLnkgcmNsZXgubCBcCi0Jd2luZHVuaS5jIHJlc3Jlcy5jICQoQlVMSUJTKQotCi13aW5kcmVzX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1kbGx3cmFwX1NPVVJDRVMgPSBkbGx3cmFwLmMgZHluLXN0cmluZy5jIAotZGxsd3JhcF9MREFERCA9ICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1ESVNUU1RVRkYgPSBhcnBhcnNlLmMgYXJwYXJzZS5oIGFybGV4LmMgbmxtaGVhZGVyLmMgc3lzaW5mby5jIHN5c2luZm8uaCBcCi0Jc3lzbGV4LmMgZGVmbGV4LmMgZGVmcGFyc2UuaCBkZWZwYXJzZS5jIHJjbGV4LmMgcmNwYXJzZS5oIHJjcGFyc2UuYwotCi0KLURJU1RDTEVBTkZJTEVTID0gc3RhbXAtdW5kZXIgc3lzaW5mbyB1bmRlcnNjb3JlLmMgc3lzcm9mZi5jIHN5c3JvZmYuaCBcCi0Jc2l0ZS5leHAgc2l0ZS5iYWsKLQotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGNvbmZpZy50ZXhpCi0KLU1PU1RMWUNMRUFORklMRVMgPSBzeXNpbmZvICQoREVNQU5HTEVSX05BTUUpLjEgYmludXRpbHMubG9nIGJpbnV0aWxzLnN1bSBcCi0JYWJjZGVmZ2gqCi0KLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgREVQIERFUDEKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1iaW5fUFJPR1JBTVMgPSAgc2l6ZSQoRVhFRVhUKSBvYmpkdW1wJChFWEVFWFQpIGFyJChFWEVFWFQpIFwKLXN0cmluZ3MkKEVYRUVYVCkgcmFubGliJChFWEVFWFQpIG9iamNvcHkkKEVYRUVYVCkgQEJVSUxEX05MTUNPTlZAIFwKLUBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgYWRkcjJsaW5lJChFWEVFWFQpIFwKLXJlYWRlbGYkKEVYRUVYVCkgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotbm9pbnN0X1BST0dSQU1TID0gIG5tLW5ldyQoRVhFRVhUKSBzdHJpcC1uZXckKEVYRUVYVCkgY3h4ZmlsdCQoRVhFRVhUKQotUFJPR1JBTVMgPSAgJChiaW5fUFJPR1JBTVMpICQobm9pbnN0X1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1ubG1jb252X09CSkVDVFMgPSAgbmxtY29udi5vIG5sbWhlYWRlci5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1ubG1jb252X0xEQUREID0gJChMREFERCkKLW5sbWNvbnZfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1ubG1jb252X0xERkxBR1MgPSAKLXNyY29udl9PQkpFQ1RTID0gIHNyY29udi5vIGNvZmZncm9rLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXNyY29udl9MREFERCA9ICQoTERBREQpCi1zcmNvbnZfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zcmNvbnZfTERGTEFHUyA9IAotc3lzZHVtcF9PQkpFQ1RTID0gIHN5c2R1bXAubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3lzZHVtcF9MREFERCA9ICQoTERBREQpCi1zeXNkdW1wX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3lzZHVtcF9MREZMQUdTID0gCi1jb2ZmZHVtcF9PQkpFQ1RTID0gIGNvZmZkdW1wLm8gY29mZmdyb2subyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotY29mZmR1bXBfTERBREQgPSAkKExEQUREKQotY29mZmR1bXBfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1jb2ZmZHVtcF9MREZMQUdTID0gCi1kbGx0b29sX09CSkVDVFMgPSAgZGxsdG9vbC5vIGRlZnBhcnNlLm8gZGVmbGV4Lm8gZHluLXN0cmluZy5vIGJ1Y29tbS5vIFwKLXZlcnNpb24ubyBmaWxlbW9kZS5vCi1kbGx0b29sX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZGxsdG9vbF9MREZMQUdTID0gCi13aW5kcmVzX09CSkVDVFMgPSAgd2luZHJlcy5vIHJlc3JjLm8gcmVzY29mZi5vIHJlc2Jpbi5vIHJjcGFyc2UubyBcCi1yY2xleC5vIHdpbmR1bmkubyByZXNyZXMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotd2luZHJlc19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXdpbmRyZXNfTERGTEFHUyA9IAotZGxsd3JhcF9PQkpFQ1RTID0gIGRsbHdyYXAubyBkeW4tc3RyaW5nLm8KLWRsbHdyYXBfREVQRU5ERU5DSUVTID0gIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZGxsd3JhcF9MREZMQUdTID0gCi1zaXplX09CSkVDVFMgPSAgc2l6ZS5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1zaXplX0xEQUREID0gJChMREFERCkKLXNpemVfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zaXplX0xERkxBR1MgPSAKLW9iamR1bXBfT0JKRUNUUyA9ICBvYmpkdW1wLm8gcHJkYmcubyByZGRiZy5vIGRlYnVnLm8gc3RhYnMubyBpZWVlLm8gXAotcmRjb2ZmLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW9iamR1bXBfREVQRU5ERU5DSUVTID0gIC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYSAuLi9iZmQvbGliYmZkLmxhIFwKLS4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotb2JqZHVtcF9MREZMQUdTID0gCi1hcl9PQkpFQ1RTID0gIGFycGFyc2UubyBhcmxleC5vIGFyLm8gbm90LXJhbmxpYi5vIGFyc3VwLm8gcmVuYW1lLm8gXAotYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLWFyX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotYXJfTERGTEFHUyA9IAotc3RyaW5nc19PQkpFQ1RTID0gIHN0cmluZ3MubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3RyaW5nc19MREFERCA9ICQoTERBREQpCi1zdHJpbmdzX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3RyaW5nc19MREZMQUdTID0gCi1yYW5saWJfT0JKRUNUUyA9ICBhci5vIGlzLXJhbmxpYi5vIGFycGFyc2UubyBhcmxleC5vIGFyc3VwLm8gcmVuYW1lLm8gXAotYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXJhbmxpYl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXJhbmxpYl9MREZMQUdTID0gCi1vYmpjb3B5X09CSkVDVFMgPSAgb2JqY29weS5vIG5vdC1zdHJpcC5vIHJlbmFtZS5vIHJkZGJnLm8gZGVidWcubyBcCi1zdGFicy5vIGllZWUubyByZGNvZmYubyB3cnN0YWJzLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW9iamNvcHlfTERBREQgPSAkKExEQUREKQotb2JqY29weV9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLW9iamNvcHlfTERGTEFHUyA9IAotYWRkcjJsaW5lX09CSkVDVFMgPSAgYWRkcjJsaW5lLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLWFkZHIybGluZV9MREFERCA9ICQoTERBREQpCi1hZGRyMmxpbmVfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1hZGRyMmxpbmVfTERGTEFHUyA9IAotcmVhZGVsZl9PQkpFQ1RTID0gIHJlYWRlbGYubyB2ZXJzaW9uLm8KLXJlYWRlbGZfREVQRU5ERU5DSUVTID0gIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotcmVhZGVsZl9MREZMQUdTID0gCi1ubV9uZXdfT0JKRUNUUyA9ICBubS5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1ubV9uZXdfTERBREQgPSAkKExEQUREKQotbm1fbmV3X0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotbm1fbmV3X0xERkxBR1MgPSAKLXN0cmlwX25ld19PQkpFQ1RTID0gIG9iamNvcHkubyBpcy1zdHJpcC5vIHJlbmFtZS5vIHJkZGJnLm8gZGVidWcubyBcCi1zdGFicy5vIGllZWUubyByZGNvZmYubyB3cnN0YWJzLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXN0cmlwX25ld19MREFERCA9ICQoTERBREQpCi1zdHJpcF9uZXdfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zdHJpcF9uZXdfTERGTEFHUyA9IAotY3h4ZmlsdF9PQkpFQ1RTID0gCi1jeHhmaWx0X0RFUEVOREVOQ0lFUyA9ICBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gXAotLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1jeHhmaWx0X0xERkxBR1MgPSAKLUxFWF9PVVRQVVRfUk9PVCA9IEBMRVhfT1VUUFVUX1JPT1RACi1MRVhMSUIgPSBATEVYTElCQAotWUxXUkFQID0gJCh0b3Bfc3JjZGlyKS8uLi95bHdyYXAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGJpbnV0aWxzLmluZm8KLURWSVMgPSBiaW51dGlscy5kdmkKLVRFWElORk9TID0gYmludXRpbHMudGV4aQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotTkVXUyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBhcmxleC5jIGFycGFyc2UuYyBjb25maWcuaW4gY29uZmlndXJlIFwKLWNvbmZpZ3VyZS5pbiBkZWZsZXguYyBkZWZwYXJzZS5jIG5sbWhlYWRlci5jIHJjbGV4LmMgcmNwYXJzZS5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKG5sbWNvbnZfU09VUkNFUykgJChzcmNvbnZfU09VUkNFUykgJChzeXNkdW1wX1NPVVJDRVMpICQoY29mZmR1bXBfU09VUkNFUykgJChkbGx0b29sX1NPVVJDRVMpICQod2luZHJlc19TT1VSQ0VTKSAkKGRsbHdyYXBfU09VUkNFUykgJChzaXplX1NPVVJDRVMpICQob2JqZHVtcF9TT1VSQ0VTKSAkKGFyX1NPVVJDRVMpICQoc3RyaW5nc19TT1VSQ0VTKSAkKHJhbmxpYl9TT1VSQ0VTKSAkKG9iamNvcHlfU09VUkNFUykgJChhZGRyMmxpbmVfU09VUkNFUykgJChyZWFkZWxmX1NPVVJDRVMpICQobm1fbmV3X1NPVVJDRVMpICQoc3RyaXBfbmV3X1NPVVJDRVMpICQoY3h4ZmlsdF9TT1VSQ0VTKQotT0JKRUNUUyA9ICQobmxtY29udl9PQkpFQ1RTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHN5c2R1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9PQkpFQ1RTKSAkKGRsbHRvb2xfT0JKRUNUUykgJCh3aW5kcmVzX09CSkVDVFMpICQoZGxsd3JhcF9PQkpFQ1RTKSAkKHNpemVfT0JKRUNUUykgJChvYmpkdW1wX09CSkVDVFMpICQoYXJfT0JKRUNUUykgJChzdHJpbmdzX09CSkVDVFMpICQocmFubGliX09CSkVDVFMpICQob2JqY29weV9PQkpFQ1RTKSAkKGFkZHIybGluZV9PQkpFQ1RTKSAkKHJlYWRlbGZfT0JKRUNUUykgJChubV9uZXdfT0JKRUNUUykgJChzdHJpcF9uZXdfT0JKRUNUUykgJChjeHhmaWx0X09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmwgLmxvIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUzoKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1iaW5QUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUzoKLQotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLW5sbWNvbnYkKEVYRUVYVCk6ICQobmxtY29udl9PQkpFQ1RTKSAkKG5sbWNvbnZfREVQRU5ERU5DSUVTKQotCUBybSAtZiBubG1jb252JChFWEVFWFQpCi0JJChMSU5LKSAkKG5sbWNvbnZfTERGTEFHUykgJChubG1jb252X09CSkVDVFMpICQobmxtY29udl9MREFERCkgJChMSUJTKQotCi1zcmNvbnYkKEVYRUVYVCk6ICQoc3Jjb252X09CSkVDVFMpICQoc3Jjb252X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3Jjb252JChFWEVFWFQpCi0JJChMSU5LKSAkKHNyY29udl9MREZMQUdTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHNyY29udl9MREFERCkgJChMSUJTKQotCi1zeXNkdW1wJChFWEVFWFQpOiAkKHN5c2R1bXBfT0JKRUNUUykgJChzeXNkdW1wX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3lzZHVtcCQoRVhFRVhUKQotCSQoTElOSykgJChzeXNkdW1wX0xERkxBR1MpICQoc3lzZHVtcF9PQkpFQ1RTKSAkKHN5c2R1bXBfTERBREQpICQoTElCUykKLQotY29mZmR1bXAkKEVYRUVYVCk6ICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGNvZmZkdW1wJChFWEVFWFQpCi0JJChMSU5LKSAkKGNvZmZkdW1wX0xERkxBR1MpICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9MREFERCkgJChMSUJTKQotCi1kbGx0b29sJChFWEVFWFQpOiAkKGRsbHRvb2xfT0JKRUNUUykgJChkbGx0b29sX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZGxsdG9vbCQoRVhFRVhUKQotCSQoTElOSykgJChkbGx0b29sX0xERkxBR1MpICQoZGxsdG9vbF9PQkpFQ1RTKSAkKGRsbHRvb2xfTERBREQpICQoTElCUykKLQotd2luZHJlcyQoRVhFRVhUKTogJCh3aW5kcmVzX09CSkVDVFMpICQod2luZHJlc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHdpbmRyZXMkKEVYRUVYVCkKLQkkKExJTkspICQod2luZHJlc19MREZMQUdTKSAkKHdpbmRyZXNfT0JKRUNUUykgJCh3aW5kcmVzX0xEQUREKSAkKExJQlMpCi0KLWRsbHdyYXAkKEVYRUVYVCk6ICQoZGxsd3JhcF9PQkpFQ1RTKSAkKGRsbHdyYXBfREVQRU5ERU5DSUVTKQotCUBybSAtZiBkbGx3cmFwJChFWEVFWFQpCi0JJChMSU5LKSAkKGRsbHdyYXBfTERGTEFHUykgJChkbGx3cmFwX09CSkVDVFMpICQoZGxsd3JhcF9MREFERCkgJChMSUJTKQotCi1zaXplJChFWEVFWFQpOiAkKHNpemVfT0JKRUNUUykgJChzaXplX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc2l6ZSQoRVhFRVhUKQotCSQoTElOSykgJChzaXplX0xERkxBR1MpICQoc2l6ZV9PQkpFQ1RTKSAkKHNpemVfTERBREQpICQoTElCUykKLQotb2JqZHVtcCQoRVhFRVhUKTogJChvYmpkdW1wX09CSkVDVFMpICQob2JqZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIG9iamR1bXAkKEVYRUVYVCkKLQkkKExJTkspICQob2JqZHVtcF9MREZMQUdTKSAkKG9iamR1bXBfT0JKRUNUUykgJChvYmpkdW1wX0xEQUREKSAkKExJQlMpCi0KLWFyJChFWEVFWFQpOiAkKGFyX09CSkVDVFMpICQoYXJfREVQRU5ERU5DSUVTKQotCUBybSAtZiBhciQoRVhFRVhUKQotCSQoTElOSykgJChhcl9MREZMQUdTKSAkKGFyX09CSkVDVFMpICQoYXJfTERBREQpICQoTElCUykKLQotc3RyaW5ncyQoRVhFRVhUKTogJChzdHJpbmdzX09CSkVDVFMpICQoc3RyaW5nc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHN0cmluZ3MkKEVYRUVYVCkKLQkkKExJTkspICQoc3RyaW5nc19MREZMQUdTKSAkKHN0cmluZ3NfT0JKRUNUUykgJChzdHJpbmdzX0xEQUREKSAkKExJQlMpCi0KLXJhbmxpYiQoRVhFRVhUKTogJChyYW5saWJfT0JKRUNUUykgJChyYW5saWJfREVQRU5ERU5DSUVTKQotCUBybSAtZiByYW5saWIkKEVYRUVYVCkKLQkkKExJTkspICQocmFubGliX0xERkxBR1MpICQocmFubGliX09CSkVDVFMpICQocmFubGliX0xEQUREKSAkKExJQlMpCi0KLW9iamNvcHkkKEVYRUVYVCk6ICQob2JqY29weV9PQkpFQ1RTKSAkKG9iamNvcHlfREVQRU5ERU5DSUVTKQotCUBybSAtZiBvYmpjb3B5JChFWEVFWFQpCi0JJChMSU5LKSAkKG9iamNvcHlfTERGTEFHUykgJChvYmpjb3B5X09CSkVDVFMpICQob2JqY29weV9MREFERCkgJChMSUJTKQotCi1hZGRyMmxpbmUkKEVYRUVYVCk6ICQoYWRkcjJsaW5lX09CSkVDVFMpICQoYWRkcjJsaW5lX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgYWRkcjJsaW5lJChFWEVFWFQpCi0JJChMSU5LKSAkKGFkZHIybGluZV9MREZMQUdTKSAkKGFkZHIybGluZV9PQkpFQ1RTKSAkKGFkZHIybGluZV9MREFERCkgJChMSUJTKQotCi1yZWFkZWxmJChFWEVFWFQpOiAkKHJlYWRlbGZfT0JKRUNUUykgJChyZWFkZWxmX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgcmVhZGVsZiQoRVhFRVhUKQotCSQoTElOSykgJChyZWFkZWxmX0xERkxBR1MpICQocmVhZGVsZl9PQkpFQ1RTKSAkKHJlYWRlbGZfTERBREQpICQoTElCUykKLQotbm0tbmV3JChFWEVFWFQpOiAkKG5tX25ld19PQkpFQ1RTKSAkKG5tX25ld19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIG5tLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChubV9uZXdfTERGTEFHUykgJChubV9uZXdfT0JKRUNUUykgJChubV9uZXdfTERBREQpICQoTElCUykKLQotc3RyaXAtbmV3JChFWEVFWFQpOiAkKHN0cmlwX25ld19PQkpFQ1RTKSAkKHN0cmlwX25ld19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHN0cmlwLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChzdHJpcF9uZXdfTERGTEFHUykgJChzdHJpcF9uZXdfT0JKRUNUUykgJChzdHJpcF9uZXdfTERBREQpICQoTElCUykKLQotY3h4ZmlsdCQoRVhFRVhUKTogJChjeHhmaWx0X09CSkVDVFMpICQoY3h4ZmlsdF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGN4eGZpbHQkKEVYRUVYVCkKLQkkKExJTkspICQoY3h4ZmlsdF9MREZMQUdTKSAkKGN4eGZpbHRfT0JKRUNUUykgJChjeHhmaWx0X0xEQUREKSAkKExJQlMpCi0ubC5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChMRVgpIiAkPCAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQCAtLSAkKEFNX0xGTEFHUykgJChMRkxBR1MpCi0ueS5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJDwgeS50YWIuYyAkKi5jIHkudGFiLmggJCouaCAtLSAkKEFNX1lGTEFHUykgJChZRkxBR1MpCi1hcnBhcnNlLmg6IGFycGFyc2UuYwotZGVmcGFyc2UuaDogZGVmcGFyc2UuYwotbmxtaGVhZGVyLmg6IG5sbWhlYWRlci5jCi1yY3BhcnNlLmg6IHJjcGFyc2UuYwotCi0KLWJpbnV0aWxzLmluZm86IGJpbnV0aWxzLnRleGkKLWJpbnV0aWxzLmR2aTogYmludXRpbHMudGV4aQotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBiaW51dGlscy5hdXggYmludXRpbHMuY3AgYmludXRpbHMuY3BzIGJpbnV0aWxzLmR2aSBiaW51dGlscy5mbiBcCi0JICBiaW51dGlscy5mbnMgYmludXRpbHMua3kgYmludXRpbHMua3lzIGJpbnV0aWxzLnBzIFwKLQkgIGJpbnV0aWxzLmxvZyBiaW51dGlscy5wZyBiaW51dGlscy50b2MgYmludXRpbHMudHAgXAotCSAgYmludXRpbHMudHBzIGJpbnV0aWxzLnZyIGJpbnV0aWxzLnZycyBiaW51dGlscy5vcCBiaW51dGlscy50ciBcCi0JICBiaW51dGlscy5jdiBiaW51dGlscy5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi0KLVJVTlRFU1RGTEFHUyA9Ci0KLURFSkFUT09MID0gJChQQUNLQUdFKQotCi1SVU5URVNUREVGQVVMVEZMQUdTID0gLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQkc3JjZGlyCi1zaXRlLmV4cDogTWFrZWZpbGUKLQlAZWNobyAnTWFraW5nIGEgbmV3IHNpdGUuZXhwIGZpbGUuLi4nCi0JQHRlc3QgISAtZiBzaXRlLmJhayB8fCBybSAtZiBzaXRlLmJhawotCUBlY2hvICcjIyB0aGVzZSB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1ha2UgIyMnID4gJEAtdAotCUBlY2hvICcjIERvIG5vdCBlZGl0IGhlcmUuICBJZiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGVzZSB2YWx1ZXMnID4+ICRALXQKLQlAZWNobyAnIyBlZGl0IHRoZSBsYXN0IHNlY3Rpb24nID4+ICRALXQKLQlAZWNobyAnc2V0IHRvb2wgJChERUpBVE9PTCknID4+ICRALXQKLQlAZWNobyAnc2V0IHNyY2RpciAkKHNyY2RpciknID4+ICRALXQKLQlAZWNobyAnc2V0IG9iamRpcicgYHB3ZGAgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF9hbGlhcyAkKGhvc3RfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X3RyaXBsZXQgJChob3N0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfYWxpYXMgJCh0YXJnZXRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfdHJpcGxldCAkKHRhcmdldF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfYWxpYXMgJChidWlsZF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX3RyaXBsZXQgJChidWlsZF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICcjIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBOb3QgRWRpdCAjIycgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgc2VkICcxLC9eIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUuKiMjLyBkJyBzaXRlLmV4cCA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBtdiBzaXRlLmV4cCBzaXRlLmJhawotCUBtdiAkQC10IHNpdGUuZXhwCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06ICQoRFZJUykKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stREVKQUdOVQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtZXhlYy1sb2NhbAotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1tYW4KLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKE1BTlMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKGJpbmRpcikgJChERVNURElSKSQobWFuZGlyKS9tYW4xCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0JLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogImFybGV4bGRlZmxleGxyY2xleGxhcnBhcnNlaGFycGFyc2VjZGVmcGFyc2VoZGVmcGFyc2VjbmxtaGVhZGVyaG5sbWhlYWRlcmNyY3BhcnNlaHJjcGFyc2VjJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mIGFybGV4bCBkZWZsZXhsIHJjbGV4bCBhcnBhcnNlaCBhcnBhcnNlYyBkZWZwYXJzZWggZGVmcGFyc2VjIG5sbWhlYWRlcmggbmxtaGVhZGVyYyByY3BhcnNlaCByY3BhcnNlYyAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVMgXAotCQltb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBtb3N0bHljbGVhbi1jb21waWxlIFwKLQkJbW9zdGx5Y2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tdGFncyBcCi0JCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbG9jYWwKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCWNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBjbGVhbi1hbWluZm8gY2xlYW4tdGFncyBcCi0JCWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1iaW5QUk9HUkFNUyBcCi0JCWRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLXRhZ3MgXAotCQlkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVMgZGlzdGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWJpblBST0dSQU1TIFwKLW1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgdW5pbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtYmluUFJPR1JBTVMgXAotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLWNsZWFuLW5vaW5zdFBST0dSQU1TIG1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBcCi1tb3N0bHljbGVhbi1hbWluZm8gZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gXAotbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gaW5zdGFsbC1tYW4xIHVuaW5zdGFsbC1tYW4xIGluc3RhbGwtbWFuIFwKLXVuaW5zdGFsbC1tYW4gaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgY2hlY2stREVKQUdOVSBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAotaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gXAotaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIFwKLWluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlzcmNkaXI9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3JjZGlyOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCi0JCUNDX0ZPUl9UQVJHRVQ9IiQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkJQ0ZMQUdTX0ZPUl9UQVJHRVQ9IiQoQ0ZMQUdTKSIgJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi1pbnN0YWxsY2hlY2s6Ci0JL2Jpbi9zaCAkKHNyY2Rpcikvc2FuaXR5LnNoICQoYmluZGlyKQotCi11bmRlcnNjb3JlLmM6IHN0YW1wLXVuZGVyIDsgQHRydWUKLQotc3RhbXAtdW5kZXI6IE1ha2VmaWxlCi0JZWNobyAnLypXQVJOSU5HOiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQhKi8nID51bmRlcnNjb3JlLnQKLQllY2hvICJpbnQgcHJlcGVuZHNfdW5kZXJzY29yZSA9IEBVTkRFUlNDT1JFQDsiID4+dW5kZXJzY29yZS50Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHVuZGVyc2NvcmUudCB1bmRlcnNjb3JlLmMKLQl0b3VjaCBzdGFtcC11bmRlcgotCi1jcGx1cy1kZW0ubzogJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMgJChJTkNESVIpL2dldG9wdC5oCi0JJChDT01QSUxFKSAtYyAtRE1BSU4gLURWRVJTSU9OPSciJChWRVJTSU9OKSInICQoQkFTRURJUikvbGliaWJlcnR5L2NwbHVzLWRlbS5jCi0KLSMgVGhlIGZvbGxvd2luZyBpcyBjb21tZW50ZWQgb3V0IGZvciB0aGUgY29udmVydGlvbiB0byBhdXRvbWFrZS4KLSMgVGhpcyBydWxlIGNyZWF0ZXMgYSBzaW5nbGUgYmluYXJ5IHRoYXQgc3dpdGNoZXMgYmV0d2VlbiBhciBhbmQgcmFubGliCi0jIGJ5IGxvb2tpbmcgYXQgYXJndlswXS4gIFVzZSB0aGlzIGtsdWRnZSB0byBzYXZlIHNvbWUgZGlzayBzcGFjZS4KLSMgSG93ZXZlciwgeW91IGhhdmUgdG8gaW5zdGFsbCB0aGluZ3MgYnkgaGFuZC4KLSMgKFRoYXQgaXMgYWZ0ZXIgJ21ha2UgaW5zdGFsbCcsIHJlcGxhY2UgdGhlIGluc3RhbGxlZCByYW5saWIgYnkgYSBsaW5rIHRvIGFyLikKLSMgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnN0YWxsIHJhbmxpYi5zaCBhcyByYW5saWIuCi0jIGFyX3dpdGhfcmFubGliOiAkKEFERExfREVQUykgYXIubyBtYXliZS1yYW5saWIubwotIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChBUl9QUk9HKSBhci5vIG1heWJlLXJhbmxpYi5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKLSMJLXJtIC1mICQoUkFOTElCX1BST0cpCi0jCS1sbiAkKEFSX1BST0cpICQoUkFOTElCX1BST0cpCi0jCi0jIG9iamNvcHkgYW5kIHN0cmlwIGluIG9uZSBiaW5hcnkgdGhhdCB1c2VzIGFyZ3ZbMF0gdG8gZGVjaWRlIGl0cyBhY3Rpb24uCi0jCi0jb2JqY29weV93aXRoX3N0cmlwOiAkKEFERExfREVQUykgb2JqY29weS5vIG1heWJlLXN0cmlwLm8KLSMJJChITERFTlYpICQoQ0MpICQoSExERkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICQoT0JKQ09QWV9QUk9HKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubyAkKEFERExfTElCUykgJChFWFRSQUxJQlMpCi0jCS1ybSAtZiAkKFNUUklQX1BST0cpCi0jCS1sbiAkKE9CSkNPUFlfUFJPRykgJChTVFJJUF9QUk9HKQotCi1zeXNyb2ZmLmM6IHN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIHN5c3JvZmYuaW5mbyAKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1jIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID5zeXNyb2ZmLmMKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1pIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZyA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+PnN5c3JvZmYuYwotCi1zeXNyb2ZmLmg6IHN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIHN5c3JvZmYuaW5mbwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWQgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuaAotCi1zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKTogc3lzaW5mby5vIHN5c2xleC5vCi0JJChDQ19GT1JfQlVJTEQpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIHN5c2luZm8ubyBzeXNsZXgubyAKLQotc3lzbGV4Lm86IHN5c2xleC5jIHN5c2luZm8uaAotCWlmIFsgLXIgc3lzbGV4LmMgXTsgdGhlbiBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAgc3lzbGV4LmMgIDsgXAotCWVsc2UgXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAtSSQoc3JjZGlyKSAkKENGTEFHUykgJChzcmNkaXIpL3N5c2xleC5jIDtcCi0JZmkKLQotc3lzaW5mby5vOiBzeXNpbmZvLmMKLQlpZiBbIC1yIHN5c2luZm8uYyBdOyB0aGVuIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNpbmZvLmMgIDsgXAotCWVsc2UgXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgJChzcmNkaXIpL3N5c2luZm8uYyA7IFwKLQlmaQotCi1kbGx0b29sLm86ZGxsdG9vbC5jCi0JJChDT01QSUxFKSAtYyAkKERMTFRPT0xfREVGUykgJChzcmNkaXIpL2RsbHRvb2wuYwotCi1yZXNjb2ZmLm86cmVzY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKERMTFRPT0xfREVGUykgJChzcmNkaXIpL3Jlc2NvZmYuYwotCi0jIGNvZmYvc3ltLmggYW5kIGNvZmYvZWNvZmYuaCB3b24ndCBiZSBmb3VuZCBieSB0aGUgYXV0b21hdGljIGRlcGVuZGVuY3kKLSMgc2NyaXB0cywgc2luY2UgdGhleSBhcmUgb25seSBpbmNsdWRlZCBjb25kaXRpb25hbGx5LgotbmxtY29udi5vOiBubG1jb252LmMgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCWxkbmFtZT1gZWNobyBsZCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQkkKENPTVBJTEUpIC1jIC1ETERfTkFNRT0iXCIkJHtsZG5hbWV9XCIiIEBOTE1DT05WX0RFRlNAICQoc3JjZGlyKS9ubG1jb252LmMKLQotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi0jIFRhcmdldHMgdG8gcmVidWlsZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBNYWtlZmlsZS4KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIERFUDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLURFUDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSQoTUtERVApIERFUDEKLQlzZWQgLWYgZGVwLnNlZCA8REVQMSA+REVQCi0KLSMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi1ERVAxOiAkKENGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKQotCXJtIC1mIERFUDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDIKLQkkKE1LREVQKSAtZiBERVAyICQoSU5DTFVERVMpICQ/Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIERFUDIgREVQMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlvYmpkaXI9YHB3ZGA7IFwKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAQkZERElSQCEkKEJGRERJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCVwKLQkJLWUgInMhQE9CSkRJUkAhJCR7b2JqZGlyfSEiCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMjIwotIyBET0NVTUVOVEFUSU9OIFRBUkdFVFMKLWNvbmZpZy50ZXhpOiBNYWtlZmlsZQotCXJtIC1mIGNvbmZpZy50ZXhpCi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gY29uZmlnLnRleGkKLQotYmludXRpbHMuZHZpOiAkKHNyY2RpcikvYmludXRpbHMudGV4aSBjb25maWcudGV4aQotCi1iaW51dGlscy5pbmZvOiAkKHNyY2RpcikvYmludXRpbHMudGV4aSBjb25maWcudGV4aQotCi0kKERFTUFOR0xFUl9OQU1FKS4xOiBjeHhmaWx0Lm1hbiBNYWtlZmlsZQotCXNlZCAtZSAncy9AUFJPR1JBTUAvJChERU1BTkdMRVJfTkFNRSkvJyA8ICQoc3JjZGlyKS9jeHhmaWx0Lm1hbiBcCi0JCT4gJChERU1BTkdMRVJfTkFNRSkuMQotbW9zdGx5Y2xlYW4tbG9jYWw6Ci0JLXJtIC1yZiB0bXBkaXIKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBpbnN0YWxsLWJpblBST0dSQU1TICQoYmluX1BST0dSQU1TKSAkKG5vaW5zdF9QUk9HUkFNUykKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLycgLWUgJ3MvY3h4ZmlsdC8kKERFTUFOR0xFUl9OQU1FKS8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLycgLWUgJ3MvY3h4ZmlsdC8kKERFTUFOR0xFUl9OQU1FKS8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCSQobWtpbnN0YWxsZGlycykgJCh0b29sZGlyKS9iaW4KLQlmb3IgaSBpbiAkKFRPT0xfUFJPR1MpOyBkbyBcCi0JICBpZiBbIC1mICQkaSQoRVhFRVhUKSBdOyB0aGVuIFwKLQkgICAgaj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvLW5ldy8vJ2A7IFwKLQkgICAgaz1gZWNobyAkJGogfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JICAgIGlmIFsgIiQoYmluZGlyKS8kJGskKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgICAgIHJtIC1mICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAotCSAgICAgIGxuICQoYmluZGlyKS8kJGskKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCQl8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGkkKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpOyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIHRydWU7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hZGRyMmxpbmUubzogYWRkcjJsaW5lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWFyLm86IGFyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvYW91dC9hci5oICQoQkZERElSKS9saWJiZmQuaCBhcnN1cC5oCi1hcnN1cC5vOiBhcnN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGFyc3VwLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWJ1Y29tbS5vOiBidWNvbW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmR1bXAubzogY29mZmR1bXAuYyBjb2ZmZ3Jvay5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotY29mZmdyb2subzogY29mZmdyb2suYyBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmZ3Jvay5oCi1kZWJ1Zy5vOiBkZWJ1Zy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaAotZGxsdG9vbC5vOiBkbGx0b29sLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2RlbWFuZ2xlLmggZHluLXN0cmluZy5oIFwKLSAgZGxsdG9vbC5oCi1maWxlbW9kZS5vOiBmaWxlbW9kZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWllZWUubzogaWVlZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvaWVlZS5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLWlzLXJhbmxpYi5vOiBpcy1yYW5saWIuYwotaXMtc3RyaXAubzogaXMtc3RyaXAuYwotbWF5YmUtcmFubGliLm86IG1heWJlLXJhbmxpYi5jCi1tYXliZS1zdHJpcC5vOiBtYXliZS1zdHJpcC5jCi1ubG1jb252Lm86IG5sbWNvbnYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoQkZERElSKS9saWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1jb252LmgKLW5tLm86IG5tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1ub3QtcmFubGliLm86IG5vdC1yYW5saWIuYwotbm90LXN0cmlwLm86IG5vdC1zdHJpcC5jCi1vYmpjb3B5Lm86IG9iamNvcHkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWRiZy5oCi1vYmpkdW1wLm86IG9iamR1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1wcmRiZy5vOiBwcmRiZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1yZGNvZmYubzogcmRjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggXAotICBidWRiZy5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotcmRkYmcubzogcmRkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotc2l6ZS5vOiBzaXplLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9nZXRvcHQuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zcmNvbnYubzogc3Jjb252LmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIHN5c3JvZmYuaCBjb2ZmZ3Jvay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3lzcm9mZi5jCi1zdGFicy5vOiBzdGFicy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RyaW5ncy5vOiBzdHJpbmdzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN5c2R1bXAubzogc3lzZHVtcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggc3lzcm9mZi5oIFwKLSAgc3lzcm9mZi5jCi12ZXJzaW9uLm86IHZlcnNpb24uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi13cnN0YWJzLm86IHdyc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXdpbmRyZXMubzogd2luZHJlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9vYnN0YWNrLmggd2luZHJlcy5oIFwKLSAgd2luZHVuaS5oCi1yZXNyYy5vOiByZXNyYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotcmVzY29mZi5vOiByZXNjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLXJlc2Jpbi5vOiByZXNiaW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXdpbmR1bmkubzogd2luZHVuaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggd2luZHVuaS5oCi1yZWFkZWxmLm86IHJlYWRlbGYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvbWlwcy5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9tNjhrLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL2QzMHYuaCAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvaTk2MC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLXJlc3Jlcy5vOiByZXNyZXMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLWR5bi1zdHJpbmcubzogZHluLXN0cmluZy5jIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgZHluLXN0cmluZy5oCi1kbGx3cmFwLm86IGRsbHdyYXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCBkeW4tc3RyaW5nLmgKLXJlbmFtZS5vOiByZW5hbWUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi11bmRlcnNjb3JlLm86IHVuZGVyc2NvcmUuYwotYXJwYXJzZS5vOiBhcnBhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBhcnN1cC5oCi1hcmxleC5vOiBhcmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCBhcnBhcnNlLmgKLXN5c3JvZmYubzogc3lzcm9mZi5jCi1zeXNpbmZvLm86IHN5c2luZm8uYwotc3lzbGV4Lm86IHN5c2xleC5jIHN5c2luZm8uaAotZGVmcGFyc2UubzogZGVmcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGRsbHRvb2wuaAotZGVmbGV4Lm86IGRlZmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGRlZnBhcnNlLmggZGxsdG9vbC5oCi1ubG1oZWFkZXIubzogbmxtaGVhZGVyLmMgLi4vYmZkL2JmZC5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gIG5sbWNvbnYuaAotcmNwYXJzZS5vOiByY3BhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi1yY2xleC5vOiByY2xleC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaCByY3BhcnNlLmgKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL05FV1MgYi9iaW51dGlscy9ORVdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDI0Y2NkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL05FV1MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLSotIHRleHQgLSotCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi4xMDoKLQotKiBOZXcgY29tbWFuZCBsaW5lIHN3aXRjaCB0byBvYmpkdW1wIC0tZmlsZS1zdGFydC1jb250ZXh0IHdoaWNoIHNob3dzIHRoZQotICBlbnRpcmUgZmlsZSBjb250ZW50cyB1cCB0byB0aGUgc291cmNlIGxpbmUgZmlyc3QgZW5jb3VudGVyZWQgZm9yIGEgZ2l2ZW4KLSAgZmlsZS4gCi0KLSogTmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8gb2JqZHVtcCAtTSAob3IgLS1kaXNhc3NlbWJsZXItb3B0aW9ucykgd2hpY2ggdGFrZXMKLSAgYSBwYXJhbWV0ZXIgd2hpY2ggY2FuIHRoZW4gYmUgaW50ZXJwcmV0ZWQgb24gYSBwZXItdGFyZ2V0IGJhc2lzIGJ5IHRoZQotICBkaXNhc3NlbWJsZXIuICBVc2VkIGJ5IEFSTSB0YXJnZXRzIHRvIHNlbGVjdCByZWdpc3RlciBuYW1lIHNldHMsIElTQSwgQVBDUyBvcgotICByYXcgdmVyaW9ucy4KLSAgCi0qIG9iamR1bXAgc3VwcG9ydCBmb3IgLW1pMzg2OmludGVsIHdoaWNoIGNhdXNlcyBkaXNhc3NlbWJseSB0byBiZSBkaXNwbGF5ZWQKLSAgd2l0aCBpbnRlbCBzeW50YXguCi0KLSogTmV3IHByb2dyYW06IHJlYWRlbGYuICBUaGlzIGRpc3BsYXlzIHRoZSBjb250ZW50cyBvZiBFTEYgZm9ybWF0IGZpbGVzLAotICByZWdhcmRsZXNzIG9mIHRhcmdldCBtYWNoaW5lLgotCi0qIG9iamNvcHkgbm93IHRha2VzIC0tY2hhbmdlLXNlY3Rpb24tbG1hLCAtLWNoYW5nZS1zZWN0aW9uLXZtYSwgYW5kCi0gIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcyBvcHRpb25zLiAgVGhlIG9sZCAtLWFkanVzdC1zZWN0aW9uLXZtYSBvcHRpb24gaXMKLSAgZXF1aXZhbGVudCB0byAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MuICBUaGUgb3RoZXIgLS1hZGp1c3QtKiBvcHRpb25zIGFyZSBub3cKLSAgcmVuYW1lZCB0byAtLWNoYW5nZS0qLCBhbHRob3VnaCAtLWFkanVzdC0qIGNvbnRpbnVlcyB0byB3b3JrLgotCi0qIGRsbHRvb2wgbm93IHN1cHBvcnRzIHRoZSBJTVBPUlRTIGNvbW1hbmQuCi0KLSogZGxsdG9vbCBub3cgdGFrZXMgLS1leHBvcnQtYWxsLXN5bWJvbHMsIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzLAotICAtLWV4Y2x1ZGUtc3ltYm9scywgYW5kIC0tbm8tZGVmYXVsdC1leGNsdWRlcyBvcHRpb25zLgotCi0qIG9iamNvcHkgbm93IHRha2VzIGEgLWovLS1vbmx5LXNlY3Rpb24gb3B0aW9uIHRvIGNvcHkgb25seSB0aGUgc3BlY2lmaWVkCi0gIHNlY3Rpb25zLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuOToKLQotKiBBZGRlZCB3aW5kcmVzIHByb2dyYW0sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2VzIGluIFdJTjMyCi0gIGZpbGVzIGFzIHVzZWQgb24gV2luZG93cyA5NSBhbmQgV2luZG93cyBOVC4KLQotKiBUaGUgb2JqY29weSAtLWdhcC1maWxsIGFuZCAtLXBhZC10byBvcHRpb25zIG9wZXJhdGUgb24gdGhlIExNQSByYXRoZXIgdGhhbgotICB0aGUgVk1BIG9mIHRoZSBzZWN0aW9ucy4KLQotKiBBZGRlZCBTIG1vZGlmaWVyIHRvIGFyIHRvIG5vdCBidWlsZCBhIHN5bWJvbCB0YWJsZS4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjg6Ci0KLSogVGhlIG9iamR1bXAgZGlzYXNzZW1ibHkgZm9ybWF0IGhhcyBiZWVuIGNoYW5nZWQsIGFuZCBob3BlZnVsbHkgaW1wcm92ZWQuICBVc2UKLSAgdGhlIG5ldyAtLXByZWZpeC1hZGRyZXNzZXMgb3B0aW9uIHRvIGdldCB0aGUgb2xkIGZvcm1hdC4gIFRoZXJlIGFyZSBhbHNvIG5ldwotICAtLWRpc2Fzc2VtYmxlLXplcm9lcyBhbmQgLS1uby1zaG93LXJhdy1pbnNuIG9wdGlvbnMgd2hpY2ggYWZmZWN0IGRpc2Fzc2VtYmxlcgotICBvdXRwdXQuCi0KLSogRm9ybWF0cyBtYXkgbm93IGJlIHNwZWNpZmllZCBhcyBjb25maWd1cmF0aW9uIHRyaXBsZXRzLiAgRm9yIGV4YW1wbGUsCi0gIG9iamR1bXAgLWIgaTM4Ni1wYy1saW51eC4gIFRoZSB0cmlwbGV0cyBhcmUgbm90IHBhc3NlZCB0aHJvdWdoIGNvbmZpZy5zdWIsCi0gIHNvIHRoZXkgbXVzdCBiZSBpbiBjYW5vbmljYWwgZm9ybS4KLQotKiBBZGRlZCBuZXcgYWRkcjJsaW5lIHByb2dyYW0uICBUaGlzIHVzZXMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBjb252ZXJ0Ci0gIGFuIGFkZHJlc3MgaW50byBhIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgd2l0aGluIGEgcHJvZ3JhbS4KLQotKiBBZGRlZCAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgYXJndW1lbnQgdG8gb2JqY29weS4KLQotKiBBZGRlZCAtLXdlYWtlbiBhcmd1bWVudCB0byBvYmpjb3B5LgotCi0qIG9iamR1bXAgLS1keW5hbWljLXJlbG9jIG5vdyB3b3JrcyBvbiBFTEYgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBsaWJyYXJpZXMuCi0KLSogQWRkZWQgLS1hZGp1c3Qtdm1hIG9wdGlvbiB0byBvYmpkdW1wLgotCi0qIEFkZGVkIC1DLy0tZGVtYW5nbGUgb3B0aW9uIHRvIG9iamR1bXAuCi0KLSogQWRkZWQgLXAvLS1wcmVzZXJ2ZS1kYXRlcyBvcHRpb24gdG8gc3RyaXAgYW5kIG9iamNvcHkuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi43OgotCi0qIEFkZGVkIC0tZW5hYmxlLXNoYXJlZCBhbmQgLS1lbmFibGUtY29tbW9uYmZkbGliIG9wdGlvbnMgdG8gY29uZmlndXJlLgotCi0qIEFkZGVkIC0tZGVidWdnaW5nIGFyZ3VtZW50IHRvIG9iamR1bXAgYW5kIG9iamNvcHkuCi0KLSogQWRkZWQgLS1kZWZpbmVkLW9ubHkgYXJndW1lbnQgdG8gbm0uCi0KLSogQWRkZWQgLS1yZW1vdmUtbGVhZGluZy1jaGFyIGFyZ3VtZW50IHRvIG9iamNvcHkuCi0KLSogVGhlIG9iamR1bXAgLS1saW5lLW51bWJlcnMgb3B0aW9uIGlzIG5vdyBtZWFuaW5nZnVsIHdpdGggLS1yZWxvYy4KLQotKiBBZGRlZCAtLWxpbmUtbnVtYmVycyBvcHRpb24gdG8gbm0uCi0KLSogQWRkZWQgLS1lbmRpYW4vLUVCLy1FTCBvcHRpb24gdG8gb2JqZHVtcC4KLQotKiBBZGRlZCBzdXBwb3J0IGZvciBBbHBoYSBPcGVuVk1TL0FYUC4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjY6Ci0KLSogQWRkZWQgLU4vLS1zdHJpcC1zeW1ib2wgYW5kIC1LLy0ta2VlcC1zeW1ib2wgYXJndW1lbnRzIHRvIHN0cmlwIGFuZCBvYmpjb3B5LgotCi0qIEFkZGVkIHNldmVyYWwgYXJndW1lbnRzIHRvIG9iamNvcHkgdG8gcHJvdmlkZSBzb21lIGNvbnRyb2wgb3ZlciBob3cgdGhlIG5ldwotICBmaWxlIGlzIGxhaWQgb3V0IGluIG1lbW9yeS4gIEFsc28gYWRkZWQgYmluYXJ5IG91dHB1dCBmb3JtYXQgdG8gQkZEIHRvIHBlcm1pdAotICBnZW5lcmF0aW5nIHBsYWluIGJpbmFyeSBmaWxlcy4KLQotKiBBZGRlZCAtLXN0YXJ0LWFkZHJlc3MgYW5kIC0tc3RvcC1hZGRyZXNzIG9wdGlvbnMgdG8gb2JqZHVtcC4KLQotKiBhciBhbmQgcmFubGliIG5vdyB3b3JrIG9uIEFJWC4gIFRoZSB0b29scyBhcmUgbm93IGJ1aWx0IGJ5IGRlZmF1bHQgb24gQUlYLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuNToKLQotKiBDaGFuZ2VkIG9iamR1bXAgLWRyIHRvIGR1bXAgdGhlIHJlbG9jcyBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgYXNzZW1ibHkKLSAgbGlzdGluZywgZm9yIGEgbW9yZSB1c2VmdWwgbGlzdGluZyBvZiByZWxvY2F0ZWFibGUgZmlsZXMuCi0KLSogQ2hhbmdlZCBvYmpkdW1wIC1kLy0tZGlzYXNzZW1ibGUgdG8gb25seSBkaXNhc3NlbWJsZSBTRUNfQ09ERSBzZWN0aW9ucy4KLSAgQWRkZWQgLUQvLS1kaXNhc3NlbWJsZS1hbGwgb3B0aW9uIHRvIGRpc2Fzc2VtYmxlIGFsbCBzZWN0aW9ucy4KLQotKiBBZGRlZCAtLXNpemUtc29ydCBvcHRpb24gdG8gbm0uCi0KLSogc3RyaXAgYW5kIG9iamNvcHkgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGhhbmRsZSBkeW5hbWljYWxseSBsaW5rZWQgRUxGCi0gIGV4ZWN1dGFibGVzLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuNDoKLQotKiBTdXBwb3J0IGZvciBIUC1QQSAoYnkgSmVmZiBMYXcpLCBpMzg2IE1hY2ggKGJ5IERhdmlkIE1hY2tlbnppZSksIFJTLzYwMDAgYW5kCi0gIFBvd2VyUEMgKGV4Y2VwdCBhciBhbmQgcmFubGliOyBieSBJYW4gVGF5bG9yKS4KLQotKiBTdXBwb3J0IGZvciBJcml4IDUuCi0KLSogUHJvZ3JhbXMgYHN0cmlwJyBhbmQgYG9iamNvcHknIHdpbGwgbm90IGF0dGVtcHQgdG8gd3JpdGUgZHluYW1pY2FsbHkgbGlua2VkCi0gIEVMRiBvdXRwdXQgZmlsZXMsIHNpbmNlIEJGRCBjdXJyZW50bHkgY2FuJ3QgY3JlYXRlIHRoZW0gcHJvcGVybHkuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi4zOgotCi0qIEEgbmV3IC0tc3RhYnMgYXJndW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gb2JqZHVtcCB0byBkdW1wIHN0YWJzIHNlY3Rpb25zIGluCi0gIEVMRiBhbmQgQ09GRiBmaWxlcy4KLQotKiBBIG5ldyBwcm9ncmFtLCBubG1jb252LCBoYXMgYmVlbiBhZGRlZC4gIEl0IGNhbiBjb252ZXJ0IG9iamVjdCBmaWxlcyBpbnRvCi0gIE5vdmVsbCBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMuCi0KLSogVGhlIHN0cmluZ3MgcHJvZ3JhbSBoYXMgYmVlbiBhZGRlZC4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjI6Ci0KLSogVGhlICdjb3B5JyBwcm9ncmFtIGhhcyBiZWVuIHJlbmFtZWQgdG8gJ29iamNvcHknLCBmb3IgY29uc2lzdGVuY3kgd2l0aAotICAnb2JqZHVtcCcsIGFuZCBiZWNhdXNlICdjb3B5JyBtaWdodCBtb3JlIHBsYXVzaWJseSBiZSB1c2VkIGFzIGEgc3lub255bSBmb3IKLSAgJ2NwJy4KLQotKiBUaGUgbmV3IHN0YW5kLWFsb25lIHByb2dyYW0gYysrZmlsdCBpcyBhIGZpbHRlciB0aGF0IGNvbnZlcnRzIGVuY29kZWQKLSAgKG1hbmdsZWQpIEMrKyBhc3NlbWJseS1sZXZlbCBpZGVudGlmaWVycyB0byB1c2VyLWxldmVsIG5hbWVzLiAgKE5vdGU6IFRoaXMKLSAgbWF5IGdldCBtb3ZlZCB0byB0aGUgZ2NjIGRpc3RyaWJ1dGlvbi4pCi0KLSogbm0gLW8gb24gYW4gYXJjaGl2ZSBub3cgcHJlZml4ZXMgZWFjaCBsaW5lIHdpdGggdGhlIGFyY2hpdmUgbmFtZSwgbWF0Y2hpbmcKLSAgdGhlIG91dHB1dCBmcm9tIEJTRCBubS4KLQotKiBhciAoYW5kIGxkKSBjYW4gbm93IHJlYWQgKGJ1dCBub3Qgd3JpdGUpIEJTRDQuNC1zdHlsZSBhcmNoaXZlcy4KLQotKiBOZXcgc3VwcG9ydCBmb3IgSDg1MDAsIFo4MDAwLCBhbmQgdGhlIEhpdGFjaCBTSC4KLQotKiBEaXMtYXNzZW1ibGVyIGludGVyZmFjZSBjaGFuZ2VkIHRvIGFsbG93IHNoYXJpbmcgd2l0aCBnZGIuCi0KLSogVGhlcmUgaXMgbmV3IEVsZiBjb2RlLCBidXQgaXQgaXMgbm90IHlldCByZWFkeSBmb3IgZ2VuZXJhbCB1c2UuCi0KLSogVGhlcmUgaXMgdGhlIGJlZ2lubmluZ3Mgb2YgYSB0ZXN0IHN1aXRlLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuMToKLQotKiBUaGVyZSBpcyBub3cgc3VwcG9ydCBmb3Igd3JpdGluZyBFQ09GRiBmaWxlcywgc28gbGQgYW5kIHRoZSBvdGhlciB1dGlsaXRpZXMKLSAgc2hvdWxkIHdvcmsgb24gUmlzYy9VbHRyaXggYW5kIElyaXguICBQbGVhc2UgbGV0IHVzIGtub3cgaG93IHdlbGwgdGhpcyB3b3Jrcy4KLQotKiBhciBub3cgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgc3ltYm9sIHRhYmxlIChhIF9fLlNZTURFRiBtZW1iZXIsIGluIHRoZSBCU0QKLSAgdmVyc2lvbiksIGlmIHRoZXJlIGFyZSBhbnkgb2JqZWN0IGZpbGVzIGluIHRoZSBhcmNoaXZlLiAgU28gcnVubmluZyByYW5saWIgaXMKLSAgbm93IHJlZHVuZGFudCAodW5sZXNzIHRoZSBub24tc3RhbmRhcmQgcSBjb21tYW5kIGlzIHVzZWQpLiAgVGhpcyBpcyByZXF1aXJlZAotICBmb3IgUG9zaXguMiBjb25mb3JtYW5jZS4KLQotKiBUaGUgYXJjaGl2ZS1yZWFkaW5nIGNvZGUgbm93IHJlYWRzIGJvdGggQlNELXN0eWxlIGFuZCBTWVNWLXN0eWxlIGFyY2hpdmVzCi0gIGluZGVwZW5kZW50bHkgb2YgdGhlIHNlbGVjdGVkIHRhcmdldCBmb3JtYXQuICBUaGlzIGlzIHRvIGVuY291cmFnZSBwZW9wbGUgdG8KLSAgc3dpdGNoIHRvIFNZU1YtZm9ybWF0LCB3aGljaCBoYXMgYSBudW1iZXIgb2YgYWR2YW50YWdlcy4KLQotKiBUaGUgc3RyaXAgYW5kIGNvcHkgcHJvZ3JhbXMgbm93IGhhdmUgb3B0aW9ucyB0byByZW1vdmUgZGVidWctc3ltYm9scyBvbmx5Ci0gIGFuZC9vciBsb2NhbCBzeW1ib2xzIG9ubHkuICBUaGV5IG5vdyBhbHNvIHN1cHBvcnQgbG9uZyBvcHRpb25zLgotCi0MCi1Mb2NhbCB2YXJpYWJsZXM6Ci1maWxsLWNvbHVtbjogNzkKLUVuZDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL1JFQURNRSBiL2JpbnV0aWxzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyZDI3Ny4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotVGhlc2UgYXJlIHRoZSBHTlUgYmludXRpbHMuICBUaGVzZSBhcmUgdXRpbGl0aWVzIG9mIHVzZSB3aGVuIGRlYWxpbmcKLXdpdGggb2JqZWN0IGZpbGVzLgotCi1UaGUgbGlua2VyIChsZCkgaXMgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHdoaWNoIHNob3VsZCBiZSAuLi9sZC4KLUxpbmtlci1zcGVjaWZpYyBub3RlcyBhcmUgaW4gLi4vbGQvUkVBRE1FLgotCi1BcyBvZiB2ZXJzaW9uIDIuNSwgdGhlIGFzc2VtYmxlciAoYXMpIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCBpbgotLi4vZ2FzLiAgQXNzZW1ibGVyLXNwZWNpZmljIG5vdGVzIGNhbiBiZSBmb3VuZCBpbiAuLi9nYXMvUkVBRE1FLgotCi1SZWNlbnQgY2hhbmdlcyBhcmUgaW4gLi9ORVdTLCAuLi9sZC9ORVdTLCBhbmQgLi4vZ2FzL05FV1MuCi0KLVVucGFja2luZyBhbmQgSW5zdGFsbGF0aW9uIC0tIHF1aWNrIG92ZXJ2aWV3Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1XaGVuIHlvdSB1bnBhY2sgdGhlIGJpbnV0aWxzLTIuOS50YXIuZ3ogZmlsZSwgeW91J2xsIGdldCBhIGRpcmVjdG9yeQotY2FsbGVkIHNvbWV0aGluZyBsaWtlIGBiaW51dGlscy0yLjknLCB3aGljaCBjb250YWlucyB2YXJpb3VzIGZpbGVzIGFuZAotZGlyZWN0b3JpZXMuICBNb3N0IG9mIHRoZSBmaWxlcyBpbiB0aGUgdG9wIGRpcmVjdG9yeSBhcmUgZm9yCi1pbmZvcm1hdGlvbiBhbmQgZm9yIGNvbmZpZ3VyYXRpb24uICBUaGUgYWN0dWFsIHNvdXJjZSBjb2RlIGlzIGluCi1zdWJkaXJlY3Rvcmllcy4KLQotVG8gYnVpbGQgYmludXRpbHMsIHlvdSBjYW4ganVzdCBkbzoKLQotCWNkIGJpbnV0aWxzLTIuOQotCS4vY29uZmlndXJlIFtvcHRpb25zXQotCW1ha2UKLQltYWtlIGluc3RhbGwgIyBjb3BpZXMgdGhlIHByb2dyYW1zIGZpbGVzIGludG8gL3Vzci9sb2NhbC9iaW4KLQkJICAgICAjIGJ5IGRlZmF1bHQuCi0KLVRoaXMgd2lsbCBjb25maWd1cmUgYW5kIGJ1aWxkIGFsbCB0aGUgbGlicmFyaWVzIGFzIHdlbGwgYXMgdGhlCi1hc3NlbWJsZXIsIHRoZSBiaW51dGlscywgYW5kIHRoZSBsaW5rZXIuCi0KLUlmIHlvdSBoYXZlIEdOVSBtYWtlLCB3ZSByZWNvbW1lbmQgYnVpbGRpbmcgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5OgotCi0JbWtkaXIgb2JqZGlyCi0JY2Qgb2JqZGlyCi0JLi4vYmludXRpbHMtMi45L2NvbmZpZ3VyZSBbb3B0aW9uc10KLQltYWtlCi0JbWFrZSBpbnN0YWxsCi0KLVRoaXMgcmVsaWVzIG9uIHRoZSBWUEFUSCBmZWF0dXJlIG9mIEdOVSBtYWtlLgotCi1CeSBkZWZhdWx0LCB0aGUgYmludXRpbHMgd2lsbCBiZSBjb25maWd1cmVkIHRvIHN1cHBvcnQgdGhlIHN5c3RlbSBvbgotd2hpY2ggdGhleSBhcmUgYnVpbHQuICBXaGVuIGRvaW5nIGNyb3NzIGRldmVsb3BtZW50LCB1c2UgdGhlIC0tdGFyZ2V0Ci1jb25maWd1cmUgb3B0aW9uIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgdGFyZ2V0LgotCi1UaGUgLS1lbmFibGUtdGFyZ2V0cyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBtb3JlIGJpbmFyeSBmaWxlIGZvcm1hdHMKLWJlc2lkZXMgdGhlIGRlZmF1bHQuICBMaXN0IHRoZW0gYXMgdGhlIGFyZ3VtZW50IHRvIC0tZW5hYmxlLXRhcmdldHMsCi1zZXBhcmF0ZWQgYnkgY29tbWFzLiAgRm9yIGV4YW1wbGU6Ci0KLQkuL2NvbmZpZ3VyZSAtLWVuYWJsZS10YXJnZXRzPXN1bjMscnM2MDAwLWFpeCxkZWNzdGF0aW9uCi0KLVRoZSBuYW1lICdhbGwnIGNvbXBpbGVzIGluIHN1cHBvcnQgZm9yIGFsbCB2YWxpZCBCRkQgdGFyZ2V0cyAodGhpcyB3YXMKLXRoZSBkZWZhdWx0IGluIHJlbGVhc2VzIGJlZm9yZSAyLjMpOgotCi0JLi9jb25maWd1cmUgLS1lbmFibGUtdGFyZ2V0cz1hbGwKLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIC0tZW5hYmxlLXNoYXJlZCBvcHRpb24gd2hlbiB5b3UgcnVuCi1jb25maWd1cmUuICBUaGlzIHdpbGwgYnVpbGQgdGhlIEJGRCBhbmQgb3Bjb2RlcyBsaWJyYXJpZXMgYXMgc2hhcmVkCi1saWJyYXJpZXMuICBZb3UgY2FuIHVzZSBhcmd1bWVudHMgd2l0aCB0aGUgLS1lbmFibGUtc2hhcmVkIG9wdGlvbiB0bwotaW5kaWNhdGUgdGhhdCBvbmx5IGNlcnRhaW4gbGlicmFyaWVzIHNob3VsZCBiZSBidWlsdCBzaGFyZWQ7IGZvcgotZXhhbXBsZSwgLS1lbmFibGUtc2hhcmVkPWJmZC4gIFRoZSBvbmx5IHBvdGVudGlhbCBzaGFyZWQgbGlicmFyaWVzIGluCi1hIGJpbnV0aWxzIHJlbGVhc2UgYXJlIGJmZCBhbmQgb3Bjb2Rlcy4KLQotVGhlIGJpbnV0aWxzIHdpbGwgYmUgbGlua2VkIGFnYWluc3QgdGhlIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgYnVpbGQKLXN0ZXAgd2lsbCBhdHRlbXB0IHRvIHBsYWNlIHRoZSBjb3JyZWN0IGxpYnJhcnkgaW4gdGhlIHJ1bnRpbWUgc2VhcmNoCi1wYXRoIGZvciB0aGUgYmluYXJpZXMuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCBhZnRlciB5b3UgaW5zdGFsbCB0aGUKLWJpbmFyaWVzLCB5b3UgbWF5IGhhdmUgdG8gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCBub3JtYWxseQotTERfTElCUkFSWV9QQVRILCBzbyB0aGF0IHRoZSBzeXN0ZW0gY2FuIGZpbmQgdGhlIGluc3RhbGxlZCBsaWJiZmQKLXNoYXJlZCBsaWJyYXJ5LgotCi1UbyBidWlsZCB1bmRlciBvcGVuVk1TL0FYUCwgc2VlIHRoZSBmaWxlIG1ha2VmaWxlLnZtcyBpbiB0aGUgdG9wIGxldmVsCi1kaXJlY3RvcnkuCi0KLUlmIHlvdSBkb24ndCBoYXZlIGFyCi09PT09PT09PT09PT09PT09PT09PQotCi1JZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgYW4gYXIgcHJvZ3JhbSwgdGhlIG5vcm1hbAotYmludXRpbHMgYnVpbGQgcHJvY2VzcyB3aWxsIG5vdCB3b3JrLiAgSW4gdGhpcyBjYXNlLCBydW4gY29uZmlndXJlIGFzCi11c3VhbC4gIEJlZm9yZSBydW5uaW5nIG1ha2UsIHJ1biB0aGlzIHNjcmlwdDoKLQotIyEvYmluL3NoCi1NQUtFX1BST0c9IiR7TUFLRS1tYWtlfSIKLU1BS0U9IiR7TUFLRV9QUk9HfSBBUj10cnVlIExJTks9dHJ1ZSIKLWV4cG9ydCBNQUtFCi0ke01BS0V9ICQqIGFsbC1saWJpYmVydHkKLSR7TUFLRX0gJCogYWxsLWludGwKLSR7TUFLRX0gJCogYWxsLWJmZAotY2QgYmludXRpbHMKLU1BS0U9IiR7TUFLRV9QUk9HfSIKLWV4cG9ydCBNQUtFCi0ke01BS0V9ICQqIGFyX0RFUEVOREVOQ0lFUz0gYXJfTERBREQ9Jy4uL2JmZC8qLm8gYGNhdCAuLi9saWJpYmVydHkvcmVxdWlyZWQtbGlzdCAuLi9saWJpYmVydHkvbmVlZGVkLWxpc3QgfCBzZWQgLWUgInMsXChbXiBdW14gXSpcKSwuLi9saWJpYmVydHkvXDEsZyJgIGBpZiB0ZXN0IC1mIC4uL2ludGwvZ2V0dGV4dC5vOyB0aGVuIGVjaG8gJy4uL2ludGwvKi5vJzsgZmlgJyBhcgotCi1UaGlzIHNjcmlwdCB3aWxsIGJ1aWxkIGFuIGFyIHByb2dyYW0gaW4gYmludXRpbHMvYXIuICBNb3ZlIGJpbnV0aWxzL2FyCi1pbnRvIGEgZGlyZWN0b3J5IG9uIHlvdXIgUEFUSC4gIEFmdGVyIGRvaW5nIHRoaXMsIHlvdSBjYW4gcnVuIG1ha2UgYXMKLXVzdWFsIHRvIGJ1aWxkIHRoZSBjb21wbGV0ZSBiaW51dGlscyBkaXN0cmlidXRpb24uICBZb3UgZG8gbm90IG5lZWQKLXRoZSByYW5saWIgcHJvZ3JhbSBpbiBvcmRlciB0byBidWlsZCB0aGUgZGlzdHJpYnV0aW9uLgotCi1Qb3J0aW5nCi09PT09PT09Ci0KLUJpbnV0aWxzLTIuOSBzdXBwb3J0cyBtYW55IGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLCBidXQgdGhlcmUKLWFyZSBtYW55IG1vcmUgbm90IHN1cHBvcnRlZCwgaW5jbHVkaW5nIHNvbWUgdGhhdCB3ZXJlIHN1cHBvcnRlZAotYnkgZWFybGllciB2ZXJzaW9ucy4gIFdlIGFyZSBob3BpbmcgZm9yIHZvbHVudGVlcnMgdG8KLWltcHJvdmUgdGhpcyBzaXR1YXRpb24uCi0KLVRoZSBtYWpvciBlZmZvcnQgaW4gcG9ydGluZyBiaW51dGlscyB0byBhIG5ldyBob3N0IGFuZC9vciB0YXJnZXQKLWFyY2hpdGVjdHVyZSBpbnZvbHZlcyB0aGUgQkZEIGxpYnJhcnkuICBUaGVyZSBpcyBzb21lIGRvY3VtZW50YXRpb24KLWluIC4uL2JmZC9kb2MuICBUaGUgZmlsZSAuLi9nZGIvZG9jL2dkYmludC50ZXhpbmZvIChkaXN0cmlidXRlZAotd2l0aCBnZGItNC54KSBtYXkgYWxzbyBiZSBvZiBoZWxwLgotCi1SZXBvcnRpbmcgYnVncwotPT09PT09PT09PT09PT0KLQotU2VuZCBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcyB0byBidWctZ251LXV0aWxzQGdudS5vcmcuICBBbHdheXMgbWVudGlvbgotdGhlIHZlcnNpb24gbnVtYmVyIHlvdSBhcmUgcnVubmluZzsgdGhpcyBpcyBwcmludGVkIGJ5IHJ1bm5pbmcgYW55IG9mCi10aGUgYmludXRpbHMgd2l0aCB0aGUgLS12ZXJzaW9uIG9wdGlvbi4gIFdlIGFwcHJlY2lhdGUgcmVwb3J0cyBhYm91dAotYnVncywgYnV0IHdlIGRvIG5vdCBwcm9taXNlIHRvIGZpeCB0aGVtLgotCi1WTVMKLT09PQotCi1UaGlzIHNlY3Rpb24gd2FzIHdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIDxra2FlbXBmQHJtaS5kZT4uICBJdAotZGVzY3JpYmVzIGhvdyB0byBidWlsZCBhbmQgaW5zdGFsbCB0aGUgYmludXRpbHMgb24gb3BlblZNUyAoQWxwaGEgYW5kCi1WYXgpLiAgKFRoZSBCRkQgbGlicmFyeSBvbmx5IHN1cHBvcnRzIHJlYWRpbmcgVmF4IG9iamVjdCBmaWxlcy4pCi0KLUNvbXBpbGluZyB0aGUgcmVsZWFzZToKLQotVG8gY29tcGlsZSB0aGUgZ251IGJpbmFyeSB1dGlsaXRpZXMgYW5kIHRoZSBnbnUgYXNzZW1ibGVyLCB5b3UnbGwKLW5lZWQgREVDIEMgb3IgR05VIEMgZm9yIG9wZW5WTVMvQWxwaGEuIFlvdSdsbCBuZWVkICpib3RoKiBjb21waWxlcnMKLW9uIG9wZW5WTVMvVmF4LgotCi1Db21waWxpbmcgd2l0aCBlaXRoZXIgREVDIEMgb3IgR05VIEMgd29ya3Mgb24gb3BlblZNUy9BbHBoYSBvbmx5LiBTb21lCi1vZiB0aGUgb3Bjb2RlcyBhbmQgYmludXRpbHMgZmlsZXMgdHJhcCBhIGJ1ZyBpbiB0aGUgREVDIEMgb3B0aW1pemVyLAotc28gdGhlc2UgZmlsZXMgbXVzdCBiZSBjb21waWxlZCB3aXRoIC9ub29wdC4KLQotQ29tcGlsaW5nIG9uIG9wZW5WTVMvVmF4IGlzIGEgYml0IGNvbXBsaWNhdGVkLCBhcyB0aGUgYmZkIGxpYnJhcnkgdHJhcHMKLWEgYnVnIGluIEdOVSBDIGFuZCB0aGUgZ251IGFzc2VtYmxlciBhIGJ1ZyBpbiAobXkgdmVyc2lvbiBvZikgREVDIEMuCi0KLUkgbmV2ZXIgdHJpZWQgY29tcGlsaW5nIHdpdGggVkFYIEMuCi0KLQotWW91IGZ1cnRoZXIgbmVlZCBHTlUgTWFrZSBWZXJzaW9uIDMuNzYgb3IgbGF0ZXIuIFRoaXMgaXMgYXZhaWxhYmxlCi1hdCBmdHAucHJvZ2lzLmRlIG9yIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiBUaGUgbWFrZWZpbGVzIGFzc3VtZSB0aGF0Ci1nbWFrZSBzdGFydHMgZ251IG1ha2UgYXMgYSBmb3JlaWduIGNvbW1hbmQuCi0KLUlmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBERUMgQyBvciBWQVggQywgeW91IG11c3QgcnVuCi0KLSAgJCBAc2V0dXAKLQotYmVmb3JlIHN0YXJ0aW5nIGdudS1tYWtlLiBUaGlzIGlzbid0IG5lZWRlZCB3aXRoIEdOVSBDLgotCi1PbiB0aGUgQWxwaGEgeW91IGNhbiBjaG9vc2UgdGhlIGNvbXBpbGVyIGJ5IGVkaXRpbmcgdGhlIHRvcGxldmVsCi1tYWtlZmlsZS52bXMuIEVpdGhlciBzZWxlY3QgQ0M9Y2MgKGZvciBERUMgQykgb3IgQ0M9Z2NjIChmb3IgR05VIEMpCi0KLQotSW5zdGFsbGluZyB0aGUgcmVsZWFzZQotCi1Qcm92aWRlZCB0aGF0IHlvdXIgZGlyZWN0b3J5IHNldHVwIGNvbmZvcm1zIHRvIHRoZSBHTlUgb24gb3BlblZNUwotc3RhbmRhcmQsIHlvdSBhbHJlYWR5IGhhdmUgYSBjb25jZWFsZWQgZGV2aWNlZCBuYW1lZCAnR05VX1JPT1QnLgotSW4gdGhpcyBjYXNlLCBhIHNpbXBsZQotCi0gJCBnbWFrZSBpbnN0YWxsCi0KLXN1ZmZpY2VzIHRvIGNvcHkgYWxsIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMgdG8gdGhlIHByb3BlciBkaXJlY3Rvcmllcy4KLQotRGVmaW5lIHRoZSBwcm9ncmFtcyBhcyBmb3JlaWduIGNvbW1hbmRzIGJ5IGFkZGluZyB0aGVzZSBsaW5lcyB0byB5b3VyCi1sb2dpbi5jb206Ci0KLSAgJCBnYXMgOj09ICRHTlVfUk9PVDpbYmluXWFzLmV4ZQotICAkIHNpemUgOj09ICRHTlVfUk9PVDpbYmluXXNpemUuZXhlCi0gICQgbm0gOj09ICRHTlVfUk9PVDpbYmluXW5tLmV4ZQotICAkIG9iamR1bXAgOj09ICRHTlVfUk9PVDpbYmluXW9iamR1bXAuZXhlCi0gICQgc3RyaW5ncyA6PT0gJEdOVV9ST09UOltiaW5dc3RyaW5ncy5leGUKLQotSWYgeW91IGhhdmUgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHNldHVwLCBjb3B5IHRoZSBiaW5hcnkgdXRpbGl0aWVzCi0oWy5iaW51dGlsc11zaXplLmV4ZSwgWy5iaW51dGlsc11ubS5leGUsIFsuYmludXRpbHNdb2JqZHVtcC5leGUsCi1hbmQgWy5iaW51dGlsc11zdHJpbmdzLmV4ZSkgYW5kIHRoZSBnbnUgYXNzZW1ibGVyIGFuZCBwcmVwcm9jZXNzb3IKLShbLmdhc11hcy5leGUgYW5kIFsuZ2FzXWdhc3AuZXhlXSkgdG8gYSBkaXJlY3Rvcnkgb2YgeW91ciBjaG9pY2UKLWFuZCBkZWZpbmUgYWxsIHByb2dyYW1zIGFzIGZvcmVpZ24gY29tbWFuZHMuCi0KLQotSWYgeW91J3JlIHNhdGllc2ZpZWQgd2l0aCB0aGUgY29tcGlsYXRpb24sIHlvdSBtYXkgd2FudCB0byByZW1vdmUKLXVubmVlZGVkIG9iamVjdHMgYW5kIGxpYnJhcmllczoKLQotICAkIGdtYWtlIGNsZWFuCi0KLQotSWYgeW91IGhhdmUgYW55IHByb2JsZW1zIG9yIHF1ZXN0aW9ucyBhYm91dCB0aGUgYmludXRpbHMgb24gVk1TLCBmZWVsCi1mcmVlIHRvIG1haWwgbWUgYXQga2thZW1wZkBybWkuZGUuCmRpZmYgLS1naXQgYS9iaW51dGlscy9hY2luY2x1ZGUubTQgYi9iaW51dGlscy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA5YjkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FjbG9jYWwubTQgYi9iaW51dGlscy9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDYyZDcxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSw5MjUgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgNDAgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBMREZMQUdTPSIkTERGTEFHUyIgTElCUz0iJExJQlMiIFwKLUxOX1M9IiRMTl9TIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBPQkpEVU1QPSIkT0JKRFVNUCIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRsdF90YXJnZXQgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotY2FzZSAiJHRhcmdldCIgaW4KLU5PTkUpIGx0X3RhcmdldD0iJGhvc3QiIDs7Ci0qKSBsdF90YXJnZXQ9IiR0YXJnZXQiIDs7Ci1lc2FjCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX0RMT1BFTl0sCi1bbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIl0pCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtd2luMzItZGxsIl0pCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLSAgWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siID0geG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotdGVzdCB4IiRzaWxlbnQiID0geHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqKQotICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCi0gIDs7Ci1dKQotZXNhYwotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGVuYWJsZSBjaGVja3MgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSldKQotCi0jIEFDX0xJQlRPT0xfV0lOMzJfRExMIC0gZGVjbGFyZSBwYWNrYWdlIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpbjMyIGRsbCdzCi1BQ19ERUZVTihBQ19MSUJUT09MX1dJTjMyX0RMTCwgW0FDX0JFRk9SRShbJDBdLCBbQUNfTElCVE9PTF9TRVRVUF0pXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELCBbZG5sCi1kZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLCBbZG5sCi1kZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsIFtkbmwKLWRlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubSB8fCB0ZXN0IC1mICRhY19kaXIvbm0kYWNfZXhlZXh0IDsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotTElCTT0KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotYmVvcyogfCAqLSotY3lnd2luKikKLSAgIyBUaGVzZSBzeXN0ZW0gZG9uJ3QgaGF2ZSBsaWJtCi0gIDs7Ci0qLW5jci1zeXN2NC4zKikKLSAgQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCwgTElCTT0iLWxtdyIpCi0gIEFDX0NIRUNLX0xJQihtLCBtYWluLCBMSUJNPSIkTElCTSAtbG0iKQotICA7OwotKikKLSAgQUNfQ0hFQ0tfTElCKG0sIG1haW4sIExJQk09Ii1sbSIpCi0gIDs7Ci1lc2FjCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLSAgSU5DTFRETD1pZmVsc2UoJCMsMSwtSSQxLFsnLUkke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLAotICBbdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4eWVzICYmIGVuYWJsZV9sdGRsX2luc3RhbGw9bm9dLAotICBbaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHhubzsgdGhlbgotICAgICBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkKLSAgIGVsc2UKLSAgICAgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgIGZpCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4InllcyI7IHRoZW4KLSAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIKLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICAgIElOQ0xUREw9aWZlbHNlKCQjLDEsLUkkMSxbJy1JJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkKLSAgZWxzZQotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsPW5vIgotICAgIExJQkxUREw9Ii1sbHRkbCIKLSAgICBJTkNMVERMPQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotCi1kbmwgVGhpcyBpcyBqdXN0IHRvIHNpbGVuY2UgYWNsb2NhbCBhYm91dCB0aGUgbWFjcm8gbm90IGJlaW5nIHVzZWQKLWlmZWxzZShbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotCi1kbmwgQU1fUFJPR19MRVgKLWRubCBMb29rIGZvciBmbGV4LCBsZXggb3IgbWlzc2luZywgdGhlbiBydW4gQUNfUFJPR19MRVggYW5kIEFDX0RFQ0xfWVlURVhUCi1BQ19ERUZVTihBTV9QUk9HX0xFWCwKLVttaXNzaW5nX2Rpcj1pZmVsc2UoWyQxXSwsYGNkICRhY19hdXhfZGlyICYmIHB3ZGAsJDEpCi1BQ19DSEVDS19QUk9HUyhMRVgsIGZsZXggbGV4LCAiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIpCi1BQ19QUk9HX0xFWAotQUNfREVDTF9ZWVRFWFRdKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKLQkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKLQkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKE1BSU5UKWRubAotXQotKQotCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotCi1BQ19ERUZVTihBTV9DT05ESVRJT05BTCwKLVtBQ19TVUJTVCgkMV9UUlVFKQotQUNfU1VCU1QoJDFfRkFMU0UpCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maV0pCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FkZHIybGluZS4xIGIvYmludXRpbHMvYWRkcjJsaW5lLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2UxMDMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYWRkcjJsaW5lLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBhZGRyMmxpbmUgMSAiMjcgTWFyY2ggMTk5NyIgIkN5Z251cyBTb2x1dGlvbnMiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotYWRkcjJsaW5lIFwtIGNvbnZlcnQgYWRkcmVzc2VzIGludG8gZmlsZSBuYW1lcyBhbmQgbGluZSBudW1iZXJzCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBhZGRyMmxpbmUKLS5SQiAiW1x8IiAiXC1iXCAiXGMKLS5JIGJmZG5hbWVcYwotLlJCICIgfCAiICJcLVwtdGFyZ2V0PSJcYwotLkkgYmZkbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtQyB8IFwtXC1kZW1hbmdsZSAiXHxdIgotLlJCICJbXHwiICJcLWVcICJcYwotLkkgZmlsZW5hbWVcYwotLlJCICIgfCAiICJcLVwtZXhlPSJcYwotLkkgZmlsZW5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiBcLWYgfCBcLVwtZnVuY3Rpb25zICJcfF0iCi0uUkIgIltcfCIgXC1zIHwgXC1cLWJhc2VuYW1lcyAiXHxdIgotLlJCICJbXHwiIFwtSCB8IFwtXC1oZWxwICJcfF0iCi0uUkIgIltcfCIgXC1WIHwgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBhZGRyIGFkZHIgLi4uICAiXHxdIgotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLVxjCi0uQiBhZGRyMmxpbmUKLXRyYW5zbGF0ZXMgcHJvZ3JhbSBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMuICBHaXZlbgotYW4gYWRkcmVzcyBhbmQgYW4gZXhlY3V0YWJsZSwgaXQgdXNlcyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZQotZXhlY3V0YWJsZSB0byBmaWd1cmUgb3V0IHdoaWNoIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlCi1hc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBhZGRyZXNzLgotCi1UaGUgZXhlY3V0YWJsZSB0byB1c2UgaXMgc3BlY2lmaWVkIHdpdGggdGhlCi0uQiBcLWUKLW9wdGlvbi4gIFRoZSBkZWZhdWx0IGlzCi0uQiBhLm91dFxjCi1cJi4KLQotLkIgYWRkcjJsaW5lCi1oYXMgdHdvIG1vZGVzIG9mIG9wZXJhdGlvbi4KLQotSW4gdGhlIGZpcnN0LCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLAotYW5kCi0uQiBhZGRyMmxpbmUKLWRpc3BsYXlzIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoIGFkZHJlc3MuCi0KLUluIHRoZSBzZWNvbmQsCi0uQiBhZGRyMmxpbmUKLXJlYWRzIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBmcm9tIHN0YW5kYXJkIGlucHV0LCBhbmQgcHJpbnRzIHRoZSBmaWxlCi1uYW1lIGFuZCBsaW5lIG51bWJlciBmb3IgZWFjaCBhZGRyZXNzIG9uIHN0YW5kYXJkIG91dHB1dC4gIEluIHRoaXMKLW1vZGUsCi0uQiBhZGRyMmxpbmUKLW1heSBiZSB1c2VkIGluIGEgcGlwZSB0byBjb252ZXJ0IGR5bmFtaWNhbGx5IGNob3NlbiBhZGRyZXNzZXMuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBpcyBGSUxFTkFNRTpMSU5FTk8uICBUaGUgZmlsZSBuYW1lIGFuZCBsaW5lCi1udW1iZXIgZm9yIGVhY2ggYWRkcmVzcyBpcyBwcmludGVkIG9uIGEgc2VwYXJhdGUgbGluZS4gIElmIHRoZQotLkIgXC1mCi1vcHRpb24gaXMgdXNlZCwgdGhlbiBlYWNoIEZJTEVOQU1FOkxJTkVOTyBsaW5lIGlzIHByZWNlZGVkIGJ5IGEKLUZVTkNUSU9OTkFNRSBsaW5lIHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHRoZQotYWRkcmVzcy4KLQotSWYgdGhlIGZpbGUgbmFtZSBvciBmdW5jdGlvbiBuYW1lIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwKLS5CIGFkZHIybGluZQotd2lsbCBwcmludCB0d28gcXVlc3Rpb24gbWFya3MgaW4gdGhlaXIgcGxhY2UuICBJZiB0aGUgbGluZSBudW1iZXIgY2FuCi1ub3QgYmUgZGV0ZXJtaW5lZCwKLS5CIGFkZHIybGluZQotd2lsbCBwcmludCAwLgotCi0uU0ggT1BUSU9OUwotLlRQCi0uQkkgIlwtYiAiICJiZmRuYW1lIlxjCi0uVFAKLS5CSSAiXC1cLXRhcmdldD0iICJiZmRuYW1lIgotU3BlY2lmeSB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlCi1cYwotLkkgYmZkbmFtZVxjCi1cJi4KLQotLlRQCi0uQiBcLUMKLS5UUAotLkIgXC1cLWRlbWFuZ2xlCi1EZWNvZGUgKFxmSWRlbWFuZ2xlXGZQKSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLgotCi0uVFAKLS5CSSAiXC1lICIgImZpbGVuYW1lIlxjCi0uVFAKLS5CSSAiXC1cLWV4ZT0iICJmaWxlbmFtZSIKLVNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZm9yIHdoaWNoIGFkZHJlc3NlcyBzaG91bGQgYmUKLXRyYW5zbGF0ZWQuICBUaGUgZGVmYXVsdCBmaWxlIGlzCi0uQiBhLm91dFxjCi1cJi4KLQotLlRQCi0uQiBcLWYKLS5UUAotLkIgXC1cLWZ1bmN0aW9ucwotRGlzcGxheSBmdW5jdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgotCi0uVFAKLS5CIFwtcwotLlRQCi0uQiBcLVwtYmFzZW5hbWVzCi1EaXNwbGF5IG9ubHkgdGhlIGJhc2Ugb2YgZWFjaCBmaWxlIG5hbWUuCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYWRkcjJsaW5lLmMgYi9iaW51dGlscy9hZGRyMmxpbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3MDdjMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hZGRyMmxpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKiBhZGRyMmxpbmUuYyAtLSBjb252ZXJ0IGFkZHJlc3NlcyB0byBsaW5lIG51bWJlciBhbmQgZnVuY3Rpb24gbmFtZQotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggTGF1dGhlciA8VWxyaWNoLkxhdXRoZXJAemZlLnNpZW1lbnMuZGU+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRGVyaXZlZCBmcm9tIG9iamR1bXAuYyBhbmQgbm0uYyBieSBVbHJpY2guTGF1dGhlckB6ZmUuc2llbWVucy5kZQotCi0gICBVc2FnZTogCi0gICBhZGRyMmxpbmUgW29wdGlvbnNdIGFkZHIgYWRkciAuLi4KLSAgIG9yCi0gICBhZGRyMmxpbmUgW29wdGlvbnNdIAotCi0gICBib3RoIGZvcm1zIHdyaXRlIHJlc3VsdHMgdG8gc3Rkb3V0LCB0aGUgc2Vjb25kIGZvcm0gcmVhZHMgYWRkcmVzc2VzCi0gICB0byBiZSBjb252ZXJ0ZWQgZnJvbSBzdGRpbi4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotZXh0ZXJuIGNoYXIgKnByb2dyYW1fdmVyc2lvbjsKLQotc3RhdGljIGJvb2xlYW4gd2l0aF9mdW5jdGlvbnM7CS8qIC1mLCBzaG93IGZ1bmN0aW9uIG5hbWVzLiAgKi8KLXN0YXRpYyBib29sZWFuIGRvX2RlbWFuZ2xlOwkvKiAtQywgZGVtYW5nbGUgbmFtZXMuICAqLwotc3RhdGljIGJvb2xlYW4gYmFzZV9uYW1lczsJLyogLXMsIHN0cmlwIGRpcmVjdG9yeSBuYW1lcy4gICovCi0KLXN0YXRpYyBpbnQgbmFkZHI7CQkvKiBOdW1iZXIgb2YgYWRkcmVzc2VzIHRvIHByb2Nlc3MuICAqLwotc3RhdGljIGNoYXIgKiphZGRyOwkJLyogSGV4IGFkZHJlc3NlcyB0byBwcm9jZXNzLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKipzeW1zOwkJLyogU3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ImJhc2VuYW1lcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncyd9LAotICB7ImRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdDJ30sCi0gIHsiZXhlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdlJ30sCi0gIHsiZnVuY3Rpb25zIiwgbm9fYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdiJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnSCd9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgJ1YnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNsdXJwX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgdHJhbnNsYXRlX2FkZHJlc3NlcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0MCi0vKiBQcmludCBhIHVzYWdlIG1lc3NhZ2UgdG8gU1RSRUFNIGFuZCBleGl0IHdpdGggU1RBVFVTLiAgKi8KLQotc3RhdGljIHZvaWQKLXVzYWdlIChzdHJlYW0sIHN0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLUNmc0hWXSBbLWIgYmZkbmFtZV0gWy0tdGFyZ2V0PWJmZG5hbWVdXG5cCi0gICAgICAgWy1lIGV4ZWN1dGFibGVdIFstLWV4ZT1leGVjdXRhYmxlXSBbLS1kZW1hbmdsZV1cblwKLSAgICAgICBbLS1iYXNlbmFtZXNdIFstLWZ1bmN0aW9uc10gW2FkZHIgYWRkciAuLi5dXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQotDAotLyogUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNsdXJwX3N5bXRhYiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN0b3JhZ2U7Ci0gIGxvbmcgc3ltY291bnQ7Ci0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChzdG9yYWdlIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2UpOwotCi0gIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bXMpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotfQotDAotLyogVGhlc2UgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJldHdlZW4KLSAgIHRyYW5zbGF0ZV9hZGRyZXNzZXMgYW5kIGZpbmRfYWRkcmVzc19pbl9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF92bWEgcGM7Ci1zdGF0aWMgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci1zdGF0aWMgY29uc3QgY2hhciAqZnVuY3Rpb25uYW1lOwotc3RhdGljIHVuc2lnbmVkIGludCBsaW5lOwotc3RhdGljIGJvb2xlYW4gZm91bmQ7Ci0KLS8qIExvb2sgZm9yIGFuIGFkZHJlc3MgaW4gYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi0gICBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotZmluZF9hZGRyZXNzX2luX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbikgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAocGMgPCB2bWEpCi0gICAgcmV0dXJuOwotCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOwotICBpZiAocGMgPj0gdm1hICsgc2l6ZSkKLSAgICByZXR1cm47Ci0KLSAgZm91bmQgPSBiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bXMsIHBjIC0gdm1hLAotCQkJCSAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsICZsaW5lKTsKLX0KLQotLyogUmVhZCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgZnJvbSBzdGRpbiwgdHJhbnNsYXRlIGludG8KLSAgIGZpbGVfbmFtZTpsaW5lX251bWJlciBhbmQgb3B0aW9uYWxseSBmdW5jdGlvbiBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLXRyYW5zbGF0ZV9hZGRyZXNzZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHJlYWRfc3RkaW4gPSAobmFkZHIgPT0gMCk7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpZiAocmVhZF9zdGRpbikKLQl7Ci0JICBjaGFyIGFkZHJfaGV4WzEwMF07Ci0KLQkgIGlmIChmZ2V0cyAoYWRkcl9oZXgsIHNpemVvZiBhZGRyX2hleCwgc3RkaW4pID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgcGMgPSBiZmRfc2Nhbl92bWEgKGFkZHJfaGV4LCBOVUxMLCAxNik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChuYWRkciA8PSAwKQotCSAgICBicmVhazsKLQkgIC0tbmFkZHI7Ci0JICBwYyA9IGJmZF9zY2FuX3ZtYSAoKmFkZHIrKywgTlVMTCwgMTYpOwotCX0KLQotICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24sIChQVFIpIE5VTEwpOwotCi0gICAgICBpZiAoISBmb3VuZCkKLQl7Ci0JICBpZiAod2l0aF9mdW5jdGlvbnMpCi0JICAgIHByaW50ZiAoIj8/XG4iKTsKLQkgIHByaW50ZiAoIj8/OjBcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAod2l0aF9mdW5jdGlvbnMpCi0JICAgIHsKLQkgICAgICBpZiAoZnVuY3Rpb25uYW1lID09IE5VTEwgfHwgKmZ1bmN0aW9ubmFtZSA9PSAnXDAnKQotCQlwcmludGYgKCI/P1xuIik7Ci0JICAgICAgZWxzZSBpZiAoISBkb19kZW1hbmdsZSkKLQkJcHJpbnRmICgiJXNcbiIsIGZ1bmN0aW9ubmFtZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqcmVzOwotCi0JCSAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKGZ1bmN0aW9ubmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotCQkgIGlmIChyZXMgPT0gTlVMTCkKLQkJICAgIHByaW50ZiAoIiVzXG4iLCBmdW5jdGlvbm5hbWUpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiJXNcbiIsIHJlcyk7Ci0JCSAgICAgIGZyZWUgKHJlcyk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoYmFzZV9uYW1lcyAmJiBmaWxlbmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqaDsKLQotCSAgICAgIGggPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlmaWxlbmFtZSA9IGggKyAxOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIj8/IiwgbGluZSk7Ci0JfQotCi0gICAgICAvKiBmZmx1c2goKSBpcyBlc3NlbnRpYWwgZm9yIHVzaW5nIHRoaXMgY29tbWFuZCBhcyBhIHNlcnZlcgotICAgICAgICAgY2hpbGQgcHJvY2VzcyB0aGF0IHJlYWRzIGFkZHJlc3NlcyBmcm9tIGEgcGlwZSBhbmQgcmVzcG9uZHMKLSAgICAgICAgIHdpdGggbGluZSBudW1iZXIgaW5mb3JtYXRpb24sIHByb2Nlc3Npbmcgb25lIGFkZHJlc3MgYXQgYQotICAgICAgICAgdGltZS4gICovCi0gICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0gICAgfQotfQotCi0vKiBQcm9jZXNzIGEgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2ZpbGUgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqYWJmZDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOwotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfYXJjaGl2ZSkpCi0gICAgZmF0YWwgKF8oIiVzOiBjYW4gbm90IGdldCBhZGRyZXNzZXMgZnJvbSBhcmNoaXZlIiksIGZpbGVuYW1lKTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2x1cnBfc3ltdGFiIChhYmZkKTsKLQotICB0cmFuc2xhdGVfYWRkcmVzc2VzIChhYmZkKTsKLQotICBpZiAoc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHN5bXMpOwotICAgICAgc3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIGJmZF9jbG9zZSAoYWJmZCk7Ci19Ci0MCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnRhcmdldDsKLSAgaW50IGM7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgdGFyZ2V0ID0gTlVMTDsKLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJiOkNlOnNmSFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnYic6Ci0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdDJzoKLQkgIGRvX2RlbWFuZ2xlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGJhc2VfbmFtZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICB3aXRoX2Z1bmN0aW9ucyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHByaW50X3ZlcnNpb24gKCJhZGRyMmxpbmUiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gImEub3V0IjsKLQotICBhZGRyID0gYXJndiArIG9wdGluZDsKLSAgbmFkZHIgPSBhcmdjIC0gb3B0aW5kOwotCi0gIHByb2Nlc3NfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hci4xIGIvYmludXRpbHMvYXIuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3MWE0MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hci4xCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTUsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBhciAxICIxOTk5IiAiQ3lnbnVzIFNvbHV0aW9ucyIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1hciBcLSBjcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uQlIgYXIgIiBbXHwiICItIiAiXHxdIlxjCi0uSSB7ZG1wcXJ0eH1bYWJjZmlsTm9Qc1N1dlZdIFxjCi1bXHxcYwotLkkgbWVtYmVybmFtZVxjCi1cJlx8XSBcYwotW1x8XGMKLS5JIGNvdW50XGMKLVwmXHxdIFxjCi0uSSBhcmNoaXZlXGMKLVwmIFxjCi0uSSBmaWxlc1xjCi1cJi5cfC5cfC4KLQotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLVRoZSBHTlUgXGMKLS5CIGFyXGMKLVwmIHByb2dyYW0gY3JlYXRlcywgbW9kaWZpZXMsIGFuZCBleHRyYWN0cyBmcm9tCi1hcmNoaXZlcy4gIEFuIFxjCi0uSSBhcmNoaXZlXGMKLVwmIGlzIGEgc2luZ2xlIGZpbGUgaG9sZGluZyBhIGNvbGxlY3Rpb24gb2YKLW90aGVyIGZpbGVzIGluIGEgc3RydWN0dXJlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gcmV0cmlldmUKLXRoZSBvcmlnaW5hbCBpbmRpdmlkdWFsIGZpbGVzIChjYWxsZWQgXGMKLS5JIG1lbWJlcnNcYwotXCYgb2YgdGhlIGFyY2hpdmUpLgotCi1UaGUgb3JpZ2luYWwgZmlsZXMnIGNvbnRlbnRzLCBtb2RlIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGFuZAotZ3JvdXAgYXJlIHByZXNlcnZlZCBpbiB0aGUgYXJjaGl2ZSwgYW5kIG1heSBiZSByZWNvbnN0aXR1dGVkIG9uCi1leHRyYWN0aW9uLiAgCi0KLUdOVSBcYwotLkIgYXJcYwotXCYgY2FuIG1haW50YWluIGFyY2hpdmVzIHdob3NlIG1lbWJlcnMgaGF2ZSBuYW1lcyBvZiBhbnkKLWxlbmd0aDsgaG93ZXZlciwgZGVwZW5kaW5nIG9uIGhvdyBcYwotLkIgYXJcYwotXCYgaXMgY29uZmlndXJlZCBvbiB5b3VyCi1zeXN0ZW0sIGEgbGltaXQgb24gbWVtYmVyLW5hbWUgbGVuZ3RoIG1heSBiZSBpbXBvc2VkIChmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBhcmNoaXZlIGZvcm1hdHMgbWFpbnRhaW5lZCB3aXRoIG90aGVyIHRvb2xzKS4gIElmIGl0IGV4aXN0cywgdGhlCi1saW1pdCBpcyBvZnRlbiAxNSBjaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBhLm91dCkgb3IgMTYKLWNoYXJhY3RlcnMgKHR5cGljYWwgb2YgZm9ybWF0cyByZWxhdGVkIHRvIGNvZmYpLgotCi1cYwotLkIgYXJcYwotXCYgaXMgY29uc2lkZXJlZCBhIGJpbmFyeSB1dGlsaXR5IGJlY2F1c2UgYXJjaGl2ZXMgb2YgdGhpcyBzb3J0Ci1hcmUgbW9zdCBvZnRlbiB1c2VkIGFzIFxjCi0uSSBsaWJyYXJpZXNcYwotXCYgaG9sZGluZyBjb21tb25seSBuZWVkZWQKLXN1YnJvdXRpbmVzLgotCi1cYwotLkIgYXJcYwotXCYgd2lsbCBjcmVhdGUgYW4gaW5kZXggdG8gdGhlIHN5bWJvbHMgZGVmaW5lZCBpbiByZWxvY2F0YWJsZQotb2JqZWN0IG1vZHVsZXMgaW4gdGhlIGFyY2hpdmUgd2hlbiB5b3Ugc3BlY2lmeSB0aGUgbW9kaWZpZXIgYFx8XGMKLS5CIHNcYwotXHwnLgotT25jZSBjcmVhdGVkLCB0aGlzIGluZGV4IGlzIHVwZGF0ZWQgaW4gdGhlIGFyY2hpdmUgd2hlbmV2ZXIgXGMKLS5CIGFyXGMKLVwmCi1tYWtlcyBhIGNoYW5nZSB0byBpdHMgY29udGVudHMgKHNhdmUgZm9yIHRoZSBgXHxcYwotLkIgcVxjCi1cfCcgdXBkYXRlIG9wZXJhdGlvbikuCi1BbiBhcmNoaXZlIHdpdGggc3VjaCBhbiBpbmRleCBzcGVlZHMgdXAgbGlua2luZyB0byB0aGUgbGlicmFyeSwgYW5kCi1hbGxvd3Mgcm91dGluZXMgaW4gdGhlIGxpYnJhcnkgdG8gY2FsbCBlYWNoIG90aGVyIHdpdGhvdXQgcmVnYXJkIHRvCi10aGVpciBwbGFjZW1lbnQgaW4gdGhlIGFyY2hpdmUuCi0KLVlvdSBtYXkgdXNlIGBcfFxjCi0uQiBubSBcLXNcYwotXHwnIG9yIGBcfFxjCi0uQiBubSBcLVwtcHJpbnRcLWFybWFwXGMKLVx8JyB0byBsaXN0IHRoaXMgaW5kZXgKLXRhYmxlLiAgSWYgYW4gYXJjaGl2ZSBsYWNrcyB0aGUgdGFibGUsIGFub3RoZXIgZm9ybSBvZiBcYwotLkIgYXJcYwotXCYgY2FsbGVkCi1cYwotLkIgcmFubGliXGMKLVwmIGNhbiBiZSB1c2VkIHRvIGFkZCBqdXN0IHRoZSB0YWJsZS4KLQotXGMKLS5CIGFyXGMKLVwmIGluc2lzdHMgb24gYXQgbGVhc3QgdHdvIGFyZ3VtZW50cyB0byBleGVjdXRlOiBvbmUKLWtleWxldHRlciBzcGVjaWZ5aW5nIHRoZSBcYwotLkkgb3BlcmF0aW9uXGMKLVwmIChvcHRpb25hbGx5IGFjY29tcGFuaWVkIGJ5IG90aGVyCi1rZXlsZXR0ZXJzIHNwZWNpZnlpbmcgXGMKLS5JIG1vZGlmaWVyc1xjCi1cJiksIGFuZCB0aGUgYXJjaGl2ZSBuYW1lIHRvIGFjdCBvbi4KLQotTW9zdCBvcGVyYXRpb25zIGNhbiBhbHNvIGFjY2VwdCBmdXJ0aGVyIFxjCi0uSSBmaWxlc1xjCi1cJiBhcmd1bWVudHMsCi1zcGVjaWZ5aW5nIHBhcnRpY3VsYXIgZmlsZXMgdG8gb3BlcmF0ZSBvbi4KLQotLlNIIE9QVElPTlMKLUdOVSBcYwotLkIgYXJcYwotXCYgYWxsb3dzIHlvdSB0byBtaXggdGhlIG9wZXJhdGlvbiBjb2RlIFxjCi0uSSBwXGMKLVwmIGFuZCBtb2RpZmllcgotZmxhZ3MgXGMKLS5JIG1vZFxjCi1cJiBpbiBhbnkgb3JkZXIsIHdpdGhpbiB0aGUgZmlyc3QgY29tbWFuZC1saW5lIGFyZ3VtZW50LgotCi1JZiB5b3Ugd2lzaCwgeW91IG1heSBiZWdpbiB0aGUgZmlyc3QgY29tbWFuZC1saW5lIGFyZ3VtZW50IHdpdGggYQotZGFzaC4KLQotVGhlIFxjCi0uSSBwXGMKLVwmIGtleWxldHRlciBzcGVjaWZpZXMgd2hhdCBvcGVyYXRpb24gdG8gZXhlY3V0ZTsgaXQgbWF5IGJlCi1hbnkgb2YgdGhlIGZvbGxvd2luZywgYnV0IHlvdSBtdXN0IHNwZWNpZnkgb25seSBvbmUgb2YgdGhlbToKLQotLlRQCi0uQiBkCi1cYwotLkkgRGVsZXRlXGMKLVwmIG1vZHVsZXMgZnJvbSB0aGUgYXJjaGl2ZS4gIFNwZWNpZnkgdGhlIG5hbWVzIG9mIG1vZHVsZXMgdG8KLWJlIGRlbGV0ZWQgYXMgXGMKLS5JIGZpbGVzXGMKLVwmOyB0aGUgYXJjaGl2ZSBpcyB1bnRvdWNoZWQgaWYgeW91Ci1zcGVjaWZ5IG5vIGZpbGVzIHRvIGRlbGV0ZS4KLQotSWYgeW91IHNwZWNpZnkgdGhlIGBcfFxjCi0uQiB2XGMKLVx8JyBtb2RpZmllciwgXGMKLS5CIGFyXGMKLVwmIHdpbGwgbGlzdCBlYWNoIG1vZHVsZQotYXMgaXQgaXMgZGVsZXRlZC4KLQotLlRQCi0uQiBtCi1Vc2UgdGhpcyBvcGVyYXRpb24gdG8gXGMKLS5JIG1vdmVcYwotXCYgbWVtYmVycyBpbiBhbiBhcmNoaXZlLgotCi1UaGUgb3JkZXJpbmcgb2YgbWVtYmVycyBpbiBhbiBhcmNoaXZlIGNhbiBtYWtlIGEgZGlmZmVyZW5jZSBpbiBob3cKLXByb2dyYW1zIGFyZSBsaW5rZWQgdXNpbmcgdGhlIGxpYnJhcnksIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgaW4gbW9yZQotdGhhbiBvbmUgbWVtYmVyLiAgCi0KLUlmIG5vIG1vZGlmaWVycyBhcmUgdXNlZCB3aXRoIFxjCi0uQiBtXGMKLVwmLCBhbnkgbWVtYmVycyB5b3UgbmFtZSBpbiB0aGUKLVxjCi0uSSBmaWxlc1xjCi1cJiBhcmd1bWVudHMgYXJlIG1vdmVkIHRvIHRoZSBcYwotLkkgZW5kXGMKLVwmIG9mIHRoZSBhcmNoaXZlOwoteW91IGNhbiB1c2UgdGhlIGBcfFxjCi0uQiBhXGMKLVx8JywgYFx8XGMKLS5CIGJcYwotXHwnLCBvciBgXHxcYwotLkIgaVxjCi1cfCcgbW9kaWZpZXJzIHRvIG1vdmUgdGhlbSB0byBhCi1zcGVjaWZpZWQgcGxhY2UgaW5zdGVhZC4KLQotLlRQCi0uQiBwCi1cYwotLkkgUHJpbnRcYwotXCYgdGhlIHNwZWNpZmllZCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLCB0byB0aGUgc3RhbmRhcmQKLW91dHB1dCBmaWxlLiAgSWYgdGhlIGBcfFxjCi0uQiB2XGMKLVx8JyBtb2RpZmllciBpcyBzcGVjaWZpZWQsIHNob3cgdGhlIG1lbWJlcgotbmFtZSBiZWZvcmUgY29weWluZyBpdHMgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LgotCi1JZiB5b3Ugc3BlY2lmeSBubyBcYwotLkkgZmlsZXNcYwotXCYsIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUgYXJlIHByaW50ZWQuCi0KLS5UUAotLkIgcQotXGMKLS5JIFF1aWNrIGFwcGVuZFxjCi1cJjsgYWRkIFxjCi0uSSBmaWxlc1xjCi1cJiB0byB0aGUgZW5kIG9mIFxjCi0uSSBhcmNoaXZlXGMKLVwmLAotd2l0aG91dCBjaGVja2luZyBmb3IgcmVwbGFjZW1lbnQuICAKLQotVGhlIG1vZGlmaWVycyBgXHxcYwotLkIgYVxjCi1cfCcsIGBcfFxjCi0uQiBiXGMKLVx8JywgYW5kIGBcfFxjCi0uQiBpXGMKLVx8JyBkbyBcYwotLkkgbm90XGMKLVwmIGFmZmVjdCB0aGlzCi1vcGVyYXRpb247IG5ldyBtZW1iZXJzIGFyZSBhbHdheXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuCi0KLVRoZSBtb2RpZmllciBgXHxcYwotLkIgdlxjCi1cfCcgbWFrZXMgXGMKLS5CIGFyXGMKLVwmIGxpc3QgZWFjaCBmaWxlIGFzIGl0IGlzIGFwcGVuZGVkLgotCi1TaW5jZSB0aGUgcG9pbnQgb2YgdGhpcyBvcGVyYXRpb24gaXMgc3BlZWQsIHRoZSBhcmNoaXZlJ3Mgc3ltYm9sIHRhYmxlCi1pbmRleCBpcyBub3QgdXBkYXRlZCwgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQ7IHlvdSBjYW4gdXNlIGBcfFxjCi0uQiBhciBzXGMKLVx8JyBvcgotXGMKLS5CIHJhbmxpYlxjCi1cJiBleHBsaWNpdGx5IHRvIHVwZGF0ZSB0aGUgc3ltYm9sIHRhYmxlIGluZGV4LgotCi1Ib3dldmVyLCB0b28gbWFueSBkaWZmZXJlbnQgc3lzdGVtcyBhc3N1bWUgcXVpY2sgYXBwZW5kIHJlYnVpbGRzIHRoZQotaW5kZXgsIHNvIEdOVQotLkIgYXIKLWltcGxlbWVudHMgYFx8XGMKLS5CIHFcYwotXHwnIGFzIGEgc3lub255bSBmb3IgYFx8XGMKLS5CIHJcYwotXHwnLgotCi0uVFAKLS5CIHIKLUluc2VydCBcYwotLkkgZmlsZXNcYwotXCYgaW50byBcYwotLkkgYXJjaGl2ZVxjCi1cJiAod2l0aCBcYwotLkkgcmVwbGFjZW1lbnRcYwotXCYpLiBUaGlzCi1vcGVyYXRpb24gZGlmZmVycyBmcm9tIGBcfFxjCi0uQiBxXGMKLVx8JyBpbiB0aGF0IGFueSBwcmV2aW91c2x5IGV4aXN0aW5nIG1lbWJlcnMKLWFyZSBkZWxldGVkIGlmIHRoZWlyIG5hbWVzIG1hdGNoIHRob3NlIGJlaW5nIGFkZGVkLgotCi1JZiBvbmUgb2YgdGhlIGZpbGVzIG5hbWVkIGluIFxjCi0uSSBmaWxlc1xjCi1cJiBkb2Vzbid0IGV4aXN0LCBcYwotLkIgYXJcYwotXCYKLWRpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCBsZWF2ZXMgdW5kaXN0dXJiZWQgYW55IGV4aXN0aW5nIG1lbWJlcnMKLW9mIHRoZSBhcmNoaXZlIG1hdGNoaW5nIHRoYXQgbmFtZS4KLQotQnkgZGVmYXVsdCwgbmV3IG1lbWJlcnMgYXJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGU7IGJ1dCB5b3UgbWF5Ci11c2Ugb25lIG9mIHRoZSBtb2RpZmllcnMgYFx8XGMKLS5CIGFcYwotXHwnLCBgXHxcYwotLkIgYlxjCi1cfCcsIG9yIGBcfFxjCi0uQiBpXGMKLVx8JyB0byByZXF1ZXN0Ci1wbGFjZW1lbnQgcmVsYXRpdmUgdG8gc29tZSBleGlzdGluZyBtZW1iZXIuCi0KLVRoZSBtb2RpZmllciBgXHxcYwotLkIgdlxjCi1cfCcgdXNlZCB3aXRoIHRoaXMgb3BlcmF0aW9uIGVsaWNpdHMgYSBsaW5lIG9mCi1vdXRwdXQgZm9yIGVhY2ggZmlsZSBpbnNlcnRlZCwgYWxvbmcgd2l0aCBvbmUgb2YgdGhlIGxldHRlcnMgYFx8XGMKLS5CIGFcYwotXHwnIG9yCi1gXHxcYwotLkIgclxjCi1cfCcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZmlsZSB3YXMgYXBwZW5kZWQgKG5vIG9sZCBtZW1iZXIKLWRlbGV0ZWQpIG9yIHJlcGxhY2VkLgotCi0uVFAKLS5CIHQKLURpc3BsYXkgYSBcYwotLkkgdGFibGVcYwotXCYgbGlzdGluZyB0aGUgY29udGVudHMgb2YgXGMKLS5JIGFyY2hpdmVcYwotXCYsIG9yIHRob3NlCi1vZiB0aGUgZmlsZXMgbGlzdGVkIGluIFxjCi0uSSBmaWxlc1xjCi1cJiB0aGF0IGFyZSBwcmVzZW50IGluIHRoZQotYXJjaGl2ZS4gIE5vcm1hbGx5IG9ubHkgdGhlIG1lbWJlciBuYW1lIGlzIHNob3duOyBpZiB5b3UgYWxzbyB3YW50IHRvCi1zZWUgdGhlIG1vZGVzIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGdyb3VwLCBhbmQgc2l6ZSwgeW91IGNhbgotcmVxdWVzdCB0aGF0IGJ5IGFsc28gc3BlY2lmeWluZyB0aGUgYFx8XGMKLS5CIHZcYwotXHwnIG1vZGlmaWVyLgotCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgYW55IFxjCi0uSSBmaWxlc1xjCi1cJiwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlCi1hcmUgbGlzdGVkLgotCi1JZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIChzYXksIGBcfFxjCi0uQiBmaWVcYwotXHwnKSBpbgotYW4gYXJjaGl2ZSAoc2F5IGBcfFxjCi0uQiBiLmFcYwotXHwnKSwgYFx8XGMKLS5CIGFyIHQgYi5hIGZpZVxjCi1cfCcgd2lsbCBsaXN0IG9ubHkgdGhlCi1maXJzdCBpbnN0YW5jZTsgdG8gc2VlIHRoZW0gYWxsLCB5b3UgbXVzdCBhc2sgZm9yIGEgY29tcGxldGUKLWxpc3RpbmdcKGVtXCZpbiBvdXIgZXhhbXBsZSwgYFx8XGMKLS5CIGFyIHQgYi5hXGMKLVx8Jy4KLQotLlRQCi0uQiB4Ci1cYwotLkkgRXh0cmFjdFxjCi1cJiBtZW1iZXJzIChuYW1lZCBcYwotLkkgZmlsZXNcYwotXCYpIGZyb20gdGhlIGFyY2hpdmUuICBZb3UgY2FuCi11c2UgdGhlIGBcfFxjCi0uQiB2XGMKLVx8JyBtb2RpZmllciB3aXRoIHRoaXMgb3BlcmF0aW9uLCB0byByZXF1ZXN0IHRoYXQKLVxjCi0uQiBhclxjCi1cJiBsaXN0IGVhY2ggbmFtZSBhcyBpdCBleHRyYWN0cyBpdC4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBcYwotLkkgZmlsZXNcYwotXCYsIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQotYXJlIGV4dHJhY3RlZC4KLQotLlBQCi0KLUEgbnVtYmVyIG9mIG1vZGlmaWVycyAoXGMKLS5JIG1vZFxjCi1cJikgbWF5IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgXGMKLS5JIHBcYwotXCYKLWtleWxldHRlciwgdG8gc3BlY2lmeSB2YXJpYXRpb25zIG9uIGFuIG9wZXJhdGlvbidzIGJlaGF2aW9yOgotCi0uVFAKLS5CIGEKLUFkZCBuZXcgZmlsZXMgXGMKLS5JIGFmdGVyXGMKLVwmIGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBcYwotLkIgYVxjCi1cJiwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgXGMKLS5JIG1lbWJlcm5hbWVcYwotXCYgYXJndW1lbnQsIGJlZm9yZSB0aGUKLVxjCi0uSSBhcmNoaXZlXGMKLVwmIHNwZWNpZmljYXRpb24uCi0KLS5UUAotLkIgYgotQWRkIG5ldyBmaWxlcyBcYwotLkkgYmVmb3JlXGMKLVwmIGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBcYwotLkIgYlxjCi1cJiwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgXGMKLS5JIG1lbWJlcm5hbWVcYwotXCYgYXJndW1lbnQsIGJlZm9yZSB0aGUKLVxjCi0uSSBhcmNoaXZlXGMKLVwmIHNwZWNpZmljYXRpb24uICAoc2FtZSBhcyBgXHxcYwotLkIgaVxjCi1cfCcpLgotCi0uVFAKLS5CIGMKLVxjCi0uSSBDcmVhdGVcYwotXCYgdGhlIGFyY2hpdmUuICBUaGUgc3BlY2lmaWVkIFxjCi0uSSBhcmNoaXZlXGMKLVwmIGlzIGFsd2F5cwotY3JlYXRlZCBpZiBpdCBkaWRuJ3QgZXhpc3QsIHdoZW4geW91IHJlcXVlc3QgYW4gdXBkYXRlLiAgQnV0IGEgd2FybmluZyBpcwotaXNzdWVkIHVubGVzcyB5b3Ugc3BlY2lmeSBpbiBhZHZhbmNlIHRoYXQgeW91IGV4cGVjdCB0byBjcmVhdGUgaXQsIGJ5Ci11c2luZyB0aGlzIG1vZGlmaWVyLgotCi0uVFAKLS5CIGYKLVRydW5jYXRlIG5hbWVzIGluIHRoZSBhcmNoaXZlLiAgCi0uQiBhcgotd2lsbCBub3JtYWxseSBwZXJtaXQgZmlsZSBuYW1lcyBvZiBhbnkgbGVuZ3RoLiAgVGhpcyB3aWxsIGNhdXNlIGl0IHRvCi1jcmVhdGUgYXJjaGl2ZXMgd2hpY2ggYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG5hdGl2ZSAKLS5CIGFyCi1wcm9ncmFtIG9uIHNvbWUgc3lzdGVtcy4gIElmIHRoaXMgaXMgYSBjb25jZXJuLCB0aGUgCi0uQiBmCi1tb2RpZmllciBtYXkgYmUgdXNlZCB0byB0cnVuY2F0ZSBmaWxlIG5hbWVzIHdoZW4gcHV0dGluZyB0aGVtIGluIHRoZQotYXJjaGl2ZS4KLQotLlRQCi0uQiBpCi1JbnNlcnQgbmV3IGZpbGVzIFxjCi0uSSBiZWZvcmVcYwotXCYgYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIFxjCi0uQiBpXGMKLVwmLCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBcYwotLkkgbWVtYmVybmFtZVxjCi1cJiBhcmd1bWVudCwgYmVmb3JlIHRoZQotXGMKLS5JIGFyY2hpdmVcYwotXCYgc3BlY2lmaWNhdGlvbi4gIChzYW1lIGFzIGBcfFxjCi0uQiBiXGMKLVx8JykuCi0KLS5UUAotLkIgbAotVGhpcyBtb2RpZmllciBpcyBhY2NlcHRlZCBidXQgbm90IHVzZWQuCi0KLS5UUAotLkIgTgotVXNlcyB0aGUKLS5JIGNvdW50Ci1wYXJhbWV0ZXIuICBUaGlzIGlzIHVzZWQgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGVudHJpZXMgaW4gdGhlIGFyY2hpdmUKLXdpdGggdGhlIHNhbWUgbmFtZS4gIEV4dHJhY3Qgb3IgZGVsZXRlIGluc3RhbmNlCi0uSSBjb3VudAotb2YgdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgYXJjaGl2ZS4KLQotLlRQCi0uQiBvCi1QcmVzZXJ2ZSB0aGUgXGMKLS5JIG9yaWdpbmFsXGMKLVwmIGRhdGVzIG9mIG1lbWJlcnMgd2hlbiBleHRyYWN0aW5nIHRoZW0uICBJZgoteW91IGRvIG5vdCBzcGVjaWZ5IHRoaXMgbW9kaWZpZXIsIGZpbGVzIGV4dHJhY3RlZCBmcm9tIHRoZSBhcmNoaXZlCi13aWxsIGJlIHN0YW1wZWQgd2l0aCB0aGUgdGltZSBvZiBleHRyYWN0aW9uLgotCi0uVFAKLS5CIFAKLVVzZSB0aGUgZnVsbCBwYXRoIG5hbWUgd2hlbiBtYXRjaGluZyBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4KLS5CIGFyCi1jYW4gbm90IGNyZWF0ZSBhbiBhcmNoaXZlIHdpdGggYSBmdWxsIHBhdGggbmFtZSAoc3VjaCBhcmNoaXZlcyBhcmUgbm90Ci1QT1NJWCBjb21wbGFpbnQpLCBidXQgb3RoZXIgYXJjaGl2ZSBjcmVhdG9ycyBjYW4uICBUaGlzIG9wdGlvbiB3aWxsCi1jYXVzZQotLkIgYXIKLXRvIG1hdGNoIGZpbGUgbmFtZXMgdXNpbmcgYSBjb21wbGV0ZSBwYXRoIG5hbWUsIHdoaWNoIGNhbiBiZQotY29udmVuaWVudCB3aGVuIGV4dHJhY3RpbmcgYSBzaW5nbGUgZmlsZSBmcm9tIGFuIGFyY2hpdmUgY3JlYXRlZCBieQotYW5vdGhlciB0b29sLgotCi0uVFAKLS5CIHMKLVdyaXRlIGFuIG9iamVjdC1maWxlIGluZGV4IGludG8gdGhlIGFyY2hpdmUsIG9yIHVwZGF0ZSBhbiBleGlzdGluZyBvbmUsCi1ldmVuIGlmIG5vIG90aGVyIGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBhcmNoaXZlLiAgWW91IG1heSB1c2UgdGhpcyBtb2RpZmllcgotZmxhZyBlaXRoZXIgd2l0aCBhbnkgb3BlcmF0aW9uLCBvciBhbG9uZS4gIFJ1bm5pbmcgYFx8XGMKLS5CIGFyIHNcYwotXHwnIG9uIGFuCi1hcmNoaXZlIGlzIGVxdWl2YWxlbnQgdG8gcnVubmluZyBgXHxcYwotLkIgcmFubGliXGMKLVx8JyBvbiBpdC4KLQotLlRQCi0uQiBTCi1EbyBub3QgZ2VuZXJhdGUgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBUaGlzIGNhbiBzcGVlZCB1cCBidWlsZGluZyBhCi1sYXJnZSBsaWJyYXJ5IGluIHNldmVyYWwgc3RlcHMuICBUaGUgcmVzdWx0aW5nIGFyY2hpdmUgY2FuIG5vdCBiZSB1c2VkCi13aXRoIHRoZSBsaW5rZXIuICBJbiBvcmRlciB0byBidWlsZCBhIHN5bWJvbCB0YWJsZSwgeW91IG11c3Qgb21pdCB0aGUKLWBcfFxjCi0uQiBTXGMKLVx8JyBtb2RpZmllciBvbiB0aGUgbGFzdCBleGVjdXRpb24gb2YgYFx8XGMKLS5CIGFyXGMKLVx8Jywgb3IgeW91IG11c3QgcnVuIGBcfFxjCi0uQiByYW5saWJcYwotXHwnIG9uIHRoZSBhcmNoaXZlLgotCi0uVFAKLS5CIHUKLU5vcm1hbGx5LCBcYwotLkIgYXIgclxjCi1cJi5cfC5cfC4gaW5zZXJ0cyBhbGwgZmlsZXMKLWxpc3RlZCBpbnRvIHRoZSBhcmNoaXZlLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaW5zZXJ0IFxjCi0uSSBvbmx5XGMKLVwmIHRob3NlCi1vZiB0aGUgZmlsZXMgeW91IGxpc3QgdGhhdCBhcmUgbmV3ZXIgdGhhbiBleGlzdGluZyBtZW1iZXJzIG9mIHRoZSBzYW1lCi1uYW1lcywgdXNlIHRoaXMgbW9kaWZpZXIuICBUaGUgYFx8XGMKLS5CIHVcYwotXHwnIG1vZGlmaWVyIGlzIGFsbG93ZWQgb25seSBmb3IgdGhlCi1vcGVyYXRpb24gYFx8XGMKLS5CIHJcYwotXHwnIChyZXBsYWNlKS4gIEluIHBhcnRpY3VsYXIsIHRoZSBjb21iaW5hdGlvbiBgXHxcYwotLkIgcXVcYwotXHwnIGlzCi1ub3QgYWxsb3dlZCwgc2luY2UgY2hlY2tpbmcgdGhlIHRpbWVzdGFtcHMgd291bGQgbG9zZSBhbnkgc3BlZWQKLWFkdmFudGFnZSBmcm9tIHRoZSBvcGVyYXRpb24gYFx8XGMKLS5CIHFcYwotXHwnLgotCi0uVFAKLS5CIHYKLVRoaXMgbW9kaWZpZXIgcmVxdWVzdHMgdGhlIFxjCi0uSSB2ZXJib3NlXGMKLVwmIHZlcnNpb24gb2YgYW4gb3BlcmF0aW9uLiAgTWFueQotb3BlcmF0aW9ucyBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHN1Y2ggYXMgZmlsZW5hbWVzIHByb2Nlc3NlZCwKLXdoZW4gdGhlIG1vZGlmaWVyIGBcfFxjCi0uQiB2XGMKLVx8JyBpcyBhcHBlbmRlZC4KLQotLlRQCi0uQiBWCi1UaGlzIG1vZGlmaWVyIHNob3dzIHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkJSIGFyIC4KLQotLlBQCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi0sIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKS4KLS5CUiBubSAoIDEgKVxjCi1cJiwKLS5CUiByYW5saWIgKCAxIClcYwotXCYuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTUsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FyLmMgYi9iaW51dGlscy9hci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDllNTlkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDExICswLDAgQEAKLS8qIGFyLmMgLSBBcmNoaXZlIG1vZGlmeSBhbmQgZXh0cmFjdC4KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qCi0gICBCdWdzOiBzaG91bGQgdXNlIGdldG9wdCB0aGUgd2F5IHRhciBkb2VzIChjb21wbGV0ZSB3L29wdGlvbmFsIC0pIGFuZAotICAgc2hvdWxkIGhhdmUgbG9uZyBvcHRpb25zIHRvby4gR05VIGFyIHVzZWQgdG8gY2hlY2sgZmlsZSBhZ2FpbnN0IGZpbGVzeXN0ZW0KLSAgIGluIHF1aWNrX3VwZGF0ZSBhbmQgcmVwbGFjZSBvcGVyYXRpb25zICh3b3VsZCBjaGVjayBtdGltZSkuIERvZXNuJ3Qgd2FybgotICAgd2hlbiBuYW1lIHRydW5jYXRlZC4gTm8gd2F5IHRvIHNwZWNpZnkgcG9zX2VuZC4gRXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlCi0gICBtb3JlIGNvbnNpc3RhbnQuCi0qLwotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInByb2dyZXNzLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFyc3VwLmgiCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIF9fR08zMl9fXwotI2RlZmluZSBFWFRfTkFNRV9MRU4gMwkJLyogYnVmZmxlbiBvZiBhZGRpdGlvbiB0byBuYW1lIGlmIGl0J3MgTVMtRE9TICovCi0jZWxzZQotI2RlZmluZSBFWFRfTkFNRV9MRU4gNgkJLyogZGl0dG8gZm9yICpOSVggKi8KLSNlbmRpZgotCi0vKiBXZSBuZWVkIHRvIG9wZW4gZmlsZXMgaW4gYmluYXJ5IG1vZGVzIG9uIHN5c3RlbSB3aGVyZSB0aGF0IG1ha2VzIGEKLSAgIGRpZmZlcmVuY2UuICAqLwotI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAwCi0jZW5kaWYKLQotI2RlZmluZSBCVUZTSVpFIDgxOTIKLQotLyogS2x1ZGdlIGRlY2xhcmF0aW9uIGZyb20gQkZEISAgVGhpcyBpcyB1Z2x5ISAgRklYTUUhICBYWFggKi8KLQotc3RydWN0IGFyX2hkciAqCi0gIGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci0KLS8qIFN0YXRpYyBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIHZvaWQKLW1yaV9lbXVsIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbm9ybWFsaXplIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYmZkICopKTsKLQotc3RhdGljIHZvaWQKLXJlbW92ZV9vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdm9pZAotbWFwX292ZXJfbWVtYmVycyBQQVJBTVMgKChiZmQgKiwgdm9pZCAoKikoYmZkICopLCBjaGFyICoqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqIG1lbWJlcikpOwotCi1zdGF0aWMgdm9pZAotZGVsZXRlX21lbWJlcnMgUEFSQU1TICgoYmZkICosIGNoYXIgKipmaWxlc190b19kZWxldGUpKTsKLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1kb19xdWlja19hcHBlbmQgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaGl2ZV9maWxlbmFtZSwKLQkJCSBjaGFyICoqZmlsZXNfdG9fYXBwZW5kKSk7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLW1vdmVfbWVtYmVycyBQQVJBTVMgKChiZmQgKiwgY2hhciAqKmZpbGVzX3RvX21vdmUpKTsKLQotc3RhdGljIHZvaWQKLXJlcGxhY2VfbWVtYmVycyBQQVJBTVMgKChiZmQgKiwgY2hhciAqKmZpbGVzX3RvX3JlcGxhY2UsIGJvb2xlYW4gcXVpY2spKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2Rlc2NyIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXdyaXRlX2FyY2hpdmUgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIHZvaWQKLXJhbmxpYl9vbmx5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2huYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1yYW5saWJfdG91Y2ggUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaG5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXVzYWdlIFBBUkFNUyAoKGludCkpOwotDAotLyoqIEdsb2JhbHMgYW5kIGZsYWdzICovCi0KLWludCBtcmlfbW9kZTsKLQotLyogVGhpcyBmbGFnIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhciBhbmQgcmFubGliOgotICAgMSBtZWFucyB0aGlzIGlzICdyYW5saWInOyAwIG1lYW5zIHRoaXMgaXMgJ2FyJy4KLSAgIC0xIG1lYW5zIGlmIHdlIHNob3VsZCB1c2UgYXJndlswXSB0byBkZWNpZGUuICAqLwotZXh0ZXJuIGludCBpc19yYW5saWI7Ci0KLS8qIE5vbnplcm8gbWVhbnMgZG9uJ3Qgd2FybiBhYm91dCBjcmVhdGluZyB0aGUgYXJjaGl2ZSBmaWxlIGlmIG5lY2Vzc2FyeS4gICovCi1pbnQgc2lsZW50X2NyZWF0ZSA9IDA7Ci0KLS8qIE5vbnplcm8gbWVhbnMgZGVzY3JpYmUgZWFjaCBhY3Rpb24gcGVyZm9ybWVkLiAgKi8KLWludCB2ZXJib3NlID0gMDsKLQotLyogTm9uemVybyBtZWFucyBwcmVzZXJ2ZSBkYXRlcyBvZiBtZW1iZXJzIHdoZW4gZXh0cmFjdGluZyB0aGVtLiAgKi8KLWludCBwcmVzZXJ2ZV9kYXRlcyA9IDA7Ci0KLS8qIE5vbnplcm8gbWVhbnMgZG9uJ3QgcmVwbGFjZSBleGlzdGluZyBtZW1iZXJzIHdob3NlIGRhdGVzIGFyZSBtb3JlIHJlY2VudAotICAgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBmaWxlcy4gICovCi1pbnQgbmV3ZXJfb25seSA9IDA7Ci0KLS8qIENvbnRyb2xzIHRoZSB3cml0aW5nIG9mIGFuIGFyY2hpdmUgc3ltYm9sIHRhYmxlIChpbiBCU0Q6IGEgX18uU1lNREVGCi0gICBtZW1iZXIpLiAgLTEgbWVhbnMgd2UndmUgYmVlbiBleHBsaWNpdGx5IGFza2VkIHRvIG5vdCB3cml0ZSBhIHN5bWJvbCB0YWJsZTsKLSAgICsxIG1lYW5zIHdlJ3ZlIGJlZW4gZXhwbGljdGx5IGFza2VkIHRvIHdyaXRlIGl0OwotICAgMCBpcyB0aGUgZGVmYXVsdC4KLSAgIFRyYWRpdGlvbmFsbHksIHRoZSBkZWZhdWx0IGluIEJTRCBoYXMgYmVlbiB0byBub3Qgd3JpdGUgdGhlIHRhYmxlLgotICAgSG93ZXZlciwgZm9yIFBPU0lYLjIgY29tcGxpYW5jZSB0aGUgZGVmYXVsdCBpcyBub3cgdG8gd3JpdGUgYSBzeW1ib2wgdGFibGUKLSAgIGlmIGFueSBvZiB0aGUgbWVtYmVycyBhcmUgb2JqZWN0IGZpbGVzLiAgKi8KLWludCB3cml0ZV9hcm1hcCA9IDA7Ci0KLS8qIE5vbnplcm8gbWVhbnMgaXQncyB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBtZW1iZXI7IHBvc2l0aW9uIG5ldyBvciBtb3ZlZAotICAgZmlsZXMgd2l0aCByZXNwZWN0IHRvIHRoaXMgb25lLiAgKi8KLWNoYXIgKnBvc25hbWUgPSBOVUxMOwotCi0vKiBTZXogaG93IHRvIHVzZSBgcG9zbmFtZSc6IHBvc19iZWZvcmUgbWVhbnMgcG9zaXRpb24gYmVmb3JlIHRoYXQgbWVtYmVyLgotICAgcG9zX2FmdGVyIG1lYW5zIHBvc2l0aW9uIGFmdGVyIHRoYXQgbWVtYmVyLiBwb3NfZW5kIG1lYW5zIGFsd2F5cyBhdCBlbmQuCi0gICBwb3NfZGVmYXVsdCBtZWFucyBkZWZhdWx0IGFwcHJvcHJpYXRlbHkuIEZvciB0aGUgbGF0dGVyIHR3bywgYHBvc25hbWUnCi0gICBzaG91bGQgYWxzbyBiZSB6ZXJvLiAgKi8KLWVudW0gcG9zCi0gIHsKLSAgICBwb3NfZGVmYXVsdCwgcG9zX2JlZm9yZSwgcG9zX2FmdGVyLCBwb3NfZW5kCi0gIH0gcG9zdHlwZSA9IHBvc19kZWZhdWx0OwotCi1zdGF0aWMgYmZkICoqCi1nZXRfcG9zX2JmZCBQQVJBTVMgKChiZmQgKiosIGVudW0gcG9zLCBjb25zdCBjaGFyICopKTsKLQotLyogRm9yIGV4dHJhY3QvZGVsZXRlIG9ubHkuICBJZiBDT1VOVEVEX05BTUVfTU9ERSBpcyB0cnVlLCB3ZSBvbmx5Ci0gICBleHRyYWN0IHRoZSBDT1VOVEVEX05BTUVfQ09VTlRFUiBpbnN0YW5jZSBvZiB0aGF0IG5hbWUuICAqLwotc3RhdGljIGJvb2xlYW4gY291bnRlZF9uYW1lX21vZGUgPSAwOwotc3RhdGljIGludCBjb3VudGVkX25hbWVfY291bnRlciA9IDA7Ci0KLS8qIFdoZXRoZXIgdG8gdHJ1bmNhdGUgbmFtZXMgb2YgZmlsZXMgc3RvcmVkIGluIHRoZSBhcmNoaXZlLiAgKi8KLXN0YXRpYyBib29sZWFuIGFyX3RydW5jYXRlID0gZmFsc2U7Ci0KLS8qIFdoZXRoZXIgdG8gdXNlIGEgZnVsbCBmaWxlIG5hbWUgbWF0Y2ggd2hlbiBzZWFyY2hpbmcgYW4gYXJjaGl2ZS4KLSAgIFRoaXMgaXMgY29udmVuaWVudCBmb3IgYXJjaGl2ZXMgY3JlYXRlZCBieSB0aGUgTWljcm9zb2Z0IGxpYgotICAgcHJvZ3JhbS4gICovCi1zdGF0aWMgYm9vbGVhbiBmdWxsX3BhdGhuYW1lID0gZmFsc2U7Ci0KLWludCBpbnRlcmFjdGl2ZSA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1tcmlfZW11bCAoKQotewotICBpbnRlcmFjdGl2ZSA9IGlzYXR0eSAoZmlsZW5vIChzdGRpbikpOwotICB5eXBhcnNlICgpOwotfQotCi0vKiBJZiBDT1VOVCBpcyAwLCB0aGVuIEZVTkNUSU9OIGlzIGNhbGxlZCBvbmNlIG9uIGVhY2ggZW50cnkuICBJZiBub256ZXJvLAotICAgQ09VTlQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgRklMRVMgY2hhaW47IEZVTkNUSU9OIGlzIGNhbGxlZCBvbiBlYWNoIGVudHJ5Ci0gICB3aG9zZSBuYW1lIG1hdGNoZXMgb25lIGluIEZJTEVTLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIGZ1bmN0aW9uLCBmaWxlcywgY291bnQpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdm9pZCAoKmZ1bmN0aW9uKSBQQVJBTVMgKChiZmQgKikpOwotICAgICBjaGFyICoqZmlsZXM7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgYmZkICpoZWFkOwotICBpbnQgbWF0Y2hfY291bnQ7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgewotICAgICAgZm9yIChoZWFkID0gYXJjaC0+bmV4dDsgaGVhZDsgaGVhZCA9IGhlYWQtPm5leHQpCi0JewotCSAgUFJPR1JFU1MgKDEpOwotCSAgZnVuY3Rpb24gKGhlYWQpOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhpcyBtYXkgYXBwZWFyIHRvIGJlIGEgYmFyb3F1ZSB3YXkgb2YgYWNjb21wbGlzaGluZyB3aGF0IHdlIHdhbnQuCi0gICAgIEhvd2V2ZXIgd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGZpbGVuYW1lcyBpbiBvcmRlciB0byBub3RpY2Ugd2hlcmUKLSAgICAgYSBmaWxlbmFtZSBpcyByZXF1ZXN0ZWQgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhcmNoaXZlLiAgRGl0dG8KLSAgICAgbWFwcGluZyBvdmVyIGVhY2ggZmlsZSBlYWNoIHRpbWUgLS0gd2Ugd2FudCB0byBoYWNrIG11bHRpcGxlCi0gICAgIHJlZmVyZW5jZXMuICAqLwotCi0gIGZvciAoOyBjb3VudCA+IDA7IGZpbGVzKyssIGNvdW50LS0pCi0gICAgewotICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCi0gICAgICBtYXRjaF9jb3VudCA9IDA7Ci0gICAgICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkKLQl7Ci0JICBQUk9HUkVTUyAoMSk7Ci0JICBpZiAoaGVhZC0+ZmlsZW5hbWUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFNvbWUgYXJjaGl2ZSBmb3JtYXRzIGRvbid0IGdldCB0aGUgZmlsZW5hbWVzIGZpbGxlZCBpbgotCQkgdW50aWwgdGhlIGVsZW1lbnRzIGFyZSBvcGVuZWQuICAqLwotCSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLQkgICAgICBiZmRfc3RhdF9hcmNoX2VsdCAoaGVhZCwgJmJ1Zik7Ci0JICAgIH0KLQkgIGlmICgoaGVhZC0+ZmlsZW5hbWUgIT0gTlVMTCkgJiYKLQkgICAgICAoIXN0cmNtcCAobm9ybWFsaXplICgqZmlsZXMsIGFyY2gpLCBoZWFkLT5maWxlbmFtZSkpKQotCSAgICB7Ci0JICAgICAgKyttYXRjaF9jb3VudDsKLQkgICAgICBpZiAoY291bnRlZF9uYW1lX21vZGUKLQkJICAmJiBtYXRjaF9jb3VudCAhPSBjb3VudGVkX25hbWVfY291bnRlcikgCi0JCXsKLQkJICAvKiBDb3VudGluZywgYW5kIGRpZG4ndCBtYXRjaCBvbiBjb3VudDsgZ28gb24gdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBuZXh0IG9uZS4gICovCi0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgICBmdW5jdGlvbiAoaGVhZCk7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoIWZvdW5kKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZnByaW50ZiAoc3RkZXJyLCBfKCJubyBlbnRyeSAlcyBpbiBhcmNoaXZlXG4iKSwgKmZpbGVzKTsKLSAgICB9Ci19Ci0MCi1ib29sZWFuIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IGZhbHNlOwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKGhlbHApCi0gICAgIGludCBoZWxwOwotewotICBGSUxFICpzOwotCi0gIHMgPSBoZWxwID8gc3Rkb3V0IDogc3RkZXJyOwotICAKLSAgaWYgKCEgaXNfcmFubGliKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzLCBfKCJVc2FnZTogJXMgWy1de2RtcHFyc3R4fVthYmNmaWxOb1BzU3V2Vl0gW21lbWJlci1uYW1lXSBbY291bnRdIGFyY2hpdmUtZmlsZSBmaWxlLi4uXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzLCBfKCIgICAgICAgJXMgLU0gWzxtcmktc2NyaXB0XVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgY29tbWFuZHM6XG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIGQgICAgICAgICAgICAtIGRlbGV0ZSBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgbVthYl0gICAgICAgIC0gbW92ZSBmaWxlKHMpIGluIHRoZSBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIHAgICAgICAgICAgICAtIHByaW50IGZpbGUocykgZm91bmQgaW4gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgcVtmXSAgICAgICAgIC0gcXVpY2sgYXBwZW5kIGZpbGUocykgdG8gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgclthYl1bZl1bdV0gIC0gcmVwbGFjZSBleGlzdGluZyBvciBpbnNlcnQgbmV3IGZpbGUocykgaW50byB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICB0ICAgICAgICAgICAgLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgeFtvXSAgICAgICAgIC0gZXh0cmFjdCBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiBjb21tYW5kIHNwZWNpZmljIG1vZGlmaWVyczpcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW2FdICAgICAgICAgIC0gcHV0IGZpbGUocykgYWZ0ZXIgW21lbWJlci1uYW1lXVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbYl0gICAgICAgICAgLSBwdXQgZmlsZShzKSBiZWZvcmUgW21lbWJlci1uYW1lXSAoc2FtZSBhcyBbaV0pXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtOXSAgICAgICAgICAtIHVzZSBpbnN0YW5jZSBbY291bnRdIG9mIG5hbWVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW2ZdICAgICAgICAgIC0gdHJ1bmNhdGUgaW5zZXJ0ZWQgZmlsZSBuYW1lc1xuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbUF0gICAgICAgICAgLSB1c2UgZnVsbCBwYXRoIG5hbWVzIHdoZW4gbWF0Y2hpbmdcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW29dICAgICAgICAgIC0gcHJlc2VydmUgb3JpZ2luYWwgZGF0ZXNcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW3VdICAgICAgICAgIC0gb25seSByZXBsYWNlIGZpbGVzIHRoYXQgYXJlIG5ld2VyIHRoYW4gY3VycmVudCBhcmNoaXZlIGNvbnRlbnRzXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgZ2VuZXJpYyBtb2RpZmllcnM6XG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtjXSAgICAgICAgICAtIGRvIG5vdCB3YXJuIGlmIHRoZSBsaWJyYXJ5IGhhZCB0byBiZSBjcmVhdGVkXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtzXSAgICAgICAgICAtIGNyZWF0ZSBhbiBhcmNoaXZlIGluZGV4IChjZi4gcmFubGliKVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbU10gICAgICAgICAgLSBkbyBub3QgYnVpbGQgYSBzeW1ib2wgdGFibGVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW3ZdICAgICAgICAgIC0gYmUgdmVyYm9zZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbVl0gICAgICAgICAgLSBkaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlclxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZnByaW50ZiAocywgXygiVXNhZ2U6ICVzIFstdlZdIGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotCi0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RkZXJyKTsKLQotICBpZiAoaGVscCkKLSAgICBmcHJpbnRmIChzLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLQotICB4ZXhpdCAoaGVscCA/IDAgOiAxKTsKLX0KLQotLyogTm9ybWFsaXplIGEgZmlsZSBuYW1lIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIGludG8gYSBmaWxlCi0gICBuYW1lIHdoaWNoIHdlIHdpbGwgdXNlIGluIGFuIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgKGZpbGUsIGFiZmQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgaWYgKGZ1bGxfcGF0aG5hbWUpCi0gICAgcmV0dXJuIGZpbGU7Ci0KLSAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlLCAnLycpOwotICBpZiAoZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBmaWxlbmFtZSsrOwotICBlbHNlCi0gICAgZmlsZW5hbWUgPSBmaWxlOwotCi0gIGlmIChhcl90cnVuY2F0ZQotICAgICAgJiYgYWJmZCAhPSBOVUxMCi0gICAgICAmJiBzdHJsZW4gKGZpbGVuYW1lKSA+IGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIC8qIFNwYWNlIGxlYWsuICAqLwotICAgICAgcyA9IChjaGFyICopIHhtYWxsb2MgKGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuICsgMSk7Ci0gICAgICBtZW1jcHkgKHMsIGZpbGVuYW1lLCBhYmZkLT54dmVjLT5hcl9tYXhfbmFtZWxlbik7Ci0gICAgICBzW2FiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuXSA9ICdcMCc7Ci0gICAgICBmaWxlbmFtZSA9IHM7Ci0gICAgfQotCi0gIHJldHVybiBmaWxlbmFtZTsKLX0KLQotLyogUmVtb3ZlIGFueSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgb25seSBjYWxsZWQgdmlhIHhhdGV4aXQuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLXN0YXRpYyBGSUxFICpvdXRwdXRfZmlsZSA9IE5VTEw7Ci1zdGF0aWMgYmZkICpvdXRwdXRfYmZkID0gTlVMTDsKLQotc3RhdGljIHZvaWQKLXJlbW92ZV9vdXRwdXQgKCkKLXsKLSAgaWYgKG91dHB1dF9maWxlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwgJiYgb3V0cHV0X2JmZC0+aW9zdHJlYW0gIT0gTlVMTCkKLQlmY2xvc2UgKChGSUxFICopIChvdXRwdXRfYmZkLT5pb3N0cmVhbSkpOwotICAgICAgaWYgKG91dHB1dF9maWxlICE9IE5VTEwpCi0JZmNsb3NlIChvdXRwdXRfZmlsZSk7Ci0gICAgICB1bmxpbmsgKG91dHB1dF9maWxlbmFtZSk7Ci0gICAgfQotfQotCi0vKiBUaGUgb3B0aW9uIHBhcnNpbmcgc2hvdWxkIGJlIGluIGl0cyBvd24gZnVuY3Rpb24uCi0gICBJdCB3aWxsIGJlIHdoZW4gSSBoYXZlIGdldG9wdCB3b3JraW5nLiAgKi8KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKmFyZ19wdHI7Ci0gIGNoYXIgYzsKLSAgZW51bQotICAgIHsKLSAgICAgIG5vbmUgPSAwLCBkZWxldGUsIHJlcGxhY2UsIHByaW50X3RhYmxlLAotICAgICAgcHJpbnRfZmlsZXMsIGV4dHJhY3QsIG1vdmUsIHF1aWNrX2FwcGVuZAotICAgIH0gb3BlcmF0aW9uID0gbm9uZTsKLSAgaW50IGFyZ19pbmRleDsKLSAgY2hhciAqKmZpbGVzOwotICBpbnQgZmlsZV9jb3VudDsKLSAgY2hhciAqaW5hcmNoX2ZpbGVuYW1lOwotICBpbnQgc2hvd192ZXJzaW9uOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGlmIChpc19yYW5saWIgPCAwKQotICAgIHsKLSAgICAgIGNoYXIgKnRlbXA7Ci0KLSAgICAgIHRlbXAgPSBzdHJyY2hyIChwcm9ncmFtX25hbWUsICcvJyk7Ci0gICAgICBpZiAodGVtcCA9PSBOVUxMKQotCXRlbXAgPSBwcm9ncmFtX25hbWU7Ci0gICAgICBlbHNlCi0JKyt0ZW1wOwotICAgICAgaWYgKHN0cmxlbiAodGVtcCkgPj0gNgotCSAgJiYgc3RyY21wICh0ZW1wICsgc3RybGVuICh0ZW1wKSAtIDYsICJyYW5saWIiKSA9PSAwKQotCWlzX3JhbmxpYiA9IDE7Ci0gICAgICBlbHNlCi0JaXNfcmFubGliID0gMDsKLSAgICB9Ci0KLSAgaWYgKGFyZ2MgPiAxICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwKQotCXVzYWdlICgxKTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi0tdmVyc2lvbiIpID09IDApCi0JewotCSAgaWYgKGlzX3JhbmxpYikKLQkgICAgcHJpbnRfdmVyc2lvbiAoInJhbmxpYiIpOwotCSAgZWxzZQotCSAgICBwcmludF92ZXJzaW9uICgiYXIiKTsKLQl9Ci0gICAgfQotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHNob3dfdmVyc2lvbiA9IDA7Ci0KLSAgeGF0ZXhpdCAocmVtb3ZlX291dHB1dCk7Ci0KLSAgaWYgKGlzX3JhbmxpYikKLSAgICB7Ci0gICAgICBib29sZWFuIHRvdWNoID0gZmFsc2U7Ci0KLSAgICAgIGlmIChhcmdjIDwgMiB8fCBzdHJjbXAgKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwKQotCXVzYWdlICgwKTsKLSAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICItViIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJndlsxXSwgIi12IikgPT0gMAotCSAgfHwgc3RybmNtcCAoYXJndlsxXSwgIi0tdiIsIDMpID09IDApCi0JcHJpbnRfdmVyc2lvbiAoInJhbmxpYiIpOwotICAgICAgYXJnX2luZGV4ID0gMTsKLSAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICItdCIpID09IDApCi0JewotCSAgKythcmdfaW5kZXg7Ci0JICB0b3VjaCA9IHRydWU7Ci0JfQotICAgICAgd2hpbGUgKGFyZ19pbmRleCA8IGFyZ2MpCi0JewotCSAgaWYgKCEgdG91Y2gpCi0JICAgIHJhbmxpYl9vbmx5IChhcmd2W2FyZ19pbmRleF0pOwotCSAgZWxzZQotCSAgICByYW5saWJfdG91Y2ggKGFyZ3ZbYXJnX2luZGV4XSk7Ci0JICArK2FyZ19pbmRleDsKLQl9Ci0gICAgICB4ZXhpdCAoMCk7Ci0gICAgfQotCi0gIGlmIChhcmdjID09IDIgJiYgc3RyY21wIChhcmd2WzFdLCAiLU0iKSA9PSAwKQotICAgIHsKLSAgICAgIG1yaV9lbXVsICgpOwotICAgICAgeGV4aXQgKDApOwotICAgIH0KLQotICBpZiAoYXJnYyA8IDIpCi0gICAgdXNhZ2UgKDApOwotCi0gIGFyZ19wdHIgPSBhcmd2WzFdOwotCi0gIGlmICgqYXJnX3B0ciA9PSAnLScpCi0gICAgKythcmdfcHRyOwkJCS8qIGNvbXBhdGliaWxpdHkgKi8KLQotICB3aGlsZSAoKGMgPSAqYXJnX3B0cisrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnZCc6Ci0JY2FzZSAnbSc6Ci0JY2FzZSAncCc6Ci0JY2FzZSAncSc6Ci0JY2FzZSAncic6Ci0JY2FzZSAndCc6Ci0JY2FzZSAneCc6Ci0JICBpZiAob3BlcmF0aW9uICE9IG5vbmUpCi0JICAgIGZhdGFsIChfKCJ0d28gZGlmZmVyZW50IG9wZXJhdGlvbiBvcHRpb25zIHNwZWNpZmllZCIpKTsKLQkgIHN3aXRjaCAoYykKLQkgICAgewotCSAgICBjYXNlICdkJzoKLQkgICAgICBvcGVyYXRpb24gPSBkZWxldGU7Ci0JICAgICAgb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbSc6Ci0JICAgICAgb3BlcmF0aW9uID0gbW92ZTsKLQkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdwJzoKLQkgICAgICBvcGVyYXRpb24gPSBwcmludF9maWxlczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncSc6Ci0JICAgICAgb3BlcmF0aW9uID0gcXVpY2tfYXBwZW5kOwotCSAgICAgIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3InOgotCSAgICAgIG9wZXJhdGlvbiA9IHJlcGxhY2U7Ci0JICAgICAgb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAndCc6Ci0JICAgICAgb3BlcmF0aW9uID0gcHJpbnRfdGFibGU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3gnOgotCSAgICAgIG9wZXJhdGlvbiA9IGV4dHJhY3Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQljYXNlICdsJzoKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgc2lsZW50X2NyZWF0ZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdvJzoKLQkgIHByZXNlcnZlX2RhdGVzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgd3JpdGVfYXJtYXAgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JICB3cml0ZV9hcm1hcCA9IC0xOwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JICBuZXdlcl9vbmx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgdmVyYm9zZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIHBvc3R5cGUgPSBwb3NfYWZ0ZXI7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIHBvc3R5cGUgPSBwb3NfYmVmb3JlOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBwb3N0eXBlID0gcG9zX2JlZm9yZTsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgbXJpX21vZGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnTic6Ci0JICBjb3VudGVkX25hbWVfbW9kZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGFyX3RydW5jYXRlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgotCSAgZnVsbF9wYXRobmFtZSA9IHRydWU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGlsbGVnYWwgb3B0aW9uIC0tICVjXG4iKSwgcHJvZ3JhbV9uYW1lLCBjKTsKLQkgIHVzYWdlICgwKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoImFyIik7Ci0KLSAgaWYgKGFyZ2MgPCAzKQotICAgIHVzYWdlICgwKTsKLQotICBpZiAobXJpX21vZGUpCi0gICAgewotICAgICAgbXJpX2VtdWwgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkICphcmNoOwotCi0gICAgICAvKiBXZSBjYW4ndCB3cml0ZSBhbiBhcm1hcCB3aGVuIHVzaW5nIGFyIHEsIHNvIGp1c3QgZG8gYXIgcgotICAgICAgICAgaW5zdGVhZC4gICovCi0gICAgICBpZiAob3BlcmF0aW9uID09IHF1aWNrX2FwcGVuZCAmJiB3cml0ZV9hcm1hcCkKLQlvcGVyYXRpb24gPSByZXBsYWNlOwotCi0gICAgICBpZiAoKG9wZXJhdGlvbiA9PSBub25lIHx8IG9wZXJhdGlvbiA9PSBwcmludF90YWJsZSkKLQkgICYmIHdyaXRlX2FybWFwID09IDEpCi0JewotCSAgcmFubGliX29ubHkgKGFyZ3ZbMl0pOwotCSAgeGV4aXQgKDApOwotCX0KLQotICAgICAgaWYgKG9wZXJhdGlvbiA9PSBub25lKQotCWZhdGFsIChfKCJubyBvcGVyYXRpb24gc3BlY2lmaWVkIikpOwotCi0gICAgICBpZiAobmV3ZXJfb25seSAmJiBvcGVyYXRpb24gIT0gcmVwbGFjZSkKLQlmYXRhbCAoXygiYHUnIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSBgcicgb3B0aW9uLiIpKTsKLQotICAgICAgYXJnX2luZGV4ID0gMjsKLQotICAgICAgaWYgKHBvc3R5cGUgIT0gcG9zX2RlZmF1bHQpCi0JcG9zbmFtZSA9IGFyZ3ZbYXJnX2luZGV4KytdOwotCi0gICAgICBpZiAoY291bnRlZF9uYW1lX21vZGUpIAotCXsKLSAgICAgICAgICBpZiAob3BlcmF0aW9uICE9IGV4dHJhY3QgJiYgb3BlcmF0aW9uICE9IGRlbGV0ZSkgCi0JICAgICBmYXRhbCAoXygiYE4nIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSBgeCcgYW5kICdkJyBvcHRpb25zLiIpKTsKLQkgIGNvdW50ZWRfbmFtZV9jb3VudGVyID0gYXRvaSAoYXJndlthcmdfaW5kZXgrK10pOwotICAgICAgICAgIGlmIChjb3VudGVkX25hbWVfY291bnRlciA8PSAwKQotCSAgICBmYXRhbCAoXygiVmFsdWUgZm9yIGBOJyBtdXN0IGJlIHBvc2l0aXZlLiIpKTsKLQl9Ci0KLSAgICAgIGluYXJjaF9maWxlbmFtZSA9IGFyZ3ZbYXJnX2luZGV4KytdOwotCi0gICAgICBmaWxlcyA9IGFyZ19pbmRleCA8IGFyZ2MgPyBhcmd2ICsgYXJnX2luZGV4IDogTlVMTDsKLSAgICAgIGZpbGVfY291bnQgPSBhcmdjIC0gYXJnX2luZGV4OwotCi0jaWYgMAotICAgICAgLyogV2UgZG9uJ3QgdXNlIGRvX3F1aWNrX2FwcGVuZCBhbnkgbW9yZS4gIFRvbyBtYW55IHN5c3RlbXMKLSAgICAgICAgIGV4cGVjdCBhciB0byBhbHdheXMgcmVidWlsZCB0aGUgc3ltYm9sIHRhYmxlIGV2ZW4gd2hlbiBxIGlzCi0gICAgICAgICB1c2VkLiAgKi8KLQotICAgICAgLyogV2UgY2FuJ3QgZG8gYSBxdWljayBhcHBlbmQgaWYgd2UgbmVlZCB0byBjb25zdHJ1Y3QgYW4KLQkgZXh0ZW5kZWQgbmFtZSB0YWJsZSwgYmVjYXVzZSBkb19xdWlja19hcHBlbmQgd29uJ3QgYmUgYWJsZSB0bwotCSByZWJ1aWxkIHRoZSBuYW1lIHRhYmxlLiAgVW5mb3J0dW5hdGVseSwgYXQgdGhpcyBwb2ludCB3ZQotCSBkb24ndCBhY3R1YWxseSBrbm93IHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoIHBlcm1pdHRlZCBieSB0aGlzCi0JIG9iamVjdCBmaWxlIGZvcm1hdC4gIFNvLCB3ZSBndWVzcy4gIEZJWE1FLiAgKi8KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kICYmICEgYXJfdHJ1bmNhdGUpCi0JewotCSAgY2hhciAqKmNoazsKLQotCSAgZm9yIChjaGsgPSBmaWxlczsgY2hrICE9IE5VTEwgJiYgKmNoayAhPSAnXDAnOyBjaGsrKykKLQkgICAgewotCSAgICAgIGlmIChzdHJsZW4gKG5vcm1hbGl6ZSAoKmNoaywgKGJmZCAqKSBOVUxMKSkgPiAxNCkKLQkJewotCQkgIG9wZXJhdGlvbiA9IHJlcGxhY2U7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKG9wZXJhdGlvbiA9PSBxdWlja19hcHBlbmQpCi0JewotCSAgLyogTm90ZSB0aGF0IHF1aWNrIGFwcGVuZGluZyB0byBhIG5vbi1leGlzdGVudCBhcmNoaXZlIGNyZWF0ZXMgaXQsCi0JICAgICBldmVuIGlmIHRoZXJlIGFyZSBubyBmaWxlcyB0byBhcHBlbmQuICovCi0JICBkb19xdWlja19hcHBlbmQgKGluYXJjaF9maWxlbmFtZSwgZmlsZXMpOwotCSAgeGV4aXQgKDApOwotCX0KLSNlbmRpZgotCi0gICAgICBhcmNoID0gb3Blbl9pbmFyY2ggKGluYXJjaF9maWxlbmFtZSwKLQkJCSAgZmlsZXMgPT0gTlVMTCA/IChjaGFyICopIE5VTEwgOiBmaWxlc1swXSk7Ci0KLSAgICAgIHN3aXRjaCAob3BlcmF0aW9uKQotCXsKLQljYXNlIHByaW50X3RhYmxlOgotCSAgbWFwX292ZXJfbWVtYmVycyAoYXJjaCwgcHJpbnRfZGVzY3IsIGZpbGVzLCBmaWxlX2NvdW50KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBwcmludF9maWxlczoKLQkgIG1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIHByaW50X2NvbnRlbnRzLCBmaWxlcywgZmlsZV9jb3VudCk7Ci0JICBicmVhazsKLQotCWNhc2UgZXh0cmFjdDoKLQkgIG1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIGV4dHJhY3RfZmlsZSwgZmlsZXMsIGZpbGVfY291bnQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGRlbGV0ZToKLQkgIGlmIChmaWxlcyAhPSBOVUxMKQotCSAgICBkZWxldGVfbWVtYmVycyAoYXJjaCwgZmlsZXMpOwotCSAgZWxzZQotCSAgICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIG1vdmU6Ci0JICBpZiAoZmlsZXMgIT0gTlVMTCkKLQkgICAgbW92ZV9tZW1iZXJzIChhcmNoLCBmaWxlcyk7Ci0JICBlbHNlCi0JICAgIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgcmVwbGFjZToKLQljYXNlIHF1aWNrX2FwcGVuZDoKLQkgIGlmIChmaWxlcyAhPSBOVUxMIHx8IHdyaXRlX2FybWFwID4gMCkKLQkgICAgcmVwbGFjZV9tZW1iZXJzIChhcmNoLCBmaWxlcywgb3BlcmF0aW9uID09IHF1aWNrX2FwcGVuZCk7Ci0JICBlbHNlCi0JICAgIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0JICBicmVhazsKLQotCSAgLyogU2hvdWxkbid0IGhhcHBlbiEgKi8KLQlkZWZhdWx0OgotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGludGVybmFsIGVycm9yIC0tIHRoaXMgb3B0aW9uIG5vdCBpbXBsZW1lbnRlZFxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSk7Ci0JICB4ZXhpdCAoMSk7Ci0JfQotICAgIH0KLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgeGV4aXQgKDApOwotICByZXR1cm4gMDsKLX0KLQotYmZkICoKLW9wZW5faW5hcmNoIChhcmNoaXZlX2ZpbGVuYW1lLCBmaWxlKQotICAgICBjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotewotICBjb25zdCBjaGFyICp0YXJnZXQ7Ci0gIGJmZCAqKmxhc3Rfb25lOwotICBiZmQgKm5leHRfb25lOwotICBzdHJ1Y3Qgc3RhdCBzYnVmOwotICBiZmQgKmFyY2g7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotCi0gIHRhcmdldCA9IE5VTEw7Ci0KLSAgaWYgKHN0YXQgKGFyY2hpdmVfZmlsZW5hbWUsICZzYnVmKSAhPSAwKQotICAgIHsKLSNpZm5kZWYgX19HTzMyX18KLQotLyogS0xVREdFIEFMRVJUISBUZW1wb3JhcnkgZml4IHVudGlsIEkgZmlnZ2VyIHdoeQotICogc3RhdCgpIGlzIHdyb25nIC4uLiB0aGluayBpdCdzIGJ1cmllZCBpbiBHTzMyJ3MgSURUCi0gKiAtIEpheAotICovCi0gICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQotCWJmZF9mYXRhbCAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKCFvcGVyYXRpb25fYWx0ZXJzX2FyY2gpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0JICBwZXJyb3IgKGFyY2hpdmVfZmlsZW5hbWUpOwotCSAgbWF5YmVxdWl0ICgpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gZmlndXJlIG91dCB0aGUgdGFyZ2V0IHRvIHVzZSBmb3IgdGhlIGFyY2hpdmUgZnJvbSB0aGUKLSAgICAgICAgIGZpcnN0IG9iamVjdCBvbiB0aGUgbGlzdC4gICovCi0gICAgICBpZiAoZmlsZSAhPSBOVUxMKQotCXsKLQkgIGJmZCAqb2JqOwotCi0JICBvYmogPSBiZmRfb3BlbnIgKGZpbGUsIE5VTEwpOwotCSAgaWYgKG9iaiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKG9iaiwgYmZkX29iamVjdCkpCi0JCXRhcmdldCA9IGJmZF9nZXRfdGFyZ2V0IChvYmopOwotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKG9iaik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhbiBlbXB0eSBhcmNoaXZlLiAgKi8KLSAgICAgIGFyY2ggPSBiZmRfb3BlbncgKGFyY2hpdmVfZmlsZW5hbWUsIHRhcmdldCk7Ci0gICAgICBpZiAoYXJjaCA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfZm9ybWF0IChhcmNoLCBiZmRfYXJjaGl2ZSkKLQkgIHx8ICEgYmZkX2Nsb3NlIChhcmNoKSkKLQliZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotCi0gICAgICAvKiBJZiB3ZSBkaWUgY3JlYXRpbmcgYSBuZXcgYXJjaGl2ZSwgZG9uJ3QgbGVhdmUgaXQgYXJvdW5kLiAgKi8KLSAgICAgIG91dHB1dF9maWxlbmFtZSA9IGFyY2hpdmVfZmlsZW5hbWU7Ci0gICAgfQotCi0gIGFyY2ggPSBiZmRfb3BlbnIgKGFyY2hpdmVfZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChhcmNoID09IE5VTEwpCi0gICAgewotICAgIGJsb3NlcjoKLSAgICAgIGJmZF9mYXRhbCAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0gICAgfQotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYXJjaCwgYmZkX2FyY2hpdmUsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBsYXN0X29uZSA9ICYoYXJjaC0+bmV4dCk7Ci0gIC8qIFJlYWQgYWxsIHRoZSBjb250ZW50cyByaWdodCBhd2F5LCByZWdhcmRsZXNzLiAgKi8KLSAgZm9yIChuZXh0X29uZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2gsIE5VTEwpOwotICAgICAgIG5leHRfb25lOwotICAgICAgIG5leHRfb25lID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgbmV4dF9vbmUpKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgICpsYXN0X29uZSA9IG5leHRfb25lOwotICAgICAgbGFzdF9vbmUgPSAmbmV4dF9vbmUtPm5leHQ7Ci0gICAgfQotICAqbGFzdF9vbmUgPSAoYmZkICopIE5VTEw7Ci0gIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotICAgIGdvdG8gYmxvc2VyOwotICByZXR1cm4gYXJjaDsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBuY29waWVkID0gMDsKLSAgY2hhciAqY2J1ZiA9IHhtYWxsb2MgKEJVRlNJWkUpOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gIGxvbmcgc2l6ZTsKLSAgaWYgKGJmZF9zdGF0X2FyY2hfZWx0IChhYmZkLCAmYnVmKSAhPSAwKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oImludGVybmFsIHN0YXQgZXJyb3Igb24gJXMiKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGlmICh2ZXJib3NlKQotICAgIHByaW50ZiAoIlxuPCVzPlxuXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKTsKLQotICBzaXplID0gYnVmLnN0X3NpemU7Ci0gIHdoaWxlIChuY29waWVkIDwgc2l6ZSkKLSAgICB7Ci0KLSAgICAgIGludCBucmVhZDsKLSAgICAgIGludCB0b2NvcHkgPSBzaXplIC0gbmNvcGllZDsKLSAgICAgIGlmICh0b2NvcHkgPiBCVUZTSVpFKQotCXRvY29weSA9IEJVRlNJWkU7Ci0KLSAgICAgIG5yZWFkID0gYmZkX3JlYWQgKGNidWYsIDEsIHRvY29weSwgYWJmZCk7CS8qIG9vcHMgLS0gYnJva2UKLQkJCQkJCQkgICBhYnN0cmFjdGlvbiEgICovCi0gICAgICBpZiAobnJlYWQgIT0gdG9jb3B5KQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZmF0YWwgKF8oIiVzIGlzIG5vdCBhIHZhbGlkIGFyY2hpdmUiKSwKLQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGFiZmQpKSk7Ci0gICAgICBmd3JpdGUgKGNidWYsIDEsIG5yZWFkLCBzdGRvdXQpOwotICAgICAgbmNvcGllZCArPSB0b2NvcHk7Ci0gICAgfQotICBmcmVlIChjYnVmKTsKLX0KLQotLyogRXh0cmFjdCBhIG1lbWJlciBvZiB0aGUgYXJjaGl2ZSBpbnRvIGl0cyBvd24gZmlsZS4KLQotICAgV2UgZGVmZXIgb3BlbmluZyB0aGUgbmV3IGZpbGUgdW50aWwgYWZ0ZXIgd2UgaGF2ZSByZWFkIGEgQlVGU0laIGNodW5rIG9mIHRoZQotICAgb2xkIG9uZSwgc2luY2Ugd2Uga25vdyB3ZSBoYXZlIGp1c3QgcmVhZCB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIHRoZSBvbGQKLSAgIG9uZS4gIFNpbmNlIG1vc3QgbWVtYmVycyBhcmUgc2hvcnRlciB0aGFuIEJVRlNJWiwgdGhpcyBtZWFucyB3ZSB3aWxsIHJlYWQKLSAgIHRoZSBvbGQgaGVhZGVyLCByZWFkIHRoZSBvbGQgZGF0YSwgd3JpdGUgYSBuZXcgaW5vZGUgZm9yIHRoZSBuZXcgZmlsZSwgYW5kCi0gICB3cml0ZSB0aGUgbmV3IGRhdGEsIGFuZCBiZSBkb25lLiBUaGlzICdvcHRpbWl6YXRpb24nIGlzIHdoYXQgY29tZXMgZnJvbQotICAgc2l0dGluZyBuZXh0IHRvIGEgYmFyZSBkaXNrIGFuZCBoZWFyaW5nIGl0IGV2ZXJ5IHRpbWUgaXQgc2Vla3MuICAtLSBHbnUKLSAgIEdpbG1vcmUgICovCi0KLXZvaWQKLWV4dHJhY3RfZmlsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBGSUxFICpvc3RyZWFtOwotICBjaGFyICpjYnVmID0geG1hbGxvYyAoQlVGU0laRSk7Ci0gIGludCBucmVhZCwgdG9jb3B5OwotICBsb25nIG5jb3BpZWQgPSAwOwotICBsb25nIHNpemU7Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgCi0gIGlmIChiZmRfc3RhdF9hcmNoX2VsdCAoYWJmZCwgJmJ1ZikgIT0gMCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgc2l6ZSA9IGJ1Zi5zdF9zaXplOwotCi0gIGlmIChzaXplIDwgMCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJzdGF0IHJldHVybnMgbmVnYXRpdmUgc2l6ZSBmb3IgJXMiKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAKLSAgaWYgKHZlcmJvc2UpCi0gICAgcHJpbnRmICgieCAtICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKTsKLQotICBvc3RyZWFtID0gTlVMTDsKLSAgaWYgKHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBTZWVtcyBsaWtlIGFuIGFic3RyYWN0aW9uIHZpb2xhdGlvbiwgZWg/ICBXZWxsIGl0J3MgT0shICovCi0gICAgICBvdXRwdXRfZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLQotICAgICAgb3N0cmVhbSA9IGZvcGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgRk9QRU5fV0IpOwotICAgICAgaWYgKG9zdHJlYW0gPT0gTlVMTCkKLQl7Ci0JICBwZXJyb3IgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIHhleGl0ICgxKTsKLQl9Ci0KLSAgICAgIG91dHB1dF9maWxlID0gb3N0cmVhbTsKLSAgICB9Ci0gIGVsc2UKLSAgICB3aGlsZSAobmNvcGllZCA8IHNpemUpCi0gICAgICB7Ci0JdG9jb3B5ID0gc2l6ZSAtIG5jb3BpZWQ7Ci0JaWYgKHRvY29weSA+IEJVRlNJWkUpCi0JICB0b2NvcHkgPSBCVUZTSVpFOwotCi0JbnJlYWQgPSBiZmRfcmVhZCAoY2J1ZiwgMSwgdG9jb3B5LCBhYmZkKTsKLQlpZiAobnJlYWQgIT0gdG9jb3B5KQotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGZhdGFsIChfKCIlcyBpcyBub3QgYSB2YWxpZCBhcmNoaXZlIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKTsKLQotCS8qIFNlZSBjb21tZW50IGFib3ZlOyB0aGlzIHNhdmVzIGRpc2sgYXJtIG1vdGlvbiAqLwotCWlmIChvc3RyZWFtID09IE5VTEwpCi0JICB7Ci0JICAgIC8qIFNlZW1zIGxpa2UgYW4gYWJzdHJhY3Rpb24gdmlvbGF0aW9uLCBlaD8gIFdlbGwgaXQncyBPSyEgKi8KLQkgICAgb3V0cHV0X2ZpbGVuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0KLQkgICAgb3N0cmVhbSA9IGZvcGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgRk9QRU5fV0IpOwotCSAgICBpZiAob3N0cmVhbSA9PSBOVUxMKQotCSAgICAgIHsKLQkJcGVycm9yIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JCXhleGl0ICgxKTsKLQkgICAgICB9Ci0KLQkgICAgb3V0cHV0X2ZpbGUgPSBvc3RyZWFtOwotCSAgfQotCWZ3cml0ZSAoY2J1ZiwgMSwgbnJlYWQsIG9zdHJlYW0pOwotCW5jb3BpZWQgKz0gdG9jb3B5OwotICAgICAgfQotCi0gIGlmIChvc3RyZWFtICE9IE5VTEwpCi0gICAgZmNsb3NlIChvc3RyZWFtKTsKLQotICBvdXRwdXRfZmlsZSA9IE5VTEw7Ci0gIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0KLSAgY2htb2QgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBidWYuc3RfbW9kZSk7Ci0KLSAgaWYgKHByZXNlcnZlX2RhdGVzKQotICAgIHNldF90aW1lcyAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICZidWYpOwotCi0gIGZyZWUgKGNidWYpOwotfQotCi0jaWYgMAotCi0vKiBXZSBkb24ndCB1c2UgdGhpcyBhbnltb3JlLiAgVG9vIG1hbnkgc3lzdGVtcyBleHBlY3QgYXIgdG8gcmVidWlsZAotICAgdGhlIHN5bWJvbCB0YWJsZSBldmVuIHdoZW4gcSBpcyB1c2VkLiAgKi8KLQotLyogSnVzdCBkbyBpdCBxdWlja2x5OyBkb24ndCB3b3JyeSBhYm91dCBkdXBzLCBhcm1hcCwgb3IgYW55dGhpbmcgbGlrZSB0aGF0ICovCi0KLXN0YXRpYyB2b2lkCi1kb19xdWlja19hcHBlbmQgKGFyY2hpdmVfZmlsZW5hbWUsIGZpbGVzX3RvX2FwcGVuZCkKLSAgICAgY29uc3QgY2hhciAqYXJjaGl2ZV9maWxlbmFtZTsKLSAgICAgY2hhciAqKmZpbGVzX3RvX2FwcGVuZDsKLXsKLSAgRklMRSAqb2ZpbGUsICppZmlsZTsKLSAgY2hhciAqYnVmID0geG1hbGxvYyAoQlVGU0laRSk7Ci0gIGxvbmcgdG9jb3B5LCB0aGlzdGltZTsKLSAgYmZkICp0ZW1wOwotICBzdHJ1Y3Qgc3RhdCBzYnVmOwotICBib29sZWFuIG5ld2ZpbGUgPSBmYWxzZTsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotICBpZiAoc3RhdCAoYXJjaGl2ZV9maWxlbmFtZSwgJnNidWYpICE9IDApCi0gICAgewotCi0jaWZuZGVmIF9fR08zMl9fCi0KLS8qIEtMVURHRSBBTEVSVCEgVGVtcG9yYXJ5IGZpeCB1bnRpbCBJIGZpZ2dlciB3aHkKLSAqIHN0YXQoKSBpcyB3cm9uZyAuLi4gdGhpbmsgaXQncyBidXJpZWQgaW4gR08zMidzIElEVAotICogLSBKYXgKLSAqLwotCi0gICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQotCWJmZF9mYXRhbCAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0jZW5kaWYKLQotICAgICAgbmV3ZmlsZSA9IHRydWU7Ci0gICAgfQotCi0gIG9maWxlID0gZm9wZW4gKGFyY2hpdmVfZmlsZW5hbWUsIEZPUEVOX0FVQik7Ci0gIGlmIChvZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHBlcnJvciAocHJvZ3JhbV9uYW1lKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgdGVtcCA9IGJmZF9vcGVuciAoYXJjaGl2ZV9maWxlbmFtZSwgTlVMTCk7Ci0gIGlmICh0ZW1wID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0gIGlmIChuZXdmaWxlID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0ICh0ZW1wLCBiZmRfYXJjaGl2ZSkgIT0gdHJ1ZSkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCWZhdGFsIChfKCIlcyBpcyBub3QgYW4gYXJjaGl2ZSIpLCBhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmd3JpdGUgKEFSTUFHLCAxLCBTQVJNQUcsIG9maWxlKTsKLSAgICAgIGlmICghc2lsZW50X2NyZWF0ZSkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNyZWF0aW5nICVzXG4iKSwKLQkJIHByb2dyYW1fbmFtZSwgYXJjaGl2ZV9maWxlbmFtZSk7Ci0gICAgfQotCi0gIGlmIChhcl90cnVuY2F0ZSkKLSAgICB0ZW1wLT5mbGFncyB8PSBCRkRfVFJBRElUSU9OQUxfRk9STUFUOwotCi0gIC8qIGFzc3VtZSBpdCdzIGFuIGFjaGl2ZSwgZ28gc3RyYWlnaHQgdG8gdGhlIGVuZCwgc2FucyAkMjAwICovCi0gIGZzZWVrIChvZmlsZSwgMCwgMik7Ci0KLSAgZm9yICg7IGZpbGVzX3RvX2FwcGVuZCAmJiAqZmlsZXNfdG9fYXBwZW5kOyArK2ZpbGVzX3RvX2FwcGVuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSBiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSAodGVtcCwgKmZpbGVzX3RvX2FwcGVuZCk7Ci0gICAgICBpZiAoaGRyID09IE5VTEwpCi0JewotCSAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fYXBwZW5kKTsKLQl9Ci0KLSAgICAgIEJGRF9TRU5EICh0ZW1wLCBfYmZkX3RydW5jYXRlX2FybmFtZSwgKHRlbXAsICpmaWxlc190b19hcHBlbmQsIChjaGFyICopIGhkcikpOwotCi0gICAgICBpZmlsZSA9IGZvcGVuICgqZmlsZXNfdG9fYXBwZW5kLCBGT1BFTl9SQik7Ci0gICAgICBpZiAoaWZpbGUgPT0gTlVMTCkKLQl7Ci0JICBiZmRfbm9uZmF0YWwgKCpmaWxlc190b19hcHBlbmQpOwotCX0KLQotICAgICAgaWYgKHN0YXQgKCpmaWxlc190b19hcHBlbmQsICZzYnVmKSAhPSAwKQotCXsKLQkgIGJmZF9ub25mYXRhbCAoKmZpbGVzX3RvX2FwcGVuZCk7Ci0JfQotCi0gICAgICB0b2NvcHkgPSBzYnVmLnN0X3NpemU7Ci0KLSAgICAgIC8qIFhYWCBzaG91bGQgZG8gZXJyb3ItY2hlY2tpbmchICovCi0gICAgICBmd3JpdGUgKGhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgb2ZpbGUpOwotCi0gICAgICB3aGlsZSAodG9jb3B5ID4gMCkKLQl7Ci0JICB0aGlzdGltZSA9IHRvY29weTsKLQkgIGlmICh0aGlzdGltZSA+IEJVRlNJWkUpCi0JICAgIHRoaXN0aW1lID0gQlVGU0laRTsKLQkgIGZyZWFkIChidWYsIDEsIHRoaXN0aW1lLCBpZmlsZSk7Ci0JICBmd3JpdGUgKGJ1ZiwgMSwgdGhpc3RpbWUsIG9maWxlKTsKLQkgIHRvY29weSAtPSB0aGlzdGltZTsKLQl9Ci0gICAgICBmY2xvc2UgKGlmaWxlKTsKLSAgICAgIGlmICgoc2J1Zi5zdF9zaXplICUgMikgPT0gMSkKLQlwdXRjICgnXDAxMicsIG9maWxlKTsKLSAgICB9Ci0gIGZjbG9zZSAob2ZpbGUpOwotICBiZmRfY2xvc2UgKHRlbXApOwotICBmcmVlIChidWYpOwotfQotCi0jZW5kaWYgLyogMCAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfYXJjaGl2ZSAoaWFyY2gpCi0gICAgIGJmZCAqaWFyY2g7Ci17Ci0gIGJmZCAqb2JmZDsKLSAgY2hhciAqb2xkX25hbWUsICpuZXdfbmFtZTsKLSAgYmZkICpjb250ZW50c19oZWFkID0gaWFyY2gtPm5leHQ7Ci0KLSAgb2xkX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGlhcmNoKSkgKyAxKTsKLSAgc3RyY3B5IChvbGRfbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoaWFyY2gpKTsKLSAgbmV3X25hbWUgPSBtYWtlX3RlbXBuYW1lIChvbGRfbmFtZSk7Ci0KLSAgb3V0cHV0X2ZpbGVuYW1lID0gbmV3X25hbWU7Ci0KLSAgb2JmZCA9IGJmZF9vcGVudyAobmV3X25hbWUsIGJmZF9nZXRfdGFyZ2V0IChpYXJjaCkpOwotCi0gIGlmIChvYmZkID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChvbGRfbmFtZSk7Ci0KLSAgb3V0cHV0X2JmZCA9IG9iZmQ7Ci0KLSAgYmZkX3NldF9mb3JtYXQgKG9iZmQsIGJmZF9hcmNoaXZlKTsKLQotICAvKiBSZXF1ZXN0IHdyaXRpbmcgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIHVubGVzcyB3ZSd2ZQotICAgICBiZWVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIG5vdCB0by4gICovCi0gIG9iZmQtPmhhc19hcm1hcCA9IHdyaXRlX2FybWFwID49IDA7Ci0KLSAgaWYgKGFyX3RydW5jYXRlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgc2hvdWxkIHJlYWxseSB1c2UgYmZkX3NldF9maWxlX2ZsYWdzLCBidXQgdGhhdCByZWplY3RzCi0gICAgICAgICBhcmNoaXZlcy4gICovCi0gICAgICBvYmZkLT5mbGFncyB8PSBCRkRfVFJBRElUSU9OQUxfRk9STUFUOwotICAgIH0KLQotICBpZiAoYmZkX3NldF9hcmNoaXZlX2hlYWQgKG9iZmQsIGNvbnRlbnRzX2hlYWQpICE9IHRydWUpCi0gICAgYmZkX2ZhdGFsIChvbGRfbmFtZSk7Ci0KLSAgaWYgKCFiZmRfY2xvc2UgKG9iZmQpKQotICAgIGJmZF9mYXRhbCAob2xkX25hbWUpOwotCi0gIG91dHB1dF9iZmQgPSBOVUxMOwotICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotCi0gIC8qIFdlIGRvbid0IGNhcmUgaWYgdGhpcyBmYWlsczsgd2UgbWlnaHQgYmUgY3JlYXRpbmcgdGhlIGFyY2hpdmUuICAqLwotICBiZmRfY2xvc2UgKGlhcmNoKTsKLQotICBpZiAoc21hcnRfcmVuYW1lIChuZXdfbmFtZSwgb2xkX25hbWUsIDApICE9IDApCi0gICAgeGV4aXQgKDEpOwotfQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBlbnRyeSB3aGljaCBzaG91bGQgYmUgcnBsYWNkJ2QKLSAgIGludG8gd2hlbiBhbHRlcmluZy4gIERFRkFVTFRfUE9TIHNob3VsZCBiZSBob3cgdG8gaW50ZXJwcmV0IHBvc19kZWZhdWx0LAotICAgYW5kIHNob3VsZCBiZSBhIHBvcyB2YWx1ZS4gICovCi0KLXN0YXRpYyBiZmQgKioKLWdldF9wb3NfYmZkIChjb250ZW50cywgZGVmYXVsdF9wb3MsIGRlZmF1bHRfcG9zbmFtZSkKLSAgICAgYmZkICoqY29udGVudHM7Ci0gICAgIGVudW0gcG9zIGRlZmF1bHRfcG9zOwotICAgICBjb25zdCBjaGFyICpkZWZhdWx0X3Bvc25hbWU7Ci17Ci0gIGJmZCAqKmFmdGVyX2JmZCA9IGNvbnRlbnRzOwotICBlbnVtIHBvcyByZWFscG9zOwotICBjb25zdCBjaGFyICpyZWFscG9zbmFtZTsKLQotICBpZiAocG9zdHlwZSA9PSBwb3NfZGVmYXVsdCkKLSAgICB7Ci0gICAgICByZWFscG9zID0gZGVmYXVsdF9wb3M7Ci0gICAgICByZWFscG9zbmFtZSA9IGRlZmF1bHRfcG9zbmFtZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWFscG9zID0gcG9zdHlwZTsKLSAgICAgIHJlYWxwb3NuYW1lID0gcG9zbmFtZTsKLSAgICB9Ci0KLSAgaWYgKHJlYWxwb3MgPT0gcG9zX2VuZCkKLSAgICB7Ci0gICAgICB3aGlsZSAoKmFmdGVyX2JmZCkKLQlhZnRlcl9iZmQgPSAmKCgqYWZ0ZXJfYmZkKS0+bmV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yICg7ICphZnRlcl9iZmQ7IGFmdGVyX2JmZCA9ICYoKmFmdGVyX2JmZCktPm5leHQpCi0JaWYgKHN0cmNtcCAoKCphZnRlcl9iZmQpLT5maWxlbmFtZSwgcmVhbHBvc25hbWUpID09IDApCi0JICB7Ci0JICAgIGlmIChyZWFscG9zID09IHBvc19hZnRlcikKLQkgICAgICBhZnRlcl9iZmQgPSAmKCphZnRlcl9iZmQpLT5uZXh0OwotCSAgICBicmVhazsKLQkgIH0KLSAgICB9Ci0gIHJldHVybiBhZnRlcl9iZmQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWxldGVfbWVtYmVycyAoYXJjaCwgZmlsZXNfdG9fZGVsZXRlKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGNoYXIgKipmaWxlc190b19kZWxldGU7Ci17Ci0gIGJmZCAqKmN1cnJlbnRfcHRyX3B0cjsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgYm9vbGVhbiBzb21ldGhpbmdfY2hhbmdlZCA9IGZhbHNlOwotICBpbnQgbWF0Y2hfY291bnQ7Ci0KLSAgZm9yICg7ICpmaWxlc190b19kZWxldGUgIT0gTlVMTDsgKytmaWxlc190b19kZWxldGUpCi0gICAgewotICAgICAgLyogSW4gYS5vdXQgc3lzdGVtcywgdGhlIGFybWFwIGlzIG9wdGlvbmFsLiAgSXQncyBhbHNvIGNhbGxlZAotCSBfXy5TWU1ERUYuICBTbyBpZiB0aGUgdXNlciBhc2tlZCB0byBkZWxldGUgaXQsIHdlIHNob3VsZCByZW1lbWJlcgotCSB0aGF0IGZhY3QuIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQgZm9yIENPRkYgc3lzdGVtcyAod2hlcmUKLQkgX18uU1lNREVGIG1pZ2h0IGJlIHJlZ3VsYXIgbWVtYmVyKSwgYnV0IGl0J3MgdmVyeSB1bmxpa2VseQotCSB0byBiZSBhIHByb2JsZW0uICBGSVhNRSAqLwotCi0gICAgICBpZiAoIXN0cmNtcCAoKmZpbGVzX3RvX2RlbGV0ZSwgIl9fLlNZTURFRiIpKQotCXsKLQkgIGFyY2gtPmhhc19hcm1hcCA9IGZhbHNlOwotCSAgd3JpdGVfYXJtYXAgPSAtMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgIG1hdGNoX2NvdW50ID0gMDsKLSAgICAgIGN1cnJlbnRfcHRyX3B0ciA9ICYoYXJjaC0+bmV4dCk7Ci0gICAgICB3aGlsZSAoKmN1cnJlbnRfcHRyX3B0cikKLQl7Ci0JICBpZiAoc3RyY21wIChub3JtYWxpemUgKCpmaWxlc190b19kZWxldGUsIGFyY2gpLAotCQkgICAgICAoKmN1cnJlbnRfcHRyX3B0ciktPmZpbGVuYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgKyttYXRjaF9jb3VudDsKLQkgICAgICBpZiAoY291bnRlZF9uYW1lX21vZGUKLQkJICAmJiBtYXRjaF9jb3VudCAhPSBjb3VudGVkX25hbWVfY291bnRlcikgCi0JCXsKLQkJICAvKiBDb3VudGluZywgYW5kIGRpZG4ndCBtYXRjaCBvbiBjb3VudDsgZ28gb24gdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBuZXh0IG9uZS4gICovCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmb3VuZCA9IHRydWU7Ci0JCSAgc29tZXRoaW5nX2NoYW5nZWQgPSB0cnVlOwotCQkgIGlmICh2ZXJib3NlKQotCQkgICAgcHJpbnRmICgiZCAtICVzXG4iLAotCQkJICAgICpmaWxlc190b19kZWxldGUpOwotCQkgICpjdXJyZW50X3B0cl9wdHIgPSAoKCpjdXJyZW50X3B0cl9wdHIpLT5uZXh0KTsKLQkJICBnb3RvIG5leHRfZmlsZTsKLQkJfQotCSAgICB9Ci0KLQkgIGN1cnJlbnRfcHRyX3B0ciA9ICYoKCpjdXJyZW50X3B0cl9wdHIpLT5uZXh0KTsKLQl9Ci0KLSAgICAgIGlmICh2ZXJib3NlICYmIGZvdW5kID09IGZhbHNlKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBwcmludGYgKF8oIk5vIG1lbWJlciBuYW1lZCBgJXMnXG4iKSwgKmZpbGVzX3RvX2RlbGV0ZSk7Ci0JfQotICAgIG5leHRfZmlsZToKLSAgICAgIDsKLSAgICB9Ci0KLSAgaWYgKHNvbWV0aGluZ19jaGFuZ2VkID09IHRydWUpCi0gICAgd3JpdGVfYXJjaGl2ZSAoYXJjaCk7Ci0gIGVsc2UKLSAgICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotfQotCi0KLS8qIFJlcG9zaXRpb24gZXhpc3RpbmcgbWVtYmVycyB3aXRoaW4gYW4gYXJjaGl2ZSAqLwotCi1zdGF0aWMgdm9pZAotbW92ZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19tb3ZlKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGNoYXIgKipmaWxlc190b19tb3ZlOwotewotICBiZmQgKiphZnRlcl9iZmQ7CQkvKiBOZXcgZW50cmllcyBnbyBhZnRlciB0aGlzIG9uZSAqLwotICBiZmQgKipjdXJyZW50X3B0cl9wdHI7CS8qIGNkciBwb2ludGVyIGludG8gY29udGVudHMgKi8KLQotICBmb3IgKDsgKmZpbGVzX3RvX21vdmU7ICsrZmlsZXNfdG9fbW92ZSkKLSAgICB7Ci0gICAgICBjdXJyZW50X3B0cl9wdHIgPSAmKGFyY2gtPm5leHQpOwotICAgICAgd2hpbGUgKCpjdXJyZW50X3B0cl9wdHIpCi0JewotCSAgYmZkICpjdXJyZW50X3B0ciA9ICpjdXJyZW50X3B0cl9wdHI7Ci0JICBpZiAoc3RyY21wIChub3JtYWxpemUgKCpmaWxlc190b19tb3ZlLCBhcmNoKSwKLQkJICAgICAgY3VycmVudF9wdHItPmZpbGVuYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogTW92ZSB0aGlzIGZpbGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCAtIGZpcnN0IGN1dCBmcm9tCi0JCSB3aGVyZSBpdCBpcy4gICovCi0JICAgICAgYmZkICpsaW5rOwotCSAgICAgICpjdXJyZW50X3B0cl9wdHIgPSBjdXJyZW50X3B0ci0+bmV4dDsKLQotCSAgICAgIC8qIE5vdyBnbHVlIHRvIGVuZCAqLwotCSAgICAgIGFmdGVyX2JmZCA9IGdldF9wb3NfYmZkICgmYXJjaC0+bmV4dCwgcG9zX2VuZCwgTlVMTCk7Ci0JICAgICAgbGluayA9ICphZnRlcl9iZmQ7Ci0JICAgICAgKmFmdGVyX2JmZCA9IGN1cnJlbnRfcHRyOwotCSAgICAgIGN1cnJlbnRfcHRyLT5uZXh0ID0gbGluazsKLQotCSAgICAgIGlmICh2ZXJib3NlKQotCQlwcmludGYgKCJtIC0gJXNcbiIsICpmaWxlc190b19tb3ZlKTsKLQotCSAgICAgIGdvdG8gbmV4dF9maWxlOwotCSAgICB9Ci0KLQkgIGN1cnJlbnRfcHRyX3B0ciA9ICYoKCpjdXJyZW50X3B0cl9wdHIpLT5uZXh0KTsKLQl9Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gZW50cnkgJXMgaW4gYXJjaGl2ZSAlcyFcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsICpmaWxlc190b19tb3ZlLCBhcmNoLT5maWxlbmFtZSk7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgbmV4dF9maWxlOjsKLSAgICB9Ci0KLSAgd3JpdGVfYXJjaGl2ZSAoYXJjaCk7Ci19Ci0KLS8qIE91Z2h0IHRvIGRlZmF1bHQgdG8gcmVwbGFjaW5nIGluIHBsYWNlLCBidXQgdGhpcyBpcyBleGlzdGluZyBwcmFjdGljZSEgICovCi0KLXN0YXRpYyB2b2lkCi1yZXBsYWNlX21lbWJlcnMgKGFyY2gsIGZpbGVzX3RvX21vdmUsIHF1aWNrKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGNoYXIgKipmaWxlc190b19tb3ZlOwotICAgICBib29sZWFuIHF1aWNrOwotewotICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgYmZkICoqYWZ0ZXJfYmZkOwkJLyogTmV3IGVudHJpZXMgZ28gYWZ0ZXIgdGhpcyBvbmUgKi8KLSAgYmZkICpjdXJyZW50OwotICBiZmQgKipjdXJyZW50X3B0cjsKLSAgYmZkICp0ZW1wOwotCi0gIHdoaWxlIChmaWxlc190b19tb3ZlICYmICpmaWxlc190b19tb3ZlKQotICAgIHsKLSAgICAgIGlmICghIHF1aWNrKQotCXsKLQkgIGN1cnJlbnRfcHRyID0gJmFyY2gtPm5leHQ7Ci0JICB3aGlsZSAoKmN1cnJlbnRfcHRyKQotCSAgICB7Ci0JICAgICAgY3VycmVudCA9ICpjdXJyZW50X3B0cjsKLQotCSAgICAgIC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYXIgcHJvZ3JhbXMsIHdlCi0JCSBwZXJtaXQgdGhlIHNhbWUgZmlsZSB0byBiZSBhZGRlZCBtdWx0aXBsZSB0aW1lcy4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobm9ybWFsaXplICgqZmlsZXNfdG9fbW92ZSwgYXJjaCksCi0JCQkgIG5vcm1hbGl6ZSAoY3VycmVudC0+ZmlsZW5hbWUsIGFyY2gpKSA9PSAwCi0JCSAgJiYgY3VycmVudC0+YXJlbHRfZGF0YSAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKG5ld2VyX29ubHkpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBzdGF0IGZzYnVmLCBhc2J1ZjsKLQotCQkgICAgICBpZiAoc3RhdCAoKmZpbGVzX3RvX21vdmUsICZmc2J1ZikgIT0gMCkKLQkJCXsKLQkJCSAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQkJCSAgICBiZmRfZmF0YWwgKCpmaWxlc190b19tb3ZlKTsKLQkJCSAgZ290byBuZXh0X2ZpbGU7Ci0JCQl9Ci0JCSAgICAgIGlmIChiZmRfc3RhdF9hcmNoX2VsdCAoY3VycmVudCwgJmFzYnVmKSAhPSAwKQotCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCWZhdGFsIChfKCJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIiksIGN1cnJlbnQtPmZpbGVuYW1lKTsKLQotCQkgICAgICBpZiAoZnNidWYuc3RfbXRpbWUgPD0gYXNidWYuc3RfbXRpbWUpCi0JCQlnb3RvIG5leHRfZmlsZTsKLQkJICAgIH0KLQotCQkgIGFmdGVyX2JmZCA9IGdldF9wb3NfYmZkICgmYXJjaC0+bmV4dCwgcG9zX2FmdGVyLAotCQkJCQkgICBjdXJyZW50LT5maWxlbmFtZSk7Ci0JCSAgdGVtcCA9ICphZnRlcl9iZmQ7Ci0KLQkJICAqYWZ0ZXJfYmZkID0gYmZkX29wZW5yICgqZmlsZXNfdG9fbW92ZSwgTlVMTCk7Ci0JCSAgaWYgKCphZnRlcl9iZmQgPT0gKGJmZCAqKSBOVUxMKQotCQkgICAgewotCQkgICAgICBiZmRfZmF0YWwgKCpmaWxlc190b19tb3ZlKTsKLQkJICAgIH0KLQkJICAoKmFmdGVyX2JmZCktPm5leHQgPSB0ZW1wOwotCi0JCSAgLyogc25pcCBvdXQgdGhpcyBlbnRyeSBmcm9tIHRoZSBjaGFpbiAqLwotCQkgICpjdXJyZW50X3B0ciA9ICgqY3VycmVudF9wdHIpLT5uZXh0OwotCi0JCSAgaWYgKHZlcmJvc2UpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoInIgLSAlc1xuIiwgKmZpbGVzX3RvX21vdmUpOwotCQkgICAgfQotCi0JCSAgY2hhbmdlZCA9IHRydWU7Ci0KLQkJICBnb3RvIG5leHRfZmlsZTsKLQkJfQotCSAgICAgIGN1cnJlbnRfcHRyID0gJihjdXJyZW50LT5uZXh0KTsKLQkgICAgfQotCX0KLQotICAgICAgLyogQWRkIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuICAqLwotCi0gICAgICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19lbmQsIE5VTEwpOwotICAgICAgdGVtcCA9ICphZnRlcl9iZmQ7Ci0gICAgICAqYWZ0ZXJfYmZkID0gYmZkX29wZW5yICgqZmlsZXNfdG9fbW92ZSwgTlVMTCk7Ci0gICAgICBpZiAoKmFmdGVyX2JmZCA9PSAoYmZkICopIE5VTEwpCi0JewotCSAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7Ci0JfQotICAgICAgaWYgKHZlcmJvc2UpCi0JewotCSAgcHJpbnRmICgiYSAtICVzXG4iLCAqZmlsZXNfdG9fbW92ZSk7Ci0JfQotCi0gICAgICAoKmFmdGVyX2JmZCktPm5leHQgPSB0ZW1wOwotCi0gICAgICBjaGFuZ2VkID0gdHJ1ZTsKLQotICAgIG5leHRfZmlsZTo7Ci0KLSAgICAgIGZpbGVzX3RvX21vdmUrKzsKLSAgICB9Ci0KLSAgaWYgKGNoYW5nZWQpCi0gICAgd3JpdGVfYXJjaGl2ZSAoYXJjaCk7Ci0gIGVsc2UKLSAgICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotcmFubGliX29ubHkgKGFyY2huYW1lKQotICAgICBjb25zdCBjaGFyICphcmNobmFtZTsKLXsKLSAgYmZkICphcmNoOwotCi0gIHdyaXRlX2FybWFwID0gMTsKLSAgYXJjaCA9IG9wZW5faW5hcmNoIChhcmNobmFtZSwgKGNoYXIgKikgTlVMTCk7Ci0gIGlmIChhcmNoID09IE5VTEwpCi0gICAgeGV4aXQgKDEpOwotICB3cml0ZV9hcmNoaXZlIChhcmNoKTsKLX0KLQotLyogVXBkYXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHN5bWJvbCBtYXAgb2YgYW4gYXJjaGl2ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1yYW5saWJfdG91Y2ggKGFyY2huYW1lKQotICAgICBjb25zdCBjaGFyICphcmNobmFtZTsKLXsKLSNpZmRlZiBfX0dPMzJfXwotICAvKiBJIGRvbid0IHRoaW5rIHVwZGF0aW5nIHdvcmtzIG9uIGdvMzIuICAqLwotICByYW5saWJfb25seSAoYXJjaG5hbWUpOwotI2Vsc2UKLSAgaW50IGY7Ci0gIGJmZCAqYXJjaDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGYgPSBvcGVuIChhcmNobmFtZSwgT19SRFdSIHwgT19CSU5BUlksIDApOwotICBpZiAoZiA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGJmZF9mYXRhbCAoYXJjaG5hbWUpOwotICAgIH0KLQotICBhcmNoID0gYmZkX2Zkb3BlbnIgKGFyY2huYW1lLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmKTsKLSAgaWYgKGFyY2ggPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGFyY2huYW1lKTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhcmNoLCBiZmRfYXJjaGl2ZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGFyY2huYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoISBiZmRfaGFzX21hcCAoYXJjaCkpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiJXM6IG5vIGFyY2hpdmUgbWFwIHRvIHVwZGF0ZSIpLCBhcmNobmFtZSk7Ci0KLSAgYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFyY2gpOwotCi0gIGlmICghIGJmZF9jbG9zZSAoYXJjaCkpCi0gICAgYmZkX2ZhdGFsIChhcmNobmFtZSk7Ci0jZW5kaWYKLX0KLQotLyogVGhpbmdzIHdoaWNoIGFyZSBpbnRlcmVzdGluZyB0byBtYXAgb3ZlciBhbGwgb3Igc29tZSBvZiB0aGUgZmlsZXM6ICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9kZXNjciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBwcmludF9hcmVsdF9kZXNjciAoc3Rkb3V0LCBhYmZkLCB2ZXJib3NlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FybGV4LmwgYi9iaW51dGlscy9hcmxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUxM2QxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FybGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0lewotLyogYXJsZXgubCAtIFN0cmFuZ2Ugc2NyaXB0IGxhbmd1YWdlIGxleGVyICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJhcnBhcnNlLmgiCi0KLWludCBsaW5lbnVtYmVyOwotJX0KLSUlCi0KLSJBRERMSUIiICAgCXsgcmV0dXJuIEFERExJQjsgfQotIkFERE1PRCIgICAJeyByZXR1cm4gQURETU9EOyB9Ci0iQ0xFQVIiICAgCXsgcmV0dXJuIENMRUFSOyB9Ci0iQ1JFQVRFIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KLSJERUxFVEUiICAgCXsgcmV0dXJuIERFTEVURTsgfQotIkRJUkVDVE9SWSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9Ci0iRU5EIiAgIAl7IHJldHVybiBFTkQ7IH0KLSJFWFRSQUNUIiAgIAl7IHJldHVybiBFWFRSQUNUOyB9Ci0iRlVMTERJUiIgICAJeyByZXR1cm4gRlVMTERJUjsgfQotIkhFTFAiICAgCXsgcmV0dXJuIEhFTFA7IH0KLSJMSVNUIgkJeyByZXR1cm4gTElTVDsgfQotIk9QRU4iICAgCXsgcmV0dXJuIE9QRU47IH0KLSJSRVBMQUNFIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9Ci0iVkVSQk9TRSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQotIlNBVkUiICAgCXsgcmV0dXJuIFNBVkU7IH0KLSJhZGRsaWIiICAgCXsgcmV0dXJuIEFERExJQjsgfQotImFkZG1vZCIgICAJeyByZXR1cm4gQURETU9EOyB9Ci0iY2xlYXIiICAgCXsgcmV0dXJuIENMRUFSOyB9Ci0iY3JlYXRlIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KLSJkZWxldGUiICAgCXsgcmV0dXJuIERFTEVURTsgfQotImRpcmVjdG9yeSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9Ci0iZW5kIiAgIAl7IHJldHVybiBFTkQ7IH0KLSJleHRyYWN0IiAgIAl7IHJldHVybiBFWFRSQUNUOyB9Ci0iZnVsbGRpciIgICAJeyByZXR1cm4gRlVMTERJUjsgfQotImhlbHAiICAgCXsgcmV0dXJuIEhFTFA7IH0KLSJsaXN0IgkJeyByZXR1cm4gTElTVDsgfQotIm9wZW4iICAgCXsgcmV0dXJuIE9QRU47IH0KLSJyZXBsYWNlIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9Ci0idmVyYm9zZSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQotInNhdmUiICAgCXsgcmV0dXJuIFNBVkU7IH0KLSIrXG4iICAgICAgICAgICB7IGxpbmVudW1iZXIgKys7IH0KLSIoIiAgICAgICAgICAgICB7IHJldHVybiAnKCc7IH0KLSIpIiAgICAgICAgICAgICB7IHJldHVybiAnKSc7IH0KLSIsIiAgICAgICAgICAgICB7IHJldHVybiAnLCc7IH0KLVtBLVphLXowLTkvJDouXC1cX10rICB7IAkKLQkJeXlsdmFsLm5hbWUgPSAgeHN0cmR1cCAoeXl0ZXh0KTsKLQkJcmV0dXJuIEZJTEVOQU1FOwotCQl9Ci0iKiIuKiAJCXsgfQotIjsiLiogCQl7IH0KLSIgIgkJeyB9Ci0iXG4iCSAJIHsgbGluZW51bWJlciArKzsgcmV0dXJuIE5FV0xJTkU7IH0JCi0KLSUlCi0jaWZuZGVmIHl5d3JhcAotLyogTmVlZGVkIGZvciBsZXgsIHRob3VnaCBub3QgZmxleC4gKi8KLWludCB5eXdyYXAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FycGFyc2UueSBiL2JpbnV0aWxzL2FycGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlOTBmYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcnBhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotJXsKLS8qIGFycGFyc2UueSAtIFN0YW5nZSBzY3JpcHQgbGFuZ3VhZ2UgcGFyc2VyICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiYXJzdXAuaCIKLWV4dGVybiBpbnQgdmVyYm9zZTsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotJX0KLQotJXVuaW9uIHsKLSAgY2hhciAqbmFtZTsKLXN0cnVjdCBsaXN0ICpsaXN0IDsKLQotfTsKLQotJXRva2VuIE5FV0xJTkUKLSV0b2tlbiBWRVJCT1NFCi0ldG9rZW4gPG5hbWU+IEZJTEVOQU1FCi0ldG9rZW4gQURETElCCi0ldG9rZW4gTElTVAotJXRva2VuIEFERE1PRAotJXRva2VuIENMRUFSCi0ldG9rZW4gQ1JFQVRFCi0ldG9rZW4gREVMRVRFCi0ldG9rZW4gRElSRUNUT1JZCi0ldG9rZW4gRU5ECi0ldG9rZW4gRVhUUkFDVAotJXRva2VuIEZVTExESVIKLSV0b2tlbiBIRUxQCi0ldG9rZW4gUVVJVAotJXRva2VuIFJFUExBQ0UKLSV0b2tlbiBTQVZFCi0ldG9rZW4gT1BFTgotCi0ldHlwZSA8bGlzdD4gbW9kdWxlbGlzdCAKLSV0eXBlIDxsaXN0PiBtb2R1bGVuYW1lCi0ldHlwZSA8bmFtZT4gb3B0aW9uYWxfZmlsZW5hbWUKLSUlCi0KLXN0YXJ0OgotCXsgcHJvbXB0KCk7IH0gc2Vzc2lvbgotCTsKLQotc2Vzc2lvbjoKLQkgICAgc2Vzc2lvbiBjb21tYW5kX2xpbmUKLQl8Ci0JOwotCi1jb21tYW5kX2xpbmU6Ci0JCWNvbW1hbmQgTkVXTElORSB7IHByb21wdCgpOyB9Ci0KLWNvbW1hbmQ6Ci0JCW9wZW5fY29tbWFuZAkKLQl8CWNyZWF0ZV9jb21tYW5kCQotCXwgCXZlcmJvc2VfY29tbWFuZAotCXwJZGlyZWN0b3J5X2NvbW1hbmQKLQl8CWFkZGxpYl9jb21tYW5kCi0JfAljbGVhcl9jb21tYW5kCi0JfAlhZGRtb2RfY29tbWFuZAotCXwgCXNhdmVfY29tbWFuZAotICAgICAgICB8ICAgICAgIGV4dHJhY3RfY29tbWFuZAotCXwJcmVwbGFjZV9jb21tYW5kCi0JfAlkZWxldGVfY29tbWFuZAotCXwJbGlzdF9jb21tYW5kCi0JfCAJRU5ECSB7IGFyX2VuZCgpOyByZXR1cm4gMDsgfQotCXwgCWVycm9yCi0JfCAgICAgICBGSUxFTkFNRSB7IHl5ZXJyb3IoImZvbyIpOyB9Ci0JfAotCTsKLQotCi1leHRyYWN0X2NvbW1hbmQ6Ci0gICAgICAgICAgICAgICAgRVhUUkFDVCBtb2R1bGVuYW1lCi0JCXsgYXJfZXh0cmFjdCgkMik7IH0KLQk7Ci0KLXJlcGxhY2VfY29tbWFuZDoJCi0JCVJFUExBQ0UgbW9kdWxlbmFtZQotCQl7IGFyX3JlcGxhY2UoJDIpOyB9Ci0JOwotCQotY2xlYXJfY29tbWFuZDoKLQkJQ0xFQVIKLQkJeyBhcl9jbGVhcigpOyB9Ci0JOwotCi1kZWxldGVfY29tbWFuZDoKLQkJREVMRVRFIG1vZHVsZW5hbWUKLQkJeyBhcl9kZWxldGUoJDIpOyB9Ci0JOwotYWRkbW9kX2NvbW1hbmQ6Ci0JQURETU9EIG1vZHVsZW5hbWUKLQkJeyBhcl9hZGRtb2QoJDIpOyB9Ci0JOwotCi1saXN0X2NvbW1hbmQ6CQotCQlMSVNUCi0JCXsgYXJfbGlzdCgpOyB9Ci0JOwotCi1zYXZlX2NvbW1hbmQ6CQotCQlTQVZFCi0JCXsgYXJfc2F2ZSgpOyB9Ci0JOwotCi0KLQotb3Blbl9jb21tYW5kOgotCQlPUEVOIEZJTEVOQU1FIAotCQl7IGFyX29wZW4oJDIsMCk7IH0KLQk7Ci0KLWNyZWF0ZV9jb21tYW5kOgotCQlDUkVBVEUgRklMRU5BTUUgCi0JCXsgYXJfb3BlbigkMiwxKTsgfQotCTsKLQotCi1hZGRsaWJfY29tbWFuZDoKLQkJQURETElCIEZJTEVOQU1FIG1vZHVsZWxpc3QKLQkJeyBhcl9hZGRsaWIoJDIsJDMpOyB9Ci0JOwotZGlyZWN0b3J5X2NvbW1hbmQ6Ci0JCURJUkVDVE9SWSBGSUxFTkFNRSBtb2R1bGVsaXN0IG9wdGlvbmFsX2ZpbGVuYW1lCi0JCXsgYXJfZGlyZWN0b3J5KCQyLCAkMywgJDQpOyB9Ci0JOwotCi0KLQotb3B0aW9uYWxfZmlsZW5hbWU6Ci0JCUZJTEVOQU1FCi0JCXsgJCQgPSAkMTsgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci0KLW1vZHVsZWxpc3Q6Ci0JJygnIG1vZHVsZW5hbWUgJyknIAotCQl7ICQkID0gJDI7IH0KLQl8Ci0JCXsgJCQgPSAwOyB9Ci0JOwotCi1tb2R1bGVuYW1lOgotCQltb2R1bGVuYW1lIG9wdGNvbW1hIEZJTEVOQU1FCi0JCXsgCXN0cnVjdCBsaXN0ICpuICA9IChzdHJ1Y3QgbGlzdCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0KSk7Ci0JCQluLT5uZXh0ID0gJDE7IAotCQkJbi0+bmFtZSA9ICQzOwotCQkJJCQgPSBuOwotCQkgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci0JCi0KLW9wdGNvbW1hOgotCQknLCcKLQl8Ci0JOwotCQotCQkKLXZlcmJvc2VfY29tbWFuZDoKLQlWRVJCT1NFIAotCQl7IHZlcmJvc2UgPSAhdmVyYm9zZTsgfQotCTsKLQotCi0lJQotCi1zdGF0aWMgaW50Ci15eWVycm9yICh4KQotICAgICBjb25zdCBjaGFyICp4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGV4dGVybiBpbnQgbGluZW51bWJlcjsKLQotICBwcmludGYgKF8oIlN5bnRheCBlcnJvciBpbiBhcmNoaXZlIHNjcmlwdCwgbGluZSAlZFxuIiksIGxpbmVudW1iZXIgKyAxKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hcnN1cC5jIGIvYmludXRpbHMvYXJzdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4MDlmYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcnN1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qIGFyc3VwLmMgLSBBcmNoaXZlIHN1cHBvcnQgZm9yIE1SSSBjb21wYXRpYmlsaXR5Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgIAkJICBzYWNAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgbG9va3MgYWZ0ZXIgcmVxdWVzdHMgZnJvbSBhcnBhcnNlLnksIHRvIHByb3ZpZGUgdGhlIE1SSQotc3R5bGUgbGlicmFyaWFuIGNvbW1hbmQgc3ludGF4ICsgMSB3b3JkIExJU1QKLQotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImFyc3VwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLXN0YXRpYyB2b2lkIG1hcF9vdmVyX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHZvaWQgKCpmdW5jdGlvbikgKGJmZCAqLCBiZmQgKiksIHN0cnVjdCBsaXN0ICopKTsKLXN0YXRpYyB2b2lkIGFyX2RpcmVjdG9yeV9kb2VyIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgYXJfYWRkbGliX2RvZXIgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLWV4dGVybiBpbnQgdmVyYm9zZTsKLQotc3RhdGljIHZvaWQKLW1hcF9vdmVyX2xpc3QgKGFyY2gsIGZ1bmN0aW9uLCBsaXN0KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHZvaWQgKCpmdW5jdGlvbikgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0gICAgIHN0cnVjdCBsaXN0ICpsaXN0OwotewotICBiZmQgKmhlYWQ7Ci0KLSAgaWYgKGxpc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmQgKm5leHQ7Ci0KLSAgICAgIGhlYWQgPSBhcmNoLT5uZXh0OwotICAgICAgd2hpbGUgKGhlYWQgIT0gTlVMTCkKLQl7Ci0JICBuZXh0ID0gaGVhZC0+bmV4dDsKLQkgIGZ1bmN0aW9uIChoZWFkLCAoYmZkICopIE5VTEwpOwotCSAgaGVhZCA9IG5leHQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBsaXN0ICpwdHI7Ci0KLSAgICAgIC8qIFRoaXMgbWF5IGFwcGVhciB0byBiZSBhIGJhcm9xdWUgd2F5IG9mIGFjY29tcGxpc2hpbmcgd2hhdCB3ZQotCSB3YW50LiAgaG93ZXZlciB3ZSBoYXZlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZmlsZW5hbWVzIGluIG9yZGVyCi0JIHRvIG5vdGljZSB3aGVyZSBhIGZpbGVuYW1lIGlzIHJlcXVlc3RlZCBidXQgZG9lcyBub3QgZXhpc3QgaW4KLQkgdGhlIGFyY2hpdmUuICBEaXR0byBtYXBwaW5nIG92ZXIgZWFjaCBmaWxlIGVhY2ggdGltZSAtLSB3ZQotCSB3YW50IHRvIGhhY2sgbXVsdGlwbGUgcmVmZXJlbmNlcy4gICovCi0gICAgICBmb3IgKHB0ciA9IGxpc3Q7IHB0cjsgcHRyID0gcHRyLT5uZXh0KQotCXsKLQkgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkgIGJmZCAqcHJldiA9IGFyY2g7Ci0KLQkgIGZvciAoaGVhZCA9IGFyY2gtPm5leHQ7IGhlYWQ7IGhlYWQgPSBoZWFkLT5uZXh0KSAKLQkgICAgewotCSAgICAgIGlmIChoZWFkLT5maWxlbmFtZSAhPSBOVUxMCi0JCSAgJiYgc3RyY21wIChwdHItPm5hbWUsIGhlYWQtPmZpbGVuYW1lKSA9PSAwKQotCQl7Ci0JCSAgZm91bmQgPSB0cnVlOwotCQkgIGZ1bmN0aW9uIChoZWFkLCBwcmV2KTsKLQkJfQotCSAgICAgIHByZXYgPSBoZWFkOwotCSAgICB9Ci0JICBpZiAoISBmb3VuZCkKLQkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJObyBlbnRyeSAlcyBpbiBhcmNoaXZlLlxuIiksIHB0ci0+bmFtZSk7Ci0JfQotICAgIH0KLX0KLQotCi1GSUxFICpvdXRmaWxlOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1hcl9kaXJlY3RvcnlfZG9lciAoYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gICAgcHJpbnRfYXJlbHRfZGVzY3Iob3V0ZmlsZSwgYWJmZCwgdmVyYm9zZSk7Ci19Ci0KLXZvaWQKLWFyX2RpcmVjdG9yeSAoYXJfbmFtZSwgbGlzdCwgb3V0cHV0KQotICAgICBjaGFyICphcl9uYW1lOwotICAgICBzdHJ1Y3QgbGlzdCAqbGlzdDsKLSAgICAgY2hhciAqb3V0cHV0OwotewotICBiZmQgKmFyY2g7Ci0KLSAgYXJjaCA9IG9wZW5faW5hcmNoIChhcl9uYW1lLCAoY2hhciAqKSBOVUxMKTsKLSAgaWYgKG91dHB1dCkKLSAgICB7Ci0gICAgICBvdXRmaWxlID0gZm9wZW4ob3V0cHV0LCJ3Iik7Ci0gICAgICBpZiAob3V0ZmlsZSA9PSAwKQotCXsKLQkgIG91dGZpbGUgPSBzdGRvdXQ7Ci0JICBmcHJpbnRmIChzdGRlcnIsXygiQ2FuJ3Qgb3BlbiBmaWxlICVzXG4iKSwgb3V0cHV0KTsKLQkgIG91dHB1dCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSAKLSAgICBvdXRmaWxlID0gc3Rkb3V0OwotCi0gIG1hcF9vdmVyX2xpc3QgKGFyY2gsIGFyX2RpcmVjdG9yeV9kb2VyLCBsaXN0KTsKLQotICBiZmRfY2xvc2UgKGFyY2gpOwotCi0gIGlmIChvdXRwdXQpCi0gICBmY2xvc2UgKG91dGZpbGUpOwotfQotCi12b2lkCi1ERUZVTl9WT0lEKHByb21wdCkKLXsKLSAgZXh0ZXJuIGludCBpbnRlcmFjdGl2ZTsKLSAgaWYgKGludGVyYWN0aXZlKSAKLSAgewotICAgIHByaW50ZigiQVIgPiIpOwotICAgIGZmbHVzaChzdGRvdXQpOyAKLSAgfQotfQotCi12b2lkCi1tYXliZXF1aXQgKCkKLXsKLSAgaWYgKCEgaW50ZXJhY3RpdmUpIAotICAgIHhleGl0ICg5KTsKLX0KLQotCi1iZmQgKm9iZmQ7Ci1jaGFyICpyZWFsX25hbWUgOyAKLXZvaWQKLURFRlVOKGFyX29wZW4sKG5hbWUsIHQpLAotICAgICAgY2hhciAqbmFtZSBBTkQKLSAgICAgIGludCB0KQotCi17Ci0gIGNoYXIgKnRuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEwKTsKLSAgcmVhbF9uYW1lID0gbmFtZTsKLSAgc3ByaW50Zih0bmFtZSwgIiVzLXRtcCIsIG5hbWUpOwotICBvYmZkID0gYmZkX29wZW53KHRuYW1lLCBOVUxMKTsKLQotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVycixfKCIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgYXJjaGl2ZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKLQkgICAgdG5hbWUpOwotCi0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaWYgKCF0KSB7Ci0gICAgICBiZmQgKipwdHI7Ci0gICAgICBiZmQgKmVsZW1lbnQ7Ci0gICAgICBiZmQgKmliZmQ7Ci0gICAgICBpYmZkID0gYmZkX29wZW5yKG5hbWUsIE5VTEwpOwotICAgICAgaWYgKCFpYmZkKSB7Ci0JZnByaW50ZihzdGRlcnIsXygiJXM6IENhbid0IG9wZW4gaW5wdXQgYXJjaGl2ZSAlc1xuIiksCi0JCXByb2dyYW1fbmFtZSwgbmFtZSk7Ci0JbWF5YmVxdWl0KCk7Ci0JcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQoaWJmZCwgYmZkX2FyY2hpdmUpICE9IHRydWUpIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogZmlsZSAlcyBpcyBub3QgYW4gYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSwKLQkJbmFtZSk7Ci0JbWF5YmVxdWl0KCk7Ci0JcmV0dXJuOwotICAgICAgfQotICAgICAgcHRyID0gJihvYmZkLT5hcmNoaXZlX2hlYWQpOwotICAgICAgZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUoaWJmZCwgTlVMTCk7Ci0KLSAgICAgIHdoaWxlIChlbGVtZW50KSB7Ci0JKnB0ciA9IGVsZW1lbnQ7Ci0JcHRyID0gJmVsZW1lbnQtPm5leHQ7Ci0JZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUoaWJmZCwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYmZkX3NldF9mb3JtYXQob2JmZCwgYmZkX2FyY2hpdmUpOwotCi0gICAgb2JmZC0+aGFzX2FybWFwID0gMTsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1hcl9hZGRsaWJfZG9lciAoYWJmZCwgcHJldikKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKnByZXY7Ci17Ci0gIC8qIEFkZCB0aGlzIG1vZHVsZSB0byB0aGUgb3V0cHV0IGJmZCAqLwotICBpZiAocHJldiAhPSBOVUxMKQotICAgIHByZXYtPm5leHQgPSBhYmZkLT5uZXh0OwotICBhYmZkLT5uZXh0ID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICBvYmZkLT5hcmNoaXZlX2hlYWQgPSBhYmZkOwotfQotCi12b2lkCi1hcl9hZGRsaWIgKG5hbWUsIGxpc3QpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBsaXN0ICpsaXN0OwotewotICBpZiAob2JmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIG91dHB1dCBhcmNoaXZlIHNwZWNpZmllZCB5ZXRcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgbWF5YmVxdWl0ICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZCAqYXJjaDsKLQotICAgICAgYXJjaCA9IG9wZW5faW5hcmNoIChuYW1lLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgIGlmIChhcmNoICE9IE5VTEwpCi0JbWFwX292ZXJfbGlzdCAoYXJjaCwgYXJfYWRkbGliX2RvZXIsIGxpc3QpOwotCi0gICAgICAvKiBEb24ndCBjbG9zZSB0aGUgYmZkLCBzaW5jZSBpdCB3aWxsIG1ha2UgdGhlIGVsZW1lbnRzIGRpc2FzcHBlYXIgKi8KLSAgICB9Ci19Ci0KLXZvaWQKLURFRlVOKGFyX2FkZG1vZCwgKGxpc3QpLAotICAgICAgc3RydWN0IGxpc3QgKmxpc3QpCi17Ci0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSAKLSAgewotICAgIHdoaWxlIChsaXN0KSB7Ci0gICAgICBiZmQgKmFiZmQgPSBiZmRfb3BlbnIobGlzdC0+bmFtZSwgTlVMTCk7Ci0gICAgICBpZiAoIWFiZmQpICB7Ci0JZnByaW50ZihzdGRlcnIsXygiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKLQkJbGlzdC0+bmFtZSk7Ci0JbWF5YmVxdWl0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQlhYmZkLT5uZXh0ID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotCW9iZmQtPmFyY2hpdmVfaGVhZCA9IGFiZmQ7Ci0gICAgICB9Ci0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0gIH0KLX0KLQotCi0KLXZvaWQKLURFRlVOX1ZPSUQoYXJfY2xlYXIpCi17Ci1pZiAob2JmZCkgCi0gb2JmZC0+YXJjaGl2ZV9oZWFkID0gMDsKLX0KLQotdm9pZAotREVGVU4oYXJfZGVsZXRlLCAobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIC8qIEZpbmQgdGhpcyBuYW1lIGluIHRoZSBhcmNoaXZlICovCi0gICAgICBiZmQgKm1lbWJlciA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKLSAgICAgIGJmZCAqKnByZXYgPSAmKG9iZmQtPmFyY2hpdmVfaGVhZCk7Ci0gICAgICBpbnQgZm91bmQgPSAwOwotICAgICAgd2hpbGUgKG1lbWJlcikgewotCWlmIChzdHJjbXAobWVtYmVyLT5maWxlbmFtZSwgbGlzdC0+bmFtZSkgPT0gMCkgewotCSAgKnByZXYgPSBtZW1iZXItPm5leHQ7Ci0JICBmb3VuZCA9IDE7Ci0JfQotCWVsc2UgewotCSAgcHJldiA9ICYobWVtYmVyLT5uZXh0KTsKLQl9Ci0JICBtZW1iZXIgPSBtZW1iZXItPm5leHQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZvdW5kKSAgewotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQltYXliZXF1aXQoKTsKLSAgICAgIH0KLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgfQotfQotCi0KLXZvaWQKLURFRlVOX1ZPSUQoYXJfc2F2ZSkKLXsKLQotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgewotICAgIGNoYXIgKm9maWxlbmFtZSA9IHhzdHJkdXAgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgICBiZmRfY2xvc2Uob2JmZCk7Ci0gICAgCi0gICAgcmVuYW1lIChvZmlsZW5hbWUsIHJlYWxfbmFtZSk7Ci0gICAgb2JmZCA9IDA7Ci0gICAgZnJlZShvZmlsZW5hbWUpOwotICB9Ci19Ci0KLQotCi12b2lkCi1ERUZVTihhcl9yZXBsYWNlLCAobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIC8qIEZpbmQgdGhpcyBuYW1lIGluIHRoZSBhcmNoaXZlICovCi0gICAgICBiZmQgKm1lbWJlciA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKLSAgICAgIGJmZCAqKnByZXYgPSAmKG9iZmQtPmFyY2hpdmVfaGVhZCk7Ci0gICAgICBpbnQgZm91bmQgPSAwOwotICAgICAgd2hpbGUgKG1lbWJlcikgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSAKLQl7Ci0JICAvKiBGb3VuZCB0aGUgb25lIHRvIHJlcGxhY2UgKi8KLQkgIGJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCAwKTsKLQkgIGlmICghYWJmZCkgCi0JICB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogY2FuJ3Qgb3BlbiBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBsaXN0LT5uYW1lKTsKLQkgICAgbWF5YmVxdWl0KCk7Ci0JICB9Ci0JICBlbHNlIHsKLQkgICAgKnByZXYgPSBhYmZkOwotCSAgICBhYmZkLT5uZXh0ID0gbWVtYmVyLT5uZXh0OwotCSAgICBmb3VuZCA9IDE7Ci0JICB9Ci0JfQotCWVsc2UgewotCSAgcHJldiA9ICYobWVtYmVyLT5uZXh0KTsKLQl9Ci0JbWVtYmVyID0gbWVtYmVyLT5uZXh0OwotICAgICAgfQotICAgICAgaWYgKCFmb3VuZCkgIHsKLQliZmQgKmFiZmQgPSBiZmRfb3BlbnIobGlzdC0+bmFtZSwgMCk7Ci0JZnByaW50ZihzdGRlcnIsXygiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsCi0JCWxpc3QtPm5hbWUpOwotCWlmICghYWJmZCkgCi0JewotCSAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsIGxpc3QtPm5hbWUpOwotCSAgbWF5YmVxdWl0KCk7Ci0JfQotCWVsc2UgCi0JewotCSAgKnByZXYgPSBhYmZkOwotCX0KLSAgICAgIH0KLQotICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgfQotfQotCi0vKiBBbmQgSSBhZGRlZCB0aGlzIG9uZSAqLwotdm9pZAotREVGVU5fVk9JRChhcl9saXN0KQotewotICBpZiAoIW9iZmQpIAotICB7Ci0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIHsKLSAgICBiZmQgKmFiZmQ7Ci0gICAgb3V0ZmlsZSA9IHN0ZG91dDsKLSAgICB2ZXJib3NlID0xIDsKLSAgICBwcmludGYoXygiQ3VycmVudCBvcGVuIGFyY2hpdmUgaXMgJXNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0gICAgZm9yIChhYmZkID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotCSBhYmZkICE9IChiZmQgKilOVUxMOwotCSBhYmZkID0gYWJmZC0+bmV4dCkgCi0gICAgewotICAgICAgYXJfZGlyZWN0b3J5X2RvZXIgKGFiZmQsIChiZmQgKikgTlVMTCk7Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZCAKLURFRlVOX1ZPSUQoYXJfZW5kKQotewotICBpZiAob2JmZCkKLSAgewotICAgIGZjbG9zZSgoRklMRSAqKShvYmZkLT5pb3N0cmVhbSkpOwotICAgIHVubGluayhiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0gIH0KLX0KLXZvaWQKLURFRlVOKGFyX2V4dHJhY3QsKGxpc3QpLAotICAgICAgc3RydWN0IGxpc3QgKmxpc3QpCi17Ci0gIGlmICghb2JmZCkgCi0gIHsKLQotICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiAgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSAKLSAgewotICAgIHdoaWxlIChsaXN0KSB7Ci0gICAgICAvKiBGaW5kIHRoaXMgbmFtZSBpbiB0aGUgYXJjaGl2ZSAqLwotICAgICAgYmZkICptZW1iZXIgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gICAgICBpbnQgZm91bmQgPSAwOwotICAgICAgd2hpbGUgKG1lbWJlciAmJiAhZm91bmQpIAotICAgICAgewotCWlmIChzdHJjbXAobWVtYmVyLT5maWxlbmFtZSwgbGlzdC0+bmFtZSkgPT0gMCkgCi0JewotCSAgZXh0cmFjdF9maWxlKG1lbWJlcik7Ci0JICBmb3VuZCA9IDE7Ci0JICB9Ci0KLQltZW1iZXIgPSBtZW1iZXItPm5leHQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZvdW5kKSAgewotCWJmZF9vcGVucihsaXN0LT5uYW1lLCAwKTsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3QgZmluZCBtb2R1bGUgZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKLQkJbGlzdC0+bmFtZSk7Ci0KLSAgICAgIH0KLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXJzdXAuaCBiL2JpbnV0aWxzL2Fyc3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGEzNGIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXJzdXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qIGFyc3VwLmggLSBhcmNoaXZlIHN1cHBvcnQgaGVhZGVyIGZpbGUKLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXN0cnVjdCBsaXN0IHsKLQljaGFyICpuYW1lOwkKLQlzdHJ1Y3QgbGlzdCAqbmV4dDsKLX07Ci0KLXZvaWQKLW1heWJlcXVpdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLXByb21wdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLWFyX2NsZWFyIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotYXJfcmVwbGFjZSBQQVJBTVMgKChzdHJ1Y3QgbGlzdCAqKSk7Ci0KLXZvaWQKLWFyX2RlbGV0ZSBQQVJBTVMgKChzdHJ1Y3QgbGlzdCAqKSk7Ci0KLXZvaWQKLWFyX3NhdmUgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotYXJfb3BlbiBQQVJBTVMgKChjaGFyICosIGludCkpOwotCi12b2lkCi1hcl9kaXJlY3RvcnkgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbGlzdCAqLCBjaGFyICopKTsKLQotdm9pZAotYXJfYWRkbW9kIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZAotYXJfYWRkbGliIFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IGxpc3QgKikpOwotCi12b2lkIAotYXJfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotYXJfZXh0cmFjdCBQQVJBTVMgKChzdHJ1Y3QgbGlzdCAqKSk7Ci0KLWJmZCAqCi1vcGVuX2luYXJjaCBQQVJBTVMgKChjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lLCBjb25zdCBjaGFyICopKTsKLQotaW50Ci15eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRnVuY3Rpb25zIGZyb20gYXIuYyAqLwotCi12b2lkCi1leHRyYWN0X2ZpbGUgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1leHRlcm4gaW50IGludGVyYWN0aXZlOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYmludXRpbHMudGV4aSBiL2JpbnV0aWxzL2JpbnV0aWxzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjcyZmUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYmludXRpbHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDMwMjQgKzAsMCBAQAotXGlucHV0IHRleGluZm8gICAgICAgQGMgICAgICAgICAgICAgICAgICAgIC0qLSBUZXhpbmZvIC0qLQotQHNldGZpbGVuYW1lIGJpbnV0aWxzLmluZm8KLUBpbmNsdWRlIGNvbmZpZy50ZXhpCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIEJpbnV0aWxzOiAoYmludXRpbHMpLiAgICAgICAgIFRoZSBHTlUgYmluYXJ5IHV0aWxpdGllcy4KLSogYXI6IChiaW51dGlscylhci4gICAgICAgICAgICAgICBDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcwotKiBubTogKGJpbnV0aWxzKW5tLiAgICAgICAgICAgICAgIExpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcwotKiBvYmpjb3B5OiAoYmludXRpbHMpb2JqY29weS4JICBDb3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzCi0qIG9iamR1bXA6IChiaW51dGlscylvYmpkdW1wLiAgICAgRGlzcGxheSBpbmZvcm1hdGlvbiBmcm9tIG9iamVjdCBmaWxlcwotKiByYW5saWI6IChiaW51dGlscylyYW5saWIuICAgICAgIEdlbmVyYXRlIGluZGV4IHRvIGFyY2hpdmUgY29udGVudHMKLSogcmVhZGVsZjogKGJpbnV0aWxzKXJlYWRlbGYuCSAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgRUxGIGZvcm1hdCBmaWxlcy4KLSogc2l6ZTogKGJpbnV0aWxzKXNpemUuICAgICAgICAgICBMaXN0IHNlY3Rpb24gc2l6ZXMgYW5kIHRvdGFsIHNpemUKLSogc3RyaW5nczogKGJpbnV0aWxzKXN0cmluZ3MuICAgICBMaXN0IHByaW50YWJsZSBzdHJpbmdzIGZyb20gZmlsZXMKLSogc3RyaXA6IChiaW51dGlscylzdHJpcC4gICAgICAgICBEaXNjYXJkIHN5bWJvbHMKLSogYysrZmlsdDogKGJpbnV0aWxzKWMrK2ZpbHQuCSAgRmlsdGVyIHRvIGRlbWFuZ2xlIGVuY29kZWQgQysrIHN5bWJvbHMKLSogY3h4ZmlsdDogKGJpbnV0aWxzKWMrK2ZpbHQuICAgICBNUy1ET1MgbmFtZSBmb3IgYysrZmlsdAotKiBhZGRyMmxpbmU6IChiaW51dGlscylhZGRyMmxpbmUuIENvbnZlcnQgYWRkcmVzc2VzIHRvIGZpbGUgYW5kIGxpbmUKLSogbmxtY29udjogKGJpbnV0aWxzKW5sbWNvbnYuICAgICBDb252ZXJ0cyBvYmplY3QgY29kZSBpbnRvIGFuIE5MTQotKiB3aW5kcmVzOiAoYmludXRpbHMpd2luZHJlcy4JICBNYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0qIGRsbHRvb2w6IChiaW51dGlscylkbGx0b29sLgkgIENyZWF0ZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgYW5kIHVzZSBETExzCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBhIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi0KLUBzeW5pbmRleCBreSBjcAotQGMKLUBjIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBiaW5hcnkgdXRpbGl0aWVzICJhciIsICJsZCIsICJvYmpjb3B5IiwKLUBjICAib2JqZHVtcCIsICJubSIsICJzaXplIiwgInN0cmluZ3MiLCAic3RyaXAiLCAicmVhZGVsZiIgYW5kICJyYW5saWIiLgotQGMKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgCi1AYyBUaGlzIHRleHQgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQotQGMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLUBjCi0KLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXR0aXRsZSBAc2N7Z251fSBCaW5hcnkgVXRpbGl0aWVzCi1AdGl0bGVwYWdlCi1AZmluYWxvdXQKLUB0aXRsZSBUaGUgQHNje2dudX0gQmluYXJ5IFV0aWxpdGllcwotQHN1YnRpdGxlIFZlcnNpb24gQHZhbHVle1ZFUlNJT059Ci1Ac3AgMQotQHN1YnRpdGxlIE1heSAxOTkzCi1AYXV0aG9yIFJvbGFuZCBILiBQZXNjaAotQGF1dGhvciBKZWZmcmV5IE0uIE9zaWVyCi1AYXV0aG9yIEN5Z251cyBTdXBwb3J0Ci1AcGFnZQotCi1AdGV4Ci17XHBhcnNraXA9MHB0IFxoZmlsbCBDeWdudXMgU3VwcG9ydFxwYXIgXGhmaWxsCi1cVGVYe31pbmZvIFx0ZXhpbmZvdmVyc2lvblxwYXIgfQotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi0KLUBub2RlIFRvcAotQHRvcCBJbnRyb2R1Y3Rpb24KLQotQGNpbmRleCB2ZXJzaW9uCi1UaGlzIGJyaWVmIG1hbnVhbCBjb250YWlucyBwcmVsaW1pbmFyeSBkb2N1bWVudGF0aW9uIGZvciB0aGUgQHNje2dudX0gYmluYXJ5Ci11dGlsaXRpZXMgKGNvbGxlY3RpdmVseSB2ZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfSk6IAotCi1AaWZ0ZXgKLUB0YWJsZSBAY29kZQotQGl0ZW0gYXIKLUNyZWF0ZSwgbW9kaWZ5LCBhbmQgZXh0cmFjdCBmcm9tIGFyY2hpdmVzCi0KLUBpdGVtIG5tCi1MaXN0IHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLQotQGl0ZW0gb2JqY29weQotQ29weSBhbmQgdHJhbnNsYXRlIG9iamVjdCBmaWxlcwotCi1AaXRlbSBvYmpkdW1wCi1EaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzCi0KLUBpdGVtIHJhbmxpYgotR2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZSBjb250ZW50cwotCi1AaXRlbSByZWFkZWxmCi1EaXNwbGF5IHRoZSBjb250ZW50cyBvZiBFTEYgZm9ybWF0IGZpbGVzLgotCi1AaXRlbSBzaXplCi1MaXN0IGZpbGUgc2VjdGlvbiBzaXplcyBhbmQgdG90YWwgc2l6ZQotCi1AaXRlbSBzdHJpbmdzCi1MaXN0IHByaW50YWJsZSBzdHJpbmdzIGZyb20gZmlsZXMKLQotQGl0ZW0gc3RyaXAKLURpc2NhcmQgc3ltYm9scwotCi1AaXRlbSBjKytmaWx0Ci1EZW1hbmdsZSBlbmNvZGVkIEMrKyBzeW1ib2xzIChvbiBNUy1ET1MsIHRoaXMgcHJvZ3JhbSBpcyBuYW1lZAotQGNvZGV7Y3h4ZmlsdH0pCi0KLUBpdGVtIGFkZHIybGluZQotQ29udmVydCBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMKLQotQGl0ZW0gbmxtY29udgotQ29udmVydCBvYmplY3QgY29kZSBpbnRvIGEgTmV0d2FyZSBMb2FkYWJsZSBNb2R1bGUKLQotQGl0ZW0gd2luZHJlcwotTWFuaXB1bGF0ZSBXaW5kb3dzIHJlc291cmNlcwotCi1AaXRlbSBkbGx0b29sCi1DcmVhdGUgdGhlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIER5bmFtaWMgTGluayBMaWJyYXJpZXMKLUBlbmQgdGFibGUKLUBlbmQgaWZ0ZXgKLQotQG1lbnUKLSogYXI6OiAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMKLSogbm06OiAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzCi0qIG9iamNvcHk6OgkJCUNvcHkgYW5kIHRyYW5zbGF0ZSBvYmplY3QgZmlsZXMKLSogb2JqZHVtcDo6ICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBpbmZvcm1hdGlvbiBmcm9tIG9iamVjdCBmaWxlcwotKiByYW5saWI6OiAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBpbmRleCB0byBhcmNoaXZlIGNvbnRlbnRzCi0qIHJlYWRlbGY6OgkJCURpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZXMuCi0qIHNpemU6OiAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgc2VjdGlvbiBzaXplcyBhbmQgdG90YWwgc2l6ZQotKiBzdHJpbmdzOjogICAgICAgICAgICAgICAgICAgICBMaXN0IHByaW50YWJsZSBzdHJpbmdzIGZyb20gZmlsZXMKLSogc3RyaXA6OiAgICAgICAgICAgICAgICAgICAgICAgRGlzY2FyZCBzeW1ib2xzCi0qIGMrK2ZpbHQ6OgkJCUZpbHRlciB0byBkZW1hbmdsZSBlbmNvZGVkIEMrKyBzeW1ib2xzCi0qIGN4eGZpbHQ6IGMrK2ZpbHQuICAgICAgICAgICAgIE1TLURPUyBuYW1lIGZvciBjKytmaWx0Ci0qIGFkZHIybGluZTo6CQkJQ29udmVydCBhZGRyZXNzZXMgdG8gZmlsZSBhbmQgbGluZQotKiBubG1jb252OjogICAgICAgICAgICAgICAgICAgICBDb252ZXJ0cyBvYmplY3QgY29kZSBpbnRvIGFuIE5MTQotKiB3aW5kcmVzOjoJCQlNYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0qIGRsbHRvb2w6OgkJCUNyZWF0ZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgYW5kIHVzZSBETExzCi0qIFNlbGVjdGluZyBUaGUgVGFyZ2V0IFN5c3RlbTo6IEhvdyB0aGVzZSB1dGlsaXRpZXMgZGV0ZXJtaW5lIHRoZSB0YXJnZXQuCi0qIFJlcG9ydGluZyBCdWdzOjogICAgICAgICAgICAgIFJlcG9ydGluZyBCdWdzCi0qIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4Ci1AZW5kIG1lbnUKLQotQG5vZGUgYXIKLUBjaGFwdGVyIGFyCi0KLUBraW5kZXggYXIKLUBjaW5kZXggYXJjaGl2ZXMKLUBjaW5kZXggY29sbGVjdGlvbnMgb2YgZmlsZXMKLUBzbWFsbGV4YW1wbGUKLWFyIFstXUB2YXJ7cH1bQHZhcnttb2R9IFtAdmFye3JlbHBvc31dIFtAdmFye2NvdW50fV1dIEB2YXJ7YXJjaGl2ZX0gW0B2YXJ7bWVtYmVyfUBkb3Rze31dCi1hciAtTSBbIDxtcmktc2NyaXB0IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2N7Z251fSBAY29kZXthcn0gcHJvZ3JhbSBjcmVhdGVzLCBtb2RpZmllcywgYW5kIGV4dHJhY3RzIGZyb20KLWFyY2hpdmVzLiAgQW4gQGRmbnthcmNoaXZlfSBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcgYSBjb2xsZWN0aW9uIG9mCi1vdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHJpZXZlCi10aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIEBkZm57bWVtYmVyc30gb2YgdGhlIGFyY2hpdmUpLgotCi1UaGUgb3JpZ2luYWwgZmlsZXMnIGNvbnRlbnRzLCBtb2RlIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGFuZAotZ3JvdXAgYXJlIHByZXNlcnZlZCBpbiB0aGUgYXJjaGl2ZSwgYW5kIGNhbiBiZSByZXN0b3JlZCBvbgotZXh0cmFjdGlvbi4gIAotCi1AY2luZGV4IG5hbWUgbGVuZ3RoCi1Ac2N7Z251fSBAY29kZXthcn0gY2FuIG1haW50YWluIGFyY2hpdmVzIHdob3NlIG1lbWJlcnMgaGF2ZSBuYW1lcyBvZiBhbnkKLWxlbmd0aDsgaG93ZXZlciwgZGVwZW5kaW5nIG9uIGhvdyBAY29kZXthcn0gaXMgY29uZmlndXJlZCBvbiB5b3VyCi1zeXN0ZW0sIGEgbGltaXQgb24gbWVtYmVyLW5hbWUgbGVuZ3RoIG1heSBiZSBpbXBvc2VkIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGFyY2hpdmUgZm9ybWF0cyBtYWludGFpbmVkIHdpdGggb3RoZXIgdG9vbHMuICBJZiBpdCBleGlzdHMsIHRoZQotbGltaXQgaXMgb2Z0ZW4gMTUgY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gYS5vdXQpIG9yIDE2Ci1jaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBjb2ZmKS4KLQotQGNpbmRleCBsaWJyYXJpZXMKLUBjb2Rle2FyfSBpcyBjb25zaWRlcmVkIGEgYmluYXJ5IHV0aWxpdHkgYmVjYXVzZSBhcmNoaXZlcyBvZiB0aGlzIHNvcnQKLWFyZSBtb3N0IG9mdGVuIHVzZWQgYXMgQGRmbntsaWJyYXJpZXN9IGhvbGRpbmcgY29tbW9ubHkgbmVlZGVkCi1zdWJyb3V0aW5lcy4KLQotQGNpbmRleCBzeW1ib2wgaW5kZXgKLUBjb2Rle2FyfSBjcmVhdGVzIGFuIGluZGV4IHRvIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gcmVsb2NhdGFibGUKLW9iamVjdCBtb2R1bGVzIGluIHRoZSBhcmNoaXZlIHdoZW4geW91IHNwZWNpZnkgdGhlIG1vZGlmaWVyIEBzYW1we3N9LgotT25jZSBjcmVhdGVkLCB0aGlzIGluZGV4IGlzIHVwZGF0ZWQgaW4gdGhlIGFyY2hpdmUgd2hlbmV2ZXIgQGNvZGV7YXJ9Ci1tYWtlcyBhIGNoYW5nZSB0byBpdHMgY29udGVudHMgKHNhdmUgZm9yIHRoZSBAc2FtcHtxfSB1cGRhdGUgb3BlcmF0aW9uKS4KLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLQotWW91IG1heSB1c2UgQHNhbXB7bm0gLXN9IG9yIEBzYW1we25tIC0tcHJpbnQtYXJtYXB9IHRvIGxpc3QgdGhpcyBpbmRleAotdGFibGUuICBJZiBhbiBhcmNoaXZlIGxhY2tzIHRoZSB0YWJsZSwgYW5vdGhlciBmb3JtIG9mIEBjb2Rle2FyfSBjYWxsZWQKLUBjb2Rle3JhbmxpYn0gY2FuIGJlIHVzZWQgdG8gYWRkIGp1c3QgdGhlIHRhYmxlLgotCi1AY2luZGV4IGNvbXBhdGliaWxpdHksIEBjb2Rle2FyfQotQGNpbmRleCBAY29kZXthcn0gY29tcGF0aWJpbGl0eQotQHNje2dudX0gQGNvZGV7YXJ9IGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0d28gZGlmZmVyZW50Ci1mYWNpbGl0aWVzLiAgWW91IGNhbiBjb250cm9sIGl0cyBhY3Rpdml0eSB1c2luZyBjb21tYW5kLWxpbmUgb3B0aW9ucywKLWxpa2UgdGhlIGRpZmZlcmVudCB2YXJpZXRpZXMgb2YgQGNvZGV7YXJ9IG9uIFVuaXggc3lzdGVtczsgb3IsIGlmIHlvdQotc3BlY2lmeSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19LCB5b3UgY2FuIGNvbnRyb2wgaXQKLXdpdGggYSBzY3JpcHQgc3VwcGxpZWQgdmlhIHN0YW5kYXJkIGlucHV0LCBsaWtlIHRoZSBNUkkgYGBsaWJyYXJpYW4nJwotcHJvZ3JhbS4KLQotQG1lbnUKLSogYXIgY21kbGluZTo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLSogYXIgc2NyaXB0czo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IHdpdGggYSBzY3JpcHQKLUBlbmQgbWVudQotCi1AcGFnZQotQG5vZGUgYXIgY21kbGluZQotQHNlY3Rpb24gQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLQotQHNtYWxsZXhhbXBsZQotYXIgWy1dQHZhcntwfVtAdmFye21vZH0gW0B2YXJ7cmVscG9zfV0gW0B2YXJ7Y291bnR9XV0gQHZhcnthcmNoaXZlfSBbQHZhcnttZW1iZXJ9QGRvdHN7fV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggVW5peCBjb21wYXRpYmlsaXR5LCBAY29kZXthcn0KLVdoZW4geW91IHVzZSBAY29kZXthcn0gaW4gdGhlIFVuaXggc3R5bGUsIEBjb2Rle2FyfSBpbnNpc3RzIG9uIGF0IGxlYXN0IHR3bwotYXJndW1lbnRzIHRvIGV4ZWN1dGU6IG9uZSBrZXlsZXR0ZXIgc3BlY2lmeWluZyB0aGUgQGVtcGh7b3BlcmF0aW9ufQotKG9wdGlvbmFsbHkgYWNjb21wYW5pZWQgYnkgb3RoZXIga2V5bGV0dGVycyBzcGVjaWZ5aW5nCi1AZW1waHttb2RpZmllcnN9KSwgYW5kIHRoZSBhcmNoaXZlIG5hbWUgdG8gYWN0IG9uLgotCi1Nb3N0IG9wZXJhdGlvbnMgY2FuIGFsc28gYWNjZXB0IGZ1cnRoZXIgQHZhcnttZW1iZXJ9IGFyZ3VtZW50cywKLXNwZWNpZnlpbmcgcGFydGljdWxhciBmaWxlcyB0byBvcGVyYXRlIG9uLgotCi1Ac2N7Z251fSBAY29kZXthcn0gYWxsb3dzIHlvdSB0byBtaXggdGhlIG9wZXJhdGlvbiBjb2RlIEB2YXJ7cH0gYW5kIG1vZGlmaWVyCi1mbGFncyBAdmFye21vZH0gaW4gYW55IG9yZGVyLCB3aXRoaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4KLQotSWYgeW91IHdpc2gsIHlvdSBtYXkgYmVnaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCB3aXRoIGEKLWRhc2guCi0KLUBjaW5kZXggb3BlcmF0aW9ucyBvbiBhcmNoaXZlCi1UaGUgQHZhcntwfSBrZXlsZXR0ZXIgc3BlY2lmaWVzIHdoYXQgb3BlcmF0aW9uIHRvIGV4ZWN1dGU7IGl0IG1heSBiZQotYW55IG9mIHRoZSBmb2xsb3dpbmcsIGJ1dCB5b3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIG9mIHRoZW06Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZAotQGNpbmRleCBkZWxldGluZyBmcm9tIGFyY2hpdmUKLUBlbXBoe0RlbGV0ZX0gbW9kdWxlcyBmcm9tIHRoZSBhcmNoaXZlLiAgU3BlY2lmeSB0aGUgbmFtZXMgb2YgbW9kdWxlcyB0bwotYmUgZGVsZXRlZCBhcyBAdmFye21lbWJlcn1AZG90c3t9OyB0aGUgYXJjaGl2ZSBpcyB1bnRvdWNoZWQgaWYgeW91Ci1zcGVjaWZ5IG5vIGZpbGVzIHRvIGRlbGV0ZS4KLQotSWYgeW91IHNwZWNpZnkgdGhlIEBzYW1we3Z9IG1vZGlmaWVyLCBAY29kZXthcn0gbGlzdHMgZWFjaCBtb2R1bGUKLWFzIGl0IGlzIGRlbGV0ZWQuCi0KLUBpdGVtIG0KLUBjaW5kZXggbW92aW5nIGluIGFyY2hpdmUKLVVzZSB0aGlzIG9wZXJhdGlvbiB0byBAZW1waHttb3ZlfSBtZW1iZXJzIGluIGFuIGFyY2hpdmUuCi0KLVRoZSBvcmRlcmluZyBvZiBtZW1iZXJzIGluIGFuIGFyY2hpdmUgY2FuIG1ha2UgYSBkaWZmZXJlbmNlIGluIGhvdwotcHJvZ3JhbXMgYXJlIGxpbmtlZCB1c2luZyB0aGUgbGlicmFyeSwgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBtb3JlCi10aGFuIG9uZSBtZW1iZXIuICAKLQotSWYgbm8gbW9kaWZpZXJzIGFyZSB1c2VkIHdpdGggQGNvZGV7bX0sIGFueSBtZW1iZXJzIHlvdSBuYW1lIGluIHRoZQotQHZhcnttZW1iZXJ9IGFyZ3VtZW50cyBhcmUgbW92ZWQgdG8gdGhlIEBlbXBoe2VuZH0gb2YgdGhlIGFyY2hpdmU7Ci15b3UgY2FuIHVzZSB0aGUgQHNhbXB7YX0sIEBzYW1we2J9LCBvciBAc2FtcHtpfSBtb2RpZmllcnMgdG8gbW92ZSB0aGVtIHRvIGEKLXNwZWNpZmllZCBwbGFjZSBpbnN0ZWFkLgotCi1AaXRlbSBwCi1AY2luZGV4IHByaW50aW5nIGZyb20gYXJjaGl2ZQotQGVtcGh7UHJpbnR9IHRoZSBzcGVjaWZpZWQgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSwgdG8gdGhlIHN0YW5kYXJkCi1vdXRwdXQgZmlsZS4gIElmIHRoZSBAc2FtcHt2fSBtb2RpZmllciBpcyBzcGVjaWZpZWQsIHNob3cgdGhlIG1lbWJlcgotbmFtZSBiZWZvcmUgY29weWluZyBpdHMgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LgotCi1JZiB5b3Ugc3BlY2lmeSBubyBAdmFye21lbWJlcn0gYXJndW1lbnRzLCBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIGFyZQotcHJpbnRlZC4KLQotQGl0ZW0gcQotQGNpbmRleCBxdWljayBhcHBlbmQgdG8gYXJjaGl2ZQotQGVtcGh7UXVpY2sgYXBwZW5kfTsgSGlzdG9yaWNhbGx5LCBhZGQgdGhlIGZpbGVzIEB2YXJ7bWVtYmVyfUBkb3Rze30gdG8gdGhlIGVuZCBvZgotQHZhcnthcmNoaXZlfSwgd2l0aG91dCBjaGVja2luZyBmb3IgcmVwbGFjZW1lbnQuCi0KLVRoZSBtb2RpZmllcnMgQHNhbXB7YX0sIEBzYW1we2J9LCBhbmQgQHNhbXB7aX0gZG8gQGVtcGh7bm90fSBhZmZlY3QgdGhpcwotb3BlcmF0aW9uOyBuZXcgbWVtYmVycyBhcmUgYWx3YXlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLgotCi1UaGUgbW9kaWZpZXIgQHNhbXB7dn0gbWFrZXMgQGNvZGV7YXJ9IGxpc3QgZWFjaCBmaWxlIGFzIGl0IGlzIGFwcGVuZGVkLgotCi1TaW5jZSB0aGUgcG9pbnQgb2YgdGhpcyBvcGVyYXRpb24gaXMgc3BlZWQsIHRoZSBhcmNoaXZlJ3Mgc3ltYm9sIHRhYmxlCi1pbmRleCBpcyBub3QgdXBkYXRlZCwgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQ7IHlvdSBjYW4gdXNlIEBzYW1we2FyIHN9IG9yCi1AY29kZXtyYW5saWJ9IGV4cGxpY2l0bHkgdG8gdXBkYXRlIHRoZSBzeW1ib2wgdGFibGUgaW5kZXguCi0KLUhvd2V2ZXIsIHRvbyBtYW55IGRpZmZlcmVudCBzeXN0ZW1zIGFzc3VtZSBxdWljayBhcHBlbmQgcmVidWlsZHMgdGhlCi1pbmRleCwgc28gR05VIGFyIGltcGxlbWVudHMgQGNvZGV7cX0gYXMgYSBzeW5vbnltIGZvciBAY29kZXtyfS4KLQotQGl0ZW0gcgotQGNpbmRleCByZXBsYWNlbWVudCBpbiBhcmNoaXZlCi1JbnNlcnQgdGhlIGZpbGVzIEB2YXJ7bWVtYmVyfUBkb3Rze30gaW50byBAdmFye2FyY2hpdmV9ICh3aXRoCi1AZW1waHtyZXBsYWNlbWVudH0pLiBUaGlzIG9wZXJhdGlvbiBkaWZmZXJzIGZyb20gQHNhbXB7cX0gaW4gdGhhdCBhbnkKLXByZXZpb3VzbHkgZXhpc3RpbmcgbWVtYmVycyBhcmUgZGVsZXRlZCBpZiB0aGVpciBuYW1lcyBtYXRjaCB0aG9zZSBiZWluZwotYWRkZWQuCi0KLUlmIG9uZSBvZiB0aGUgZmlsZXMgbmFtZWQgaW4gQHZhcnttZW1iZXJ9QGRvdHN7fSBkb2VzIG5vdCBleGlzdCwgQGNvZGV7YXJ9Ci1kaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlLCBhbmQgbGVhdmVzIHVuZGlzdHVyYmVkIGFueSBleGlzdGluZyBtZW1iZXJzCi1vZiB0aGUgYXJjaGl2ZSBtYXRjaGluZyB0aGF0IG5hbWUuCi0KLUJ5IGRlZmF1bHQsIG5ldyBtZW1iZXJzIGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOyBidXQgeW91IG1heQotdXNlIG9uZSBvZiB0aGUgbW9kaWZpZXJzIEBzYW1we2F9LCBAc2FtcHtifSwgb3IgQHNhbXB7aX0gdG8gcmVxdWVzdAotcGxhY2VtZW50IHJlbGF0aXZlIHRvIHNvbWUgZXhpc3RpbmcgbWVtYmVyLgotCi1UaGUgbW9kaWZpZXIgQHNhbXB7dn0gdXNlZCB3aXRoIHRoaXMgb3BlcmF0aW9uIGVsaWNpdHMgYSBsaW5lIG9mCi1vdXRwdXQgZm9yIGVhY2ggZmlsZSBpbnNlcnRlZCwgYWxvbmcgd2l0aCBvbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7YX0gb3IKLUBzYW1we3J9IHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGFwcGVuZGVkIChubyBvbGQgbWVtYmVyCi1kZWxldGVkKSBvciByZXBsYWNlZC4KLQotQGl0ZW0gdAotQGNpbmRleCBjb250ZW50cyBvZiBhcmNoaXZlCi1EaXNwbGF5IGEgQGVtcGh7dGFibGV9IGxpc3RpbmcgdGhlIGNvbnRlbnRzIG9mIEB2YXJ7YXJjaGl2ZX0sIG9yIHRob3NlCi1vZiB0aGUgZmlsZXMgbGlzdGVkIGluIEB2YXJ7bWVtYmVyfUBkb3Rze30gdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUKLWFyY2hpdmUuICBOb3JtYWxseSBvbmx5IHRoZSBtZW1iZXIgbmFtZSBpcyBzaG93bjsgaWYgeW91IGFsc28gd2FudCB0bwotc2VlIHRoZSBtb2RlcyAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBncm91cCwgYW5kIHNpemUsIHlvdSBjYW4KLXJlcXVlc3QgdGhhdCBieSBhbHNvIHNwZWNpZnlpbmcgdGhlIEBzYW1we3Z9IG1vZGlmaWVyLgotCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBAdmFye21lbWJlcn0sIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQotYXJlIGxpc3RlZC4KLQotQGNpbmRleCByZXBlYXRlZCBuYW1lcyBpbiBhcmNoaXZlCi1AY2luZGV4IG5hbWUgZHVwbGljYXRpb24gaW4gYXJjaGl2ZQotSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSAoc2F5LCBAc2FtcHtmaWV9KSBpbgotYW4gYXJjaGl2ZSAoc2F5IEBzYW1we2IuYX0pLCBAc2FtcHthciB0IGIuYSBmaWV9IGxpc3RzIG9ubHkgdGhlCi1maXJzdCBpbnN0YW5jZTsgdG8gc2VlIHRoZW0gYWxsLCB5b3UgbXVzdCBhc2sgZm9yIGEgY29tcGxldGUKLWxpc3RpbmctLS1pbiBvdXIgZXhhbXBsZSwgQHNhbXB7YXIgdCBiLmF9LgotQGMgV1JTIG9ubHk7IHBlciBHdW1ieSwgdGhpcyBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQsIGFuZCBpbiBhIG1vcmUKLUBjIHJlY2VudCBjYXNlIGluIGZhY3Qgd29ya3MgdGhlIG90aGVyIHdheS4KLQotQGl0ZW0geAotQGNpbmRleCBleHRyYWN0IGZyb20gYXJjaGl2ZQotQGVtcGh7RXh0cmFjdH0gbWVtYmVycyAobmFtZWQgQHZhcnttZW1iZXJ9KSBmcm9tIHRoZSBhcmNoaXZlLiAgWW91IGNhbgotdXNlIHRoZSBAc2FtcHt2fSBtb2RpZmllciB3aXRoIHRoaXMgb3BlcmF0aW9uLCB0byByZXF1ZXN0IHRoYXQKLUBjb2Rle2FyfSBsaXN0IGVhY2ggbmFtZSBhcyBpdCBleHRyYWN0cyBpdC4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgQHZhcnttZW1iZXJ9LCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBleHRyYWN0ZWQuCi0KLUBlbmQgdGFibGUKLQotQSBudW1iZXIgb2YgbW9kaWZpZXJzIChAdmFye21vZH0pIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEB2YXJ7cH0KLWtleWxldHRlciwgdG8gc3BlY2lmeSB2YXJpYXRpb25zIG9uIGFuIG9wZXJhdGlvbidzIGJlaGF2aW9yOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGEKLUBjaW5kZXggcmVsYXRpdmUgcGxhY2VtZW50IGluIGFyY2hpdmUKLUFkZCBuZXcgZmlsZXMgQGVtcGh7YWZ0ZXJ9IGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBAc2FtcHthfSwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgQHZhcntyZWxwb3N9IGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1AdmFye2FyY2hpdmV9IHNwZWNpZmljYXRpb24uCi0KLUBpdGVtIGIKLUFkZCBuZXcgZmlsZXMgQGVtcGh7YmVmb3JlfSBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgQHNhbXB7Yn0sIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIEB2YXJ7cmVscG9zfSBhcmd1bWVudCwgYmVmb3JlIHRoZQotQHZhcnthcmNoaXZlfSBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgQHNhbXB7aX0pLgotCi1AaXRlbSBjCi1AY2luZGV4IGNyZWF0aW5nIGFyY2hpdmVzCi1AZW1waHtDcmVhdGV9IHRoZSBhcmNoaXZlLiAgVGhlIHNwZWNpZmllZCBAdmFye2FyY2hpdmV9IGlzIGFsd2F5cwotY3JlYXRlZCBpZiBpdCBkaWQgbm90IGV4aXN0LCB3aGVuIHlvdSByZXF1ZXN0IGFuIHVwZGF0ZS4gIEJ1dCBhIHdhcm5pbmcgaXMKLWlzc3VlZCB1bmxlc3MgeW91IHNwZWNpZnkgaW4gYWR2YW5jZSB0aGF0IHlvdSBleHBlY3QgdG8gY3JlYXRlIGl0LCBieQotdXNpbmcgdGhpcyBtb2RpZmllci4KLQotQGl0ZW0gZgotVHJ1bmNhdGUgbmFtZXMgaW4gdGhlIGFyY2hpdmUuICBAc2N7Z251fSBAY29kZXthcn0gd2lsbCBub3JtYWxseSBwZXJtaXQgZmlsZQotbmFtZXMgb2YgYW55IGxlbmd0aC4gIFRoaXMgd2lsbCBjYXVzZSBpdCB0byBjcmVhdGUgYXJjaGl2ZXMgd2hpY2ggYXJlCi1ub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgQGNvZGV7YXJ9IHByb2dyYW0gb24gc29tZSBzeXN0ZW1zLiAgSWYKLXRoaXMgaXMgYSBjb25jZXJuLCB0aGUgQHNhbXB7Zn0gbW9kaWZpZXIgbWF5IGJlIHVzZWQgdG8gdHJ1bmNhdGUgZmlsZQotbmFtZXMgd2hlbiBwdXR0aW5nIHRoZW0gaW4gdGhlIGFyY2hpdmUuCi0KLUBpdGVtIGkKLUluc2VydCBuZXcgZmlsZXMgQGVtcGh7YmVmb3JlfSBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgQHNhbXB7aX0sIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIEB2YXJ7cmVscG9zfSBhcmd1bWVudCwgYmVmb3JlIHRoZQotQHZhcnthcmNoaXZlfSBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgQHNhbXB7Yn0pLgotCi1AaXRlbSBsCi1UaGlzIG1vZGlmaWVyIGlzIGFjY2VwdGVkIGJ1dCBub3QgdXNlZC4KLUBjIHdoYWZmb3IgYXIgbCBtb2RpZmllcj8/PyBwcmVzdW1hYmx5IGNvbXBhdDsgd2l0aAotQGMgd2hhdD8/Py0tLWRvY0BAY3lnbnVzLmNvbSwgMjVqYW45MSAKLQotQGl0ZW0gTgotVXNlcyB0aGUgQHZhcntjb3VudH0gcGFyYW1ldGVyLiAgVGhpcyBpcyB1c2VkIGlmIHRoZXJlIGFyZSBtdWx0aXBsZQotZW50cmllcyBpbiB0aGUgYXJjaGl2ZSB3aXRoIHRoZSBzYW1lIG5hbWUuICBFeHRyYWN0IG9yIGRlbGV0ZSBpbnN0YW5jZQotQHZhcntjb3VudH0gb2YgdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gbwotQGNpbmRleCBkYXRlcyBpbiBhcmNoaXZlCi1QcmVzZXJ2ZSB0aGUgQGVtcGh7b3JpZ2luYWx9IGRhdGVzIG9mIG1lbWJlcnMgd2hlbiBleHRyYWN0aW5nIHRoZW0uICBJZgoteW91IGRvIG5vdCBzcGVjaWZ5IHRoaXMgbW9kaWZpZXIsIGZpbGVzIGV4dHJhY3RlZCBmcm9tIHRoZSBhcmNoaXZlCi1hcmUgc3RhbXBlZCB3aXRoIHRoZSB0aW1lIG9mIGV4dHJhY3Rpb24uCi0KLUBpdGVtIFAKLVVzZSB0aGUgZnVsbCBwYXRoIG5hbWUgd2hlbiBtYXRjaGluZyBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4gIEBzY3tnbnV9Ci1AY29kZXthcn0gY2FuIG5vdCBjcmVhdGUgYW4gYXJjaGl2ZSB3aXRoIGEgZnVsbCBwYXRoIG5hbWUgKHN1Y2ggYXJjaGl2ZXMKLWFyZSBub3QgUE9TSVggY29tcGxhaW50KSwgYnV0IG90aGVyIGFyY2hpdmUgY3JlYXRvcnMgY2FuLiAgVGhpcyBvcHRpb24KLXdpbGwgY2F1c2UgQHNje2dudX0gQGNvZGV7YXJ9IHRvIG1hdGNoIGZpbGUgbmFtZXMgdXNpbmcgYSBjb21wbGV0ZSBwYXRoCi1uYW1lLCB3aGljaCBjYW4gYmUgY29udmVuaWVudCB3aGVuIGV4dHJhY3RpbmcgYSBzaW5nbGUgZmlsZSBmcm9tIGFuCi1hcmNoaXZlIGNyZWF0ZWQgYnkgYW5vdGhlciB0b29sLgotCi1AaXRlbSBzCi1AY2luZGV4IHdyaXRpbmcgYXJjaGl2ZSBpbmRleAotV3JpdGUgYW4gb2JqZWN0LWZpbGUgaW5kZXggaW50byB0aGUgYXJjaGl2ZSwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSwKLWV2ZW4gaWYgbm8gb3RoZXIgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGFyY2hpdmUuICBZb3UgbWF5IHVzZSB0aGlzIG1vZGlmaWVyCi1mbGFnIGVpdGhlciB3aXRoIGFueSBvcGVyYXRpb24sIG9yIGFsb25lLiAgUnVubmluZyBAc2FtcHthciBzfSBvbiBhbgotYXJjaGl2ZSBpcyBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgQHNhbXB7cmFubGlifSBvbiBpdC4KLQotQGl0ZW0gUwotQGNpbmRleCBub3Qgd3JpdGluZyBhcmNoaXZlIGluZGV4Ci1EbyBub3QgZ2VuZXJhdGUgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBUaGlzIGNhbiBzcGVlZCB1cCBidWlsZGluZyBhCi1sYXJnZSBsaWJyYXJ5IGluIHNldmVyYWwgc3RlcHMuICBUaGUgcmVzdWx0aW5nIGFyY2hpdmUgY2FuIG5vdCBiZSB1c2VkCi13aXRoIHRoZSBsaW5rZXIuICBJbiBvcmRlciB0byBidWlsZCBhIHN5bWJvbCB0YWJsZSwgeW91IG11c3Qgb21pdCB0aGUKLUBzYW1we1N9IG1vZGlmaWVyIG9uIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiBAc2FtcHthcn0sIG9yIHlvdSBtdXN0IHJ1bgotQHNhbXB7cmFubGlifSBvbiB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gdQotQGNpbmRleCB1cGRhdGluZyBhbiBhcmNoaXZlCi1Ob3JtYWxseSwgQHNhbXB7YXIgcn1AZG90c3t9IGluc2VydHMgYWxsIGZpbGVzCi1saXN0ZWQgaW50byB0aGUgYXJjaGl2ZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluc2VydCBAZW1waHtvbmx5fSB0aG9zZQotb2YgdGhlIGZpbGVzIHlvdSBsaXN0IHRoYXQgYXJlIG5ld2VyIHRoYW4gZXhpc3RpbmcgbWVtYmVycyBvZiB0aGUgc2FtZQotbmFtZXMsIHVzZSB0aGlzIG1vZGlmaWVyLiAgVGhlIEBzYW1we3V9IG1vZGlmaWVyIGlzIGFsbG93ZWQgb25seSBmb3IgdGhlCi1vcGVyYXRpb24gQHNhbXB7cn0gKHJlcGxhY2UpLiAgSW4gcGFydGljdWxhciwgdGhlIGNvbWJpbmF0aW9uIEBzYW1we3F1fSBpcwotbm90IGFsbG93ZWQsIHNpbmNlIGNoZWNraW5nIHRoZSB0aW1lc3RhbXBzIHdvdWxkIGxvc2UgYW55IHNwZWVkCi1hZHZhbnRhZ2UgZnJvbSB0aGUgb3BlcmF0aW9uIEBzYW1we3F9LgotCi1AaXRlbSB2Ci1UaGlzIG1vZGlmaWVyIHJlcXVlc3RzIHRoZSBAZW1waHt2ZXJib3NlfSB2ZXJzaW9uIG9mIGFuIG9wZXJhdGlvbi4gIE1hbnkKLW9wZXJhdGlvbnMgZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzdWNoIGFzIGZpbGVuYW1lcyBwcm9jZXNzZWQsCi13aGVuIHRoZSBtb2RpZmllciBAc2FtcHt2fSBpcyBhcHBlbmRlZC4KLQotQGl0ZW0gVgotVGhpcyBtb2RpZmllciBzaG93cyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7YXJ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBhciBzY3JpcHRzCi1Ac2VjdGlvbiBDb250cm9sbGluZyBAY29kZXthcn0gd2l0aCBhIHNjcmlwdAotCi1Ac21hbGxleGFtcGxlCi1hciAtTSBbIDxAdmFye3NjcmlwdH0gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9Ci1AY2luZGV4IHNjcmlwdHMsIEBjb2Rle2FyfQotSWYgeW91IHVzZSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19IHdpdGggQGNvZGV7YXJ9LCB5b3UKLWNhbiBjb250cm9sIGl0cyBvcGVyYXRpb24gd2l0aCBhIHJ1ZGltZW50YXJ5IGNvbW1hbmQgbGFuZ3VhZ2UuICBUaGlzCi1mb3JtIG9mIEBjb2Rle2FyfSBvcGVyYXRlcyBpbnRlcmFjdGl2ZWx5IGlmIHN0YW5kYXJkIGlucHV0IGlzIGNvbWluZwotZGlyZWN0bHkgZnJvbSBhIHRlcm1pbmFsLiAgRHVyaW5nIGludGVyYWN0aXZlIHVzZSwgQGNvZGV7YXJ9IHByb21wdHMgZm9yCi1pbnB1dCAodGhlIHByb21wdCBpcyBAc2FtcHtBUiA+fSksIGFuZCBjb250aW51ZXMgZXhlY3V0aW5nIGV2ZW4gYWZ0ZXIKLWVycm9ycy4gIElmIHlvdSByZWRpcmVjdCBzdGFuZGFyZCBpbnB1dCB0byBhIHNjcmlwdCBmaWxlLCBubyBwcm9tcHRzIGFyZQotaXNzdWVkLCBhbmQgQGNvZGV7YXJ9IGFiYW5kb25zIGV4ZWN1dGlvbiAod2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlKQotb24gYW55IGVycm9yLgotCi1UaGUgQGNvZGV7YXJ9IGNvbW1hbmQgbGFuZ3VhZ2UgaXMgQGVtcGh7bm90fSBkZXNpZ25lZCB0byBiZSBlcXVpdmFsZW50Ci10byB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnM7IGluIGZhY3QsIGl0IHByb3ZpZGVzIHNvbWV3aGF0IGxlc3MgY29udHJvbAotb3ZlciBhcmNoaXZlcy4gIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhlIGNvbW1hbmQgbGFuZ3VhZ2UgaXMgdG8gZWFzZSB0aGUKLXRyYW5zaXRpb24gdG8gQHNje2dudX0gQGNvZGV7YXJ9IGZvciBkZXZlbG9wZXJzIHdobyBhbHJlYWR5IGhhdmUgc2NyaXB0cwotd3JpdHRlbiBmb3IgdGhlIE1SSSBgYGxpYnJhcmlhbicnIHByb2dyYW0uCi0KLVRoZSBzeW50YXggZm9yIHRoZSBAY29kZXthcn0gY29tbWFuZCBsYW5ndWFnZSBpcyBzdHJhaWdodGZvcndhcmQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotY29tbWFuZHMgYXJlIHJlY29nbml6ZWQgaW4gdXBwZXIgb3IgbG93ZXIgY2FzZTsgZm9yIGV4YW1wbGUsIEBjb2Rle0xJU1R9Ci1pcyB0aGUgc2FtZSBhcyBAY29kZXtsaXN0fS4gIEluIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb25zLCBjb21tYW5kcyBhcmUKLXNob3duIGluIHVwcGVyIGNhc2UgZm9yIGNsYXJpdHkuCi0KLUBpdGVtCi1hIHNpbmdsZSBjb21tYW5kIG1heSBhcHBlYXIgb24gZWFjaCBsaW5lOyBpdCBpcyB0aGUgZmlyc3Qgd29yZCBvbiB0aGUKLWxpbmUuCi0KLUBpdGVtCi1lbXB0eSBsaW5lcyBhcmUgYWxsb3dlZCwgYW5kIGhhdmUgbm8gZWZmZWN0LgotCi1AaXRlbQotY29tbWVudHMgYXJlIGFsbG93ZWQ7IHRleHQgYWZ0ZXIgZWl0aGVyIG9mIHRoZSBjaGFyYWN0ZXJzIEBzYW1weyp9Ci1vciBAc2FtcHs7fSBpcyBpZ25vcmVkLgotCi1AaXRlbQotV2hlbmV2ZXIgeW91IHVzZSBhIGxpc3Qgb2YgbmFtZXMgYXMgcGFydCBvZiB0aGUgYXJndW1lbnQgdG8gYW4gQGNvZGV7YXJ9Ci1jb21tYW5kLCB5b3UgY2FuIHNlcGFyYXRlIHRoZSBpbmRpdmlkdWFsIG5hbWVzIHdpdGggZWl0aGVyIGNvbW1hcyBvcgotYmxhbmtzLiAgQ29tbWFzIGFyZSBzaG93biBpbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LCBmb3IgY2xhcml0eS4KLQotQGl0ZW0KLUBzYW1weyt9IGlzIHVzZWQgYXMgYSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXI7IGlmIEBzYW1weyt9IGFwcGVhcnMKLWF0IHRoZSBlbmQgb2YgYSBsaW5lLCB0aGUgdGV4dCBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXMgY29uc2lkZXJlZCBwYXJ0Ci1vZiB0aGUgY3VycmVudCBjb21tYW5kLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHRoZSBjb21tYW5kcyB5b3UgY2FuIHVzZSBpbiBAY29kZXthcn0gc2NyaXB0cywgb3Igd2hlbiB1c2luZwotQGNvZGV7YXJ9IGludGVyYWN0aXZlbHkuICBUaHJlZSBvZiB0aGVtIGhhdmUgc3BlY2lhbCBzaWduaWZpY2FuY2U6Ci0KLUBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0gc3BlY2lmeSBhIEBkZm57Y3VycmVudCBhcmNoaXZlfSwgd2hpY2ggaXMKLWEgdGVtcG9yYXJ5IGZpbGUgcmVxdWlyZWQgZm9yIG1vc3Qgb2YgdGhlIG90aGVyIGNvbW1hbmRzLgotCi1AY29kZXtTQVZFfSBjb21taXRzIHRoZSBjaGFuZ2VzIHNvIGZhciBzcGVjaWZpZWQgYnkgdGhlIHNjcmlwdC4gIFByaW9yCi10byBAY29kZXtTQVZFfSwgY29tbWFuZHMgYWZmZWN0IG9ubHkgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBjdXJyZW50Ci1hcmNoaXZlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEFERExJQiBAdmFye2FyY2hpdmV9IAotQGl0ZW14IEFERExJQiBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0pCi1BZGQgYWxsIHRoZSBjb250ZW50cyBvZiBAdmFye2FyY2hpdmV9IChvciwgaWYgc3BlY2lmaWVkLCBlYWNoIG5hbWVkCi1AdmFye21vZHVsZX0gZnJvbSBAdmFye2FyY2hpdmV9KSB0byB0aGUgY3VycmVudCBhcmNoaXZlLgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gQURETU9EIEB2YXJ7bWVtYmVyfSwgQHZhcnttZW1iZXJ9LCBAZG90c3t9IEB2YXJ7bWVtYmVyfQotQGMgRklYTUUhIHcvUmVwbGFjZW1lbnQ/PyAgSWYgc28sIGxpa2UgImFyIHIgQHZhcnthcmNoaXZlfSBAdmFye25hbWVzfSIKLUBjICAgICAgICBlbHNlIGxpa2UgImFyIHEuLi4iCi1BZGQgZWFjaCBuYW1lZCBAdmFye21lbWJlcn0gYXMgYSBtb2R1bGUgaW4gdGhlIGN1cnJlbnQgYXJjaGl2ZS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIENMRUFSCi1EaXNjYXJkIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcmNoaXZlLCBjYW5jZWxpbmcgdGhlIGVmZmVjdCBvZgotYW55IG9wZXJhdGlvbnMgc2luY2UgdGhlIGxhc3QgQGNvZGV7U0FWRX0uICBNYXkgYmUgZXhlY3V0ZWQgKHdpdGggbm8KLWVmZmVjdCkgZXZlbiBpZiAgbm8gY3VycmVudCBhcmNoaXZlIGlzIHNwZWNpZmllZC4KLQotQGl0ZW0gQ1JFQVRFIEB2YXJ7YXJjaGl2ZX0KLUNyZWF0ZXMgYW4gYXJjaGl2ZSwgYW5kIG1ha2VzIGl0IHRoZSBjdXJyZW50IGFyY2hpdmUgKHJlcXVpcmVkIGZvciBtYW55Ci1vdGhlciBjb21tYW5kcykuICBUaGUgbmV3IGFyY2hpdmUgaXMgY3JlYXRlZCB3aXRoIGEgdGVtcG9yYXJ5IG5hbWU7IGl0Ci1pcyBub3QgYWN0dWFsbHkgc2F2ZWQgYXMgQHZhcnthcmNoaXZlfSB1bnRpbCB5b3UgdXNlIEBjb2Rle1NBVkV9LgotWW91IGNhbiBvdmVyd3JpdGUgZXhpc3RpbmcgYXJjaGl2ZXM7IHNpbWlsYXJseSwgdGhlIGNvbnRlbnRzIG9mIGFueQotZXhpc3RpbmcgZmlsZSBuYW1lZCBAdmFye2FyY2hpdmV9IHdpbGwgbm90IGJlIGRlc3Ryb3llZCB1bnRpbCBAY29kZXtTQVZFfS4KLQotQGl0ZW0gREVMRVRFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRGVsZXRlIGVhY2ggbGlzdGVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmU7IGVxdWl2YWxlbnQgdG8KLUBzYW1we2FyIC1kIEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9IEBkb3Rze30gQHZhcnttb2R1bGV9fS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KQotQGl0ZW14IERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KSBAdmFye291dHB1dGZpbGV9Ci1MaXN0IGVhY2ggbmFtZWQgQHZhcnttb2R1bGV9IHByZXNlbnQgaW4gQHZhcnthcmNoaXZlfS4gIFRoZSBzZXBhcmF0ZQotY29tbWFuZCBAY29kZXtWRVJCT1NFfSBzcGVjaWZpZXMgdGhlIGZvcm0gb2YgdGhlIG91dHB1dDogd2hlbiB2ZXJib3NlCi1vdXRwdXQgaXMgb2ZmLCBvdXRwdXQgaXMgbGlrZSB0aGF0IG9mIEBzYW1we2FyIC10IEB2YXJ7YXJjaGl2ZX0KLUB2YXJ7bW9kdWxlfUBkb3Rze319LiAgV2hlbiB2ZXJib3NlIG91dHB1dCBpcyBvbiwgdGhlIGxpc3RpbmcgaXMgbGlrZQotQHNhbXB7YXIgLXR2IEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9QGRvdHN7fX0uCi0KLU91dHB1dCBub3JtYWxseSBnb2VzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtOyBob3dldmVyLCBpZiB5b3UKLXNwZWNpZnkgQHZhcntvdXRwdXRmaWxlfSBhcyBhIGZpbmFsIGFyZ3VtZW50LCBAY29kZXthcn0gZGlyZWN0cyB0aGUKLW91dHB1dCB0byB0aGF0IGZpbGUuCi0KLUBpdGVtIEVORAotRXhpdCBmcm9tIEBjb2Rle2FyfSwgd2l0aCBhIEBjb2RlezB9IGV4aXQgY29kZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsCi1jb21wbGV0aW9uLiAgVGhpcyBjb21tYW5kIGRvZXMgbm90IHNhdmUgdGhlIG91dHB1dCBmaWxlOyBpZiB5b3UgaGF2ZQotY2hhbmdlZCB0aGUgY3VycmVudCBhcmNoaXZlIHNpbmNlIHRoZSBsYXN0IEBjb2Rle1NBVkV9IGNvbW1hbmQsIHRob3NlCi1jaGFuZ2VzIGFyZSBsb3N0LgotCi1AaXRlbSBFWFRSQUNUIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRXh0cmFjdCBlYWNoIG5hbWVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmUsIHdyaXRpbmcgdGhlbQotaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgc2VwYXJhdGUgZmlsZXMuICBFcXVpdmFsZW50IHRvIEBzYW1we2FyIC14Ci1AdmFye2FyY2hpdmV9IEB2YXJ7bW9kdWxlfUBkb3Rze319LgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGlnbm9yZQotQGMgRklYTUUgVG9rZW5zIGJ1dCBubyBjb21tYW5kcz8/PwotQGl0ZW0gRlVMTERJUgotCi1AaXRlbSBIRUxQCi1AZW5kIGlnbm9yZQotCi1AaXRlbSBMSVNUCi1EaXNwbGF5IGZ1bGwgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJjaGl2ZSwgaW4gYGB2ZXJib3NlJycgc3R5bGUKLXJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIEBjb2Rle1ZFUkJPU0V9LiAgVGhlIGVmZmVjdCBpcyBsaWtlIEBzYW1we2FyCi10diBAdmFye2FyY2hpdmV9fS4gIChUaGlzIHNpbmdsZSBjb21tYW5kIGlzIGEgQHNje2dudX0gQGNvZGV7YXJ9Ci1lbmhhbmNlbWVudCwgcmF0aGVyIHRoYW4gcHJlc2VudCBmb3IgTVJJIGNvbXBhdGliaWxpdHkuKQotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gT1BFTiBAdmFye2FyY2hpdmV9Ci1PcGVucyBhbiBleGlzdGluZyBhcmNoaXZlIGZvciB1c2UgYXMgdGhlIGN1cnJlbnQgYXJjaGl2ZSAocmVxdWlyZWQgZm9yCi1tYW55IG90aGVyIGNvbW1hbmRzKS4gIEFueSBjaGFuZ2VzIGFzIHRoZSByZXN1bHQgb2Ygc3Vic2VxdWVudCBjb21tYW5kcwotd2lsbCBub3QgYWN0dWFsbHkgYWZmZWN0IEB2YXJ7YXJjaGl2ZX0gdW50aWwgeW91IG5leHQgdXNlIEBjb2Rle1NBVkV9LgotCi1AaXRlbSBSRVBMQUNFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotSW4gdGhlIGN1cnJlbnQgYXJjaGl2ZSwgcmVwbGFjZSBlYWNoIGV4aXN0aW5nIEB2YXJ7bW9kdWxlfSAobmFtZWQgaW4KLXRoZSBAY29kZXtSRVBMQUNFfSBhcmd1bWVudHMpIGZyb20gZmlsZXMgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi1UbyBleGVjdXRlIHRoaXMgY29tbWFuZCB3aXRob3V0IGVycm9ycywgYm90aCB0aGUgZmlsZSwgYW5kIHRoZSBtb2R1bGUgaW4KLXRoZSBjdXJyZW50IGFyY2hpdmUsIG11c3QgZXhpc3QuIAotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gVkVSQk9TRQotVG9nZ2xlIGFuIGludGVybmFsIGZsYWcgZ292ZXJuaW5nIHRoZSBvdXRwdXQgZnJvbSBAY29kZXtESVJFQ1RPUll9LgotV2hlbiB0aGUgZmxhZyBpcyBvbiwgQGNvZGV7RElSRUNUT1JZfSBvdXRwdXQgbWF0Y2hlcyBvdXRwdXQgZnJvbQotQHNhbXB7YXIgLXR2IH1AZG90c3t9LgotCi1AaXRlbSBTQVZFCi1Db21taXQgeW91ciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUsIGFuZCBhY3R1YWxseSBzYXZlIGl0IGFzIGEKLWZpbGUgd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIGxhc3QgQGNvZGV7Q1JFQVRFfSBvciBAY29kZXtPUEVOfQotY29tbWFuZC4gCi0KLVJlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgotCi1AZW5kIHRhYmxlCi0KLUBpZnRleAotQG5vZGUgbGQKLUBjaGFwdGVyIGxkCi1AY2luZGV4IGxpbmtlcgotQGtpbmRleCBsZAotVGhlIEBzY3tnbnV9IGxpbmtlciBAY29kZXtsZH0gaXMgbm93IGRlc2NyaWJlZCBpbiBhIHNlcGFyYXRlIG1hbnVhbC4KLUB4cmVme1RvcCwsIE92ZXJ2aWV3LCwgVXNpbmcgTEQ6IHRoZSBAc2N7Z251fSBsaW5rZXJ9LgotQGVuZCBpZnRleAotCi1Abm9kZSBubQotQGNoYXB0ZXIgbm0KLUBjaW5kZXggc3ltYm9scwotQGtpbmRleCBubQotCi1Ac21hbGxleGFtcGxlCi1ubSBbIC1hIHwgLS1kZWJ1Zy1zeW1zIF0gIFsgLWcgfCAtLWV4dGVybi1vbmx5IF0KLSAgIFsgLUIgXSAgWyAtQyB8IC0tZGVtYW5nbGUgXSBbIC1EIHwgLS1keW5hbWljIF0KLSAgIFsgLXMgfCAtLXByaW50LWFybWFwIF0gIFsgLUEgfCAtbyB8IC0tcHJpbnQtZmlsZS1uYW1lIF0KLSAgIFsgLW4gfCAtdiB8IC0tbnVtZXJpYy1zb3J0IF0gIFsgLXAgfCAtLW5vLXNvcnQgXQotICAgWyAtciB8IC0tcmV2ZXJzZS1zb3J0IF0gIFsgLS1zaXplLXNvcnQgXSBbIC11IHwgLS11bmRlZmluZWQtb25seSBdCi0gICBbIC10IEB2YXJ7cmFkaXh9IHwgLS1yYWRpeD1AdmFye3JhZGl4fSBdIFsgLVAgfCAtLXBvcnRhYmlsaXR5IF0KLSAgIFsgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdIFsgLWYgQHZhcntmb3JtYXR9IHwgLS1mb3JtYXQ9QHZhcntmb3JtYXR9IF0KLSAgIFsgLS1kZWZpbmVkLW9ubHkgXSBbLWwgfCAtLWxpbmUtbnVtYmVycyBdCi0gICBbIC0tbm8tZGVtYW5nbGUgXSBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0gIFsgQHZhcntvYmpmaWxlfUBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQHNje2dudX0gQGNvZGV7bm19IGxpc3RzIHRoZSBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzIEB2YXJ7b2JqZmlsZX1AZG90c3t9LgotSWYgbm8gb2JqZWN0IGZpbGVzIGFyZSBsaXN0ZWQgYXMgYXJndW1lbnRzLCBAY29kZXtubX0gYXNzdW1lcyB0aGUgZmlsZQotQGZpbGV7YS5vdXR9LgotCi1Gb3IgZWFjaCBzeW1ib2wsIEBjb2Rle25tfSBzaG93czoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBzeW1ib2wgdmFsdWUsIGluIHRoZSByYWRpeCBzZWxlY3RlZCBieSBvcHRpb25zIChzZWUgYmVsb3cpLCBvcgotaGV4YWRlY2ltYWwgYnkgZGVmYXVsdC4KLQotQGl0ZW0KLVRoZSBzeW1ib2wgdHlwZS4gIEF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHVzZWQ7IG90aGVycyBhcmUsIGFzCi13ZWxsLCBkZXBlbmRpbmcgb24gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIElmIGxvd2VyY2FzZSwgdGhlIHN5bWJvbCBpcwotbG9jYWw7IGlmIHVwcGVyY2FzZSwgdGhlIHN5bWJvbCBpcyBnbG9iYWwgKGV4dGVybmFsKS4KLQotQGMgU29tZSBtb3JlIGRldGFpbCBvbiBleGFjdGx5IHdoYXQgdGhlc2Ugc3ltYm9sIHR5cGVzIGFyZSB1c2VkIGZvcgotQGMgd291bGQgYmUgbmljZS4KLUB0YWJsZSBAY29kZQotQGl0ZW0gQQotVGhlIHN5bWJvbCdzIHZhbHVlIGlzIGFic29sdXRlLCBhbmQgd2lsbCBub3QgYmUgY2hhbmdlZCBieSBmdXJ0aGVyCi1saW5raW5nLgotCi1AaXRlbSBCCi1UaGUgc3ltYm9sIGlzIGluIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiAoa25vd24gYXMgQlNTKS4KLQotQGl0ZW0gQwotVGhlIHN5bWJvbCBpcyBjb21tb24uICBDb21tb24gc3ltYm9scyBhcmUgdW5pbml0aWFsaXplZCBkYXRhLiAgV2hlbgotbGlua2luZywgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgbWF5IGFwcGVhciB3aXRoIHRoZSBzYW1lIG5hbWUuICBJZiB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkIGFueXdoZXJlLCB0aGUgY29tbW9uIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgdW5kZWZpbmVkCi1yZWZlcmVuY2VzLiAgRm9yIG1vcmUgZGV0YWlscyBvbiBjb21tb24gc3ltYm9scywgc2VlIHRoZSBkaXNjdXNzaW9uIG9mCi0tLXdhcm4tY29tbW9uIGluIEByZWZ7T3B0aW9ucywsTGlua2VyIG9wdGlvbnMsbGQuaW5mbyxUaGUgR05VIGxpbmtlcn0uCi0KLUBpdGVtIEQKLVRoZSBzeW1ib2wgaXMgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbi4KLQotQGl0ZW0gRwotVGhlIHN5bWJvbCBpcyBpbiBhbiBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gZm9yIHNtYWxsIG9iamVjdHMuICBTb21lCi1vYmplY3QgZmlsZSBmb3JtYXRzIHBlcm1pdCBtb3JlIGVmZmljaWVudCBhY2Nlc3MgdG8gc21hbGwgZGF0YSBvYmplY3RzLAotc3VjaCBhcyBhIGdsb2JhbCBpbnQgdmFyaWFibGUgYXMgb3Bwb3NlZCB0byBhIGxhcmdlIGdsb2JhbCBhcnJheS4KLQotQGl0ZW0gSQotVGhlIHN5bWJvbCBpcyBhbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wuICBUaGlzIGlzIGEgR05VCi1leHRlbnNpb24gdG8gdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBpcyByYXJlbHkgdXNlZC4KLQotQGl0ZW0gTgotVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyBzeW1ib2wuCi0KLUBpdGVtIFIKLVRoZSBzeW1ib2wgaXMgaW4gYSByZWFkIG9ubHkgZGF0YSBzZWN0aW9uLgotCi1AaXRlbSBTCi1UaGUgc3ltYm9sIGlzIGluIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGZvciBzbWFsbCBvYmplY3RzLgotCi1AaXRlbSBUCi1UaGUgc3ltYm9sIGlzIGluIHRoZSB0ZXh0IChjb2RlKSBzZWN0aW9uLgotCi1AaXRlbSBVCi1UaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotQGl0ZW0gVgotVGhlIHN5bWJvbCBpcyBhIHdlYWsgb2JqZWN0LiAgV2hlbiBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgaXMgbGlua2VkIHdpdGgKLWEgbm9ybWFsIGRlZmluZWQgc3ltYm9sLCB0aGUgbm9ybWFsIGRlZmluZWQgc3ltYm9sIGlzIHVzZWQgd2l0aCBubyBlcnJvci4KLVdoZW4gYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wgaXMgbGlua2VkIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLAotdGhlIHZhbHVlIG9mIHRoZSB3ZWFrIHN5bWJvbCBiZWNvbWVzIHplcm8gd2l0aCBubyBlcnJvci4KLQotQGl0ZW0gVwotVGhlIHN5bWJvbCBpcyBhIHdlYWsgc3ltYm9sIHRoYXQgaGFzIG5vdCBiZWVuIHNwZWNpZmljYWxseSB0YWdnZWQgYXMgYQotd2VhayBvYmplY3Qgc3ltYm9sLiAgV2hlbiBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgaXMgbGlua2VkIHdpdGggYSBub3JtYWwKLWRlZmluZWQgc3ltYm9sLCB0aGUgbm9ybWFsIGRlZmluZWQgc3ltYm9sIGlzIHVzZWQgd2l0aCBubyBlcnJvci4KLVdoZW4gYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wgaXMgbGlua2VkIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLAotdGhlIHZhbHVlIG9mIHRoZSB3ZWFrIHN5bWJvbCBiZWNvbWVzIHplcm8gd2l0aCBubyBlcnJvci4KLQotQGl0ZW0gLQotVGhlIHN5bWJvbCBpcyBhIHN0YWJzIHN5bWJvbCBpbiBhbiBhLm91dCBvYmplY3QgZmlsZS4gIEluIHRoaXMgY2FzZSwgdGhlCi1uZXh0IHZhbHVlcyBwcmludGVkIGFyZSB0aGUgc3RhYnMgb3RoZXIgZmllbGQsIHRoZSBzdGFicyBkZXNjIGZpZWxkLCBhbmQKLXRoZSBzdGFiIHR5cGUuICBTdGFicyBzeW1ib2xzIGFyZSB1c2VkIHRvIGhvbGQgZGVidWdnaW5nIGluZm9ybWF0aW9uOwotZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme1RvcCxTdGFicyxTdGFicyBPdmVydmlldyxzdGFicy5pbmZvLCBUaGUKLWBgc3RhYnMnJyBkZWJ1ZyBmb3JtYXR9LgotCi1AaXRlbSA/Ci1UaGUgc3ltYm9sIHR5cGUgaXMgdW5rbm93biwgb3Igb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmljLgotQGVuZCB0YWJsZQotCi1AaXRlbQotVGhlIHN5bWJvbCBuYW1lLgotQGVuZCBpdGVtaXplCi0KLVRoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCi1lcXVpdmFsZW50LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1BCi1AaXRlbXggLW8KLUBpdGVteCAtLXByaW50LWZpbGUtbmFtZSAKLUBjaW5kZXggaW5wdXQgZmlsZSBuYW1lCi1AY2luZGV4IGZpbGUgbmFtZQotQGNpbmRleCBzb3VyY2UgZmlsZSBuYW1lCi1QcmVjZWRlIGVhY2ggc3ltYm9sIGJ5IHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIChvciBhcmNoaXZlIG1lbWJlcikKLWluIHdoaWNoIGl0IHdhcyBmb3VuZCwgcmF0aGVyIHRoYW4gaWRlbnRpZnlpbmcgdGhlIGlucHV0IGZpbGUgb25jZSBvbmx5LAotYmVmb3JlIGFsbCBvZiBpdHMgc3ltYm9scy4KLQotQGl0ZW0gLWEKLUBpdGVteCAtLWRlYnVnLXN5bXMgCi1AY2luZGV4IGRlYnVnZ2luZyBzeW1ib2xzCi1EaXNwbGF5IGFsbCBzeW1ib2xzLCBldmVuIGRlYnVnZ2VyLW9ubHkgc3ltYm9sczsgbm9ybWFsbHkgdGhlc2UgYXJlIG5vdAotbGlzdGVkLgotCi1AaXRlbSAtQgotQGNpbmRleCBAY29kZXtubX0gZm9ybWF0Ci1AY2luZGV4IEBjb2Rle25tfSBjb21wYXRpYmlsaXR5Ci1UaGUgc2FtZSBhcyBAc2FtcHstLWZvcm1hdD1ic2R9IChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNSVBTIEBjb2Rle25tfSkuCi0KLUBpdGVtIC1DCi1AaXRlbXggLS1kZW1hbmdsZQotQGNpbmRleCBkZW1hbmdsaW5nIGluIG5tCi1EZWNvZGUgKEBkZm57ZGVtYW5nbGV9KSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLiAgQHhyZWZ7YysrZmlsdH0sIGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiBkZW1hbmdsaW5nLgotCi1AaXRlbSAtLW5vLWRlbWFuZ2xlCi1EbyBub3QgZGVtYW5nbGUgbG93LWxldmVsIHN5bWJvbCBuYW1lcy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0KLUBpdGVtIC1ECi1AaXRlbXggLS1keW5hbWljCi1AY2luZGV4IGR5bmFtaWMgc3ltYm9scwotRGlzcGxheSB0aGUgZHluYW1pYyBzeW1ib2xzIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgc3ltYm9scy4gIFRoaXMgaXMKLW9ubHkgbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4gdHlwZXMgb2Ygc2hhcmVkCi1saWJyYXJpZXMuCi0KLUBpdGVtIC1mIEB2YXJ7Zm9ybWF0fQotQGl0ZW14IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQotQGNpbmRleCBAY29kZXtubX0gZm9ybWF0Ci1AY2luZGV4IEBjb2Rle25tfSBjb21wYXRpYmlsaXR5Ci1Vc2UgdGhlIG91dHB1dCBmb3JtYXQgQHZhcntmb3JtYXR9LCB3aGljaCBjYW4gYmUgQGNvZGV7YnNkfSwKLUBjb2Rle3N5c3Z9LCBvciBAY29kZXtwb3NpeH0uICBUaGUgZGVmYXVsdCBpcyBAY29kZXtic2R9LgotT25seSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIEB2YXJ7Zm9ybWF0fSBpcyBzaWduaWZpY2FudDsgaXQgY2FuIGJlCi1laXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZS4KLQotQGl0ZW0gLWcKLUBpdGVteCAtLWV4dGVybi1vbmx5IAotQGNpbmRleCBleHRlcm5hbCBzeW1ib2xzCi1EaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scy4KLQotQGl0ZW0gLWwKLUBpdGVteCAtLWxpbmUtbnVtYmVycwotQGNpbmRleCBzeW1ib2wgbGluZSBudW1iZXJzCi1Gb3IgZWFjaCBzeW1ib2wsIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdHJ5IHRvIGZpbmQgYSBmaWxlbmFtZSBhbmQKLWxpbmUgbnVtYmVyLiAgRm9yIGEgZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLWFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIEZvciBhbiB1bmRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZQotbnVtYmVyIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHN5bWJvbC4gIElmIGxpbmUgbnVtYmVyCi1pbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQsIHByaW50IGl0IGFmdGVyIHRoZSBvdGhlciBzeW1ib2wgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1uCi1AaXRlbXggLXYKLUBpdGVteCAtLW51bWVyaWMtc29ydCAKLVNvcnQgc3ltYm9scyBudW1lcmljYWxseSBieSB0aGVpciBhZGRyZXNzZXMsIHJhdGhlciB0aGFuIGFscGhhYmV0aWNhbGx5Ci1ieSB0aGVpciBuYW1lcy4gCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1uby1zb3J0IAotQGNpbmRleCBzb3J0aW5nIHN5bWJvbHMKLURvIG5vdCBib3RoZXIgdG8gc29ydCB0aGUgc3ltYm9scyBpbiBhbnkgb3JkZXI7IHByaW50IHRoZW0gaW4gdGhlIG9yZGVyCi1lbmNvdW50ZXJlZC4KLQotQGl0ZW0gLVAKLUBpdGVteCAtLXBvcnRhYmlsaXR5Ci1Vc2UgdGhlIFBPU0lYLjIgc3RhbmRhcmQgb3V0cHV0IGZvcm1hdCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvcm1hdC4KLUVxdWl2YWxlbnQgdG8gQHNhbXB7LWYgcG9zaXh9LgotCi1AaXRlbSAtcwotQGl0ZW14IC0tcHJpbnQtYXJtYXAKLUBjaW5kZXggc3ltYm9sIGluZGV4LCBsaXN0aW5nCi1XaGVuIGxpc3Rpbmcgc3ltYm9scyBmcm9tIGFyY2hpdmUgbWVtYmVycywgaW5jbHVkZSB0aGUgaW5kZXg6IGEgbWFwcGluZwotKHN0b3JlZCBpbiB0aGUgYXJjaGl2ZSBieSBAY29kZXthcn0gb3IgQGNvZGV7cmFubGlifSkgb2Ygd2hpY2ggbW9kdWxlcwotY29udGFpbiBkZWZpbml0aW9ucyBmb3Igd2hpY2ggbmFtZXMuCi0KLUBpdGVtIC1yCi1AaXRlbXggLS1yZXZlcnNlLXNvcnQgCi1SZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc29ydCAod2hldGhlciBudW1lcmljIG9yIGFscGhhYmV0aWMpOyBsZXQgdGhlCi1sYXN0IGNvbWUgZmlyc3QuCi0KLUBpdGVtIC0tc2l6ZS1zb3J0Ci1Tb3J0IHN5bWJvbHMgYnkgc2l6ZS4gIFRoZSBzaXplIGlzIGNvbXB1dGVkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLXRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB3aXRoIHRoZSBuZXh0IGhpZ2hlcgotdmFsdWUuICBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIHByaW50ZWQsIHJhdGhlciB0aGFuIHRoZSB2YWx1ZS4KLQotQGl0ZW0gLXQgQHZhcntyYWRpeH0KLUBpdGVteCAtLXJhZGl4PUB2YXJ7cmFkaXh9Ci1Vc2UgQHZhcntyYWRpeH0gYXMgdGhlIHJhZGl4IGZvciBwcmludGluZyB0aGUgc3ltYm9sIHZhbHVlcy4gIEl0IG11c3QgYmUKLUBzYW1we2R9IGZvciBkZWNpbWFsLCBAc2FtcHtvfSBmb3Igb2N0YWwsIG9yIEBzYW1we3h9IGZvciBoZXhhZGVjaW1hbC4KLQotQGl0ZW0gLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLXUKLUBpdGVteCAtLXVuZGVmaW5lZC1vbmx5IAotQGNpbmRleCBleHRlcm5hbCBzeW1ib2xzCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2xzCi1EaXNwbGF5IG9ubHkgdW5kZWZpbmVkIHN5bWJvbHMgKHRob3NlIGV4dGVybmFsIHRvIGVhY2ggb2JqZWN0IGZpbGUpLgotCi1AaXRlbSAtLWRlZmluZWQtb25seQotQGNpbmRleCBleHRlcm5hbCBzeW1ib2xzCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2xzCi1EaXNwbGF5IG9ubHkgZGVmaW5lZCBzeW1ib2xzIGZvciBlYWNoIG9iamVjdCBmaWxlLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7bm19IGFuZCBleGl0LgotCi1AaXRlbSAtLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle25tfSBhbmQgZXhpdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgb2JqY29weQotQGNoYXB0ZXIgb2JqY29weQotCi1Ac21hbGxleGFtcGxlCi1vYmpjb3B5IFsgLUYgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1JIEB2YXJ7YmZkbmFtZX0gfCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtTyBAdmFye2JmZG5hbWV9IHwgLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1TIHwgLS1zdHJpcC1hbGwgXSAgWyAtZyB8IC0tc3RyaXAtZGVidWcgXQotICAgICAgICBbIC1LIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLWtlZXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgICBbIC1OIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgICAgWyAtTCBAdmFye3N5bWJvbG5hbWV9IHwgLS1sb2NhbGl6ZS1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICAgIFsgLVcgQHZhcntzeW1ib2xuYW1lfSB8IC0td2Vha2VuLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgICAgWyAteCB8IC0tZGlzY2FyZC1hbGwgXSAgWyAtWCB8IC0tZGlzY2FyZC1sb2NhbHMgXQotICAgICAgICBbIC1iIEB2YXJ7Ynl0ZX0gfCAtLWJ5dGU9QHZhcntieXRlfSBdCi0gICAgICAgIFsgLWkgQHZhcntpbnRlcmxlYXZlfSB8IC0taW50ZXJsZWF2ZT1AdmFye2ludGVybGVhdmV9IF0KLSAgICAgICAgWyAtaiBAdmFye3NlY3Rpb25uYW1lfSB8IC0tb25seS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9IF0KLSAgICAgICAgWyAtUiBAdmFye3NlY3Rpb25uYW1lfSB8IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0gXQotICAgICAgICBbIC1wIHwgLS1wcmVzZXJ2ZS1kYXRlcyBdIFsgLS1kZWJ1Z2dpbmcgXQotICAgICAgICBbIC0tZ2FwLWZpbGw9QHZhcnt2YWx9IF0gWyAtLXBhZC10bz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXNldC1zdGFydD1AdmFye3ZhbH0gXSBbIC0tYWRqdXN0LXN0YXJ0PUB2YXJ7aW5jcn0gXQotICAgICAgICBbIC0tY2hhbmdlLWFkZHJlc3Nlcz1AdmFye2luY3J9IF0KLSAgICAgICAgWyAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3M9QHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utc2VjdGlvbi1sbWE9QHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utc2VjdGlvbi12bWE9QHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utd2FybmluZ3MgXSBbIC0tbm8tY2hhbmdlLXdhcm5pbmdzIF0KLSAgICAgICAgWyAtLXNldC1zZWN0aW9uLWZsYWdzPUB2YXJ7c2VjdGlvbn09QHZhcntmbGFnc30gXQotICAgICAgICBbIC0tYWRkLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX09QHZhcntmaWxlbmFtZX0gXQotICAgICAgICBbIC0tY2hhbmdlLWxlYWRpbmctY2hhciBdIFsgLS1yZW1vdmUtbGVhZGluZy1jaGFyIF0KLSAgICAgICAgWyAtLXdlYWtlbiBdCi0gICAgICAgIFsgLXYgfCAtLXZlcmJvc2UgXSBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0KLSAgICAgICAgQHZhcntpbmZpbGV9IFtAdmFye291dGZpbGV9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzY3tnbnV9IEBjb2Rle29iamNvcHl9IHV0aWxpdHkgY29waWVzIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3QKLWZpbGUgdG8gYW5vdGhlci4gIEBjb2Rle29iamNvcHl9IHVzZXMgdGhlIEBzY3tnbnV9IEBzY3tiZmR9IExpYnJhcnkgdG8KLXJlYWQgYW5kIHdyaXRlIHRoZSBvYmplY3QgZmlsZXMuICBJdCBjYW4gd3JpdGUgdGhlIGRlc3RpbmF0aW9uIG9iamVjdAotZmlsZSBpbiBhIGZvcm1hdCBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIHRoZSBzb3VyY2Ugb2JqZWN0IGZpbGUuICBUaGUKLWV4YWN0IGJlaGF2aW9yIG9mIEBjb2Rle29iamNvcHl9IGlzIGNvbnRyb2xsZWQgYnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0KLUBjb2Rle29iamNvcHl9IGNyZWF0ZXMgdGVtcG9yYXJ5IGZpbGVzIHRvIGRvIGl0cyB0cmFuc2xhdGlvbnMgYW5kCi1kZWxldGVzIHRoZW0gYWZ0ZXJ3YXJkLiAgQGNvZGV7b2JqY29weX0gdXNlcyBAc2N7YmZkfSB0byBkbyBhbGwgaXRzCi10cmFuc2xhdGlvbiB3b3JrOyBpdCBoYXMgYWNjZXNzIHRvIGFsbCB0aGUgZm9ybWF0cyBkZXNjcmliZWQgaW4gQHNje2JmZH0KLWFuZCB0aHVzIGlzIGFibGUgdG8gcmVjb2duaXplIG1vc3QgZm9ybWF0cyB3aXRob3V0IGJlaW5nIHRvbGQKLWV4cGxpY2l0bHkuICBAeHJlZntCRkQsLEJGRCxsZC5pbmZvLFVzaW5nIExEfS4KLQotQGNvZGV7b2JqY29weX0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgUy1yZWNvcmRzIGJ5IHVzaW5nIGFuIG91dHB1dAotdGFyZ2V0IG9mIEBzYW1we3NyZWN9IChlLmcuLCB1c2UgQHNhbXB7LU8gc3JlY30pLgotCi1AY29kZXtvYmpjb3B5fSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHJhdyBiaW5hcnkgZmlsZSBieSB1c2luZyBhbgotb3V0cHV0IHRhcmdldCBvZiBAc2FtcHtiaW5hcnl9IChlLmcuLCB1c2UgQHNhbXB7LU8gYmluYXJ5fSkuICBXaGVuCi1AY29kZXtvYmpjb3B5fSBnZW5lcmF0ZXMgYSByYXcgYmluYXJ5IGZpbGUsIGl0IHdpbGwgZXNzZW50aWFsbHkgcHJvZHVjZQotYSBtZW1vcnkgZHVtcCBvZiB0aGUgY29udGVudHMgb2YgdGhlIGlucHV0IG9iamVjdCBmaWxlLiAgQWxsIHN5bWJvbHMgYW5kCi1yZWxvY2F0aW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgZGlzY2FyZGVkLiAgVGhlIG1lbW9yeSBkdW1wIHdpbGwgc3RhcnQgYXQKLXRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIGxvd2VzdCBzZWN0aW9uIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLQotV2hlbiBnZW5lcmF0aW5nIGFuIFMtcmVjb3JkIG9yIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCBtYXkgYmUgaGVscGZ1bCB0bwotdXNlIEBzYW1wey1TfSB0byByZW1vdmUgc2VjdGlvbnMgY29udGFpbmluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJbgotc29tZSBjYXNlcyBAc2FtcHstUn0gd2lsbCBiZSB1c2VmdWwgdG8gcmVtb3ZlIHNlY3Rpb25zIHdoaWNoIGNvbnRhaW4KLWluZm9ybWF0aW9uIHRoYXQgaXMgbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntpbmZpbGV9Ci1AaXRlbXggQHZhcntvdXRmaWxlfQotVGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMsIHJlc3BlY3RpdmVseS4KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBAdmFye291dGZpbGV9LCBAY29kZXtvYmpjb3B5fSBjcmVhdGVzIGEKLXRlbXBvcmFyeSBmaWxlIGFuZCBkZXN0cnVjdGl2ZWx5IHJlbmFtZXMgdGhlIHJlc3VsdCB3aXRoCi10aGUgbmFtZSBvZiBAdmFye2luZmlsZX0uCi0KLUBpdGVtIC1JIEB2YXJ7YmZkbmFtZX0JCi1AaXRlbXggLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotQ29uc2lkZXIgdGhlIHNvdXJjZSBmaWxlJ3Mgb2JqZWN0IGZvcm1hdCB0byBiZSBAdmFye2JmZG5hbWV9LCByYXRoZXIgdGhhbgotYXR0ZW1wdGluZyB0byBkZWR1Y2UgaXQuICBAeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1PIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotV3JpdGUgdGhlIG91dHB1dCBmaWxlIHVzaW5nIHRoZSBvYmplY3QgZm9ybWF0IEB2YXJ7YmZkbmFtZX0uCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1GIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1Vc2UgQHZhcntiZmRuYW1lfSBhcyB0aGUgb2JqZWN0IGZvcm1hdCBmb3IgYm90aCB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQKLWZpbGU7IGkuZS4sIHNpbXBseSB0cmFuc2ZlciBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdpdGggbm8KLXRyYW5zbGF0aW9uLiAgQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtaiBAdmFye3NlY3Rpb25uYW1lfQotQGl0ZW14IC0tb25seS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9Ci1Db3B5IG9ubHkgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgaW5wdXQgZmlsZSB0byB0aGUgb3V0cHV0IGZpbGUuCi1UaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24KLWluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUgb3V0cHV0IGZpbGUgdW51c2FibGUuCi0KLUBpdGVtIC1SIEB2YXJ7c2VjdGlvbm5hbWV9Ci1AaXRlbXggLS1yZW1vdmUtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfQotUmVtb3ZlIGFueSBzZWN0aW9uIG5hbWVkIEB2YXJ7c2VjdGlvbm5hbWV9IGZyb20gdGhlIG91dHB1dCBmaWxlLiAgVGhpcwotb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG9wdGlvbgotaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZSBvdXRwdXQgZmlsZSB1bnVzYWJsZS4KLQotQGl0ZW0gLVMKLUBpdGVteCAtLXN0cmlwLWFsbAotRG8gbm90IGNvcHkgcmVsb2NhdGlvbiBhbmQgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gdGhlIHNvdXJjZSBmaWxlLgotCi1AaXRlbSAtZwotQGl0ZW14IC0tc3RyaXAtZGVidWcKLURvIG5vdCBjb3B5IGRlYnVnZ2luZyBzeW1ib2xzIGZyb20gdGhlIHNvdXJjZSBmaWxlLgotCi1AaXRlbSAtLXN0cmlwLXVubmVlZGVkCi1TdHJpcCBhbGwgc3ltYm9scyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciByZWxvY2F0aW9uIHByb2Nlc3NpbmcuCi0KLUBpdGVtIC1LIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLWtlZXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLUNvcHkgb25seSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgb3B0aW9uIG1heQotYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0KLUBpdGVtIC1OIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1EbyBub3QgY29weSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0KLUBpdGVtIC1MIEB2YXJ7c3ltYm9sbmFtZX0KLUBpdGVteCAtLWxvY2FsaXplLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1NYWtlIHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGxvY2FsIHRvIHRoZSBmaWxlLCBzbyB0aGF0IGl0IGlzIG5vdAotdmlzaWJsZSBleHRlcm5hbGx5LiAgVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtVyBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS13ZWFrZW4tc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLU1ha2Ugc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gd2Vhay4gVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAteAotQGl0ZW14IC0tZGlzY2FyZC1hbGwKLURvIG5vdCBjb3B5IG5vbi1nbG9iYWwgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLUBjIEZJWE1FIGFueSByZWFzb24gdG8gcHJlZmVyICJub24tZ2xvYmFsIiB0byAibG9jYWwiIGhlcmU/Ci0KLUBpdGVtIC1YCi1AaXRlbXggLS1kaXNjYXJkLWxvY2FscwotRG8gbm90IGNvcHkgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuCi0oVGhlc2UgdXN1YWxseSBzdGFydCB3aXRoIEBzYW1we0x9IG9yIEBzYW1wey59LikKLQotQGl0ZW0gLWIgQHZhcntieXRlfQotQGl0ZW14IC0tYnl0ZT1AdmFye2J5dGV9Ci1LZWVwIG9ubHkgZXZlcnkgQHZhcntieXRlfXRoIGJ5dGUgb2YgdGhlIGlucHV0IGZpbGUgKGhlYWRlciBkYXRhIGlzIG5vdAotYWZmZWN0ZWQpLiAgQHZhcntieXRlfSBjYW4gYmUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byBAdmFye2ludGVybGVhdmV9LTEsCi13aGVyZSBAdmFye2ludGVybGVhdmV9IGlzIGdpdmVuIGJ5IHRoZSBAc2FtcHstaX0gb3IgQHNhbXB7LS1pbnRlcmxlYXZlfQotb3B0aW9uLCBvciB0aGUgZGVmYXVsdCBvZiA0LiAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIGZvciBjcmVhdGluZyBmaWxlcwotdG8gcHJvZ3JhbSBAc2N7cm9tfS4gIEl0IGlzIHR5cGljYWxseSB1c2VkIHdpdGggYW4gQGNvZGV7c3JlY30gb3V0cHV0Ci10YXJnZXQuCi0KLUBpdGVtIC1pIEB2YXJ7aW50ZXJsZWF2ZX0KLUBpdGVteCAtLWludGVybGVhdmU9QHZhcntpbnRlcmxlYXZlfQotT25seSBjb3B5IG9uZSBvdXQgb2YgZXZlcnkgQHZhcntpbnRlcmxlYXZlfSBieXRlcy4gIFNlbGVjdCB3aGljaCBieXRlIHRvCi1jb3B5IHdpdGggdGhlIEB2YXJ7LWJ9IG9yIEBzYW1wey0tYnl0ZX0gb3B0aW9uLiAgVGhlIGRlZmF1bHQgaXMgNC4KLUBjb2Rle29iamNvcHl9IGlnbm9yZXMgdGhpcyBvcHRpb24gaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGVpdGhlciBAc2FtcHstYn0gb3IKLUBzYW1wey0tYnl0ZX0uCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1wcmVzZXJ2ZS1kYXRlcwotU2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgdGhlIHNhbWUKLWFzIHRob3NlIG9mIHRoZSBpbnB1dCBmaWxlLgotCi1AaXRlbSAtLWRlYnVnZ2luZwotQ29udmVydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIHBvc3NpYmxlLiAgVGhpcyBpcyBub3QgdGhlIGRlZmF1bHQKLWJlY2F1c2Ugb25seSBjZXJ0YWluIGRlYnVnZ2luZyBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQsIGFuZCB0aGUKLWNvbnZlcnNpb24gcHJvY2VzcyBjYW4gYmUgdGltZSBjb25zdW1pbmcuCi0KLUBpdGVtIC0tZ2FwLWZpbGwgQHZhcnt2YWx9Ci1GaWxsIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyB3aXRoIEB2YXJ7dmFsfS4gIFRoaXMgb3BlcmF0aW9uIGFwcGxpZXMgdG8KLXRoZSBAZW1waHtsb2FkIGFkZHJlc3N9IChMTUEpIG9mIHRoZSBzZWN0aW9ucy4gIEl0IGlzIGRvbmUgYnkgaW5jcmVhc2luZwotdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgbG93ZXIgYWRkcmVzcywgYW5kIGZpbGxpbmcgaW4gdGhlIGV4dHJhCi1zcGFjZSBjcmVhdGVkIHdpdGggQHZhcnt2YWx9LgotCi1AaXRlbSAtLXBhZC10byBAdmFye2FkZHJlc3N9Ci1QYWQgdGhlIG91dHB1dCBmaWxlIHVwIHRvIHRoZSBsb2FkIGFkZHJlc3MgQHZhcnthZGRyZXNzfS4gIFRoaXMgaXMKLWRvbmUgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBzZWN0aW9uLiAgVGhlIGV4dHJhIHNwYWNlIGlzCi1maWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IEBzYW1wey0tZ2FwLWZpbGx9IChkZWZhdWx0IHplcm8pLgotCi1AaXRlbSAtLXNldC1zdGFydCBAdmFye3ZhbH0KLVNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV3IGZpbGUgdG8gQHZhcnt2YWx9LiAgTm90IGFsbCBvYmplY3QgZmlsZQotZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCi0KLUBpdGVtIC0tY2hhbmdlLXN0YXJ0IEB2YXJ7aW5jcn0KLUBpdGVteCAtLWFkanVzdC1zdGFydCBAdmFye2luY3J9Ci1AY2luZGV4IGNoYW5naW5nIHN0YXJ0IGFkZHJlc3MKLUNoYW5nZSB0aGUgc3RhcnQgYWRkcmVzcyBieSBhZGRpbmcgQHZhcntpbmNyfS4gIE5vdCBhbGwgb2JqZWN0IGZpbGUKLWZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgotCi1AaXRlbSAtLWNoYW5nZS1hZGRyZXNzZXMgQHZhcntpbmNyfQotQGl0ZW14IC0tYWRqdXN0LXZtYSBAdmFye2luY3J9Ci1AY2luZGV4IGNoYW5naW5nIG9iamVjdCBhZGRyZXNzZXMKLUNoYW5nZSB0aGUgVk1BIGFuZCBMTUEgYWRkcmVzc2VzIG9mIGFsbCBzZWN0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3RhcnQKLWFkZHJlc3MsIGJ5IGFkZGluZyBAdmFye2luY3J9LiAgU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIGRvIG5vdCBwZXJtaXQKLXNlY3Rpb24gYWRkcmVzc2VzIHRvIGJlIGNoYW5nZWQgYXJiaXRyYXJpbHkuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAotcmVsb2NhdGUgdGhlIHNlY3Rpb25zOyBpZiB0aGUgcHJvZ3JhbSBleHBlY3RzIHNlY3Rpb25zIHRvIGJlIGxvYWRlZCBhdCBhCi1jZXJ0YWluIGFkZHJlc3MsIGFuZCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc2VjdGlvbnMgc3VjaAotdGhhdCB0aGV5IGFyZSBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcywgdGhlIHByb2dyYW0gbWF5IGZhaWwuIAotCi1AaXRlbSAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MgQHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfQotQGl0ZW14IC0tYWRqdXN0LXNlY3Rpb24tdm1hIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KLUBjaW5kZXggY2hhbmdpbmcgc2VjdGlvbiBhZGRyZXNzCi1TZXQgb3IgY2hhbmdlIGJvdGggdGhlIFZNQSBhZGRyZXNzIGFuZCB0aGUgTE1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkCi1AdmFye3NlY3Rpb259LiAgSWYgQHNhbXB7PX0gaXMgdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8KLUB2YXJ7dmFsfS4gIE90aGVyd2lzZSwgQHZhcnt2YWx9IGlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUKLXNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMgdW5kZXIgQHNhbXB7LS1jaGFuZ2UtYWRkcmVzc2VzfSwKLWFib3ZlLiBJZiBAdmFye3NlY3Rpb259IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbAotYmUgaXNzdWVkLCB1bmxlc3MgQHNhbXB7LS1uby1jaGFuZ2Utd2FybmluZ3N9IGlzIHVzZWQuCi0KLUBpdGVtIC0tY2hhbmdlLXNlY3Rpb24tbG1hIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KLUBjaW5kZXggY2hhbmdpbmcgc2VjdGlvbiBMTUEKLVNldCBvciBjaGFuZ2UgdGhlIExNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZCBAdmFye3NlY3Rpb259LiAgVGhlIExNQQotYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsIGJlIGxvYWRlZCBpbnRvIG1lbW9yeSBhdAotcHJvZ3JhbSBsb2FkIHRpbWUuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBWTUEgYWRkcmVzcywgd2hpY2gKLWlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGF0IHByb2dyYW0gcnVuIHRpbWUsIGJ1dCBvbiBzb21lIHN5c3RlbXMsCi1lc3BlY2lhbGx5IHRob3NlIHdoZXJlIGEgcHJvZ3JhbSBpcyBoZWxkIGluIFJPTSwgdGhlIHR3byBjYW4gYmUKLWRpZmZlcmVudC4gIElmIEBzYW1wez19IGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvCi1AdmFye3ZhbH0uICBPdGhlcndpc2UsIEB2YXJ7dmFsfSBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlCi1zZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyIEBzYW1wey0tY2hhbmdlLWFkZHJlc3Nlc30sCi1hYm92ZS4gIElmIEB2YXJ7c2VjdGlvbn0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZwotd2lsbCBiZSBpc3N1ZWQsIHVubGVzcyBAc2FtcHstLW5vLWNoYW5nZS13YXJuaW5nc30gaXMgdXNlZC4gIAotCi1AaXRlbSAtLWNoYW5nZS1zZWN0aW9uLXZtYSBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9Ci1AY2luZGV4IGNoYW5naW5nIHNlY3Rpb24gVk1BCi1TZXQgb3IgY2hhbmdlIHRoZSBWTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFRoZSBWTUEKLWFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbCBiZSBsb2NhdGVkIG9uY2UgdGhlCi1wcm9ncmFtIGhhcyBzdGFydGVkIGV4ZWN1dGluZy4gIE5vcm1hbGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIExNQQotYWRkcmVzcywgd2hpY2ggaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbCBiZSBsb2FkZWQgaW50bwotbWVtb3J5LCBidXQgb24gc29tZSBzeXN0ZW1zLCBlc3BlY2lhbGx5IHRob3NlIHdoZXJlIGEgcHJvZ3JhbSBpcyBoZWxkIGluCi1ST00sIHRoZSB0d28gY2FuIGJlIGRpZmZlcmVudC4gIElmIEBzYW1wez19IGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MKLWlzIHNldCB0byBAdmFye3ZhbH0uICBPdGhlcndpc2UsIEB2YXJ7dmFsfSBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkCi1mcm9tIHRoZSBzZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyCi1Ac2FtcHstLWNoYW5nZS1hZGRyZXNzZXN9LCBhYm92ZS4gIElmIEB2YXJ7c2VjdGlvbn0gZG9lcyBub3QgZXhpc3QgaW4KLXRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQsIHVubGVzcwotQHNhbXB7LS1uby1jaGFuZ2Utd2FybmluZ3N9IGlzIHVzZWQuICAgCi0KLUBpdGVtIC0tY2hhbmdlLXdhcm5pbmdzCi1AaXRlbXggLS1hZGp1c3Qtd2FybmluZ3MKLUlmIEBzYW1wey0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzc30gb3IgQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi1sbWF9IG9yCi1Ac2FtcHstLWNoYW5nZS1zZWN0aW9uLXZtYX0gaXMgdXNlZCwgYW5kIHRoZSBuYW1lZCBzZWN0aW9uIGRvZXMgbm90Ci1leGlzdCwgaXNzdWUgYSB3YXJuaW5nLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4gCi0KLUBpdGVtIC0tbm8tY2hhbmdlLXdhcm5pbmdzCi1AaXRlbXggLS1uby1hZGp1c3Qtd2FybmluZ3MKLURvIG5vdCBpc3N1ZSBhIHdhcm5pbmcgaWYgQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzfSBvcgotQHNhbXB7LS1hZGp1c3Qtc2VjdGlvbi1sbWF9IG9yIEBzYW1wey0tYWRqdXN0LXNlY3Rpb24tdm1hfSBpcyB1c2VkLCBldmVuCi1pZiB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdCBleGlzdC4gCi0KLUBpdGVtIC0tc2V0LXNlY3Rpb24tZmxhZ3MgQHZhcntzZWN0aW9ufT1AdmFye2ZsYWdzfQotU2V0IHRoZSBmbGFncyBmb3IgdGhlIG5hbWVkIHNlY3Rpb24uICBUaGUgQHZhcntmbGFnc30gYXJndW1lbnQgaXMgYQotY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZiBmbGFnIG5hbWVzLiAgVGhlIHJlY29nbml6ZWQgbmFtZXMgYXJlCi1Ac2FtcHthbGxvY30sIEBzYW1we2NvbnRlbnRzfSwgQHNhbXB7bG9hZH0sIEBzYW1we25vbG9hZH0sCi1Ac2FtcHtyZWFkb25seX0sIEBzYW1we2NvZGV9LCBAc2FtcHtkYXRhfSwgQHNhbXB7cm9tfSwgQHNhbXB7c2hhcmV9LCBhbmQKLUBzYW1we2RlYnVnfS4gIFlvdSBjYW4gc2V0IHRoZSBAc2FtcHtjb250ZW50c30gZmxhZyBmb3IgYSBzZWN0aW9uIHdoaWNoCi1kb2VzIG5vdCBoYXZlIGNvbnRlbnRzLCBidXQgaXQgaXMgbm90IG1lYW5pbmdmdWwgdG8gY2xlYXIgdGhlCi1Ac2FtcHtjb250ZW50c30gZmxhZyBvZiBhIHNlY3Rpb24gd2hpY2ggZG9lcyBoYXZlIGNvbnRlbnRzLS1qdXN0IHJlbW92ZQotdGhlIHNlY3Rpb24gaW5zdGVhZC4gIE5vdCBhbGwgZmxhZ3MgYXJlIG1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZQotZm9ybWF0cy4KLQotQGl0ZW0gLS1hZGQtc2VjdGlvbiBAdmFye3NlY3Rpb25uYW1lfT1AdmFye2ZpbGVuYW1lfQotQWRkIGEgbmV3IHNlY3Rpb24gbmFtZWQgQHZhcntzZWN0aW9ubmFtZX0gd2hpbGUgY29weWluZyB0aGUgZmlsZS4gIFRoZQotY29udGVudHMgb2YgdGhlIG5ldyBzZWN0aW9uIGFyZSB0YWtlbiBmcm9tIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9LiAgVGhlCi1zaXplIG9mIHRoZSBzZWN0aW9uIHdpbGwgYmUgdGhlIHNpemUgb2YgdGhlIGZpbGUuICBUaGlzIG9wdGlvbiBvbmx5Ci13b3JrcyBvbiBmaWxlIGZvcm1hdHMgd2hpY2ggY2FuIHN1cHBvcnQgc2VjdGlvbnMgd2l0aCBhcmJpdHJhcnkgbmFtZXMuCi0KLUBpdGVtIC0tY2hhbmdlLWxlYWRpbmctY2hhcgotU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mCi1zeW1ib2xzLiAgVGhlIG1vc3QgY29tbW9uIHN1Y2ggY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUsIHdoaWNoIGNvbXBpbGVycwotb2Z0ZW4gYWRkIGJlZm9yZSBldmVyeSBzeW1ib2wuICBUaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtvYmpjb3B5fSB0bwotY2hhbmdlIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBvZiBldmVyeSBzeW1ib2wgd2hlbiBpdCBjb252ZXJ0cyBiZXR3ZWVuCi1vYmplY3QgZmlsZSBmb3JtYXRzLiAgSWYgdGhlIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNlIHRoZSBzYW1lIGxlYWRpbmcKLWNoYXJhY3RlciwgdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdC4gIE90aGVyd2lzZSwgaXQgd2lsbCBhZGQgYQotY2hhcmFjdGVyLCBvciByZW1vdmUgYSBjaGFyYWN0ZXIsIG9yIGNoYW5nZSBhIGNoYXJhY3RlciwgYXMKLWFwcHJvcHJpYXRlLgotCi1AaXRlbSAtLXJlbW92ZS1sZWFkaW5nLWNoYXIKLUlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBnbG9iYWwgc3ltYm9sIGlzIGEgc3BlY2lhbCBzeW1ib2wgbGVhZGluZwotY2hhcmFjdGVyIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgcmVtb3ZlIHRoZSBjaGFyYWN0ZXIuICBUaGUKLW1vc3QgY29tbW9uIHN5bWJvbCBsZWFkaW5nIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLiAgVGhpcyBvcHRpb24gd2lsbAotcmVtb3ZlIGEgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gYWxsIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBjYW4gYmUgdXNlZnVsCi1pZiB5b3Ugd2FudCB0byBsaW5rIHRvZ2V0aGVyIG9iamVjdHMgb2YgZGlmZmVyZW50IGZpbGUgZm9ybWF0cyB3aXRoCi1kaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIHN5bWJvbCBuYW1lcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20KLUBjb2Rley0tY2hhbmdlLWxlYWRpbmctY2hhcn0gYmVjYXVzZSBpdCBhbHdheXMgY2hhbmdlcyB0aGUgc3ltYm9sIG5hbWUKLXdoZW4gYXBwcm9wcmlhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0Ci1maWxlLgotCi1AaXRlbSAtLXdlYWtlbgotQ2hhbmdlIGFsbCBnbG9iYWwgc3ltYm9scyBpbiB0aGUgZmlsZSB0byBiZSB3ZWFrLiAgVGhpcyBjYW4gYmUgdXNlZnVsCi13aGVuIGJ1aWxkaW5nIGFuIG9iamVjdCB3aGljaCB3aWxsIGJlIGxpbmtlZCBhZ2FpbnN0IG90aGVyIG9iamVjdHMgdXNpbmcKLXRoZSBAY29kZXstUn0gb3B0aW9uIHRvIHRoZSBsaW5rZXIuICBUaGlzIG9wdGlvbiBpcyBvbmx5IGVmZmVjdGl2ZSB3aGVuCi11c2luZyBhbiBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggc3VwcG9ydHMgd2VhayBzeW1ib2xzLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7b2JqY29weX0uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJib3NlCi1WZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKLWFyY2hpdmVzLCBAc2FtcHtvYmpjb3B5IC1WfSBsaXN0cyBhbGwgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gLS1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtvYmpjb3B5fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgb2JqZHVtcAotQGNoYXB0ZXIgb2JqZHVtcAotCi1AY2luZGV4IG9iamVjdCBmaWxlIGluZm9ybWF0aW9uCi1Aa2luZGV4IG9iamR1bXAKLQotQHNtYWxsZXhhbXBsZQotb2JqZHVtcCBbIC1hIHwgLS1hcmNoaXZlLWhlYWRlcnMgXSAKLSAgICAgICAgWyAtYiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdIAotICAgICAgICBbIC1DIHwgLS1kZW1hbmdsZSBdCi0gICAgICAgIFsgLWQgfCAtLWRpc2Fzc2VtYmxlIF0KLSAgICAgICAgWyAtRCB8IC0tZGlzYXNzZW1ibGUtYWxsIF0KLSAgICAgICAgWyAteiB8IC0tZGlzYXNzZW1ibGUtemVyb2VzIF0KLSAgICAgICAgWyAtRUIgfCAtRUwgfCAtLWVuZGlhbj1Ae2JpZyB8IGxpdHRsZSBAfSBdCi0gICAgICAgIFsgLWYgfCAtLWZpbGUtaGVhZGVycyBdCi0gICAgICAgIFsgLS1maWxlLXN0YXJ0LWNvbnRleHQgXQotICAgICAgICBbIC1nIHwgLS1kZWJ1Z2dpbmcgXQotICAgICAgICBbIC1oIHwgLS1zZWN0aW9uLWhlYWRlcnMgfCAtLWhlYWRlcnMgXQotICAgICAgICBbIC1pIHwgLS1pbmZvIF0KLSAgICAgICAgWyAtaiBAdmFye3NlY3Rpb259IHwgLS1zZWN0aW9uPUB2YXJ7c2VjdGlvbn0gXQotICAgICAgICBbIC1sIHwgLS1saW5lLW51bWJlcnMgXQotICAgICAgICBbIC1TIHwgLS1zb3VyY2UgXQotICAgICAgICBbIC1tIEB2YXJ7bWFjaGluZX0gfCAtLWFyY2hpdGVjdHVyZT1AdmFye21hY2hpbmV9IF0KLSAgICAgICAgWyAtTSBAdmFye29wdGlvbnN9IHwgLS1kaXNhc3NlbWJsZXItb3B0aW9ucz1AdmFye29wdGlvbnN9XQotICAgICAgICBbIC1wIHwgLS1wcml2YXRlLWhlYWRlcnMgXQotICAgICAgICBbIC1yIHwgLS1yZWxvYyBdCi0gICAgICAgIFsgLVIgfCAtLWR5bmFtaWMtcmVsb2MgXQotICAgICAgICBbIC1zIHwgLS1mdWxsLWNvbnRlbnRzIF0KLSAgICAgICAgWyAtRyB8IC0tc3RhYnMgXQotICAgICAgICBbIC10IHwgLS1zeW1zIF0KLSAgICAgICAgWyAtVCB8IC0tZHluYW1pYy1zeW1zIF0KLSAgICAgICAgWyAteCB8IC0tYWxsLWhlYWRlcnMgXQotICAgICAgICBbIC13IHwgLS13aWRlIF0KLSAgICAgICAgWyAtLXN0YXJ0LWFkZHJlc3M9QHZhcnthZGRyZXNzfSBdCi0gICAgICAgIFsgLS1zdG9wLWFkZHJlc3M9QHZhcnthZGRyZXNzfSBdCi0gICAgICAgIFsgLS1wcmVmaXgtYWRkcmVzc2VzXQotICAgICAgICBbIC0tW25vLV1zaG93LXJhdy1pbnNuIF0KLSAgICAgICAgWyAtLWFkanVzdC12bWE9QHZhcntvZmZzZXR9IF0KLSAgICAgICAgWyAtViB8IC0tdmVyc2lvbiBdCi0gICAgICAgIFsgLUggfCAtLWhlbHAgXQotICAgICAgICBAdmFye29iamZpbGV9QGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7b2JqZHVtcH0gZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgb2JqZWN0IGZpbGVzLgotVGhlIG9wdGlvbnMgY29udHJvbCB3aGF0IHBhcnRpY3VsYXIgaW5mb3JtYXRpb24gdG8gZGlzcGxheS4gIFRoaXMKLWluZm9ybWF0aW9uIGlzIG1vc3RseSB1c2VmdWwgdG8gcHJvZ3JhbW1lcnMgd2hvIGFyZSB3b3JraW5nIG9uIHRoZQotY29tcGlsYXRpb24gdG9vbHMsIGFzIG9wcG9zZWQgdG8gcHJvZ3JhbW1lcnMgd2hvIGp1c3Qgd2FudCB0aGVpcgotcHJvZ3JhbSB0byBjb21waWxlIGFuZCB3b3JrLgotCi1AdmFye29iamZpbGV9QGRvdHN7fSBhcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4gIFdoZW4geW91Ci1zcGVjaWZ5IGFyY2hpdmVzLCBAY29kZXtvYmpkdW1wfSBzaG93cyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZSBtZW1iZXIKLW9iamVjdCBmaWxlcy4KLQotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuICBBdCBsZWFzdCBvbmUgb3B0aW9uIGZyb20gdGhlIGxpc3QKLUBzYW1wey1hLC1kLC1ELC1mLC1nLC1HLC1oLC1ILC1wLC1yLC1SLC1TLC10LC1ULC1WLC14fSBtdXN0IGJlIGdpdmVuLiAKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYQotQGl0ZW14IC0tYXJjaGl2ZS1oZWFkZXIKLUBjaW5kZXggYXJjaGl2ZSBoZWFkZXJzCi1JZiBhbnkgb2YgdGhlIEB2YXJ7b2JqZmlsZX0gZmlsZXMgYXJlIGFyY2hpdmVzLCBkaXNwbGF5IHRoZSBhcmNoaXZlCi1oZWFkZXIgaW5mb3JtYXRpb24gKGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gQHNhbXB7bHMgLWx9KS4gIEJlc2lkZXMgdGhlCi1pbmZvcm1hdGlvbiB5b3UgY291bGQgbGlzdCB3aXRoIEBzYW1we2FyIHR2fSwgQHNhbXB7b2JqZHVtcCAtYX0gc2hvd3MKLXRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgZWFjaCBhcmNoaXZlIG1lbWJlci4KLQotQGl0ZW0gLS1hZGp1c3Qtdm1hPUB2YXJ7b2Zmc2V0fQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3NlcyBpbiBvYmpkdW1wCi1AY2luZGV4IFZNQSBpbiBvYmpkdW1wCi1XaGVuIGR1bXBpbmcgaW5mb3JtYXRpb24sIGZpcnN0IGFkZCBAdmFye29mZnNldH0gdG8gYWxsIHRoZSBzZWN0aW9uCi1hZGRyZXNzZXMuICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgZG8gbm90IGNvcnJlc3BvbmQgdG8KLXRoZSBzeW1ib2wgdGFibGUsIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiBwdXR0aW5nIHNlY3Rpb25zIGF0IHBhcnRpY3VsYXIKLWFkZHJlc3NlcyB3aGVuIHVzaW5nIGEgZm9ybWF0IHdoaWNoIGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYWRkcmVzc2VzLAotc3VjaCBhcyBhLm91dC4KLQotQGl0ZW0gLWIgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IHRoYXQgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyBpcwotQHZhcntiZmRuYW1lfS4gIFRoaXMgb3B0aW9uIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBAdmFye29iamR1bXB9IGNhbgotYXV0b21hdGljYWxseSByZWNvZ25pemUgbWFueSBmb3JtYXRzLgotCi1Gb3IgZXhhbXBsZSwKLUBleGFtcGxlCi1vYmpkdW1wIC1iIG9hc3lzIC1tIHZheCAtaCBmdS5vCi1AZW5kIGV4YW1wbGUKLUBub2luZGVudAotZGlzcGxheXMgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgKEBzYW1wey1ofSkgb2YKLUBmaWxle2Z1Lm99LCB3aGljaCBpcyBleHBsaWNpdGx5IGlkZW50aWZpZWQgKEBzYW1wey1tfSkgYXMgYSBWQVggb2JqZWN0Ci1maWxlIGluIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgT2FzeXMgY29tcGlsZXJzLiAgWW91IGNhbiBsaXN0IHRoZQotZm9ybWF0cyBhdmFpbGFibGUgd2l0aCB0aGUgQHNhbXB7LWl9IG9wdGlvbi4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLUMKLUBpdGVteCAtLWRlbWFuZ2xlCi1AY2luZGV4IGRlbWFuZ2xpbmcgaW4gb2JqZHVtcAotRGVjb2RlIChAZGZue2RlbWFuZ2xlfSkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4gIEB4cmVme2MrK2ZpbHR9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotb24gZGVtYW5nbGluZy4KLQotQGl0ZW0gLUcKLUBpdGVtIC0tZGVidWdnaW5nCi1EaXNwbGF5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgYXR0ZW1wdHMgdG8gcGFyc2UgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGZpbGUgYW5kIHByaW50IGl0IG91dCB1c2luZyBhIEMgbGlrZSBzeW50YXguCi1Pbmx5IGNlcnRhaW4gdHlwZXMgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWRpc2Fzc2VtYmxlCi1AY2luZGV4IGRpc2Fzc2VtYmxpbmcgb2JqZWN0IGNvZGUKLUBjaW5kZXggbWFjaGluZSBpbnN0cnVjdGlvbnMKLURpc3BsYXkgdGhlIGFzc2VtYmxlciBtbmVtb25pY3MgZm9yIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyBmcm9tCi1AdmFye29iamZpbGV9LiAgVGhpcyBvcHRpb24gb25seSBkaXNhc3NlbWJsZXMgdGhvc2Ugc2VjdGlvbnMgd2hpY2ggYXJlCi1leHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLUQKLUBpdGVteCAtLWRpc2Fzc2VtYmxlLWFsbAotTGlrZSBAc2FtcHstZH0sIGJ1dCBkaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2YgYWxsIHNlY3Rpb25zLCBub3QganVzdAotdGhvc2UgZXhwZWN0ZWQgdG8gY29udGFpbiBpbnN0cnVjdGlvbnMuCi0KLUBpdGVtIC0tcHJlZml4LWFkZHJlc3NlcwotV2hlbiBkaXNhc3NlbWJsaW5nLCBwcmludCB0aGUgY29tcGxldGUgYWRkcmVzcyBvbiBlYWNoIGxpbmUuICBUaGlzIGlzCi10aGUgb2xkZXIgZGlzYXNzZW1ibHkgZm9ybWF0LgotCi1AaXRlbSAtLWRpc2Fzc2VtYmxlLXplcm9lcwotTm9ybWFsbHkgdGhlIGRpc2Fzc2VtYmx5IG91dHB1dCB3aWxsIHNraXAgYmxvY2tzIG9mIHplcm9lcy4gIFRoaXMKLW9wdGlvbiBkaXJlY3RzIHRoZSBkaXNhc3NlbWJsZXIgdG8gZGlzYXNzZW1ibGUgdGhvc2UgYmxvY2tzLCBqdXN0IGxpa2UKLWFueSBvdGhlciBkYXRhLgotCi1AaXRlbSAtRUIKLUBpdGVteCAtRUwKLUBpdGVteCAtLWVuZGlhbj1Ae2JpZ3xsaXR0bGVAfQotQGNpbmRleCBlbmRpYW5uZXNzCi1AY2luZGV4IGRpc2Fzc2VtYmx5IGVuZGlhbm5lc3MKLVNwZWNpZnkgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIG9iamVjdCBmaWxlcy4gIFRoaXMgb25seSBhZmZlY3RzCi1kaXNhc3NlbWJseS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGRpc2Fzc2VtYmxpbmcgYSBmaWxlIGZvcm1hdCB3aGljaAotZG9lcyBub3QgZGVzY3JpYmUgZW5kaWFubmVzcyBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuCi0KLUBpdGVtIC1mCi1AaXRlbXggLS1maWxlLWhlYWRlcgotQGNpbmRleCBvYmplY3QgZmlsZSBoZWFkZXIKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdmVyYWxsIGhlYWRlciBvZgotZWFjaCBvZiB0aGUgQHZhcntvYmpmaWxlfSBmaWxlcy4KLQotQGl0ZW0gLS1maWxlLXN0YXJ0LWNvbnRleHQKLUBjaW5kZXggc291cmNlIGNvZGUgY29udGV4dAotU3BlY2lmeSB0aGF0IHdoZW4gZGlzcGxheWluZyBpbnRlcmxpc3RlZCBzb3VyY2UgY29kZS9kaXNhc3NlbWJseQotKGFzc3VtZXMgJy1TJykgZnJvbSBhIGZpbGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGRpc3BsYXllZCwgZXh0ZW5kIHRoZQotY29udGV4dCB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0KLUBpdGVtIC1oCi1AaXRlbXggLS1zZWN0aW9uLWhlYWRlcgotQGl0ZW14IC0taGVhZGVyCi1AY2luZGV4IHNlY3Rpb24gaGVhZGVycwotRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycyBvZiB0aGUKLW9iamVjdCBmaWxlLgotCi1GaWxlIHNlZ21lbnRzIG1heSBiZSByZWxvY2F0ZWQgdG8gbm9uc3RhbmRhcmQgYWRkcmVzc2VzLCBmb3IgZXhhbXBsZSBieQotdXNpbmcgdGhlIEBzYW1wey1UdGV4dH0sIEBzYW1wey1UZGF0YX0sIG9yIEBzYW1wey1UYnNzfSBvcHRpb25zIHRvCi1AY29kZXtsZH0uICBIb3dldmVyLCBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMsIHN1Y2ggYXMgYS5vdXQsIGRvIG5vdAotc3RvcmUgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGZpbGUgc2VnbWVudHMuICBJbiB0aG9zZSBzaXR1YXRpb25zLAotYWx0aG91Z2ggQGNvZGV7bGR9IHJlbG9jYXRlcyB0aGUgc2VjdGlvbnMgY29ycmVjdGx5LCB1c2luZyBAc2FtcHtvYmpkdW1wCi0taH0gdG8gbGlzdCB0aGUgZmlsZSBzZWN0aW9uIGhlYWRlcnMgY2Fubm90IHNob3cgdGhlIGNvcnJlY3QgYWRkcmVzc2VzLgotSW5zdGVhZCwgaXQgc2hvd3MgdGhlIHVzdWFsIGFkZHJlc3Nlcywgd2hpY2ggYXJlIGltcGxpY2l0IGZvciB0aGUKLXRhcmdldC4KLQotQGl0ZW0gLS1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7b2JqZHVtcH0gYW5kIGV4aXQuCi0KLUBpdGVtIC1pCi1AaXRlbXggLS1pbmZvCi1AY2luZGV4IGFyY2hpdGVjdHVyZXMgYXZhaWxhYmxlCi1AY2luZGV4IG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQotRGlzcGxheSBhIGxpc3Qgc2hvd2luZyBhbGwgYXJjaGl0ZWN0dXJlcyBhbmQgb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCi1mb3Igc3BlY2lmaWNhdGlvbiB3aXRoIEBzYW1wey1ifSBvciBAc2FtcHstbX0uCi0KLUBpdGVtIC1qIEB2YXJ7bmFtZX0KLUBpdGVteCAtLXNlY3Rpb249QHZhcntuYW1lfQotQGNpbmRleCBzZWN0aW9uIGluZm9ybWF0aW9uCi1EaXNwbGF5IGluZm9ybWF0aW9uIG9ubHkgZm9yIHNlY3Rpb24gQHZhcntuYW1lfS4KLQotQGl0ZW0gLWwKLUBpdGVteCAtLWxpbmUtbnVtYmVycwotQGNpbmRleCBzb3VyY2UgZmlsZW5hbWVzIGZvciBvYmplY3QgZmlsZXMKLUxhYmVsIHRoZSBkaXNwbGF5ICh1c2luZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24pIHdpdGggdGhlIGZpbGVuYW1lIGFuZAotc291cmNlIGxpbmUgbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgY29kZSBvciByZWxvY3Mgc2hvd24uCi1Pbmx5IHVzZWZ1bCB3aXRoIEBzYW1wey1kfSwgQHNhbXB7LUR9LCBvciBAc2FtcHstcn0uCi0KLUBpdGVtIC1tIEB2YXJ7bWFjaGluZX0KLUBpdGVteCAtLWFyY2hpdGVjdHVyZT1AdmFye21hY2hpbmV9Ci1AY2luZGV4IGFyY2hpdGVjdHVyZQotQGNpbmRleCBkaXNhc3NlbWJseSBhcmNoaXRlY3R1cmUKLVNwZWNpZnkgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2Ugd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcy4gIFRoaXMKLWNhbiBiZSB1c2VmdWwgd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcyB3aGljaCBkbyBub3QgZGVzY3JpYmUKLWFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZQotYXJjaGl0ZWN0dXJlcyB3aXRoIHRoZSBAc2FtcHstaX0gb3B0aW9uLgotCi1AaXRlbSAtTSBAdmFye29wdGlvbnN9Ci1AaXRlbXggLS1kaXNhc3NlbWJsZXItb3B0aW9ucz1AdmFye29wdGlvbnN9Ci1QYXNzIHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0byB0aGUgZGlzYXNzZW1ibGVyLiAgT25seSBzdXBwb3J0ZWQgb24KLXNvbWUgdGFyZ2V0cy4KLQotSWYgdGhlIHRhcmdldCBpcyBhbiBBUk0gYXJjaGl0ZWN0dXJlIHRoZW4gdGhpcyBzd2l0Y2ggY2FuIGJlIHVzZWQgdG8KLXNlbGVjdCB3aGljaCByZWdpc3RlciBuYW1lIHNldCBpcyB1c2VkIGR1cmluZyBkaXNhc3NlbWJsZXIuICBTcGVjaWZ5aW5nCi1Ac2FtcHstTSByZWctbmFtZS1zdGR9ICh0aGUgZGVmYXVsdCkgd2lsbCBzZWxlY3QgdGhlIHJlZ2lzdGVyIG5hbWVzIGFzCi11c2VkIGluIEFSTSdzIGluc3RydWN0aW9uIHNldCBkb2N1bWVudGF0aW9uLCBidXQgd2l0aCByZWdpc3RlciAxMyBjYWxsZWQKLSdzcCcsIHJlZ2lzdGVyIDE0IGNhbGxlZCAnbHInIGFuZCByZWdpc3RlciAxNSBjYWxsZWQgJ3BjJy4gIFNwZWNpZnlpbmcKLUBzYW1wey1NIHJlZy1uYW1lcy1hcGNzfSB3aWxsIHNlbGVjdCB0aGUgbmFtZSBzZXQgdXNlZCBieSB0aGUgQVJNCi1Qcm9jZWR1cmUgQ2FsbCBTdGFuZGFyZCwgd2hpbHN0IHNwZWNpZnlpbmcgQHNhbXB7LU0gcmVnLW5hbWVzLXJhd30gd2lsbAotanVzdCB1c2UgQHNhbXB7cn0gZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyIG51bWJlci4KLQotVGhlcmUgYXJlIGFsc28gdHdvIHZhcmlhbnRzIG9uIHRoZSBBUENTIHJlZ2lzdGVyIG5hbWluZyBzY2hlbWUgZW5hYmxlZAotYnkgQHNhbXB7LU0gcmVnLW5hbWVzLWF0cGNzfSBhbmQgQHNhbXB7LU0gcmVnLW5hbWVzLXNwZWNpYWwtYXRwY3N9IHdoaWNoCi11c2UgdGhlIEFSTS9UaHVtYiBQcm9jZWR1cmUgQ2FsbCBTdGFuZGFyZCBuYW1pbmcgY29udmVudGlvbnMuICAoRWl1dGhlcgotd2l0aCB0aGUgbm9ybWFsIHJlZ2lzdGVyIG5hbWUgc29yIHRoZSBzcGVjaWFsIHJlZ2lzdGVyIG5hbWVzKS4KLQotVGhpcyBvcHRpb24gY2FuIGFsc28gYmUgdXNlZCBmb3IgQVJNIGFyY2hpdGVjdHVyZXMgdG8gZm9yY2UgdGhlCi1kaXNhc3NlbWJsZXIgdG8gaW50ZXJwcmV0IGFsbCBpbnN0cnVjdGlvbnMgYXMgVEhVTUIgaW5zdHJ1Y3Rpb25zIGJ5Ci11c2luZyB0aGUgc3dpdGNoIEBzYW1wey0tZGlzYXNzZW1ibGVyLW9wdGlvbnM9Zm9yY2UtdGh1bWJ9LiAgVGhpcyBjYW4gYmUKLXVzZWZ1bCB3aGVuIGF0dGVtcHRpbmcgdG8gZGlzYXNzZW1ibGUgdGh1bWIgY29kZSBwcm9kdWNlZCBieSBvdGhlcgotY29tcGlsZXJzLgotCi1AaXRlbSAtcAotQGl0ZW14IC0tcHJpdmF0ZS1oZWFkZXJzCi1QcmludCBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUgZXhhY3QKLWluZm9ybWF0aW9uIHByaW50ZWQgZGVwZW5kcyB1cG9uIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBGb3Igc29tZQotb2JqZWN0IGZpbGUgZm9ybWF0cywgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcmludGVkLgotCi1AaXRlbSAtcgotQGl0ZW14IC0tcmVsb2MKLUBjaW5kZXggcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQotUHJpbnQgdGhlIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIElmIHVzZWQgd2l0aCBAc2FtcHstZH0gb3IKLUBzYW1wey1EfSwgdGhlIHJlbG9jYXRpb25zIGFyZSBwcmludGVkIGludGVyc3BlcnNlZCB3aXRoIHRoZQotZGlzYXNzZW1ibHkuCi0KLUBpdGVtIC1SCi1AaXRlbXggLS1keW5hbWljLXJlbG9jCi1AY2luZGV4IGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQotUHJpbnQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLWZ1bGwtY29udGVudHMKLUBjaW5kZXggc2VjdGlvbnMsIGZ1bGwgY29udGVudHMKLUBjaW5kZXggb2JqZWN0IGZpbGUgc2VjdGlvbnMKLURpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYW55IHNlY3Rpb25zIHJlcXVlc3RlZC4KLQotQGl0ZW0gLVMKLUBpdGVteCAtLXNvdXJjZQotQGNpbmRleCBzb3VyY2UgZGlzYXNzZW1ibHkKLUBjaW5kZXggZGlzYXNzZW1ibHksIHdpdGggc291cmNlCi1EaXNwbGF5IHNvdXJjZSBjb2RlIGludGVybWl4ZWQgd2l0aCBkaXNhc3NlbWJseSwgaWYgcG9zc2libGUuICBJbXBsaWVzCi1Ac2FtcHstZH0uCi0KLUBpdGVtIC0tc2hvdy1yYXctaW5zbgotV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgcHJpbnQgdGhlIGluc3RydWN0aW9uIGluIGhleCBhcyB3ZWxsIGFzCi1pbiBzeW1ib2xpYyBmb3JtLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBleGNlcHQgd2hlbgotQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgotCi1AaXRlbSAtLW5vLXNob3ctcmF3LWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIGRvIG5vdCBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi1UaGlzIGlzIHRoZSBkZWZhdWx0IHdoZW4gQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgotCi1AaXRlbSAtRwotQGl0ZW0gLS1zdGFicwotQGNpbmRleCBzdGFiCi1AY2luZGV4IC5zdGFiCi1AY2luZGV4IGRlYnVnIHN5bWJvbHMKLUBjaW5kZXggRUxGIG9iamVjdCBmaWxlIGZvcm1hdAotRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbnkgc2VjdGlvbnMgcmVxdWVzdGVkLiAgRGlzcGxheSB0aGUKLWNvbnRlbnRzIG9mIHRoZSAuc3RhYiBhbmQgLnN0YWIuaW5kZXggYW5kIC5zdGFiLmV4Y2wgc2VjdGlvbnMgZnJvbSBhbgotRUxGIGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgKHN1Y2ggYXMgU29sYXJpcyAyLjApIGluIHdoaWNoCi1AY29kZXsuc3RhYn0gZGVidWdnaW5nIHN5bWJvbC10YWJsZSBlbnRyaWVzIGFyZSBjYXJyaWVkIGluIGFuIEVMRgotc2VjdGlvbi4gIEluIG1vc3Qgb3RoZXIgZmlsZSBmb3JtYXRzLCBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlIGVudHJpZXMgYXJlCi1pbnRlcmxlYXZlZCB3aXRoIGxpbmthZ2Ugc3ltYm9scywgYW5kIGFyZSB2aXNpYmxlIGluIHRoZSBAc2FtcHstLXN5bXN9Ci1vdXRwdXQuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdGFicyBzeW1ib2xzLCBzZWUgQHJlZntUb3AsU3RhYnMsU3RhYnMKLU92ZXJ2aWV3LHN0YWJzLmluZm8sIFRoZSBgYHN0YWJzJycgZGVidWcgZm9ybWF0fS4KLQotQGl0ZW0gLS1zdGFydC1hZGRyZXNzPUB2YXJ7YWRkcmVzc30KLUBjaW5kZXggc3RhcnQtYWRkcmVzcwotU3RhcnQgZGlzcGxheWluZyBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gIFRoaXMgYWZmZWN0cyB0aGUgb3V0cHV0Ci1vZiB0aGUgQGNvZGV7LWR9LCBAY29kZXstcn0gYW5kIEBjb2Rley1zfSBvcHRpb25zLgotCi1AaXRlbSAtLXN0b3AtYWRkcmVzcz1AdmFye2FkZHJlc3N9Ci1AY2luZGV4IHN0b3AtYWRkcmVzcwotU3RvcCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZSBAY29kZXstZH0sIEBjb2Rley1yfSBhbmQgQGNvZGV7LXN9IG9wdGlvbnMuCi0KLUBpdGVtIC10Ci1AaXRlbXggLS1zeW1zCi1AY2luZGV4IHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBwcmludGluZwotUHJpbnQgdGhlIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZSBmaWxlLgotVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgQHNhbXB7bm19IHByb2dyYW0uCi0KLUBpdGVtIC1UCi1AaXRlbXggLS1keW5hbWljLXN5bXMKLUBjaW5kZXggZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cmllcywgcHJpbnRpbmcKLVByaW50IHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIEBzYW1we25tfQotcHJvZ3JhbSB3aGVuIGdpdmVuIHRoZSBAc2FtcHstRH0gKEBzYW1wey0tZHluYW1pY30pIG9wdGlvbi4KLQotQGl0ZW0gLS12ZXJzaW9uCi1QcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7b2JqZHVtcH0gYW5kIGV4aXQuCi0KLUBpdGVtIC14Ci1AaXRlbXggLS1hbGwtaGVhZGVyCi1AY2luZGV4IGFsbCBoZWFkZXIgaW5mb3JtYXRpb24sIG9iamVjdCBmaWxlCi1AY2luZGV4IGhlYWRlciBpbmZvcm1hdGlvbiwgYWxsCi1EaXNwbGF5IGFsbCBhdmFpbGFibGUgaGVhZGVyIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIHN5bWJvbCB0YWJsZSBhbmQKLXJlbG9jYXRpb24gZW50cmllcy4gIFVzaW5nIEBzYW1wey14fSBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgYWxsIG9mCi1Ac2FtcHstYSAtZiAtaCAtciAtdH0uCi0KLUBpdGVtIC13Ci1AaXRlbXggLS13aWRlCi1AY2luZGV4IHdpZGUgb3V0cHV0LCBwcmludGluZwotRm9ybWF0IHNvbWUgbGluZXMgZm9yIG91dHB1dCBkZXZpY2VzIHRoYXQgaGF2ZSBtb3JlIHRoYW4gODAgY29sdW1ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgcmFubGliCi1AY2hhcHRlciByYW5saWIKLQotQGtpbmRleCByYW5saWIKLUBjaW5kZXggYXJjaGl2ZSBjb250ZW50cwotQGNpbmRleCBzeW1ib2wgaW5kZXgKLQotQHNtYWxsZXhhbXBsZQotcmFubGliIFstdlZdIEB2YXJ7YXJjaGl2ZX0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle3JhbmxpYn0gZ2VuZXJhdGVzIGFuIGluZGV4IHRvIHRoZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlIGFuZAotc3RvcmVzIGl0IGluIHRoZSBhcmNoaXZlLiAgVGhlIGluZGV4IGxpc3RzIGVhY2ggc3ltYm9sIGRlZmluZWQgYnkgYQotbWVtYmVyIG9mIGFuIGFyY2hpdmUgdGhhdCBpcyBhIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlLiAgCi0KLVlvdSBtYXkgdXNlIEBzYW1we25tIC1zfSBvciBAc2FtcHtubSAtLXByaW50LWFybWFwfSB0byBsaXN0IHRoaXMgaW5kZXguCi0KLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5IGFuZAotYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwotdGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgotCi1UaGUgQHNje2dudX0gQGNvZGV7cmFubGlifSBwcm9ncmFtIGlzIGFub3RoZXIgZm9ybSBvZiBAc2N7Z251fSBAY29kZXthcn07IHJ1bm5pbmcKLUBjb2Rle3JhbmxpYn0gaXMgY29tcGxldGVseSBlcXVpdmFsZW50IHRvIGV4ZWN1dGluZyBAc2FtcHthciAtc30uCi1AeHJlZnthcn0uCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLXYKLUBpdGVteCAtVgotQGl0ZW14IC0tdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7cmFubGlifS4KLUBlbmQgdGFibGUKLQotQG5vZGUgc2l6ZQotQGNoYXB0ZXIgc2l6ZQotCi1Aa2luZGV4IHNpemUKLUBjaW5kZXggc2VjdGlvbiBzaXplcwotCi1Ac21hbGxleGFtcGxlCi1zaXplIFsgLUEgfCAtQiB8IC0tZm9ybWF0PUB2YXJ7Y29tcGF0aWJpbGl0eX0gXQotICAgICBbIC0taGVscCBdICBbIC1kIHwgLW8gfCAteCB8IC0tcmFkaXg9QHZhcntudW1iZXJ9IF0KLSAgICAgWyAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0gIFsgLVYgfCAtLXZlcnNpb24gXSAgCi0gICAgIFsgQHZhcntvYmpmaWxlfUBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzY3tnbnV9IEBjb2Rle3NpemV9IHV0aWxpdHkgbGlzdHMgdGhlIHNlY3Rpb24gc2l6ZXMtLS1hbmQgdGhlIHRvdGFsCi1zaXplLS0tZm9yIGVhY2ggb2YgdGhlIG9iamVjdCBvciBhcmNoaXZlIGZpbGVzIEB2YXJ7b2JqZmlsZX0gaW4gaXRzCi1hcmd1bWVudCBsaXN0LiAgQnkgZGVmYXVsdCwgb25lIGxpbmUgb2Ygb3V0cHV0IGlzIGdlbmVyYXRlZCBmb3IgZWFjaAotb2JqZWN0IGZpbGUgb3IgZWFjaCBtb2R1bGUgaW4gYW4gYXJjaGl2ZS4KLQotQHZhcntvYmpmaWxlfUBkb3Rze30gYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuCi1JZiBub25lIGFyZSBzcGVjaWZpZWQsIHRoZSBmaWxlIEBjb2Rle2Eub3V0fSB3aWxsIGJlIHVzZWQuCi0KLVRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUEKLUBpdGVteCAtQgotQGl0ZW14IC0tZm9ybWF0PUB2YXJ7Y29tcGF0aWJpbGl0eX0KLUBjaW5kZXggQGNvZGV7c2l6ZX0gZGlzcGxheSBmb3JtYXQKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNob29zZSB3aGV0aGVyIHRoZSBvdXRwdXQgZnJvbSBAc2N7Z251fQotQGNvZGV7c2l6ZX0gcmVzZW1ibGVzIG91dHB1dCBmcm9tIFN5c3RlbSBWIEBjb2Rle3NpemV9ICh1c2luZyBAc2FtcHstQX0sCi1vciBAc2FtcHstLWZvcm1hdD1zeXN2fSksIG9yIEJlcmtlbGV5IEBjb2Rle3NpemV9ICh1c2luZyBAc2FtcHstQn0sIG9yCi1Ac2FtcHstLWZvcm1hdD1iZXJrZWxleX0pLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG9uZS1saW5lIGZvcm1hdCBzaW1pbGFyIHRvCi1CZXJrZWxleSdzLiAgCi1AYyBCb251cyBmb3IgZG9jLXNvdXJjZSByZWFkZXJzOiB5b3UgY2FuIGFsc28gc2F5IC0tZm9ybWF0PXN0cmFuZ2UgKG9yCi1AYyBhbnl0aGluZyBlbHNlIHRoYXQgc3RhcnRzIHdpdGggJ3MnKSBmb3Igc3lzdiwgYW5kIC0tZm9ybWF0PWJvcmluZyAob3IKLUBjIGFueXRoaW5nIGVsc2UgdGhhdCBzdGFydHMgd2l0aCAnYicpIGZvciBCZXJrZWxleS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSBCZXJrZWxleSAoZGVmYXVsdCkgZm9ybWF0IG9mIG91dHB1dCBmcm9tCi1AY29kZXtzaXplfTogCi1Ac21hbGxleGFtcGxlCi0kIHNpemUgLS1mb3JtYXQ9QmVya2VsZXkgcmFubGliIHNpemUKLXRleHQgICAgZGF0YSAgICBic3MgICAgIGRlYyAgICAgaGV4ICAgICBmaWxlbmFtZQotMjk0ODgwICA4MTkyMCAgIDExNTkyICAgMzg4MzkyICA1ZWQyOCAgIHJhbmxpYgotMjk0ODgwICA4MTkyMCAgIDExODg4ICAgMzg4Njg4ICA1ZWU1MCAgIHNpemUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBpcyB0aGUgc2FtZSBkYXRhLCBidXQgZGlzcGxheWVkIGNsb3NlciB0byBTeXN0ZW0gViBjb252ZW50aW9uczoKLQotQHNtYWxsZXhhbXBsZQotJCBzaXplIC0tZm9ybWF0PVN5c1YgcmFubGliIHNpemUKLXJhbmxpYiAgOgotc2VjdGlvbiAgICAgICAgIHNpemUgICAgICAgICBhZGRyCi0udGV4dCAgICAgICAgIDI5NDg4MCAgICAgICAgIDgxOTIgICAgICAgCi0uZGF0YSAgICAgICAgICA4MTkyMCAgICAgICAzMDMxMDQgICAgICAgCi0uYnNzICAgICAgICAgICAxMTU5MiAgICAgICAzODUwMjQgICAgICAgCi1Ub3RhbCAgICAgICAgIDM4ODM5MiAgICAKLQotCi1zaXplICA6Ci1zZWN0aW9uICAgICAgICAgc2l6ZSAgICAgICAgIGFkZHIKLS50ZXh0ICAgICAgICAgMjk0ODgwICAgICAgICAgODE5MiAgICAgICAKLS5kYXRhICAgICAgICAgIDgxOTIwICAgICAgIDMwMzEwNCAgICAgICAKLS5ic3MgICAgICAgICAgIDExODg4ICAgICAgIDM4NTAyNCAgICAgICAKLVRvdGFsICAgICAgICAgMzg4Njg4ICAgIAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gLS1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiBhY2NlcHRhYmxlIGFyZ3VtZW50cyBhbmQgb3B0aW9ucy4KLQotQGl0ZW0gLWQKLUBpdGVteCAtbwotQGl0ZW14IC14Ci1AaXRlbXggLS1yYWRpeD1AdmFye251bWJlcn0KLUBjaW5kZXggQGNvZGV7c2l6ZX0gbnVtYmVyIGZvcm1hdAotQGNpbmRleCByYWRpeCBmb3Igc2VjdGlvbiBzaXplcwotVXNpbmcgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gY29udHJvbCB3aGV0aGVyIHRoZSBzaXplIG9mIGVhY2gKLXNlY3Rpb24gaXMgZ2l2ZW4gaW4gZGVjaW1hbCAoQHNhbXB7LWR9LCBvciBAc2FtcHstLXJhZGl4PTEwfSk7IG9jdGFsCi0oQHNhbXB7LW99LCBvciBAc2FtcHstLXJhZGl4PTh9KTsgb3IgaGV4YWRlY2ltYWwgKEBzYW1wey14fSwgb3IKLUBzYW1wey0tcmFkaXg9MTZ9KS4gIEluIEBzYW1wey0tcmFkaXg9QHZhcntudW1iZXJ9fSwgb25seSB0aGUgdGhyZWUKLXZhbHVlcyAoOCwgMTAsIDE2KSBhcmUgc3VwcG9ydGVkLiAgVGhlIHRvdGFsIHNpemUgaXMgYWx3YXlzIGdpdmVuIGluIHR3bwotcmFkaWNlczsgZGVjaW1hbCBhbmQgaGV4YWRlY2ltYWwgZm9yIEBzYW1wey1kfSBvciBAc2FtcHsteH0gb3V0cHV0LCBvcgotb2N0YWwgYW5kIGhleGFkZWNpbWFsIGlmIHlvdSdyZSB1c2luZyBAc2FtcHstb30uCi0KLUBpdGVtIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IHRoYXQgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgQHZhcntvYmpmaWxlfSBpcwotQHZhcntiZmRuYW1lfS4gIFRoaXMgb3B0aW9uIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBAY29kZXtzaXplfSBjYW4KLWF1dG9tYXRpY2FsbHkgcmVjb2duaXplIG1hbnkgZm9ybWF0cy4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle3NpemV9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBzdHJpbmdzCi1AY2hhcHRlciBzdHJpbmdzCi1Aa2luZGV4IHN0cmluZ3MKLUBjaW5kZXggbGlzdGluZ3Mgc3RyaW5ncwotQGNpbmRleCBwcmludGluZyBzdHJpbmdzCi1AY2luZGV4IHN0cmluZ3MsIHByaW50aW5nCi0KLUBzbWFsbGV4YW1wbGUKLXN0cmluZ3MgWy1hZm92XSBbLUB2YXJ7bWluLWxlbn1dIFstbiBAdmFye21pbi1sZW59XSBbLXQgQHZhcntyYWRpeH1dIFstXQotICAgICAgICBbLS1hbGxdIFstLXByaW50LWZpbGUtbmFtZV0gWy0tYnl0ZXM9QHZhcnttaW4tbGVufV0KLSAgICAgICAgWy0tcmFkaXg9QHZhcntyYWRpeH1dIFstLXRhcmdldD1AdmFye2JmZG5hbWV9XQotICAgICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXSBAdmFye2ZpbGV9QGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotRm9yIGVhY2ggQHZhcntmaWxlfSBnaXZlbiwgQHNje2dudX0gQGNvZGV7c3RyaW5nc30gcHJpbnRzIHRoZSBwcmludGFibGUKLWNoYXJhY3RlciBzZXF1ZW5jZXMgdGhhdCBhcmUgYXQgbGVhc3QgNCBjaGFyYWN0ZXJzIGxvbmcgKG9yIHRoZSBudW1iZXIKLWdpdmVuIHdpdGggdGhlIG9wdGlvbnMgYmVsb3cpIGFuZCBhcmUgZm9sbG93ZWQgYnkgYW4gdW5wcmludGFibGUKLWNoYXJhY3Rlci4gIEJ5IGRlZmF1bHQsIGl0IG9ubHkgcHJpbnRzIHRoZSBzdHJpbmdzIGZyb20gdGhlIGluaXRpYWxpemVkCi1hbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsgZm9yIG90aGVyIHR5cGVzIG9mIGZpbGVzLCBpdCBwcmludHMKLXRoZSBzdHJpbmdzIGZyb20gdGhlIHdob2xlIGZpbGUuCi0KLUBjb2Rle3N0cmluZ3N9IGlzIG1haW5seSB1c2VmdWwgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50cyBvZiBub24tdGV4dAotZmlsZXMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWEKLUBpdGVteCAtLWFsbAotQGl0ZW14IC0KLURvIG5vdCBzY2FuIG9ubHkgdGhlIGluaXRpYWxpemVkIGFuZCBsb2FkZWQgc2VjdGlvbnMgb2Ygb2JqZWN0IGZpbGVzOwotc2NhbiB0aGUgd2hvbGUgZmlsZXMuCi0KLUBpdGVtIC1mCi1AaXRlbXggLS1wcmludC1maWxlLW5hbWUKLVByaW50IHRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4KLQotQGl0ZW0gLS1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIHByb2dyYW0gdXNhZ2Ugb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLQotQGl0ZW0gLUB2YXJ7bWluLWxlbn0KLUBpdGVteCAtbiBAdmFye21pbi1sZW59Ci1AaXRlbXggLS1ieXRlcz1AdmFye21pbi1sZW59Ci1QcmludCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhdCBsZWFzdCBAdmFye21pbi1sZW59IGNoYXJhY3RlcnMKLWxvbmcsIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNC4KLQotQGl0ZW0gLW8KLUxpa2UgQHNhbXB7LXQgb30uICBTb21lIG90aGVyIHZlcnNpb25zIG9mIEBjb2Rle3N0cmluZ3N9IGhhdmUgQHNhbXB7LW99Ci1hY3QgbGlrZSBAc2FtcHstdCBkfSBpbnN0ZWFkLiAgU2luY2Ugd2UgY2FuIG5vdCBiZSBjb21wYXRpYmxlIHdpdGggYm90aAotd2F5cywgd2Ugc2ltcGx5IGNob3NlIG9uZS4KLQotQGl0ZW0gLXQgQHZhcntyYWRpeH0KLUBpdGVteCAtLXJhZGl4PUB2YXJ7cmFkaXh9Ci1QcmludCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuICBUaGUgc2luZ2xlCi1jaGFyYWN0ZXIgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSByYWRpeCBvZiB0aGUgb2Zmc2V0LS0tQHNhbXB7b30gZm9yCi1vY3RhbCwgQHNhbXB7eH0gZm9yIGhleGFkZWNpbWFsLCBvciBAc2FtcHtkfSBmb3IgZGVjaW1hbC4KLQotQGl0ZW0gLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcnNpb24KLVByaW50IHRoZSBwcm9ncmFtIHZlcnNpb24gbnVtYmVyIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIHN0cmlwCi1AY2hhcHRlciBzdHJpcAotCi1Aa2luZGV4IHN0cmlwCi1AY2luZGV4IHJlbW92aW5nIHN5bWJvbHMKLUBjaW5kZXggZGlzY2FyZGluZyBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGRpc2NhcmRpbmcKLQotQHNtYWxsZXhhbXBsZQotc3RyaXAgWyAtRiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICBbIC1JIEB2YXJ7YmZkbmFtZX0gfCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgIFsgLU8gQHZhcntiZmRuYW1lfSB8IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgIFsgLXMgfCAtLXN0cmlwLWFsbCBdIFsgLVMgfCAtZyB8IC0tc3RyaXAtZGVidWcgXQotICAgICAgWyAtSyBAdmFye3N5bWJvbG5hbWV9IHwgLS1rZWVwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgIFsgLU4gQHZhcntzeW1ib2xuYW1lfSB8IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgWyAteCB8IC0tZGlzY2FyZC1hbGwgXSBbIC1YIHwgLS1kaXNjYXJkLWxvY2FscyBdCi0gICAgICBbIC1SIEB2YXJ7c2VjdGlvbm5hbWV9IHwgLS1yZW1vdmUtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfSBdCi0gICAgICBbIC1vIEB2YXJ7ZmlsZX0gXSBbIC1wIHwgLS1wcmVzZXJ2ZS1kYXRlcyBdCi0gICAgICBbIC12IHwgLS12ZXJib3NlIF0gIFsgLVYgfCAtLXZlcnNpb24gXSAgWyAtLWhlbHAgXQotICAgICAgQHZhcntvYmpmaWxlfUBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBzY3tnbnV9IEBjb2Rle3N0cmlwfSBkaXNjYXJkcyBhbGwgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcwotQHZhcntvYmpmaWxlfS4gIFRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyBtYXkgaW5jbHVkZSBhcmNoaXZlcy4KLUF0IGxlYXN0IG9uZSBvYmplY3QgZmlsZSBtdXN0IGJlIGdpdmVuLgotCi1AY29kZXtzdHJpcH0gbW9kaWZpZXMgdGhlIGZpbGVzIG5hbWVkIGluIGl0cyBhcmd1bWVudCwKLXJhdGhlciB0aGFuIHdyaXRpbmcgbW9kaWZpZWQgY29waWVzIHVuZGVyIGRpZmZlcmVudCBuYW1lcy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtRiBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotVHJlYXQgdGhlIG9yaWdpbmFsIEB2YXJ7b2JqZmlsZX0gYXMgYSBmaWxlIHdpdGggdGhlIG9iamVjdAotY29kZSBmb3JtYXQgQHZhcntiZmRuYW1lfSwgYW5kIHJld3JpdGUgaXQgaW4gdGhlIHNhbWUgZm9ybWF0LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle3N0cmlwfSBhbmQgZXhpdC4KLQotQGl0ZW0gLUkgQHZhcntiZmRuYW1lfQkKLUBpdGVteCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1UcmVhdCB0aGUgb3JpZ2luYWwgQHZhcntvYmpmaWxlfSBhcyBhIGZpbGUgd2l0aCB0aGUgb2JqZWN0Ci1jb2RlIGZvcm1hdCBAdmFye2JmZG5hbWV9LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtTyBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVJlcGxhY2UgQHZhcntvYmpmaWxlfSB3aXRoIGEgZmlsZSBpbiB0aGUgb3V0cHV0IGZvcm1hdCBAdmFye2JmZG5hbWV9LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtUiBAdmFye3NlY3Rpb25uYW1lfQotQGl0ZW14IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0KLVJlbW92ZSBhbnkgc2VjdGlvbiBuYW1lZCBAdmFye3NlY3Rpb25uYW1lfSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24KLWluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUgb3V0cHV0IGZpbGUgdW51c2FibGUuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1zdHJpcC1hbGwKLVJlbW92ZSBhbGwgc3ltYm9scy4KLQotQGl0ZW0gLWcKLUBpdGVteCAtUwotQGl0ZW14IC0tc3RyaXAtZGVidWcKLVJlbW92ZSBkZWJ1Z2dpbmcgc3ltYm9scyBvbmx5LgotCi1AaXRlbSAtLXN0cmlwLXVubmVlZGVkCi1SZW1vdmUgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgotCi1AaXRlbSAtSyBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1rZWVwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1LZWVwIG9ubHkgc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gZnJvbSB0aGUgc291cmNlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkKLWJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtTiBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1zdHJpcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotUmVtb3ZlIHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbiBtYXkgYmUKLWdpdmVuIG1vcmUgdGhhbiBvbmNlLCBhbmQgbWF5IGJlIGNvbWJpbmVkIHdpdGggc3RyaXAgb3B0aW9ucyBvdGhlciB0aGFuCi1AY29kZXstS30uCi0KLUBpdGVtIC1vIEB2YXJ7ZmlsZX0KLVB1dCB0aGUgc3RyaXBwZWQgb3V0cHV0IGluIEB2YXJ7ZmlsZX0sIHJhdGhlciB0aGFuIHJlcGxhY2luZyB0aGUKLWV4aXN0aW5nIGZpbGUuICBXaGVuIHRoaXMgYXJndW1lbnQgaXMgdXNlZCwgb25seSBvbmUgQHZhcntvYmpmaWxlfQotYXJndW1lbnQgbWF5IGJlIHNwZWNpZmllZC4KLQotQGl0ZW0gLXAKLUBpdGVteCAtLXByZXNlcnZlLWRhdGVzCi1QcmVzZXJ2ZSB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIGZpbGUuCi0KLUBpdGVtIC14Ci1AaXRlbXggLS1kaXNjYXJkLWFsbAotUmVtb3ZlIG5vbi1nbG9iYWwgc3ltYm9scy4KLQotQGl0ZW0gLVgKLUBpdGVteCAtLWRpc2NhcmQtbG9jYWxzCi1SZW1vdmUgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuCi0oVGhlc2UgdXN1YWxseSBzdGFydCB3aXRoIEBzYW1we0x9IG9yIEBzYW1wey59LikKLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXtzdHJpcH0uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJib3NlCi1WZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKLWFyY2hpdmVzLCBAc2FtcHtzdHJpcCAtdn0gbGlzdHMgYWxsIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIGMrK2ZpbHQsIGFkZHIybGluZSwgc3RyaXAsIFRvcAotQGNoYXB0ZXIgYysrZmlsdAotCi1Aa2luZGV4IGMrK2ZpbHQKLUBjaW5kZXggZGVtYW5nbGluZyBDKysgc3ltYm9scwotCi1Ac21hbGxleGFtcGxlCi1jKytmaWx0IFsgLV8gfCAtLXN0cmlwLXVuZGVyc2NvcmVzIF0KLSAgICAgICAgWyAtaiB8IC0tamF2YSBdCi0JWyAtbiB8IC0tbm8tc3RyaXAtdW5kZXJzY29yZXMgXQotICAgICAgICBbIC1zIEB2YXJ7Zm9ybWF0fSB8IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fSBdCi0gICAgICAgIFsgLS1oZWxwIF0gIFsgLS12ZXJzaW9uIF0gIFsgQHZhcntzeW1ib2x9QGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Aa2luZGV4IGN4eGZpbHQKLVRoZSBDKysgYW5kIEphdmEgbGFuZ3VhZ2VzIHByb3ZpZGVzIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCB3aGljaCBtZWFucwotdGhhdCB5b3UgY2FuIHdyaXRlIG1hbnkgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAocHJvdmlkaW5nIGVhY2gKLXRha2VzIHBhcmFtZXRlcnMgb2YgZGlmZmVyZW50IHR5cGVzKS4gIEFsbCBDKysgYW5kIEphdmEgZnVuY3Rpb24gbmFtZXMKLWFyZSBlbmNvZGVkIGludG8gYSBsb3ctbGV2ZWwgYXNzZW1ibHkgbGFiZWwgKHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcwotQGRmbnttYW5nbGluZ30pLiBUaGUgQGNvZGV7YysrZmlsdH0KLUBmb290bm90ZXtNUy1ET1MgZG9lcyBub3QgYWxsb3cgQGtiZHsrfSBjaGFyYWN0ZXJzIGluIGZpbGUgbmFtZXMsIHNvIG9uCi1NUy1ET1MgdGhpcyBwcm9ncmFtIGlzIG5hbWVkIEBjb2Rle2N4eGZpbHR9Ln0KLXByb2dyYW0gZG9lcyB0aGUgaW52ZXJzZSBtYXBwaW5nOiBpdCBkZWNvZGVzIChAZGZue2RlbWFuZ2xlc30pIGxvdy1sZXZlbAotbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4ga2VlcCB0aGVzZSBvdmVybG9hZGVkCi1mdW5jdGlvbnMgZnJvbSBjbGFzaGluZy4KLQotRXZlcnkgYWxwaGFudW1lcmljIHdvcmQgKGNvbnNpc3Rpbmcgb2YgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywKLWRvbGxhcnMsIG9yIHBlcmlvZHMpIHNlZW4gaW4gdGhlIGlucHV0IGlzIGEgcG90ZW50aWFsIGxhYmVsLiAgSWYgdGhlCi1sYWJlbCBkZWNvZGVzIGludG8gYSBDKysgbmFtZSwgdGhlIEMrKyBuYW1lIHJlcGxhY2VzIHRoZSBsb3ctbGV2ZWwKLW5hbWUgaW4gdGhlIG91dHB1dC4KLQotWW91IGNhbiB1c2UgQGNvZGV7YysrZmlsdH0gdG8gZGVjaXBoZXIgaW5kaXZpZHVhbCBzeW1ib2xzOgotCi1AZXhhbXBsZQotYysrZmlsdCBAdmFye3N5bWJvbH0KLUBlbmQgZXhhbXBsZQotCi1JZiBubyBAdmFye3N5bWJvbH0gYXJndW1lbnRzIGFyZSBnaXZlbiwgQGNvZGV7YysrZmlsdH0gcmVhZHMgc3ltYm9sCi1uYW1lcyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGVzIHRoZSBkZW1hbmdsZWQgbmFtZXMgdG8gdGhlCi1zdGFuZGFyZCBvdXRwdXQuICBBbGwgcmVzdWx0cyBhcmUgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1fCi1AaXRlbXggLS1zdHJpcC11bmRlcnNjb3JlcwotT24gc29tZSBzeXN0ZW1zLCBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHB1dCBhbiB1bmRlcnNjb3JlIGluIGZyb250Ci1vZiBldmVyeSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBDIG5hbWUgQGNvZGV7Zm9vfSBnZXRzIHRoZSBsb3ctbGV2ZWwKLW5hbWUgQGNvZGV7X2Zvb30uICBUaGlzIG9wdGlvbiByZW1vdmVzIHRoZSBpbml0aWFsIHVuZGVyc2NvcmUuICBXaGV0aGVyCi1AY29kZXtjKytmaWx0fSByZW1vdmVzIHRoZSB1bmRlcnNjb3JlIGJ5IGRlZmF1bHQgaXMgdGFyZ2V0IGRlcGVuZGVudC4KLQotQGl0ZW0gLWoKLUBpdGVteCAtLWphdmEKLVByaW50cyBkZW1hbmdsZWQgbmFtZXMgdXNpbmcgSmF2YSBzeW50YXguICBUaGUgZGVmYXVsdCBpcyB0byB1c2UgQysrCi1zeW50YXguCi0KLUBpdGVtIC1uCi1AaXRlbXggLS1uby1zdHJpcC11bmRlcnNjb3JlcwotRG8gbm90IHJlbW92ZSB0aGUgaW5pdGlhbCB1bmRlcnNjb3JlLgotCi1AaXRlbSAtcyBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLWZvcm1hdD1AdmFye2Zvcm1hdH0KLUBzY3tnbnV9IEBjb2Rle25tfSBjYW4gZGVjb2RlIHRocmVlIGRpZmZlcmVudCBtZXRob2RzIG9mIG1hbmdsaW5nLCB1c2VkIGJ5Ci1kaWZmZXJlbnQgQysrIGNvbXBpbGVycy4gIFRoZSBhcmd1bWVudCB0byB0aGlzIG9wdGlvbiBzZWxlY3RzIHdoaWNoCi1tZXRob2QgaXQgdXNlczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBnbnUKLXRoZSBvbmUgdXNlZCBieSB0aGUgQHNje2dudX0gY29tcGlsZXIgKHRoZSBkZWZhdWx0IG1ldGhvZCkKLUBpdGVtIGx1Y2lkCi10aGUgb25lIHVzZWQgYnkgdGhlIEx1Y2lkIGNvbXBpbGVyCi1AaXRlbSBhcm0KLXRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBDKysgQW5ub3RhdGVkIFJlZmVyZW5jZSBNYW51YWwKLUBpdGVtIGhwCi10aGUgb25lIHVzZWQgYnkgdGhlIEhQIGNvbXBpbGVyCi1AaXRlbSBlZGcKLXRoZSBvbmUgdXNlZCBieSB0aGUgRURHIGNvbXBpbGVyCi1AZW5kIHRhYmxlCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle2MrK2ZpbHR9IGFuZCBleGl0LgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtjKytmaWx0fSBhbmQgZXhpdC4KLUBlbmQgdGFibGUKLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rle2MrK2ZpbHR9IGlzIGEgbmV3IHV0aWxpdHksIGFuZCB0aGUgZGV0YWlscyBvZiBpdHMKLXVzZXIgaW50ZXJmYWNlIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuICBJbiBwYXJ0aWN1bGFyLAotYSBjb21tYW5kLWxpbmUgb3B0aW9uIG1heSBiZSByZXF1aXJlZCBpbiB0aGUgdGhlIGZ1dHVyZSB0byBkZWNvZGUgYSBuYW1lCi1wYXNzZWQgYXMgYW4gYXJndW1lbnQgb24gdGhlIGNvbW1hbmQgbGluZTsgaW4gb3RoZXIgd29yZHMsIAotCi1AZXhhbXBsZQotYysrZmlsdCBAdmFye3N5bWJvbH0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLW1heSBpbiBhIGZ1dHVyZSByZWxlYXNlIGJlY29tZQotCi1AZXhhbXBsZQotYysrZmlsdCBAdmFye29wdGlvbn0gQHZhcntzeW1ib2x9Ci1AZW5kIGV4YW1wbGUKLUBlbmQgcXVvdGF0aW9uCi0KLUBub2RlIGFkZHIybGluZQotQGNoYXB0ZXIgYWRkcjJsaW5lCi0KLUBraW5kZXggYWRkcjJsaW5lCi1AY2luZGV4IGFkZHJlc3MgdG8gZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgotCi1Ac21hbGxleGFtcGxlCi1hZGRyMmxpbmUgWyAtYiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgICAgWyAtQyB8IC0tZGVtYW5nbGUgXQotICAgICAgICAgIFsgLWUgQHZhcntmaWxlbmFtZX0gfCAtLWV4ZT1AdmFye2ZpbGVuYW1lfSBdCi0gICAgICAgICAgWyAtZiB8IC0tZnVuY3Rpb25zIF0gWyAtcyB8IC0tYmFzZW5hbWUgXQotICAgICAgICAgIFsgLUggfCAtLWhlbHAgXSBbIC1WIHwgLS12ZXJzaW9uIF0KLSAgICAgICAgICBbIGFkZHIgYWRkciAuLi4gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7YWRkcjJsaW5lfSB0cmFuc2xhdGVzIHByb2dyYW0gYWRkcmVzc2VzIGludG8gZmlsZSBuYW1lcyBhbmQgbGluZQotbnVtYmVycy4gIEdpdmVuIGFuIGFkZHJlc3MgYW5kIGFuIGV4ZWN1dGFibGUsIGl0IHVzZXMgdGhlIGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIGV4ZWN1dGFibGUgdG8gZmlndXJlIG91dCB3aGljaCBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYWRkcmVzcy4KLQotVGhlIGV4ZWN1dGFibGUgdG8gdXNlIGlzIHNwZWNpZmllZCB3aXRoIHRoZSBAY29kZXstZX0gb3B0aW9uLiAgVGhlCi1kZWZhdWx0IGlzIHRoZSBmaWxlIEBmaWxle2Eub3V0fS4KLQotQGNvZGV7YWRkcjJsaW5lfSBoYXMgdHdvIG1vZGVzIG9mIG9wZXJhdGlvbi4KLQotSW4gdGhlIGZpcnN0LCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLAotYW5kIEBjb2Rle2FkZHIybGluZX0gZGlzcGxheXMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2gKLWFkZHJlc3MuCi0KLUluIHRoZSBzZWNvbmQsIEBjb2Rle2FkZHIybGluZX0gcmVhZHMgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGZyb20KLXN0YW5kYXJkIGlucHV0LCBhbmQgcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoCi1hZGRyZXNzIG9uIHN0YW5kYXJkIG91dHB1dC4gIEluIHRoaXMgbW9kZSwgQGNvZGV7YWRkcjJsaW5lfSBtYXkgYmUgdXNlZAotaW4gYSBwaXBlIHRvIGNvbnZlcnQgZHluYW1pY2FsbHkgY2hvc2VuIGFkZHJlc3Nlcy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGlzIEBzYW1we0ZJTEVOQU1FOkxJTkVOT30uICBUaGUgZmlsZSBuYW1lIGFuZAotbGluZSBudW1iZXIgZm9yIGVhY2ggYWRkcmVzcyBpcyBwcmludGVkIG9uIGEgc2VwYXJhdGUgbGluZS4gIElmIHRoZQotQGNvZGV7LWZ9IG9wdGlvbiBpcyB1c2VkLCB0aGVuIGVhY2ggQHNhbXB7RklMRU5BTUU6TElORU5PfSBsaW5lIGlzCi1wcmVjZWRlZCBieSBhIEBzYW1we0ZVTkNUSU9OTkFNRX0gbGluZSB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KLWNvbnRhaW5pbmcgdGhlIGFkZHJlc3MuCi0KLUlmIHRoZSBmaWxlIG5hbWUgb3IgZnVuY3Rpb24gbmFtZSBjYW4gbm90IGJlIGRldGVybWluZWQsCi1AY29kZXthZGRyMmxpbmV9IHdpbGwgcHJpbnQgdHdvIHF1ZXN0aW9uIG1hcmtzIGluIHRoZWlyIHBsYWNlLiAgSWYgdGhlCi1saW5lIG51bWJlciBjYW4gbm90IGJlIGRldGVybWluZWQsIEBjb2Rle2FkZHIybGluZX0gd2lsbCBwcmludCAwLgotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYiBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKLVNwZWNpZnkgdGhhdCB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIGlzCi1AdmFye2JmZG5hbWV9LgotCi1AaXRlbSAtQwotQGl0ZW14IC0tZGVtYW5nbGUKLUBjaW5kZXggZGVtYW5nbGluZyBpbiBvYmpkdW1wCi1EZWNvZGUgKEBkZm57ZGVtYW5nbGV9KSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLiAgQHhyZWZ7YysrZmlsdH0sIGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiBkZW1hbmdsaW5nLgotCi1AaXRlbSAtZSBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tZXhlPUB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGZvciB3aGljaCBhZGRyZXNzZXMgc2hvdWxkIGJlCi10cmFuc2xhdGVkLiAgVGhlIGRlZmF1bHQgZmlsZSBpcyBAZmlsZXthLm91dH0uCi0KLUBpdGVtIC1mCi1AaXRlbXggLS1mdW5jdGlvbnMKLURpc3BsYXkgZnVuY3Rpb24gbmFtZXMgYXMgd2VsbCBhcyBmaWxlIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLWJhc2VuYW1lcwotRGlzcGxheSBvbmx5IHRoZSBiYXNlIG9mIGVhY2ggZmlsZSBuYW1lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBubG1jb252Ci1AY2hhcHRlciBubG1jb252Ci0KLUBjb2Rle25sbWNvbnZ9IGNvbnZlcnRzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUgaW50byBhIE5ldFdhcmUKLUxvYWRhYmxlIE1vZHVsZS4KLQotQGlnbm9yZQotQGNvZGV7bmxtY29udn0gY3VycmVudGx5IHdvcmtzIHdpdGggQHNhbXB7aTM4Nn0gb2JqZWN0Ci1maWxlcyBpbiBAY29kZXtjb2ZmfSwgQHNje2VsZn0sIG9yIEBjb2Rle2Eub3V0fSBmb3JtYXQsIGFuZCBAc2N7U1BBUkN9Ci1vYmplY3QgZmlsZXMgaW4gQHNje2VsZn0sIG9yIEBjb2Rle2Eub3V0fSBmb3JtYXRAZm9vdG5vdGV7Ci1AY29kZXtubG1jb252fSBzaG91bGQgd29yayB3aXRoIGFueSBAc2FtcHtpMzg2fSBvciBAc2N7c3BhcmN9IG9iamVjdAotZm9ybWF0IGluIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuICBJdCBoYXMgb25seSBiZWVuIHRlc3RlZAotd2l0aCB0aGUgYWJvdmUgZm9ybWF0cy59LgotQGVuZCBpZ25vcmUKLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rle25sbWNvbnZ9IGlzIG5vdCBhbHdheXMgYnVpbHQgYXMgcGFydCBvZiB0aGUgYmluYXJ5Ci11dGlsaXRpZXMsIHNpbmNlIGl0IGlzIG9ubHkgdXNlZnVsIGZvciBOTE0gdGFyZ2V0cy4KLUBlbmQgcXVvdGF0aW9uCi0KLUBzbWFsbGV4YW1wbGUKLW5sbWNvbnYgWyAtSSBAdmFye2JmZG5hbWV9IHwgLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgIFsgLU8gQHZhcntiZmRuYW1lfSB8IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtVCBAdmFye2hlYWRlcmZpbGV9IHwgLS1oZWFkZXItZmlsZT1AdmFye2hlYWRlcmZpbGV9IF0KLSAgICAgICAgWyAtZCB8IC0tZGVidWddICBbIC1sIEB2YXJ7bGlua2VyfSB8IC0tbGlua2VyPUB2YXJ7bGlua2VyfSBdCi0gICAgICAgIFsgLWggfCAtLWhlbHAgXSAgWyAtViB8IC0tdmVyc2lvbiBdCi0gICAgICAgIEB2YXJ7aW5maWxlfSBAdmFye291dGZpbGV9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtubG1jb252fSBjb252ZXJ0cyB0aGUgcmVsb2NhdGFibGUgQHNhbXB7aTM4Nn0gb2JqZWN0IGZpbGUKLUB2YXJ7aW5maWxlfSBpbnRvIHRoZSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSBAdmFye291dGZpbGV9LCBvcHRpb25hbGx5Ci1yZWFkaW5nIEB2YXJ7aGVhZGVyZmlsZX0gZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zCi1vbiB3cml0aW5nIHRoZSBOTE0gY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWUgdGhlCi1Ac2FtcHtsaW5rZXJzfSBzZWN0aW9uLCBAc2FtcHtOTE1MSU5LfSBpbiBwYXJ0aWN1bGFyLCBvZiB0aGUgQGNpdGV7TkxNCi1EZXZlbG9wbWVudCBhbmQgVG9vbHMgT3ZlcnZpZXd9LCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBOTE0gU29mdHdhcmUKLURldmVsb3BlcidzIEtpdCAoYGBOTE0gU0RLJycpLCBhdmFpbGFibGUgZnJvbSBOb3ZlbGwsIEluYy4KLUBjb2Rle25sbWNvbnZ9IHVzZXMgdGhlIEBzY3tnbnV9IEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeSB0byByZWFkCi1AdmFye2luZmlsZX07IHNlZSBAcmVme0JGRCwsQkZELGxkLmluZm8sVXNpbmcgTER9LCBmb3IKLW1vcmUgaW5mb3JtYXRpb24uCi0KLUBjb2Rle25sbWNvbnZ9IGNhbiBwZXJmb3JtIGEgbGluayBzdGVwLiAgSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gbGlzdAotbW9yZSB0aGFuIG9uZSBvYmplY3QgZmlsZSBmb3IgaW5wdXQgaWYgeW91IGxpc3QgdGhlbSBpbiB0aGUgZGVmaW5pdGlvbnMKLWZpbGUgKHJhdGhlciB0aGFuIHNpbXBseSBzcGVjaWZ5aW5nIG9uZSBpbnB1dCBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUpLgotSW4gdGhpcyBjYXNlLCBAY29kZXtubG1jb252fSBjYWxscyB0aGUgbGlua2VyIGZvciB5b3UuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUkgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLU9iamVjdCBmb3JtYXQgb2YgdGhlIGlucHV0IGZpbGUuICBAY29kZXtubG1jb252fSBjYW4gdXN1YWxseSBkZXRlcm1pbmUKLXRoZSBmb3JtYXQgb2YgYSBnaXZlbiBmaWxlIChzbyBubyBkZWZhdWx0IGlzIG5lY2Vzc2FyeSkuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1PIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotT2JqZWN0IGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUuICBAY29kZXtubG1jb252fSBpbmZlcnMgdGhlIG91dHB1dAotZm9ybWF0IGJhc2VkIG9uIHRoZSBpbnB1dCBmb3JtYXQsIGUuZy4gZm9yIGEgQHNhbXB7aTM4Nn0gaW5wdXQgZmlsZSB0aGUKLW91dHB1dCBmb3JtYXQgaXMgQHNhbXB7bmxtMzItaTM4Nn0uCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1UIEB2YXJ7aGVhZGVyZmlsZX0KLUBpdGVteCAtLWhlYWRlci1maWxlPUB2YXJ7aGVhZGVyZmlsZX0KLVJlYWRzIEB2YXJ7aGVhZGVyZmlsZX0gZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zIG9uCi13cml0aW5nIHRoZSBOTE0gY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWVAIHNlZSB0aGUKLUBzYW1we2xpbmtlcnN9IHNlY3Rpb24sIG9mIHRoZSBAY2l0ZXtOTE0gRGV2ZWxvcG1lbnQgYW5kIFRvb2xzCi1PdmVydmlld30sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIE5MTSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBLaXQsIGF2YWlsYWJsZQotZnJvbSBOb3ZlbGwsIEluYy4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWRlYnVnCi1EaXNwbGF5cyAob24gc3RhbmRhcmQgZXJyb3IpIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lIHVzZWQgYnkgQGNvZGV7bmxtY29udn0uCi0KLUBpdGVtIC1sIEB2YXJ7bGlua2VyfQotQGl0ZW14IC0tbGlua2VyPUB2YXJ7bGlua2VyfQotVXNlIEB2YXJ7bGlua2VyfSBmb3IgYW55IGxpbmtpbmcuICBAdmFye2xpbmtlcn0gY2FuIGJlIGFuIGFic29sdXRlIG9yIGEKLXJlbGF0aXZlIHBhdGhuYW1lLgotCi1AaXRlbSAtaAotQGl0ZW14IC0taGVscAotUHJpbnRzIGEgdXNhZ2Ugc3VtbWFyeS4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLVByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle25sbWNvbnZ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSB3aW5kcmVzCi1AY2hhcHRlciB3aW5kcmVzCi0KLUBjb2Rle3dpbmRyZXN9IG1heSBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXt3aW5kcmVzfSBpcyBub3QgYWx3YXlzIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIGJpbmFyeQotdXRpbGl0aWVzLCBzaW5jZSBpdCBpcyBvbmx5IHVzZWZ1bCBmb3IgV2luZG93cyB0YXJnZXRzLgotQGVuZCBxdW90YXRpb24KLQotQHNtYWxsZXhhbXBsZQotd2luZHJlcyBbb3B0aW9uc10gW2lucHV0LWZpbGVdIFtvdXRwdXQtZmlsZV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle3dpbmRyZXN9IHJlYWRzIHJlc291cmNlcyBmcm9tIGFuIGlucHV0IGZpbGUgYW5kIGNvcGllcyB0aGVtIGludG8KLWFuIG91dHB1dCBmaWxlLiAgRWl0aGVyIGZpbGUgbWF5IGJlIGluIG9uZSBvZiB0aHJlZSBmb3JtYXRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHJjCi1BIHRleHQgZm9ybWF0IHJlYWQgYnkgdGhlIFJlc291cmNlIENvbXBpbGVyLgotCi1AaXRlbSByZXMKLUEgYmluYXJ5IGZvcm1hdCBnZW5lcmF0ZWQgYnkgdGhlIFJlc291cmNlIENvbXBpbGVyLgotCi1AaXRlbSBjb2ZmCi1BIENPRkYgb2JqZWN0IG9yIGV4ZWN1dGFibGUuCi1AZW5kIHRhYmxlCi0KLVRoZSBleGFjdCBkZXNjcmlwdGlvbiBvZiB0aGVzZSBkaWZmZXJlbnQgZm9ybWF0cyBpcyBhdmFpbGFibGUgaW4KLWRvY3VtZW50YXRpb24gZnJvbSBNaWNyb3NvZnQuCi0KLVdoZW4gQGNvZGV7d2luZHJlc30gY29udmVydHMgZnJvbSB0aGUgQGNvZGV7cmN9IGZvcm1hdCB0byB0aGUgQGNvZGV7cmVzfQotZm9ybWF0LCBpdCBpcyBhY3RpbmcgbGlrZSB0aGUgV2luZG93cyBSZXNvdXJjZSBDb21waWxlci4gIFdoZW4KLUBjb2Rle3dpbmRyZXN9IGNvbnZlcnRzIGZyb20gdGhlIEBjb2Rle3Jlc30gZm9ybWF0IHRvIHRoZSBAY29kZXtjb2ZmfQotZm9ybWF0LCBpdCBpcyBhY3RpbmcgbGlrZSB0aGUgV2luZG93cyBAY29kZXtDVlRSRVN9IHByb2dyYW0uCi0KLVdoZW4gQGNvZGV7d2luZHJlc30gZ2VuZXJhdGVzIGFuIEBjb2Rle3JjfSBmaWxlLCB0aGUgb3V0cHV0IGlzIHNpbWlsYXIKLWJ1dCBub3QgaWRlbnRpY2FsIHRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgZm9yIHRoZSBpbnB1dC4gIFdoZW4gYW4gaW5wdXQKLUBjb2Rle3JjfSBmaWxlIHJlZmVycyB0byBhbiBleHRlcm5hbCBmaWxlbmFtZSwgYW4gb3V0cHV0IEBjb2Rle3JjfSBmaWxlCi13aWxsIGluc3RlYWQgaW5jbHVkZSB0aGUgZmlsZSBjb250ZW50cy4KLQotSWYgdGhlIGlucHV0IG9yIG91dHB1dCBmb3JtYXQgaXMgbm90IHNwZWNpZmllZCwgQGNvZGV7d2luZHJlc30gd2lsbAotZ3Vlc3MgYmFzZWQgb24gdGhlIGZpbGUgbmFtZSwgb3IsIGZvciB0aGUgaW5wdXQgZmlsZSwgdGhlIGZpbGUgY29udGVudHMuCi1BIGZpbGUgd2l0aCBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnJjfSB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gQGNvZGV7cmN9Ci1maWxlLCBhIGZpbGUgd2l0aCBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnJlc30gd2lsbCBiZSB0cmVhdGVkIGFzIGEKLUBjb2Rle3Jlc30gZmlsZSwgYW5kIGEgZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsub30gb3IKLUBmaWxley5leGV9IHdpbGwgYmUgdHJlYXRlZCBhcyBhIEBjb2Rle2NvZmZ9IGZpbGUuCi0KLUlmIG5vIG91dHB1dCBmaWxlIGlzIHNwZWNpZmllZCwgQGNvZGV7d2luZHJlc30gd2lsbCBwcmludCB0aGUgcmVzb3VyY2VzCi1pbiBAY29kZXtyY30gZm9ybWF0IHRvIHN0YW5kYXJkIG91dHB1dC4KLQotVGhlIG5vcm1hbCB1c2UgaXMgZm9yIHlvdSB0byB3cml0ZSBhbiBAY29kZXtyY30gZmlsZSwgdXNlIEBjb2Rle3dpbmRyZXN9Ci10byBjb252ZXJ0IGl0IHRvIGEgQ09GRiBvYmplY3QgZmlsZSwgYW5kIHRoZW4gbGluayB0aGUgQ09GRiBmaWxlIGludG8KLXlvdXIgYXBwbGljYXRpb24uICBUaGlzIHdpbGwgbWFrZSB0aGUgcmVzb3VyY2VzIGRlc2NyaWJlZCBpbiB0aGUKLUBjb2Rle3JjfSBmaWxlIGF2YWlsYWJsZSB0byBXaW5kb3dzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1pIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1pbnB1dCBAdmFye2ZpbGVuYW1lfQotVGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUuICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlbgotQGNvZGV7d2luZHJlc30gd2lsbCB1c2UgdGhlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQgYXMgdGhlIGlucHV0IGZpbGUKLW5hbWUuICBJZiB0aGVyZSBhcmUgbm8gbm9uLW9wdGlvbiBhcmd1bWVudHMsIHRoZW4gQGNvZGV7d2luZHJlc30gd2lsbAotcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgQGNvZGV7d2luZHJlc30gY2FuIG5vdCByZWFkIGEgQ09GRiBmaWxlIGZyb20KLXN0YW5kYXJkIGlucHV0LgotCi1AaXRlbSAtbyBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tb3V0cHV0IEB2YXJ7ZmlsZW5hbWV9Ci1UaGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUuICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlbgotQGNvZGV7d2luZHJlc30gd2lsbCB1c2UgdGhlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQsIGFmdGVyIGFueSB1c2VkCi1mb3IgdGhlIGlucHV0IGZpbGUgbmFtZSwgYXMgdGhlIG91dHB1dCBmaWxlIG5hbWUuICBJZiB0aGVyZSBpcyBubwotbm9uLW9wdGlvbiBhcmd1bWVudCwgdGhlbiBAY29kZXt3aW5kcmVzfSB3aWxsIHdyaXRlIHRvIHN0YW5kYXJkIG91dHB1dC4KLUBjb2Rle3dpbmRyZXN9IGNhbiBub3Qgd3JpdGUgYSBDT0ZGIGZpbGUgdG8gc3RhbmRhcmQgb3V0cHV0LgotCi1AaXRlbSAtSSBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLWlucHV0LWZvcm1hdCBAdmFye2Zvcm1hdH0KLVRoZSBpbnB1dCBmb3JtYXQgdG8gcmVhZC4gIEB2YXJ7Zm9ybWF0fSBtYXkgYmUgQHNhbXB7cmVzfSwgQHNhbXB7cmN9LCBvcgotQHNhbXB7Y29mZn0uICBJZiBubyBpbnB1dCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBAY29kZXt3aW5kcmVzfSB3aWxsCi1ndWVzcywgYXMgZGVzY3JpYmVkIGFib3ZlLgotCi1AaXRlbSAtTyBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLW91dHB1dC1mb3JtYXQgQHZhcntmb3JtYXR9Ci1UaGUgb3V0cHV0IGZvcm1hdCB0byBnZW5lcmF0ZS4gIEB2YXJ7Zm9ybWF0fSBtYXkgYmUgQHNhbXB7cmVzfSwKLUBzYW1we3JjfSwgb3IgQHNhbXB7Y29mZn0uICBJZiBubyBvdXRwdXQgZm9ybWF0IGlzIHNwZWNpZmllZCwKLUBjb2Rle3dpbmRyZXN9IHdpbGwgZ3Vlc3MsIGFzIGRlc2NyaWJlZCBhYm92ZS4KLQotQGl0ZW0gLUYgQHZhcnt0YXJnZXR9Ci1AaXRlbXggLS10YXJnZXQgQHZhcnt0YXJnZXR9Ci1TcGVjaWZ5IHRoZSBCRkQgZm9ybWF0IHRvIHVzZSBmb3IgYSBDT0ZGIGZpbGUgYXMgaW5wdXQgb3Igb3V0cHV0LiAgVGhpcwotaXMgYSBCRkQgdGFyZ2V0IG5hbWU7IHlvdSBjYW4gdXNlIHRoZSBAY29kZXstLWhlbHB9IG9wdGlvbiB0byBzZWUgYSBsaXN0Ci1vZiBzdXBwb3J0ZWQgdGFyZ2V0cy4gIE5vcm1hbGx5IEBjb2Rle3dpbmRyZXN9IHdpbGwgdXNlIHRoZSBkZWZhdWx0Ci1mb3JtYXQsIHdoaWNoIGlzIHRoZSBmaXJzdCBvbmUgbGlzdGVkIGJ5IHRoZSBAY29kZXstLWhlbHB9IG9wdGlvbi4KLUByZWZ7VGFyZ2V0IFNlbGVjdGlvbn0uCi0KLUBpdGVtIC0tcHJlcHJvY2Vzc29yIEB2YXJ7cHJvZ3JhbX0KLVdoZW4gQGNvZGV7d2luZHJlc30gcmVhZHMgYW4gQGNvZGV7cmN9IGZpbGUsIGl0IHJ1bnMgaXQgdGhyb3VnaCB0aGUgQwotcHJlcHJvY2Vzc29yIGZpcnN0LiAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJlcHJvY2Vzc29yCi10byB1c2UsIGluY2x1ZGluZyBhbnkgbGVhZGluZyBhcmd1bWVudHMuICBUaGUgZGVmYXVsdCBwcmVwcm9jZXNzb3IKLWFyZ3VtZW50IGlzIEBjb2Rle2djYyAtRSAteGMtaGVhZGVyIC1EUkNfSU5WT0tFRH0uCi0KLUBpdGVtIC0taW5jbHVkZS1kaXIgQHZhcntkaXJlY3Rvcnl9Ci1TcGVjaWZ5IGFuIGluY2x1ZGUgZGlyZWN0b3J5IHRvIHVzZSB3aGVuIHJlYWRpbmcgYW4gQGNvZGV7cmN9IGZpbGUuCi1AY29kZXt3aW5kcmVzfSB3aWxsIHBhc3MgdGhpcyB0byB0aGUgcHJlcHJvY2Vzc29yIGFzIGFuIEBjb2Rley1JfQotb3B0aW9uLiAgQGNvZGV7d2luZHJlc30gd2lsbCBhbHNvIHNlYXJjaCB0aGlzIGRpcmVjdG9yeSB3aGVuIGxvb2tpbmcgZm9yCi1maWxlcyBuYW1lZCBpbiB0aGUgQGNvZGV7cmN9IGZpbGUuCi0KLUBpdGVtIC1EIEB2YXJ7dGFyZ2V0fQotQGl0ZW14IC0tZGVmaW5lIEB2YXJ7c3ltfVs9QHZhcnt2YWx9XQotU3BlY2lmeSBhIEBjb2Rley1EfSBvcHRpb24gdG8gcGFzcyB0byB0aGUgcHJlcHJvY2Vzc29yIHdoZW4gcmVhZGluZyBhbgotQGNvZGV7cmN9IGZpbGUuCi0KLUBpdGVtIC12Ci1FbmFibGUgdmVyYm9zZSBtb2RlLiAgVGhpcyB0ZWxscyB5b3Ugd2hhdCB0aGUgcHJlcHJvY2Vzc29yIGlzIGlmIHlvdQotZGlkbid0IHNwZWNpZnkgb25lLgotCi1AaXRlbSAtLWxhbmd1YWdlIEB2YXJ7dmFsfQotU3BlY2lmeSB0aGUgZGVmYXVsdCBsYW5ndWFnZSB0byB1c2Ugd2hlbiByZWFkaW5nIGFuIEBjb2Rle3JjfSBmaWxlLgotQHZhcnt2YWx9IHNob3VsZCBiZSBhIGhleGFkZWNpbWFsIGxhbmd1YWdlIGNvZGUuICBUaGUgbG93IGVpZ2h0IGJpdHMgYXJlCi10aGUgbGFuZ3VhZ2UsIGFuZCB0aGUgaGlnaCBlaWdodCBiaXRzIGFyZSB0aGUgc3VibGFuZ3VhZ2UuCi0KLUBpdGVtIC0tdXNlLXRlbXAtZmlsZQotVXNlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gaW5zdGVhZCBvZiB1c2luZyBwb3BlbiB0byByZWFkIHRoZSBvdXRwdXQgb2YKLXRoZSBwcmVwcm9jZXNzb3IuIFVzZSB0aGlzIG9wdGlvbiBpZiB0aGUgcG9wZW4gaW1wbGVtZW50YXRpb24gaXMgYnVnZ3kgCi1vbiB0aGUgaG9zdCAoZWcuLCBjZXJ0YWluIG5vbi1FbmdsaXNoIGxhbmd1YWdlIHZlcnNpb25zIG9mIFdpbmRvd3MgOTUgYW5kIAotV2luZG93cyA5OCBhcmUga25vd24gdG8gaGF2ZSBidWdneSBwb3BlbiB3aGVyZSB0aGUgb3V0cHV0IHdpbGwgaW5zdGVhZAotZ28gdGhlIGNvbnNvbGUpLgotCi1AaXRlbSAtLW5vLXVzZS10ZW1wLWZpbGUKLVVzZSBwb3Blbiwgbm90IGEgdGVtcG9yYXJ5IGZpbGUsIHRvIHJlYWQgdGhlIG91dHB1dCBvZiB0aGUgcHJlcHJvY2Vzc29yLgotVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCi0KLUBpdGVtIC0taGVscAotUHJpbnRzIGEgdXNhZ2Ugc3VtbWFyeS4KLQotQGl0ZW0gLS12ZXJzaW9uCi1QcmludHMgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXt3aW5kcmVzfS4KLQotQGl0ZW0gLS15eWRlYnVnCi1JZiBAY29kZXt3aW5kcmVzfSBpcyBjb21waWxlZCB3aXRoIEBjb2Rle1lZREVCVUd9IGRlZmluZWQgYXMgQGNvZGV7MX0sCi10aGlzIHdpbGwgdHVybiBvbiBwYXJzZXIgZGVidWdnaW5nLgotQGVuZCB0YWJsZQotCi0KLUBub2RlIGRsbHRvb2wKLUBjaGFwdGVyIENyZWF0ZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgYW5kIHVzZSBETExzCi1AY2luZGV4IERMTAotQGtpbmRleCBkbGx0b29sCi0KLUBjb2Rle2RsbHRvb2x9IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UKLWR5bmFtaWMgbGluayBsaWJyYXJpZXMgKERMTHMpLgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gQGNvZGV7ZGxsdG9vbH0gaXMgbm90IGFsd2F5cyBidWlsdCBhcyBwYXJ0IG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcywgc2luY2UgaXQgaXMgb25seSB1c2VmdWwgZm9yIHRob3NlIHRhcmdldHMgd2hpY2ggc3VwcG9ydCBETExzLgotQGVuZCBxdW90YXRpb24KLQotQHNtYWxsZXhhbXBsZQotZGxsdG9vbCBbLWR8LS1pbnB1dC1kZWYgQHZhcntkZWYtZmlsZS1uYW1lfV0KLSAgICAgICAgWy1ifC0tYmFzZS1maWxlIEB2YXJ7YmFzZS1maWxlLW5hbWV9XQotICAgICAgICBbLWV8LS1vdXRwdXQtZXhwIEB2YXJ7ZXhwb3J0cy1maWxlLW5hbWV9XQotICAgICAgICBbLXp8LS1vdXRwdXQtZGVmIEB2YXJ7ZGVmLWZpbGUtbmFtZX1dCi0gICAgICAgIFstbHwtLW91dHB1dC1saWIgQHZhcntsaWJyYXJ5LWZpbGUtbmFtZX1dICAgICAgICAKLSAgICAgICAgWy0tZXhwb3J0LWFsbC1zeW1ib2xzXSBbLS1uby1leHBvcnQtYWxsLXN5bWJvbHNdCi0gICAgICAgIFstLWV4Y2x1ZGUtc3ltYm9scyBAdmFye2xpc3R9XQotICAgICAgICBbLS1uby1kZWZhdWx0LWV4Y2x1ZGVzXQotICAgICAgICBbLVN8LS1hcyBAdmFye3BhdGgtdG8tYXNzZW1ibGVyfV0gWy1mfC0tYXMtZmxhZ3MgQHZhcntvcHRpb25zfV0KLSAgICAgICAgWy1EfC0tZGxsbmFtZSBAdmFye25hbWV9XSBbLW18LS1tYWNoaW5lIEB2YXJ7bWFjaGluZX1dCi0gICAgICAgIFstYXwtLWFkZC1pbmRpcmVjdF0gWy1VfC0tYWRkLXVuZGVyc2NvcmVdIFsta3wtLWtpbGwtYXRdCi0gICAgICAgIFstQXwtLWFkZC1zdGRjYWxsLWFsaWFzXQotICAgICAgICBbLXh8LS1uby1pZGF0YTRdIFstY3wtLW5vLWlkYXRhNV0gWy1pfC0taW50ZXJ3b3JrXQotICAgICAgICBbLW58LS1ub2RlbGV0ZV0gWy12fC0tdmVyYm9zZV0gWy1ofC0taGVscF0gWy1WfC0tdmVyc2lvbl0KLSAgICAgICAgW29iamVjdC1maWxlIEBkb3Rze31dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtkbGx0b29sfSByZWFkcyBpdHMgaW5wdXRzLCB3aGljaCBjYW4gY29tZSBmcm9tIHRoZSBAc2FtcHstZH0gYW5kCi1Ac2FtcHstYn0gb3B0aW9ucyBhcyB3ZWxsIGFzIG9iamVjdCBmaWxlcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQKLWxpbmUuICBJdCB0aGVuIHByb2Nlc3NlcyB0aGVzZSBpbnB1dHMgYW5kIGlmIHRoZSBAc2FtcHstZX0gb3B0aW9uIGhhcwotYmVlbiBzcGVjaWZpZWQgaXQgY3JlYXRlcyBhIGV4cG9ydHMgZmlsZS4gIElmIHRoZSBAc2FtcHstbH0gb3B0aW9uCi1oYXMgYmVlbiBzcGVjaWZpZWQgaXQgY3JlYXRlcyBhIGxpYnJhcnkgZmlsZSBhbmQgaWYgdGhlIEBzYW1wey16fSBvcHRpb24KLWhhcyBiZWVuIHNwZWNpZmllZCBpdCBjcmVhdGVzIGEgZGVmIGZpbGUuICBBbnkgb3IgYWxsIG9mIHRoZSAtZSwgLWwKLWFuZCAteiBvcHRpb25zIGNhbiBiZSBwcmVzZW50IGluIG9uZSBpbnZvY2F0aW9uIG9mIGRsbHRvb2wuCi0KLVdoZW4gY3JlYXRpbmcgYSBETEwsIGFsb25nIHdpdGggdGhlIHNvdXJjZSBmb3IgdGhlIERMTCwgaXQgaXMgbmVjZXNzYXJ5Ci10byBoYXZlIHRocmVlIG90aGVyIGZpbGVzLiAgQGNvZGV7ZGxsdG9vbH0gY2FuIGhlbHAgd2l0aCB0aGUgY3JlYXRpb24gb2YKLXRoZXNlIGZpbGVzLgotCi1UaGUgZmlyc3QgZmlsZSBpcyBhIEBzYW1wey5kZWZ9IGZpbGUgd2hpY2ggc3BlY2lmaWVzIHdoaWNoIGZ1bmN0aW9ucyBhcmUKLWV4cG9ydGVkIGZyb20gdGhlIERMTCwgd2hpY2ggZnVuY3Rpb25zIHRoZSBETEwgaW1wb3J0cywgYW5kIHNvIG9uLiAgVGhpcwotaXMgYSB0ZXh0IGZpbGUgYW5kIGNhbiBiZSBjcmVhdGVkIGJ5IGhhbmQsIG9yIEBjb2Rle2RsbHRvb2x9IGNhbiBiZSB1c2VkCi10byBjcmVhdGUgaXQgdXNpbmcgdGhlIEBzYW1wey16fSBvcHRpb24uICBJbiB0aGlzIGNhc2UgQGNvZGV7ZGxsdG9vbH0KLXdpbGwgc2NhbiB0aGUgb2JqZWN0IGZpbGVzIHNwZWNpZmllZCBvbiBpdHMgY29tbWFuZCBsaW5lIGxvb2tpbmcgZm9yCi10aG9zZSBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBiZWVuIHNwZWNpYWxseSBtYXJrZWQgYXMgYmVpbmcgZXhwb3J0ZWQgYW5kCi1wdXQgZW50cmllcyBmb3IgdGhlbSBpbiB0aGUgLmRlZiBmaWxlIGl0IGNyZWF0ZXMuCi0KLUluIG9yZGVyIHRvIG1hcmsgYSBmdW5jdGlvbiBhcyBiZWluZyBleHBvcnRlZCBmcm9tIGEgRExMLCBpdCBuZWVkcyB0bwotaGF2ZSBhbiBAc2FtcHstZXhwb3J0OjxuYW1lX29mX2Z1bmN0aW9uPn0gZW50cnkgaW4gdGhlIEBzYW1wey5kcmVjdHZlfQotc2VjdGlvbiBvZiB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGNhbiBiZSBkb25lIGluIEMgYnkgdXNpbmcgdGhlCi1hc20oKSBvcGVyYXRvcjoKLQotQHNtYWxsZXhhbXBsZQotICBhc20gKCIuc2VjdGlvbiAuZHJlY3R2ZSIpOyAgCi0gIGFzbSAoIi5hc2NpaSBcIi1leHBvcnQ6bXlfZnVuY1wiIik7Ci0KLSAgaW50IG15X2Z1bmMgKHZvaWQpIEB7IEBkb3Rze30gQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBzZWNvbmQgZmlsZSBuZWVkZWQgZm9yIERMTCBjcmVhdGlvbiBpcyBhbiBleHBvcnRzIGZpbGUuICBUaGlzIGZpbGUKLWlzIGxpbmtlZCB3aXRoIHRoZSBvYmplY3QgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSBib2R5IG9mIHRoZSBETEwgYW5kIGl0Ci1oYW5kbGVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgRExMIGFuZCB0aGUgb3V0c2lkZSB3b3JsZC4gIFRoaXMgaXMgYQotYmluYXJ5IGZpbGUgYW5kIGl0IGNhbiBiZSBjcmVhdGVkIGJ5IGdpdmluZyB0aGUgQHNhbXB7LWV9IG9wdGlvbiB0bwotQGNvZGV7ZGxsdG9vbH0gd2hlbiBpdCBpcyBjcmVhdGluZyBvciByZWFkaW5nIGluIGEgLmRlZiBmaWxlLiAKLQotVGhlIHRoaXJkIGZpbGUgbmVlZGVkIGZvciBETEwgY3JlYXRpb24gaXMgdGhlIGxpYnJhcnkgZmlsZSB0aGF0IHByb2dyYW1zCi13aWxsIGxpbmsgd2l0aCBpbiBvcmRlciB0byBhY2Nlc3MgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgRExMLiAgVGhpcyBmaWxlCi1jYW4gYmUgY3JlYXRlZCBieSBnaXZpbmcgdGhlIEBzYW1wey1sfSBvcHRpb24gdG8gZGxsdG9vbCB3aGVuIGl0Ci1pcyBjcmVhdGluZyBvciByZWFkaW5nIGluIGEgLmRlZiBmaWxlLgotCi1AY29kZXtkbGx0b29sfSBidWlsZHMgdGhlIGxpYnJhcnkgZmlsZSBieSBoYW5kLCBidXQgaXQgYnVpbGRzIHRoZQotZXhwb3J0cyBmaWxlIGJ5IGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlcyBjb250YWluaW5nIGFzc2VtYmxlciBzdGF0ZW1lbnRzCi1hbmQgdGhlbiBhc3NlbWJsaW5nIHRoZXNlLiAgVGhlIEBzYW1wey1TfSBjb21tYW5kIGxpbmUgb3B0aW9uIGNhbiBiZQotdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBhc3NlbWJsZXIgdGhhdCBkbGx0b29sIHdpbGwgdXNlLAotYW5kIHRoZSBAc2FtcHstZn0gb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHBhc3Mgc3BlY2lmaWMgZmxhZ3MgdG8gdGhhdAotYXNzZW1ibGVyLiAgVGhlIEBzYW1wey1ufSBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IGRsbHRvb2wgZnJvbSBkZWxldGluZwotdGhlc2UgdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlcyB3aGVuIGl0IGlzIGRvbmUsIGFuZCBpZiBAc2FtcHstbn0gaXMKLXNwZWNpZmllZCB0d2ljZSB0aGVuIHRoaXMgd2lsbCBwcmV2ZW50IGRsbHRvb2wgZnJvbSBkZWxldGluZyB0aGUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZXMgaXQgdXNlZCB0byBidWlsZCB0aGUgbGlicmFyeS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIGNyZWF0aW5nIGEgRExMIGZyb20gYSBzb3VyY2UgZmlsZSBAc2FtcHtkbGwuY30gYW5kCi1hbHNvIGNyZWF0aW5nIGEgcHJvZ3JhbSAoZnJvbSBhbiBvYmplY3QgZmlsZSBjYWxsZWQgQHNhbXB7cHJvZ3JhbS5vfSkKLXRoYXQgdXNlcyB0aGF0IERMTDoKLQotQHNtYWxsZXhhbXBsZQotICBnY2MgLWMgZGxsLmMKLSAgZGxsdG9vbCAtZSBleHBvcnRzLm8gLWwgZGxsLmxpYiBkbGwubwotICBnY2MgZGxsLm8gZXhwb3J0cy5vIC1vIGRsbC5kbGwKLSAgZ2NjIHByb2dyYW0ubyBkbGwubGliIC1vIHByb2dyYW0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6Ci0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSAtZCBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0taW5wdXQtZGVmIEB2YXJ7ZmlsZW5hbWV9Ci1AY2luZGV4IGlucHV0IC5kZWYgZmlsZQotU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgLmRlZiBmaWxlIHRvIGJlIHJlYWQgaW4gYW5kIHByb2Nlc3NlZC4KLQotQGl0ZW0gLWIgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLWJhc2UtZmlsZSBAdmFye2ZpbGVuYW1lfQotQGNpbmRleCBiYXNlIGZpbGVzCi1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBiYXNlIGZpbGUgdG8gYmUgcmVhZCBpbiBhbmQgcHJvY2Vzc2VkLiAgVGhlCi1jb250ZW50cyBvZiB0aGlzIGZpbGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIGluIHRoZQotZXhwb3J0cyBmaWxlIGdlbmVyYXRlZCBieSBkbGx0b29sLgotCi1AaXRlbSAtZSBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tb3V0cHV0LWV4cCBAdmFye2ZpbGVuYW1lfQotU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBleHBvcnQgZmlsZSB0byBiZSBjcmVhdGVkIGJ5IGRsbHRvb2wuCi0KLUBpdGVtIC16IEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtZGVmIEB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIC5kZWYgZmlsZSB0byBiZSBjcmVhdGVkIGJ5IGRsbHRvb2wuCi0KLUBpdGVtIC1sIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtbGliIEB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgZmlsZSB0byBiZSBjcmVhdGVkIGJ5IGRsbHRvb2wuCi0KLUBpdGVtIC0tZXhwb3J0LWFsbC1zeW1ib2xzCi1UcmVhdCBhbGwgZ2xvYmFsIGFuZCB3ZWFrIGRlZmluZWQgc3ltYm9scyBmb3VuZCBpbiB0aGUgaW5wdXQgb2JqZWN0Ci1maWxlcyBhcyBzeW1ib2xzIHRvIGJlIGV4cG9ydGVkLiAgVGhlcmUgaXMgYSBzbWFsbCBsaXN0IG9mIHN5bWJvbHMgd2hpY2gKLWFyZSBub3QgZXhwb3J0ZWQgYnkgZGVmYXVsdDsgc2VlIHRoZSBAY29kZXstLW5vLWRlZmF1bHQtZXhjbHVkZXN9Ci1vcHRpb24uICBZb3UgbWF5IGFkZCB0byB0aGUgbGlzdCBvZiBzeW1ib2xzIHRvIG5vdCBleHBvcnQgYnkgdXNpbmcgdGhlCi1AY29kZXstLWV4Y2x1ZGUtc3ltYm9sc30gb3B0aW9uLgotCi1AaXRlbSAtLW5vLWV4cG9ydC1hbGwtc3ltYm9scwotT25seSBleHBvcnQgc3ltYm9scyBleHBsaWNpdGx5IGxpc3RlZCBpbiBhbiBpbnB1dCAuZGVmIGZpbGUgb3IgaW4KLUBzYW1wey5kcmVjdHZlfSBzZWN0aW9ucyBpbiB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzLiAgVGhpcyBpcyB0aGUgZGVmYXVsdAotYmVoYXZpb3VyLiAgVGhlIEBzYW1wey5kcmVjdHZlfSBzZWN0aW9ucyBhcmUgY3JlYXRlZCBieSBAc2FtcHtkbGxleHBvcnR9Ci1hdHRyaWJ1dGVzIGluIHRoZSBzb3VyY2UgY29kZS4KLQotQGl0ZW0gLS1leGNsdWRlLXN5bWJvbHMgQHZhcntsaXN0fQotRG8gbm90IGV4cG9ydCB0aGUgc3ltYm9scyBpbiBAdmFye2xpc3R9LiAgVGhpcyBpcyBhIGxpc3Qgb2Ygc3ltYm9sIG5hbWVzCi1zZXBhcmF0ZWQgYnkgY29tbWEgb3IgY29sb24gY2hhcmFjdGVycy4gIFRoZSBzeW1ib2wgbmFtZXMgc2hvdWxkIG5vdAotY29udGFpbiBhIGxlYWRpbmcgdW5kZXJzY29yZS4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4KLUBjb2Rley0tZXhwb3J0LWFsbC1zeW1ib2xzfSBpcyB1c2VkLgotCi1AaXRlbSAtLW5vLWRlZmF1bHQtZXhjbHVkZXMKLVdoZW4gQGNvZGV7LS1leHBvcnQtYWxsLXN5bWJvbHN9IGlzIHVzZWQsIGl0IHdpbGwgYnkgZGVmYXVsdCBhdm9pZAotZXhwb3J0aW5nIGNlcnRhaW4gc3BlY2lhbCBzeW1ib2xzLiAgVGhlIGN1cnJlbnQgbGlzdCBvZiBzeW1ib2xzIHRvIGF2b2lkCi1leHBvcnRpbmcgaXMgQHNhbXB7RGxsTWFpbkBAMTJ9LCBAc2FtcHtEbGxFbnRyeVBvaW50QEAwfSwKLUBzYW1we2ltcHVyZV9wdHJ9LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rley0tbm8tZGVmYXVsdC1leGNsdWRlc30gb3B0aW9uCi10byBnbyBhaGVhZCBhbmQgZXhwb3J0IHRoZXNlIHNwZWNpYWwgc3ltYm9scy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsCi13aGVuIEBjb2Rley0tZXhwb3J0LWFsbC1zeW1ib2xzfSBpcyB1c2VkLgotCi1AaXRlbSAtUyBAdmFye3BhdGh9Ci1AaXRlbXggLS1hcyBAdmFye3BhdGh9Ci1TcGVjaWZpZXMgdGhlIHBhdGgsIGluY2x1ZGluZyB0aGUgZmlsZW5hbWUsIG9mIHRoZSBhc3NlbWJsZXIgdG8gYmUgdXNlZAotdG8gY3JlYXRlIHRoZSBleHBvcnRzIGZpbGUuCi0KLUBpdGVtIC1mIEB2YXJ7c3dpdGNoZXN9Ci1AaXRlbXggLS1hcy1mbGFncyBAdmFye3N3aXRjaGVzfQotU3BlY2lmaWVzIGFueSBzcGVjaWZpYyBjb21tYW5kIGxpbmUgc3dpdGNoZXMgdG8gYmUgcGFzc2VkIHRvIHRoZQotYXNzZW1ibGVyIHdoZW4gYnVpbGRpbmcgdGhlIGV4cG9ydHMgZmlsZS4gIFRoaXMgb3B0aW9uIHdpbGwgd29yayBldmVuIGlmCi10aGUgQHNhbXB7LVN9IG9wdGlvbiBpcyBub3QgdXNlZC4gIFRoaXMgb3B0aW9uIG9ubHkgdGFrZXMgb25lIGFyZ3VtZW50LAotYW5kIGlmIGl0IG9jY3VycyBtb3JlIHRoYW4gb25jZSBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGVuIGxhdGVyCi1vY2N1cnJlbmNlcyB3aWxsIG92ZXJyaWRlIGVhcmxpZXIgb2NjdXJyZW5jZXMuICBTbyBpZiBpdCBpcyBuZWNlc3NhcnkgdG8KLXBhc3MgbXVsdGlwbGUgc3dpdGNoZXMgdG8gdGhlIGFzc2VtYmxlciB0aGV5IHNob3VsZCBiZSBlbmNsb3NlZCBpbgotZG91YmxlIHF1b3Rlcy4KLQotQGl0ZW0gLUQgQHZhcntuYW1lfQotQGl0ZW14IC0tZGxsLW5hbWUgQHZhcntuYW1lfQotU3BlY2lmaWVzIHRoZSBuYW1lIHRvIGJlIHN0b3JlZCBpbiB0aGUgLmRlZiBmaWxlIGFzIHRoZSBuYW1lIG9mIHRoZSBETEwKLXdoZW4gdGhlIEBzYW1wey1lfSBvcHRpb24gaXMgdXNlZC4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCBwcmVzZW50LCB0aGVuCi10aGUgZmlsZW5hbWUgZ2l2ZW4gdG8gdGhlIEBzYW1wey1lfSBvcHRpb24gd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mCi10aGUgRExMLgotCi1AaXRlbSAtbSBAdmFye21hY2hpbmV9Ci1AaXRlbXggLW1hY2hpbmUgQHZhcnttYWNoaW5lfQotU3BlY2lmaWVzIHRoZSB0eXBlIG9mIG1hY2hpbmUgZm9yIHdoaWNoIHRoZSBsaWJyYXJ5IGZpbGUgc2hvdWxkIGJlCi1idWlsdC4gIEBjb2Rle2RsbHRvb2x9IGhhcyBhIGJ1aWx0IGluIGRlZmF1bHQgdHlwZSwgZGVwZW5kaW5nIHVwb24gaG93Ci1pdCB3YXMgY3JlYXRlZCwgYnV0IHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoYXQuICBUaGlzIGlzCi1ub3JtYWxseSBvbmx5IHVzZWZ1bCB3aGVuIGNyZWF0aW5nIERMTHMgZm9yIGFuIEFSTSBwcm9jZXNzb3IsIHdoZW4gdGhlCi1jb250ZW50cyBvZiB0aGUgRExMIGFyZSBhY3R1YWxseSBlbmNvZGUgdXNpbmcgVEhVTUIgaW5zdHJ1Y3Rpb25zLgotCi1AaXRlbSAtYQotQGl0ZW14IC0tYWRkLWluZGlyZWN0Ci1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGZpbGUgaXQKLXNob3VsZCBhZGQgYSBzZWN0aW9uIHdoaWNoIGFsbG93cyB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIHRvIGJlCi1yZWZlcmVuY2VkIHdpdGhvdXQgdXNpbmcgdGhlIGltcG9ydCBsaWJyYXJ5LiAgV2hhdGV2ZXIgdGhlIGhlbGwgdGhhdAotbWVhbnMhIAotCi1AaXRlbSAtVQotQGl0ZW14IC0tYWRkLXVuZGVyc2NvcmUKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAotc2hvdWxkIHByZXBlbmQgYW4gdW5kZXJzY29yZSB0byB0aGUgbmFtZXMgb2YgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucy4gCi0KLUBpdGVtIC1rCi1AaXRlbXggLS1raWxsLWF0Ci1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGZpbGUgaXQKLXNob3VsZCBub3QgYXBwZW5kIHRoZSBzdHJpbmcgQHNhbXB7QEAgPG51bWJlcj59LiAgVGhlc2UgbnVtYmVycyBhcmUKLWNhbGxlZCBvcmRpbmFsIG51bWJlcnMgYW5kIHRoZXkgcmVwcmVzZW50IGFub3RoZXIgd2F5IG9mIGFjY2Vzc2luZyB0aGUKLWZ1bmN0aW9uIGluIGEgRExMLCBvdGhlciB0aGFuIGJ5IG5hbWUuCi0KLUBpdGVtIC1BCi1AaXRlbXggLS1hZGQtc3RkY2FsbC1hbGlhcwotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBmaWxlIGl0Ci1zaG91bGQgYWRkIGFsaWFzZXMgZm9yIHN0ZGNhbGwgc3ltYm9scyB3aXRob3V0IEBzYW1we0BAIDxudW1iZXI+fQotaW4gYWRkaXRpb24gdG8gdGhlIHN5bWJvbHMgd2l0aCBAc2FtcHtAQCA8bnVtYmVyPn0uCi0KLUBpdGVtIC14Ci1AaXRlbXggLS1uby1pZGF0YTQKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgYW5kIGxpYnJhcnkKLWZpbGVzIGl0IHNob3VsZCBvbWl0IHRoZSAuaWRhdGE0IHNlY3Rpb24uICBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLUBpdGVtIC1jCi1AaXRlbXggLS1uby1pZGF0YTUKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgYW5kIGxpYnJhcnkKLWZpbGVzIGl0IHNob3VsZCBvbWl0IHRoZSAuaWRhdGE1IHNlY3Rpb24uICBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLUBpdGVtIC1pCi1AaXRlbXggLS1pbnRlcndvcmsKLVNwZWNpZmllcyB0aGF0IEBjb2Rle2RsbHRvb2x9IHNob3VsZCBtYXJrIHRoZSBvYmplY3RzIGluIHRoZSBsaWJyYXJ5Ci1maWxlIGFuZCBleHBvcnRzIGZpbGUgdGhhdCBpdCBwcm9kdWNlcyBhcyBzdXBwb3J0aW5nIGludGVyd29ya2luZwotYmV0d2VlbiBBUk0gYW5kIFRIVU1CIGNvZGUuCi0KLUBpdGVtIC1uCi1AaXRlbXggLS1ub2RlbGV0ZQotTWFrZXMgQGNvZGV7ZGxsdG9vbH0gcHJlc2VydmUgdGhlIHRlbXBvcmFyeSBhc3NlbWJsZXIgZmlsZXMgaXQgdXNlZCB0bwotY3JlYXRlIHRoZSBleHBvcnRzIGZpbGUuICBJZiB0aGlzIG9wdGlvbiBpcyByZXBlYXRlZCB0aGVuIGRsbHRvb2wgd2lsbAotYWxzbyBwcmVzZXJ2ZSB0aGUgdGVtcG9yYXJ5IG9iamVjdCBmaWxlcyBpdCB1c2VzIHRvIGNyZWF0ZSB0aGUgbGlicmFyeQotZmlsZS4gCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJib3NlCi1NYWtlIGRsbHRvb2wgZGVzY3JpYmUgd2hhdCBpdCBpcyBkb2luZy4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLWhlbHAKLURpc3BsYXlzIGEgbGlzdCBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgdGhlbiBleGl0cy4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLURpc3BsYXlzIGRsbHRvb2wncyB2ZXJzaW9uIG51bWJlciBhbmQgdGhlbiBleGl0cy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSByZWFkZWxmCi1AY2hhcHRlciByZWFkZWxmCi0KLUBjaW5kZXggRUxGIGZpbGUgaW5mb3JtYXRpb24KLUBraW5kZXggcmVhZGVsZgotCi1Ac21hbGxleGFtcGxlCi1yZWFkZWxmIFsgLWEgfCAtLWFsbCBdIAotICAgICAgICBbIC1oIHwgLS1maWxlLWhlYWRlcl0KLSAgICAgICAgWyAtbCB8IC0tcHJvZ3JhbS1oZWFkZXJzIHwgLS1zZWdtZW50c10KLSAgICAgICAgWyAtUyB8IC0tc2VjdGlvbi1oZWFkZXJzIHwgLS1zZWN0aW9uc10KLSAgICAgICAgWyAtZSB8IC0taGVhZGVyc10KLSAgICAgICAgWyAtcyB8IC0tc3ltcyB8IC0tc3ltYm9sc10KLSAgICAgICAgWyAtbiB8IC0tbm90ZXNdCi0gICAgICAgIFsgLXIgfCAtLXJlbG9jc10KLSAgICAgICAgWyAtZCB8IC0tZHluYW1pY10KLSAgICAgICAgWyAtViB8IC0tdmVyc2lvbi1pbmZvXQotICAgICAgICBbIC1EIHwgLS11c2UtZHluYW1pY10KLSAgICAgICAgWyAteCA8bnVtYmVyPiB8IC0taGV4LWR1bXA9PG51bWJlcj5dCi0gICAgICAgIFsgLXdbbGlhcHJdIHwgLS1kZWJ1Zy1kdW1wWz1pbmZvLD1saW5lLD1hYmJyZXYsPXB1Ym5hbWVzLD1yYW5nZXNdXQotICAgICAgICBbICAgICAgLS1oaXN0b2dyYW1dCi0gICAgICAgIFsgLXYgfCAtLXZlcnNpb25dCi0gICAgICAgIFsgLUggfCAtLWhlbHBdCi0gICAgICAgIEB2YXJ7ZWxmZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtyZWFkZWxmfSBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBFTEYgZm9ybWF0IG9iamVjdAotZmlsZXMuICBUaGUgb3B0aW9ucyBjb250cm9sIHdoYXQgcGFydGljdWxhciBpbmZvcm1hdGlvbiB0byBkaXNwbGF5LgotCi1AdmFye2VsZmZpbGV9QGRvdHN7fSBhcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4gIEF0IHRoZQotbW9tZW50LCBAY29kZXtyZWFkZWxmfSBkb2VzIG5vdCBzdXBwb3J0IGV4YW1pbmluZyBhcmNoaXZlcywgbm9yIGRvZXMgaXQKLXN1cHBvcnQgZXhhbWluZyA2NCBiaXQgRUxGIGZpbGVzLgotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4gIEF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyBAc2FtcHstdn0gb3IgQHNhbXB7LUh9IG11c3QgYmUKLWdpdmVuLiAKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYQotQGl0ZW14IC0tYWxsCi1FcXVpdmFsZW50IHRvIHNwZWNpZml5aW5nIEBzYW1wey0tZmlsZS1oZWFkZXJ9LAotQHNhbXB7LS1wcm9ncmFtLWhlYWRlcnN9LCBAc2FtcHstLXNlY3Rpb25zfSwgQHNhbXB7LS1zeW1ib2xzfSwKLUBzYW1wey0tcmVsb2NzfSwgQHNhbXB7LS1keW5hbWljfSwgQHNhbXB7LS1ub3Rlc30gYW5kCi1Ac2FtcHstLXZlcnNpb24taW5mb30uIAotCi1AaXRlbSAtaAotQGl0ZW14IC0tZmlsZS1oZWFkZXIKLUBjaW5kZXggRUxGIGZpbGUgaGVhZGVyIGluZm9ybWF0aW9uCi1EaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBFTEYgaGVhZGVyIGF0IHRoZSBzdGFydCBvZiB0aGUKLWZpbGUuCi0KLUBpdGVtIC1sCi1AaXRlbXggLS1wcm9ncmFtLWhlYWRlcnMKLUBpdGVteCAtLXNlZ21lbnRzCi1AY2luZGV4IEVMRiBwcm9ncmFtIGhlYWRlciBpbmZvcm1hdGlvbgotQGNpbmRleCBFTEYgc2VnbWVudCBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSdzIHNlZ21lbnQgaGVhZGVycywgaWYgaXQKLWhhcyBhbnkuCi0KLUBpdGVtIC1TCi1AaXRlbXggLS1zZWN0aW9ucwotQGl0ZW14IC0tc2VjdGlvbi1oZWFkZXJzCi1AY2luZGV4IEVMRiBzZWN0aW9uIGluZm9ybWF0aW9uCi1EaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBmaWxlJ3Mgc2VjdGlvbiBoZWFkZXJzLCBpZiBpdAotaGFzIGFueS4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLXN5bWJvbHMKLUBpdGVteCAtLXN5bXMKLUBjaW5kZXggRUxGIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGVudHJpZXMgaW4gc3ltYm9sIHRhYmxlIHNlY3Rpb24gb2YgdGhlIGZpbGUsIGlmIGl0IGhhcyBvbmUuCi0KLUBpdGVtIC1lCi1AaXRlbXggLS1oZWFkZXJzCi1EaXNwbGF5IGFsbCB0aGUgaGVhZGVycyBpbiB0aGUgZmlsZS4gIEVxdWl2YWxlbnQgdG8gQHNhbXB7LWggLWwgLVN9LgotCi1AaXRlbSAtbgotQGl0ZW14IC0tbm90ZXMKLUBjaW5kZXggRUxGIGNvcmUgbm90ZXMKLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgTk9URSBzZWdtZW50LCBpZiBpdCBleGlzdHMuCi0KLUBpdGVtIC1yCi1AaXRlbXggLS1yZWxvY3MKLUBjaW5kZXggRUxGIHJlbG9jIGluZm9ybWF0aW9uCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUncyByZWxvY2F0aW9uIHNlY3Rpb24sIGlmIGl0IGhhIG9uZS4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWR5bmFtaWMKLUBjaW5kZXggRUxGIGR5bmFtaWMgc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlJ3MgZHluYW1pYyBzZWN0aW9uLCBpZiBpdCBoYXMgb25lLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbi1pbmZvCi1AY2luZGV4IEVMRiB2ZXJzaW9uIHNlY3Rpb25zIGluZm9ybWF0aW9ucwotRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZXJzaW9uIHNlY3Rpb25zIGluIHRoZSBmaWxlLCBpdCB0aGV5Ci1leGlzdC4KLQotQGl0ZW0gLUQKLUBpdGVteCAtLXVzZS1keW5hbWljCi1XaGVuIGRpc3BsYXlpbmcgc3ltYm9scywgdGhpcyBvcHRpb24gbWFrZXMgQGNvZGV7cmVhZGVsZn0gdXNlIHRoZQotc3ltYmxvbCB0YWJsZSBpbiB0aGUgZmlsZSdzIGR5bmFtaWMgc2VjdGlvbiwgcmF0aGVyIHRoYW4gdGhlIG9uZSBpbiB0aGUKLXN5bWJvbHMgc2VjdGlvbi4KLQotQGl0ZW0gLXggPG51bWJlcj4KLUBpdGVteCAtLWhleC1kdW1wPTxudW1iZXI+Ci1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGluZGljYXRlZCBzZWN0aW9uIGFzIGEgaGV4YWRlY2ltYWwgZHVtcC4KLQotQGl0ZW0gLXdbbGlhcHJdCi1AaXRlbXggLS1kZWJ1Zy1kdW1wWz1saW5lLD1pbmZvLD1hYmJyZXYsPXB1Ym5hbWVzLD1yYW5nZXNdCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGRlYnVnIHNlY3Rpb25zIGluIHRoZSBmaWxlLCBpZiBhbnkgYXJlCi1wcmVzZW50LiAgSWYgb25lIG9mIHRoZSBvcHRpb25hbCBsZXR0ZXJzIG9yIHdvcmRzIGZvbGxvd3MgdGhlIHN3aXRjaAotdGhlbiBvbmx5IGRhdGEgZm91bmQgaW4gdGhvc2Ugc3BlY2lmaWMgc2VjdGlvbnMgd2lsbCBiZSBkdW1wZWQuCi0KLUBpdGVtIC0taGlzdG9ncmFtCi1EaXNwbGF5IGEgaGlzdG9ncmFtIG9mIGJ1Y2tldCBsaXN0IGxlbmd0aHMgd2hlbiBkaXNwbGF5aW5nIHRoZSBjb250ZW50cwotb2YgdGhlIHN5bWJvbCB0YWJsZXMuCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiByZWFkZWxmLgotCi1AaXRlbSAtSAotQGl0ZW14IC0taGVscAotRGlzcGxheSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgdW5kZXJzdG9vZCBieSBAY29kZXtyZWFkZWxmfS4KLQotQGVuZCB0YWJsZQotCi0KLUBub2RlIFNlbGVjdGluZyBUaGUgVGFyZ2V0IFN5c3RlbQotQGNoYXB0ZXIgU2VsZWN0aW5nIHRoZSB0YXJnZXQgc3lzdGVtCi0KLVlvdSBjYW4gc3BlY2lmeSB0aHJlZSBhc3BlY3RzIG9mIHRoZSB0YXJnZXQgc3lzdGVtIHRvIHRoZSBAc2N7Z251fQotYmluYXJ5IGZpbGUgdXRpbGl0aWVzLCBlYWNoIGluIHNldmVyYWwgd2F5czoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLXRoZSB0YXJnZXQKLQotQGl0ZW0KLXRoZSBhcmNoaXRlY3R1cmUKLQotQGl0ZW0KLXRoZSBsaW5rZXIgZW11bGF0aW9uICh3aGljaCBhcHBsaWVzIHRvIHRoZSBsaW5rZXIgb25seSkKLUBlbmQgaXRlbWl6ZQotCi1JbiB0aGUgZm9sbG93aW5nIHN1bW1hcmllcywgdGhlIGxpc3RzIG9mIHdheXMgdG8gc3BlY2lmeSB2YWx1ZXMgYXJlIGluCi1vcmRlciBvZiBkZWNyZWFzaW5nIHByZWNlZGVuY2UuICBUaGUgd2F5cyBsaXN0ZWQgZmlyc3Qgb3ZlcnJpZGUgdGhvc2UKLWxpc3RlZCBsYXRlci4KLQotVGhlIGNvbW1hbmRzIHRvIGxpc3QgdmFsaWQgdmFsdWVzIG9ubHkgbGlzdCB0aGUgdmFsdWVzIGZvciB3aGljaCB0aGUKLXByb2dyYW1zIHlvdSBhcmUgcnVubmluZyB3ZXJlIGNvbmZpZ3VyZWQuICBJZiB0aGV5IHdlcmUgY29uZmlndXJlZCB3aXRoCi1Ac2FtcHstLWVuYWJsZS10YXJnZXRzPWFsbH0sIHRoZSBjb21tYW5kcyBsaXN0IG1vc3Qgb2YgdGhlIGF2YWlsYWJsZQotdmFsdWVzLCBidXQgYSBmZXcgYXJlIGxlZnQgb3V0OyBub3QgYWxsIHRhcmdldHMgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gYXQKLW9uY2UgYmVjYXVzZSBzb21lIG9mIHRoZW0gY2FuIG9ubHkgYmUgY29uZmlndXJlZCBAZGZue25hdGl2ZX0gKG9uIGhvc3RzCi13aXRoIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHRhcmdldCBzeXN0ZW0pLgotCi1AbWVudQotKiBUYXJnZXQgU2VsZWN0aW9uOjogICAgICAgICAgICAKLSogQXJjaGl0ZWN0dXJlIFNlbGVjdGlvbjo6ICAgICAgCi0qIExpbmtlciBFbXVsYXRpb24gU2VsZWN0aW9uOjogIAotQGVuZCBtZW51Ci0KLUBub2RlIFRhcmdldCBTZWxlY3Rpb24KLUBzZWN0aW9uIFRhcmdldCBTZWxlY3Rpb24KLQotQSBAZGZue3RhcmdldH0gaXMgYW4gb2JqZWN0IGZpbGUgZm9ybWF0LiAgQSBnaXZlbiB0YXJnZXQgbWF5IGJlCi1zdXBwb3J0ZWQgZm9yIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMgKEBweHJlZntBcmNoaXRlY3R1cmUgU2VsZWN0aW9ufSkuCi1BIHRhcmdldCBzZWxlY3Rpb24gbWF5IGFsc28gaGF2ZSB2YXJpYXRpb25zIGZvciBkaWZmZXJlbnQgb3BlcmF0aW5nCi1zeXN0ZW1zIG9yIGFyY2hpdGVjdHVyZXMuCi0KLVRoZSBjb21tYW5kIHRvIGxpc3QgdmFsaWQgdGFyZ2V0IHZhbHVlcyBpcyBAc2FtcHtvYmpkdW1wIC1pfQotKHRoZSBmaXJzdCBjb2x1bW4gb2Ygb3V0cHV0IGNvbnRhaW5zIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbikuCi0KLVNvbWUgc2FtcGxlIHZhbHVlcyBhcmU6IEBzYW1we2Eub3V0LWhwMzAwYnNkfSwgQHNhbXB7ZWNvZmYtbGl0dGxlbWlwc30sCi1Ac2FtcHthLm91dC1zdW5vcy1iaWd9LgotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSBhIHRhcmdldCB1c2luZyBhIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gIFRoaXMgaXMKLXRoZSBzYW1lIHNvcnQgb2YgbmFtZSB0aGF0IGlzIHBhc3NlZCB0byBAZmlsZXtjb25maWd1cmV9IHRvIHNwZWNpZnkgYQotdGFyZ2V0LiAgV2hlbiB5b3UgdXNlIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0IGFzIGFuIGFyZ3VtZW50LCBpdCBtdXN0IGJlCi1mdWxseSBjYW5vbmljYWxpemVkLiAgWW91IGNhbiBzZWUgdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgdHJpcGxldCBieQotcnVubmluZyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2NvbmZpZy5zdWJ9IHdoaWNoIGlzIGluY2x1ZGVkIHdpdGggdGhlCi1zb3VyY2VzLgotCi1Tb21lIHNhbXBsZSBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFyZTogQHNhbXB7bTY4ay1ocC1ic2R9LAotQHNhbXB7bWlwcy1kZWMtdWx0cml4fSwgQHNhbXB7c3BhcmMtc3VuLXN1bm9zfS4KLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqZHVtcH0gVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey1ifSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbnM6IEBzYW1wey1JfSBvciBAc2FtcHstLWlucHV0LXRhcmdldH0sIG9yIEBzYW1wey1GfSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBPdXRwdXQgVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb25zOiBAc2FtcHstT30gb3IgQHNhbXB7LS1vdXRwdXQtdGFyZ2V0fSwgb3IgQHNhbXB7LUZ9IG9yIEBzYW1wey0tdGFyZ2V0fQotCi1AaXRlbQotdGhlIGlucHV0IHRhcmdldCAoc2VlIGBgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQnJyBhYm92ZSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7bm19LCBAY29kZXtzaXplfSwgYW5kIEBjb2Rle3N0cmluZ3N9IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIElucHV0IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstYn0gb3IgQHNhbXB7LS1mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtUQVJHRVR9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7R05VVEFSR0VUfQotKEBweHJlZntFbnZpcm9ubWVudCwsRW52aXJvbm1lbnQsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi10aGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIHNlbGVjdGVkIGxpbmtlciBlbXVsYXRpb24KLShAcHhyZWZ7TGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LW9mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtPVVRQVVRfRk9STUFUfQotKEBweHJlZntPcHRpb24gQ29tbWFuZHMsLE9wdGlvbiBDb21tYW5kcyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLXRoZSBsaW5rZXIgaW5wdXQgdGFyZ2V0IChzZWUgYGBMaW5rZXIgSW5wdXQgVGFyZ2V0JycgYWJvdmUpCi1AZW5kIGVudW1lcmF0ZQotCi1Abm9kZSBBcmNoaXRlY3R1cmUgU2VsZWN0aW9uCi1Ac2VjdGlvbiBBcmNoaXRlY3R1cmUgc2VsZWN0aW9uCi0KLUFuIEBkZm57YXJjaGl0ZWN0dXJlfSBpcyBhIHR5cGUgb2YgQHNje2NwdX0gb24gd2hpY2ggYW4gb2JqZWN0IGZpbGUgaXMKLXRvIHJ1bi4gIEl0cyBuYW1lIG1heSBjb250YWluIGEgY29sb24sIHNlcGFyYXRpbmcgdGhlIG5hbWUgb2YgdGhlCi1wcm9jZXNzb3IgZmFtaWx5IGZyb20gdGhlIG5hbWUgb2YgdGhlIHBhcnRpY3VsYXIgQHNje2NwdX0uCi0KLVRoZSBjb21tYW5kIHRvIGxpc3QgdmFsaWQgYXJjaGl0ZWN0dXJlIHZhbHVlcyBpcyBAc2FtcHtvYmpkdW1wIC1pfSAodGhlCi1zZWNvbmQgY29sdW1uIGNvbnRhaW5zIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbikuCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we202OGs6NjgwMjB9LCBAc2FtcHttaXBzOjMwMDB9LCBAc2FtcHtzcGFyY30uCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamR1bXB9IEFyY2hpdGVjdHVyZQotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0gb3IgQHNhbXB7LS1hcmNoaXRlY3R1cmV9Ci0KLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamNvcHl9LCBAY29kZXtubX0sIEBjb2Rle3NpemV9LCBAY29kZXtzdHJpbmdzfSBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCi1AZW5kIGVudW1lcmF0ZQotCi1Ac3ViaGVhZGluZyBMaW5rZXIgSW5wdXQgQXJjaGl0ZWN0dXJlCi0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7T1VUUFVUX0FSQ0h9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGZyb20gdGhlIGxpbmtlciBvdXRwdXQgdGFyZ2V0Ci0oQHB4cmVme1RhcmdldCBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgTGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb24KLUBzZWN0aW9uIExpbmtlciBlbXVsYXRpb24gc2VsZWN0aW9uCi0KLUEgbGlua2VyIEBkZm57ZW11bGF0aW9ufSBpcyBhIGBgcGVyc29uYWxpdHknJyBvZiB0aGUgbGlua2VyLCB3aGljaCBnaXZlcwotdGhlIGxpbmtlciBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG90aGVyIGFzcGVjdHMgb2YgdGhlIHRhcmdldCBzeXN0ZW0uCi1JbiBwYXJ0aWN1bGFyLCBpdCBjb25zaXN0cyBvZgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIGxpbmtlciBzY3JpcHQKLQotQGl0ZW0KLXRoZSB0YXJnZXQKLQotQGl0ZW0KLXNldmVyYWwgYGBob29rJycgZnVuY3Rpb25zIHRoYXQgYXJlIHJ1biBhdCBjZXJ0YWluIHN0YWdlcyBvZiB0aGUgbGlua2luZwotcHJvY2VzcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB0aGF0IHNvbWUgdGFyZ2V0cyByZXF1aXJlCi1AZW5kIGl0ZW1pemUKLQotVGhlIGNvbW1hbmQgdG8gbGlzdCB2YWxpZCBsaW5rZXIgZW11bGF0aW9uIHZhbHVlcyBpcyBAc2FtcHtsZCAtVn0uCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we2hwMzAwYnNkfSwgQHNhbXB7bWlwc2xpdH0sIEBzYW1we3N1bjR9LgotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0KLShAcHhyZWZ7T3B0aW9ucywsT3B0aW9ucyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0xERU1VTEFUSU9OfQotCi1AaXRlbQotY29tcGlsZWQtaW4gQGNvZGV7REVGQVVMVF9FTVVMQVRJT059IGZyb20gQGZpbGV7TWFrZWZpbGV9LAotd2hpY2ggY29tZXMgZnJvbSBAY29kZXtFTVVMfSBpbiBAZmlsZXtjb25maWcvQHZhcnt0YXJnZXR9Lm10fQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgUmVwb3J0aW5nIEJ1Z3MKLUBjaGFwdGVyIFJlcG9ydGluZyBCdWdzCi1AY2luZGV4IGJ1Z3MKLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MKLQotWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyB0aGUgYmluYXJ5IHV0aWxpdGllcwotcmVsaWFibGUuCi0KLVJlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yCi1pdCBtYXkgbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzCi10byBoZWxwIHRoZSBlbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcyB3b3JrIGJldHRlci4gIEJ1ZyByZXBvcnRzIGFyZSB5b3VyIGNvbnRyaWJ1dGlvbiB0byB0aGVpcgotbWFpbnRlbmFuY2UuCi0KLUluIG9yZGVyIGZvciBhIGJ1ZyByZXBvcnQgdG8gc2VydmUgaXRzIHB1cnBvc2UsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1pbmZvcm1hdGlvbiB0aGF0IGVuYWJsZXMgdXMgdG8gZml4IHRoZSBidWcuCi0KLUBtZW51Ci0qIEJ1ZyBDcml0ZXJpYTo6ICAgICAgICAgICAgICAgIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotKiBCdWcgUmVwb3J0aW5nOjogICAgICAgICAgICAgICBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBlbmQgbWVudQotCi1Abm9kZSBCdWcgQ3JpdGVyaWEKLUBzZWN0aW9uIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotQGNpbmRleCBidWcgY3JpdGVyaWEKLQotSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdSBoYXZlIGZvdW5kIGEgYnVnLCBoZXJlIGFyZSBzb21lIGd1aWRlbGluZXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBjaW5kZXggZmF0YWwgc2lnbmFsCi1AY2luZGV4IGNyYXNoCi1AaXRlbQotSWYgYSBiaW5hcnkgdXRpbGl0eSBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzCi1hIGJ1Zy4gIFJlbGlhYmxlIHV0aWxpdGllcyBuZXZlciBjcmFzaC4KLQotQGNpbmRleCBlcnJvciBvbiB2YWxpZCBpbnB1dAotQGl0ZW0KLUlmIGEgYmluYXJ5IHV0aWxpdHkgcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYQotYnVnLgotCi1AaXRlbQotSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGJpbmFyeSB1dGlsaXRpZXMsIHlvdXIgc3VnZ2VzdGlvbnMgZm9yCi1pbXByb3ZlbWVudCBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCdWcgUmVwb3J0aW5nCi1Ac2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBjaW5kZXggYnVnIHJlcG9ydHMKLUBjaW5kZXggYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KLXByb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIHRoZSBiaW5hcnkgdXRpbGl0aWVzIGZyb20gYSBzdXBwb3J0Ci1vcmdhbml6YXRpb24sIHdlIHJlY29tbWVuZCB5b3UgY29udGFjdCB0aGF0IG9yZ2FuaXphdGlvbiBmaXJzdC4KLQotWW91IGNhbiBmaW5kIGNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3VwcG9ydCBjb21wYW5pZXMgYW5kCi1pbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBAZmlsZXtldGMvU0VSVklDRX0gaW4gdGhlIEBzY3tnbnV9IEVtYWNzCi1kaXN0cmlidXRpb24uCi0KLUluIGFueSBldmVudCwgd2UgYWxzbyByZWNvbW1lbmQgdGhhdCB5b3Ugc2VuZCBidWcgcmVwb3J0cyBmb3IgdGhlIGJpbmFyeQotdXRpbGl0aWVzIHRvIEBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9LgotCi1UaGUgZnVuZGFtZW50YWwgcHJpbmNpcGxlIG9mIHJlcG9ydGluZyBidWdzIHVzZWZ1bGx5IGlzIHRoaXM6Ci1Ac3Ryb25ne3JlcG9ydCBhbGwgdGhlIGZhY3RzfS4gIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhCi1mYWN0IG9yIGxlYXZlIGl0IG91dCwgc3RhdGUgaXQhCi0KLU9mdGVuIHBlb3BsZSBvbWl0IGZhY3RzIGJlY2F1c2UgdGhleSB0aGluayB0aGV5IGtub3cgd2hhdCBjYXVzZXMgdGhlCi1wcm9ibGVtIGFuZCBhc3N1bWUgdGhhdCBzb21lIGRldGFpbHMgZG8gbm90IG1hdHRlci4gIFRodXMsIHlvdSBtaWdodAotYXNzdW1lIHRoYXQgdGhlIG5hbWUgb2YgYSBmaWxlIHlvdSB1c2UgaW4gYW4gZXhhbXBsZSBkb2VzIG5vdCBtYXR0ZXIuCi1XZWxsLCBwcm9iYWJseSBpdCBkb2VzIG5vdCwgYnV0IG9uZSBjYW5ub3QgYmUgc3VyZS4gIFBlcmhhcHMgdGhlIGJ1ZyBpcwotYSBzdHJheSBtZW1vcnkgcmVmZXJlbmNlIHdoaWNoIGhhcHBlbnMgdG8gZmV0Y2ggZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUKLXRoYXQgcGF0aG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIHBhdGhuYW1lIHdlcmUKLWRpZmZlcmVudCwgdGhlIGNvbnRlbnRzIG9mIHRoYXQgbG9jYXRpb24gd291bGQgZm9vbCB0aGUgdXRpbGl0eSBpbnRvCi1kb2luZyB0aGUgcmlnaHQgdGhpbmcgZGVzcGl0ZSB0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZCBnaXZlIGEKLXNwZWNpZmljLCBjb21wbGV0ZSBleGFtcGxlLiAgVGhhdCBpcyB0aGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLAotYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIHRoZSB1dGlsaXR5LiAgRWFjaCB1dGlsaXR5IGFubm91bmNlcyBpdCBpZiB5b3Ugc3RhcnQgaXQKLXdpdGggdGhlIEBzYW1wey0tdmVyc2lvbn0gYXJndW1lbnQuCi0KLVdpdGhvdXQgdGhpcywgd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHRoZXJlIGlzIGFueSBwb2ludCBpbiBsb29raW5nIGZvcgotdGhlIGJ1ZyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkgdXRpbGl0aWVzLgotCi1AaXRlbQotQW55IHBhdGNoZXMgeW91IG1heSBoYXZlIGFwcGxpZWQgdG8gdGhlIHNvdXJjZSwgaW5jbHVkaW5nIGFueSBwYXRjaGVzCi1tYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHV0aWxpdGllcy0tLWUuZy4KLWBgQGNvZGV7Z2NjLTIuN30nJy4KLQotQGl0ZW0KLVRoZSBjb21tYW5kIGFyZ3VtZW50cyB5b3UgZ2F2ZSB0aGUgdXRpbGl0eSB0byBvYnNlcnZlIHRoZSBidWcuICBUbwotZ3VhcmFudGVlIHlvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsIGxpc3QgdGhlbSBhbGwuICBBIGNvcHkKLW9mIHRoZSBNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzIHN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKLWJ1Zy4gIElmIHRoZSB1dGlsaXR5IGlzIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUgb3IgZmlsZXMsIHRoZW4gaXQgaXMKLWdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywgdXVlbmNvZGVkIGlmCi1uZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBOb3RlIHRoYXQKLUBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9IGlzIGEgbWFpbGluZyBsaXN0LCBzbyB5b3Ugc2hvdWxkIGF2b2lkCi1zZW5kaW5nIHZlcnkgbGFyZ2UgZmlsZXMgdG8gaXQuICBNYWtpbmcgdGhlIGZpbGVzIGF2YWlsYWJsZSBmb3IKLWFub255bW91cyBGVFAgaXMgT0suCi0KLUlmIHRoZSBzb3VyY2UgZmlsZXMgd2VyZSBwcm9kdWNlZCBleGNsdXNpdmVseSB1c2luZyBAc2N7Z251fSBwcm9ncmFtcwotKGUuZy4sIEBjb2Rle2djY30sIEBjb2Rle2dhc30sIGFuZC9vciB0aGUgQHNje2dudX0gQGNvZGV7bGR9KSwgdGhlbiBpdAotbWF5IGJlIE9LIHRvIHNlbmQgdGhlIHNvdXJjZSBmaWxlcyByYXRoZXIgdGhhbiB0aGUgb2JqZWN0IGZpbGVzLiAgSW4KLXRoaXMgY2FzZSwgYmUgc3VyZSB0byBzYXkgZXhhY3RseSB3aGF0IHZlcnNpb24gb2YgQGNvZGV7Z2NjfSwgb3IKLXdoYXRldmVyLCB3YXMgdXNlZCB0byBwcm9kdWNlIHRoZSBvYmplY3QgZmlsZXMuICBBbHNvIHNheSBob3cKLUBjb2Rle2djY30sIG9yIHdoYXRldmVyLCB3YXMgY29uZmlndXJlZC4KLQotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2Ygd2hhdCBiZWhhdmlvciB5b3Ugb2JzZXJ2ZSB0aGF0IHlvdSBiZWxpZXZlIGlzCi1pbmNvcnJlY3QuICBGb3IgZXhhbXBsZSwgYGBJdCBnZXRzIGEgZmF0YWwgc2lnbmFsLicnCi0KLU9mIGNvdXJzZSwgaWYgdGhlIGJ1ZyBpcyB0aGF0IHRoZSB1dGlsaXR5IGdldHMgYSBmYXRhbCBzaWduYWwsIHRoZW4gd2UKLXdpbGwgY2VydGFpbmx5IG5vdGljZSBpdC4gIEJ1dCBpZiB0aGUgYnVnIGlzIGluY29ycmVjdCBvdXRwdXQsIHdlIG1pZ2h0Ci1ub3Qgbm90aWNlIHVubGVzcyBpdCBpcyBnbGFyaW5nbHkgd3JvbmcuICBZb3UgbWlnaHQgYXMgd2VsbCBub3QgZ2l2ZSB1cwotYSBjaGFuY2UgdG8gbWFrZSBhIG1pc3Rha2UuCi0KLUV2ZW4gaWYgdGhlIHByb2JsZW0geW91IGV4cGVyaWVuY2UgaXMgYSBmYXRhbCBzaWduYWwsIHlvdSBzaG91bGQgc3RpbGwKLXNheSBzbyBleHBsaWNpdGx5LiAgU3VwcG9zZSBzb21ldGhpbmcgc3RyYW5nZSBpcyBnb2luZyBvbiwgc3VjaCBhcyB5b3VyCi1jb3B5IG9mIHRoZSB1dGlsaXR5IGlzIG91dCBvZiBzeW5jaCwgb3IgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBidWcgaW4KLXRoZSBDIGxpYnJhcnkgb24geW91ciBzeXN0ZW0uICAoVGhpcyBoYXMgaGFwcGVuZWQhKSAgWW91ciBjb3B5IG1pZ2h0Ci1jcmFzaCBhbmQgb3VycyB3b3VsZCBub3QuICBJZiB5b3UgdG9sZCB1cyB0byBleHBlY3QgYSBjcmFzaCwgdGhlbiB3aGVuCi1vdXJzIGZhaWxzIHRvIGNyYXNoLCB3ZSB3b3VsZCBrbm93IHRoYXQgdGhlIGJ1ZyB3YXMgbm90IGhhcHBlbmluZyBmb3IKLXVzLiAgSWYgeW91IGhhZCBub3QgdG9sZCB1cyB0byBleHBlY3QgYSBjcmFzaCwgdGhlbiB3ZSB3b3VsZCBub3QgYmUgYWJsZQotdG8gZHJhdyBhbnkgY29uY2x1c2lvbiBmcm9tIG91ciBvYnNlcnZhdGlvbnMuCi0KLUBpdGVtCi1JZiB5b3Ugd2lzaCB0byBzdWdnZXN0IGNoYW5nZXMgdG8gdGhlIHNvdXJjZSwgc2VuZCB1cyBjb250ZXh0IGRpZmZzLCBhcwotZ2VuZXJhdGVkIGJ5IEBjb2Rle2RpZmZ9IHdpdGggdGhlIEBzYW1wey11fSwgQHNhbXB7LWN9LCBvciBAc2FtcHstcH0KLW9wdGlvbi4gIEFsd2F5cyBzZW5kIGRpZmZzIGZyb20gdGhlIG9sZCBmaWxlIHRvIHRoZSBuZXcgZmlsZS4gIElmIHlvdQotd2lzaCB0byBkaXNjdXNzIHNvbWV0aGluZyBpbiB0aGUgQGNvZGV7bGR9IHNvdXJjZSwgcmVmZXIgdG8gaXQgYnkKLWNvbnRleHQsIG5vdCBieSBsaW5lIG51bWJlci4KLQotVGhlIGxpbmUgbnVtYmVycyBpbiBvdXIgZGV2ZWxvcG1lbnQgc291cmNlcyB3aWxsIG5vdCBtYXRjaCB0aG9zZSBpbiB5b3VyCi1zb3VyY2VzLiAgWW91ciBsaW5lIG51bWJlcnMgd291bGQgY29udmV5IG5vIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB1cy4KLUBlbmQgaXRlbWl6ZQotCi1IZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGFyZSBub3QgbmVjZXNzYXJ5OgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQSBkZXNjcmlwdGlvbiBvZiB0aGUgZW52ZWxvcGUgb2YgdGhlIGJ1Zy4KLQotT2Z0ZW4gcGVvcGxlIHdobyBlbmNvdW50ZXIgYSBidWcgc3BlbmQgYSBsb3Qgb2YgdGltZSBpbnZlc3RpZ2F0aW5nCi13aGljaCBjaGFuZ2VzIHRvIHRoZSBpbnB1dCBmaWxlIHdpbGwgbWFrZSB0aGUgYnVnIGdvIGF3YXkgYW5kIHdoaWNoCi1jaGFuZ2VzIHdpbGwgbm90IGFmZmVjdCBpdC4KLQotVGhpcyBpcyBvZnRlbiB0aW1lIGNvbnN1bWluZyBhbmQgbm90IHZlcnkgdXNlZnVsLCBiZWNhdXNlIHRoZSB3YXkgd2UKLXdpbGwgZmluZCB0aGUgYnVnIGlzIGJ5IHJ1bm5pbmcgYSBzaW5nbGUgZXhhbXBsZSB1bmRlciB0aGUgZGVidWdnZXIKLXdpdGggYnJlYWtwb2ludHMsIG5vdCBieSBwdXJlIGRlZHVjdGlvbiBmcm9tIGEgc2VyaWVzIG9mIGV4YW1wbGVzLgotV2UgcmVjb21tZW5kIHRoYXQgeW91IHNhdmUgeW91ciB0aW1lIGZvciBzb21ldGhpbmcgZWxzZS4KLQotT2YgY291cnNlLCBpZiB5b3UgY2FuIGZpbmQgYSBzaW1wbGVyIGV4YW1wbGUgdG8gcmVwb3J0IEBlbXBoe2luc3RlYWR9Ci1vZiB0aGUgb3JpZ2luYWwgb25lLCB0aGF0IGlzIGEgY29udmVuaWVuY2UgZm9yIHVzLiAgRXJyb3JzIGluIHRoZQotb3V0cHV0IHdpbGwgYmUgZWFzaWVyIHRvIHNwb3QsIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyIHdpbGwgdGFrZQotbGVzcyB0aW1lLCBhbmQgc28gb24uCi0KLUhvd2V2ZXIsIHNpbXBsaWZpY2F0aW9uIGlzIG5vdCB2aXRhbDsgaWYgeW91IGRvIG5vdCB3YW50IHRvIGRvIHRoaXMsCi1yZXBvcnQgdGhlIGJ1ZyBhbnl3YXkgYW5kIHNlbmQgdXMgdGhlIGVudGlyZSB0ZXN0IGNhc2UgeW91IHVzZWQuCi0KLUBpdGVtCi1BIHBhdGNoIGZvciB0aGUgYnVnLgotCi1BIHBhdGNoIGZvciB0aGUgYnVnIGRvZXMgaGVscCB1cyBpZiBpdCBpcyBhIGdvb2Qgb25lLiAgQnV0IGRvIG5vdCBvbWl0Ci10aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0ZXN0IGNhc2UsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKLWEgcGF0Y2ggaXMgYWxsIHdlIG5lZWQuICBXZSBtaWdodCBzZWUgcHJvYmxlbXMgd2l0aCB5b3VyIHBhdGNoIGFuZCBkZWNpZGUKLXRvIGZpeCB0aGUgcHJvYmxlbSBhbm90aGVyIHdheSwgb3Igd2UgbWlnaHQgbm90IHVuZGVyc3RhbmQgaXQgYXQgYWxsLgotCi1Tb21ldGltZXMgd2l0aCBwcm9ncmFtcyBhcyBjb21wbGljYXRlZCBhcyB0aGUgYmluYXJ5IHV0aWxpdGllcyBpdCBpcwotdmVyeSBoYXJkIHRvIGNvbnN0cnVjdCBhbiBleGFtcGxlIHRoYXQgd2lsbCBtYWtlIHRoZSBwcm9ncmFtIGZvbGxvdyBhCi1jZXJ0YWluIHBhdGggdGhyb3VnaCB0aGUgY29kZS4gIElmIHlvdSBkbyBub3Qgc2VuZCB1cyB0aGUgZXhhbXBsZSwgd2UKLXdpbGwgbm90IGJlIGFibGUgdG8gY29uc3RydWN0IG9uZSwgc28gd2Ugd2lsbCBub3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhhdAotdGhlIGJ1ZyBpcyBmaXhlZC4KLQotQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKLXBhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKLWhlbHAgdXMgdG8gdW5kZXJzdGFuZC4KLQotQGl0ZW0KLUEgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KLQotU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAotdGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2J1Y29tbS5jIGIvYmludXRpbHMvYnVjb21tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjAwNTQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYnVjb21tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogYnVjb21tLmMgLS0gQmluIFV0aWxzIENPTW1vbiBjb2RlLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qIFdlIG1pZ2h0IHB1dCB0aGlzIGluIGEgbGlicmFyeSBzb21lZGF5IHNvIGl0IGNvdWxkIGJlIGR5bmFtaWNhbGx5Ci0gICBsb2FkZWQsIGJ1dCBmb3Igbm93IGl0J3Mgbm90IG5lY2Vzc2FyeS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dGltZS5oPgkJLyogY3RpbWUsIG1heWJlIHRpbWVfdCAqLwotCi0jaWZuZGVmIEhBVkVfVElNRV9UX0lOX1RJTUVfSAotI2lmbmRlZiBIQVZFX1RJTUVfVF9JTl9UWVBFU19ICi10eXBlZGVmIGxvbmcgdGltZV90OwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQwKLS8qIEVycm9yIHJlcG9ydGluZyAqLwotCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLXZvaWQKLWJmZF9ub25mYXRhbCAoc3RyaW5nKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci17Ci0gIENPTlNUIGNoYXIgKmVycm1zZyA9IGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpOwotCi0gIGlmIChzdHJpbmcpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHJpbmcsIGVycm1zZyk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIHByb2dyYW1fbmFtZSwgZXJybXNnKTsKLX0KLQotdm9pZAotYmZkX2ZhdGFsIChzdHJpbmcpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLXsKLSAgYmZkX25vbmZhdGFsIChzdHJpbmcpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZXBvcnQgKGZvcm1hdCwgYXJncykKLSAgICAgY29uc3QgY2hhciAqIGZvcm1hdDsKLSAgICAgdmFfbGlzdCBhcmdzOwotewotICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotdm9pZAotZmF0YWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJlcG9ydCAoZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgeGV4aXQgKDEpOwotfQotCi12b2lkCi1ub25fZmF0YWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJlcG9ydCAoZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLX0KLSNlbHNlCi12b2lkIAotZmF0YWwgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqRm9ybWF0OwotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBGb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0gIHJlcG9ydCAoRm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgeGV4aXQgKDEpOwotfQotCi12b2lkIAotbm9uX2ZhdGFsICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi17Ci0gIGNoYXIgKkZvcm1hdDsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgRm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotICByZXBvcnQgKEZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci19Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBkZWZhdWx0IEJGRCB0YXJnZXQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0LiAgRG9pbmcKLSAgIHRoaXMgcGVybWl0cyB0aGUgYmludXRpbHMgdG8gYmUgY29uZmlndXJlZCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCwKLSAgIGFuZCBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBCRkQgbGlicmFyeSB3aGljaCB3YXMgY29uZmlndXJlZCBmb3IgYQotICAgZGlmZmVyZW50IHRhcmdldC4gICovCi0KLXZvaWQKLXNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCkKLXsKLSAgLyogVGhlIG1hY3JvIFRBUkdFVCBpcyBkZWZpbmVkIGJ5IE1ha2VmaWxlLiAgKi8KLSAgY29uc3QgY2hhciAqdGFyZ2V0ID0gVEFSR0VUOwotCi0gIGlmICghIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKHRhcmdldCkpCi0gICAgZmF0YWwgKF8oImNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJXMiKSwKLQkgICB0YXJnZXQsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLX0KLQotLyogQWZ0ZXIgYSBmYWxzZSByZXR1cm4gZnJvbSBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgd2l0aAotICAgYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLCBwcmludAotICAgdGhlIHBvc3NpYmxlIG1hdGNoaW5nIHRhcmdldHMuICAqLwotCi12b2lkCi1saXN0X21hdGNoaW5nX2Zvcm1hdHMgKHApCi0gICAgIGNoYXIgKipwOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBNYXRjaGluZyBmb3JtYXRzOiIpLCBwcm9ncmFtX25hbWUpOwotICB3aGlsZSAoKnApCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgKnArKyk7Ci0gIGZwdXRjICgnXG4nLCBzdGRlcnIpOwotfQotCi0vKiBMaXN0IHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cy4gICovCi0KLXZvaWQKLWxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKG5hbWUsIGYpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEZJTEUgKmY7Ci17Ci0gIGV4dGVybiBiZmRfdGFyZ2V0ICpiZmRfdGFyZ2V0X3ZlY3RvcltdOwotICBpbnQgdDsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIGZwcmludGYgKGYsIF8oIlN1cHBvcnRlZCB0YXJnZXRzOiIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGYsIF8oIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czoiKSwgbmFtZSk7Ci0gIGZvciAodCA9IDA7IGJmZF90YXJnZXRfdmVjdG9yW3RdICE9IE5VTEw7IHQrKykKLSAgICBmcHJpbnRmIChmLCAiICVzIiwgYmZkX3RhcmdldF92ZWN0b3JbdF0tPm5hbWUpOwotICBmcHJpbnRmIChmLCAiXG4iKTsKLX0KLQwKLS8qIERpc3BsYXkgdGhlIGFyY2hpdmUgaGVhZGVyIGZvciBhbiBlbGVtZW50IGFzIGlmIGl0IHdlcmUgYW4gbHMgLWwgbGlzdGluZzoKLQotICAgTW9kZSAgICAgICBVc2VyXHRHcm91cFx0U2l6ZVx0RGF0ZSAgICAgICAgICAgICAgIE5hbWUgKi8KLQotdm9pZAotcHJpbnRfYXJlbHRfZGVzY3IgKGZpbGUsIGFiZmQsIHZlcmJvc2UpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiB2ZXJib3NlOwotewotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgaWYgKGJmZF9zdGF0X2FyY2hfZWx0IChhYmZkLCAmYnVmKSA9PSAwKQotCXsKLQkgIGNoYXIgbW9kZWJ1ZlsxMV07Ci0JICBjaGFyIHRpbWVidWZbNDBdOwotCSAgdGltZV90IHdoZW4gPSBidWYuc3RfbXRpbWU7Ci0JICBDT05TVCBjaGFyICpjdGltZV9yZXN1bHQgPSAoQ09OU1QgY2hhciAqKSBjdGltZSAoJndoZW4pOwotCi0JICAvKiBQT1NJWCBmb3JtYXQ6ICBza2lwIHdlZWtkYXkgYW5kIHNlY29uZHMgZnJvbSBjdGltZSBvdXRwdXQuICAqLwotCSAgc3ByaW50ZiAodGltZWJ1ZiwgIiUuMTJzICUuNHMiLCBjdGltZV9yZXN1bHQgKyA0LCBjdGltZV9yZXN1bHQgKyAyMCk7Ci0KLQkgIG1vZGVfc3RyaW5nIChidWYuc3RfbW9kZSwgbW9kZWJ1Zik7Ci0JICBtb2RlYnVmWzEwXSA9ICdcMCc7Ci0JICAvKiBQT1NJWCAxMDAzLjIvRDExIHNheXMgdG8gc2tpcCBmaXJzdCBjaGFyYWN0ZXIgKGVudHJ5IHR5cGUpLiAgKi8KLQkgIGZwcmludGYgKGZpbGUsICIlcyAlbGQvJWxkICU2bGQgJXMgIiwgbW9kZWJ1ZiArIDEsCi0JCSAgIChsb25nKSBidWYuc3RfdWlkLCAobG9uZykgYnVmLnN0X2dpZCwKLQkJICAgKGxvbmcpIGJ1Zi5zdF9zaXplLCB0aW1lYnVmKTsKLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbGUsICIlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgRklMRU5BTUUuICAqLwotCi1jaGFyICoKLW1ha2VfdGVtcG5hbWUgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RhdGljIGNoYXIgdGVtcGxhdGVbXSA9ICJzdFhYWFhYWCI7Ci0gIGNoYXIgKnRtcG5hbWU7Ci0gIGNoYXIgKnNsYXNoID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7Ci0KLSNpZiBkZWZpbmVkIChfX0RKR1BQX18pIHx8IGRlZmluZWQgKF9fR08zMl9fKSB8fCBkZWZpbmVkIChfV0lOMzIpCi0gIGlmIChzbGFzaCA9PSBOVUxMKQotICAgIHNsYXNoID0gc3RycmNociAoZmlsZW5hbWUsICdcXCcpOwotI2VuZGlmCi0KLSAgaWYgKHNsYXNoICE9IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgY2hhciBjOwotCi0gICAgICBjID0gKnNsYXNoOwotICAgICAgKnNsYXNoID0gMDsKLSAgICAgIHRtcG5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKSArIHNpemVvZiAodGVtcGxhdGUpICsgMSk7Ci0gICAgICBzdHJjcHkgKHRtcG5hbWUsIGZpbGVuYW1lKTsKLSAgICAgIHN0cmNhdCAodG1wbmFtZSwgIi8iKTsKLSAgICAgIHN0cmNhdCAodG1wbmFtZSwgdGVtcGxhdGUpOwotICAgICAgbWt0ZW1wICh0bXBuYW1lKTsKLSAgICAgICpzbGFzaCA9IGM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdG1wbmFtZSA9IHhtYWxsb2MgKHNpemVvZiAodGVtcGxhdGUpKTsKLSAgICAgIHN0cmNweSAodG1wbmFtZSwgdGVtcGxhdGUpOwotICAgICAgbWt0ZW1wICh0bXBuYW1lKTsKLSAgICB9Ci0gIHJldHVybiB0bXBuYW1lOwotfQotCi0vKiBQYXJzZSBhIHN0cmluZyBpbnRvIGEgVk1BLCB3aXRoIGEgZmF0YWwgZXJyb3IgaWYgaXQgY2FuJ3QgYmUKLSAgIHBhcnNlZC4gICovCi0KLWJmZF92bWEKLXBhcnNlX3ZtYSAocywgYXJnKQotICAgICBjb25zdCBjaGFyICpzOwotICAgICBjb25zdCBjaGFyICphcmc7Ci17Ci0gIGJmZF92bWEgcmV0OwotICBjb25zdCBjaGFyICplbmQ7Ci0KLSAgcmV0ID0gYmZkX3NjYW5fdm1hIChzLCAmZW5kLCAwKTsKLSAgCi0gIGlmICgqZW5kICE9ICdcMCcpCi0gICAgZmF0YWwgKF8oIiVzOiBiYWQgbnVtYmVyOiAlcyIpLCBhcmcsIHMpOwotCi0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9idWNvbW0uaCBiL2JpbnV0aWxzL2J1Y29tbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmU2YTc5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2J1Y29tbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qIGJ1Y29tbS5oIC0tIGJpbnV0aWxzIGNvbW1vbiBpbmNsdWRlIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0jaWZuZGVmIF9CVUNPTU1fSAotI2RlZmluZSBfQlVDT01NX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgVVNFX0JJTkFSWV9GT1BFTgotI2luY2x1ZGUgImZvcGVuLWJpbi5oIgotI2Vsc2UKLSNpbmNsdWRlICJmb3Blbi1zYW1lLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9GQ05UTF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TWVNfRklMRV9ICi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TQlJLCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi1leHRlcm4gY2hhciAqc2JyayAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCi1leHRlcm4gY2hhciAqKmVudmlyb247Ci0jZW5kaWYKLQotI2lmbmRlZiBPX1JET05MWQotI2RlZmluZSBPX1JET05MWSAwCi0jZW5kaWYKLQotI2lmbmRlZiBPX1JEV1IKLSNkZWZpbmUgT19SRFdSIDIKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfU0VUCi0jZGVmaW5lIFNFRUtfU0VUIDAKLSNlbmRpZgotI2lmbmRlZiBTRUVLX0NVUgotI2RlZmluZSBTRUVLX0NVUiAxCi0jZW5kaWYKLSNpZm5kZWYgU0VFS19FTkQKLSNkZWZpbmUgU0VFS19FTkQgMgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWYgZGVmaW5lZChIQVZFX0FMTE9DQV9IKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotIyAgIGlmICFkZWZpbmVkIChfX1NURENfXykgJiYgIWRlZmluZWQgKF9faHB1eCkKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbHNlCi12b2lkICphbGxvY2EgKCk7Ci0jICAgZW5kaWYgLyogX19TVERDX18sIF9faHB1eCAqLwotIyAgZW5kaWYgLyogYWxsb2NhICovCi0jIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0KLS8qIGJ1Y29tbS5jICovCi12b2lkIGJmZF9ub25mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKLQotdm9pZCBiZmRfZmF0YWwgUEFSQU1TICgoQ09OU1QgY2hhciAqKSk7Ci0KLXZvaWQgZmF0YWwgUEFSQU1TICgoQ09OU1QgY2hhciAqLCAuLi4pKTsKLQotdm9pZCBub25fZmF0YWwgUEFSQU1TICgoQ09OU1QgY2hhciAqLCAuLi4pKTsKLQotdm9pZCBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgUEFSQU1TICgoY2hhciAqKnApKTsKLQotdm9pZCBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgRklMRSAqKSk7Ci0KLXZvaWQgcHJpbnRfYXJlbHRfZGVzY3IgUEFSQU1TICgoRklMRSAqZmlsZSwgYmZkICphYmZkLCBib29sZWFuIHZlcmJvc2UpKTsKLQotY2hhciAqbWFrZV90ZW1wbmFtZSBQQVJBTVMgKChjaGFyICopKTsKLQotYmZkX3ZtYSBwYXJzZV92bWEgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogZmlsZW1vZGUuYyAqLwotdm9pZCBtb2RlX3N0cmluZyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG1vZGUsIGNoYXIgKmJ1ZikpOwotCi0vKiB2ZXJzaW9uLmMgKi8KLWV4dGVybiB2b2lkIHByaW50X3ZlcnNpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIHJlbmFtZS5jICovCi1leHRlcm4gdm9pZCBzZXRfdGltZXMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLWV4dGVybiBpbnQgc21hcnRfcmVuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotLyogbGliaWJlcnR5ICovCi1QVFIgeG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotUFRSIHhyZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci0KLSNlbmRpZiAvKiBfQlVDT01NX0ggKi8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2J1ZGJnLmggYi9iaW51dGlscy9idWRiZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGVlODg5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2J1ZGJnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKiBidWRiZy5jIC0tIEludGVyZmFjZXMgdG8gdGhlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHJvdXRpbmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQlVEQkdfSAotI2RlZmluZSBCVURCR19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBSb3V0aW5lIHVzZWQgdG8gcmVhZCBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBQVFIgcmVhZF9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZykpOwotCi0vKiBSb3V0aW5lIHVzZWQgdG8gcHJpbnQgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1leHRlcm4gYm9vbGVhbiBwcmludF9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChGSUxFICosIFBUUikpOwotCi0vKiBSb3V0aW5lcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIHN0YWJzIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIFBUUiBzdGFydF9zdGFiIFBBUkFNUyAoKFBUUiwgYmZkICosIGJvb2xlYW4sIGFzeW1ib2wgKiosIGxvbmcpKTsKLQotZXh0ZXJuIGJvb2xlYW4gZmluaXNoX3N0YWIgUEFSQU1TICgoUFRSLCBQVFIpKTsKLQotZXh0ZXJuIGJvb2xlYW4gcGFyc2Vfc3RhYiBQQVJBTVMgKChQVFIsIFBUUiwgaW50LCBpbnQsIGJmZF92bWEsIGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gYm9vbGVhbiB3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgUFRSLCBiZmRfYnl0ZSAqKiwgYmZkX3NpemVfdHlwZSAqLCBiZmRfYnl0ZSAqKiwKLQkgICBiZmRfc2l6ZV90eXBlICopKTsKLQotLyogUm91dGluZXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBib29sZWFuIHBhcnNlX2llZWUKLSAgUEFSQU1TICgoUFRSLCBiZmQgKiwgY29uc3QgYmZkX2J5dGUgKiwgYmZkX3NpemVfdHlwZSkpOwotCi1leHRlcm4gYm9vbGVhbiB3cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotLyogUm91dGluZSB1c2VkIHRvIHJlYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1leHRlcm4gYm9vbGVhbiBwYXJzZV9jb2ZmIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBsb25nLCBQVFIpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb2ZmZHVtcC5jIGIvYmludXRpbHMvY29mZmR1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4NGQ1MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb2ZmZHVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qIENvZmYgZmlsZSBkdW1wZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgbW9kdWxlIHJlYWRzIGEgdHlwZSB0cmVlIGdlbmVyYXRlZCBieSBjb2ZmZ3JvayBhbmQgcHJpbnRzCi0gICBpdCBvdXQgc28gd2UgY2FuIHRlc3QgdGhlIGdyb2trZXIuCi0qLwotCi0jaW5jbHVkZSA8YmZkLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8bGliaWJlcnR5Lmg+Ci0KLSNpbmNsdWRlICJjb2ZmZ3Jvay5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jZGVmaW5lIFBST0dSQU1fVkVSU0lPTiAiMS4wIgotCi1zdGF0aWMgaW50IGF0bmw7Ci1zdGF0aWMgdm9pZCBkdW1wX2NvZmZfc2NvcGUgKCk7Ci0KLXN0YXRpYyB2b2lkCi10YWIgKHgpCi1pbnQgeDsKLXsKLSAgc3RhdGljIGludCBpbmRlbnQ7Ci0gIGludCBpOwotCi0gIGlmIChhdG5sKQotICAgIHsKLSAgICAgIGlmICh4IDwgMCkKLQl7Ci0JICBwcmludGYgKCIpIik7Ci0JICBpbmRlbnQgKz0geDsKLQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgYXRubCA9IDA7Ci0JfQotICAgIH0KLQotICBpZiAoeCA9PSAtMSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0JcHJpbnRmICgiICAgIik7Ci0KLSAgICAgIGluZGVudCArPSB4OwotICAgICAgcHJpbnRmICgiKSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbmRlbnQgKz0geDsKLQotICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0gICAgcHJpbnRmICgiICAgIik7Ci0KLSAgaWYgKHgpCi0gICAgewotICAgICAgcHJpbnRmICgiKCIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgbmwgKCkKLXsKLSAgYXRubCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfbGluZXMgKHApCi0gICAgIHN0cnVjdCBjb2ZmX2xpbmUgKnA7Ci17Ci0gIGludCBpOwotICBpbnQgb25saW5lID0gMDsKLSAgdGFiKDEpOwotICBwcmludGYoXygiI2xpbmVzICVkICIpLHAtPm5saW5lcyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwLT5ubGluZXM7IGkrKykgCi0gICAgewotICAgICAgcHJpbnRmKCIoJWQgMHgleCkiLCBwLT5saW5lc1tpXSwgcC0+YWRkcmVzc2VzW2ldKTsKLSAgICAgIG9ubGluZSsrOwotICAgICAgaWYgKG9ubGluZSA+IDYpCi0JewotCSAgbmwoKTsKLQkgIHRhYigwKTsKLQkgIG9ubGluZSA9IDA7Ci0JfQotICAgIH0KLSAgbmwoKTsKLSAgdGFiKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl90eXBlIChwKQotICAgICBzdHJ1Y3QgY29mZl90eXBlICpwOwotewotICB0YWIgKDEpOwotICBwcmludGYgKCJzaXplICVkICIsIHAtPnNpemUpOwotICBzd2l0Y2ggKHAtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl9zZWNkZWZfdHlwZToKLSAgICAgIHByaW50ZiAoInNlY3Rpb24gZGVmaW5pdGlvbiBhdCAleCBzaXplICV4XG4iLCAKLQkgICAgICBwLT51LmFzZWNkZWYuYWRkcmVzcywKLQkgICAgICBwLT51LmFzZWNkZWYuc2l6ZSk7Ci0gICAgICBubCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3BvaW50ZXJfdHlwZToKLSAgICAgIHByaW50ZiAoInBvaW50ZXIgdG8iKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3R5cGUgKHAtPnUucG9pbnRlci5wb2ludHNfdG8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2FycmF5X3R5cGU6Ci0gICAgICBwcmludGYgKCJhcnJheSBbJWRdIG9mIiwgcC0+dS5hcnJheS5kaW0pOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dS5hcnJheS5hcnJheV9vZik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZnVuY3Rpb25fdHlwZToKLSAgICAgIHByaW50ZiAoImZ1bmN0aW9uIHJldHVybmluZyIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dS5mdW5jdGlvbi5mdW5jdGlvbl9yZXR1cm5zKTsKLSAgICAgIGR1bXBfY29mZl9saW5lcyAocC0+dS5mdW5jdGlvbi5saW5lcyk7Ci0gICAgICBwcmludGYgKCJhcmd1bWVudHMiKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMpOwotICAgICAgdGFiICgwKTsKLSAgICAgIHByaW50ZiAoImNvZGUiKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmZ1bmN0aW9uLmNvZGUpOwotICAgICAgdGFiKDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3N0cnVjdGRlZl90eXBlOgotICAgICAgcHJpbnRmICgic3RydWN0dXJlIGRlZmluaXRpb24iKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3N0cnVjdHJlZl90eXBlOgotICAgICAgaWYgKCFwLT51LmFlbnVtcmVmLnJlZikKLQlwcmludGYgKCJzdHJ1Y3R1cmUgcmVmIHRvIFVOS05PV04gc3RydWN0Iik7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgic3RydWN0dXJlIHJlZiB0byAlcyIsIHAtPnUuYWVudW1yZWYucmVmLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9lbnVtcmVmX3R5cGU6Ci0gICAgICBwcmludGYgKCJlbnVtIHJlZiB0byAlcyIsIHAtPnUuYXN0cnVjdHJlZi5yZWYtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1kZWZfdHlwZToKLSAgICAgIHByaW50ZiAoImVudW0gZGVmaW5pdGlvbiIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuYWVudW1kZWYuZWxlbWVudHMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2Jhc2ljX3R5cGU6Ci0gICAgICBzd2l0Y2ggKHAtPnUuYmFzaWMpCi0JewotCWNhc2UgVF9OVUxMOgotCSAgcHJpbnRmICgiTlVMTCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1ZPSUQ6Ci0JICBwcmludGYgKCJWT0lEIik7Ci0JICBicmVhazsKLQljYXNlIFRfQ0hBUjoKLQkgIHByaW50ZiAoIkNIQVIiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9TSE9SVDoKLQkgIHByaW50ZiAoIlNIT1JUIik7Ci0JICBicmVhazsKLQljYXNlIFRfSU5UOgotCSAgcHJpbnRmICgiSU5UICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0xPTkc6Ci0JICBwcmludGYgKCJMT05HIik7Ci0JICBicmVhazsKLQljYXNlIFRfRkxPQVQ6Ci0JICBwcmludGYgKCJGTE9BVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0RPVUJMRToKLQkgIHByaW50ZiAoIkRPVUJMRSIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1NUUlVDVDoKLQkgIHByaW50ZiAoIlNUUlVDVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VOSU9OOgotCSAgcHJpbnRmICgiVU5JT04iKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9FTlVNOgotCSAgcHJpbnRmICgiRU5VTSIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX01PRToKLQkgIHByaW50ZiAoIk1PRSAiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VQ0hBUjoKLQkgIHByaW50ZiAoIlVDSEFSIik7Ci0JICBicmVhazsKLQljYXNlIFRfVVNIT1JUOgotCSAgcHJpbnRmICgiVVNIT1JUIik7Ci0JICBicmVhazsKLQljYXNlIFRfVUlOVDoKLQkgIHByaW50ZiAoIlVJTlQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VTE9ORzoKLQkgIHByaW50ZiAoIlVMT05HIik7Ci0JICBicmVhazsKLQljYXNlIFRfTE5HREJMOgotCSAgcHJpbnRmICgiTE5HREJMIik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLSAgbmwgKCk7Ci0gIHRhYiAoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3doZXJlIChwKQotICAgICBzdHJ1Y3QgY29mZl93aGVyZSAqcDsKLXsKLSAgdGFiICgxKTsKLSAgc3dpdGNoIChwLT53aGVyZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0YWNrOgotICAgICAgcHJpbnRmICgiU3RhY2sgb2Zmc2V0ICV4IiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1vcnk6Ci0gICAgICBwcmludGYgKCJNZW1vcnkgc2VjdGlvbiAlcysleCIsIHAtPnNlY3Rpb24tPm5hbWUsIHAtPm9mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfcmVnaXN0ZXI6Ci0gICAgICBwcmludGYgKCJSZWdpc3RlciAlZCIsIHAtPm9mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDoKLSAgICAgIHByaW50ZiAoIlN0cnVjdCBNZW1iZXIgb2Zmc2V0ICV4IiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bToKLSAgICAgIHByaW50ZiAoIkVudW0gTWVtYmVyIG9mZnNldCAleCIsIHAtPm9mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfdW5rbm93bjoKLSAgICAgIHByaW50ZiAoIlVuZGVmaW5lZCBzeW1ib2wiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9zdHJ0YWc6Ci0gICAgICBwcmludGYgKCJTVFJUQUciKTsKLSAgICBjYXNlIGNvZmZfd2hlcmVfZW50YWc6Ci0gICAgICBwcmludGYgKCJFTlRBRyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3R5cGVkZWY6Ci0gICAgICBwcmludGYgKCJUWVBFREVGIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBubCAoKTsKLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfdmlzaWJsZSAocCkKLSAgICAgc3RydWN0IGNvZmZfdmlzaWJsZSAqcDsKLXsKLSAgdGFiICgxKTsKLSAgc3dpdGNoIChwLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9kZWY6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19leHRfZGVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9yZWY6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19leHRfcmVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2ludF9kZWY6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19pbnRfZGVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2NvbW1vbjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2NvbW1vbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfYXV0byIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvcGFyYW06Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19hdXRvcGFyYW0iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfcmVncGFyYW06Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19yZWdwYXJhbSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdpc3RlcjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX3JlZ2lzdGVyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX3RhZzoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX3RhZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0OgotICAgICAgcHJpbnRmICgiY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bToKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX21lbWJlcl9vZl9lbnVtIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBubCAoKTsKLSAgdGFiICgtMSk7Ci19Ci0KLQotdm9pZAotZHVtcF9jb2ZmX3N5bWJvbCAocCkKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpwOwotewotICB0YWIgKDEpOwotICBwcmludGYgKCJMaXN0IG9mIHN5bWJvbHMiKTsKLSAgbmwgKCk7Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICB0YWIgKDEpOwotICAgICAgcHJpbnRmICgiU3ltYm9sICAlcywgdGFnICVkLCBudW1iZXIgJWQiLCBwLT5uYW1lLCBwLT50YWcsIHAtPm51bWJlcik7Ci0gICAgICBubCAoKTsKLSAgICAgIHRhYiAoLTEpOwotICAgICAgdGFiICgxKTsKLSAgICAgIHByaW50ZiAoIlR5cGUiKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3R5cGUgKHAtPnR5cGUpOwotICAgICAgdGFiICgtMSk7Ci0gICAgICB0YWIgKDEpOwotICAgICAgcHJpbnRmICgiV2hlcmUiKTsKLSAgICAgIGR1bXBfY29mZl93aGVyZSAocC0+d2hlcmUpOwotICAgICAgdGFiICgtMSk7Ci0gICAgICB0YWIgKDEpOwotICAgICAgcHJpbnRmICgiVmlzaWJsZSIpOwotICAgICAgZHVtcF9jb2ZmX3Zpc2libGUgKHAtPnZpc2libGUpOwotICAgICAgdGFiICgtMSk7Ci0gICAgICBwID0gcC0+bmV4dDsKLSAgICAgIHRhYiAoLTEpOwotICAgIH0KLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfc2NvcGUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpwOwotewotaWYgKHApIHsKLSAgdGFiICgxKTsKLSAgcHJpbnRmICgiTGlzdCBvZiBibG9ja3MgJWx4ICIsKHVuc2lnbmVkIGxvbmcpIHApOwotCi0gIGlmIChwLT5zZWMpIHsKLSAgICBwcmludGYoICIgICVzICV4Li4leCIsICBwLT5zZWMtPm5hbWUscC0+b2Zmc2V0LCBwLT5vZmZzZXQgKyBwLT5zaXplIC0xKTsKLSAgfQotICBubCAoKTsKLSAgdGFiICgwKTsKLSAgcHJpbnRmICgiKioqKioqKioqKioqKioqKioiKTsKLSAgbmwgKCk7Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIHRhYiAoMCk7Ci0gICAgICBwcmludGYgKCJ2YXJzICVkIiwgcC0+bnZhcnMpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc3ltYm9sIChwLT52YXJzX2hlYWQpOwotICAgICAgcHJpbnRmICgiYmxvY2tzIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+bGlzdF9oZWFkKTsKLSAgICAgIG5sICgpOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotCi0gIHRhYiAoMCk7Ci0gIHByaW50ZiAoIioqKioqKioqKioqKioqKioqIik7Ci0gIG5sICgpOwotICB0YWIgKC0xKTsKLX0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl9zZmlsZSAocCkKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHByaW50ZiAoIkxpc3Qgb2Ygc291cmNlIGZpbGVzIik7Ci0gIG5sICgpOwotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICB0YWIgKDApOwotICAgICAgcHJpbnRmICgiU291cmNlIGZpbGUgJXMiLCBwLT5uYW1lKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT5zY29wZSk7Ci0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0gIHRhYiAoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3NlY3Rpb24ocHRyKQotc3RydWN0IGNvZmZfc2VjdGlvbiAqcHRyOwotewotICBpbnQgaTsKLSAgdGFiKDEpOwotICBwcmludGYoInNlY3Rpb24gJXMgJWQgJWQgYWRkcmVzcyAleCBzaXplICV4IG51bWJlciAlZCBucmVsb2NzICVkIiwgCi0JIHB0ci0+bmFtZSwgcHRyLT5jb2RlLCBwdHItPmRhdGEsIHB0ci0+YWRkcmVzcyxwdHItPnNpemUsIHB0ci0+bnVtYmVyLCBwdHItPm5yZWxvY3MpOwotICBubCgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBwdHItPm5yZWxvY3M7IGkrKykgCi0gICAgewotICAgICAgdGFiKDApOyAgICAKLSAgICAgIHByaW50ZigiKCV4ICVzICV4KSIsCi0JICAgICBwdHItPnJlbG9jc1tpXS5vZmZzZXQsCi0JICAgICBwdHItPnJlbG9jc1tpXS5zeW1ib2wtPm5hbWUsCi0JICAgICBwdHItPnJlbG9jc1tpXS5hZGRlbmQpOwotICAgICAgbmwoKTsKLSAgICB9Ci0gIHRhYigtMSk7Ci0KLX0KLQotdm9pZAotY29mZl9kdW1wIChwdHIpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci17Ci0gIGludCBpOwotICBwcmludGYgKCJDb2ZmIGR1bXAiKTsKLSAgbmwgKCk7Ci0gIHByaW50ZiAoIiNzb3VjZXMgJWQiLCBwdHItPm5zb3VyY2VzKTsKLSAgbmwgKCk7Ci0gIGR1bXBfY29mZl9zZmlsZSAocHRyLT5zb3VyY2VfaGVhZCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwdHItPm5zZWN0aW9uczsgaSsrKQotICAgIGR1bXBfY29mZl9zZWN0aW9uKHB0ci0+c2VjdGlvbnMgKyBpKTsKLX0KLQotCi0KLWNoYXIgKiBwcm9ncmFtX25hbWU7Ci0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsICJVc2FnZTogJXMgWy1oVl0gaW4tZmlsZVxuIiwgICBwcm9ncmFtX25hbWUpOwotICBleGl0IChzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqYXZbXTsKLXsKLSAgYmZkICphYmZkOwotICBzdHJ1Y3QgY29mZl9vZmlsZSAqdHJlZTsKLSAgY2hhciAqKm1hdGNoaW5nOwotICBjaGFyICppbnB1dF9maWxlID0gTlVMTDsKLSAgaW50IG9wdDsKLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotICAgIHsKLSAgICAgIHsgImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnIH0sCi0gICAgICB7ICJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJyB9LAotICAgICAgeyBOVUxMLCBub19hcmd1bWVudCwgMCwgMCB9Ci0gICAgfTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiaFYiLCBsb25nX29wdGlvbnMsCi0JCQkgICAgIChpbnQgKikgTlVMTCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgJ1YnOgotCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKLQkgIGV4aXQgKDApOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JfQotICAgIH0KLQotICBpZiAob3B0aW5kIDwgYWMpCi0gICAgewotICAgICAgaW5wdXRfZmlsZSA9IGF2W29wdGluZF07Ci0gICAgfQotCi0gIGlmICghaW5wdXRfZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsXygiJXM6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICBhYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlLCAwKTsKLQotICBpZiAoIWFiZmQpCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHRyZWUgPSBjb2ZmX2dyb2sgKGFiZmQpOwotCi0gIGNvZmZfZHVtcCh0cmVlKTsKLSAgcHJpbnRmKCJcbiIpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvZmZncm9rLmMgYi9iaW51dGlscy9jb2ZmZ3Jvay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRlNmM5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvZmZncm9rLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzcgKzAsMCBAQAotLyogY29mZmdyb2suYwotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pCi0KLSAgIFRoaXMgbW9kdWxlIHJlYWRzIGEgY29mZiBmaWxlIGFuZCBidWlsZHMgYSByZWFsbHkgc2ltcGxlIHR5cGUgdHJlZQotICAgd2hpY2ggY2FuIGJlIHJlYWQgYnkgb3RoZXIgcHJvZ3JhbXMuICBUaGUgZmlyc3QgYXBwbGljYXRpb24gaXMgYQotICAgY29mZi0+c3lzcm9mZiBjb252ZXJ0ZXIuICBJdCBjYW4gYmUgdGVzdGVkIHdpdGggY29mZmR1bXAuYy4KLQotKi8KLQotI2luY2x1ZGUgPGJmZC5oPgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZmdyb2suaCIKLWludCBsb2ZpbGUgPSAxOwotc3RhdGljIHN0cnVjdCBjb2ZmX3Njb3BlICp0b3Bfc2NvcGU7Ci1zdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKmZpbGVfc2NvcGU7Ci1zdGF0aWMgc3RydWN0IGNvZmZfb2ZpbGUgKm9maWxlOwotCi1zdHJ1Y3QgY29mZl9zeW1ib2wgKmxhc3RfZnVuY3Rpb25fc3ltYm9sOwotc3RydWN0IGNvZmZfdHlwZSAqbGFzdF9mdW5jdGlvbl90eXBlOwotc3RydWN0IGNvZmZfdHlwZSAqbGFzdF9zdHJ1Y3Q7Ci1zdHJ1Y3QgY29mZl90eXBlICpsYXN0X2VudW07Ci1zdHJ1Y3QgY29mZl9zZmlsZSAqY3VyX3NmaWxlOwotCi1zdGF0aWMgc3RydWN0IGNvZmZfc3ltYm9sICoqdGluZGV4OwotCi0KLXN0YXRpYyBhc3ltYm9sICoqc3ltczsKLXN0YXRpYyBsb25nIHN5bWNvdW50OwotCi0jZGVmaW5lIE4oeCkgKCh4KS0+X24uX25fbnB0clsxXSkKLQotc3RhdGljIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnJhd3N5bXM7Ci1zdGF0aWMgaW50IHJhd2NvdW50Owotc3RhdGljIGJmZCAqYWJmZDsKLWV4dGVybiBjaGFyICp4Y2FsbG9jICgpOwotI2RlZmluZSBQVFJfU0laRSAJNAotI2RlZmluZSBTSE9SVF9TSVpFIAkyCi0jZGVmaW5lIElOVF9TSVpFIAk0Ci0jZGVmaW5lIExPTkdfU0laRSAJNAotI2RlZmluZSBGTE9BVF9TSVpFIAk0Ci0jZGVmaW5lIERPVUJMRV9TSVpFIAk4Ci0KLSNkZWZpbmUgSU5ERVhPRihwKSAgKChzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICopKHApLShyYXdzeW1zKSkKLQotc3RhdGljIHN0cnVjdCBjb2ZmX3Njb3BlICoKLWVtcHR5X3Njb3BlICgpCi17Ci0gIHN0cnVjdCBjb2ZmX3Njb3BlICpsOwotICBsID0gKHN0cnVjdCBjb2ZmX3Njb3BlICopICh4Y2FsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3Njb3BlKSwgMSkpOwotICByZXR1cm4gbDsKLX0KLQotc3RhdGljIHN0cnVjdCBjb2ZmX3N5bWJvbCAqCi1lbXB0eV9zeW1ib2wgKCkKLXsKLSAgcmV0dXJuIChzdHJ1Y3QgY29mZl9zeW1ib2wgKikgKHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfc3ltYm9sKSwgMSkpOwotfQotCi0vKmludCBsOyovCi1zdGF0aWMgdm9pZAotcHVzaF9zY29wZSAobGluaykKLSAgICAgaW50IGxpbms7Ci17Ci0gIHN0cnVjdCBjb2ZmX3Njb3BlICpuID0gZW1wdHlfc2NvcGUgKCk7Ci0gIGlmIChsaW5rKQotICAgIHsKLSAgICAgIGlmICh0b3Bfc2NvcGUpCi0JewotCSAgaWYgKHRvcF9zY29wZS0+bGlzdF90YWlsKQotCSAgICB7Ci0JICAgICAgdG9wX3Njb3BlLT5saXN0X3RhaWwtPm5leHQgPSBuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB0b3Bfc2NvcGUtPmxpc3RfaGVhZCA9IG47Ci0JICAgIH0KLQkgIHRvcF9zY29wZS0+bGlzdF90YWlsID0gbjsKLQl9Ci0gICAgfQotICBuLT5wYXJlbnQgPSB0b3Bfc2NvcGU7Ci0KLSAgdG9wX3Njb3BlID0gbjsKLX0KLQotc3RhdGljIHZvaWQKLXBvcF9zY29wZSAoKQotewotICB0b3Bfc2NvcGUgPSB0b3Bfc2NvcGUtPnBhcmVudDsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3NlY3Rpb25zX3AxIChoZWFkKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqaGVhZDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGludCBpZHg7Ci0gIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKmFsbCA9IChzdHJ1Y3QgY29mZl9zZWN0aW9uICopICh4Y2FsbG9jIChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSwKLQkJCQkJICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb24pKSk7Ci0gIGhlYWQtPm5zZWN0aW9ucyA9IGFiZmQtPnNlY3Rpb25fY291bnQgKyAxOwotICBoZWFkLT5zZWN0aW9ucyA9IGFsbDsKLQotICBmb3IgKGlkeCA9IDAsIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQsIGlkeCsrKQotICAgIHsKLSAgICAgIGxvbmcgcmVsc2l6ZTsKLSAgICAgIGludCBpID0gc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgYXJlbGVudCAqKnJlbHBwOwotICAgICAgbG9uZyByZWxjb3VudDsKLQotICAgICAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlY3Rpb24pOwotICAgICAgaWYgKHJlbHNpemUgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHAsIHN5bXMpOwotICAgICAgaWYgKHJlbGNvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubmFtZSA9IChjaGFyICopIChzZWN0aW9uLT5uYW1lKTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLmNvZGUgPSBzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uZGF0YSA9IHNlY3Rpb24tPmZsYWdzICYgU0VDX0RBVEE7Ci0gICAgICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmJzcyIpID09IDApCi0JaGVhZC0+c2VjdGlvbnNbaV0uZGF0YSA9IDE7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5hZGRyZXNzID0gc2VjdGlvbi0+bG1hOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uc2l6ZSA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLm51bWJlciA9IGlkeDsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLm5yZWxvY3MgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLnJlbG9jcyA9Ci0JKHN0cnVjdCBjb2ZmX3JlbG9jICopICh4Y2FsbG9jIChzZWN0aW9uLT5yZWxvY19jb3VudCwKLQkJCQkJc2l6ZW9mIChzdHJ1Y3QgY29mZl9yZWxvYykpKTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLmJmZF9zZWN0aW9uID0gc2VjdGlvbjsKLSAgICB9Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLm5hbWUgPSAiQUJTT0xVVEUiOwotICBoZWFkLT5zZWN0aW9uc1swXS5jb2RlID0gMDsKLSAgaGVhZC0+c2VjdGlvbnNbMF0uZGF0YSA9IDA7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLmFkZHJlc3MgPSAwOwotICBoZWFkLT5zZWN0aW9uc1swXS5zaXplID0gMDsKLSAgaGVhZC0+c2VjdGlvbnNbMF0ubnVtYmVyID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3NlY3Rpb25zX3AyIChoZWFkKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqaGVhZDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBqKyspCi0JewotCSAgaW50IGlkeDsKLQkgIGludCBpID0gc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgc3RydWN0IGNvZmZfcmVsb2MgKnIgPSBoZWFkLT5zZWN0aW9uc1tpXS5yZWxvY3MgKyBqOwotCSAgYXJlbGVudCAqc3IgPSBzZWN0aW9uLT5yZWxvY2F0aW9uICsgajsKLQkgIHItPm9mZnNldCA9IHNyLT5hZGRyZXNzOwotCSAgci0+YWRkZW5kID0gc3ItPmFkZGVuZDsKLQkgIGlkeCA9ICgoY29mZl9zeW1ib2xfdHlwZSAqKSAoc3ItPnN5bV9wdHJfcHRyWzBdKSktPm5hdGl2ZSAtIHJhd3N5bXM7Ci0JICByLT5zeW1ib2wgPSB0aW5kZXhbaWR4XTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgc3RydWN0IGNvZmZfd2hlcmUgKgotZG9fd2hlcmUgKGkpCi0gICAgIGludCBpOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLSAgc3RydWN0IGNvZmZfd2hlcmUgKndoZXJlID0KLSAgICAoc3RydWN0IGNvZmZfd2hlcmUgKikgKHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfd2hlcmUpKSk7Ci0gIHdoZXJlLT5vZmZzZXQgPSBzeW0tPm5fdmFsdWU7Ci0KLSAgaWYgKHN5bS0+bl9zY251bSA9PSAtMSkKLSAgICBzeW0tPm5fc2NudW0gPSAwOwotCi0gIHN3aXRjaCAoc3ltLT5uX3NjbGFzcykKLSAgICB7Ci0gICAgY2FzZSBDX0ZJRUxEOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OwotICAgICAgd2hlcmUtPm9mZnNldCA9IHN5bS0+bl92YWx1ZSAvIDg7Ci0gICAgICB3aGVyZS0+Yml0b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlICUgODsKLSAgICAgIHdoZXJlLT5iaXRzaXplID0gcmF3c3ltc1tpICsgMV0udS5hdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfTU9FOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PVToKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19BVVRPOgotICAgIGNhc2UgQ19BUkc6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3N0YWNrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfU1RBVDoKLSAgICBjYXNlIENfRVhUREVGOgotICAgIGNhc2UgQ19MQUJFTDoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfbWVtb3J5OwotICAgICAgd2hlcmUtPnNlY3Rpb24gPSAmb2ZpbGUtPnNlY3Rpb25zW3N5bS0+bl9zY251bV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfUkVHOgotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9yZWdpc3RlcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19FTlRBRzoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfZW50YWc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfU1RSVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfc3RydGFnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX1RQREVGOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV90eXBlZGVmOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gd2hlcmU7Ci19Ci0KLXN0YXRpYwotc3RydWN0IGNvZmZfbGluZSAqCi1kb19saW5lcyAoaSwgbmFtZSkKLSAgICAgaW50IGk7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmUgKnJlcyA9IChzdHJ1Y3QgY29mZl9saW5lICopIHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfbGluZSksIDEpOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IGw7Ci0KLSAgLyogRmluZCBvdXQgaWYgdGhpcyBmdW5jdGlvbiBoYXMgYW55IGxpbmUgbnVtYmVycyBpbiB0aGUgdGFibGUgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAobCA9IDA7IGwgPCBzLT5saW5lbm9fY291bnQ7IGwrKykKLQl7Ci0JICBpZiAocy0+bGluZW5vW2xdLmxpbmVfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICBpZiAocmF3c3ltcyArIGkgPT0gKChjb2ZmX3N5bWJvbF90eXBlICopICgmKHMtPmxpbmVub1tsXS51LnN5bVswXSkpKS0+bmF0aXZlKQotCQl7Ci0JCSAgLyogVGhlc2UgbGluZXMgYXJlIGZvciB0aGlzIGZ1bmN0aW9uIC0gc28gY291bnQgdGhlbSBhbmQgc3RpY2sgdGhlbSBvbiAqLwotCQkgIGludCBjID0gMDsKLQkJICAvKiBGaW5kIHRoZSBsaW5lbnVtYmVyIG9mIHRoZSB0b3Agb2YgdGhlIGZ1bmN0aW9uLCBzaW5jZSBjb2ZmIGxpbmVudW1iZXJzCi0JCSAgICAgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICovCi0JCSAgaW50IHN0YXJ0X2xpbmUgPSByYXdzeW1zW2kgKyAzXS51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubzsKLQotCQkgIGwrKzsKLQkJICBmb3IgKGMgPSAwOyBzLT5saW5lbm9bbCArIGMgKyAxXS5saW5lX251bWJlcjsgYysrKQotCQkgICAgOwotCi0JCSAgLyogQWRkIHR3byBleHRyYSByZWNvcmRzLCBvbmUgZm9yIHRoZSBwcm9sb2d1ZSBhbmQgb25lIGZvciB0aGUgZXBpbG9ndWUgKi8KLQkJICBjICs9IDE7Ci0JCSAgcmVzLT5ubGluZXMgPSBjOwotCQkgIHJlcy0+bGluZXMgPSAoaW50ICopICh4Y2FsbG9jIChzaXplb2YgKGludCksIGMpKTsKLQkJICByZXMtPmFkZHJlc3NlcyA9IChpbnQgKikgKHhjYWxsb2MgKHNpemVvZiAoaW50KSwgYykpOwotCQkgIHJlcy0+bGluZXNbMF0gPSBzdGFydF9saW5lOwotCQkgIHJlcy0+YWRkcmVzc2VzWzBdID0gcmF3c3ltc1tpXS51LnN5bWVudC5uX3ZhbHVlIC0gcy0+dm1hOwotCQkgIGZvciAoYyA9IDA7IHMtPmxpbmVub1tsICsgYyArIDFdLmxpbmVfbnVtYmVyOyBjKyspCi0JCSAgICB7Ci0JCSAgICAgIHJlcy0+bGluZXNbYyArIDFdID0gcy0+bGluZW5vW2wgKyBjXS5saW5lX251bWJlciArIHN0YXJ0X2xpbmUgLSAxOwotCQkgICAgICByZXMtPmFkZHJlc3Nlc1tjICsgMV0gPSBzLT5saW5lbm9bbCArIGNdLnUub2Zmc2V0OwotCQkgICAgfQotCQkgIHJldHVybiByZXM7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYwotc3RydWN0IGNvZmZfdHlwZSAqCi1kb190eXBlIChpKQotICAgICBpbnQgaTsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4ID0gJnJhd3N5bXNbaSArIDFdLnUuYXV4ZW50OwotICBzdHJ1Y3QgY29mZl90eXBlICpyZXMgPQotICAgIChzdHJ1Y3QgY29mZl90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfdHlwZSkpOwotICBpbnQgdHlwZSA9IHN5bS0+bl90eXBlOwotICBpbnQgd2hpY2hfZHQgPSAwOwotICBpbnQgZGltaW5kID0gMDsKLQotICByZXMtPnR5cGUgPSBjb2ZmX2Jhc2ljX3R5cGU7Ci0gIHJlcy0+dS5iYXNpYyA9IHR5cGUgJiAweGY7Ci0KLSAgc3dpdGNoICh0eXBlICYgMHhmKQotICAgIHsKLSAgICBjYXNlIFRfTlVMTDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIGlmIChzeW0tPm5fbnVtYXV4ICYmIHN5bS0+bl9zY2xhc3MgPT0gQ19TVEFUKQotCXsKLQkgIC8qIFRoaXMgaXMgcHJvYmFibHkgYSBzZWN0aW9uIGRlZmluaXRpb24gKi8KLQkgIHJlcy0+dHlwZSA9IGNvZmZfc2VjZGVmX3R5cGU7Ci0JICByZXMtPnNpemUgPSBhdXgtPnhfc2NuLnhfc2NubGVuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAodHlwZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogRG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMsIGxldCdzIG1ha2UgaXQgYSBzaW1wbGUgaW50ICovCi0JICAgICAgcmVzLT5zaXplID0gSU5UX1NJWkU7Ci0JICAgICAgcmVzLT51LmJhc2ljID0gVF9VSU5UOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBFbHNlIGl0IGNvdWxkIGJlIGEgZnVuY3Rpb24gb3IgcG9pbnRlciB0byB2b2lkICovCi0JICAgICAgcmVzLT5zaXplID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VQ0hBUjoKLSAgICBjYXNlIFRfQ0hBUjoKLSAgICAgIHJlcy0+c2l6ZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfVVNIT1JUOgotICAgIGNhc2UgVF9TSE9SVDoKLSAgICAgIHJlcy0+c2l6ZSA9IFNIT1JUX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfVUlOVDoKLSAgICBjYXNlIFRfSU5UOgotICAgICAgcmVzLT5zaXplID0gSU5UX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfVUxPTkc6Ci0gICAgY2FzZSBUX0xPTkc6Ci0gICAgICByZXMtPnNpemUgPSBMT05HX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfRkxPQVQ6Ci0gICAgICByZXMtPnNpemUgPSBGTE9BVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX0RPVUJMRToKLSAgICAgIHJlcy0+c2l6ZSA9IERPVUJMRV9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICBjYXNlIFRfVU5JT046Ci0gICAgICBpZiAoc3ltLT5uX251bWF1eCkKLQl7Ci0JICBpZiAoYXV4LT54X3N5bS54X3RhZ25keC5wKQotCSAgICB7Ci0JICAgICAgLyogUmVmZXJpbmcgdG8gYSBzdHJ1Y3QgZGVmaW5lZCBlbHNld2hlcmUgKi8KLQkgICAgICByZXMtPnR5cGUgPSBjb2ZmX3N0cnVjdHJlZl90eXBlOwotCSAgICAgIHJlcy0+dS5hc3RydWN0cmVmLnJlZiA9IHRpbmRleFtJTkRFWE9GIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApXTsKLQkgICAgICByZXMtPnNpemUgPSByZXMtPnUuYXN0cnVjdHJlZi5yZWYgPwotCQlyZXMtPnUuYXN0cnVjdHJlZi5yZWYtPnR5cGUtPnNpemUgOiAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBBIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3QgKi8KLQkgICAgICBsYXN0X3N0cnVjdCA9IHJlczsKLQkgICAgICByZXMtPnR5cGUgPSBjb2ZmX3N0cnVjdGRlZl90eXBlOwotCSAgICAgIHJlcy0+dS5hc3RydWN0ZGVmLmVsZW1lbnRzID0gZW1wdHlfc2NvcGUgKCk7Ci0JICAgICAgcmVzLT51LmFzdHJ1Y3RkZWYuaWR4ID0gMDsKLQkgICAgICByZXMtPnUuYXN0cnVjdGRlZi5pc3N0cnVjdCA9ICh0eXBlICYgMHhmKSA9PSBUX1NUUlVDVDsKLQkgICAgICByZXMtPnNpemUgPSBhdXgtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE5vIGF1eGVudHMgLSBpdCdzIGFub255bm1vdXMgKi8KLQkgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0cmVmX3R5cGU7Ci0JICByZXMtPnUuYXN0cnVjdHJlZi5yZWYgPSAwOwotCSAgcmVzLT5zaXplID0gMDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfRU5VTToKLSAgICAgIGlmIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApCi0JewotCSAgLyogUmVmZXJpbmcgdG8gYSBlbnVtIGRlZmluZWQgZWxzZXdoZXJlICovCi0JICByZXMtPnR5cGUgPSBjb2ZmX2VudW1yZWZfdHlwZTsKLQkgIHJlcy0+dS5hZW51bXJlZi5yZWYgPSB0aW5kZXhbSU5ERVhPRiAoYXV4LT54X3N5bS54X3RhZ25keC5wKV07Ci0JICByZXMtPnNpemUgPSByZXMtPnUuYWVudW1yZWYucmVmLT50eXBlLT5zaXplOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBIGRlZmluaXRpb24gb2YgYW4gZW51bSAqLwotCSAgbGFzdF9lbnVtID0gcmVzOwotCSAgcmVzLT50eXBlID0gY29mZl9lbnVtZGVmX3R5cGU7Ci0JICByZXMtPnUuYWVudW1kZWYuZWxlbWVudHMgPSBlbXB0eV9zY29wZSAoKTsKLQkgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX01PRToKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBmb3IgKHdoaWNoX2R0ID0gNTsgd2hpY2hfZHQgPj0gMDsgd2hpY2hfZHQtLSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCh0eXBlID4+ICgod2hpY2hfZHQgKiAyKSArIDQpKSAmIDB4MykKLQl7Ci0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JY2FzZSBEVF9BUlk6Ci0JICB7Ci0JICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnB0ciA9ICgoc3RydWN0IGNvZmZfdHlwZSAqKQotCQkJCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSkpOwotCSAgICBpbnQgZWxzID0gKGRpbWluZCA8IERJTU5VTQotCQkgICAgICAgPyBhdXgtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bZGltaW5kXQotCQkgICAgICAgOiAwKTsKLQkgICAgKytkaW1pbmQ7Ci0JICAgIHB0ci0+dHlwZSA9IGNvZmZfYXJyYXlfdHlwZTsKLQkgICAgcHRyLT5zaXplID0gZWxzICogcmVzLT5zaXplOwotCSAgICBwdHItPnUuYXJyYXkuZGltID0gZWxzOwotCSAgICBwdHItPnUuYXJyYXkuYXJyYXlfb2YgPSByZXM7Ci0JICAgIHJlcyA9IHB0cjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBEVF9QVFI6Ci0JICB7Ci0JICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnB0ciA9Ci0JICAgICAgKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7Ci0JICAgIHB0ci0+c2l6ZSA9IFBUUl9TSVpFOwotCSAgICBwdHItPnR5cGUgPSBjb2ZmX3BvaW50ZXJfdHlwZTsKLQkgICAgcHRyLT51LnBvaW50ZXIucG9pbnRzX3RvID0gcmVzOwotCSAgICByZXMgPSBwdHI7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgRFRfRkNOOgotCSAgewotCSAgICBzdHJ1Y3QgY29mZl90eXBlICpwdHIKLQkgICAgICA9IChzdHJ1Y3QgY29mZl90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfdHlwZSkpOwotCSAgICBwdHItPnNpemUgPSAwOwotCSAgICBwdHItPnR5cGUgPSBjb2ZmX2Z1bmN0aW9uX3R5cGU7Ci0JICAgIHB0ci0+dS5mdW5jdGlvbi5mdW5jdGlvbl9yZXR1cm5zID0gcmVzOwotCSAgICBwdHItPnUuZnVuY3Rpb24ucGFyYW1ldGVycyA9IGVtcHR5X3Njb3BlICgpOwotCSAgICBwdHItPnUuZnVuY3Rpb24ubGluZXMgPSBkb19saW5lcyAoaSwgc3ltLT5fbi5fbl9ucHRyWzFdKTsKLQkgICAgcHRyLT51LmZ1bmN0aW9uLmNvZGUgPSAwOwotCSAgICBsYXN0X2Z1bmN0aW9uX3R5cGUgPSBwdHI7Ci0JICAgIHJlcyA9IHB0cjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHN0cnVjdCBjb2ZmX3Zpc2libGUgKgotZG9fdmlzaWJsZSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OwotICBzdHJ1Y3QgY29mZl92aXNpYmxlICp2aXNpYmxlID0KLSAgICAoc3RydWN0IGNvZmZfdmlzaWJsZSAqKSAoeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl92aXNpYmxlKSkpOwotICBlbnVtIGNvZmZfdmlzX3R5cGUgdDsKLSAgc3dpdGNoIChzeW0tPm5fc2NsYXNzKQotICAgIHsKLSAgICBjYXNlIENfTU9TOgotICAgIGNhc2UgQ19NT1U6Ci0gICAgY2FzZSBDX0ZJRUxEOgotICAgICAgdCA9IGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfTU9FOgotICAgICAgdCA9IGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfUkVHUEFSTToKLSAgICAgIHQgPSBjb2ZmX3Zpc19yZWdwYXJhbTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1JFRzoKLSAgICAgIHQgPSBjb2ZmX3Zpc19yZWdpc3RlcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgIGNhc2UgQ19FTlRBRzoKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICB0ID0gY29mZl92aXNfdGFnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0FVVE9BUkc6Ci0gICAgY2FzZSBDX0FSRzoKLSAgICAgIHQgPSBjb2ZmX3Zpc19hdXRvcGFyYW07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfQVVUTzoKLQotCi0gICAgICB0ID0gY29mZl92aXNfYXV0bzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19MQUJFTDoKLSAgICBjYXNlIENfU1RBVDoKLSAgICAgIHQgPSBjb2ZmX3Zpc19pbnRfZGVmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0VYVDoKLSAgICAgIGlmIChzeW0tPm5fc2NudW0gPT0gTl9VTkRFRikKLQl7Ci0JICBpZiAoc3ltLT5uX3ZhbHVlKQotCSAgICB0ID0gY29mZl92aXNfY29tbW9uOwotCSAgZWxzZQotCSAgICB0ID0gY29mZl92aXNfZXh0X3JlZjsKLQl9Ci0gICAgICBlbHNlCi0JdCA9IGNvZmZfdmlzX2V4dF9kZWY7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLQotICAgIH0KLSAgdmlzaWJsZS0+dHlwZSA9IHQ7Ci0gIHJldHVybiB2aXNpYmxlOwotfQotCi1zdGF0aWMgaW50Ci1kb19kZWZpbmUgKGksIGIpCi0gICAgIGludCBpOwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqYjsKLXsKLSAgc3RhdGljIGludCBzeW1ib2xfaW5kZXg7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OwotCi0gIC8qIERlZmluZSBhIHN5bWJvbCBhbmQgYXR0YWNoIHRvIGJsb2NrIGIgKi8KLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzID0gZW1wdHlfc3ltYm9sICgpOwotCi0gIHMtPm51bWJlciA9ICsrc3ltYm9sX2luZGV4OwotICBzLT5uYW1lID0gc3ltLT5fbi5fbl9ucHRyWzFdOwotICBzLT5zZmlsZSA9IGN1cl9zZmlsZTsKLSAgLyogR2x1ZSBvbnRvIHRoZSBvZmlsZSBsaXN0ICovCi0gIGlmIChsb2ZpbGUgPj0gMCkKLSAgICB7Ci0gICAgICBpZiAob2ZpbGUtPnN5bWJvbF9saXN0X3RhaWwpCi0Jb2ZpbGUtPnN5bWJvbF9saXN0X3RhaWwtPm5leHRfaW5fb2ZpbGVfbGlzdCA9IHM7Ci0gICAgICBlbHNlCi0Jb2ZpbGUtPnN5bWJvbF9saXN0X2hlYWQgPSBzOwotICAgICAgb2ZpbGUtPnN5bWJvbF9saXN0X3RhaWwgPSBzOwotICAgICAgLyogQW5kIHRoZSBibG9jayBsaXN0ICovCi0gICAgfQotICBpZiAoYi0+dmFyc190YWlsKQotICAgIGItPnZhcnNfdGFpbC0+bmV4dCA9IHM7Ci0gIGVsc2UKLSAgICBiLT52YXJzX2hlYWQgPSBzOwotCi0gIGItPnZhcnNfdGFpbCA9IHM7Ci0gIGItPm52YXJzKys7Ci0gIHMtPnR5cGUgPSBkb190eXBlIChpKTsKLSAgcy0+d2hlcmUgPSBkb193aGVyZSAoaSk7Ci0gIHMtPnZpc2libGUgPSBkb192aXNpYmxlIChpKTsKLQotICB0aW5kZXhbaV0gPSBzOwotCi0gIC8qIFdlIHJlbWVtYmVyIHRoZSBsb3dlc3QgYWRkcmVzcyBpbiBlYWNoIHNlY3Rpb24gZm9yIGVhY2ggc291cmNlIGZpbGUgKi8KLQotICBpZiAocy0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfbWVtb3J5Ci0gICAgICAmJiBzLT50eXBlLT50eXBlID09IGNvZmZfc2VjZGVmX3R5cGUpCi0gICAgewotICAgICAgc3RydWN0IGNvZmZfaXNlY3Rpb24gKmlzID0gY3VyX3NmaWxlLT5zZWN0aW9uICsgcy0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQotICAgICAgaWYgKCFpcy0+aW5pdCkKLQl7Ci0JICBpcy0+bG93ID0gcy0+d2hlcmUtPm9mZnNldDsKLQkgIGlzLT5oaWdoID0gcy0+d2hlcmUtPm9mZnNldCArIHMtPnR5cGUtPnNpemU7Ci0JICBpcy0+aW5pdCA9IDE7Ci0JICBpcy0+cGFyZW50ID0gcy0+d2hlcmUtPnNlY3Rpb247Ci0JfQotCi0gICAgfQotCi0gIGlmIChzLT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLSAgICBsYXN0X2Z1bmN0aW9uX3N5bWJvbCA9IHM7Ci0KLSAgcmV0dXJuIGkgKyBzeW0tPm5fbnVtYXV4ICsgMTsKLX0KLQotCi1zdGF0aWMKLXN0cnVjdCBjb2ZmX29maWxlICoKLWRvaXQgKCkKLXsKLSAgaW50IGk7Ci0gIGludCBpbmZpbGUgPSAwOwotICBzdHJ1Y3QgY29mZl9vZmlsZSAqaGVhZCA9Ci0gIChzdHJ1Y3QgY29mZl9vZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX29maWxlKSk7Ci0gIG9maWxlID0gaGVhZDsKLSAgaGVhZC0+c291cmNlX2hlYWQgPSAwOwotICBoZWFkLT5zb3VyY2VfdGFpbCA9IDA7Ci0gIGhlYWQtPm5zb3VyY2VzID0gMDsKLSAgaGVhZC0+c3ltYm9sX2xpc3RfdGFpbCA9IDA7Ci0gIGhlYWQtPnN5bWJvbF9saXN0X2hlYWQgPSAwOwotICBkb19zZWN0aW9uc19wMSAoaGVhZCk7Ci0gIHB1c2hfc2NvcGUgKDEpOwotCi0gIGZvciAoaSA9IDA7IGkgPCByYXdjb3VudDspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0gICAgICBzd2l0Y2ggKHN5bS0+bl9zY2xhc3MpCi0JewotCWNhc2UgQ19GSUxFOgotCSAgewotCSAgICAvKiBuZXcgc291cmNlIGZpbGUgYW5ub3VuY2VkICovCi0JICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpuID0KLQkgICAgICAoc3RydWN0IGNvZmZfc2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZmlsZSkpOwotCSAgICBuLT5zZWN0aW9uID0gKHN0cnVjdCBjb2ZmX2lzZWN0aW9uICopIHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfaXNlY3Rpb24pLCBhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSk7Ci0JICAgIGN1cl9zZmlsZSA9IG47Ci0JICAgIG4tPm5hbWUgPSBzeW0tPl9uLl9uX25wdHJbMV07Ci0JICAgIG4tPm5leHQgPSAwOwotCi0JICAgIGlmIChpbmZpbGUpCi0JICAgICAgewotCQlwb3Bfc2NvcGUgKCk7Ci0JICAgICAgfQotCSAgICBpbmZpbGUgPSAxOwotCSAgICBwdXNoX3Njb3BlICgxKTsKLQkgICAgZmlsZV9zY29wZSA9IG4tPnNjb3BlID0gdG9wX3Njb3BlOwotCi0JICAgIGlmIChoZWFkLT5zb3VyY2VfdGFpbCkKLQkgICAgICBoZWFkLT5zb3VyY2VfdGFpbC0+bmV4dCA9IG47Ci0JICAgIGVsc2UKLQkgICAgICBoZWFkLT5zb3VyY2VfaGVhZCA9IG47Ci0JICAgIGhlYWQtPnNvdXJjZV90YWlsID0gbjsKLQkgICAgaGVhZC0+bnNvdXJjZXMrKzsKLQkgICAgaSArPSBzeW0tPm5fbnVtYXV4ICsgMTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ19GQ046Ci0JICB7Ci0JICAgIGNoYXIgKm5hbWUgPSBzeW0tPl9uLl9uX25wdHJbMV07Ci0JICAgIGlmIChuYW1lWzFdID09ICdiJykKLQkgICAgICB7Ci0JCS8qIEZ1bmN0aW9uIHN0YXJ0ICovCi0JCXB1c2hfc2NvcGUgKDApOwotCQlsYXN0X2Z1bmN0aW9uX3R5cGUtPnUuZnVuY3Rpb24uY29kZSA9IHRvcF9zY29wZTsKLQkJdG9wX3Njb3BlLT5zZWMgPSBvZmlsZS0+c2VjdGlvbnMgKyBzeW0tPm5fc2NudW07Ci0JCXRvcF9zY29wZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJdG9wX3Njb3BlLT5zaXplID0gc3ltLT5uX3ZhbHVlIC0gdG9wX3Njb3BlLT5vZmZzZXQgKyAxOwotCQlwb3Bfc2NvcGUgKCk7Ci0KLQkgICAgICB9Ci0JICAgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ19CTE9DSzoKLQkgIHsKLQkgICAgY2hhciAqbmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKLQkgICAgaWYgKG5hbWVbMV0gPT0gJ2InKQotCSAgICAgIHsKLQkJLyogQmxvY2sgc3RhcnQgKi8KLQkJcHVzaF9zY29wZSAoMSk7Ci0JCXRvcF9zY29wZS0+c2VjID0gb2ZpbGUtPnNlY3Rpb25zICsgc3ltLT5uX3NjbnVtOwotCQl0b3Bfc2NvcGUtPm9mZnNldCA9IHN5bS0+bl92YWx1ZTsKLQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJdG9wX3Njb3BlLT5zaXplID0gc3ltLT5uX3ZhbHVlIC0gdG9wX3Njb3BlLT5vZmZzZXQgKyAxOwotCQlwb3Bfc2NvcGUgKCk7Ci0JICAgICAgfQotCSAgICBpICs9IHN5bS0+bl9udW1hdXggKyAxOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDX1JFR1BBUk06Ci0JY2FzZSBDX0FSRzoKLQkgIGkgPSBkb19kZWZpbmUgKGksIGxhc3RfZnVuY3Rpb25fc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDX01PUzoKLQljYXNlIENfTU9VOgotCWNhc2UgQ19GSUVMRDoKLQkgIGkgPSBkb19kZWZpbmUgKGksIGxhc3Rfc3RydWN0LT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDX01PRToKLQkgIGkgPSBkb19kZWZpbmUgKGksIGxhc3RfZW51bS0+dS5hZW51bWRlZi5lbGVtZW50cyk7Ci0JICBicmVhazsKLQljYXNlIENfU1RSVEFHOgotCWNhc2UgQ19FTlRBRzoKLQljYXNlIENfVU5UQUc6Ci0JICAvKiBWYXJpb3VzIGRlZmluaXRpb24gKi8KLQkgIGkgPSBkb19kZWZpbmUgKGksIHRvcF9zY29wZSk7Ci0JICBicmVhazsKLQljYXNlIENfRVhUOgotCWNhc2UgQ19MQUJFTDoKLQkgIGkgPSBkb19kZWZpbmUgKGksIGZpbGVfc2NvcGUpOwotCSAgYnJlYWs7Ci0JY2FzZSBDX1NUQVQ6Ci0JY2FzZSBDX1RQREVGOgotCWNhc2UgQ19BVVRPOgotCWNhc2UgQ19SRUc6Ci0JICBpID0gZG9fZGVmaW5lIChpLCB0b3Bfc2NvcGUpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgQ19FT1M6Ci0JICBpICs9IHN5bS0+bl9udW1hdXggKyAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZG9fc2VjdGlvbnNfcDIgKGhlYWQpOwotICByZXR1cm4gaGVhZDsKLX0KLQotc3RydWN0IGNvZmZfb2ZpbGUgKgotY29mZl9ncm9rIChpbmFiZmQpCi0gICAgIGJmZCAqaW5hYmZkOwotewotICBsb25nIHN0b3JhZ2U7Ci0gIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICBhYmZkID0gaW5hYmZkOwotICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotCi0gIGlmIChzdG9yYWdlIDwgMCkKLSAgICBiZmRfZmF0YWwgKGFiZmQtPmZpbGVuYW1lKTsKLQotICBzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2UpOwotICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1zKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGFiZmQtPmZpbGVuYW1lKTsKLSAgcmF3c3ltcyA9IG9ial9yYXdfc3ltZW50cyAoYWJmZCk7Ci0gIHJhd2NvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOzsKLSAgdGluZGV4ID0gKHN0cnVjdCBjb2ZmX3N5bWJvbCAqKikgKHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfc3ltYm9sICopLCByYXdjb3VudCkpOwotCi0gIHAgPSBkb2l0ICgpOwotICByZXR1cm4gcDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvZmZncm9rLmggYi9iaW51dGlscy9jb2ZmZ3Jvay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFkZTQyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvZmZncm9rLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotI2RlZmluZSBUX05VTEwJCTAKLSNkZWZpbmUgVF9WT0lECQkxCS8qIGZ1bmN0aW9uIGFyZ3VtZW50IChvbmx5IHVzZWQgYnkgY29tcGlsZXIpICovCi0jZGVmaW5lIFRfQ0hBUgkJMgkvKiBjaGFyYWN0ZXIJCSovCi0jZGVmaW5lIFRfU0hPUlQJCTMJLyogc2hvcnQgaW50ZWdlcgkqLwotI2RlZmluZSBUX0lOVAkJNAkvKiBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0xPTkcJCTUJLyogbG9uZyBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0ZMT0FUCQk2CS8qIGZsb2F0aW5nIHBvaW50CSovCi0jZGVmaW5lIFRfRE9VQkxFCTcJLyogZG91YmxlIHdvcmQJCSovCi0jZGVmaW5lIFRfU1RSVUNUCTgJLyogc3RydWN0dXJlIAkJKi8KLSNkZWZpbmUgVF9VTklPTgkJOQkvKiB1bmlvbiAJCSovCi0jZGVmaW5lIFRfRU5VTQkJMTAJLyogZW51bWVyYXRpb24gCQkqLwotI2RlZmluZSBUX01PRQkJMTEJLyogbWVtYmVyIG9mIGVudW1lcmF0aW9uKi8KLSNkZWZpbmUgVF9VQ0hBUgkJMTIJLyogdW5zaWduZWQgY2hhcmFjdGVyCSovCi0jZGVmaW5lIFRfVVNIT1JUCTEzCS8qIHVuc2lnbmVkIHNob3J0CSovCi0jZGVmaW5lIFRfVUlOVAkJMTQJLyogdW5zaWduZWQgaW50ZWdlcgkqLwotI2RlZmluZSBUX1VMT05HCQkxNQkvKiB1bnNpZ25lZCBsb25nCSovCi0jZGVmaW5lIFRfTE5HREJMCTE2CS8qIGxvbmcgZG91YmxlCQkqLwotCi0KLSBzdHJ1Y3QgY29mZl9yZWxvYwotIHsKLSAgIGludCBvZmZzZXQ7Ci0gICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgIGludCBhZGRlbmQ7Ci0gfTsKLQotIHN0cnVjdCBjb2ZmX3NlY3Rpb24gCi0gewotICAgY2hhciAqbmFtZTsKLSAgIGludCBjb2RlOwotICAgaW50IGRhdGE7Ci0gICBpbnQgYWRkcmVzczsKLSAgIGludCBudW1iZXI7ICAvKiAwLi5uLCAudGV4dCA9IDAgKi8KLSAgIGludCBucmVsb2NzOwotICAgaW50IHNpemU7Ci0gICBzdHJ1Y3QgY29mZl9yZWxvYyAqcmVsb2NzOwotICAgc3RydWN0IHNlYyAqYmZkX3NlY3Rpb247Ci0gfTsKLQotc3RydWN0IGNvZmZfb2ZpbGUKLXsKLSAgaW50IG5zb3VyY2VzOwotICBzdHJ1Y3QgY29mZl9zZmlsZSAqc291cmNlX2hlYWQ7Ci0gIHN0cnVjdCBjb2ZmX3NmaWxlICpzb3VyY2VfdGFpbDsKLSAgaW50IG5zZWN0aW9uczsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbnM7Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sX2xpc3RfaGVhZDsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2xfbGlzdF90YWlsOwotfTsKLQotc3RydWN0IGNvZmZfaXNlY3Rpb24gewotICBpbnQgbG93OwotICBpbnQgaGlnaDsKLSAgaW50IGluaXQ7Ci0gIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnBhcmVudDsKLX07Ci0KLXN0cnVjdCBjb2ZmX3NmaWxlCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBjb2ZmX3Njb3BlICpzY29wZTsKLSAgc3RydWN0IGNvZmZfc2ZpbGUgKm5leHQ7Ci0KLSAgLyogVmVjdG9yIHdoaWNoIG1hcHMgd2hlcmUgaW4gZWFjaCBvdXRwdXQgc2VjdGlvbgotICAgICB0aGUgaW5wdXQgZmlsZSBoYXMgaXQncyBkYXRhICovCi0gIHN0cnVjdCBjb2ZmX2lzZWN0aW9uICpzZWN0aW9uOyAKLQotfTsKLQotCi0gc3RydWN0IGNvZmZfdHlwZQotewotICBpbnQgc2l6ZTsKLSAgZW51bQotICAgIHsKLSAgICAgIGNvZmZfcG9pbnRlcl90eXBlLCBjb2ZmX2Z1bmN0aW9uX3R5cGUsIGNvZmZfYXJyYXlfdHlwZSwgY29mZl9zdHJ1Y3RkZWZfdHlwZSwgY29mZl9iYXNpY190eXBlLAotICAgICAgY29mZl9zdHJ1Y3RyZWZfdHlwZSwgY29mZl9lbnVtcmVmX3R5cGUsIGNvZmZfZW51bWRlZl90eXBlLCBjb2ZmX3NlY2RlZl90eXBlCi0gICAgICB9IHR5cGU7Ci0gIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0IAotCXsKLQlpbnQgYWRkcmVzczsKLQlpbnQgc2l6ZTsKLSAgICAgIH0gYXNlY2RlZjsKLQotICAgICAgc3RydWN0Ci0JewotCSAgaW50IGlzc3RydWN0OwotCSAgc3RydWN0IGNvZmZfc2NvcGUgKmVsZW1lbnRzOwotCSAgaW50IGlkeDsKLQl9Ci0gICAgICBhc3RydWN0ZGVmOwotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGNvZmZfc3ltYm9sICpyZWY7Ci0JfSBhc3RydWN0cmVmOwotCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl9zY29wZSAqZWxlbWVudHM7Ci0JICBpbnQgaWR4OwotCX0gYWVudW1kZWY7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnJlZjsKLQl9IGFlbnVtcmVmOwotCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl90eXBlICpwb2ludHNfdG87Ci0JfSBwb2ludGVyOwotICAgICAgc3RydWN0Ci0JewotCSAgaW50IGRpbTsKLQkgIHN0cnVjdCBjb2ZmX3R5cGUgKmFycmF5X29mOwotCX0gYXJyYXk7Ci0KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3R5cGUgKmZ1bmN0aW9uX3JldHVybnM7Ci0JICBzdHJ1Y3QgY29mZl9zY29wZSAqcGFyYW1ldGVyczsKLQkgIHN0cnVjdCBjb2ZmX3Njb3BlICpjb2RlOwotCSAgc3RydWN0IGNvZmZfbGluZSAqbGluZXM7Ci0JfSBmdW5jdGlvbjsKLSAgICAgIGludCBiYXNpYzsJCS8qIE9uZSBvZiBUX1ZPSUQuLiBUX1VJTlQgKi8KLSAgICB9ICB1OwotfTsKLQotCi0gc3RydWN0IGNvZmZfbGluZSAKLSB7Ci0gICBpbnQgbmxpbmVzOwotICAgaW50ICpsaW5lczsKLSAgIGludCAqYWRkcmVzc2VzOwotIH07Ci0KLQotIHN0cnVjdCBjb2ZmX3Njb3BlCi0gICB7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlYzsgLyogV2hhdCBzZWN0aW9uICovCi0gICAgIGludCBvZmZzZXQ7IC8qIHdoZXJlICovCi0gICAgIGludCBzaXplOyAvKiBIb3cgYmlnICovCi0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpwYXJlbnQ7CS8qIG9uZSB1cCAqLwotCi0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpuZXh0OwkvKm5leHQgYWxvbmcgKi8KLQotICAgICBpbnQgbnZhcnM7Ci0KLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICp2YXJzX2hlYWQ7CS8qIHN5bWJvbHMgKi8KLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICp2YXJzX3RhaWw7Ci0KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKmxpc3RfaGVhZDsJLyogY2hpbGRyZW4gKi8KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKmxpc3RfdGFpbDsKLQotICAgfTsKLQotCi0gc3RydWN0IGNvZmZfdmlzaWJsZQotICAgewotICAgICBlbnVtIGNvZmZfdmlzX3R5cGUKLSAgICAgICB7Ci0JIGNvZmZfdmlzX2V4dF9kZWYsCi0JIGNvZmZfdmlzX2V4dF9yZWYsCi0JIGNvZmZfdmlzX2ludF9kZWYsCi0JIGNvZmZfdmlzX2NvbW1vbiwKLQkgY29mZl92aXNfYXV0bywKLQkgY29mZl92aXNfcmVnaXN0ZXIsCi0JIGNvZmZfdmlzX3RhZywKLQkgY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdCwKLQkgY29mZl92aXNfbWVtYmVyX29mX2VudW0sCi0JIGNvZmZfdmlzX2F1dG9wYXJhbSwJCi0JIGNvZmZfdmlzX3JlZ3BhcmFtLAotICAgICAgIH0gdHlwZTsKLSAgIH07Ci0KLSBzdHJ1Y3QgY29mZl93aGVyZQotICAgewotICAgICBlbnVtCi0gICAgICAgewotCSBjb2ZmX3doZXJlX3N0YWNrLCBjb2ZmX3doZXJlX21lbW9yeSwgY29mZl93aGVyZV9yZWdpc3RlciwgY29mZl93aGVyZV91bmtub3duLAotCSBjb2ZmX3doZXJlX3N0cnRhZywgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0LAotCSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtLCBjb2ZmX3doZXJlX2VudGFnLCBjb2ZmX3doZXJlX3R5cGVkZWYKLQotICAgICAgIH0gd2hlcmU7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBiaXRvZmZzZXQ7Ci0gICAgIGludCBiaXRzaXplOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgfTsKLQotIHN0cnVjdCBjb2ZmX3N5bWJvbAotICAgewotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgdGFnOwotICAgICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOwotICAgICBzdHJ1Y3QgY29mZl93aGVyZSAqd2hlcmU7Ci0gICAgIHN0cnVjdCBjb2ZmX3Zpc2libGUgKnZpc2libGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqbmV4dDsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpuZXh0X2luX29maWxlX2xpc3Q7IC8qIEZvciB0aGUgb2ZpbGUgbGlzdCAqLwotICAgICBpbnQgbnVtYmVyOwotICAgICBpbnQgZXJfbnVtYmVyOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gIH07Ci0KLXN0cnVjdCBjb2ZmX29maWxlICpjb2ZmX2dyb2soKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZy5pbiBiL2JpbnV0aWxzL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNmM1Yy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1dBSVRfSAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0JSSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1dGltZXMgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVVRJTUVTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0ZDTlRMX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19GSUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRG9lcyB0aGUgcGxhdGZvcm0gdXNlIGFuIGV4ZWN1dGFibGUgc3VmZml4PyAqLwotI3VuZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLQotLyogU3VmZml4IHVzZWQgZm9yIGV4ZWN1dGFibGVzLCBpZiBhbnkuICovCi0jdW5kZWYgRVhFQ1VUQUJMRV9TVUZGSVgKLQotLyogSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHRpbWUuaD4/ICovCi0jdW5kZWYgSEFWRV9USU1FX1RfSU5fVElNRV9ICi0KLS8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4/ICovCi0jdW5kZWYgSEFWRV9USU1FX1RfSU5fVFlQRVNfSAotCi0vKiBEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/ICovCi0jdW5kZWYgSEFWRV9HT09EX1VUSU1FX0gKLQotLyogRGVmaW5lIGlmIGZwcmludGYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIHNicmsgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0KLS8qIERlZmluZSBpZiBnZXRlbnYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLQotLyogRGVmaW5lIGlmIGVudmlyb24gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCi0KLS8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCi0jdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgotCi0vKiBDb25maWd1cmVkIHRhcmdldCBuYW1lLiAqLwotI3VuZGVmIFRBUkdFVAotCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUgYi9iaW51dGlscy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1ZjY2MTIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNTMzMSArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9YXIuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDU6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjI2OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDQ6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczMjogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODk6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWJpbnV0aWxzCi0KLVZFUlNJT049Mi45LjUKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MzU6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODQ4OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2MTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4ODc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5NzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDg0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTE2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxMTI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTU4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE2MzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE3MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTkxOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgotICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIzNDogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1ODogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjYxOiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1ItOn0iCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjk2OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzEyOiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1ItOn0iCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm0gfHwgdGVzdCAtZiAkYWNfZGlyL25tJGFjX2V4ZWV4dCA7IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpCi1maQotCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1lY2hvICIkYWNfdCIiJE5NIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDg6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWNhc2UgIiR0YXJnZXQiIGluCi1OT05FKSBsdF90YXJnZXQ9IiRob3N0IiA7OwotKikgbHRfdGFyZ2V0PSIkdGFyZ2V0IiA7OwotZXNhYwotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgOgotZmkKLQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiA9IHhubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLXRlc3QgeCIkc2lsZW50IiA9IHh5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkbHRfdGFyZ2V0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxMzk3ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MTk6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDI0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDMxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotCi1lc2FjCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIExERkxBR1M9IiRMREZMQUdTIiBMSUJTPSIkTElCUyIgXAotTE5fUz0iJExOX1MiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIE9CSkRVTVA9IiRPQkpEVU1QIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGx0X3RhcmdldCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLQotCi0KLQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotaWYgdGVzdCAteiAiJGhvc3QiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1Njc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1OTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjQ4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjgwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxNjkxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzIyOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcyNzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTczNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzU1OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0KLWZvciBhY19wcm9nIGluICdiaXNvbiAteScgYnlhY2MKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzkyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBhY19jdl9wcm9nX1lBQ0M9IiRZQUNDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ZQUNDPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotWUFDQz0iJGFjX2N2X3Byb2dfWUFDQyIKLWlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFlBQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkWUFDQyIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRZQUNDIiB8fCBZQUNDPSJ5YWNjIgotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgyMzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODM4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODQ0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODYxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODc4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1mb3IgYWNfcHJvZyBpbiBmbGV4IGxleAotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRMRVgiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkTEVYIiB8fCBMRVg9IiIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IiIKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSJmbGV4IgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19MRVgiICYmIGFjX2N2X3Byb2dfTEVYPSJsZXgiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkTEVYTElCIgotdGhlbgotICBjYXNlICIkTEVYIiBpbgotICBmbGV4KikgYWNfbGliPWZsIDs7Ci0gICopIGFjX2xpYj1sIDs7Ci0gIGVzYWMKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NzU6IGNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWwkYWNfbGliICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciB5eXdyYXAoKTsKLQotaW50IG1haW4oKSB7Ci15eXdyYXAoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5OTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExFWExJQj0iLWwkYWNfbGliIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDE3OiBjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfcm9vdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlIG1pbmltYWwgbGV4IHByb2dyYW0gaXMganVzdCBhIHNpbmdsZSBsaW5lOiAlJS4gIEJ1dCBzb21lIGJyb2tlbiBsZXhlcwotIyAoU29sYXJpcywgSSB0aGluayBpdCB3YXMpIHdhbnQgdHdvICUlIGxpbmVzLCBzbyBhY2NvbW1vZGF0ZSB0aGVtLgotZWNobyAnJSUKLSUlJyB8ICRMRVgKLWlmIHRlc3QgLWYgbGV4Lnl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXgueXkKLWVsaWYgdGVzdCAtZiBsZXh5eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4eXkKLWVsc2UKLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW5ub3QgZmluZCBvdXRwdXQgZnJvbSAkTEVYOyBnaXZpbmcgdXAiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfcm9vdCIgMT4mNgotTEVYX09VVFBVVF9ST09UPSRhY19jdl9wcm9nX2xleF9yb290Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAzODogY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgUE9TSVggc2F5cyBsZXggY2FuIGRlY2xhcmUgeXl0ZXh0IGVpdGhlciBhcyBhIHBvaW50ZXIgb3IgYW4gYXJyYXk7IHRoZQotIyBkZWZhdWx0IGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gRmlndXJlIG91dCB3aGljaCBpdCBpcywgc2luY2UKLSMgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgcHJvdmlkZSB0aGUgJXBvaW50ZXIgYW5kICVhcnJheSBkZWNsYXJhdGlvbnMuCi1hY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj1ubwotZWNobyAnZXh0ZXJuIGNoYXIgKnl5dGV4dDsnID4+JExFWF9PVVRQVVRfUk9PVC5jCi1hY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iJExJQlMgJExFWExJQiIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotYGNhdCAkTEVYX09VVFBVVF9ST09ULmNgCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi1ybSAtZiAiJHtMRVhfT1VUUFVUX1JPT1R9LmMiCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBZWVRFWFRfUE9JTlRFUiAxCi1FT0YKLQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDgxOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTAyOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTA3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE1MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTcxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIwNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI4MTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjg4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI5NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMjE6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM1NDogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzU5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzg5OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQyMjogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDg3OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ5MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MTc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTcyOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MjQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjM0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NjM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjcyNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg2NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4OTI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkzMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjkzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTg5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA1MTogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDU2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA2MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwODQ6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEwNDogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTIzOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMxMzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTUwOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE3ODogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjEzOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyMTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI1MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI4NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI5MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDE4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ1MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0ODQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjEwOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjM4OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjQzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM2NDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzcxMTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MzQ6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3MzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3NTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3Njc6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzc3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3Nzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc5ODogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLWlmIHRlc3QgLW4gIiRFWEVFWFQiOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0VYRUNVVEFCTEVfU1VGRklYIDEKLUVPRgotCi1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgRVhFQ1VUQUJMRV9TVUZGSVggIiR7RVhFRVhUfSIKLUVPRgotCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotSERFRklORVM9Ci0KLS4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLUFSPSR7QVItYXJ9Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg1MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg5MDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi0jIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotCi0jIEFsc28gc2V0IEVYRUVYVF9GT1JfQlVJTEQuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBFWEVFWFRfRk9SX0JVSUxEPSckKEVYRUVYVCknCi1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NTc6IGNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9idWlsZF9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgICAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC5jCi0gICAgIGJmZF9jdl9idWlsZF9leGVleHQ9Ci0gICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBjb25mdGVzdCBjb25mdGVzdC5jIDE+JjUgMj4mNQotICAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAgKikgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICAgZXNhYwotICAgICBkb25lCi0gICAgIHJtIC1mIGNvbmZ0ZXN0KgotICAgICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgPSB4ICYmIGJmZF9jdl9idWlsZF9leGVleHQ9bm8KLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2J1aWxkX2V4ZWV4dCIgMT4mNgotICBFWEVFWFRfRk9SX0JVSUxEPSIiCi0gIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUX0ZPUl9CVUlMRD0ke2JmZF9jdl9idWlsZF9leGVleHR9Ci1maQotCi0KLURFTUFOR0xFUl9OQU1FPWMrK2ZpbHQKLWNhc2UgIiR7aG9zdH0iIGluCi0gICotKi1nbzMyKiB8ICotKi1tc2RvcyopCi0gICAgREVNQU5HTEVSX05BTUU9Y3h4ZmlsdAotZXNhYwotCi0KLWZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oIGZjbnRsLmggc3lzL2ZpbGUuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5OTI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMjk6IGNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHN0YXRfdmFsKSAoKHVuc2lnbmVkKShzdGF0X3ZhbCkgPj4gOCkKLSNlbmRpZgotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHN0YXRfdmFsKSAoKChzdGF0X3ZhbCkgJiAyNTUpID09IDApCi0jZW5kaWYKLWludCBtYWluKCkgewotaW50IHM7Ci13YWl0ICgmcyk7Ci1zID0gV0lGRVhJVEVEIChzKSA/IFdFWElUU1RBVFVTIChzKSA6IDE7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA1MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA3MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwNzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMDY6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDExMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTM5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE3MTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxNzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjAxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyMjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI1NjogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI4MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19mdW5jIGluIHNicmsgdXRpbWVzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzA3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBTb21lIHN5c3RlbXMgaGF2ZSBmcmV4cCBvbmx5IGluIC1sbSwgbm90IGluIC1sYy4KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBmcmV4cCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM2MzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBmcmV4cCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc2VhcmNoX2ZyZXhwJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSIkTElCUyIKLWFjX2N2X3NlYXJjaF9mcmV4cD0ibm8iCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZnJleHAoKTsKLQotaW50IG1haW4oKSB7Ci1mcmV4cCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM4MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfc2VhcmNoX2ZyZXhwPSJub25lIHJlcXVpcmVkIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLXRlc3QgIiRhY19jdl9zZWFyY2hfZnJleHAiID0gIm5vIiAmJiBmb3IgaSBpbiBtOyBkbwotTElCUz0iLWwkaSAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzOTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBmcmV4cCgpOwotCi1pbnQgbWFpbigpIHsKLWZyZXhwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9zZWFyY2hfZnJleHA9Ii1sJGkiCi1icmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLUxJQlM9IiRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3NlYXJjaF9mcmV4cCIgMT4mNgotaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9mcmV4cCIgIT0gIm5vIjsgdGhlbgotICB0ZXN0ICIkYWNfY3Zfc2VhcmNoX2ZyZXhwIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfY3Zfc2VhcmNoX2ZyZXhwICRMSUJTIgotICAKLWVsc2UgOgotICAKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0aW1lX3QgaW4gdGltZS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDI1OiBjaGVja2luZyBmb3IgdGltZV90IGluIHRpbWUuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotaW50IG1haW4oKSB7Ci10aW1lX3QgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDM3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBidV9jdl9kZWNsX3RpbWVfdF90aW1lX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQ1ODogY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0NjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotaW50IG1haW4oKSB7Ci10aW1lX3QgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDcwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9UWVBFU19IIDEKLUVPRgotCi1maQotCi0jIFVuZGVyIE5leHQgMy4yIDx1dGltZS5oPiBhcHBhcmVudGx5IGRvZXMgbm90IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1ZgotIyBieSBkZWZhdWx0LgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHV0aW1lLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0OTM6IGNoZWNraW5nIGZvciB1dGltZS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydidV9jdl9oZWFkZXJfdXRpbWVfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0OTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dXRpbWUuaD4KLWludCBtYWluKCkgewotc3RydWN0IHV0aW1idWYgczsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTA5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfaGVhZGVyX3V0aW1lX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJ1X2N2X2hlYWRlcl91dGltZV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJ1X2N2X2hlYWRlcl91dGltZV9oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9oZWFkZXJfdXRpbWVfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HT09EX1VUSU1FX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnByaW50ZiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTMwOiBjaGVja2luZyB3aGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZwcmludGYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTU2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGY9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnByaW50ZiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTc3OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjAzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MjQ6IGNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2MjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc2JyawotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NCUksgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2NzE6IGNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0Njc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGdldGVudgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2OTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fR0VURU5WIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDcxODogY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDcyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBlbnZpcm9uCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc0NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTiAxCi1FT0YKLQotZmkKLQotCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cyopCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyI7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IjsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotQlVJTERfTkxNQ09OVj0KLU5MTUNPTlZfREVGUz0KLUJVSUxEX1NSQ09OVj0KLUJVSUxEX0RMTFRPT0w9Ci1ETExUT09MX0RFRlM9Ci1CVUlMRF9XSU5EUkVTPQotQlVJTERfRExMV1JBUD0KLUJVSUxEX01JU0M9Ci0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0JQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCUJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknCi0JTkxNQ09OVl9ERUZTPSItRE5MTUNPTlZfSTM4NiAtRE5MTUNPTlZfQUxQSEEgLUROTE1DT05WX1BPV0VSUEMgLUROTE1DT05WX1NQQVJDIgotICAgIGVsc2UKLQljYXNlICR0YXJnIGluCi0JaVszNDU2XTg2Ki0qLW5ldHdhcmUqKSAKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfSTM4NiIKLQkgIDs7Ci0JYWxwaGEqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX0FMUEhBIgotCSAgOzsKLQlwb3dlcnBjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9QT1dFUlBDIgotCSAgOzsKLQlzcGFyYyotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfU1BBUkMiCi0JICA7OwotCWVzYWMKLQljYXNlICR0YXJnIGluCi0JKi0qLWhtcyopIEJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQlhcm0tKnBlKiB8IGFybS0qLXdpbmNlKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JdGh1bWItKnBlKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCWlbMy02XTg2LSpwZSogfCBpWzMtNl04Ni0qLWN5Z3dpbiogfCBpWzMtNl04Ni0qLW1pbmd3MzIqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0kzODYiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICBCVUlMRF9ETExXUkFQPSckKERMTFdSQVBfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCWkzLTY4Ni0qLWludGVyaXgpCi0JICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRyknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0kzODYiCi0JICA7OwotCXBvd2VycGMqLSotKnBlKiB8IHBvd2VycGMqLSotY3lnd2luKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9QUEMiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCXNoKi0qLSpwZSkKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9TSCIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JbWlwcyotKi0qcGUpCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfTUlQUyIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JbWNvcmUtKnBlKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX01DT1JFIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgOzsKLQltY29yZS0qZWxmKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX01DT1JFX0VMRiIKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi1kb25lCi0KLQotCi0KLQotCi0KLQotCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVCAiJHt0YXJnZXR9IgotRU9GCi0KLQotdGFyZz0kdGFyZ2V0Ci0uICRzcmNkaXIvLi4vYmZkL2NvbmZpZy5iZmQKLWlmIHRlc3QgIngkdGFyZ191bmRlcnNjb3JlIiA9ICJ4eWVzIjsgdGhlbgotICAgIFVOREVSU0NPUkU9MQotZWxzZQotICAgIFVOREVSU0NPUkU9MAotZmkKLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDQ0AlJENDJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQFlBQ0NAJSRZQUNDJWcKLXMlQExFWEAlJExFWCVnCi1zJUBMRVhMSUJAJSRMRVhMSUIlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQExFWF9PVVRQVVRfUk9PVEAlJExFWF9PVVRQVVRfUk9PVCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEFSQCUkQVIlZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEVYRUVYVF9GT1JfQlVJTERAJSRFWEVFWFRfRk9SX0JVSUxEJWcKLXMlQERFTUFOR0xFUl9OQU1FQCUkREVNQU5HTEVSX05BTUUlZwotcyVATkxNQ09OVl9ERUZTQCUkTkxNQ09OVl9ERUZTJWcKLXMlQEJVSUxEX05MTUNPTlZAJSRCVUlMRF9OTE1DT05WJWcKLXMlQEJVSUxEX1NSQ09OVkAlJEJVSUxEX1NSQ09OViVnCi1zJUBCVUlMRF9ETExUT09MQCUkQlVJTERfRExMVE9PTCVnCi1zJUBETExUT09MX0RFRlNAJSRETExUT09MX0RFRlMlZwotcyVAQlVJTERfV0lORFJFU0AlJEJVSUxEX1dJTkRSRVMlZwotcyVAQlVJTERfRExMV1JBUEAlJEJVSUxEX0RMTFdSQVAlZwotcyVAQlVJTERfTUlTQ0AlJEJVSUxEX01JU0MlZwotcyVAVU5ERVJTQ09SRUAlJFVOREVSU0NPUkUlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi0KLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotKikgc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlIDs7Ci1lc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuY29tIGIvYmludXRpbHMvY29uZmlndXJlLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0NjNkNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUuY29tCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotJCEKLSQhIFRoaXMgZmlsZSBjb25maWd1cmVzIGJpbnV0aWxzIGZvciB1c2Ugd2l0aCBvcGVuVk1TL0FscGhhCi0kISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCi0kISB0byBleGVjdXRlIGl0LgotJCEKLSQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLSQhCi0kYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpICAgICAgISB2YXg9PTEsIGFscGhhPT0yCi0kYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIQotJCEKLSQhIEdlbmVyYXRlIGNvbmZpZy5oCi0kIQotJCBjcmVhdGUgW11jb25maWcuaAotLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLwotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8dGltZS5oPj8gICovCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+PyAgKi8KLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVFlQRVNfSCAxCi0vKiBEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/ICAqLwotI2RlZmluZSBIQVZFX0dPT0RfVVRJTUVfSCAxCi0vKiBXaGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRpby5oPiBpcyBpbmNsdWRlZC4gICovCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlBSSU5URiAxCi0vKiBXaGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDx1bmlzdGQuaD4gaXMgaW5jbHVkZWQuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCi0vKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLS8qICN1bmRlZiBIQVZFX1NCUksgMSAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1dGltZXMgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1VUSU1FUyAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGNvbmZpZy5oJyIKLSQhCi0kIQotJCEgRWRpdCBWRVJTSU9OIGluIG1ha2VmaWxlLnZtcy1pbgotJCEKLSQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQotICAgICAgICBbXW1ha2VmaWxlLnZtcy1pbiAvb3V0cHV0PVtdbWFrZWZpbGUudm1zCi0kREVDSwotIQotISBHZXQgVkVSU0lPTiBmcm9tIGNvbmZpZ3VyZS5pbgotIQotICAgbWZpbGUgOj0gQ1JFQVRFX0JVRkZFUigibWZpbGUiLCAiQ09ORklHVVJFLklOIik7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YobWZpbGUpLCBFTkRfT0YobWZpbGUpKTsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiaW51dGlscywgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7Ci0gICBFTFNFOwotICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKLSAgIEVORElGOwotCi0gICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICBDT1BZX1RFWFQodmVycyk7Ci0gICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwotICAgUVVJVAotJCAgRU9ECi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNyZWF0ZWQgYG1ha2VmaWxlLnZtcyciCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuaW4gYi9iaW51dGlscy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTBjZTkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQoYXIuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BTV9JTklUX0FVVE9NQUtFKGJpbnV0aWxzLCAyLjkuNSkKLQotQU1fUFJPR19MSUJUT09MCi0KLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9uc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoY29tbW9uYmZkbGliLAotWyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi1pZiB0ZXN0IC16ICIkaG9zdCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCi1maQotCi1BQ19QUk9HX0NDCi0KLUFDX1BST0dfWUFDQwotQU1fUFJPR19MRVgKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KLSAgQUNfREVGSU5FKEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgsIDEsCi0JICAgIFtEb2VzIHRoZSBwbGF0Zm9ybSB1c2UgYW4gZXhlY3V0YWJsZSBzdWZmaXg/XSkKLWZpCi1BQ19ERUZJTkVfVU5RVU9URUQoRVhFQ1VUQUJMRV9TVUZGSVgsICIke0VYRUVYVH0iLAotCQkgICBbU3VmZml4IHVzZWQgZm9yIGV4ZWN1dGFibGVzLCBpZiBhbnkuXSkKLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi1IREVGSU5FUz0KLQotLiAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKEhERUZJTkVTKQotQVI9JHtBUi1hcn0KLUFDX1NVQlNUKEFSKQotQUNfUFJPR19SQU5MSUIKLUFDX1BST0dfSU5TVEFMTAotCi1CRkRfQ0NfRk9SX0JVSUxECi0KLURFTUFOR0xFUl9OQU1FPWMrK2ZpbHQKLWNhc2UgIiR7aG9zdH0iIGluCi0gICotKi1nbzMyKiB8ICotKi1tc2RvcyopCi0gICAgREVNQU5HTEVSX05BTUU9Y3h4ZmlsdAotZXNhYwotQUNfU1VCU1QoREVNQU5HTEVSX05BTUUpCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oIGZjbnRsLmggc3lzL2ZpbGUuaCkKLUFDX0hFQURFUl9TWVNfV0FJVAotQUNfRlVOQ19BTExPQ0EKLUFDX0NIRUNLX0ZVTkNTKHNicmsgdXRpbWVzKQotCi0jIFNvbWUgc3lzdGVtcyBoYXZlIGZyZXhwIG9ubHkgaW4gLWxtLCBub3QgaW4gLWxjLgotQUNfU0VBUkNIX0xJQlMoZnJleHAsIG0pCi0KLUFDX01TR19DSEVDS0lORyhmb3IgdGltZV90IGluIHRpbWUuaCkKLUFDX0NBQ0hFX1ZBTChidV9jdl9kZWNsX3RpbWVfdF90aW1lX2gsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx0aW1lLmg+XSwgW3RpbWVfdCBpO10sCi1idV9jdl9kZWNsX3RpbWVfdF90aW1lX2g9eWVzLCBidV9jdl9kZWNsX3RpbWVfdF90aW1lX2g9bm8pXSkKLUFDX01TR19SRVNVTFQoJGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaCkKLWlmIHRlc3QgJGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaCA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoW0hBVkVfVElNRV9UX0lOX1RJTUVfSF0sIDEsCi0JICAgIFtJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8dGltZS5oPj9dKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aW1lX3QgaW4gc3lzL3R5cGVzLmgpCi1BQ19DQUNIRV9WQUwoYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCwKLVtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPl0sIFt0aW1lX3QgaTtdLAotYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD15ZXMsIGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2g9bm8pXSkKLUFDX01TR19SRVNVTFQoJGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2gpCi1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShbSEFWRV9USU1FX1RfSU5fVFlQRVNfSF0sIDEsCi0JICAgIFtJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+P10pCi1maQotCi0jIFVuZGVyIE5leHQgMy4yIDx1dGltZS5oPiBhcHBhcmVudGx5IGRvZXMgbm90IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1ZgotIyBieSBkZWZhdWx0LgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgdXRpbWUuaF0pCi1BQ19DQUNIRV9WQUwoYnVfY3ZfaGVhZGVyX3V0aW1lX2gsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1RJTUVfSAotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHV0aW1lLmg+XSwKLVtzdHJ1Y3QgdXRpbWJ1ZiBzO10sCi1idV9jdl9oZWFkZXJfdXRpbWVfaD15ZXMsIGJ1X2N2X2hlYWRlcl91dGltZV9oPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRidV9jdl9oZWFkZXJfdXRpbWVfaCkKLWlmIHRlc3QgJGJ1X2N2X2hlYWRlcl91dGltZV9oID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShIQVZFX0dPT0RfVVRJTUVfSCwgMSwgW0RvZXMgPHV0aW1lLmg+IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1Zj9dKQotZmkKLQotQkZEX05FRURfREVDTEFSQVRJT04oZnByaW50ZikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHN0cnN0cikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHNicmspCi1CRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihlbnZpcm9uKQotCi1CRkRfQklOQVJZX0ZPUEVOCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyI7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IjsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotQlVJTERfTkxNQ09OVj0KLU5MTUNPTlZfREVGUz0KLUJVSUxEX1NSQ09OVj0KLUJVSUxEX0RMTFRPT0w9Ci1ETExUT09MX0RFRlM9Ci1CVUlMRF9XSU5EUkVTPQotQlVJTERfRExMV1JBUD0KLUJVSUxEX01JU0M9Ci0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0JQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCUJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknCi0JTkxNQ09OVl9ERUZTPSItRE5MTUNPTlZfSTM4NiAtRE5MTUNPTlZfQUxQSEEgLUROTE1DT05WX1BPV0VSUEMgLUROTE1DT05WX1NQQVJDIgotICAgIGVsc2UKLQljYXNlICR0YXJnIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotCWlbMzQ1Nl04NiotKi1uZXR3YXJlKikgCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX0kzODYiCi0JICA7OwotCWFscGhhKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9BTFBIQSIKLQkgIDs7Ci0JcG93ZXJwYyotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfUE9XRVJQQyIKLQkgIDs7Ci0Jc3BhcmMqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX1NQQVJDIgotCSAgOzsKLQllc2FjCi0JY2FzZSAkdGFyZyBpbgotCSotKi1obXMqKSBCVUlMRF9TUkNPTlY9JyQoU1JDT05WX1BST0cpJyA7OwotCWVzYWMKLQljYXNlICR0YXJnIGluCi0JYXJtLSpwZSogfCBhcm0tKi13aW5jZSkKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCXRodW1iLSpwZSopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfQVJNIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0JaVszLTZdODYtKnBlKiB8IGlbMy02XTg2LSotY3lnd2luKiB8IGlbMy02XTg2LSotbWluZ3czMiopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfSTM4NiIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIEJVSUxEX0RMTFdSQVA9JyQoRExMV1JBUF9QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JaVszLTZdODYtKi1pbnRlcml4KQotCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9JMzg2IgotCSAgOzsKLQlwb3dlcnBjKi0qLSpwZSogfCBwb3dlcnBjKi0qLWN5Z3dpbiopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfUFBDIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgOzsKLQlzaCotKi0qcGUpCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfU0giCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCW1pcHMqLSotKnBlKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX01JUFMiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCW1jb3JlLSpwZSkKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9NQ09SRSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JbWNvcmUtKmVsZikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9NQ09SRV9FTEYiCi0JICA7OwotCWVzYWMKLSAgICBmaQotZG9uZQotCi1BQ19TVUJTVChOTE1DT05WX0RFRlMpCi1BQ19TVUJTVChCVUlMRF9OTE1DT05WKQotQUNfU1VCU1QoQlVJTERfU1JDT05WKQotQUNfU1VCU1QoQlVJTERfRExMVE9PTCkKLUFDX1NVQlNUKERMTFRPT0xfREVGUykKLUFDX1NVQlNUKEJVSUxEX1dJTkRSRVMpCi1BQ19TVUJTVChCVUlMRF9ETExXUkFQKQotQUNfU1VCU1QoQlVJTERfTUlTQykKLQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVCwgIiR7dGFyZ2V0fSIsIFtDb25maWd1cmVkIHRhcmdldCBuYW1lLl0pCi0KLXRhcmc9JHRhcmdldAotLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi1pZiB0ZXN0ICJ4JHRhcmdfdW5kZXJzY29yZSIgPSAieHllcyI7IHRoZW4KLSAgICBVTkRFUlNDT1JFPTEKLWVsc2UKLSAgICBVTkRFUlNDT1JFPTAKLWZpCi1BQ19TVUJTVChVTkRFUlNDT1JFKQotCi1BQ19PVVRQVVQoTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVsKLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotKikgc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlIDs7Ci1lc2FjCi1dKQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY3h4ZmlsdC5tYW4gYi9iaW51dGlscy9jeHhmaWx0Lm1hbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNWQ0NS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jeHhmaWx0Lm1hbgorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggQFBST0dSQU1AIDEgIkp1bmUgMTk5MyIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLUBQUk9HUkFNQCBcLSBkZW1hbmdsZSBDKysgc3ltYm9scwotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgQFBST0dSQU1ACi0uUkIgIltcfCIgXC1fIHwgXC1cLXN0cmlwLXVuZGVyc2NvcmVzICJcfF0iCi0uUkIgIltcfCIgIlwtcyB7Z251LGx1Y2lkLGFybX0gIiB8ICIgXC1cLWZvcm1hdD17Z251LGx1Y2lkLGFybX0iICJcfF0iCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIHN5bWJvbCAiLi4uXHxdIgotLlNIIERFU0NSSVBUSU9OCi1UaGUgQysrIGxhbmd1YWdlIHByb3ZpZGVzIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCB3aGljaCBtZWFucyB0aGF0IHlvdSBjYW4KLXdyaXRlIG1hbnkgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAocHJvdmlkaW5nIGVhY2ggdGFrZXMgcGFyYW1ldGVycwotb2YgZGlmZmVyZW50IHR5cGVzKS4gIEFsbCBDKysgZnVuY3Rpb24gbmFtZXMgYXJlIGVuY29kZWQgaW50byBhCi1sb3ctbGV2ZWwgYXNzZW1ibHkgbGFiZWwgKHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcwotLkkgbWFuZ2xpbmdcYwotKS4gIFRoZSAKLS5CIEBQUk9HUkFNQAotcHJvZ3JhbSBkb2VzIHRoZSBpbnZlcnNlIG1hcHBpbmc6IGl0IGRlY29kZXMgKFxmSWRlbWFuZ2xlc1xmUikKLWxvdy1sZXZlbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBrZWVwCi10aGVzZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBmcm9tIGNsYXNoaW5nLgotLlBQCi1FdmVyeSBhbHBoYW51bWVyaWMgd29yZCAoY29uc2lzdGluZyBvZiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLAotZG9sbGFycywgb3IgcGVyaW9kcykgc2VlbiBpbiB0aGUgaW5wdXQgaXMgYSBwb3RlbnRpYWwgbGFiZWwuICBJZiB0aGUKLWxhYmVsIGRlY29kZXMgaW50byBhIEMrKyBuYW1lLCB0aGUgQysrIG5hbWUgcmVwbGFjZXMgdGhlIGxvdy1sZXZlbAotbmFtZSBpbiB0aGUgb3V0cHV0LgotLlBQCi1Zb3UgY2FuIHVzZQotLkIgQFBST0dSQU1ACi10byBkZWNpcGhlciBpbmRpdmlkdWFsIHN5bWJvbHMgYnkgc3BlY2lmeWluZyB0aGVzZSBzeW1ib2xzIG9uIHRoZQotY29tbWFuZCBsaW5lLgotLlBQCi1JZiBubwotLkIgc3ltYm9sCi1hcmd1bWVudHMgYXJlIGdpdmVuLAotLkIgQFBST0dSQU1ACi1yZWFkcyBzeW1ib2wgbmFtZXMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyB0aGUgZGVtYW5nbGVkCi1uYW1lcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgQWxsIHJlc3VsdHMgYXJlIHByaW50ZWQgb24gdGhlIHN0YW5kYXJkCi1vdXRwdXQuCi0uU0ggT1BUSU9OUwotLlRQCi0uQiBcLV8KLS5UUAotLkIgXC1cLXN0cmlwXC11bmRlcnNjb3JlcwotT24gc29tZSBzeXN0ZW1zLCBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHB1dCBhbgotdW5kZXJzY29yZSBpbiBmcm9udCBvZiBldmVyeSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBDIG5hbWUgCi0uQiBmb28KLWdldHMgdGhlIGxvdy1sZXZlbCBuYW1lIAotLkJSIF9mb28gLgotVGhpcyBvcHRpb24gcmVtb3ZlcyB0aGUgbGVhZGluZyB1bmRlcnNjb3JlLgotCi0uVFAKLS5CICJcLXMge2dudSxsdWNpZCxhcm19IgotLlRQCi0uQiBcLVwtZm9ybWF0PXtnbnUsbHVjaWQsYXJtfQotR05VCi0uQiBubQotY2FuIGRlY29kZSB0aHJlZSBkaWZmZXJlbnQgbWV0aG9kcyBvZiBtYW5nbGluZywgdXNlZCBieSBkaWZmZXJlbnQgQysrCi1jb21waWxlcnMuICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoaWNoIG1ldGhvZCBpdCB1c2VzOiB0aGUgb25lIHVzZWQgYnkKLXRoZSBHTlUgY29tcGlsZXIsIHRoZSBvbmUgdXNlZCBieSB0aGUgTHVjaWQgY29tcGlsZXIsIG9yIHRoZSBvbmUKLXNwZWNpZmllZCBieSB0aGUgQysrIEFubm90YXRlZCBSZWZlcmVuY2UgTWFudWFsLiAgVGhlIGRlZmF1bHQgaXMgdGhlCi1HTlUgc3R5bGUuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgQFBST0dSQU1ACi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLVwtdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiBAUFJPR1JBTUAKLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKEp1bmUgMTk5MykuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlYnVnLmMgYi9iaW51dGlscy9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmE5MDk0Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlYnVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTY3ICswLDAgQEAKLS8qIGRlYnVnLmMgLS0gSGFuZGxlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcgZm9ybWF0LiAgV2UgbWF5IGV2ZW50dWFsbHkKLSAgIGhhdmUgcmVhZGVycyB3aGljaCBjb252ZXJ0IGRpZmZlcmVudCBmb3JtYXRzIGludG8gdGhpcyBnZW5lcmljCi0gICBmb3JtYXQsIGFuZCB3cml0ZXJzIHdoaWNoIHdyaXRlIGl0IG91dC4gIFRoZSBpbml0aWFsIGltcGV0dXMgZm9yCi0gICB0aGlzIHdhcyB3cml0aW5nIGEgY29udmVydG9yIGZyb20gc3RhYnMgdG8gSFAgSUVFRS02OTUgZGVidWdnaW5nCi0gICBmb3JtYXQuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0KLS8qIEdsb2JhbCBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBkZWJ1Z2dpbmcuICBBIHBvaW50ZXIgdG8gdGhpcwotICAgc3RydWN0dXJlIGlzIHRoZSBkZWJ1Z2dpbmcgaGFuZGxlIHBhc3NlZCB0byBhbGwgdGhlIHJvdXRpbmVzLiAgKi8KLQotc3RydWN0IGRlYnVnX2hhbmRsZQotewotICAvKiBBIGxpbmtlZCBsaXN0IG9mIGNvbXBpbGF0aW9uIHVuaXRzLiAgKi8KLSAgc3RydWN0IGRlYnVnX3VuaXQgKnVuaXRzOwotICAvKiBUaGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3VuaXQgKmN1cnJlbnRfdW5pdDsKLSAgLyogVGhlIGN1cnJlbnQgc291cmNlIGZpbGUuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqY3VycmVudF9maWxlOwotICAvKiBUaGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqY3VycmVudF9mdW5jdGlvbjsKLSAgLyogVGhlIGN1cnJlbnQgYmxvY2suICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmN1cnJlbnRfYmxvY2s7Ci0gIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCB1bml0LiAgKi8KLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqY3VycmVudF9saW5lbm87Ci0gIC8qIE1hcmsuICBUaGlzIGlzIHVzZWQgYnkgZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgbWFyazsKLSAgLyogQSBzdHJ1Y3QvY2xhc3MgSUQgdXNlZCBieSBkZWJ1Z193cml0ZS4gICovCi0gIHVuc2lnbmVkIGludCBjbGFzc19pZDsKLSAgLyogVGhlIGJhc2UgZm9yIGNsYXNzX2lkIGZvciB0aGlzIGNhbGwgdG8gZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgYmFzZV9pZDsKLSAgLyogVGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaW4gZGVidWdfd3JpdGUuICAqLwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpjdXJyZW50X3dyaXRlX2xpbmVubzsKLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4OwotICAvKiBBIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCBoYXZlIGFzc2lnbmVkIElEJ3MgZHVyaW5nIGRlYnVnX3dyaXRlLgotICAgICBUaGlzIGlzIGxpbmtlZCB0aHJvdWdoIHRoZSBuZXh0X2lkIGZpZWxkIG9mIGRlYnVnX2NsYXNzX3R5cGUuICAqLwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKmlkX2xpc3Q7Ci0gIC8qIEEgbGlzdCB1c2VkIHRvIGF2b2lkIHJlY3Vyc2lvbiBkdXJpbmcgZGVidWdfdHlwZV9zYW1lcC4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCAqY29tcGFyZV9saXN0OwotfTsKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0cnVjdCBkZWJ1Z191bml0Ci17Ci0gIC8qIFRoZSBuZXh0IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgZGVidWdfdW5pdCAqbmV4dDsKLSAgLyogQSBsaXN0IG9mIGZpbGVzIGluY2x1ZGVkIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gIFRoZSBmaXJzdAotICAgICBmaWxlIGlzIGFsd2F5cyB0aGUgbWFpbiBvbmUsIGFuZCB0aGF0IGlzIHdoZXJlIHRoZSBtYWluIGZpbGUgbmFtZQotICAgICBpcyBzdG9yZWQuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqZmlsZXM7Ci0gIC8qIExpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICBUaGlzIGlzIG5vdAotICAgICBzdG9yZWQgYnkgZnVuY3Rpb24sIGJlY2F1c2UgYXNzZW1ibGVyIGNvZGUgbWF5IGhhdmUgbGluZSBudW1iZXIKLSAgICAgaW5mb3JtYXRpb24gd2l0aG91dCBmdW5jdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmxpbmVub3M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHNpbmdsZSBzb3VyY2UgZmlsZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19maWxlCi17Ci0gIC8qIFRoZSBuZXh0IHNvdXJjZSBmaWxlIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBkZWJ1Z19maWxlICpuZXh0OwotICAvKiBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogR2xvYmFsIGZ1bmN0aW9ucywgdmFyaWFibGVzLCB0eXBlcywgZXRjLiAgKi8KLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqZ2xvYmFsczsKLX07Ci0KLS8qIEEgdHlwZS4gICovCi0KLXN0cnVjdCBkZWJ1Z190eXBlCi17Ci0gIC8qIEtpbmQgb2YgdHlwZS4gICovCi0gIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gIC8qIFNpemUgb2YgdHlwZSAoMCBpZiBub3Qga25vd24pLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIFR5cGUgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoaXMgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcG9pbnRlcjsKLSAgLyogVGFnZ2VkIHVuaW9uIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogREVCVUdfS0lORF9JTkRJUkVDVC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZSAqa2luZGlyZWN0OwotICAgICAgLyogREVCVUdfS0lORF9JTlQuICAqLwotICAgICAgLyogV2hldGhlciB0aGUgaW50ZWdlciBpcyB1bnNpZ25lZC4gICovCi0gICAgICBib29sZWFuIGtpbnQ7Ci0gICAgICAvKiBERUJVR19LSU5EX1NUUlVDVCwgREVCVUdfS0lORF9VTklPTiwgREVCVUdfS0lORF9DTEFTUywKLSAgICAgICAgIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MuICAqLwotICAgICAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmtjbGFzczsKLSAgICAgIC8qIERFQlVHX0tJTkRfRU5VTS4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfZW51bV90eXBlICprZW51bTsKLSAgICAgIC8qIERFQlVHX0tJTkRfUE9JTlRFUi4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqa3BvaW50ZXI7Ci0gICAgICAvKiBERUJVR19LSU5EX0ZVTkNUSU9OLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlICprZnVuY3Rpb247Ci0gICAgICAvKiBERUJVR19LSU5EX1JFRkVSRU5DRS4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqa3JlZmVyZW5jZTsKLSAgICAgIC8qIERFQlVHX0tJTkRfUkFOR0UuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUgKmtyYW5nZTsKLSAgICAgIC8qIERFQlVHX0tJTkRfQVJSQVkuICAqLwotICAgICAgc3RydWN0IGRlYnVnX2FycmF5X3R5cGUgKmthcnJheTsKLSAgICAgIC8qIERFQlVHX0tJTkRfU0VULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19zZXRfdHlwZSAqa3NldDsKLSAgICAgIC8qIERFQlVHX0tJTkRfT0ZGU0VULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZSAqa29mZnNldDsKLSAgICAgIC8qIERFQlVHX0tJTkRfTUVUSE9ELiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSAqa21ldGhvZDsKLSAgICAgIC8qIERFQlVHX0tJTkRfQ09OU1QuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmtjb25zdDsKLSAgICAgIC8qIERFQlVHX0tJTkRfVk9MQVRJTEUuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmt2b2xhdGlsZTsKLSAgICAgIC8qIERFQlVHX0tJTkRfTkFNRUQsIERFQlVHX0tJTkRfVEFHR0VELiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICprbmFtZWQ7Ci0gICAgfSB1OwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gaW5kaXJlY3QgdHlwZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19pbmRpcmVjdF90eXBlCi17Ci0gIC8qIFNsb3Qgd2hlcmUgdGhlIGZpbmFsIHR5cGUgd2lsbCBhcHBlYXIuICAqLwotICBkZWJ1Z190eXBlICpzbG90OwotICAvKiBUYWcuICAqLwotICBjb25zdCBjaGFyICp0YWc7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHN0cnVjdCwgdW5pb24sIG9yIGNsYXNzLiAgKi8KLQotc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUKLXsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZpZWxkcy4gICovCi0gIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gIC8qIEEgbWFyayBmaWVsZCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RydWN0IGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgcHJpbnRlZC4gICovCi0gIHVuc2lnbmVkIGludCBtYXJrOwotICAvKiBUaGlzIGlzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdW5uYW1lZCBzdHJ1Y3RzIHdoZW4gcHJpbnRpbmcuICAqLwotICB1bnNpZ25lZCBpbnQgaWQ7Ci0gIC8qIFRoZSByZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgZm9yIERFQlVHX0tJTkRfQ0xBU1MgYW5kCi0gICAgIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MuICAqLwotICAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLiAgKi8KLSAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG1ldGhvZHMuICAqLwotICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7Ci0gIC8qIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyBwcm92aWRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZm9yCi0gICAgIHRoaXMgY2xhc3MuICBUaGlzIG1heSBwb2ludCB0byB0aGUgdHlwZSBpdHNlbGYuICAqLwotICBkZWJ1Z190eXBlIHZwdHJiYXNlOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gZW51bS4gICovCi0KLXN0cnVjdCBkZWJ1Z19lbnVtX3R5cGUKLXsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG5hbWVzLiAgKi8KLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICAvKiBBcnJheSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4gICovCi0gIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIGZ1bmN0aW9uLiAgRklYTUU6IFdlIHNob3VsZCBiZSBhYmxlIHRvCi0gICByZWNvcmQgdGhlIHBhcmFtZXRlciB0eXBlcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlCi17Ci0gIC8qIFJldHVybiB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAvKiBXaGV0aGVyIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBib29sZWFuIHZhcmFyZ3M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHJhbmdlLiAgKi8KLQotc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUKLXsKLSAgLyogUmFuZ2UgYmFzZSB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBMb3dlciBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGxvd2VyOwotICAvKiBVcHBlciBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gYXJyYXkuICAqLwotCi1zdHJ1Y3QgZGVidWdfYXJyYXlfdHlwZQotewotICAvKiBFbGVtZW50IHR5cGUuICAqLwotICBkZWJ1Z190eXBlIGVsZW1lbnRfdHlwZTsKLSAgLyogUmFuZ2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcmFuZ2VfdHlwZTsKLSAgLyogTG93ZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgLyogVXBwZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLSAgLyogV2hldGhlciB0aGlzIGFycmF5IGlzIHJlYWxseSBhIHN0cmluZy4gICovCi0gIGJvb2xlYW4gc3RyaW5ncDsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgc2V0LiAgKi8KLQotc3RydWN0IGRlYnVnX3NldF90eXBlCi17Ci0gIC8qIEJhc2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogV2hldGhlciB0aGlzIHNldCBpcyByZWFsbHkgYSBiaXRzdHJpbmcuICAqLwotICBib29sZWFuIGJpdHN0cmluZ3A7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhbiBvZmZzZXQgdHlwZSAoYSBiYXNlZCBwb2ludGVyKS4gICovCi0KLXN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZQotewotICAvKiBUaGUgdHlwZSB0aGUgcG9pbnRlciBpcyBhbiBvZmZzZXQgZnJvbS4gICovCi0gIGRlYnVnX3R5cGUgYmFzZV90eXBlOwotICAvKiBUaGUgdHlwZSB0aGUgcG9pbnRlciBwb2ludHMgdG8uICAqLwotICBkZWJ1Z190eXBlIHRhcmdldF90eXBlOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBtZXRob2QgdHlwZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZQotewotICAvKiBUaGUgcmV0dXJuIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotICAvKiBUaGUgb2JqZWN0IHR5cGUgd2hpY2ggdGhpcyBtZXRob2QgaXMgZm9yLiAgKi8KLSAgZGVidWdfdHlwZSBkb21haW5fdHlwZTsKLSAgLyogQSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLwotICBkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0gIC8qIFdoZXRoZXIgdGhlIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBib29sZWFuIHZhcmFyZ3M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIG5hbWVkIHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZQotewotICAvKiBOYW1lLiAgKi8KLSAgc3RydWN0IGRlYnVnX25hbWUgKm5hbWU7Ci0gIC8qIFJlYWwgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLX07Ci0KLS8qIEEgZmllbGQgaW4gYSBzdHJ1Y3Qgb3IgdW5pb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfZmllbGQKLXsKLSAgLyogTmFtZSBvZiB0aGUgZmllbGQuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlIG9mIHRoZSBmaWVsZC4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotICAvKiBWaXNpYmlsaXR5IG9mIHRoZSBmaWVsZC4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBXaGV0aGVyIHRoaXMgaXMgYSBzdGF0aWMgbWVtYmVyLiAgKi8KLSAgYm9vbGVhbiBzdGF0aWNfbWVtYmVyOwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIElmIHN0YXRpY19tZW1iZXIgaXMgZmFsc2UuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgLyogQml0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZCBpbiB0aGUgc3RydWN0LiAgKi8KLQkgIHVuc2lnbmVkIGludCBiaXRwb3M7Ci0JICAvKiBTaXplIG9mIHRoZSBmaWVsZCBpbiBiaXRzLiAgKi8KLQkgIHVuc2lnbmVkIGludCBiaXRzaXplOwotCX0gZjsKLSAgICAgIC8qIElmIHN0YXRpY19tZW1iZXIgaXMgdHJ1ZS4gICovCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLQl9IHM7Ci0gICAgfSB1OwotfTsKLQotLyogQSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgZGVidWdfYmFzZWNsYXNzCi17Ci0gIC8qIFR5cGUgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogQml0IHBvc2l0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIGluIHRoZSBvYmplY3QuICAqLwotICB1bnNpZ25lZCBpbnQgYml0cG9zOwotICAvKiBXaGV0aGVyIHRoZSBiYXNlIGNsYXNzIGlzIHZpcnR1YWwuICAqLwotICBib29sZWFuIHZpcnR1YWw7Ci0gIC8qIFZpc2liaWxpdHkgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLX07Ci0KLS8qIEEgbWV0aG9kIG9mIGFuIG9iamVjdC4gICovCi0KLXN0cnVjdCBkZWJ1Z19tZXRob2QKLXsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIEEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYW50cy4gICovCi0gIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKnZhcmlhbnRzOwotfTsKLQotLyogVGhlIHZhcmlhbnRzIG9mIGEgbWV0aG9kIGZ1bmN0aW9uIG9mIGFuIG9iamVjdC4gIFRoZXNlIGluZGljYXRlCi0gICB3aGljaCBtZXRob2QgdG8gcnVuLiAgKi8KLQotc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50Ci17Ci0gIC8qIFRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAvKiBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogVGhlIHZpc2liaWxpdHkgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gIC8qIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGNvbnN0LiAgKi8KLSAgYm9vbGVhbiBjb25zdHA7Ci0gIC8qIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIHZvbGF0aWxlLiAgKi8KLSAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gIC8qIFRoZSBvZmZzZXQgdG8gdGhlIGZ1bmN0aW9uIGluIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgKi8KLSAgYmZkX3ZtYSB2b2Zmc2V0OwotICAvKiBJZiB2b2Zmc2V0IGlzIFZPRkZTRVRfU1RBVElDX01FVEhPRCwgdGhpcyBpcyBhIHN0YXRpYyBtZXRob2QuICAqLwotI2RlZmluZSBWT0ZGU0VUX1NUQVRJQ19NRVRIT0QgKChiZmRfdm1hKSAtMSkKLSAgLyogQ29udGV4dCBvZiBhIHZpcnR1YWwgbWV0aG9kIGZ1bmN0aW9uLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKmNvbnRleHQ7Ci19OwotCi0vKiBBIHZhcmlhYmxlLiAgVGhpcyBpcyB0aGUgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSB2YXJpYWJsZSBvYmplY3QuCi0gICBUaGlzIGhhcyBubyBuYW1lOyBhIG5hbWUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdmFyaWFibGUgaW4gYQotICAgZGVidWdfbmFtZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZGVidWdfdmFyaWFibGUKLXsKLSAgLyogS2luZCBvZiB2YXJpYWJsZS4gICovCi0gIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogVmFsdWUuICBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHZhbHVlIGRlcGVuZHMgdXBvbiBraW5kLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBBIGZ1bmN0aW9uLiAgVGhpcyBoYXMgbm8gbmFtZTsgYSBuYW1lIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGZ1bmN0aW9uCi0gICBpbiBhIGRlYnVnX25hbWUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGRlYnVnX2Z1bmN0aW9uCi17Ci0gIC8qIFJldHVybiB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgLyogUGFyYW1ldGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqcGFyYW1ldGVyczsKLSAgLyogQmxvY2sgaW5mb3JtYXRpb24uICBUaGUgZmlyc3Qgc3RydWN0dXJlIG9uIHRoZSBsaXN0IGlzIHRoZSBtYWluCi0gICAgIGJsb2NrIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGRlc2NyaWJlcyBmdW5jdGlvbiBsb2NhbCB2YXJpYWJsZXMuICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmJsb2NrczsKLX07Ci0KLS8qIEEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLQotc3RydWN0IGRlYnVnX3BhcmFtZXRlcgotewotICAvKiBOZXh0IHBhcmFtZXRlci4gICovCi0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKm5leHQ7Ci0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBLaW5kLiAgKi8KLSAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgLyogVmFsdWUgKG1lYW5pbmcgZGVwZW5kcyB1cG9uIGtpbmQpLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBBIHR5cGVkIGNvbnN0YW50LiAgKi8KLQotc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50Ci17Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFZhbHVlLiAgRklYTUU6IFdlIG1heSBldmVudHVhbGx5IG5lZWQgdG8gc3VwcG9ydCBub24taW50ZWdyYWwKLSAgICAgdmFsdWVzLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBhYm91dCBhIGJsb2NrIHdpdGhpbiBhIGZ1bmN0aW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX2Jsb2NrCi17Ci0gIC8qIE5leHQgYmxvY2sgd2l0aCB0aGUgc2FtZSBwYXJlbnQuICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKm5leHQ7Ci0gIC8qIFBhcmVudCBibG9jay4gICovCi0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqcGFyZW50OwotICAvKiBMaXN0IG9mIGNoaWxkIGJsb2Nrcy4gICovCi0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqY2hpbGRyZW47Ci0gIC8qIFN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGJsb2NrLiAgKi8KLSAgYmZkX3ZtYSBzdGFydDsKLSAgLyogRW5kIGFkZHJlc3Mgb2YgdGhlIGJsb2NrLiAgKi8KLSAgYmZkX3ZtYSBlbmQ7Ci0gIC8qIExvY2FsIHZhcmlhYmxlcy4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKmxvY2FsczsKLX07Ci0KLS8qIExpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgY29tcGlsYXRpb24gdW5pdC4gIEZJWE1FOgotICAgVGhpcyBzdHJ1Y3R1cmUgaXMgZWFzeSB0byBjcmVhdGUsIGJ1dCBjYW4gYmUgdmVyeSBzcGFjZQotICAgaW5lZmZpY2llbnQuICAqLwotCi1zdHJ1Y3QgZGVidWdfbGluZW5vCi17Ci0gIC8qIE1vcmUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgYmxvY2suICAqLwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpuZXh0OwotICAvKiBTb3VyY2UgZmlsZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19maWxlICpmaWxlOwotICAvKiBMaW5lIG51bWJlcnMsIHRlcm1pbmF0ZWQgYnkgYSAtMSBvciB0aGUgZW5kIG9mIHRoZSBhcnJheS4gICovCi0jZGVmaW5lIERFQlVHX0xJTkVOT19DT1VOVCAxMAotICB1bnNpZ25lZCBsb25nIGxpbmVub3NbREVCVUdfTElORU5PX0NPVU5UXTsKLSAgLyogQWRkcmVzc2VzIGZvciB0aGUgbGluZSBudW1iZXJzLiAgKi8KLSAgYmZkX3ZtYSBhZGRyc1tERUJVR19MSU5FTk9fQ09VTlRdOwotfTsKLQotLyogQSBuYW1lc3BhY2UuICBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIG5hbWVzIHRvIG9iamVjdHMuICBGSVhNRTogVGhpcwotICAgc2hvdWxkIGJlIGltcGxlbWVudGVkIGFzIGEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UKLXsKLSAgLyogTGlzdCBvZiBpdGVtcyBpbiB0aGlzIG5hbWVzcGFjZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICpsaXN0OwotICAvKiBQb2ludGVyIHRvIHdoZXJlIHRoZSBuZXh0IGl0ZW0gaW4gdGhpcyBuYW1lc3BhY2Ugc2hvdWxkIGdvLiAgKi8KLSAgc3RydWN0IGRlYnVnX25hbWUgKip0YWlsOwotfTsKLQotLyogS2luZHMgb2Ygb2JqZWN0cyB0aGF0IGFwcGVhciBpbiBhIG5hbWVzcGFjZS4gICovCi0KLWVudW0gZGVidWdfb2JqZWN0X2tpbmQKLXsKLSAgLyogQSB0eXBlLiAgKi8KLSAgREVCVUdfT0JKRUNUX1RZUEUsCi0gIC8qIEEgdGFnZ2VkIHR5cGUgKHJlYWxseSBhIGRpZmZlcmVudCBzb3J0IG9mIG5hbWVzcGFjZSkuICAqLwotICBERUJVR19PQkpFQ1RfVEFHLAotICAvKiBBIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfT0JKRUNUX1ZBUklBQkxFLAotICAvKiBBIGZ1bmN0aW9uLiAgKi8KLSAgREVCVUdfT0JKRUNUX0ZVTkNUSU9OLAotICAvKiBBbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLSAgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVCwKLSAgLyogQSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0gIERFQlVHX09CSkVDVF9GTE9BVF9DT05TVEFOVCwKLSAgLyogQSB0eXBlZCBjb25zdGFudC4gICovCi0gIERFQlVHX09CSkVDVF9UWVBFRF9DT05TVEFOVAotfTsKLQotLyogTGlua2FnZSBvZiBhbiBvYmplY3QgdGhhdCBhcHBlYXJzIGluIGEgbmFtZXNwYWNlLiAgKi8KLQotZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZQotewotICAvKiBMb2NhbCB2YXJpYWJsZS4gICovCi0gIERFQlVHX0xJTktBR0VfQVVUT01BVElDLAotICAvKiBTdGF0aWMtLWVpdGhlciBmaWxlIHN0YXRpYyBvciBmdW5jdGlvbiBzdGF0aWMsIGRlcGVuZGluZyB1cG9uIHRoZQotICAgICBuYW1lc3BhY2UgaXMuICAqLwotICBERUJVR19MSU5LQUdFX1NUQVRJQywKLSAgLyogR2xvYmFsLiAgKi8KLSAgREVCVUdfTElOS0FHRV9HTE9CQUwsCi0gIC8qIE5vIGxpbmthZ2UuICAqLwotICBERUJVR19MSU5LQUdFX05PTkUKLX07Ci0KLS8qIEEgbmFtZSBpbiBhIG5hbWVzcGFjZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19uYW1lCi17Ci0gIC8qIE5leHQgbmFtZSBpbiB0aGlzIG5hbWVzcGFjZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTWFyay4gIFRoaXMgaXMgdXNlZCBieSBkZWJ1Z193cml0ZS4gICovCi0gIHVuc2lnbmVkIGludCBtYXJrOwotICAvKiBLaW5kIG9mIG9iamVjdC4gICovCi0gIGVudW0gZGVidWdfb2JqZWN0X2tpbmQga2luZDsKLSAgLyogTGlua2FnZSBvZiBvYmplY3QuICAqLwotICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci0gIC8qIFRhZ2dlZCB1bmlvbiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdC4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogREVCVUdfT0JKRUNUX1RZUEUuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfVEFHLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0YWc7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfVkFSSUFCTEUuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3ZhcmlhYmxlICp2YXJpYWJsZTsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9GVU5DVElPTi4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmZ1bmN0aW9uOwotICAgICAgLyogREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVC4gICovCi0gICAgICBiZmRfdm1hIGludF9jb25zdGFudDsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9GTE9BVF9DT05TVEFOVC4gICovCi0gICAgICBkb3VibGUgZmxvYXRfY29uc3RhbnQ7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50ICp0eXBlZF9jb25zdGFudDsKLSAgICB9IHU7Ci19OwotCi0vKiBEdXJpbmcgZGVidWdfd3JpdGUsIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyB1c2VkIHRvCi0gICBrZWVwIHRyYWNrIG9mIElEIG51bWJlcnMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gY2xhc3Nlcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19jbGFzc19pZAotewotICAvKiBOZXh0IElEIG51bWJlci4gICovCi0gIHN0cnVjdCBkZWJ1Z19jbGFzc19pZCAqbmV4dDsKLSAgLyogVGhlIHR5cGUgd2l0aCB0aGUgSUQuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogVGhlIHRhZzsgTlVMTCBpZiBubyB0YWcuICAqLwotICBjb25zdCBjaGFyICp0YWc7Ci19OwotCi0vKiBEdXJpbmcgZGVidWdfdHlwZV9zYW1lcCwgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIGtlcHQKLSAgIG9uIHRoZSBzdGFjayB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QKLXsKLSAgLyogTmV4dCB0eXBlIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgKm5leHQ7Ci0gIC8qIFRoZSB0eXBlcyB3ZSBhcmUgY29tcGFyaW5nLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQxOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDI7Ci19OwotCi0vKiBEdXJpbmcgZGVidWdfZ2V0X3JlYWxfdHlwZSwgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzCi0gICBrZXB0IG9uIHRoZSBzdGFjayB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QKLXsKLSAgLyogTmV4dCB0eXBlIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKm5leHQ7Ci0gIC8qIFRoZSB0eXBlIHdlIGFyZSBjaGVja2luZy4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotfTsKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgZGVidWdfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGRlYnVnX25hbWUgKmRlYnVnX2FkZF90b19uYW1lc3BhY2UKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqLCBjb25zdCBjaGFyICosCi0JICAgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCwgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSkpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICpkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2UKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfb2JqZWN0X2tpbmQsCi0JICAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSkpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICpkZWJ1Z19tYWtlX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBlbnVtIGRlYnVnX3R5cGVfa2luZCwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGRlYnVnX3R5cGUgKmRlYnVnX2dldF9yZWFsX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfbmFtZQotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIHN0cnVjdCBkZWJ1Z19uYW1lICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBzdHJ1Y3QgZGVidWdfdHlwZSAqLCBzdHJ1Y3QgZGVidWdfbmFtZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9jbGFzc190eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgc3RydWN0IGRlYnVnX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9mdW5jdGlvbgotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSwgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX2Jsb2NrCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgc3RydWN0IGRlYnVnX2Jsb2NrICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX2xpbmVub3MKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z19zZXRfY2xhc3NfaWQKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBkZWJ1Z190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3R5cGVfc2FtZXAKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z19jbGFzc190eXBlX3NhbWVwCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKikpOwotDAotLyogSXNzdWUgYW4gZXJyb3IgbWVzc2FnZS4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19lcnJvciAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIG1lc3NhZ2UpOwotfQotCi0vKiBBZGQgYW4gb2JqZWN0IHRvIGEgbmFtZXNwYWNlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICoKLWRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sIG5zcCwgbmFtZSwga2luZCwgbGlua2FnZSkKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqbnNwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9raW5kIGtpbmQ7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UgbGlua2FnZTsKLXsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKm5zOwotCi0gIG4gPSAoc3RydWN0IGRlYnVnX25hbWUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOwotCi0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT5raW5kID0ga2luZDsKLSAgbi0+bGlua2FnZSA9IGxpbmthZ2U7Ci0KLSAgbnMgPSAqbnNwOwotICBpZiAobnMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBucyA9IChzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICopIHhtYWxsb2MgKHNpemVvZiAqbnMpOwotICAgICAgbWVtc2V0IChucywgMCwgc2l6ZW9mICpucyk7Ci0KLSAgICAgIG5zLT50YWlsID0gJm5zLT5saXN0OwotCi0gICAgICAqbnNwID0gbnM7Ci0gICAgfQotCi0gICpucy0+dGFpbCA9IG47Ci0gIG5zLT50YWlsID0gJm4tPm5leHQ7Ci0KLSAgcmV0dXJuIG47Ci19Ci0KLS8qIEFkZCBhbiBvYmplY3QgdG8gdGhlIGN1cnJlbnQgbmFtZXNwYWNlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICoKLWRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwga2luZCwgbGlua2FnZSkKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCBraW5kOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKipuc3A7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlOiBubyBjdXJyZW50IGZpbGUiKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfYmxvY2sgIT0gTlVMTCkKLSAgICBuc3AgPSAmaW5mby0+Y3VycmVudF9ibG9jay0+bG9jYWxzOwotICBlbHNlCi0gICAgbnNwID0gJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFsczsKLQotICByZXR1cm4gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgbnNwLCBuYW1lLCBraW5kLCBsaW5rYWdlKTsKLX0KLQwKLS8qIFJldHVybiBhIGhhbmRsZSBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotUFRSCi1kZWJ1Z19pbml0ICgpCi17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKnJldDsKLQotICByZXQgPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIG1lbXNldCAocmV0LCAwLCBzaXplb2YgKnJldCk7Ci0gIHJldHVybiAoUFRSKSByZXQ7Ci19Ci0KLS8qIFNldCB0aGUgc291cmNlIGZpbGVuYW1lLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIG5ldyBjb21waWxhdGlvbgotICAgdW5pdC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3NldF9maWxlbmFtZSAoaGFuZGxlLCBuYW1lKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqbmZpbGU7Ci0gIHN0cnVjdCBkZWJ1Z191bml0ICpudW5pdDsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIG5hbWUgPSAiIjsKLQotICBuZmlsZSA9IChzdHJ1Y3QgZGVidWdfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKm5maWxlKTsKLSAgbWVtc2V0IChuZmlsZSwgMCwgc2l6ZW9mICpuZmlsZSk7Ci0KLSAgbmZpbGUtPmZpbGVuYW1lID0gbmFtZTsKLQotICBudW5pdCA9IChzdHJ1Y3QgZGVidWdfdW5pdCAqKSB4bWFsbG9jIChzaXplb2YgKm51bml0KTsKLSAgbWVtc2V0IChudW5pdCwgMCwgc2l6ZW9mICpudW5pdCk7Ci0KLSAgbnVuaXQtPmZpbGVzID0gbmZpbGU7Ci0gIGluZm8tPmN1cnJlbnRfZmlsZSA9IG5maWxlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgIT0gTlVMTCkKLSAgICBpbmZvLT5jdXJyZW50X3VuaXQtPm5leHQgPSBudW5pdDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5mby0+dW5pdHMgPT0gTlVMTCk7Ci0gICAgICBpbmZvLT51bml0cyA9IG51bml0OwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50X3VuaXQgPSBudW5pdDsKLQotICBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID0gTlVMTDsKLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IE5VTEw7Ci0gIGluZm8tPmN1cnJlbnRfbGluZW5vID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hhbmdlIHNvdXJjZSBmaWxlcyB0byB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiAgVGhpcyBpcyB1c2VkIGZvcgotICAgaW5jbHVkZSBmaWxlcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotYm9vbGVhbgotZGVidWdfc3RhcnRfc291cmNlIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19maWxlICpmLCAqKnBmOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgbmFtZSA9ICIiOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfc3RhcnRfc291cmNlOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChmID0gaW5mby0+Y3VycmVudF91bml0LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+ZmlsZW5hbWVbMF0gPT0gbmFtZVswXQotCSAgJiYgZi0+ZmlsZW5hbWVbMV0gPT0gbmFtZVsxXQotCSAgJiYgc3RyY21wIChmLT5maWxlbmFtZSwgbmFtZSkgPT0gMCkKLQl7Ci0JICBpbmZvLT5jdXJyZW50X2ZpbGUgPSBmOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICBmID0gKHN0cnVjdCBkZWJ1Z19maWxlICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5maWxlbmFtZSA9IG5hbWU7Ci0KLSAgZm9yIChwZiA9ICZpbmZvLT5jdXJyZW50X2ZpbGUtPm5leHQ7Ci0gICAgICAgKnBmICE9IE5VTEw7Ci0gICAgICAgcGYgPSAmKCpwZiktPm5leHQpCi0gICAgOwotICAqcGYgPSBmOwotCi0gIGluZm8tPmN1cnJlbnRfZmlsZSA9IGY7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBhIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgZnVuY3Rpb24KLSAgIGJsb2NrLiAgVGhlIGRlYnVnX3R5cGUgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4KLSAgIFRoZSBib29sZWFuIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBnbG9iYWxseSB2aXNpYmxlLgotICAgVGhlIGJmZF92bWEgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gIEN1cnJlbnRseQotICAgdGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgc3BlY2lmaWVkIGJ5IGNhbGxzIHRvCi0gICBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyLiAgRklYTUU6IFRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZ5IG5lc3RlZAotICAgZnVuY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX2Z1bmN0aW9uIChoYW5kbGUsIG5hbWUsIHJldHVybl90eXBlLCBnbG9iYWwsIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gICAgIGJvb2xlYW4gZ2xvYmFsOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqZjsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpiOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIG5hbWUgPSAiIjsKLSAgaWYgKHJldHVybl90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX2Z1bmN0aW9uOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZiA9IChzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKLSAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOwotCi0gIGYtPnJldHVybl90eXBlID0gcmV0dXJuX3R5cGU7Ci0KLSAgYiA9IChzdHJ1Y3QgZGVidWdfYmxvY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKLSAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOwotCi0gIGItPnN0YXJ0ID0gYWRkcjsKLSAgYi0+ZW5kID0gKGJmZF92bWEpIC0xOwotCi0gIGYtPmJsb2NrcyA9IGI7Ci0KLSAgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9IGY7Ci0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBiOwotCi0gIC8qIEZJWE1FOiBJZiB3ZSBjb3VsZCBoYW5kbGUgbmVzdGVkIGZ1bmN0aW9ucywgdGhpcyB3b3VsZCBiZSB0aGUKLSAgICAgcGxhY2U6IHdlIHdvdWxkIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG5hbWVzcGFjZS4gICovCi0gIG4gPSBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLAotCQkJICAgICAgJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFscywKLQkJCSAgICAgIG5hbWUsCi0JCQkgICAgICBERUJVR19PQkpFQ1RfRlVOQ1RJT04sCi0JCQkgICAgICAoZ2xvYmFsCi0JCQkgICAgICAgPyBERUJVR19MSU5LQUdFX0dMT0JBTAotCQkJICAgICAgIDogREVCVUdfTElOS0FHRV9TVEFUSUMpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbi0+dS5mdW5jdGlvbiA9IGY7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBhIHBhcmFtZXRlciBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChoYW5kbGUsIG5hbWUsIHR5cGUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqcCwgKipwcDsKLQotICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF9wYXJhbWV0ZXI6IG5vIGN1cnJlbnQgZnVuY3Rpb24iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHAgPSAoc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqKSB4bWFsbG9jIChzaXplb2YgKnApOwotICBtZW1zZXQgKHAsIDAsIHNpemVvZiAqcCk7Ci0KLSAgcC0+bmFtZSA9IG5hbWU7Ci0gIHAtPnR5cGUgPSB0eXBlOwotICBwLT5raW5kID0ga2luZDsKLSAgcC0+dmFsID0gdmFsOwotCi0gIGZvciAocHAgPSAmaW5mby0+Y3VycmVudF9mdW5jdGlvbi0+cGFyYW1ldGVyczsKLSAgICAgICAqcHAgIT0gTlVMTDsKLSAgICAgICBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBhIGZ1bmN0aW9uLiAgRklYTUU6IFRoaXMgc2hvdWxkIGhhbmRsZSBmdW5jdGlvbiBuZXN0aW5nLiAgKi8KLQotYm9vbGVhbgotZGVidWdfZW5kX2Z1bmN0aW9uIChoYW5kbGUsIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfYmxvY2sgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfZnVuY3Rpb246IG5vIGN1cnJlbnQgZnVuY3Rpb24iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5jdXJyZW50X2Jsb2NrLT5wYXJlbnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2Z1bmN0aW9uOiBzb21lIGJsb2NrcyB3ZXJlIG5vdCBjbG9zZWQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPmN1cnJlbnRfYmxvY2stPmVuZCA9IGFkZHI7Ci0KLSAgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9IE5VTEw7Ci0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBBbGwgbG9jYWwgaW5mb3JtYXRpb24gd2lsbCBiZQotICAgcmVjb3JkZWQgaW4gdGhpcyBibG9jaywgdW50aWwgdGhlIG1hdGNoaW5nIGNhbGwgdG8gZGVidWdfZW5kX2Jsb2NrLgotICAgZGVidWdfc3RhcnRfYmxvY2sgYW5kIGRlYnVnX2VuZF9ibG9jayBtYXkgYmUgbmVzdGVkLiAgVGhlIGJmZF92bWEKLSAgIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sgc3RhcnRzLiAgKi8KLQotYm9vbGVhbgotZGVidWdfc3RhcnRfYmxvY2sgKGhhbmRsZSwgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmIsICoqcGI7Ci0KLSAgLyogV2UgbXVzdCBhbHdheXMgaGF2ZSBhIGN1cnJlbnQgYmxvY2s6IGRlYnVnX3JlY29yZF9mdW5jdGlvbiBzZXRzCi0gICAgIG9uZSB1cC4gICovCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19zdGFydF9ibG9jazogbm8gY3VycmVudCBibG9jayIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYiA9IChzdHJ1Y3QgZGVidWdfYmxvY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKLSAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOwotCi0gIGItPnBhcmVudCA9IGluZm8tPmN1cnJlbnRfYmxvY2s7Ci0gIGItPnN0YXJ0ID0gYWRkcjsKLSAgYi0+ZW5kID0gKGJmZF92bWEpIC0xOwotCi0gIC8qIFRoaXMgbmV3IGJsb2NrIGlzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgYmxvY2suICAqLwotICBmb3IgKHBiID0gJmluZm8tPmN1cnJlbnRfYmxvY2stPmNoaWxkcmVuOwotICAgICAgICpwYiAhPSBOVUxMOwotICAgICAgIHBiID0gJigqcGIpLT5uZXh0KQotICAgIDsKLSAgKnBiID0gYjsKLQotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gYjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIFRoaXMgbWF0Y2hlcyB0aGUgY2FsbCB0bwotICAgZGVidWdfc3RhcnRfYmxvY2suICBUaGUgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhpcyBibG9jawotICAgZW5kcy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX2VuZF9ibG9jayAoaGFuZGxlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqcGFyZW50OwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfYmxvY2s6IG5vIGN1cnJlbnQgYmxvY2siKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHBhcmVudCA9IGluZm8tPmN1cnJlbnRfYmxvY2stPnBhcmVudDsKLSAgaWYgKHBhcmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfYmxvY2s6IGF0dGVtcHQgdG8gY2xvc2UgdG9wIGxldmVsIGJsb2NrIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50X2Jsb2NrLT5lbmQgPSBhZGRyOwotCi0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBwYXJlbnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFzc29jaWF0ZSBhIGxpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIGFuZCBmdW5jdGlvbgotICAgd2l0aCBhIGdpdmVuIGFkZHJlc3MuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfbGluZSAoaGFuZGxlLCBsaW5lbm8sIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGluZW5vOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmw7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX2xpbmU6IG5vIGN1cnJlbnQgdW5pdCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbCA9IGluZm8tPmN1cnJlbnRfbGluZW5vOwotICBpZiAobCAhPSBOVUxMICYmIGwtPmZpbGUgPT0gaW5mby0+Y3VycmVudF9maWxlKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBERUJVR19MSU5FTk9fQ09VTlQ7IGkrKykKLQl7Ci0JICBpZiAobC0+bGluZW5vc1tpXSA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0JICAgIHsKLQkgICAgICBsLT5saW5lbm9zW2ldID0gbGluZW5vOwotCSAgICAgIGwtPmFkZHJzW2ldID0gYWRkcjsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZ2V0IGhlcmUsIHRoZW4gZWl0aGVyIDEpIHRoZXJlIGlzIG5vIGN1cnJlbnRfbGluZW5vCi0gICAgIHN0cnVjdHVyZSwgd2hpY2ggbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgaW4gdGhpcwotICAgICBjb21waWxhdGlvbiB1bml0LCAyKSB0aGUgY3VycmVudF9saW5lbm8gc3RydWN0dXJlIGlzIGZvciBhCi0gICAgIGRpZmZlcmVudCBmaWxlLCBvciAzKSB0aGUgY3VycmVudF9saW5lbm8gc3RydWN0dXJlIGlzIGZ1bGwuCi0gICAgIFJlZ2FyZGxlc3MsIHdlIHdhbnQgdG8gYWxsb2NhdGUgYSBuZXcgZGVidWdfbGluZW5vIHN0cnVjdHVyZSwgcHV0Ci0gICAgIGl0IGluIHRoZSByaWdodCBwbGFjZSwgYW5kIG1ha2UgaXQgdGhlIG5ldyBjdXJyZW50X2xpbmVubwotICAgICBzdHJ1Y3R1cmUuICAqLwotCi0gIGwgPSAoc3RydWN0IGRlYnVnX2xpbmVubyAqKSB4bWFsbG9jIChzaXplb2YgKmwpOwotICBtZW1zZXQgKGwsIDAsIHNpemVvZiAqbCk7Ci0KLSAgbC0+ZmlsZSA9IGluZm8tPmN1cnJlbnRfZmlsZTsKLSAgbC0+bGluZW5vc1swXSA9IGxpbmVubzsKLSAgbC0+YWRkcnNbMF0gPSBhZGRyOwotICBmb3IgKGkgPSAxOyBpIDwgREVCVUdfTElORU5PX0NPVU5UOyBpKyspCi0gICAgbC0+bGluZW5vc1tpXSA9ICh1bnNpZ25lZCBsb25nKSAtMTsKLQotICBpZiAoaW5mby0+Y3VycmVudF9saW5lbm8gIT0gTlVMTCkKLSAgICBpbmZvLT5jdXJyZW50X2xpbmVuby0+bmV4dCA9IGw7Ci0gIGVsc2UKLSAgICBpbmZvLT5jdXJyZW50X3VuaXQtPmxpbmVub3MgPSBsOwotCi0gIGluZm8tPmN1cnJlbnRfbGluZW5vID0gbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBuYW1lZCBjb21tb24gYmxvY2suICBUaGlzIGlzIGEgYmxvY2sgb2YgdmFyaWFibGVzIHRoYXQgbWF5Ci0gICBtb3ZlIGluIG1lbW9yeS4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jayAoaGFuZGxlLCBuYW1lKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUgKi8KLSAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIikpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEVuZCBhIG5hbWVkIGNvbW1vbiBibG9jay4gICovCi0KLWJvb2xlYW4KLWRlYnVnX2VuZF9jb21tb25fYmxvY2sgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVjb3JkIGEgbmFtZWQgaW50ZWdlciBjb25zdGFudC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9pbnRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbiA9IGRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVCwKLQkJCQkgICAgICBERUJVR19MSU5LQUdFX05PTkUpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuLT51LmludF9jb25zdGFudCA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgbmFtZWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkb3VibGUgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQsCi0JCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbi0+dS5mbG9hdF9jb25zdGFudCA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgdHlwZWQgY29uc3RhbnQgd2l0aCBhbiBpbnRlZ3JhbCB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF90eXBlZF9jb25zdCAoaGFuZGxlLCBuYW1lLCB0eXBlLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfdHlwZWRfY29uc3RhbnQgKnRjOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQsCi0JCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdGMgPSAoc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50ICopIHhtYWxsb2MgKHNpemVvZiAqdGMpOwotICBtZW1zZXQgKHRjLCAwLCBzaXplb2YgKnRjKTsKLQotICB0Yy0+dHlwZSA9IHR5cGU7Ci0gIHRjLT52YWwgPSB2YWw7Ci0KLSAgbi0+dS50eXBlZF9jb25zdGFudCA9IHRjOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBsYWJlbC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9sYWJlbCAoaGFuZGxlLCBuYW1lLCB0eXBlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZGVidWdfdHlwZSB0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfbGFiZWwgbm90IGltcGxlbWVudGVkIikpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlY29yZCBhIHZhcmlhYmxlLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChoYW5kbGUsIG5hbWUsIHR5cGUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqbnNwOwotICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfdmFyaWFibGUgKnY7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoa2luZCA9PSBERUJVR19HTE9CQUwgfHwga2luZCA9PSBERUJVR19TVEFUSUMpCi0gICAgewotICAgICAgbnNwID0gJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFsczsKLSAgICAgIGlmIChraW5kID09IERFQlVHX0dMT0JBTCkKLQlsaW5rYWdlID0gREVCVUdfTElOS0FHRV9HTE9CQUw7Ci0gICAgICBlbHNlCi0JbGlua2FnZSA9IERFQlVHX0xJTktBR0VfU1RBVElDOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbmZvLT5jdXJyZW50X2Jsb2NrID09IE5VTEwpCi0JewotCSAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBibG9jayIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBuc3AgPSAmaW5mby0+Y3VycmVudF9ibG9jay0+bG9jYWxzOwotICAgICAgbGlua2FnZSA9IERFQlVHX0xJTktBR0VfQVVUT01BVElDOwotICAgIH0KLQotICBuID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgbnNwLCBuYW1lLCBERUJVR19PQkpFQ1RfVkFSSUFCTEUsIGxpbmthZ2UpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2ID0gKHN0cnVjdCBkZWJ1Z192YXJpYWJsZSAqKSB4bWFsbG9jIChzaXplb2YgKnYpOwotICBtZW1zZXQgKHYsIDAsIHNpemVvZiAqdik7Ci0KLSAgdi0+a2luZCA9IGtpbmQ7Ci0gIHYtPnR5cGUgPSB0eXBlOwotICB2LT52YWwgPSB2YWw7Ci0KLSAgbi0+dS52YXJpYWJsZSA9IHY7Ci0KLSAgcmV0dXJuIHRydWU7ICAKLX0KLQotLyogTWFrZSBhIHR5cGUgd2l0aCBhIGdpdmVuIGtpbmQgYW5kIHNpemUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfdHlwZSAqCi1kZWJ1Z19tYWtlX3R5cGUgKGluZm8sIGtpbmQsIHNpemUpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIHQgPSAoc3RydWN0IGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICp0KTsKLSAgbWVtc2V0ICh0LCAwLCBzaXplb2YgKnQpOwotCi0gIHQtPmtpbmQgPSBraW5kOwotICB0LT5zaXplID0gc2l6ZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiBpbmRpcmVjdCB0eXBlIHdoaWNoIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGEgdHlwZQotICAgd2hpY2ggaXMgcmVmZXJlbmNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoaGFuZGxlLCBzbG90LCB0YWcpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgKnNsb3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19pbmRpcmVjdF90eXBlICppOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfSU5ESVJFQ1QsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaSA9IChzdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmkpOwotICBtZW1zZXQgKGksIDAsIHNpemVvZiAqaSk7Ci0KLSAgaS0+c2xvdCA9IHNsb3Q7Ci0gIGktPnRhZyA9IHRhZzsKLQotICB0LT51LmtpbmRpcmVjdCA9IGk7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSB2b2lkIHR5cGUuICBUaGVyZSBpcyBvbmx5IG9uZSBvZiB0aGVzZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfdm9pZF90eXBlIChoYW5kbGUpCi0gICAgIFBUUiBoYW5kbGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9WT0lELCAwKTsKLX0KLQotLyogTWFrZSBhbiBpbnRlZ2VyIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgVGhlIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZQotICAgaWYgdGhlIGludGVnZXIgaXMgdW5zaWduZWQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2ludF90eXBlIChoYW5kbGUsIHNpemUsIHVuc2lnbmVkcCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0lOVCwgc2l6ZSk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51LmtpbnQgPSB1bnNpZ25lZHA7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBmbG9hdGluZyBwb2ludCB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gIEZJWE1FOiBPbiBzb21lCi0gICBwbGF0Zm9ybXMsIGxpa2UgYW4gQWxwaGEsIHlvdSBwcm9iYWJseSBuZWVkIHRvIGJlIGFibGUgdG8gc3BlY2lmeQotICAgdGhlIGZvcm1hdC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfZmxvYXRfdHlwZSAoaGFuZGxlLCBzaXplKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0ZMT0FULCBzaXplKTsKLX0KLQotLyogTWFrZSBhIGJvb2xlYW4gdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoaGFuZGxlLCBzaXplKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0JPT0wsIHNpemUpOwotfQotCi0vKiBNYWtlIGEgY29tcGxleCB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfY29tcGxleF90eXBlIChoYW5kbGUsIHNpemUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfQ09NUExFWCwgc2l6ZSk7Ci19Ci0KLS8qIE1ha2UgYSBzdHJ1Y3R1cmUgdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdHJ1ZSBmb3IgYSBzdHJ1Y3QsCi0gICBmYWxzZSBmb3IgYSB1bmlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0LgotICAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICBiZmRfdm1hIHNpemU7Ci0gICAgIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLAotCQkgICAgICAgc3RydWN0cCA/IERFQlVHX0tJTkRfU1RSVUNUIDogREVCVUdfS0lORF9VTklPTiwKLQkJICAgICAgIHNpemUpOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgYyA9IChzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmMpOwotICBtZW1zZXQgKGMsIDAsIHNpemVvZiAqYyk7Ci0KLSAgYy0+ZmllbGRzID0gZmllbGRzOwotCi0gIHQtPnUua2NsYXNzID0gYzsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiBvYmplY3QgdHlwZS4gIFRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGhhbmRsZQotICAgYXJlIHRoZSBzYW1lIGFzIGZvciBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlLiAgVGhlIG5leHQgYXJndW1lbnRzIGFyZQotICAgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLCBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZgotICAgbWV0aG9kcywgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBob2xkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCi0gICBpZiBpdCBpcyBub3QgdGhpcyBvYmplY3QsIGFuZCBhIGJvb2xlYW4gd2hpY2ggaXMgdHJ1ZSBpZiB0aGlzCi0gICBvYmplY3QgaGFzIGl0cyBvd24gdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfb2JqZWN0X3R5cGUgKGhhbmRsZSwgc3RydWN0cCwgc2l6ZSwgZmllbGRzLCBiYXNlY2xhc3NlcywKLQkJCW1ldGhvZHMsIHZwdHJiYXNlLCBvd252cHRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIGJmZF92bWEgc2l6ZTsKLSAgICAgZGVidWdfZmllbGQgKmZpZWxkczsKLSAgICAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKLSAgICAgZGVidWdfbWV0aG9kICptZXRob2RzOwotICAgICBkZWJ1Z190eXBlIHZwdHJiYXNlOwotICAgICBib29sZWFuIG93bnZwdHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLAotCQkgICAgICAgc3RydWN0cCA/IERFQlVHX0tJTkRfQ0xBU1MgOiBERUJVR19LSU5EX1VOSU9OX0NMQVNTLAotCQkgICAgICAgc2l6ZSk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBjID0gKHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYyk7Ci0gIG1lbXNldCAoYywgMCwgc2l6ZW9mICpjKTsKLQotICBjLT5maWVsZHMgPSBmaWVsZHM7Ci0gIGMtPmJhc2VjbGFzc2VzID0gYmFzZWNsYXNzZXM7Ci0gIGMtPm1ldGhvZHMgPSBtZXRob2RzOwotICBpZiAob3dudnB0cikKLSAgICBjLT52cHRyYmFzZSA9IHQ7Ci0gIGVsc2UKLSAgICBjLT52cHRyYmFzZSA9IHZwdHJiYXNlOwotCi0gIHQtPnUua2NsYXNzID0gYzsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiBlbnVtZXJhdGlvbiB0eXBlLiAgVGhlIGFyZ3VtZW50cyBhcmUgYSBudWxsIHRlcm1pbmF0ZWQKLSAgIGFycmF5IG9mIHN0cmluZ3MsIGFuZCBhbiBhcnJheSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfZW51bV90eXBlIChoYW5kbGUsIG5hbWVzLCB2YWx1ZXMpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgICAgYmZkX3NpZ25lZF92bWEgKnZhbHVlczsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19lbnVtX3R5cGUgKmU7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9FTlVNLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGUgPSAoc3RydWN0IGRlYnVnX2VudW1fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmUpOwotICBtZW1zZXQgKGUsIDAsIHNpemVvZiAqZSk7Ci0KLSAgZS0+bmFtZXMgPSBuYW1lczsKLSAgZS0+dmFsdWVzID0gdmFsdWVzOwotCi0gIHQtPnUua2VudW0gPSBlOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgcG9pbnRlciB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAodHlwZS0+cG9pbnRlciAhPSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIHR5cGUtPnBvaW50ZXI7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9QT0lOVEVSLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua3BvaW50ZXIgPSB0eXBlOwotCi0gIHR5cGUtPnBvaW50ZXIgPSB0OwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgZ2l2ZW4gdHlwZS4gIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZQotICAgdG8gcmVjb3JkIHRoZSBwYXJhbWV0ZXIgdHlwZXMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGhhbmRsZSwgdHlwZSwgYXJnX3R5cGVzLCB2YXJhcmdzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uX3R5cGUgKmY7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfRlVOQ1RJT04sIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgZiA9IChzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+cmV0dXJuX3R5cGUgPSB0eXBlOwotICBmLT5hcmdfdHlwZXMgPSBhcmdfdHlwZXM7Ci0gIGYtPnZhcmFyZ3MgPSB2YXJhcmdzOwotCi0gIHQtPnUua2Z1bmN0aW9uID0gZjsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHJlZmVyZW5jZSB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfUkVGRVJFTkNFLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua3JlZmVyZW5jZSA9IHR5cGU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSByYW5nZSBvZiBhIGdpdmVuIHR5cGUgZnJvbSBhIGxvd2VyIHRvIGFuIHVwcGVyIGJvdW5kLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9yYW5nZV90eXBlIChoYW5kbGUsIHR5cGUsIGxvd2VyLCB1cHBlcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgICAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfcmFuZ2VfdHlwZSAqcjsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9SQU5HRSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICByID0gKHN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcik7Ci0gIG1lbXNldCAociwgMCwgc2l6ZW9mICpyKTsKLQotICByLT50eXBlID0gdHlwZTsKLSAgci0+bG93ZXIgPSBsb3dlcjsKLSAgci0+dXBwZXIgPSB1cHBlcjsKLQotICB0LT51LmtyYW5nZSA9IHI7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gYXJyYXkgdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYW4gZWxlbWVudAotICAgb2YgdGhlIGFycmF5LiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIGEgcmFuZ2Ugb2YgdGhlCi0gICBhcnJheS4gIFRoZSBmb3VydGggYW5kIGZpZnRoIGFyZ3VtZW50IGFyZSB0aGUgbG93ZXIgYW5kIHVwcGVyCi0gICBib3VuZHMsIHJlc3BlY3RpdmVseS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgYXJyYXkgaXMKLSAgIGFjdHVhbGx5IGEgc3RyaW5nLCBhcyBpbiBDLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9hcnJheV90eXBlIChoYW5kbGUsIGVsZW1lbnRfdHlwZSwgcmFuZ2VfdHlwZSwgbG93ZXIsIHVwcGVyLAotCQkgICAgICAgc3RyaW5ncCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSBlbGVtZW50X3R5cGU7Ci0gICAgIGRlYnVnX3R5cGUgcmFuZ2VfdHlwZTsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotICAgICBib29sZWFuIHN0cmluZ3A7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfYXJyYXlfdHlwZSAqYTsKLQotICBpZiAoZWxlbWVudF90eXBlID09IE5VTEwgfHwgcmFuZ2VfdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9BUlJBWSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBhID0gKHN0cnVjdCBkZWJ1Z19hcnJheV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYSk7Ci0gIG1lbXNldCAoYSwgMCwgc2l6ZW9mICphKTsKLQotICBhLT5lbGVtZW50X3R5cGUgPSBlbGVtZW50X3R5cGU7Ci0gIGEtPnJhbmdlX3R5cGUgPSByYW5nZV90eXBlOwotICBhLT5sb3dlciA9IGxvd2VyOwotICBhLT51cHBlciA9IHVwcGVyOwotICBhLT5zdHJpbmdwID0gc3RyaW5ncDsKLQotICB0LT51LmthcnJheSA9IGE7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgb2YgYSBnaXZlbiB0eXBlLiAgRm9yIGV4YW1wbGUsIGEgUGFzY2FsIHNldCB0eXBlLiAgVGhlCi0gICBib29sZWFuIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhpcyBzZXQgaXMgYWN0dWFsbHkgYSBiaXRzdHJpbmcsIGFzIGluCi0gICBDSElMTC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfc2V0X3R5cGUgKGhhbmRsZSwgdHlwZSwgYml0c3RyaW5ncCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBib29sZWFuIGJpdHN0cmluZ3A7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfc2V0X3R5cGUgKnM7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfU0VULCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHMgPSAoc3RydWN0IGRlYnVnX3NldF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcyk7Ci0gIG1lbXNldCAocywgMCwgc2l6ZW9mICpzKTsKLQotICBzLT50eXBlID0gdHlwZTsKLSAgcy0+Yml0c3RyaW5ncCA9IGJpdHN0cmluZ3A7Ci0KLSAgdC0+dS5rc2V0ID0gczsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHR5cGUgZm9yIGEgcG9pbnRlciB3aGljaCBpcyByZWxhdGl2ZSB0byBhbiBvYmplY3QuICBUaGUKLSAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoZSBwb2ludGVyIGlzCi0gICByZWxhdGl2ZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSB0aGF0IHRoZSBwb2ludGVyIHBvaW50cwotICAgdG8uICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX29mZnNldF90eXBlIChoYW5kbGUsIGJhc2VfdHlwZSwgdGFyZ2V0X3R5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgYmFzZV90eXBlOwotICAgICBkZWJ1Z190eXBlIHRhcmdldF90eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX29mZnNldF90eXBlICpvOwotCi0gIGlmIChiYXNlX3R5cGUgPT0gTlVMTCB8fCB0YXJnZXRfdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9PRkZTRVQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgbyA9IChzdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpvKTsKLSAgbWVtc2V0IChvLCAwLCBzaXplb2YgKm8pOwotCi0gIG8tPmJhc2VfdHlwZSA9IGJhc2VfdHlwZTsKLSAgby0+dGFyZ2V0X3R5cGUgPSB0YXJnZXRfdHlwZTsKLQotICB0LT51LmtvZmZzZXQgPSBvOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgdHlwZSBmb3IgYSBtZXRob2QgZnVuY3Rpb24uICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQotICAgcmV0dXJuIHR5cGUsIHRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgZG9tYWluLCBhbmQgdGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX21ldGhvZF90eXBlIChoYW5kbGUsIHJldHVybl90eXBlLCBkb21haW5fdHlwZSwgYXJnX3R5cGVzLCB2YXJhcmdzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotICAgICBkZWJ1Z190eXBlIGRvbWFpbl90eXBlOwotICAgICBkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSAqbTsKLQotICBpZiAocmV0dXJuX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfTUVUSE9ELCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbSk7Ci0gIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKLQotICBtLT5yZXR1cm5fdHlwZSA9IHJldHVybl90eXBlOwotICBtLT5kb21haW5fdHlwZSA9IGRvbWFpbl90eXBlOwotICBtLT5hcmdfdHlwZXMgPSBhcmdfdHlwZXM7Ci0gIG0tPnZhcmFyZ3MgPSB2YXJhcmdzOwotCi0gIHQtPnUua21ldGhvZCA9IG07Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdmVyc2lvbiBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9DT05TVCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51Lmtjb25zdCA9IHR5cGU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSB2b2xhdGlsZSBxdWFsaWZpZWQgdmVyc2lvbiBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9WT0xBVElMRSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51Lmt2b2xhdGlsZSA9IHR5cGU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gdW5kZWZpbmVkIHRhZ2dlZCB0eXBlLiAgRm9yIGV4YW1wbGUsIGEgc3RydWN0IHdoaWNoIGhhcwotICAgYmVlbiBtZW50aW9uZWQsIGJ1dCBub3QgZGVmaW5lZC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfdW5kZWZpbmVkX3RhZ2dlZF90eXBlIChoYW5kbGUsIG5hbWUsIGtpbmQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgotICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgY2FzZSBERUJVR19LSU5EX0VOVU06Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfbWFrZV91bmRlZmluZWRfdHlwZTogdW5zdXBwb3J0ZWQga2luZCIpKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIGtpbmQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgcmV0dXJuIGRlYnVnX3RhZ190eXBlIChoYW5kbGUsIG5hbWUsIHQpOwotfQotCi0vKiBNYWtlIGEgYmFzZSBjbGFzcyBmb3IgYW4gb2JqZWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgYmFzZQotICAgY2xhc3MgdHlwZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgYml0IHBvc2l0aW9uIG9mIHRoaXMgYmFzZQotICAgY2xhc3MgaW4gdGhlIG9iamVjdCAoYWx3YXlzIDAgdW5sZXNzIGRvaW5nIG11bHRpcGxlIGluaGVyaXRhbmNlKS4KLSAgIFRoZSBmb3VydGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzIGEgdmlydHVhbCBjbGFzcy4gIFRoZSBmaWZ0aAotICAgYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX2Jhc2VjbGFzcwotZGVidWdfbWFrZV9iYXNlY2xhc3MgKGhhbmRsZSwgdHlwZSwgYml0cG9zLCB2aXJ0dWFsLCB2aXNpYmlsaXR5KQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJvb2xlYW4gdmlydHVhbDsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17ICAgICAKLSAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqYjsKLQotICBiID0gKHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKLSAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOwotCi0gIGItPnR5cGUgPSB0eXBlOwotICBiLT5iaXRwb3MgPSBiaXRwb3M7Ci0gIGItPnZpcnR1YWwgPSB2aXJ0dWFsOwotICBiLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gYjsKLX0KLQotLyogTWFrZSBhIGZpZWxkIGZvciBhIHN0cnVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUuICBUaGUKLSAgIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMKLSAgIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIGZpZWxkLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mCi0gICB0aGUgZmllbGQgKGl0IG1heSBiZSB6ZXJvKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eQotICAgb2YgdGhlIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19maWVsZAotZGVidWdfbWFrZV9maWVsZCAoaGFuZGxlLCBuYW1lLCB0eXBlLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5uYW1lID0gbmFtZTsKLSAgZi0+dHlwZSA9IHR5cGU7Ci0gIGYtPnN0YXRpY19tZW1iZXIgPSBmYWxzZTsKLSAgZi0+dS5mLmJpdHBvcyA9IGJpdHBvczsKLSAgZi0+dS5mLmJpdHNpemUgPSBiaXRzaXplOwotICBmLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gZjsKLX0KLQotLyogTWFrZSBhIHN0YXRpYyBtZW1iZXIgb2YgYW4gb2JqZWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUKLSAgIG5hbWUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIG1lbWJlci4gIFRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBtZW1iZXIgKGkuZS4sIHRoZSBuYW1lIGFzIGEKLSAgIGdsb2JhbCB2YXJpYWJsZSkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlCi0gICBtZW1iZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX2ZpZWxkCi1kZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIgKGhhbmRsZSwgbmFtZSwgdHlwZSwgcGh5c25hbWUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKLQotICBmID0gKHN0cnVjdCBkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+bmFtZSA9IG5hbWU7Ci0gIGYtPnR5cGUgPSB0eXBlOwotICBmLT5zdGF0aWNfbWVtYmVyID0gdHJ1ZTsKLSAgZi0+dS5zLnBoeXNuYW1lID0gcGh5c25hbWU7Ci0gIGYtPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OwotCi0gIHJldHVybiBmOwotfQotCi0vKiBNYWtlIGEgbWV0aG9kLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZSwgYW5kIHRoZSB0aGlyZAotICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbWV0aG9kIHZhcmlhbnRzLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19tZXRob2QKLWRlYnVnX21ha2VfbWV0aG9kIChoYW5kbGUsIG5hbWUsIHZhcmlhbnRzKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX21ldGhvZF92YXJpYW50ICp2YXJpYW50czsKLXsKLSAgc3RydWN0IGRlYnVnX21ldGhvZCAqbTsKLQotICBtID0gKHN0cnVjdCBkZWJ1Z19tZXRob2QgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPm5hbWUgPSBuYW1lOwotICBtLT52YXJpYW50cyA9IHZhcmlhbnRzOwotCi0gIHJldHVybiBtOwotfQotCi0vKiBNYWtlIGEgbWV0aG9kIGFyZ3VtZW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcmVhbCBuYW1lIG9mCi0gICB0aGUgZnVuY3Rpb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgVGhlCi0gICBmb3VydGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgd2hldGhlcgotICAgdGhpcyBpcyBhIGNvbnN0IGZ1bmN0aW9uLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhCi0gICB2b2xhdGlsZSBmdW5jdGlvbi4gIFRoZSBzZXZlbnRoIGFyZ3VtZW50IGlzIHRoZSBvZmZzZXQgaW4gdGhlCi0gICB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLCBpZiBhbnkuICBUaGUgZWlnaHRoIGFyZ3VtZW50IGlzIHRoZSB2aXJ0dWFsCi0gICBmdW5jdGlvbiBjb250ZXh0LiAgRklYTUU6IEFyZSB0aGUgY29uc3QgYW5kIHZvbGF0aWxlIGFyZ3VtZW50cwotICAgbmVjZXNzYXJ5PyAgQ291bGQgd2UganVzdCB1c2UgZGVidWdfbWFrZV9jb25zdF90eXBlPyAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19tZXRob2RfdmFyaWFudAotZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCAoaGFuZGxlLCBwaHlzbmFtZSwgdHlwZSwgdmlzaWJpbGl0eSwgY29uc3RwLAotCQkJICAgdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0KQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgZGVidWdfdHlwZSBjb250ZXh0OwotewotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKm07Ci0KLSAgbSA9IChzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPnBoeXNuYW1lID0gcGh5c25hbWU7Ci0gIG0tPnR5cGUgPSB0eXBlOwotICBtLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLSAgbS0+Y29uc3RwID0gY29uc3RwOwotICBtLT52b2xhdGlsZXAgPSB2b2xhdGlsZXA7Ci0gIG0tPnZvZmZzZXQgPSB2b2Zmc2V0OwotICBtLT5jb250ZXh0ID0gY29udGV4dDsKLQotICByZXR1cm4gbTsKLX0KLQotLyogTWFrZSBhIHN0YXRpYyBtZXRob2QgYXJndW1lbnQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IKLSAgIGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmUgb21pdHRlZAotICAgc2luY2UgYSBzdGF0aWMgbWV0aG9kIGNhbiBub3QgYWxzbyBiZSB2aXJ0dWFsLiAgKi8KLQotZGVidWdfbWV0aG9kX3ZhcmlhbnQKLWRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50IChoYW5kbGUsIHBoeXNuYW1lLCB0eXBlLCB2aXNpYmlsaXR5LAotCQkJCSAgY29uc3RwLCB2b2xhdGlsZXApCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLXsKLSAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICptOwotCi0gIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICopIHhtYWxsb2MgKHNpemVvZiAqbSk7Ci0gIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKLQotICBtLT5waHlzbmFtZSA9IHBoeXNuYW1lOwotICBtLT50eXBlID0gdHlwZTsKLSAgbS0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0gIG0tPmNvbnN0cCA9IGNvbnN0cDsKLSAgbS0+dm9sYXRpbGVwID0gdm9sYXRpbGVwOwotICBtLT52b2Zmc2V0ID0gVk9GRlNFVF9TVEFUSUNfTUVUSE9EOwotCi0gIHJldHVybiBtOwotfQotCi0vKiBOYW1lIGEgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX25hbWVfdHlwZSAoaGFuZGxlLCBuYW1lLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqbjsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm5tOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfbmFtZV90eXBlOiBubyBjdXJyZW50IGZpbGUiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX05BTUVELCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIG4gPSAoc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOwotCi0gIG4tPnR5cGUgPSB0eXBlOwotCi0gIHQtPnUua25hbWVkID0gbjsKLQotICAvKiBXZSBhbHdheXMgYWRkIHRoZSBuYW1lIHRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgVGhpcyBpcyBwcm9iYWJseQotICAgICB3cm9uZyBpbiBzb21lIGNhc2VzLCBidXQgaXQgc2VlbXMgdG8gYmUgcmlnaHQgZm9yIHN0YWJzLiAgRklYTUUuICAqLwotCi0gIG5tID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFscywgbmFtZSwKLQkJCSAgICAgICBERUJVR19PQkpFQ1RfVFlQRSwgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG5tID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBubS0+dS50eXBlID0gdDsKLQotICBuLT5uYW1lID0gbm07Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIFRhZyBhIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z190YWdfdHlwZSAoaGFuZGxlLCBuYW1lLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqbjsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm5tOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z190YWdfdHlwZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAodHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsIG5hbWUpID09IDApCi0JcmV0dXJuIHR5cGU7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfdGFnX3R5cGU6IGV4dHJhIHRhZyBhdHRlbXB0ZWQiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1RBR0dFRCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBuID0gKHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG1lbXNldCAobiwgMCwgc2l6ZW9mICpuKTsKLQotICBuLT50eXBlID0gdHlwZTsKLQotICB0LT51LmtuYW1lZCA9IG47Ci0KLSAgLyogV2Uga2VlcCBhIGdsb2JhbCBuYW1lc3BhY2Ugb2YgdGFncyBmb3IgZWFjaCBjb21waWxhdGlvbiB1bml0LiAgSQotICAgICBkb24ndCBrbm93IGlmIHRoYXQgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiAgKi8KLQotICBubSA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHMsIG5hbWUsCi0JCQkgICAgICAgREVCVUdfT0JKRUNUX1RBRywgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG5tID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBubS0+dS50YWcgPSB0OwotCi0gIG4tPm5hbWUgPSBubTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogUmVjb3JkIHRoZSBzaXplIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotZGVidWdfcmVjb3JkX3R5cGVfc2l6ZSAoaGFuZGxlLCB0eXBlLCBzaXplKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGlmICh0eXBlLT5zaXplICE9IDAgJiYgdHlwZS0+c2l6ZSAhPSBzaXplKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiV2FybmluZzogY2hhbmdpbmcgdHlwZSBzaXplIGZyb20gJWQgdG8gJWRcbiIpLAotCSAgICAgdHlwZS0+c2l6ZSwgc2l6ZSk7Ci0KLSAgdHlwZS0+c2l6ZSA9IHNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmQgYSBuYW1lZCB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfZmluZF9uYW1lZF90eXBlIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYjsKLSAgc3RydWN0IGRlYnVnX2ZpbGUgKmY7Ci0KLSAgLyogV2Ugb25seSBzZWFyY2ggdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gIEkgZG9uJ3Qga25vdyBpZgotICAgICB0aGlzIGlzIHJpZ2h0IG9yIG5vdC4gICovCi0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19maW5kX25hbWVkX3R5cGU6IG5vIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCIpKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGZvciAoYiA9IGluZm8tPmN1cnJlbnRfYmxvY2s7IGIgIT0gTlVMTDsgYiA9IGItPnBhcmVudCkKLSAgICB7Ci0gICAgICBpZiAoYi0+bG9jYWxzICE9IE5VTEwpCi0JewotCSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLQkgIGZvciAobiA9IGItPmxvY2Fscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChuLT5raW5kID09IERFQlVHX09CSkVDVF9UWVBFCi0JCSAgJiYgbi0+bmFtZVswXSA9PSBuYW1lWzBdCi0JCSAgJiYgc3RyY21wIChuLT5uYW1lLCBuYW1lKSA9PSAwKQotCQlyZXR1cm4gbi0+dS50eXBlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBmb3IgKGYgPSBpbmZvLT5jdXJyZW50X3VuaXQtPmZpbGVzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5nbG9iYWxzICE9IE5VTEwpCi0JewotCSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLQkgIGZvciAobiA9IGYtPmdsb2JhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAobi0+a2luZCA9PSBERUJVR19PQkpFQ1RfVFlQRQotCQkgICYmIG4tPm5hbWVbMF0gPT0gbmFtZVswXQotCQkgICYmIHN0cmNtcCAobi0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJcmV0dXJuIG4tPnUudHlwZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsJICAKLX0KLQotLyogRmluZCBhIHRhZ2dlZCB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfZmluZF90YWdnZWRfdHlwZSAoaGFuZGxlLCBuYW1lLCBraW5kKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdW5pdCAqdTsKLQotICAvKiBXZSBzZWFyY2ggdGhlIGdsb2JhbHMgb2YgYWxsIHRoZSBjb21waWxhdGlvbiB1bml0cy4gIEkgZG9uJ3Qga25vdwotICAgICBpZiB0aGlzIGlzIGNvcnJlY3Qgb3Igbm90LiAgSXQgd291bGQgYmUgZWFzeSB0byBjaGFuZ2UuICAqLwotCi0gIGZvciAodSA9IGluZm8tPnVuaXRzOyB1ICE9IE5VTEw7IHUgPSB1LT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19maWxlICpmOwotCi0gICAgICBmb3IgKGYgPSB1LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotCSAgaWYgKGYtPmdsb2JhbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAobiA9IGYtPmdsb2JhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JCXsKLQkJICBpZiAobi0+a2luZCA9PSBERUJVR19PQkpFQ1RfVEFHCi0JCSAgICAgICYmIChraW5kID09IERFQlVHX0tJTkRfSUxMRUdBTAotCQkJICB8fCBuLT51LnRhZy0+a2luZCA9PSBraW5kKQotCQkgICAgICAmJiBuLT5uYW1lWzBdID09IG5hbWVbMF0KLQkJICAgICAgJiYgc3RyY21wIChuLT5uYW1lLCBuYW1lKSA9PSAwKQotCQkgICAgcmV0dXJuIG4tPnUudGFnOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci19Ci0KLS8qIEdldCBhIGJhc2UgdHlwZS4gIFdlIGJ1aWxkIGEgbGlua2VkIGxpc3Qgb24gdGhlIHN0YWNrIHRvIGF2b2lkCi0gICBjcmFzaGluZyBpZiB0aGUgdHlwZSBpcyBkZWZpbmVkIGNpcmN1bGFybHkuICAqLwotCi1zdGF0aWMgc3RydWN0IGRlYnVnX3R5cGUgKgotZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBsaXN0KQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdCAqbGlzdDsKLXsKLSAgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0ICpsOwotICBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3Qgcmw7Ci0KLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHR5cGU7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfSU5ESVJFQ1Q6Ci0gICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgotICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZm9yIChsID0gbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobC0+dCA9PSB0eXBlKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgXygiZGVidWdfZ2V0X3JlYWxfdHlwZTogY2lyY3VsYXIgZGVidWcgaW5mb3JtYXRpb24gZm9yICVzXG4iKSwKLQkJICAgZGVidWdfZ2V0X3R5cGVfbmFtZSAoaGFuZGxlLCB0eXBlKSk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHJsLm5leHQgPSBsaXN0OwotICBybC50ID0gdHlwZTsKLQotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgICAgLyogVGhlIGRlZmF1bHQgY2FzZSBpcyBqdXN0IGhlcmUgdG8gYXZvaWQgd2FybmluZ3MuICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX0lORElSRUNUOgotICAgICAgaWYgKCp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCAhPSBOVUxMKQotCXJldHVybiBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsICp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCwgJnJsKTsKLSAgICAgIHJldHVybiB0eXBlOwotICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgotICAgICAgcmV0dXJuIGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPnR5cGUsICZybCk7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBHZXQgdGhlIGtpbmQgb2YgYSB0eXBlLiAgKi8KLQotZW51bSBkZWJ1Z190eXBlX2tpbmQKLWRlYnVnX2dldF90eXBlX2tpbmQgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19LSU5EX0lMTEVHQUw7Ci0gIHR5cGUgPSBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUsIE5VTEwpOwotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19LSU5EX0lMTEVHQUw7Ci0gIHJldHVybiB0eXBlLT5raW5kOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSB0eXBlLiAgKi8KLQotY29uc3QgY2hhciAqCi1kZWJ1Z19nZXRfdHlwZV9uYW1lIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9JTkRJUkVDVCkKLSAgICB7Ci0gICAgICBpZiAoKnR5cGUtPnUua2luZGlyZWN0LT5zbG90ICE9IE5VTEwpCi0JcmV0dXJuIGRlYnVnX2dldF90eXBlX25hbWUgKGhhbmRsZSwgKnR5cGUtPnUua2luZGlyZWN0LT5zbG90KTsKLSAgICAgIHJldHVybiB0eXBlLT51LmtpbmRpcmVjdC0+dGFnOwotICAgIH0KLSAgaWYgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9OQU1FRAotICAgICAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRCkKLSAgICByZXR1cm4gdHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWU7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHZXQgdGhlIHNpemUgb2YgYSB0eXBlLiAgKi8KLQotYmZkX3ZtYQotZGVidWdfZ2V0X3R5cGVfc2l6ZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV2UgZG9uJ3QgY2FsbCBkZWJ1Z19nZXRfcmVhbF90eXBlLCBiZWNhdXNlIHNvbWVib2R5IG1pZ2h0IGhhdmUKLSAgICAgY2FsbGVkIGRlYnVnX3JlY29yZF90eXBlX3NpemUgb24gYSBuYW1lZCBvciBpbmRpcmVjdCB0eXBlLiAgKi8KLQotICBpZiAodHlwZS0+c2l6ZSAhPSAwKQotICAgIHJldHVybiB0eXBlLT5zaXplOwotCi0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgREVCVUdfS0lORF9JTkRJUkVDVDoKLSAgICAgIGlmICgqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QgIT0gTlVMTCkKLQlyZXR1cm4gZGVidWdfZ2V0X3R5cGVfc2l6ZSAoaGFuZGxlLCAqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgotICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6Ci0gICAgICByZXR1cm4gZGVidWdfZ2V0X3R5cGVfc2l6ZSAoaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+dHlwZSk7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBHZXQgdGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19nZXRfcmV0dXJuX3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gIHR5cGUgPSBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUsIE5VTEwpOwotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OOgotICAgICAgcmV0dXJuIHR5cGUtPnUua2Z1bmN0aW9uLT5yZXR1cm5fdHlwZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfTUVUSE9EOgotICAgICAgcmV0dXJuIHR5cGUtPnUua21ldGhvZC0+cmV0dXJuX3R5cGU7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLyAgICAgIAotfQotCi0vKiBHZXQgdGhlIHBhcmFtZXRlciB0eXBlcyBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlIChleGNlcHQgdGhhdAotICAgd2UgZG9uJ3QgY3VycmVudGx5IHN0b3JlIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgYSBmdW5jdGlvbikuICAqLwotCi1jb25zdCBkZWJ1Z190eXBlICoKLWRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMgKGhhbmRsZSwgdHlwZSwgcHZhcmFyZ3MpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYm9vbGVhbiAqcHZhcmFyZ3M7Ci17Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHR5cGUgPSBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUsIE5VTEwpOwotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIERFQlVHX0tJTkRfRlVOQ1RJT046Ci0gICAgICAqcHZhcmFyZ3MgPSB0eXBlLT51LmtmdW5jdGlvbi0+dmFyYXJnczsKLSAgICAgIHJldHVybiB0eXBlLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzOwotICAgIGNhc2UgREVCVUdfS0lORF9NRVRIT0Q6Ci0gICAgICAqcHZhcmFyZ3MgPSB0eXBlLT51LmttZXRob2QtPnZhcmFyZ3M7Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rbWV0aG9kLT5hcmdfdHlwZXM7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBHZXQgdGhlIHRhcmdldCB0eXBlIG9mIGEgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX2dldF90YXJnZXRfdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHR5cGUgPSBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUsIE5VTEwpOwotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIERFQlVHX0tJTkRfUE9JTlRFUjoKLSAgICAgIHJldHVybiB0eXBlLT51Lmtwb2ludGVyOwotICAgIGNhc2UgREVCVUdfS0lORF9SRUZFUkVOQ0U6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rcmVmZXJlbmNlOwotICAgIGNhc2UgREVCVUdfS0lORF9DT05TVDoKLSAgICAgIHJldHVybiB0eXBlLT51Lmtjb25zdDsKLSAgICBjYXNlIERFQlVHX0tJTkRfVk9MQVRJTEU6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rdm9sYXRpbGU7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBHZXQgdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMgZm9yIGEgc3RydWN0LCB1bmlvbiwgb3IKLSAgIGNsYXNzLiAgKi8KLQotY29uc3QgZGVidWdfZmllbGQgKgotZGVidWdfZ2V0X2ZpZWxkcyAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHR5cGUgPSBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUsIE5VTEwpOwotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotICAgICAgcmV0dXJuIHR5cGUtPnUua2NsYXNzLT5maWVsZHM7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBHZXQgdGhlIHR5cGUgb2YgYSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotZGVidWdfdHlwZQotZGVidWdfZ2V0X2ZpZWxkX3R5cGUgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gZmllbGQtPnR5cGU7Ci19Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1jb25zdCBjaGFyICoKLWRlYnVnX2dldF9maWVsZF9uYW1lIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGZpZWxkLT5uYW1lOwotfQotCi0vKiBHZXQgdGhlIGJpdCBwb3NpdGlvbiBvZiBhIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1iZmRfdm1hCi1kZWJ1Z19nZXRfZmllbGRfYml0cG9zIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCB8fCBmaWVsZC0+c3RhdGljX21lbWJlcikKLSAgICByZXR1cm4gKGJmZF92bWEpIC0xOwotICByZXR1cm4gZmllbGQtPnUuZi5iaXRwb3M7Ci19Ci0KLS8qIEdldCB0aGUgYml0IHNpemUgb2YgYSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotYmZkX3ZtYQotZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMIHx8IGZpZWxkLT5zdGF0aWNfbWVtYmVyKQotICAgIHJldHVybiAoYmZkX3ZtYSkgLTE7Ci0gIHJldHVybiBmaWVsZC0+dS5mLmJpdHNpemU7Ci19Ci0KLS8qIEdldCB0aGUgdmlzaWJpbGl0eSBvZiBhIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1lbnVtIGRlYnVnX3Zpc2liaWxpdHkKLWRlYnVnX2dldF9maWVsZF92aXNpYmlsaXR5IChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVklTSUJJTElUWV9JR05PUkU7Ci0gIHJldHVybiBmaWVsZC0+dmlzaWJpbGl0eTsKLX0KLQotLyogR2V0IHRoZSBwaHlzaWNhbCBuYW1lIG9mIGEgZmllbGQuICAqLwotCi1jb25zdCBjaGFyICoKLWRlYnVnX2dldF9maWVsZF9waHlzbmFtZSAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwgfHwgISBmaWVsZC0+c3RhdGljX21lbWJlcikKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGZpZWxkLT51LnMucGh5c25hbWU7Ci19Ci0MCi0vKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgZ2l2ZW4gYSBoYW5kbGUgdG8KLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgYW5kIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNhbGwuICAqLwotCi1ib29sZWFuCi1kZWJ1Z193cml0ZSAoaGFuZGxlLCBmbnMsIGZoYW5kbGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z191bml0ICp1OwotCi0gIC8qIFdlIHVzZSBhIG1hcmsgdG8gdGVsbCB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCBhCi0gICAgIHBhcnRpY3VsYXIgbmFtZS4gIFdlIHVzZSBhbiBpbnRlZ2VyLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8KLSAgICAgY2xlYXIgdGhlIG1hcmsgZmllbGRzIGlmIHdlIGhhcHBlbiB0byB3cml0ZSBvdXQgdGhlIHNhbWUKLSAgICAgaW5mb3JtYXRpb24gbW9yZSB0aGFuIG9uY2UuICAqLwotICArK2luZm8tPm1hcms7Ci0KLSAgLyogVGhlIGJhc2VfaWQgZmllbGQgaG9sZHMgYW4gSUQgdmFsdWUgd2hpY2ggd2lsbCBuZXZlciBiZSB1c2VkLCBzbwotICAgICB0aGF0IHdlIGNhbiB0ZWxsIHdoZXRoZXIgd2UgaGF2ZSBhc3NpZ25lZCBhbiBJRCBkdXJpbmcgdGhpcyBjYWxsCi0gICAgIHRvIGRlYnVnX3dyaXRlLiAgKi8KLSAgaW5mby0+YmFzZV9pZCA9IGluZm8tPmNsYXNzX2lkOwotCi0gIC8qIFdlIGtlZXAgYSBsaW5rZWQgbGlzdCBvZiBjbGFzc2VzIGZvciB3aGljaCB3YXMgaGF2ZSBhc3NpZ25lZCBJRCdzCi0gICAgIGR1cmluZyB0aGlzIGNhbGwgdG8gZGVidWdfd3JpdGUuICAqLwotICBpbmZvLT5pZF9saXN0ID0gTlVMTDsKLQotICBmb3IgKHUgPSBpbmZvLT51bml0czsgdSAhPSBOVUxMOyB1ID0gdS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfZmlsZSAqZjsKLSAgICAgIGJvb2xlYW4gZmlyc3RfZmlsZTsKLQotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm8gPSB1LT5saW5lbm9zOwotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXggPSAwOwotCi0gICAgICBpZiAoISAoKmZucy0+c3RhcnRfY29tcGlsYXRpb25fdW5pdCkgKGZoYW5kbGUsIHUtPmZpbGVzLT5maWxlbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmaXJzdF9maWxlID0gdHJ1ZTsKLSAgICAgIGZvciAoZiA9IHUtPmZpbGVzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0JICBpZiAoZmlyc3RfZmlsZSkKLQkgICAgZmlyc3RfZmlsZSA9IGZhbHNlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X3NvdXJjZSkgKGZoYW5kbGUsIGYtPmZpbGVuYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChmLT5nbG9iYWxzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKG4gPSBmLT5nbG9iYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQl7Ci0JCSAgaWYgKCEgZGVidWdfd3JpdGVfbmFtZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBPdXRwdXQgYW55IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdoaWNoIGhhc24ndCBhbHJlYWR5IGJlZW4KLSAgICAgICAgIGhhbmRsZWQuICAqLwotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCAoYmZkX3ZtYSkgLTEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBlbGVtZW50IGluIGEgbmFtZXNwYWNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX25hbWUgKGluZm8sIGZucywgZmhhbmRsZSwgbikKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci17Ci0gIHN3aXRjaCAobi0+a2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfVFlQRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgbi0+dS50eXBlLCBuKQotCSAgfHwgISAoKmZucy0+dHlwZGVmKSAoZmhhbmRsZSwgbi0+bmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfVEFHOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT51LnRhZywgbikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT50YWcpIChmaGFuZGxlLCBuLT5uYW1lKTsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9WQVJJQUJMRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgbi0+dS52YXJpYWJsZS0+dHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnZhcmlhYmxlKSAoZmhhbmRsZSwgbi0+bmFtZSwgbi0+dS52YXJpYWJsZS0+a2luZCwKLQkJCSAgICAgICBuLT51LnZhcmlhYmxlLT52YWwpOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX0ZVTkNUSU9OOgotICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX2Z1bmN0aW9uIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPm5hbWUsCi0JCQkJICAgbi0+bGlua2FnZSwgbi0+dS5mdW5jdGlvbik7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfSU5UX0NPTlNUQU5UOgotICAgICAgcmV0dXJuICgqZm5zLT5pbnRfY29uc3RhbnQpIChmaGFuZGxlLCBuLT5uYW1lLCBuLT51LmludF9jb25zdGFudCk7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQ6Ci0gICAgICByZXR1cm4gKCpmbnMtPmZsb2F0X2NvbnN0YW50KSAoZmhhbmRsZSwgbi0+bmFtZSwgbi0+dS5mbG9hdF9jb25zdGFudCk7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQ6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudHlwZWRfY29uc3RhbnQtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT50eXBlZF9jb25zdGFudCkgKGZoYW5kbGUsIG4tPm5hbWUsCi0JCQkJICAgICBuLT51LnR5cGVkX2NvbnN0YW50LT52YWwpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIFdyaXRlIG91dCBhIHR5cGUuICBJZiB0aGUgdHlwZSBpcyBERUJVR19LSU5EX05BTUVEIG9yCi0gICBERUJVR19LSU5EX1RBR0dFRCwgdGhlbiB0aGUgbmFtZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBmb3Igd2hpY2ggd2UKLSAgIGFyZSBhYm91dCB0byBjYWxsIHR5cGVkZWYgb3IgdGFnLiAgSWYgdGhlIHR5cGUgaXMgYW55dGhpbmcgZWxzZSwKLSAgIHRoZW4gdGhlIG5hbWUgYXJndW1lbnQgaXMgYSB0YWcgZnJvbSBhIERFQlVHX0tJTkRfVEFHR0VEIHR5cGUgd2hpY2gKLSAgIHBvaW50cyB0byB0aGlzIG9uZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUsIG5hbWUpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotICAgICBzdHJ1Y3QgZGVidWdfbmFtZSAqbmFtZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBpczsKLSAgY29uc3QgY2hhciAqdGFnID0gTlVMTDsKLQotICAvKiBJZiB3ZSBoYXZlIGEgbmFtZSBmb3IgdGhpcyB0eXBlLCBqdXN0IG91dHB1dCBpdC4gIFdlIG9ubHkgb3V0cHV0Ci0gICAgIHR5cGVkZWYgbmFtZXMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZGVmaW5lZC4gIFdlIG91dHB1dCB0eXBlIHRhZ3MKLSAgICAgd2hlbmV2ZXIgd2UgYXJlIG5vdCBhY3R1YWxseSBkZWZpbmluZyB0aGVtLiAgKi8KLSAgaWYgKCh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQotICAgICAgJiYgKHR5cGUtPnUua25hbWVkLT5uYW1lLT5tYXJrID09IGluZm8tPm1hcmsKLQkgIHx8ICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VECi0JICAgICAgJiYgdHlwZS0+dS5rbmFtZWQtPm5hbWUgIT0gbmFtZSkpKQotICAgIHsKLSAgICAgIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQpCi0JcmV0dXJuICgqZm5zLT50eXBlZGVmX3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGRlYnVnX3R5cGUgKnJlYWw7Ci0JICB1bnNpZ25lZCBpbnQgaWQ7Ci0KLQkgIHJlYWwgPSBkZWJ1Z19nZXRfcmVhbF90eXBlICgoUFRSKSBpbmZvLCB0eXBlLCBOVUxMKTsKLQkgIGlmIChyZWFsID09IE5VTEwpCi0JICAgIHJldHVybiAoKmZucy0+ZW1wdHlfdHlwZSkgKGZoYW5kbGUpOwotCSAgaWQgPSAwOwotCSAgaWYgKChyZWFsLT5raW5kID09IERFQlVHX0tJTkRfU1RSVUNUCi0JICAgICAgIHx8IHJlYWwtPmtpbmQgPT0gREVCVUdfS0lORF9VTklPTgotCSAgICAgICB8fCByZWFsLT5raW5kID09IERFQlVHX0tJTkRfQ0xBU1MKLQkgICAgICAgfHwgcmVhbC0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OX0NMQVNTKQotCSAgICAgICYmIHJlYWwtPnUua2NsYXNzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAocmVhbC0+dS5rY2xhc3MtPmlkIDw9IGluZm8tPmJhc2VfaWQpCi0JCXsKLQkJICBpZiAoISBkZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sCi0JCQkJCSAgICB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSwKLQkJCQkJICAgIHJlYWwpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgaWQgPSByZWFsLT51LmtjbGFzcy0+aWQ7Ci0JICAgIH0KLQotCSAgcmV0dXJuICgqZm5zLT50YWdfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lLCBpZCwKLQkJCQkgICByZWFsLT5raW5kKTsKLQl9Ci0gICAgfQotCi0gIC8qIE1hcmsgdGhlIG5hbWUgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5IGxvb2tlZCBmb3IgYSBrbm93biBuYW1lLCBzbwotICAgICB0aGF0IHdlIGRvbid0IGp1c3QgZGVmaW5lIGEgdHlwZSBpbiB0ZXJtcyBvZiBpdHNlbGYuICBXZSBuZWVkIHRvCi0gICAgIG1hcmsgdGhlIG5hbWUgaGVyZSBzbyB0aGF0IGEgc3RydWN0IGNvbnRhaW5pbmcgYSBwb2ludGVyIHRvCi0gICAgIGl0c2VsZiB3aWxsIHdvcmsuICAqLwotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIG5hbWUtPm1hcmsgPSBpbmZvLT5tYXJrOwotCi0gIGlmIChuYW1lICE9IE5VTEwKLSAgICAgICYmIHR5cGUtPmtpbmQgIT0gREVCVUdfS0lORF9OQU1FRAotICAgICAgJiYgdHlwZS0+a2luZCAhPSBERUJVR19LSU5EX1RBR0dFRCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKG5hbWUtPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RBRyk7Ci0gICAgICB0YWcgPSBuYW1lLT5uYW1lOwotICAgIH0KLQotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfS0lORF9JTExFR0FMOgotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3dyaXRlX3R5cGU6IGlsbGVnYWwgdHlwZSBlbmNvdW50ZXJlZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5ESVJFQ1Q6Ci0gICAgICBpZiAoKnR5cGUtPnUua2luZGlyZWN0LT5zbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gKCpmbnMtPmVtcHR5X3R5cGUpIChmaGFuZGxlKTsKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsICp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCwKLQkJCSAgICAgICBuYW1lKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfVk9JRDoKLSAgICAgIHJldHVybiAoKmZucy0+dm9pZF90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0lOVDoKLSAgICAgIHJldHVybiAoKmZucy0+aW50X3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplLCB0eXBlLT51LmtpbnQpOwotICAgIGNhc2UgREVCVUdfS0lORF9GTE9BVDoKLSAgICAgIHJldHVybiAoKmZucy0+ZmxvYXRfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnNpemUpOwotICAgIGNhc2UgREVCVUdfS0lORF9DT01QTEVYOgotICAgICAgcmV0dXJuICgqZm5zLT5jb21wbGV4X3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQk9PTDoKLSAgICAgIHJldHVybiAoKmZucy0+Ym9vbF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+c2l6ZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTCkKLQl7Ci0JICBpZiAodHlwZS0+dS5rY2xhc3MtPmlkIDw9IGluZm8tPmJhc2VfaWQpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sIHRhZywgdHlwZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoaW5mby0+bWFyayA9PSB0eXBlLT51LmtjbGFzcy0+bWFyaykKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBjdXJyZW50bHkgb3V0cHV0dGluZyB0aGlzIHN0cnVjdCwgb3Igd2UgaGF2ZQotCQkgYWxyZWFkeSBvdXRwdXQgaXQuICBJIGRvbid0IGtub3cgaWYgdGhpcyBjYW4gaGFwcGVuLAotCQkgYnV0IGl0IGNhbiBoYXBwZW4gZm9yIGEgY2xhc3MuICAqLwotCSAgICAgIGFzc2VydCAodHlwZS0+dS5rY2xhc3MtPmlkID4gaW5mby0+YmFzZV9pZCk7Ci0JICAgICAgcmV0dXJuICgqZm5zLT50YWdfdHlwZSkgKGZoYW5kbGUsIHRhZywgdHlwZS0+dS5rY2xhc3MtPmlkLAotCQkJCSAgICAgICB0eXBlLT5raW5kKTsKLQkgICAgfQotCSAgdHlwZS0+dS5rY2xhc3MtPm1hcmsgPSBpbmZvLT5tYXJrOwotCX0KLQotICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X3N0cnVjdF90eXBlKSAoZmhhbmRsZSwgdGFnLAotCQkJCSAgICAgICAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTAotCQkJCQk/IHR5cGUtPnUua2NsYXNzLT5pZAotCQkJCQk6IDApLAotCQkJCSAgICAgICB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfU1RSVUNULAotCQkJCSAgICAgICB0eXBlLT5zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTAotCSAgJiYgdHlwZS0+dS5rY2xhc3MtPmZpZWxkcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV0gIT0gTlVMTDsgaSsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0JICAgICAgZiA9IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV07Ci0JICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBmLT50eXBlLAotCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQotCQkgIHx8ICEgKCpmbnMtPnN0cnVjdF9maWVsZCkgKGZoYW5kbGUsIGYtPm5hbWUsIGYtPnUuZi5iaXRwb3MsCi0JCQkJCSAgICAgZi0+dS5mLmJpdHNpemUsIGYtPnZpc2liaWxpdHkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gKCpmbnMtPmVuZF9zdHJ1Y3RfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfY2xhc3NfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLCB0YWcpOwotICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgotICAgICAgaWYgKHR5cGUtPnUua2VudW0gPT0gTlVMTCkKLQlyZXR1cm4gKCpmbnMtPmVudW1fdHlwZSkgKGZoYW5kbGUsIHRhZywgKGNvbnN0IGNoYXIgKiopIE5VTEwsCi0JCQkJICAoYmZkX3NpZ25lZF92bWEgKikgTlVMTCk7Ci0gICAgICByZXR1cm4gKCpmbnMtPmVudW1fdHlwZSkgKGZoYW5kbGUsIHRhZywgdHlwZS0+dS5rZW51bS0+bmFtZXMsCi0JCQkJdHlwZS0+dS5rZW51bS0+dmFsdWVzKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfUE9JTlRFUjoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rcG9pbnRlciwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnBvaW50ZXJfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCSAgICAgIHR5cGUtPnUua2Z1bmN0aW9uLT5yZXR1cm5fdHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKQotCWlzID0gLTE7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChpcyA9IDA7IHR5cGUtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXNbaXNdICE9IE5VTEw7IGlzKyspCi0JICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgICAgdHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlc1tpc10sCi0JCQkJICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcmV0dXJuICgqZm5zLT5mdW5jdGlvbl90eXBlKSAoZmhhbmRsZSwgaXMsCi0JCQkJICAgIHR5cGUtPnUua2Z1bmN0aW9uLT52YXJhcmdzKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfUkVGRVJFTkNFOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtyZWZlcmVuY2UsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5yZWZlcmVuY2VfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9SQU5HRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rcmFuZ2UtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5yYW5nZV90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rcmFuZ2UtPmxvd2VyLAotCQkJCSB0eXBlLT51LmtyYW5nZS0+dXBwZXIpOwotICAgIGNhc2UgREVCVUdfS0lORF9BUlJBWToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rYXJyYXktPmVsZW1lbnRfdHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQotCSAgfHwgISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJIHR5cGUtPnUua2FycmF5LT5yYW5nZV90eXBlLAotCQkJCSAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5hcnJheV90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rYXJyYXktPmxvd2VyLAotCQkJCSB0eXBlLT51LmthcnJheS0+dXBwZXIsCi0JCQkJIHR5cGUtPnUua2FycmF5LT5zdHJpbmdwKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfU0VUOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtzZXQtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5zZXRfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua3NldC0+Yml0c3RyaW5ncCk7Ci0gICAgY2FzZSBERUJVR19LSU5EX09GRlNFVDoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rb2Zmc2V0LT5iYXNlX3R5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkKLQkgIHx8ICEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJCSB0eXBlLT51LmtvZmZzZXQtPnRhcmdldF90eXBlLAotCQkJCSAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5vZmZzZXRfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9NRVRIT0Q6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkgICAgICB0eXBlLT51LmttZXRob2QtPnJldHVybl90eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICh0eXBlLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKQotCWlzID0gLTE7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChpcyA9IDA7IHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzW2lzXSAhPSBOVUxMOyBpcysrKQotCSAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJICAgIHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzW2lzXSwKLQkJCQkgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAodHlwZS0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSAhPSBOVUxMKQotCXsKLQkgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgIHR5cGUtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUsCi0JCQkJICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByZXR1cm4gKCpmbnMtPm1ldGhvZF90eXBlKSAoZmhhbmRsZSwKLQkJCQkgIHR5cGUtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUgIT0gTlVMTCwKLQkJCQkgIGlzLAotCQkJCSAgdHlwZS0+dS5rbWV0aG9kLT52YXJhcmdzKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09OU1Q6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua2NvbnN0LAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+Y29uc3RfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9WT0xBVElMRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rdm9sYXRpbGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT52b2xhdGlsZV90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgotICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPnR5cGUsCi0JCQkgICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpOwotICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+dHlwZSwKLQkJCSAgICAgICB0eXBlLT51LmtuYW1lZC0+bmFtZSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogV3JpdGUgb3V0IGEgY2xhc3MgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9jbGFzc190eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUsIHRhZykKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBpZDsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnZwdHJiYXNlOwotCi0gIGlmICh0eXBlLT51LmtjbGFzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlkID0gMDsKLSAgICAgIHZwdHJiYXNlID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPmlkIDw9IGluZm8tPmJhc2VfaWQpCi0JewotCSAgaWYgKCEgZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLCB0YWcsIHR5cGUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+bWFyayA9PSB0eXBlLT51LmtjbGFzcy0+bWFyaykKLQl7Ci0JICAvKiBXZSBhcmUgY3VycmVudGx5IG91dHB1dHRpbmcgdGhpcyBjbGFzcywgb3Igd2UgaGF2ZQotCSAgICAgYWxyZWFkeSBvdXRwdXQgaXQuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGVyZSBhcmUKLQkgICAgIG1ldGhvZHMgZm9yIGFuIGFub255bW91cyBjbGFzcy4gICovCi0JICBhc3NlcnQgKHR5cGUtPnUua2NsYXNzLT5pZCA+IGluZm8tPmJhc2VfaWQpOwotCSAgcmV0dXJuICgqZm5zLT50YWdfdHlwZSkgKGZoYW5kbGUsIHRhZywgdHlwZS0+dS5rY2xhc3MtPmlkLAotCQkJCSAgIHR5cGUtPmtpbmQpOwotCX0KLSAgICAgIHR5cGUtPnUua2NsYXNzLT5tYXJrID0gaW5mby0+bWFyazsKLSAgICAgIGlkID0gdHlwZS0+dS5rY2xhc3MtPmlkOwotCi0gICAgICB2cHRyYmFzZSA9IHR5cGUtPnUua2NsYXNzLT52cHRyYmFzZTsKLSAgICAgIGlmICh2cHRyYmFzZSAhPSBOVUxMICYmIHZwdHJiYXNlICE9IHR5cGUpCi0JewotCSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB2cHRyYmFzZSwKLQkJCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgKCpmbnMtPnN0YXJ0X2NsYXNzX3R5cGUpIChmaGFuZGxlLCB0YWcsIGlkLAotCQkJCSAgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX0NMQVNTLAotCQkJCSAgdHlwZS0+c2l6ZSwKLQkJCQkgIHZwdHJiYXNlICE9IE5VTEwsCi0JCQkJICB2cHRyYmFzZSA9PSB0eXBlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHR5cGUtPnUua2NsYXNzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5maWVsZHMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKLQotCSAgICAgIGYgPSB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldOwotCSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgZi0+dHlwZSwKLQkJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoZi0+c3RhdGljX21lbWJlcikKLQkJewotCQkgIGlmICghICgqZm5zLT5jbGFzc19zdGF0aWNfbWVtYmVyKSAoZmhhbmRsZSwgZi0+bmFtZSwKLQkJCQkJCSAgICAgZi0+dS5zLnBoeXNuYW1lLAotCQkJCQkJICAgICBmLT52aXNpYmlsaXR5KSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgqZm5zLT5zdHJ1Y3RfZmllbGQpIChmaGFuZGxlLCBmLT5uYW1lLCBmLT51LmYuYml0cG9zLAotCQkJCQkgICAgICBmLT51LmYuYml0c2l6ZSwgZi0+dmlzaWJpbGl0eSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5iYXNlY2xhc3NlcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5iYXNlY2xhc3Nlc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICpiOwotCi0JICAgICAgYiA9IHR5cGUtPnUua2NsYXNzLT5iYXNlY2xhc3Nlc1tpXTsKLQkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIGItPnR5cGUsCi0JCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX2Jhc2VjbGFzcykgKGZoYW5kbGUsIGItPmJpdHBvcywgYi0+dmlydHVhbCwKLQkJCQkJICAgICBiLT52aXNpYmlsaXR5KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPm1ldGhvZHMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+bWV0aG9kc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kICptOwotCSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0JICAgICAgbSA9IHR5cGUtPnUua2NsYXNzLT5tZXRob2RzW2ldOwotCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19zdGFydF9tZXRob2QpIChmaGFuZGxlLCBtLT5uYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGZvciAoaiA9IDA7IG0tPnZhcmlhbnRzW2pdICE9IE5VTEw7IGorKykKLQkJewotCQkgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdjsKLQotCQkgIHYgPSBtLT52YXJpYW50c1tqXTsKLQkJICBpZiAodi0+Y29udGV4dCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHYtPmNvbnRleHQsCi0JCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHYtPnR5cGUsCi0JCQkJCSAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGlmICh2LT52b2Zmc2V0ICE9IFZPRkZTRVRfU1RBVElDX01FVEhPRCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX21ldGhvZF92YXJpYW50KSAoZmhhbmRsZSwgdi0+cGh5c25hbWUsCi0JCQkJCQkJICB2LT52aXNpYmlsaXR5LAotCQkJCQkJCSAgdi0+Y29uc3RwLAotCQkJCQkJCSAgdi0+dm9sYXRpbGVwLAotCQkJCQkJCSAgdi0+dm9mZnNldCwKLQkJCQkJCQkgIHYtPmNvbnRleHQgIT0gTlVMTCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KSAoZmhhbmRsZSwKLQkJCQkJCQkJIHYtPnBoeXNuYW1lLAotCQkJCQkJCQkgdi0+dmlzaWJpbGl0eSwKLQkJCQkJCQkJIHYtPmNvbnN0cCwKLQkJCQkJCQkJIHYtPnZvbGF0aWxlcCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3NfZW5kX21ldGhvZCkgKGZoYW5kbGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAoKmZucy0+ZW5kX2NsYXNzX3R5cGUpIChmaGFuZGxlKTsKLX0KLQotLyogV3JpdGUgb3V0IGluZm9ybWF0aW9uIGZvciBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2Z1bmN0aW9uIChpbmZvLCBmbnMsIGZoYW5kbGUsIG5hbWUsIGxpbmthZ2UsIGZ1bmN0aW9uKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci0gICAgIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqZnVuY3Rpb247Ci17Ci0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKnA7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYjsKLQotICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGZ1bmN0aW9uLT5ibG9ja3MtPnN0YXJ0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBmdW5jdGlvbi0+cmV0dXJuX3R5cGUsCi0JCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgKCpmbnMtPnN0YXJ0X2Z1bmN0aW9uKSAoZmhhbmRsZSwgbmFtZSwKLQkJCQlsaW5rYWdlID09IERFQlVHX0xJTktBR0VfR0xPQkFMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChwID0gZnVuY3Rpb24tPnBhcmFtZXRlcnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBwLT50eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpCi0JICB8fCAhICgqZm5zLT5mdW5jdGlvbl9wYXJhbWV0ZXIpIChmaGFuZGxlLCBwLT5uYW1lLCBwLT5raW5kLCBwLT52YWwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChiID0gZnVuY3Rpb24tPmJsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV9ibG9jayAoaW5mbywgZm5zLCBmaGFuZGxlLCBiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiAoKmZucy0+ZW5kX2Z1bmN0aW9uKSAoZmhhbmRsZSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9ibG9jayAoaW5mbywgZm5zLCBmaGFuZGxlLCBibG9jaykKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgc3RydWN0IGRlYnVnX2Jsb2NrICpibG9jazsKLXsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYjsKLQotICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGJsb2NrLT5zdGFydCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEkgY2FuJ3Qgc2VlIGFueSBwb2ludCB0byB3cml0aW5nIG91dCBhIGJsb2NrIHdpdGggbm8gbG9jYWwKLSAgICAgdmFyaWFibGVzLCBzbyB3ZSBkb24ndCBib3RoZXIsIGV4Y2VwdCBmb3IgdGhlIHRvcCBsZXZlbCBibG9jay4gICovCi0gIGlmIChibG9jay0+bG9jYWxzICE9IE5VTEwgfHwgYmxvY2stPnBhcmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgqZm5zLT5zdGFydF9ibG9jaykgKGZoYW5kbGUsIGJsb2NrLT5zdGFydCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmxvY2stPmxvY2FscyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAobiA9IGJsb2NrLT5sb2NhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JewotCSAgaWYgKCEgZGVidWdfd3JpdGVfbmFtZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgZm9yIChiID0gYmxvY2stPmNoaWxkcmVuOyBiICE9IE5VTEw7IGIgPSBiLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX2Jsb2NrIChpbmZvLCBmbnMsIGZoYW5kbGUsIGIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCBibG9jay0+ZW5kKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJsb2NrLT5sb2NhbHMgIT0gTlVMTCB8fCBibG9jay0+cGFyZW50ID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCpmbnMtPmVuZF9ibG9jaykgKGZoYW5kbGUsIGJsb2NrLT5lbmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB1cCB0byBBRERSRVNTLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgYWRkcmVzcykKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICB3aGlsZSAoaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfbGluZW5vICpsOwotCi0gICAgICBsID0gaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm87Ci0KLSAgICAgIHdoaWxlIChpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCA8IERFQlVHX0xJTkVOT19DT1VOVCkKLQl7Ci0JICBpZiAobC0+bGluZW5vc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0KLQkgICAgICA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0JICAgIGJyZWFrOwotCi0JICBpZiAobC0+YWRkcnNbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdID49IGFkZHJlc3MpCi0JICAgIHJldHVybiB0cnVlOwotCi0JICBpZiAoISAoKmZucy0+bGluZW5vKSAoZmhhbmRsZSwgbC0+ZmlsZS0+ZmlsZW5hbWUsCi0JCQkJbC0+bGluZW5vc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0sCi0JCQkJbC0+YWRkcnNbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICArK2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4OwotCX0KLQotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm8gPSBsLT5uZXh0OwotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXggPSAwOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBJRCBudW1iZXIgZm9yIGEgY2xhc3MuICBJZiBkdXJpbmcgdGhlIHNhbWUgY2FsbCB0bwotICAgZGVidWdfd3JpdGUgd2UgZmluZCBhIHN0cnVjdCB3aXRoIHRoZSBzYW1lIGRlZmluaXRpb24gd2l0aCB0aGUgc2FtZQotICAgbmFtZSwgd2UgdXNlIHRoZSBzYW1lIElELiAgVGhpcyB0eXBlIG9mIHRoaW5ncyBoYXBwZW5zIGJlY2F1c2UgdGhlCi0gICBzYW1lIHN0cnVjdCB3aWxsIGJlIGRlZmluZWQgYnkgbXVsdGlwbGUgY29tcGlsYXRpb24gdW5pdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLCB0YWcsIHR5cGUpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjOwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKmw7Ci0KLSAgYXNzZXJ0ICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfU1RSVUNUCi0JICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVU5JT04KLQkgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9DTEFTUwotCSAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OX0NMQVNTKTsKLQotICBjID0gdHlwZS0+dS5rY2xhc3M7Ci0KLSAgaWYgKGMtPmlkID4gaW5mby0+YmFzZV9pZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKGwgPSBpbmZvLT5pZF9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50eXBlLT5raW5kICE9IHR5cGUtPmtpbmQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICh0YWcgPT0gTlVMTCkKLQl7Ci0JICBpZiAobC0+dGFnICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobC0+dGFnID09IE5VTEwKLQkgICAgICB8fCBsLT50YWdbMF0gIT0gdGFnWzBdCi0JICAgICAgfHwgc3RyY21wIChsLT50YWcsIHRhZykgIT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgbC0+dHlwZSwgdHlwZSkpCi0JewotCSAgYy0+aWQgPSBsLT50eXBlLT51LmtjbGFzcy0+aWQ7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZXJlIGFyZSBubyBpZGVudGljYWwgdHlwZXMuICBVc2UgYSBuZXcgSUQsIGFuZCBhZGQgaXQgdG8gdGhlCi0gICAgIGxpc3QuICAqLwotICArK2luZm8tPmNsYXNzX2lkOwotICBjLT5pZCA9IGluZm8tPmNsYXNzX2lkOwotCi0gIGwgPSAoc3RydWN0IGRlYnVnX2NsYXNzX2lkICopIHhtYWxsb2MgKHNpemVvZiAqbCk7Ci0gIG1lbXNldCAobCwgMCwgc2l6ZW9mICpsKTsKLQotICBsLT50eXBlID0gdHlwZTsKLSAgbC0+dGFnID0gdGFnOwotCi0gIGwtPm5leHQgPSBpbmZvLT5pZF9saXN0OwotICBpbmZvLT5pZF9saXN0ID0gbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIHR3byB0eXBlcyBhcmUgdGhlIHNhbWUuICBBdCB0aGlzIHBvaW50LCB3ZSBkb24ndCBjYXJlIGFib3V0Ci0gICB0YWdzIGFuZCB0aGUgbGlrZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDIpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0MTsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQyOwotewotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgKmw7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCB0b3A7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmICh0MSA9PSBOVUxMKQotICAgIHJldHVybiB0MiA9PSBOVUxMOwotICBpZiAodDIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgd2hpbGUgKHQxLT5raW5kID09IERFQlVHX0tJTkRfSU5ESVJFQ1QpCi0gICAgewotICAgICAgdDEgPSAqdDEtPnUua2luZGlyZWN0LT5zbG90OwotICAgICAgaWYgKHQxID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgd2hpbGUgKHQyLT5raW5kID09IERFQlVHX0tJTkRfSU5ESVJFQ1QpCi0gICAgewotICAgICAgdDIgPSAqdDItPnUua2luZGlyZWN0LT5zbG90OwotICAgICAgaWYgKHQyID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAodDEgPT0gdDIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQXMgYSBzcGVjaWFsIGNhc2UsIHBlcm1pdCBhIHR5cGVkZWYgdG8gbWF0Y2ggYSB0YWcsIHNpbmNlIEMrKwotICAgICBkZWJ1Z2dpbmcgb3V0cHV0IHdpbGwgc29tZXRpbWVzIGFkZCBhIHR5cGVkZWYgd2hlcmUgQyBkZWJ1Z2dpbmcKLSAgICAgb3V0cHV0IHdpbGwgbm90LiAgKi8KLSAgaWYgKHQxLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgICYmIHQyLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQotICAgIHJldHVybiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbmFtZWQtPnR5cGUsIHQyKTsKLSAgZWxzZSBpZiAodDEtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQKLQkgICAmJiB0Mi0+a2luZCA9PSBERUJVR19LSU5EX05BTUVEKQotICAgIHJldHVybiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDItPnUua25hbWVkLT50eXBlKTsKLQotICBpZiAodDEtPmtpbmQgIT0gdDItPmtpbmQKLSAgICAgIHx8IHQxLT5zaXplICE9IHQyLT5zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgcmlkIG9mIHRoZSB0cml2aWFsIGNhc2VzIGZpcnN0LiAgKi8KLSAgc3dpdGNoICh0MS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9WT0lEOgotICAgIGNhc2UgREVCVUdfS0lORF9GTE9BVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09NUExFWDoKLSAgICBjYXNlIERFQlVHX0tJTkRfQk9PTDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgREVCVUdfS0lORF9JTlQ6Ci0gICAgICByZXR1cm4gdDEtPnUua2ludCA9PSB0Mi0+dS5raW50OwotICAgIH0KLQotICAvKiBXZSBoYXZlIHRvIGF2b2lkIGFuIGluZmluaXRlIHJlY3Vyc2lvbi4gIFdlIGRvIHRoaXMgYnkga2VlcGluZyBhCi0gICAgIGxpc3Qgb2YgdHlwZXMgd2hpY2ggd2UgYXJlIGNvbXBhcmluZy4gIFdlIGp1c3Qga2VlcCB0aGUgbGlzdCBvbgotICAgICB0aGUgc3RhY2suICBJZiB3ZSBlbmNvdW50ZXIgYSBwYWlyIG9mIHR5cGVzIHdlIGFyZSBjdXJyZW50bHkKLSAgICAgY29tcGFyaW5nLCB3ZSBqdXN0IGFzc3VtZSB0aGF0IHRoZXkgYXJlIGVxdWFsLiAgKi8KLSAgZm9yIChsID0gaW5mby0+Y29tcGFyZV9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50MSA9PSB0MSAmJiBsLT50MiA9PSB0MikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgdG9wLnQxID0gdDE7Ci0gIHRvcC50MiA9IHQyOwotICB0b3AubmV4dCA9IGluZm8tPmNvbXBhcmVfbGlzdDsKLSAgaW5mby0+Y29tcGFyZV9saXN0ID0gJnRvcDsKLQotICBzd2l0Y2ggKHQxLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXQgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIGlmICh0MS0+dS5rY2xhc3MgPT0gTlVMTCkKLQlyZXQgPSB0Mi0+dS5rY2xhc3MgPT0gTlVMTDsKLSAgICAgIGVsc2UgaWYgKHQyLT51LmtjbGFzcyA9PSBOVUxMKQotCXJldCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAodDEtPnUua2NsYXNzLT5pZCA+IGluZm8tPmJhc2VfaWQKLQkgICAgICAgJiYgdDEtPnUua2NsYXNzLT5pZCA9PSB0Mi0+dS5rY2xhc3MtPmlkKQotCXJldCA9IHRydWU7Ci0gICAgICBlbHNlCi0JcmV0ID0gZGVidWdfY2xhc3NfdHlwZV9zYW1lcCAoaW5mbywgdDEsIHQyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX0VOVU06Ci0gICAgICBpZiAodDEtPnUua2VudW0gPT0gTlVMTCkKLQlyZXQgPSB0Mi0+dS5rZW51bSA9PSBOVUxMOwotICAgICAgZWxzZSBpZiAodDItPnUua2VudW0gPT0gTlVMTCkKLQlyZXQgPSBmYWxzZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICoqcG4xLCAqKnBuMjsKLQkgIGJmZF9zaWduZWRfdm1hICpwdjEsICpwdjI7Ci0KLQkgIHBuMSA9IHQxLT51LmtlbnVtLT5uYW1lczsKLQkgIHBuMiA9IHQyLT51LmtlbnVtLT5uYW1lczsKLQkgIHB2MSA9IHQxLT51LmtlbnVtLT52YWx1ZXM7Ci0JICBwdjIgPSB0Mi0+dS5rZW51bS0+dmFsdWVzOwotCSAgd2hpbGUgKCpwbjEgIT0gTlVMTCAmJiAqcG4yICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKipwbjEgIT0gKipwbjIKLQkJICB8fCAqcHYxICE9ICpwdjIKLQkJICB8fCBzdHJjbXAgKCpwbjEsICpwbjIpICE9IDApCi0JCWJyZWFrOwotCSAgICAgICsrcG4xOwotCSAgICAgICsrcG4yOwotCSAgICAgICsrcHYxOwotCSAgICAgICsrcHYyOwotCSAgICB9Ci0JICByZXQgPSAqcG4xID09IE5VTEwgJiYgKnBuMiA9PSBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1BPSU5URVI6Ci0gICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rcG9pbnRlciwgdDItPnUua3BvaW50ZXIpOwotICAgICAgYnJlYWs7Ci0JICAgICAKLSAgICBjYXNlIERFQlVHX0tJTkRfRlVOQ1RJT046Ci0gICAgICBpZiAodDEtPnUua2Z1bmN0aW9uLT52YXJhcmdzICE9IHQyLT51LmtmdW5jdGlvbi0+dmFyYXJncwotCSAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlLAotCQkJCSB0Mi0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlKQotCSAgfHwgKCh0MS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKQotCSAgICAgICE9ICh0Mi0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKSkpCi0JcmV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICh0MS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKQotCXJldCA9IHRydWU7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGRlYnVnX3R5cGUgKiphMSwgKiphMjsKLQotCSAgYTEgPSB0MS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlczsKLQkgIGEyID0gdDItPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXM7Ci0JICB3aGlsZSAoKmExICE9IE5VTEwgJiYgKmEyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCAqYTEsICphMikpCi0JCWJyZWFrOwotCSAgICAgICsrYTE7Ci0JICAgICAgKythMjsKLQkgICAgfQotCSAgcmV0ID0gKmExID09IE5VTEwgJiYgKmEyID09IE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfUkVGRVJFTkNFOgotICAgICAgcmV0ID0gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3JlZmVyZW5jZSwgdDItPnUua3JlZmVyZW5jZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9SQU5HRToKLSAgICAgIHJldCA9ICh0MS0+dS5rcmFuZ2UtPmxvd2VyID09IHQyLT51LmtyYW5nZS0+bG93ZXIKLQkgICAgICYmIHQxLT51LmtyYW5nZS0+dXBwZXIgPT0gdDItPnUua3JhbmdlLT51cHBlcgotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3JhbmdlLT50eXBlLAotCQkJCSAgdDItPnUua3JhbmdlLT50eXBlKSk7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfQVJSQVk6Ci0gICAgICByZXQgPSAodDEtPnUua2FycmF5LT5sb3dlciA9PSB0Mi0+dS5rYXJyYXktPmxvd2VyCi0JICAgICAmJiB0MS0+dS5rYXJyYXktPnVwcGVyID09IHQyLT51LmthcnJheS0+dXBwZXIKLQkgICAgICYmIHQxLT51LmthcnJheS0+c3RyaW5ncCA9PSB0Mi0+dS5rYXJyYXktPnN0cmluZ3AKLQkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmthcnJheS0+ZWxlbWVudF90eXBlLAotCQkJCSAgdDItPnUua2FycmF5LT5lbGVtZW50X3R5cGUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1NFVDoKLSAgICAgIHJldCA9ICh0MS0+dS5rc2V0LT5iaXRzdHJpbmdwID09IHQyLT51LmtzZXQtPmJpdHN0cmluZ3AKLQkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtzZXQtPnR5cGUsIHQyLT51LmtzZXQtPnR5cGUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX09GRlNFVDoKLSAgICAgIHJldCA9IChkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rb2Zmc2V0LT5iYXNlX3R5cGUsCi0JCQkgICAgICAgdDItPnUua29mZnNldC0+YmFzZV90eXBlKQotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua29mZnNldC0+dGFyZ2V0X3R5cGUsCi0JCQkJICB0Mi0+dS5rb2Zmc2V0LT50YXJnZXRfdHlwZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfTUVUSE9EOgotICAgICAgaWYgKHQxLT51LmttZXRob2QtPnZhcmFyZ3MgIT0gdDItPnUua21ldGhvZC0+dmFyYXJncwotCSAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbWV0aG9kLT5yZXR1cm5fdHlwZSwKLQkJCQkgdDItPnUua21ldGhvZC0+cmV0dXJuX3R5cGUpCi0JICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmttZXRob2QtPmRvbWFpbl90eXBlLAotCQkJCSB0Mi0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSkKLQkgIHx8ICgodDEtPnUua21ldGhvZC0+YXJnX3R5cGVzID09IE5VTEwpCi0JICAgICAgIT0gKHQyLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKSkpCi0JcmV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICh0MS0+dS5rbWV0aG9kLT5hcmdfdHlwZXMgPT0gTlVMTCkKLQlyZXQgPSB0cnVlOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBkZWJ1Z190eXBlICoqYTEsICoqYTI7Ci0KLQkgIGExID0gdDEtPnUua21ldGhvZC0+YXJnX3R5cGVzOwotCSAgYTIgPSB0Mi0+dS5rbWV0aG9kLT5hcmdfdHlwZXM7Ci0JICB3aGlsZSAoKmExICE9IE5VTEwgJiYgKmEyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCAqYTEsICphMikpCi0JCWJyZWFrOwotCSAgICAgICsrYTE7Ci0JICAgICAgKythMjsKLQkgICAgfQotCSAgcmV0ID0gKmExID09IE5VTEwgJiYgKmEyID09IE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfQ09OU1Q6Ci0gICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rY29uc3QsIHQyLT51Lmtjb25zdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9WT0xBVElMRToKLSAgICAgIHJldCA9IGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51Lmt2b2xhdGlsZSwgdDItPnUua3ZvbGF0aWxlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgotICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6Ci0gICAgICByZXQgPSAoc3RyY21wICh0MS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsIHQyLT51LmtuYW1lZC0+bmFtZS0+bmFtZSkgPT0gMAotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua25hbWVkLT50eXBlLAotCQkJCSAgdDItPnUua25hbWVkLT50eXBlKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaW5mby0+Y29tcGFyZV9saXN0ID0gdG9wLm5leHQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU2VlIGlmIHR3byBjbGFzc2VzIGFyZSB0aGUgc2FtZS4gIFRoaXMgaXMgYSBzdWJyb3V0aW5lIG9mCi0gICBkZWJ1Z190eXBlX3NhbWVwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX2NsYXNzX3R5cGVfc2FtZXAgKGluZm8sIHQxLCB0MikKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQxOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjMSwgKmMyOwotCi0gIGMxID0gdDEtPnUua2NsYXNzOwotICBjMiA9IHQyLT51LmtjbGFzczsKLQotICBpZiAoKGMxLT5maWVsZHMgPT0gTlVMTCkgIT0gKGMyLT5maWVsZHMgPT0gTlVMTCkKLSAgICAgIHx8IChjMS0+YmFzZWNsYXNzZXMgPT0gTlVMTCkgIT0gKGMyLT5iYXNlY2xhc3NlcyA9PSBOVUxMKQotICAgICAgfHwgKGMxLT5tZXRob2RzID09IE5VTEwpICE9IChjMi0+bWV0aG9kcyA9PSBOVUxMKQotICAgICAgfHwgKGMxLT52cHRyYmFzZSA9PSBOVUxMKSAhPSAoYzItPnZwdHJiYXNlID09IE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYzEtPmZpZWxkcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19maWVsZCAqKnBmMSwgKipwZjI7Ci0KLSAgICAgIGZvciAocGYxID0gYzEtPmZpZWxkcywgcGYyID0gYzItPmZpZWxkczsKLQkgICAqcGYxICE9IE5VTEwgJiYgKnBmMiAhPSBOVUxMOwotCSAgIHBmMSsrLCBwZjIrKykKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfZmllbGQgKmYxLCAqZjI7Ci0KLQkgIGYxID0gKnBmMTsKLQkgIGYyID0gKnBmMjsKLQkgIGlmIChmMS0+bmFtZVswXSAhPSBmMi0+bmFtZVswXQotCSAgICAgIHx8IGYxLT52aXNpYmlsaXR5ICE9IGYyLT52aXNpYmlsaXR5Ci0JICAgICAgfHwgZjEtPnN0YXRpY19tZW1iZXIgIT0gZjItPnN0YXRpY19tZW1iZXIpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChmMS0+c3RhdGljX21lbWJlcikKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKGYxLT51LnMucGh5c25hbWUsIGYyLT51LnMucGh5c25hbWUpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGYxLT51LmYuYml0cG9zICE9IGYyLT51LmYuYml0cG9zCi0JCSAgfHwgZjEtPnUuZi5iaXRzaXplICE9IGYyLT51LmYuYml0c2l6ZSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAvKiBXZSBkbyB0aGUgY2hlY2tzIHdoaWNoIHJlcXVpcmUgZnVuY3Rpb24gY2FsbHMgbGFzdC4gIFdlCi0gICAgICAgICAgICAgZG9uJ3QgcmVxdWlyZSB0aGF0IHRoZSB0eXBlcyBvZiBmaWVsZHMgaGF2ZSB0aGUgc2FtZQotICAgICAgICAgICAgIG5hbWVzLCBzaW5jZSB0aGF0IHNvbWV0aW1lcyBmYWlscyBpbiB0aGUgcHJlc2VuY2Ugb2YKLSAgICAgICAgICAgICB0eXBlZGVmcyBhbmQgd2UgcmVhbGx5IGRvbid0IGNhcmUuICAqLwotCSAgaWYgKHN0cmNtcCAoZjEtPm5hbWUsIGYyLT5uYW1lKSAhPSAwCi0JICAgICAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLAotCQkJCSAgICAgZGVidWdfZ2V0X3JlYWxfdHlwZSAoKFBUUikgaW5mbywKLQkJCQkJCQkgIGYxLT50eXBlLCBOVUxMKSwKLQkJCQkgICAgIGRlYnVnX2dldF9yZWFsX3R5cGUgKChQVFIpIGluZm8sCi0JCQkJCQkJICBmMi0+dHlwZSwgTlVMTCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCpwZjEgIT0gTlVMTCB8fCAqcGYyICE9IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYzEtPnZwdHJiYXNlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgYzEtPnZwdHJiYXNlLCBjMi0+dnB0cmJhc2UpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGMxLT5iYXNlY2xhc3NlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKipwYjEsICoqcGIyOwotCi0gICAgICBmb3IgKHBiMSA9IGMxLT5iYXNlY2xhc3NlcywgcGIyID0gYzItPmJhc2VjbGFzc2VzOwotCSAgICpwYjEgIT0gTlVMTCAmJiAqcGIyICE9IE5VTEw7Ci0JICAgKytwYjEsICsrcGIyKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmIxLCAqYjI7Ci0KLQkgIGIxID0gKnBiMTsKLQkgIGIyID0gKnBiMjsKLQkgIGlmIChiMS0+Yml0cG9zICE9IGIyLT5iaXRwb3MKLQkgICAgICB8fCBiMS0+dmlydHVhbCAhPSBiMi0+dmlydHVhbAotCSAgICAgIHx8IGIxLT52aXNpYmlsaXR5ICE9IGIyLT52aXNpYmlsaXR5Ci0JICAgICAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCBiMS0+dHlwZSwgYjItPnR5cGUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCpwYjEgIT0gTlVMTCB8fCAqcGIyICE9IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYzEtPm1ldGhvZHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kICoqcG0xLCAqKnBtMjsKLQotICAgICAgZm9yIChwbTEgPSBjMS0+bWV0aG9kcywgcG0yID0gYzItPm1ldGhvZHM7Ci0JICAgKnBtMSAhPSBOVUxMICYmICpwbTIgIT0gTlVMTDsKLQkgICArK3BtMSwgKytwbTIpCi0JewotCSAgc3RydWN0IGRlYnVnX21ldGhvZCAqbTEsICptMjsKLQotCSAgbTEgPSAqcG0xOwotCSAgbTIgPSAqcG0yOwotCSAgaWYgKG0xLT5uYW1lWzBdICE9IG0yLT5uYW1lWzBdCi0JICAgICAgfHwgc3RyY21wIChtMS0+bmFtZSwgbTItPm5hbWUpICE9IDAKLQkgICAgICB8fCAobTEtPnZhcmlhbnRzID09IE5VTEwpICE9IChtMi0+dmFyaWFudHMgPT0gTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChtMS0+dmFyaWFudHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKnB2MSwgKipwdjI7Ci0KLQkgICAgICBmb3IgKHB2MSA9IG0xLT52YXJpYW50cywgcHYyID0gbTItPnZhcmlhbnRzOwotCQkgICAqcHYxICE9IE5VTEwgJiYgKnB2MiAhPSBOVUxMOwotCQkgICArK3B2MSwgKytwdjIpCi0JCXsKLQkJICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnYxLCAqdjI7Ci0KLQkJICB2MSA9ICpwdjE7Ci0JCSAgdjIgPSAqcHYyOwotCQkgIGlmICh2MS0+cGh5c25hbWVbMF0gIT0gdjItPnBoeXNuYW1lWzBdCi0JCSAgICAgIHx8IHYxLT52aXNpYmlsaXR5ICE9IHYyLT52aXNpYmlsaXR5Ci0JCSAgICAgIHx8IHYxLT5jb25zdHAgIT0gdjItPmNvbnN0cAotCQkgICAgICB8fCB2MS0+dm9sYXRpbGVwICE9IHYyLT52b2xhdGlsZXAKLQkJICAgICAgfHwgdjEtPnZvZmZzZXQgIT0gdjItPnZvZmZzZXQKLQkJICAgICAgfHwgKHYxLT5jb250ZXh0ID09IE5VTEwpICE9ICh2Mi0+Y29udGV4dCA9PSBOVUxMKQotCQkgICAgICB8fCBzdHJjbXAgKHYxLT5waHlzbmFtZSwgdjItPnBoeXNuYW1lKSAhPSAwCi0JCSAgICAgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdjEtPnR5cGUsIHYyLT50eXBlKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpZiAodjEtPmNvbnRleHQgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdjEtPmNvbnRleHQsCi0JCQkJCSAgICAgIHYyLT5jb250ZXh0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmICgqcHYxICE9IE5VTEwgfHwgKnB2MiAhPSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoKnBtMSAhPSBOVUxMIHx8ICpwbTIgIT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVidWcuaCBiL2JpbnV0aWxzL2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODkwYjIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5OCArMCwwIEBACi0vKiBkZWJ1Zy5oIC0tIERlc2NyaWJlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgREVCVUdfSAotI2RlZmluZSBERUJVR19ICi0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgZGVzY3JpYmVzIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotICAgV2UgbWF5IGV2ZW50dWFsbHkgaGF2ZSByZWFkZXJzIHdoaWNoIGNvbnZlcnQgZGlmZmVyZW50IGZvcm1hdHMgaW50bwotICAgdGhpcyBnZW5lcmljIGZvcm1hdCwgYW5kIHdyaXRlcnMgd2hpY2ggd3JpdGUgaXQgb3V0LiAgVGhlIGluaXRpYWwKLSAgIGltcGV0dXMgZm9yIHRoaXMgd2FzIHdyaXRpbmcgYSBjb252ZXJ0b3IgZnJvbSBzdGFicyB0byBIUCBJRUVFLTY5NQotICAgZGVidWdnaW5nIGZvcm1hdC4gICovCi0KLS8qIERpZmZlcmVudCBraW5kcyBvZiB0eXBlcy4gICovCi0KLWVudW0gZGVidWdfdHlwZV9raW5kCi17Ci0gIC8qIE5vdCB1c2VkLiAgKi8KLSAgREVCVUdfS0lORF9JTExFR0FMLAotICAvKiBJbmRpcmVjdCB2aWEgYSBwb2ludGVyLiAgKi8KLSAgREVCVUdfS0lORF9JTkRJUkVDVCwKLSAgLyogVm9pZC4gICovCi0gIERFQlVHX0tJTkRfVk9JRCwKLSAgLyogSW50ZWdlci4gICovCi0gIERFQlVHX0tJTkRfSU5ULAotICAvKiBGbG9hdGluZyBwb2ludC4gICovCi0gIERFQlVHX0tJTkRfRkxPQVQsCi0gIC8qIENvbXBsZXguICAqLwotICBERUJVR19LSU5EX0NPTVBMRVgsCi0gIC8qIEJvb2xlYW4uICAqLwotICBERUJVR19LSU5EX0JPT0wsCi0gIC8qIFN0cnVjdC4gICovCi0gIERFQlVHX0tJTkRfU1RSVUNULAotICAvKiBVbmlvbi4gICovCi0gIERFQlVHX0tJTkRfVU5JT04sCi0gIC8qIENsYXNzLiAgKi8KLSAgREVCVUdfS0lORF9DTEFTUywKLSAgLyogVW5pb24gY2xhc3MgKGNhbiB0aGlzIHJlYWxseSBoYXBwZW4/KS4gICovCi0gIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MsCi0gIC8qIEVudW1lcmF0aW9uIHR5cGUuICAqLwotICBERUJVR19LSU5EX0VOVU0sCi0gIC8qIFBvaW50ZXIuICAqLwotICBERUJVR19LSU5EX1BPSU5URVIsCi0gIC8qIEZ1bmN0aW9uLiAgKi8KLSAgREVCVUdfS0lORF9GVU5DVElPTiwKLSAgLyogUmVmZXJlbmNlLiAgKi8KLSAgREVCVUdfS0lORF9SRUZFUkVOQ0UsCi0gIC8qIFJhbmdlLiAgKi8KLSAgREVCVUdfS0lORF9SQU5HRSwKLSAgLyogQXJyYXkuICAqLwotICBERUJVR19LSU5EX0FSUkFZLAotICAvKiBTZXQuICAqLwotICBERUJVR19LSU5EX1NFVCwKLSAgLyogQmFzZWQgcG9pbnRlci4gICovCi0gIERFQlVHX0tJTkRfT0ZGU0VULAotICAvKiBNZXRob2QuICAqLwotICBERUJVR19LSU5EX01FVEhPRCwKLSAgLyogQ29uc3QgcXVhbGlmaWVkIHR5cGUuICAqLwotICBERUJVR19LSU5EX0NPTlNULAotICAvKiBWb2xhdGlsZSBxdWFsaWZpZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfVk9MQVRJTEUsCi0gIC8qIE5hbWVkIHR5cGUuICAqLwotICBERUJVR19LSU5EX05BTUVELAotICAvKiBUYWdnZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfVEFHR0VECi19OwotCi0vKiBEaWZmZXJlbnQga2luZHMgb2YgdmFyaWFibGVzLiAgKi8KLQotZW51bSBkZWJ1Z192YXJfa2luZAotewotICAvKiBOb3QgdXNlZC4gICovCi0gIERFQlVHX1ZBUl9JTExFR0FMLAotICAvKiBBIGdsb2JhbCB2YXJpYWJsZS4gICovCi0gIERFQlVHX0dMT0JBTCwKLSAgLyogQSBzdGF0aWMgdmFyaWFibGUuICAqLwotICBERUJVR19TVEFUSUMsCi0gIC8qIEEgbG9jYWwgc3RhdGljIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfTE9DQUxfU1RBVElDLAotICAvKiBBIGxvY2FsIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfTE9DQUwsCi0gIC8qIEEgcmVnaXN0ZXIgdmFyaWFibGUuICAqLwotICBERUJVR19SRUdJU1RFUgotfTsKLQotLyogRGlmZmVyZW50IGtpbmRzIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1lbnVtIGRlYnVnX3Bhcm1fa2luZAotewotICAvKiBOb3QgdXNlZC4gICovCi0gIERFQlVHX1BBUk1fSUxMRUdBTCwKLSAgLyogQSBzdGFjayBiYXNlZCBwYXJhbWV0ZXIuICAqLwotICBERUJVR19QQVJNX1NUQUNLLAotICAvKiBBIHJlZ2lzdGVyIHBhcmFtZXRlci4gICovCi0gIERFQlVHX1BBUk1fUkVHLAotICAvKiBBIHN0YWNrIGJhc2VkIHJlZmVyZW5jZSBwYXJhbWV0ZXIuICAqLwotICBERUJVR19QQVJNX1JFRkVSRU5DRSwKLSAgLyogQSByZWdpc3RlciByZWZlcmVuY2UgcGFyYW1ldGVyLiAgKi8KLSAgREVCVUdfUEFSTV9SRUZfUkVHCi19OwotCi0vKiBEaWZmZXJlbnQga2luZHMgb2YgdmlzaWJpbGl0eS4gICovCi0KLWVudW0gZGVidWdfdmlzaWJpbGl0eQotewotICAvKiBBIHB1YmxpYyBmaWVsZCAoZS5nLiwgYSBmaWVsZCBpbiBhIEMgc3RydWN0KS4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDLAotICAvKiBBIHByb3RlY3RlZCBmaWVsZC4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVELAotICAvKiBBIHByaXZhdGUgZmllbGQuICAqLwotICBERUJVR19WSVNJQklMSVRZX1BSSVZBVEUsCi0gIC8qIEEgZmllbGQgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICBERUJVR19WSVNJQklMSVRZX0lHTk9SRQotfTsKLQotLyogQSB0eXBlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfdHlwZSAqZGVidWdfdHlwZTsKLQotI2RlZmluZSBERUJVR19UWVBFX05VTEwgKChkZWJ1Z190eXBlKSBOVUxMKQotCi0vKiBBIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfZmllbGQgKmRlYnVnX2ZpZWxkOwotCi0jZGVmaW5lIERFQlVHX0ZJRUxEX05VTEwgKChkZWJ1Z19maWVsZCkgTlVMTCkKLQotLyogQSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmRlYnVnX2Jhc2VjbGFzczsKLQotI2RlZmluZSBERUJVR19CQVNFQ0xBU1NfTlVMTCAoKGRlYnVnX2Jhc2VjbGFzcykgTlVMTCkKLQotLyogQSBtZXRob2Qgb2YgYW4gb2JqZWN0LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfbWV0aG9kICpkZWJ1Z19tZXRob2Q7Ci0KLSNkZWZpbmUgREVCVUdfTUVUSE9EX05VTEwgKChkZWJ1Z19tZXRob2QpIE5VTEwpCi0KLS8qIFRoZSBhcmd1bWVudHMgdG8gYSBtZXRob2QgZnVuY3Rpb24gb2YgYW4gb2JqZWN0LiAgVGhlc2UgaW5kaWNhdGUKLSAgIHdoaWNoIG1ldGhvZCB0byBydW4uICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqZGVidWdfbWV0aG9kX3ZhcmlhbnQ7Ci0KLSNkZWZpbmUgREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTCAoKGRlYnVnX21ldGhvZF92YXJpYW50KSBOVUxMKQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gZGVidWdfd3JpdGUuICBJdCBob2xkcyBmdW5jdGlvbgotICAgcG9pbnRlcnMgdGhhdCBkZWJ1Z193cml0ZSB3aWxsIGNhbGwgYmFzZWQgb24gdGhlIGFjY3VtdWxhdGVkCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfd3JpdGVfZm5zCi17Ci0gIC8qIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIG5ldyBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlCi0gICAgIG5hbWUgb2YgdGhlIG1haW4gZmlsZSBpbiB0aGUgbmV3IHVuaXQuICAqLwotICBib29sZWFuICgqc3RhcnRfY29tcGlsYXRpb25fdW5pdCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB3aXRoaW4gYQotICAgICBjb21waWxhdGlvbiB1bml0LCBiZWZvcmUgb3V0cHV0dGluZyBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIGZvcgotICAgICB0aGF0IGZpbGUuICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuICAqLwotICBib29sZWFuICgqc3RhcnRfc291cmNlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIEVhY2ggd3JpdGVyIG11c3Qga2VlcCBhIHN0YWNrIG9mIHR5cGVzLiAgKi8KLQotICAvKiBQdXNoIGFuIGVtcHR5IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoaXMgdHlwZSBjYW4gYXBwZWFyIGlmCi0gICAgIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSB3aGljaCBpcyBuZXZlciBkZWZpbmVkLiAgKi8KLSAgYm9vbGVhbiAoKmVtcHR5X3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYSB2b2lkIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCp2b2lkX3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYW4gaW50ZWdlciB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplIGFuZAotICAgICB3aGV0aGVyIGl0IGlzIHVuc2lnbmVkLiAgKi8KLSAgYm9vbGVhbiAoKmludF90eXBlKSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotCi0gIC8qIFB1c2ggYSBmbG9hdGluZyB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplLiAgKi8KLSAgYm9vbGVhbiAoKmZsb2F0X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogUHVzaCBhIGNvbXBsZXggdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZS4gICovCi0gIGJvb2xlYW4gKCpjb21wbGV4X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogUHVzaCBhIGJvb2xlYW4gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZS4gICovCi0gIGJvb2xlYW4gKCpib29sX3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogUHVzaCBhbiBlbnVtIHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHRhZywgYSBOVUxMCi0gICAgIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbmFtZXMgYW5kIHRoZSBhc3NvY2lhdGVkIHZhbHVlcy4gIElmIHRoZXJlIGlzCi0gICAgIG5vIHRhZywgdGhlIHRhZyBhcmd1bWVudCB3aWxsIGJlIE5VTEwuICBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZAotICAgICBlbnVtLCB0aGUgbmFtZXMgYW5kIHZhbHVlcyBhcmd1bWVudHMgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKmVudW1fdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCi0JCQkJYmZkX3NpZ25lZF92bWEgKikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgcG9pbnRlciB0byB0aGF0Ci0gICAgIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpwb2ludGVyX3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYSBmdW5jdGlvbiB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50IHR5cGVzIHRoYXQgaGF2ZSBiZWVuIHB1c2hlZCBvbnRvCi0gICAgIHRoZSBzdGFjay4gIElmIHRoZSBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXMgaXMgcGFzc2VkIGFzIC0xLCB0aGVuCi0gICAgIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgZnVuY3Rpb24gYXJlIHVua25vd24sIGFuZCBubyB0eXBlcyBoYXZlCi0gICAgIGJlZW4gcHVzaGVkIG9udG8gdGhlIHN0YWNrLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlCi0gICAgIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoZSByZXR1cm4gdHlwZQotICAgICBvZiB0aGUgZnVuY3Rpb24gaXMgcHVzaGVkIG9udG8gdGhlIHR5cGUgc3RhY2sgYmVsb3cgdGhlIGFyZ3VtZW50Ci0gICAgIHR5cGVzLCBpZiBhbnkuICAqLwotICBib29sZWFuICgqZnVuY3Rpb25fdHlwZSkgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIHJlZmVyZW5jZSB0byB0aGF0Ci0gICAgIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpyZWZlcmVuY2VfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSByYW5nZSBvZiB0aGF0IHR5cGUKLSAgICAgd2l0aCB0aGUgZ2l2ZW4gbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnJhbmdlX3R5cGUpIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci0KLSAgLyogUHVzaCBhbiBhcnJheSB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgdG9wIHR5cGUgb24gdGhlIHR5cGUKLSAgICAgc3RhY2sgaXMgdGhlIHJhbmdlLCBhbmQgdGhlIG5leHQgdHlwZSBvbiB0aGUgdHlwZSBzdGFjayBpcyB0aGUKLSAgICAgZWxlbWVudCB0eXBlLiAgVGhlc2Ugc2hvdWxkIGJlIHBvcHBlZCBiZWZvcmUgdGhlIGFycmF5IHR5cGUgaXMKLSAgICAgcHVzaGVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIGxvd2VyIGJvdW5kLCB0aGUgdXBwZXIgYm91bmQsIGFuZAotICAgICB3aGV0aGVyIHRoZSBhcnJheSBpcyBhIHN0cmluZy4gICovCi0gIGJvb2xlYW4gKCphcnJheV90eXBlKSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwKLQkJCQkgYm9vbGVhbikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgc2V0IG9mIHRoYXQgdHlwZQotICAgICBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoaXMgc2V0IGlzCi0gICAgIGEgYml0c3RyaW5nLiAgKi8KLSAgYm9vbGVhbiAoKnNldF90eXBlKSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLQotICAvKiBQdXNoIGFuIG9mZnNldCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgdG9wIHR5cGUgb24gdGhlCi0gICAgIHR5cGUgc3RhY2sgaXMgdGhlIHRhcmdldCB0eXBlLCBhbmQgdGhlIG5leHQgdHlwZSBvbiB0aGUgdHlwZQotICAgICBzdGFjayBpcyB0aGUgYmFzZSB0eXBlLiAgVGhlc2Ugc2hvdWxkIGJlIHBvcHBlZCBiZWZvcmUgdGhlIG9mZnNldAotICAgICB0eXBlIGlzIHB1c2hlZC4gICovCi0gIGJvb2xlYW4gKCpvZmZzZXRfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIG1ldGhvZCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgIGlzIHRydWUsIHRoZSB0b3AgdHlwZSBvbiB0aGUgc3RhY2sgaXMgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZQotICAgICBtZXRob2QgYmVsb25nczsgb3RoZXJ3aXNlLCB0aGUgY2xhc3MgbXVzdCBiZSBkZXRlcm1pbmVkIGJ5IHRoZQotICAgICBjbGFzcyB0byB3aGljaCB0aGUgbWV0aG9kIGlzIGF0dGFjaGVkLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZQotICAgICBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXM7IHRoZXNlIGFyZSBwdXNoZWQgb250byB0aGUgdHlwZSBzdGFjayBpbgotICAgICByZXZlcnNlIG9yZGVyICh0aGUgZmlyc3QgdHlwZSBwb3BwZWQgaXMgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlCi0gICAgIG1ldGhvZCkuICBBIHZhbHVlIG9mIC0xIGZvciB0aGUgdGhpcmQgYXJndW1lbnQgbWVhbnMgdGhhdCBubwotICAgICBhcmd1bWVudCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUKLSAgICAgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoZSBuZXh0Ci0gICAgIHR5cGUgb24gdGhlIHR5cGUgc3RhY2sgYmVsb3cgdGhlIGRvbWFpbiBhbmQgdGhlIGFyZ3VtZW50IHR5cGVzIGlzCi0gICAgIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kLiAgQWxsIHRoZXNlIHR5cGVzIG11c3QgYmUgcG9wcGVkLAotICAgICBhbmQgdGhlbiB0aGUgbWV0aG9kIHR5cGUgbXVzdCBiZSBwdXNoZWQuICAqLwotICBib29sZWFuICgqbWV0aG9kX3R5cGUpIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgY29uc3QgcXVhbGlmaWVkCi0gICAgIHZlcnNpb24gb2YgdGhhdCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqY29uc3RfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgdm9sYXRpbGUKLSAgICAgcXVhbGlmaWVkIHZlcnNpb24gb2YgdGhhdCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqdm9sYXRpbGVfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBzdHJ1Y3QuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIHRoZQotICAgICBzdHJ1Y3RfZmllbGQgZnVuY3Rpb24sIGFuZCBmaW5pc2hlZCBieSBhIGNhbGwgdG8gdGhlCi0gICAgIGVuZF9zdHJ1Y3RfdHlwZSBmdW5jdGlvbi4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHRhZzsgdGhpcwotICAgICB3aWxsIGJlIE5VTEwgaWYgdGhlcmUgaXNuJ3Qgb25lLiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBOVUxMLAotICAgICB0aGUgdGhpcmQgYXJndW1lbnQgaXMgYSBjb25zdGFudCBpZGVudGlmeWluZyB0aGlzIHN0cnVjdCBmb3IgdXNlCi0gICAgIHdpdGggdGFnX3R5cGUuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LCBmYWxzZQotICAgICBmb3IgYSB1bmlvbi4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZS4gIElmIHRoaXMgaXMgYW4KLSAgICAgdW5kZWZpbmVkIHN0cnVjdCBvciB1bmlvbiwgdGhlIHNpemUgd2lsbCBiZSAwIGFuZCBzdHJ1Y3RfZmllbGQKLSAgICAgd2lsbCBub3QgYmUgY2FsbGVkIGJlZm9yZSBlbmRfc3RydWN0X3R5cGUgaXMgY2FsbGVkLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X3N0cnVjdF90eXBlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQlib29sZWFuLCB1bnNpZ25lZCBpbnQpKTsKLQotICAvKiBBZGQgYSBmaWVsZCB0byB0aGUgc3RydWN0IHR5cGUgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhlIHR5cGUKLSAgICAgb2YgdGhlIGZpZWxkIHNob3VsZCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50cwotICAgICBhcmUgdGhlIG5hbWUsIHRoZSBiaXQgcG9zaXRpb24sIHRoZSBiaXQgc2l6ZSAobWF5IGJlIHplcm8gaWYgdGhlCi0gICAgIGZpZWxkIGlzIG5vdCBwYWNrZWQpLCBhbmQgdGhlIHZpc2liaWxpdHkuICAqLwotICBib29sZWFuICgqc3RydWN0X2ZpZWxkKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwKLQkJCQkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotICAvKiBGaW5pc2ggYnVpbGRpbmcgYSBzdHJ1Y3QsIGFuZCBwdXNoIGl0IG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqZW5kX3N0cnVjdF90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBTdGFydCBidWlsZGluZyBhIGNsYXNzLiAgVGhpcyBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBzZXZlcmFsCi0gICAgIGZ1bmN0aW9uczogc3RydWN0X2ZpZWxkLCBjbGFzc19zdGF0aWNfbWVtYmVyLCBjbGFzc19iYXNlY2xhc3MsCi0gICAgIGNsYXNzX3N0YXJ0X21ldGhvZCwgY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCi0gICAgIGNsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwgYW5kIGNsYXNzX2VuZF9tZXRob2QuICBUaGUgY2xhc3MgaXMKLSAgICAgZmluaXNoZWQgYnkgYSBjYWxsIHRvIGVuZF9jbGFzc190eXBlLiAgVGhlIGZpcnN0IGZpdmUgYXJndW1lbnRzCi0gICAgIGFyZSB0aGUgc2FtZSBhcyBmb3Igc3RhcnRfc3RydWN0X3R5cGUuICBUaGUgc2l4dGggYXJndW1lbnQgaXMKLSAgICAgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZpcnR1YWwgZnVuY3Rpb24gdGFibGU7IGlmIHRoZXJlIGlzLCB0aGUKLSAgICAgc2V2ZW50aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGNhbiBiZQotICAgICBmb3VuZCBpbiB0aGUgdHlwZSBpdHNlbGYsIGFuZCBpcyBmYWxzZSBpZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Ci0gICAgIGhvbGRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgc2hvdWxkIGJlIHBvcHBlZCBmcm9tIHRoZSB0eXBlCi0gICAgIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X2NsYXNzX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJICAgICAgIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgYm9vbGVhbiwKLQkJCQkgICAgICAgYm9vbGVhbikpOwotCi0gIC8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gdGhlIGNsYXNzIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoZQotICAgICBhcmd1bWVudHMgYXJlIHRoZSBmaWVsZCBuYW1lLCB0aGUgcGh5c2ljYWwgbmFtZSwgYW5kIHRoZQotICAgICB2aXNpYmlsaXR5LiAgVGhlIHR5cGUgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX3N0YXRpY19tZW1iZXIpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkJCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0gIAotICAvKiBBZGQgYSBiYXNlY2xhc3MgdG8gdGhlIGNsYXNzIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoZSB0eXBlIG9mCi0gICAgIHRoZSBiYXNlY2xhc3MgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50cwotICAgICBhcmUgdGhlIGJpdCBwb3NpdGlvbiwgd2hldGhlciB0aGUgY2xhc3MgaXMgdmlydHVhbCwgYW5kIHRoZQotICAgICB2aXNpYmlsaXR5LiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX2Jhc2VjbGFzcykgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLAotCQkJCSAgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0gIC8qIFN0YXJ0IGFkZGluZyBhIG1ldGhvZCB0byB0aGUgY2xhc3MgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhpcwotICAgICBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBjbGFzc19tZXRob2RfdmFyaWFudCBhbmQKLSAgICAgY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IHRvIGRlc2NyaWJlIGRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUKLSAgICAgbWV0aG9kIHdoaWNoIHRha2UgZGlmZmVyZW50IGFyZ3VtZW50cy4gIFRoZSBtZXRob2QgaXMgZmluaXNoZWQKLSAgICAgd2l0aCBhIGNhbGwgdG8gY2xhc3NfZW5kX21ldGhvZC4gIFRoZSBhcmd1bWVudCBpcyB0aGUgbWV0aG9kCi0gICAgIG5hbWUuICAqLwotICBib29sZWFuICgqY2xhc3Nfc3RhcnRfbWV0aG9kKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIERlc2NyaWJlIGEgdmFyaWFudCB0byB0aGUgY2xhc3MgbWV0aG9kIGN1cnJlbnRseSBiZWluZyBidWlsdC4KLSAgICAgVGhlIHR5cGUgb2YgdGhlIHZhcmlhbnQgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlCi0gICAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBUaGUKLSAgICAgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgdGhlIHZpc2liaWxpdHksIHdoZXRoZXIgdGhlIHZhcmlhbnQgaXMKLSAgICAgY29uc3QsIHdoZXRoZXIgdGhlIHZhcmlhbnQgaXMgdm9sYXRpbGUsIHRoZSBvZmZzZXQgaW4gdGhlIHZpcnR1YWwKLSAgICAgZnVuY3Rpb24gdGFibGUsIGFuZCB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIG9uIHRoZSB0eXBlIHN0YWNrCi0gICAgIChiZWxvdyB0aGUgdmFyaWFudCB0eXBlKS4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19tZXRob2RfdmFyaWFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0JCQkJCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSwKLQkJCQkJICAgYm9vbGVhbiwgYm9vbGVhbiwKLQkJCQkJICAgYmZkX3ZtYSwgYm9vbGVhbikpOwotCi0gIC8qIERlc2NyaWJlIGEgc3RhdGljIHZhcmlhbnQgdG8gdGhlIGNsYXNzIG1ldGhvZCBjdXJyZW50bHkgYmVpbmcKLSAgICAgYnVpbHQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCi0gICAgIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmd1bWVudHMgYXJlIG9taXR0ZWQuICBUaGUgdHlwZSBvZiB0aGUKLSAgICAgdmFyaWFudCBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKLQkJCQkJCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5LAotCQkJCQkJICBib29sZWFuLCBib29sZWFuKSk7Ci0KLSAgLyogRmluaXNoIGRlc2NyaWJpbmcgYSBjbGFzcyBtZXRob2QuICAqLwotICBib29sZWFuICgqY2xhc3NfZW5kX21ldGhvZCkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogRmluaXNoIGRlc2NyaWJpbmcgYSBjbGFzcywgYW5kIHB1c2ggaXQgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCplbmRfY2xhc3NfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIHR5cGUgb24gdGhlIHN0YWNrIHdoaWNoIHdhcyBnaXZlbiBhIG5hbWUgYnkgYW4gZWFybGllcgotICAgICBjYWxsIHRvIHR5cGRlZi4gICovCi0gIGJvb2xlYW4gKCp0eXBlZGVmX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogUHVzaCBhIHRhZ2dlZCB0eXBlIG9uIHRoZSBzdGFjayB3aGljaCB3YXMgZGVmaW5lZCBlYXJsaWVyLiAgSWYKLSAgICAgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlIHR5cGUgd2FzIGRlZmluZWQgYnkgYSBjYWxsCi0gICAgIHRvIHRhZy4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgTlVMTCwgdGhlIHR5cGUgd2FzIGRlZmluZWQgYnkKLSAgICAgYSBjYWxsIHRvIHN0YXJ0X3N0cnVjdF90eXBlIG9yIHN0YXJ0X2NsYXNzX3R5cGUgd2l0aCBhIHRhZyBvZgotICAgICBOVUxMIGFuZCB0aGUgbnVtYmVyIG9mIHRoZSB0aGlyZCBhcmd1bWVudC4gIEVpdGhlciB3YXksIHRoZQotICAgICBmb3VydGggYXJndW1lbnQgaXMgdGhlIHRhZyBraW5kLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGNhbGxlZAotICAgICBmb3IgYSBzdHJ1Y3QgKGNsYXNzKSBiZWluZyBkZWZpbmVkLCBpbiBiZXR3ZWVuIHRoZSBjYWxsIHRvCi0gICAgIHN0YXJ0X3N0cnVjdF90eXBlIChzdGFydF9jbGFzc190eXBlKSBhbmQgdGhlIGNhbGwgdG8KLSAgICAgZW5kX3N0cnVjdF90eXBlIChlbmRfY2xhc3NfdHlwZSkuICAqLwotICBib29sZWFuICgqdGFnX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLQotICAvKiBQb3AgdGhlIHR5cGUgc3RhY2ssIGFuZCB0eXBlZGVmIGl0IHRvIHRoZSBnaXZlbiBuYW1lLiAgKi8KLSAgYm9vbGVhbiAoKnR5cGRlZikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBQb3AgdGhlIHR5cGUgc3RhY2ssIGFuZCBkZWNsYXJlIGl0IGFzIGEgdGFnZ2VkIHN0cnVjdCBvciB1bmlvbiBvcgotICAgICBlbnVtIG9yIHdoYXRldmVyLiAgVGhlIHRhZyBwYXNzZWQgZG93biBoZXJlIGlzIHJlZHVuZGFudCwgc2luY2UKLSAgICAgd2FzIGFsc28gcGFzc2VkIHdoZW4gZW51bV90eXBlLCBzdGFydF9zdHJ1Y3RfdHlwZSwgb3IKLSAgICAgc3RhcnRfY2xhc3NfdHlwZSB3YXMgY2FsbGVkLiAgKi8KLSAgYm9vbGVhbiAoKnRhZykgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSBuYW1lZCBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLSAgYm9vbGVhbiAoKmludF9jb25zdGFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSBuYW1lZCBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0gIGJvb2xlYW4gKCpmbG9hdF9jb25zdGFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIHR5cGVkIGludGVnZXIgY29uc3RhbnQuICBUaGUgdHlwZSBpcwotICAgICBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnR5cGVkX2NvbnN0YW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIHZhcmlhYmxlLiAgVGhlIHR5cGUgaXMgcG9wcGVkIG9mZiB0aGUKLSAgICAgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCp2YXJpYWJsZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsCi0JCQkgICAgICAgYmZkX3ZtYSkpOwotCi0gIC8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgZnVuY3Rpb24uICBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBwb3BwZWQgb2ZmCi0gICAgIHRoZSBzdGFjay4gIFRoZSBib29sZWFuIGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGlzIGdsb2JhbC4gIFRoaXMKLSAgICAgaXMgZm9sbG93ZWQgYnkgY2FsbHMgdG8gZnVuY3Rpb25fcGFyYW1ldGVyLCBmb2xsb3dlZCBieSBibG9jawotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9mdW5jdGlvbikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLQotICAvKiBSZWNvcmQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIHR5cGUKLSAgICAgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpmdW5jdGlvbl9wYXJhbWV0ZXIpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotCQkJCQkgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLQotICAvKiBTdGFydCB3cml0aW5nIG91dCBhIGJsb2NrLiAgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRvcCBsZXZlbCBibG9jawotICAgICBwZXIgZnVuY3Rpb24uICBCbG9ja3MgbWF5IGJlIG5lc3RlZC4gIFRoZSBhcmd1bWVudCBpcyB0aGUKLSAgICAgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgYmxvY2suICAqLwotICBib29sZWFuICgqc3RhcnRfYmxvY2spIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotCi0gIC8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGJsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBlbmRpbmcgYWRkcmVzcwotICAgICBvZiB0aGUgYmxvY2suICAqLwotICBib29sZWFuICgqZW5kX2Jsb2NrKSBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotICAvKiBGaW5pc2ggd3JpdGluZyBvdXQgYSBmdW5jdGlvbi4gICovCi0gIGJvb2xlYW4gKCplbmRfZnVuY3Rpb24pIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFJlY29yZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIGJvb2xlYW4gKCpsaW5lbm8pIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hKSk7Ci19OwotCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMuICAqLwotCi0vKiBUaGUgZmlyc3QgYXJndW1lbnQgdG8gbW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgYSBoYW5kbGUuICBUaGlzCi0gICBoYW5kbGUgaXMgcmV0dXJuZWQgYnkgdGhlIGRlYnVnX2luaXQgZnVuY3Rpb24uICBUaGUgcHVycG9zZSBvZiB0aGUKLSAgIGhhbmRsZSBpcyB0byBwZXJtaXQgdGhlIGRlYnVnZ2luZyByb3V0aW5lcyB0byBub3QgdXNlIHN0YXRpYwotICAgdmFyaWFibGVzLCBhbmQgaGVuY2UgdG8gYmUgcmVlbnRyYW50LiAgVGhpcyB3b3VsZCBiZSB1c2VmdWwgZm9yIGEKLSAgIHByb2dyYW0gd2hpY2ggd2FudGVkIHRvIGhhbmRsZSB0d28gZXhlY3V0YWJsZXMgc2ltdWx0YW5lb3VzbHkuICAqLwotCi0vKiBSZXR1cm4gYSBkZWJ1Z2dpbmcgaGFuZGxlLiAgKi8KLQotZXh0ZXJuIFBUUiBkZWJ1Z19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogU2V0IHRoZSBzb3VyY2UgZmlsZW5hbWUuICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgbmV3IGNvbXBpbGF0aW9uCi0gICB1bml0LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc2V0X2ZpbGVuYW1lIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIENoYW5nZSBzb3VyY2UgZmlsZXMgdG8gdGhlIGdpdmVuIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGluY2x1ZGUgZmlsZXMgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3N0YXJ0X3NvdXJjZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZWNvcmQgYSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIGZ1bmN0aW9uCi0gICBibG9jay4gIFRoZSBkZWJ1Z190eXBlIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuCi0gICBUaGUgYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgZ2xvYmFsbHkgdmlzaWJsZS4KLSAgIFRoZSBiZmRfdm1hIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICBDdXJyZW50bHkKLSAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHNwZWNpZmllZCBieSBjYWxscyB0bwotICAgZGVidWdfcmVjb3JkX3BhcmFtZXRlci4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9mdW5jdGlvbgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgYm9vbGVhbiwgYmZkX3ZtYSkpOwotCi0vKiBSZWNvcmQgYSBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3BhcmFtZXRlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLQotLyogRW5kIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZSBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUKLSAgIGZ1bmN0aW9uIGVuZHMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLS8qIFN0YXJ0IGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIEFsbCBsb2NhbCBpbmZvcm1hdGlvbiB3aWxsIGJlCi0gICByZWNvcmRlZCBpbiB0aGlzIGJsb2NrLCB1bnRpbCB0aGUgbWF0Y2hpbmcgY2FsbCB0byBkZWJ1Z19lbmRfYmxvY2suCi0gICBkZWJ1Z19zdGFydF9ibG9jayBhbmQgZGVidWdfZW5kX2Jsb2NrIG1heSBiZSBuZXN0ZWQuICBUaGUgYXJndW1lbnQKLSAgIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sgc3RhcnRzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLS8qIEZpbmlzaCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBUaGlzIG1hdGNoZXMgdGhlIGNhbGwgdG8KLSAgIGRlYnVnX3N0YXJ0X2Jsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sKLSAgIGVuZHMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLS8qIEFzc29jaWF0ZSBhIGxpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdpdGggYSBnaXZlbgotICAgYWRkcmVzcy4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9saW5lIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi0vKiBTdGFydCBhIG5hbWVkIGNvbW1vbiBibG9jay4gIFRoaXMgaXMgYSBibG9jayBvZiB2YXJpYWJsZXMgdGhhdCBtYXkKLSAgIG1vdmUgaW4gbWVtb3J5LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEVuZCBhIG5hbWVkIGNvbW1vbiBibG9jay4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX2VuZF9jb21tb25fYmxvY2sgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogUmVjb3JkIGEgbmFtZWQgaW50ZWdlciBjb25zdGFudC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9pbnRfY29uc3QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLQotLyogUmVjb3JkIGEgbmFtZWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotCi0vKiBSZWNvcmQgYSB0eXBlZCBjb25zdGFudCB3aXRoIGFuIGludGVncmFsIHZhbHVlLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3R5cGVkX2NvbnN0Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hKSk7Ci0KLS8qIFJlY29yZCBhIGxhYmVsLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2xhYmVsCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hKSk7Ci0KLS8qIFJlY29yZCBhIHZhcmlhYmxlLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci0KLS8qIE1ha2UgYW4gaW5kaXJlY3QgdHlwZS4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdGhlCi0gICBsb2NhdGlvbiB3aGVyZSB0aGUgcmVhbCB0eXBlIHdpbGwgYmUgcGxhY2VkLiAgVGhlIHNlY29uZCBhcmd1bWVudAotICAgaXMgdGhlIHR5cGUgdGFnLCBpZiB0aGVyZSBpcyBvbmU7IHRoaXMgbWF5IGJlIE5VTEw7IHRoZSBvbmx5Ci0gICBwdXJwb3NlIG9mIHRoaXMgYXJndW1lbnQgaXMgc28gdGhhdCBkZWJ1Z19nZXRfdHlwZV9uYW1lIGNhbiByZXR1cm4KLSAgIHNvbWV0aGluZyB1c2VmdWwuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHdoZW4gYSB0eXBlIGlzCi0gICByZWZlcmVuY2VkIGJlZm9yZSBpdCBpcyBkZWZpbmVkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSAqLCBjb25zdCBjaGFyICopKTsKLQotLyogTWFrZSBhIHZvaWQgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOwotCi0vKiBNYWtlIGFuIGludGVnZXIgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBUaGUgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlCi0gICBpZiB0aGUgaW50ZWdlciBpcyB1bnNpZ25lZC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIGZsb2F0aW5nIHBvaW50IHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgRklYTUU6IE9uIHNvbWUKLSAgIHBsYXRmb3JtcywgbGlrZSBhbiBBbHBoYSwgeW91IHByb2JhYmx5IG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5Ci0gICB0aGUgZm9ybWF0LiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9mbG9hdF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIE1ha2UgYSBib29sZWFuIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogTWFrZSBhIGNvbXBsZXggdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotCi0vKiBNYWtlIGEgc3RydWN0dXJlIHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LAotICAgZmFsc2UgZm9yIGEgdW5pb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdC4KLSAgIFRoZSBmb3VydGggYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX2ZpZWxkICopKTsKLQotLyogTWFrZSBhbiBvYmplY3QgdHlwZS4gIFRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGhhbmRsZQotICAgYXJlIHRoZSBzYW1lIGFzIGZvciBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlLiAgVGhlIG5leHQgYXJndW1lbnRzIGFyZQotICAgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLCBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZgotICAgbWV0aG9kcywgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBob2xkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCi0gICBpZiBpdCBpcyBub3QgdGhpcyBvYmplY3QsIGFuZCBhIGJvb2xlYW4gd2hpY2ggaXMgdHJ1ZSBpZiB0aGlzCi0gICBvYmplY3QgaGFzIGl0cyBvd24gdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfb2JqZWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBib29sZWFuLCBiZmRfdm1hLCBkZWJ1Z19maWVsZCAqLCBkZWJ1Z19iYXNlY2xhc3MgKiwKLQkgICBkZWJ1Z19tZXRob2QgKiwgZGVidWdfdHlwZSwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGFuIGVudW1lcmF0aW9uIHR5cGUuICBUaGUgYXJndW1lbnRzIGFyZSBhIG51bGwgdGVybWluYXRlZAotICAgYXJyYXkgb2Ygc3RyaW5ncywgYW5kIGFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9lbnVtX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqLCBiZmRfc2lnbmVkX3ZtYSAqKSk7Ci0KLS8qIE1ha2UgYSBwb2ludGVyIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfcG9pbnRlcl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgZnVuY3Rpb24gdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJldHVybiB0eXBlLiAgVGhlCi0gICB0aGlyZCBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gIFRoZQotICAgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0gICBhcmd1bWVudHMuICBJZiB0aGUgdGhpcmQgYXJndW1lbnQgaXMgTlVMTCwgdGhlbiB0aGUgYXJndW1lbnQgdHlwZXMKLSAgIGFyZSB1bmtub3duLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSAqLCBib29sZWFuKSk7Ci0KLS8qIE1ha2UgYSByZWZlcmVuY2UgdG8gYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHJhbmdlIG9mIGEgZ2l2ZW4gdHlwZSBmcm9tIGEgbG93ZXIgdG8gYW4gdXBwZXIgYm91bmQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3JhbmdlX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50Ci0gICBvZiB0aGUgYXJyYXkuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYSByYW5nZSBvZiB0aGUKLSAgIGFycmF5LiAgVGhlIGZvdXJ0aCBhbmQgZmlmdGggYXJndW1lbnQgYXJlIHRoZSBsb3dlciBhbmQgdXBwZXIKLSAgIGJvdW5kcywgcmVzcGVjdGl2ZWx5IChpZiB0aGUgYm91bmRzIGFyZSBub3Qga25vd24sIGxvd2VyIHNob3VsZCBiZQotICAgMCBhbmQgdXBwZXIgc2hvdWxkIGJlIC0xKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMKLSAgIGFycmF5IGlzIGFjdHVhbGx5IGEgc3RyaW5nLCBhcyBpbiBDLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLAotCSAgIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIHNldCBvZiBhIGdpdmVuIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBQYXNjYWwgc2V0IHR5cGUuICBUaGUKLSAgIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIHNldCBpcyBhY3R1YWxseSBhIGJpdHN0cmluZywgYXMgaW4KLSAgIENISUxMLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIHR5cGUgZm9yIGEgcG9pbnRlciB3aGljaCBpcyByZWxhdGl2ZSB0byBhbiBvYmplY3QuICBUaGUKLSAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoZSBwb2ludGVyIGlzCi0gICByZWxhdGl2ZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSB0aGF0IHRoZSBwb2ludGVyIHBvaW50cwotICAgdG8uICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX29mZnNldF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgdHlwZSBmb3IgYSBtZXRob2QgZnVuY3Rpb24uICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQotICAgcmV0dXJuIHR5cGUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGRvbWFpbi4gIFRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgVGhlIGZpZnRoCi0gICBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZgotICAgYXJndW1lbnRzLCBpbiB3aGljaCBjYXNlIHRoZSBhcnJheSBvZiBhcmd1bWVudCB0eXBlcyBpbmRpY2F0ZXMgdGhlCi0gICB0eXBlcyBvZiB0aGUgZmlyc3QgYXJndW1lbnRzLiAgVGhlIGRvbWFpbiBhbmQgdGhlIGFyZ3VtZW50IGFycmF5Ci0gICBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGlzIGlzIGEgc3R1YiBtZXRob2QgYW5kIHRoYXQKLSAgIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICBTdGFicyBkZWJ1Z2dpbmcgdXNlcyB0aGlzLCBhbmQgZ2V0cwotICAgdGhlIGFyZ3VtZW50IHR5cGVzIGZyb20gdGhlIG1hbmdsZWQgbmFtZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlICosIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfY29uc3RfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhbiB1bmRlZmluZWQgdGFnZ2VkIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBzdHJ1Y3Qgd2hpY2ggaGFzCi0gICBiZWVuIG1lbnRpb25lZCwgYnV0IG5vdCBkZWZpbmVkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci0KLS8qIE1ha2UgYSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBiYXNlCi0gICBjbGFzcyB0eXBlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhpcyBiYXNlCi0gICBjbGFzcyBpbiB0aGUgb2JqZWN0LiAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMgYQotICAgdmlydHVhbCBjbGFzcy4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgYmFzZQotICAgY2xhc3MuICAqLwotCi1leHRlcm4gZGVidWdfYmFzZWNsYXNzIGRlYnVnX21ha2VfYmFzZWNsYXNzCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0KLS8qIE1ha2UgYSBmaWVsZCBmb3IgYSBzdHJ1Y3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lLiAgVGhlCi0gICB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzCi0gICB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZC4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZgotICAgdGhlIGZpZWxkIChpdCBtYXkgYmUgemVybykuICBUaGUgc2l4dGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkKLSAgIG9mIHRoZSBmaWVsZC4gICovCi0KLWV4dGVybiBkZWJ1Z19maWVsZCBkZWJ1Z19tYWtlX2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hLCBiZmRfdm1hLAotCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0vKiBNYWtlIGEgc3RhdGljIG1lbWJlciBvZiBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQotICAgbmFtZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgbWVtYmVyLiAgVGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIG1lbWJlciAoaS5lLiwgdGhlIG5hbWUgYXMgYQotICAgZ2xvYmFsIHZhcmlhYmxlKS4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUKLSAgIG1lbWJlci4gICovCi0KLWV4dGVybiBkZWJ1Z19maWVsZCBkZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwKLQkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotLyogTWFrZSBhIG1ldGhvZC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUsIGFuZCB0aGUgdGhpcmQKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG1ldGhvZCB2YXJpYW50cy4gIEVhY2gKLSAgIG1ldGhvZCB2YXJpYW50IGlzIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIGJ1dCB3aXRoIGRpZmZlcmVudAotICAgYXJndW1lbnQgdHlwZXMuICAqLwotCi1leHRlcm4gZGVidWdfbWV0aG9kIGRlYnVnX21ha2VfbWV0aG9kCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKSk7Ci0KLS8qIE1ha2UgYSBtZXRob2QgdmFyaWFudC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YKLSAgIHRoZSBmdW5jdGlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24sCi0gICBwcm9iYWJseSBjb25zdHJ1Y3RlZCBieSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlLiAgVGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzCi0gICBhIGNvbnN0IGZ1bmN0aW9uLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhIHZvbGF0aWxlCi0gICBmdW5jdGlvbi4gIFRoZSBzZXZlbnRoIGFyZ3VtZW50IGlzIHRoZSBpbmRleCBpbiB0aGUgdmlydHVhbAotICAgZnVuY3Rpb24gdGFibGUsIGlmIGFueS4gIFRoZSBlaWdodGggYXJndW1lbnQgaXMgdGhlIHZpcnR1YWwKLSAgIGZ1bmN0aW9uIGNvbnRleHQuICAqLwotCi1leHRlcm4gZGVidWdfbWV0aG9kX3ZhcmlhbnQgZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLAotCSAgIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHN0YXRpYyBtZXRob2QgYXJndW1lbnQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IKLSAgIGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmUgb21pdHRlZAotICAgc2luY2UgYSBzdGF0aWMgbWV0aG9kIGNhbiBub3QgYWxzbyBiZSB2aXJ0dWFsLiAgKi8KLQotZXh0ZXJuIGRlYnVnX21ldGhvZF92YXJpYW50IGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotCi0vKiBOYW1lIGEgdHlwZS4gIFRoaXMgcmV0dXJucyBhIG5ldyB0eXBlIHdpdGggYW4gYXR0YWNoZWQgbmFtZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX25hbWVfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSkpOwotCi0vKiBHaXZlIGEgdGFnIHRvIGEgdHlwZSwgc3VjaCBhcyBhIHN0cnVjdCBvciB1bmlvbi4gIFRoaXMgcmV0dXJucyBhCi0gICBuZXcgdHlwZSB3aXRoIGFuIGF0dGFjaGVkIHRhZy4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX3RhZ190eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIFJlY29yZCB0aGUgc2l6ZSBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEZpbmQgYSBuYW1lZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZmluZF9uYW1lZF90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEZpbmQgYSB0YWdnZWQgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci0KLS8qIEdldCB0aGUga2luZCBvZiBhIHR5cGUuICAqLwotCi1leHRlcm4gZW51bSBkZWJ1Z190eXBlX2tpbmQgZGVidWdfZ2V0X3R5cGVfa2luZCBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgdHlwZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpkZWJ1Z19nZXRfdHlwZV9uYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIHNpemUgb2YgYSB0eXBlLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgZGVidWdfZ2V0X3R5cGVfc2l6ZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZ2V0X3JldHVybl90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBwYXJhbWV0ZXIgdHlwZXMgZm9yIGEgZnVuY3Rpb24gb3IKLSAgIG1ldGhvZCB0eXBlIChhY3R1YWxseSwgcGFyYW1ldGVyIHR5cGVzIGFyZSBub3QgY3VycmVudGx5IHN0b3JlZCBmb3IKLSAgIGZ1bmN0aW9uIHR5cGVzKS4gIFRoaXMgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtZXRob2QKLSAgIHR5cGUgaXMgYSBzdHViIG1ldGhvZCBvciBub3QuICBUaGUgbGFzdCBhcmd1bWVudCBwb2ludHMgdG8gYQotICAgYm9vbGVhbiB3aGljaCBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZQotICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0KLWV4dGVybiBjb25zdCBkZWJ1Z190eXBlICpkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIFBBUkFNUyAoKFBUUiwKLQkJCQkJCQkgICAgZGVidWdfdHlwZSwKLQkJCQkJCQkgICAgYm9vbGVhbiAqKSk7Ci0KLS8qIEdldCB0aGUgdGFyZ2V0IHR5cGUgb2YgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSBvciBjb25zdCBvciB2b2xhdGlsZQotICAgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2dldF90YXJnZXRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzIGZvciBhIHN0cnVjdCwgdW5pb24sIG9yCi0gICBjbGFzcy4gICovCi0KLWV4dGVybiBjb25zdCBkZWJ1Z19maWVsZCAqZGVidWdfZ2V0X2ZpZWxkcyBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSB0eXBlIG9mIGEgZmllbGQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19nZXRfZmllbGRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIGZpZWxkLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlYnVnX2dldF9maWVsZF9uYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSBiaXQgcG9zaXRpb24gb2YgYSBmaWVsZCB3aXRoaW4gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlLgotICAgSWYgdGhlIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciwgdGhpcyB3aWxsIHJldHVybiAoYmZkX3ZtYSkgLTEuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBkZWJ1Z19nZXRfZmllbGRfYml0cG9zIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSBiaXQgc2l6ZSBvZiBhIGZpZWxkLiAgSWYgdGhlIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciwgdGhpcwotICAgd2lsbCByZXR1cm4gKGJmZF92bWEpIC0xLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZC4gICovCi0KLWV4dGVybiBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgYSBmaWVsZCwgaWYgaXQgaXMgYSBzdGF0aWMgbWVtYmVyLiAgSWYgdGhlCi0gICBmaWVsZCBpcyBub3QgYSBzdGF0aWMgbWVtYmVyLCB0aGlzIHdpbGwgcmV0dXJuIE5VTEwuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogV3JpdGUgb3V0IHRoZSByZWNvcmRlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHRha2VzIGEgc2V0IG9mCi0gICBmdW5jdGlvbiBwb2ludGVycyB3aGljaCBhcmUgY2FsbGVkIHRvIGRvIHRoZSBhY3R1YWwgd3JpdGluZy4gIFRoZQotICAgZmlyc3QgUFRSIGlzIHRoZSBkZWJ1Z2dpbmcgaGFuZGxlLiAgVGhlIHNlY29uZCBQVFIgaXMgYSBoYW5kbGUKLSAgIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfd3JpdGUgUEFSQU1TICgoUFRSLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUikpOwotCi0jZW5kaWYgLyogREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVmbGV4LmwgYi9iaW51dGlscy9kZWZsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhNDNjMC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZWZsZXgubAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSV7LyogZGVmbGV4LmwgLSBMZXhlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVmcGFyc2UuaCIKLSNpbmNsdWRlICJkbGx0b29sLmgiCi0KLWludCBsaW5lbnVtYmVyOwotCi0lfQotJSUKLSJOQU1FIiAJCXsgcmV0dXJuIE5BTUU7fQotIkxJQlJBUlkiCXsgcmV0dXJuIExJQlJBUlk7fQotIkRFU0NSSVBUSU9OIiAJeyByZXR1cm4gREVTQ1JJUFRJT047fQotIlNUQUNLU0laRSIJeyByZXR1cm4gU1RBQ0tTSVpFO30KLSJIRUFQU0laRSIgCXsgcmV0dXJuIEhFQVBTSVpFO30KLSJDT0RFIiAJCXsgcmV0dXJuIENPREU7fQotIkRBVEEiCQl7IHJldHVybiBEQVRBO30KLSJTRUNUSU9OUyIJeyByZXR1cm4gU0VDVElPTlM7fQotIkVYUE9SVFMiCXsgcmV0dXJuIEVYUE9SVFM7fQotIklNUE9SVFMiCXsgcmV0dXJuIElNUE9SVFM7fQotIlZFUlNJT04iCXsgcmV0dXJuIFZFUlNJT05LO30KLSJCQVNFIgkJeyByZXR1cm4gQkFTRTt9Ci0iQ09OU1RBTlQiCXsgcmV0dXJuIENPTlNUQU5UOyB9Ci0iTk9OQU1FIgl7IHJldHVybiBOT05BTUU7IH0KLSJSRUFEIgkJeyByZXR1cm4gUkVBRDt9Ci0iV1JJVEUiCQl7IHJldHVybiBXUklURTt9Ci0iRVhFQ1VURSIJeyByZXR1cm4gRVhFQ1VURTt9Ci0iU0hBUkVEIgl7IHJldHVybiBTSEFSRUQ7fQotIk5PTlNIQVJFRCIJeyByZXR1cm4gTk9OU0hBUkVEO30KLSJTSU5HTEUiCXsgcmV0dXJuIFNJTkdMRTt9Ci0iTVVMVElQTEUiCXsgcmV0dXJuIE1VTFRJUExFO30KLSJJTklUSU5TVEFOQ0UiCXsgcmV0dXJuIElOSVRJTlNUQU5DRTt9Ci0iSU5JVEdMT0JBTCIJeyByZXR1cm4gSU5JVEdMT0JBTDt9Ci0iVEVSTUlOU1RBTkNFIgl7IHJldHVybiBURVJNSU5TVEFOQ0U7fQotIlRFUk1HTE9CQUwiCXsgcmV0dXJuIFRFUk1HTE9CQUw7fQotCi1bMC05XVt4MC05QS1GYS1mXSogeyB5eWx2YWwubnVtYmVyID0gc3RydG9sICh5eXRleHQsMCwwKTsgCi0JCXJldHVybiBOVU1CRVI7IH0KLQotW0EtWmEteiQ6XC1cXz9dW0EtWmEtejAtOS8kOlwtXF9AP10qIHsgCQotCQl5eWx2YWwuaWQgPSAgeHN0cmR1cCAoeXl0ZXh0KTsKLQkJcmV0dXJuIElEOwotCQl9Ci0KLSJcIiJbXlwiXSoiXCIiIHsKLQkJeXlsdmFsLmlkID0geHN0cmR1cCAoeXl0ZXh0KzEpOwotCQl5eWx2YWwuaWRbeXlsZW5nLTJdID0gMDsKLQkJcmV0dXJuIElEOwotCQl9Ci0KLSJcJyJbXlwnXSoiXCciIHsKLQkJeXlsdmFsLmlkID0geHN0cmR1cCAoeXl0ZXh0KzEpOwotCQl5eWx2YWwuaWRbeXlsZW5nLTJdID0gMDsKLQkJcmV0dXJuIElEOwotCQl9Ci0iKiIuKiAJCXsgfQotIjsiLiogCQl7IH0KLSIgIgkJeyB9Ci0iXHQiCQl7IH0KLSJcbiIJIAl7IGxpbmVudW1iZXIgKysgO30KLSI9IiAJCXsgcmV0dXJuICc9Jzt9Ci0iLiIgCQl7IHJldHVybiAnLic7fQotIkAiCSAJeyByZXR1cm4gJ0AnO30KLSIsIgkJeyByZXR1cm4gJywnO30KLSUlCi0jaWZuZGVmIHl5d3JhcAotLyogTmVlZGVkIGZvciBsZXgsIHRob3VnaCBub3QgZmxleC4gKi8KLWludCB5eXdyYXAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlZnBhcnNlLnkgYi9iaW51dGlscy9kZWZwYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzE4ZDQ2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlZnBhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotJXsgLyogZGVmcGFyc2UueSAtIHBhcnNlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiZGxsdG9vbC5oIgotJX0KLQotJXVuaW9uIHsKLSAgY2hhciAqaWQ7Ci0gIGludCBudW1iZXI7Ci19OwotCi0ldG9rZW4gTkFNRSwgTElCUkFSWSwgREVTQ1JJUFRJT04sIFNUQUNLU0laRSwgSEVBUFNJWkUsIENPREUsIERBVEEKLSV0b2tlbiBTRUNUSU9OUywgRVhQT1JUUywgSU1QT1JUUywgVkVSU0lPTkssIEJBU0UsIENPTlNUQU5UCi0ldG9rZW4gUkVBRCBXUklURSBFWEVDVVRFIFNIQVJFRCBOT05TSEFSRUQgTk9OQU1FCi0ldG9rZW4gU0lOR0xFIE1VTFRJUExFIElOSVRJTlNUQU5DRSBJTklUR0xPQkFMIFRFUk1JTlNUQU5DRSBURVJNR0xPQkFMCi0ldG9rZW4gPGlkPiBJRAotJXRva2VuIDxudW1iZXI+IE5VTUJFUgotJXR5cGUgIDxudW1iZXI+IG9wdF9iYXNlIG9wdF9vcmRpbmFsIG9wdF9OT05BTUUgb3B0X0NPTlNUQU5UIG9wdF9EQVRBCi0ldHlwZSAgPG51bWJlcj4gYXR0ciBhdHRyX2xpc3Qgb3B0X251bWJlcgotJXR5cGUgIDxpZD4gb3B0X25hbWUgb3B0X2VxdWFsX25hbWUgCi0KLSUlCi0KLXN0YXJ0OiBzdGFydCBjb21tYW5kCi0JfCBjb21tYW5kCi0JOwotCi1jb21tYW5kOiAKLQkJTkFNRSBvcHRfbmFtZSBvcHRfYmFzZSB7IGRlZl9uYW1lICgkMiwgJDMpOyB9Ci0JfAlMSUJSQVJZIG9wdF9uYW1lIG9wdF9iYXNlIG9wdGlvbl9saXN0IHsgZGVmX2xpYnJhcnkgKCQyLCAkMyk7IH0KLQl8CUVYUE9SVFMgZXhwbGlzdCAKLQl8CURFU0NSSVBUSU9OIElEIHsgZGVmX2Rlc2NyaXB0aW9uICgkMik7fQotCXwJU1RBQ0tTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX3N0YWNrc2l6ZSAoJDIsICQzKTt9Ci0JfAlIRUFQU0laRSBOVU1CRVIgb3B0X251bWJlciB7IGRlZl9oZWFwc2l6ZSAoJDIsICQzKTt9Ci0JfAlDT0RFIGF0dHJfbGlzdCB7IGRlZl9jb2RlICgkMik7fQotCXwJREFUQSBhdHRyX2xpc3QgIHsgZGVmX2RhdGEgKCQyKTt9Ci0JfAlTRUNUSU9OUyBzZWNsaXN0Ci0JfAlJTVBPUlRTIGltcGxpc3QKLQl8CVZFUlNJT05LIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwwKTt9Ci0JfAlWRVJTSU9OSyBOVU1CRVIgJy4nIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwkNCk7fQotCTsKLQotCi1leHBsaXN0OgotCQkvKiBFTVBUWSAqLwotCXwJZXhwbGlzdCBleHBsaW5lCi0JOwotCi1leHBsaW5lOgotCQlJRCBvcHRfZXF1YWxfbmFtZSBvcHRfb3JkaW5hbCBvcHRfTk9OQU1FIG9wdF9DT05TVEFOVCBvcHRfREFUQQotCQkJeyBkZWZfZXhwb3J0cyAoJDEsICQyLCAkMywgJDQsICQ1LCAkNik7fQotCTsKLWltcGxpc3Q6CQotCQlpbXBsaXN0IGltcGxpbmUKLQl8CWltcGxpbmUKLQk7Ci0KLWltcGxpbmU6Ci0gICAgICAgICAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBJRCAgICAgeyBkZWZfaW1wb3J0ICgkMSwkMywkNSwkNywgMCk7IH0KLSAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgSUQgJy4nIE5VTUJFUiB7IGRlZl9pbXBvcnQgKCQxLCQzLCQ1LCAwLCQ3KTsgfQotICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBJRCAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsJDMsIDAsJDUsIDApOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIE5VTUJFUiAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwkMywgMCwgMCwkNSk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBJRCAnLicgSUQgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCQzLCQ1LCAwKTsgfQotICAgICAgIHwgICAgICAgSUQgJy4nIElEICcuJyBOVU1CRVIgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsJDEsJDMsIDAsJDUpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgICAgICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwkMSwgMCwkMywgMCk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBOVU1CRVIgICAgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCAwLCAwLCQzKTsgfQotOwotCi1zZWNsaXN0OgotCQlzZWNsaXN0IHNlY2xpbmUKLQl8CXNlY2xpbmUKLQk7Ci0KLXNlY2xpbmU6Ci0JSUQgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCQxLCQyKTt9Ci0JOwotCi1hdHRyX2xpc3Q6Ci0JYXR0cl9saXN0IG9wdF9jb21tYSBhdHRyCi0JfCBhdHRyCi0JOwotCi1vcHRfY29tbWE6Ci0JJywnCi0JfCAKLQk7Ci1vcHRfbnVtYmVyOiAnLCcgTlVNQkVSIHsgJCQ9JDI7fQotCXwJICAgeyAkJD0tMTt9Ci0JOwotCQotYXR0cjoKLQkJUkVBRCB7ICQkID0gMTsgfQotCXwJV1JJVEUgeyAkJCA9IDI7IH0KLQl8CUVYRUNVVEUgeyAkJCA9IDQ7IH0KLQl8CVNIQVJFRCB7ICQkID0gODsgfQotCXwJTk9OU0hBUkVEIHsgJCQgPSAwOyB9Ci0JfAlTSU5HTEUgeyAkJCA9IDA7IH0KLQl8CU1VTFRJUExFIHsgJCQgPSAwOyB9Ci0JOwotCi1vcHRfQ09OU1RBTlQ6Ci0JCUNPTlNUQU5UIHskJD0xO30KLQl8CQkgeyQkPTA7fQotCTsKLQotb3B0X05PTkFNRToKLQkJTk9OQU1FIHskJD0xO30KLQl8CQkgeyQkPTA7fQotCTsKLQotb3B0X0RBVEE6Ci0JCURBVEEgeyAkJCA9IDE7IH0KLQl8CSAgICAgeyAkJCA9IDA7IH0KLQk7Ci0KLW9wdF9uYW1lOiBJRAkJeyAkJCA9JDE7IH0KLQl8IElEICcuJyBJRAkKLQkgIHsgCi0JICAgIGNoYXIgKm5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKCQxKSArIDEgKyBzdHJsZW4gKCQzKSArIDEpOwotCSAgICBzcHJpbnRmIChuYW1lLCAiJXMuJXMiLCAkMSwgJDMpOwotCSAgICAkJCA9IG5hbWU7Ci0JICB9Ci0JfAkJeyAkJD0iIjsgfQotCTsKLQotb3B0X29yZGluYWw6IAotCSAgJ0AnIE5VTUJFUiAgICAgeyAkJD0kMjt9Ci0JfCAgICAgICAgICAgICAgICB7ICQkPS0xO30KLQk7Ci0KLW9wdF9lcXVhbF9uYW1lOgotICAgICAgICAgICc9JyBJRAl7ICQkID0gJDI7IH0KLSAgICAgICAgfCAJCXsgJCQgPSAgMDsgfQkJCSAKLQk7Ci0KLW9wdF9iYXNlOiBCQVNFCSc9JyBOVU1CRVIJeyAkJD0gJDM7fQotCXwJeyAkJD0tMTt9Ci0JOwotCi1vcHRpb25fbGlzdDoKLQkJLyogZW1wdHkgKi8KLQl8CW9wdGlvbl9saXN0IG9wdF9jb21tYSBvcHRpb24KLQk7Ci0KLW9wdGlvbjoKLQkJSU5JVElOU1RBTkNFCi0JfAlJTklUR0xPQkFMCi0JfAlURVJNSU5TVEFOQ0UKLQl8CVRFUk1HTE9CQUwKLQk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9kZXAtaW4uc2VkIGIvYmludXRpbHMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxOTIxYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotL1xcJC9iIGxvb3AKLQotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAQkZERElSQCEkKEJGRERJUikhZwotcyFAU1JDRElSQC8hIWcKLXMhQE9CSkRJUkAvISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLS86JC9kCi0KLXMvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCi0gIC9nCmRpZmYgLS1naXQgYS9iaW51dGlscy9kbGx0b29sLmMgYi9iaW51dGlscy9kbGx0b29sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODliNWUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGxsdG9vbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY0OSArMCwwIEBACi0vKiBkbGx0b29sLmMgLS0gdG9vbCB0byBnZW5lcmF0ZSBzdHVmZiBmb3IgUEUgc3R5bGUgRExMcwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKgotICAgVGhpcyBwcm9ncmFtIGFsbG93cyB5b3UgdG8gYnVpbGQgdGhlIGZpbGVzIG5lY2Vzc2FyeSB0byBjcmVhdGUKLSAgIERMTHMgdG8gcnVuIG9uIGEgc3lzdGVtIHdoaWNoIHVuZGVyc3RhbmRzIFBFIGZvcm1hdCBpbWFnZSBmaWxlcy4KLSAgIChlZywgV2luZG93cyBOVCkKLQotICAgU2VlICJQZWVyaW5nIEluc2lkZSB0aGUgUEU6IEEgVG91ciBvZiB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgRmlsZSBGb3JtYXQiLCBNU0ogMTk5NCwgVm9sdW1lIDkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICBBbHNvIHNlZSAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQsCi0gICBTcGVjaWZpY2F0aW9uIDQuMSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgIEEgRExMIGNvbnRhaW5zIGFuIGV4cG9ydCB0YWJsZSB3aGljaCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KLSAgIHdoaWNoIHRoZSBydW50aW1lIGxvYWRlciBuZWVkcyB0byB0aWUgdXAgcmVmZXJlbmNlcyBmcm9tIGEKLSAgIHJlZmVyZW5jaW5nIHByb2dyYW0uCi0KLSAgIFRoZSBleHBvcnQgdGFibGUgaXMgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbSBieSByZWFkaW5nCi0gICBpbiBhIC5ERUYgZmlsZSBvciBzY2FubmluZyB0aGUgLmEgYW5kIC5vIGZpbGVzIHdoaWNoIHdpbGwgYmUgaW4gdGhlCi0gICBETEwuICBBIC5vIGZpbGUgY2FuIGNvbnRhaW4gaW5mb3JtYXRpb24gaW4gc3BlY2lhbCAgIi5kcmVjdHZlIiBzZWN0aW9ucwotICAgd2l0aCBleHBvcnQgaW5mb3JtYXRpb24uCi0KLSAgIEEgREVGIGZpbGUgY29udGFpbnMgYW55IG51bWJlciBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotCi0KLSAgIE5BTUUgPG5hbWU+IFsgLCA8YmFzZT4gXQotICAgVGhlIHJlc3VsdCBpcyBnb2luZyB0byBiZSA8bmFtZT4uRVhFCi0KLSAgIExJQlJBUlkgPG5hbWU+IFsgLCA8YmFzZT4gXQotICAgVGhlIHJlc3VsdCBpcyBnb2luZyB0byBiZSA8bmFtZT4uRExMCi0KLSAgIEVYUE9SVFMgICggPG5hbWUxPiBbID0gPG5hbWUyPiBdIFsgQCA8aW50ZWdlcj4gXSBbIE5PTkFNRSBdIFtDT05TVEFOVF0gW0RBVEFdICkgKgotICAgRGVjbGFyZXMgbmFtZTEgYXMgYW4gZXhwb3J0ZWQgc3ltYm9sIGZyb20gdGhlCi0gICBETEwsIHdpdGggb3B0aW9uYWwgb3JkaW5hbCBudW1iZXIgPGludGVnZXI+Ci0KLSAgIElNUE9SVFMgICggICggICA8aW50ZXJuYWwtbmFtZT4gPSAgIDxtb2R1bGUtbmFtZT4gLiA8aW50ZWdlcj4gKQotICAgICAgICAgICAgIHwgKCBbIDxpbnRlcm5hbC1uYW1lPiA9IF0gPG1vZHVsZS1uYW1lPiAuIDxleHRlcm5hbC1uYW1lPiApKSAqCi0gICBEZWNsYXJlcyB0aGF0IDxleHRlcm5hbC1uYW1lPiBvciB0aGUgZXhwb3J0ZWQgZnVuY3Rpb24gd2hvZXMgb3JkaW5hbCBudW1iZXIKLSAgIGlzIDxpbnRlZ2VyPiBpcyB0byBiZSBpbXBvcnRlZCBmcm9tIHRoZSBmaWxlIDxtb2R1bGUtbmFtZT4uICBJZgotICAgPGludGVybmFsLW5hbWU+IGlzIHNwZWNpZmllZCB0aGVuIHRoaXMgaXMgdGhlIG5hbWUgdGhhdCB0aGUgaW1wb3J0ZWQKLSAgIGZ1bmN0aW9uIHdpbGwgYmUgcmVmZXJlZCB0byBpbiB0aGUgYm9keSBvZiB0aGUgRExMLgotCi0gICBERVNDUklQVElPTiA8c3RyaW5nPgotICAgUHV0cyA8c3RyaW5nPiBpbnRvIG91dHB1dCAuZXhwIGZpbGUgaW4gdGhlIC5yZGF0YSBzZWN0aW9uCi0KLSAgIFtTVEFDS1NJWkV8SEVBUFNJWkVdIDxudW1iZXItcmVzZXJ2ZT4gWyAsIDxudW1iZXItY29tbWl0PiBdCi0gICBHZW5lcmF0ZXMgLS1zdGFja3wtLWhlYXAgPG51bWJlci1yZXNlcnZlPiw8bnVtYmVyLWNvbW1pdD4KLSAgIGluIHRoZSBvdXRwdXQgLmRyZWN0dmUgc2VjdGlvbi4gIFRoZSBsaW5rZXIgd2lsbAotICAgc2VlIHRoaXMgYW5kIGFjdCB1cG9uIGl0LgotCi0gICBbQ09ERXxEQVRBXSA8YXR0cj4rCi0gICBTRUNUSU9OUyAoIDxzZWN0aW9ubmFtZT4gPGF0dHI+KyApKgotICAgPGF0dHI+ID0gUkVBRCB8IFdSSVRFIHwgRVhFQ1VURSB8IFNIQVJFRAotICAgR2VuZXJhdGVzIC0tYXR0ciA8c2VjdGlvbm5hbWU+IDxhdHRyPiBpbiB0aGUgb3V0cHV0Ci0gICAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGxpbmtlciB3aWxsIHNlZSB0aGlzIGFuZCBhY3QKLSAgIHVwb24gaXQuCi0KLQotICAgQSAtZXhwb3J0OjxuYW1lPiBpbiBhIC5kcmVjdHZlIHNlY3Rpb24gaW4gYW4gaW5wdXQgLm8gb3IgLmEKLSAgIGZpbGUgdG8gdGhpcyBwcm9ncmFtIGlzIGVxdWl2YWxlbnQgdG8gYSBFWFBPUlRTIDxuYW1lPgotICAgaW4gYSAuREVGIGZpbGUuCi0KLQotCi0gICBUaGUgcHJvZ3JhbSBnZW5lcmF0ZXMgb3V0cHV0IGZpbGVzIHdpdGggdGhlIHByZWZpeCBzdXBwbGllZAotICAgb24gdGhlIGNvbW1hbmQgbGluZSwgb3IgaW4gdGhlIGRlZiBmaWxlLCBvciB0YWtlbiBmcm9tIHRoZSBmaXJzdAotICAgc3VwcGxpZWQgYXJndW1lbnQuCi0KLSAgIFRoZSAuZXhwLnMgZmlsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGV4cG9ydAotICAgdGhlIHJvdXRpbmVzIGluIHRoZSBETEwuICBUaGUgLmxpYi5zIGZpbGUgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uCi0gICBuZWNlc3NhcnkgdG8gdXNlIHRoZSBETEwncyByb3V0aW5lcyBmcm9tIGEgcmVmZXJlbmNpbmcgcHJvZ3JhbS4KLQotCi0KLSAgIEV4YW1wbGU6Ci0KLSBmaWxlMS5jOgotICAgYXNtICgiLnNlY3Rpb24gLmRyZWN0dmUiKTsKLSAgIGFzbSAoIi5hc2NpaSBcIi1leHBvcnQ6YWRlZlwiIik7Ci0KLSAgIHZvaWQgYWRlZiAoY2hhciAqIHMpCi0gICB7Ci0gICAgIHByaW50ZiAoImhlbGxvIGZyb20gdGhlIGRsbCAlc1xuIiwgcyk7Ci0gICB9Ci0KLSAgIHZvaWQgYmRlZiAoY2hhciAqIHMpCi0gICB7Ci0gICAgIHByaW50ZiAoImhlbGxvIGZyb20gdGhlIGRsbCBhbmQgdGhlIG90aGVyIGVudHJ5IHBvaW50ICVzXG4iLCBzKTsKLSAgIH0KLQotIGZpbGUyLmM6Ci0gICBhc20gKCIuc2VjdGlvbiAuZHJlY3R2ZSIpOwotICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDpjZGVmXCIiKTsKLSAgIGFzbSAoIi5hc2NpaSBcIi1leHBvcnQ6ZGRlZlwiIik7Ci0gICAKLSAgIHZvaWQgY2RlZiAoY2hhciAqIHMpCi0gICB7Ci0gICAgIHByaW50ZiAoImhlbGxvIGZyb20gdGhlIGRsbCAlc1xuIiwgcyk7Ci0gICB9Ci0KLSAgIHZvaWQgZGRlZiAoY2hhciAqIHMpCi0gICB7Ci0gICAgIHByaW50ZiAoImhlbGxvIGZyb20gdGhlIGRsbCBhbmQgdGhlIG90aGVyIGVudHJ5IHBvaW50ICVzXG4iLCBzKTsKLSAgIH0KLQotICAgaW50IHByaW50ZiAodm9pZCkKLSAgIHsKLSAgICAgcmV0dXJuIDk7Ci0gICB9Ci0KLSB0aGVtYWluLmM6Ci0gICBpbnQgbWFpbiAodm9pZCkKLSAgIHsKLSAgICAgY2RlZiAoKTsKLSAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSB0aGVkbGwuZGVmCi0KLSAgIExJQlJBUlkgdGhlZGxsCi0gICBIRUFQU0laRSAweDQwMDAwLCAweDIwMDAKLSAgIEVYUE9SVFMgYmRlZiBAIDIwCi0gICAgICAgICAgIGNkZWYgQCAzMCBOT05BTUUKLQotICAgU0VDVElPTlMgZG9ua2V5IFJFQUQgV1JJVEUKLSAgIGFhcmR2YXJrIEVYRUNVVEUKLQotICMgQ29tcGlsZSB1cCB0aGUgcGFydHMgb2YgdGhlIGRsbCBhbmQgdGhlIHByb2dyYW0KLQotICAgZ2NjIC1jIGZpbGUxLmMgZmlsZTIuYyB0aGVtYWluLmMKLQotICMgT3B0aW9uYWw6IHB1dCB0aGUgZGxsIG9iamVjdHMgaW50byBhIGxpYnJhcnkKLSAjICh5b3UgZG9uJ3QgaGF2ZSB0bywgeW91IGNvdWxkIG5hbWUgYWxsIHRoZSBvYmplY3QKLSAjIGZpbGVzIG9uIHRoZSBkbGx0b29sIGxpbmUpCi0KLSAgIGFyICBxY3YgdGhlZGxsLmluIGZpbGUxLm8gZmlsZTIubwotICAgcmFubGliIHRoZWRsbC5pbgotCi0gIyBSdW4gdGhpcyB0b29sIG92ZXIgdGhlIERMTCdzIC5kZWYgZmlsZSBhbmQgZ2VuZXJhdGUgYW4gZXhwb3J0cwotICMgZmlsZSAodGhlZGxsLm8pIGFuZCBhbiBpbXBvcnRzIGZpbGUgKHRoZWRsbC5hKS4KLSAjIChZb3UgbWF5IGhhdmUgdG8gdXNlIC1TIHRvIHRlbGwgZGxsdG9vbCB3aGVyZSB0byBmaW5kIHRoZSBhc3NlbWJsZXIpLgotIAotICAgZGxsdG9vbCAtLWRlZiB0aGVkbGwuZGVmIC0tb3V0cHV0LWV4cCB0aGVkbGwubyAtLW91dHB1dC1saWIgdGhlZGxsLmEKLQotICMgQnVpbGQgdGhlIGRsbCB3aXRoIHRoZSBsaWJyYXJ5IGFuZCB0aGUgZXhwb3J0IHRhYmxlCi0gCi0gICBsZCAtbyB0aGVkbGwuZGxsIHRoZWRsbC5vIHRoZWRsbC5pbgotCi0gIyBMaW5rIHRoZSBleGVjdXRhYmxlIHdpdGggdGhlIGltcG9ydCBsaWJyYXJ5Ci0gCi0gICBnY2MgLW8gdGhlbWFpbi5leGUgdGhlbWFpbi5vIHRoZWRsbC5hCi0KLSBUaGlzIGV4YW1wbGUgY2FuIGJlIGV4dGVuZGVkIGlmIHJlbG9jYXRpb25zIGFyZSBuZWVkZWQgaW4gdGhlIERMTDoKLQotICMgQ29tcGlsZSB1cCB0aGUgcGFydHMgb2YgdGhlIGRsbCBhbmQgdGhlIHByb2dyYW0KLQotICAgZ2NjIC1jIGZpbGUxLmMgZmlsZTIuYyB0aGVtYWluLmMKLQotICMgUnVuIHRoaXMgdG9vbCBvdmVyIHRoZSBETEwncyAuZGVmIGZpbGUgYW5kIGdlbmVyYXRlIGFuIGltcG9ydHMgZmlsZS4KLSAKLSAgIGRsbHRvb2wgLS1kZWYgdGhlZGxsLmRlZiAtLW91dHB1dC1saWIgdGhlZGxsLmxpYgotCi0gIyBMaW5rIHRoZSBleGVjdXRhYmxlIHdpdGggdGhlIGltcG9ydCBsaWJyYXJ5IGFuZCBnZW5lcmF0ZSBhIGJhc2UgZmlsZQotICMgYXQgdGhlIHNhbWUgdGltZQotIAotICAgZ2NjIC1vIHRoZW1haW4uZXhlIHRoZW1haW4ubyB0aGVkbGwubGliIC1XbCwtLWJhc2UtZmlsZSAtV2wsdGhlbWFpbi5iYXNlCi0KLSAjIFJ1biB0aGlzIHRvb2wgb3ZlciB0aGUgRExMJ3MgLmRlZiBmaWxlIGFuZCBnZW5lcmF0ZSBhbiBleHBvcnRzIGZpbGUKLSAjIHdoaWNoIGluY2x1ZGVzIHRoZSByZWxvY2F0aW9ucyBmcm9tIHRoZSBiYXNlIGZpbGUuCi0gCi0gICBkbGx0b29sIC0tZGVmIHRoZWRsbC5kZWYgLS1iYXNlLWZpbGUgdGhlbWFpbi5iYXNlIC0tb3V0cHV0LWV4cCB0aGVkbGwuZXhwCi0KLSAjIEJ1aWxkIHRoZSBkbGwgd2l0aCBmaWxlMS5vLCBmaWxlMi5vIGFuZCB0aGUgZXhwb3J0IHRhYmxlCi0gCi0gICBsZCAtbyB0aGVkbGwuZGxsIHRoZWRsbC5leHAgZmlsZTEubyBmaWxlMi5vCi0gKi8KLQotLyogLmlkYXRhIHNlY3Rpb24gZGVzY3JpcHRpb24KLQotICAgVGhlIC5pZGF0YSBzZWN0aW9uIGlzIHRoZSBpbXBvcnQgdGFibGUuICBJdCBpcyBhIGNvbGxlY3Rpb24gb2Ygc2V2ZXJhbAotICAgc3Vic2VjdGlvbnMgdXNlZCB0byBrZWVwIHRoZSBwaWVjZXMgZm9yIGVhY2ggZGxsIHRvZ2V0aGVyOiAuaWRhdGEkWzIzNDU2N10uCi0gICBJRTogRWFjaCBkbGwncyAuaWRhdGEkMidzIGFyZSBjYXRlbmF0ZWQgdG9nZXRoZXIsIGVhY2ggLmlkYXRhJDMncywgZXRjLgotCi0gICAuaWRhdGEkMiA9IEltcG9ydCBEaXJlY3RvcnkgVGFibGUKLSAgID0gYXJyYXkgb2YgSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1Incy4KLQotCURXT1JEICAgSW1wb3J0IExvb2t1cCBUYWJsZTsgIC0gcG9pbnRlciB0byAuaWRhdGEkNAotCURXT1JEICAgVGltZURhdGVTdGFtcDsgICAgICAgIC0gY3VycmVudGx5IGFsd2F5cyAwCi0JRFdPUkQgICBGb3J3YXJkZXJDaGFpbjsgICAgICAgLSBjdXJyZW50bHkgYWx3YXlzIDAKLQlEV09SRCAgIE5hbWU7ICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gZGxsJ3MgbmFtZQotCVBJTUFHRV9USFVOS19EQVRBIEZpcnN0VGh1bms7IC0gcG9pbnRlciB0byAuaWRhdGEkNQotCi0gICAuaWRhdGEkMyA9IG51bGwgdGVybWluYXRpbmcgZW50cnkgZm9yIC5pZGF0YSQyLgotCi0gICAuaWRhdGEkNCA9IEltcG9ydCBMb29rdXAgVGFibGUKLSAgID0gYXJyYXkgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGludCBuYW1lIHRhYmxlLgotICAgVGhlcmUgaXMgb25lIGZvciBlYWNoIGRsbCBiZWluZyBpbXBvcnRlZCBmcm9tLCBhbmQgZWFjaCBkbGwncyBzZXQgaXMKLSAgIHRlcm1pbmF0ZWQgYnkgYSB0cmFpbGluZyBOVUxMLgotCi0gICAuaWRhdGEkNSA9IEltcG9ydCBBZGRyZXNzIFRhYmxlCi0gICA9IGFycmF5IG9mIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhpbnQgbmFtZSB0YWJsZS4KLSAgIFRoZXJlIGlzIG9uZSBmb3IgZWFjaCBkbGwgYmVpbmcgaW1wb3J0ZWQgZnJvbSwgYW5kIGVhY2ggZGxsJ3Mgc2V0IGlzCi0gICB0ZXJtaW5hdGVkIGJ5IGEgdHJhaWxpbmcgTlVMTC4KLSAgIEluaXRpYWxseSwgdGhpcyB0YWJsZSBpcyBpZGVudGljYWwgdG8gdGhlIEltcG9ydCBMb29rdXAgVGFibGUuICBIb3dldmVyLAotICAgYXQgbG9hZCB0aW1lLCB0aGUgbG9hZGVyIG92ZXJ3cml0ZXMgdGhlIGVudHJpZXMgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIGZ1bmN0aW9uLgotCi0gICAuaWRhdGEkNiA9IEhpbnQgTmFtZSBUYWJsZQotICAgPSBBcnJheSBvZiB7IHNob3J0LCBhc2NpeiB9IGVudHJpZXMsIG9uZSBmb3IgZWFjaCBpbXBvcnRlZCBmdW5jdGlvbi4KLSAgIFRoZSBgc2hvcnQnIGlzIHRoZSBmdW5jdGlvbidzIG9yZGluYWwgbnVtYmVyLgotCi0gICAuaWRhdGEkNyA9IGRsbCBuYW1lIChlZzogImtlcm5lbDMyLmRsbCIpLiAoLmlkYXRhJDYgZm9yIHBwYykKLSovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZuZGVmIF9fR05VQ19fCi0jIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBzaG93X2FsbG5hbWVzIDAKLQotI2RlZmluZSBQQUdFX1NJWkUgNDA5NgotI2RlZmluZSBQQUdFX01BU0sgKC1QQUdFX1NJWkUpCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiZGVtYW5nbGUuaCIKLSNpbmNsdWRlICJkeW4tc3RyaW5nLmgiCi0jaW5jbHVkZSAiZGxsdG9vbC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfQVJNCi0jaW5jbHVkZSAiY29mZi9hcm0uaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jZW5kaWYKLQotLyogRm9yd2FyZCByZWZlcmVuY2VzLiAgKi8KLXN0YXRpYyBjaGFyICpsb29rX2Zvcl9wcm9nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBjaGFyICpkZWR1Y2VfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi1zdGF0aWMgdm9pZCBtY29yZV9lbGZfY2FjaGVfZmlsZW5hbWUgKGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBtY29yZV9lbGZfZ2VuX291dF9maWxlICh2b2lkKTsKLSNlbmRpZgotICAgICAKLSNpZmRlZiBIQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2Vsc2UgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpJjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykmMDM3NykgIT0gMDE3NyAmJiAoKHcpJn4wMzc3KSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAwMTc3KQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpID4+IDgpICYgMDM3NykKLSNlbmRpZgotI2Vsc2UgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSAmIDB4ZmYpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykgJiAweGZmKSAhPSAwICYmICgodykgJiAweGZmKSAhPSAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpICYgMHhmZjAwKSA+PiA4KQotI2VuZGlmCi0jZW5kaWYgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNlbmRpZiAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotCi0vKiBpZnVuYyBhbmQgaWhlYWQgZGF0YSBzdHJ1Y3R1cmVzOiB0dGtAY3lnbnVzLmNvbSAxOTk3Ci0KLSAgIFdoZW4gSU1QT1JUIGRlY2xhcmF0aW9ucyBhcmUgZW5jb3VudGVyZWQgaW4gYSAuZGVmIGZpbGUgdGhlCi0gICBmdW5jdGlvbiBpbXBvcnQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGEgc3RydWN0dXJlIHJlZmVyZW5jZWQgYnkKLSAgIHRoZSBnbG9iYWwgdmFyaWFibGUgSU1QT1JUX0xJU1QuICBUaGUgc3RydWN0dXJlIGlzIGEgbGlua2VkIGxpc3QKLSAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBkbGwgZmlsZXMgZWFjaCBmdW5jdGlvbiBpcyBpbXBvcnRlZAotICAgZnJvbSBhbmQgYSBsaW5rZWQgbGlzdCBvZiBmdW5jdGlvbnMgYmVpbmcgaW1wb3J0ZWQgZnJvbSB0aGF0IGRsbAotICAgZmlsZS4gIFRoaXMgcm91Z2hseSBwYXJhbGxlbHMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgLmlkYXRhIHNlY3Rpb24KLSAgIGluIHRoZSBQRSBvYmplY3QgZmlsZS4KLQotICAgVGhlIGNvbnRlbnRzIG9mIC5kZWYgZmlsZSBhcmUgaW50ZXJwcmV0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICBwcm9jZXNzX2RlZl9maWxlIGZ1bmN0aW9uLiAgRXZlcnkgdGltZSBhbiBJTVBPUlQgZGVjbGFyYXRpb24gaXMKLSAgIGVuY291bnRlcmVkLCBpdCBpcyBicm9rZW4gdXAgaW50byBpdHMgY29tcG9uZW50IHBhcnRzIGFuZCBwYXNzZWQgdG8KLSAgIGRlZl9pbXBvcnQuICBJTVBPUlRfTElTVCBpcyBpbml0aWFsaXplZCB0byBOVUxMIGluIGZ1bmN0aW9uIG1haW4uICAqLwotCi10eXBlZGVmIHN0cnVjdCBpZnVuY3QKLXsKLSAgY2hhciAgICAgICAgICAqbmFtZTsgICAvKiBuYW1lIG9mIGZ1bmN0aW9uIGJlaW5nIGltcG9ydGVkICovCi0gIGludCAgICAgICAgICAgIG9yZDsgICAgLyogdHdvLWJ5dGUgb3JkaW5hbCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggZnVuY3Rpb24gKi8KLSAgc3RydWN0IGlmdW5jdCAqbmV4dDsKLX0gaWZ1bmN0eXBlOwotCi10eXBlZGVmIHN0cnVjdCBpaGVhZHQKLXsKLSAgY2hhciAgICAgICAgICAqZGxsbmFtZTsgIC8qIG5hbWUgb2YgZGxsIGZpbGUgaW1wb3J0ZWQgZnJvbSAqLwotICBsb25nICAgICAgICAgICBuZnVuY3M7ICAgLyogbnVtYmVyIG9mIGZ1bmN0aW9ucyBpbiBsaXN0ICovCi0gIHN0cnVjdCBpZnVuY3QgKmZ1bmNoZWFkOyAvKiBmaXJzdCBmdW5jdGlvbiBpbiBsaXN0ICovCi0gIHN0cnVjdCBpZnVuY3QgKmZ1bmN0YWlsOyAvKiBsYXN0ICBmdW5jdGlvbiBpbiBsaXN0ICovCi0gIHN0cnVjdCBpaGVhZHQgKm5leHQ7ICAgICAvKiBuZXh0IGRsbCBmaWxlIGluIGxpc3QgKi8KLX0gaWhlYWR0eXBlOwotCi0vKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgaW1wb3J0IGluZm9ybWF0aW9uIGFzIGRlZmluZWQgaW4gLmRlZiBmaWxlCi0gICAocXYgImloZWFkIHN0cnVjdHVyZSIpLiAgKi8KLQotc3RhdGljIGloZWFkdHlwZSAqaW1wb3J0X2xpc3QgPSBOVUxMOwotCi1zdGF0aWMgY2hhciAqYXNfbmFtZSA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqIGFzX2ZsYWdzID0gIiI7Ci0KLXN0YXRpYyBpbnQgbm9faWRhdGE0Owotc3RhdGljIGludCBub19pZGF0YTU7Ci1zdGF0aWMgY2hhciAqZXhwX25hbWU7Ci1zdGF0aWMgY2hhciAqaW1wX25hbWU7Ci1zdGF0aWMgY2hhciAqaGVhZF9sYWJlbDsKLXN0YXRpYyBjaGFyICppbXBfbmFtZV9sYWI7Ci1zdGF0aWMgY2hhciAqZGxsX25hbWU7Ci0KLXN0YXRpYyBpbnQgYWRkX2luZGlyZWN0ID0gMDsKLXN0YXRpYyBpbnQgYWRkX3VuZGVyc2NvcmUgPSAwOwotc3RhdGljIGludCBkb250ZGVsdGVtcHMgPSAwOwotCi0vKiBUcnVlIGlmIHdlIHNob3VsZCBleHBvcnQgYWxsIHN5bWJvbHMuICBPdGhlcndpc2UsIHdlIG9ubHkgZXhwb3J0Ci0gICBzeW1ib2xzIGxpc3RlZCBpbiAuZHJlY3R2ZSBzZWN0aW9ucyBvciBpbiB0aGUgZGVmIGZpbGUuICAqLwotc3RhdGljIGJvb2xlYW4gZXhwb3J0X2FsbF9zeW1ib2xzOwotCi0vKiBUcnVlIGlmIHdlIHNob3VsZCBleGNsdWRlIHRoZSBzeW1ib2xzIGluIERFRkFVTFRfRVhDTFVERVMgd2hlbgotICAgZXhwb3J0aW5nIGFsbCBzeW1ib2xzLiAgKi8KLXN0YXRpYyBib29sZWFuIGRvX2RlZmF1bHRfZXhjbHVkZXM7Ci0KLS8qIERlZmF1bHQgc3ltYm9scyB0byBleGNsdWRlIHdoZW4gZXhwb3J0aW5nIGFsbCB0aGUgc3ltYm9scy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9leGNsdWRlcyA9ICJEbGxNYWluQDEyLERsbEVudHJ5UG9pbnRAMCxpbXB1cmVfcHRyIjsKLQotLyogVHJ1ZSBpZiB3ZSBzaG91bGQgYWRkIF9faW1wXzxTWU1CT0w+IHRvIGltcG9ydCBsaWJyYXJpZXMgZm9yIGJhY2t3YXJkIAotICAgY29tcGF0aWJpbGl0eSB0byBvbGQgQ3lnd2luIHJlbGVhc2VzLiAgKi8KLXN0YXRpYyBib29sZWFuIGNyZWF0ZV9jb21wYXRfaW1wbGliOwotCi1zdGF0aWMgY2hhciAqZGVmX2ZpbGU7Ci0KLWV4dGVybiBjaGFyICogcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgaW50IG1hY2hpbmU7Ci1zdGF0aWMgaW50IGtpbGxhdDsKLXN0YXRpYyBpbnQgYWRkX3N0ZGNhbGxfYWxpYXM7Ci1zdGF0aWMgaW50IHZlcmJvc2U7Ci1zdGF0aWMgRklMRSAqb3V0cHV0X2RlZjsKLXN0YXRpYyBGSUxFICpiYXNlX2ZpbGU7Ci0KLSNpZmRlZiBETExUT09MX0FSTQotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gImFybSI7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfSTM4Ngotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gImkzODYiOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX1BQQwotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gInBwYyI7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfU0gKLXN0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJzaCI7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfTUlQUwotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gIm1pcHMiOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX01DT1JFCi1zdGF0aWMgY29uc3QgY2hhciAqIG1uYW1lID0gIm1jb3JlLWxlIjsKLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLXN0YXRpYyBjb25zdCBjaGFyICogbW5hbWUgPSAibWNvcmUtZWxmIjsKLXN0YXRpYyBjaGFyICogbWNvcmVfZWxmX291dF9maWxlID0gTlVMTDsKLXN0YXRpYyBjaGFyICogbWNvcmVfZWxmX2xpbmtlciAgID0gTlVMTDsKLXN0YXRpYyBjaGFyICogbWNvcmVfZWxmX2xpbmtlcl9mbGFncyA9IE5VTEw7Ci0KLSNkZWZpbmUgRFJFQ1RWRV9TRUNUSU9OX05BTUUgKChtYWNoaW5lID09IE1NQ09SRV9FTEYgfHwgbWFjaGluZSA9PSBNTUNPUkVfRUxGX0xFKSA/ICIuZXhwb3J0cyIgOiAiLmRyZWN0dmUiKQotI2VuZGlmCi0KLSNpZm5kZWYgRFJFQ1RWRV9TRUNUSU9OX05BTUUKLSNkZWZpbmUgRFJFQ1RWRV9TRUNUSU9OX05BTUUgIi5kcmVjdHZlIgotI2VuZGlmCi0KLSNkZWZpbmUgUEFUSE1BWCAyNTAJCS8qIFdoYXQncyB0aGUgcmlnaHQgbmFtZSBmb3IgdGhpcyA/ICovCi0KLSNkZWZpbmUgVE1QX0FTTQkJImRjLnMiCi0jZGVmaW5lIFRNUF9IRUFEX1MJImRoLnMiCi0jZGVmaW5lIFRNUF9IRUFEX08JImRoLm8iCi0jZGVmaW5lIFRNUF9UQUlMX1MJImR0LnMiCi0jZGVmaW5lIFRNUF9UQUlMX08JImR0Lm8iCi0jZGVmaW5lIFRNUF9TVFVCCSJkcyIKLQotLyogVGhpcyBiaXQgb2YgYXNzZW1seSBkb2VzIGptcCAqIC4uLi4gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGkzODZfanRhYltdID0KLXsKLSAgMHhmZiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXJtX2p0YWJbXSA9Ci17Ci0gIDB4MDAsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgaXAsIFtwY10gKi8KLSAgMHgwMCwgMHhmMCwgMHg5YywgMHhlNSwJLyogbGRyICBwYywgW2lwXSAqLwotICAwLCAgICAwLCAgICAwLCAgICAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhcm1faW50ZXJ3b3JrX2p0YWJbXSA9Ci17Ci0gIDB4MDQsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgaXAsIFtwY10gKi8KLSAgMHgwMCwgMHhjMCwgMHg5YywgMHhlNSwJLyogbGRyICBpcCwgW2lwXSAqLwotICAweDFjLCAweGZmLCAweDJmLCAweGUxLAkvKiBieCAgIGlwICAgICAgICovCi0gIDAsICAgIDAsICAgIDAsICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRodW1iX2p0YWJbXSA9Ci17Ci0gIDB4NDAsIDB4YjQsICAgICAgICAgICAvKiBwdXNoIHtyNn0gICAgICAgICAqLwotICAweDAyLCAweDRlLCAgICAgICAgICAgLyogbGRyICByNiwgW3BjLCAjOF0gKi8KLSAgMHgzNiwgMHg2OCwgICAgICAgICAgIC8qIGxkciAgcjYsIFtyNl0gICAgICovCi0gIDB4YjQsIDB4NDYsICAgICAgICAgICAvKiBtb3YgIGlwLCByNiAgICAgICAqLwotICAweDQwLCAweGJjLCAgICAgICAgICAgLyogcG9wICB7cjZ9ICAgICAgICAgKi8KLSAgMHg2MCwgMHg0NywgICAgICAgICAgIC8qIGJ4ICAgaXAgICAgICAgICAgICovCi0gIDAsICAgIDAsICAgIDAsICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1jb3JlX2JlX2p0YWJbXSA9Ci17Ci0gIDB4NzEsIDB4MDIsICAgICAgICAgICAgLyogbHJ3IHIxLDIgICAgICAgKi8KLSAgMHg4MSwgMHgwMSwgICAgICAgICAgICAvKiBsZC53IHIxLChyMSwwKSAqLyAgCi0gIDB4MDAsIDB4QzEsICAgICAgICAgICAgLyogam1wIHIxICAgICAgICAgKi8KLSAgMHgxMiwgMHgwMCwgICAgICAgICAgICAvKiBub3AgICAgICAgICAgICAqLwotICAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDxhZGRyZXNzPiAgICAgICovICAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1jb3JlX2xlX2p0YWJbXSA9Ci17Ci0gIDB4MDIsIDB4NzEsICAgICAgICAgICAgLyogbHJ3IHIxLDIgICAgICAgKi8KLSAgMHgwMSwgMHg4MSwgICAgICAgICAgICAvKiBsZC53IHIxLChyMSwwKSAqLyAgCi0gIDB4QzEsIDB4MDAsICAgICAgICAgICAgLyogam1wIHIxICAgICAgICAgKi8KLSAgMHgwMCwgMHgxMiwgICAgICAgICAgICAvKiBub3AgICAgICAgICAgICAqLwotICAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDxhZGRyZXNzPiAgICAgICovICAKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGdsdWUgc2VxdWVuY2UgZm9yIFBvd2VyUEMgUEUuIFRoZXJlIGlzIGEgICovCi0vKiB0b2NyZWwxNi10b2NkZWZuIHJlbG9jIGFnYWluc3QgdGhlIGZpcnN0IGluc3RydWN0aW9uLiAqLwotLyogV2UgYWxzbyBuZWVkIGEgSU1HTFVFIHJlbG9jIGFnYWluc3QgdGhlIGdsdWUgZnVuY3Rpb24gKi8KLS8qIHRvIHJlc3RvcmUgdGhlIHRvYyBzYXZlZCBieSB0aGUgdGhpcmQgaW5zdHJ1Y3Rpb24gaW4gICovCi0vKiB0aGUgZ2x1ZS4gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBwY19qdGFiW10gPQotewotICAweDAwLCAweDAwLCAweDYyLCAweDgxLCAvKiBsd3ogcjExLDAocjIpICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBSZWxvYyBUT0NSRUwxNiBfX2ltcF94eHggICovCi0gIDB4MDAsIDB4MDAsIDB4OEIsIDB4ODEsIC8qIGx3eiByMTIsMChyMTEpICAgICAgICAgICAgICAqLwotICAweDA0LCAweDAwLCAweDQxLCAweDkwLCAvKiBzdHcgcjIsNChyMSkgICAgICAgICAgICAgICAgKi8KLSAgMHhBNiwgMHgwMywgMHg4OSwgMHg3RCwgLyogbXRjdHIgcjEyICAgICAgICAgICAgICAgICAgICovCi0gIDB4MDQsIDB4MDAsIDB4NEIsIDB4ODAsIC8qIGx3eiByMiw0KHIxMSkgICAgICAgICAgICAgICAqLwotICAweDIwLCAweDA0LCAweDgwLCAweDRFICAvKiBiY3RyICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLSNpZmRlZiBETExUT09MX1BQQwotLyogdGhlIGdsdWUgaW5zdHJ1Y3Rpb24sIHBpY2tzIHVwIHRoZSB0b2MgZnJvbSB0aGUgc3R3IGluICovCi0vKiB0aGUgYWJvdmUgY29kZTogImx3eiByMiw0KHIxKSIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBiZmRfdm1hIHBwY19nbHVlX2luc24gPSAweDgwNDEwMDA0OwotI2VuZGlmCi0KLXN0cnVjdCBtYWMKLSAgewotICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci0gICAgY29uc3QgY2hhciAqaG93X2J5dGU7Ci0gICAgY29uc3QgY2hhciAqaG93X3Nob3J0OwotICAgIGNvbnN0IGNoYXIgKmhvd19sb25nOwotICAgIGNvbnN0IGNoYXIgKmhvd19hc2NpejsKLSAgICBjb25zdCBjaGFyICpob3dfY29tbWVudDsKLSAgICBjb25zdCBjaGFyICpob3dfanVtcDsKLSAgICBjb25zdCBjaGFyICpob3dfZ2xvYmFsOwotICAgIGNvbnN0IGNoYXIgKmhvd19zcGFjZTsKLSAgICBjb25zdCBjaGFyICpob3dfYWxpZ25fc2hvcnQ7Ci0gICAgY29uc3QgY2hhciAqaG93X2FsaWduX2xvbmc7Ci0gICAgY29uc3QgY2hhciAqaG93X2RlZmF1bHRfYXNfc3dpdGNoZXM7Ci0gICAgY29uc3QgY2hhciAqaG93X2JmZF90YXJnZXQ7Ci0gICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGhvd19iZmRfYXJjaDsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpob3dfanRhYjsKLSAgICBpbnQgaG93X2p0YWJfc2l6ZTsgLyogc2l6ZSBvZiB0aGUganRhYiBlbnRyeSAqLwotICAgIGludCBob3dfanRhYl9yb2ZmOyAvKiBvZmZzZXQgaW50byBpdCBmb3IgdGhlIGluZCAzMiByZWxvYyBpbnRvIGlkYXRhIDUgKi8KLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtYWMKLW10YWJsZVtdID0KLXsKLSAgewotI2RlZmluZSBNQVJNIDAKLSAgICAiYXJtIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCi0gICAgImxkclx0aXAsW3BjXVxuXHRsZHJcdHBjLFtpcF1cblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiLW1hcGNzLTMyIiwKLSAgICAicGUtYXJtLWxpdHRsZSIsIGJmZF9hcmNoX2FybSwKLSAgICBhcm1fanRhYiwgc2l6ZW9mIChhcm1fanRhYiksIDgKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTTM4NiAxCi0gICAgImkzODYiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIjIiwKLSAgICAiam1wICoiLCAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwgIiIsCi0gICAgInBlLWkzODYiLGJmZF9hcmNoX2kzODYsCi0gICAgaTM4Nl9qdGFiLCBzaXplb2YgKGkzODZfanRhYiksIDIKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTVBQQyAyCi0gICAgInBwYyIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIiMiLAotICAgICJqbXAgKiIsICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiIiwKLSAgICAicGUtcG93ZXJwY2xlIixiZmRfYXJjaF9wb3dlcnBjLAotICAgIHBwY19qdGFiLCBzaXplb2YgKHBwY19qdGFiKSwgMAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNVEhVTUIgMwotICAgICJ0aHVtYiIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIkAiLAotICAgICJwdXNoXHR7cjZ9XG5cdGxkclx0cjYsIFtwYywgIzhdXG5cdGxkclx0cjYsIFtyNl1cblx0bW92XHRpcCwgcjZcblx0cG9wXHR7cjZ9XG5cdGJ4XHRpcCIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsICItbXRodW1iLWludGVyd29yayIsCi0gICAgInBlLWFybS1saXR0bGUiLCBiZmRfYXJjaF9hcm0sCi0gICAgdGh1bWJfanRhYiwgc2l6ZW9mICh0aHVtYl9qdGFiKSwgMTIKLSAgfQotICAsCi0jZGVmaW5lIE1BUk1fSU5URVJXT1JLIDQKLSAgewotICAgICJhcm1faW50ZXJ3b3JrIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCi0gICAgImxkclx0aXAsW3BjXVxuXHRsZHJcdGlwLFtpcF1cblx0YnhcdGlwXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwgIi1tdGh1bWItaW50ZXJ3b3JrIiwKLSAgICAicGUtYXJtLWxpdHRsZSIsIGJmZF9hcmNoX2FybSwKLSAgICBhcm1faW50ZXJ3b3JrX2p0YWIsIHNpemVvZiAoYXJtX2ludGVyd29ya19qdGFiKSwgMTIKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTU1DT1JFX0JFIDUKLSAgICAibWNvcmUtYmUiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIvLyIsCi0gICAgImxydyByMSxbMWZdXG5cdGxkLncgcjEsKHIxLDApXG5cdGptcCByMVxuXHRub3BcbjE6LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiIiwKLSAgICAicGUtbWNvcmUtYmlnIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfYmVfanRhYiwgc2l6ZW9mIChtY29yZV9iZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfTEUgNgotICAgICJtY29yZS1sZSIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIi8vIiwKLSAgICAibHJ3IHIxLFsxZl1cblx0bGQudyByMSwocjEsMClcblx0am1wIHIxXG5cdG5vcFxuMToubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsICItRUwiLAotICAgICJwZS1tY29yZS1saXR0bGUiLCBiZmRfYXJjaF9tY29yZSwKLSAgICBtY29yZV9sZV9qdGFiLCBzaXplb2YgKG1jb3JlX2xlX2p0YWIpLCA4Ci0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1NQ09SRV9FTEYgNwotICAgICJtY29yZS1lbGYtYmUiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIvLyIsCi0gICAgImxydyByMSxbMWZdXG5cdGxkLncgcjEsKHIxLDApXG5cdGptcCByMVxuXHRub3BcbjE6LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiIiwKLSAgICAiZWxmMzItbWNvcmUtYmlnIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfYmVfanRhYiwgc2l6ZW9mIChtY29yZV9iZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfRUxGX0xFIDgKLSAgICAibWNvcmUtZWxmLWxlIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiLy8iLAotICAgICJscncgcjEsWzFmXVxuXHRsZC53IHIxLChyMSwwKVxuXHRqbXAgcjFcblx0bm9wXG4xOi5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwgIi1FTCIsCi0gICAgImVsZjMyLW1jb3JlLWxpdHRsZSIsIGJmZF9hcmNoX21jb3JlLAotICAgIG1jb3JlX2xlX2p0YWIsIHNpemVvZiAobWNvcmVfbGVfanRhYiksIDgKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTUFSTV9FUE9DIDkKLSAgICAiYXJtIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCi0gICAgImxkclx0aXAsW3BjXVxuXHRsZHJcdHBjLFtpcF1cblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiIiwKLSAgICAiZXBvYy1wZS1hcm0tbGl0dGxlIiwgYmZkX2FyY2hfYXJtLAotICAgIGFybV9qdGFiLCBzaXplb2YgKGFybV9qdGFiKSwgOAotICB9Ci0gICwKLSAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGRsaXN0Ci17Ci0gIGNoYXIgKnRleHQ7Ci0gIHN0cnVjdCBkbGlzdCAqbmV4dDsKLX0KLWRsaXN0X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGV4cG9ydAotICB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOwotICAgIGludCBvcmRpbmFsOwotICAgIGludCBjb25zdGFudDsKLSAgICBpbnQgbm9uYW1lOwotICAgIGludCBkYXRhOwotICAgIGludCBoaW50OwotICAgIHN0cnVjdCBleHBvcnQgKm5leHQ7Ci0gIH0KLWV4cG9ydF90eXBlOwotCi0vKiBBIGxpc3Qgb2Ygc3ltYm9scyB3aGljaCB3ZSBzaG91bGQgbm90IGV4cG9ydC4gICovCi0gCi1zdHJ1Y3Qgc3RyaW5nX2xpc3QKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OwotICBjaGFyICpzdHJpbmc7Ci19OwotCi1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICpleGNsdWRlczsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWFmdGVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWJlZm9yZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICphc21fcHJlZml4IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYXBwZW5kX2ltcG9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBydW4gUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fZHJlY3R2ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzY2FuX2ZpbHRlcmVkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBhZGRfZXhjbHVkZXMgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtYXRjaF9leGNsdWRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfZXhjbHVkZXMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGxvbmcgZmlsdGVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBzY2FuX2FsbF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzY2FuX29wZW5fb2JqX2ZpbGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fb2JqX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkdW1wX2RlZl9pbmZvIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCBzZnVuYyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIHZvaWQgZmx1c2hfcGFnZSBQQVJBTVMgKChGSUxFICosIGxvbmcgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGdlbl9kZWZfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9pZGF0YV9vZmlsZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGdlbl9leHBfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqeGxhdGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgZHVtcF9pYXQgUEFSQU1TICgoRklMRSAqLCBleHBvcnRfdHlwZSAqKSk7Ci0jZW5kaWYKLXN0YXRpYyBjaGFyICptYWtlX2xhYmVsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYmZkICptYWtlX29uZV9saWJfZmlsZSBQQVJBTVMgKChleHBvcnRfdHlwZSAqLCBpbnQpKTsKLXN0YXRpYyBiZmQgKm1ha2VfaGVhZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkICptYWtlX3RhaWwgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2VuX2xpYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcGZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyBpbnQgbmZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9udWxsX25hbWVzIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7Ci1zdGF0aWMgdm9pZCBkdGFiIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2R1cGxpY2F0ZXMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyB2b2lkIGZpbGxfb3JkaW5hbHMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyBpbnQgYWxwaGFmdW5jIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCBtYW5nbGVfZGVmcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZGlzcGxheSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluZm9ybSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIHZvaWQgd2FybiBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheSAobWVzc2FnZSwgYXJncykKLSAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2U7Ci0gICAgIHZhX2xpc3QgICAgICBhcmdzOwotewotICBpZiAocHJvZ3JhbV9uYW1lICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0KLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0KLSAgaWYgKG1lc3NhZ2UgW3N0cmxlbiAobWVzc2FnZSkgLSAxXSAhPSAnXG4nKQotICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOwotfSAgCi0KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBfX1NURENfXwotaW5mb3JtIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotI2Vsc2UKLWluZm9ybSAobWVzc2FnZSwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZ3M7Ci0gIAotICBpZiAoIXZlcmJvc2UpCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgX19TVERDX18KLSAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotI2VuZGlmCi0KLSAgZGlzcGxheSAobWVzc2FnZSwgYXJncyk7Ci0gIAotICB2YV9lbmQgKGFyZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotI2lmZGVmIF9fU1REQ19fCi13YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotI2Vsc2UKLXdhcm4gKG1lc3NhZ2UsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmdzOwotICAKLSNpZmRlZiBfX1NURENfXwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLSAgCi0gIGRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpOwotCi0gIHZhX2VuZCAoYXJncyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXJ2YWFmdGVyIChtYWNoaW5lKQotICAgICBpbnQgbWFjaGluZTsKLXsKLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIE1BUk06Ci0gICAgY2FzZSBNMzg2OgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcnZhYmVmb3JlIChtYWNoaW5lKQotICAgICBpbnQgbWFjaGluZTsKLXsKLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIE1BUk06Ci0gICAgY2FzZSBNMzg2OgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICByZXR1cm4gIi5ydmFcdCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmYXRhbCAoXygiSW50ZXJuYWwgZXJyb3I6IFVua25vd24gbWFjaGluZSB0eXBlOiAlZFxuIiksIG1hY2hpbmUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gIiI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWFzbV9wcmVmaXggKG1hY2hpbmUpCi0gICAgIGludCBtYWNoaW5lOwotewotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgTUFSTToKLSAgICBjYXNlIE1QUEM6Ci0gICAgY2FzZSBNVEhVTUI6Ci0gICAgY2FzZSBNQVJNX0lOVEVSV09SSzoKLSAgICBjYXNlIE1NQ09SRV9CRToKLSAgICBjYXNlIE1NQ09SRV9MRToKLSAgICBjYXNlIE1NQ09SRV9FTEY6Ci0gICAgY2FzZSBNTUNPUkVfRUxGX0xFOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzg2OgotICAgICAgcmV0dXJuICJfIjsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotI2RlZmluZSBBU01fQllURSAJbXRhYmxlW21hY2hpbmVdLmhvd19ieXRlCi0jZGVmaW5lIEFTTV9TSE9SVCAJbXRhYmxlW21hY2hpbmVdLmhvd19zaG9ydAotI2RlZmluZSBBU01fTE9ORwltdGFibGVbbWFjaGluZV0uaG93X2xvbmcKLSNkZWZpbmUgQVNNX1RFWFQJbXRhYmxlW21hY2hpbmVdLmhvd19hc2NpegotI2RlZmluZSBBU01fQyAJCW10YWJsZVttYWNoaW5lXS5ob3dfY29tbWVudAotI2RlZmluZSBBU01fSlVNUCAJbXRhYmxlW21hY2hpbmVdLmhvd19qdW1wCi0jZGVmaW5lIEFTTV9HTE9CQUwJbXRhYmxlW21hY2hpbmVdLmhvd19nbG9iYWwKLSNkZWZpbmUgQVNNX1NQQUNFCW10YWJsZVttYWNoaW5lXS5ob3dfc3BhY2UKLSNkZWZpbmUgQVNNX0FMSUdOX1NIT1JUIG10YWJsZVttYWNoaW5lXS5ob3dfYWxpZ25fc2hvcnQKLSNkZWZpbmUgQVNNX1JWQV9CRUZPUkUgCXJ2YWJlZm9yZShtYWNoaW5lKQotI2RlZmluZSBBU01fUlZBX0FGVEVSICAJcnZhYWZ0ZXIobWFjaGluZSkKLSNkZWZpbmUgQVNNX1BSRUZJWAlhc21fcHJlZml4KG1hY2hpbmUpCi0jZGVmaW5lIEFTTV9BTElHTl9MT05HICBtdGFibGVbbWFjaGluZV0uaG93X2FsaWduX2xvbmcKLSNkZWZpbmUgSE9XX0JGRF9SRUFEX1RBUkdFVCAgMCAgLyogYWx3YXlzIGRlZmF1bHQqLwotI2RlZmluZSBIT1dfQkZEX1dSSVRFX1RBUkdFVCBtdGFibGVbbWFjaGluZV0uaG93X2JmZF90YXJnZXQKLSNkZWZpbmUgSE9XX0JGRF9BUkNIICAgIG10YWJsZVttYWNoaW5lXS5ob3dfYmZkX2FyY2gKLSNkZWZpbmUgSE9XX0pUQUIgICAgICAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYgotI2RlZmluZSBIT1dfSlRBQl9TSVpFICAgbXRhYmxlW21hY2hpbmVdLmhvd19qdGFiX3NpemUKLSNkZWZpbmUgSE9XX0pUQUJfUk9GRiAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYl9yb2ZmCi0jZGVmaW5lIEFTTV9TV0lUQ0hFUyAgICBtdGFibGVbbWFjaGluZV0uaG93X2RlZmF1bHRfYXNfc3dpdGNoZXMKLQotc3RhdGljIGNoYXIgKipvYXY7Ci0KLXZvaWQKLXByb2Nlc3NfZGVmX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIEZJTEUgKmYgPSBmb3BlbiAobmFtZSwgRk9QRU5fUlQpOwotICAKLSAgaWYgKCFmKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oIkNhbid0IG9wZW4gZGVmIGZpbGU6ICVzIiksIG5hbWUpOwotCi0gIHl5aW4gPSBmOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiUHJvY2Vzc2luZyBkZWYgZmlsZTogJXMiKSwgbmFtZSk7Ci0gIAotICB5eXBhcnNlICgpOwotCi0gIGluZm9ybSAoXygiUHJvY2Vzc2VkIGRlZiBmaWxlIikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgcGFyc2VyICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpkX25hbWU7CS8qIEFyZyB0byBOQU1FIG9yIExJQlJBUlkgKi8KLXN0YXRpYyBpbnQgZF9uZnVuY3M7CQkvKiBOdW1iZXIgb2YgZnVuY3Rpb25zIGV4cG9ydGVkICovCi1zdGF0aWMgaW50IGRfbmFtZWRfbmZ1bmNzOwkvKiBOdW1iZXIgb2YgbmFtZWQgZnVuY3Rpb25zIGV4cG9ydGVkICovCi1zdGF0aWMgaW50IGRfbG93X29yZDsJCS8qIExvd2VzdCBvcmRpbmFsIGluZGV4ICovCi1zdGF0aWMgaW50IGRfaGlnaF9vcmQ7CQkvKiBIaWdoZXN0IG9yZGluYWwgaW5kZXggKi8KLXN0YXRpYyBleHBvcnRfdHlwZSAqZF9leHBvcnRzOwkvKmxpc3Qgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zICovCi1zdGF0aWMgZXhwb3J0X3R5cGUgKipkX2V4cG9ydHNfbGV4aWNhbGx5OwkvKiB2ZWN0b3Igb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIGFscGhhIG9yZGVyICovCi1zdGF0aWMgZGxpc3RfdHlwZSAqZF9saXN0OwkvKiBEZXNjcmlwdGlvbnMgKi8KLXN0YXRpYyBkbGlzdF90eXBlICphX2xpc3Q7CS8qIFN0dWZmIHRvIGdvIGluIGRpcmVjdGl2ZXMgKi8KLQotc3RhdGljIGludCBkX2lzX2RsbDsKLXN0YXRpYyBpbnQgZF9pc19leGU7Ci0KLWludAoteXllcnJvciAoZXJyKQotICAgICBjb25zdCBjaGFyICogZXJyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHdhcm4gKF8oIlN5bnRheCBlcnJvciBpbiBkZWYgZmlsZSAlczolZFxuIiksIGRlZl9maWxlLCBsaW5lbnVtYmVyKTsKLSAgCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1kZWZfZXhwb3J0cyAobmFtZSwgaW50ZXJuYWxfbmFtZSwgb3JkaW5hbCwgbm9uYW1lLCBjb25zdGFudCwgZGF0YSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgaW50IG9yZGluYWw7Ci0gICAgIGludCBub25hbWU7Ci0gICAgIGludCBjb25zdGFudDsKLSAgICAgaW50IGRhdGE7Ci17Ci0gIHN0cnVjdCBleHBvcnQgKnAgPSAoc3RydWN0IGV4cG9ydCAqKSB4bWFsbG9jIChzaXplb2YgKCpwKSk7Ci0KLSAgcC0+bmFtZSA9IG5hbWU7Ci0gIHAtPmludGVybmFsX25hbWUgPSBpbnRlcm5hbF9uYW1lID8gaW50ZXJuYWxfbmFtZSA6IG5hbWU7Ci0gIHAtPm9yZGluYWwgPSBvcmRpbmFsOwotICBwLT5jb25zdGFudCA9IGNvbnN0YW50OwotICBwLT5ub25hbWUgPSBub25hbWU7Ci0gIHAtPmRhdGEgPSBkYXRhOwotICBwLT5uZXh0ID0gZF9leHBvcnRzOwotICBkX2V4cG9ydHMgPSBwOwotICBkX25mdW5jcysrOwotfQotCi12b2lkCi1kZWZfbmFtZSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiTkFNRTogJXMgYmFzZTogJXgiKSwgbmFtZSwgYmFzZSk7Ci0gIAotICBpZiAoZF9pc19kbGwpCi0gICAgd2FybiAoXygiQ2FuJ3QgaGF2ZSBMSUJSQVJZIGFuZCBOQU1FXG4iKSk7Ci0gIAotICBkX25hbWUgPSBuYW1lOwotICAvKiBpZiAtLWRsbG5hbWUgbm90IHByb3ZpZGVkLCB1c2UgdGhlIG9uZSBpbiB0aGUgREVGIGZpbGUuCi0gICAgIEZJWE1FOiBJcyB0aGlzIGFwcHJvcHJpYXRlIGZvciBleGVjdXRhYmxlcz8gKi8KLSAgaWYgKCEgZGxsX25hbWUpCi0gICAgZGxsX25hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgZF9pc19leGUgPSAxOwotfQotCi12b2lkCi1kZWZfbGlicmFyeSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiTElCUkFSWTogJXMgYmFzZTogJXgiKSwgbmFtZSwgYmFzZSk7Ci0gIAotICBpZiAoZF9pc19leGUpCi0gICAgd2FybiAoXygiJXM6IENhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIAotICBkX25hbWUgPSBuYW1lOwotICAvKiBpZiAtLWRsbG5hbWUgbm90IHByb3ZpZGVkLCB1c2UgdGhlIG9uZSBpbiB0aGUgREVGIGZpbGUuICovCi0gIGlmICghIGRsbF9uYW1lKQotICAgIGRsbF9uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGRfaXNfZGxsID0gMTsKLX0KLQotdm9pZAotZGVmX2Rlc2NyaXB0aW9uIChkZXNjKQotICAgICBjb25zdCBjaGFyICpkZXNjOwotewotICBkbGlzdF90eXBlICpkID0gKGRsaXN0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkbGlzdF90eXBlKSk7Ci0gIGQtPnRleHQgPSB4c3RyZHVwIChkZXNjKTsKLSAgZC0+bmV4dCA9IGRfbGlzdDsKLSAgZF9saXN0ID0gZDsKLX0KLQotdm9pZAotbmV3X2RpcmVjdGl2ZSAoZGlyKQotICAgICBjaGFyICpkaXI7Ci17Ci0gIGRsaXN0X3R5cGUgKmQgPSAoZGxpc3RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGRsaXN0X3R5cGUpKTsKLSAgZC0+dGV4dCA9IHhzdHJkdXAgKGRpcik7Ci0gIGQtPm5leHQgPSBhX2xpc3Q7Ci0gIGFfbGlzdCA9IGQ7Ci19Ci0KLXZvaWQKLWRlZl9oZWFwc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQotICAgICBpbnQgcmVzZXJ2ZTsKLSAgICAgaW50IGNvbW1pdDsKLXsKLSAgY2hhciBiWzIwMF07Ci0gIGlmIChjb21taXQgPiAwKQotICAgIHNwcmludGYgKGIsICItaGVhcCAweCV4LDB4JXggIiwgcmVzZXJ2ZSwgY29tbWl0KTsKLSAgZWxzZQotICAgIHNwcmludGYgKGIsICItaGVhcCAweCV4ICIsIHJlc2VydmUpOwotICBuZXdfZGlyZWN0aXZlICh4c3RyZHVwIChiKSk7Ci19Ci0KLXZvaWQKLWRlZl9zdGFja3NpemUgKHJlc2VydmUsIGNvbW1pdCkKLSAgICAgaW50IHJlc2VydmU7Ci0gICAgIGludCBjb21taXQ7Ci17Ci0gIGNoYXIgYlsyMDBdOwotICBpZiAoY29tbWl0ID4gMCkKLSAgICBzcHJpbnRmIChiLCAiLXN0YWNrIDB4JXgsMHgleCAiLCByZXNlcnZlLCBjb21taXQpOwotICBlbHNlCi0gICAgc3ByaW50ZiAoYiwgIi1zdGFjayAweCV4ICIsIHJlc2VydmUpOwotICBuZXdfZGlyZWN0aXZlICh4c3RyZHVwIChiKSk7Ci19Ci0KLS8qIGFwcGVuZF9pbXBvcnQgc2ltcGx5IGFkZHMgdGhlIGdpdmVuIGltcG9ydCBkZWZpbml0aW9uIHRvIHRoZSBnbG9iYWwKLSAgIGltcG9ydF9saXN0LiAgSXQgaXMgdXNlZCBieSBkZWZfaW1wb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLWFwcGVuZF9pbXBvcnQgKHN5bWJvbF9uYW1lLCBkbGxfbmFtZSwgZnVuY19vcmRpbmFsKQotICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGxsX25hbWU7Ci0gICAgIGludCBmdW5jX29yZGluYWw7Ci17Ci0gIGloZWFkdHlwZSAqKnBxOwotICBpaGVhZHR5cGUgKnE7Ci0KLSAgZm9yIChwcSA9ICZpbXBvcnRfbGlzdDsgKnBxICE9IE5VTEw7IHBxID0gJigqcHEpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKCgqcHEpLT5kbGxuYW1lLCBkbGxfbmFtZSkgPT0gMCkKLQl7Ci0JICBxID0gKnBxOwotCSAgcS0+ZnVuY3RhaWwtPm5leHQgPSB4bWFsbG9jIChzaXplb2YgKGlmdW5jdHlwZSkpOwotCSAgcS0+ZnVuY3RhaWwgPSBxLT5mdW5jdGFpbC0+bmV4dDsKLQkgIHEtPmZ1bmN0YWlsLT5vcmQgID0gZnVuY19vcmRpbmFsOwotCSAgcS0+ZnVuY3RhaWwtPm5hbWUgPSB4c3RyZHVwIChzeW1ib2xfbmFtZSk7Ci0JICBxLT5mdW5jdGFpbC0+bmV4dCA9IE5VTEw7Ci0JICBxLT5uZnVuY3MrKzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIHEgPSB4bWFsbG9jIChzaXplb2YgKGloZWFkdHlwZSkpOwotICBxLT5kbGxuYW1lID0geHN0cmR1cCAoZGxsX25hbWUpOwotICBxLT5uZnVuY3MgPSAxOwotICBxLT5mdW5jaGVhZCA9IHhtYWxsb2MgKHNpemVvZiAoaWZ1bmN0eXBlKSk7Ci0gIHEtPmZ1bmN0YWlsID0gcS0+ZnVuY2hlYWQ7Ci0gIHEtPm5leHQgPSBOVUxMOwotICBxLT5mdW5jdGFpbC0+bmFtZSA9IHhzdHJkdXAgKHN5bWJvbF9uYW1lKTsKLSAgcS0+ZnVuY3RhaWwtPm9yZCAgPSBmdW5jX29yZGluYWw7Ci0gIHEtPmZ1bmN0YWlsLT5uZXh0ID0gTlVMTDsKLQotICAqcHEgPSBxOwotfQotCi0vKiBkZWZfaW1wb3J0IGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBkZWZwYXJzZS55IHdoZW4gYW4gSU1QT1JUCi0gICBkZWNsYXJhdGlvbiBpcyBlbmNvdW50ZXJlZC4gIERlcGVuZGluZyBvbiB0aGUgZm9ybSBvZiB0aGUKLSAgIGRlY2xhcmF0aW9uLCB0aGUgbW9kdWxlIG5hbWUgbWF5IG9yIG1heSBub3QgbmVlZCAiLmRsbCIgdG8gYmUKLSAgIGFwcGVuZGVkIHRvIGl0LCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gbWF5IGJlIHN0b3JlZCBpbiBpbnRlcm5hbAotICAgb3IgZW50cnksIGFuZCB0aGVyZSBtYXkgb3IgbWF5IG5vdCBiZSBhbiBvcmRpbmFsIHZhbHVlIGFzc29jaWF0ZWQKLSAgIHdpdGggaXQuICAqLwotCi0vKiBBIG5vdGUgcmVnYXJkaW5nIHRoZSBwYXJzZSBtb2RlczoKLSAgIEluIGRlZnBhcnNlLnkgd2UgaGF2ZSB0byBhY2NlcHQgaW1wb3J0IGRlY2xhcmF0aW9ucyB3aGljaCBmb2xsb3cKLSAgIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKLSAgICAgPGZ1bmNfbmFtZV9pbl9hcHA+ID0gPGRsbF9uYW1lPi48ZnVuY19uYW1lX2luX2RsbD4KLSAgICAgPGZ1bmNfbmFtZV9pbl9hcHA+ID0gPGRsbF9uYW1lPi48bnVtYmVyPgotICAgICA8ZGxsX25hbWU+LjxmdW5jX25hbWVfaW5fZGxsPgotICAgICA8ZGxsX25hbWU+LjxudW1iZXI+Ci0gICBGdXJ0aGVybW9yZSwgdGhlIGRsbCdzIG5hbWUgbWF5IG9yIG1heSBub3QgZW5kIHdpdGggIi5kbGwiLCB3aGljaAotICAgY29tcGxpY2F0ZXMgdGhlIHBhcnNpbmcgYSBsaXR0bGUuICBOb3JtYWxseSB0aGUgZGxsJ3MgbmFtZSBpcwotICAgcGFzc2VkIHRvIGRlZl9pbXBvcnQoKSBpbiB0aGUgIm1vZHVsZSIgcGFyYW1ldGVyLCBidXQgd2hlbiBpdCBlbmRzCi0gICB3aXRoICIuZGxsIiBpdCBnZXRzIHBhc3NlZCBpbiAibW9kdWxlIiBzYW5zICIuZGxsIiBhbmQgdGhhdCBuZWVkcwotICAgdG8gYmUgcmVhcHBlbmRlZC4KLQotICBkZWZfaW1wb3J0IGdldHMgZml2ZSBwYXJhbWV0ZXJzOgotICBBUFBfTkFNRSAtIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgYXBwbGljYXRpb24sIGlmCi0gICAgICAgICAgICAgcHJlc2VudCwgb3IgTlVMTCBpZiBub3QgcHJlc2VudC4KLSAgTU9EVUxFICAgLSB0aGUgbmFtZSBvZiB0aGUgZGxsLCBwb3NzaWJseSBzYW5zIGV4dGVuc2lvbiAoaWUsICcuZGxsJykuCi0gIERMTEVYVCAgIC0gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZGxsLCBpZiBwcmVzZW50LCBOVUxMIGlmIG5vdCBwcmVzZW50LgotICBFTlRSWSAgICAtIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgZGxsLCBpZiBwcmVzZW50LCBvciBOVUxMLgotICBPUkRfVkFMICAtIHRoZSBudW1lcmljYWwgdGFnIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgZGxsLCBpZiBwcmVzZW50LAotICAgICAgICAgICAgIG9yIE5VTEwuICBFeGFjdGx5IG9uZSBvZiA8ZW50cnk+IG9yIDxvcmRfdmFsPiBtdXN0IGJlCi0gICAgICAgICAgICAgcHJlc2VudCAoaS5lLiwgbm90IE5VTEwpLiAgKi8KLQotdm9pZAotZGVmX2ltcG9ydCAoYXBwX25hbWUsIG1vZHVsZSwgZGxsZXh0LCBlbnRyeSwgb3JkX3ZhbCkKLSAgICAgY29uc3QgY2hhciAqYXBwX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZHVsZTsKLSAgICAgY29uc3QgY2hhciAqZGxsZXh0OwotICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICAgaW50IG9yZF92YWw7Ci17Ci0gIGNvbnN0IGNoYXIgKmFwcGxpY2F0aW9uX25hbWU7Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAoZW50cnkgIT0gTlVMTCkKLSAgICBhcHBsaWNhdGlvbl9uYW1lID0gZW50cnk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYXBwX25hbWUgIT0gTlVMTCkKLQlhcHBsaWNhdGlvbl9uYW1lID0gYXBwX25hbWU7Ci0gICAgICBlbHNlCi0JYXBwbGljYXRpb25fbmFtZSA9ICIiOwotICAgIH0KLSAgCi0gIGlmIChkbGxleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAobW9kdWxlKSArIHN0cmxlbiAoZGxsZXh0KSArIDIpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJXMuJXMiLCBtb2R1bGUsIGRsbGV4dCk7Ci0gICAgICBtb2R1bGUgPSBidWY7Ci0gICAgfQotCi0gIGFwcGVuZF9pbXBvcnQgKGFwcGxpY2F0aW9uX25hbWUsIG1vZHVsZSwgb3JkX3ZhbCk7Ci19Ci0KLXZvaWQKLWRlZl92ZXJzaW9uIChtYWpvciwgbWlub3IpCi0gICAgIGludCBtYWpvcjsKLSAgICAgaW50IG1pbm9yOwotewotICBwcmludGYgKCJWRVJTSU9OICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOwotfQotCi12b2lkCi1kZWZfc2VjdGlvbiAobmFtZSwgYXR0cikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGF0dHI7Ci17Ci0gIGNoYXIgYnVmWzIwMF07Ci0gIGNoYXIgYXR0c1s1XTsKLSAgY2hhciAqZCA9IGF0dHM7Ci0gIGlmIChhdHRyICYgMSkKLSAgICAqZCsrID0gJ1InOwotCi0gIGlmIChhdHRyICYgMikKLSAgICAqZCsrID0gJ1cnOwotICBpZiAoYXR0ciAmIDQpCi0gICAgKmQrKyA9ICdYJzsKLSAgaWYgKGF0dHIgJiA4KQotICAgICpkKysgPSAnUyc7Ci0gICpkKysgPSAwOwotICBzcHJpbnRmIChidWYsICItYXR0ciAlcyAlcyIsIG5hbWUsIGF0dHMpOwotICBuZXdfZGlyZWN0aXZlICh4c3RyZHVwIChidWYpKTsKLX0KLQotdm9pZAotZGVmX2NvZGUgKGF0dHIpCi0gICAgIGludCBhdHRyOwotewotCi0gIGRlZl9zZWN0aW9uICgiQ09ERSIsIGF0dHIpOwotfQotCi12b2lkCi1kZWZfZGF0YSAoYXR0cikKLSAgICAgaW50IGF0dHI7Ci17Ci0gIGRlZl9zZWN0aW9uICgiREFUQSIsIGF0dHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLXJ1biAod2hhdCwgYXJncykKLSAgICAgY29uc3QgY2hhciAqd2hhdDsKLSAgICAgY2hhciAqYXJnczsKLXsKLSAgY2hhciAqczsKLSAgaW50IHBpZCwgd2FpdF9zdGF0dXM7Ci0gIGludCBpOwotICBjb25zdCBjaGFyICoqYXJndjsKLSAgY2hhciAqZXJybXNnX2ZtdCwgKmVycm1zZ19hcmc7Ci0gIGNoYXIgKnRlbXBfYmFzZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0KLSAgaW5mb3JtICgicnVuOiAlcyAlc1xuIiwgd2hhdCwgYXJncyk7Ci0KLSAgLyogQ291bnQgdGhlIGFyZ3MgKi8KLSAgaSA9IDA7Ci0gIGZvciAocyA9IGFyZ3M7ICpzOyBzKyspCi0gICAgaWYgKCpzID09ICcgJykKLSAgICAgIGkrKzsKLSAgaSsrOwotICBhcmd2ID0gYWxsb2NhIChzaXplb2YgKGNoYXIgKikgKiAoaSArIDMpKTsKLSAgaSA9IDA7Ci0gIGFyZ3ZbaSsrXSA9IHdoYXQ7Ci0gIHMgPSBhcmdzOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoKnMgPT0gJyAnKQotCSsrczsKLSAgICAgIGFyZ3ZbaSsrXSA9IHM7Ci0gICAgICB3aGlsZSAoKnMgIT0gJyAnICYmICpzICE9IDApCi0JcysrOwotICAgICAgaWYgKCpzID09IDApCi0JYnJlYWs7Ci0gICAgICAqcysrID0gMDsKLSAgICB9Ci0gIGFyZ3ZbaSsrXSA9IE5VTEw7Ci0KLSAgcGlkID0gcGV4ZWN1dGUgKGFyZ3ZbMF0sIChjaGFyICogY29uc3QgKikgYXJndiwgcHJvZ3JhbV9uYW1lLCB0ZW1wX2Jhc2UsCi0JCSAgJmVycm1zZ19mbXQsICZlcnJtc2dfYXJnLCBQRVhFQ1VURV9PTkUgfCBQRVhFQ1VURV9TRUFSQ0gpOwotCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgaW5mb3JtIChzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIAotICAgICAgZmF0YWwgKGVycm1zZ19mbXQsIGVycm1zZ19hcmcpOwotICAgIH0KLQotICBwaWQgPSBwd2FpdCAocGlkLCAmIHdhaXRfc3RhdHVzLCAwKTsKLSAgCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJ3YWl0OiAlcyIpLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICB9Ci0gIGVsc2UgaWYgKFdJRlNJR05BTEVEICh3YWl0X3N0YXR1cykpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJzdWJwcm9jZXNzIGdvdCBmYXRhbCBzaWduYWwgJWQiKSwgV1RFUk1TSUcgKHdhaXRfc3RhdHVzKSk7Ci0gICAgfQotICBlbHNlIGlmIChXSUZFWElURUQgKHdhaXRfc3RhdHVzKSkKLSAgICB7Ci0gICAgICBpZiAoV0VYSVRTVEFUVVMgKHdhaXRfc3RhdHVzKSAhPSAwKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0Jd2FybiAoXygiJXMgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iKSwKLQkgICAgICB3aGF0LCBXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotLyogTG9vayBmb3IgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0IGluIHRoZSAuZHJlY3R2ZSBzZWN0aW9uIG9mCi0gICBBQkZELiAgUGFzcyBlYWNoIG9uZSB0byBkZWZfZXhwb3J0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1zY2FuX2RyZWN0dmVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqIHM7Ci0gIGludCAgICAgICAgc2l6ZTsKLSAgY2hhciAqICAgICBidWY7Ci0gIGNoYXIgKiAgICAgcDsKLSAgY2hhciAqICAgICBlOwotCi0gIC8qIExvb2sgZm9yIC5kcmVjdHZlJ3MgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBEUkVDVFZFX1NFQ1RJT05fTkFNRSk7Ci0gIAotICBpZiAocyA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgICAgIAotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzKTsKLSAgYnVmICA9IHhtYWxsb2MgKHNpemUpOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgYnVmLCAwLCBzaXplKTsKLSAgICAgIAotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIlN1Y2tpbmcgaW4gaW5mbyBmcm9tICVzIHNlY3Rpb24gaW4gJXNcbiIpLAotCSAgRFJFQ1RWRV9TRUNUSU9OX05BTUUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAvKiBTZWFyY2ggZm9yIC1leHBvcnQ6IHN0cmluZ3MuIFRoZSBleHBvcnRlZCBzeW1ib2xzIGNhbiBvcHRpb25hbGx5Ci0gICAgIGhhdmUgdHlwZSB0YWdzIChlZy4sIC1leHBvcnQ6Zm9vLGRhdGEpLCBzbyBoYW5kbGUgdGhvc2UgYXMgd2VsbC4KLSAgICAgQ3VycmVudGx5IG9ubHkgZGF0YSB0YWcgaXMgc3VwcG9ydGVkLiAgKi8KLSAgcCA9IGJ1ZjsKLSAgZSA9IGJ1ZiArIHNpemU7Ci0gIHdoaWxlIChwIDwgZSkKLSAgICB7Ci0gICAgICBpZiAocFswXSA9PSAnLScKLQkgICYmIHN0cm5jbXAgKHAsICItZXhwb3J0OiIsIDgpID09IDApCi0JewotCSAgY2hhciAqIG5hbWU7Ci0JICBjaGFyICogYzsKLQkgIGZsYWd3b3JkIGZsYWdzID0gQlNGX0ZVTkNUSU9OOwotCSAgCi0JICBwICs9IDg7Ci0JICBuYW1lID0gcDsKLQkgIHdoaWxlIChwIDwgZSAmJiAqcCAhPSAnLCcgJiYgKnAgIT0gJyAnICYmICpwICE9ICctJykKLQkgICAgcCsrOwotCSAgYyA9IHhtYWxsb2MgKHAgLSBuYW1lICsgMSk7Ci0JICBtZW1jcHkgKGMsIG5hbWUsIHAgLSBuYW1lKTsKLQkgIGNbcCAtIG5hbWVdID0gMDsKLQkgIGlmIChwIDwgZSAmJiAqcCA9PSAnLCcpICAgICAgIC8qIGZvdW5kIHR5cGUgdGFnLiAqLwotCSAgICB7Ci0JICAgICAgY2hhciAqdGFnX3N0YXJ0ID0gKytwOwotCSAgICAgIHdoaWxlIChwIDwgZSAmJiAqcCAhPSAnICcgJiYgKnAgIT0gJy0nKQotCQlwKys7Ci0JICAgICAgaWYgKHN0cm5jbXAgKHRhZ19zdGFydCwgImRhdGEiLCA0KSA9PSAwKQotCQlmbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotCSAgICB9Ci0KLQkgIC8qIEZJWE1FOiBUaGUgNXRoIGFyZyBpcyBmb3IgdGhlIGBjb25zdGFudCcgZmllbGQuCi0JICAgICBXaGF0IHNob3VsZCBpdCBiZT8gIE5vdCB0aGF0IGl0IG1hdHRlcnMgc2luY2UgaXQncyBub3QKLQkgICAgIGN1cnJlbnRseSB1c2VmdWwuICAqLwotCSAgZGVmX2V4cG9ydHMgKGMsIDAsIC0xLCAwLCAwLCAhIChmbGFncyAmIEJTRl9GVU5DVElPTikpOwotCi0JICBpZiAoYWRkX3N0ZGNhbGxfYWxpYXMgJiYgc3RyY2hyIChjLCAnQCcpKQotCSAgICB7Ci0JICAgICAgY2hhciAqZXhwb3J0ZWRfbmFtZSA9IHhzdHJkdXAgKGMpOwotCSAgICAgIGNoYXIgKmF0c3ltID0gc3RyY2hyIChleHBvcnRlZF9uYW1lLCAnQCcpOwotCSAgICAgICphdHN5bSA9ICdcMCc7Ci0JICAgICAgLyogTm90ZTogc3RkY2FsbCBhbGlhcyBzeW1ib2xzIGNhbiBuZXZlciBiZSBkYXRhLiAgKi8KLQkgICAgICBkZWZfZXhwb3J0cyAoZXhwb3J0ZWRfbmFtZSwgeHN0cmR1cCAoYyksIC0xLCAwLCAwLCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlwKys7Ci0gICAgfQotICBmcmVlIChidWYpOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgaW4gTUlOSVNZTVMsIGFuZCBhZGQgZWFjaCBvbmUgdG8gbGlzdCBvZgotICAgc3ltYm9scyB0byBleHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9maWx0ZXJlZF9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0gIGJmZF9ieXRlICpmcm9tLCAqZnJvbWVuZDsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20gKz0gc2l6ZSkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZTsKLQotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBmYWxzZSwgZnJvbSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBzeW1ib2xfbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0gICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSBzeW1ib2xfbmFtZVswXSkKLQkrK3N5bWJvbF9uYW1lOwotCi0gICAgICBkZWZfZXhwb3J0cyAoeHN0cmR1cCAoc3ltYm9sX25hbWUpICwgMCwgLTEsIDAsIDAsCi0JCSAgICEgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKTsKLQotICAgICAgaWYgKGFkZF9zdGRjYWxsX2FsaWFzICYmIHN0cmNociAoc3ltYm9sX25hbWUsICdAJykpCi0gICAgICAgIHsKLQkgIGNoYXIgKmV4cG9ydGVkX25hbWUgPSB4c3RyZHVwIChzeW1ib2xfbmFtZSk7Ci0JICBjaGFyICphdHN5bSA9IHN0cmNociAoZXhwb3J0ZWRfbmFtZSwgJ0AnKTsKLQkgICphdHN5bSA9ICdcMCc7Ci0JICAvKiBOb3RlOiBzdGRjYWxsIGFsaWFzIHN5bWJvbHMgY2FuIG5ldmVyIGJlIGRhdGEuICovCi0JICBkZWZfZXhwb3J0cyAoZXhwb3J0ZWRfbmFtZSwgeHN0cmR1cCAoc3ltYm9sX25hbWUpLCAtMSwgMCwgMCwgMCk7Ci0JfQotICAgIH0KLX0KLQotLyogQWRkIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX2V4Y2x1ZGVzIChuZXdfZXhjbHVkZXMpCi0gICAgIGNvbnN0IGNoYXIgKm5ld19leGNsdWRlczsKLXsKLSAgY2hhciAqbG9jYWxfY29weTsKLSAgY2hhciAqZXhjbHVkZV9zdHJpbmc7Ci0KLSAgbG9jYWxfY29weSA9IHhzdHJkdXAgKG5ld19leGNsdWRlcyk7Ci0KLSAgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKGxvY2FsX2NvcHksICIsOiIpOwotICBmb3IgKDsgZXhjbHVkZV9zdHJpbmc7IGV4Y2x1ZGVfc3RyaW5nID0gc3RydG9rIChOVUxMLCAiLDoiKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5ld19leGNsdWRlOwotICAgICAgCi0gICAgICBuZXdfZXhjbHVkZSA9ICgoc3RydWN0IHN0cmluZ19saXN0ICopCi0JCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2xpc3QpKSk7Ci0gICAgICBuZXdfZXhjbHVkZS0+c3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChleGNsdWRlX3N0cmluZykgKyAyKTsKLSAgICAgIC8qIEZJWE1FOiBJcyBpdCBhbHdheXMgcmlnaHQgdG8gYWRkIGEgbGVhZGluZyB1bmRlcnNjb3JlPyAgKi8KLSAgICAgIHNwcmludGYgKG5ld19leGNsdWRlLT5zdHJpbmcsICJfJXMiLCBleGNsdWRlX3N0cmluZyk7Ci0gICAgICBuZXdfZXhjbHVkZS0+bmV4dCA9IGV4Y2x1ZGVzOwotICAgICAgZXhjbHVkZXMgPSBuZXdfZXhjbHVkZTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGluZm9ybSAoXygiRXhjbHVkaW5nIHN5bWJvbDogJXNcbiIpLCBleGNsdWRlX3N0cmluZyk7Ci0gICAgfQotCi0gIGZyZWUgKGxvY2FsX2NvcHkpOwotfQotCi0vKiBTZWUgaWYgU1RSSU5HIGlzIG9uIHRoZSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhjbHVkZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tYXRjaF9leGNsdWRlIChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpleGNsX2l0ZW07Ci0KLSAgZm9yIChleGNsX2l0ZW0gPSBleGNsdWRlczsgZXhjbF9pdGVtOyBleGNsX2l0ZW0gPSBleGNsX2l0ZW0tPm5leHQpCi0gICAgaWYgKHN0cmNtcCAoc3RyaW5nLCBleGNsX2l0ZW0tPnN0cmluZykgPT0gMCkKLSAgICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCB0aGUgZGVmYXVsdCBsaXN0IG9mIHN5bWJvbHMgdG8gZXhjbHVkZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZGVmYXVsdF9leGNsdWRlcyAodm9pZCkKLXsKLSAgYWRkX2V4Y2x1ZGVzIChkZWZhdWx0X2V4Y2x1ZGVzKTsKLX0KLQotLyogQ2hvb3NlIHdoaWNoIHN5bWJvbHMgdG8gZXhwb3J0LiAgKi8KLQotc3RhdGljIGxvbmcKLWZpbHRlcl9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgYmZkX2J5dGUgKmZyb20sICpmcm9tZW5kLCAqdG87Ci0gIGFzeW1ib2wgKnN0b3JlOwotCi0gIHN0b3JlID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgaWYgKHN0b3JlID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgZnJvbSA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudCAqIHNpemU7Ci0gIHRvID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotCi0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQotICAgIHsKLSAgICAgIGludCBrZWVwID0gMDsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLQotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBmYWxzZSwgKGNvbnN0IFBUUikgZnJvbSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICAvKiBDaGVjayBmb3IgZXh0ZXJuYWwgYW5kIGRlZmluZWQgb25seSBzeW1ib2xzLiAgKi8KLSAgICAgIGtlZXAgPSAoKChzeW0tPmZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMAotCSAgICAgICB8fCAoc3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwCi0JICAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkgICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSk7Ci0gICAgICAKLSAgICAgIGtlZXAgPSBrZWVwICYmICEgbWF0Y2hfZXhjbHVkZSAoc3ltLT5uYW1lKTsKLQotICAgICAgaWYgKGtlZXApCi0JewotCSAgbWVtY3B5ICh0bywgZnJvbSwgc2l6ZSk7Ci0JICB0byArPSBzaXplOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuICh0byAtIChiZmRfYnl0ZSAqKSBtaW5pc3ltcykgLyBzaXplOwotfQotCi0vKiBFeHBvcnQgYWxsIHN5bWJvbHMgaW4gQUJGRCwgZXhjZXB0IGZvciBvbmVzIHdlIHdlcmUgdG9sZCBub3QgdG8KLSAgIGV4cG9ydC4gICovCi0KLXN0YXRpYyB2b2lkCi1zY2FuX2FsbF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIFBUUiBtaW5pc3ltczsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgLyogSWdub3JlIGJmZHMgd2l0aCBhbiBpbXBvcnQgZGVzY3JpcHRvciB0YWJsZS4gIFdlIGFzc3VtZSB0aGF0IGFueQotICAgICBzdWNoIEJGRCBjb250YWlucyBzeW1ib2xzIHdoaWNoIGFyZSBleHBvcnRlZCBmcm9tIGFub3RoZXIgRExMLAotICAgICBhbmQgd2UgZG9uJ3Qgd2FudCB0byByZWV4cG9ydCB0aGVtIGZyb20gaGVyZS4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pZGF0YSQ0IikpCi0gICAgcmV0dXJuOwotCi0gIGlmICghIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICB3YXJuIChfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3ltY291bnQgPSBiZmRfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZmFsc2UsICZtaW5pc3ltcywgJnNpemUpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGlmIChzeW1jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICB3YXJuIChfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRGlzY2FyZCB0aGUgc3ltYm9scyB3ZSBkb24ndCB3YW50IHRvIGV4cG9ydC4gIEl0J3MgT0sgdG8gZG8gdGhpcwotICAgICBpbiBwbGFjZTsgd2UnbGwgZnJlZSB0aGUgc3RvcmFnZSBhbnl3YXkuICAqLwotCi0gIHN5bWNvdW50ID0gZmlsdGVyX3N5bWJvbHMgKGFiZmQsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSk7Ci0gIHNjYW5fZmlsdGVyZWRfc3ltYm9scyAoYWJmZCwgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKTsKLQotICBmcmVlIChtaW5pc3ltcyk7Ci19Ci0KLS8qIExvb2sgYXQgdGhlIG9iamVjdCBmaWxlIHRvIGRlY2lkZSB3aGljaCBzeW1ib2xzIHRvIGV4cG9ydC4gICovCi0KLXN0YXRpYyB2b2lkCi1zY2FuX29wZW5fb2JqX2ZpbGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGV4cG9ydF9hbGxfc3ltYm9scykKLSAgICBzY2FuX2FsbF9zeW1ib2xzIChhYmZkKTsKLSAgZWxzZQotICAgIHNjYW5fZHJlY3R2ZV9zeW1ib2xzIChhYmZkKTsKLSAKLSAgLyogRklYTUU6IHdlIG91Z2h0IHRvIHJlYWQgaW4gYW5kIGJsb2NrIG91dCB0aGUgYmFzZSByZWxvY2F0aW9ucyAqLwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiRG9uZSByZWFkaW5nICVzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotfQotCi1zdGF0aWMgdm9pZAotc2Nhbl9vYmpfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBiZmQgKiBmID0gYmZkX29wZW5yIChmaWxlbmFtZSwgMCk7Ci0KLSAgaWYgKCFmKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oIlVuYWJsZSB0byBvcGVuIG9iamVjdCBmaWxlOiAlcyIpLCBmaWxlbmFtZSk7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJTY2FubmluZyBvYmplY3QgZmlsZSAlcyIpLCBmaWxlbmFtZSk7Ci0gIAotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZiwgYmZkX2FyY2hpdmUpKQotICAgIHsKLSAgICAgIGJmZCAqYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZiwgMCk7Ci0gICAgICB3aGlsZSAoYXJmaWxlKQotCXsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhcmZpbGUsIGJmZF9vYmplY3QpKQotCSAgICBzY2FuX29wZW5fb2JqX2ZpbGUgKGFyZmlsZSk7Ci0JICBiZmRfY2xvc2UgKGFyZmlsZSk7Ci0JICBhcmZpbGUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmLCBhcmZpbGUpOwotCX0KLSAgICAgIAotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gICAgICBpZiAobWNvcmVfZWxmX291dF9maWxlKQotCWluZm9ybSAoXygiQ2Fubm90IHByb2R1Y2UgbWNvcmUtZWxmIGRsbCBmcm9tIGFyY2hpdmUgZmlsZTogJXMiKSwgZmlsZW5hbWUpOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICBzY2FuX29wZW5fb2JqX2ZpbGUgKGYpOwotCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLSAgICAgIGlmIChtY29yZV9lbGZfb3V0X2ZpbGUpCi0JbWNvcmVfZWxmX2NhY2hlX2ZpbGVuYW1lICgoY2hhciAqKSBmaWxlbmFtZSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgYmZkX2Nsb3NlIChmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2RlZl9pbmZvIChmKQotICAgICBGSUxFICpmOwotewotICBpbnQgaTsKLSAgZXhwb3J0X3R5cGUgKmV4cDsKLSAgZnByaW50ZiAoZiwgIiVzICIsIEFTTV9DKTsKLSAgZm9yIChpID0gMDsgb2F2W2ldOyBpKyspCi0gICAgZnByaW50ZiAoZiwgIiVzICIsIG9hdltpXSk7Ci0gIGZwcmludGYgKGYsICJcbiIpOwotICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIiVzICAlZCA9ICVzICVzIEAgJWQgJXMlcyVzXG4iLAotCSAgICAgICBBU01fQywKLQkgICAgICAgaSwKLQkgICAgICAgZXhwLT5uYW1lLAotCSAgICAgICBleHAtPmludGVybmFsX25hbWUsCi0JICAgICAgIGV4cC0+b3JkaW5hbCwKLQkgICAgICAgZXhwLT5ub25hbWUgPyAiTk9OQU1FICIgOiAiIiwKLQkgICAgICAgZXhwLT5jb25zdGFudCA/ICJDT05TVEFOVCIgOiAiIiwKLQkgICAgICAgZXhwLT5kYXRhID8gIkRBVEEiIDogIiIpOwotICAgIH0KLX0KLQotLyogR2VuZXJhdGUgdGhlIC5leHAgZmlsZSAqLwotCi1zdGF0aWMgaW50Ci1zZnVuYyAoYSwgYikKLSAgICAgY29uc3Qgdm9pZCAqYTsKLSAgICAgY29uc3Qgdm9pZCAqYjsKLXsKLSAgcmV0dXJuICooY29uc3QgbG9uZyAqKSBhIC0gKihjb25zdCBsb25nICopIGI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mbHVzaF9wYWdlIChmLCBuZWVkLCBwYWdlX2FkZHIsIG9uX3BhZ2UpCi0gICAgIEZJTEUgKmY7Ci0gICAgIGxvbmcgKm5lZWQ7Ci0gICAgIGludCBwYWdlX2FkZHI7Ci0gICAgIGludCBvbl9wYWdlOwotewotICBpbnQgaTsKLQotICAvKiBGbHVzaCB0aGlzIHBhZ2UgKi8KLSAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JTA4eFx0JXMgU3RhcnRpbmcgUlZBIGZvciBjaHVua1xuIiwKLQkgICBBU01fTE9ORywKLQkgICBwYWdlX2FkZHIsCi0JICAgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MHgleFx0JXMgU2l6ZSBvZiBibG9ja1xuIiwKLQkgICBBU01fTE9ORywKLQkgICAob25fcGFnZSAqIDIpICsgKG9uX3BhZ2UgJiAxKSAqIDIgKyA4LAotCSAgIEFTTV9DKTsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBvbl9wYWdlOyBpKyspCi0gICAgewotICAgICAgbG9uZyBuZWVkZWQgPSBuZWVkW2ldOwotICAgICAgCi0gICAgICBpZiAobmVlZGVkKQotCW5lZWRlZCA9ICgobmVlZGVkIC0gcGFnZV9hZGRyKSB8IDB4MzAwMCkgJiAweGZmZmY7Ci0gIAotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JWx4XG4iLCBBU01fU0hPUlQsIG5lZWRlZCk7Ci0gICAgfQotICAKLSAgLyogQW5kIHBhZGRpbmcgKi8KLSAgaWYgKG9uX3BhZ2UgJiAxKQotICAgIGZwcmludGYgKGYsICJcdCVzXHQweCV4XG4iLCBBU01fU0hPUlQsIDAgfCAweDAwMDApOwotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2RlZl9maWxlICgpCi17Ci0gIGludCBpOwotICBleHBvcnRfdHlwZSAqZXhwOwotCi0gIGluZm9ybSAoXygiQWRkaW5nIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiKSk7Ci0gIAotICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiOyIpOwotICBmb3IgKGkgPSAwOyBvYXZbaV07IGkrKykKLSAgICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiICVzIiwgb2F2W2ldKTsKLQotICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiXG5FWFBPUlRTXG4iKTsKLQotICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0gICAgewotICAgICAgY2hhciAqcXVvdGUgPSBzdHJjaHIgKGV4cC0+bmFtZSwgJy4nKSA/ICJcIiIgOiAiIjsKLSAgICAgIGNoYXIgKnJlcyA9IGNwbHVzX2RlbWFuZ2xlIChleHAtPmludGVybmFsX25hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLQotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5uYW1lLCBleHAtPmludGVybmFsX25hbWUpID09IDApCi0gICAgICAgIHsKLQotCSAgZnByaW50ZiAob3V0cHV0X2RlZiwgIlx0JXMlcyVzIEAgJWQlcyVzIDsgJXNcbiIsCi0JCSAgIHF1b3RlLAotCQkgICBleHAtPm5hbWUsCi0JCSAgIHF1b3RlLAotCQkgICBleHAtPm9yZGluYWwsCi0JCSAgIGV4cC0+bm9uYW1lID8gIiBOT05BTUUiIDogIiIsCi0JCSAgIGV4cC0+ZGF0YSA/ICIgREFUQSIgOiAiIiwKLQkJICAgcmVzID8gcmVzIDogIiIpOwotCX0KLSAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyICpxdW90ZTEgPSBzdHJjaHIgKGV4cC0+aW50ZXJuYWxfbmFtZSwgJy4nKSA/ICJcIiIgOiAiIjsKLQkgIC8qIGNoYXIgKmFsaWFzID0gICovCi0JICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiXHQlcyVzJXMgPSAlcyVzJXMgQCAlZCVzJXMgOyAlc1xuIiwKLQkJICAgcXVvdGUsCi0JCSAgIGV4cC0+bmFtZSwKLQkJICAgcXVvdGUsCi0JCSAgIHF1b3RlMSwKLQkJICAgZXhwLT5pbnRlcm5hbF9uYW1lLAotCQkgICBxdW90ZTEsCi0JCSAgIGV4cC0+b3JkaW5hbCwKLQkJICAgZXhwLT5ub25hbWUgPyAiIE5PTkFNRSIgOiAiIiwKLQkJICAgZXhwLT5kYXRhID8gIiBEQVRBIiA6ICIiLAotCQkgICByZXMgPyByZXMgOiAiIik7Ci0JfQotICAgICAgaWYgKHJlcykKLSAgICAgICAgZnJlZSAocmVzKTsKLSAgICB9Ci0gIAotICBpbmZvcm0gKF8oIkFkZGVkIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiKSk7Ci19Ci0KLS8qIGdlbmVyYXRlX2lkYXRhX29maWxlIGdlbmVyYXRlcyB0aGUgcG9ydGFibGUgYXNzZW1ibHkgc291cmNlIGNvZGUKLSAgIGZvciB0aGUgaWRhdGEgc2VjdGlvbnMuICBJdCBhcHBlbmRzIHRoZSBzb3VyY2UgY29kZSB0byB0aGUgZW5kIG9mCi0gICB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9pZGF0YV9vZmlsZSAoZmlsdmFyKQotICAgICBGSUxFICpmaWx2YXI7Ci17Ci0gIGloZWFkdHlwZSAqaGVhZHB0cjsKLSAgaWZ1bmN0eXBlICpmdW5jcHRyOwotICBpbnQgICAgICAgIGhlYWRpbmRleDsKLSAgaW50ICAgICAgICBmdW5jaW5kZXg7Ci0gIGludAkgICAgIG5oZWFkczsKLQotICBpZiAoaW1wb3J0X2xpc3QgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiJXMgSW1wb3J0IGRhdGEgc2VjdGlvbnNcbiIsIEFTTV9DKTsKLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkMlxuIik7Ci0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdGRvaV9pZGF0YVxuIiwgQVNNX0dMT0JBTCk7Ci0gIGZwcmludGYgKGZpbHZhciwgImRvaV9pZGF0YTpcbiIpOwotCi0gIG5oZWFkcyA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNsaXN0b25lJWQlc1x0JXMgJXNcbiIsCi0JICAgICAgIEFTTV9SVkFfQkVGT1JFLCBuaGVhZHMsIEFTTV9SVkFfQUZURVIsCi0JICAgICAgIEFTTV9DLCBoZWFkcHRyLT5kbGxuYW1lKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNkbGxuYW1lJWQlc1xuIiwKLQkgICAgICAgQVNNX1JWQV9CRUZPUkUsIG5oZWFkcywgQVNNX1JWQV9BRlRFUik7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJcdCVzbGlzdHR3byVkJXNcblxuIiwKLQkgICAgICAgQVNNX1JWQV9CRUZPUkUsIG5oZWFkcywgQVNNX1JWQV9BRlRFUik7Ci0gICAgICBuaGVhZHMrKzsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBOVUxMIHJlY29yZCBhdCAqLwotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIGVuZCBvZiBpZGF0YSQyICovCi0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogc2VjdGlvbiAgICAgICAgKi8KLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkNFxuIik7Ci0gIGhlYWRpbmRleCA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgImxpc3RvbmUlZDpcbiIsIGhlYWRpbmRleCk7Ci0gICAgICBmb3IgKCBmdW5jaW5kZXggPSAwOyBmdW5jaW5kZXggPCBoZWFkcHRyLT5uZnVuY3M7IGZ1bmNpbmRleCsrICkKLQlmcHJpbnRmIChmaWx2YXIsICJcdCVzZnVuY3B0ciVkXyVkJXNcbiIsCi0JCSBBU01fUlZBX0JFRk9SRSwgaGVhZGluZGV4LCBmdW5jaW5kZXgsIEFTTV9SVkFfQUZURVIpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIE5VTEwgdGVybWluYXRpbmcgbGlzdCAqLwotICAgICAgaGVhZGluZGV4Kys7Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbHZhciwgIlxuXHQuc2VjdGlvblx0LmlkYXRhJDVcbiIpOwotICBoZWFkaW5kZXggPSAwOwotICBmb3IgKGhlYWRwdHIgPSBpbXBvcnRfbGlzdDsgaGVhZHB0ciAhPSBOVUxMOyBoZWFkcHRyID0gaGVhZHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJsaXN0dHdvJWQ6XG4iLCBoZWFkaW5kZXgpOwotICAgICAgZm9yICggZnVuY2luZGV4ID0gMDsgZnVuY2luZGV4IDwgaGVhZHB0ci0+bmZ1bmNzOyBmdW5jaW5kZXgrKyApCi0JZnByaW50ZiAoZmlsdmFyLCAiXHQlc2Z1bmNwdHIlZF8lZCVzXG4iLAotCQkgQVNNX1JWQV9CRUZPUkUsIGhlYWRpbmRleCwgZnVuY2luZGV4LCBBU01fUlZBX0FGVEVSKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogTlVMTCB0ZXJtaW5hdGluZyBsaXN0ICovCi0gICAgICBoZWFkaW5kZXgrKzsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkNlxuIik7Ci0gIGhlYWRpbmRleCA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZ1bmNpbmRleCA9IDA7Ci0gICAgICBmb3IgKGZ1bmNwdHIgPSBoZWFkcHRyLT5mdW5jaGVhZDsgZnVuY3B0ciAhPSBOVUxMOwotCSAgIGZ1bmNwdHIgPSBmdW5jcHRyLT5uZXh0KQotCXsKLQkgIGZwcmludGYgKGZpbHZhciwiZnVuY3B0ciVkXyVkOlxuIiwgaGVhZGluZGV4LCBmdW5jaW5kZXgpOwotCSAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQlZFxuIiwgQVNNX1NIT1JULAotCQkgICAoKGZ1bmNwdHItPm9yZCkgJiAweEZGRkYpKTsKLQkgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0XCIlc1wiXG4iLCBBU01fVEVYVCwgZnVuY3B0ci0+bmFtZSk7Ci0JICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdDBcbiIsIEFTTV9CWVRFKTsKLQkgIGZ1bmNpbmRleCsrOwotCX0KLSAgICAgIGhlYWRpbmRleCsrOwotICAgIH0KLQotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ3XG4iKTsKLSAgaGVhZGluZGV4ID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsdmFyLCJkbGxuYW1lJWQ6XG4iLCBoZWFkaW5kZXgpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHRcIiVzXCJcbiIsIEFTTV9URVhULCBoZWFkcHRyLT5kbGxuYW1lKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0MFxuIiwgQVNNX0JZVEUpOwotICAgICAgaGVhZGluZGV4Kys7Ci0gICAgfQotfQotCi0vKiBBc3NlbWJsZSB0aGUgc3BlY2lmaWVkIGZpbGUuICovCi1zdGF0aWMgdm9pZAotYXNzZW1ibGVfZmlsZSAoc291cmNlLCBkZXN0KQotICAgICBjb25zdCBjaGFyICogc291cmNlOwotICAgICBjb25zdCBjaGFyICogZGVzdDsKLXsKLSAgY2hhciAqIGNtZDsKLSAgCi0gIGNtZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChBU01fU1dJVENIRVMpICsgc3RybGVuIChhc19mbGFncykKLQkJCSArIHN0cmxlbiAoc291cmNlKSArIHN0cmxlbiAoZGVzdCkgKyA1MCk7Ci0KLSAgc3ByaW50ZiAoY21kLCAiJXMgJXMgLW8gJXMgJXMiLCBBU01fU1dJVENIRVMsIGFzX2ZsYWdzLCBkZXN0LCBzb3VyY2UpOwotCi0gIHJ1biAoYXNfbmFtZSwgY21kKTsKLX0KLQotc3RhdGljIHZvaWQKLWdlbl9leHBfZmlsZSAoKQotewotICBGSUxFICpmOwotICBpbnQgaTsKLSAgZXhwb3J0X3R5cGUgKmV4cDsKLSAgZGxpc3RfdHlwZSAqZGw7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJHZW5lcmF0aW5nIGV4cG9ydCBmaWxlOiAlc1xuIiksIGV4cF9uYW1lKTsKLSAgCi0gIGYgPSBmb3BlbiAoVE1QX0FTTSwgRk9QRU5fV1QpOwotICBpZiAoIWYpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlOiAlcyIpLCBUTVBfQVNNKTsKLSAgCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiT3BlbmVkIHRlbXBvcmFyeSBmaWxlOiAlcyIpLCBUTVBfQVNNKTsKLQotICBkdW1wX2RlZl9pbmZvIChmKTsKLSAgCi0gIGlmIChkX2V4cG9ydHMpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmVkYXRhXG5cbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXMJMAklcyBBbGx3YXlzIDBcbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwkweCVseAklcyBUaW1lIGFuZCBkYXRlXG4iLCBBU01fTE9ORywgKGxvbmcpIHRpbWUoMCksCi0JICAgICAgIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCTAJJXMgTWFqb3IgYW5kIE1pbm9yIHZlcnNpb25cbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc25hbWUlcwklcyBQdHIgdG8gbmFtZSBvZiBkbGxcbiIsIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwklZAklcyBTdGFydGluZyBvcmRpbmFsIG9mIGV4cG9ydHNcbiIsIEFTTV9MT05HLCBkX2xvd19vcmQsIEFTTV9DKTsKLQotCi0gICAgICBmcHJpbnRmIChmLCAiXHQlcwklZAklcyBOdW1iZXIgb2YgZnVuY3Rpb25zXG4iLCBBU01fTE9ORywgZF9oaWdoX29yZCAtIGRfbG93X29yZCArIDEsIEFTTV9DKTsKLSAgICAgIGZwcmludGYoZiwiXHQlcyBuYW1lZCBmdW5jcyAlZCwgbG93IG9yZCAlZCwgaGlnaCBvcmQgJWRcbiIsCi0JICAgICAgQVNNX0MsCi0JICAgICAgZF9uYW1lZF9uZnVuY3MsIGRfbG93X29yZCwgZF9oaWdoX29yZCk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwklZAklcyBOdW1iZXIgb2YgbmFtZXNcbiIsIEFTTV9MT05HLAotCSAgICAgICBzaG93X2FsbG5hbWVzID8gZF9oaWdoX29yZCAtIGRfbG93X29yZCArIDEgOiBkX25hbWVkX25mdW5jcywgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNhZnVuY3MlcyAgJXMgQWRkcmVzcyBvZiBmdW5jdGlvbnNcbiIsIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzYW5hbWVzJXMJJXMgQWRkcmVzcyBvZiBOYW1lIFBvaW50ZXIgVGFibGVcbiIsCi0JICAgICAgIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzYW5vcmRzJXMJJXMgQWRkcmVzcyBvZiBvcmRpbmFsc1xuIiwgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICAgICAgZnByaW50ZiAoZiwgIm5hbWU6CSVzCVwiJXNcIlxuIiwgQVNNX1RFWFQsIGRsbF9uYW1lKTsKLQotCi0gICAgICBmcHJpbnRmKGYsIiVzIEV4cG9ydCBhZGRyZXNzIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmKGYsIlx0JXNcbiIsIEFTTV9BTElHTl9MT05HKTsKLSAgICAgIGZwcmludGYgKGYsICJhZnVuY3M6XG4iKTsKLSAgICAgIGkgPSBkX2xvd19vcmQ7Ci0KLSAgICAgIGZvciAoZXhwID0gZF9leHBvcnRzOyBleHA7IGV4cCA9IGV4cC0+bmV4dCkKLQl7Ci0JICBpZiAoZXhwLT5vcmRpbmFsICE9IGkpCi0JICAgIHsKLSNpZiAwCi0JICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdCVkXHQlcyAlZC4uJWQgbWlzc2luZ1xuIiwKLQkJICAgICAgIEFTTV9TUEFDRSwKLQkJICAgICAgIChleHAtPm9yZGluYWwgLSBpKSAqIDQsCi0JCSAgICAgICBBU01fQywKLQkJICAgICAgIGksIGV4cC0+b3JkaW5hbCAtIDEpOwotCSAgICAgIGkgPSBleHAtPm9yZGluYWw7Ci0jZW5kaWYKLQkgICAgICB3aGlsZSAoaSA8IGV4cC0+b3JkaW5hbCkKLQkJewotCQkgIGZwcmludGYoZiwiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotCQkgIGkrKzsKLQkJfQotCSAgICB9Ci0JICBmcHJpbnRmIChmLCAiXHQlcyVzJXMlc1x0JXMgJWRcbiIsIEFTTV9SVkFfQkVGT1JFLAotICAgICAgICAgICAgICAgICAgIEFTTV9QUkVGSVgsCi0gICAgICAgICAgICAgICAgICAgZXhwLT5pbnRlcm5hbF9uYW1lLCBBU01fUlZBX0FGVEVSLCBBU01fQywgZXhwLT5vcmRpbmFsKTsKLQkgIGkrKzsKLQl9Ci0KLSAgICAgIGZwcmludGYgKGYsIiVzIEV4cG9ydCBOYW1lIFBvaW50ZXIgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJhbmFtZXM6XG4iKTsKLQotICAgICAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCi0JewotCSAgaWYgKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCSAgICBmcHJpbnRmIChmLCAiXHQlc24lZCVzXG4iLAotCQkgICAgIEFTTV9SVkFfQkVGT1JFLCBleHAtPm9yZGluYWwsIEFTTV9SVkFfQUZURVIpOwotCX0KLQotICAgICAgZnByaW50ZiAoZiwiJXMgRXhwb3J0IE9yaWRpbmFsIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiYW5vcmRzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyAoZXhwID0gZF9leHBvcnRzX2xleGljYWxseVtpXSk7IGkrKykKLQl7Ci0JICBpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICAgIGZwcmludGYgKGYsICJcdCVzCSVkXG4iLCBBU01fU0hPUlQsIGV4cC0+b3JkaW5hbCAtIGRfbG93X29yZCk7Ci0JfQotCi0gICAgICBmcHJpbnRmKGYsIiVzIEV4cG9ydCBOYW1lIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmb3IgKGkgPSAwOyAoZXhwID0gZF9leHBvcnRzX2xleGljYWxseVtpXSk7IGkrKykKLQlpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICBmcHJpbnRmIChmLCAibiVkOgklcwlcIiVzXCJcbiIsCi0JCSAgIGV4cC0+b3JkaW5hbCwgQVNNX1RFWFQsIGV4cC0+bmFtZSk7Ci0KLSAgICAgIGlmIChhX2xpc3QpCi0JewotCSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24gJXNcbiIsIERSRUNUVkVfU0VDVElPTl9OQU1FKTsKLQkgIGZvciAoZGwgPSBhX2xpc3Q7IGRsOyBkbCA9IGRsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIGRsLT50ZXh0KTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgaWYgKGRfbGlzdCkKLQl7Ci0JICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbiAucmRhdGFcbiIpOwotCSAgZm9yIChkbCA9IGRfbGlzdDsgZGw7IGRsID0gZGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBjaGFyICpwOwotCSAgICAgIGludCBsOwotCSAgICAgIAotCSAgICAgIC8qIFdlIGRvbid0IG91dHB1dCBhcyBhc2NpaSBiZWNhdXNlIHRoZXJlIGNhbgotCSAgICAgICAgIGJlIHF1b3RlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZy4gICovCi0JICAgICAgbCA9IDA7Ci0JICAgICAgZm9yIChwID0gZGwtPnRleHQ7ICpwOyBwKyspCi0JCXsKLQkJICBpZiAobCA9PSAwKQotCQkgICAgZnByaW50ZiAoZiwgIlx0JXNcdCIsIEFTTV9CWVRFKTsKLQkJICBlbHNlCi0JCSAgICBmcHJpbnRmIChmLCAiLCIpOwotCQkgIGZwcmludGYgKGYsICIlZCIsICpwKTsKLQkJICBpZiAocFsxXSA9PSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmLCAiLDBcbiIpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpZiAoKytsID09IDEwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChmLCAiXG4iKTsKLQkJICAgICAgbCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLQotICAvKiBBZGQgdG8gdGhlIG91dHB1dCBmaWxlIGEgd2F5IG9mIGdldHRpbmcgdG8gdGhlIGV4cG9ydGVkIG5hbWVzCi0gICAgIHdpdGhvdXQgdXNpbmcgdGhlIGltcG9ydCBsaWJyYXJ5LiAgKi8KLSAgaWYgKGFkZF9pbmRpcmVjdCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LnJkYXRhXG4iKTsKLSAgICAgIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLQlpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICB7Ci0JICAgIC8qIFdlIHVzZSBhIHNpbmdsZSB1bmRlcnNjb3JlIGZvciBNUyBjb21wYXRpYmlsaXR5LCBhbmQgYQotICAgICAgICAgICAgICAgZG91YmxlIHVuZGVyc2NvcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQKLSAgICAgICAgICAgICAgIGN5Z3dpbiByZWxlYXNlcy4gICovCi0JICAgIGlmIChjcmVhdGVfY29tcGF0X2ltcGxpYikKLQkgICAgICBmcHJpbnRmIChmLCAiXHQlc1x0X19pbXBfJXNcbiIsIEFTTV9HTE9CQUwsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJcdCVzXHRfaW1wX18lc1xuIiwgQVNNX0dMT0JBTCwgZXhwLT5uYW1lKTsKLQkgICAgaWYgKGNyZWF0ZV9jb21wYXRfaW1wbGliKQotCSAgICAgIGZwcmludGYgKGYsICJfX2ltcF8lczpcbiIsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJfaW1wX18lczpcbiIsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJcdCVzXHQlc1xuIiwgQVNNX0xPTkcsIGV4cC0+bmFtZSk7Ci0JICB9Ci0gICAgfQotCi0gIC8qIER1bXAgdGhlIHJlbG9jIHNlY3Rpb24gaWYgYSBiYXNlIGZpbGUgaXMgcHJvdmlkZWQgKi8KLSAgaWYgKGJhc2VfZmlsZSkKLSAgICB7Ci0gICAgICBpbnQgYWRkcjsKLSAgICAgIGxvbmcgbmVlZFtQQUdFX1NJWkVdOwotICAgICAgbG9uZyBwYWdlX2FkZHI7Ci0gICAgICBpbnQgbnVtYnl0ZXM7Ci0gICAgICBpbnQgbnVtX2VudHJpZXM7Ci0gICAgICBsb25nICpjb3B5OwotICAgICAgaW50IGo7Ci0gICAgICBpbnQgb25fcGFnZTsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaW5pdFxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAibGFiOlxuIik7Ci0KLSAgICAgIGZzZWVrIChiYXNlX2ZpbGUsIDAsIFNFRUtfRU5EKTsKLSAgICAgIG51bWJ5dGVzID0gZnRlbGwgKGJhc2VfZmlsZSk7Ci0gICAgICBmc2VlayAoYmFzZV9maWxlLCAwLCBTRUVLX1NFVCk7Ci0gICAgICBjb3B5ID0geG1hbGxvYyAobnVtYnl0ZXMpOwotICAgICAgZnJlYWQgKGNvcHksIDEsIG51bWJ5dGVzLCBiYXNlX2ZpbGUpOwotICAgICAgbnVtX2VudHJpZXMgPSBudW1ieXRlcyAvIHNpemVvZiAobG9uZyk7Ci0KLQotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5yZWxvY1xuIik7Ci0gICAgICBpZiAobnVtX2VudHJpZXMpCi0JewotCSAgaW50IHNyYzsKLQkgIGludCBkc3QgPSAwOwotCSAgaW50IGxhc3QgPSAtMTsKLQkgIHFzb3J0IChjb3B5LCBudW1fZW50cmllcywgc2l6ZW9mIChsb25nKSwgc2Z1bmMpOwotCSAgLyogRGVsZXRlIGR1cGxjYXRlcyAqLwotCSAgZm9yIChzcmMgPSAwOyBzcmMgPCBudW1fZW50cmllczsgc3JjKyspCi0JICAgIHsKLQkgICAgICBpZiAobGFzdCAhPSBjb3B5W3NyY10pCi0JCWxhc3QgPSBjb3B5W2RzdCsrXSA9IGNvcHlbc3JjXTsKLQkgICAgfQotCSAgbnVtX2VudHJpZXMgPSBkc3Q7Ci0JICBhZGRyID0gY29weVswXTsKLQkgIHBhZ2VfYWRkciA9IGFkZHIgJiBQQUdFX01BU0s7CQkvKiB3b3JrIG91dCB0aGUgcGFnZSBhZGRyICovCi0JICBvbl9wYWdlID0gMDsKLQkgIGZvciAoaiA9IDA7IGogPCBudW1fZW50cmllczsgaisrKQotCSAgICB7Ci0JICAgICAgYWRkciA9IGNvcHlbal07Ci0JICAgICAgaWYgKChhZGRyICYgUEFHRV9NQVNLKSAhPSBwYWdlX2FkZHIpCi0JCXsKLQkJICBmbHVzaF9wYWdlIChmLCBuZWVkLCBwYWdlX2FkZHIsIG9uX3BhZ2UpOwotCQkgIG9uX3BhZ2UgPSAwOwotCQkgIHBhZ2VfYWRkciA9IGFkZHIgJiBQQUdFX01BU0s7Ci0JCX0KLQkgICAgICBuZWVkW29uX3BhZ2UrK10gPSBhZGRyOwotCSAgICB9Ci0JICBmbHVzaF9wYWdlIChmLCBuZWVkLCBwYWdlX2FkZHIsIG9uX3BhZ2UpOwotCi0vKgkgIGZwcmludGYgKGYsICJcdCVzXHQwLDBcdCVzIEVuZFxuIiwgQVNNX0xPTkcsIEFTTV9DKTsqLwotCX0KLSAgICB9Ci0KLSAgZ2VuZXJhdGVfaWRhdGFfb2ZpbGUgKGYpOwotCi0gIGZjbG9zZSAoZik7Ci0KLSAgLyogYXNzZW1ibGUgdGhlIGZpbGUgKi8KLSAgYXNzZW1ibGVfZmlsZSAoVE1QX0FTTSwgZXhwX25hbWUpOwotCi0gIGlmIChkb250ZGVsdGVtcHMgPT0gMCkKLSAgICB1bmxpbmsgKFRNUF9BU00pOwotICAKLSAgaW5mb3JtIChfKCJHZW5lcmF0ZWQgZXhwb3J0cyBmaWxlIikpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi14bGF0ZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGFkZF91bmRlcnNjb3JlKQotICAgIHsKLSAgICAgIGNoYXIgKmNvcHkgPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMik7Ci0gICAgICBjb3B5WzBdID0gJ18nOwotICAgICAgc3RyY3B5IChjb3B5ICsgMSwgbmFtZSk7Ci0gICAgICBuYW1lID0gY29weTsKLSAgICB9Ci0KLSAgaWYgKGtpbGxhdCkKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgcCA9IHN0cmNociAobmFtZSwgJ0AnKTsKLSAgICAgIGlmIChwKQotCSpwID0gMDsKLSAgICB9Ci0gIHJldHVybiBuYW1lOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIDAKLQotc3RhdGljIHZvaWQKLWR1bXBfaWF0IChmLCBleHApCi0gICAgIEZJTEUgKmY7Ci0gICAgIGV4cG9ydF90eXBlICpleHA7Ci17Ci0gIGlmIChleHAtPm5vbmFtZSAmJiAhc2hvd19hbGxuYW1lcyApCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JTA4eFxuIiwKLQkgICAgICAgQVNNX0xPTkcsCi0JICAgICAgIGV4cC0+b3JkaW5hbCB8IDB4ODAwMDAwMDApOyAvKiBoaW50IG9yIG9yaW5kYWwgPz8gKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc0lEJWQlc1xuIiwgQVNNX1JWQV9CRUZPUkUsCi0JICAgICAgIGV4cC0+b3JkaW5hbCwKLQkgICAgICAgQVNNX1JWQV9BRlRFUik7Ci0gICAgfQotfQotCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IGlkOwotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgZmxhZ3M7Ci0gIGludCBhbGlnbjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYXN5bWJvbCAqc3ltOwotICBhc3ltYm9sICoqc3ltcHA7Ci0gIGludCBzaXplOwotICB1bnNpZ25lZCAgIGNoYXIgKmRhdGE7Ci19IHNpbmZvOwotCi0jaWZuZGVmIERMTFRPT0xfUFBDCi0KLSNkZWZpbmUgVEVYVCAwCi0jZGVmaW5lIERBVEEgMQotI2RlZmluZSBCU1MgMgotI2RlZmluZSBJREFUQTcgMwotI2RlZmluZSBJREFUQTUgNAotI2RlZmluZSBJREFUQTQgNQotI2RlZmluZSBJREFUQTYgNgotCi0jZGVmaW5lIE5TRUNTIDcKLQotI2RlZmluZSBJTklUX1NFQ19EQVRBKGlkLCBuYW1lLCBmbGFncywgYWxpZ24pIHsgaWQsIG5hbWUsIGZsYWdzLCBhbGlnbiwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgTlVMTCB9Ci1zdGF0aWMgc2luZm8gc2VjZGF0YVtOU0VDU10gPQotewotICBJTklUX1NFQ19EQVRBIChURVhULCAgICIudGV4dCIsICAgIFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUywgMiksCi0gIElOSVRfU0VDX0RBVEEgKERBVEEsICAgIi5kYXRhIiwgICAgU0VDX0RBVEEsICAgICAgICAgICAgICAgICAgICAyKSwKLSAgSU5JVF9TRUNfREFUQSAoQlNTLCAgICAiLmJzcyIsICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpLAotICBJTklUX1NFQ19EQVRBIChJREFUQTcsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMiksCi0gIElOSVRfU0VDX0RBVEEgKElEQVRBNSwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyKSwKLSAgSU5JVF9TRUNfREFUQSAoSURBVEE0LCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDIpLAotICBJTklUX1NFQ19EQVRBIChJREFUQTYsICIuaWRhdGEkNiIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMSkKLX07Ci0KLSNlbHNlCi0KLS8qIFNlY3Rpb25zIG51bWJlcmVkIHRvIG1ha2UgdGhlIG9yZGVyIHRoZSBzYW1lIGFzIG90aGVyIFBvd2VyUEMgTlQgICAgKi8KLS8qIGNvbXBpbGVycy4gVGhpcyBhbHNvIGtlZXBzIGZ1bm55IGFsaWdubWVudCB0aGluZ2llcyBmcm9tIGhhcHBlbmluZy4gKi8KLSNkZWZpbmUgVEVYVCAgIDAKLSNkZWZpbmUgUERBVEEgIDEKLSNkZWZpbmUgUkRBVEEgIDIKLSNkZWZpbmUgSURBVEE1IDMKLSNkZWZpbmUgSURBVEE0IDQKLSNkZWZpbmUgSURBVEE2IDUKLSNkZWZpbmUgSURBVEE3IDYKLSNkZWZpbmUgREFUQSAgIDcKLSNkZWZpbmUgQlNTICAgIDgKLQotI2RlZmluZSBOU0VDUyA5Ci0KLXN0YXRpYyBzaW5mbyBzZWNkYXRhW05TRUNTXSA9Ci17Ci0gIHsgVEVYVCwgICAiLnRleHQiLCAgICBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMsIDN9LAotICB7IFBEQVRBLCAgIi5wZGF0YSIsICAgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBSREFUQSwgICIucmVsZGF0YSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE1LCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTYsICIuaWRhdGEkNiIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMX0sCi0gIHsgSURBVEE3LCAiLmlkYXRhJDciLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IERBVEEsICAgIi5kYXRhIiwgICAgU0VDX0RBVEEsICAgICAgICAgICAgICAgICAgICAyfSwKLSAgeyBCU1MsICAgICIuYnNzIiwgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgMn0KLX07Ci0KLSNlbmRpZgotCi0vKgotVGhpcyBpcyB3aGF0IHdlJ3JlIHRyeWluZyB0byBtYWtlLiAgV2UgZ2VuZXJhdGUgdGhlIGltcCBzeW1ib2xzIHdpdGgKLWJvdGggc2luZ2xlIGFuZCBkb3VibGUgdW5kZXJzY29yZXMsIGZvciBjb21wYXRpYmlsaXR5LgotCi0JLnRleHQKLQkuZ2xvYmFsCV9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4Ci0JLmdsb2JhbAlfX2ltcF9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4Ci1fR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVdAODoKLQlqbXAgKglfX2ltcF9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4Ci0JLnNlY3Rpb24JLmlkYXRhJDcJIyBUbyBmb3JjZSBsb2FkaW5nIG9mIGhlYWQKLQkubG9uZwlfX3ZlcnNpb25fYV9oZWFkCi0jIEltcG9ydCBBZGRyZXNzIFRhYmxlCi0JLnNlY3Rpb24JLmlkYXRhJDUKLV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDg6Ci0JLnJ2YQlJRDIKLQotIyBJbXBvcnQgTG9va3VwIFRhYmxlCi0JLnNlY3Rpb24JLmlkYXRhJDQKLQkucnZhCUlEMgotIyBIaW50L05hbWUgdGFibGUKLQkuc2VjdGlvbgkuaWRhdGEkNgotSUQyOgkuc2hvcnQJMgotCS5hc2NpegkiR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVciCi0KLQotRm9yIHRoZSBQb3dlclBDLCBoZXJlJ3MgdGhlIHZhcmlhdGlvbiBvbiB0aGUgYWJvdmUgc2NoZW1lOgotCi0jIFJhdGhlciB0aGFuIGEgc2ltcGxlICJqbXAgKiIsIHRoZSBjb2RlIHRvIGdldCB0byB0aGUgZGxsIGZ1bmN0aW9uCi0jIGxvb2tzIGxpa2U6Ci0gICAgICAgICAudGV4dAotICAgICAgICAgbHd6CXIxMSxbdG9jdl1fX2ltcF9mdW5jdGlvbl9uYW1lKHIyKQotIwkJICAgUkVMT0M6IDAwMDAwMDAwIFRPQ1JFTDE2LFRPQ0RFRk4gX19pbXBfZnVuY3Rpb25fbmFtZQotICAgICAgICAgbHd6CXIxMiwwKHIxMSkKLQkgc3R3CXIyLDQocjEpCi0JIG10Y3RyCXIxMgotCSBsd3oJcjIsNChyMTEpCi0JIGJjdHIKLSovCi0KLXN0YXRpYyBjaGFyICoKLW1ha2VfbGFiZWwgKHByZWZpeCwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcHJlZml4OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbGVuID0gc3RybGVuIChBU01fUFJFRklYKSArIHN0cmxlbiAocHJlZml4KSArIHN0cmxlbiAobmFtZSk7Ci0gIGNoYXIgKmNvcHkgPSB4bWFsbG9jIChsZW4gKzEgKTsKLSAgc3RyY3B5IChjb3B5LCBBU01fUFJFRklYKTsKLSAgc3RyY2F0IChjb3B5LCBwcmVmaXgpOwotICBzdHJjYXQgKGNvcHksIG5hbWUpOwotICByZXR1cm4gY29weTsKLX0KLQotc3RhdGljIGJmZCAqCi1tYWtlX29uZV9saWJfZmlsZSAoZXhwLCBpKQotICAgICBleHBvcnRfdHlwZSAqZXhwOwotICAgICBpbnQgaTsKLXsKLSNpZiAwCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIEZJTEUgKmY7Ci0gICAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiZCI7Ci0gICAgICBjaGFyICpkZXN0OwotCi0gICAgICBuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHByZWZpeCkgKyAxMCk7Ci0gICAgICBzcHJpbnRmIChuYW1lLCAiJXNzJTA1ZC5zIiwgcHJlZml4LCBpKTsKLSAgICAgIGYgPSBmb3BlbiAobmFtZSwgRk9QRU5fV1QpOwotICAgICAgZnByaW50ZiAoZiwgIlx0LnRleHRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdCVzJXNcbiIsIEFTTV9HTE9CQUwsIEFTTV9QUkVGSVgsIGV4cC0+bmFtZSk7Ci0gICAgICBpZiAoY3JlYXRlX2NvbXBhdF9pbXBsaWIpCi0JZnByaW50ZiAoZiwgIlx0JXNcdF9faW1wXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9pbXBfXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotICAgICAgaWYgKGNyZWF0ZV9jb21wYXRfaW1wbGliKQotCWZwcmludGYgKGYsICIlcyVzOlxuXHQlc1x0X19pbXBfJXNcbiIsIEFTTV9QUkVGSVgsCi0JCSBleHAtPm5hbWUsIEFTTV9KVU1QLCBleHAtPm5hbWUpOwotCi0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LmlkYXRhJDdcdCVzIFRvIGZvcmNlIGxvYWRpbmcgb2YgaGVhZFxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdCVzXG4iLCBBU01fTE9ORywgaGVhZF9sYWJlbCk7Ci0KLQotICAgICAgZnByaW50ZiAoZiwiJXMgSW1wb3J0IEFkZHJlc3MgVGFibGVcbiIsIEFTTV9DKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDVcbiIpOwotICAgICAgaWYgKGNyZWF0ZV9jb21wYXRfaW1wbGliKQotCWZwcmludGYgKGYsICJfX2ltcF8lczpcbiIsIGV4cC0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChmLCAiX2ltcF9fJXM6XG4iLCBleHAtPm5hbWUpOwotCi0gICAgICBkdW1wX2lhdCAoZiwgZXhwKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlxuJXMgSW1wb3J0IExvb2t1cCBUYWJsZVxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotCi0gICAgICBkdW1wX2lhdCAoZiwgZXhwKTsKLQotICAgICAgaWYoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JewotCSAgZnByaW50ZiAoZiwgIiVzIEhpbnQvTmFtZSB0YWJsZVxuIiwgQVNNX0MpOwotCSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDZcbiIpOwotCSAgZnByaW50ZiAoZiwgIklEJWQ6XHQlc1x0JWRcbiIsIGV4cC0+b3JkaW5hbCwgQVNNX1NIT1JULCBleHAtPmhpbnQpOwotCSAgZnByaW50ZiAoZiwgIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIHhsYXRlIChleHAtPm5hbWUpKTsKLQl9Ci0KLSAgICAgIGZjbG9zZSAoZik7Ci0KLSAgICAgIGRlc3QgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAocHJlZml4KSArIDEwKTsKLSAgICAgIHNwcmludGYgKGRlc3QsICIlc3MlMDVkLm8iLCBwcmVmaXgsIGkpOwotICAgICAgYXNzZW1ibGVfZmlsZSAobmFtZSwgZGVzdCk7Ci0gICAgfQotI2Vsc2UgLyogaWYgMCAqLwotICAgIHsKLSAgICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgIGFzeW1ib2wgKiAgZXhwX2xhYmVsOwotICAgICAgYXN5bWJvbCAqICBpbmFtZTsKLSAgICAgIGFzeW1ib2wgKiAgaW5hbWUyOwotICAgICAgYXN5bWJvbCAqICBpbmFtZV9sYWI7Ci0gICAgICBhc3ltYm9sICoqIGluYW1lX2xhYl9wcDsKLSAgICAgIGFzeW1ib2wgKiogaW5hbWVfcHA7Ci0jaWZkZWYgRExMVE9PTF9QUEMKLSAgICAgIGFzeW1ib2wgKiogZm5fcHA7Ci0gICAgICBhc3ltYm9sICoqIHRvY19wcDsKLSNkZWZpbmUgRVhUUkEJIDIKLSNlbmRpZgotI2lmbmRlZiBFWFRSQQotI2RlZmluZSBFWFRSQSAgICAwCi0jZW5kaWYKLSAgICAgIGFzeW1ib2wgKiAgcHRyc1tOU0VDUyArIDQgKyBFWFRSQSArIDFdOwotCi0gICAgICBjaGFyICogICAgIG91dG5hbWUgPSB4bWFsbG9jICgxMCk7Ci0gICAgICBpbnQgICAgICAgIG9pZHggPSAwOwotCi0gICAgICAKLSAgICAgIHNwcmludGYgKG91dG5hbWUsICIlcyUwNWQubyIsIFRNUF9TVFVCLCBpKTsKLSAgICAgIAotICAgICAgYWJmZCA9IGJmZF9vcGVudyAob3V0bmFtZSwgSE9XX0JGRF9XUklURV9UQVJHRVQpOwotICAgICAgCi0gICAgICBpZiAoIWFiZmQpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmYXRhbCAoXygiYmZkX29wZW4gZmFpbGVkIG9wZW4gc3R1YiBmaWxlOiAlcyIpLCBvdXRuYW1lKTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGluZm9ybSAoXygiQ3JlYXRpbmcgc3R1YiBmaWxlOiAlcyIpLCBvdXRuYW1lKTsKLSAgICAgIAotICAgICAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICAgICAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIEhPV19CRkRfQVJDSCwgMCk7Ci0KLSNpZmRlZiBETExUT09MX0FSTQotICAgICAgaWYgKG1hY2hpbmUgPT0gTUFSTV9JTlRFUldPUksgfHwgbWFjaGluZSA9PSBNVEhVTUIpCi0JYmZkX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBGX0lOVEVSV09SSyk7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgLyogRmlyc3QgbWFrZSBzeW1ib2xzIGZvciB0aGUgc2VjdGlvbnMgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQotCXsKLQkgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOwotCSAgaWYgKHNpLT5pZCAhPSBpKQotCSAgICBhYm9ydCgpOwotCSAgc2ktPnNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgc2ktPm5hbWUpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCSBzaS0+c2VjLAotCQkJCSBzaS0+ZmxhZ3MpOwotCi0JICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGFiZmQsIHNpLT5zZWMsIHNpLT5hbGlnbik7Ci0JICBzaS0+c2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNpLT5zZWM7Ci0JICBzaS0+c3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotCSAgc2ktPnN5bS0+bmFtZSA9IHNpLT5zZWMtPm5hbWU7Ci0JICBzaS0+c3ltLT5zZWN0aW9uID0gc2ktPnNlYzsKLQkgIHNpLT5zeW0tPmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgc2ktPnN5bS0+dmFsdWUgPSAwOwotCSAgcHRyc1tvaWR4XSA9IHNpLT5zeW07Ci0JICBzaS0+c3ltcHAgPSBwdHJzICsgb2lkeDsKLQkgIHNpLT5zaXplID0gMDsKLQkgIHNpLT5kYXRhID0gTlVMTDsKLQotCSAgb2lkeCsrOwotCX0KLQotICAgICAgaWYgKCEgZXhwLT5kYXRhKQotCXsKLQkgIGV4cF9sYWJlbCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0JICBleHBfbGFiZWwtPm5hbWUgPSBtYWtlX2xhYmVsICgiIiwgZXhwLT5uYW1lKTsKLQotCSAgLyogT24gUG93ZXJQQywgdGhlIGZ1bmN0aW9uIG5hbWUgcG9pbnRzIHRvIGEgZGVzY3JpcHRvciBpbgotCSAgICAgdGhlIHJkYXRhIHNlY3Rpb24sIHRoZSBmaXJzdCBlbGVtZW50IG9mIHdoaWNoIGlzIGEKLQkgICAgIHBvaW50ZXIgdG8gdGhlIGNvZGUgKC4uZnVuY3Rpb25fbmFtZSksIGFuZCB0aGUgc2Vjb25kCi0JICAgICBwb2ludHMgdG8gdGhlIC50b2MgKi8KLSNpZmRlZiBETExUT09MX1BQQwotCSAgaWYgKG1hY2hpbmUgPT0gTVBQQykKLQkgICAgZXhwX2xhYmVsLT5zZWN0aW9uID0gc2VjZGF0YVtSREFUQV0uc2VjOwotCSAgZWxzZQotI2VuZGlmCi0JICAgIGV4cF9sYWJlbC0+c2VjdGlvbiA9IHNlY2RhdGFbVEVYVF0uc2VjOwotCi0JICBleHBfbGFiZWwtPmZsYWdzID0gQlNGX0dMT0JBTDsKLQkgIGV4cF9sYWJlbC0+dmFsdWUgPSAwOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLQkgIGlmIChtYWNoaW5lID09IE1USFVNQikKLQkgICAgYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyAoYWJmZCwgZXhwX2xhYmVsLCBDX1RIVU1CRVhURlVOQyk7Ci0jZW5kaWYKLQkgIHB0cnNbb2lkeCsrXSA9IGV4cF9sYWJlbDsKLQl9Ci0KLSAgICAgIC8qIEdlbmVyYXRlIGltcCBzeW1ib2xzIHdpdGggb25lIHVuZGVyc2NvcmUgZm9yIE1pY3Jvc29mdAotICAgICAgICAgY29tcGF0aWJpbGl0eSwgYW5kIHdpdGggdHdvIHVuZGVyc2NvcmVzIGZvciBiYWNrd2FyZAotICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBjeWd3aW4uICAqLwotICAgICAgaWYgKGNyZWF0ZV9jb21wYXRfaW1wbGliKQotCXsKLQkgIGluYW1lID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLQkgIGluYW1lLT5uYW1lID0gbWFrZV9sYWJlbCAoIl9faW1wXyIsIGV4cC0+bmFtZSk7Ci0JICBpbmFtZS0+c2VjdGlvbiA9IHNlY2RhdGFbSURBVEE1XS5zZWM7Ci0JICBpbmFtZS0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgaW5hbWUtPnZhbHVlID0gMDsKLQl9Ci0KLSAgICAgIGluYW1lMiA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gICAgICBpbmFtZTItPm5hbWUgPSBtYWtlX2xhYmVsICgiX2ltcF9fIiwgZXhwLT5uYW1lKTsKLSAgICAgIGluYW1lMi0+c2VjdGlvbiA9IHNlY2RhdGFbSURBVEE1XS5zZWM7Ci0gICAgICBpbmFtZTItPmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIGluYW1lMi0+dmFsdWUgPSAwOwotCi0gICAgICBpbmFtZV9sYWIgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0KLSAgICAgIGluYW1lX2xhYi0+bmFtZSA9IGhlYWRfbGFiZWw7Ci0gICAgICBpbmFtZV9sYWItPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikmYmZkX3VuZF9zZWN0aW9uOwotICAgICAgaW5hbWVfbGFiLT5mbGFncyA9IDA7Ci0gICAgICBpbmFtZV9sYWItPnZhbHVlID0gMDsKLQotCi0gICAgICBpbmFtZV9wcCA9IHB0cnMgKyBvaWR4OwotICAgICAgaWYgKGNyZWF0ZV9jb21wYXRfaW1wbGliKQotCXB0cnNbb2lkeCsrXSA9IGluYW1lOwotICAgICAgcHRyc1tvaWR4KytdID0gaW5hbWUyOwotCi0gICAgICBpbmFtZV9sYWJfcHAgPSBwdHJzICsgb2lkeDsKLSAgICAgIHB0cnNbb2lkeCsrXSA9IGluYW1lX2xhYjsKLQotI2lmZGVmIERMTFRPT0xfUFBDCi0gICAgICAvKiBUaGUgc3ltYm9sIHJlZmVyaW5nIHRvIHRoZSBjb2RlICgudGV4dCkgKi8KLSAgICAgIHsKLQlhc3ltYm9sICpmdW5jdGlvbl9uYW1lOwotCi0JZnVuY3Rpb25fbmFtZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLQlmdW5jdGlvbl9uYW1lLT5uYW1lID0gbWFrZV9sYWJlbCAoIi4uIiwgZXhwLT5uYW1lKTsKLQlmdW5jdGlvbl9uYW1lLT5zZWN0aW9uID0gc2VjZGF0YVtURVhUXS5zZWM7Ci0JZnVuY3Rpb25fbmFtZS0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCWZ1bmN0aW9uX25hbWUtPnZhbHVlID0gMDsKLQotCWZuX3BwID0gcHRycyArIG9pZHg7Ci0JcHRyc1tvaWR4KytdID0gZnVuY3Rpb25fbmFtZTsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIC50b2Mgc3ltYm9sICovCi0gICAgICB7Ci0JYXN5bWJvbCAqdG9jX3N5bWJvbDsgICAgLyogVGhlIC50b2Mgc3ltYm9sICovCi0KLQl0b2Nfc3ltYm9sID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLQl0b2Nfc3ltYm9sLT5uYW1lID0gbWFrZV9sYWJlbCAoIi4iLCAidG9jIik7Ci0JdG9jX3N5bWJvbC0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSZiZmRfdW5kX3NlY3Rpb247Ci0JdG9jX3N5bWJvbC0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCXRvY19zeW1ib2wtPnZhbHVlID0gMDsKLQotCXRvY19wcCA9IHB0cnMgKyBvaWR4OwotCXB0cnNbb2lkeCsrXSA9IHRvY19zeW1ib2w7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIAotICAgICAgcHRyc1tvaWR4XSA9IDA7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQotCXsKLQkgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOwotCSAgYXNlY3Rpb24gKnNlYyA9IHNpLT5zZWM7Ci0JICBhcmVsZW50ICpyZWw7Ci0JICBhcmVsZW50ICoqcnBwOwotCi0JICBzd2l0Y2ggKGkpCi0JICAgIHsKLQkgICAgY2FzZSBURVhUOgotCSAgICAgIGlmICghIGV4cC0+ZGF0YSkKLQkJewotCQkgIHNpLT5zaXplID0gSE9XX0pUQUJfU0laRTsKLQkJICBzaS0+ZGF0YSA9IHhtYWxsb2MgKEhPV19KVEFCX1NJWkUpOwotCQkgIG1lbWNweSAoc2ktPmRhdGEsIEhPV19KVEFCLCBIT1dfSlRBQl9TSVpFKTsKLQotCQkgIC8qIGFkZCB0aGUgcmVsb2MgaW50byBpZGF0YSQ1ICovCi0JCSAgcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCSAgCi0JCSAgcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogMik7Ci0JCSAgcnBwWzBdID0gcmVsOwotCQkgIHJwcFsxXSA9IDA7Ci0JCSAgCi0JCSAgcmVsLT5hZGRyZXNzID0gSE9XX0pUQUJfUk9GRjsKLQkJICByZWwtPmFkZGVuZCA9IDA7Ci0KLQkJICBpZiAobWFjaGluZSA9PSBNUFBDKQotCQkgICAgewotCQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLAotCQkJCQkJCSAgQkZEX1JFTE9DXzE2X0dPVE9GRik7Ci0JCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBpbmFtZV9wcDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBzZWNkYXRhW0lEQVRBNV0uc3ltcHA7Ci0JCSAgICB9Ci0JCSAgc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkJICBzZWMtPnJlbG9jX2NvdW50ID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElEQVRBNDoKLQkgICAgY2FzZSBJREFUQTU6Ci0JICAgICAgLyogQW4gaWRhdGEkNCBvciBpZGF0YSQ1IGlzIG9uZSB3b3JkIGxvbmcsIGFuZCBoYXMgYW4KLQkJIHJ2YSB0byBpZGF0YSQ2ICovCi0KLQkgICAgICBzaS0+ZGF0YSA9IHhtYWxsb2MgKDQpOwotCSAgICAgIHNpLT5zaXplID0gNDsKLQotCSAgICAgIGlmIChleHAtPm5vbmFtZSkKLQkJewotCQkgIHNpLT5kYXRhWzBdID0gZXhwLT5vcmRpbmFsIDsKLQkJICBzaS0+ZGF0YVsxXSA9IGV4cC0+b3JkaW5hbCA+PiA4OwotCQkgIHNpLT5kYXRhWzJdID0gZXhwLT5vcmRpbmFsID4+IDE2OwotCQkgIHNpLT5kYXRhWzNdID0gMHg4MDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNlYy0+cmVsb2NfY291bnQgPSAxOwotCQkgIG1lbXNldCAoc2ktPmRhdGEsIDAsIHNpLT5zaXplKTsKLQkJICByZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJICBycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiAyKTsKLQkJICBycHBbMF0gPSByZWw7Ci0JCSAgcnBwWzFdID0gMDsKLQkJICByZWwtPmFkZHJlc3MgPSAwOwotCQkgIHJlbC0+YWRkZW5kID0gMDsKLQkJICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfUlZBKTsKLQkJICByZWwtPnN5bV9wdHJfcHRyID0gc2VjZGF0YVtJREFUQTZdLnN5bXBwOwotCQkgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgSURBVEE2OgotCSAgICAgIGlmICghZXhwLT5ub25hbWUpCi0JCXsKLQkJICAvKiBUaGlzIHVzZWQgdG8gYWRkIDEgdG8gZXhwLT5oaW50LiAgSSBkb24ndCBrbm93Ci0gICAgICAgICAgICAgICAgICAgICB3aHkgaXQgZGlkIHRoYXQsIGFuZCBpdCBkb2VzIG5vdCBtYXRjaCB3aGF0IEkgc2VlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwcm9ncmFtcyBjb21waWxlZCB3aXRoIHRoZSBNUyB0b29scy4gICovCi0JCSAgaW50IGlkeCA9IGV4cC0+aGludDsKLQkJICBzaS0+c2l6ZSA9IHN0cmxlbiAoeGxhdGUgKGV4cC0+bmFtZSkpICsgMzsKLQkJICBzaS0+ZGF0YSA9IHhtYWxsb2MgKHNpLT5zaXplKTsKLQkJICBzaS0+ZGF0YVswXSA9IGlkeCAmIDB4ZmY7Ci0JCSAgc2ktPmRhdGFbMV0gPSBpZHggPj4gODsKLQkJICBzdHJjcHkgKHNpLT5kYXRhICsgMiwgeGxhdGUgKGV4cC0+bmFtZSkpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSURBVEE3OgotCSAgICAgIHNpLT5zaXplID0gNDsKLQkgICAgICBzaS0+ZGF0YSA9eG1hbGxvYyg0KTsKLQkgICAgICBtZW1zZXQgKHNpLT5kYXRhLCAwLCBzaS0+c2l6ZSk7Ci0JICAgICAgcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JICAgICAgcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogMik7Ci0JICAgICAgcnBwWzBdID0gcmVsOwotCSAgICAgIHJlbC0+YWRkcmVzcyA9IDA7Ci0JICAgICAgcmVsLT5hZGRlbmQgPSAwOwotCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ19SVkEpOwotCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBpbmFtZV9sYWJfcHA7Ci0JICAgICAgc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkgICAgICBzZWMtPnJlbG9jX2NvdW50ID0gMTsKLQkgICAgICBicmVhazsKLQotI2lmZGVmIERMTFRPT0xfUFBDCi0JICAgIGNhc2UgUERBVEE6Ci0JICAgICAgewotCQkvKiBUaGUgLnBkYXRhIHNlY3Rpb24gaXMgNSB3b3JkcyBsb25nLiAqLwotCQkvKiBUaGluayBvZiBpdCBhczogICAgICAgICAgICAgICAgICAgICAqLwotCQkvKiBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkvKiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkvKiAgIGJmZF92bWEgQmVnaW5BZGRyZXNzLCAgICAgWzB4MDBdICAqLwotCQkvKiAgICAgICAgICAgRW5kQWRkcmVzcywgICAgICAgWzB4MDRdICAqLwotCQkvKgkgICAgIEV4Y2VwdGlvbkhhbmRsZXIsIFsweDA4XSAgKi8KLQkJLyoJICAgICBIYW5kbGVyRGF0YSwgICAgICBbMHgwY10gICovCi0JCS8qCSAgICAgUHJvbG9nRW5kQWRkcmVzczsgWzB4MTBdICAqLwotCQkvKiB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0JCS8qIFNvIHRoaXMgcGRhdGEgc2VjdGlvbiBzZXR1cHMgdXAgdGhpcyBhcyBhIGdsdWUgbGlua2FnZSB0bwotCQkgICBhIGRsbCByb3V0aW5lLiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgaG91c2Uga2VlcGluZyB0aGluZ3MKLQkJICAgd2UgbmVlZCB0byBkbzoKLQotCQkgICAxLiBJbiB0aGUgbmFtZSBvZiBnbHVlIHRyaWNrZXJ5LCB0aGUgQUREUjMyIHJlbG9jcyBmb3IgMCwKLQkJICAgICAgNCwgYW5kIDB4MTAgYXJlIHNldCB0byBwb2ludCB0byB0aGUgc2FtZSBwbGFjZToKLQkJICAgICAgIi4uZnVuY3Rpb25fbmFtZSIuCi0JCSAgIDIuIFRoZXJlIGlzIG9uZSBtb3JlIHJlbG9jIG5lZWRlZCBpbiB0aGUgcGRhdGEgc2VjdGlvbi4KLQkJICAgICAgVGhlIGFjdHVhbCBnbHVlIGluc3RydWN0aW9uIHRvIHJlc3RvcmUgdGhlIHRvYyBvbgotCQkgICAgICByZXR1cm4gaXMgc2F2ZWQgYXMgdGhlIG9mZnNldCBpbiBhbiBJTUdMVUUgcmVsb2MuCi0JCSAgICAgIFNvIHdlIG5lZWQgYSB0b3RhbCBvZiBmb3VyIHJlbG9jcyBmb3IgdGhpcyBzZWN0aW9uLgotCi0JCSAgIDMuIExhc3RseSwgdGhlIEhhbmRsZXJEYXRhIGZpZWxkIGlzIHNldCB0byAweDAzLCB0byBpbmRpY2F0ZQotCQkgICAgICB0aGF0IHRoaXMgaXMgYSBnbHVlIHJvdXRpbmUuCi0JCSovCi0JCWFyZWxlbnQgKmltZ2x1ZSwgKmJhX3JlbCwgKmVhX3JlbCwgKnBlYV9yZWw7Ci0KLQkJLyogYWxpZ25tZW50IG11c3QgYmUgc2V0IHRvIDIqKjIgb3IgeW91IGdldCBleHRyYSBzdHVmZiAqLwotCQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGFiZmQsIHNlYywgMik7Ci0KLQkJc2ktPnNpemUgPSA0ICogNTsKLQkJc2ktPmRhdGEgPXhtYWxsb2MoNCAqIDUpOwotCQltZW1zZXQgKHNpLT5kYXRhLCAwLCBzaS0+c2l6ZSk7Ci0JCXJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDUpOwotCQlycHBbMF0gPSBpbWdsdWUgID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCXJwcFsxXSA9IGJhX3JlbCAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJcnBwWzJdID0gZWFfcmVsICA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQlycHBbM10gPSBwZWFfcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCXJwcFs0XSA9IDA7Ci0KLQkJLyogc3RpY2sgdGhlIHRvYyByZWxvYWQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGdsdWUgcmVsb2MgKi8KLQkJYmZkX3B1dF8zMihhYmZkLCBwcGNfZ2x1ZV9pbnNuLCAoY2hhciAqKSAmaW1nbHVlLT5hZGRyZXNzKTsKLQotCQlpbWdsdWUtPmFkZGVuZCA9IDA7Ci0JCWltZ2x1ZS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsCi0JCQkJCQkgICAgICAgQkZEX1JFTE9DXzMyX0dPVE9GRik7Ci0JCWltZ2x1ZS0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCQliYV9yZWwtPmFkZHJlc3MgPSAwOwotCQliYV9yZWwtPmFkZGVuZCA9IDA7Ci0JCWJhX3JlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JCWJhX3JlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCQliZmRfcHV0XzMyKGFiZmQsIDB4MTgsIHNpLT5kYXRhICsgMHgwNCk7Ci0JCWVhX3JlbC0+YWRkcmVzcyA9IDQ7Ci0JCWVhX3JlbC0+YWRkZW5kID0gMDsKLQkJZWFfcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkJZWFfcmVsLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JCS8qIG1hcmsgaXQgYXMgZ2x1ZSAqLwotCQliZmRfcHV0XzMyKGFiZmQsIDB4MDMsIHNpLT5kYXRhICsgMHgwYyk7Ci0KLQkJLyogbWFyayB0aGUgcHJvbG9nIGVuZCBhZGRyZXNzICovCi0JCWJmZF9wdXRfMzIoYWJmZCwgMHgwRCwgc2ktPmRhdGEgKyAweDEwKTsKLQkJcGVhX3JlbC0+YWRkcmVzcyA9IDB4MTA7Ci0JCXBlYV9yZWwtPmFkZGVuZCA9IDA7Ci0JCXBlYV9yZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCQlwZWFfcmVsLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JCXNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JCXNlYy0+cmVsb2NfY291bnQgPSA0OwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGNhc2UgUkRBVEE6Ci0JICAgICAgLyogRWFjaCBleHRlcm5hbCBmdW5jdGlvbiBpbiBhIFBvd2VyUEMgUEUgZmlsZSBoYXMgYSB0d28gd29yZAotCQkgZGVzY3JpcHRvciBjb25zaXN0aW5nIG9mOgotCQkgMS4gVGhlIGFkZHJlc3Mgb2YgdGhlIGNvZGUuCi0JCSAyLiBUaGUgYWRkcmVzcyBvZiB0aGUgYXBwcm9wcmlhdGUgLnRvYwotCSAgICAgICAgIFdlIHVzZSByZWxvY3MgdG8gYnVpbGQgdGhpcy4KLQkgICAgICAqLwotCi0JICAgICAgc2ktPnNpemUgPSA4OwotCSAgICAgIHNpLT5kYXRhID0geG1hbGxvYyAoOCk7Ci0JICAgICAgbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOwotCi0JICAgICAgcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogMyk7Ci0JICAgICAgcnBwWzBdID0gcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JICAgICAgcnBwWzFdID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JICAgICAgcnBwWzJdID0gMDsKLQotCSAgICAgIHJlbC0+YWRkcmVzcyA9IDA7Ci0JICAgICAgcmVsLT5hZGRlbmQgPSAwOwotCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JICAgICAgcmVsID0gcnBwWzFdOwotCi0JICAgICAgcmVsLT5hZGRyZXNzID0gNDsKLQkgICAgICByZWwtPmFkZGVuZCA9IDA7Ci0JICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gdG9jX3BwOwotCi0JICAgICAgc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkgICAgICBzZWMtPnJlbG9jX2NvdW50ID0gMjsKLQkgICAgICBicmVhazsKLSNlbmRpZiAvKiBETExUT09MX1BQQyAqLwotCSAgICB9Ci0JfQotCi0gICAgICB7Ci0JYmZkX3ZtYSB2bWEgPSAwOwotCS8qIFNpemUgdXAgYWxsIHRoZSBzZWN0aW9ucyAqLwotCWZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQotCSAgewotCSAgICBzaW5mbyAqc2kgPSBzZWNkYXRhICsgaTsKLQotCSAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2ktPnNlYywgc2ktPnNpemUpOwotCSAgICBiZmRfc2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzaS0+c2VjLCB2bWEpOwotCi0vKgkgICAgdm1hICs9IHNpLT5zaXplOyovCi0JICB9Ci0gICAgICB9Ci0gICAgICAvKiBXcml0ZSB0aGVtIG91dCAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IE5TRUNTOyBpKyspCi0JewotCSAgc2luZm8gKnNpID0gc2VjZGF0YSArIGk7Ci0KLQkgIGlmIChpID09IElEQVRBNSAmJiBub19pZGF0YTUpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoaSA9PSBJREFUQTQgJiYgbm9faWRhdGE0KQotCSAgICBjb250aW51ZTsKLQotCSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzaS0+c2VjLAotCQkJCSAgICBzaS0+ZGF0YSwgMCwKLQkJCQkgICAgc2ktPnNpemUpOwotCX0KLQotICAgICAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHB0cnMsIG9pZHgpOwotICAgICAgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIGFiZmQgPSBiZmRfb3BlbnIgKG91dG5hbWUsIEhPV19CRkRfUkVBRF9UQVJHRVQpOwotICAgICAgcmV0dXJuIGFiZmQ7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBiZmQgKgotbWFrZV9oZWFkICgpCi17Ci0gIEZJTEUgKmYgPSBmb3BlbiAoVE1QX0hFQURfUywgRk9QRU5fV1QpOwotCi0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgZmF0YWwgKF8oImZhaWxlZCB0byBvcGVuIHRlbXBvcmFyeSBoZWFkIGZpbGU6ICVzIiksIFRNUF9IRUFEX1MpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAKLSAgZnByaW50ZiAoZiwgIiVzIElNQUdFX0lNUE9SVF9ERVNDUklQVE9SXG4iLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQyXG4iKTsKLQotICBmcHJpbnRmKGYsIlx0JXNcdCVzXG4iLCBBU01fR0xPQkFMLGhlYWRfbGFiZWwpOwotCi0gIGZwcmludGYgKGYsICIlczpcbiIsIGhlYWRfbGFiZWwpOwotCi0gIGZwcmludGYgKGYsICJcdCVzaG5hbWUlc1x0JXNQdHIgdG8gaW1hZ2UgaW1wb3J0IGJ5IG5hbWUgbGlzdFxuIiwKLQkgICBBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOwotCi0gIGZwcmludGYgKGYsICJcdCVzdGhpcyBzaG91bGQgYmUgdGhlIHRpbWVzdGFtcCwgYnV0IE5UIHNvbWV0aW1lc1xuIiwgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc2RvZXNuJ3QgbG9hZCBETExzIHdoZW4gdGhpcyBpcyBzZXQuXG4iLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXHQlcyBsb2FkZWQgdGltZVxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNcdDBcdCVzIEZvcndhcmRlciBjaGFpblxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNfXyVzX2luYW1lJXNcdCVzIGltcG9ydGVkIGRsbCdzIG5hbWVcbiIsCi0JICAgQVNNX1JWQV9CRUZPUkUsCi0JICAgaW1wX25hbWVfbGFiLAotCSAgIEFTTV9SVkFfQUZURVIsCi0JICAgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc2Z0aHVuayVzXHQlcyBwb2ludGVyIHRvIGZpcnN0dGh1bmtcbiIsCi0JICAgQVNNX1JWQV9CRUZPUkUsCi0JICAgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOwotCi0gIGZwcmludGYgKGYsICIlc1N0dWZmIGZvciBjb21wYXRpYmlsaXR5XG4iLCBBU01fQyk7Ci0KLSAgaWYgKCFub19pZGF0YTUpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5pZGF0YSQ1XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gICAgICBmcHJpbnRmIChmLCAiZnRodW5rOlxuIik7Ci0gICAgfQotICAKLSAgaWYgKCFub19pZGF0YTQpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5pZGF0YSQ0XG4iKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ0XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJobmFtZTpcbiIpOwotICAgIH0KLSAgCi0gIGZjbG9zZSAoZik7Ci0KLSAgYXNzZW1ibGVfZmlsZSAoVE1QX0hFQURfUywgVE1QX0hFQURfTyk7Ci0KLSAgcmV0dXJuIGJmZF9vcGVuciAoVE1QX0hFQURfTywgSE9XX0JGRF9SRUFEX1RBUkdFVCk7Ci19Ci0KLXN0YXRpYyBiZmQgKgotbWFrZV90YWlsICgpCi17Ci0gIEZJTEUgKmYgPSBmb3BlbiAoVE1QX1RBSUxfUywgRk9QRU5fV1QpOwotCi0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgZmF0YWwgKF8oImZhaWxlZCB0byBvcGVuIHRlbXBvcmFyeSB0YWlsIGZpbGU6ICVzIiksIFRNUF9UQUlMX1MpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKCFub19pZGF0YTQpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICB9Ci0gIAotICBpZiAoIW5vX2lkYXRhNSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNVxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgIH0KLQotI2lmZGVmIERMTFRPT0xfUFBDCi0gIC8qIE5vcm1hbGx5LCB3ZSBuZWVkIHRvIHNlZSBhIG51bGwgZGVzY3JpcHRvciBidWlsdCBpbiBpZGF0YSQzIHRvCi0gICAgIGFjdCBhcyB0aGUgdGVybWluYXRvciBmb3IgdGhlIGxpc3QuIFRoZSBpZGVhbCB3YXksIEkgc3VwcG9zZSwKLSAgICAgd291bGQgYmUgdG8gbWFyayB0aGlzIHNlY3Rpb24gYXMgYSBjb21kYXQgdHlwZSAyIHNlY3Rpb24sIHNvCi0gICAgIG9ubHkgb25lIHdvdWxkIGFwcGVhciBpbiB0aGUgZmluYWwgLmV4ZSAoaWYgb3VyIGxpbmtlciBzdXBwb3J0ZWQKLSAgICAgY29tZGF0LCB0aGF0IGlzKSBvciBjYXVzZSBpdCB0byBiZSBpbnNlcnRlZCBieSBzb21ldGhpbmcgZWxzZSAoc2F5Ci0gICAgIGNydDApCi0gICovCi0KLSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDNcbiIpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX1BQQwotICAvKiBPdGhlciBQb3dlclBDIE5UIGNvbXBpbGVycyB1c2UgaWRhdGEkNiBmb3IgdGhlIGRsbG5hbWUsIHNvIEkKLSAgICAgZG8gdG9vLiBPcmlnaW5hbCwgaHVoPyAqLwotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNlxuIik7Ci0jZWxzZQotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkN1xuIik7Ci0jZW5kaWYKLQotICBmcHJpbnRmIChmLCAiXHQlc1x0X18lc19pbmFtZVxuIiwgQVNNX0dMT0JBTCwgaW1wX25hbWVfbGFiKTsKLSAgZnByaW50ZiAoZiwgIl9fJXNfaW5hbWU6XHQlc1x0XCIlc1wiXG4iLAotCSAgIGltcF9uYW1lX2xhYiwgQVNNX1RFWFQsIGRsbF9uYW1lKTsKLQotICBmY2xvc2UgKGYpOwotCi0gIGFzc2VtYmxlX2ZpbGUgKFRNUF9UQUlMX1MsIFRNUF9UQUlMX08pOwotICAKLSAgcmV0dXJuICBiZmRfb3BlbnIgKFRNUF9UQUlMX08sIEhPV19CRkRfUkVBRF9UQVJHRVQpOwotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2xpYl9maWxlICgpCi17Ci0gIGludCBpOwotICBleHBvcnRfdHlwZSAqZXhwOwotICBiZmQgKmFyX2hlYWQ7Ci0gIGJmZCAqYXJfdGFpbDsKLSAgYmZkICpvdXRhcmNoOwotICBiZmQgKiBoZWFkICA9IDA7Ci0KLSAgdW5saW5rIChpbXBfbmFtZSk7Ci0KLSAgb3V0YXJjaCA9IGJmZF9vcGVudyAoaW1wX25hbWUsIEhPV19CRkRfV1JJVEVfVEFSR0VUKTsKLQotICBpZiAoIW91dGFyY2gpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiQ2FuJ3Qgb3BlbiAubGliIGZpbGU6ICVzIiksIGltcF9uYW1lKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIpLCBpbXBfbmFtZSk7Ci0gIAotICBiZmRfc2V0X2Zvcm1hdCAob3V0YXJjaCwgYmZkX2FyY2hpdmUpOwotICBvdXRhcmNoLT5oYXNfYXJtYXAgPSAxOwotCi0gIC8qIFdvcmsgb3V0IGEgcmVhc29uYWJsZSBzaXplIG9mIHRoaW5ncyB0byBwdXQgb250byBvbmUgbGluZS4gKi8KLQotICBhcl9oZWFkID0gbWFrZV9oZWFkICgpOwotICBhcl90YWlsID0gbWFrZV90YWlsKCk7Ci0KLSAgaWYgKGFyX2hlYWQgPT0gTlVMTCB8fCBhcl90YWlsID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCi0gICAgewotICAgICAgYmZkICpuID0gbWFrZV9vbmVfbGliX2ZpbGUgKGV4cCwgaSk7Ci0gICAgICBuLT5uZXh0ID0gaGVhZDsKLSAgICAgIGhlYWQgPSBuOwotICAgIH0KLQotICAvKiBOb3cgc3RpY2sgdGhlbSBhbGwgaW50byB0aGUgYXJjaGl2ZSAqLwotCi0gIGFyX2hlYWQtPm5leHQgPSBoZWFkOwotICBhcl90YWlsLT5uZXh0ID0gYXJfaGVhZDsKLSAgaGVhZCA9IGFyX3RhaWw7Ci0KLSAgaWYgKCEgYmZkX3NldF9hcmNoaXZlX2hlYWQgKG91dGFyY2gsIGhlYWQpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfYXJjaGl2ZV9oZWFkIik7Ci0gIAotICBpZiAoISBiZmRfY2xvc2UgKG91dGFyY2gpKQotICAgIGJmZF9mYXRhbCAoaW1wX25hbWUpOwotCi0gIHdoaWxlIChoZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkICpuID0gaGVhZC0+bmV4dDsKLSAgICAgIGJmZF9jbG9zZSAoaGVhZCk7Ci0gICAgICBoZWFkID0gbjsKLSAgICB9Ci0KLSAgLyogRGVsZXRlIGFsbCB0aGUgdGVtcCBmaWxlcyAqLwotCi0gIGlmIChkb250ZGVsdGVtcHMgPT0gMCkKLSAgICB7Ci0gICAgICB1bmxpbmsgKFRNUF9IRUFEX08pOwotICAgICAgdW5saW5rIChUTVBfSEVBRF9TKTsKLSAgICAgIHVubGluayAoVE1QX1RBSUxfTyk7Ci0gICAgICB1bmxpbmsgKFRNUF9UQUlMX1MpOwotICAgIH0KLQotICBpZiAoZG9udGRlbHRlbXBzIDwgMikKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzaXplb2YgVE1QX1NUVUIgKyAxMCk7Ci0gICAgICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0JewotCSAgc3ByaW50ZiAobmFtZSwgIiVzJTA1ZC5vIiwgVE1QX1NUVUIsIGkpOwotCSAgaWYgKHVubGluayAobmFtZSkgPCAwKQotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICB3YXJuIChfKCJjYW5ub3QgZGVsZXRlICVzOiAlc1xuIiksIG5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCX0KLSAgICB9Ci0gIAotICBpbmZvcm0gKF8oIkNyZWF0ZWQgbGliIGZpbGUiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBSdW4gdGhyb3VnaCB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgLm8gZmlsZXMgYW5kIHRoZQotICAgLmRlZiBmaWxlIGFuZCB3b3JrIG91dCB0aGUgYmVzdCBzdHVmZiAqLwotc3RhdGljIGludAotcGZ1bmMgKGEsIGIpCi0gICAgIGNvbnN0IHZvaWQgKmE7Ci0gICAgIGNvbnN0IHZvaWQgKmI7Ci17Ci0gIGV4cG9ydF90eXBlICphcCA9ICooZXhwb3J0X3R5cGUgKiopIGE7Ci0gIGV4cG9ydF90eXBlICpicCA9ICooZXhwb3J0X3R5cGUgKiopIGI7Ci0gIGlmIChhcC0+b3JkaW5hbCA9PSBicC0+b3JkaW5hbCkKLSAgICByZXR1cm4gMDsKLQotICAvKiB1bnNldCBvcmRpbmFscyBnbyB0byB0aGUgYm90dG9tICovCi0gIGlmIChhcC0+b3JkaW5hbCA9PSAtMSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKGJwLT5vcmRpbmFsID09IC0xKQotICAgIHJldHVybiAtMTsKLSAgcmV0dXJuIChhcC0+b3JkaW5hbCAtIGJwLT5vcmRpbmFsKTsKLX0KLQotc3RhdGljIGludAotbmZ1bmMgKGEsIGIpCi0gICAgIGNvbnN0IHZvaWQgKmE7Ci0gICAgIGNvbnN0IHZvaWQgKmI7Ci17Ci0gIGV4cG9ydF90eXBlICphcCA9ICooZXhwb3J0X3R5cGUgKiopIGE7Ci0gIGV4cG9ydF90eXBlICpicCA9ICooZXhwb3J0X3R5cGUgKiopIGI7Ci0KLSAgcmV0dXJuIChzdHJjbXAgKGFwLT5uYW1lLCBicC0+bmFtZSkpOwotfQotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX251bGxfbmFtZXMgKHB0cikKLSAgICAgZXhwb3J0X3R5cGUgKipwdHI7Ci17Ci0gIGludCBzcmM7Ci0gIGludCBkc3Q7Ci0gIGZvciAoZHN0ID0gc3JjID0gMDsgc3JjIDwgZF9uZnVuY3M7IHNyYysrKQotICAgIHsKLSAgICAgIGlmIChwdHJbc3JjXSkKLQl7Ci0JICBwdHJbZHN0XSA9IHB0cltzcmNdOwotCSAgZHN0Kys7Ci0JfQotICAgIH0KLSAgZF9uZnVuY3MgPSBkc3Q7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdGFiIChwdHIpCi0gICAgIGV4cG9ydF90eXBlICoqIHB0cgotI2lmbmRlZiBTQUNERUJVRwotQVRUUklCVVRFX1VOVVNFRAotI2VuZGlmCi0gICAgIDsKLXsKLSNpZmRlZiBTQUNERUJVRwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKHB0cltpXSkKLQl7Ci0JICBwcmludGYgKCIlZCAlcyBAICVkICVzJXMlc1xuIiwKLQkJICBpLCBwdHJbaV0tPm5hbWUsIHB0cltpXS0+b3JkaW5hbCwKLQkJICBwdHJbaV0tPm5vbmFtZSA/ICJOT05BTUUgIiA6ICIiLAotCQkgIHB0cltpXS0+Y29uc3RhbnQgPyAiQ09OU1RBTlQiIDogIiIsCi0JCSAgcHRyW2ldLT5kYXRhID8gIkRBVEEiIDogIiIpOwotCX0KLSAgICAgIGVsc2UKLQlwcmludGYgKCJlbXB0eVxuIik7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2R1cGxpY2F0ZXMgKGRfZXhwb3J0X3ZlYykKLSAgICAgZXhwb3J0X3R5cGUgKipkX2V4cG9ydF92ZWM7Ci17Ci0gIGludCBtb3JlID0gMTsKLSAgaW50IGk7Ci0gIHdoaWxlIChtb3JlKQotICAgIHsKLQotICAgICAgbW9yZSA9IDA7Ci0gICAgICAvKiBSZW1vdmUgZHVwbGljYXRlcyAqLwotICAgICAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIG5mdW5jKTsKLQotICAgICAgZHRhYiAoZF9leHBvcnRfdmVjKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jcyAtIDE7IGkrKykKLQl7Ci0JICBpZiAoc3RyY21wIChkX2V4cG9ydF92ZWNbaV0tPm5hbWUsCi0JCSAgICAgIGRfZXhwb3J0X3ZlY1tpICsgMV0tPm5hbWUpID09IDApCi0JICAgIHsKLQotCSAgICAgIGV4cG9ydF90eXBlICphID0gZF9leHBvcnRfdmVjW2ldOwotCSAgICAgIGV4cG9ydF90eXBlICpiID0gZF9leHBvcnRfdmVjW2kgKyAxXTsKLQotCSAgICAgIG1vcmUgPSAxOwotCSAgICAgIAotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgaW5mb3JtIChfKCJXYXJuaW5nLCBpZ25vcmluZyBkdXBsaWNhdGUgRVhQT1JUICVzICVkLCVkXG4iKSwKLQkJICAgICAgYS0+bmFtZSwgYS0+b3JkaW5hbCwgYi0+b3JkaW5hbCk7Ci0JICAgICAgCi0JICAgICAgaWYgKGEtPm9yZGluYWwgIT0gLTEKLQkJICAmJiBiLT5vcmRpbmFsICE9IC0xKQotCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQlmYXRhbCAoXygiRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzIiksCi0JCSAgICAgIGEtPm5hbWUpOwotCi0JICAgICAgLyogTWVyZ2UgYXR0cmlidXRlcyAqLwotCSAgICAgIGItPm9yZGluYWwgPSBhLT5vcmRpbmFsID4gMCA/IGEtPm9yZGluYWwgOiBiLT5vcmRpbmFsOwotCSAgICAgIGItPmNvbnN0YW50IHw9IGEtPmNvbnN0YW50OwotCSAgICAgIGItPm5vbmFtZSB8PSBhLT5ub25hbWU7Ci0JICAgICAgYi0+ZGF0YSB8PSBhLT5kYXRhOwotCSAgICAgIGRfZXhwb3J0X3ZlY1tpXSA9IDA7Ci0JICAgIH0KLQotCSAgZHRhYiAoZF9leHBvcnRfdmVjKTsKLQkgIHJlbW92ZV9udWxsX25hbWVzIChkX2V4cG9ydF92ZWMpOwotCSAgZHRhYiAoZF9leHBvcnRfdmVjKTsKLQl9Ci0gICAgfQotCi0KLSAgLyogQ291bnQgdGhlIG5hbWVzICovCi0gIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQotICAgIHsKLSAgICAgIGlmICghZF9leHBvcnRfdmVjW2ldLT5ub25hbWUpCi0JZF9uYW1lZF9uZnVuY3MrKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1maWxsX29yZGluYWxzIChkX2V4cG9ydF92ZWMpCi0gICAgIGV4cG9ydF90eXBlICoqZF9leHBvcnRfdmVjOwotewotICBpbnQgbG93ZXN0ID0gLTE7Ci0gIGludCBpOwotICBjaGFyICpwdHI7Ci0gIGludCBzaXplID0gNjU1MzY7Ci0KLSAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIHBmdW5jKTsKLQotICAvKiBmaWxsIGluIHRoZSB1bnNldCBvcmRpbmFscyB3aXRoIG9uZXMgZnJvbSBvdXIgcmFuZ2UgKi8KLQotICBwdHIgPSAoY2hhciAqKSB4bWFsbG9jIChzaXplKTsKLQotICBtZW1zZXQgKHB0ciwgMCwgc2l6ZSk7Ci0KLSAgLyogTWFyayBpbiBvdXIgbGFyZ2UgdmVjdG9yIGFsbCB0aGUgbnVtYmVycyB0aGF0IGFyZSB0YWtlbiAqLwotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsICE9IC0xKQotCXsKLQkgIHB0cltkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWxdID0gMTsKLQkgIGlmIChsb3dlc3QgPT0gLTEgfHwgZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsIDwgbG93ZXN0KQotCSAgICB7Ci0JICAgICAgbG93ZXN0ID0gZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBTdGFydCBhdCAxIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTVMgdG9vbGNoYWluLiAgKi8KLSAgaWYgKGxvd2VzdCA9PSAtMSkKLSAgICBsb3dlc3QgPSAxOwotCi0gIC8qIE5vdyBmaWxsIGluIG9yZGluYWxzIHdoZXJlIHRoZSB1c2VyIHdhbnRzIHVzIHRvIGNob29zZS4gKi8KLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKGRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbCA9PSAtMSkKLQl7Ci0JICByZWdpc3RlciBpbnQgajsKLQotCSAgLyogRmlyc3QgdHJ5IHdpdGhpbiBvciBhZnRlciBhbnkgdXNlciBzdXBwbGllZCByYW5nZS4gKi8KLQkgIGZvciAoaiA9IGxvd2VzdDsgaiA8IHNpemU7IGorKykKLQkgICAgaWYgKHB0cltqXSA9PSAwKQotCSAgICAgIHsKLQkJcHRyW2pdID0gMTsKLQkJZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsID0gajsKLQkJZ290byBkb25lOwotCSAgICAgIH0KLQotCSAgLyogVGhlbiB0cnkgYmVmb3JlIHRoZSByYW5nZS4gKi8KLQkgIGZvciAoaiA9IGxvd2VzdDsgaiA+MDsgai0tKQotCSAgICBpZiAocHRyW2pdID09IDApCi0JICAgICAgewotCQlwdHJbal0gPSAxOwotCQlkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgPSBqOwotCQlnb3RvIGRvbmU7Ci0JICAgICAgfQotCWRvbmU6OwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocHRyKTsKLQotICAvKiBBbmQgcmVzb3J0ICovCi0KLSAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIHBmdW5jKTsKLQotICAvKiBXb3JrIG91dCB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IG9yZGluYWwgbnVtYmVycy4gICovCi0gIGlmIChkX25mdW5jcykKLSAgICB7Ci0gICAgICBpZiAoZF9leHBvcnRfdmVjWzBdKQotCWRfbG93X29yZCA9IGRfZXhwb3J0X3ZlY1swXS0+b3JkaW5hbDsKLSAgICAgIGlmIChkX2V4cG9ydF92ZWNbZF9uZnVuY3MtMV0pCi0JZF9oaWdoX29yZCA9IGRfZXhwb3J0X3ZlY1tkX25mdW5jcy0xXS0+b3JkaW5hbDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWFscGhhZnVuYyAoYXYsYnYpCi0gICAgIGNvbnN0IHZvaWQgKmF2OwotICAgICBjb25zdCB2b2lkICpidjsKLXsKLSAgY29uc3QgZXhwb3J0X3R5cGUgKiphID0gKGNvbnN0IGV4cG9ydF90eXBlICoqKSBhdjsKLSAgY29uc3QgZXhwb3J0X3R5cGUgKipiID0gKGNvbnN0IGV4cG9ydF90eXBlICoqKSBidjsKLQotICByZXR1cm4gc3RyY21wICgoKmEpLT5uYW1lLCAoKmIpLT5uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLW1hbmdsZV9kZWZzICgpCi17Ci0gIC8qIEZpcnN0IHdvcmsgb3V0IHRoZSBtaW5pbXVtIG9yZGluYWwgY2hvc2VuICovCi0KLSAgZXhwb3J0X3R5cGUgKmV4cDsKLQotICBpbnQgaTsKLSAgaW50IGhpbnQgPSAwOwotICBleHBvcnRfdHlwZSAqKmRfZXhwb3J0X3ZlYwotICA9IChleHBvcnRfdHlwZSAqKikgeG1hbGxvYyAoc2l6ZW9mIChleHBvcnRfdHlwZSAqKSAqIGRfbmZ1bmNzKTsKLQotICBpbmZvcm0gKF8oIlByb2Nlc3NpbmcgZGVmaW5pdGlvbnMiKSk7Ci0gIAotICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0gICAgewotICAgICAgZF9leHBvcnRfdmVjW2ldID0gZXhwOwotICAgIH0KLQotICBwcm9jZXNzX2R1cGxpY2F0ZXMgKGRfZXhwb3J0X3ZlYyk7Ci0gIGZpbGxfb3JkaW5hbHMgKGRfZXhwb3J0X3ZlYyk7Ci0KLSAgLyogUHV0IGJhY2sgdGhlIGxpc3QgaW4gdGhlIG5ldyBvcmRlciAqLwotICBkX2V4cG9ydHMgPSAwOwotICBmb3IgKGkgPSBkX25mdW5jcyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGRfZXhwb3J0X3ZlY1tpXS0+bmV4dCA9IGRfZXhwb3J0czsKLSAgICAgIGRfZXhwb3J0cyA9IGRfZXhwb3J0X3ZlY1tpXTsKLSAgICB9Ci0KLSAgLyogQnVpbGQgbGlzdCBpbiBhbHBoYSBvcmRlciAqLwotICBkX2V4cG9ydHNfbGV4aWNhbGx5ID0gKGV4cG9ydF90eXBlICoqKQotICAgIHhtYWxsb2MgKHNpemVvZiAoZXhwb3J0X3R5cGUgKikgKiAoZF9uZnVuY3MgKyAxKSk7Ci0KLSAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotICAgIHsKLSAgICAgIGRfZXhwb3J0c19sZXhpY2FsbHlbaV0gPSBleHA7Ci0gICAgfQotICBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldID0gMDsKLQotICBxc29ydCAoZF9leHBvcnRzX2xleGljYWxseSwgaSwgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgYWxwaGFmdW5jKTsKLQotICAvKiBGaWxsIGV4cCBlbnRyaWVzIHdpdGggdGhlaXIgaGludCB2YWx1ZXMgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIWRfZXhwb3J0c19sZXhpY2FsbHlbaV0tPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCWRfZXhwb3J0c19sZXhpY2FsbHlbaV0tPmhpbnQgPSBoaW50Kys7Ci0gICAgfQotICAKLSAgaW5mb3JtIChfKCJQcm9jZXNzZWQgZGVmaW5pdGlvbnMiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgLyogeGdldGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJVc2FnZSAlcyA8b3B0aW9ucz4gPG9iamVjdC1maWxlcz5cbiIpLCBwcm9ncmFtX25hbWUpOwotICAvKiB4Z2V0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1tIC0tbWFjaGluZSA8bWFjaGluZT4gICAgQ3JlYXRlIGFzIERMTCBmb3IgPG1hY2hpbmU+LiAgW2RlZmF1bHQ6ICVzXVxuIiksIG1uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgICAgICBwb3NzaWJsZSA8bWFjaGluZT46IGFybVtfaW50ZXJ3b3JrXSwgaTM4NiwgbWNvcmVbLWVsZl17LWxlfC1iZX0sIHBwYywgdGh1bWJcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWUgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBleHBvcnQgZmlsZS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWwgLS1vdXRwdXQtbGliIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBpbnRlcmZhY2UgbGlicmFyeS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWEgLS1hZGQtaW5kaXJlY3QgICAgICAgICBBZGQgZGxsIGluZGlyZWN0cyB0byBleHBvcnQgZmlsZS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLUQgLS1kbGxuYW1lIDxuYW1lPiAgICAgICBOYW1lIG9mIGlucHV0IGRsbCB0byBwdXQgaW50byBpbnRlcmZhY2UgbGliLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtZCAtLWlucHV0LWRlZiA8ZGVmZmlsZT4gIE5hbWUgb2YgLmRlZiBmaWxlIHRvIGJlIHJlYWQgaW4uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC16IC0tb3V0cHV0LWRlZiA8ZGVmZmlsZT4gTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgY3JlYXRlZC5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgICAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICBFeHBvcnQgYWxsIHN5bWJvbHMgdG8gLmRlZlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLW5vLWV4cG9ydC1hbGwtc3ltYm9scyAgT25seSBleHBvcnQgbGlzdGVkIHN5bWJvbHNcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgICAgLS1leGNsdWRlLXN5bWJvbHMgPGxpc3Q+IERvbid0IGV4cG9ydCA8bGlzdD5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgICAgLS1uby1kZWZhdWx0LWV4Y2x1ZGVzICBDbGVhciBkZWZhdWx0IGV4Y2x1ZGUgc3ltYm9sc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtYiAtLWJhc2UtZmlsZSA8YmFzZWZpbGU+IFJlYWQgbGlua2VyIGdlbmVyYXRlZCBiYXNlIGZpbGUuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC14IC0tbm8taWRhdGE0ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNCBzZWN0aW9uLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtYyAtLW5vLWlkYXRhNSAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDUgc2VjdGlvbi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLVUgLS1hZGQtdW5kZXJzY29yZSAgICAgICBBZGQgdW5kZXJzY29yZXMgdG8gc3ltYm9scyBpbiBpbnRlcmZhY2UgbGlicmFyeS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWsgLS1raWxsLWF0ICAgICAgICAgICAgICBLaWxsIEA8bj4gZnJvbSBleHBvcnRlZCBuYW1lcy5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLUEgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICBBZGQgYWxpYXNlcyB3aXRob3V0IEA8bj4uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1TIC0tYXMgPG5hbWU+ICAgICAgICAgICAgVXNlIDxuYW1lPiBmb3IgYXNzZW1ibGVyLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtZiAtLWFzLWZsYWdzIDxmbGFncz4gICAgIFBhc3MgPGZsYWdzPiB0byB0aGUgYXNzZW1ibGVyLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtQyAtLWNvbXBhdC1pbXBsaWIgICAgICAgIENyZWF0ZSBiYWNrd2FyZCBjb21wYXRpYmxlIGltcG9ydCBsaWJyYXJ5LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtbiAtLW5vLWRlbGV0ZSAgICAgICAgICAgIEtlZXAgdGVtcCBmaWxlcyAocmVwZWF0IGZvciBleHRyYSBwcmVzZXJ2YXRpb24pLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtdiAtLXZlcmJvc2UgICAgICAgICAgICAgIEJlIHZlcmJvc2UuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1WIC0tdmVyc2lvbiAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcHJvZ3JhbSB2ZXJzaW9uLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtaCAtLWhlbHAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvbi5cbiIpKTsKLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtTSAtLW1jb3JlLWVsZiA8b3V0bmFtZT4gIFByb2Nlc3MgbWNvcmUtZWxmIG9iamVjdCBmaWxlcyBpbnRvIDxvdXRuYW1lPi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLUwgLS1saW5rZXIgPG5hbWU+ICAgICAgICBVc2UgPG5hbWU+IGFzIHRoZSBsaW5rZXIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1GIC0tbGlua2VyLWZsYWdzIDxmbGFncz4gUGFzcyA8ZmxhZ3M+IHRvIHRoZSBsaW5rZXIuXG4iKSk7Ci0jZW5kaWYKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotI2RlZmluZSBPUFRJT05fRVhQT1JUX0FMTF9TWU1TCQkxNTAKLSNkZWZpbmUgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUwkoT1BUSU9OX0VYUE9SVF9BTExfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9FWENMVURFX1NZTVMJCShPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0RFRkFVTFRfRVhDTFVERVMJKE9QVElPTl9FWENMVURFX1NZTVMgKyAxKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsibm8tZGVsZXRlIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCi0gIHsiZGxsbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnRCd9LAotICB7Im5vLWlkYXRhNCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAneCd9LAotICB7Im5vLWlkYXRhNSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYyd9LAotICB7Im91dHB1dC1leHAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKLSAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd6J30sCi0gIHsiZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlRfQUxMX1NZTVN9LAotICB7Im5vLWV4cG9ydC1hbGwtc3ltYm9scyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TfSwKLSAgeyJleGNsdWRlLXN5bWJvbHMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYQ0xVREVfU1lNU30sCi0gIHsibm8tZGVmYXVsdC1leGNsdWRlcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFU30sCi0gIHsib3V0cHV0LWxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAotICB7ImRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZCd9LCAvKiBmb3IgY29tcGF0aWJsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgKi8KLSAgeyJpbnB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2QnfSwKLSAgeyJhZGQtdW5kZXJzY29yZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVSd9LAotICB7ImtpbGwtYXQiLCBub19hcmd1bWVudCwgTlVMTCwgJ2snfSwKLSAgeyJhZGQtc3RkY2FsbC1hbGlhcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAotICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3YnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsICdWJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7Im1hY2hpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ20nfSwKLSAgeyJhZGQtaW5kaXJlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgJ2EnfSwKLSAgeyJiYXNlLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKLSAgeyJhcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAotICB7ImFzLWZsYWdzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gIHsibWNvcmUtZWxmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdNJ30sCi0gIHsiY29tcGF0LWltcGxpYiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnQyd9LAotICB7TlVMTCwwLE5VTEwsMH0KLX07Ci0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgaW50IGM7Ci0gIGludCBpOwotICBjaGFyICpmaXJzdGFyZyA9IDA7Ci0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICBvYXYgPSBhdjsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhYywgYXYsCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYJCQkgICAKLQkJCSAgICJtOmU6bDphRDpkOno6Yjp4Y0N1VWtBUzpmOm52VmhNOkw6RjoiLAotI2Vsc2UKLQkJCSAgICJtOmU6bDphRDpkOno6Yjp4Y0N1VWtBUzpmOm52VmgiLAotI2VuZGlmCi0JCQkgICBsb25nX29wdGlvbnMsIDApKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlIE9QVElPTl9FWFBPUlRfQUxMX1NZTVM6Ci0JICBleHBvcnRfYWxsX3N5bWJvbHMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TOgotCSAgZXhwb3J0X2FsbF9zeW1ib2xzID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FWENMVURFX1NZTVM6Ci0JICBhZGRfZXhjbHVkZXMgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTOgotCSAgZG9fZGVmYXVsdF9leGNsdWRlcyA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBub19pZGF0YTQgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBub19pZGF0YTUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JICBhc19uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBhc19mbGFncyA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JICAvKiBpZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5ICovCi0JY2FzZSAndSc6Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIGFkZF9pbmRpcmVjdCA9IDE7Ci0JICBicmVhazsKLQljYXNlICd6JzoKLQkgIG91dHB1dF9kZWYgPSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XVCk7Ci0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGRsbF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICBpbXBfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZXhwX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnbSc6Ci0JICBtbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgdmVyYm9zZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHByaW50X3ZlcnNpb24gKHByb2dyYW1fbmFtZSk7Ci0JICBicmVhazsKLQljYXNlICdVJzoKLQkgIGFkZF91bmRlcnNjb3JlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2snOgotCSAga2lsbGF0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotCSAgYWRkX3N0ZGNhbGxfYWxpYXMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkZWZfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgZG9udGRlbHRlbXBzKys7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIGJhc2VfZmlsZSA9IGZvcGVuIChvcHRhcmcsIEZPUEVOX1JCKTsKLQkgIAotCSAgaWYgKCFiYXNlX2ZpbGUpCi0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGZhdGFsIChfKCJVbmFibGUgdG8gb3BlbiBiYXNlLWZpbGU6ICVzIiksIG9wdGFyZyk7Ci0KLQkgIGJyZWFrOwotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0JY2FzZSAnTSc6Ci0JICBtY29yZV9lbGZfb3V0X2ZpbGUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLQkgIG1jb3JlX2VsZl9saW5rZXIgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIG1jb3JlX2VsZl9saW5rZXJfZmxhZ3MgPSBvcHRhcmc7Ci0JICBicmVhazsKLSNlbmRpZgotCWNhc2UgJ0MnOgotCSAgY3JlYXRlX2NvbXBhdF9pbXBsaWIgPSAxOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmb3IgKGkgPSAwOyBtdGFibGVbaV0udHlwZTsgaSsrKQotICAgIGlmIChzdHJjbXAgKG10YWJsZVtpXS50eXBlLCBtbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotCi0gIGlmICghbXRhYmxlW2ldLnR5cGUpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiTWFjaGluZSAnJXMnIG5vdCBzdXBwb3J0ZWQiKSwgbW5hbWUpOwotCi0gIG1hY2hpbmUgPSBpOwotCi0gIGlmICghZGxsX25hbWUgJiYgZXhwX25hbWUpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoZXhwX25hbWUpICsgNTsKLSAgICAgIGRsbF9uYW1lID0geG1hbGxvYyAobGVuKTsKLSAgICAgIHN0cmNweSAoZGxsX25hbWUsIGV4cF9uYW1lKTsKLSAgICAgIHN0cmNhdCAoZGxsX25hbWUsICIuZGxsIik7Ci0gICAgfQotCi0gIGlmIChhc19uYW1lID09IE5VTEwpCi0gICAgYXNfbmFtZSA9IGRlZHVjZV9uYW1lICgiYXMiKTsKLSAgCi0gIC8qIERvbid0IHVzZSB0aGUgZGVmYXVsdCBleGNsdWRlIGxpc3QgaWYgd2UncmUgcmVhZGluZyBvbmx5IHRoZQotICAgICBzeW1ib2xzIGluIHRoZSAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGRlZmF1bHQgZXhjbHVkZXMgYXJlIG1lYW50Ci0gICAgIHRvIGF2b2lkIGV4cG9ydGluZyBETEwgZW50cnkgcG9pbnQgYW5kIEN5Z3dpbjMyIGltcHVyZV9wdHIuICAqLwotICBpZiAoISBleHBvcnRfYWxsX3N5bWJvbHMpCi0gICAgZG9fZGVmYXVsdF9leGNsdWRlcyA9IGZhbHNlOwotICAKLSAgaWYgKGRvX2RlZmF1bHRfZXhjbHVkZXMpCi0gICAgc2V0X2RlZmF1bHRfZXhjbHVkZXMgKCk7Ci0KLSAgaWYgKGRlZl9maWxlKQotICAgIHByb2Nlc3NfZGVmX2ZpbGUgKGRlZl9maWxlKTsKLQotICB3aGlsZSAob3B0aW5kIDwgYWMpCi0gICAgewotICAgICAgaWYgKCFmaXJzdGFyZykKLQlmaXJzdGFyZyA9IGF2W29wdGluZF07Ci0gICAgICBzY2FuX29ial9maWxlIChhdltvcHRpbmRdKTsKLSAgICAgIG9wdGluZCsrOwotICAgIH0KLQotICBtYW5nbGVfZGVmcyAoKTsKLQotICBpZiAoZXhwX25hbWUpCi0gICAgZ2VuX2V4cF9maWxlICgpOwotICAKLSAgaWYgKGltcF9uYW1lKQotICAgIHsKLSAgICAgIC8qIE1ha2UgaW1wX25hbWUgc2FmZSBmb3IgdXNlIGFzIGEgbGFiZWwuICovCi0gICAgICBjaGFyICpwOwotCi0gICAgICBpbXBfbmFtZV9sYWIgPSB4c3RyZHVwIChpbXBfbmFtZSk7Ci0gICAgICBmb3IgKHAgPSBpbXBfbmFtZV9sYWI7ICpwOyBwKyspCi0JewotCSAgaWYgKCFpc2FscGhhICgodW5zaWduZWQgY2hhcikgKnApICYmICFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKQotCSAgICAqcCA9ICdfJzsKLQl9Ci0gICAgICBoZWFkX2xhYmVsID0gbWFrZV9sYWJlbCgiX2hlYWRfIiwgaW1wX25hbWVfbGFiKTsKLSAgICAgIGdlbl9saWJfZmlsZSAoKTsKLSAgICB9Ci0gIAotICBpZiAob3V0cHV0X2RlZikKLSAgICBnZW5fZGVmX2ZpbGUgKCk7Ci0gIAotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gIGlmIChtY29yZV9lbGZfb3V0X2ZpbGUpCi0gICAgbWNvcmVfZWxmX2dlbl9vdXRfZmlsZSAoKTsKLSNlbmRpZgotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIExvb2sgZm9yIHRoZSBwcm9ncmFtIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIFBST0dfTkFNRSBhbmQgdGhlCi0gICBzdHJpbmcgcnVubmluZyBmcm9tIFBSRUZJWCB0byBFTkRfUFJFRklYLiAgSWYgdGhlIGNvbmNhdGVuYXRlZAotICAgc3RyaW5nIGNvbnRhaW5zIGEgJy8nLCB0cnkgYXBwZW5kaW5nIEVYRUNVVEFCTEVfU1VGRklYIGlmIGl0IGlzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWxvb2tfZm9yX3Byb2cgKHByb2dfbmFtZSwgcHJlZml4LCBlbmRfcHJlZml4KQotICAgICBjb25zdCBjaGFyICpwcm9nX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgICAgaW50IGVuZF9wcmVmaXg7Ci17Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGNoYXIgKmNtZDsKLQotICBjbWQgPSB4bWFsbG9jIChzdHJsZW4gKHByZWZpeCkgCi0gICAgICAgICAgICAgICAgICsgc3RybGVuIChwcm9nX25hbWUpIAotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLSAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKEVYRUNVVEFCTEVfU1VGRklYKSAKLSNlbmRpZgotCQkgKyAxMCk7Ci0gIHN0cmNweSAoY21kLCBwcmVmaXgpOwotCi0gIHNwcmludGYgKGNtZCArIGVuZF9wcmVmaXgsICIlcyIsIHByb2dfbmFtZSk7Ci0KLSAgaWYgKHN0cmNociAoY21kLCAnLycpICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGZvdW5kOwotCi0gICAgICBmb3VuZCA9IChzdGF0IChjbWQsICZzKSA9PSAwCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotICAgICAgICAgICAgICAgfHwgc3RhdCAoc3RyY2F0IChjbWQsIEVYRUNVVEFCTEVfU1VGRklYKSwgJnMpID09IDAKLSNlbmRpZgotCSAgICAgICApOwotCi0gICAgICBpZiAoISBmb3VuZCkKLSAgICAgICAgewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGluZm9ybSAoXygiVHJpZWQgZmlsZTogJXMiKSwgY21kKTsKLQkgIGZyZWUgKGNtZCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiVXNpbmcgZmlsZTogJXMiKSwgY21kKTsKLQotICByZXR1cm4gY21kOwotfQotCi0vKiBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gd2UgYXJlIHdhbnQgdG8gaW52b2tlLgotICAgUFJPR19OQU1FIGlzIHRoZSBiYXNpYyBuYW1lIG9mIHRoZSBwcm9ncmFtIHdlIHdhbnQgdG8gcnVuLAotICAgZWcgImFzIiBvciAibGQiLiAgVGhlIGNhdGNoIGlzIHRoYXQgd2UgbWlnaHQgd2FudCBhY3R1YWxseQotICAgcnVuICJpMzg2LXBlLWFzIiBvciAicHBjLXBlLWxkIi4gIAotCi0gICBJZiBhcmd2WzBdIGNvbnRhaW5zIHRoZSBmdWxsIHBhdGgsIHRoZW4gdHJ5IHRvIGZpbmQgdGhlIHByb2dyYW0KLSAgIGluIHRoZSBzYW1lIHBsYWNlLCB3aXRoIGFuZCB0aGVuIHdpdGhvdXQgYSB0YXJnZXQtbGlrZSBwcmVmaXguCi0KLSAgIEdpdmVuLCBhcmd2WzBdID0gL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1kbGx0b29sLAotICAgZGVkdWNlX25hbWUoImFzIikgdXNlcyB0aGUgZm9sbG93aW5nIHNlYXJjaCBvcmRlcjogCi0KLSAgICAgL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1hcwotICAgICAvdXNyL2xvY2FsL2Jpbi9hcwotICAgICBhcwotICAgCi0gICBJZiB0aGVyZSdzIGFuIEVYRUNVVEFCTEVfU1VGRklYLCBpdCdsbCB1c2UgdGhhdCBhcyB3ZWxsOyBmb3IgZWFjaAotICAgbmFtZSwgaXQnbGwgdHJ5IHdpdGhvdXQgYW5kIHRoZW4gd2l0aCBFWEVDVVRBQkxFX1NVRkZJWC4KLQotICAgR2l2ZW4sIGFyZ3ZbMF0gPSBpNTg2LWN5Z3dpbjMyLWRsbHRvb2wsIGl0IHdpbGwgbm90IGV2ZW4gdHJ5ICJhcyIKLSAgIGFzIHRoZSBmYWxsYmFjaywgYnV0IHJhdGhlciByZXR1cm4gaTU4Ni1jeWd3aW4zMi1hcy4KLSAgICAgCi0gICBPaCwgYW5kIGdpdmVuLCBhcmd2WzBdID0gZGxsdG9vbCwgaXQnbGwgcmV0dXJuICJhcyIuCi0KLSAgIFJldHVybnMgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZGVkdWNlX25hbWUgKHByb2dfbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcHJvZ19uYW1lOwotewotICBjaGFyICpjbWQ7Ci0gIGNoYXIgKmRhc2gsICpzbGFzaCwgKmNwOwotCi0gIGRhc2ggPSBOVUxMOwotICBzbGFzaCA9IE5VTEw7Ci0gIGZvciAoY3AgPSBwcm9ncmFtX25hbWU7ICpjcCAhPSAnXDAnOyArK2NwKQotICAgIHsKLSAgICAgIGlmICgqY3AgPT0gJy0nKQotCWRhc2ggPSBjcDsKLSAgICAgIGlmICgKLSNpZiBkZWZpbmVkKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0JICAqY3AgPT0gJzonIHx8ICpjcCA9PSAnXFwnIHx8Ci0jZW5kaWYKLQkgICpjcCA9PSAnLycpCi0JewotCSAgc2xhc2ggPSBjcDsKLQkgIGRhc2ggPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgY21kID0gTlVMTDsKLQotICBpZiAoZGFzaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZpcnN0LCB0cnkgbG9va2luZyBmb3IgYSBwcmVmaXhlZCBQUk9HX05BTUUgaW4gdGhlCi0gICAgICAgICBQUk9HUkFNX05BTUUgZGlyZWN0b3J5LCB3aXRoIHRoZSBzYW1lIHByZWZpeCBhcyBQUk9HUkFNX05BTUUuICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIGRhc2ggLSBwcm9ncmFtX25hbWUgKyAxKTsKLSAgICB9Ci0KLSAgaWYgKHNsYXNoICE9IE5VTEwgJiYgY21kID09IE5VTEwpCi0gICAgewotICAgICAgLyogTmV4dCwgdHJ5IGxvb2tpbmcgZm9yIGEgUFJPR19OQU1FIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcwotICAgICAgICAgdGhhdCBvZiB0aGlzIHByb2dyYW0uICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIHNsYXNoIC0gcHJvZ3JhbV9uYW1lICsgMSk7Ci0gICAgfQotCi0gIGlmIChjbWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBKdXN0IHJldHVybiBQUk9HX05BTUUgYXMgaXMuICAqLwotICAgICAgY21kID0geHN0cmR1cCAocHJvZ19uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNtZDsKLX0KLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi10eXBlZGVmIHN0cnVjdCBmbmFtZV9jYWNoZQotewotICBjaGFyICogICAgICAgICAgICAgICBmaWxlbmFtZTsKLSAgc3RydWN0IGZuYW1lX2NhY2hlICogbmV4dDsKLX0KLWZuYW1lX2NhY2hlOwotCi1zdGF0aWMgZm5hbWVfY2FjaGUgZm5hbWVzOwotCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2NhY2hlX2ZpbGVuYW1lIChjaGFyICogZmlsZW5hbWUpCi17Ci0gIGZuYW1lX2NhY2hlICogcHRyOwotCi0gIHB0ciA9ICYgZm5hbWVzOwotCi0gIHdoaWxlIChwdHItPm5leHQgIT0gTlVMTCkKLSAgICBwdHIgPSBwdHItPm5leHQ7Ci0KLSAgcHRyLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBwdHItPm5leHQgICAgID0gKGZuYW1lX2NhY2hlICopIG1hbGxvYyAoc2l6ZW9mIChmbmFtZV9jYWNoZSkpOwotICBpZiAocHRyLT5uZXh0ICE9IE5VTEwpCi0gICAgcHRyLT5uZXh0LT5uZXh0ID0gTlVMTDsKLX0KLQotI2RlZmluZSBNQ09SRV9FTEZfVE1QX09CSiAibWNvcmVlbGYubyIKLSNkZWZpbmUgTUNPUkVfRUxGX1RNUF9FWFAgIm1jb3JlZWxmLmV4cCIKLSNkZWZpbmUgTUNPUkVfRUxGX1RNUF9MSUIgIm1jb3JlZWxmLmxpYiIKLQotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUgKHZvaWQpCi17Ci0gIGZuYW1lX2NhY2hlICogcHRyOwotICBkeW5fc3RyaW5nX3QgZHM7Ci0KLSAgLyogU3RlcCBvbmUuICBSdW4gJ2xkIC1yJyBvbiB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzIGluIG9yZGVyIHRvIHJlc29sdmUKLSAgICAgYW55IGludGVybmFsIHJlZmVyZW5jZXMgYW5kIHRvIGdlbmVyYXRlIGEgc2luZ2xlIC5leHBvcnRzIHNlY3Rpb24uICAqLwotICBwdHIgPSAmIGZuYW1lczsKLQotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICItciAiKTsKLQotICBpZiAobWNvcmVfZWxmX2xpbmtlcl9mbGFncyAhPSBOVUxMKQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgbWNvcmVfZWxmX2xpbmtlcl9mbGFncyk7Ci0gIAotICB3aGlsZSAocHRyLT5uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBwdHItPmZpbGVuYW1lKTsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAiKTsKLQotICAgICAgcHRyID0gcHRyLT5uZXh0OwotICAgIH0KLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICItbyAiKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX09CSik7Ci0KLSAgaWYgKG1jb3JlX2VsZl9saW5rZXIgPT0gTlVMTCkKLSAgICBtY29yZV9lbGZfbGlua2VyID0gZGVkdWNlX25hbWUgKCJsZCIpOwotICAKLSAgcnVuIChtY29yZV9lbGZfbGlua2VyLCBkcy0+cyk7Ci0KLSAgZHluX3N0cmluZ19kZWxldGUgKGRzKTsKLQotICAvKiBTdGVwIHR3by4gQ3JlYXRlIGEgLmV4cCBmaWxlIGFuZCBhIC5saWIgZmlsZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZS4gCi0gICAgIERvIHRoaXMgYnkgcmVjdXJzaXZlbHkgaW52b2tpbmcgZGxsdG9vbC4uLi4qLwotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1TICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIGFzX25hbWUpOwotICAKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1lICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfRVhQKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1sICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfTElCKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiICIgKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX09CSik7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC12Iik7Ci0gIAotICBpZiAoZG9udGRlbHRlbXBzKQotICAgIHsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAtbiIpOwotICAKLSAgICAgIGlmIChkb250ZGVsdGVtcHMgPiAxKQotCWR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAtbiIpOwotICAgIH0KLQotICAvKiBYWFggLSBGSU1FOiBvdWdodCB0byBjaGVjay9jb3B5IG90aGVyIGNvbW1hbmQgbGluZSBvcHRpb25zIGFzIHdlbGwuICAqLwotICAKLSAgcnVuIChwcm9ncmFtX25hbWUsIGRzLT5zKTsKLQotICBkeW5fc3RyaW5nX2RlbGV0ZSAoZHMpOwotCi0gIC8qIFN0ZXAgZm91ci4gRmVlZCB0aGUgLmV4cCBhbmQgb2JqZWN0IGZpbGVzIHRvIGxkIC1zaGFyZWQgdG8gY3JlYXRlIHRoZSBkbGwuICAqLwotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1zaGFyZWQgIik7Ci0KLSAgaWYgKG1jb3JlX2VsZl9saW5rZXJfZmxhZ3MpCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBtY29yZV9lbGZfbGlua2VyX2ZsYWdzKTsKLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9FWFApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9PQkopOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgLW8gIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgbWNvcmVfZWxmX291dF9maWxlKTsKLQotICBydW4gKG1jb3JlX2VsZl9saW5rZXIsIGRzLT5zKTsKLQotICBkeW5fc3RyaW5nX2RlbGV0ZSAoZHMpOwotCi0gIGlmIChkb250ZGVsdGVtcHMgPT0gMCkKLSAgICB1bmxpbmsgKE1DT1JFX0VMRl9UTVBfRVhQKTsKLQotICBpZiAoZG9udGRlbHRlbXBzIDwgMikKLSAgICB1bmxpbmsgKE1DT1JFX0VMRl9UTVBfT0JKKTsKLX0KLSNlbmRpZiAvKiBETExUT09MX01DT1JFX0VMRiAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGxsdG9vbC5oIGIvYmludXRpbHMvZGxsdG9vbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE2N2M4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RsbHRvb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGRsbHRvb2wuaCAtLSBoZWFkZXIgZmlsZSBmb3IgZGxsdG9vbAotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gdm9pZCBkZWZfY29kZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9kYXRhIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2Rlc2NyaXB0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmX2V4cG9ydHMKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2hlYXBzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfaW1wb3J0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfbGlicmFyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfc3RhY2tzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfdmVyc2lvbiBQQVJBTVMgKChpbnQsIGludCkpOwotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBpbnQgeXlkZWJ1ZzsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIEZJTEUgKnl5aW47Ci1leHRlcm4gaW50IGxpbmVudW1iZXI7CmRpZmYgLS1naXQgYS9iaW51dGlscy9kbGx3cmFwLmMgYi9iaW51dGlscy9kbGx3cmFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YmY1MTkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGxsd3JhcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMyArMCwwIEBACi0vKiBkbGx3cmFwLmMgLS0gd3JhcHBlciBmb3IgRExMVE9PTCBhbmQgR0NDIHRvIGdlbmVyYXRlIFBFIHN0eWxlIERMTHMKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE11bWl0IEtoYW4gKGtoYW5AeHJheWxpdGgud2lzYy5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLwotI2lmbmRlZiBfX0dOVUNfXwotIyBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2Vsc2UgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpJjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykmMDM3NykgIT0gMDE3NyAmJiAoKHcpJn4wMzc3KSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAwMTc3KQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpID4+IDgpICYgMDM3NykKLSNlbmRpZgotI2Vsc2UgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSAmIDB4ZmYpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykgJiAweGZmKSAhPSAwICYmICgodykgJiAweGZmKSAhPSAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpICYgMHhmZjAwKSA+PiA4KQotI2VuZGlmCi0jZW5kaWYgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNlbmRpZiAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotCi1zdGF0aWMgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gIjAuMi40IjsKLXN0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqY3lnd2luX2RyaXZlcl9mbGFncyA9IAotICAiLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMiOwotc3RhdGljIGNoYXIgKm1pbmd3MzJfZHJpdmVyX2ZsYWdzID0gIi1tZGxsIjsKLXN0YXRpYyBjaGFyICpnZW5lcmljX2RyaXZlcl9mbGFncyA9ICItV2wsLS1kbGwiOwotCi1zdGF0aWMgY2hhciAqZW50cnlfcG9pbnQ7Ci0KLXN0YXRpYyBjaGFyICpkbGx0b29sX25hbWUgPSBOVUxMOwotCi1zdGF0aWMgY2hhciAqdGFyZ2V0ID0gVEFSR0VUOwotCi10eXBlZGVmIGVudW0gewotICBVTktOT1dOX1RBUkdFVCwgCi0gIENZR1dJTl9UQVJHRVQsIAotICBNSU5HV19UQVJHRVQKLX0gCi10YXJnZXRfdHlwZTsKLQotc3RhdGljIHRhcmdldF90eXBlIHdoaWNoX3RhcmdldCA9IFVOS05PV05fVEFSR0VUOwotCi1zdGF0aWMgaW50IGRvbnRkZWx0ZW1wcyA9IDA7Ci1zdGF0aWMgaW50IGRyeV9ydW4gPSAwOwotCi1zdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgaW50IHZlcmJvc2UgPSAwOwotCi1zdGF0aWMgY2hhciAqZGxsX2ZpbGVfbmFtZTsKLXN0YXRpYyBjaGFyICpkbGxfbmFtZTsKLXN0YXRpYyBjaGFyICpiYXNlX2ZpbGVfbmFtZTsKLXN0YXRpYyBjaGFyICpleHBfZmlsZV9uYW1lOwotc3RhdGljIGNoYXIgKmRlZl9maWxlX25hbWU7Ci1zdGF0aWMgaW50IGRlbGV0ZV9iYXNlX2ZpbGUgPSAxOwotc3RhdGljIGludCBkZWxldGVfZXhwX2ZpbGUgPSAxOwotc3RhdGljIGludCBkZWxldGVfZGVmX2ZpbGUgPSAxOwotCi1zdGF0aWMgaW50IHJ1biBQQVJBTVMgKChjb25zdCBjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRpc3BsYXkgUEFSQU1TICgoY29uc3QgY2hhciAqLCB2YV9saXN0KSk7Ci1zdGF0aWMgdm9pZCBpbmZvcm0gUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLXN0YXRpYyBjaGFyICpsb29rX2Zvcl9wcm9nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBjaGFyICpkZWR1Y2VfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlbGV0ZV90ZW1wX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGNsZWFudXBfYW5kX2V4aXQgUEFSQU1TICgoaW50IHN0YXR1cykpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUGxlYXNlIGtlZXAgdGhlIGZvbGxvd2luZyA0IHJvdXRpbmVzIGluIHN5bmMgd2l0aCBkbGx0b29sLmM6Ci0gICAgIGRpc3BsYXkgKCkKLSAgICAgaW5mb3JtICgpCi0gICAgIGxvb2tfZm9yX3Byb2cgKCkKLSAgICAgZGVkdWNlX25hbWUgKCkKLSAgIEl0J3Mgbm90IHdvcnRoIHRoZSBoYXNzbGUgdG8gYnJlYWsgdGhlc2Ugb3V0IHNpbmNlIGRsbHdyYXAgd2lsbAotICAgKGhvcGVmdWxseSkgc29vbiBiZSByZXRpcmVkIGluIGZhdm9yIG9mIGBsZCAtLXNoYXJlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5IChtZXNzYWdlLCBhcmdzKQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfbGlzdCAgICAgIGFyZ3M7Ci17Ci0gIGlmIChwcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLQotICBpZiAobWVzc2FnZSBbc3RybGVuIChtZXNzYWdlKSAtIDFdICE9ICdcbicpCi0gICAgZnB1dGMgKCdcbicsIHN0ZGVycik7Ci19ICAKLQotCi1zdGF0aWMgdm9pZAotI2lmZGVmIF9fU1REQ19fCi1pbmZvcm0gKGNvbnN0IGNoYXIgKiBtZXNzYWdlLCAuLi4pCi0jZWxzZQotaW5mb3JtIChtZXNzYWdlLCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2U7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgCi0gIGlmICghdmVyYm9zZSkKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBfX1NURENfXwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLQotICBkaXNwbGF5IChtZXNzYWdlLCBhcmdzKTsKLSAgCi0gIHZhX2VuZCAoYXJncyk7Ci19Ci0KLS8qIExvb2sgZm9yIHRoZSBwcm9ncmFtIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIFBST0dfTkFNRSBhbmQgdGhlCi0gICBzdHJpbmcgcnVubmluZyBmcm9tIFBSRUZJWCB0byBFTkRfUFJFRklYLiAgSWYgdGhlIGNvbmNhdGVuYXRlZAotICAgc3RyaW5nIGNvbnRhaW5zIGEgJy8nLCB0cnkgYXBwZW5kaW5nIEVYRUNVVEFCTEVfU1VGRklYIGlmIGl0IGlzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWxvb2tfZm9yX3Byb2cgKHByb2dfbmFtZSwgcHJlZml4LCBlbmRfcHJlZml4KQotICAgICBjb25zdCBjaGFyICpwcm9nX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgICAgaW50IGVuZF9wcmVmaXg7Ci17Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGNoYXIgKmNtZDsKLQotICBjbWQgPSB4bWFsbG9jIChzdHJsZW4gKHByZWZpeCkgCi0gICAgICAgICAgICAgICAgICsgc3RybGVuIChwcm9nX25hbWUpIAotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLSAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKEVYRUNVVEFCTEVfU1VGRklYKSAKLSNlbmRpZgotCQkgKyAxMCk7Ci0gIHN0cmNweSAoY21kLCBwcmVmaXgpOwotCi0gIHNwcmludGYgKGNtZCArIGVuZF9wcmVmaXgsICIlcyIsIHByb2dfbmFtZSk7Ci0KLSAgaWYgKHN0cmNociAoY21kLCAnLycpICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGZvdW5kOwotCi0gICAgICBmb3VuZCA9IChzdGF0IChjbWQsICZzKSA9PSAwCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotICAgICAgICAgICAgICAgfHwgc3RhdCAoc3RyY2F0IChjbWQsIEVYRUNVVEFCTEVfU1VGRklYKSwgJnMpID09IDAKLSNlbmRpZgotCSAgICAgICApOwotCi0gICAgICBpZiAoISBmb3VuZCkKLSAgICAgICAgewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGluZm9ybSAoXygiVHJpZWQgZmlsZTogJXMiKSwgY21kKTsKLQkgIGZyZWUgKGNtZCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiVXNpbmcgZmlsZTogJXMiKSwgY21kKTsKLQotICByZXR1cm4gY21kOwotfQotCi0vKiBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gd2UgYXJlIHdhbnQgdG8gaW52b2tlLgotICAgUFJPR19OQU1FIGlzIHRoZSBiYXNpYyBuYW1lIG9mIHRoZSBwcm9ncmFtIHdlIHdhbnQgdG8gcnVuLAotICAgZWcgImFzIiBvciAibGQiLiAgVGhlIGNhdGNoIGlzIHRoYXQgd2UgbWlnaHQgd2FudCBhY3R1YWxseQotICAgcnVuICJpMzg2LXBlLWFzIiBvciAicHBjLXBlLWxkIi4gIAotCi0gICBJZiBhcmd2WzBdIGNvbnRhaW5zIHRoZSBmdWxsIHBhdGgsIHRoZW4gdHJ5IHRvIGZpbmQgdGhlIHByb2dyYW0KLSAgIGluIHRoZSBzYW1lIHBsYWNlLCB3aXRoIGFuZCB0aGVuIHdpdGhvdXQgYSB0YXJnZXQtbGlrZSBwcmVmaXguCi0KLSAgIEdpdmVuLCBhcmd2WzBdID0gL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1kbGx0b29sLAotICAgZGVkdWNlX25hbWUoImFzIikgdXNlcyB0aGUgZm9sbG93aW5nIHNlYXJjaCBvcmRlcjogCi0KLSAgICAgL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1hcwotICAgICAvdXNyL2xvY2FsL2Jpbi9hcwotICAgICBhcwotICAgCi0gICBJZiB0aGVyZSdzIGFuIEVYRUNVVEFCTEVfU1VGRklYLCBpdCdsbCB1c2UgdGhhdCBhcyB3ZWxsOyBmb3IgZWFjaAotICAgbmFtZSwgaXQnbGwgdHJ5IHdpdGhvdXQgYW5kIHRoZW4gd2l0aCBFWEVDVVRBQkxFX1NVRkZJWC4KLQotICAgR2l2ZW4sIGFyZ3ZbMF0gPSBpNTg2LWN5Z3dpbjMyLWRsbHRvb2wsIGl0IHdpbGwgbm90IGV2ZW4gdHJ5ICJhcyIKLSAgIGFzIHRoZSBmYWxsYmFjaywgYnV0IHJhdGhlciByZXR1cm4gaTU4Ni1jeWd3aW4zMi1hcy4KLSAgICAgCi0gICBPaCwgYW5kIGdpdmVuLCBhcmd2WzBdID0gZGxsdG9vbCwgaXQnbGwgcmV0dXJuICJhcyIuCi0KLSAgIFJldHVybnMgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZGVkdWNlX25hbWUgKHByb2dfbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcHJvZ19uYW1lOwotewotICBjaGFyICpjbWQ7Ci0gIGNoYXIgKmRhc2gsICpzbGFzaCwgKmNwOwotCi0gIGRhc2ggPSBOVUxMOwotICBzbGFzaCA9IE5VTEw7Ci0gIGZvciAoY3AgPSBwcm9ncmFtX25hbWU7ICpjcCAhPSAnXDAnOyArK2NwKQotICAgIHsKLSAgICAgIGlmICgqY3AgPT0gJy0nKQotCWRhc2ggPSBjcDsKLSAgICAgIGlmICgKLSNpZiBkZWZpbmVkKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0JICAqY3AgPT0gJzonIHx8ICpjcCA9PSAnXFwnIHx8Ci0jZW5kaWYKLQkgICpjcCA9PSAnLycpCi0JewotCSAgc2xhc2ggPSBjcDsKLQkgIGRhc2ggPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgY21kID0gTlVMTDsKLQotICBpZiAoZGFzaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZpcnN0LCB0cnkgbG9va2luZyBmb3IgYSBwcmVmaXhlZCBQUk9HX05BTUUgaW4gdGhlCi0gICAgICAgICBQUk9HUkFNX05BTUUgZGlyZWN0b3J5LCB3aXRoIHRoZSBzYW1lIHByZWZpeCBhcyBQUk9HUkFNX05BTUUuICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIGRhc2ggLSBwcm9ncmFtX25hbWUgKyAxKTsKLSAgICB9Ci0KLSAgaWYgKHNsYXNoICE9IE5VTEwgJiYgY21kID09IE5VTEwpCi0gICAgewotICAgICAgLyogTmV4dCwgdHJ5IGxvb2tpbmcgZm9yIGEgUFJPR19OQU1FIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcwotICAgICAgICAgdGhhdCBvZiB0aGlzIHByb2dyYW0uICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIHNsYXNoIC0gcHJvZ3JhbV9uYW1lICsgMSk7Ci0gICAgfQotCi0gIGlmIChjbWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBKdXN0IHJldHVybiBQUk9HX05BTUUgYXMgaXMuICAqLwotICAgICAgY21kID0geHN0cmR1cCAocHJvZ19uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNtZDsKLX0KLQotc3RhdGljIHZvaWQKLWRlbGV0ZV90ZW1wX2ZpbGVzICgpCi17Ci0gIGlmIChkZWxldGVfYmFzZV9maWxlICYmIGJhc2VfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGlmICh2ZXJib3NlKQotCWZwcmludGYgKHN0ZGVyciwgIiVzIHRlbXBvcmFyeSBiYXNlIGZpbGUgJXNcbiIsCi0JCSBkb250ZGVsdGVtcHMgPyAiS2VlcGluZyIgOiAiRGVsZXRpbmciLAotCSAgICAgICAgIGJhc2VfZmlsZV9uYW1lKTsKLSAgICAgIGlmICghIGRvbnRkZWx0ZW1wcykKLSAgICAgICAgewotICAgICAgICAgIHVubGluayAoYmFzZV9maWxlX25hbWUpOwotCSAgZnJlZSAoYmFzZV9maWxlX25hbWUpOwotCX0KLSAgICB9Ci0gIAotICBpZiAoZGVsZXRlX2V4cF9maWxlICYmIGV4cF9maWxlX25hbWUpCi0gICAgewotICAgICAgaWYgKHZlcmJvc2UpCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgdGVtcG9yYXJ5IGV4cCBmaWxlICVzXG4iLAotCQkgZG9udGRlbHRlbXBzID8gIktlZXBpbmciIDogIkRlbGV0aW5nIiwKLQkgICAgICAgICBleHBfZmlsZV9uYW1lKTsKLSAgICAgIGlmICghIGRvbnRkZWx0ZW1wcykKLSAgICAgICAgewotICAgICAgICAgIHVubGluayAoZXhwX2ZpbGVfbmFtZSk7Ci0gICAgICAgICAgZnJlZSAoZXhwX2ZpbGVfbmFtZSk7Ci0JfQotICAgIH0KLSAgaWYgKGRlbGV0ZV9kZWZfZmlsZSAmJiBkZWZfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGlmICh2ZXJib3NlKQotCWZwcmludGYgKHN0ZGVyciwgIiVzIHRlbXBvcmFyeSBkZWYgZmlsZSAlc1xuIiwKLQkJIGRvbnRkZWx0ZW1wcyA/ICJLZWVwaW5nIiA6ICJEZWxldGluZyIsCi0JICAgICAgICAgZGVmX2ZpbGVfbmFtZSk7Ci0gICAgICBpZiAoISBkb250ZGVsdGVtcHMpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmxpbmsgKGRlZl9maWxlX25hbWUpOwotICAgICAgICAgIGZyZWUgKGRlZl9maWxlX25hbWUpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIAotY2xlYW51cF9hbmRfZXhpdCAoaW50IHN0YXR1cykKLXsKLSAgZGVsZXRlX3RlbXBfZmlsZXMgKCk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0gIAotc3RhdGljIGludAotcnVuICh3aGF0LCBhcmdzKQotICAgICBjb25zdCBjaGFyICp3aGF0OwotICAgICBjaGFyICphcmdzOwotewotICBjaGFyICpzOwotICBpbnQgcGlkLCB3YWl0X3N0YXR1cywgcmV0Y29kZTsKLSAgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKiphcmd2OwotICBjaGFyICplcnJtc2dfZm10LCAqZXJybXNnX2FyZzsKLSAgY2hhciAqdGVtcF9iYXNlID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgaW50IGluX3F1b3RlOwotICBjaGFyIHNlcDsKLQotICBpZiAodmVyYm9zZSB8fCBkcnlfcnVuKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzICVzXG4iLCB3aGF0LCBhcmdzKTsKLQotICAvKiBDb3VudCB0aGUgYXJncyAqLwotICBpID0gMDsKLSAgZm9yIChzID0gYXJnczsgKnM7IHMrKykKLSAgICBpZiAoKnMgPT0gJyAnKQotICAgICAgaSsrOwotICBpKys7Ci0gIGFyZ3YgPSBhbGxvY2EgKHNpemVvZiAoY2hhciAqKSAqIChpICsgMykpOwotICBpID0gMDsKLSAgYXJndltpKytdID0gd2hhdDsKLSAgcyA9IGFyZ3M7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHdoaWxlICgqcyA9PSAnICcgJiYgKnMgIT0gMCkKLQlzKys7Ci0gICAgICBpZiAoKnMgPT0gMCkKLQlicmVhazsKLSAgICAgIGluX3F1b3RlID0gKCpzID09ICdcJycgfHwgKnMgPT0gJyInKTsKLSAgICAgIHNlcCA9IChpbl9xdW90ZSkgPyAqcysrIDogJyAnOwotICAgICAgYXJndltpKytdID0gczsKLSAgICAgIHdoaWxlICgqcyAhPSBzZXAgJiYgKnMgIT0gMCkKLQlzKys7Ci0gICAgICBpZiAoKnMgPT0gMCkKLQlicmVhazsKLSAgICAgICpzKysgPSAwOwotICAgICAgaWYgKGluX3F1b3RlKQotICAgICAgICBzKys7Ci0gICAgfQotICBhcmd2W2krK10gPSBOVUxMOwotCi0gIGlmIChkcnlfcnVuKQotICAgIHJldHVybiAwOwotCi0gIHBpZCA9IHBleGVjdXRlIChhcmd2WzBdLCAoY2hhciAqIGNvbnN0ICopIGFyZ3YsIHByb2dyYW1fbmFtZSwgdGVtcF9iYXNlLAotCQkgICZlcnJtc2dfZm10LCAmZXJybXNnX2FyZywgUEVYRUNVVEVfT05FIHwgUEVYRUNVVEVfU0VBUkNIKTsKLQotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgIGludCBlcnJub192YWwgPSBlcnJubzsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vX3ZhbCkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldGNvZGUgPSAwOwotICBwaWQgPSBwd2FpdCAocGlkLCAmd2FpdF9zdGF0dXMsIDApOwotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB3YWl0OiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIHJldGNvZGUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoV0lGU0lHTkFMRUQgKHdhaXRfc3RhdHVzKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogc3VicHJvY2VzcyBnb3QgZmF0YWwgc2lnbmFsICVkXG4iLAotCSAgICAgICBwcm9ncmFtX25hbWUsIFdURVJNU0lHICh3YWl0X3N0YXR1cykpOwotICAgICAgcmV0Y29kZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChXSUZFWElURUQgKHdhaXRfc3RhdHVzKSkKLSAgICB7Ci0gICAgICBpZiAoV0VYSVRTVEFUVVMgKHdhaXRfc3RhdHVzKSAhPSAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIsCi0JICAJICAgcHJvZ3JhbV9uYW1lLCB3aGF0LCBXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpKTsKLQkgIHJldGNvZGUgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICByZXRjb2RlID0gMTsKLSAgCi0gIHJldHVybiByZXRjb2RlOwotfQotCi1zdGF0aWMgY2hhciAqCi1teWJhc2VuYW1lIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBjaGFyICpiYXNlID0gbmFtZTsKLQotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lID09ICcvJyB8fCAqbmFtZSA9PSAnXFwnKQotCXsKLQkgIGJhc2UgPSBuYW1lICsgMTsKLQl9Ci0gICAgICArK25hbWU7Ci0gICAgfQotICByZXR1cm4gKGNoYXIgKikgYmFzZTsKLX0KLQotc3RhdGljIGludCAKLXN0cmhhc2ggKGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKLSAgdW5zaWduZWQgbG9uZyBoYXNoOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBoYXNoID0gMDsKLSAgbGVuID0gMDsKLSAgcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHN0cjsKLSAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBoYXNoICs9IGMgKyAoYyA8PCAxNyk7Ci0gICAgICBoYXNoIF49IGhhc2ggPj4gMjsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgaGFzaCArPSBsZW4gKyAobGVuIDw8IDE3KTsKLSAgaGFzaCBePSBoYXNoID4+IDI7Ci0KLSAgcmV0dXJuIGhhc2g7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1wcmludF92ZXJzaW9uIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKCJHTlUgJXMgJXNcbiIsIG5hbWUsIHByb2dyYW1fdmVyc2lvbik7Ci0gIHByaW50ZiAoIkNvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIik7Ci0gIHByaW50ZiAoIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpOwotICBleGl0ICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLXVzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsICJVc2FnZSAlcyA8b3B0aW9ucz4gPG9iamVjdC1maWxlcz5cbiIsIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKGZpbGUsICIgIEdlbmVyaWMgb3B0aW9uczpcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1xdWlldCwgLXEgICAgICAgICAgICBXb3JrIHF1aWV0bHlcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS12ZXJib3NlLCAtdiAgICAgICAgICBWZXJib3NlXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgUHJpbnQgZGxsd3JhcCB2ZXJzaW9uXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0taW1wbGliIDxvdXRuYW1lPiAgICAgU3lub255bSBmb3IgLS1vdXRwdXQtbGliXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgT3B0aW9ucyBmb3IgJXM6XG4iLCBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kcml2ZXItbmFtZSA8ZHJpdmVyPiBEZWZhdWx0cyB0byBcImdjY1wiXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZHJpdmVyLWZsYWdzIDxmbGFncz4gT3ZlcnJpZGUgZGVmYXVsdCBsZCBmbGFnc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRsbHRvb2wtbmFtZSA8ZGxsdG9vbD4gRGVmYXVsdHMgdG8gXCJkbGx0b29sXCJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1lbnRyeSA8ZW50cnk+ICAgICAgICBTcGVjaWZ5IGFsdGVybmF0ZSBETEwgZW50cnkgcG9pbnRcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1pbWFnZS1iYXNlIDxiYXNlPiAgICBTcGVjaWZ5IGltYWdlIGJhc2UgYWRkcmVzc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLXRhcmdldCA8bWFjaGluZT4gICAgIGkzODYtY3lnd2luMzIgb3IgaTM4Ni1taW5ndzMyXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZHJ5LXJ1biAgICAgICAgICAgICAgU2hvdyB3aGF0IG5lZWRzIHRvIGJlIHJ1blxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW1uby1jeWd3aW4gICAgICAgICAgIENyZWF0ZSBNaW5ndyBETExcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICBPcHRpb25zIHBhc3NlZCB0byBETExUT09MOlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW1hY2hpbmUgPG1hY2hpbmU+XG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tb3V0cHV0LWV4cCA8b3V0bmFtZT4gR2VuZXJhdGUgZXhwb3J0IGZpbGUuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tb3V0cHV0LWxpYiA8b3V0bmFtZT4gR2VuZXJhdGUgaW5wdXQgbGlicmFyeS5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1hZGQtaW5kaXJlY3QgICAgICAgICBBZGQgZGxsIGluZGlyZWN0cyB0byBleHBvcnQgZmlsZS5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kbGxuYW1lIDxuYW1lPiAgICAgICBOYW1lIG9mIGlucHV0IGRsbCB0byBwdXQgaW50byBvdXRwdXQgbGliLlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRlZiA8ZGVmZmlsZT4gICAgICAgIE5hbWUgaW5wdXQgLmRlZiBmaWxlXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tb3V0cHV0LWRlZiA8ZGVmZmlsZT4gTmFtZSBvdXRwdXQgLmRlZiBmaWxlXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgICBFeHBvcnQgYWxsIHN5bWJvbHMgdG8gLmRlZlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vLWV4cG9ydC1hbGwtc3ltYm9scyAgT25seSBleHBvcnQgLmRyZWN0dmUgc3ltYm9sc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWV4Y2x1ZGUtc3ltYm9scyA8bGlzdD4gRXhjbHVkZSA8bGlzdD4gZnJvbSAuZGVmXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbm8tZGVmYXVsdC1leGNsdWRlcyAgICBaYXAgZGVmYXVsdCBleGNsdWRlIHN5bWJvbHNcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1iYXNlLWZpbGUgPGJhc2VmaWxlPiBSZWFkIGxpbmtlciBnZW5lcmF0ZWQgYmFzZSBmaWxlXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbm8taWRhdGE0ICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ0IHNlY3Rpb25cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1pZGF0YTUgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDUgc2VjdGlvblxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtVSAgICAgICAgICAgICAgICAgICAgIEFkZCB1bmRlcnNjb3JlcyB0byAubGliXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC1rICAgICAgICAgICAgICAgICAgICAgS2lsbCBAPG4+IGZyb20gZXhwb3J0ZWQgbmFtZXNcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICBBZGQgYWxpYXNlcyB3aXRob3V0IEA8bj5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1hcyA8bmFtZT4gICAgICAgICAgICBVc2UgPG5hbWU+IGZvciBhc3NlbWJsZXJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1ub2RlbGV0ZSAgICAgICAgICAgICBLZWVwIHRlbXAgZmlsZXMuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgUmVzdCBhcmUgcGFzc2VkIHVubW9kaWZpZWQgdG8gdGhlIGxhbmd1YWdlIGRyaXZlclxuIik7Ci0gIGZwcmludGYgKGZpbGUsICJcblxuIik7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLSNkZWZpbmUgT1BUSU9OX1NUQVJUCQkxNDkKLQotLyogR0VORVJJQyBvcHRpb25zLiAqLwotI2RlZmluZSBPUFRJT05fUVVJRVQJCShPUFRJT05fU1RBUlQgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSQk9TRQkJKE9QVElPTl9RVUlFVCArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OCQkoT1BUSU9OX1ZFUkJPU0UgKyAxKQotCi0vKiBETExXUkFQIG9wdGlvbnMuICovCi0jZGVmaW5lIE9QVElPTl9EUllfUlVOCQkoT1BUSU9OX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fRFJJVkVSX05BTUUJKE9QVElPTl9EUllfUlVOICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RSSVZFUl9GTEFHUwkoT1BUSU9OX0RSSVZFUl9OQU1FICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RMTFRPT0xfTkFNRQkoT1BUSU9OX0RSSVZFUl9GTEFHUyArIDEpCi0jZGVmaW5lIE9QVElPTl9FTlRSWQkJKE9QVElPTl9ETExUT09MX05BTUUgKyAxKQotI2RlZmluZSBPUFRJT05fSU1BR0VfQkFTRQkoT1BUSU9OX0VOVFJZICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RBUkdFVAkJKE9QVElPTl9JTUFHRV9CQVNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX01OT19DWUdXSU4JKE9QVElPTl9UQVJHRVQgKyAxKQotCi0vKiBETExUT09MIG9wdGlvbnMuICovCi0jZGVmaW5lIE9QVElPTl9OT0RFTEVURQkJKE9QVElPTl9NTk9fQ1lHV0lOICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RMTE5BTUUJCShPUFRJT05fTk9ERUxFVEUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fSURBVEE0IAkoT1BUSU9OX0RMTE5BTUUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fSURBVEE1CShPUFRJT05fTk9fSURBVEE0ICsgMSkKLSNkZWZpbmUgT1BUSU9OX09VVFBVVF9FWFAJKE9QVElPTl9OT19JREFUQTUgKyAxKQotI2RlZmluZSBPUFRJT05fT1VUUFVUX0RFRgkoT1BUSU9OX09VVFBVVF9FWFAgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUX0FMTF9TWU1TCShPUFRJT05fT1VUUFVUX0RFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKE9QVElPTl9FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fRVhDTFVERV9TWU1TCShPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0RFRkFVTFRfRVhDTFVERVMgKE9QVElPTl9FWENMVURFX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fT1VUUFVUX0xJQgkoT1BUSU9OX05PX0RFRkFVTFRfRVhDTFVERVMgKyAxKQotI2RlZmluZSBPUFRJT05fREVGCQkoT1BUSU9OX09VVFBVVF9MSUIgKyAxKQotI2RlZmluZSBPUFRJT05fQUREX1VOREVSU0NPUkUJKE9QVElPTl9ERUYgKyAxKQotI2RlZmluZSBPUFRJT05fS0lMTEFUCQkoT1BUSU9OX0FERF9VTkRFUlNDT1JFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0hFTFAJCShPUFRJT05fS0lMTEFUICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BQ0hJTkUJCShPUFRJT05fSEVMUCArIDEpCi0jZGVmaW5lIE9QVElPTl9BRERfSU5ESVJFQ1QJKE9QVElPTl9NQUNISU5FICsgMSkKLSNkZWZpbmUgT1BUSU9OX0JBU0VfRklMRQkoT1BUSU9OX0FERF9JTkRJUkVDVCArIDEpCi0jZGVmaW5lIE9QVElPTl9BUwkJKE9QVElPTl9CQVNFX0ZJTEUgKyAxKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIC8qIGdlbmVyaWMgb3B0aW9ucy4gKi8KLSAgeyJxdWlldCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncSd9LAotICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3YnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJTSU9OfSwKLSAgeyJpbXBsaWIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09VVFBVVF9MSUJ9LAotCi0gIC8qIGRsbHdyYXAgb3B0aW9ucy4gKi8KLSAgeyJkcnktcnVuIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUllfUlVOfSwKLSAgeyJkcml2ZXItbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFJJVkVSX05BTUV9LAotICB7ImRyaXZlci1mbGFncyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFJJVkVSX0ZMQUdTfSwKLSAgeyJkbGx0b29sLW5hbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RMTFRPT0xfTkFNRX0sCi0gIHsiZW50cnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKLSAgeyJpbWFnZS1iYXNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTUFHRV9CQVNFfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RBUkdFVH0sCi0KLSAgLyogZGxsdG9vbCBvcHRpb25zLiAqLwotICB7Im5vLWRlbGV0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbid9LAotICB7ImRsbG5hbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RMTE5BTUV9LAotICB7Im5vLWlkYXRhNCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fSURBVEE0fSwKLSAgeyJuby1pZGF0YTUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0lEQVRBNX0sCi0gIHsib3V0cHV0LWV4cCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUUFVUX0VYUH0sCi0gIHsib3V0cHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUUFVUX0RFRn0sCi0gIHsiZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlRfQUxMX1NZTVN9LAotICB7Im5vLWV4cG9ydC1hbGwtc3ltYm9scyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TfSwKLSAgeyJleGNsdWRlLXN5bWJvbHMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYQ0xVREVfU1lNU30sCi0gIHsibm8tZGVmYXVsdC1leGNsdWRlcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFU30sCi0gIHsib3V0cHV0LWxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUUFVUX0xJQn0sCi0gIHsiZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERUZ9LAotICB7ImFkZC11bmRlcnNjb3JlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdVJ30sCi0gIHsia2lsbGF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdrJ30sCi0gIHsiYWRkLXN0ZGNhbGwtYWxpYXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ0EnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsibWFjaGluZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFDSElORX0sCi0gIHsiYWRkLWluZGlyZWN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BRERfSU5ESVJFQ1R9LAotICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9GSUxFfSwKLSAgeyJhcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVN9LAotICB7MH0KLX07Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYzsKLSAgaW50IGk7Ci0KLSAgY2hhciAqKnNhdmVkX2FyZ3YgPSAwOwotICBpbnQgY21kbGluZV9sZW4gPSAwOwotCi0gIGludCBleHBvcnRfYWxsID0gMDsKLQotICBpbnQgKmRsbHRvb2xfYXJnX2luZGljZXM7Ci0gIGludCAqZHJpdmVyX2FyZ19pbmRpY2VzOwotCi0gIGNoYXIgKmRyaXZlcl9mbGFncyA9IDA7Ci0gIGNoYXIgKm91dHB1dF9saWJfZmlsZV9uYW1lID0gMDsKLQotICBkeW5fc3RyaW5nX3QgZGxsdG9vbF9jbWRsaW5lOwotICBkeW5fc3RyaW5nX3QgZHJpdmVyX2NtZGxpbmU7Ci0KLSAgaW50IGRlZl9maWxlX3NlZW4gPSAwOwotCi0gIGNoYXIgKmltYWdlX2Jhc2Vfc3RyID0gMDsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotCi0gIHNhdmVkX2FyZ3YgPSAoY2hhciAqKikgeG1hbGxvYyAoYXJnYyAqIHNpemVvZiAoY2hhciopKTsKLSAgZGxsdG9vbF9hcmdfaW5kaWNlcyA9IChpbnQgKikgeG1hbGxvYyAoYXJnYyAqIHNpemVvZiAoaW50KSk7Ci0gIGRyaXZlcl9hcmdfaW5kaWNlcyA9IChpbnQgKikgeG1hbGxvYyAoYXJnYyAqIHNpemVvZiAoaW50KSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhcmdjOyArK2kpIAotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFyZ3ZbaV0pOwotICAgICAgY2hhciAqYXJnID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0gICAgICBzdHJjcHkgKGFyZywgYXJndltpXSk7Ci0gICAgICBjbWRsaW5lX2xlbiArPSBsZW47Ci0gICAgICBzYXZlZF9hcmd2W2ldID0gYXJnOwotICAgICAgZGxsdG9vbF9hcmdfaW5kaWNlc1tpXSA9IDA7Ci0gICAgICBkcml2ZXJfYXJnX2luZGljZXNbaV0gPSAxOwotICAgIH0KLSAgY21kbGluZV9sZW4rKzsKLQotICAvKiBXZSByZWNvZ25pemUgZGxsd3JhcCBhbmQgZGxsdG9vbCBvcHRpb25zLCBhbmQgZXZlcnl0aGluZyBlbHNlIGlzCi0gICAgIHBhc3NlZCBvbnRvIHRoZSBsYW5ndWFnZSBkcml2ZXIgKGVnLiwgdG8gR0NDKS4gV2UgY29sbGVjdCBvcHRpb25zCi0gICAgIHRvIGRsbHRvb2wgYW5kIGRyaXZlciBpbiBkbGx0b29sX2FyZ3MgYW5kIGRyaXZlcl9hcmdzLiAqLwotICAgCi0gIG9wdGVyciA9IDA7Ci0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICJua0FxdmU6VWhvOmw6TDpJOiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBpbnQgZGxsdG9vbF9hcmc7Ci0gICAgICBpbnQgZHJpdmVyX2FyZzsKLSAgICAgIGludCBzaW5nbGVfd29yZF9vcHRpb25fdmFsdWVfcGFpcjsKLQotICAgICAgZGxsdG9vbF9hcmcgPSAwOwotICAgICAgZHJpdmVyX2FyZyA9IDE7Ci0gICAgICBzaW5nbGVfd29yZF9vcHRpb25fdmFsdWVfcGFpciA9IDA7Ci0KLSAgICAgIGlmIChjICE9ICc/JykKLSAgICAgICAgewotCSAgLyogV2UgcmVjb2duaXplIHRoaXMgb3B0aW9uLCBzbyBpdCBoYXMgdG8gYmUgZWl0aGVyIGRsbHdyYXAgb3IKLQkgICAgIGRsbHRvb2wgb3B0aW9uLiBEbyBub3QgcGFzcyB0byBkcml2ZXIgdW5sZXNzIGl0J3Mgb25lIG9mIHRoZQotCSAgICAgZ2VuZXJpYyBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byBhbGwgdGhlIHRvb2xzIChzdWNoIGFzIC12KQotCSAgICAgd2hpY2ggYXJlIGRlYWx0IHdpdGggbGF0ZXIuICovCi0JICBkcml2ZXJfYXJnID0gMDsKLQl9Ci0KLSAgICAgIC8qIGRlYWwgd2l0aCBnZW5lcmljIGFuZCBkbGx3cmFwIG9wdGlvbnMgZmlyc3QuICovCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQljYXNlICdxJzoKLQkgIHZlcmJvc2UgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1ZFUlNJT046Ci0JICBwcmludF92ZXJzaW9uIChwcm9ncmFtX25hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICBlbnRyeV9wb2ludCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0lNQUdFX0JBU0U6Ci0JICBpbWFnZV9iYXNlX3N0ciA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RFRjoKLQkgIGRlZl9maWxlX25hbWUgPSBvcHRhcmc7Ci0JICBkZWZfZmlsZV9zZWVuID0gMTsKLQkgIGRlbGV0ZV9kZWZfZmlsZSA9IDA7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGRvbnRkZWx0ZW1wcyA9IDE7Ci0JICBkbGx0b29sX2FyZyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdvJzoKLQkgIGRsbF9maWxlX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdJJzoKLQljYXNlICdsJzoKLQljYXNlICdMJzoKLQkgIGRyaXZlcl9hcmcgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRExMTkFNRToKLQkgIGRsbF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRFJZX1JVTjoKLQkgIGRyeV9ydW4gPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRFJJVkVSX05BTUU6Ci0JICBkcml2ZXJfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RSSVZFUl9GTEFHUzoKLQkgIGRyaXZlcl9mbGFncyA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RMTFRPT0xfTkFNRToKLQkgIGRsbHRvb2xfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1RBUkdFVDoKLQkgIHRhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX01OT19DWUdXSU46Ci0JICB0YXJnZXQgPSAiaTM4Ni1taW5ndzMyIjsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0JBU0VfRklMRToKLQkgIGJhc2VfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgZGVsZXRlX2Jhc2VfZmlsZSA9IDA7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9PVVRQVVRfRVhQOgotCSAgZXhwX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGRlbGV0ZV9leHBfZmlsZSA9IDA7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FWFBPUlRfQUxMX1NZTVM6Ci0JICBleHBvcnRfYWxsID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX09VVFBVVF9MSUI6Ci0JICBvdXRwdXRfbGliX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJz8nOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGRsbHRvb2xfYXJnID0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIAotICAgICAgLyogSGFuZGxlIHBhc3NpbmcgdGhyb3VnaCAtLW9wdGlvbj12YWx1ZSBjYXNlLiAqLwotICAgICAgaWYgKG9wdGFyZyAKLSAgICAgICAgICAmJiBzYXZlZF9hcmd2W29wdGluZC0xXVswXSA9PSAnLScgCi0gICAgICAgICAgJiYgc2F2ZWRfYXJndltvcHRpbmQtMV1bMV0gPT0gJy0nIAotCSAgJiYgc3RyY2hyIChzYXZlZF9hcmd2W29wdGluZC0xXSwgJz0nKSkKLQlzaW5nbGVfd29yZF9vcHRpb25fdmFsdWVfcGFpciA9IDE7Ci0KLSAgICAgIGlmIChkbGx0b29sX2FyZykKLSAgICAgICAgewotCSAgZGxsdG9vbF9hcmdfaW5kaWNlc1tvcHRpbmQtMV0gPSAxOwotCSAgaWYgKG9wdGFyZyAmJiAhIHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyKQotCSAgICB7Ci0JICAgICAgZGxsdG9vbF9hcmdfaW5kaWNlc1tvcHRpbmQtMl0gPSAxOwotCSAgICB9IAotCX0KLQotICAgICAgaWYgKCEgZHJpdmVyX2FyZykKLSAgICAgICAgewotCSAgZHJpdmVyX2FyZ19pbmRpY2VzW29wdGluZC0xXSA9IDA7Ci0JICBpZiAob3B0YXJnICYmICEgc2luZ2xlX3dvcmRfb3B0aW9uX3ZhbHVlX3BhaXIpCi0JICAgIHsKLQkgICAgICBkcml2ZXJfYXJnX2luZGljZXNbb3B0aW5kLTJdID0gMDsKLQkgICAgfSAKLQl9Ci0gICAgfQotCi0gIC8qIHNhbml0eSBjaGVja3MuICovCi0gIGlmICghIGRsbF9uYW1lICYmICEgZGxsX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICAiJXM6IE11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgb2YgLW8gb3IgLS1kbGxuYW1lIG9wdGlvbnNcbiIsCi0gICAgICAgICAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBlbHNlIGlmICghIGRsbF9uYW1lKQotICAgIHsKLSAgICAgIGRsbF9uYW1lID0geHN0cmR1cCAobXliYXNlbmFtZSAoZGxsX2ZpbGVfbmFtZSkpOwotICAgIH0KLSAgZWxzZSBpZiAoISBkbGxfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGRsbF9maWxlX25hbWUgPSB4c3RyZHVwIChkbGxfbmFtZSk7Ci0gICAgfQotCi0gIC8qIERlZHVjZSBkcml2ZXItbmFtZSBhbmQgZGxsdG9vbC1uYW1lIGZyb20gb3VyIG93bi4gKi8KLSAgaWYgKGRyaXZlcl9uYW1lID09IE5VTEwpCi0gICAgZHJpdmVyX25hbWUgPSBkZWR1Y2VfbmFtZSAoImdjYyIpOwotCi0gIGlmIChkbGx0b29sX25hbWUgPT0gTlVMTCkKLSAgICBkbGx0b29sX25hbWUgPSBkZWR1Y2VfbmFtZSAoImRsbHRvb2wiKTsKLQotICBpZiAoISBkZWZfZmlsZV9zZWVuKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGVwcmVmaXggPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICAgICAgZGVmX2ZpbGVfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZmlsZXByZWZpeCkgKyA1KTsKLSAgICAgIHNwcmludGYgKGRlZl9maWxlX25hbWUsICIlcy5kZWYiLCAKLSAgICAgICAgICAgICAgIChkb250ZGVsdGVtcHMpID8gbXliYXNlbmFtZSAoZmlsZXByZWZpeCkgOiBmaWxlcHJlZml4KTsKLSAgICAgIGRlbGV0ZV9kZWZfZmlsZSA9IDE7Ci0gICAgICBmcmVlIChmaWxlcHJlZml4KTsKLSAgICAgIGRlbGV0ZV9kZWZfZmlsZSA9IDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBubyBleHBvcnQgZGVmaW5pdGlvbiBmaWxlIHByb3ZpZGVkXG4iKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgCi0gICAgICAgICAgICAgICAiZGxsd3JhcCB3aWxsIGNyZWF0ZSBvbmUsIGJ1dCBtYXkgbm90IGJlIHdoYXQgeW91IHdhbnRcbiIpOwotICAgIH0KLSAgCi0gIC8qIHNldCB0aGUgdGFyZ2V0IHBsYXRmb3JtLiAqLwotICBpZiAoc3Ryc3RyICh0YXJnZXQsICJjeWd3aW4iKSkKLSAgICB3aGljaF90YXJnZXQgPSBDWUdXSU5fVEFSR0VUOwotICBlbHNlIGlmIChzdHJzdHIgKHRhcmdldCwgIm1pbmd3IikpCi0gICAgd2hpY2hfdGFyZ2V0ID0gTUlOR1dfVEFSR0VUOwotICBlbHNlIAotICAgIHdoaWNoX3RhcmdldCA9IFVOS05PV05fVEFSR0VUOwotCi0gIC8qIHJlLWNyZWF0ZSB0aGUgY29tbWFuZCBsaW5lcyBhcyBhIHN0cmluZywgdGFraW5nIGNhcmUgdG8gcXVvdGUgc3R1ZmYuICovCi0gIGRsbHRvb2xfY21kbGluZSA9IGR5bl9zdHJpbmdfbmV3IChjbWRsaW5lX2xlbik7Ci0gIGlmICh2ZXJib3NlKQotICAgIHsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsICIgLXYiKTsKLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsICIgLS1kbGxuYW1lICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCBkbGxfbmFtZSk7Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoZGxsdG9vbF9hcmdfaW5kaWNlc1tpXSkKLSAgICAgICAgewotCSAgY2hhciAqYXJnID0gc2F2ZWRfYXJndltpXTsKLSAgICAgICAgICBpbnQgcXVvdGUgPSAoc3RyY2hyIChhcmcsICcgJykgfHwgc3RyY2hyIChhcmcsICdcdCcpKTsKLQkgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIAotCSAgICAgICAgICAgICAgICAgICAgIChxdW90ZSkgPyAiIFwiIiA6ICIgIik7Ci0JICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCBhcmcpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgCi0JICAgICAgICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0JfQotICAgIH0KLQotICBkcml2ZXJfY21kbGluZSA9IGR5bl9zdHJpbmdfbmV3IChjbWRsaW5lX2xlbik7Ci0gIGlmICghIGRyaXZlcl9mbGFncyB8fCBzdHJsZW4gKGRyaXZlcl9mbGFncykgPT0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHdoaWNoX3RhcmdldCkKLSAgICAgICAgewotCWNhc2UgQ1lHV0lOX1RBUkdFVDoKLSAgICAgICAgICBkcml2ZXJfZmxhZ3MgPSBjeWd3aW5fZHJpdmVyX2ZsYWdzOwotCSAgYnJlYWs7Ci0JCi0JY2FzZSBNSU5HV19UQVJHRVQ6Ci0gICAgICAgICAgZHJpdmVyX2ZsYWdzID0gbWluZ3czMl9kcml2ZXJfZmxhZ3M7Ci0JICBicmVhazsKLQkKLQlkZWZhdWx0OgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IGdlbmVyaWNfZHJpdmVyX2ZsYWdzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCBkcml2ZXJfZmxhZ3MpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsICIgLW8gIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZGxsX2ZpbGVfbmFtZSk7Ci0KLSAgaWYgKCEgZW50cnlfcG9pbnQgfHwgc3RybGVuIChlbnRyeV9wb2ludCkgPT0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHdoaWNoX3RhcmdldCkKLSAgICAgICAgewotCWNhc2UgQ1lHV0lOX1RBUkdFVDoKLQkgIGVudHJ5X3BvaW50ID0gIl9fY3lnd2luX2RsbF9lbnRyeUAxMiI7Ci0JICBicmVhazsKLQkKLQljYXNlIE1JTkdXX1RBUkdFVDoKLQkgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQ1JUU3RhcnR1cEAxMiI7Ci0JICBicmVhazsKLQkKLQlkZWZhdWx0OgotICAgICAgICAgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQDEyIjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLWUsIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZW50cnlfcG9pbnQpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZXhjbHVkZS1zeW1ib2w9Iik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgKGVudHJ5X3BvaW50WzBdID09ICdfJykgPyBlbnRyeV9wb2ludCsxIDogZW50cnlfcG9pbnQpOwotCi0gIGlmICghIGltYWdlX2Jhc2Vfc3RyIHx8IHN0cmxlbiAoaW1hZ2VfYmFzZV9zdHIpID09IDApCi0gICAgewotICAgICAgY2hhciAqdG1wYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc2l6ZW9mICgiMHgxMjM0NTY3OCIpICsgMSk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGhhc2ggPSBzdHJoYXNoIChkbGxfZmlsZV9uYW1lKTsKLSAgICAgIHNwcmludGYgKHRtcGJ1ZiwgIjB4JS44bFgiLCAweDYwMDAwMDAwfCgoaGFzaDw8MTYpJjB4RkZDMDAwMCkpOwotICAgICAgaW1hZ2VfYmFzZV9zdHIgPSB0bXBidWY7Ci0gICAgfQotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLS1pbWFnZS1iYXNlLCIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGltYWdlX2Jhc2Vfc3RyKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsICIgLXYiKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoZHJpdmVyX2FyZ19pbmRpY2VzW2ldKQotICAgICAgICB7Ci0JICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOwotICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIiBcIiIgOiAiICIpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCBhcmcpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQl9Ci0gICAgfQotICAKLSAgLyoKLSAgICogU3RlcCBwcmUtMS4gSWYgbm8gLS1kZWYgPEVYUE9SVF9ERUY+IGlzIHNwZWNpZmllZCwgdGhlbiBjcmVhdGUgaXQKLSAgICogYW5kIHRoZW4gcGFzcyBpdCBvbi4KLSAgICovCi0gIAotICBpZiAoISBkZWZfZmlsZV9zZWVuKSAKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGR5bl9zdHJpbmdfdCBzdGVwX3ByZTE7Ci0KLSAgICAgIHN0ZXBfcHJlMSA9IGR5bl9zdHJpbmdfbmV3ICgxMDI0KTsKLQotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIGlmIChleHBvcnRfYWxsKQotCXsKLSAgICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCAiIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9sPSIpOwotICAgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsIAotCSAgIl9jeWd3aW5fZGxsX2VudHJ5QDEyLERsbE1haW5DUlRTdGFydHVwQDEyLERsbE1haW5AMTIsRGxsRW50cnlQb2ludEAxMiIpOwotCX0KLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsICIgLS1vdXRwdXQtZGVmICIpOwotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGVmX2ZpbGVfbmFtZSk7Ci0KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpCi0JewotCSAgaWYgKGRyaXZlcl9hcmdfaW5kaWNlc1tpXSkKLQkgICAgewotCSAgICAgIGNoYXIgKmFyZyA9IHNhdmVkX2FyZ3ZbaV07Ci0JICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJnKTsKLQkgICAgICBpZiAobGVuID49IDIgJiYgYXJnW2xlbi0yXSA9PSAnLicgCi0JICAgICAgICAgICYmIChhcmdbbGVuLTFdID09ICdvJyB8fCBhcmdbbGVuLTFdID09ICdhJykpCi0JCXsKLQkJICBpbnQgcXVvdGUgPSAoc3RyY2hyIChhcmcsICcgJykgfHwgc3RyY2hyIChhcmcsICdcdCcpKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLAotCQkJCSAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCBhcmcpOwotCQkgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsCi0JCQkJICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXBfcHJlMS0+cykpCi0JY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgICAKLSAgICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwX3ByZTEpOwotICAgIH0KLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZGVmICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCBkZWZfZmlsZV9uYW1lKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJETExUT09MIG5hbWUgICAgOiAlc1xuIiwgZGxsdG9vbF9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRMTFRPT0wgb3B0aW9ucyA6ICVzXG4iLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRFJJVkVSIG5hbWUgICAgIDogJXNcbiIsIGRyaXZlcl9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRSSVZFUiBvcHRpb25zICA6ICVzXG4iLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgfQotIAotICAvKgotICAgKiBTdGVwIDEuIENhbGwgR0NDL0xEIHRvIGNyZWF0ZSBiYXNlIHJlbG9jYXRpb24gZmlsZS4gSWYgdXNpbmcgR0NDLCB0aGUKLSAgICogZHJpdmVyIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBnY2MgLVdsLC0tZGxsIC0tV2wsLS1iYXNlLWZpbGUsZm9vLmJhc2UgW3Jlc3Qgb2YgY29tbWFuZCBsaW5lXQotICAgKgotICAgKiBJZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGEgYmFzZSBuYW1lLCBjcmVhdGUgdGVtcG9yYXJ5IG9uZSB0aGF0Ci0gICAqIGlzIGRlbGV0ZWQgYXQgZXhpdC4KLSAgICoKLSAgICovCi0gIAotICBpZiAoISBiYXNlX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlcHJlZml4ID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgICAgIGJhc2VfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDYpOwotICAgICAgc3ByaW50ZiAoYmFzZV9maWxlX25hbWUsICIlcy5iYXNlIiwgCi0gICAgICAgICAgICAgICAoZG9udGRlbHRlbXBzKSA/IG15YmFzZW5hbWUgKGZpbGVwcmVmaXgpIDogZmlsZXByZWZpeCk7Ci0gICAgICBkZWxldGVfYmFzZV9maWxlID0gMTsKLSAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOwotICAgIH0KLSAgCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDEgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGJhc2VfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIi1XbCwtLWJhc2UtZmlsZSwiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDEsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDEtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAxKTsKLSAgfQotCi0KLQotICAvKgotICAgKiBTdGVwIDIuIGdlbmVyYXRlIHRoZSBleHAgZmlsZSBieSBydW5uaW5nIGRsbHRvb2wuIAotICAgKiBkbGx0b29sIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBkbGx0b29sIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIFtyZXN0IG9mIGNvbW1hbmQgbGluZV0KLSAgICoKLSAgICogSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhIGJhc2UgbmFtZSwgY3JlYXRlIHRlbXBvcmFyeSBvbmUgdGhhdAotICAgKiBpcyBkZWxldGVkIGF0IGV4aXQuCi0gICAqCi0gICAqLwotICAKLSAgaWYgKCEgZXhwX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpwID0gc3RycmNociAoZGxsX25hbWUsICcuJyk7Ci0gICAgICBzaXplX3QgcHJlZml4X2xlbiA9IChwKSA/IHAgLSBkbGxfbmFtZSA6IHN0cmxlbiAoZGxsX25hbWUpOwotICAgICAgZXhwX2ZpbGVfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHByZWZpeF9sZW4gKyA0ICsgMSk7Ci0gICAgICBzdHJuY3B5IChleHBfZmlsZV9uYW1lLCBkbGxfbmFtZSwgcHJlZml4X2xlbik7Ci0gICAgICBleHBfZmlsZV9uYW1lW3ByZWZpeF9sZW5dID0gJ1wwJzsKLSAgICAgIHN0cmNhdCAoZXhwX2ZpbGVfbmFtZSwgIi5leHAiKTsKLSAgICAgIGRlbGV0ZV9leHBfZmlsZSA9IDE7Ci0gICAgfQotICAKLSAgewotICAgIGludCBxdW90ZTsKLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDIgPSBkeW5fc3RyaW5nX25ldyAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChiYXNlX2ZpbGVfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsICItLWJhc2UtZmlsZSAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiAiIDogIiAiKTsKLQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIi0tb3V0cHV0LWV4cCAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGV4cF9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIGV4cF9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0KLSAgICBpZiAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgfQotCi0gICAgaWYgKHJ1biAoZGxsdG9vbF9uYW1lLCBzdGVwMi0+cykpCi0gICAgICBjbGVhbnVwX2FuZF9leGl0ICgxKTsKLSAgICAKLSAgICBkeW5fc3RyaW5nX2RlbGV0ZSAoc3RlcDIpOwotICB9Ci0KLSAgLyoKLSAgICogU3RlcCAzLiBDYWxsIEdDQy9MRCB0byBhZ2FpbiwgYWRkaW5nIHRoZSBleHAgZmlsZSB0aGlzIHRpbWUuCi0gICAqIGRyaXZlciBjb21tYW5kIGxpbmUgd2lsbCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAgICogICAgCi0gICAqICAgICUgZ2NjIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIGZvby5leHAgW3Jlc3QgLi4uXQotICAgKi8KLQotICB7Ci0gICAgaW50IHF1b3RlOwotCi0gICAgZHluX3N0cmluZ190IHN0ZXAzID0gZHluX3N0cmluZ19uZXcgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAiLVdsLC0tYmFzZS1maWxlLCIpOwotICAgIHF1b3RlID0gKHN0cmNociAoYmFzZV9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBiYXNlX2ZpbGVfbmFtZSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiICIgOiAiICIpOwotCi0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDMtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAzKTsKLSAgfQotCi0KLSAgLyoKLSAgICogU3RlcCA0LiBSdW4gRExMVE9PTCBhZ2FpbiB1c2luZyB0aGUgc2FtZSBjb21tYW5kIGxpbmUuCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0gICAgZHluX3N0cmluZ190IHN0ZXA0ID0gZHluX3N0cmluZ19uZXcgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiLS1iYXNlLWZpbGUgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJyAnKSAKLSAgICAgICAgICAgICB8fCBzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIGJhc2VfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIgIiA6ICIgIik7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICItLW91dHB1dC1leHAgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoKQotICAgICAgewotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICIgIik7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIH0KLQotICAgIGlmIChvdXRwdXRfbGliX2ZpbGVfbmFtZSkKLSAgICAgIHsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiIC0tb3V0cHV0LWxpYiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBvdXRwdXRfbGliX2ZpbGVfbmFtZSk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXA0LT5zKSkKLSAgICAgIGNsZWFudXBfYW5kX2V4aXQgKDEpOwotICAgIAotICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwNCk7Ci0gIH0KLSAgCi0KLSAgLyoKLSAgICogU3RlcCA1LiBMaW5rIGl0IGFsbCB0b2dldGhlciBhbmQgYmUgZG9uZSB3aXRoIGl0LgotICAgKiBkcml2ZXIgY29tbWFuZCBsaW5lIHdpbGwgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAqICAgIAotICAgKiAgICAlIGdjYyAtV2wsLS1kbGwgZm9vLmV4cCBbcmVzdCAuLi5dCi0gICAqCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDUgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDUsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDUtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXA1KTsKLSAgfQotCi0gIGNsZWFudXBfYW5kX2V4aXQgKDApOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5jIGIvYmludXRpbHMvZHluLXN0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTY0MDE4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKiBBbiBhYnN0cmFjdCBzdHJpbmcgZGF0YXR5cGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLSAgIEdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBiaW51dGlscyBhbmQgZ2NjLgotICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpZmRlZiBJTl9HQ0MKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLSNpbmNsdWRlICJnYW5zaWRlY2wuaCIKLSNlbHNlCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNlbmRpZgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCk7Ci1leHRlcm4gY2hhciAqeHJlYWxsb2MgKCk7Ci0KLS8qIENyZWF0ZSBhIG5ldyBkeW5hbWljIHN0cmluZyBjYXBhYmxlIG9mIGhvbGRpbmcgYXQgbGVhc3QgU1BBQ0UKLSAgIGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLiAgSWYgU1BBQ0UgaXMgMCwgaXQKLSAgIHdpbGwgYmUgc2lsZW50bHkgaW5jcmVhc2VkIHRvIDEuICAqLwotCi1keW5fc3RyaW5nX3QgCi1keW5fc3RyaW5nX25ldyAoc3BhY2UpCi0gICAgIGludCBzcGFjZTsKLXsKLSAgZHluX3N0cmluZ190IHJlc3VsdCA9IChkeW5fc3RyaW5nX3QpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGR5bl9zdHJpbmcpKTsKLSAKLSAgaWYgKHNwYWNlID09IDApCi0gICAgLyogV2UgbmVlZCBhdCBsZWFzdCBvbmUgYnl0ZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdGVybWluYXRpbmcKLSAgICAgICBOVUwuICAqLwotICAgIHNwYWNlID0gMTsKLQotICByZXN1bHQtPmFsbG9jYXRlZCA9IHNwYWNlOwotICByZXN1bHQtPnMgPSAoY2hhciopIHhtYWxsb2MgKHNwYWNlKTsKLSAgcmVzdWx0LT5sZW5ndGggPSAwOwotICByZXN1bHQtPnNbMF0gPSAnXDAnOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IERTLiAgKi8KLQotdm9pZCAKLWR5bl9zdHJpbmdfZGVsZXRlIChkcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotewotICBmcmVlIChkcy0+cyk7Ci0gIGZyZWUgKGRzKTsKLX0KLQotLyogQXBwZW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgUyB0byBEUywgcmVzaXppbmcgRFMgaWYKLSAgIG5lY2Vzc2FyeS4gICovCi0KLWR5bl9zdHJpbmdfdCAKLWR5bl9zdHJpbmdfYXBwZW5kIChkcywgcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBjaGFyICpzOwotewotICBpbnQgbGVuID0gc3RybGVuIChzKTsKLSAgZHluX3N0cmluZ19yZXNpemUgKGRzLCBkcy0+bGVuZ3RoICsgbGVuICsgMSAvKiAnXDAnICovKTsKLSAgc3RyY3B5IChkcy0+cyArIGRzLT5sZW5ndGgsIHMpOwotICBkcy0+bGVuZ3RoICs9IGxlbjsKLQotICByZXR1cm4gZHM7Ci19Ci0KLS8qIEluY3JlYXNlIHRoZSBjYXBhY2l0eSBvZiBEUyBzbyB0aGF0IGl0IGNhbiBob2xkIGF0IGxlYXN0IFNQQUNFCi0gICBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QKLSAgIChhdCBwcmVzZW50KSByZWR1Y2UgdGhlIGNhcGFjaXR5IG9mIERTLiAgKi8KLQotZHluX3N0cmluZ190IAotZHluX3N0cmluZ19yZXNpemUgKGRzLCBzcGFjZSkKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBpbnQgc3BhY2U7Ci17Ci0gIGludCBuZXdfYWxsb2NhdGVkID0gZHMtPmFsbG9jYXRlZDsKLQotICB3aGlsZSAoc3BhY2UgPiBuZXdfYWxsb2NhdGVkKQotICAgIG5ld19hbGxvY2F0ZWQgKj0gMjsKLSAgICAKLSAgaWYgKG5ld19hbGxvY2F0ZWQgIT0gZHMtPmFsbG9jYXRlZCkKLSAgICB7Ci0gICAgICAvKiBXZSBhY3R1YWxseSBuZWVkIG1vcmUgc3BhY2UuICAqLwotICAgICAgZHMtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7Ci0gICAgICBkcy0+cyA9IChjaGFyKikgeHJlYWxsb2MgKGRzLT5zLCBkcy0+YWxsb2NhdGVkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRzOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5oIGIvYmludXRpbHMvZHluLXN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmQyNWMzLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIEFuIGFic3RyYWN0IHN0cmluZyBkYXRhdHlwZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotICAgR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGJpbnV0aWxzIGFuZCBnY2MuCi0gICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZHluX3N0cmluZwotewotICBpbnQgYWxsb2NhdGVkOyAvKiBUaGUgYW1vdW50IG9mIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIHN0cmluZy4gICovCi0gIGludCBsZW5ndGg7IC8qIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICAqLwotICBjaGFyICpzOyAvKiBUaGUgc3RyaW5nIGl0c2VsZiwgTlVMLXRlcm1pbmF0ZWQuICAqLwotfSogZHluX3N0cmluZ190OwotCi1leHRlcm4gZHluX3N0cmluZ190IGR5bl9zdHJpbmdfbmV3ICAgICAgUEFSQU1TKChpbnQpKTsKLWV4dGVybiB2b2lkIGR5bl9zdHJpbmdfZGVsZXRlICAgICAgICAgICBQQVJBTVMoKGR5bl9zdHJpbmdfdCkpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX2FwcGVuZCAgIFBBUkFNUygoZHluX3N0cmluZ190LCBjaGFyKikpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX3Jlc2l6ZSAgIFBBUkFNUygoZHluX3N0cmluZ190LCBpbnQpKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMgYi9iaW51dGlscy9maWxlbW9kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTgxMWJjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogZmlsZW1vZGUuYyAtLSBtYWtlIGEgc3RyaW5nIGRlc2NyaWJpbmcgZmlsZSBtb2RlcwotICAgQ29weXJpZ2h0IChDKSAxOTg1LCA5MCwgOTEsIDk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1zdGF0aWMgY2hhciBmdHlwZWxldCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBzZXRzdCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBjaGFyICopKTsKLQotLyogZmlsZW1vZGVzdHJpbmcgLSBmaWxsIGluIHN0cmluZyBTVFIgd2l0aCBhbiBscy1zdHlsZSBBU0NJSQotICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0X21vZGUgZmllbGQgb2YgZmlsZSBzdGF0cyBibG9jayBTVEFUUC4KLSAgIDEwIGNoYXJhY3RlcnMgYXJlIHN0b3JlZCBpbiBTVFI7IG5vIHRlcm1pbmF0aW5nIG51bGwgaXMgYWRkZWQuCi0gICBUaGUgY2hhcmFjdGVycyBzdG9yZWQgaW4gU1RSIGFyZToKLQotICAgMAlGaWxlIHR5cGUuICAnZCcgZm9yIGRpcmVjdG9yeSwgJ2MnIGZvciBjaGFyYWN0ZXIKLQlzcGVjaWFsLCAnYicgZm9yIGJsb2NrIHNwZWNpYWwsICdtJyBmb3IgbXVsdGlwbGV4LAotCSdsJyBmb3Igc3ltYm9saWMgbGluaywgJ3MnIGZvciBzb2NrZXQsICdwJyBmb3IgZmlmbywKLQknLScgZm9yIGFueSBvdGhlciBmaWxlIHR5cGUKLQotICAgMQkncicgaWYgdGhlIG93bmVyIG1heSByZWFkLCAnLScgb3RoZXJ3aXNlLgotCi0gICAyCSd3JyBpZiB0aGUgb3duZXIgbWF5IHdyaXRlLCAnLScgb3RoZXJ3aXNlLgotCi0gICAzCSd4JyBpZiB0aGUgb3duZXIgbWF5IGV4ZWN1dGUsICdzJyBpZiB0aGUgZmlsZSBpcwotCXNldC11c2VyLWlkLCAnLScgb3RoZXJ3aXNlLgotCSdTJyBpZiB0aGUgZmlsZSBpcyBzZXQtdXNlci1pZCwgYnV0IHRoZSBleGVjdXRlCi0JYml0IGlzbid0IHNldC4KLQotICAgNAkncicgaWYgZ3JvdXAgbWVtYmVycyBtYXkgcmVhZCwgJy0nIG90aGVyd2lzZS4KLQotICAgNQkndycgaWYgZ3JvdXAgbWVtYmVycyBtYXkgd3JpdGUsICctJyBvdGhlcndpc2UuCi0KLSAgIDYJJ3gnIGlmIGdyb3VwIG1lbWJlcnMgbWF5IGV4ZWN1dGUsICdzJyBpZiB0aGUgZmlsZSBpcwotCXNldC1ncm91cC1pZCwgJy0nIG90aGVyd2lzZS4KLQknUycgaWYgaXQgaXMgc2V0LWdyb3VwLWlkIGJ1dCBub3QgZXhlY3V0YWJsZS4KLQotICAgNwkncicgaWYgYW55IHVzZXIgbWF5IHJlYWQsICctJyBvdGhlcndpc2UuCi0KLSAgIDgJJ3cnIGlmIGFueSB1c2VyIG1heSB3cml0ZSwgJy0nIG90aGVyd2lzZS4KLQotICAgOQkneCcgaWYgYW55IHVzZXIgbWF5IGV4ZWN1dGUsICd0JyBpZiB0aGUgZmlsZSBpcyAic3RpY2t5IgotCSh3aWxsIGJlIHJldGFpbmVkIGluIHN3YXAgc3BhY2UgYWZ0ZXIgZXhlY3V0aW9uKSwgJy0nCi0Jb3RoZXJ3aXNlLgotCSdUJyBpZiB0aGUgZmlsZSBpcyBzdGlja3kgYnV0IG5vdCBleGVjdXRhYmxlLiAqLwotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCB1c2VkOyBvbmx5IG1vZGVfc3RyaW5nIGlzIHVzZWQuICAqLwotCi12b2lkCi1maWxlbW9kZXN0cmluZyAoc3RhdHAsIHN0cikKLSAgICAgc3RydWN0IHN0YXQgKnN0YXRwOwotICAgICBjaGFyICpzdHI7Ci17Ci0gIG1vZGVfc3RyaW5nICgodW5zaWduZWQgbG9uZykgc3RhdHAtPnN0X21vZGUsIHN0cik7Ci19Ci0KLSNlbmRpZgotCi0vKiBHZXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBmaWxlIHBlcm1pc3Npb24gYml0cy4gICovCi0KLSNpZm5kZWYgU19JUldYVQotI2RlZmluZSBTX0lSV1hVIDA3MDAKLSNlbmRpZgotI2lmbmRlZiBTX0lSVVNSCi0jZGVmaW5lIFNfSVJVU1IgMDQwMAotI2VuZGlmCi0jaWZuZGVmIFNfSVdVU1IKLSNkZWZpbmUgU19JV1VTUiAwMjAwCi0jZW5kaWYKLSNpZm5kZWYgU19JWFVTUgotI2RlZmluZSBTX0lYVVNSIDAxMDAKLSNlbmRpZgotCi0jaWZuZGVmIFNfSVJXWEcKLSNkZWZpbmUgU19JUldYRyAwMDcwCi0jZW5kaWYKLSNpZm5kZWYgU19JUkdSUAotI2RlZmluZSBTX0lSR1JQIDAwNDAKLSNlbmRpZgotI2lmbmRlZiBTX0lXR1JQCi0jZGVmaW5lIFNfSVdHUlAgMDAyMAotI2VuZGlmCi0jaWZuZGVmIFNfSVhHUlAKLSNkZWZpbmUgU19JWEdSUCAwMDEwCi0jZW5kaWYKLQotI2lmbmRlZiBTX0lSV1hPCi0jZGVmaW5lIFNfSVJXWE8gMDAwNwotI2VuZGlmCi0jaWZuZGVmIFNfSVJPVEgKLSNkZWZpbmUgU19JUk9USCAwMDA0Ci0jZW5kaWYKLSNpZm5kZWYgU19JV09USAotI2RlZmluZSBTX0lXT1RIIDAwMDIKLSNlbmRpZgotI2lmbmRlZiBTX0lYT1RICi0jZGVmaW5lIFNfSVhPVEggMDAwMQotI2VuZGlmCi0KLS8qIExpa2UgZmlsZW1vZGVzdHJpbmcsIGJ1dCBvbmx5IHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBgc3RydWN0IHN0YXQnCi0gICBpcyBnaXZlbiBhcyBhbiBhcmd1bWVudC4gKi8KLQotdm9pZAotbW9kZV9zdHJpbmcgKG1vZGUsIHN0cikKLSAgICAgdW5zaWduZWQgbG9uZyBtb2RlOwotICAgICBjaGFyICpzdHI7Ci17Ci0gIHN0clswXSA9IGZ0eXBlbGV0ICgodW5zaWduZWQgbG9uZykgbW9kZSk7Ci0gIHN0clsxXSA9IChtb2RlICYgU19JUlVTUikgIT0gMCA/ICdyJyA6ICctJzsKLSAgc3RyWzJdID0gKG1vZGUgJiBTX0lXVVNSKSAhPSAwID8gJ3cnIDogJy0nOwotICBzdHJbM10gPSAobW9kZSAmIFNfSVhVU1IpICE9IDAgPyAneCcgOiAnLSc7Ci0gIHN0cls0XSA9IChtb2RlICYgU19JUkdSUCkgIT0gMCA/ICdyJyA6ICctJzsKLSAgc3RyWzVdID0gKG1vZGUgJiBTX0lXR1JQKSAhPSAwID8gJ3cnIDogJy0nOwotICBzdHJbNl0gPSAobW9kZSAmIFNfSVhHUlApICE9IDAgPyAneCcgOiAnLSc7Ci0gIHN0cls3XSA9IChtb2RlICYgU19JUk9USCkgIT0gMCA/ICdyJyA6ICctJzsKLSAgc3RyWzhdID0gKG1vZGUgJiBTX0lXT1RIKSAhPSAwID8gJ3cnIDogJy0nOwotICBzdHJbOV0gPSAobW9kZSAmIFNfSVhPVEgpICE9IDAgPyAneCcgOiAnLSc7Ci0gIHNldHN0ICgodW5zaWduZWQgbG9uZykgbW9kZSwgc3RyKTsKLX0KLQotLyogUmV0dXJuIGEgY2hhcmFjdGVyIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZmlsZSBkZXNjcmliZWQgYnkKLSAgIGZpbGUgbW9kZSBCSVRTOgotICAgJ2QnIGZvciBkaXJlY3RvcmllcwotICAgJ2InIGZvciBibG9jayBzcGVjaWFsIGZpbGVzCi0gICAnYycgZm9yIGNoYXJhY3RlciBzcGVjaWFsIGZpbGVzCi0gICAnbScgZm9yIG11bHRpcGxleG9yIGZpbGVzCi0gICAnbCcgZm9yIHN5bWJvbGljIGxpbmtzCi0gICAncycgZm9yIHNvY2tldHMKLSAgICdwJyBmb3IgZmlmb3MKLSAgICctJyBmb3IgYW55IG90aGVyIGZpbGUgdHlwZS4gKi8KLQotI2lmbmRlZiBTX0lTRElSCi0jaWZkZWYgU19JRkRJUgotI2RlZmluZSBTX0lTRElSKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGRElSKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGRElSKSAqLwotI2RlZmluZSBTX0lTRElSKGkpICgoKGkpICYgMDE3MDAwMCkgPT0gMDQwMDAwKQotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkRJUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNESVIpICovCi0KLSNpZm5kZWYgU19JU0JMSwotI2lmZGVmIFNfSUZCTEsKLSNkZWZpbmUgU19JU0JMSyhpKSAoKChpKSAmIFNfSUZNVCkgPT0gU19JRkJMSykKLSNlbHNlIC8qICEgZGVmaW5lZCAoU19JRkJMSykgKi8KLSNkZWZpbmUgU19JU0JMSyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGQkxLKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0JMSykgKi8KLQotI2lmbmRlZiBTX0lTQ0hSCi0jaWZkZWYgU19JRkNIUgotI2RlZmluZSBTX0lTQ0hSKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGQ0hSKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGQ0hSKSAqLwotI2RlZmluZSBTX0lTQ0hSKGkpIDAKLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSUZDSFIpICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTQ0hSKSAqLwotCi0jaWZuZGVmIFNfSVNGSUZPCi0jaWZkZWYgU19JRklGTwotI2RlZmluZSBTX0lTRklGTyhpKSAoKChpKSAmIFNfSUZNVCkgPT0gU19JRklGTykKLSNlbHNlIC8qICEgZGVmaW5lZCAoU19JRklGTykgKi8KLSNkZWZpbmUgU19JU0ZJRk8oaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRklGTykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNGSUZPKSAqLwotCi0jaWZuZGVmIFNfSVNTT0NLCi0jaWZkZWYgU19JRlNPQ0sKLSNkZWZpbmUgU19JU1NPQ0soaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZTT0NLKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGU09DSykgKi8KLSNkZWZpbmUgU19JU1NPQ0soaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRlNPQ0spICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTU09DSykgKi8KLQotI2lmbmRlZiBTX0lTTE5LCi0jaWZkZWYgU19JRkxOSwotI2RlZmluZSBTX0lTTE5LKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGTE5LKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGTE5LKSAqLwotI2RlZmluZSBTX0lTTE5LKGkpIDAKLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSUZMTkspICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTTE5LKSAqLwotCi1zdGF0aWMgY2hhcgotZnR5cGVsZXQgKGJpdHMpCi0gICAgIHVuc2lnbmVkIGxvbmcgYml0czsKLXsKLSAgaWYgKFNfSVNESVIgKGJpdHMpKQotICAgIHJldHVybiAnZCc7Ci0gIGlmIChTX0lTTE5LIChiaXRzKSkKLSAgICByZXR1cm4gJ2wnOwotICBpZiAoU19JU0JMSyAoYml0cykpCi0gICAgcmV0dXJuICdiJzsKLSAgaWYgKFNfSVNDSFIgKGJpdHMpKQotICAgIHJldHVybiAnYyc7Ci0gIGlmIChTX0lTU09DSyAoYml0cykpCi0gICAgcmV0dXJuICdzJzsKLSAgaWYgKFNfSVNGSUZPIChiaXRzKSkKLSAgICByZXR1cm4gJ3AnOwotCi0jaWZkZWYgU19JRk1UCi0jaWZkZWYgU19JRk1QQwotICBpZiAoKGJpdHMgJiBTX0lGTVQpID09IFNfSUZNUEMKLSAgICAgIHx8IChiaXRzICYgU19JRk1UKSA9PSBTX0lGTVBCKQotICAgIHJldHVybiAnbSc7Ci0jZW5kaWYKLSNpZmRlZiBTX0lGTldLCi0gIGlmICgoYml0cyAmIFNfSUZNVCkgPT0gU19JRk5XSykKLSAgICByZXR1cm4gJ24nOwotI2VuZGlmCi0jZW5kaWYKLQotICByZXR1cm4gJy0nOwotfQotCi0vKiBTZXQgdGhlICdzJyBhbmQgJ3QnIGZsYWdzIGluIGZpbGUgYXR0cmlidXRlcyBzdHJpbmcgQ0hBUlMsCi0gICBhY2NvcmRpbmcgdG8gdGhlIGZpbGUgbW9kZSBCSVRTLiAqLwotCi1zdGF0aWMgdm9pZAotc2V0c3QgKGJpdHMsIGNoYXJzKQotICAgICB1bnNpZ25lZCBsb25nIGJpdHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqY2hhcnMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBTX0lTVUlECi0gIGlmIChiaXRzICYgU19JU1VJRCkKLSAgICB7Ci0gICAgICBpZiAoY2hhcnNbM10gIT0gJ3gnKQotCS8qIFNldC11aWQsIGJ1dCBub3QgZXhlY3V0YWJsZSBieSBvd25lci4gKi8KLQljaGFyc1szXSA9ICdTJzsKLSAgICAgIGVsc2UKLQljaGFyc1szXSA9ICdzJzsKLSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBTX0lTR0lECi0gIGlmIChiaXRzICYgU19JU0dJRCkKLSAgICB7Ci0gICAgICBpZiAoY2hhcnNbNl0gIT0gJ3gnKQotCS8qIFNldC1naWQsIGJ1dCBub3QgZXhlY3V0YWJsZSBieSBncm91cC4gKi8KLQljaGFyc1s2XSA9ICdTJzsKLSAgICAgIGVsc2UKLQljaGFyc1s2XSA9ICdzJzsKLSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBTX0lTVlRYCi0gIGlmIChiaXRzICYgU19JU1ZUWCkKLSAgICB7Ci0gICAgICBpZiAoY2hhcnNbOV0gIT0gJ3gnKQotCS8qIFN0aWNreSwgYnV0IG5vdCBleGVjdXRhYmxlIGJ5IG90aGVycy4gKi8KLQljaGFyc1s5XSA9ICdUJzsKLSAgICAgIGVsc2UKLQljaGFyc1s5XSA9ICd0JzsKLSAgICB9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2llZWUuYyBiL2JpbnV0aWxzL2llZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiYjkzYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9pZWVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjA5ICswLDAgQEAKLS8qIGllZWUuYyAtLSBSZWFkIGFuZCB3cml0ZSBJRUVFLTY5NSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHJlYWRzIGFuZCB3cml0ZXMgSUVFRS02OTUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJpZWVlLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbiBlbnRyeSBvbiB0aGUgYmxvY2sgc3RhY2suICAqLwotCi1zdHJ1Y3QgaWVlZV9ibG9jawotewotICAvKiBUaGUga2luZCBvZiBibG9jay4gICovCi0gIGludCBraW5kOwotICAvKiBUaGUgc291cmNlIGZpbGUgbmFtZSwgZm9yIGEgQkI1IGJsb2NrLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIC8qIFRoZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gdHlwZSwgZm9yIGEgQkI0IG9yIEJCNiBibG9jay4gICovCi0gIHVuc2lnbmVkIGludCBmbmluZHg7Ci0gIC8qIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBza2lwcGVkLiAgKi8KLSAgYm9vbGVhbiBza2lwOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGJsb2NrIHN0YWNrLiAgKi8KLQotI2RlZmluZSBCTE9DS1NUQUNLX1NJWkUgKDE2KQotCi1zdHJ1Y3QgaWVlZV9ibG9ja3N0YWNrCi17Ci0gIC8qIFRoZSBzdGFjayBwb2ludGVyLiAgKi8KLSAgc3RydWN0IGllZWVfYmxvY2sgKmJzcDsKLSAgLyogVGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IGllZWVfYmxvY2sgc3RhY2tbQkxPQ0tTVEFDS19TSVpFXTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHZhcmlhYmxlLiAgKi8KLQotc3RydWN0IGllZWVfdmFyCi17Ci0gIC8qIFN0YXJ0IG9mIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBMZW5ndGggb2YgbmFtZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBTbG90IGlmIHdlIG1ha2UgYW4gaW5kaXJlY3QgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgKnBzbG90OwotICAvKiBLaW5kIG9mIHZhcmlhYmxlIG9yIGZ1bmN0aW9uLiAgKi8KLSAgZW51bQotICAgIHsKLSAgICAgIElFRUVfVU5LTk9XTiwKLSAgICAgIElFRUVfRVhURVJOQUwsCi0gICAgICBJRUVFX0dMT0JBTCwKLSAgICAgIElFRUVfU1RBVElDLAotICAgICAgSUVFRV9MT0NBTCwKLSAgICAgIElFRUVfRlVOQ1RJT04KLSAgICB9IGtpbmQ7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgdGhlIHZhcmlhYmxlcy4gICovCi0KLXN0cnVjdCBpZWVlX3ZhcnMKLXsKLSAgLyogTnVtYmVyIG9mIHNsb3RzIGFsbG9jYXRlZC4gICovCi0gIHVuc2lnbmVkIGludCBhbGxvYzsKLSAgLyogVmFyaWFibGVzLiAgKi8KLSAgc3RydWN0IGllZWVfdmFyICp2YXJzOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgdHlwZS4gIFdlIG5lZWQgdGhpcyBiZWNhdXNlCi0gICB3ZSBkb24ndCB3YW50IHRvIHJlcHJlc2VudCBiaXRmaWVsZHMgYXMgcmVhbCB0eXBlcy4gICovCi0KLXN0cnVjdCBpZWVlX3R5cGUKLXsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogU2xvdCBpZiB0aGlzIGlzIHR5cGUgaXMgcmVmZXJlbmNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4gICovCi0gIGRlYnVnX3R5cGUgKnBzbG90OwotICAvKiBTbG90cyBmb3IgYXJndW1lbnRzIGlmIHdlIG1ha2UgaW5kaXJlY3QgdHlwZXMgZm9yIHRoZW0uICAqLwotICBkZWJ1Z190eXBlICphcmdfc2xvdHM7Ci0gIC8qIElmIHRoaXMgaXMgYSBiaXRmaWVsZCwgdGhpcyBpcyB0aGUgc2l6ZSBpbiBiaXRzLiAgSWYgdGhpcyBpcyBub3QKLSAgICAgYSBiaXRmaWVsZCwgdGhpcyBpcyB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBiaXRzaXplOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGllZWVfdHlwZXMKLXsKLSAgLyogTnVtYmVyIG9mIHNsb3RzIGFsbG9jYXRlZC4gICovCi0gIHVuc2lnbmVkIGludCBhbGxvYzsKLSAgLyogVHlwZXMuICAqLwotICBzdHJ1Y3QgaWVlZV90eXBlICp0eXBlczsKLSAgLyogQnVpbHRpbiB0eXBlcy4gICovCi0jZGVmaW5lIEJVSUxUSU5fVFlQRV9DT1VOVCAoNjApCi0gIGRlYnVnX3R5cGUgYnVpbHRpbnNbQlVJTFRJTl9UWVBFX0NPVU5UXTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGEgbGlua2VkIGxhc3Qgb2Ygc3RydWN0cyB3aXRoIHRoZWlyIHRhZyBuYW1lcywKLSAgIHNvIHRoYXQgd2UgY2FuIGNvbnZlcnQgdGhlbSB0byBDKysgY2xhc3NlcyBpZiBuZWNlc3NhcnkuICAqLwotCi1zdHJ1Y3QgaWVlZV90YWcKLXsKLSAgLyogTmV4dCB0YWcuICAqLwotICBzdHJ1Y3QgaWVlZV90YWcgKm5leHQ7Ci0gIC8qIFRoaXMgdGFnIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUaGUgdHlwZSBvZiB0aGUgdGFnLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBUaGUgdGFnZ2VkIHR5cGUgaXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZyBhdCB0aGlzIHNsb3QuICAqLwotICBkZWJ1Z190eXBlIHNsb3Q7Ci0gIC8qIFRoaXMgaXMgYW4gYXJyYXkgb2Ygc2xvdHMgdXNlZCB3aGVuIGEgZmllbGQgdHlwZSBpcyBjb252ZXJ0ZWQKLSAgICAgaW50byBhIGluZGlyZWN0IHR5cGUsIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgbGF0ZXIgY29udmVydGVkIGludG8KLSAgICAgYSByZWZlcmVuY2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgKmZzbG90czsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiB3ZSBwYXNzIGFyb3VuZCB0byB0aGUgcGFyc2luZwotICAgZnVuY3Rpb25zLiAgKi8KLQotc3RydWN0IGllZWVfaW5mbwotewotICAvKiBUaGUgZGVidWdnaW5nIGhhbmRsZS4gICovCi0gIFBUUiBkaGFuZGxlOwotICAvKiBUaGUgQkZELiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBUaGUgc3RhcnQgb2YgdGhlIGJ5dGVzIHRvIGJlIHBhcnNlZC4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpieXRlczsKLSAgLyogVGhlIGVuZCBvZiB0aGUgYnl0ZXMgdG8gYmUgcGFyc2VkLiAgKi8KLSAgY29uc3QgYmZkX2J5dGUgKnBlbmQ7Ci0gIC8qIFRoZSBibG9jayBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX2Jsb2Nrc3RhY2sgYmxvY2tzdGFjazsKLSAgLyogV2hldGhlciB3ZSBoYXZlIHNlZW4gYSBCQjEgb3IgQkIyLiAgKi8KLSAgYm9vbGVhbiBzYXdfZmlsZW5hbWU7Ci0gIC8qIFRoZSB2YXJpYWJsZXMuICAqLwotICBzdHJ1Y3QgaWVlZV92YXJzIHZhcnM7Ci0gIC8qIFRoZSBnbG9iYWwgdmFyaWFibGVzLCBhZnRlciBhIGdsb2JhbCB0eXBlZGVmIGJsb2NrLiAgKi8KLSAgc3RydWN0IGllZWVfdmFycyAqZ2xvYmFsX3ZhcnM7Ci0gIC8qIFRoZSB0eXBlcy4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVzIHR5cGVzOwotICAvKiBUaGUgZ2xvYmFsIHR5cGVzLCBhZnRlciBhIGdsb2JhbCB0eXBlZGVmIGJsb2NrLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZXMgKmdsb2JhbF90eXBlczsKLSAgLyogVGhlIGxpc3Qgb2YgdGFnZ2VkIHN0cnVjdHMuICAqLwotICBzdHJ1Y3QgaWVlZV90YWcgKnRhZ3M7Ci19OwotCi0vKiBCYXNpYyBidWlsdGluIHR5cGVzLCBub3QgaW5jbHVkaW5nIHRoZSBwb2ludGVycy4gICovCi0KLWVudW0gYnVpbHRpbl90eXBlcwotewotICBidWlsdGluX3Vua25vd24gPSAwLAotICBidWlsdGluX3ZvaWQgPSAxLAotICBidWlsdGluX3NpZ25lZF9jaGFyID0gMiwKLSAgYnVpbHRpbl91bnNpZ25lZF9jaGFyID0gMywKLSAgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50ID0gNCwKLSAgYnVpbHRpbl91bnNpZ25lZF9zaG9ydF9pbnQgPSA1LAotICBidWlsdGluX3NpZ25lZF9sb25nID0gNiwKLSAgYnVpbHRpbl91bnNpZ25lZF9sb25nID0gNywKLSAgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nID0gOCwKLSAgYnVpbHRpbl91bnNpZ25lZF9sb25nX2xvbmcgPSA5LAotICBidWlsdGluX2Zsb2F0ID0gMTAsCi0gIGJ1aWx0aW5fZG91YmxlID0gMTEsCi0gIGJ1aWx0aW5fbG9uZ19kb3VibGUgPSAxMiwKLSAgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlID0gMTMsCi0gIGJ1aWx0aW5fcXVvdGVkX3N0cmluZyA9IDE0LAotICBidWlsdGluX2luc3RydWN0aW9uX2FkZHJlc3MgPSAxNSwKLSAgYnVpbHRpbl9pbnQgPSAxNiwKLSAgYnVpbHRpbl91bnNpZ25lZCA9IDE3LAotICBidWlsdGluX3Vuc2lnbmVkX2ludCA9IDE4LAotICBidWlsdGluX2NoYXIgPSAxOSwKLSAgYnVpbHRpbl9sb25nID0gMjAsCi0gIGJ1aWx0aW5fc2hvcnQgPSAyMSwKLSAgYnVpbHRpbl91bnNpZ25lZF9zaG9ydCA9IDIyLAotICBidWlsdGluX3Nob3J0X2ludCA9IDIzLAotICBidWlsdGluX3NpZ25lZF9zaG9ydCA9IDI0LAotICBidWlsdGluX2JjZF9mbG9hdCA9IDI1Ci19OwotCi0vKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGUgZGVyaXZhdGlvbiBmbGFncyBvZiBhICdiJwotICAgY29tcG9uZW50IHJlY29yZCBvZiBhICdUJyB0eXBlIGV4dGVuc2lvbiByZWNvcmQgaW4gYSBDKysgcG1pc2MKLSAgIHJlY29yZC4gIFRoZXNlIGFyZSBiaXRtYXNrcy4gICovCi0KLS8qIFNldCBmb3IgYSBwcml2YXRlIGJhc2UgY2xhc3MsIGNsZWFyIGZvciBhIHB1YmxpYyBiYXNlIGNsYXNzLgotICAgUHJvdGVjdGVkIGJhc2UgY2xhc3NlcyBhcmUgbm90IHN1cHBvcnRlZC4gICovCi0jZGVmaW5lIEJBU0VGTEFHU19QUklWQVRFICgweDEpCi0vKiBTZXQgZm9yIGEgdmlydHVhbCBiYXNlIGNsYXNzLiAgKi8KLSNkZWZpbmUgQkFTRUZMQUdTX1ZJUlRVQUwgKDB4MikKLS8qIFNldCBmb3IgYSBmcmllbmQgY2xhc3MsIGNsZWFyIGZvciBhIGJhc2UgY2xhc3MuICAqLwotI2RlZmluZSBCQVNFRkxBR1NfRlJJRU5EICgweDEwKQotCi0vKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGUgc3BlY3MgZmxhZ3Mgb2YgYSAnZCcsICdtJywgb3IgJ3YnCi0gICBjb21wb25lbnQgcmVjb3JkIG9mIGEgJ1QnIHR5cGUgZXh0ZW5zaW9uIHJlY29yZCBpbiBhIEMrKyBwbWlzYwotICAgcmVjb3JkLiAgVGhlIHNhbWUgZmxhZ3MgYXJlIHVzZWQgZm9yIGEgJ00nIHJlY29yZCBpbiBhIEMrKyBwbWlzYwotICAgcmVjb3JkLiAgKi8KLQotLyogVGhlIGxvd2VyIHR3byBiaXRzIGhvbGQgdmlzaWJpbGl0eSBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX1ZJU0lCSUxJVFkgKDB4MykKLS8qIFRoaXMgdmFsdWUgaW4gdGhlIGxvd2VyIHR3byBiaXRzIGluZGljYXRlcyBhIHB1YmxpYyBtZW1iZXIuICAqLwotI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQyAoMHgwKQotLyogVGhpcyB2YWx1ZSBpbiB0aGUgbG93ZXIgdHdvIGJpdHMgaW5kaWNhdGVzIGEgcHJpdmF0ZSBtZW1iZXIuICAqLwotI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZX1BSSVZBVEUgKDB4MSkKLS8qIFRoaXMgdmFsdWUgaW4gdGhlIGxvd2VyIHR3byBiaXRzIGluZGljYXRlcyBhIHByb3RlY3RlZCBtZW1iZXIuICAqLwotI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZX1BST1RFQ1RFRCAoMHgyKQotLyogU2V0IGZvciBhIHN0YXRpYyBtZW1iZXIuICAqLwotI2RlZmluZSBDWFhGTEFHU19TVEFUSUMgKDB4NCkKLS8qIFNldCBmb3IgYSB2aXJ0dWFsIG92ZXJyaWRlLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfT1ZFUlJJREUgKDB4OCkKLS8qIFNldCBmb3IgYSBmcmllbmQgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19GUklFTkQgKDB4MTApCi0vKiBTZXQgZm9yIGEgY29uc3QgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19DT05TVCAoMHgyMCkKLS8qIFNldCBmb3IgYSB2b2xhdGlsZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX1ZPTEFUSUxFICgweDQwKQotLyogU2V0IGZvciBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfT1ZFUkxPQURFRCAoMHg4MCkKLS8qIFNldCBmb3IgYW4gb3BlcmF0b3IgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19PUEVSQVRPUiAoMHgxMDApCi0vKiBTZXQgZm9yIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gICovCi0jZGVmaW5lIENYWEZMQUdTX0NUT1JEVE9SICgweDQwMCkKLS8qIFNldCBmb3IgYSBjb25zdHJ1Y3Rvci4gICovCi0jZGVmaW5lIENYWEZMQUdTX0NUT1IgKDB4MjAwKQotLyogU2V0IGZvciBhbiBpbmxpbmUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19JTkxJTkUgKDB4ODAwKQotCi0vKiBMb2NhbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZCBpZWVlX2Vycm9yCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpZWVlX2VvZiBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICopKTsKLXN0YXRpYyBjaGFyICpzYXZlc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX251bWJlcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9pZAotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBjb25zdCBjaGFyICoqLAotCSAgIHVuc2lnbmVkIGxvbmcgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX29wdGlvbmFsX2lkCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGNvbnN0IGNoYXIgKiosCi0JICAgdW5zaWduZWQgbG9uZyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9leHByZXNzaW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgaWVlZV9idWlsdGluX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYWxsb2NfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX3R5cGVfaW5kZXgKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgaW50IGllZWVfcmVnbm9fdG9fZ2VucmVnIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgaWVlZV9nZW5yZWdfdG9fcmVnbm8gUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9iYiBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX2JlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfbm4gUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV90eSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX2F0biBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfY3h4X21pc2MKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2N4eF9jbGFzcwotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfY3h4X2RlZmF1bHRzCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9yZWZlcmVuY2UKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZXF1aXJlX2FzbgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVxdWlyZV9hdG42NQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBjb25zdCBjaGFyICoqLAotCSAgIHVuc2lnbmVkIGxvbmcgKikpOwotCi0vKiBSZXBvcnQgYW4gZXJyb3IgaW4gdGhlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfZXJyb3IgKGluZm8sIHAsIHMpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICpwOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpZiAocCAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAweCVseDogJXMgKDB4JXgpXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwKLQkgICAgICh1bnNpZ25lZCBsb25nKSAocCAtIGluZm8tPmJ5dGVzKSwgcywgKnApOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgcyk7Ci19Ci0KLS8qIFJlcG9ydCBhbiB1bmV4cGVjdGVkIEVPRiBpbiB0aGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotaWVlZV9lb2YgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci17Ci0gIGllZWVfZXJyb3IgKGluZm8sIChjb25zdCBiZmRfYnl0ZSAqKSBOVUxMLAotCSAgICAgIF8oInVuZXhwZWN0ZWQgZW5kIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpKTsKLX0KLQotLyogU2F2ZSBhIHN0cmluZyBpbiBtZW1vcnkuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zYXZlc3RyaW5nIChzdGFydCwgbGVuKQotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW47Ci17Ci0gIGNoYXIgKnJldDsKLQotICByZXQgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5IChyZXQsIHN0YXJ0LCBsZW4pOwotICByZXRbbGVuXSA9ICdcMCc7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgd2hpY2ggbXVzdCBiZSBwcmVzZW50IGluIGFuIElFRUUgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgcHYpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGJmZF92bWEgKnB2OwotewotICByZXR1cm4gaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsIHB2LCAoYm9vbGVhbiAqKSBOVUxMKTsKLX0KLQotLyogUmVhZCBhIG51bWJlciBpbiBhbiBJRUVFIGZpbGUuICBJZiBwcHJlc2VudCBpcyBub3QgTlVMTCwgdGhlIG51bWJlcgotICAgbmVlZCBub3QgYmUgdGhlcmUuICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgcHYsIHBwcmVzZW50KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBiZmRfdm1hICpwdjsKLSAgICAgYm9vbGVhbiAqcHByZXNlbnQ7Ci17Ci0gIGllZWVfcmVjb3JkX2VudW1fdHlwZSBiOwotCi0gIGlmICgqcHAgPj0gaW5mby0+cGVuZCkKLSAgICB7Ci0gICAgICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLQl7Ci0JICAqcHByZXNlbnQgPSBmYWxzZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGllZWVfZW9mIChpbmZvKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYiA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHA7Ci0gICsrKnBwOwotCi0gIGlmIChiIDw9IGllZWVfbnVtYmVyX2VuZF9lbnVtKQotICAgIHsKLSAgICAgICpwdiA9IChiZmRfdm1hKSBiOwotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JKnBwcmVzZW50ID0gdHJ1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoYiA+PSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSAmJiBiIDw9IGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaSA9IChpbnQpIGIgLSAoaW50KSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bTsKLSAgICAgIGlmICgqcHAgKyBpIC0gMSA+PSBpbmZvLT5wZW5kKQotCXsKLQkgIGllZWVfZW9mIChpbmZvKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgICpwdiA9IDA7Ci0gICAgICBmb3IgKDsgaSA+IDA7IGktLSkKLQl7Ci0JICAqcHYgPDw9IDg7Ci0JICAqcHYgKz0gKipwcDsKLQkgICsrKnBwOwotCX0KLQotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JKnBwcmVzZW50ID0gdHJ1ZTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChwcHJlc2VudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC0tKnBwOwotICAgICAgKnBwcmVzZW50ID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWVlZV9lcnJvciAoaW5mbywgKnBwIC0gMSwgXygiaW52YWxpZCBudW1iZXIiKSk7Ci0gIHJldHVybiBmYWxzZTsgIAotfQotCi0vKiBSZWFkIGEgcmVxdWlyZWQgc3RyaW5nIGZyb20gYW4gSUVFRSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9pZCAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBjb25zdCBjaGFyICoqcG5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47Ci17Ci0gIHJldHVybiBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbiwgKGJvb2xlYW4gKikgTlVMTCk7Ci19Ci0KLS8qIFJlYWQgYSBzdHJpbmcgZnJvbSBhbiBJRUVFIGZpbGUuICBJZiBwcHJlc2VudCBpcyBub3QgTlVMTCwgdGhlCi0gICBzdHJpbmcgaXMgb3B0aW9uYWwuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4sIHBwcmVzZW50KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBjb25zdCBjaGFyICoqcG5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47Ci0gICAgIGJvb2xlYW4gKnBwcmVzZW50OwotewotICBiZmRfYnl0ZSBiOwotICB1bnNpZ25lZCBsb25nIGxlbjsKLQotICBpZiAoKnBwID49IGluZm8tPnBlbmQpCi0gICAgewotICAgICAgaWVlZV9lb2YgKGluZm8pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiID0gKipwcDsKLSAgKysqcHA7Ci0KLSAgaWYgKGIgPD0gMHg3ZikKLSAgICBsZW4gPSBiOwotICBlbHNlIGlmICgoaWVlZV9yZWNvcmRfZW51bV90eXBlKSBiID09IGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8xX2VudW0pCi0gICAgewotICAgICAgbGVuID0gKipwcDsKLSAgICAgICsrKnBwOwotICAgIH0KLSAgZWxzZSBpZiAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgYiA9PSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMl9lbnVtKQotICAgIHsKLSAgICAgIGxlbiA9ICgqKnBwIDw8IDgpICsgKCpwcClbMV07Ci0gICAgICAqcHAgKz0gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLQl7Ci0JICAtLSpwcDsKLQkgICpwcHJlc2VudCA9IGZhbHNlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgaWVlZV9lcnJvciAoaW5mbywgKnBwIC0gMSwgXygiaW52YWxpZCBzdHJpbmcgbGVuZ3RoIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKHVuc2lnbmVkIGxvbmcpIChpbmZvLT5wZW5kIC0gKnBwKSA8IGxlbikKLSAgICB7Ci0gICAgICBpZWVlX2VvZiAoaW5mbyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICpwbmFtZSA9IChjb25zdCBjaGFyICopICpwcDsKLSAgKnBuYW1sZW4gPSBsZW47Ci0gICpwcCArPSBsZW47Ci0KLSAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0gICAgKnBwcmVzZW50ID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbiBleHByZXNzaW9uIGZyb20gYW4gSUVFRSBmaWxlLiAgU2luY2UgdGhpcyBjb2RlIGlzIG9ubHkgdXNlZAotICAgdG8gcGFyc2UgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBJIGhhdmVuJ3QgYm90aGVyZWQgdG8gd3JpdGUgYSBmdWxsCi0gICBibG93biBJRUVFIGV4cHJlc3Npb24gcGFyc2VyLiAgSSd2ZSBvbmx5IHRocm93biBpbiB0aGUgdGhpbmdzIEkndmUKLSAgIHNlZW4gaW4gZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gYmUgZWFzaWx5IGV4dGVuZGVkIGlmCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCBwdikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpleHByX3N0YXJ0OwotI2RlZmluZSBFWFBSX1NUQUNLX1NJWkUgKDEwKQotICBiZmRfdm1hIGV4cHJfc3RhY2tbRVhQUl9TVEFDS19TSVpFXTsKLSAgYmZkX3ZtYSAqZXNwOwotCi0gIGV4cHJfc3RhcnQgPSAqcHA7Ci0KLSAgZXNwID0gZXhwcl9zdGFjazsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIGJvb2xlYW4gcHJlc2VudDsKLSAgICAgIGllZWVfcmVjb3JkX2VudW1fdHlwZSBjOwotCi0gICAgICBzdGFydCA9ICpwcDsKLQotICAgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2YWwsICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChwcmVzZW50KQotCXsKLQkgIGlmIChlc3AgLSBleHByX3N0YWNrID49IEVYUFJfU1RBQ0tfU0laRSkKLQkgICAgewotCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIG92ZXJmbG93IikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgKmVzcCsrID0gdmFsOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcDsKLQotICAgICAgaWYgKGMgPj0gaWVlZV9tb2R1bGVfYmVnaW5uaW5nX2VudW0pCi0JYnJlYWs7Ci0KLSAgICAgICsrKnBwOwotCi0gICAgICBpZiAoYyA9PSBpZWVlX2NvbW1hKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWRlZmF1bHQ6Ci0JICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5zdXBwb3J0ZWQgSUVFRSBleHByZXNzaW9uIG9wZXJhdG9yIikpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfdmFyaWFibGVfUl9lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIGluZHg7Ci0JICAgIGFzZWN0aW9uICpzOwotCi0JICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaW5keCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBmb3IgKHMgPSBpbmZvLT5hYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgICBpZiAoKGJmZF92bWEpIHMtPnRhcmdldF9pbmRleCA9PSBpbmR4KQotCQlicmVhazsKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmtub3duIHNlY3Rpb24iKSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgIAotCSAgICBpZiAoZXNwIC0gZXhwcl9zdGFjayA+PSBFWFBSX1NUQUNLX1NJWkUpCi0JICAgICAgewotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayBvdmVyZmxvdyIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICAqZXNwKysgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmZvLT5hYmZkLCBzKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bToKLQljYXNlIGllZWVfZnVuY3Rpb25fbWludXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2MSwgdjI7Ci0KLQkgICAgaWYgKGVzcCAtIGV4cHJfc3RhY2sgPCAyKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImV4cHJlc3Npb24gc3RhY2sgdW5kZXJmbG93IikpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIHYxID0gKi0tZXNwOwotCSAgICB2MiA9ICotLWVzcDsKLQkgICAgKmVzcCsrID0gdjEgKyB2MjsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVzcCAtIDEgIT0gZXhwcl9zdGFjaykKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBleHByX3N0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIG1pc21hdGNoIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAqcHYgPSAqLS1lc3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiBhbiBJRUVFIGJ1aWx0aW4gdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1pZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgcCwgaW5keCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotewotICBQVFIgZGhhbmRsZTsKLSAgZGVidWdfdHlwZSB0eXBlOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmIChpbmR4IDwgQlVJTFRJTl9UWVBFX0NPVU5UCi0gICAgICAmJiBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XSAhPSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdOwotCi0gIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotCi0gIGlmIChpbmR4ID49IDMyICYmIGluZHggPCA2NCkKLSAgICB7Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsCi0JCQkJICAgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsIGluZHggLSAzMikpOwotICAgICAgYXNzZXJ0IChpbmR4IDwgQlVJTFRJTl9UWVBFX0NPVU5UKTsKLSAgICAgIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdID0gdHlwZTsKLSAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICBzd2l0Y2ggKChlbnVtIGJ1aWx0aW5fdHlwZXMpIGluZHgpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBwLCBfKCJ1bmtub3duIGJ1aWx0aW4gdHlwZSIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2FzZSBidWlsdGluX3Vua25vd246Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl92b2lkOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSAidm9pZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfY2hhcjoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX2NoYXI6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGNoYXIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNpZ25lZCBzaG9ydCBpbnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCBpbnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9sb25nX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgbG9uZyBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX2xvbmdfbG9uZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2Zsb2F0OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBuYW1lID0gImZsb2F0IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2RvdWJsZToKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgbmFtZSA9ICJkb3VibGUiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fbG9uZ19kb3VibGU6Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCi0gICAgICAgICBwcm9jZXNzb3IuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTIpOwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTYpOwotICAgICAgbmFtZSA9ICJsb25nIGxvbmcgZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3F1b3RlZF9zdHJpbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChkaGFuZGxlLAotCQkJCSAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgcCwKLQkJCQkJCSAgICAgICAoKHVuc2lnbmVkIGludCkKLQkJCQkJCQlidWlsdGluX2NoYXIpKSwKLQkJCQkgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsCi0JCQkJCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJYnVpbHRpbl9pbnQpKSwKLQkJCQkgICAgMCwgLTEsIHRydWUpOwotICAgICAgbmFtZSA9ICJRVU9URUQgU1RSSU5HIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2luc3RydWN0aW9uX2FkZHJlc3M6Ci0gICAgICAvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBjb2RlIGFkZHJlc3MuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJpbnN0cnVjdGlvbiBhZGRyZXNzIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2ludDoKLSAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBmb3IgdGhpcyB0eXBlIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUKLSAgICAgICAgIHByb2Nlc3Nvci4gICovCi0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJpbnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWQ6Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCi0gICAgICAgICBwcm9jZXNzb3IuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9pbnQ6Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCi0gICAgICAgICBwcm9jZXNzb3IuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBpbnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fY2hhcjoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImNoYXIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fbG9uZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2hvcnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9zaG9ydDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2hvcnRfaW50OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2hvcnQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9zaG9ydDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNpZ25lZCBzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9iY2RfZmxvYXQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBwLCBfKCJCQ0QgZmxvYXQgdHlwZSBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCB0eXBlKTsKLQotICBhc3NlcnQgKGluZHggPCBCVUlMVElOX1RZUEVfQ09VTlQpOwotCi0gIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdID0gdHlwZTsKLQotICByZXR1cm4gdHlwZTsKLX0KLQotLyogQWxsb2NhdGUgbW9yZSBzcGFjZSBpbiB0aGUgdHlwZSB0YWJsZS4gIElmIHJlZiBpcyB0cnVlLCB0aGlzIGlzIGEKLSAgIHJlZmVyZW5jZSB0byB0aGUgdHlwZTsgaWYgaXQgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgd2Ugc2hvdWxkIHNldAotICAgdXAgYW4gaW5kaXJlY3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2FsbG9jX3R5cGUgKGluZm8sIGluZHgsIHJlZikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci0gICAgIGJvb2xlYW4gcmVmOwotewotICB1bnNpZ25lZCBpbnQgbmFsbG9jOwotICByZWdpc3RlciBzdHJ1Y3QgaWVlZV90eXBlICp0OwotICBzdHJ1Y3QgaWVlZV90eXBlICp0ZW5kOwotCi0gIGlmIChpbmR4ID49IGluZm8tPnR5cGVzLmFsbG9jKQotICAgIHsKLSAgICAgIG5hbGxvYyA9IGluZm8tPnR5cGVzLmFsbG9jOwotICAgICAgaWYgKG5hbGxvYyA9PSAwKQotCW5hbGxvYyA9IDQ7Ci0gICAgICB3aGlsZSAoaW5keCA+PSBuYWxsb2MpCi0JbmFsbG9jICo9IDI7Ci0KLSAgICAgIGluZm8tPnR5cGVzLnR5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlICopCi0JCQkgICB4cmVhbGxvYyAoaW5mby0+dHlwZXMudHlwZXMsCi0JCQkJICAgICBuYWxsb2MgKiBzaXplb2YgKmluZm8tPnR5cGVzLnR5cGVzKSk7Ci0KLSAgICAgIG1lbXNldCAoaW5mby0+dHlwZXMudHlwZXMgKyBpbmZvLT50eXBlcy5hbGxvYywgMCwKLQkgICAgICAobmFsbG9jIC0gaW5mby0+dHlwZXMuYWxsb2MpICogc2l6ZW9mICppbmZvLT50eXBlcy50eXBlcyk7Ci0KLSAgICAgIHRlbmQgPSBpbmZvLT50eXBlcy50eXBlcyArIG5hbGxvYzsKLSAgICAgIGZvciAodCA9IGluZm8tPnR5cGVzLnR5cGVzICsgaW5mby0+dHlwZXMuYWxsb2M7IHQgPCB0ZW5kOyB0KyspCi0JdC0+dHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAgICAgaW5mby0+dHlwZXMuYWxsb2MgPSBuYWxsb2M7Ci0gICAgfQotCi0gIGlmIChyZWYpCi0gICAgewotICAgICAgdCA9IGluZm8tPnR5cGVzLnR5cGVzICsgaW5keDsKLSAgICAgIGlmICh0LT50eXBlID09IE5VTEwpCi0JewotCSAgdC0+cHNsb3QgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnQtPnBzbG90KTsKLQkgICp0LT5wc2xvdCA9IERFQlVHX1RZUEVfTlVMTDsKLQkgIHQtPnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGluZm8tPmRoYW5kbGUsIHQtPnBzbG90LAotCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgIGlmICh0LT50eXBlID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgdHlwZSBpbmRleCBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgYmZkX3ZtYSBpbmR4OwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmR4IDwgMjU2KQotICAgIHsKLSAgICAgICpwdHlwZSA9IGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBzdGFydCwgaW5keCk7Ci0gICAgICBpZiAoKnB0eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZHggLT0gMjU2OwotICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIGluZHgsIHRydWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqcHR5cGUgPSBpbmZvLT50eXBlcy50eXBlc1tpbmR4XS50eXBlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBmaWxlLiAgVGhpcyBpcyBwYXNzZWQgdGhlCi0gICBieXRlcyB3aGljaCBjb21wb3NlIHRoZSBEZWJ1ZyBJbmZvcm1hdGlvbiBQYXJ0IG9mIGFuIElFRUUgZmlsZS4gICovCi0KLWJvb2xlYW4KLXBhcnNlX2llZWUgKGRoYW5kbGUsIGFiZmQsIGJ5dGVzLCBsZW4pCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGJmZF9ieXRlICpieXRlczsKLSAgICAgYmZkX3NpemVfdHlwZSBsZW47Ci17Ci0gIHN0cnVjdCBpZWVlX2luZm8gaW5mbzsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGJmZF9ieXRlICpwLCAqcGVuZDsKLQotICBpbmZvLmRoYW5kbGUgPSBkaGFuZGxlOwotICBpbmZvLmFiZmQgPSBhYmZkOwotICBpbmZvLmJ5dGVzID0gYnl0ZXM7Ci0gIGluZm8ucGVuZCA9IGJ5dGVzICsgbGVuOwotICBpbmZvLmJsb2Nrc3RhY2suYnNwID0gaW5mby5ibG9ja3N0YWNrLnN0YWNrOwotICBpbmZvLnNhd19maWxlbmFtZSA9IGZhbHNlOwotICBpbmZvLnZhcnMuYWxsb2MgPSAwOwotICBpbmZvLnZhcnMudmFycyA9IE5VTEw7Ci0gIGluZm8uZ2xvYmFsX3ZhcnMgPSBOVUxMOwotICBpbmZvLnR5cGVzLmFsbG9jID0gMDsKLSAgaW5mby50eXBlcy50eXBlcyA9IE5VTEw7Ci0gIGluZm8uZ2xvYmFsX3R5cGVzID0gTlVMTDsKLSAgaW5mby50YWdzID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IEJVSUxUSU5fVFlQRV9DT1VOVDsgaSsrKQotICAgIGluZm8udHlwZXMuYnVpbHRpbnNbaV0gPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgcCA9IGJ5dGVzOwotICBwZW5kID0gaW5mby5wZW5kOwotICB3aGlsZSAocCA8IHBlbmQpCi0gICAgewotICAgICAgY29uc3QgYmZkX2J5dGUgKnJlY29yZF9zdGFydDsKLSAgICAgIGllZWVfcmVjb3JkX2VudW1fdHlwZSBjOwotCi0gICAgICByZWNvcmRfc3RhcnQgPSBwOwotCi0gICAgICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKnArKzsKLQotICAgICAgaWYgKGMgPT0gaWVlZV9hdF9yZWNvcmRfZW51bSkKLQljID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKCgodW5zaWduZWQgaW50KSBjIDw8IDgpIHwgKnArKyk7Ci0KLSAgICAgIGlmIChjIDw9IGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSkKLQl7Ci0JICBpZWVlX2Vycm9yICgmaW5mbywgcmVjb3JkX3N0YXJ0LCBfKCJ1bmV4cGVjdGVkIG51bWJlciIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JZGVmYXVsdDoKLQkgIGllZWVfZXJyb3IgKCZpbmZvLCByZWNvcmRfc3RhcnQsIF8oInVuZXhwZWN0ZWQgcmVjb3JkIHR5cGUiKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0KLQljYXNlIGllZWVfYmJfcmVjb3JkX2VudW06Ci0JICBpZiAoISBwYXJzZV9pZWVlX2JiICgmaW5mbywgJnApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9iZV9yZWNvcmRfZW51bToKLQkgIGlmICghIHBhcnNlX2llZWVfYmUgKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX25uX3JlY29yZDoKLQkgIGlmICghIHBhcnNlX2llZWVfbm4gKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX3R5X3JlY29yZF9lbnVtOgotCSAgaWYgKCEgcGFyc2VfaWVlZV90eSAoJmluZm8sICZwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfYXRuX3JlY29yZF9lbnVtOgotCSAgaWYgKCEgcGFyc2VfaWVlZV9hdG4gKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8uYmxvY2tzdGFjay5ic3AgIT0gaW5mby5ibG9ja3N0YWNrLnN0YWNrKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKCZpbmZvLCAoY29uc3QgYmZkX2J5dGUgKikgTlVMTCwKLQkJICBfKCJibG9ja3MgbGVmdCBvbiBzdGFjayBhdCBlbmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYW4gSUVFRSBCQiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9iYiAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpibG9ja19zdGFydDsKLSAgYmZkX2J5dGUgYjsKLSAgYmZkX3ZtYSBzaXplOwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLSAgY2hhciAqbmFtY29weSA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBmbmluZHg7Ci0gIGJvb2xlYW4gc2tpcDsKLQotICBibG9ja19zdGFydCA9ICpwcDsKLQotICBiID0gKipwcDsKLSAgKysqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKQotICAgICAgfHwgISBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZuaW5keCA9ICh1bnNpZ25lZCBpbnQpIC0xOwotICBza2lwID0gZmFsc2U7Ci0KLSAgc3dpdGNoIChiKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBCQjE6IFR5cGUgZGVmaW5pdGlvbnMgbG9jYWwgdG8gYSBtb2R1bGUuICAqLwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAobmFtY29weSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+c2F3X2ZpbGVuYW1lID0gdHJ1ZTsKLQotICAgICAgLyogRGlzY2FyZCBhbnkgdmFyaWFibGVzIG9yIHR5cGVzIHdlIG1heSBoYXZlIHNlZW4gYmVmb3JlLiAgKi8KLSAgICAgIGlmIChpbmZvLT52YXJzLnZhcnMgIT0gTlVMTCkKLQlmcmVlIChpbmZvLT52YXJzLnZhcnMpOwotICAgICAgaW5mby0+dmFycy52YXJzID0gTlVMTDsKLSAgICAgIGluZm8tPnZhcnMuYWxsb2MgPSAwOwotICAgICAgaWYgKGluZm8tPnR5cGVzLnR5cGVzICE9IE5VTEwpCi0JZnJlZSAoaW5mby0+dHlwZXMudHlwZXMpOwotICAgICAgaW5mby0+dHlwZXMudHlwZXMgPSBOVUxMOwotICAgICAgaW5mby0+dHlwZXMuYWxsb2MgPSAwOwotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSB0eXBlcyB0byB0aGUgZ2xvYmFsIHR5cGVzLiAgKi8KLSAgICAgIGlmIChpbmZvLT5nbG9iYWxfdHlwZXMgIT0gTlVMTCkKLQl7Ci0JICBpbmZvLT50eXBlcy5hbGxvYyA9IGluZm8tPmdsb2JhbF90eXBlcy0+YWxsb2M7Ci0JICBpbmZvLT50eXBlcy50eXBlcyA9ICgoc3RydWN0IGllZWVfdHlwZSAqKQotCQkJICAgICAgIHhtYWxsb2MgKGluZm8tPnR5cGVzLmFsbG9jCi0JCQkJCSogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKSk7Ci0JICBtZW1jcHkgKGluZm8tPnR5cGVzLnR5cGVzLCBpbmZvLT5nbG9iYWxfdHlwZXMtPnR5cGVzLAotCQkgIGluZm8tPnR5cGVzLmFsbG9jICogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgLyogQkIyOiBHbG9iYWwgdHlwZSBkZWZpbml0aW9ucy4gIFRoZSBuYW1lIGlzIHN1cHBvc2VkIHRvIGJlCi0JIGVtcHR5LCBidXQgd2UgZG9uJ3QgY2hlY2suICovCi0gICAgICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGluZm8tPmRoYW5kbGUsICIqZ2xvYmFsKiIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnNhd19maWxlbmFtZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIEJCMzogSGlnaCBsZXZlbCBtb2R1bGUgYmxvY2sgYmVnaW4uICBXZSBkb24ndCBoYXZlIHRvIGRvCi0JIGFueXRoaW5nIGhlcmUuICBUaGUgbmFtZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBhcyBmb3IKLQkgdGhlIEJCMSwgYnV0IHdlIGRvbid0IGNoZWNrLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgLyogQkI0OiBHbG9iYWwgZnVuY3Rpb24uICAqLwotICAgICAgewotCWJmZF92bWEgc3RhY2tzcGFjZSwgdHlwaW5keCwgb2Zmc2V0OwotCWRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnN0YWNrc3BhY2UpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0eXBpbmR4KQotCSAgICB8fCAhIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIHN0YWNrIHNwYWNlLiAgRklYTUUuICAqLwotCi0JaWYgKHR5cGluZHggPCAyNTYpCi0JICB7Ci0JICAgIHJldHVybl90eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIGJsb2NrX3N0YXJ0LCB0eXBpbmR4KTsKLQkgICAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICB0eXBpbmR4IC09IDI1NjsKLQkgICAgaWYgKCEgaWVlZV9hbGxvY190eXBlIChpbmZvLCB0eXBpbmR4LCB0cnVlKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGZuaW5keCA9IHR5cGluZHg7Ci0JICAgIHJldHVybl90eXBlID0gaW5mby0+dHlwZXMudHlwZXNbdHlwaW5keF0udHlwZTsKLQkgICAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsIHJldHVybl90eXBlKQotCQk9PSBERUJVR19LSU5EX0ZVTkNUSU9OKQotCSAgICAgIHJldHVybl90eXBlID0gZGVidWdfZ2V0X3JldHVybl90eXBlIChpbmZvLT5kaGFuZGxlLAotCQkJCQkJICAgcmV0dXJuX3R5cGUpOwotCSAgfQotCi0JbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JaWYgKG5hbWNvcHkgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoISBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGluZm8tPmRoYW5kbGUsIG5hbWNvcHksIHJldHVybl90eXBlLAotCQkJCSAgICAgdHJ1ZSwgb2Zmc2V0KSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA1OgotICAgICAgLyogQkI1OiBGaWxlIG5hbWUgZm9yIHNvdXJjZSBsaW5lIG51bWJlcnMuICAqLwotICAgICAgewotCXVuc2lnbmVkIGludCBpOwotCi0JLyogV2UgaWdub3JlIHRoZSBkYXRlIGFuZCB0aW1lLiAgRklYTUUuICAqLwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JICB7Ci0JICAgIGJmZF92bWEgaWdub3JlOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZpZ25vcmUsICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0KLQluYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQlpZiAobmFtY29weSA9PSBOVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNjoKLSAgICAgIC8qIEJCNjogTG9jYWwgZnVuY3Rpb24gb3IgYmxvY2suICAqLwotICAgICAgewotCWJmZF92bWEgc3RhY2tzcGFjZSwgdHlwaW5keCwgb2Zmc2V0OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzdGFja3NwYWNlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdHlwaW5keCkKLQkgICAgfHwgISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBzdGFjayBzcGFjZS4gIEZJWE1FLiAgKi8KLQotCWlmIChuYW1sZW4gPT0gMCkKLQkgIHsKLQkgICAgaWYgKCEgZGVidWdfc3RhcnRfYmxvY2sgKGluZm8tPmRoYW5kbGUsIG9mZnNldCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAvKiBDaGFuZ2UgYiB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBibG9jawotCSAgICAgICByYXRoZXIgdGhhbiBhIGZ1bmN0aW9uLiAgKi8KLQkgICAgYiA9IDB4ODY7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBUaGUgTVJJIEMrKyBjb21waWxlciB3aWxsIG91dHB1dCBhIGZha2UgZnVuY3Rpb24gbmFtZWQKLQkgICAgICAgX19YUllDUFAgdG8gaG9sZCBDKysgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2Ugc2tpcAotCSAgICAgICB0aGF0IGZ1bmN0aW9uLiAgVGhpcyBpcyBub3QgY3J1Y2lhbCwgYnV0IGl0IG1ha2VzCi0JICAgICAgIGNvbnZlcnRpbmcgZnJvbSBJRUVFIHRvIG90aGVyIGRlYnVnIGZvcm1hdHMgd29yawotCSAgICAgICBiZXR0ZXIuICAqLwotCSAgICBpZiAoc3RybmNtcCAobmFtZSwgIl9fWFJZQ1BQIiwgbmFtbGVuKSA9PSAwKQotCSAgICAgIHNraXAgPSB0cnVlOwotCSAgICBlbHNlCi0JICAgICAgewotCQlkZWJ1Z190eXBlIHJldHVybl90eXBlOwotCi0JCWlmICh0eXBpbmR4IDwgMjU2KQotCQkgIHsKLQkJICAgIHJldHVybl90eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIGJsb2NrX3N0YXJ0LAotCQkJCQkJICAgICB0eXBpbmR4KTsKLQkJICAgIGlmIChyZXR1cm5fdHlwZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgdHlwaW5keCAtPSAyNTY7Ci0JCSAgICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHR5cGluZHgsIHRydWUpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBmbmluZHggPSB0eXBpbmR4OwotCQkgICAgcmV0dXJuX3R5cGUgPSBpbmZvLT50eXBlcy50eXBlc1t0eXBpbmR4XS50eXBlOwotCQkgICAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsIHJldHVybl90eXBlKQotCQkJPT0gREVCVUdfS0lORF9GVU5DVElPTikKLQkJICAgICAgcmV0dXJuX3R5cGUgPSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgKGluZm8tPmRoYW5kbGUsCi0JCQkJCQkJICAgcmV0dXJuX3R5cGUpOwotCQkgIH0KLQotCQluYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQkJaWYgKG5hbWNvcHkgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSwKLQkJCQkJICAgICByZXR1cm5fdHlwZSwgZmFsc2UsIG9mZnNldCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMDoKLSAgICAgIC8qIEJCMTA6IEFzc2VtYmxlciBtb2R1bGUgc2NvcGUuICBJbiB0aGUgbm9ybWFsIGNhc2UsIHdlCi0JIGNvbXBsZXRlbHkgaWdub3JlIGFsbCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotICAgICAgewotCWNvbnN0IGNoYXIgKmluYW0sICp2c3RyOwotCXVuc2lnbmVkIGxvbmcgaW5hbWxlbiwgdnN0cmxlbjsKLQliZmRfdm1hIHRvb2xfdHlwZTsKLQlib29sZWFuIHByZXNlbnQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpZiAoISBpbmZvLT5zYXdfZmlsZW5hbWUpCi0JICB7Ci0JICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCSAgICBpZiAobmFtY29weSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGluZm8tPnNhd19maWxlbmFtZSA9IHRydWU7Ci0JICB9Ci0KLQlpZiAoISBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCAmaW5hbSwgJmluYW1sZW4pCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0b29sX3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJnZzdHIsICZ2c3RybGVuLCAmcHJlc2VudCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkgIHsKLQkgICAgYmZkX3ZtYSBpZ25vcmU7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZpZ25vcmUsICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTE6Ci0gICAgICAvKiBCQjExOiBNb2R1bGUgc2VjdGlvbi4gIFdlIGNvbXBsZXRlbHkgaWdub3JlIGFsbCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotICAgICAgewotCWJmZF92bWEgc2VjdHlwZSwgc2VjaW5keCwgb2Zmc2V0LCBtYXA7Ci0JYm9vbGVhbiBwcmVzZW50OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzZWN0eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2VjaW5keCkKLQkgICAgfHwgISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpCi0JICAgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZtYXAsICZwcmVzZW50KSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGJsb2NrX3N0YXJ0LCBfKCJ1bmtub3duIEJCIHR5cGUiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgLyogUHVzaCB0aGlzIGJsb2NrIG9uIHRoZSBibG9jayBzdGFjay4gICovCi0KLSAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwID49IGluZm8tPmJsb2Nrc3RhY2suc3RhY2sgKyBCTE9DS1NUQUNLX1NJWkUpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgKGNvbnN0IGJmZF9ieXRlICopIE5VTEwsIF8oInN0YWNrIG92ZXJmbG93IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+a2luZCA9IGI7Ci0gIGlmIChiID09IDUpCi0gICAgaW5mby0+YmxvY2tzdGFjay5ic3AtPmZpbGVuYW1lID0gbmFtY29weTsKLSAgaW5mby0+YmxvY2tzdGFjay5ic3AtPmZuaW5keCA9IGZuaW5keDsKLSAgaW5mby0+YmxvY2tzdGFjay5ic3AtPnNraXAgPSBza2lwOwotICArK2luZm8tPmJsb2Nrc3RhY2suYnNwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYW4gSUVFRSBCRSByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9iZSAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGJmZF92bWEgb2Zmc2V0OwotCi0gIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA8PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCwgXygic3RhY2sgdW5kZXJmbG93IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLS1pbmZvLT5ibG9ja3N0YWNrLmJzcDsKLQotICBzd2l0Y2ggKGluZm8tPmJsb2Nrc3RhY2suYnNwLT5raW5kKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICAvKiBXaGVuIHdlIGVuZCB0aGUgZ2xvYmFsIHR5cGVkZWZzIGJsb2NrLCB3ZSBjb3B5IG91dCB0aGUgdGhlCi0gICAgICAgICBjb250ZW50cyBvZiBpbmZvLT52YXJzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSB2YXJpYWJsZSBpbmRpY2VzCi0gICAgICAgICBtYXkgYmUgcmV1c2VkIGluIHRoZSBsb2NhbCBibG9ja3MuICBIb3dldmVyLCB3ZSBuZWVkIHRvCi0gICAgICAgICBwcmVzZXJ2ZSB0aGVtIHNvIHRoYXQgd2UgY2FuIGxvY2F0ZSBhIGZ1bmN0aW9uIHJldHVybmluZyBhCi0gICAgICAgICByZWZlcmVuY2UgdmFyaWFibGUgd2hvc2UgdHlwZSBpcyBuYW1lZCBpbiB0aGUgZ2xvYmFsIHR5cGVkZWYKLSAgICAgICAgIGJsb2NrLiAgKi8KLSAgICAgIGluZm8tPmdsb2JhbF92YXJzID0gKChzdHJ1Y3QgaWVlZV92YXJzICopCi0JCQkgICB4bWFsbG9jIChzaXplb2YgKmluZm8tPmdsb2JhbF92YXJzKSk7Ci0gICAgICBpbmZvLT5nbG9iYWxfdmFycy0+YWxsb2MgPSBpbmZvLT52YXJzLmFsbG9jOwotICAgICAgaW5mby0+Z2xvYmFsX3ZhcnMtPnZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhciAqKQotCQkJCSB4bWFsbG9jIChpbmZvLT52YXJzLmFsbG9jCi0JCQkJCSAgKiBzaXplb2YgKCppbmZvLT52YXJzLnZhcnMpKSk7Ci0gICAgICBtZW1jcHkgKGluZm8tPmdsb2JhbF92YXJzLT52YXJzLCBpbmZvLT52YXJzLnZhcnMsCi0JICAgICAgaW5mby0+dmFycy5hbGxvYyAqIHNpemVvZiAoKmluZm8tPnZhcnMudmFycykpOwotCi0gICAgICAvKiBXZSBhbHNvIGNvcHkgb3V0IHRoZSBub24gYnVpbHRpbiBwYXJ0cyBvZiBpbmZvLT50eXBlcywgc2luY2UKLSAgICAgICAgIHRoZSB0eXBlcyBhcmUgZGlzY2FyZGVkIHdoZW4gd2Ugc3RhcnQgYSBuZXcgYmxvY2suICAqLwotICAgICAgaW5mby0+Z2xvYmFsX3R5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlcyAqKQotCQkJICAgIHhtYWxsb2MgKHNpemVvZiAqaW5mby0+Z2xvYmFsX3R5cGVzKSk7Ci0gICAgICBpbmZvLT5nbG9iYWxfdHlwZXMtPmFsbG9jID0gaW5mby0+dHlwZXMuYWxsb2M7Ci0gICAgICBpbmZvLT5nbG9iYWxfdHlwZXMtPnR5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlICopCi0JCQkJICAgeG1hbGxvYyAoaW5mby0+dHlwZXMuYWxsb2MKLQkJCQkJICAgICogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKSk7Ci0gICAgICBtZW1jcHkgKGluZm8tPmdsb2JhbF90eXBlcy0+dHlwZXMsIGluZm8tPnR5cGVzLnR5cGVzLAotCSAgICAgIGluZm8tPnR5cGVzLmFsbG9jICogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKTsKLSAgICAgIG1lbXNldCAoaW5mby0+Z2xvYmFsX3R5cGVzLT5idWlsdGlucywgMCwKLQkgICAgICBzaXplb2YgKGluZm8tPmdsb2JhbF90eXBlcy0+YnVpbHRpbnMpKTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA2OgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+c2tpcCkKLQl7Ci0JICBpZiAoISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGluZm8tPmRoYW5kbGUsIG9mZnNldCArIDEpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4ODY6Ci0gICAgICAvKiBUaGlzIGlzIEJFNiB3aGVuIEJCNiBzdGFydGVkIGEgYmxvY2sgcmF0aGVyIHRoYW4gYSBsb2NhbAotCSBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX2VuZF9ibG9jayAoaW5mby0+ZGhhbmRsZSwgb2Zmc2V0ICsgMSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDU6Ci0gICAgICAvKiBXaGVuIHdlIGVuZCBhIEJCNSwgd2UgbG9vayB1cCB0aGUgc3RhY2sgZm9yIHRoZSBsYXN0IEJCNSwgaWYKLSAgICAgICAgIHRoZXJlIGlzIG9uZSwgc28gdGhhdCB3ZSBjYW4gY2FsbCBkZWJ1Z19zdGFydF9zb3VyY2UuICAqLwotICAgICAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwID4gaW5mby0+YmxvY2tzdGFjay5zdGFjaykKLQl7Ci0JICBzdHJ1Y3QgaWVlZV9ibG9jayAqYmw7Ci0KLQkgIGJsID0gaW5mby0+YmxvY2tzdGFjay5ic3A7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgLS1ibDsKLQkgICAgICBpZiAoYmwtPmtpbmQgPT0gNSkKLQkJewotCQkgIGlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoaW5mby0+ZGhhbmRsZSwgYmwtPmZpbGVuYW1lKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICB3aGlsZSAoYmwgIT0gaW5mby0+YmxvY2tzdGFjay5zdGFjayk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDExOgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgbW9kdWxlIHNpemUuICBGSVhNRS4gICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBPdGhlciBibG9jayB0eXBlcyBkbyBub3QgaGF2ZSBhbnkgdHJhaWxpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhbiBOTiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9ubiAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpubl9zdGFydDsKLSAgYmZkX3ZtYSB2YXJpbmR4OwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQotICBubl9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhcmluZHgpCi0gICAgICB8fCAhIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZhcmluZHggPCAzMikKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBubl9zdGFydCwgXygiaWxsZWdhbCB2YXJpYWJsZSBpbmRleCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHZhcmluZHggLT0gMzI7Ci0KLSAgaWYgKHZhcmluZHggPj0gaW5mby0+dmFycy5hbGxvYykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgICAgIGFsbG9jID0gaW5mby0+dmFycy5hbGxvYzsKLSAgICAgIGlmIChhbGxvYyA9PSAwKQotCWFsbG9jID0gNDsKLSAgICAgIHdoaWxlICh2YXJpbmR4ID49IGFsbG9jKQotCWFsbG9jICo9IDI7Ci0gICAgICBpbmZvLT52YXJzLnZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhciAqKQotCQkJIHhyZWFsbG9jIChpbmZvLT52YXJzLnZhcnMsCi0JCQkJICAgYWxsb2MgKiBzaXplb2YgKmluZm8tPnZhcnMudmFycykpOwotICAgICAgbWVtc2V0IChpbmZvLT52YXJzLnZhcnMgKyBpbmZvLT52YXJzLmFsbG9jLCAwLAotCSAgICAgIChhbGxvYyAtIGluZm8tPnZhcnMuYWxsb2MpICogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpOwotICAgICAgaW5mby0+dmFycy5hbGxvYyA9IGFsbG9jOwotICAgIH0KLQotICBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtZSA9IG5hbWU7Ci0gIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1sZW4gPSBuYW1sZW47Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgVFkgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2llZWVfdHkgKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBjb25zdCBiZmRfYnl0ZSAqdHlfc3RhcnQsICp0eV92YXJfc3RhcnQsICp0eV9jb2RlX3N0YXJ0OwotICBiZmRfdm1hIHR5cGVpbmR4LCB2YXJpbmR4LCB0YzsKLSAgUFRSIGRoYW5kbGU7Ci0gIGJvb2xlYW4gdGFnLCB0eXBkZWY7Ci0gIGRlYnVnX3R5cGUgKmFyZ19zbG90czsKLSAgdW5zaWduZWQgbG9uZyB0eXBlX2JpdHNpemU7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLQotICB0eV9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGVpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHR5cGVpbmR4IDwgMjU2KQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X3N0YXJ0LCBfKCJpbGxlZ2FsIHR5cGUgaW5kZXgiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHR5cGVpbmR4IC09IDI1NjsKLSAgaWYgKCEgaWVlZV9hbGxvY190eXBlIChpbmZvLCB0eXBlaW5keCwgZmFsc2UpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKipwcCAhPSAweGNlKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCwgXygidW5rbm93biBUWSBjb2RlIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgdHlfdmFyX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2YXJpbmR4IDwgMzIpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfdmFyX3N0YXJ0LCBfKCJpbGxlZ2FsIHZhcmlhYmxlIGluZGV4IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgdmFyaW5keCAtPSAzMjsKLQotICBpZiAodmFyaW5keCA+PSBpbmZvLT52YXJzLmFsbG9jIHx8IGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfdmFyX3N0YXJ0LCBfKCJ1bmRlZmluZWQgdmFyaWFibGUgaW4gVFkiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHR5X2NvZGVfc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0YykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotCi0gIHRhZyA9IGZhbHNlOwotICB0eXBkZWYgPSBmYWxzZTsKLSAgYXJnX3Nsb3RzID0gTlVMTDsKLSAgdHlwZV9iaXRzaXplID0gMDsKLSAgc3dpdGNoICh0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X2NvZGVfc3RhcnQsIF8oInVua25vd24gVFkgY29kZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgJyEnOgotICAgICAgLyogVW5rbm93biB0eXBlLCB3aXRoIHNpemUuICBXZSB0cmVhdCBpdCBhcyBpbnQuICBGSVhNRS4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzaXplOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLQl0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgc2l6ZSwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdBJzogLyogQXJyYXkuICAqLwotICAgIGNhc2UgJ2EnOiAvKiBGT1JUUkFOIGFycmF5IGluIGNvbHVtbi9yb3cgb3JkZXIuICBGSVhNRTogTm90Ci0JCSBkaXN0aW5ndWlzaGVkIGZyb20gbm9ybWFsIGFycmF5LiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIGVsZV90eXBlOwotCWJmZF92bWEgbG93ZXIsIHVwcGVyOwotCi0JaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmZWxlX3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZsb3dlcikKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnVwcGVyKSkKLQkgIHJldHVybiBmYWxzZTsKLQl0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChkaGFuZGxlLCBlbGVfdHlwZSwKLQkJCQkgICAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgdHlfY29kZV9zdGFydCwKLQkJCQkJCQkgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJICBidWlsdGluX2ludCkpLAotCQkJCSAgICAgIChiZmRfc2lnbmVkX3ZtYSkgbG93ZXIsCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSB1cHBlciwKLQkJCQkgICAgICBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0UnOgotICAgICAgLyogU2ltcGxlIGVudW1lcmF0aW9uLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWNvbnN0IGNoYXIgKipuYW1lczsKLQl1bnNpZ25lZCBpbnQgYzsKLQliZmRfc2lnbmVkX3ZtYSAqdmFsczsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JLyogRklYTUU6IHdlIGlnbm9yZSB0aGUgZW51bWVyYXRpb24gc2l6ZS4gICovCi0KLQlhbGxvYyA9IDEwOwotCW5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7Ci0JbWVtc2V0IChuYW1lcywgMCwgYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLQljID0gMDsKLQl3aGlsZSAoMSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0JICAgIGJvb2xlYW4gcHJlc2VudDsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgcHJlc2VudCkKLQkgICAgICBicmVhazsKLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCQkgeHJlYWxsb2MgKG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkgICAgICB9Ci0KLQkgICAgbmFtZXNbY10gPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCSAgICBpZiAobmFtZXNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICsrYzsKLQkgIH0KLQotCW5hbWVzW2NdID0gTlVMTDsKLQotCXZhbHMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYyAqIHNpemVvZiAqdmFscyk7Ci0JZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQkgIHZhbHNbaV0gPSBpOwotCi0JdHlwZSA9IGRlYnVnX21ha2VfZW51bV90eXBlIChkaGFuZGxlLCBuYW1lcywgdmFscyk7Ci0JdGFnID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICAvKiBTdHJ1Y3Qgd2l0aCBiaXQgZmllbGRzLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0JdW5zaWduZWQgaW50IGM7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JYWxsb2MgPSAxMDsKLQlmaWVsZHMgPSAoZGVidWdfZmllbGQgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmZpZWxkcyk7Ci0JYyA9IDA7Ci0Jd2hpbGUgKDEpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0JICAgIGRlYnVnX3R5cGUgZnR5cGU7Ci0JICAgIGJmZF92bWEgYml0cG9zLCBiaXRzaXplOwotCi0JICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoISBwcmVzZW50KQotCSAgICAgIGJyZWFrOwotCSAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZmdHlwZSkKLQkJfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmJpdHBvcykKLQkJfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmJpdHNpemUpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQotCQkJICB4cmVhbGxvYyAoZmllbGRzLCBhbGxvYyAqIHNpemVvZiAqZmllbGRzKSk7Ci0JICAgICAgfQotCi0JICAgIGZpZWxkc1tjXSA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbiksCi0JCQkJCSAgZnR5cGUsIGJpdHBvcywgYml0c2l6ZSwKLQkJCQkJICBERUJVR19WSVNJQklMSVRZX1BVQkxJQyk7Ci0JICAgIGlmIChmaWVsZHNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICsrYzsKLQkgIH0KLQotCWZpZWxkc1tjXSA9IE5VTEw7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdHJ1ZSwgc2l6ZSwgZmllbGRzKTsKLQl0YWcgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdOJzoKLSAgICAgIC8qIEVudW1lcmF0aW9uLiAgKi8KLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgYWxsb2M7Ci0JY29uc3QgY2hhciAqKm5hbWVzOwotCWJmZF9zaWduZWRfdm1hICp2YWxzOwotCXVuc2lnbmVkIGludCBjOwotCi0JYWxsb2MgPSAxMDsKLQluYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotCXZhbHMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLQljID0gMDsKLQl3aGlsZSAoMSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0JICAgIGJvb2xlYW4gcHJlc2VudDsKLQkgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFsKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBpcyB6ZXJvLCB0aGVuIHRoZSB2YWx1ZSBpcwotICAgICAgICAgICAgICAgYWN0dWFsbHkgdGhlIHNpemUgb2YgdGhlIGVudW0uICBXZSBpZ25vcmUgdGhpcwotICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0JICAgIGlmIChuYW1sZW4gPT0gMCkKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCQkgeHJlYWxsb2MgKG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkJdmFscyA9ICgoYmZkX3NpZ25lZF92bWEgKikKLQkJCXhyZWFsbG9jICh2YWxzLCBhbGxvYyAqIHNpemVvZiAqdmFscykpOwotCSAgICAgIH0KLQotCSAgICBuYW1lc1tjXSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JICAgIGlmIChuYW1lc1tjXSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgdmFsc1tjXSA9IChiZmRfc2lnbmVkX3ZtYSkgdmFsOwotCSAgICArK2M7Ci0JICB9Ci0KLQluYW1lc1tjXSA9IE5VTEw7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWxzKTsKLQl0YWcgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdPJzogLyogU21hbGwgcG9pbnRlci4gIFdlIGRvbid0IGRpc3Rpbmd1aXNoIHNtYWxsIGFuZCBsYXJnZQotCQkgcG9pbnRlcnMuICBGSVhNRS4gICovCi0gICAgY2FzZSAnUCc6IC8qIExhcmdlIHBvaW50ZXIuICAqLwotICAgICAgewotCWRlYnVnX3R5cGUgdDsKLQotCWlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnQpKQotCSAgcmV0dXJuIGZhbHNlOwotCXR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoZGhhbmRsZSwgdCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgLyogUmFuZ2UuICAqLwotICAgICAgewotCWJmZF92bWEgbG93LCBoaWdoLCBzaWduZWRwLCBzaXplOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZsb3cpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZoaWdoKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2lnbmVkcCkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JdHlwZSA9IGRlYnVnX21ha2VfcmFuZ2VfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgICBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCBzaXplLAotCQkJCQkJCSAgICEgc2lnbmVkcCksCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSBsb3csCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSBoaWdoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6IC8qIFN0cnVjdC4gICovCi0gICAgY2FzZSAnVSc6IC8qIFVuaW9uLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0JdW5zaWduZWQgaW50IGM7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JYWxsb2MgPSAxMDsKLQlmaWVsZHMgPSAoZGVidWdfZmllbGQgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmZpZWxkcyk7Ci0JYyA9IDA7Ci0Jd2hpbGUgKDEpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0JICAgIGJmZF92bWEgdGluZHg7Ci0JICAgIGJmZF92bWEgb2Zmc2V0OwotCSAgICBkZWJ1Z190eXBlIGZ0eXBlOwotCSAgICBiZmRfdm1hIGJpdHNpemU7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdGluZHgpCi0JCXx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZvZmZzZXQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAodGluZHggPCAyNTYpCi0JICAgICAgewotCQlmdHlwZSA9IGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCB0eV9jb2RlX3N0YXJ0LCB0aW5keCk7Ci0JCWJpdHNpemUgPSAwOwotCQlvZmZzZXQgKj0gODsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cnVjdCBpZWVlX3R5cGUgKnQ7Ci0KLQkJdGluZHggLT0gMjU2OwotCQlpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHRpbmR4LCB0cnVlKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXQgPSBpbmZvLT50eXBlcy50eXBlcyArIHRpbmR4OwotCQlmdHlwZSA9IHQtPnR5cGU7Ci0JCWJpdHNpemUgPSB0LT5iaXRzaXplOwotCQlpZiAoYml0c2l6ZSA9PSAwKQotCQkgIG9mZnNldCAqPSA4OwotCSAgICAgIH0KLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQotCQkJICB4cmVhbGxvYyAoZmllbGRzLCBhbGxvYyAqIHNpemVvZiAqZmllbGRzKSk7Ci0JICAgICAgfQotCi0JICAgIGZpZWxkc1tjXSA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbiksCi0JCQkJCSAgZnR5cGUsIG9mZnNldCwgYml0c2l6ZSwKLQkJCQkJICBERUJVR19WSVNJQklMSVRZX1BVQkxJQyk7Ci0JICAgIGlmIChmaWVsZHNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICsrYzsKLQkgIH0KLQotCWZpZWxkc1tjXSA9IE5VTEw7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdGMgPT0gJ1MnLCBzaXplLCBmaWVsZHMpOwotCXRhZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogVHlwZWRlZi4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0eXBkZWYgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICAgIC8qIFByb2NlZHVyZS4gIEZJWE1FOiBUaGlzIGlzIGFuIGV4dGVybiBkZWNsYXJhdGlvbiwgd2hpY2ggd2UKLSAgICAgICAgIGhhdmUgbm8gd2F5IG9mIHJlcHJlc2VudGluZy4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBhdHRyOwotCWRlYnVnX3R5cGUgcnR5cGU7Ci0JYmZkX3ZtYSBuYXJnczsKLQlib29sZWFuIHByZXNlbnQ7Ci0Jc3RydWN0IGllZWVfdmFyICpwdjsKLQotCS8qIEZJWE1FOiBXZSBpZ25vcmUgdGhlIGF0dHJpYnV0ZSBhbmQgdGhlIGFyZ3VtZW50IG5hbWVzLiAgKi8KLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXR0cikKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZydHlwZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJm5hcmdzKSkKLQkgIHJldHVybiBmYWxzZTsKLQlkbwotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl3aGlsZSAocHJlc2VudCk7Ci0KLQlwdiA9IGluZm8tPnZhcnMudmFycyArIHZhcmluZHg7Ci0JcHYtPmtpbmQgPSBJRUVFX0VYVEVSTkFMOwotCWlmIChwdi0+bmFtbGVuID4gMAotCSAgICAmJiBkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBydHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQotCSAgewotCSAgICAvKiBTZXQgdXAgdGhlIHJldHVybiB0eXBlIGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcgdG8KLSAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSBzbG90LCBzbyB0aGF0IHdlIGNhbiBjaGFuZ2UgaXQgdG8gYQotICAgICAgICAgICAgICAgcmVmZXJlbmNlIGxhdGVyIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgICAgcHYtPnBzbG90ID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpwdi0+cHNsb3QpOwotCSAgICAqcHYtPnBzbG90ID0gcnR5cGU7Ci0JICAgIHJ0eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBwdi0+cHNsb3QsCi0JCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgfQotCi0JdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgcnR5cGUsIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkJCSBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgLyogVm9pZC4gIFRoaXMgaXMgbm90IGRvY3VtZW50ZWQsIGJ1dCB0aGUgTVJJIGNvbXBpbGVyIGVtaXRzIGl0LiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1onOgotICAgICAgLyogQXJyYXkgd2l0aCAwIGxvd2VyIGJvdW5kLiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIGV0eXBlOwotCWJmZF92bWEgaGlnaDsKLQotCWlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJmV0eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaGlnaCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChkaGFuZGxlLCBldHlwZSwKLQkJCQkgICAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgdHlfY29kZV9zdGFydCwKLQkJCQkJCQkgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJICBidWlsdGluX2ludCkpLAotCQkJCSAgICAgIDAsIChiZmRfc2lnbmVkX3ZtYSkgaGlnaCwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzogLyogQ29tcGxleC4gICovCi0gICAgY2FzZSAnZCc6IC8qIERvdWJsZSBjb21wbGV4LiAgKi8KLSAgICAgIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCi0JLyogRklYTUU6IEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBuYW1lIG1lYW5zLiAgKi8KLQotCWlmICghIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoZGhhbmRsZSwgdGMgPT0gJ2MnID8gNCA6IDgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICAgIC8qIFBhc2NhbCBmaWxlIG5hbWUuICBGSVhNRS4gICovCi0gICAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV9jb2RlX3N0YXJ0LCBfKCJQYXNjYWwgZmlsZSBuYW1lIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlICdnJzoKLSAgICAgIC8qIEJpdGZpZWxkIHR5cGUuICAqLwotICAgICAgewotCWJmZF92bWEgc2lnbmVkcCwgYml0c2l6ZSwgZHVtbXk7Ci0JY29uc3QgYmZkX2J5dGUgKmhvbGQ7Ci0JYm9vbGVhbiBwcmVzZW50OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaWduZWRwKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYml0c2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBJIHRoaW5rIHRoZSBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCB0aGVyZSBpcyBhIHR5cGUgaW5kZXgsCi0gICAgICAgICAgIGJ1dCBzb21lIGFjdHVhbCBmaWxlcyBkbyBub3QgaGF2ZSBvbmUuICAqLwotCWhvbGQgPSAqcHA7Ci0JaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZkdW1teSwgJnByZXNlbnQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICghIHByZXNlbnQpCi0JICB7Ci0JICAgIC8qIEZJWE1FOiBUaGlzIGlzIGp1c3QgYSBndWVzcy4gICovCi0JICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LAotCQkJCQlzaWduZWRwID8gZmFsc2UgOiB0cnVlKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgICpwcCA9IGhvbGQ7Ci0JICAgIGlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnR5cGUpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl0eXBlX2JpdHNpemUgPSBiaXRzaXplOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICduJzoKLSAgICAgIC8qIFF1YWxpZmllci4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBraW5kOwotCWRlYnVnX3R5cGUgdDsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAma2luZCkKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0KSkKLQkgIHJldHVybiBmYWxzZTsKLQotCXN3aXRjaCAoa2luZCkKLQkgIHsKLQkgIGRlZmF1bHQ6Ci0JICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X3N0YXJ0LCBfKCJ1bnN1cHBvcnRlZCBxdWFsaWZlciIpKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBjYXNlIDE6Ci0JICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKGRoYW5kbGUsIHQpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB0eXBlID0gZGVidWdfbWFrZV92b2xhdGlsZV90eXBlIChkaGFuZGxlLCB0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgLyogU2V0LiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JZGVidWdfdHlwZSBldHlwZTsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZldHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBGSVhNRTogV2UgaWdub3JlIHRoZSBzaXplLiAgKi8KLQotCXR5cGUgPSBkZWJ1Z19tYWtlX3NldF90eXBlIChkaGFuZGxlLCBldHlwZSwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICAgIC8qIFByb2NlZHVyZSB3aXRoIGNvbXBpbGVyIGRlcGVuZGVuY2llcy4gICovCi0gICAgICB7Ci0Jc3RydWN0IGllZWVfdmFyICpwdjsKLQliZmRfdm1hIGF0dHIsIGZyYW1lX3R5cGUsIHB1c2hfbWFzaywgbmFyZ3MsIGxldmVsLCBmYXRoZXI7Ci0JZGVidWdfdHlwZSBydHlwZTsKLQlkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0JYm9vbGVhbiB2YXJhcmdzOwotCWJvb2xlYW4gcHJlc2VudDsKLQotCS8qIEZJWE1FOiBXZSBpZ25vcmUgc29tZSBvZiB0aGlzIGluZm9ybWF0aW9uLiAgKi8KLQotCXB2ID0gaW5mby0+dmFycy52YXJzICsgdmFyaW5keDsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXR0cikKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmZyYW1lX3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZwdXNoX21hc2spCi0JICAgIHx8ICEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmcnR5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZuYXJncykpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKG5hcmdzID09IChiZmRfdm1hKSAtMSkKLQkgIHsKLQkgICAgYXJnX3R5cGVzID0gTlVMTDsKLQkgICAgdmFyYXJncyA9IGZhbHNlOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IGk7Ci0KLQkgICAgYXJnX3R5cGVzID0gKChkZWJ1Z190eXBlICopCi0JCQkgeG1hbGxvYyAoKG5hcmdzICsgMSkgKiBzaXplb2YgKmFyZ190eXBlcykpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkgICAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsIGFyZ190eXBlcyArIGkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgLyogSWYgdGhlIGxhc3QgdHlwZSBpcyBwb2ludGVyIHRvIHZvaWQsIHRoaXMgaXMgcmVhbGx5IGEKLSAgICAgICAgICAgICAgIHZhcmFyZ3MgZnVuY3Rpb24uICAqLwotCSAgICB2YXJhcmdzID0gZmFsc2U7Ci0JICAgIGlmIChuYXJncyA+IDApCi0JICAgICAgewotCQlkZWJ1Z190eXBlIGxhc3Q7Ci0KLQkJbGFzdCA9IGFyZ190eXBlc1tuYXJncyAtIDFdOwotCQlpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgbGFzdCkgPT0gREVCVUdfS0lORF9QT0lOVEVSCi0JCSAgICAmJiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwKLQkJCQkJICAgICBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGRoYW5kbGUsCi0JCQkJCQkJCSAgICBsYXN0KSkKLQkJCT09IERFQlVHX0tJTkRfVk9JRCkpCi0JCSAgewotCQkgICAgLS1uYXJnczsKLQkJICAgIHZhcmFyZ3MgPSB0cnVlOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogSWYgdGhlcmUgYXJlIGFueSBwb2ludGVyIGFyZ3VtZW50cywgdHVybiB0aGVtIGludG8KLSAgICAgICAgICAgICAgIGluZGlyZWN0IHR5cGVzIGluIGNhc2Ugd2UgbGF0ZXIgbmVlZCB0byBjb252ZXJ0IHRoZW0gdG8KLSAgICAgICAgICAgICAgIHJlZmVyZW5jZSB0eXBlcy4gICovCi0JICAgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQotCSAgICAgIHsKLQkJaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIGFyZ190eXBlc1tpXSkKLQkJICAgID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkJICB7Ci0JCSAgICBpZiAoYXJnX3Nsb3RzID09IE5VTEwpCi0JCSAgICAgIHsKLQkJCWFyZ19zbG90cyA9ICgoZGVidWdfdHlwZSAqKQotCQkJCSAgICAgeG1hbGxvYyAobmFyZ3MgKiBzaXplb2YgKmFyZ19zbG90cykpOwotCQkJbWVtc2V0IChhcmdfc2xvdHMsIDAsIG5hcmdzICogc2l6ZW9mICphcmdfc2xvdHMpOwotCQkgICAgICB9Ci0JCSAgICBhcmdfc2xvdHNbaV0gPSBhcmdfdHlwZXNbaV07Ci0JCSAgICBhcmdfdHlwZXNbaV0gPQotCQkgICAgICBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsCi0JCQkJCQlhcmdfc2xvdHMgKyBpLAotCQkJCQkJKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBhcmdfdHlwZXNbbmFyZ3NdID0gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbGV2ZWwpCi0JICAgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZmYXRoZXIsICZwcmVzZW50KSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIFdlIGNhbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZnVuY3Rpb24gYW5kIGEgc3RhdGljCi0gICAgICAgICAgIGZ1bmN0aW9uLiAgKi8KLQlwdi0+a2luZCA9IElFRUVfRlVOQ1RJT047Ci0KLQlpZiAocHYtPm5hbWxlbiA+IDAKLQkgICAgJiYgZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgcnR5cGUpID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkgIHsKLQkgICAgLyogU2V0IHVwIHRoZSByZXR1cm4gdHlwZSBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nIHRvCi0gICAgICAgICAgICAgICB0aGUgdmFyaWFibGUgc2xvdCwgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIGl0IHRvIGEKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZSBsYXRlciBpZiBhcHByb3ByaWF0ZS4gICovCi0JICAgIHB2LT5wc2xvdCA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcHYtPnBzbG90KTsKLQkgICAgKnB2LT5wc2xvdCA9IHJ0eXBlOwotCSAgICBydHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgcHYtPnBzbG90LAotCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgIH0KLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIHJ0eXBlLCBhcmdfdHlwZXMsIHZhcmFyZ3MpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFJlY29yZCB0aGUgdHlwZSBpbiB0aGUgdGFibGUuICAqLwotCi0gIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLnR5cGUgPSB0eXBlOwotCi0gIGlmICgodGFnIHx8IHR5cGRlZikKLSAgICAgICYmIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1sZW4gPiAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIG5hbWUgPSBzYXZlc3RyaW5nIChpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtZSwKLQkJCSBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtbGVuKTsKLSAgICAgIGlmICh0eXBkZWYpCi0JdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgdHlwZSk7Ci0gICAgICBlbHNlIGlmICh0YyA9PSAnRScgfHwgdGMgPT0gJ04nKQotCXR5cGUgPSBkZWJ1Z190YWdfdHlwZSAoZGhhbmRsZSwgbmFtZSwgdHlwZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGllZWVfdGFnICppdDsKLQotCSAgLyogV2UgbXVzdCBhbGxvY2F0ZSBhbGwgc3RydWN0IHRhZ3MgYXMgaW5kaXJlY3QgdHlwZXMsIHNvCi0gICAgICAgICAgICAgdGhhdCBpZiB3ZSBsYXRlciBzZWUgYSBkZWZpbml0aW9uIG9mIHRoZSB0YWcgYXMgYSBDKysKLSAgICAgICAgICAgICByZWNvcmQgd2UgY2FuIHVwZGF0ZSB0aGUgaW5kaXJlY3Qgc2xvdCBhbmQgYXV0b21hdGljYWxseQotICAgICAgICAgICAgIGNoYW5nZSBhbGwgdGhlIGV4aXN0aW5nIHJlZmVyZW5jZXMuICAqLwotCSAgaXQgPSAoc3RydWN0IGllZWVfdGFnICopIHhtYWxsb2MgKHNpemVvZiAqaXQpOwotCSAgbWVtc2V0IChpdCwgMCwgc2l6ZW9mICppdCk7Ci0JICBpdC0+bmV4dCA9IGluZm8tPnRhZ3M7Ci0JICBpbmZvLT50YWdzID0gaXQ7Ci0JICBpdC0+bmFtZSA9IG5hbWU7Ci0JICBpdC0+c2xvdCA9IHR5cGU7Ci0KLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsICZpdC0+c2xvdCwgbmFtZSk7Ci0JICB0eXBlID0gZGVidWdfdGFnX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHR5cGUpOwotCi0JICBpdC0+dHlwZSA9IHR5cGU7Ci0JfQotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPnR5cGVzLnR5cGVzW3R5cGVpbmR4XS50eXBlID0gdHlwZTsKLSAgaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLmFyZ19zbG90cyA9IGFyZ19zbG90czsKLSAgaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLmJpdHNpemUgPSB0eXBlX2JpdHNpemU7Ci0KLSAgLyogV2UgbWF5IGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgdHlwZSBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nCi0gICAgIHRvIHNsb3QuICBJdCBkb2VzIG5vIGhhcm0gdG8gcmVwbGFjZSB0aGUgaW5kaXJlY3QgdHlwZSB3aXRoIHRoZQotICAgICByZWFsIHR5cGUuICBGaWxsaW5nIGluIHNsb3QgYXMgd2VsbCBoYW5kbGVzIHRoZSBpbmRpcmVjdCB0eXBlcwotICAgICB3aGljaCBhcmUgYWxyZWFkeSBoYW5naW5nIGFyb3VuZC4gICovCi0gIGlmIChpbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0ucHNsb3QgIT0gTlVMTCkKLSAgICAqaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLnBzbG90ID0gdHlwZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYW4gQVROIHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9pZWVlX2F0biAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICphdG5fc3RhcnQsICphdG5fY29kZV9zdGFydDsKLSAgYmZkX3ZtYSB2YXJpbmR4OwotICBzdHJ1Y3QgaWVlZV92YXIgKnB2YXI7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgYmZkX3ZtYSBhdG5fY29kZTsKLSAgUFRSIGRoYW5kbGU7Ci0gIGJmZF92bWEgdiwgdjIsIHYzLCB2NCwgdjU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotICBjaGFyICpuYW1jb3B5OwotICBib29sZWFuIHByZXNlbnQ7Ci0gIGludCBibG9ja3R5cGU7Ci0KLSAgYXRuX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmdHlwZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGF0bl9jb2RlX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXRuX2NvZGUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmFyaW5keCA9PSAwKQotICAgIHsKLSAgICAgIHB2YXIgPSBOVUxMOwotICAgICAgbmFtZSA9ICIiOwotICAgICAgbmFtbGVuID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhcmluZHggPCAzMikKLSAgICB7Ci0gICAgICAvKiBUaGUgTVJJIGNvbXBpbGVyIHJlcG9ydGVkbHkgc29tZXRpbWVzIGVtaXRzIHZhcmlhYmxlIGxpZmV0aW1lCi0gICAgICAgICBpbmZvcm1hdGlvbiBmb3IgYSByZWdpc3Rlci4gIFdlIGp1c3QgaWdub3JlIGl0LiAgKi8KLSAgICAgIGlmIChhdG5fY29kZSA9PSA5KQotCXJldHVybiBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpOwotCi0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fc3RhcnQsIF8oImlsbGVnYWwgdmFyaWFibGUgaW5kZXgiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFyaW5keCAtPSAzMjsKLSAgICAgIGlmICh2YXJpbmR4ID49IGluZm8tPnZhcnMuYWxsb2MKLQkgIHx8IGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lID09IE5VTEwpCi0JewotCSAgLyogVGhlIE1SSSBjb21waWxlciBvciBsaW5rZXIgc29tZXRpbWVzIG9taXRzIHRoZSBOTiByZWNvcmQKLSAgICAgICAgICAgICBmb3IgYSBwbWlzYyByZWNvcmQuICAqLwotCSAgaWYgKGF0bl9jb2RlID09IDYyKQotCSAgICB7Ci0JICAgICAgaWYgKHZhcmluZHggPj0gaW5mby0+dmFycy5hbGxvYykKLQkJewotCQkgIHVuc2lnbmVkIGludCBhbGxvYzsKLQotCQkgIGFsbG9jID0gaW5mby0+dmFycy5hbGxvYzsKLQkJICBpZiAoYWxsb2MgPT0gMCkKLQkJICAgIGFsbG9jID0gNDsKLQkJICB3aGlsZSAodmFyaW5keCA+PSBhbGxvYykKLQkJICAgIGFsbG9jICo9IDI7Ci0JCSAgaW5mby0+dmFycy52YXJzID0gKChzdHJ1Y3QgaWVlZV92YXIgKikKLQkJCQkgICAgIHhyZWFsbG9jIChpbmZvLT52YXJzLnZhcnMsCi0JCQkJCSAgICAgICAoYWxsb2MKLQkJCQkJCSogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpKSk7Ci0JCSAgbWVtc2V0IChpbmZvLT52YXJzLnZhcnMgKyBpbmZvLT52YXJzLmFsbG9jLCAwLAotCQkJICAoKGFsbG9jIC0gaW5mby0+dmFycy5hbGxvYykKLQkJCSAgICogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpKTsKLQkJICBpbmZvLT52YXJzLmFsbG9jID0gYWxsb2M7Ci0JCX0KLQotCSAgICAgIHB2YXIgPSBpbmZvLT52YXJzLnZhcnMgKyB2YXJpbmR4OwotCSAgICAgIHB2YXItPm5hbWUgPSAiIjsKLQkgICAgICBwdmFyLT5uYW1sZW4gPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fc3RhcnQsIF8oInVuZGVmaW5lZCB2YXJpYWJsZSBpbiBBVE4iKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBwdmFyID0gaW5mby0+dmFycy52YXJzICsgdmFyaW5keDsKLQotICAgICAgcHZhci0+dHlwZSA9IHR5cGU7Ci0KLSAgICAgIG5hbWUgPSBwdmFyLT5uYW1lOwotICAgICAgbmFtbGVuID0gcHZhci0+bmFtbGVuOwotICAgIH0KLQotICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gY2FsbCBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgd2l0aCBhIHBvaW50ZXIKLSAgICAgdHlwZSwgY2hhbmdlIHRoZSB0eXBlIHRvIGFuIGluZGlyZWN0IHR5cGUgc28gdGhhdCB3ZSBjYW4gbGF0ZXIKLSAgICAgY2hhbmdlIGl0IHRvIGEgcmVmZXJlbmNlIHR5cGUgaWYgd2UgZW5jb3VudGVyIGEgQysrIHBtaXNjICdSJwotICAgICByZWNvcmQuICAqLwotICBpZiAocHZhciAhPSBOVUxMCi0gICAgICAmJiB0eXBlICE9IERFQlVHX1RZUEVfTlVMTAotICAgICAgJiYgZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgdHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYXRuX2NvZGUpCi0JewotCWNhc2UgMToKLQljYXNlIDI6Ci0JY2FzZSAzOgotCWNhc2UgNToKLQljYXNlIDg6Ci0JY2FzZSAxMDoKLQkgIHB2YXItPnBzbG90ID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpwdmFyLT5wc2xvdCk7Ci0JICAqcHZhci0+cHNsb3QgPSB0eXBlOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgcHZhci0+cHNsb3QsCi0JCQkJCSAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgcHZhci0+dHlwZSA9IHR5cGU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHN3aXRjaCAoYXRuX2NvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fY29kZV9zdGFydCwgXygidW5rbm93biBBVE4gdHlwZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgMToKLSAgICAgIC8qIEF1dG9tYXRpYyB2YXJpYWJsZS4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9MT0NBTDsKLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsIERFQlVHX0xPQ0FMLCB2KTsKLQotICAgIGNhc2UgMjoKLSAgICAgIC8qIFJlZ2lzdGVyIHZhcmlhYmxlLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAodHlwZSA9PSBOVUxMKQotCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXB2YXItPmtpbmQgPSBJRUVFX0xPQ0FMOwotICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwgdHlwZSwgREVCVUdfUkVHSVNURVIsCi0JCQkJICAgIGllZWVfcmVnbm9fdG9fZ2VucmVnIChpbmZvLT5hYmZkLCB2KSk7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBTdGF0aWMgdmFyaWFibGUuICAqLwotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLSAgICAgIGlmICh0eXBlID09IE5VTEwpCi0JdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA8PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKQotCWJsb2NrdHlwZSA9IDA7Ci0gICAgICBlbHNlCi0JYmxvY2t0eXBlID0gaW5mby0+YmxvY2tzdGFjay5ic3BbLTFdLmtpbmQ7Ci0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXsKLQkgIGlmIChibG9ja3R5cGUgPT0gNCB8fCBibG9ja3R5cGUgPT0gNikKLQkgICAgcHZhci0+a2luZCA9IElFRUVfTE9DQUw7Ci0JICBlbHNlCi0JICAgIHB2YXItPmtpbmQgPSBJRUVFX1NUQVRJQzsKLQl9Ci0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLAotCQkJCSAgICAoYmxvY2t0eXBlID09IDQgfHwgYmxvY2t0eXBlID09IDYKLQkJCQkgICAgID8gREVCVUdfTE9DQUxfU1RBVElDCi0JCQkJICAgICA6IERFQlVHX1NUQVRJQyksCi0JCQkJICAgIHYpOwotCi0gICAgY2FzZSA0OgotICAgICAgLyogRXh0ZXJuYWwgZnVuY3Rpb24uICBXZSBkb24ndCBjdXJyZW50bHkgcmVjb3JkIHRoZXNlLiAgRklYTUUuICAqLwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9FWFRFUk5BTDsKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSA1OgotICAgICAgLyogRXh0ZXJuYWwgdmFyaWFibGUuICBXZSBkb24ndCBjdXJyZW50bHkgcmVjb3JkIHRoZXNlLiAgRklYTUUuICAqLwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9FWFRFUk5BTDsKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSA3OgotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQotCSAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYyKQotCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYzLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHByZXNlbnQpCi0JewotCSAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2NCwgJnByZXNlbnQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgdHdvIG9wdGlvbmFsIGZpZWxkcyBpbiB2MyBhbmQgdjQsIHNpbmNlCi0gICAgICAgICB0aGV5IGFyZSBub3QgZGVmaW5lZC4gICovCi0KLSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBjb2x1bW4gbnVtYmVyLiAgRklYTUUuICAqLwotCi0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX2xpbmUgKGRoYW5kbGUsIHYsIHYzKTsKLQotICAgIGNhc2UgODoKLSAgICAgIC8qIEdsb2JhbCB2YXJpYWJsZS4gICovCi0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9HTE9CQUw7Ci0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLCBERUJVR19HTE9CQUwsIHYpOwotCi0gICAgY2FzZSA5OgotICAgICAgLyogVmFyaWFibGUgbGlmZXRpbWUgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDEwOgotICAgICAgLyogTG9ja2VkIHJlZ2lzdGVyLiAgVGhlIHNwZWMgc2F5cyB0aGF0IHRoZXJlIGFyZSB0d28gcmVxdWlyZWQKLSAgICAgICAgIGZpZWxkcywgYnV0IGF0IGxlYXN0IG9uIG9jY2FzaW9uIHRoZSBNUkkgY29tcGlsZXIgb25seSBlbWl0cwotICAgICAgICAgb25lLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MiwgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSSB0aGluayB0aGlzIG1lYW5zIGEgdmFyaWFibGUgdGhhdCBpcyBib3RoIGluIGEgcmVnaXN0ZXIgYW5kCi0gICAgICAgICBhIGZyYW1lIHNsb3QuICBXZSBpZ25vcmUgdGhlIGZyYW1lIHNsb3QuICBGSVhNRS4gICovCi0KLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9MT0NBTDsKLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsIERFQlVHX1JFR0lTVEVSLCB2KTsKLQotICAgIGNhc2UgMTE6Ci0gICAgICAvKiBSZXNlcnZlZCBmb3IgRk9SVFJBTiBjb21tb24uICAqLwotICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX2NvZGVfc3RhcnQsIF8oInVuc3VwcG9ydGVkIEFUTjExIikpOwotCi0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSAxMjoKLSAgICAgIC8qIEJhc2VkIHZhcmlhYmxlLiAgKi8KLSAgICAgIHYzID0gMDsKLSAgICAgIHY0ID0gMHg4MDsKLSAgICAgIHY1ID0gMDsKLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2MikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MywgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwcmVzZW50KQotCXsKLQkgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjQsICZwcmVzZW50KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKHByZXNlbnQpCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnY1LCAmcHJlc2VudCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0KLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9jb2RlX3N0YXJ0LCBfKCJ1bnN1cHBvcnRlZCBBVE4xMiIpKTsKLQotICAgICAgLyogUmV0dXJuIHRydWUgdG8ga2VlcCBnb2luZy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgMTY6Ci0gICAgICAvKiBDb25zdGFudC4gIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHRoYXQgSSBoYXZlIGlzIGFtYmlndW91cywKLSAgICAgICAgIHNvIEknbSBub3QgZ29pbmcgdG8gdHJ5IHRvIGltcGxlbWVudCBpdC4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpCi0JICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjIsICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHJlc2VudCkKLQl7Ci0JICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYyLCAmcHJlc2VudCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChwcmVzZW50KQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcCA9PSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bSkKLQl7Ci0JICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDE5OgotICAgICAgLyogU3RhdGljIHZhcmlhYmxlIGZyb20gYXNzZW1ibGVyLiAgKi8KLSAgICAgIHYyID0gMDsKLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MiwgJnByZXNlbnQpCi0JICB8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgLyogV2UgZG9uJ3QgcmVhbGx5IGhhbmRsZSB0aGlzIGNvcnJlY3RseS4gIEZJWE1FLiAgKi8KLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksCi0JCQkJICAgIGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKSwKLQkJCQkgICAgdjIgIT0gMCA/IERFQlVHX0dMT0JBTCA6IERFQlVHX1NUQVRJQywKLQkJCQkgICAgdjMpOwotCi0gICAgY2FzZSA2MjoKLSAgICAgIC8qIFByb2NlZHVyZSBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uLiAgKi8KLSAgICBjYXNlIDYzOgotICAgICAgLyogVmFyaWFibGUgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbi4gICovCi0gICAgY2FzZSA2NDoKLSAgICAgIC8qIE1vZHVsZSBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2MikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChhdG5fY29kZSA9PSA2MiAmJiB2ID09IDgwKQotCXsKLQkgIGlmIChwcmVzZW50KQotCSAgICB7Ci0JICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX2NvZGVfc3RhcnQsCi0JCQkgIF8oInVuZXhwZWN0ZWQgc3RyaW5nIGluIEMrKyBtaXNjIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgcmV0dXJuIGllZWVfcmVhZF9jeHhfbWlzYyAoaW5mbywgcHAsIHYyKTsKLQl9Ci0KLSAgICAgIC8qIFdlIGp1c3QgaWdub3JlIGFsbCBvZiB0aGlzIHN0dWZmLiAgRklYTUUuICAqLwotCi0gICAgICBmb3IgKDsgdjIgPiAwOyAtLXYyKQotCXsKLQkgIHN3aXRjaCAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcCkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCwgXygiYmFkIG1pc2MgcmVjb3JkIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBjYXNlIGllZWVfYXRfcmVjb3JkX2VudW06Ci0JICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bToKLQkgICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYzKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogSGFuZGxlIEMrKyBkZWJ1Z2dpbmcgbWlzY2VsbGFuZW91cyByZWNvcmRzLiAgVGhpcyBpcyBjYWxsZWQgZm9yCi0gICBwcm9jZWR1cmUgbWlzY2VsbGFuZW91cyByZWNvcmRzIG9mIHR5cGUgODAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX2N4eF9taXNjIChpbmZvLCBwcCwgY291bnQpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgYmZkX3ZtYSBjYXRlZ29yeTsKLQotICBzdGFydCA9ICpwcDsKLQotICAvKiBHZXQgdGhlIGNhdGVnb3J5IG9mIEMrKyBtaXNjIHJlY29yZC4gICovCi0gIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY2F0ZWdvcnkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLS1jb3VudDsKLQotICBzd2l0Y2ggKGNhdGVnb3J5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVucmVjb2duaXplZCBDKysgbWlzYyByZWNvcmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIGlmICghIGllZWVfcmVhZF9jeHhfY2xhc3MgKGluZm8sIHBwLCBjb3VudCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgIHsKLQliZmRfdm1hIGZsYWdzOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0KLQkvKiBUaGUgSUVFRSBzcGVjIGluZGljYXRlcyB0aGF0IHRoZSAnTScgcmVjb3JkIG9ubHkgaGFzIGEKLSAgICAgICAgICAgZmxhZ3MgZmllbGQuICBUaGUgTVJJIGNvbXBpbGVyIGFsc28gZW1pdHMgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgIGZ1bmN0aW9uLiAgKi8KLQotCWlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICgqcHAgPCBpbmZvLT5wZW5kCi0JICAgICYmIChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHAgPT0gaWVlZV9hdF9yZWNvcmRfZW51bSkKLQkgIHsKLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCS8qIFRoaXMgaXMgZW1pdHRlZCBmb3IgbWV0aG9kIGZ1bmN0aW9ucywgYnV0IEkgZG9uJ3QgdGhpbmsgd2UKLSAgICAgICAgICAgY2FyZSB2ZXJ5IG11Y2guICBJdCBtaWdodCBoZWxwIGlmIGl0IHRvbGQgdXMgdXNlZnVsCi0gICAgICAgICAgIGluZm9ybWF0aW9uIGxpa2UgdGhlIGNsYXNzIHdpdGggd2hpY2ggdGhpcyBmdW5jdGlvbiBpcwotICAgICAgICAgICBhc3NvY2lhdGVkLCBidXQgaXQgZG9lc24ndCwgc28gaXQgaXNuJ3QgaGVscGZ1bC4gICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0InOgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2N4eF9kZWZhdWx0cyAoaW5mbywgcHAsIGNvdW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3onOgotICAgICAgewotCWNvbnN0IGNoYXIgKm5hbWUsICptYW5nbGVkLCAqY2xhc3M7Ci0JdW5zaWduZWQgbG9uZyBuYW1sZW4sIG1hbmdsZWRsZW4sIGNsYXNzbGVuOwotCWJmZF92bWEgY29udHJvbDsKLQotCS8qIFBvaW50ZXIgdG8gbWVtYmVyLiAgKi8KLQotCWlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKQotCSAgICB8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZtYW5nbGVkLCAmbWFuZ2xlZGxlbikKLQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmY2xhc3MsICZjbGFzc2xlbikKLQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNvbnRyb2wpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogRklYTUU6IFdlIHNob3VsZCBub3cgdHJhY2sgZG93biBuYW1lIGFuZCBjaGFuZ2UgaXRzIHR5cGUuICAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgIGlmICghIGllZWVfcmVhZF9yZWZlcmVuY2UgKGluZm8sIHBwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBDKysgY2xhc3MgZGVmaW5pdGlvbi4gIFRoaXMgaXMgYSBwbWlzYyB0eXBlIDgwIHJlY29yZCBvZgotICAgY2F0ZWdvcnkgJ1QnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9jeHhfY2xhc3MgKGluZm8sIHBwLCBjb3VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBiZmRfdm1hIGNsYXNzOwotICBjb25zdCBjaGFyICp0YWc7Ci0gIHVuc2lnbmVkIGxvbmcgdGFnbGVuOwotICBzdHJ1Y3QgaWVlZV90YWcgKml0OwotICBQVFIgZGhhbmRsZTsKLSAgZGVidWdfZmllbGQgKmZpZWxkczsKLSAgdW5zaWduZWQgaW50IGZpZWxkX2NvdW50LCBmaWVsZF9hbGxvYzsKLSAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKLSAgdW5zaWduZWQgaW50IGJhc2VjbGFzc2VzX2NvdW50LCBiYXNlY2xhc3Nlc19hbGxvYzsKLSAgY29uc3QgZGVidWdfZmllbGQgKnN0cnVjdGZpZWxkczsKLSAgc3RydWN0IGllZWVfbWV0aG9kCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotICAgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnZhcmlhbnRzOwotICAgICAgdW5zaWduZWQgY291bnQ7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gICAgfSAqbWV0aG9kczsKLSAgdW5zaWduZWQgaW50IG1ldGhvZHNfY291bnQsIG1ldGhvZHNfYWxsb2M7Ci0gIGRlYnVnX3R5cGUgdnB0cmJhc2U7Ci0gIGJvb2xlYW4gb3dudnB0cjsKLSAgZGVidWdfbWV0aG9kICpkbWV0aG9kczsKLQotICBzdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNsYXNzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC0tY291bnQ7Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJnRhZywgJnRhZ2xlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotICAtLWNvdW50OwotCi0gIC8qIEZpbmQgdGhlIEMgc3RydWN0IHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgZm9yIChpdCA9IGluZm8tPnRhZ3M7IGl0ICE9IE5VTEw7IGl0ID0gaXQtPm5leHQpCi0gICAgaWYgKGl0LT5uYW1lWzBdID09IHRhZ1swXQotCSYmIHN0cm5jbXAgKGl0LT5uYW1lLCB0YWcsIHRhZ2xlbikgPT0gMAotCSYmIHN0cmxlbiAoaXQtPm5hbWUpID09IHRhZ2xlbikKLSAgICAgIGJyZWFrOwotICBpZiAoaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5kZWZpbmVkIEMrKyBvYmplY3QiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotCi0gIGZpZWxkcyA9IE5VTEw7Ci0gIGZpZWxkX2NvdW50ID0gMDsKLSAgZmllbGRfYWxsb2MgPSAwOwotICBiYXNlY2xhc3NlcyA9IE5VTEw7Ci0gIGJhc2VjbGFzc2VzX2NvdW50ID0gMDsKLSAgYmFzZWNsYXNzZXNfYWxsb2MgPSAwOwotICBtZXRob2RzID0gTlVMTDsKLSAgbWV0aG9kc19jb3VudCA9IDA7Ci0gIG1ldGhvZHNfYWxsb2MgPSAwOwotICB2cHRyYmFzZSA9IERFQlVHX1RZUEVfTlVMTDsKLSAgb3dudnB0ciA9IGZhbHNlOwotCi0gIHN0cnVjdGZpZWxkcyA9IGRlYnVnX2dldF9maWVsZHMgKGRoYW5kbGUsIGl0LT50eXBlKTsKLQotICB3aGlsZSAoY291bnQgPiAwKQotICAgIHsKLSAgICAgIGJmZF92bWEgaWQ7Ci0gICAgICBjb25zdCBiZmRfYnl0ZSAqc3BlY19zdGFydDsKLQotICAgICAgc3BlY19zdGFydCA9ICpwcDsKLQotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZpZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLS1jb3VudDsKLQotICAgICAgc3dpdGNoIChpZCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGllZWVfZXJyb3IgKGluZm8sIHNwZWNfc3RhcnQsIF8oInVucmVjb2duaXplZCBDKysgb2JqZWN0IHNwZWMiKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0KLQljYXNlICdiJzoKLQkgIHsKLQkgICAgYmZkX3ZtYSBmbGFncywgY2lubGluZTsKLQkgICAgY29uc3QgY2hhciAqYmFzZW5hbWUsICpmaWVsZG5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgYmFzZWxlbiwgZmllbGRsZW47Ci0JICAgIGNoYXIgKmJhc2Vjb3B5OwotCSAgICBkZWJ1Z190eXBlIGJhc2V0eXBlOwotCSAgICBiZmRfdm1hIGJpdHBvczsKLQkgICAgYm9vbGVhbiB2aXJ0dWFscDsKLQkgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0JICAgIGRlYnVnX2Jhc2VjbGFzcyBiYXNlY2xhc3M7Ci0KLQkgICAgLyogVGhpcyByZXByZXNlbnRzIGEgYmFzZSBvciBmcmllbmQgY2xhc3MuICAqLwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmJhc2VuYW1lLCAmYmFzZWxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNpbmxpbmUpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmZpZWxkbmFtZSwgJmZpZWxkbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDQ7Ci0KLQkgICAgLyogV2UgaGF2ZSBubyB3YXkgb2YgcmVjb3JkaW5nIGZyaWVuZCBpbmZvcm1hdGlvbiwgc28gd2UKLSAgICAgICAgICAgICAgIGp1c3QgaWdub3JlIGl0LiAgKi8KLQkgICAgaWYgKChmbGFncyAmIEJBU0VGTEFHU19GUklFTkQpICE9IDApCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSSBhc3N1bWUgdGhhdCBlaXRoZXIgYWxsIG9mIHRoZSBtZW1iZXJzIG9mIHRoZQotICAgICAgICAgICAgICAgYmFzZWNsYXNzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0LCBzdGFydGluZyBhdCB0aGUKLSAgICAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0LCBvciB0aGF0IG5vbmUgb2YgdGhlbSBhcmUKLSAgICAgICAgICAgICAgIGluY2x1ZGVkLiAgKi8KLQotCSAgICBpZiAoKGZpZWxkbGVuID09IDApID09IChjaW5saW5lID09IDApKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVuc3VwcG9ydGVkIEMrKyBvYmplY3QgdHlwZSIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBiYXNlY29weSA9IHNhdmVzdHJpbmcgKGJhc2VuYW1lLCBiYXNlbGVuKTsKLQkgICAgYmFzZXR5cGUgPSBkZWJ1Z19maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBiYXNlY29weSwKLQkJCQkJICAgICAgIERFQlVHX0tJTkRfSUxMRUdBTCk7Ci0JICAgIGZyZWUgKGJhc2Vjb3B5KTsKLQkgICAgaWYgKGJhc2V0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgYmFzZSBjbGFzcyBub3QgZGVmaW5lZCIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoZmllbGRsZW4gPT0gMCkKLQkgICAgICBiaXRwb3MgPSAwOwotCSAgICBlbHNlCi0JICAgICAgewotCQljb25zdCBkZWJ1Z19maWVsZCAqcGY7Ci0KLQkJaWYgKHN0cnVjdGZpZWxkcyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgb2JqZWN0IGhhcyBubyBmaWVsZHMiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCWZvciAocGYgPSBzdHJ1Y3RmaWVsZHM7ICpwZiAhPSBERUJVR19GSUVMRF9OVUxMOyBwZisrKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotCi0JCSAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChkaGFuZGxlLCAqcGYpOwotCQkgICAgaWYgKGZuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmIChmbmFtZVswXSA9PSBmaWVsZG5hbWVbMF0KLQkJCSYmIHN0cm5jbXAgKGZuYW1lLCBmaWVsZG5hbWUsIGZpZWxkbGVuKSA9PSAwCi0JCQkmJiBzdHJsZW4gKGZuYW1lKSA9PSBmaWVsZGxlbikKLQkJICAgICAgYnJlYWs7Ci0JCSAgfQotCQlpZiAoKnBmID09IERFQlVHX0ZJRUxEX05VTEwpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkJXygiQysrIGJhc2UgY2xhc3Mgbm90IGZvdW5kIGluIGNvbnRhaW5lciIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJYml0cG9zID0gZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyAoZGhhbmRsZSwgKnBmKTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKChmbGFncyAmIEJBU0VGTEFHU19WSVJUVUFMKSAhPSAwKQotCSAgICAgIHZpcnR1YWxwID0gdHJ1ZTsKLQkgICAgZWxzZQotCSAgICAgIHZpcnR1YWxwID0gZmFsc2U7Ci0JICAgIGlmICgoZmxhZ3MgJiBCQVNFRkxBR1NfUFJJVkFURSkgIT0gMCkKLQkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCSAgICBlbHNlCi0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCi0JICAgIGJhc2VjbGFzcyA9IGRlYnVnX21ha2VfYmFzZWNsYXNzIChkaGFuZGxlLCBiYXNldHlwZSwgYml0cG9zLAotCQkJCQkgICAgICB2aXJ0dWFscCwgdmlzaWJpbGl0eSk7Ci0JICAgIGlmIChiYXNlY2xhc3MgPT0gREVCVUdfQkFTRUNMQVNTX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGlmIChiYXNlY2xhc3Nlc19jb3VudCArIDEgPj0gYmFzZWNsYXNzZXNfYWxsb2MpCi0JICAgICAgewotCQliYXNlY2xhc3Nlc19hbGxvYyArPSAxMDsKLQkJYmFzZWNsYXNzZXMgPSAoKGRlYnVnX2Jhc2VjbGFzcyAqKQotCQkJICAgICAgIHhyZWFsbG9jIChiYXNlY2xhc3NlcywKLQkJCQkJIChiYXNlY2xhc3Nlc19hbGxvYwotCQkJCQkgICogc2l6ZW9mICpiYXNlY2xhc3NlcykpKTsKLQkgICAgICB9Ci0KLQkgICAgYmFzZWNsYXNzZXNbYmFzZWNsYXNzZXNfY291bnRdID0gYmFzZWNsYXNzOwotCSAgICArK2Jhc2VjbGFzc2VzX2NvdW50OwotCSAgICBiYXNlY2xhc3Nlc1tiYXNlY2xhc3Nlc19jb3VudF0gPSBERUJVR19CQVNFQ0xBU1NfTlVMTDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6Ci0JICB7Ci0JICAgIGJmZF92bWEgZmxhZ3M7Ci0JICAgIGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgKm1hbmdsZWRuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIGZpZWxkbGVuLCBtYW5nbGVkbGVuOwotCSAgICBjaGFyICpmaWVsZGNvcHk7Ci0JICAgIGJvb2xlYW4gc3RhdGljcDsKLQkgICAgZGVidWdfdHlwZSBmdHlwZTsKLQkgICAgY29uc3QgZGVidWdfZmllbGQgKnBmID0gTlVMTDsKLQkgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0JICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotCi0JICAgIC8qIFRoaXMgcmVwcmVzZW50cyBhIGRhdGEgbWVtYmVyLiAgKi8KLQotCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmZsYWdzKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZmaWVsZG5hbWUsICZmaWVsZGxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbWFuZ2xlZG5hbWUsICZtYW5nbGVkbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDM7Ci0KLQkgICAgZmllbGRjb3B5ID0gc2F2ZXN0cmluZyAoZmllbGRuYW1lLCBmaWVsZGxlbik7Ci0KLQkgICAgc3RhdGljcCA9IChmbGFncyAmIENYWEZMQUdTX1NUQVRJQykgIT0gMCA/IHRydWUgOiBmYWxzZTsKLQotCSAgICBpZiAoc3RhdGljcCkKLQkgICAgICB7Ci0JCXN0cnVjdCBpZWVlX3ZhciAqcHYsICpwdmVuZDsKLQotCQkvKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBkZWZpbml0aW9uIGZvciB0aGlzIHZhcmlhYmxlLiAgKi8KLQkJcHYgPSBpbmZvLT52YXJzLnZhcnM7Ci0JCXB2ZW5kID0gcHYgKyBpbmZvLT52YXJzLmFsbG9jOwotCQlmb3IgKDsgcHYgPCBwdmVuZDsgcHYrKykKLQkJICBpZiAocHYtPm5hbWxlbiA9PSBtYW5nbGVkbGVuCi0JCSAgICAgICYmIHN0cm5jbXAgKHB2LT5uYW1lLCBtYW5nbGVkbmFtZSwgbWFuZ2xlZGxlbikgPT0gMCkKLQkJICAgIGJyZWFrOwotCQlpZiAocHYgPCBwdmVuZCkKLQkJICBmdHlwZSA9IHB2LT50eXBlOwotCQllbHNlCi0JCSAgewotCQkgICAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB2YXJpYWJsZSBpcyBuZXZlciB1c2VkLiAgKi8KLQkJICAgIGZ0eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHN0YXJ0LAotCQkJCQkgICAgICAgKHVuc2lnbmVkIGludCkgYnVpbHRpbl92b2lkKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgZmluZHg7Ci0KLQkJaWYgKHN0cnVjdGZpZWxkcyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgb2JqZWN0IGhhcyBubyBmaWVsZHMiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCWZvciAocGYgPSBzdHJ1Y3RmaWVsZHMsIGZpbmR4ID0gMDsKLQkJICAgICAqcGYgIT0gREVCVUdfRklFTERfTlVMTDsKLQkJICAgICBwZisrLCBmaW5keCsrKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotCi0JCSAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChkaGFuZGxlLCAqcGYpOwotCQkgICAgaWYgKGZuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmIChmbmFtZVswXSA9PSBtYW5nbGVkbmFtZVswXQotCQkJJiYgc3RybmNtcCAoZm5hbWUsIG1hbmdsZWRuYW1lLCBtYW5nbGVkbGVuKSA9PSAwCi0JCQkmJiBzdHJsZW4gKGZuYW1lKSA9PSBtYW5nbGVkbGVuKQotCQkgICAgICBicmVhazsKLQkJICB9Ci0JCWlmICgqcGYgPT0gREVCVUdfRklFTERfTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCQlfKCJDKysgZGF0YSBtZW1iZXIgbm90IGZvdW5kIGluIGNvbnRhaW5lciIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJZnR5cGUgPSBkZWJ1Z19nZXRfZmllbGRfdHlwZSAoZGhhbmRsZSwgKnBmKTsKLQotCQlpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgZnR5cGUpID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkJICB7Ci0JCSAgICAvKiBXZSBtaWdodCBuZWVkIHRvIGNvbnZlcnQgdGhpcyBmaWVsZCBpbnRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHR5cGUgbGF0ZXIgb24sIHNvIG1ha2UgaXQgYW4gaW5kaXJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZS4gICovCi0JCSAgICBpZiAoaXQtPmZzbG90cyA9PSBOVUxMKQotCQkgICAgICB7Ci0JCQl1bnNpZ25lZCBpbnQgZmNudDsKLQkJCWNvbnN0IGRlYnVnX2ZpZWxkICpwZmNudDsKLQotCQkJZmNudCA9IDA7Ci0JCQlmb3IgKHBmY250ID0gc3RydWN0ZmllbGRzOwotCQkJICAgICAqcGZjbnQgIT0gREVCVUdfRklFTERfTlVMTDsKLQkJCSAgICAgcGZjbnQrKykKLQkJCSAgKytmY250OwotCQkJaXQtPmZzbG90cyA9ICgoZGVidWdfdHlwZSAqKQotCQkJCSAgICAgIHhtYWxsb2MgKGZjbnQgKiBzaXplb2YgKml0LT5mc2xvdHMpKTsKLQkJCW1lbXNldCAoaXQtPmZzbG90cywgMCwKLQkJCQlmY250ICogc2l6ZW9mICppdC0+ZnNsb3RzKTsKLQkJICAgICAgfQotCi0JCSAgICBpZiAoZnR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpdC0+ZnNsb3RzW2ZpbmR4XSA9IGZ0eXBlOwotCQkgICAgZnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsCi0JCQkJCQkgICAgICBpdC0+ZnNsb3RzICsgZmluZHgsCi0JCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoZnR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBzd2l0Y2ggKGZsYWdzICYgQ1hYRkxBR1NfVklTSUJJTElUWSkKLQkgICAgICB7Ci0JICAgICAgZGVmYXVsdDoKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVua25vd24gQysrIHZpc2liaWxpdHkiKSk7Ci0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QVUJMSUM6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJJVkFURToKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBpZiAoc3RhdGljcCkKLQkgICAgICB7Ci0JCWNoYXIgKm1hbmdsZWRjb3B5OwotCi0JCW1hbmdsZWRjb3B5ID0gc2F2ZXN0cmluZyAobWFuZ2xlZG5hbWUsIG1hbmdsZWRsZW4pOwotCi0JCWZpZWxkID0gZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyIChkaGFuZGxlLCBmaWVsZGNvcHksCi0JCQkJCQkgIGZ0eXBlLCBtYW5nbGVkY29weSwKLQkJCQkJCSAgdmlzaWJpbGl0eSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQliZmRfdm1hIGJpdHBvcywgYml0c2l6ZTsKLQotCQliaXRwb3MgPSBkZWJ1Z19nZXRfZmllbGRfYml0cG9zIChkaGFuZGxlLCAqcGYpOwotCQliaXRzaXplID0gZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUgKGRoYW5kbGUsICpwZik7Ci0JCWlmIChiaXRwb3MgPT0gKGJmZF92bWEpIC0xIHx8IGJpdHNpemUgPT0gKGJmZF92bWEpIC0xKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJiYWQgQysrIGZpZWxkIGJpdCBwb3Mgb3Igc2l6ZSIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCWZpZWxkID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgZmllbGRjb3B5LCBmdHlwZSwgYml0cG9zLAotCQkJCQkgIGJpdHNpemUsIHZpc2liaWxpdHkpOwotCSAgICAgIH0KLQotCSAgICBpZiAoZmllbGQgPT0gREVCVUdfRklFTERfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgaWYgKGZpZWxkX2NvdW50ICsgMSA+PSBmaWVsZF9hbGxvYykKLQkgICAgICB7Ci0JCWZpZWxkX2FsbG9jICs9IDEwOwotCQlmaWVsZHMgPSAoKGRlYnVnX2ZpZWxkICopCi0JCQkgIHhyZWFsbG9jIChmaWVsZHMsIGZpZWxkX2FsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgICB9Ci0KLQkgICAgZmllbGRzW2ZpZWxkX2NvdW50XSA9IGZpZWxkOwotCSAgICArK2ZpZWxkX2NvdW50OwotCSAgICBmaWVsZHNbZmllbGRfY291bnRdID0gREVCVUdfRklFTERfTlVMTDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnbSc6Ci0JY2FzZSAndic6Ci0JICB7Ci0JICAgIGJmZF92bWEgZmxhZ3MsIHZvZmZzZXQsIGNvbnRyb2w7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUsICptYW5nbGVkOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbiwgbWFuZ2xlZGxlbjsKLQkgICAgc3RydWN0IGllZWVfdmFyICpwdiwgKnB2ZW5kOwotCSAgICBkZWJ1Z190eXBlIHR5cGU7Ci0JICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotCSAgICBib29sZWFuIGNvbnN0cCwgdm9sYXRpbGVwOwotCSAgICBjaGFyICptYW5nbGVkY29weTsKLQkgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgbXY7Ci0JICAgIHN0cnVjdCBpZWVlX21ldGhvZCAqbWV0aDsKLQkgICAgdW5zaWduZWQgaW50IGltOwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm1hbmdsZWQsICZtYW5nbGVkbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDM7Ci0JICAgIGlmIChpZCAhPSAndicpCi0JICAgICAgdm9mZnNldCA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdm9mZnNldCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQktLWNvdW50OwotCSAgICAgIH0KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZjb250cm9sKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIC0tY291bnQ7Ci0KLQkgICAgLyogV2UganVzdCBpZ25vcmUgdGhlIGNvbnRyb2wgaW5mb3JtYXRpb24uICAqLwotCi0JICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlcHJlc2VudCBmcmllbmQgaW5mb3JtYXRpb24sIHNvIHdlCi0gICAgICAgICAgICAgICBqdXN0IGlnbm9yZSBpdC4gICovCi0JICAgIGlmICgoZmxhZ3MgJiBDWFhGTEFHU19GUklFTkQpICE9IDApCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogV2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBzZWVuIGEgdHlwZSBmb3IgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgcHYgPSBpbmZvLT52YXJzLnZhcnM7Ci0JICAgIHB2ZW5kID0gcHYgKyBpbmZvLT52YXJzLmFsbG9jOwotCSAgICBmb3IgKDsgcHYgPCBwdmVuZDsgcHYrKykKLQkgICAgICBpZiAocHYtPm5hbWxlbiA9PSBtYW5nbGVkbGVuCi0JCSAgJiYgc3RybmNtcCAocHYtPm5hbWUsIG1hbmdsZWQsIG1hbmdsZWRsZW4pID09IDApCi0JCWJyZWFrOwotCi0JICAgIGlmIChwdiA+PSBwdmVuZCkKLQkgICAgICB7Ci0JCS8qIFdlIHdvbid0IGhhdmUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmdW5jdGlvbiBpZgotCQkgICBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBmaWxlLiAgV2UgZG9uJ3QgdHJ5IHRvCi0JCSAgIGhhbmRsZSB0aGlzIGNhc2UuICBGSVhNRS4gICovCi0JCXR5cGUgPSAoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCi0JCQkoZGhhbmRsZSwKLQkJCSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgc3RhcnQsCi0JCQkJCSAgICAodW5zaWduZWQgaW50KSBidWlsdGluX3ZvaWQpLAotCQkJIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkgZmFsc2UpKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0JCWNvbnN0IGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLQkJYm9vbGVhbiB2YXJhcmdzOwotCi0JCWlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBwdi0+dHlwZSkKLQkJICAgICE9IERFQlVHX0tJTkRfRlVOQ1RJT04pCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkJXygiYmFkIHR5cGUgZm9yIEMrKyBtZXRob2QgZnVuY3Rpb24iKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCXJldHVybl90eXBlID0gZGVidWdfZ2V0X3JldHVybl90eXBlIChkaGFuZGxlLCBwdi0+dHlwZSk7Ci0JCWFyZ190eXBlcyA9IGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMgKGRoYW5kbGUsIHB2LT50eXBlLAotCQkJCQkJICAgICAgICZ2YXJhcmdzKTsKLQkJaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCB8fCBhcmdfdHlwZXMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCQlfKCJubyB0eXBlIGluZm9ybWF0aW9uIGZvciBDKysgbWV0aG9kIGZ1bmN0aW9uIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQotCQl0eXBlID0gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsIGl0LT50eXBlLAotCQkJCQkgICAgICAgKGRlYnVnX3R5cGUgKikgYXJnX3R5cGVzLAotCQkJCQkgICAgICAgdmFyYXJncyk7Ci0JICAgICAgfQotCSAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIHN3aXRjaCAoZmxhZ3MgJiBDWFhGTEFHU19WSVNJQklMSVRZKQotCSAgICAgIHsKLQkgICAgICBkZWZhdWx0OgotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5rbm93biBDKysgdmlzaWJpbGl0eSIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQzoKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUklWQVRFOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGNvbnN0cCA9IChmbGFncyAmIENYWEZMQUdTX0NPTlNUKSAhPSAwID8gdHJ1ZSA6IGZhbHNlOwotCSAgICB2b2xhdGlsZXAgPSAoZmxhZ3MgJiBDWFhGTEFHU19WT0xBVElMRSkgIT0gMCA/IHRydWUgOiBmYWxzZTsKLQotCSAgICBtYW5nbGVkY29weSA9IHNhdmVzdHJpbmcgKG1hbmdsZWQsIG1hbmdsZWRsZW4pOwotCi0JICAgIGlmICgoZmxhZ3MgJiBDWFhGTEFHU19TVEFUSUMpICE9IDApCi0JICAgICAgewotCQlpZiAoaWQgPT0gJ3YnKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgc3RhdGljIHZpcnR1YWwgbWV0aG9kIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJbXYgPSBkZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCAoZGhhbmRsZSwgbWFuZ2xlZGNvcHksCi0JCQkJCQkgICAgICAgdHlwZSwgdmlzaWJpbGl0eSwKLQkJCQkJCSAgICAgICBjb25zdHAsIHZvbGF0aWxlcCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlkZWJ1Z190eXBlIHZjb250ZXh0OwotCi0JCWlmIChpZCAhPSAndicpCi0JCSAgdmNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAvKiBGSVhNRTogSG93IGNhbiB3ZSBjYWxjdWxhdGUgdGhpcyBjb3JyZWN0bHk/ICAqLwotCQkgICAgdmNvbnRleHQgPSBpdC0+dHlwZTsKLQkJICB9Ci0JCW12ID0gZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCAoZGhhbmRsZSwgbWFuZ2xlZGNvcHksIHR5cGUsCi0JCQkJCQl2aXNpYmlsaXR5LCBjb25zdHAsCi0JCQkJCQl2b2xhdGlsZXAsIHZvZmZzZXQsCi0JCQkJCQl2Y29udGV4dCk7Ci0JICAgICAgfQotCSAgICBpZiAobXYgPT0gREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgZm9yIChtZXRoID0gbWV0aG9kcywgaW0gPSAwOyBpbSA8IG1ldGhvZHNfY291bnQ7IG1ldGgrKywgaW0rKykKLQkgICAgICBpZiAobWV0aC0+bmFtbGVuID09IG5hbWxlbgotCQkgICYmIHN0cm5jbXAgKG1ldGgtPm5hbWUsIG5hbWUsIG5hbWxlbikgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIGlmIChpbSA+PSBtZXRob2RzX2NvdW50KQotCSAgICAgIHsKLQkJaWYgKG1ldGhvZHNfY291bnQgPj0gbWV0aG9kc19hbGxvYykKLQkJICB7Ci0JCSAgICBtZXRob2RzX2FsbG9jICs9IDEwOwotCQkgICAgbWV0aG9kcyA9ICgoc3RydWN0IGllZWVfbWV0aG9kICopCi0JCQkgICAgICAgeHJlYWxsb2MgKG1ldGhvZHMsCi0JCQkJCSBtZXRob2RzX2FsbG9jICogc2l6ZW9mICptZXRob2RzKSk7Ci0JCSAgfQotCQltZXRob2RzW21ldGhvZHNfY291bnRdLm5hbWUgPSBuYW1lOwotCQltZXRob2RzW21ldGhvZHNfY291bnRdLm5hbWxlbiA9IG5hbWxlbjsKLQkJbWV0aG9kc1ttZXRob2RzX2NvdW50XS52YXJpYW50cyA9IE5VTEw7Ci0JCW1ldGhvZHNbbWV0aG9kc19jb3VudF0uY291bnQgPSAwOwotCQltZXRob2RzW21ldGhvZHNfY291bnRdLmFsbG9jID0gMDsKLQkJbWV0aCA9IG1ldGhvZHMgKyBtZXRob2RzX2NvdW50OwotCQkrK21ldGhvZHNfY291bnQ7Ci0JICAgICAgfQotCi0JICAgIGlmIChtZXRoLT5jb3VudCArIDEgPj0gbWV0aC0+YWxsb2MpCi0JICAgICAgewotCQltZXRoLT5hbGxvYyArPSAxMDsKLQkJbWV0aC0+dmFyaWFudHMgPSAoKGRlYnVnX21ldGhvZF92YXJpYW50ICopCi0JCQkJICB4cmVhbGxvYyAobWV0aC0+dmFyaWFudHMsCi0JCQkJCSAgICAobWV0aC0+YWxsb2MKLQkJCQkJICAgICAqIHNpemVvZiAqbWV0aC0+dmFyaWFudHMpKSk7Ci0JICAgICAgfQotCi0JICAgIG1ldGgtPnZhcmlhbnRzW21ldGgtPmNvdW50XSA9IG12OwotCSAgICArK21ldGgtPmNvdW50OwotCSAgICBtZXRoLT52YXJpYW50c1ttZXRoLT5jb3VudF0gPSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdvJzoKLQkgIHsKLQkgICAgYmZkX3ZtYSBzcGVjOwotCi0JICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24sIHNvIHdlIGp1c3QKLQkgICAgICAgaWdub3JlIGl0LiAgKi8KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZzcGVjKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIC0tY291bnQ7Ci0JICAgIGlmICgoc3BlYyAmIDQpICE9IDApCi0JICAgICAgewotCQljb25zdCBjaGFyICpmaWxlbmFtZTsKLQkJdW5zaWduZWQgbG9uZyBmaWxlbmFtbGVuOwotCQliZmRfdm1hIGxpbmVubzsKLQotCQlpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmZmlsZW5hbWUsICZmaWxlbmFtbGVuKQotCQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmxpbmVubykpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQljb3VudCAtPSAyOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKHNwZWMgJiA4KSAhPSAwKQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbWFuZ2xlZDsKLQkJdW5zaWduZWQgbG9uZyBtYW5nbGVkbGVuOwotCi0JCWlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZtYW5nbGVkLCAmbWFuZ2xlZGxlbikpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQktLWNvdW50OwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkgICAgXygidW5yZWNvZ25pemVkIEMrKyBvYmplY3Qgb3ZlcmhlYWQgc3BlYyIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAneic6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnZuYW1lLCAqYmFzZW5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdm5hbWVsZW4sIGJhc2VsZW47Ci0JICAgIGJmZF92bWEgdnNpemUsIGNvbnRyb2w7Ci0KLQkgICAgLyogQSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIuICAqLwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZ2bmFtZSwgJnZuYW1lbGVuKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdnNpemUpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmJhc2VuYW1lLCAmYmFzZWxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNvbnRyb2wpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgY291bnQgLT0gNDsKLQotCSAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgY29udHJvbCBudW1iZXIuICBXZSBkb24ndCBjYXJlIHdoYXQKLQkgICAgICAgdGhlIHZpcnR1YWwgdGFibGUgbmFtZSBpcy4gIFdlIGhhdmUgbm8gd2F5IHRvIHN0b3JlIHRoZQotCSAgICAgICB2aXJ0dWFsIHRhYmxlIHNpemUsIGFuZCBJIGRvbid0IHRoaW5rIHdlIGNhcmUgYW55aG93LiAgKi8KLQotCSAgICAvKiBGSVhNRTogV2UgY2FuJ3QgaGFuZGxlIG11bHRpcGxlIHZpcnR1YWwgdGFibGUgcG9pbnRlcnMuICAqLwotCi0JICAgIGlmIChiYXNlbGVuID09IDApCi0JICAgICAgb3dudnB0ciA9IHRydWU7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNoYXIgKmJhc2Vjb3B5OwotCi0JCWJhc2Vjb3B5ID0gc2F2ZXN0cmluZyAoYmFzZW5hbWUsIGJhc2VsZW4pOwotCQl2cHRyYmFzZSA9IGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIGJhc2Vjb3B5LAotCQkJCQkJICAgREVCVUdfS0lORF9JTExFR0FMKTsKLQkJZnJlZSAoYmFzZWNvcHkpOwotCQlpZiAodnB0cmJhc2UgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmRlZmluZWQgQysrIHZ0YWJsZSIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBtZXRob2QgdmFyaWFudHMsIHdlIGNhbiBjYWxsCi0gICAgIGRlYnVnX21ha2VfbWV0aG9kIGZvciBlYWNoIG9uZS4gICovCi0KLSAgaWYgKG1ldGhvZHNfY291bnQgPT0gMCkKLSAgICBkbWV0aG9kcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZG1ldGhvZHMgPSAoKGRlYnVnX21ldGhvZCAqKQotCQkgIHhtYWxsb2MgKChtZXRob2RzX2NvdW50ICsgMSkgKiBzaXplb2YgKmRtZXRob2RzKSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbWV0aG9kc19jb3VudDsgaSsrKQotCXsKLQkgIGNoYXIgKm5hbWNvcHk7Ci0KLQkgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChtZXRob2RzW2ldLm5hbWUsIG1ldGhvZHNbaV0ubmFtbGVuKTsKLQkgIGRtZXRob2RzW2ldID0gZGVidWdfbWFrZV9tZXRob2QgKGRoYW5kbGUsIG5hbWNvcHksCi0JCQkJCSAgIG1ldGhvZHNbaV0udmFyaWFudHMpOwotCSAgaWYgKGRtZXRob2RzW2ldID09IERFQlVHX01FVEhPRF9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZG1ldGhvZHNbaV0gPSBERUJVR19NRVRIT0RfTlVMTDsKLSAgICAgIGZyZWUgKG1ldGhvZHMpOwotICAgIH0KLQotICAvKiBUaGUgc3RydWN0IHR5cGUgd2FzIGNyZWF0ZWQgYXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZyBhdAotICAgICBpdC0+c2xvdC4gIFdlIHVwZGF0ZSBpdC0+c2xvdCB0byBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBhbGwKLSAgICAgcmVmZXJlbmNlcyB0byB0aGlzIHN0cnVjdC4gICovCi0gIGl0LT5zbG90ID0gZGVidWdfbWFrZV9vYmplY3RfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgIGNsYXNzICE9ICd1JywKLQkJCQkgICAgIGRlYnVnX2dldF90eXBlX3NpemUgKGRoYW5kbGUsCi0JCQkJCQkJICBpdC0+c2xvdCksCi0JCQkJICAgICBmaWVsZHMsIGJhc2VjbGFzc2VzLCBkbWV0aG9kcywKLQkJCQkgICAgIHZwdHJiYXNlLCBvd252cHRyKTsKLSAgaWYgKGl0LT5zbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgQysrIGRlZmF1bHQgYXJndW1lbnQgdmFsdWUgYW5kIHJlZmVyZW5jZSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9jeHhfZGVmYXVsdHMgKGluZm8sIHBwLCBjb3VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBjb25zdCBjaGFyICpmbm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgZm5sZW47Ci0gIGJmZF92bWEgZGVmY291bnQ7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgLyogR2l2aW5nIHRoZSBmdW5jdGlvbiBuYW1lIGJlZm9yZSB0aGUgYXJndW1lbnQgY291bnQgaXMgYW4gYWRkZW5kdW0KLSAgICAgdG8gdGhlIHNwZWMuICBUaGUgZnVuY3Rpb24gbmFtZSBpcyBkZW1hbmdsZWQsIHRob3VnaCwgc28gdGhpcwotICAgICByZWNvcmQgbXVzdCBhbHdheXMgcmVmZXIgdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCi0gIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA8PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrCi0gICAgICB8fCBpbmZvLT5ibG9ja3N0YWNrLmJzcFstMV0uZm5pbmR4ID09ICh1bnNpZ25lZCBpbnQpIC0xKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgZGVmYXVsdCB2YWx1ZXMgbm90IGluIGEgZnVuY3Rpb24iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZmbm5hbWUsICZmbmxlbikKLSAgICAgIHx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZkZWZjb3VudCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb3VudCAtPSAyOwotCi0gIHdoaWxlIChkZWZjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHR5cGUsIHZhbDsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cnZhbDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RydmFsbGVuOwotCi0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC0tY291bnQ7Ci0KLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSAwOgotCWNhc2UgNDoKLQkgIGJyZWFrOwotCi0JY2FzZSAxOgotCWNhc2UgMjoKLQkgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdmFsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLS1jb3VudDsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOgotCWNhc2UgNzoKLQkgIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZzdHJ2YWwsICZzdHJ2YWxsZW4pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAtLWNvdW50OwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVucmVjb2duaXplZCBDKysgZGVmYXVsdCB0eXBlIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcywgc28gd2UKLSAgICAgICAgIGp1c3QgaWdub3JlIHRoZW0uICBGSVhNRS4gICovCi0gICAgfQotCi0gIC8qIEFueSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBpbmRpY2VzIG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgcmVhbGx5Ci0gICAgIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBQVFIgZGhhbmRsZTsKLSAgICAgIGRlYnVnX3R5cGUgKmFyZ19zbG90czsKLQotICAgICAgZGhhbmRsZSA9IGluZm8tPmRoYW5kbGU7Ci0gICAgICBhcmdfc2xvdHMgPSBpbmZvLT50eXBlcy50eXBlc1tpbmZvLT5ibG9ja3N0YWNrLmJzcFstMV0uZm5pbmR4XS5hcmdfc2xvdHM7Ci0gICAgICB3aGlsZSAoY291bnQtLSA+IDApCi0JewotCSAgYmZkX3ZtYSBpbmR4OwotCSAgZGVidWdfdHlwZSB0YXJnZXQ7Ci0KLQkgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFRoZSBpbmRleCBpcyAxIGJhc2VkLiAgKi8KLQkgIC0taW5keDsKLQkgIGlmIChhcmdfc2xvdHMgPT0gTlVMTAotCSAgICAgIHx8IGFyZ19zbG90c1tpbmR4XSA9PSBERUJVR19UWVBFX05VTEwKLQkgICAgICB8fCAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgYXJnX3Nsb3RzW2luZHhdKQotCQkgICE9IERFQlVHX0tJTkRfUE9JTlRFUikpCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygicmVmZXJlbmNlIHBhcmFtZXRlciBpcyBub3QgYSBwb2ludGVyIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICB0YXJnZXQgPSBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGRoYW5kbGUsIGFyZ19zbG90c1tpbmR4XSk7Ci0JICBhcmdfc2xvdHNbaW5keF0gPSBkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChkaGFuZGxlLCB0YXJnZXQpOwotCSAgaWYgKGFyZ19zbG90c1tpbmR4XSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgQysrIHJlZmVyZW5jZSBkZWZpbml0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9yZWZlcmVuY2UgKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gIGJmZF92bWEgZmxhZ3M7Ci0gIGNvbnN0IGNoYXIgKmNsYXNzLCAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBjbGFzc2xlbiwgbmFtbGVuOwotICBkZWJ1Z190eXBlICpwc2xvdDsKLSAgZGVidWdfdHlwZSB0YXJnZXQ7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdpdmluZyB0aGUgY2xhc3MgbmFtZSBiZWZvcmUgdGhlIG1lbWJlciBuYW1lIGlzIGluIGFuIGFkZGVuZHVtIHRvCi0gICAgIHRoZSBzcGVjLiAgKi8KLSAgaWYgKGZsYWdzID09IDMpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmNsYXNzLCAmY2xhc3NsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwc2xvdCA9IE5VTEw7Ci0gIGlmIChmbGFncyAhPSAzKQotICAgIHsKLSAgICAgIGludCBwYXNzOwotCi0gICAgICAvKiBXZSBzZWFyY2ggZnJvbSB0aGUgbGFzdCB2YXJpYWJsZSBpbmRpY2VzIHRvIHRoZSBmaXJzdCBpbgotCSBob3BlcyBvZiBmaW5kaW5nIGxvY2FsIHZhcmlhYmxlcyBjb3JyZWN0bHkuICBXZSBzZWFyY2ggdGhlCi0JIGxvY2FsIHZhcmlhYmxlcyBvbiB0aGUgZmlyc3QgcGFzcywgYW5kIHRoZSBnbG9iYWwgdmFyaWFibGVzCi0JIG9uIHRoZSBzZWNvbmQuICBGSVhNRTogVGhpcyBwcm9iYWJseSB3b24ndCB3b3JrIGluIGFsbCBjYXNlcy4KLQkgT24gdGhlIG90aGVyIGhhbmQsIEkgZG9uJ3Qga25vdyB3aGF0IHdpbGwuICAqLwotICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykKLQl7Ci0JICBzdHJ1Y3QgaWVlZV92YXJzICp2YXJzOwotCSAgaW50IGk7Ci0JICBzdHJ1Y3QgaWVlZV92YXIgKnB2ID0gTlVMTDsKLQotCSAgaWYgKHBhc3MgPT0gMCkKLQkgICAgdmFycyA9ICZpbmZvLT52YXJzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFycyA9IGluZm8tPmdsb2JhbF92YXJzOwotCSAgICAgIGlmICh2YXJzID09IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IChpbnQpIHZhcnMtPmFsbG9jIC0gMTsgaSA+PSAwOyBpLS0pCi0JICAgIHsKLQkgICAgICBib29sZWFuIGZvdW5kOwotCi0JICAgICAgcHYgPSB2YXJzLT52YXJzICsgaTsKLQotCSAgICAgIGlmIChwdi0+cHNsb3QgPT0gTlVMTAotCQkgIHx8IHB2LT5uYW1sZW4gIT0gbmFtbGVuCi0JCSAgfHwgc3RybmNtcCAocHYtPm5hbWUsIG5hbWUsIG5hbWxlbikgIT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBmb3VuZCA9IGZhbHNlOwotCSAgICAgIHN3aXRjaCAoZmxhZ3MpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCSAgICAgIF8oInVucmVjb2duaXplZCBDKysgcmVmZXJlbmNlIHR5cGUiKSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCi0JCWNhc2UgMDoKLQkJICAvKiBHbG9iYWwgdmFyaWFibGUgb3IgZnVuY3Rpb24uICAqLwotCQkgIGlmIChwdi0+a2luZCA9PSBJRUVFX0dMT0JBTAotCQkgICAgICB8fCBwdi0+a2luZCA9PSBJRUVFX0VYVEVSTkFMCi0JCSAgICAgIHx8IHB2LT5raW5kID09IElFRUVfRlVOQ1RJT04pCi0JCSAgICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAxOgotCQkgIC8qIEdsb2JhbCBzdGF0aWMgdmFyaWFibGUgb3IgZnVuY3Rpb24uICAqLwotCQkgIGlmIChwdi0+a2luZCA9PSBJRUVFX1NUQVRJQwotCQkgICAgICB8fCBwdi0+a2luZCA9PSBJRUVFX0ZVTkNUSU9OKQotCQkgICAgZm91bmQgPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgMjoKLQkJICAvKiBMb2NhbCB2YXJpYWJsZS4gICovCi0JCSAgaWYgKHB2LT5raW5kID09IElFRUVfTE9DQUwpCi0JCSAgICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChmb3VuZCkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGkgPj0gMCkKLQkgICAgewotCSAgICAgIHBzbG90ID0gcHYtPnBzbG90OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBpZWVlX3RhZyAqaXQ7Ci0KLSAgICAgIGZvciAoaXQgPSBpbmZvLT50YWdzOyBpdCAhPSBOVUxMOyBpdCA9IGl0LT5uZXh0KQotCXsKLQkgIGlmIChpdC0+bmFtZVswXSA9PSBjbGFzc1swXQotCSAgICAgICYmIHN0cm5jbXAgKGl0LT5uYW1lLCBjbGFzcywgY2xhc3NsZW4pID09IDAKLQkgICAgICAmJiBzdHJsZW4gKGl0LT5uYW1lKSA9PSBjbGFzc2xlbikKLQkgICAgewotCSAgICAgIGlmIChpdC0+ZnNsb3RzICE9IE5VTEwpCi0JCXsKLQkJICBjb25zdCBkZWJ1Z19maWVsZCAqcGY7Ci0JCSAgdW5zaWduZWQgaW50IGZpbmR4OwotCi0JCSAgcGYgPSBkZWJ1Z19nZXRfZmllbGRzIChpbmZvLT5kaGFuZGxlLCBpdC0+dHlwZSk7Ci0JCSAgaWYgKHBmID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJCSAgIkMrKyByZWZlcmVuY2UgaW4gY2xhc3Mgd2l0aCBubyBmaWVsZHMiKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgZm9yIChmaW5keCA9IDA7ICpwZiAhPSBERUJVR19GSUVMRF9OVUxMOyBwZisrLCBmaW5keCsrKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpmbmFtZTsKLQotCQkgICAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChpbmZvLT5kaGFuZGxlLCAqcGYpOwotCQkgICAgICBpZiAoZm5hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKHN0cm5jbXAgKGZuYW1lLCBuYW1lLCBuYW1sZW4pID09IDAKLQkJCSAgJiYgc3RybGVuIChmbmFtZSkgPT0gbmFtbGVuKQotCQkJewotCQkJICBwc2xvdCA9IGl0LT5mc2xvdHMgKyBmaW5keDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocHNsb3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIHJlZmVyZW5jZSBub3QgZm91bmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIGFsbG9jYXRlZCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcKLSAgICAgdG8gKnBzbG90LCB3aGljaCB3ZSBjYW4gbm93IHVwZGF0ZSB0byBiZSBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsICpwc2xvdCkgIT0gREVCVUdfS0lORF9QT0lOVEVSKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgcmVmZXJlbmNlIGlzIG5vdCBwb2ludGVyIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB0YXJnZXQgPSBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGluZm8tPmRoYW5kbGUsICpwc2xvdCk7Ci0gICpwc2xvdCA9IGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKGluZm8tPmRoYW5kbGUsIHRhcmdldCk7Ci0gIGlmICgqcHNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVxdWlyZSBhbiBBU04gcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCBwdikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0gIGJmZF92bWEgdmFyaW5keDsKLQotICBzdGFydCA9ICpwcDsKLQotICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcDsKLSAgaWYgKGMgIT0gaWVlZV9lMl9maXJzdF9ieXRlX2VudW0pCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIm1pc3NpbmcgcmVxdWlyZWQgQVNOIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICgoKHVuc2lnbmVkIGludCkgYyA8PCA4KSB8ICoqcHApOwotICBpZiAoYyAhPSBpZWVlX2Fzbl9yZWNvcmRfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBU04iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICAvKiBKdXN0IGlnbm9yZSB0aGUgdmFyaWFibGUgaW5kZXguICAqLwotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhcmluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCBwdik7Ci19Ci0KLS8qIFJlcXVpcmUgYW4gQVRONjUgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBjb25zdCBjaGFyICoqcG5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0gIGJmZF92bWEgbmFtZV9pbmR4LCB0eXBlX2luZHgsIGF0bl9jb2RlOwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOwotICBpZiAoYyAhPSBpZWVlX2F0X3JlY29yZF9lbnVtKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJtaXNzaW5nIHJlcXVpcmVkIEFUTjY1IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICgoKHVuc2lnbmVkIGludCkgYyA8PCA4KSB8ICoqcHApOwotICBpZiAoYyAhPSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBVE42NSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbmFtZV9pbmR4KQotICAgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGVfaW5keCkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdG5fY29kZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEp1c3QgaWdub3JlIG5hbWVfaW5keC4gICovCi0KLSAgaWYgKHR5cGVfaW5keCAhPSAwIHx8IGF0bl9jb2RlICE9IDY1KQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJiYWQgQVRONjUgcmVjb3JkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4pOwotfQotDAotLyogQ29udmVydCBhIHJlZ2lzdGVyIG51bWJlciBpbiBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEKLSAgIGdlbmVyaWMgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLQotc3RhdGljIGludAotaWVlZV9yZWdub190b19nZW5yZWcgKGFiZmQsIHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHI7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgLyogRm9yIHNvbWUgcmVhc29ucyBzdGFicyBhZGRzIDIgdG8gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAgICAgICBudW1iZXJzLiAgKi8KLSAgICAgIGlmIChyID49IDE2KQotCXIgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgLyogU3RhYnMgdXNlcyAwIHRvIDE1IGZvciByMCB0byByMTUsIDE2IHRvIDMxIGZvciBnMCB0byBnMTUsIGFuZAotICAgICAgICAgMzIgdG8gMzUgZm9yIGZwMCB0byBmcDMuICAqLwotICAgICAgLS1yOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgZ2VuZXJpYyByZWdpc3RlciBudW1iZXIgdG8gYW4gSUVFRSBzcGVjaWZpYyBvbmUuICAqLwotCi1zdGF0aWMgaW50Ci1pZWVlX2dlbnJlZ190b19yZWdubyAoYWJmZCwgcikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcjsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gc3RhYnMgYWRkIDIgdG8gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAgICAgICBudW1iZXJzLiAgKi8KLSAgICAgIGlmIChyID49IDE4KQotCXIgLT0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgLyogU3RhYnMgdXNlcyAwIHRvIDE1IGZvciByMCB0byByMTUsIDE2IHRvIDMxIGZvciBnMCB0byBnMTUsIGFuZAotICAgICAgICAgMzIgdG8gMzUgZm9yIGZwMCB0byBmcDMuICAqLwotICAgICAgKytyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotDAotLyogVGhlc2Ugcm91dGluZXMgYnVpbGQgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIHRoZSBnZW5lcmljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi0vKiBXZSBidWlsZCB0aGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnl0ZSBieSBieXRlLiAgUmF0aGVyIHRoYW4KLSAgIHdhc3RlIHRpbWUgY29weWluZyBkYXRhIGFyb3VuZCwgd2UgdXNlIGEgbGlua2VkIGxpc3Qgb2YgYnVmZmVycyB0bwotICAgaG9sZCB0aGUgZGF0YS4gICovCi0KLSNkZWZpbmUgSUVFRV9CVUZTSVpFICg0OTApCi0KLXN0cnVjdCBpZWVlX2J1ZgotewotICAvKiBOZXh0IGJ1ZmZlci4gICovCi0gIHN0cnVjdCBpZWVlX2J1ZiAqbmV4dDsKLSAgLyogTnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhpcyBidWZmZXIuICAqLwotICB1bnNpZ25lZCBpbnQgYzsKLSAgLyogQnl0ZXMuICAqLwotICBiZmRfYnl0ZSBidWZbSUVFRV9CVUZTSVpFXTsKLX07Ci0KLS8qIEEgbGlzdCBvZiBidWZmZXJzLiAgKi8KLQotc3RydWN0IGllZWVfYnVmbGlzdAotewotICAvKiBIZWFkIG9mIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKmhlYWQ7Ci0gIC8qIFRhaWwtLWxhc3QgYnVmZmVyIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKnRhaWw7Ci19OwotCi0vKiBJbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgQkIxMSBibG9ja3MgcmVxdWlyZWQgYnkgdGhlIEhQIGVtdWxhdG9yLAotICAgd2Uga2VlcCB0cmFjayBvZiByYW5nZXMgb2YgYWRkcmVzc2VzIHdoaWNoIGNvcnJlc3BvbmQgdG8gYSBnaXZlbgotICAgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0cnVjdCBpZWVlX3JhbmdlCi17Ci0gIC8qIE5leHQgcmFuZ2UuICAqLwotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqbmV4dDsKLSAgLyogTG93IGFkZHJlc3MuICAqLwotICBiZmRfdm1hIGxvdzsKLSAgLyogSGlnaCBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBoaWdoOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgY2xhc3Mgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdHJ1Y3QgaWVlZV90eXBlX2NsYXNzCi17Ci0gIC8qIFRoZSBuYW1lIGluZGV4IGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgLyogVGhlIHBtaXNjIHJlY29yZHMgZm9yIHRoZSBjbGFzcy4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgcG1pc2NidWY7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcG1pc2MgcmVjb3Jkcy4gICovCi0gIHVuc2lnbmVkIGludCBwbWlzY2NvdW50OwotICAvKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgaG9sZGluZyB0aGUgdmlydHVhbCB0YWJsZSwgaWYgbm90IHRoaXMKLSAgICAgY2xhc3MuICAqLwotICBjb25zdCBjaGFyICp2Y2xhc3M7Ci0gIC8qIFdoZXRoZXIgdGhpcyBjbGFzcyBob2xkcyBpdHMgb3duIHZpcnR1YWwgdGFibGUuICAqLwotICBib29sZWFuIG93bnZwdHI7Ci0gIC8qIFRoZSBsYXJnZXN0IHZpcnR1YWwgdGFibGUgb2Zmc2V0IHNlZW4gc28gZmFyLiAgKi8KLSAgYmZkX3ZtYSB2b2Zmc2V0OwotICAvKiBUaGUgY3VycmVudCBtZXRob2QuICAqLwotICBjb25zdCBjaGFyICptZXRob2Q7Ci0gIC8qIEFkZGl0aW9uYWwgcG1pc2MgcmVjb3JkcyB1c2VkIHRvIHJlY29yZCBmaWVsZHMgb2YgcmVmZXJlbmNlIHR5cGUuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHJlZnM7Ci19OwotCi0vKiBUaGlzIGlzIGhvdyB3ZSBzdG9yZSB0eXBlcyBmb3IgdGhlIHdyaXRpbmcgcm91dGluZXMuICBNb3N0IHR5cGVzCi0gICBhcmUgc2ltcGx5IHJlcHJlc2VudGVkIGJ5IGEgdHlwZSBpbmRleC4gICovCi0KLXN0cnVjdCBpZWVlX3dyaXRlX3R5cGUKLXsKLSAgLyogVHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBpbmR4OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdHlwZSwgaWYga25vd24uICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIHR5cGUsIGlmIGFueS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZSwgd2UgYnVpbGQgdGhlIHR5cGUgaGVyZSwgYW5kCi0gICAgIG9ubHkgYWRkIGl0IHRvIHRoZSBvdXRwdXQgYnVmZmVycyBpZiB3ZSBuZWVkIGl0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmRlZjsKLSAgLyogSWYgdGhpcyBpcyBhIHN0cnVjdCwgdGhpcyBpcyB3aGVyZSB0aGUgc3RydWN0IGRlZmluaXRpb24gaXMKLSAgICAgYnVpbHQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHN0cmRlZjsKLSAgLyogSWYgdGhpcyBpcyBhIGNsYXNzLCB0aGlzIGlzIHdoZXJlIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiBpcyBidWlsdC4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MgKmNsYXNzZGVmOwotICAvKiBXaGV0aGVyIHRoZSB0eXBlIGlzIHVuc2lnbmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHVuc2lnbmVkcCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBpcyBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHJlZmVyZW5jZXAgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgaXMgaW4gdGhlIGxvY2FsIHR5cGUgYmxvY2suICAqLwotICB1bnNpZ25lZCBpbnQgbG9jYWxwIDogMTsKLSAgLyogV2hldGhlciB0aGlzIGlzIGEgZHVwbGljYXRlIHN0cnVjdCBkZWZpbml0aW9uIHdoaWNoIHdlIGFyZQotICAgICBpZ25vcmluZy4gICovCi0gIHVuc2lnbmVkIGludCBpZ25vcmVwIDogMTsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIHR5cGUgc3RhY2sgdXNlZCBieSB0aGUgZGVidWcgd3JpdGluZyByb3V0aW5lcy4gIEZJWE1FOgotICAgV2UgY291bGQgZ2VuZXJhdGUgbW9yZSBlZmZpY2llbnQgb3V0cHV0IGlmIHdlIHJlbWVtYmVyZWQgd2hlbiB3ZQotICAgaGF2ZSBvdXRwdXQgYSBwYXJ0aWN1bGFyIHR5cGUgYmVmb3JlLiAgKi8KLQotc3RydWN0IGllZWVfdHlwZV9zdGFjawotewotICAvKiBOZXh0IGVudHJ5IG9uIHN0YWNrLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqbmV4dDsKLSAgLyogVHlwZSBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUgdHlwZTsKLX07Ci0KLS8qIFRoaXMgaXMgYSBsaXN0IG9mIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGEgbmFtZSBhbmQgc29tZSB0eXBlcy4KLSAgIFRoZXNlIGFyZSB1c2VkIGZvciB0eXBlZGVmcyBhbmQgdGFncy4gICovCi0KLXN0cnVjdCBpZWVlX25hbWVfdHlwZQotewotICAvKiBOZXh0IHR5cGUgZm9yIHRoaXMgbmFtZS4gICovCi0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbmV4dDsKLSAgLyogSUQgbnVtYmVyLiAgRm9yIGEgdHlwZWRlZiwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIHR5cGUgdG8gd2hpY2gKLSAgICAgdGhpcyBuYW1lIGlzIHR5cGVkZWZlZC4gICovCi0gIHVuc2lnbmVkIGludCBpZDsKLSAgLyogVHlwZS4gICovCi0gIHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUgdHlwZTsKLSAgLyogSWYgdGhpcyBpcyBhIHRhZyB3aGljaCBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQsIHRoaXMgaXMgdGhlCi0gICAgIGtpbmQuICBJZiB0aGUgdGFnIGhhcyBiZWVuIGRlZmluZWQsIHRoaXMgaXMgREVCVUdfS0lORF9JTExFR0FMLiAgKi8KLSAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLX07Ci0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gYXNzb2NpYXRlIG5hbWVzIGFuZCB0eXBlcy4gICovCi0KLXN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEluZm9ybWF0aW9uIGZvciB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKnR5cGVzOwotfTsKLQotLyogVGhpcyBpcyBhIGxpc3Qgb2YgZW51bXMuICAqLwotCi1zdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0KLXsKLSAgLyogTmV4dCBlbnVtLiAgKi8KLSAgc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICpuZXh0OwotICAvKiBUeXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIFdoZXRoZXIgdGhpcyBlbnVtIGhhcyBiZWVuIGRlZmluZWQuICAqLwotICBib29sZWFuIGRlZmluZWQ7Ci0gIC8qIFRhZy4gICovCi0gIGNvbnN0IGNoYXIgKnRhZzsKLSAgLyogTmFtZXMuICAqLwotICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gIC8qIFZhbHVlcy4gICovCi0gIGJmZF9zaWduZWRfdm1hICp2YWxzOwotfTsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdHlwZXMsIHNvIHRoYXQgd2UgZG9uJ3QKLSAgIG91dHB1dCB0aGVtIG1vcmUgdGhhbiBvbmNlLiAgKi8KLQotc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZQotewotICAvKiBQb2ludGVyIHRvIHRoaXMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBwb2ludGVyOwotICAvKiBGdW5jdGlvbiB3aXRoIHVua25vd24gYXJndW1lbnRzIHJldHVybmluZyB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgZnVuY3Rpb247Ci0gIC8qIENvbnN0IHZlcnNpb24gb2YgdGhpcyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbnN0X3F1YWxpZmllZDsKLSAgLyogVm9sYXRpbGUgdmVyc2lvbiBvZiB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdm9sYXRpbGVfcXVhbGlmaWVkOwotICAvKiBMaXN0IG9mIGFycmF5cyBvZiB0aGlzIHR5cGUgb2YgdmFyaW91cyBib3VuZHMuICAqLwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICphcnJheXM7Ci19OwotCi0vKiBBIGxpc3Qgb2YgYXJyYXlzIGJvdW5kcy4gICovCi0KLXN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUKLXsKLSAgLyogTmV4dCBhcnJheSBib3VuZHMuICAqLwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICpuZXh0OwotICAvKiBUeXBlIGluZGV4IHdpdGggdGhlc2UgYm91bmRzLiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIExvdyBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGxvdzsKLSAgLyogSGlnaCBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci19OwotCi0vKiBUaGlzIGlzIGEgbGlzdCBvZiBwZW5kaW5nIGZ1bmN0aW9uIHBhcmFtZXRlciBpbmZvcm1hdGlvbi4gIFdlIGRvbid0Ci0gICBvdXRwdXQgdGhlbSB1bnRpbCB3ZSBzZWUgdGhlIGZpcnN0IGJsb2NrLiAgKi8KLQotc3RydWN0IGllZWVfcGVuZGluZ19wYXJtCi17Ci0gIC8qIE5leHQgcGVuZGluZyBwYXJhbWV0ZXIuICAqLwotICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm5leHQ7Ci0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIC8qIFdoZXRoZXIgdGhlIHR5cGUgaXMgYSByZWZlcmVuY2UuICAqLwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIC8qIEtpbmQuICAqLwotICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAvKiBWYWx1ZS4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogVGhpcyBpcyB0aGUgaGFuZGxlIHBhc3NlZCBkb3duIGJ5IGRlYnVnX3dyaXRlLiAgKi8KLQotc3RydWN0IGllZWVfaGFuZGxlCi17Ci0gIC8qIEJGRCB3ZSBhcmUgd3JpdGluZyB0by4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogV2hldGhlciB3ZSBnb3QgYW4gZXJyb3IgaW4gYSBzdWJyb3V0aW5lIGNhbGxlZCB2aWEgdHJhdmVyc2Ugb3IKLSAgICAgbWFwX292ZXJfc2VjdGlvbnMuICAqLwotICBib29sZWFuIGVycm9yOwotICAvKiBDdXJyZW50IGRhdGEgYnVmZmVyIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpjdXJyZW50OwotICAvKiBDdXJyZW50IGRhdGEgYnVmZmVyLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmICpjdXJidWY7Ci0gIC8qIEZpbGVuYW1lIG9mIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBNb2R1bGUgbmFtZSBvZiBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBjb25zdCBjaGFyICptb2RuYW1lOwotICAvKiBMaXN0IG9mIGJ1ZmZlciBmb3IgZ2xvYmFsIHR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBnbG9iYWxfdHlwZXM7Ci0gIC8qIExpc3Qgb2YgZmluaXNoZWQgZGF0YSBidWZmZXJzLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBkYXRhOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHR5cGVkZWZzIGluIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHR5cGVzOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBjdXJyZW50Ci0gICAgIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHZhcnM7Ci0gIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgQysrIGNsYXNzIGRlZmluaXRpb25zIGluIHRoZSBjdXJyZW50Ci0gICAgIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGN4eDsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciBsaW5lIG51bWJlcnMgaW4gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgbGluZW5vczsKLSAgLyogUmFuZ2VzIGZvciB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKnJhbmdlczsKLSAgLyogUmFuZ2VzIGZvciBhbGwgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKmdsb2JhbF9yYW5nZXM7Ci0gIC8qIE5lc3RlZCBwZW5kaW5nIHJhbmdlcy4gICovCi0gIHN0cnVjdCBpZWVlX3JhbmdlICpwZW5kaW5nX3JhbmdlczsKLSAgLyogVHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVfc3RhY2sgKnR5cGVfc3RhY2s7Ci0gIC8qIE5leHQgdW5hbGxvY2F0ZWQgdHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlX2luZHg7Ci0gIC8qIE5leHQgdW5hbGxvY2F0ZWQgbmFtZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIC8qIFR5cGVkZWZzLiAgKi8KLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfdGFibGUgdHlwZWRlZnM7Ci0gIC8qIFRhZ3MuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF90YWJsZSB0YWdzOwotICAvKiBFbnVtcy4gICovCi0gIHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqZW51bXM7Ci0gIC8qIE1vZGlmaWVkIHZlcnNpb25zIG9mIHR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbW9kaWZpZWQ7Ci0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBpbiBtb2RpZmllZC4gICovCi0gIHVuc2lnbmVkIGludCBtb2RpZmllZF9hbGxvYzsKLSAgLyogNCBieXRlIGNvbXBsZXggdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBjb21wbGV4X2Zsb2F0X2luZGV4OwotICAvKiA4IGJ5dGUgY29tcGxleCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbXBsZXhfZG91YmxlX2luZGV4OwotICAvKiBUaGUgZGVwdGggb2YgYmxvY2sgbmVzdGluZy4gIFRoaXMgaXMgMCBvdXRzaWRlIGEgZnVuY3Rpb24sIGFuZCAxCi0gICAgIGp1c3QgYWZ0ZXIgc3RhcnRfZnVuY3Rpb24gaXMgY2FsbGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGJsb2NrX2RlcHRoOwotICAvKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmZubmFtZTsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gd2UgYXJlIGN1cnJlbnRseQotICAgICB3cml0aW5nIG91dC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgZm50eXBlOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBmdW5jdGlvbiB3ZSBhcmUKLSAgICAgY3VycmVudGx5IHdyaXRpbmcgb3V0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmFyZ3M7Ci0gIC8qIE51bWJlciBvZiBhcmd1bWVudHMgd3JpdHRlbiB0byBmbmFyZ3MuICAqLwotICB1bnNpZ25lZCBpbnQgZm5hcmdjb3VudDsKLSAgLyogUGVuZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLSAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICpwZW5kaW5nX3Bhcm1zOwotICAvKiBDdXJyZW50IGxpbmUgbnVtYmVyIGZpbGVuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbGluZW5vX2ZpbGVuYW1lOwotICAvKiBMaW5lIG51bWJlciBuYW1lIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGxpbmVub19uYW1lX2luZHg7Ci0gIC8qIEZpbGVuYW1lIG9mIHBlbmRpbmcgbGluZSBudW1iZXIuICAqLwotICBjb25zdCBjaGFyICpwZW5kaW5nX2xpbmVub19maWxlbmFtZTsKLSAgLyogUGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgcGVuZGluZ19saW5lbm87Ci0gIC8qIEFkZHJlc3Mgb2YgcGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gIGJmZF92bWEgcGVuZGluZ19saW5lbm9fYWRkcjsKLSAgLyogSGlnaGVzdCBhZGRyZXNzIHNlZW4gYXQgZW5kIG9mIHByb2NlZHVyZS4gICovCi0gIGJmZF92bWEgaGlnaGFkZHI7Ci19OwotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX2luaXRfYnVmZmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2hhbmdlX2J1ZmZlcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgc3RydWN0IGllZWVfYnVmbGlzdCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FwcGVuZF9idWZmZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKiwKLQkgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhbF93cml0ZV9ieXRlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfMmJ5dGVzIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfbnVtYmVyIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2lkIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfYXNuCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfYXRuNjUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3B1c2hfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3BvcF90eXBlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdm9pZCBpZWVlX3BvcF91bnVzZWRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3BvcF90eXBlX3VzZWQKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYWRkX3JhbmdlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBib29sZWFuLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X3JhbmdlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9yYW5nZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9kZWZpbmVfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2RlZmluZV9uYW1lZF90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikpOwotc3RhdGljIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKmllZWVfZ2V0X21vZGlmaWVkX2luZm8KLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV91bmRlZmluZWRfdGFnCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHZvaWQgaWVlZV9hZGRfYmIxMV9ibG9ja3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9hZGRfYmIxMQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9vdXRwdXRfcGVuZGluZ19wYXJtcyBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3Zpc190b19mbGFncyBQQVJBTVMgKChlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfbWV0aG9kX3ZhcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgYmZkX3ZtYSwgYm9vbGVhbikpOwotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZvaWRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jb21wbGV4X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9wb2ludGVyX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JhbmdlX3R5cGUgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfb2Zmc2V0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX21ldGhvZF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZvbGF0aWxlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfc3RydWN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2NsYXNzX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfYmFzZWNsYXNzCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX3N0YXJ0X21ldGhvZCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfZW5kX21ldGhvZCBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGVkZWZfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90YWdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdGFnIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2ludF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGVkX2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Z1bmN0aW9uX3BhcmFtZXRlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX2Z1bmN0aW9uIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9saW5lbm8KLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgaWVlZV9mbnMgPQotewotICBpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQsCi0gIGllZWVfc3RhcnRfc291cmNlLAotICBpZWVlX2VtcHR5X3R5cGUsCi0gIGllZWVfdm9pZF90eXBlLAotICBpZWVlX2ludF90eXBlLAotICBpZWVlX2Zsb2F0X3R5cGUsCi0gIGllZWVfY29tcGxleF90eXBlLAotICBpZWVlX2Jvb2xfdHlwZSwKLSAgaWVlZV9lbnVtX3R5cGUsCi0gIGllZWVfcG9pbnRlcl90eXBlLAotICBpZWVlX2Z1bmN0aW9uX3R5cGUsCi0gIGllZWVfcmVmZXJlbmNlX3R5cGUsCi0gIGllZWVfcmFuZ2VfdHlwZSwKLSAgaWVlZV9hcnJheV90eXBlLAotICBpZWVlX3NldF90eXBlLAotICBpZWVlX29mZnNldF90eXBlLAotICBpZWVlX21ldGhvZF90eXBlLAotICBpZWVlX2NvbnN0X3R5cGUsCi0gIGllZWVfdm9sYXRpbGVfdHlwZSwKLSAgaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSwKLSAgaWVlZV9zdHJ1Y3RfZmllbGQsCi0gIGllZWVfZW5kX3N0cnVjdF90eXBlLAotICBpZWVlX3N0YXJ0X2NsYXNzX3R5cGUsCi0gIGllZWVfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgaWVlZV9jbGFzc19iYXNlY2xhc3MsCi0gIGllZWVfY2xhc3Nfc3RhcnRfbWV0aG9kLAotICBpZWVlX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBpZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwKLSAgaWVlZV9jbGFzc19lbmRfbWV0aG9kLAotICBpZWVlX2VuZF9jbGFzc190eXBlLAotICBpZWVlX3R5cGVkZWZfdHlwZSwKLSAgaWVlZV90YWdfdHlwZSwKLSAgaWVlZV90eXBkZWYsCi0gIGllZWVfdGFnLAotICBpZWVlX2ludF9jb25zdGFudCwKLSAgaWVlZV9mbG9hdF9jb25zdGFudCwKLSAgaWVlZV90eXBlZF9jb25zdGFudCwKLSAgaWVlZV92YXJpYWJsZSwKLSAgaWVlZV9zdGFydF9mdW5jdGlvbiwKLSAgaWVlZV9mdW5jdGlvbl9wYXJhbWV0ZXIsCi0gIGllZWVfc3RhcnRfYmxvY2ssCi0gIGllZWVfZW5kX2Jsb2NrLAotICBpZWVlX2VuZF9mdW5jdGlvbiwKLSAgaWVlZV9saW5lbm8KLX07Ci0KLS8qIEluaXRpYWxpemUgYSBidWZmZXIgdG8gYmUgZW1wdHkuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1pZWVlX2luaXRfYnVmZmVyIChpbmZvLCBidWZsaXN0KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLXsKLSAgYnVmbGlzdC0+aGVhZCA9IE5VTEw7Ci0gIGJ1Zmxpc3QtPnRhaWwgPSBOVUxMOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgYSBidWZmZXIgbGlzdCBoYXMgYW55IGRhdGEuICAqLwotCi0jZGVmaW5lIGllZWVfYnVmZmVyX2VtcHR5cChidWZsaXN0KSAoKGJ1Zmxpc3QpLT5oZWFkID09IE5VTEwpCi0KLS8qIENoYW5nZSB0aGUgY3VycmVudCBidWZmZXIgdG8gYSBzcGVjaWZpZWQgYnVmZmVyIGNoYWluLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgYnVmbGlzdCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpidWZsaXN0OwotewotICBpZiAoYnVmbGlzdC0+aGVhZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBpZWVlX2J1ZiAqYnVmOwotCi0gICAgICBidWYgPSAoc3RydWN0IGllZWVfYnVmICopIHhtYWxsb2MgKHNpemVvZiAqYnVmKTsKLSAgICAgIGJ1Zi0+bmV4dCA9IE5VTEw7Ci0gICAgICBidWYtPmMgPSAwOwotICAgICAgYnVmbGlzdC0+aGVhZCA9IGJ1ZjsKLSAgICAgIGJ1Zmxpc3QtPnRhaWwgPSBidWY7Ci0gICAgfQotCi0gIGluZm8tPmN1cnJlbnQgPSBidWZsaXN0OwotICBpbmZvLT5jdXJidWYgPSBidWZsaXN0LT50YWlsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBcHBlbmQgYSBidWZmZXIgY2hhaW4uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1pZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sIG1haW5idWYsIG5ld2J1ZikKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKm1haW5idWY7Ci0gICAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKm5ld2J1ZjsKLXsKLSAgaWYgKG5ld2J1Zi0+aGVhZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChtYWluYnVmLT5oZWFkID09IE5VTEwpCi0JbWFpbmJ1Zi0+aGVhZCA9IG5ld2J1Zi0+aGVhZDsKLSAgICAgIGVsc2UKLQltYWluYnVmLT50YWlsLT5uZXh0ID0gbmV3YnVmLT5oZWFkOwotICAgICAgbWFpbmJ1Zi0+dGFpbCA9IG5ld2J1Zi0+dGFpbDsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhIGJ5dGUgaW50byB0aGUgYnVmZmVyLiAgV2UgdXNlIGEgbWFjcm8gZm9yIHNwZWVkIGFuZCBhCi0gICBmdW5jdGlvbiBmb3IgdGhlIGNvbXBsZXggY2FzZXMuICAqLwotCi0jZGVmaW5lIGllZWVfd3JpdGVfYnl0ZShpbmZvLCBiKQkJCQlcCi0gICgoaW5mbyktPmN1cmJ1Zi0+YyA8IElFRUVfQlVGU0laRQkJCQlcCi0gICA/ICgoaW5mbyktPmN1cmJ1Zi0+YnVmWyhpbmZvKS0+Y3VyYnVmLT5jKytdID0gKGIpLCB0cnVlKQlcCi0gICA6IGllZWVfcmVhbF93cml0ZV9ieXRlICgoaW5mbyksIChiKSkpCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWxfd3JpdGVfYnl0ZSAoaW5mbywgYikKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBpbnQgYjsKLXsKLSAgaWYgKGluZm8tPmN1cmJ1Zi0+YyA+PSBJRUVFX0JVRlNJWkUpCi0gICAgewotICAgICAgc3RydWN0IGllZWVfYnVmICpuOwotCi0gICAgICBuID0gKHN0cnVjdCBpZWVlX2J1ZiAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICAgICAgbi0+bmV4dCA9IE5VTEw7Ci0gICAgICBuLT5jID0gMDsKLSAgICAgIGlmIChpbmZvLT5jdXJyZW50LT5oZWFkID09IE5VTEwpCi0JaW5mby0+Y3VycmVudC0+aGVhZCA9IG47Ci0gICAgICBlbHNlCi0JaW5mby0+Y3VycmVudC0+dGFpbC0+bmV4dCA9IG47Ci0gICAgICBpbmZvLT5jdXJyZW50LT50YWlsID0gbjsKLSAgICAgIGluZm8tPmN1cmJ1ZiA9IG47Ci0gICAgfQotCi0gIGluZm8tPmN1cmJ1Zi0+YnVmW2luZm8tPmN1cmJ1Zi0+Y10gPSBiOwotICArK2luZm8tPmN1cmJ1Zi0+YzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHR3byBieXRlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgaSkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBpbnQgaTsKLXsKLSAgcmV0dXJuIChpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGkgPj4gOCkKLQkgICYmIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgaSAmIDB4ZmYpKTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGludGVnZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHYpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYmZkX3ZtYSB2OwotewotICBiZmRfdm1hIHQ7Ci0gIGJmZF9ieXRlIGFiWzIwXTsKLSAgYmZkX2J5dGUgKnA7Ci0gIHVuc2lnbmVkIGludCBjOwotCi0gIGlmICh2IDw9IChiZmRfdm1hKSBpZWVlX251bWJlcl9lbmRfZW51bSkKLSAgICByZXR1cm4gaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSB2KTsKLQotICB0ID0gdjsKLSAgcCA9IGFiICsgc2l6ZW9mIGFiOwotICB3aGlsZSAodCAhPSAwKQotICAgIHsKLSAgICAgICotLXAgPSB0ICYgMHhmZjsKLSAgICAgIHQgPj49IDg7Ci0gICAgfQotICBjID0gKGFiICsgMjApIC0gcDsKLQotICBpZiAoYyA+ICh1bnNpZ25lZCBpbnQpIChpZWVlX251bWJlcl9yZXBlYXRfZW5kX2VudW0KLQkJCSAgLSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIG51bWVyaWMgb3ZlcmZsb3c6IDB4IikpOwotICAgICAgZnByaW50Zl92bWEgKHN0ZGVyciwgdik7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtICsgYykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKDsgYyA+IDA7IC0tYywgKytwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKnApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cmluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2lkIChpbmZvLCBzKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgbGVuID0gc3RybGVuIChzKTsKLSAgaWYgKGxlbiA8PSAweDdmKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgbGVuKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChsZW4gPD0gMHhmZikKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8xX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgbGVuKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChsZW4gPD0gMHhmZmZmKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIGxlbikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSBzdHJpbmcgbGVuZ3RoIG92ZXJmbG93OiAldVxuIiksIGxlbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGZvciAoOyAqcyAhPSAnXDAnOyBzKyspCi0gICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAqcykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBBU04gcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmR4LCB2YWwpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICByZXR1cm4gKGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2Fzbl9yZWNvcmRfZW51bSkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHZhbCkpOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gQVRONjUgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfYXRuNjUgKGluZm8sIGluZHgsIHMpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHJldHVybiAoaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2NSkKLQkgICYmIGllZWVfd3JpdGVfaWQgKGluZm8sIHMpKTsKLX0KLQotLyogUHVzaCBhIHR5cGUgaW5kZXggb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5keCwgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLSAgICAgYm9vbGVhbiBsb2NhbHA7Ci17Ci0gIHN0cnVjdCBpZWVlX3R5cGVfc3RhY2sgKnRzOwotCi0gIHRzID0gKHN0cnVjdCBpZWVlX3R5cGVfc3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mICp0cyk7Ci0gIG1lbXNldCAodHMsIDAsIHNpemVvZiAqdHMpOwotCi0gIHRzLT50eXBlLmluZHggPSBpbmR4OwotICB0cy0+dHlwZS5zaXplID0gc2l6ZTsKLSAgdHMtPnR5cGUudW5zaWduZWRwID0gdW5zaWduZWRwOwotICB0cy0+dHlwZS5sb2NhbHAgPSBsb2NhbHA7Ci0KLSAgdHMtPm5leHQgPSBpbmZvLT50eXBlX3N0YWNrOwotICBpbmZvLT50eXBlX3N0YWNrID0gdHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBvcCBhIHR5cGUgaW5kZXggb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotaWVlZV9wb3BfdHlwZSAoaW5mbykKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotewotICByZXR1cm4gaWVlZV9wb3BfdHlwZV91c2VkIChpbmZvLCB0cnVlKTsKLX0KLQotLyogUG9wIGFuIHVudXNlZCB0eXBlIGluZGV4IG9mZiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyB2b2lkCi1pZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbykKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotewotICAodm9pZCkgaWVlZV9wb3BfdHlwZV91c2VkIChpbmZvLCBmYWxzZSk7Ci19Ci0KLS8qIFBvcCBhIHVzZWQgb3IgdW51c2VkIHR5cGUgaW5kZXggb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotaWVlZV9wb3BfdHlwZV91c2VkIChpbmZvLCB1c2VkKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJvb2xlYW4gdXNlZDsKLXsKLSAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqdHM7Ci0gIHVuc2lnbmVkIGludCByZXQ7Ci0KLSAgdHMgPSBpbmZvLT50eXBlX3N0YWNrOwotICBhc3NlcnQgKHRzICE9IE5VTEwpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiB0eXBlLCBhbmQgd2UgbmVlZCBpdCwgd2UgbmVlZCB0byBhcHBlbmQgdGhlCi0gICAgIGFjdHVhbCBkZWZpbml0aW9uIHRvIHRoZSB0eXBlZGVmIGJsb2NrIG5vdy4gICovCi0gIGlmICh1c2VkICYmICEgaWVlZV9idWZmZXJfZW1wdHlwICgmdHMtPnR5cGUuZm5kZWYpKQotICAgIHsKLSAgICAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKmJ1Zmxpc3Q7Ci0KLSAgICAgIGlmICh0cy0+dHlwZS5sb2NhbHApCi0JewotCSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgc3RhcnRlZCB0aGUgdHlwZXMgYmxvY2suICAqLwotCSAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVzKSkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxKQotCQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5tb2RuYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBidWZsaXN0ID0gJmluZm8tPnR5cGVzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBNYWtlIHN1cmUgd2Ugc3RhcnRlZCB0aGUgZ2xvYmFsIHR5cGUgYmxvY2suICAqLwotCSAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmdsb2JhbF90eXBlcykpCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDIpCi0JCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBidWZsaXN0ID0gJmluZm8tPmdsb2JhbF90eXBlczsKLQl9Ci0KLSAgICAgIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgYnVmbGlzdCwgJnRzLT50eXBlLmZuZGVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldCA9IHRzLT50eXBlLmluZHg7Ci0gIGluZm8tPnR5cGVfc3RhY2sgPSB0cy0+bmV4dDsKLSAgZnJlZSAodHMpOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBBZGQgYSByYW5nZSBvZiBieXRlcyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfYWRkX3JhbmdlIChpbmZvLCBnbG9iYWwsIGxvdywgaGlnaCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBib29sZWFuIGdsb2JhbDsKLSAgICAgYmZkX3ZtYSBsb3c7Ci0gICAgIGJmZF92bWEgaGlnaDsKLXsKLSAgc3RydWN0IGllZWVfcmFuZ2UgKipwbGlzdCwgKnIsICoqcHI7Ci0KLSAgaWYgKGxvdyA9PSAoYmZkX3ZtYSkgLTEgfHwgaGlnaCA9PSAoYmZkX3ZtYSkgLTEgfHwgbG93ID09IGhpZ2gpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGdsb2JhbCkKLSAgICBwbGlzdCA9ICZpbmZvLT5nbG9iYWxfcmFuZ2VzOwotICBlbHNlCi0gICAgcGxpc3QgPSAmaW5mby0+cmFuZ2VzOwotCi0gIGZvciAociA9ICpwbGlzdDsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoaGlnaCA+PSByLT5sb3cgJiYgbG93IDw9IHItPmhpZ2gpCi0JewotCSAgLyogVGhlIG5ldyByYW5nZSBvdmVybGFwcyByLiAgKi8KLQkgIGlmIChsb3cgPCByLT5sb3cpCi0JICAgIHItPmxvdyA9IGxvdzsKLQkgIGlmIChoaWdoID4gci0+aGlnaCkKLQkgICAgci0+aGlnaCA9IGhpZ2g7Ci0JICBwciA9ICZyLT5uZXh0OwotCSAgd2hpbGUgKCpwciAhPSBOVUxMICYmICgqcHIpLT5sb3cgPD0gci0+aGlnaCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBpZWVlX3JhbmdlICpuOwotCi0JICAgICAgaWYgKCgqcHIpLT5oaWdoID4gci0+aGlnaCkKLQkJci0+aGlnaCA9ICgqcHIpLT5oaWdoOwotCSAgICAgIG4gPSAoKnByKS0+bmV4dDsKLQkgICAgICBmcmVlICgqcHIpOwotCSAgICAgICpwciA9IG47Ci0JICAgIH0KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgciA9IChzdHJ1Y3QgaWVlZV9yYW5nZSAqKSB4bWFsbG9jIChzaXplb2YgKnIpOwotICBtZW1zZXQgKHIsIDAsIHNpemVvZiAqcik7Ci0KLSAgci0+bG93ID0gbG93OwotICByLT5oaWdoID0gaGlnaDsKLQotICAvKiBTdG9yZSB0aGUgcmFuZ2VzIHNvcnRlZCBieSBhZGRyZXNzLiAgKi8KLSAgZm9yIChwciA9IHBsaXN0OyAqcHIgIT0gTlVMTDsgcHIgPSAmKCpwciktPm5leHQpCi0gICAgaWYgKCgqcHIpLT5sb3cgPiBoaWdoKQotICAgICAgYnJlYWs7Ci0gIHItPm5leHQgPSAqcHI7Ci0gICpwciA9IHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgbmV3IHJhbmdlIGZvciB3aGljaCB3ZSBvbmx5IGhhdmUgdGhlIGxvdyBhZGRyZXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfcmFuZ2UgKGluZm8sIGxvdykKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBiZmRfdm1hIGxvdzsKLXsKLSAgc3RydWN0IGllZWVfcmFuZ2UgKnI7Ci0KLSAgciA9IChzdHJ1Y3QgaWVlZV9yYW5nZSAqKSB4bWFsbG9jIChzaXplb2YgKnIpOwotICBtZW1zZXQgKHIsIDAsIHNpemVvZiAqcik7Ci0gIHItPmxvdyA9IGxvdzsKLSAgci0+bmV4dCA9IGluZm8tPnBlbmRpbmdfcmFuZ2VzOwotICBpbmZvLT5wZW5kaW5nX3JhbmdlcyA9IHI7Ci0gIHJldHVybiB0cnVlOwotfSAgCi0KLS8qIEZpbmlzaCBhIHJhbmdlIHN0YXJ0ZWQgYnkgaWVlZV9zdGFydF9yYW5nZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VuZF9yYW5nZSAoaW5mbywgaGlnaCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBiZmRfdm1hIGhpZ2g7Ci17Ci0gIHN0cnVjdCBpZWVlX3JhbmdlICpyOwotICBiZmRfdm1hIGxvdzsKLQotICBhc3NlcnQgKGluZm8tPnBlbmRpbmdfcmFuZ2VzICE9IE5VTEwpOwotICByID0gaW5mby0+cGVuZGluZ19yYW5nZXM7Ci0gIGxvdyA9IHItPmxvdzsKLSAgaW5mby0+cGVuZGluZ19yYW5nZXMgPSByLT5uZXh0OwotICBmcmVlIChyKTsKLSAgcmV0dXJuIGllZWVfYWRkX3JhbmdlIChpbmZvLCBmYWxzZSwgbG93LCBoaWdoKTsKLX0KLQotLyogU3RhcnQgZGVmaW5pbmcgYSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLSAgICAgYm9vbGVhbiBsb2NhbHA7Ci17Ci0gIHJldHVybiBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAodW5zaWduZWQgaW50KSAtMSwgc2l6ZSwgdW5zaWduZWRwLAotCQkJCSBsb2NhbHAsIChzdHJ1Y3QgaWVlZV9idWZsaXN0ICopIE5VTEwpOwotfQotCi0vKiBTdGFydCBkZWZpbmluZyBhIG5hbWVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgbmFtZSwgaW5keCwgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHAsIGJ1Zmxpc3QpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLSAgICAgYm9vbGVhbiBsb2NhbHA7Ci0gICAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKmJ1Zmxpc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCB0eXBlX2luZHg7Ci0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0KLSAgaWYgKGluZHggIT0gKHVuc2lnbmVkIGludCkgLTEpCi0gICAgdHlwZV9pbmR4ID0gaW5keDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHR5cGVfaW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgICAgICsraW5mby0+dHlwZV9pbmR4OwotICAgIH0KLQotICBuYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0gICsraW5mby0+bmFtZV9pbmR4OwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgbmFtZSA9ICIiOwotCi0gIC8qIElmIHdlIHdlcmUgZ2l2ZW4gYSBidWZmZXIsIHVzZSBpdDsgb3RoZXJ3aXNlLCB1c2UgZWl0aGVyIHRoZQotICAgICBsb2NhbCBvciB0aGUgZ2xvYmFsIHR5cGUgaW5mb3JtYXRpb24sIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgdHlwZQotICAgICBibG9jayBpcyBzdGFydGVkLiAgKi8KLSAgaWYgKGJ1Zmxpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sIGJ1Zmxpc3QpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxvY2FscCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5tb2RuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAyKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFB1c2ggdGhlIG5ldyB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrLCB3cml0ZSBvdXQgYW4gTk4gcmVjb3JkLCBhbmQKLSAgICAgd3JpdGUgb3V0IHRoZSBzdGFydCBvZiBhIFRZIHJlY29yZC4gIFRoZSBjYWxsZXIgd2lsbCB0aGVuIGZpbmlzaAotICAgICB0aGUgVFkgcmVjb3JkLiAgKi8KLSAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIHR5cGVfaW5keCwgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gKGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KQotCSAgJiYgaWVlZV93cml0ZV9pZCAoaW5mbywgbmFtZSkKLQkgICYmIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV90eV9yZWNvcmRfZW51bSkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB0eXBlX2luZHgpCi0JICAmJiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDB4Y2UpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KSk7Ci19Ci0KLS8qIEdldCBhbiBlbnRyeSB0byB0aGUgbGlzdCBvZiBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIHR5cGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqCi1pZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBpbmR4KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotewotICBpZiAoaW5keCA+PSBpbmZvLT5tb2RpZmllZF9hbGxvYykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmFsbG9jOwotCi0gICAgICBuYWxsb2MgPSBpbmZvLT5tb2RpZmllZF9hbGxvYzsKLSAgICAgIGlmIChuYWxsb2MgPT0gMCkKLQluYWxsb2MgPSAxNjsKLSAgICAgIHdoaWxlIChpbmR4ID49IG5hbGxvYykKLQluYWxsb2MgKj0gMjsKLSAgICAgIGluZm8tPm1vZGlmaWVkID0gKChzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICopCi0JCQl4cmVhbGxvYyAoaW5mby0+bW9kaWZpZWQsCi0JCQkJICBuYWxsb2MgKiBzaXplb2YgKmluZm8tPm1vZGlmaWVkKSk7Ci0gICAgICBtZW1zZXQgKGluZm8tPm1vZGlmaWVkICsgaW5mby0+bW9kaWZpZWRfYWxsb2MsIDAsCi0JICAgICAgKG5hbGxvYyAtIGluZm8tPm1vZGlmaWVkX2FsbG9jKSAqIHNpemVvZiAqaW5mby0+bW9kaWZpZWQpOwotICAgICAgaW5mby0+bW9kaWZpZWRfYWxsb2MgPSBuYWxsb2M7Ci0gICAgfQotCi0gIHJldHVybiBpbmZvLT5tb2RpZmllZCArIGluZHg7Ci19Ci0MCi0vKiBSb3V0aW5lcyBmb3IgdGhlIGhhc2ggdGFibGUgbWFwcGluZyBuYW1lcyB0byB0eXBlcy4gICovCi0KLS8qIEluaXRpYWxpemUgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWllZWVfbmFtZV90eXBlX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAqcmV0KSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dHlwZXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGllZWVfbmFtZV90eXBlX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVHJhdmVyc2UgdGhlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGllZWVfbmFtZV90eXBlX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2hhc2hfdHJhdmVyc2UJCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQwKLS8qIFRoZSBnZW5lcmFsIHJvdXRpbmUgdG8gd3JpdGUgb3V0IElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlIGluZm87Ci0gIGFzZWN0aW9uICpzOwotICBjb25zdCBjaGFyICplcnI7Ci0gIHN0cnVjdCBpZWVlX2J1ZiAqYjsKLQotICBtZW1zZXQgKCZpbmZvLCAwLCBzaXplb2YgaW5mbyk7Ci0gIGluZm8uYWJmZCA9IGFiZmQ7Ci0gIGluZm8udHlwZV9pbmR4ID0gMjU2OwotICBpbmZvLm5hbWVfaW5keCA9IDMyOwotCi0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZpbmZvLnR5cGVkZWZzLnJvb3QsIGllZWVfbmFtZV90eXBlX25ld2Z1bmMpCi0gICAgICB8fCAhIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZpbmZvLnRhZ3Mucm9vdCwgaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5nbG9iYWxfdHlwZXMpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5kYXRhKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8udHlwZXMpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby52YXJzKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uY3h4KQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8ubGluZW5vcykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmZudHlwZSkKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmZuYXJncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGRlYnVnX3dyaXRlIChkaGFuZGxlLCAmaWVlZV9mbnMsIChQVFIpICZpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8uZmlsZW5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2ZpbmlzaF9jb21waWxhdGlvbl91bml0ICgmaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBQdXQgYW55IHVuZGVmaW5lZCB0YWdzIGluIHRoZSBnbG9iYWwgdHlwZWRlZiBpbmZvcm1hdGlvbi4gICovCi0gIGluZm8uZXJyb3IgPSBmYWxzZTsKLSAgaWVlZV9uYW1lX3R5cGVfaGFzaF90cmF2ZXJzZSAoJmluZm8udGFncywKLQkJCQlpZWVlX3dyaXRlX3VuZGVmaW5lZF90YWcsCi0JCQkJKFBUUikgJmluZm8pOwotICBpZiAoaW5mby5lcnJvcikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUHJlcGVuZCB0aGUgZ2xvYmFsIHR5cGVkZWYgaW5mb3JtYXRpb24gdG8gdGhlIG90aGVyIGRhdGEuICAqLwotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLmdsb2JhbF90eXBlcykpCi0gICAgewotICAgICAgLyogVGhlIEhQIGRlYnVnZ2VyIHNlZW1zIHRvIGhhdmUgYSBidWcgaW4gd2hpY2ggaXQgaWdub3JlcyB0aGUKLSAgICAgICAgIGxhc3QgZW50cnkgaW4gdGhlIGdsb2JhbCB0eXBlcywgc28gd2UgYWRkIGEgZHVtbXkgZW50cnkuICAqLwotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyICgmaW5mbywgJmluZm8uZ2xvYmFsX3R5cGVzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKCZpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKCZpbmZvLCBpbmZvLm5hbWVfaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoJmluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKCZpbmZvLCAoaW50KSBpZWVlX3R5X3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoJmluZm8sIGluZm8udHlwZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKCZpbmZvLCAweGNlKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoJmluZm8sIGluZm8ubmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoJmluZm8sICdQJykKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKCZpbmZvLCAoaW50KSBidWlsdGluX3ZvaWQgKyAzMikKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlICgmaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKCZpbmZvLCAmaW5mby5nbG9iYWxfdHlwZXMsICZpbmZvLmRhdGEpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8uZGF0YSA9IGluZm8uZ2xvYmFsX3R5cGVzOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGRlY2xhcmUgQkIxMSBibG9ja3MgZm9yIGVhY2ggcmFuZ2UgaW4gdGhlCi0gICAgIGZpbGUuICBUaGV5IGFyZSBhZGRlZCB0byBpbmZvLT52YXJzLiAgKi8KLSAgaW5mby5lcnJvciA9IGZhbHNlOwotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8udmFycykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGllZWVfYWRkX2JiMTFfYmxvY2tzLCAoUFRSKSAmaW5mbyk7Ci0gIGlmIChpbmZvLmVycm9yKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby52YXJzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKCZpbmZvLCAmaW5mby52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKCZpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoJmluZm8sICZpbmZvLmRhdGEsICZpbmZvLnZhcnMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTm93IGFsbCB0aGUgZGF0YSBpcyBpbiBpbmZvLmRhdGEuICBXcml0ZSBpdCBvdXQgdG8gdGhlIEJGRC4gIFdlCi0gICAgIG5vcm1hbGx5IHdvdWxkIG5lZWQgdG8gd29ycnkgYWJvdXQgd2hldGhlciBhbGwgdGhlIG90aGVyIHNlY3Rpb25zCi0gICAgIGFyZSBzZXQgdXAgeWV0LCBidXQgdGhlIElFRUUgYmFja2VuZCB3aWxsIGhhbmRsZSB0aGlzIHBhcnRpY3VsYXIKLSAgICAgY2FzZSBjb3JyZWN0bHkgcmVnYXJkbGVzcy4gICovCi0gIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLmRhdGEpKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGlzIG5vIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVyciA9IE5VTEw7Ci0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRlYnVnIik7Ci0gIGlmIChzID09IE5VTEwpCi0gICAgZXJyID0gImJmZF9tYWtlX3NlY3Rpb24iOwotICBpZiAoZXJyID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfREVCVUdHSU5HIHwgU0VDX0hBU19DT05URU5UUykpCi0JZXJyID0gImJmZF9zZXRfc2VjdGlvbl9mbGFncyI7Ci0gICAgfQotICBpZiAoZXJyID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gICAgICBzaXplID0gMDsKLSAgICAgIGZvciAoYiA9IGluZm8uZGF0YS5oZWFkOyBiICE9IE5VTEw7IGIgPSBiLT5uZXh0KQotCXNpemUgKz0gYi0+YzsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzLCBzaXplKSkKLQllcnIgPSAiYmZkX3NldF9zZWN0aW9uX3NpemUiOwotICAgIH0KLSAgaWYgKGVyciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZpbGVfcHRyIG9mZnNldDsKLQotICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgIGZvciAoYiA9IGluZm8uZGF0YS5oZWFkOyBiICE9IE5VTEw7IGIgPSBiLT5uZXh0KQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgYi0+YnVmLCBvZmZzZXQsIGItPmMpKQotCSAgICB7Ci0JICAgICAgZXJyID0gImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIG9mZnNldCArPSBiLT5jOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBlcnIsCi0JICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmluZm8udHlwZWRlZnMucm9vdCk7Ci0gIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZpbmZvLnRhZ3Mucm9vdCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBpbmZvcm1hdGlvbiBmb3IgYW4gdW5kZWZpbmVkIHRhZy4gIFRoaXMgaXMgY2FsbGVkIHZpYQotICAgaWVlZV9uYW1lX3R5cGVfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX3VuZGVmaW5lZF90YWcgKGgsIHApCi0gICAgIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIGZvciAobnQgPSBoLT50eXBlczsgbnQgIT0gTlVMTDsgbnQgPSBudC0+bmV4dCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmFtZV9pbmR4OwotICAgICAgY2hhciBjb2RlOwotCi0gICAgICBpZiAobnQtPmtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDIpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkgICAgewotCSAgICAgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQkgICAgewotCSAgICAgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG5hbWVfaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgICAgICsraW5mby0+bmFtZV9pbmR4OwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgbnQtPnR5cGUubmFtZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX3R5X3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbnQtPnR5cGUuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAweGNlKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KSkKLQl7Ci0JICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzd2l0Y2ggKG50LT5raW5kKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLQljYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0JICBjb2RlID0gJ1MnOwotCSAgYnJlYWs7Ci0JY2FzZSBERUJVR19LSU5EX1VOSU9OOgotCWNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLQkgIGNvZGUgPSAnVSc7Ci0JICBicmVhazsKLQljYXNlIERFQlVHX0tJTkRfRU5VTToKLQkgIGNvZGUgPSAnRSc7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgY29kZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApKQotCXsKLQkgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCB3cml0aW5nIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfY29tcGlsYXRpb25fdW5pdCAocCwgZmlsZW5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBjb25zdCBjaGFyICptb2RuYW1lOwotICBjaGFyICpjLCAqczsKLSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gIGlmIChpbmZvLT5maWxlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfZmluaXNoX2NvbXBpbGF0aW9uX3VuaXQgKGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbW9kbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOwotICBpZiAobW9kbmFtZSAhPSBOVUxMKQotICAgICsrbW9kbmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJ1xcJyk7Ci0gICAgICBpZiAobW9kbmFtZSAhPSBOVUxMKQotCSsrbW9kbmFtZTsKLSAgICAgIGVsc2UKLQltb2RuYW1lID0gZmlsZW5hbWU7Ci0gICAgfQotICBjID0geHN0cmR1cCAobW9kbmFtZSk7Ci0gIHMgPSBzdHJyY2hyIChjLCAnLicpOwotICBpZiAocyAhPSBOVUxMKQotICAgICpzID0gJ1wwJzsKLSAgaW5mby0+bW9kbmFtZSA9IGM7Ci0KLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCkKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPmxpbmVub3MpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+cmFuZ2VzID0gTlVMTDsKLQotICAvKiBBbHdheXMgaW5jbHVkZSBhIEJCMSBhbmQgYSBCQjMgYmxvY2suICBUaGF0IGlzIHdoYXQgdGhlIG91dHB1dCBvZgotICAgICB0aGUgTVJJIGxpbmtlciBzZWVtcyB0byBsb29rIGxpa2UuICAqLwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5tb2RuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmluZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0gICsraW5mby0+bmFtZV9pbmR4OwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGEgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ZpbmlzaF9jb21waWxhdGlvbl91bml0IChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci17Ci0gIHN0cnVjdCBpZWVlX3JhbmdlICpyOwotCi0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmN4eCkpCi0gICAgewotICAgICAgLyogQXBwZW5kIGFueSBDKysgaW5mb3JtYXRpb24gdG8gdGhlIGdsb2JhbCBmdW5jdGlvbiBhbmQKLSAgICAgICAgIHZhcmlhYmxlIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGFzc2VydCAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSk7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIHB1dCB0aGUgcG1pc2MgcmVjb3JkcyBpbiBhIGR1bW15IHByb2NlZHVyZSwganVzdCBhcyB0aGUKLSAgICAgICAgIE1SSSBjb21waWxlciBkb2VzLiAgKi8KLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCA2KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIl9fWFJZQ1BQIikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+aGlnaGFkZHIgLSAxKQotCSAgfHwgISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzLCAmaW5mby0+Y3h4KQotCSAgfHwgISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5oaWdoYWRkciAtIDEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZvcmNlIG91dCB0aGUgcGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gICAgICBpZiAoISBpZWVlX2xpbmVubyAoKFBUUikgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgMCwgKGJmZF92bWEpIC0xKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5saW5lbm9zKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5saW5lbm9zKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChzdHJjbXAgKGluZm8tPmZpbGVuYW1lLCBpbmZvLT5saW5lbm9fZmlsZW5hbWUpICE9IDApCi0JewotCSAgLyogV2Ugd2VyZSBub3QgaW4gdGhlIG1haW4gZmlsZS4gIFdlIGp1c3QgY2xvc2VkIHRoZQotICAgICAgICAgICAgIGluY2x1ZGVkIGxpbmUgbnVtYmVyIGJsb2NrLCBhbmQgbm93IHdlIG11c3QgY2xvc2UgdGhlCi0gICAgICAgICAgICAgbWFpbiBsaW5lIG51bWJlciBibG9jay4gICovCi0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT5kYXRhLCAmaW5mby0+dHlwZXMpCi0gICAgICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmRhdGEsICZpbmZvLT52YXJzKQotICAgICAgfHwgISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT5kYXRhLCAmaW5mby0+bGluZW5vcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEJ1aWxkIEJCMTAvQkIxMSBibG9ja3MgYmFzZWQgb24gdGhlIHJhbmdlcyB3ZSByZWNvcmRlZC4gICovCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmRhdGEpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMTApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5tb2RuYW1lKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICJHTlUgb2JqY29weSIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKHIgPSBpbmZvLT5yYW5nZXM7IHIgIT0gTlVMTDsgciA9IHItPm5leHQpCi0gICAgewotICAgICAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGludCBraW5kOwotCi0gICAgICBsb3cgPSByLT5sb3c7Ci0gICAgICBoaWdoID0gci0+aGlnaDsKLQotICAgICAgLyogRmluZCB0aGUgc2VjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmFuZ2UuICAqLwotICAgICAgZm9yIChzID0gaW5mby0+YWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGluZm8tPmFiZmQsIHMpIDw9IGxvdwotCSAgICAgICYmIGhpZ2ggPD0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKGluZm8tPmFiZmQsIHMpCi0JCQkgICsgYmZkX3NlY3Rpb25fc2l6ZSAoaW5mby0+YWJmZCwgcykpKQotCSAgICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzID09IE5VTEwpCi0JewotCSAgLyogSnVzdCBpZ25vcmUgdGhpcyByYW5nZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIENvYWxlc2NlIHJhbmdlcyBpZiBpdCBzZWVtcyByZWFzb25hYmxlLiAgKi8KLSAgICAgIHdoaWxlIChyLT5uZXh0ICE9IE5VTEwKLQkgICAgICYmIGhpZ2ggKyAweDEwMDAgPj0gci0+bmV4dC0+bG93Ci0JICAgICAmJiAoci0+bmV4dC0+aGlnaAotCQkgPD0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKGluZm8tPmFiZmQsIHMpCi0JCSAgICAgKyBiZmRfc2VjdGlvbl9zaXplIChpbmZvLT5hYmZkLCBzKSkpKQotCXsKLQkgIHIgPSByLT5uZXh0OwotCSAgaGlnaCA9IHItPmhpZ2g7Ci0JfQotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0NPREUpICE9IDApCi0Ja2luZCA9IDE7Ci0gICAgICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDApCi0Ja2luZCA9IDM7Ci0gICAgICBlbHNlCi0Ja2luZCA9IDI7Ci0KLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywga2luZCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHMtPmluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93KQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBoaWdoIC0gbG93KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFkZCB0aGlzIHJhbmdlIHRvIHRoZSBsaXN0IG9mIGdsb2JhbCByYW5nZXMuICAqLwotICAgICAgaWYgKCEgaWVlZV9hZGRfcmFuZ2UgKGluZm8sIHRydWUsIGxvdywgaGlnaCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIEJCMTEgYmxvY2tzIGRlc2NyaWJpbmcgZWFjaCByYW5nZSB0aGF0IHdlIGhhdmUgbm90IGFscmVhZHkKLSAgIGRlc2NyaWJlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1pZWVlX2FkZF9iYjExX2Jsb2NrcyAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgZGF0YTsKLSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0gIHN0cnVjdCBpZWVlX3JhbmdlICpyOwotCi0gIGxvdyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0gIGhpZ2ggPSBsb3cgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IHJhbmdlIGF0IG9yIGFmdGVyIHRoaXMgc2VjdGlvbi4gIFRoZSByYW5nZXMgYXJlCi0gICAgIHNvcnRlZCBieSBhZGRyZXNzLiAgKi8KLSAgZm9yIChyID0gaW5mby0+Z2xvYmFsX3JhbmdlczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICBpZiAoci0+aGlnaCA+IGxvdykKLSAgICAgIGJyZWFrOwotCi0gIHdoaWxlIChsb3cgPCBoaWdoKQotICAgIHsKLSAgICAgIGlmIChyID09IE5VTEwgfHwgci0+bG93ID49IGhpZ2gpCi0JewotCSAgaWYgKCEgaWVlZV9hZGRfYmIxMSAoaW5mbywgc2VjLCBsb3csIGhpZ2gpKQotCSAgICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAobG93IDwgci0+bG93Ci0JICAmJiByLT5sb3cgLSBsb3cgPiAweDEwMCkKLQl7Ci0JICBpZiAoISBpZWVlX2FkZF9iYjExIChpbmZvLCBzZWMsIGxvdywgci0+bG93KSkKLQkgICAgewotCSAgICAgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBsb3cgPSByLT5oaWdoOwotCi0gICAgICByID0gci0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIEFkZCBhIHNpbmdsZSBCQjExIGJsb2NrIGZvciBhIHJhbmdlLiAgV2UgYWRkIGl0IHRvIGluZm8tPnZhcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hZGRfYmIxMSAoaW5mbywgc2VjLCBsb3csIGhpZ2gpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBsb3c7Ci0gICAgIGJmZF92bWEgaGlnaDsKLXsKLSAgaW50IGtpbmQ7Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqbW9kbmFtZTsKLSAgICAgIGNoYXIgKmMsICpzOwotCi0gICAgICAvKiBTdGFydCB0aGUgZW5jbG9zaW5nIEJCMTAgYmxvY2suICAqLwotICAgICAgZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKTsKLSAgICAgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChtb2RuYW1lICE9IE5VTEwpCi0JKyttb2RuYW1lOwotICAgICAgZWxzZQotCXsKLQkgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJ1xcJyk7Ci0JICBpZiAobW9kbmFtZSAhPSBOVUxMKQotCSAgICArK21vZG5hbWU7Ci0JICBlbHNlCi0JICAgIG1vZG5hbWUgPSBmaWxlbmFtZTsKLQl9Ci0gICAgICBjID0geHN0cmR1cCAobW9kbmFtZSk7Ci0gICAgICBzID0gc3RycmNociAoYywgJy4nKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JKnMgPSAnXDAnOwotCi0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMTApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBjKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICJHTlUgb2JqY29weSIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZnJlZSAoYyk7Ci0gICAgfQotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotICAgIGtpbmQgPSAxOwotICBlbHNlIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLSAgICBraW5kID0gMzsKLSAgZWxzZQotICAgIGtpbmQgPSAyOwotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywga2luZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNlYy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggLSBsb3cpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgcmVjb3JkaW5nIGluZm9ybWF0aW9uIGZyb20gYSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlLiAgVGhpcyBpcwotICAgdXNlZCB0byByZWNvcmQgd2hpY2ggZmlsZSBkZWZpbmVkIHdoaWNoIHR5cGVzLCB2YXJpYWJsZXMsIGV0Yy4gIEl0Ci0gICBpcyBub3QgdXNlZCBmb3IgbGluZSBudW1iZXJzLCBzaW5jZSB0aGUgbGluZW5vIGVudHJ5IHBvaW50IHBhc3NlcwotICAgZG93biB0aGUgZmlsZSBuYW1lIGFueWhvdy4gIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGRvZXNuJ3Qgc2VlbQotICAgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBhbnl3aGVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfc291cmNlIChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYW4gZW1wdHkgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VtcHR5X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCAoaW50KSBidWlsdGluX3Vua25vd24sIDAsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qIE1ha2UgYSB2b2lkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV92b2lkX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCAoaW50KSBidWlsdGluX3ZvaWQsIDAsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qIE1ha2UgYW4gaW50ZWdlciB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfaW50X3R5cGUgKHAsIHNpemUsIHVuc2lnbmVkcCkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX3NpZ25lZF9jaGFyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX3NpZ25lZF9sb25nOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX2xvbmdfbG9uZzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIklFRUUgdW5zdXBwb3J0ZWQgaW50ZWdlciB0eXBlIHNpemUgJXVcbiIpLCBzaXplKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHVuc2lnbmVkcCkKLSAgICArK2luZHg7Ci0KLSAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBpbmR4LCBzaXplLCB1bnNpZ25lZHAsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhIGZsb2F0aW5nIHBvaW50IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9mbG9hdF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9mbG9hdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2RvdWJsZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI6Ci0gICAgICAvKiBGSVhNRTogVGhpcyBzaXplIHJlYWxseSBkZXBlbmRzIHVwb24gdGhlIHByb2Nlc3Nvci4gICovCi0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9sb25nX2RvdWJsZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSB1bnN1cHBvcnRlZCBmbG9hdCB0eXBlIHNpemUgJXVcbiIpLCBzaXplKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBpbmR4LCBzaXplLCBmYWxzZSwgZmFsc2UpOwotfQotCi0vKiBNYWtlIGEgY29tcGxleCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY29tcGxleF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgY2hhciBjb2RlOwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgaWYgKGluZm8tPmNvbXBsZXhfZmxvYXRfaW5kZXggIT0gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZm8tPmNvbXBsZXhfZmxvYXRfaW5kZXgsIHNpemUgKiAyLAotCQkJICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBjb2RlID0gJ2MnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICBjYXNlIDE2OgotICAgICAgLyogVGhlc2UgY2FzZXMgY2FuIGJlIG91dHB1dCBieSBnY2MgLWdzdGFicy4gIE91dHB1dHRpbmcgdGhlCi0gICAgICAgICB3cm9uZyB0eXBlIGlzIGJldHRlciB0aGFuIGNyYXNoaW5nLiAgKi8KLSAgICBjYXNlIDg6Ci0gICAgICBpZiAoaW5mby0+Y29tcGxleF9kb3VibGVfaW5kZXggIT0gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZm8tPmNvbXBsZXhfZG91YmxlX2luZGV4LCBzaXplICogMiwKLQkJCSAgICAgICBmYWxzZSwgZmFsc2UpOwotICAgICAgY29kZSA9ICdkJzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIklFRUUgdW5zdXBwb3J0ZWQgY29tcGxleCB0eXBlIHNpemUgJXVcbiIpLCBzaXplKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBzdHJpbmcgaXMgZm9yLiAgKi8KLSAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSAqIDIsIGZhbHNlLCBmYWxzZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGNvZGUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHNpemUgPT0gNCkKLSAgICBpbmZvLT5jb21wbGV4X2Zsb2F0X2luZGV4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OwotICBlbHNlCi0gICAgaW5mby0+Y29tcGxleF9kb3VibGVfaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBib29sZWFuIHR5cGUuICBJRUVFIGRvZXNuJ3Qgc3VwcG9ydCB0aGVzZSwgc28gd2UganVzdCBtYWtlCi0gICBhbiBpbnRlZ2VyIHR5cGUgaW5zdGVhZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Jvb2xfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICByZXR1cm4gaWVlZV9pbnRfdHlwZSAocCwgc2l6ZSwgdHJ1ZSk7Ci19Ci0KLS8qIE1ha2UgYW4gZW51bWVyYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbnVtX3R5cGUgKHAsIHRhZywgbmFtZXMsIHZhbHMpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgICAgYmZkX3NpZ25lZF92bWEgKnZhbHM7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICplOwotICBib29sZWFuIGxvY2FscCwgc2ltcGxlOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgaW50IGkgPSAwOwotCi0gIGxvY2FscCA9IGZhbHNlOwotICBpbmR4ID0gKHVuc2lnbmVkIGludCkgLTE7Ci0gIGZvciAoZSA9IGluZm8tPmVudW1zOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICh0YWcgPT0gTlVMTCkKLQl7Ci0JICBpZiAoZS0+dGFnICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZS0+dGFnID09IE5VTEwKLQkgICAgICB8fCB0YWdbMF0gIT0gZS0+dGFnWzBdCi0JICAgICAgfHwgc3RyY21wICh0YWcsIGUtPnRhZykgIT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoISBlLT5kZWZpbmVkKQotCXsKLQkgIC8qIFRoaXMgZW51bSB0YWcgaGFzIGJlZW4gc2VlbiBidXQgbm90IGRlZmluZWQuICAqLwotCSAgaW5keCA9IGUtPmluZHg7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChuYW1lcyAhPSBOVUxMICYmIGUtPm5hbWVzICE9IE5VTEwpCi0JewotCSAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTCAmJiBlLT5uYW1lc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAobmFtZXNbaV1bMF0gIT0gZS0+bmFtZXNbaV1bMF0KLQkJICB8fCB2YWxzW2ldICE9IGUtPnZhbHNbaV0KLQkJICB8fCBzdHJjbXAgKG5hbWVzW2ldLCBlLT5uYW1lc1tpXSkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICgobmFtZXMgPT0gTlVMTCAmJiBlLT5uYW1lcyA9PSBOVUxMKQotCSAgfHwgKG5hbWVzICE9IE5VTEwKLQkgICAgICAmJiBlLT5uYW1lcyAhPSBOVUxMCi0JICAgICAgJiYgbmFtZXNbaV0gPT0gTlVMTAotCSAgICAgICYmIGUtPm5hbWVzW2ldID09IE5VTEwpKQotCXsKLQkgIC8qIFdlJ3ZlIHNlZW4gdGhpcyBlbnVtIGJlZm9yZS4gICovCi0JICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGUtPmluZHgsIDAsIHRydWUsIGZhbHNlKTsKLQl9Ci0KLSAgICAgIGlmICh0YWcgIT0gTlVMTCkKLQl7Ci0JICAvKiBXZSd2ZSBhbHJlYWR5IHNlZW4gYW4gZW51bSBvZiB0aGUgc2FtZSBuYW1lLCBzbyB3ZSBtdXN0IG1ha2UKLQkgICAgIHN1cmUgdG8gb3V0cHV0IHRoaXMgb25lIGxvY2FsbHkuICAqLwotCSAgbG9jYWxwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHNpbXBsZSBlbnVtZXJhdGlvbiwgaW4gd2hpY2ggdGhlIHZhbHVlcyBzdGFydCBhdCAwCi0gICAgIGFuZCBhbHdheXMgaW5jcmVtZW50IGJ5IDEsIHdlIGNhbiB1c2UgdHlwZSBFLiAgT3RoZXJ3aXNlIHdlIG11c3QKLSAgICAgdXNlIHR5cGUgTi4gICovCi0KLSAgc2ltcGxlID0gdHJ1ZTsKLSAgaWYgKG5hbWVzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmICh2YWxzW2ldICE9IGkpCi0JICAgIHsKLQkgICAgICBzaW1wbGUgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgdGFnLCBpbmR4LCAwLCB0cnVlLCBsb2NhbHAsCi0JCQkJKHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikgTlVMTCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNpbXBsZSA/ICdFJyA6ICdOJykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoc2ltcGxlKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBlbnVtZXJhdGlvbiBzaXplLCBidXQgd2UKLSAgICAgICAgIGRvbid0IHN0b3JlIHRoYXQuICAqLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChuYW1lcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IG5hbWVzW2ldICE9IE5VTEw7IGkrKykKLQl7Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lc1tpXSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICghIHNpbXBsZSkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB2YWxzW2ldKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoISBsb2NhbHApCi0gICAgewotICAgICAgaWYgKGluZHggPT0gKHVuc2lnbmVkIGludCkgLTEpCi0JewotCSAgZSA9IChzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKikgeG1hbGxvYyAoc2l6ZW9mICplKTsKLQkgIG1lbXNldCAoZSwgMCwgc2l6ZW9mICplKTsKLQkgIGUtPmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0JICBlLT50YWcgPSB0YWc7Ci0KLQkgIGUtPm5leHQgPSBpbmZvLT5lbnVtczsKLQkgIGluZm8tPmVudW1zID0gZTsKLQl9Ci0KLSAgICAgIGUtPm5hbWVzID0gbmFtZXM7Ci0gICAgICBlLT52YWxzID0gdmFsczsKLSAgICAgIGUtPmRlZmluZWQgPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIHBvaW50ZXIgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3BvaW50ZXJfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptID0gTlVMTDsKLQotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEEgcG9pbnRlciB0byBhIHNpbXBsZSBidWlsdGluIHR5cGUgY2FuIGJlIG9idGFpbmVkIGJ5IGFkZGluZyAzMi4KLSAgICAgRklYTUU6IFdpbGwgdGhpcyBiZSBhIHNob3J0IHBvaW50ZXIsIGFuZCB3aWxsIHRoYXQgbWF0dGVyPyAgKi8KLSAgaWYgKGluZHggPCAzMikKLSAgICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHggKyAzMiwgMCwgdHJ1ZSwgZmFsc2UpOwotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBtID0gaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAocCwgaW5keCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IFRoZSBzaXplIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgICAgIGlmIChtLT5wb2ludGVyID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPnBvaW50ZXIsIDQsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgNCwgdHJ1ZSwgbG9jYWxwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ1AnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICBtLT5wb2ludGVyID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgZnVuY3Rpb24gdHlwZS4gIFRoaXMgd2lsbCBiZSBjYWxsZWQgZm9yIGEgbWV0aG9kLCBidXQgd2UKLSAgIGRvbid0IHdhbnQgdG8gYWN0dWFsbHkgYWRkIGl0IHRvIHRoZSB0eXBlIHRhYmxlIGluIHRoYXQgY2FzZS4gIFdlCi0gICBoYW5kbGUgdGhpcyBieSBkZWZpbmluZyB0aGUgdHlwZSBpbiBhIHByaXZhdGUgYnVmZmVyLCBhbmQgb25seQotICAgYWRkaW5nIHRoYXQgYnVmZmVyIHRvIHRoZSB0eXBlZGVmIGJsb2NrIGlmIHdlIGFyZSBnb2luZyB0byB1c2UgaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgKmFyZ3MgPSBOVUxMOwotICBpbnQgaTsKLSAgdW5zaWduZWQgaW50IHJldGluZHg7Ci0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgZm5kZWY7Ci0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm07Ci0KLSAgbG9jYWxwID0gZmFsc2U7Ci0KLSAgaWYgKGFyZ2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhcmdzID0gKHVuc2lnbmVkIGludCAqKSB4bWFsbG9jIChhcmdjb3VudCAqIHNpemVvZiAqYXJncyk7Ci0gICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCkKLQkgICAgbG9jYWxwID0gdHJ1ZTsKLQkgIGFyZ3NbaV0gPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChhcmdjb3VudCA8IDApCi0gICAgdmFyYXJncyA9IGZhbHNlOwotCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCkKLSAgICBsb2NhbHAgPSB0cnVlOwotICByZXRpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgbSA9IE5VTEw7Ci0gIGlmIChhcmdjb3VudCA8IDAgJiYgISBsb2NhbHApCi0gICAgewotICAgICAgbSA9IGllZWVfZ2V0X21vZGlmaWVkX2luZm8gKHAsIHJldGluZHgpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChtLT5mdW5jdGlvbiA+IDApCi0JcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBtLT5mdW5jdGlvbiwgMCwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLQotICAvKiBBbiBhdHRyaWJ1dGUgb2YgMHg0MSBtZWFucyB0aGF0IHRoZSBmcmFtZSBhbmQgcHVzaCBtYXNrIGFyZQotICAgICB1bmtub3duLiAgKi8KLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmZuZGVmKQotICAgICAgfHwgISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICh1bnNpZ25lZCBpbnQpIC0xLCAwLCB0cnVlLCBsb2NhbHAsCi0JCQkJICAgJmZuZGVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ3gnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMHg0MSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgcmV0aW5keCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIChiZmRfdm1hKSBhcmdjb3VudCArICh2YXJhcmdzID8gMSA6IDApKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChhcmdjb3VudCA+IDApCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyBpKyspCi0JaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGFyZ3NbaV0pKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgZnJlZSAoYXJncyk7Ci0gICAgfQotICBpZiAodmFyYXJncykKLSAgICB7Ci0gICAgICAvKiBBIHZhcmFyZ3MgZnVuY3Rpb24gaXMgcmVwcmVzZW50ZWQgYnkgd3JpdGluZyBvdXQgdGhlIGxhc3QKLSAgICAgICAgIGFyZ3VtZW50IGFzIHR5cGUgdm9pZCAqLCBhbHRob3VnaCB0aGlzIG1ha2VzIGxpdHRsZSBzZW5zZS4gICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgKGJmZF92bWEpIGJ1aWx0aW5fdm9pZCArIDMyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2Ugd3JvdGUgdGhlIGluZm9ybWF0aW9uIGludG8gZm5kZWYsIGluIGNhc2Ugd2UgZG9uJ3QgbmVlZCBpdC4KLSAgICAgSXQgd2lsbCBiZSBhcHBlbmRlZCB0byBpbmZvLT50eXBlcyBieSBpZWVlX3BvcF90eXBlLiAgKi8KLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5mbmRlZiA9IGZuZGVmOwotCi0gIGlmIChtICE9IE5VTEwpCi0gICAgbS0+ZnVuY3Rpb24gPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSByZWZlcmVuY2UgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlZmVyZW5jZV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIC8qIElFRUUgYXBwZWFycyB0byByZWNvcmQgYSBub3JtYWwgcG9pbnRlciB0eXBlLCBhbmQgdGhlbiB1c2UgYQotICAgICBwbWlzYyByZWNvcmQgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyByZWFsbHkgYSByZWZlcmVuY2UuICAqLwotCi0gIGlmICghIGllZWVfcG9pbnRlcl90eXBlIChwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcCA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgcmFuZ2UgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JhbmdlX3R5cGUgKHAsIGxvdywgaGlnaCkKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvdzsKLSAgICAgYmZkX3NpZ25lZF92bWEgaGlnaDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgYm9vbGVhbiB1bnNpZ25lZHAsIGxvY2FscDsKLQotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICB1bnNpZ25lZHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnVuc2lnbmVkcDsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLSAgcmV0dXJuIChpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnUicpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgKGJmZF92bWEpIGxvdykKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgaGlnaCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB1bnNpZ25lZHAgPyAwIDogMSkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBzaXplKSk7Ci19Ci0KLS8qIE1ha2UgYW4gYXJyYXkgdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWllZWVfYXJyYXlfdHlwZSAocCwgbG93LCBoaWdoLCBzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93OwotICAgICBiZmRfc2lnbmVkX3ZtYSBoaWdoOwotICAgICBib29sZWFuIHN0cmluZ3AgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgZWxlaW5keDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptID0gTlVMTDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZSAqYTsKLQotICAvKiBJRUVFIGRvZXMgbm90IHN0b3JlIHRoZSByYW5nZSwgc28gd2UganVzdCBpZ25vcmUgaXQuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICBlbGVpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogSWYgd2UgZG9uJ3Qga25vdyB0aGUgcmFuZ2UsIHRyZWF0IHRoZSBzaXplIGFzIGV4YWN0bHkgb25lCi0gICAgIGVsZW1lbnQuICAqLwotICBpZiAobG93IDwgaGlnaCkKLSAgICBzaXplICo9IChoaWdoIC0gbG93KSArIDE7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBlbGVpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IgKGEgPSBtLT5hcnJheXM7IGEgIT0gTlVMTDsgYSA9IGEtPm5leHQpCi0JewotCSAgaWYgKGEtPmxvdyA9PSBsb3cgJiYgYS0+aGlnaCA9PSBoaWdoKQotCSAgICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGEtPmluZHgsIHNpemUsIGZhbHNlLCBmYWxzZSk7Ci0JfQotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCBmYWxzZSwgbG9jYWxwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93ID09IDAgPyAnWicgOiAnQycpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBlbGVpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChsb3cgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBoaWdoICsgMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBhID0gKHN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICphKTsKLSAgICAgIG1lbXNldCAoYSwgMCwgc2l6ZW9mICphKTsKLQotICAgICAgYS0+aW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLSAgICAgIGEtPmxvdyA9IGxvdzsKLSAgICAgIGEtPmhpZ2ggPSBoaWdoOwotCi0gICAgICBhLT5uZXh0ID0gbS0+YXJyYXlzOwotICAgICAgbS0+YXJyYXlzID0gYTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBlbGVpbmR4OwotCi0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBlbGVpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogRklYTUU6IFdlIGRvbid0IGtub3cgdGhlIHNpemUsIHNvIHdlIGp1c3QgdXNlIDQuICAqLwotCi0gIHJldHVybiAoaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgMCwgdHJ1ZSwgbG9jYWxwKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdzJykKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA0KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGVsZWluZHgpKTsKLX0KLQotLyogTWFrZSBhbiBvZmZzZXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX29mZnNldF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgdGFyZ2V0aW5keCwgYmFzZWluZHg7Ci0KLSAgdGFyZ2V0aW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotICBiYXNlaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEZJWE1FOiBUaGUgTVJJIEMrKyBjb21waWxlciBkb2VzIG5vdCBhcHBlYXIgdG8gZ2VuZXJhdGUgYW55Ci0gICAgIHVzZWZ1bCB0eXBlIGluZm9ybWF0aW9uIGFib3V0IGFuIG9mZnNldCB0eXBlLiAgSXQganVzdCByZWNvcmRzIGEKLSAgICAgcG9pbnRlciB0byBtZW1iZXIgYXMgYW4gaW50ZWdlci4gIFRoZSBNUkkvSFAgSUVFRSBzcGVjIGRvZXMKLSAgICAgZGVzY3JpYmUgYSBwbWlzYyByZWNvcmQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGEgcG9pbnRlciB0bwotICAgICBtZW1iZXIuICBVbmZvcnR1bmF0ZWx5LCBpdCBkb2VzIG5vdCBkZXNjcmliZSB0aGUgdGFyZ2V0IHR5cGUsCi0gICAgIHdoaWNoIHNlZW1zIHByZXR0eSBpbXBvcnRhbnQuICBJJ20gZ29pbmcgdG8gcHVudCB0aGlzIGZvciBub3cuICAqLwotCi0gIHJldHVybiBpZWVlX2ludF90eXBlIChwLCA0LCB0cnVlKTsKLX0gIAotCi0vKiBNYWtlIGEgbWV0aG9kIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9tZXRob2RfdHlwZSAocCwgZG9tYWluLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGJvb2xlYW4gZG9tYWluOwotICAgICBpbnQgYXJnY291bnQ7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIC8qIEZJWE1FOiBUaGUgTVJJL0hQIElFRUUgc3BlYyBkZWZpbmVzIGEgcG1pc2MgcmVjb3JkIHRvIHVzZSBmb3IgYQotICAgICBtZXRob2QsIGJ1dCB0aGUgZGVmaW5pdGlvbiBpcyBpbmNvbXBsZXRlLiAgV2UganVzdCBvdXRwdXQgYW4gJ3gnCi0gICAgIHR5cGUuICAqLwotCi0gIGlmIChkb21haW4pCi0gICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotCi0gIHJldHVybiBpZWVlX2Z1bmN0aW9uX3R5cGUgKHAsIGFyZ2NvdW50LCB2YXJhcmdzKTsKLX0KLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY29uc3RfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGJvb2xlYW4gdW5zaWduZWRwLCBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptID0gTlVMTDsKLQotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICB1bnNpZ25lZHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnVuc2lnbmVkcDsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoISBsb2NhbHApCi0gICAgewotICAgICAgbSA9IGllZWVfZ2V0X21vZGlmaWVkX2luZm8gKGluZm8sIGluZHgpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChtLT5jb25zdF9xdWFsaWZpZWQgPiAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+Y29uc3RfcXVhbGlmaWVkLCBzaXplLCB1bnNpZ25lZHAsCi0JCQkgICAgICAgZmFsc2UpOwotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICduJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDEpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIG0tPmNvbnN0X3F1YWxpZmllZCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdm9sYXRpbGVfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGJvb2xlYW4gdW5zaWduZWRwLCBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptID0gTlVMTDsKLQotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICB1bnNpZ25lZHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnVuc2lnbmVkcDsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoISBsb2NhbHApCi0gICAgewotICAgICAgbSA9IGllZWVfZ2V0X21vZGlmaWVkX2luZm8gKGluZm8sIGluZHgpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChtLT52b2xhdGlsZV9xdWFsaWZpZWQgPiAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+dm9sYXRpbGVfcXVhbGlmaWVkLCBzaXplLCB1bnNpZ25lZHAsCi0JCQkgICAgICAgZmFsc2UpOwotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICduJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDIpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIG0tPnZvbGF0aWxlX3F1YWxpZmllZCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29udmVydCBhbiBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgaW50byBhIENYWEZMQUdTIHZhbHVlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotaWVlZV92aXNfdG9fZmxhZ3MgKHZpc2liaWxpdHkpCi0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgcmV0dXJuIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFVCTElDOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgcmV0dXJuIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJJVkFURTsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgcmV0dXJuIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogU3RhcnQgZGVmaW5pbmcgYSBzdHJ1Y3QgdHlwZS4gIFdlIGJ1aWxkIGl0IGluIHRoZSBzdHJkZWYgZmllbGQgb24KLSAgIHRoZSBzdGFjaywgdG8gYXZvaWQgY29uZnVzaW5nIHR5cGUgZGVmaW5pdGlvbnMgcmVxdWlyZWQgYnkgdGhlCi0gICBmaWVsZHMgd2l0aCB0aGUgc3RydWN0IHR5cGUgaXRzZWxmLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfc3RydWN0X3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGxvY2FscCwgaWdub3JlcDsKLSAgYm9vbGVhbiBjb3B5OwotICBjaGFyIGFiWzIwXTsKLSAgY29uc3QgY2hhciAqbG9vazsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQsICpudGxvb2s7Ci0gIHN0cnVjdCBpZWVlX2J1Zmxpc3Qgc3RyZGVmOwotCi0gIGxvY2FscCA9IGZhbHNlOwotICBpZ25vcmVwID0gZmFsc2U7Ci0KLSAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSB0YWcgZm9yIGludGVybmFsIHVzZSBldmVuIGlmIHdlIGRvbid0IHdhbnQKLSAgICAgb25lIGZvciBleHRlcm5hbCB1c2UuICBUaGlzIHdpbGwgbGV0IHVzIHJlZmVyIHRvIGFuIGFub255bW91cwotICAgICBzdHJ1Y3QuICAqLwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgewotICAgICAgbG9vayA9IHRhZzsKLSAgICAgIGNvcHkgPSBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcHJpbnRmIChhYiwgIl9fYW5vbiV1IiwgaWQpOwotICAgICAgbG9vayA9IGFiOwotICAgICAgY29weSA9IHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFscmVhZHkgaGF2ZSByZWZlcmVuY2VzIHRvIHRoZSB0YWcsIHdlIG11c3QgdXNlIHRoZQotICAgICBleGlzdGluZyB0eXBlIGluZGV4LiAgKi8KLSAgaCA9IGllZWVfbmFtZV90eXBlX2hhc2hfbG9va3VwICgmaW5mby0+dGFncywgbG9vaywgdHJ1ZSwgY29weSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG50ID0gTlVMTDsKLSAgZm9yIChudGxvb2sgPSBoLT50eXBlczsgbnRsb29rICE9IE5VTEw7IG50bG9vayA9IG50bG9vay0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobnRsb29rLT5pZCA9PSBpZCkKLQludCA9IG50bG9vazsKLSAgICAgIGVsc2UgaWYgKCEgbnRsb29rLT50eXBlLmxvY2FscCkKLQl7Ci0JICAvKiBXZSBhcmUgY3JlYXRpbmcgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiBhIGdsb2JhbGx5Ci0JICAgICBkZWZpbmVkIHRhZy4gIEZvcmNlIGl0IHRvIGJlIGxvY2FsIHRvIGF2b2lkCi0JICAgICBjb25mdXNpb24uICAqLwotCSAgbG9jYWxwID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGlmIChudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzc2VydCAobG9jYWxwID09IG50LT50eXBlLmxvY2FscCk7Ci0gICAgICBpZiAobnQtPmtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMICYmICEgbG9jYWxwKQotCXsKLQkgIC8qIFdlJ3ZlIGFscmVhZHkgc2VlbiBhIGdsb2JhbCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlLgotICAgICAgICAgICAgIElnbm9yZSB0aGlzIG5ldyBkZWZpbml0aW9uLiAgKi8KLQkgIGlnbm9yZXAgPSB0cnVlOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBudCA9IChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpudCk7Ci0gICAgICBtZW1zZXQgKG50LCAwLCBzaXplb2YgKm50KTsKLSAgICAgIG50LT5pZCA9IGlkOwotICAgICAgbnQtPnR5cGUubmFtZSA9IGgtPnJvb3Quc3RyaW5nOwotICAgICAgbnQtPm5leHQgPSBoLT50eXBlczsKLSAgICAgIGgtPnR5cGVzID0gbnQ7Ci0gICAgICBudC0+dHlwZS5pbmR4ID0gaW5mby0+dHlwZV9pbmR4OwotICAgICAgKytpbmZvLT50eXBlX2luZHg7Ci0gICAgfQotCi0gIG50LT5raW5kID0gREVCVUdfS0lORF9JTExFR0FMOwotCi0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZzdHJkZWYpCi0gICAgICB8fCAhIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIHRhZywgbnQtPnR5cGUuaW5keCwgc2l6ZSwgdHJ1ZSwKLQkJCQkgICBsb2NhbHAsICZzdHJkZWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBzdHJ1Y3RwID8gJ1MnIDogJ1UnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGlnbm9yZXApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqaG9sZDsKLQotICAgICAgLyogV2UgbmV2ZXIgd2FudCBudC0+dHlwZS5uYW1lIHRvIGJlIE5VTEwuICBXZSB3YW50IHRoZSByZXN0IG9mCi0JIHRoZSB0eXBlIHRvIGJlIHRoZSBvYmplY3Qgc2V0IHVwIG9uIHRoZSB0eXBlIHN0YWNrOyBpdCB3aWxsCi0JIGhhdmUgYSBOVUxMIG5hbWUgaWYgdGFnIGlzIE5VTEwuICAqLwotICAgICAgaG9sZCA9IG50LT50eXBlLm5hbWU7Ci0gICAgICBudC0+dHlwZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGU7Ci0gICAgICBudC0+dHlwZS5uYW1lID0gaG9sZDsKLSAgICB9Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lID0gdGFnOwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZiA9IHN0cmRlZjsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pZ25vcmVwID0gaWdub3JlcDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgZmllbGQgdG8gYSBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdHJ1Y3RfZmllbGQgKHAsIG5hbWUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBiZmRfdm1hIGJpdHNpemU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcDsKLSAgYm9vbGVhbiByZWZlcmVuY2VwOwotICBib29sZWFuIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIGJmZF92bWEgb2Zmc2V0OwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT5uZXh0ICE9IE5VTEwKLQkgICYmICEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZV9zdGFjay0+bmV4dC0+dHlwZS5zdHJkZWYpKTsKLQotICAvKiBJZiB3ZSBhcmUgaWdub3JpbmcgdGhpcyBzdHJ1Y3QgZGVmaW5pdGlvbiwganVzdCBwb3AgYW5kIGlnbm9yZQotICAgICB0aGUgdHlwZS4gICovCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT5uZXh0LT50eXBlLmlnbm9yZXApCi0gICAgewotICAgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7Ci0gIHVuc2lnbmVkcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUudW5zaWduZWRwOwotICByZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOwotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIGlmIChsb2NhbHApCi0gICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHAgPSB0cnVlOwotCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGZsYWdzOwotICAgICAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gICAgICAvKiBUaGlzIGlzIGEgY2xhc3MuICBXZSBtdXN0IGFkZCBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmllbGQgdG8KLSAgICAgICAgIHRoZSBjbGFzcyByZWNvcmRzIHdlIGFyZSBidWlsZGluZy4gICovCi0KLSAgICAgIGZsYWdzID0gaWVlZV92aXNfdG9fZmxhZ3MgKHZpc2liaWxpdHkpOwotICAgICAgbmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5pbmR4OwotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLAotCQkJCSZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnZCcpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZmxhZ3MpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKQotCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudCArPSA0OwotCi0gICAgICBpZiAocmVmZXJlbmNlcCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLQkgIC8qIFdlIG5lZWQgdG8gb3V0cHV0IGEgcmVjb3JkIHJlY29yZGluZyB0aGF0IHRoaXMgZmllbGQgaXMKLSAgICAgICAgICAgICByZWFsbHkgb2YgcmVmZXJlbmNlIHR5cGUuICBXZSBwdXQgdGhpcyBvbiB0aGUgcmVmcyBmaWVsZAotICAgICAgICAgICAgIG9mIGNsYXNzZGVmLCBzbyB0aGF0IGl0IGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgQysrCi0gICAgICAgICAgICAgcmVjb3JkcyBhZnRlciB0aGUgY2xhc3MgaXMgZGVmaW5lZC4gICovCi0KLQkgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotCSAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywKLQkJCQkgICAgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnJlZnMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4MCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA0KQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnUicpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGUgYml0c2l6ZSBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCBzaXplLCB3ZSBuZWVkIHRvIG91dHB1dAotICAgICBhIGJpdGZpZWxkIHR5cGUuICAqLwotICBpZiAoc2l6ZSA9PSAwIHx8IGJpdHNpemUgPT0gMCB8fCBiaXRzaXplID09IHNpemUgKiA4KQotICAgIG9mZnNldCA9IGJpdHBvcyAvIDg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCAwLCB1bnNpZ25lZHAsCi0JCQkgICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdnJykKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHVuc2lnbmVkcCA/IDAgOiAxKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYml0c2l6ZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLSAgICAgIG9mZnNldCA9IGJpdHBvczsKLSAgICB9Ci0KLSAgLyogU3dpdGNoIHRvIHRoZSBzdHJ1Y3Qgd2UgYXJlIGJ1aWxkaW5nIGluIG9yZGVyIHRvIG91dHB1dCB0aGlzCi0gICAgIGZpZWxkIGRlZmluaXRpb24uICAqLwotICByZXR1cm4gKGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmKQotCSAgJiYgaWVlZV93cml0ZV9pZCAoaW5mbywgbmFtZSkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG9mZnNldCkpOwotfQotCi0vKiBGaW5pc2ggdXAgYSBzdHJ1Y3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VuZF9zdHJ1Y3RfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IGllZWVfYnVmbGlzdCAqcGI7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmICEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpKTsKLQotICAvKiBJZiB3ZSB3ZXJlIGlnbm9yaW5nIHRoaXMgc3RydWN0IGRlZmluaXRpb24gYmVjYXVzZSBpdCB3YXMgYQotICAgICBkdXBsaWNhdGUgZGVmaW50aW9uLCBqdXN0IHRocm91Z2ggYXdheSB3aGF0ZXZlciBieXRlcyB3ZSBoYXZlCi0gICAgIGFjY3VtdWxhdGVkLiAgTGVhdmUgdGhlIHR5cGUgb24gdGhlIHN0YWNrLiAqLwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pZ25vcmVwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgbm90IGEgZHVwbGljYXRlIGRlZmluaXRpb24gb2YgdGhpcyB0YWcsIHRoZW4gbG9jYWxwCi0gICAgIHdpbGwgYmUgZmFsc2UsIGFuZCB3ZSBjYW4gcHV0IGl0IGluIHRoZSBnbG9iYWwgdHlwZSBibG9jay4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhdm9pZCBvdXRwdXR0aW5nIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyB3aGljaCBhcmUKLSAgICAgdGhlIHNhbWUuICAqLwotICBpZiAoISBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBzdGFydGVkIHRoZSBnbG9iYWwgdHlwZSBibG9jay4gICovCi0gICAgICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDIpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHBiID0gJmluZm8tPmdsb2JhbF90eXBlczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBzdGFydGVkIHRoZSB0eXBlcyBibG9jay4gICovCi0gICAgICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5tb2RuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHBiID0gJmluZm8tPnR5cGVzOwotICAgIH0KLQotICAvKiBBcHBlbmQgdGhlIHN0cnVjdCBkZWZpbml0aW9uIHRvIHRoZSB0eXBlcy4gICovCi0gIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgcGIsICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTGVhdmUgdGhlIHN0cnVjdCBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgY2xhc3MgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0YXJ0X2NsYXNzX3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUsIHZwdHIsIG93bnZwdHIpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB2cHRyOwotICAgICBib29sZWFuIG93bnZwdHI7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgY29uc3QgY2hhciAqdmNsYXNzOwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHBtaXNjYnVmOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgc3RydWN0IGllZWVfdHlwZV9jbGFzcyAqY2xhc3NkZWY7Ci0KLSAgLyogQSBDKysgY2xhc3MgaXMgb3V0cHV0IGFzIGEgQysrIHN0cnVjdCBhbG9uZyB3aXRoIGEgc2V0IG9mIHBtaXNjCi0gICAgIHJlY29yZHMgZGVzY3JpYmluZyB0aGUgY2xhc3MuICAqLwotCi0gIC8qIFdlIG5lZWQgdG8gaGF2ZSBhIG5hbWUgc28gdGhhdCB3ZSBjYW4gYXNzb2NpYXRlIHRoZSBzdHJ1Y3QgYW5kCi0gICAgIHRoZSBjbGFzcy4gICovCi0gIGlmICh0YWcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICp0OwotCi0gICAgICB0ID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOwotICAgICAgc3ByaW50ZiAodCwgIl9fYW5vbiV1IiwgaWQpOwotICAgICAgdGFnID0gdDsKLSAgICB9Ci0KLSAgLyogV2UgY2FuJ3Qgd3JpdGUgb3V0IHRoZSB2aXJ0dWFsIHRhYmxlIGluZm9ybWF0aW9uIHVudGlsIHdlIGhhdmUKLSAgICAgZmluaXNoZWQgdGhlIGNsYXNzLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIHZpcnR1YWwgdGFibGUgc2l6ZS4KLSAgICAgV2UgZ2V0IHRoZSBzaXplIGZyb20gdGhlIGxhcmdlc3Qgdm9mZnNldCB3ZSBzZWUuICAqLwotICB2Y2xhc3MgPSBOVUxMOwotICBpZiAodnB0ciAmJiAhIG93bnZwdHIpCi0gICAgewotICAgICAgdmNsYXNzID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lOwotICAgICAgYXNzZXJ0ICh2Y2xhc3MgIT0gTlVMTCk7Ci0gICAgICAvKiBXZSBkb24ndCBjYWxsIGllZWVfcG9wX3VudXNlZF90eXBlLCBzaW5jZSB0aGUgY2xhc3Mgc2hvdWxkCi0gICAgICAgICBnZXQgZGVmaW5lZC4gICovCi0gICAgICAodm9pZCkgaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gICAgfQotCi0gIGlmICghIGllZWVfc3RhcnRfc3RydWN0X3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICArK2luZm8tPm5hbWVfaW5keDsKLQotICAvKiBXZSB3cml0ZSBvdXQgcG1pc2MgcmVjb3JkcyBpbnRvIHRoZSBjbGFzc2RlZiBmaWVsZC4gIFdlIHdpbGwKLSAgICAgd3JpdGUgb3V0IHRoZSBwbWlzYyBzdGFydCBhZnRlciB3ZSBrbm93IHRoZSBudW1iZXIgb2YgcmVjb3JkcyB3ZQotICAgICBuZWVkLiAgKi8KLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJnBtaXNjYnVmKQotICAgICAgfHwgISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZwbWlzY2J1ZikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIGluZHgsICdUJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIGluZHgsIHN0cnVjdHAgPyAnbycgOiAndScpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIGluZHgsIHRhZykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNsYXNzZGVmID0gKHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MgKikgeG1hbGxvYyAoc2l6ZW9mICpjbGFzc2RlZik7Ci0gIG1lbXNldCAoY2xhc3NkZWYsIDAsIHNpemVvZiAqY2xhc3NkZWYpOwotCi0gIGNsYXNzZGVmLT5pbmR4ID0gaW5keDsKLSAgY2xhc3NkZWYtPnBtaXNjYnVmID0gcG1pc2NidWY7Ci0gIGNsYXNzZGVmLT5wbWlzY2NvdW50ID0gMzsKLSAgY2xhc3NkZWYtPnZjbGFzcyA9IHZjbGFzczsKLSAgY2xhc3NkZWYtPm93bnZwdHIgPSBvd252cHRyOwotCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgPSBjbGFzc2RlZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgc3RhdGljIG1lbWJlciB0byBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3Nfc3RhdGljX21lbWJlciAocCwgbmFtZSwgcGh5c25hbWUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGZsYWdzOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgdHlwZS4gIEhvcGVmdWxseSB0aGVyZSB3aWxsIGJlIGEgY2FsbCB0bwotICAgICBpZWVlX3ZhcmlhYmxlIGRlY2xhcmluZyB0aGUgcGh5c2ljYWwgbmFtZSBhbmQgdGhlIHR5cGUsIHNpbmNlCi0gICAgIHRoYXQgaXMgd2hlcmUgYW4gSUVFRSBjb25zdW1lciBtdXN0IGdldCB0aGUgdHlwZS4gICovCi0gIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMKTsKLQotICBmbGFncyA9IGllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KTsKLSAgZmxhZ3MgfD0gQ1hYRkxBR1NfU1RBVElDOwotCi0gIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKLQotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnZCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZmxhZ3MpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgcGh5c25hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudCArPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBiYXNlIGNsYXNzIHRvIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jbGFzc19iYXNlY2xhc3MgKHAsIGJpdHBvcywgdmlydHVhbCwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBib29sZWFuIHZpcnR1YWw7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGNvbnN0IGNoYXIgKmJuYW1lOwotICBib29sZWFuIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IGJpbmR4OwotICBjaGFyICpmbmFtZTsKLSAgdW5zaWduZWQgaW50IGZsYWdzOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT5uZXh0ICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPm5leHQtPnR5cGUuY2xhc3NkZWYgIT0gTlVMTAotCSAgJiYgISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlX3N0YWNrLT5uZXh0LT50eXBlLnN0cmRlZikpOwotCi0gIGJuYW1lID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lOwotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgYmluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBXZSBhcmUgY3VycmVudGx5IGRlZmluaW5nIGJvdGggYSBzdHJ1Y3QgYW5kIGEgY2xhc3MuICBXZSBtdXN0Ci0gICAgIHdyaXRlIG91dCBhIGZpZWxkIGRlZmluaXRpb24gaW4gdGhlIHN0cnVjdCB3aGljaCBob2xkcyB0aGUgYmFzZQotICAgICBjbGFzcy4gIFRoZSBzdGFicyBkZWJ1Z2dpbmcgcmVhZGVyIHdpbGwgY3JlYXRlIGEgZmllbGQgbmFtZWQKLSAgICAgX3ZiJENMQVNTIGZvciBhIHZpcnR1YWwgYmFzZSBjbGFzcywgc28gd2UganVzdCB1c2UgdGhhdC4gIEZJWE1FOgotICAgICB3ZSBzaG91bGQgbm90IGRlcGVuZCB1cG9uIGEgZGV0YWlsIG9mIHN0YWJzIGRlYnVnZ2luZy4gICovCi0gIGlmICh2aXJ0dWFsKQotICAgIHsKLSAgICAgIGZuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChibmFtZSkgKyBzaXplb2YgIl92YiQiKTsKLSAgICAgIHNwcmludGYgKGZuYW1lLCAiX3ZiJCVzIiwgYm5hbWUpOwotICAgICAgZmxhZ3MgPSBCQVNFRkxBR1NfVklSVFVBTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobG9jYWxwKQotCWluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwID0gdHJ1ZTsKLQotICAgICAgZm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGJuYW1lKSArIHNpemVvZiAiX2IkIik7Ci0gICAgICBzcHJpbnRmIChmbmFtZSwgIl9iJCVzIiwgYm5hbWUpOwotCi0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgZm5hbWUpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBiaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGJpdHBvcyAvIDgpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZsYWdzID0gMDsKLSAgICB9Ci0KLSAgaWYgKHZpc2liaWxpdHkgPT0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFKQotICAgIGZsYWdzIHw9IEJBU0VGTEFHU19QUklWQVRFOwotCi0gIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKLQotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnYicpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZmxhZ3MpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBibmFtZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgZm5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudCArPSA1OwotCi0gIGZyZWUgKGZuYW1lKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYnVpbGRpbmcgYSBtZXRob2QgZm9yIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jbGFzc19zdGFydF9tZXRob2QgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+bWV0aG9kID09IE5VTEwpOwotCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCA9IG5hbWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhIG5ldyBtZXRob2QgdmFyaWFudCwgZWl0aGVyIHN0YXRpYyBvciBub3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgc3RhdGljcCwgY29uc3RwLAotCQkgICAgICAgdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBzdGF0aWNwOwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgYm9vbGVhbiBjb250ZXh0OwotewotICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0gIHVuc2lnbmVkIGludCBuaW5keDsKLSAgYm9vbGVhbiB2aXJ0dWFsOwotCi0gIC8qIFdlIGRvbid0IG5lZWQgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZC4gIEFuIElFRUUgY29uc3VtZXIgd2hpY2gKLSAgICAgd2FudHMgdGhlIHR5cGUgbXVzdCB0cmFjayBkb3duIHRoZSBmdW5jdGlvbiBieSB0aGUgcGh5c2ljYWwgbmFtZQotICAgICBhbmQgZ2V0IHRoZSB0eXBlIGZyb20gdGhhdC4gICovCi0gIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLQotICAvKiBXZSBkb24ndCB1c2UgdGhlIGNvbnRleHQuICBGSVhNRTogV2UgcHJvYmFibHkgb3VnaHQgdG8gdXNlIGl0IHRvCi0gICAgIGFkanVzdCB0aGUgdm9mZnNldCBzb21laG93LCBidXQgSSBkb24ndCByZWFsbHkga25vdyBob3cuICAqLwotICBpZiAoY29udGV4dCkKLSAgICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+bWV0aG9kICE9IE5VTEwpOwotCi0gIGZsYWdzID0gaWVlZV92aXNfdG9fZmxhZ3MgKHZpc2liaWxpdHkpOwotCi0gIC8qIEZJWE1FOiBXZSBuZXZlciBzZXQgQ1hYRkxBR1NfT1ZFUlJJREUsIENYWEZMQUdTX09QRVJBVE9SLAotICAgICBDWFhGTEFHU19DVE9SRFRPUiwgQ1hYRkxBR1NfQ1RPUiwgb3IgQ1hYRkxBR1NfSU5MSU5FLiAgKi8KLQotICBpZiAoc3RhdGljcCkKLSAgICBmbGFncyB8PSBDWFhGTEFHU19TVEFUSUM7Ci0gIGlmIChjb25zdHApCi0gICAgZmxhZ3MgfD0gQ1hYRkxBR1NfQ09OU1Q7Ci0gIGlmICh2b2xhdGlsZXApCi0gICAgZmxhZ3MgfD0gQ1hYRkxBR1NfVk9MQVRJTEU7Ci0KLSAgbmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5pbmR4OwotCi0gIHZpcnR1YWwgPSBjb250ZXh0IHx8IHZvZmZzZXQgPiAwOwotCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywKLQkJCSAgICAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgdmlydHVhbCA/ICd2JyA6ICdtJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCBmbGFncykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsCi0JCQkgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIHBoeXNuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZpcnR1YWwpCi0gICAgewotICAgICAgaWYgKHZvZmZzZXQgPiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52b2Zmc2V0KQotCWluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnZvZmZzZXQgPSB2b2Zmc2V0OwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCB2b2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICArK2luZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQ7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVmaW5lIGEgbmV3IG1ldGhvZCB2YXJpYW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3NfbWV0aG9kX3ZhcmlhbnQgKHAsIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBjb25zdHAsIHZvbGF0aWxlcCwKLQkJCSAgIHZvZmZzZXQsIGNvbnRleHQpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLSAgICAgYmZkX3ZtYSB2b2Zmc2V0OwotICAgICBib29sZWFuIGNvbnRleHQ7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgZmFsc2UsIGNvbnN0cCwKLQkJCQl2b2xhdGlsZXAsIHZvZmZzZXQsIGNvbnRleHQpOwotfQotCi0vKiBEZWZpbmUgYSBuZXcgc3RhdGljIG1ldGhvZCB2YXJpYW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXApCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBpZWVlX2NsYXNzX21ldGhvZF92YXIgKGluZm8sIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCB0cnVlLCBjb25zdHAsCi0JCQkJdm9sYXRpbGVwLCAwLCBmYWxzZSk7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX2VuZF9tZXRob2QgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+bWV0aG9kICE9IE5VTEwpOwotCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW5kX2NsYXNzX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBuaW5keDsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMKTsKLQotICAvKiBJZiB3ZSB3ZXJlIGlnbm9yaW5nIHRoaXMgY2xhc3MgZGVmaW5pdGlvbiBiZWNhdXNlIGl0IHdhcyBhCi0gICAgIGR1cGxpY2F0ZSBkZWZpbml0aW9uLCBqdXN0IHRocm91Z2ggYXdheSB3aGF0ZXZlciBieXRlcyB3ZSBoYXZlCi0gICAgIGFjY3VtdWxhdGVkLiAgTGVhdmUgdGhlIHR5cGUgb24gdGhlIHN0YWNrLiAgKi8KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaWdub3JlcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhIHZpcnR1YWwgdGFibGUsIHdlIGNhbiB3cml0ZSBvdXQgdGhlIGluZm9ybWF0aW9uIG5vdy4gICovCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52Y2xhc3MgIT0gTlVMTAotICAgICAgfHwgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+b3dudnB0cikKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sCi0JCQkJJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICd6JykKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsICIiKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsCi0JCQkgICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dm9mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm93bnZwdHIpCi0JewotCSAgaWYgKCEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwKLQkJCQkgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnZjbGFzcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNTsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgbnVtYmVyIG9mIHBtaXNjIHJlY29yZHMsIHdlIGNhbiB3cml0ZSBvdXQKLSAgICAgdGhlIGF0bjYyIHdoaWNoIHN0YXJ0cyB0aGUgcG1pc2MgcmVjb3JkcywgYW5kIGFwcGVuZCB0aGVtIHRvIHRoZQotICAgICBDKysgYnVmZmVycy4gICovCi0KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywKLQkJCSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgsCi0JCQkgICAgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnJlZnMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCwKLQkJCQkmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cmVmcykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gaWVlZV9lbmRfc3RydWN0X3R5cGUgKHApOwotfQotCi0vKiBQdXNoIGEgcHJldmlvdXNseSBzZWVuIHR5cGVkZWYgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3R5cGVkZWZfdHlwZSAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQ7Ci0KLSAgaCA9IGllZWVfbmFtZV90eXBlX2hhc2hfbG9va3VwICgmaW5mby0+dHlwZWRlZnMsIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgLyogaCBzaG91bGQgbmV2ZXIgYmUgTlVMTCwgc2luY2UgdGhhdCB3b3VsZCBpbXBseSB0aGF0IHRoZSBnZW5lcmljCi0gICAgIGRlYnVnZ2luZyBjb2RlIGhhcyBhc2tlZCBmb3IgYSB0eXBlZGVmIHdoaWNoIGl0IGhhcyBub3QgeWV0Ci0gICAgIGRlZmluZWQuICAqLwotICBhc3NlcnQgKGggIT0gTlVMTCk7Ci0KLSAgLyogV2UgYWx3YXlzIHVzZSB0aGUgbW9zdCByZWNlbnRseSBkZWZpbmVkIHR5cGUgZm9yIHRoaXMgbmFtZSwgd2hpY2gKLSAgICAgd2lsbCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBsaXN0LiAgKi8KLQotICBudCA9IGgtPnR5cGVzOwotICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbnQtPnR5cGUuaW5keCwgbnQtPnR5cGUuc2l6ZSwKLQkJCW50LT50eXBlLnVuc2lnbmVkcCwgbnQtPnR5cGUubG9jYWxwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ29weSBvdmVyIGFueSBvdGhlciB0eXBlIGluZm9ybWF0aW9uIHdlIG1heSBoYXZlLiAgKi8KLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZSA9IG50LT50eXBlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGEgdGFnZ2VkIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3RhZ190eXBlIChwLCBuYW1lLCBpZCwga2luZCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGxvY2FscDsKLSAgYm9vbGVhbiBjb3B5OwotICBjaGFyIGFiWzIwXTsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQ7Ci0KLSAgaWYgKGtpbmQgPT0gREVCVUdfS0lORF9FTlVNKQotICAgIHsKLSAgICAgIHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqZTsKLQotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlhYm9ydCAoKTsKLSAgICAgIGZvciAoZSA9IGluZm8tPmVudW1zOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotCWlmIChlLT50YWcgIT0gTlVMTCAmJiBzdHJjbXAgKGUtPnRhZywgbmFtZSkgPT0gMCkKLQkgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgZS0+aW5keCwgMCwgdHJ1ZSwgZmFsc2UpOwotCi0gICAgICBlID0gKHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqKSB4bWFsbG9jIChzaXplb2YgKmUpOwotICAgICAgbWVtc2V0IChlLCAwLCBzaXplb2YgKmUpOwotCi0gICAgICBlLT5pbmR4ID0gaW5mby0+dHlwZV9pbmR4OwotICAgICAgKytpbmZvLT50eXBlX2luZHg7Ci0gICAgICBlLT50YWcgPSBuYW1lOwotICAgICAgZS0+ZGVmaW5lZCA9IGZhbHNlOwotCi0gICAgICBlLT5uZXh0ID0gaW5mby0+ZW51bXM7Ci0gICAgICBpbmZvLT5lbnVtcyA9IGU7Ci0KLSAgICAgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgZS0+aW5keCwgMCwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLQotICBsb2NhbHAgPSBmYWxzZTsKLQotICBjb3B5ID0gZmFsc2U7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgc3ByaW50ZiAoYWIsICJfX2Fub24ldSIsIGlkKTsKLSAgICAgIG5hbWUgPSBhYjsKLSAgICAgIGNvcHkgPSB0cnVlOwotICAgIH0KLQotICBoID0gaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAgKCZpbmZvLT50YWdzLCBuYW1lLCB0cnVlLCBjb3B5KTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChudCA9IGgtPnR5cGVzOyBudCAhPSBOVUxMOyBudCA9IG50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChudC0+aWQgPT0gaWQpCi0JewotCSAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIG50LT50eXBlLmluZHgsIG50LT50eXBlLnNpemUsCi0JCQkJbnQtPnR5cGUudW5zaWduZWRwLCBudC0+dHlwZS5sb2NhbHApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBDb3B5IG92ZXIgYW55IG90aGVyIHR5cGUgaW5mb3JtYXRpb24gd2UgbWF5IGhhdmUuICAqLwotCSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZSA9IG50LT50eXBlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBpZiAoISBudC0+dHlwZS5sb2NhbHApCi0JewotCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBvZiBhIGdsb2JhbCB0eXBlLCBzbyBpdCBtdXN0IGJlCi0gICAgICAgICAgICAgbG9jYWwuICovCi0JICBsb2NhbHAgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgbnQgPSAoc3RydWN0IGllZWVfbmFtZV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbnQpOwotICBtZW1zZXQgKG50LCAwLCBzaXplb2YgKm50KTsKLQotICBudC0+aWQgPSBpZDsKLSAgbnQtPnR5cGUubmFtZSA9IGgtPnJvb3Quc3RyaW5nOwotICBudC0+dHlwZS5pbmR4ID0gaW5mby0+dHlwZV9pbmR4OwotICBudC0+dHlwZS5sb2NhbHAgPSBsb2NhbHA7Ci0gICsraW5mby0+dHlwZV9pbmR4OwotICBudC0+a2luZCA9IGtpbmQ7Ci0KLSAgbnQtPm5leHQgPSBoLT50eXBlczsKLSAgaC0+dHlwZXMgPSBudDsKLQotICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbnQtPnR5cGUuaW5keCwgMCwgZmFsc2UsIGxvY2FscCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSA9IGgtPnJvb3Quc3RyaW5nOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0eXBlZGVmLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdHlwZGVmIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV93cml0ZV90eXBlIHR5cGU7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBib29sZWFuIGZvdW5kOwotICBib29sZWFuIGxvY2FscDsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQ7Ci0KLSAgdHlwZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGU7Ci0gIGluZHggPSB0eXBlLmluZHg7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHNpbXBsZSBidWlsdGluIHR5cGUgdXNpbmcgYSBidWlsdGluIG5hbWUsIHdlIGRvbid0Ci0gICAgIHdhbnQgdG8gb3V0cHV0IHRoZSB0eXBlZGVmIGl0c2VsZi4gIFdlIGFsc28gd2FudCB0byBjaGFuZ2UgdGhlCi0gICAgIHR5cGUgaW5kZXggdG8gY29ycmVzcG9uZCB0byB0aGUgbmFtZSBiZWluZyB1c2VkLiAgV2UgcmVjb2duaXplCi0gICAgIG5hbWVzIHVzZWQgaW4gc3RhYnMgZGVidWdnaW5nIG91dHB1dCBldmVuIGlmIHRoZXkgZG9uJ3QgZXhhY3RseQotICAgICBjb3JyZXNwb25kIHRvIHRoZSBuYW1lcyB1c2VkIGZvciB0aGUgSUVFRSBidWlsdGluIHR5cGVzLiAgKi8KLSAgZm91bmQgPSBmYWxzZTsKLSAgaWYgKGluZHggPD0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9iY2RfZmxvYXQpCi0gICAgewotICAgICAgc3dpdGNoICgoZW51bSBidWlsdGluX3R5cGVzKSBpbmR4KQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdm9pZDoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJ2b2lkIikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fc2lnbmVkX2NoYXI6Ci0JY2FzZSBidWlsdGluX2NoYXI6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIGNoYXIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2lnbmVkX2NoYXI7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJjaGFyIikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX2NoYXI7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9jaGFyOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIGNoYXIiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50OgotCWNhc2UgYnVpbHRpbl9zaG9ydDoKLQljYXNlIGJ1aWx0aW5fc2hvcnRfaW50OgotCWNhc2UgYnVpbHRpbl9zaWduZWRfc2hvcnQ6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIHNob3J0IGludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic2hvcnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2hvcnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzaG9ydCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2hvcnRfaW50OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIHNob3J0IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3NpZ25lZF9zaG9ydDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0X2ludDoKLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQ6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgc2hvcnQgaW50IikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgInNob3J0IHVuc2lnbmVkIGludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl91bnNpZ25lZF9zaG9ydF9pbnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBzaG9ydCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl91bnNpZ25lZF9zaG9ydDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3NpZ25lZF9sb25nOgotCWNhc2UgYnVpbHRpbl9pbnQ6IC8qIEZJWE1FOiBTaXplIGRlcGVuZHMgdXBvbiBhcmNoaXRlY3R1cmUuICAqLwotCWNhc2UgYnVpbHRpbl9sb25nOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBsb25nIikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3NpZ25lZF9sb25nOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImxvbmciKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAobmFtZSwgImxvbmcgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX2xvbmc7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nOgotCWNhc2UgYnVpbHRpbl91bnNpZ25lZDogLyogRklYTUU6IFNpemUgZGVwZW5kcyB1cG9uIGFyY2hpdGVjdHVyZS4gICovCi0JY2FzZSBidWlsdGluX3Vuc2lnbmVkX2ludDogLyogRklYTUU6IExpa2UgYnVpbHRpbl91bnNpZ25lZC4gICovCi0JICBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgbG9uZyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIHVuc2lnbmVkIGludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl91bnNpZ25lZF9sb25nOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfaW50OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fc2lnbmVkX2xvbmdfbG9uZzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJzaWduZWQgbG9uZyBsb25nIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgImxvbmcgbG9uZyBpbnQiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nX2xvbmc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgbG9uZyBsb25nIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9mbG9hdDoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJmbG9hdCIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX2RvdWJsZToKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJkb3VibGUiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9sb25nX2RvdWJsZToKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJsb25nIGRvdWJsZSIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX2xvbmdfbG9uZ19kb3VibGU6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAibG9uZyBsb25nIGRvdWJsZSIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGZvdW5kKQotCXR5cGUuaW5keCA9IGluZHg7Ci0gICAgfQotCi0gIGggPSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCAoJmluZm8tPnR5cGVkZWZzLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgZGVmaW5lZCB0aGlzIHR5cGUgd2l0aCB0aGlzIG5hbWUuICAqLwotICBsb2NhbHAgPSB0eXBlLmxvY2FscDsKLSAgZm9yIChudCA9IGgtPnR5cGVzOyBudCAhPSBOVUxMOyBudCA9IG50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChudC0+aWQgPT0gaW5keCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgZ2xvYmFsIGRlZmluaXRpb24sIHRoZW4gd2UgZG9uJ3QgbmVlZCB0bwotCSAgICAgZG8gYW55dGhpbmcgaGVyZS4gICovCi0JICBpZiAoISBudC0+dHlwZS5sb2NhbHApCi0JICAgIHsKLQkgICAgICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uLCBzbyBtYWtlIHRoaXMgb25lIGxvY2FsLiAgKi8KLQkgIGxvY2FscCA9IHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGFkZCBhIG5ldyB0eXBlZGVmIGZvciB0aGlzIHR5cGUuICAqLwotCi0gIG50ID0gKHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm50KTsKLSAgbWVtc2V0IChudCwgMCwgc2l6ZW9mICpudCk7Ci0gIG50LT5pZCA9IGluZHg7Ci0gIG50LT50eXBlID0gdHlwZTsKLSAgbnQtPnR5cGUubmFtZSA9IG5hbWU7Ci0gIG50LT50eXBlLmxvY2FscCA9IGxvY2FscDsKLSAgbnQtPmtpbmQgPSBERUJVR19LSU5EX0lMTEVHQUw7Ci0KLSAgbnQtPm5leHQgPSBoLT50eXBlczsKLSAgaC0+dHlwZXMgPSBudDsKLQotICBpZiAoZm91bmQpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBvbmUgb2YgdGhlIGJ1aWx0aW4gdHlwZWRlZnMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLSAgICAgICAgIGFjdHVhbGx5IGRlZmluZSBpdC4gICovCi0gICAgICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIGlmICghIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIG5hbWUsICh1bnNpZ25lZCBpbnQpIC0xLCB0eXBlLnNpemUsCi0JCQkJdHlwZS51bnNpZ25lZHAsCWxvY2FscCwKLQkJCQkoc3RydWN0IGllZWVfYnVmbGlzdCAqKSBOVUxMKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ1QnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlbW92ZSB0aGUgdHlwZSB3ZSBqdXN0IGFkZGVkIHRvIHRoZSB0eXBlIHN0YWNrLiAgVGhpcyBzaG91bGQgbm90Ci0gICAgIGJlIGllZWVfcG9wX3VudXNlZF90eXBlLCBzaW5jZSB0aGUgdHlwZSBpcyB1c2VkLCB3ZSBqdXN0IGRvbid0Ci0gICAgIG5lZWQgaXQgbm93LiAgKi8KLSAgKHZvaWQpIGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0YWcgZm9yIGEgdHlwZS4gIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3RhZyAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIC8qIFRoaXMgc2hvdWxkIG5vdCBiZSBpZWVlX3BvcF91bnVzZWRfdHlwZSwgc2luY2Ugd2Ugd2FudCB0aGUgdHlwZQotICAgICB0byBiZSBkZWZpbmVkLiAgKi8KLSAgKHZvaWQpIGllZWVfcG9wX3R5cGUgKGluZm8pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGFuIGludGVnZXIgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9pbnRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIHZhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Zsb2F0X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZG91YmxlIHZhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0eXBlZCBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3R5cGVkX2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgdmFsIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRS4gICovCi0gIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdmFyaWFibGUgKHAsIG5hbWUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGJvb2xlYW4gcmVmZXJlbmNlcDsKLSAgdW5zaWduZWQgaW50IHR5cGVfaW5keDsKLSAgYm9vbGVhbiBhc247Ci0gIGludCByZWZmbGFnOwotCi0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7Ci0gIHJlZmVyZW5jZXAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXA7Ci0gIHR5cGVfaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIGFzc2VydCAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSk7Ci0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0gICsraW5mby0+bmFtZV9pbmR4OwotCi0gIC8qIFdyaXRlIG91dCBhbiBOTiBhbmQgYW4gQVROIHJlY29yZCBmb3IgdGhpcyB2YXJpYWJsZS4gICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHR5cGVfaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIERFQlVHX0dMT0JBTDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4KQotCSAgfHwgISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgZmFsc2UsIHZhbCwgdmFsICsgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVmZmxhZyA9IDA7Ci0gICAgICBhc24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19TVEFUSUM6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMykKLQkgIHx8ICEgaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGZhbHNlLCB2YWwsIHZhbCArIHNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlZmZsYWcgPSAxOwotICAgICAgYXNuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfTE9DQUxfU1RBVElDOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDMpCi0JICB8fCAhIGllZWVfYWRkX3JhbmdlIChpbmZvLCBmYWxzZSwgdmFsLCB2YWwgKyBzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMjsKLSAgICAgIGFzbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0xPQ0FMOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDEpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB2YWwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlZmZsYWcgPSAyOwotICAgICAgYXNuID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1JFR0lTVEVSOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLAotCQkJCSAgaWVlZV9nZW5yZWdfdG9fcmVnbm8gKGluZm8tPmFiZmQsIHZhbCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlZmZsYWcgPSAyOwotICAgICAgYXNuID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGFzbikKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmFtZV9pbmR4LCB2YWwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyByZWFsbHkgYSByZWZlcmVuY2UgdHlwZSwgdGhlbiB3ZSBqdXN0IG91dHB1dCBpdCB3aXRoCi0gICAgIHBvaW50ZXIgdHlwZSwgYW5kIG11c3Qgbm93IG91dHB1dCBhIEMrKyByZWNvcmQgaW5kaWNhdGluZyB0aGF0IGl0Ci0gICAgIGlzIHJlYWxseSByZWZlcmVuY2UgdHlwZS4gICovCi0gIGlmIChyZWZlcmVuY2VwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuaW5keDsKLQotICAgICAgbmluZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0gICAgICArK2luZm8tPm5hbWVfaW5keDsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIGdsb2JhbCB2YXJpYWJsZSwgd2Ugd2FudCB0byBvdXRwdXQgdGhlIG1pc2MKLSAgICAgICAgIHJlY29yZCBpbiB0aGUgQysrIG1pc2MgcmVjb3JkIGJsb2NrLiAgT3RoZXJ3aXNlLCB3ZSB3YW50IHRvCi0gICAgICAgICBvdXRwdXQgaXQganVzdCBhZnRlciB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbiwgd2hpY2ggaXMgd2hlcmUKLSAgICAgICAgIHRoZSBjdXJyZW50IGJ1ZmZlciBpcy4gICovCi0gICAgICBpZiAocmVmZmxhZyAhPSAyKQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDYyKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAzKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdSJykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCByZWZmbGFnKQotCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgb3V0cHV0dGluZyBpbmZvcm1hdGlvbiBmb3IgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0YXJ0X2Z1bmN0aW9uIChwLCBuYW1lLCBnbG9iYWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGdsb2JhbDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIHVuc2lnbmVkIGludCByZXRpbmR4LCB0eXBlaW5keDsKLQotICByZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOwotICByZXRpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQmVzaWRlcyByZWNvcmRpbmcgYSBCQjQgb3IgQkI2IGJsb2NrLCB3ZSByZWNvcmQgdGhlIHR5cGUgb2YgdGhlCi0gICAgIGZ1bmN0aW9uIGluIHRoZSBCQjEgdHlwZWRlZiBibG9jay4gIFdlIGNhbid0IHdyaXRlIG91dCB0aGUgZnVsbAotICAgICB0eXBlIHVudGlsIHdlIGhhdmUgc2VlbiBhbGwgdGhlIHBhcmFtZXRlcnMsIHNvIHdlIGFjY3VtdWxhdGUgaXQKLSAgICAgaW4gaW5mby0+Zm50eXBlIGFuZCBpbmZvLT5mbmFyZ3MuICAqLwotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5mbnR5cGUpKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBUaGlzIG1pZ2h0IGhhcHBlbiBzb21lZGF5IGlmIHdlIHN1cHBvcnQgbmVzdGVkCi0gICAgICAgICBmdW5jdGlvbnMuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGluZm8tPmZubmFtZSA9IG5hbWU7Ci0KLSAgLyogQW4gYXR0cmlidXRlIG9mIDB4NDAgbWVhbnMgdGhhdCB0aGUgcHVzaCBtYXNrIGlzIHVua25vd24uICAqLwotICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCBuYW1lLCAodW5zaWduZWQgaW50KSAtMSwgMCwgZmFsc2UsIHRydWUsCi0JCQkJJmluZm8tPmZudHlwZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICd4JykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDB4NDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHJldGluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0eXBlaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT5mbmFyZ3MpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+Zm5hcmdjb3VudCA9IDA7Ci0KLSAgLyogSWYgdGhlIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBpcyBhY3R1YWxseSBhIHJlZmVyZW5jZSB0eXBlLCB3ZQotICAgICBtdXN0IGFkZCBhIHJlY29yZCBpbmRpY2F0aW5nIHRoYXQuICAqLwotICBpZiAocmVmZXJlbmNlcCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgICAgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDYyKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAzKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdSJykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCBnbG9iYWwgPyAwIDogMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYXNzZXJ0ICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnZhcnMpKTsKLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBhZGRyZXNzIGlzIHdyaXR0ZW4gb3V0IGFzIHRoZSBmaXJzdCBibG9jay4gICovCi0KLSAgKytpbmZvLT5ibG9ja19kZXB0aDsKLQotICByZXR1cm4gKGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICYmIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgZ2xvYmFsID8gNCA6IDYpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICYmIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWUpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB0eXBlaW5keCkpOwotfQotCi0vKiBBZGQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgY2FsbGVkIGJlZm9yZSB0aGUKLSAgIGZpcnN0IGJsb2NrLCBzbyB3ZSBwb3N0cG9uZSB0aGVtIHVudGlsIHdlIHNlZSB0aGUgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9mdW5jdGlvbl9wYXJhbWV0ZXIgKHAsIG5hbWUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqbSwgKipwbTsKLQotICBhc3NlcnQgKGluZm8tPmJsb2NrX2RlcHRoID09IDEpOwotCi0gIG0gPSAoc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICopIHhtYWxsb2MgKHNpemVvZiAqbSk7Ci0gIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKLQotICBtLT5uZXh0ID0gTlVMTDsKLSAgbS0+bmFtZSA9IG5hbWU7Ci0gIG0tPnJlZmVyZW5jZXAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXA7Ci0gIG0tPnR5cGUgPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLSAgbS0+a2luZCA9IGtpbmQ7Ci0gIG0tPnZhbCA9IHZhbDsKLQotICBmb3IgKHBtID0gJmluZm8tPnBlbmRpbmdfcGFybXM7ICpwbSAhPSBOVUxMOyBwbSA9ICYoKnBtKS0+bmV4dCkKLSAgICA7Ci0gICpwbSA9IG07Ci0KLSAgLyogQWRkIHRoZSB0eXBlIHRvIHRoZSBmbmFyZ3MgbGlzdC4gICovCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmZuYXJncykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG0tPnR5cGUpKQotICAgIHJldHVybiBmYWxzZTsKLSAgKytpbmZvLT5mbmFyZ2NvdW50OwotCi0gIHJldHVybiB0cnVlOyAgCi19Ci0KLS8qIE91dHB1dCBwZW5kaW5nIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9vdXRwdXRfcGVuZGluZ19wYXJtcyAoaW5mbykKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm07Ci0gIHVuc2lnbmVkIGludCByZWZjb3VudDsKLQotICByZWZjb3VudCA9IDA7Ci0gIGZvciAobSA9IGluZm8tPnBlbmRpbmdfcGFybXM7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0gICAgewotICAgICAgZW51bSBkZWJ1Z192YXJfa2luZCB2a2luZDsKLQotICAgICAgc3dpdGNoIChtLT5raW5kKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBERUJVR19QQVJNX1NUQUNLOgotCWNhc2UgREVCVUdfUEFSTV9SRUZFUkVOQ0U6Ci0JICB2a2luZCA9IERFQlVHX0xPQ0FMOwotCSAgYnJlYWs7Ci0JY2FzZSBERUJVR19QQVJNX1JFRzoKLQljYXNlIERFQlVHX1BBUk1fUkVGX1JFRzoKLQkgIHZraW5kID0gREVCVUdfUkVHSVNURVI7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghIGllZWVfcHVzaF90eXBlIChpbmZvLCBtLT50eXBlLCAwLCBmYWxzZSwgZmFsc2UpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcCA9IG0tPnJlZmVyZW5jZXA7Ci0gICAgICBpZiAobS0+cmVmZXJlbmNlcCkKLQkrK3JlZmNvdW50OwotICAgICAgaWYgKCEgaWVlZV92YXJpYWJsZSAoKFBUUikgaW5mbywgbS0+bmFtZSwgdmtpbmQsIG0tPnZhbCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBhcmUgYW55IHJlZmVyZW5jZSBwYXJhbWV0ZXJzLCB3ZSBuZWVkIHRvIG91dHB1dCBhCi0gICAgIG1pc2NlbGxhbmVvdXMgcmVjb3JkIGluZGljYXRpbmcgdGhlbS4gICovCi0gIGlmIChyZWZjb3VudCA+IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5pbmR4LCB2YXJpbmR4OwotCi0gICAgICAvKiBGSVhNRTogVGhlIE1SSSBjb21waWxlciBvdXRwdXRzIHRoZSBkZW1hbmdsZWQgZnVuY3Rpb24gbmFtZQotICAgICAgICAgaGVyZSwgYnV0IHdlIGFyZSBvdXRwdXR0aW5nIHRoZSBtYW5nbGVkIG5hbWUuICAqLwotICAgICAgbmluZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0gICAgICArK2luZm8tPm5hbWVfaW5keDsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDYyKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCByZWZjb3VudCArIDMpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ0InKQotCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgaW5mby0+Zm5uYW1lKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZvciAobSA9IGluZm8tPnBlbmRpbmdfcGFybXMsIHZhcmluZHggPSAxOwotCSAgIG0gIT0gTlVMTDsKLQkgICBtID0gbS0+bmV4dCwgdmFyaW5keCsrKQotCXsKLQkgIGlmIChtLT5yZWZlcmVuY2VwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCB2YXJpbmR4KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBtID0gaW5mby0+cGVuZGluZ19wYXJtczsKLSAgd2hpbGUgKG0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm5leHQ7Ci0KLSAgICAgIG5leHQgPSBtLT5uZXh0OwotICAgICAgZnJlZSAobSk7Ci0gICAgICBtID0gbmV4dDsKLSAgICB9Ci0KLSAgaW5mby0+cGVuZGluZ19wYXJtcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgYmxvY2suICBJZiB0aGlzIGlzIHRoZSBmaXJzdCBibG9jaywgd2Ugb3V0cHV0IHRoZSBhZGRyZXNzCi0gICB0byBmaW5pc2ggdGhlIEJCNCBvciBCQjYsIGFuZCB0aGVuIG91dHB1dCB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0YXJ0X2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5ibG9ja19kZXB0aCA9PSAxKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBhZGRyKQotCSAgfHwgISBpZWVlX291dHB1dF9wZW5kaW5nX3Bhcm1zIChpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDYpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYWRkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX3N0YXJ0X3JhbmdlIChpbmZvLCBhZGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKytpbmZvLT5ibG9ja19kZXB0aDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW5kIGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbmRfYmxvY2sgKHAsIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICAvKiBUaGUgYWRkcmVzcyB3ZSBhcmUgZ2l2ZW4gaXMgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGJ1dCBJRUVFIHNlZW1zCi0gICAgIHRvIHdhbnQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgYmxvY2ssIHNvIHdlCi0gICAgIHN1YnRyYWN0IG9uZS4gICovCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGFkZHIgLSAxKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV9lbmRfcmFuZ2UgKGluZm8sIGFkZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAtLWluZm8tPmJsb2NrX2RlcHRoOwotCi0gIGlmIChhZGRyID4gaW5mby0+aGlnaGFkZHIpCi0gICAgaW5mby0+aGlnaGFkZHIgPSBhZGRyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbmQgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VuZF9mdW5jdGlvbiAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmJsb2NrX2RlcHRoID09IDEpOwotCi0gIC0taW5mby0+YmxvY2tfZGVwdGg7Ci0KLSAgLyogTm93IHdlIGNhbiBmaW5pc2ggdXAgZm50eXBlLCBhbmQgYWRkIGl0IHRvIHRoZSB0eXBkZWYgc2VjdGlvbi4KLSAgICAgQXQgdGhpcyBwb2ludCwgZm50eXBlIGlzIHRoZSAneCcgdHlwZSB1cCB0byB0aGUgYXJndW1lbnQgY291bnQsCi0gICAgIGFuZCBmbmFyZ3MgaXMgdGhlIGFyZ3VtZW50IHR5cGVzLiAgV2UgbXVzdCBhZGQgdGhlIGFyZ3VtZW50Ci0gICAgIGNvdW50LCBhbmQgd2UgbXVzdCBhZGQgdGhlIGxldmVsLiAgRklYTUU6IFdlIGRvbid0IHJlY29yZCB2YXJhcmdzCi0gICAgIGZ1bmN0aW9ucyBjb3JyZWN0bHkuICBJbiBmYWN0LCBzdGFicyBkZWJ1Z2dpbmcgZG9lcyBub3QgZ2l2ZSB1cwotICAgICBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZG8gc28uICAqLwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5mbnR5cGUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5mbmFyZ2NvdW50KQotICAgICAgfHwgISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5mbmFyZ3MpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSB0eXBkZWYgYmxvY2sgaGFzIGJlZW4gc3RhcnRlZC4gICovCi0gIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlcykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcywgJmluZm8tPmZudHlwZSkKLSAgICAgIHx8ICEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMsICZpbmZvLT5mbmFyZ3MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT5mbm5hbWUgPSBOVUxMOwotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm50eXBlKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPmZuYXJnY291bnQgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9saW5lbm8gKHAsIGZpbGVuYW1lLCBsaW5lbm8sIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgdW5zaWduZWQgbG9uZyBsaW5lbm87Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+ZmlsZW5hbWUgIT0gTlVMTCk7Ci0KLSAgLyogVGhlIEhQIHNpbXVsYXRvciBzZWVtcyB0byBnZXQgY29uZnVzZWQgd2hlbiBtb3JlIHRoYW4gb25lIGxpbmUgaXMKLSAgICAgbGlzdGVkIGZvciB0aGUgc2FtZSBhZGRyZXNzLCBhdCBsZWFzdCBpZiB0aGV5IGFyZSBpbiBkaWZmZXJlbnQKLSAgICAgZmlsZXMuICBXZSBoYW5kbGUgdGhpcyBieSBhbHdheXMgbGlzdGluZyB0aGUgbGFzdCBsaW5lIGZvciBhCi0gICAgIGdpdmVuIGFkZHJlc3MsIHNpbmNlIHRoYXQgc2VlbXMgdG8gYmUgdGhlIG9uZSB0aGF0IGdkYiB1c2VzLiAgKi8KLSAgaWYgKGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIGFkZHIgIT0gaW5mby0+cGVuZGluZ19saW5lbm9fYWRkcikKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGxpbmUgbnVtYmVyIGJsb2NrLiAgKi8KLSAgICAgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmxpbmVub3MpKQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmxpbmVub3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluZm8tPmxpbmVub19uYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0JICArK2luZm8tPm5hbWVfaW5keDsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmxpbmVub3MpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDUpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPmZpbGVuYW1lKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4KQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBpbmZvLT5maWxlbmFtZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lLCBpbmZvLT5saW5lbm9fZmlsZW5hbWUpICE9IDApCi0JewotCSAgaWYgKHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUsIGluZm8tPmxpbmVub19maWxlbmFtZSkgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFdlIHdlcmUgbm90IGluIHRoZSBtYWluIGZpbGUuICBDbG9zZSB0aGUgYmxvY2sgZm9yIHRoZQotCQkgaW5jbHVkZWQgZmlsZS4gICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChzdHJjbXAgKGluZm8tPmZpbGVuYW1lLCBpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSkgPT0gMCkKLQkJewotCQkgIC8qIFdlIG5lZWQgYSBuZXcgTk4gcmVjb3JkLCBhbmQgd2UgYXJlbid0IGFib3V0IHRvCi0JCSAgICAgb3V0cHV0IG9uZS4gICovCi0JCSAgaW5mby0+bGluZW5vX25hbWVfaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLQkJICArK2luZm8tPm5hbWVfaW5keDsKLQkJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4KQotCQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JICBpZiAoc3RyY21wIChpbmZvLT5maWxlbmFtZSwgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUpICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBXZSBhcmUgbm90IGNoYW5naW5nIHRvIHRoZSBtYWluIGZpbGUuICBPcGVuIGEgYmxvY2sgZm9yCi0JCSB0aGUgbmV3IGluY2x1ZGVkIGZpbGUuICAqLwotCSAgICAgIGluZm8tPmxpbmVub19uYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0JICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCA1KQotCQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZTsKLQl9Ci0KLSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmxpbmVub19uYW1lX2luZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNykKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPnBlbmRpbmdfbGluZW5vKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIGluZm8tPmxpbmVub19uYW1lX2luZHgsCi0JCQkgICAgICAgaW5mby0+cGVuZGluZ19saW5lbm9fYWRkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSA9IGZpbGVuYW1lOwotICBpbmZvLT5wZW5kaW5nX2xpbmVubyA9IGxpbmVubzsKLSAgaW5mby0+cGVuZGluZ19saW5lbm9fYWRkciA9IGFkZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9pcy1yYW5saWIuYyBiL2JpbnV0aWxzL2lzLXJhbmxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU3MmE0Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2lzLXJhbmxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0vKiBMaW5rZWQgd2l0aCBhci5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gaXMgJ3JhbmxpYicgKG5vdCAnYXInKS4gKi8KLQotaW50IGlzX3JhbmxpYiA9IDE7CmRpZmYgLS1naXQgYS9iaW51dGlscy9pcy1zdHJpcC5jIGIvYmludXRpbHMvaXMtc3RyaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1MzQxYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9pcy1zdHJpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0vKiBMaW5rZWQgd2l0aCBvYmpjb3B5Lm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBpcyAnc3RyaXAnIChub3QKLSAgICdvYmpjb3B5JykuICovCi0KLWludCBpc19zdHJpcCA9IDE7CmRpZmYgLS1naXQgYS9iaW51dGlscy9tYWMtYmludXRpbHMuciBiL2JpbnV0aWxzL21hYy1iaW51dGlscy5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjFhMzAzLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL21hYy1iaW51dGlscy5yCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogUmVzb3VyY2VzIGZvciBHTlUgYmludXRpbHMuICovCi0KLSNpbmNsdWRlICJTeXNUeXBlcy5yIgotCi0vKiBWZXJzaW9uIHJlc291cmNlcy4gKi8KLQotcmVzb3VyY2UgJ3ZlcnMnICgxKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JVkVSU0lPTl9TVFJJTkcgICIgKEMpIDE5ODYtOTUgRlNGLCBJbmMuIgotfTsKLQotcmVzb3VyY2UgJ3ZlcnMnICgyLCBwdXJnZWFibGUpICB7Ci0JMCwKLQkwLAotCTAsCi0JMCwKLQl2ZXJVcywKLQlWRVJTSU9OX1NUUklORywKLQkiYmludXRpbHMgIiBWRVJTSU9OX1NUUklORyAiIGZvciBNUFciCi19OwotCi0jaWZkZWYgV0FOVF9DRlJHCi0KLSNpbmNsdWRlICJDb2RlRnJhZ21lbnRUeXBlcy5yIgotCi1yZXNvdXJjZSAnY2ZyZycgKDApIHsKLQl7Ci0JCWtQb3dlclBDLAotCQlrRnVsbExpYiwKLQkJa05vVmVyc2lvbk51bSwga05vVmVyc2lvbk51bSwKLQkJMCwwLAotCQlrSXNBcHAsIGtPbkRpc2tGbGF0LCBrWmVyb09mZnNldCwga1dob2xlRm9yaywKLQkJUFJPR19OQU1FCi0JfQotfTsKLQotI2VuZGlmIC8qIFdBTlRfQ0ZSRyAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbWFrZWZpbGUudm1zLWluIGIvYmludXRpbHMvbWFrZWZpbGUudm1zLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODA5ZDFiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL21ha2VmaWxlLnZtcy1pbgorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGJpbnV0aWxzIHVuZGVyIG9wZW5WTVMgKEFscGhhIGFuZCBWYXgpCi0jCi0jIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHJtaS5kZQotIwotIwotCi0jIERpc3RyaWJ1dGlvbiB2ZXJzaW9uLCBmaWxsZWQgaW4gYnkgY29uZmlndXJlLmNvbQotVkVSU0lPTj1AVkVSU0lPTkAKLQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLVRBUkdFVD0iInZtcy1hbHBoYSIiCi1lbHNlCi1UQVJHRVQ9IiJ2bXMtdmF4IiIKLWVuZGlmCi0KLWlmZXEgKCQoQ0MpLGdjYykKLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpCi1ERUZTPS9kZWZpbmU9KCJUQVJHRVQ9JChUQVJHRVQpIikKLUxJQlM9LGdudV9jY19saWJyYXJ5OmxpYmdjYy9saWIsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYixnbnVfY2NfbGlicmFyeTpjcnQwLm9iagotZWxzZQotQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSxbLS5iZmRdKSQoREVGUylcCi0vd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMsbG9uZ2V4dGVybikKLURFRlM9L2RlZmluZT0oIlRBUkdFVD0kKFRBUkdFVCkiLCJjb25zdD0iLCJ1bmxpbms9cmVtb3ZlIikKLUxJQlM9LHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIKLWVuZGlmCi0KLUJGRExJQiA9IFstLmJmZF1saWJiZmQub2xiL2xpYgotQkZETElCX0RFUCA9IFstLmJmZF1saWJiZmQub2xiCi1MSUJJQkVSVFlfREVQID0gWy0ubGliaWJlcnR5XWxpYmliZXJ0eS5vbGIKLUxJQklCRVJUWSA9IFstLmxpYmliZXJ0eV1saWJpYmVydHkub2xiL2xpYgotT1BDT0RFU19ERVAgPSBbLS5vcGNvZGVzXWxpYm9wY29kZXMub2xiCi1PUENPREVTID0gWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYi9saWIKLQotREVCVUdfT0JKUyA9IHJkZGJnLm9iaixkZWJ1Zy5vYmosc3RhYnMub2JqLGllZWUub2JqLHJkY29mZi5vYmoKLQotV1JJVEVfREVCVUdfT0JKUyA9ICQoREVCVUdfT0JKUyksd3JzdGFicy5vYmoKLQotQlVMSUJTID0gW11idWNvbW0ub2JqLHZlcnNpb24ub2JqLGZpbGVtb2RlLm9iagotCi1BRERMX0RFUFMgPSAkKEJVTElCUyksJChCRkRMSUJfREVQKSwkKExJQklCRVJUWV9ERVApCi1BRERMX0xJQlMgPSAkKEJVTElCUyksJChCRkRMSUIpLCQoTElCSUJFUlRZKQotCi1TSVpFT0JKUyA9ICQoQURETF9ERVBTKSxzaXplLm9iagotCi1TVFJJTkdTT0JKUyA9ICQoQURETF9ERVBTKSxzdHJpbmdzLm9iagotCi1OTU9CSlMgPSAkKEFERExfREVQUyksbm0ub2JqCi0KLU9CSkRVTVBPQkpTID0gJChBRERMX0RFUFMpLG9iamR1bXAub2JqLHByZGJnLm9iaiwkKERFQlVHX09CSlMpLCQoT1BDT0RFU19ERVApCi0KLWFsbDogY29uZmlnLmggc2l6ZS5leGUgc3RyaW5ncy5leGUgb2JqZHVtcC5leGUgbm0uZXhlCi0KLXNpemUuZXhlOiAkKFNJWkVPQkpTKQotCWxpbmsvZXhlPSRAIHNpemUub2JqLCQoQURETF9MSUJTKSQoTElCUykKLQotc3RyaW5ncy5leGU6ICQoU1RSSU5HU09CSlMpCi0JbGluay9leGU9JEAgc3RyaW5ncy5vYmosJChBRERMX0xJQlMpJChMSUJTKQotCi1ubS5leGU6ICQoTk1PQkpTKQotCWxpbmsvZXhlPSRAIG5tLm9iaiwkKEFERExfTElCUykkKExJQlMpCi0KLW9iamR1bXAuZXhlOiAkKE9CSkRVTVBPQkpTKQotCWxpbmsvZXhlPSRAIG9iamR1bXAub2JqLHByZGJnLm9iaiwkKERFQlVHX09CSlMpLCQoQkZETElCKSwkKE9QQ09ERVMpLCQoQURETF9MSUJTKSQoTElCUykKLQotCi12ZXJzaW9uLm9iajogdmVyc2lvbi5jCi0JJChDQykgJChDRkxBR1MpL2RlZmluZT0oVkVSU0lPTj0iIiIkKFZFUlNJT04pIiIiKSAkPAotCi1jb25maWcuaDoKLQkkJCBAY29uZmlndXJlCi0JJChNQUtFKSAtZiBtYWtlZmlsZS52bXMgIkNDPSQoQ0MpIgotCi1bLS5iZmRdbGliYmZkLm9sYjoKLQkkKENEKSBbLS5iZmRdCi0JJChNQUtFKSAtZiBtYWtlZmlsZS52bXMgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmJpbnV0aWxzXQotCi1bLS5saWJpYmVydHldbGliaWJlcnR5Lm9sYjoKLQkkKENEKSBbLS5saWJpYmVydHldCi0JJChNQUtFKSAtZiBtYWtlZmlsZS52bXMgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmJpbnV0aWxzXQotCi1bLS5vcGNvZGVzXWxpYm9wY29kZXMub2xiOgotCSQoQ0QpIFstLm9wY29kZXNdCi0JJChNQUtFKSAtZiBtYWtlZmlsZS52bXMgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmJpbnV0aWxzXQotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pICoub2JqOwotCSQoUk0pICouZXhlOwotCi1kaXN0Y2xlYW46IGNsZWFuCi0JJChSTSkgY29uZmlnLmg7Ci0JJChSTSkgbWFrZWZpbGUudm1zOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbWF5YmUtcmFubGliLmMgYi9iaW51dGlscy9tYXliZS1yYW5saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM3YmMwZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tYXliZS1yYW5saWIuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogTGlua2VkIHdpdGggYXIubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGRlY2lkZXMgYXQgcnVudGltZQotICAgKHVzaW5nIGFyZ3ZbMF0gaWYgaXQgaXMgaXMgJ2FyJyBvciAncmFubGliJy4gKi8KLQotaW50IGlzX3JhbmxpYiA9IC0xOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbWF5YmUtc3RyaXAuYyBiL2JpbnV0aWxzL21heWJlLXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NjdjOTkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbWF5YmUtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogTGlua2VkIHdpdGggb2JqY29weS5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gZGVjaWRlcyBhdCBydW50aW1lCi0gICAodXNpbmcgYXJndlswXSBpZiBpdCBpcyBpcyAnc3RyaXAnIG9yICdvYmpjb3B5Jy4gKi8KLQotaW50IGlzX3N0cmlwID0gLTE7CmRpZmYgLS1naXQgYS9iaW51dGlscy9tcHctY29uZmlnLmluIGIvYmludXRpbHMvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhMDY3ZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBiaW51dGlscy4KLQotU2V0IHRhcmdldF9hcmNoIGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8tLiotLiovLydgCi0KLSMgKHNob3VsZCBjYW5vbmljYWxpemUgYXJjaCBuYW1lKSAqLwotCi1TZXQgYXJjaG5hbWUgQVJDSF97dGFyZ2V0X2FyY2h9Ci0KLVNldCB1bmRlcnNjb3JlIDAKLQotSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3NoLWhpdGFjaGktaG1zLwotCVNldCB1bmRlcnNjb3JlIDEKLUVuZCBJZgotCi1FY2hvICcjIEZyb20gbXB3LWNvbmZpZy5pbicJCQkJID4gIntvfSJtay50bXAKLUVjaG8gIkFSQ0hERUZTID0gLWQiIHthcmNobmFtZX0JCQkJPj4gIntvfSJtay50bXAKLUVjaG8gIlVOREVSU0NPUkUgPSAiIHt1bmRlcnNjb3JlfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJCVUlMRF9OTE1DT05WID0gIgkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkJVSUxEX1NSQ09OViA9ICIJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJTWVNJTkZPX1BST0cgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAiQlVJTERfRExMVE9PTCA9ICIJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQkJPj4gIntvfSJjb25maWcubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaApkaWZmIC0tZ2l0IGEvYmludXRpbHMvbXB3LW1ha2Uuc2VkIGIvYmludXRpbHMvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2FiZmZlLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIGJpbnV0aWxzIFVuaXggbWFrZWZpbGUgaW50byBNUFcgc3ludGF4LgotCi0jIEFkZCBhIHJ1bGUuCi0vXiMjIyMgLiovYVwKLVwKLSJ7b30idW5kZXJzY29yZS5jLm8gXFxPcHRpb24tZiAie299InVuZGVyc2NvcmUuY1wKLQotIyBDb21tZW50IG91dCBhbnkgYWxpYXMgc2V0dGluZ3MuCi0vXmhvc3RfYWxpYXMgPS9zL14vIy8KLS9edGFyZ2V0X2FsaWFzID0vcy9eLyMvCi0KLSMgV2hhY2sgb3V0IHVudXNlZCBob3N0IGRlZmluZSBiaXRzLgotL0hERUZJTkVTL3MvQEhERUZJTkVTQC8vCi0KLSMgRG9uJ3QgYnVpbGQgc3BlY2lhbGl6ZWQgdG9vbHMuCi0vQlVJTERfTkxNQ09OVi9zL0BCVUlMRF9OTE1DT05WQC8vCi0vQlVJTERfU1JDT05WL3MvQEJVSUxEX1NSQ09OVkAvLwotL0JVSUxEX0RMTFRPT0wvcy9AQlVJTERfRExMVE9PTEAvLwotCi0vVU5ERVJTQ09SRS9zL0BVTkRFUlNDT1JFQC97VU5ERVJTQ09SRX0vCi0KLSMgRG9uJ3QgbmVlZCB0aGlzLgotL0BITERGTEFHU0Avcy9ASExERkxBR1NALy8KLQotIyBQb2ludCBhdCB0aGUgbGlicmFyaWVzIGRpcmVjdGx5LgotL0BCRkRMSUJAL3MvQEJGRExJQkAvOjpiZmQ6bGliYmZkLm8vCi0vQE9QQ09ERVNAL3MvQE9QQ09ERVNALzo6b3Bjb2RlczpsaWJvcGNvZGVzLm8vCi0KLSMgV2hhY2sgb3V0IHRhcmdldCBtYWtlZmlsZSBmcmFnbWVudC4KLS90YXJnZXRfbWFrZWZpbGVfZnJhZ21lbnQvcy90YXJnZXRfbWFrZWZpbGVfZnJhZ21lbnRALy8KLQotIyBGaXggYW5kIGFkZCB0byB0aGUgaW5jbHVkZSBwYXRocy4KLS9eSU5DTFVERVMgPSAuKiQvcy8kLyAtaSAie0lOQ0RJUn0iOm1wdzogLWkgOjpleHRyYS1pbmNsdWRlOi8KLS9CRkRESVIvcy8taSB7QkZERElSfSAvLWkgIntCRkRESVJ9IjogLwotL0lOQ0RJUi9zLy1pIHtJTkNESVJ9IC8taSAie0lOQ0RJUn0iOiAvCi0KLSMgVXNlIGJ5YWNjIGluc3RlYWQgb2YgYmlzb24gKGZvciBub3cgYW55d2F5KS4KLS9CSVNPTi9zL15CSVNPTiA9LiokL0JJU09OID0gYnlhY2MvCi0jL0JJU09ORkxBR1Mvcy9eQklTT05GTEFHUyA9LiokL0JJU09ORkxBR1MgPSAvCi0KLSMgRW1iZWQgdGhlIHZlcnNpb24gaW4gc3ltYm9saWMgZG91YmxlcXVvdGVzIHRoYXQgd2lsbCBleHBhbmQgdG8KLSMgdGhlIHJpZ2h0IHRoaW5nIGZvciBlYWNoIGNvbXBpbGVyLgotL1ZFUlNJT04vcy8nIntWRVJTSU9OfSInL3tkcX17VkVSU0lPTn17ZHF9LwotCi0jICcrJyBpcyBhIHNwZWNpYWwgY2hhciB0byBNUFcsIGRvbid0IHVzZSBpdCBldmVyLgotL2MrK2ZpbHQvcy9jKytmaWx0L2NwbHVzZmlsdC8KLQotIyBBbGwgb2YgdGhlIGJpbnV0aWxzIHVzZSB0aGUgc2FtZSBSZXogZmlsZSwgY2hhbmdlIG5hbWVzIHRvIHJlZmVyIHRvIGl0LgotL157W0EtWl0qX1BST0d9L3MvJC8gIntzfSJtYWMtYmludXRpbHMuci8KLS97W0EtWl0qX1BST0d9XC5yL3Mve1tBLVpdKl9QUk9HfVwuci9tYWMtYmludXRpbHMuci8KLQotIyBUaGVyZSBhcmUgYXV0by1nZW5lcmF0ZWQgcmVmZXJlbmNlcyB0byBCRkQgLmggZmlsZXMgdGhhdCBhcmUgbm90Ci0jIGluIHRoZSBvYmpkaXIgKGxpa2UgYmZkLmgpIGJ1dCBhcmUgaW4gdGhlIHNvdXJjZSBkaXIuCi0vOjpiZmQ6bGliL3MvOjpiZmQ6bGliXChbYS16XSpcKVwuaC97QkZERElSfTpsaWJcMS5oL2cKLQotIyBGaXggdGhlIGxvY2F0aW9ucyBvZiBnZW5lcmF0ZWQgZmlsZXMuCi0vY29uZmlnL3MvIntzfSJjb25maWdcLmgvIntvfSJjb25maWcuaC9nCi0vY29uZmlnL3MvXmNvbmZpZ1wuaC8ie299ImNvbmZpZ1wuaC8KLS91bmRlcnNjb3JlL3MvIntzfSJ1bmRlcnNjb3JlXC5jLyJ7b30idW5kZXJzY29yZS5jL2cKLS91bmRlcnNjb3JlL3MvXnVuZGVyc2NvcmVcLmMvIntvfSJ1bmRlcnNjb3JlXC5jLwotCi0jIEZpeCBwYXRocyB0byBnZW5lcmF0ZWQgc291cmNlIGZpbGVzLgotL2xleC55eS5jL3MvIntzfSJsZXhcLnl5XC5jLyJ7b30ibGV4Lnl5LmMvZwotL2xleC55eS5jL3MvXmxleFwueXlcLmMvIntvfSJsZXgueXkuYy8KLS9hcmxleC5jL3MvIntzfSJhcmxleFwuYy8ie299ImFybGV4LmMvZwotL2FybGV4LmMvcy9eYXJsZXhcLmMvIntvfSJhcmxleC5jLwotL3kudGFiLmMvcy8ie3N9InlcLnRhYlwuYy8ie299InkudGFiLmMvZwotL3kudGFiLmMvcy9eeVwudGFiXC5jLyJ7b30ieS50YWIuYy8KLS9hcnBhcnNlLmMvcy8ie3N9ImFycGFyc2VcLmMvIntvfSJhcnBhcnNlLmMvZwotL2FycGFyc2UuYy9zL15hcnBhcnNlXC5jLyJ7b30iYXJwYXJzZS5jLwotL3kudGFiLmgvcy8ie3N9InlcLnRhYlwuaC8ie299InkudGFiLmgvZwotL3kudGFiLmgvcy9eeVwudGFiXC5oLyJ7b30ieS50YWIuaC8KLS9hcnBhcnNlLmgvcy8ie3N9ImFycGFyc2VcLmgvIntvfSJhcnBhcnNlLmgvZwotL2FycGFyc2UuaC9zL15hcnBhcnNlXC5oLyJ7b30iYXJwYXJzZS5oLwotCi0vIntzfSJ7SU5DRElSfS9zLyJ7c30ie0lOQ0RJUn0vIntJTkNESVJ9Ii9nCi0KLSMgVGhlIGdlbmVyYXRlZCBsZXhlciBtYXkgaW5jbHVkZSBhbiBpZmRlZiBmb3Igb2xkZXIgTWFjIGNvbXBpbGVycyB0aGF0Ci0jIG5lZWRzIHRvIHdvcmsgd2l0aCBuZXdlciBjb21waWxlcnMgYWxzby4KLS9sZXgueXkuYy9zL1JlbmFtZSAteSBcKFteIF0qXCkgXChbXiBdKlwpJC9zZWQgLWUgJ3MsaWZkZWYgbWFjaW50b3NoLGlmIGRlZmluZWQobWFjaW50b3NoKSB8fCBkZWZpbmVkKF9fTVdFUktTX18pLCcgXDEgPiBcMi8KLQotIyBGaXggYW4gb3Zlci1lYWdlcm5lc3MuCi0vZWNoby4qV0FSTklORy4qVGhpcyBmaWxlL3MvJy4qJy8nICcvCi0KLSMgQWRkIGEgInN0YW1wcyIgdGFyZ2V0LgotJGFcCi1zdGFtcHMgXFxPcHRpb24tZiBzdGFtcC11bmRlclwKLQotL15pbnN0YWxsIFxcT3B0aW9uLWYgLywvXiQvY1wKLWluc3RhbGwgXFxPcHRpb24tZiAgYWxsIGluc3RhbGwtb25seVwKLVwKLWluc3RhbGwtb25seSBcXE9wdGlvbi1mXAotCU5ld0ZvbGRlclJlY3Vyc2l2ZSAie2JpbmRpcn0iXAotCSMgTmVlZCB0byBjb3B5IGFsbCB0aGUgdG9vbHNcCi0JRm9yIHByb2cgaW4ge1BST0dTfVwKLQkJU2V0IHByb2duYW1lIGBlY2hvIHtwcm9nfSB8IHNlZCAtZSAncy8ubmV3Ly8nYFwKLQkJRHVwbGljYXRlIC15IDp7cHJvZ30gIntiaW5kaXJ9Intwcm9nbmFtZX1cCi0JRW5kIEZvclwKLQotCi0vdHJ1ZS9zLyA7IEB0cnVlJC8vCi0KLSMgZG90IGZpbGVzIGFyZSB0cm91YmxlLCByZW1vdmUgdGhlbSBhbmQgdGhlaXIgYWN0aW9ucy4KLS9eXC5kZXAvLC9eJC9kCi0KLSMgUmVtb3ZlIHVuLXVzZWZ1bCB0YXJnZXRzLgotL15NYWtlZmlsZSBcXE9wdGlvbi1mLywvXiQvZAotL14ie299ImNvbmZpZy5oIFxcT3B0aW9uLWYvLC9eJC9kCi0vXmNvbmZpZy5zdGF0dXMgXFxPcHRpb24tZi8sL14kL2QKLQotIyBEb24ndCB0cnkgdG8gbWFrZSB0aGUgZGVtYW5nbGVyJ3MgbWFuIHBhZ2UsIGl0J3MgdXNlbGVzcy4KLS9ee0RFTUFOR0xFUl9QUk9HfVwuMSBcXE9wdGlvbi1mLywvXiQvZAotIyBEb24ndCBkZXBlbmQgb24gaXQgZWl0aGVyLgotL3tERU1BTkdMRVJfUFJPR30vcy8ge0RFTUFOR0xFUl9QUk9HfVwuMS8vCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25sbWNvbnYuMSBiL2JpbnV0aWxzL25sbWNvbnYuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjM2FlZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ubG1jb252LjEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgMTk5NiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBubG1jb252IDEgIk1hcmNoIDE5OTYiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1ubG1jb252IFwtIGNvbnZlcnRzIG9iamVjdCBjb2RlIGludG8gYW4gTkxNCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBubG1jb252Ci0uUkIgIltcfCIgXC1JXCBcZkliZmRuYW1lXGZCXCB8XCBcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtT1wgXGZJYmZkbmFtZVxmQlwgfFwgXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1UXCBcZkloZWFkZXJmaWxlXGZCXCB8XCBcLVwtaGVhZGVyXC1maWxlPVxmSWhlYWRlcmZpbGVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1WXCB8XCBcLVwtdmVyc2lvblxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtaGVscFxmUiAiXHxdIiAKLS5CIGluZmlsZQotLkIgb3V0ZmlsZQotLlNIIERFU0NSSVBUSU9OCi0uQiBubG1jb252Ci1jb252ZXJ0cyB0aGUgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUgCi0uQiBpbmZpbGUKLWludG8gdGhlIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlIAotLkJSIG91dGZpbGUgLAotb3B0aW9uYWxseSByZWFkaW5nIAotLkkgaGVhZGVyZmlsZQotZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHdyaXRpbmcgdGhlIE5MTQotY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWUgCi0uSVIgIlRoZSBOZXRXYXJlIFRvb2wgTWFrZXIgU3BlY2lmaWNhdGlvbiBNYW51YWwiICwKLWF2YWlsYWJsZSBmcm9tIE5vdmVsbCwgSW5jLgotLkIgbmxtY29udgotY3VycmVudGx5IHdvcmtzIHdpdGggaTM4NiBvYmplY3QgZmlsZXMgaW4gCi0uQlIgQ09GRiAsCi0uQlIgRUxGICwKLW9yCi0uQiBhLm91dAotZm9ybWF0LCBhbmQgd2l0aCBTUEFSQyBvYmplY3QgZmlsZXMgaW4KLS5CIEVMRgotb3IKLS5CIGEub3V0Ci1mb3JtYXQuCi0uYnIKLS5CIG5sbWNvbnYKLXVzZXMgdGhlIEdOVSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkgdG8gcmVhZCAKLS5JUiBpbmZpbGUgLgotLlNIIE9QVElPTlMKLS5UUAotLkIgXC1JIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUKLUNvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgCi0uSVIgYmZkbmFtZSAsCi1yYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGRlZHVjZSBpdC4KLS5UUAotLkIgXC1PIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lCi1Xcml0ZSB0aGUgb3V0cHV0IGZpbGUgdXNpbmcgdGhlIG9iamVjdCBmb3JtYXQgCi0uSVIgYmZkbmFtZSAuCi0uQiBubG1jb252Ci1pbmZlcnMgdGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gdGhlIGlucHV0IGZvcm1hdCwgZS5nLiBmb3IgYW4gaTM4NgotaW5wdXQgZmlsZSB0aGUgb3V0cHV0IGZvcm1hdCBpcwotLklSIG5sbTMyXC1pMzg2IC4KLS5UUAotLkIgXC1UIFxmSWhlYWRlcmZpbGVcZlIsIFxmQlwtXC1oZWFkZXJcLWZpbGU9XGZJaGVhZGVyZmlsZQotUmVhZHMgCi0uSSBoZWFkZXJmaWxlCi1mb3IgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIEZvciBpbnN0cnVjdGlvbnMgb24gd3JpdGluZyB0aGUgTkxNCi1jb21tYW5kIGZpbGUgbGFuZ3VhZ2UgdXNlZCBpbiBoZWFkZXIgZmlsZXMsIHNlZSAKLS5JUiAiVGhlIE5ldFdhcmUgVG9vbCBNYWtlciBTcGVjaWZpY2F0aW9uIE1hbnVhbCIgLAotYXZhaWxhYmxlIGZyb20gTm92ZWxsLCBJbmMuCi0uVFAKLS5CIFwtVlxmUiwgXGZCXC1cLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiBubG1jb252Ci1hbmQgZXhpdC4KLS5UUAotLkIgXC1oXGZSLCBcZkJcLVwtaGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIG5sbWNvbnYKLWFuZCBleGl0LgotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChKdW5lIDE5OTMpLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1jb252LmMgYi9iaW51dGlscy9ubG1jb252LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzhiNmMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbmxtY29udi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIxMiArMCwwIEBACi0vKiBubG1jb252LmMgLS0gTkxNIGNvbnZlcnNpb24gcHJvZ3JhbQotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGFueSBhcHByb3ByaWF0ZSBvYmplY3QgZmlsZQotICAgaW50byBhIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlIChhbiBOTE0pLiAgSXQgd2lsbCBhY2NlcHQgYSBsaW5rZXIKLSAgIHNwZWNpZmljYXRpb24gZmlsZSB3aGljaCBpcyBpZGVudGljYWwgdG8gdGhhdCBhY2NlcHRlZCBieSB0aGUKLSAgIE5ldFdhcmUgbGlua2VyLCBOTE1MSU5LLiAgKi8KLQotLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KLSNpZm5kZWYgX19HTlVDX18KLSMgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLQotLyogSW50ZXJuYWwgQkZEIE5MTSBoZWFkZXIuICAqLwotI2luY2x1ZGUgImxpYm5sbS5oIgotI2luY2x1ZGUgIm5sbWNvbnYuaCIKLQotI2lmZGVmIE5MTUNPTlZfQUxQSEEKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNlbmRpZgotCi0vKiBJZiBzdHJlcnJvciBpcyBqdXN0IGEgbWFjcm8sIHdlIHdhbnQgdG8gdXNlIHRoZSBvbmUgZnJvbSBsaWJpYmVydHkKLSAgIHNpbmNlIGl0IHdpbGwgaGFuZGxlIHVuZGVmaW5lZCB2YWx1ZXMuICAqLwotI3VuZGVmIHN0cmVycm9yCi1leHRlcm4gY2hhciAqc3RyZXJyb3IgKCk7Ci0KLSNpZm5kZWYgbG9jYWx0aW1lCi1leHRlcm4gc3RydWN0IHRtICpsb2NhbHRpbWUgKCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX1NFVAotI2RlZmluZSBTRUVLX1NFVCAwCi0jZW5kaWYKLQotI2lmbmRlZiBSX09LCi0jZGVmaW5lIFJfT0sgNAotI2RlZmluZSBXX09LIDIKLSNkZWZpbmUgWF9PSyAxCi0jZW5kaWYKLQwKLS8qIEdsb2JhbCB2YXJpYWJsZXMuICAqLwotCi0vKiBUaGUgbmFtZSB1c2VkIHRvIGludm9rZSB0aGUgcHJvZ3JhbS4gICovCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIExvY2FsIHZhcmlhYmxlcy4gICovCi0KLS8qIFdoZXRoZXIgdG8gcHJpbnQgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAoY3VycmVudGx5IGp1c3QgY29udHJvbHMKLSAgIHdoZXRoZXIgaXQgcHJpbnRzIHRoZSBsaW5rZXIgY29tbWFuZCBpZiB0aGVyZSBpcyBvbmUpLiAgKi8KLXN0YXRpYyBpbnQgZGVidWc7Ci0KLS8qIFRoZSBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIGFzeW1ib2wgKipzeW1ib2xzOwotCi0vKiBBIHNlY3Rpb24gd2UgY3JlYXRlIGluIHRoZSBvdXRwdXQgZmlsZSB0byBob2xkIHBvaW50ZXJzIHRvIHdoZXJlCi0gICB0aGUgc2VjdGlvbnMgb2YgdGhlIGlucHV0IGZpbGUgZW5kIHVwLiAgV2Ugd2lsbCBwdXQgYSBwb2ludGVyIHRvCi0gICB0aGlzIHNlY3Rpb24gaW4gdGhlIE5MTSBoZWFkZXIuICBUaGVzZSBpcyBhbiBlbnRyeSBmb3IgZWFjaCBpbnB1dAotICAgc2VjdGlvbi4gIFRoZSBmb3JtYXQgaXMKLSAgICAgICBudWxsIHRlcm1pbmF0ZWQgc2VjdGlvbiBuYW1lCi0gICAgICAgemVyb2VzIHRvIGFkanVzdCB0byA0IGJ5dGUgYm91bmRhcnkKLSAgICAgICA0IGJ5dGUgc2VjdGlvbiBkYXRhIGZpbGUgcG9pbnRlcgotICAgICAgIDQgYnl0ZSBzZWN0aW9uIHNpemUKLSAgIFdlIGRvbid0IG5lZWQgYSB2ZXJzaW9uIG51bWJlci4gIFRoZSB3YXkgd2UgZmluZCB0aGlzIGluZm9ybWF0aW9uCi0gICBpcyBieSBmaW5kaW5nIGEgc3RhbXAgaW4gdGhlIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBJZiB3ZSBuZWVkIHRvCi0gICBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGlzIGluZm9ybWF0aW9uLCB3ZSBjYW4gc2ltcGx5IGNoYW5nZSB0aGUKLSAgIHN0YW1wLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiAqc2Vjc2VjOwotCi0vKiBBIHRlbXBvcmFyeSBmaWxlIG5hbWUgdG8gYmUgdW5saW5rZWQgb24gZXhpdC4gIEFjdHVhbGx5LCBmb3IgbW9zdAotICAgZXJyb3JzLCB3ZSBsZWF2ZSBpdCBhcm91bmQuICBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoYXQgaXMgaGVscGZ1bAotICAgb3Igbm90LiAgKi8KLXN0YXRpYyBjaGFyICp1bmxpbmtfb25fZXhpdDsKLQotLyogVGhlIGxpc3Qgb2YgbG9uZyBvcHRpb25zLiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyAiZGVidWciLCBub19hcmd1bWVudCwgMCwgJ2QnIH0sCi0gIHsgImhlYWRlci1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdUJyB9LAotICB7ICJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJyB9LAotICB7ICJpbnB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knIH0sCi0gIHsgImlucHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSScgfSwgLyogT2Jzb2xldGUgKi8KLSAgeyAibGlua2VyIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdsJyB9LAotICB7ICJvdXRwdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJyB9LAotICB7ICJvdXRwdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJyB9LCAvKiBPYnNvbGV0ZSAqLwotICB7ICJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJyB9LAotICB7IE5VTEwsIG5vX2FyZ3VtZW50LCAwLCAwIH0KLX07Ci0KLS8qIExvY2FsIHJvdXRpbmVzLiAgKi8KLQotc3RhdGljIHZvaWQgc2hvd19oZWxwIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpzZWxlY3Rfb3V0cHV0X2Zvcm1hdCBQQVJBTVMgKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCi0JCQkJCQkgdW5zaWduZWQgbG9uZywgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgc2V0dXBfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgY29weV9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBtYW5nbGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqKiwKLQkJCQkgICBsb25nICosIGNoYXIgKiwKLQkJCQkgICBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgdm9pZCBkZWZhdWx0X21hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAotCQkJCQkgICBsb25nICosIGNoYXIgKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGNoYXIgKmxpbmtfaW5wdXRzIFBBUkFNUyAoKHN0cnVjdCBzdHJpbmdfbGlzdCAqLCBjaGFyICopKTsKLQotI2lmZGVmIE5MTUNPTlZfSTM4Ngotc3RhdGljIHZvaWQgaTM4Nl9tYW5nbGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqKiwKLQkJCQkJbG9uZyAqLCBjaGFyICosCi0JCQkJCWJmZF9zaXplX3R5cGUpKTsKLSNlbmRpZgotCi0jaWZkZWYgTkxNQ09OVl9BTFBIQQotc3RhdGljIHZvaWQgYWxwaGFfbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJCSBsb25nICosIGNoYXIgKiwKLQkJCQkJIGJmZF9zaXplX3R5cGUpKTsKLSNlbmRpZgotCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi1zdGF0aWMgdm9pZCBwb3dlcnBjX2J1aWxkX3N0dWJzIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgYXN5bWJvbCAqKiosIGxvbmcgKikpOwotc3RhdGljIHZvaWQgcG93ZXJwY19yZXNvbHZlX3N0dWJzIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgcG93ZXJwY19tYW5nbGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqKiwKLQkJCQkJICAgbG9uZyAqLCBjaGFyICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKLSNlbmRpZgotDAotLyogVGhlIG1haW4gcm91dGluZS4gICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgb3B0OwotICBjaGFyICppbnB1dF9maWxlID0gTlVMTDsKLSAgY29uc3QgY2hhciAqaW5wdXRfZm9ybWF0ID0gTlVMTDsKLSAgY29uc3QgY2hhciAqb3V0cHV0X2Zvcm1hdCA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKmhlYWRlcl9maWxlID0gTlVMTDsKLSAgY2hhciAqbGRfYXJnID0gTlVMTDsKLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciBmaXhlZF9oZHJfc3RydWN0OwotICBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyIHZhcl9oZHJfc3RydWN0OwotICBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIgdmVyc2lvbl9oZHJfc3RydWN0OwotICBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciBjb3B5cmlnaHRfaGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlciBleHRlbmRlZF9oZHJfc3RydWN0OwotICBiZmQgKmluYmZkOwotICBiZmQgKm91dGJmZDsKLSAgYXN5bWJvbCAqKm5ld3N5bXMsICoqb3V0c3ltczsKLSAgbG9uZyBzeW1jb3VudCwgbmV3c3ltYWxsb2MsIG5ld3N5bWNvdW50OwotICBsb25nIHN5bXNpemU7Ci0gIGFzZWN0aW9uICp0ZXh0X3NlYywgKmJzc19zZWMsICpkYXRhX3NlYzsKLSAgYmZkX3ZtYSB2bWE7Ci0gIGJmZF9zaXplX3R5cGUgYWxpZ247Ci0gIGFzeW1ib2wgKmVuZHN5bTsKLSAgbG9uZyBpOwotICBjaGFyIGlubGVhZCwgb3V0bGVhZDsKLSAgYm9vbGVhbiBnb3RzdGFydCwgZ290ZXhpdCwgZ290Y2hlY2s7Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBGSUxFICpjdXN0b21fZGF0YSA9IE5VTEw7Ci0gIEZJTEUgKmhlbHBfZGF0YSA9IE5VTEw7Ci0gIEZJTEUgKm1lc3NhZ2VfZGF0YSA9IE5VTEw7Ci0gIEZJTEUgKnJwY19kYXRhID0gTlVMTDsKLSAgRklMRSAqc2hhcmVkX2RhdGEgPSBOVUxMOwotICBzaXplX3QgY3VzdG9tX3NpemUgPSAwOwotICBzaXplX3QgaGVscF9zaXplID0gMDsKLSAgc2l6ZV90IG1lc3NhZ2Vfc2l6ZSA9IDA7Ci0gIHNpemVfdCBtb2R1bGVfc2l6ZSA9IDA7Ci0gIHNpemVfdCBycGNfc2l6ZSA9IDA7Ci0gIGFzZWN0aW9uICpjdXN0b21fc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICpoZWxwX3NlY3Rpb24gPSBOVUxMOwotICBhc2VjdGlvbiAqbWVzc2FnZV9zZWN0aW9uID0gTlVMTDsKLSAgYXNlY3Rpb24gKm1vZHVsZV9zZWN0aW9uID0gTlVMTDsKLSAgYXNlY3Rpb24gKnJwY19zZWN0aW9uID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNoYXJlZF9zZWN0aW9uID0gTlVMTDsKLSAgYmZkICpzaGFyZWRiZmQ7Ci0gIHNpemVfdCBzaGFyZWRfb2Zmc2V0ID0gMDsKLSAgc2l6ZV90IHNoYXJlZF9zaXplID0gMDsKLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciBzaGFyZWRoZHI7Ci0gIGludCBsZW47Ci0gIGNoYXIgKm1vZG5hbWU7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiZGhJOmw6TzpUOlYiLCBsb25nX29wdGlvbnMsCi0JCQkgICAgIChpbnQgKikgTlVMTCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAnZCc6Ci0JICBkZWJ1ZyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAnSSc6Ci0JICBpbnB1dF9mb3JtYXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGxkX2FyZyA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCSAgb3V0cHV0X2Zvcm1hdCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ1QnOgotCSAgaGVhZGVyX2ZpbGUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHByaW50X3ZlcnNpb24gKCJubG1jb252Iik7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgLypOT1RSRUFDSEVEKi8KLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG1heSBiZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLSAgb3V0cHV0X2ZpbGUgPSBOVUxMOwotICBpZiAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBpbnB1dF9maWxlID0gYXJndltvcHRpbmRdOwotICAgICAgKytvcHRpbmQ7Ci0gICAgICBpZiAob3B0aW5kIDwgYXJnYykKLQl7Ci0JICBvdXRwdXRfZmlsZSA9IGFyZ3Zbb3B0aW5kXTsKLQkgICsrb3B0aW5kOwotCSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JICAgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBpZiAoc3RyY21wIChpbnB1dF9maWxlLCBvdXRwdXRfZmlsZSkgPT0gMCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG11c3QgYmUgZGlmZmVyZW50XG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgZXhpdCAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEluaXRpYWxpemUgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiB0byBkZWZhdWx0IHZhbHVlcy4gICovCi0gIGZpeGVkX2hkciA9ICZmaXhlZF9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZmaXhlZF9oZHJfc3RydWN0LCAwLCBzaXplb2YgZml4ZWRfaGRyX3N0cnVjdCk7Ci0gIHZhcl9oZHIgPSAmdmFyX2hkcl9zdHJ1Y3Q7Ci0gIG1lbXNldCAoKFBUUikgJnZhcl9oZHJfc3RydWN0LCAwLCBzaXplb2YgdmFyX2hkcl9zdHJ1Y3QpOwotICB2ZXJzaW9uX2hkciA9ICZ2ZXJzaW9uX2hkcl9zdHJ1Y3Q7Ci0gIG1lbXNldCAoKFBUUikgJnZlcnNpb25faGRyX3N0cnVjdCwgMCwgc2l6ZW9mIHZlcnNpb25faGRyX3N0cnVjdCk7Ci0gIGNvcHlyaWdodF9oZHIgPSAmY29weXJpZ2h0X2hkcl9zdHJ1Y3Q7Ci0gIG1lbXNldCAoKFBUUikgJmNvcHlyaWdodF9oZHJfc3RydWN0LCAwLCBzaXplb2YgY29weXJpZ2h0X2hkcl9zdHJ1Y3QpOwotICBleHRlbmRlZF9oZHIgPSAmZXh0ZW5kZWRfaGRyX3N0cnVjdDsKLSAgbWVtc2V0ICgoUFRSKSAmZXh0ZW5kZWRfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIGV4dGVuZGVkX2hkcl9zdHJ1Y3QpOwotICBjaGVja19wcm9jZWR1cmUgPSBOVUxMOwotICBjdXN0b21fZmlsZSA9IE5VTEw7Ci0gIGRlYnVnX2luZm8gPSBmYWxzZTsKLSAgZXhpdF9wcm9jZWR1cmUgPSAiX1N0b3AiOwotICBleHBvcnRfc3ltYm9scyA9IE5VTEw7Ci0gIG1hcF9maWxlID0gTlVMTDsKLSAgZnVsbF9tYXAgPSBmYWxzZTsKLSAgaGVscF9maWxlID0gTlVMTDsKLSAgaW1wb3J0X3N5bWJvbHMgPSBOVUxMOwotICBtZXNzYWdlX2ZpbGUgPSBOVUxMOwotICBtb2R1bGVzID0gTlVMTDsKLSAgc2hhcmVsaWJfZmlsZSA9IE5VTEw7Ci0gIHN0YXJ0X3Byb2NlZHVyZSA9ICJfUHJlbHVkZSI7Ci0gIHZlcmJvc2UgPSBmYWxzZTsKLSAgcnBjX2ZpbGUgPSBOVUxMOwotCi0gIHBhcnNlX2Vycm9ycyA9IDA7Ci0KLSAgLyogUGFyc2UgdGhlIGhlYWRlciBmaWxlIChpZiB0aGVyZSBpcyBvbmUpLiAgKi8KLSAgaWYgKGhlYWRlcl9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbmxtbGV4X2ZpbGUgKGhlYWRlcl9maWxlKQotCSAgfHwgeXlwYXJzZSAoKSAhPSAwCi0JICB8fCBwYXJzZV9lcnJvcnMgIT0gMCkKLQlleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKGlucHV0X2ZpbGVzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGlucHV0X2ZpbGUgIT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgIF8oIiVzOiBpbnB1dCBmaWxlIG5hbWVkIGJvdGggb24gY29tbWFuZCBsaW5lIGFuZCB3aXRoIElOUFVUXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICAgIGlmIChpbnB1dF9maWxlcy0+bmV4dCA9PSBOVUxMKQotCWlucHV0X2ZpbGUgPSBpbnB1dF9maWxlcy0+c3RyaW5nOwotICAgICAgZWxzZQotCWlucHV0X2ZpbGUgPSBsaW5rX2lucHV0cyAoaW5wdXRfZmlsZXMsIGxkX2FyZyk7Ci0gICAgfQotICBlbHNlIGlmIChpbnB1dF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gaW5wdXQgZmlsZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotICAgIH0KLQotICBpbmJmZCA9IGJmZF9vcGVuciAoaW5wdXRfZmlsZSwgaW5wdXRfZm9ybWF0KTsKLSAgaWYgKGluYmZkID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGluYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoaW5wdXRfZmlsZSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAob3V0cHV0X2Zvcm1hdCA9PSBOVUxMKQotICAgIG91dHB1dF9mb3JtYXQgPSBzZWxlY3Rfb3V0cHV0X2Zvcm1hdCAoYmZkX2dldF9hcmNoIChpbmJmZCksCi0JCQkJCSAgYmZkX2dldF9tYWNoIChpbmJmZCksCi0JCQkJCSAgYmZkX2JpZ19lbmRpYW4gKGluYmZkKSk7Ci0KLSAgYXNzZXJ0IChvdXRwdXRfZm9ybWF0ICE9IE5VTEwpOwotCi0gIC8qIFVzZSB0aGUgb3V0cHV0IGZpbGUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZSBpZiBpdCBleGlzdHMuCi0gICAgIE90aGVyd2lzZSB1c2UgdGhlIGZpbGUgbmFtZWQgaW4gdGhlIE9VVFBVVCBzdGF0ZW1lbnQuICAqLwotICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotICAgIH0KLQotICBvdXRiZmQgPSBiZmRfb3BlbncgKG91dHB1dF9maWxlLCBvdXRwdXRfZm9ybWF0KTsKLSAgaWYgKG91dGJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAob3V0cHV0X2ZpbGUpOwotICBpZiAoISBiZmRfc2V0X2Zvcm1hdCAob3V0YmZkLCBiZmRfb2JqZWN0KSkKLSAgICBiZmRfZmF0YWwgKG91dHB1dF9maWxlKTsKLQotICBhc3NlcnQgKGJmZF9nZXRfZmxhdm91ciAob3V0YmZkKSA9PSBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyKTsKLQotICBpZiAoYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgKGluYmZkLCBvdXRiZmQpID09IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgXygiJXM6IHdhcm5pbmc6aW5wdXQgYW5kIG91dHB1dCBmb3JtYXRzIGFyZSBub3QgY29tcGF0aWJsZVxuIiksCi0JICAgICBwcm9ncmFtX25hbWUpOwotCi0gIC8qIE1vdmUgdGhlIHZhbHVlcyByZWFkIGZyb20gdGhlIGNvbW1hbmQgZmlsZSBpbnRvIG91dGJmZC4gICovCi0gICpubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpID0gZml4ZWRfaGRyX3N0cnVjdDsKLSAgKm5sbV92YXJpYWJsZV9oZWFkZXIgKG91dGJmZCkgPSB2YXJfaGRyX3N0cnVjdDsKLSAgKm5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKSA9IHZlcnNpb25faGRyX3N0cnVjdDsKLSAgKm5sbV9jb3B5cmlnaHRfaGVhZGVyIChvdXRiZmQpID0gY29weXJpZ2h0X2hkcl9zdHJ1Y3Q7Ci0gICpubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpID0gZXh0ZW5kZWRfaGRyX3N0cnVjdDsKLQotICAvKiBTdGFydCBjb3B5aW5nIHRoZSBpbnB1dCBCRkQgdG8gdGhlIG91dHB1dCBCRkQuICAqLwotICBpZiAoISBiZmRfc2V0X2ZpbGVfZmxhZ3MgKG91dGJmZCwgYmZkX2dldF9maWxlX2ZsYWdzIChpbmJmZCkpKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAob3V0YmZkKSk7Ci0KLSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChpbmJmZCk7Ci0gIGlmIChzeW1zaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOwotICBzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChpbmJmZCwgc3ltYm9scyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIC5ic3Mgc2VjdGlvbi4gICovCi0gIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBpZiAoYnNzX3NlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJzc19zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gICAgICBpZiAoYnNzX3NlYyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBic3Nfc2VjLCBTRUNfQUxMT0MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG91dGJmZCwgYnNzX3NlYywgMSkpCi0JYmZkX2ZhdGFsIChfKCJtYWtlIC5ic3Mgc2VjdGlvbiIpKTsKLSAgICB9Ci0KLSAgLyogV2Ugc3RvcmUgdGhlIG9yaWdpbmFsIHNlY3Rpb24gbmFtZXMgaW4gdGhlIC5ubG1zZWN0aW9ucyBzZWN0aW9uLAotICAgICBzbyB0aGF0IHByb2dyYW1zIHdoaWNoIHVuZGVyc3RhbmQgaXQgY2FuIHJlc3VycmVjdCB0aGUgb3JpZ2luYWwKLSAgICAgc2VjdGlvbnMgZnJvbSB0aGUgTkxNLiAgV2Ugd2lsbCBwdXQgYSBwb2ludGVyIHRvIC5ubG1zZWN0aW9ucyBpbgotICAgICB0aGUgTkxNIGhlYWRlciBhcmVhLiAgKi8KLSAgc2Vjc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbXNlY3Rpb25zIik7Ci0gIGlmIChzZWNzZWMgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKF8oIm1ha2UgLm5sbXNlY3Rpb25zIHNlY3Rpb24iKSk7Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBzZWNzZWMsIFNFQ19IQVNfQ09OVEVOVFMpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9ucyBmbGFncyIpKTsKLQotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotICAvKiBGb3IgUG93ZXJQQyBOZXRXYXJlIHdlIG5lZWQgdG8gYnVpbGQgc3R1YnMgZm9yIGNhbGxzIHRvIHVuZGVmaW5lZAotICAgICBzeW1ib2xzLiAgQmVjYXVzZSBlYWNoIHN0dWIgcmVxdWlyZXMgYW4gZW50cnkgaW4gdGhlIFRPQyBzZWN0aW9uCi0gICAgIHdoaWNoIG11c3QgYmUgYXQgdGhlIHNhbWUgbG9jYXRpb24gYXMgb3RoZXIgZW50cmllcyBpbiB0aGUgVE9DCi0gICAgIHNlY3Rpb24sIHdlIG11c3QgZG8gdGhpcyBiZWZvcmUgZGV0ZXJtaW5pbmcgd2hlcmUgdGhlIFRPQyBzZWN0aW9uCi0gICAgIGdvZXMgaW4gc2V0dXBfc2VjdGlvbnMuICAqLwotICBpZiAoYmZkX2dldF9hcmNoIChpbmJmZCkgPT0gYmZkX2FyY2hfcG93ZXJwYykKLSAgICBwb3dlcnBjX2J1aWxkX3N0dWJzIChpbmJmZCwgb3V0YmZkLCAmc3ltYm9scywgJnN5bWNvdW50KTsKLSNlbmRpZgotCi0gIC8qIFNldCB1cCB0aGUgc2VjdGlvbnMuICAqLwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGluYmZkLCBzZXR1cF9zZWN0aW9ucywgKFBUUikgb3V0YmZkKTsKLQotICB0ZXh0X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsIE5MTV9DT0RFX05BTUUpOwotCi0gIC8qIFRoZSAuYnNzIHNlY3Rpb24gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgLmRhdGEgc2VjdGlvbi4gICovCi0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dGJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGlmIChkYXRhX3NlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgYWRkOwotCi0gICAgICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGRhdGFfc2VjKTsKLSAgICAgIGFsaWduID0gMSA8PCBic3Nfc2VjLT5hbGlnbm1lbnRfcG93ZXI7Ci0gICAgICBhZGQgPSAoKHZtYSArIGFsaWduIC0gMSkgJn4gKGFsaWduIC0gMSkpIC0gdm1hOwotICAgICAgdm1hICs9IGFkZDsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKG91dGJmZCwgYnNzX3NlYywgdm1hKSkKLQliZmRfZmF0YWwgKF8oInNldCAuYnNzIHZtYSIpKTsKLSAgICAgIGlmIChhZGQgIT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGRhdGFfc2l6ZTsKLQotCSAgZGF0YV9zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChkYXRhX3NlYyk7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBkYXRhX3NlYywgZGF0YV9zaXplICsgYWRkKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJzZXQgLmRhdGEgc2l6ZSIpKTsKLQl9Ci0gICAgfQotCi0gIC8qIEFkanVzdCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBpbmxlYWQgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGluYmZkKTsKLSAgb3V0bGVhZCA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob3V0YmZkKTsKLSAgZ290c3RhcnQgPSBmYWxzZTsKLSAgZ290ZXhpdCA9IGZhbHNlOwotICBnb3RjaGVjayA9IGZhbHNlOwotICBuZXdzeW1hbGxvYyA9IDEwOwotICBuZXdzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKG5ld3N5bWFsbG9jICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgbmV3c3ltY291bnQgPSAwOwotICBlbmRzeW0gPSBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgc3ltY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICByZWdpc3RlciBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHN5bSA9IHN5bWJvbHNbaV07Ci0KLSAgICAgIC8qIEFkZCBvciByZW1vdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuICAqLwotICAgICAgaWYgKGlubGVhZCAhPSBvdXRsZWFkKQotCXsKLQkgIGlmIChpbmxlYWQgIT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pWzBdID09IGlubGVhZCkKLQkJewotCQkgIGlmIChvdXRsZWFkID09ICdcMCcpCi0JCSAgICArK3N5bS0+bmFtZTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKm5ldzsKLQotCQkgICAgICBuZXcgPSB4bWFsbG9jIChzdHJsZW4gKGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpICsgMSk7Ci0JCSAgICAgIG5ld1swXSA9IG91dGxlYWQ7Ci0JCSAgICAgIHN0cmNweSAobmV3ICsgMSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSArIDEpOwotCQkgICAgICBzeW0tPm5hbWUgPSBuZXc7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqbmV3OwotCi0JICAgICAgbmV3ID0geG1hbGxvYyAoc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSArIDIpOwotCSAgICAgIG5ld1swXSA9IG91dGxlYWQ7Ci0JICAgICAgc3RyY3B5IChuZXcgKyAxLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKTsKLQkgICAgICBzeW0tPm5hbWUgPSBuZXc7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE5MTSdzIGhhdmUgYW4gdW5pbml0aWFsaXplZCBkYXRhIHNlY3Rpb24sIGJ1dCB0aGV5IGRvIG5vdAotCSBoYXZlIGEgY29tbW9uIHNlY3Rpb24gaW4gdGhlIFVuaXggc2Vuc2UuICBNb3ZlIGFsbCBjb21tb24KLQkgc3ltYm9scyBpbnRvIHRoZSAuYnNzIHNlY3Rpb24sIGFuZCBtYXJrIHRoZW0gYXMgZXhwb3J0ZWQuICAqLwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICBiZmRfdm1hIHNpemU7Ci0KLQkgIHN5bS0+c2VjdGlvbiA9IGJzc19zZWM7Ci0JICBzaXplID0gc3ltLT52YWx1ZTsKLQkgIHN5bS0+dmFsdWUgPSBic3Nfc2VjLT5fcmF3X3NpemU7Ci0JICBic3Nfc2VjLT5fcmF3X3NpemUgKz0gc2l6ZTsKLQkgIGFsaWduID0gMSA8PCBic3Nfc2VjLT5hbGlnbm1lbnRfcG93ZXI7Ci0JICBic3Nfc2VjLT5fcmF3X3NpemUgPSAoYnNzX3NlYy0+X3Jhd19zaXplICsgYWxpZ24gLSAxKSAmfiAoYWxpZ24gLSAxKTsKLQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCXsKLQkgIC8qIE1vdmUgdGhlIHN5bWJvbCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBzeW0tPnZhbHVlICs9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+b3V0cHV0X29mZnNldDsKLQkgIHN5bS0+c2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+b3V0cHV0X3NlY3Rpb247Ci0JICAvKiBUaGlzIGlzIG5vIGxvbmdlciBhIHNlY3Rpb24gc3ltYm9sLiAgKi8KLQkgIHN5bS0+ZmxhZ3MgJj1+IEJTRl9TRUNUSU9OX1NZTTsKLQl9Ci0KLSAgICAgIC8qIEZvcmNlIF9lZGF0YSBhbmQgX2VuZCB0byBiZSBkZWZpbmVkLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZQotCSBkb25lIGJ5IHRoZSBsaW5rZXIsIGJ1dCB0aGUgbWFuaXB1bGF0aW9uIG9mIHRoZSBjb21tb24KLQkgc3ltYm9scyB3aWxsIGNvbmZ1c2UgaXQuICAqLwotICAgICAgaWYgKChzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykgPT0gMAotCSAgJiYgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKVswXSA9PSAnXycKLQkgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiX2VkYXRhIikgPT0gMCkKLQkgICAgewotCSAgICAgIHN5bS0+c2VjdGlvbiA9IGJzc19zZWM7Ci0JICAgICAgc3ltLT52YWx1ZSA9IDA7Ci0JICAgIH0KLQkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJfZW5kIikgPT0gMCkKLQkgICAgewotCSAgICAgIHN5bS0+c2VjdGlvbiA9IGJzc19zZWM7Ci0JICAgICAgZW5kc3ltID0gc3ltOwotCSAgICB9Ci0KLSNpZmRlZiBOTE1DT05WX1BPV0VSUEMKLQkgIC8qIEZvciBQb3dlclBDIE5ldFdhcmUsIHdlIGRlZmluZSBfX0dPVDAuICBUaGlzIGlzIHRoZSBzdGFydAotCSAgICAgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0JICBpZiAoYmZkX2dldF9hcmNoIChpbmJmZCkgPT0gYmZkX2FyY2hfcG93ZXJwYwotCSAgICAgICYmIHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgIl9fR09UMCIpID09IDApCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqZ290X3NlYzsKLQotCSAgICAgIGdvdF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5iZmQsICIuZ290Iik7Ci0JICAgICAgYXNzZXJ0IChnb3Rfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKTsKLQkgICAgICBzeW0tPnZhbHVlID0gZ290X3NlYy0+b3V0cHV0X29mZnNldDsKLQkgICAgICBzeW0tPnNlY3Rpb24gPSBnb3Rfc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkgICAgfQotI2VuZGlmCi0gCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wsIGNoZWNrIHRoZSBleHBvcnQgbGlzdC4gICovCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUwpKSAhPSAwKQotCXsKLQkgIHJlZ2lzdGVyIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDsKLQkgIGludCBmb3VuZF9zaW1wbGU7Ci0KLQkgIC8qIFVuZm9ydHVuYXRlbHksIGEgc3ltYm9sIGNhbiBhcHBlYXIgbXVsdGlwbGUgdGltZXMgb24gdGhlCi0JICAgICBleHBvcnQgbGlzdCwgd2l0aCBhbmQgd2l0aG91dCBwcmVmaXhlcy4gICovCi0JICBmb3VuZF9zaW1wbGUgPSAwOwotCSAgZm9yIChsID0gZXhwb3J0X3N5bWJvbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChsLT5zdHJpbmcsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpID09IDApCi0JCWZvdW5kX3NpbXBsZSA9IDE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqemJhc2U7Ci0KLQkJICB6YmFzZSA9IHN0cmNociAobC0+c3RyaW5nLCAnQCcpOwotCQkgIGlmICh6YmFzZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cmNtcCAoemJhc2UgKyAxLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBXZSBtdXN0IGFkZCBhIHN5bWJvbCB3aXRoIHRoaXMgcHJlZml4LiAgKi8KLQkJICAgICAgaWYgKG5ld3N5bWNvdW50ID49IG5ld3N5bWFsbG9jKQotCQkJewotCQkJICBuZXdzeW1hbGxvYyArPSAxMDsKLQkJCSAgbmV3c3ltcyA9ICgoYXN5bWJvbCAqKikKLQkJCQkgICAgIHhyZWFsbG9jICgoUFRSKSBuZXdzeW1zLAotCQkJCQkgICAgICAgKG5ld3N5bWFsbG9jCi0JCQkJCQkqIHNpemVvZiAoYXN5bWJvbCAqKSkpKTsKLQkJCX0KLQkJICAgICAgbmV3c3ltc1tuZXdzeW1jb3VudF0gPQotCQkJKGFzeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sKSk7Ci0JCSAgICAgICpuZXdzeW1zW25ld3N5bWNvdW50XSA9ICpzeW07Ci0JCSAgICAgIG5ld3N5bXNbbmV3c3ltY291bnRdLT5uYW1lID0gbC0+c3RyaW5nOwotCQkgICAgICArK25ld3N5bWNvdW50OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGlmICghIGZvdW5kX3NpbXBsZSkKLQkgICAgewotCSAgICAgIC8qIFRoZSB1bm1vZGlmaWVkIHN5bWJvbCBpcyBhY3R1YWxseSBub3QgZXhwb3J0ZWQgYXQKLQkJIGFsbC4gICovCi0JICAgICAgc3ltLT5mbGFncyAmPX4gKEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUKTsKLQkgICAgICBzeW0tPmZsYWdzIHw9IEJTRl9MT0NBTDsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgaXQncyBhbiB1bmRlZmluZWQgc3ltYm9sLCBzZWUgaWYgaXQncyBvbiB0aGUgaW1wb3J0IGxpc3QuCi0JIENoYW5nZSB0aGUgcHJlZml4IGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCXsKLQkgIHJlZ2lzdGVyIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDsKLQotCSAgZm9yIChsID0gaW1wb3J0X3N5bWJvbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChsLT5zdHJpbmcsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpID09IDApCi0JCWJyZWFrOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKnpiYXNlOwotCi0JCSAgemJhc2UgPSBzdHJjaHIgKGwtPnN0cmluZywgJ0AnKTsKLQkJICBpZiAoemJhc2UgIT0gTlVMTAotCQkgICAgICAmJiBzdHJjbXAgKHpiYXNlICsgMSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgc3ltLT5uYW1lID0gbC0+c3RyaW5nOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBpZiAobCA9PSBOVUxMKQotCSAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgXygiJXM6IHdhcm5pbmc6IHN5bWJvbCAlcyBpbXBvcnRlZCBidXQgbm90IGluIGltcG9ydCBsaXN0XG4iKSwKLQkJICAgICBwcm9ncmFtX25hbWUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpOwotCX0KLQkKLSAgICAgIC8qIFNlZSBpZiBpdCdzIG9uZSBvZiB0aGUgc3BlY2lhbCBuYW1lZCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpID09IDApCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIC8qIEZJWE1FOiBJZiB0aGVzZSBzeW1ib2xzIGFyZSBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIHdlCi0JICAgICBhZGQgdGhlIC50ZXh0IHNlY3Rpb24gc2l6ZSB0byB0aGUgdmFsdWUuICBUaGlzIG1heSBub3QgYmUKLQkgICAgIGNvcnJlY3QgZm9yIGFsbCB0YXJnZXRzLiAgSSdtIG5vdCBzdXJlIGhvdyB0aGlzIHNob3VsZAotCSAgICAgcmVhbGx5IGJlIGhhbmRsZWQuICAqLwotCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgc3RhcnRfcHJvY2VkdXJlKSA9PSAwKQotCSAgICB7Ci0JICAgICAgdmFsID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSA9PSBkYXRhX3NlYwotCQkgICYmIHRleHRfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCQl2YWwgKz0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCB0ZXh0X3NlYyk7Ci0JICAgICAgaWYgKCEgYmZkX3NldF9zdGFydF9hZGRyZXNzIChvdXRiZmQsIHZhbCkpCi0JCWJmZF9mYXRhbCAoXygic2V0IHN0YXJ0IGFkZHJlc3MiKSk7Ci0JICAgICAgZ290c3RhcnQgPSB0cnVlOwotCSAgICB9Ci0JICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCBleGl0X3Byb2NlZHVyZSkgPT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgPT0gZGF0YV9zZWMKLQkJICAmJiB0ZXh0X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJdmFsICs9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgdGV4dF9zZWMpOwotCSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmV4aXRQcm9jZWR1cmVPZmZzZXQgPSB2YWw7Ci0JICAgICAgZ290ZXhpdCA9IHRydWU7Ci0JICAgIH0KLQkgIGlmIChjaGVja19wcm9jZWR1cmUgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgY2hlY2tfcHJvY2VkdXJlKSA9PSAwKQotCSAgICB7Ci0JICAgICAgdmFsID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSA9PSBkYXRhX3NlYwotCQkgICYmIHRleHRfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCQl2YWwgKz0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCB0ZXh0X3NlYyk7Ci0JICAgICAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQgPSB2YWw7Ci0JICAgICAgZ290Y2hlY2sgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZW5kc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgZW5kc3ltLT52YWx1ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoYnNzX3NlYyk7Ci0KLSAgICAgIC8qIEZJWE1FOiBJZiBhbnkgcmVsb2NzIHJlZmVycmluZyB0byBfZW5kIHVzZSBpbnBsYWNlIGFkZGVuZHMsCi0JIHRoZW4gSSB0aGluayB0aGV5IG5lZWQgdG8gYmUgdXBkYXRlZC4gIFRoaXMgaXMgaGFuZGxlZCBieQotCSBpMzg2X21hbmdsZV9yZWxvY3MuICBJcyBpdCBuZWVkZWQgZm9yIGFueSBvdGhlciBvYmplY3QKLQkgZm9ybWF0cz8gICovCi0gICAgfQotCi0gIGlmIChuZXdzeW1jb3VudCA9PSAwKQotICAgIG91dHN5bXMgPSBzeW1ib2xzOwotICBlbHNlCi0gICAgewotICAgICAgb3V0c3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jICgoc3ltY291bnQgKyBuZXdzeW1jb3VudCArIDEpCi0JCQkJICAgICAgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgbWVtY3B5IChvdXRzeW1zLCBzeW1ib2xzLCBzeW1jb3VudCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBtZW1jcHkgKG91dHN5bXMgKyBzeW1jb3VudCwgbmV3c3ltcywgbmV3c3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgb3V0c3ltc1tzeW1jb3VudCArIG5ld3N5bWNvdW50XSA9IE5VTEw7Ci0gICAgfQotCi0gIGJmZF9zZXRfc3ltdGFiIChvdXRiZmQsIG91dHN5bXMsIHN5bWNvdW50ICsgbmV3c3ltY291bnQpOwotICAgIAotICBpZiAoISBnb3RzdGFydCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBTVEFSVCBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lLCBzdGFydF9wcm9jZWR1cmUpOwotICBpZiAoISBnb3RleGl0KQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6IEVYSVQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgZXhpdF9wcm9jZWR1cmUpOwotICBpZiAoY2hlY2tfcHJvY2VkdXJlICE9IE5VTEwKLSAgICAgICYmICEgZ290Y2hlY2spCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogQ0hFQ0sgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgY2hlY2tfcHJvY2VkdXJlKTsKLQotICAvKiBBZGQgYWRkaXRpb25hbCBzZWN0aW9ucyByZXF1aXJlZCBmb3IgdGhlIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChjdXN0b21fZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGN1c3RvbV9kYXRhID0gZm9wZW4gKGN1c3RvbV9maWxlLCAiciIpOwotICAgICAgaWYgKGN1c3RvbV9kYXRhID09IE5VTEwKLQkgIHx8IGZzdGF0IChmaWxlbm8gKGN1c3RvbV9kYXRhKSwgJnN0KSA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIGN1c3RvbV9maWxlLAotCQkgICBzdHJlcnJvciAoZXJybm8pKTsKLQkgIGN1c3RvbV9maWxlID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VzdG9tX3NpemUgPSBzdC5zdF9zaXplOwotCSAgY3VzdG9tX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsICIubmxtY3VzdG9tIik7Ci0JICBpZiAoY3VzdG9tX3NlY3Rpb24gPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgY3VzdG9tX3NlY3Rpb24sIGN1c3RvbV9zaXplKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIGN1c3RvbV9zZWN0aW9uLAotCQkJCQkgIFNFQ19IQVNfQ09OVEVOVFMpKQotCSAgICBiZmRfZmF0YWwgKF8oImN1c3RvbSBzZWN0aW9uIikpOwotCX0KLSAgICB9Ci0gIGlmIChoZWxwX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBoZWxwX2RhdGEgPSBmb3BlbiAoaGVscF9maWxlLCAiciIpOwotICAgICAgaWYgKGhlbHBfZGF0YSA9PSBOVUxMCi0JICB8fCBmc3RhdCAoZmlsZW5vIChoZWxwX2RhdGEpLCAmc3QpIDwgMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgaGVscF9maWxlLAotCQkgICBzdHJlcnJvciAoZXJybm8pKTsKLQkgIGhlbHBfZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGhlbHBfc2l6ZSA9IHN0LnN0X3NpemU7Ci0JICBoZWxwX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsICIubmxtaGVscCIpOwotCSAgaWYgKGhlbHBfc2VjdGlvbiA9PSBOVUxMCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBoZWxwX3NlY3Rpb24sIGhlbHBfc2l6ZSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBoZWxwX3NlY3Rpb24sCi0JCQkJCSAgU0VDX0hBU19DT05URU5UUykpCi0JICAgIGJmZF9mYXRhbCAoXygiaGVscCBzZWN0aW9uIikpOwotCSAgc3RybmNweSAobmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c3RhbXAsICJNZVNzQWdFcyIsIDgpOwotCX0KLSAgICB9Ci0gIGlmIChtZXNzYWdlX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtZXNzYWdlX2RhdGEgPSBmb3BlbiAobWVzc2FnZV9maWxlLCAiciIpOwotICAgICAgaWYgKG1lc3NhZ2VfZGF0YSA9PSBOVUxMCi0JICB8fCBmc3RhdCAoZmlsZW5vIChtZXNzYWdlX2RhdGEpLCAmc3QpIDwgMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgbWVzc2FnZV9maWxlLAotCQkgICBzdHJlcnJvciAoZXJybm8pKTsKLQkgIG1lc3NhZ2VfZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lc3NhZ2Vfc2l6ZSA9IHN0LnN0X3NpemU7Ci0JICBtZXNzYWdlX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsICIubmxtbWVzc2FnZXMiKTsKLQkgIGlmIChtZXNzYWdlX3NlY3Rpb24gPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgbWVzc2FnZV9zZWN0aW9uLCBtZXNzYWdlX3NpemUpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgbWVzc2FnZV9zZWN0aW9uLAotCQkJCQkgIFNFQ19IQVNfQ09OVEVOVFMpKQotCSAgICBiZmRfZmF0YWwgKF8oIm1lc3NhZ2Ugc2VjdGlvbiIpKTsKLQkgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQl9Ci0gICAgfQotICBpZiAobW9kdWxlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDsKLQotICAgICAgbW9kdWxlX3NpemUgPSAwOwotICAgICAgZm9yIChsID0gbW9kdWxlczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQltb2R1bGVfc2l6ZSArPSBzdHJsZW4gKGwtPnN0cmluZykgKyAxOwotICAgICAgbW9kdWxlX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsICIubmxtbW9kdWxlcyIpOwotICAgICAgaWYgKG1vZHVsZV9zZWN0aW9uID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgbW9kdWxlX3NlY3Rpb24sIG1vZHVsZV9zaXplKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgbW9kdWxlX3NlY3Rpb24sCi0JCQkJICAgICAgU0VDX0hBU19DT05URU5UUykpCi0JYmZkX2ZhdGFsIChfKCJtb2R1bGUgc2VjdGlvbiIpKTsKLSAgICB9Ci0gIGlmIChycGNfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJwY19kYXRhID0gZm9wZW4gKHJwY19maWxlLCAiciIpOwotICAgICAgaWYgKHJwY19kYXRhID09IE5VTEwKLQkgIHx8IGZzdGF0IChmaWxlbm8gKHJwY19kYXRhKSwgJnN0KSA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHJwY19maWxlLAotCQkgICBzdHJlcnJvciAoZXJybm8pKTsKLQkgIHJwY19maWxlID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcnBjX3NpemUgPSBzdC5zdF9zaXplOwotCSAgcnBjX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsICIubmxtcnBjIik7Ci0JICBpZiAocnBjX3NlY3Rpb24gPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgcnBjX3NlY3Rpb24sIHJwY19zaXplKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIHJwY19zZWN0aW9uLAotCQkJCQkgIFNFQ19IQVNfQ09OVEVOVFMpKQotCSAgICBiZmRfZmF0YWwgKF8oInJwYyBzZWN0aW9uIikpOwotCSAgc3RybmNweSAobmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c3RhbXAsICJNZVNzQWdFcyIsIDgpOwotCX0KLSAgICB9Ci0gIGlmIChzaGFyZWxpYl9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgc2hhcmVkYmZkID0gYmZkX29wZW5yIChzaGFyZWxpYl9maWxlLCBvdXRwdXRfZm9ybWF0KTsKLSAgICAgIGlmIChzaGFyZWRiZmQgPT0gTlVMTAotCSAgfHwgISBiZmRfY2hlY2tfZm9ybWF0IChzaGFyZWRiZmQsIGJmZF9vYmplY3QpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzaGFyZWxpYl9maWxlLAotCQkgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICBzaGFyZWxpYl9maWxlID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2hhcmVkaGRyID0gKm5sbV9maXhlZF9oZWFkZXIgKHNoYXJlZGJmZCk7Ci0JICBiZmRfY2xvc2UgKHNoYXJlZGJmZCk7Ci0JICBzaGFyZWRfZGF0YSA9IGZvcGVuIChzaGFyZWxpYl9maWxlLCAiciIpOwotCSAgaWYgKHNoYXJlZF9kYXRhID09IE5VTEwKLQkgICAgICB8fCAoZnN0YXQgKGZpbGVubyAoc2hhcmVkX2RhdGEpLCAmc3QpIDwgMCkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgc2hhcmVsaWJfZmlsZSwKLQkJICAgICAgIHN0cmVycm9yIChlcnJubykpOwotCSAgICAgIHNoYXJlbGliX2ZpbGUgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSB3ZXJlIGNsZXZlciwgd2UgY291bGQganVzdCBjb3B5IG91dCB0aGUKLQkJIHNlY3Rpb25zIG9mIHRoZSBzaGFyZWQgbGlicmFyeSB3aGljaCB3ZSBhY3R1YWxseQotCQkgbmVlZC4gIEhvd2V2ZXIsIHdlIHdvdWxkIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgc2l6ZXMKLQkJIG9mIHRoZSBleHRlcm5hbCBhbmQgcHVibGljIGluZm9ybWF0aW9uLCBhbmQgdGhhdCBjYW4KLQkJIG5vdCBiZSBkb25lIHdpdGhvdXQgcmVhZGluZyB0aHJvdWdoIHRoZW0uICAqLwotCSAgICAgIGlmIChzaGFyZWRoZHIudW5pbml0aWFsaXplZERhdGFTaXplID4gMCkKLQkJewotCQkgIC8qIFRoZXJlIGlzIG5vIHBsYWNlIHRvIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uLiAgKi8KLQkJICBmcHJpbnRmIChzdGRlcnIsCi0JCQkgICBfKCIlczolczogd2FybmluZzogc2hhcmVkIGxpYnJhcmllcyBjYW4gbm90IGhhdmUgdW5pbml0aWFsaXplZCBkYXRhXG4iKSwKLQkJCSAgIHByb2dyYW1fbmFtZSwgc2hhcmVsaWJfZmlsZSk7Ci0JCX0KLQkgICAgICBzaGFyZWRfb2Zmc2V0ID0gc3Quc3Rfc2l6ZTsKLQkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5jb2RlSW1hZ2VPZmZzZXQpCi0JCXNoYXJlZF9vZmZzZXQgPSBzaGFyZWRoZHIuY29kZUltYWdlT2Zmc2V0OwotCSAgICAgIGlmIChzaGFyZWRfb2Zmc2V0ID4gKHNpemVfdCkgc2hhcmVkaGRyLmRhdGFJbWFnZU9mZnNldCkKLQkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5kYXRhSW1hZ2VPZmZzZXQ7Ci0JICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIucmVsb2NhdGlvbkZpeHVwT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLnJlbG9jYXRpb25GaXh1cE9mZnNldDsKLQkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQpCi0JCXNoYXJlZF9vZmZzZXQgPSBzaGFyZWRoZHIuZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0OwotCSAgICAgIGlmIChzaGFyZWRfb2Zmc2V0ID4gKHNpemVfdCkgc2hhcmVkaGRyLnB1YmxpY3NPZmZzZXQpCi0JCXNoYXJlZF9vZmZzZXQgPSBzaGFyZWRoZHIucHVibGljc09mZnNldDsKLQkgICAgICBzaGFyZWRfc2l6ZSA9IHN0LnN0X3NpemUgLSBzaGFyZWRfb2Zmc2V0OwotCSAgICAgIHNoYXJlZF9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbXNoYXJlZCIpOwotCSAgICAgIGlmIChzaGFyZWRfc2VjdGlvbiA9PSBOVUxMCi0JCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBzaGFyZWRfc2VjdGlvbiwKLQkJCQkJICAgICBzaGFyZWRfc2l6ZSkKLQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBzaGFyZWRfc2VjdGlvbiwKLQkJCQkJICAgICAgU0VDX0hBU19DT05URU5UUykpCi0JCWJmZF9mYXRhbCAoXygic2hhcmVkIHNlY3Rpb24iKSk7Ci0JICAgICAgc3RybmNweSAobmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c3RhbXAsICJNZVNzQWdFcyIsIDgpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBDaGVjayB3aGV0aGVyIGEgdmVyc2lvbiB3YXMgZ2l2ZW4uICAqLwotICBpZiAoc3RybmNtcCAodmVyc2lvbl9oZHItPnN0YW1wLCAiVmVSc0lvTiMiLCA4KSAhPSAwKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6IE5vIHZlcnNpb24gbnVtYmVyIGdpdmVuXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSk7Ci0KLSAgLyogQXQgbGVhc3QgZm9yIG5vdywgYWx3YXlzIGNyZWF0ZSBhbiBleHRlbmRlZCBoZWFkZXIsIGJlY2F1c2UgdGhhdAotICAgICBpcyB3aGF0IE5MTUxJTksgZG9lcy4gICovCi0gIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQotICBzdHJuY3B5IChubG1fY3lnbnVzX2V4dF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiQ3lHblVzRXgiLCA4KTsKLQotICAvKiBJZiB0aGUgZGF0ZSB3YXMgbm90IGdpdmVuLCBmb3JjZSBpdCBpbi4gICovCi0gIGlmIChubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPm1vbnRoID09IDAKLSAgICAgICYmIG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+ZGF5ID09IDAKLSAgICAgICYmIG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+eWVhciA9PSAwKQotICAgIHsKLSAgICAgIHRpbWVfdCBub3c7Ci0gICAgICBzdHJ1Y3QgdG0gKnB0bTsKLQotICAgICAgdGltZSAoJm5vdyk7Ci0gICAgICBwdG0gPSBsb2NhbHRpbWUgKCZub3cpOwotICAgICAgbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT5tb250aCA9IHB0bS0+dG1fbW9uICsgMTsKLSAgICAgIG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+ZGF5ID0gcHRtLT50bV9tZGF5OwotICAgICAgbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT55ZWFyID0gcHRtLT50bV95ZWFyICsgMTkwMDsKLSAgICAgIHN0cm5jcHkgKHZlcnNpb25faGRyLT5zdGFtcCwgIlZlUnNJb04jIiwgOCk7Ci0gICAgfQotCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0gIC8qIFJlc29sdmUgdGhlIHN0dWJzIHdlIGJ1aWxkIGZvciBQb3dlclBDIE5ldFdhcmUuICAqLwotICBpZiAoYmZkX2dldF9hcmNoIChpbmJmZCkgPT0gYmZkX2FyY2hfcG93ZXJwYykKLSAgICBwb3dlcnBjX3Jlc29sdmVfc3R1YnMgKGluYmZkLCBvdXRiZmQpOwotI2VuZGlmCi0KLSAgLyogQ29weSBvdmVyIHRoZSBzZWN0aW9ucy4gICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaW5iZmQsIGNvcHlfc2VjdGlvbnMsIChQVFIpIG91dGJmZCk7Ci0KLSAgLyogRmluaXNoIHVwIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotICBpZiAoY3VzdG9tX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKGN1c3RvbV9zaXplKTsKLSAgICAgIGlmIChmcmVhZCAoZGF0YSwgMSwgY3VzdG9tX3NpemUsIGN1c3RvbV9kYXRhKSAhPSBjdXN0b21fc2l6ZSkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgY3VzdG9tX2ZpbGUsCi0JCSBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgY3VzdG9tX3NlY3Rpb24sIGRhdGEsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBjdXN0b21fc2l6ZSkpCi0JICAgIGJmZF9mYXRhbCAoXygiY3VzdG9tIHNlY3Rpb24iKSk7Ci0JICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5jdXN0b21EYXRhT2Zmc2V0ID0KLQkgICAgY3VzdG9tX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5jdXN0b21EYXRhU2l6ZSA9IGN1c3RvbV9zaXplOwotCX0KLSAgICAgIGZyZWUgKGRhdGEpOwotICAgIH0KLSAgaWYgKCEgZGVidWdfaW5mbykKLSAgICB7Ci0gICAgICAvKiBBcyBhIHNwZWNpYWwgaGFjaywgdGhlIGJhY2tlbmQgcmVjb2duaXplcyBhIGRlYnVnSW5mb09mZnNldAotCSBvZiAtMSB0byBtZWFuIHRoYXQgaXQgc2hvdWxkIG5vdCBvdXRwdXQgYW55IGRlYnVnZ2luZwotCSBpbmZvcm1hdGlvbi4gIFRoaXMgY2FuIG5vdCBiZSBoYW5kbGluZyBieSBmaWRkbGluZyB3aXRoIHRoZQotCSBzeW1ib2wgdGFibGUgYmVjYXVzZSBleHBvcnRlZCBzeW1ib2xzIGFwcGVhciBpbiBib3RoIHRoZQotCSBleHBvcnQgaW5mb3JtYXRpb24gYW5kIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID0gKGZpbGVfcHRyKSAtMTsKLSAgICB9Ci0gIGlmIChtYXBfZmlsZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgIF8oIiVzOiB3YXJuaW5nOiBNQVAgYW5kIEZVTExNQVAgYXJlIG5vdCBzdXBwb3J0ZWQ7IHRyeSBsZCAtTVxuIiksCi0JICAgICBwcm9ncmFtX25hbWUpOwotICBpZiAoaGVscF9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChoZWxwX3NpemUpOwotICAgICAgaWYgKGZyZWFkIChkYXRhLCAxLCBoZWxwX3NpemUsIGhlbHBfZGF0YSkgIT0gaGVscF9zaXplKQotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6JXM6IHJlYWQ6ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBoZWxwX2ZpbGUsCi0JCSBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgaGVscF9zZWN0aW9uLCBkYXRhLAotCQkJCQkgIChmaWxlX3B0cikgMCwgaGVscF9zaXplKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJoZWxwIHNlY3Rpb24iKSk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5oZWxwRmlsZU9mZnNldCA9Ci0JICAgIGhlbHBfc2VjdGlvbi0+ZmlsZXBvczsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPmhlbHBGaWxlTGVuZ3RoID0gaGVscF9zaXplOwotCX0KLSAgICAgIGZyZWUgKGRhdGEpOwotICAgIH0KLSAgaWYgKG1lc3NhZ2VfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAobWVzc2FnZV9zaXplKTsKLSAgICAgIGlmIChmcmVhZCAoZGF0YSwgMSwgbWVzc2FnZV9zaXplLCBtZXNzYWdlX2RhdGEpICE9IG1lc3NhZ2Vfc2l6ZSkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgbWVzc2FnZV9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIG1lc3NhZ2Vfc2VjdGlvbiwgZGF0YSwKLQkJCQkJICAoZmlsZV9wdHIpIDAsIG1lc3NhZ2Vfc2l6ZSkpCi0JICAgIGJmZF9mYXRhbCAoXygibWVzc2FnZSBzZWN0aW9uIikpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+bWVzc2FnZUZpbGVPZmZzZXQgPQotCSAgICBtZXNzYWdlX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCA9IG1lc3NhZ2Vfc2l6ZTsKLQotCSAgLyogRklYTUU6IEFyZSB0aGVzZSBvZmZzZXRzIGNvcnJlY3Qgb24gYWxsIHBsYXRmb3Jtcz8gIEFyZQotCSAgICAgdGhleSAzMiBiaXRzIG9uIGFsbCBwbGF0Zm9ybXM/ICBXaGF0IGVuZGlhbm5lc3M/ICAqLwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+bGFuZ3VhZ2VJRCA9Ci0JICAgIGJmZF9oX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIDEwNik7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5tZXNzYWdlQ291bnQgPQotCSAgICBiZmRfaF9nZXRfMzIgKG91dGJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyAxMTApOwotCX0KLSAgICAgIGZyZWUgKGRhdGEpOwotICAgIH0KLSAgaWYgKG1vZHVsZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnNldDsKLSAgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDsKLSAgICAgIGJmZF9zaXplX3R5cGUgYzsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKG1vZHVsZV9zaXplKTsKLSAgICAgIGMgPSAwOwotICAgICAgc2V0ID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YTsKLSAgICAgIGZvciAobCA9IG1vZHVsZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JewotCSAgKnNldCA9IHN0cmxlbiAobC0+c3RyaW5nKTsKLQkgIHN0cm5jcHkgKHNldCArIDEsIGwtPnN0cmluZywgKnNldCk7Ci0JICBzZXQgKz0gKnNldCArIDE7Ci0JICArK2M7Ci0JfQotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIG1vZHVsZV9zZWN0aW9uLCBkYXRhLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgbW9kdWxlX3NpemUpKQotCWJmZF9mYXRhbCAoXygibW9kdWxlIHNlY3Rpb24iKSk7Ci0gICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0ID0KLQltb2R1bGVfc2VjdGlvbi0+ZmlsZXBvczsKLSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzID0gYzsKLSAgICB9Ci0gIGlmIChycGNfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAocnBjX3NpemUpOwotICAgICAgaWYgKGZyZWFkIChkYXRhLCAxLCBycGNfc2l6ZSwgcnBjX2RhdGEpICE9IHJwY19zaXplKQotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6JXM6IHJlYWQ6ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBycGNfZmlsZSwKLQkJIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBycGNfc2VjdGlvbiwgZGF0YSwKLQkJCQkJICAoZmlsZV9wdHIpIDAsIHJwY19zaXplKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJycGMgc2VjdGlvbiIpKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPlJQQ0RhdGFPZmZzZXQgPQotCSAgICBycGNfc2VjdGlvbi0+ZmlsZXBvczsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPlJQQ0RhdGFMZW5ndGggPSBycGNfc2l6ZTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmIChzaGFyZWxpYl9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChzaGFyZWRfc2l6ZSk7Ci0gICAgICBpZiAoZnNlZWsgKHNoYXJlZF9kYXRhLCBzaGFyZWRfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgZnJlYWQgKGRhdGEsIDEsIHNoYXJlZF9zaXplLCBzaGFyZWRfZGF0YSkgIT0gc2hhcmVkX3NpemUpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIHNoYXJlbGliX2ZpbGUsCi0JCSBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgc2hhcmVkX3NlY3Rpb24sIGRhdGEsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBzaGFyZWRfc2l6ZSkpCi0JICAgIGJmZF9mYXRhbCAoXygic2hhcmVkIHNlY3Rpb24iKSk7Ci0JfQotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkQ29kZU9mZnNldCA9Ci0Jc2hhcmVkaGRyLmNvZGVJbWFnZU9mZnNldCAtIHNoYXJlZF9vZmZzZXQgKyBzaGFyZWRfc2VjdGlvbi0+ZmlsZXBvczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZENvZGVMZW5ndGggPQotCXNoYXJlZGhkci5jb2RlSW1hZ2VTaXplOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRGF0YU9mZnNldCA9Ci0Jc2hhcmVkaGRyLmRhdGFJbWFnZU9mZnNldCAtIHNoYXJlZF9vZmZzZXQgKyBzaGFyZWRfc2VjdGlvbi0+ZmlsZXBvczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZERhdGFMZW5ndGggPQotCXNoYXJlZGhkci5kYXRhSW1hZ2VTaXplOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID0KLQkoc2hhcmVkaGRyLnJlbG9jYXRpb25GaXh1cE9mZnNldAotCSAtIHNoYXJlZF9vZmZzZXQKLQkgKyBzaGFyZWRfc2VjdGlvbi0+ZmlsZXBvcyk7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCA9Ci0Jc2hhcmVkaGRyLm51bWJlck9mUmVsb2NhdGlvbkZpeHVwczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0ID0KLQkoc2hhcmVkaGRyLmV4dGVybmFsUmVmZXJlbmNlc09mZnNldAotCSAtIHNoYXJlZF9vZmZzZXQKLQkgKyBzaGFyZWRfc2VjdGlvbi0+ZmlsZXBvcyk7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZUNvdW50ID0KLQlzaGFyZWRoZHIubnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXM7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRQdWJsaWNzT2Zmc2V0ID0KLQlzaGFyZWRoZHIucHVibGljc09mZnNldCAtIHNoYXJlZF9vZmZzZXQgKyBzaGFyZWRfc2VjdGlvbi0+ZmlsZXBvczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZFB1YmxpY3NDb3VudCA9Ci0Jc2hhcmVkaGRyLm51bWJlck9mUHVibGljczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0ID0KLQlzaGFyZWRoZHIuZGVidWdJbmZvT2Zmc2V0IC0gc2hhcmVkX29mZnNldCArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRGVidWdSZWNvcmRDb3VudCA9Ci0Jc2hhcmVkaGRyLm51bWJlck9mRGVidWdSZWNvcmRzOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+U2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQgPQotCXNoYXJlZGhkci5jb2RlU3RhcnRPZmZzZXQ7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5TaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0ID0KLQlzaGFyZWRoZHIuZXhpdFByb2NlZHVyZU9mZnNldDsKLSAgICAgIGZyZWUgKGRhdGEpOwotICAgIH0KLSAgbGVuID0gc3RybGVuIChvdXRwdXRfZmlsZSk7Ci0gIGlmIChsZW4gPiBOTE1fTU9EVUxFX05BTUVfU0laRSAtIDIpCi0gICAgbGVuID0gTkxNX01PRFVMRV9OQU1FX1NJWkUgLSAyOwotICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5tb2R1bGVOYW1lWzBdID0gbGVuOwotCi0gIHN0cm5jcHkgKG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm1vZHVsZU5hbWUgKyAxLCBvdXRwdXRfZmlsZSwKLQkgICBOTE1fTU9EVUxFX05BTUVfU0laRSAtIDIpOwotICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5tb2R1bGVOYW1lW05MTV9NT0RVTEVfTkFNRV9TSVpFIC0gMV0gPSAnXDAnOwotICBmb3IgKG1vZG5hbWUgPSBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5tb2R1bGVOYW1lOwotICAgICAgICptb2RuYW1lICE9ICdcMCc7Ci0gICAgICAgbW9kbmFtZSsrKQotICAgIGlmIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgKm1vZG5hbWUpKQotICAgICAgKm1vZG5hbWUgPSB0b3VwcGVyICgqbW9kbmFtZSk7Ci0KLSAgc3RybmNweSAobmxtX3ZhcmlhYmxlX2hlYWRlciAob3V0YmZkKS0+b2xkVGhyZWFkTmFtZSwgIiBMT05HIiwKLQkgICBOTE1fT0xEX1RIUkVBRF9OQU1FX0xFTkdUSCk7Ci0KLSAgbmxtX2N5Z251c19leHRfaGVhZGVyIChvdXRiZmQpLT5vZmZzZXQgPSBzZWNzZWMtPmZpbGVwb3M7Ci0gIG5sbV9jeWdudXNfZXh0X2hlYWRlciAob3V0YmZkKS0+bGVuZ3RoID0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBzZWNzZWMpOwotCi0gIGlmICghIGJmZF9jbG9zZSAob3V0YmZkKSkKLSAgICBiZmRfZmF0YWwgKG91dHB1dF9maWxlKTsKLSAgaWYgKCEgYmZkX2Nsb3NlIChpbmJmZCkpCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLQotICBpZiAodW5saW5rX29uX2V4aXQgIT0gTlVMTCkKLSAgICB1bmxpbmsgKHVubGlua19vbl9leGl0KTsKLQotICByZXR1cm4gMDsKLX0KLQwKLS8qIERpc3BsYXkgYSBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuICAqLwotCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IENvbnZlcnQgYW4gb2JqZWN0IGZpbGUgaW50byBhIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLS8qIFNob3cgYSB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiXAotVXNhZ2U6ICVzIFstZGhWXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstVCBoZWFkZXItZmlsZV0gWy1sIGxpbmtlcl1cblwKLSAgICAgICBbLS1pbnB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tb3V0cHV0LXRhcmdldD1iZmRuYW1lXVxuXAotICAgICAgIFstLWhlYWRlci1maWxlPWZpbGVdIFstLWxpbmtlcj1saW5rZXJdIFstLWRlYnVnXVxuXAotICAgICAgIFstLWhlbHBdIFstLXZlcnNpb25dXG5cCi0gICAgICAgW2luLWZpbGUgW291dC1maWxlXV1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChmaWxlLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQwKLS8qIFNlbGVjdCB0aGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiB0aGUgaW5wdXQgYXJjaGl0ZWN0dXJlLCBtYWNoaW5lLAotICAgYW5kIGVuZGlhbm5lc3MuICBUaGlzIGNob29zZXMgdGhlIGFwcHJvcHJpYXRlIE5MTSB0YXJnZXQuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1zZWxlY3Rfb3V0cHV0X2Zvcm1hdCAoYXJjaCwgbWFjaCwgYmlnZW5kaWFuKQotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoOwotICAgICBib29sZWFuIGJpZ2VuZGlhbjsKLXsKLSAgc3dpdGNoIChhcmNoKQotICAgIHsKLSNpZmRlZiBOTE1DT05WX0kzODYKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICByZXR1cm4gIm5sbTMyLWkzODYiOwotI2VuZGlmCi0jaWZkZWYgTkxNQ09OVl9TUEFSQwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICByZXR1cm4gIm5sbTMyLXNwYXJjIjsKLSNlbmRpZgotI2lmZGVmIE5MTUNPTlZfQUxQSEEKLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgcmV0dXJuICJubG0zMi1hbHBoYSI7Ci0jZW5kaWYKLSNpZmRlZiBOTE1DT05WX1BPV0VSUEMKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICByZXR1cm4gIm5sbTMyLXBvd2VycGMiOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHN1cHBvcnQgbm90IGNvbXBpbGVkIGluIGZvciAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGFyY2gsIG1hY2gpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgICAgLyogQXZvaWQgd2FybmluZy4gICovCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0MCi0vKiBUaGUgQkZEIHNlY3Rpb25zIGFyZSBjb3BpZWQgaW4gdHdvIHBhc3Nlcy4gIFRoaXMgZnVuY3Rpb24gc2VsZWN0cwotICAgdGhlIG91dHB1dCBzZWN0aW9uIGZvciBlYWNoIGlucHV0IHNlY3Rpb24sIGFuZCBzZXRzIHVwIHRoZSBzZWN0aW9uCi0gICBuYW1lLCBzaXplLCBldGMuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0dXBfc2VjdGlvbnMgKGluYmZkLCBpbnNlYywgZGF0YV9wdHIpCi0gICAgIGJmZCAqaW5iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgUFRSIGRhdGFfcHRyOwotewotICBiZmQgKm91dGJmZCA9IChiZmQgKikgZGF0YV9wdHI7Ci0gIGZsYWd3b3JkIGY7Ci0gIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0gIGFzZWN0aW9uICpvdXRzZWM7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIGFsaWduOwotICBiZmRfc2l6ZV90eXBlIGFkZDsKLSAgYmZkX3NpemVfdHlwZSBzZWNzZWNzaXplOwotCi0gIGYgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGluYmZkLCBpbnNlYyk7Ci0gIGlmIChmICYgU0VDX0NPREUpCi0gICAgb3V0bmFtZSA9IE5MTV9DT0RFX05BTUU7Ci0gIGVsc2UgaWYgKChmICYgU0VDX0xPQUQpICYmIChmICYgU0VDX0hBU19DT05URU5UUykpCi0gICAgb3V0bmFtZSA9IE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gIGVsc2UgaWYgKGYgJiBTRUNfQUxMT0MpCi0gICAgb3V0bmFtZSA9IE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgZWxzZQotICAgIG91dG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbmJmZCwgaW5zZWMpOwotCi0gIG91dHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsIG91dG5hbWUpOwotICBpZiAob3V0c2VjID09IE5VTEwpCi0gICAgewotICAgICAgb3V0c2VjID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCBvdXRuYW1lKTsKLSAgICAgIGlmIChvdXRzZWMgPT0gTlVMTCkKLQliZmRfZmF0YWwgKF8oIm1ha2Ugc2VjdGlvbiIpKTsKLSAgICB9Ci0KLSAgaW5zZWMtPm91dHB1dF9zZWN0aW9uID0gb3V0c2VjOwotCi0gIG9mZnNldCA9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgb3V0c2VjKTsKLSAgYWxpZ24gPSAxIDw8IGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGluc2VjKTsKLSAgYWRkID0gKChvZmZzZXQgKyBhbGlnbiAtIDEpICZ+IChhbGlnbiAtIDEpKSAtIG9mZnNldDsKLSAgaW5zZWMtPm91dHB1dF9vZmZzZXQgPSBvZmZzZXQgKyBhZGQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgb3V0c2VjLAotCQkJICAgICAgKGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgb3V0c2VjKQotCQkJICAgICAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoaW5iZmQsIGluc2VjKQotCQkJICAgICAgICsgYWRkKSkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgc2VjdGlvbiBzaXplIikpOwotCi0gIGlmICgoYmZkX3NlY3Rpb25fYWxpZ25tZW50IChpbmJmZCwgaW5zZWMpCi0gICAgICAgPiBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKG91dGJmZCwgb3V0c2VjKSkKLSAgICAgICYmICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob3V0YmZkLCBvdXRzZWMsCi0JCQkJICAgICAgYmZkX3NlY3Rpb25fYWxpZ25tZW50IChpbmJmZCwgaW5zZWMpKSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCBzZWN0aW9uIGFsaWdubWVudCIpKTsKLQotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgb3V0c2VjLAotCQkJICAgICAgIGYgfCBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgb3V0c2VjKSkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgc2VjdGlvbiBmbGFncyIpKTsKLQotICBiZmRfc2V0X3JlbG9jIChvdXRiZmQsIG91dHNlYywgKGFyZWxlbnQgKiopIE5VTEwsIDApOwotCi0gIC8qIEZvciBlYWNoIGlucHV0IHNlY3Rpb24gd2UgYWxsb2NhdGUgc3BhY2UgZm9yIGFuIGVudHJ5IGluCi0gICAgIC5ubG1zZWN0aW9ucy4gICovCi0gIHNlY3NlY3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHNlY3NlYyk7Ci0gIHNlY3NlY3NpemUgKz0gc3RybGVuIChiZmRfc2VjdGlvbl9uYW1lIChpbmJmZCwgaW5zZWMpKSArIDE7Ci0gIHNlY3NlY3NpemUgPSAoc2Vjc2Vjc2l6ZSArIDMpICZ+IDM7Ci0gIHNlY3NlY3NpemUgKz0gODsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgc2Vjc2VjLCBzZWNzZWNzaXplKSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbnMgc2l6ZSIpKTsKLX0KLQotLyogQ29weSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0KLXN0YXRpYyB2b2lkCi1jb3B5X3NlY3Rpb25zIChpbmJmZCwgaW5zZWMsIGRhdGFfcHRyKQotICAgICBiZmQgKmluYmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIFBUUiBkYXRhX3B0cjsKLXsKLSAgc3RhdGljIGJmZF9zaXplX3R5cGUgc2Vjc2Vjb2ZmID0gMDsKLSAgYmZkICpvdXRiZmQgPSAoYmZkICopIGRhdGFfcHRyOwotICBjb25zdCBjaGFyICppbm5hbWU7Ci0gIGFzZWN0aW9uICpvdXRzZWM7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgUFRSIGNvbnRlbnRzOwotICBsb25nIHJlbG9jX3NpemU7Ci0gIGJmZF9ieXRlIGJ1Zls0XTsKLSAgYmZkX3NpemVfdHlwZSBhZGQ7Ci0KLSAgaW5uYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5iZmQsIGluc2VjKTsKLQotICBvdXRzZWMgPSBpbnNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gIGFzc2VydCAob3V0c2VjICE9IE5VTEwpOwotCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGluc2VjKTsKLQotICAvKiBGSVhNRTogV2h5IGFyZSB0aGVzZSBuZWNlc3Nhcnk/ICAqLwotICBpbnNlYy0+X2Nvb2tlZF9zaXplID0gaW5zZWMtPl9yYXdfc2l6ZTsKLSAgaW5zZWMtPnJlbG9jX2RvbmUgPSB0cnVlOwotCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpbmJmZCwgaW5zZWMpICYgU0VDX0hBU19DT05URU5UUykgPT0gMCkKLSAgICBjb250ZW50cyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb250ZW50cyA9IHhtYWxsb2MgKHNpemUpOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbmJmZCwgaW5zZWMsIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZSkpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChpbmJmZCkpOwotICAgIH0KLQotICByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5iZmQsIGluc2VjKTsKLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaW5iZmQpKTsKLSAgaWYgKHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcmVsb2NzOwotICAgICAgbG9uZyByZWxvY19jb3VudDsKLQotICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbG9jX3NpemUpOwotICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbmJmZCwgaW5zZWMsIHJlbG9jcywgc3ltYm9scyk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaW5iZmQpKTsKLSAgICAgIG1hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsICZyZWxvY3MsICZyZWxvY19jb3VudCwgKGNoYXIgKikgY29udGVudHMsCi0JCSAgICAgc2l6ZSk7Ci0KLSAgICAgIC8qIEZJWE1FOiByZWZlcnMgdG8gaW50ZXJuYWwgQkZEIGZpZWxkcy4gICovCi0gICAgICBpZiAob3V0c2VjLT5vcmVsb2NhdGlvbiAhPSAoYXJlbGVudCAqKikgTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHRvdGFsX2NvdW50OwotCSAgYXJlbGVudCAqKmNvbWJpbmVkOwotCi0JICB0b3RhbF9jb3VudCA9IHJlbG9jX2NvdW50ICsgb3V0c2VjLT5yZWxvY19jb3VudDsKLQkgIGNvbWJpbmVkID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHRvdGFsX2NvdW50ICogc2l6ZW9mIChhcmVsZW50ICopKTsKLQkgIG1lbWNweSAoY29tYmluZWQsIG91dHNlYy0+b3JlbG9jYXRpb24sCi0JCSAgb3V0c2VjLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0JICBtZW1jcHkgKGNvbWJpbmVkICsgb3V0c2VjLT5yZWxvY19jb3VudCwgcmVsb2NzLAotCQkgIChzaXplX3QpIChyZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSkpOwotCSAgZnJlZSAob3V0c2VjLT5vcmVsb2NhdGlvbik7Ci0JICByZWxvY19jb3VudCA9IHRvdGFsX2NvdW50OwotCSAgcmVsb2NzID0gY29tYmluZWQ7Ci0JfQotCi0gICAgICBiZmRfc2V0X3JlbG9jIChvdXRiZmQsIG91dHNlYywgcmVsb2NzLCByZWxvY19jb3VudCk7Ci0gICAgfQotCi0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBvdXRzZWMsIGNvbnRlbnRzLAotCQkJCSAgICAgIGluc2VjLT5vdXRwdXRfb2Zmc2V0LCBzaXplKSkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKG91dGJmZCkpOwotICAgICAgZnJlZSAoY29udGVudHMpOwotICAgIH0KLQotICAvKiBBZGQgdGhpcyBzZWN0aW9uIHRvIC5ubG1zZWN0aW9ucy4gICovCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzZWNzZWMsIChQVFIpIGlubmFtZSwgc2Vjc2Vjb2ZmLAotCQkJCSAgc3RybGVuIChpbm5hbWUpICsgMSkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb24gY29udGVudHMiKSk7Ci0gIHNlY3NlY29mZiArPSBzdHJsZW4gKGlubmFtZSkgKyAxOwotCi0gIGFkZCA9ICgoc2Vjc2Vjb2ZmICsgMykgJn4gMykgLSBzZWNzZWNvZmY7Ci0gIGlmIChhZGQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIDAsIGJ1Zik7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgc2Vjc2VjLCBidWYsIHNlY3NlY29mZiwgYWRkKSkKLQliZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIpKTsKLSAgICAgIHNlY3NlY29mZiArPSBhZGQ7Ci0gICAgfQotCi0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIGJmZF9oX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgb3V0c2VjLT5maWxlcG9zLCBidWYpOwotICBlbHNlCi0gICAgYmZkX2hfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSAwLCBidWYpOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgc2Vjc2VjLCBidWYsIHNlY3NlY29mZiwgNCkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb24gY29udGVudHMiKSk7Ci0gIHNlY3NlY29mZiArPSA0OwotCi0gIGJmZF9oX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgc2l6ZSwgYnVmKTsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNlY3NlYywgYnVmLCBzZWNzZWNvZmYsIDQpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIikpOwotICBzZWNzZWNvZmYgKz0gNDsKLX0KLQotLyogU29tZSwgcGVyaGFwcyBhbGwsIE5ldFdhcmUgdGFyZ2V0cyByZXF1aXJlIGNoYW5naW5nIHRoZSByZWxvY3MgdXNlZAotICAgYnkgdGhlIGlucHV0IGZvcm1hdHMuICAqLwotCi1zdGF0aWMgdm9pZAotbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKLQkgICAgICAgY29udGVudHNfc2l6ZSkKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgYXJlbGVudCAqKipyZWxvY3NfcHRyOwotICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7Ci0gICAgIGNoYXIgKmNvbnRlbnRzOwotICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChvdXRiZmQpKQotICAgIHsKLSNpZmRlZiBOTE1DT05WX0kzODYKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICBpMzg2X21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwKLQkJCSAgY29udGVudHMsIGNvbnRlbnRzX3NpemUpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBOTE1DT05WX0FMUEhBCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIGFscGhhX21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwKLQkJCSAgIGNvbnRlbnRzLCBjb250ZW50c19zaXplKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgcG93ZXJwY19tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsCi0JCQkgICAgIGNvbnRlbnRzLCBjb250ZW50c19zaXplKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGRlZmF1bHRfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLAotCQkJICAgICBjb250ZW50cywgY29udGVudHNfc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIEJ5IGRlZmF1bHQgYWxsIHdlIG5lZWQgdG8gZG8gZm9yIHJlbG9jcyBpcyBjaGFuZ2UgdGhlIGFkZHJlc3MgYnkKLSAgIHRoZSBvdXRwdXRfb2Zmc2V0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotZGVmYXVsdF9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAotCQkgICAgICAgY29udGVudHNfc2l6ZSkKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgYXJlbGVudCAqKipyZWxvY3NfcHRyOwotICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7Ci0gICAgIGNoYXIgKmNvbnRlbnRzOwotICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Ci17Ci0gIGlmIChpbnNlYy0+b3V0cHV0X29mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIGxvbmcgcmVsb2NfY291bnQ7Ci0gICAgICByZWdpc3RlciBhcmVsZW50ICoqcmVsb2NzOwotICAgICAgcmVnaXN0ZXIgbG9uZyBpOwotCi0gICAgICByZWxvY19jb3VudCA9ICpyZWxvY19jb3VudF9wdHI7Ci0gICAgICByZWxvY3MgPSAqcmVsb2NzX3B0cjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrLCByZWxvY3MrKykKLQkoKnJlbG9jcyktPmFkZHJlc3MgKz0gaW5zZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgfQotfQotDAotI2lmZGVmIE5MTUNPTlZfSTM4NgotCi0vKiBOZXRXYXJlIG9uIHRoZSBpMzg2IHN1cHBvcnRzIGEgcmVzdHJpY3RlZCBzZXQgb2YgcmVsb2NzLCB3aGljaCBhcmUKLSAgIGRpZmZlcmVudCBmcm9tIHRob3NlIHVzZWQgb24gb3RoZXIgaTM4NiB0YXJnZXRzLiAgVGhpcyByb3V0aW5lCi0gICBjb252ZXJ0cyB0aGUgcmVsb2NzLiAgSXQgaXMsIG9idmlvdXNseSwgdmVyeSB0YXJnZXQgZGVwZW5kZW50LiAgQXQKLSAgIHRoZSBtb21lbnQsIHRoZSBubG0zMi1pMzg2IGJhY2tlbmQgcGVyZm9ybXMgc2ltaWxhciB0cmFuc2xhdGlvbnM7Ci0gICBob3dldmVyLCBpdCBpcyBtb3JlIHJlbGlhYmxlIGFuZCBlZmZpY2llbnQgdG8gZG8gdGhlbSBoZXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX2kzODZfcGNyZWxfaG93dG8gPQotICBIT1dUTyAoMSwJCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkRJU1AzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLXN0YXRpYyB2b2lkCi1pMzg2X21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwgY29udGVudHMsCi0JCSAgICBjb250ZW50c19zaXplKQotICAgICBiZmQgKm91dGJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICBhcmVsZW50ICoqKnJlbG9jc19wdHI7Ci0gICAgIGxvbmcgKnJlbG9jX2NvdW50X3B0cjsKLSAgICAgY2hhciAqY29udGVudHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgY29udGVudHNfc2l6ZTsKLXsKLSAgbG9uZyByZWxvY19jb3VudCwgaTsKLSAgYXJlbGVudCAqKnJlbG9jczsKLQotICByZWxvY19jb3VudCA9ICpyZWxvY19jb3VudF9wdHI7Ci0gIHJlbG9jcyA9ICpyZWxvY3NfcHRyOwotICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWw7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLQotICAgICAgcmVsID0gKnJlbG9jcysrOwotICAgICAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgICAgIC8qIFdlJ3JlIG1vdmluZyB0aGUgcmVsb2NzIGZyb20gdGhlIGlucHV0IHNlY3Rpb24gdG8gdGhlIG91dHB1dAotCSBzZWN0aW9uLCBzbyB3ZSBtdXN0IGFkanVzdCB0aGUgYWRkcmVzcyBhY2NvcmRpbmdseS4gICovCi0gICAgICBhZGRyZXNzID0gcmVsLT5hZGRyZXNzOwotICAgICAgcmVsLT5hZGRyZXNzICs9IGluc2VjLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICAvKiBOb3RlIHRoYXQgbm8gc2VyaW91cyBoYXJtIHdpbGwgZW5zdWUgaWYgd2UgZmFpbCB0byBjaGFuZ2UgYQotCSByZWxvYy4gIFRoZSBiYWNrZW5kIHdpbGwgZmFpbCB3aGVuIHdyaXRpbmcgb3V0IHRoZSByZWxvYy4gICovCi0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHJlbG9jIGlzIHdpdGhpbiB0aGUgZGF0YSB3ZSBoYXZlLiAgV2UgdXNlIG9ubHkKLQkgNCBieXRlIHJlbG9jcyBoZXJlLCBzbyB3ZSBpbnNpc3Qgb24gaGF2aW5nIDQgYnl0ZXMuICAqLwotICAgICAgaWYgKGFkZHJlc3MgKyA0ID4gY29udGVudHNfc2l6ZSkKLQljb250aW51ZTsKLQotICAgICAgLyogQSBQQyByZWxhdGl2ZSByZWxvYyBlbnRpcmVseSB3aXRoaW4gYSBzaW5nbGUgc2VjdGlvbiBpcwotCSBjb21wbGV0ZWx5IHVubmVjZXNzYXJ5LiAgVGhpcyBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGxkIC1yLiAgKi8KLSAgICAgIGlmIChzeW0gPT0gaW5zZWMtPnN5bWJvbAotCSAgJiYgcmVsLT5ob3d0byAhPSBOVUxMCi0JICAmJiByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSAgJiYgISByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JewotCSAgLS0qcmVsb2NfY291bnRfcHRyOwotCSAgLS1yZWxvY3M7Ci0JICBtZW1tb3ZlIChyZWxvY3MsIHJlbG9jcyArIDEsCi0JCSAgIChzaXplX3QpICgocmVsb2NfY291bnQgLSBpKSAqIHNpemVvZiAoYXJlbGVudCAqKSkpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIGFtb3VudCB0aGUgcmVsb2NhdGlvbiB3aWxsIGFkZCBpbi4gICovCi0gICAgICBhZGRlbmQgPSByZWwtPmFkZGVuZCArIHN5bS0+dmFsdWU7Ci0KLSAgICAgIC8qIE5ldFdhcmUgZG9lc24ndCBzdXBwb3J0IFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IGRlZmluZWQKLQkgc3ltYm9scywgc28gd2UgaGF2ZSB0byBlbGltaW5hdGUgdGhlbSBieSBkb2luZyB0aGUgcmVsb2NhdGlvbgotCSBub3cuICBXZSBjYW4gb25seSBkbyB0aGlzIGlmIHRoZSByZWxvYyBpcyB3aXRoaW4gYSBzaW5nbGUKLQkgc2VjdGlvbi4gICovCi0gICAgICBpZiAocmVsLT5ob3d0byAhPSBOVUxMCi0JICAmJiByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSAgJiYgYmZkX2dldF9zZWN0aW9uIChzeW0pID09IGluc2VjLT5vdXRwdXRfc2VjdGlvbikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgaWYgKHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCkKLQkgICAgYWRkZW5kIC09IGFkZHJlc3M7Ci0KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKG91dGJmZCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0JICB2YWwgKz0gYWRkZW5kOwotCSAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCi0JICAtLSpyZWxvY19jb3VudF9wdHI7Ci0JICAtLXJlbG9jczsKLQkgIG1lbW1vdmUgKHJlbG9jcywgcmVsb2NzICsgMSwKLQkJICAgKHNpemVfdCkgKChyZWxvY19jb3VudCAtIGkpICogc2l6ZW9mIChhcmVsZW50ICopKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIE5ldFdhcmUgZG9lc24ndCBzdXBwb3J0IHJlbG9jIGFkZGVuZHMsIHNvIHdlIGdldCByaWQgb2YgdGhlbQotCSBoZXJlIGJ5IHNpbXBseSBhZGRpbmcgdGhlbSBpbnRvIHRoZSBvYmplY3QgZGF0YS4gIFdlIGhhbmRsZQotCSB0aGUgc3ltYm9sIHZhbHVlLCBpZiBhbnksIHRoZSBzYW1lIHdheS4gICovCi0gICAgICBpZiAoYWRkZW5kICE9IDAKLQkgICYmIHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zaXplID09IDIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHNpemUgPT0gMzIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHBvcyA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zcmNfbWFzayA9PSAweGZmZmZmZmZmCi0JICAmJiByZWwtPmhvd3RvLT5kc3RfbWFzayA9PSAweGZmZmZmZmZmKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCSAgdmFsICs9IGFkZGVuZDsKLQkgIGJmZF9wdXRfMzIgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQotCSAgLyogQWRqdXN0IHRoZSByZWxvYyBmb3IgdGhlIGNoYW5nZXMgd2UganVzdCBtYWRlLiAgKi8KLQkgIHJlbC0+YWRkZW5kID0gMDsKLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+c3ltYm9sX3B0cl9wdHI7Ci0JfQotCi0gICAgICAvKiBOZXRXYXJlIHVzZXMgYSByZWxvYyB3aXRoIHBjcmVsX29mZnNldCBzZXQuICBXZSBhZGp1c3QKLQkgcGNfcmVsYXRpdmUgcmVsb2NzIGFjY29yZGluZ2x5LiAgV2UgYXJlIGdvaW5nIHRvIGNoYW5nZSB0aGUKLQkgaG93dG8gZmllbGQsIHNvIHdlIGNhbiBvbmx5IGRvIHRoaXMgaWYgdGhlIGN1cnJlbnQgb25lIGlzCi0JIGNvbXBhdGlibGUuICBXZSBzaG91bGQgY2hlY2sgdGhhdCBzcGVjaWFsX2Z1bmN0aW9uIGlzIE5VTEwKLQkgaGVyZSwgYnV0IGF0IHRoZSBtb21lbnQgY29mZi1pMzg2IHVzZXMgYSBzcGVjaWFsX2Z1bmN0aW9uCi0JIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB3aGF0IHdlIGFyZSBkb2luZyBoZXJlLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0JICAmJiAhIHJlbC0+aG93dG8tPnBjcmVsX29mZnNldAotCSAgJiYgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zaXplID09IDIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHNpemUgPT0gMzIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHBvcyA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zcmNfbWFzayA9PSAweGZmZmZmZmZmCi0JICAmJiByZWwtPmhvd3RvLT5kc3RfbWFzayA9PSAweGZmZmZmZmZmKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICAvKiBXaGVuIHBjcmVsX29mZnNldCBpcyBub3Qgc2V0LCBpdCBtZWFucyB0aGF0IHRoZSBuZWdhdGl2ZQotCSAgICAgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBsb2NhdGlvbiBpcyBzdG9yZWQgaW4gdGhlCi0JICAgICBtZW1vcnkgbG9jYXRpb24uICBXZSBtdXN0IGFkZCBpdCBiYWNrIGluLiAgKi8KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKG91dGJmZCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0JICB2YWwgKz0gYWRkcmVzczsKLQkgIGJmZF9wdXRfMzIgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQotCSAgLyogV2UgbXVzdCBjaGFuZ2UgdG8gYSBuZXcgaG93dG8uICAqLwotCSAgcmVsLT5ob3d0byA9ICZubG1faTM4Nl9wY3JlbF9ob3d0bzsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYgLyogTkxNQ09OVl9JMzg2ICovCi0MCi0jaWZkZWYgTkxNQ09OVl9BTFBIQQotCi0vKiBPbiB0aGUgQWxwaGEgdGhlIGZpcnN0IHJlbG9jIGZvciBldmVyeSBzZWN0aW9uIG11c3QgYmUgYSBzcGVjaWFsCi0gICByZWxvY3Mgd2hpY2ggaG9sZCB0aGUgR1AgYWRkcmVzcy4gIEFsc28sIHRoZSBmaXJzdCByZWxvYyBpbiB0aGUKLSAgIGZpbGUgbXVzdCBiZSBhIHNwZWNpYWwgcmVsb2Mgd2hpY2ggaG9sZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIC5saXRhCi0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfYWxwaGFfbndfaG93dG8gPQotICBIT1dUTyAoQUxQSEFfUl9OV19SRUxPQywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTldfUkVMT0MiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1hbHBoYV9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAotCQkgICAgIGNvbnRlbnRzX3NpemUpCi0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIHJlZ2lzdGVyIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKLSAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOwotICAgICBjaGFyICpjb250ZW50czsKLSAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOwotewotICBsb25nIG9sZF9yZWxvY19jb3VudDsKLSAgYXJlbGVudCAqKm9sZF9yZWxvY3M7Ci0gIHJlZ2lzdGVyIGFyZWxlbnQgKipyZWxvY3M7Ci0KLSAgb2xkX3JlbG9jX2NvdW50ID0gKnJlbG9jX2NvdW50X3B0cjsKLSAgb2xkX3JlbG9jcyA9ICpyZWxvY3NfcHRyOwotICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAoKG9sZF9yZWxvY19jb3VudCArIDMpICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgKnJlbG9jc19wdHIgPSByZWxvY3M7Ci0KLSAgaWYgKG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfYWRkcmVzcyA9PSAwKQotICAgIHsKLSAgICAgIGJmZCAqaW5iZmQ7Ci0gICAgICBhc2VjdGlvbiAqbGl0YV9zZWN0aW9uOwotCi0gICAgICBpbmJmZCA9IGluc2VjLT5vd25lcjsKLSAgICAgIGxpdGFfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbmJmZCwgX0xJVEEpOwotICAgICAgaWYgKGxpdGFfc2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQl7Ci0JICBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX2FkZHJlc3MgPQotCSAgICBiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmJmZCwgbGl0YV9zZWN0aW9uKTsKLQkgIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfc2l6ZSA9Ci0JICAgIGJmZF9zZWN0aW9uX3NpemUgKGluYmZkLCBsaXRhX3NlY3Rpb24pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBdm9pZCBvdXRwdXR0aW5nIHRoaXMgcmVsb2MgYWdhaW4uICAqLwotCSAgbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9hZGRyZXNzID0gNDsKLQl9Ci0KLSAgICAgICpyZWxvY3MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgICAgICgqcmVsb2NzKS0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgICgqcmVsb2NzKS0+YWRkcmVzcyA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfYWRkcmVzczsKLSAgICAgICgqcmVsb2NzKS0+YWRkZW5kID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9zaXplICsgMTsKLSAgICAgICgqcmVsb2NzKS0+aG93dG8gPSAmbmxtMzJfYWxwaGFfbndfaG93dG87Ci0gICAgICArK3JlbG9jczsKLSAgICAgICsrKCpyZWxvY19jb3VudF9wdHIpOwotICAgIH0KLQotICAvKiBHZXQgdGhlIEdQIHZhbHVlIGZyb20gYmZkLiAgKi8KLSAgaWYgKG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmdwID09IDApCi0gICAgbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+Z3AgPQotICAgICAgYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSAoaW5zZWMtPm93bmVyKTsKLQotICAqcmVsb2NzID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gICgqcmVsb2NzKS0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgKCpyZWxvY3MpLT5hZGRyZXNzID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+Z3A7Ci0gICgqcmVsb2NzKS0+YWRkZW5kID0gMDsKLSAgKCpyZWxvY3MpLT5ob3d0byA9ICZubG0zMl9hbHBoYV9ud19ob3d0bzsKLSAgKytyZWxvY3M7Ci0gICsrKCpyZWxvY19jb3VudF9wdHIpOwotCi0gIG1lbWNweSAoKFBUUikgcmVsb2NzLCAoUFRSKSBvbGRfcmVsb2NzLAotCSAgKHNpemVfdCkgb2xkX3JlbG9jX2NvdW50ICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgcmVsb2NzW29sZF9yZWxvY19jb3VudF0gPSAoYXJlbGVudCAqKSBOVUxMOwotCi0gIGZyZWUgKG9sZF9yZWxvY3MpOwotCi0gIGlmIChpbnNlYy0+b3V0cHV0X29mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGJmZF9zaXplX3R5cGUgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IChiZmRfc2l6ZV90eXBlKSBvbGRfcmVsb2NfY291bnQ7IGkrKywgcmVsb2NzKyspCi0JKCpyZWxvY3MpLT5hZGRyZXNzICs9IGluc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLX0KLQotI2VuZGlmIC8qIE5MTUNPTlZfQUxQSEEgKi8KLQwKLSNpZmRlZiBOTE1DT05WX1BPV0VSUEMKLQotLyogV2Uga2VlcCBhIGxpbmtlZCBsaXN0IG9mIHN0dWJzIHdoaWNoIHdlIG11c3QgYnVpbGQuICBCZWNhdXNlIEJGRAotICAgcmVxdWlyZXMgdXMgdG8ga25vdyB0aGUgc2l6ZXMgb2YgYWxsIHNlY3Rpb25zIGJlZm9yZSB3ZSBjYW4gc2V0IHRoZQotICAgY29udGVudHMgb2YgYW55LCB3ZSBtdXN0IGZpZ3VyZSBvdXQgd2hpY2ggc3R1YnMgd2Ugd2FudCB0byBidWlsZAotICAgYmVmb3JlIHdlIGNhbiBhY3R1YWxseSBidWlsZCBhbnkgb2YgdGhlbS4gICovCi0KLXN0cnVjdCBwb3dlcnBjX3N0dWIKLXsKLSAgLyogTmV4dCBzdHViIGluIGxpbmtlZCBsaXN0LiAgKi8KLSAgc3RydWN0IHBvd2VycGNfc3R1YiAqbmV4dDsKLQotICAvKiBTeW1ib2wgd2hvc2UgdmFsdWUgaXMgdGhlIHN0YXJ0IG9mIHRoZSBzdHViLiAgVGhpcyBpcyBhIHN5bWJvbAotICAgICB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIGAuJy4gICovCi0gIGFzeW1ib2wgKnN0YXJ0OwotCi0gIC8qIFN5bWJvbCB3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlIGEgcmVsb2MgYWdhaW5zdC4gIFRoaXMgaXMgYSBzeW1ib2wKLSAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIFNUQVJUIGJ1dCB3aXRob3V0IHRoZSBsZWFkaW5nIGAuJy4gICovCi0gIGFzeW1ib2wgKnJlbG9jOwotCi0gIC8qIFRoZSBUT0MgaW5kZXggZm9yIHRoaXMgc3R1Yi4gIFRoaXMgaXMgdGhlIGluZGV4IGludG8gdGhlIFRPQwotICAgICBzZWN0aW9uIGF0IHdoaWNoIHRoZSByZWxvYyBpcyBjcmVhdGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHRvY19pbmRleDsKLX07Ci0KLS8qIFRoZSBsaW5rZWQgbGlzdCBvZiBzdHVicy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcG93ZXJwY19zdHViICpwb3dlcnBjX3N0dWJzOwotCi0vKiBUaGlzIGlzIHdoYXQgYSBzdHViIGxvb2tzIGxpa2UuICBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd2lsbCBnZXQKLSAgIGFkanVzdGVkIHdpdGggdGhlIGNvcnJlY3QgVE9DIGluZGV4LiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG93ZXJwY19zdHViX2luc25zW10gPQotewotICAweDgxODIwMDAwLAkJLyogbHd6CSByMTIsMChyMikgKi8KLSAgMHg5MDQxMDAxNCwJCS8qIHN0dwkgcjIsMjAocjEpICovCi0gIDB4ODAwYzAwMDAsCQkvKiBsd3oJIHIwLDAocjEyKSAqLwotICAweDgwNGMwMDA0LAkJLyogbHd6CSByMixyKHIxMikgKi8KLSAgMHg3YzA5MDNhNiwJCS8qIG10Y3RyIHIwICovCi0gIDB4NGU4MDA0MjAsCQkvKiBiY3RyICovCi0gIDAsCQkJLyogVHJhY2ViYWNrIHRhYmxlLiAgKi8KLSAgMHhjODAwMCwKLSAgMAotfTsKLQotI2RlZmluZSBQT1dFUlBDX1NUVUJfSU5TTl9DT1VOVCBcCi0gIChzaXplb2YgcG93ZXJwY19zdHViX2luc25zIC8gc2l6ZW9mIHBvd2VycGNfc3R1Yl9pbnNuc1swXSkKLQotI2RlZmluZSBQT1dFUlBDX1NUVUJfU0laRSAoNCAqIFBPV0VSUENfU1RVQl9JTlNOX0NPVU5UKQotCi0vKiBFYWNoIHN0dWIgdXNlcyBhIGZvdXIgYnl0ZSBUT0MgZW50cnkuICAqLwotI2RlZmluZSBQT1dFUlBDX1NUVUJfVE9DX0VOVFJZX1NJWkUgKDQpCi0KLS8qIFRoZSBvcmlnaW5hbCBzaXplIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotc3RhdGljIGJmZF9zaXplX3R5cGUgcG93ZXJwY19pbml0aWFsX2dvdF9zaXplOwotCi0vKiBMb29rIGZvciBhbGwgdW5kZWZpbmVkIHN5bWJvbHMgYmVnaW5uaW5nIHdpdGggYC4nLCBhbmQgcHJlcGFyZSB0bwotICAgYnVpbGQgYSBzdHViIGZvciBlYWNoIG9uZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wb3dlcnBjX2J1aWxkX3N0dWJzIChpbmJmZCwgb3V0YmZkLCBzeW1ib2xzX3B0ciwgc3ltY291bnRfcHRyKQotICAgICBiZmQgKmluYmZkOwotICAgICBiZmQgKm91dGJmZDsKLSAgICAgYXN5bWJvbCAqKipzeW1ib2xzX3B0cjsKLSAgICAgbG9uZyAqc3ltY291bnRfcHRyOwotewotICBhc2VjdGlvbiAqc3R1Yl9zZWM7Ci0gIGFzZWN0aW9uICpnb3Rfc2VjOwotICB1bnNpZ25lZCBpbnQgZ290X2Jhc2U7Ci0gIGxvbmcgaTsKLSAgbG9uZyBzeW1jb3VudDsKLSAgbG9uZyBzdHViY291bnQ7Ci0KLSAgLyogTWFrZSBhIHNlY3Rpb24gdG8gaG9sZCBzdHVicy4gIFdlIGRvbid0IHNldCBTRUNfSEFTX0NPTlRFTlRTIGZvcgotICAgICB0aGUgc2VjdGlvbiB0byBwcmV2ZW50IGNvcHlfc2VjdGlvbnMgZnJvbSByZWFkaW5nIGZyb20gaXQuICAqLwotICBzdHViX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGluYmZkLCAiLnN0dWJzIik7Ci0gIGlmIChzdHViX3NlYyA9PSAoYXNlY3Rpb24gKikgTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGluYmZkLCBzdHViX3NlYywKLQkJCQkgIChTRUNfQ09ERQotCQkJCSAgIHwgU0VDX1JFTE9DCi0JCQkJICAgfCBTRUNfQUxMT0MKLQkJCQkgICB8IFNFQ19MT0FEKSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIHN0dWJfc2VjLCAyKSkKLSAgICBiZmRfZmF0YWwgKCIuc3R1YnMiKTsKLQotICAvKiBHZXQgdGhlIFRPQyBzZWN0aW9uLCB3aGljaCBpcyBuYW1lZCAuZ290LiAgKi8KLSAgZ290X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbmJmZCwgIi5nb3QiKTsKLSAgaWYgKGdvdF9zZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgZ290X3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGluYmZkLCAiLmdvdCIpOwotICAgICAgaWYgKGdvdF9zZWMgPT0gKGFzZWN0aW9uICopIE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChpbmJmZCwgZ290X3NlYywKLQkJCQkgICAgICAoU0VDX0RBVEEKLQkJCQkgICAgICAgfCBTRUNfUkVMT0MKLQkJCQkgICAgICAgfCBTRUNfQUxMT0MKLQkJCQkgICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChpbmJmZCwgZ290X3NlYywgMikpCi0JYmZkX2ZhdGFsICgiLmdvdCIpOwotICAgIH0KLQotICBwb3dlcnBjX2luaXRpYWxfZ290X3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbmJmZCwgZ290X3NlYyk7Ci0gIGdvdF9iYXNlID0gcG93ZXJwY19pbml0aWFsX2dvdF9zaXplOwotICBnb3RfYmFzZSA9IChnb3RfYmFzZSArIDMpICZ+IDM7Ci0KLSAgc3R1YmNvdW50ID0gMDsKLQotICBzeW1jb3VudCA9ICpzeW1jb3VudF9wdHI7Ci0gIGZvciAoaSA9IDA7IGkgPCBzeW1jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGFzeW1ib2wgKm5ld3N5bTsKLSAgICAgIGNoYXIgKm5ld25hbWU7Ci0gICAgICBzdHJ1Y3QgcG93ZXJwY19zdHViICppdGVtOwotCi0gICAgICBzeW0gPSAoKnN5bWJvbHNfcHRyKVtpXTsKLQotICAgICAgLyogV2UgbXVzdCBtYWtlIGEgc3R1YiBmb3IgZXZlcnkgdW5kZWZpbmVkIHN5bWJvbCB3aG9zZSBuYW1lCi0JIHN0YXJ0cyB3aXRoICcuJy4gICovCi0gICAgICBpZiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKVswXSAhPSAnLicKLQkgIHx8ICEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIGEgbmV3IHVuZGVmaW5lZCBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCB3aXRob3V0Ci0JIHRoZSBsZWFkaW5nIGAuJy4gICovCi0gICAgICBuZXdzeW0gPSAoYXN5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wpKTsKLSAgICAgICpuZXdzeW0gPSAqc3ltOwotICAgICAgbmV3bmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkpOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pICsgMSk7Ci0gICAgICBuZXdzeW0tPm5hbWUgPSBuZXduYW1lOwotCi0gICAgICAvKiBEZWZpbmUgdGhlIGAuJyBzeW1ib2wgdG8gYmUgaW4gdGhlIHN0dWIgc2VjdGlvbi4gICovCi0gICAgICBzeW0tPnNlY3Rpb24gPSBzdHViX3NlYzsKLSAgICAgIHN5bS0+dmFsdWUgPSBzdHViY291bnQgKiBQT1dFUlBDX1NUVUJfU0laRTsKLSAgICAgIC8qIFdlIHNldCB0aGUgQlNGX0RZTkFNSUMgZmxhZyBoZXJlIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGl0IHdoZW4KLQkgd2UgYXJlIG1hbmdsaW5nIHJlbG9jcy4gIEZJWE1FOiBUaGlzIGlzIGEgaGFjay4gICovCi0gICAgICBzeW0tPmZsYWdzID0gQlNGX0xPQ0FMIHwgQlNGX0RZTkFNSUM7Ci0KLSAgICAgIC8qIEFkZCB0aGlzIHN0dWIgdG8gdGhlIGxpbmtlZCBsaXN0LiAgKi8KLSAgICAgIGl0ZW0gPSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBwb3dlcnBjX3N0dWIpKTsKLSAgICAgIGl0ZW0tPnN0YXJ0ID0gc3ltOwotICAgICAgaXRlbS0+cmVsb2MgPSBuZXdzeW07Ci0gICAgICBpdGVtLT50b2NfaW5kZXggPSBnb3RfYmFzZSArIHN0dWJjb3VudCAqIFBPV0VSUENfU1RVQl9UT0NfRU5UUllfU0laRTsKLQotICAgICAgaXRlbS0+bmV4dCA9IHBvd2VycGNfc3R1YnM7Ci0gICAgICBwb3dlcnBjX3N0dWJzID0gaXRlbTsKLSAgICAgIAotICAgICAgKytzdHViY291bnQ7Ci0gICAgfQotCi0gIGlmIChzdHViY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKipzOwotICAgICAgc3RydWN0IHBvd2VycGNfc3R1YiAqbDsKLQotICAgICAgLyogQWRkIHRoZSBuZXcgc3ltYm9scyB3ZSBqdXN0IGNyZWF0ZWQgdG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICAqc3ltYm9sc19wdHIgPSAoYXN5bWJvbCAqKikgeHJlYWxsb2MgKChjaGFyICopICpzeW1ib2xzX3B0ciwKLQkJCQkJICAgICgoc3ltY291bnQgKyBzdHViY291bnQpCi0JCQkJCSAgICAgKiBzaXplb2YgKGFzeW1ib2wpKSk7Ci0gICAgICAqc3ltY291bnRfcHRyICs9IHN0dWJjb3VudDsKLSAgICAgIHMgPSAmKCpzeW1ib2xzX3B0cilbc3ltY291bnRdOwotICAgICAgZm9yIChsID0gcG93ZXJwY19zdHViczsgbCAhPSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLQkqcysrID0gbC0+cmVsb2M7Ci0KLSAgICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLnN0dWJzIHNlY3Rpb24gYW5kIGluY3JlYXNlIHRoZSBzaXplIG9mCi0JIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGluYmZkLCBzdHViX3NlYywKLQkJCQkgIHN0dWJjb3VudCAqIFBPV0VSUENfU1RVQl9TSVpFKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoaW5iZmQsIGdvdF9zZWMsCi0JCQkJICAgICAoZ290X2Jhc2UKLQkJCQkgICAgICArIChzdHViY291bnQKLQkJCQkJICogUE9XRVJQQ19TVFVCX1RPQ19FTlRSWV9TSVpFKSkpKQotCWJmZF9mYXRhbCAoXygic3R1YiBzZWN0aW9uIHNpemVzIikpOwotICAgIH0KLX0KLQotLyogUmVzb2x2ZSBhbGwgdGhlIHN0dWJzIGZvciBQb3dlclBDIE5ldFdhcmUuICBXZSBmaWxsIGluIHRoZSBjb250ZW50cwotICAgb2YgdGhlIG91dHB1dCBzZWN0aW9uLCBhbmQgY3JlYXRlIG5ldyByZWxvY3MgaW4gdGhlIFRPQy4gICovCi0KLXN0YXRpYyB2b2lkCi1wb3dlcnBjX3Jlc29sdmVfc3R1YnMgKGluYmZkLCBvdXRiZmQpCi0gICAgIGJmZCAqaW5iZmQ7Ci0gICAgIGJmZCAqb3V0YmZkOwotewotICBiZmRfYnl0ZSBidWZbUE9XRVJQQ19TVFVCX1NJWkVdOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IHN0dWJjb3VudDsKLSAgYXJlbGVudCAqKnJlbG9jczsKLSAgYXNlY3Rpb24gKmdvdF9zZWM7Ci0gIGFyZWxlbnQgKipyOwotICBzdHJ1Y3QgcG93ZXJwY19zdHViICpsOwotCi0gIGlmIChwb3dlcnBjX3N0dWJzID09IChzdHJ1Y3QgcG93ZXJwY19zdHViICopIE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoaSA9IDA7IGkgPCBQT1dFUlBDX1NUVUJfSU5TTl9DT1VOVDsgaSsrKQotICAgIGJmZF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIHBvd2VycGNfc3R1Yl9pbnNuc1tpXSwgYnVmICsgaSAqIDQpOwotCi0gIGdvdF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5iZmQsICIuZ290Iik7Ci0gIGFzc2VydCAoZ290X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCk7Ci0gIGFzc2VydCAoZ290X3NlYy0+b3V0cHV0X3NlY3Rpb24tPm9yZWxvY2F0aW9uID09IChhcmVsZW50ICoqKSBOVUxMKTsKLQotICBzdHViY291bnQgPSAwOwotICBmb3IgKGwgPSBwb3dlcnBjX3N0dWJzOyBsICE9IChzdHJ1Y3QgcG93ZXJwY19zdHViICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgICsrc3R1YmNvdW50OwotICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAoc3R1YmNvdW50ICogc2l6ZW9mIChhcmVsZW50ICopKTsKLQotICByID0gcmVsb2NzOwotICBmb3IgKGwgPSBwb3dlcnBjX3N0dWJzOyBsICE9IChzdHJ1Y3QgcG93ZXJwY19zdHViICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbG9jOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIGZpcnN0IGluc3RydWN0aW9uIHRvIHVzZSB0aGUgcmlnaHQgVE9DIGluZGV4LiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIHBvd2VycGNfc3R1Yl9pbnNuc1swXSArIGwtPnRvY19pbmRleCwgYnVmKTsKLQotICAgICAgLyogV3JpdGUgdGhpcyBzdHViIG91dC4gICovCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwKLQkJCQkgICAgICBiZmRfZ2V0X3NlY3Rpb24gKGwtPnN0YXJ0KSwKLQkJCQkgICAgICBidWYsCi0JCQkJICAgICAgbC0+c3RhcnQtPnZhbHVlLAotCQkJCSAgICAgIFBPV0VSUENfU1RVQl9TSVpFKSkKLQliZmRfZmF0YWwgKF8oIndyaXRpbmcgc3R1YiIpKTsKLQotICAgICAgLyogQ3JlYXRlIGEgbmV3IHJlbG9jIGZvciB0aGUgVE9DIGVudHJ5LiAgKi8KLSAgICAgIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmbC0+cmVsb2M7Ci0gICAgICByZWxvYy0+YWRkcmVzcyA9IGwtPnRvY19pbmRleCArIGdvdF9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gMDsKLSAgICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoaW5iZmQsIEJGRF9SRUxPQ18zMik7Ci0JCQkJICAgICAgCi0gICAgICAqcisrID0gcmVsb2M7Ci0gICAgfQotCi0gIGJmZF9zZXRfcmVsb2MgKG91dGJmZCwgZ290X3NlYy0+b3V0cHV0X3NlY3Rpb24sIHJlbG9jcywgc3R1YmNvdW50KTsKLX0KLQotLyogQWRqdXN0IHJlbG9jYXRpb24gZW50cmllcyBmb3IgUG93ZXJQQyBOZXRXYXJlLiAgV2UgZG8gbm90IG91dHB1dAotICAgVE9DIHJlbG9jYXRpb25zLiAgVGhlIG9iamVjdCBjb2RlIGFscmVhZHkgY29udGFpbnMgdGhlIG9mZnNldCBmcm9tCi0gICB0aGUgVE9DIHBvaW50ZXIuICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBUT0MgcmVnaXN0ZXIsCi0gICByMiwgd2lsbCBiZSBzZXQgdG8gdGhlIGNvcnJlY3QgVE9DIHZhbHVlLCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvcgotICAgYW55IGZ1cnRoZXIgcmVsb2MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1wb3dlcnBjX21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwgY29udGVudHMsCi0JCSAgICAgICBjb250ZW50c19zaXplKQotICAgICBiZmQgKm91dGJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICByZWdpc3RlciBhcmVsZW50ICoqKnJlbG9jc19wdHI7Ci0gICAgIGxvbmcgKnJlbG9jX2NvdW50X3B0cjsKLSAgICAgY2hhciAqY29udGVudHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgY29udGVudHNfc2l6ZTsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqdG9jX2hvd3RvOwotICBsb25nIHJlbG9jX2NvdW50OwotICByZWdpc3RlciBhcmVsZW50ICoqcmVsb2NzOwotICByZWdpc3RlciBsb25nIGk7Ci0KLSAgdG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChpbnNlYy0+b3duZXIsIEJGRF9SRUxPQ19QUENfVE9DMTYpOwotICBpZiAodG9jX2hvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgLmdvdCBzZWN0aW9uLCBjbGVhciBvdXQgYWxsIHRoZSBjb250ZW50cyBiZXlvbmQKLSAgICAgdGhlIGluaXRpYWwgc2l6ZS4gIFdlIG11c3QgZG8gdGhpcyBoZXJlIGJlY2F1c2UgY29weV9zZWN0aW9ucyBpcwotICAgICBnb2luZyB0byB3cml0ZSBvdXQgd2hhdGV2ZXIgd2UgcmV0dXJuIGluIHRoZSBjb250ZW50cyBmaWVsZC4gICovCi0gIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnNlYy0+b3duZXIsIGluc2VjKSwgIi5nb3QiKSA9PSAwKQotICAgIG1lbXNldCAoY29udGVudHMgKyBwb3dlcnBjX2luaXRpYWxfZ290X3NpemUsIDAsCi0JICAgIChzaXplX3QpIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9hZnRlcl9yZWxvYyAoaW5zZWMpCi0JCSAgICAgIC0gcG93ZXJwY19pbml0aWFsX2dvdF9zaXplKSk7Ci0KLSAgcmVsb2NfY291bnQgPSAqcmVsb2NfY291bnRfcHRyOwotICByZWxvY3MgPSAqcmVsb2NzX3B0cjsKLSAgZm9yIChpID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgYmZkX3ZtYSBzeW1fdmFsdWU7Ci0KLSAgICAgIHJlbCA9ICpyZWxvY3MrKzsKLSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gICAgICAvKiBDb252ZXJ0IGFueSByZWxvY3MgYWdhaW5zdCB0aGUgLmJzcyBzZWN0aW9uIGludG8gcmVsb2NzCi0gICAgICAgICBhZ2FpbnN0IHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSksCi0JCSAgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpkYXRhc2VjOwotCi0JICBkYXRhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dGJmZCwKLQkJCQkJICAgICBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQkgIGlmIChkYXRhc2VjICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICByZWwtPmFkZGVuZCArPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0YmZkLAotCQkJCQkJICAgYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCQkJICAgICAgKyBzeW0tPnZhbHVlKTsKLQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gZGF0YXNlYy0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgICAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlIG11c3QgYmUgYWJsZSB0byByZXNvbHZlIGFsbCBQQyByZWxhdGl2ZSByZWxvY3MgYXQgdGhpcwotCSBwb2ludC4gIElmIHdlIGdldCBhIGJyYW5jaCB0byBhbiB1bmRlZmluZWQgc3ltYm9sIHdlIGJ1aWxkIGEKLQkgc3R1Yiwgc2luY2UgTmV0V2FyZSB3aWxsIHJlc29sdmUgdW5kZWZpbmVkIHN5bWJvbHMgaW50byBhCi0JIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLQl7Ci0JICAvKiBUaGlzIGNoZWNrIGZvciB3aGV0aGVyIGEgc3ltYm9sIGlzIGluIHRoZSBzYW1lIHNlY3Rpb24gYXMKLQkgICAgIHRoZSByZWxvYyB3aWxsIGJlIHdyb25nIGlmIHRoZXJlIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MKLQkgICAgIGJldHdlZW4gdHdvIHNlY3Rpb25zIGJvdGggb2Ygd2hpY2ggd2VyZSBwbGFjZWQgaW4gdGhlCi0JICAgICBzYW1lIG91dHB1dCBzZWN0aW9uLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gICovCi0JICBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pICE9IGluc2VjLT5vdXRwdXRfc2VjdGlvbikKLQkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZXNvbHZlZCBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0ICVzXG4iKSwKLQkJICAgICBwcm9ncmFtX25hbWUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBhc3NlcnQgKHJlbC0+aG93dG8tPnNpemUgPT0gMiAmJiByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpOwotCSAgICAgIHZhbCA9IGJmZF9nZXRfMzIgKG91dGJmZCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgICB2YWwgPSAoKHZhbCAmfiByZWwtPmhvd3RvLT5kc3RfbWFzaykKLQkJICAgICB8ICgoKHZhbCAmIHJlbC0+aG93dG8tPnNyY19tYXNrKQotCQkJICsgKHN5bS0+dmFsdWUgLSByZWwtPmFkZHJlc3MpCi0JCQkgKyByZWwtPmFkZGVuZCkKLQkJCSYgcmVsLT5ob3d0by0+ZHN0X21hc2spKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhbiBzdHViYmVkIHN5bWJvbCBhbmQgdGhlCi0JCSBuZXh0IGluc3RydWN0aW9uIGlzCi0JCSAgICAgY3JvciAzMSwzMSwzMQotCQkgdGhlbiB3ZSByZXBsYWNlIHRoZSBuZXh0IGluc3RydWN0aW9uIHdpdGgKLQkJICAgICBsd3ogIHIyLDIwKHIxKQotCQkgVGhpcyByZWxvYWRzIHRoZSBUT0MgcG9pbnRlciBhZnRlciBhIHN0dWIgY2FsbC4gICovCi0JICAgICAgaWYgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSlbMF0gPT0gJy4nCi0JCSAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRFlOQU1JQykgIT0gMAotCQkgICYmIChiZmRfZ2V0XzMyIChvdXRiZmQsCi0JCQkJICAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MgKyA0KQotCQkgICAgICA9PSAweDRmZmZmYjgyKSkgLyogY3JvciAzMSwzMSwzMSAqLwotCQliZmRfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSAweDgwNDEwMDE0LCAvKiBsd3ogcjIsMjAocjEpICovCi0JCQkgICAgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzICsgNCk7Ci0KLQkgICAgICAtLSpyZWxvY19jb3VudF9wdHI7Ci0JICAgICAgLS1yZWxvY3M7Ci0JICAgICAgbWVtbW92ZSAocmVsb2NzLCByZWxvY3MgKyAxLAotCQkgICAgICAgKHNpemVfdCkgKChyZWxvY19jb3VudCAtIDEpICogc2l6ZW9mIChhcmVsZW50ICopKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdoZW4gY29uc2lkZXJpbmcgYSBUT0MgcmVsb2MsIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgdGhlCi0JIHN5bWJvbCB2YWx1ZS4gIFRoZSBzeW1ib2wgd2lsbCBiZSBzdGFydCBvZiB0aGUgVE9DIHNlY3Rpb24KLQkgKHdoaWNoIGlzIG5hbWVkIC5nb3QpLiAgV2UgZG8gd2FudCB0byBpbmNsdWRlIHRoZSBhZGRlbmQuICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gPT0gdG9jX2hvd3RvKQotCXN5bV92YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0Jc3ltX3ZhbHVlID0gc3ltLT52YWx1ZTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHN5bWJvbCB3aXRoIGEgdmFsdWUsIG9yCi0JIHRoZXJlIGlzIGEgcmVsb2MgYWRkZW5kLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYWRkZW5kIGluIHRoZQotCSBvYmplY3QgZmlsZS4gICovCi0gICAgICBpZiAoc3ltX3ZhbHVlICsgcmVsLT5hZGRlbmQgIT0gMCkKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgc3dpdGNoIChyZWwtPmhvd3RvLT5zaXplKQotCSAgICB7Ci0JICAgIGNhc2UgMToKLQkgICAgICB2YWwgPSBiZmRfZ2V0XzE2IChvdXRiZmQsCi0JCQkJKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgICB2YWwgPSAoKHZhbCAmfiByZWwtPmhvd3RvLT5kc3RfbWFzaykKLQkJICAgICB8ICgoKHZhbCAmIHJlbC0+aG93dG8tPnNyY19tYXNrKQotCQkJICsgc3ltX3ZhbHVlCi0JCQkgKyByZWwtPmFkZGVuZCkKLQkJCSYgcmVsLT5ob3d0by0+ZHN0X21hc2spKTsKLQkgICAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSB2YWwgPCAtIDB4ODAwMAotCQkgIHx8IChiZmRfc2lnbmVkX3ZtYSkgdmFsID49IDB4ODAwMCkKLQkJZnByaW50ZiAoc3RkZXJyLAotCQkJIF8oIiVzOiBvdmVyZmxvdyB3aGVuIGFkanVzdGluZyByZWxvY2F0aW9uIGFnYWluc3QgJXNcbiIpLAotCQkJIHByb2dyYW1fbmFtZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSk7Ci0JICAgICAgYmZkX3B1dF8xNiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAyOgotCSAgICAgIHZhbCA9IGJmZF9nZXRfMzIgKG91dGJmZCwKLQkJCQkoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOwotCSAgICAgIHZhbCA9ICgodmFsICZ+IHJlbC0+aG93dG8tPmRzdF9tYXNrKQotCQkgICAgIHwgKCgodmFsICYgcmVsLT5ob3d0by0+c3JjX21hc2spCi0JCQkgKyBzeW1fdmFsdWUKLQkJCSArIHJlbC0+YWRkZW5kKQotCQkJJiByZWwtPmhvd3RvLT5kc3RfbWFzaykpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2dldF9zZWN0aW9uIChzeW0pLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJlbC0+YWRkZW5kID0gMDsKLQl9Ci0KLSAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgaW5jb3Jwb3JhdGVkIHRoZSBhZGRlbmQsIHJlbW92ZSBhbnkgVE9DCi0JIHJlbG9jcy4gICovCi0gICAgICBpZiAocmVsLT5ob3d0byA9PSB0b2NfaG93dG8pCi0JewotCSAgLS0qcmVsb2NfY291bnRfcHRyOwotCSAgLS1yZWxvY3M7Ci0JICBtZW1tb3ZlIChyZWxvY3MsIHJlbG9jcyArIDEsCi0JCSAgIChzaXplX3QpICgocmVsb2NfY291bnQgLSBpKSAqIHNpemVvZiAoYXJlbGVudCAqKSkpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICByZWwtPmFkZHJlc3MgKz0gaW5zZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogTkxNQ09OVl9QT1dFUlBDICovCi0MCi0vKiBOYW1lIG9mIGxpbmtlci4gICovCi0jaWZuZGVmIExEX05BTUUKLSNkZWZpbmUgTERfTkFNRSAibGQiCi0jZW5kaWYKLQotLyogVGVtcG9yYXJ5IGZpbGUgbmFtZSBiYXNlLiAgKi8KLXN0YXRpYyBjaGFyICp0ZW1wX2ZpbGVuYW1lOwotCi0vKiBUaGUgdXNlciBoYXMgc3BlY2lmaWVkIHNldmVyYWwgaW5wdXQgZmlsZXMuICBJbnZva2UgdGhlIGxpbmtlciB0bwotICAgbGluayB0aGVtIGFsbCB0b2dldGhlciwgYW5kIGNvbnZlcnQgYW5kIGRlbGV0ZSB0aGUgcmVzdWx0aW5nIG91dHB1dAotICAgZmlsZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWxpbmtfaW5wdXRzIChpbnB1dHMsIGxkKQotICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmlucHV0czsKLSAgICAgY2hhciAqbGQ7Ci17Ci0gIHNpemVfdCBjOwotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnE7Ci0gIGNoYXIgKiphcmd2OwotICBzaXplX3QgaTsKLSAgaW50IHBpZDsKLSAgaW50IHN0YXR1czsKLSAgY2hhciAqZXJyZm10OwotICBjaGFyICplcnJhcmc7Ci0KLSAgYyA9IDA7Ci0gIGZvciAocSA9IGlucHV0czsgcSAhPSBOVUxMOyBxID0gcS0+bmV4dCkKLSAgICArK2M7Ci0KLSAgYXJndiA9IChjaGFyICoqKSBhbGxvY2EgKChjICsgNSkgKiBzaXplb2YoY2hhciAqKSk7Ci0KLSNpZm5kZWYgX19NU0RPU19fCi0gIGlmIChsZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIGxpbmtlciB0byBpbnZva2UgYmFzZWQgb24gaG93IG5sbWNvbnYgd2FzIHJ1bi4gICovCi0gICAgICBwID0gcHJvZ3JhbV9uYW1lICsgc3RybGVuIChwcm9ncmFtX25hbWUpOwotICAgICAgd2hpbGUgKHAgIT0gcHJvZ3JhbV9uYW1lKQotCXsKLQkgIGlmIChwWy0xXSA9PSAnLycpCi0JICAgIHsKLQkgICAgICBsZCA9IChjaGFyICopIHhtYWxsb2MgKHAgLSBwcm9ncmFtX25hbWUgKyBzdHJsZW4gKExEX05BTUUpICsgMSk7Ci0JICAgICAgbWVtY3B5IChsZCwgcHJvZ3JhbV9uYW1lLCBwIC0gcHJvZ3JhbV9uYW1lKTsKLQkgICAgICBzdHJjcHkgKGxkICsgKHAgLSBwcm9ncmFtX25hbWUpLCBMRF9OQU1FKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLS1wOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobGQgPT0gTlVMTCkKLSAgICBsZCA9IChjaGFyICopIExEX05BTUU7Ci0KLSAgdGVtcF9maWxlbmFtZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0KLSAgdW5saW5rX29uX2V4aXQgPSB4bWFsbG9jIChzdHJsZW4gKHRlbXBfZmlsZW5hbWUpICsgMyk7Ci0gIHNwcmludGYgKHVubGlua19vbl9leGl0LCAiJXMuTyIsIHRlbXBfZmlsZW5hbWUpOwotCi0gIGFyZ3ZbMF0gPSBsZDsKLSAgYXJndlsxXSA9IChjaGFyICopICItVXIiOwotICBhcmd2WzJdID0gKGNoYXIgKikgIi1vIjsKLSAgYXJndlszXSA9IHVubGlua19vbl9leGl0OwotICBpID0gNDsKLSAgZm9yIChxID0gaW5wdXRzOyBxICE9IE5VTEw7IHEgPSBxLT5uZXh0LCBpKyspCi0gICAgYXJndltpXSA9IHEtPnN0cmluZzsKLSAgYXJndltpXSA9IE5VTEw7Ci0KLSAgaWYgKGRlYnVnKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGFyZ3ZbaV0gIT0gTlVMTDsgaSsrKQotCWZwcmludGYgKHN0ZGVyciwgIiAlcyIsIGFyZ3ZbaV0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0KLSAgcGlkID0gcGV4ZWN1dGUgKGxkLCBhcmd2LCBwcm9ncmFtX25hbWUsIChjaGFyICopIE5VTEwsICZlcnJmbXQsICZlcnJhcmcsCi0JCSAgUEVYRUNVVEVfU0VBUkNIIHwgUEVYRUNVVEVfT05FKTsKLSAgaWYgKHBpZCA9PSAtMSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBleGVjdXRpb24gb2YgJXMgZmFpbGVkOiAiKSwgcHJvZ3JhbV9uYW1lLCBsZCk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIGVycmZtdCwgZXJyYXJnKTsKLSAgICAgIHVubGluayAodW5saW5rX29uX2V4aXQpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChwd2FpdCAocGlkLCAmc3RhdHVzLCAwKSA8IDApCi0gICAgewotICAgICAgcGVycm9yICgicHdhaXQiKTsKLSAgICAgIHVubGluayAodW5saW5rX29uX2V4aXQpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBFeGVjdXRpb24gb2YgJXMgZmFpbGVkXG4iKSwgcHJvZ3JhbV9uYW1lLCBsZCk7Ci0gICAgICB1bmxpbmsgKHVubGlua19vbl9leGl0KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICByZXR1cm4gdW5saW5rX29uX2V4aXQ7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1jb252LmggYi9iaW51dGlscy9ubG1jb252LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MmE1NTcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbmxtY29udi5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyogbmxtY29udi5oIC0tIGhlYWRlciBmaWxlIGZvciBOTE0gY29udmVyc2lvbiBwcm9ncmFtCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIGJmZC5oLCBubG0vY29tbW9uLmggYW5kIG5sbS9pbnRlcm5hbC5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHRoaXMKLSAgIGZpbGUuICAqLwotCi0vKiBBIGxpbmtlZCBsaXN0IG9mIHN0cmluZ3MuICAqLwotCi1zdHJ1Y3Qgc3RyaW5nX2xpc3QKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OwotICBjaGFyICpzdHJpbmc7Ci19OwotCi0vKiBUaGUgTkxNIGhlYWRlciBwYXJzZXIgaW4gbmxtaGVhZGVyLnkgc3RvcmVzIGluZm9ybWF0aW9uIGluIHRoZQotICAgZm9sbG93aW5nIHZhcmlhYmxlcy4gICovCi0KLWV4dGVybiBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICpmaXhlZF9oZHI7Ci1leHRlcm4gTmxtX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciAqdmFyX2hkcjsKLWV4dGVybiBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIgKnZlcnNpb25faGRyOwotZXh0ZXJuIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyICpjb3B5cmlnaHRfaGRyOwotZXh0ZXJuIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIgKmV4dGVuZGVkX2hkcjsKLQotLyogUHJvY2VkdXJlIG5hbWVkIGJ5IENIRUNLLiAgKi8KLWV4dGVybiBjaGFyICpjaGVja19wcm9jZWR1cmU7Ci0vKiBGaWxlIG5hbWVkIGJ5IENVU1RPTS4gICovCi1leHRlcm4gY2hhciAqY3VzdG9tX2ZpbGU7Ci0vKiBXaGV0aGVyIHRvIGdlbmVyYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAoREVCVUcpLiAgKi8KLWV4dGVybiBib29sZWFuIGRlYnVnX2luZm87Ci0vKiBQcm9jZWR1cmUgbmFtZWQgYnkgRVhJVC4gICovCi1leHRlcm4gY2hhciAqZXhpdF9wcm9jZWR1cmU7Ci0vKiBFeHBvcnRlZCBzeW1ib2xzIChFWFBPUlQpLiAgKi8KLWV4dGVybiBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmV4cG9ydF9zeW1ib2xzOwotLyogTGlzdCBvZiBmaWxlcyBmcm9tIElOUFVULiAgKi8KLWV4dGVybiBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmlucHV0X2ZpbGVzOwotLyogTWFwIGZpbGUgbmFtZSAoTUFQLCBGVUxMTUFQKS4gICovCi1leHRlcm4gY2hhciAqbWFwX2ZpbGU7Ci0vKiBXaGV0aGVyIGEgZnVsbCBtYXAgaGFzIGJlZW4gcmVxdWVzdGVkIChGVUxMTUFQKS4gICovCi1leHRlcm4gYm9vbGVhbiBmdWxsX21hcDsKLS8qIEZpbGUgbmFtZWQgYnkgSEVMUC4gICovCi1leHRlcm4gY2hhciAqaGVscF9maWxlOwotLyogSW1wb3J0ZWQgc3ltYm9scyAoSU1QT1JUKS4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICppbXBvcnRfc3ltYm9sczsKLS8qIEZpbGUgbmFtZWQgYnkgTUVTU0FHRVMuICAqLwotZXh0ZXJuIGNoYXIgKm1lc3NhZ2VfZmlsZTsKLS8qIEF1dG9sb2FkIG1vZHVsZSBsaXN0IChNT0RVTEUpLiAgKi8KLWV4dGVybiBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm1vZHVsZXM7Ci0vKiBGaWxlIG5hbWVkIGJ5IE9VVFBVVC4gICovCi1leHRlcm4gY2hhciAqb3V0cHV0X2ZpbGU7Ci0vKiBGaWxlIG5hbWVkIGJ5IFNIQVJFTElCLiAgKi8KLWV4dGVybiBjaGFyICpzaGFyZWxpYl9maWxlOwotLyogU3RhcnQgcHJvY2VkdXJlIG5hbWUgKFNUQVJUKS4gICovCi1leHRlcm4gY2hhciAqc3RhcnRfcHJvY2VkdXJlOwotLyogVkVSQk9TRS4gICovCi1leHRlcm4gYm9vbGVhbiB2ZXJib3NlOwotLyogUlBDIGRlc2NyaXB0aW9uIGZpbGUgKFhEQ0RBVEEpLiAgKi8KLWV4dGVybiBjaGFyICpycGNfZmlsZTsKLQotLyogVGhlIG51bWJlciBvZiBzZXJpb3VzIHBhcnNlIGVycm9ycy4gICovCi1leHRlcm4gaW50IHBhcnNlX2Vycm9yczsKLQotLyogVGhlIHBhcnNlci4gICovCi1leHRlcm4gaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUZWxsIHRoZSBsZXhlciB3aGF0IGZpbGUgdG8gcmVhZC4gICovCi1leHRlcm4gYm9vbGVhbiBubG1sZXhfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25sbWhlYWRlci55IGIvYmludXRpbHMvbmxtaGVhZGVyLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMWUyMmEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbmxtaGVhZGVyLnkKKysrIC9kZXYvbnVsbApAQCAtMSw5NzggKzAsMCBAQAotJXsvKiBubG1oZWFkZXIueSAtIHBhcnNlIE5MTSBoZWFkZXIgc3BlY2lmaWNhdGlvbiBrZXl3b3Jkcy4KLSAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGJpc29uIGZpbGUgcGFyc2VzIHRoZSBjb21tYW5kcyByZWNvZ25pemVkIGJ5IHRoZSBOZXRXYXJlIE5MTQotICAgbGlua2VyLCBleGNlcHQgZm9yIGxpc3RzIG9mIG9iamVjdCBmaWxlcy4gIEl0IHN0b3JlcyB0aGUKLSAgIGluZm9ybWF0aW9uIGluIGdsb2JhbCB2YXJpYWJsZXMuCi0KLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBOZXRXYXJlIFRvb2wKLSAgIE1ha2VyIFNwZWNpZmljYXRpb24gbWFudWFsLCBlZGl0aW9uIDEuMC4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJubG0vY29tbW9uLmgiCi0jaW5jbHVkZSAibmxtL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibmxtY29udi5oIgotCi0vKiBJbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHN0cnVjdHVyZXMgcG9pbnRlZCB0byBieSB0aGVzZQotICAgdmFyaWFibGVzLiAgKi8KLQotTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqZml4ZWRfaGRyOwotTmxtX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciAqdmFyX2hkcjsKLU5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlciAqdmVyc2lvbl9oZHI7Ci1ObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciAqY29weXJpZ2h0X2hkcjsKLU5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIgKmV4dGVuZGVkX2hkcjsKLQotLyogUHJvY2VkdXJlIG5hbWVkIGJ5IENIRUNLLiAgKi8KLWNoYXIgKmNoZWNrX3Byb2NlZHVyZTsKLS8qIEZpbGUgbmFtZWQgYnkgQ1VTVE9NLiAgKi8KLWNoYXIgKmN1c3RvbV9maWxlOwotLyogV2hldGhlciB0byBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKERFQlVHKS4gICovCi1ib29sZWFuIGRlYnVnX2luZm87Ci0vKiBQcm9jZWR1cmUgbmFtZWQgYnkgRVhJVC4gICovCi1jaGFyICpleGl0X3Byb2NlZHVyZTsKLS8qIEV4cG9ydGVkIHN5bWJvbHMgKEVYUE9SVCkuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICpleHBvcnRfc3ltYm9sczsKLS8qIExpc3Qgb2YgZmlsZXMgZnJvbSBJTlBVVC4gICovCi1zdHJ1Y3Qgc3RyaW5nX2xpc3QgKmlucHV0X2ZpbGVzOwotLyogTWFwIGZpbGUgbmFtZSAoTUFQLCBGVUxMTUFQKS4gICovCi1jaGFyICptYXBfZmlsZTsKLS8qIFdoZXRoZXIgYSBmdWxsIG1hcCBoYXMgYmVlbiByZXF1ZXN0ZWQgKEZVTExNQVApLiAgKi8KLWJvb2xlYW4gZnVsbF9tYXA7Ci0vKiBGaWxlIG5hbWVkIGJ5IEhFTFAuICAqLwotY2hhciAqaGVscF9maWxlOwotLyogSW1wb3J0ZWQgc3ltYm9scyAoSU1QT1JUKS4gICovCi1zdHJ1Y3Qgc3RyaW5nX2xpc3QgKmltcG9ydF9zeW1ib2xzOwotLyogRmlsZSBuYW1lZCBieSBNRVNTQUdFUy4gICovCi1jaGFyICptZXNzYWdlX2ZpbGU7Ci0vKiBBdXRvbG9hZCBtb2R1bGUgbGlzdCAoTU9EVUxFKS4gICovCi1zdHJ1Y3Qgc3RyaW5nX2xpc3QgKm1vZHVsZXM7Ci0vKiBGaWxlIG5hbWVkIGJ5IE9VVFBVVC4gICovCi1jaGFyICpvdXRwdXRfZmlsZTsKLS8qIEZpbGUgbmFtZWQgYnkgU0hBUkVMSUIuICAqLwotY2hhciAqc2hhcmVsaWJfZmlsZTsKLS8qIFN0YXJ0IHByb2NlZHVyZSBuYW1lIChTVEFSVCkuICAqLwotY2hhciAqc3RhcnRfcHJvY2VkdXJlOwotLyogVkVSQk9TRS4gICovCi1ib29sZWFuIHZlcmJvc2U7Ci0vKiBSUEMgZGVzY3JpcHRpb24gZmlsZSAoWERDREFUQSkuICAqLwotY2hhciAqcnBjX2ZpbGU7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygc2VyaW91cyBlcnJvcnMgdGhhdCBoYXZlIG9jY3VycmVkLiAgKi8KLWludCBwYXJzZV9lcnJvcnM7Ci0KLS8qIFRoZSBjdXJyZW50IHN5bWJvbCBwcmVmaXggd2hlbiByZWFkaW5nIGEgbGlzdCBvZiBpbXBvcnQgb3IgZXhwb3J0Ci0gICBzeW1ib2xzLiAgKi8KLXN0YXRpYyBjaGFyICpzeW1ib2xfcHJlZml4OwotCi0vKiBQYXJzZXIgZXJyb3IgbWVzc2FnZSBoYW5kbGVyLiAgKi8KLSNkZWZpbmUgeXllcnJvcihtc2cpIG5sbWhlYWRlcl9lcnJvciAobXNnKTsKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbmxtbGV4X2ZpbGVfcHVzaCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIG5sbWxleF9maWxlX29wZW4gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IG5sbWxleF9idWZfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciBubG1sZXhfYnVmX2FkZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBsb25nIG5sbWxleF9nZXRfbnVtYmVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgbmxtaGVhZGVyX2lkZW50aWZ5IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG5sbWhlYWRlcl93YXJuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBubG1oZWFkZXJfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICogc3RyaW5nX2xpc3RfY29ucyBQQVJBTVMgKChjaGFyICosCi0JCQkJCQkgICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikpOwotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqIHN0cmluZ19saXN0X2FwcGVuZCBQQVJBTVMgKChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiwKLQkJCQkJCQlzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikpOwotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqIHN0cmluZ19saXN0X2FwcGVuZDEgUEFSQU1TICgoc3RydWN0IHN0cmluZ19saXN0ICosCi0JCQkJCQkJIGNoYXIgKikpOwotc3RhdGljIGNoYXIgKnhzdHJkdXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSV9Ci0KLSV1bmlvbgotewotICBjaGFyICpzdHJpbmc7Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqbGlzdDsKLX07Ci0KLS8qIFRoZSByZXNlcnZlZCB3b3Jkcy4gICovCi0KLSV0b2tlbiBDSEVDSyBDT0RFU1RBUlQgQ09QWVJJR0hUIENVU1RPTSBEQVRFIERFQlVHIERFU0NSSVBUSU9OIEVYSVQKLSV0b2tlbiBFWFBPUlQgRkxBR19PTiBGTEFHX09GRiBGVUxMTUFQIEhFTFAgSU1QT1JUIElOUFVUIE1BUCBNRVNTQUdFUwotJXRva2VuIE1PRFVMRSBNVUxUSVBMRSBPU19ET01BSU4gT1VUUFVUIFBTRVVET1BSRUVNUFRJT04gUkVFTlRSQU5UCi0ldG9rZW4gU0NSRUVOTkFNRSBTSEFSRUxJQiBTVEFDSyBTVEFSVCBTWU5DSFJPTklaRQotJXRva2VuIFRIUkVBRE5BTUUgVFlQRSBWRVJCT1NFIFZFUlNJT05LIFhEQ0RBVEEKLQotLyogQXJndW1lbnRzLiAgKi8KLQotJXRva2VuIDxzdHJpbmc+IFNUUklORwotJXRva2VuIDxzdHJpbmc+IFFVT1RFRF9TVFJJTkcKLQotLyogVHlwZWQgbm9uLXRlcm1pbmFscy4gICovCi0ldHlwZSA8bGlzdD4gc3ltYm9sX2xpc3Rfb3B0IHN5bWJvbF9saXN0IHN0cmluZ19saXN0Ci0ldHlwZSA8c3RyaW5nPiBzeW1ib2wKLQotJSUKLQotLyogS2V5d29yZHMgbXVzdCBzdGFydCBpbiB0aGUgbGVmdG1vc3QgY29sdW1uIG9mIHRoZSBmaWxlLiAgQXJndW1lbnRzCi0gICBtYXkgYXBwZWFyIGFueXdoZXJlIGVsc2UuICBUaGUgbGV4ZXIgdXNlcyB0aGlzIHRvIGRldGVybWluZSB3aGF0Ci0gICB0b2tlbiB0byByZXR1cm4sIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQgaGVyZS4gICovCi0KLS8qIFRoZSBlbnRpcmUgZmlsZSBpcyBqdXN0IGEgbGlzdCBvZiBjb21tYW5kcy4gICovCi0KLWZpbGU6CQotCSAgY29tbWFuZHMKLQk7Ci0KLS8qIEEgcG9zc2libHkgZW1wdHkgbGlzdCBvZiBjb21tYW5kcy4gICovCi0KLWNvbW1hbmRzOgotCSAgLyogTWF5IGJlIGVtcHR5LiAgKi8KLQl8IGNvbW1hbmQgY29tbWFuZHMKLQk7Ci0KLS8qIEEgc2luZ2xlIGNvbW1hbmQuICBUaGVyZSBpcyB3aGVyZSBtb3N0IG9mIHRoZSB3b3JrIHRha2VzIHBsYWNlLiAgKi8KLQotY29tbWFuZDoKLQkgIENIRUNLIFNUUklORwotCSAgewotCSAgICBjaGVja19wcm9jZWR1cmUgPSAkMjsKLQkgIH0KLQl8IENPREVTVEFSVCBTVFJJTkcKLQkgIHsKLQkgICAgbmxtaGVhZGVyX3dhcm4gKF8oIkNPREVTVEFSVCBpcyBub3QgaW1wbGVtZW50ZWQ7IHNvcnJ5IiksIC0xKTsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgQ09QWVJJR0hUIFFVT1RFRF9TVFJJTkcKLQkgIHsKLQkgICAgaW50IGxlbjsKLQotCSAgICBzdHJuY3B5IChjb3B5cmlnaHRfaGRyLT5zdGFtcCwgIkNvUHlSaUdoVD0iLCAxMCk7Ci0JICAgIGxlbiA9IHN0cmxlbiAoJDIpOwotCSAgICBpZiAobGVuID49IE5MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RIKQotCSAgICAgIHsKLQkJbmxtaGVhZGVyX3dhcm4gKF8oImNvcHlyaWdodCBzdHJpbmcgaXMgdG9vIGxvbmciKSwKLQkJCQlOTE1fTUFYX0NPUFlSSUdIVF9NRVNTQUdFX0xFTkdUSCAtIDEpOwotCQlsZW4gPSBOTE1fTUFYX0NPUFlSSUdIVF9NRVNTQUdFX0xFTkdUSCAtIDE7Ci0JICAgICAgfQotCSAgICBjb3B5cmlnaHRfaGRyLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoID0gbGVuOwotCSAgICBzdHJuY3B5IChjb3B5cmlnaHRfaGRyLT5jb3B5cmlnaHRNZXNzYWdlLCAkMiwgbGVuKTsKLQkgICAgY29weXJpZ2h0X2hkci0+Y29weXJpZ2h0TWVzc2FnZVtsZW5dID0gJ1wwJzsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgQ1VTVE9NIFNUUklORwotCSAgewotCSAgICBjdXN0b21fZmlsZSA9ICQyOwotCSAgfQotCXwgREFURSBTVFJJTkcgU1RSSU5HIFNUUklORwotCSAgewotCSAgICAvKiBXZSBkb24ndCBzZXQgdGhlIHZlcnNpb24gc3RhbXAgaGVyZSwgYmVjYXVzZSB3ZSB1c2UgdGhlCi0JICAgICAgIHZlcnNpb24gc3RhbXAgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHJlcXVpcmVkIFZFUlNJT04KLQkgICAgICAga2V5d29yZCB3YXMgZ2l2ZW4uICAqLwotCSAgICB2ZXJzaW9uX2hkci0+bW9udGggPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICB2ZXJzaW9uX2hkci0+ZGF5ID0gbmxtbGV4X2dldF9udW1iZXIgKCQzKTsKLQkgICAgdmVyc2lvbl9oZHItPnllYXIgPSBubG1sZXhfZ2V0X251bWJlciAoJDQpOwotCSAgICBmcmVlICgkMik7Ci0JICAgIGZyZWUgKCQzKTsKLQkgICAgZnJlZSAoJDQpOwotCSAgICBpZiAodmVyc2lvbl9oZHItPm1vbnRoIDwgMSB8fCB2ZXJzaW9uX2hkci0+bW9udGggPiAxMikKLQkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWxsZWdhbCBtb250aCIpLCAtMSk7Ci0JICAgIGlmICh2ZXJzaW9uX2hkci0+ZGF5IDwgMSB8fCB2ZXJzaW9uX2hkci0+ZGF5ID4gMzEpCi0JICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgZGF5IiksIC0xKTsKLQkgICAgaWYgKHZlcnNpb25faGRyLT55ZWFyIDwgMTkwMCB8fCB2ZXJzaW9uX2hkci0+eWVhciA+IDMwMDApCi0JICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgeWVhciIpLCAtMSk7Ci0JICB9Ci0JfCBERUJVRwotCSAgewotCSAgICBkZWJ1Z19pbmZvID0gdHJ1ZTsKLQkgIH0KLQl8IERFU0NSSVBUSU9OIFFVT1RFRF9TVFJJTkcKLQkgIHsKLQkgICAgaW50IGxlbjsKLQotCSAgICBsZW4gPSBzdHJsZW4gKCQyKTsKLQkgICAgaWYgKGxlbiA+IE5MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIKQotCSAgICAgIHsKLQkJbmxtaGVhZGVyX3dhcm4gKF8oImRlc2NyaXB0aW9uIHN0cmluZyBpcyB0b28gbG9uZyIpLAotCQkJCU5MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIKTsKLQkJbGVuID0gTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEg7Ci0JICAgICAgfQotCSAgICB2YXJfaGRyLT5kZXNjcmlwdGlvbkxlbmd0aCA9IGxlbjsKLQkgICAgc3RybmNweSAodmFyX2hkci0+ZGVzY3JpcHRpb25UZXh0LCAkMiwgbGVuKTsKLQkgICAgdmFyX2hkci0+ZGVzY3JpcHRpb25UZXh0W2xlbl0gPSAnXDAnOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBFWElUIFNUUklORwotCSAgewotCSAgICBleGl0X3Byb2NlZHVyZSA9ICQyOwotCSAgfQotCXwgRVhQT1JUCi0JICB7Ci0JICAgIHN5bWJvbF9wcmVmaXggPSBOVUxMOwotCSAgfQotCSAgc3ltYm9sX2xpc3Rfb3B0Ci0JICB7Ci0JICAgIGV4cG9ydF9zeW1ib2xzID0gc3RyaW5nX2xpc3RfYXBwZW5kIChleHBvcnRfc3ltYm9scywgJDMpOwotCSAgfQotCXwgRkxBR19PTiBTVFJJTkcKLQkgIHsKLQkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBGTEFHX09GRiBTVFJJTkcKLQkgIHsKLQkgICAgZml4ZWRfaGRyLT5mbGFncyAmPX4gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgRlVMTE1BUAotCSAgewotCSAgICBtYXBfZmlsZSA9ICIiOwotCSAgICBmdWxsX21hcCA9IHRydWU7Ci0JICB9Ci0JfCBGVUxMTUFQIFNUUklORwotCSAgewotCSAgICBtYXBfZmlsZSA9ICQyOwotCSAgICBmdWxsX21hcCA9IHRydWU7Ci0JICB9Ci0JfCBIRUxQIFNUUklORwotCSAgewotCSAgICBoZWxwX2ZpbGUgPSAkMjsKLQkgIH0KLQl8IElNUE9SVAotCSAgewotCSAgICBzeW1ib2xfcHJlZml4ID0gTlVMTDsKLQkgIH0KLQkgIHN5bWJvbF9saXN0X29wdAotCSAgewotCSAgICBpbXBvcnRfc3ltYm9scyA9IHN0cmluZ19saXN0X2FwcGVuZCAoaW1wb3J0X3N5bWJvbHMsICQzKTsKLQkgIH0KLQl8IElOUFVUIHN0cmluZ19saXN0Ci0JICB7Ci0JICAgIGlucHV0X2ZpbGVzID0gc3RyaW5nX2xpc3RfYXBwZW5kIChpbnB1dF9maWxlcywgJDIpOwotCSAgfQotCXwgTUFQCi0JICB7Ci0JICAgIG1hcF9maWxlID0gIiI7Ci0JICB9Ci0JfCBNQVAgU1RSSU5HCi0JICB7Ci0JICAgIG1hcF9maWxlID0gJDI7Ci0JICB9Ci0JfCBNRVNTQUdFUyBTVFJJTkcKLQkgIHsKLQkgICAgbWVzc2FnZV9maWxlID0gJDI7Ci0JICB9Ci0JfCBNT0RVTEUgc3RyaW5nX2xpc3QKLQkgIHsKLQkgICAgbW9kdWxlcyA9IHN0cmluZ19saXN0X2FwcGVuZCAobW9kdWxlcywgJDIpOwotCSAgfQotCXwgTVVMVElQTEUKLQkgIHsKLQkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSAweDI7Ci0JICB9Ci0JfCBPU19ET01BSU4KLQkgIHsKLQkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSAweDEwOwotCSAgfQotCXwgT1VUUFVUIFNUUklORwotCSAgewotCSAgICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkKLQkgICAgICBvdXRwdXRfZmlsZSA9ICQyOwotCSAgICBlbHNlCi0JICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlnbm9yaW5nIGR1cGxpY2F0ZSBPVVRQVVQgc3RhdGVtZW50IiksIC0xKTsKLQkgIH0KLQl8IFBTRVVET1BSRUVNUFRJT04KLQkgIHsKLQkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSAweDg7Ci0JICB9Ci0JfCBSRUVOVFJBTlQKLQkgIHsKLQkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSAweDE7Ci0JICB9Ci0JfCBTQ1JFRU5OQU1FIFFVT1RFRF9TVFJJTkcKLQkgIHsKLQkgICAgaW50IGxlbjsKLQotCSAgICBsZW4gPSBzdHJsZW4gKCQyKTsKLQkgICAgaWYgKGxlbiA+PSBOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSCkKLQkgICAgICB7Ci0JCW5sbWhlYWRlcl93YXJuIChfKCJzY3JlZW4gbmFtZSBpcyB0b28gbG9uZyIpLAotCQkJCU5MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIKTsKLQkJbGVuID0gTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEg7Ci0JICAgICAgfQotCSAgICB2YXJfaGRyLT5zY3JlZW5OYW1lTGVuZ3RoID0gbGVuOwotCSAgICBzdHJuY3B5ICh2YXJfaGRyLT5zY3JlZW5OYW1lLCAkMiwgbGVuKTsKLQkgICAgdmFyX2hkci0+c2NyZWVuTmFtZVtOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSF0gPSAnXDAnOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBTSEFSRUxJQiBTVFJJTkcKLQkgIHsKLQkgICAgc2hhcmVsaWJfZmlsZSA9ICQyOwotCSAgfQotCXwgU1RBQ0sgU1RSSU5HCi0JICB7Ci0JICAgIHZhcl9oZHItPnN0YWNrU2l6ZSA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IFNUQVJUIFNUUklORwotCSAgewotCSAgICBzdGFydF9wcm9jZWR1cmUgPSAkMjsKLQkgIH0KLQl8IFNZTkNIUk9OSVpFCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHg0OwotCSAgfQotCXwgVEhSRUFETkFNRSBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuICgkMik7Ci0JICAgIGlmIChsZW4gPj0gTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgpCi0JICAgICAgewotCQlubG1oZWFkZXJfd2FybiAoXygidGhyZWFkIG5hbWUgaXMgdG9vIGxvbmciKSwKLQkJCQlOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCk7Ci0JCWxlbiA9IE5MTV9NQVhfVEhSRUFEX05BTUVfTEVOR1RIOwotCSAgICAgIH0KLQkgICAgdmFyX2hkci0+dGhyZWFkTmFtZUxlbmd0aCA9IGxlbjsKLQkgICAgc3RybmNweSAodmFyX2hkci0+dGhyZWFkTmFtZSwgJDIsIGxlbik7Ci0JICAgIHZhcl9oZHItPnRocmVhZE5hbWVbbGVuXSA9ICdcMCc7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IFRZUEUgU1RSSU5HCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+bW9kdWxlVHlwZSA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IFZFUkJPU0UKLQkgIHsKLQkgICAgdmVyYm9zZSA9IHRydWU7Ci0JICB9Ci0JfCBWRVJTSU9OSyBTVFJJTkcgU1RSSU5HIFNUUklORwotCSAgewotCSAgICBsb25nIHZhbDsKLQotCSAgICBzdHJuY3B5ICh2ZXJzaW9uX2hkci0+c3RhbXAsICJWZVJzSW9OIyIsIDgpOwotCSAgICB2ZXJzaW9uX2hkci0+bWFqb3JWZXJzaW9uID0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgdmFsID0gbmxtbGV4X2dldF9udW1iZXIgKCQzKTsKLQkgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gOTkpCi0JICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgbWlub3IgdmVyc2lvbiBudW1iZXIgKG11c3QgYmUgYmV0d2VlbiAwIGFuZCA5OSkiKSwKLQkJCSAgICAgIC0xKTsKLQkgICAgZWxzZQotCSAgICAgIHZlcnNpb25faGRyLT5taW5vclZlcnNpb24gPSB2YWw7Ci0JICAgIHZhbCA9IG5sbWxleF9nZXRfbnVtYmVyICgkNCk7Ci0JICAgIGlmICh2YWwgPCAwKQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIHJldmlzaW9uIG51bWJlciAobXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI2KSIpLAotCQkJICAgICAgLTEpOwotCSAgICBlbHNlIGlmICh2YWwgPiAyNikKLQkgICAgICB2ZXJzaW9uX2hkci0+cmV2aXNpb24gPSAwOwotCSAgICBlbHNlCi0JICAgICAgdmVyc2lvbl9oZHItPnJldmlzaW9uID0gdmFsOwotCSAgICBmcmVlICgkMik7Ci0JICAgIGZyZWUgKCQzKTsKLQkgICAgZnJlZSAoJDQpOwotCSAgfQotCXwgVkVSU0lPTksgU1RSSU5HIFNUUklORwotCSAgewotCSAgICBsb25nIHZhbDsKLQotCSAgICBzdHJuY3B5ICh2ZXJzaW9uX2hkci0+c3RhbXAsICJWZVJzSW9OIyIsIDgpOwotCSAgICB2ZXJzaW9uX2hkci0+bWFqb3JWZXJzaW9uID0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgdmFsID0gbmxtbGV4X2dldF9udW1iZXIgKCQzKTsKLQkgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gOTkpCi0JICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgbWlub3IgdmVyc2lvbiBudW1iZXIgKG11c3QgYmUgYmV0d2VlbiAwIGFuZCA5OSkiKSwKLQkJCSAgICAgIC0xKTsKLQkgICAgZWxzZQotCSAgICAgIHZlcnNpb25faGRyLT5taW5vclZlcnNpb24gPSB2YWw7Ci0JICAgIHZlcnNpb25faGRyLT5yZXZpc2lvbiA9IDA7Ci0JICAgIGZyZWUgKCQyKTsKLQkgICAgZnJlZSAoJDMpOwotCSAgfQotCXwgWERDREFUQSBTVFJJTkcKLQkgIHsKLQkgICAgcnBjX2ZpbGUgPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEEgcG9zc2libHkgZW1wdHkgbGlzdCBvZiBzeW1ib2xzLiAgKi8KLQotc3ltYm9sX2xpc3Rfb3B0OgotCSAgLyogRW1wdHkuICAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCBzeW1ib2xfbGlzdAotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotLyogQSBsaXN0IG9mIHN5bWJvbHMgaW4gYW4gaW1wb3J0IG9yIGV4cG9ydCBsaXN0LiAgUHJlZml4ZXMgbWF5IGFwcGVhcgotICAgaW4gcGFyZW50aGVzZXMuICBXZSBuZWVkIHRvIHVzZSBsZWZ0IHJlY3Vyc2lvbiBoZXJlIHRvIGF2b2lkCi0gICBidWlsZGluZyB1cCBhIGxhcmdlIGltcG9ydCBsaXN0IG9uIHRoZSBwYXJzZXIgc3RhY2suICAqLwotCi1zeW1ib2xfbGlzdDoKLQkgIHN5bWJvbAotCSAgewotCSAgICAkJCA9IHN0cmluZ19saXN0X2NvbnMgKCQxLCBOVUxMKTsKLQkgIH0KLQl8IHN5bWJvbF9wcmVmaXgKLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgc3ltYm9sX2xpc3Qgc3ltYm9sCi0JICB7Ci0JICAgICQkID0gc3RyaW5nX2xpc3RfYXBwZW5kMSAoJDEsICQyKTsKLQkgIH0KLQl8IHN5bWJvbF9saXN0IHN5bWJvbF9wcmVmaXgKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIEEgcHJlZml4IGZvciBzdWJzZXF1ZW50IHN5bWJvbHMuICAqLwotCi1zeW1ib2xfcHJlZml4OgotCSAgJygnIFNUUklORyAnKScKLQkgIHsKLQkgICAgaWYgKHN5bWJvbF9wcmVmaXggIT0gTlVMTCkKLQkgICAgICBmcmVlIChzeW1ib2xfcHJlZml4KTsKLQkgICAgc3ltYm9sX3ByZWZpeCA9ICQyOwotCSAgfQotCTsKLQotLyogQSBzaW5nbGUgc3ltYm9sLiAgKi8KLQotc3ltYm9sOgotCSAgU1RSSU5HCi0JICB7Ci0JICAgIGlmIChzeW1ib2xfcHJlZml4ID09IE5VTEwpCi0JICAgICAgJCQgPSAkMTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJJCQgPSB4bWFsbG9jIChzdHJsZW4gKHN5bWJvbF9wcmVmaXgpICsgc3RybGVuICgkMSkgKyAyKTsKLQkJc3ByaW50ZiAoJCQsICIlc0AlcyIsIHN5bWJvbF9wcmVmaXgsICQxKTsKLQkJZnJlZSAoJDEpOwotCSAgICAgIH0KLQkgIH0KLQk7Ci0KLS8qIEEgbGlzdCBvZiBzdHJpbmdzLiAgKi8KLQotc3RyaW5nX2xpc3Q6Ci0JICAvKiBNYXkgYmUgZW1wdHkuICAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCBTVFJJTkcgc3RyaW5nX2xpc3QKLQkgIHsKLQkgICAgJCQgPSBzdHJpbmdfbGlzdF9jb25zICgkMSwgJDIpOwotCSAgfQotCTsKLQotJSUKLQotLyogSWYgc3RyZXJyb3IgaXMganVzdCBhIG1hY3JvLCB3ZSB3YW50IHRvIHVzZSB0aGUgb25lIGZyb20gbGliaWJlcnR5Ci0gICBzaW5jZSBpdCB3aWxsIGhhbmRsZSB1bmRlZmluZWQgdmFsdWVzLiAgKi8KLSN1bmRlZiBzdHJlcnJvcgotZXh0ZXJuIGNoYXIgKnN0cmVycm9yICgpOwotCi0vKiBUaGUgbGV4ZXIgaXMgc2ltcGxlLCB0b28gc2ltcGxlIGZvciBmbGV4LiAgS2V5d29yZHMgYXJlIG9ubHkKLSAgIHJlY29nbml6ZWQgYXQgdGhlIHN0YXJ0IG9mIGxpbmVzLiAgRXZlcnl0aGluZyBlbHNlIG11c3QgYmUgYW4KLSAgIGFyZ3VtZW50LiAgQSBjb21tYSBpcyB0cmVhdGVkIGFzIHdoaXRlc3BhY2UuICAqLwotCi0vKiBUaGUgc3RhdGVzIHRoZSBsZXhlciBjYW4gYmUgaW4uICAqLwotCi1lbnVtIGxleF9zdGF0ZQotewotICAvKiBBdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi0gIEJFR0lOTklOR19PRl9MSU5FLAotICAvKiBJbiB0aGUgbWlkZGxlIG9mIGEgbGluZS4gICovCi0gIElOX0xJTkUKLX07Ci0KLS8qIFdlIG5lZWQgdG8ga2VlcCBhIHN0YWNrIG9mIGZpbGVzIHRvIGhhbmRsZSBmaWxlIGluY2x1c2lvbi4gICovCi0KLXN0cnVjdCBpbnB1dAotewotICAvKiBUaGUgZmlsZSB0byByZWFkIGZyb20uICAqLwotICBGSUxFICpmaWxlOwotICAvKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS4gICovCi0gIGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAgKi8KLSAgaW50IGxpbmVubzsKLSAgLyogVGhlIGN1cnJlbnQgc3RhdGUuICAqLwotICBlbnVtIGxleF9zdGF0ZSBzdGF0ZTsKLSAgLyogVGhlIG5leHQgZmlsZSBvbiB0aGUgc3RhY2suICAqLwotICBzdHJ1Y3QgaW5wdXQgKm5leHQ7Ci19OwotCi0vKiBUaGUgY3VycmVudCBpbnB1dCBmaWxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpbnB1dCBjdXJyZW50OwotCi0vKiBUaGUgY2hhcmFjdGVyIHdoaWNoIGludHJvZHVjZXMgY29tbWVudHMuICAqLwotI2RlZmluZSBDT01NRU5UX0NIQVIgJyMnCi0MCi0vKiBTdGFydCB0aGUgbGV4ZXIgZ29pbmcgb24gdGhlIG1haW4gaW5wdXQgZmlsZS4gICovCi0KLWJvb2xlYW4KLW5sbWxleF9maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjdXJyZW50Lm5leHQgPSBOVUxMOwotICByZXR1cm4gbmxtbGV4X2ZpbGVfb3BlbiAobmFtZSk7Ci19Ci0KLS8qIFN0YXJ0IHRoZSBsZXhlciBnb2luZyBvbiBhIHN1YnNpZGlhcnkgaW5wdXQgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1ubG1sZXhfZmlsZV9wdXNoIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaW5wdXQgKnB1c2g7Ci0KLSAgcHVzaCA9IChzdHJ1Y3QgaW5wdXQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaW5wdXQpKTsKLSAgKnB1c2ggPSBjdXJyZW50OwotICBpZiAobmxtbGV4X2ZpbGVfb3BlbiAobmFtZSkpCi0gICAgY3VycmVudC5uZXh0ID0gcHVzaDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSAqcHVzaDsKLSAgICAgIGZyZWUgKHB1c2gpOwotICAgIH0KLX0KLQotLyogU3RhcnQgbGV4aW5nIGZyb20gYSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbWxleF9maWxlX29wZW4gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGN1cnJlbnQuZmlsZSA9IGZvcGVuIChuYW1lLCAiciIpOwotICBpZiAoY3VycmVudC5maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIG5hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgKytwYXJzZV9lcnJvcnM7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBjdXJyZW50Lm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgY3VycmVudC5saW5lbm8gPSAxOwotICBjdXJyZW50LnN0YXRlID0gQkVHSU5OSU5HX09GX0xJTkU7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGFibGUgdXNlZCB0byB0dXJuIGtleXdvcmRzIGludG8gdG9rZW5zLiAgKi8KLQotc3RydWN0IGtleXdvcmRfdG9rZW5zX3N0cnVjdAotewotICBjb25zdCBjaGFyICprZXl3b3JkOwotICBpbnQgdG9rZW47Ci19OwotCi1zdHJ1Y3Qga2V5d29yZF90b2tlbnNfc3RydWN0IGtleXdvcmRfdG9rZW5zW10gPQotewotICB7ICJDSEVDSyIsIENIRUNLIH0sCi0gIHsgIkNPREVTVEFSVCIsIENPREVTVEFSVCB9LAotICB7ICJDT1BZUklHSFQiLCBDT1BZUklHSFQgfSwKLSAgeyAiQ1VTVE9NIiwgQ1VTVE9NIH0sCi0gIHsgIkRBVEUiLCBEQVRFIH0sCi0gIHsgIkRFQlVHIiwgREVCVUcgfSwKLSAgeyAiREVTQ1JJUFRJT04iLCBERVNDUklQVElPTiB9LAotICB7ICJFWElUIiwgRVhJVCB9LAotICB7ICJFWFBPUlQiLCBFWFBPUlQgfSwKLSAgeyAiRkxBR19PTiIsIEZMQUdfT04gfSwKLSAgeyAiRkxBR19PRkYiLCBGTEFHX09GRiB9LAotICB7ICJGVUxMTUFQIiwgRlVMTE1BUCB9LAotICB7ICJIRUxQIiwgSEVMUCB9LAotICB7ICJJTVBPUlQiLCBJTVBPUlQgfSwKLSAgeyAiSU5QVVQiLCBJTlBVVCB9LAotICB7ICJNQVAiLCBNQVAgfSwKLSAgeyAiTUVTU0FHRVMiLCBNRVNTQUdFUyB9LAotICB7ICJNT0RVTEUiLCBNT0RVTEUgfSwKLSAgeyAiTVVMVElQTEUiLCBNVUxUSVBMRSB9LAotICB7ICJPU19ET01BSU4iLCBPU19ET01BSU4gfSwKLSAgeyAiT1VUUFVUIiwgT1VUUFVUIH0sCi0gIHsgIlBTRVVET1BSRUVNUFRJT04iLCBQU0VVRE9QUkVFTVBUSU9OIH0sCi0gIHsgIlJFRU5UUkFOVCIsIFJFRU5UUkFOVCB9LAotICB7ICJTQ1JFRU5OQU1FIiwgU0NSRUVOTkFNRSB9LAotICB7ICJTSEFSRUxJQiIsIFNIQVJFTElCIH0sCi0gIHsgIlNUQUNLIiwgU1RBQ0sgfSwKLSAgeyAiU1RBQ0tTSVpFIiwgU1RBQ0sgfSwKLSAgeyAiU1RBUlQiLCBTVEFSVCB9LAotICB7ICJTWU5DSFJPTklaRSIsIFNZTkNIUk9OSVpFIH0sCi0gIHsgIlRIUkVBRE5BTUUiLCBUSFJFQUROQU1FIH0sCi0gIHsgIlRZUEUiLCBUWVBFIH0sCi0gIHsgIlZFUkJPU0UiLCBWRVJCT1NFIH0sCi0gIHsgIlZFUlNJT04iLCBWRVJTSU9OSyB9LAotICB7ICJYRENEQVRBIiwgWERDREFUQSB9Ci19OwotCi0jZGVmaW5lIEtFWVdPUkRfQ09VTlQgKHNpemVvZiAoa2V5d29yZF90b2tlbnMpIC8gc2l6ZW9mIChrZXl3b3JkX3Rva2Vuc1swXSkpCi0MCi0vKiBUaGUgbGV4ZXIgYWNjdW11bGF0ZXMgc3RyaW5ncyBpbiB0aGVzZSB2YXJpYWJsZXMuICAqLwotc3RhdGljIGNoYXIgKmxleF9idWY7Ci1zdGF0aWMgaW50IGxleF9zaXplOwotc3RhdGljIGludCBsZXhfcG9zOwotCi0vKiBTdGFydCBhY2N1bXVsYXRpbmcgc3RyaW5ncyBpbnRvIHRoZSBidWZmZXIuICAqLwotI2RlZmluZSBCVUZfSU5JVCgpIFwKLSAgKCh2b2lkKSAobGV4X2J1ZiAhPSBOVUxMID8gbGV4X3BvcyA9IDAgOiBubG1sZXhfYnVmX2luaXQgKCkpKQotCi1zdGF0aWMgaW50Ci1ubG1sZXhfYnVmX2luaXQgKCkKLXsKLSAgbGV4X3NpemUgPSAxMDsKLSAgbGV4X2J1ZiA9IHhtYWxsb2MgKGxleF9zaXplICsgMSk7Ci0gIGxleF9wb3MgPSAwOwotICByZXR1cm4gMDsKLX0KLQotLyogRmluaXNoIGEgc3RyaW5nIGluIHRoZSBidWZmZXIuICAqLwotI2RlZmluZSBCVUZfRklOSVNIKCkgKCh2b2lkKSAobGV4X2J1ZltsZXhfcG9zXSA9ICdcMCcpKQotCi0vKiBBY2N1bXVsYXRlIGEgY2hhcmFjdGVyIGludG8gdGhlIGJ1ZmZlci4gICovCi0jZGVmaW5lIEJVRl9BREQoYykgXAotICAoKHZvaWQpIChsZXhfcG9zIDwgbGV4X3NpemUgXAotCSAgID8gbGV4X2J1ZltsZXhfcG9zKytdID0gKGMpIFwKLQkgICA6IG5sbWxleF9idWZfYWRkIChjKSkpCi0KLXN0YXRpYyBjaGFyCi1ubG1sZXhfYnVmX2FkZCAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChsZXhfcG9zID49IGxleF9zaXplKQotICAgIHsKLSAgICAgIGxleF9zaXplICo9IDI7Ci0gICAgICBsZXhfYnVmID0geHJlYWxsb2MgKGxleF9idWYsIGxleF9zaXplICsgMSk7Ci0gICAgfQotCi0gIHJldHVybiBsZXhfYnVmW2xleF9wb3MrK10gPSBjOwotfQotDAotLyogVGhlIGxleGVyIHByb3Blci4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiaXNvbiBnZW5lcmF0ZWQgcGFyc2luZwotICAgY29kZS4gICovCi0KLXN0YXRpYyBpbnQKLXl5bGV4ICgpCi17Ci0gIGludCBjOwotCi10YWlsX3JlY3Vyc2U6Ci0KLSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0KLSAgLyogQ29tbWFzIGFyZSB0cmVhdGVkIGFzIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4gICovCi0gIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYykgfHwgYyA9PSAnLCcpCi0gICAgewotICAgICAgY3VycmVudC5zdGF0ZSA9IElOX0xJTkU7Ci0gICAgICBpZiAoYyA9PSAnXG4nKQotCXsKLQkgICsrY3VycmVudC5saW5lbm87Ci0JICBjdXJyZW50LnN0YXRlID0gQkVHSU5OSU5HX09GX0xJTkU7Ci0JfQotICAgICAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0gICAgfQotCi0gIC8qIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgd2UgZWl0aGVyIHBvcCB0byB0aGUgcHJldmlvdXMgZmlsZSBvcgotICAgICBmaW5pc2ggdXAuICAqLwotICBpZiAoYyA9PSBFT0YpCi0gICAgewotICAgICAgZmNsb3NlIChjdXJyZW50LmZpbGUpOwotICAgICAgZnJlZSAoY3VycmVudC5uYW1lKTsKLSAgICAgIGlmIChjdXJyZW50Lm5leHQgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgaW5wdXQgKm5leHQ7Ci0KLQkgIG5leHQgPSBjdXJyZW50Lm5leHQ7Ci0JICBjdXJyZW50ID0gKm5leHQ7Ci0JICBmcmVlIChuZXh0KTsKLQkgIGdvdG8gdGFpbF9yZWN1cnNlOwotCX0KLSAgICB9Ci0KLSAgLyogQSBjb21tZW50IGNoYXJhY3RlciBhbHdheXMgbWVhbnMgdG8gZHJvcCBldmVyeXRoaW5nIHVudGlsIHRoZQotICAgICBuZXh0IG5ld2xpbmUuICAqLwotICBpZiAoYyA9PSBDT01NRU5UX0NIQVIpCi0gICAgewotICAgICAgZG8KLQl7Ci0JICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQl9Ci0gICAgICB3aGlsZSAoYyAhPSAnXG4nKTsKLSAgICAgICsrY3VycmVudC5saW5lbm87Ci0gICAgICBjdXJyZW50LnN0YXRlID0gQkVHSU5OSU5HX09GX0xJTkU7Ci0gICAgICBnb3RvIHRhaWxfcmVjdXJzZTsKLSAgICB9Ci0KLSAgLyogQW4gJ0AnIGludHJvZHVjZXMgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLSAgaWYgKGMgPT0gJ0AnKQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0JICBpZiAoYyA9PSAnXG4nKQotCSAgICArK2N1cnJlbnQubGluZW5vOwotCX0KLSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYykpOwotICAgICAgQlVGX0lOSVQgKCk7Ci0gICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYykgJiYgYyAhPSBFT0YpCi0JewotCSAgQlVGX0FERCAoYyk7Ci0JICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQl9Ci0gICAgICBCVUZfRklOSVNIICgpOwotCi0gICAgICB1bmdldGMgKGMsIGN1cnJlbnQuZmlsZSk7Ci0gICAgICAKLSAgICAgIG5sbWxleF9maWxlX3B1c2ggKGxleF9idWYpOwotICAgICAgZ290byB0YWlsX3JlY3Vyc2U7Ci0gICAgfQotCi0gIC8qIEEgbm9uLXNwYWNlIGNoYXJhY3RlciBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG11c3QgYmUgdGhlIHN0YXJ0IG9mCi0gICAgIGEga2V5d29yZC4gICovCi0gIGlmIChjdXJyZW50LnN0YXRlID09IEJFR0lOTklOR19PRl9MSU5FKQotICAgIHsKLSAgICAgIEJVRl9JTklUICgpOwotICAgICAgd2hpbGUgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBjKSB8fCBjID09ICdfJykKLQl7Ci0JICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICBCVUZfQUREICh0b3VwcGVyICgodW5zaWduZWQgY2hhcikgYykpOwotCSAgZWxzZQotCSAgICBCVUZfQUREIChjKTsKLQkgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCX0KLSAgICAgIEJVRl9GSU5JU0ggKCk7Ci0KLSAgICAgIGlmIChjICE9IEVPRiAmJiAhIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjKSAmJiBjICE9ICcsJykKLQl7Ci0JICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVkOiBpbGxlZ2FsIGNoYXJhY3RlciBpbiBrZXl3b3JkOiAlY1xuIiksCi0JCSAgIGN1cnJlbnQubmFtZSwgY3VycmVudC5saW5lbm8sIGMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgaSA8IEtFWVdPUkRfQ09VTlQ7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChsZXhfYnVmWzBdID09IGtleXdvcmRfdG9rZW5zW2ldLmtleXdvcmRbMF0KLQkJICAmJiBzdHJjbXAgKGxleF9idWYsIGtleXdvcmRfdG9rZW5zW2ldLmtleXdvcmQpID09IDApCi0JCXsKLQkJICAvKiBQdXNoaW5nIGJhY2sgdGhlIGZpbmFsIHdoaXRlc3BhY2UgYXZvaWRzIHdvcnJ5aW5nCi0JCSAgICAgYWJvdXQgXG4gaGVyZS4gICovCi0JCSAgdW5nZXRjIChjLCBjdXJyZW50LmZpbGUpOwotCQkgIGN1cnJlbnQuc3RhdGUgPSBJTl9MSU5FOwotCQkgIHJldHVybiBrZXl3b3JkX3Rva2Vuc1tpXS50b2tlbjsKLQkJfQotCSAgICB9Ci0JICAKLQkgIG5sbWhlYWRlcl9pZGVudGlmeSAoKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6JWQ6IHVucmVjb2duaXplZCBrZXl3b3JkOiAlc1xuIiksCi0JCSAgIGN1cnJlbnQubmFtZSwgY3VycmVudC5saW5lbm8sIGxleF9idWYpOwotCX0KLQotICAgICAgKytwYXJzZV9lcnJvcnM7Ci0gICAgICAvKiBUcmVhdCB0aGUgcmVzdCBvZiB0aGlzIGxpbmUgYXMgYSBjb21tZW50LiAgKi8KLSAgICAgIHVuZ2V0YyAoQ09NTUVOVF9DSEFSLCBjdXJyZW50LmZpbGUpOwotICAgICAgZ290byB0YWlsX3JlY3Vyc2U7Ci0gICAgfQotCi0gIC8qIFBhcmVudGhlc2VzIGp1c3QgcmVwcmVzZW50IHRoZW1zZWx2ZXMuICAqLwotICBpZiAoYyA9PSAnKCcgfHwgYyA9PSAnKScpCi0gICAgcmV0dXJuIGM7Ci0KLSAgLyogSGFuZGxlIHF1b3RlZCBzdHJpbmdzLiAgKi8KLSAgaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykKLSAgICB7Ci0gICAgICBpbnQgcXVvdGU7Ci0gICAgICBpbnQgc3RhcnRfbGluZW5vOwotCi0gICAgICBxdW90ZSA9IGM7Ci0gICAgICBzdGFydF9saW5lbm8gPSBjdXJyZW50LmxpbmVubzsKLQotICAgICAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0gICAgICBCVUZfSU5JVCAoKTsKLSAgICAgIHdoaWxlIChjICE9IHF1b3RlICYmIGMgIT0gRU9GKQotCXsKLQkgIEJVRl9BREQgKGMpOwotCSAgaWYgKGMgPT0gJ1xuJykKLQkgICAgKytjdXJyZW50LmxpbmVubzsKLQkgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCX0KLSAgICAgIEJVRl9GSU5JU0ggKCk7Ci0KLSAgICAgIGlmIChjID09IEVPRikKLQl7Ci0JICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVkOiBlbmQgb2YgZmlsZSBpbiBxdW90ZWQgc3RyaW5nXG4iKSwKLQkJICAgY3VycmVudC5uYW1lLCBzdGFydF9saW5lbm8pOwotCSAgKytwYXJzZV9lcnJvcnM7Ci0JfQotCi0gICAgICAvKiBGSVhNRTogUG9zc2libGUgbWVtb3J5IGxlYWsuICAqLwotICAgICAgeXlsdmFsLnN0cmluZyA9IHhzdHJkdXAgKGxleF9idWYpOwotICAgICAgcmV0dXJuIFFVT1RFRF9TVFJJTkc7Ci0gICAgfQotCi0gIC8qIEdhdGhlciBhIGdlbmVyaWMgYXJndW1lbnQuICAqLwotICBCVUZfSU5JVCAoKTsKLSAgd2hpbGUgKCEgaXNzcGFjZSAoYykKLQkgJiYgYyAhPSAnLCcKLQkgJiYgYyAhPSBDT01NRU5UX0NIQVIKLQkgJiYgYyAhPSAnKCcKLQkgJiYgYyAhPSAnKScpCi0gICAgewotICAgICAgQlVGX0FERCAoYyk7Ci0gICAgICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLSAgICB9Ci0gIEJVRl9GSU5JU0ggKCk7Ci0KLSAgdW5nZXRjIChjLCBjdXJyZW50LmZpbGUpOwotCi0gIC8qIEZJWE1FOiBQb3NzaWJsZSBtZW1vcnkgbGVhay4gICovCi0gIHl5bHZhbC5zdHJpbmcgPSB4c3RyZHVwIChsZXhfYnVmKTsKLSAgcmV0dXJuIFNUUklORzsKLX0KLQwKLS8qIEdldCBhIG51bWJlciBmcm9tIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIGxvbmcKLW5sbWxleF9nZXRfbnVtYmVyIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBsb25nIHJldDsKLSAgY2hhciAqc2VuZDsKLQotICByZXQgPSBzdHJ0b2wgKHMsICZzZW5kLCAxMCk7Ci0gIGlmICgqc2VuZCAhPSAnXDAnKQotICAgIG5sbWhlYWRlcl93YXJuIChfKCJiYWQgbnVtYmVyIiksIC0xKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUHJlZml4IHRoZSBubG1jb252IHdhcm5pbmdzIHdpdGggYSBub3RlIGFzIHRvIHdoZXJlIHRoZXkgY29tZSBmcm9tLgotICAgV2UgZG9uJ3QgdXNlIHByb2dyYW1fbmFtZSBvbiBldmVyeSB3YXJuaW5nLCBiZWNhdXNlIHRoZW4gc29tZQotICAgdmVyc2lvbnMgb2YgdGhlIGVtYWNzIG5leHQtZXJyb3IgZnVuY3Rpb24gY2FuJ3QgcmVjb2duaXplIHRoZSBsaW5lCi0gICBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotbmxtaGVhZGVyX2lkZW50aWZ5ICgpCi17Ci0gIHN0YXRpYyBpbnQgZG9uZTsKLQotICBpZiAoISBkb25lKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHByb2JsZW1zIGluIE5MTSBjb21tYW5kIGxhbmd1YWdlIGlucHV0OlxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBkb25lID0gMTsKLSAgICB9Ci19Ci0KLS8qIElzc3VlIGEgd2FybmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1ubG1oZWFkZXJfd2FybiAocywgaW1heCkKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IGltYXg7Ci17Ci0gIG5sbWhlYWRlcl9pZGVudGlmeSAoKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6ICVzIiwgY3VycmVudC5uYW1lLCBjdXJyZW50LmxpbmVubywgcyk7Ci0gIGlmIChpbWF4ICE9IC0xKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiAobWF4ICVkKSIsIGltYXgpOwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi0vKiBSZXBvcnQgYW4gZXJyb3IuICAqLwotCi1zdGF0aWMgdm9pZAotbmxtaGVhZGVyX2Vycm9yIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBubG1oZWFkZXJfd2FybiAocywgLTEpOwotICArK3BhcnNlX2Vycm9yczsKLX0KLQotLyogQWRkIGEgc3RyaW5nIHRvIGEgc3RyaW5nIGxpc3QuICAqLwotCi1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICoKLXN0cmluZ19saXN0X2NvbnMgKHMsIGwpCi0gICAgIGNoYXIgKnM7Ci0gICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDsKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBzdHJpbmdfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdHJpbmdfbGlzdCkpOwotICByZXQtPm5leHQgPSBsOwotICByZXQtPnN0cmluZyA9IHM7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFwcGVuZCBhIHN0cmluZyBsaXN0IHRvIGFub3RoZXIgc3RyaW5nIGxpc3QuICAqLwotCi1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICoKLXN0cmluZ19saXN0X2FwcGVuZCAobDEsIGwyKQotICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmwxOwotICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmwyOwotewotICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwcDsKLQotICBmb3IgKHBwID0gJmwxOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSBsMjsKLSAgcmV0dXJuIGwxOwotfQotCi0vKiBBcHBlbmQgYSBzdHJpbmcgdG8gYSBzdHJpbmcgbGlzdC4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKgotc3RyaW5nX2xpc3RfYXBwZW5kMSAobCwgcykKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsOwotICAgICBjaGFyICpzOwotewotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm47Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzdHJpbmdfbGlzdCAqKnBwOwotCi0gIG4gPSAoc3RydWN0IHN0cmluZ19saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmluZ19saXN0KSk7Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5zdHJpbmcgPSBzOwotICBmb3IgKHBwID0gJmw7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IG47Ci0gIHJldHVybiBsOwotfQotCi0vKiBEdXBsaWNhdGUgYSBzdHJpbmcgaW4gbWVtb3J5LiAgKi8KLQotc3RhdGljIGNoYXIgKgoteHN0cmR1cCAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgdW5zaWduZWQgbG9uZyBsZW47Ci0gIGNoYXIgKnJldDsKLQotICBsZW4gPSBzdHJsZW4gKHMpOwotICByZXQgPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgc3RyY3B5IChyZXQsIHMpOwotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbm0uMSBiL2JpbnV0aWxzL25tLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWQ5OWUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbm0uMQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggbm0gMSAiNSBOb3ZlbWJlciAxOTkxIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotbm0gXC0gbGlzdCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzLgotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgbm0KLS5SQiAiW1x8IiBcLWEgfCBcLVwtZGVidWdcLXN5bXMgIlx8XSIgCi0uUkIgIltcfCIgXC1nIHwgXC1cLWV4dGVyblwtb25seSAiXHxdIgotLlJCICJbXHwiIFwtQiAiXHxdIiAgCi0uUkIgIltcfCIgXC1DIHwgXC1cLWRlbWFuZ2xlICJcfF0iIAotLlJCICJbXHwiIFwtRCB8IFwtXC1keW5hbWljICJcfF0iIAotLlJCICJbXHwiIFwtcyB8IFwtXC1wcmludFwtYXJtYXAgIlx8XSIgCi0uUkIgIltcfCIgXC1vIHwgXC1cLXByaW50XC1maWxlXC1uYW1lICJcfF0iICAKLS5SQiAiW1x8IiBcLW4gfCBcLVwtbnVtZXJpY1wtc29ydCAiXHxdIiAKLS5SQiAiW1x8IiBcLXAgfCBcLVwtbm9cLXNvcnQgIlx8XSIKLS5SQiAiW1x8IiBcLXIgfCBcLVwtcmV2ZXJzZVwtc29ydCAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtc2l6ZVwtc29ydCAiXHxdIiAKLS5SQiAiW1x8IiBcLXUgfCBcLVwtdW5kZWZpbmVkXC1vbmx5ICJcfF0iICAKLS5SQiAiW1x8IiBcLWwgfCBcLVwtbGluZVwtbnVtYmVycyAiXHxdIgotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iICAKLS5SQiAiW1x8IiBcLVwtdmVyc2lvbiAiXHxdIiAgCi0uUkIgIltcfCIgIlwtdCBcZklyYWRpeCIgfCBcLVwtcmFkaXg9XGZJcmFkaXggIlx8XSIKLS5SQiAiW1x8IiBcLVAgfCAtLXBvcnRhYmlsaXR5ICJcfF0iCi0uUkIgIltcfCIgIlwtZiBcZklmb3JtYXQiIHwgXC1cLWZvcm1hdD1cZklmb3JtYXQgIlx8XSIKLS5SQiAiW1x8IiAiXC1cLXRhcmdldD1cZkliZmRuYW1lIiAiXHxdIgotLlJCICJbXHwiIFxjCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8Llx8XQotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLUdOVSBcYwotLkIgbm1cYwotXCYgbGlzdHMgdGhlIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMgXGMKLS5JIG9iamZpbGVcYwotXCYuICBJZiBubyBvYmplY3QgZmlsZXMgYXJlIGdpdmVuIGFzIGFyZ3VtZW50cywgXGMKLS5CIG5tXGMKLVwmIGFzc3VtZXMgYFx8XGMKLS5CIGEub3V0XGMKLVx8Jy4KLQotLlNIIE9QVElPTlMKLVRoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCi1lcXVpdmFsZW50LgotCi0uVFAKLS5CIFwtQQotLlRQCi0uQiBcLW8KLS5UUAotLkIgXC1cLXByaW50XC1maWxlXC1uYW1lIAotUHJlY2VkZSBlYWNoIHN5bWJvbCBieSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSB3aGVyZSBpdCB3YXMgZm91bmQsCi1yYXRoZXIgdGhhbiBpZGVudGlmeWluZyB0aGUgaW5wdXQgZmlsZSBvbmNlIG9ubHkgYmVmb3JlIGFsbCBvZiBpdHMKLXN5bWJvbHMuIAotCi0uVFAKLS5CIFwtYQotLlRQCi0uQiBcLVwtZGVidWdcLXN5bXMgCi1EaXNwbGF5IGRlYnVnZ2VyLW9ubHkgc3ltYm9sczsgbm9ybWFsbHkgdGhlc2UgYXJlIG5vdCBsaXN0ZWQuCi0KLS5UUAotLkIgXC1CCi1UaGUgc2FtZSBhcwotLkIgXC1cLWZvcm1hdD1ic2QKLShmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNSVBTIFxmQm5tXGZQKS4KLQotLlRQCi0uQiBcLUMKLS5UUAotLkIgXC1cLWRlbWFuZ2xlCi1EZWNvZGUgKFxmSWRlbWFuZ2xlXGZQKSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KLUJlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcwotbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLgotCi0uVFAKLS5CIFwtRAotLlRQCi0uQiBcLVwtZHluYW1pYwotRGlzcGxheSB0aGUgZHluYW1pYyBzeW1ib2xzIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgc3ltYm9scy4gIFRoaXMgaXMKLW9ubHkgbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4gdHlwZXMgb2Ygc2hhcmVkCi1saWJyYXJpZXMuCi0KLS5UUAotLkIgIlwtZiBcZklmb3JtYXQiCi1Vc2UgdGhlIG91dHB1dCBmb3JtYXQgXGZJZm9ybWF0XGZQLCB3aGljaCBjYW4gYmUgYGBic2QnJywKLWBgc3lzdicnLCBvciBgYHBvc2l4JycuICBUaGUgZGVmYXVsdCBpcyBgYGJzZCcnLgotT25seSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIFxmSWZvcm1hdFxmUCBpcyBzaWduaWZpY2FudDsgaXQgY2FuIGJlCi1laXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZS4KLQotLlRQCi0uQiBcLWcKLS5UUAotLkIgXC1cLWV4dGVyblwtb25seSAKLURpc3BsYXkgb25seSBleHRlcm5hbCBzeW1ib2xzLgotCi0uVFAKLS5CIFwtbgotLlRQCi0uQiBcLXYKLS5UUAotLkIgXC1cLW51bWVyaWNcLXNvcnQgCi1Tb3J0IHN5bWJvbHMgbnVtZXJpY2FsbHkgYnkgdGhlaXIgYWRkcmVzc2VzLCBub3QgYWxwaGFiZXRpY2FsbHkgYnkgdGhlaXIKLW5hbWVzLiAKLQotLlRQCi0uQiBcLXAKLS5UUAotLkIgXC1cLW5vXC1zb3J0IAotRG9uJ3QgYm90aGVyIHRvIHNvcnQgdGhlIHN5bWJvbHMgaW4gYW55IG9yZGVyOyBqdXN0IHByaW50IHRoZW0gaW4gdGhlCi1vcmRlciBlbmNvdW50ZXJlZC4KLQotLlRQCi0uQiBcLVAKLS5UUAotLkIgXC1cLXBvcnRhYmlsaXR5Ci1Vc2UgdGhlIFBPU0lYLjIgc3RhbmRhcmQgb3V0cHV0IGZvcm1hdCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvcm1hdC4KLUVxdWl2YWxlbnQgdG8gYGBcLWYgcG9zaXgnJy4KLQotLlRQCi0uQiBcLXMKLS5UUAotLkIgXC1cLXByaW50XC1hcm1hcAotV2hlbiBsaXN0aW5nIHN5bWJvbHMgZnJvbSBhcmNoaXZlIG1lbWJlcnMsIGluY2x1ZGUgdGhlIGluZGV4OiBhIG1hcHBpbmcKLShzdG9yZWQgaW4gdGhlIGFyY2hpdmUgYnkgXGMKLS5CIGFyXGMKLVwmIG9yIFxjCi0uQiByYW5saWJcYwotXCYpIG9mIHdoYXQgbW9kdWxlcwotY29udGFpbiBkZWZpbml0aW9ucyBmb3Igd2hhdCBuYW1lcy4KLQotLlRQCi0uQiBcLXIKLS5UUAotLkIgXC1cLXJldmVyc2VcLXNvcnQgCi1SZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgc29ydCAod2hldGhlciBudW1lcmljIG9yIGFscGhhYmV0aWMpOyBsZXQgdGhlCi1sYXN0IGNvbWUgZmlyc3QuCi0KLS5UUAotLkIgXC1cLXNpemVcLXNvcnQgCi1Tb3J0IHN5bWJvbHMgYnkgc2l6ZS4gIFRoZSBzaXplIGlzIGNvbXB1dGVkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLXRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB3aXRoIHRoZSBuZXh0IGhpZ2hlcgotdmFsdWUuICBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIHByaW50ZWQsIHJhdGhlciB0aGFuIHRoZSB2YWx1ZS4KLQotLlRQCi0uQiAiXC10IFxmSXJhZGl4IgotLlRQCi0uQiAiXC1cLXJhZGl4PVxmSXJhZGl4IgotVXNlIFxmSXJhZGl4XGZQIGFzIHRoZSByYWRpeCBmb3IgcHJpbnRpbmcgdGhlIHN5bWJvbCB2YWx1ZXMuICBJdCBtdXN0IGJlCi1gYGQnJyBmb3IgZGVjaW1hbCwgYGBvJycgZm9yIG9jdGFsLCBvciBgYHgnJyBmb3IgaGV4YWRlY2ltYWwuCi0KLS5UUAotLkJJICJcLVwtdGFyZ2V0PSIgImJmZG5hbWUiCi1TcGVjaWZ5IGFuIG9iamVjdCBjb2RlIGZvcm1hdCBvdGhlciB0aGFuIHlvdXIgc3lzdGVtJ3MgZGVmYXVsdCBmb3JtYXQuCi1TZWUgCi0uQlIgb2JqZHVtcCAoIDEgKSwKLWZvciBpbmZvcm1hdGlvbiBvbiBsaXN0aW5nIGF2YWlsYWJsZSBmb3JtYXRzLgotCi0uVFAKLS5CIFwtdQotLlRQCi0uQiBcLVwtdW5kZWZpbmVkXC1vbmx5IAotRGlzcGxheSBvbmx5IHVuZGVmaW5lZCBzeW1ib2xzICh0aG9zZSBleHRlcm5hbCB0byBlYWNoIG9iamVjdCBmaWxlKS4KLQotLlRQCi0uQiBcLWwKLS5UUAotLkIgXC1cLWxpbmVcLW51bWJlcnMKLUZvciBlYWNoIHN5bWJvbCwgdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0cnkgdG8gZmluZCBhIGZpbGVuYW1lIGFuZAotbGluZSBudW1iZXIuICBGb3IgYSBkZWZpbmVkIHN5bWJvbCwgbG9vayBmb3IgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZQotYWRkcmVzcyBvZiB0aGUgc3ltYm9sLiAgRm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lCi1udW1iZXIgb2YgYSByZWxvY2F0aW9uIGVudHJ5IHdoaWNoIHJlZmVycyB0byB0aGUgc3ltYm9sLiAgSWYgbGluZSBudW1iZXIKLWluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCwgcHJpbnQgaXQgYWZ0ZXIgdGhlIG90aGVyIHN5bWJvbCBpbmZvcm1hdGlvbi4KLQotLlRQCi0uQiBcLVYKLS5UUAotLkIgXC1cLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiBubQotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBubQotYW5kIGV4aXQuCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpOwotLkJSIGFyICIoIiAxICIpLCIKLS5CUiBvYmpkdW1wICggMSApLAotLkJSIHJhbmxpYiAiKCIgMSAiKS4iCi0KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbm0uYyBiL2JpbnV0aWxzL25tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZTNmN2MuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE1NTggKzAsMCBAQAotLyogbm0uYyAtLSBEZXNjcmliZSBzeW1ib2wgdGFibGUgb2YgYSByZWwgZmlsZS4KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJwcm9ncmVzcy5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L3JhbmxpYi5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLS8qIFdoZW4gc29ydGluZyBieSBzaXplLCB3ZSB1c2UgdGhpcyBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgc2l6ZSBhbmQgYQotICAgcG9pbnRlciB0byB0aGUgbWluaXN5bWJvbC4gICovCi0KLXN0cnVjdCBzaXplX3N5bQotewotICBjb25zdCBQVFIgbWluaXN5bTsKLSAgYmZkX3ZtYSBzaXplOwotfTsKLQotLyogV2hlbiBmZXRjaGluZyByZWxvY3MsIHdlIHVzZSB0aGlzIHN0cnVjdHVyZSB0byBwYXNzIGluZm9ybWF0aW9uIHRvCi0gICBnZXRfcmVsb2NzLiAgKi8KLQotc3RydWN0IGdldF9yZWxvY3NfaW5mbwotewotICBhc2VjdGlvbiAqKnNlY3M7Ci0gIGFyZWxlbnQgKioqcmVsb2NzOwotICBsb25nICpyZWxjb3VudDsKLSAgYXN5bWJvbCAqKnN5bXM7Ci19OwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXNldF9wcmludF9yYWRpeCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXNldF9vdXRwdXRfZm9ybWF0IFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9hcmNoaXZlIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1kaXNwbGF5X2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfcmVsX2ZpbGUgUEFSQU1TICgoYmZkICogZmlsZSwgYmZkICogYXJjaGl2ZSkpOwotCi1zdGF0aWMgbG9uZwotZmlsdGVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci0KLXN0YXRpYyBsb25nCi1zb3J0X3N5bWJvbHNfYnlfc2l6ZSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICBzdHJ1Y3Qgc2l6ZV9zeW0gKiopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2l6ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBzdHJ1Y3Qgc2l6ZV9zeW0gKiwgbG9uZywgYmZkICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bW5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2wgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWRlZl9lbnRyeSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLS8qIFRoZSBzb3J0aW5nIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLW51bWVyaWNfZm9yd2FyZCBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1udW1lcmljX3JldmVyc2UgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotbm9uX251bWVyaWNfZm9yd2FyZCBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1ub25fbnVtZXJpY19yZXZlcnNlIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLXNpemVfZm9yd2FyZDEgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMiBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi0vKiBUaGUgb3V0cHV0IGZvcm1hdHRpbmcgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X29iamVjdF9maWxlbmFtZV9ic2QgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X29iamVjdF9maWxlbmFtZV9zeXN2IFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfcG9zaXggUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9ic2QgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9wb3NpeCBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9ic2QgUEFSQU1TICgoY2hhciAqYXJjaGl2ZSwgQ09OU1QgY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3N5c3YgUEFSQU1TICgoY2hhciAqYXJjaGl2ZSwgQ09OU1QgY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3Bvc2l4IFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9maWxlbmFtZV9ic2QgUEFSQU1TICgoYmZkICogYXJjaGl2ZV9iZmQsIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9maWxlbmFtZV9zeXN2IFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXggUEFSQU1TICgoYmZkICogYXJjaGl2ZV9iZmQsIGJmZCAqIGFiZmQpKTsKLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfdmFsdWUgUEFSQU1TICgoYmZkX3ZtYSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2luZm9fYnNkIFBBUkFNUyAoKHN5bWJvbF9pbmZvICogaW5mbywgYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2luZm9fc3lzdiBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX3Bvc2l4IFBBUkFNUyAoKHN5bWJvbF9pbmZvICogaW5mbywgYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotZ2V0X3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLS8qIFN1cHBvcnQgZm9yIGRpZmZlcmVudCBvdXRwdXQgZm9ybWF0cy4gICovCi1zdHJ1Y3Qgb3V0cHV0X2ZucwotICB7Ci0gICAgLyogUHJpbnQgdGhlIG5hbWUgb2YgYW4gb2JqZWN0IGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gICAgdm9pZCAoKnByaW50X29iamVjdF9maWxlbmFtZSkgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotICAgIC8qIFByaW50IHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfYXJjaGl2ZV9maWxlbmFtZSkgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotICAgIC8qIFByaW50IHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgbWVtYmVyIGZpbGUuICAqLwotICAgIHZvaWQgKCpwcmludF9hcmNoaXZlX21lbWJlcikgUEFSQU1TICgoY2hhciAqYXJjaGl2ZSwgQ09OU1QgY2hhciAqZmlsZW5hbWUpKTsKLQotICAgIC8qIFByaW50IHRoZSBuYW1lIG9mIHRoZSBmaWxlIChhbmQgYXJjaGl2ZSwgaWYgdGhlcmUgaXMgb25lKQotICAgICAgIGNvbnRhaW5pbmcgYSBzeW1ib2wuICAqLwotICAgIHZvaWQgKCpwcmludF9zeW1ib2xfZmlsZW5hbWUpIFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLSAgICAvKiBQcmludCBhIGxpbmUgb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wuICAqLwotICAgIHZvaWQgKCpwcmludF9zeW1ib2xfaW5mbykgUEFSQU1TICgoc3ltYm9sX2luZm8gKiBpbmZvLCBiZmQgKiBhYmZkKSk7Ci0gIH07Ci1zdGF0aWMgc3RydWN0IG91dHB1dF9mbnMgZm9ybWF0c1tdID0KLXsKLSAge3ByaW50X29iamVjdF9maWxlbmFtZV9ic2QsCi0gICBwcmludF9hcmNoaXZlX2ZpbGVuYW1lX2JzZCwKLSAgIHByaW50X2FyY2hpdmVfbWVtYmVyX2JzZCwKLSAgIHByaW50X3N5bWJvbF9maWxlbmFtZV9ic2QsCi0gICBwcmludF9zeW1ib2xfaW5mb19ic2R9LAotICB7cHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3N5c3YsCi0gICBwcmludF9hcmNoaXZlX2ZpbGVuYW1lX3N5c3YsCi0gICBwcmludF9hcmNoaXZlX21lbWJlcl9zeXN2LAotICAgcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3N5c3YsCi0gICBwcmludF9zeW1ib2xfaW5mb19zeXN2fSwKLSAge3ByaW50X29iamVjdF9maWxlbmFtZV9wb3NpeCwKLSAgIHByaW50X2FyY2hpdmVfZmlsZW5hbWVfcG9zaXgsCi0gICBwcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCwKLSAgIHByaW50X3N5bWJvbF9maWxlbmFtZV9wb3NpeCwKLSAgIHByaW50X3N5bWJvbF9pbmZvX3Bvc2l4fQotfTsKLQotLyogSW5kaWNlcyBpbiBgZm9ybWF0cycuICAqLwotI2RlZmluZSBGT1JNQVRfQlNEIDAKLSNkZWZpbmUgRk9STUFUX1NZU1YgMQotI2RlZmluZSBGT1JNQVRfUE9TSVggMgotI2RlZmluZSBGT1JNQVRfREVGQVVMVCBGT1JNQVRfQlNECi0KLS8qIFRoZSBvdXRwdXQgZm9ybWF0IHRvIHVzZS4gICovCi1zdGF0aWMgc3RydWN0IG91dHB1dF9mbnMgKmZvcm1hdCA9ICZmb3JtYXRzW0ZPUk1BVF9ERUZBVUxUXTsKLQotCi0vKiBDb21tYW5kIG9wdGlvbnMuICAqLwotCi1zdGF0aWMgaW50IGRvX2RlbWFuZ2xlID0gMDsJLyogUHJldHR5IHByaW50IEMrKyBzeW1ib2wgbmFtZXMuICAqLwotc3RhdGljIGludCBleHRlcm5hbF9vbmx5ID0gMDsJLyogcHJpbnQgZXh0ZXJuYWwgc3ltYm9scyBvbmx5ICovCi1zdGF0aWMgaW50IGRlZmluZWRfb25seSA9IDA7CS8qIFByaW50IGRlZmluZWQgc3ltYm9scyBvbmx5ICovCi1zdGF0aWMgaW50IG5vX3NvcnQgPSAwOwkJLyogZG9uJ3Qgc29ydDsgcHJpbnQgc3ltcyBpbiBvcmRlciBmb3VuZCAqLwotc3RhdGljIGludCBwcmludF9kZWJ1Z19zeW1zID0gMDsJLyogcHJpbnQgZGVidWdnZXItb25seSBzeW1ib2xzIHRvbyAqLwotc3RhdGljIGludCBwcmludF9hcm1hcCA9IDA7CS8qIGRlc2NyaWJlIF9fLlNZTURFRiBkYXRhIGluIGFyY2hpdmUgZmlsZXMuICAqLwotc3RhdGljIGludCByZXZlcnNlX3NvcnQgPSAwOwkvKiBzb3J0IGluIGRvd253YXJkKGFscGhhIG9yIG51bWVyaWMpIG9yZGVyICovCi1zdGF0aWMgaW50IHNvcnRfbnVtZXJpY2FsbHkgPSAwOwkvKiBzb3J0IGluIG51bWVyaWMgcmF0aGVyIHRoYW4gYWxwaGEgb3JkZXIgKi8KLXN0YXRpYyBpbnQgc29ydF9ieV9zaXplID0gMDsJLyogc29ydCBieSBzaXplIG9mIHN5bWJvbCAqLwotc3RhdGljIGludCB1bmRlZmluZWRfb25seSA9IDA7CS8qIHByaW50IHVuZGVmaW5lZCBzeW1ib2xzIG9ubHkgKi8KLXN0YXRpYyBpbnQgZHluYW1pYyA9IDA7CQkvKiBwcmludCBkeW5hbWljIHN5bWJvbHMuICAqLwotc3RhdGljIGludCBzaG93X3ZlcnNpb24gPSAwOwkvKiBzaG93IHRoZSB2ZXJzaW9uIG51bWJlciAqLwotc3RhdGljIGludCBzaG93X3N0YXRzID0gMDsJLyogc2hvdyBzdGF0aXN0aWNzICovCi1zdGF0aWMgaW50IGxpbmVfbnVtYmVycyA9IDA7CS8qIHByaW50IGxpbmUgbnVtYmVycyBmb3Igc3ltYm9scyAqLwotCi0vKiBXaGVuIHRvIHByaW50IHRoZSBuYW1lcyBvZiBmaWxlcy4gIE5vdCBtdXR1YWxseSBleGNsdXNpdmUgaW4gU1lTViBmb3JtYXQuICAqLwotc3RhdGljIGludCBmaWxlbmFtZV9wZXJfZmlsZSA9IDA7CS8qIE9uY2UgcGVyIGZpbGUsIG9uIGl0cyBvd24gbGluZS4gICovCi1zdGF0aWMgaW50IGZpbGVuYW1lX3Blcl9zeW1ib2wgPSAwOwkvKiBPbmNlIHBlciBzeW1ib2wsIGF0IHN0YXJ0IG9mIGxpbmUuICAqLwotCi0vKiBQcmludCBmb3JtYXRzIGZvciBwcmludGluZyBhIHN5bWJvbCB2YWx1ZS4gICovCi0jaWZuZGVmIEJGRDY0Ci1zdGF0aWMgY2hhciB2YWx1ZV9mb3JtYXRbXSA9ICIlMDhseCI7Ci0jZWxzZQotI2lmIEJGRF9IT1NUXzY0QklUX0xPTkcKLXN0YXRpYyBjaGFyIHZhbHVlX2Zvcm1hdFtdID0gIiUwMTZseCI7Ci0jZWxzZQotLyogV2UgZG9uJ3QgdXNlIHZhbHVlX2Zvcm1hdCBmb3IgdGhpcyBjYXNlLiAgKi8KLSNlbmRpZgotI2VuZGlmCi1zdGF0aWMgaW50IHByaW50X3JhZGl4ID0gMTY7Ci0vKiBQcmludCBmb3JtYXRzIGZvciBwcmludGluZyBzdGFiIGluZm8uICAqLwotc3RhdGljIGNoYXIgb3RoZXJfZm9ybWF0W10gPSAiJTAyeCI7Ci1zdGF0aWMgY2hhciBkZXNjX2Zvcm1hdFtdID0gIiUwNHgiOwotCi1zdGF0aWMgY2hhciAqdGFyZ2V0ID0gTlVMTDsKLQotLyogVXNlZCB0byBjYWNoZSB0aGUgbGluZSBudW1iZXJzIGZvciBhIEJGRC4gICovCi1zdGF0aWMgYmZkICpsaW5lbm9fY2FjaGVfYmZkOwotc3RhdGljIGJmZCAqbGluZW5vX2NhY2hlX3JlbF9iZmQ7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJkZWJ1Zy1zeW1zIiwgbm9fYXJndW1lbnQsICZwcmludF9kZWJ1Z19zeW1zLCAxfSwKLSAgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDF9LAotICB7ImR5bmFtaWMiLCBub19hcmd1bWVudCwgJmR5bmFtaWMsIDF9LAotICB7ImV4dGVybi1vbmx5Iiwgbm9fYXJndW1lbnQsICZleHRlcm5hbF9vbmx5LCAxfSwKLSAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2YnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsibGluZS1udW1iZXJzIiwgbm9fYXJndW1lbnQsIDAsICdsJ30sCi0gIHsibm8tY3BsdXMiLCBub19hcmd1bWVudCwgJmRvX2RlbWFuZ2xlLCAwfSwgIC8qIExpbnV4IGNvbXBhdGliaWxpdHkuICAqLwotICB7Im5vLWRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsICZkb19kZW1hbmdsZSwgMH0sCi0gIHsibm8tc29ydCIsIG5vX2FyZ3VtZW50LCAmbm9fc29ydCwgMX0sCi0gIHsibnVtZXJpYy1zb3J0Iiwgbm9fYXJndW1lbnQsICZzb3J0X251bWVyaWNhbGx5LCAxfSwKLSAgeyJwb3J0YWJpbGl0eSIsIG5vX2FyZ3VtZW50LCAwLCAnUCd9LAotICB7InByaW50LWFybWFwIiwgbm9fYXJndW1lbnQsICZwcmludF9hcm1hcCwgMX0sCi0gIHsicHJpbnQtZmlsZS1uYW1lIiwgbm9fYXJndW1lbnQsIDAsICdvJ30sCi0gIHsicmFkaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3QnfSwKLSAgeyJyZXZlcnNlLXNvcnQiLCBub19hcmd1bWVudCwgJnJldmVyc2Vfc29ydCwgMX0sCi0gIHsic2l6ZS1zb3J0Iiwgbm9fYXJndW1lbnQsICZzb3J0X2J5X3NpemUsIDF9LAotICB7InN0YXRzIiwgbm9fYXJndW1lbnQsICZzaG93X3N0YXRzLCAxfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMjAwfSwKLSAgeyJkZWZpbmVkLW9ubHkiLCBub19hcmd1bWVudCwgJmRlZmluZWRfb25seSwgMX0sCi0gIHsidW5kZWZpbmVkLW9ubHkiLCBub19hcmd1bWVudCwgJnVuZGVmaW5lZF9vbmx5LCAxfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsICZzaG93X3ZlcnNpb24sIDF9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotDAotLyogU29tZSBlcnJvci1yZXBvcnRpbmcgZnVuY3Rpb25zICovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1hQUJDRGdsbm9wUHJzdXZWXSBbLXQgcmFkaXhdIFstLXJhZGl4PXJhZGl4XSBbLS10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLS1kZWJ1Zy1zeW1zXSBbLS1leHRlcm4tb25seV0gWy0tcHJpbnQtYXJtYXBdIFstLXByaW50LWZpbGUtbmFtZV1cblwKLSAgICAgICBbLS1udW1lcmljLXNvcnRdIFstLW5vLXNvcnRdIFstLXJldmVyc2Utc29ydF0gWy0tc2l6ZS1zb3J0XVxuXAotICAgICAgIFstLXVuZGVmaW5lZC1vbmx5XSBbLS1wb3J0YWJpbGl0eV0gWy1mIHtic2Qsc3lzdixwb3NpeH1dXG5cCi0gICAgICAgWy0tZm9ybWF0PXtic2Qsc3lzdixwb3NpeH1dIFstLWRlbWFuZ2xlXSBbLS1uby1kZW1hbmdsZV0gWy0tZHluYW1pY11cblwKLSAgICAgICBbLS1kZWZpbmVkLW9ubHldIFstLWxpbmUtbnVtYmVyc11cblwKLSAgICAgICBbLS12ZXJzaW9uXSBbLS1oZWxwXVxuXAotICAgICAgIFtmaWxlLi4uXVxuIiksCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogU2V0IHRoZSByYWRpeCBmb3IgdGhlIHN5bWJvbCB2YWx1ZSBhbmQgc2l6ZSBhY2NvcmRpbmcgdG8gUkFESVguICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X3ByaW50X3JhZGl4IChyYWRpeCkKLSAgICAgY2hhciAqcmFkaXg7Ci17Ci0gIHN3aXRjaCAoKnJhZGl4KQotICAgIHsKLSAgICBjYXNlICd4JzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ28nOgotICAgICAgaWYgKCpyYWRpeCA9PSAnZCcpCi0JcHJpbnRfcmFkaXggPSAxMDsKLSAgICAgIGVsc2UKLQlwcmludF9yYWRpeCA9IDg7Ci0jaWZuZGVmIEJGRDY0Ci0gICAgICB2YWx1ZV9mb3JtYXRbNF0gPSAqcmFkaXg7Ci0jZWxzZQotI2lmIEJGRF9IT1NUXzY0QklUX0xPTkcKLSAgICAgIHZhbHVlX2Zvcm1hdFs1XSA9ICpyYWRpeDsKLSNlbHNlCi0gICAgICAvKiBUaGlzIGNhc2UgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyBmb3Igb2N0YWwgYW5kIGRlY2ltYWwKLSAgICAgICAgIHByaW50aW5nLiAgKi8KLSNlbmRpZgotI2VuZGlmCi0gICAgICBvdGhlcl9mb3JtYXRbM10gPSBkZXNjX2Zvcm1hdFszXSA9ICpyYWRpeDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogaW52YWxpZCByYWRpeFxuIiksIHByb2dyYW1fbmFtZSwgcmFkaXgpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc2V0X291dHB1dF9mb3JtYXQgKGYpCi0gICAgIGNoYXIgKmY7Ci17Ci0gIGludCBpOwotCi0gIHN3aXRjaCAoKmYpCi0gICAgewotICAgIGNhc2UgJ2InOgotICAgIGNhc2UgJ0InOgotICAgICAgaSA9IEZPUk1BVF9CU0Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIGkgPSBGT1JNQVRfUE9TSVg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIGkgPSBGT1JNQVRfU1lTVjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogaW52YWxpZCBvdXRwdXQgZm9ybWF0XG4iKSwgcHJvZ3JhbV9uYW1lLCBmKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgZm9ybWF0ID0gJmZvcm1hdHNbaV07Ci19Ci0MCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGludCByZXR2YWw7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYUFCQ0RlZjpnbG5vcFByc3Q6dXZWIiwgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdhJzoKLQkgIHByaW50X2RlYnVnX3N5bXMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JY2FzZSAnbyc6Ci0JICBmaWxlbmFtZV9wZXJfc3ltYm9sID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ0InOgkJLyogRm9yIE1JUFMgY29tcGF0aWJpbGl0eS4gICovCi0JICBzZXRfb3V0cHV0X2Zvcm1hdCAoImJzZCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JICBkb19kZW1hbmdsZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGR5bmFtaWMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICAvKiBJZ25vcmVkIGZvciBIUC9VWCBjb21wYXRpYmlsaXR5LiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgc2V0X291dHB1dF9mb3JtYXQgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIGV4dGVybmFsX29ubHkgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQljYXNlICdsJzoKLQkgIGxpbmVfbnVtYmVycyA9IDE7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQljYXNlICd2JzoKLQkgIHNvcnRfbnVtZXJpY2FsbHkgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAncCc6Ci0JICBub19zb3J0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgotCSAgc2V0X291dHB1dF9mb3JtYXQgKCJwb3NpeCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAncic6Ci0JICByZXZlcnNlX3NvcnQgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBwcmludF9hcm1hcCA9IDE7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIHNldF9wcmludF9yYWRpeCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3UnOgotCSAgdW5kZWZpbmVkX29ubHkgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBzaG93X3ZlcnNpb24gPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIDIwMDoJCS8qIC0tdGFyZ2V0ICovCi0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgMDoJCS8qIEEgbG9uZyBvcHRpb24gdGhhdCBqdXN0IHNldHMgYSBmbGFnLiAgKi8KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgibm0iKTsKLQotICAvKiBPSywgYWxsIG9wdGlvbnMgbm93IHBhcnNlZC4gIElmIG5vIGZpbGVuYW1lIHNwZWNpZmllZCwgZG8gYS5vdXQuICAqLwotICBpZiAob3B0aW5kID09IGFyZ2MpCi0gICAgcmV0dXJuICFkaXNwbGF5X2ZpbGUgKCJhLm91dCIpOwotCi0gIHJldHZhbCA9IDA7Ci0KLSAgaWYgKGFyZ2MgLSBvcHRpbmQgPiAxKQotICAgIGZpbGVuYW1lX3Blcl9maWxlID0gMTsKLQotICAvKiBXZSB3ZXJlIGdpdmVuIHNldmVyYWwgZmlsZW5hbWVzIHRvIGRvLiAgKi8KLSAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgUFJPR1JFU1MgKDEpOwotICAgICAgaWYgKCFkaXNwbGF5X2ZpbGUgKGFyZ3Zbb3B0aW5kKytdKSkKLQlyZXR2YWwrKzsKLSAgICB9Ci0KLSAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOwotCi0jaWZkZWYgSEFWRV9TQlJLCi0gIGlmIChzaG93X3N0YXRzKQotICAgIHsKLSAgICAgIGNoYXIgKmxpbSA9IChjaGFyICopIHNicmsgKDApOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBkYXRhIHNpemUgJWxkXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICAgICAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgZXhpdCAocmV0dmFsKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQwKLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2FyY2hpdmUgKGZpbGUpCi0gICAgIGJmZCAqZmlsZTsKLXsKLSAgYmZkICphcmZpbGUgPSBOVUxMOwotICBiZmQgKmxhc3RfYXJmaWxlID0gTlVMTDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gICgqZm9ybWF0LT5wcmludF9hcmNoaXZlX2ZpbGVuYW1lKSAoYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotCi0gIGlmIChwcmludF9hcm1hcCkKLSAgICBwcmludF9zeW1kZWZfZW50cnkgKGZpbGUpOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgUFJPR1JFU1MgKDEpOwotCi0gICAgICBhcmZpbGUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmaWxlLCBhcmZpbGUpOwotCi0gICAgICBpZiAoYXJmaWxlID09IE5VTEwpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhcmZpbGUsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0JewotCSAgKCpmb3JtYXQtPnByaW50X2FyY2hpdmVfbWVtYmVyKSAoYmZkX2dldF9maWxlbmFtZSAoZmlsZSksCi0JCQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFyZmlsZSkpOwotCSAgZGlzcGxheV9yZWxfZmlsZSAoYXJmaWxlLCBmaWxlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhcmZpbGUpKTsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JICAgIHsKLQkgICAgICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgICAgICBmcmVlIChtYXRjaGluZyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsYXN0X2FyZmlsZSAhPSBOVUxMKQotCXsKLQkgIGJmZF9jbG9zZSAobGFzdF9hcmZpbGUpOwotCSAgbGluZW5vX2NhY2hlX2JmZCA9IE5VTEw7Ci0JICBsaW5lbm9fY2FjaGVfcmVsX2JmZCA9IE5VTEw7Ci0JfQotICAgICAgbGFzdF9hcmZpbGUgPSBhcmZpbGU7Ci0gICAgfQotCi0gIGlmIChsYXN0X2FyZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9jbG9zZSAobGFzdF9hcmZpbGUpOwotICAgICAgbGluZW5vX2NhY2hlX2JmZCA9IE5VTEw7Ci0gICAgICBsaW5lbm9fY2FjaGVfcmVsX2JmZCA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotZGlzcGxheV9maWxlIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGJvb2xlYW4gcmV0dmFsID0gdHJ1ZTsKLSAgYmZkICpmaWxlOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgZmlsZSA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaWxlLCBiZmRfYXJjaGl2ZSkpCi0gICAgewotICAgICAgZGlzcGxheV9hcmNoaXZlIChmaWxlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoZmlsZSwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICAoKmZvcm1hdC0+cHJpbnRfb2JqZWN0X2ZpbGVuYW1lKSAoZmlsZW5hbWUpOwotICAgICAgZGlzcGxheV9yZWxfZmlsZSAoZmlsZSwgTlVMTCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlbmFtZSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIHJldHZhbCA9IGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2Nsb3NlIChmaWxlKSA9PSBmYWxzZSkKLSAgICBiZmRfZmF0YWwgKGZpbGVuYW1lKTsKLQotICBsaW5lbm9fY2FjaGVfYmZkID0gTlVMTDsKLSAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOwotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi0vKiBUaGVzZSBnbG9iYWxzIGFyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gaW50byB0aGUgc29ydGluZwotICAgcm91dGluZXMuICAqLwotc3RhdGljIGJmZCAqc29ydF9iZmQ7Ci1zdGF0aWMgYm9vbGVhbiBzb3J0X2R5bmFtaWM7Ci1zdGF0aWMgYXN5bWJvbCAqc29ydF94Owotc3RhdGljIGFzeW1ib2wgKnNvcnRfeTsKLQotLyogU3ltYm9sLXNvcnRpbmcgcHJlZGljYXRlcyAqLwotI2RlZmluZSB2YWx1ZW9mKHgpICgoeCktPnNlY3Rpb24tPnZtYSArICh4KS0+dmFsdWUpCi0KLS8qIE51bWVyaWMgc29ydHMuICBVbmRlZmluZWQgc3ltYm9scyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgImxlc3MgdGhhbiIKLSAgIGRlZmluZWQgc3ltYm9scyB3aXRoIHplcm8gdmFsdWVzLiAgQ29tbW9uIHN5bWJvbHMgYXJlIG5vdCB0cmVhdGVkCi0gICBzcGVjaWFsbHkgLS0gaS5lLiwgdGhlaXIgc2l6ZXMgYXJlIHVzZWQgYXMgdGhlaXIgInZhbHVlcyIuICAqLwotCi1zdGF0aWMgaW50Ci1udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KQotICAgICBjb25zdCBQVFIgUF94OwotICAgICBjb25zdCBQVFIgUF95OwotewotICBhc3ltYm9sICp4LCAqeTsKLSAgYXNlY3Rpb24gKnhzLCAqeXM7Ci0KLSAgeCA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF94LCBzb3J0X3gpOwotICB5ID0gIGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF95LCBzb3J0X3kpOwotICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKHNvcnRfYmZkKSk7Ci0KLSAgeHMgPSBiZmRfZ2V0X3NlY3Rpb24gKHgpOwotICB5cyA9IGJmZF9nZXRfc2VjdGlvbiAoeSk7Ci0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoeHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoeXMpKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoeXMpKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmICh2YWx1ZW9mICh4KSAhPSB2YWx1ZW9mICh5KSkKLSAgICByZXR1cm4gdmFsdWVvZiAoeCkgPCB2YWx1ZW9mICh5KSA/IC0xIDogMTsKLQotICByZXR1cm4gbm9uX251bWVyaWNfZm9yd2FyZCAoUF94LCBQX3kpOwotfQotCi1zdGF0aWMgaW50Ci1udW1lcmljX3JldmVyc2UgKHgsIHkpCi0gICAgIGNvbnN0IFBUUiB4OwotICAgICBjb25zdCBQVFIgeTsKLXsKLSAgcmV0dXJuIC0gbnVtZXJpY19mb3J3YXJkICh4LCB5KTsKLX0KLQotc3RhdGljIGludAotbm9uX251bWVyaWNfZm9yd2FyZCAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGFzeW1ib2wgKngsICp5OwotICBjb25zdCBjaGFyICp4biwgKnluOwotCi0gIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKLSAgeSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF95LCBzb3J0X3kpOwotICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKHNvcnRfYmZkKSk7Ci0KLSAgeG4gPSBiZmRfYXN5bWJvbF9uYW1lICh4KTsKLSAgeW4gPSBiZmRfYXN5bWJvbF9uYW1lICh5KTsKLQotICByZXR1cm4gKCh4biA9PSBOVUxMKSA/ICgoeW4gPT0gTlVMTCkgPyAwIDogLTEpIDoKLQkgICgoeW4gPT0gTlVMTCkgPyAxIDogc3RyY21wICh4biwgeW4pKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX3JldmVyc2UgKHgsIHkpCi0gICAgIGNvbnN0IFBUUiB4OwotICAgICBjb25zdCBQVFIgeTsKLXsKLSAgcmV0dXJuIC0gbm9uX251bWVyaWNfZm9yd2FyZCAoeCwgeSk7Ci19Ci0KLXN0YXRpYyBpbnQgKCooc29ydGVyc1syXVsyXSkpIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSkgPQotewotICB7IG5vbl9udW1lcmljX2ZvcndhcmQsIG5vbl9udW1lcmljX3JldmVyc2UgfSwKLSAgeyBudW1lcmljX2ZvcndhcmQsIG51bWVyaWNfcmV2ZXJzZSB9Ci19OwotCi0vKiBUaGlzIHNvcnQgcm91dGluZSBpcyB1c2VkIGJ5IHNvcnRfc3ltYm9sc19ieV9zaXplLiAgSXQgaXMgc2ltaWxhcgotICAgdG8gbnVtZXJpY19mb3J3YXJkLCBidXQgd2hlbiBzeW1ib2xzIGhhdmUgdGhlIHNhbWUgdmFsdWUgaXQgc29ydHMKLSAgIGJ5IHNlY3Rpb24gVk1BLiAgVGhpcyBzaW1wbGlmaWVzIHRoZSBzb3J0X3N5bWJvbHNfYnlfc2l6ZSBjb2RlCi0gICB3aGljaCBoYW5kbGVzIHN5bWJvbHMgYXQgdGhlIGVuZCBvZiBzZWN0aW9ucy4gIEFsc28sIHRoaXMgcm91dGluZQotICAgdHJpZXMgdG8gc29ydCBmaWxlIG5hbWVzIGJlZm9yZSBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUgdmFsdWUuCi0gICBUaGF0IHdpbGwgbWFrZSB0aGUgZmlsZSBuYW1lIGhhdmUgYSB6ZXJvIHNpemUsIHdoaWNoIHdpbGwgbWFrZQotICAgc29ydF9zeW1ib2xzX2J5X3NpemUgY2hvb3NlIHRoZSBub24gZmlsZSBuYW1lIHN5bWJvbCwgbGVhZGluZyB0bwotICAgbW9yZSBtZWFuaW5nZnVsIG91dHB1dC4gIEZvciBzaW1pbGFyIHJlYXNvbnMsIHRoaXMgY29kZSBzb3J0cwotICAgZ251X2NvbXBpbGVkXyogYW5kIGdjYzJfY29tcGlsZWQgYmVmb3JlIG90aGVyIHN5bWJvbHMgd2l0aCB0aGUgc2FtZQotICAgdmFsdWUuICAqLwotCi1zdGF0aWMgaW50Ci1zaXplX2ZvcndhcmQxIChQX3gsIFBfeSkKLSAgICAgY29uc3QgUFRSIFBfeDsKLSAgICAgY29uc3QgUFRSIFBfeTsKLXsKLSAgYXN5bWJvbCAqeCwgKnk7Ci0gIGFzZWN0aW9uICp4cywgKnlzOwotICBjb25zdCBjaGFyICp4biwgKnluOwotICBzaXplX3QgeG5sLCB5bmw7Ci0gIGludCB4ZiwgeWY7Ci0KLSAgeCA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF94LCBzb3J0X3gpOwotICB5ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3ksIHNvcnRfeSk7Ci0gIGlmICh4ID09IE5VTEwgfHwgeSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoc29ydF9iZmQpKTsKLQotICB4cyA9IGJmZF9nZXRfc2VjdGlvbiAoeCk7Ci0gIHlzID0gYmZkX2dldF9zZWN0aW9uICh5KTsKLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uICh4cykpCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAodmFsdWVvZiAoeCkgIT0gdmFsdWVvZiAoeSkpCi0gICAgcmV0dXJuIHZhbHVlb2YgKHgpIDwgdmFsdWVvZiAoeSkgPyAtMSA6IDE7Ci0KLSAgaWYgKHhzLT52bWEgIT0geXMtPnZtYSkKLSAgICByZXR1cm4geHMtPnZtYSA8IHlzLT52bWEgPyAtMSA6IDE7Ci0KLSAgeG4gPSBiZmRfYXN5bWJvbF9uYW1lICh4KTsKLSAgeW4gPSBiZmRfYXN5bWJvbF9uYW1lICh5KTsKLSAgeG5sID0gc3RybGVuICh4bik7Ci0gIHlubCA9IHN0cmxlbiAoeW4pOwotCi0gIC8qIFRoZSBzeW1ib2xzIGdudV9jb21waWxlZCBhbmQgZ2NjMl9jb21waWxlZCBjb252ZXkgZXZlbiBsZXNzCi0gICAgIGluZm9ybWF0aW9uIHRoYW4gdGhlIGZpbGUgbmFtZSwgc28gc29ydCB0aGVtIG91dCBmaXJzdC4gICovCi0KLSAgeGYgPSAoc3Ryc3RyICh4biwgImdudV9jb21waWxlZCIpICE9IE5VTEwKLQl8fCBzdHJzdHIgKHhuLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOwotICB5ZiA9IChzdHJzdHIgKHluLCAiZ251X2NvbXBpbGVkIikgIT0gTlVMTAotCXx8IHN0cnN0ciAoeW4sICJnY2MyX2NvbXBpbGVkIikgIT0gTlVMTCk7Ci0KLSAgaWYgKHhmICYmICEgeWYpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoISB4ZiAmJiB5ZikKLSAgICByZXR1cm4gMTsKLQotICAvKiBXZSB1c2UgYSBoZXVyaXN0aWMgZm9yIHRoZSBmaWxlIG5hbWUuICBJdCBtYXkgbm90IHdvcmsgb24gbm9uCi0gICAgIFVuaXggc3lzdGVtcywgYnV0IGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlcjsgdGhlIG9ubHkgZGlmZmVyZW5jZQotICAgICBpcyBwcmVjaXNlbHkgd2hpY2ggc3ltYm9sIG5hbWVzIGdldCBwcmludGVkLiAgKi8KLQotI2RlZmluZSBmaWxlX3N5bWJvbChzLCBzbiwgc25sKQkJCVwKLSAgKCgocyktPmZsYWdzICYgQlNGX0ZJTEUpICE9IDAJCQlcCi0gICB8fCAoKHNuKVsoc25sKSAtIDJdID09ICcuJwkJCVwKLSAgICAgICAmJiAoKHNuKVsoc25sKSAtIDFdID09ICdvJwkJXAotCSAgIHx8IChzbilbKHNubCkgLSAxXSA9PSAnYScpKSkKLQotICB4ZiA9IGZpbGVfc3ltYm9sICh4LCB4biwgeG5sKTsKLSAgeWYgPSBmaWxlX3N5bWJvbCAoeSwgeW4sIHlubCk7Ci0KLSAgaWYgKHhmICYmICEgeWYpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoISB4ZiAmJiB5ZikKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gbm9uX251bWVyaWNfZm9yd2FyZCAoUF94LCBQX3kpOwotfQotCi0vKiBUaGlzIHNvcnQgcm91dGluZSBpcyB1c2VkIGJ5IHNvcnRfc3ltYm9sc19ieV9zaXplLiAgSXQgaXMgc29ydGluZwotICAgYW4gYXJyYXkgb2Ygc2l6ZV9zeW0gc3RydWN0dXJlcyBpbnRvIHNpemUgb3JkZXIuICAqLwotCi1zdGF0aWMgaW50Ci1zaXplX2ZvcndhcmQyIChQX3gsIFBfeSkKLSAgICAgY29uc3QgUFRSIFBfeDsKLSAgICAgY29uc3QgUFRSIFBfeTsKLXsKLSAgY29uc3Qgc3RydWN0IHNpemVfc3ltICp4ID0gKGNvbnN0IHN0cnVjdCBzaXplX3N5bSAqKSBQX3g7Ci0gIGNvbnN0IHN0cnVjdCBzaXplX3N5bSAqeSA9IChjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKikgUF95OwotCi0gIGlmICh4LT5zaXplIDwgeS0+c2l6ZSkKLSAgICByZXR1cm4gcmV2ZXJzZV9zb3J0ID8gMSA6IC0xOwotICBlbHNlIGlmICh4LT5zaXplID4geS0+c2l6ZSkKLSAgICByZXR1cm4gcmV2ZXJzZV9zb3J0ID8gLTEgOiAxOwotICBlbHNlCi0gICAgcmV0dXJuIHNvcnRlcnNbMF1bcmV2ZXJzZV9zb3J0XSAoeC0+bWluaXN5bSwgeS0+bWluaXN5bSk7Ci19Ci0KLS8qIFNvcnQgdGhlIHN5bWJvbHMgYnkgc2l6ZS4gIFdlIGd1ZXNzIHRoZSBzaXplIGJ5IGFzc3VtaW5nIHRoYXQgdGhlCi0gICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgYSBzeW1ib2wgYW5kIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgbmV4dCBoaWdoZXIgc3ltYm9sIGlzIHRoZSBzaXplLiAgRklYTUU6IEVMRiBhY3R1YWxseSBzdG9yZXMgYSBzaXplCi0gICB3aXRoIGVhY2ggc3ltYm9sLiAgV2Ugc2hvdWxkIHVzZSBpdC4gICovCi0KLXN0YXRpYyBsb25nCi1zb3J0X3N5bWJvbHNfYnlfc2l6ZSAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBzeW1zaXplc3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3Qgc2l6ZV9zeW0gKipzeW1zaXplc3A7Ci17Ci0gIHN0cnVjdCBzaXplX3N5bSAqc3ltc2l6ZXM7Ci0gIGJmZF9ieXRlICpmcm9tLCAqZnJvbWVuZDsKLSAgYXN5bWJvbCAqc3ltID0gTlVMTDsKLSAgYXN5bWJvbCAqc3RvcmVfc3ltLCAqc3RvcmVfbmV4dDsKLQotICBxc29ydCAobWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBzaXplX2ZvcndhcmQxKTsKLQotICAvKiBXZSBhcmUgZ29pbmcgdG8gcmV0dXJuIGEgc3BlY2lhbCBzZXQgb2Ygc3ltYm9scyBhbmQgc2l6ZXMgdG8KLSAgICAgcHJpbnQuICAqLwotICBzeW1zaXplcyA9IChzdHJ1Y3Qgc2l6ZV9zeW0gKikgeG1hbGxvYyAoc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCBzaXplX3N5bSkpOwotICAqc3ltc2l6ZXNwID0gc3ltc2l6ZXM7Ci0KLSAgLyogTm90ZSB0aGF0IGZpbHRlcl9zeW1ib2xzIGhhcyBhbHJlYWR5IHJlbW92ZWQgYWxsIGFic29sdXRlIGFuZAotICAgICB1bmRlZmluZWQgc3ltYm9scy4gIEhlcmUgd2UgcmVtb3ZlIGFsbCBzeW1ib2xzIHdob3NlIHNpemUgd2luZHMKLSAgICAgdXAgYXMgemVyby4gICovCi0KLSAgZnJvbSA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudCAqIHNpemU7Ci0KLSAgc3RvcmVfc3ltID0gc29ydF94OwotICBzdG9yZV9uZXh0ID0gc29ydF95OwotCi0gIGlmIChmcm9tIDwgZnJvbWVuZCkKLSAgICB7Ci0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIChjb25zdCBQVFIpIGZyb20sCi0JCQkJICAgICAgc3RvcmVfc3ltKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0KLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgYXN5bWJvbCAqbmV4dDsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHN6OwotICAgICAgYXN5bWJvbCAqdGVtcDsKLQotICAgICAgaWYgKGZyb20gKyBzaXplIDwgZnJvbWVuZCkKLQl7Ci0JICBuZXh0ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLAotCQkJCQkgICBkeW5hbWljLAotCQkJCQkgICAoY29uc3QgUFRSKSAoZnJvbSArIHNpemUpLAotCQkJCQkgICBzdG9yZV9uZXh0KTsKLQkgIGlmIChuZXh0ID09IE5VTEwpCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCX0KLSAgICAgIGVsc2UKLQluZXh0ID0gTlVMTDsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW0pOwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCXN6ID0gc3ltLT52YWx1ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZnJvbSArIHNpemUgPCBmcm9tZW5kCi0JICAgICAgJiYgc2VjID09IGJmZF9nZXRfc2VjdGlvbiAobmV4dCkpCi0JICAgIHN6ID0gdmFsdWVvZiAobmV4dCkgLSB2YWx1ZW9mIChzeW0pOwotCSAgZWxzZQotCSAgICBzeiA9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCSAgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpCi0JCSAgLSB2YWx1ZW9mIChzeW0pKTsKLQl9Ci0KLSAgICAgIGlmIChzeiAhPSAwKQotCXsKLQkgIHN5bXNpemVzLT5taW5pc3ltID0gKGNvbnN0IFBUUikgZnJvbTsKLQkgIHN5bXNpemVzLT5zaXplID0gc3o7Ci0JICArK3N5bXNpemVzOwotCX0KLQotICAgICAgc3ltID0gbmV4dDsKLQotICAgICAgdGVtcCA9IHN0b3JlX3N5bTsKLSAgICAgIHN0b3JlX3N5bSA9IHN0b3JlX25leHQ7Ci0gICAgICBzdG9yZV9uZXh0ID0gdGVtcDsKLSAgICB9Ci0KLSAgc3ltY291bnQgPSBzeW1zaXplcyAtICpzeW1zaXplc3A7Ci0KLSAgLyogV2UgbXVzdCBub3cgc29ydCBhZ2FpbiBieSBzaXplLiAgKi8KLSAgcXNvcnQgKChQVFIpICpzeW1zaXplc3AsIHN5bWNvdW50LCBzaXplb2YgKHN0cnVjdCBzaXplX3N5bSksIHNpemVfZm9yd2FyZDIpOwotCi0gIHJldHVybiBzeW1jb3VudDsKLX0KLQwKLS8qIElmIEFSQ0hJVkVfQkZEIGlzIG5vbi1OVUxMLCBpdCBpcyB0aGUgYXJjaGl2ZSBjb250YWluaW5nIEFCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9yZWxfZmlsZSAoYWJmZCwgYXJjaGl2ZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkICphcmNoaXZlX2JmZDsKLXsKLSAgbG9uZyBzeW1jb3VudDsKLSAgUFRSIG1pbmlzeW1zOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgc3RydWN0IHNpemVfc3ltICpzeW1zaXplczsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGlmICghKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gYmZkX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsICZtaW5pc3ltcywgJnNpemUpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGlmIChzeW1jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERpc2NhcmQgdGhlIHN5bWJvbHMgd2UgZG9uJ3Qgd2FudCB0byBwcmludC4KLSAgICAgSXQncyBPSyB0byBkbyB0aGlzIGluIHBsYWNlOyB3ZSdsbCBmcmVlIHRoZSBzdG9yYWdlIGFueXdheQotICAgICAoYWZ0ZXIgcHJpbnRpbmcpLiAgKi8KLQotICBzeW1jb3VudCA9IGZpbHRlcl9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpOwotCi0gIHN5bXNpemVzID0gTlVMTDsKLSAgaWYgKCEgbm9fc29ydCkKLSAgICB7Ci0gICAgICBzb3J0X2JmZCA9IGFiZmQ7Ci0gICAgICBzb3J0X2R5bmFtaWMgPSBkeW5hbWljOwotICAgICAgc29ydF94ID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgICAgIHNvcnRfeSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gICAgICBpZiAoc29ydF94ID09IE5VTEwgfHwgc29ydF95ID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIGlmICghIHNvcnRfYnlfc2l6ZSkKLQlxc29ydCAobWluaXN5bXMsIHN5bWNvdW50LCBzaXplLAotCSAgICAgICBzb3J0ZXJzW3NvcnRfbnVtZXJpY2FsbHldW3JldmVyc2Vfc29ydF0pOwotICAgICAgZWxzZQotCXN5bWNvdW50ID0gc29ydF9zeW1ib2xzX2J5X3NpemUgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwKLQkJCQkJIHNpemUsICZzeW1zaXplcyk7Ci0gICAgfQotCi0gIGlmICghIHNvcnRfYnlfc2l6ZSkKLSAgICBwcmludF9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUsIGFyY2hpdmVfYmZkKTsKLSAgZWxzZQotICAgIHByaW50X3NpemVfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgc3ltc2l6ZXMsIHN5bWNvdW50LCBhcmNoaXZlX2JmZCk7Ci0KLSAgZnJlZSAobWluaXN5bXMpOwotfQotDAotLyogQ2hvb3NlIHdoaWNoIHN5bWJvbCBlbnRyaWVzIHRvIHByaW50OwotICAgY29tcGFjdCB0aGVtIGRvd253YXJkIHRvIGdldCByaWQgb2YgdGhlIHJlc3QuCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBzeW1ib2xzIHRvIGJlIHByaW50ZWQuICAqLwotCi1zdGF0aWMgbG9uZwotZmlsdGVyX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGJmZF9ieXRlICpmcm9tLCAqZnJvbWVuZCwgKnRvOwotICBhc3ltYm9sICpzdG9yZTsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotICB0byA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLQotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20gKz0gc2l6ZSkKLSAgICB7Ci0gICAgICBpbnQga2VlcCA9IDA7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgIAotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCAoY29uc3QgUFRSKSBmcm9tLCBzdG9yZSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIGlmICh1bmRlZmluZWRfb25seSkKLQlrZWVwID0gYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pOwotICAgICAgZWxzZSBpZiAoZXh0ZXJuYWxfb25seSkKLQlrZWVwID0gKChzeW0tPmZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMAotCQl8fCAoc3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwCi0JCXx8IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCQl8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpOwotICAgICAgZWxzZQotCWtlZXAgPSAxOwotCi0gICAgICBpZiAoa2VlcAotCSAgJiYgISBwcmludF9kZWJ1Z19zeW1zCi0JICAmJiAoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0Ja2VlcCA9IDA7Ci0KLSAgICAgIGlmIChrZWVwCi0JICAmJiBzb3J0X2J5X3NpemUKLQkgICYmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpKQotCWtlZXAgPSAwOwotCi0gICAgICBpZiAoa2VlcAotCSAgJiYgZGVmaW5lZF9vbmx5KQotCXsKLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JICAgIGtlZXAgPSAwOwotCX0KLQotICAgICAgaWYgKGtlZXApCi0JewotCSAgbWVtY3B5ICh0bywgZnJvbSwgc2l6ZSk7Ci0JICB0byArPSBzaXplOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuICh0byAtIChiZmRfYnl0ZSAqKSBtaW5pc3ltcykgLyBzaXplOwotfQotDAotLyogUHJpbnQgc3ltYm9sIG5hbWUgTkFNRSwgcmVhZCBmcm9tIEFCRkQsIHdpdGggcHJpbnRmIGZvcm1hdCBGT1JNQVQsCi0gICBkZW1hbmdsaW5nIGl0IGlmIHJlcXVlc3RlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1uYW1lIChmb3JtYXQsIG5hbWUsIGFiZmQpCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoZG9fZGVtYW5nbGUgJiYgKm5hbWUpCi0gICAgewotICAgICAgY2hhciAqcmVzOwotCi0gICAgICAvKiBJbiB0aGlzIG1vZGUsIGdpdmUgYSB1c2VyLWxldmVsIHZpZXcgb2YgdGhlIHN5bWJvbCBuYW1lCi0JIGV2ZW4gaWYgaXQncyBub3QgbWFuZ2xlZDsgc3RyaXAgb2ZmIGFueSBsZWFkaW5nCi0JIHVuZGVyc2NvcmUuICAqLwotICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gbmFtZVswXSkKLQluYW1lKys7Ci0KLSAgICAgIHJlcyA9IGNwbHVzX2RlbWFuZ2xlIChuYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0gICAgICBpZiAocmVzKQotCXsKLQkgIHByaW50ZiAoZm9ybWF0LCByZXMpOwotCSAgZnJlZSAocmVzKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIHByaW50ZiAoZm9ybWF0LCBuYW1lKTsKLX0KLQotLyogUHJpbnQgdGhlIHN5bWJvbHMuICBJZiBBUkNISVZFX0JGRCBpcyBub24tTlVMTCwgaXQgaXMgdGhlIGFyY2hpdmUKLSAgIGNvbnRhaW5pbmcgQUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUsIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYmZkICphcmNoaXZlX2JmZDsKLXsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0gIGJmZF9ieXRlICpmcm9tLCAqZnJvbWVuZDsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20gKz0gc2l6ZSkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgZnJvbSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBwcmludF9zeW1ib2wgKGFiZmQsIHN5bSwgYXJjaGl2ZV9iZmQpOwotICAgIH0KLX0KLQotLyogUHJpbnQgdGhlIHN5bWJvbHMgd2hlbiBzb3J0aW5nIGJ5IHNpemUuICAqLwotCi1zdGF0aWMgdm9pZCAKLXByaW50X3NpemVfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgc3ltc2l6ZXMsIHN5bWNvdW50LCBhcmNoaXZlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIHN0cnVjdCBzaXplX3N5bSAqc3ltc2l6ZXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIGFzeW1ib2wgKnN0b3JlOwotICBzdHJ1Y3Qgc2l6ZV9zeW0gKmZyb20sICpmcm9tZW5kOwotCi0gIHN0b3JlID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgaWYgKHN0b3JlID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgZnJvbSA9IHN5bXNpemVzOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50OwotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20rKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgZnJvbS0+bWluaXN5bSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICAvKiBTZXQgdGhlIHN5bWJvbCB2YWx1ZSBzbyB0aGF0IHdlIGFjdHVhbGx5IGRpc3BsYXkgdGhlIHN5bWJvbAotICAgICAgICAgc2l6ZS4gICovCi0gICAgICBzeW0tPnZhbHVlID0gZnJvbS0+c2l6ZSAtIGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKTsKLQotICAgICAgcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgc2luZ2xlIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2wgKGFiZmQsIHN5bSwgYXJjaGl2ZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmQgKmFyY2hpdmVfYmZkOwotewotICBQUk9HUkVTUyAoMSk7Ci0KLSAgKCpmb3JtYXQtPnByaW50X3N5bWJvbF9maWxlbmFtZSkgKGFyY2hpdmVfYmZkLCBhYmZkKTsKLQotICBpZiAodW5kZWZpbmVkX29ubHkpCi0gICAgewotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQlwcmludF9zeW1uYW1lICgiJXMiLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCBhYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xfaW5mbyBzeW1pbmZvOwotCi0gICAgICBiZmRfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW0sICZzeW1pbmZvKTsKLSAgICAgICgqZm9ybWF0LT5wcmludF9zeW1ib2xfaW5mbykgKCZzeW1pbmZvLCBhYmZkKTsKLSAgICB9Ci0KLSAgaWYgKGxpbmVfbnVtYmVycykKLSAgICB7Ci0gICAgICBzdGF0aWMgYXN5bWJvbCAqKnN5bXM7Ci0gICAgICBzdGF0aWMgbG9uZyBzeW1jb3VudDsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqZnVuY3Rpb25uYW1lOwotICAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLQotICAgICAgLyogV2UgbmVlZCB0byBnZXQgdGhlIGNhbm9uaWNhbCBzeW1ib2xzIGluIG9yZGVyIHRvIGNhbGwKLSAgICAgICAgIGJmZF9maW5kX25lYXJlc3RfbGluZS4gIFRoaXMgaXMgaW5lZmZpY2llbnQsIGJ1dCwgdGhlbiwgeW91Ci0gICAgICAgICBkb24ndCBoYXZlIHRvIHVzZSAtLWxpbmUtbnVtYmVycy4gICovCi0gICAgICBpZiAoYWJmZCAhPSBsaW5lbm9fY2FjaGVfYmZkICYmIHN5bXMgIT0gTlVMTCkKLQl7Ci0JICBmcmVlIChzeW1zKTsKLQkgIHN5bXMgPSBOVUxMOwotCX0KLSAgICAgIGlmIChzeW1zID09IE5VTEwpCi0JewotCSAgbG9uZyBzeW1zaXplOwotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotCSAgaWYgKHN5bXNpemUgPCAwKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1zKTsKLQkgIGlmIChzeW1jb3VudCA8IDApCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgbGluZW5vX2NhY2hlX2JmZCA9IGFiZmQ7Ci0JfQotCi0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCXsKLQkgIHN0YXRpYyBhc2VjdGlvbiAqKnNlY3M7Ci0JICBzdGF0aWMgYXJlbGVudCAqKipyZWxvY3M7Ci0JICBzdGF0aWMgbG9uZyAqcmVsY291bnQ7Ci0JICBzdGF0aWMgdW5zaWduZWQgaW50IHNlY2NvdW50OwotCSAgdW5zaWduZWQgaW50IGk7Ci0JICBjb25zdCBjaGFyICpzeW1uYW1lOwotCi0JICAvKiBGb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCwgd2UgdHJ5IHRvIGZpbmQgYSByZWxvYyBmb3IgdGhlCi0gICAgICAgICAgICAgc3ltYm9sLCBhbmQgcHJpbnQgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSByZWxvYy4gICovCi0KLQkgIGlmIChhYmZkICE9IGxpbmVub19jYWNoZV9yZWxfYmZkICYmIHJlbG9jcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IHNlY2NvdW50OyBpKyspCi0JCWlmIChyZWxvY3NbaV0gIT0gTlVMTCkKLQkJICBmcmVlIChyZWxvY3NbaV0pOwotCSAgICAgIGZyZWUgKHNlY3MpOwotCSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0JICAgICAgZnJlZSAocmVsY291bnQpOwotCSAgICAgIHNlY3MgPSBOVUxMOwotCSAgICAgIHJlbG9jcyA9IE5VTEw7Ci0JICAgICAgcmVsY291bnQgPSBOVUxMOwotCSAgICB9Ci0KLQkgIGlmIChyZWxvY3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBnZXRfcmVsb2NzX2luZm8gaW5mbzsKLQotCSAgICAgIHNlY2NvdW50ID0gYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKTsKLQotCSAgICAgIHNlY3MgPSAoYXNlY3Rpb24gKiopIHhtYWxsb2MgKHNlY2NvdW50ICogc2l6ZW9mICpzZWNzKTsKLQkgICAgICByZWxvY3MgPSAoYXJlbGVudCAqKiopIHhtYWxsb2MgKHNlY2NvdW50ICogc2l6ZW9mICpyZWxvY3MpOwotCSAgICAgIHJlbGNvdW50ID0gKGxvbmcgKikgeG1hbGxvYyAoc2VjY291bnQgKiBzaXplb2YgKnJlbGNvdW50KTsKLQotCSAgICAgIGluZm8uc2VjcyA9IHNlY3M7Ci0JICAgICAgaW5mby5yZWxvY3MgPSByZWxvY3M7Ci0JICAgICAgaW5mby5yZWxjb3VudCA9IHJlbGNvdW50OwotCSAgICAgIGluZm8uc3ltcyA9IHN5bXM7Ci0JICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBnZXRfcmVsb2NzLCAoUFRSKSAmaW5mbyk7Ci0JICAgICAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBhYmZkOwotCSAgICB9Ci0KLQkgIHN5bW5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOwotCSAgZm9yIChpID0gMDsgaSA8IHNlY2NvdW50OyBpKyspCi0JICAgIHsKLQkgICAgICBsb25nIGo7Ci0KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgcmVsY291bnRbaV07IGorKykKLQkJewotCQkgIGFyZWxlbnQgKnI7Ci0KLQkJICByID0gcmVsb2NzW2ldW2pdOwotCQkgIGlmIChyLT5zeW1fcHRyX3B0ciAhPSBOVUxMCi0JCSAgICAgICYmICgqci0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uID09IHN5bS0+c2VjdGlvbgotCQkgICAgICAmJiAoKnItPnN5bV9wdHJfcHRyKS0+dmFsdWUgPT0gc3ltLT52YWx1ZQotCQkgICAgICAmJiBzdHJjbXAgKHN5bW5hbWUsCi0JCQkJIGJmZF9hc3ltYm9sX25hbWUgKCpyLT5zeW1fcHRyX3B0cikpID09IDAKLQkJICAgICAgJiYgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWNzW2ldLCBzeW1zLAotCQkJCQkJci0+YWRkcmVzcywgJmZpbGVuYW1lLAotCQkJCQkJJmZ1bmN0aW9ubmFtZSwgJmxpbmVubykpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIG9ubHkgcHJpbnQgdGhlIGZpcnN0IG9uZSB3ZSBmaW5kLiAgKi8KLQkJICAgICAgcHJpbnRmICgiXHQlczoldSIsIGZpbGVuYW1lLCBsaW5lbm8pOwotCQkgICAgICBpID0gc2VjY291bnQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPm93bmVyID09IGFiZmQpCi0JewotCSAgaWYgKGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pLCBzeW1zLAotCQkJCSAgICAgc3ltLT52YWx1ZSwgJmZpbGVuYW1lLCAmZnVuY3Rpb25uYW1lLAotCQkJCSAgICAgJmxpbmVubykKLQkgICAgICAmJiBmaWxlbmFtZSAhPSBOVUxMCi0JICAgICAgJiYgbGluZW5vICE9IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcdCVzOiV1IiwgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHB1dGNoYXIgKCdcbicpOwotfQotDAotLyogVGhlIGZvbGxvd2luZyAzIGdyb3VwcyBvZiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB1bmNvbmRpdGlvbmFsbHksCi0gICBvbmNlIGF0IHRoZSBzdGFydCBvZiBwcm9jZXNzaW5nIGVhY2ggZmlsZSBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KLSAgIFRoZXkgc2hvdWxkIGNoZWNrIGBmaWxlbmFtZV9wZXJfZmlsZScgYW5kIGBmaWxlbmFtZV9wZXJfc3ltYm9sJywKLSAgIGFzIGFwcHJvcHJpYXRlIGZvciB0aGVpciBvdXRwdXQgZm9ybWF0LCB0byBkZXRlcm1pbmUgd2hldGhlciB0bwotICAgcHJpbnQgYW55dGhpbmcuICAqLwotDAotLyogUHJpbnQgdGhlIG5hbWUgb2YgYW4gb2JqZWN0IGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfYnNkIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfZmlsZSAmJiAhZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCJcbiVzOlxuIiwgZmlsZW5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3N5c3YgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKHVuZGVmaW5lZF9vbmx5KQotICAgIHByaW50ZiAoXygiXG5cblVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXM6XG5cbiIpLCBmaWxlbmFtZSk7Ci0gIGVsc2UKLSAgICBwcmludGYgKF8oIlxuXG5TeW1ib2xzIGZyb20gJXM6XG5cbiIpLCBmaWxlbmFtZSk7Ci0gIHByaW50ZiAoXygiXAotTmFtZSAgICAgICAgICAgICAgICAgIFZhbHVlICAgQ2xhc3MgICAgICAgIFR5cGUgICAgICAgICBTaXplICAgTGluZSAgU2VjdGlvblxuXG4iKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfcG9zaXggKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKGZpbGVuYW1lX3Blcl9maWxlICYmICFmaWxlbmFtZV9wZXJfc3ltYm9sKQotICAgIHByaW50ZiAoIiVzOlxuIiwgZmlsZW5hbWUpOwotfQotDAotLyogUHJpbnQgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9ic2QgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKGZpbGVuYW1lX3Blcl9maWxlKQotICAgIHByaW50ZiAoIlxuJXM6XG4iLCBmaWxlbmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3N5c3YgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9wb3NpeCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci19Ci0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX2JzZCAoYXJjaGl2ZSwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKmFyY2hpdmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICghZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCJcbiVzOlxuIiwgZmlsZW5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9tZW1iZXJfc3lzdiAoYXJjaGl2ZSwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKmFyY2hpdmU7Ci0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAodW5kZWZpbmVkX29ubHkpCi0gICAgcHJpbnRmIChfKCJcblxuVW5kZWZpbmVkIHN5bWJvbHMgZnJvbSAlc1slc106XG5cbiIpLCBhcmNoaXZlLCBmaWxlbmFtZSk7Ci0gIGVsc2UKLSAgICBwcmludGYgKF8oIlxuXG5TeW1ib2xzIGZyb20gJXNbJXNdOlxuXG4iKSwgYXJjaGl2ZSwgZmlsZW5hbWUpOwotICBwcmludGYgKF8oIlwKLU5hbWUgICAgICAgICAgICAgICAgICBWYWx1ZSAgIENsYXNzICAgICAgICBUeXBlICAgICAgICAgU2l6ZSAgIExpbmUgIFNlY3Rpb25cblxuIikpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXggKGFyY2hpdmUsIGZpbGVuYW1lKQotICAgICBjaGFyICphcmNoaXZlOwotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKCFmaWxlbmFtZV9wZXJfc3ltYm9sKQotICAgIHByaW50ZiAoIiVzWyVzXTpcbiIsIGFyY2hpdmUsIGZpbGVuYW1lKTsKLX0KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIHRoZSBmaWxlIChhbmQgYXJjaGl2ZSwgaWYgdGhlcmUgaXMgb25lKQotICAgY29udGFpbmluZyBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkIChhcmNoaXZlX2JmZCwgYWJmZCkKLSAgICAgYmZkICphcmNoaXZlX2JmZCwgKmFiZmQ7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfc3ltYm9sKQotICAgIHsKLSAgICAgIGlmIChhcmNoaXZlX2JmZCkKLQlwcmludGYgKCIlczoiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhcmNoaXZlX2JmZCkpOwotICAgICAgcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9maWxlbmFtZV9zeXN2IChhcmNoaXZlX2JmZCwgYWJmZCkKLSAgICAgYmZkICphcmNoaXZlX2JmZCwgKmFiZmQ7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfc3ltYm9sKQotICAgIHsKLSAgICAgIGlmIChhcmNoaXZlX2JmZCkKLQlwcmludGYgKCIlczoiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhcmNoaXZlX2JmZCkpOwotICAgICAgcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9maWxlbmFtZV9wb3NpeCAoYXJjaGl2ZV9iZmQsIGFiZmQpCi0gICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOwotewotICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICB7Ci0gICAgICBpZiAoYXJjaGl2ZV9iZmQpCi0JcHJpbnRmICgiJXNbJXNdOiAiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhcmNoaXZlX2JmZCksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlczogIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgIH0KLX0KLQwKLS8qIFByaW50IGEgc3ltYm9sIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3ZhbHVlICh2YWwpCi0gICAgIGJmZF92bWEgdmFsOwotewotI2lmICEgZGVmaW5lZCAoQkZENjQpIHx8IEJGRF9IT1NUXzY0QklUX0xPTkcKLSAgcHJpbnRmICh2YWx1ZV9mb3JtYXQsIHZhbCk7Ci0jZWxzZQotICAvKiBXZSBoYXZlIGEgNjQgYml0IHZhbHVlIHRvIHByaW50LCBidXQgdGhlIGhvc3QgaXMgb25seSAzMiBiaXQuICAqLwotICBpZiAocHJpbnRfcmFkaXggPT0gMTYpCi0gICAgZnByaW50Zl92bWEgKHN0ZG91dCwgdmFsKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzMwXTsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIHMgPSBidWYgKyBzaXplb2YgYnVmOwotICAgICAgKi0tcyA9ICdcMCc7Ci0gICAgICB3aGlsZSAodmFsID4gMCkKLQl7Ci0JICAqLS1zID0gKHZhbCAlIHByaW50X3JhZGl4KSArICcwJzsKLQkgIHZhbCAvPSBwcmludF9yYWRpeDsKLQl9Ci0gICAgICB3aGlsZSAoKGJ1ZiArIHNpemVvZiBidWYgLSAxKSAtIHMgPCAxNikKLQkqLS1zID0gJzAnOwotICAgICAgcHJpbnRmICgiJXMiLCBzKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogUHJpbnQgYSBsaW5lIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX2JzZCAoaW5mbywgYWJmZCkKLSAgICAgc3ltYm9sX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9pc191bmRlZmluZWRfc3ltY2xhc3MgKGluZm8tPnR5cGUpKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiUqcyIsCi0jaWZkZWYgQkZENjQKLQkgICAgICAxNiwKLSNlbHNlCi0JICAgICAgOCwKLSNlbmRpZgotCSAgICAgICIiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcmludF92YWx1ZSAoaW5mby0+dmFsdWUpOwotICBwcmludGYgKCIgJWMiLCBpbmZvLT50eXBlKTsKLSAgaWYgKGluZm8tPnR5cGUgPT0gJy0nKQotICAgIHsKLSAgICAgIC8qIEEgc3RhYi4gICovCi0gICAgICBwcmludGYgKCIgIik7Ci0gICAgICBwcmludGYgKG90aGVyX2Zvcm1hdCwgaW5mby0+c3RhYl9vdGhlcik7Ci0gICAgICBwcmludGYgKCIgIik7Ci0gICAgICBwcmludGYgKGRlc2NfZm9ybWF0LCBpbmZvLT5zdGFiX2Rlc2MpOwotICAgICAgcHJpbnRmICgiICU1cyIsIGluZm8tPnN0YWJfbmFtZSk7Ci0gICAgfQotICBwcmludF9zeW1uYW1lICgiICVzIiwgaW5mby0+bmFtZSwgYWJmZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19zeXN2IChpbmZvLCBhYmZkKQotICAgICBzeW1ib2xfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotewotICBwcmludF9zeW1uYW1lICgiJS0yMHN8IiwgaW5mby0+bmFtZSwgYWJmZCk7CS8qIE5hbWUgKi8KLSAgaWYgKGJmZF9pc191bmRlZmluZWRfc3ltY2xhc3MgKGluZm8tPnR5cGUpKQotICAgIHByaW50ZiAoIiAgICAgICAgIik7CS8qIFZhbHVlICovCi0gIGVsc2UKLSAgICBwcmludF92YWx1ZSAoaW5mby0+dmFsdWUpOwotICBwcmludGYgKCJ8ICAgJWMgIHwiLCBpbmZvLT50eXBlKTsJLyogQ2xhc3MgKi8KLSAgaWYgKGluZm8tPnR5cGUgPT0gJy0nKQotICAgIHsKLSAgICAgIC8qIEEgc3RhYi4gICovCi0gICAgICBwcmludGYgKCIlMThzfCAgIiwgaW5mby0+c3RhYl9uYW1lKTsJLyogKEMpIFR5cGUgKi8KLSAgICAgIHByaW50ZiAoZGVzY19mb3JtYXQsIGluZm8tPnN0YWJfZGVzYyk7CS8qIFNpemUgKi8KLSAgICAgIHByaW50ZiAoInwgICAgIHwiKTsJLyogTGluZSwgU2VjdGlvbiAqLwotICAgIH0KLSAgZWxzZQotICAgIHByaW50ZiAoIiAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICB8Iik7CS8qIFR5cGUsIFNpemUsIExpbmUsIFNlY3Rpb24gKi8KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX3Bvc2l4IChpbmZvLCBhYmZkKQotICAgICBzeW1ib2xfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotewotICBwcmludF9zeW1uYW1lICgiJXMgIiwgaW5mby0+bmFtZSwgYWJmZCk7Ci0gIHByaW50ZiAoIiVjICIsIGluZm8tPnR5cGUpOwotICBpZiAoYmZkX2lzX3VuZGVmaW5lZF9zeW1jbGFzcyAoaW5mby0+dHlwZSkpCi0gICAgcHJpbnRmICgiICAgICAgICAiKTsKLSAgZWxzZQotICAgIHByaW50X3ZhbHVlIChpbmZvLT52YWx1ZSk7Ci0gIC8qIFBPU0lYLjIgd2FudHMgdGhlIHN5bWJvbCBzaXplIHByaW50ZWQgaGVyZSwgd2hlbiBhcHBsaWNhYmxlOwotICAgICBCRkQgY3VycmVudGx5IGRvZXNuJ3QgcHJvdmlkZSBpdCwgc28gd2UgdGFrZSB0aGUgZWFzeSB3YXkgb3V0IGJ5Ci0gICAgIGNvbnNpZGVyaW5nIGl0IHRvIG5ldmVyIGJlIGFwcGxpY2FibGUuICAqLwotfQotDAotc3RhdGljIHZvaWQKLXByaW50X3N5bWRlZl9lbnRyeSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzeW1pbmRleCBpZHggPSBCRkRfTk9fTU9SRV9TWU1CT0xTOwotICBjYXJzeW0gKnRoZXN5bTsKLSAgYm9vbGVhbiBldmVycHJpbnRlZCA9IGZhbHNlOwotCi0gIGZvciAoaWR4ID0gYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgaWR4LCAmdGhlc3ltKTsKLSAgICAgICBpZHggIT0gQkZEX05PX01PUkVfU1lNQk9MUzsKLSAgICAgICBpZHggPSBiZmRfZ2V0X25leHRfbWFwZW50IChhYmZkLCBpZHgsICZ0aGVzeW0pKQotICAgIHsKLSAgICAgIGJmZCAqZWx0OwotICAgICAgaWYgKCFldmVycHJpbnRlZCkKLQl7Ci0JICBwcmludGYgKF8oIlxuQXJjaGl2ZSBpbmRleDpcbiIpKTsKLQkgIGV2ZXJwcmludGVkID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHQgPSBiZmRfZ2V0X2VsdF9hdF9pbmRleCAoYWJmZCwgaWR4KTsKLSAgICAgIGlmIChlbHQgPT0gTlVMTCkKLQliZmRfZmF0YWwgKCJiZmRfZ2V0X2VsdF9hdF9pbmRleCIpOwotICAgICAgaWYgKHRoZXN5bS0+bmFtZSAhPSAoY2hhciAqKSBOVUxMKQotCXsKLQkgIHByaW50X3N5bW5hbWUgKCIlcyIsIHRoZXN5bS0+bmFtZSwgYWJmZCk7Ci0JICBwcmludGYgKCIgaW4gJXNcbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGVsdCkpOwotCX0KLSAgICB9Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSByZWxvY3MgZm9yIGEgcGFydGljdWxhciBzZWN0aW9uLgotICAgSXQgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2V0X3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhYXJnOwotewotICBzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvICpkYXRhID0gKHN0cnVjdCBnZXRfcmVsb2NzX2luZm8gKikgZGF0YWFyZzsKLQotICAqZGF0YS0+c2VjcyA9IHNlYzsKLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0gICAgewotICAgICAgKmRhdGEtPnJlbG9jcyA9IE5VTEw7Ci0gICAgICAqZGF0YS0+cmVsY291bnQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgcmVsc2l6ZTsKLQotICAgICAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gICAgICBpZiAocmVsc2l6ZSA8IDApCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgICpkYXRhLT5yZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gICAgICAqZGF0YS0+cmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsICpkYXRhLT5yZWxvY3MsCi0JCQkJCQlkYXRhLT5zeW1zKTsKLSAgICAgIGlmICgqZGF0YS0+cmVsY291bnQgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgIH0KLQotICArK2RhdGEtPnNlY3M7Ci0gICsrZGF0YS0+cmVsb2NzOwotICArK2RhdGEtPnJlbGNvdW50OwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbm90LXJhbmxpYi5jIGIvYmludXRpbHMvbm90LXJhbmxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI5Y2ViLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25vdC1yYW5saWIuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogTGlua2VkIHdpdGggYXIubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdhcicgKG5vdCAncmFubGliJykuICovCi0KLWludCBpc19yYW5saWIgPSAwOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbm90LXN0cmlwLmMgYi9iaW51dGlscy9ub3Qtc3RyaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwOTNjZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ub3Qtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogTGlua2VkIHdpdGggb2JqY29weS5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gaXMgJ29iamNvcHknIChub3QKLSAgICdzdHJpcCcpLiAqLwotCi1pbnQgaXNfc3RyaXAgPSAwOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvb2JqY29weS4xIGIvYmludXRpbHMvb2JqY29weS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ZhMjk2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL29iamNvcHkuMQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggb2JqY29weSAxICIxOTk5IiAiQ3lnbnVzIFNvbHV0aW9ucyIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1vYmpjb3B5IFwtIGNvcHkgYW5kIHRyYW5zbGF0ZSBvYmplY3QgZmlsZXMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIG9iamNvcHkKLS5SQiAiW1x8IiBcLUZcIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLUlcIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1PXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWpcIFxmSXNlY3Rpb25uYW1lXGZSXCB8XCBcZkJcLVwtb25seVwtc2VjdGlvbj1cZklzZWN0aW9ubmFtZVxmUiAiXHxdIgotLlJCICJbXHwiIFwtUlwgXGZJc2VjdGlvbm5hbWVcZlJcIHxcIFxmQlwtXC1yZW1vdmVcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWVcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVNcZlJcIHxcIFxmQlwtXC1zdHJpcFwtYWxsXGZSICJcfF0iIAotLlJCICJbXHwiIFwtZ1xmUlwgfFwgXGZCXC1cLXN0cmlwXC1kZWJ1Z1xmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtc3RyaXBcLXVubmVlZGVkXGZSICJcfF0iIAotLlJCICJbXHwiIFwtS1wgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLWtlZXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtTlwgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLUxcIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1sb2NhbGl6ZVwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1XXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtd2Vha2VuXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLXhcZlJcIHxcIFxmQlwtXC1kaXNjYXJkXC1hbGxcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1YXGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtbG9jYWxzXGZSICJcfF0iIAotLlJCICJbXHwiIFwtYlwgXGZJYnl0ZVxmUlwgfFwgXGZCXC1cLWJ5dGU9XGZJYnl0ZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWlcIFxmSWludGVybGVhdmVcZlJcIHxcIFxmQlwtXC1pbnRlcmxlYXZlPVxmSWludGVybGVhdmVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1wXGZSXCB8XCBcZkJcLVwtcHJlc2VydmVcLWRhdGVzXGZSICJcfF0iIAotLlJCICJbXHwiIFwtXC1kZWJ1Z2dpbmcgIlx8XSIKLS5SQiAiW1x8IiBcLVwtZ2FwXC1maWxsPVxmSXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1wYWRcLXRvPVxmSWFkZHJlc3NcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtc2V0XC1zdGFydD1cZkl2YWxcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC1zdGFydD1cZklpbmNyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtYWRkcmVzc2VzPVxmSWluY3JcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC1zZWN0aW9uXC1hZGRyZXNzPVxmSXNlY3Rpb257PSwrLC19dmFsXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc2VjdGlvblwtbG1hPVxmSXNlY3Rpb257PSwrLC19dmFsXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc2VjdGlvblwtdm1hPVxmSXNlY3Rpb257PSwrLC19dmFsXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtd2FybmluZ3NcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtc2V0XC1zZWN0aW9uXC1mbGFncz1cZklzZWN0aW9uPWZsYWdzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWFkZFwtc2VjdGlvbj1cZklzZWN0aW9ubmFtZT1maWxlbmFtZVxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLWxlYWRpbmdcLWNoYXJcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtcmVtb3ZlXC1sZWFkaW5nXC1jaGFyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXdlYWtlblxmUiAiXHxdIgotLlJCICJbXHwiIFwtdlwgfFwgXC1cLXZlcmJvc2VcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1WXCB8XCBcLVwtdmVyc2lvblxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtaGVscFxmUiAiXHxdIiAKLS5CIGluZmlsZQotLlJCICJbXHwiIG91dGZpbGVcZlIgIlx8XSIgCi0uU0ggREVTQ1JJUFRJT04KLVRoZSBHTlUgCi0uQiBvYmpjb3B5Ci11dGlsaXR5IGNvcGllcyB0aGUgY29udGVudHMgb2YgYW4gb2JqZWN0IGZpbGUgdG8gYW5vdGhlci4gIAotLkIgb2JqY29weSAKLXVzZXMgdGhlIEdOVSBCRkQgTGlicmFyeSB0byByZWFkIGFuZCB3cml0ZSB0aGUgb2JqZWN0IGZpbGVzLiAgSXQgY2FuCi13cml0ZSB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZpbGUgaW4gYSBmb3JtYXQgZGlmZmVyZW50IGZyb20gdGhhdCBvZgotdGhlIHNvdXJjZSBvYmplY3QgZmlsZS4gIFRoZSBleGFjdCBiZWhhdmlvciBvZiAKLS5CIG9iamNvcHkKLWlzIGNvbnRyb2xsZWQgYnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0uUFAKLS5CIG9iamNvcHkKLWNyZWF0ZXMgdGVtcG9yYXJ5IGZpbGVzIHRvIGRvIGl0cyB0cmFuc2xhdGlvbnMgYW5kIGRlbGV0ZXMgdGhlbQotYWZ0ZXJ3YXJkLgotLkIgb2JqY29weQotdXNlcyBCRkQgdG8gZG8gYWxsIGl0cyB0cmFuc2xhdGlvbiB3b3JrOyBpdCBrbm93cyBhYm91dCBhbGwgdGhlCi1mb3JtYXRzIEJGRCBrbm93cyBhYm91dCwgYW5kIHRodXMgaXMgYWJsZSB0byByZWNvZ25pemUgbW9zdCBmb3JtYXRzCi13aXRob3V0IGJlaW5nIHRvbGQgZXhwbGljaXRseS4KLS5QUAotLkIgb2JqY29weQotY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgUy1yZWNvcmRzIGJ5IHVzaW5nIGFuIG91dHB1dCB0YXJnZXQgb2YKLS5CIHNyZWMKLShlLmcuLCB1c2UKLS5CIC1PIHNyZWMpLgotLlBQCi0uQiBvYmpjb3B5Ci1jYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHJhdyBiaW5hcnkgZmlsZSBieSB1c2luZyBhbiBvdXRwdXQgdGFyZ2V0IG9mCi0uQiBiaW5hcnkKLShlLmcuLCB1c2UKLS5CIC1PIGJpbmFyeSkuCi1XaGVuCi0uQiBvYmpjb3B5Ci1nZW5lcmF0ZXMgYSByYXcgYmluYXJ5IGZpbGUsIGl0IHdpbGwgZXNzZW50aWFsbHkgcHJvZHVjZSBhIG1lbW9yeSBkdW1wCi1vZiB0aGUgY29udGVudHMgb2YgdGhlIGlucHV0IG9iamVjdCBmaWxlLiAgQWxsIHN5bWJvbHMgYW5kIHJlbG9jYXRpb24KLWluZm9ybWF0aW9uIHdpbGwgYmUgZGlzY2FyZGVkLiAgVGhlIG1lbW9yeSBkdW1wIHdpbGwgc3RhcnQgYXQgdGhlCi12aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGxvd2VzdCBzZWN0aW9uIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLS5QUAotV2hlbiBnZW5lcmF0aW5nIGFuIFMtcmVjb3JkIG9yIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCBtYXkgYmUgaGVscGZ1bCB0bwotdXNlCi0uQiAtUwotdG8gcmVtb3ZlIHNlY3Rpb25zIGNvbnRhaW5pbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSW4gc29tZSBjYXNlcwotLkIgLVIKLXdpbGwgYmUgdXNlZnVsIHRvIHJlbW92ZSBzZWN0aW9ucyB3aGljaCBjb250YWluIGluZm9ybWF0aW9uIHdoaWNoIGlzCi1ub3QgbmVlZGVkIGJ5IHRoZSBiaW5hcnkgZmlsZS4KLS5QUAotLkkgaW5maWxlCi1hbmQKLS5JIG91dGZpbGUKLWFyZSB0aGUgc291cmNlIGFuZCBvdXRwdXQgZmlsZXMgcmVzcGVjdGl2ZWx5LiAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5Ci0uSVIgb3V0ZmlsZSAsCi0uQiBvYmpjb3B5Ci1jcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgYW5kIGRlc3RydWN0aXZlbHkgcmVuYW1lcyB0aGUgcmVzdWx0IHdpdGggdGhlCi1uYW1lIG9mIHRoZSBpbnB1dCBmaWxlLgotCi0uU0ggT1BUSU9OUwotLlRQCi0uQiBcLUkgXGZJYmZkbmFtZVxmUiwgXGZCXC1cLWlucHV0XC10YXJnZXQ9XGZJYmZkbmFtZQotQ29uc2lkZXIgdGhlIHNvdXJjZSBmaWxlJ3Mgb2JqZWN0IGZvcm1hdCB0byBiZSAKLS5JUiBiZmRuYW1lICwKLXJhdGhlciB0aGFuIGF0dGVtcHRpbmcgdG8gZGVkdWNlIGl0LgotLlRQCi0uQiBcLU8gXGZJYmZkbmFtZVxmUiwgXGZCXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUKLVdyaXRlIHRoZSBvdXRwdXQgZmlsZSB1c2luZyB0aGUgb2JqZWN0IGZvcm1hdCAKLS5JUiBiZmRuYW1lIC4KLS5UUAotLkIgXC1GIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC10YXJnZXQ9XGZJYmZkbmFtZQotVXNlIAotLkkgYmZkbmFtZQotYXMgdGhlIG9iamVjdCBmb3JtYXQgZm9yIGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0IGZpbGU7IGkuZS4KLXNpbXBseSB0cmFuc2ZlciBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdpdGggbm8gdHJhbnNsYXRpb24uCi0uVFAKLS5CIFwtaiBcZklzZWN0aW9ubmFtZVxmUiwgXGZCXC1cLW9ubHlcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWUKLUNvcHkgb25seSB0aGUgbmFtZWQgc2VjdGlvbiBmcm9tIHRoZSBpbnB1dCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZSwKLWRpc2NhcmRpbmcgYWxsIG90aGVyIHNlY3Rpb25zLiAgVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbgotb25jZS4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG9wdGlvbiBpbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlIG91dHB1dAotZmlsZSB1bnVzYWJsZS4KLS5UUAotLkIgXC1SIFxmSXNlY3Rpb25uYW1lXGZSLCBcZkJcLVwtcmVtb3ZlLXNlY3Rpb249XGZJc2VjdGlvbm5hbWUKLVJlbW92ZSB0aGUgbmFtZWQgc2VjdGlvbiBmcm9tIHRoZSBmaWxlLiAgVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUKLXRoYW4gb25jZS4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG9wdGlvbiBpbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlCi1vdXRwdXQgZmlsZSB1bnVzYWJsZS4KLS5UUAotLkIgXC1TXGZSLCBcZkJcLVwtc3RyaXBcLWFsbAotRG8gbm90IGNvcHkgcmVsb2NhdGlvbiBhbmQgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gdGhlIHNvdXJjZSBmaWxlLgotLlRQCi0uQiBcLWdcZlIsIFxmQlwtXC1zdHJpcFwtZGVidWcKLURvIG5vdCBjb3B5IGRlYnVnZ2luZyBzeW1ib2xzIGZyb20gdGhlIHNvdXJjZSBmaWxlLgotLlRQCi0uQiBcLVwtc3RyaXBcLXVubmVlZGVkCi1TdHJpcCBhbGwgc3ltYm9scyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciByZWxvY2F0aW9uIHByb2Nlc3NpbmcuCi0uVFAKLS5CIFwtSyBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLUNvcHkgb25seSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLS5UUAotLkIgXC1OIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLURvIG5vdCBjb3B5IHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotLlRQCi0uQiBcLUwgXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLWxvY2FsaXplXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotTWFrZSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBsb2NhbCB0byB0aGUgZmlsZSwgc28gdGhhdCBpdCBpcyBub3QKLXZpc2libGUgZXh0ZXJuYWxseS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLS5UUAotLkIgXC1XIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC13ZWFrZW5cLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1NYWtlIHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIHdlYWsuIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLS5UUAotLkIgXC14XGZSLCBcZkIgXC1cLWRpc2NhcmRcLWFsbAotRG8gbm90IGNvcHkgbm9uLWdsb2JhbCBzeW1ib2xzIGZyb20gdGhlIHNvdXJjZSBmaWxlLgotLlRQCi0uQiBcLVhcZlIsIFxmQlwtXC1kaXNjYXJkXC1sb2NhbHMKLURvIG5vdCBjb3B5IGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBzeW1ib2xzLiAoVGhlc2UgdXN1YWxseSBzdGFydAotd2l0aCAiTCIgb3IgIi4iKS4KLS5UUAotLkIgXC1iIFxmSWJ5dGVcZlIsIFxmQlwtXC1ieXRlPVxmSWJ5dGUKLUtlZXAgb25seSBldmVyeSBcZklieXRlXGZQdGggYnl0ZSBvZiB0aGUgaW5wdXQgZmlsZSAoaGVhZGVyIGRhdGEgaXMKLW5vdCBhZmZlY3RlZCkuICBcZklieXRlXGZQIGNhbiBiZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIHRoZQotaW50ZXJsZWF2ZS0xLiAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIGZvciBjcmVhdGluZyBmaWxlcyB0byBwcm9ncmFtCi1ST01zLiAgSXQgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCBhbiBzcmVjIG91dHB1dCB0YXJnZXQuCi0uVFAKLS5CIFwtaSBcZklpbnRlcmxlYXZlXGZSLCBcZkJcLVwtaW50ZXJsZWF2ZT1cZklpbnRlcmxlYXZlCi1Pbmx5IGNvcHkgb25lIG91dCBvZiBldmVyeSBcZklpbnRlcmxlYXZlXGZQIGJ5dGVzLiAgV2hpY2ggb25lIHRvIGNvcHkgaXMKLXNlbGVjdGVkIGJ5IHRoZSBcZkJcLWJcZlAgb3IgXGZCXC1cLWJ5dGVcZlAgb3B0aW9uLiAgVGhlIGRlZmF1bHQgaXMgNC4KLVRoZSBpbnRlcmxlYXZlIGlzIGlnbm9yZWQgaWYgbmVpdGhlciBcZkJcLWJcZlAgbm9yIFxmQlwtXC1ieXRlXGZQIGlzIGdpdmVuLgotLlRQCi0uQiBcLXBcZlIsIFxmQlwtXC1wcmVzZXJ2ZVwtZGF0ZXMKLVNldCB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIG91dHB1dCBmaWxlIHRvIGJlIHRoZSBzYW1lCi1hcyB0aG9zZSBvZiB0aGUgaW5wdXQgZmlsZS4KLS5UUAotLkIgXC1cLWRlYnVnZ2luZwotQ29udmVydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIHBvc3NpYmxlLiAgVGhpcyBpcyBub3QgdGhlIGRlZmF1bHQKLWJlY2F1c2Ugb25seSBjZXJ0YWluIGRlYnVnZ2luZyBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQsIGFuZCB0aGUKLWNvbnZlcnNpb24gcHJvY2VzcyBjYW4gYmUgdGltZSBjb25zdW1pbmcuCi0uVFAKLS5CIFwtXC1nYXBcLWZpbGw9XGZJdmFsCi1GaWxsIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyB3aXRoIFxmSXZhbFxmUC4gIFRoaXMgb3BlcmF0aW9uIGFwcGxpZXMgdG8KLXRoZSBcZklsb2FkIGFkZHJlc3NcZlAgKExNQSkgb2YgdGhlIHNlY3Rpb25zLiAgSXQgaXMgZG9uZSBieSBpbmNyZWFzaW5nCi10aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aXRoIHRoZSBsb3dlciBhZGRyZXNzLCBhbmQgZmlsbGluZyBpbiB0aGUgZXh0cmEKLXNwYWNlIGNyZWF0ZWQgd2l0aCBcZkl2YWxcZlAuCi0uVFAKLS5CIFwtXC1wYWRcLXRvPVxmSWFkZHJlc3MKLVBhZCB0aGUgb3V0cHV0IGZpbGUgdXAgdG8gdGhlIGxvYWQgYWRkcmVzcyBcZklhZGRyZXNzXGZQLiAgVGhpcyBpcwotZG9uZSBieSBpbmNyZWFzaW5nIHRoZSBzaXplIG9mIHRoZSBsYXN0IHNlY3Rpb24uICBUaGUgZXh0cmEgc3BhY2UgaXMKLWZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgXGZCXC1cLWdhcFwtZmlsbFxmUCAoZGVmYXVsdAotemVybykuCi0uVFAKLS5CIFxmQlwtXC1zZXRcLXN0YXJ0PVxmSXZhbAotU2V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXcgZmlsZSB0byBcZkl2YWxcZlAuICBOb3QgYWxsIG9iamVjdAotZmlsZSBmb3JtYXRzIHN1cHBvcnQgc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcy4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtc3RhcnQ9XGZJaW5jclxmUiwgXGZCXC1cLWFkanVzdFwtc3RhcnQ9XGZJaW5jcgotQ2hhbmdlcyB0aGUgc3RhcnQgYWRkcmVzcyBieSBhZGRpbmcgXGZJaW5jclxmUC4gIE5vdCBhbGwgb2JqZWN0IGZpbGUKLWZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC1hZGRyZXNzZXM9XGZJaW5jclxmUiwgXGZCXC1cLWFkanVzdFwtdm1hPVxmSWluY3IKLUNoYW5nZXMgdGhlIGFkZHJlc3Mgb2YgYWxsIHNlY3Rpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdGFydCBhZGRyZXNzLCBieQotYWRkaW5nIFxmSWluY3JcZlAuICBTb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgZG8gbm90IHBlcm1pdCBzZWN0aW9uCi1hZGRyZXNzZXMgdG8gYmUgY2hhbmdlZCBhcmJpdHJhcmlseS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHJlbG9jYXRlCi10aGUgc2VjdGlvbnM7IGlmIHRoZSBwcm9ncmFtIGV4cGVjdHMgc2VjdGlvbnMgdG8gYmUgbG9hZGVkIGF0IGEKLWNlcnRhaW4gYWRkcmVzcywgYW5kIHRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBzZWN0aW9ucyBzdWNoCi10aGF0IHRoZXkgYXJlIGxvYWRlZCBhdCBhIGRpZmZlcmVudCBhZGRyZXNzLCB0aGUgcHJvZ3JhbSBtYXkgZmFpbC4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtYWRkcmVzcz1cZklzZWN0aW9uez0sKywtfXZhbFxmUiwgXGZCXC1cLWFkanVzdFwtc2VjdGlvblwtdm1hPVxmSXNlY3Rpb257PSwrLC19dmFsCi1TZXQgb3IgY2hhbmdlcyB0aGUgVk1BIGFuZCBMTUEgYWRkcmVzc2VzIG9mIHRoZSBuYW1lZCBcZklzZWN0aW9uXGZQLgotSWYgXGZJPVxmUCBpcyB1c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzIGlzIHNldCB0byBcZkl2YWxcZlAuCi1PdGhlcndpc2UsIFxmSXZhbFxmUCBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIHNlY3Rpb24KLWFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlc1xmUCwgYWJvdmUuICBJZgotXGZJc2VjdGlvblxmUCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUKLWlzc3VlZCwgdW5sZXNzIFxmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUCBpcyB1c2VkLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC1sbWE9XGZJc2VjdGlvbns9LCssLX12YWwKLVNldCBvciBjaGFuZ2UgdGhlIExNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZCBcZklzZWN0aW9uXGZQLiAgSWYgXGZJPVxmUCBpcwotdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8gXGZJdmFsXGZQLiAgT3RoZXJ3aXNlLCBcZkl2YWxcZlAKLWlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUgc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cwotdW5kZXIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzXGZQLCBhYm92ZS4gIElmIFxmSXNlY3Rpb25cZlAgZG9lcyBub3QgZXhpc3QKLWluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQsIHVubGVzcwotXGZCXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZQIGlzIHVzZWQuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLXZtYT1cZklzZWN0aW9uez0sKywtfXZhbAotU2V0IG9yIGNoYW5nZSB0aGUgVk1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkIFxmSXNlY3Rpb25cZlAuICBJZiBcZkk9XGZQIGlzCi11c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzIGlzIHNldCB0byBcZkl2YWxcZlAuICBPdGhlcndpc2UsIFxmSXZhbFxmUAotaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBzZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzCi11bmRlciBcZkJcLVwtY2hhbmdlXC1hZGRyZXNzZXNcZlAsIGFib3ZlLiAgSWYgXGZJc2VjdGlvblxmUCBkb2VzIG5vdCBleGlzdAotaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCwgdW5sZXNzCi1cZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlAgaXMgdXNlZC4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtd2FybmluZ3NcZlIsIFxmQlwtXC1hZGp1c3RcLXdhcm5pbmdzCi1JZiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC1YWFhcZlAgaXMgdXNlZCwgYW5kIHRoZSBuYW1lZCBzZWN0aW9uIGRvZXMKLW5vdCBleGlzdCwgaXNzdWUgYSB3YXJuaW5nLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLS5UUAotLkIgXGZCXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZSLCBcZkJcLVwtbm9cLWFkanVzdFwtd2FybmluZ3MKLURvIG5vdCBpc3N1ZSBhIHdhcm5pbmcgaWYgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtWFhYXGZQIGlzIHVzZWQsIGV2ZW4KLWlmIHRoZSBuYW1lZCBzZWN0aW9uIGRvZXMgbm90IGV4aXN0LgotLlRQCi0uQiBcZkJcLVwtc2V0XC1zZWN0aW9uXC1mbGFncz1cZklzZWN0aW9uPWZsYWdzCi1TZXQgdGhlIGZsYWdzIGZvciB0aGUgbmFtZWQgc2VjdGlvbi4gIFRoZSBcZklmbGFnc1xmUCBhcmd1bWVudCBpcyBhCi1jb21tYSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGZsYWcgbmFtZXMuICBUaGUgcmVjb2duaXplZCBuYW1lcyBhcmUKLVxmSWFsbG9jXGZQLCBcZkljb250ZW50c1xmUCwgXGZJbG9hZFxmUCwgXGZJbm9sb2FkXGZQLCBcZklyZWFkb25seVxmUCwKLVxmSWNvZGVcZlAsIFxmSWRhdGFcZlAsIFxmSXJvbVxmUCwgXGZJc2hhcmVcZlAsIGFuZCBcZklkZWJ1Z1xmUC4gIE5vdAotYWxsIGZsYWdzIGFyZSBtZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLS5UUAotLkIgXGZCXC1cLWFkZFwtc2VjdGlvbj1cZklzZWN0aW9ubmFtZT1maWxlbmFtZQotQWRkIGEgbmV3IHNlY3Rpb24gbmFtZWQgXGZJc2VjdGlvbm5hbWVcZlIgd2hpbGUgY29weWluZyB0aGUgZmlsZS4gIFRoZQotY29udGVudHMgb2YgdGhlIG5ldyBzZWN0aW9uIGFyZSB0YWtlbiBmcm9tIHRoZSBmaWxlIFxmSWZpbGVuYW1lXGZSLgotVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uCi1vbmx5IHdvcmtzIG9uIGZpbGUgZm9ybWF0cyB3aGljaCBjYW4gc3VwcG9ydCBzZWN0aW9ucyB3aXRoIGFyYml0cmFyeQotbmFtZXMuCi0uVFAKLS5CIFwtXC1jaGFuZ2VcLWxlYWRpbmdcLWNoYXIKLVNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZgotc3ltYm9scy4gIFRoZSBtb3N0IGNvbW1vbiBzdWNoIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLCB3aGljaCBjb21waWxlcnMKLW9mdGVuIGFkZCBiZWZvcmUgZXZlcnkgc3ltYm9sLiAgVGhpcyBvcHRpb24gdGVsbHMgCi0uQiBvYmpjb3B5Ci10byBjaGFuZ2UgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIG9mIGV2ZXJ5IHN5bWJvbCB3aGVuIGl0IGNvbnZlcnRzCi1iZXR3ZWVuIG9iamVjdCBmaWxlIGZvcm1hdHMuICBJZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2UgdGhlIHNhbWUKLWxlYWRpbmcgY2hhcmFjdGVyLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGFkZAotYSBjaGFyYWN0ZXIsIG9yIHJlbW92ZSBhIGNoYXJhY3Rlciwgb3IgY2hhbmdlIGEgY2hhcmFjdGVyLCBhcwotYXBwcm9wcmlhdGUuCi0uVFAKLS5CIFwtXC1yZW1vdmVcLWxlYWRpbmdcLWNoYXIKLUlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBnbG9iYWwgc3ltYm9sIGlzIGEgc3BlY2lhbCBzeW1ib2wgbGVhZGluZwotY2hhcmFjdGVyIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgcmVtb3ZlIHRoZSBjaGFyYWN0ZXIuICBUaGUKLW1vc3QgY29tbW9uIHN5bWJvbCBsZWFkaW5nIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLiAgVGhpcyBvcHRpb24gd2lsbAotcmVtb3ZlIGEgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gYWxsIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBjYW4gYmUKLXVzZWZ1bCBpZiB5b3Ugd2FudCB0byBsaW5rIHRvZ2V0aGVyIG9iamVjdHMgb2YgZGlmZmVyZW50IGZpbGUgZm9ybWF0cwotd2l0aCBkaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIHN5bWJvbCBuYW1lcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20KLVxmQlwtXC1jaGFuZ2VcLWxlYWRpbmdcLWNoYXJcZlAgYmVjYXVzZSBpdCBhbHdheXMgY2hhbmdlcyB0aGUgc3ltYm9sIG5hbWUKLXdoZW4gYXBwcm9wcmlhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0Ci0uVFAKLS5CIFwtXC13ZWFrZW4KLUNoYW5nZSBhbGwgZ2xvYmFsIHN5bWJvbHMgaW4gdGhlIGZpbGUgdG8gYmUgd2Vhay4KLS5UUAotLkIgXC12XGZSLCBcZkJcLVwtdmVyYm9zZQotVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCi1hcmNoaXZlcywgIlxmQm9iamNvcHkgXC1WXGZSIiBsaXN0cyBhbGwgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZS4KLS5UUAotLkIgXC1WXGZSLCBcZkJcLVwtdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YKLS5CIG9iamNvcHkKLWFuZCBleGl0LgotLlRQCi0uQiBcLVwtaGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIG9iamNvcHkKLWFuZCBleGl0LgotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChKdW5lIDE5OTMpLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamNvcHkuYyBiL2JpbnV0aWxzL29iamNvcHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMTJlNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpjb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEwICswLDAgQEAKLS8qIG9iamNvcHkuYyAtLSBjb3B5IG9iamVjdCBmaWxlIGZyb20gaW5wdXQgdG8gb3V0cHV0LCBvcHRpb25hbGx5IG1hc3NhZ2luZyBpdC4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInByb2dyZXNzLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0vKiBBIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBsaWNpdGx5IHN0cmlwIG91dCwgb3IgdG8ga2VlcC4gIEEgbGlua2VkCi0gICBsaXN0IGlzIGdvb2QgZW5vdWdoIGZvciBhIHNtYWxsIG51bWJlciBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGJ1dAotICAgdGhpcyB3aWxsIHNsb3cgdGhpbmdzIGRvd24gYSBsb3QgaWYgbWFueSBzeW1ib2xzIGFyZSBiZWluZwotICAgZGVsZXRlZC4gKi8KLQotc3RydWN0IHN5bWxpc3QKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3RydWN0IHN5bWxpc3QgKm5leHQ7Ci19OwotCi1zdGF0aWMgdm9pZCBjb3B5X3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBzdHJpcF91c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIGZsYWd3b3JkIHBhcnNlX2ZsYWdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2xpc3QgKmZpbmRfc2VjdGlvbl9saXN0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgc2V0dXBfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb3B5X3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgZ2V0X3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9zZWN0aW9uX2xtYSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgYWRkX3NwZWNpZmljX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBzeW1saXN0ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpc19zcGVjaWZpZWRfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN5bWxpc3QgKikpOwotc3RhdGljIGJvb2xlYW4gaXNfc3RyaXBfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBmaWx0ZXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgYmZkICosIGFzeW1ib2wgKiosIGFzeW1ib2wgKiosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGZpbHRlcl9ieXRlcyBQQVJBTVMgKChjaGFyICosIGJmZF9zaXplX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gd3JpdGVfZGVidWdnaW5nX2luZm8gUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZyAqLCBhc3ltYm9sICoqKikpOwotc3RhdGljIHZvaWQgY29weV9vYmplY3QgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBjb3B5X2FyY2hpdmUgUEFSQU1TICgoYmZkICosIGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGNvcHlfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgc3RyaXBfbWFpbiBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgY29weV9tYWluIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi0jZGVmaW5lIFJFVFVSTl9OT05GQVRBTChzKSB7YmZkX25vbmZhdGFsIChzKTsgc3RhdHVzID0gMTsgcmV0dXJuO30KLQotc3RhdGljIGFzeW1ib2wgKippc3ltcHAgPSBOVUxMOwkvKiBJbnB1dCBzeW1ib2xzICovCi1zdGF0aWMgYXN5bWJvbCAqKm9zeW1wcCA9IE5VTEw7CS8qIE91dHB1dCBzeW1ib2xzIHRoYXQgc3Vydml2ZSBzdHJpcHBpbmcgKi8KLQotLyogSWYgYGNvcHlfYnl0ZScgPj0gMCwgY29weSBvbmx5IHRoYXQgYnl0ZSBvZiBldmVyeSBgaW50ZXJsZWF2ZScgYnl0ZXMuICAqLwotc3RhdGljIGludCBjb3B5X2J5dGUgPSAtMTsKLXN0YXRpYyBpbnQgaW50ZXJsZWF2ZSA9IDQ7Ci0KLXN0YXRpYyBib29sZWFuIHZlcmJvc2U7CQkvKiBQcmludCBmaWxlIGFuZCB0YXJnZXQgbmFtZXMuICovCi1zdGF0aWMgYm9vbGVhbiBwcmVzZXJ2ZV9kYXRlczsJLyogUHJlc2VydmUgaW5wdXQgZmlsZSB0aW1lc3RhbXAuICAqLwotc3RhdGljIGludCBzdGF0dXMgPSAwOwkJLyogRXhpdCBzdGF0dXMuICAqLwotCi1lbnVtIHN0cmlwX2FjdGlvbgotICB7Ci0gICAgU1RSSVBfVU5ERUYsCi0gICAgU1RSSVBfTk9ORSwJCQkvKiBkb24ndCBzdHJpcCAqLwotICAgIFNUUklQX0RFQlVHLAkJLyogc3RyaXAgYWxsIGRlYnVnZ2VyIHN5bWJvbHMgKi8KLSAgICBTVFJJUF9VTk5FRURFRCwJCS8qIHN0cmlwIHVubmVjZXNzYXJ5IHN5bWJvbHMgKi8KLSAgICBTVFJJUF9BTEwJCQkvKiBzdHJpcCBhbGwgc3ltYm9scyAqLwotICB9OwotCi0vKiBXaGljaCBzeW1ib2xzIHRvIHJlbW92ZS4gKi8KLXN0YXRpYyBlbnVtIHN0cmlwX2FjdGlvbiBzdHJpcF9zeW1ib2xzOwotCi1lbnVtIGxvY2Fsc19hY3Rpb24KLSAgewotICAgIExPQ0FMU19VTkRFRiwKLSAgICBMT0NBTFNfU1RBUlRfTCwJCS8qIGRpc2NhcmQgbG9jYWxzIHN0YXJ0aW5nIHdpdGggTCAqLwotICAgIExPQ0FMU19BTEwJCQkvKiBkaXNjYXJkIGFsbCBsb2NhbHMgKi8KLSAgfTsKLQotLyogV2hpY2ggbG9jYWwgc3ltYm9scyB0byByZW1vdmUuICBPdmVycmlkZXMgU1RSSVBfQUxMLiAgKi8KLXN0YXRpYyBlbnVtIGxvY2Fsc19hY3Rpb24gZGlzY2FyZF9sb2NhbHM7Ci0KLS8qIFdoYXQga2luZCBvZiBjaGFuZ2UgdG8gcGVyZm9ybS4gICovCi1lbnVtIGNoYW5nZV9hY3Rpb24KLXsKLSAgQ0hBTkdFX0lHTk9SRSwKLSAgQ0hBTkdFX01PRElGWSwKLSAgQ0hBTkdFX1NFVAotfTsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBsaXN0cyBvZiBzZWN0aW9ucyBhbmQgYWN0aW9ucyB0byB0YWtlLiAgKi8KLXN0cnVjdCBzZWN0aW9uX2xpc3QKLXsKLSAgc3RydWN0IHNlY3Rpb25fbGlzdCAqIG5leHQ7ICAgICAgLyogTmV4dCBzZWN0aW9uIHRvIGNoYW5nZS4gICovCi0gIGNvbnN0IGNoYXIgKiAgICAgICAgICBuYW1lOyAgICAgIC8qIFNlY3Rpb24gbmFtZS4gICovCi0gIGJvb2xlYW4gICAgICAgICAgICAgICB1c2VkOyAgICAgIC8qIFdoZXRoZXIgdGhpcyBlbnRyeSB3YXMgdXNlZC4gICovCi0gIGJvb2xlYW4gICAgICAgICAgICAgICByZW1vdmU7ICAgIC8qIFdoZXRoZXIgdG8gcmVtb3ZlIHRoaXMgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4JCWNvcHk7ICAgICAgLyogV2hldGhlciB0byBjb3B5IHRoaXMgc2VjdGlvbi4gICovCi0gIGVudW0gY2hhbmdlX2FjdGlvbiAgICBjaGFuZ2Vfdm1hOy8qIFdoZXRoZXIgdG8gY2hhbmdlIG9yIHNldCBWTUEuICAqLwotICBiZmRfdm1hIAkJdm1hX3ZhbDsgICAvKiBBbW91bnQgdG8gY2hhbmdlIGJ5IG9yIHNldCB0by4gICovCi0gIGVudW0gY2hhbmdlX2FjdGlvbiAgICBjaGFuZ2VfbG1hOy8qIFdoZXRoZXIgdG8gY2hhbmdlIG9yIHNldCBMTUEuICAqLwotICBiZmRfdm1hIAkJbG1hX3ZhbDsgICAvKiBBbW91bnQgdG8gY2hhbmdlIGJ5IG9yIHNldCB0by4gICovCi0gIGJvb2xlYW4gCQlzZXRfZmxhZ3M7IC8qIFdoZXRoZXIgdG8gc2V0IHRoZSBzZWN0aW9uIGZsYWdzLiAgKi8KLSAgZmxhZ3dvcmQgCQlmbGFnczsgICAgIC8qIFdoYXQgdG8gc2V0IHRoZSBzZWN0aW9uIGZsYWdzIHRvLiAgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpjaGFuZ2Vfc2VjdGlvbnM7Ci1zdGF0aWMgYm9vbGVhbiBzZWN0aW9uc19yZW1vdmVkOwotc3RhdGljIGJvb2xlYW4gc2VjdGlvbnNfY29waWVkOwotCi0vKiBDaGFuZ2VzIHRvIHRoZSBzdGFydCBhZGRyZXNzLiAgKi8KLXN0YXRpYyBiZmRfdm1hIGNoYW5nZV9zdGFydCA9IDA7Ci1zdGF0aWMgYm9vbGVhbiBzZXRfc3RhcnRfc2V0ID0gZmFsc2U7Ci1zdGF0aWMgYmZkX3ZtYSBzZXRfc3RhcnQ7Ci0KLS8qIENoYW5nZXMgdG8gc2VjdGlvbiBhZGRyZXNzZXMuICAqLwotc3RhdGljIGJmZF92bWEgY2hhbmdlX3NlY3Rpb25fYWRkcmVzcyA9IDA7Ci0KLS8qIEZpbGxpbmcgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zLiAgKi8KLXN0YXRpYyBib29sZWFuIGdhcF9maWxsX3NldCA9IGZhbHNlOwotc3RhdGljIGJmZF9ieXRlIGdhcF9maWxsID0gMDsKLQotLyogUGFkIHRvIGEgZ2l2ZW4gYWRkcmVzcy4gICovCi1zdGF0aWMgYm9vbGVhbiBwYWRfdG9fc2V0ID0gZmFsc2U7Ci1zdGF0aWMgYmZkX3ZtYSBwYWRfdG87Ci0KLS8qIExpc3Qgb2Ygc2VjdGlvbnMgdG8gYWRkLiAgKi8KLQotc3RydWN0IHNlY3Rpb25fYWRkCi17Ci0gIC8qIE5leHQgc2VjdGlvbiB0byBhZGQuICAqLwotICBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKm5leHQ7Ci0gIC8qIE5hbWUgb2Ygc2VjdGlvbiB0byBhZGQuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBOYW1lIG9mIGZpbGUgaG9sZGluZyBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIC8qIFNpemUgb2YgZmlsZS4gICovCi0gIHNpemVfdCBzaXplOwotICAvKiBDb250ZW50cyBvZiBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBCRkQgc2VjdGlvbiwgYWZ0ZXIgaXQgaGFzIGJlZW4gYWRkZWQuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKmFkZF9zZWN0aW9uczsKLQotLyogV2hldGhlciB0byBjb252ZXJ0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvbnZlcnRfZGVidWdnaW5nID0gZmFsc2U7Ci0KLS8qIFdoZXRoZXIgdG8gY2hhbmdlIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpbiBzeW1ib2wgbmFtZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjaGFuZ2VfbGVhZGluZ19jaGFyID0gZmFsc2U7Ci0KLS8qIFdoZXRoZXIgdG8gcmVtb3ZlIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBmcm9tIGdsb2JhbCBzeW1ib2wgbmFtZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiByZW1vdmVfbGVhZGluZ19jaGFyID0gZmFsc2U7Ci0KLS8qIExpc3Qgb2Ygc3ltYm9scyB0byBzdHJpcCwga2VlcCwgbG9jYWxpemUsIGFuZCB3ZWFrZW4uICAqLwotCi1zdGF0aWMgc3RydWN0IHN5bWxpc3QgKnN0cmlwX3NwZWNpZmljX2xpc3QgPSBOVUxMOwotc3RhdGljIHN0cnVjdCBzeW1saXN0ICprZWVwX3NwZWNpZmljX2xpc3QgPSBOVUxMOwotc3RhdGljIHN0cnVjdCBzeW1saXN0ICpsb2NhbGl6ZV9zcGVjaWZpY19saXN0ID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3Qgc3ltbGlzdCAqd2Vha2VuX3NwZWNpZmljX2xpc3QgPSBOVUxMOwotCi0vKiBJZiB0aGlzIGlzIHRydWUsIHdlIHdlYWtlbiBnbG9iYWwgc3ltYm9scyAoc2V0IEJTRl9XRUFLKS4gICovCi0KLXN0YXRpYyBib29sZWFuIHdlYWtlbiA9IGZhbHNlOwotCi0vKiAxNTAgaXNuJ3Qgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0FERF9TRUNUSU9OIDE1MAotI2RlZmluZSBPUFRJT05fQ0hBTkdFX0FERFJFU1NFUyAoT1BUSU9OX0FERF9TRUNUSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVIgKE9QVElPTl9DSEFOR0VfQUREUkVTU0VTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9TVEFSVCAoT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVIgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUyAoT1BUSU9OX0NIQU5HRV9TVEFSVCArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUEgKE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQSAoT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQSArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfV0FSTklOR1MgKE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUEgKyAxKQotI2RlZmluZSBPUFRJT05fREVCVUdHSU5HIChPUFRJT05fQ0hBTkdFX1dBUk5JTkdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0dBUF9GSUxMIChPUFRJT05fREVCVUdHSU5HICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HUyAoT1BUSU9OX0dBUF9GSUxMICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BBRF9UTyAoT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HUyArIDEpCi0jZGVmaW5lIE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSIChPUFRJT05fUEFEX1RPICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTIChPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUiArIDEpCi0jZGVmaW5lIE9QVElPTl9TRVRfU1RBUlQgKE9QVElPTl9TRVRfU0VDVElPTl9GTEFHUyArIDEpCi0jZGVmaW5lIE9QVElPTl9TVFJJUF9VTk5FRURFRCAoT1BUSU9OX1NFVF9TVEFSVCArIDEpCi0jZGVmaW5lIE9QVElPTl9XRUFLRU4gKE9QVElPTl9TVFJJUF9VTk5FRURFRCArIDEpCi0KLS8qIE9wdGlvbnMgdG8gaGFuZGxlIGlmIHJ1bm5pbmcgYXMgInN0cmlwIi4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIHN0cmlwX29wdGlvbnNbXSA9Ci17Ci0gIHsiZGlzY2FyZC1hbGwiLCBub19hcmd1bWVudCwgMCwgJ3gnfSwKLSAgeyJkaXNjYXJkLWxvY2FscyIsIG5vX2FyZ3VtZW50LCAwLCAnWCd9LAotICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LCAvKiBPYnNvbGV0ZSAqLwotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwgLyogT2Jzb2xldGUgKi8KLSAgeyJpbnB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJrZWVwLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSyd9LAotICB7Im91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwJLyogT2Jzb2xldGUgKi8KLSAgeyJvdXRwdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCi0gIHsicHJlc2VydmUtZGF0ZXMiLCBub19hcmd1bWVudCwgMCwgJ3AnfSwKLSAgeyJyZW1vdmUtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUid9LAotICB7InN0cmlwLWFsbCIsIG5vX2FyZ3VtZW50LCAwLCAncyd9LAotICB7InN0cmlwLWRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdTJ30sCi0gIHsic3RyaXAtdW5uZWVkZWQiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1NUUklQX1VOTkVFREVEfSwKLSAgeyJzdHJpcC1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ04nfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwKLSAgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIDAsICd2J30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0vKiBPcHRpb25zIHRvIGhhbmRsZSBpZiBydW5uaW5nIGFzICJvYmpjb3B5Ii4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGNvcHlfb3B0aW9uc1tdID0KLXsKLSAgeyJhZGQtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQUREX1NFQ1RJT059LAotICB7ImFkanVzdC1zdGFydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NUQVJUfSwKLSAgeyJhZGp1c3Qtdm1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTfSwKLSAgeyJhZGp1c3Qtc2VjdGlvbi12bWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1N9LAotICB7ImFkanVzdC13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTfSwKLSAgeyJieXRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdiJ30sCi0gIHsiY2hhbmdlLWFkZHJlc3NlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX0FERFJFU1NFU30sCi0gIHsiY2hhbmdlLWxlYWRpbmctY2hhciIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUn0sCi0gIHsiY2hhbmdlLXNlY3Rpb24tYWRkcmVzcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTU30sCi0gIHsiY2hhbmdlLXNlY3Rpb24tbG1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUF9LAotICB7ImNoYW5nZS1zZWN0aW9uLXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BfSwKLSAgeyJjaGFuZ2Utc3RhcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TVEFSVH0sCi0gIHsiY2hhbmdlLXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfV0FSTklOR1N9LAotICB7ImRlYnVnZ2luZyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fREVCVUdHSU5HfSwKLSAgeyJkaXNjYXJkLWFsbCIsIG5vX2FyZ3VtZW50LCAwLCAneCd9LAotICB7ImRpc2NhcmQtbG9jYWxzIiwgbm9fYXJndW1lbnQsIDAsICdYJ30sCi0gIHsib25seS1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdqJ30sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sIC8qIE9ic29sZXRlICovCi0gIHsiZ2FwLWZpbGwiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0dBUF9GSUxMfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsiaW5wdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sIC8qIE9ic29sZXRlICovCi0gIHsiaW5wdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCi0gIHsiaW50ZXJsZWF2ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnaSd9LAotICB7ImtlZXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdLJ30sCi0gIHsibm8tYWRqdXN0LXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1N9LAotICB7Im5vLWNoYW5nZS13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTfSwKLSAgeyJvdXRwdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCS8qIE9ic29sZXRlICovCi0gIHsib3V0cHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAotICB7InBhZC10byIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fUEFEX1RPfSwKLSAgeyJwcmVzZXJ2ZS1kYXRlcyIsIG5vX2FyZ3VtZW50LCAwLCAncCd9LAotICB7ImxvY2FsaXplLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTCd9LAotICB7InJlbW92ZS1sZWFkaW5nLWNoYXIiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVJ9LAotICB7InJlbW92ZS1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdSJ30sCi0gIHsic2V0LXNlY3Rpb24tZmxhZ3MiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTfSwKLSAgeyJzZXQtc3RhcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX1NFVF9TVEFSVH0sCi0gIHsic3RyaXAtYWxsIiwgbm9fYXJndW1lbnQsIDAsICdTJ30sCi0gIHsic3RyaXAtZGVidWciLCBub19hcmd1bWVudCwgMCwgJ2cnfSwKLSAgeyJzdHJpcC11bm5lZWRlZCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fU1RSSVBfVU5ORUVERUR9LAotICB7InN0cmlwLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTid9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJ30sCi0gIHsid2Vha2VuIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9XRUFLRU59LAotICB7IndlYWtlbi1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1cnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotLyogSU1QT1JUUyAqLwotZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogVGhpcyBmbGFnIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBzdHJpcCBhbmQgb2JqY29weToKLSAgIDEgbWVhbnMgdGhpcyBpcyAnc3RyaXAnOyAwIG1lYW5zIHRoaXMgaXMgJ29iamNvcHknLgotICAgLTEgbWVhbnMgaWYgd2Ugc2hvdWxkIHVzZSBhcmd2WzBdIHRvIGRlY2lkZS4gKi8KLWV4dGVybiBpbnQgaXNfc3RyaXA7Ci0KLQotc3RhdGljIHZvaWQKLWNvcHlfdXNhZ2UgKHN0cmVhbSwgZXhpdF9zdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IGV4aXRfc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlVzYWdlOiAlcyA8c3dpdGNoZXM+IGluLWZpbGUgW291dC1maWxlXVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiIFRoZSBzd2l0Y2hlcyBhcmU6XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtSSAtLWlucHV0LXRhcmdldCA8YmZkbmFtZT4gICAgICBBc3N1bWUgaW5wdXQgZmlsZSBpcyBpbiBmb3JtYXQgPGJmZG5hbWU+XG5cCi0gIC1PIC0tb3V0cHV0LXRhcmdldCA8YmZkbmFtZT4gICAgIENyZWF0ZSBhbiBvdXRwdXQgZmlsZSBpbiBmb3JtYXQgPGJmZG5hbWU+XG5cCi0gIC1GIC0tdGFyZ2V0IDxiZmRuYW1lPiAgICAgICAgICAgIFNldCBib3RoIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0IHRvIDxiZmRuYW1lPlxuXAotICAgICAtLWRlYnVnZ2luZyAgICAgICAgICAgICAgICAgICBDb252ZXJ0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaWYgcG9zc2libGVcblwKLSAgLXAgLS1wcmVzZXJ2ZS1kYXRlcyAgICAgICAgICAgICAgQ29weSBtb2RpZmllZC9hY2Nlc3MgdGltZXN0YW1wcyB0byB0aGUgb3V0cHV0XG5cCi0gIC1qIC0tb25seS1zZWN0aW9uIDxuYW1lPiAgICAgICAgIE9ubHkgY29weSBzZWN0aW9uIDxuYW1lPiBpbnRvIHRoZSBvdXRwdXRcblwKLSAgLVIgLS1yZW1vdmUtc2VjdGlvbiA8bmFtZT4gICAgICAgUmVtb3ZlIHNlY3Rpb24gPG5hbWU+IGZyb20gdGhlIG91dHB1dFxuXAotICAtUyAtLXN0cmlwLWFsbCAgICAgICAgICAgICAgICAgICBSZW1vdmUgYWxsIHN5bWJvbCBhbmQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvblxuXAotICAtZyAtLXN0cmlwLWRlYnVnICAgICAgICAgICAgICAgICBSZW1vdmUgYWxsIGRlYnVnZ2luZyBzeW1ib2xzXG5cCi0gICAgIC0tc3RyaXAtdW5uZWVkZWQgICAgICAgICAgICAgIFJlbW92ZSBhbGwgc3ltYm9scyBub3QgbmVlZGVkIGJ5IHJlbG9jYXRpb25zXG5cCi0gIC1OIC0tc3RyaXAtc3ltYm9sIDxuYW1lPiAgICAgICAgIERvIG5vdCBjb3B5IHN5bWJvbCA8bmFtZT5cblwKLSAgLUsgLS1rZWVwLXN5bWJvbCA8bmFtZT4gICAgICAgICAgT25seSBjb3B5IHN5bWJvbCA8bmFtZT5cblwKLSAgLUwgLS1sb2NhbGl6ZS1zeW1ib2wgPG5hbWU+ICAgICAgRm9yY2Ugc3ltYm9sIDxuYW1lPiB0byBiZSBtYXJrZWQgYXMgYSBsb2NhbFxuXAotICAtVyAtLXdlYWtlbi1zeW1ib2wgPG5hbWU+ICAgICAgICBGb3JjZSBzeW1ib2wgPG5hbWU+IHRvIGJlIG1hcmtlZCBhcyBhIHdlYWtcblwKLSAgICAgLS13ZWFrZW4gICAgICAgICAgICAgICAgICAgICAgRm9yY2UgYWxsIGdsb2JhbCBzeW1ib2xzIHRvIGJlIG1hcmtlZCBhcyB3ZWFrXG5cCi0gIC14IC0tZGlzY2FyZC1hbGwgICAgICAgICAgICAgICAgIFJlbW92ZSBhbGwgbm9uLWdsb2JhbCBzeW1ib2xzXG5cCi0gIC1YIC0tZGlzY2FyZC1sb2NhbHMgICAgICAgICAgICAgIFJlbW92ZSBhbnkgY29tcGlsZXItZ2VuZXJhdGVkIHN5bWJvbHNcblwKLSAgLWkgLS1pbnRlcmxlYXZlIDxudW1iZXI+ICAgICAgICAgT25seSBjb3B5IG9uZSBvdXQgb2YgZXZlcnkgPG51bWJlcj4gYnl0ZXNcblwKLSAgLWIgLS1ieXRlIDxudW0+ICAgICAgICAgICAgICAgICAgU2VsZWN0IGJ5dGUgPG51bT4gaW4gZXZlcnkgaW50ZXJsZWF2ZWQgYmxvY2tcblwKLSAgICAgLS1nYXAtZmlsbCA8dmFsPiAgICAgICAgICAgICAgRmlsbCBnYXBzIGJldHdlZW4gc2VjdGlvbnMgd2l0aCA8dmFsPlxuXAotICAgICAtLXBhZC10byA8YWRkcj4gICAgICAgICAgICAgICBQYWQgdGhlIGxhc3Qgc2VjdGlvbiB1cCB0byBhZGRyZXNzIDxhZGRyPlxuXAotICAgICAtLXNldC1zdGFydCA8YWRkcj4gICAgICAgICAgICBTZXQgdGhlIHN0YXJ0IGFkZHJlc3MgdG8gPGFkZHI+XG5cCi0gICAgey0tY2hhbmdlLXN0YXJ0fC0tYWRqdXN0LXN0YXJ0fSA8aW5jcj5cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIDxpbmNyPiB0byB0aGUgc3RhcnQgYWRkcmVzc1xuXAotICAgIHstLWNoYW5nZS1hZGRyZXNzZXN8LS1hZGp1c3Qtdm1hfSA8aW5jcj5cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIDxpbmNyPiB0byBMTUEsIFZNQSBhbmQgc3RhcnQgYWRkcmVzc2VzXG5cCi0gICAgey0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzc3wtLWFkanVzdC1zZWN0aW9uLXZtYX0gPG5hbWU+ez18K3wtfTx2YWw+XG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSBMTUEgYW5kIFZNQSBvZiBzZWN0aW9uIDxuYW1lPiBieSA8dmFsPlxuXAotICAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSA8bmFtZT57PXwrfC19PHZhbD5cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIHRoZSBMTUEgb2Ygc2VjdGlvbiA8bmFtZT4gYnkgPHZhbD5cblwKLSAgICAgLS1jaGFuZ2Utc2VjdGlvbi12bWEgPG5hbWU+ez18K3wtfTx2YWw+XG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSB0aGUgVk1BIG9mIHNlY3Rpb24gPG5hbWU+IGJ5IDx2YWw+XG5cCi0gICAgey0tW25vLV1jaGFuZ2Utd2FybmluZ3N8LS1bbm8tXWFkanVzdC13YXJuaW5nc31cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FybiBpZiBhIG5hbWVkIHNlY3Rpb24gZG9lcyBub3QgZXhpc3RcblwKLSAgICAgLS1zZXQtc2VjdGlvbi1mbGFncyA8bmFtZT49PGZsYWdzPlxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgc2VjdGlvbiA8bmFtZT4ncyBwcm9wZXJ0aWVzIHRvIDxmbGFncz5cblwKLSAgICAgLS1hZGQtc2VjdGlvbiA8bmFtZT49PGZpbGU+ICAgQWRkIHNlY3Rpb24gPG5hbWU+IGZvdW5kIGluIDxmaWxlPiB0byBvdXRwdXRcblwKLSAgICAgLS1jaGFuZ2UtbGVhZGluZy1jaGFyICAgICAgICAgRm9yY2Ugb3V0cHV0IGZvcm1hdCdzIGxlYWRpbmcgY2hhcmFjdGVyIHN0eWxlXG5cCi0gICAgIC0tcmVtb3ZlLWxlYWRpbmctY2hhciAgICAgICAgIFJlbW92ZSBsZWFkaW5nIGNoYXJhY3RlciBmcm9tIGdsb2JhbCBzeW1ib2xzXG5cCi0gIC12IC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgICAgIExpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZFxuXAotICAtViAtLXZlcnNpb24gICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyXG5cCi0gIC1oIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBvdXRwdXRcblwKLSIpKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoZXhpdF9zdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChleGl0X3N0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpcF91c2FnZSAoc3RyZWFtLCBleGl0X3N0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgZXhpdF9zdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiVXNhZ2U6ICVzIDxzd2l0Y2hlcz4gaW4tZmlsZShzKVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiIFRoZSBzd2l0Y2hlcyBhcmU6XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtSSAtLWlucHV0LXRhcmdldCA8YmZkbmFtZT4gICAgICBBc3N1bWUgaW5wdXQgZmlsZSBpcyBpbiBmb3JtYXQgPGJmZG5hbWU+XG5cCi0gIC1PIC0tb3V0cHV0LXRhcmdldCA8YmZkbmFtZT4gICAgIENyZWF0ZSBhbiBvdXRwdXQgZmlsZSBpbiBmb3JtYXQgPGJmZG5hbWU+XG5cCi0gIC1GIC0tdGFyZ2V0IDxiZmRuYW1lPiAgICAgICAgICAgIFNldCBib3RoIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0IHRvIDxiZmRuYW1lPlxuXAotICAtcCAtLXByZXNlcnZlLWRhdGVzICAgICAgICAgICAgICBDb3B5IG1vZGlmaWVkL2FjY2VzcyB0aW1lc3RhbXBzIHRvIHRoZSBvdXRwdXRcblwKLSAgLVIgLS1yZW1vdmUtc2VjdGlvbiA8bmFtZT4gICAgICAgUmVtb3ZlIHNlY3Rpb24gPG5hbWU+IGZyb20gdGhlIG91dHB1dFxuXAotICAtcyAtLXN0cmlwLWFsbCAgICAgICAgICAgICAgICAgICBSZW1vdmUgYWxsIHN5bWJvbCBhbmQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvblxuXAotICAtZyAtUyAtLXN0cmlwLWRlYnVnICAgICAgICAgICAgICBSZW1vdmUgYWxsIGRlYnVnZ2luZyBzeW1ib2xzXG5cCi0gICAgIC0tc3RyaXAtdW5uZWVkZWQgICAgICAgICAgICAgIFJlbW92ZSBhbGwgc3ltYm9scyBub3QgbmVlZGVkIGJ5IHJlbG9jYXRpb25zXG5cCi0gIC1OIC0tc3RyaXAtc3ltYm9sIDxuYW1lPiAgICAgICAgIERvIG5vdCBjb3B5IHN5bWJvbCA8bmFtZT5cblwKLSAgLUsgLS1rZWVwLXN5bWJvbCA8bmFtZT4gICAgICAgICAgT25seSBjb3B5IHN5bWJvbCA8bmFtZT5cblwKLSAgLXggLS1kaXNjYXJkLWFsbCAgICAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBub24tZ2xvYmFsIHN5bWJvbHNcblwKLSAgLVggLS1kaXNjYXJkLWxvY2FscyAgICAgICAgICAgICAgUmVtb3ZlIGFueSBjb21waWxlci1nZW5lcmF0ZWQgc3ltYm9sc1xuXAotICAtdiAtLXZlcmJvc2UgICAgICAgICAgICAgICAgICAgICBMaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWRcblwKLSAgLVYgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlclxuXAotICAtaCAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgb3V0cHV0XG5cCi0gIC1vIDxmaWxlPiAgICAgICAgICAgICAgICAgICAgICAgIFBsYWNlIHN0cmlwcGVkIG91dHB1dCBpbnRvIDxmaWxlPlxuXAotIikpOwotCi0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKGV4aXRfc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoZXhpdF9zdGF0dXMpOwotfQotCi0vKiBQYXJzZSBzZWN0aW9uIGZsYWdzIGludG8gYSBmbGFnd29yZCwgd2l0aCBhIGZhdGFsIGVycm9yIGlmIHRoZQotICAgc3RyaW5nIGNhbid0IGJlIHBhcnNlZC4gICovCi0KLXN0YXRpYyBmbGFnd29yZAotcGFyc2VfZmxhZ3MgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGZsYWd3b3JkIHJldDsKLSAgY29uc3QgY2hhciAqc25leHQ7Ci0gIGludCBsZW47Ci0KLSAgcmV0ID0gU0VDX05PX0ZMQUdTOwotCi0gIGRvCi0gICAgewotICAgICAgc25leHQgPSBzdHJjaHIgKHMsICcsJyk7Ci0gICAgICBpZiAoc25leHQgPT0gTlVMTCkKLQlsZW4gPSBzdHJsZW4gKHMpOwotICAgICAgZWxzZQotCXsKLQkgIGxlbiA9IHNuZXh0IC0gczsKLQkgICsrc25leHQ7Ci0JfQotCi0gICAgICBpZiAoMCkgOwotI2RlZmluZSBQQVJTRV9GTEFHKGZuYW1lLGZ2YWwpIFwKLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGZuYW1lLCBzLCBsZW4pID09IDApIHJldCB8PSBmdmFsCi0gICAgICBQQVJTRV9GTEFHICgiYWxsb2MiLCBTRUNfQUxMT0MpOwotICAgICAgUEFSU0VfRkxBRyAoImxvYWQiLCBTRUNfTE9BRCk7Ci0gICAgICBQQVJTRV9GTEFHICgibm9sb2FkIiwgU0VDX05FVkVSX0xPQUQpOwotICAgICAgUEFSU0VfRkxBRyAoInJlYWRvbmx5IiwgU0VDX1JFQURPTkxZKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJkZWJ1ZyIsIFNFQ19ERUJVR0dJTkcpOwotICAgICAgUEFSU0VfRkxBRyAoImNvZGUiLCBTRUNfQ09ERSk7Ci0gICAgICBQQVJTRV9GTEFHICgiZGF0YSIsIFNFQ19EQVRBKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJyb20iLCBTRUNfUk9NKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJzaGFyZSIsIFNFQ19TSEFSRUQpOwotICAgICAgUEFSU0VfRkxBRyAoImNvbnRlbnRzIiwgU0VDX0hBU19DT05URU5UUyk7Ci0jdW5kZWYgUEFSU0VfRkxBRwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKmNvcHk7Ci0KLQkgIGNvcHkgPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgIHN0cm5jcHkgKGNvcHksIHMsIGxlbik7Ci0JICBjb3B5W2xlbl0gPSAnXDAnOwotCSAgbm9uX2ZhdGFsIChfKCJ1bnJlY29nbml6ZWQgc2VjdGlvbiBmbGFnIGAlcyciKSwgY29weSk7Ci0JICBmYXRhbCAoXygic3VwcG9ydGVkIGZsYWdzOiBhbGxvYywgbG9hZCwgbm9sb2FkLCByZWFkb25seSwgZGVidWcsIGNvZGUsIGRhdGEsIHJvbSwgc2hhcmUsIGNvbnRlbnRzIikpOwotCX0KLQotICAgICAgcyA9IHNuZXh0OwotICAgIH0KLSAgd2hpbGUgKHMgIT0gTlVMTCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRmluZCBhbmQgb3B0aW9uYWxseSBhZGQgYW4gZW50cnkgaW4gdGhlIGNoYW5nZV9zZWN0aW9ucyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2xpc3QgKgotZmluZF9zZWN0aW9uX2xpc3QgKG5hbWUsIGFkZCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBhZGQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0KLSAgZm9yIChwID0gY2hhbmdlX3NlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHAtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICByZXR1cm4gcDsKLQotICBpZiAoISBhZGQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcCA9IChzdHJ1Y3Qgc2VjdGlvbl9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fbGlzdCkpOwotICBwLT5uYW1lID0gbmFtZTsKLSAgcC0+dXNlZCA9IGZhbHNlOwotICBwLT5yZW1vdmUgPSBmYWxzZTsKLSAgcC0+Y29weSA9IGZhbHNlOwotICBwLT5jaGFuZ2Vfdm1hID0gQ0hBTkdFX0lHTk9SRTsKLSAgcC0+Y2hhbmdlX2xtYSA9IENIQU5HRV9JR05PUkU7Ci0gIHAtPnZtYV92YWwgPSAwOwotICBwLT5sbWFfdmFsID0gMDsKLSAgcC0+c2V0X2ZsYWdzID0gZmFsc2U7Ci0gIHAtPmZsYWdzID0gMDsKLQotICBwLT5uZXh0ID0gY2hhbmdlX3NlY3Rpb25zOwotICBjaGFuZ2Vfc2VjdGlvbnMgPSBwOwotCi0gIHJldHVybiBwOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gc3RyaXBfc3BlY2lmaWNfbGlzdC4gICovCi0KLXN0YXRpYyB2b2lkIAotYWRkX3NwZWNpZmljX3N5bWJvbCAobmFtZSwgbGlzdCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHN5bWxpc3QgKipsaXN0OwotewotICBzdHJ1Y3Qgc3ltbGlzdCAqdG1wX2xpc3Q7Ci0KLSAgdG1wX2xpc3QgPSAoc3RydWN0IHN5bWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3ltbGlzdCkpOwotICB0bXBfbGlzdC0+bmFtZSA9IG5hbWU7Ci0gIHRtcF9saXN0LT5uZXh0ID0gKmxpc3Q7Ci0gICpsaXN0ID0gdG1wX2xpc3Q7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGEgc3ltYm9sIHNob3VsZCBiZSBzdHJpcHBlZCBvciBrZXB0IGJhc2VkIG9uCi0gICBzdHJpcF9zcGVjaWZpY19saXN0IGFuZCBrZWVwX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgbGlzdCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHN5bWxpc3QgKmxpc3Q7Ci17Ci0gIHN0cnVjdCBzeW1saXN0ICp0bXBfbGlzdDsKLQotICBmb3IgKHRtcF9saXN0ID0gbGlzdDsgdG1wX2xpc3Q7IHRtcF9saXN0ID0gdG1wX2xpc3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgdG1wX2xpc3QtPm5hbWUpID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSBpZiBhIHNlY3Rpb24gaXMgYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pc19zdHJpcF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0RFQlVHR0lORykgIT0gMAotICAgICAgJiYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0JICB8fCBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfQUxMCi0JICB8fCBjb252ZXJ0X2RlYnVnZ2luZykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgc2VjdGlvbnNfcmVtb3ZlZCAmJiAhIHNlY3Rpb25zX2NvcGllZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgZmFsc2UpOwotICBpZiAoc2VjdGlvbnNfcmVtb3ZlZCAmJiBwICE9IE5VTEwgJiYgcC0+cmVtb3ZlKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoc2VjdGlvbnNfY29waWVkICYmIChwID09IE5VTEwgfHwgISBwLT5jb3B5KSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDaG9vc2Ugd2hpY2ggc3ltYm9sIGVudHJpZXMgdG8gY29weTsgcHV0IHRoZSByZXN1bHQgaW4gT1NZTVMuCi0gICBXZSBkb24ndCBjb3B5IGluIHBsYWNlLCBiZWNhdXNlIHRoYXQgY29uZnVzZXMgdGhlIHJlbG9jcy4KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gcHJpbnQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1maWx0ZXJfc3ltYm9scyAoYWJmZCwgb2JmZCwgb3N5bXMsIGlzeW1zLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKipvc3ltcywgKippc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLXsKLSAgcmVnaXN0ZXIgYXN5bWJvbCAqKmZyb20gPSBpc3ltcywgKip0byA9IG9zeW1zOwotICBsb25nIHNyY19jb3VudCA9IDAsIGRzdF9jb3VudCA9IDA7Ci0KLSAgZm9yICg7IHNyY19jb3VudCA8IHN5bWNvdW50OyBzcmNfY291bnQrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW0gPSBmcm9tW3NyY19jb3VudF07Ci0gICAgICBmbGFnd29yZCBmbGFncyA9IHN5bS0+ZmxhZ3M7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLSAgICAgIGludCBrZWVwOwotCi0gICAgICBpZiAoY2hhbmdlX2xlYWRpbmdfY2hhcgotCSAgJiYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkKLQkgICAgICAhPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG9iZmQpKQotCSAgJiYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gJ1wwJwotCSAgICAgIHx8IChuYW1lWzBdID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkpKSkKLQl7Ci0JICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvYmZkKSA9PSAnXDAnKQotCSAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSA9IG5hbWUgKyAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqbjsKLQotCSAgICAgIG4gPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMik7Ci0JICAgICAgblswXSA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob2JmZCk7Ci0JICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gJ1wwJykKLQkJc3RyY3B5IChuICsgMSwgbmFtZSk7Ci0JICAgICAgZWxzZQotCQlzdHJjcHkgKG4gKyAxLCBuYW1lICsgMSk7Ci0JICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgPSBuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocmVtb3ZlX2xlYWRpbmdfY2hhcgotCSAgJiYgKChmbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkgICAgICB8fCAoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICYmIG5hbWVbMF0gPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSkKLQluYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSA9IG5hbWUgKyAxOwotCi0gICAgICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwpCi0Ja2VlcCA9IDA7Ci0gICAgICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfS0VFUCkgIT0gMAkJLyogVXNlZCBpbiByZWxvY2F0aW9uLiAgKi8KLQkgICAgICAgfHwgKChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAotCQkgICAmJiAoKCpiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPnN5bWJvbF9wdHJfcHRyKS0+ZmxhZ3MKLQkJICAgICAgICYgQlNGX0tFRVApICE9IDApKQotCWtlZXAgPSAxOwotICAgICAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMAkvKiBHbG9iYWwgc3ltYm9sLiAgKi8KLQkgICAgICAgfHwgKGZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkgICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQlrZWVwID0gc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9VTk5FRURFRDsKLSAgICAgIGVsc2UgaWYgKChmbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCS8qIERlYnVnZ2luZyBzeW1ib2wuICAqLwotCWtlZXAgPSAoc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9ERUJVRwotCQkmJiBzdHJpcF9zeW1ib2xzICE9IFNUUklQX1VOTkVFREVECi0JCSYmICEgY29udmVydF9kZWJ1Z2dpbmcpOwotICAgICAgZWxzZQkJCS8qIExvY2FsIHN5bWJvbC4gICovCi0Ja2VlcCA9IChzdHJpcF9zeW1ib2xzICE9IFNUUklQX1VOTkVFREVECi0JCSYmIChkaXNjYXJkX2xvY2FscyAhPSBMT0NBTFNfQUxMCi0JCSAgICAmJiAoZGlzY2FyZF9sb2NhbHMgIT0gTE9DQUxTX1NUQVJUX0wKLQkJCXx8ICEgYmZkX2lzX2xvY2FsX2xhYmVsIChhYmZkLCBzeW0pKSkpOwotCi0gICAgICBpZiAoa2VlcCAmJiBpc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCBzdHJpcF9zcGVjaWZpY19saXN0KSkKLQlrZWVwID0gMDsKLSAgICAgIGlmICgha2VlcCAmJiBpc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCBrZWVwX3NwZWNpZmljX2xpc3QpKQotCWtlZXAgPSAxOwotICAgICAgaWYgKGtlZXAgJiYgaXNfc3RyaXBfc2VjdGlvbiAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQlrZWVwID0gMDsKLQotICAgICAgaWYgKGtlZXAgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMAotCSAgJiYgKHdlYWtlbiB8fCBpc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCB3ZWFrZW5fc3BlY2lmaWNfbGlzdCkpKQotCXsKLQkgIHN5bS0+ZmxhZ3MgJj1+IEJTRl9HTE9CQUw7Ci0JICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotCX0KLSAgICAgIGlmIChrZWVwICYmIChmbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKQotCSAgJiYgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgbG9jYWxpemVfc3BlY2lmaWNfbGlzdCkpCi0JewotCSAgc3ltLT5mbGFncyAmPSB+KEJTRl9HTE9CQUwgfCBCU0ZfV0VBSyk7Ci0JICBzeW0tPmZsYWdzIHw9IEJTRl9MT0NBTDsKLQl9Ci0KLSAgICAgIGlmIChrZWVwKQotCXRvW2RzdF9jb3VudCsrXSA9IHN5bTsKLSAgICB9Ci0KLSAgdG9bZHN0X2NvdW50XSA9IE5VTEw7Ci0KLSAgcmV0dXJuIGRzdF9jb3VudDsKLX0KLQotLyogS2VlcCBvbmx5IGV2ZXJ5IGBjb3B5X2J5dGUndGggYnl0ZSBpbiBNRU1IVU5LLCB3aGljaCBpcyAqU0laRSBieXRlcyBsb25nLgotICAgQWRqdXN0ICpTSVpFLiAgKi8KLQotc3RhdGljIHZvaWQKLWZpbHRlcl9ieXRlcyAobWVtaHVuaywgc2l6ZSkKLSAgICAgY2hhciAqbWVtaHVuazsKLSAgICAgYmZkX3NpemVfdHlwZSAqc2l6ZTsKLXsKLSAgY2hhciAqZnJvbSA9IG1lbWh1bmsgKyBjb3B5X2J5dGUsICp0byA9IG1lbWh1bmssICplbmQgPSBtZW1odW5rICsgKnNpemU7Ci0KLSAgZm9yICg7IGZyb20gPCBlbmQ7IGZyb20gKz0gaW50ZXJsZWF2ZSkKLSAgICAqdG8rKyA9ICpmcm9tOwotICBpZiAoKnNpemUgJSBpbnRlcmxlYXZlID4gKGJmZF9zaXplX3R5cGUpIGNvcHlfYnl0ZSkKLSAgICAqc2l6ZSA9ICgqc2l6ZSAvIGludGVybGVhdmUpICsgMTsKLSAgZWxzZQotICAgICpzaXplIC89IGludGVybGVhdmU7Ci19Ci0KLS8qIENvcHkgb2JqZWN0IGZpbGUgSUJGRCBvbnRvIE9CRkQuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9vYmplY3QgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBiZmRfdm1hIHN0YXJ0OwotICBsb25nIHN5bWNvdW50OwotICBhc2VjdGlvbiAqKm9zZWN0aW9ucyA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgKmdhcHMgPSBOVUxMOwotICBiZmRfc2l6ZV90eXBlIG1heF9nYXAgPSAwOwotICBsb25nIHN5bXNpemU7Ci0gIFBUUiBkaGFuZGxlOwotCi0KLSAgaWYgKCFiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2dldF9mb3JtYXQgKGliZmQpKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICBwcmludGYgKF8oImNvcHkgZnJvbSAlcyglcykgdG8gJXMoJXMpXG4iKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIGJmZF9nZXRfdGFyZ2V0IChpYmZkKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksIGJmZF9nZXRfdGFyZ2V0IChvYmZkKSk7Ci0KLSAgaWYgKHNldF9zdGFydF9zZXQpCi0gICAgc3RhcnQgPSBzZXRfc3RhcnQ7Ci0gIGVsc2UKLSAgICBzdGFydCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoaWJmZCk7Ci0gIHN0YXJ0ICs9IGNoYW5nZV9zdGFydDsKLQotICBpZiAoIWJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob2JmZCwgc3RhcnQpCi0gICAgICB8fCAhYmZkX3NldF9maWxlX2ZsYWdzIChvYmZkLAotCQkJICAgICAgKGJmZF9nZXRfZmlsZV9mbGFncyAoaWJmZCkKLQkJCSAgICAgICAmIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MgKG9iZmQpKSkpCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgLyogQ29weSBhcmNoaXRlY3R1cmUgb2YgaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZSAqLwotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJICBiZmRfZ2V0X21hY2ggKGliZmQpKSkKLSAgICBub25fZmF0YWwgKF8oIldhcm5pbmc6IE91dHB1dCBmaWxlIGNhbm5vdCByZXByZXNlbnQgYXJjaGl0ZWN0dXJlICVzIiksCi0JICAgICAgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJCQliZmRfZ2V0X21hY2ggKGliZmQpKSk7Ci0gIAotICBpZiAoIWJmZF9zZXRfZm9ybWF0IChvYmZkLCBiZmRfZ2V0X2Zvcm1hdCAoaWJmZCkpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIGlmIChpc3ltcHApCi0gICAgZnJlZSAoaXN5bXBwKTsKLSAgCi0gIGlmIChvc3ltcHAgIT0gaXN5bXBwKQotICAgIGZyZWUgKG9zeW1wcCk7Ci0KLSAgLyogQkZEIG1hbmRhdGVzIHRoYXQgYWxsIG91dHB1dCBzZWN0aW9ucyBiZSBjcmVhdGVkIGFuZCBzaXplcyBzZXQgYmVmb3JlCi0gICAgIGFueSBvdXRwdXQgaXMgZG9uZS4gIFRodXMsIHdlIHRyYXZlcnNlIGFsbCBzZWN0aW9ucyBtdWx0aXBsZSB0aW1lcy4gICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwgc2V0dXBfc2VjdGlvbiwgKHZvaWQgKikgb2JmZCk7Ci0KLSAgaWYgKGFkZF9zZWN0aW9ucyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX2FkZCAqcGFkZDsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnBzZXQ7Ci0KLSAgICAgIGZvciAocGFkZCA9IGFkZF9zZWN0aW9uczsgcGFkZCAhPSBOVUxMOyBwYWRkID0gcGFkZC0+bmV4dCkKLQl7Ci0JICBwYWRkLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob2JmZCwgcGFkZC0+bmFtZSk7Ci0JICBpZiAocGFkZC0+c2VjdGlvbiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbm9uX2ZhdGFsIChfKCJjYW4ndCBjcmVhdGUgc2VjdGlvbiBgJXMnOiAlcyIpLAotCQkgICAgICAgcGFkZC0+bmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHN0YXR1cyA9IDE7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmbGFnd29yZCBmbGFnczsKLQkgICAgICAKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgcGFkZC0+c2VjdGlvbiwgcGFkZC0+c2l6ZSkpCi0JCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0JICAgICAgcHNldCA9IGZpbmRfc2VjdGlvbl9saXN0IChwYWRkLT5uYW1lLCBmYWxzZSk7Ci0JICAgICAgaWYgKHBzZXQgIT0gTlVMTCkKLQkJcHNldC0+dXNlZCA9IHRydWU7Ci0KLQkgICAgICBpZiAocHNldCAhPSBOVUxMICYmIHBzZXQtPnNldF9mbGFncykKLQkJZmxhZ3MgPSBwc2V0LT5mbGFncyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgICAgZWxzZQotCQlmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQTsKLQkgICAgICAKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIHBhZGQtPnNlY3Rpb24sIGZsYWdzKSkKLQkJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkgICAgICBpZiAocHNldCAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHBzZXQtPmNoYW5nZV92bWEgIT0gQ0hBTkdFX0lHTk9SRSkKLQkJICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKG9iZmQsIHBhZGQtPnNlY3Rpb24sIHBzZXQtPnZtYV92YWwpKQotCQkgICAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQkJICAKLQkJICBpZiAocHNldC0+Y2hhbmdlX2xtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQkgICAgewotCQkgICAgICBwYWRkLT5zZWN0aW9uLT5sbWEgPSBwc2V0LT5sbWFfdmFsOwotCQkgICAgICAKLQkJICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudAotCQkJICAob2JmZCwgcGFkZC0+c2VjdGlvbiwKLQkJCSAgIGJmZF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgcGFkZC0+c2VjdGlvbikpKQotCQkJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGdhcF9maWxsX3NldCB8fCBwYWRfdG9fc2V0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICoqc2V0OwotICAgICAgdW5zaWduZWQgaW50IGMsIGk7Ci0KLSAgICAgIC8qIFdlIG11c3QgZmlsbCBpbiBnYXBzIGJldHdlZW4gdGhlIHNlY3Rpb25zIGFuZC9vciB3ZSBtdXN0IHBhZAotCSB0aGUgbGFzdCBzZWN0aW9uIHRvIGEgc3BlY2lmaWVkIGFkZHJlc3MuICBXZSBkbyB0aGlzIGJ5Ci0JIGdyYWJiaW5nIGEgbGlzdCBvZiB0aGUgc2VjdGlvbnMsIHNvcnRpbmcgdGhlbSBieSBWTUEsIGFuZAotCSBpbmNyZWFzaW5nIHRoZSBzZWN0aW9uIHNpemVzIGFzIHJlcXVpcmVkIHRvIGZpbGwgdGhlIGdhcHMuCi0JIFdlIHdyaXRlIG91dCB0aGUgZ2FwIGNvbnRlbnRzIGJlbG93LiAgKi8KLQotICAgICAgYyA9IGJmZF9jb3VudF9zZWN0aW9ucyAob2JmZCk7Ci0gICAgICBvc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIHhtYWxsb2MgKGMgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIHNldCA9IG9zZWN0aW9uczsKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAob2JmZCwgZ2V0X3NlY3Rpb25zLCAodm9pZCAqKSAmc2V0KTsKLQotICAgICAgcXNvcnQgKG9zZWN0aW9ucywgYywgc2l6ZW9mIChhc2VjdGlvbiAqKSwgY29tcGFyZV9zZWN0aW9uX2xtYSk7Ci0KLSAgICAgIGdhcHMgPSAoYmZkX3NpemVfdHlwZSAqKSB4bWFsbG9jIChjICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0gICAgICBtZW1zZXQgKGdhcHMsIDAsIGMgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKTsKLQotICAgICAgaWYgKGdhcF9maWxsX3NldCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYyAtIDE7IGkrKykKLQkgICAgewotCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQkgICAgICBiZmRfdm1hIGdhcF9zdGFydCwgZ2FwX3N0b3A7Ci0KLQkgICAgICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgb3NlY3Rpb25zW2ldKTsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCQkgIHx8IChmbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbaV0pOwotCSAgICAgIGdhcF9zdGFydCA9IGJmZF9zZWN0aW9uX2xtYSAob2JmZCwgb3NlY3Rpb25zW2ldKSArIHNpemU7Ci0JICAgICAgZ2FwX3N0b3AgPSBiZmRfc2VjdGlvbl9sbWEgKG9iZmQsIG9zZWN0aW9uc1tpICsgMV0pOwotCSAgICAgIGlmIChnYXBfc3RhcnQgPCBnYXBfc3RvcCkKLQkJewotCQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbaV0sCi0JCQkJCSAgICAgIHNpemUgKyAoZ2FwX3N0b3AgLSBnYXBfc3RhcnQpKSkKLQkJICAgIHsKLQkJICAgICAgbm9uX2ZhdGFsIChfKCJDYW4ndCBmaWxsIGdhcCBhZnRlciAlczogJXMiKSwKLQkJCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob2JmZCwgb3NlY3Rpb25zW2ldKSwKLQkJCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JCSAgICAgIHN0YXR1cyA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGdhcHNbaV0gPSBnYXBfc3RvcCAtIGdhcF9zdGFydDsKLQkJICBpZiAobWF4X2dhcCA8IGdhcF9zdG9wIC0gZ2FwX3N0YXJ0KQotCQkgICAgbWF4X2dhcCA9IGdhcF9zdG9wIC0gZ2FwX3N0YXJ0OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwYWRfdG9fc2V0KQotCXsKLQkgIGJmZF92bWEgbG1hOwotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0JICBsbWEgPSBiZmRfc2VjdGlvbl9sbWEgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0pOwotCSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0pOwotCSAgaWYgKGxtYSArIHNpemUgPCBwYWRfdG8pCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2MgLSAxXSwKLQkJCQkJICBwYWRfdG8gLSBsbWEpKQotCQl7Ci0JCSAgbm9uX2ZhdGFsIChfKCJDYW4ndCBhZGQgcGFkZGluZyB0byAlczogJXMiKSwKLQkJCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvYmZkLCBvc2VjdGlvbnNbYyAtIDFdKSwKLQkJCSAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkJICBzdGF0dXMgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZ2Fwc1tjIC0gMV0gPSBwYWRfdG8gLSAobG1hICsgc2l6ZSk7Ci0JCSAgaWYgKG1heF9nYXAgPCBwYWRfdG8gLSAobG1hICsgc2l6ZSkpCi0JCSAgICBtYXhfZ2FwID0gcGFkX3RvIC0gKGxtYSArIHNpemUpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFN5bWJvbCBmaWx0ZXJpbmcgbXVzdCBoYXBwZW4gYWZ0ZXIgdGhlIG91dHB1dCBzZWN0aW9ucyBoYXZlCi0gICAgIGJlZW4gY3JlYXRlZCwgYnV0IGJlZm9yZSB0aGVpciBjb250ZW50cyBhcmUgc2V0LiAgKi8KLSAgZGhhbmRsZSA9IE5VTEw7Ci0gIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoaWJmZCk7Ci0gIGlmIChzeW1zaXplIDwgMCkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgCi0gIG9zeW1wcCA9IGlzeW1wcCA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaWJmZCwgaXN5bXBwKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgCi0gIGlmIChjb252ZXJ0X2RlYnVnZ2luZykKLSAgICBkaGFuZGxlID0gcmVhZF9kZWJ1Z2dpbmdfaW5mbyAoaWJmZCwgaXN5bXBwLCBzeW1jb3VudCk7Ci0gIAotICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9ERUJVRyAKLSAgICAgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0gICAgICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECi0gICAgICB8fCBkaXNjYXJkX2xvY2FscyAhPSBMT0NBTFNfVU5ERUYKLSAgICAgIHx8IHN0cmlwX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwga2VlcF9zcGVjaWZpY19saXN0ICE9IE5VTEwKLSAgICAgIHx8IGxvY2FsaXplX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwgd2Vha2VuX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwgc2VjdGlvbnNfcmVtb3ZlZAotICAgICAgfHwgc2VjdGlvbnNfY29waWVkCi0gICAgICB8fCBjb252ZXJ0X2RlYnVnZ2luZwotICAgICAgfHwgY2hhbmdlX2xlYWRpbmdfY2hhcgotICAgICAgfHwgcmVtb3ZlX2xlYWRpbmdfY2hhcgotICAgICAgfHwgd2Vha2VuKQotICAgIHsKLSAgICAgIC8qIE1hcmsgc3ltYm9scyB1c2VkIGluIG91dHB1dCByZWxvY2F0aW9ucyBzbyB0aGF0IHRoZXkKLQkgYXJlIGtlcHQsIGV2ZW4gaWYgdGhleSBhcmUgbG9jYWwgbGFiZWxzIG9yIHN0YXRpYyBzeW1ib2xzLgotCSAKLQkgTm90ZSB3ZSBpdGVyYXRlIG92ZXIgdGhlIGlucHV0IHNlY3Rpb25zIGV4YW1pbmluZyB0aGVpcgotCSByZWxvY2F0aW9ucyBzaW5jZSB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMKLQkgaGF2ZW4ndCBiZWVuIHNldCB5ZXQuICBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyB3aWxsCi0JIGlnbm9yZSBpbnB1dCBzZWN0aW9ucyB3aGljaCBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgb3V0cHV0Ci0JIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfQUxMKQotCWJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwKLQkJCSAgICAgICBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucywKLQkJCSAgICAgICAoUFRSKWlzeW1wcCk7Ci0gICAgICBvc3ltcHAgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoKHN5bWNvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoaWJmZCwgb2JmZCwgb3N5bXBwLCBpc3ltcHAsIHN5bWNvdW50KTsKLSAgICB9Ci0KLSAgaWYgKGNvbnZlcnRfZGVidWdnaW5nICYmIGRoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISB3cml0ZV9kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSwgJnN5bWNvdW50LCAmb3N5bXBwKSkKLQl7Ci0JICBzdGF0dXMgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgYmZkX3NldF9zeW10YWIgKG9iZmQsIG9zeW1wcCwgc3ltY291bnQpOwotCi0gIC8qIFRoaXMgaGFzIHRvIGhhcHBlbiBhZnRlciB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIHNldC4gICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwgY29weV9zZWN0aW9uLCAodm9pZCAqKSBvYmZkKTsKLQotICBpZiAoYWRkX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fYWRkICpwYWRkOwotCi0gICAgICBmb3IgKHBhZGQgPSBhZGRfc2VjdGlvbnM7IHBhZGQgIT0gTlVMTDsgcGFkZCA9IHBhZGQtPm5leHQpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBwYWRkLT5zZWN0aW9uLAotCQkJCQkgIChQVFIpIHBhZGQtPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwKLQkJCQkJICAoYmZkX3NpemVfdHlwZSkgcGFkZC0+c2l6ZSkpCi0JICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGdhcF9maWxsX3NldCB8fCBwYWRfdG9fc2V0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBpbnQgYywgaTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZ2Fwcy4gICovCi0KLSAgICAgIGlmIChtYXhfZ2FwID4gODE5MikKLQltYXhfZ2FwID0gODE5MjsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChtYXhfZ2FwKTsKLSAgICAgIG1lbXNldCAoYnVmLCBnYXBfZmlsbCwgKHNpemVfdCkgbWF4X2dhcCk7Ci0KLSAgICAgIGMgPSBiZmRfY291bnRfc2VjdGlvbnMgKG9iZmQpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQl7Ci0JICBpZiAoZ2Fwc1tpXSAhPSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBsZWZ0OwotCSAgICAgIGZpbGVfcHRyIG9mZjsKLQotCSAgICAgIGxlZnQgPSBnYXBzW2ldOwotCSAgICAgIG9mZiA9IGJmZF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tpXSkgLSBsZWZ0OwotCSAgICAgIHdoaWxlIChsZWZ0ID4gMCkKLQkJewotCQkgIGJmZF9zaXplX3R5cGUgbm93OwotCi0JCSAgaWYgKGxlZnQgPiA4MTkyKQotCQkgICAgbm93ID0gODE5MjsKLQkJICBlbHNlCi0JCSAgICBub3cgPSBsZWZ0OwotCi0JCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBvc2VjdGlvbnNbaV0sIGJ1ZiwKLQkJCQkJCSAgb2ZmLCBub3cpKQotCQkgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkJICBsZWZ0IC09IG5vdzsKLQkJICBvZmYgKz0gbm93OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFsbG93IHRoZSBCRkQgYmFja2VuZCB0byBjb3B5IGFueSBwcml2YXRlIGRhdGEgaXQgdW5kZXJzdGFuZHMKLSAgICAgZnJvbSB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELiAgVGhpcyBpcyBkb25lIGxhc3QgdG8KLSAgICAgcGVybWl0IHRoZSByb3V0aW5lIHRvIGxvb2sgYXQgdGhlIGZpbHRlcmVkIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMKLSAgICAgaW1wb3J0YW50IGZvciB0aGUgRUNPRkYgY29kZSBhdCBsZWFzdC4gICovCi0gIGlmICghYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkpCi0gICAgewotICAgICAgbm9uX2ZhdGFsIChfKCIlczogZXJyb3IgY29weWluZyBwcml2YXRlIEJGRCBkYXRhOiAlcyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBzdGF0dXMgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogUmVhZCBlYWNoIGFyY2hpdmUgZWxlbWVudCBpbiB0dXJuIGZyb20gSUJGRCwgY29weSB0aGUKLSAgIGNvbnRlbnRzIHRvIHRlbXAgZmlsZSwgYW5kIGtlZXAgdGhlIHRlbXAgZmlsZSBoYW5kbGUuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9hcmNoaXZlIChpYmZkLCBvYmZkLCBvdXRwdXRfdGFyZ2V0KQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X3RhcmdldDsKLXsKLSAgc3RydWN0IG5hbWVfbGlzdAotICAgIHsKLSAgICAgIHN0cnVjdCBuYW1lX2xpc3QgKm5leHQ7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgYmZkICpvYmZkOwotICAgIH0gKmxpc3QsICpsOwotICBiZmQgKipwdHIgPSAmb2JmZC0+YXJjaGl2ZV9oZWFkOwotICBiZmQgKnRoaXNfZWxlbWVudDsKLSAgY2hhciAqZGlyID0gbWFrZV90ZW1wbmFtZSAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIC8qIE1ha2UgYSB0ZW1wIGRpcmVjdG9yeSB0byBob2xkIHRoZSBjb250ZW50cy4gICovCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotICBpZiAobWtkaXIgKGRpcikgIT0gMCkKLSNlbHNlCi0gIGlmIChta2RpciAoZGlyLCAwNzAwKSAhPSAwKQotI2VuZGlmCi0gICAgewotICAgICAgZmF0YWwgKF8oImNhbm5vdCBta2RpciAlcyBmb3IgYXJjaGl2ZSBjb3B5aW5nIChlcnJvcjogJXMpIiksCi0JICAgICBkaXIsIHN0cmVycm9yIChlcnJubykpOwotICAgIH0KLSAgb2JmZC0+aGFzX2FybWFwID0gaWJmZC0+aGFzX2FybWFwOwotCi0gIGxpc3QgPSBOVUxMOwotCi0gIHRoaXNfZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGliZmQsIE5VTEwpOwotICB3aGlsZSAoIXN0YXR1cyAmJiB0aGlzX2VsZW1lbnQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhbiBvdXRwdXQgZmlsZSBmb3IgdGhpcyBtZW1iZXIuICAqLwotICAgICAgY2hhciAqb3V0cHV0X25hbWUgPSBjb25jYXQgKGRpciwgIi8iLCBiZmRfZ2V0X2ZpbGVuYW1lICh0aGlzX2VsZW1lbnQpLAotCQkJCSAgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBiZmQgKm91dHB1dF9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9uYW1lLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGJmZCAqbGFzdF9lbGVtZW50OwotICAgICAgc3RydWN0IHN0YXQgYnVmOwotICAgICAgaW50IHN0YXRfc3RhdHVzID0gMDsKLQotICAgICAgaWYgKHByZXNlcnZlX2RhdGVzKQotCXsKLQkgIHN0YXRfc3RhdHVzID0gYmZkX3N0YXRfYXJjaF9lbHQgKHRoaXNfZWxlbWVudCwgJmJ1Zik7Ci0JICBpZiAoc3RhdF9zdGF0dXMgIT0gMCkKLQkgICAgbm9uX2ZhdGFsIChfKCJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIiksCi0JCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lICh0aGlzX2VsZW1lbnQpKTsKLQl9Ci0KLSAgICAgIGwgPSAoc3RydWN0IG5hbWVfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBuYW1lX2xpc3QpKTsKLSAgICAgIGwtPm5hbWUgPSBvdXRwdXRfbmFtZTsKLSAgICAgIGwtPm5leHQgPSBsaXN0OwotICAgICAgbGlzdCA9IGw7Ci0KLSAgICAgIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLQlSRVRVUk5fTk9ORkFUQUwgKG91dHB1dF9uYW1lKTsKLQotICAgICAgaWYgKCFiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2dldF9mb3JtYXQgKGliZmQpKSkKLQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHRoaXNfZWxlbWVudCwgYmZkX29iamVjdCkgPT0gdHJ1ZSkKLQljb3B5X29iamVjdCAodGhpc19lbGVtZW50LCBvdXRwdXRfYmZkKTsKLQotICAgICAgaWYgKCFiZmRfY2xvc2UgKG91dHB1dF9iZmQpKQotCXsKLQkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCkpOwotCSAgLyogRXJyb3IgaW4gbmV3IG9iamVjdCBmaWxlLiBEb24ndCBjaGFuZ2UgYXJjaGl2ZS4gKi8KLQkgIHN0YXR1cyA9IDE7Ci0JfQotCi0gICAgICBpZiAocHJlc2VydmVfZGF0ZXMgJiYgc3RhdF9zdGF0dXMgPT0gMCkKLQlzZXRfdGltZXMgKG91dHB1dF9uYW1lLCAmYnVmKTsKLQotICAgICAgLyogT3BlbiB0aGUgbmV3bHkgb3V0cHV0IGZpbGUgYW5kIGF0dGFjaCB0byBvdXIgbGlzdC4gICovCi0gICAgICBvdXRwdXRfYmZkID0gYmZkX29wZW5yIChvdXRwdXRfbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0KLSAgICAgIGwtPm9iZmQgPSBvdXRwdXRfYmZkOwotCi0gICAgICAqcHRyID0gb3V0cHV0X2JmZDsKLSAgICAgIHB0ciA9ICZvdXRwdXRfYmZkLT5uZXh0OwotCi0gICAgICBsYXN0X2VsZW1lbnQgPSB0aGlzX2VsZW1lbnQ7Ci0KLSAgICAgIHRoaXNfZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGliZmQsIGxhc3RfZWxlbWVudCk7Ci0KLSAgICAgIGJmZF9jbG9zZSAobGFzdF9lbGVtZW50KTsKLSAgICB9Ci0gICpwdHIgPSAoYmZkICopIE5VTEw7Ci0KLSAgaWYgKCFiZmRfY2xvc2UgKG9iZmQpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIGlmICghYmZkX2Nsb3NlIChpYmZkKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAvKiBEZWxldGUgYWxsIHRoZSBmaWxlcyB0aGF0IHdlIG9wZW5lZC4gICovCi0gIGZvciAobCA9IGxpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChsLT5vYmZkKTsKLSAgICAgIHVubGluayAobC0+bmFtZSk7Ci0gICAgfQotICBybWRpciAoZGlyKTsKLX0KLQotLyogVGhlIHRvcC1sZXZlbCBjb250cm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvcHlfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIG91dHB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KQotICAgICBjb25zdCBjaGFyICppbnB1dF9maWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICppbnB1dF90YXJnZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm91dHB1dF90YXJnZXQ7Ci17Ci0gIGJmZCAqaWJmZDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIC8qIFRvIGFsbG93IHVzIHRvIGRvICJzdHJpcCAqIiB3aXRob3V0IGR5aW5nIG9uIHRoZSBmaXJzdAotICAgICBub24tb2JqZWN0IGZpbGUsIGZhaWx1cmVzIGFyZSBub25mYXRhbC4gICovCi0KLSAgaWJmZCA9IGJmZF9vcGVuciAoaW5wdXRfZmlsZW5hbWUsIGlucHV0X3RhcmdldCk7Ci0gIGlmIChpYmZkID09IE5VTEwpCi0gICAgUkVUVVJOX05PTkZBVEFMIChpbnB1dF9maWxlbmFtZSk7Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGliZmQsIGJmZF9hcmNoaXZlKSkKLSAgICB7Ci0gICAgICBiZmQgKm9iZmQ7Ci0KLSAgICAgIC8qIGJmZF9nZXRfdGFyZ2V0IGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB1bnRpbAotICAgICAgICAgYmZkX2NoZWNrX2Zvcm1hdCBzdWNjZWVkcy4gICovCi0gICAgICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMKQotCW91dHB1dF90YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAoaWJmZCk7Ci0KLSAgICAgIG9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAob2JmZCA9PSBOVUxMKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9hcmNoaXZlIChpYmZkLCBvYmZkLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoaWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmQgKm9iZmQ7Ci0KLSAgICAgIC8qIGJmZF9nZXRfdGFyZ2V0IGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB1bnRpbAotICAgICAgICAgYmZkX2NoZWNrX2Zvcm1hdCBzdWNjZWVkcy4gICovCi0gICAgICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMKQotCW91dHB1dF90YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAoaWJmZCk7Ci0KLSAgICAgIG9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAob2JmZCA9PSBOVUxMKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9vYmplY3QgKGliZmQsIG9iZmQpOwotCi0gICAgICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCi0JUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfZmlsZW5hbWUpOwotCi0gICAgICBpZiAoIWJmZF9jbG9zZSAoaWJmZCkpCi0JUkVUVVJOX05PTkZBVEFMIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgICAKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgCi0gICAgICBzdGF0dXMgPSAxOwotICAgIH0KLX0KLQotLyogQ3JlYXRlIGEgc2VjdGlvbiBpbiBPQkZEIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgYXR0cmlidXRlcwotICAgYXMgSVNFQ1RJT04gaW4gSUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF9zZWN0aW9uIChpYmZkLCBpc2VjdGlvbiwgb2JmZGFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBzZWNfcHRyIGlzZWN0aW9uOwotICAgICBQVFIgb2JmZGFyZzsKLXsKLSAgYmZkICpvYmZkID0gKGJmZCAqKSBvYmZkYXJnOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBzZWNfcHRyIG9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfdm1hIGxtYTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGNoYXIgKmVycjsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0RFQlVHR0lORykgIT0gMAotICAgICAgJiYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0JICB8fCBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfQUxMCi0JICB8fCBjb252ZXJ0X2RlYnVnZ2luZykpCi0gICAgcmV0dXJuOwotCi0gIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pLCBmYWxzZSk7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgcC0+dXNlZCA9IHRydWU7Ci0KLSAgaWYgKHNlY3Rpb25zX3JlbW92ZWQgJiYgcCAhPSBOVUxMICYmIHAtPnJlbW92ZSkKLSAgICByZXR1cm47Ci0gIGlmIChzZWN0aW9uc19jb3BpZWQgJiYgKHAgPT0gTlVMTCB8fCAhIHAtPmNvcHkpKQotICAgIHJldHVybjsKLQotICBvc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChvYmZkLCBiZmRfc2VjdGlvbl9uYW1lIChpYmZkLCBpc2VjdGlvbikpOwotICAKLSAgaWYgKG9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgZXJyID0gIm1ha2luZyI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAoY29weV9ieXRlID49IDApCi0gICAgc2l6ZSA9IChzaXplICsgaW50ZXJsZWF2ZSAtIDEpIC8gaW50ZXJsZWF2ZTsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uLCBzaXplKSkKLSAgICB7Ci0gICAgICBlcnIgPSAic2l6ZSI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLSAgCi0gIHZtYSA9IGJmZF9zZWN0aW9uX3ZtYSAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAocCAhPSBOVUxMICYmIHAtPmNoYW5nZV92bWEgPT0gQ0hBTkdFX01PRElGWSkKLSAgICB2bWEgKz0gcC0+dm1hX3ZhbDsKLSAgZWxzZSBpZiAocCAhPSBOVUxMICYmIHAtPmNoYW5nZV92bWEgPT0gQ0hBTkdFX1NFVCkKLSAgICB2bWEgPSBwLT52bWFfdmFsOwotICBlbHNlCi0gICAgdm1hICs9IGNoYW5nZV9zZWN0aW9uX2FkZHJlc3M7Ci0gIAotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fdm1hIChvYmZkLCBvc2VjdGlvbiwgdm1hKSkKLSAgICB7Ci0gICAgICBlcnIgPSAidm1hIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIGxtYSA9IGlzZWN0aW9uLT5sbWE7Ci0gIGlmICgocCAhPSBOVUxMKSAmJiBwLT5jaGFuZ2VfbG1hICE9IENIQU5HRV9JR05PUkUpCi0gICAgewotICAgICAgaWYgKHAtPmNoYW5nZV9sbWEgPT0gQ0hBTkdFX01PRElGWSkKLQlsbWEgKz0gcC0+bG1hX3ZhbDsKLSAgICAgIGVsc2UgaWYgKHAtPmNoYW5nZV9sbWEgPT0gQ0hBTkdFX1NFVCkKLQlsbWEgPSBwLT5sbWFfdmFsOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLSAgZWxzZQotICAgIGxtYSArPSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzOwotICAKLSAgb3NlY3Rpb24tPmxtYSA9IGxtYTsKLQotICAvKiBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBub3QgZW5vdWdoLiAgSWYgd2UgY2hhbmdlIHRoZSBMTUEgd2UKLSAgICAgbWF5IGhhdmUgdG8gcmVjb21wdXRlIHRoZSBoZWFkZXIgZm9yIHRoZSBmaWxlIGFzIHdlbGwuICAqLwotICBpZiAoYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwKLQkJCQkgb3NlY3Rpb24sCi0JCQkJIGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaWJmZCwgaXNlY3Rpb24pKQotICAgICAgPT0gZmFsc2UpCi0gICAgewotICAgICAgZXJyID0gImFsaWdubWVudCI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAocCAhPSBOVUxMICYmIHAtPnNldF9mbGFncykKLSAgICBmbGFncyA9IHAtPmZsYWdzIHwgKGZsYWdzICYgU0VDX0hBU19DT05URU5UUyk7Ci0gIGlmICghYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBvc2VjdGlvbiwgZmxhZ3MpKQotICAgIHsKLSAgICAgIGVyciA9ICJmbGFncyI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICAvKiBUaGlzIHVzZWQgdG8gYmUgbWFuZ2xlX3NlY3Rpb247IHdlIGRvIGhlcmUgdG8gYXZvaWQgdXNpbmcKLSAgICAgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgc2luY2Ugc29tZSBmb3JtYXRzIGFsbG93IG11bHRpcGxlCi0gICAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZS4gICovCi0gIGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IG9zZWN0aW9uOwotICBpc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9IDA7Ci0KLSAgLyogQWxsb3cgdGhlIEJGRCBiYWNrZW5kIHRvIGNvcHkgYW55IHByaXZhdGUgZGF0YSBpdCB1bmRlcnN0YW5kcwotICAgICBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGlmICghYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikpCi0gICAgewotICAgICAgZXJyID0gInByaXZhdGUgZGF0YSI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICAvKiBBbGwgd2VudCB3ZWxsICovCi0gIHJldHVybjsKLQotbG9zZXI6Ci0gIG5vbl9mYXRhbCAoXygiJXM6IHNlY3Rpb24gYCVzJzogZXJyb3IgaW4gJXM6ICVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgICAgIGJmZF9zZWN0aW9uX25hbWUgKGliZmQsIGlzZWN0aW9uKSwKLQkgICAgIGVyciwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICBzdGF0dXMgPSAxOwotfQotCi0vKiBDb3B5IHRoZSBkYXRhIG9mIGlucHV0IHNlY3Rpb24gSVNFQ1RJT04gb2YgSUJGRAotICAgdG8gYW4gb3V0cHV0IHNlY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGluIE9CRkQuCi0gICBJZiBzdHJpcHBpbmcgdGhlbiBkb24ndCBjb3B5IGFueSByZWxvY2F0aW9uIGluZm8uICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9zZWN0aW9uIChpYmZkLCBpc2VjdGlvbiwgb2JmZGFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBzZWNfcHRyIGlzZWN0aW9uOwotICAgICBQVFIgb2JmZGFyZzsKLXsKLSAgYmZkICpvYmZkID0gKGJmZCAqKSBvYmZkYXJnOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIHNlY19wdHIgb3NlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgbG9uZyByZWxzaXplOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQgZWFybGllciBvbiwgZG8gbm90IGtlZXAgb24gZ2VuZXJhdGluZwotICAgICBjb21wbGFpbnRzIG5vdy4gICovCi0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICByZXR1cm47Ci0gIAotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0RFQlVHR0lORykgIT0gMAotICAgICAgJiYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0JICB8fCBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfQUxMCi0JICB8fCBjb252ZXJ0X2RlYnVnZ2luZykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKGJmZF9zZWN0aW9uX25hbWUgKGliZmQsIGlzZWN0aW9uKSwgZmFsc2UpOwotCi0gIGlmIChzZWN0aW9uc19yZW1vdmVkICYmIHAgIT0gTlVMTCAmJiBwLT5yZW1vdmUpCi0gICAgcmV0dXJuOwotICBpZiAoc2VjdGlvbnNfY29waWVkICYmIChwID09IE5VTEwgfHwgISBwLT5jb3B5KSkKLSAgICByZXR1cm47Ci0KLSAgb3NlY3Rpb24gPSBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGlzZWN0aW9uKTsKLQotICBpZiAoc2l6ZSA9PSAwIHx8IG9zZWN0aW9uID09IDApCi0gICAgcmV0dXJuOwotCi0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGliZmQsIGlzZWN0aW9uKTsKLSAgaWYgKHJlbHNpemUgPCAwKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAKLSAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICBiZmRfc2V0X3JlbG9jIChvYmZkLCBvc2VjdGlvbiwgKGFyZWxlbnQgKiopIE5VTEwsIDApOwotICBlbHNlCi0gICAgewotICAgICAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gICAgICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGliZmQsIGlzZWN0aW9uLCByZWxwcCwgaXN5bXBwKTsKLSAgICAgIGlmIChyZWxjb3VudCA8IDApCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICAKLSAgICAgIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTCkKLQl7Ci0JICAvKiBSZW1vdmUgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIG5vdCBpbgotCSAgICAga2VlcF9zdHJpcF9zcGVjaWZpY19saXN0LiAqLwotCSAgYXJlbGVudCAqKnRlbXBfcmVscHA7Ci0JICBsb25nIHRlbXBfcmVsY291bnQgPSAwOwotCSAgbG9uZyBpOwotCSAgCi0JICB0ZW1wX3JlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotCSAgZm9yIChpID0gMDsgaSA8IHJlbGNvdW50OyBpKyspCi0JICAgIGlmIChpc19zcGVjaWZpZWRfc3ltYm9sCi0JCShiZmRfYXN5bWJvbF9uYW1lICgqcmVscHAgW2ldLT5zeW1fcHRyX3B0ciksCi0JCSBrZWVwX3NwZWNpZmljX2xpc3QpKQotCSAgICAgIHRlbXBfcmVscHAgW3RlbXBfcmVsY291bnQrK10gPSByZWxwcCBbaV07Ci0JICByZWxjb3VudCA9IHRlbXBfcmVsY291bnQ7Ci0JICBmcmVlIChyZWxwcCk7Ci0JICByZWxwcCA9IHRlbXBfcmVscHA7Ci0JfQotICAgICAgYmZkX3NldF9yZWxvYyAob2JmZCwgb3NlY3Rpb24sCi0JCSAgICAgKHJlbGNvdW50ID09IDAgPyAoYXJlbGVudCAqKikgTlVMTCA6IHJlbHBwKSwgcmVsY291bnQpOwotICAgIH0KLSAgCi0gIGlzZWN0aW9uLT5fY29va2VkX3NpemUgPSBpc2VjdGlvbi0+X3Jhd19zaXplOwotICBpc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0hBU19DT05URU5UUykKLSAgICB7Ci0gICAgICBQVFIgbWVtaHVuayA9IChQVFIpIHhtYWxsb2MgKCh1bnNpZ25lZCkgc2l6ZSk7Ci0KLSAgICAgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpYmZkLCBpc2VjdGlvbiwgbWVtaHVuaywgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgc2l6ZSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgICAgIGlmIChjb3B5X2J5dGUgPj0gMCkgCi0JZmlsdGVyX2J5dGVzIChtZW1odW5rLCAmc2l6ZSk7Ci0KLSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBvc2VjdGlvbiwgbWVtaHVuaywgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgc2l6ZSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgICAgIGZyZWUgKG1lbWh1bmspOwotICAgIH0KLSAgZWxzZSBpZiAocCAhPSBOVUxMICYmIHAtPnNldF9mbGFncyAmJiAocC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotICAgIHsKLSAgICAgIFBUUiBtZW1odW5rID0gKFBUUikgeG1hbGxvYyAoKHVuc2lnbmVkKSBzaXplKTsKLQotICAgICAgLyogV2UgZG9uJ3QgcGVybWl0IHRoZSB1c2VyIHRvIHR1cm4gb2ZmIHRoZSBTRUNfSEFTX0NPTlRFTlRTCi0JIGZsYWctLXRoZXkgY2FuIGp1c3QgcmVtb3ZlIHRoZSBzZWN0aW9uIGVudGlyZWx5IGFuZCBhZGQgaXQKLQkgYmFjayBhZ2Fpbi4gIEhvd2V2ZXIsIHdlIGRvIHBlcm1pdCB0aGVtIHRvIHR1cm4gb24gdGhlCi0JIFNFQ19IQVNfQ09OVEVOVFMgZmxhZywgYW5kIHRha2UgaXQgdG8gbWVhbiB0aGF0IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzIHNob3VsZCBiZSB6ZXJvZWQgb3V0LiAgKi8KLQotICAgICAgbWVtc2V0IChtZW1odW5rLCAwLCBzaXplKTsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgb3NlY3Rpb24sIG1lbWh1bmssIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBzaXplKSkKLQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgICAgIGZyZWUgKG1lbWh1bmspOwotICAgIH0KLX0KLQotLyogR2V0IGFsbCB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHVzZWQgd2hlbiAtLWdhcC1maWxsIG9yIC0tcGFkLXRvIGlzCi0gICB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdldF9zZWN0aW9ucyAob2JmZCwgb3NlY3Rpb24sIHNlY3BwcGFyZykKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjdGlvbjsKLSAgICAgUFRSIHNlY3BwcGFyZzsKLXsKLSAgYXNlY3Rpb24gKioqc2VjcHBwID0gKGFzZWN0aW9uICoqKikgc2VjcHBwYXJnOwotCi0gICoqc2VjcHBwID0gb3NlY3Rpb247Ci0gICsrKCpzZWNwcHApOwotfQotCi0vKiBTb3J0IHNlY3Rpb25zIGJ5IFZNQS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydCwgYW5kIGlzIHVzZWQgd2hlbgotICAgLS1nYXAtZmlsbCBvciAtLXBhZC10byBpcyB1c2VkLiAgV2UgZm9yY2Ugbm9uIGxvYWRhYmxlIG9yIGVtcHR5Ci0gICBzZWN0aW9ucyB0byB0aGUgZnJvbnQsIHdoZXJlIHRoZXkgYXJlIGVhc2llciB0byBpZ25vcmUuICAqLwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3NlY3Rpb25fbG1hIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci17Ci0gIGNvbnN0IGFzZWN0aW9uICoqc2VjMSA9IChjb25zdCBhc2VjdGlvbiAqKikgYXJnMTsKLSAgY29uc3QgYXNlY3Rpb24gKipzZWMyID0gKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcyOwotICBmbGFnd29yZCBmbGFnczEsIGZsYWdzMjsKLQotICAvKiBTb3J0IG5vbiBsb2FkYWJsZSBzZWN0aW9ucyB0byB0aGUgZnJvbnQuICAqLwotICBmbGFnczEgPSAoKnNlYzEpLT5mbGFnczsKLSAgZmxhZ3MyID0gKCpzZWMyKS0+ZmxhZ3M7Ci0gIGlmICgoZmxhZ3MxICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotICAgICAgfHwgKGZsYWdzMSAmIFNFQ19MT0FEKSA9PSAwKQotICAgIHsKLSAgICAgIGlmICgoZmxhZ3MyICYgU0VDX0hBU19DT05URU5UUykgIT0gMAotCSAgJiYgKGZsYWdzMiAmIFNFQ19MT0FEKSAhPSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGZsYWdzMiAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgIHx8IChmbGFnczIgJiBTRUNfTE9BRCkgPT0gMCkKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogU29ydCBzZWN0aW9ucyBieSBMTUEuICAqLwotICBpZiAoKCpzZWMxKS0+bG1hID4gKCpzZWMyKS0+bG1hKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmICgoKnNlYzEpLT5sbWEgPCAoKnNlYzIpLT5sbWEpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFNvcnQgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBMTUEgYnkgc2l6ZS4gICovCi0gIGlmICgoKnNlYzEpLT5fcmF3X3NpemUgPiAoKnNlYzIpLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKCgqc2VjMSktPl9yYXdfc2l6ZSA8ICgqc2VjMiktPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE1hcmsgYWxsIHRoZSBzeW1ib2xzIHdoaWNoIHdpbGwgYmUgdXNlZCBpbiBvdXRwdXQgcmVsb2NhdGlvbnMgd2l0aAotICAgdGhlIEJTRl9LRUVQIGZsYWcgc28gdGhhdCB0aG9zZSBzeW1ib2xzIHdpbGwgbm90IGJlIHN0cmlwcGVkLgotCi0gICBJZ25vcmUgcmVsb2NhdGlvbnMgd2hpY2ggd2lsbCBub3QgYXBwZWFyIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1tYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyAoaWJmZCwgaXNlY3Rpb24sIHN5bWJvbHNhcmcpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgc2VjX3B0ciBpc2VjdGlvbjsKLSAgICAgUFRSIHN5bWJvbHNhcmc7Ci17Ci0gIGFzeW1ib2wgKipzeW1ib2xzID0gKGFzeW1ib2wgKiopIHN5bWJvbHNhcmc7Ci0gIGxvbmcgcmVsc2l6ZTsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50LCBpOwotCi0gIC8qIElnbm9yZSBhbiBpbnB1dCBzZWN0aW9uIHdpdGggbm8gY29ycmVzcG9uZGluZyBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGlmIChpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGliZmQsIGlzZWN0aW9uKTsKLSAgaWYgKHJlbHNpemUgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIGlmIChyZWxzaXplID09IDApCi0gICAgcmV0dXJuOwotCi0gIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGliZmQsIGlzZWN0aW9uLCByZWxwcCwgc3ltYm9scyk7Ci0gIGlmIChyZWxjb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgLyogRXhhbWluZSBlYWNoIHN5bWJvbCB1c2VkIGluIGEgcmVsb2NhdGlvbi4gIElmIGl0J3Mgbm90IG9uZSBvZiB0aGUKLSAgICAgc3BlY2lhbCBiZmQgc2VjdGlvbiBzeW1ib2xzLCB0aGVuIG1hcmsgaXQgd2l0aCBCU0ZfS0VFUC4gICovCi0gIGZvciAoaSA9IDA7IGkgPCByZWxjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICgqcmVscHBbaV0tPnN5bV9wdHJfcHRyICE9IGJmZF9jb21fc2VjdGlvbl9wdHItPnN5bWJvbAotCSAgJiYgKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciAhPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wKLQkgICYmICpyZWxwcFtpXS0+c3ltX3B0cl9wdHIgIT0gYmZkX3VuZF9zZWN0aW9uX3B0ci0+c3ltYm9sKQotCSgqcmVscHBbaV0tPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgfD0gQlNGX0tFRVA7Ci0gICAgfQotCi0gIGlmIChyZWxwcCAhPSBOVUxMKQotICAgIGZyZWUgKHJlbHBwKTsKLX0KLQotLyogV3JpdGUgb3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi13cml0ZV9kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSwgc3ltY291bnRwLCBzeW1wcHApCi0gICAgIGJmZCAqb2JmZDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGxvbmcgKnN5bWNvdW50cCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICoqKnN5bXBwcCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2llZWVfZmxhdm91cikKLSAgICByZXR1cm4gd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSk7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqc3ltcywgKnN0cmluZ3M7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN5bXNpemUsIHN0cmluZ3NpemU7Ci0gICAgICBhc2VjdGlvbiAqc3RhYnNlYywgKnN0YWJzdHJzZWM7Ci0KLSAgICAgIGlmICghIHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvIChvYmZkLCBkaGFuZGxlLCAmc3ltcywKLQkJCQkJCSAgICAmc3ltc2l6ZSwgJnN0cmluZ3MsCi0JCQkJCQkgICAgJnN0cmluZ3NpemUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3RhYnNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsICIuc3RhYiIpOwotICAgICAgc3RhYnN0cnNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsICIuc3RhYnN0ciIpOwotICAgICAgaWYgKHN0YWJzZWMgPT0gTlVMTAotCSAgfHwgc3RhYnN0cnNlYyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBzdGFic2VjLCBzeW1zaXplKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgc3RhYnN0cnNlYywgc3RyaW5nc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgc3RhYnNlYywgMikKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgc3RhYnN0cnNlYywgMCkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBzdGFic2VjLAotCQkJCSAgIChTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJICAgIHwgU0VDX0RFQlVHR0lORykpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgc3RhYnN0cnNlYywKLQkJCQkgICAgICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgICB8IFNFQ19ERUJVR0dJTkcpKSkKLQl7Ci0JICBub25fZmF0YWwgKF8oIiVzOiBjYW4ndCBjcmVhdGUgZGVidWdnaW5nIHNlY3Rpb246ICVzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgY2FuIGdldCBhd2F5IHdpdGggc2V0dGluZyB0aGUgc2VjdGlvbiBjb250ZW50cyBub3cgYmVjYXVzZQotICAgICAgICAgdGhlIG5leHQgdGhpbmcgdGhlIGNhbGxlciBpcyBnb2luZyB0byBkbyBpcyBjb3B5IG92ZXIgdGhlCi0gICAgICAgICByZWFsIHNlY3Rpb25zLiAgV2UgbWF5IHNvbWVkYXkgaGF2ZSB0byBzcGxpdCB0aGUgY29udGVudHMKLSAgICAgICAgIHNldHRpbmcgb3V0IG9mIHRoaXMgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBzdGFic2VjLCBzeW1zLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgc3ltc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBzdGFic3Ryc2VjLCBzdHJpbmdzLAotCQkJCQkgKGZpbGVfcHRyKSAwLCBzdHJpbmdzaXplKSkKLQl7Ci0JICBub25fZmF0YWwgKF8oIiVzOiBjYW4ndCBzZXQgZGVidWdnaW5nIHNlY3Rpb24gY29udGVudHM6ICVzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG5vbl9mYXRhbCAoXygiJXM6IGRvbid0IGtub3cgaG93IHRvIHdyaXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgJXMiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob2JmZCkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLXN0cmlwX21haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0gIGNoYXIgKmlucHV0X3RhcmdldCA9IE5VTEwsICpvdXRwdXRfdGFyZ2V0ID0gTlVMTDsKLSAgYm9vbGVhbiBzaG93X3ZlcnNpb24gPSBmYWxzZTsKLSAgaW50IGMsIGk7Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0gIGNoYXIgKm91dHB1dF9maWxlID0gTlVMTDsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIkk6TzpGOks6TjpSOm86c1NwZ3hYVnYiLAotCQkJICAgc3RyaXBfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnSSc6Ci0JICBpbnB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIGlucHV0X3RhcmdldCA9IG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAob3B0YXJnLCB0cnVlKTsKLQkgIHAtPnJlbW92ZSA9IHRydWU7Ci0JICBzZWN0aW9uc19yZW1vdmVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0FMTDsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCWNhc2UgJ2cnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0RFQlVHOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RSSVBfVU5ORUVERUQ6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfVU5ORUVERUQ7Ci0JICBicmVhazsKLQljYXNlICdLJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmtlZXBfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJnN0cmlwX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBvdXRwdXRfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgcHJlc2VydmVfZGF0ZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19BTEw7Ci0JICBicmVhazsKLQljYXNlICdYJzoKLQkgIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX1NUQVJUX0w7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBzaG93X3ZlcnNpb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KLQljYXNlICdoJzoKLQkgIHN0cmlwX3VzYWdlIChzdGRvdXQsIDApOwotCWRlZmF1bHQ6Ci0JICBzdHJpcF91c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoInN0cmlwIik7Ci0KLSAgLyogRGVmYXVsdCBpcyB0byBzdHJpcCBhbGwgc3ltYm9scy4gICovCi0gIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOREVGCi0gICAgICAmJiBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfVU5ERUYKLSAgICAgICYmIHN0cmlwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCkKLSAgICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfQUxMOwotCi0gIGlmIChvdXRwdXRfdGFyZ2V0ID09IChjaGFyICopIE5VTEwpCi0gICAgb3V0cHV0X3RhcmdldCA9IGlucHV0X3RhcmdldDsKLQotICBpID0gb3B0aW5kOwotICBpZiAoaSA9PSBhcmdjCi0gICAgICB8fCAob3V0cHV0X2ZpbGUgIT0gTlVMTCAmJiAoaSArIDEpIDwgYXJnYykpCi0gICAgc3RyaXBfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLSAgZm9yICg7IGkgPCBhcmdjOyBpKyspCi0gICAgewotICAgICAgaW50IGhvbGRfc3RhdHVzID0gc3RhdHVzOwotICAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICAgIGNoYXIgKnRtcG5hbWU7Ci0KLSAgICAgIGlmIChwcmVzZXJ2ZV9kYXRlcykKLQl7Ci0JICBpZiAoc3RhdCAoYXJndltpXSwgJnN0YXRidWYpIDwgMCkKLQkgICAgewotCSAgICAgIG5vbl9mYXRhbCAoXygiJXM6IGNhbm5vdCBzdGF0OiAlcyIpLCBhcmd2W2ldLCBzdHJlcnJvciAoZXJybm8pKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKG91dHB1dF9maWxlICE9IE5VTEwpCi0JdG1wbmFtZSA9IG91dHB1dF9maWxlOwotICAgICAgZWxzZQotCXRtcG5hbWUgPSBtYWtlX3RlbXBuYW1lIChhcmd2W2ldKTsKLSAgICAgIHN0YXR1cyA9IDA7Ci0KLSAgICAgIGNvcHlfZmlsZSAoYXJndltpXSwgdG1wbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQl7Ci0JICBpZiAocHJlc2VydmVfZGF0ZXMpCi0JICAgIHNldF90aW1lcyAodG1wbmFtZSwgJnN0YXRidWYpOwotCSAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0JICAgIHNtYXJ0X3JlbmFtZSAodG1wbmFtZSwgYXJndltpXSwgcHJlc2VydmVfZGF0ZXMpOwotCSAgc3RhdHVzID0gaG9sZF9zdGF0dXM7Ci0JfQotICAgICAgZWxzZQotCXVubGluayAodG1wbmFtZSk7Ci0gICAgICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkKLQlmcmVlICh0bXBuYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcHlfbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgY2hhciAqaW5wdXRfZmlsZW5hbWUgPSBOVUxMLCAqb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLSAgY2hhciAqaW5wdXRfdGFyZ2V0ID0gTlVMTCwgKm91dHB1dF90YXJnZXQgPSBOVUxMOwotICBib29sZWFuIHNob3dfdmVyc2lvbiA9IGZhbHNlOwotICBib29sZWFuIGNoYW5nZV93YXJuID0gdHJ1ZTsKLSAgaW50IGM7Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJiOmk6STpqOks6TjpzOk86ZDpGOkw6UjpTcGd4WFZ2VzoiLAotCQkJICAgY29weV9vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdiJzoKLQkgIGNvcHlfYnl0ZSA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAoY29weV9ieXRlIDwgMCkKLQkgICAgZmF0YWwgKF8oImJ5dGUgbnVtYmVyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIikpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBpbnRlcmxlYXZlID0gYXRvaSAob3B0YXJnKTsKLQkgIGlmIChpbnRlcmxlYXZlIDwgMSkKLQkgICAgZmF0YWwgKF8oImludGVybGVhdmUgbXVzdCBiZSBwb3NpdGl2ZSIpKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCWNhc2UgJ3MnOgkJLyogInNvdXJjZSIgLSAnSScgaXMgcHJlZmVycmVkICovCi0JICBpbnB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQljYXNlICdkJzoJCS8qICJkZXN0aW5hdGlvbiIgLSAnTycgaXMgcHJlZmVycmVkICovCi0JICBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnRic6Ci0JICBpbnB1dF90YXJnZXQgPSBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG9wdGFyZywgdHJ1ZSk7Ci0JICBpZiAocC0+cmVtb3ZlKQotCSAgICBmYXRhbCAoXygiJXMgYm90aCBjb3BpZWQgYW5kIHJlbW92ZWQiKSwgb3B0YXJnKTsKLQkgIHAtPmNvcHkgPSB0cnVlOwotCSAgc2VjdGlvbnNfY29waWVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChvcHRhcmcsIHRydWUpOwotCSAgaWYgKHAtPmNvcHkpCi0JICAgIGZhdGFsIChfKCIlcyBib3RoIGNvcGllZCBhbmQgcmVtb3ZlZCIpLCBvcHRhcmcpOwotCSAgcC0+cmVtb3ZlID0gdHJ1ZTsKLQkgIHNlY3Rpb25zX3JlbW92ZWQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfQUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfREVCVUc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVFJJUF9VTk5FRURFRDoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9VTk5FRURFRDsKLQkgIGJyZWFrOwotCWNhc2UgJ0snOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAma2VlcF9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAmc3RyaXBfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmxvY2FsaXplX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnVyc6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZ3ZWFrZW5fc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIHByZXNlcnZlX2RhdGVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfQUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19TVEFSVF9MOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dFQUtFTjoKLQkgIHdlYWtlbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9BRERfU0VDVElPTjoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqczsKLQkgICAgc3RydWN0IHN0YXQgc3Q7Ci0JICAgIHN0cnVjdCBzZWN0aW9uX2FkZCAqcGE7Ci0JICAgIGludCBsZW47Ci0JICAgIGNoYXIgKm5hbWU7Ci0JICAgIEZJTEUgKmY7Ci0KLQkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnPScpOwotCSAgICAKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgLS1hZGQtc2VjdGlvbiBOQU1FPUZJTEVOQU1FIikpOwotCi0JICAgIGlmIChzdGF0IChzICsgMSwgJiBzdCkgPCAwKQotCSAgICAgIGZhdGFsIChfKCJjYW5ub3Qgc3RhdDogJXM6ICVzIiksIHMgKyAxLCBzdHJlcnJvciAoZXJybm8pKTsKLQotCSAgICBwYSA9IChzdHJ1Y3Qgc2VjdGlvbl9hZGQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9hZGQpKTsKLQotCSAgICBsZW4gPSBzIC0gb3B0YXJnOwotCSAgICBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0JICAgIHN0cm5jcHkgKG5hbWUsIG9wdGFyZywgbGVuKTsKLQkgICAgbmFtZVtsZW5dID0gJ1wwJzsKLQkgICAgcGEtPm5hbWUgPSBuYW1lOwotCi0JICAgIHBhLT5maWxlbmFtZSA9IHMgKyAxOwotCi0JICAgIHBhLT5zaXplID0gc3Quc3Rfc2l6ZTsKLQotCSAgICBwYS0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAocGEtPnNpemUpOwotCSAgICBmID0gZm9wZW4gKHBhLT5maWxlbmFtZSwgRk9QRU5fUkIpOwotCSAgICAKLQkgICAgaWYgKGYgPT0gTlVMTCkKLQkgICAgICBmYXRhbCAoXygiY2Fubm90IG9wZW46ICVzOiAlcyIpLCBwYS0+ZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCSAgICAKLQkgICAgaWYgKGZyZWFkIChwYS0+Y29udGVudHMsIDEsIHBhLT5zaXplLCBmKSA9PSAwCi0JCXx8IGZlcnJvciAoZikpCi0JICAgICAgZmF0YWwgKF8oIiVzOiBmcmVhZCBmYWlsZWQiKSwgcGEtPmZpbGVuYW1lKTsKLQotCSAgICBmY2xvc2UgKGYpOwotCi0JICAgIHBhLT5uZXh0ID0gYWRkX3NlY3Rpb25zOwotCSAgICBhZGRfc2VjdGlvbnMgPSBwYTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9TVEFSVDoKLQkgIGNoYW5nZV9zdGFydCA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1jaGFuZ2Utc3RhcnQiKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BOgotCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQToKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqczsKLQkgICAgaW50IGxlbjsKLQkgICAgY2hhciAqbmFtZTsKLQkgICAgY2hhciAqb3B0aW9uID0gTlVMTDsKLQkgICAgYmZkX3ZtYSB2YWw7Ci0JICAgIGVudW0gY2hhbmdlX2FjdGlvbiB3aGF0ID0gQ0hBTkdFX0lHTk9SRTsKLQkgICAgCi0JICAgIHN3aXRjaCAoYykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUzoKLQkJb3B0aW9uID0gIi0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcyI7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQToKLQkJb3B0aW9uID0gIi0tY2hhbmdlLXNlY3Rpb24tbG1hIjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BOgotCQlvcHRpb24gPSAiLS1jaGFuZ2Utc2VjdGlvbi12bWEiOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIAotCSAgICBzID0gc3RyY2hyIChvcHRhcmcsICc9Jyk7Ci0JICAgIGlmIChzID09IE5VTEwpCi0JICAgICAgewotCQlzID0gc3RyY2hyIChvcHRhcmcsICcrJyk7Ci0JCWlmIChzID09IE5VTEwpCi0JCSAgewotCQkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnLScpOwotCQkgICAgaWYgKHMgPT0gTlVMTCkKLQkJICAgICAgZmF0YWwgKF8oImJhZCBmb3JtYXQgZm9yICVzIiksIG9wdGlvbik7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBsZW4gPSBzIC0gb3B0YXJnOwotCSAgICBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0JICAgIHN0cm5jcHkgKG5hbWUsIG9wdGFyZywgbGVuKTsKLQkgICAgbmFtZVtsZW5dID0gJ1wwJzsKLQotCSAgICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG5hbWUsIHRydWUpOwotCi0JICAgIHZhbCA9IHBhcnNlX3ZtYSAocyArIDEsIG9wdGlvbik7Ci0KLQkgICAgc3dpdGNoICgqcykKLQkgICAgICB7Ci0JICAgICAgY2FzZSAnPSc6IHdoYXQgPSBDSEFOR0VfU0VUOyBicmVhazsKLQkgICAgICBjYXNlICctJzogdmFsICA9IC0gdmFsOyAvKiBEcm9wIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJysnOiB3aGF0ID0gQ0hBTkdFX01PRElGWTsgYnJlYWs7Ci0JICAgICAgfQotCSAgICAKLQkgICAgc3dpdGNoIChjKQotCSAgICAgIHsKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTOgotCQlwLT5jaGFuZ2Vfdm1hID0gd2hhdDsKLQkJcC0+dm1hX3ZhbCAgICA9IHZhbDsKLQkJLyogRHJvcCB0aHJvdWdoLiAgKi8KLQkJCi0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BOgotCQlwLT5jaGFuZ2VfbG1hID0gd2hhdDsKLQkJcC0+bG1hX3ZhbCAgICA9IHZhbDsKLQkJYnJlYWs7Ci0JCQotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQToKLQkJcC0+Y2hhbmdlX3ZtYSA9IHdoYXQ7Ci0JCXAtPnZtYV92YWwgICAgPSB2YWw7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9BRERSRVNTRVM6Ci0JICBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLWNoYW5nZS1hZGRyZXNzZXMiKTsKLQkgIGNoYW5nZV9zdGFydCA9IGNoYW5nZV9zZWN0aW9uX2FkZHJlc3M7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DSEFOR0VfV0FSTklOR1M6Ci0JICBjaGFuZ2Vfd2FybiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSOgotCSAgY2hhbmdlX2xlYWRpbmdfY2hhciA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERUJVR0dJTkc6Ci0JICBjb252ZXJ0X2RlYnVnZ2luZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9HQVBfRklMTDoKLQkgIHsKLQkgICAgYmZkX3ZtYSBnYXBfZmlsbF92bWE7Ci0KLQkgICAgZ2FwX2ZpbGxfdm1hID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLWdhcC1maWxsIik7Ci0JICAgIGdhcF9maWxsID0gKGJmZF9ieXRlKSBnYXBfZmlsbF92bWE7Ci0JICAgIGlmICgoYmZkX3ZtYSkgZ2FwX2ZpbGwgIT0gZ2FwX2ZpbGxfdm1hKQotCSAgICAgIHsKLQkJY2hhciBidWZmWzIwXTsKLQkJCi0JCXNwcmludGZfdm1hIChidWZmLCBnYXBfZmlsbF92bWEpOwotCQkKLQkJbm9uX2ZhdGFsIChfKCJXYXJuaW5nOiB0cnVuY2F0aW5nIGdhcC1maWxsIGZyb20gMHglcyB0byAweCV4IiksCi0JCQkgICBidWZmLCBnYXBfZmlsbCk7Ci0JICAgICAgfQotCSAgICBnYXBfZmlsbF9zZXQgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTOgotCSAgY2hhbmdlX3dhcm4gPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1BBRF9UTzoKLQkgIHBhZF90byA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1wYWQtdG8iKTsKLQkgIHBhZF90b19zZXQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUjoKLQkgIHJlbW92ZV9sZWFkaW5nX2NoYXIgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU0VUX1NFQ1RJT05fRkxBR1M6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIGludCBsZW47Ci0JICAgIGNoYXIgKm5hbWU7Ci0KLQkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnPScpOwotCSAgICBpZiAocyA9PSBOVUxMKQotCSAgICAgIGZhdGFsIChfKCJiYWQgZm9ybWF0IGZvciAtLXNldC1zZWN0aW9uLWZsYWdzIikpOwotCi0JICAgIGxlbiA9IHMgLSBvcHRhcmc7Ci0JICAgIG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgICAgc3RybmNweSAobmFtZSwgb3B0YXJnLCBsZW4pOwotCSAgICBuYW1lW2xlbl0gPSAnXDAnOwotCi0JICAgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAobmFtZSwgdHJ1ZSk7Ci0KLQkgICAgcC0+c2V0X2ZsYWdzID0gdHJ1ZTsKLQkgICAgcC0+ZmxhZ3MgPSBwYXJzZV9mbGFncyAocyArIDEpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU0VUX1NUQVJUOgotCSAgc2V0X3N0YXJ0ID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLXNldC1zdGFydCIpOwotCSAgc2V0X3N0YXJ0X3NldCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDA6Ci0JICBicmVhazsJCS8qIHdlJ3ZlIGJlZW4gZ2l2ZW4gYSBsb25nIG9wdGlvbiAqLwotCWNhc2UgJ2gnOgotCSAgY29weV91c2FnZSAoc3Rkb3V0LCAwKTsKLQlkZWZhdWx0OgotCSAgY29weV91c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoIm9iamNvcHkiKTsKLQotICBpZiAoY29weV9ieXRlID49IGludGVybGVhdmUpCi0gICAgZmF0YWwgKF8oImJ5dGUgbnVtYmVyIG11c3QgYmUgbGVzcyB0aGFuIGludGVybGVhdmUiKSk7Ci0KLSAgaWYgKG9wdGluZCA9PSBhcmdjIHx8IG9wdGluZCArIDIgPCBhcmdjKQotICAgIGNvcHlfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLSAgaW5wdXRfZmlsZW5hbWUgPSBhcmd2W29wdGluZF07Ci0gIGlmIChvcHRpbmQgKyAxIDwgYXJnYykKLSAgICBvdXRwdXRfZmlsZW5hbWUgPSBhcmd2W29wdGluZCArIDFdOwotCi0gIC8qIERlZmF1bHQgaXMgdG8gc3RyaXAgbm8gc3ltYm9scy4gICovCi0gIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOREVGICYmIGRpc2NhcmRfbG9jYWxzID09IExPQ0FMU19VTkRFRikKLSAgICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfTk9ORTsKLQotICBpZiAob3V0cHV0X3RhcmdldCA9PSAoY2hhciAqKSBOVUxMKQotICAgIG91dHB1dF90YXJnZXQgPSBpbnB1dF90YXJnZXQ7Ci0KLSAgaWYgKHByZXNlcnZlX2RhdGVzKQotICAgIHsKLSAgICAgIGlmIChzdGF0IChpbnB1dF9maWxlbmFtZSwgJnN0YXRidWYpIDwgMCkKLQlmYXRhbCAoXygiQ2Fubm90IHN0YXQ6ICVzOiAlcyIpLCBpbnB1dF9maWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIG5vIGRlc3RpbmF0aW9uIGZpbGUgdGhlbiBjcmVhdGUgYSB0ZW1wIGFuZCByZW5hbWUKLSAgICAgdGhlIHJlc3VsdCBpbnRvIHRoZSBpbnB1dC4gICovCi0KLSAgaWYgKG91dHB1dF9maWxlbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnRtcG5hbWUgPSBtYWtlX3RlbXBuYW1lIChpbnB1dF9maWxlbmFtZSk7Ci0KLSAgICAgIGNvcHlfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIHRtcG5hbWUsIGlucHV0X3RhcmdldCwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAoc3RhdHVzID09IDApCi0JewkKLQkgIGlmIChwcmVzZXJ2ZV9kYXRlcykKLQkgICAgc2V0X3RpbWVzICh0bXBuYW1lLCAmc3RhdGJ1Zik7Ci0JICBzbWFydF9yZW5hbWUgKHRtcG5hbWUsIGlucHV0X2ZpbGVuYW1lLCBwcmVzZXJ2ZV9kYXRlcyk7Ci0JfQotICAgICAgZWxzZQotCXVubGluayAodG1wbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29weV9maWxlIChpbnB1dF9maWxlbmFtZSwgb3V0cHV0X2ZpbGVuYW1lLCBpbnB1dF90YXJnZXQsIG91dHB1dF90YXJnZXQpOwotICAgICAgaWYgKHN0YXR1cyA9PSAwICYmIHByZXNlcnZlX2RhdGVzKQotCXNldF90aW1lcyAob3V0cHV0X2ZpbGVuYW1lLCAmc3RhdGJ1Zik7Ci0gICAgfQotCi0gIGlmIChjaGFuZ2Vfd2FybikKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBjaGFuZ2Vfc2VjdGlvbnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKCEgcC0+dXNlZCkKLQkgICAgewotCSAgICAgIGlmIChwLT5jaGFuZ2Vfdm1hICE9IENIQU5HRV9JR05PUkUpCi0JCXsKLQkJICBjaGFyIGJ1ZmYgWzIwXTsKLQotCQkgIHNwcmludGZfdm1hIChidWZmLCBwLT52bWFfdmFsKTsKLQkJICAKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIG5vbl9mYXRhbCAoXygiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi12bWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIpLAotCQkJICAgICBwLT5uYW1lLAotCQkJICAgICBwLT5jaGFuZ2Vfdm1hID09IENIQU5HRV9TRVQgPyAnPScgOiAnKycsCi0JCQkgICAgIGJ1ZmYpOwotCQl9Ci0JICAgICAgCi0JICAgICAgaWYgKHAtPmNoYW5nZV9sbWEgIT0gQ0hBTkdFX0lHTk9SRSkKLQkJewotCQkgIGNoYXIgYnVmZiBbMjBdOwotCi0JCSAgc3ByaW50Zl92bWEgKGJ1ZmYsIHAtPmxtYV92YWwpOwotCQkgIAotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgbm9uX2ZhdGFsIChfKCJXYXJuaW5nOiAtLWNoYW5nZS1zZWN0aW9uLWxtYSAlcyVjMHglcyBuZXZlciB1c2VkIiksCi0JCQkgICAgIHAtPm5hbWUsCi0JCQkgICAgIHAtPmNoYW5nZV9sbWEgPT0gQ0hBTkdFX1NFVCA/ICc9JyA6ICcrJywKLQkJCSAgICAgYnVmZik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgU1RBUlRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSwgMCk7Ci0KLSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX1VOREVGOwotICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19VTkRFRjsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICBpZiAoaXNfc3RyaXAgPCAwKQotICAgIHsKLSAgICAgIGludCBpID0gc3RybGVuIChwcm9ncmFtX25hbWUpOwotICAgICAgaXNfc3RyaXAgPSAoaSA+PSA1ICYmIHN0cmNtcCAocHJvZ3JhbV9uYW1lICsgaSAtIDUsICJzdHJpcCIpID09IDApOwotICAgIH0KLQotICBpZiAoaXNfc3RyaXApCi0gICAgc3RyaXBfbWFpbiAoYXJnYywgYXJndik7Ci0gIGVsc2UKLSAgICBjb3B5X21haW4gKGFyZ2MsIGFyZ3YpOwotCi0gIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvb2JqZHVtcC4xIGIvYmludXRpbHMvb2JqZHVtcC4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGMxNTNlLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL29iamR1bXAuMQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggb2JqZHVtcCAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1vYmpkdW1wIFwtIGRpc3BsYXkgaW5mb3JtYXRpb24gZnJvbSBvYmplY3QgZmlsZXMuCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBvYmpkdW1wCi0uUkIgIltcfCIgXC1hIHwgXC1cLWFyY2hpdmVcLWhlYWRlcnMgIlx8XSIgCi0uUkIgIltcfCIgIlwtYlwgIlxjCi0uSSBiZmRuYW1lXGMKLS5SQiAiIHwgIiAiXC1cLXRhcmdldD0iXGMKLS5JIGJmZG5hbWVcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1DIHwgXC1cLWRlbWFuZ2xlICJcfF0iIAotLlJCICJbXHwiIFwtXC1kZWJ1Z2dpbmcgIlx8XSIgCi0uUkIgIltcfCIgXC1kIHwgXC1cLWRpc2Fzc2VtYmxlICJcfF0iIAotLlJCICJbXHwiIFwtRCB8IFwtXC1kaXNhc3NlbWJsZS1hbGwgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWRpc2Fzc2VtYmxlXC16ZXJvZXMgIlx8XSIgCi0uUkIgIltcfCIgXC1FQiB8IFwtRUwgfCBcLVwtZW5kaWFuPVxjCi0uSSB7YmlnfGxpdHRsZX1cYwotXCZcfF0KLS5SQiAiW1x8IiBcLWYgfCBcLVwtZmlsZVwtaGVhZGVycyAiXHxdIgotLlJCICJbXHwiIFwtaCB8IFwtXC1zZWN0aW9uXC1oZWFkZXJzCi0uUkIgInwgIiBcLVwtaGVhZGVycyAiXHxdIiAKLS5SQiAiW1x8IiBcLWkgfCBcLVwtaW5mbyAiXHxdIiAKLS5SQiAiW1x8IiAiXC1qXCAiXGMKLS5JIHNlY3Rpb25cYwotLlJCICIgfCAiICJcLVwtc2VjdGlvbj0iXGMKLS5JIHNlY3Rpb25cYwotXCZcfF0gCi0uUkIgIltcfCIgXC1sIHwgXC1cLWxpbmVcLW51bWJlcnMgIlx8XSIKLS5SQiAiW1x8IiAiXC1tXCAiXGMKLS5JIG1hY2hpbmVcYwotLlJCICIgfCAiICJcLVwtYXJjaGl0ZWN0dXJlPSJcYwotLkkgbWFjaGluZVxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLXAgfCBcLVwtcHJpdmF0ZVwtaGVhZGVycyAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtcHJlZml4XC1hZGRyZXNzZXMgIlx8XSIgCi0uUkIgIltcfCIgXC1yIHwgXC1cLXJlbG9jICJcfF0iIAotLlJCICJbXHwiIFwtUiB8IFwtXC1keW5hbWljXC1yZWxvYyAiXHxdIiAKLS5SQiAiW1x8IiBcLXMgfCBcLVwtZnVsbFwtY29udGVudHMgIlx8XSIKLS5SQiAiW1x8IiBcLVMgfCBcLVwtc291cmNlICJcfF0iCi0uUkIgIltcfCIgXC1cLVtub1wtXXNob3dcLXJhd1wtaW5zbiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtc3RhYnMgIlx8XSIKLS5SQiAiW1x8IiBcLXQgfCBcLVwtc3ltcyAiXHxdIiAKLS5SQiAiW1x8IiBcLVQgfCBcLVwtZHluYW1pY1wtc3ltcyAiXHxdIiAKLS5SQiAiW1x8IiBcLXggfCBcLVwtYWxsXC1oZWFkZXJzICJcfF0iCi0uUkIgIltcfCIgIlwtXC1zdGFydFwtYWRkcmVzcz0iXGMKLS5JIGFkZHJlc3NcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1cLXN0b3BcLWFkZHJlc3M9IlxjCi0uSSBhZGRyZXNzXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtXC1hZGp1c3RcLXZtYT0iXGMKLS5JIG9mZnNldFxjCi1cJlx8XQotLlJCICJbXHwiIFwtXC12ZXJzaW9uICJcfF0iCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKLS5JIG9iamZpbGVcYwotXCYuXHwuXHwuCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotXGMKLS5CIG9iamR1bXBcYwotXCYgZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgb2JqZWN0IGZpbGVzLgotVGhlIG9wdGlvbnMgY29udHJvbCB3aGF0IHBhcnRpY3VsYXIgaW5mb3JtYXRpb24gdG8gZGlzcGxheS4gIFRoaXMKLWluZm9ybWF0aW9uIGlzIG1vc3RseSB1c2VmdWwgdG8gcHJvZ3JhbW1lcnMgd2hvIGFyZSB3b3JraW5nIG9uIHRoZQotY29tcGlsYXRpb24gdG9vbHMsIGFzIG9wcG9zZWQgdG8gcHJvZ3JhbW1lcnMgd2hvIGp1c3Qgd2FudCB0aGVpcgotcHJvZ3JhbSB0byBjb21waWxlIGFuZCB3b3JrLgotLlBQCi0uSVIgICJvYmpmaWxlIiAuXHwuXHwuCi1hcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4gIFdoZW4geW91IHNwZWNpZnkgYXJjaGl2ZXMsCi1cYwotLkIgb2JqZHVtcFxjCi1cJiBzaG93cyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZSBtZW1iZXIgb2JqZWN0IGZpbGVzLgotCi0uU0ggT1BUSU9OUwotV2hlcmUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2YgYW4gb3B0aW9uIGFyZSBzaG93biB0b2dldGhlciwgdGhleSBhcmUKLWVxdWl2YWxlbnQuICBBdCBsZWFzdCBvbmUgb3B0aW9uIGJlc2lkZXMKLS5CIFwtbAotKFxmQlwtXC1saW5lXC1udW1iZXJzXGZQKSBtdXN0IGJlIGdpdmVuLgotCi0uVFAKLS5CIFwtYQotLlRQCi0uQiBcLVwtYXJjaGl2ZVwtaGVhZGVycwotSWYgYW55IGZpbGVzIGZyb20gXGMKLS5JIG9iamZpbGVcYwotXCYgYXJlIGFyY2hpdmVzLCBkaXNwbGF5IHRoZSBhcmNoaXZlCi1oZWFkZXIgaW5mb3JtYXRpb24gKGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gYFx8XGMKLS5CIGxzIFwtbFxjCi1cfCcpLiAgQmVzaWRlcyB0aGUKLWluZm9ybWF0aW9uIHlvdSBjb3VsZCBsaXN0IHdpdGggYFx8XGMKLS5CIGFyIHR2XGMKLVx8JywgYFx8XGMKLS5CIG9iamR1bXAgXC1hXGMKLVx8JyBzaG93cwotdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiBlYWNoIGFyY2hpdmUgbWVtYmVyLgotCi0uVFAKLS5CSSAiXC1cLWFkanVzdFwtdm1hPSIgIm9mZnNldCIKLVdoZW4gZHVtcGluZyBpbmZvcm1hdGlvbiwgZmlyc3QgYWRkCi0uSSBvZmZzZXQKLXRvIGFsbCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMuICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgc2VjdGlvbiBhZGRyZXNzZXMKLWRvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBzeW1ib2wgdGFibGUsIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiBwdXR0aW5nCi1zZWN0aW9ucyBhdCBwYXJ0aWN1bGFyIGFkZHJlc3NlcyB3aGVuIHVzaW5nIGEgZm9ybWF0IHdoaWNoIGNhbiBub3QKLXJlcHJlc2VudCBzZWN0aW9uIGFkZHJlc3Nlcywgc3VjaCBhcyBhLm91dC4KLQotLlRQCi0uQkkgIlwtYiAiICJiZmRuYW1lIlxjCi0uVFAKLS5CSSAiXC1cLXRhcmdldD0iICJiZmRuYW1lIgotU3BlY2lmeSB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlCi1cYwotLkkgYmZkbmFtZVxjCi1cJi4gIFRoaXMgbWF5IG5vdCBiZSBuZWNlc3Nhcnk7IFxjCi0uSSBvYmpkdW1wXGMKLVwmIGNhbgotYXV0b21hdGljYWxseSByZWNvZ25pemUgbWFueSBmb3JtYXRzLiAgRm9yIGV4YW1wbGUsCi0uc3AKLS5icgotb2JqZHVtcFwgXC1iXCBvYXN5c1wgXC1tXCB2YXhcIFwtaFwgZnUubwotLmJyCi0uc3AKLWRpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgKGBcfFxjCi0uQiBcLWhcYwotXHwnKSBvZgotYFx8XGMKLS5CIGZ1Lm9cYwotXHwnLCB3aGljaCBpcyBleHBsaWNpdGx5IGlkZW50aWZpZWQgKGBcfFxjCi0uQiBcLW1cYwotXHwnKSBhcyBhIFZheCBvYmplY3QKLWZpbGUgaW4gdGhlIGZvcm1hdCBwcm9kdWNlZCBieSBPYXN5cyBjb21waWxlcnMuICBZb3UgY2FuIGxpc3QgdGhlCi1mb3JtYXRzIGF2YWlsYWJsZSB3aXRoIHRoZSBgXHxcYwotLkIgXC1pXGMKLVx8JyBvcHRpb24uCi0KLS5UUAotLkIgXC1DCi0uVFAKLS5CIFwtXC1kZW1hbmdsZQotRGVjb2RlIChcZklkZW1hbmdsZVxmUCkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4KLQotLlRQCi0uQiBcLVwtZGVidWdnaW5nCi1EaXNwbGF5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgYXR0ZW1wdHMgdG8gcGFyc2UgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGZpbGUgYW5kIHByaW50IGl0IG91dCB1c2luZyBhIEMgbGlrZSBzeW50YXguCi1Pbmx5IGNlcnRhaW4gdHlwZXMgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KLQotLlRQCi0uQiBcLWQKLS5UUAotLkIgXC1cLWRpc2Fzc2VtYmxlCi1EaXNwbGF5IHRoZSBhc3NlbWJsZXIgbW5lbW9uaWNzIGZvciB0aGUgbWFjaGluZQotaW5zdHJ1Y3Rpb25zIGZyb20gXGMKLS5JIG9iamZpbGVcYwotXCYuCi1UaGlzIG9wdGlvbiBvbmx5IGRpc2Fzc2VtYmxlcyB0aG9zZSBzZWN0aW9ucyB3aGljaCBhcmUKLWV4cGVjdGVkIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zLgotCi0uVFAKLS5CIFwtRAotLlRQCi0uQiBcLVwtZGlzYXNzZW1ibGUtYWxsCi1MaWtlIFxmQlwtZFxmUCwgYnV0IGRpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMsIG5vdCBqdXN0Ci10aG9zZSBleHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotLlRQCi0uQiBcLVwtcHJlZml4XC1hZGRyZXNzZXMKLVdoZW4gZGlzYXNzZW1ibGluZywgcHJpbnQgdGhlIGNvbXBsZXRlIGFkZHJlc3Mgb24gZWFjaCBsaW5lLiAgVGhpcyBpcwotdGhlIG9sZGVyIGRpc2Fzc2VtYmx5IGZvcm1hdC4KLQotLlRQCi0uQiBcLVwtZGlzYXNzZW1ibGVcLXplcm9lcwotTm9ybWFsbHkgdGhlIGRpc2Fzc2VtYmx5IG91dHB1dCB3aWxsIHNraXAgYmxvY2tzIG9mIHplcm9lcy4gIFRoaXMKLW9wdGlvbiBkaXJlY3RzIHRoZSBkaXNhc3NlbWJsZXIgdG8gZGlzYXNzZW1ibGUgdGhvc2UgYmxvY2tzLCBqdXN0IGxpa2UKLWFueSBvdGhlciBkYXRhLgotCi0uVFAKLS5CIFwtRUIKLS5UUAotLkIgXC1FTAotLlRQCi0uQkkgIlwtXC1lbmRpYW49IiAie2JpZ3xsaXR0bGV9IgotU3BlY2lmeSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgb2JqZWN0IGZpbGVzLiAgVGhpcyBvbmx5IGFmZmVjdHMKLWRpc2Fzc2VtYmx5LiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBhIGZpbGUgZm9ybWF0IHdoaWNoCi1kb2VzIG5vdCBkZXNjcmliZSBlbmRpYW5uZXNzIGluZm9ybWF0aW9uLCBzdWNoIGFzIFMtcmVjb3Jkcy4KLQotLlRQCi0uQiBcLWYKLS5UUAotLkIgXC1cLWZpbGVcLWhlYWRlcnMKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdmVyYWxsIGhlYWRlciBvZgotZWFjaCBmaWxlIGluIFxjCi0uSSBvYmpmaWxlXGMKLVwmLgotCi0uVFAKLS5CIFwtaAotLlRQCi0uQiBcLVwtc2VjdGlvblwtaGVhZGVycwotLlRQCi0uQiBcLVwtaGVhZGVycwotRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycyBvZiB0aGUKLW9iamVjdCBmaWxlLgotCi0uVFAKLS5CIFwtXC1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIG9iamR1bXAKLWFuZCBleGl0LgotCi0uVFAKLS5CIFwtaQotLlRQCi0uQiBcLVwtaW5mbwotRGlzcGxheSBhIGxpc3Qgc2hvd2luZyBhbGwgYXJjaGl0ZWN0dXJlcyBhbmQgb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCi1mb3Igc3BlY2lmaWNhdGlvbiB3aXRoIFxjCi0uQiBcLWJcYwotXCYgb3IgXGMKLS5CIFwtbVxjCi1cJi4KLQotLlRQCi0uQkkgIlwtaiAiICJuYW1lIlxjCi0uVFAKLS5CSSAiXC1cLXNlY3Rpb249IiAibmFtZSIKLURpc3BsYXkgaW5mb3JtYXRpb24gb25seSBmb3Igc2VjdGlvbiBcYwotLkkgbmFtZVxjCi1cJi4KLQotLlRQCi0uQiBcLWwKLS5UUAotLkIgXC1cLWxpbmVcLW51bWJlcnMKLUxhYmVsIHRoZSBkaXNwbGF5ICh1c2luZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24pIHdpdGggdGhlIGZpbGVuYW1lCi1hbmQgc291cmNlIGxpbmUgbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgY29kZSBzaG93bi4KLU9ubHkgdXNlZnVsIHdpdGggXGZCXC1kXGZQLCBcZkJcLURcZlAsIG9yIFxmQlwtclxmUC4KLQotLlRQCi0uQkkgIlwtbSAiICJtYWNoaW5lIlxjCi0uVFAKLS5CSSAiXC1cLWFyY2hpdGVjdHVyZT0iICJtYWNoaW5lIgotU3BlY2lmeSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSB3aGVuIGRpc2Fzc2VtYmxpbmcgb2JqZWN0IGZpbGVzLiAgVGhpcwotY2FuIGJlIHVzZWZ1bCB3aGVuIGRpc2Fzc2VtYmxpbmcgb2JqZWN0IGZpbGVzIHdoaWNoIGRvIG5vdCBkZXNjcmliZQotYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uLCBzdWNoIGFzIFMtcmVjb3Jkcy4gIFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlCi1hcmNoaXRlY3R1cmVzIHdpdGggdGhlIFxmQlwtaVxmUCBvcHRpb24uIAotCi0uVFAKLS5CIFwtcAotLlRQCi0uQiBcLVwtcHJpdmF0ZVwtaGVhZGVycwotUHJpbnQgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlCi1leGFjdCBpbmZvcm1hdGlvbiBwcmludGVkIGRlcGVuZHMgdXBvbiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgRm9yCi1zb21lIG9iamVjdCBmaWxlIGZvcm1hdHMsIG5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgcHJpbnRlZC4KLQotLlRQCi0uQiBcLXIKLS5UUAotLkIgXC1cLXJlbG9jCi1QcmludCB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgSWYgdXNlZCB3aXRoIFxmQlwtZFxmUCBvcgotXGZCXC1EXGZQLCB0aGUgcmVsb2NhdGlvbnMgYXJlIHByaW50ZWQgaW50ZXJzcGVyc2VkIHdpdGggdGhlCi1kaXNhc3NlbWJseS4KLQotLlRQCi0uQiBcLVIKLS5UUAotLkIgXC1cLWR5bmFtaWNcLXJlbG9jCi1QcmludCB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGVudHJpZXMgb2YgdGhlIGZpbGUuICBUaGlzIGlzIG9ubHkKLW1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAotbGlicmFyaWVzLgotCi0uVFAKLS5CIFwtcwotLlRQCi0uQiBcLVwtZnVsbFwtY29udGVudHMKLURpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYW55IHNlY3Rpb25zIHJlcXVlc3RlZC4KLQotLlRQCi0uQiBcLVMKLS5UUAotLkIgXC1cLXNvdXJjZQotRGlzcGxheSBzb3VyY2UgY29kZSBpbnRlcm1peGVkIHdpdGggZGlzYXNzZW1ibHksIGlmIHBvc3NpYmxlLiAgSW1wbGllcwotXGZCLWRcZlAuCi0KLS5UUAotLkIgXC1cLXNob3dcLXJhd1wtaW5zbgotV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgcHJpbnQgdGhlIGluc3RydWN0aW9uIGluIGhleCBhcyB3ZWxsIGFzCi1pbiBzeW1ib2xpYyBmb3JtLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBleGNlcHQgd2hlbgotLkIgXC1cLXByZWZpeFwtYWRkcmVzc2VzCi1pcyB1c2VkLgotCi0uVFAKLS5CIFwtXC1ub1wtc2hvd1wtcmF3XC1pbnNuCi1XaGVuIGRpc2Fzc2VtYmxpbmcgaW5zdHJ1Y3Rpb25zLCBkbyBub3QgcHJpbnQgdGhlIGluc3RydWN0aW9uIGJ5dGVzLgotVGhpcyBpcyB0aGUgZGVmYXVsdCB3aGVuCi0uQiBcLVwtcHJlZml4XC1hZGRyZXNzZXMKLWlzIHVzZWQuCi0KLS5UUAotLkIgXC1cLXN0YWJzCi1EaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgLnN0YWIsIC5zdGFiLmluZGV4LCBhbmQgLnN0YWIuZXhjbAotc2VjdGlvbnMgZnJvbSBhbiBFTEYgZmlsZS4gIFRoaXMgaXMgb25seSB1c2VmdWwgb24gc3lzdGVtcyAoc3VjaCBhcwotU29sYXJpcyAyLjApIGluIHdoaWNoIC5zdGFiIGRlYnVnZ2luZyBzeW1ib2wtdGFibGUgZW50cmllcyBhcmUgY2FycmllZAotaW4gYW4gRUxGIHNlY3Rpb24uICBJbiBtb3N0IG90aGVyIGZpbGUgZm9ybWF0cywgZGVidWdnaW5nIHN5bWJvbC10YWJsZQotZW50cmllcyBhcmUgaW50ZXJsZWF2ZWQgd2l0aCBsaW5rYWdlIHN5bWJvbHMsIGFuZCBhcmUgdmlzaWJsZSBpbiB0aGUKLS5CIFwtXC1zeW1zCi1vdXRwdXQuCi0KLS5UUAotLkJJICJcLVwtc3RhcnRcLWFkZHJlc3M9IiAiYWRkcmVzcyIKLVN0YXJ0IGRpc3BsYXlpbmcgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICBUaGlzIGFmZmVjdHMgdGhlIG91dHB1dAotb2YgdGhlCi0uQiBcLWRcYwotLAotLkIgXC1yCi1hbmQKLS5CIFwtcwotb3B0aW9ucy4KLQotLlRQCi0uQkkgIlwtXC1zdG9wXC1hZGRyZXNzPSIgImFkZHJlc3MiCi1TdG9wIGRpc3BsYXlpbmcgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICBUaGlzIGFmZmVjdHMgdGhlIG91dHB1dAotb2YgdGhlCi0uQiBcLWRcYwotLAotLkIgXC1yCi1hbmQKLS5CIFwtcwotb3B0aW9ucy4KLQotLlRQCi0uQiBcLXQKLS5UUAotLkIgXC1cLXN5bXMKLVN5bWJvbCBUYWJsZS4gIFByaW50IHRoZSBzeW1ib2wgdGFibGUgZW50cmllcyBvZiB0aGUgZmlsZS4KLVRoaXMgaXMgc2ltaWxhciB0byB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGBcfFxjCi0uQiBubVxjCi1cfCcgcHJvZ3JhbS4KLQotLlRQCi0uQiBcLVQKLS5UUAotLkIgXC1cLWR5bmFtaWNcLXN5bXMKLUR5bmFtaWMgU3ltYm9sIFRhYmxlLiAgUHJpbnQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlCi1maWxlLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluCi10eXBlcyBvZiBzaGFyZWQgbGlicmFyaWVzLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbgotcHJvdmlkZWQgYnkgdGhlIGBcfFxjCi0uQiBubVxjCi1cfCcgcHJvZ3JhbSB3aGVuIGdpdmVuIHRoZQotLkIgXC1EIChcLVwtZHluYW1pYykKLW9wdGlvbi4KLQotLlRQCi0uQiBcLVwtdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiBvYmpkdW1wCi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLXgKLS5UUAotLkIgXC1cLWFsbFwtaGVhZGVycwotRGlzcGxheSBhbGwgYXZhaWxhYmxlIGhlYWRlciBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBzeW1ib2wgdGFibGUgYW5kCi1yZWxvY2F0aW9uIGVudHJpZXMuICBVc2luZyBgXHxcYwotLkIgXC14XGMKLVx8JyBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgYWxsIG9mCi1gXHxcYwotLkIgXC1hIFwtZiBcLWggXC1yIFwtdFxjCi1cfCcuCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpOyAKLS5CUiBubSAiKCIgMSAiKS4iCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9vYmpkdW1wLmMgYi9iaW51dGlscy9vYmpkdW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OGQ0ZjMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvb2JqZHVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk4NiArMCwwIEBACi0vKiBvYmpkdW1wLmMgLS0gZHVtcCBpbmZvcm1hdGlvbiBhYm91dCBhbiBvYmplY3QgZmlsZS4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJwcm9ncmVzcy5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0vKiBJbnRlcm5hbCBoZWFkZXJzIGZvciB0aGUgRUxGIC5zdGFiLWR1bXAgY29kZSAtIHNvcnJ5LiAgKi8KLSNkZWZpbmUJQllURVNfSU5fV09SRAkzMgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZQUklOVEYKLS8qIFRoaXMgaXMgbmVlZGVkIGJ5IElOSVRfRElTQVNTRU1CTEVfSU5GTy4gICovCi1leHRlcm4gaW50IGZwcmludGYgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLikpOwotI2VuZGlmCi0KLS8qIEV4aXQgc3RhdHVzLiAgKi8KLXN0YXRpYyBpbnQgZXhpdF9zdGF0dXMgPSAwOwotCi1zdGF0aWMgY2hhciAqZGVmYXVsdF90YXJnZXQgPSBOVUxMOwkvKiBkZWZhdWx0IGF0IHJ1bnRpbWUgKi8KLQotc3RhdGljIGludCBzaG93X3ZlcnNpb24gPSAwOwkJLyogc2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgKi8KLXN0YXRpYyBpbnQgZHVtcF9zZWN0aW9uX2NvbnRlbnRzOwkvKiAtcyAqLwotc3RhdGljIGludCBkdW1wX3NlY3Rpb25faGVhZGVyczsJLyogLWggKi8KLXN0YXRpYyBib29sZWFuIGR1bXBfZmlsZV9oZWFkZXI7CS8qIC1mICovCi1zdGF0aWMgaW50IGR1bXBfc3ltdGFiOwkJCS8qIC10ICovCi1zdGF0aWMgaW50IGR1bXBfZHluYW1pY19zeW10YWI7CQkvKiAtVCAqLwotc3RhdGljIGludCBkdW1wX3JlbG9jX2luZm87CQkvKiAtciAqLwotc3RhdGljIGludCBkdW1wX2R5bmFtaWNfcmVsb2NfaW5mbzsJLyogLVIgKi8KLXN0YXRpYyBpbnQgZHVtcF9hcl9oZHJzOwkJLyogLWEgKi8KLXN0YXRpYyBpbnQgZHVtcF9wcml2YXRlX2hlYWRlcnM7CS8qIC1wICovCi1zdGF0aWMgaW50IHByZWZpeF9hZGRyZXNzZXM7CQkvKiAtLXByZWZpeC1hZGRyZXNzZXMgKi8KLXN0YXRpYyBpbnQgd2l0aF9saW5lX251bWJlcnM7CQkvKiAtbCAqLwotc3RhdGljIGJvb2xlYW4gd2l0aF9zb3VyY2VfY29kZTsJLyogLVMgKi8KLXN0YXRpYyBpbnQgc2hvd19yYXdfaW5zbjsJCS8qIC0tc2hvdy1yYXctaW5zbiAqLwotc3RhdGljIGludCBkdW1wX3N0YWJfc2VjdGlvbl9pbmZvOwkvKiAtLXN0YWJzICovCi1zdGF0aWMgaW50IGRvX2RlbWFuZ2xlOwkJCS8qIC1DLCAtLWRlbWFuZ2xlICovCi1zdGF0aWMgYm9vbGVhbiBkaXNhc3NlbWJsZTsJCS8qIC1kICovCi1zdGF0aWMgYm9vbGVhbiBkaXNhc3NlbWJsZV9hbGw7CQkvKiAtRCAqLwotc3RhdGljIGludCBkaXNhc3NlbWJsZV96ZXJvZXM7CQkvKiAtLWRpc2Fzc2VtYmxlLXplcm9lcyAqLwotc3RhdGljIGJvb2xlYW4gZm9ybWF0c19pbmZvOwkJLyogLWkgKi8KLXN0YXRpYyBjaGFyICpvbmx5OwkJCS8qIC1qIHNlY25hbWUgKi8KLXN0YXRpYyBpbnQgd2lkZV9vdXRwdXQ7CQkJLyogLXcgKi8KLXN0YXRpYyBiZmRfdm1hIHN0YXJ0X2FkZHJlc3MgPSAoYmZkX3ZtYSkgLTE7IC8qIC0tc3RhcnQtYWRkcmVzcyAqLwotc3RhdGljIGJmZF92bWEgc3RvcF9hZGRyZXNzID0gKGJmZF92bWEpIC0xOyAgLyogLS1zdG9wLWFkZHJlc3MgKi8KLXN0YXRpYyBpbnQgZHVtcF9kZWJ1Z2dpbmc7CQkvKiAtLWRlYnVnZ2luZyAqLwotc3RhdGljIGJmZF92bWEgYWRqdXN0X3NlY3Rpb25fdm1hID0gMDsJLyogLS1hZGp1c3Qtdm1hICovCi1zdGF0aWMgaW50IGZpbGVfc3RhcnRfY29udGV4dCA9IDA7ICAgICAgLyogLS1maWxlLXN0YXJ0LWNvbnRleHQgKi8KLQotLyogRXh0cmEgaW5mbyB0byBwYXNzIHRvIHRoZSBkaXNhc3NlbWJsZXIgYWRkcmVzcyBwcmludGluZyBmdW5jdGlvbi4gICovCi1zdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyB7Ci0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYm9vbGVhbiByZXF1aXJlX3NlYzsKLX07Ci0KLS8qIEFyY2hpdGVjdHVyZSB0byBkaXNhc3NlbWJsZSBmb3IsIG9yIGRlZmF1bHQgaWYgTlVMTC4gICovCi1zdGF0aWMgY2hhciAqbWFjaGluZSA9IChjaGFyICopIE5VTEw7Ci0KLS8qIFRhcmdldCBzcGVjaWZpYyBvcHRpb25zIHRvIHRoZSBkaXNhc3NlbWJsZXIuICAqLwotc3RhdGljIGNoYXIgKmRpc2Fzc2VtYmxlcl9vcHRpb25zID0gKGNoYXIgKikgTlVMTDsKLQotLyogRW5kaWFubmVzcyB0byBkaXNhc3NlbWJsZSBmb3IsIG9yIGRlZmF1bHQgaWYgQkZEX0VORElBTl9VTktOT1dOLiAgKi8KLXN0YXRpYyBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOOwotCi0vKiBUaGUgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqc3ltczsKLQotLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN5bXMnLiAgKi8KLXN0YXRpYyBsb25nIHN5bWNvdW50ID0gMDsKLQotLyogVGhlIHNvcnRlZCBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIGFzeW1ib2wgKipzb3J0ZWRfc3ltczsKLQotLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYHNvcnRlZF9zeW1zJy4gICovCi1zdGF0aWMgbG9uZyBzb3J0ZWRfc3ltY291bnQgPSAwOwotCi0vKiBUaGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIGFzeW1ib2wgKipkeW5zeW1zOwotCi0vKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBgZHluc3ltcycuICAqLwotc3RhdGljIGxvbmcgZHluc3ltY291bnQgPSAwOwotCi0vKiBTdGF0aWMgZGVjbGFyYXRpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1ub25mYXRhbCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSwgY2hhciAqdGFyZ2V0KSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3NlY3Rpb25faGVhZGVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9kYXRhIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9yZWxvY3MgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2R5bmFtaWNfcmVsb2NzIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfcmVsb2Nfc2V0IFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBsb25nKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3N5bWJvbHMgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGR5bmFtaWMpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfYmZkX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYmZkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV90YXJnZXRfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2luZm9fdGFibGUgUEFSQU1TICgoaW50LCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfdGFyZ2V0X3RhYmxlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2luZm8gUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF92YWx1ZSBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBib29sZWFuKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X3N5bW5hbWUgUEFSQU1TICgoYmZkICosIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGFzeW1ib2wgKikpOwotCi1zdGF0aWMgYXN5bWJvbCAqCi1maW5kX3N5bWJvbF9mb3JfYWRkcmVzcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYm9vbGVhbiwgbG9uZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiwgYmZkX3ZtYSwKLQkJCQkgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkciBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBib29sZWFuKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHJlc3MgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgdm9pZAotc2hvd19saW5lIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9ieXRlcyBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBkaXNhc3NlbWJsZXJfZnR5cGUsCi0JCQkgICBib29sZWFuLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLCBiZmRfdm1hLAotCQkJICAgYXJlbGVudCAqKiosIGFyZWxlbnQgKiopKTsKLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX2RhdGEgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZW5kaWFuX3N0cmluZyBQQVJBTVMgKChlbnVtIGJmZF9lbmRpYW4pKTsKLQotc3RhdGljIGFzeW1ib2wgKioKLXNsdXJwX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYXN5bWJvbCAqKgotc2x1cnBfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGxvbmcKLXJlbW92ZV91c2VsZXNzX3N5bWJvbHMgUEFSQU1TICgoYXN5bWJvbCAqKiwgbG9uZykpOwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3N5bWJvbHMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotY29tcGFyZV9yZWxvY3MgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfc3RhYnMgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc2VjdGlvbl9zdGFicyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3NlY3Rpb25fc3RhYnMgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0MCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiVXNhZ2U6ICVzIDxzd2l0Y2hlcz4gZmlsZShzKVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHN3aXRjaGVzIG11c3QgYmUgZ2l2ZW46XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtYSAgLS1hcmNoaXZlLWhlYWRlcnMgICAgRGlzcGxheSBhcmNoaXZlIGhlYWRlciBpbmZvcm1hdGlvblxuXAotICAtZiAgLS1maWxlLWhlYWRlcnMgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIG92ZXJhbGwgZmlsZSBoZWFkZXJcblwKLSAgLXAgIC0tcHJpdmF0ZS1oZWFkZXJzICAgIERpc3BsYXkgb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBmaWxlIGhlYWRlciBjb250ZW50c1xuXAotICAtaCAgLS1bc2VjdGlvbi1daGVhZGVycyAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gaGVhZGVyc1xuXAotICAteCAgLS1hbGwtaGVhZGVycyAgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgYWxsIGhlYWRlcnNcblwKLSAgLWQgIC0tZGlzYXNzZW1ibGUgICAgICAgIERpc3BsYXkgYXNzZW1ibGVyIGNvbnRlbnRzIG9mIGV4ZWN1dGFibGUgc2VjdGlvbnNcblwKLSAgLUQgIC0tZGlzYXNzZW1ibGUtYWxsICAgIERpc3BsYXkgYXNzZW1ibGVyIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9uc1xuXAotICAtUyAgLS1zb3VyY2UgICAgICAgICAgICAgSW50ZXJtaXggc291cmNlIGNvZGUgd2l0aCBkaXNhc3NlbWJseVxuXAotICAtcyAgLS1mdWxsLWNvbnRlbnRzICAgICAgRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMgcmVxdWVzdGVkXG5cCi0gIC1nICAtLWRlYnVnZ2luZyAgICAgICAgICBEaXNwbGF5IGRlYnVnIGluZm9ybWF0aW9uIGluIG9iamVjdCBmaWxlXG5cCi0gIC1HICAtLXN0YWJzICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBTVEFCUyBjb250ZW50cyBvZiBhbiBFTEYgZm9ybWF0IGZpbGVcblwKLSAgLXQgIC0tc3ltcyAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1ib2wgdGFibGUocylcblwKLSAgLVQgIC0tZHluYW1pYy1zeW1zICAgICAgIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZVxuXAotICAtciAgLS1yZWxvYyAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIGluIHRoZSBmaWxlXG5cCi0gIC1SICAtLWR5bmFtaWMtcmVsb2MgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcyBpbiB0aGUgZmlsZVxuXAotICAtViAgLS12ZXJzaW9uICAgICAgICAgICAgRGlzcGxheSB0aGlzIHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlclxuXAotICAtaSAgLS1pbmZvICAgICAgICAgICAgICAgTGlzdCBvYmplY3QgZm9ybWF0cyBhbmQgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWRcblwKLSAgLUggIC0taGVscCAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvblxuXAotIikpOwotICBpZiAoc3RhdHVzICE9IDIpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RyZWFtLCBfKCJcbiBUaGUgZm9sbG93aW5nIHN3aXRjaGVzIGFyZSBvcHRpb25hbDpcbiIpKTsKLSAgICAgIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtYiAgLS10YXJnZXQgPGJmZG5hbWU+ICAgICAgICAgU3BlY2lmeSB0aGUgdGFyZ2V0IG9iamVjdCBmb3JtYXQgYXMgPGJmZG5hbWU+XG5cCi0gIC1tICAtLWFyY2hpdGVjdHVyZSA8bWFjaGluZT4gICBTcGVjaWZ5IHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGFzIDxtYWNoaW5lPlxuXAotICAtaiAgLS1zZWN0aW9uIDxuYW1lPiAgICAgICAgICAgT25seSBkaXNwbGF5IGluZm9ybWF0aW9uIGZvciBzZWN0aW9uIDxuYW1lPlxuXAotICAtTSAgLS1kaXNhc3NlbWJsZXItb3B0aW9ucyA8bz4gUGFzcyB0ZXh0IDxvPiBvbiB0byB0aGUgZGlzYXNzZW1ibGVyXG5cCi0gIC1FQiAtLWVuZGlhbj1iaWcgICAgICAgICAgICAgICBBc3N1bWUgYmlnIGVuZGlhbiBmb3JtYXQgd2hlbiBkaXNhc3NlbWJsaW5nXG5cCi0gIC1FTCAtLWVuZGlhbj1saXR0bGUgICAgICAgICAgICBBc3N1bWUgbGl0dGxlIGVuZGlhbiBmb3JtYXQgd2hlbiBkaXNhc3NlbWJsaW5nXG5cCi0gICAgICAtLWZpbGUtc3RhcnQtY29udGV4dCAgICAgICBJbmNsdWRlIGNvbnRleHQgZnJvbSBzdGFydCBvZiBmaWxlICh3aXRoIC1TKVxuXAotICAtbCAgLS1saW5lLW51bWJlcnMgICAgICAgICAgICAgSW5jbHVkZSBsaW5lIG51bWJlcnMgYW5kIGZpbGVuYW1lcyBpbiBvdXRwdXRcblwKLSAgLUMgIC0tZGVtYW5nbGUgICAgICAgICAgICAgICAgIERlY29kZSBtYW5nbGVkL3Byb2Nlc3NlZCBzeW1ib2wgbmFtZXNcblwKLSAgLXcgIC0td2lkZSAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCBvdXRwdXQgZm9yIG1vcmUgdGhhbiA4MCBjb2x1bW5zXG5cCi0gIC16ICAtLWRpc2Fzc2VtYmxlLXplcm9lcyAgICAgICBEbyBub3Qgc2tpcCBibG9ja3Mgb2YgemVyb2VzIHdoZW4gZGlzYXNzZW1ibGluZ1xuXAotICAgICAgLS1zdGFydC1hZGRyZXNzIDxhZGRyPiAgICAgT25seSBwcm9jZXNzIGRhdGEgd2hvZXMgYWRkcmVzcyBpcyA+PSA8YWRkcj5cblwKLSAgICAgIC0tc3RvcC1hZGRyZXNzIDxhZGRyPiAgICAgIE9ubHkgcHJvY2VzcyBkYXRhIHdob2VzIGFkZHJlc3MgaXMgPD0gPGFkZHI+XG5cCi0gICAgICAtLXByZWZpeC1hZGRyZXNzZXMgICAgICAgICBQcmludCBjb21wbGV0ZSBhZGRyZXNzIGFsb25nc2lkZSBkaXNhc3NlbWJseVxuXAotICAgICAgLS1bbm8tXXNob3ctcmF3LWluc24gICAgICAgRGlzcGxheSBoZXggYWxvbmdzaWRlIHN5bWJvbGljIGRpc2Fzc2VtYmx5XG5cCi0gICAgICAtLWFkanVzdC12bWEgPG9mZnNldD4gICAgICBBZGQgPG9mZnNldD4gdG8gYWxsIGRpc3BsYXllZCBzZWN0aW9uIGFkZHJlc3Nlc1xuXAotXG4iKSk7Ci0gICAgICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gICAgICAKLSAgICAgIGRpc2Fzc2VtYmxlcl91c2FnZSAoc3RyZWFtKTsKLSAgICB9Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQotCi0vKiAxNTAgaXNuJ3Qgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0VORElBTiAoMTUwKQotI2RlZmluZSBPUFRJT05fU1RBUlRfQUREUkVTUyAoT1BUSU9OX0VORElBTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TVE9QX0FERFJFU1MgKE9QVElPTl9TVEFSVF9BRERSRVNTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FESlVTVF9WTUEgKE9QVElPTl9TVE9QX0FERFJFU1MgKyAxKQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXT0KLXsKLSAgeyJhZGp1c3Qtdm1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BREpVU1RfVk1BfSwKLSAgeyJhbGwtaGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAneCd9LAotICB7InByaXZhdGUtaGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncCd9LAotICB7ImFyY2hpdGVjdHVyZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbSd9LAotICB7ImFyY2hpdmUtaGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7ImRlYnVnZ2luZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZyd9LAotICB7ImRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdDJ30sCi0gIHsiZGlzYXNzZW1ibGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ2QnfSwKLSAgeyJkaXNhc3NlbWJsZS1hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgJ0QnfSwKLSAgeyJkaXNhc3NlbWJsZXItb3B0aW9ucyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnTSd9LAotICB7ImRpc2Fzc2VtYmxlLXplcm9lcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAneid9LAotICB7ImR5bmFtaWMtcmVsb2MiLCBub19hcmd1bWVudCwgTlVMTCwgJ1InfSwKLSAgeyJkeW5hbWljLXN5bXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ1QnfSwKLSAgeyJlbmRpYW4iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VORElBTn0sCi0gIHsiZmlsZS1oZWFkZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gIHsiZmlsZS1zdGFydC1jb250ZXh0Iiwgbm9fYXJndW1lbnQsICZmaWxlX3N0YXJ0X2NvbnRleHQsIDF9LAotICB7ImZ1bGwtY29udGVudHMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3MnfSwKLSAgeyJoZWFkZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnSCd9LAotICB7ImluZm8iLCBub19hcmd1bWVudCwgTlVMTCwgJ2knfSwKLSAgeyJsaW5lLW51bWJlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2wnfSwKLSAgeyJuby1zaG93LXJhdy1pbnNuIiwgbm9fYXJndW1lbnQsICZzaG93X3Jhd19pbnNuLCAtMX0sCi0gIHsicHJlZml4LWFkZHJlc3NlcyIsIG5vX2FyZ3VtZW50LCAmcHJlZml4X2FkZHJlc3NlcywgMX0sCi0gIHsicmVsb2MiLCBub19hcmd1bWVudCwgTlVMTCwgJ3InfSwKLSAgeyJzZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdqJ30sCi0gIHsic2VjdGlvbi1oZWFkZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsic2hvdy1yYXctaW5zbiIsIG5vX2FyZ3VtZW50LCAmc2hvd19yYXdfaW5zbiwgMX0sCi0gIHsic291cmNlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdTJ30sCi0gIHsic3RhYnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ0cnfSwKLSAgeyJzdGFydC1hZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFSVF9BRERSRVNTfSwKLSAgeyJzdG9wLWFkZHJlc3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUT1BfQUREUkVTU30sCi0gIHsic3ltcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndCd9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgJ1YnfSwKLSAgeyJ3aWRlIiwgbm9fYXJndW1lbnQsIE5VTEwsICd3J30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0MCi1zdGF0aWMgdm9pZAotbm9uZmF0YWwgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBiZmRfbm9uZmF0YWwgKG1zZyk7Ci0gIGV4aXRfc3RhdHVzID0gMTsKLX0KLQwKLXN0YXRpYyB2b2lkCi1kdW1wX3NlY3Rpb25faGVhZGVyIChhYmZkLCBzZWN0aW9uLCBpZ25vcmVkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBpZ25vcmVkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKmNvbW1hID0gIiI7Ci0gIHVuc2lnbmVkIGludCBvcGIgPSBiZmRfb2N0ZXRzX3Blcl9ieXRlIChhYmZkKTsKLQotICBwcmludGYgKCIlM2QgJS0xM3MgJTA4bHggICIsIHNlY3Rpb24tPmluZGV4LAotCSAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pLAotCSAgKHVuc2lnbmVkIGxvbmcpIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pIC8gb3BiKTsKLSAgcHJpbnRmX3ZtYSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbikpOwotICBwcmludGYgKCIgICIpOwotICBwcmludGZfdm1hIChzZWN0aW9uLT5sbWEpOwotICBwcmludGYgKCIgICUwOGx4ICAyKioldSIsIHNlY3Rpb24tPmZpbGVwb3MsCi0JICBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWN0aW9uKSk7Ci0gIGlmICghIHdpZGVfb3V0cHV0KQotICAgIHByaW50ZiAoIlxuICAgICAgICAgICAgICAgICIpOwotICBwcmludGYgKCIgICIpOwotCi0jZGVmaW5lIFBGKHgsIHkpIFwKLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgeCkgeyBwcmludGYgKCIlcyVzIiwgY29tbWEsIHkpOyBjb21tYSA9ICIsICI7IH0KLQotICBQRiAoU0VDX0hBU19DT05URU5UUywgIkNPTlRFTlRTIik7Ci0gIFBGIChTRUNfQUxMT0MsICJBTExPQyIpOwotICBQRiAoU0VDX0NPTlNUUlVDVE9SLCAiQ09OU1RSVUNUT1IiKTsKLSAgUEYgKFNFQ19DT05TVFJVQ1RPUl9URVhULCAiQ09OU1RSVUNUT1IgVEVYVCIpOwotICBQRiAoU0VDX0NPTlNUUlVDVE9SX0RBVEEsICJDT05TVFJVQ1RPUiBEQVRBIik7Ci0gIFBGIChTRUNfQ09OU1RSVUNUT1JfQlNTLCAiQ09OU1RSVUNUT1IgQlNTIik7Ci0gIFBGIChTRUNfTE9BRCwgIkxPQUQiKTsKLSAgUEYgKFNFQ19SRUxPQywgIlJFTE9DIik7Ci0jaWZkZWYgU0VDX0JBTElHTgotICBQRiAoU0VDX0JBTElHTiwgIkJBTElHTiIpOwotI2VuZGlmCi0gIFBGIChTRUNfUkVBRE9OTFksICJSRUFET05MWSIpOwotICBQRiAoU0VDX0NPREUsICJDT0RFIik7Ci0gIFBGIChTRUNfREFUQSwgIkRBVEEiKTsKLSAgUEYgKFNFQ19ST00sICJST00iKTsKLSAgUEYgKFNFQ19ERUJVR0dJTkcsICJERUJVR0dJTkciKTsKLSAgUEYgKFNFQ19ORVZFUl9MT0FELCAiTkVWRVJfTE9BRCIpOwotICBQRiAoU0VDX0VYQ0xVREUsICJFWENMVURFIik7Ci0gIFBGIChTRUNfU09SVF9FTlRSSUVTLCAiU09SVF9FTlRSSUVTIik7Ci0gIFBGIChTRUNfU01BTExfREFUQSwgIlNNQUxMX0RBVEEiKTsKLSAgUEYgKFNFQ19TSEFSRUQsICJTSEFSRUQiKTsKLQotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xJTktfT05DRSkgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpsczsKLQotICAgICAgc3dpdGNoIChzZWN0aW9uLT5mbGFncyAmIFNFQ19MSU5LX0RVUExJQ0FURVMpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDoKLQkgIGxzID0gIkxJTktfT05DRV9ESVNDQVJEIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWToKLQkgIGxzID0gIkxJTktfT05DRV9PTkVfT05MWSI7Ci0JICBicmVhazsKLQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCSAgbHMgPSAiTElOS19PTkNFX1NBTUVfU0laRSI7Ci0JICBicmVhazsKLQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKLQkgIGxzID0gIkxJTktfT05DRV9TQU1FX0NPTlRFTlRTIjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByaW50ZiAoIiVzJXMiLCBjb21tYSwgbHMpOwotCi0gICAgICBpZiAoc2VjdGlvbi0+Y29tZGF0ICE9IE5VTEwpCi0JcHJpbnRmICgiIChDT01EQVQgJXMgJWxkKSIsIHNlY3Rpb24tPmNvbWRhdC0+bmFtZSwKLQkJc2VjdGlvbi0+Y29tZGF0LT5zeW1ib2wpOwotCi0gICAgICBjb21tYSA9ICIsICI7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0jdW5kZWYgUEYKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBwcmludGYgKF8oIlNlY3Rpb25zOlxuIikpOwotCi0jaWZuZGVmIEJGRDY0Ci0gIHByaW50ZiAoXygiSWR4IE5hbWUgICAgICAgICAgU2l6ZSAgICAgIFZNQSAgICAgICBMTUEgICAgICAgRmlsZSBvZmYgIEFsZ24iKSk7Ci0jZWxzZQotICBwcmludGYgKF8oIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgICAgICAgICBMTUEgICAgICAgICAgICAgICBGaWxlIG9mZiAgQWxnbiIpKTsKLSNlbmRpZgotCi0gIGlmICh3aWRlX291dHB1dCkKLSAgICBwcmludGYgKF8oIiAgRmxhZ3MiKSk7Ci0gIHByaW50ZiAoIlxuIik7Ci0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBkdW1wX3NlY3Rpb25faGVhZGVyLCAoUFRSKSBOVUxMKTsKLX0KLQwKLXN0YXRpYyBhc3ltYm9sICoqCi1zbHVycF9zeW10YWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqKnN5ID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0gIGxvbmcgc3RvcmFnZTsKLQotICBpZiAoIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBzeW1jb3VudCA9IDA7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGlmIChzdG9yYWdlKQotICAgIHsKLSAgICAgIHN5ID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2UpOwotICAgIH0KLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3kpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICByZXR1cm4gc3k7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoqCi1zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICoqc3kgPSAoYXN5bWJvbCAqKikgTlVMTDsKLSAgbG9uZyBzdG9yYWdlOwotCi0gIHN0b3JhZ2UgPSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIHsKLSAgICAgIGlmICghKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogbm90IGEgZHluYW1pYyBvYmplY3RcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGR5bnN5bWNvdW50ID0gMDsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotCi0gIGlmIChzdG9yYWdlKQotICAgIHsKLSAgICAgIHN5ID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2UpOwotICAgIH0KLSAgZHluc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIChhYmZkLCBzeSk7Ci0gIGlmIChkeW5zeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIGlmIChkeW5zeW1jb3VudCA9PSAwKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBObyBkeW5hbWljIHN5bWJvbHNcbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIHJldHVybiBzeTsKLX0KLQotLyogRmlsdGVyIG91dCAoaW4gcGxhY2UpIHN5bWJvbHMgdGhhdCBhcmUgdXNlbGVzcyBmb3IgZGlzYXNzZW1ibHkuCi0gICBDT1VOVCBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIFNZTUJPTFMuCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiB1c2VmdWwgc3ltYm9scy4gKi8KLQotc3RhdGljIGxvbmcKLXJlbW92ZV91c2VsZXNzX3N5bWJvbHMgKHN5bWJvbHMsIGNvdW50KQotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgbG9uZyBjb3VudDsKLXsKLSAgcmVnaXN0ZXIgYXN5bWJvbCAqKmluX3B0ciA9IHN5bWJvbHMsICoqb3V0X3B0ciA9IHN5bWJvbHM7Ci0KLSAgd2hpbGUgKC0tY291bnQgPj0gMCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW0gPSAqaW5fcHRyKys7Ci0KLSAgICAgIGlmIChzeW0tPm5hbWUgPT0gTlVMTCB8fCBzeW0tPm5hbWVbMF0gPT0gJ1wwJykKLQljb250aW51ZTsKLSAgICAgIGlmIChzeW0tPmZsYWdzICYgKEJTRl9ERUJVR0dJTkcpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCWNvbnRpbnVlOwotCi0gICAgICAqb3V0X3B0cisrID0gc3ltOwotICAgIH0KLSAgcmV0dXJuIG91dF9wdHIgLSBzeW1ib2xzOwotfQotCi0vKiBTb3J0IHN5bWJvbHMgaW50byB2YWx1ZSBvcmRlci4gICovCi0KLXN0YXRpYyBpbnQgCi1jb21wYXJlX3N5bWJvbHMgKGFwLCBicCkKLSAgICAgY29uc3QgUFRSIGFwOwotICAgICBjb25zdCBQVFIgYnA7Ci17Ci0gIGNvbnN0IGFzeW1ib2wgKmEgPSAqKGNvbnN0IGFzeW1ib2wgKiopYXA7Ci0gIGNvbnN0IGFzeW1ib2wgKmIgPSAqKGNvbnN0IGFzeW1ib2wgKiopYnA7Ci0gIGNvbnN0IGNoYXIgKmFuLCAqYm47Ci0gIHNpemVfdCBhbmwsIGJubDsKLSAgYm9vbGVhbiBhZiwgYmY7Ci0gIGZsYWd3b3JkIGFmbGFncywgYmZsYWdzOwotCi0gIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoYSkgPiBiZmRfYXN5bWJvbF92YWx1ZSAoYikpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChhKSA8IGJmZF9hc3ltYm9sX3ZhbHVlIChiKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKGEtPnNlY3Rpb24gPiBiLT5zZWN0aW9uKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChhLT5zZWN0aW9uIDwgYi0+c2VjdGlvbikKLSAgICByZXR1cm4gLTE7Ci0KLSAgYW4gPSBiZmRfYXN5bWJvbF9uYW1lIChhKTsKLSAgYm4gPSBiZmRfYXN5bWJvbF9uYW1lIChiKTsKLSAgYW5sID0gc3RybGVuIChhbik7Ci0gIGJubCA9IHN0cmxlbiAoYm4pOwotCi0gIC8qIFRoZSBzeW1ib2xzIGdudV9jb21waWxlZCBhbmQgZ2NjMl9jb21waWxlZCBjb252ZXkgbm8gcmVhbAotICAgICBpbmZvcm1hdGlvbiwgc28gcHV0IHRoZW0gYWZ0ZXIgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLiAgKi8KLQotICBhZiA9IChzdHJzdHIgKGFuLCAiZ251X2NvbXBpbGVkIikgIT0gTlVMTAotCXx8IHN0cnN0ciAoYW4sICJnY2MyX2NvbXBpbGVkIikgIT0gTlVMTCk7Ci0gIGJmID0gKHN0cnN0ciAoYm4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCi0JfHwgc3Ryc3RyIChibiwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKLQotICBpZiAoYWYgJiYgISBiZikKLSAgICByZXR1cm4gMTsKLSAgaWYgKCEgYWYgJiYgYmYpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFdlIHVzZSBhIGhldXJpc3RpYyBmb3IgdGhlIGZpbGUgbmFtZSwgdG8gdHJ5IHRvIHNvcnQgaXQgYWZ0ZXIKLSAgICAgbW9yZSB1c2VmdWwgc3ltYm9scy4gIEl0IG1heSBub3Qgd29yayBvbiBub24gVW5peCBzeXN0ZW1zLCBidXQgaXQKLSAgICAgZG9lc24ndCByZWFsbHkgbWF0dGVyOyB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHByZWNpc2VseSB3aGljaAotICAgICBzeW1ib2wgbmFtZXMgZ2V0IHByaW50ZWQuICAqLwotCi0jZGVmaW5lIGZpbGVfc3ltYm9sKHMsIHNuLCBzbmwpCQkJXAotICAoKChzKS0+ZmxhZ3MgJiBCU0ZfRklMRSkgIT0gMAkJCVwKLSAgIHx8ICgoc24pWyhzbmwpIC0gMl0gPT0gJy4nCQkJXAotICAgICAgICYmICgoc24pWyhzbmwpIC0gMV0gPT0gJ28nCQlcCi0JICAgfHwgKHNuKVsoc25sKSAtIDFdID09ICdhJykpKQotCi0gIGFmID0gZmlsZV9zeW1ib2wgKGEsIGFuLCBhbmwpOwotICBiZiA9IGZpbGVfc3ltYm9sIChiLCBibiwgYm5sKTsKLQotICBpZiAoYWYgJiYgISBiZikKLSAgICByZXR1cm4gMTsKLSAgaWYgKCEgYWYgJiYgYmYpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFRyeSB0byBzb3J0IGdsb2JhbCBzeW1ib2xzIGJlZm9yZSBsb2NhbCBzeW1ib2xzIGJlZm9yZSBmdW5jdGlvbgotICAgICBzeW1ib2xzIGJlZm9yZSBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCi0KLSAgYWZsYWdzID0gYS0+ZmxhZ3M7Ci0gIGJmbGFncyA9IGItPmZsYWdzOwotCi0gIGlmICgoYWZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gKGJmbGFncyAmIEJTRl9ERUJVR0dJTkcpKQotICAgIHsKLSAgICAgIGlmICgoYWZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMCkKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoKGFmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gKGJmbGFncyAmIEJTRl9GVU5DVElPTikpCi0gICAgewotICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IDApCi0JcmV0dXJuIC0xOwotICAgICAgZWxzZQotCXJldHVybiAxOwotICAgIH0KLSAgaWYgKChhZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IChiZmxhZ3MgJiBCU0ZfTE9DQUwpKQotICAgIHsKLSAgICAgIGlmICgoYWZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwKQotCXJldHVybiAxOwotICAgICAgZWxzZQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGlmICgoYWZsYWdzICYgQlNGX0dMT0JBTCkgIT0gKGJmbGFncyAmIEJTRl9HTE9CQUwpKQotICAgIHsKLSAgICAgIGlmICgoYWZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFN5bWJvbHMgdGhhdCBzdGFydCB3aXRoICcuJyBtaWdodCBiZSBzZWN0aW9uIG5hbWVzLCBzbyBzb3J0IHRoZW0KLSAgICAgYWZ0ZXIgc3ltYm9scyB0aGF0IGRvbid0IHN0YXJ0IHdpdGggJy4nLiAgKi8KLSAgaWYgKGFuWzBdID09ICcuJyAmJiBiblswXSAhPSAnLicpCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChhblswXSAhPSAnLicgJiYgYm5bMF0gPT0gJy4nKQotICAgIHJldHVybiAtMTsKLQotICAvKiBGaW5hbGx5LCBpZiB3ZSBjYW4ndCBkaXN0aW5ndWlzaCB0aGVtIGluIGFueSBvdGhlciB3YXksIHRyeSB0bwotICAgICBnZXQgY29uc2lzdGVudCByZXN1bHRzIGJ5IHNvcnRpbmcgdGhlIHN5bWJvbHMgYnkgbmFtZS4gICovCi0gIHJldHVybiBzdHJjbXAgKGFuLCBibik7Ci19Ci0KLS8qIFNvcnQgcmVsb2NzIGludG8gYWRkcmVzcyBvcmRlci4gICovCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfcmVsb2NzIChhcCwgYnApCi0gICAgIGNvbnN0IFBUUiBhcDsKLSAgICAgY29uc3QgUFRSIGJwOwotewotICBjb25zdCBhcmVsZW50ICphID0gKihjb25zdCBhcmVsZW50ICoqKWFwOwotICBjb25zdCBhcmVsZW50ICpiID0gKihjb25zdCBhcmVsZW50ICoqKWJwOwotCi0gIGlmIChhLT5hZGRyZXNzID4gYi0+YWRkcmVzcykKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYS0+YWRkcmVzcyA8IGItPmFkZHJlc3MpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFNvIHRoYXQgYXNzb2NpYXRlZCByZWxvY2F0aW9ucyB0aWVkIHRvIHRoZSBzYW1lIGFkZHJlc3Mgc2hvdyB1cAotICAgICBpbiB0aGUgY29ycmVjdCBvcmRlciwgd2UgZG9uJ3QgZG8gYW55IGZ1cnRoZXIgc29ydGluZy4gICovCi0gIGlmIChhID4gYikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYSA8IGIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFByaW50IFZNQSB0byBTVFJFQU0uICBJZiBTS0lQX1pFUk9FUyBpcyB0cnVlLCBvbWl0IGxlYWRpbmcgemVyb2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBza2lwX3plcm9lczsKLXsKLSAgY2hhciBidWZbMzBdOwotICBjaGFyICpwOwotCi0gIHNwcmludGZfdm1hIChidWYsIHZtYSk7Ci0gIGlmICghIHNraXBfemVyb2VzKQotICAgIHAgPSBidWY7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBidWY7ICpwID09ICcwJzsgKytwKQotCTsKLSAgICAgIGlmICgqcCA9PSAnXDAnKQotCS0tcDsKLSAgICB9Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBwKTsKLX0KLQotLyogUHJpbnQgdGhlIG5hbWUgb2YgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9zeW1uYW1lIChhYmZkLCBpbmZvLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgY2hhciAqYWxsb2M7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKnByaW50OwotCi0gIGFsbG9jID0gTlVMTDsKLSAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0gIGlmICghIGRvX2RlbWFuZ2xlIHx8IG5hbWVbMF0gPT0gJ1wwJykKLSAgICBwcmludCA9IG5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBEZW1hbmdsZSB0aGUgbmFtZS4gICovCi0gICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSBuYW1lWzBdKQotCSsrbmFtZTsKLQotICAgICAgYWxsb2MgPSBjcGx1c19kZW1hbmdsZSAobmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotICAgICAgaWYgKGFsbG9jID09IE5VTEwpCi0JcHJpbnQgPSBuYW1lOwotICAgICAgZWxzZQotCXByaW50ID0gYWxsb2M7Ci0gICAgfQotCi0gIGlmIChpbmZvICE9IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHByaW50KTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiVzIiwgcHJpbnQpOwotCi0gIGlmIChhbGxvYyAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jKTsKLX0KLQotLyogTG9jYXRlIGEgc3ltYm9sIGdpdmVuIGEgYmZkLCBhIHNlY3Rpb24sIGFuZCBhIFZNQS4gIElmIFJFUVVJUkVfU0VDCi0gICBpcyB0cnVlLCB0aGVuIGFsd2F5cyByZXF1aXJlIHRoZSBzeW1ib2wgdG8gYmUgaW4gdGhlIHNlY3Rpb24uICBUaGlzCi0gICByZXR1cm5zIE5VTEwgaWYgdGhlcmUgaXMgbm8gc3VpdGFibGUgc3ltYm9sLiAgSWYgUExBQ0UgaXMgbm90IE5VTEwsCi0gICB0aGVuICpQTEFDRSBpcyBzZXQgdG8gdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wgaW4gc29ydGVkX3N5bXMuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi1maW5kX3N5bWJvbF9mb3JfYWRkcmVzcyAoYWJmZCwgc2VjLCB2bWEsIHJlcXVpcmVfc2VjLCBwbGFjZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgYm9vbGVhbiByZXF1aXJlX3NlYzsKLSAgICAgbG9uZyAqcGxhY2U7Ci17Ci0gIC8qIEBAIFdvdWxkIGl0IHNwZWVkIHRoaW5ncyB1cCB0byBjYWNoZSB0aGUgbGFzdCB0d28gc3ltYm9scyByZXR1cm5lZCwKLSAgICAgYW5kIG1heWJlIHRoZWlyIGFkZHJlc3MgcmFuZ2VzPyAgRm9yIG1hbnkgcHJvY2Vzc29ycywgb25seSBvbmUgbWVtb3J5Ci0gICAgIG9wZXJhbmQgY2FuIGJlIHByZXNlbnQgYXQgYSB0aW1lLCBzbyB0aGUgMi1lbnRyeSBjYWNoZSB3b3VsZG4ndCBiZQotICAgICBjb25zdGFudGx5IGNodXJuZWQgYnkgY29kZSBkb2luZyBoZWF2eSBtZW1vcnkgYWNjZXNzZXMuICAqLwotCi0gIC8qIEluZGljZXMgaW4gYHNvcnRlZF9zeW1zJy4gICovCi0gIGxvbmcgbWluID0gMDsKLSAgbG9uZyBtYXggPSBzb3J0ZWRfc3ltY291bnQ7Ci0gIGxvbmcgdGhpc3BsYWNlOwotICB1bnNpZ25lZCBpbnQgb3BiID0gYmZkX29jdGV0c19wZXJfYnl0ZSAoYWJmZCk7IAotCi0gIGlmIChzb3J0ZWRfc3ltY291bnQgPCAxKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIGxvb2tpbmcgZm9yIHRoZSBjbG9zZXN0IHN5bWJvbCB0byB0aGUKLSAgICAgcmVxdWlyZWQgdmFsdWUuICBXZSBhcmUgc2VhcmNoaW5nIHRoZSByYW5nZSAobWluLCBtYXhdLiAgKi8KLSAgd2hpbGUgKG1pbiArIDEgPCBtYXgpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICB0aGlzcGxhY2UgPSAobWF4ICsgbWluKSAvIDI7Ci0gICAgICBzeW0gPSBzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdOwotCi0gICAgICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiB2bWEpCi0JbWF4ID0gdGhpc3BsYWNlOwotICAgICAgZWxzZSBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPCB2bWEpCi0JbWluID0gdGhpc3BsYWNlOwotICAgICAgZWxzZQotCXsKLQkgIG1pbiA9IHRoaXNwbGFjZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIHN5bWJvbCB3ZSB3YW50IGlzIG5vdyBpbiBtaW4sIHRoZSBsb3cgZW5kIG9mIHRoZSByYW5nZSB3ZQotICAgICB3ZXJlIHNlYXJjaGluZy4gIElmIHRoZXJlIGFyZSBzZXZlcmFsIHN5bWJvbHMgd2l0aCB0aGUgc2FtZQotICAgICB2YWx1ZSwgd2Ugd2FudCB0aGUgZmlyc3Qgb25lLiAgKi8KLSAgdGhpc3BsYWNlID0gbWluOwotICB3aGlsZSAodGhpc3BsYWNlID4gMAotCSAmJiAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0pCi0JICAgICA9PSBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbdGhpc3BsYWNlIC0gMV0pKSkKLSAgICAtLXRoaXNwbGFjZTsKLQotICAvKiBJZiB0aGUgZmlsZSBpcyByZWxvY2F0ZWFibGUsIGFuZCB0aGUgc3ltYm9sIGNvdWxkIGJlIGZyb20gdGhpcwotICAgICBzZWN0aW9uLCBwcmVmZXIgYSBzeW1ib2wgZnJvbSB0aGlzIHNlY3Rpb24gb3ZlciBzeW1ib2xzIGZyb20KLSAgICAgb3RoZXJzLCBldmVuIGlmIHRoZSBvdGhlciBzeW1ib2wncyB2YWx1ZSBtaWdodCBiZSBjbG9zZXIuCi0gICAgICAgCi0gICAgIE5vdGUgdGhhdCB0aGlzIG1heSBiZSB3cm9uZyBmb3Igc29tZSBzeW1ib2wgcmVmZXJlbmNlcyBpZiB0aGUKLSAgICAgc2VjdGlvbnMgaGF2ZSBvdmVybGFwcGluZyBtZW1vcnkgcmFuZ2VzLCBidXQgaW4gdGhhdCBjYXNlIHRoZXJlJ3MKLSAgICAgbm8gd2F5IHRvIHRlbGwgd2hhdCdzIGRlc2lyZWQgd2l0aG91dCBsb29raW5nIGF0IHRoZSByZWxvY2F0aW9uCi0gICAgIHRhYmxlLiAgKi8KLQotICBpZiAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXS0+c2VjdGlvbiAhPSBzZWMKLSAgICAgICYmIChyZXF1aXJlX3NlYwotCSAgfHwgKChhYmZkLT5mbGFncyAmIEhBU19SRUxPQykgIT0gMAotCSAgICAgICYmIHZtYSA+PSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JICAgICAgJiYgdm1hIDwgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkJCSsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSAvIG9wYikpKSkKLSAgICB7Ci0gICAgICBsb25nIGk7Ci0KLSAgICAgIGZvciAoaSA9IHRoaXNwbGFjZSArIDE7IGkgPCBzb3J0ZWRfc3ltY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW2ldKQotCSAgICAgICE9IGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgLS1pOwotICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGlmIChzb3J0ZWRfc3ltc1tpXS0+c2VjdGlvbiA9PSBzZWMKLQkgICAgICAmJiAoaSA9PSAwCi0JCSAgfHwgc29ydGVkX3N5bXNbaSAtIDFdLT5zZWN0aW9uICE9IHNlYwotCQkgIHx8IChiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbaV0pCi0JCSAgICAgICE9IGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1tpIC0gMV0pKSkpCi0JICAgIHsKLQkgICAgICB0aGlzcGxhY2UgPSBpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXS0+c2VjdGlvbiAhPSBzZWMpCi0JewotCSAgLyogV2UgZGlkbid0IGZpbmQgYSBnb29kIHN5bWJvbCB3aXRoIGEgc21hbGxlciB2YWx1ZS4KLQkgICAgIExvb2sgZm9yIG9uZSB3aXRoIGEgbGFyZ2VyIHZhbHVlLiAgKi8KLQkgIGZvciAoaSA9IHRoaXNwbGFjZSArIDE7IGkgPCBzb3J0ZWRfc3ltY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzb3J0ZWRfc3ltc1tpXS0+c2VjdGlvbiA9PSBzZWMpCi0JCXsKLQkJICB0aGlzcGxhY2UgPSBpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdLT5zZWN0aW9uICE9IHNlYwotCSAgJiYgKHJlcXVpcmVfc2VjCi0JICAgICAgfHwgKChhYmZkLT5mbGFncyAmIEhBU19SRUxPQykgIT0gMAotCQkgICYmIHZtYSA+PSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCSAgJiYgdm1hIDwgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkJCSAgICArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykpKSkpCi0JewotCSAgLyogVGhlcmUgaXMgbm8gc3VpdGFibGUgc3ltYm9sLiAgKi8KLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgaWYgKHBsYWNlICE9IE5VTEwpCi0gICAgKnBsYWNlID0gdGhpc3BsYWNlOwotCi0gIHJldHVybiBzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdOwotfQotCi0vKiBQcmludCBhbiBhZGRyZXNzIHRvIElORk8gc3ltYm9saWNhbGx5LiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSAoYWJmZCwgc2VjLCBzeW0sIHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gc2tpcF96ZXJvZXM7Ci17Ci0gIG9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpOwotCi0gIGlmIChzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHNlY2FkZHI7Ci0KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIDwlcyIsCi0JCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpKTsKLSAgICAgIHNlY2FkZHIgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpOwotICAgICAgaWYgKHZtYSA8IHNlY2FkZHIpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItMHgiKTsKLQkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHNlY2FkZHIgLSB2bWEsIGluZm8sIHRydWUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHZtYSA+IHNlY2FkZHIpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrMHgiKTsKLQkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSAtIHNlY2FkZHIsIGluZm8sIHRydWUpOwotCX0KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIDwiKTsKLSAgICAgIG9iamR1bXBfcHJpbnRfc3ltbmFtZSAoYWJmZCwgaW5mbywgc3ltKTsKLSAgICAgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHZtYSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0weCIpOwotCSAgb2JqZHVtcF9wcmludF92YWx1ZSAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgLSB2bWEsIGluZm8sIHRydWUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHZtYSA+IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKzB4Iik7Ci0JICBvYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEgLSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSwgaW5mbywgdHJ1ZSk7Ci0JfQotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI+Iik7Ci0gICAgfQotfQotCi0vKiBQcmludCBWTUEgdG8gSU5GTywgc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgSWYgU0tJUF9aRVJPRVMgaXMKLSAgIHRydWUsIGRvbid0IG91dHB1dCBsZWFkaW5nIHplcm9lcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHIgKHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBza2lwX3plcm9lczsKLXsKLSAgc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKmF1eDsKLSAgYXN5bWJvbCAqc3ltOwotCi0gIGlmIChzb3J0ZWRfc3ltY291bnQgPCAxKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgiKTsKLSAgICAgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSwgaW5mbywgc2tpcF96ZXJvZXMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhdXggPSAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKikgaW5mby0+YXBwbGljYXRpb25fZGF0YTsKLSAgc3ltID0gZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGF1eC0+YWJmZCwgYXV4LT5zZWMsIHZtYSwgYXV4LT5yZXF1aXJlX3NlYywKLQkJCQkgKGxvbmcgKikgTlVMTCk7Ci0gIG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSAoYXV4LT5hYmZkLCBhdXgtPnNlYywgc3ltLCB2bWEsIGluZm8sCi0JCQkgICAgICAgc2tpcF96ZXJvZXMpOwotfQotCi0vKiBQcmludCBWTUEgdG8gSU5GTy4gIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBkaXNhc3NlbWJsZXIKLSAgIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyZXNzICh2bWEsIGluZm8pCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgb2JqZHVtcF9wcmludF9hZGRyICh2bWEsIGluZm8sICEgcHJlZml4X2FkZHJlc3Nlcyk7Ci19Ci0KLS8qIERldGVybWluZSBvZiB0aGUgZ2l2ZW4gYWRkcmVzcyBoYXMgYSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGl0LiAgKi8KLQotc3RhdGljIGludAotb2JqZHVtcF9zeW1ib2xfYXRfYWRkcmVzcyAodm1hLCBpbmZvKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICBzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqIGF1eDsKLSAgYXN5bWJvbCAqIHN5bTsKLQotICAvKiBObyBzeW1ib2xzIC0gZG8gbm90IGJvdGhlciBjaGVja2luZy4gICovCi0gIGlmIChzb3J0ZWRfc3ltY291bnQgPCAxKQotICAgIHJldHVybiAwOwotCi0gIGF1eCA9IChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqKSBpbmZvLT5hcHBsaWNhdGlvbl9kYXRhOwotICBzeW0gPSBmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcyAoYXV4LT5hYmZkLCBhdXgtPnNlYywgdm1hLCBhdXgtPnJlcXVpcmVfc2VjLAotCQkJCSAobG9uZyAqKSBOVUxMKTsKLQotICByZXR1cm4gKHN5bSAhPSBOVUxMICYmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA9PSB2bWEpKTsKLX0KLQotLyogSG9sZCB0aGUgbGFzdCBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGFzdCBsaW5lIG51bWJlciB3ZSBkaXNwbGF5ZWQKLSAgIGluIGEgZGlzYXNzZW1ibHkuICAqLwotCi1zdGF0aWMgY2hhciAqcHJldl9mdW5jdGlvbm5hbWU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHByZXZfbGluZTsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgYWxsIGZpbGVzIHRoYXQgd2UgaGF2ZSBzZWVuIHdoZW4gZG9pbmcgYQotICAgZGlzc2Fzc2VtYmx5IHdpdGggc291cmNlLCBzbyB0aGF0IHdlIGtub3cgaG93IG11Y2ggb2YgdGhlIGZpbGUgdG8KLSAgIGRpc3BsYXkuICBUaGlzIGNhbiBiZSBpbXBvcnRhbnQgZm9yIGlubGluZWQgZnVuY3Rpb25zLiAgKi8KLQotc3RydWN0IHByaW50X2ZpbGVfbGlzdAotewotICBzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICpuZXh0OwotICBjaGFyICpmaWxlbmFtZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIEZJTEUgKmY7Ci19OwotCi1zdGF0aWMgc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqcHJpbnRfZmlsZXM7Ci0KLS8qIFRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIGNvbnRleHQgbGluZXMgdG8gc2hvdyB3aGVuIHdlIHN0YXJ0Ci0gICBkaXNwbGF5aW5nIGEgZmlsZSBmb3IgdGhlIGZpcnN0IHRpbWUuICAqLwotCi0jZGVmaW5lIFNIT1dfUFJFQ0VESU5HX0NPTlRFWFRfTElORVMgKDUpCi0KLS8qIFNraXAgYWhlYWQgdG8gYSBnaXZlbiBsaW5lIGluIGEgZmlsZSwgb3B0aW9uYWxseSBwcmludGluZyBlYWNoCi0gICBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLXNraXBfdG9fbGluZSBQQVJBTVMgKChzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICosIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZAotc2tpcF90b19saW5lIChwLCBsaW5lLCBzaG93KQotICAgICBzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICpwOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgYm9vbGVhbiBzaG93OwotewotICB3aGlsZSAocC0+bGluZSA8IGxpbmUpCi0gICAgewotICAgICAgY2hhciBidWZbMTAwXTsKLQotICAgICAgaWYgKGZnZXRzIChidWYsIHNpemVvZiBidWYsIHAtPmYpID09IE5VTEwpCi0JewotCSAgZmNsb3NlIChwLT5mKTsKLQkgIHAtPmYgPSBOVUxMOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2hvdykKLQlwcmludGYgKCIlcyIsIGJ1Zik7Ci0KLSAgICAgIGlmIChzdHJjaHIgKGJ1ZiwgJ1xuJykgIT0gTlVMTCkKLQkrK3AtPmxpbmU7Ci0gICAgfQotfSAgCi0KLS8qIFNob3cgdGhlIGxpbmUgbnVtYmVyLCBvciB0aGUgc291cmNlIGxpbmUsIGluIGEgZGlzc2Fzc2VtYmx5Ci0gICBsaXN0aW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXNob3dfbGluZSAoYWJmZCwgc2VjdGlvbiwgYWRkcl9vZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcl9vZmZzZXQ7Ci17Ci0gIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICBDT05TVCBjaGFyICpmdW5jdGlvbm5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotCi0gIGlmICghIHdpdGhfbGluZV9udW1iZXJzICYmICEgd2l0aF9zb3VyY2VfY29kZSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1zLCBhZGRyX29mZnNldCwgJmZpbGVuYW1lLAotCQkJICAgICAgICZmdW5jdGlvbm5hbWUsICZsaW5lKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGZpbGVuYW1lICE9IE5VTEwgJiYgKmZpbGVuYW1lID09ICdcMCcpCi0gICAgZmlsZW5hbWUgPSBOVUxMOwotICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgKmZ1bmN0aW9ubmFtZSA9PSAnXDAnKQotICAgIGZ1bmN0aW9ubmFtZSA9IE5VTEw7Ci0KLSAgaWYgKHdpdGhfbGluZV9udW1iZXJzKQotICAgIHsKLSAgICAgIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTAotCSAgJiYgKHByZXZfZnVuY3Rpb25uYW1lID09IE5VTEwKLQkgICAgICB8fCBzdHJjbXAgKGZ1bmN0aW9ubmFtZSwgcHJldl9mdW5jdGlvbm5hbWUpICE9IDApKQotCXByaW50ZiAoIiVzKCk6XG4iLCBmdW5jdGlvbm5hbWUpOwotICAgICAgaWYgKGxpbmUgPiAwICYmIGxpbmUgIT0gcHJldl9saW5lKQotCXByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA9PSBOVUxMID8gIj8/PyIgOiBmaWxlbmFtZSwgbGluZSk7Ci0gICAgfQotCi0gIGlmICh3aXRoX3NvdXJjZV9jb2RlCi0gICAgICAmJiBmaWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBsaW5lID4gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICoqcHAsICpwOwotCi0gICAgICBmb3IgKHBwID0gJnByaW50X2ZpbGVzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JaWYgKHN0cmNtcCAoKCpwcCktPmZpbGVuYW1lLCBmaWxlbmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgcCA9ICpwcDsKLQotICAgICAgaWYgKHAgIT0gTlVMTCkKLQl7Ci0JICBpZiAocCAhPSBwcmludF9maWxlcykKLQkgICAgewotCSAgICAgIGludCBsOwotCi0JICAgICAgLyogV2UgaGF2ZSByZWVuY291bnRlcmVkIGEgZmlsZSBuYW1lIHdoaWNoIHdlIHNhdwotCQkgZWFybGllci4gIFRoaXMgaW1wbGllcyB0aGF0IGVpdGhlciB3ZSBhcmUgZHVtcGluZyBvdXQKLQkJIGNvZGUgZnJvbSBhbiBpbmNsdWRlZCBmaWxlLCBvciB0aGUgc2FtZSBmaWxlIHdhcwotCQkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlLiAgVGhlcmUgYXJlIHR3byBjb21tb24gY2FzZXMKLQkJIG9mIGFuIGluY2x1ZGVkIGZpbGU6IGlubGluZSBmdW5jdGlvbnMgaW4gYSBoZWFkZXIKLQkJIGZpbGUsIGFuZCBhIGJpc29uIG9yIGZsZXggc2tlbGV0b24gZmlsZS4gIEluIHRoZQotCQkgZm9ybWVyIGNhc2Ugd2Ugd2FudCB0byBqdXN0IHN0YXJ0IHByaW50aW5nIChidXQgd2UKLQkJIGJhY2sgdXAgYSBmZXcgbGluZXMgdG8gZ2l2ZSBjb250ZXh0KTsgaW4gdGhlIGxhdHRlcgotCQkgY2FzZSB3ZSB3YW50IHRvIGNvbnRpbnVlIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYuICBJCi0JCSBjYW4ndCB0aGluayBvZiBhIGdvb2Qgd2F5IHRvIGRpc3Rpbmd1aXNoIHRoZSBjYXNlcywKLQkJIHNvIEkgdXNlZCBhIGhldXJpc3RpYyBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lLiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChwLT5maWxlbmFtZSArIHN0cmxlbiAocC0+ZmlsZW5hbWUpIC0gMiwgIi5oIikgIT0gMCkKLQkJbCA9IHAtPmxpbmU7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbCA9IGxpbmUgLSBTSE9XX1BSRUNFRElOR19DT05URVhUX0xJTkVTOwotCQkgIGlmIChsIDwgMCkKLQkJICAgIGwgPSAwOwotCQl9Ci0KLQkgICAgICBpZiAocC0+ZiA9PSBOVUxMKQotCQl7Ci0JCSAgcC0+ZiA9IGZvcGVuIChwLT5maWxlbmFtZSwgInIiKTsKLQkJICBwLT5saW5lID0gMDsKLQkJfQotCSAgICAgIGlmIChwLT5mICE9IE5VTEwpCi0JCXNraXBfdG9fbGluZSAocCwgbCwgZmFsc2UpOwotCi0JICAgICAgaWYgKHByaW50X2ZpbGVzLT5mICE9IE5VTEwpCi0JCXsKLQkJICBmY2xvc2UgKHByaW50X2ZpbGVzLT5mKTsKLQkJICBwcmludF9maWxlcy0+ZiA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAocC0+ZiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2tpcF90b19saW5lIChwLCBsaW5lLCB0cnVlKTsKLQkgICAgICAqcHAgPSBwLT5uZXh0OwotCSAgICAgIHAtPm5leHQgPSBwcmludF9maWxlczsKLQkgICAgICBwcmludF9maWxlcyA9IHA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRklMRSAqZjsKLQotCSAgZiA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLQkgIGlmIChmICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpbnQgbDsKLQotCSAgICAgIHAgPSAoKHN0cnVjdCBwcmludF9maWxlX2xpc3QgKikKLQkJICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0KSkpOwotCSAgICAgIHAtPmZpbGVuYW1lID0geG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkgKyAxKTsKLQkgICAgICBzdHJjcHkgKHAtPmZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0JICAgICAgcC0+bGluZSA9IDA7Ci0JICAgICAgcC0+ZiA9IGY7Ci0KLQkgICAgICBpZiAocHJpbnRfZmlsZXMgIT0gTlVMTCAmJiBwcmludF9maWxlcy0+ZiAhPSBOVUxMKQotCQl7Ci0JCSAgZmNsb3NlIChwcmludF9maWxlcy0+Zik7Ci0JCSAgcHJpbnRfZmlsZXMtPmYgPSBOVUxMOwotCQl9Ci0JICAgICAgcC0+bmV4dCA9IHByaW50X2ZpbGVzOwotCSAgICAgIHByaW50X2ZpbGVzID0gcDsKLQotICAgICAgICAgICAgICBpZiAoZmlsZV9zdGFydF9jb250ZXh0KQotICAgICAgICAgICAgICAgIGwgPSAwOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbCA9IGxpbmUgLSBTSE9XX1BSRUNFRElOR19DT05URVhUX0xJTkVTOwotCSAgICAgIGlmIChsIDwgMCkKLQkJbCA9IDA7Ci0JICAgICAgc2tpcF90b19saW5lIChwLCBsLCBmYWxzZSk7Ci0JICAgICAgaWYgKHAtPmYgIT0gTlVMTCkKLQkJc2tpcF90b19saW5lIChwLCBsaW5lLCB0cnVlKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMCi0gICAgICAmJiAocHJldl9mdW5jdGlvbm5hbWUgPT0gTlVMTAotCSAgfHwgc3RyY21wIChmdW5jdGlvbm5hbWUsIHByZXZfZnVuY3Rpb25uYW1lKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAocHJldl9mdW5jdGlvbm5hbWUgIT0gTlVMTCkKLQlmcmVlIChwcmV2X2Z1bmN0aW9ubmFtZSk7Ci0gICAgICBwcmV2X2Z1bmN0aW9ubmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoZnVuY3Rpb25uYW1lKSArIDEpOwotICAgICAgc3RyY3B5IChwcmV2X2Z1bmN0aW9ubmFtZSwgZnVuY3Rpb25uYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxpbmUgPiAwICYmIGxpbmUgIT0gcHJldl9saW5lKQotICAgIHByZXZfbGluZSA9IGxpbmU7Ci19Ci0KLS8qIFBzZXVkbyBGSUxFIG9iamVjdCBmb3Igc3RyaW5ncy4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBjaGFyICpidWZmZXI7Ci0gIHNpemVfdCBzaXplOwotICBjaGFyICpjdXJyZW50OwotfSBTRklMRTsKLQotLyogc3ByaW50ZiB0byBhICJzdHJlYW0iICovCi0KLXN0YXRpYyBpbnQKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLW9iamR1bXBfc3ByaW50ZiAoU0ZJTEUgKmYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotI2Vsc2UKLW9iamR1bXBfc3ByaW50ZiAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0jaWZuZGVmIEFOU0lfUFJPVE9UWVBFUwotICBTRklMRSAqZjsKLSAgY29uc3QgY2hhciAqZm9ybWF0OwotI2VuZGlmCi0gIGNoYXIgKmJ1ZjsKLSAgdmFfbGlzdCBhcmdzOwotICBzaXplX3QgbjsKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZiA9IHZhX2FyZyAoYXJncywgU0ZJTEUgKik7Ci0gIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0gIHZhc3ByaW50ZiAoJmJ1ZiwgZm9ybWF0LCBhcmdzKTsKLQotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGlmIChidWYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIk91dCBvZiB2aXJ0dWFsIG1lbW9yeVxuIikpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIG4gPSBzdHJsZW4gKGJ1Zik7Ci0KLSAgd2hpbGUgKChzaXplX3QpICgoZi0+YnVmZmVyICsgZi0+c2l6ZSkgLSBmLT5jdXJyZW50KSA8IG4gKyAxKQotICAgIHsKLSAgICAgIHNpemVfdCBjdXJyb2ZmOwotCi0gICAgICBjdXJyb2ZmID0gZi0+Y3VycmVudCAtIGYtPmJ1ZmZlcjsKLSAgICAgIGYtPnNpemUgKj0gMjsKLSAgICAgIGYtPmJ1ZmZlciA9IHhyZWFsbG9jIChmLT5idWZmZXIsIGYtPnNpemUpOwotICAgICAgZi0+Y3VycmVudCA9IGYtPmJ1ZmZlciArIGN1cnJvZmY7Ci0gICAgfQotCi0gIG1lbWNweSAoZi0+Y3VycmVudCwgYnVmLCBuKTsKLSAgZi0+Y3VycmVudCArPSBuOwotICBmLT5jdXJyZW50WzBdID0gJ1wwJzsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiBuOwotfQotCi0vKiBUaGUgbnVtYmVyIG9mIHplcm9lcyB3ZSB3YW50IHRvIHNlZSBiZWZvcmUgd2Ugc3RhcnQgc2tpcHBpbmcgdGhlbS4KLSAgIFRoZSBudW1iZXIgaXMgYXJiaXRyYXJpbHkgY2hvc2VuLiAgKi8KLQotI2RlZmluZSBTS0lQX1pFUk9FUyAoOCkKLQotLyogVGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIElmIHRoZQotICAgbnVtYmVyIG9mIHplcm9lcyBhdCB0aGUgZW5kIGlzIGJldHdlZW4gU0tJUF9aRVJPRVNfQVRfRU5EIGFuZAotICAgU0tJUF9aRVJPRVMsIHRoZXkgd2lsbCBiZSBkaXNhc3NlbWJsZWQuICBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbgotICAgU0tJUF9aRVJPRVNfQVRfRU5ELCB0aGV5IHdpbGwgYmUgc2tpcHBlZC4gIFRoaXMgaXMgYSBoZXVyaXN0aWMKLSAgIGF0dGVtcHQgdG8gYXZvaWQgZGlzYXNzZW1ibGluZyB6ZXJvZXMgaW5zZXJ0ZWQgYnkgc2VjdGlvbgotICAgYWxpZ25tZW50LiAgKi8KLQotI2RlZmluZSBTS0lQX1pFUk9FU19BVF9FTkQgKDMpCi0KLS8qIERpc2Fzc2VtYmxlIHNvbWUgZGF0YSBpbiBtZW1vcnkgYmV0d2VlbiBnaXZlbiB2YWx1ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfYnl0ZXMgKGluZm8sIGRpc2Fzc2VtYmxlX2ZuLCBpbnNucywgZGF0YSwgCi0gICAgICAgICAgICAgICAgICAgc3RhcnRfb2Zmc2V0LCBzdG9wX29mZnNldCwgcmVscHBwLAotCQkgICByZWxwcGVuZCkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZV9mbjsKLSAgICAgYm9vbGVhbiBpbnNuczsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJmZF92bWEgc3RhcnRfb2Zmc2V0OwotICAgICBiZmRfdm1hIHN0b3Bfb2Zmc2V0OwotICAgICBhcmVsZW50ICoqKnJlbHBwcDsKLSAgICAgYXJlbGVudCAqKnJlbHBwZW5kOwotewotICBzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqYXV4OwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaW50IG9jdGV0c19wZXJfbGluZTsKLSAgYm9vbGVhbiBkb25lX2RvdDsKLSAgaW50IHNraXBfYWRkcl9jaGFyczsKLSAgYmZkX3ZtYSBhZGRyX29mZnNldDsKLSAgaW50IG9wYiA9IGluZm8tPm9jdGV0c19wZXJfYnl0ZTsKLQotICBhdXggPSAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKikgaW5mby0+YXBwbGljYXRpb25fZGF0YTsKLSAgc2VjdGlvbiA9IGF1eC0+c2VjOwotCi0gIGlmIChpbnNucykKLSAgICBvY3RldHNfcGVyX2xpbmUgPSA0OwotICBlbHNlCi0gICAgb2N0ZXRzX3Blcl9saW5lID0gMTY7Ci0KLSAgLyogRmlndXJlIG91dCBob3cgbWFueSBjaGFyYWN0ZXJzIHRvIHNraXAgYXQgdGhlIHN0YXJ0IG9mIGFuCi0gICAgIGFkZHJlc3MsIHRvIG1ha2UgdGhlIGRpc2Fzc2VtYmx5IGxvb2sgbmljZXIuICBXZSBkaXNjYXJkIGxlYWRpbmcKLSAgICAgemVyb2VzIGluIGNodW5rcyBvZiA0LCBlbnN1cmluZyB0aGF0IHRoZXJlIGlzIGFsd2F5cyBhIGxlYWRpbmcKLSAgICAgemVybyByZW1haW5pbmcuICAqLwotICBza2lwX2FkZHJfY2hhcnMgPSAwOwotICBpZiAoISBwcmVmaXhfYWRkcmVzc2VzKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzMwXTsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIHNwcmludGZfdm1hIChidWYsIHNlY3Rpb24tPnZtYSArIAotICAgICAgICAgICAgICAgICAgIGJmZF9zZWN0aW9uX3NpemUgKHNlY3Rpb24tPm93bmVyLCBzZWN0aW9uKSAvIG9wYik7Ci0gICAgICBzID0gYnVmOwotICAgICAgd2hpbGUgKHNbMF0gPT0gJzAnICYmIHNbMV0gPT0gJzAnICYmIHNbMl0gPT0gJzAnICYmIHNbM10gPT0gJzAnCi0JICAgICAmJiBzWzRdID09ICcwJykKLQl7Ci0JICBza2lwX2FkZHJfY2hhcnMgKz0gNDsKLQkgIHMgKz0gNDsKLQl9Ci0gICAgfQotCi0gIGluZm8tPmluc25faW5mb192YWxpZCA9IDA7Ci0KLSAgZG9uZV9kb3QgPSBmYWxzZTsKLSAgYWRkcl9vZmZzZXQgPSBzdGFydF9vZmZzZXQ7Ci0gIHdoaWxlIChhZGRyX29mZnNldCA8IHN0b3Bfb2Zmc2V0KQotICAgIHsKLSAgICAgIGJmZF92bWEgejsKLSAgICAgIGludCBvY3RldHMgPSAwOwotICAgICAgYm9vbGVhbiBuZWVkX25sID0gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHdlIHNlZSBtb3JlIHRoYW4gU0tJUF9aRVJPRVMgb2N0ZXRzIG9mIHplcm9lcywgd2UganVzdAotICAgICAgICAgcHJpbnQgYC4uLicuICAqLwotICAgICAgZm9yICh6ID0gYWRkcl9vZmZzZXQgKiBvcGI7IHogPCBzdG9wX29mZnNldCAqIG9wYjsgeisrKQotCWlmIChkYXRhW3pdICE9IDApCi0JICBicmVhazsKLSAgICAgIGlmICghIGRpc2Fzc2VtYmxlX3plcm9lcwotCSAgJiYgKGluZm8tPmluc25faW5mb192YWxpZCA9PSAwCi0JICAgICAgfHwgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID09IDApCi0JICAmJiAoeiAtIGFkZHJfb2Zmc2V0ICogb3BiID49IFNLSVBfWkVST0VTCi0JICAgICAgfHwgKHogPT0gc3RvcF9vZmZzZXQgKiBvcGIgJiYgCi0gICAgICAgICAgICAgICAgICB6IC0gYWRkcl9vZmZzZXQgKiBvcGIgPCBTS0lQX1pFUk9FU19BVF9FTkQpKSkKLQl7Ci0JICBwcmludGYgKCJcdC4uLlxuIik7Ci0KLQkgIC8qIElmIHRoZXJlIGFyZSBtb3JlIG5vbnplcm8gb2N0ZXRzIHRvIGZvbGxvdywgd2Ugb25seSBza2lwCi0gICAgICAgICAgICAgemVyb2VzIGluIG11bHRpcGxlcyBvZiA0LCB0byB0cnkgdG8gYXZvaWQgcnVubmluZyBvdmVyCi0gICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIGFuIGluc3RydWN0aW9uIHdoaWNoIGhhcHBlbnMgdG8gc3RhcnQgd2l0aAotICAgICAgICAgICAgIHplcm8uICAqLwotCSAgaWYgKHogIT0gc3RvcF9vZmZzZXQgKiBvcGIpCi0JICAgIHogPSBhZGRyX29mZnNldCAqIG9wYiArICgoeiAtIGFkZHJfb2Zmc2V0ICogb3BiKSAmfiAzKTsKLQotCSAgb2N0ZXRzID0geiAtIGFkZHJfb2Zmc2V0ICogb3BiOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyIGJ1Zls1MF07Ci0JICBTRklMRSBzZmlsZTsKLQkgIGludCBicGMgPSAwOwotCSAgaW50IHBiID0gMDsKLQotCSAgZG9uZV9kb3QgPSBmYWxzZTsKLQotCSAgaWYgKHdpdGhfbGluZV9udW1iZXJzIHx8IHdpdGhfc291cmNlX2NvZGUpCi0JICAgIHNob3dfbGluZSAoYXV4LT5hYmZkLCBzZWN0aW9uLCBhZGRyX29mZnNldCk7Ci0KLQkgIGlmICghIHByZWZpeF9hZGRyZXNzZXMpCi0JICAgIHsKLQkgICAgICBjaGFyICpzOwotCi0JICAgICAgc3ByaW50Zl92bWEgKGJ1Ziwgc2VjdGlvbi0+dm1hICsgYWRkcl9vZmZzZXQpOwotCSAgICAgIGZvciAocyA9IGJ1ZiArIHNraXBfYWRkcl9jaGFyczsgKnMgPT0gJzAnOyBzKyspCi0JCSpzID0gJyAnOwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQkqLS1zID0gJzAnOwotCSAgICAgIHByaW50ZiAoIiVzOlx0IiwgYnVmICsgc2tpcF9hZGRyX2NoYXJzKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXV4LT5yZXF1aXJlX3NlYyA9IHRydWU7Ci0JICAgICAgb2JqZHVtcF9wcmludF9hZGRyZXNzIChzZWN0aW9uLT52bWEgKyBhZGRyX29mZnNldCwgaW5mbyk7Ci0JICAgICAgYXV4LT5yZXF1aXJlX3NlYyA9IGZhbHNlOwotCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JICAgIH0KLQotCSAgaWYgKGluc25zKQotCSAgICB7Ci0JICAgICAgc2ZpbGUuc2l6ZSA9IDEyMDsKLQkgICAgICBzZmlsZS5idWZmZXIgPSB4bWFsbG9jIChzZmlsZS5zaXplKTsKLQkgICAgICBzZmlsZS5jdXJyZW50ID0gc2ZpbGUuYnVmZmVyOwotCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKSBvYmpkdW1wX3NwcmludGY7Ci0JICAgICAgaW5mby0+c3RyZWFtID0gKEZJTEUgKikgJnNmaWxlOwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gMDsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAwOwotCi0JICAgICAgLyogRklYTUU6IFRoaXMgaXMgd3JvbmcuICBJdCB0ZXN0cyB0aGUgbnVtYmVyIG9mIG9jdGV0cwotICAgICAgICAgICAgICAgICBpbiB0aGUgbGFzdCBpbnN0cnVjdGlvbiwgbm90IHRoZSBjdXJyZW50IG9uZS4gICovCi0JICAgICAgaWYgKCpyZWxwcHAgPCByZWxwcGVuZAotCQkgICYmICgqKnJlbHBwcCktPmFkZHJlc3MgPj0gYWRkcl9vZmZzZXQKLQkJICAmJiAoKipyZWxwcHApLT5hZGRyZXNzIDwgYWRkcl9vZmZzZXQgKyBvY3RldHMgLyBvcGIpCi0JCWluZm8tPmZsYWdzID0gSU5TTl9IQVNfUkVMT0M7Ci0JICAgICAgZWxzZQotCQlpbmZvLT5mbGFncyA9IDA7Ci0KLQkgICAgICBvY3RldHMgPSAoKmRpc2Fzc2VtYmxlX2ZuKSAoc2VjdGlvbi0+dm1hICsgYWRkcl9vZmZzZXQsIGluZm8pOwotCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKSBmcHJpbnRmOwotCSAgICAgIGluZm8tPnN0cmVhbSA9IHN0ZG91dDsKLQkgICAgICBpZiAoaW5mby0+Ynl0ZXNfcGVyX2xpbmUgIT0gMCkKLQkJb2N0ZXRzX3Blcl9saW5lID0gaW5mby0+Ynl0ZXNfcGVyX2xpbmU7Ci0JICAgICAgaWYgKG9jdGV0cyA8IDApCi0JCXsKLQkJICBpZiAoc2ZpbGUuY3VycmVudCAhPSBzZmlsZS5idWZmZXIpCi0JCSAgICBwcmludGYgKCIlc1xuIiwgc2ZpbGUuYnVmZmVyKTsKLQkJICBmcmVlIChzZmlsZS5idWZmZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgajsKLQotCSAgICAgIG9jdGV0cyA9IG9jdGV0c19wZXJfbGluZTsKLQkgICAgICBpZiAoYWRkcl9vZmZzZXQgKyBvY3RldHMgLyBvcGIgPiBzdG9wX29mZnNldCkKLQkJb2N0ZXRzID0gKHN0b3Bfb2Zmc2V0IC0gYWRkcl9vZmZzZXQpICogb3BiOwotCi0JICAgICAgZm9yIChqID0gYWRkcl9vZmZzZXQgKiBvcGI7IGogPCBhZGRyX29mZnNldCAqIG9wYiArIG9jdGV0czsgKytqKQotCQl7Ci0JCSAgaWYgKGlzcHJpbnQgKGRhdGFbal0pKQotCQkgICAgYnVmW2ogLSBhZGRyX29mZnNldCAqIG9wYl0gPSBkYXRhW2pdOwotCQkgIGVsc2UKLQkJICAgIGJ1ZltqIC0gYWRkcl9vZmZzZXQgKiBvcGJdID0gJy4nOwotCQl9Ci0JICAgICAgYnVmW2ogLSBhZGRyX29mZnNldCAqIG9wYl0gPSAnXDAnOwotCSAgICB9Ci0KLQkgIGlmIChwcmVmaXhfYWRkcmVzc2VzCi0JICAgICAgPyBzaG93X3Jhd19pbnNuID4gMAotCSAgICAgIDogc2hvd19yYXdfaW5zbiA+PSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBqOwotCi0JICAgICAgLyogSWYgISBwcmVmaXhfYWRkcmVzc2VzIGFuZCAhIHdpZGVfb3V0cHV0LCB3ZSBwcmludAotICAgICAgICAgICAgICAgICBvY3RldHNfcGVyX2xpbmUgb2N0ZXRzIHBlciBsaW5lLiAgKi8KLQkgICAgICBwYiA9IG9jdGV0czsKLQkgICAgICBpZiAocGIgPiBvY3RldHNfcGVyX2xpbmUgJiYgISBwcmVmaXhfYWRkcmVzc2VzICYmICEgd2lkZV9vdXRwdXQpCi0JCXBiID0gb2N0ZXRzX3Blcl9saW5lOwotCi0JICAgICAgaWYgKGluZm8tPmJ5dGVzX3Blcl9jaHVuaykKLQkJYnBjID0gaW5mby0+Ynl0ZXNfcGVyX2NodW5rOwotCSAgICAgIGVsc2UKLQkJYnBjID0gMTsKLQotCSAgICAgIGZvciAoaiA9IGFkZHJfb2Zmc2V0ICogb3BiOyBqIDwgYWRkcl9vZmZzZXQgKiBvcGIgKyBwYjsgaiArPSBicGMpCi0JCXsKLQkJICBpbnQgazsKLQkJICBpZiAoYnBjID4gMSAmJiBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLQkJICAgIHsKLQkJICAgICAgZm9yIChrID0gYnBjIC0gMTsgayA+PSAwOyBrLS0pCi0JCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7Ci0JCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBmb3IgKGsgPSAwOyBrIDwgYnBjOyBrKyspCi0JCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7Ci0JCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGZvciAoOyBwYiA8IG9jdGV0c19wZXJfbGluZTsgcGIgKz0gYnBjKQotCQl7Ci0JCSAgaW50IGs7Ci0KLQkJICBmb3IgKGsgPSAwOyBrIDwgYnBjOyBrKyspCi0JCSAgICBwcmludGYgKCIgICIpOwotCQkgIHB1dGNoYXIgKCcgJyk7Ci0JCX0KLQotCSAgICAgIC8qIFNlcGFyYXRlIHJhdyBkYXRhIGZyb20gaW5zdHJ1Y3Rpb24gYnkgZXh0cmEgc3BhY2UuICAqLwotCSAgICAgIGlmIChpbnNucykKLQkJcHV0Y2hhciAoJ1x0Jyk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIgICAgIik7Ci0JICAgIH0KLQotCSAgaWYgKCEgaW5zbnMpCi0JICAgIHByaW50ZiAoIiVzIiwgYnVmKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzIiwgc2ZpbGUuYnVmZmVyKTsKLQkgICAgICBmcmVlIChzZmlsZS5idWZmZXIpOwotCSAgICB9Ci0KLQkgIGlmIChwcmVmaXhfYWRkcmVzc2VzCi0JICAgICAgPyBzaG93X3Jhd19pbnNuID4gMAotCSAgICAgIDogc2hvd19yYXdfaW5zbiA+PSAwKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKHBiIDwgb2N0ZXRzKQotCQl7Ci0JCSAgYmZkX3ZtYSBqOwotCQkgIGNoYXIgKnM7Ci0KLQkJICBwdXRjaGFyICgnXG4nKTsKLQkJICBqID0gYWRkcl9vZmZzZXQgKiBvcGIgKyBwYjsKLQotCQkgIHNwcmludGZfdm1hIChidWYsIHNlY3Rpb24tPnZtYSArIGogLyBvcGIpOwotCQkgIGZvciAocyA9IGJ1ZiArIHNraXBfYWRkcl9jaGFyczsgKnMgPT0gJzAnOyBzKyspCi0JCSAgICAqcyA9ICcgJzsKLQkJICBpZiAoKnMgPT0gJ1wwJykKLQkJICAgICotLXMgPSAnMCc7Ci0JCSAgcHJpbnRmICgiJXM6XHQiLCBidWYgKyBza2lwX2FkZHJfY2hhcnMpOwotCi0JCSAgcGIgKz0gb2N0ZXRzX3Blcl9saW5lOwotCQkgIGlmIChwYiA+IG9jdGV0cykKLQkJICAgIHBiID0gb2N0ZXRzOwotCQkgIGZvciAoOyBqIDwgYWRkcl9vZmZzZXQgKiBvcGIgKyBwYjsgaiArPSBicGMpCi0JCSAgICB7Ci0JCSAgICAgIGludCBrOwotCi0JCSAgICAgIGlmIChicGMgPiAxICYmIGluZm8tPmRpc3BsYXlfZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotCQkJewotCQkJICBmb3IgKGsgPSBicGMgLSAxOyBrID49IDA7IGstLSkKLQkJCSAgICBwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7Ci0JCQkgIHB1dGNoYXIgKCcgJyk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZm9yIChrID0gMDsgayA8IGJwYzsgaysrKQotCQkJICAgIHByaW50ZiAoIiUwMngiLCAodW5zaWduZWQpIGRhdGFbaiArIGtdKTsKLQkJCSAgcHV0Y2hhciAoJyAnKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmICghd2lkZV9vdXRwdXQpCi0JICAgIHB1dGNoYXIgKCdcbicpOwotCSAgZWxzZQotCSAgICBuZWVkX25sID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmIChkdW1wX3JlbG9jX2luZm8KLQkgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICB3aGlsZSAoKCpyZWxwcHApIDwgcmVscHBlbmQKLQkJICYmICgoKipyZWxwcHApLT5hZGRyZXNzID49IChiZmRfdm1hKSBhZGRyX29mZnNldAotCQkgICAgICYmICgqKnJlbHBwcCktPmFkZHJlc3MgPCAoYmZkX3ZtYSkgYWRkcl9vZmZzZXQgKyBvY3RldHMgLyBvcGIpKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqcTsKLQotCSAgICAgIHEgPSAqKnJlbHBwcDsKLQotCSAgICAgIGlmICh3aWRlX291dHB1dCkKLQkJcHV0Y2hhciAoJ1x0Jyk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCJcdFx0XHQiKTsKLQotCSAgICAgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHNlY3Rpb24tPnZtYSArIHEtPmFkZHJlc3MsIGluZm8sIHRydWUpOwotCi0JICAgICAgcHJpbnRmICgiOiAlc1x0IiwgcS0+aG93dG8tPm5hbWUpOwotCi0JICAgICAgaWYgKHEtPnN5bV9wdHJfcHRyID09IE5VTEwgfHwgKnEtPnN5bV9wdHJfcHRyID09IE5VTEwpCi0JCXByaW50ZiAoIip1bmtub3duKiIpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0JCSAgc3ltX25hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpOwotCQkgIGlmIChzeW1fbmFtZSAhPSBOVUxMICYmICpzeW1fbmFtZSAhPSAnXDAnKQotCQkgICAgb2JqZHVtcF9wcmludF9zeW1uYW1lIChhdXgtPmFiZmQsIGluZm8sICpxLT5zeW1fcHRyX3B0cik7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLQotCQkgICAgICBzeW1fc2VjID0gYmZkX2dldF9zZWN0aW9uICgqcS0+c3ltX3B0cl9wdHIpOwotCQkgICAgICBzeW1fbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhdXgtPmFiZmQsIHN5bV9zZWMpOwotCQkgICAgICBpZiAoc3ltX25hbWUgPT0gTlVMTCB8fCAqc3ltX25hbWUgPT0gJ1wwJykKLQkJCXN5bV9uYW1lID0gIip1bmtub3duKiI7Ci0JCSAgICAgIHByaW50ZiAoIiVzIiwgc3ltX25hbWUpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAocS0+YWRkZW5kKQotCQl7Ci0JCSAgcHJpbnRmICgiKzB4Iik7Ci0JCSAgb2JqZHVtcF9wcmludF92YWx1ZSAocS0+YWRkZW5kLCBpbmZvLCB0cnVlKTsKLQkJfQotCi0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgICBuZWVkX25sID0gZmFsc2U7Ci0JICAgICAgKysoKnJlbHBwcCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChuZWVkX25sKQotCXByaW50ZiAoIlxuIik7Ci0KLSAgICAgIGFkZHJfb2Zmc2V0ICs9IG9jdGV0cyAvIG9wYjsKLSAgICB9Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9kYXRhIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcl9vZmZzZXQ7Ci0gIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZV9mbjsKLSAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gZGlzYXNtX2luZm87Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvIGF1eDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGludCBvcGIgPSBiZmRfb2N0ZXRzX3Blcl9ieXRlIChhYmZkKTsKLQotICBwcmludF9maWxlcyA9IE5VTEw7Ci0gIHByZXZfZnVuY3Rpb25uYW1lID0gTlVMTDsKLSAgcHJldl9saW5lID0gLTE7Ci0KLSAgLyogV2UgbWFrZSBhIGNvcHkgb2Ygc3ltcyB0byBzb3J0LiAgV2UgZG9uJ3Qgd2FudCB0byBzb3J0IHN5bXMKLSAgICAgYmVjYXVzZSB0aGF0IHdpbGwgc2NyZXcgdXAgdGhlIHJlbG9jcy4gICovCi0gIHNvcnRlZF9zeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgbWVtY3B5IChzb3J0ZWRfc3ltcywgc3ltcywgc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIHNvcnRlZF9zeW1jb3VudCA9IHJlbW92ZV91c2VsZXNzX3N5bWJvbHMgKHNvcnRlZF9zeW1zLCBzeW1jb3VudCk7Ci0KLSAgLyogU29ydCB0aGUgc3ltYm9scyBpbnRvIHNlY3Rpb24gYW5kIHN5bWJvbCBvcmRlciAqLwotICBxc29ydCAoc29ydGVkX3N5bXMsIHNvcnRlZF9zeW1jb3VudCwgc2l6ZW9mIChhc3ltYm9sICopLCBjb21wYXJlX3N5bWJvbHMpOwotCi0gIElOSVRfRElTQVNTRU1CTEVfSU5GTyhkaXNhc21faW5mbywgc3Rkb3V0LCBmcHJpbnRmKTsKLSAgZGlzYXNtX2luZm8uYXBwbGljYXRpb25fZGF0YSA9IChQVFIpICZhdXg7Ci0gIGF1eC5hYmZkID0gYWJmZDsKLSAgYXV4LnJlcXVpcmVfc2VjID0gZmFsc2U7Ci0gIGRpc2FzbV9pbmZvLnByaW50X2FkZHJlc3NfZnVuYyA9IG9iamR1bXBfcHJpbnRfYWRkcmVzczsKLSAgZGlzYXNtX2luZm8uc3ltYm9sX2F0X2FkZHJlc3NfZnVuYyA9IG9iamR1bXBfc3ltYm9sX2F0X2FkZHJlc3M7Ci0gIGRpc2FzbV9pbmZvLm9jdGV0c19wZXJfYnl0ZSA9IG9wYjsKLQotICBpZiAobWFjaGluZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqaW5mbyA9IGJmZF9zY2FuX2FyY2ggKG1hY2hpbmUpOwotICAgICAgaWYgKGluZm8gPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCB1c2Ugc3VwcGxpZWQgbWFjaGluZSAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwKLQkJICAgbWFjaGluZSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBhYmZkLT5hcmNoX2luZm8gPSBpbmZvOwotICAgIH0KLQotICBpZiAoZW5kaWFuICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX3RhcmdldCAqeHZlYzsKLQotICAgICAgeHZlYyA9IChzdHJ1Y3QgYmZkX3RhcmdldCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfdGFyZ2V0KSk7Ci0gICAgICBtZW1jcHkgKHh2ZWMsIGFiZmQtPnh2ZWMsIHNpemVvZiAoc3RydWN0IGJmZF90YXJnZXQpKTsKLSAgICAgIHh2ZWMtPmJ5dGVvcmRlciA9IGVuZGlhbjsKLSAgICAgIGFiZmQtPnh2ZWMgPSB4dmVjOwotICAgIH0KLQotICBkaXNhc3NlbWJsZV9mbiA9IGRpc2Fzc2VtYmxlciAoYWJmZCk7Ci0gIGlmICghZGlzYXNzZW1ibGVfZm4pCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogQ2FuJ3QgZGlzYXNzZW1ibGUgZm9yIGFyY2hpdGVjdHVyZSAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwKLQkgICAgICAgYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGJmZF9nZXRfYXJjaCAoYWJmZCksIDApKTsKLSAgICAgIGV4aXRfc3RhdHVzID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGlzYXNtX2luZm8uZmxhdm91ciA9IGJmZF9nZXRfZmxhdm91ciAoYWJmZCk7Ci0gIGRpc2FzbV9pbmZvLmFyY2ggPSBiZmRfZ2V0X2FyY2ggKGFiZmQpOwotICBkaXNhc21faW5mby5tYWNoID0gYmZkX2dldF9tYWNoIChhYmZkKTsKLSAgZGlzYXNtX2luZm8uZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBkaXNhc3NlbWJsZXJfb3B0aW9uczsKLSAgCi0gIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgZGlzYXNtX2luZm8uZGlzcGxheV9lbmRpYW4gPSBkaXNhc21faW5mby5lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLSAgZWxzZSBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGRpc2FzbV9pbmZvLmRpc3BsYXlfZW5kaWFuID0gZGlzYXNtX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7Ci0gIGVsc2UKLSAgICAvKiA/Pz8gQWJvcnRpbmcgaGVyZSBzZWVtcyB0b28gZHJhc3RpYy4gIFdlIGNvdWxkIGRlZmF1bHQgdG8gYmlnIG9yIGxpdHRsZQotICAgICAgIGluc3RlYWQuICAqLwotICAgIGRpc2FzbV9pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTjsKLQotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBzZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpkYXRhID0gTlVMTDsKLSAgICAgIGJmZF9zaXplX3R5cGUgZGF0YXNpemUgPSAwOwotICAgICAgYXJlbGVudCAqKnJlbGJ1ZiA9IE5VTEw7Ci0gICAgICBhcmVsZW50ICoqcmVscHAgPSBOVUxMOwotICAgICAgYXJlbGVudCAqKnJlbHBwZW5kID0gTlVMTDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RvcF9vZmZzZXQ7Ci0gICAgICBhc3ltYm9sICpzeW0gPSBOVUxMOwotICAgICAgbG9uZyBwbGFjZSA9IDA7Ci0KLSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotCSAgfHwgKCEgZGlzYXNzZW1ibGVfYWxsCi0JICAgICAgJiYgb25seSA9PSBOVUxMCi0JICAgICAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDApKQotCWNvbnRpbnVlOwotICAgICAgaWYgKG9ubHkgIT0gKGNoYXIgKikgTlVMTCAmJiBzdHJjbXAgKG9ubHksIHNlY3Rpb24tPm5hbWUpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChkdW1wX3JlbG9jX2luZm8KLQkgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICBsb25nIHJlbHNpemU7Ci0KLQkgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWN0aW9uKTsKLQkgIGlmIChyZWxzaXplIDwgMCkKLQkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLQkgIGlmIChyZWxzaXplID4gMCkKLQkgICAgewotCSAgICAgIGxvbmcgcmVsY291bnQ7Ci0KLQkgICAgICByZWxidWYgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0JICAgICAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxidWYsIHN5bXMpOwotCSAgICAgIGlmIChyZWxjb3VudCA8IDApCi0JCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0JICAgICAgLyogU29ydCB0aGUgcmVsb2NzIGJ5IGFkZHJlc3MuICAqLwotCSAgICAgIHFzb3J0IChyZWxidWYsIHJlbGNvdW50LCBzaXplb2YgKGFyZWxlbnQgKiksIGNvbXBhcmVfcmVsb2NzKTsKLQotCSAgICAgIHJlbHBwID0gcmVsYnVmOwotCSAgICAgIHJlbHBwZW5kID0gcmVscHAgKyByZWxjb3VudDsKLQotCSAgICAgIC8qIFNraXAgb3ZlciB0aGUgcmVsb2NzIGJlbG9uZ2luZyB0byBhZGRyZXNzZXMgYmVsb3cgdGhlCi0JCSBzdGFydCBhZGRyZXNzLiAgKi8KLQkgICAgICBpZiAoc3RhcnRfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICB3aGlsZSAocmVscHAgPCByZWxwcGVuZAotCQkJICYmICgqcmVscHApLT5hZGRyZXNzIDwgc3RhcnRfYWRkcmVzcykKLQkJICAgICsrcmVscHA7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgcHJpbnRmIChfKCJEaXNhc3NlbWJseSBvZiBzZWN0aW9uICVzOlxuIiksIHNlY3Rpb24tPm5hbWUpOwotCi0gICAgICBkYXRhc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdGlvbik7Ci0gICAgICBpZiAoZGF0YXNpemUgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgZGF0YSA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jICgoc2l6ZV90KSBkYXRhc2l6ZSk7Ci0KLSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgZGF0YSwgMCwgZGF0YXNpemUpOwotCi0gICAgICBhdXguc2VjID0gc2VjdGlvbjsKLSAgICAgIGRpc2FzbV9pbmZvLmJ1ZmZlciA9IGRhdGE7Ci0gICAgICBkaXNhc21faW5mby5idWZmZXJfdm1hID0gc2VjdGlvbi0+dm1hOwotICAgICAgZGlzYXNtX2luZm8uYnVmZmVyX2xlbmd0aCA9IGRhdGFzaXplOwotICAgICAgaWYgKHN0YXJ0X2FkZHJlc3MgPT0gKGJmZF92bWEpIC0xCi0JICB8fCBzdGFydF9hZGRyZXNzIDwgZGlzYXNtX2luZm8uYnVmZmVyX3ZtYSkKLQlhZGRyX29mZnNldCA9IDA7Ci0gICAgICBlbHNlCi0JYWRkcl9vZmZzZXQgPSBzdGFydF9hZGRyZXNzIC0gZGlzYXNtX2luZm8uYnVmZmVyX3ZtYTsKLSAgICAgIGlmIChzdG9wX2FkZHJlc3MgPT0gKGJmZF92bWEpIC0xKQotCXN0b3Bfb2Zmc2V0ID0gZGF0YXNpemUgLyBvcGI7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHN0b3BfYWRkcmVzcyA8IGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWEpCi0JICAgIHN0b3Bfb2Zmc2V0ID0gMDsKLQkgIGVsc2UKLQkgICAgc3RvcF9vZmZzZXQgPSBzdG9wX2FkZHJlc3MgLSBkaXNhc21faW5mby5idWZmZXJfdm1hOwotCSAgaWYgKHN0b3Bfb2Zmc2V0ID4gZGlzYXNtX2luZm8uYnVmZmVyX2xlbmd0aCAvIG9wYikKLQkgICAgc3RvcF9vZmZzZXQgPSBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoIC8gb3BiOwotCX0KLQotICAgICAgc3ltID0gZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGFiZmQsIHNlY3Rpb24sIHNlY3Rpb24tPnZtYSArIGFkZHJfb2Zmc2V0LAotCQkJCSAgICAgdHJ1ZSwgJnBsYWNlKTsKLQotICAgICAgd2hpbGUgKGFkZHJfb2Zmc2V0IDwgc3RvcF9vZmZzZXQpCi0JewotCSAgYXN5bWJvbCAqbmV4dHN5bTsKLQkgIHVuc2lnbmVkIGxvbmcgbmV4dHN0b3Bfb2Zmc2V0OwotCSAgYm9vbGVhbiBpbnNuczsKLQkgIAotCSAgaWYgKHN5bSAhPSBOVUxMICYmIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pIDw9IHNlY3Rpb24tPnZtYSArIGFkZHJfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgaW50IHg7Ci0KLQkgICAgICBmb3IgKHggPSBwbGFjZTsKLQkJICAgKHggPCBzb3J0ZWRfc3ltY291bnQKLQkJICAgICYmIGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1t4XSkgPD0gc2VjdGlvbi0+dm1hICsgYWRkcl9vZmZzZXQpOwotCQkgICArK3gpCi0JCWNvbnRpbnVlOwotCSAgICAgIGRpc2FzbV9pbmZvLnN5bWJvbHMgPSAmIHNvcnRlZF9zeW1zW3BsYWNlXTsKLQkgICAgICBkaXNhc21faW5mby5udW1fc3ltYm9scyA9IHggLSBwbGFjZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBkaXNhc21faW5mby5zeW1ib2xzID0gTlVMTDsKLQotCSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgICAgb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhYmZkLCBzZWN0aW9uLCBzeW0sCi0JCQkJCSAgIHNlY3Rpb24tPnZtYSArIGFkZHJfb2Zmc2V0LAotCQkJCQkgICAmZGlzYXNtX2luZm8sCi0JCQkJCSAgIGZhbHNlKTsKLQkgICAgICBwcmludGYgKCI6XG4iKTsKLQkgICAgfQotCSAgCi0JICBpZiAoc3ltICE9IE5VTEwgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiBzZWN0aW9uLT52bWEgKyBhZGRyX29mZnNldCkKLQkgICAgbmV4dHN5bSA9IHN5bTsKLQkgIGVsc2UgaWYgKHN5bSA9PSBOVUxMKQotCSAgICBuZXh0c3ltID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNlYXJjaCBmb3J3YXJkIGZvciB0aGUgbmV4dCBhcHByb3ByaWF0ZSBzeW1ib2wgaW4KLSAgICAgICAgICAgICAgICAgU0VDVElPTi4gIE5vdGUgdGhhdCBhbGwgdGhlIHN5bWJvbHMgYXJlIHNvcnRlZAotICAgICAgICAgICAgICAgICB0b2dldGhlciBpbnRvIG9uZSBiaWcgYXJyYXksIGFuZCB0aGF0IHNvbWUgc2VjdGlvbnMKLSAgICAgICAgICAgICAgICAgbWF5IGhhdmUgb3ZlcmxhcHBpbmcgYWRkcmVzc2VzLiAgKi8KLQkgICAgICB3aGlsZSAocGxhY2UgPCBzb3J0ZWRfc3ltY291bnQKLQkJICAgICAmJiAoc29ydGVkX3N5bXNbcGxhY2VdLT5zZWN0aW9uICE9IHNlY3Rpb24KLQkJCSB8fCAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3BsYWNlXSkKLQkJCSAgICAgPD0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKSkKLQkJKytwbGFjZTsKLQkgICAgICBpZiAocGxhY2UgPj0gc29ydGVkX3N5bWNvdW50KQotCQluZXh0c3ltID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCW5leHRzeW0gPSBzb3J0ZWRfc3ltc1twbGFjZV07Ci0JICAgIH0KLQkgIAotCSAgaWYgKHN5bSAhPSBOVUxMICYmIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gc2VjdGlvbi0+dm1hICsgYWRkcl9vZmZzZXQpCi0JICAgIHsKLQkgICAgICBuZXh0c3RvcF9vZmZzZXQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICBpZiAobmV4dHN0b3Bfb2Zmc2V0ID4gc3RvcF9vZmZzZXQpCi0JCW5leHRzdG9wX29mZnNldCA9IHN0b3Bfb2Zmc2V0OwotCSAgICB9Ci0JICBlbHNlIGlmIChuZXh0c3ltID09IE5VTEwpCi0JICAgIG5leHRzdG9wX29mZnNldCA9IHN0b3Bfb2Zmc2V0OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmV4dHN0b3Bfb2Zmc2V0ID0gYmZkX2FzeW1ib2xfdmFsdWUgKG5leHRzeW0pIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIGlmIChuZXh0c3RvcF9vZmZzZXQgPiBzdG9wX29mZnNldCkKLQkJbmV4dHN0b3Bfb2Zmc2V0ID0gc3RvcF9vZmZzZXQ7Ci0JICAgIH0KLQkgIAotCSAgLyogSWYgYSBzeW1ib2wgaXMgZXhwbGljaXRseSBtYXJrZWQgYXMgYmVpbmcgYW4gb2JqZWN0Ci0JICAgICByYXRoZXIgdGhhbiBhIGZ1bmN0aW9uLCBqdXN0IGR1bXAgdGhlIGJ5dGVzIHdpdGhvdXQKLQkgICAgIGRpc2Fzc2VtYmxpbmcgdGhlbS4gICovCi0JICBpZiAoZGlzYXNzZW1ibGVfYWxsCi0JICAgICAgfHwgc3ltID09IE5VTEwKLQkgICAgICB8fCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHNlY3Rpb24tPnZtYSArIGFkZHJfb2Zmc2V0Ci0JICAgICAgfHwgKChzeW0tPmZsYWdzICYgQlNGX09CSkVDVCkgPT0gMAotCQkgICYmIChzdHJzdHIgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJnbnVfY29tcGlsZWQiKQotCQkgICAgICA9PSBOVUxMKQotCQkgICYmIChzdHJzdHIgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJnY2MyX2NvbXBpbGVkIikKLQkJICAgICAgPT0gTlVMTCkpCi0JICAgICAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IDApCi0JICAgIGluc25zID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgaW5zbnMgPSBmYWxzZTsKLQkgIAotCSAgZGlzYXNzZW1ibGVfYnl0ZXMgKCZkaXNhc21faW5mbywgZGlzYXNzZW1ibGVfZm4sIGluc25zLCBkYXRhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcl9vZmZzZXQsIG5leHRzdG9wX29mZnNldCwgJnJlbHBwLCByZWxwcGVuZCk7Ci0JICAKLQkgIGFkZHJfb2Zmc2V0ID0gbmV4dHN0b3Bfb2Zmc2V0OwotCSAgc3ltID0gbmV4dHN5bTsKLQl9Ci0gICAgICAKLSAgICAgIGZyZWUgKGRhdGEpOwotICAgICAgaWYgKHJlbGJ1ZiAhPSBOVUxMKQotCWZyZWUgKHJlbGJ1Zik7Ci0gICAgfQotICBmcmVlIChzb3J0ZWRfc3ltcyk7Ci19Ci0MCi0KLS8qIERlZmluZSBhIHRhYmxlIG9mIHN0YWIgdmFsdWVzIGFuZCBwcmludC1zdHJpbmdzLiAgV2Ugd2lzaCB0aGUgaW5pdGlhbGl6ZXIKLSAgIGNvdWxkIGJlIGEgZGlyZWN0LW1hcHBlZCB0YWJsZSwgYnV0IGluc3RlYWQgd2UgYnVpbGQgb25lIHRoZSBmaXJzdAotICAgdGltZSB3ZSBuZWVkIGl0LiAgKi8KLQotc3RhdGljIHZvaWQgZHVtcF9zZWN0aW9uX3N0YWJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqc3RhYnNlY3RfbmFtZSwKLQkJCQkJY2hhciAqc3Ryc2VjdF9uYW1lKSk7Ci0KLS8qIER1bXAgdGhlIHN0YWJzIHNlY3Rpb25zIGZyb20gYW4gb2JqZWN0IGZpbGUgdGhhdCBoYXMgYSBzZWN0aW9uIHRoYXQKLSAgIHVzZXMgU3VuIHN0YWJzIGVuY29kaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfc3RhYnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiLnN0YWIiLCAiLnN0YWJzdHIiKTsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiLnN0YWIuZXhjbCIsICIuc3RhYi5leGNsc3RyIik7Ci0gIGR1bXBfc2VjdGlvbl9zdGFicyAoYWJmZCwgIi5zdGFiLmluZGV4IiwgIi5zdGFiLmluZGV4c3RyIik7Ci0gIGR1bXBfc2VjdGlvbl9zdGFicyAoYWJmZCwgIiRHREJfU1lNQk9MUyQiLCAiJEdEQl9TVFJJTkdTJCIpOwotfQotCi1zdGF0aWMgYmZkX2J5dGUgKnN0YWJzOwotc3RhdGljIGJmZF9zaXplX3R5cGUgc3RhYl9zaXplOwotCi1zdGF0aWMgY2hhciAqc3RydGFiOwotc3RhdGljIGJmZF9zaXplX3R5cGUgc3RhYnN0cl9zaXplOwotCi0vKiBSZWFkIEFCRkQncyBzdGFicyBzZWN0aW9uIFNUQUJTRUNUX05BTUUgaW50byBgc3RhYnMnCi0gICBhbmQgc3RyaW5nIHRhYmxlIHNlY3Rpb24gU1RSU0VDVF9OQU1FIGludG8gYHN0cnRhYicuCi0gICBJZiB0aGUgc2VjdGlvbiBleGlzdHMgYW5kIHdhcyByZWFkLCBhbGxvY2F0ZSB0aGUgc3BhY2UgYW5kIHJldHVybiB0cnVlLgotICAgT3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1yZWFkX3NlY3Rpb25fc3RhYnMgKGFiZmQsIHN0YWJzZWN0X25hbWUsIHN0cnNlY3RfbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpzdGFic2VjdF9uYW1lOwotICAgICBjb25zdCBjaGFyICpzdHJzZWN0X25hbWU7Ci17Ci0gIGFzZWN0aW9uICpzdGFic2VjdCwgKnN0YWJzdHJzZWN0OwotCi0gIHN0YWJzZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN0YWJzZWN0X25hbWUpOwotICBpZiAoMCA9PSBzdGFic2VjdCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIk5vICVzIHNlY3Rpb24gcHJlc2VudFxuXG4iKSwgc3RhYnNlY3RfbmFtZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHN0YWJzdHJzZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN0cnNlY3RfbmFtZSk7Ci0gIGlmICgwID09IHN0YWJzdHJzZWN0KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzIGhhcyBubyAlcyBzZWN0aW9uXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3Ryc2VjdF9uYW1lKTsKLSAgICAgIGV4aXRfc3RhdHVzID0gMTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gCi0gIHN0YWJfc2l6ZSAgICA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0YWJzZWN0KTsKLSAgc3RhYnN0cl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3RhYnN0cnNlY3QpOwotCi0gIHN0YWJzICA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzdGFiX3NpemUpOwotICBzdHJ0YWIgPSAoY2hhciAqKSB4bWFsbG9jIChzdGFic3RyX3NpemUpOwotICAKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic2VjdCwgKFBUUikgc3RhYnMsIDAsIHN0YWJfc2l6ZSkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogUmVhZGluZyAlcyBzZWN0aW9uIG9mICVzIGZhaWxlZDogJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIHN0YWJzZWN0X25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBmcmVlIChzdGFicyk7Ci0gICAgICBmcmVlIChzdHJ0YWIpOwotICAgICAgZXhpdF9zdGF0dXMgPSAxOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzdHJzZWN0LCAoUFRSKSBzdHJ0YWIsIDAsCi0JCQkJICBzdGFic3RyX3NpemUpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IFJlYWRpbmcgJXMgc2VjdGlvbiBvZiAlcyBmYWlsZWQ6ICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBzdHJzZWN0X25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBmcmVlIChzdGFicyk7Ci0gICAgICBmcmVlIChzdHJ0YWIpOwotICAgICAgZXhpdF9zdGF0dXMgPSAxOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhYnMgZW50cmllcyB1c2UgYSAxMiBieXRlIGZvcm1hdDoKLSAgICAgNCBieXRlIHN0cmluZyB0YWJsZSBpbmRleAotICAgICAxIGJ5dGUgc3RhYiB0eXBlCi0gICAgIDEgYnl0ZSBzdGFiIG90aGVyIGZpZWxkCi0gICAgIDIgYnl0ZSBzdGFiIGRlc2MgZmllbGQKLSAgICAgNCBieXRlIHN0YWIgdmFsdWUKLSAgIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgZm9yIGEgNjQgYml0IG9iamVjdCBmb3JtYXQuICAqLwotCi0jZGVmaW5lIFNUUkRYT0ZGICgwKQotI2RlZmluZSBUWVBFT0ZGICg0KQotI2RlZmluZSBPVEhFUk9GRiAoNSkKLSNkZWZpbmUgREVTQ09GRiAoNikKLSNkZWZpbmUgVkFMT0ZGICg4KQotI2RlZmluZSBTVEFCU0laRSAoMTIpCi0KLS8qIFByaW50IEFCRkQncyBzdGFicyBzZWN0aW9uIFNUQUJTRUNUX05BTUUgKGluIGBzdGFicycpLAotICAgdXNpbmcgc3RyaW5nIHRhYmxlIHNlY3Rpb24gU1RSU0VDVF9OQU1FIChpbiBgc3RydGFiJykuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2VjdGlvbl9zdGFicyAoYWJmZCwgc3RhYnNlY3RfbmFtZSwgc3Ryc2VjdF9uYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YWJzZWN0X25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cnNlY3RfbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgaTsKLSAgdW5zaWduZWQgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gMCwgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQgPSAwOwotICBiZmRfYnl0ZSAqc3RhYnAsICpzdGFic19lbmQ7Ci0KLSAgc3RhYnAgPSBzdGFiczsKLSAgc3RhYnNfZW5kID0gc3RhYnAgKyBzdGFiX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJDb250ZW50cyBvZiAlcyBzZWN0aW9uOlxuXG4iKSwgc3RhYnNlY3RfbmFtZSk7Ci0gIHByaW50ZiAoIlN5bW51bSBuX3R5cGUgbl9vdGhyIG5fZGVzYyBuX3ZhbHVlICBuX3N0cnggU3RyaW5nXG4iKTsKLQotICAvKiBMb29wIHRocm91Z2ggYWxsIHN5bWJvbHMgYW5kIHByaW50IHRoZW0uCi0KLSAgICAgV2Ugc3RhcnQgdGhlIGluZGV4IGF0IC0xIGJlY2F1c2UgdGhlcmUgaXMgYSBkdW1teSBzeW1ib2wgb24KLSAgICAgdGhlIGZyb250IG9mIHN0YWJzLWluLXtjb2ZmLGVsZn0gc2VjdGlvbnMgdGhhdCBzdXBwbGllcyBzaXplcy4gICovCi0KLSAgZm9yIChpID0gLTE7IHN0YWJwIDwgc3RhYnNfZW5kOyBzdGFicCArPSBTVEFCU0laRSwgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIHN0cng7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHR5cGUsIG90aGVyOwotICAgICAgdW5zaWduZWQgc2hvcnQgZGVzYzsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0KLSAgICAgIHN0cnggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgU1RSRFhPRkYpOwotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBzdGFicCArIFRZUEVPRkYpOwotICAgICAgb3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgc3RhYnAgKyBPVEhFUk9GRik7Ci0gICAgICBkZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzdGFicCArIERFU0NPRkYpOwotICAgICAgdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgVkFMT0ZGKTsKLQotICAgICAgcHJpbnRmICgiXG4lLTZkICIsIGkpOwotICAgICAgLyogRWl0aGVyIHByaW50IHRoZSBzdGFiIG5hbWUsIG9yLCBpZiB1bm5hbWVkLCBwcmludCBpdHMgbnVtYmVyCi0JIGFnYWluIChtYWtlcyBjb25zaXN0ZW50IGZvcm1hdHRpbmcgZm9yIHRvb2xzIGxpa2UgYXdrKS4gKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3N0YWJfbmFtZSAodHlwZSk7Ci0gICAgICBpZiAobmFtZSAhPSBOVUxMKQotCXByaW50ZiAoIiUtNnMiLCBuYW1lKTsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPT0gTl9VTkRGKQotCXByaW50ZiAoIkhkclN5bSIpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiUtNmQiLCB0eXBlKTsKLSAgICAgIHByaW50ZiAoIiAlLTZkICUtNmQgIiwgb3RoZXIsIGRlc2MpOwotICAgICAgcHJpbnRmX3ZtYSAodmFsdWUpOwotICAgICAgcHJpbnRmICgiICUtNmx1Iiwgc3RyeCk7Ci0KLSAgICAgIC8qIFN5bWJvbHMgd2l0aCB0eXBlID09IDAgKE5fVU5ERikgc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIHRoZQotCSBzdHJpbmcgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZS4gIFdlIHVzZSB0aGF0IGluZm8KLQkgdG8ga25vdyBob3cgdG8gcmVsb2NhdGUgdGhlICpuZXh0KiBmaWxlJ3Mgc3RyaW5nIHRhYmxlIGluZGljZXMuICAqLwotCi0gICAgICBpZiAodHlwZSA9PSBOX1VOREYpCi0JewotCSAgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQ7Ci0JICBuZXh0X2ZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCArPSB2YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXNpbmcgdGhlIChwb3NzaWJseSB1cGRhdGVkKSBzdHJpbmcgdGFibGUgb2Zmc2V0LCBwcmludCB0aGUKLQkgICAgIHN0cmluZyAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW1ib2wuICAqLwotCi0JICBpZiAoKHN0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXQpIDwgc3RhYnN0cl9zaXplKQotCSAgICBwcmludGYgKCIgJXMiLCAmc3RydGFiW3N0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXRdKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiICoiKTsKLQl9Ci0gICAgfQotICBwcmludGYgKCJcblxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsIHN0YWJzZWN0X25hbWUsIHN0cnNlY3RfbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdGFic2VjdF9uYW1lOwotICAgICBjaGFyICpzdHJzZWN0X25hbWU7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIC8qIENoZWNrIGZvciBzZWN0aW9uIG5hbWVzIGZvciB3aGljaCBzdGFic2VjdF9uYW1lIGlzIGEgcHJlZml4LCB0bwotICAgICBoYW5kbGUgLnN0YWIwLCBldGMuICAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBzICE9IE5VTEw7Ci0gICAgICAgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaW50IGxlbjsKLQotICAgICAgbGVuID0gc3RybGVuIChzdGFic2VjdF9uYW1lKTsKLQotICAgICAgLyogSWYgdGhlIHByZWZpeCBtYXRjaGVzLCBhbmQgdGhlIGZpbGVzIHNlY3Rpb24gbmFtZSBlbmRzIHdpdGggYQotCSBudWwgb3IgYSBkaWdpdCwgdGhlbiB3ZSBtYXRjaC4gIEkuZS4sIHdlIHdhbnQgZWl0aGVyIGFuIGV4YWN0Ci0JIG1hdGNoIG9yIGEgc2VjdGlvbiBmb2xsb3dlZCBieSBhIG51bWJlci4gICovCi0gICAgICBpZiAoc3RybmNtcCAoc3RhYnNlY3RfbmFtZSwgcy0+bmFtZSwgbGVuKSA9PSAwCi0JICAmJiAocy0+bmFtZVtsZW5dID09ICdcMDAwJwotCSAgICAgIHx8IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzLT5uYW1lW2xlbl0pKSkKLQl7Ci0JICBpZiAocmVhZF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzLT5uYW1lLCBzdHJzZWN0X25hbWUpKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc2VjdGlvbl9zdGFicyAoYWJmZCwgcy0+bmFtZSwgc3Ryc2VjdF9uYW1lKTsKLQkgICAgICBmcmVlIChzdGFicyk7Ci0JICAgICAgZnJlZSAoc3RydGFiKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbW1hID0gIiI7Ci0KLSAgcHJpbnRmIChfKCJhcmNoaXRlY3R1cmU6ICVzLCAiKSwKLQkgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpLAotCQkJCSAgIGJmZF9nZXRfbWFjaCAoYWJmZCkpKTsKLSAgcHJpbnRmIChfKCJmbGFncyAweCUwOHg6XG4iKSwgYWJmZC0+ZmxhZ3MpOwotCi0jZGVmaW5lIFBGKHgsIHkpICAgIGlmIChhYmZkLT5mbGFncyAmIHgpIHtwcmludGYoIiVzJXMiLCBjb21tYSwgeSk7IGNvbW1hPSIsICI7fQotICBQRiAoSEFTX1JFTE9DLCAiSEFTX1JFTE9DIik7Ci0gIFBGIChFWEVDX1AsICJFWEVDX1AiKTsKLSAgUEYgKEhBU19MSU5FTk8sICJIQVNfTElORU5PIik7Ci0gIFBGIChIQVNfREVCVUcsICJIQVNfREVCVUciKTsKLSAgUEYgKEhBU19TWU1TLCAiSEFTX1NZTVMiKTsKLSAgUEYgKEhBU19MT0NBTFMsICJIQVNfTE9DQUxTIik7Ci0gIFBGIChEWU5BTUlDLCAiRFlOQU1JQyIpOwotICBQRiAoV1BfVEVYVCwgIldQX1RFWFQiKTsKLSAgUEYgKERfUEFHRUQsICJEX1BBR0VEIik7Ci0gIFBGIChCRkRfSVNfUkVMQVhBQkxFLCAiQkZEX0lTX1JFTEFYQUJMRSIpOwotICBwcmludGYgKF8oIlxuc3RhcnQgYWRkcmVzcyAweCIpKTsKLSAgcHJpbnRmX3ZtYSAoYWJmZC0+c3RhcnRfYWRkcmVzcyk7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIgKGFiZmQpCi1iZmQgKmFiZmQ7Ci17Ci0gIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBzdGRvdXQpOwotfQotCi0vKiBEdW1wIHNlbGVjdGVkIGNvbnRlbnRzIG9mIEFCRkQgKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfYmZkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIElmIHdlIGFyZSBhZGp1c3Rpbmcgc2VjdGlvbiBWTUEncywgY2hhbmdlIHRoZW0gYWxsIG5vdy4gIENoYW5naW5nCi0gICAgIHRoZSBCRkQgaW5mb3JtYXRpb24gaXMgYSBoYWNrLiAgSG93ZXZlciwgd2UgbXVzdCBkbyBpdCwgb3IKLSAgICAgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIHdpbGwgbm90IGRvIHRoZSByaWdodCB0aGluZy4gICovCi0gIGlmIChhZGp1c3Rfc2VjdGlvbl92bWEgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgcy0+dm1hICs9IGFkanVzdF9zZWN0aW9uX3ZtYTsKLQkgIHMtPmxtYSArPSBhZGp1c3Rfc2VjdGlvbl92bWE7Ci0JfQotICAgIH0KLQotICBwcmludGYgKF8oIlxuJXM6ICAgICBmaWxlIGZvcm1hdCAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgYWJmZC0+eHZlYy0+bmFtZSk7Ci0gIGlmIChkdW1wX2FyX2hkcnMpCi0gICAgcHJpbnRfYXJlbHRfZGVzY3IgKHN0ZG91dCwgYWJmZCwgdHJ1ZSk7Ci0gIGlmIChkdW1wX2ZpbGVfaGVhZGVyKQotICAgIGR1bXBfYmZkX2hlYWRlciAoYWJmZCk7Ci0gIGlmIChkdW1wX3ByaXZhdGVfaGVhZGVycykKLSAgICBkdW1wX2JmZF9wcml2YXRlX2hlYWRlciAoYWJmZCk7Ci0gIHB1dGNoYXIgKCdcbicpOwotICBpZiAoZHVtcF9zZWN0aW9uX2hlYWRlcnMpCi0gICAgZHVtcF9oZWFkZXJzIChhYmZkKTsKLSAgaWYgKGR1bXBfc3ltdGFiIHx8IGR1bXBfcmVsb2NfaW5mbyB8fCBkaXNhc3NlbWJsZSB8fCBkdW1wX2RlYnVnZ2luZykKLSAgICB7Ci0gICAgICBzeW1zID0gc2x1cnBfc3ltdGFiIChhYmZkKTsKLSAgICB9Ci0gIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiIHx8IGR1bXBfZHluYW1pY19yZWxvY19pbmZvKQotICAgIHsKLSAgICAgIGR5bnN5bXMgPSBzbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCk7Ci0gICAgfQotICBpZiAoZHVtcF9zeW10YWIpCi0gICAgZHVtcF9zeW1ib2xzIChhYmZkLCBmYWxzZSk7Ci0gIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiKQotICAgIGR1bXBfc3ltYm9scyAoYWJmZCwgdHJ1ZSk7Ci0gIGlmIChkdW1wX3N0YWJfc2VjdGlvbl9pbmZvKQotICAgIGR1bXBfc3RhYnMgKGFiZmQpOwotICBpZiAoZHVtcF9yZWxvY19pbmZvICYmICEgZGlzYXNzZW1ibGUpCi0gICAgZHVtcF9yZWxvY3MgKGFiZmQpOwotICBpZiAoZHVtcF9keW5hbWljX3JlbG9jX2luZm8pCi0gICAgZHVtcF9keW5hbWljX3JlbG9jcyAoYWJmZCk7Ci0gIGlmIChkdW1wX3NlY3Rpb25fY29udGVudHMpCi0gICAgZHVtcF9kYXRhIChhYmZkKTsKLSAgaWYgKGRpc2Fzc2VtYmxlKQotICAgIGRpc2Fzc2VtYmxlX2RhdGEgKGFiZmQpOwotICBpZiAoZHVtcF9kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgUFRSIGRoYW5kbGU7Ci0KLSAgICAgIGRoYW5kbGUgPSByZWFkX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCk7Ci0gICAgICBpZiAoZGhhbmRsZSAhPSBOVUxMKQotCXsKLQkgIGlmICghIHByaW50X2RlYnVnZ2luZ19pbmZvIChzdGRvdXQsIGRoYW5kbGUpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IHByaW50aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmYWlsZWRcbiIpLAotCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgICAgIGV4aXRfc3RhdHVzID0gMTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChzeW1zKQotICAgIHsKLSAgICAgIGZyZWUgKHN5bXMpOwotICAgICAgc3ltcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZHluc3ltcykKLSAgICB7Ci0gICAgICBmcmVlIChkeW5zeW1zKTsKLSAgICAgIGR5bnN5bXMgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYmZkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGR1bXBfYmZkIChhYmZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLSAgICB7Ci0gICAgICBub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0gICAgICBmcmVlIChtYXRjaGluZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkKQotICAgIHsKLSAgICAgIG5vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9jb3JlLCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGR1bXBfYmZkIChhYmZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotICAgIHsKLSAgICAgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotICAgICAgZnJlZSAobWF0Y2hpbmcpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICpmaWxlLCAqYXJmaWxlID0gKGJmZCAqKSBOVUxMOwotCi0gIGZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5vbmZhdGFsIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaWxlLCBiZmRfYXJjaGl2ZSkgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICBiZmQgKmxhc3RfYXJmaWxlID0gTlVMTDsKLQotICAgICAgcHJpbnRmIChfKCJJbiBhcmNoaXZlICVzOlxuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLSAgICAgIGZvciAoOzspCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotCSAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLQkgIGlmIChhcmZpbGUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotCQlub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGRpc3BsYXlfYmZkIChhcmZpbGUpOwotCi0JICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLQkgICAgYmZkX2Nsb3NlIChsYXN0X2FyZmlsZSk7Ci0JICBsYXN0X2FyZmlsZSA9IGFyZmlsZTsKLQl9Ci0KLSAgICAgIGlmIChsYXN0X2FyZmlsZSAhPSBOVUxMKQotCWJmZF9jbG9zZSAobGFzdF9hcmZpbGUpOwotICAgIH0KLSAgZWxzZQotICAgIGRpc3BsYXlfYmZkIChmaWxlKTsKLQotICBiZmRfY2xvc2UgKGZpbGUpOwotfQotDAotLyogQWN0dWFsbHkgZGlzcGxheSB0aGUgdmFyaW91cyByZXF1ZXN0ZWQgcmVnaW9ucyAqLwotCi1zdGF0aWMgdm9pZAotZHVtcF9kYXRhIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YXNpemUgPSAwOwotICBiZmRfc2l6ZV90eXBlIGFkZHJfb2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIHN0YXJ0X29mZnNldCwgc3RvcF9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBvcGIgPSBiZmRfb2N0ZXRzX3Blcl9ieXRlIChhYmZkKTsKLQotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0KLSAgICAgICBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBvbmFsaW5lID0gMTY7Ci0KLSAgICAgIGlmIChvbmx5ID09IChjaGFyICopIE5VTEwgfHwKLQkgIHN0cmNtcCAob25seSwgc2VjdGlvbi0+bmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIiksIHNlY3Rpb24tPm5hbWUpOwotCi0JICAgICAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pID09IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCSAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0KLQotCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgKFBUUikgZGF0YSwgMCwgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCi0JICAgICAgaWYgKHN0YXJ0X2FkZHJlc3MgPT0gKGJmZF92bWEpIC0xCi0JCSAgfHwgc3RhcnRfYWRkcmVzcyA8IHNlY3Rpb24tPnZtYSkKLQkJc3RhcnRfb2Zmc2V0ID0gMDsKLQkgICAgICBlbHNlCi0JCXN0YXJ0X29mZnNldCA9IHN0YXJ0X2FkZHJlc3MgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgaWYgKHN0b3BfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEpCi0JCXN0b3Bfb2Zmc2V0ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgLyBvcGI7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHN0b3BfYWRkcmVzcyA8IHNlY3Rpb24tPnZtYSkKLQkJICAgIHN0b3Bfb2Zmc2V0ID0gMDsKLQkJICBlbHNlCi0JCSAgICBzdG9wX29mZnNldCA9IHN0b3BfYWRkcmVzcyAtIHNlY3Rpb24tPnZtYTsKLQkJICBpZiAoc3RvcF9vZmZzZXQgPiBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSAvIG9wYikKLQkJICAgIHN0b3Bfb2Zmc2V0ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgLyBvcGI7Ci0JCX0KLQkgICAgICBmb3IgKGFkZHJfb2Zmc2V0ID0gc3RhcnRfb2Zmc2V0OyAKLSAgICAgICAgICAgICAgICAgICBhZGRyX29mZnNldCA8IHN0b3Bfb2Zmc2V0OyBhZGRyX29mZnNldCArPSBvbmFsaW5lKQotCQl7Ci0JCSAgYmZkX3NpemVfdHlwZSBqOwotCi0JCSAgcHJpbnRmICgiICUwNGx4ICIsICh1bnNpZ25lZCBsb25nIGludCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyX29mZnNldCArIHNlY3Rpb24tPnZtYSkpOwotCQkgIGZvciAoaiA9IGFkZHJfb2Zmc2V0ICogb3BiOyAKLSAgICAgICAgICAgICAgICAgICAgICAgaiA8IGFkZHJfb2Zmc2V0ICogb3BiICsgb25hbGluZTsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoaiA8IHN0b3Bfb2Zmc2V0ICogb3BiKQotCQkJcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgKGRhdGFbal0pKTsKLQkJICAgICAgZWxzZQotCQkJcHJpbnRmICgiICAiKTsKLQkJICAgICAgaWYgKChqICYgMykgPT0gMykKLQkJCXByaW50ZiAoIiAiKTsKLQkJICAgIH0KLQotCQkgIHByaW50ZiAoIiAiKTsKLQkJICBmb3IgKGogPSBhZGRyX29mZnNldDsgaiA8IGFkZHJfb2Zmc2V0ICogb3BiICsgb25hbGluZTsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoaiA+PSBzdG9wX29mZnNldCAqIG9wYikKLQkJCXByaW50ZiAoIiAiKTsKLQkJICAgICAgZWxzZQotCQkJcHJpbnRmICgiJWMiLCBpc3ByaW50IChkYXRhW2pdKSA/IGRhdGFbal0gOiAnLicpOwotCQkgICAgfQotCQkgIHB1dGNoYXIgKCdcbicpOwotCQl9Ci0JICAgICAgZnJlZSAoZGF0YSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBTaG91bGQgcGVyaGFwcyBzaGFyZSBjb2RlIGFuZCBkaXNwbGF5IHdpdGggbm0/ICovCi1zdGF0aWMgdm9pZAotZHVtcF9zeW1ib2xzIChhYmZkLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBhc3ltYm9sICoqY3VycmVudDsKLSAgbG9uZyBtYXg7Ci0gIGxvbmcgY291bnQ7Ci0KLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgY3VycmVudCA9IGR5bnN5bXM7Ci0gICAgICBtYXggPSBkeW5zeW1jb3VudDsKLSAgICAgIGlmIChtYXggPT0gMCkKLQlyZXR1cm47Ci0gICAgICBwcmludGYgKCJEWU5BTUlDIFNZTUJPTCBUQUJMRTpcbiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSBzeW1zOwotICAgICAgbWF4ID0gc3ltY291bnQ7Ci0gICAgICBpZiAobWF4ID09IDApCi0JcmV0dXJuOwotICAgICAgcHJpbnRmICgiU1lNQk9MIFRBQkxFOlxuIik7Ci0gICAgfQotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG1heDsgY291bnQrKykKLSAgICB7Ci0gICAgICBpZiAoKmN1cnJlbnQpCi0JewotCSAgYmZkICpjdXJfYmZkID0gYmZkX2FzeW1ib2xfYmZkICgqY3VycmVudCk7Ci0KLQkgIGlmIChjdXJfYmZkICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICAgIGNoYXIgKmFsbG9jOwotCi0JICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpjdXJyZW50KTsKLQkgICAgICBhbGxvYyA9IE5VTEw7Ci0JICAgICAgaWYgKGRvX2RlbWFuZ2xlICYmIG5hbWUgIT0gTlVMTCAmJiAqbmFtZSAhPSAnXDAnKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbjsKLQotCQkgIC8qIElmIHdlIHdhbnQgdG8gZGVtYW5nbGUgdGhlIG5hbWUsIHdlIGRlbWFuZ2xlIGl0Ci0gICAgICAgICAgICAgICAgICAgICBoZXJlLCBhbmQgdGVtcG9yYXJpbHkgY2xvYmJlciBpdCB3aGlsZSBjYWxsaW5nCi0gICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sLiAgRklYTUU6IFRoaXMgaXMgYSBncm9zcyBoYWNrLiAgKi8KLQotCQkgIG4gPSBuYW1lOwotCQkgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGN1cl9iZmQpID09ICpuKQotCQkgICAgKytuOwotCQkgIGFsbG9jID0gY3BsdXNfZGVtYW5nbGUgKG4sIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLQkJICBpZiAoYWxsb2MgIT0gTlVMTCkKLQkJICAgICgqY3VycmVudCktPm5hbWUgPSBhbGxvYzsKLQkJICBlbHNlCi0JCSAgICAoKmN1cnJlbnQpLT5uYW1lID0gbjsKLQkJfQotCi0JICAgICAgYmZkX3ByaW50X3N5bWJvbCAoY3VyX2JmZCwgc3Rkb3V0LCAqY3VycmVudCwKLQkJCQliZmRfcHJpbnRfc3ltYm9sX2FsbCk7Ci0KLQkgICAgICAoKmN1cnJlbnQpLT5uYW1lID0gbmFtZTsKLQkgICAgICBpZiAoYWxsb2MgIT0gTlVMTCkKLQkJZnJlZSAoYWxsb2MpOwotCi0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgfQotCX0KLSAgICAgIGN1cnJlbnQrKzsKLSAgICB9Ci0gIHByaW50ZiAoIlxuIik7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIGFzZWN0aW9uICphOwotCi0gIGZvciAoYSA9IGFiZmQtPnNlY3Rpb25zOyBhICE9IChhc2VjdGlvbiAqKSBOVUxMOyBhID0gYS0+bmV4dCkKLSAgICB7Ci0gICAgICBsb25nIHJlbHNpemU7Ci0KLSAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGEpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChhKSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKG9ubHkpCi0JewotCSAgaWYgKHN0cmNtcCAob25seSwgYS0+bmFtZSkpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKChhLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGEpOwotICAgICAgaWYgKHJlbHNpemUgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBwcmludGYgKCJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106IiwgYS0+bmFtZSk7Ci0KLSAgICAgIGlmIChyZWxzaXplID09IDApCi0JewotCSAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0JICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIGEsIHJlbHBwLCBzeW1zKTsKLQkgIGlmIChyZWxjb3VudCA8IDApCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgZWxzZSBpZiAocmVsY291bnQgPT0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAobm9uZSlcblxuIik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgICAgZHVtcF9yZWxvY19zZXQgKGFiZmQsIGEsIHJlbHBwLCByZWxjb3VudCk7Ci0JICAgICAgcHJpbnRmICgiXG5cbiIpOwotCSAgICB9Ci0JICBmcmVlIChyZWxwcCk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfZHluYW1pY19yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyByZWxzaXplOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBwcmludGYgKCJEWU5BTUlDIFJFTE9DQVRJT04gUkVDT1JEUyIpOwotCi0gIGlmIChyZWxzaXplID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCByZWxwcCwgZHluc3ltcyk7Ci0gICAgICBpZiAocmVsY291bnQgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgZWxzZSBpZiAocmVsY291bnQgPT0gMCkKLQl7Ci0JICBwcmludGYgKCIgKG5vbmUpXG5cbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgZHVtcF9yZWxvY19zZXQgKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCByZWxwcCwgcmVsY291bnQpOwotCSAgcHJpbnRmICgiXG5cbiIpOwotCX0KLSAgICAgIGZyZWUgKHJlbHBwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jX3NldCAoYWJmZCwgc2VjLCByZWxwcCwgcmVsY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqKnJlbHBwOwotICAgICBsb25nIHJlbGNvdW50OwotewotICBhcmVsZW50ICoqcDsKLSAgY2hhciAqbGFzdF9maWxlbmFtZSwgKmxhc3RfZnVuY3Rpb25uYW1lOwotICB1bnNpZ25lZCBpbnQgbGFzdF9saW5lOwotCi0gIC8qIEdldCBjb2x1bW4gaGVhZGVycyBsaW5lZCB1cCByZWFzb25hYmx5LiAgKi8KLSAgewotICAgIHN0YXRpYyBpbnQgd2lkdGg7Ci0gICAgaWYgKHdpZHRoID09IDApCi0gICAgICB7Ci0JY2hhciBidWZbMzBdOwotCXNwcmludGZfdm1hIChidWYsIChiZmRfdm1hKSAtMSk7Ci0Jd2lkdGggPSBzdHJsZW4gKGJ1ZikgLSA3OwotICAgICAgfQotICAgIHByaW50ZiAoIk9GRlNFVCAlKnMgVFlQRSAlKnMgVkFMVUUgXG4iLCB3aWR0aCwgIiIsIDEyLCAiIik7Ci0gIH0KLQotICBsYXN0X2ZpbGVuYW1lID0gTlVMTDsKLSAgbGFzdF9mdW5jdGlvbm5hbWUgPSBOVUxMOwotICBsYXN0X2xpbmUgPSAwOwotCi0gIGZvciAocCA9IHJlbHBwOyByZWxjb3VudCAmJiAqcCAhPSAoYXJlbGVudCAqKSBOVUxMOyBwKyssIHJlbGNvdW50LS0pCi0gICAgewotICAgICAgYXJlbGVudCAqcSA9ICpwOwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICpmdW5jdGlvbm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOwotCi0gICAgICBpZiAoc3RhcnRfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgLTEKLQkgICYmIHEtPmFkZHJlc3MgPCBzdGFydF9hZGRyZXNzKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHN0b3BfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgLTEKLQkgICYmIHEtPmFkZHJlc3MgPiBzdG9wX2FkZHJlc3MpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICh3aXRoX2xpbmVfbnVtYmVycwotCSAgJiYgc2VjICE9IE5VTEwKLQkgICYmIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjLCBzeW1zLCBxLT5hZGRyZXNzLAotCQkJCSAgICAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsICZsaW5lKSkKLQl7Ci0JICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwKLQkgICAgICAmJiAobGFzdF9mdW5jdGlvbm5hbWUgPT0gTlVMTAotCQkgIHx8IHN0cmNtcCAoZnVuY3Rpb25uYW1lLCBsYXN0X2Z1bmN0aW9ubmFtZSkgIT0gMCkpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlcygpOlxuIiwgZnVuY3Rpb25uYW1lKTsKLQkgICAgICBpZiAobGFzdF9mdW5jdGlvbm5hbWUgIT0gTlVMTCkKLQkJZnJlZSAobGFzdF9mdW5jdGlvbm5hbWUpOwotCSAgICAgIGxhc3RfZnVuY3Rpb25uYW1lID0geHN0cmR1cCAoZnVuY3Rpb25uYW1lKTsKLQkgICAgfQotCSAgaWYgKGxpbmUgPiAwCi0JICAgICAgJiYgKGxpbmUgIT0gbGFzdF9saW5lCi0JCSAgfHwgKGZpbGVuYW1lICE9IE5VTEwKLQkJICAgICAgJiYgbGFzdF9maWxlbmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cmNtcCAoZmlsZW5hbWUsIGxhc3RfZmlsZW5hbWUpICE9IDApKSkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA9PSBOVUxMID8gIj8/PyIgOiBmaWxlbmFtZSwgbGluZSk7Ci0JICAgICAgbGFzdF9saW5lID0gbGluZTsKLQkgICAgICBpZiAobGFzdF9maWxlbmFtZSAhPSBOVUxMKQotCQlmcmVlIChsYXN0X2ZpbGVuYW1lKTsKLQkgICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQkJbGFzdF9maWxlbmFtZSA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQlsYXN0X2ZpbGVuYW1lID0geHN0cmR1cCAoZmlsZW5hbWUpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocS0+c3ltX3B0cl9wdHIgJiYgKnEtPnN5bV9wdHJfcHRyKQotCXsKLQkgIHN5bV9uYW1lID0gKCoocS0+c3ltX3B0cl9wdHIpKS0+bmFtZTsKLQkgIHNlY3Rpb25fbmFtZSA9ICgqKHEtPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bV9uYW1lID0gTlVMTDsKLQkgIHNlY3Rpb25fbmFtZSA9IE5VTEw7Ci0JfQotICAgICAgaWYgKHN5bV9uYW1lKQotCXsKLQkgIHByaW50Zl92bWEgKHEtPmFkZHJlc3MpOwotCSAgaWYgKHEtPmhvd3RvLT5uYW1lKQotCSAgICBwcmludGYgKCIgJS0xNnMgICIsIHEtPmhvd3RvLT5uYW1lKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiICUtMTZkICAiLCBxLT5ob3d0by0+dHlwZSk7Ci0JICBvYmpkdW1wX3ByaW50X3N5bW5hbWUgKGFiZmQsIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSBOVUxMLAotCQkJCSAqcS0+c3ltX3B0cl9wdHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc2VjdGlvbl9uYW1lID09IChDT05TVCBjaGFyICopIE5VTEwpCi0JICAgIHNlY3Rpb25fbmFtZSA9ICIqdW5rbm93bioiOwotCSAgcHJpbnRmX3ZtYSAocS0+YWRkcmVzcyk7Ci0JICBwcmludGYgKCIgJS0xNnMgIFslc10iLAotCQkgIHEtPmhvd3RvLT5uYW1lLAotCQkgIHNlY3Rpb25fbmFtZSk7Ci0JfQotICAgICAgaWYgKHEtPmFkZGVuZCkKLQl7Ci0JICBwcmludGYgKCIrMHgiKTsKLQkgIHByaW50Zl92bWEgKHEtPmFkZGVuZCk7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0MCi0vKiBUaGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGFyY2hpdGVjdHVyZSBuYW1lICsgMS4gICovCi0jZGVmaW5lIExPTkdFU1RfQVJDSCBzaXplb2YoInJzNjAwMDo2MDAwIikKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZW5kaWFuX3N0cmluZyAoZW5kaWFuKQotICAgICBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuOwotewotICBpZiAoZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIHJldHVybiAiYmlnIGVuZGlhbiI7Ci0gIGVsc2UgaWYgKGVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSAgICByZXR1cm4gImxpdHRsZSBlbmRpYW4iOwotICBlbHNlCi0gICAgcmV0dXJuICJlbmRpYW5uZXNzIHVua25vd24iOwotfQotCi0vKiBMaXN0IHRoZSB0YXJnZXRzIHRoYXQgQkZEIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCwgZWFjaCBmb2xsb3dlZAotICAgYnkgaXRzIGVuZGlhbm5lc3MgYW5kIHRoZSBhcmNoaXRlY3R1cmVzIGl0IHN1cHBvcnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfdGFyZ2V0X2xpc3QgKCkKLXsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGNoYXIgKmR1bW15X25hbWU7Ci0gIGludCB0OwotCi0gIGR1bW15X25hbWUgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICBmb3IgKHQgPSAwOyBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsgdCsrKQotICAgIHsKLSAgICAgIGJmZF90YXJnZXQgKnAgPSBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsKLSAgICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVudyAoZHVtbXlfbmFtZSwgcC0+bmFtZSk7Ci0gICAgICBpbnQgYTsKLQotICAgICAgcHJpbnRmICgiJXNcbiAoaGVhZGVyICVzLCBkYXRhICVzKVxuIiwgcC0+bmFtZSwKLQkgICAgICBlbmRpYW5fc3RyaW5nIChwLT5oZWFkZXJfYnl0ZW9yZGVyKSwKLQkgICAgICBlbmRpYW5fc3RyaW5nIChwLT5ieXRlb3JkZXIpKTsKLQotICAgICAgaWYgKGFiZmQgPT0gTlVMTCkKLQl7Ci0JICBub25mYXRhbCAoZHVtbXlfbmFtZSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pCi0JICAgIG5vbmZhdGFsIChwLT5uYW1lKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgZm9yIChhID0gKGludCkgYmZkX2FyY2hfb2JzY3VyZSArIDE7IGEgPCAoaW50KSBiZmRfYXJjaF9sYXN0OyBhKyspCi0JaWYgKGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKSBhLCAwKSkKLQkgIHByaW50ZiAoIiAgJXNcbiIsCi0JCSAgYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpIGEsIDApKTsKLSAgICB9Ci0gIHVubGluayAoZHVtbXlfbmFtZSk7Ci0gIGZyZWUgKGR1bW15X25hbWUpOwotfQotCi0vKiBQcmludCBhIHRhYmxlIHNob3dpbmcgd2hpY2ggYXJjaGl0ZWN0dXJlcyBhcmUgc3VwcG9ydGVkIGZvciBlbnRyaWVzCi0gICBGSVJTVCB0aHJvdWdoIExBU1QtMSBvZiBiZmRfdGFyZ2V0X3ZlY3RvciAodGFyZ2V0cyBhY3Jvc3MsCi0gICBhcmNoaXRlY3R1cmVzIGRvd24pLiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5mb190YWJsZSAoZmlyc3QsIGxhc3QpCi0gICAgIGludCBmaXJzdDsKLSAgICAgaW50IGxhc3Q7Ci17Ci0gIGV4dGVybiBiZmRfdGFyZ2V0ICpiZmRfdGFyZ2V0X3ZlY3RvcltdOwotICBpbnQgdCwgYTsKLSAgY2hhciAqZHVtbXlfbmFtZTsKLQotICAvKiBQcmludCBoZWFkaW5nIG9mIHRhcmdldCBuYW1lcy4gICovCi0gIHByaW50ZiAoIlxuJSpzIiwgKGludCkgTE9OR0VTVF9BUkNILCAiICIpOwotICBmb3IgKHQgPSBmaXJzdDsgdCA8IGxhc3QgJiYgYmZkX3RhcmdldF92ZWN0b3JbdF07IHQrKykKLSAgICBwcmludGYgKCIlcyAiLCBiZmRfdGFyZ2V0X3ZlY3Rvclt0XS0+bmFtZSk7Ci0gIHB1dGNoYXIgKCdcbicpOwotCi0gIGR1bW15X25hbWUgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICBmb3IgKGEgPSAoaW50KSBiZmRfYXJjaF9vYnNjdXJlICsgMTsgYSA8IChpbnQpIGJmZF9hcmNoX2xhc3Q7IGErKykKLSAgICBpZiAoc3RyY21wIChiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYSwgMCksICJVTktOT1dOISIpICE9IDApCi0gICAgICB7Ci0JcHJpbnRmICgiJSpzICIsIChpbnQpIExPTkdFU1RfQVJDSCAtIDEsCi0JCWJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhLCAwKSk7Ci0JZm9yICh0ID0gZmlyc3Q7IHQgPCBsYXN0ICYmIGJmZF90YXJnZXRfdmVjdG9yW3RdOyB0KyspCi0JICB7Ci0JICAgIGJmZF90YXJnZXQgKnAgPSBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsKLQkgICAgYm9vbGVhbiBvayA9IHRydWU7Ci0JICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVudyAoZHVtbXlfbmFtZSwgcC0+bmFtZSk7Ci0KLQkgICAgaWYgKGFiZmQgPT0gTlVMTCkKLQkgICAgICB7Ci0JCW5vbmZhdGFsIChwLT5uYW1lKTsKLQkJb2sgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKG9rKQotCSAgICAgIHsKLQkJaWYgKCEgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotCQkgIHsKLQkJICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbikKLQkJICAgICAgbm9uZmF0YWwgKHAtPm5hbWUpOwotCQkgICAgb2sgPSBmYWxzZTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChvaykKLQkgICAgICB7Ci0JCWlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhLCAwKSkKLQkJICBvayA9IGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAob2spCi0JICAgICAgcHJpbnRmICgiJXMgIiwgcC0+bmFtZSk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWludCBsID0gc3RybGVuIChwLT5uYW1lKTsKLQkJd2hpbGUgKGwtLSkKLQkJICBwdXRjaGFyICgnLScpOwotCQlwdXRjaGFyICgnICcpOwotCSAgICAgIH0KLQkgIH0KLQlwdXRjaGFyICgnXG4nKTsKLSAgICAgIH0KLSAgdW5saW5rIChkdW1teV9uYW1lKTsKLSAgZnJlZSAoZHVtbXlfbmFtZSk7Ci19Ci0KLS8qIFByaW50IHRhYmxlcyBvZiBhbGwgdGhlIHRhcmdldC1hcmNoaXRlY3R1cmUgY29tYmluYXRpb25zIHRoYXQKLSAgIEJGRCBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV90YXJnZXRfdGFibGVzICgpCi17Ci0gIGludCB0LCBjb2x1bW5zOwotICBleHRlcm4gYmZkX3RhcmdldCAqYmZkX3RhcmdldF92ZWN0b3JbXTsKLSAgY2hhciAqY29sdW07Ci0KLSAgY29sdW1ucyA9IDA7Ci0gIGNvbHVtID0gZ2V0ZW52ICgiQ09MVU1OUyIpOwotICBpZiAoY29sdW0gIT0gTlVMTCkKLSAgICBjb2x1bW5zID0gYXRvaSAoY29sdW0pOwotICBpZiAoY29sdW1ucyA9PSAwKQotICAgIGNvbHVtbnMgPSA4MDsKLQotICB0ID0gMDsKLSAgd2hpbGUgKGJmZF90YXJnZXRfdmVjdG9yW3RdICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IG9sZHQgPSB0LCB3aWQ7Ci0KLSAgICAgIHdpZCA9IExPTkdFU1RfQVJDSCArIHN0cmxlbiAoYmZkX3RhcmdldF92ZWN0b3JbdF0tPm5hbWUpICsgMTsKLSAgICAgICsrdDsKLSAgICAgIHdoaWxlICh3aWQgPCBjb2x1bW5zICYmIGJmZF90YXJnZXRfdmVjdG9yW3RdICE9IE5VTEwpCi0JewotCSAgaW50IG5ld3dpZDsKLQotCSAgbmV3d2lkID0gd2lkICsgc3RybGVuIChiZmRfdGFyZ2V0X3ZlY3Rvclt0XS0+bmFtZSkgKyAxOwotCSAgaWYgKG5ld3dpZCA+PSBjb2x1bW5zKQotCSAgICBicmVhazsKLQkgIHdpZCA9IG5ld3dpZDsKLQkgICsrdDsKLQl9Ci0gICAgICBkaXNwbGF5X2luZm9fdGFibGUgKG9sZHQsIHQpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5mbyAoKQotewotICBwcmludGYgKF8oIkJGRCBoZWFkZXIgZmlsZSB2ZXJzaW9uICVzXG4iKSwgQkZEX1ZFUlNJT04pOwotICBkaXNwbGF5X3RhcmdldF9saXN0ICgpOwotICBkaXNwbGF5X3RhcmdldF90YWJsZXMgKCk7Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYzsKLSAgY2hhciAqdGFyZ2V0ID0gZGVmYXVsdF90YXJnZXQ7Ci0gIGJvb2xlYW4gc2VlbmZsYWcgPSBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9ICphcmd2OwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgU1RBUlRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSwgMCk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJwaWI6bTpNOlZDZERsZmFoSHJSdFR4c1NqOndFOnpnRyIsCi0JCQkgICBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnbSc6Ci0JICBtYWNoaW5lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTSc6Ci0JICBkaXNhc3NlbWJsZXJfb3B0aW9ucyA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2onOgotCSAgb25seSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgd2l0aF9saW5lX251bWJlcnMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnYic6Ci0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdDJzoKLQkgIGRvX2RlbWFuZ2xlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3cnOgotCSAgd2lkZV9vdXRwdXQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQURKVVNUX1ZNQToKLQkgIGFkanVzdF9zZWN0aW9uX3ZtYSA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1hZGp1c3Qtdm1hIik7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVEFSVF9BRERSRVNTOgotCSAgc3RhcnRfYWRkcmVzcyA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1zdGFydC1hZGRyZXNzIik7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVE9QX0FERFJFU1M6Ci0JICBzdG9wX2FkZHJlc3MgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tc3RvcC1hZGRyZXNzIik7Ci0JICBicmVhazsKLQljYXNlICdFJzoKLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgIkIiKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiTCIpID09IDApCi0JICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pemVkIC1FIG9wdGlvblxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FTkRJQU46Ci0JICBpZiAoc3RybmNtcCAob3B0YXJnLCAiYmlnIiwgc3RybGVuIChvcHRhcmcpKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLQkgIGVsc2UgaWYgKHN0cm5jbXAgKG9wdGFyZywgImxpdHRsZSIsIHN0cmxlbiAob3B0YXJnKSkgPT0gMCkKLQkgICAgZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbml6ZWQgLS1lbmRpYW4gdHlwZSBgJXMnXG4iKSwKLQkJICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgJ2YnOgotCSAgZHVtcF9maWxlX2hlYWRlciA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIGZvcm1hdHNfaW5mbyA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIGR1bXBfcHJpdmF0ZV9oZWFkZXJzID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgZHVtcF9wcml2YXRlX2hlYWRlcnMgPSB0cnVlOwotCSAgZHVtcF9zeW10YWIgPSB0cnVlOwotCSAgZHVtcF9yZWxvY19pbmZvID0gdHJ1ZTsKLQkgIGR1bXBfZmlsZV9oZWFkZXIgPSB0cnVlOwotCSAgZHVtcF9hcl9oZHJzID0gdHJ1ZTsKLQkgIGR1bXBfc2VjdGlvbl9oZWFkZXJzID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgZHVtcF9zeW10YWIgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnVCc6Ci0JICBkdW1wX2R5bmFtaWNfc3ltdGFiID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgZGlzYXNzZW1ibGUgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAneic6Ci0JICBkaXNhc3NlbWJsZV96ZXJvZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkaXNhc3NlbWJsZSA9IHRydWU7Ci0JICBkaXNhc3NlbWJsZV9hbGwgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JICBkaXNhc3NlbWJsZSA9IHRydWU7Ci0JICB3aXRoX3NvdXJjZV9jb2RlID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgZHVtcF9kZWJ1Z2dpbmcgPSAxOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICBkdW1wX3N0YWJfc2VjdGlvbl9pbmZvID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgZHVtcF9zZWN0aW9uX2NvbnRlbnRzID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgZHVtcF9yZWxvY19pbmZvID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgZHVtcF9keW5hbWljX3JlbG9jX2luZm8gPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBkdW1wX2FyX2hkcnMgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBkdW1wX3NlY3Rpb25faGVhZGVycyA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdIJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCSAgCi0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgib2JqZHVtcCIpOwotCi0gIGlmIChzZWVuZmxhZyA9PSBmYWxzZSkKLSAgICB1c2FnZSAoc3RkZXJyLCAyKTsKLQotICBpZiAoZm9ybWF0c19pbmZvKQotICAgIGRpc3BsYXlfaW5mbyAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcHRpbmQgPT0gYXJnYykKLQlkaXNwbGF5X2ZpbGUgKCJhLm91dCIsIHRhcmdldCk7Ci0gICAgICBlbHNlCi0JZm9yICg7IG9wdGluZCA8IGFyZ2M7KQotCSAgZGlzcGxheV9maWxlIChhcmd2W29wdGluZCsrXSwgdGFyZ2V0KTsKLSAgICB9Ci0KLSAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOwotCi0gIHJldHVybiBleGl0X3N0YXR1czsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3BvL01ha2UtaW4gYi9iaW51dGlscy9wby9NYWtlLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyZGIxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcG8vUE9URklMRVMuaW4gYi9iaW51dGlscy9wby9QT1RGSUxFUy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhMDU4Ni4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLWFkZHIybGluZS5jCi1hci5jCi1hcnN1cC5jCi1hcnN1cC5oCi1idWNvbW0uYwotYnVjb21tLmgKLWJ1ZGJnLmgKLWNvZmZkdW1wLmMKLWNvZmZncm9rLmMKLWNvZmZncm9rLmgKLWRlYnVnLmMKLWRlYnVnLmMKLWRlYnVnLmgKLWRsbHRvb2wuYwotZGxsdG9vbC5oCi1kbGx3cmFwLmMKLWR5bi1zdHJpbmcuYwotZHluLXN0cmluZy5oCi1maWxlbW9kZS5jCi1pZWVlLmMKLWllZWUuYwotaXMtcmFubGliLmMKLWlzLXN0cmlwLmMKLW1heWJlLXJhbmxpYi5jCi1tYXliZS1zdHJpcC5jCi1ubG1jb252LmMKLW5sbWNvbnYuaAotbm0uYwotbm90LXJhbmxpYi5jCi1ub3Qtc3RyaXAuYwotb2JqY29weS5jCi1vYmpkdW1wLmMKLXByZGJnLmMKLXJkY29mZi5jCi1yZGNvZmYuYwotcmRkYmcuYwotcmRkYmcuYwotcmVhZGVsZi5jCi1yZW5hbWUuYwotcmVzYmluLmMKLXJlc2NvZmYuYwotcmVzcmMuYwotcmVzcmVzLmMKLXNpemUuYwotc3Jjb252LmMKLXN0YWJzLmMKLXN0YWJzLmMKLXN0cmluZ3MuYwotc3lzZHVtcC5jCi12ZXJzaW9uLmMKLXdpbmRyZXMuYwotd2luZHJlcy5oCi13aW5kdW5pLmMKLXdpbmR1bmkuaAotd3JzdGFicy5jCmRpZmYgLS1naXQgYS9iaW51dGlscy9wby9iaW51dGlscy5wb3QgYi9iaW51dGlscy9wby9iaW51dGlscy5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjgwOGUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcG8vYmludXRpbHMucG90CisrKyAvZGV2L251bGwKQEAgLTEsMzc1OCArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwMC0wMi0yNSAyMjoxNi0wNTAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogYWRkcjJsaW5lLmM6NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLUNmc0hWXSBbLWIgYmZkbmFtZV0gWy0tdGFyZ2V0PWJmZG5hbWVdXG4iCi0iICAgICAgIFstZSBleGVjdXRhYmxlXSBbLS1leGU9ZXhlY3V0YWJsZV0gWy0tZGVtYW5nbGVdXG4iCi0iICAgICAgIFstLWJhc2VuYW1lc10gWy0tZnVuY3Rpb25zXSBbYWRkciBhZGRyIC4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBhZGRyMmxpbmUuYzo4MyBhci5jOjI4NiBubG1jb252LmM6MTE0MSBubS5jOjMwNCBvYmpjb3B5LmM6MzQ0IG9iamNvcHkuYzozNzYKLSM6IG9iamR1bXAuYzoyNzcgcmVhZGVsZi5jOjE2OTcgc2l6ZS5jOjg5IHN0cmluZ3MuYzo1MTIgd2luZHJlcy5jOjczNwotbXNnaWQgIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IGFkZHIybGluZS5jOjI0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuIG5vdCBnZXQgYWRkcmVzc2VzIGZyb20gYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBlbnRyeSAlcyBpbiBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLV17ZG1wcXJzdHh9W2FiY2ZpbE5vUHNTdXZWXSBbbWVtYmVyLW5hbWVdIFtjb3VudF0gYXJjaGl2ZS1maWxlICIKLSJmaWxlLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICVzIC1NIFs8bXJpLXNjcmlwdF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI1NgotbXNnaWQgIiBjb21tYW5kczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI1NwotbXNnaWQgIiAgZCAgICAgICAgICAgIC0gZGVsZXRlIGZpbGUocykgZnJvbSB0aGUgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjU4Ci1tc2dpZCAiICBtW2FiXSAgICAgICAgLSBtb3ZlIGZpbGUocykgaW4gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI1OQotbXNnaWQgIiAgcCAgICAgICAgICAgIC0gcHJpbnQgZmlsZShzKSBmb3VuZCBpbiB0aGUgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjYwCi1tc2dpZCAiICBxW2ZdICAgICAgICAgLSBxdWljayBhcHBlbmQgZmlsZShzKSB0byB0aGUgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjYxCi1tc2dpZCAiIgotIiAgclthYl1bZl1bdV0gIC0gcmVwbGFjZSBleGlzdGluZyBvciBpbnNlcnQgbmV3IGZpbGUocykgaW50byB0aGUgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjYyCi1tc2dpZCAiICB0ICAgICAgICAgICAgLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI2MwotbXNnaWQgIiAgeFtvXSAgICAgICAgIC0gZXh0cmFjdCBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI2NAotbXNnaWQgIiBjb21tYW5kIHNwZWNpZmljIG1vZGlmaWVyczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI2NQotbXNnaWQgIiAgW2FdICAgICAgICAgIC0gcHV0IGZpbGUocykgYWZ0ZXIgW21lbWJlci1uYW1lXVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjY2Ci1tc2dpZCAiICBbYl0gICAgICAgICAgLSBwdXQgZmlsZShzKSBiZWZvcmUgW21lbWJlci1uYW1lXSAoc2FtZSBhcyBbaV0pXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNjcKLW1zZ2lkICIgIFtOXSAgICAgICAgICAtIHVzZSBpbnN0YW5jZSBbY291bnRdIG9mIG5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI2OAotbXNnaWQgIiAgW2ZdICAgICAgICAgIC0gdHJ1bmNhdGUgaW5zZXJ0ZWQgZmlsZSBuYW1lc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjY5Ci1tc2dpZCAiICBbUF0gICAgICAgICAgLSB1c2UgZnVsbCBwYXRoIG5hbWVzIHdoZW4gbWF0Y2hpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI3MAotbXNnaWQgIiAgW29dICAgICAgICAgIC0gcHJlc2VydmUgb3JpZ2luYWwgZGF0ZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI3MQotbXNnaWQgIiIKLSIgIFt1XSAgICAgICAgICAtIG9ubHkgcmVwbGFjZSBmaWxlcyB0aGF0IGFyZSBuZXdlciB0aGFuIGN1cnJlbnQgYXJjaGl2ZSAiCi0iY29udGVudHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI3MgotbXNnaWQgIiBnZW5lcmljIG1vZGlmaWVyczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI3MwotbXNnaWQgIiAgW2NdICAgICAgICAgIC0gZG8gbm90IHdhcm4gaWYgdGhlIGxpYnJhcnkgaGFkIHRvIGJlIGNyZWF0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI3NAotbXNnaWQgIiAgW3NdICAgICAgICAgIC0gY3JlYXRlIGFuIGFyY2hpdmUgaW5kZXggKGNmLiByYW5saWIpXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNzUKLW1zZ2lkICIgIFtTXSAgICAgICAgICAtIGRvIG5vdCBidWlsZCBhIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6Mjc2Ci1tc2dpZCAiICBbdl0gICAgICAgICAgLSBiZSB2ZXJib3NlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNzcKLW1zZ2lkICIgIFtWXSAgICAgICAgICAtIGRpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFstdlZdIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjQ2NgotbXNnaWQgInR3byBkaWZmZXJlbnQgb3BlcmF0aW9uIG9wdGlvbnMgc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbGxlZ2FsIG9wdGlvbiAtLSAlY1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NTczCi1tc2dpZCAibm8gb3BlcmF0aW9uIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjU3NgotbXNnaWQgImB1JyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgYHInIG9wdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo1ODYKLW1zZ2lkICJgTicgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGB4JyBhbmQgJ2QnIG9wdGlvbnMuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NTg5Ci1tc2dpZCAiVmFsdWUgZm9yIGBOJyBtdXN0IGJlIHBvc2l0aXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjY3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW50ZXJuYWwgZXJyb3IgLS0gdGhpcyBvcHRpb24gbm90IGltcGxlbWVudGVkXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo3OTAgYXIuYzo4NDEgYXIuYzoxMjgzIG9iamNvcHkuYzoxMDIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIHN0YXQgZXJyb3Igb24gJXMiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo4MTAgYXIuYzo4NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaXMgbm90IGEgdmFsaWQgYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjg0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzdGF0IHJldHVybnMgbmVnYXRpdmUgc2l6ZSBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo5NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaXMgbm90IGFuIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNyZWF0aW5nICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoxMTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIG1lbWJlciBuYW1lZCBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoxMjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBlbnRyeSAlcyBpbiBhcmNoaXZlICVzIVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MTM5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gYXJjaGl2ZSBtYXAgdG8gdXBkYXRlIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gZW50cnkgJXMgaW4gYXJjaGl2ZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjExOQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjE2NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgYXJjaGl2ZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIGlucHV0IGFyY2hpdmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjE4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSAlcyBpcyBub3QgYW4gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBvdXRwdXQgYXJjaGl2ZSBzcGVjaWZpZWQgeWV0XG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoyNDYgYXJzdXAuYzoyODEgYXJzdXAuYzozMTcgYXJzdXAuYzozMzcgYXJzdXAuYzozOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjI1NCBhcnN1cC5jOjM1NSBhcnN1cC5jOjM3NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3Qgb3BlbiBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzozMDIgYXJzdXAuYzozNzEgYXJzdXAuYzo0NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjQwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJDdXJyZW50IG9wZW4gYXJjaGl2ZSBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6NDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBvcGVuICBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBNYXRjaGluZyBmb3JtYXRzOiIKLW1zZ3N0ciAiIgotCi0jOiBidWNvbW0uYzoxNjgKLW1zZ2lkICJTdXBwb3J0ZWQgdGFyZ2V0czoiCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czoiCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgbnVtYmVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZHVtcC5jOjk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiNsaW5lcyAlZCAiCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo0NTYgc3lzZHVtcC5jOjcxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogUHJpbnQgYSBodW1hbiByZWFkYWJsZSBpbnRlcnByZXRhdGlvbiBvZiBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZHVtcC5jOjQ5OCBzcmNvbnYuYzoxOTQwIHN5c2R1bXAuYzo3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VICVzIHZlcnNpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZHVtcC5jOjUxNiBzcmNvbnYuYzoxOTc3IHN5c2R1bXAuYzo3NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo2NTMKLW1zZ2lkICJkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2U6IG5vIGN1cnJlbnQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjczNgotbXNnaWQgImRlYnVnX3N0YXJ0X3NvdXJjZTogbm8gZGVidWdfc2V0X2ZpbGVuYW1lIGNhbGwiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo3OTUKLW1zZ2lkICJkZWJ1Z19yZWNvcmRfZnVuY3Rpb246IG5vIGRlYnVnX3NldF9maWxlbmFtZSBjYWxsIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6ODUxCi1tc2dpZCAiZGVidWdfcmVjb3JkX3BhcmFtZXRlcjogbm8gY3VycmVudCBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjg4NQotbXNnaWQgImRlYnVnX2VuZF9mdW5jdGlvbjogbm8gY3VycmVudCBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjg5MQotbXNnaWQgImRlYnVnX2VuZF9mdW5jdGlvbjogc29tZSBibG9ja3Mgd2VyZSBub3QgY2xvc2VkIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTIxCi1tc2dpZCAiZGVidWdfc3RhcnRfYmxvY2s6IG5vIGN1cnJlbnQgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo5NTkKLW1zZ2lkICJkZWJ1Z19lbmRfYmxvY2s6IG5vIGN1cnJlbnQgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo5NjYKLW1zZ2lkICJkZWJ1Z19lbmRfYmxvY2s6IGF0dGVtcHQgdG8gY2xvc2UgdG9wIGxldmVsIGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTkyCi1tc2dpZCAiZGVidWdfcmVjb3JkX2xpbmU6IG5vIGN1cnJlbnQgdW5pdCIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRQotIzogZGVidWcuYzoxMDQ2Ci1tc2dpZCAiZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUUKLSM6IGRlYnVnLmM6MTA1OAotbXNnaWQgImRlYnVnX2VuZF9jb21tb25fYmxvY2s6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRS4KLSM6IGRlYnVnLmM6MTE1MgotbXNnaWQgImRlYnVnX3JlY29yZF9sYWJlbCBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoxMTc4Ci1tc2dpZCAiZGVidWdfcmVjb3JkX3ZhcmlhYmxlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoxMTk0Ci1tc2dpZCAiZGVidWdfcmVjb3JkX3ZhcmlhYmxlOiBubyBjdXJyZW50IGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTc2NAotbXNnaWQgImRlYnVnX21ha2VfdW5kZWZpbmVkX3R5cGU6IHVuc3VwcG9ydGVkIGtpbmQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoxOTcwCi1tc2dpZCAiZGVidWdfbmFtZV90eXBlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDE4Ci1tc2dpZCAiZGVidWdfdGFnX3R5cGU6IG5vIGN1cnJlbnQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjIwMjYKLW1zZ2lkICJkZWJ1Z190YWdfdHlwZTogZXh0cmEgdGFnIGF0dGVtcHRlZCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjIwNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogY2hhbmdpbmcgdHlwZSBzaXplIGZyb20gJWQgdG8gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjIwOTAKLW1zZ2lkICJkZWJ1Z19maW5kX25hbWVkX3R5cGU6IG5vIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjIxOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdfZ2V0X3JlYWxfdHlwZTogY2lyY3VsYXIgZGVidWcgaW5mb3JtYXRpb24gZm9yICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyNjYyCi1tc2dpZCAiZGVidWdfd3JpdGVfdHlwZTogaWxsZWdhbCB0eXBlIGVuY291bnRlcmVkIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo3NzAgZGxsdG9vbC5jOjc5NCBkbGx0b29sLmM6ODE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiBVbmtub3duIG1hY2hpbmUgdHlwZTogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gZGVmIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUHJvY2Vzc2luZyBkZWYgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjg2NQotbXNnaWQgIlByb2Nlc3NlZCBkZWYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bnRheCBlcnJvciBpbiBkZWYgZmlsZSAlczolZFxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo5MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTkFNRTogJXMgYmFzZTogJXgiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjkyNgotbXNnaWQgIkNhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo5NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTElCUkFSWTogJXMgYmFzZTogJXgiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjk0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgaGF2ZSBMSUJSQVJZIGFuZCBOQU1FXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjEyMDAgcmVzcmMuYzoyNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2FpdDogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjEyMDUgcmVzcmMuYzoyNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3VicHJvY2VzcyBnb3QgZmF0YWwgc2lnbmFsICVkIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMjExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMjQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlN1Y2tpbmcgaW4gaW5mbyBmcm9tICVzIHNlY3Rpb24gaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTM2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJFeGNsdWRpbmcgc3ltYm9sOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNDYyIGRsbHRvb2wuYzoxNDczIG5tLmM6OTAyIG5tLmM6OTEzIG9iamR1bXAuYzo0NDQgb2JqZHVtcC5jOjQ2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSMuIEZJWE1FOiB3ZSBvdWdodCB0byByZWFkIGluIGFuZCBibG9jayBvdXQgdGhlIGJhc2UgcmVsb2NhdGlvbnMKLSM6IGRsbHRvb2wuYzoxNTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkRvbmUgcmVhZGluZyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBvcGVuIG9iamVjdCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTUxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJTY2FubmluZyBvYmplY3QgZmlsZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTUyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgcHJvZHVjZSBtY29yZS1lbGYgZGxsIGZyb20gYXJjaGl2ZSBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTYyMQotbXNnaWQgIkFkZGluZyBleHBvcnRzIHRvIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNjY2Ci1tc2dpZCAiQWRkZWQgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTc5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJHZW5lcmF0aW5nIGV4cG9ydCBmaWxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNzk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBhc3NlbWJsZXIgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3BlbmVkIHRlbXBvcmFyeSBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjAxMgotbXNnaWQgIkdlbmVyYXRlZCBleHBvcnRzIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjIyNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkX29wZW4gZmFpbGVkIG9wZW4gc3R1YiBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjI3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJDcmVhdGluZyBzdHViIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNjU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCB0byBvcGVuIHRlbXBvcmFyeSBoZWFkIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNzE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCB0byBvcGVuIHRlbXBvcmFyeSB0YWlsIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNzg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gLmxpYiBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjc4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJDcmVhdGluZyBsaWJyYXJ5IGZpbGU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI4NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRlbGV0ZSAlczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjg1MAotbXNnaWQgIkNyZWF0ZWQgbGliIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI5NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZywgaWdub3JpbmcgZHVwbGljYXRlIEVYUE9SVCAlcyAlZCwlZFxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyOTYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9yLCBkdXBsaWNhdGUgRVhQT1JUIHdpdGggb3JpZGluYWxzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA4OAotbXNnaWQgIlByb2Nlc3NpbmcgZGVmaW5pdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMxMjYKLW1zZ2lkICJQcm9jZXNzZWQgZGVmaW5pdGlvbnMiCi1tc2dzdHIgIiIKLQotIy4geGdldGV4dDpjLWZvcm1hdAotIzogZGxsdG9vbC5jOjMxMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2UgJXMgPG9wdGlvbnM+IDxvYmplY3QtZmlsZXM+XG4iCi1tc2dzdHIgIiIKLQotIy4geGdldGV4dDpjLWZvcm1hdAotIzogZGxsdG9vbC5jOjMxMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiAgIC1tIC0tbWFjaGluZSA8bWFjaGluZT4gICAgQ3JlYXRlIGFzIERMTCBmb3IgPG1hY2hpbmU+LiAgW2RlZmF1bHQ6ICVzXVxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMTQwCi1tc2dpZCAiIgotIiAgICAgICAgcG9zc2libGUgPG1hY2hpbmU+OiBhcm1bX2ludGVyd29ya10sIGkzODYsIG1jb3JlWy1lbGZdey1sZXwtYmV9LCAiCi0icHBjLCB0aHVtYlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMTQxCi1tc2dpZCAiICAgLWUgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBleHBvcnQgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE0MgotbXNnaWQgIiAgIC1sIC0tb3V0cHV0LWxpYiA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gaW50ZXJmYWNlIGxpYnJhcnkuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMxNDMKLW1zZ2lkICIgICAtYSAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMTQ0Ci1tc2dpZCAiIgotIiAgIC1EIC0tZGxsbmFtZSA8bmFtZT4gICAgICAgTmFtZSBvZiBpbnB1dCBkbGwgdG8gcHV0IGludG8gaW50ZXJmYWNlIGxpYi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE0NQotbXNnaWQgIiAgIC1kIC0taW5wdXQtZGVmIDxkZWZmaWxlPiAgTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE0NgotbXNnaWQgIiAgIC16IC0tb3V0cHV0LWRlZiA8ZGVmZmlsZT4gTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgY3JlYXRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE0NwotbXNnaWQgIiAgICAgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgRXhwb3J0IGFsbCBzeW1ib2xzIHRvIC5kZWZcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE0OAotbXNnaWQgIiAgICAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCBsaXN0ZWQgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMTQ5Ci1tc2dpZCAiICAgICAgLS1leGNsdWRlLXN5bWJvbHMgPGxpc3Q+IERvbid0IGV4cG9ydCA8bGlzdD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE1MAotbXNnaWQgIiAgICAgIC0tbm8tZGVmYXVsdC1leGNsdWRlcyAgQ2xlYXIgZGVmYXVsdCBleGNsdWRlIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE1MQotbXNnaWQgIiAgIC1iIC0tYmFzZS1maWxlIDxiYXNlZmlsZT4gUmVhZCBsaW5rZXIgZ2VuZXJhdGVkIGJhc2UgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE1MgotbXNnaWQgIiAgIC14IC0tbm8taWRhdGE0ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNCBzZWN0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMTUzCi1tc2dpZCAiICAgLWMgLS1uby1pZGF0YTUgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ1IHNlY3Rpb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMxNTQKLW1zZ2lkICIiCi0iICAgLVUgLS1hZGQtdW5kZXJzY29yZSAgICAgICBBZGQgdW5kZXJzY29yZXMgdG8gc3ltYm9scyBpbiBpbnRlcmZhY2UgIgotImxpYnJhcnkuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMxNTUKLW1zZ2lkICIgICAtayAtLWtpbGwtYXQgICAgICAgICAgICAgIEtpbGwgQDxuPiBmcm9tIGV4cG9ydGVkIG5hbWVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMTU2Ci1tc2dpZCAiICAgLUEgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICBBZGQgYWxpYXNlcyB3aXRob3V0IEA8bj4uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMxNTcKLW1zZ2lkICIgICAtUyAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlci5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE1OAotbXNnaWQgIiAgIC1mIC0tYXMtZmxhZ3MgPGZsYWdzPiAgICAgUGFzcyA8ZmxhZ3M+IHRvIHRoZSBhc3NlbWJsZXIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMxNTkKLW1zZ2lkICIiCi0iICAgLUMgLS1jb21wYXQtaW1wbGliICAgICAgICBDcmVhdGUgYmFja3dhcmQgY29tcGF0aWJsZSBpbXBvcnQgbGlicmFyeS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE2MAotbXNnaWQgIiIKLSIgICAtbiAtLW5vLWRlbGV0ZSAgICAgICAgICAgIEtlZXAgdGVtcCBmaWxlcyAocmVwZWF0IGZvciBleHRyYSAiCi0icHJlc2VydmF0aW9uKS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE2MQotbXNnaWQgIiAgIC12IC0tdmVyYm9zZSAgICAgICAgICAgICAgQmUgdmVyYm9zZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE2MgotbXNnaWQgIiAgIC1WIC0tdmVyc2lvbiAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcHJvZ3JhbSB2ZXJzaW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMTYzCi1tc2dpZCAiICAgLWggLS1oZWxwICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMxNjUKLW1zZ2lkICIiCi0iICAgLU0gLS1tY29yZS1lbGYgPG91dG5hbWU+ICBQcm9jZXNzIG1jb3JlLWVsZiBvYmplY3QgZmlsZXMgaW50byA8b3V0bmFtZT4uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMxNjYKLW1zZ2lkICIgICAtTCAtLWxpbmtlciA8bmFtZT4gICAgICAgIFVzZSA8bmFtZT4gYXMgdGhlIGxpbmtlci5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzE2NwotbXNnaWQgIiAgIC1GIC0tbGlua2VyLWZsYWdzIDxmbGFncz4gUGFzcyA8ZmxhZ3M+IHRvIHRoZSBsaW5rZXIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMzMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hYmxlIHRvIG9wZW4gYmFzZS1maWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzM0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJNYWNoaW5lICclcycgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzQ0MyBkbGx3cmFwLmM6MjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRyaWVkIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozNDUwIGRsbHdyYXAuYzoyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNpbmcgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMxNgotbXNnaWQgInVuZXhwZWN0ZWQgZW5kIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDExCi1tc2dpZCAiaW52YWxpZCBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjQ3MAotbXNnaWQgImludmFsaWQgc3RyaW5nIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTI3IGllZWUuYzo1NjgKLW1zZ2lkICJleHByZXNzaW9uIHN0YWNrIG92ZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1NDcKLW1zZ2lkICJ1bnN1cHBvcnRlZCBJRUVFIGV4cHJlc3Npb24gb3BlcmF0b3IiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjU2MgotbXNnaWQgInVua25vd24gc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTgzCi1tc2dpZCAiZXhwcmVzc2lvbiBzdGFjayB1bmRlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjU5NwotbXNnaWQgImV4cHJlc3Npb24gc3RhY2sgbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjYzNgotbXNnaWQgInVua25vd24gYnVpbHRpbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo3ODEKLW1zZ2lkICJCQ0QgZmxvYXQgdHlwZSBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo5MjcKLW1zZ2lkICJ1bmV4cGVjdGVkIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6OTM0Ci1tc2dpZCAidW5leHBlY3RlZCByZWNvcmQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6OTY3Ci1tc2dpZCAiYmxvY2tzIGxlZnQgb24gc3RhY2sgYXQgZW5kIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxMjMyCi1tc2dpZCAidW5rbm93biBCQiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxMjQxCi1tc2dpZCAic3RhY2sgb3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEyNjYKLW1zZ2lkICJzdGFjayB1bmRlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEzODAgaWVlZS5jOjE0NTIgaWVlZS5jOjIxNTEKLW1zZ2lkICJpbGxlZ2FsIHZhcmlhYmxlIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxNDMwCi1tc2dpZCAiaWxsZWdhbCB0eXBlIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxNDQwIGllZWUuYzoxNDc3Ci1tc2dpZCAidW5rbm93biBUWSBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxNDU5Ci1tc2dpZCAidW5kZWZpbmVkIHZhcmlhYmxlIGluIFRZIgotbXNnc3RyICIiCi0KLSMuIFBhc2NhbCBmaWxlIG5hbWUuICBGSVhNRS4KLSM6IGllZWUuYzoxODcwCi1tc2dpZCAiUGFzY2FsIGZpbGUgbmFtZSBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoxOTE4Ci1tc2dpZCAidW5zdXBwb3J0ZWQgcXVhbGlmZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjIxODkKLW1zZ2lkICJ1bmRlZmluZWQgdmFyaWFibGUgaW4gQVROIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyMjMyCi1tc2dpZCAidW5rbm93biBBVE4gdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBSZXNlcnZlZCBmb3IgRk9SVFJBTiBjb21tb24uCi0jOiBpZWVlLmM6MjM1NAotbXNnaWQgInVuc3VwcG9ydGVkIEFUTjExIgotbXNnc3RyICIiCi0KLSMuIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuCi0jOiBpZWVlLmM6MjM4MQotbXNnaWQgInVuc3VwcG9ydGVkIEFUTjEyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNDQxCi1tc2dpZCAidW5leHBlY3RlZCBzdHJpbmcgaW4gQysrIG1pc2MiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI0NTQKLW1zZ2lkICJiYWQgbWlzYyByZWNvcmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI0OTcKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIG1pc2MgcmVjb3JkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNjE0Ci1tc2dpZCAidW5kZWZpbmVkIEMrKyBvYmplY3QiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2NDgKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIG9iamVjdCBzcGVjIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNjg0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgQysrIG9iamVjdCB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyNjk0Ci1tc2dpZCAiQysrIGJhc2UgY2xhc3Mgbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI3MDYgaWVlZS5jOjI4MTEKLW1zZ2lkICJDKysgb2JqZWN0IGhhcyBubyBmaWVsZHMiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI3MjUKLW1zZ2lkICJDKysgYmFzZSBjbGFzcyBub3QgZm91bmQgaW4gY29udGFpbmVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyODMyCi1tc2dpZCAiQysrIGRhdGEgbWVtYmVyIG5vdCBmb3VuZCBpbiBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI4NzMgaWVlZS5jOjMwMjMKLW1zZ2lkICJ1bmtub3duIEMrKyB2aXNpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyOTA3Ci1tc2dpZCAiYmFkIEMrKyBmaWVsZCBiaXQgcG9zIG9yIHNpemUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI5OTkKLW1zZ2lkICJiYWQgdHlwZSBmb3IgQysrIG1ldGhvZCBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzAwOQotbXNnaWQgIm5vIHR5cGUgaW5mb3JtYXRpb24gZm9yIEMrKyBtZXRob2QgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMwNDgKLW1zZ2lkICJDKysgc3RhdGljIHZpcnR1YWwgbWV0aG9kIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMTQzCi1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyBvYmplY3Qgb3ZlcmhlYWQgc3BlYyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzE4MgotbXNnaWQgInVuZGVmaW5lZCBDKysgdnRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMjUzCi1tc2dpZCAiQysrIGRlZmF1bHQgdmFsdWVzIG5vdCBpbiBhIGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMjkzCi1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyBkZWZhdWx0IHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMzMjQKLW1zZ2lkICJyZWZlcmVuY2UgcGFyYW1ldGVyIGlzIG5vdCBhIHBvaW50ZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM0MDkKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIHJlZmVyZW5jZSB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozNDkxCi1tc2dpZCAiQysrIHJlZmVyZW5jZSBub3QgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM0OTkKLW1zZ2lkICJDKysgcmVmZXJlbmNlIGlzIG5vdCBwb2ludGVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozNTI4IGllZWUuYzozNTM2Ci1tc2dpZCAibWlzc2luZyByZXF1aXJlZCBBU04iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM1NjYgaWVlZS5jOjM1NzQKLW1zZ2lkICJtaXNzaW5nIHJlcXVpcmVkIEFUTjY1IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozNTg4Ci1tc2dpZCAiYmFkIEFUTjY1IHJlY29yZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDIzNQotbXNnaWQgIklFRUUgbnVtZXJpYyBvdmVyZmxvdzogMHgiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjQyODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSUVFRSBzdHJpbmcgbGVuZ3RoIG92ZXJmbG93OiAldVxuIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1MzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklFRUUgdW5zdXBwb3J0ZWQgaW50ZWdlciB0eXBlIHNpemUgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTM1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJRUVFIHVuc3VwcG9ydGVkIGZsb2F0IHR5cGUgc2l6ZSAldVxuIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1Mzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklFRUUgdW5zdXBwb3J0ZWQgY29tcGxleCB0eXBlIHNpemUgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6Mjc1IHNyY29udi5jOjE5NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbXVzdCBiZSBkaWZmZXJlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MzI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnB1dCBmaWxlIG5hbWVkIGJvdGggb24gY29tbWFuZCBsaW5lIGFuZCB3aXRoIElOUFVUXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjMzNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gaW5wdXQgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzozNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjM4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzppbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMgYXJlIG5vdCBjb21wYXRpYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQxMQotbXNnaWQgIm1ha2UgLmJzcyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo0MjAKLW1zZ2lkICJtYWtlIC5ubG1zZWN0aW9ucyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo0MjIKLW1zZ2lkICJzZXQgLm5sbXNlY3Rpb25zIGZsYWdzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo0NTAKLW1zZ2lkICJzZXQgLmJzcyB2bWEiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQ1NwotbXNnaWQgInNldCAuZGF0YSBzaXplIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo2MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IHN5bWJvbCAlcyBpbXBvcnRlZCBidXQgbm90IGluIGltcG9ydCBsaXN0XG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjY1OAotbXNnaWQgInNldCBzdGFydCBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IFNUQVJUIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IEVYSVQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjcxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogQ0hFQ0sgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjczNiBubG1jb252LmM6OTI4Ci1tc2dpZCAiY3VzdG9tIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjc1NyBubG1jb252LmM6OTYwCi1tc2dpZCAiaGVscCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3NzkgbmxtY29udi5jOjk3OQotbXNnaWQgIm1lc3NhZ2Ugc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6Nzk1IG5sbWNvbnYuYzoxMDEyCi1tc2dpZCAibW9kdWxlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjgxNSBubG1jb252LmM6MTAyOQotbXNnaWQgInJwYyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo4NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JXM6IHdhcm5pbmc6IHNoYXJlZCBsaWJyYXJpZXMgY2FuIG5vdCBoYXZlIHVuaW5pdGlhbGl6ZWQgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo4NzMgbmxtY29udi5jOjEwNDkKLW1zZ2lkICJzaGFyZWQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6ODgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBObyB2ZXJzaW9uIG51bWJlciBnaXZlblxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo5MjIgbmxtY29udi5jOjk1NCBubG1jb252LmM6OTczIG5sbWNvbnYuYzoxMDIzIG5sbWNvbnYuYzoxMDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVzOiByZWFkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo5NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IE1BUCBhbmQgRlVMTE1BUCBhcmUgbm90IHN1cHBvcnRlZDsgdHJ5IGxkIC1NXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjExMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENvbnZlcnQgYW4gb2JqZWN0IGZpbGUgaW50byBhIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjExMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLWRoVl0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLVQgaGVhZGVyLWZpbGVdIFstbCBsaW5rZXJdXG4iCi0iICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdXG4iCi0iICAgICAgIFstLWhlYWRlci1maWxlPWZpbGVdIFstLWxpbmtlcj1saW5rZXJdIFstLWRlYnVnXVxuIgotIiAgICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXVxuIgotIiAgICAgICBbaW4tZmlsZSBbb3V0LWZpbGVdXVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiBmb3IgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTIxNgotbXNnaWQgIm1ha2Ugc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTIzMAotbXNnaWQgInNldCBzZWN0aW9uIHNpemUiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjEyMzYKLW1zZ2lkICJzZXQgc2VjdGlvbiBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjEyNDAKLW1zZ2lkICJzZXQgc2VjdGlvbiBmbGFncyIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTI1MQotbXNnaWQgInNldCAubmxtc2VjdGlvbnMgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTMzOSBubG1jb252LmM6MTM0NyBubG1jb252LmM6MTM1NiBubG1jb252LmM6MTM2MQotbXNnaWQgInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTg2NAotbXNnaWQgInN0dWIgc2VjdGlvbiBzaXplcyIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTkxMwotbXNnaWQgIndyaXRpbmcgc3R1YiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MjAwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZXNvbHZlZCBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjIwNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG92ZXJmbG93IHdoZW4gYWRqdXN0aW5nIHJlbG9jYXRpb24gYWdhaW5zdCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyMTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBleGVjdXRpb24gb2YgJXMgZmFpbGVkOiAiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjIyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEV4ZWN1dGlvbiBvZiAlcyBmYWlsZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjI5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstYUFCQ0RnbG5vcFByc3V2Vl0gWy10IHJhZGl4XSBbLS1yYWRpeD1yYWRpeF0gWy0tdGFyZ2V0PWJmZG5hbWVdXG4iCi0iICAgICAgIFstLWRlYnVnLXN5bXNdIFstLWV4dGVybi1vbmx5XSBbLS1wcmludC1hcm1hcF0gWy0tcHJpbnQtZmlsZS1uYW1lXVxuIgotIiAgICAgICBbLS1udW1lcmljLXNvcnRdIFstLW5vLXNvcnRdIFstLXJldmVyc2Utc29ydF0gWy0tc2l6ZS1zb3J0XVxuIgotIiAgICAgICBbLS11bmRlZmluZWQtb25seV0gWy0tcG9ydGFiaWxpdHldIFstZiB7YnNkLHN5c3YscG9zaXh9XVxuIgotIiAgICAgICBbLS1mb3JtYXQ9e2JzZCxzeXN2LHBvc2l4fV0gWy0tZGVtYW5nbGVdIFstLW5vLWRlbWFuZ2xlXSBbLS1keW5hbWljXVxuIgotIiAgICAgICBbLS1kZWZpbmVkLW9ubHldIFstLWxpbmUtbnVtYmVyc11cbiIKLSIgICAgICAgWy0tdmVyc2lvbl0gWy0taGVscF1cbiIKLSIgICAgICAgW2ZpbGUuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzozMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBpbnZhbGlkIHJhZGl4XG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzozNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBpbnZhbGlkIG91dHB1dCBmb3JtYXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjQ5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZGF0YSBzaXplICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTI4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iVW5kZWZpbmVkIHN5bWJvbHMgZnJvbSAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEyODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEyODQgbm0uYzoxMzM4Ci1tc2dpZCAiIgotIk5hbWUgICAgICAgICAgICAgICAgICBWYWx1ZSAgIENsYXNzICAgICAgICBUeXBlICAgICAgICAgU2l6ZSAgIExpbmUgICIKLSJTZWN0aW9uXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxMzM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJVbmRlZmluZWQgc3ltYm9scyBmcm9tICVzWyVzXTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEzMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlc1slc106XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxNTA4Ci1tc2dpZCAiIgotIlxuIgotIkFyY2hpdmUgaW5kZXg6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjI5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgPHN3aXRjaGVzPiBpbi1maWxlIFtvdXQtZmlsZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6Mjk3IG9iamNvcHkuYzozNTQKLW1zZ2lkICIgVGhlIHN3aXRjaGVzIGFyZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6Mjk4Ci1tc2dpZCAiIgotIiAgLUkgLS1pbnB1dC10YXJnZXQgPGJmZG5hbWU+ICAgICAgQXNzdW1lIGlucHV0IGZpbGUgaXMgaW4gZm9ybWF0IDxiZmRuYW1lPlxuIgotIiAgLU8gLS1vdXRwdXQtdGFyZ2V0IDxiZmRuYW1lPiAgICAgQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGluIGZvcm1hdCAiCi0iPGJmZG5hbWU+XG4iCi0iICAtRiAtLXRhcmdldCA8YmZkbmFtZT4gICAgICAgICAgICBTZXQgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdCB0byAiCi0iPGJmZG5hbWU+XG4iCi0iICAgICAtLWRlYnVnZ2luZyAgICAgICAgICAgICAgICAgICBDb252ZXJ0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaWYgIgotInBvc3NpYmxlXG4iCi0iICAtcCAtLXByZXNlcnZlLWRhdGVzICAgICAgICAgICAgICBDb3B5IG1vZGlmaWVkL2FjY2VzcyB0aW1lc3RhbXBzIHRvIHRoZSAiCi0ib3V0cHV0XG4iCi0iICAtaiAtLW9ubHktc2VjdGlvbiA8bmFtZT4gICAgICAgICBPbmx5IGNvcHkgc2VjdGlvbiA8bmFtZT4gaW50byB0aGUgb3V0cHV0XG4iCi0iICAtUiAtLXJlbW92ZS1zZWN0aW9uIDxuYW1lPiAgICAgICBSZW1vdmUgc2VjdGlvbiA8bmFtZT4gZnJvbSB0aGUgb3V0cHV0XG4iCi0iICAtUyAtLXN0cmlwLWFsbCAgICAgICAgICAgICAgICAgICBSZW1vdmUgYWxsIHN5bWJvbCBhbmQgcmVsb2NhdGlvbiAiCi0iaW5mb3JtYXRpb25cbiIKLSIgIC1nIC0tc3RyaXAtZGVidWcgICAgICAgICAgICAgICAgIFJlbW92ZSBhbGwgZGVidWdnaW5nIHN5bWJvbHNcbiIKLSIgICAgIC0tc3RyaXAtdW5uZWVkZWQgICAgICAgICAgICAgIFJlbW92ZSBhbGwgc3ltYm9scyBub3QgbmVlZGVkIGJ5ICIKLSJyZWxvY2F0aW9uc1xuIgotIiAgLU4gLS1zdHJpcC1zeW1ib2wgPG5hbWU+ICAgICAgICAgRG8gbm90IGNvcHkgc3ltYm9sIDxuYW1lPlxuIgotIiAgLUsgLS1rZWVwLXN5bWJvbCA8bmFtZT4gICAgICAgICAgT25seSBjb3B5IHN5bWJvbCA8bmFtZT5cbiIKLSIgIC1MIC0tbG9jYWxpemUtc3ltYm9sIDxuYW1lPiAgICAgIEZvcmNlIHN5bWJvbCA8bmFtZT4gdG8gYmUgbWFya2VkIGFzIGEgIgotImxvY2FsXG4iCi0iICAtVyAtLXdlYWtlbi1zeW1ib2wgPG5hbWU+ICAgICAgICBGb3JjZSBzeW1ib2wgPG5hbWU+IHRvIGJlIG1hcmtlZCBhcyBhICIKLSJ3ZWFrXG4iCi0iICAgICAtLXdlYWtlbiAgICAgICAgICAgICAgICAgICAgICBGb3JjZSBhbGwgZ2xvYmFsIHN5bWJvbHMgdG8gYmUgbWFya2VkIGFzICIKLSJ3ZWFrXG4iCi0iICAteCAtLWRpc2NhcmQtYWxsICAgICAgICAgICAgICAgICBSZW1vdmUgYWxsIG5vbi1nbG9iYWwgc3ltYm9sc1xuIgotIiAgLVggLS1kaXNjYXJkLWxvY2FscyAgICAgICAgICAgICAgUmVtb3ZlIGFueSBjb21waWxlci1nZW5lcmF0ZWQgc3ltYm9sc1xuIgotIiAgLWkgLS1pbnRlcmxlYXZlIDxudW1iZXI+ICAgICAgICAgT25seSBjb3B5IG9uZSBvdXQgb2YgZXZlcnkgPG51bWJlcj4gIgotImJ5dGVzXG4iCi0iICAtYiAtLWJ5dGUgPG51bT4gICAgICAgICAgICAgICAgICBTZWxlY3QgYnl0ZSA8bnVtPiBpbiBldmVyeSBpbnRlcmxlYXZlZCAiCi0iYmxvY2tcbiIKLSIgICAgIC0tZ2FwLWZpbGwgPHZhbD4gICAgICAgICAgICAgIEZpbGwgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIHdpdGggPHZhbD5cbiIKLSIgICAgIC0tcGFkLXRvIDxhZGRyPiAgICAgICAgICAgICAgIFBhZCB0aGUgbGFzdCBzZWN0aW9uIHVwIHRvIGFkZHJlc3MgIgotIjxhZGRyPlxuIgotIiAgICAgLS1zZXQtc3RhcnQgPGFkZHI+ICAgICAgICAgICAgU2V0IHRoZSBzdGFydCBhZGRyZXNzIHRvIDxhZGRyPlxuIgotIiAgICB7LS1jaGFuZ2Utc3RhcnR8LS1hZGp1c3Qtc3RhcnR9IDxpbmNyPlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIDxpbmNyPiB0byB0aGUgc3RhcnQgYWRkcmVzc1xuIgotIiAgICB7LS1jaGFuZ2UtYWRkcmVzc2VzfC0tYWRqdXN0LXZtYX0gPGluY3I+XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgPGluY3I+IHRvIExNQSwgVk1BIGFuZCBzdGFydCAiCi0iYWRkcmVzc2VzXG4iCi0iICAgIHstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3N8LS1hZGp1c3Qtc2VjdGlvbi12bWF9IDxuYW1lPns9fCt8LX08dmFsPlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIExNQSBhbmQgVk1BIG9mIHNlY3Rpb24gPG5hbWU+IGJ5ICIKLSI8dmFsPlxuIgotIiAgICAgLS1jaGFuZ2Utc2VjdGlvbi1sbWEgPG5hbWU+ez18K3wtfTx2YWw+XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgdGhlIExNQSBvZiBzZWN0aW9uIDxuYW1lPiBieSAiCi0iPHZhbD5cbiIKLSIgICAgIC0tY2hhbmdlLXNlY3Rpb24tdm1hIDxuYW1lPns9fCt8LX08dmFsPlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIHRoZSBWTUEgb2Ygc2VjdGlvbiA8bmFtZT4gYnkgIgotIjx2YWw+XG4iCi0iICAgIHstLVtuby1dY2hhbmdlLXdhcm5pbmdzfC0tW25vLV1hZGp1c3Qtd2FybmluZ3N9XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXJuIGlmIGEgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdCBleGlzdFxuIgotIiAgICAgLS1zZXQtc2VjdGlvbi1mbGFncyA8bmFtZT49PGZsYWdzPlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHNlY3Rpb24gPG5hbWU+J3MgcHJvcGVydGllcyB0byAiCi0iPGZsYWdzPlxuIgotIiAgICAgLS1hZGQtc2VjdGlvbiA8bmFtZT49PGZpbGU+ICAgQWRkIHNlY3Rpb24gPG5hbWU+IGZvdW5kIGluIDxmaWxlPiB0byAiCi0ib3V0cHV0XG4iCi0iICAgICAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgICAgICAgICBGb3JjZSBvdXRwdXQgZm9ybWF0J3MgbGVhZGluZyBjaGFyYWN0ZXIgIgotInN0eWxlXG4iCi0iICAgICAtLXJlbW92ZS1sZWFkaW5nLWNoYXIgICAgICAgICBSZW1vdmUgbGVhZGluZyBjaGFyYWN0ZXIgZnJvbSBnbG9iYWwgIgotInN5bWJvbHNcbiIKLSIgIC12IC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgICAgIExpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZFxuIgotIiAgLVYgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlclxuIgotIiAgLWggLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIG91dHB1dFxuIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzozNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIDxzd2l0Y2hlcz4gaW4tZmlsZShzKVxuIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzozNTUKLW1zZ2lkICIiCi0iICAtSSAtLWlucHV0LXRhcmdldCA8YmZkbmFtZT4gICAgICBBc3N1bWUgaW5wdXQgZmlsZSBpcyBpbiBmb3JtYXQgPGJmZG5hbWU+XG4iCi0iICAtTyAtLW91dHB1dC10YXJnZXQgPGJmZG5hbWU+ICAgICBDcmVhdGUgYW4gb3V0cHV0IGZpbGUgaW4gZm9ybWF0ICIKLSI8YmZkbmFtZT5cbiIKLSIgIC1GIC0tdGFyZ2V0IDxiZmRuYW1lPiAgICAgICAgICAgIFNldCBib3RoIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0IHRvICIKLSI8YmZkbmFtZT5cbiIKLSIgIC1wIC0tcHJlc2VydmUtZGF0ZXMgICAgICAgICAgICAgIENvcHkgbW9kaWZpZWQvYWNjZXNzIHRpbWVzdGFtcHMgdG8gdGhlICIKLSJvdXRwdXRcbiIKLSIgIC1SIC0tcmVtb3ZlLXNlY3Rpb24gPG5hbWU+ICAgICAgIFJlbW92ZSBzZWN0aW9uIDxuYW1lPiBmcm9tIHRoZSBvdXRwdXRcbiIKLSIgIC1zIC0tc3RyaXAtYWxsICAgICAgICAgICAgICAgICAgIFJlbW92ZSBhbGwgc3ltYm9sIGFuZCByZWxvY2F0aW9uICIKLSJpbmZvcm1hdGlvblxuIgotIiAgLWcgLVMgLS1zdHJpcC1kZWJ1ZyAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9sc1xuIgotIiAgICAgLS1zdHJpcC11bm5lZWRlZCAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBzeW1ib2xzIG5vdCBuZWVkZWQgYnkgIgotInJlbG9jYXRpb25zXG4iCi0iICAtTiAtLXN0cmlwLXN5bWJvbCA8bmFtZT4gICAgICAgICBEbyBub3QgY29weSBzeW1ib2wgPG5hbWU+XG4iCi0iICAtSyAtLWtlZXAtc3ltYm9sIDxuYW1lPiAgICAgICAgICBPbmx5IGNvcHkgc3ltYm9sIDxuYW1lPlxuIgotIiAgLXggLS1kaXNjYXJkLWFsbCAgICAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBub24tZ2xvYmFsIHN5bWJvbHNcbiIKLSIgIC1YIC0tZGlzY2FyZC1sb2NhbHMgICAgICAgICAgICAgIFJlbW92ZSBhbnkgY29tcGlsZXItZ2VuZXJhdGVkIHN5bWJvbHNcbiIKLSIgIC12IC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgICAgIExpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZFxuIgotIiAgLVYgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlclxuIgotIiAgLWggLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIG91dHB1dFxuIgotIiAgLW8gPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugc3RyaXBwZWQgb3V0cHV0IGludG8gPGZpbGU+XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjQyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgc2VjdGlvbiBmbGFnIGAlcyciCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjQyNgotbXNnaWQgIiIKLSJzdXBwb3J0ZWQgZmxhZ3M6IGFsbG9jLCBsb2FkLCBub2xvYWQsIHJlYWRvbmx5LCBkZWJ1ZywgY29kZSwgZGF0YSwgcm9tLCAiCi0ic2hhcmUsIGNvbnRlbnRzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo2NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29weSBmcm9tICVzKCVzKSB0byAlcyglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6NjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IE91dHB1dCBmaWxlIGNhbm5vdCByZXByZXNlbnQgYXJjaGl0ZWN0dXJlICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo3MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgY3JlYXRlIHNlY3Rpb24gYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjgwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBmaWxsIGdhcCBhZnRlciAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjgyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBhZGQgcGFkZGluZyB0byAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjk2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3IgY29weWluZyBwcml2YXRlIEJGRCBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6OTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBta2RpciAlcyBmb3IgYXJjaGl2ZSBjb3B5aW5nIChlcnJvcjogJXMpIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxMjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzZWN0aW9uIGAlcyc6IGVycm9yIGluICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgY3JlYXRlIGRlYnVnZ2luZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTU1NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3Qgc2V0IGRlYnVnZ2luZyBzZWN0aW9uIGNvbnRlbnRzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTU2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTY3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IHN0YXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNzIxCi1tc2dpZCAiYnl0ZSBudW1iZXIgbXVzdCBiZSBub24tbmVnYXRpdmUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3MjYKLW1zZ2lkICJpbnRlcmxlYXZlIG11c3QgYmUgcG9zaXRpdmUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3NDIgb2JqY29weS5jOjE3NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgYm90aCBjb3BpZWQgYW5kIHJlbW92ZWQiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4MDQKLW1zZ2lkICJiYWQgZm9ybWF0IGZvciAtLWFkZC1zZWN0aW9uIE5BTUU9RklMRU5BTUUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQ6ICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTgyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbjogJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxODI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmcmVhZCBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogdHJ1bmNhdGluZyBnYXAtZmlsbCBmcm9tIDB4JXMgdG8gMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTk2MAotbXNnaWQgImJhZCBmb3JtYXQgZm9yIC0tc2V0LXNlY3Rpb24tZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5OTAKLW1zZ2lkICJieXRlIG51bWJlciBtdXN0IGJlIGxlc3MgdGhhbiBpbnRlcmxlYXZlIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoyMDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBzdGF0OiAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjIwNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi12bWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MjA2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiAtLWNoYW5nZS1zZWN0aW9uLWxtYSAlcyVjMHglcyBuZXZlciB1c2VkIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIDxzd2l0Y2hlcz4gZmlsZShzKVxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMzAKLW1zZ2lkICIgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgbXVzdCBiZSBnaXZlbjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjMxCi1tc2dpZCAiIgotIiAgLWEgIC0tYXJjaGl2ZS1oZWFkZXJzICAgIERpc3BsYXkgYXJjaGl2ZSBoZWFkZXIgaW5mb3JtYXRpb25cbiIKLSIgIC1mICAtLWZpbGUtaGVhZGVycyAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgb3ZlcmFsbCBmaWxlIGhlYWRlclxuIgotIiAgLXAgIC0tcHJpdmF0ZS1oZWFkZXJzICAgIERpc3BsYXkgb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBmaWxlIGhlYWRlciAiCi0iY29udGVudHNcbiIKLSIgIC1oICAtLVtzZWN0aW9uLV1oZWFkZXJzICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzXG4iCi0iICAteCAgLS1hbGwtaGVhZGVycyAgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgYWxsIGhlYWRlcnNcbiIKLSIgIC1kICAtLWRpc2Fzc2VtYmxlICAgICAgICBEaXNwbGF5IGFzc2VtYmxlciBjb250ZW50cyBvZiBleGVjdXRhYmxlICIKLSJzZWN0aW9uc1xuIgotIiAgLUQgIC0tZGlzYXNzZW1ibGUtYWxsICAgIERpc3BsYXkgYXNzZW1ibGVyIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9uc1xuIgotIiAgLVMgIC0tc291cmNlICAgICAgICAgICAgIEludGVybWl4IHNvdXJjZSBjb2RlIHdpdGggZGlzYXNzZW1ibHlcbiIKLSIgIC1zICAtLWZ1bGwtY29udGVudHMgICAgICBEaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9ucyAiCi0icmVxdWVzdGVkXG4iCi0iICAtZyAgLS1kZWJ1Z2dpbmcgICAgICAgICAgRGlzcGxheSBkZWJ1ZyBpbmZvcm1hdGlvbiBpbiBvYmplY3QgZmlsZVxuIgotIiAgLUcgIC0tc3RhYnMgICAgICAgICAgICAgIERpc3BsYXkgdGhlIFNUQUJTIGNvbnRlbnRzIG9mIGFuIEVMRiBmb3JtYXQgZmlsZVxuIgotIiAgLXQgIC0tc3ltcyAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1ib2wgdGFibGUocylcbiIKLSIgIC1UICAtLWR5bmFtaWMtc3ltcyAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGVcbiIKLSIgIC1yICAtLXJlbG9jICAgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9uIGVudHJpZXMgaW4gdGhlIGZpbGVcbiIKLSIgIC1SICAtLWR5bmFtaWMtcmVsb2MgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcyBpbiB0aGUgIgotImZpbGVcbiIKLSIgIC1WICAtLXZlcnNpb24gICAgICAgICAgICBEaXNwbGF5IHRoaXMgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyXG4iCi0iICAtaSAgLS1pbmZvICAgICAgICAgICAgICAgTGlzdCBvYmplY3QgZm9ybWF0cyBhbmQgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWRcbiIKLSIgIC1IICAtLWhlbHAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjUzCi1tc2dpZCAiIgotIlxuIgotIiBUaGUgZm9sbG93aW5nIHN3aXRjaGVzIGFyZSBvcHRpb25hbDpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjU0Ci1tc2dpZCAiIgotIiAgLWIgIC0tdGFyZ2V0IDxiZmRuYW1lPiAgICAgICAgIFNwZWNpZnkgdGhlIHRhcmdldCBvYmplY3QgZm9ybWF0IGFzICIKLSI8YmZkbmFtZT5cbiIKLSIgIC1tICAtLWFyY2hpdGVjdHVyZSA8bWFjaGluZT4gICBTcGVjaWZ5IHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGFzICIKLSI8bWFjaGluZT5cbiIKLSIgIC1qICAtLXNlY3Rpb24gPG5hbWU+ICAgICAgICAgICBPbmx5IGRpc3BsYXkgaW5mb3JtYXRpb24gZm9yIHNlY3Rpb24gIgotIjxuYW1lPlxuIgotIiAgLU0gIC0tZGlzYXNzZW1ibGVyLW9wdGlvbnMgPG8+IFBhc3MgdGV4dCA8bz4gb24gdG8gdGhlIGRpc2Fzc2VtYmxlclxuIgotIiAgLUVCIC0tZW5kaWFuPWJpZyAgICAgICAgICAgICAgIEFzc3VtZSBiaWcgZW5kaWFuIGZvcm1hdCB3aGVuICIKLSJkaXNhc3NlbWJsaW5nXG4iCi0iICAtRUwgLS1lbmRpYW49bGl0dGxlICAgICAgICAgICAgQXNzdW1lIGxpdHRsZSBlbmRpYW4gZm9ybWF0IHdoZW4gIgotImRpc2Fzc2VtYmxpbmdcbiIKLSIgICAgICAtLWZpbGUtc3RhcnQtY29udGV4dCAgICAgICBJbmNsdWRlIGNvbnRleHQgZnJvbSBzdGFydCBvZiBmaWxlICh3aXRoICIKLSItUylcbiIKLSIgIC1sICAtLWxpbmUtbnVtYmVycyAgICAgICAgICAgICBJbmNsdWRlIGxpbmUgbnVtYmVycyBhbmQgZmlsZW5hbWVzIGluICIKLSJvdXRwdXRcbiIKLSIgIC1DICAtLWRlbWFuZ2xlICAgICAgICAgICAgICAgICBEZWNvZGUgbWFuZ2xlZC9wcm9jZXNzZWQgc3ltYm9sIG5hbWVzXG4iCi0iICAtdyAgLS13aWRlICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IG91dHB1dCBmb3IgbW9yZSB0aGFuIDgwIGNvbHVtbnNcbiIKLSIgIC16ICAtLWRpc2Fzc2VtYmxlLXplcm9lcyAgICAgICBEbyBub3Qgc2tpcCBibG9ja3Mgb2YgemVyb2VzIHdoZW4gIgotImRpc2Fzc2VtYmxpbmdcbiIKLSIgICAgICAtLXN0YXJ0LWFkZHJlc3MgPGFkZHI+ICAgICBPbmx5IHByb2Nlc3MgZGF0YSB3aG9lcyBhZGRyZXNzIGlzID49ICIKLSI8YWRkcj5cbiIKLSIgICAgICAtLXN0b3AtYWRkcmVzcyA8YWRkcj4gICAgICBPbmx5IHByb2Nlc3MgZGF0YSB3aG9lcyBhZGRyZXNzIGlzIDw9ICIKLSI8YWRkcj5cbiIKLSIgICAgICAtLXByZWZpeC1hZGRyZXNzZXMgICAgICAgICBQcmludCBjb21wbGV0ZSBhZGRyZXNzIGFsb25nc2lkZSAiCi0iZGlzYXNzZW1ibHlcbiIKLSIgICAgICAtLVtuby1dc2hvdy1yYXctaW5zbiAgICAgICBEaXNwbGF5IGhleCBhbG9uZ3NpZGUgc3ltYm9saWMgZGlzYXNzZW1ibHlcbiIKLSIgICAgICAtLWFkanVzdC12bWEgPG9mZnNldD4gICAgICBBZGQgPG9mZnNldD4gdG8gYWxsIGRpc3BsYXllZCBzZWN0aW9uICIKLSJhZGRyZXNzZXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDIwCi1tc2dpZCAiU2VjdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjQyMwotbXNnaWQgIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgTE1BICAgICAgIEZpbGUgb2ZmICBBbGduIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzo0MjUKLW1zZ2lkICIiCi0iSWR4IE5hbWUgICAgICAgICAgU2l6ZSAgICAgIFZNQSAgICAgICAgICAgICAgIExNQSAgICAgICAgICAgICAgIEZpbGUgb2ZmICAiCi0iQWxnbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDI5Ci1tc2dpZCAiICBGbGFncyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogbm90IGEgZHluYW1pYyBvYmplY3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogTm8gZHluYW1pYyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjEyMDAKLW1zZ2lkICJPdXQgb2YgdmlydHVhbCBtZW1vcnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTYxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgdXNlIHN1cHBsaWVkIG1hY2hpbmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTYzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgZGlzYXNzZW1ibGUgZm9yIGFyY2hpdGVjdHVyZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxNzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE4ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIk5vICVzIHNlY3Rpb24gcHJlc2VudFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlcyBoYXMgbm8gJXMgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxOTA0IG9iamR1bXAuYzoxOTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBSZWFkaW5nICVzIHNlY3Rpb24gb2YgJXMgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxOTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb250ZW50cyBvZiAlcyBzZWN0aW9uOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdGVjdHVyZTogJXMsICIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjA2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJmbGFncyAweCUwOHg6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIwNzUKLW1zZ2lkICIiCi0iXG4iCi0ic3RhcnQgYWRkcmVzcyAweCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjEwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iJXM6ICAgICBmaWxlIGZvcm1hdCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBwcmludGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIyMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW4gYXJjaGl2ZSAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjI3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyNzg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJGRCBoZWFkZXIgZmlsZSB2ZXJzaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjI4NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCAtRSBvcHRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6Mjg3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZWNvZ25pemVkIC0tZW5kaWFuIHR5cGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjIwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcGFyc2VfY29mZl90eXBlOiBCYWQgdHlwZSBjb2RlIDB4JXhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZGNvZmYuYzo0MjMgcmRjb2ZmLmM6NTMxIHJkY29mZi5jOjcxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6NDM5IHJkY29mZi5jOjczMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX2NvZmZfZ2V0X2F1eGVudCBmYWlsZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6Nzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlbGQ6IC5iZiB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjg0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJWxkOiB1bmV4cGVjdGVkIC5lZlxuIgotbXNnc3RyICIiCi0KLSM6IHJkZGJnLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHJlY29nbml6ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmRkYmcuYzo0MDAKLW1zZ2lkICJMYXN0IHN0YWJzIGVudHJpZXMgYmVmb3JlIGVycm9yOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDEgcmVhZGVsZi5jOjMyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRXJyb3I6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzEzIHJlYWRlbGYuYzozNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFdhcm5pbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkyIHJlYWRlbGYuYzo1MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5oYW5kbGVkIGRhdGEgbGVuZ3RoOiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1ODkKLW1zZ2lkICJEb24ndCBrbm93IGFib3V0IHJlbG9jYXRpb25zIG9uIHRoaXMgbWFjaGluZSBhcmNoaXRlY3R1cmVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjI5IHJlYWRlbGYuYzo2NTggcmVhZGVsZi5jOjY5MCByZWFkZWxmLmM6NzE4Ci1tc2dpZCAib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzM2Ci1tc2dpZCAiIgotIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZSAgICAgICAgICAiCi0iQWRkZW5kXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjczOQotbXNnaWQgIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo4NzkgcmVhZGVsZi5jOjg4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbmlzZWQ6ICUtN2x4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo5MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHN0cmluZyB0YWJsZSBpbmRleCAlM2xkPiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTExMwotIywgYy1mb3JtYXQKLW1zZ2lkICJQcm9jZXNzb3IgU3BlY2lmaWM6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTEzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGVyYXRpbmcgU3lzdGVtIHNwZWNpZmljOiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExMzUgcmVhZGVsZi5jOjE1MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDkKLW1zZ2lkICJOT05FIChOb25lKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MAotbXNnaWQgIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTEKLW1zZ2lkICJFWEVDIChFeGVjdXRhYmxlIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTUyCi1tc2dpZCAiRFlOIChTaGFyZWQgb2JqZWN0IGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTUzCi1tc2dpZCAiQ09SRSAoQ29yZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJQcm9jZXNzb3IgU3BlY2lmaWM6ICgleCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT1MgU3BlY2lmaWM6ICgleCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNjEgcmVhZGVsZi5jOjEyMzggcmVhZGVsZi5jOjE2MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAleCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE3NAotbXNnaWQgIk5vbmUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2NzAKLW1zZ2lkICJVc2FnZTogcmVhZGVsZiB7b3B0aW9uc30gZWxmLWZpbGUocylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTY3MQotbXNnaWQgIiAgT3B0aW9ucyBhcmU6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2NzIKLW1zZ2lkICIgIC1hIG9yIC0tYWxsICAgICAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVMgLXMgLXIgLWQgLVYgLUEgLUlcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTY3MwotbXNnaWQgIiAgLWggb3IgLS1maWxlLWhlYWRlciAgICAgICBEaXNwbGF5IHRoZSBFTEYgZmlsZSBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTY3NAotbXNnaWQgIiAgLWwgb3IgLS1wcm9ncmFtLWhlYWRlcnMgb3IgLS1zZWdtZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjc1Ci1tc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVyc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjc2Ci1tc2dpZCAiICAtUyBvciAtLXNlY3Rpb24taGVhZGVycyBvciAtLXNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2NzcKLW1zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgc2VjdGlvbnMnIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjc4Ci1tc2dpZCAiICAtZSBvciAtLWhlYWRlcnMgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1oIC1sIC1TXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2NzkKLW1zZ2lkICIgIC1zIG9yIC0tc3ltcyBvciAtLXN5bWJvbHMgRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2ODAKLW1zZ2lkICIgIC1uIG9yIC0tbm90ZXMgICAgICAgICAgICAgRGlzcGxheSB0aGUgY29yZSBub3RlcyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTY4MQotbXNnaWQgIiAgLXIgb3IgLS1yZWxvY3MgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTY4MgotbXNnaWQgIiAgLWQgb3IgLS1keW5hbWljICAgICAgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQgKGlmIHByZXNlbnQpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2ODMKLW1zZ2lkICIgIC1WIG9yIC0tdmVyc2lvbi1pbmZvICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBzZWN0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTY4NAotbXNnaWQgIiIKLSIgIC1BIG9yIC0tYXJjaC1zcGVjaWZpYyAgICAgRGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24gKGlmICIKLSJhbnkpLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjg1Ci1tc2dpZCAiIgotIiAgLUQgb3IgLS11c2UtZHluYW1pYyAgICAgICBVc2UgdGhlIGR5bmFtaWMgc2VjdGlvbiBpbmZvIHdoZW4gZGlzcGxheWluZyAiCi0ic3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjg2Ci1tc2dpZCAiICAteCA8bnVtYmVyPiBvciAtLWhleC1kdW1wPTxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2ODcKLW1zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtcCB0aGUgY29udGVudHMgb2Ygc2VjdGlvbiA8bnVtYmVyPlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjg4Ci1tc2dpZCAiICAtd1tsaWFwcl0gb3IgLS1kZWJ1Zy1kdW1wWz1saW5lLD1pbmZvLD1hYmJyZXYsPXB1Ym5hbWVzLD1yYW5nZXNdXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2ODkKLW1zZ2lkICIiCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIERXQVJGMiBkZWJ1ZyBzZWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjkxCi1tc2dpZCAiICAtaSA8bnVtYmVyPiBvciAtLWluc3RydWN0aW9uLWR1bXA9PG51bWJlcj5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTY5MgotbXNnaWQgIiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYXNzZW1ibGUgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTY5NAotbXNnaWQgIiAgLUkgb3IgLS1oaXN0b2dyYW0gICAgICAgICBEaXNwbGF5IGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2OTUKLW1zZ2lkICIgIC12IG9yIC0tdmVyc2lvbiAgICAgICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgcmVhZGVsZlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjk2Ci1tc2dpZCAiICAtSCBvciAtLWhlbHAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNzE0Ci1tc2dpZCAiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGR1bXAgcmVxdWVzdCB0YWJsZS4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE4NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIGRlYnVnIG9wdGlvbiAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE4NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBvcHRpb24gJy0lYydcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTg4NwotbXNnaWQgIk5vdGhpbmcgdG8gZG8uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5MDAgcmVhZGVsZi5jOjE5MTcgcmVhZGVsZi5jOjM0ODQKLW1zZ2lkICJub25lIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTAxCi1tc2dpZCAiRUxGMzIiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5MDIKLW1zZ2lkICJFTEY2NCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTkwNCByZWFkZWxmLmM6MTkyMSByZWFkZWxmLmM6MTk0MAotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bjogJXg+IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTE4Ci1tc2dpZCAiMidzIGNvbXBsZW1lbnQsIGxpdHRsZSBlbmRpYW4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5MTkKLW1zZ2lkICIyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTkzNAotbXNnaWQgIlVOSVggLSBTeXN0ZW0gViIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTkzNQotbXNnaWQgIlVOSVggLSBIUC1VWCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTkzNgotbXNnaWQgIlVOSVggLSBMaW51eCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTkzNwotbXNnaWQgIlN0YW5kYWxvbmUgQXBwIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTM4Ci1tc2dpZCAiQVJNIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTU1Ci1tc2dpZCAiTm90IGFuIEVMRiBmaWxlIC0gaXQgaGFzIHRoZSB3cm9uZyBtYWdpYyBieXRlcyBhdCB0aGUgc3RhcnRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk2MwotbXNnaWQgIkVMRiBIZWFkZXI6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5NjQKLW1zZ2lkICIgIE1hZ2ljOiAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIERhdGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgJWQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk3OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk5MAotbXNnaWQgIiAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5OTIKLW1zZ2lkICIiCi0iXG4iCi0iICBTdGFydCBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk5NAotbXNnaWQgIiIKLSIgKGJ5dGVzIGludG8gZmlsZSlcbiIKLSIgIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTk2Ci1tc2dpZCAiIChieXRlcyBpbnRvIGZpbGUpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjAwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgdGhpcyBoZWFkZXI6ICAgICAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjAwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjAwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIwMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgICVsZCAoYnl0ZXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIwMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMDExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjA5NgotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBhcmUgbm8gcHJvZ3JhbSBoZWFkZXJzIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjEwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRWxmIGZpbGUgdHlwZSBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTAzCi1tc2dpZCAiRW50cnkgcG9pbnQgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBhcmUgJWQgcHJvZ3JhbSBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTE2IHJlYWRlbGYuYzoyMjkyIHJlYWRlbGYuYzoyMzM0IHJlYWRlbGYuYzoyMzc3IHJlYWRlbGYuYzoyNDE4Ci0jOiByZWFkZWxmLmM6MjkyNiByZWFkZWxmLmM6Mjk2NyByZWFkZWxmLmM6MzE0MyByZWFkZWxmLmM6NDEwMiByZWFkZWxmLmM6NDExNgotIzogcmVhZGVsZi5jOjcwMTQgcmVhZGVsZi5jOjcwNTQKLW1zZ2lkICJPdXQgb2YgbWVtb3J5XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIxMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlByb2dyYW0gSGVhZGVyJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIxMzgKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgIFBoeXNBZGRyICAgRmlsZVNpeiBNZW1TaXogIEZsZyBBbGlnblxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTQyCi1tc2dpZCAiICBUeXBlICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgVmlydEFkZHIgICAgICAgICAgIFBoeXNBZGRyXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIxNDQKLW1zZ2lkICIgICAgICAgICAgICAgICAgIEZpbGVTaXogICAgICAgICAgICBNZW1TaXogICAgICAgICAgICAgIEZsYWdzICBBbGlnblxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjAyCi1tc2dpZCAibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjIxMAotbXNnaWQgIlVuYWJsZSB0byBmaW5kIHByb2dyYW0gaW50ZXJwcmV0ZXIgbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc10iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyMzUKLW1zZ2lkICIiCi0iXG4iCi0iIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjM2Ci1tc2dpZCAiICBTZWdtZW50IFNlY3Rpb25zLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI0OTkKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHNlY3Rpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjUwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHglbHg6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI1NDUKLW1zZ2lkICJGaWxlIGNvbnRhaW5zIG11bHRpcGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTU4Ci1tc2dpZCAiRmlsZSBjb250YWlucyBtdWx0aXBsZSBkeW5hbWljIHN0cmluZyB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjU4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBIZWFkZXIlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjU4OQotbXNnaWQgIiIKLSIgIFtOcl0gTmFtZSAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxnIExrICIKLSJJbmYgQWxcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjU5MgotbXNnaWQgIiAgW05yXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgIE9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTkzCi1tc2dpZCAiICAgICAgIFNpemUgICAgICAgICAgICAgIEVudFNpemUgICAgICAgICAgRmxhZ3MgIExpbmsgIEluZm8gIEFsaWduXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2NDAKLW1zZ2lkICIiCi0iS2V5IHRvIEZsYWdzOiBXICh3cml0ZSksIEEgKGFsbG9jKSwgWCAoZXhlY3V0ZSksIE0gKG1lcmdlKSwgUyAoc3RyaW5ncylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY0MQotbXNnaWQgIiIKLSIgICAgICAgICAgICAgIEkgKGluZm8pLCBMIChsaW5rIG9yZGVyKSwgTyAoZXh0cmEgT1MgcHJvY2Vzc2luZyByZXF1aXJlZClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY0MgotbXNnaWQgIiAgICAgICAgICAgICAgbyAob3Mgc3BlY2lmaWMpLCBwIChwcm9jZXNzb3Igc3BlY2lmaWMpIHggKHVua25vd24pXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI3MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWxkIGJ5dGVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzA3Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBkeW5hbWljIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjczNQotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWx1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI3NzAKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzAyMAotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDU0Ci1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGUhIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDYzCi1tc2dpZCAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gbG9hZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDkzCi1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA5OQotbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzE2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMTYzCi1tc2dpZCAiICBUYWcgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS9WYWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMTkxCi1tc2dpZCAiQXV4aWxpYXJ5IGxpYnJhcnkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxOTMKLW1zZ2lkICJGaWx0ZXIgbGlicmFyeSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzIwOSByZWFkZWxmLmM6MzIzMCByZWFkZWxmLmM6MzI1NgotbXNnaWQgIkZsYWdzOiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzIxMSByZWFkZWxmLmM6MzIzMiByZWFkZWxmLmM6MzI1OAotbXNnaWQgIiBOb25lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMzNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2hhcmVkIGxpYnJhcnk6IFslc10iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMzNjQKLW1zZ2lkICIgcHJvZ3JhbSBpbnRlcnByZXRlciIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzM2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHNvbmFtZTogWyVzXSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzM3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHJwYXRoOiBbJXNdIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vdCBuZWVkZWQgb2JqZWN0OiBbJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uICclcycgY29udGFpbnMgJWxkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1MzMKLW1zZ2lkICIgIEFkZHI6IDB4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNTM1IHJlYWRlbGYuYzozNzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT2Zmc2V0OiAlIzA4bHggIExpbms6ICVseCAoJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogUmV2OiAlZCAgRmxhZ3M6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNTY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgSW5kZXg6ICVkICBDbnQ6ICVkICAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTmFtZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzU4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJOYW1lIGluZGV4OiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogUGFyZW50ICVkLCBuYW1lIGluZGV4OiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzYxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uICclcycgY29udGFpbnMgJWxkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM2MjEKLW1zZ2lkICIgQWRkcjogMHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM2MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPZmZzZXQ6ICUjMDhseCAgTGluayB0byBzZWN0aW9uOiAlbGQgKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNjQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFZlcnNpb246ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM2NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGaWxlOiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM2NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBDbnQ6ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM2NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogTmFtZTogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogTmFtZSBpbmRleDogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmxhZ3M6ICVzICBWZXJzaW9uOiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3MjEKLW1zZ2lkICIgQWRkcjogIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzUxCi1tc2dpZCAiICAgMCAoKmxvY2FsKikgICAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzU1Ci1tc2dpZCAiICAgMSAoKmdsb2JhbCopICAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTc3Ci1tc2dpZCAiIgotIlxuIgotIk5vIHZlcnNpb24gaW5mb3JtYXRpb24gZm91bmQgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTk1IHJlYWRlbGYuYzo0MDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIjxwcm9jZXNzb3Igc3BlY2lmaWM+OiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk5NyByZWFkZWxmLmM6NDA0MgotIywgYy1mb3JtYXQKLW1zZ2lkICI8T1Mgc3BlY2lmaWM+OiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk5OSByZWFkZWxmLmM6NDA0NQotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MTA4Ci1tc2dpZCAiVW5hYmxlIHRvIHJlYWQgaW4gZHluYW1pYyBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQxNTAKLW1zZ2lkICJVbmFibGUgdG8gc2VlayB0byBzdGFydCBvZiBkeW5hbWljIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MTU2Ci1tc2dpZCAiRmFpbGVkIHRvIHJlYWQgaW4gbnVtYmVyIG9mIGJ1Y2tldHNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDE2MgotbXNnaWQgIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBjaGFpbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDE4MgotbXNnaWQgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgZm9yIGltYWdlOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MTg0Ci1tc2dpZCAiICBOdW0gQnVjOiAgICBWYWx1ZSAgU2l6ZSAgIFR5cGUgICBCaW5kIFZpcyAgICAgIE5keCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQxODYKLW1zZ2lkICIgIE51bSBCdWM6ICAgIFZhbHVlICAgICAgICAgIFNpemUgICBUeXBlICAgQmluZCBWaXMgICAgICBOZHggTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgJyVzJyBjb250YWlucyAlbHUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDIzNAotbXNnaWQgIiAgIE51bTogICAgVmFsdWUgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDIzNgotbXNnaWQgIiAgIE51bTogICAgVmFsdWUgICAgICAgICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICBOZHggTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MzQ1Ci1tc2dpZCAiYmFkIGR5bmFtaWMgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDA0Ci1tc2dpZCAiIgotIlxuIgotIkR5bmFtaWMgc3ltYm9sIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIGRpc3BsYXlpbmcgc3ltYm9scy5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDQxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggKHRvdGFsIG9mICVkIGJ1Y2tldHMpOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDE4Ci1tc2dpZCAiIExlbmd0aCAgTnVtYmVyICAgICAlJSBvZiB0b3RhbCAgQ292ZXJhZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDQyMyByZWFkZWxmLmM6NDQ0MiByZWFkZWxmLmM6NjY5NSByZWFkZWxmLmM6Njg4OAotbXNnaWQgIk91dCBvZiBtZW1vcnkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR5bmFtaWMgaW5mbyBzZWdtZW50IGF0IG9mZnNldCAweCVseCBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDk0Ci1tc2dpZCAiIE51bTogTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kVG8gICAgIEZsYWdzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ1NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkFzc2VtYmx5IGR1bXAgb2Ygc2VjdGlvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDU3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSGV4IGR1bXAgb2Ygc2VjdGlvbiAnJXMnOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzIyCi1tc2dpZCAiYmFkbHkgZm9ybWVkIGV4dGVuZGVkIGxpbmUgb3AgZW5jb3VudGVyZWQhIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRXh0ZW5kZWQgb3Bjb2RlICVkOiAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3MzQKLW1zZ2lkICIiCi0iRW5kIG9mIFNlcXVlbmNlXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2V0IEFkZHJlc3MgdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc0NQotbXNnaWQgIiAgZGVmaW5lIG5ldyBGaWxlIFRhYmxlIGVudHJ5XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NDYgcmVhZGVsZi5jOjQ4NjgKLW1zZ2lkICIgIEVudHJ5XHREaXJcdFRpbWVcdFNpemVcdE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAlZFx0IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzUxIHJlYWRlbGYuYzo0NzUzIHJlYWRlbGYuYzo0NzU1IHJlYWRlbGYuYzo0ODgwIHJlYWRlbGYuYzo0ODgyCi0jOiByZWFkZWxmLmM6NDg4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlbHVcdCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJVTktOT1dOOiBsZW5ndGggJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHVtcCBvZiBkZWJ1ZyBjb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0Nzk4Ci1tc2dpZCAiVGhlIGxpbmUgaW5mbyBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQgLSB0aGUgc2VjdGlvbiBpcyB0b28gc21hbGxcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgwNgotbXNnaWQgIk9ubHkgRFdBUkYgdmVyc2lvbiAyIGxpbmUgaW5mbyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0ODIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIERXQVJGIFZlcnNpb246ICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFByb2xndWUgTGVuZ3RoOiAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE1pbmltdW0gSW5zdHJ1Y3Rpb24gTGVuZ3RoOiAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEluaXRpYWwgdmFsdWUgb2YgJ2lzX3N0bXQnOiAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIExpbmUgQmFzZTogICAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIExpbmUgUmFuZ2U6ICAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9wY29kZSBCYXNlOiAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDgzNwotbXNnaWQgIiIKLSJcbiIKLSIgT3Bjb2RlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDg0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9wY29kZSAlZCBoYXMgJWQgYXJnc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0ODQ2Ci1tc2dpZCAiIgotIlxuIgotIiBUaGUgRGlyZWN0b3J5IFRhYmxlIGlzIGVtcHR5LlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0ODQ5Ci1tc2dpZCAiIgotIlxuIgotIiBUaGUgRGlyZWN0b3J5IFRhYmxlOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0ODUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDg2NAotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIEZpbGUgTmFtZSBUYWJsZSBpcyBlbXB0eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDg2NwotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIEZpbGUgTmFtZSBUYWJsZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDg3NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICVkXHQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXNcbiIKLW1zZ3N0ciAiIgotCi0jLiBOb3cgZGlzcGxheSB0aGUgc3RhdGVtZW50cy4KLSM6IHJlYWRlbGYuYzo0ODk0Ci1tc2dpZCAiIgotIlxuIgotIiBMaW5lIE51bWJlciBTdGF0ZW1lbnRzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTEzCi1tc2dpZCAiICBDb3B5XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBBZHZhbmNlIFBDIGJ5ICVkIHRvICVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQWR2YW5jZSBMaW5lIGJ5ICVkIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZXQgRmlsZSBOYW1lIHRvIGVudHJ5ICVkIGluIHRoZSBGaWxlIE5hbWUgVGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNldCBjb2x1bW4gdG8gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNldCBpc19zdG10IHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5NTUKLW1zZ2lkICIgIFNldCBiYXNpYyBibG9ja1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQWR2YW5jZSBQQyBieSBjb25zdGFudCAlZCB0byAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQWR2YW5jZSBQQyBieSBmaXhlZCBzaXplIGFtb3VudCAlZCB0byAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3BlY2lhbCBvcGNvZGUgJWQ6IGFkdmFuY2UgQWRkcmVzcyBieSAlZCB0byAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgYW5kIExpbmUgYnkgJWQgdG8gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTAwNiByZWFkZWxmLmM6NTQyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iQ29udGVudHMgb2YgdGhlICVzIHNlY3Rpb246XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwMjUKLW1zZ2lkICJPbmx5IERXQVJGIDIgcHVibmFtZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTAzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldCBpbnRvIC5kZWJ1Z19pbmZvIHNlY3Rpb246ICAgICAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTAzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgYXJlYSBpbiAuZGVidWdfaW5mbyBzZWN0aW9uOiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTAzOAotbXNnaWQgIiIKLSJcbiIKLSIgICAgT2Zmc2V0XHROYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBUQUcgdmFsdWU6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTIxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIEFUIHZhbHVlOiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUyNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBGT1JNIHZhbHVlOiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU0MzQKLW1zZ2lkICIgIE51bWJlciBUQUdcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTQ0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAlbGQgICAgICAlcyAgICBbJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU0NDMKLW1zZ2lkICJoYXMgY2hpbGRyZW4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU0NDMKLW1zZ2lkICJubyBjaGlsZHJlbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTQ0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgJS0xOHMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgJWx1IGJ5dGUgYmxvY2s6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTkzMAotbXNnaWQgIihVc2VyIGRlZmluZWQgbG9jYXRpb24gb3ApIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1OTMyCi1tc2dpZCAiKFVua25vd24gbG9jYXRpb24gb3ApIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2MDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBoYW5kbGUgRk9STTogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjYwNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIGZvcm06ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2MDY2Ci1tc2dpZCAiKG5vdCBpbmxpbmVkKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjA2NwotbXNnaWQgIihpbmxpbmVkKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjA2OAotbXNnaWQgIihkZWNsYXJlZCBhcyBpbmxpbmUgYnV0IGlnbm9yZWQpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2MDY5Ci1tc2dpZCAiKGRlY2xhcmVkIGFzIGlubGluZSBhbmQgaW5saW5lZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjYwNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAoVW5rbm93biBpbmxpbmUgYXR0cmlidXRlIHZhbHVlOiAlbHgpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2MjAwIHJlYWRlbGYuYzo2MzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJUaGUgc2VjdGlvbiAlcyBjb250YWluczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjIyMgotbXNnaWQgIk9ubHkgdmVyc2lvbiAyIERXQVJGIGRlYnVnIGluZm9ybWF0aW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjYyMjYKLW1zZ2lkICIgIENvbXBpbGF0aW9uIFVuaXQ6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjYyMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgTGVuZ3RoOiAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjYyMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgVmVyc2lvbjogICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjIyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICBBYmJyZXYgT2Zmc2V0OiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjIzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICBQb2ludGVyIFNpemU6ICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2MjUwCi1tc2dpZCAiVW5hYmxlIHRvIGxvY2F0ZSAuZGVidWdfYWJicmV2IHNlY3Rpb24hXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjYyOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hYmxlIHRvIGxvY2F0ZSBlbnRyeSAlbHUgaW4gdGhlIGFiYnJldmlhdGlvbiB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2Mjk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiA8JWQ+PCV4PjogQWJicmV2IE51bWJlcjogJWx1ICglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjM0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjYzNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjYzNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbzogICVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2MzQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgUG9pbnRlciBTaXplOiAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2MzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2VnbWVudCBTaXplOiAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2MzQ5Ci1tc2dpZCAiIgotIlxuIgotIiAgICBBZGRyZXNzICBMZW5ndGhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjM5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJEaXNwbGF5aW5nIHRoZSBkZWJ1ZyBjb250ZW50cyBvZiBzZWN0aW9uICVzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2NDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICclcycgaGFzIG5vIGRlYnVnZ2luZyBkYXRhLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2NDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBkZWJ1ZyBzZWN0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2NTQwCi1tc2dpZCAiU29tZSBzZWN0aW9ucyB3ZXJlIG5vdCBkdW1wZWQgYmVjYXVzZSB0aGV5IGRvIG5vdCBleGlzdCFcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjcxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjY4ODEKLW1zZ2lkICJjb25mbGljdCBsaXN0IHdpdGggd2l0aG91dCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjkwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiAnLmNvbmZsaWN0JyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2OTEwCi1tc2dpZCAiICBOdW06ICAgIEluZGV4ICAgICAgIFZhbHVlICBOYW1lIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2OTM1Ci1tc2dpZCAiTlRfUFJTVEFUVVMgKHByc3RhdHVzIHN0cnVjdHVyZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjY5MzYKLW1zZ2lkICJOVF9GUFJFR1NFVCAoZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NjkzNwotbXNnaWQgIk5UX1BSUFNJTkZPIChwcnBzaW5mbyBzdHJ1Y3R1cmUpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2OTM4Ci1tc2dpZCAiTlRfVEFTS1NUUlVDVCAodGFzayBzdHJ1Y3R1cmUpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2OTM5Ci1tc2dpZCAiTlRfUFJYRlBSRUcgKHVzZXJfeGZwcmVncyBzdHJ1Y3R1cmUpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2OTQwCi1tc2dpZCAiTlRfUFNUQVRVUyAocHN0YXR1cyBzdHJ1Y3R1cmUpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2OTQxCi1tc2dpZCAiTlRfRlBSRUdTIChmbG9hdGluZyBwb2ludCByZWdpc3RlcnMpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo2OTQyCi1tc2dpZCAiTlRfUFNJTkZPIChwc2luZm8gc3RydWN0dXJlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Njk0MwotbXNnaWQgIk5UX0xXUFNUQVRVUyAobHdwc3RhdHVzX3Qgc3RydWN0dXJlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Njk0NAotbXNnaWQgIk5UX0xXUFNJTkZPIChsd3BzaW5mb190IHN0cnVjdHVyZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjY5NDUKLW1zZ2lkICJOVF9XSU4zMlBTVEFUVVMgKHdpbjMyX3BzdGF0dXMgc3RyY3V0dXJlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Njk0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIG5vdGUgdHlwZTogKDB4JTA4eCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjY5ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGVzIGF0IG9mZnNldCAweCUwOGx4IHdpdGggbGVuZ3RoIDB4JTA4bHg6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjY5ODgKLW1zZ2lkICIgIE93bmVyXHRcdERhdGEgc2l6ZVx0RGVzY3JpcHRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzA5OQotbXNnaWQgIk5vIG5vdGUgc2VnbWVudHMgcHJlc2VudCBpbiB0aGUgY29yZSBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3MTc3Ci1tc2dpZCAiVGhpcyBpbnN0YW5jZSBvZiByZWFkZWxmIGhhcyBiZWVuIGJ1aWx0IHdpdGhvdXQgc3VwcG9ydCBmb3IgYVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3MTc4Ci1tc2dpZCAiNjQgYml0IGRhdGEgdHlwZSBhbmQgc28gaXQgY2Fubm90IHJlYWQgNjQgYml0IEVMRiBmaWxlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3Qgc3RhdCBpbnB1dCBmaWxlICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3MjIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIklucHV0IGZpbGUgJXMgbm90IGZvdW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBGYWlsZWQgdG8gcmVhZCBmaWxlIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3MjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJGaWxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlbmFtZS5jOjEzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IHNldCB0aW1lOiAlcyIKLW1zZ3N0ciAiIgotCi0jLiBXZSBoYXZlIHRvIGNsZWFuIHVwIGhlcmUuCi0jOiByZW5hbWUuYzoxNzAgcmVuYW1lLmM6MjAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZW5hbWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlbmFtZS5jOjIxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2ltcGxlX2NvcHk6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm90IGVub3VnaCBiaW5hcnkgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxNDkKLW1zZ2lkICJudWxsIHRlcm1pbmF0ZWQgdW5pY29kZSBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTc5IHJlc2Jpbi5jOjE4NQotbXNnaWQgInJlc291cmNlIElEIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjIyOQotbXNnaWQgImN1cnNvciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyNjMgcmVzYmluLmM6MjcwCi1tc2dpZCAibWVudSBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MjgwCi1tc2dpZCAibWVudWV4IGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyODQKLW1zZ2lkICJtZW51ZXggb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjI5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBtZW51IHZlcnNpb24gJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MzE5IHJlc2Jpbi5jOjMzNCByZXNiaW4uYzo0MDAKLW1zZ2lkICJtZW51aXRlbSBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NDMwCi1tc2dpZCAibWVudWl0ZW0iCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NDcxIHJlc2Jpbi5jOjQ5OQotbXNnaWQgImRpYWxvZyBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NDg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgZGlhbG9nIHNpZ25hdHVyZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1MzEKLW1zZ2lkICJkaWFsb2cgZm9udCBwb2ludCBzaXplIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjUzOQotbXNnaWQgImRpYWxvZ2V4IGZvbnQgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NTY0IHJlc2Jpbi5jOjU4MgotbXNnaWQgImRpYWxvZyBjb250cm9sIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjU3NAotbXNnaWQgImRpYWxvZ2V4IGNvbnRyb2wiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NjAzCi1tc2dpZCAiZGlhbG9nIGNvbnRyb2wgZW5kIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjYxNQotbXNnaWQgImRpYWxvZyBjb250cm9sIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NjU4Ci1tc2dpZCAic3RyaW5ndGFibGUgc3RyaW5nIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo2NjgKLW1zZ2lkICJzdHJpbmd0YWJsZSBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NzAxCi1tc2dpZCAiZm9udGRpciBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NzE0Ci1tc2dpZCAiZm9udGRpciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3MzAKLW1zZ2lkICJmb250ZGlyIGRldmljZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjczNgotbXNnaWQgImZvbnRkaXIgZmFjZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjc3OQotbXNnaWQgImFjY2VsZXJhdG9yIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjg0MwotbXNnaWQgImdyb3VwIGN1cnNvciBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6ODQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgZ3JvdXAgY3Vyc29yIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6ODYyCi1tc2dpZCAiZ3JvdXAgY3Vyc29yIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjkwMQotbXNnaWQgImdyb3VwIGljb24gaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjkwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGdyb3VwIGljb24gdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5MjAKLW1zZ2lkICJncm91cCBpY29uIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjk5MSByZXNiaW4uYzoxMjEwCi1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInZlcnNpb24gbGVuZ3RoICVkIGRvZXMgbm90IG1hdGNoIHJlc291cmNlIGxlbmd0aCAlbHUiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTAyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA0NAotbXNnaWQgImZpeGVkIHZlcnNpb24gaW5mbyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBzaWduYXR1cmUgJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBmaXhlZCB2ZXJzaW9uIGluZm8gdmVyc2lvbiAlbHUiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA4MQotbXNnaWQgInZlcnNpb24gdmFyIGluZm8iCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHN0cmluZ2ZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmd0YWJsZSB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTE0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIGxlbmd0aCAlZCAhPSAlZCArICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjExNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgPCAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmFyZmlsZWluZm8gdmFsdWUgbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjExODkKLW1zZ2lkICJ2ZXJzaW9uIHZhcmZpbGVpbmZvIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHZhbHVlIGxlbmd0aCAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MTI4Ci1tc2dpZCAiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgaW5wdXQiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjE0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IG5vIHJlc291cmNlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MTU0Ci1tc2dpZCAiY2FuJ3QgcmVhZCByZXNvdXJjZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBhZGRyZXNzIG91dCBvZiBib3VuZHMiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjE5OQotbXNnaWQgImRpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjI3Ci1tc2dpZCAibmFtZWQgZGlyZWN0b3J5IGVudHJ5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoyMzYKLW1zZ2lkICJkaXJlY3RvcnkgZW50cnkgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjU2Ci1tc2dpZCAibmFtZWQgc3ViZGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoyNjQKLW1zZ2lkICJuYW1lZCByZXNvdXJjZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6Mjc5Ci1tc2dpZCAiSUQgZGlyZWN0b3J5IGVudHJ5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoyOTYKLW1zZ2lkICJJRCBzdWJkaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjMwNAotbXNnaWQgIklEIHJlc291cmNlIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozMzAKLW1zZ2lkICJyZXNvdXJjZSB0eXBlIHVua25vd24iCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjMzMwotbXNnaWQgImRhdGEgZW50cnkiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjM0MQotbXNnaWQgInJlc291cmNlIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjM0NgotbXNnaWQgInJlc291cmNlIGRhdGEgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6NDQxCi1tc2dpZCAiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzo3NDAKLW1zZ2lkICJjYW4ndCBnZXQgQkZEX1JFTE9DX1JWQSByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzoyNDAgcmVzcmMuYzozMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3Qgb3BlbiB0ZW1wb3JhcnkgZmlsZSBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjI0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCByZWRpcmVjdCBzdGRvdXQ6IGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MjYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjI4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzozMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgZXhlY3V0ZSBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjMxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2luZyB0ZW1wb3JhcnkgZmlsZSBgJXMnIHRvIHJlYWQgcHJlcHJvY2Vzc29yIG91dHB1dFxuIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IHBvcGVuIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MzI2Ci1tc2dpZCAiVXNpbmcgcG9wZW4gdG8gcmVhZCBwcmVwcm9jZXNzb3Igb3V0cHV0XG4iCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzozNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHJpZWQgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MzgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzaW5nIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjU0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjU1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBFT0YiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzo2MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlYWQgb2YgJWx1IHJldHVybmVkICVsdSIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjY1MiByZXNyYy5jOjg4MyByZXNyYy5jOjExNTYgcmVzcmMuYzoxMzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6NzA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImN1cnNvciBmaWxlIGAlcycgZG9lcyBub3QgY29udGFpbiBjdXJzb3IgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjczNyByZXNyYy5jOjEwMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZzZWVrIHRvICVsdSBmYWlsZWQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6OTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImljb24gZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gaWNvbiBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MTUxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBvcGVuIGAlcycgZm9yIG91dHB1dDogJXMiCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1BQmRveFZdIFstLWZvcm1hdD1iZXJrZWxleXxzeXN2XSBbLS1yYWRpeD04fDEwfDE2XVxuIgotIiAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gW2ZpbGUuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjgzCi1tc2dpZCAiZGVmYXVsdCBpcyAtLWZvcm1hdD1iZXJrZWxleVxuIgotbXNnc3RyICIiCi0KLSM6IHNpemUuYzo4NQotbXNnaWQgImRlZmF1bHQgaXMgLS1mb3JtYXQ9c3lzdlxuIgotbXNnc3RyICIiCi0KLSM6IHNpemUuYzoxMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmd1bWVudCB0byAtLWZvcm1hdDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6MTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgcmFkaXg6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3Jjb252LmM6MTg3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgWy1kaFZxXSBpbi1maWxlIFtvdXQtZmlsZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmNvbnYuYzoxODg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDb252ZXJ0IGEgQ09GRiBvYmplY3QgZmlsZSBpbnRvIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyY29udi5jOjIwMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozNDkgc3RhYnMuYzoxNzY5Ci1tc2dpZCAibnVtZXJpYyBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgc3RhYjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiAlczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjQ5MgotbXNnaWQgIk5fTEJSQUMgbm90IHdpdGhpbiBmdW5jdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NTMxCi1tc2dpZCAiVG9vIG1hbnkgTl9SQlJBQ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjc4MAotbXNnaWQgInVua25vd24gQysrIGVuY29kZWQgbmFtZSIKLW1zZ3N0ciAiIgotCi0jLiBDb21wbGFpbiBhbmQga2VlcCBnb2luZywgc28gY29tcGlsZXJzIGNhbiBpbnZlbnQgbmV3Ci0jLiBjcm9zcy1yZWZlcmVuY2UgdHlwZXMuCi0jOiBzdGFicy5jOjEzMDYKLW1zZ2lkICJ1bnJlY29nbml6ZWQgY3Jvc3MgcmVmZXJlbmNlIHR5cGUiCi1tc2dzdHIgIiIKLQotIy4gRG9lcyB0aGlzIGFjdHVhbGx5IGV2ZXIgaGFwcGVuPyAgSXMgdGhhdCB3aHkgd2UgYXJlIHdvcnJ5aW5nCi0jLiBhYm91dCBkZWFsaW5nIHdpdGggaXQgcmF0aGVyIHRoYW4ganVzdCBjYWxsaW5nIGVycm9yX3R5cGU/Ci0jOiBzdGFicy5jOjE4NjEKLW1zZ2lkICJtaXNzaW5nIGluZGV4IHR5cGUiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMTg4Ci1tc2dpZCAidW5rbm93biB2aXJ0dWFsIGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjIwNgotbXNnaWQgInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGJhc2VjbGFzcyIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIzOTgKLW1zZ2lkICJ1bm5hbWVkICR2YiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjQwNAotbXNnaWQgInVucmVjb2duaXplZCBDKysgYWJicmV2aWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjQ4NAotbXNnaWQgInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6Mjc0MAotbXNnaWQgImNvbnN0L3ZvbGF0aWxlIGluZGljYXRvciBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6Mjk4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBtYW5nbGluZyBmb3IgXCIlc1wiXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozMjkzCi1tc2dpZCAiVW5kZWZpbmVkIE5fRVhDTCIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjMzODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHlwZSBmaWxlIG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjMzODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHlwZSBpbmRleCBudW1iZXIgJWQgb3V0IG9mIHJhbmdlXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozNDczCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBYQ09GRiB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozNzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBtYW5nbGVkIG5hbWUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6Mzg2OAotbXNnaWQgIm5vIGFyZ3VtZW50IHR5cGVzIGluIG1hbmdsZWQgc3RyaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3RyaW5ncy5jOjE1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW52YWxpZCBudW1iZXIgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdHJpbmdzLmM6NDk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIGludGVnZXIgYXJndW1lbnQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdHJpbmdzLmM6NTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1hZm92XSBbLW4gbWluLWxlbl0gWy1taW4tbGVuXSBbLXQge28seCxkfV0gWy1dXG4iCi0iICAgICAgIFstLWFsbF0gWy0tcHJpbnQtZmlsZS1uYW1lXSBbLS1ieXRlcz1taW4tbGVuXSBbLS1yYWRpeD17byx4LGR9XVxuIgotIiAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0taGVscF0gWy0tdmVyc2lvbl0gZmlsZS4uLlxuIgotbXNnc3RyICIiCi0KLSM6IHN5c2R1bXAuYzo3MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFstaFZdIGluLWZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzeXNkdW1wLmM6NzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogdmVyc2lvbi5jOjM5Ci1tc2dpZCAiQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iCi1tc2dzdHIgIiIKLQotIzogdmVyc2lvbi5jOjQwCi1tc2dpZCAiIgotIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcbiIKLSJ0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjIzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBvcGVuICVzIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo0MTYKLW1zZ2lkICI6IGV4cGVjdGVkIHRvIGJlIGEgZGlyZWN0b3J5XG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQyOAotbXNnaWQgIjogZXhwZWN0ZWQgdG8gYmUgYSBsZWFmXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo0MzkKLW1zZ2lkICI6IGR1cGxpY2F0ZSB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo2MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVua25vd24gZm9ybWF0IHR5cGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo2MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN1cHBvcnRlZCBmb3JtYXRzOiIKLW1zZ3N0ciAiIgotCi0jLiBPdGhlcndpc2UsIHdlIGdpdmUgdXAuCi0jOiB3aW5kcmVzLmM6NjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbiBub3QgZGV0ZXJtaW5lIHR5cGUgb2YgZmlsZSBgJXMnOyB1c2UgdGhlIC1JIG9wdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbb3B0aW9uc10gW2lucHV0LWZpbGVdIFtvdXRwdXQtZmlsZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzA2Ci1tc2dpZCAiIgotIk9wdGlvbnM6XG4iCi0iICAtaSBGSUxFLCAtLWlucHV0IEZJTEUgICAgICAgTmFtZSBpbnB1dCBmaWxlXG4iCi0iICAtbyBGSUxFLCAtLW91dHB1dCBGSUxFICAgICAgTmFtZSBvdXRwdXQgZmlsZVxuIgotIiAgLUkgRk9STUFULCAtLWlucHV0LWZvcm1hdCBGT1JNQVRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGlucHV0IGZvcm1hdFxuIgotIiAgLU8gRk9STUFULCAtLW91dHB1dC1mb3JtYXQgRk9STUFUXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBvdXRwdXQgZm9ybWF0XG4iCi0iICAtRiBUQVJHRVQsIC0tdGFyZ2V0IFRBUkdFVCAgU3BlY2lmeSBDT0ZGIHRhcmdldFxuIgotIiAgLS1wcmVwcm9jZXNzb3IgUFJPR1JBTSAgICAgIFByb2dyYW0gdG8gdXNlIHRvIHByZXByb2Nlc3MgcmMgZmlsZVxuIgotIiAgLS1pbmNsdWRlLWRpciBESVIgICAgICAgICAgIEluY2x1ZGUgZGlyZWN0b3J5IHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG4iCi0iICAtRFNZTVs9VkFMXSwgLS1kZWZpbmUgU1lNWz1WQUxdXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIFNZTSB3aGVuIHByZXByb2Nlc3NpbmcgcmMgZmlsZVxuIgotIiAgLXYgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcmJvc2UgLSB0ZWxscyB5b3Ugd2hhdCBpdCdzIGRvaW5nXG4iCi0iICAtLWxhbmd1YWdlIFZBTCAgICAgICAgICAgICAgU2V0IGxhbmd1YWdlIHdoZW4gcmVhZGluZyByYyBmaWxlXG4iCi0iICAtLXVzZS10ZW1wLWZpbGUgICAgICAgICAgICAgVXNlIGEgdGVtcG9yYXJ5IGZpbGUgaW5zdGVhZCBvZiBwb3BlbiB0byByZWFkXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZXByb2Nlc3NvciBvdXRwdXRcbiIKLSIgIC0tbm8tdXNlLXRlbXAtZmlsZSAgICAgICAgICBVc2UgcG9wZW4gKGRlZmF1bHQpXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjcyNQotbXNnaWQgIiAgLS15eWRlYnVnICAgICAgICAgICAgICAgICAgIFR1cm4gb24gcGFyc2VyIGRlYnVnZ2luZ1xuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo3MjgKLW1zZ2lkICIiCi0iICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2VcbiIKLSIgIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICBQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjczMQotbXNnaWQgIiIKLSJGT1JNQVQgaXMgb25lIG9mIHJjLCByZXMsIG9yIGNvZmYsIGFuZCBpcyBkZWR1Y2VkIGZyb20gdGhlIGZpbGUgbmFtZVxuIgotImV4dGVuc2lvbiBpZiBub3Qgc3BlY2lmaWVkLiAgQSBzaW5nbGUgZmlsZSBuYW1lIGlzIGFuIGlucHV0IGZpbGUuXG4iCi0iTm8gaW5wdXQtZmlsZSBpcyBzdGRpbiwgZGVmYXVsdCByYy4gIE5vIG91dHB1dC1maWxlIGlzIHN0ZG91dCwgZGVmYXVsdCByYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6OTgwCi1tc2dpZCAibm8gcmVzb3VyY2VzIgotbXNnc3RyICIiCi0KLSM6IHdyc3RhYnMuYzozNjYgd3JzdGFicy5jOjIwMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RyaW5nX2hhc2hfbG9va3VwIGZhaWxlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiB3cnN0YWJzLmM6NjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YWJfaW50X3R5cGU6IGJhZCBzaXplICV1XG4iCi1tc2dzdHIgIiIKLQotIzogd3JzdGFicy5jOjE0NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IHVua25vd24gc2l6ZSBmb3IgZmllbGQgYCVzJyBpbiBzdHJ1Y3RcbiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcHJkYmcuYyBiL2JpbnV0aWxzL3ByZGJnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDY4NGQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcHJkYmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NjIgKzAsMCBAQAotLyogcHJkYmcuYyAtLSBQcmludCBvdXQgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHByaW50cyBvdXQgdGhlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBieQotICAgc3VwcGx5aW5nIGEgc2V0IG9mIHJvdXRpbmVzIHRvIGRlYnVnX3dyaXRlLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLS8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3ZSB1c2UgYXMgYSBoYW5kbGUgZm9yIHRoZXNlIHJvdXRpbmVzLiAgKi8KLQotc3RydWN0IHByX2hhbmRsZQotewotICAvKiBGaWxlIHRvIHByaW50IGluZm9ybWF0aW9uIHRvLiAgKi8KLSAgRklMRSAqZjsKLSAgLyogQ3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4gICovCi0gIHVuc2lnbmVkIGludCBpbmRlbnQ7Ci0gIC8qIFR5cGUgc3RhY2suICAqLwotICBzdHJ1Y3QgcHJfc3RhY2sgKnN0YWNrOwotICAvKiBQYXJhbWV0ZXIgbnVtYmVyIHdlIGFyZSBhYm91dCB0byBvdXRwdXQuICAqLwotICBpbnQgcGFyYW1ldGVyOwotfTsKLQotLyogVGhlIHR5cGUgc3RhY2suICAqLwotCi1zdHJ1Y3QgcHJfc3RhY2sKLXsKLSAgLyogTmV4dCBlbGVtZW50IG9uIHRoZSBzdGFjay4gICovCi0gIHN0cnVjdCBwcl9zdGFjayAqbmV4dDsKLSAgLyogVGhpcyBlbGVtZW50LiAgKi8KLSAgY2hhciAqdHlwZTsKLSAgLyogQ3VycmVudCB2aXNpYmlsaXR5IG9mIGZpZWxkcyBpZiB0aGlzIGlzIGEgY2xhc3MuICAqLwotICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgLyogTmFtZSBvZiB0aGUgY3VycmVudCBtZXRob2Qgd2UgYXJlIGhhbmRsaW5nLiAgKi8KLSAgY29uc3QgY2hhciAqbWV0aG9kOwotfTsKLQotc3RhdGljIHZvaWQgaW5kZW50IFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKikpOwotc3RhdGljIGJvb2xlYW4gcHVzaF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcmVwZW5kX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGFwcGVuZF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdWJzdGl0dXRlX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGluZGVudF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKikpOwotc3RhdGljIGNoYXIgKnBvcF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKikpOwotc3RhdGljIHZvaWQgcHJpbnRfdm1hIFBBUkFNUyAoKGJmZF92bWEsIGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfZml4X3Zpc2liaWxpdHkKLSAgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9lbXB0eV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2Zsb2F0X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHByX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gcHJfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9lbnVtX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGJmZF9zaWduZWRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIHByX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX3JlZmVyZW5jZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfcmFuZ2VfdHlwZSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfc2V0X3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9vZmZzZXRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX21ldGhvZF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jb25zdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX3N0YXJ0X3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RydWN0X2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hLCBiZmRfdm1hLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9zdHJ1Y3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX3N0YXJ0X2NsYXNzX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXRpY19tZW1iZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19iYXNlY2xhc3MKLSAgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXJ0X21ldGhvZCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBiZmRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3NfZW5kX21ldGhvZCBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9jbGFzc190eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfdHlwZWRlZl90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90YWdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGJvb2xlYW4gcHJfdHlwZGVmIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90YWcgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX2ludF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfZmxvYXRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotc3RhdGljIGJvb2xlYW4gcHJfdHlwZWRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9mdW5jdGlvbiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfZnVuY3Rpb25fcGFyYW1ldGVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9saW5lbm8gUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgcHJfZm5zID0KLXsKLSAgcHJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCwKLSAgcHJfc3RhcnRfc291cmNlLAotICBwcl9lbXB0eV90eXBlLAotICBwcl92b2lkX3R5cGUsCi0gIHByX2ludF90eXBlLAotICBwcl9mbG9hdF90eXBlLAotICBwcl9jb21wbGV4X3R5cGUsCi0gIHByX2Jvb2xfdHlwZSwKLSAgcHJfZW51bV90eXBlLAotICBwcl9wb2ludGVyX3R5cGUsCi0gIHByX2Z1bmN0aW9uX3R5cGUsCi0gIHByX3JlZmVyZW5jZV90eXBlLAotICBwcl9yYW5nZV90eXBlLAotICBwcl9hcnJheV90eXBlLAotICBwcl9zZXRfdHlwZSwKLSAgcHJfb2Zmc2V0X3R5cGUsCi0gIHByX21ldGhvZF90eXBlLAotICBwcl9jb25zdF90eXBlLAotICBwcl92b2xhdGlsZV90eXBlLAotICBwcl9zdGFydF9zdHJ1Y3RfdHlwZSwKLSAgcHJfc3RydWN0X2ZpZWxkLAotICBwcl9lbmRfc3RydWN0X3R5cGUsCi0gIHByX3N0YXJ0X2NsYXNzX3R5cGUsCi0gIHByX2NsYXNzX3N0YXRpY19tZW1iZXIsCi0gIHByX2NsYXNzX2Jhc2VjbGFzcywKLSAgcHJfY2xhc3Nfc3RhcnRfbWV0aG9kLAotICBwcl9jbGFzc19tZXRob2RfdmFyaWFudCwKLSAgcHJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50LAotICBwcl9jbGFzc19lbmRfbWV0aG9kLAotICBwcl9lbmRfY2xhc3NfdHlwZSwKLSAgcHJfdHlwZWRlZl90eXBlLAotICBwcl90YWdfdHlwZSwKLSAgcHJfdHlwZGVmLAotICBwcl90YWcsCi0gIHByX2ludF9jb25zdGFudCwKLSAgcHJfZmxvYXRfY29uc3RhbnQsCi0gIHByX3R5cGVkX2NvbnN0YW50LAotICBwcl92YXJpYWJsZSwKLSAgcHJfc3RhcnRfZnVuY3Rpb24sCi0gIHByX2Z1bmN0aW9uX3BhcmFtZXRlciwKLSAgcHJfc3RhcnRfYmxvY2ssCi0gIHByX2VuZF9ibG9jaywKLSAgcHJfZW5kX2Z1bmN0aW9uLAotICBwcl9saW5lbm8KLX07Ci0MCi0vKiBQcmludCBvdXQgdGhlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHJlY29yZGVkIGluIGRoYW5kbGUuICAqLwotCi1ib29sZWFuCi1wcmludF9kZWJ1Z2dpbmdfaW5mbyAoZiwgZGhhbmRsZSkKLSAgICAgRklMRSAqZjsKLSAgICAgUFRSIGRoYW5kbGU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgaW5mbzsKLQotICBpbmZvLmYgPSBmOwotICBpbmZvLmluZGVudCA9IDA7Ci0gIGluZm8uc3RhY2sgPSBOVUxMOwotICBpbmZvLnBhcmFtZXRlciA9IDA7Ci0KLSAgcmV0dXJuIGRlYnVnX3dyaXRlIChkaGFuZGxlLCAmcHJfZm5zLCAoUFRSKSAmaW5mbyk7Ci19Ci0MCi0vKiBJbmRlbnQgdG8gdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuICAqLwotCi1zdGF0aWMgdm9pZAotaW5kZW50IChpbmZvKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+aW5kZW50OyBpKyspCi0gICAgcHV0YyAoJyAnLCBpbmZvLT5mKTsKLX0KLQotLyogUHVzaCBhIHR5cGUgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHVzaF90eXBlIChpbmZvLCB0eXBlKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0eXBlOwotewotICBzdHJ1Y3QgcHJfc3RhY2sgKm47Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbiA9IChzdHJ1Y3QgcHJfc3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOwotCi0gIG4tPnR5cGUgPSB4c3RyZHVwICh0eXBlKTsKLSAgbi0+dmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOwotICBuLT5tZXRob2QgPSBOVUxMOwotICBuLT5uZXh0ID0gaW5mby0+c3RhY2s7Ci0gIGluZm8tPnN0YWNrID0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJlcGVuZCBhIHN0cmluZyBvbnRvIHRoZSB0eXBlIG9uIHRoZSB0b3Agb2YgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJlcGVuZF90eXBlIChpbmZvLCBzKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBjaGFyICpuOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyBzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSArIDEpOwotICBzcHJpbnRmIChuLCAiJXMlcyIsIHMsIGluZm8tPnN0YWNrLT50eXBlKTsKLSAgZnJlZSAoaW5mby0+c3RhY2stPnR5cGUpOwotICBpbmZvLT5zdGFjay0+dHlwZSA9IG47Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgdHlwZSBvbiB0aGUgdG9wIG9mIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFwcGVuZF90eXBlIChpbmZvLCBzKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpzOwotewotICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gIGlmIChzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgbGVuID0gc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIGluZm8tPnN0YWNrLT50eXBlID0gKGNoYXIgKikgeHJlYWxsb2MgKGluZm8tPnN0YWNrLT50eXBlLAotCQkJCQkgbGVuICsgc3RybGVuIChzKSArIDEpOwotICBzdHJjcHkgKGluZm8tPnN0YWNrLT50eXBlICsgbGVuLCBzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgdXNlIGFuIHVuZGVyc2NvcmUgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIG5hbWUgc2hvdWxkIGdvIGluIGEgdHlwZQotICAgc3RyaW5nLiAgVGhpcyBmdW5jdGlvbiBzdWJzdGl0dXRlcyBhIHN0cmluZyBmb3IgdGhlIHVuZGVyc2NvcmUuICBJZgotICAgdGhlcmUgaXMgbm8gdW5kZXJzY29yZSwgdGhlIG5hbWUgZm9sbG93cyB0aGUgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGNoYXIgKnU7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICB1ID0gc3RyY2hyIChpbmZvLT5zdGFjay0+dHlwZSwgJ3wnKTsKLSAgaWYgKHUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpuOwotCi0gICAgICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSkgKyBzdHJsZW4gKHMpKTsKLQotICAgICAgbWVtY3B5IChuLCBpbmZvLT5zdGFjay0+dHlwZSwgdSAtIGluZm8tPnN0YWNrLT50eXBlKTsKLSAgICAgIHN0cmNweSAobiArICh1IC0gaW5mby0+c3RhY2stPnR5cGUpLCBzKTsKLSAgICAgIHN0cmNhdCAobiwgdSArIDEpOwotCi0gICAgICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gICAgICBpbmZvLT5zdGFjay0+dHlwZSA9IG47Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoc3RyY2hyIChzLCAnfCcpICE9IE5VTEwKLSAgICAgICYmIChzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAneycpICE9IE5VTEwKLQkgIHx8IHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICcoJykgIT0gTlVMTCkpCi0gICAgewotICAgICAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAiKCIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiKSIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCpzID09ICdcMCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgIiAiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIHMpKTsKLX0KLQotLyogSW5kZW50IHRoZSB0eXBlIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGJ5IGFwcGVuZGluZyBzcGFjZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaW5kZW50X3R5cGUgKGluZm8pCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5pbmRlbnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQb3AgYSB0eXBlIGZyb20gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgY2hhciAqCi1wb3BfdHlwZSAoaW5mbykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IHByX3N0YWNrICpvOwotICBjaGFyICpyZXQ7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBvID0gaW5mby0+c3RhY2s7Ci0gIGluZm8tPnN0YWNrID0gby0+bmV4dDsKLSAgcmV0ID0gby0+dHlwZTsKLSAgZnJlZSAobyk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUHJpbnQgYSBWTUEgdmFsdWUgaW50byBhIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF92bWEgKHZtYSwgYnVmLCB1bnNpZ25lZHAsIGhleHApCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBjaGFyICpidWY7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGhleHA7Ci17Ci0gIGlmIChzaXplb2YgKHZtYSkgPD0gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKLSAgICB7Ci0gICAgICBpZiAoaGV4cCkKLQlzcHJpbnRmIChidWYsICIweCVseCIsICh1bnNpZ25lZCBsb25nKSB2bWEpOwotICAgICAgZWxzZSBpZiAodW5zaWduZWRwKQotCXNwcmludGYgKGJ1ZiwgIiVsdSIsICh1bnNpZ25lZCBsb25nKSB2bWEpOwotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZiwgIiVsZCIsIChsb25nKSB2bWEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1ZlswXSA9ICcwJzsKLSAgICAgIGJ1ZlsxXSA9ICd4JzsKLSAgICAgIHNwcmludGZfdm1hIChidWYgKyAyLCB2bWEpOwotICAgIH0KLX0KLQwKLS8qIFN0YXJ0IGEgbmV3IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCAocCwgZmlsZW5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5pbmRlbnQgPT0gMCk7Ci0KLSAgZnByaW50ZiAoaW5mby0+ZiwgIiVzOlxuIiwgZmlsZW5hbWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIHNvdXJjZSBmaWxlIHdpdGhpbiBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfc291cmNlIChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmluZGVudCA9PSAwKTsKLQotICBmcHJpbnRmIChpbmZvLT5mLCAiICVzOlxuIiwgZmlsZW5hbWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGFuIGVtcHR5IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9lbXB0eV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgIjx1bmRlZmluZWQ+Iik7Ci19Ci0KLS8qIFB1c2ggYSB2b2lkIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl92b2lkX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAidm9pZCIpOwotfQotCi0vKiBQdXNoIGFuIGludGVnZXIgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2ludF90eXBlIChwLCBzaXplLCB1bnNpZ25lZHApCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzEwXTsKLQotICBzcHJpbnRmIChhYiwgIiVzaW50JWQiLCB1bnNpZ25lZHAgPyAidSIgOiAiIiwgc2l6ZSAqIDgpOwotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCBhYik7Ci19Ci0KLS8qIFB1c2ggYSBmbG9hdGluZyB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZmxvYXRfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsxMF07Ci0KLSAgaWYgKHNpemUgPT0gNCkKLSAgICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAiZmxvYXQiKTsKLSAgZWxzZSBpZiAoc2l6ZSA9PSA4KQotICAgIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJkb3VibGUiKTsKLQotICBzcHJpbnRmIChhYiwgImZsb2F0JWQiLCBzaXplICogOCk7Ci0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKLX0KLQotLyogUHVzaCBhIGNvbXBsZXggdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NvbXBsZXhfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpZiAoISBwcl9mbG9hdF90eXBlIChwLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHByZXBlbmRfdHlwZSAoaW5mbywgImNvbXBsZXggIik7Ci19Ci0KLS8qIFB1c2ggYSBib29sZWFuIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9ib29sX3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMTBdOwotCi0gIHNwcmludGYgKGFiLCAiYm9vbCVkIiwgc2l6ZSAqIDgpOwotCi0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKLX0KLQotLyogUHVzaCBhbiBlbnVtIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9lbnVtX3R5cGUgKHAsIHRhZywgbmFtZXMsIHZhbHVlcykKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9zaWduZWRfdm1hIHZhbDsKLQotICBpZiAoISBwdXNoX3R5cGUgKGluZm8sICJlbnVtICIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0YWcpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAieyAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG5hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIvKiB1bmRlZmluZWQgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IG5hbWVzW2ldICE9IE5VTEw7IGkrKykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiwgIikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgbmFtZXNbaV0pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICh2YWx1ZXNbaV0gIT0gdmFsKQotCSAgICB7Ci0JICAgICAgY2hhciBhYlsyMF07Ci0KLQkgICAgICBwcmludF92bWEgKHZhbHVlc1tpXSwgYWIsIGZhbHNlLCBmYWxzZSk7Ci0JICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgPSAiKQotCQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHZhbCA9IHZhbHVlc1tpXTsKLQkgICAgfQotCi0JICArK3ZhbDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBhcHBlbmRfdHlwZSAoaW5mbywgIiB9Iik7Ci19Ci0KLS8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgcG9pbnRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9wb2ludGVyX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqczsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIHMgPSBzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAnfCcpOwotICBpZiAocyAhPSBOVUxMICYmIHNbMV0gPT0gJ1snKQotICAgIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIoKnwpIik7Ci0gIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIqfCIpOwotfQotCi0vKiBUdXJuIHRoZSB0b3AgdHlwZSBvbiB0aGUgc3RhY2sgaW50byBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGF0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZnVuY3Rpb25fdHlwZSAocCwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBpbnQgYXJnY291bnQ7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKiphcmdfdHlwZXM7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIGNoYXIgKnM7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBsZW4gPSAxMDsKLQotICBpZiAoYXJnY291bnQgPD0gMCkKLSAgICB7Ci0gICAgICBhcmdfdHlwZXMgPSBOVUxMOwotICAgICAgbGVuICs9IDE1OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBhcmdfdHlwZXMgPSAoY2hhciAqKikgeG1hbGxvYyAoYXJnY291bnQgKiBzaXplb2YgKmFyZ190eXBlcyk7Ci0gICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBhcmdfdHlwZXNbaV0gPSBwb3BfdHlwZSAoaW5mbyk7Ci0JICBpZiAoYXJnX3R5cGVzW2ldID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGxlbiArPSBzdHJsZW4gKGFyZ190eXBlc1tpXSkgKyAyOwotCX0KLSAgICAgIGlmICh2YXJhcmdzKQotCWxlbiArPSA1OwotICAgIH0KLQotICAvKiBOb3cgdGhlIHJldHVybiB0eXBlIGlzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQotICBzID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgc3RyY3B5IChzLCAiKHwpICgiKTsKLQotICBpZiAoYXJnY291bnQgPCAwKQotICAgIHN0cmNhdCAocywgIi8qIHVua25vd24gKi8iKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsIGFyZ190eXBlc1tpXSk7Ci0JfQotICAgICAgaWYgKHZhcmFyZ3MpCi0JewotCSAgaWYgKGkgPiAwKQotCSAgICBzdHJjYXQgKHMsICIsICIpOwotCSAgc3RyY2F0IChzLCAiLi4uIik7Ci0JfQotICAgICAgaWYgKGFyZ2NvdW50ID4gMCkKLQlmcmVlIChhcmdfdHlwZXMpOwotICAgIH0KLQotICBzdHJjYXQgKHMsICIpIik7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgcmVmZXJlbmNlIHRvIHRoYXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9yZWZlcmVuY2VfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiZ8Iik7Ci19Ci0KLS8qIE1ha2UgYSByYW5nZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3JhbmdlX3R5cGUgKHAsIGxvd2VyLCB1cHBlcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvd2VyOwotICAgICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJsWzIwXSwgYWJ1WzIwXTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwcmludF92bWEgKGxvd2VyLCBhYmwsIGZhbHNlLCBmYWxzZSk7Ci0gIHByaW50X3ZtYSAodXBwZXIsIGFidSwgZmFsc2UsIGZhbHNlKTsKLQotICByZXR1cm4gKHByZXBlbmRfdHlwZSAoaW5mbywgInJhbmdlICgiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICIpOiIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgYWJsKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICI6IikKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCBhYnUpKTsKLX0KLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHJfYXJyYXlfdHlwZSAocCwgbG93ZXIsIHVwcGVyLCBzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotICAgICBib29sZWFuIHN0cmluZ3A7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpyYW5nZV90eXBlOwotICBjaGFyIGFibFsyMF0sIGFidVsyMF0sIGFiWzUwXTsKLQotICByYW5nZV90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAocmFuZ2VfdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobG93ZXIgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAodXBwZXIgPT0gLTEpCi0Jc3ByaW50ZiAoYWIsICJ8W10iKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludF92bWEgKHVwcGVyICsgMSwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotCSAgc3ByaW50ZiAoYWIsICJ8WyVzXSIsIGFidSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50X3ZtYSAobG93ZXIsIGFibCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIHByaW50X3ZtYSAodXBwZXIsIGFidSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIHNwcmludGYgKGFiLCAifFslczolc10iLCBhYmwsIGFidSk7Ci0gICAgfQotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgYWIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc3RyY21wIChyYW5nZV90eXBlLCAiaW50IikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIjoiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgcmFuZ2VfdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc3RyaW5ncCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiBzdHJpbmcgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgc2V0IHR5cGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcl9zZXRfdHlwZSAocCwgYml0c3RyaW5ncCkKLSAgICAgUFRSIHA7Ci0gICAgIGJvb2xlYW4gYml0c3RyaW5ncDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInNldCB7ICIpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiIH0iKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJpdHN0cmluZ3ApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIvKiBiaXRzdHJpbmcgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGFuIG9mZnNldCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX29mZnNldF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiAoc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikKLQkgICYmIHByZXBlbmRfdHlwZSAoaW5mbywgIiAiKQotCSAgJiYgcHJlcGVuZF90eXBlIChpbmZvLCB0KQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICI6OnwiKSk7Ci19Ci0KLS8qIE1ha2UgYSBtZXRob2QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9tZXRob2RfdHlwZSAocCwgZG9tYWluLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGJvb2xlYW4gZG9tYWluOwotICAgICBpbnQgYXJnY291bnQ7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIGNoYXIgKmRvbWFpbl90eXBlOwotICBjaGFyICoqYXJnX3R5cGVzOwotICBjaGFyICpzOwotCi0gIGxlbiA9IDEwOwotCi0gIGlmICghIGRvbWFpbikKLSAgICBkb21haW5fdHlwZSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBkb21haW5fdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKLSAgICAgIGlmIChkb21haW5fdHlwZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChzdHJuY21wIChkb21haW5fdHlwZSwgImNsYXNzICIsIHNpemVvZiAiY2xhc3MgIiAtIDEpID09IDAKLQkgICYmIHN0cmNociAoZG9tYWluX3R5cGUgKyBzaXplb2YgImNsYXNzICIgLSAxLCAnICcpID09IE5VTEwpCi0JZG9tYWluX3R5cGUgKz0gc2l6ZW9mICJjbGFzcyAiIC0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGRvbWFpbl90eXBlLCAidW5pb24gY2xhc3MgIiwKLQkJCXNpemVvZiAidW5pb24gY2xhc3MgIikgPT0gMAotCSAgICAgICAmJiAoc3RyY2hyIChkb21haW5fdHlwZSArIHNpemVvZiAidW5pb24gY2xhc3MgIiAtIDEsICcgJykKLQkJICAgPT0gTlVMTCkpCi0JZG9tYWluX3R5cGUgKz0gc2l6ZW9mICJ1bmlvbiBjbGFzcyAiIC0gMTsKLSAgICAgIGxlbiArPSBzdHJsZW4gKGRvbWFpbl90eXBlKTsKLSAgICB9Ci0KLSAgaWYgKGFyZ2NvdW50IDw9IDApCi0gICAgewotICAgICAgYXJnX3R5cGVzID0gTlVMTDsKLSAgICAgIGxlbiArPSAxNTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgYXJnX3R5cGVzID0gKGNoYXIgKiopIHhtYWxsb2MgKGFyZ2NvdW50ICogc2l6ZW9mICphcmdfdHlwZXMpOwotICAgICAgZm9yIChpID0gYXJnY291bnQgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYXJnX3R5cGVzW2ldID0gcG9wX3R5cGUgKGluZm8pOwotCSAgaWYgKGFyZ190eXBlc1tpXSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBsZW4gKz0gc3RybGVuIChhcmdfdHlwZXNbaV0pICsgMjsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQlsZW4gKz0gNTsKLSAgICB9Ci0KLSAgLyogTm93IHRoZSByZXR1cm4gdHlwZSBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCi0KLSAgcyA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0gIGlmICghIGRvbWFpbikKLSAgICAqcyA9ICdcMCc7Ci0gIGVsc2UKLSAgICBzdHJjcHkgKHMsIGRvbWFpbl90eXBlKTsKLSAgc3RyY2F0IChzLCAiOjp8ICgiKTsKLQotICBpZiAoYXJnY291bnQgPCAwKQotICAgIHN0cmNhdCAocywgIi8qIHVua25vd24gKi8iKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsIGFyZ190eXBlc1tpXSk7Ci0JfQotICAgICAgaWYgKHZhcmFyZ3MpCi0JewotCSAgaWYgKGkgPiAwKQotCSAgICBzdHJjYXQgKHMsICIsICIpOwotCSAgc3RyY2F0IChzLCAiLi4uIik7Ci0JfQotICAgICAgaWYgKGFyZ2NvdW50ID4gMCkKLQlmcmVlIChhcmdfdHlwZXMpOwotICAgIH0KLQotICBzdHJjYXQgKHMsICIpIik7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jb25zdF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgImNvbnN0IHwiKTsKLX0KLQotLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3ZvbGF0aWxlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAidm9sYXRpbGUgfCIpOwotfQotCi0vKiBTdGFydCBhY2N1bXVsYXRpbmcgYSBzdHJ1Y3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9zdHJ1Y3RfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpbmZvLT5pbmRlbnQgKz0gMjsKLQotICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHN0cnVjdHAgPyAic3RydWN0ICIgOiAidW5pb24gIikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgaWRidWZbMjBdOwotCi0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiUlYW5vbiV1IiwgaWQpOwotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGlkYnVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHsiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzaXplICE9IDAgfHwgdGFnICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciBhYlszMF07Ci0KLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc2l6ZSAhPSAwKQotCXsKLQkgIHNwcmludGYgKGFiLCAiIHNpemUgJXUiLCBzaXplKTsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAodGFnICE9IE5VTEwpCi0JewotCSAgc3ByaW50ZiAoYWIsICIgaWQgJXUiLCBpZCk7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIlxuIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0KLSAgcmV0dXJuIGluZGVudF90eXBlIChpbmZvKTsKLX0KLQotLyogT3V0cHV0IHRoZSB2aXNpYmlsaXR5IG9mIGEgZmllbGQgaW4gYSBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBjb25zdCBjaGFyICpzID0gTlVMTDsKLSAgY2hhciAqdDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIGlmIChpbmZvLT5zdGFjay0+dmlzaWJpbGl0eSA9PSB2aXNpYmlsaXR5KQotICAgIHJldHVybiB0cnVlOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2stPnZpc2liaWxpdHkgIT0gREVCVUdfVklTSUJJTElUWV9JR05PUkUpOwotCi0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHMgPSAicHVibGljIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgcyA9ICJwcml2YXRlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICBzID0gInByb3RlY3RlZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOgotICAgICAgcyA9ICIvKiBpZ25vcmUgKi8iOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUcmltIG9mZiBhIHRyYWlsaW5nIHNwYWNlIGluIHRoZSBzdHJ1Y3Qgc3RyaW5nLCB0byBtYWtlIHRoZQotICAgICBvdXRwdXQgbG9vayBhIGJpdCBiZXR0ZXIsIHRoZW4gc3RpY2sgb24gdGhlIHZpc2liaWxpdHkgc3RyaW5nLiAgKi8KLQotICB0ID0gaW5mby0+c3RhY2stPnR5cGU7Ci0gIGxlbiA9IHN0cmxlbiAodCk7Ci0gIGFzc2VydCAodFtsZW4gLSAxXSA9PSAnICcpOwotICB0W2xlbiAtIDFdID0gJ1wwJzsKLQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgcykKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICI6XG4iKQotICAgICAgfHwgISBpbmRlbnRfdHlwZSAoaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgZmllbGQgdG8gYSBzdHJ1Y3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdHJ1Y3RfZmllbGQgKHAsIG5hbWUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBiZmRfdm1hIGJpdHNpemU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICI7IC8qICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYml0c2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X3ZtYSAoYml0c2l6ZSwgYWIsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiYml0c2l6ZSAiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiLCAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHByaW50X3ZtYSAoYml0cG9zLCBhYiwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgImJpdHBvcyAiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICovXG4iKQotICAgICAgfHwgISBpbmRlbnRfdHlwZSAoaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHByX2ZpeF92aXNpYmlsaXR5IChpbmZvLCB2aXNpYmlsaXR5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGFwcGVuZF90eXBlIChpbmZvLCB0KTsKLX0KLQotLyogRmluaXNoIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX3N0cnVjdF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnM7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpbmZvLT5pbmRlbnQgPj0gMik7Ci0KLSAgaW5mby0+aW5kZW50IC09IDI7Ci0KLSAgLyogQ2hhbmdlIHRoZSB0cmFpbGluZyBpbmRlbnRhdGlvbiB0byBoYXZlIGEgY2xvc2UgYnJhY2UuICAqLwotICBzID0gaW5mby0+c3RhY2stPnR5cGUgKyBzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSAtIDI7Ci0gIGFzc2VydCAoc1swXSA9PSAnICcgJiYgc1sxXSA9PSAnICcgJiYgc1syXSA9PSAnXDAnKTsKLQotICAqcysrID0gJ30nOwotICAqcyA9ICdcMCc7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgY2xhc3MgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9jbGFzc190eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplLCB2cHRyLCBvd252cHRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdnB0cjsKLSAgICAgYm9vbGVhbiBvd252cHRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdHYgPSBOVUxMOwotCi0gIGluZm8tPmluZGVudCArPSAyOwotCi0gIGlmICh2cHRyICYmICEgb3dudnB0cikKLSAgICB7Ci0gICAgICB0diA9IHBvcF90eXBlIChpbmZvKTsKLSAgICAgIGlmICh0diA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgcHVzaF90eXBlIChpbmZvLCBzdHJ1Y3RwID8gImNsYXNzICIgOiAidW5pb24gY2xhc3MgIikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgaWRidWZbMjBdOwotCi0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiUlYW5vbiV1IiwgaWQpOwotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGlkYnVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHsiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzaXplICE9IDAgfHwgdnB0ciB8fCBvd252cHRyIHx8IHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc2l6ZSAhPSAwKQotCXsKLQkgIGNoYXIgYWJbMjBdOwotCi0JICBzcHJpbnRmIChhYiwgIiV1Iiwgc2l6ZSk7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiBzaXplICIpCi0JICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAodnB0cikKLQl7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB2dGFibGUgIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChvd252cHRyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJzZWxmICIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0dikKLQkJICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICh0YWcgIT0gTlVMTCkKLQl7Ci0JICBjaGFyIGFiWzMwXTsKLQotCSAgc3ByaW50ZiAoYWIsICIgaWQgJXUiLCBpZCk7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0KLSAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgIlxuIikKLQkgICYmIGluZGVudF90eXBlIChpbmZvKSk7Ci19Ci0KLS8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19zdGF0aWNfbWVtYmVyIChwLCBuYW1lLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAic3RhdGljICIpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiOyAvKiAiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgcGh5c25hbWUpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICovXG4iKQotICAgICAgfHwgISBpbmRlbnRfdHlwZSAoaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHByX2ZpeF92aXNpYmlsaXR5IChpbmZvLCB2aXNpYmlsaXR5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGFwcGVuZF90eXBlIChpbmZvLCB0KTsKLX0KLQotLyogQWRkIGEgYmFzZSBjbGFzcyB0byBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX2Jhc2VjbGFzcyAocCwgYml0cG9zLCB2aXJ0dWFsLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJvb2xlYW4gdmlydHVhbDsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjb25zdCBjaGFyICpwcmVmaXg7Ci0gIGNoYXIgYWJbMjBdOwotICBjaGFyICpzLCAqbCwgKm47Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMICYmIGluZm8tPnN0YWNrLT5uZXh0ICE9IE5VTEwpOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc3RybmNtcCAodCwgImNsYXNzICIsIHNpemVvZiAiY2xhc3MgIiAtIDEpID09IDApCi0gICAgdCArPSBzaXplb2YgImNsYXNzICIgLSAxOwotCi0gIC8qIFB1c2ggaXQgYmFjayBvbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgcHJlcGVuZF90eXBlIGFuZAotICAgICBhcHBlbmRfdHlwZSByb3V0aW5lcy4gICovCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2aXJ0dWFsKQotICAgIHsKLSAgICAgIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInZpcnR1YWwgIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICBwcmVmaXggPSAicHVibGljICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgcHJlZml4ID0gInByb3RlY3RlZCAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6Ci0gICAgICBwcmVmaXggPSAicHJpdmF0ZSAiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByZWZpeCA9ICIvKiB1bmtub3duIHZpc2liaWxpdHkgKi8gIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sIHByZWZpeCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiaXRwb3MgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF92bWEgKGJpdHBvcywgYWIsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIGJpdHBvcyAiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICovIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBOb3cgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgc29tZXRoaW5nIGxpa2UgInB1YmxpYyBBIC8gKiBiaXRwb3MKLSAgICAgMTAgKiAvIi4gIFRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIHN0YWNrIGlzIHNvbWV0aGluZyBsaWtlICJjbGFzcwotICAgICB4eCB7IC8gKiBzaXplIDggKiAvXG4uLi4iLiAgV2Ugd2FudCB0byBzdWJzdGl0dXRlIHRoZSB0b3Agb2YgdGhlCi0gICAgIHN0YWNrIGluIGJlZm9yZSB0aGUgey4gICovCi0gIHMgPSBzdHJjaHIgKGluZm8tPnN0YWNrLT5uZXh0LT50eXBlLCAneycpOwotICBhc3NlcnQgKHMgIT0gTlVMTCk7Ci0gIC0tczsKLQotICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgJzonLCB0aGVuIHdlIGFscmVhZHkgaGF2ZSBhIGJhc2VjbGFzcywgYW5kCi0gICAgIHdlIG11c3QgYXBwZW5kIHRoaXMgb25lIGFmdGVyIGEgY29tbWEuICAqLwotICBmb3IgKGwgPSBpbmZvLT5zdGFjay0+bmV4dC0+dHlwZTsgbCAhPSBzOyBsKyspCi0gICAgaWYgKCpsID09ICc6JykKLSAgICAgIGJyZWFrOwotICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sIGwgPT0gcyA/ICIgOiAiIDogIiwgIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSArIHN0cmxlbiAodCkgKyAxKTsKLSAgbWVtY3B5IChuLCBpbmZvLT5zdGFjay0+dHlwZSwgcyAtIGluZm8tPnN0YWNrLT50eXBlKTsKLSAgc3RyY3B5IChuICsgKHMgLSBpbmZvLT5zdGFjay0+dHlwZSksIHQpOwotICBzdHJjYXQgKG4sIHMpOwotCi0gIGZyZWUgKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgaW5mby0+c3RhY2stPnR5cGUgPSBuOwotCi0gIGZyZWUgKHQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhZGRpbmcgYSBtZXRob2QgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19zdGFydF9tZXRob2QgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotICBpbmZvLT5zdGFjay0+bWV0aG9kID0gbmFtZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHZhcmlhbnQgdG8gYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQgKHAsIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBjb25zdHAsIHZvbGF0aWxlcCwgdm9mZnNldCwKLQkJCSBjb250ZXh0KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgYm9vbGVhbiBjb250ZXh0OwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqbWV0aG9kX3R5cGU7Ci0gIGNoYXIgKmNvbnRleHRfdHlwZTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotICBhc3NlcnQgKGluZm8tPnN0YWNrLT5uZXh0ICE9IE5VTEwpOwotCi0gIC8qIFB1dCB0aGUgY29uc3QgYW5kIHZvbGF0aWxlIHF1YWxpZmllcnMgb24gdGhlIHR5cGUuICAqLwotICBpZiAodm9sYXRpbGVwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHZvbGF0aWxlIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKGNvbnN0cCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiBjb25zdCIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU3RpY2sgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpbnRvIGl0cyB0eXBlLiAgKi8KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLAotCQkJIChjb250ZXh0Ci0JCQkgID8gaW5mby0+c3RhY2stPm5leHQtPm5leHQtPm1ldGhvZAotCQkJICA6IGluZm8tPnN0YWNrLT5uZXh0LT5tZXRob2QpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2V0IHRoZSB0eXBlLiAgKi8KLSAgbWV0aG9kX3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmIChtZXRob2RfdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQdWxsIG9mZiB0aGUgY29udGV4dCB0eXBlIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmICghIGNvbnRleHQpCi0gICAgY29udGV4dF90eXBlID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRleHRfdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKLSAgICAgIGlmIChjb250ZXh0X3R5cGUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyB0aGUgY2xhc3MuICAqLwotCi0gIGlmICghIHByX2ZpeF92aXNpYmlsaXR5IChpbmZvLCB2aXNpYmlsaXR5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIG1ldGhvZF90eXBlKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiAiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgcGh5c25hbWUpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGNvbnRleHQgfHwgdm9mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgYWJbMjBdOwotCi0gICAgICBpZiAoY29udGV4dCkKLQl7Ci0JICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgImNvbnRleHQgIikKLQkgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBjb250ZXh0X3R5cGUpCi0JICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHByaW50X3ZtYSAodm9mZnNldCwgYWIsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAidm9mZnNldCAiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgIiAqLztcbiIpCi0JICAmJiBpbmRlbnRfdHlwZSAoaW5mbykpOwotfQotCi0vKiBBZGQgYSBzdGF0aWMgdmFyaWFudCB0byBhIG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgKHAsIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBjb25zdHAsIHZvbGF0aWxlcCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqbWV0aG9kX3R5cGU7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpbmZvLT5zdGFjay0+bmV4dCAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpbmZvLT5zdGFjay0+bmV4dC0+bWV0aG9kICE9IE5VTEwpOwotCi0gIC8qIFB1dCB0aGUgY29uc3QgYW5kIHZvbGF0aWxlIHF1YWxpZmllcnMgb24gdGhlIHR5cGUuICAqLwotICBpZiAodm9sYXRpbGVwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHZvbGF0aWxlIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKGNvbnN0cCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiBjb25zdCIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTWFyayBpdCBhcyBzdGF0aWMuICAqLwotICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICJzdGF0aWMgIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN0aWNrIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW50byBpdHMgdHlwZS4gICovCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgaW5mby0+c3RhY2stPm5leHQtPm1ldGhvZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCB0aGUgdHlwZS4gICovCi0gIG1ldGhvZF90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAobWV0aG9kX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIHRoZSBjbGFzcy4gICovCi0KLSAgaWYgKCEgcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCBtZXRob2RfdHlwZSkKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qICIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgcGh5c25hbWUpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLztcbiIpCi0JICAmJiBpbmRlbnRfdHlwZSAoaW5mbykpOwotfQotCi0vKiBGaW5pc2ggdXAgYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3NfZW5kX21ldGhvZCAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZm8tPnN0YWNrLT5tZXRob2QgPSBOVUxMOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2NsYXNzX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICByZXR1cm4gcHJfZW5kX3N0cnVjdF90eXBlIChwKTsKLX0KLQotLyogUHVzaCBhIHR5cGUgb24gdGhlIHN0YWNrIHVzaW5nIGEgdHlwZWRlZiBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3R5cGVkZWZfdHlwZSAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIG5hbWUpOwotfQotCi0vKiBQdXNoIGEgdHlwZSBvbiB0aGUgc3RhY2sgdXNpbmcgYSB0YWcgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90YWdfdHlwZSAocCwgbmFtZSwgaWQsIGtpbmQpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjb25zdCBjaGFyICp0LCAqdGFnOwotICBjaGFyIGlkYnVmWzIwXTsKLQotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6Ci0gICAgICB0ID0gInN0cnVjdCAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgotICAgICAgdCA9ICJ1bmlvbiAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19LSU5EX0VOVU06Ci0gICAgICB0ID0gImVudW0gIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKLSAgICAgIHQgPSAiY2xhc3MgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIHQgPSAidW5pb24gY2xhc3MgIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgcHVzaF90eXBlIChpbmZvLCB0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChuYW1lICE9IE5VTEwpCi0gICAgdGFnID0gbmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNwcmludGYgKGlkYnVmLCAiJSVhbm9uJXUiLCBpZCk7Ci0gICAgICB0YWcgPSBpZGJ1ZjsKLSAgICB9Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobmFtZSAhPSBOVUxMICYmIGtpbmQgIT0gREVCVUdfS0lORF9FTlVNKQotICAgIHsKLSAgICAgIHNwcmludGYgKGlkYnVmLCAiIC8qIGlkICV1ICovIiwgaWQpOwotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGlkYnVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0eXBlZGVmLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3R5cGRlZiAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpzOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmIChzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJ0eXBlZGVmICVzO1xuIiwgcyk7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHRhZy4gIFRoZSB0YWcgc2hvdWxkIGFscmVhZHkgYmUgaW4gdGhlIHN0cmluZyBvbiB0aGUKLSAgIHN0YWNrLCBzbyBhbGwgd2UgaGF2ZSB0byBkbyBoZXJlIGlzIHByaW50IGl0IG91dC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXByX3RhZyAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgIiVzO1xuIiwgdCk7Ci0KLSAgZnJlZSAodCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2ludF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzIwXTsKLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKHZhbCwgYWIsIGZhbHNlLCBmYWxzZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCBpbnQgJXMgPSAlcztcbiIsIG5hbWUsIGFiKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Zsb2F0X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkb3VibGUgdmFsOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpbmRlbnQgKGluZm8pOwotICBmcHJpbnRmIChpbmZvLT5mLCAiY29uc3QgZG91YmxlICVzID0gJWc7XG4iLCBuYW1lLCB2YWwpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdHlwZWQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdHlwZWRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hICh2YWwsIGFiLCBmYWxzZSwgZmFsc2UpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiY29uc3QgJXMgJXMgPSAlcztcbiIsIHQsIG5hbWUsIGFiKTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdmFyaWFibGUgKHAsIG5hbWUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfU1RBVElDOgotICAgIGNhc2UgREVCVUdfTE9DQUxfU1RBVElDOgotICAgICAgZnByaW50ZiAoaW5mby0+ZiwgInN0YXRpYyAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfUkVHSVNURVI6Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAicmVnaXN0ZXIgIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICBwcmludF92bWEgKHZhbCwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgLyogJXMgKi87XG4iLCB0LCBhYik7Ci0KLSAgZnJlZSAodCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IG91dHB1dHRpbmcgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9mdW5jdGlvbiAocCwgbmFtZSwgZ2xvYmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBnbG9iYWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIGlmICghIGdsb2JhbCkKLSAgICBmcHJpbnRmIChpbmZvLT5mLCAic3RhdGljICIpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgKCIsIHQpOwotCi0gIGluZm8tPnBhcmFtZXRlciA9IDE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mdW5jdGlvbl9wYXJhbWV0ZXIgKHAsIG5hbWUsIGtpbmQsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaWYgKGtpbmQgPT0gREVCVUdfUEFSTV9SRUZFUkVOQ0UKLSAgICAgIHx8IGtpbmQgPT0gREVCVUdfUEFSTV9SRUZfUkVHKQotICAgIHsKLSAgICAgIGlmICghIHByX3JlZmVyZW5jZV90eXBlIChwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5wYXJhbWV0ZXIgIT0gMSkKLSAgICBmcHJpbnRmIChpbmZvLT5mLCAiLCAiKTsKLQotICBpZiAoa2luZCA9PSBERUJVR19QQVJNX1JFRyB8fCBraW5kID09IERFQlVHX1BBUk1fUkVGX1JFRykKLSAgICBmcHJpbnRmIChpbmZvLT5mLCAicmVnaXN0ZXIgIik7Ci0KLSAgcHJpbnRfdm1hICh2YWwsIGFiLCB0cnVlLCB0cnVlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgIiVzIC8qICVzICovIiwgdCwgYWIpOwotCi0gIGZyZWUgKHQpOwotCi0gICsraW5mby0+cGFyYW1ldGVyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCB3cml0aW5nIG91dCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaWYgKGluZm8tPnBhcmFtZXRlciA+IDApCi0gICAgewotICAgICAgZnByaW50ZiAoaW5mby0+ZiwgIilcbiIpOwotICAgICAgaW5mby0+cGFyYW1ldGVyID0gMDsKLSAgICB9Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJ7IC8qICVzICovXG4iLCBhYik7Ci0KLSAgaW5mby0+aW5kZW50ICs9IDI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9saW5lbm8gKHAsIGZpbGVuYW1lLCBsaW5lbm8sIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgdW5zaWduZWQgbG9uZyBsaW5lbm87Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHByaW50X3ZtYSAoYWRkciwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiLyogZmlsZSAlcyBsaW5lICVsdSBhZGRyICVzICovXG4iLCBmaWxlbmFtZSwgbGluZW5vLCBhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9ibG9jayAocCwgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGluZm8tPmluZGVudCAtPSAyOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHByaW50X3ZtYSAoYWRkciwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAifSAvKiAlcyAqL1xuIiwgYWIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggd3JpdGluZyBvdXQgYSBmdW5jdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9mdW5jdGlvbiAocCkKLSAgICAgUFRSIHAgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuMSBiL2JpbnV0aWxzL3JhbmxpYi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZiNWM4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JhbmxpYi4xCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHJhbmxpYiAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1yYW5saWIgXC0gZ2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZS4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uQiByYW5saWIgXGMKLS5SQiAiW1x8IiBcLXYgfCBcLVYgIlx8XSIKLS5JIGFyY2hpdmVcYwotXCYKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi0uQiByYW5saWIKLWdlbmVyYXRlcyBhbiBpbmRleCB0byB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSwgYW5kCi1zdG9yZXMgaXQgaW4gdGhlIGFyY2hpdmUuICBUaGUgaW5kZXggbGlzdHMgZWFjaCBzeW1ib2wgZGVmaW5lZCBieSBhCi1tZW1iZXIgb2YgYW4gYXJjaGl2ZSB0aGF0IGlzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAKLS5QUAotWW91IG1heSB1c2UKLS5SQiBgICJubSBcLXMiICcKLW9yCi0uUkIgYCAibm0gXC1cLXByaW50LWFybWFwIiAnCi10byBsaXN0IHRoaXMgaW5kZXguCi0uUFAKLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLS5QUAotVGhlIEdOVQotLkIgcmFubGliCi1wcm9ncmFtIGlzIGFub3RoZXIgZm9ybSBvZiBHTlUKLS5CUiBhciA7Ci1ydW5uaW5nCi0uQiByYW5saWIKLWlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0byBleGVjdXRpbmcKLS5SQiBgICJhciBcLXMiICcuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtdgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiByYW5saWIKLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgYXIgIigiIDEgIiksIgotLkJSIG5tICIoIiAxICIpLiIKLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuc2ggYi9iaW51dGlscy9yYW5saWIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiNmZiYzQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmFubGliLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQSBzaW1wbGUgcmFubGliIHNjcmlwdCwgdG8gdXNlIGxlc3MgZGlzayBzcGFjZSB0aGFuIGEgcmFubGliIHByb2dyYW0uCi1hciBzICQxCmRpZmYgLS1naXQgYS9iaW51dGlscy9yY2xleC5sIGIvYmludXRpbHMvcmNsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiNDc5Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yY2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLSV7IC8qIHJjbGV4LmwgLS0gbGV4ZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMgcGFyc2VyICAqLwotLyogQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgbGV4IGlucHV0IGZpbGUgd2hpY2ggZ2VuZXJhdGVzIGEgbGV4ZXIgdXNlZCBieSB0aGUKLSAgIFdpbmRvd3MgcmMgZmlsZSBwYXJzZXIuICBJdCBiYXNpY2FsbHkganVzdCByZWNvZ25pemVkIGEgYnVuY2ggb2YKLSAgIGtleXdvcmRzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLSNpbmNsdWRlICJyY3BhcnNlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiByY2RhdGEgbW9kZSwgaW4gd2hpY2ggd2UgcmV0dXJucyB0aGUgbGVuZ3RocyBvZgotICAgc3RyaW5ncy4gICovCi0KLXN0YXRpYyBpbnQgcmNkYXRhX21vZGU7Ci0KLS8qIFdoZXRoZXIgd2UgYXJlIHN1cHJlc3NpbmcgbGluZXMgZnJvbSBjcHAgKGluY2x1ZGluZyB3aW5kb3dzLmggb3IKLSAgIGhlYWRlcnMgZnJvbSB5b3VyIEMgc291cmNlcyBtYXkgYnJpbmcgaW4gZXh0ZXJucyBhbmQgdHlwZWRlZnMpLgotICAgV2hlbiBhY3RpdmUsIHdlIHJldHVybiBJR05PUkVEX1RPS0VOLCB3aGljaCBsZXRzIHVzIGlnbm9yZSB0aGVzZQotICAgb3V0c2lkZSBvZiByZXNvdXJjZSBjb25zdHJ1Y3RzLiAgVGh1cywgaXQgaXNuJ3QgcmVxdWlyZWQgdG8gcHJvdGVjdAotICAgYWxsIHRoZSBub24tcHJlcHJvY2Vzc29yIGxpbmVzIGluIHlvdXIgaGVhZGVyIGZpbGVzIHdpdGggI2lmZGVmCi0gICBSQ19JTlZPS0VELiAgSXQgYWxzbyBtZWFucyB5b3VyIFJDIGZpbGUgY2FuJ3QgaW5jbHVkZSBvdGhlciBSQwotICAgZmlsZXMgaWYgdGhleSdyZSBuYW1lZCAiKi5oIi4gIFNvcnJ5LiAgTmFtZSB0aGVtICoucmNoIG9yIHdoYXRldmVyLiAgKi8KLQotc3RhdGljIGludCBzdXBwcmVzc19jcHBfZGF0YTsKLQotI2RlZmluZSBNQVlCRV9SRVRVUk4oeCkgcmV0dXJuIHN1cHByZXNzX2NwcF9kYXRhID8gSUdOT1JFRF9UT0tFTiA6ICh4KQotCi0vKiBUaGUgZmlyc3QgZmlsZW5hbWUgd2UgZGV0ZWN0IGluIHRoZSBjcHAgb3V0cHV0LiAgV2UgdXNlIHRoaXMgdG8KLSAgIHRlbGwgaW5jbHVkZWQgZmlsZXMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZS4gICovCi0KLXN0YXRpYyBjaGFyICppbml0aWFsX2ZuOwotCi0vKiBMaXN0IG9mIGFsbG9jYXRlZCBzdHJpbmdzLiAgKi8KLQotc3RydWN0IGFsbG9jX3N0cmluZwotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICpuZXh0OwotICBjaGFyICpzOwotfTsKLQotc3RhdGljIHN0cnVjdCBhbGxvY19zdHJpbmcgKnN0cmluZ3M7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGNwcF9saW5lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGNoYXIgKmhhbmRsZV9xdW90ZXMgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBjaGFyICpnZXRfc3RyaW5nIFBBUkFNUyAoKGludCkpOwotCi0lfQotCi0lJQotCi0iQkVHSU4iCQkJeyBNQVlCRV9SRVRVUk4gKEJFRyk7IH0KLSJ7IgkJCXsgTUFZQkVfUkVUVVJOIChCRUcpOyB9Ci0iRU5EIgkJCXsgTUFZQkVfUkVUVVJOIChFTkQpOyB9Ci0ifSIJCQl7IE1BWUJFX1JFVFVSTiAoRU5EKTsgfQotIkFDQ0VMRVJBVE9SUyIJCXsgTUFZQkVfUkVUVVJOIChBQ0NFTEVSQVRPUlMpOyB9Ci0iVklSVEtFWSIJCXsgTUFZQkVfUkVUVVJOIChWSVJUS0VZKTsgfQotIkFTQ0lJIgkJCXsgTUFZQkVfUkVUVVJOIChBU0NJSSk7IH0KLSJOT0lOVkVSVCIJCXsgTUFZQkVfUkVUVVJOIChOT0lOVkVSVCk7IH0KLSJTSElGVCIJCQl7IE1BWUJFX1JFVFVSTiAoU0hJRlQpOyB9Ci0iQ09OVFJPTCIJCXsgTUFZQkVfUkVUVVJOIChDT05UUk9MKTsgfQotIkFMVCIJCQl7IE1BWUJFX1JFVFVSTiAoQUxUKTsgfQotIkJJVE1BUCIJCXsgTUFZQkVfUkVUVVJOIChCSVRNQVApOyB9Ci0iQ1VSU09SIgkJeyBNQVlCRV9SRVRVUk4gKENVUlNPUik7IH0KLSJESUFMT0ciCQl7IE1BWUJFX1JFVFVSTiAoRElBTE9HKTsgfQotIkRJQUxPR0VYIgkJeyBNQVlCRV9SRVRVUk4gKERJQUxPR0VYKTsgfQotIkVYU1RZTEUiCQl7IE1BWUJFX1JFVFVSTiAoRVhTVFlMRSk7IH0KLSJDQVBUSU9OIgkJeyBNQVlCRV9SRVRVUk4gKENBUFRJT04pOyB9Ci0iQ0xBU1MiCQkJeyBNQVlCRV9SRVRVUk4gKENMQVNTKTsgfQotIlNUWUxFIgkJCXsgTUFZQkVfUkVUVVJOIChTVFlMRSk7IH0KLSJBVVRPM1NUQVRFIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE8zU1RBVEUpOyB9Ci0iQVVUT0NIRUNLQk9YIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE9DSEVDS0JPWCk7IH0KLSJBVVRPUkFESU9CVVRUT04iCXsgTUFZQkVfUkVUVVJOIChBVVRPUkFESU9CVVRUT04pOyB9Ci0iQ0hFQ0tCT1giCQl7IE1BWUJFX1JFVFVSTiAoQ0hFQ0tCT1gpOyB9Ci0iQ09NQk9CT1giCQl7IE1BWUJFX1JFVFVSTiAoQ09NQk9CT1gpOyB9Ci0iQ1RFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKENURVhUKTsgfQotIkRFRlBVU0hCVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoREVGUFVTSEJVVFRPTik7IH0KLSJFRElUVEVYVCIJCXsgTUFZQkVfUkVUVVJOIChFRElUVEVYVCk7IH0KLSJHUk9VUEJPWCIJCXsgTUFZQkVfUkVUVVJOIChHUk9VUEJPWCk7IH0KLSJMSVNUQk9YIgkJeyBNQVlCRV9SRVRVUk4gKExJU1RCT1gpOyB9Ci0iTFRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKExURVhUKTsgfQotIlBVU0hCT1giCQl7IE1BWUJFX1JFVFVSTiAoUFVTSEJPWCk7IH0KLSJQVVNIQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFBVU0hCVVRUT04pOyB9Ci0iUkFESU9CVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoUkFESU9CVVRUT04pOyB9Ci0iUlRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKFJURVhUKTsgfQotIlNDUk9MTEJBUiIJCXsgTUFZQkVfUkVUVVJOIChTQ1JPTExCQVIpOyB9Ci0iU1RBVEUzIgkJeyBNQVlCRV9SRVRVUk4gKFNUQVRFMyk7IH0KLSJVU0VSQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFVTRVJCVVRUT04pOyB9Ci0iQkVESVQiCQkJeyBNQVlCRV9SRVRVUk4gKEJFRElUKTsgfQotIkhFRElUIgkJCXsgTUFZQkVfUkVUVVJOIChIRURJVCk7IH0KLSJJRURJVCIJCQl7IE1BWUJFX1JFVFVSTiAoSUVESVQpOyB9Ci0iRk9OVCIJCQl7IE1BWUJFX1JFVFVSTiAoRk9OVCk7IH0KLSJJQ09OIgkJCXsgTUFZQkVfUkVUVVJOIChJQ09OKTsgfQotIkxBTkdVQUdFIgkJeyBNQVlCRV9SRVRVUk4gKExBTkdVQUdFKTsgfQotIkNIQVJBQ1RFUklTVElDUyIJeyBNQVlCRV9SRVRVUk4gKENIQVJBQ1RFUklTVElDUyk7IH0KLSJWRVJTSU9OIgkJeyBNQVlCRV9SRVRVUk4gKFZFUlNJT05LKTsgfQotIk1FTlUiCQkJeyBNQVlCRV9SRVRVUk4gKE1FTlUpOyB9Ci0iTUVOVUVYIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVFWCk7IH0KLSJNRU5VSVRFTSIJCXsgTUFZQkVfUkVUVVJOIChNRU5VSVRFTSk7IH0KLSJTRVBBUkFUT1IiCQl7IE1BWUJFX1JFVFVSTiAoU0VQQVJBVE9SKTsgfQotIlBPUFVQIgkJCXsgTUFZQkVfUkVUVVJOIChQT1BVUCk7IH0KLSJDSEVDS0VEIgkJeyBNQVlCRV9SRVRVUk4gKENIRUNLRUQpOyB9Ci0iR1JBWUVEIgkJeyBNQVlCRV9SRVRVUk4gKEdSQVlFRCk7IH0KLSJIRUxQIgkJCXsgTUFZQkVfUkVUVVJOIChIRUxQKTsgfQotIklOQUNUSVZFIgkJeyBNQVlCRV9SRVRVUk4gKElOQUNUSVZFKTsgfQotIk1FTlVCQVJCUkVBSyIJCXsgTUFZQkVfUkVUVVJOIChNRU5VQkFSQlJFQUspOyB9Ci0iTUVOVUJSRUFLIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVCUkVBSyk7IH0KLSJNRVNTQUdFVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoTUVTU0FHRVRBQkxFKTsgfQotIlJDREFUQSIJCXsgTUFZQkVfUkVUVVJOIChSQ0RBVEEpOyB9Ci0iU1RSSU5HVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoU1RSSU5HVEFCTEUpOyB9Ci0iVkVSU0lPTklORk8iCQl7IE1BWUJFX1JFVFVSTiAoVkVSU0lPTklORk8pOyB9Ci0iRklMRVZFUlNJT04iCQl7IE1BWUJFX1JFVFVSTiAoRklMRVZFUlNJT04pOyB9Ci0iUFJPRFVDVFZFUlNJT04iCXsgTUFZQkVfUkVUVVJOIChQUk9EVUNUVkVSU0lPTik7IH0KLSJGSUxFRkxBR1NNQVNLIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHU01BU0spOyB9Ci0iRklMRUZMQUdTIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHUyk7IH0KLSJGSUxFT1MiCQl7IE1BWUJFX1JFVFVSTiAoRklMRU9TKTsgfQotIkZJTEVUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVUWVBFKTsgfQotIkZJTEVTVUJUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVTVUJUWVBFKTsgfQotIlZBTFVFIgkJCXsgTUFZQkVfUkVUVVJOIChWQUxVRSk7IH0KLSJNT1ZFQUJMRSIJCXsgTUFZQkVfUkVUVVJOIChNT1ZFQUJMRSk7IH0KLSJGSVhFRCIJCQl7IE1BWUJFX1JFVFVSTiAoRklYRUQpOyB9Ci0iUFVSRSIJCQl7IE1BWUJFX1JFVFVSTiAoUFVSRSk7IH0KLSJJTVBVUkUiCQl7IE1BWUJFX1JFVFVSTiAoSU1QVVJFKTsgfQotIlBSRUxPQUQiCQl7IE1BWUJFX1JFVFVSTiAoUFJFTE9BRCk7IH0KLSJMT0FET05DQUxMIgkJeyBNQVlCRV9SRVRVUk4gKExPQURPTkNBTEwpOyB9Ci0iRElTQ0FSREFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoRElTQ0FSREFCTEUpOyB9Ci0iTk9UIgkJCXsgTUFZQkVfUkVUVVJOIChOT1QpOyB9Ci0KLSJCTE9DSyJbIFx0XG5dKiJcIiJbXlwjXG5dKiJcIiIgewotCQkJICBjaGFyICpzLCAqc2VuZDsKLQotCQkJICAvKiBUaGlzIGlzIGEgaGFjayB0byBsZXQgdXMgcGFyc2UgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBlYXNpbHkuICAqLwotCi0JCQkgIHMgPSBzdHJjaHIgKHl5dGV4dCwgJyInKTsKLQkJCSAgKytzOwotCQkJICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotCQkJICBpZiAoc3RybmNtcCAocywgIlN0cmluZ0ZpbGVJbmZvIiwKLQkJCQkgICAgICAgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxKSA9PSAwCi0JCQkgICAgICAmJiBzICsgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxID09IHNlbmQpCi0JCQkgICAgTUFZQkVfUkVUVVJOIChCTE9DS1NUUklOR0ZJTEVJTkZPKTsKLQkJCSAgZWxzZSBpZiAoc3RybmNtcCAocywgIlZhckZpbGVJbmZvIiwKLQkJCQkJICAgIHNpemVvZiAiVmFyRmlsZUluZm8iIC0gMSkgPT0gMAotCQkJCSAgICYmIHMgKyBzaXplb2YgIlZhckZpbGVJbmZvIiAtIDEgPT0gc2VuZCkKLQkJCSAgICBNQVlCRV9SRVRVUk4gKEJMT0NLVkFSRklMRUlORk8pOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgY2hhciAqcjsKLQotCQkJICAgICAgciA9IGdldF9zdHJpbmcgKHNlbmQgLSBzICsgMSk7Ci0JCQkgICAgICBzdHJuY3B5IChyLCBzLCBzZW5kIC0gcyk7Ci0JCQkgICAgICByW3NlbmQgLSBzXSA9ICdcMCc7Ci0JCQkgICAgICB5eWx2YWwucyA9IHI7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKEJMT0NLKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLSIjIlteXG5dKgkJewotCQkJICBjcHBfbGluZSAoeXl0ZXh0KTsKLQkJCX0KLQotWzAtOV1beDAtOUEtRmEtZl0qTAl7Ci0JCQkgIHl5bHZhbC5pLnZhbCA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7Ci0JCQkgIHl5bHZhbC5pLmR3b3JkID0gMTsKLQkJCSAgTUFZQkVfUkVUVVJOIChOVU1CRVIpOwotCQkJfQotCi1bMC05XVt4MC05QS1GYS1mXSoJewotCQkJICB5eWx2YWwuaS52YWwgPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotCQkJICB5eWx2YWwuaS5kd29yZCA9IDA7Ci0JCQkgIE1BWUJFX1JFVFVSTiAoTlVNQkVSKTsKLQkJCX0KLQotKCJcIiJbXlwiXG5dKiJcIiJbIFx0XSopKyB7Ci0JCQkgIGNoYXIgKnM7Ci0JCQkgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotCi0JCQkgIHMgPSBoYW5kbGVfcXVvdGVzICh5eXRleHQsICZsZW5ndGgpOwotCQkJICBpZiAoISByY2RhdGFfbW9kZSkKLQkJCSAgICB7Ci0JCQkgICAgICB5eWx2YWwucyA9IHM7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKFFVT1RFRFNUUklORyk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgeXlsdmFsLnNzLmxlbmd0aCA9IGxlbmd0aDsKLQkJCSAgICAgIHl5bHZhbC5zcy5zID0gczsKLQkJCSAgICAgIE1BWUJFX1JFVFVSTiAoU0laRURTVFJJTkcpOwotCQkJICAgIH0KLQkJCX0KLQotW0EtWmEtel1bXiAsXHRcclxuXSoJewotCQkJICBjaGFyICpzOwotCi0JCQkgIC8qIEkgcmVqZWN0ZWQgY29tbWEgaW4gYSBzdHJpbmcgaW4gb3JkZXIgdG8KLQkJCSAgICAgaGFuZGxlIFZJUlRLRVksIENPTlRST0wgaW4gYW4gYWNjZWxlcmF0b3IKLQkJCSAgICAgcmVzb3VyY2UuICBUaGlzIG1lYW5zIHRoYXQgYW4gdW5xdW90ZWQKLQkJCSAgICAgZmlsZSBuYW1lIGNhbiBub3QgY29udGFpbiBhIGNvbW1hLiAgSQotCQkJICAgICBkb24ndCBrbm93IHdoYXQgcmMgcGVybWl0cy4gICovCi0KLQkJCSAgcyA9IGdldF9zdHJpbmcgKHN0cmxlbiAoeXl0ZXh0KSArIDEpOwotCQkJICBzdHJjcHkgKHMsIHl5dGV4dCk7Ci0JCQkgIHl5bHZhbC5zID0gczsKLQkJCSAgTUFZQkVfUkVUVVJOIChTVFJJTkcpOwotCQkJfQotCi1bXG5dCQkJeyArK3JjX2xpbmVubzsgfQotWyBcdFxyXSsJCXsgLyogaWdub3JlIHdoaXRlc3BhY2UgKi8gfQotLgkJCXsgTUFZQkVfUkVUVVJOICgqeXl0ZXh0KTsgfQotCi0lJQotI2lmbmRlZiB5eXdyYXAKLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBzb21lIHZlcnNpb25zIG9mIGxleC4gICovCi1pbnQgeXl3cmFwICgpCi17Ci0gIHJldHVybiAxOwotfQotI2VuZGlmCi0KLS8qIEhhbmRsZSBhIEMgcHJlcHJvY2Vzc29yIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotY3BwX2xpbmUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGludCBsaW5lOwotICBjaGFyICpzZW5kLCAqZm47Ci0KLSAgKytzOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0gIAotICBsaW5lID0gc3RydG9sIChzLCAmc2VuZCwgMCk7Ci0gIGlmICgqc2VuZCAhPSAnXDAnICYmICEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZW5kKSkKLSAgICByZXR1cm47Ci0KLSAgLyogU3VidHJhY3QgMSBiZWNhdXNlIHdlIGFyZSBhYm91dCB0byBjb3VudCB0aGUgbmV3bGluZS4gICovCi0gIHJjX2xpbmVubyA9IGxpbmUgLSAxOwotCi0gIHMgPSBzZW5kOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0KLSAgaWYgKCpzICE9ICciJykKLSAgICByZXR1cm47Ci0KLSAgKytzOwotICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotICBpZiAoc2VuZCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmbiA9IChjaGFyICopIHhtYWxsb2MgKHNlbmQgLSBzICsgMSk7Ci0gIHN0cm5jcHkgKGZuLCBzLCBzZW5kIC0gcyk7Ci0gIGZuW3NlbmQgLSBzXSA9ICdcMCc7Ci0KLSAgZnJlZSAocmNfZmlsZW5hbWUpOwotICByY19maWxlbmFtZSA9IGZuOwotCi0gIGlmICghaW5pdGlhbF9mbikKLSAgICB7Ci0gICAgICBpbml0aWFsX2ZuID0geG1hbGxvYyAoc3RybGVuIChmbikgKyAxKTsKLSAgICAgIHN0cmNweShpbml0aWFsX2ZuLCBmbik7Ci0gICAgfQotCi0gIC8qIEFsbG93IHRoZSBpbml0aWFsIGZpbGUsIHJlZ2FyZGxlc3Mgb2YgbmFtZS4gIFN1cHByZXNzIGFsbCBvdGhlcgotICAgICBmaWxlcyBpZiB0aGV5IGVuZCBpbiAiLmgiICh0aGlzIGFsbG93cyBpbmNsdWRlZCAiKi5yYyIpICovCi0gIGlmIChzdHJjbXAgKGluaXRpYWxfZm4sIGZuKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGZuICsgc3RybGVuIChmbikgLSAyLCAiLmgiKSAhPSAwKQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMDsKLSAgZWxzZQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMTsKLX0KLQotLyogSGFuZGxlIGEgcXVvdGVkIHN0cmluZy4gIFRoZSBxdW90ZXMgYXJlIHN0cmlwcGVkLiAgQSBwYWlyIG9mIHF1b3RlcwotICAgaW4gYSBzdHJpbmcgYXJlIHR1cm5lZCBpbnRvIGEgc2luZ2xlIHF1b3RlLiAgQWRqYWNlbnQgc3RyaW5ncyBhcmUKLSAgIG1lcmdlZCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBhcmUgbWVyZ2VkLCBhcyBpbiBDLiAgKi8KLQotc3RhdGljIGNoYXIgKgotaGFuZGxlX3F1b3RlcyAoaW5wdXQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqaW5wdXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmxlbjsKLXsKLSAgY2hhciAqcmV0LCAqczsKLSAgY29uc3QgY2hhciAqdDsKLSAgaW50IGNoOwotCi0gIHJldCA9IGdldF9zdHJpbmcgKHN0cmxlbiAoaW5wdXQpICsgMSk7Ci0KLSAgcyA9IHJldDsKLSAgdCA9IGlucHV0OwotICBpZiAoKnQgPT0gJyInKQotICAgICsrdDsKLSAgd2hpbGUgKCp0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCp0ID09ICdcXCcpCi0JewotCSAgKyt0OwotCSAgc3dpdGNoICgqdCkKLQkgICAgewotCSAgICBjYXNlICdcMCc6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgiYmFja3NsYXNoIGF0IGVuZCBvZiBzdHJpbmciKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcIic6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgidXNlIFwiXCIgdG8gcHV0IFwiIGluIGEgc3RyaW5nIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9BOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdiJzoKLQkgICAgICAqcysrID0gRVNDQVBFX0I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2YnOgotCSAgICAgICpzKysgPSBFU0NBUEVfRjsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9OOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdyJzoKLQkgICAgICAqcysrID0gRVNDQVBFX1I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3QnOgotCSAgICAgICpzKysgPSBFU0NBUEVfVDsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAndic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9WOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcXCc6Ci0JICAgICAgKnMrKyA9ICp0Kys7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6Ci0JICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgotCSAgICAgIGNoID0gKnQgLSAnMCc7Ci0JICAgICAgKyt0OwotCSAgICAgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzcnKQotCQl7Ci0JCSAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOwotCQkgICsrdDsKLQkJICBpZiAoKnQgPj0gJzAnICYmICp0IDw9ICc3JykKLQkJICAgIHsKLQkJICAgICAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOwotCQkgICAgICArK3Q7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAqcysrID0gY2g7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgKyt0OwotCSAgICAgIGNoID0gMDsKLQkgICAgICB3aGlsZSAoMSkKLQkJewotCQkgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzknKQotCQkgICAgY2ggPSAoY2ggPDwgNCkgfCAoKnQgLSAnMCcpOwotCQkgIGVsc2UgaWYgKCp0ID49ICdhJyAmJiAqdCA8PSAnZicpCi0JCSAgICBjaCA9IChjaCA8PCA0KSB8ICgqdCAtICdhJyk7Ci0JCSAgZWxzZSBpZiAoKnQgPj0gJ0EnICYmICp0IDw9ICdGJykKLQkJICAgIGNoID0gKGNoIDw8IDQpIHwgKCp0IC0gJ0EnKTsKLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQkJICArK3Q7Ci0JCX0KLQkgICAgICAqcysrID0gY2g7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKCJ1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlIik7Ci0JICAgICAgKnMrKyA9ICdcXCc7Ci0JICAgICAgKnMrKyA9ICp0Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgqdCAhPSAnIicpCi0JKnMrKyA9ICp0Kys7Ci0gICAgICBlbHNlIGlmICh0WzFdID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBlbHNlIGlmICh0WzFdID09ICciJykKLQl7Ci0JICAqcysrID0gJyInOwotCSAgdCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK3Q7Ci0JICBhc3NlcnQgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpOwotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpCi0JICAgICsrdDsKLQkgIGlmICgqdCA9PSAnXDAnKQotCSAgICBicmVhazsKLQkgIGFzc2VydCAoKnQgPT0gJyInKTsKLQkgICsrdDsKLQl9Ci0gICAgfQotCi0gICpzID0gJ1wwJzsKLQotICAqbGVuID0gcyAtIHJldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBbGxvY2F0ZSBhIHN0cmluZyBvZiBhIGdpdmVuIGxlbmd0aC4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9zdHJpbmcgKGxlbikKLSAgICAgaW50IGxlbjsKLXsKLSAgc3RydWN0IGFsbG9jX3N0cmluZyAqYXM7Ci0KLSAgYXMgPSAoc3RydWN0IGFsbG9jX3N0cmluZyAqKSB4bWFsbG9jIChzaXplb2YgKmFzKTsKLSAgYXMtPnMgPSB4bWFsbG9jIChsZW4pOwotCi0gIGFzLT5uZXh0ID0gc3RyaW5nczsKLSAgc3RyaW5ncyA9IGFzLT5uZXh0OwotCi0gIHJldHVybiBhcy0+czsKLX0KLQotLyogRGlzY2FyZCBhbGwgdGhlIHN0cmluZ3Mgd2UgaGF2ZSBhbGxvY2F0ZWQuICBUaGUgcGFyc2VyIGNhbGxzIHRoaXMKLSAgIHdoZW4gaXQgbm8gbG9uZ2VyIG5lZWRzIHRoZW0uICAqLwotCi12b2lkCi1yY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKQotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICphczsKLQotICBhcyA9IHN0cmluZ3M7Ci0gIHdoaWxlIChhcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBhbGxvY19zdHJpbmcgKm47Ci0KLSAgICAgIGZyZWUgKGFzLT5zKTsKLSAgICAgIG4gPSBhcy0+bmV4dDsKLSAgICAgIGZyZWUgKGFzKTsKLSAgICAgIGFzID0gbjsKLSAgICB9Ci0KLSAgc3RyaW5ncyA9IE5VTEw7Ci19Ci0KLS8qIEVudGVyIHJjZGF0YSBtb2RlLiAgKi8KLQotdm9pZAotcmNwYXJzZV9yY2RhdGEgKCkKLXsKLSAgcmNkYXRhX21vZGUgPSAxOwotfQotCi0vKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlIGZyb20gcmNkYXRhIG1vZGUuICAqLwotCi12b2lkCi1yY3BhcnNlX25vcm1hbCAoKQotewotICByY2RhdGFfbW9kZSA9IDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yY3BhcnNlLnkgYi9iaW51dGlscy9yY3BhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzY2JiZGMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmNwYXJzZS55CisrKyAvZGV2L251bGwKQEAgLTEsMTYxOSArMCwwIEBACi0leyAvKiByY3BhcnNlLnkgLS0gcGFyc2VyIGZvciBXaW5kb3dzIHJjIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBwYXJzZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMuICBJdCBpcyBiYXNlZCBvbiB0aGUgcGFyc2VyCi0gICBieSBHdW50aGVyIEViZXJ0IDxndW50aGVyLmViZXJ0QGl4b3MtbGVpcHppZy5kZT4uICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogVGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbGFuZ3VhZ2U7Ci0KLS8qIFRoZSByZXNvdXJjZSBpbmZvcm1hdGlvbiBkdXJpbmcgYSBzdWIgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzX2luZm8gc3ViX3Jlc19pbmZvOwotCi0vKiBEaWFsb2cgaW5mb3JtYXRpb24uICBUaGlzIGlzIGJ1aWx0IGJ5IHRoZSBub250ZXJtaW5hbHMgc3R5bGVzIGFuZAotICAgY29udHJvbHMuICAqLwotCi1zdGF0aWMgc3RydWN0IGRpYWxvZyBkaWFsb2c7Ci0KLS8qIFRoaXMgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgc3R5bGUuICBJdCBpcyBtb2RpZmllZCBieSB0aGUKLSAgIG5vbnRlcm1pbmFsIHN0eWxlZXhwci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN0eWxlOwotCi0vKiBUaGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgY29udHJvbC4gIFRoZXkgYXJlIHNldCBiZWZvcmUgdXNpbmcKLSAgIGNvbnRyb2xfcGFyYW1zLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFzZV9zdHlsZTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRfc3R5bGU7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGFzczsKLQotJX0KLQotJXVuaW9uCi17Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciBhY2M7Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciAqcGFjYzsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkaWFsb2dfY29udHJvbDsKLSAgc3RydWN0IG1lbnVpdGVtICptZW51aXRlbTsKLSAgc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmZpcnN0OwotICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqbGFzdDsKLSAgfSByY2RhdGE7Ci0gIHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhX2l0ZW07Ci0gIHN0cnVjdCBzdHJpbmd0YWJsZV9kYXRhICpzdHJpbmd0YWJsZTsKLSAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaXh2ZXI7Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqdmVyaW5mbzsKLSAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2ZXJzdHJpbmc7Ci0gIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdmVydmFyOwotICBzdHJ1Y3QgcmVzX2lkIGlkOwotICBzdHJ1Y3QgcmVzX3Jlc19pbmZvIHJlc19pbmZvOwotICBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIHNob3J0IG9uOwotICAgIHVuc2lnbmVkIHNob3J0IG9mZjsKLSAgfSBtZW1mbGFnczsKLSAgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgbnVtYmVyIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBhcyBsb25nLiAgKi8KLSAgICBpbnQgZHdvcmQ7Ci0gIH0gaTsKLSAgdW5zaWduZWQgbG9uZyBpbDsKLSAgdW5zaWduZWQgc2hvcnQgaXM7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgY29uc3QgY2hhciAqczsKLSAgfSBzczsKLX07Ci0KLSV0b2tlbiBCRUcgRU5ECi0ldG9rZW4gQUNDRUxFUkFUT1JTIFZJUlRLRVkgQVNDSUkgTk9JTlZFUlQgU0hJRlQgQ09OVFJPTCBBTFQKLSV0b2tlbiBCSVRNQVAKLSV0b2tlbiBDVVJTT1IKLSV0b2tlbiBESUFMT0cgRElBTE9HRVggRVhTVFlMRSBDQVBUSU9OIENMQVNTIFNUWUxFCi0ldG9rZW4gQVVUTzNTVEFURSBBVVRPQ0hFQ0tCT1ggQVVUT1JBRElPQlVUVE9OIENIRUNLQk9YIENPTUJPQk9YIENURVhUCi0ldG9rZW4gREVGUFVTSEJVVFRPTiBFRElUVEVYVCBHUk9VUEJPWCBMSVNUQk9YIExURVhUIFBVU0hCT1ggUFVTSEJVVFRPTgotJXRva2VuIFJBRElPQlVUVE9OIFJURVhUIFNDUk9MTEJBUiBTVEFURTMgVVNFUkJVVFRPTgotJXRva2VuIEJFRElUIEhFRElUIElFRElUCi0ldG9rZW4gRk9OVAotJXRva2VuIElDT04KLSV0b2tlbiBMQU5HVUFHRSBDSEFSQUNURVJJU1RJQ1MgVkVSU0lPTksKLSV0b2tlbiBNRU5VIE1FTlVFWCBNRU5VSVRFTSBTRVBBUkFUT1IgUE9QVVAgQ0hFQ0tFRCBHUkFZRUQgSEVMUCBJTkFDVElWRQotJXRva2VuIE1FTlVCQVJCUkVBSyBNRU5VQlJFQUsKLSV0b2tlbiBNRVNTQUdFVEFCTEUKLSV0b2tlbiBSQ0RBVEEKLSV0b2tlbiBTVFJJTkdUQUJMRQotJXRva2VuIFZFUlNJT05JTkZPIEZJTEVWRVJTSU9OIFBST0RVQ1RWRVJTSU9OIEZJTEVGTEFHU01BU0sgRklMRUZMQUdTCi0ldG9rZW4gRklMRU9TIEZJTEVUWVBFIEZJTEVTVUJUWVBFIEJMT0NLU1RSSU5HRklMRUlORk8gQkxPQ0tWQVJGSUxFSU5GTwotJXRva2VuIFZBTFVFCi0ldG9rZW4gPHM+IEJMT0NLCi0ldG9rZW4gTU9WRUFCTEUgRklYRUQgUFVSRSBJTVBVUkUgUFJFTE9BRCBMT0FET05DQUxMIERJU0NBUkRBQkxFCi0ldG9rZW4gTk9UCi0ldG9rZW4gPHM+IFFVT1RFRFNUUklORyBTVFJJTkcKLSV0b2tlbiA8aT4gTlVNQkVSCi0ldG9rZW4gPHNzPiBTSVpFRFNUUklORwotJXRva2VuIElHTk9SRURfVE9LRU4KLQotJXR5cGUgPHBhY2M+IGFjY19lbnRyaWVzCi0ldHlwZSA8YWNjPiBhY2NfZW50cnkgYWNjX2V2ZW50Ci0ldHlwZSA8ZGlhbG9nX2NvbnRyb2w+IGNvbnRyb2wgY29udHJvbF9wYXJhbXMKLSV0eXBlIDxtZW51aXRlbT4gbWVudWl0ZW1zIG1lbnVpdGVtIG1lbnVleGl0ZW1zIG1lbnVleGl0ZW0KLSV0eXBlIDxyY2RhdGE+IG9wdHJjZGF0YV9kYXRhIG9wdHJjZGF0YV9kYXRhX2ludCByY2RhdGFfZGF0YQotJXR5cGUgPHJjZGF0YV9pdGVtPiBvcHRfY29udHJvbF9kYXRhCi0ldHlwZSA8Zml4dmVyPiBmaXhlZHZlcmluZm8KLSV0eXBlIDx2ZXJpbmZvPiB2ZXJibG9ja3MKLSV0eXBlIDx2ZXJzdHJpbmc+IHZlcnZhbHMKLSV0eXBlIDx2ZXJ2YXI+IHZlcnRyYW5zCi0ldHlwZSA8cmVzX2luZm8+IHN1Ym9wdGlvbnMgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIG1lbWZsYWdzX21vdmUKLSV0eXBlIDxtZW1mbGFncz4gbWVtZmxhZwotJXR5cGUgPGlkPiBpZAotJXR5cGUgPGlsPiBleHN0eWxlIHBhcmVubnVtYmVyCi0ldHlwZSA8aWw+IG51bWV4cHIgcG9zbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBjcG9zbnVtZXhwcgotJXR5cGUgPGlzPiBhY2Nfb3B0aW9ucyBhY2Nfb3B0aW9uIG1lbnVpdGVtX2ZsYWdzIG1lbnVpdGVtX2ZsYWcKLSV0eXBlIDxzPiBvcHRzdHJpbmdjIGZpbGVfbmFtZQotJXR5cGUgPGk+IHNpemVkbnVtZXhwciBzaXplZHBvc251bWV4cHIKLQotJWxlZnQgJ3wnCi0lbGVmdCAnXicKLSVsZWZ0ICcmJwotJWxlZnQgJysnICctJwotJWxlZnQgJyonICcvJyAnJScKLSVyaWdodCAnficgTkVHCi0KLSUlCi0KLWlucHV0OgotCSAgLyogZW1wdHkgKi8KLQl8IGlucHV0IG5ld2NtZCBhY2NlbGVyYXRvcgotCXwgaW5wdXQgbmV3Y21kIGJpdG1hcAotCXwgaW5wdXQgbmV3Y21kIGN1cnNvcgotCXwgaW5wdXQgbmV3Y21kIGRpYWxvZwotCXwgaW5wdXQgbmV3Y21kIGZvbnQKLQl8IGlucHV0IG5ld2NtZCBpY29uCi0JfCBpbnB1dCBuZXdjbWQgbGFuZ3VhZ2UKLQl8IGlucHV0IG5ld2NtZCBtZW51Ci0JfCBpbnB1dCBuZXdjbWQgbWVudWV4Ci0JfCBpbnB1dCBuZXdjbWQgbWVzc2FnZXRhYmxlCi0JfCBpbnB1dCBuZXdjbWQgcmNkYXRhCi0JfCBpbnB1dCBuZXdjbWQgc3RyaW5ndGFibGUKLQl8IGlucHV0IG5ld2NtZCB1c2VyCi0JfCBpbnB1dCBuZXdjbWQgdmVyc2lvbmluZm8KLQl8IGlucHV0IG5ld2NtZCBJR05PUkVEX1RPS0VOCi0JOwotCi1uZXdjbWQ6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICByY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKTsKLQkgIH0KLQk7Ci0KLS8qIEFjY2VsZXJhdG9yIHJlc291cmNlcy4gICovCi0KLWFjY2VsZXJhdG9yOgotCSAgaWQgQUNDRUxFUkFUT1JTIHN1Ym9wdGlvbnMgQkVHIGFjY19lbnRyaWVzIEVORAotCSAgewotCSAgICBkZWZpbmVfYWNjZWxlcmF0b3IgKCQxLCAmJDMsICQ1KTsKLQkgIH0KLQk7Ci0KLWFjY19lbnRyaWVzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgYWNjX2VudHJpZXMgYWNjX2VudHJ5Ci0JICB7Ci0JICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYTsKLQotCSAgICBhID0gKHN0cnVjdCBhY2NlbGVyYXRvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYSk7Ci0JICAgICphID0gJDI7Ci0JICAgIGlmICgkMSA9PSBOVUxMKQotCSAgICAgICQkID0gYTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IGFjY2VsZXJhdG9yICoqcHA7Ci0KLQkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCQkgIDsKLQkJKnBwID0gYTsKLQkJJCQgPSAkMTsKLQkgICAgICB9Ci0JICB9Ci0JOwotCi1hY2NfZW50cnk6Ci0JICBhY2NfZXZlbnQgY3Bvc251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQuaWQgPSAkMjsKLQkgIH0KLQl8IGFjY19ldmVudCBjcG9zbnVtZXhwciAnLCcgYWNjX29wdGlvbnMKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQuaWQgPSAkMjsKLQkgICAgJCQuZmxhZ3MgfD0gJDQ7Ci0JICAgIGlmICgoJCQuZmxhZ3MgJiBBQ0NfVklSVEtFWSkgPT0gMAotCQkmJiAoJCQuZmxhZ3MgJiAoQUNDX1NISUZUIHwgQUNDX0NPTlRST0wgfCBBQ0NfQUxUKSkgIT0gMCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImluYXBwcm9wcmlhdGUgbW9kaWZpZXJzIGZvciBub24tVklSVEtFWSIpKTsKLQkgIH0KLQk7Ci0KLWFjY19ldmVudDoKLQkgIFFVT1RFRFNUUklORwotCSAgewotCSAgICBjb25zdCBjaGFyICpzID0gJDE7Ci0JICAgIGNoYXIgY2g7Ci0KLQkgICAgJCQubmV4dCA9IE5VTEw7Ci0JICAgICQkLmlkID0gMDsKLQkgICAgY2ggPSAqczsKLQkgICAgaWYgKGNoICE9ICdeJykKLQkgICAgICAkJC5mbGFncyA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSQkLmZsYWdzID0gQUNDX0NPTlRST0wgfCBBQ0NfVklSVEtFWTsKLQkJKytzOwotCQljaCA9ICpzOwotCQljaCA9IHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjaCk7Ci0JICAgICAgfQotCSAgICAkJC5rZXkgPSBjaDsKLQkgICAgaWYgKHNbMV0gIT0gJ1wwJykKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImFjY2VsZXJhdG9yIHNob3VsZCBvbmx5IGJlIG9uZSBjaGFyYWN0ZXIiKSk7Ci0JICB9Ci0JfCBwb3NudW1leHByCi0JICB7Ci0JICAgICQkLm5leHQgPSBOVUxMOwotCSAgICAkJC5mbGFncyA9IDA7Ci0JICAgICQkLmlkID0gMDsKLQkgICAgJCQua2V5ID0gJDE7Ci0JICB9Ci0JOwotCi1hY2Nfb3B0aW9uczoKLQkgIGFjY19vcHRpb24KLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGFjY19vcHRpb25zICcsJyBhY2Nfb3B0aW9uCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMzsKLQkgIH0KLQkvKiBJJ3ZlIGhhZCBvbmUgcmVwb3J0IHRoYXQgdGhlIGNvbW1hIGlzIG9wdGlvbmFsLiAgKi8KLQl8IGFjY19vcHRpb25zIGFjY19vcHRpb24KLQkgIHsKLQkgICAgJCQgPSAkMSB8ICQyOwotCSAgfQotCTsKLQotYWNjX29wdGlvbjoKLQkgIFZJUlRLRVkKLQkgIHsKLQkgICAgJCQgPSBBQ0NfVklSVEtFWTsKLQkgIH0KLQl8IEFTQ0lJCi0JICB7Ci0JICAgIC8qIFRoaXMgaXMganVzdCB0aGUgYWJzZW5jZSBvZiBWSVJUS0VZLiAgKi8KLQkgICAgJCQgPSAwOwotCSAgfQotCXwgTk9JTlZFUlQKLQkgIHsKLQkgICAgJCQgPSBBQ0NfTk9JTlZFUlQ7Ci0JICB9Ci0JfCBTSElGVAotCSAgewotCSAgICAkJCA9IEFDQ19TSElGVDsKLQkgIH0KLQl8IENPTlRST0wKLQkgIHsKLQkgICAgJCQgPSBBQ0NfQ09OVFJPTDsKLQkgIH0KLQl8IEFMVAotCSAgewotCSAgICAkJCA9IEFDQ19BTFQ7Ci0JICB9Ci0JOwotCi0vKiBCaXRtYXAgcmVzb3VyY2VzLiAgKi8KLQotYml0bWFwOgotCSAgaWQgQklUTUFQIG1lbWZsYWdzX21vdmUgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV9iaXRtYXAgKCQxLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIEN1cnNvciByZXNvdXJjZXMuICAqLwotCi1jdXJzb3I6Ci0JICBpZCBDVVJTT1IgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfY3Vyc29yICgkMSwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBEaWFsb2cgcmVzb3VyY2VzLiAgKi8KLQotZGlhbG9nOgotCSAgaWQgRElBTE9HIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNudW1leHByCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOwotCSAgICAgIGRpYWxvZy54ID0gJDU7Ci0JICAgICAgZGlhbG9nLnkgPSAkNjsKLQkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKLQkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7Ci0JICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOwotCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7Ci0JICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOwotCSAgICAgIGRpYWxvZy5leCA9IE5VTEw7Ci0JICAgICAgZGlhbG9nLmNvbnRyb2xzID0gTlVMTDsKLQkgICAgICBzdWJfcmVzX2luZm8gPSAkMzsKLQkgICAgfQotCSAgICBzdHlsZXMgQkVHIGNvbnRyb2xzIEVORAotCSAgewotCSAgICBkZWZpbmVfZGlhbG9nICgkMSwgJnN1Yl9yZXNfaW5mbywgJmRpYWxvZyk7Ci0JICB9Ci0JfCBpZCBESUFMT0dFWCBtZW1mbGFnc19tb3ZlIGV4c3R5bGUgcG9zbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwcgotCSAgICB7Ci0JICAgICAgbWVtc2V0ICgmZGlhbG9nLCAwLCBzaXplb2YgZGlhbG9nKTsKLQkgICAgICBkaWFsb2cueCA9ICQ1OwotCSAgICAgIGRpYWxvZy55ID0gJDY7Ci0JICAgICAgZGlhbG9nLndpZHRoID0gJDc7Ci0JICAgICAgZGlhbG9nLmhlaWdodCA9ICQ4OwotCSAgICAgIGRpYWxvZy5zdHlsZSA9IFdTX1BPUFVQIHwgV1NfQk9SREVSIHwgV1NfU1lTTUVOVTsKLQkgICAgICBkaWFsb2cuZXhzdHlsZSA9ICQ0OwotCSAgICAgIGRpYWxvZy5tZW51Lm5hbWVkID0gMTsKLQkgICAgICBkaWFsb2cuY2xhc3MubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5mb250ID0gTlVMTDsKLQkgICAgICBkaWFsb2cuZXggPSAoKHN0cnVjdCBkaWFsb2dfZXggKikKLQkJCSAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGlhbG9nX2V4KSkpOwotCSAgICAgIG1lbXNldCAoZGlhbG9nLmV4LCAwLCBzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKTsKLQkgICAgICBkaWFsb2cuY29udHJvbHMgPSBOVUxMOwotCSAgICAgIHN1Yl9yZXNfaW5mbyA9ICQzOwotCSAgICB9Ci0JICAgIHN0eWxlcyBCRUcgY29udHJvbHMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9kaWFsb2cgKCQxLCAmc3ViX3Jlc19pbmZvLCAmZGlhbG9nKTsKLQkgIH0KLQl8IGlkIERJQUxPR0VYIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNudW1leHByIGNudW1leHByCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOwotCSAgICAgIGRpYWxvZy54ID0gJDU7Ci0JICAgICAgZGlhbG9nLnkgPSAkNjsKLQkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKLQkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7Ci0JICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOwotCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7Ci0JICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOwotCSAgICAgIGRpYWxvZy5leCA9ICgoc3RydWN0IGRpYWxvZ19leCAqKQotCQkJICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKSk7Ci0JICAgICAgbWVtc2V0IChkaWFsb2cuZXgsIDAsIHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpOwotCSAgICAgIGRpYWxvZy5leC0+aGVscCA9ICQ5OwotCSAgICAgIGRpYWxvZy5jb250cm9scyA9IE5VTEw7Ci0JICAgICAgc3ViX3Jlc19pbmZvID0gJDM7Ci0JICAgIH0KLQkgICAgc3R5bGVzIEJFRyBjb250cm9scyBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX2RpYWxvZyAoJDEsICZzdWJfcmVzX2luZm8sICZkaWFsb2cpOwotCSAgfQotCTsKLQotZXhzdHlsZToKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gMDsKLQkgIH0KLQl8IEVYU1RZTEUgJz0nIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQk7Ci0KLXN0eWxlczoKLQkgIC8qIGVtcHR5ICovCi0JfCBzdHlsZXMgQ0FQVElPTiBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZkaWFsb2cuY2FwdGlvbiwgJDMpOwotCSAgfQotCXwgc3R5bGVzIENMQVNTIGlkCi0JICB7Ci0JICAgIGRpYWxvZy5jbGFzcyA9ICQzOwotCSAgfQotCXwgc3R5bGVzIFNUWUxFCi0JICAgIHsgc3R5bGUgPSBkaWFsb2cuc3R5bGU7IH0KLQkgICAgc3R5bGVleHByCi0JICB7Ci0JICAgIGRpYWxvZy5zdHlsZSA9IHN0eWxlOwotCSAgfQotCXwgc3R5bGVzIEVYU1RZTEUgbnVtZXhwcgotCSAgewotCSAgICBkaWFsb2cuZXhzdHlsZSA9ICQzOwotCSAgfQotCXwgc3R5bGVzIEZPTlQgbnVtZXhwciAnLCcgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGRpYWxvZy5zdHlsZSB8PSBEU19TRVRGT05UOwotCSAgICBkaWFsb2cucG9pbnRzaXplID0gJDM7Ci0JICAgIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmZGlhbG9nLmZvbnQsICQ1KTsKLQkgIH0KLQl8IHN0eWxlcyBGT05UIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICBkaWFsb2cuc3R5bGUgfD0gRFNfU0VURk9OVDsKLQkgICAgZGlhbG9nLnBvaW50c2l6ZSA9ICQzOwotCSAgICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJmRpYWxvZy5mb250LCAkNSk7Ci0JICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImV4dGVuZGVkIEZPTlQgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRpYWxvZy5leC0+d2VpZ2h0ID0gJDY7Ci0JCWRpYWxvZy5leC0+aXRhbGljID0gJDc7Ci0JICAgICAgfQotCSAgfQotCXwgc3R5bGVzIE1FTlUgaWQKLQkgIHsKLQkgICAgZGlhbG9nLm1lbnUgPSAkMzsKLQkgIH0KLQl8IHN0eWxlcyBDSEFSQUNURVJJU1RJQ1MgbnVtZXhwcgotCSAgewotCSAgICBzdWJfcmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzID0gJDM7Ci0JICB9Ci0JfCBzdHlsZXMgTEFOR1VBR0UgbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICBzdWJfcmVzX2luZm8ubGFuZ3VhZ2UgPSAkMyB8ICgkNCA8PCA4KTsKLQkgIH0KLQl8IHN0eWxlcyBWRVJTSU9OSyBudW1leHByCi0JICB7Ci0JICAgIHN1Yl9yZXNfaW5mby52ZXJzaW9uID0gJDM7Ci0JICB9Ci0JOwotCi1jb250cm9sczoKLQkgIC8qIGVtcHR5ICovCi0JfCBjb250cm9scyBjb250cm9sCi0JICB7Ci0JICAgIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKnBwOwotCi0JICAgIGZvciAocHAgPSAmZGlhbG9nLmNvbnRyb2xzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JICAgICAgOwotCSAgICAqcHAgPSAkMjsKLQkgIH0KLQk7Ci0KLWNvbnRyb2w6Ci0JICBBVVRPM1NUQVRFCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQVVUTzNTVEFURSB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEJTX0FVVE8zU1RBVEU7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBBVVRPQ0hFQ0tCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1g7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBBVVRPUkFESU9CVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT04gfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT047Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBCRURJVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9FRElUOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oIklFRElUIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCSAgICByZXNfc3RyaW5nX3RvX2lkICgmJCQtPmNsYXNzLCAiQkVESVQiKTsKLQkgIH0KLQl8IENIRUNLQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19DSEVDS0JPWCB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBDT01CT0JPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IENCU19TSU1QTEUgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSAwOwotCSAgICAgIGNsYXNzID0gQ1RMX0NPTUJPQk9YOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKLQkgICAgaWYgKCQxMSAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQxMTsKLQkgICAgICB9Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkMTE7Ci0JICAgICQkLT5kYXRhID0gJDEyOwotCSAgfQotCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKLQkgICAgaWYgKCQxMiAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpOwotCQkkJC0+ZGF0YSA9ICQxMjsKLQkgICAgICB9Ci0JICAgICQkLT5jbGFzcy5uYW1lZCA9IDE7Ci0gIAkgICAgdW5pY29kZV9mcm9tX2FzY2lpKCYkJC0+Y2xhc3MudS5uLmxlbmd0aCwgJiQkLT5jbGFzcy51Lm4ubmFtZSwgJDUpOwotCSAgfQotCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoImhlbHAgSUQgcmVxdWlyZXMgRElBTE9HRVgiKTsKLQkgICAgJCQtPmhlbHAgPSAkMTI7Ci0JICAgICQkLT5kYXRhID0gJDEzOwotCSAgICAkJC0+Y2xhc3MubmFtZWQgPSAxOwotICAJICAgIHVuaWNvZGVfZnJvbV9hc2NpaSgmJCQtPmNsYXNzLnUubi5sZW5ndGgsICYkJC0+Y2xhc3MudS5uLm5hbWUsICQ1KTsKLQkgIH0KLQl8IENURVhUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU1NfQ0VOVEVSIHwgV1NfR1JPVVA7Ci0JICAgICAgYmFzZV9zdHlsZSA9IFNTX0NFTlRFUjsKLQkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IERFRlBVU0hCVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBFRElUVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9FRElUOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBHUk9VUEJPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX0dST1VQQk9YOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19HUk9VUEJPWDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IEhFRElUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGNsYXNzID0gQ1RMX0VESVQ7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiSUVESVQgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JICAgIHJlc19zdHJpbmdfdG9faWQgKCYkJC0+Y2xhc3MsICJIRURJVCIpOwotCSAgfQotCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMiwgJDMsICQ0LCAkNSwgMCwgMCwgQ1RMX1NUQVRJQywKLQkJCQkgU1NfSUNPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSwgMCk7Ci0JICAgIGlmICgkNiAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQ2OwotCSAgICAgIH0KLQkgIH0KLQl8IElDT04gb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGljb25fc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLSAgICAJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDQsICQ1LCAkNiwgJDcsIENUTF9TVEFUSUMsCi0JCQkJIHN0eWxlLCAkOSk7Ci0JICAgIGlmICgkMTAgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkJJCQtPmRhdGEgPSAkMTA7Ci0JICAgICAgfQotCSAgfQotCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgaWNvbl9zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotICAgIAkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNCwgJDUsICQ2LCAkNywgQ1RMX1NUQVRJQywKLQkJCQkgc3R5bGUsICQ5KTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkMTA7Ci0JICAgICQkLT5kYXRhID0gJDExOwotCSAgfQotCXwgSUVESVQKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfRURJVDsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JICAgICAgcmNwYXJzZV93YXJuaW5nIChfKCJJRURJVCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLT5jbGFzcywgIklFRElUIik7Ci0JICB9Ci0JfCBMSVNUQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKLQkgICAgICBiYXNlX3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKLQkgICAgICBjbGFzcyA9IENUTF9MSVNUQk9YOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBMVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX0xFRlQgfCBXU19HUk9VUDsKLQkgICAgICBiYXNlX3N0eWxlID0gU1NfTEVGVDsKLQkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFBVU0hCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQk9YIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJPWDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFBVU0hCVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBSQURJT0JVVFRPTgotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUkFESU9CVVRUT047Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBSVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX1JJR0hUIHwgV1NfR1JPVVA7Ci0JICAgICAgYmFzZV9zdHlsZSA9IFNTX1JJR0hUOwotCSAgICAgIGNsYXNzID0gQ1RMX1NUQVRJQzsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgfQotCXwgU0NST0xMQkFSCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU0JTX0hPUlo7Ci0JICAgICAgYmFzZV9zdHlsZSA9IDA7Ci0JICAgICAgY2xhc3MgPSBDVExfU0NST0xMQkFSOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBTVEFURTMKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU18zU1RBVEUgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU18zU1RBVEU7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBVU0VSQlVUVE9OIFFVT1RFRFNUUklORyAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcKLQkgICAgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgCi0JICAgIHsgc3R5bGUgPSBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KLQkgICAgc3R5bGVleHByIG9wdGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkNCwgJDYsICQ4LCAkMTAsICQxMiwgQ1RMX0JVVFRPTiwKLQkJCQkgc3R5bGUsICQxNik7Ci0JICB9Ci0JOwotCi0vKiBQYXJhbWV0ZXJzIGZvciBhIGNvbnRyb2wuICBUaGUgc3RhdGljIHZhcmlhYmxlcyBERUZBVUxUX1NUWUxFLAotICAgQkFTRV9TVFlMRSwgYW5kIENMQVNTIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgbm9udGVybWluYWwKLSAgIGlzIHVzZWQuICBERUZBVUxUX1NUWUxFIGlzIHRoZSBzdHlsZSB0byB1c2UgaWYgbm8gc3R5bGUgZXhwcmVzc2lvbgotICAgaXMgc3BlY2lmaWVkLiAgQkFTRV9TVFlMRSBpcyB0aGUgYmFzZSBzdHlsZSB0byB1c2UgaWYgYSBzdHlsZQotICAgZXhwcmVzc2lvbiBpcyBzcGVjaWZpZWQ7IHRoZSBzdHlsZSBleHByZXNzaW9uIG1vZGlmaWVzIHRoZSBiYXNlCi0gICBzdHlsZS4gIENMQVNTIGlzIHRoZSBjbGFzcyBvZiB0aGUgY29udHJvbC4gICovCi0KLWNvbnRyb2xfcGFyYW1zOgotCSAgb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsCi0JCQkJIGRlZmF1bHRfc3R5bGUgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUsIDApOwotCSAgICBpZiAoJDcgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkJJCQtPmRhdGEgPSAkNzsKLQkgICAgICB9Ci0JICB9Ci0JfCBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgY29udHJvbF9wYXJhbXNfc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsIHN0eWxlLCAkOCk7Ci0JICAgIGlmICgkOSAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQ5OwotCSAgICAgIH0KLQkgIH0KLQl8IG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBjb250cm9sX3BhcmFtc19zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCBjbGFzcywgc3R5bGUsICQ4KTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkOTsKLQkgICAgJCQtPmRhdGEgPSAkMTA7Ci0JICB9Ci0JOwotCi1vcHRzdHJpbmdjOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgUVVPVEVEU1RSSU5HICcsJwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotb3B0X2NvbnRyb2xfZGF0YToKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgJCQgPSAkMi5maXJzdDsKLQkgIH0KLQk7Ci0KLS8qIFRoZXNlIG9ubHkgZXhpc3QgdG8gcGFyc2UgYSByZWR1Y3Rpb24gb3V0IG9mIGEgY29tbW9uIGNhc2UuICAqLwotCi1jb250cm9sX3N0eWxlZXhwcjoKLQkgICcsJwotCSAgeyBzdHlsZSA9IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgc3R5bGVleHByCi0JOwotCi1pY29uX3N0eWxlZXhwcjoKLQkgICcsJwotCSAgeyBzdHlsZSA9IFNTX0lDT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KLQkgIHN0eWxlZXhwcgotCTsKLQotY29udHJvbF9wYXJhbXNfc3R5bGVleHByOgotCSAgJywnCi0JICB7IHN0eWxlID0gYmFzZV9zdHlsZSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgc3R5bGVleHByCi0JOwotCi0vKiBGb250IHJlc291cmNlcy4gICovCi0KLWZvbnQ6Ci0JICBpZCBGT05UIG1lbWZsYWdzX21vdmVfZGlzY2FyZCBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX2ZvbnQgKCQxLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIEljb24gcmVzb3VyY2VzLiAgKi8KLQotaWNvbjoKLQkgIGlkIElDT04gbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfaWNvbiAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogTGFuZ3VhZ2UgY29tbWFuZC4gIFRoaXMgY2hhbmdlcyB0aGUgc3RhdGljIHZhcmlhYmxlIGxhbmd1YWdlLCB3aGljaAotICAgYWZmZWN0cyBhbGwgc3Vic2VxdWVudCByZXNvdXJjZXMuICAqLwotCi1sYW5ndWFnZToKLQkgIExBTkdVQUdFIG51bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgbGFuZ3VhZ2UgPSAkMiB8ICgkMyA8PCA4KTsKLQkgIH0KLQk7Ci0KLS8qIE1lbnUgcmVzb3VyY2VzLiAgKi8KLQotbWVudToKLQkgIGlkIE1FTlUgc3Vib3B0aW9ucyBCRUcgbWVudWl0ZW1zIEVORAotCSAgewotCSAgICBkZWZpbmVfbWVudSAoJDEsICYkMywgJDUpOwotCSAgfQotCTsKLQotbWVudWl0ZW1zOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgbWVudWl0ZW1zIG1lbnVpdGVtCi0JICB7Ci0JICAgIGlmICgkMSA9PSBOVUxMKQotCSAgICAgICQkID0gJDI7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cnVjdCBtZW51aXRlbSAqKnBwOwotCi0JCWZvciAocHAgPSAmJDEtPm5leHQ7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQkJICA7Ci0JCSpwcCA9ICQyOwotCQkkJCA9ICQxOwotCSAgICAgIH0KLQkgIH0KLQk7Ci0KLW1lbnVpdGVtOgotCSAgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIG1lbnVpdGVtX2ZsYWdzCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAwLCAwLCBOVUxMKTsKLQkgIH0KLQl8IE1FTlVJVEVNIFNFUEFSQVRPUgotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoTlVMTCwgMCwgMCwgMCwgMCwgTlVMTCk7Ci0JICB9Ci0JfCBQT1BVUCBRVU9URURTVFJJTkcgbWVudWl0ZW1fZmxhZ3MgQkVHIG1lbnVpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAwLCAkMywgMCwgMCwgJDUpOwotCSAgfQotCTsKLQotbWVudWl0ZW1fZmxhZ3M6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IDA7Ci0JICB9Ci0JfCBtZW51aXRlbV9mbGFncyAnLCcgbWVudWl0ZW1fZmxhZwotCSAgewotCSAgICAkJCA9ICQxIHwgJDM7Ci0JICB9Ci0JfCBtZW51aXRlbV9mbGFncyBtZW51aXRlbV9mbGFnCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMjsKLQkgIH0KLQk7Ci0KLW1lbnVpdGVtX2ZsYWc6Ci0JICBDSEVDS0VECi0JICB7Ci0JICAgICQkID0gTUVOVUlURU1fQ0hFQ0tFRDsKLQkgIH0KLQl8IEdSQVlFRAotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX0dSQVlFRDsKLQkgIH0KLQl8IEhFTFAKLQkgIHsKLQkgICAgJCQgPSBNRU5VSVRFTV9IRUxQOwotCSAgfQotCXwgSU5BQ1RJVkUKLQkgIHsKLQkgICAgJCQgPSBNRU5VSVRFTV9JTkFDVElWRTsKLQkgIH0KLQl8IE1FTlVCQVJCUkVBSwotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCQVJCUkVBSzsKLQkgIH0KLQl8IE1FTlVCUkVBSwotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCUkVBSzsKLQkgIH0KLQk7Ci0KLS8qIE1lbnVleCByZXNvdXJjZXMuICAqLwotCi1tZW51ZXg6Ci0JICBpZCBNRU5VRVggc3Vib3B0aW9ucyBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9tZW51ICgkMSwgJiQzLCAkNSk7Ci0JICB9Ci0JOwotCi1tZW51ZXhpdGVtczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IG1lbnVleGl0ZW1zIG1lbnVleGl0ZW0KLQkgIHsKLQkgICAgaWYgKCQxID09IE5VTEwpCi0JICAgICAgJCQgPSAkMjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IG1lbnVpdGVtICoqcHA7Ci0KLQkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCQkgIDsKLQkJKnBwID0gJDI7Ci0JCSQkID0gJDE7Ci0JICAgICAgfQotCSAgfQotCTsKLQotbWVudWV4aXRlbToKLQkgIE1FTlVJVEVNIFFVT1RFRFNUUklORwotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoJDIsIDAsIDAsIDAsIDAsIE5VTEwpOwotCSAgfQotCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsIDAsIDAsIDAsIE5VTEwpOwotCSAgfQotCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIG9wdGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgMCwgTlVMTCk7Ci0JICB9Ci0gCXwgTUVOVUlURU0gU0VQQVJBVE9SCi0gCSAgewotIAkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwpOwotIAkgIH0KLQl8IFBPUFVQIFFVT1RFRFNUUklORyBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgMCwgMCwgMCwgMCwgJDQpOwotCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgMCwgMCwgMCwgJDUpOwotCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgJDQsIDAsIDAsICQ2KTsKLQkgIH0KLQl8IFBPUFVQIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwcgotCSAgICBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgJDYsICQ4KTsKLQkgIH0KLQk7Ci0KLS8qIE1lc3NhZ2V0YWJsZSByZXNvdXJjZXMuICAqLwotCi1tZXNzYWdldGFibGU6Ci0JICBpZCBNRVNTQUdFVEFCTEUgbWVtZmxhZ3NfbW92ZSBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX21lc3NhZ2V0YWJsZSAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogUmNkYXRhIHJlc291cmNlcy4gICovCi0KLXJjZGF0YToKLQkgIGlkIFJDREFUQSBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX3JjZGF0YSAoJDEsICYkMywgJDUuZmlyc3QpOwotCSAgfQotCTsKLQotLyogV2UgdXNlIGEgZGlmZmVyZW50IGxleGluZyBhbGdvcml0aG0sIGJlY2F1c2UgcmNkYXRhIHN0cmluZ3MgbWF5Ci0gICBjb250YWluIGVtYmVkZGVkIG51bGwgYnl0ZXMsIGFuZCB3ZSBuZWVkIHRvIGtub3cgdGhlIGxlbmd0aCB0byB1c2UuICAqLwotCi1vcHRyY2RhdGFfZGF0YToKLQkgIHsKLQkgICAgcmNwYXJzZV9yY2RhdGEgKCk7Ci0JICB9Ci0JICBvcHRyY2RhdGFfZGF0YV9pbnQKLQkgIHsKLQkgICAgcmNwYXJzZV9ub3JtYWwgKCk7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi1vcHRyY2RhdGFfZGF0YV9pbnQ6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJC5maXJzdCA9IE5VTEw7Ci0JICAgICQkLmxhc3QgPSBOVUxMOwotCSAgfQotCXwgcmNkYXRhX2RhdGEKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLXJjZGF0YV9kYXRhOgotCSAgU0laRURTVFJJTkcKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfc3RyaW5nICgkMS5zLCAkMS5sZW5ndGgpOwotCSAgICAkJC5maXJzdCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JfCBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfbnVtYmVyICgkMS52YWwsICQxLmR3b3JkKTsKLQkgICAgJCQuZmlyc3QgPSByaTsKLQkgICAgJCQubGFzdCA9IHJpOwotCSAgfQotCXwgcmNkYXRhX2RhdGEgJywnIFNJWkVEU1RSSU5HCi0JICB7Ci0JICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLQkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX3N0cmluZyAoJDMucywgJDMubGVuZ3RoKTsKLQkgICAgJCQuZmlyc3QgPSAkMS5maXJzdDsKLQkgICAgJDEubGFzdC0+bmV4dCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JfCByY2RhdGFfZGF0YSAnLCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLQkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX251bWJlciAoJDMudmFsLCAkMy5kd29yZCk7Ci0JICAgICQkLmZpcnN0ID0gJDEuZmlyc3Q7Ci0JICAgICQxLmxhc3QtPm5leHQgPSByaTsKLQkgICAgJCQubGFzdCA9IHJpOwotCSAgfQotCTsKLQotLyogU3RyaW5ndGFibGUgcmVzb3VyY2VzLiAgKi8KLQotc3RyaW5ndGFibGU6Ci0JICBTVFJJTkdUQUJMRSBzdWJvcHRpb25zIEJFRyAKLQkgICAgeyBzdWJfcmVzX2luZm8gPSAkMjsgfQotCSAgICBzdHJpbmdfZGF0YSBFTkQKLQk7Ci0KLXN0cmluZ19kYXRhOgotCSAgLyogZW1wdHkgKi8KLQl8IHN0cmluZ19kYXRhIG51bWV4cHIgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGRlZmluZV9zdHJpbmd0YWJsZSAoJnN1Yl9yZXNfaW5mbywgJDIsICQzKTsKLQkgIH0KLQl8IHN0cmluZ19kYXRhIG51bWV4cHIgJywnIFFVT1RFRFNUUklORwotCSAgewotCSAgICBkZWZpbmVfc3RyaW5ndGFibGUgKCZzdWJfcmVzX2luZm8sICQyLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBVc2VyIGRlZmluZWQgcmVzb3VyY2VzLiAgV2UgYWNjZXB0IGdlbmVyYWwgc3Vib3B0aW9ucyBpbiB0aGUKLSAgIGZpbGVfbmFtZSBjYXNlIHRvIGtlZXAgdGhlIHBhcnNlciBoYXBweS4gICovCi0KLXVzZXI6Ci0JICBpZCBpZCBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX3VzZXJfZGF0YSAoJDEsICQyLCAmJDMsICQ1LmZpcnN0KTsKLQkgIH0KLQl8IGlkIGlkIHN1Ym9wdGlvbnMgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV91c2VyX2ZpbGUgKCQxLCAkMiwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBWZXJzaW9uaW5mbyByZXNvdXJjZXMuICAqLwotCi12ZXJzaW9uaW5mbzoKLQkgIGlkIFZFUlNJT05JTkZPIGZpeGVkdmVyaW5mbyBCRUcgdmVyYmxvY2tzIEVORAotCSAgewotCSAgICBkZWZpbmVfdmVyc2lvbmluZm8gKCQxLCBsYW5ndWFnZSwgJDMsICQ1KTsKLQkgIH0KLQk7Ci0KLWZpeGVkdmVyaW5mbzoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gKChzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKikKLQkJICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvKSkpOwotCSAgICBtZW1zZXQgKCQkLCAwLCBzaXplb2YgKHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbykpOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIEZJTEVWRVJTSU9OIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgJDEtPmZpbGVfdmVyc2lvbl9tcyA9ICgkMyA8PCAxNikgfCAkNDsKLQkgICAgJDEtPmZpbGVfdmVyc2lvbl9scyA9ICgkNSA8PCAxNikgfCAkNjsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBQUk9EVUNUVkVSU0lPTiBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbXMgPSAoJDMgPDwgMTYpIHwgJDQ7Ci0JICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbHMgPSAoJDUgPDwgMTYpIHwgJDY7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRUZMQUdTTUFTSyBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX2ZsYWdzX21hc2sgPSAkMzsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBGSUxFRkxBR1MgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV9mbGFncyA9ICQzOwotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIEZJTEVPUyBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX29zID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRVRZUEUgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV90eXBlID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRVNVQlRZUEUgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV9zdWJ0eXBlID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi0vKiBUbyBoYW5kbGUgdmVyYmxvY2tzIHN1Y2Nlc3NmdWxseSwgdGhlIGxleGVyIGhhbmRsZXMgQkxPQ0sKLSAgIHNwZWNpYWxseS4gIEEgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcwotICAgQkxPQ0tTVFJJTkdGSUxFSU5GTy4gIEEgQkxPQ0sgIlZhckZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcwotICAgQkxPQ0tWQVJGSUxFSU5GTy4gIEEgQkxPQ0sgd2l0aCBzb21lIG90aGVyIHN0cmluZyByZXR1cm5zIEJMT0NLCi0gICB3aXRoIHRoZSBzdHJpbmcgYXMgdGhlIHZhbHVlLiAgKi8KLQotdmVyYmxvY2tzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgdmVyYmxvY2tzIEJMT0NLU1RSSU5HRklMRUlORk8gQkVHIEJMT0NLIEJFRyB2ZXJ2YWxzIEVORCBFTkQKLQkgIHsKLQkgICAgJCQgPSBhcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvICgkMSwgJDQsICQ2KTsKLQkgIH0KLQl8IHZlcmJsb2NrcyBCTE9DS1ZBUkZJTEVJTkZPIEJFRyBWQUxVRSBRVU9URURTVFJJTkcgdmVydHJhbnMgRU5ECi0JICB7Ci0JICAgICQkID0gYXBwZW5kX3Zlcl92YXJmaWxlaW5mbyAoJDEsICQ1LCAkNik7Ci0JICB9Ci0JOwotCi12ZXJ2YWxzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgdmVydmFscyBWQUxVRSBRVU9URURTVFJJTkcgJywnIFFVT1RFRFNUUklORwotCSAgewotCSAgICAkJCA9IGFwcGVuZF92ZXJ2YWwgKCQxLCAkMywgJDUpOwotCSAgfQotCTsKLQotdmVydHJhbnM6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCB2ZXJ0cmFucyBjbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICAkJCA9IGFwcGVuZF92ZXJ0cmFucyAoJDEsICQyLCAkMyk7Ci0JICB9Ci0JOwotCi0vKiBBIHJlc291cmNlIElELiAgKi8KLQotaWQ6Ci0JICBwb3NudW1leHByCi0JICB7Ci0JICAgICQkLm5hbWVkID0gMDsKLQkgICAgJCQudS5pZCA9ICQxOwotCSAgfQotCXwgU1RSSU5HCi0JICB7Ci0JICAgIGNoYXIgKmNvcHksICpzOwotCi0JICAgIC8qIEl0IHNlZW1zIHRoYXQgcmVzb3VyY2UgSUQncyBhcmUgZm9yY2VkIHRvIHVwcGVyIGNhc2UuICAqLwotCSAgICBjb3B5ID0geHN0cmR1cCAoJDEpOwotCSAgICBmb3IgKHMgPSBjb3B5OyAqcyAhPSAnXDAnOyBzKyspCi0JICAgICAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSpzID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsKLQkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLCBjb3B5KTsKLQkgICAgZnJlZSAoY29weSk7Ci0JICB9Ci0JOwotCi0vKiBHZW5lcmljIHN1Ym9wdGlvbnMuICBUaGVzZSBtYXkgYXBwZWFyIGJlZm9yZSB0aGUgQkVHSU4gaW4gYW55Ci0gICBtdWx0aWxpbmUgc3RhdGVtZW50LiAgKi8KLQotc3Vib3B0aW9uczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgIG1lbXNldCAoJiQkLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfcmVzX2luZm8pKTsKLQkgICAgJCQubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQkgICAgLyogRklYTUU6IElzIHRoaXMgdGhlIHJpZ2h0IGRlZmF1bHQ/ICAqLwotCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEU7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIG1lbWZsYWcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247Ci0JICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIENIQVJBQ1RFUklTVElDUyBudW1leHByCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICAgICQkLmNoYXJhY3RlcmlzdGljcyA9ICQzOwotCSAgfQotCXwgc3Vib3B0aW9ucyBMQU5HVUFHRSBudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICAgICQkLmxhbmd1YWdlID0gJDMgfCAoJDQgPDwgOCk7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIFZFUlNJT05LIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQudmVyc2lvbiA9ICQzOwotCSAgfQotCTsKLQotLyogTWVtb3J5IGZsYWdzIHdoaWNoIGRlZmF1bHQgdG8gTU9WRUFCTEUgYW5kIERJU0NBUkRBQkxFLiAgKi8KLQotbWVtZmxhZ3NfbW92ZV9kaXNjYXJkOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgbWVtc2V0ICgmJCQsIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotCSAgICAkJC5sYW5ndWFnZSA9IGxhbmd1YWdlOwotCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEUgfCBNRU1GTEFHX0RJU0NBUkRBQkxFOwotCSAgfQotCXwgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIG1lbWZsYWcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247Ci0JICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7Ci0JICB9Ci0JOwotCi0vKiBNZW1vcnkgZmxhZ3Mgd2hpY2ggZGVmYXVsdCB0byBNT1ZFQUJMRS4gICovCi0KLW1lbWZsYWdzX21vdmU6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICBtZW1zZXQgKCYkJCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7Ci0JICAgICQkLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0JICAgICQkLm1lbWZsYWdzID0gTUVNRkxBR19NT1ZFQUJMRTsKLQkgIH0KLQl8IG1lbWZsYWdzX21vdmUgbWVtZmxhZwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgICAkJC5tZW1mbGFncyB8PSAkMi5vbjsKLQkgICAgJCQubWVtZmxhZ3MgJj1+ICQyLm9mZjsKLQkgIH0KLQk7Ci0KLS8qIE1lbW9yeSBmbGFncy4gIFRoaXMgcmV0dXJucyBhIHN0cnVjdCB3aXRoIHR3byBpbnRlZ2VycywgYmVjYXVzZSB3ZQotICAgc29tZXRpbWVzIHdhbnQgdG8gc2V0IGJpdHMgYW5kIHdlIHNvbWV0aW1lcyB3YW50IHRvIGNsZWFyIHRoZW0uICAqLwotCi1tZW1mbGFnOgotCSAgTU9WRUFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCXwgRklYRUQKLQkgIHsKLQkgICAgJCQub24gPSAwOwotCSAgICAkJC5vZmYgPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgfQotCXwgUFVSRQotCSAgewotCSAgICAkJC5vbiA9IE1FTUZMQUdfUFVSRTsKLQkgICAgJCQub2ZmID0gMDsKLQkgIH0KLQl8IElNUFVSRQotCSAgewotCSAgICAkJC5vbiA9IDA7Ci0JICAgICQkLm9mZiA9IE1FTUZMQUdfUFVSRTsKLQkgIH0KLQl8IFBSRUxPQUQKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX1BSRUxPQUQ7Ci0JICAgICQkLm9mZiA9IDA7Ci0JICB9Ci0JfCBMT0FET05DQUxMCi0JICB7Ci0JICAgICQkLm9uID0gMDsKLQkgICAgJCQub2ZmID0gTUVNRkxBR19QUkVMT0FEOwotCSAgfQotCXwgRElTQ0FSREFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX0RJU0NBUkRBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCTsKLQotLyogQSBmaWxlIG5hbWUuICAqLwotCi1maWxlX25hbWU6Ci0JICBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IFNUUklORwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotLyogQSBzdHlsZSBleHByZXNzaW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBzdGF0aWMgdmFyaWFibGUgU1RZTEUuICBXZSBkbwotICAgaXQgdGhpcyB3YXkgYmVjYXVzZSByYyBhcHBlYXJzIHRvIHBlcm1pdCBhIHN0eWxlIHRvIGJlIHNldCB0bwotICAgc29tZXRoaW5nIGxpa2UKLSAgICAgICBXU19HUk9VUCB8IE5PVCBXU19UQUJTVE9QCi0gICB0byBtZWFuIHRoYXQgYSBkZWZhdWx0IG9mIFdTX1RBQlNUT1Agc2hvdWxkIGJlIHJlbW92ZWQuICBBbnl0aGluZwotICAgd2hpY2ggd2FudHMgdG8gYWNjZXB0IGEgc3R5bGUgbXVzdCBmaXJzdCBzZXQgU1RZTEUgdG8gdGhlIGRlZmF1bHQKLSAgIHZhbHVlLiAgVGhlIHN0eWxlZXhwciBub250ZXJtaW5hbCB3aWxsIGNoYW5nZSBTVFlMRSBhcyBzcGVjaWZpZWQgYnkKLSAgIHRoZSB1c2VyLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGhlcmUsCi0gICBqdXN0IG51bWJlcnMgc2VwYXJhdGVkIGJ5ICd8Jy4gICovCi0KLXN0eWxlZXhwcjoKLQkgIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlIHw9ICQxOwotCSAgfQotCXwgTk9UIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlICY9fiAkMjsKLQkgIH0KLQl8IHN0eWxlZXhwciAnfCcgcGFyZW5udW1iZXIKLQkgIHsKLQkgICAgc3R5bGUgfD0gJDM7Ci0JICB9Ci0JfCBzdHlsZWV4cHIgJ3wnIE5PVCBwYXJlbm51bWJlcgotCSAgewotCSAgICBzdHlsZSAmPX4gJDQ7Ci0JICB9Ci0JOwotCi1wYXJlbm51bWJlcjoKLQkgIE5VTUJFUgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQl8ICcoJyBudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCTsKLQotLyogQW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3aXRoIGEgbGVhZGluZyBjb21tYS4gICovCi0KLW9wdGNudW1leHByOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSAwOwotCSAgfQotCXwgY251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEuICAqLwotCi1jbnVtZXhwcjoKLQkgICcsJyBudW1leHByCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBIHBvc3NpYmx5IG5lZ2F0ZWQgbnVtZXJpYyBleHByZXNzaW9uLiAgKi8KLQotbnVtZXhwcjoKLQkgIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEEgcG9zc2libHkgbmVnYXRlZCBleHByZXNzaW9uIHdpdGggYSBzaXplLiAgKi8KLQotc2l6ZWRudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCAnLScgc2l6ZWRudW1leHByICVwcmVjIE5FRwotCSAgewotCSAgICAkJC52YWwgPSAtICQyLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMi5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAqICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAvICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAlICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCArICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAtICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAmICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnXicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCBeICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnfCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCB8ICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEgd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5Ci0gICBuZWdhdGlvbi4gICovCi0KLWNwb3NudW1leHByOgotCSAgJywnIHBvc251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgKi8KLQotcG9zbnVtZXhwcjoKLQkgIHNpemVkcG9zbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgV2Ugc2VwYXJhdGUgdW5hcnkKLSAgIG5lZ2F0aW9uIHRvIGF2b2lkIHBhcnNpbmcgY29uZmxpY3RzIHdoZW4gdHdvIG51bWVyaWMgZXhwcmVzc2lvbnMKLSAgIGFwcGVhciBjb25zZWN1dGl2ZWx5LiAgKi8KLQotc2l6ZWRwb3NudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyonIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy8nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyUnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJysnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy0nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyYnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ14nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgXiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ3wnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgfCAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JOwotCi0lJQotCi0vKiBTZXQgdGhlIGxhbmd1YWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLXZvaWQKLXJjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5nKQotICAgICBpbnQgbGFuZzsKLXsKLSAgbGFuZ3VhZ2UgPSBsYW5nOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmRjb2ZmLmMgYi9iaW51dGlscy9yZGNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlZTZlNi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZGNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDg4OSArMCwwIEBACi0vKiBzdGFicy5jIC0tIFBhcnNlIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggcGFyc2VzIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogRklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0aGlzIEJGRCBpbnRlcm5hbCBmaWxlLiAgV2UgbmVlZCBpdCBmb3IKLSAgIHRoZSBOX0JUTUFTSywgZXRjLiwgdmFsdWVzLiAgKi8KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoZXNlIG1hY3JvcyBleHRyYWN0IHRoZSByaWdodCBtYXNrIGFuZCBzaGlmdHMgZm9yIHRoaXMgQkZELiAgVGhleQotICAgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBsb2NhbCB2YXJpYWJsZSBuYW1lZCBBQkZELiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBtYWNyb3MgbGlrZSBJU0ZDTiBhbmQgREVDUkVGLCBmcm9tIGNvZmYvaW50ZXJuYWwuaCwgd2lsbCB3b3JrCi0gICB3aXRob3V0IG1vZGlmaWNhdGlvbi4gICovCi0jZGVmaW5lIE5fQlRNQVNLIChjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0bWFzaykKLSNkZWZpbmUJTl9CVFNIRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0KQotI2RlZmluZQlOX1RNQVNLICAoY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzaykKLSNkZWZpbmUJTl9UU0hJRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdHNoaWZ0KQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlIHN5bWJvbHMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQKLSAgIGxvY2F0aW9uIHdpdGhpbiB0aGUgc3ltYm9scy4gICovCi0KLXN0cnVjdCBjb2ZmX3N5bWJvbHMKLXsKLSAgLyogVGhlIHN5bWJvbHMuICAqLwotICBhc3ltYm9sICoqc3ltczsKLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgLyogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHN5bWJvbC4gICovCi0gIGxvbmcgc3ltbm87Ci0gIC8qIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzeW1ib2wgaW4gdGhlIENPRkYgc3ltYm9sIHRhYmxlICh3aGVyZQotICAgICBlYWNoIGF1eGVudCBjb3VudHMgYXMgYSBzeW1ib2wpLiAgKi8KLSAgbG9uZyBjb2ZmX3N5bW5vOwotfTsKLQotLyogVGhlIGxhcmdlc3QgYmFzaWMgdHlwZSB3ZSBhcmUgcHJlcGFyZWQgdG8gaGFuZGxlLiAgKi8KLQotI2RlZmluZSBUX01BWCAoVF9MTkdEQkwpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBzbG90cy4gICovCi0KLXN0cnVjdCBjb2ZmX3Nsb3RzCi17Ci0gIC8qIE5leHQgc2V0IG9mIHNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKm5leHQ7Ci0gIC8qIFNsb3RzLiAgKi8KLSNkZWZpbmUgQ09GRl9TTE9UUyAoMTYpCi0gIGRlYnVnX3R5cGUgc2xvdHNbQ09GRl9TTE9UU107Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCBzeW1ib2wgaW5kaWNlcyB0byB0eXBlcy4gICovCi0KLXN0cnVjdCBjb2ZmX3R5cGVzCi17Ci0gIC8qIFNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKnNsb3RzOwotICAvKiBCYXNpYyB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgYmFzaWNbVF9NQVggKyAxXTsKLX07Ci0KLXN0YXRpYyBkZWJ1Z190eXBlICpjb2ZmX2dldF9zbG90IFBBUkFNUyAoKHN0cnVjdCBjb2ZmX3R5cGVzICosIGludCkpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl90eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9zeW1ib2xzICosIHN0cnVjdCBjb2ZmX3R5cGVzICosIGxvbmcsIGludCwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgYm9vbGVhbiwgUFRSKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX2Jhc2VfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBsb25nLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9lbnVtX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9jb2ZmX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwgYXN5bWJvbCAqLCBsb25nLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgUFRSLCBkZWJ1Z190eXBlLCBib29sZWFuKSk7Ci0MCi0vKiBSZXR1cm4gdGhlIHNsb3QgZm9yIGEgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLWNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBpbmR4KQotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGludCBpbmR4OwotewotICBzdHJ1Y3QgY29mZl9zbG90cyAqKnBwczsKLQotICBwcHMgPSAmdHlwZXMtPnNsb3RzOwotCi0gIHdoaWxlIChpbmR4ID49IENPRkZfU0xPVFMpCi0gICAgewotICAgICAgaWYgKCpwcHMgPT0gTlVMTCkKLQl7Ci0JICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0JICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0JfQotICAgICAgcHBzID0gJigqcHBzKS0+bmV4dDsKLSAgICAgIGluZHggLT0gQ09GRl9TTE9UUzsKLSAgICB9Ci0KLSAgaWYgKCpwcHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0gICAgICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0gICAgfQotCi0gIHJldHVybiAoKnBwcyktPnNsb3RzICsgaW5keDsKLX0KLQotLyogUGFyc2UgYSBDT0ZGIHR5cGUgY29kZSBpbiBOVFlQRS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwgdXNlYXV4LAotCQkgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIGJvb2xlYW4gdXNlYXV4OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgZGVidWdfdHlwZSB0eXBlOwotCi0gIGlmICgobnR5cGUgJiB+Tl9CVE1BU0spICE9IDApCi0gICAgewotICAgICAgaW50IG5ld3R5cGU7Ci0KLSAgICAgIG5ld3R5cGUgPSBERUNSRUYgKG50eXBlKTsKLQotICAgICAgaWYgKElTUFRSIChudHlwZSkpCi0JewotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG5ld3R5cGUsCi0JCQkJICBwYXV4ZW50LCB1c2VhdXgsIGRoYW5kbGUpOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0ZDTiAobnR5cGUpKQotCXsKLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBuZXd0eXBlLAotCQkJCSAgcGF1eGVudCwgdXNlYXV4LCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIHR5cGUsIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkJCSAgIGZhbHNlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0FSWSAobnR5cGUpKQotCXsKLQkgIGludCBuOwotCi0JICBpZiAocGF1eGVudCA9PSBOVUxMKQotCSAgICBuID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIHNob3J0ICpkaW07Ci0JICAgICAgaW50IGk7Ci0KLQkgICAgICAvKiBGSVhNRTogSWYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA9PSAwLCBnZGIgc2V0cwotICAgICAgICAgICAgICAgICB0aGUgY19uYXV4IGZpZWxkIG9mIHRoZSBzeW1lbnQgdG8gMC4gICovCi0KLQkgICAgICAvKiBNb3ZlIHRoZSBkaW1lbnNpb25zIGRvd24sIHNvIHRoYXQgdGhlIG5leHQgYXJyYXkKLSAgICAgICAgICAgICAgICAgcGlja3MgdXAgdGhlIG5leHQgb25lLiAgKi8KLQkgICAgICBkaW0gPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuOwotCSAgICAgIG4gPSBkaW1bMF07Ci0JICAgICAgZm9yIChpID0gMDsgKmRpbSAhPSAwICYmIGkgPCBESU1OVU0gLSAxOyBpKyssIGRpbSsrKQotCQkqZGltID0gKihkaW0gKyAxKTsKLQkgICAgICAqZGltID0gMDsKLQkgICAgfQotCi0JICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgY29mZl9zeW1ubywgbmV3dHlwZSwKLQkJCQkgIHBhdXhlbnQsIGZhbHNlLCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIHR5cGUsCi0JCQkJCXBhcnNlX2NvZmZfYmFzZV90eXBlIChhYmZkLCBzeW1ib2xzLAotCQkJCQkJCSAgICAgIHR5cGVzLAotCQkJCQkJCSAgICAgIGNvZmZfc3ltbm8sCi0JCQkJCQkJICAgICAgVF9JTlQsCi0JCQkJCQkJICAgICAgTlVMTCwgZGhhbmRsZSksCi0JCQkJCTAsIG4gLSAxLCBmYWxzZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHBhcnNlX2NvZmZfdHlwZTogQmFkIHR5cGUgY29kZSAweCV4XG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBudHlwZSk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLQotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gIGlmIChwYXV4ZW50ICE9IE5VTEwgJiYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA+IDApCi0gICAgewotICAgICAgZGVidWdfdHlwZSAqc2xvdDsKLQotICAgICAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyB0eXBlLiAgRklYTUU6IGdkYiBjaGVja3MKLQkgdGhhdCB0aGUgY2xhc3MgaXMgbm90IENfU1RSVEFHLCBub3IgQ19VTlRBRywgbm9yIENfRU5UQUcuICAqLwotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sKTsKLSAgICAgIGlmICgqc2xvdCAhPSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuICpzbG90OwotICAgICAgZWxzZQotCXJldHVybiBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsIHNsb3QsIChjb25zdCBjaGFyICopIE5VTEwpOwotICAgIH0KLQotICAvKiBJZiB0aGUgYXV4IGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3Igc29tZXRoaW5nLCB1c2VhdXggd2lsbAotICAgICBoYXZlIGJlZW4gc2V0IHRvIGZhbHNlLCBpbmRpY2F0aW5nIHRoYXQgcGFyc2VfY29mZl9iYXNlX3R5cGUKLSAgICAgc2hvdWxkIG5vdCB1c2UgaXQuICBXZSBuZWVkIHRvIGRvIGl0IHRoaXMgd2F5LCByYXRoZXIgdGhhbiBzaW1wbHkKLSAgICAgcGFzc2luZyBwYXV4ZW50IGFzIE5VTEwsIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIGhhbmRsZQotICAgICBtdWx0aXBsZSBhcnJheSBkaW1lbnNpb25zIHdoaWxlIHN0aWxsIGRpc2NhcmRpbmcgcGF1eGVudCBhZnRlcgotICAgICBoYXZpbmcgaGFuZGxlZCBhbGwgb2YgdGhlbS4gICovCi0gIGlmICghIHVzZWF1eCkKLSAgICBwYXV4ZW50ID0gTlVMTDsKLQotICByZXR1cm4gcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwKLQkJCSAgICAgICBwYXV4ZW50LCBkaGFuZGxlKTsKLX0KLQotLyogUGFyc2UgYSBiYXNpYyBDT0ZGIHR5cGUgaW4gTlRZUEUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwKLQkJICAgICAgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBkZWJ1Z190eXBlIHJldDsKLSAgYm9vbGVhbiBzZXRfYmFzaWM7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGRlYnVnX3R5cGUgKnNsb3Q7Ci0KLSAgaWYgKG50eXBlID49IDAKLSAgICAgICYmIG50eXBlIDw9IFRfTUFYCi0gICAgICAmJiB0eXBlcy0+YmFzaWNbbnR5cGVdICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gdHlwZXMtPmJhc2ljW250eXBlXTsKLQotICBzZXRfYmFzaWMgPSB0cnVlOwotICBuYW1lID0gTlVMTDsKLQotICBzd2l0Y2ggKG50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0ID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfTlVMTDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSAidm9pZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9DSEFSOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NIT1JUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9JTlQ6Ci0gICAgICAvKiBGSVhNRTogUGVyaGFwcyB0aGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCi0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9MT05HOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0ZMT0FUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIG5hbWUgPSAiZmxvYXQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRE9VQkxFOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0xOR0RCTDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTIpOwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VQ0hBUjoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1VTSE9SVDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VSU5UOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VTE9ORzoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdHJ1ZSwgMCwKLQkJCQkgICAgICAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfVU5JT046Ci0gICAgICBpZiAocGF1eGVudCA9PSBOVUxMKQotCXJldCA9IGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGZhbHNlLCAwLCAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRU5VTToKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIChjb25zdCBjaGFyICoqKSBOVUxMLAotCQkJCSAgICAoYmZkX3NpZ25lZF92bWEgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKTsKLQotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBjb2ZmX3N5bW5vKTsKLSAgICAgICpzbG90ID0gcmV0OwotCi0gICAgICBzZXRfYmFzaWMgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHJldCA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgcmV0KTsKLQotICBpZiAoc2V0X2Jhc2ljCi0gICAgICAmJiBudHlwZSA+PSAwCi0gICAgICAmJiBudHlwZSA8PSBUX01BWCkKLSAgICB0eXBlcy0+YmFzaWNbbnR5cGVdID0gcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFBhcnNlIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBsb25nIHN5bWVuZDsKLSAgaW50IGFsbG9jOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICBpbnQgY291bnQ7Ci0gIGJvb2xlYW4gZG9uZTsKLQotICBzeW1lbmQgPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCi0gIGFsbG9jID0gMTA7Ci0gIGZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKLSAgY291bnQgPSAwOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZQotCSAmJiBzeW1ib2xzLT5jb2ZmX3N5bW5vIDwgc3ltZW5kCi0JICYmIHN5bWJvbHMtPnN5bW5vIDwgc3ltYm9scy0+c3ltY291bnQpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgbG9uZyB0aGlzX2NvZmZfc3ltbm87Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBzdWJhdXg7Ci0gICAgICBiZmRfdm1hIGJpdHBvcyA9IDAsIGJpdHNpemUgPSAwOwotCi0gICAgICBzeW0gPSBzeW1ib2xzLT5zeW1zW3N5bWJvbHMtPnN5bW5vXTsKLQotICAgICAgaWYgKCEgYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltLCAmc3ltZW50KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfc3ltZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotCi0gICAgICB0aGlzX2NvZmZfc3ltbm8gPSBzeW1ib2xzLT5jb2ZmX3N5bW5vOwotCi0gICAgICArK3N5bWJvbHMtPnN5bW5vOwotICAgICAgc3ltYm9scy0+Y29mZl9zeW1ubyArPSAxICsgc3ltZW50Lm5fbnVtYXV4OwotCi0gICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCi0JcHN1YmF1eCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltLCAwLCAmYXV4ZW50KSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9hdXhlbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICBwc3ViYXV4ID0gJmF1eGVudDsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfTU9TOgotCWNhc2UgQ19NT1U6Ci0JICBiaXRwb3MgPSA4ICogYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDX0ZJRUxEOgotCSAgYml0cG9zID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfRU9TOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghIGRvbmUpCi0JewotCSAgZGVidWdfdHlwZSBmdHlwZTsKLQkgIGRlYnVnX2ZpZWxkIGY7Ci0KLQkgIGZ0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAotCQkJCSAgIHN5bWVudC5uX3R5cGUsIHBzdWJhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgZiA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGZ0eXBlLAotCQkJCWJpdHBvcywgYml0c2l6ZSwgREVCVUdfVklTSUJJTElUWV9QVUJMSUMpOwotCSAgaWYgKGYgPT0gREVCVUdfRklFTERfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCSAgaWYgKGNvdW50ICsgMSA+PSBhbGxvYykKLQkgICAgewotCSAgICAgIGFsbG9jICs9IDEwOwotCSAgICAgIGZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJCXhyZWFsbG9jIChmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgfQotCi0JICBmaWVsZHNbY291bnRdID0gZjsKLQkgICsrY291bnQ7Ci0JfQotICAgIH0KLQotICBmaWVsZHNbY291bnRdID0gREVCVUdfRklFTERfTlVMTDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgbnR5cGUgPT0gVF9TVFJVQ1QsCi0JCQkJIHBhdXhlbnQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAotCQkJCSBmaWVsZHMpOwotfQotCi0vKiBQYXJzZSBhbiBlbnVtIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlcyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBsb25nIHN5bWVuZDsKLSAgaW50IGFsbG9jOwotICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gIGJmZF9zaWduZWRfdm1hICp2YWxzOwotICBpbnQgY291bnQ7Ci0gIGJvb2xlYW4gZG9uZTsKLQotICBzeW1lbmQgPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCi0gIGFsbG9jID0gMTA7Ci0gIG5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7Ci0gIHZhbHMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKnZhbHMpOwotICBjb3VudCA9IDA7Ci0KLSAgZG9uZSA9IGZhbHNlOwotICB3aGlsZSAoISBkb25lCi0JICYmIHN5bWJvbHMtPmNvZmZfc3ltbm8gPCBzeW1lbmQKLQkgJiYgc3ltYm9scy0+c3ltbm8gPCBzeW1ib2xzLT5zeW1jb3VudCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLQotICAgICAgc3ltID0gc3ltYm9scy0+c3ltc1tzeW1ib2xzLT5zeW1ub107Ci0KLSAgICAgIGlmICghIGJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bSwgJnN5bWVudCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLQotICAgICAgKytzeW1ib2xzLT5zeW1ubzsKLSAgICAgIHN5bWJvbHMtPmNvZmZfc3ltbm8gKz0gMSArIHN5bWVudC5uX251bWF1eDsKLQotICAgICAgc3dpdGNoIChzeW1lbnQubl9zY2xhc3MpCi0JewotCWNhc2UgQ19NT0U6Ci0JICBpZiAoY291bnQgKyAxID49IGFsbG9jKQotCSAgICB7Ci0JICAgICAgYWxsb2MgKz0gMTA7Ci0JICAgICAgbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCSAgICAgICB4cmVhbGxvYyAobmFtZXMsIGFsbG9jICogc2l6ZW9mICpuYW1lcykpOwotCSAgICAgIHZhbHMgPSAoKGJmZF9zaWduZWRfdm1hICopCi0JCSAgICAgIHhyZWFsbG9jICh2YWxzLCBhbGxvYyAqIHNpemVvZiAqdmFscykpOwotCSAgICB9Ci0KLQkgIG5hbWVzW2NvdW50XSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0JICB2YWxzW2NvdW50XSA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgKytjb3VudDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDX0VPUzoKLQkgIGRvbmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBuYW1lc1tjb3VudF0gPSBOVUxMOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2VudW1fdHlwZSAoZGhhbmRsZSwgbmFtZXMsIHZhbHMpOwotfQotCi0vKiBIYW5kbGUgYSBzaW5nbGUgQ09GRiBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfY29mZl9zeW1ib2wgKGFiZmQsIHR5cGVzLCBzeW0sIGNvZmZfc3ltbm8sIHBzeW1lbnQsIGRoYW5kbGUsIHR5cGUsCi0JCSAgIHdpdGhpbl9mdW5jdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBsb25nIGNvZmZfc3ltbm87Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnBzeW1lbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJvb2xlYW4gd2l0aGluX2Z1bmN0aW9uOwotewotICBzd2l0Y2ggKHBzeW1lbnQtPm5fc2NsYXNzKQotICAgIHsKLSAgICBjYXNlIENfTlVMTDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0FVVE86Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgREVCVUdfTE9DQUwsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19FWFQ6Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgREVCVUdfR0xPQkFMLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfU1RBVDoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICAod2l0aGluX2Z1bmN0aW9uCi0JCQkJICAgID8gREVCVUdfTE9DQUxfU1RBVElDCi0JCQkJICAgIDogREVCVUdfU1RBVElDKSwKLQkJCQkgICBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfUkVHOgotICAgICAgLyogRklYTUU6IFdlIG1heSBuZWVkIHRvIGNvbnZlcnQgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgREVCVUdfUkVHSVNURVIsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19MQUJFTDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0FSRzoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgIERFQlVHX1BBUk1fU1RBQ0ssIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgICAgLyogRklYTUU6IFdlIG1heSBuZWVkIHRvIGNvbnZlcnQgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAotCQkJCSAgICBERUJVR19QQVJNX1JFRywgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1RQREVGOgotICAgICAgdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSk7Ci0gICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfU1RSVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICBjYXNlIENfRU5UQUc6Ci0gICAgICB7Ci0JZGVidWdfdHlwZSAqc2xvdDsKLQotCXR5cGUgPSBkZWJ1Z190YWdfdHlwZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSk7Ci0JaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogU3RvcmUgdGhlIG5hbWVkIHR5cGUgaW50byB0aGUgc2xvdCwgc28gdGhhdCByZWZlcmVuY2VzIGdldAotICAgICAgICAgICB0aGUgbmFtZS4gICovCi0Jc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBjb2ZmX3N5bW5vKTsKLQkqc2xvdCA9IHR5cGU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7CQkJCSAgIAotfQotCi0vKiBUaGlzIGlzIHRoZSBtYWluIHJvdXRpbmUuICBJdCBsb29rcyB0aHJvdWdoIGFsbCB0aGUgc3ltYm9scyBhbmQKLSAgIGhhbmRsZXMgdGhlbS4gICovCi0KLWJvb2xlYW4KLXBhcnNlX2NvZmYgKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgc3RydWN0IGNvZmZfc3ltYm9scyBzeW1ib2xzOwotICBzdHJ1Y3QgY29mZl90eXBlcyB0eXBlczsKLSAgaW50IGk7Ci0gIGxvbmcgbmV4dF9jX2ZpbGU7Ci0gIGNvbnN0IGNoYXIgKmZubmFtZTsKLSAgaW50IGZuY2xhc3M7Ci0gIGludCBmbnR5cGU7Ci0gIGJmZF92bWEgZm5lbmQ7Ci0gIGFsZW50ICpsaW5lbm9zOwotICBib29sZWFuIHdpdGhpbl9mdW5jdGlvbjsKLSAgbG9uZyB0aGlzX2NvZmZfc3ltbm87Ci0KLSAgc3ltYm9scy5zeW1zID0gc3ltczsKLSAgc3ltYm9scy5zeW1jb3VudCA9IHN5bWNvdW50OwotICBzeW1ib2xzLnN5bW5vID0gMDsKLSAgc3ltYm9scy5jb2ZmX3N5bW5vID0gMDsKLQotICB0eXBlcy5zbG90cyA9IE5VTEw7Ci0gIGZvciAoaSA9IDA7IGkgPD0gVF9NQVg7IGkrKykKLSAgICB0eXBlcy5iYXNpY1tpXSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICBuZXh0X2NfZmlsZSA9IC0xOwotICBmbm5hbWUgPSBOVUxMOwotICBmbmNsYXNzID0gMDsKLSAgZm50eXBlID0gMDsKLSAgZm5lbmQgPSAwOwotICBsaW5lbm9zID0gTlVMTDsKLSAgd2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7Ci0KLSAgd2hpbGUgKHN5bWJvbHMuc3ltbm8gPCBzeW1jb3VudCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4ZW50OwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICpwYXV4OwotICAgICAgZGVidWdfdHlwZSB0eXBlOwotCi0gICAgICBzeW0gPSBzeW1zW3N5bWJvbHMuc3ltbm9dOwotCi0gICAgICBpZiAoISBiZmRfY29mZl9nZXRfc3ltZW50IChhYmZkLCBzeW0sICZzeW1lbnQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9zeW1lbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0KLSAgICAgIHRoaXNfY29mZl9zeW1ubyA9IHN5bWJvbHMuY29mZl9zeW1ubzsKLQotICAgICAgKytzeW1ib2xzLnN5bW5vOwotICAgICAgc3ltYm9scy5jb2ZmX3N5bW5vICs9IDEgKyBzeW1lbnQubl9udW1hdXg7Ci0KLSAgICAgIC8qIFdlIG9ubHkgd29ycnkgYWJvdXQgdGhlIGZpcnN0IGF1eGVudCwgYmVjYXVzZSB0aGF0IGlzIHRoZQotCSBvbmx5IG9uZSB3aGljaCBpcyByZWxldmFudCBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChzeW1lbnQubl9udW1hdXggPT0gMCkKLQlwYXV4ID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfY29mZl9nZXRfYXV4ZW50IChhYmZkLCBzeW0sIDAsICZhdXhlbnQpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X2F1eGVudCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgcGF1eCA9ICZhdXhlbnQ7Ci0JfQotCi0gICAgICBpZiAodGhpc19jb2ZmX3N5bW5vID09IG5leHRfY19maWxlICYmIHN5bWVudC5uX3NjbGFzcyAhPSBDX0ZJTEUpCi0JewotCSAgLyogVGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBwb2ludHMgdG8gdGhlIGZpcnN0IGV4dGVybmFsCi0gICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoZGhhbmRsZSwgIipnbG9iYWxzKiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHN5bWVudC5uX3NjbGFzcykKLQl7Ci0JY2FzZSBDX0VGQ046Ci0JY2FzZSBDX0VYVERFRjoKLQljYXNlIENfVUxBQkVMOgotCWNhc2UgQ19VU1RBVElDOgotCWNhc2UgQ19MSU5FOgotCWNhc2UgQ19BTElBUzoKLQljYXNlIENfSElEREVOOgotCSAgLyogSnVzdCBpZ25vcmUgdGhlc2UgY2xhc3Nlcy4gICovCi0JICBicmVhazsKLQotCWNhc2UgQ19GSUxFOgotCSAgbmV4dF9jX2ZpbGUgPSBzeW1lbnQubl92YWx1ZTsKLQkgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoZGhhbmRsZSwgbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBDX1NUQVQ6Ci0JICAvKiBJZ25vcmUgc3RhdGljIHN5bWJvbHMgd2l0aCBhIHR5cGUgb2YgVF9OVUxMLiAgVGhlc2UKLSAgICAgICAgICAgICByZXByZXNlbnQgc2VjdGlvbiBlbnRyaWVzLiAgKi8KLQkgIGlmIChzeW1lbnQubl90eXBlID09IFRfTlVMTCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgQ19FWFQ6Ci0JICBpZiAoSVNGQ04gKHN5bWVudC5uX3R5cGUpKQotCSAgICB7Ci0JICAgICAgZm5uYW1lID0gbmFtZTsKLQkgICAgICBmbmNsYXNzID0gc3ltZW50Lm5fc2NsYXNzOwotCSAgICAgIGZudHlwZSA9IHN5bWVudC5uX3R5cGU7Ci0JICAgICAgaWYgKHN5bWVudC5uX251bWF1eCA+IDApCi0JCWZuZW5kID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgKyBhdXhlbnQueF9zeW0ueF9taXNjLnhfZnNpemU7Ci0JICAgICAgZWxzZQotCQlmbmVuZCA9IDA7Ci0JICAgICAgbGluZW5vcyA9IEJGRF9TRU5EIChhYmZkLCBfZ2V0X2xpbmVubywgKGFiZmQsIHN5bSkpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCAmc3ltYm9scywgJnR5cGVzLCB0aGlzX2NvZmZfc3ltbm8sCi0JCQkJICBzeW1lbnQubl90eXBlLCBwYXV4LCB0cnVlLCBkaGFuZGxlKTsKLQkgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCEgcGFyc2VfY29mZl9zeW1ib2wgKGFiZmQsICZ0eXBlcywgc3ltLCB0aGlzX2NvZmZfc3ltbm8sICZzeW1lbnQsCi0JCQkJICAgZGhhbmRsZSwgdHlwZSwgd2l0aGluX2Z1bmN0aW9uKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfRkNOOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5iZiIpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoZm5uYW1lID09IE5VTEwpCi0JCXsKLQkJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlbGQ6IC5iZiB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIiksCi0JCQkgICBwcm9ncmFtX25hbWUsIHRoaXNfY29mZl9zeW1ubyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCAmc3ltYm9scywgJnR5cGVzLCB0aGlzX2NvZmZfc3ltbm8sCi0JCQkJICAgICAgREVDUkVGIChmbnR5cGUpLCBwYXV4LCBmYWxzZSwgZGhhbmRsZSk7Ci0JICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGRoYW5kbGUsIGZubmFtZSwgdHlwZSwKLQkJCQkJICAgZm5jbGFzcyA9PSBDX0VYVCwKLQkJCQkJICAgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAobGluZW5vcyAhPSBOVUxMKQotCQl7Ci0JCSAgaW50IGJhc2U7Ci0JCSAgYmZkX3ZtYSBhZGRyOwotCi0JCSAgaWYgKHN5bWVudC5uX251bWF1eCA9PSAwKQotCQkgICAgYmFzZSA9IDA7Ci0JCSAgZWxzZQotCQkgICAgYmFzZSA9IGF1eGVudC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubyAtIDE7Ci0KLQkJICBhZGRyID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKTsKLQotCQkgICsrbGluZW5vczsKLQotCQkgIHdoaWxlIChsaW5lbm9zLT5saW5lX251bWJlciAhPSAwKQotCQkgICAgewotCQkgICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfbGluZSAoZGhhbmRsZSwKLQkJCQkJICAgICAgIGxpbmVub3MtPmxpbmVfbnVtYmVyICsgYmFzZSwKLQkJCQkJICAgICAgIGxpbmVub3MtPnUub2Zmc2V0ICsgYWRkcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgICsrbGluZW5vczsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZm5uYW1lID0gTlVMTDsKLQkgICAgICBsaW5lbm9zID0gTlVMTDsKLQkgICAgICBmbmNsYXNzID0gMDsKLQkgICAgICBmbnR5cGUgPSAwOwotCi0JICAgICAgd2l0aGluX2Z1bmN0aW9uID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmVmIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIHdpdGhpbl9mdW5jdGlvbikKLQkJewotCQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVsZDogdW5leHBlY3RlZCAuZWZcbiIpLAotCQkJICAgcHJvZ3JhbV9uYW1lLCB0aGlzX2NvZmZfc3ltbm8pOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gZm5lbmQpCi0JCWZuZW5kID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICAgICAgaWYgKCEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCBmbmVuZCkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGZuZW5kID0gMDsKLQkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIENfQkxPQ0s6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmJiIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X2Jsb2NrIChkaGFuZGxlLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmViIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX2VuZF9ibG9jayAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgIHN5bWVudC5uX3R5cGUsIHBhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoISBwYXJzZV9jb2ZmX3N5bWJvbCAoYWJmZCwgJnR5cGVzLCBzeW0sIHRoaXNfY29mZl9zeW1ubywgJnN5bWVudCwKLQkJCQkgICBkaGFuZGxlLCB0eXBlLCB3aXRoaW5fZnVuY3Rpb24pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmRkYmcuYyBiL2JpbnV0aWxzL3JkZGJnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjA1NmUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmRkYmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKiByZGRiZy5jIC0tIFJlYWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludG8gYSBnZW5lcmljIGZvcm0uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSByZWFkcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50byBhIGdlbmVyaWMgZm9ybS4gIFRoaXMKLSAgIGZpbGUga25vd3MgaG93IHRvIGRpZyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIG91dCBvZiBhbiBvYmplY3QKLSAgIGZpbGUuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi1zdGF0aWMgYm9vbGVhbiByZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGxvbmcsIFBUUiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiByZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZywgUFRSLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgUFRSLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIHNhdmVfc3RhYiBQQVJBTVMgKChpbnQsIGludCwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBzdGFiX2NvbnRleHQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV9zYXZlZF9zdGFicyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFJlYWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBCRkQuICBSZXR1cm5zIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcKLSAgIHBvaW50ZXIuICAqLwotCi1QVFIKLXJlYWRfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotewotICBQVFIgZGhhbmRsZTsKLSAgYm9vbGVhbiBmb3VuZDsKLQotICBkaGFuZGxlID0gZGVidWdfaW5pdCAoKTsKLSAgaWYgKGRoYW5kbGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISByZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlLAotCQkJCQkgICAmZm91bmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotICAgIHsKLSAgICAgIGlmICghIHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwKLQkJCQkJICAgICAgJmZvdW5kKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIpCi0gICAgewotICAgICAgaWYgKCEgcmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBkaGFuZGxlLCAmZm91bmQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBUcnkgcmVhZGluZyB0aGUgQ09GRiBzeW1ib2xzIGlmIHdlIGRpZG4ndCBmaW5kIGFueSBzdGFicyBpbiBDT0ZGCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgZm91bmQKLSAgICAgICYmIGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgICYmIHN5bWNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBpZiAoISBwYXJzZV9jb2ZmIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBmb3VuZCA9IHRydWU7Ci0gICAgfQotCi0gIGlmICghIGZvdW5kKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHJlY29nbml6ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iKSwKLQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkaGFuZGxlOwotfQotCi0vKiBSZWFkIHN0YWJzIGluIHNlY3Rpb25zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsIHBmb3VuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGJvb2xlYW4gKnBmb3VuZDsKLXsKLSAgc3RhdGljIHN0cnVjdAotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gICAgICBjb25zdCBjaGFyICpzdHJzZWNuYW1lOwotICAgIH0gbmFtZXNbXSA9IHsgeyAiLnN0YWIiLCAiLnN0YWJzdHIiIH0gfTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIFBUUiBzaGFuZGxlOwotCi0gICpwZm91bmQgPSBmYWxzZTsKLSAgc2hhbmRsZSA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBuYW1lcyAvIHNpemVvZiBuYW1lc1swXTsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWMsICpzdHJzZWM7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lc1tpXS5zZWNuYW1lKTsKLSAgICAgIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lc1tpXS5zdHJzZWNuYW1lKTsKLSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBzdHJzZWMgIT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHN0YWJzaXplLCBzdHJzaXplOwotCSAgYmZkX2J5dGUgKnN0YWJzLCAqc3RyaW5nczsKLQkgIGJmZF9ieXRlICpzdGFiOwotCSAgYmZkX3NpemVfdHlwZSBzdHJvZmYsIG5leHRfc3Ryb2ZmOwotCi0JICBzdGFic2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYyk7Ci0JICBzdGFicyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzdGFic2l6ZSk7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgc3RhYnMsIDAsIHN0YWJzaXplKSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsCi0JCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZXNbaV0uc2VjbmFtZSwKLQkJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgc3Ryc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0cnNlYyk7Ci0JICBzdHJpbmdzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0cnNpemUpOwotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdHJzZWMsIHN0cmluZ3MsIDAsIHN0cnNpemUpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lc1tpXS5zdHJzZWNuYW1lLAotCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc2hhbmRsZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2hhbmRsZSA9IHN0YXJ0X3N0YWIgKGRoYW5kbGUsIGFiZmQsIHRydWUsIHN5bXMsIHN5bWNvdW50KTsKLQkgICAgICBpZiAoc2hhbmRsZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgKnBmb3VuZCA9IHRydWU7Ci0KLQkgIHN0cm9mZiA9IDA7Ci0JICBuZXh0X3N0cm9mZiA9IDA7Ci0JICBmb3IgKHN0YWIgPSBzdGFiczsgc3RhYiA8IHN0YWJzICsgc3RhYnNpemU7IHN0YWIgKz0gMTIpCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHN0cng7Ci0JICAgICAgaW50IHR5cGU7Ci0JICAgICAgaW50IG90aGVyOwotCSAgICAgIGludCBkZXNjOwotCSAgICAgIGJmZF92bWEgdmFsdWU7Ci0KLQkgICAgICAvKiBUaGlzIGNvZGUgcHJlc3VtZXMgMzIgYml0IHZhbHVlcy4gICovCi0KLQkgICAgICBzdHJ4ID0gYmZkX2dldF8zMiAoYWJmZCwgc3RhYik7Ci0JICAgICAgdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3RhYiArIDQpOwotCSAgICAgIG90aGVyID0gYmZkX2dldF84IChhYmZkLCBzdGFiICsgNSk7Ci0JICAgICAgZGVzYyA9IGJmZF9nZXRfMTYgKGFiZmQsIHN0YWIgKyA2KTsKLQkgICAgICB2YWx1ZSA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyA4KTsKLQotCSAgICAgIGlmICh0eXBlID09IDApCi0JCXsKLQkJICAvKiBTcGVjaWFsIHR5cGUgMCBzdGFicyBpbmRpY2F0ZSB0aGUgb2Zmc2V0IHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgbmV4dCBzdHJpbmcgdGFibGUuICAqLwotCQkgIHN0cm9mZiA9IG5leHRfc3Ryb2ZmOwotCQkgIG5leHRfc3Ryb2ZmICs9IHZhbHVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqZiwgKnM7Ci0KLQkJICBmID0gTlVMTDsKLQkJICAKLQkJICBpZiAoc3Ryb2ZmICsgc3RyeCA+IHN0cnNpemUpCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogc3RhYiBlbnRyeSAlZCBpcyBjb3JydXB0LCBzdHJ4ID0gMHgleCwgdHlwZSA9ICVkXG4iLAotCQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lc1tpXS5zZWNuYW1lLAotCQkJICAgICAgIChzdGFiIC0gc3RhYnMpIC8gMTIsIHN0cngsIHR5cGUpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICAKLQkJICBzID0gKGNoYXIgKikgc3RyaW5ncyArIHN0cm9mZiArIHN0cng7Ci0JCSAgCi0JCSAgd2hpbGUgKHNbc3RybGVuIChzKSAtIDFdID09ICdcXCcKLQkJCSAmJiBzdGFiICsgMTIgPCBzdGFicyArIHN0YWJzaXplKQotCQkgICAgewotCQkgICAgICBjaGFyICpwOwotCi0JCSAgICAgIHN0YWIgKz0gMTI7Ci0JCSAgICAgIHAgPSBzICsgc3RybGVuIChzKSAtIDE7Ci0JCSAgICAgICpwID0gJ1wwJzsKLQkJICAgICAgcyA9IGNvbmNhdCAocywKLQkJCQkgICgoY2hhciAqKSBzdHJpbmdzCi0JCQkJICAgKyBzdHJvZmYKLQkJCQkgICArIGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIpKSwKLQkJCQkgIChjb25zdCBjaGFyICopIE5VTEwpOwotCi0JCSAgICAgIC8qIFdlIGhhdmUgdG8gcmVzdG9yZSB0aGUgYmFja3NsYXNoLCBiZWNhdXNlLCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rZXIgaXMgaGFzaGluZyBzdGFicyBzdHJpbmdzLCB3ZSBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgdGhlIHNhbWUgc3RyaW5nIG1vcmUgdGhhbiBvbmNlLiAgKi8KLQkJICAgICAgKnAgPSAnXFwnOwotCi0JCSAgICAgIGlmIChmICE9IE5VTEwpCi0JCQlmcmVlIChmKTsKLQkJICAgICAgZiA9IHM7Ci0JCSAgICB9Ci0KLQkJICBzYXZlX3N0YWIgKHR5cGUsIGRlc2MsIHZhbHVlLCBzKTsKLQotCQkgIGlmICghIHBhcnNlX3N0YWIgKGRoYW5kbGUsIHNoYW5kbGUsIHR5cGUsIGRlc2MsIHZhbHVlLCBzKSkKLQkJICAgIHsKLQkJICAgICAgc3RhYl9jb250ZXh0ICgpOwotCQkgICAgICBmcmVlX3NhdmVkX3N0YWJzICgpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBEb24ndCBmcmVlIGYsIHNpbmNlIEkgdGhpbmsgdGhlIHN0YWJzIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgIGV4cGVjdHMgc3RyaW5ncyB0byBoYW5nIGFyb3VuZC4gIFRoaXMgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICBzdHJhaWdodGVuZWQgb3V0LiAgRklYTUUuICAqLwotCQl9Ci0JICAgIH0KLQotCSAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQkgIGZyZWUgKHN0YWJzKTsKLQotCSAgLyogRG9uJ3QgZnJlZSBzdHJpbmdzLCBzaW5jZSBJIHRoaW5rIHRoZSBzdGFicyBjb2RlIGV4cGVjdHMKLSAgICAgICAgICAgICB0aGUgc3RyaW5ncyB0byBoYW5nIGFyb3VuZC4gIFRoaXMgc2hvdWxkIGJlIHN0cmFpZ2h0ZW5lZAotICAgICAgICAgICAgIG91dC4gIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIGlmIChzaGFuZGxlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgZmluaXNoX3N0YWIgKGRoYW5kbGUsIHNoYW5kbGUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgc3RhYnMgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1yZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsIHBmb3VuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGJvb2xlYW4gKnBmb3VuZDsKLXsKLSAgUFRSIHNoYW5kbGU7Ci0gIGFzeW1ib2wgKipwcywgKipzeW1lbmQ7Ci0KLSAgc2hhbmRsZSA9IE5VTEw7Ci0gIHN5bWVuZCA9IHN5bXMgKyBzeW1jb3VudDsKLSAgZm9yIChwcyA9IHN5bXM7IHBzIDwgc3ltZW5kOyBwcysrKQotICAgIHsKLSAgICAgIHN5bWJvbF9pbmZvIGk7Ci0KLSAgICAgIGJmZF9nZXRfc3ltYm9sX2luZm8gKGFiZmQsICpwcywgJmkpOwotCi0gICAgICBpZiAoaS50eXBlID09ICctJykKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCSAgY2hhciAqZjsKLQotCSAgaWYgKHNoYW5kbGUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNoYW5kbGUgPSBzdGFydF9zdGFiIChkaGFuZGxlLCBhYmZkLCBmYWxzZSwgc3ltcywgc3ltY291bnQpOwotCSAgICAgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAqcGZvdW5kID0gdHJ1ZTsKLQotCSAgcyA9IGkubmFtZTsKLQkgIGYgPSBOVUxMOwotCSAgd2hpbGUgKHNbc3RybGVuIChzKSAtIDFdID09ICdcXCcKLQkJICYmIHBzICsgMSA8IHN5bWVuZCkKLQkgICAgewotCSAgICAgIGNoYXIgKnNjLCAqbjsKLQotCSAgICAgICsrcHM7Ci0JICAgICAgc2MgPSB4c3RyZHVwIChzKTsKLQkgICAgICBzY1tzdHJsZW4gKHNjKSAtIDFdID0gJ1wwJzsKLQkgICAgICBuID0gY29uY2F0IChzYywgYmZkX2FzeW1ib2xfbmFtZSAoKnBzKSwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JICAgICAgZnJlZSAoc2MpOwotCSAgICAgIGlmIChmICE9IE5VTEwpCi0JCWZyZWUgKGYpOwotCSAgICAgIGYgPSBuOwotCSAgICAgIHMgPSBuOwotCSAgICB9Ci0KLQkgIHNhdmVfc3RhYiAoaS5zdGFiX3R5cGUsIGkuc3RhYl9kZXNjLCBpLnZhbHVlLCBzKTsKLQotCSAgaWYgKCEgcGFyc2Vfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSwgaS5zdGFiX3R5cGUsIGkuc3RhYl9kZXNjLAotCQkJICAgIGkudmFsdWUsIHMpKQotCSAgICB7Ci0JICAgICAgc3RhYl9jb250ZXh0ICgpOwotCSAgICAgIGZyZWVfc2F2ZWRfc3RhYnMgKCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIERvbid0IGZyZWUgZiwgc2luY2UgSSB0aGluayB0aGUgc3RhYnMgY29kZSBleHBlY3RzCi0JICAgICBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUgc3RyYWlnaHRlbmVkIG91dC4KLQkgICAgIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIGZyZWVfc2F2ZWRfc3RhYnMgKCk7Ci0KLSAgaWYgKHNoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBmaW5pc2hfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1yZWFkX2llZWVfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUsIHBmb3VuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBhc2VjdGlvbiAqZHNlYzsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLSAgLyogVGhlIEJGRCBiYWNrZW5kIHB1dHMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEgc2VjdGlvbgotICAgICBuYW1lZCAuZGVidWcuICAqLwotCi0gIGRzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOwotICBpZiAoZHNlYyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkc2VjKTsKLSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc2l6ZSk7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZHNlYywgY29udGVudHMsIDAsIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBwYXJzZV9pZWVlIChkaGFuZGxlLCBhYmZkLCBjb250ZW50cywgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGNvbnRlbnRzKTsKLQotICAqcGZvdW5kID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlY29yZCBzdGFicyBzdHJpbmdzLCBzbyB0aGF0IHdlIGNhbiBnaXZlIHNvbWUgY29udGV4dCBmb3IgZXJyb3JzLiAgKi8KLQotI2RlZmluZSBTQVZFX1NUQUJTX0NPVU5UICgxNikKLQotc3RydWN0IHNhdmVkX3N0YWIKLXsKLSAgaW50IHR5cGU7Ci0gIGludCBkZXNjOwotICBiZmRfdm1hIHZhbHVlOwotICBjaGFyICpzdHJpbmc7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNhdmVkX3N0YWIgc2F2ZWRfc3RhYnNbU0FWRV9TVEFCU19DT1VOVF07Ci1zdGF0aWMgaW50IHNhdmVkX3N0YWJzX2luZGV4OwotCi0vKiBTYXZlIGEgc3RhYnMgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXNhdmVfc3RhYiAodHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBkZXNjOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nICE9IE5VTEwpCi0gICAgZnJlZSAoc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnN0cmluZyk7Ci0gIHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS50eXBlID0gdHlwZTsKLSAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLmRlc2MgPSBkZXNjOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0udmFsdWUgPSB2YWx1ZTsKLSAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnN0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7Ci0gIHNhdmVkX3N0YWJzX2luZGV4ID0gKHNhdmVkX3N0YWJzX2luZGV4ICsgMSkgJSBTQVZFX1NUQUJTX0NPVU5UOwotfQotCi0vKiBQcm92aWRlIGNvbnRleHQgZm9yIGFuIGVycm9yLiAgKi8KLQotc3RhdGljIHZvaWQKLXN0YWJfY29udGV4dCAoKQotewotICBpbnQgaTsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIkxhc3Qgc3RhYnMgZW50cmllcyBiZWZvcmUgZXJyb3I6XG4iKSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIm5fdHlwZSBuX2Rlc2Mgbl92YWx1ZSAgc3RyaW5nXG4iKTsKLQotICBpID0gc2F2ZWRfc3RhYnNfaW5kZXg7Ci0gIGRvCi0gICAgewotICAgICAgc3RydWN0IHNhdmVkX3N0YWIgKnN0YWJwOwotCi0gICAgICBzdGFicCA9IHNhdmVkX3N0YWJzICsgaTsKLSAgICAgIGlmIChzdGFicC0+c3RyaW5nICE9IE5VTEwpCi0JewotCSAgY29uc3QgY2hhciAqczsKLQotCSAgcyA9IGJmZF9nZXRfc3RhYl9uYW1lIChzdGFicC0+dHlwZSk7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIlLTZzIiwgcyk7Ci0JICBlbHNlIGlmIChzdGFicC0+dHlwZSA9PSAwKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJIZHJTeW0iKTsKLQkgIGVsc2UKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAiJS02ZCIsIHN0YWJwLT50eXBlKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiAlLTZkICIsIHN0YWJwLT5kZXNjKTsKLQkgIGZwcmludGZfdm1hIChzdGRlcnIsIHN0YWJwLT52YWx1ZSk7Ci0JICBpZiAoc3RhYnAtPnR5cGUgIT0gMCkKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgc3RhYnAtPnN0cmluZyk7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotCX0KLSAgICAgIGkgPSAoaSArIDEpICUgU0FWRV9TVEFCU19DT1VOVDsKLSAgICB9Ci0gIHdoaWxlIChpICE9IHNhdmVkX3N0YWJzX2luZGV4KTsKLX0KLQotLyogRnJlZSB0aGUgc2F2ZWQgc3RhYiBzdHJpbmdzLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfc2F2ZWRfc3RhYnMgKCkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IFNBVkVfU1RBQlNfQ09VTlQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2F2ZWRfc3RhYnNbaV0uc3RyaW5nICE9IE5VTEwpCi0JewotCSAgZnJlZSAoc2F2ZWRfc3RhYnNbaV0uc3RyaW5nKTsKLQkgIHNhdmVkX3N0YWJzW2ldLnN0cmluZyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBzYXZlZF9zdGFic19pbmRleCA9IDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZWFkZWxmLmMgYi9iaW51dGlscy9yZWFkZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMWUxMjcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVhZGVsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM1MyArMCwwIEBACi0vKiByZWFkZWxmLmMgLS0gZGlzcGxheSBjb250ZW50cyBvZiBhbiBFTEYgZm9ybWF0IGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgOTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT4KLSAgIE1vZGlmaWNhdGlvbnMgYnkgTmljayBDbGlmdG9uIDxuaWNrY0BjeWdudXMuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmIF9fR05VQ19fID49IDIKLS8qIERlZmluZSBCRkQ2NCBoZXJlLCBldmVuIGlmIG91ciBkZWZhdWx0IGFyY2hpdGVjdHVyZSBpcyAzMiBiaXQgRUxGCi0gICBhcyB0aGlzIHdpbGwgYWxsb3cgdXMgdG8gcmVhZCBpbiBhbmQgcGFyc2UgNjRiaXQgYW5kIDMyYml0IEVMRiBmaWxlcy4KLSAgIE9ubHkgZG8gdGhpcyBpZiB3ZSBiZWxpdmUgdGhhdCB0aGUgY29tcGlsZXIgY2FuIHN1cHBvcnQgYSA2NCBiaXQKLSAgIGRhdGEgdHlwZS4gIEZvciBub3cgd2Ugb25seSByZWx5IG9uIEdDQyBiZWluZyBhYmxlIHRvIGRvIHRoaXMuICAqLwotI2RlZmluZSBCRkQ2NAotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotI2luY2x1ZGUgImVsZi9jb21tb24uaCIKLSNpbmNsdWRlICJlbGYvZXh0ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvZHdhcmYyLmgiCi0KLS8qIFRoZSBmb2xsb3dpbmcgaGVhZGVycyB1c2UgdGhlIGVsZi9yZWxvYy1tYWNyb3MuaCBmaWxlIHRvCi0gICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHJlbG9jYXRpb24gcmVjb2duaXRpb24gZnVuY3Rpb25zCi0gICBzdWNoIGFzIGVsZl9taXBzX3JlbG9jX3R5cGUoKSAgKi8KLQotI2RlZmluZSBSRUxPQ19NQUNST1NfR0VOX0ZVTkMKLQotI2luY2x1ZGUgImVsZi9pMzg2LmgiCi0jaW5jbHVkZSAiZWxmL3Y4NTAuaCIKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLSNpbmNsdWRlICJlbGYvYWxwaGEuaCIKLSNpbmNsdWRlICJlbGYvYXJtLmgiCi0jaW5jbHVkZSAiZWxmL202OGsuaCIKLSNpbmNsdWRlICJlbGYvc3BhcmMuaCIKLSNpbmNsdWRlICJlbGYvbTMyci5oIgotI2luY2x1ZGUgImVsZi9kMTB2LmgiCi0jaW5jbHVkZSAiZWxmL2QzMHYuaCIKLSNpbmNsdWRlICJlbGYvc2guaCIKLSNpbmNsdWRlICJlbGYvbW4xMDIwMC5oIgotI2luY2x1ZGUgImVsZi9tbjEwMzAwLmgiCi0jaW5jbHVkZSAiZWxmL2hwcGEuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0jaW5jbHVkZSAiZWxmL2ZyMzAuaCIKLSNpbmNsdWRlICJlbGYvbWNvcmUuaCIKLSNpbmNsdWRlICJlbGYvaTk2MC5oIgotI2luY2x1ZGUgImVsZi9wai5oIgotI2luY2x1ZGUgImVsZi9hdnIuaCIKLQotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi1jaGFyICogICAgICAgICAgCXByb2dyYW1fbmFtZSA9ICJyZWFkZWxmIjsKLXVuc2lnbmVkIGludCAgICAJZHluYW1pY19hZGRyOwotYmZkX3NpemVfdHlwZSAgCQlkeW5hbWljX3NpemU7Ci11bnNpZ25lZCBpbnQgICAgCXJlbGFfYWRkcjsKLXVuc2lnbmVkIGludCAgICAJcmVsYV9zaXplOwotY2hhciAqICAgICAgICAgIAlkeW5hbWljX3N0cmluZ3M7Ci1jaGFyICoJCQlzdHJpbmdfdGFibGU7Ci11bnNpZ25lZCBsb25nICAgICAgICAgICBudW1fZHluYW1pY19zeW1zOwotRWxmX0ludGVybmFsX1N5bSAqIAlkeW5hbWljX3N5bWJvbHM7Ci1FbGZfSW50ZXJuYWxfU3ltaW5mbyAqCWR5bmFtaWNfc3ltaW5mbzsKLXVuc2lnbmVkIGxvbmcgICAJZHluYW1pY19zeW1pbmZvX29mZnNldDsKLXVuc2lnbmVkIGludAkJZHluYW1pY19zeW1pbmZvX25lbnQ7Ci1jaGFyICAgICAgICAgICAgCXByb2dyYW1faW50ZXJwcmV0ZXIgWzY0XTsKLWludCAgICAgICAgICAgICAJZHluYW1pY19pbmZvW0RUX0pNUFJFTCArIDFdOwotaW50ICAgICAgICAgICAgIAl2ZXJzaW9uX2luZm9bMTZdOwotaW50ICAgICAgICAgICAgIAlsb2FkYWRkciA9IDA7Ci1FbGZfSW50ZXJuYWxfRWhkciAgICAgICBlbGZfaGVhZGVyOwotRWxmX0ludGVybmFsX1NoZHIgKiAgICAgc2VjdGlvbl9oZWFkZXJzOwotRWxmX0ludGVybmFsX0R5biAqICAgICAgZHluYW1pY19zZWdtZW50OwotaW50IAkJCXNob3dfbmFtZTsKLWludCAJCQlkb19keW5hbWljOwotaW50IAkJCWRvX3N5bXM7Ci1pbnQgCQkJZG9fcmVsb2M7Ci1pbnQgCQkJZG9fc2VjdGlvbnM7Ci1pbnQgCQkJZG9fc2VnbWVudHM7Ci1pbnQgCQkJZG9fdXNpbmdfZHluYW1pYzsKLWludCAJCQlkb19oZWFkZXI7Ci1pbnQgCQkJZG9fZHVtcDsKLWludCAJCQlkb192ZXJzaW9uOwotaW50CQkJZG9faGlzdG9ncmFtOwotaW50CQkJZG9fZGVidWdnaW5nOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfaW5mbzsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX2FiYnJldnM7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19saW5lczsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX3B1Ym5hbWVzOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfYXJhbmdlczsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2FyY2g7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19ub3RlczsKLWludAkJCWlzXzMyYml0X2VsZjsKLQotLyogQSBkeW5hbWljIGFycmF5IG9mIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggc2VjdGlvbnMgcmVxdWlyZSBkdW1waW5nLiAgKi8KLWNoYXIgKgkJCWR1bXBfc2VjdHMgPSBOVUxMOwotdW5zaWduZWQgaW50CQludW1fZHVtcF9zZWN0cyA9IDA7Ci0KLSNkZWZpbmUgSEVYX0RVTVAJKDEgPDwgMCkKLSNkZWZpbmUgRElTQVNTX0RVTVAJKDEgPDwgMSkKLSNkZWZpbmUgREVCVUdfRFVNUAkoMSA8PCAyKQotCi0vKiBIb3cgdG8gcnBpbnQgYSB2bWEgdmFsdWUuICAqLwotdHlwZWRlZiBlbnVtIHByaW50X21vZGUKLXsKLSAgSEVYLAotICBERUMsCi0gIERFQ181LAotICBVTlNJR05FRCwKLSAgUFJFRklYX0hFWCwKLSAgRlVMTF9IRVgsCi0gIExPTkdfSEVYCi19Ci1wcmludF9tb2RlOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZHVtYiBjb21waWxlcnMuICAqLwotc3RhdGljIHZvaWQJCSAgcHJpbnRfdm1hCQkgICAgICBQQVJBTVMgKChiZmRfdm1hLCBwcmludF9tb2RlKSk7Ci1zdGF0aWMgYmZkX3ZtYSAoKiAgICAgICAgIGJ5dGVfZ2V0KSAgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGJmZF92bWEgICAgICAgICAgICBieXRlX2dldF9saXR0bGVfZW5kaWFuICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBiZmRfdm1hICAgICAgICAgICAgYnl0ZV9nZXRfYmlnX2VuZGlhbiAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9taXBzX2R5bmFtaWNfdHlwZSAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9zcGFyYzY0X2R5bmFtaWNfdHlwZSAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9wYXJpc2NfZHluYW1pY190eXBlICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9keW5hbWljX3R5cGUgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGR1bXBfcmVsb2NhdGlvbnMgICAgICAgICAgICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIEVsZl9JbnRlcm5hbF9TeW0gKiwgdW5zaWduZWQgbG9uZywgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X2ZpbGVfdHlwZSAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9tYWNoaW5lX25hbWUgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfbWFjaGluZV9mbGFncyAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQsIHVuc2lnbmVkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9taXBzX3NlZ21lbnRfdHlwZSAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9wYXJpc2Nfc2VnbWVudF90eXBlICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9zZWdtZW50X3R5cGUgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9taXBzX3NlY3Rpb25fdHlwZV9uYW1lICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X3BhcmlzY19zZWN0aW9uX3R5cGVfbmFtZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X3NlY3Rpb25fdHlwZV9uYW1lICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfc3ltYm9sX2JpbmRpbmcgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9zeW1ib2xfdHlwZSAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X3N5bWJvbF92aXNpYmlsaXR5ICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfc3ltYm9sX2luZGV4X3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9keW5hbWljX2ZsYWdzIAkgICAgICBQQVJBTVMgKChiZmRfdm1hKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHBhcnNlX2FyZ3MgICAgICAgICAgICAgICAgICBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19maWxlX2hlYWRlciAgICAgICAgIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19wcm9ncmFtX2hlYWRlcnMgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3NlY3Rpb25faGVhZGVycyAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGR5bmFtaWNfc2VnbWVudF9taXBzX3ZhbCAgICBQQVJBTVMgKChFbGZfSW50ZXJuYWxfRHluICopKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgZHluYW1pY19zZWdtZW50X3BhcmlzY192YWwgIFBBUkFNUyAoKEVsZl9JbnRlcm5hbF9EeW4gKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3Nfc3ltYm9sX3RhYmxlICAgICAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBwcm9jZXNzX2ZpbGUgICAgICAgICAgICAgICAgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfcmVsb2NzICAgICAgICAgICAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc192ZXJzaW9uX3NlY3Rpb25zICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfdmVyX2ZsYWdzICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF8zMmJpdF9zZWN0aW9uX2hlYWRlcnMgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0XzY0Yml0X3NlY3Rpb25faGVhZGVycyAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludAkJICBnZXRfMzJiaXRfcHJvZ3JhbV9oZWFkZXJzICAgUEFSQU1TICgoRklMRSAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7Ci1zdGF0aWMgaW50CQkgIGdldF82NGJpdF9wcm9ncmFtX2hlYWRlcnMgICBQQVJBTVMgKChGSUxFICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0X2ZpbGVfaGVhZGVyICAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIEVsZl9JbnRlcm5hbF9TeW0gKiBnZXRfMzJiaXRfZWxmX3N5bWJvbHMgICAgICAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgRWxmX0ludGVybmFsX1N5bSAqIGdldF82NGJpdF9lbGZfc3ltYm9scyAgICAgICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgKiAgICAgICAgICAgICAgZ2V0X2R5bmFtaWNfZGF0YSAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF8zMmJpdF9keW5hbWljX3NlZ21lbnQgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAgIFBBUkFNUyAoKEZJTEUgKikpOwotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLXN0YXRpYyBpbnQgCSAgICAgICAgICBkaXNhc3NlbWJsZV9zZWN0aW9uICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBGSUxFICopKTsKLSNlbmRpZgotc3RhdGljIGludCAJICAgICAgICAgIGR1bXBfc2VjdGlvbiAgICAgICAgICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOwotc3RhdGljIGludCAJICAgICAgICAgIGRpc3BsYXlfZGVidWdfc2VjdGlvbiAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2luZm8gICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2xpbmVzICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2FiYnJldiAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2FyYW5nZXMgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiAgICBwcm9jZXNzX2FiYnJldl9zZWN0aW9uICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICAgICAgcmVhZF9sZWIxMjggICAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50ICosIGludCkpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3AgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICByZXNldF9zdGF0ZV9tYWNoaW5lICAgICAgICAgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9UQUdfbmFtZSAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9BVF9uYW1lICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9GT1JNX25hbWUgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGZyZWVfYWJicmV2cyAgICAgICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGFkZF9hYmJyZXYgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgYWRkX2FiYnJldl9hdHRyICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogICAgcmVhZF9hbmRfZGlzcGxheV9hdHRyICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiAgICBkaXNwbGF5X2Jsb2NrICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQJCSAgcmVxdWVzdF9kdW1wICAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY2hhcikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZWxmX2NsYXNzICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZGF0YV9lbmNvZGluZyAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfb3NhYmlfbmFtZSAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOwotc3RhdGljIGludAkJICBndWVzc19pc19yZWxhICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNoYXIgKiAJCSAgZ2V0X25vdGVfdHlwZQkJICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50CQkgIHByb2Nlc3Nfbm90ZQkJICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfTm90ZSAqKSk7Ci1zdGF0aWMgaW50CQkgIHByb2Nlc3NfY29yZWZpbGVfbm90ZV9zZWdtZW50ICBQQVJBTVMgKChGSUxFICosIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBpbnQJCSAgcHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnRzIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAJCSAgcHJvY2Vzc19jb3JlZmlsZV9jb250ZW50cwkgUEFSQU1TICgoRklMRSAqKSk7Ci0KLXR5cGVkZWYgaW50IEVsZjMyX1dvcmQ7Ci0KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAgICAxCi0jZGVmaW5lIEZBTFNFICAgIDAKLSNlbmRpZgotI2RlZmluZSBVTktOT1dOIC0xCi0KLSNkZWZpbmUgU0VDVElPTl9OQU1FKFgpIAkoc3RyaW5nX3RhYmxlICsgKFgpLT5zaF9uYW1lKQotCi0jZGVmaW5lIERUX1ZFUlNJT05UQUdJRFgodGFnKQkoRFRfVkVSTkVFRE5VTSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLwotCi0jZGVmaW5lIEJZVEVfR0VUKGZpZWxkKSAJYnl0ZV9nZXQgKGZpZWxkLCBzaXplb2YgKGZpZWxkKSkKLQotLyogSWYgd2UgY2FuIHN1cHBvcnQgYSA2NCBiaXQgZGF0YSB0eXBlIHRoZW4gQkZENjQgc2hvdWxkIGJlIGRlZmluZWQKLSAgIGFuZCBzaXplb2YgKGJmZF92bWEpID09IDguICBJbiB0aGlzIGNhc2Ugd2hlbiB0cmFuc2xhdGluZyBmcm9tIGFuCi0gICBleHRlcm5hbCA4IGJ5dGUgZmllbGQgdG8gYW4gaW50ZXJuYWwgZmllbGQsIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUKLSAgIGludGVybmFsIGZpZWxkIGlzIGFsc28gOCBieXRlcyB3aWRlIGFuZCBzbyB3ZSBjYW4gZXh0YWN0IGFsbCB0aGUgZGF0YS4KLSAgIElmLCBob3dldmVyLCBCRkQ2NCBpcyBub3QgZGVmaW5lZCwgdGhlbiB3ZSBtdXN0IGFzc3VtZSB0aGF0IHRoZQotICAgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgb25seSBoYXMgNCBieXRlIHdpZGUgZmllbGRzIHRoYXQgYXJlIHRoZQotICAgZXF1aXZhbGVudCBvZiB0aGUgOCBieXRlIHdpZGUgZXh0ZXJuYWwgY291bnRlcnBhcnRzLCBhbmQgc28gd2UgbXVzdAotICAgdHJ1bmNhdGUgdGhlIGRhdGEuICAqLwotI2lmZGVmICBCRkQ2NAotI2RlZmluZSBCWVRFX0dFVDgoZmllbGQpIAlieXRlX2dldCAoZmllbGQsIC04KQotI2Vsc2UKLSNkZWZpbmUgQllURV9HRVQ4KGZpZWxkKSAJYnl0ZV9nZXQgKGZpZWxkLCA4KQotI2VuZGlmCi0KLSNkZWZpbmUgTlVNX0VMRU0oYXJyYXkpIAkoc2l6ZW9mIChhcnJheSkgLyBzaXplb2YgKChhcnJheSlbMF0pKQotCi0jZGVmaW5lIEdFVF9EQVRBX0FMTE9DKG9mZnNldCwgc2l6ZSwgdmFyLCB0eXBlLCByZWFzb24pCQkJXAotICBpZiAoZnNlZWsgKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpKQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgJXMgYXQgJXhcbiIpLCByZWFzb24sIG9mZnNldCk7IFwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gIHZhciA9ICh0eXBlKSBtYWxsb2MgKHNpemUpOwkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgaWYgKHZhciA9PSBOVUxMKQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgJWQgYnl0ZXMgZm9yICVzXG4iKSwgc2l6ZSwgcmVhc29uKTsgXAotICAgICAgcmV0dXJuIDA7CQkJCQkJCQlcCi0gICAgfSAJCQkJCQkJCQlcCi0gCQkJCQkJCQkJXAotICBpZiAoZnJlYWQgKHZhciwgc2l6ZSwgMSwgZmlsZSkgIT0gMSkgCQkJCQlcCi0gICAgeyAJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgaW4gJWQgYnl0ZXMgb2YgJXNcbiIpLCBzaXplLCByZWFzb24pOyAJXAotICAgICAgZnJlZSAodmFyKTsgCQkJCQkJCVwKLSAgICAgIHZhciA9IE5VTEw7CQkJCQkJCVwKLSAgICAgIHJldHVybiAwOyAJCQkJCQkJXAotICAgIH0KLQotCi0jZGVmaW5lIEdFVF9EQVRBKG9mZnNldCwgdmFyLCByZWFzb24pIAkJCQkJXAotICBpZiAoZnNlZWsgKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpKQkJCQkJXAotICAgIHsgCQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvICV4IGZvciAlc1xuIiksIG9mZnNldCwgcmVhc29uKTsJXAotICAgICAgcmV0dXJuIDA7CQkJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgZWxzZSBpZiAoZnJlYWQgKCYgdmFyLCBzaXplb2YgKHZhciksIDEsIGZpbGUpICE9IDEpCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgZGF0YSBhdCAleCBmb3IgJXNcbiIpLCBvZmZzZXQsIHJlYXNvbik7CVwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0KLQotI2RlZmluZSBHRVRfRUxGX1NZTUJPTFMoZmlsZSwgb2Zmc2V0LCBzaXplKQkJCVwKLSAgKGlzXzMyYml0X2VsZiA/IGdldF8zMmJpdF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBzaXplKQlcCi0gICA6IGdldF82NGJpdF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBzaXplKSkKLQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdGF0aWMgdm9pZAotZXJyb3IgKGNvbnN0IGNoYXIgKiBtZXNzYWdlLCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBFcnJvcjogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXdhcm4gKGNvbnN0IGNoYXIgKiBtZXNzYWdlLCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBXYXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuOwotfQotI2Vsc2UKLXN0YXRpYyB2b2lkCi1lcnJvciAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICBjaGFyICogbWVzc2FnZTsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IEVycm9yOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBtZXNzYWdlID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotd2FybiAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICBjaGFyICogbWVzc2FnZTsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IFdhcm5pbmc6ICIpLCBwcm9ncmFtX25hbWUpOwotICB2YV9zdGFydCAoYXJncyk7Ci0gIG1lc3NhZ2UgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm47Ci19Ci0jZW5kaWYKLQotc3RhdGljIGJmZF92bWEKLWJ5dGVfZ2V0X2xpdHRsZV9lbmRpYW4gKGZpZWxkLCBzaXplKQotICAgICB1bnNpZ25lZCBjaGFyICogZmllbGQ7Ci0gICAgIGludCAgICAgICAgICAgICBzaXplOwotewotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiAqIGZpZWxkOwotCi0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuICAoKHVuc2lnbmVkIGludCkgKGZpZWxkIFswXSkpCi0JfCAgICAoKCh1bnNpZ25lZCBpbnQpIChmaWVsZCBbMV0pKSA8PCA4KTsKLQotICAgIGNhc2UgODoKLSAgICAgIC8qIFdlIHdhbnQgdG8gZXh0cmFjdCBkYXRhIGZyb20gYW4gOCBieXRlIHdpZGUgZmllbGQgYW5kCi0JIHBsYWNlIGl0IGludG8gYSA0IGJ5dGUgd2lkZSBmaWVsZC4gIFNpbmNlIHRoaXMgaXMgYSBsaXR0bGUKLQkgZW5kaWFuIHNvdXJjZSB3ZSBjYW4ganV0cyB1c2UgdGhlIDQgYnl0ZSBleHRyYWN0aW9uIGNvZGUuICAqLwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gICgodW5zaWduZWQgbG9uZykgKGZpZWxkIFswXSkpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzFdKSkgPDwgOCkKLQl8ICAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMl0pKSA8PCAxNikKLQl8ICAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbM10pKSA8PCAyNCk7Ci0KLSNpZmRlZiBCRkQ2NAotICAgIGNhc2UgLTg6Ci0gICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBnZW5lcmF0ZWQgYnkgdGhlIEJZVEVfR0VUOCBtYWNyby4KLQkgSXQgbWVhbnMgdGhhdCB3ZSBhcmUgbG9hZGluZyBhbiA4IGJ5dGUgdmFsdWUgZnJvbSBhIGZpZWxkCi0JIGluIGFuIGV4dGVybmFsIHN0cnVjdHVyZSBpbnRvIGFuIDggYnl0ZSB2YWx1ZSBpbiBhIGZpZWxkCi0JIGluIGFuIGludGVybmFsIHN0cmN1dHVyZS4gICovCi0gICAgICByZXR1cm4gICgoYmZkX3ZtYSkgKGZpZWxkIFswXSkpCi0JfCAgICAoKChiZmRfdm1hKSAoZmllbGQgWzFdKSkgPDwgOCkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbMl0pKSA8PCAxNikKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbM10pKSA8PCAyNCkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbNF0pKSA8PCAzMikKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbNV0pKSA8PCA0MCkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbNl0pKSA8PCA0OCkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbN10pKSA8PCA1Nik7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgKF8oIlVuaGFuZGxlZCBkYXRhIGxlbmd0aDogJWRcbiIpLCBzaXplKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogUHJpbnQgYSBWTUEgdmFsdWUuICAqLwotc3RhdGljIHZvaWQKLXByaW50X3ZtYSAodm1hLCBtb2RlKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgcHJpbnRfbW9kZSBtb2RlOwotewotI2lmZGVmIEJGRDY0Ci0gIGlmIChpc18zMmJpdF9lbGYpCi0jZW5kaWYKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG1vZGUpCi0JewotCWNhc2UgRlVMTF9IRVg6IHByaW50ZiAoIjB4Iik7IC8qIGRyb3AgdGhyb3VnaCAqLwotCWNhc2UgTE9OR19IRVg6IHByaW50ZiAoIiU4LjhseCIsICh1bnNpZ25lZCBsb25nKSB2bWEpOyBicmVhazsKLQljYXNlIFBSRUZJWF9IRVg6IHByaW50ZiAoIjB4Iik7IC8qIGRyb3AgdGhyb3VnaCAqLwotCWNhc2UgSEVYOiBwcmludGYgKCIlbHgiLCAodW5zaWduZWQgbG9uZykgdm1hKTsgYnJlYWs7Ci0JY2FzZSBERUM6IHByaW50ZiAoIiVsZCIsICh1bnNpZ25lZCBsb25nKSB2bWEpOyBicmVhazsKLQljYXNlIERFQ181OiBwcmludGYgKCIlNWxkIiwgKGxvbmcpIHZtYSk7IGJyZWFrOwotCWNhc2UgVU5TSUdORUQ6IHByaW50ZiAoIiVsdSIsICh1bnNpZ25lZCBsb25nKSB2bWEpOyBicmVhazsKLQl9Ci0gICAgfQotI2lmZGVmIEJGRDY0Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG1vZGUpCi0JewotCWNhc2UgRlVMTF9IRVg6Ci0JICBwcmludGYgKCIweCIpOwotCSAgLyogZHJvcCB0aHJvdWdoICovCi0JICAKLQljYXNlIExPTkdfSEVYOgotCSAgcHJpbnRmX3ZtYSAodm1hKTsKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBQUkVGSVhfSEVYOgotCSAgcHJpbnRmICgiMHgiKTsKLQkgIC8qIGRyb3AgdGhyb3VnaCAqLwotCSAgCi0JY2FzZSBIRVg6Ci0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotCSAgcHJpbnRmICgiJWx4Iiwgdm1hKTsKLSNlbHNlCi0JICBpZiAoX2JmZF9pbnQ2NF9oaWdoICh2bWEpKQotCSAgICBwcmludGYgKCIlbHglbHgiLCBfYmZkX2ludDY0X2hpZ2ggKHZtYSksIF9iZmRfaW50NjRfbG93ICh2bWEpKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiJWx4IiwgX2JmZF9pbnQ2NF9sb3cgKHZtYSkpOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgREVDOgotI2lmIEJGRF9IT1NUXzY0QklUX0xPTkcKLQkgIHByaW50ZiAoIiVsZCIsIHZtYSk7Ci0jZWxzZQotCSAgaWYgKF9iZmRfaW50NjRfaGlnaCAodm1hKSkKLQkgICAgLyogdWdnICovCi0JICAgIHByaW50ZiAoIisrJWxkIiwgX2JmZF9pbnQ2NF9sb3cgKHZtYSkpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIlbGQiLCBfYmZkX2ludDY0X2xvdyAodm1hKSk7Ci0jZW5kaWYJICAKLQkgIGJyZWFrOwotCi0JY2FzZSBERUNfNToKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0JICBwcmludGYgKCIlNWxkIiwgdm1hKTsKLSNlbHNlCi0JICBpZiAoX2JmZF9pbnQ2NF9oaWdoICh2bWEpKQotCSAgICAvKiB1Z2cgKi8KLQkgICAgcHJpbnRmICgiKyslbGQiLCBfYmZkX2ludDY0X2xvdyAodm1hKSk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiU1bGQiLCBfYmZkX2ludDY0X2xvdyAodm1hKSk7Ci0jZW5kaWYJICAKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBVTlNJR05FRDoKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0JICBwcmludGYgKCIlbHUiLCB2bWEpOwotI2Vsc2UJICAKLQkgIGlmIChfYmZkX2ludDY0X2hpZ2ggKHZtYSkpCi0JICAgIC8qIHVnZyAqLwotCSAgICBwcmludGYgKCIrKyVsdSIsIF9iZmRfaW50NjRfbG93ICh2bWEpKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiJWx1IiwgX2JmZF9pbnQ2NF9sb3cgKHZtYSkpOwotI2VuZGlmCi0JICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBiZmRfdm1hCi1ieXRlX2dldF9iaWdfZW5kaWFuIChmaWVsZCwgc2l6ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqIGZpZWxkOwotICAgICBpbnQgICAgICAgICAgICAgc2l6ZTsKLXsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gKiBmaWVsZDsKLQotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiAoKHVuc2lnbmVkIGludCkgKGZpZWxkIFsxXSkpIHwgKCgoaW50KSAoZmllbGQgWzBdKSkgPDwgOCk7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzNdKSkKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFsyXSkpIDw8IDgpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMV0pKSA8PCAxNikKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFswXSkpIDw8IDI0KTsKLQotICAgIGNhc2UgODoKLSAgICAgIC8qIEFsdGhvdWdoIHdlIGFyZSBleHRyYWNpbmcgZGF0YSBmcm9tIGFuIDggYnl0ZSB3aWRlIGZpZWxkLCB3ZQotCSBhcmUgcmV0dXJuaW5nIG9ubHkgNCBieXRlcyBvZiBkYXRhLiAgKi8KLSAgICAgIHJldHVybiAoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbN10pKQotCXwgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzZdKSkgPDwgOCkKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFs1XSkpIDw8IDE2KQotCXwgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzRdKSkgPDwgMjQpOwotCi0jaWZkZWYgQkZENjQKLSAgICBjYXNlIC04OgotICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSwgZ2VuZXJhdGVkIGJ5IHRoZSBCWVRFX0dFVDggbWFjcm8uCi0JIEl0IG1lYW5zIHRoYXQgd2UgYXJlIGxvYWRpbmcgYW4gOCBieXRlIHZhbHVlIGZyb20gYSBmaWVsZAotCSBpbiBhbiBleHRlcm5hbCBzdHJ1Y3R1cmUgaW50byBhbiA4IGJ5dGUgdmFsdWUgaW4gYSBmaWVsZAotCSBpbiBhbiBpbnRlcm5hbCBzdHJjdXR1cmUuICAqLwotICAgICAgcmV0dXJuICgoYmZkX3ZtYSkgKGZpZWxkIFs3XSkpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbNl0pKSA8PCA4KQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzVdKSkgPDwgMTYpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbNF0pKSA8PCAyNCkKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFszXSkpIDw8IDMyKQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzJdKSkgPDwgNDApCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbMV0pKSA8PCA0OCkKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFswXSkpIDw8IDU2KTsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yIChfKCJVbmhhbmRsZWQgZGF0YSBsZW5ndGg6ICVkXG4iKSwgc2l6ZSk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLQotLyogR3Vlc3MgdGhlIHJlbG9jYXRpb24gc2l6ZWQgYmFzZWQgb24gdGhlIHNpemVkIGNvbW1vbmx5IHVzZWQgYnkgdGhlIHNwZWNpZmljIG1hY2hpbmUuICAqLwotc3RhdGljIGludAotZ3Vlc3NfaXNfcmVsYSAoZV9tYWNoaW5lKQotICAgICB1bnNpZ25lZCBsb25nIGVfbWFjaGluZTsKLXsKLSAgc3dpdGNoIChlX21hY2hpbmUpCi0gICAgewotICAgICAgLyogVGFyZ2V0cyB0aGF0IHVzZSBSRUwgcmVsb2NhdGlvbnMuICAqLwotICAgIGNhc2UgRU1fQVJNOgotICAgIGNhc2UgRU1fMzg2OgotICAgIGNhc2UgRU1fNDg2OgotICAgIGNhc2UgRU1fOTYwOgotICAgIGNhc2UgRU1fQ1lHTlVTX00zMlI6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRDEwVjoKLSAgICBjYXNlIEVNX01JUFM6Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLSAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgLyogVGFyZ2V0cyB0aGF0IHVzZSBSRUxBIHJlbG9jYXRpb25zLiAgKi8KLSAgICBjYXNlIEVNXzY4SzoKLSAgICBjYXNlIEVNX1NQQVJDMzJQTFVTOgotICAgIGNhc2UgRU1fU1BBUkNWOToKLSAgICBjYXNlIEVNX1NQQVJDOgotICAgIGNhc2UgRU1fUFBDOgotICAgIGNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRDMwVjoKLSAgICBjYXNlIEVNX0NZR05VU19NTjEwMjAwOgotICAgIGNhc2UgRU1fQ1lHTlVTX01OMTAzMDA6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRlIzMDoKLSAgICBjYXNlIEVNX1NIOgotICAgIGNhc2UgRU1fQUxQSEE6Ci0gICAgY2FzZSBFTV9NQ09SRToKLSAgICAgIHJldHVybiBUUlVFOwotCi0gICAgY2FzZSBFTV9NTUE6Ci0gICAgY2FzZSBFTV9QQ1A6Ci0gICAgY2FzZSBFTV9OQ1BVOgotICAgIGNhc2UgRU1fTkRSMToKLSAgICBjYXNlIEVNX1NUQVJDT1JFOgotICAgIGNhc2UgRU1fTUUxNjoKLSAgICBjYXNlIEVNX1NUMTAwOgotICAgIGNhc2UgRU1fVElOWUo6Ci0gICAgY2FzZSBFTV9GWDY2OgotICAgIGNhc2UgRU1fU1Q5UExVUzoKLSAgICBjYXNlIEVNX1NUNzoKLSAgICBjYXNlIEVNXzY4SEMxNjoKLSAgICBjYXNlIEVNXzY4SEMxMToKLSAgICBjYXNlIEVNXzY4SEMwODoKLSAgICBjYXNlIEVNXzY4SEMwNToKLSAgICBjYXNlIEVNX1NWWDoKLSAgICBjYXNlIEVNX1NUMTk6Ci0gICAgY2FzZSBFTV9WQVg6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHdhcm4gKF8oIkRvbid0IGtub3cgYWJvdXQgcmVsb2NhdGlvbnMgb24gdGhpcyBtYWNoaW5lIGFyY2hpdGVjdHVyZVxuIikpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRpb24gZGF0YSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gICovCi1zdGF0aWMgaW50Ci1kdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0LCByZWxfc2l6ZSwgc3ltdGFiLCBuc3ltcywgc3RydGFiLCBpc19yZWxhKQotICAgICBGSUxFICogICAgICAgICAgICAgZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgIHJlbF9vZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgICByZWxfc2l6ZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIHN5bXRhYjsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgIG5zeW1zOwotICAgICBjaGFyICogICAgICAgICAgICAgc3RydGFiOwotICAgICBpbnQgICAgICAgICAgICAgICAgaXNfcmVsYTsKLXsKLSAgdW5zaWduZWQgaW50ICAgICAgICBpOwotICBFbGZfSW50ZXJuYWxfUmVsICogIHJlbHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogcmVsYXM7Ci0KLQotICBpZiAoaXNfcmVsYSA9PSBVTktOT1dOKQotICAgIGlzX3JlbGEgPSBndWVzc19pc19yZWxhIChlbGZfaGVhZGVyLmVfbWFjaGluZSk7Ci0KLSAgaWYgKGlzX3JlbGEpCi0gICAgewotICAgICAgaWYgKGlzXzMyYml0X2VsZikKLQl7Ci0JICBFbGYzMl9FeHRlcm5hbF9SZWxhICogZXJlbGFzOwotCi0JICBHRVRfREFUQV9BTExPQyAocmVsX29mZnNldCwgcmVsX3NpemUsIGVyZWxhcywKLQkJCSAgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqLCAicmVsb2NzIik7Ci0KLQkgIHJlbF9zaXplID0gcmVsX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JICByZWxhcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKQotCSAgICBtYWxsb2MgKHJlbF9zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkpOwotCi0JICBpZiAocmVsYXMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yKF8oIm91dCBvZiBtZW1vcnkgcGFyc2luZyByZWxvY3MiKSk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IHJlbF9zaXplOyBpKyspCi0JICAgIHsKLQkgICAgICByZWxhc1tpXS5yX29mZnNldCA9IEJZVEVfR0VUIChlcmVsYXNbaV0ucl9vZmZzZXQpOwotCSAgICAgIHJlbGFzW2ldLnJfaW5mbyAgID0gQllURV9HRVQgKGVyZWxhc1tpXS5yX2luZm8pOwotCSAgICAgIHJlbGFzW2ldLnJfYWRkZW5kID0gQllURV9HRVQgKGVyZWxhc1tpXS5yX2FkZGVuZCk7Ci0JICAgIH0KLQotCSAgZnJlZSAoZXJlbGFzKTsKLQotCSAgcmVscyA9IChFbGZfSW50ZXJuYWxfUmVsICopIHJlbGFzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFbGY2NF9FeHRlcm5hbF9SZWxhICogZXJlbGFzOwotCi0JICBHRVRfREFUQV9BTExPQyAocmVsX29mZnNldCwgcmVsX3NpemUsIGVyZWxhcywKLQkJCSAgRWxmNjRfRXh0ZXJuYWxfUmVsYSAqLCAicmVsb2NzIik7Ci0KLQkgIHJlbF9zaXplID0gcmVsX3NpemUgLyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCi0JICByZWxhcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKQotCSAgICBtYWxsb2MgKHJlbF9zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkpOwotCi0JICBpZiAocmVsYXMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yKF8oIm91dCBvZiBtZW1vcnkgcGFyc2luZyByZWxvY3MiKSk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IHJlbF9zaXplOyBpKyspCi0JICAgIHsKLQkgICAgICByZWxhc1tpXS5yX29mZnNldCA9IEJZVEVfR0VUOCAoZXJlbGFzW2ldLnJfb2Zmc2V0KTsKLQkgICAgICByZWxhc1tpXS5yX2luZm8gICA9IEJZVEVfR0VUOCAoZXJlbGFzW2ldLnJfaW5mbyk7Ci0JICAgICAgcmVsYXNbaV0ucl9hZGRlbmQgPSBCWVRFX0dFVDggKGVyZWxhc1tpXS5yX2FkZGVuZCk7Ci0JICAgIH0KLQotCSAgZnJlZSAoZXJlbGFzKTsKLQotCSAgcmVscyA9IChFbGZfSW50ZXJuYWxfUmVsICopIHJlbGFzOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXsKLQkgIEVsZjMyX0V4dGVybmFsX1JlbCAqIGVyZWxzOwotCi0JICBHRVRfREFUQV9BTExPQyAocmVsX29mZnNldCwgcmVsX3NpemUsIGVyZWxzLAotCQkJICBFbGYzMl9FeHRlcm5hbF9SZWwgKiwgInJlbG9jcyIpOwotCi0JICByZWxfc2l6ZSA9IHJlbF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0JICByZWxzID0gKEVsZl9JbnRlcm5hbF9SZWwgKikKLQkgICAgbWFsbG9jIChyZWxfc2l6ZSAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbCkpOwotCi0JICBpZiAocmVscyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IoXygib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIpKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLQkgICAgewotCSAgICAgIHJlbHNbaV0ucl9vZmZzZXQgPSBCWVRFX0dFVCAoZXJlbHNbaV0ucl9vZmZzZXQpOwotCSAgICAgIHJlbHNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVCAoZXJlbHNbaV0ucl9pbmZvKTsKLQkgICAgfQotCi0JICBmcmVlIChlcmVscyk7Ci0KLQkgIHJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIHJlbHM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEVsZjY0X0V4dGVybmFsX1JlbCAqIGVyZWxzOwotCi0JICBHRVRfREFUQV9BTExPQyAocmVsX29mZnNldCwgcmVsX3NpemUsIGVyZWxzLAotCQkJICBFbGY2NF9FeHRlcm5hbF9SZWwgKiwgInJlbG9jcyIpOwotCi0JICByZWxfc2l6ZSA9IHJlbF9zaXplIC8gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWwpOwotCi0JICByZWxzID0gKEVsZl9JbnRlcm5hbF9SZWwgKikKLQkgICAgbWFsbG9jIChyZWxfc2l6ZSAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbCkpOwotCi0JICBpZiAocmVscyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IoXygib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIpKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLQkgICAgewotCSAgICAgIHJlbHNbaV0ucl9vZmZzZXQgPSBCWVRFX0dFVDggKGVyZWxzW2ldLnJfb2Zmc2V0KTsKLQkgICAgICByZWxzW2ldLnJfaW5mbyAgID0gQllURV9HRVQ4IChlcmVsc1tpXS5yX2luZm8pOwotCSAgICB9Ci0KLQkgIGZyZWUgKGVyZWxzKTsKLQotCSAgcmVsYXMgPSAoRWxmX0ludGVybmFsX1JlbGEgKikgcmVsczsKLQl9Ci0gICAgfQotCi0gIGlmIChpc19yZWxhKQotICAgIHByaW50ZgotICAgICAgKF8oIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZSAgICAgICAgICBBZGRlbmRcbiIpKTsKLSAgZWxzZQotICAgIHByaW50ZgotICAgICAgKF8oIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZVxuIikpOwotCi0gIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBydHlwZTsKLSAgICAgIGJmZF92bWEgICAgICBvZmZzZXQ7Ci0gICAgICBiZmRfdm1hICAgICAgaW5mbzsKLSAgICAgIGJmZF92bWEgICAgICBzeW10YWJfaW5kZXg7Ci0gICAgICBiZmRfdm1hICAgICAgdHlwZTsKLQotICAgICAgaWYgKGlzX3JlbGEpCi0JewotCSAgb2Zmc2V0ID0gcmVsYXMgW2ldLnJfb2Zmc2V0OwotCSAgaW5mbyAgID0gcmVsYXMgW2ldLnJfaW5mbzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb2Zmc2V0ID0gcmVscyBbaV0ucl9vZmZzZXQ7Ci0JICBpbmZvICAgPSByZWxzIFtpXS5yX2luZm87Ci0JfQotCi0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXsKLQkgIHR5cGUgICAgICAgICA9IEVMRjMyX1JfVFlQRSAoaW5mbyk7Ci0JICBzeW10YWJfaW5kZXggPSBFTEYzMl9SX1NZTSAgKGluZm8pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fU1BBUkNWOSkKLQkgICAgdHlwZSAgICAgICA9IEVMRjY0X1JfVFlQRV9JRCAoaW5mbyk7Ci0JICBlbHNlCi0JICAgIHR5cGUgICAgICAgPSBFTEY2NF9SX1RZUEUgKGluZm8pOwotCSAgLyogVGhlICNpZmRlZiBCRkQ2NCBiZWxvdyBpcyB0byBwcmV2ZW50IGEgY29tcGlsZSB0aW1lIHdhcm5pbmcuCi0JICAgICBXZSBrbm93IHRoYXQgaWYgd2UgZG8gbm90IGhhdmUgYSA2NCBiaXQgZGF0YSB0eXBlIHRoYXQgd2UKLQkgICAgIHdpbGwgbmV2ZXIgZXhlY3V0ZSB0aGlzIGNvZGUgYW55d2F5LiAgKi8KLSNpZmRlZiBCRkQ2NAotCSAgc3ltdGFiX2luZGV4ID0gRUxGNjRfUl9TWU0gIChpbmZvKTsKLSNlbmRpZgotCX0KLQotI2lmZGVmIF9iZmRfaW50NjRfbG93Ci0gICAgICBwcmludGYgKCIgICU4LjhseCAgJTUuNWx4ICIsIF9iZmRfaW50NjRfbG93IChvZmZzZXQpLCBfYmZkX2ludDY0X2xvdyAoaW5mbykpOwotI2Vsc2UKLSAgICAgIHByaW50ZiAoIiAgJTguOGx4ICAlNS41bHggIiwgb2Zmc2V0LCBpbmZvKTsKLSNlbmRpZgotCi0gICAgICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCXsKLQlkZWZhdWx0OgotCSAgcnR5cGUgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19NMzJSOgotCSAgcnR5cGUgPSBlbGZfbTMycl9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV8zODY6Ci0JY2FzZSBFTV80ODY6Ci0JICBydHlwZSA9IGVsZl9pMzg2X3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNXzY4SzoKLQkgIHJ0eXBlID0gZWxmX202OGtfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fOTYwOgotCSAgcnR5cGUgPSBlbGZfaTk2MF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9BVlI6Ci0JICBydHlwZSA9IGVsZl9hdnJfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fT0xEX1NQQVJDVjk6Ci0JY2FzZSBFTV9TUEFSQzMyUExVUzoKLQljYXNlIEVNX1NQQVJDVjk6Ci0JY2FzZSBFTV9TUEFSQzoKLQkgIHJ0eXBlID0gZWxmX3NwYXJjX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19WODUwOgotCSAgcnR5cGUgPSB2ODUwX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19EMTBWOgotCSAgcnR5cGUgPSBlbGZfZDEwdl9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfRDMwVjoKLQkgIHJ0eXBlID0gZWxmX2QzMHZfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fU0g6Ci0JICBydHlwZSA9IGVsZl9zaF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTU4xMDMwMDoKLQkgIHJ0eXBlID0gZWxmX21uMTAzMDBfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX01OMTAyMDA6Ci0JICBydHlwZSA9IGVsZl9tbjEwMjAwX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19GUjMwOgotCSAgcnR5cGUgPSBlbGZfZnIzMF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9NQ09SRToKLQkgIHJ0eXBlID0gZWxmX21jb3JlX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX1BQQzoKLQkgIHJ0eXBlID0gZWxmX3BwY19yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9NSVBTOgotCWNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICBydHlwZSA9IGVsZl9taXBzX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0FMUEhBOgotCSAgcnR5cGUgPSBlbGZfYWxwaGFfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQVJNOgotCSAgcnR5cGUgPSBlbGZfYXJtX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19BUkM6Ci0JICBydHlwZSA9IGVsZl9hcmNfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fUEFSSVNDOgotCSAgcnR5cGUgPSBlbGZfaHBwYV9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9QSjoKLQkgIHJ0eXBlID0gZWxmX3BqX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocnR5cGUgPT0gTlVMTCkKLSNpZmRlZiBfYmZkX2ludDY0X2xvdwotCXByaW50ZiAoXygidW5yZWNvZ25pc2VkOiAlLTdseCIpLCBfYmZkX2ludDY0X2xvdyAodHlwZSkpOwotI2Vsc2UKLQlwcmludGYgKF8oInVucmVjb2duaXNlZDogJS03bHgiKSwgdHlwZSk7Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlLTIxLjIxcyIsIHJ0eXBlKTsKLQotICAgICAgaWYgKHN5bXRhYl9pbmRleCkKLQl7Ci0JICBpZiAoc3ltdGFiICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc3ltdGFiX2luZGV4ID49IG5zeW1zKQotCQlwcmludGYgKCIgYmFkIHN5bWJvbCBpbmRleDogJTA4bHgiLCAodW5zaWduZWQgbG9uZykgc3ltdGFiX2luZGV4KTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfU3ltICogcHN5bTsKLQotCQkgIHBzeW0gPSBzeW10YWIgKyBzeW10YWJfaW5kZXg7Ci0KLQkJICBwcmludGYgKCIgIik7Ci0JCSAgcHJpbnRfdm1hIChwc3ltLT5zdF92YWx1ZSwgTE9OR19IRVgpOwotCQkgIHByaW50ZiAoIiAgIik7Ci0KLQkJICBpZiAocHN5bS0+c3RfbmFtZSA9PSAwKQotCQkgICAgcHJpbnRmICgiJS0yNS4yNXMiLAotCQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgcHN5bS0+c3Rfc2huZHgpKTsKLQkJICBlbHNlIGlmIChzdHJ0YWIgPT0gTlVMTCkKLQkJICAgIHByaW50ZiAoXygiPHN0cmluZyB0YWJsZSBpbmRleCAlM2xkPiIpLCBwc3ltLT5zdF9uYW1lKTsKLQkJICBlbHNlCi0JCSAgICBwcmludGYgKCIlLTI1LjI1cyIsIHN0cnRhYiArIHBzeW0tPnN0X25hbWUpOwotCi0JCSAgaWYgKGlzX3JlbGEpCi0JCSAgICBwcmludGYgKCIgKyAlbHgiLCAodW5zaWduZWQgbG9uZykgcmVsYXMgW2ldLnJfYWRkZW5kKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfcmVsYSkKLQl7Ci0JICBwcmludGYgKCIlKmMiLCBpc18zMmJpdF9lbGYgPyAzNCA6IDI2LCAnICcpOwotCSAgcHJpbnRfdm1hIChyZWxhc1tpXS5yX2FkZGVuZCwgTE9OR19IRVgpOwotCX0KLQotICAgICAgaWYgKGVsZl9oZWFkZXIuZV9tYWNoaW5lID09IEVNX1NQQVJDVjkKLQkgICYmICFzdHJjbXAgKHJ0eXBlLCAiUl9TUEFSQ19PTE8xMCIpKQotCXByaW50ZiAoIiArICVseCIsICh1bnNpZ25lZCBsb25nKSBFTEY2NF9SX1RZUEVfREFUQSAoaW5mbykpOwotCi0gICAgICBwdXRjaGFyICgnXG4nKTsKLSAgICB9Ci0KLSAgZnJlZSAocmVsYXMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfbWlwc19keW5hbWljX3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIERUX01JUFNfUkxEX1ZFUlNJT046IHJldHVybiAiTUlQU19STERfVkVSU0lPTiI7Ci0gICAgY2FzZSBEVF9NSVBTX1RJTUVfU1RBTVA6IHJldHVybiAiTUlQU19USU1FX1NUQU1QIjsKLSAgICBjYXNlIERUX01JUFNfSUNIRUNLU1VNOiByZXR1cm4gIk1JUFNfSUNIRUNLU1VNIjsKLSAgICBjYXNlIERUX01JUFNfSVZFUlNJT046IHJldHVybiAiTUlQU19JVkVSU0lPTiI7Ci0gICAgY2FzZSBEVF9NSVBTX0ZMQUdTOiByZXR1cm4gIk1JUFNfRkxBR1MiOwotICAgIGNhc2UgRFRfTUlQU19CQVNFX0FERFJFU1M6IHJldHVybiAiTUlQU19CQVNFX0FERFJFU1MiOwotICAgIGNhc2UgRFRfTUlQU19NU1lNOiByZXR1cm4gIk1JUFNfTVNZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUOiByZXR1cm4gIk1JUFNfQ09ORkxJQ1QiOwotICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUOiByZXR1cm4gIk1JUFNfTElCTElTVCI7Ci0gICAgY2FzZSBEVF9NSVBTX0xPQ0FMX0dPVE5POiByZXR1cm4gIk1JUFNfTE9DQUxfR09UTk8iOwotICAgIGNhc2UgRFRfTUlQU19DT05GTElDVE5POiByZXR1cm4gIk1JUFNfQ09ORkxJQ1ROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0xJQkxJU1ROTzogcmV0dXJuICJNSVBTX0xJQkxJU1ROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX1NZTVRBQk5POiByZXR1cm4gIk1JUFNfU1lNVEFCTk8iOwotICAgIGNhc2UgRFRfTUlQU19VTlJFRkVYVE5POiByZXR1cm4gIk1JUFNfVU5SRUZFWFROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0dPVFNZTTogcmV0dXJuICJNSVBTX0dPVFNZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0hJUEFHRU5POiByZXR1cm4gIk1JUFNfSElQQUdFTk8iOwotICAgIGNhc2UgRFRfTUlQU19STERfTUFQOiByZXR1cm4gIk1JUFNfUkxEX01BUCI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTOiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1MiOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU19OTzogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTX05PIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfSU5TVEFOQ0U6IHJldHVybiAiTUlQU19ERUxUQV9JTlNUQU5DRSI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFX05POiByZXR1cm4gIk1JUFNfREVMVEFfSU5TVEFOQ0VfTk8iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9SRUxPQzogcmV0dXJuICJNSVBTX0RFTFRBX1JFTE9DIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0NfTk86IHJldHVybiAiTUlQU19ERUxUQV9SRUxPQ19OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTTogcmV0dXJuICJNSVBTX0RFTFRBX1NZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTV9OTzogcmV0dXJuICJNSVBTX0RFTFRBX1NZTV9OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNOiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1NTWU0iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU1NZTV9OTzogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTU1lNX05PIjsKLSAgICBjYXNlIERUX01JUFNfQ1hYX0ZMQUdTOiByZXR1cm4gIk1JUFNfQ1hYX0ZMQUdTIjsKLSAgICBjYXNlIERUX01JUFNfUElYSUVfSU5JVDogcmV0dXJuICJNSVBTX1BJWElFX0lOSVQiOwotICAgIGNhc2UgRFRfTUlQU19TWU1CT0xfTElCOiByZXR1cm4gIk1JUFNfU1lNQk9MX0xJQiI7Ci0gICAgY2FzZSBEVF9NSVBTX0xPQ0FMUEFHRV9HT1RJRFg6IHJldHVybiAiTUlQU19MT0NBTFBBR0VfR09USURYIjsKLSAgICBjYXNlIERUX01JUFNfTE9DQUxfR09USURYOiByZXR1cm4gIk1JUFNfTE9DQUxfR09USURYIjsKLSAgICBjYXNlIERUX01JUFNfSElEREVOX0dPVElEWDogcmV0dXJuICJNSVBTX0hJRERFTl9HT1RJRFgiOwotICAgIGNhc2UgRFRfTUlQU19QUk9URUNURURfR09USURYOiByZXR1cm4gIk1JUFNfUFJPVEVDVEVEX0dPVElEWCI7Ci0gICAgY2FzZSBEVF9NSVBTX09QVElPTlM6IHJldHVybiAiTUlQU19PUFRJT05TIjsKLSAgICBjYXNlIERUX01JUFNfSU5URVJGQUNFOiByZXR1cm4gIk1JUFNfSU5URVJGQUNFIjsKLSAgICBjYXNlIERUX01JUFNfRFlOU1RSX0FMSUdOOiByZXR1cm4gIk1JUFNfRFlOU1RSX0FMSUdOIjsKLSAgICBjYXNlIERUX01JUFNfSU5URVJGQUNFX1NJWkU6IHJldHVybiAiTUlQU19JTlRFUkZBQ0VfU0laRSI7Ci0gICAgY2FzZSBEVF9NSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUjogcmV0dXJuICJNSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUiI7Ci0gICAgY2FzZSBEVF9NSVBTX1BFUkZfU1VGRklYOiByZXR1cm4gIk1JUFNfUEVSRl9TVUZGSVgiOwotICAgIGNhc2UgRFRfTUlQU19DT01QQUNUX1NJWkU6IHJldHVybiAiTUlQU19DT01QQUNUX1NJWkUiOwotICAgIGNhc2UgRFRfTUlQU19HUF9WQUxVRTogcmV0dXJuICJNSVBTX0dQX1ZBTFVFIjsKLSAgICBjYXNlIERUX01JUFNfQVVYX0RZTkFNSUM6IHJldHVybiAiTUlQU19BVVhfRFlOQU1JQyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3NwYXJjNjRfZHluYW1pY190eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBEVF9TUEFSQ19SRUdJU1RFUjogcmV0dXJuICJTUEFSQ19SRUdJU1RFUiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3BhcmlzY19keW5hbWljX3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIERUX0hQX0xPQURfTUFQOglyZXR1cm4gIkhQX0xPQURfTUFQIjsKLSAgICBjYXNlIERUX0hQX0RMRF9GTEFHUzoJcmV0dXJuICJIUF9ETERfRkxBR1MiOwotICAgIGNhc2UgRFRfSFBfRExEX0hPT0s6CXJldHVybiAiSFBfRExEX0hPT0siOwotICAgIGNhc2UgRFRfSFBfVVgxMF9JTklUOglyZXR1cm4gIkhQX1VYMTBfSU5JVCI7Ci0gICAgY2FzZSBEVF9IUF9VWDEwX0lOSVRTWjoJcmV0dXJuICJIUF9VWDEwX0lOSVRTWiI7Ci0gICAgY2FzZSBEVF9IUF9QUkVJTklUOgkJcmV0dXJuICJIUF9QUkVJTklUIjsKLSAgICBjYXNlIERUX0hQX1BSRUlOSVRTWjoJcmV0dXJuICJIUF9QUkVJTklUU1oiOwotICAgIGNhc2UgRFRfSFBfTkVFREVEOgkJcmV0dXJuICJIUF9ORUVERUQiOwotICAgIGNhc2UgRFRfSFBfVElNRV9TVEFNUDoJcmV0dXJuICJIUF9USU1FX1NUQU1QIjsKLSAgICBjYXNlIERUX0hQX0NIRUNLU1VNOglyZXR1cm4gIkhQX0NIRUNLU1VNIjsKLSAgICBjYXNlIERUX0hQX0dTVF9TSVpFOglyZXR1cm4gIkhQX0dTVF9TSVpFIjsKLSAgICBjYXNlIERUX0hQX0dTVF9WRVJTSU9OOglyZXR1cm4gIkhQX0dTVF9WRVJTSU9OIjsKLSAgICBjYXNlIERUX0hQX0dTVF9IQVNIVkFMOglyZXR1cm4gIkhQX0dTVF9IQVNIVkFMIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfZHluYW1pY190eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgRFRfTlVMTDoJcmV0dXJuICJOVUxMIjsKLSAgICBjYXNlIERUX05FRURFRDoJcmV0dXJuICJORUVERUQiOwotICAgIGNhc2UgRFRfUExUUkVMU1o6CXJldHVybiAiUExUUkVMU1oiOwotICAgIGNhc2UgRFRfUExUR09UOglyZXR1cm4gIlBMVEdPVCI7Ci0gICAgY2FzZSBEVF9IQVNIOglyZXR1cm4gIkhBU0giOwotICAgIGNhc2UgRFRfU1RSVEFCOglyZXR1cm4gIlNUUlRBQiI7Ci0gICAgY2FzZSBEVF9TWU1UQUI6CXJldHVybiAiU1lNVEFCIjsKLSAgICBjYXNlIERUX1JFTEE6CXJldHVybiAiUkVMQSI7Ci0gICAgY2FzZSBEVF9SRUxBU1o6CXJldHVybiAiUkVMQVNaIjsKLSAgICBjYXNlIERUX1JFTEFFTlQ6CXJldHVybiAiUkVMQUVOVCI7Ci0gICAgY2FzZSBEVF9TVFJTWjoJcmV0dXJuICJTVFJTWiI7Ci0gICAgY2FzZSBEVF9TWU1FTlQ6CXJldHVybiAiU1lNRU5UIjsKLSAgICBjYXNlIERUX0lOSVQ6CXJldHVybiAiSU5JVCI7Ci0gICAgY2FzZSBEVF9GSU5JOglyZXR1cm4gIkZJTkkiOwotICAgIGNhc2UgRFRfU09OQU1FOglyZXR1cm4gIlNPTkFNRSI7Ci0gICAgY2FzZSBEVF9SUEFUSDoJcmV0dXJuICJSUEFUSCI7Ci0gICAgY2FzZSBEVF9TWU1CT0xJQzoJcmV0dXJuICJTWU1CT0xJQyI7Ci0gICAgY2FzZSBEVF9SRUw6CXJldHVybiAiUkVMIjsKLSAgICBjYXNlIERUX1JFTFNaOglyZXR1cm4gIlJFTFNaIjsKLSAgICBjYXNlIERUX1JFTEVOVDoJcmV0dXJuICJSRUxFTlQiOwotICAgIGNhc2UgRFRfUExUUkVMOglyZXR1cm4gIlBMVFJFTCI7Ci0gICAgY2FzZSBEVF9ERUJVRzoJcmV0dXJuICJERUJVRyI7Ci0gICAgY2FzZSBEVF9URVhUUkVMOglyZXR1cm4gIlRFWFRSRUwiOwotICAgIGNhc2UgRFRfSk1QUkVMOglyZXR1cm4gIkpNUFJFTCI7Ci0gICAgY2FzZSBEVF9CSU5EX05PVzogICByZXR1cm4gIkJJTkRfTk9XIjsKLSAgICBjYXNlIERUX0lOSVRfQVJSQVk6IHJldHVybiAiSU5JVF9BUlJBWSI7Ci0gICAgY2FzZSBEVF9GSU5JX0FSUkFZOiByZXR1cm4gIkZJTklfQVJSQVkiOwotICAgIGNhc2UgRFRfSU5JVF9BUlJBWVNaOiByZXR1cm4gIklOSVRfQVJSQVlTWiI7Ci0gICAgY2FzZSBEVF9GSU5JX0FSUkFZU1o6IHJldHVybiAiRklOSV9BUlJBWVNaIjsKLSAgICBjYXNlIERUX1JVTlBBVEg6ICAgIHJldHVybiAiUlVOUEFUSCI7Ci0gICAgY2FzZSBEVF9GTEFHUzogICAgICByZXR1cm4gIkZMQUdTIjsKLQotICAgIGNhc2UgRFRfUFJFSU5JVF9BUlJBWTogcmV0dXJuICJQUkVJTklUX0FSUkFZIjsKLSAgICBjYXNlIERUX1BSRUlOSVRfQVJSQVlTWjogcmV0dXJuICJQUkVJTklUX0FSUkFZU1oiOwotCi0gICAgY2FzZSBEVF9QTFRQQURTWjoJcmV0dXJuICJQTFRQQURTWiI7Ci0gICAgY2FzZSBEVF9NT1ZFRU5UOglyZXR1cm4gIk1PVkVFTlQiOwotICAgIGNhc2UgRFRfTU9WRVNaOglyZXR1cm4gIk1PVkVTWiI7Ci0gICAgY2FzZSBEVF9GRUFUVVJFXzE6CXJldHVybiAiRkVBVFVSRV8xIjsKLSAgICBjYXNlIERUX1BPU0ZMQUdfMToJcmV0dXJuICJQT1NGTEFHXzEiOwotICAgIGNhc2UgRFRfU1lNSU5TWjoJcmV0dXJuICJTWU1JTlNaIjsKLSAgICBjYXNlIERUX1NZTUlORU5UOglyZXR1cm4gIlNZTUlORU5UIjsgLyogYWthIFZBTFJOR0hJICovCi0KLSAgICBjYXNlIERUX0FERFJSTkdMTzogIHJldHVybiAiQUREUlJOR0xPIjsKLSAgICBjYXNlIERUX1NZTUlORk86CXJldHVybiAiU1lNSU5GTyI7IC8qIGFrYSBBRERSUk5HSEkgKi8KLQotICAgIGNhc2UgRFRfVkVSU1lNOglyZXR1cm4gIlZFUlNZTSI7Ci0KLSAgICBjYXNlIERUX1JFTEFDT1VOVDoJcmV0dXJuICJSRUxBQ09VTlQiOwotICAgIGNhc2UgRFRfUkVMQ09VTlQ6CXJldHVybiAiUkVMQ09VTlQiOwotICAgIGNhc2UgRFRfRkxBR1NfMToJcmV0dXJuICJGTEFHU18xIjsKLSAgICBjYXNlIERUX1ZFUkRFRjoJcmV0dXJuICJWRVJERUYiOwotICAgIGNhc2UgRFRfVkVSREVGTlVNOglyZXR1cm4gIlZFUkRFRk5VTSI7Ci0gICAgY2FzZSBEVF9WRVJORUVEOglyZXR1cm4gIlZFUk5FRUQiOwotICAgIGNhc2UgRFRfVkVSTkVFRE5VTToJcmV0dXJuICJWRVJORUVETlVNIjsKLQotICAgIGNhc2UgRFRfQVVYSUxJQVJZOglyZXR1cm4gIkFVWElMQVJZIjsKLSAgICBjYXNlIERUX1VTRUQ6CXJldHVybiAiVVNFRCI7Ci0gICAgY2FzZSBEVF9GSUxURVI6CXJldHVybiAiRklMVEVSIjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoKHR5cGUgPj0gRFRfTE9QUk9DKSAmJiAodHlwZSA8PSBEVF9ISVBST0MpKQotCXsKLQkgIGNvbnN0IGNoYXIgKiByZXN1bHQ7Ci0KLQkgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgY2FzZSBFTV9NSVBTOgotCSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgICAgIHJlc3VsdCA9IGdldF9taXBzX2R5bmFtaWNfdHlwZSAodHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRU1fU1BBUkNWOToKLQkgICAgICByZXN1bHQgPSBnZXRfc3BhcmM2NF9keW5hbWljX3R5cGUgKHR5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQotCSAgICByZXR1cm4gcmVzdWx0OwotCi0JICBzcHJpbnRmIChidWZmLCBfKCJQcm9jZXNzb3IgU3BlY2lmaWM6ICVseCIpLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmICgodHlwZSA+PSBEVF9MT09TKSAmJiAodHlwZSA8PSBEVF9ISU9TKSkKLQl7Ci0JICBjb25zdCBjaGFyICogcmVzdWx0OwotCi0JICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCSAgICB7Ci0JICAgIGNhc2UgRU1fUEFSSVNDOgotCSAgICAgIHJlc3VsdCA9IGdldF9wYXJpc2NfZHluYW1pY190eXBlICh0eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXN1bHQgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQotCSAgc3ByaW50ZiAoYnVmZiwgXygiT3BlcmF0aW5nIFN5c3RlbSBzcGVjaWZpYzogJWx4IiksIHR5cGUpOwotCX0KLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICVseCIpLCB0eXBlKTsKLQotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfZmlsZV90eXBlIChlX3R5cGUpCi0gICAgIHVuc2lnbmVkIGVfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoZV90eXBlKQotICAgIHsKLSAgICBjYXNlIEVUX05PTkU6CXJldHVybiBfKCJOT05FIChOb25lKSIpOwotICAgIGNhc2UgRVRfUkVMOglyZXR1cm4gXygiUkVMIChSZWxvY2F0YWJsZSBmaWxlKSIpOwotICAgIGNhc2UgRVRfRVhFQzogICAgICAgcmV0dXJuIF8oIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiKTsKLSAgICBjYXNlIEVUX0RZTjogICAgICAgIHJldHVybiBfKCJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiKTsKLSAgICBjYXNlIEVUX0NPUkU6ICAgICAgIHJldHVybiBfKCJDT1JFIChDb3JlIGZpbGUpIik7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChlX3R5cGUgPj0gRVRfTE9QUk9DKSAmJiAoZV90eXBlIDw9IEVUX0hJUFJPQykpCi0Jc3ByaW50ZiAoYnVmZiwgXygiUHJvY2Vzc29yIFNwZWNpZmljOiAoJXgpIiksIGVfdHlwZSk7Ci0gICAgICBlbHNlIGlmICgoZV90eXBlID49IEVUX0xPT1MpICYmIChlX3R5cGUgPD0gRVRfSElPUykpCi0Jc3ByaW50ZiAoYnVmZiwgXygiT1MgU3BlY2lmaWM6ICgleCkiKSwgZV90eXBlKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICV4IiksIGVfdHlwZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9tYWNoaW5lX25hbWUgKGVfbWFjaGluZSkKLSAgICAgdW5zaWduZWQgZV9tYWNoaW5lOwotewotICBzdGF0aWMgY2hhciBidWZmIFs2NF07IC8qIFhYWCAqLwotCi0gIHN3aXRjaCAoZV9tYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIEVNX05PTkU6ICAgICAgICAJcmV0dXJuIF8oIk5vbmUiKTsKLSAgICBjYXNlIEVNX00zMjogICAgICAgICAJcmV0dXJuICJXRTMyMTAwIjsKLSAgICBjYXNlIEVNX1NQQVJDOiAgICAgICAJcmV0dXJuICJTcGFyYyI7Ci0gICAgY2FzZSBFTV8zODY6ICAgICAgICAgCXJldHVybiAiSW50ZWwgODAzODYiOwotICAgIGNhc2UgRU1fNjhLOiAgICAgICAgIAlyZXR1cm4gIk1DNjgwMDAiOwotICAgIGNhc2UgRU1fODhLOiAgICAgICAgIAlyZXR1cm4gIk1DODgwMDAiOwotICAgIGNhc2UgRU1fNDg2OiAgICAgICAgIAlyZXR1cm4gIkludGVsIDgwNDg2IjsKLSAgICBjYXNlIEVNXzg2MDogICAgICAgICAJcmV0dXJuICJJbnRlbCA4MDg2MCI7Ci0gICAgY2FzZSBFTV9NSVBTOiAgICAgICAgCXJldHVybiAiTUlQUyBSMzAwMCI7Ci0gICAgY2FzZSBFTV9TMzcwOiAgICAgICAgCXJldHVybiAiSUJNIFN5c3RlbS8zNzAiOwotICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6IAlyZXR1cm4gIk1JUFMgUjQwMDAgYmlnLWVuZGlhbiI7Ci0gICAgY2FzZSBFTV9PTERfU1BBUkNWOToJcmV0dXJuICJTcGFyYyB2OSAob2xkKSI7Ci0gICAgY2FzZSBFTV9QQVJJU0M6ICAgICAgCXJldHVybiAiSFBQQSI7Ci0gICAgY2FzZSBFTV9QUENfT0xEOgkJcmV0dXJuICJQb3dlciBQQyAob2xkKSI7Ci0gICAgY2FzZSBFTV9TUEFSQzMyUExVUzogCXJldHVybiAiU3BhcmMgdjgrIiA7Ci0gICAgY2FzZSBFTV85NjA6ICAgICAgICAgCXJldHVybiAiSW50ZWwgOTA4NjAiOwotICAgIGNhc2UgRU1fUFBDOiAgICAgICAgIAlyZXR1cm4gIlBvd2VyUEMiOwotICAgIGNhc2UgRU1fVjgwMDogICAgICAgICAJcmV0dXJuICJORUMgVjgwMCI7Ci0gICAgY2FzZSBFTV9GUjIwOiAgICAgICAgIAlyZXR1cm4gIkZ1aml0c3UgRlIyMCI7Ci0gICAgY2FzZSBFTV9SSDMyOiAgICAgICAgIAlyZXR1cm4gIlRSVyBSSDMyIjsKLSAgICBjYXNlIEVNX01DT1JFOgkgICAgICAgIHJldHVybiAiTUNPUkUiOwotICAgIGNhc2UgRU1fQVJNOgkgCXJldHVybiAiQVJNIjsKLSAgICBjYXNlIEVNX09MRF9BTFBIQToJIAlyZXR1cm4gIkRpZ2l0YWwgQWxwaGEgKG9sZCkiOwotICAgIGNhc2UgRU1fU0g6CQkgCXJldHVybiAiSGl0YWNoaSBTSCI7Ci0gICAgY2FzZSBFTV9TUEFSQ1Y5OiAgICAgCXJldHVybiAiU3BhcmMgdjkiOwotICAgIGNhc2UgRU1fVFJJQ09SRTogICAgCXJldHVybiAiU2llbWVucyBUcmljb3JlIjsKLSAgICBjYXNlIEVNX0FSQzoJCXJldHVybiAiQXJnb25hdXQgUklTQyBDb3JlIjsKLSAgICBjYXNlIEVNX0g4XzMwMDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDAiOwotICAgIGNhc2UgRU1fSDhfMzAwSDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDBIIjsKLSAgICBjYXNlIEVNX0g4UzoJCXJldHVybiAiSGl0YWNoaSBIOFMiOwotICAgIGNhc2UgRU1fSDhfNTAwOgkJcmV0dXJuICJIaXRhY2hpIEg4LzUwMCI7Ci0gICAgY2FzZSBFTV9JQV82NDoJCXJldHVybiAiSW50ZWwgSUEtNjQiOwotICAgIGNhc2UgRU1fTUlQU19YOgkJcmV0dXJuICJTdGFuZm9yZCBNSVBTLVgiOwotICAgIGNhc2UgRU1fQ09MREZJUkU6CQlyZXR1cm4gIk1vdG9yb2xhIENvbGRmaXJlIjsKLSAgICBjYXNlIEVNXzY4SEMxMjoJCXJldHVybiAiTW90b3JvbGEgTTY4SEMxMiI7Ci0gICAgY2FzZSBFTV9BTFBIQTogICAgICAgCXJldHVybiAiQWxwaGEiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0QxMFY6ICAgICAgICByZXR1cm4gImQxMHYiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0QzMFY6ICAgICAgICByZXR1cm4gImQzMHYiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0FSQzoJCXJldHVybiAiQXJjIjsKLSAgICBjYXNlIEVNX0NZR05VU19NMzJSOglyZXR1cm4gIk1pdHN1YmlzaGkgTTMyciI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfVjg1MDoJcmV0dXJuICJORUMgdjg1MCI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfTU4xMDMwMDoJcmV0dXJuICJtbjEwMzAwIjsKLSAgICBjYXNlIEVNX0NZR05VU19NTjEwMjAwOglyZXR1cm4gIm1uMTAyMDAiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0ZSMzA6CXJldHVybiAiRnVqaXRzdSBGUjMwIjsKLSAgICBjYXNlIEVNX1BKOiAgICAgICAgICAgICAgICAgcmV0dXJuICJwaWNvSmF2YSI7Ci0gICAgY2FzZSBFTV9NTUE6ICAgICAgCQlyZXR1cm4gIkZ1aml0c3UgTXVsdGltZWRpYSBBY2NlbGVyYXRvciI7Ci0gICAgY2FzZSBFTV9QQ1A6ICAgICAgCQlyZXR1cm4gIlNpZW1lbnMgUENQIjsKLSAgICBjYXNlIEVNX05DUFU6ICAgICAJCXJldHVybiAiU29ueSBuQ1BVIGVtYmVkZGVkIFJJU0MgcHJvY2Vzc29yIjsKLSAgICBjYXNlIEVNX05EUjE6ICAgICAJCXJldHVybiAiRGVuc28gTkRSMSBtaWNyb3Byb2Nlc3NwciI7Ci0gICAgY2FzZSBFTV9TVEFSQ09SRTogCQlyZXR1cm4gIk1vdG9yb2xhIFN0YXIqQ29yZSBwcm9jZXNzb3IiOwotICAgIGNhc2UgRU1fTUUxNjogICAgIAkJcmV0dXJuICJUb3lvdGEgTUUxNiBwcm9jZXNzb3IiOwotICAgIGNhc2UgRU1fU1QxMDA6ICAgIAkJcmV0dXJuICJTVE1pY3JvZWxlY3Ryb25pY3MgU1QxMDAgcHJvY2Vzc29yIjsKLSAgICBjYXNlIEVNX1RJTllKOiAgICAJCXJldHVybiAiQWR2YW5jZWQgTG9naWMgQ29ycC4gVGlueUogZW1iZWRkZWQgcHJvY2Vzc29yIjsKLSAgICBjYXNlIEVNX0ZYNjY6ICAgICAJCXJldHVybiAiU2llbWVucyBGWDY2IG1pY3JvY29udHJvbGxlciI7Ci0gICAgY2FzZSBFTV9TVDlQTFVTOiAgCQlyZXR1cm4gIlNUTWljcm9lbGVjdHJvbmljcyBTVDkrIDgvMTYgYml0IG1pY3JvY29udHJvbGxlciI7Ci0gICAgY2FzZSBFTV9TVDc6ICAgICAgCQlyZXR1cm4gIlNUTWljcm9lbGVjdHJvbmljcyBTVDcgOC1iaXQgbWljcm9jb250cm9sbGVyIjsKLSAgICBjYXNlIEVNXzY4SEMxNjogICAJCXJldHVybiAiTW90b3JvbGEgTUM2OEhDMTYgTWljcm9jb250cm9sbGVyIjsKLSAgICBjYXNlIEVNXzY4SEMxMTogICAJCXJldHVybiAiTW90b3JvbGEgTUM2OEhDMTEgTWljcm9jb250cm9sbGVyIjsKLSAgICBjYXNlIEVNXzY4SEMwODogICAJCXJldHVybiAiTW90b3JvbGEgTUM2OEhDMDggTWljcm9jb250cm9sbGVyIjsKLSAgICBjYXNlIEVNXzY4SEMwNTogICAJCXJldHVybiAiTW90b3JvbGEgTUM2OEhDMDUgTWljcm9jb250cm9sbGVyIjsKLSAgICBjYXNlIEVNX1NWWDogICAgICAJCXJldHVybiAiU2lsaWNvbiBHcmFwaGljcyBTVngiOwotICAgIGNhc2UgRU1fU1QxOTogICAgIAkJcmV0dXJuICJTVE1pY3JvZWxlY3Ryb25pY3MgU1QxOSA4LWJpdCBtaWNyb2NvbnRyb2xsZXIiOwotICAgIGNhc2UgRU1fVkFYOiAgICAgIAkJcmV0dXJuICJEaWdpdGFsIFZBWCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJXgiKSwgZV9tYWNoaW5lKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X21hY2hpbmVfZmxhZ3MgKGVfZmxhZ3MsIGVfbWFjaGluZSkKLSAgICAgdW5zaWduZWQgZV9mbGFnczsKLSAgICAgdW5zaWduZWQgZV9tYWNoaW5lOwotewotICBzdGF0aWMgY2hhciBidWYgWzEwMjRdOwotCi0gIGJ1ZlswXSA9ICdcMCc7Ci0gIAotICBpZiAoZV9mbGFncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVfbWFjaGluZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRU1fNjhLOgotICAgICAgICAgIGlmIChlX2ZsYWdzICYgRUZfQ1BVMzIpCi0gICAgICAgICAgICBzdHJjYXQgKGJ1ZiwgIiwgY3B1MzIiKTsKLSAgICAgICAgICBicmVhazsKLQotCWNhc2UgRU1fUFBDOgotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfRU1CKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgZW1iIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEVfTElCKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUtbGliIik7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0JICBzd2l0Y2ggKGVfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCi0JICAgIHsKLQkgICAgY2FzZSBFX1Y4NTBFX0FSQ0g6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHY4NTBlIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRV9WODUwRUFfQVJDSDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdjg1MGVhIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRV9WODUwX0FSQ0g6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHY4NTAiKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdW5rbm93biB2ODUwIGFyY2hpdGVjdHVyZSB2YXJpYW50Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTTMyUjoKLQkgIGlmICgoZV9mbGFncyAmIEVGX00zMlJfQVJDSCkgPT0gRV9NMzJSX0FSQ0gpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtMzJyIik7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9NSVBTOgotCWNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICBpZiAoZV9mbGFncyAmIEVGX01JUFNfTk9SRU9SREVSKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbm9yZW9yZGVyIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19QSUMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBwaWMiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBjcGljIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19BQkkyKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgYWJpMiIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzEpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMSIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzIpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMiIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMyIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzQpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzNCIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX1NQQVJDVjk6Ci0JICBpZiAoZV9mbGFncyAmIEVGX1NQQVJDXzMyUExVUykKLQkgICAgc3RyY2F0IChidWYsICIsIHY4KyIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCB1bHRyYXNwYXJjSSIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCB1bHRyYXNwYXJjSUlJIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfU1BBUkNfSEFMX1IxKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgaGFscjEiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBsZWRhdGEiKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfU1BBUkNWOV9NTSkgPT0gRUZfU1BBUkNWOV9UU08pCi0JICAgIHN0cmNhdCAoYnVmLCAiLCB0c28iKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfU1BBUkNWOV9NTSkgPT0gRUZfU1BBUkNWOV9QU08pCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBwc28iKTsKLQotCSAgaWYgKChlX2ZsYWdzICYgRUZfU1BBUkNWOV9NTSkgPT0gRUZfU1BBUkNWOV9STU8pCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBybW8iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9QQVJJU0M6Ci0JICBzd2l0Y2ggKGVfZmxhZ3MgJiBFRl9QQVJJU0NfQVJDSCkKLQkgICAgewotCSAgICBjYXNlIEVGQV9QQVJJU0NfMV8wOgotCSAgICAgIHN0cmNweSAoYnVmLCAiLCBQQS1SSVNDIDEuMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVGQV9QQVJJU0NfMV8xOgotCSAgICAgIHN0cmNweSAoYnVmLCAiLCBQQS1SSVNDIDEuMSIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVGQV9QQVJJU0NfMl8wOgotCSAgICAgIHN0cmNweSAoYnVmLCAiLCBQQS1SSVNDIDIuMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoZV9mbGFncyAmIEVGX1BBUklTQ19UUkFQTklMKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgdHJhcG5pbCIpOwotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QQVJJU0NfRVhUKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgZXh0Iik7Ci0JICBpZiAoZV9mbGFncyAmIEVGX1BBUklTQ19MU0IpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBsc2IiKTsKLQkgIGlmIChlX2ZsYWdzICYgRUZfUEFSSVNDX1dJREUpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCB3aWRlIik7Ci0JICBpZiAoZV9mbGFncyAmIEVGX1BBUklTQ19OT19LQUJQKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbm8ga2FicCIpOwotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QQVJJU0NfTEFaWVNXQVApCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBsYXp5c3dhcCIpOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEVNX1BKOgotCSAgaWYgKChlX2ZsYWdzICYgRUZfUElDT0pBVkFfTkVXQ0FMTFMpID09IEVGX1BJQ09KQVZBX05FV0NBTExTKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbmV3IGNhbGxpbmcgY29udmVudGlvbiIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9QSUNPSkFWQV9HTlVDQUxMUykgPT0gRUZfUElDT0pBVkFfR05VQ0FMTFMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBnbnUgY2FsbGluZyBjb252ZW50aW9uIik7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9taXBzX3NlZ21lbnRfdHlwZSAodHlwZSkKLSAgICAgdW5zaWduZWQgbG9uZyB0eXBlOwotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgUFRfTUlQU19SRUdJTkZPOgotICAgICAgcmV0dXJuICJSRUdJTkZPIjsKLSAgICBjYXNlIFBUX01JUFNfUlRQUk9DOgotICAgICAgcmV0dXJuICJSVFBST0MiOwotICAgIGNhc2UgUFRfTUlQU19PUFRJT05TOgotICAgICAgcmV0dXJuICJPUFRJT05TIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfcGFyaXNjX3NlZ21lbnRfdHlwZSAodHlwZSkKLSAgICAgdW5zaWduZWQgbG9uZyB0eXBlOwotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgUFRfSFBfVExTOgkJcmV0dXJuICJIUF9UTFMiOwotICAgIGNhc2UgUFRfSFBfQ09SRV9OT05FOglyZXR1cm4gIkhQX0NPUkVfTk9ORSI7Ci0gICAgY2FzZSBQVF9IUF9DT1JFX1ZFUlNJT046CXJldHVybiAiSFBfQ09SRV9WRVJTSU9OIjsKLSAgICBjYXNlIFBUX0hQX0NPUkVfS0VSTkVMOglyZXR1cm4gIkhQX0NPUkVfS0VSTkVMIjsKLSAgICBjYXNlIFBUX0hQX0NPUkVfQ09NTToJcmV0dXJuICJIUF9DT1JFX0NPTU0iOwotICAgIGNhc2UgUFRfSFBfQ09SRV9QUk9DOglyZXR1cm4gIkhQX0NPUkVfUFJPQyI7Ci0gICAgY2FzZSBQVF9IUF9DT1JFX0xPQURBQkxFOglyZXR1cm4gIkhQX0NPUkVfTE9BREFCTEUiOwotICAgIGNhc2UgUFRfSFBfQ09SRV9TVEFDSzoJcmV0dXJuICJIUF9DT1JFX1NUQUNLIjsKLSAgICBjYXNlIFBUX0hQX0NPUkVfU0hNOglyZXR1cm4gIkhQX0NPUkVfU0hNIjsKLSAgICBjYXNlIFBUX0hQX0NPUkVfTU1GOglyZXR1cm4gIkhQX0NPUkVfTU1GIjsKLSAgICBjYXNlIFBUX0hQX1BBUkFMTEVMOglyZXR1cm4gIkhQX1BBUkFMTEVMIjsKLSAgICBjYXNlIFBUX0hQX0ZBU1RCSU5EOglyZXR1cm4gIkhQX0ZBU1RCSU5EIjsKLSAgICBjYXNlIFBUX1BBUklTQ19BUkNIRVhUOglyZXR1cm4gIlBBUklTQ19BUkNIRVhUIjsKLSAgICBjYXNlIFBUX1BBUklTQ19VTldJTkQ6CXJldHVybiAiUEFSSVNDX1VOV0lORCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3NlZ21lbnRfdHlwZSAocF90eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHBfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAocF90eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX05VTEw6ICAgICAgIHJldHVybiAiTlVMTCI7Ci0gICAgY2FzZSBQVF9MT0FEOiAgICAgICByZXR1cm4gIkxPQUQiOwotICAgIGNhc2UgUFRfRFlOQU1JQzoJcmV0dXJuICJEWU5BTUlDIjsKLSAgICBjYXNlIFBUX0lOVEVSUDogICAgIHJldHVybiAiSU5URVJQIjsKLSAgICBjYXNlIFBUX05PVEU6ICAgICAgIHJldHVybiAiTk9URSI7Ci0gICAgY2FzZSBQVF9TSExJQjogICAgICByZXR1cm4gIlNITElCIjsKLSAgICBjYXNlIFBUX1BIRFI6ICAgICAgIHJldHVybiAiUEhEUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChwX3R5cGUgPj0gUFRfTE9QUk9DKSAmJiAocF90eXBlIDw9IFBUX0hJUFJPQykpCi0JewotCSAgY29uc3QgY2hhciAqIHJlc3VsdDsKLQotCSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkgICAgewotCSAgICBjYXNlIEVNX01JUFM6Ci0JICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X21pcHNfc2VnbWVudF90eXBlIChwX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVNX1BBUklTQzoKLQkgICAgICByZXN1bHQgPSBnZXRfcGFyaXNjX3NlZ21lbnRfdHlwZSAocF90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXN1bHQgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQotCSAgc3ByaW50ZiAoYnVmZiwgIkxPUFJPQyslbHgiLCBwX3R5cGUgLSBQVF9MT1BST0MpOwotCX0KLSAgICAgIGVsc2UgaWYgKChwX3R5cGUgPj0gUFRfTE9PUykgJiYgKHBfdHlwZSA8PSBQVF9ISU9TKSkKLQl7Ci0JICBjb25zdCBjaGFyICogcmVzdWx0OwotCi0JICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCSAgICB7Ci0JICAgIGNhc2UgRU1fUEFSSVNDOgotCSAgICAgIHJlc3VsdCA9IGdldF9wYXJpc2Nfc2VnbWVudF90eXBlIChwX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQotCSAgICByZXR1cm4gcmVzdWx0OwotCi0JICBzcHJpbnRmIChidWZmLCAiTE9PUyslbHgiLCBwX3R5cGUgLSBQVF9MT09TKTsKLQl9Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlbHgiKSwgcF90eXBlKTsKLQotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfbWlwc19zZWN0aW9uX3R5cGVfbmFtZSAoc2hfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHNoX3R5cGU7Ci17Ci0gIHN3aXRjaCAoc2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfTUlQU19MSUJMSVNUOiAgICAgICByZXR1cm4gIk1JUFNfTElCTElTVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19NU1lNOiAgICAgICAgICByZXR1cm4gIk1JUFNfTVNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19DT05GTElDVDogICAgICByZXR1cm4gIk1JUFNfQ09ORkxJQ1QiOwotICAgIGNhc2UgU0hUX01JUFNfR1BUQUI6ICAgICAgICAgcmV0dXJuICJNSVBTX0dQVEFCIjsKLSAgICBjYXNlIFNIVF9NSVBTX1VDT0RFOiAgICAgICAgIHJldHVybiAiTUlQU19VQ09ERSI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUJVRzogICAgICAgICByZXR1cm4gIk1JUFNfREVCVUciOwotICAgIGNhc2UgU0hUX01JUFNfUkVHSU5GTzogICAgICAgcmV0dXJuICJNSVBTX1JFR0lORk8iOwotICAgIGNhc2UgU0hUX01JUFNfUEFDS0FHRTogICAgICAgcmV0dXJuICJNSVBTX1BBQ0tBR0UiOwotICAgIGNhc2UgU0hUX01JUFNfUEFDS1NZTTogICAgICAgcmV0dXJuICJNSVBTX1BBQ0tTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfUkVMRDogICAgICAgICAgcmV0dXJuICJNSVBTX1JFTEQiOwotICAgIGNhc2UgU0hUX01JUFNfSUZBQ0U6ICAgICAgICAgcmV0dXJuICJNSVBTX0lGQUNFIjsKLSAgICBjYXNlIFNIVF9NSVBTX0NPTlRFTlQ6ICAgICAgIHJldHVybiAiTUlQU19DT05URU5UIjsKLSAgICBjYXNlIFNIVF9NSVBTX09QVElPTlM6ICAgICAgIHJldHVybiAiTUlQU19PUFRJT05TIjsKLSAgICBjYXNlIFNIVF9NSVBTX1NIRFI6ICAgICAgICAgIHJldHVybiAiTUlQU19TSERSIjsKLSAgICBjYXNlIFNIVF9NSVBTX0ZERVNDOiAgICAgICAgIHJldHVybiAiTUlQU19GREVTQyI7Ci0gICAgY2FzZSBTSFRfTUlQU19FWFRTWU06ICAgICAgICByZXR1cm4gIk1JUFNfRVhUU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX0RFTlNFOiAgICAgICAgIHJldHVybiAiTUlQU19ERU5TRSI7Ci0gICAgY2FzZSBTSFRfTUlQU19QREVTQzogICAgICAgICByZXR1cm4gIk1JUFNfUERFU0MiOwotICAgIGNhc2UgU0hUX01JUFNfTE9DU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0xPQ1NZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19BVVhTWU06ICAgICAgICByZXR1cm4gIk1JUFNfQVVYU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX09QVFNZTTogICAgICAgIHJldHVybiAiTUlQU19PUFRTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfTE9DU1RSOiAgICAgICAgcmV0dXJuICJNSVBTX0xPQ1NUUiI7Ci0gICAgY2FzZSBTSFRfTUlQU19MSU5FOiAgICAgICAgICByZXR1cm4gIk1JUFNfTElORSI7Ci0gICAgY2FzZSBTSFRfTUlQU19SRkRFU0M6ICAgICAgICByZXR1cm4gIk1JUFNfUkZERVNDIjsKLSAgICBjYXNlIFNIVF9NSVBTX0RFTFRBU1lNOiAgICAgIHJldHVybiAiTUlQU19ERUxUQVNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQUlOU1Q6ICAgICByZXR1cm4gIk1JUFNfREVMVEFJTlNUIjsKLSAgICBjYXNlIFNIVF9NSVBTX0RFTFRBQ0xBU1M6ICAgIHJldHVybiAiTUlQU19ERUxUQUNMQVNTIjsKLSAgICBjYXNlIFNIVF9NSVBTX0RXQVJGOiAgICAgICAgIHJldHVybiAiTUlQU19EV0FSRiI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQURFQ0w6ICAgICByZXR1cm4gIk1JUFNfREVMVEFERUNMIjsKLSAgICBjYXNlIFNIVF9NSVBTX1NZTUJPTF9MSUI6ICAgIHJldHVybiAiTUlQU19TWU1CT0xfTElCIjsKLSAgICBjYXNlIFNIVF9NSVBTX0VWRU5UUzogICAgICAgIHJldHVybiAiTUlQU19FVkVOVFMiOwotICAgIGNhc2UgU0hUX01JUFNfVFJBTlNMQVRFOiAgICAgcmV0dXJuICJNSVBTX1RSQU5TTEFURSI7Ci0gICAgY2FzZSBTSFRfTUlQU19QSVhJRTogICAgICAgICByZXR1cm4gIk1JUFNfUElYSUUiOwotICAgIGNhc2UgU0hUX01JUFNfWExBVEU6ICAgICAgICAgcmV0dXJuICJNSVBTX1hMQVRFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1hMQVRFX0RFQlVHOiAgIHJldHVybiAiTUlQU19YTEFURV9ERUJVRyI7Ci0gICAgY2FzZSBTSFRfTUlQU19XSElSTDogICAgICAgICByZXR1cm4gIk1JUFNfV0hJUkwiOwotICAgIGNhc2UgU0hUX01JUFNfRUhfUkVHSU9OOiAgICAgcmV0dXJuICJNSVBTX0VIX1JFR0lPTiI7Ci0gICAgY2FzZSBTSFRfTUlQU19YTEFURV9PTEQ6ICAgICByZXR1cm4gIk1JUFNfWExBVEVfT0xEIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BEUl9FWENFUFRJT046IHJldHVybiAiTUlQU19QRFJfRVhDRVBUSU9OIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3BhcmlzY19zZWN0aW9uX3R5cGVfbmFtZSAoc2hfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHNoX3R5cGU7Ci17Ci0gIHN3aXRjaCAoc2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfUEFSSVNDX0VYVDoJcmV0dXJuICJQQVJJU0NfRVhUIjsKLSAgICBjYXNlIFNIVF9QQVJJU0NfVU5XSU5EOglyZXR1cm4gIlBBUklTQ19VTldJTkQiOwotICAgIGNhc2UgU0hUX1BBUklTQ19ET0M6CXJldHVybiAiUEFSSVNDX0RPQyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9zZWN0aW9uX3R5cGVfbmFtZSAoc2hfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHNoX3R5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX05VTEw6CQlyZXR1cm4gIk5VTEwiOwotICAgIGNhc2UgU0hUX1BST0dCSVRTOgkJcmV0dXJuICJQUk9HQklUUyI7Ci0gICAgY2FzZSBTSFRfU1lNVEFCOgkJcmV0dXJuICJTWU1UQUIiOwotICAgIGNhc2UgU0hUX1NUUlRBQjoJCXJldHVybiAiU1RSVEFCIjsKLSAgICBjYXNlIFNIVF9SRUxBOgkJcmV0dXJuICJSRUxBIjsKLSAgICBjYXNlIFNIVF9IQVNIOgkJcmV0dXJuICJIQVNIIjsKLSAgICBjYXNlIFNIVF9EWU5BTUlDOgkJcmV0dXJuICJEWU5BTUlDIjsKLSAgICBjYXNlIFNIVF9OT1RFOgkJcmV0dXJuICJOT1RFIjsKLSAgICBjYXNlIFNIVF9OT0JJVFM6CQlyZXR1cm4gIk5PQklUUyI7Ci0gICAgY2FzZSBTSFRfUkVMOgkJcmV0dXJuICJSRUwiOwotICAgIGNhc2UgU0hUX1NITElCOgkJcmV0dXJuICJTSExJQiI7Ci0gICAgY2FzZSBTSFRfRFlOU1lNOgkJcmV0dXJuICJEWU5TWU0iOwotICAgIGNhc2UgU0hUX0lOSVRfQVJSQVk6CXJldHVybiAiSU5JVF9BUlJBWSI7Ci0gICAgY2FzZSBTSFRfRklOSV9BUlJBWToJcmV0dXJuICJGSU5JX0FSUkFZIjsKLSAgICBjYXNlIFNIVF9QUkVJTklUX0FSUkFZOglyZXR1cm4gIlBSRUlOSVRfQVJSQVkiOwotICAgIGNhc2UgU0hUX0dOVV92ZXJkZWY6CXJldHVybiAiVkVSREVGIjsKLSAgICBjYXNlIFNIVF9HTlVfdmVybmVlZDoJcmV0dXJuICJWRVJORUVEIjsKLSAgICBjYXNlIFNIVF9HTlVfdmVyc3ltOglyZXR1cm4gIlZFUlNZTSI7Ci0gICAgY2FzZSAweDZmZmZmZmYwOgkgICAgICAgIHJldHVybiAiVkVSU1lNIjsKLSAgICBjYXNlIDB4NmZmZmZmZmM6CSAgICAgICAgcmV0dXJuICJWRVJERUYiOwotICAgIGNhc2UgMHg3ZmZmZmZmZDoJCXJldHVybiAiQVVYSUxJQVJZIjsKLSAgICBjYXNlIDB4N2ZmZmZmZmY6CQlyZXR1cm4gIkZJTFRFUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChzaF90eXBlID49IFNIVF9MT1BST0MpICYmIChzaF90eXBlIDw9IFNIVF9ISVBST0MpKQotCXsKLQkgIGNvbnN0IGNoYXIgKiByZXN1bHQ7Ci0KLQkgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgY2FzZSBFTV9NSVBTOgotCSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgICAgIHJlc3VsdCA9IGdldF9taXBzX3NlY3Rpb25fdHlwZV9uYW1lIChzaF90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBFTV9QQVJJU0M6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X3BhcmlzY19zZWN0aW9uX3R5cGVfbmFtZSAoc2hfdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmVzdWx0ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JICAgIHJldHVybiByZXN1bHQ7Ci0KLQkgIHNwcmludGYgKGJ1ZmYsICJTSFRfTE9QUk9DKyV4Iiwgc2hfdHlwZSAtIFNIVF9MT1BST0MpOwotCX0KLSAgICAgIGVsc2UgaWYgKChzaF90eXBlID49IFNIVF9MT09TKSAmJiAoc2hfdHlwZSA8PSBTSFRfSElPUykpCi0Jc3ByaW50ZiAoYnVmZiwgIlNIVF9MT09TKyV4Iiwgc2hfdHlwZSAtIFNIVF9MT09TKTsKLSAgICAgIGVsc2UgaWYgKChzaF90eXBlID49IFNIVF9MT1VTRVIpICYmIChzaF90eXBlIDw9IFNIVF9ISVVTRVIpKQotCXNwcmludGYgKGJ1ZmYsICJTSFRfTE9VU0VSKyV4Iiwgc2hfdHlwZSAtIFNIVF9MT1VTRVIpOwotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJXgiKSwgc2hfdHlwZSk7Ci0KLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RydWN0IG9wdGlvbiBvcHRpb25zIFtdID0KLXsKLSAgeyJhbGwiLCAgICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdhJ30sCi0gIHsiZmlsZS1oZWFkZXIiLCAgICAgIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7InByb2dyYW0taGVhZGVycyIsICBub19hcmd1bWVudCwgMCwgJ2wnfSwKLSAgeyJoZWFkZXJzIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdlJ30sCi0gIHsiaGlzdG9ncmFtIiwgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnSSd9LAotICB7InNlZ21lbnRzIiwgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2wnfSwKLSAgeyJzZWN0aW9ucyIsICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdTJ30sCi0gIHsic2VjdGlvbi1oZWFkZXJzIiwgIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAotICB7InN5bWJvbHMiLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3MnfSwKLSAgeyJzeW1zIiwgICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0gIHsicmVsb2NzIiwgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAncid9LAotICB7Im5vdGVzIiwgICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ24nfSwKLSAgeyJkeW5hbWljIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdkJ30sCi0gIHsiYXJjaC1zcGVjaWZpYyIsICAgIG5vX2FyZ3VtZW50LCAwLCAnQSd9LAotICB7InZlcnNpb24taW5mbyIsICAgICBub19hcmd1bWVudCwgMCwgJ1YnfSwKLSAgeyJ1c2UtZHluYW1pYyIsICAgICAgbm9fYXJndW1lbnQsIDAsICdEJ30sCi0gIHsiaGV4LWR1bXAiLCAgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAneCd9LAotICB7ImRlYnVnLWR1bXAiLCAgICAgICBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ3cnfSwKLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0gIHsiaW5zdHJ1Y3Rpb24tZHVtcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnaSd9LAotI2VuZGlmCi0KLSAgeyJ2ZXJzaW9uIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICd2J30sCi0gIHsiaGVscCIsICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnSCd9LAotICB7MCwgICAgICAgICAgICAgICAgICBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoKQotewotICBmcHJpbnRmIChzdGRvdXQsIF8oIlVzYWdlOiByZWFkZWxmIHtvcHRpb25zfSBlbGYtZmlsZShzKVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgT3B0aW9ucyBhcmU6XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtYSBvciAtLWFsbCAgICAgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1oIC1sIC1TIC1zIC1yIC1kIC1WIC1BIC1JXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtaCBvciAtLWZpbGUtaGVhZGVyICAgICAgIERpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlclxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWwgb3IgLS1wcm9ncmFtLWhlYWRlcnMgb3IgLS1zZWdtZW50c1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBwcm9ncmFtIGhlYWRlcnNcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1TIG9yIC0tc2VjdGlvbi1oZWFkZXJzIG9yIC0tc2VjdGlvbnNcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgc2VjdGlvbnMnIGhlYWRlclxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWUgb3IgLS1oZWFkZXJzICAgICAgICAgICBFcXVpdmFsZW50IHRvOiAtaCAtbCAtU1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXMgb3IgLS1zeW1zIG9yIC0tc3ltYm9scyBEaXNwbGF5IHRoZSBzeW1ib2wgdGFibGVcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1uIG9yIC0tbm90ZXMgICAgICAgICAgICAgRGlzcGxheSB0aGUgY29yZSBub3RlcyAoaWYgcHJlc2VudClcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1yIG9yIC0tcmVsb2NzICAgICAgICAgICAgRGlzcGxheSB0aGUgcmVsb2NhdGlvbnMgKGlmIHByZXNlbnQpXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtZCBvciAtLWR5bmFtaWMgICAgICAgICAgIERpc3BsYXkgdGhlIGR5bmFtaWMgc2VnbWVudCAoaWYgcHJlc2VudClcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1WIG9yIC0tdmVyc2lvbi1pbmZvICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBzZWN0aW9ucyAoaWYgcHJlc2VudClcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1BIG9yIC0tYXJjaC1zcGVjaWZpYyAgICAgRGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24gKGlmIGFueSkuXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtRCBvciAtLXVzZS1keW5hbWljICAgICAgIFVzZSB0aGUgZHluYW1pYyBzZWN0aW9uIGluZm8gd2hlbiBkaXNwbGF5aW5nIHN5bWJvbHNcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC14IDxudW1iZXI+IG9yIC0taGV4LWR1bXA9PG51bWJlcj5cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtcCB0aGUgY29udGVudHMgb2Ygc2VjdGlvbiA8bnVtYmVyPlxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXdbbGlhcHJdIG9yIC0tZGVidWctZHVtcFs9bGluZSw9aW5mbyw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBEV0FSRjIgZGVidWcgc2VjdGlvbnNcbiIpKTsKLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtaSA8bnVtYmVyPiBvciAtLWluc3RydWN0aW9uLWR1bXA9PG51bWJlcj5cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYXNzZW1ibGUgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIpKTsKLSNlbmRpZgotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLUkgb3IgLS1oaXN0b2dyYW0gICAgICAgICBEaXNwbGF5IGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtdiBvciAtLXZlcnNpb24gICAgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHJlYWRlbGZcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1IIG9yIC0taGVscCAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0KLSAgZXhpdCAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZXF1ZXN0X2R1bXAgKHNlY3Rpb24sIHR5cGUpCi0gICAgIHVuc2lnbmVkIGludCBzZWN0aW9uOwotICAgICBjaGFyICAgICAgICAgdHlwZTsKLXsKLSAgaWYgKHNlY3Rpb24gPj0gbnVtX2R1bXBfc2VjdHMpCi0gICAgewotICAgICAgY2hhciAqIG5ld19kdW1wX3NlY3RzOwotCi0gICAgICBuZXdfZHVtcF9zZWN0cyA9IChjaGFyICopIGNhbGxvYyAoc2VjdGlvbiArIDEsIDEpOwotCi0gICAgICBpZiAobmV3X2R1bXBfc2VjdHMgPT0gTlVMTCkKLQllcnJvciAoXygiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGR1bXAgcmVxdWVzdCB0YWJsZS4iKSk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ29weSBjdXJyZW50IGZsYWcgc2V0dGluZ3MuICAqLwotCSAgbWVtY3B5IChuZXdfZHVtcF9zZWN0cywgZHVtcF9zZWN0cywgbnVtX2R1bXBfc2VjdHMpOwotCi0JICBmcmVlIChkdW1wX3NlY3RzKTsKLQotCSAgZHVtcF9zZWN0cyA9IG5ld19kdW1wX3NlY3RzOwotCSAgbnVtX2R1bXBfc2VjdHMgPSBzZWN0aW9uICsgMTsKLQl9Ci0gICAgfQotCi0gIGlmIChkdW1wX3NlY3RzKQotICAgIGR1bXBfc2VjdHMgW3NlY3Rpb25dIHw9IHR5cGU7Ci0KLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiogYXJndjsKLXsKLSAgaW50IGM7Ci0KLSAgaWYgKGFyZ2MgPCAyKQotICAgIHVzYWdlICgpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nCi0JICAoYXJnYywgYXJndiwgImVyc2FobmxkU0RBSXc6Ong6aTp2ViIsIG9wdGlvbnMsIE5VTEwpKSAhPSBFT0YpCi0gICAgewotICAgICAgY2hhciAqICAgIGNwOwotICAgICAgaW50CXNlY3Rpb247Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAwOgotCSAgLyogTG9uZyBvcHRpb25zLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ0gnOgotCSAgdXNhZ2UgKCk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2EnOgotCSAgZG9fc3ltcyArKzsKLQkgIGRvX3JlbG9jICsrOwotCSAgZG9fZHluYW1pYyArKzsKLQkgIGRvX2hlYWRlciArKzsKLQkgIGRvX3NlY3Rpb25zICsrOwotCSAgZG9fc2VnbWVudHMgKys7Ci0JICBkb192ZXJzaW9uICsrOwotCSAgZG9faGlzdG9ncmFtICsrOwotCSAgZG9fYXJjaCArKzsKLQkgIGRvX25vdGVzICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICBkb19oZWFkZXIgKys7Ci0JICBkb19zZWN0aW9ucyArKzsKLQkgIGRvX3NlZ21lbnRzICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBkb19hcmNoICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkb191c2luZ19keW5hbWljICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAncic6Ci0JICBkb19yZWxvYyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgZG9faGVhZGVyICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICBkb19zZWdtZW50cyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgZG9fc3ltcyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgZG9fc2VjdGlvbnMgKys7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRvX2R5bmFtaWMgKys7Ci0JICBicmVhazsKLQljYXNlICdJJzoKLQkgIGRvX2hpc3RvZ3JhbSArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgZG9fbm90ZXMgKys7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGRvX2R1bXAgKys7Ci0JICBzZWN0aW9uID0gc3RydG91bCAob3B0YXJnLCAmIGNwLCAwKTsKLQkgIGlmICghICogY3AgJiYgc2VjdGlvbiA+PSAwKQotCSAgICB7Ci0JICAgICAgcmVxdWVzdF9kdW1wIChzZWN0aW9uLCBIRVhfRFVNUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGdvdG8gb29wczsKLQljYXNlICd3JzoKLQkgIGRvX2R1bXAgKys7Ci0JICBpZiAob3B0YXJnID09IDApCi0JICAgIGRvX2RlYnVnZ2luZyA9IDE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBkb19kZWJ1Z2dpbmcgPSAwOwotCSAgICAgIHN3aXRjaCAob3B0YXJnWzBdKQotCQl7Ci0JCWNhc2UgJ2knOgotCQljYXNlICdJJzoKLQkJICBkb19kZWJ1Z19pbmZvID0gMTsKLQkJICBicmVhazsKLQotCQljYXNlICdhJzoKLQkJY2FzZSAnQSc6Ci0JCSAgZG9fZGVidWdfYWJicmV2cyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbCc6Ci0JCWNhc2UgJ0wnOgotCQkgIGRvX2RlYnVnX2xpbmVzID0gMTsKLQkJICBicmVhazsKLQotCQljYXNlICdwJzoKLQkJY2FzZSAnUCc6Ci0JCSAgZG9fZGVidWdfcHVibmFtZXMgPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3InOgotCQljYXNlICdSJzoKLQkJICBkb19kZWJ1Z19hcmFuZ2VzID0gMTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIHdhcm4gKF8oIlVucmVjb2duaXNlZCBkZWJ1ZyBvcHRpb24gJyVzJ1xuIiksIG9wdGFyZyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotCWNhc2UgJ2knOgotCSAgZG9fZHVtcCArKzsKLQkgIHNlY3Rpb24gPSBzdHJ0b3VsIChvcHRhcmcsICYgY3AsIDApOwotCSAgaWYgKCEgKiBjcCAmJiBzZWN0aW9uID49IDApCi0JICAgIHsKLQkgICAgICByZXF1ZXN0X2R1bXAgKHNlY3Rpb24sIERJU0FTU19EVU1QKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZ290byBvb3BzOwotI2VuZGlmCi0JY2FzZSAndic6Ci0JICBwcmludF92ZXJzaW9uIChwcm9ncmFtX25hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBkb192ZXJzaW9uICsrOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQlvb3BzOgotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGVycm9yIChfKCJJbnZhbGlkIG9wdGlvbiAnLSVjJ1xuIiksIGMpOwotCSAgLyogRHJvcCB0aHJvdWdoLiAgKi8KLQljYXNlICc/JzoKLQkgIHVzYWdlICgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFkb19keW5hbWljICYmICFkb19zeW1zICYmICFkb19yZWxvYyAmJiAhZG9fc2VjdGlvbnMKLSAgICAgICYmICFkb19zZWdtZW50cyAmJiAhZG9faGVhZGVyICYmICFkb19kdW1wICYmICFkb192ZXJzaW9uCi0gICAgICAmJiAhZG9faGlzdG9ncmFtICYmICFkb19kZWJ1Z2dpbmcgJiYgIWRvX2FyY2ggJiYgIWRvX25vdGVzKQotICAgIHVzYWdlICgpOwotICBlbHNlIGlmIChhcmdjIDwgMykKLSAgICB7Ci0gICAgICB3YXJuIChfKCJOb3RoaW5nIHRvIGRvLlxuIikpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9lbGZfY2xhc3MgKGVsZl9jbGFzcykKLSAgICAgdW5zaWduZWQgY2hhciBlbGZfY2xhc3M7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKGVsZl9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBFTEZDTEFTU05PTkU6IHJldHVybiBfKCJub25lIik7Ci0gICAgY2FzZSBFTEZDTEFTUzMyOiAgIHJldHVybiBfKCJFTEYzMiIpOwotICAgIGNhc2UgRUxGQ0xBU1M2NDogICByZXR1cm4gXygiRUxGNjQiKTsKLSAgICBkZWZhdWx0OgotICAgICAgc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd246ICV4PiIpLCBlbGZfY2xhc3MpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfZGF0YV9lbmNvZGluZyAoZW5jb2RpbmcpCi0gICAgIHVuc2lnbmVkIGNoYXIgZW5jb2Rpbmc7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKGVuY29kaW5nKQotICAgIHsKLSAgICBjYXNlIEVMRkRBVEFOT05FOiByZXR1cm4gXygibm9uZSIpOwotICAgIGNhc2UgRUxGREFUQTJMU0I6IHJldHVybiBfKCIyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiIpOwotICAgIGNhc2UgRUxGREFUQTJNU0I6IHJldHVybiBfKCIyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bjogJXg+IiksIGVuY29kaW5nKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X29zYWJpX25hbWUgKG9zYWJpKQotICAgICB1bnNpZ25lZCBjaGFyIG9zYWJpOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoIChvc2FiaSkKLSAgICB7Ci0gICAgY2FzZSBFTEZPU0FCSV9TWVNWOiAgICAgICByZXR1cm4gXygiVU5JWCAtIFN5c3RlbSBWIik7Ci0gICAgY2FzZSBFTEZPU0FCSV9IUFVYOiAgICAgICByZXR1cm4gXygiVU5JWCAtIEhQLVVYIik7Ci0gICAgY2FzZSBFTEZPU0FCSV9MSU5VWDogICAgICByZXR1cm4gXygiVU5JWCAtIExpbnV4Iik7Ci0gICAgY2FzZSBFTEZPU0FCSV9TVEFOREFMT05FOiByZXR1cm4gXygiU3RhbmRhbG9uZSBBcHAiKTsKLSAgICBjYXNlIEVMRk9TQUJJX0FSTTogICAgICAgIHJldHVybiBfKCJBUk0iKTsKLSAgICBkZWZhdWx0OgotICAgICAgc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd246ICV4PiIpLCBvc2FiaSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLS8qIERlY29kZSB0aGUgZGF0YSBoZWxkIGluICdlbGZfaGVhZGVyJy4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2ZpbGVfaGVhZGVyICgpCi17Ci0gIGlmICggICBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX01BRzBdICE9IEVMRk1BRzAKLSAgICAgIHx8IGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfTUFHMV0gIT0gRUxGTUFHMQotICAgICAgfHwgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUcyXSAhPSBFTEZNQUcyCi0gICAgICB8fCBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX01BRzNdICE9IEVMRk1BRzMpCi0gICAgewotICAgICAgZXJyb3IKLQkoXygiTm90IGFuIEVMRiBmaWxlIC0gaXQgaGFzIHRoZSB3cm9uZyBtYWdpYyBieXRlcyBhdCB0aGUgc3RhcnRcbiIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoZG9faGVhZGVyKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBwcmludGYgKF8oIkVMRiBIZWFkZXI6XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgTWFnaWM6ICAgIikpOwotICAgICAgZm9yIChpID0gMDsgaSA8IEVJX05JREVOVDsgaSArKykKLQlwcmludGYgKCIlMi4yeCAiLCBlbGZfaGVhZGVyLmVfaWRlbnQgW2ldKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKF8oIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X2VsZl9jbGFzcyAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9DTEFTU10pKTsKLSAgICAgIHByaW50ZiAoXygiICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKLQkgICAgICBnZXRfZGF0YV9lbmNvZGluZyAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkpOwotICAgICAgcHJpbnRmIChfKCIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgJWQgJXNcbiIpLAotCSAgICAgIGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfVkVSU0lPTl0sCi0JICAgICAgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfVkVSU0lPTl0gPT0gRVZfQ1VSUkVOVAotCSAgICAgICA/ICIoY3VycmVudCkiCi0JICAgICAgIDogKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfVkVSU0lPTl0gIT0gRVZfTk9ORQotCQkgID8gIjx1bmtub3duOiAlbHg+IgotCQkgIDogIiIpKSk7Ci0gICAgICBwcmludGYgKF8oIiAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X29zYWJpX25hbWUgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfT1NBQkldKSk7Ci0gICAgICBwcmludGYgKF8oIiAgQUJJIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAlZFxuIiksCi0JICAgICAgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9BQklWRVJTSU9OXSk7Ci0gICAgICBwcmludGYgKF8oIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X2ZpbGVfdHlwZSAoZWxmX2hlYWRlci5lX3R5cGUpKTsKLSAgICAgIHByaW50ZiAoXygiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKLQkgICAgICBnZXRfbWFjaGluZV9uYW1lIChlbGZfaGVhZGVyLmVfbWFjaGluZSkpOwotICAgICAgcHJpbnRmIChfKCIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHglbHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfdmVyc2lvbik7Ci0gICAgICAKLSAgICAgIHByaW50ZiAoXygiICBFbnRyeSBwb2ludCBhZGRyZXNzOiAgICAgICAgICAgICAgICIpKTsKLSAgICAgIHByaW50X3ZtYSAoKGJmZF92bWEpIGVsZl9oZWFkZXIuZV9lbnRyeSwgUFJFRklYX0hFWCk7Ci0gICAgICBwcmludGYgKF8oIlxuICBTdGFydCBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICIpKTsKLSAgICAgIHByaW50X3ZtYSAoKGJmZF92bWEpIGVsZl9oZWFkZXIuZV9waG9mZiwgREVDKTsKLSAgICAgIHByaW50ZiAoXygiIChieXRlcyBpbnRvIGZpbGUpXG4gIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgIikpOwotICAgICAgcHJpbnRfdm1hICgoYmZkX3ZtYSkgZWxmX2hlYWRlci5lX3Nob2ZmLCBERUMpOwotICAgICAgcHJpbnRmIChfKCIgKGJ5dGVzIGludG8gZmlsZSlcbiIpKTsKLQkKLSAgICAgIHByaW50ZiAoXygiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4JXNcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZmxhZ3MsCi0JICAgICAgZ2V0X21hY2hpbmVfZmxhZ3MgKGVsZl9oZWFkZXIuZV9mbGFncywgZWxmX2hlYWRlci5lX21hY2hpbmUpKTsKLSAgICAgIHByaW50ZiAoXygiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICVsZCAoYnl0ZXMpXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX2Voc2l6ZSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9waGVudHNpemUpOwotICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3BobnVtKTsKLSAgICAgIHByaW50ZiAoXygiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgICVsZCAoYnl0ZXMpXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3NoZW50c2l6ZSk7Ci0gICAgICBwcmludGYgKF8oIiAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAlbGRcbiIpLAotCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfc2hudW0pOwotICAgICAgcHJpbnRmIChfKCIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJWxkXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3Noc3RybmR4KTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotZ2V0XzMyYml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKiBwcm9ncmFtX2hlYWRlcnM7Ci17Ci0gIEVsZjMyX0V4dGVybmFsX1BoZHIgKiBwaGRyczsKLSAgRWxmMzJfRXh0ZXJuYWxfUGhkciAqIGV4dGVybmFsOwotICBFbGYzMl9JbnRlcm5hbF9QaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotCi0gIEdFVF9EQVRBX0FMTE9DIChlbGZfaGVhZGVyLmVfcGhvZmYsCi0JCSAgZWxmX2hlYWRlci5lX3BoZW50c2l6ZSAqIGVsZl9oZWFkZXIuZV9waG51bSwKLQkJICBwaGRycywgRWxmMzJfRXh0ZXJuYWxfUGhkciAqLCAicHJvZ3JhbSBoZWFkZXJzIik7Ci0KLSAgZm9yIChpID0gMCwgaW50ZXJuYWwgPSBwcm9ncmFtX2hlYWRlcnMsIGV4dGVybmFsID0gcGhkcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsKLSAgICAgICBpICsrLCBpbnRlcm5hbCArKywgZXh0ZXJuYWwgKyspCi0gICAgewotICAgICAgaW50ZXJuYWwtPnBfdHlwZSAgID0gQllURV9HRVQgKGV4dGVybmFsLT5wX3R5cGUpOwotICAgICAgaW50ZXJuYWwtPnBfb2Zmc2V0ID0gQllURV9HRVQgKGV4dGVybmFsLT5wX29mZnNldCk7Ci0gICAgICBpbnRlcm5hbC0+cF92YWRkciAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfdmFkZHIpOwotICAgICAgaW50ZXJuYWwtPnBfcGFkZHIgID0gQllURV9HRVQgKGV4dGVybmFsLT5wX3BhZGRyKTsKLSAgICAgIGludGVybmFsLT5wX2ZpbGVzeiA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF9maWxlc3opOwotICAgICAgaW50ZXJuYWwtPnBfbWVtc3ogID0gQllURV9HRVQgKGV4dGVybmFsLT5wX21lbXN6KTsKLSAgICAgIGludGVybmFsLT5wX2ZsYWdzICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF9mbGFncyk7Ci0gICAgICBpbnRlcm5hbC0+cF9hbGlnbiAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfYWxpZ24pOwotICAgIH0KLQotICBmcmVlIChwaGRycyk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF82NGJpdF9wcm9ncmFtX2hlYWRlcnMgKGZpbGUsIHByb2dyYW1faGVhZGVycykKLSAgICAgRklMRSAqIGZpbGU7Ci0gICAgIEVsZl9JbnRlcm5hbF9QaGRyICogcHJvZ3JhbV9oZWFkZXJzOwotewotICBFbGY2NF9FeHRlcm5hbF9QaGRyICogcGhkcnM7Ci0gIEVsZjY0X0V4dGVybmFsX1BoZHIgKiBleHRlcm5hbDsKLSAgRWxmNjRfSW50ZXJuYWxfUGhkciAqIGludGVybmFsOwotICB1bnNpZ25lZCBpbnQgICAgICAgICAgaTsKLQotICBHRVRfREFUQV9BTExPQyAoZWxmX2hlYWRlci5lX3Bob2ZmLAotCQkgIGVsZl9oZWFkZXIuZV9waGVudHNpemUgKiBlbGZfaGVhZGVyLmVfcGhudW0sCi0JCSAgcGhkcnMsIEVsZjY0X0V4dGVybmFsX1BoZHIgKiwgInByb2dyYW0gaGVhZGVycyIpOwotCi0gIGZvciAoaSA9IDAsIGludGVybmFsID0gcHJvZ3JhbV9oZWFkZXJzLCBleHRlcm5hbCA9IHBoZHJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfcGhudW07Ci0gICAgICAgaSArKywgaW50ZXJuYWwgKyssIGV4dGVybmFsICsrKQotICAgIHsKLSAgICAgIGludGVybmFsLT5wX3R5cGUgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF90eXBlKTsKLSAgICAgIGludGVybmFsLT5wX2ZsYWdzICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF9mbGFncyk7Ci0gICAgICBpbnRlcm5hbC0+cF9vZmZzZXQgPSBCWVRFX0dFVDggKGV4dGVybmFsLT5wX29mZnNldCk7Ci0gICAgICBpbnRlcm5hbC0+cF92YWRkciAgPSBCWVRFX0dFVDggKGV4dGVybmFsLT5wX3ZhZGRyKTsKLSAgICAgIGludGVybmFsLT5wX3BhZGRyICA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfcGFkZHIpOwotICAgICAgaW50ZXJuYWwtPnBfZmlsZXN6ID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF9maWxlc3opOwotICAgICAgaW50ZXJuYWwtPnBfbWVtc3ogID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF9tZW1zeik7Ci0gICAgICBpbnRlcm5hbC0+cF9hbGlnbiAgPSBCWVRFX0dFVDggKGV4dGVybmFsLT5wX2FsaWduKTsKLSAgICB9Ci0KLSAgZnJlZSAocGhkcnMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3Byb2dyYW1faGVhZGVycyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICogcHJvZ3JhbV9oZWFkZXJzOwotICBFbGZfSW50ZXJuYWxfUGhkciAqIHNlZ21lbnQ7Ci0gIHVuc2lnbmVkIGludAkgICAgICBpOwotCi0gIGlmIChlbGZfaGVhZGVyLmVfcGhudW0gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZG9fc2VnbWVudHMpCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyBwcm9ncmFtIGhlYWRlcnMgaW4gdGhpcyBmaWxlLlxuIikpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChkb19zZWdtZW50cyAmJiAhZG9faGVhZGVyKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5FbGYgZmlsZSB0eXBlIGlzICVzXG4iKSwgZ2V0X2ZpbGVfdHlwZSAoZWxmX2hlYWRlci5lX3R5cGUpKTsKLSAgICAgIHByaW50ZiAoXygiRW50cnkgcG9pbnQgIikpOwotICAgICAgcHJpbnRfdm1hICgoYmZkX3ZtYSkgZWxmX2hlYWRlci5lX2VudHJ5LCBQUkVGSVhfSEVYKTsKLSAgICAgIHByaW50ZiAoXygiXG5UaGVyZSBhcmUgJWQgcHJvZ3JhbSBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgIiksCi0JICAgICAgZWxmX2hlYWRlci5lX3BobnVtKTsKLSAgICAgIHByaW50X3ZtYSAoKGJmZF92bWEpIGVsZl9oZWFkZXIuZV9waG9mZiwgREVDKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotCi0gIHByb2dyYW1faGVhZGVycyA9IChFbGZfSW50ZXJuYWxfUGhkciAqKSBtYWxsb2MKLSAgICAoZWxmX2hlYWRlci5lX3BobnVtICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUGhkcikpOwotCi0gIGlmIChwcm9ncmFtX2hlYWRlcnMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChpc18zMmJpdF9lbGYpCi0gICAgaSA9IGdldF8zMmJpdF9wcm9ncmFtX2hlYWRlcnMgKGZpbGUsIHByb2dyYW1faGVhZGVycyk7Ci0gIGVsc2UKLSAgICBpID0gZ2V0XzY0Yml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKTsKLQotICBpZiAoaSA9PSAwKQotICAgIHsKLSAgICAgIGZyZWUgKHByb2dyYW1faGVhZGVycyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX3NlZ21lbnRzKQotICAgIHsKLSAgICAgIHByaW50ZgotCShfKCJcblByb2dyYW0gSGVhZGVyJXM6XG4iKSwgZWxmX2hlYWRlci5lX3BobnVtID4gMSA/ICJzIiA6ICIiKTsKLSAgICAgIAotICAgICAgaWYgKGlzXzMyYml0X2VsZikKLQlwcmludGYKLQkgIChfKCIgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgUGh5c0FkZHIgICBGaWxlU2l6IE1lbVNpeiAgRmxnIEFsaWduXG4iKSk7Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmCi0JICAgIChfKCIgIFR5cGUgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICBWaXJ0QWRkciAgICAgICAgICAgUGh5c0FkZHJcbiIpKTsKLQkgIHByaW50ZgotCSAgICAoXygiICAgICAgICAgICAgICAgICBGaWxlU2l6ICAgICAgICAgICAgTWVtU2l6ICAgICAgICAgICAgICBGbGFncyAgQWxpZ25cbiIpKTsKLQl9Ci0gICAgfQotCi0gIGxvYWRhZGRyID0gLTE7Ci0gIGR5bmFtaWNfYWRkciA9IDA7Ci0gIGR5bmFtaWNfc2l6ZSA9IDA7Ci0KLSAgZm9yIChpID0gMCwgc2VnbWVudCA9IHByb2dyYW1faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3BobnVtOwotICAgICAgIGkgKyssIHNlZ21lbnQgKyspCi0gICAgewotICAgICAgaWYgKGRvX3NlZ21lbnRzKQotCXsKLQkgIHByaW50ZiAoIiAgJS0xNC4xNHMgIiwgZ2V0X3NlZ21lbnRfdHlwZSAoc2VnbWVudC0+cF90eXBlKSk7Ci0KLQkgIGlmIChpc18zMmJpdF9lbGYpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIweCU2LjZseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9vZmZzZXQpOwotCSAgICAgIHByaW50ZiAoIjB4JTguOGx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX3ZhZGRyKTsKLQkgICAgICBwcmludGYgKCIweCU4LjhseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9wYWRkcik7Ci0JICAgICAgcHJpbnRmICgiMHglNS41bHggIiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfZmlsZXN6KTsKLQkgICAgICBwcmludGYgKCIweCU1LjVseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9tZW1zeik7Ci0JICAgICAgcHJpbnRmICgiJWMlYyVjICIsCi0JCSAgICAgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfUiA/ICdSJyA6ICcgJyksCi0JCSAgICAgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfVyA/ICdXJyA6ICcgJyksCi0JCSAgICAgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfWCA/ICdFJyA6ICcgJykpOwotCSAgICAgIHByaW50ZiAoIiUjbHgiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9hbGlnbik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50X3ZtYSAoc2VnbWVudC0+cF9vZmZzZXQsIEZVTExfSEVYKTsKLQkgICAgICBwdXRjaGFyICgnICcpOwotCSAgICAgIHByaW50X3ZtYSAoc2VnbWVudC0+cF92YWRkciwgRlVMTF9IRVgpOwotCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JICAgICAgcHJpbnRfdm1hIChzZWdtZW50LT5wX3BhZGRyLCBGVUxMX0hFWCk7Ci0JICAgICAgcHJpbnRmICgiXG4gICAgICAgICAgICAgICAgICIpOwotCSAgICAgIHByaW50X3ZtYSAoc2VnbWVudC0+cF9maWxlc3osIEZVTExfSEVYKTsKLQkgICAgICBwdXRjaGFyICgnICcpOwotCSAgICAgIHByaW50X3ZtYSAoc2VnbWVudC0+cF9tZW1zeiwgRlVMTF9IRVgpOwotCSAgICAgIHByaW50ZiAoIiAgJWMlYyVjICAgICIsCi0JCSAgICAgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfUiA/ICdSJyA6ICcgJyksCi0JCSAgICAgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfVyA/ICdXJyA6ICcgJyksCi0JCSAgICAgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfWCA/ICdFJyA6ICcgJykpOwotCSAgICAgIHByaW50X3ZtYSAoc2VnbWVudC0+cF9hbGlnbiwgSEVYKTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChzZWdtZW50LT5wX3R5cGUpCi0JewotCWNhc2UgUFRfTE9BRDoKLQkgIGlmIChsb2FkYWRkciA9PSAtMSkKLQkgICAgbG9hZGFkZHIgPSAoc2VnbWVudC0+cF92YWRkciAmIDB4ZmZmZmYwMDApCi0JICAgICAgLSAoc2VnbWVudC0+cF9vZmZzZXQgJiAweGZmZmZmMDAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBQVF9EWU5BTUlDOgotCSAgaWYgKGR5bmFtaWNfYWRkcikKLQkgICAgZXJyb3IgKF8oIm1vcmUgdGhhbiBvbmUgZHluYW1pYyBzZWdtZW50XG4iKSk7Ci0KLQkgIGR5bmFtaWNfYWRkciA9IHNlZ21lbnQtPnBfb2Zmc2V0OwotCSAgZHluYW1pY19zaXplID0gc2VnbWVudC0+cF9maWxlc3o7Ci0JICBicmVhazsKLQotCWNhc2UgUFRfSU5URVJQOgotCSAgaWYgKGZzZWVrIChmaWxlLCAobG9uZykgc2VnbWVudC0+cF9vZmZzZXQsIFNFRUtfU0VUKSkKLQkgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBmaW5kIHByb2dyYW0gaW50ZXJwcmV0ZXIgbmFtZVxuIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJvZ3JhbV9pbnRlcnByZXRlclswXSA9IDA7Ci0JICAgICAgZnNjYW5mIChmaWxlLCAiJTYzcyIsIHByb2dyYW1faW50ZXJwcmV0ZXIpOwotCi0JICAgICAgaWYgKGRvX3NlZ21lbnRzKQotCQlwcmludGYgKF8oIlxuICAgICAgW1JlcXVlc3RpbmcgcHJvZ3JhbSBpbnRlcnByZXRlcjogJXNdIiksCi0JCSAgICBwcm9ncmFtX2ludGVycHJldGVyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoZG9fc2VnbWVudHMpCi0JcHV0YyAoJ1xuJywgc3Rkb3V0KTsKLSAgICB9Ci0KLSAgaWYgKGxvYWRhZGRyID09IC0xKQotICAgIHsKLSAgICAgIC8qIFZlcnkgc3RyYW5nZS4gKi8KLSAgICAgIGxvYWRhZGRyID0gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX3NlZ21lbnRzICYmIHNlY3Rpb25faGVhZGVycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG4gU2VjdGlvbiB0byBTZWdtZW50IG1hcHBpbmc6XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2VnbWVudCBTZWN0aW9ucy4uLlxuIikpOwotCi0gICAgICBhc3NlcnQgKHN0cmluZ190YWJsZSAhPSBOVUxMKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsgaSsrKQotCXsKLQkgIGludCAgICAgICAgICAgICAgICAgajsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLQotCSAgc2VnbWVudCA9IHByb2dyYW1faGVhZGVycyArIGk7Ci0JICBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotCi0JICBwcmludGYgKCIgICAlMi4yZCAgICAgIiwgaSk7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBlbGZfaGVhZGVyLmVfc2hudW07IGorKywgc2VjdGlvbiArKykKLQkgICAgewotCSAgICAgIGlmIChzZWN0aW9uLT5zaF9zaXplID4gMAotCQkgIC8qIENvbXBhcmUgYWxsb2NhdGVkIHNlY3Rpb25zIGJ5IFZNQSwgdW5hbGxvY2F0ZWQKLQkJICAgICBzZWN0aW9ucyBieSBmaWxlIG9mZnNldC4gICovCi0JCSAgJiYgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX0FMTE9DCi0JCSAgICAgID8gKHNlY3Rpb24tPnNoX2FkZHIgPj0gc2VnbWVudC0+cF92YWRkcgotCQkJICYmIHNlY3Rpb24tPnNoX2FkZHIgKyBzZWN0aW9uLT5zaF9zaXplCi0JCQkgPD0gc2VnbWVudC0+cF92YWRkciArIHNlZ21lbnQtPnBfbWVtc3opCi0JCSAgICAgIDogKChiZmRfdm1hKSBzZWN0aW9uLT5zaF9vZmZzZXQgPj0gc2VnbWVudC0+cF9vZmZzZXQKLQkJCSAmJiAoc2VjdGlvbi0+c2hfb2Zmc2V0ICsgc2VjdGlvbi0+c2hfc2l6ZQotCQkJICAgICA8PSBzZWdtZW50LT5wX29mZnNldCArIHNlZ21lbnQtPnBfZmlsZXN6KSkpKQotCQlwcmludGYgKCIlcyAiLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQkgICAgfQotCi0JICBwdXRjICgnXG4nLHN0ZG91dCk7Ci0JfQotICAgIH0KLQotICBmcmVlIChwcm9ncmFtX2hlYWRlcnMpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLWdldF8zMmJpdF9zZWN0aW9uX2hlYWRlcnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9FeHRlcm5hbF9TaGRyICogc2hkcnM7Ci0gIEVsZjMyX0ludGVybmFsX1NoZHIgKiBpbnRlcm5hbDsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgIGk7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9zaG9mZiwKLQkJICBlbGZfaGVhZGVyLmVfc2hlbnRzaXplICogZWxmX2hlYWRlci5lX3NobnVtLAotCQkgIHNoZHJzLCBFbGYzMl9FeHRlcm5hbF9TaGRyICosICJzZWN0aW9uIGhlYWRlcnMiKTsKLQotICBzZWN0aW9uX2hlYWRlcnMgPSAoRWxmX0ludGVybmFsX1NoZHIgKikgbWFsbG9jCi0gICAgKGVsZl9oZWFkZXIuZV9zaG51bSAqIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKTsKLQotICBpZiAoc2VjdGlvbl9oZWFkZXJzID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrKQotICAgIHsKLSAgICAgIGludGVybmFsLT5zaF9uYW1lICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfbmFtZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfdHlwZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX3R5cGUpOwotICAgICAgaW50ZXJuYWwtPnNoX2ZsYWdzICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9mbGFncyk7Ci0gICAgICBpbnRlcm5hbC0+c2hfYWRkciAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2FkZHIpOwotICAgICAgaW50ZXJuYWwtPnNoX29mZnNldCAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9vZmZzZXQpOwotICAgICAgaW50ZXJuYWwtPnNoX3NpemUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9zaXplKTsKLSAgICAgIGludGVybmFsLT5zaF9saW5rICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfbGluayk7Ci0gICAgICBpbnRlcm5hbC0+c2hfaW5mbyAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2luZm8pOwotICAgICAgaW50ZXJuYWwtPnNoX2FkZHJhbGlnbiA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9hZGRyYWxpZ24pOwotICAgICAgaW50ZXJuYWwtPnNoX2VudHNpemUgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9lbnRzaXplKTsKLSAgICB9Ci0KLSAgZnJlZSAoc2hkcnMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfNjRiaXRfc2VjdGlvbl9oZWFkZXJzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmNjRfRXh0ZXJuYWxfU2hkciAqIHNoZHJzOwotICBFbGY2NF9JbnRlcm5hbF9TaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotCi0gIEdFVF9EQVRBX0FMTE9DIChlbGZfaGVhZGVyLmVfc2hvZmYsCi0JCSAgZWxmX2hlYWRlci5lX3NoZW50c2l6ZSAqIGVsZl9oZWFkZXIuZV9zaG51bSwKLQkJICBzaGRycywgRWxmNjRfRXh0ZXJuYWxfU2hkciAqLCAic2VjdGlvbiBoZWFkZXJzIik7Ci0KLSAgc2VjdGlvbl9oZWFkZXJzID0gKEVsZl9JbnRlcm5hbF9TaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfc2hudW0gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSk7Ci0KLSAgaWYgKHNlY3Rpb25faGVhZGVycyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgaW50ZXJuYWwgPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLSAgICAgICBpICsrLCBpbnRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+c2hfbmFtZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX25hbWUpOwotICAgICAgaW50ZXJuYWwtPnNoX3R5cGUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF90eXBlKTsKLSAgICAgIGludGVybmFsLT5zaF9mbGFncyAgICAgPSBCWVRFX0dFVDggKHNoZHJzW2ldLnNoX2ZsYWdzKTsKLSAgICAgIGludGVybmFsLT5zaF9hZGRyICAgICAgPSBCWVRFX0dFVDggKHNoZHJzW2ldLnNoX2FkZHIpOwotICAgICAgaW50ZXJuYWwtPnNoX3NpemUgICAgICA9IEJZVEVfR0VUOCAoc2hkcnNbaV0uc2hfc2l6ZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfZW50c2l6ZSAgID0gQllURV9HRVQ4IChzaGRyc1tpXS5zaF9lbnRzaXplKTsKLSAgICAgIGludGVybmFsLT5zaF9saW5rICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfbGluayk7Ci0gICAgICBpbnRlcm5hbC0+c2hfaW5mbyAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2luZm8pOwotICAgICAgaW50ZXJuYWwtPnNoX29mZnNldCAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9vZmZzZXQpOwotICAgICAgaW50ZXJuYWwtPnNoX2FkZHJhbGlnbiA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9hZGRyYWxpZ24pOwotICAgIH0KLQotICBmcmVlIChzaGRycyk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfU3ltICoKLWdldF8zMmJpdF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBudW1iZXIpCi0gICAgIEZJTEUgKiBmaWxlOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci17Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqIGVzeW1zOwotICBFbGZfSW50ZXJuYWxfU3ltICogICBpc3ltczsKLSAgRWxmX0ludGVybmFsX1N5bSAqICAgcHN5bTsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgajsKLQotICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBudW1iZXIgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCi0JCSAgZXN5bXMsIEVsZjMyX0V4dGVybmFsX1N5bSAqLCAic3ltYm9scyIpOwotCi0gIGlzeW1zID0gKEVsZl9JbnRlcm5hbF9TeW0gKikgbWFsbG9jIChudW1iZXIgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKTsKLQotICBpZiAoaXN5bXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgZnJlZSAoZXN5bXMpOwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChqID0gMCwgcHN5bSA9IGlzeW1zOwotICAgICAgIGogPCBudW1iZXI7Ci0gICAgICAgaiArKywgcHN5bSArKykKLSAgICB7Ci0gICAgICBwc3ltLT5zdF9uYW1lICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9uYW1lKTsKLSAgICAgIHBzeW0tPnN0X3ZhbHVlID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3ZhbHVlKTsKLSAgICAgIHBzeW0tPnN0X3NpemUgID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3NpemUpOwotICAgICAgcHN5bS0+c3Rfc2huZHggPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfc2huZHgpOwotICAgICAgcHN5bS0+c3RfaW5mbyAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfaW5mbyk7Ci0gICAgICBwc3ltLT5zdF9vdGhlciA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9vdGhlcik7Ci0gICAgfQotCi0gIGZyZWUgKGVzeW1zKTsKLQotICByZXR1cm4gaXN5bXM7Ci19Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfU3ltICoKLWdldF82NGJpdF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBudW1iZXIpCi0gICAgIEZJTEUgKiBmaWxlOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci17Ci0gIEVsZjY0X0V4dGVybmFsX1N5bSAqIGVzeW1zOwotICBFbGZfSW50ZXJuYWxfU3ltICogICBpc3ltczsKLSAgRWxmX0ludGVybmFsX1N5bSAqICAgcHN5bTsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgajsKLQotICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBudW1iZXIgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSksCi0JCSAgZXN5bXMsIEVsZjY0X0V4dGVybmFsX1N5bSAqLCAic3ltYm9scyIpOwotCi0gIGlzeW1zID0gKEVsZl9JbnRlcm5hbF9TeW0gKikgbWFsbG9jIChudW1iZXIgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKTsKLQotICBpZiAoaXN5bXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgZnJlZSAoZXN5bXMpOwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChqID0gMCwgcHN5bSA9IGlzeW1zOwotICAgICAgIGogPCBudW1iZXI7Ci0gICAgICAgaiArKywgcHN5bSArKykKLSAgICB7Ci0gICAgICBwc3ltLT5zdF9uYW1lICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9uYW1lKTsKLSAgICAgIHBzeW0tPnN0X2luZm8gID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X2luZm8pOwotICAgICAgcHN5bS0+c3Rfb3RoZXIgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfb3RoZXIpOwotICAgICAgcHN5bS0+c3Rfc2huZHggPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfc2huZHgpOwotICAgICAgcHN5bS0+c3RfdmFsdWUgPSBCWVRFX0dFVDggKGVzeW1zW2pdLnN0X3ZhbHVlKTsKLSAgICAgIHBzeW0tPnN0X3NpemUgID0gQllURV9HRVQ4IChlc3ltc1tqXS5zdF9zaXplKTsKLSAgICB9Ci0KLSAgZnJlZSAoZXN5bXMpOwotCi0gIHJldHVybiBpc3ltczsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X2VsZl9zZWN0aW9uX2ZsYWdzIChzaF9mbGFncykKLSAgICAgYmZkX3ZtYSBzaF9mbGFnczsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gICogYnVmZiA9IDA7Ci0gIAotICB3aGlsZSAoc2hfZmxhZ3MpCi0gICAgewotICAgICAgYmZkX3ZtYSBmbGFnOwotCi0gICAgICBmbGFnID0gc2hfZmxhZ3MgJiAtIHNoX2ZsYWdzOwotICAgICAgc2hfZmxhZ3MgJj0gfiBmbGFnOwotICAgICAgCi0gICAgICBzd2l0Y2ggKGZsYWcpCi0JewotCWNhc2UgU0hGX1dSSVRFOiAgICAgICAgICAgIHN0cmNhdCAoYnVmZiwgIlciKTsgYnJlYWs7Ci0JY2FzZSBTSEZfQUxMT0M6ICAgICAgICAgICAgc3RyY2F0IChidWZmLCAiQSIpOyBicmVhazsKLQljYXNlIFNIRl9FWEVDSU5TVFI6ICAgICAgICBzdHJjYXQgKGJ1ZmYsICJYIik7IGJyZWFrOwotCWNhc2UgU0hGX01FUkdFOiAgICAgICAgICAgIHN0cmNhdCAoYnVmZiwgIk0iKTsgYnJlYWs7Ci0JY2FzZSBTSEZfU1RSSU5HUzogICAgICAgICAgc3RyY2F0IChidWZmLCAiUyIpOyBicmVhazsKLQljYXNlIFNIRl9JTkZPX0xJTks6ICAgICAgICBzdHJjYXQgKGJ1ZmYsICJJIik7IGJyZWFrOwotCWNhc2UgU0hGX0xJTktfT1JERVI6ICAgICAgIHN0cmNhdCAoYnVmZiwgIkwiKTsgYnJlYWs7Ci0JY2FzZSBTSEZfT1NfTk9OQ09ORk9STUlORzogc3RyY2F0IChidWZmLCAiTyIpOyBicmVhazsKLQkgIAotCWRlZmF1bHQ6Ci0JICBpZiAoZmxhZyAmIFNIRl9NQVNLT1MpCi0JICAgIHsKLQkgICAgICBzdHJjYXQgKGJ1ZmYsICJvIik7Ci0JICAgICAgc2hfZmxhZ3MgJj0gfiBTSEZfTUFTS09TOwotCSAgICB9Ci0JICBlbHNlIGlmIChmbGFnICYgU0hGX01BU0tQUk9DKQotCSAgICB7Ci0JICAgICAgc3RyY2F0IChidWZmLCAicCIpOwotCSAgICAgIHNoX2ZsYWdzICY9IH4gU0hGX01BU0tQUk9DOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN0cmNhdCAoYnVmZiwgIngiKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gYnVmZjsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gIGludCAgICAgICAgICAgICAgICAgaTsKLQotICBzZWN0aW9uX2hlYWRlcnMgPSBOVUxMOwotCi0gIGlmIChlbGZfaGVhZGVyLmVfc2hudW0gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZG9fc2VjdGlvbnMpCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyBzZWN0aW9ucyBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoZG9fc2VjdGlvbnMgJiYgIWRvX2hlYWRlcikKLSAgICBwcmludGYgKF8oIlRoZXJlIGFyZSAlZCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweCVseDpcbiIpLAotCSAgICBlbGZfaGVhZGVyLmVfc2hudW0sICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfc2hvZmYpOwotCi0gIGlmIChpc18zMmJpdF9lbGYpCi0gICAgewotICAgICAgaWYgKCEgZ2V0XzMyYml0X3NlY3Rpb25faGVhZGVycyAoZmlsZSkpCi0JcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlIGlmICghIGdldF82NGJpdF9zZWN0aW9uX2hlYWRlcnMgKGZpbGUpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZSwgc28gdGhhdCB3ZSBoYXZlIG5hbWVzIHRvIGRpc3BsYXkuICAqLwotICBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzICsgZWxmX2hlYWRlci5lX3Noc3RybmR4OwotCi0gIGlmIChzZWN0aW9uLT5zaF9zaXplICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBzdHJpbmdfdGFibGVfb2Zmc2V0OwotCi0gICAgICBzdHJpbmdfdGFibGVfb2Zmc2V0ID0gc2VjdGlvbi0+c2hfb2Zmc2V0OwotCi0gICAgICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9zaXplLAotCQkgICAgICBzdHJpbmdfdGFibGUsIGNoYXIgKiwgInN0cmluZyB0YWJsZSIpOwotICAgIH0KLQotICAvKiBTY2FuIHRoZSBzZWN0aW9ucyBmb3IgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlCi0gICAgIGFuZCBkeW5hbWljIHN0cmluZyB0YWJsZSBhbmQgZGVidWcgc2VjdGlvbnMuICovCi0gIGR5bmFtaWNfc3ltYm9scyA9IE5VTEw7Ci0gIGR5bmFtaWNfc3RyaW5ncyA9IE5VTEw7Ci0gIGR5bmFtaWNfc3ltaW5mbyA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgY2hhciAqIG5hbWUgPSBTRUNUSU9OX05BTUUgKHNlY3Rpb24pOwotCi0gICAgICBpZiAoc2VjdGlvbi0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCXsKLQkgIGlmIChkeW5hbWljX3N5bWJvbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJGaWxlIGNvbnRhaW5zIG11bHRpcGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIikpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIG51bV9keW5hbWljX3N5bXMgPSBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQkgIGR5bmFtaWNfc3ltYm9scyA9Ci0JICAgIEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LCBudW1fZHluYW1pY19zeW1zKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9TVFJUQUIKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApCi0JewotCSAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKF8oIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzdHJpbmcgdGFibGVzXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJCSAgZHluYW1pY19zdHJpbmdzLCBjaGFyICosICJkeW5hbWljIHN0cmluZ3MiKTsKLQl9Ci0gICAgICBlbHNlIGlmICgoZG9fZGVidWdnaW5nIHx8IGRvX2RlYnVnX2luZm8gfHwgZG9fZGVidWdfYWJicmV2cwotCQl8fCBkb19kZWJ1Z19saW5lcyB8fCBkb19kZWJ1Z19wdWJuYW1lcyB8fCBkb19kZWJ1Z19hcmFuZ2VzKQotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIDcpID09IDApCi0JewotCSAgbmFtZSArPSA3OwotCi0JICBpZiAoZG9fZGVidWdnaW5nCi0JICAgICAgfHwgKGRvX2RlYnVnX2luZm8gICAgICYmIChzdHJjbXAgKG5hbWUsICJpbmZvIikgPT0gMCkpCi0JICAgICAgfHwgKGRvX2RlYnVnX2FiYnJldnMgICYmIChzdHJjbXAgKG5hbWUsICJhYmJyZXYiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfbGluZXMgICAgJiYgKHN0cmNtcCAobmFtZSwgImxpbmUiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfcHVibmFtZXMgJiYgKHN0cmNtcCAobmFtZSwgInB1Ym5hbWVzIikgPT0gMCkpCi0JICAgICAgfHwgKGRvX2RlYnVnX2FyYW5nZXMgICYmIChzdHJjbXAgKG5hbWUsICJhcmFuZ2VzIikgPT0gMCkpCi0JICAgICAgKQotCSAgICByZXF1ZXN0X2R1bXAgKGksIERFQlVHX0RVTVApOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZG9fc2VjdGlvbnMpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcHJpbnRmIChfKCJcblNlY3Rpb24gSGVhZGVyJXM6XG4iKSwgZWxmX2hlYWRlci5lX3NobnVtID4gMSA/ICJzIiA6ICIiKTsKLSAgCi0gIGlmIChpc18zMmJpdF9lbGYpCi0gICAgcHJpbnRmCi0gICAgICAoXygiICBbTnJdIE5hbWUgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsZyBMayBJbmYgQWxcbiIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiICBbTnJdIE5hbWUgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgICAgT2Zmc2V0XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgICAgICBTaXplICAgICAgICAgICAgICBFbnRTaXplICAgICAgICAgIEZsYWdzICBMaW5rICBJbmZvICBBbGlnblxuIikpOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0gICAgICAgaSArKywgc2VjdGlvbiArKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIgIFslMmRdICUtMTcuMTdzICUtMTUuMTVzICIsCi0JICAgICAgaSwKLQkgICAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLAotCSAgICAgIGdldF9zZWN0aW9uX3R5cGVfbmFtZSAoc2VjdGlvbi0+c2hfdHlwZSkpOwotCi0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXsKLQkgIHByaW50X3ZtYSAoc2VjdGlvbi0+c2hfYWRkciwgTE9OR19IRVgpOwotICAgICAgCi0JICBwcmludGYgKCAiICU2LjZseCAlNi42bHggJTIuMmx4IiwKLQkJICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX29mZnNldCwKLQkJICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX3NpemUsCi0JCSAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9lbnRzaXplKTsKLQotCSAgcHJpbnRmICgiICUzcyAiLCBnZXRfZWxmX3NlY3Rpb25fZmxhZ3MgKHNlY3Rpb24tPnNoX2ZsYWdzKSk7Ci0JCSAgCi0JICBwcmludGYgKCIgJTJsZCAlM2x4ICVsZFxuIiwKLQkJICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfbGluaywKLQkJICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfaW5mbywKLQkJICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfYWRkcmFsaWduKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHV0Y2hhciAoJyAnKTsKLQkgIHByaW50X3ZtYSAoc2VjdGlvbi0+c2hfYWRkciwgTE9OR19IRVgpOwotCSAgcHJpbnRmICgiICAlOC44bHgiLCBzZWN0aW9uLT5zaF9vZmZzZXQpOwotCSAgcHJpbnRmICgiXG4gICAgICAgIik7Ci0JICBwcmludF92bWEgKHNlY3Rpb24tPnNoX3NpemUsIExPTkdfSEVYKTsKLQkgIHByaW50ZiAoIiAgIik7Ci0JICBwcmludF92bWEgKHNlY3Rpb24tPnNoX2VudHNpemUsIExPTkdfSEVYKTsKLQkgIAotCSAgcHJpbnRmICgiICUzcyAiLCBnZXRfZWxmX3NlY3Rpb25fZmxhZ3MgKHNlY3Rpb24tPnNoX2ZsYWdzKSk7Ci0JCSAgCi0JICBwcmludGYgKCIgICAgICUybGQgICAlM2x4ICAgICAlbGRcbiIsCi0JCSAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2xpbmssCi0JCSAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2luZm8sCi0JCSAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2FkZHJhbGlnbik7Ci0JfQotICAgIH0KLQotICBwcmludGYgKF8oIktleSB0byBGbGFnczogVyAod3JpdGUpLCBBIChhbGxvYyksIFggKGV4ZWN1dGUpLCBNIChtZXJnZSksIFMgKHN0cmluZ3MpXG4iKSk7Ci0gIHByaW50ZiAoXygiICAgICAgICAgICAgICBJIChpbmZvKSwgTCAobGluayBvcmRlciksIE8gKGV4dHJhIE9TIHByb2Nlc3NpbmcgcmVxdWlyZWQpXG4iKSk7Ci0gIHByaW50ZiAoXygiICAgICAgICAgICAgICBvIChvcyBzcGVjaWZpYyksIHAgKHByb2Nlc3NvciBzcGVjaWZpYykgeCAodW5rbm93bilcbiIpKTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogUHJvY2VzcyB0aGUgcmVsb2Mgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3JlbG9jcyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICAgcmVsX3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcJICAgcmVsX29mZnNldDsKLQotCi0gIGlmICghZG9fcmVsb2MpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGRvX3VzaW5nX2R5bmFtaWMpCi0gICAgewotICAgICAgaW50IGlzX3JlbGEgPSBGQUxTRTsKLQotICAgICAgcmVsX3NpemUgICA9IDA7Ci0gICAgICByZWxfb2Zmc2V0ID0gMDsKLQotICAgICAgaWYgKGR5bmFtaWNfaW5mb1tEVF9SRUxdKQotCXsKLQkgIHJlbF9vZmZzZXQgPSBkeW5hbWljX2luZm9bRFRfUkVMXTsKLQkgIHJlbF9zaXplICAgPSBkeW5hbWljX2luZm9bRFRfUkVMU1pdOwotCSAgaXNfcmVsYSAgICA9IEZBTFNFOwotCX0KLSAgICAgIGVsc2UgaWYgKGR5bmFtaWNfaW5mbyBbRFRfUkVMQV0pCi0JewotCSAgcmVsX29mZnNldCA9IGR5bmFtaWNfaW5mb1tEVF9SRUxBXTsKLQkgIHJlbF9zaXplICAgPSBkeW5hbWljX2luZm9bRFRfUkVMQVNaXTsKLQkgIGlzX3JlbGEgICAgPSBUUlVFOwotCX0KLSAgICAgIGVsc2UgaWYgKGR5bmFtaWNfaW5mb1tEVF9KTVBSRUxdKQotCXsKLQkgIHJlbF9vZmZzZXQgPSBkeW5hbWljX2luZm9bRFRfSk1QUkVMXTsKLQkgIHJlbF9zaXplICAgPSBkeW5hbWljX2luZm9bRFRfUExUUkVMU1pdOwotCi0JICBzd2l0Y2ggKGR5bmFtaWNfaW5mb1tEVF9QTFRSRUxdKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUkVMOgotCSAgICAgIGlzX3JlbGEgPSBGQUxTRTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBOgotCSAgICAgIGlzX3JlbGEgPSBUUlVFOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGlzX3JlbGEgPSBVTktOT1dOOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocmVsX3NpemUpCi0JewotCSAgcHJpbnRmCi0JICAgIChfKCJcblJlbG9jYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWxkIGJ5dGVzOlxuIiksCi0JICAgICByZWxfb2Zmc2V0LCByZWxfc2l6ZSk7Ci0KLQkgIGR1bXBfcmVsb2NhdGlvbnMgKGZpbGUsIHJlbF9vZmZzZXQgLSBsb2FkYWRkciwgcmVsX3NpemUsCi0JCQkgICAgZHluYW1pY19zeW1ib2xzLCBudW1fZHluYW1pY19zeW1zLCBkeW5hbWljX3N0cmluZ3MsIGlzX3JlbGEpOwotCX0KLSAgICAgIGVsc2UKLQlwcmludGYgKF8oIlxuVGhlcmUgYXJlIG5vIGR5bmFtaWMgcmVsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLlxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICAgc2VjdGlvbjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgCQlpOwotICAgICAgaW50ICAgICAgICAgICAJCWZvdW5kID0gMDsKLQotICAgICAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLQkgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotCSAgIGkrKywgc2VjdGlvbiArKykKLQl7Ci0JICBpZiAoICAgc2VjdGlvbi0+c2hfdHlwZSAhPSBTSFRfUkVMQQotCSAgICAgICYmIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX1JFTCkKLQkgICAgY29udGludWU7Ci0KLQkgIHJlbF9vZmZzZXQgPSBzZWN0aW9uLT5zaF9vZmZzZXQ7Ci0JICByZWxfc2l6ZSAgID0gc2VjdGlvbi0+c2hfc2l6ZTsKLQotCSAgaWYgKHJlbF9zaXplKQotCSAgICB7Ci0JICAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHN0cnNlYzsKLQkgICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc3ltc2VjOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICBzeW10YWI7Ci0JICAgICAgY2hhciAqICAgICAgICAgICAgICAgIHN0cnRhYjsKLQkgICAgICBpbnQgICAgICAgICAgICAgICAgICAgaXNfcmVsYTsKLQkgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgbnN5bXM7Ci0KLQkgICAgICBwcmludGYgKF8oIlxuUmVsb2NhdGlvbiBzZWN0aW9uICIpKTsKLQotCSAgICAgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJcHJpbnRmICgiJWQiLCBzZWN0aW9uLT5zaF9uYW1lKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiclcyciLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotCSAgICAgIHByaW50ZiAoXygiIGF0IG9mZnNldCAweCVseCBjb250YWlucyAlbHUgZW50cmllczpcbiIpLAotCQkgcmVsX29mZnNldCwgKHVuc2lnbmVkIGxvbmcpIChyZWxfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemUpKTsKLQotCSAgICAgIHN5bXNlYyA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgICBuc3ltcyA9IHN5bXNlYy0+c2hfc2l6ZSAvIHN5bXNlYy0+c2hfZW50c2l6ZTsKLQkgICAgICBzeW10YWIgPSBHRVRfRUxGX1NZTUJPTFMgKGZpbGUsIHN5bXNlYy0+c2hfb2Zmc2V0LCBuc3ltcyk7Ci0KLQkgICAgICBpZiAoc3ltdGFiID09IE5VTEwpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgc3Ryc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgc3ltc2VjLT5zaF9saW5rOwotCi0JICAgICAgR0VUX0RBVEFfQUxMT0MgKHN0cnNlYy0+c2hfb2Zmc2V0LCBzdHJzZWMtPnNoX3NpemUsIHN0cnRhYiwKLQkJCSAgICAgIGNoYXIgKiwgInN0cmluZyB0YWJsZSIpOwotCi0JICAgICAgaXNfcmVsYSA9IHNlY3Rpb24tPnNoX3R5cGUgPT0gU0hUX1JFTEE7Ci0KLQkgICAgICBkdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0LCByZWxfc2l6ZSwgc3ltdGFiLCBuc3ltcywgc3RydGFiLCBpc19yZWxhKTsKLQotCSAgICAgIGZyZWUgKHN0cnRhYik7Ci0JICAgICAgZnJlZSAoc3ltdGFiKTsKLQotCSAgICAgIGZvdW5kID0gMTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgZm91bmQpCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyByZWxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB2b2lkCi1keW5hbWljX3NlZ21lbnRfbWlwc192YWwgKGVudHJ5KQotICAgICBFbGZfSW50ZXJuYWxfRHluICogZW50cnk7Ci17Ci0gIHN3aXRjaCAoZW50cnktPmRfdGFnKQotICAgIHsKLSAgICBjYXNlIERUX01JUFNfRkxBR1M6Ci0gICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQlwcmludGYgKCJOT05FXG4iKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdGF0aWMgY29uc3QgY2hhciAqIG9wdHNbXSA9Ci0JICB7Ci0JICAgICJRVUlDS1NUQVJUIiwgIk5PVFBPVCIsICJOT19MSUJSQVJZX1JFUExBQ0VNRU5UIiwKLQkgICAgIk5PX01PVkUiLCAiU0dJX09OTFkiLCAiR1VBUkFOVEVFX0lOSVQiLCAiREVMVEFfQ19QTFVTX1BMVVMiLAotCSAgICAiR1VBUkFOVEVFX1NUQVJUX0lOSVQiLCAiUElYSUUiLCAiREVGQVVMVF9ERUxBWV9MT0FEIiwKLQkgICAgIlJFUVVJQ0tTVEFSVCIsICJSRVFVSUNLU1RBUlRFRCIsICJDT1JEIiwgIk5PX1VOUkVTX1VOREVGIiwKLQkgICAgIlJMRF9PUkRFUl9TQUZFIgotCSAgfTsKLQkgIHVuc2lnbmVkIGludCBjbnQ7Ci0JICBpbnQgZmlyc3QgPSAxOwotCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fRUxFTSAob3B0cyk7ICsrIGNudCkKLQkgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsICYgKDEgPDwgY250KSkKLQkgICAgICB7Ci0JCXByaW50ZiAoIiVzJXMiLCBmaXJzdCA/ICIiIDogIiAiLCBvcHRzW2NudF0pOwotCQlmaXJzdCA9IDA7Ci0JICAgICAgfQotCSAgcHV0cyAoIiIpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEVF9NSVBTX0lWRVJTSU9OOgotICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotCXByaW50ZiAoIkludGVyZmFjZSBWZXJzaW9uOiAlc1xuIiwKLQkJZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWwpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEVF9NSVBTX1RJTUVfU1RBTVA6Ci0gICAgICB7Ci0JY2hhciB0aW1lYnVmWzIwXTsKLQl0aW1lX3QgdGltZSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCXN0cmZ0aW1lICh0aW1lYnVmLCAyMCwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgZ210aW1lICgmdGltZSkpOwotCXByaW50ZiAoIlRpbWUgU3RhbXA6ICVzXG4iLCB0aW1lYnVmKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEVF9NSVBTX1JMRF9WRVJTSU9OOgotICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzoKLSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKLSAgICBjYXNlIERUX01JUFNfTElCTElTVE5POgotICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzoKLSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzoKLSAgICBjYXNlIERUX01JUFNfSElQQUdFTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05POgotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0NfTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTV9OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk86Ci0gICAgY2FzZSBEVF9NSVBTX0NPTVBBQ1RfU0laRToKLSAgICAgIHByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3B0cik7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1keW5hbWljX3NlZ21lbnRfcGFyaXNjX3ZhbCAoZW50cnkpCi0gICAgIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLXsKLSAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0gICAgewotICAgIGNhc2UgRFRfSFBfRExEX0ZMQUdTOgotICAgICAgewotCXN0YXRpYyBzdHJ1Y3QKLQl7Ci0JICBsb25nIGludCBiaXQ7Ci0JICBjb25zdCBjaGFyICogc3RyOwotCX0KLQlmbGFnc1tdID0KLQl7Ci0JICB7IERUX0hQX0RFQlVHX1BSSVZBVEUsICJIUF9ERUJVR19QUklWQVRFIiB9LAotCSAgeyBEVF9IUF9ERUJVR19DQUxMQkFDSywgIkhQX0RFQlVHX0NBTExCQUNLIiB9LAotCSAgeyBEVF9IUF9ERUJVR19DQUxMQkFDS19CT1IsICJIUF9ERUJVR19DQUxMQkFDS19CT1IiIH0sCi0JICB7IERUX0hQX05PX0VOVlZBUiwgIkhQX05PX0VOVlZBUiIgfSwKLQkgIHsgRFRfSFBfQklORF9OT1csICJIUF9CSU5EX05PVyIgfSwKLQkgIHsgRFRfSFBfQklORF9OT05GQVRBTCwgIkhQX0JJTkRfTk9ORkFUQUwiIH0sCi0JICB7IERUX0hQX0JJTkRfVkVSQk9TRSwgIkhQX0JJTkRfVkVSQk9TRSIgfSwKLQkgIHsgRFRfSFBfQklORF9SRVNUUklDVEVELCAiSFBfQklORF9SRVNUUklDVEVEIiB9LAotCSAgeyBEVF9IUF9CSU5EX1NZTUJPTElDLCAiSFBfQklORF9TWU1CT0xJQyIgfSwKLQkgIHsgRFRfSFBfUlBBVEhfRklSU1QsICJIUF9SUEFUSF9GSVJTVCIgfSwKLQkgIHsgRFRfSFBfQklORF9ERVBUSF9GSVJTVCwgIkhQX0JJTkRfREVQVEhfRklSU1QiIH0KLQl9OwotCWludCBmaXJzdCA9IDE7Ci0Jc2l6ZV90IGNudDsKLQliZmRfdm1hIHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZsYWdzKSAvIHNpemVvZiAoZmxhZ3NbMF0pOyArK2NudCkKLQkgIGlmICh2YWwgJiBmbGFnc1tjbnRdLmJpdCkKLQkgICAgewotCSAgICAgIGlmICghIGZpcnN0KQotCQlwdXRjaGFyICgnICcpOwotCSAgICAgIGZwdXRzIChmbGFnc1tjbnRdLnN0ciwgc3Rkb3V0KTsKLQkgICAgICBmaXJzdCA9IDA7Ci0JICAgICAgdmFsIF49IGZsYWdzW2NudF0uYml0OwotCSAgICB9Ci0JCi0JaWYgKHZhbCAhPSAwIHx8IGZpcnN0KQotCSAgewotCSAgICBpZiAoISBmaXJzdCkKLQkgICAgICBwdXRjaGFyICgnICcpOwotCSAgICBwcmludF92bWEgKHZhbCwgSEVYKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50X3ZtYSAoZW50cnktPmRfdW4uZF9wdHIsIFBSRUZJWF9IRVgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZXRfMzJiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfRXh0ZXJuYWxfRHluICogZWR5bjsKLSAgRWxmX0ludGVybmFsX0R5biAqICAgZW50cnk7Ci0gIGJmZF9zaXplX3R5cGUgICAgICAgIGk7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKGR5bmFtaWNfYWRkciwgZHluYW1pY19zaXplLAotCQkgIGVkeW4sIEVsZjMyX0V4dGVybmFsX0R5biAqLCAiZHluYW1pYyBzZWdtZW50Iik7Ci0KLSAgLyogU0dJJ3MgRUxGIGhhcyBtb3JlIHRoYW4gb25lIHNlY3Rpb24gaW4gdGhlIERZTkFNSUMgc2VnbWVudC4gIERldGVybWluZQotICAgICBob3cgbGFyZ2UgdGhpcyAuZHluYW1pYyBpcyBub3cuICBXZSBjYW4gZG8gdGhpcyBldmVuIGJlZm9yZSB0aGUgYnl0ZQotICAgICBzd2FwcGluZyBzaW5jZSB0aGUgRFRfTlVMTCB0YWcgaXMgcmVjb2duaXphYmxlLiAgKi8KLSAgZHluYW1pY19zaXplID0gMDsKLSAgd2hpbGUgKCooRWxmMzJfV29yZCAqKSBlZHluIFtkeW5hbWljX3NpemUrK10uZF90YWcgIT0gRFRfTlVMTCkKLSAgICA7Ci0KLSAgZHluYW1pY19zZWdtZW50ID0gKEVsZl9JbnRlcm5hbF9EeW4gKikKLSAgICBtYWxsb2MgKGR5bmFtaWNfc2l6ZSAqIHNpemVvZiAoRWxmX0ludGVybmFsX0R5bikpOwotCi0gIGlmIChkeW5hbWljX3NlZ21lbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgZnJlZSAoZWR5bik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0gICAgICAgaSA8IGR5bmFtaWNfc2l6ZTsKLSAgICAgICBpICsrLCBlbnRyeSArKykKLSAgICB7Ci0gICAgICBlbnRyeS0+ZF90YWcgICAgICA9IEJZVEVfR0VUIChlZHluIFtpXS5kX3RhZyk7Ci0gICAgICBlbnRyeS0+ZF91bi5kX3ZhbCA9IEJZVEVfR0VUIChlZHluIFtpXS5kX3VuLmRfdmFsKTsKLSAgICB9Ci0KLSAgZnJlZSAoZWR5bik7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF82NGJpdF9keW5hbWljX3NlZ21lbnQgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGY2NF9FeHRlcm5hbF9EeW4gKiBlZHluOwotICBFbGZfSW50ZXJuYWxfRHluICogICBlbnRyeTsKLSAgYmZkX3NpemVfdHlwZSAgICAgICAgaTsKLQotICBHRVRfREFUQV9BTExPQyAoZHluYW1pY19hZGRyLCBkeW5hbWljX3NpemUsCi0JCSAgZWR5biwgRWxmNjRfRXh0ZXJuYWxfRHluICosICJkeW5hbWljIHNlZ21lbnQiKTsKLQotICAvKiBTR0kncyBFTEYgaGFzIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBpbiB0aGUgRFlOQU1JQyBzZWdtZW50LiAgRGV0ZXJtaW5lCi0gICAgIGhvdyBsYXJnZSB0aGlzIC5keW5hbWljIGlzIG5vdy4gIFdlIGNhbiBkbyB0aGlzIGV2ZW4gYmVmb3JlIHRoZSBieXRlCi0gICAgIHN3YXBwaW5nIHNpbmNlIHRoZSBEVF9OVUxMIHRhZyBpcyByZWNvZ25pemFibGUuICAqLwotICBkeW5hbWljX3NpemUgPSAwOwotICB3aGlsZSAoKihiZmRfdm1hICopIGVkeW4gW2R5bmFtaWNfc2l6ZSArK10uZF90YWcgIT0gRFRfTlVMTCkKLSAgICA7Ci0KLSAgZHluYW1pY19zZWdtZW50ID0gKEVsZl9JbnRlcm5hbF9EeW4gKikKLSAgICBtYWxsb2MgKGR5bmFtaWNfc2l6ZSAqIHNpemVvZiAoRWxmX0ludGVybmFsX0R5bikpOwotCi0gIGlmIChkeW5hbWljX3NlZ21lbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgZnJlZSAoZWR5bik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0gICAgICAgaSA8IGR5bmFtaWNfc2l6ZTsKLSAgICAgICBpICsrLCBlbnRyeSArKykKLSAgICB7Ci0gICAgICBlbnRyeS0+ZF90YWcgICAgICA9IEJZVEVfR0VUOCAoZWR5biBbaV0uZF90YWcpOwotICAgICAgZW50cnktPmRfdW4uZF92YWwgPSBCWVRFX0dFVDggKGVkeW4gW2ldLmRfdW4uZF92YWwpOwotICAgIH0KLQotICBmcmVlIChlZHluKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X2R5bmFtaWNfZmxhZ3MgKGZsYWdzKQotICAgICBiZmRfdm1hIGZsYWdzOwotewotICBzdGF0aWMgY2hhciBidWZmIFs2NF07Ci0gIHdoaWxlIChmbGFncykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGZsYWc7Ci0KLSAgICAgIGZsYWcgPSBmbGFncyAmIC0gZmxhZ3M7Ci0gICAgICBmbGFncyAmPSB+IGZsYWc7Ci0KLSAgICAgIHN3aXRjaCAoZmxhZykKLQl7Ci0JY2FzZSBERl9PUklHSU46ICAgc3RyY2F0IChidWZmLCAiT1JJR0lOICIpOyBicmVhazsKLQljYXNlIERGX1NZTUJPTElDOiBzdHJjYXQgKGJ1ZmYsICJTWU1CT0xJQyAiKTsgYnJlYWs7Ci0JY2FzZSBERl9URVhUUkVMOiAgc3RyY2F0IChidWZmLCAiVEVYVFJFTCAiKTsgYnJlYWs7Ci0JY2FzZSBERl9CSU5EX05PVzogc3RyY2F0IChidWZmLCAiQklORF9OT1cgIik7IGJyZWFrOwotCWRlZmF1bHQ6ICAgICAgICAgIHN0cmNhdCAoYnVmZiwgInVua25vd24gIik7IGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBidWZmOwotfQotCi0vKiBQYXJzZSBhbmQgZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIGR5bmFtaWMgc2VnbWVudC4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2R5bmFtaWNfc2VnbWVudCAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLSAgYmZkX3NpemVfdHlwZSAgICAgIGk7Ci0KLSAgaWYgKGR5bmFtaWNfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChkb19keW5hbWljKQotCXByaW50ZiAoXygiXG5UaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBpZiAoISBnZXRfMzJiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAoZmlsZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltYm9scyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotCSAgIGkgPCBkeW5hbWljX3NpemU7Ci0JICAgKytpLCArKyBlbnRyeSkKLQl7Ci0JICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7Ci0KLQkgIGlmIChlbnRyeS0+ZF90YWcgIT0gRFRfU1lNVEFCKQotCSAgICBjb250aW51ZTsKLQotCSAgZHluYW1pY19pbmZvW0RUX1NZTVRBQl0gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgLyogU2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGJpZyB0aGUgc3ltYm9sIHRhYmxlIGlzLAotCSAgICAgd2UgZGVmYXVsdCB0byByZWFkaW5nIGluIHRoZSBlbnRpcmUgZmlsZSAoISkgYW5kCi0JICAgICBwcm9jZXNzaW5nIHRoYXQuICBUaGlzIGlzIG92ZXJraWxsLCBJIGtub3csIGJ1dCBpdAotCSAgICAgc2hvdWxkIHdvcmsuICovCi0JICBvZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCi0JICBpZiAoZnNlZWsgKGZpbGUsIDAsIFNFRUtfRU5EKSkKLQkgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvIGVuZCBvZiBmaWxlISIpKTsKLQotCSAgaWYgKGlzXzMyYml0X2VsZikKLQkgICAgbnVtX2R5bmFtaWNfc3ltcyA9IChmdGVsbCAoZmlsZSkgLSBvZmZzZXQpIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotCSAgZWxzZQotCSAgICBudW1fZHluYW1pY19zeW1zID0gKGZ0ZWxsIChmaWxlKSAtIG9mZnNldCkgLyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSk7Ci0KLQkgIGlmIChudW1fZHluYW1pY19zeW1zIDwgMSkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBsb2FkXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgZHluYW1pY19zeW1ib2xzID0gR0VUX0VMRl9TWU1CT0xTIChmaWxlLCBvZmZzZXQsIG51bV9keW5hbWljX3N5bXMpOwotCX0KLSAgICB9Ci0KLSAgLyogU2ltaWxhcmx5IGZpbmQgYSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCSAgbG9uZyAgICAgICAgICBzdHJfdGFiX2xlbjsKLQotCSAgaWYgKGVudHJ5LT5kX3RhZyAhPSBEVF9TVFJUQUIpCi0JICAgIGNvbnRpbnVlOwotCi0JICBkeW5hbWljX2luZm9bRFRfU1RSVEFCXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICAvKiBTaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnIHRoZSBzdHJpbmcgdGFibGUgaXMsCi0JICAgICB3ZSBkZWZhdWx0IHRvIHJlYWRpbmcgaW4gdGhlIGVudGlyZSBmaWxlICghKSBhbmQKLQkgICAgIHByb2Nlc3NpbmcgdGhhdC4gIFRoaXMgaXMgb3ZlcmtpbGwsIEkga25vdywgYnV0IGl0Ci0JICAgICBzaG91bGQgd29yay4gKi8KLQotCSAgb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQkgIGlmIChmc2VlayAoZmlsZSwgMCwgU0VFS19FTkQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIpKTsKLQkgIHN0cl90YWJfbGVuID0gZnRlbGwgKGZpbGUpIC0gb2Zmc2V0OwotCi0JICBpZiAoc3RyX3RhYl9sZW4gPCAxKQotCSAgICB7Ci0JICAgICAgZXJyb3IKLQkJKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBzdHJfdGFiX2xlbiwgZHluYW1pY19zdHJpbmdzLCBjaGFyICosCi0JCQkgICJkeW5hbWljIHN0cmluZyB0YWJsZSIpOwotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFuZCBmaW5kIHRoZSBzeW1pbmZvIHNlY3Rpb24gaWYgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzeW1pbnN6ID0gMDsKLQotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5FTlQpCi0JICAgIHsKLQkgICAgICAvKiBOb3RlOiB0aGVzZSBicmFjZXMgYXJlIG5lY2Vzc2FyeSB0byBhdm9pZCBhIHN5bnRheAotCQkgZXJyb3IgZnJvbSB0aGUgU3VuT1M0IEMgY29tcGlsZXIuICAqLwotCSAgICAgIGFzc2VydCAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltaW5mbykgPT0gZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBlbHNlIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5TWikKLQkgICAgc3ltaW5zeiA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCSAgZWxzZSBpZiAoZW50cnktPmRfdGFnID09IERUX1NZTUlORk8pCi0JICAgIGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCX0KLQotICAgICAgaWYgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgIT0gMCAmJiBzeW1pbnN6ICE9IDApCi0JewotCSAgRWxmX0V4dGVybmFsX1N5bWluZm8gKiBleHRzeW1pbmZvOwotCSAgRWxmX0ludGVybmFsX1N5bWluZm8gKiBzeW1pbmZvOwotCi0JICAvKiBUaGVyZSBpcyBhIHN5bWluZm8gc2VjdGlvbi4gIFJlYWQgdGhlIGRhdGEuICAqLwotCSAgR0VUX0RBVEFfQUxMT0MgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQsIHN5bWluc3osIGV4dHN5bWluZm8sCi0JCQkgIEVsZl9FeHRlcm5hbF9TeW1pbmZvICosICJzeW1ib2wgaW5mb3JtYXRpb24iKTsKLQotCSAgZHluYW1pY19zeW1pbmZvID0gKEVsZl9JbnRlcm5hbF9TeW1pbmZvICopIG1hbGxvYyAoc3ltaW5zeik7Ci0JICBpZiAoZHluYW1pY19zeW1pbmZvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIGR5bmFtaWNfc3ltaW5mb19uZW50ID0gc3ltaW5zeiAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bWluZm8pOwotCSAgZm9yIChpID0gMCwgc3ltaW5mbyA9IGR5bmFtaWNfc3ltaW5mbzsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OwotCSAgICAgICArK2ksICsrc3ltaW5mbykKLQkgICAgewotCSAgICAgIHN5bWluZm8tPnNpX2JvdW5kdG8gPSBCWVRFX0dFVCAoZXh0c3ltaW5mb1tpXS5zaV9ib3VuZHRvKTsKLQkgICAgICBzeW1pbmZvLT5zaV9mbGFncyA9IEJZVEVfR0VUIChleHRzeW1pbmZvW2ldLnNpX2ZsYWdzKTsKLQkgICAgfQotCi0JICBmcmVlIChleHRzeW1pbmZvKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkb19keW5hbWljICYmIGR5bmFtaWNfYWRkcikKLSAgICBwcmludGYgKF8oIlxuRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIiksCi0JICAgIGR5bmFtaWNfYWRkciwgKGxvbmcpIGR5bmFtaWNfc2l6ZSk7Ci0gIGlmIChkb19keW5hbWljKQotICAgIHByaW50ZiAoXygiICBUYWcgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS9WYWx1ZVxuIikpOwotCi0gIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotICAgICAgIGkgPCBkeW5hbWljX3NpemU7Ci0gICAgICAgaSsrLCBlbnRyeSArKykKLSAgICB7Ci0gICAgICBpZiAoZG9fZHluYW1pYykKLQl7Ci0JICBjb25zdCBjaGFyICpkdHlwZTsKLQotCSAgcHV0Y2hhciAoJyAnKTsKLQkgIHByaW50X3ZtYSAoZW50cnktPmRfdGFnLCBGVUxMX0hFWCk7Ci0JICBkdHlwZSA9IGdldF9keW5hbWljX3R5cGUgKGVudHJ5LT5kX3RhZyk7Ci0JICBwcmludGYgKCIgKCVzKSUqcyIsIGR0eXBlLAotCQkgICgoaXNfMzJiaXRfZWxmID8gMjcgOiAxOSkKLQkJICAgLSAoaW50KSBzdHJsZW4gKGR0eXBlKSksCi0JCSAgIiAiKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoZW50cnktPmRfdGFnKQotCXsKLQljYXNlIERUX0ZMQUdTOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHByaW50ZiAoIiVzIiwgZ2V0X2R5bmFtaWNfZmxhZ3MgKGVudHJ5LT5kX3VuLmRfdmFsKSk7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgRFRfQVVYSUxJQVJZOgotCWNhc2UgRFRfRklMVEVSOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBpZiAoZW50cnktPmRfdGFnID09IERUX0FVWElMSUFSWSkKLQkJcHJpbnRmIChfKCJBdXhpbGlhcnkgbGlicmFyeSIpKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoXygiRmlsdGVyIGxpYnJhcnkiKSk7Ci0KLQkgICAgICBpZiAoZHluYW1pY19zdHJpbmdzKQotCQlwcmludGYgKCI6IFslc11cbiIsIGR5bmFtaWNfc3RyaW5ncyArIGVudHJ5LT5kX3VuLmRfdmFsKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBwcmludGYgKCI6ICIpOwotCQkgIHByaW50X3ZtYSAoZW50cnktPmRfdW4uZF92YWwsIFBSRUZJWF9IRVgpOwotCQkgIHB1dGNoYXIgKCdcbicpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9GRUFUVVJFXzE6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIHByaW50ZiAoXygiRmxhZ3M6IikpOwotCSAgICAgIGlmIChlbnRyeS0+ZF91bi5kX3ZhbCA9PSAwKQotCQlwcmludGYgKF8oIiBOb25lXG4iKSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBpbnQgdmFsID0gZW50cnktPmRfdW4uZF92YWw7Ci0JCSAgaWYgKHZhbCAmIERURl8xX1BBUklOSVQpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBQQVJJTklUIik7Ci0JCSAgICAgIHZhbCBePSBEVEZfMV9QQVJJTklUOwotCQkgICAgfQotCQkgIGlmICh2YWwgIT0gMCkKLQkJICAgIHByaW50ZiAoIiAlbHgiLCB2YWwpOwotCQkgIHB1dHMgKCIiKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfUE9TRkxBR18xOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkZsYWdzOiIpKTsKLQkgICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQkJcHJpbnRmIChfKCIgTm9uZVxuIikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW50IHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCQkgIGlmICh2YWwgJiBERl9QMV9MQVpZTE9BRCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIExBWllMT0FEIik7Ci0JCSAgICAgIHZhbCBePSBERl9QMV9MQVpZTE9BRDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfUDFfR1JPVVBQRVJNKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgR1JPVVBQRVJNIik7Ci0JCSAgICAgIHZhbCBePSBERl9QMV9HUk9VUFBFUk07Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAhPSAwKQotCQkgICAgcHJpbnRmICgiICVseCIsIHZhbCk7Ci0JCSAgcHV0cyAoIiIpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9GTEFHU18xOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkZsYWdzOiIpKTsKLQkgICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQkJcHJpbnRmIChfKCIgTm9uZVxuIikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW50IHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCQkgIGlmICh2YWwgJiBERl8xX05PVykKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE5PVyIpOwotCQkgICAgICB2YWwgXj0gREZfMV9OT1c7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfR0xPQkFMKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgR0xPQkFMIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0dMT0JBTDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9HUk9VUCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdST1VQIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0dST1VQOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX05PREVMRVRFKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgTk9ERUxFVEUiKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9ERUxFVEU7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfTE9BREZMVFIpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBMT0FERkxUUiIpOwotCQkgICAgICB2YWwgXj0gREZfMV9MT0FERkxUUjsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9JTklURklSU1QpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBJTklURklSU1QiKTsKLQkJICAgICAgdmFsIF49IERGXzFfSU5JVEZJUlNUOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX05PT1BFTikKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE5PT1BFTiIpOwotCQkgICAgICB2YWwgXj0gREZfMV9OT09QRU47Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfT1JJR0lOKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgT1JJR0lOIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX09SSUdJTjsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9ESVJFQ1QpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBESVJFQ1QiKTsKLQkJICAgICAgdmFsIF49IERGXzFfRElSRUNUOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX1RSQU5TKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgVFJBTlMiKTsKLQkJICAgICAgdmFsIF49IERGXzFfVFJBTlM7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfSU5URVJQT1NFKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgSU5URVJQT1NFIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0lOVEVSUE9TRTsKLQkJICAgIH0KLQkJICBpZiAodmFsICE9IDApCi0JCSAgICBwcmludGYgKCIgJWx4IiwgdmFsKTsKLQkJICBwdXRzICgiIik7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1BMVFJFTDoKLQkgIGlmIChkb19keW5hbWljKQotCSAgICBwdXRzIChnZXRfZHluYW1pY190eXBlIChlbnRyeS0+ZF91bi5kX3ZhbCkpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERUX05VTEwJOgotCWNhc2UgRFRfTkVFREVECToKLQljYXNlIERUX1BMVEdPVAk6Ci0JY2FzZSBEVF9IQVNICToKLQljYXNlIERUX1NUUlRBQgk6Ci0JY2FzZSBEVF9TWU1UQUIJOgotCWNhc2UgRFRfUkVMQQk6Ci0JY2FzZSBEVF9JTklUCToKLQljYXNlIERUX0ZJTkkJOgotCWNhc2UgRFRfU09OQU1FCToKLQljYXNlIERUX1JQQVRICToKLQljYXNlIERUX1NZTUJPTElDOgotCWNhc2UgRFRfUkVMCToKLQljYXNlIERUX0RFQlVHCToKLQljYXNlIERUX1RFWFRSRUwJOgotCWNhc2UgRFRfSk1QUkVMCToKLQkgIGR5bmFtaWNfaW5mb1tlbnRyeS0+ZF90YWddID0gZW50cnktPmRfdW4uZF92YWw7Ci0KLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgY2hhciAqIG5hbWU7Ci0KLQkgICAgICBpZiAoZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0JCW5hbWUgPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJbmFtZSA9IGR5bmFtaWNfc3RyaW5ncyArIGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICAgICAgaWYgKG5hbWUpCi0JCXsKLQkJICBzd2l0Y2ggKGVudHJ5LT5kX3RhZykKLQkJICAgIHsKLQkJICAgIGNhc2UgRFRfTkVFREVEOgotCQkgICAgICBwcmludGYgKF8oIlNoYXJlZCBsaWJyYXJ5OiBbJXNdIiksIG5hbWUpOwotCi0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHByb2dyYW1faW50ZXJwcmV0ZXIpID09IDApCi0JCQlwcmludGYgKF8oIiBwcm9ncmFtIGludGVycHJldGVyIikpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBEVF9TT05BTUU6Ci0JCSAgICAgIHByaW50ZiAoXygiTGlicmFyeSBzb25hbWU6IFslc10iKSwgbmFtZSk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIERUX1JQQVRIOgotCQkgICAgICBwcmludGYgKF8oIkxpYnJhcnkgcnBhdGg6IFslc10iKSwgbmFtZSk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBwcmludF92bWEgKGVudHJ5LT5kX3VuLmRfdmFsLCBQUkVGSVhfSEVYKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXByaW50X3ZtYSAoZW50cnktPmRfdW4uZF92YWwsIFBSRUZJWF9IRVgpOwotCi0JICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9QTFRSRUxTWjoKLQljYXNlIERUX1JFTEFTWgk6Ci0JY2FzZSBEVF9TVFJTWgk6Ci0JY2FzZSBEVF9SRUxTWgk6Ci0JY2FzZSBEVF9SRUxBRU5UCToKLQljYXNlIERUX1NZTUVOVAk6Ci0JY2FzZSBEVF9SRUxFTlQJOgotCWNhc2UgRFRfUExUUEFEU1o6Ci0JY2FzZSBEVF9NT1ZFRU5UCToKLQljYXNlIERUX01PVkVTWgk6Ci0JY2FzZSBEVF9JTklUX0FSUkFZU1o6Ci0JY2FzZSBEVF9GSU5JX0FSUkFZU1o6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIHByaW50X3ZtYSAoZW50cnktPmRfdW4uZF92YWwsIFVOU0lHTkVEKTsKLQkgICAgICBwcmludGYgKCIgKGJ5dGVzKVxuIik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9WRVJERUZOVU06Ci0JY2FzZSBEVF9WRVJORUVETlVNOgotCWNhc2UgRFRfUkVMQUNPVU5UOgotCWNhc2UgRFRfUkVMQ09VTlQ6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIHByaW50X3ZtYSAoZW50cnktPmRfdW4uZF92YWwsIFVOU0lHTkVEKTsKLQkgICAgICBwdXRjaGFyICgnXG4nKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1NZTUlOU1o6Ci0JY2FzZSBEVF9TWU1JTkVOVDoKLQljYXNlIERUX1NZTUlORk86Ci0JY2FzZSBEVF9VU0VEOgotCWNhc2UgRFRfSU5JVF9BUlJBWToKLQljYXNlIERUX0ZJTklfQVJSQVk6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIGlmIChkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCAmJiBlbnRyeS0+ZF90YWcgPT0gRFRfVVNFRCkKLQkJewotCQkgIGNoYXIgKiBuYW1lOwotCi0JCSAgbmFtZSA9IGR5bmFtaWNfc3RyaW5ncyArIGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JCSAgaWYgKCogbmFtZSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmIChfKCJOb3QgbmVlZGVkIG9iamVjdDogWyVzXVxuIiksIG5hbWUpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgcHJpbnRfdm1hIChlbnRyeS0+ZF91bi5kX3ZhbCwgUFJFRklYX0hFWCk7Ci0JICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9CSU5EX05PVzoKLQkgIC8qIFRoZSB2YWx1ZSBvZiB0aGlzIGVudHJ5IGlzIGlnbm9yZWQuICAqLwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKChlbnRyeS0+ZF90YWcgPj0gRFRfVkVSU1lNKSAmJiAoZW50cnktPmRfdGFnIDw9IERUX1ZFUk5FRUROVU0pKQotCSAgICB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKGVudHJ5LT5kX3RhZyldID0KLQkgICAgICBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCQl7Ci0JCWNhc2UgRU1fTUlQUzoKLQkJY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkJICBkeW5hbWljX3NlZ21lbnRfbWlwc192YWwgKGVudHJ5KTsKLQkJICBicmVhazsKLQkJY2FzZSBFTV9QQVJJU0M6Ci0JCSAgZHluYW1pY19zZWdtZW50X3BhcmlzY192YWwgKGVudHJ5KTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBwcmludF92bWEgKGVudHJ5LT5kX3VuLmRfdmFsLCBQUkVGSVhfSEVYKTsKLQkJICBwdXRjaGFyICgnXG4nKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfdmVyX2ZsYWdzIChmbGFncykKLSAgICAgdW5zaWduZWQgaW50IGZsYWdzOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgYnVmZlswXSA9IDA7Ci0KLSAgaWYgKGZsYWdzID09IDApCi0gICAgcmV0dXJuIF8oIm5vbmUiKTsKLQotICBpZiAoZmxhZ3MgJiBWRVJfRkxHX0JBU0UpCi0gICAgc3RyY2F0IChidWZmLCAiQkFTRSAiKTsKLQotICBpZiAoZmxhZ3MgJiBWRVJfRkxHX1dFQUspCi0gICAgewotICAgICAgaWYgKGZsYWdzICYgVkVSX0ZMR19CQVNFKQotCXN0cmNhdCAoYnVmZiwgInwgIik7Ci0KLSAgICAgIHN0cmNhdCAoYnVmZiwgIldFQUsgIik7Ci0gICAgfQotCi0gIGlmIChmbGFncyAmIH4oVkVSX0ZMR19CQVNFIHwgVkVSX0ZMR19XRUFLKSkKLSAgICBzdHJjYXQgKGJ1ZmYsICJ8IDx1bmtub3duPiIpOwotCi0gIHJldHVybiBidWZmOwotfQotCi0vKiBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgdmVyc2lvbiBzZWN0aW9ucy4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgdW5zaWduZWQgICBpOwotICBpbnQgICAgICAgIGZvdW5kID0gMDsKLQotICBpZiAoISBkb192ZXJzaW9uKQotICAgIHJldHVybiAxOwotCi0gIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLSAgICAgICBpKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgc3dpdGNoIChzZWN0aW9uLT5zaF90eXBlKQotCXsKLQljYXNlIFNIVF9HTlVfdmVyZGVmOgotCSAgewotCSAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICogZWRlZnM7Ci0JICAgIHVuc2lnbmVkIGludCAgICAgICAgICBpZHg7Ci0JICAgIHVuc2lnbmVkIGludCAgICAgICAgICBjbnQ7Ci0KLQkgICAgZm91bmQgPSAxOwotCi0JICAgIHByaW50ZgotCSAgICAgIChfKCJcblZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uICclcycgY29udGFpbnMgJWxkIGVudHJpZXM6XG4iKSwKLQkgICAgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwgc2VjdGlvbi0+c2hfaW5mbyk7Ci0KLQkgICAgcHJpbnRmIChfKCIgIEFkZHI6IDB4IikpOwotCSAgICBwcmludGZfdm1hIChzZWN0aW9uLT5zaF9hZGRyKTsKLQkgICAgcHJpbnRmIChfKCIgIE9mZnNldDogJSMwOGx4ICBMaW5rOiAlbHggKCVzKVxuIiksCi0JCSAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9saW5rLAotCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rKSk7Ci0KLQkgICAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJCSAgICBlZGVmcywgRWxmX0V4dGVybmFsX1ZlcmRlZiAqLAotCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiIpOwotCi0JICAgIGZvciAoaWR4ID0gY250ID0gMDsgY250IDwgc2VjdGlvbi0+c2hfaW5mbzsgKysgY250KQotCSAgICAgIHsKLQkJY2hhciAqICAgICAgICAgICAgICAgICB2c3RhcnQ7Ci0JCUVsZl9FeHRlcm5hbF9WZXJkZWYgKiAgZWRlZjsKLQkJRWxmX0ludGVybmFsX1ZlcmRlZiAgICBlbnQ7Ci0JCUVsZl9FeHRlcm5hbF9WZXJkYXV4ICogZWF1eDsKLQkJRWxmX0ludGVybmFsX1ZlcmRhdXggICBhdXg7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgajsKLQkJaW50ICAgICAgICAgICAgICAgICAgICBpc3VtOwotCi0JCXZzdGFydCA9ICgoY2hhciAqKSBlZGVmcykgKyBpZHg7Ci0KLQkJZWRlZiA9IChFbGZfRXh0ZXJuYWxfVmVyZGVmICopIHZzdGFydDsKLQotCQllbnQudmRfdmVyc2lvbiA9IEJZVEVfR0VUIChlZGVmLT52ZF92ZXJzaW9uKTsKLQkJZW50LnZkX2ZsYWdzICAgPSBCWVRFX0dFVCAoZWRlZi0+dmRfZmxhZ3MpOwotCQllbnQudmRfbmR4ICAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9uZHgpOwotCQllbnQudmRfY250ICAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9jbnQpOwotCQllbnQudmRfaGFzaCAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9oYXNoKTsKLQkJZW50LnZkX2F1eCAgICAgPSBCWVRFX0dFVCAoZWRlZi0+dmRfYXV4KTsKLQkJZW50LnZkX25leHQgICAgPSBCWVRFX0dFVCAoZWRlZi0+dmRfbmV4dCk7Ci0KLQkJcHJpbnRmIChfKCIgICUjMDZ4OiBSZXY6ICVkICBGbGFnczogJXMiKSwKLQkJCWlkeCwgZW50LnZkX3ZlcnNpb24sIGdldF92ZXJfZmxhZ3MgKGVudC52ZF9mbGFncykpOwotCi0JCXByaW50ZiAoXygiICBJbmRleDogJWQgIENudDogJWQgICIpLAotCQkJZW50LnZkX25keCwgZW50LnZkX2NudCk7Ci0KLQkJdnN0YXJ0ICs9IGVudC52ZF9hdXg7Ci0KLQkJZWF1eCA9IChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKSB2c3RhcnQ7Ci0KLQkJYXV4LnZkYV9uYW1lID0gQllURV9HRVQgKGVhdXgtPnZkYV9uYW1lKTsKLQkJYXV4LnZkYV9uZXh0ID0gQllURV9HRVQgKGVhdXgtPnZkYV9uZXh0KTsKLQotCQlpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgIHByaW50ZiAoXygiTmFtZTogJXNcbiIpLCBkeW5hbWljX3N0cmluZ3MgKyBhdXgudmRhX25hbWUpOwotCQllbHNlCi0JCSAgcHJpbnRmIChfKCJOYW1lIGluZGV4OiAlbGRcbiIpLCBhdXgudmRhX25hbWUpOwotCi0JCWlzdW0gPSBpZHggKyBlbnQudmRfYXV4OwotCi0JCWZvciAoaiA9IDE7IGogPCBlbnQudmRfY250OyBqICsrKQotCQkgIHsKLQkJICAgIGlzdW0gICArPSBhdXgudmRhX25leHQ7Ci0JCSAgICB2c3RhcnQgKz0gYXV4LnZkYV9uZXh0OwotCi0JCSAgICBlYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHZzdGFydDsKLQotCQkgICAgYXV4LnZkYV9uYW1lID0gQllURV9HRVQgKGVhdXgtPnZkYV9uYW1lKTsKLQkJICAgIGF1eC52ZGFfbmV4dCA9IEJZVEVfR0VUIChlYXV4LT52ZGFfbmV4dCk7Ci0KLQkJICAgIGlmIChkeW5hbWljX3N0cmluZ3MpCi0JCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogUGFyZW50ICVkOiAlc1xuIiksCi0JCQkgICAgICBpc3VtLCBqLCBkeW5hbWljX3N0cmluZ3MgKyBhdXgudmRhX25hbWUpOwotCQkgICAgZWxzZQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IFBhcmVudCAlZCwgbmFtZSBpbmRleDogJWxkXG4iKSwKLQkJCSAgICAgIGlzdW0sIGosIGF1eC52ZGFfbmFtZSk7Ci0JCSAgfQotCi0JCWlkeCArPSBlbnQudmRfbmV4dDsKLQkgICAgICB9Ci0KLQkgICAgZnJlZSAoZWRlZnMpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9HTlVfdmVybmVlZDoKLQkgIHsKLQkgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiAgZW5lZWQ7Ci0JICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGlkeDsKLQkgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgY250OwotCi0JICAgIGZvdW5kID0gMTsKLQotCSAgICBwcmludGYgKF8oIlxuVmVyc2lvbiBuZWVkcyBzZWN0aW9uICclcycgY29udGFpbnMgJWxkIGVudHJpZXM6XG4iKSwKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksIHNlY3Rpb24tPnNoX2luZm8pOwotCi0JICAgIHByaW50ZiAoXygiIEFkZHI6IDB4IikpOwotCSAgICBwcmludGZfdm1hIChzZWN0aW9uLT5zaF9hZGRyKTsKLQkgICAgcHJpbnRmIChfKCIgIE9mZnNldDogJSMwOGx4ICBMaW5rIHRvIHNlY3Rpb246ICVsZCAoJXMpXG4iKSwKLQkJICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX2xpbmssCi0JCSAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbmspKTsKLQotCSAgICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9zaXplLAotCQkJICAgIGVuZWVkLCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqLAotCQkJICAgICJ2ZXJzaW9uIG5lZWQgc2VjdGlvbiIpOwotCi0JICAgIGZvciAoaWR4ID0gY250ID0gMDsgY250IDwgc2VjdGlvbi0+c2hfaW5mbzsgKytjbnQpCi0JICAgICAgewotCQlFbGZfRXh0ZXJuYWxfVmVybmVlZCAqIGVudHJ5OwotCQlFbGZfSW50ZXJuYWxfVmVybmVlZCAgICAgZW50OwotCQlpbnQgICAgICAgICAgICAgICAgICAgICAgajsKLQkJaW50ICAgICAgICAgICAgICAgICAgICAgIGlzdW07Ci0JCWNoYXIgKiAgICAgICAgICAgICAgICAgICB2c3RhcnQ7Ci0KLQkJdnN0YXJ0ID0gKChjaGFyICopIGVuZWVkKSArIGlkeDsKLQotCQllbnRyeSA9IChFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKSB2c3RhcnQ7Ci0KLQkJZW50LnZuX3ZlcnNpb24gPSBCWVRFX0dFVCAoZW50cnktPnZuX3ZlcnNpb24pOwotCQllbnQudm5fY250ICAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fY250KTsKLQkJZW50LnZuX2ZpbGUgICAgPSBCWVRFX0dFVCAoZW50cnktPnZuX2ZpbGUpOwotCQllbnQudm5fYXV4ICAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fYXV4KTsKLQkJZW50LnZuX25leHQgICAgPSBCWVRFX0dFVCAoZW50cnktPnZuX25leHQpOwotCi0JCXByaW50ZiAoXygiICAlIzA2eDogVmVyc2lvbjogJWQiKSwgaWR4LCBlbnQudm5fdmVyc2lvbik7Ci0KLQkJaWYgKGR5bmFtaWNfc3RyaW5ncykKLQkJICBwcmludGYgKF8oIiAgRmlsZTogJXMiKSwgZHluYW1pY19zdHJpbmdzICsgZW50LnZuX2ZpbGUpOwotCQllbHNlCi0JCSAgcHJpbnRmIChfKCIgIEZpbGU6ICVseCIpLCBlbnQudm5fZmlsZSk7Ci0KLQkJcHJpbnRmIChfKCIgIENudDogJWRcbiIpLCBlbnQudm5fY250KTsKLQotCQl2c3RhcnQgKz0gZW50LnZuX2F1eDsKLQotCQlmb3IgKGogPSAwLCBpc3VtID0gaWR4ICsgZW50LnZuX2F1eDsgaiA8IGVudC52bl9jbnQ7ICsraikKLQkJICB7Ci0JCSAgICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqIGVhdXg7Ci0JCSAgICBFbGZfSW50ZXJuYWxfVmVybmF1eCAgIGF1eDsKLQotCQkgICAgZWF1eCA9IChFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKSB2c3RhcnQ7Ci0KLQkJICAgIGF1eC52bmFfaGFzaCAgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX2hhc2gpOwotCQkgICAgYXV4LnZuYV9mbGFncyA9IEJZVEVfR0VUIChlYXV4LT52bmFfZmxhZ3MpOwotCQkgICAgYXV4LnZuYV9vdGhlciA9IEJZVEVfR0VUIChlYXV4LT52bmFfb3RoZXIpOwotCQkgICAgYXV4LnZuYV9uYW1lICA9IEJZVEVfR0VUIChlYXV4LT52bmFfbmFtZSk7Ci0JCSAgICBhdXgudm5hX25leHQgID0gQllURV9HRVQgKGVhdXgtPnZuYV9uZXh0KTsKLQotCQkgICAgaWYgKGR5bmFtaWNfc3RyaW5ncykKLQkJICAgICAgcHJpbnRmIChfKCIgICUjMDZ4OiBOYW1lOiAlcyIpLAotCQkJICAgICAgaXN1bSwgZHluYW1pY19zdHJpbmdzICsgYXV4LnZuYV9uYW1lKTsKLQkJICAgIGVsc2UKLQkJICAgICAgcHJpbnRmIChfKCIgICUjMDZ4OiBOYW1lIGluZGV4OiAlbHgiKSwKLQkJCSAgICAgIGlzdW0sIGF1eC52bmFfbmFtZSk7Ci0KLQkJICAgIHByaW50ZiAoXygiICBGbGFnczogJXMgIFZlcnNpb246ICVkXG4iKSwKLQkJCSAgICBnZXRfdmVyX2ZsYWdzIChhdXgudm5hX2ZsYWdzKSwgYXV4LnZuYV9vdGhlcik7Ci0KLQkJICAgIGlzdW0gICArPSBhdXgudm5hX25leHQ7Ci0JCSAgICB2c3RhcnQgKz0gYXV4LnZuYV9uZXh0OwotCQkgIH0KLQotCQlpZHggKz0gZW50LnZuX25leHQ7Ci0JICAgICAgfQotCi0JICAgIGZyZWUgKGVuZWVkKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfR05VX3ZlcnN5bToKLQkgIHsKLQkgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgICAgIGxpbmtfc2VjdGlvbjsKLQkgICAgaW50ICAgICAgICAgICAgICAJCXRvdGFsOwotCSAgICBpbnQgICAgICAgICAgICAgIAkJY250OwotCSAgICB1bnNpZ25lZCBjaGFyICogCQllZGF0YTsKLQkgICAgdW5zaWduZWQgc2hvcnQgKiAJCWRhdGE7Ci0JICAgIGNoYXIgKiAgICAgICAgICAgCQlzdHJ0YWI7Ci0JICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAJCXN5bWJvbHM7Ci0JICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICAgICBzdHJpbmdfc2VjOwotCi0JICAgIGxpbmtfc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7Ci0JICAgIHRvdGFsID0gc2VjdGlvbi0+c2hfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemU7Ci0KLQkgICAgZm91bmQgPSAxOwotCi0JICAgIHN5bWJvbHMgPSBHRVRfRUxGX1NZTUJPTFMgKGZpbGUsIGxpbmtfc2VjdGlvbi0+c2hfb2Zmc2V0LAotCQkJCSAgICAgICBsaW5rX3NlY3Rpb24tPnNoX3NpemUgLyBsaW5rX3NlY3Rpb24tPnNoX2VudHNpemUpOwotCi0JICAgIHN0cmluZ19zZWMgPSBzZWN0aW9uX2hlYWRlcnMgKyBsaW5rX3NlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgR0VUX0RBVEFfQUxMT0MgKHN0cmluZ19zZWMtPnNoX29mZnNldCwgc3RyaW5nX3NlYy0+c2hfc2l6ZSwKLQkJCSAgICBzdHJ0YWIsIGNoYXIgKiwgInZlcnNpb24gc3RyaW5nIHRhYmxlIik7Ci0KLQkgICAgcHJpbnRmIChfKCJcblZlcnNpb24gc3ltYm9scyBzZWN0aW9uICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIpLAotCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwgdG90YWwpOwotCi0JICAgIHByaW50ZiAoXygiIEFkZHI6ICIpKTsKLQkgICAgcHJpbnRmX3ZtYSAoc2VjdGlvbi0+c2hfYWRkcik7Ci0JICAgIHByaW50ZiAoXygiICBPZmZzZXQ6ICUjMDhseCAgTGluazogJWx4ICglcylcbiIpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfbGluaywKLQkJICAgIFNFQ1RJT05fTkFNRSAobGlua19zZWN0aW9uKSk7Ci0KLQkgICAgR0VUX0RBVEFfQUxMT0MgKHZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSU1lNKV0KLQkJCSAgICAtIGxvYWRhZGRyLAotCQkJICAgIHRvdGFsICogc2l6ZW9mIChzaG9ydCksIGVkYXRhLAotCQkJICAgIHVuc2lnbmVkIGNoYXIgKiwgInZlcnNpb24gc3ltYm9sIGRhdGEiKTsKLQotCSAgICBkYXRhID0gKHVuc2lnbmVkIHNob3J0ICopIG1hbGxvYyAodG90YWwgKiBzaXplb2YgKHNob3J0KSk7Ci0KLQkgICAgZm9yIChjbnQgPSB0b3RhbDsgY250IC0tOykKLQkgICAgICBkYXRhIFtjbnRdID0gYnl0ZV9nZXQgKGVkYXRhICsgY250ICogc2l6ZW9mIChzaG9ydCksCi0JCQkJICAgICBzaXplb2YgKHNob3J0KSk7Ci0KLQkgICAgZnJlZSAoZWRhdGEpOwotCi0JICAgIGZvciAoY250ID0gMDsgY250IDwgdG90YWw7IGNudCArPSA0KQotCSAgICAgIHsKLQkJaW50IGosIG5uOwotCQljaGFyICpuYW1lOwotCi0JCXByaW50ZiAoIiAgJTAzeDoiLCBjbnQpOwotCi0JCWZvciAoaiA9IDA7IChqIDwgNCkgJiYgKGNudCArIGopIDwgdG90YWw7ICsraikKLQkJICBzd2l0Y2ggKGRhdGEgW2NudCArIGpdKQotCQkgICAgewotCQkgICAgY2FzZSAwOgotCQkgICAgICBmcHV0cyAoXygiICAgMCAoKmxvY2FsKikgICAgIiksIHN0ZG91dCk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIGZwdXRzIChfKCIgICAxICgqZ2xvYmFsKikgICAiKSwgc3Rkb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIG5uID0gcHJpbnRmICgiJTR4JWMiLCBkYXRhIFtjbnQgKyBqXSAmIDB4N2ZmZiwKLQkJCQkgICBkYXRhIFtjbnQgKyBqXSAmIDB4ODAwMCA/ICdoJyA6ICcgJyk7Ci0KLQkJICAgICAgaWYgKHN5bWJvbHMgW2NudCArIGpdLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRQotCQkJICAmJiBzZWN0aW9uX2hlYWRlcnNbc3ltYm9scyBbY250ICsgal0uc3Rfc2huZHhdLnNoX3R5cGUKLQkJCSAgPT0gU0hUX05PQklUUykKLQkJCXsKLQkJCSAgLyogV2UgbXVzdCB0ZXN0IGJvdGguICAqLwotCQkJICBFbGZfSW50ZXJuYWxfVmVybmVlZCAgICAgaXZuOwotCQkJICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgb2Zmc2V0OwotCi0JCQkgIG9mZnNldCA9IHZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSTkVFRCldCi0JCQkgICAgLSBsb2FkYWRkcjsKLQotCQkJICBkbwotCQkJICAgIHsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICAgZXZuOwotCQkJICAgICAgRWxmX0V4dGVybmFsX1Zlcm5hdXggICBldm5hOwotCQkJICAgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggICAgIGl2bmE7Ci0JCQkgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgdm5hX29mZjsKLQotCQkJICAgICAgR0VUX0RBVEEgKG9mZnNldCwgZXZuLCAidmVyc2lvbiBuZWVkIik7Ci0KLQkJCSAgICAgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOwotCQkJICAgICAgaXZuLnZuX25leHQgPSBCWVRFX0dFVCAoZXZuLnZuX25leHQpOwotCi0JCQkgICAgICB2bmFfb2ZmID0gb2Zmc2V0ICsgaXZuLnZuX2F1eDsKLQotCQkJICAgICAgZG8KLQkJCQl7Ci0JCQkJICBHRVRfREFUQSAodm5hX29mZiwgZXZuYSwKLQkJCQkJICAgICJ2ZXJzaW9uIG5lZWQgYXV4ICgxKSIpOwotCi0JCQkJICBpdm5hLnZuYV9uZXh0ICA9IEJZVEVfR0VUIChldm5hLnZuYV9uZXh0KTsKLQkJCQkgIGl2bmEudm5hX290aGVyID0gQllURV9HRVQgKGV2bmEudm5hX290aGVyKTsKLQotCQkJCSAgdm5hX29mZiArPSBpdm5hLnZuYV9uZXh0OwotCQkJCX0KLQkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSBkYXRhIFtjbnQgKyBqXQotCQkJCSAgICAgJiYgaXZuYS52bmFfbmV4dCAhPSAwKTsKLQotCQkJICAgICAgaWYgKGl2bmEudm5hX290aGVyID09IGRhdGEgW2NudCArIGpdKQotCQkJCXsKLQkJCQkgIGl2bmEudm5hX25hbWUgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmFtZSk7Ci0KLQkJCQkgIG5hbWUgPSBzdHJ0YWIgKyBpdm5hLnZuYV9uYW1lOwotCQkJCSAgbm4gKz0gcHJpbnRmICgiKCVzJS0qcyIsCi0JCQkJCQluYW1lLAotCQkJCQkJMTIgLSAoaW50KSBzdHJsZW4gKG5hbWUpLAotCQkJCQkJIikiKTsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICAgIGVsc2UgaWYgKGl2bi52bl9uZXh0ID09IDApCi0JCQkJewotCQkJCSAgaWYgKGRhdGEgW2NudCArIGpdICE9IDB4ODAwMSkKLQkJCQkgICAgewotCQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKLQkJCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICBldmQ7Ci0KLQkJCQkgICAgICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8KLQkJCQkJW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildCi0JCQkJCS0gbG9hZGFkZHI7Ci0KLQkJCQkgICAgICBkbwotCQkJCQl7Ci0JCQkJCSAgR0VUX0RBVEEgKG9mZnNldCwgZXZkLAotCQkJCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24iKTsKLQotCQkJCQkgIGl2ZC52ZF9uZXh0ID0gQllURV9HRVQgKGV2ZC52ZF9uZXh0KTsKLQkJCQkJICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQotCQkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCQkJfQotCQkJCSAgICAgIHdoaWxlIChpdmQudmRfbmR4Ci0JCQkJCSAgICAgIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQotCQkJCQkgICAgICYmIGl2ZC52ZF9uZXh0ICE9IDApOwotCi0JCQkJICAgICAgaWYgKGl2ZC52ZF9uZHgKLQkJCQkJICA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQotCQkJCQl7Ci0JCQkJCSAgRWxmX0V4dGVybmFsX1ZlcmRhdXggIGV2ZGE7Ci0JCQkJCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7Ci0KLQkJCQkJICBpdmQudmRfYXV4ID0gQllURV9HRVQgKGV2ZC52ZF9hdXgpOwotCi0JCQkJCSAgR0VUX0RBVEEgKG9mZnNldCArIGl2ZC52ZF9hdXgsIGV2ZGEsCi0JCQkJCQkgICAgInZlcnNpb24gZGVmaW5pdGlvbiBhdXgiKTsKLQotCQkJCQkgIGl2ZGEudmRhX25hbWUgPQotCQkJCQkgICAgQllURV9HRVQgKGV2ZGEudmRhX25hbWUpOwotCi0JCQkJCSAgbmFtZSA9IHN0cnRhYiArIGl2ZGEudmRhX25hbWU7Ci0JCQkJCSAgbm4gKz0KLQkJCQkJICAgIHByaW50ZiAoIiglcyUtKnMiLAotCQkJCQkJICAgIG5hbWUsCi0JCQkJCQkgICAgMTIgLSAoaW50KSBzdHJsZW4gKG5hbWUpLAotCQkJCQkJICAgICIpIik7Ci0JCQkJCX0KLQkJCQkgICAgfQotCi0JCQkJICBicmVhazsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJb2Zmc2V0ICs9IGl2bi52bl9uZXh0OwotCQkJICAgIH0KLQkJCSAgd2hpbGUgKGl2bi52bl9uZXh0KTsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc3ltYm9scyBbY250ICsgal0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCQkJewotCQkJICBFbGZfSW50ZXJuYWxfVmVybmVlZCAgICAgaXZuOwotCQkJICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgb2Zmc2V0OwotCi0JCQkgIG9mZnNldCA9IHZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSTkVFRCldCi0JCQkgICAgLSBsb2FkYWRkcjsKLQotCQkgICAgICAgICAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICBFbGZfSW50ZXJuYWxfVmVybmF1eCAgICAgaXZuYTsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICAgZXZuOwotCQkJICAgICAgRWxmX0V4dGVybmFsX1Zlcm5hdXggICBldm5hOwotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGFfb2ZmOwotCi0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldm4sICJ2ZXJzaW9uIG5lZWQiKTsKLQotCQkJICAgICAgaXZuLnZuX2F1eCAgPSBCWVRFX0dFVCAoZXZuLnZuX2F1eCk7Ci0JCQkgICAgICBpdm4udm5fbmV4dCA9IEJZVEVfR0VUIChldm4udm5fbmV4dCk7Ci0KLQkJCSAgICAgIGFfb2ZmID0gb2Zmc2V0ICsgaXZuLnZuX2F1eDsKLQotCQkJICAgICAgZG8KLQkJCQl7Ci0JCQkJICBHRVRfREFUQSAoYV9vZmYsIGV2bmEsCi0JCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMikiKTsKLQotCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7Ci0JCQkJICBpdm5hLnZuYV9vdGhlciA9IEJZVEVfR0VUIChldm5hLnZuYV9vdGhlcik7Ci0KLQkJCQkgIGFfb2ZmICs9IGl2bmEudm5hX25leHQ7Ci0JCQkJfQotCQkJICAgICAgd2hpbGUgKGl2bmEudm5hX290aGVyICE9IGRhdGEgW2NudCArIGpdCi0JCQkJICAgICAmJiBpdm5hLnZuYV9uZXh0ICE9IDApOwotCi0JCQkgICAgICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gZGF0YSBbY250ICsgal0pCi0JCQkJewotCQkJCSAgaXZuYS52bmFfbmFtZSA9IEJZVEVfR0VUIChldm5hLnZuYV9uYW1lKTsKLQotCQkJCSAgbmFtZSA9IHN0cnRhYiArIGl2bmEudm5hX25hbWU7Ci0JCQkJICBubiArPSBwcmludGYgKCIoJXMlLSpzIiwKLQkJCQkJCW5hbWUsCi0JCQkJCQkxMiAtIChpbnQpIHN0cmxlbiAobmFtZSksCi0JCQkJCQkiKSIpOwotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCi0JCQkgICAgICBvZmZzZXQgKz0gaXZuLnZuX25leHQ7Ci0JCQkgICAgfQotCQkJICB3aGlsZSAoaXZuLnZuX25leHQpOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChkYXRhIFtjbnQgKyBqXSAhPSAweDgwMDEpCi0JCQl7Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKLQkJCSAgRWxmX0V4dGVybmFsX1ZlcmRlZiAgZXZkOwotCQkJICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7Ci0KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildIC0gbG9hZGFkZHI7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmQsICJ2ZXJzaW9uIGRlZiIpOwotCi0JCQkgICAgICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0JCQkgICAgICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQotCQkJICAgICAgb2Zmc2V0ICs9IGl2ZC52ZF9uZXh0OwotCQkJICAgIH0KLQkJCSAgd2hpbGUgKGl2ZC52ZF9uZHggIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQotCQkJCSAmJiBpdmQudmRfbmV4dCAhPSAwKTsKLQotCQkJICBpZiAoaXZkLnZkX25keCA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQotCQkJICAgIHsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7Ci0KLQkJCSAgICAgIGl2ZC52ZF9hdXggPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7Ci0KLQkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQgLSBpdmQudmRfbmV4dCArIGl2ZC52ZF9hdXgsCi0JCQkJCWV2ZGEsICJ2ZXJzaW9uIGRlZiBhdXgiKTsKLQotCQkJICAgICAgaXZkYS52ZGFfbmFtZSA9IEJZVEVfR0VUIChldmRhLnZkYV9uYW1lKTsKLQotCQkJICAgICAgbmFtZSA9IHN0cnRhYiArIGl2ZGEudmRhX25hbWU7Ci0JCQkgICAgICBubiArPSBwcmludGYgKCIoJXMlLSpzIiwKLQkJCQkJICAgIG5hbWUsCi0JCQkJCSAgICAxMiAtIChpbnQpIHN0cmxlbiAobmFtZSksCi0JCQkJCSAgICAiKSIpOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBpZiAobm4gPCAxOCkKLQkJCXByaW50ZiAoIiUqYyIsIDE4IC0gbm4sICcgJyk7Ci0JCSAgICB9Ci0KLQkJcHV0Y2hhciAoJ1xuJyk7Ci0JICAgICAgfQotCi0JICAgIGZyZWUgKGRhdGEpOwotCSAgICBmcmVlIChzdHJ0YWIpOwotCSAgICBmcmVlIChzeW1ib2xzKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZm91bmQpCi0gICAgcHJpbnRmIChfKCJcbk5vIHZlcnNpb24gaW5mb3JtYXRpb24gZm91bmQgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfc3ltYm9sX2JpbmRpbmcgKGJpbmRpbmcpCi0gICAgIHVuc2lnbmVkIGludCBiaW5kaW5nOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoIChiaW5kaW5nKQotICAgIHsKLSAgICBjYXNlIFNUQl9MT0NBTDogIHJldHVybiAiTE9DQUwiOwotICAgIGNhc2UgU1RCX0dMT0JBTDogcmV0dXJuICJHTE9CQUwiOwotICAgIGNhc2UgU1RCX1dFQUs6ICAgcmV0dXJuICJXRUFLIjsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGJpbmRpbmcgPj0gU1RCX0xPUFJPQyAmJiBiaW5kaW5nIDw9IFNUQl9ISVBST0MpCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHByb2Nlc3NvciBzcGVjaWZpYz46ICVkIiksIGJpbmRpbmcpOwotICAgICAgZWxzZSBpZiAoYmluZGluZyA+PSBTVEJfTE9PUyAmJiBiaW5kaW5nIDw9IFNUQl9ISU9TKQotCXNwcmludGYgKGJ1ZmYsIF8oIjxPUyBzcGVjaWZpYz46ICVkIiksIGJpbmRpbmcpOwotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJWQiKSwgYmluZGluZyk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9zeW1ib2xfdHlwZSAodHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgU1RUX05PVFlQRTogICByZXR1cm4gIk5PVFlQRSI7Ci0gICAgY2FzZSBTVFRfT0JKRUNUOiAgIHJldHVybiAiT0JKRUNUIjsKLSAgICBjYXNlIFNUVF9GVU5DOiAgICAgcmV0dXJuICJGVU5DIjsKLSAgICBjYXNlIFNUVF9TRUNUSU9OOiAgcmV0dXJuICJTRUNUSU9OIjsKLSAgICBjYXNlIFNUVF9GSUxFOiAgICAgcmV0dXJuICJGSUxFIjsKLSAgICBjYXNlIFNUVF9DT01NT046ICAgcmV0dXJuICJDT01NT04iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAodHlwZSA+PSBTVFRfTE9QUk9DICYmIHR5cGUgPD0gU1RUX0hJUFJPQykKLQl7Ci0JICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fQVJNICYmIHR5cGUgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgcmV0dXJuICJUSFVNQl9GVU5DIjsKLQotCSAgaWYgKGVsZl9oZWFkZXIuZV9tYWNoaW5lID09IEVNX1NQQVJDVjkgJiYgdHlwZSA9PSBTVFRfUkVHSVNURVIpCi0JICAgIHJldHVybiAiUkVHSVNURVIiOwotCi0JICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fUEFSSVNDICYmIHR5cGUgPT0gU1RUX1BBUklTQ19NSUxMSSkKLQkgICAgcmV0dXJuICJQQVJJU0NfTUlMTEkiOwotCi0JICBzcHJpbnRmIChidWZmLCBfKCI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiKSwgdHlwZSk7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZSA+PSBTVFRfTE9PUyAmJiB0eXBlIDw9IFNUVF9ISU9TKQotCXsKLQkgIGlmIChlbGZfaGVhZGVyLmVfbWFjaGluZSA9PSBFTV9QQVJJU0MpCi0JICAgIHsKLQkgICAgICBpZiAodHlwZSA9PSBTVFRfSFBfT1BBUVVFKQotCQlyZXR1cm4gIkhQX09QQVFVRSI7Ci0JICAgICAgaWYgKHR5cGUgPT0gU1RUX0hQX1NUVUIpCi0JCXJldHVybiAiSFBfU1RVQiI7Ci0JICAgIH0KLQotCSAgc3ByaW50ZiAoYnVmZiwgXygiPE9TIHNwZWNpZmljPjogJWQiKSwgdHlwZSk7Ci0JfQotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJWQiKSwgdHlwZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9zeW1ib2xfdmlzaWJpbGl0eSAodmlzaWJpbGl0eSkKLSAgICAgdW5zaWduZWQgaW50IHZpc2liaWxpdHk7Ci17Ci0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgY2FzZSBTVFZfREVGQVVMVDogICByZXR1cm4gIkRFRkFVTFQiOwotICAgIGNhc2UgU1RWX0lOVEVSTkFMOiAgcmV0dXJuICJJTlRFUk5BTCI7Ci0gICAgY2FzZSBTVFZfSElEREVOOiAgICByZXR1cm4gIkhJRERFTiI7Ci0gICAgY2FzZSBTVFZfUFJPVEVDVEVEOiByZXR1cm4gIlBST1RFQ1RFRCI7Ci0gICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfc3ltYm9sX2luZGV4X3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGludCB0eXBlOwotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgU0hOX1VOREVGOiAgcmV0dXJuICJVTkQiOwotICAgIGNhc2UgU0hOX0FCUzogICAgcmV0dXJuICJBQlMiOwotICAgIGNhc2UgU0hOX0NPTU1PTjogcmV0dXJuICJDT00iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAodHlwZSA+PSBTSE5fTE9QUk9DICYmIHR5cGUgPD0gU0hOX0hJUFJPQykKLQlyZXR1cm4gIlBSQyI7Ci0gICAgICBlbHNlIGlmICh0eXBlID49IFNITl9MT1JFU0VSVkUgJiYgdHlwZSA8PSBTSE5fSElSRVNFUlZFKQotCXJldHVybiAiUlNWIjsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPj0gU0hOX0xPT1MgJiYgdHlwZSA8PSBTSE5fSElPUykKLQlyZXR1cm4gIk9TICI7Ci0gICAgICBlbHNlCi0JewotCSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0JICBzcHJpbnRmIChidWZmLCAiJTNkIiwgdHlwZSk7Ci0JICByZXR1cm4gYnVmZjsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50ICoKLWdldF9keW5hbWljX2RhdGEgKGZpbGUsIG51bWJlcikKLSAgICAgRklMRSAqICAgICAgIGZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBudW1iZXI7Ci17Ci0gIGNoYXIgKiBlX2RhdGE7Ci0gIGludCAqICBpX2RhdGE7Ci0KLSAgZV9kYXRhID0gKGNoYXIgKikgbWFsbG9jIChudW1iZXIgKiA0KTsKLQotICBpZiAoZV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlYWQgKGVfZGF0YSwgNCwgbnVtYmVyLCBmaWxlKSAhPSBudW1iZXIpCi0gICAgewotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byByZWFkIGluIGR5bmFtaWMgZGF0YVxuIikpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlfZGF0YSA9IChpbnQgKikgbWFsbG9jIChudW1iZXIgKiBzaXplb2YgKCogaV9kYXRhKSk7Ci0KLSAgaWYgKGlfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlX2RhdGEpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHdoaWxlIChudW1iZXItLSkKLSAgICBpX2RhdGEgW251bWJlcl0gPSBieXRlX2dldCAoZV9kYXRhICsgbnVtYmVyICogNCwgNCk7Ci0KLSAgZnJlZSAoZV9kYXRhKTsKLQotICByZXR1cm4gaV9kYXRhOwotfQotCi0vKiBEdW1wIHRoZSBzeW1ib2wgdGFibGUgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfc3ltYm9sX3RhYmxlIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgc2VjdGlvbjsKLSAgY2hhciAgIG5iIFs0XTsKLSAgY2hhciAgIG5jIFs0XTsKLSAgaW50ICAgIG5idWNrZXRzID0gMDsKLSAgaW50ICAgIG5jaGFpbnMgPSAwOwotICBpbnQgKiAgYnVja2V0cyA9IE5VTEw7Ci0gIGludCAqICBjaGFpbnMgPSBOVUxMOwotCi0gIGlmICghIGRvX3N5bXMgJiYgIWRvX2hpc3RvZ3JhbSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZHluYW1pY19pbmZvW0RUX0hBU0hdICYmICgoZG9fdXNpbmdfZHluYW1pYyAmJiBkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCkKLQkJCQl8fCBkb19oaXN0b2dyYW0pKQotICAgIHsKLSAgICAgIGlmIChmc2VlayAoZmlsZSwgZHluYW1pY19pbmZvW0RUX0hBU0hdIC0gbG9hZGFkZHIsIFNFRUtfU0VUKSkKLQl7Ci0JICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgZHluYW1pYyBpbmZvcm1hdGlvbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKGZyZWFkIChuYiwgc2l6ZW9mIChuYiksIDEsIGZpbGUpICE9IDEpCi0JewotCSAgZXJyb3IgKF8oIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBidWNrZXRzXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmIChmcmVhZCAobmMsIHNpemVvZiAobmMpLCAxLCBmaWxlKSAhPSAxKQotCXsKLQkgIGVycm9yIChfKCJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgY2hhaW5zXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIG5idWNrZXRzID0gYnl0ZV9nZXQgKG5iLCA0KTsKLSAgICAgIG5jaGFpbnMgID0gYnl0ZV9nZXQgKG5jLCA0KTsKLQotICAgICAgYnVja2V0cyA9IGdldF9keW5hbWljX2RhdGEgKGZpbGUsIG5idWNrZXRzKTsKLSAgICAgIGNoYWlucyAgPSBnZXRfZHluYW1pY19kYXRhIChmaWxlLCBuY2hhaW5zKTsKLQotICAgICAgaWYgKGJ1Y2tldHMgPT0gTlVMTCB8fCBjaGFpbnMgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX3N5bXMKLSAgICAgICYmIGR5bmFtaWNfaW5mb1tEVF9IQVNIXSAmJiBkb191c2luZ19keW5hbWljICYmIGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCAgICBobjsKLSAgICAgIGludCAgICBzaTsKLQotICAgICAgcHJpbnRmIChfKCJcblN5bWJvbCB0YWJsZSBmb3IgaW1hZ2U6XG4iKSk7Ci0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXByaW50ZiAoXygiICBOdW0gQnVjOiAgICBWYWx1ZSAgU2l6ZSAgIFR5cGUgICBCaW5kIFZpcyAgICAgIE5keCBOYW1lXG4iKSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmIChfKCIgIE51bSBCdWM6ICAgIFZhbHVlICAgICAgICAgIFNpemUgICBUeXBlICAgQmluZCBWaXMgICAgICBOZHggTmFtZVxuIikpOwotCi0gICAgICBmb3IgKGhuID0gMDsgaG4gPCBuYnVja2V0czsgaG4rKykKLQl7Ci0JICBpZiAoISBidWNrZXRzIFtobl0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBmb3IgKHNpID0gYnVja2V0cyBbaG5dOyBzaSA8IG5jaGFpbnMgJiYgc2kgPiAwOyBzaSA9IGNoYWlucyBbc2ldKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqIHBzeW07Ci0KLQkgICAgICBwc3ltID0gZHluYW1pY19zeW1ib2xzICsgc2k7Ci0KLQkgICAgICBwcmludGYgKCIgICUzZCAlM2Q6ICIsIHNpLCBobik7Ci0JICAgICAgcHJpbnRfdm1hIChwc3ltLT5zdF92YWx1ZSwgTE9OR19IRVgpOwotCSAgICAgIHB1dGNoYXIgKCcgJyApOwotCSAgICAgIHByaW50X3ZtYSAocHN5bS0+c3Rfc2l6ZSwgREVDXzUpOwotCQkgICAgICAKLQkgICAgICBwcmludGYgKCIgICU2cyIsIGdldF9zeW1ib2xfdHlwZSAoRUxGX1NUX1RZUEUgKHBzeW0tPnN0X2luZm8pKSk7Ci0JICAgICAgcHJpbnRmICgiICU2cyIsICBnZXRfc3ltYm9sX2JpbmRpbmcgKEVMRl9TVF9CSU5EIChwc3ltLT5zdF9pbmZvKSkpOwotCSAgICAgIHByaW50ZiAoIiAlM3MiLCAgZ2V0X3N5bWJvbF92aXNpYmlsaXR5IChFTEZfU1RfVklTSUJJTElUWSAocHN5bS0+c3Rfb3RoZXIpKSk7Ci0JICAgICAgcHJpbnRmICgiICUzLjNzIiwgZ2V0X3N5bWJvbF9pbmRleF90eXBlIChwc3ltLT5zdF9zaG5keCkpOwotCSAgICAgIHByaW50ZiAoIiAlc1xuIiwgZHluYW1pY19zdHJpbmdzICsgcHN5bS0+c3RfbmFtZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChkb19zeW1zICYmICFkb191c2luZ19keW5hbWljKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCAgICAgaTsKLQotICAgICAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLQkgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotCSAgIGkrKywgc2VjdGlvbisrKQotCXsKLQkgIHVuc2lnbmVkIGludCAgICAgICAgICBzaTsKLQkgIGNoYXIgKiAgICAgICAgICAgICAgICBzdHJ0YWI7Ci0JICBFbGZfSW50ZXJuYWxfU3ltICogICAgc3ltdGFiOwotCSAgRWxmX0ludGVybmFsX1N5bSAqICAgIHBzeW07Ci0KLQotCSAgaWYgKCAgIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX1NZTVRBQgotCSAgICAgICYmIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX0RZTlNZTSkKLQkgICAgY29udGludWU7Ci0KLQkgIHByaW50ZiAoXygiXG5TeW1ib2wgdGFibGUgJyVzJyBjb250YWlucyAlbHUgZW50cmllczpcbiIpLAotCQkgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIChzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSkpOwotCSAgaWYgKGlzXzMyYml0X2VsZikKLQkgICAgcHJpbnRmIChfKCIgICBOdW06ICAgIFZhbHVlICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgIE5keCBOYW1lXG4iKSk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoXygiICAgTnVtOiAgICBWYWx1ZSAgICAgICAgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgIE5keCBOYW1lXG4iKSk7Ci0KLQkgIHN5bXRhYiA9IEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LAotCQkJCSAgICBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSk7Ci0JICBpZiAoc3ltdGFiID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoc2VjdGlvbi0+c2hfbGluayA9PSBlbGZfaGVhZGVyLmVfc2hzdHJuZHgpCi0JICAgIHN0cnRhYiA9IHN0cmluZ190YWJsZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzdHJpbmdfc2VjOwotCi0JICAgICAgc3RyaW5nX3NlYyA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgICBHRVRfREFUQV9BTExPQyAoc3RyaW5nX3NlYy0+c2hfb2Zmc2V0LCBzdHJpbmdfc2VjLT5zaF9zaXplLAotCQkJICAgICAgc3RydGFiLCBjaGFyICosICJzdHJpbmcgdGFibGUiKTsKLQkgICAgfQotCi0JICBmb3IgKHNpID0gMCwgcHN5bSA9IHN5bXRhYjsKLQkgICAgICAgc2kgPCBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQkgICAgICAgc2kgKyssIHBzeW0gKyspCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlNmQ6ICIsIHNpKTsKLQkgICAgICBwcmludF92bWEgKHBzeW0tPnN0X3ZhbHVlLCBMT05HX0hFWCk7Ci0JICAgICAgcHV0Y2hhciAoJyAnKTsKLQkgICAgICBwcmludF92bWEgKHBzeW0tPnN0X3NpemUsIERFQ181KTsKLQkgICAgICBwcmludGYgKCIgJS03cyIsIGdldF9zeW1ib2xfdHlwZSAoRUxGX1NUX1RZUEUgKHBzeW0tPnN0X2luZm8pKSk7Ci0JICAgICAgcHJpbnRmICgiICUtNnMiLCBnZXRfc3ltYm9sX2JpbmRpbmcgKEVMRl9TVF9CSU5EIChwc3ltLT5zdF9pbmZvKSkpOwotCSAgICAgIHByaW50ZiAoIiAlLTNzIiwgZ2V0X3N5bWJvbF92aXNpYmlsaXR5IChFTEZfU1RfVklTSUJJTElUWSAocHN5bS0+c3Rfb3RoZXIpKSk7Ci0JICAgICAgcHJpbnRmICgiICU0cyIsIGdldF9zeW1ib2xfaW5kZXhfdHlwZSAocHN5bS0+c3Rfc2huZHgpKTsKLQkgICAgICBwcmludGYgKCIgJXMiLCBzdHJ0YWIgKyBwc3ltLT5zdF9uYW1lKTsKLQotCSAgICAgIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9EWU5TWU0gJiYKLQkJICB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUlNZTSldICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBjaGFyICAgZGF0YVsyXTsKLQkJICB1bnNpZ25lZCBzaG9ydCAgdmVyc19kYXRhOwotCQkgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQ7Ci0JCSAgaW50ICAgICAgICAgICAgIGlzX25vYml0czsKLQkJICBpbnQgICAgICAgICAgICAgY2hlY2tfZGVmOwotCi0JCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJTWU0pXQotCQkgICAgLSBsb2FkYWRkcjsKLQotCQkgIEdFVF9EQVRBIChvZmZzZXQgKyBzaSAqIHNpemVvZiAodmVyc19kYXRhKSwgZGF0YSwKLQkJCSAgICAidmVyc2lvbiBkYXRhIik7Ci0KLQkJICB2ZXJzX2RhdGEgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0KLQkJICBpc19ub2JpdHMgPSBwc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUgPwotCQkgICAgKHNlY3Rpb25faGVhZGVycyBbcHN5bS0+c3Rfc2huZHhdLnNoX3R5cGUgPT0gU0hUX05PQklUUykKLQkJICAgIDogMDsKLQotCQkgIGNoZWNrX2RlZiA9IChwc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpOwotCi0JCSAgaWYgKCh2ZXJzX2RhdGEgJiAweDgwMDApIHx8IHZlcnNfZGF0YSA+IDEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpc19ub2JpdHMgfHwgISBjaGVja19kZWYpCi0JCQl7Ci0JCQkgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICBldm47Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICBpdm47Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICBpdm5hOwotCi0JCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXSAtIGxvYWRhZGRyOwotCi0JCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOwotCi0JCQkgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOwotCQkJICBpdm4udm5fbmV4dCA9IEJZVEVfR0VUIChldm4udm5fbmV4dCk7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICB1bnNpZ25lZCBsb25nICB2bmFfb2ZmOwotCi0JCQkgICAgICB2bmFfb2ZmID0gb2Zmc2V0ICsgaXZuLnZuX2F1eDsKLQotCQkJICAgICAgZG8KLQkJCQl7Ci0JCQkJICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAgZXZuYTsKLQotCQkJCSAgR0VUX0RBVEEgKHZuYV9vZmYsIGV2bmEsCi0JCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMykiKTsKLQotCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOwotCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7Ci0JCQkJICBpdm5hLnZuYV9uYW1lICA9IEJZVEVfR0VUIChldm5hLnZuYV9uYW1lKTsKLQotCQkJCSAgdm5hX29mZiArPSBpdm5hLnZuYV9uZXh0OwotCQkJCX0KLQkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSB2ZXJzX2RhdGEKLQkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSB2ZXJzX2RhdGEpCi0JCQkJYnJlYWs7Ci0KLQkJCSAgICAgIG9mZnNldCArPSBpdm4udm5fbmV4dDsKLQkJCSAgICB9Ci0JCQkgIHdoaWxlIChpdm4udm5fbmV4dCAhPSAwKTsKLQotCQkJICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gdmVyc19kYXRhKQotCQkJICAgIHsKLQkJCSAgICAgIHByaW50ZiAoIkAlcyAoJWQpIiwKLQkJCQkgICAgICBzdHJ0YWIgKyBpdm5hLnZuYV9uYW1lLCBpdm5hLnZuYV9vdGhlcik7Ci0JCQkgICAgICBjaGVja19kZWYgPSAwOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoISBpc19ub2JpdHMpCi0JCQkgICAgZXJyb3IgKF8oImJhZCBkeW5hbWljIHN5bWJvbCIpKTsKLQkJCSAgZWxzZQotCQkJICAgIGNoZWNrX2RlZiA9IDE7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGNoZWNrX2RlZikKLQkJCXsKLQkJCSAgaWYgKHZlcnNfZGF0YSAhPSAweDgwMDEpCi0JCQkgICAgewotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAgICAgaXZkOwotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggICAgaXZkYTsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgb2Zmc2V0OwotCi0JCQkgICAgICBvZmZzZXQgPQotCQkJCXZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSREVGKV0KLQkJCQktIGxvYWRhZGRyOwotCi0JCQkgICAgICBkbwotCQkJCXsKLQkJCQkgIEVsZl9FeHRlcm5hbF9WZXJkZWYgICBldmQ7Ci0KLQkJCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2ZCwgInZlcnNpb24gZGVmIik7Ci0KLQkJCQkgIGl2ZC52ZF9uZHggID0gQllURV9HRVQgKGV2ZC52ZF9uZHgpOwotCQkJCSAgaXZkLnZkX2F1eCAgPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7Ci0JCQkJICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0KLQkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZkLnZkX25keCAhPSAodmVyc19kYXRhICYgMHg3ZmZmKQotCQkJCSAgICAgJiYgaXZkLnZkX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIG9mZnNldCAtPSBpdmQudmRfbmV4dDsKLQkJCSAgICAgIG9mZnNldCArPSBpdmQudmRfYXV4OwotCi0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmRhLCAidmVyc2lvbiBkZWYgYXV4Iik7Ci0KLQkJCSAgICAgIGl2ZGEudmRhX25hbWUgPSBCWVRFX0dFVCAoZXZkYS52ZGFfbmFtZSk7Ci0KLQkJCSAgICAgIGlmIChwc3ltLT5zdF9uYW1lICE9IGl2ZGEudmRhX25hbWUpCi0JCQkJcHJpbnRmICgodmVyc19kYXRhICYgMHg4MDAwKQotCQkJCQk/ICJAJXMiIDogIkBAJXMiLAotCQkJCQlzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHB1dGNoYXIgKCdcbicpOwotCSAgICB9Ci0KLQkgIGZyZWUgKHN5bXRhYik7Ci0JICBpZiAoc3RydGFiICE9IHN0cmluZ190YWJsZSkKLQkgICAgZnJlZSAoc3RydGFiKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkb19zeW1zKQotICAgIHByaW50ZgotICAgICAgKF8oIlxuRHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgZGlzcGxheWluZyBzeW1ib2xzLlxuIikpOwotCi0gIGlmIChkb19oaXN0b2dyYW0gJiYgYnVja2V0cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCAqbGVuZ3RoczsKLSAgICAgIGludCAqY291bnRzOwotICAgICAgaW50IGhuOwotICAgICAgaW50IHNpOwotICAgICAgaW50IG1heGxlbmd0aCA9IDA7Ci0gICAgICBpbnQgbnplcm9fY291bnRzID0gMDsKLSAgICAgIGludCBuc3ltcyA9IDA7Ci0KLSAgICAgIHByaW50ZiAoXygiXG5IaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCAodG90YWwgb2YgJWQgYnVja2V0cyk6XG4iKSwKLQkgICAgICBuYnVja2V0cyk7Ci0gICAgICBwcmludGYgKF8oIiBMZW5ndGggIE51bWJlciAgICAgJSUgb2YgdG90YWwgIENvdmVyYWdlXG4iKSk7Ci0KLSAgICAgIGxlbmd0aHMgPSAoaW50ICopIGNhbGxvYyAobmJ1Y2tldHMsIHNpemVvZiAoaW50KSk7Ci0gICAgICBpZiAobGVuZ3RocyA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZm9yIChobiA9IDA7IGhuIDwgbmJ1Y2tldHM7ICsraG4pCi0JewotCSAgaWYgKCEgYnVja2V0cyBbaG5dKQotCSAgICBjb250aW51ZTsKLQotCSAgZm9yIChzaSA9IGJ1Y2tldHNbaG5dOyBzaSA+IDAgJiYgc2kgPCBuY2hhaW5zOyBzaSA9IGNoYWluc1tzaV0pCi0JICAgIHsKLQkgICAgICArKyBuc3ltczsKLQkgICAgICBpZiAobWF4bGVuZ3RoIDwgKytsZW5ndGhzW2huXSkKLQkJKysgbWF4bGVuZ3RoOwotCSAgICB9Ci0JfQotCi0gICAgICBjb3VudHMgPSAoaW50ICopIGNhbGxvYyAobWF4bGVuZ3RoICsgMSwgc2l6ZW9mIChpbnQpKTsKLSAgICAgIGlmIChjb3VudHMgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgZm9yIChobiA9IDA7IGhuIDwgbmJ1Y2tldHM7ICsraG4pCi0JKysgY291bnRzIFtsZW5ndGhzIFtobl1dOwotCi0gICAgICBpZiAobmJ1Y2tldHMgPiAwKQotCXsKLQkgIHByaW50ZiAoIiAgICAgIDAgICUtMTBkICglNS4xZiUlKVxuIiwKLQkJICBjb3VudHNbMF0sIChjb3VudHNbMF0gKiAxMDAuMCkgLyBuYnVja2V0cyk7Ci0JICBmb3IgKHNpID0gMTsgc2kgPD0gbWF4bGVuZ3RoOyArK3NpKQotCSAgICB7Ci0JICAgICAgbnplcm9fY291bnRzICs9IGNvdW50c1tzaV0gKiBzaTsKLQkgICAgICBwcmludGYgKCIlN2QgICUtMTBkICglNS4xZiUlKSAgICAlNS4xZiUlXG4iLAotCQkgICAgICBzaSwgY291bnRzW3NpXSwgKGNvdW50c1tzaV0gKiAxMDAuMCkgLyBuYnVja2V0cywKLQkJICAgICAgKG56ZXJvX2NvdW50cyAqIDEwMC4wKSAvIG5zeW1zKTsKLQkgICAgfQotCX0KLQotICAgICAgZnJlZSAoY291bnRzKTsKLSAgICAgIGZyZWUgKGxlbmd0aHMpOwotICAgIH0KLQotICBpZiAoYnVja2V0cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGJ1Y2tldHMpOwotICAgICAgZnJlZSAoY2hhaW5zKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfc3ltaW5mbyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMCi0gICAgICB8fCAhZG9fZHluYW1pYykKLSAgICAvKiBObyBzeW1pbmZvLCB0aGlzIGlzIG9rLiAgKi8KLSAgICByZXR1cm4gMTsKLQotICAvKiBUaGVyZSBiZXR0ZXIgc2hvdWxkIGJlIGEgZHluYW1pYyBzeW1ib2wgc2VjdGlvbi4gICovCi0gIGlmIChkeW5hbWljX3N5bWJvbHMgPT0gTlVMTCB8fCBkeW5hbWljX3N0cmluZ3MgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZHluYW1pY19hZGRyKQotICAgIHByaW50ZiAoXygiXG5EeW5hbWljIGluZm8gc2VnbWVudCBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWQgZW50cmllczpcbiIpLAotCSAgICBkeW5hbWljX3N5bWluZm9fb2Zmc2V0LCBkeW5hbWljX3N5bWluZm9fbmVudCk7Ci0KLSAgcHJpbnRmIChfKCIgTnVtOiBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmRUbyAgICAgRmxhZ3NcbiIpKTsKLSAgZm9yIChpID0gMDsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgc2hvcnQgaW50IGZsYWdzID0gZHluYW1pY19zeW1pbmZvW2ldLnNpX2ZsYWdzOwotCi0gICAgICBwcmludGYgKCIlNGQ6ICUtMzBzICIsIGksCi0JICAgICAgZHluYW1pY19zdHJpbmdzICsgZHluYW1pY19zeW1ib2xzW2ldLnN0X25hbWUpOwotCi0gICAgICBzd2l0Y2ggKGR5bmFtaWNfc3ltaW5mb1tpXS5zaV9ib3VuZHRvKQotCXsKLQljYXNlIFNZTUlORk9fQlRfU0VMRjoKLQkgIGZwdXRzICgiU0VMRiAgICAgICAiLCBzdGRvdXQpOwotCSAgYnJlYWs7Ci0JY2FzZSBTWU1JTkZPX0JUX1BBUkVOVDoKLQkgIGZwdXRzICgiUEFSRU5UICAgICAiLCBzdGRvdXQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmIChkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA+IDAKLQkgICAgICAmJiBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA8IGR5bmFtaWNfc2l6ZSkKLQkgICAgcHJpbnRmICgiJS0xMHMgIiwKLQkJICAgIGR5bmFtaWNfc3RyaW5ncwotCQkgICAgKyBkeW5hbWljX3NlZ21lbnRbZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG9dLmRfdW4uZF92YWwpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIlLTEwZCAiLCBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0RJUkVDVCkKLQlwcmludGYgKCIgRElSRUNUIik7Ci0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19QQVNTVEhSVSkKLQlwcmludGYgKCIgUEFTU1RIUlUiKTsKLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0NPUFkpCi0JcHJpbnRmICgiIENPUFkiKTsKLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0xBWllMT0FEKQotCXByaW50ZiAoIiBMQVpZTE9BRCIpOwotCi0gICAgICBwdXRzICgiIik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICBGSUxFICogZmlsZTsKLXsKLSAgcHJpbnRmIChfKCJcbkFzc2VtYmx5IGR1bXAgb2Ygc2VjdGlvbiAlc1xuIiksCi0JICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICAvKiBYWFggLS0gdG8gYmUgZG9uZSAtLS0gWFhYICovCi0KLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotZHVtcF9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGJmZF9zaXplX3R5cGUgICBieXRlczsKLSAgYmZkX3ZtYSAgICAgICAgIGFkZHI7Ci0gIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICB1bnNpZ25lZCBjaGFyICogc3RhcnQ7Ci0KLSAgYnl0ZXMgPSBzZWN0aW9uLT5zaF9zaXplOwotCi0gIGlmIChieXRlcyA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5TZWN0aW9uICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIpLAotCSAgICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcbkhleCBkdW1wIG9mIHNlY3Rpb24gJyVzJzpcbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICBhZGRyID0gc2VjdGlvbi0+c2hfYWRkcjsKLQotICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBieXRlcywgc3RhcnQsIHVuc2lnbmVkIGNoYXIgKiwKLQkJICAic2VjdGlvbiBkYXRhIik7Ci0KLSAgZGF0YSA9IHN0YXJ0OwotCi0gIHdoaWxlIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGludCBrOwotICAgICAgaW50IGxieXRlczsKLQotICAgICAgbGJ5dGVzID0gKGJ5dGVzID4gMTYgPyAxNiA6IGJ5dGVzKTsKLQotICAgICAgcHJpbnRmICgiICAweCU4LjhseCAiLCAodW5zaWduZWQgbG9uZykgYWRkcik7Ci0KLSAgICAgIHN3aXRjaCAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIEVMRkRBVEEyTFNCOgotCSAgZm9yIChqID0gMTU7IGogPj0gMDsgaiAtLSkKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoIShqICYgMHgzKSkKLQkJcHJpbnRmICgiICIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUxGREFUQTJNU0I6Ci0JICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoKGogJiAzKSA9PSAzKQotCQlwcmludGYgKCIgIik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgZm9yIChqID0gMDsgaiA8IGxieXRlczsgaisrKQotCXsKLQkgIGsgPSBkYXRhIFtqXTsKLQkgIGlmIChrID49ICcgJyAmJiBrIDwgMHg4MCkKLQkgICAgcHJpbnRmICgiJWMiLCBrKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiLiIpOwotCX0KLQotICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0KLSAgICAgIGRhdGEgICs9IGxieXRlczsKLSAgICAgIGFkZHIgICs9IGxieXRlczsKLSAgICAgIGJ5dGVzIC09IGxieXRlczsKLSAgICB9Ci0KLSAgZnJlZSAoc3RhcnQpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludAotcmVhZF9sZWIxMjggKGRhdGEsIGxlbmd0aF9yZXR1cm4sIHNpZ24pCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICBpbnQgKiAgICAgICAgICAgbGVuZ3RoX3JldHVybjsKLSAgICAgaW50ICAgICAgICAgICAgIHNpZ247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHJlc3VsdCA9IDA7Ci0gIHVuc2lnbmVkIGludCAgICAgIG51bV9yZWFkID0gMDsKLSAgaW50ICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICB1bnNpZ25lZCBjaGFyICAgICBieXRlOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9ICogZGF0YSArKzsKLSAgICAgIG51bV9yZWFkICsrOwotCi0gICAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKLQotICAgICAgc2hpZnQgKz0gNzsKLQotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICBpZiAobGVuZ3RoX3JldHVybiAhPSBOVUxMKQotICAgICogbGVuZ3RoX3JldHVybiA9IG51bV9yZWFkOwotCi0gIGlmIChzaWduICYmIChzaGlmdCA8IDMyKSAmJiAoYnl0ZSAmIDB4NDApKQotICAgIHJlc3VsdCB8PSAtMSA8PCBzaGlmdDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdCBTdGF0ZV9NYWNoaW5lX1JlZ2lzdGVycwotewotICB1bnNpZ25lZCBsb25nCWFkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCAgZmlsZTsKLSAgdW5zaWduZWQgaW50ICBsaW5lOwotICB1bnNpZ25lZCBpbnQgIGNvbHVtbjsKLSAgaW50ICAgICAgICAgICBpc19zdG10OwotICBpbnQgICAgICAgICAgIGJhc2ljX2Jsb2NrOwotICBpbnQJICAgICAgICBlbmRfc2VxdWVuY2U7Ci0vKiBUaGlzIHZhcmlhYmxlIGhvbGQgdGhlIG51bWJlciBvZiB0aGUgbGFzdCBlbnRyeSBzZWVuCi0gICBpbiB0aGUgRmlsZSBUYWJsZS4gICovCi0gIHVuc2lnbmVkIGludCAgbGFzdF9maWxlX2VudHJ5OwotfSBTTVI7Ci0KLXN0YXRpYyBTTVIgc3RhdGVfbWFjaGluZV9yZWdzOwotCi1zdGF0aWMgdm9pZAotcmVzZXRfc3RhdGVfbWFjaGluZSAoaXNfc3RtdCkKLSAgICAgaW50IGlzX3N0bXQ7Ci17Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzID0gMDsKLSAgc3RhdGVfbWFjaGluZV9yZWdzLmZpbGUgPSAxOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSA9IDE7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5jb2x1bW4gPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdCA9IGlzX3N0bXQ7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5iYXNpY19ibG9jayA9IDA7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5lbmRfc2VxdWVuY2UgPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGFzdF9maWxlX2VudHJ5ID0gMDsKLX0KLQotLyogSGFuZGxlZCBhbiBleHRlbmQgbGluZSBvcC4gIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBlbmQKLSAgIG9mIHNlcXVlbmNlLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCAoZGF0YSwgaXNfc3RtdCwgcG9pbnRlcl9zaXplKQotICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgaW50IGlzX3N0bXQ7Ci0gICAgIGludCBwb2ludGVyX3NpemU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgICBvcF9jb2RlOwotICBpbnQgICAgICAgICAgICAgYnl0ZXNfcmVhZDsKLSAgdW5zaWduZWQgaW50ICAgIGxlbjsKLSAgdW5zaWduZWQgY2hhciAqIG5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgICBhZHI7Ci0KLSAgbGVuID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQotICBpZiAobGVuID09IDApCi0gICAgewotICAgICAgd2FybiAoXygiYmFkbHkgZm9ybWVkIGV4dGVuZGVkIGxpbmUgb3AgZW5jb3VudGVyZWQhIikpOwotICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Ci0gICAgfQotCi0gIGxlbiArPSBieXRlc19yZWFkOwotICBvcF9jb2RlID0gKiBkYXRhICsrOwotCi0gIHByaW50ZiAoXygiICBFeHRlbmRlZCBvcGNvZGUgJWQ6ICIpLCBvcF9jb2RlKTsKLQotICBzd2l0Y2ggKG9wX2NvZGUpCi0gICAgewotICAgIGNhc2UgRFdfTE5FX2VuZF9zZXF1ZW5jZToKLSAgICAgIHByaW50ZiAoXygiRW5kIG9mIFNlcXVlbmNlXG5cbiIpKTsKLSAgICAgIHJlc2V0X3N0YXRlX21hY2hpbmUgKGlzX3N0bXQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0xORV9zZXRfYWRkcmVzczoKLSAgICAgIGFkciA9IGJ5dGVfZ2V0IChkYXRhLCBwb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmIChfKCJzZXQgQWRkcmVzcyB0byAweCVseFxuIiksIGFkcik7Ci0gICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyA9IGFkcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19MTkVfZGVmaW5lX2ZpbGU6Ci0gICAgICBwcmludGYgKF8oIiAgZGVmaW5lIG5ldyBGaWxlIFRhYmxlIGVudHJ5XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgRW50cnlcdERpclx0VGltZVx0U2l6ZVx0TmFtZVxuIikpOwotCi0gICAgICBwcmludGYgKF8oIiAgICVkXHQiKSwgKysgc3RhdGVfbWFjaGluZV9yZWdzLmxhc3RfZmlsZV9lbnRyeSk7Ci0gICAgICBuYW1lID0gZGF0YTsKLSAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhKSArIDE7Ci0gICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0gICAgICBwcmludGYgKF8oIiVzXG5cbiIpLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoXygiVU5LTk9XTjogbGVuZ3RoICVkXG4iKSwgbGVuIC0gYnl0ZXNfcmVhZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbjsKLX0KLQotLyogU2l6ZSBvZiBwb2ludGVycyBpbiB0aGUgLmRlYnVnX2xpbmUgc2VjdGlvbi4gIFRoaXMgaW5mb3JtYXRpb24gaXMgbm90Ci0gICByZWFsbHkgcHJlc2VudCBpbiB0aGF0IHNlY3Rpb24uICBJdCdzIG9idGFpbmVkIGJlZm9yZSBkdW1waW5nIHRoZSBkZWJ1ZwotICAgc2VjdGlvbnMgYnkgZG9pbmcgc29tZSBwcmUtc2NhbiBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCi1zdGF0aWMgaW50IGRlYnVnX2xpbmVfcG9pbnRlcl9zaXplID0gNDsKLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19saW5lcyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIERXQVJGMl9FeHRlcm5hbF9MaW5lSW5mbyAqIGV4dGVybmFsOwotICBEV0FSRjJfSW50ZXJuYWxfTGluZUluZm8gICBpbmZvOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBzdGFuZGFyZF9vcGNvZGVzOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBkYXRhID0gc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICAgIGVuZCAgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICAgIGVuZF9vZl9zZXF1ZW5jZTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQotICBwcmludGYgKF8oIlxuRHVtcCBvZiBkZWJ1ZyBjb250ZW50cyBvZiBzZWN0aW9uICVzOlxuXG4iKSwKLQkgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIHdoaWxlIChkYXRhIDwgZW5kKQotICAgIHsKLSAgICAgIGV4dGVybmFsID0gKERXQVJGMl9FeHRlcm5hbF9MaW5lSW5mbyAqKSBkYXRhOwotCi0gICAgICAvKiBDaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBibG9jay4gICovCi0gICAgICBpbmZvLmxpX2xlbmd0aCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfbGVuZ3RoKTsKLSAgICAgIGlmIChpbmZvLmxpX2xlbmd0aCA+IHNlY3Rpb24tPnNoX3NpemUpCi0JewotCSAgd2FybgotCSAgICAoXygiVGhlIGxpbmUgaW5mbyBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQgLSB0aGUgc2VjdGlvbiBpcyB0b28gc21hbGxcbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogQ2hlY2sgaXRzIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgICAgIGluZm8ubGlfdmVyc2lvbiA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfdmVyc2lvbik7Ci0gICAgICBpZiAoaW5mby5saV92ZXJzaW9uICE9IDIpCi0JewotCSAgd2FybiAoXygiT25seSBEV0FSRiB2ZXJzaW9uIDIgbGluZSBpbmZvIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGluZm8ubGlfcHJvbG9ndWVfbGVuZ3RoID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9wcm9sb2d1ZV9sZW5ndGgpOwotICAgICAgaW5mby5saV9taW5faW5zbl9sZW5ndGggPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX21pbl9pbnNuX2xlbmd0aCk7Ci0gICAgICBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfZGVmYXVsdF9pc19zdG10KTsKLSAgICAgIGluZm8ubGlfbGluZV9iYXNlICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9saW5lX2Jhc2UpOwotICAgICAgaW5mby5saV9saW5lX3JhbmdlICAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2xpbmVfcmFuZ2UpOwotICAgICAgaW5mby5saV9vcGNvZGVfYmFzZSAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX29wY29kZV9iYXNlKTsKLQotICAgICAgLyogU2lnbiBleHRlbmQgdGhlIGxpbmUgYmFzZSBmaWVsZC4gICovCi0gICAgICBpbmZvLmxpX2xpbmVfYmFzZSA8PD0gMjQ7Ci0gICAgICBpbmZvLmxpX2xpbmVfYmFzZSA+Pj0gMjQ7Ci0KLSAgICAgIHByaW50ZiAoXygiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgICVsZFxuIiksIGluZm8ubGlfbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICBEV0FSRiBWZXJzaW9uOiAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiICBQcm9sZ3VlIExlbmd0aDogICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9wcm9sb2d1ZV9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIE1pbmltdW0gSW5zdHJ1Y3Rpb24gTGVuZ3RoOiAgJWRcbiIpLCBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgSW5pdGlhbCB2YWx1ZSBvZiAnaXNfc3RtdCc6ICAlZFxuIiksIGluZm8ubGlfZGVmYXVsdF9pc19zdG10KTsKLSAgICAgIHByaW50ZiAoXygiICBMaW5lIEJhc2U6ICAgICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9saW5lX2Jhc2UpOwotICAgICAgcHJpbnRmIChfKCIgIExpbmUgUmFuZ2U6ICAgICAgICAgICAgICAgICAgJWRcbiIpLCBpbmZvLmxpX2xpbmVfcmFuZ2UpOwotICAgICAgcHJpbnRmIChfKCIgIE9wY29kZSBCYXNlOiAgICAgICAgICAgICAgICAgJWRcbiIpLCBpbmZvLmxpX29wY29kZV9iYXNlKTsKLQotICAgICAgZW5kX29mX3NlcXVlbmNlID0gZGF0YSArIGluZm8ubGlfbGVuZ3RoICsgc2l6ZW9mIChpbmZvLmxpX2xlbmd0aCk7Ci0KLSAgICAgIHJlc2V0X3N0YXRlX21hY2hpbmUgKGluZm8ubGlfZGVmYXVsdF9pc19zdG10KTsKLQotICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIE9wY29kZXMgdGFibGUuICAqLwotICAgICAgc3RhbmRhcmRfb3Bjb2RlcyA9IGRhdGEgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotCi0gICAgICBwcmludGYgKF8oIlxuIE9wY29kZXM6XG4iKSk7Ci0KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBpbmZvLmxpX29wY29kZV9iYXNlOyBpKyspCi0JcHJpbnRmIChfKCIgIE9wY29kZSAlZCBoYXMgJWQgYXJnc1xuIiksIGksIHN0YW5kYXJkX29wY29kZXNbaSAtIDFdKTsKLQotICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIERpcmVjdG9yeSB0YWJsZS4gICovCi0gICAgICBkYXRhID0gc3RhbmRhcmRfb3Bjb2RlcyArIGluZm8ubGlfb3Bjb2RlX2Jhc2UgLSAxOwotCi0gICAgICBpZiAoKiBkYXRhID09IDApCi0JcHJpbnRmIChfKCJcbiBUaGUgRGlyZWN0b3J5IFRhYmxlIGlzIGVtcHR5LlxuIikpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiXG4gVGhlIERpcmVjdG9yeSBUYWJsZTpcbiIpKTsKLQotCSAgd2hpbGUgKCogZGF0YSAhPSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCIgICVzXG4iKSwgZGF0YSk7Ci0KLQkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTa2lwIHRoZSBOVUwgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUuICAqLwotICAgICAgZGF0YSArKzsKLQotICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIEZpbGUgTmFtZSB0YWJsZS4gICovCi0gICAgICBpZiAoKiBkYXRhID09IDApCi0JcHJpbnRmIChfKCJcbiBUaGUgRmlsZSBOYW1lIFRhYmxlIGlzIGVtcHR5LlxuIikpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiXG4gVGhlIEZpbGUgTmFtZSBUYWJsZTpcbiIpKTsKLQkgIHByaW50ZiAoXygiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iKSk7Ci0KLQkgIHdoaWxlICgqIGRhdGEgIT0gMCkKLQkgICAgewotCSAgICAgIGNoYXIgKiBuYW1lOwotCSAgICAgIGludCBieXRlc19yZWFkOwotCi0JICAgICAgcHJpbnRmIChfKCIgICVkXHQiKSwgKysgc3RhdGVfbWFjaGluZV9yZWdzLmxhc3RfZmlsZV9lbnRyeSk7Ci0JICAgICAgbmFtZSA9IGRhdGE7Ci0KLQkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotCi0JICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLQkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgcHJpbnRmIChfKCIlc1xuIiksIG5hbWUpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTa2lwIHRoZSBOVUwgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUuICAqLwotICAgICAgZGF0YSArKzsKLQotICAgICAgLyogTm93IGRpc3BsYXkgdGhlIHN0YXRlbWVudHMuICAqLwotICAgICAgcHJpbnRmIChfKCJcbiBMaW5lIE51bWJlciBTdGF0ZW1lbnRzOlxuIikpOwotCi0KLSAgICAgIHdoaWxlIChkYXRhIDwgZW5kX29mX3NlcXVlbmNlKQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgb3BfY29kZTsKLQkgIGludCAgICAgICAgICAgYWR2OwotCSAgaW50ICAgICAgICAgICBieXRlc19yZWFkOwotCi0JICBvcF9jb2RlID0gKiBkYXRhICsrOwotCi0JICBzd2l0Y2ggKG9wX2NvZGUpCi0JICAgIHsKLQkgICAgY2FzZSBEV19MTlNfZXh0ZW5kZWRfb3A6Ci0JICAgICAgZGF0YSArPSBwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3AgKGRhdGEsIGluZm8ubGlfZGVmYXVsdF9pc19zdG10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfbGluZV9wb2ludGVyX3NpemUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX2NvcHk6Ci0JICAgICAgcHJpbnRmIChfKCIgIENvcHlcbiIpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX3BjOgotCSAgICAgIGFkdiA9IGluZm8ubGlfbWluX2luc25fbGVuZ3RoICogcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzICs9IGFkdjsKLQkgICAgICBwcmludGYgKF8oIiAgQWR2YW5jZSBQQyBieSAlZCB0byAlbHhcbiIpLCBhZHYsCi0JCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX2xpbmU6Ci0JICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMSk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5saW5lICs9IGFkdjsKLQkgICAgICBwcmludGYgKF8oIiAgQWR2YW5jZSBMaW5lIGJ5ICVkIHRvICVkXG4iKSwgYWR2LAotCQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6Ci0JICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiICBTZXQgRmlsZSBOYW1lIHRvIGVudHJ5ICVkIGluIHRoZSBGaWxlIE5hbWUgVGFibGVcbiIpLAotCQkgICAgICBhZHYpOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5maWxlID0gYWR2OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX3NldF9jb2x1bW46Ci0JICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiICBTZXQgY29sdW1uIHRvICVkXG4iKSwgYWR2KTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuY29sdW1uID0gYWR2OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX25lZ2F0ZV9zdG10OgotCSAgICAgIGFkdiA9IHN0YXRlX21hY2hpbmVfcmVncy5pc19zdG10OwotCSAgICAgIGFkdiA9ICEgYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBTZXQgaXNfc3RtdCB0byAlZFxuIiksIGFkdik7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmlzX3N0bXQgPSBhZHY7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgotCSAgICAgIHByaW50ZiAoXygiICBTZXQgYmFzaWMgYmxvY2tcbiIpKTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYmFzaWNfYmxvY2sgPSAxOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYzoKLQkgICAgICBhZHYgPSAoKCgyNTUgLSBpbmZvLmxpX29wY29kZV9iYXNlKSAvIGluZm8ubGlfbGluZV9yYW5nZSkKLQkJICAgICAqIGluZm8ubGlfbWluX2luc25fbGVuZ3RoKTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIEFkdmFuY2UgUEMgYnkgY29uc3RhbnQgJWQgdG8gMHglbHhcbiIpLCBhZHYsCi0JCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOgotCSAgICAgIGFkdiA9IGJ5dGVfZ2V0IChkYXRhLCAyKTsKLQkgICAgICBkYXRhICs9IDI7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIFBDIGJ5IGZpeGVkIHNpemUgYW1vdW50ICVkIHRvIDB4JWx4XG4iKSwKLQkJICAgICAgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBvcF9jb2RlIC09IGluZm8ubGlfb3Bjb2RlX2Jhc2U7Ci0JICAgICAgYWR2ICAgICAgPSAob3BfY29kZSAvIGluZm8ubGlfbGluZV9yYW5nZSkgKiBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aDsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIFNwZWNpYWwgb3Bjb2RlICVkOiBhZHZhbmNlIEFkZHJlc3MgYnkgJWQgdG8gMHglbHgiKSwKLQkJICAgICAgb3BfY29kZSwgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYWR2ID0gKG9wX2NvZGUgJSBpbmZvLmxpX2xpbmVfcmFuZ2UpICsgaW5mby5saV9saW5lX2Jhc2U7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiIGFuZCBMaW5lIGJ5ICVkIHRvICVkXG4iKSwKLQkJICAgICAgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19wdWJuYW1lcyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIERXQVJGMl9FeHRlcm5hbF9QdWJOYW1lcyAqIGV4dGVybmFsOwotICBEV0FSRjJfSW50ZXJuYWxfUHViTmFtZXMgICBwdWJuYW1lczsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgZW5kOwotCi0gIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLQotICBwcmludGYgKF8oIkNvbnRlbnRzIG9mIHRoZSAlcyBzZWN0aW9uOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICAgdW5zaWduZWQgbG9uZyAgIG9mZnNldDsKLQotICAgICAgZXh0ZXJuYWwgPSAoRFdBUkYyX0V4dGVybmFsX1B1Yk5hbWVzICopIHN0YXJ0OwotCi0gICAgICBwdWJuYW1lcy5wbl9sZW5ndGggID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl9sZW5ndGgpOwotICAgICAgcHVibmFtZXMucG5fdmVyc2lvbiA9IEJZVEVfR0VUIChleHRlcm5hbC0+cG5fdmVyc2lvbik7Ci0gICAgICBwdWJuYW1lcy5wbl9vZmZzZXQgID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl9vZmZzZXQpOwotICAgICAgcHVibmFtZXMucG5fc2l6ZSAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cG5fc2l6ZSk7Ci0KLSAgICAgIGRhdGEgICA9IHN0YXJ0ICsgc2l6ZW9mICgqIGV4dGVybmFsKTsKLSAgICAgIHN0YXJ0ICs9IHB1Ym5hbWVzLnBuX2xlbmd0aCArIHNpemVvZiAoZXh0ZXJuYWwtPnBuX2xlbmd0aCk7Ci0KLSAgICAgIGlmIChwdWJuYW1lcy5wbl92ZXJzaW9uICE9IDIpCi0JewotCSAgd2FybiAoXygiT25seSBEV0FSRiAyIHB1Ym5hbWVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBwcmludGYgKF8oIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVsZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIpLAotCSAgICAgIHB1Ym5hbWVzLnBuX3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCIgIE9mZnNldCBpbnRvIC5kZWJ1Z19pbmZvIHNlY3Rpb246ICAgICAlbGRcbiIpLAotCSAgICAgIHB1Ym5hbWVzLnBuX29mZnNldCk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiBhcmVhIGluIC5kZWJ1Z19pbmZvIHNlY3Rpb246ICVsZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fc2l6ZSk7Ci0KLSAgICAgIHByaW50ZiAoXygiXG4gICAgT2Zmc2V0XHROYW1lXG4iKSk7Ci0KLSAgICAgIGRvCi0JewotCSAgb2Zmc2V0ID0gYnl0ZV9nZXQgKGRhdGEsIDQpOwotCi0JICBpZiAob2Zmc2V0ICE9IDApCi0JICAgIHsKLQkgICAgICBkYXRhICs9IDQ7Ci0JICAgICAgcHJpbnRmICgiICAgICVsZFx0XHQlc1xuIiwgb2Zmc2V0LCBkYXRhKTsKLQkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKG9mZnNldCAhPSAwKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgiXG4iKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9UQUdfbmFtZSAodGFnKQotICAgICB1bnNpZ25lZCBsb25nIHRhZzsKLXsKLSAgc3dpdGNoICh0YWcpCi0gICAgewotICAgIGNhc2UgRFdfVEFHX3BhZGRpbmc6IHJldHVybiAiRFdfVEFHX3BhZGRpbmciOwotICAgIGNhc2UgRFdfVEFHX2FycmF5X3R5cGU6IHJldHVybiAiRFdfVEFHX2FycmF5X3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6IHJldHVybiAiRFdfVEFHX2NsYXNzX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2VudHJ5X3BvaW50OiByZXR1cm4gIkRXX1RBR19lbnRyeV9wb2ludCI7Ci0gICAgY2FzZSBEV19UQUdfZW51bWVyYXRpb25fdHlwZTogcmV0dXJuICJEV19UQUdfZW51bWVyYXRpb25fdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfZm9ybWFsX3BhcmFtZXRlcjogcmV0dXJuICJEV19UQUdfZm9ybWFsX3BhcmFtZXRlciI7Ci0gICAgY2FzZSBEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb246IHJldHVybiAiRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uIjsKLSAgICBjYXNlIERXX1RBR19sYWJlbDogcmV0dXJuICJEV19UQUdfbGFiZWwiOwotICAgIGNhc2UgRFdfVEFHX2xleGljYWxfYmxvY2s6IHJldHVybiAiRFdfVEFHX2xleGljYWxfYmxvY2siOwotICAgIGNhc2UgRFdfVEFHX21lbWJlcjogcmV0dXJuICJEV19UQUdfbWVtYmVyIjsKLSAgICBjYXNlIERXX1RBR19wb2ludGVyX3R5cGU6IHJldHVybiAiRFdfVEFHX3BvaW50ZXJfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfcmVmZXJlbmNlX3R5cGU6IHJldHVybiAiRFdfVEFHX3JlZmVyZW5jZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR19jb21waWxlX3VuaXQ6IHJldHVybiAiRFdfVEFHX2NvbXBpbGVfdW5pdCI7Ci0gICAgY2FzZSBEV19UQUdfc3RyaW5nX3R5cGU6IHJldHVybiAiRFdfVEFHX3N0cmluZ190eXBlIjsKLSAgICBjYXNlIERXX1RBR19zdHJ1Y3R1cmVfdHlwZTogcmV0dXJuICJEV19UQUdfc3RydWN0dXJlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZTogcmV0dXJuICJEV19UQUdfc3Vicm91dGluZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR190eXBlZGVmOiByZXR1cm4gIkRXX1RBR190eXBlZGVmIjsKLSAgICBjYXNlIERXX1RBR191bmlvbl90eXBlOiByZXR1cm4gIkRXX1RBR191bmlvbl90eXBlIjsKLSAgICBjYXNlIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzOiByZXR1cm4gIkRXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzIjsKLSAgICBjYXNlIERXX1RBR192YXJpYW50OiByZXR1cm4gIkRXX1RBR192YXJpYW50IjsKLSAgICBjYXNlIERXX1RBR19jb21tb25fYmxvY2s6IHJldHVybiAiRFdfVEFHX2NvbW1vbl9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfY29tbW9uX2luY2x1c2lvbjogcmV0dXJuICJEV19UQUdfY29tbW9uX2luY2x1c2lvbiI7Ci0gICAgY2FzZSBEV19UQUdfaW5oZXJpdGFuY2U6IHJldHVybiAiRFdfVEFHX2luaGVyaXRhbmNlIjsKLSAgICBjYXNlIERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmU6IHJldHVybiAiRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSI7Ci0gICAgY2FzZSBEV19UQUdfbW9kdWxlOiByZXR1cm4gIkRXX1RBR19tb2R1bGUiOwotICAgIGNhc2UgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZTogcmV0dXJuICJEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlIjsKLSAgICBjYXNlIERXX1RBR19zZXRfdHlwZTogcmV0dXJuICJEV19UQUdfc2V0X3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6IHJldHVybiAiRFdfVEFHX3N1YnJhbmdlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3dpdGhfc3RtdDogcmV0dXJuICJEV19UQUdfd2l0aF9zdG10IjsKLSAgICBjYXNlIERXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb246IHJldHVybiAiRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiI7Ci0gICAgY2FzZSBEV19UQUdfYmFzZV90eXBlOiByZXR1cm4gIkRXX1RBR19iYXNlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2NhdGNoX2Jsb2NrOiByZXR1cm4gIkRXX1RBR19jYXRjaF9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfY29uc3RfdHlwZTogcmV0dXJuICJEV19UQUdfY29uc3RfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfY29uc3RhbnQ6IHJldHVybiAiRFdfVEFHX2NvbnN0YW50IjsKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdG9yOiByZXR1cm4gIkRXX1RBR19lbnVtZXJhdG9yIjsKLSAgICBjYXNlIERXX1RBR19maWxlX3R5cGU6IHJldHVybiAiRFdfVEFHX2ZpbGVfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfZnJpZW5kOiByZXR1cm4gIkRXX1RBR19mcmllbmQiOwotICAgIGNhc2UgRFdfVEFHX25hbWVsaXN0OiByZXR1cm4gIkRXX1RBR19uYW1lbGlzdCI7Ci0gICAgY2FzZSBEV19UQUdfbmFtZWxpc3RfaXRlbTogcmV0dXJuICJEV19UQUdfbmFtZWxpc3RfaXRlbSI7Ci0gICAgY2FzZSBEV19UQUdfcGFja2VkX3R5cGU6IHJldHVybiAiRFdfVEFHX3BhY2tlZF90eXBlIjsKLSAgICBjYXNlIERXX1RBR19zdWJwcm9ncmFtOiByZXR1cm4gIkRXX1RBR19zdWJwcm9ncmFtIjsKLSAgICBjYXNlIERXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtOiByZXR1cm4gIkRXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtIjsKLSAgICBjYXNlIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbTogcmV0dXJuICJEV19UQUdfdGVtcGxhdGVfdmFsdWVfcGFyYW0iOwotICAgIGNhc2UgRFdfVEFHX3Rocm93bl90eXBlOiByZXR1cm4gIkRXX1RBR190aHJvd25fdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfdHJ5X2Jsb2NrOiByZXR1cm4gIkRXX1RBR190cnlfYmxvY2siOwotICAgIGNhc2UgRFdfVEFHX3ZhcmlhbnRfcGFydDogcmV0dXJuICJEV19UQUdfdmFyaWFudF9wYXJ0IjsKLSAgICBjYXNlIERXX1RBR192YXJpYWJsZTogcmV0dXJuICJEV19UQUdfdmFyaWFibGUiOwotICAgIGNhc2UgRFdfVEFHX3ZvbGF0aWxlX3R5cGU6IHJldHVybiAiRFdfVEFHX3ZvbGF0aWxlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX01JUFNfbG9vcDogcmV0dXJuICJEV19UQUdfTUlQU19sb29wIjsKLSAgICBjYXNlIERXX1RBR19mb3JtYXRfbGFiZWw6IHJldHVybiAiRFdfVEFHX2Zvcm1hdF9sYWJlbCI7Ci0gICAgY2FzZSBEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGU6IHJldHVybiAiRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlIjsKLSAgICBjYXNlIERXX1RBR19jbGFzc190ZW1wbGF0ZTogcmV0dXJuICJEV19UQUdfY2xhc3NfdGVtcGxhdGUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyIFsxMDBdOwotCi0Jc3ByaW50ZiAoYnVmZmVyLCBfKCJVbmtub3duIFRBRyB2YWx1ZTogJWx4IiksIHRhZyk7Ci0JcmV0dXJuIGJ1ZmZlcjsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9BVF9uYW1lIChhdHRyaWJ1dGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlOwotewotICBzd2l0Y2ggKGF0dHJpYnV0ZSkKLSAgICB7Ci0gICAgY2FzZSBEV19BVF9zaWJsaW5nOiByZXR1cm4gIkRXX0FUX3NpYmxpbmciOwotICAgIGNhc2UgRFdfQVRfbG9jYXRpb246IHJldHVybiAiRFdfQVRfbG9jYXRpb24iOwotICAgIGNhc2UgRFdfQVRfbmFtZTogcmV0dXJuICJEV19BVF9uYW1lIjsKLSAgICBjYXNlIERXX0FUX29yZGVyaW5nOiByZXR1cm4gIkRXX0FUX29yZGVyaW5nIjsKLSAgICBjYXNlIERXX0FUX3N1YnNjcl9kYXRhOiByZXR1cm4gIkRXX0FUX3N1YnNjcl9kYXRhIjsKLSAgICBjYXNlIERXX0FUX2J5dGVfc2l6ZTogcmV0dXJuICJEV19BVF9ieXRlX3NpemUiOwotICAgIGNhc2UgRFdfQVRfYml0X29mZnNldDogcmV0dXJuICJEV19BVF9iaXRfb2Zmc2V0IjsKLSAgICBjYXNlIERXX0FUX2JpdF9zaXplOiByZXR1cm4gIkRXX0FUX2JpdF9zaXplIjsKLSAgICBjYXNlIERXX0FUX2VsZW1lbnRfbGlzdDogcmV0dXJuICJEV19BVF9lbGVtZW50X2xpc3QiOwotICAgIGNhc2UgRFdfQVRfc3RtdF9saXN0OiByZXR1cm4gIkRXX0FUX3N0bXRfbGlzdCI7Ci0gICAgY2FzZSBEV19BVF9sb3dfcGM6IHJldHVybiAiRFdfQVRfbG93X3BjIjsKLSAgICBjYXNlIERXX0FUX2hpZ2hfcGM6IHJldHVybiAiRFdfQVRfaGlnaF9wYyI7Ci0gICAgY2FzZSBEV19BVF9sYW5ndWFnZTogcmV0dXJuICJEV19BVF9sYW5ndWFnZSI7Ci0gICAgY2FzZSBEV19BVF9tZW1iZXI6IHJldHVybiAiRFdfQVRfbWVtYmVyIjsKLSAgICBjYXNlIERXX0FUX2Rpc2NyOiByZXR1cm4gIkRXX0FUX2Rpc2NyIjsKLSAgICBjYXNlIERXX0FUX2Rpc2NyX3ZhbHVlOiByZXR1cm4gIkRXX0FUX2Rpc2NyX3ZhbHVlIjsKLSAgICBjYXNlIERXX0FUX3Zpc2liaWxpdHk6IHJldHVybiAiRFdfQVRfdmlzaWJpbGl0eSI7Ci0gICAgY2FzZSBEV19BVF9pbXBvcnQ6IHJldHVybiAiRFdfQVRfaW1wb3J0IjsKLSAgICBjYXNlIERXX0FUX3N0cmluZ19sZW5ndGg6IHJldHVybiAiRFdfQVRfc3RyaW5nX2xlbmd0aCI7Ci0gICAgY2FzZSBEV19BVF9jb21tb25fcmVmZXJlbmNlOiByZXR1cm4gIkRXX0FUX2NvbW1vbl9yZWZlcmVuY2UiOwotICAgIGNhc2UgRFdfQVRfY29tcF9kaXI6IHJldHVybiAiRFdfQVRfY29tcF9kaXIiOwotICAgIGNhc2UgRFdfQVRfY29uc3RfdmFsdWU6IHJldHVybiAiRFdfQVRfY29uc3RfdmFsdWUiOwotICAgIGNhc2UgRFdfQVRfY29udGFpbmluZ190eXBlOiByZXR1cm4gIkRXX0FUX2NvbnRhaW5pbmdfdHlwZSI7Ci0gICAgY2FzZSBEV19BVF9kZWZhdWx0X3ZhbHVlOiByZXR1cm4gIkRXX0FUX2RlZmF1bHRfdmFsdWUiOwotICAgIGNhc2UgRFdfQVRfaW5saW5lOiByZXR1cm4gIkRXX0FUX2lubGluZSI7Ci0gICAgY2FzZSBEV19BVF9pc19vcHRpb25hbDogcmV0dXJuICJEV19BVF9pc19vcHRpb25hbCI7Ci0gICAgY2FzZSBEV19BVF9sb3dlcl9ib3VuZDogcmV0dXJuICJEV19BVF9sb3dlcl9ib3VuZCI7Ci0gICAgY2FzZSBEV19BVF9wcm9kdWNlcjogcmV0dXJuICJEV19BVF9wcm9kdWNlciI7Ci0gICAgY2FzZSBEV19BVF9wcm90b3R5cGVkOiByZXR1cm4gIkRXX0FUX3Byb3RvdHlwZWQiOwotICAgIGNhc2UgRFdfQVRfcmV0dXJuX2FkZHI6IHJldHVybiAiRFdfQVRfcmV0dXJuX2FkZHIiOwotICAgIGNhc2UgRFdfQVRfc3RhcnRfc2NvcGU6IHJldHVybiAiRFdfQVRfc3RhcnRfc2NvcGUiOwotICAgIGNhc2UgRFdfQVRfc3RyaWRlX3NpemU6IHJldHVybiAiRFdfQVRfc3RyaWRlX3NpemUiOwotICAgIGNhc2UgRFdfQVRfdXBwZXJfYm91bmQ6IHJldHVybiAiRFdfQVRfdXBwZXJfYm91bmQiOwotICAgIGNhc2UgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luOiByZXR1cm4gIkRXX0FUX2Fic3RyYWN0X29yaWdpbiI7Ci0gICAgY2FzZSBEV19BVF9hY2Nlc3NpYmlsaXR5OiByZXR1cm4gIkRXX0FUX2FjY2Vzc2liaWxpdHkiOwotICAgIGNhc2UgRFdfQVRfYWRkcmVzc19jbGFzczogcmV0dXJuICJEV19BVF9hZGRyZXNzX2NsYXNzIjsKLSAgICBjYXNlIERXX0FUX2FydGlmaWNpYWw6IHJldHVybiAiRFdfQVRfYXJ0aWZpY2lhbCI7Ci0gICAgY2FzZSBEV19BVF9iYXNlX3R5cGVzOiByZXR1cm4gIkRXX0FUX2Jhc2VfdHlwZXMiOwotICAgIGNhc2UgRFdfQVRfY2FsbGluZ19jb252ZW50aW9uOiByZXR1cm4gIkRXX0FUX2NhbGxpbmdfY29udmVudGlvbiI7Ci0gICAgY2FzZSBEV19BVF9jb3VudDogcmV0dXJuICJEV19BVF9jb3VudCI7Ci0gICAgY2FzZSBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbjogcmV0dXJuICJEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9kZWNsX2NvbHVtbjogcmV0dXJuICJEV19BVF9kZWNsX2NvbHVtbiI7Ci0gICAgY2FzZSBEV19BVF9kZWNsX2ZpbGU6IHJldHVybiAiRFdfQVRfZGVjbF9maWxlIjsKLSAgICBjYXNlIERXX0FUX2RlY2xfbGluZTogcmV0dXJuICJEV19BVF9kZWNsX2xpbmUiOwotICAgIGNhc2UgRFdfQVRfZGVjbGFyYXRpb246IHJldHVybiAiRFdfQVRfZGVjbGFyYXRpb24iOwotICAgIGNhc2UgRFdfQVRfZGlzY3JfbGlzdDogcmV0dXJuICJEV19BVF9kaXNjcl9saXN0IjsKLSAgICBjYXNlIERXX0FUX2VuY29kaW5nOiByZXR1cm4gIkRXX0FUX2VuY29kaW5nIjsKLSAgICBjYXNlIERXX0FUX2V4dGVybmFsOiByZXR1cm4gIkRXX0FUX2V4dGVybmFsIjsKLSAgICBjYXNlIERXX0FUX2ZyYW1lX2Jhc2U6IHJldHVybiAiRFdfQVRfZnJhbWVfYmFzZSI7Ci0gICAgY2FzZSBEV19BVF9mcmllbmQ6IHJldHVybiAiRFdfQVRfZnJpZW5kIjsKLSAgICBjYXNlIERXX0FUX2lkZW50aWZpZXJfY2FzZTogcmV0dXJuICJEV19BVF9pZGVudGlmaWVyX2Nhc2UiOwotICAgIGNhc2UgRFdfQVRfbWFjcm9faW5mbzogcmV0dXJuICJEV19BVF9tYWNyb19pbmZvIjsKLSAgICBjYXNlIERXX0FUX25hbWVsaXN0X2l0ZW1zOiByZXR1cm4gIkRXX0FUX25hbWVsaXN0X2l0ZW1zIjsKLSAgICBjYXNlIERXX0FUX3ByaW9yaXR5OiByZXR1cm4gIkRXX0FUX3ByaW9yaXR5IjsKLSAgICBjYXNlIERXX0FUX3NlZ21lbnQ6IHJldHVybiAiRFdfQVRfc2VnbWVudCI7Ci0gICAgY2FzZSBEV19BVF9zcGVjaWZpY2F0aW9uOiByZXR1cm4gIkRXX0FUX3NwZWNpZmljYXRpb24iOwotICAgIGNhc2UgRFdfQVRfc3RhdGljX2xpbms6IHJldHVybiAiRFdfQVRfc3RhdGljX2xpbmsiOwotICAgIGNhc2UgRFdfQVRfdHlwZTogcmV0dXJuICJEV19BVF90eXBlIjsKLSAgICBjYXNlIERXX0FUX3VzZV9sb2NhdGlvbjogcmV0dXJuICJEV19BVF91c2VfbG9jYXRpb24iOwotICAgIGNhc2UgRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyOiByZXR1cm4gIkRXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciI7Ci0gICAgY2FzZSBEV19BVF92aXJ0dWFsaXR5OiByZXR1cm4gIkRXX0FUX3ZpcnR1YWxpdHkiOwotICAgIGNhc2UgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb246IHJldHVybiAiRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24iOwotICAgIGNhc2UgRFdfQVRfTUlQU19mZGU6IHJldHVybiAiRFdfQVRfTUlQU19mZGUiOwotICAgIGNhc2UgRFdfQVRfTUlQU19sb29wX2JlZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfbG9vcF9iZWdpbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX3RhaWxfbG9vcF9iZWdpbjogcmV0dXJuICJEV19BVF9NSVBTX3RhaWxfbG9vcF9iZWdpbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2VwaWxvZ19iZWdpbjogcmV0dXJuICJEV19BVF9NSVBTX2VwaWxvZ19iZWdpbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2xvb3BfdW5yb2xsX2ZhY3RvcjogcmV0dXJuICJEV19BVF9NSVBTX2xvb3BfdW5yb2xsX2ZhY3RvciI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX3NvZnR3YXJlX3BpcGVsaW5lX2RlcHRoOiByZXR1cm4gIkRXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGgiOwotICAgIGNhc2UgRFdfQVRfTUlQU19saW5rYWdlX25hbWU6IHJldHVybiAiRFdfQVRfTUlQU19saW5rYWdlX25hbWUiOwotICAgIGNhc2UgRFdfQVRfTUlQU19zdHJpZGU6IHJldHVybiAiRFdfQVRfTUlQU19zdHJpZGUiOwotICAgIGNhc2UgRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lOiByZXR1cm4gIkRXX0FUX01JUFNfYWJzdHJhY3RfbmFtZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2Nsb25lX29yaWdpbjogcmV0dXJuICJEV19BVF9NSVBTX2Nsb25lX29yaWdpbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2hhc19pbmxpbmVzOiByZXR1cm4gIkRXX0FUX01JUFNfaGFzX2lubGluZXMiOwotICAgIGNhc2UgRFdfQVRfc2ZfbmFtZXM6IHJldHVybiAiRFdfQVRfc2ZfbmFtZXMiOwotICAgIGNhc2UgRFdfQVRfc3JjX2luZm86IHJldHVybiAiRFdfQVRfc3JjX2luZm8iOwotICAgIGNhc2UgRFdfQVRfbWFjX2luZm86IHJldHVybiAiRFdfQVRfbWFjX2luZm8iOwotICAgIGNhc2UgRFdfQVRfc3JjX2Nvb3JkczogcmV0dXJuICJEV19BVF9zcmNfY29vcmRzIjsKLSAgICBjYXNlIERXX0FUX2JvZHlfYmVnaW46IHJldHVybiAiRFdfQVRfYm9keV9iZWdpbiI7Ci0gICAgY2FzZSBEV19BVF9ib2R5X2VuZDogcmV0dXJuICJEV19BVF9ib2R5X2VuZCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQlzdGF0aWMgY2hhciBidWZmZXIgWzEwMF07Ci0KLQlzcHJpbnRmIChidWZmZXIsIF8oIlVua25vd24gQVQgdmFsdWU6ICVseCIpLCBhdHRyaWJ1dGUpOwotCXJldHVybiBidWZmZXI7Ci0gICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfRk9STV9uYW1lIChmb3JtKQotICAgICB1bnNpZ25lZCBsb25nIGZvcm07Ci17Ci0gIHN3aXRjaCAoZm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX2FkZHI6IHJldHVybiAiRFdfRk9STV9hZGRyIjsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2syOiByZXR1cm4gIkRXX0ZPUk1fYmxvY2syIjsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OiByZXR1cm4gIkRXX0ZPUk1fYmxvY2s0IjsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTI6IHJldHVybiAiRFdfRk9STV9kYXRhMiI7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE0OiByZXR1cm4gIkRXX0ZPUk1fZGF0YTQiOwotICAgIGNhc2UgRFdfRk9STV9kYXRhODogcmV0dXJuICJEV19GT1JNX2RhdGE4IjsKLSAgICBjYXNlIERXX0ZPUk1fc3RyaW5nOiByZXR1cm4gIkRXX0ZPUk1fc3RyaW5nIjsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6IHJldHVybiAiRFdfRk9STV9ibG9jayI7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMTogcmV0dXJuICJEV19GT1JNX2Jsb2NrMSI7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGExOiByZXR1cm4gIkRXX0ZPUk1fZGF0YTEiOwotICAgIGNhc2UgRFdfRk9STV9mbGFnOiByZXR1cm4gIkRXX0ZPUk1fZmxhZyI7Ci0gICAgY2FzZSBEV19GT1JNX3NkYXRhOiByZXR1cm4gIkRXX0ZPUk1fc2RhdGEiOwotICAgIGNhc2UgRFdfRk9STV9zdHJwOiByZXR1cm4gIkRXX0ZPUk1fc3RycCI7Ci0gICAgY2FzZSBEV19GT1JNX3VkYXRhOiByZXR1cm4gIkRXX0ZPUk1fdWRhdGEiOwotICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjogcmV0dXJuICJEV19GT1JNX3JlZl9hZGRyIjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmMTogcmV0dXJuICJEV19GT1JNX3JlZjEiOwotICAgIGNhc2UgRFdfRk9STV9yZWYyOiByZXR1cm4gIkRXX0ZPUk1fcmVmMiI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjQ6IHJldHVybiAiRFdfRk9STV9yZWY0IjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmODogcmV0dXJuICJEV19GT1JNX3JlZjgiOwotICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6IHJldHVybiAiRFdfRk9STV9yZWZfdWRhdGEiOwotICAgIGNhc2UgRFdfRk9STV9pbmRpcmVjdDogcmV0dXJuICJEV19GT1JNX2luZGlyZWN0IjsKLSAgICBkZWZhdWx0OgotICAgICAgewotCXN0YXRpYyBjaGFyIGJ1ZmZlciBbMTAwXTsKLQotCXNwcmludGYgKGJ1ZmZlciwgXygiVW5rbm93biBGT1JNIHZhbHVlOiAlbHgiKSwgZm9ybSk7Ci0JcmV0dXJuIGJ1ZmZlcjsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIEZJWE1FOiAgVGhlcmUgYXJlIGJldHRlciBhbmQgbW9yZSBlZmZpZWNpbnQgd2F5cyB0byBoYW5kbGUKLSAgIHRoZXNlIHN0cnVjdHVyZXMuICBGb3Igbm93IHRob3VnaCwgSSBqdXN0IHdhbnQgc29tZXRoaW5nIHRoYXQKLSAgIGlzIHNpbXBsZSB0byBpbXBsZW1lbnQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgYWJicmV2X2F0dHIKLXsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgYXR0cmlidXRlOwotICB1bnNpZ25lZCBsb25nICAgICAgICBmb3JtOwotICBzdHJ1Y3QgYWJicmV2X2F0dHIgKiBuZXh0OwotfQotYWJicmV2X2F0dHI7Ci0KLXR5cGVkZWYgc3RydWN0IGFiYnJldl9lbnRyeQotewotICB1bnNpZ25lZCBsb25nICAgICAgICAgIGVudHJ5OwotICB1bnNpZ25lZCBsb25nICAgICAgICAgIHRhZzsKLSAgaW50ICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjsKLSAgc3RydWN0IGFiYnJldl9hdHRyICogICBmaXJzdF9hdHRyOwotICBzdHJ1Y3QgYWJicmV2X2F0dHIgKiAgIGxhc3RfYXR0cjsKLSAgc3RydWN0IGFiYnJldl9lbnRyeSAqICBuZXh0OwotfQotYWJicmV2X2VudHJ5OwotCi1zdGF0aWMgYWJicmV2X2VudHJ5ICogZmlyc3RfYWJicmV2ID0gTlVMTDsKLXN0YXRpYyBhYmJyZXZfZW50cnkgKiBsYXN0X2FiYnJldiA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkCi1mcmVlX2FiYnJldnMgUEFSQU1TICgodm9pZCkpCi17Ci0gIGFiYnJldl9lbnRyeSAqIGFiYnJldjsKLQotICBmb3IgKGFiYnJldiA9IGZpcnN0X2FiYnJldjsgYWJicmV2OykKLSAgICB7Ci0gICAgICBhYmJyZXZfZW50cnkgKiBuZXh0ID0gYWJicmV2LT5uZXh0OwotICAgICAgYWJicmV2X2F0dHIgICogYXR0cjsKLQotICAgICAgZm9yIChhdHRyID0gYWJicmV2LT5maXJzdF9hdHRyOyBhdHRyOykKLQl7Ci0JICBhYmJyZXZfYXR0ciAqIG5leHQgPSBhdHRyLT5uZXh0OwotCi0JICBmcmVlIChhdHRyKTsKLQkgIGF0dHIgPSBuZXh0OwotCX0KLQotICAgICAgZnJlZSAoYWJicmV2KTsKLSAgICAgIGFiYnJldiA9IG5leHQ7Ci0gICAgfQotCi0gIGxhc3RfYWJicmV2ID0gZmlyc3RfYWJicmV2ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLWFkZF9hYmJyZXYgKG51bWJlciwgdGFnLCBjaGlsZHJlbikKLSAgICAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdGFnOwotICAgICBpbnQgICAgICAgICAgIGNoaWxkcmVuOwotewotICBhYmJyZXZfZW50cnkgKiBlbnRyeTsKLQotICBlbnRyeSA9IChhYmJyZXZfZW50cnkgKikgbWFsbG9jIChzaXplb2YgKCogZW50cnkpKTsKLQotICBpZiAoZW50cnkgPT0gTlVMTCkKLSAgICAvKiB1Z2cgKi8KLSAgICByZXR1cm47Ci0KLSAgZW50cnktPmVudHJ5ICAgICAgPSBudW1iZXI7Ci0gIGVudHJ5LT50YWcgICAgICAgID0gdGFnOwotICBlbnRyeS0+Y2hpbGRyZW4gICA9IGNoaWxkcmVuOwotICBlbnRyeS0+Zmlyc3RfYXR0ciA9IE5VTEw7Ci0gIGVudHJ5LT5sYXN0X2F0dHIgID0gTlVMTDsKLSAgZW50cnktPm5leHQgICAgICAgPSBOVUxMOwotCi0gIGlmIChmaXJzdF9hYmJyZXYgPT0gTlVMTCkKLSAgICBmaXJzdF9hYmJyZXYgPSBlbnRyeTsKLSAgZWxzZQotICAgIGxhc3RfYWJicmV2LT5uZXh0ID0gZW50cnk7Ci0KLSAgbGFzdF9hYmJyZXYgPSBlbnRyeTsKLX0KLQotc3RhdGljIHZvaWQKLWFkZF9hYmJyZXZfYXR0ciAoYXR0cmlidXRlLCBmb3JtKQotICAgICB1bnNpZ25lZCBsb25nIGF0dHJpYnV0ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBmb3JtOwotewotICBhYmJyZXZfYXR0ciAqIGF0dHI7Ci0KLSAgYXR0ciA9IChhYmJyZXZfYXR0ciAqKSBtYWxsb2MgKHNpemVvZiAoKiBhdHRyKSk7Ci0KLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICAvKiB1Z2cgKi8KLSAgICByZXR1cm47Ci0KLSAgYXR0ci0+YXR0cmlidXRlID0gYXR0cmlidXRlOwotICBhdHRyLT5mb3JtICAgICAgPSBmb3JtOwotICBhdHRyLT5uZXh0ICAgICAgPSBOVUxMOwotCi0gIGlmIChsYXN0X2FiYnJldi0+Zmlyc3RfYXR0ciA9PSBOVUxMKQotICAgIGxhc3RfYWJicmV2LT5maXJzdF9hdHRyID0gYXR0cjsKLSAgZWxzZQotICAgIGxhc3RfYWJicmV2LT5sYXN0X2F0dHItPm5leHQgPSBhdHRyOwotCi0gIGxhc3RfYWJicmV2LT5sYXN0X2F0dHIgPSBhdHRyOwotfQotCi0vKiBQcm9jZXNzZXMgdGhlIChwYXJ0aWFsKSBjb250ZW50cyBvZiBhIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4KLSAgIFJldHVybnMgTlVMTCBpZiB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIHdhcyBlbmNvdW50ZXJlZC4KLSAgIFJldHVybnMgdGhlIGFkZHJlc3MgYWZ0ZXIgdGhlIGxhc3QgYnl0ZSByZWFkIGlmIHRoZSBlbmQgb2YKLSAgIGFuIGFiYnJldmlhdGlvbiBzZXQgd2FzIGZvdW5kLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotcHJvY2Vzc19hYmJyZXZfc2VjdGlvbiAoc3RhcnQsIGVuZCkKLSAgICAgdW5zaWduZWQgY2hhciAqIHN0YXJ0OwotICAgICB1bnNpZ25lZCBjaGFyICogZW5kOwotewotICBpZiAoZmlyc3RfYWJicmV2ICE9IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgYnl0ZXNfcmVhZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZW50cnk7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRhZzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlOwotICAgICAgaW50ICAgICAgICAgICBjaGlsZHJlbjsKLQotICAgICAgZW50cnkgPSByZWFkX2xlYjEyOCAoc3RhcnQsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gICAgICBzdGFydCArPSBieXRlc19yZWFkOwotCi0gICAgICAvKiBBIHNpbmdsZSB6ZXJvIGlzIHN1cHBvc2VkIHRvIGVuZCB0aGUgc2VjdGlvbiBhY2NvcmRpbmcKLQkgdG8gdGhlIHN0YW5kYXJkLiAgSWYgdGhlcmUncyBtb3JlLCB0aGVuIHNpZ25hbCB0aGF0IHRvCi0JIHRoZSBjYWxsZXIuICAqLwotICAgICAgaWYgKGVudHJ5ID09IDApCi0JcmV0dXJuIHN0YXJ0ID09IGVuZCA/IE5VTEwgOiBzdGFydDsKLQotICAgICAgdGFnID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotICAgICAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotICAgICAgY2hpbGRyZW4gPSAqIHN0YXJ0ICsrOwotCi0gICAgICBhZGRfYWJicmV2IChlbnRyeSwgdGFnLCBjaGlsZHJlbik7Ci0KLSAgICAgIGRvCi0JewotCSAgdW5zaWduZWQgbG9uZyBmb3JtOwotCi0JICBhdHRyaWJ1dGUgPSByZWFkX2xlYjEyOCAoc3RhcnQsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICBzdGFydCArPSBieXRlc19yZWFkOwotCi0JICBmb3JtID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotCSAgaWYgKGF0dHJpYnV0ZSAhPSAwKQotCSAgICBhZGRfYWJicmV2X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSk7Ci0JfQotICAgICAgd2hpbGUgKGF0dHJpYnV0ZSAhPSAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19hYmJyZXYgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYmJyZXZfZW50cnkgKiBlbnRyeTsKLSAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLQotICBwcmludGYgKF8oIkNvbnRlbnRzIG9mIHRoZSAlcyBzZWN0aW9uOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzdGFydCA9IHByb2Nlc3NfYWJicmV2X3NlY3Rpb24gKHN0YXJ0LCBlbmQpOwotCi0gICAgICBwcmludGYgKF8oIiAgTnVtYmVyIFRBR1xuIikpOwotCi0gICAgICBmb3IgKGVudHJ5ID0gZmlyc3RfYWJicmV2OyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLQl7Ci0JICBhYmJyZXZfYXR0ciAqIGF0dHI7Ci0KLQkgIHByaW50ZiAoXygiICAgJWxkICAgICAgJXMgICAgWyVzXVxuIiksCi0JCSAgZW50cnktPmVudHJ5LAotCQkgIGdldF9UQUdfbmFtZSAoZW50cnktPnRhZyksCi0JCSAgZW50cnktPmNoaWxkcmVuID8gXygiaGFzIGNoaWxkcmVuIikgOiBfKCJubyBjaGlsZHJlbiIpKTsKLQotCSAgZm9yIChhdHRyID0gZW50cnktPmZpcnN0X2F0dHI7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCIgICAgJS0xOHMgJXNcbiIpLAotCQkgICAgICBnZXRfQVRfbmFtZSAoYXR0ci0+YXR0cmlidXRlKSwKLQkJICAgICAgZ2V0X0ZPUk1fbmFtZSAoYXR0ci0+Zm9ybSkpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgd2hpbGUgKHN0YXJ0KTsKLQotICBwcmludGYgKCJcbiIpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLWRpc3BsYXlfYmxvY2sgKGRhdGEsIGxlbmd0aCkKLSAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICBsZW5ndGg7Ci17Ci0gIHByaW50ZiAoXygiICVsdSBieXRlIGJsb2NrOiAiKSwgbGVuZ3RoKTsKLQotICB3aGlsZSAobGVuZ3RoIC0tKQotICAgIHByaW50ZiAoIiVseCAiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEgKyssIDEpKTsKLQotICByZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHZvaWQKLWRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uIChkYXRhLCBwb2ludGVyX3NpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICB1bnNpZ25lZCBpbnQgICAgcG9pbnRlcl9zaXplOwotewotICB1bnNpZ25lZCBjaGFyIG9wOwotICBpbnQgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0gIHVuc2lnbmVkIGxvbmcgdXZhbHVlOwotCi0gIG9wID0gKiBkYXRhICsrOwotCi0gIHN3aXRjaCAob3ApCi0gICAgewotICAgIGNhc2UgRFdfT1BfYWRkcjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2FkZHI6ICVseCIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgcG9pbnRlcl9zaXplKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2RlcmVmOgotICAgICAgcHJpbnRmICgiRFdfT1BfZGVyZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3QxdToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0MXU6ICVsdSIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDFzOgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3QxczogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0MnU6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDJ1OiAlbHUiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3QyczoKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0MnM6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDR1OgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3Q0dTogJWx1IiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0NHM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDRzOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q4dToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0OHU6ICVsdSAlbHUiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIDQpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q4czoKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0OHM6ICVsZCAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDQpLAotCSAgICAgIChsb25nKSBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3R1OgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3R1OiAlbHUiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdHM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdHM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2R1cDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2R1cCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kcm9wOgotICAgICAgcHJpbnRmICgiRFdfT1BfZHJvcCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9vdmVyOgotICAgICAgcHJpbnRmICgiRFdfT1Bfb3ZlciIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9waWNrOgotICAgICAgcHJpbnRmICgiRFdfT1BfcGljazogJWxkIiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3N3YXA6Ci0gICAgICBwcmludGYgKCJEV19PUF9zd2FwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JvdDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JvdCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF94ZGVyZWY6Ci0gICAgICBwcmludGYgKCJEV19PUF94ZGVyZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYWJzOgotICAgICAgcHJpbnRmICgiRFdfT1BfYWJzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2FuZDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2FuZCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kaXY6Ci0gICAgICBwcmludGYgKCJEV19PUF9kaXYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbWludXM6Ci0gICAgICBwcmludGYgKCJEV19PUF9taW51cyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9tb2Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9tb2QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbXVsOgotICAgICAgcHJpbnRmICgiRFdfT1BfbXVsIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX25lZzoKLSAgICAgIHByaW50ZiAoIkRXX09QX25lZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9ub3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9ub3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfb3I6Ci0gICAgICBwcmludGYgKCJEV19PUF9vciIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9wbHVzOgotICAgICAgcHJpbnRmICgiRFdfT1BfcGx1cyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9wbHVzX3Vjb25zdDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3BsdXNfdWNvbnN0OiAlbHUiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9zaGw6Ci0gICAgICBwcmludGYgKCJEV19PUF9zaGwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc2hyOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2hyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3NocmE6Ci0gICAgICBwcmludGYgKCJEV19PUF9zaHJhIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3hvcjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3hvciIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmE6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9lcToKLSAgICAgIHByaW50ZiAoIkRXX09QX2VxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2dlOgotICAgICAgcHJpbnRmICgiRFdfT1BfZ2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZ3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9ndCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9sZToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2x0OgotICAgICAgcHJpbnRmICgiRFdfT1BfbHQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbmU6Ci0gICAgICBwcmludGYgKCJEV19PUF9uZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9za2lwOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2tpcDogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDA6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDM6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDU6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDY6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDc6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDg6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDk6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQ5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDEwOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTE6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDEyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDEzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxNCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE2OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTc6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxNyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE5OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjA6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDIxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIyOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjM6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyMyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI1OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjY6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyNiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI4OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjgiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0Mjk6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyOSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQzMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDMwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDMxOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MzEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnNToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnODoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzgiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnOToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTA6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxMToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzExIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzEyOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTM6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxMyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE1OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTY6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxNiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE4OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTgiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTk6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxOSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzIwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzIxOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjI6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyMiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzIzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI0OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjU6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyNSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI3OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjg6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyOCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyOToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzMwOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMzAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWczMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcwOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWczOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc0OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc1OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc2OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc3OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc4OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnOToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWc5OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTA6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTA6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEyOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzEyOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTM6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE1OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE1OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTY6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTY6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE4OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE4OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTk6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTk6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzIxOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzIxOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjI6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjI6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyMzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI0OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI0OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjU6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjU6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyNjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI3OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI3OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjg6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjg6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyOToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyOTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzMwOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzMwOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMzE6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZ3g6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWd4OiAlbHUiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9mYnJlZzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2ZicmVnOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVneDoKLSAgICAgIHV2YWx1ZSA9IHJlYWRfbGViMTI4IChkYXRhLCAmYnl0ZXNfcmVhZCwgMCk7Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVneDogJWx1ICVsZCIsIHV2YWx1ZSwKLQkgICAgICByZWFkX2xlYjEyOCAoZGF0YSArIGJ5dGVzX3JlYWQsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGllY2U6Ci0gICAgICBwcmludGYgKCJEV19PUF9waWVjZTogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZGVyZWZfc2l6ZToKLSAgICAgIHByaW50ZiAoIkRXX09QX2RlcmVmX3NpemU6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF94ZGVyZWZfc2l6ZToKLSAgICAgIHByaW50ZiAoIkRXX09QX3hkZXJlZl9zaXplOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfbm9wOgotICAgICAgcHJpbnRmICgiRFdfT1Bfbm9wIik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAob3AgPj0gRFdfT1BfbG9fdXNlcgotCSAgJiYgb3AgPD0gRFdfT1BfaGlfdXNlcikKLQlwcmludGYgKF8oIihVc2VyIGRlZmluZWQgbG9jYXRpb24gb3ApIikpOwotICAgICAgZWxzZQotCXByaW50ZiAoXygiKFVua25vd24gbG9jYXRpb24gb3ApIikpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXJlYWRfYW5kX2Rpc3BsYXlfYXR0ciAoYXR0cmlidXRlLCBmb3JtLCBkYXRhLCBwb2ludGVyX3NpemUpCi0gICAgIHVuc2lnbmVkIGxvbmcgICBhdHRyaWJ1dGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICBmb3JtOwotICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyAgIHBvaW50ZXJfc2l6ZTsKLXsKLSAgdW5zaWduZWQgbG9uZyAgIHV2YWx1ZSA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKiBibG9ja19zdGFydCA9IE5VTEw7Ci0gIGludCAgICAgICAgICAgICBieXRlc19yZWFkOwotICBpbnQJCSAgaXNfcmVmID0gMDsKLQotICBwcmludGYgKCIgICAgICUtMThzOiIsIGdldF9BVF9uYW1lIChhdHRyaWJ1dGUpKTsKLQotICBzd2l0Y2ggKGZvcm0pCi0gICAgewotICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKLSAgICBjYXNlIERXX0ZPUk1fcmVmMToKLSAgICBjYXNlIERXX0ZPUk1fcmVmMjoKLSAgICBjYXNlIERXX0ZPUk1fcmVmNDoKLSAgICBjYXNlIERXX0ZPUk1fcmVmODoKLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgotICAgICAgaXNfcmVmID0gMTsKLSAgICB9Ci0KLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6Ci0gICAgY2FzZSBEV19GT1JNX2FkZHI6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgcG9pbnRlcl9zaXplKTsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JWx4PiIgOiAiICUjbHgiLCB1dmFsdWUpOwotICAgICAgZGF0YSArPSBwb2ludGVyX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWYxOgotICAgIGNhc2UgRFdfRk9STV9mbGFnOgotICAgIGNhc2UgRFdfRk9STV9kYXRhMToKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhICsrLCAxKTsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JWx4PiIgOiAiICVsZCIsIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWYyOgotICAgIGNhc2UgRFdfRk9STV9kYXRhMjoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCAyKTsKLSAgICAgIGRhdGEgKz0gMjsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JWx4PiIgOiAiICVsZCIsIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWY0OgotICAgIGNhc2UgRFdfRk9STV9kYXRhNDoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKLSAgICAgIGRhdGEgKz0gNDsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JWx4PiIgOiAiICVsZCIsIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWY4OgotICAgIGNhc2UgRFdfRk9STV9kYXRhODoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKLSAgICAgIHByaW50ZiAoIiAlbHgiLCB1dmFsdWUpOwotICAgICAgcHJpbnRmICgiICVseCIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsKLSAgICAgIGRhdGEgKz0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3N0cmluZzoKLSAgICAgIHByaW50ZiAoIiAlcyIsIGRhdGEpOwotICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3NkYXRhOgotICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMSk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKCIgJWxkIiwgKGxvbmcpIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6Ci0gICAgY2FzZSBEV19GT1JNX3VkYXRhOgotICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCVseD4iIDogIiAlbGQiLCB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6Ci0gICAgICB1dmFsdWUgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKTsKLSAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIGJ5dGVzX3JlYWQ7Ci0gICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7Ci0gICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDEpOwotICAgICAgYmxvY2tfc3RhcnQgPSBkYXRhICsgMTsKLSAgICAgIGRhdGEgPSBkaXNwbGF5X2Jsb2NrIChibG9ja19zdGFydCwgdXZhbHVlKTsKLSAgICAgIHV2YWx1ZSA9ICogYmxvY2tfc3RhcnQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0gICAgICBibG9ja19zdGFydCA9IGRhdGEgKyAyOwotICAgICAgZGF0YSA9IGRpc3BsYXlfYmxvY2sgKGJsb2NrX3N0YXJ0LCB1dmFsdWUpOwotICAgICAgdXZhbHVlID0gKiBibG9ja19zdGFydDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKLSAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIDQ7Ci0gICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7Ci0gICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fc3RycDoKLSAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6Ci0gICAgICB3YXJuIChfKCJVbmFibGUgdG8gaGFuZGxlIEZPUk06ICVkIiksIGZvcm0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgd2FybiAoXygiVW5yZWNvZ25pc2VkIGZvcm06ICVkIiksIGZvcm0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEZvciBzb21lIGF0dHJpYnV0ZXMgd2UgY2FuIGRpc3BsYXkgZnV0aGVyIGluZm9ybWF0aW9uLiAgKi8KLQotICBwcmludGYgKCJcdCIpOwotCi0gIHN3aXRjaCAoYXR0cmlidXRlKQotICAgIHsKLSAgICBjYXNlIERXX0FUX2lubGluZToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0lOTF9ub3RfaW5saW5lZDogICAgICAgICAgcHJpbnRmIChfKCIobm90IGlubGluZWQpIikpOyBicmVhazsKLQljYXNlIERXX0lOTF9pbmxpbmVkOiAgICAgICAgICAgICAgcHJpbnRmIChfKCIoaW5saW5lZCkiKSk7IGJyZWFrOwotCWNhc2UgRFdfSU5MX2RlY2xhcmVkX25vdF9pbmxpbmVkOiBwcmludGYgKF8oIihkZWNsYXJlZCBhcyBpbmxpbmUgYnV0IGlnbm9yZWQpIikpOyBicmVhazsKLQljYXNlIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkOiAgICAgcHJpbnRmIChfKCIoZGVjbGFyZWQgYXMgaW5saW5lIGFuZCBpbmxpbmVkKSIpKTsgYnJlYWs7Ci0JZGVmYXVsdDogcHJpbnRmIChfKCIgIChVbmtub3duIGlubGluZSBhdHRyaWJ1dGUgdmFsdWU6ICVseCkiKSwgdXZhbHVlKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2ZyYW1lX2Jhc2U6Ci0gICAgICBpZiAodXZhbHVlID49IERXX09QX3JlZzAgJiYgdXZhbHVlIDw9IERXX09QX3JlZzMxKQotCXByaW50ZiAoIihyZWcgJWxkKSIsIHV2YWx1ZSAtIERXX09QX3JlZzApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2xhbmd1YWdlOgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfTEFOR19DOiAgICAgICAgICAgICAgcHJpbnRmICgiKG5vbi1BTlNJIEMpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19DODk6ICAgICAgICAgICAgcHJpbnRmICgiKEFOU0kgQykiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0NfcGx1c19wbHVzOiAgICBwcmludGYgKCIoQysrKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfRm9ydHJhbjc3OiAgICAgIHByaW50ZiAoIihGT1JUUkFOIDc3KSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfRm9ydHJhbjkwOiAgICAgIHByaW50ZiAoIihGb3J0cmFuIDkwKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfTW9kdWxhMjogICAgICAgIHByaW50ZiAoIihNb2R1bGEgMikiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX1Bhc2NhbDgzOiAgICAgICBwcmludGYgKCIoQU5TSSBQYXNjYWwpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19BZGE4MzogICAgICAgICAgcHJpbnRmICgiKEFkYSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0NvYm9sNzQ6ICAgICAgICBwcmludGYgKCIoQ29ib2wgNzQpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19Db2JvbDg1OiAgICAgICAgcHJpbnRmICgiKENvYm9sIDg1KSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfTWlwc19Bc3NlbWJsZXI6IHByaW50ZiAoIihNSVBTIGFzc2VtYmxlcikiKTsgYnJlYWs7Ci0JZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIoVW5rbm93bjogJWx4KSIsIHV2YWx1ZSk7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9lbmNvZGluZzoKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0FURV92b2lkOiAgICAgICAgICAgIHByaW50ZiAoIih2b2lkKSIpOyBicmVhazsKLQljYXNlIERXX0FURV9hZGRyZXNzOiAgICAgICAgIHByaW50ZiAoIihtYWNoaW5lIGFkZHJlc3MpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2Jvb2xlYW46ICAgICAgICAgcHJpbnRmICgiKGJvb2xlYW4pIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2NvbXBsZXhfZmxvYXQ6ICAgcHJpbnRmICgiKGNvbXBsZXggZmxvYXQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2Zsb2F0OiAgICAgICAgICAgcHJpbnRmICgiKGZsb2F0KSIpOyBicmVhazsKLQljYXNlIERXX0FURV9zaWduZWQ6ICAgICAgICAgIHByaW50ZiAoIihzaWduZWQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX3NpZ25lZF9jaGFyOiAgICAgcHJpbnRmICgiKHNpZ25lZCBjaGFyKSIpOyBicmVhazsKLQljYXNlIERXX0FURV91bnNpZ25lZDogICAgICAgIHByaW50ZiAoIih1bnNpZ25lZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfdW5zaWduZWRfY2hhcjogICBwcmludGYgKCIodW5zaWduZWQgY2hhcikiKTsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmICh1dmFsdWUgPj0gRFdfQVRFX2xvX3VzZXIKLQkgICAgICAmJiB1dmFsdWUgPD0gRFdfQVRFX2hpX3VzZXIpCi0JICAgIHByaW50ZiAoIih1c2VyIGRlZmluZWQgdHlwZSkiKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiKHVua25vd24gdHlwZSkiKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9hY2Nlc3NpYmlsaXR5OgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfQUNDRVNTX3B1YmxpYzoJCXByaW50ZiAoIihwdWJsaWMpIik7IGJyZWFrOwotCWNhc2UgRFdfQUNDRVNTX3Byb3RlY3RlZDoJcHJpbnRmICgiKHByb3RlY3RlZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BQ0NFU1NfcHJpdmF0ZToJCXByaW50ZiAoIihwcml2YXRlKSIpOyBicmVhazsKLQlkZWZhdWx0OgkJICAgICAgICBwcmludGYgKCIodW5rbm93biBhY2Nlc3NpYmlsaXR5KSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfdmlzaWJpbGl0eToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX1ZJU19sb2NhbDoJcHJpbnRmICgiKGxvY2FsKSIpOyBicmVhazsKLQljYXNlIERXX1ZJU19leHBvcnRlZDoJcHJpbnRmICgiKGV4cG9ydGVkKSIpOyBicmVhazsKLQljYXNlIERXX1ZJU19xdWFsaWZpZWQ6CXByaW50ZiAoIihxdWFsaWZpZWQpIik7IGJyZWFrOwotCWRlZmF1bHQ6CQlwcmludGYgKCIodW5rbm93biB2aXNpYmlsaXR5KSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfdmlydHVhbGl0eToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX1ZJUlRVQUxJVFlfbm9uZToJcHJpbnRmICgiKG5vbmUpIik7IGJyZWFrOwotCWNhc2UgRFdfVklSVFVBTElUWV92aXJ0dWFsOglwcmludGYgKCIodmlydHVhbCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19WSVJUVUFMSVRZX3B1cmVfdmlydHVhbDpwcmludGYgKCIocHVyZV92aXJ0dWFsKSIpOyBicmVhazsKLQlkZWZhdWx0OgkJICAgICAgICBwcmludGYgKCIodW5rbm93biB2aXJ0dWFsaXR5KSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfSURfY2FzZV9zZW5zaXRpdmU6CXByaW50ZiAoIihjYXNlX3NlbnNpdGl2ZSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19JRF91cF9jYXNlOgkJcHJpbnRmICgiKHVwX2Nhc2UpIik7IGJyZWFrOwotCWNhc2UgRFdfSURfZG93bl9jYXNlOgkJcHJpbnRmICgiKGRvd25fY2FzZSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19JRF9jYXNlX2luc2Vuc2l0aXZlOglwcmludGYgKCIoY2FzZV9pbnNlbnNpdGl2ZSkiKTsgYnJlYWs7Ci0JZGVmYXVsdDoJCSAgICAgICAgcHJpbnRmICgiKHVua25vd24gY2FzZSkiKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2NhbGxpbmdfY29udmVudGlvbjoKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0NDX25vcm1hbDoJcHJpbnRmICgiKG5vcm1hbCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19DQ19wcm9ncmFtOglwcmludGYgKCIocHJvZ3JhbSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19DQ19ub2NhbGw6CXByaW50ZiAoIihub2NhbGwpIik7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAodXZhbHVlID49IERXX0NDX2xvX3VzZXIKLQkgICAgICAmJiB1dmFsdWUgPD0gRFdfQ0NfaGlfdXNlcikKLQkgICAgcHJpbnRmICgiKHVzZXIgZGVmaW5lZCkiKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiKHVua25vd24gY29udmVudGlvbikiKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfbG9jYXRpb246Ci0gICAgY2FzZSBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbjoKLSAgICBjYXNlIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uOgotICAgICAgcHJpbnRmICgiKCIpOwotICAgICAgZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24gKGJsb2NrX3N0YXJ0LCBwb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmICgiKSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0gIHJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X2RlYnVnX2luZm8gKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLSAgdW5zaWduZWQgY2hhciAqIHNlY3Rpb25fYmVnaW4gPSBzdGFydDsKLQotICBwcmludGYgKF8oIlRoZSBzZWN0aW9uICVzIGNvbnRhaW5zOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIERXQVJGMl9FeHRlcm5hbF9Db21wVW5pdCAqIGV4dGVybmFsOwotICAgICAgRFdBUkYyX0ludGVybmFsX0NvbXBVbml0ICAgY29tcHVuaXQ7Ci0gICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICB0YWdzOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICAgIGludAkJCSBsZXZlbDsKLQotICAgICAgZXh0ZXJuYWwgPSAoRFdBUkYyX0V4dGVybmFsX0NvbXBVbml0ICopIHN0YXJ0OwotCi0gICAgICBjb21wdW5pdC5jdV9sZW5ndGggICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9sZW5ndGgpOwotICAgICAgY29tcHVuaXQuY3VfdmVyc2lvbiAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfdmVyc2lvbik7Ci0gICAgICBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0ID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9hYmJyZXZfb2Zmc2V0KTsKLSAgICAgIGNvbXB1bml0LmN1X3BvaW50ZXJfc2l6ZSAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmN1X3BvaW50ZXJfc2l6ZSk7Ci0KLSAgICAgIHRhZ3MgPSBzdGFydCArIHNpemVvZiAoKiBleHRlcm5hbCk7Ci0gICAgICBzdGFydCArPSBjb21wdW5pdC5jdV9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5jdV9sZW5ndGgpOwotCi0gICAgICBpZiAoY29tcHVuaXQuY3VfdmVyc2lvbiAhPSAyKQotCXsKLQkgIHdhcm4gKF8oIk9ubHkgdmVyc2lvbiAyIERXQVJGIGRlYnVnIGluZm9ybWF0aW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiICBDb21waWxhdGlvbiBVbml0OlxuIikpOwotICAgICAgcHJpbnRmIChfKCIgICBMZW5ndGg6ICAgICAgICAlbGRcbiIpLCBjb21wdW5pdC5jdV9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgICBWZXJzaW9uOiAgICAgICAlZFxuIiksIGNvbXB1bml0LmN1X3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCIgICBBYmJyZXYgT2Zmc2V0OiAlbGRcbiIpLCBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0KTsKLSAgICAgIHByaW50ZiAoXygiICAgUG9pbnRlciBTaXplOiAgJWRcbiIpLCBjb21wdW5pdC5jdV9wb2ludGVyX3NpemUpOwotCi0gICAgICBpZiAoZmlyc3RfYWJicmV2ICE9IE5VTEwpCi0JZnJlZV9hYmJyZXZzICgpOwotCi0gICAgICAvKiBSZWFkIGluIHRoZSBhYmJyZXZzIHVzZWQgYnkgdGhpcyBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotICAgICAgewotCUVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWM7Ci0JdW5zaWduZWQgY2hhciAqICAgICAgIGJlZ2luOwotCi0JLyogTG9jYXRlIHRoZSAuZGVidWdfYWJicmV2IHNlY3Rpb24gYW5kIHByb2Nlc3MgaXQuICAqLwotCWZvciAoaSA9IDAsIHNlYyA9IHNlY3Rpb25faGVhZGVyczsKLQkgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0JICAgICBpICsrLCBzZWMgKyspCi0JICBpZiAoc3RyY21wIChTRUNUSU9OX05BTUUgKHNlYyksICIuZGVidWdfYWJicmV2IikgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQlpZiAoaSA9PSAtMSB8fCBzZWMtPnNoX3NpemUgPT0gMCkKLQkgIHsKLQkgICAgd2FybiAoXygiVW5hYmxlIHRvIGxvY2F0ZSAuZGVidWdfYWJicmV2IHNlY3Rpb24hXG4iKSk7Ci0JICAgIHJldHVybiAwOwotCSAgfQotCi0JR0VUX0RBVEFfQUxMT0MgKHNlYy0+c2hfb2Zmc2V0LCBzZWMtPnNoX3NpemUsIGJlZ2luLCB1bnNpZ25lZCBjaGFyICosCi0JCQkiZGVidWdfYWJicmV2IHNlY3Rpb24gZGF0YSIpOwotCi0JcHJvY2Vzc19hYmJyZXZfc2VjdGlvbiAoYmVnaW4gKyBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0LAotCQkJCWJlZ2luICsgc2VjLT5zaF9zaXplKTsKLQotCWZyZWUgKGJlZ2luKTsKLSAgICAgIH0KLQotICAgICAgbGV2ZWwgPSAwOwotICAgICAgd2hpbGUgKHRhZ3MgPCBzdGFydCkKLQl7Ci0JICBpbnQgICAgICAgICAgICBieXRlc19yZWFkOwotCSAgdW5zaWduZWQgbG9uZyAgYWJicmV2X251bWJlcjsKLQkgIGFiYnJldl9lbnRyeSAqIGVudHJ5OwotCSAgYWJicmV2X2F0dHIgICogYXR0cjsKLQotCSAgYWJicmV2X251bWJlciA9IHJlYWRfbGViMTI4ICh0YWdzLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgdGFncyArPSBieXRlc19yZWFkOwotCi0JICAvKiBBIG51bGwgRElFIG1hcmtzIHRoZSBlbmQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuLiAgKi8KLQkgIGlmIChhYmJyZXZfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICAtLWxldmVsOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFNjYW4gdGhyb3VnaCB0aGUgYWJicmV2aWF0aW9uIGxpc3QgdW50aWwgd2UgcmVhY2ggdGhlCi0JICAgICBjb3JyZWN0IGVudHJ5LiAgKi8KLQkgIGZvciAoZW50cnkgPSBmaXJzdF9hYmJyZXY7Ci0JICAgICAgIGVudHJ5ICYmIGVudHJ5LT5lbnRyeSAhPSBhYmJyZXZfbnVtYmVyOwotCSAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0KQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGVudHJ5ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICB3YXJuIChfKCJVbmFibGUgdG8gbG9jYXRlIGVudHJ5ICVsdSBpbiB0aGUgYWJicmV2aWF0aW9uIHRhYmxlXG4iKSwKLQkJICAgIGFiYnJldl9udW1iZXIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoXygiIDwlZD48JXg+OiBBYmJyZXYgTnVtYmVyOiAlbHUgKCVzKVxuIiksCi0JCSAgbGV2ZWwsIHRhZ3MgLSBzZWN0aW9uX2JlZ2luIC0gYnl0ZXNfcmVhZCwKLQkJICBhYmJyZXZfbnVtYmVyLAotCQkgIGdldF9UQUdfbmFtZSAoZW50cnktPnRhZykpOwotCi0JICBmb3IgKGF0dHIgPSBlbnRyeS0+Zmlyc3RfYXR0cjsgYXR0cjsgYXR0ciA9IGF0dHItPm5leHQpCi0JICAgIHRhZ3MgPSByZWFkX2FuZF9kaXNwbGF5X2F0dHIgKGF0dHItPmF0dHJpYnV0ZSwKLQkJCQkJICBhdHRyLT5mb3JtLAotCQkJCQkgIHRhZ3MsCi0JCQkJCSAgY29tcHVuaXQuY3VfcG9pbnRlcl9zaXplKTsKLQotCSAgaWYgKGVudHJ5LT5jaGlsZHJlbikKLQkgICAgKytsZXZlbDsKLQl9Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfYXJhbmdlcyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKiBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJUaGUgc2VjdGlvbiAlcyBjb250YWluczpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIHdoaWxlIChzdGFydCA8IGVuZCkKLSAgICB7Ci0gICAgICBEV0FSRjJfRXh0ZXJuYWxfQVJhbmdlICogZXh0ZXJuYWw7Ci0gICAgICBEV0FSRjJfSW50ZXJuYWxfQVJhbmdlICAgYXJhbmdlOwotICAgICAgdW5zaWduZWQgY2hhciAqICAgICAgICAgIHJhbmdlczsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBsZW5ndGg7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgYWRkcmVzczsKLSAgICAgIGludAkJICAgICAgIGV4Y2VzczsKLQotICAgICAgZXh0ZXJuYWwgPSAoRFdBUkYyX0V4dGVybmFsX0FSYW5nZSAqKSBzdGFydDsKLQotICAgICAgYXJhbmdlLmFyX2xlbmd0aCAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfbGVuZ3RoKTsKLSAgICAgIGFyYW5nZS5hcl92ZXJzaW9uICAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmFyX3ZlcnNpb24pOwotICAgICAgYXJhbmdlLmFyX2luZm9fb2Zmc2V0ICA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfaW5mb19vZmZzZXQpOwotICAgICAgYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfcG9pbnRlcl9zaXplKTsKLSAgICAgIGFyYW5nZS5hcl9zZWdtZW50X3NpemUgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmFyX3NlZ21lbnRfc2l6ZSk7Ci0KLSAgICAgIHByaW50ZiAoXygiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICVsZFxuIiksIGFyYW5nZS5hcl9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgJWRcbiIpLCBhcmFuZ2UuYXJfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgT2Zmc2V0IGludG8gLmRlYnVnX2luZm86ICAlbHhcbiIpLCBhcmFuZ2UuYXJfaW5mb19vZmZzZXQpOwotICAgICAgcHJpbnRmIChfKCIgIFBvaW50ZXIgU2l6ZTogICAgICAgICAgICAgJWRcbiIpLCBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplKTsKLSAgICAgIHByaW50ZiAoXygiICBTZWdtZW50IFNpemU6ICAgICAgICAgICAgICVkXG4iKSwgYXJhbmdlLmFyX3NlZ21lbnRfc2l6ZSk7Ci0KLSAgICAgIHByaW50ZiAoXygiXG4gICAgQWRkcmVzcyAgTGVuZ3RoXG4iKSk7Ci0KLSAgICAgIHJhbmdlcyA9IHN0YXJ0ICsgc2l6ZW9mICgqIGV4dGVybmFsKTsKLQotICAgICAgLyogTXVzdCBwYWQgdG8gYW4gYWxpZ25tZW50IGJvdW5kYXJ5IHRoYXQgaXMgdHdpY2UgdGhlIHBvaW50ZXIgc2l6ZS4gICovCi0gICAgICBleGNlc3MgPSBzaXplb2YgKCpleHRlcm5hbCkgJSAoMiAqIGFyYW5nZS5hcl9wb2ludGVyX3NpemUpOwotICAgICAgaWYgKGV4Y2VzcykKLQlyYW5nZXMgKz0gKDIgKiBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplKSAtIGV4Y2VzczsKLQotICAgICAgZm9yICg7OykKLQl7Ci0JICBhZGRyZXNzID0gYnl0ZV9nZXQgKHJhbmdlcywgYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSk7Ci0KLQkgIHJhbmdlcyArPSBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplOwotCi0JICBsZW5ndGggID0gYnl0ZV9nZXQgKHJhbmdlcywgYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSk7Ci0KLQkgIHJhbmdlcyArPSBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplOwotCi0JICAvKiBBIHBhaXIgb2YgemVyb3MgbWFya3MgdGhlIGVuZCBvZiB0aGUgbGlzdC4gICovCi0JICBpZiAoYWRkcmVzcyA9PSAwICYmIGxlbmd0aCA9PSAwKQotCSAgICBicmVhazsKLQotCSAgcHJpbnRmICgiICAgICU4LjhseCAlbHVcbiIsIGFkZHJlc3MsIGxlbmd0aCk7Ci0JfQotCi0gICAgICBzdGFydCArPSBhcmFuZ2UuYXJfbGVuZ3RoICsgc2l6ZW9mIChleHRlcm5hbC0+YXJfbGVuZ3RoKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgiXG4iKTsKLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHByaW50ZiAoXygiRGlzcGxheWluZyB0aGUgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlcyBpcyBub3QgeWV0IHN1cHBvcnRlZC5cbiIpLAotCSAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogUHJlLXNjYW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gdG8gcmVjb3JkIHRoZSBzaXplIG9mIGFkZHJlc3MuCi0gICBXaGVuIGR1bXBpbmcgdGhlIC5kZWJ1Z19saW5lLCB3ZSB1c2UgdGhhdCBzaXplIGluZm9ybWF0aW9uLCBhc3N1bWluZwotICAgdGhhdCBhbGwgY29tcGlsYXRpb24gdW5pdHMgaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIHNpemUuICAqLwotc3RhdGljIGludAotcHJlc2Nhbl9kZWJ1Z19pbmZvIChzZWN0aW9uLCBzdGFydCwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBEV0FSRjJfRXh0ZXJuYWxfQ29tcFVuaXQgKiBleHRlcm5hbDsKLQotICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfQ29tcFVuaXQgKikgc3RhcnQ7Ci0KLSAgZGVidWdfbGluZV9wb2ludGVyX3NpemUgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmN1X3BvaW50ZXJfc2l6ZSk7Ci0gIHJldHVybiAwOwotfQotCi0gIC8qIEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSBkZWJ1ZyBzZWN0aW9uIGFuZCBhIHBvaW50ZXIKLSAgICAgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBkZWNvZGUgaXQuICBUaGUgdGhpcmQgZmllbGQgaXMgYSBwcmVzY2FuCi0gICAgIGZ1bmN0aW9uIHRvIGJlIHJ1biBvdmVyIHRoZSBzZWN0aW9uIGJlZm9yZSBkaXNwbGF5aW5nIGFueSBvZiB0aGUKLSAgICAgc2VjdGlvbnMuICAqLwotc3RydWN0Ci17Ci0gIGNoYXIgKiBuYW1lOwotICBpbnQgKCogZGlzcGxheSkgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotICBpbnQgKCogcHJlc2NhbikgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotfQotZGVidWdfZGlzcGxheXNbXSA9Ci17Ci0gIHsgIi5kZWJ1Z19pbmZvIiwgICAgICAgIGRpc3BsYXlfZGVidWdfaW5mbywgcHJlc2Nhbl9kZWJ1Z19pbmZvIH0sCi0gIHsgIi5kZWJ1Z19hYmJyZXYiLCAgICAgIGRpc3BsYXlfZGVidWdfYWJicmV2LCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z19saW5lIiwgICAgICAgIGRpc3BsYXlfZGVidWdfbGluZXMsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX2FyYW5nZXMiLCAgICAgZGlzcGxheV9kZWJ1Z19hcmFuZ2VzLCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z19wdWJuYW1lcyIsICAgIGRpc3BsYXlfZGVidWdfcHVibmFtZXMsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX21hY2luZm8iLCAgICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkLCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z19mcmFtZSIsICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCwgTlVMTCB9LAotICB7ICIuZGVidWdfc3RyIiwgICAgICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX3N0YXRpY19mdW5jIiwgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkLCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z19zdGF0aWNfdmFycyIsIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCwgTlVMTCB9LAotICB7ICIuZGVidWdfdHlwZXMiLCAgICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX3dlYWtuYW1lcyIsICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIEZJTEUgKiBmaWxlOwotewotICBjaGFyICogICAgICAgICAgbmFtZSA9IFNFQ1RJT05fTkFNRSAoc2VjdGlvbik7Ci0gIGJmZF9zaXplX3R5cGUgICBsZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgKiBzdGFydDsKLSAgaW50ICAgICAgICAgICAgIGk7Ci0KLSAgbGVuZ3RoID0gc2VjdGlvbi0+c2hfc2l6ZTsKLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5TZWN0aW9uICclcycgaGFzIG5vIGRlYnVnZ2luZyBkYXRhLlxuIiksIG5hbWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIGxlbmd0aCwgc3RhcnQsIHVuc2lnbmVkIGNoYXIgKiwKLQkJICAiZGVidWcgc2VjdGlvbiBkYXRhIik7Ci0KLSAgLyogU2VlIGlmIHdlIGtub3cgaG93IHRvIGRpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbi4gICovCi0gIGZvciAoaSA9IE5VTV9FTEVNIChkZWJ1Z19kaXNwbGF5cyk7IGktLTspCi0gICAgaWYgKHN0cmNtcCAoZGVidWdfZGlzcGxheXNbaV0ubmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIHsKLQlkZWJ1Z19kaXNwbGF5c1tpXS5kaXNwbGF5IChzZWN0aW9uLCBzdGFydCwgZmlsZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgaWYgKGkgPT0gLTEpCi0gICAgcHJpbnRmIChfKCJVbnJlY29nbmlzZWQgZGVidWcgc2VjdGlvbjogJXNcbiIpLCBuYW1lKTsKLQotICBmcmVlIChzdGFydCk7Ci0KLSAgLyogSWYgd2UgbG9hZGVkIGluIHRoZSBhYmJyZXYgc2VjdGlvbiBhdCBzb21lIHBvaW50LAotICAgICB3ZSBtdXN0IHJlbGVhc2UgaXQgaGVyZS4gICovCi0gIGlmIChmaXJzdF9hYmJyZXYgIT0gTlVMTCkKLSAgICBmcmVlX2FiYnJldnMgKCk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgIAlpOwotCi0gIGlmICghIGRvX2R1bXApCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogUHJlLXNjYW4gdGhlIGRlYnVnIHNlY3Rpb25zIHRvIGZpbmQgc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbiBub3QKLSAgICAgcHJlc2VudCBpbiBzb21lIG9mIHRoZW0uICBGb3IgdGhlIC5kZWJ1Z19saW5lLCB3ZSBtdXN0IGZpbmQgb3V0IHRoZQotICAgICBzaXplIG9mIGFkZHJlc3MgKHNwZWNpZmllZCBpbiAuZGVidWdfaW5mbyBhbmQgLmRlYnVnX2FyYW5nZXMpLiAgKi8KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtICYmIGkgPCBudW1fZHVtcF9zZWN0czsKLSAgICAgICBpICsrLCBzZWN0aW9uICsrKQotICAgIHsKLSAgICAgIGNoYXIgKgluYW1lID0gU0VDVElPTl9OQU1FIChzZWN0aW9uKTsKLSAgICAgIGludCAgICAgICBqOwotCi0gICAgICBpZiAoc2VjdGlvbi0+c2hfc2l6ZSA9PSAwKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIHNvbWUgcHJlLXNjYW4gb3BlcmF0aW9uIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZm9yIChqID0gTlVNX0VMRU0gKGRlYnVnX2Rpc3BsYXlzKTsgai0tOykKLSAgICAgICAgaWYgKHN0cmNtcCAoZGVidWdfZGlzcGxheXNbal0ubmFtZSwgbmFtZSkgPT0gMCkKLQkgIHsKLQkgICAgaWYgKGRlYnVnX2Rpc3BsYXlzW2pdLnByZXNjYW4gIT0gTlVMTCkKLQkgICAgICB7Ci0JCWJmZF9zaXplX3R5cGUgICBsZW5ndGg7Ci0JCXVuc2lnbmVkIGNoYXIgKiBzdGFydDsKLQotCQlsZW5ndGggPSBzZWN0aW9uLT5zaF9zaXplOwotCQlHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBsZW5ndGgsIHN0YXJ0LCB1bnNpZ25lZCBjaGFyICosCi0JCQkJImRlYnVnIHNlY3Rpb24gZGF0YSIpOwotCi0JCWRlYnVnX2Rpc3BsYXlzW2pdLnByZXNjYW4gKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKTsKLQkJZnJlZSAoc3RhcnQpOwotCSAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgIH0KLQotICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW0gJiYgaSA8IG51bV9kdW1wX3NlY3RzOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLSAgICAgIGlmIChkdW1wX3NlY3RzW2ldICYgRElTQVNTX0RVTVApCi0JZGlzYXNzZW1ibGVfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSk7Ci0jZW5kaWYKLSAgICAgIGlmIChkdW1wX3NlY3RzW2ldICYgSEVYX0RVTVApCi0JZHVtcF9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKTsKLQotICAgICAgaWYgKGR1bXBfc2VjdHNbaV0gJiBERUJVR19EVU1QKQotCWRpc3BsYXlfZGVidWdfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSk7Ci0gICAgfQotCi0gIGlmIChpIDwgbnVtX2R1bXBfc2VjdHMpCi0gICAgd2FybiAoXygiU29tZSBzZWN0aW9ucyB3ZXJlIG5vdCBkdW1wZWQgYmVjYXVzZSB0aGV5IGRvIG5vdCBleGlzdCFcbiIpKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfbWlwc19mcGVfZXhjZXB0aW9uIChtYXNrKQotICAgICBpbnQgbWFzazsKLXsKLSAgaWYgKG1hc2spCi0gICAgewotICAgICAgaW50IGZpcnN0ID0gMTsKLSAgICAgIGlmIChtYXNrICYgT0VYX0ZQVV9JTkVYKQotCWZwdXRzICgiSU5FWCIsIHN0ZG91dCksIGZpcnN0ID0gMDsKLSAgICAgIGlmIChtYXNrICYgT0VYX0ZQVV9VRkxPKQotCXByaW50ZiAoIiVzVUZMTyIsIGZpcnN0ID8gIiIgOiAifCIpLCBmaXJzdCA9IDA7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfT0ZMTykKLQlwcmludGYgKCIlc09GTE8iLCBmaXJzdCA/ICIiIDogInwiKSwgZmlyc3QgPSAwOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX0RJVjApCi0JcHJpbnRmICgiJXNESVYwIiwgZmlyc3QgPyAiIiA6ICJ8IiksIGZpcnN0ID0gMDsKLSAgICAgIGlmIChtYXNrICYgT0VYX0ZQVV9JTlZBTCkKLQlwcmludGYgKCIlc0lOVkFMIiwgZmlyc3QgPyAiIiA6ICJ8Iik7Ci0gICAgfQotICBlbHNlCi0gICAgZnB1dHMgKCIwIiwgc3Rkb3V0KTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19taXBzX3NwZWNpZmljIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmX0ludGVybmFsX0R5biAqIGVudHJ5OwotICBzaXplX3QgbGlibGlzdF9vZmZzZXQgPSAwOwotICBzaXplX3QgbGlibGlzdG5vID0gMDsKLSAgc2l6ZV90IGNvbmZsaWN0c25vID0gMDsKLSAgc2l6ZV90IG9wdGlvbnNfb2Zmc2V0ID0gMDsKLSAgc2l6ZV90IGNvbmZsaWN0c19vZmZzZXQgPSAwOwotCi0gIC8qIFdlIGhhdmUgYSBsb3Qgb2Ygc3BlY2lhbCBzZWN0aW9ucy4gIFRoYW5rcyBTR0khICAqLwotICBpZiAoZHluYW1pY19zZWdtZW50ID09IE5VTEwpCi0gICAgLyogTm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlLiAgKi8KLSAgICByZXR1cm4gMDsKLQotICBmb3IgKGVudHJ5ID0gZHluYW1pY19zZWdtZW50OyBlbnRyeS0+ZF90YWcgIT0gRFRfTlVMTDsgKytlbnRyeSkKLSAgICBzd2l0Y2ggKGVudHJ5LT5kX3RhZykKLSAgICAgIHsKLSAgICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUOgotCWxpYmxpc3Rfb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQlicmVhazsKLSAgICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUTk86Ci0JbGlibGlzdG5vID0gZW50cnktPmRfdW4uZF92YWw7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERUX01JUFNfT1BUSU9OUzoKLQlvcHRpb25zX29mZnNldCA9IGVudHJ5LT5kX3VuLmRfdmFsIC0gbG9hZGFkZHI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1Q6Ci0JY29uZmxpY3RzX29mZnNldCA9IGVudHJ5LT5kX3VuLmRfdmFsIC0gbG9hZGFkZHI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKLQljb25mbGljdHNubyA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLQotICBpZiAobGlibGlzdF9vZmZzZXQgIT0gMCAmJiBsaWJsaXN0bm8gIT0gMCAmJiBkb19keW5hbWljKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0xpYiAqIGVsaWI7Ci0gICAgICBzaXplX3QgY250OwotCi0gICAgICBHRVRfREFUQV9BTExPQyAobGlibGlzdF9vZmZzZXQsIGxpYmxpc3RubyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfTGliKSwKLQkJICAgICAgZWxpYiwgRWxmMzJfRXh0ZXJuYWxfTGliICosICJsaWJsaXN0Iik7Ci0KLSAgICAgIHByaW50ZiAoIlxuU2VjdGlvbiAnLmxpYmxpc3QnIGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIiwKLQkgICAgICAodW5zaWduZWQgbG9uZykgbGlibGlzdG5vKTsKLSAgICAgIGZwdXRzICgiICAgICBMaWJyYXJ5ICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtICAgVmVyc2lvbiBGbGFnc1xuIiwKLQkgICAgIHN0ZG91dCk7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgbGlibGlzdG5vOyArK2NudCkKLQl7Ci0JICBFbGYzMl9MaWIgbGlibGlzdDsKLQkgIHRpbWVfdCB0aW1lOwotCSAgY2hhciB0aW1lYnVmWzIwXTsKLQotCSAgbGlibGlzdC5sX25hbWUgPSBCWVRFX0dFVCAoZWxpYltjbnRdLmxfbmFtZSk7Ci0JICB0aW1lID0gQllURV9HRVQgKGVsaWJbY250XS5sX3RpbWVfc3RhbXApOwotCSAgbGlibGlzdC5sX2NoZWNrc3VtID0gQllURV9HRVQgKGVsaWJbY250XS5sX2NoZWNrc3VtKTsKLQkgIGxpYmxpc3QubF92ZXJzaW9uID0gQllURV9HRVQgKGVsaWJbY250XS5sX3ZlcnNpb24pOwotCSAgbGlibGlzdC5sX2ZsYWdzID0gQllURV9HRVQgKGVsaWJbY250XS5sX2ZsYWdzKTsKLQotCSAgc3RyZnRpbWUgKHRpbWVidWYsIDIwLCAiJVktJW0tJWRUJUg6JU06JVMiLCBnbXRpbWUgKCZ0aW1lKSk7Ci0KLQkgIHByaW50ZiAoIiUzbHU6ICUtMjBzICVzICUjMTBseCAlLTdsZCIsICh1bnNpZ25lZCBsb25nKSBjbnQsCi0JCSAgZHluYW1pY19zdHJpbmdzICsgbGlibGlzdC5sX25hbWUsIHRpbWVidWYsCi0JCSAgbGlibGlzdC5sX2NoZWNrc3VtLCBsaWJsaXN0LmxfdmVyc2lvbik7Ci0KLQkgIGlmIChsaWJsaXN0LmxfZmxhZ3MgPT0gMCkKLQkgICAgcHV0cyAoIiBOT05FIik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0Ci0JICAgICAgewotCQljb25zdCBjaGFyICogbmFtZTsKLQkJaW50IGJpdDsKLQkgICAgICB9Ci0JICAgICAgbF9mbGFnc192YWxzW10gPQotCSAgICAgIHsKLQkJeyAiIEVYQUNUX01BVENIIiwgTExfRVhBQ1RfTUFUQ0ggfSwKLQkJeyAiIElHTk9SRV9JTlRfVkVSIiwgTExfSUdOT1JFX0lOVF9WRVIgfSwKLQkJeyAiIFJFUVVJUkVfTUlOT1IiLCBMTF9SRVFVSVJFX01JTk9SIH0sCi0JCXsgIiBFWFBPUlRTIiwgTExfRVhQT1JUUyB9LAotCQl7ICIgREVMQVlfTE9BRCIsIExMX0RFTEFZX0xPQUQgfSwKLQkJeyAiIERFTFRBIiwgTExfREVMVEEgfQotCSAgICAgIH07Ci0JICAgICAgaW50IGZsYWdzID0gbGlibGlzdC5sX2ZsYWdzOwotCSAgICAgIHNpemVfdCBmY250OwotCi0JICAgICAgZm9yIChmY250ID0gMDsKLQkJICAgZmNudCA8IHNpemVvZiAobF9mbGFnc192YWxzKSAvIHNpemVvZiAobF9mbGFnc192YWxzWzBdKTsKLQkJICAgKytmY250KQotCQlpZiAoKGZsYWdzICYgbF9mbGFnc192YWxzW2ZjbnRdLmJpdCkgIT0gMCkKLQkJICB7Ci0JCSAgICBmcHV0cyAobF9mbGFnc192YWxzW2ZjbnRdLm5hbWUsIHN0ZG91dCk7Ci0JCSAgICBmbGFncyBePSBsX2ZsYWdzX3ZhbHNbZmNudF0uYml0OwotCQkgIH0KLQkgICAgICBpZiAoZmxhZ3MgIT0gMCkKLQkJcHJpbnRmICgiICUjeCIsICh1bnNpZ25lZCBpbnQpIGZsYWdzKTsKLQotCSAgICAgIHB1dHMgKCIiKTsKLQkgICAgfQotCX0KLQotICAgICAgZnJlZSAoZWxpYik7Ci0gICAgfQotCi0gIGlmIChvcHRpb25zX29mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICogZW9wdDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICogICAgc2VjdCA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICogaW9wdDsKLSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICogb3B0aW9uOwotICAgICAgc2l6ZV90IG9mZnNldDsKLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHNlY3Rpb24gaGVhZGVyIHNvIHRoYXQgd2UgZ2V0IHRoZSBzaXplLiAgKi8KLSAgICAgIHdoaWxlIChzZWN0LT5zaF90eXBlICE9IFNIVF9NSVBTX09QVElPTlMpCi0JKysgc2VjdDsKLQotICAgICAgR0VUX0RBVEFfQUxMT0MgKG9wdGlvbnNfb2Zmc2V0LCBzZWN0LT5zaF9zaXplLCBlb3B0LAotCQkgICAgICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqLCAib3B0aW9ucyIpOwotCi0gICAgICBpb3B0ID0gKEVsZl9JbnRlcm5hbF9PcHRpb25zICopIG1hbGxvYyAoKHNlY3QtPnNoX3NpemUgLyBzaXplb2YgKGVvcHQpKQotCQkJCQkgICAgICAqIHNpemVvZiAoKmlvcHQpKTsKLSAgICAgIGlmIChpb3B0ID09IE5VTEwpCi0JewotCSAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnkiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIG9mZnNldCA9IGNudCA9IDA7Ci0gICAgICBvcHRpb24gPSBpb3B0OwotICAgICAgCi0gICAgICB3aGlsZSAob2Zmc2V0IDwgc2VjdC0+c2hfc2l6ZSkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqIGVvcHRpb247Ci0KLQkgIGVvcHRpb24gPSAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgKChjaGFyICopIGVvcHQgKyBvZmZzZXQpOwotCi0JICBvcHRpb24tPmtpbmQgPSBCWVRFX0dFVCAoZW9wdGlvbi0+a2luZCk7Ci0JICBvcHRpb24tPnNpemUgPSBCWVRFX0dFVCAoZW9wdGlvbi0+c2l6ZSk7Ci0JICBvcHRpb24tPnNlY3Rpb24gPSBCWVRFX0dFVCAoZW9wdGlvbi0+c2VjdGlvbik7Ci0JICBvcHRpb24tPmluZm8gPSBCWVRFX0dFVCAoZW9wdGlvbi0+aW5mbyk7Ci0KLQkgIG9mZnNldCArPSBvcHRpb24tPnNpemU7Ci0JICAKLQkgICsrb3B0aW9uOwotCSAgKytjbnQ7Ci0JfQotCi0gICAgICBwcmludGYgKF8oIlxuU2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwKLQkgICAgICBzdHJpbmdfdGFibGUgKyBzZWN0LT5zaF9uYW1lLCBjbnQpOwotCi0gICAgICBvcHRpb24gPSBpb3B0OwotICAgICAgCi0gICAgICB3aGlsZSAoY250LS0gPiAwKQotCXsKLQkgIHNpemVfdCBsZW47Ci0KLQkgIHN3aXRjaCAob3B0aW9uLT5raW5kKQotCSAgICB7Ci0JICAgIGNhc2UgT0RLX05VTEw6Ci0JICAgICAgLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiAgKi8KLQkgICAgICBwcmludGYgKCIgTlVMTCAgICAgICAlZCAlbHgiLCBvcHRpb24tPnNlY3Rpb24sIG9wdGlvbi0+aW5mbyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX1JFR0lORk86Ci0JICAgICAgcHJpbnRmICgiIFJFR0lORk8gICAgIik7Ci0JICAgICAgaWYgKGVsZl9oZWFkZXIuZV9tYWNoaW5lID09IEVNX01JUFMpCi0JCXsKLQkJICAvKiAzMmJpdCBmb3JtLiAgKi8KLQkJICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICplcmVnOwotCQkgIEVsZjMyX1JlZ0luZm8gcmVnaW5mbzsKLQotCQkgIGVyZWcgPSAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqKSAob3B0aW9uICsgMSk7Ci0JCSAgcmVnaW5mby5yaV9ncHJtYXNrID0gQllURV9HRVQgKGVyZWctPnJpX2dwcm1hc2spOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1swXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzBdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMV0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1sxXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzJdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMl0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1szXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzNdKTsKLQkJICByZWdpbmZvLnJpX2dwX3ZhbHVlID0gQllURV9HRVQgKGVyZWctPnJpX2dwX3ZhbHVlKTsKLQotCQkgIHByaW50ZiAoIkdQUiAlMDhseCAgR1AgMHglbHhcbiIsCi0JCQkgIHJlZ2luZm8ucmlfZ3BybWFzaywKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIHJlZ2luZm8ucmlfZ3BfdmFsdWUpOwotCQkgIHByaW50ZiAoIiAgICAgICAgICAgIENQUjAgJTA4bHggIENQUjEgJTA4bHggIENQUjIgJTA4bHggIENQUjMgJTA4bHhcbiIsCi0JCQkgIHJlZ2luZm8ucmlfY3BybWFza1swXSwgcmVnaW5mby5yaV9jcHJtYXNrWzFdLAotCQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0sIHJlZ2luZm8ucmlfY3BybWFza1szXSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiA2NCBiaXQgZm9ybS4gICovCi0JCSAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqIGVyZWc7Ci0JCSAgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyByZWdpbmZvOwotCi0JCSAgZXJlZyA9IChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICopIChvcHRpb24gKyAxKTsKLQkJICByZWdpbmZvLnJpX2dwcm1hc2sgICAgPSBCWVRFX0dFVCAoZXJlZy0+cmlfZ3BybWFzayk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMF0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1sxXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzFdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1syXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzNdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbM10pOwotCQkgIHJlZ2luZm8ucmlfZ3BfdmFsdWUgICA9IEJZVEVfR0VUOCAoZXJlZy0+cmlfZ3BfdmFsdWUpOwotCi0JCSAgcHJpbnRmICgiR1BSICUwOGx4ICBHUCAweCIsCi0JCQkgIHJlZ2luZm8ucmlfZ3BybWFzayk7Ci0JCSAgcHJpbnRmX3ZtYSAocmVnaW5mby5yaV9ncF92YWx1ZSk7Ci0JCSAgcHJpbnRmICgiXG4iKTsKLQotCQkgIHByaW50ZiAoIiAgICAgICAgICAgIENQUjAgJTA4bHggIENQUjEgJTA4bHggIENQUjIgJTA4bHggIENQUjMgJTA4bHhcbiIsCi0JCQkgIHJlZ2luZm8ucmlfY3BybWFza1swXSwgcmVnaW5mby5yaV9jcHJtYXNrWzFdLAotCQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0sIHJlZ2luZm8ucmlfY3BybWFza1szXSk7Ci0JCX0KLQkgICAgICArK29wdGlvbjsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBPREtfRVhDRVBUSU9OUzoKLQkgICAgICBmcHV0cyAoIiBFWENFUFRJT05TIGZwZV9taW4oIiwgc3Rkb3V0KTsKLQkgICAgICBwcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAob3B0aW9uLT5pbmZvICYgT0VYX0ZQVV9NSU4pOwotCSAgICAgIGZwdXRzICgiKSBmcGVfbWF4KCIsIHN0ZG91dCk7Ci0JICAgICAgcHJvY2Vzc19taXBzX2ZwZV9leGNlcHRpb24gKChvcHRpb24tPmluZm8gJiBPRVhfRlBVX01BWCkgPj4gOCk7Ci0JICAgICAgZnB1dHMgKCIpIiwgc3Rkb3V0KTsKLQotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfUEFHRTApCi0JCWZwdXRzICgiIFBBR0UwIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0VYX1NNTSkKLQkJZnB1dHMgKCIgU01NIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0VYX0ZQREJVRykKLQkJZnB1dHMgKCIgRlBEQlVHIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0VYX0RJU01JU1MpCi0JCWZwdXRzICgiIERJU01JU1MiLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19QQUQ6Ci0JICAgICAgZnB1dHMgKCIgUEFEICAgICAgICIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfUFJFRklYKQotCQlmcHV0cyAoIiBQUkVGSVgiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPUEFEX1BPU1RGSVgpCi0JCWZwdXRzICgiIFBPU1RGSVgiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPUEFEX1NZTUJPTCkKLQkJZnB1dHMgKCIgU1lNQk9MIiwgc3Rkb3V0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfSFdQQVRDSDoKLQkgICAgICBmcHV0cyAoIiBIV1BBVENIICAgIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXX1I0S0VPUCkKLQkJZnB1dHMgKCIgUjRLRU9QIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXX1I4S1BGRVRDSCkKLQkJZnB1dHMgKCIgUjhLUEZFVENIIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXX1I1S0VPUCkKLQkJZnB1dHMgKCIgUjVLRU9QIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXX1I1S0NWVEwpCi0JCWZwdXRzICgiIFI1S0NWVEwiLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19GSUxMOgotCSAgICAgIGZwdXRzICgiIEZJTEwgICAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICAvKiBYWFggUHJpbnQgY29udGVudCBvZiBpbmZvIHdvcmQ/ICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19UQUdTOgotCSAgICAgIGZwdXRzICgiIFRBR1MgICAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICAvKiBYWFggUHJpbnQgY29udGVudCBvZiBpbmZvIHdvcmQ/ICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19IV0FORDoKLQkgICAgICBmcHV0cyAoIiBIV0FORCAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXQTBfUjRLRU9QX0NIRUNLRUQpCi0JCWZwdXRzICgiIFI0S0VPUF9DSEVDS0VEIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXQTBfUjRLRU9QX0NMRUFOKQotCQlmcHV0cyAoIiBSNEtFT1BfQ0xFQU4iLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19IV09SOgotCSAgICAgIGZwdXRzICgiIEhXT1IgICAgICAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0hFQ0tFRCkKLQkJZnB1dHMgKCIgUjRLRU9QX0NIRUNLRUQiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0xFQU4pCi0JCWZwdXRzICgiIFI0S0VPUF9DTEVBTiIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0dQX0dST1VQOgotCSAgICAgIHByaW50ZiAoIiBHUF9HUk9VUCAgJSMwNmx4ICBzZWxmLWNvbnRhaW5lZCAlIzA2bHgiLAotCQkgICAgICBvcHRpb24tPmluZm8gJiBPR1BfR1JPVVAsCi0JCSAgICAgIChvcHRpb24tPmluZm8gJiBPR1BfU0VMRikgPj4gMTYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19JREVOVDoKLQkgICAgICBwcmludGYgKCIgSURFTlQgICAgICUjMDZseCAgc2VsZi1jb250YWluZWQgJSMwNmx4IiwKLQkJICAgICAgb3B0aW9uLT5pbmZvICYgT0dQX0dST1VQLAotCQkgICAgICAob3B0aW9uLT5pbmZvICYgT0dQX1NFTEYpID4+IDE2KTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICAqLwotCSAgICAgIHByaW50ZiAoIiAlM2QgPz8/ICAgICAlZCAlbHgiLAotCQkgICAgICBvcHRpb24tPmtpbmQsIG9wdGlvbi0+c2VjdGlvbiwgb3B0aW9uLT5pbmZvKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBsZW4gPSBzaXplb2YgKCplb3B0KTsKLQkgIHdoaWxlIChsZW4gPCBvcHRpb24tPnNpemUpCi0JICAgIGlmICgoKGNoYXIgKikgb3B0aW9uKVtsZW5dID49ICcgJwotCQkmJiAoKGNoYXIgKikgb3B0aW9uKVtsZW5dIDwgMHg3ZikKLQkgICAgICBwcmludGYgKCIlYyIsICgoY2hhciAqKSBvcHRpb24pW2xlbisrXSk7Ci0JICAgIGVsc2UKLQkgICAgICBwcmludGYgKCJcXCUwM28iLCAoKGNoYXIgKikgb3B0aW9uKVtsZW4rK10pOwotCi0JICBmcHV0cyAoIlxuIiwgc3Rkb3V0KTsKLQkgICsrb3B0aW9uOwotCX0KLQotICAgICAgZnJlZSAoZW9wdCk7Ci0gICAgfQotCi0gIGlmIChjb25mbGljdHNfb2Zmc2V0ICE9IDAgJiYgY29uZmxpY3Rzbm8gIT0gMCkKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9Db25mbGljdCAqIGVjb25mMzI7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9Db25mbGljdCAqIGVjb25mNjQ7Ci0gICAgICBFbGYzMl9Db25mbGljdCAqIGljb25mOwotICAgICAgc2l6ZV90IGNudDsKLQotICAgICAgaWYgKGR5bmFtaWNfc3ltYm9scyA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJjb25mbGljdCBsaXN0IHdpdGggd2l0aG91dCB0YWJsZSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWNvbmYgPSAoRWxmMzJfQ29uZmxpY3QgKikgbWFsbG9jIChjb25mbGljdHNubyAqIHNpemVvZiAoKmljb25mKSk7Ci0gICAgICBpZiAoaWNvbmYgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKGlzXzMyYml0X2VsZikKLQl7Ci0JICBHRVRfREFUQV9BTExPQyAoY29uZmxpY3RzX29mZnNldCwgY29uZmxpY3Rzbm8gKiBzaXplb2YgKCplY29uZjMyKSwKLQkJCSAgZWNvbmYzMiwgRWxmMzJfRXh0ZXJuYWxfQ29uZmxpY3QgKiwgImNvbmZsaWN0Iik7Ci0KLQkgIGZvciAoY250ID0gMDsgY250IDwgY29uZmxpY3Rzbm87ICsrY250KQotCSAgICBpY29uZltjbnRdID0gQllURV9HRVQgKGVjb25mMzJbY250XSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEdFVF9EQVRBX0FMTE9DIChjb25mbGljdHNfb2Zmc2V0LCBjb25mbGljdHNubyAqIHNpemVvZiAoKmVjb25mNjQpLAotCQkJICBlY29uZjY0LCBFbGY2NF9FeHRlcm5hbF9Db25mbGljdCAqLCAiY29uZmxpY3QiKTsKLQotCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb25mbGljdHNubzsgKytjbnQpCi0JICAgIGljb25mW2NudF0gPSBCWVRFX0dFVCAoZWNvbmY2NFtjbnRdKTsKLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiXG5TZWN0aW9uICcuY29uZmxpY3QnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwgY29uZmxpY3Rzbm8pOwotICAgICAgcHV0cyAoXygiICBOdW06ICAgIEluZGV4ICAgICAgIFZhbHVlICBOYW1lIikpOwotCi0gICAgICBmb3IgKGNudCA9IDA7IGNudCA8IGNvbmZsaWN0c25vOyArK2NudCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltICogcHN5bSA9ICZkeW5hbWljX3N5bWJvbHNbaWNvbmZbY250XV07Ci0KLQkgIHByaW50ZiAoIiU1bHU6ICU4bHUgICIsICh1bnNpZ25lZCBsb25nKSBjbnQsIGljb25mW2NudF0pOwotCSAgcHJpbnRfdm1hIChwc3ltLT5zdF92YWx1ZSwgRlVMTF9IRVgpOwotCSAgcHJpbnRmICgiICAlc1xuIiwgZHluYW1pY19zdHJpbmdzICsgcHN5bS0+c3RfbmFtZSk7Ci0JfQotCi0gICAgICBmcmVlIChpY29uZik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfbm90ZV90eXBlIChlX3R5cGUpCi0gICAgIHVuc2lnbmVkIGVfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZls2NF07Ci0KLSAgc3dpdGNoIChlX3R5cGUpCi0gICAgewotICAgIGNhc2UgTlRfUFJTVEFUVVM6CXJldHVybiBfKCJOVF9QUlNUQVRVUyAocHJzdGF0dXMgc3RydWN0dXJlKSIpOwotICAgIGNhc2UgTlRfRlBSRUdTRVQ6CXJldHVybiBfKCJOVF9GUFJFR1NFVCAoZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzKSIpOwotICAgIGNhc2UgTlRfUFJQU0lORk86ICAgcmV0dXJuIF8oIk5UX1BSUFNJTkZPIChwcnBzaW5mbyBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9UQVNLU1RSVUNUOiByZXR1cm4gXygiTlRfVEFTS1NUUlVDVCAodGFzayBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9QUlhGUFJFRzogICByZXR1cm4gXygiTlRfUFJYRlBSRUcgKHVzZXJfeGZwcmVncyBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9QU1RBVFVTOglyZXR1cm4gXygiTlRfUFNUQVRVUyAocHN0YXR1cyBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9GUFJFR1M6CXJldHVybiBfKCJOVF9GUFJFR1MgKGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycykiKTsKLSAgICBjYXNlIE5UX1BTSU5GTzoJcmV0dXJuIF8oIk5UX1BTSU5GTyAocHNpbmZvIHN0cnVjdHVyZSkiKTsKLSAgICBjYXNlIE5UX0xXUFNUQVRVUzoJcmV0dXJuIF8oIk5UX0xXUFNUQVRVUyAobHdwc3RhdHVzX3Qgc3RydWN0dXJlKSIpOwotICAgIGNhc2UgTlRfTFdQU0lORk86CXJldHVybiBfKCJOVF9MV1BTSU5GTyAobHdwc2luZm9fdCBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9XSU4zMlBTVEFUVVM6IHJldHVybiBfKCJOVF9XSU4zMlBTVEFUVVMgKHdpbjMyX3BzdGF0dXMgc3RyY3V0dXJlKSIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChidWZmLCBfKCJVbmtub3duIG5vdGUgdHlwZTogKDB4JTA4eCkiKSwgZV90eXBlKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotLyogTm90ZSB0aGF0IGJ5IHRoZSBFTEYgc3RhbmRhcmQsIHRoZSBuYW1lIGZpZWxkIGlzIGFscmVhZHkgbnVsbCBieXRlCi0gICB0ZXJtaW5hdGVkLCBhbmQgbmFtZXN6IGluY2x1ZGVzIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUuCi0gICBJLkUuIHRoZSB2YWx1ZSBvZiBuYW1lc3ogZm9yIHRoZSBuYW1lICJGU0YiIGlzIDQuCi0KLSAgIElmIHRoZSB2YWx1ZSBvZiBuYW1lc3ogaXMgemVybywgdGhlcmUgaXMgbm8gbmFtZSBwcmVzZW50LiAqLwotc3RhdGljIGludAotcHJvY2Vzc19ub3RlIChwbm90ZSkKLSAgRWxmMzJfSW50ZXJuYWxfTm90ZSAqIHBub3RlOwotewotICBwcmludGYgKCIgICVzXHRcdDB4JTA4bHhcdCVzXG4iLAotCSAgcG5vdGUtPm5hbWVzeiA/IHBub3RlLT5uYW1lZGF0YSA6ICIoTk9ORSkiLAotICAJICBwbm90ZS0+ZGVzY3N6LCBnZXRfbm90ZV90eXBlIChwbm90ZS0+dHlwZSkpOwotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2NvcmVmaWxlX25vdGVfc2VnbWVudCAoZmlsZSwgb2Zmc2V0LCBsZW5ndGgpCi0gICAgIEZJTEUgKiBmaWxlOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSBsZW5ndGg7Ci17Ci0gIEVsZl9FeHRlcm5hbF9Ob3RlICogIHBub3RlczsKLSAgRWxmX0V4dGVybmFsX05vdGUgKiAgZXh0ZXJuYWw7Ci0gIGludCAgICAgICAgICAgICAgICAgIHJlcyA9IDE7Ci0KLSAgaWYgKGxlbmd0aCA8PSAwKQotICAgIHJldHVybiAwOwotCi0gIEdFVF9EQVRBX0FMTE9DIChvZmZzZXQsIGxlbmd0aCwgcG5vdGVzLCBFbGZfRXh0ZXJuYWxfTm90ZSAqLCAibm90ZXMiKTsKLQotICBleHRlcm5hbCA9IHBub3RlczsKLQotICBwcmludGYgKF8oIlxuTm90ZXMgYXQgb2Zmc2V0IDB4JTA4bHggd2l0aCBsZW5ndGggMHglMDhseDpcbiIpLAotCSAgKHVuc2lnbmVkIGxvbmcpIG9mZnNldCwKLQkgICh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOwotICBwcmludGYgKF8oIiAgT3duZXJcdFx0RGF0YSBzaXplXHREZXNjcmlwdGlvblxuIikpOwotCi0gIHdoaWxlIChleHRlcm5hbCA8IChFbGZfRXh0ZXJuYWxfTm90ZSAqKSgoY2hhciAqKSBwbm90ZXMgKyBsZW5ndGgpKQotICAgIHsKLSAgICAgIEVsZjMyX0ludGVybmFsX05vdGUgaW5vdGU7Ci0gICAgICBjaGFyICogdGVtcCA9IE5VTEw7Ci0KLSAgICAgIGlub3RlLnR5cGUgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT50eXBlKTsKLSAgICAgIGlub3RlLm5hbWVzeiAgID0gQllURV9HRVQgKGV4dGVybmFsLT5uYW1lc3opOwotICAgICAgaW5vdGUubmFtZWRhdGEgPSBleHRlcm5hbC0+bmFtZTsKLSAgICAgIGlub3RlLmRlc2NzeiAgID0gQllURV9HRVQgKGV4dGVybmFsLT5kZXNjc3opOwotICAgICAgaW5vdGUuZGVzY2RhdGEgPSBpbm90ZS5uYW1lZGF0YSArIGFsaWduX3Bvd2VyIChpbm90ZS5uYW1lc3osIDIpOwotICAgICAgaW5vdGUuZGVzY3BvcyAgPSBvZmZzZXQgKyAoaW5vdGUuZGVzY2RhdGEgLSAoY2hhciAqKSBwbm90ZXMpOwotICAgICAgCi0gICAgICBleHRlcm5hbCA9IChFbGZfRXh0ZXJuYWxfTm90ZSAqKShpbm90ZS5kZXNjZGF0YSArIGFsaWduX3Bvd2VyIChpbm90ZS5kZXNjc3osIDIpKTsKLQotICAgICAgLyogVmVyaWZ5IHRoYXQgbmFtZSBpcyBudWxsIHRlcm1pbmF0ZWQuICBJdCBhcHBlYXJzIHRoYXQgYXQgbGVhc3QKLQkgb25lIHZlcnNpb24gb2YgTGludXggKFJlZEhhdCA2LjApIGdlbmVyYXRlcyBjb3JlZmlsZXMgdGhhdCBkb24ndAotCSBjb21wbHkgd2l0aCB0aGUgRUxGIHNwZWMgYnkgZmFpbGluZyB0byBpbmNsdWRlIHRoZSBudWxsIGJ5dGUgaW4KLQkgbmFtZXN6LiAgKi8KLSAgICAgIGlmIChpbm90ZS5uYW1lZGF0YVtpbm90ZS5uYW1lc3pdICE9ICdcMCcpCi0JewotCSAgdGVtcCA9IG1hbGxvYyAoaW5vdGUubmFtZXN6ICsgMSk7Ci0JICAKLQkgIGlmICh0ZW1wID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotCSAgICAgIHJlcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIAotCSAgc3RybmNweSAodGVtcCwgaW5vdGUubmFtZWRhdGEsIGlub3RlLm5hbWVzeik7Ci0JICB0ZW1wW2lub3RlLm5hbWVzel0gPSAwOwotCSAgCi0JICAvKiB3YXJuIChfKCInJXMnIE5PVEUgbmFtZSBub3QgcHJvcGVybHkgbnVsbCB0ZXJtaW5hdGVkXG4iKSwgdGVtcCk7ICAqLwotCSAgaW5vdGUubmFtZWRhdGEgPSB0ZW1wOwotCX0KLQotICAgICAgcmVzICY9IHByb2Nlc3Nfbm90ZSAoJiBpbm90ZSk7Ci0KLSAgICAgIGlmICh0ZW1wICE9IE5VTEwpCi0JewotCSAgZnJlZSAodGVtcCk7Ci0JICB0ZW1wID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHBub3Rlcyk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnRzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmX0ludGVybmFsX1BoZHIgKiBwcm9ncmFtX2hlYWRlcnM7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICogc2VnbWVudDsKLSAgdW5zaWduZWQgaW50CSAgICAgIGk7Ci0gIGludCAgICAgICAgICAgICAgICAgcmVzID0gMTsKLQotICBwcm9ncmFtX2hlYWRlcnMgPSAoRWxmX0ludGVybmFsX1BoZHIgKikgbWFsbG9jCi0gICAgKGVsZl9oZWFkZXIuZV9waG51bSAqIHNpemVvZiAoRWxmX0ludGVybmFsX1BoZHIpKTsKLQotICBpZiAocHJvZ3JhbV9oZWFkZXJzID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoaXNfMzJiaXRfZWxmKQotICAgIGkgPSBnZXRfMzJiaXRfcHJvZ3JhbV9oZWFkZXJzIChmaWxlLCBwcm9ncmFtX2hlYWRlcnMpOwotICBlbHNlCi0gICAgaSA9IGdldF82NGJpdF9wcm9ncmFtX2hlYWRlcnMgKGZpbGUsIHByb2dyYW1faGVhZGVycyk7Ci0KLSAgaWYgKGkgPT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChwcm9ncmFtX2hlYWRlcnMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIHNlZ21lbnQgPSBwcm9ncmFtX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsKLSAgICAgICBpICsrLCBzZWdtZW50ICsrKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50LT5wX3R5cGUgPT0gUFRfTk9URSkKLQlyZXMgJj0gcHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnQgKGZpbGUsCi0JCQkJCSAgICAgIChiZmRfdm1hKSBzZWdtZW50LT5wX29mZnNldCwKLQkJCQkJICAgICAgKGJmZF92bWEpIHNlZ21lbnQtPnBfZmlsZXN6KTsKLSAgICB9Ci0KLSAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2NvcmVmaWxlX2NvbnRlbnRzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgLyogSWYgd2UgaGF2ZSBub3QgYmVlbiBhc2tlZCB0byBkaXNwbGF5IHRoZSBub3RlcyB0aGVuIGRvIG5vdGhpbmcuICAqLwotICBpZiAoISBkb19ub3RlcykKLSAgICByZXR1cm4gMTsKLQotICAvKiBJZiBmaWxlIGlzIG5vdCBhIGNvcmUgZmlsZSB0aGVuIGV4aXQuICAqLwotICBpZiAoZWxmX2hlYWRlci5lX3R5cGUgIT0gRVRfQ09SRSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBObyBwcm9ncmFtIGhlYWRlcnMgbWVhbnMgbm8gTk9URSBzZWdtZW50LiAgKi8KLSAgaWYgKGVsZl9oZWFkZXIuZV9waG51bSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiTm8gbm90ZSBzZWdtZW50cyBwcmVzZW50IGluIHRoZSBjb3JlIGZpbGUuXG4iKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLQotICByZXR1cm4gcHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnRzIChmaWxlKTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19hcmNoX3NwZWNpZmljIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgaWYgKCEgZG9fYXJjaCkKLSAgICByZXR1cm4gMTsKLQotICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIEVNX01JUFM6Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLSAgICAgIHJldHVybiBwcm9jZXNzX21pcHNfc3BlY2lmaWMgKGZpbGUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9maWxlX2hlYWRlciAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIC8qIFJlYWQgaW4gdGhlIGlkZW50aXR5IGFycmF5LiAgKi8KLSAgaWYgKGZyZWFkIChlbGZfaGVhZGVyLmVfaWRlbnQsIEVJX05JREVOVCwgMSwgZmlsZSkgIT0gMSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBEZXRlcm1pbmUgaG93IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlci4gICovCi0gIHN3aXRjaCAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgZGVmYXVsdDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBFTEZEQVRBTk9ORTogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBFTEZEQVRBMkxTQjogYnl0ZV9nZXQgPSBieXRlX2dldF9saXR0bGVfZW5kaWFuOyBicmVhazsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOiBieXRlX2dldCA9IGJ5dGVfZ2V0X2JpZ19lbmRpYW47IGJyZWFrOwotICAgIH0KLQotICAvKiBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCAzMiBiaXQgYW5kIDY0IGJpdCBFTEYgZmlsZXMuICAqLwotICBpc18zMmJpdF9lbGYgPSAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9DTEFTU10gIT0gRUxGQ0xBU1M2NCk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLiAgKi8KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9FaGRyIGVoZHIzMjsKLQotICAgICAgaWYgKGZyZWFkIChlaGRyMzIuZV90eXBlLCBzaXplb2YgKGVoZHIzMikgLSBFSV9OSURFTlQsIDEsIGZpbGUpICE9IDEpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGVsZl9oZWFkZXIuZV90eXBlICAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfdHlwZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfbWFjaGluZSAgID0gQllURV9HRVQgKGVoZHIzMi5lX21hY2hpbmUpOwotICAgICAgZWxmX2hlYWRlci5lX3ZlcnNpb24gICA9IEJZVEVfR0VUIChlaGRyMzIuZV92ZXJzaW9uKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9lbnRyeSAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfZW50cnkpOwotICAgICAgZWxmX2hlYWRlci5lX3Bob2ZmICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9waG9mZik7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hvZmYgICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3Nob2ZmKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9mbGFncyAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfZmxhZ3MpOwotICAgICAgZWxmX2hlYWRlci5lX2Voc2l6ZSAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9laHNpemUpOwotICAgICAgZWxmX2hlYWRlci5lX3BoZW50c2l6ZSA9IEJZVEVfR0VUIChlaGRyMzIuZV9waGVudHNpemUpOwotICAgICAgZWxmX2hlYWRlci5lX3BobnVtICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9waG51bSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hlbnRzaXplID0gQllURV9HRVQgKGVoZHIzMi5lX3NoZW50c2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hudW0gICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3NobnVtKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaHN0cm5keCAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfc2hzdHJuZHgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0VoZHIgZWhkcjY0OwotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCBzaXplb2YgKGJmZF92bWEpID09IDQsIHRoZW4KLQkgd2Ugd2lsbCBub3QgYmUgYWJsZSB0byBjb3BlIHdpdGggdGhlIDY0Yml0IGRhdGEgZm91bmQgaW4KLQkgNjQgRUxGIGZpbGVzLiAgRGV0ZWN0IHRoaXMgbm93IGFuZCBhYm9ydCBiZWZvcmUgd2Ugc3RhcnQKLQkgb3ZlcndyaXR0aW5nIHRoaW5ncy4gICovCi0gICAgICBpZiAoc2l6ZW9mIChiZmRfdm1hKSA8IDgpCi0JewotCSAgZXJyb3IgKF8oIlRoaXMgaW5zdGFuY2Ugb2YgcmVhZGVsZiBoYXMgYmVlbiBidWlsdCB3aXRob3V0IHN1cHBvcnQgZm9yIGFcbiIpKTsKLQkgIGVycm9yIChfKCI2NCBiaXQgZGF0YSB0eXBlIGFuZCBzbyBpdCBjYW5ub3QgcmVhZCA2NCBiaXQgRUxGIGZpbGVzLlxuIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoZnJlYWQgKGVoZHI2NC5lX3R5cGUsIHNpemVvZiAoZWhkcjY0KSAtIEVJX05JREVOVCwgMSwgZmlsZSkgIT0gMSkKLQlyZXR1cm4gMDsKLQotICAgICAgZWxmX2hlYWRlci5lX3R5cGUgICAgICA9IEJZVEVfR0VUIChlaGRyNjQuZV90eXBlKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9tYWNoaW5lICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfbWFjaGluZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfdmVyc2lvbiAgID0gQllURV9HRVQgKGVoZHI2NC5lX3ZlcnNpb24pOwotICAgICAgZWxmX2hlYWRlci5lX2VudHJ5ICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfZW50cnkpOwotICAgICAgZWxmX2hlYWRlci5lX3Bob2ZmICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfcGhvZmYpOwotICAgICAgZWxmX2hlYWRlci5lX3Nob2ZmICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfc2hvZmYpOwotICAgICAgZWxmX2hlYWRlci5lX2ZsYWdzICAgICA9IEJZVEVfR0VUIChlaGRyNjQuZV9mbGFncyk7Ci0gICAgICBlbGZfaGVhZGVyLmVfZWhzaXplICAgID0gQllURV9HRVQgKGVoZHI2NC5lX2Voc2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplID0gQllURV9HRVQgKGVoZHI2NC5lX3BoZW50c2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhudW0gICAgID0gQllURV9HRVQgKGVoZHI2NC5lX3BobnVtKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgPSBCWVRFX0dFVCAoZWhkcjY0LmVfc2hlbnRzaXplKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaG51bSAgICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfc2hudW0pOwotICAgICAgZWxmX2hlYWRlci5lX3Noc3RybmR4ICA9IEJZVEVfR0VUIChlaGRyNjQuZV9zaHN0cm5keCk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19maWxlIChmaWxlX25hbWUpCi0gICAgIGNoYXIgKiBmaWxlX25hbWU7Ci17Ci0gIEZJTEUgKiAgICAgICBmaWxlOwotICBzdHJ1Y3Qgc3RhdCAgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHN0YXQgKGZpbGVfbmFtZSwgJiBzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgZXJyb3IgKF8oIkNhbm5vdCBzdGF0IGlucHV0IGZpbGUgJXMuXG4iKSwgZmlsZV9uYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZmlsZSA9IGZvcGVuIChmaWxlX25hbWUsICJyYiIpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZC5cbiIpLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoISBnZXRfZmlsZV9oZWFkZXIgKGZpbGUpKQotICAgIHsKLSAgICAgIGVycm9yIChfKCIlczogRmFpbGVkIHRvIHJlYWQgZmlsZSBoZWFkZXJcbiIpLCBmaWxlX25hbWUpOwotICAgICAgZmNsb3NlIChmaWxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGlzZSBwZXIgZmlsZSB2YXJpYWJsZXMuICAqLwotICBmb3IgKGkgPSBOVU1fRUxFTSAodmVyc2lvbl9pbmZvKTsgaS0tOykKLSAgICB2ZXJzaW9uX2luZm9baV0gPSAwOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChkeW5hbWljX2luZm8pOyBpLS07KQotICAgIGR5bmFtaWNfaW5mb1tpXSA9IDA7Ci0KLSAgLyogUHJvY2VzcyB0aGUgZmlsZS4gICovCi0gIGlmIChzaG93X25hbWUpCi0gICAgcHJpbnRmIChfKCJcbkZpbGU6ICVzXG4iKSwgZmlsZV9uYW1lKTsKLQotICBpZiAoISBwcm9jZXNzX2ZpbGVfaGVhZGVyICgpKQotICAgIHsKLSAgICAgIGZjbG9zZSAoZmlsZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzIChmaWxlKTsKLQotICBwcm9jZXNzX3Byb2dyYW1faGVhZGVycyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgKGZpbGUpOwotCi0gIHByb2Nlc3NfcmVsb2NzIChmaWxlKTsKLQotICBwcm9jZXNzX3N5bWJvbF90YWJsZSAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19zeW1pbmZvIChmaWxlKTsKLQotICBwcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgKGZpbGUpOwotCi0gIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19jb3JlZmlsZV9jb250ZW50cyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19hcmNoX3NwZWNpZmljIChmaWxlKTsKLQotICBmY2xvc2UgKGZpbGUpOwotCi0gIGlmIChzZWN0aW9uX2hlYWRlcnMpCi0gICAgewotICAgICAgZnJlZSAoc2VjdGlvbl9oZWFkZXJzKTsKLSAgICAgIHNlY3Rpb25faGVhZGVycyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzdHJpbmdfdGFibGUpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nX3RhYmxlKTsKLSAgICAgIHN0cmluZ190YWJsZSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N0cmluZ3MpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zdHJpbmdzKTsKLSAgICAgIGR5bmFtaWNfc3RyaW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N5bWJvbHMpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zeW1ib2xzKTsKLSAgICAgIGR5bmFtaWNfc3ltYm9scyA9IE5VTEw7Ci0gICAgICBudW1fZHluYW1pY19zeW1zID0gMDsKLSAgICB9Ci0KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbykKLSAgICB7Ci0gICAgICBmcmVlIChkeW5hbWljX3N5bWluZm8pOwotICAgICAgZHluYW1pY19zeW1pbmZvID0gTlVMTDsKLSAgICB9Ci19Ci0KLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0vKiBOZWVkZWQgYnkgdGhlIGkzODYgZGlzYXNzZW1ibGVyLiAgRm9yIGV4dHJhIGNyZWRpdCwgc29tZW9uZSBjb3VsZAotICAgZml4IHRoaXMgc28gdGhhdCB3ZSBpbnNlcnQgc3ltYm9saWMgYWRkcmVzc2VzIGhlcmUsIGVzcCBmb3IgR09UL1BMVAotICAgc3ltYm9scyAqLwotCi12b2lkCi1wcmludF9hZGRyZXNzICh1bnNpZ25lZCBpbnQgYWRkciwgRklMRSAqIG91dGZpbGUpCi17Ci0gIGZwcmludGYgKG91dGZpbGUsIjB4JTguOHgiLCBhZGRyKTsKLX0KLQotLyogTmVlZGVkIGJ5IHRoZSBpMzg2IGRpc2Fzc2VtYmxlci4gKi8KLXZvaWQKLWRiX3Rhc2tfcHJpbnRzeW0gKHVuc2lnbmVkIGludCBhZGRyKQotewotICBwcmludF9hZGRyZXNzIChhZGRyLCBzdGRlcnIpOwotfQotI2VuZGlmCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50ICAgICBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcGFyc2VfYXJncyAoYXJnYywgYXJndik7Ci0KLSAgaWYgKG9wdGluZCA8IChhcmdjIC0gMSkpCi0gICAgc2hvd19uYW1lID0gMTsKLQotICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLSAgICBwcm9jZXNzX2ZpbGUgKGFyZ3YgW29wdGluZCArK10pOwotCi0gIGlmIChkdW1wX3NlY3RzICE9IE5VTEwpCi0gICAgZnJlZSAoZHVtcF9zZWN0cyk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZW5hbWUuYyBiL2JpbnV0aWxzL3JlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVhOWZkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qIHJlbmFtZS5jIC0tIHJlbmFtZSBhIGZpbGUsIHByZXNlcnZpbmcgc3ltbGlua3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBIQVZFX0dPT0RfVVRJTUVfSAotI2luY2x1ZGUgPHV0aW1lLmg+Ci0jZWxzZSAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0jaWZkZWYgSEFWRV9VVElNRVMKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmIC8qIEhBVkVfVVRJTUVTICovCi0jZW5kaWYgLyogISBIQVZFX0dPT0RfVVRJTUVfSCAqLwotCi0vKiBXZSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGVzIG9uIHN5c3RlbSB3aGVyZSB0aGF0IG1ha2VzCi0gICBhIGRpZmZlcmVuY2UuICAqLwotI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAwCi0jZW5kaWYKLQotc3RhdGljIGludCBzaW1wbGVfY29weSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgYXQgb25jZS4gICovCi0jZGVmaW5lIENPUFlfQlVGIDgxOTIKLQotLyogQ29weSBmaWxlIEZST00gdG8gZmlsZSBUTywgcGVyZm9ybWluZyBubyB0cmFuc2xhdGlvbnMuCi0gICBSZXR1cm4gMCBpZiBvaywgLTEgaWYgZXJyb3IuICAqLwotCi1zdGF0aWMgaW50Ci1zaW1wbGVfY29weSAoZnJvbSwgdG8pCi0gICAgIGNvbnN0IGNoYXIgKmZyb207Ci0gICAgIGNvbnN0IGNoYXIgKnRvOwotewotICBpbnQgZnJvbWZkLCB0b2ZkLCBucmVhZDsKLSAgaW50IHNhdmVkOwotICBjaGFyIGJ1ZltDT1BZX0JVRl07Ci0KLSAgZnJvbWZkID0gb3BlbiAoZnJvbSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7Ci0gIGlmIChmcm9tZmQgPCAwKQotICAgIHJldHVybiAtMTsKLSNpZmRlZiBPX0NSRUFUCi0gIHRvZmQgPSBvcGVuICh0bywgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNzc3KTsKLSNlbHNlCi0gIHRvZmQgPSBjcmVhdCAodG8sIDA3NzcpOwotI2VuZGlmCi0gIGlmICh0b2ZkIDwgMCkKLSAgICB7Ci0gICAgICBzYXZlZCA9IGVycm5vOwotICAgICAgY2xvc2UgKGZyb21mZCk7Ci0gICAgICBlcnJubyA9IHNhdmVkOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgd2hpbGUgKChucmVhZCA9IHJlYWQgKGZyb21mZCwgYnVmLCBzaXplb2YgYnVmKSkgPiAwKQotICAgIHsKLSAgICAgIGlmICh3cml0ZSAodG9mZCwgYnVmLCBucmVhZCkgIT0gbnJlYWQpCi0JewotCSAgc2F2ZWQgPSBlcnJubzsKLQkgIGNsb3NlIChmcm9tZmQpOwotCSAgY2xvc2UgKHRvZmQpOwotCSAgZXJybm8gPSBzYXZlZDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBzYXZlZCA9IGVycm5vOwotICBjbG9zZSAoZnJvbWZkKTsKLSAgY2xvc2UgKHRvZmQpOwotICBpZiAobnJlYWQgPCAwKQotICAgIHsKLSAgICAgIGVycm5vID0gc2F2ZWQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogU2V0IHRoZSB0aW1lcyBvZiB0aGUgZmlsZSBERVNUSU5BVElPTiB0byBiZSB0aGUgc2FtZSBhcyB0aG9zZSBpbgotICAgU1RBVEJVRi4gICovCi0KLXZvaWQKLXNldF90aW1lcyAoZGVzdGluYXRpb24sIHN0YXRidWYpCi0gICAgIGNvbnN0IGNoYXIgKmRlc3RpbmF0aW9uOwotICAgICBjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZjsKLXsKLSAgaW50IHJlc3VsdDsKLQotICB7Ci0jaWZkZWYgSEFWRV9HT09EX1VUSU1FX0gKLSAgICBzdHJ1Y3QgdXRpbWJ1ZiB0YjsKLQotICAgIHRiLmFjdGltZSA9IHN0YXRidWYtPnN0X2F0aW1lOwotICAgIHRiLm1vZHRpbWUgPSBzdGF0YnVmLT5zdF9tdGltZTsKLSAgICByZXN1bHQgPSB1dGltZSAoZGVzdGluYXRpb24sICZ0Yik7Ci0jZWxzZSAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0jaWZuZGVmIEhBVkVfVVRJTUVTCi0gICAgbG9uZyB0YlsyXTsKLQotICAgIHRiWzBdID0gc3RhdGJ1Zi0+c3RfYXRpbWU7Ci0gICAgdGJbMV0gPSBzdGF0YnVmLT5zdF9tdGltZTsKLSAgICByZXN1bHQgPSB1dGltZSAoZGVzdGluYXRpb24sIHRiKTsKLSNlbHNlIC8qIEhBVkVfVVRJTUVTICovCi0gICAgc3RydWN0IHRpbWV2YWwgdHZbMl07Ci0KLSAgICB0dlswXS50dl9zZWMgPSBzdGF0YnVmLT5zdF9hdGltZTsKLSAgICB0dlswXS50dl91c2VjID0gMDsKLSAgICB0dlsxXS50dl9zZWMgPSBzdGF0YnVmLT5zdF9tdGltZTsKLSAgICB0dlsxXS50dl91c2VjID0gMDsKLSAgICByZXN1bHQgPSB1dGltZXMgKGRlc3RpbmF0aW9uLCB0dik7Ci0jZW5kaWYgLyogSEFWRV9VVElNRVMgKi8KLSNlbmRpZiAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0gIH0KLQotICBpZiAocmVzdWx0ICE9IDApCi0gICAgbm9uX2ZhdGFsIChfKCIlczogY2Fubm90IHNldCB0aW1lOiAlcyIpLCBkZXN0aW5hdGlvbiwgc3RyZXJyb3IgKGVycm5vKSk7Ci19Ci0KLSNpZm5kZWYgU19JU0xOSwotI2lmZGVmIFNfSUZMTksKLSNkZWZpbmUgU19JU0xOSyhtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKLSNlbHNlCi0jZGVmaW5lIFNfSVNMTksobSkgMAotI2RlZmluZSBsc3RhdCBzdGF0Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBSZW5hbWUgRlJPTSB0byBUTywgY29weWluZyBpZiBUTyBpcyBhIGxpbmsuCi0gICBSZXR1cm4gMCBpZiBvaywgLTEgaWYgZXJyb3IuICAqLwotCi1pbnQKLXNtYXJ0X3JlbmFtZSAoZnJvbSwgdG8sIHByZXNlcnZlX2RhdGVzKQotICAgICBjb25zdCBjaGFyICpmcm9tOwotICAgICBjb25zdCBjaGFyICp0bzsKLSAgICAgaW50IHByZXNlcnZlX2RhdGVzOwotewotICBib29sZWFuIGV4aXN0czsKLSAgc3RydWN0IHN0YXQgczsKLSAgaW50IHJldCA9IDA7Ci0KLSAgZXhpc3RzID0gbHN0YXQgKHRvLCAmcykgPT0gMDsKLQotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSAgLyogV2luMzIsIHVubGlrZSB1bml4LCB3aWxsIG5vdCBlcmFzZSBgdG8nIGluIGByZW5hbWUoZnJvbSwgdG8pJyBidXQKLSAgICAgZmFpbCBpbnN0ZWFkLiAgQWxzbywgY2hvd24gaXMgbm90IHByZXNlbnQuICAqLwotCi0gIGlmIChleGlzdHMpCi0gICAgcmVtb3ZlICh0byk7Ci0KLSAgcmV0ID0gcmVuYW1lIChmcm9tLCB0byk7Ci0gIGlmIChyZXQgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIGNsZWFuIHVwIGhlcmUuICovCi0gICAgICAKLSAgICAgIG5vbl9mYXRhbCAoXygiJXM6IHJlbmFtZTogJXMiKSwgdG8sIHN0cmVycm9yIChlcnJubykpOwotICAgICAgdW5saW5rIChmcm9tKTsKLSAgICB9Ci0jZWxzZQotICAvKiBVc2UgcmVuYW1lIG9ubHkgaWYgVE8gaXMgbm90IGEgc3ltYm9saWMgbGluayBhbmQgaGFzCi0gICAgIG9ubHkgb25lIGhhcmQgbGluay4gICovCi0gIGlmICghIGV4aXN0cyB8fCAoIVNfSVNMTksgKHMuc3RfbW9kZSkgJiYgcy5zdF9ubGluayA9PSAxKSkKLSAgICB7Ci0gICAgICByZXQgPSByZW5hbWUgKGZyb20sIHRvKTsKLSAgICAgIGlmIChyZXQgPT0gMCkKLQl7Ci0JICBpZiAoZXhpc3RzKQotCSAgICB7Ci0JICAgICAgLyogVHJ5IHRvIHByZXNlcnZlIHRoZSBwZXJtaXNzaW9uIGJpdHMgYW5kIG93bmVyc2hpcCBvZgotCQkgVE8uICBGaXJzdCBnZXQgdGhlIG1vZGUgcmlnaHQgZXhjZXB0IGZvciB0aGUgc2V0dWlkCi0JCSBiaXQuICBUaGVuIGNoYW5nZSB0aGUgb3duZXJzaGlwLiAgVGhlbiBmaXggdGhlIHNldHVpZAotCQkgYml0LiAgV2UgZG8gdGhlIGNobW9kIGJlZm9yZSB0aGUgY2hvd24gYmVjYXVzZSBpZiB0aGUKLQkJIGNob3duIHN1Y2NlZWRzLCBhbmQgd2UgYXJlIGEgbm9ybWFsIHVzZXIsIHdlIHdvbid0IGJlCi0JCSBhYmxlIHRvIGRvIHRoZSBjaG1vZCBhZnRlcndhcmQuICBXZSBkb24ndCBib3RoZXIgdG8KLQkJIGZpeCB0aGUgc2V0dWlkIGJpdCBmaXJzdCBiZWNhdXNlIHRoYXQgbWlnaHQgaW50cm9kdWNlCi0JCSBhIGZsZWV0aW5nIHNlY3VyaXR5IHByb2JsZW0sIGFuZCBiZWNhdXNlIHRoZSBjaG93bgotCQkgd2lsbCBjbGVhciB0aGUgc2V0dWlkIGJpdCBhbnlob3cuICBXZSBvbmx5IGZpeCB0aGUKLQkJIHNldHVpZCBiaXQgaWYgdGhlIGNob3duIHN1Y2NlZWRzLCBiZWNhdXNlIHdlIGRvbid0Ci0JCSB3YW50IHRvIGludHJvZHVjZSBhbiB1bmV4cGVjdGVkIHNldHVpZCBmaWxlIG93bmVkIGJ5Ci0JCSB0aGUgdXNlciBydW5uaW5nIG9iamNvcHkuICAqLwotCSAgICAgIGNobW9kICh0bywgcy5zdF9tb2RlICYgMDc3Nyk7Ci0JICAgICAgaWYgKGNob3duICh0bywgcy5zdF91aWQsIHMuc3RfZ2lkKSA+PSAwKQotCQljaG1vZCAodG8sIHMuc3RfbW9kZSAmIDA3Nzc3KTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBoYXZlIHRvIGNsZWFuIHVwIGhlcmUuICovCi0JICBub25fZmF0YWwgKF8oIiVzOiByZW5hbWU6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKLQkgIHVubGluayAoZnJvbSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldCA9IHNpbXBsZV9jb3B5IChmcm9tLCB0byk7Ci0gICAgICBpZiAocmV0ICE9IDApCi0Jbm9uX2ZhdGFsIChfKCIlczogc2ltcGxlX2NvcHk6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKLQotICAgICAgaWYgKHByZXNlcnZlX2RhdGVzKQotCXNldF90aW1lcyAodG8sICZzKTsKLSAgICAgIHVubGluayAoZnJvbSk7Ci0gICAgfQotI2VuZGlmIC8qIF9XSU4zMiAmJiAhX19DWUdXSU4zMl9fICovCi0KLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc2Jpbi5jIGIvYmludXRpbHMvcmVzYmluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzA3ZmIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVzYmluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzg3ICswLDAgQEAKLS8qIHJlc2Jpbi5jIC0tIG1hbmlwdWxhdGUgdGhlIFdpbmRvd3MgYmluYXJ5IHJlc291cmNlIGZvcm1hdC4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBjb252ZXJ0IGJldHdlZW4gdGhlIGJpbmFyeSByZXNvdXJjZQotICAgZm9ybWF0IGFuZCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcyB0aGF0IHdlIHdhbnQgdG8gdXNlLiAgVGhlIHNhbWUKLSAgIGJpbmFyeSByZXNvdXJjZSBmb3JtYXQgaXMgdXNlZCBpbiBib3RoIHJlcyBhbmQgQ09GRiBmaWxlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLS8qIE1hY3JvcyB0byBzd2FwIGluIHZhbHVlcy4gICovCi0KLSNkZWZpbmUgZ2V0XzE2KGJlLCBzKSAoKGJlKSA/IGJmZF9nZXRiMTYgKHMpIDogYmZkX2dldGwxNiAocykpCi0jZGVmaW5lIGdldF8zMihiZSwgcykgKChiZSkgPyBiZmRfZ2V0YjMyIChzKSA6IGJmZF9nZXRsMzIgKHMpKQotCi0vKiBMb2NhbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZCB0b29zbWFsbCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB1bmljaGFyICpnZXRfdW5pY29kZQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZ2V0X3Jlc2lkCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2dlbmVyaWMKLSAgUEFSQU1TICgoZW51bSByZXNfdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19jdXJzb3IKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX21lbnUKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgbWVudWl0ZW0gKmJpbl90b19yZXNfbWVudWl0ZW1zCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50LCBpbnQgKikpOwotc3RhdGljIHN0cnVjdCBtZW51aXRlbSAqYmluX3RvX3Jlc19tZW51ZXhpdGVtcwotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2RpYWxvZwotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfc3RyaW5nCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19mb250ZGlyCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX3JjZGF0YQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfZ3JvdXBfY3Vyc29yCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19ncm91cF9pY29uCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc192ZXJzaW9uCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc191c2VyZGF0YQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotCi0vKiBHaXZlbiBhIHJlc291cmNlIHR5cGUgSUQsIGEgcG9pbnRlciB0byBkYXRhLCBhIGxlbmd0aCwgcmV0dXJuIGEKLSAgIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUgd2hpY2ggcmVwcmVzZW50cyB0aGF0IHJlc291cmNlLiAgVGhlIGNhbGxlcgotICAgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyB0aGUgcmVzX2luZm8gYW5kIGNvZmZfaW5mbyBmaWVsZHMKLSAgIG9mIHRoZSByZXR1cm5lZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXMgKHR5cGUsIGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgc3RydWN0IHJlc19pZCB0eXBlOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGlmICh0eXBlLm5hbWVkKQotICAgIHJldHVybiBiaW5fdG9fcmVzX3VzZXJkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoICh0eXBlLnUuaWQpCi0JewotCWRlZmF1bHQ6Ci0JICByZXR1cm4gYmluX3RvX3Jlc191c2VyZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0NVUlNPUjoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0JJVE1BUDoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2dlbmVyaWMgKFJFU19UWVBFX0JJVE1BUCwgZGF0YSwgbGVuZ3RoKTsKLQljYXNlIFJUX0lDT046Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9JQ09OLCBkYXRhLCBsZW5ndGgpOwotCWNhc2UgUlRfTUVOVToKLQkgIHJldHVybiBiaW5fdG9fcmVzX21lbnUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9ESUFMT0c6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19kaWFsb2cgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9TVFJJTkc6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19zdHJpbmcgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9GT05URElSOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZm9udGRpciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0ZPTlQ6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9GT05ULCBkYXRhLCBsZW5ndGgpOwotCWNhc2UgUlRfQUNDRUxFUkFUT1I6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9SQ0RBVEE6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19yY2RhdGEgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9NRVNTQUdFVEFCTEU6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9NRVNTQUdFVEFCTEUsIGRhdGEsIGxlbmd0aCk7Ci0JY2FzZSBSVF9HUk9VUF9DVVJTT1I6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19ncm91cF9jdXJzb3IgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9HUk9VUF9JQ09OOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZ3JvdXBfaWNvbiAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX1ZFUlNJT046Ci0JICByZXR1cm4gYmluX3RvX3Jlc192ZXJzaW9uIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCX0KLSAgICB9Ci19Ci0KLS8qIEdpdmUgYW4gZXJyb3IgaWYgdGhlIGJpbmFyeSBkYXRhIGlzIHRvbyBzbWFsbC4gICovCi0KLXN0YXRpYyB2b2lkCi10b29zbWFsbCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZhdGFsIChfKCIlczogbm90IGVub3VnaCBiaW5hcnkgZGF0YSIpLCBtc2cpOwotfQotCi0vKiBTd2FwIGluIGEgTlVMTCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nLiAgKi8KLQotc3RhdGljIHVuaWNoYXIgKgotZ2V0X3VuaWNvZGUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgcmV0bGVuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci0gICAgIGludCAqcmV0bGVuOwotewotICBpbnQgYywgaTsKLSAgdW5pY2hhciAqcmV0OwotCi0gIGMgPSAwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAobGVuZ3RoIDwgKHVuc2lnbmVkIGxvbmcpIGMgKiAyICsgMikKLQl0b29zbWFsbCAoXygibnVsbCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nIikpOwotICAgICAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIGMgKiAyKSA9PSAwKQotCWJyZWFrOwotICAgICAgKytjOwotICAgIH0KLQotICByZXQgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKChjICsgMSkgKiBzaXplb2YgKHVuaWNoYXIpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHJldFtpXSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIGkgKiAyKTsKLSAgcmV0W2ldID0gMDsKLQotICBpZiAocmV0bGVuICE9IE5VTEwpCi0gICAgKnJldGxlbiA9IGM7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogR2V0IGEgcmVzb3VyY2UgaWRlbnRpZmllci4gIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfcmVzaWQgKGlkLCBkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIHN0cnVjdCByZXNfaWQgKmlkOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCBmaXJzdDsKLQotICBpZiAobGVuZ3RoIDwgMikKLSAgICB0b29zbWFsbCAoXygicmVzb3VyY2UgSUQiKSk7Ci0KLSAgZmlyc3QgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICBpZiAoZmlyc3QgPT0gMHhmZmZmKQotICAgIHsKLSAgICAgIGlmIChsZW5ndGggPCA0KQotCXRvb3NtYWxsIChfKCJyZXNvdXJjZSBJRCIpKTsKLSAgICAgIGlkLT5uYW1lZCA9IDA7Ci0gICAgICBpZC0+dS5pZCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWQtPm5hbWVkID0gMTsKLSAgICAgIGlkLT51Lm4ubmFtZSA9IGdldF91bmljb2RlIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICZpZC0+dS5uLmxlbmd0aCk7Ci0gICAgICByZXR1cm4gaWQtPnUubi5sZW5ndGggKiAyICsgMjsKLSAgICB9Ci19Ci0KLS8qIENvbnZlcnQgYSByZXNvdXJjZSB3aGljaCBqdXN0IHN0b3JlcyB1bmludGVycHJldGVkIGRhdGEgZnJvbQotICAgYmluYXJ5LiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2dlbmVyaWMgKHR5cGUsIGRhdGEsIGxlbmd0aCkKLSAgICAgZW51bSByZXNfdHlwZSB0eXBlOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLXsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gdHlwZTsKLSAgci0+dS5kYXRhLmRhdGEgPSBkYXRhOwotICByLT51LmRhdGEubGVuZ3RoID0gbGVuZ3RoOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgY3Vyc29yIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBjdXJzb3IgKmM7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDQpCi0gICAgdG9vc21hbGwgKF8oImN1cnNvciIpKTsKLQotICBjID0gKHN0cnVjdCBjdXJzb3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmMpOwotICBjLT54aG90c3BvdCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gIGMtPnlob3RzcG90ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gIGMtPmxlbmd0aCA9IGxlbmd0aCAtIDQ7Ci0gIGMtPmRhdGEgPSBkYXRhICsgNDsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfQ1VSU09SOwotICByLT51LmN1cnNvciA9IGM7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBtZW51IHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX21lbnUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBzdHJ1Y3QgbWVudSAqbTsKLSAgaW50IHZlcnNpb24sIHJlYWQ7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX01FTlU7Ci0KLSAgbSA9IChzdHJ1Y3QgbWVudSAqKSByZXNfYWxsb2MgKHNpemVvZiAqbSk7Ci0gIHItPnUubWVudSA9IG07Ci0KLSAgaWYgKGxlbmd0aCA8IDIpCi0gICAgdG9vc21hbGwgKF8oIm1lbnUgaGVhZGVyIikpOwotCi0gIHZlcnNpb24gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotCi0gIGlmICh2ZXJzaW9uID09IDApCi0gICAgewotICAgICAgaWYgKGxlbmd0aCA8IDQpCi0JdG9vc21hbGwgKF8oIm1lbnUgaGVhZGVyIikpOwotICAgICAgbS0+aGVscCA9IDA7Ci0gICAgICBtLT5pdGVtcyA9IGJpbl90b19yZXNfbWVudWl0ZW1zIChkYXRhICsgNCwgbGVuZ3RoIC0gNCwgYmlnX2VuZGlhbiwKLQkJCQkgICAgICAgJnJlYWQpOwotICAgIH0KLSAgZWxzZSBpZiAodmVyc2lvbiA9PSAxKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA4KQotCXRvb3NtYWxsIChfKCJtZW51ZXggaGVhZGVyIikpOwotICAgICAgbS0+aGVscCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgb2Zmc2V0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICAgICBpZiAob2Zmc2V0ICsgNCA+PSBsZW5ndGgpCi0JdG9vc21hbGwgKF8oIm1lbnVleCBvZmZzZXQiKSk7Ci0gICAgICBtLT5pdGVtcyA9IGJpbl90b19yZXNfbWVudWV4aXRlbXMgKGRhdGEgKyA0ICsgb2Zmc2V0LAotCQkJCQkgbGVuZ3RoIC0gKDQgKyBvZmZzZXQpLAotCQkJCQkgYmlnX2VuZGlhbiwKLQkJCQkJICZyZWFkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmYXRhbCAoXygidW5zdXBwb3J0ZWQgbWVudSB2ZXJzaW9uICVkIiksIHZlcnNpb24pOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IG1lbnUgaXRlbXMgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IG1lbnVpdGVtICoKLWJpbl90b19yZXNfbWVudWl0ZW1zIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sIHJlYWQpCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLSAgICAgaW50ICpyZWFkOwotewotICBzdHJ1Y3QgbWVudWl0ZW0gKmZpcnN0LCAqKnBwOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgKnJlYWQgPSAwOwotCi0gIHdoaWxlIChsZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGludCBmbGFncywgc2xlbiwgaXRlbWxlbjsKLSAgICAgIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0gICAgICBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gICAgICBpZiAobGVuZ3RoIDwgNCkKLQl0b29zbWFsbCAoXygibWVudWl0ZW0gaGVhZGVyIikpOwotCi0gICAgICBtaSA9IChzdHJ1Y3QgbWVudWl0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKm1pKTsKLSAgICAgIG1pLT5zdGF0ZSA9IDA7Ci0gICAgICBtaS0+aGVscCA9IDA7Ci0KLSAgICAgIGZsYWdzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIG1pLT50eXBlID0gZmxhZ3MgJn4gKE1FTlVJVEVNX1BPUFVQIHwgTUVOVUlURU1fRU5ETUVOVSk7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiBNRU5VSVRFTV9QT1BVUCkgPT0gMCkKLQlzdHJvZmYgPSA0OwotICAgICAgZWxzZQotCXN0cm9mZiA9IDI7Ci0KLSAgICAgIGlmIChsZW5ndGggPCBzdHJvZmYgKyAyKQotCXRvb3NtYWxsIChfKCJtZW51aXRlbSBoZWFkZXIiKSk7Ci0KLSAgICAgIGlmIChnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBzdHJvZmYpID09IDApCi0JewotCSAgc2xlbiA9IDA7Ci0JICBtaS0+dGV4dCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCW1pLT50ZXh0ID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyBzdHJvZmYsIGxlbmd0aCAtIHN0cm9mZiwgYmlnX2VuZGlhbiwKLQkJCQkmc2xlbik7Ci0KLSAgICAgIGl0ZW1sZW4gPSBzdHJvZmYgKyBzbGVuICogMiArIDI7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiBNRU5VSVRFTV9QT1BVUCkgPT0gMCkKLQl7Ci0JICBtaS0+cG9wdXAgPSBOVUxMOwotCSAgbWktPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBzdWJyZWFkOwotCi0JICBtaS0+aWQgPSAwOwotCSAgbWktPnBvcHVwID0gYmluX3RvX3Jlc19tZW51aXRlbXMgKGRhdGEgKyBpdGVtbGVuLCBsZW5ndGggLSBpdGVtbGVuLAotCQkJCQkgICAgYmlnX2VuZGlhbiwgJnN1YnJlYWQpOwotCSAgaXRlbWxlbiArPSBzdWJyZWFkOwotCX0KLQotICAgICAgbWktPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gbWk7Ci0gICAgICBwcCA9ICZtaS0+bmV4dDsKLQotICAgICAgZGF0YSArPSBpdGVtbGVuOwotICAgICAgbGVuZ3RoIC09IGl0ZW1sZW47Ci0gICAgICAqcmVhZCArPSBpdGVtbGVuOwotCi0gICAgICBpZiAoKGZsYWdzICYgTUVOVUlURU1fRU5ETUVOVSkgIT0gMCkKLQlyZXR1cm4gZmlyc3Q7Ci0gICAgfQotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBtZW51ZXggaXRlbXMgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IG1lbnVpdGVtICoKLWJpbl90b19yZXNfbWVudWV4aXRlbXMgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgcmVhZCkKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotICAgICBpbnQgKnJlYWQ7Ci17Ci0gIHN0cnVjdCBtZW51aXRlbSAqZmlyc3QsICoqcHA7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICAqcmVhZCA9IDA7Ci0KLSAgd2hpbGUgKGxlbmd0aCA+IDApCi0gICAgewotICAgICAgaW50IGZsYWdzLCBzbGVuOwotICAgICAgdW5zaWduZWQgaW50IGl0ZW1sZW47Ci0gICAgICBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gICAgICBpZiAobGVuZ3RoIDwgMTQpCi0JdG9vc21hbGwgKF8oIm1lbnVpdGVtIGhlYWRlciIpKTsKLQotICAgICAgbWkgPSAoc3RydWN0IG1lbnVpdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICptaSk7Ci0gICAgICBtaS0+dHlwZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBtaS0+c3RhdGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIG1pLT5pZCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOwotCi0gICAgICBmbGFncyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEwKTsKLQotICAgICAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKSA9PSAwKQotCXsKLQkgIHNsZW4gPSAwOwotCSAgbWktPnRleHQgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQltaS0+dGV4dCA9IGdldF91bmljb2RlIChkYXRhICsgMTIsIGxlbmd0aCAtIDEyLCBiaWdfZW5kaWFuLCAmc2xlbik7Ci0KLSAgICAgIGl0ZW1sZW4gPSAxMiArIHNsZW4gKiAyICsgMjsKLSAgICAgIGl0ZW1sZW4gPSAoaXRlbWxlbiArIDMpICZ+IDM7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiAxKSA9PSAwKQotCXsKLQkgIG1pLT5wb3B1cCA9IE5VTEw7Ci0JICBtaS0+aGVscCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBzdWJyZWFkOwotCi0JICBpZiAobGVuZ3RoIDwgaXRlbWxlbiArIDQpCi0JICAgIHRvb3NtYWxsIChfKCJtZW51aXRlbSIpKTsKLQkgIG1pLT5oZWxwID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgaXRlbWxlbik7Ci0JICBpdGVtbGVuICs9IDQ7Ci0KLQkgIG1pLT5wb3B1cCA9IGJpbl90b19yZXNfbWVudWV4aXRlbXMgKGRhdGEgKyBpdGVtbGVuLAotCQkJCQkgICAgICBsZW5ndGggLSBpdGVtbGVuLAotCQkJCQkgICAgICBiaWdfZW5kaWFuLCAmc3VicmVhZCk7Ci0JICBpdGVtbGVuICs9IHN1YnJlYWQ7Ci0JfQotCi0gICAgICBtaS0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBtaTsKLSAgICAgIHBwID0gJm1pLT5uZXh0OwotCi0gICAgICBkYXRhICs9IGl0ZW1sZW47Ci0gICAgICBsZW5ndGggLT0gaXRlbWxlbjsKLSAgICAgICpyZWFkICs9IGl0ZW1sZW47Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiAweDgwKSAhPSAwKQotCXJldHVybiBmaXJzdDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgZGlhbG9nIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19kaWFsb2cgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdmVyc2lvbjsKLSAgc3RydWN0IGRpYWxvZyAqZDsKLSAgaW50IGMsIHN1YmxlbiwgaTsKLSAgdW5zaWduZWQgaW50IG9mZjsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDE4KQotICAgIHRvb3NtYWxsIChfKCJkaWFsb2cgaGVhZGVyIikpOwotCi0gIGQgPSAoc3RydWN0IGRpYWxvZyAqKSByZXNfYWxsb2MgKHNpemVvZiAqZCk7Ci0KLSAgdmVyc2lvbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gIGlmICh2ZXJzaW9uICE9IDEpCi0gICAgewotICAgICAgZC0+ZXggPSBOVUxMOwotICAgICAgZC0+c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgZC0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgb2ZmID0gODsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc2lnbmF0dXJlOwotCi0gICAgICBzaWduYXR1cmUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGlmIChzaWduYXR1cmUgIT0gMHhmZmZmKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGRpYWxvZyBzaWduYXR1cmUgJWQiKSwgc2lnbmF0dXJlKTsKLQotICAgICAgZC0+ZXggPSAoc3RydWN0IGRpYWxvZ19leCAqKSByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpOwotICAgICAgZC0+ZXgtPmhlbHAgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGQtPmV4c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGQtPnN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMTIpOwotICAgICAgb2ZmID0gMTY7Ci0gICAgfQotCi0gIGlmIChsZW5ndGggPCBvZmYgKyAxMCkKLSAgICB0b29zbWFsbCAoXygiZGlhbG9nIGhlYWRlciIpKTsKLQotICBjID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLSAgZC0+eCA9IGdldF8xNiAgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyAyKTsKLSAgZC0+eSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotICBkLT53aWR0aCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDYpOwotICBkLT5oZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKLQotICBvZmYgKz0gMTA7Ci0KLSAgc3VibGVuID0gZ2V0X3Jlc2lkICgmZC0+bWVudSwgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgb2ZmICs9IHN1YmxlbjsKLQotICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkLT5jbGFzcywgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgb2ZmICs9IHN1YmxlbjsKLQotICBkLT5jYXB0aW9uID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbiwgJnN1Ymxlbik7Ci0gIG9mZiArPSBzdWJsZW4gKiAyICsgMjsKLQotICBpZiAoKGQtPnN0eWxlICYgRFNfU0VURk9OVCkgPT0gMCkKLSAgICB7Ci0gICAgICBkLT5wb2ludHNpemUgPSAwOwotICAgICAgZC0+Zm9udCA9IE5VTEw7Ci0gICAgICBpZiAoZC0+ZXggIT0gTlVMTCkKLQl7Ci0JICBkLT5leC0+d2VpZ2h0ID0gMDsKLQkgIGQtPmV4LT5pdGFsaWMgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGVuZ3RoIDwgb2ZmICsgMikKLQl0b29zbWFsbCAoXygiZGlhbG9nIGZvbnQgcG9pbnQgc2l6ZSIpKTsKLQotICAgICAgZC0+cG9pbnRzaXplID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLSAgICAgIG9mZiArPSAyOwotCi0gICAgICBpZiAoZC0+ZXggIT0gTlVMTCkKLQl7Ci0JICBpZiAobGVuZ3RoIDwgb2ZmICsgNCkKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZ2V4IGZvbnQgaW5mb3JtYXRpb24iKSk7Ci0JICBkLT5leC0+d2VpZ2h0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLQkgIGQtPmV4LT5pdGFsaWMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyAyKTsKLQkgIG9mZiArPSA0OwotCX0KLQotICAgICAgZC0+Zm9udCA9IGdldF91bmljb2RlIChkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4sICZzdWJsZW4pOwotICAgICAgb2ZmICs9IHN1YmxlbiAqIDIgKyAyOwotICAgIH0KLQotICBkLT5jb250cm9scyA9IE5VTEw7Ci0gIHBwID0gJmQtPmNvbnRyb2xzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkYzsKLSAgICAgIGludCBkYXRhbGVuOwotCi0gICAgICBvZmYgPSAob2ZmICsgMykgJn4gMzsKLQotICAgICAgZGMgPSAoc3RydWN0IGRpYWxvZ19jb250cm9sICopIHJlc19hbGxvYyAoc2l6ZW9mICpkYyk7Ci0KLSAgICAgIGlmIChkLT5leCA9PSBOVUxMKQotCXsKLQkgIGlmIChsZW5ndGggPCBvZmYgKyA4KQotCSAgICB0b29zbWFsbCAoXygiZGlhbG9nIGNvbnRyb2wiKSk7Ci0KLQkgIGRjLT5zdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0JICBkYy0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotCSAgZGMtPmhlbHAgPSAwOwotCSAgb2ZmICs9IDg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChsZW5ndGggPCBvZmYgKyAxMikKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZ2V4IGNvbnRyb2wiKSk7Ci0JICBkYy0+aGVscCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0JICBkYy0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotCSAgZGMtPnN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgOCk7Ci0JICBvZmYgKz0gMTI7Ci0JfQotCi0gICAgICBpZiAobGVuZ3RoIDwgb2ZmICsgMTApCi0JdG9vc21hbGwgKF8oImRpYWxvZyBjb250cm9sIikpOwotCi0gICAgICBkYy0+eCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0gICAgICBkYy0+eSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDIpOwotICAgICAgZGMtPndpZHRoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNCk7Ci0gICAgICBkYy0+aGVpZ2h0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNik7Ci0KLSAgICAgIGlmIChkLT5leCAhPSBOVUxMKQotICAgICAgICBkYy0+aWQgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKLSAgICAgIGVsc2UKLSAgICAgICAgZGMtPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgOCk7Ci0KLSAgICAgIG9mZiArPSAxMCArIChkLT5leCAhPSBOVUxMID8gMiA6IDApOwotCi0gICAgICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkYy0+Y2xhc3MsIGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbik7Ci0gICAgICBvZmYgKz0gc3VibGVuOwotCi0gICAgICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkYy0+dGV4dCwgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgICAgIG9mZiArPSBzdWJsZW47Ci0KLSAgICAgIGlmIChsZW5ndGggPCBvZmYgKyAyKQotCXRvb3NtYWxsIChfKCJkaWFsb2cgY29udHJvbCBlbmQiKSk7Ci0KLSAgICAgIGRhdGFsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOwotICAgICAgb2ZmICs9IDI7Ci0KLSAgICAgIGlmIChkYXRhbGVuID09IDApCi0JZGMtPmRhdGEgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIG9mZiA9IChvZmYgKyAzKSAmfiAzOwotCi0JICBpZiAobGVuZ3RoIDwgb2ZmICsgZGF0YWxlbikKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZyBjb250cm9sIGRhdGEiKSk7Ci0KLQkgIGRjLT5kYXRhID0gKChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikKLQkJICAgICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCByY2RhdGFfaXRlbSkpKTsKLQkgIGRjLT5kYXRhLT5uZXh0ID0gTlVMTDsKLQkgIGRjLT5kYXRhLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKLQkgIGRjLT5kYXRhLT51LmJ1ZmZlci5sZW5ndGggPSBkYXRhbGVuOwotCSAgZGMtPmRhdGEtPnUuYnVmZmVyLmRhdGEgPSBkYXRhICsgb2ZmOwotCi0JICBvZmYgKz0gZGF0YWxlbjsJICAKLQl9Ci0KLSAgICAgIGRjLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGRjOwotICAgICAgcHAgPSAmZGMtPm5leHQ7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9ESUFMT0c7Ci0gIHItPnUuZGlhbG9nID0gZDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIHN0cmluZ3RhYmxlIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19zdHJpbmcgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3Qgc3RyaW5ndGFibGUgKnN0OwotICBpbnQgaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBzdCA9IChzdHJ1Y3Qgc3RyaW5ndGFibGUgKikgcmVzX2FsbG9jIChzaXplb2YgKnN0KTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2xlbjsKLQotICAgICAgaWYgKGxlbmd0aCA8IDIpCi0JdG9vc21hbGwgKF8oInN0cmluZ3RhYmxlIHN0cmluZyBsZW5ndGgiKSk7Ci0gICAgICBzbGVuID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIHN0LT5zdHJpbmdzW2ldLmxlbmd0aCA9IHNsZW47Ci0KLSAgICAgIGlmIChzbGVuID4gMCkKLQl7Ci0JICB1bmljaGFyICpzOwotCSAgdW5zaWduZWQgaW50IGo7Ci0KLQkgIGlmIChsZW5ndGggPCAyICsgMiAqIHNsZW4pCi0JICAgIHRvb3NtYWxsIChfKCJzdHJpbmd0YWJsZSBzdHJpbmciKSk7Ci0KLQkgIHMgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKHNsZW4gKiBzaXplb2YgKHVuaWNoYXIpKTsKLQkgIHN0LT5zdHJpbmdzW2ldLnN0cmluZyA9IHM7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBzbGVuOyBqKyspCi0JICAgIHNbal0gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyICsgaiAqIDIpOwotCX0KLQotICAgICAgZGF0YSArPSAyICsgMiAqIHNsZW47Ci0gICAgICBsZW5ndGggLT0gMiArIDIgKiBzbGVuOwotICAgIH0KLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfU1RSSU5HVEFCTEU7Ci0gIHItPnUuc3RyaW5ndGFibGUgPSBzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIGZvbnRkaXIgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2ZvbnRkaXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgYywgaTsKLSAgc3RydWN0IGZvbnRkaXIgKmZpcnN0LCAqKnBwOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlmIChsZW5ndGggPCAyKQotICAgIHRvb3NtYWxsIChfKCJmb250ZGlyIGhlYWRlciIpKTsKLQotICBjID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGZvbnRkaXIgKmZkOwotICAgICAgdW5zaWduZWQgaW50IG9mZjsKLQotICAgICAgaWYgKGxlbmd0aCA8IDU2KQotCXRvb3NtYWxsIChfKCJmb250ZGlyIikpOwotCi0gICAgICBmZCA9IChzdHJ1Y3QgZm9udGRpciAqKSByZXNfYWxsb2MgKHNpemVvZiAqZmQpOwotICAgICAgZmQtPmluZGV4ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQotICAgICAgLyogVG8gd29yayBvdXQgdGhlIGxlbmd0aCBvZiB0aGUgZm9udGRpciBkYXRhLCB3ZSBtdXN0IGdldCB0aGUKLSAgICAgICAgIGxlbmd0aCBvZiB0aGUgZGV2aWNlIG5hbWUgYW5kIGZhY2UgbmFtZSBzdHJpbmdzLCBldmVuIHRob3VnaAotICAgICAgICAgd2UgZG9uJ3Qgc3RvcmUgdGhlbSBpbiB0aGUgZm9udGRpciBzdHJ1Y3R1cmUuICBUaGUKLSAgICAgICAgIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IHRoZXNlIGFyZSBOVUxMIHRlcm1pbmF0ZWQgY2hhcgotICAgICAgICAgc3RyaW5ncywgbm90IFVuaWNvZGUgc3RyaW5ncy4gICovCi0KLSAgICAgIG9mZiA9IDU2OwotCi0gICAgICB3aGlsZSAob2ZmIDwgbGVuZ3RoICYmIGRhdGFbb2ZmXSAhPSAnXDAnKQotCSsrb2ZmOwotICAgICAgaWYgKG9mZiA+PSBsZW5ndGgpCi0JdG9vc21hbGwgKF8oImZvbnRkaXIgZGV2aWNlIG5hbWUiKSk7Ci0gICAgICArK29mZjsKLQotICAgICAgd2hpbGUgKG9mZiA8IGxlbmd0aCAmJiBkYXRhW29mZl0gIT0gJ1wwJykKLQkrK29mZjsKLSAgICAgIGlmIChvZmYgPj0gbGVuZ3RoKQotCXRvb3NtYWxsIChfKCJmb250ZGlyIGZhY2UgbmFtZSIpKTsKLSAgICAgICsrb2ZmOwotCi0gICAgICBmZC0+bGVuZ3RoID0gb2ZmOwotICAgICAgZmQtPmRhdGEgPSBkYXRhOwotCi0gICAgICBmZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBmZDsKLSAgICAgIHBwID0gJmZkLT5uZXh0OwotCi0gICAgICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGFueSByb3VuZGluZyBpcwotICAgICAgICAgcmVxdWlyZWQuICAqLwotCi0gICAgICBkYXRhICs9IG9mZjsKLSAgICAgIGxlbmd0aCAtPSBvZmY7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9GT05URElSOwotICByLT51LmZvbnRkaXIgPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhbiBhY2NlbGVyYXRvcnMgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2FjY2VsZXJhdG9ycyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciAqZmlyc3QsICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmE7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA4KQotCXRvb3NtYWxsIChfKCJhY2NlbGVyYXRvciIpKTsKLQotICAgICAgYSA9IChzdHJ1Y3QgYWNjZWxlcmF0b3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmEpOwotCi0gICAgICBhLT5mbGFncyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBhLT5rZXkgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGEtPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0KLSAgICAgIGEtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gYTsKLSAgICAgIHBwID0gJmEtPm5leHQ7Ci0KLSAgICAgIGlmICgoYS0+ZmxhZ3MgJiBBQ0NfTEFTVCkgIT0gMCkKLQlicmVhazsKLQotICAgICAgZGF0YSArPSA4OwotICAgICAgbGVuZ3RoIC09IDg7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjsKLSAgci0+dS5hY2MgPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhbiByY2RhdGEgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3JjZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgcmkgPSAoc3RydWN0IHJjZGF0YV9pdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICpyaSk7Ci0KLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IFJDREFUQV9CVUZGRVI7Ci0gIHJpLT51LmJ1ZmZlci5sZW5ndGggPSBsZW5ndGg7Ci0gIHJpLT51LmJ1ZmZlci5kYXRhID0gZGF0YTsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfUkNEQVRBOwotICByLT51LnJjZGF0YSA9IHJpOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgZ3JvdXAgY3Vyc29yIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19ncm91cF9jdXJzb3IgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdHlwZSwgYywgaTsKLSAgc3RydWN0IGdyb3VwX2N1cnNvciAqZmlyc3QsICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDYpCi0gICAgdG9vc21hbGwgKF8oImdyb3VwIGN1cnNvciBoZWFkZXIiKSk7Ci0KLSAgdHlwZSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICBpZiAodHlwZSAhPSAyKQotICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIGdyb3VwIGN1cnNvciB0eXBlICVkIiksIHR5cGUpOwotCi0gIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLQotICBkYXRhICs9IDY7Ci0gIGxlbmd0aCAtPSA2OwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpnYzsKLQotICAgICAgaWYgKGxlbmd0aCA8IDE0KQotCXRvb3NtYWxsIChfKCJncm91cCBjdXJzb3IiKSk7Ci0KLSAgICAgIGdjID0gKHN0cnVjdCBncm91cF9jdXJzb3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmdjKTsKLQotICAgICAgZ2MtPndpZHRoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIGdjLT5oZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGdjLT5wbGFuZXMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGdjLT5iaXRzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNik7Ci0gICAgICBnYy0+Ynl0ZXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGdjLT5pbmRleCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKTsKLQotICAgICAgZ2MtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZ2M7Ci0gICAgICBwcCA9ICZnYy0+bmV4dDsKLQotICAgICAgZGF0YSArPSAxNDsKLSAgICAgIGxlbmd0aCAtPSAxNDsKLSAgICB9Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0dST1VQX0NVUlNPUjsKLSAgci0+dS5ncm91cF9jdXJzb3IgPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIGdyb3VwIGljb24gcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2dyb3VwX2ljb24gKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdHlwZSwgYywgaTsKLSAgc3RydWN0IGdyb3VwX2ljb24gKmZpcnN0LCAqKnBwOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlmIChsZW5ndGggPCA2KQotICAgIHRvb3NtYWxsIChfKCJncm91cCBpY29uIGhlYWRlciIpKTsKLQotICB0eXBlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gIGlmICh0eXBlICE9IDEpCi0gICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgZ3JvdXAgaWNvbiB0eXBlICVkIiksIHR5cGUpOwotCi0gIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLQotICBkYXRhICs9IDY7Ci0gIGxlbmd0aCAtPSA2OwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ2k7Ci0KLSAgICAgIGlmIChsZW5ndGggPCAxNCkKLQl0b29zbWFsbCAoXygiZ3JvdXAgaWNvbiIpKTsKLQotICAgICAgZ2kgPSAoc3RydWN0IGdyb3VwX2ljb24gKikgcmVzX2FsbG9jIChzaXplb2YgKmdpKTsKLQotICAgICAgZ2ktPndpZHRoID0gZGF0YVswXTsKLSAgICAgIGdpLT5oZWlnaHQgPSBkYXRhWzFdOwotICAgICAgZ2ktPmNvbG9ycyA9IGRhdGFbMl07Ci0gICAgICBnaS0+cGxhbmVzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0gICAgICBnaS0+Yml0cyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDYpOwotICAgICAgZ2ktPmJ5dGVzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgOCk7Ci0gICAgICBnaS0+aW5kZXggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMik7Ci0KLSAgICAgIGdpLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGdpOwotICAgICAgcHAgPSAmZ2ktPm5leHQ7Ci0KLSAgICAgIGRhdGEgKz0gMTQ7Ci0gICAgICBsZW5ndGggLT0gMTQ7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9HUk9VUF9JQ09OOwotICByLT51Lmdyb3VwX2ljb24gPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogRXh0cmFjdCBkYXRhIGZyb20gYSB2ZXJzaW9uIGhlYWRlci4gIElmIEtFWSBpcyBub3QgTlVMTCwgdGhlbiB0aGUKLSAgIGtleSBtdXN0IGJlIEtFWTsgb3RoZXJ3aXNlLCB0aGUga2V5IGlzIHJldHVybmVkIGluICpQS0VZLiAgVGhpcwotICAgc2V0cyAqTEVOIHRvIHRoZSB0b3RhbCBsZW5ndGgsICpWQUxMRU4gdG8gdGhlIHZhbHVlIGxlbmd0aCwgKlRZUEUKLSAgIHRvIHRoZSB0eXBlLCBhbmQgKk9GRiB0byB0aGUgb2Zmc2V0IHRvIHRoZSBjaGlsZHJlbi4gICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwga2V5LCBwa2V5LCBsZW4sIHZhbGxlbiwgdHlwZSwKLQkJICAgIG9mZikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotICAgICBjb25zdCBjaGFyICprZXk7Ci0gICAgIHVuaWNoYXIgKipwa2V5OwotICAgICBpbnQgKmxlbjsKLSAgICAgaW50ICp2YWxsZW47Ci0gICAgIGludCAqdHlwZTsKLSAgICAgaW50ICpvZmY7Ci17Ci0gIGlmIChsZW5ndGggPCA4KQotICAgIHRvb3NtYWxsIChrZXkpOwotCi0gICpsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAqdmFsbGVuID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICp0eXBlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0KLSAgKm9mZiA9IDY7Ci0KLSAgbGVuZ3RoIC09IDY7Ci0gIGRhdGEgKz0gNjsKLQotICBpZiAoa2V5ID09IE5VTEwpCi0gICAgewotICAgICAgaW50IHN1YmxlbjsKLQotICAgICAgKnBrZXkgPSBnZXRfdW5pY29kZSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAmc3VibGVuKTsKLSAgICAgICpvZmYgKz0gc3VibGVuICogMiArIDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKDEpCi0JewotCSAgaWYgKGxlbmd0aCA8IDIpCi0JICAgIHRvb3NtYWxsIChrZXkpOwotCSAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSkgIT0gKHVuc2lnbmVkIGNoYXIpICprZXkpCi0JICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIikpOwotCi0JICAqb2ZmICs9IDI7Ci0JICBsZW5ndGggLT0gMjsKLQkgIGRhdGEgKz0gMjsKLQotCSAgaWYgKCprZXkgPT0gJ1wwJykKLQkgICAgYnJlYWs7Ci0KLQkgICsra2V5OwotCX0KLSAgICB9Ci0KLSAgKm9mZiA9ICgqb2ZmICsgMykgJn4gMzsKLX0KLQotLyogQ29udmVydCBhIHZlcnNpb24gcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3ZlcnNpb24gKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdmVybGVuLCB2YWxsZW4sIHR5cGUsIG9mZjsKLSAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaTsKLSAgc3RydWN0IHZlcl9pbmZvICpmaXJzdCwgKipwcDsKLSAgc3RydWN0IHZlcnNpb25pbmZvICp2OwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAiVlNfVkVSU0lPTl9JTkZPIiwKLQkJICAgICAgKHVuaWNoYXIgKikgTlVMTCwgJnZlcmxlbiwgJnZhbGxlbiwgJnR5cGUsICZvZmYpOwotCi0gIGlmICgodW5zaWduZWQgaW50KSB2ZXJsZW4gIT0gbGVuZ3RoKQotICAgIGZhdGFsIChfKCJ2ZXJzaW9uIGxlbmd0aCAlZCBkb2VzIG5vdCBtYXRjaCByZXNvdXJjZSBsZW5ndGggJWx1IiksCi0JICAgdmVybGVuLCBsZW5ndGgpOwotCi0gIGlmICh0eXBlICE9IDApCi0gICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiB0eXBlICVkIiksIHR5cGUpOwotCi0gIGRhdGEgKz0gb2ZmOwotICBsZW5ndGggLT0gb2ZmOwotCi0gIGlmICh2YWxsZW4gPT0gMCkKLSAgICBmaSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZSwgZml2OwotCi0gICAgICBpZiAodmFsbGVuICE9IDUyKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24gbGVuZ3RoICVkIiksIHZhbGxlbik7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA1MikKLQl0b29zbWFsbCAoXygiZml4ZWQgdmVyc2lvbiBpbmZvIikpOwotCi0gICAgICBzaWduYXR1cmUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgaWYgKHNpZ25hdHVyZSAhPSAweGZlZWYwNGJkKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gc2lnbmF0dXJlICVsdSIpLCBzaWduYXR1cmUpOwotCi0gICAgICBmaXYgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGlmIChmaXYgIT0gMCAmJiBmaXYgIT0gMHgxMDAwMCkKLQlmYXRhbCAoXygidW5leHBlY3RlZCBmaXhlZCB2ZXJzaW9uIGluZm8gdmVyc2lvbiAlbHUiKSwgZml2KTsKLQotICAgICAgZmkgPSAoc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICpmaSk7Ci0KLSAgICAgIGZpLT5maWxlX3ZlcnNpb25fbXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGZpLT5maWxlX3ZlcnNpb25fbHMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMik7Ci0gICAgICBmaS0+cHJvZHVjdF92ZXJzaW9uX21zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMTYpOwotICAgICAgZmktPnByb2R1Y3RfdmVyc2lvbl9scyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDIwKTsKLSAgICAgIGZpLT5maWxlX2ZsYWdzX21hc2sgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAyNCk7Ci0gICAgICBmaS0+ZmlsZV9mbGFncyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDI4KTsKLSAgICAgIGZpLT5maWxlX29zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMzIpOwotICAgICAgZmktPmZpbGVfdHlwZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDM2KTsKLSAgICAgIGZpLT5maWxlX3N1YnR5cGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0MCk7Ci0gICAgICBmaS0+ZmlsZV9kYXRlX21zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNDQpOwotICAgICAgZmktPmZpbGVfZGF0ZV9scyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQ4KTsKLQotICAgICAgZGF0YSArPSA1MjsKLSAgICAgIGxlbmd0aCAtPSA1MjsKLSAgICB9Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICB3aGlsZSAobGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZpOwotICAgICAgaW50IGNoOwotCi0gICAgICBpZiAobGVuZ3RoIDwgOCkKLQl0b29zbWFsbCAoXygidmVyc2lvbiB2YXIgaW5mbyIpKTsKLQotICAgICAgdmkgPSAoc3RydWN0IHZlcl9pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2aSk7Ci0KLSAgICAgIGNoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNik7Ci0KLSAgICAgIGlmIChjaCA9PSAnUycpCi0JewotCSAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICoqcHB2czsKLQotCSAgdmktPnR5cGUgPSBWRVJJTkZPX1NUUklORzsKLQotCSAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICJTdHJpbmdGaWxlSW5mbyIsCi0JCQkgICAgICAodW5pY2hhciAqKSBOVUxMLCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwKLQkJCSAgICAgICZvZmYpOwotCi0JICBpZiAodmFsbGVuICE9IDApCi0JICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHN0cmluZ2ZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICBkYXRhICs9IG9mZjsKLQkgIGxlbmd0aCAtPSBvZmY7Ci0KLQkgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJICAgICAgJnZpLT51LnN0cmluZy5sYW5ndWFnZSwgJnZlcmxlbiwgJnZhbGxlbiwKLQkJCSAgICAgICZ0eXBlLCAmb2ZmKTsKLQotCSAgaWYgKHZhbGxlbiAhPSAwKQotCSAgICBmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZ3RhYmxlIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICBkYXRhICs9IG9mZjsKLQkgIGxlbmd0aCAtPSBvZmY7Ci0JICB2ZXJsZW4gLT0gb2ZmOwotCi0JICB2aS0+dS5zdHJpbmcuc3RyaW5ncyA9IE5VTEw7Ci0JICBwcHZzID0gJnZpLT51LnN0cmluZy5zdHJpbmdzOwotCi0JICAvKiBJdCdzIGNvbnZlbmllbnQgdG8gcm91bmQgdmVybGVuIHRvIGEgNCBieXRlIGFsaWdubWVudCwKLSAgICAgICAgICAgICBzaW5jZSB3ZSByb3VuZCB0aGUgc3VidmFyaWFibGVzIGluIHRoZSBsb29wLiAgKi8KLQkgIHZlcmxlbiA9ICh2ZXJsZW4gKyAzKSAmfiAzOwotCi0JICB3aGlsZSAodmVybGVuID4gMCkKLQkgICAgewotCSAgICAgIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqdnM7Ci0JICAgICAgaW50IHN1YnZlcmxlbiwgdnNsZW4sIHZhbG9mZjsKLQotCSAgICAgIHZzID0gKHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnMpOwotCi0JICAgICAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sCi0JCQkJICAoY29uc3QgY2hhciAqKSBOVUxMLCAmdnMtPmtleSwgJnN1YnZlcmxlbiwKLQkJCQkgICZ2YWxsZW4sICZ0eXBlLCAmb2ZmKTsKLQotCSAgICAgIHN1YnZlcmxlbiA9IChzdWJ2ZXJsZW4gKyAzKSAmfiAzOwotCi0JICAgICAgZGF0YSArPSBvZmY7Ci0JICAgICAgbGVuZ3RoIC09IG9mZjsKLQotCSAgICAgIHZzLT52YWx1ZSA9IGdldF91bmljb2RlIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICZ2c2xlbik7Ci0JICAgICAgdmFsb2ZmID0gdnNsZW4gKiAyICsgMjsKLQkgICAgICB2YWxvZmYgPSAodmFsb2ZmICsgMykgJn4gMzsKLQotCSAgICAgIGlmIChvZmYgKyB2YWxvZmYgIT0gc3VidmVybGVuKQotCQlmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgIT0gJWQgKyAlZCIpLAotCQkgICAgICAgc3VidmVybGVuLCBvZmYsIHZhbG9mZik7Ci0KLQkgICAgICB2cy0+bmV4dCA9IE5VTEw7Ci0JICAgICAgKnBwdnMgPSB2czsKLQkgICAgICBwcHZzID0gJnZzLT5uZXh0OwotCi0JICAgICAgZGF0YSArPSB2YWxvZmY7Ci0JICAgICAgbGVuZ3RoIC09IHZhbG9mZjsKLQotCSAgICAgIGlmICh2ZXJsZW4gPCBzdWJ2ZXJsZW4pCi0JCWZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIGxlbmd0aCAlZCA8ICVkIiksCi0JCSAgICAgICB2ZXJsZW4sIHN1YnZlcmxlbik7Ci0KLQkgICAgICB2ZXJsZW4gLT0gc3VidmVybGVuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoY2ggPT0gJ1YnKQotCXsKLQkgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqKnBwdnY7Ci0KLQkgIHZpLT50eXBlID0gVkVSSU5GT19WQVI7Ci0KLQkgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAiVmFyRmlsZUluZm8iLAotCQkJICAgICAgKHVuaWNoYXIgKikgTlVMTCwgJnZlcmxlbiwgJnZhbGxlbiwgJnR5cGUsCi0JCQkgICAgICAmb2ZmKTsKLQotCSAgaWYgKHZhbGxlbiAhPSAwKQotCSAgICBmYXRhbCAoXygidW5leHBlY3RlZCB2YXJmaWxlaW5mbyB2YWx1ZSBsZW5ndGggJWQiKSwgdmFsbGVuKTsKLQotCSAgZGF0YSArPSBvZmY7Ci0JICBsZW5ndGggLT0gb2ZmOwotCi0JICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCSAgICAgICZ2aS0+dS52YXIua2V5LCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwgJm9mZik7Ci0KLQkgIGRhdGEgKz0gb2ZmOwotCSAgbGVuZ3RoIC09IG9mZjsKLQotCSAgdmktPnUudmFyLnZhciA9IE5VTEw7Ci0JICBwcHZ2ID0gJnZpLT51LnZhci52YXI7Ci0KLQkgIHdoaWxlICh2YWxsZW4gPiAwKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHZlcl92YXJpbmZvICp2djsKLQotCSAgICAgIGlmIChsZW5ndGggPCA0KQotCQl0b29zbWFsbCAoXygidmVyc2lvbiB2YXJmaWxlaW5mbyIpKTsKLQotCSAgICAgIHZ2ID0gKHN0cnVjdCB2ZXJfdmFyaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnYpOwotCi0JICAgICAgdnYtPmxhbmd1YWdlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQkgICAgICB2di0+Y2hhcnNldCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotCi0JICAgICAgdnYtPm5leHQgPSBOVUxMOwotCSAgICAgICpwcHZ2ID0gdnY7Ci0JICAgICAgcHB2diA9ICZ2di0+bmV4dDsKLQotCSAgICAgIGRhdGEgKz0gNDsKLQkgICAgICBsZW5ndGggLT0gNDsKLQotCSAgICAgIGlmICh2YWxsZW4gPCA0KQotCQlmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICAgICAgdmFsbGVuIC09IDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmciKSk7Ci0KLSAgICAgIHZpLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IHZpOwotICAgICAgcHAgPSAmdmktPm5leHQ7ICAgICAgCi0gICAgfQotCi0gIHYgPSAoc3RydWN0IHZlcnNpb25pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2KTsKLSAgdi0+Zml4ZWQgPSBmaTsKLSAgdi0+dmFyID0gZmlyc3Q7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX1ZFUlNJT05JTkZPOwotICByLT51LnZlcnNpb25pbmZvID0gdjsKLQotICByZXR1cm4gcjsgIAotfQotCi0vKiBDb252ZXJ0IGFuIGFyYml0cmFyeSB1c2VyIGRlZmluZWQgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3VzZXJkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLQotICByaS0+bmV4dCA9IE5VTEw7Ci0gIHJpLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKLSAgcmktPnUuYnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKLSAgcmktPnUuYnVmZmVyLmRhdGEgPSBkYXRhOwotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9VU0VSREFUQTsKLSAgci0+dS5yY2RhdGEgPSByaTsKLQotICByZXR1cm4gcjsKLX0KLQwKLS8qIE1hY3JvcyB0byBzd2FwIG91dCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIHB1dF8xNihiZSwgdiwgcykgKChiZSkgPyBiZmRfcHV0YjE2ICgodiksIChzKSkgOiBiZmRfcHV0bDE2ICgodiksIChzKSkpCi0jZGVmaW5lIHB1dF8zMihiZSwgdiwgcykgKChiZSkgPyBiZmRfcHV0YjMyICgodiksIChzKSkgOiBiZmRfcHV0bDMyICgodiksIChzKSkpCi0KLS8qIExvY2FsIGZ1bmN0aW9ucyB1c2VkIHRvIGNvbnZlcnQgcmVzb3VyY2VzIHRvIGJpbmFyeSBmb3JtYXQuICAqLwotCi1zdGF0aWMgdm9pZCBkd29yZF9hbGlnbl9iaW4gUEFSQU1TICgoc3RydWN0IGJpbmRhdGEgKioqLCB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzaWRfdG9fYmluIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICp1bmljb2RlX3RvX2JpbiBQQVJBTVMgKChjb25zdCB1bmljaGFyICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2FjY2VsZXJhdG9yCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9jdXJzb3IKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGN1cnNvciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9ncm91cF9jdXJzb3IKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9kaWFsb2cKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGRpYWxvZyAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9mb250ZGlyCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBmb250ZGlyICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2dyb3VwX2ljb24KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGdyb3VwX2ljb24gKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fbWVudQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWVudSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9tZW51aXRlbXMKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnVpdGVtICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX21lbnVleGl0ZW1zCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9yY2RhdGEKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX3N0cmluZ3RhYmxlCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqc3RyaW5nX3RvX3VuaWNvZGVfYmluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fdmVyc2lvbmluZm8KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHZlcnNpb25pbmZvICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2dlbmVyaWMKLSAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci0KLS8qIENvbnZlcnQgYSByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluIChyZXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN3aXRjaCAocmVzLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBSRVNfVFlQRV9CSVRNQVA6Ci0gICAgY2FzZSBSRVNfVFlQRV9GT05UOgotICAgIGNhc2UgUkVTX1RZUEVfSUNPTjoKLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2dlbmVyaWMgKHJlcy0+dS5kYXRhLmxlbmd0aCwgcmVzLT51LmRhdGEuZGF0YSk7Ci0gICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2FjY2VsZXJhdG9yIChyZXMtPnUuYWNjLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX0NVUlNPUjoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2N1cnNvciAocmVzLT51LmN1cnNvciwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9ncm91cF9jdXJzb3IgKHJlcy0+dS5ncm91cF9jdXJzb3IsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fZGlhbG9nIChyZXMtPnUuZGlhbG9nLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX0ZPTlRESVI6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9mb250ZGlyIChyZXMtPnUuZm9udGRpciwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9JQ09OOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fZ3JvdXBfaWNvbiAocmVzLT51Lmdyb3VwX2ljb24sIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX21lbnUgKHJlcy0+dS5tZW51LCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX3JjZGF0YSAocmVzLT51LnJjZGF0YSwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX3N0cmluZ3RhYmxlIChyZXMtPnUuc3RyaW5ndGFibGUsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9yY2RhdGEgKHJlcy0+dS5yY2RhdGEsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfVkVSU0lPTklORk86Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl92ZXJzaW9uaW5mbyAocmVzLT51LnZlcnNpb25pbmZvLCBiaWdfZW5kaWFuKTsKLSAgICB9Ci19Ci0KLS8qIEFsaWduIHRvIGEgMzIgYml0IGJvdW5kYXJ5LiAgUFBQIHBvaW50cyB0byB0aGUgb2YgYSBsaXN0IG9mIGJpbmRhdGEKLSAgIHN0cnVjdHVyZXMuICBMRU5HVEggcG9pbnRzIHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0cnVjdHVyZXMuICBJZgotICAgbmVjZXNzYXJ5LCB0aGlzIGFkZHMgYSBuZXcgYmluZGF0YSB0byBicmluZyBsZW5ndGggdXAgdG8gYSAzMiBiaXQKLSAgIGJvdW5kYXJ5LiAgSXQgdXBkYXRlcyAqUFBQIGFuZCAqTEVOR1RILiAgKi8KLQotc3RhdGljIHZvaWQKLWR3b3JkX2FsaWduX2JpbiAocHBwLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBiaW5kYXRhICoqKnBwcDsKLSAgICAgdW5zaWduZWQgbG9uZyAqbGVuZ3RoOwotewotICBpbnQgYWRkOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBpZiAoKCpsZW5ndGggJiAzKSA9PSAwKQotICAgIHJldHVybjsKLQotICBhZGQgPSA0IC0gKCpsZW5ndGggJiAzKTsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBhZGQ7Ci0gIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoYWRkKTsKLSAgbWVtc2V0IChkLT5kYXRhLCAwLCBhZGQpOwotCi0gIGQtPm5leHQgPSBOVUxMOwotICAqKnBwcCA9IGQ7Ci0gICpwcHAgPSAmKCoqcHBwKS0+bmV4dDsKLQotICAqbGVuZ3RoICs9IGFkZDsKLX0KLQotLyogQ29udmVydCBhIHJlc291cmNlIElEIHRvIGJpbmFyeS4gIFRoaXMgYWx3YXlzIHJldHVybnMgZXhhY3RseSBvbmUKLSAgIGJpbmRhdGEgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc2lkX3RvX2JpbiAoaWQsIGJpZ19lbmRpYW4pCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCi0gIGlmICghIGlkLm5hbWVkKQotICAgIHsKLSAgICAgIGQtPmxlbmd0aCA9IDQ7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAweGZmZmYsIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBpZC51LmlkLCBkLT5kYXRhICsgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGQtPmxlbmd0aCA9IGlkLnUubi5sZW5ndGggKiAyICsgMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpZC51Lm4ubGVuZ3RoOyBpKyspCi0JcHV0XzE2IChiaWdfZW5kaWFuLCBpZC51Lm4ubmFtZVtpXSwgZC0+ZGF0YSArIGkgKiAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIGkgKiAyKTsKLSAgICB9Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIGQ7Ci19Ci0KLS8qIENvbnZlcnQgYSBudWxsIHRlcm1pbmF0ZWQgdW5pY29kZSBzdHJpbmcgdG8gYmluYXJ5LiAgVGhpcyBhbHdheXMKLSAgIHJldHVybnMgZXhhY3RseSBvbmUgYmluZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotdW5pY29kZV90b19iaW4gKHN0ciwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5pY2hhciAqc3RyOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IGxlbjsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgbGVuID0gMDsKLSAgaWYgKHN0ciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IHVuaWNoYXIgKnM7Ci0KLSAgICAgIGZvciAocyA9IHN0cjsgKnMgIT0gMDsgcysrKQotCSsrbGVuOwotICAgIH0KLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBsZW4gKiAyICsgMjsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gIGlmIChzdHIgPT0gTlVMTCkKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEpOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgdW5pY2hhciAqczsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKHMgPSBzdHIsIGkgPSAwOyAqcyAhPSAwOyBzKyssIGkrKykKLQlwdXRfMTYgKGJpZ19lbmRpYW4sICpzLCBkLT5kYXRhICsgaSAqIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgaSAqIDIpOwotICAgIH0KLQotICBkLT5uZXh0ID0gTlVMTDsKLQotICByZXR1cm4gZDsKLX0KLQotLyogQ29udmVydCBhbiBhY2NlbGVyYXRvciByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9hY2NlbGVyYXRvciAoYWNjZWxlcmF0b3JzLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmFjY2VsZXJhdG9yczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICphOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChhID0gYWNjZWxlcmF0b3JzOyBhICE9IE5VTEw7IGEgPSBhLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gODsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoOCk7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwKLQkgICAgICBhLT5mbGFncyB8IChhLT5uZXh0ICE9IE5VTEwgPyAwIDogQUNDX0xBU1QpLAotCSAgICAgIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBhLT5rZXksIGQtPmRhdGEgKyAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgYS0+aWQsIGQtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIDgpOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBjdXJzb3IgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fY3Vyc29yIChjLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgY3Vyc29yICpjOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgZC0+bGVuZ3RoID0gNDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg0KTsKLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMtPnhob3RzcG90LCBkLT5kYXRhKTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLT55aG90c3BvdCwgZC0+ZGF0YSArIDIpOwotCi0gIGQtPm5leHQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPm5leHQtPmxlbmd0aCA9IGMtPmxlbmd0aDsKLSAgZC0+bmV4dC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIGMtPmRhdGE7Ci0gIGQtPm5leHQtPm5leHQgPSBOVUxMOwotCi0gIHJldHVybiBkOwotfQotCi0vKiBDb252ZXJ0IGEgZ3JvdXAgY3Vyc29yIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2dyb3VwX2N1cnNvciAoZ3JvdXBfY3Vyc29ycywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqZ3JvdXBfY3Vyc29yczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgaW50IGM7Ci0gIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKmdjOwotCi0gIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKLSAgZmlyc3QtPmxlbmd0aCA9IDY7Ci0gIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIDIsIGZpcnN0LT5kYXRhICsgMik7Ci0KLSAgZmlyc3QtPm5leHQgPSBOVUxMOwotICBwcCA9ICZmaXJzdC0+bmV4dDsKLQotICBjID0gMDsKLSAgZm9yIChnYyA9IGdyb3VwX2N1cnNvcnM7IGdjICE9IE5VTEw7IGdjID0gZ2MtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDE0OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgxNCk7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPndpZHRoLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPmhlaWdodCwgZC0+ZGF0YSArIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+cGxhbmVzLCBkLT5kYXRhICsgNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdjLT5iaXRzLCBkLT5kYXRhICsgNik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGdjLT5ieXRlcywgZC0+ZGF0YSArIDgpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+aW5kZXgsIGQtPmRhdGEgKyAxMik7Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0gICAgfQotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYywgZmlyc3QtPmRhdGEgKyA0KTsKLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBkaWFsb2cgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fZGlhbG9nIChkaWFsb2csIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCBkaWFsb2dleDsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgaW50IG9mZiwgYzsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkYzsKLQotICBkaWFsb2dleCA9IGV4dGVuZGVkX2RpYWxvZyAoZGlhbG9nKTsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSBkaWFsb2dleCA/IDI2IDogMTg7Ci0gIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGZpcnN0LT5sZW5ndGgpOwotCi0gIGxlbmd0aCA9IGZpcnN0LT5sZW5ndGg7Ci0KLSAgaWYgKCEgZGlhbG9nZXgpCi0gICAgewotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPnN0eWxlLCBmaXJzdC0+ZGF0YSk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXhzdHlsZSwgZmlyc3QtPmRhdGEgKyA0KTsKLSAgICAgIG9mZiA9IDg7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAxLCBmaXJzdC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDB4ZmZmZiwgZmlyc3QtPmRhdGEgKyAyKTsKLQotICAgICAgaWYgKGRpYWxvZy0+ZXggPT0gTlVMTCkKLQlwdXRfMzIgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhICsgNCk7Ci0gICAgICBlbHNlCi0JcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4LT5oZWxwLCBmaXJzdC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4c3R5bGUsIGZpcnN0LT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+c3R5bGUsIGZpcnN0LT5kYXRhICsgMTIpOwotICAgICAgb2ZmID0gMTY7Ci0gICAgfQotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT54LCBmaXJzdC0+ZGF0YSArIG9mZiArIDIpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+eSwgZmlyc3QtPmRhdGEgKyBvZmYgKyA0KTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPndpZHRoLCBmaXJzdC0+ZGF0YSArIG9mZiArIDYpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+aGVpZ2h0LCBmaXJzdC0+ZGF0YSArIG9mZiArIDgpOwotCi0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gICpwcCA9IHJlc2lkX3RvX2JpbiAoZGlhbG9nLT5tZW51LCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gICpwcCA9IHJlc2lkX3RvX2JpbiAoZGlhbG9nLT5jbGFzcywgYmlnX2VuZGlhbik7Ci0gIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAqcHAgPSB1bmljb2RlX3RvX2JpbiAoZGlhbG9nLT5jYXB0aW9uLCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gIGlmICgoZGlhbG9nLT5zdHlsZSAmIERTX1NFVEZPTlQpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSBkaWFsb2dleCA/IDYgOiAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+cG9pbnRzaXplLCBkLT5kYXRhKTsKLQotICAgICAgaWYgKGRpYWxvZ2V4KQotCXsKLQkgIGlmIChkaWFsb2ctPmV4ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyAyKTsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyA0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4LT53ZWlnaHQsIGQtPmRhdGEgKyAyKTsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXgtPml0YWxpYywgZC0+ZGF0YSArIDQpOwotCSAgICB9Ci0JfQotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gdW5pY29kZV90b19iaW4gKGRpYWxvZy0+Zm9udCwgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotICAgIH0KLQotICBjID0gMDsKLSAgZm9yIChkYyA9IGRpYWxvZy0+Y29udHJvbHM7IGRjICE9IE5VTEw7IGRjID0gZGMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICBpbnQgZGNvZmY7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gZGlhbG9nZXggPyAyNCA6IDE4OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotCi0gICAgICBpZiAoISBkaWFsb2dleCkKLQl7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5zdHlsZSwgZC0+ZGF0YSk7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5leHN0eWxlLCBkLT5kYXRhICsgNCk7Ci0JICBkY29mZiA9IDg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPmhlbHAsIGQtPmRhdGEpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+ZXhzdHlsZSwgZC0+ZGF0YSArIDQpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+c3R5bGUsIGQtPmRhdGEgKyA4KTsKLQkgIGRjb2ZmID0gMTI7Ci0JfQotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT54LCBkLT5kYXRhICsgZGNvZmYpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkYy0+eSwgZC0+ZGF0YSArIGRjb2ZmICsgMik7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT53aWR0aCwgZC0+ZGF0YSArIGRjb2ZmICsgNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT5oZWlnaHQsIGQtPmRhdGEgKyBkY29mZiArIDYpOwotCi0gICAgICBpZiAoZGlhbG9nZXgpCi0gICAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPmlkLCBkLT5kYXRhICsgZGNvZmYgKyA4KTsKLSAgICAgIGVsc2UKLSAgICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkYy0+aWQsIGQtPmRhdGEgKyBkY29mZiArIDgpOwotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gcmVzaWRfdG9fYmluIChkYy0+Y2xhc3MsIGJpZ19lbmRpYW4pOwotICAgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAgICAgKnBwID0gcmVzaWRfdG9fYmluIChkYy0+dGV4dCwgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMik7Ci0KLSAgICAgIGxlbmd0aCArPSAyOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICBpZiAoZGMtPmRhdGEgPT0gTlVMTCkKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEpOwotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgc3VibGVuOwotCi0JICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0KLQkgICpwcCA9IHJlc190b19iaW5fcmNkYXRhIChkYy0+ZGF0YSwgYmlnX2VuZGlhbik7Ci0JICBzdWJsZW4gPSAwOwotCSAgd2hpbGUgKCpwcCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3VibGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0JICAgIH0KLQotCSAgcHV0XzE2IChiaWdfZW5kaWFuLCBzdWJsZW4sIGQtPmRhdGEpOwotCi0JICBsZW5ndGggKz0gc3VibGVuOwotCX0KLSAgICB9Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYywgZmlyc3QtPmRhdGEgKyBvZmYpOwotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIGZvbnRkaXIgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fZm9udGRpciAoZm9udGRpcnMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBmb250ZGlyICpmb250ZGlyczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgaW50IGM7Ci0gIGNvbnN0IHN0cnVjdCBmb250ZGlyICpmZDsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSAyOwotICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgyKTsKLQotICBmaXJzdC0+bmV4dCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gIGMgPSAwOwotICBmb3IgKGZkID0gZm9udGRpcnM7IGZkICE9IE5VTEw7IGZkID0gZmQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDIpOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGZkLT5pbmRleCwgZC0+ZGF0YSk7Ci0KLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gZmQtPmxlbmd0aDsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSBmZC0+ZGF0YTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsgICAgICAKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSk7Ci0KLSAgcmV0dXJuIGZpcnN0OyAgCi19Ci0KLS8qIENvbnZlcnQgYSBncm91cCBpY29uIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2dyb3VwX2ljb24gKGdyb3VwX2ljb25zLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ3JvdXBfaWNvbnM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGludCBjOwotICBjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ2k7Ci0KLSAgZmlyc3QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZmlyc3QpOwotICBmaXJzdC0+bGVuZ3RoID0gNjsKLSAgZmlyc3QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBmaXJzdC0+ZGF0YSk7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMSwgZmlyc3QtPmRhdGEgKyAyKTsKLQotICBmaXJzdC0+bmV4dCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gIGMgPSAwOwotICBmb3IgKGdpID0gZ3JvdXBfaWNvbnM7IGdpICE9IE5VTEw7IGdpID0gZ2ktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDE0OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgxNCk7Ci0KLSAgICAgIGQtPmRhdGFbMF0gPSBnaS0+d2lkdGg7Ci0gICAgICBkLT5kYXRhWzFdID0gZ2ktPmhlaWdodDsKLSAgICAgIGQtPmRhdGFbMl0gPSBnaS0+Y29sb3JzOwotICAgICAgZC0+ZGF0YVszXSA9IDA7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdpLT5wbGFuZXMsIGQtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2ktPmJpdHMsIGQtPmRhdGEgKyA2KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZ2ktPmJ5dGVzLCBkLT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdpLT5pbmRleCwgZC0+ZGF0YSArIDEyKTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSArIDQpOwotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIG1lbnUgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fbWVudSAobWVudSwgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IG1lbnUgKm1lbnU7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgbWVudWV4OwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBtZW51ZXggPSBleHRlbmRlZF9tZW51IChtZW51KTsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBtZW51ZXggPyA4IDogNDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gIGlmICghIG1lbnVleCkKLSAgICB7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgMik7Ci0KLSAgICAgIGQtPm5leHQgPSByZXNfdG9fYmluX21lbnVpdGVtcyAobWVudS0+aXRlbXMsIGJpZ19lbmRpYW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMSwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDQsIGQtPmRhdGEgKyAyKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgbWVudS0+aGVscCwgZC0+ZGF0YSArIDQpOwotCi0gICAgICBkLT5uZXh0ID0gcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcyAobWVudS0+aXRlbXMsIGJpZ19lbmRpYW4pOwotICAgIH0KLQotICByZXR1cm4gZDsKLX0KLQotLyogQ29udmVydCBtZW51IGl0ZW1zIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX21lbnVpdGVtcyAoaXRlbXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqaXRlbXM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWk7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBmb3IgKG1pID0gaXRlbXM7IG1pICE9IE5VTEw7IG1pID0gbWktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICBpbnQgZmxhZ3M7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSBtaS0+cG9wdXAgPT0gTlVMTCA/IDQgOiAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBmbGFncyA9IG1pLT50eXBlOwotICAgICAgaWYgKG1pLT5uZXh0ID09IE5VTEwpCi0JZmxhZ3MgfD0gTUVOVUlURU1fRU5ETUVOVTsKLSAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKLQlmbGFncyB8PSBNRU5VSVRFTV9QT1BVUDsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBmbGFncywgZC0+ZGF0YSk7Ci0KLSAgICAgIGlmIChtaS0+cG9wdXAgPT0gTlVMTCkKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIG1pLT5pZCwgZC0+ZGF0YSArIDIpOwotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gdW5pY29kZV90b19iaW4gKG1pLT50ZXh0LCBiaWdfZW5kaWFuKTsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JewotCSAgKnBwID0gcmVzX3RvX2Jpbl9tZW51aXRlbXMgKG1pLT5wb3B1cCwgYmlnX2VuZGlhbik7Ci0JICB3aGlsZSAoKnBwICE9IE5VTEwpCi0JICAgIHBwID0gJigqcHApLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IG1lbnVleCBpdGVtcyB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcyAoaXRlbXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqaXRlbXM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgbGVuZ3RoID0gMDsKLQotICBmb3IgKG1pID0gaXRlbXM7IG1pICE9IE5VTEw7IG1pID0gbWktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICBpbnQgZmxhZ3M7Ci0KLSAgICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDEyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgxMik7Ci0KLSAgICAgIGxlbmd0aCArPSAxMjsKLQotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBtaS0+dHlwZSwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIG1pLT5zdGF0ZSwgZC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBtaS0+aWQsIGQtPmRhdGEgKyA4KTsKLQotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKG1pLT5uZXh0ID09IE5VTEwpCi0JZmxhZ3MgfD0gMHg4MDsKLSAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKLQlmbGFncyB8PSAxOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBmbGFncywgZC0+ZGF0YSArIDEwKTsKLQotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0KLSAgICAgICpwcCA9IHVuaWNvZGVfdG9fYmluIChtaS0+dGV4dCwgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JewotCSAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0JICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCSAgZC0+bGVuZ3RoID0gNDsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7Ci0KLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgbWktPmhlbHAsIGQtPmRhdGEpOwotCi0JICAqcHAgPSBkOwotCSAgcHAgPSAmZC0+bmV4dDsKLQotCSAgKnBwID0gcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcyAobWktPnBvcHVwLCBiaWdfZW5kaWFuKTsKLQkgIHdoaWxlICgqcHAgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYW4gcmNkYXRhIHJlc291cmNlIHRvIGJpbmFyeS4gIFRoaXMgaXMgYWxzbyB1c2VkIHRvIGNvbnZlcnQKLSAgIG90aGVyIGluZm9ybWF0aW9uIHdoaWNoIGhhcHBlbnMgdG8gYmUgc3RvcmVkIGluIHJjZGF0YV9pdGVtIGxpc3RzCi0gICB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9yY2RhdGEgKGl0ZW1zLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKml0ZW1zOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChyaSA9IGl0ZW1zOyByaSAhPSBOVUxMOyByaSA9IHJpLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCi0gICAgICBzd2l0Y2ggKHJpLT50eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIFJDREFUQV9XT1JEOgotCSAgZC0+bGVuZ3RoID0gMjsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMik7Ci0JICBwdXRfMTYgKGJpZ19lbmRpYW4sIHJpLT51LndvcmQsIGQtPmRhdGEpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9EV09SRDoKLQkgIGQtPmxlbmd0aCA9IDQ7Ci0JICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCByaS0+dS5kd29yZCwgZC0+ZGF0YSk7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX1NUUklORzoKLQkgIGQtPmxlbmd0aCA9IHJpLT51LnN0cmluZy5sZW5ndGg7Ci0JICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmktPnUuc3RyaW5nLnM7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX1dTVFJJTkc6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaTsKLQotCSAgICBkLT5sZW5ndGggPSByaS0+dS53c3RyaW5nLmxlbmd0aCAqIDI7Ci0JICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IHJpLT51LndzdHJpbmcubGVuZ3RoOyBpKyspCi0JICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCByaS0+dS53c3RyaW5nLndbaV0sIGQtPmRhdGEgKyBpICogMik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBSQ0RBVEFfQlVGRkVSOgotCSAgZC0+bGVuZ3RoID0gcmktPnUuYnVmZmVyLmxlbmd0aDsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByaS0+dS5idWZmZXIuZGF0YTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgc3RyaW5ndGFibGUgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fc3RyaW5ndGFibGUgKHN0LCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3RyaW5ndGFibGUgKnN0OwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBpbnQgaTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIGludCBzbGVuLCBqOwotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICB1bmljaGFyICpzOwotCi0gICAgICBzbGVuID0gc3QtPnN0cmluZ3NbaV0ubGVuZ3RoOwotICAgICAgcyA9IHN0LT5zdHJpbmdzW2ldLnN0cmluZzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDIgKyBzbGVuICogMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBzbGVuLCBkLT5kYXRhKTsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IHNsZW47IGorKykKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIHNbal0sIGQtPmRhdGEgKyAyICsgaiAqIDIpOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OyAgICAgIAotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgdW5pY29kZSBiaW5hcnkgc3RyaW5nLiAgVGhpcyBhbHdheXMKLSAgIHJldHVybnMgZXhhY3RseSBvbmUgYmluZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotc3RyaW5nX3RvX3VuaWNvZGVfYmluIChzLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc2l6ZV90IGxlbiwgaTsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgbGVuID0gc3RybGVuIChzKTsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBsZW4gKiAyICsgMjsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHNbaV0sIGQtPmRhdGEgKyBpICogMik7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIGkgKiAyKTsKLQotICBkLT5uZXh0ID0gTlVMTDsKLQotICByZXR1cm4gZDsgIAotfQotCi0vKiBDb252ZXJ0IGEgdmVyc2lvbmluZm8gcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fdmVyc2lvbmluZm8gKHZlcnNpb25pbmZvLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgdmVyc2lvbmluZm8gKnZlcnNpb25pbmZvOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgc3RydWN0IHZlcl9pbmZvICp2aTsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSA2OwotICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotICBsZW5ndGggPSA2OwotCi0gIGlmICh2ZXJzaW9uaW5mby0+Zml4ZWQgPT0gTlVMTCkKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhICsgMik7Ci0gIGVsc2UKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDUyLCBmaXJzdC0+ZGF0YSArIDIpOwotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEgKyA0KTsKLQotICBwcCA9ICZmaXJzdC0+bmV4dDsKLQotICAqcHAgPSBzdHJpbmdfdG9fdW5pY29kZV9iaW4gKCJWU19WRVJTSU9OX0lORk8iLCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICBpZiAodmVyc2lvbmluZm8tPmZpeGVkICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaTsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gNTI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDUyKTsKLQotICAgICAgbGVuZ3RoICs9IDUyOwotCi0gICAgICBmaSA9IHZlcnNpb25pbmZvLT5maXhlZDsKLQotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCAweGZlZWYwNGJkLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgMHgxMDAwMCwgZC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV92ZXJzaW9uX21zLCBkLT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX3ZlcnNpb25fbHMsIGQtPmRhdGEgKyAxMik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5wcm9kdWN0X3ZlcnNpb25fbXMsIGQtPmRhdGEgKyAxNik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5wcm9kdWN0X3ZlcnNpb25fbHMsIGQtPmRhdGEgKyAyMCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX2ZsYWdzX21hc2ssIGQtPmRhdGEgKyAyNCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX2ZsYWdzLCBkLT5kYXRhICsgMjgpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9vcywgZC0+ZGF0YSArIDMyKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfdHlwZSwgZC0+ZGF0YSArIDM2KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfc3VidHlwZSwgZC0+ZGF0YSArIDQwKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZGF0ZV9tcywgZC0+ZGF0YSArIDQ0KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZGF0ZV9scywgZC0+ZGF0YSArIDQ4KTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgZm9yICh2aSA9IHZlcnNpb25pbmZvLT52YXI7IHZpICE9IE5VTEw7IHZpID0gdmktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKnZpZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmlsZW47Ci0KLSAgICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICAgICAgdmlkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZpZCk7Ci0gICAgICB2aWQtPmxlbmd0aCA9IDY7Ci0gICAgICB2aWQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLSAgICAgIGxlbmd0aCArPSA2OwotICAgICAgdmlsZW4gPSA2OwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZpZC0+ZGF0YSArIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2aWQtPmRhdGEgKyA0KTsKLQotICAgICAgKnBwID0gdmlkOwotICAgICAgcHAgPSAmdmlkLT5uZXh0OwotCi0gICAgICBzd2l0Y2ggKHZpLT50eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIFZFUklORk9fU1RSSU5HOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGhvbGQsIHZzbGVuOwotCSAgICBzdHJ1Y3QgYmluZGF0YSAqdnNkOwotCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZzOwotCi0JICAgICpwcCA9IHN0cmluZ190b191bmljb2RlX2JpbiAoIlN0cmluZ0ZpbGVJbmZvIiwgYmlnX2VuZGlhbik7Ci0JICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICB2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotCSAgICBob2xkID0gbGVuZ3RoOwotCSAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JICAgIHZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0KLQkgICAgdnNkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZzZCk7Ci0JICAgIHZzZC0+bGVuZ3RoID0gNjsKLQkgICAgdnNkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0JICAgIGxlbmd0aCArPSA2OwotCSAgICB2aWxlbiArPSA2OwotCSAgICB2c2xlbiA9IDY7Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2c2QtPmRhdGEgKyAyKTsKLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2c2QtPmRhdGEgKyA0KTsKLQotCSAgICAqcHAgPSB2c2Q7Ci0JICAgIHBwID0gJnZzZC0+bmV4dDsKLQotCSAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAodmktPnUuc3RyaW5nLmxhbmd1YWdlLCBiaWdfZW5kaWFuKTsKLQkgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0JICAgIGZvciAodnMgPSB2aS0+dS5zdHJpbmcuc3RyaW5nczsgdnMgIT0gTlVMTDsgdnMgPSB2cy0+bmV4dCkKLQkgICAgICB7Ci0JCXN0cnVjdCBiaW5kYXRhICp2c3NkOwotCQl1bnNpZ25lZCBsb25nIHZzc2xlbjsKLQotCQlob2xkID0gbGVuZ3RoOwotCQlkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JCXZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JCXZzbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0KLQkJdnNzZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICp2c3NkKTsKLQkJdnNzZC0+bGVuZ3RoID0gNjsKLQkJdnNzZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotCQlsZW5ndGggKz0gNjsKLQkJdmlsZW4gKz0gNjsKLQkJdnNsZW4gKz0gNjsKLQkJdnNzbGVuID0gNjsKLQotCQlwdXRfMTYgKGJpZ19lbmRpYW4sIDEsIHZzc2QtPmRhdGEgKyA0KTsKLQotCQkqcHAgPSB2c3NkOwotCQlwcCA9ICZ2c3NkLT5uZXh0OwotCi0JCSpwcCA9IHVuaWNvZGVfdG9fYmluICh2cy0+a2V5LCBiaWdfZW5kaWFuKTsKLQkJbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZzc2xlbiArPSAoKnBwKS0+bGVuZ3RoOwotCQlwcCA9ICYoKnBwKS0+bmV4dDsKLQotCQlob2xkID0gbGVuZ3RoOwotCQlkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JCXZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JCXZzbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JCXZzc2xlbiArPSBsZW5ndGggLSBob2xkOwotCi0JCSpwcCA9IHVuaWNvZGVfdG9fYmluICh2cy0+dmFsdWUsIGJpZ19lbmRpYW4pOwotIAkJcHV0XzE2IChiaWdfZW5kaWFuLCAoKnBwKS0+bGVuZ3RoIC8gMiwgdnNzZC0+ZGF0YSArIDIpOwotCQlsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkJdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJdnNsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJdnNzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXBwID0gJigqcHApLT5uZXh0OwotCi0JCXB1dF8xNiAoYmlnX2VuZGlhbiwgdnNzbGVuLCB2c3NkLT5kYXRhKTsKLQkgICAgICB9Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2c2xlbiwgdnNkLT5kYXRhKTsKLQotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgVkVSSU5GT19WQVI6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaG9sZCwgdnZsZW4sIHZ2dmxlbjsKLQkgICAgc3RydWN0IGJpbmRhdGEgKnZ2ZDsKLQkgICAgY29uc3Qgc3RydWN0IHZlcl92YXJpbmZvICp2djsKLQotCSAgICAqcHAgPSBzdHJpbmdfdG9fdW5pY29kZV9iaW4gKCJWYXJGaWxlSW5mbyIsIGJpZ19lbmRpYW4pOwotCSAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkgICAgaG9sZCA9IGxlbmd0aDsKLQkgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCSAgICB2aWxlbiArPSBsZW5ndGggLSBob2xkOwotCi0JICAgIHZ2ZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICp2dmQpOwotCSAgICB2dmQtPmxlbmd0aCA9IDY7Ci0JICAgIHZ2ZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotCSAgICBsZW5ndGggKz0gNjsKLQkgICAgdmlsZW4gKz0gNjsKLQkgICAgdnZsZW4gPSA2OwotCi0JICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgdnZkLT5kYXRhICsgNCk7Ci0KLQkgICAgKnBwID0gdnZkOwotCSAgICBwcCA9ICZ2dmQtPm5leHQ7Ci0KLQkgICAgKnBwID0gdW5pY29kZV90b19iaW4gKHZpLT51LnZhci5rZXksIGJpZ19lbmRpYW4pOwotCSAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdnZsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkgICAgaG9sZCA9IGxlbmd0aDsKLQkgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCSAgICB2aWxlbiArPSBsZW5ndGggLSBob2xkOwotCSAgICB2dmxlbiArPSBsZW5ndGggLSBob2xkOwotCi0JICAgIHZ2dmxlbiA9IDA7Ci0KLQkgICAgZm9yICh2diA9IHZpLT51LnZhci52YXI7IHZ2ICE9IE5VTEw7IHZ2ID0gdnYtPm5leHQpCi0JICAgICAgewotCQlzdHJ1Y3QgYmluZGF0YSAqdnZzZDsKLQotCQl2dnNkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZ2c2QpOwotCQl2dnNkLT5sZW5ndGggPSA0OwotCQl2dnNkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotCi0JCWxlbmd0aCArPSA0OwotCQl2aWxlbiArPSA0OwotCQl2dmxlbiArPSA0OwotCQl2dnZsZW4gKz0gNDsKLQotCQlwdXRfMTYgKGJpZ19lbmRpYW4sIHZ2LT5sYW5ndWFnZSwgdnZzZC0+ZGF0YSk7Ci0JCXB1dF8xNiAoYmlnX2VuZGlhbiwgdnYtPmNoYXJzZXQsIHZ2c2QtPmRhdGEgKyAyKTsKLQotCQl2dnNkLT5uZXh0ID0gTlVMTDsKLQkJKnBwID0gdnZzZDsKLQkJcHAgPSAmdnZzZC0+bmV4dDsKLQkgICAgICB9Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2dmxlbiwgdnZkLT5kYXRhKTsKLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2dnZsZW4sIHZ2ZC0+ZGF0YSArIDIpOwotCi0JICAgIGJyZWFrOwotCSAgfQotCX0KLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2aWxlbiwgdmlkLT5kYXRhKTsKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBsZW5ndGgsIGZpcnN0LT5kYXRhKTsKLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBnZW5lcmljIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2dlbmVyaWMgKGxlbmd0aCwgZGF0YSkKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPmxlbmd0aCA9IGxlbmd0aDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGE7Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIGQ7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZXNjb2ZmLmMgYi9iaW51dGlscy9yZXNjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0Y2Y1NzIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVzY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLS8qIHJlc2NvZmYuYyAtLSByZWFkIGFuZCB3cml0ZSByZXNvdXJjZXMgaW4gV2luZG93cyBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb24gdGhhdCByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJlc291cmNlcwotICAgaW4gQ09GRiBmaWxlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotLyogSW4gb3JkZXIgdG8gdXNlIHRoZSBhZGRyZXNzIG9mIGEgcmVzb3VyY2UgZGF0YSBlbnRyeSwgd2UgbmVlZCB0bwotICAgZ2V0IHRoZSBpbWFnZSBiYXNlIG9mIHRoZSBmaWxlLiAgUmlnaHQgbm93IHdlIGV4dHJhY3QgaXQgZnJvbQotICAgaW50ZXJuYWwgQkZEIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogSW5mb3JtYXRpb24gd2UgZXh0cmFjdCBmcm9tIHRoZSBmaWxlLiAgKi8KLQotc3RydWN0IGNvZmZfZmlsZV9pbmZvCi17Ci0gIC8qIEZpbGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBEYXRhIHJlYWQgZnJvbSB0aGUgZmlsZS4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpkYXRhOwotICAvKiBFbmQgb2YgZGF0YSByZWFkIGZyb20gZmlsZS4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpkYXRhX2VuZDsKLSAgLyogQWRkcmVzcyBvZiB0aGUgcmVzb3VyY2Ugc2VjdGlvbiBtaW51cyB0aGUgaW1hZ2UgYmFzZSBvZiB0aGUgZmlsZS4gICovCi0gIGJmZF92bWEgc2VjYWRkcjsKLSAgLyogTm9uLXplcm8gaWYgdGhlIGZpbGUgaXMgYmlnIGVuZGlhbi4gICovCi0gIGludCBiaWdfZW5kaWFuOwotfTsKLQotLyogQSByZXNvdXJjZSBkaXJlY3RvcnkgdGFibGUgaW4gYSBDT0ZGIGZpbGUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkKLXsKLSAgLyogQ2hhcmFjdGVyaXN0aWNzLiAgKi8KLSAgYmZkX2J5dGUgY2hhcmFjdGVyaXN0aWNzWzRdOwotICAvKiBUaW1lIHN0YW1wLiAgKi8KLSAgYmZkX2J5dGUgdGltZVs0XTsKLSAgLyogTWFqb3IgdmVyc2lvbiBudW1iZXIuICAqLwotICBiZmRfYnl0ZSBtYWpvclsyXTsKLSAgLyogTWlub3IgdmVyc2lvbiBudW1iZXIuICAqLwotICBiZmRfYnl0ZSBtaW5vclsyXTsKLSAgLyogTnVtYmVyIG9mIG5hbWVkIGRpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLSAgYmZkX2J5dGUgbmFtZV9jb3VudFsyXTsKLSAgLyogTnVtYmVyIG9mIGRpcmVjdG9yeSBlbnRyaWVzIHdpdGggSURzLiAgKi8KLSAgYmZkX2J5dGUgaWRfY291bnRbMl07Ci19OwotCi0vKiBBIHJlc291cmNlIGRpcmVjdG9yeSBlbnRyeSBpbiBhIENPRkYgZmlsZS4gICovCi0KLXN0cnVjdCBleHRlcm5fcmVzX2VudHJ5Ci17Ci0gIC8qIE5hbWUgb3IgSUQuICAqLwotICBiZmRfYnl0ZSBuYW1lWzRdOwotICAvKiBBZGRyZXNzIG9mIHJlc291cmNlIGVudHJ5IG9yIHN1YmRpcmVjdG9yeS4gICovCi0gIGJmZF9ieXRlIHJ2YVs0XTsKLX07Ci0KLS8qIEEgcmVzb3VyY2UgZGF0YSBlbnRyeSBpbiBhIENPRkYgZmlsZS4gICovCi0KLXN0cnVjdCBleHRlcm5fcmVzX2RhdGEKLXsKLSAgLyogQWRkcmVzcyBvZiByZXNvdXJjZSBkYXRhLiAgVGhpcyBpcyBhcHBhcmVudGx5IGEgZmlsZSByZWxhdGl2ZQotICAgICBhZGRyZXNzLCByYXRoZXIgdGhhbiBhIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLSAgYmZkX2J5dGUgcnZhWzRdOwotICAvKiBTaXplIG9mIHJlc291cmNlIGRhdGEuICAqLwotICBiZmRfYnl0ZSBzaXplWzRdOwotICAvKiBDb2RlIHBhZ2UuICAqLwotICBiZmRfYnl0ZSBjb2RlcGFnZVs0XTsKLSAgLyogUmVzZXJ2ZWQuICAqLwotICBiZmRfYnl0ZSByZXNlcnZlZFs0XTsKLX07Ci0KLS8qIE1hY3JvcyB0byBzd2FwIGluIHZhbHVlcy4gICovCi0KLSNkZWZpbmUgZ2V0ZmlfMTYoZmksIHMpICgoZmkpLT5iaWdfZW5kaWFuID8gYmZkX2dldGIxNiAocykgOiBiZmRfZ2V0bDE2IChzKSkKLSNkZWZpbmUgZ2V0ZmlfMzIoZmksIHMpICgoZmkpLT5iaWdfZW5kaWFuID8gYmZkX2dldGIzMiAocykgOiBiZmRfZ2V0bDMyIChzKSkKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgb3ZlcnJ1biBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfY29mZl9yZXNfZGlyCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICosIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVhZF9jb2ZmX2RhdGFfZW50cnkKLSAgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKiwgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqKSk7Ci0MCi0vKiBSZWFkIHRoZSByZXNvdXJjZXMgaW4gYSBDT0ZGIGZpbGUuICAqLwotCi1zdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1yZWFkX2NvZmZfcnNyYyAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICphYmZkOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyBmaW5mbzsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgaW5wdXQiKSk7Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQlsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnNyYyIpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IG5vIHJlc291cmNlIHNlY3Rpb25cbiIpLCBwcm9ncmFtX25hbWUsCi0JICAgICAgIGZpbGVuYW1lKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYyk7Ci0gIGRhdGEgPSAoYmZkX2J5dGUgKikgcmVzX2FsbG9jIChzaXplKTsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgMCwgc2l6ZSkpCi0gICAgYmZkX2ZhdGFsIChfKCJjYW4ndCByZWFkIHJlc291cmNlIHNlY3Rpb24iKSk7Ci0KLSAgZmluZm8uZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgZmluZm8uZGF0YSA9IGRhdGE7Ci0gIGZpbmZvLmRhdGFfZW5kID0gZGF0YSArIHNpemU7Ci0gIGZpbmZvLnNlY2FkZHIgPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkgICAtIHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKTsKLSAgZmluZm8uYmlnX2VuZGlhbiA9IGJmZF9iaWdfZW5kaWFuIChhYmZkKTsKLQotICBiZmRfY2xvc2UgKGFiZmQpOwotCi0gIC8qIE5vdyBqdXN0IHJlYWQgaW4gdGhlIHRvcCBsZXZlbCByZXNvdXJjZSBkaXJlY3RvcnkuICBOb3RlIHRoYXQgd2UKLSAgICAgZG9uJ3QgZnJlZSBkYXRhLCBzaW5jZSB3ZSBjcmVhdGUgcmVzb3VyY2UgZW50cmllcyB0aGF0IHBvaW50IGludG8KLSAgICAgaXQuICBJZiB3ZSBldmVyIHdhbnQgdG8gZnJlZSB1cCB0aGUgcmVzb3VyY2UgaW5mb3JtYXRpb24gd2UgcmVhZCwKLSAgICAgdGhpcyB3aWxsIGhhdmUgdG8gYmUgY2xlYW5lZCB1cC4gICovCi0KLSAgcmV0dXJuIHJlYWRfY29mZl9yZXNfZGlyIChkYXRhLCAmZmluZm8sIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsIDApOwotfQotCi0vKiBHaXZlIGFuIGVycm9yIGlmIHdlIGFyZSBvdXQgb2YgYm91bmRzLiAgKi8KLQotc3RhdGljIHZvaWQKLW92ZXJydW4gKGZpbmZvLCBtc2cpCi0gICAgIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqZmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgZmF0YWwgKF8oIiVzOiAlczogYWRkcmVzcyBvdXQgb2YgYm91bmRzIiksIGZpbmZvLT5maWxlbmFtZSwgbXNnKTsKLX0KLQotLyogUmVhZCBhIHJlc291cmNlIGRpcmVjdG9yeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1yZWFkX2NvZmZfcmVzX2RpciAoZGF0YSwgZmluZm8sIHR5cGUsIGxldmVsKQotICAgICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICpmaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgaW50IGxldmVsOwotewotICBjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKmVyZDsKLSAgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOwotICBpbnQgbmFtZV9jb3VudCwgaWRfY291bnQsIGk7Ci0gIHN0cnVjdCByZXNfZW50cnkgKipwcDsKLSAgY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZW50cnkgKmVyZTsKLQotICBpZiAoKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGRhdGEpIDwgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJkaXJlY3RvcnkiKSk7Ci0KLSAgZXJkID0gKGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeSAqKSBkYXRhOwotCi0gIHJkID0gKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZCk7Ci0gIHJkLT5jaGFyYWN0ZXJpc3RpY3MgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+Y2hhcmFjdGVyaXN0aWNzKTsKLSAgcmQtPnRpbWUgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+dGltZSk7Ci0gIHJkLT5tYWpvciA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5tYWpvcik7Ci0gIHJkLT5taW5vciA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5taW5vcik7Ci0gIHJkLT5lbnRyaWVzID0gTlVMTDsKLQotICBuYW1lX2NvdW50ID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcmQtPm5hbWVfY291bnQpOwotICBpZF9jb3VudCA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5pZF9jb3VudCk7Ci0KLSAgcHAgPSAmcmQtPmVudHJpZXM7Ci0KLSAgLyogVGhlIHJlc291cmNlIGRpcmVjdG9yeSBlbnRyaWVzIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZGlyZWN0b3J5Ci0gICAgIHRhYmxlLiAgKi8KLSAgZXJlID0gKGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5ICopIChlcmQgKyAxKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbmFtZV9jb3VudDsgaSsrLCBlcmUrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG5hbWUsIHJ2YTsKLSAgICAgIHN0cnVjdCByZXNfZW50cnkgKnJlOwotICAgICAgY29uc3QgYmZkX2J5dGUgKmVyczsKLSAgICAgIGludCBsZW5ndGgsIGo7Ci0KLSAgICAgIGlmICgoY29uc3QgYmZkX2J5dGUgKikgZXJlID49IGZpbmZvLT5kYXRhX2VuZCkKLQlvdmVycnVuIChmaW5mbywgXygibmFtZWQgZGlyZWN0b3J5IGVudHJ5IikpOwotCi0gICAgICBuYW1lID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPm5hbWUpOwotICAgICAgcnZhID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPnJ2YSk7Ci0KLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiB0aGUgaGlnaCBiaXQgaW4gTkFNRSBpcyBzZXQuICAqLwotICAgICAgbmFtZSAmPX4gMHg4MDAwMDAwMDsKLQotICAgICAgaWYgKG5hbWUgPiAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQotCW92ZXJydW4gKGZpbmZvLCBfKCJkaXJlY3RvcnkgZW50cnkgbmFtZSIpKTsKLQotICAgICAgZXJzID0gZmluZm8tPmRhdGEgKyBuYW1lOwotCi0gICAgICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7Ci0gICAgICByZS0+bmV4dCA9IE5VTEw7Ci0gICAgICByZS0+aWQubmFtZWQgPSAxOwotICAgICAgbGVuZ3RoID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcnMpOwotICAgICAgcmUtPmlkLnUubi5sZW5ndGggPSBsZW5ndGg7Ci0gICAgICByZS0+aWQudS5uLm5hbWUgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKGxlbmd0aCAqIHNpemVvZiAodW5pY2hhcikpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aDsgaisrKQotCXJlLT5pZC51Lm4ubmFtZVtqXSA9IGdldGZpXzE2IChmaW5mbywgZXJzICsgaiAqIDIgKyAyKTsKLQotICAgICAgaWYgKGxldmVsID09IDApCi0JdHlwZSA9ICZyZS0+aWQ7Ci0KLSAgICAgIGlmICgocnZhICYgMHg4MDAwMDAwMCkgIT0gMCkKLQl7Ci0JICBydmEgJj1+IDB4ODAwMDAwMDA7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJuYW1lZCBzdWJkaXJlY3RvcnkiKSk7Ci0JICByZS0+c3ViZGlyID0gMTsKLQkgIHJlLT51LmRpciA9IHJlYWRfY29mZl9yZXNfZGlyIChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUsCi0JCQkJCSBsZXZlbCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJuYW1lZCByZXNvdXJjZSIpKTsKLQkgIHJlLT5zdWJkaXIgPSAwOwotCSAgcmUtPnUucmVzID0gcmVhZF9jb2ZmX2RhdGFfZW50cnkgKGZpbmZvLT5kYXRhICsgcnZhLCBmaW5mbywgdHlwZSk7Ci0JfQotCi0gICAgICAqcHAgPSByZTsKLSAgICAgIHBwID0gJnJlLT5uZXh0OwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgaWRfY291bnQ7IGkrKywgZXJlKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBuYW1lLCBydmE7Ci0gICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICpyZTsKLQotICAgICAgaWYgKChjb25zdCBiZmRfYnl0ZSAqKSBlcmUgPj0gZmluZm8tPmRhdGFfZW5kKQotCW92ZXJydW4gKGZpbmZvLCBfKCJJRCBkaXJlY3RvcnkgZW50cnkiKSk7Ci0KLSAgICAgIG5hbWUgPSBnZXRmaV8zMiAoZmluZm8sIGVyZS0+bmFtZSk7Ci0gICAgICBydmEgPSBnZXRmaV8zMiAoZmluZm8sIGVyZS0+cnZhKTsKLQotICAgICAgcmUgPSAoc3RydWN0IHJlc19lbnRyeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmUpOwotICAgICAgcmUtPm5leHQgPSBOVUxMOwotICAgICAgcmUtPmlkLm5hbWVkID0gMDsKLSAgICAgIHJlLT5pZC51LmlkID0gbmFtZTsKLQotICAgICAgaWYgKGxldmVsID09IDApCi0JdHlwZSA9ICZyZS0+aWQ7Ci0KLSAgICAgIGlmICgocnZhICYgMHg4MDAwMDAwMCkgIT0gMCkKLQl7Ci0JICBydmEgJj1+IDB4ODAwMDAwMDA7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJJRCBzdWJkaXJlY3RvcnkiKSk7Ci0JICByZS0+c3ViZGlyID0gMTsKLQkgIHJlLT51LmRpciA9IHJlYWRfY29mZl9yZXNfZGlyIChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUsCi0JCQkJCSBsZXZlbCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJJRCByZXNvdXJjZSIpKTsKLQkgIHJlLT5zdWJkaXIgPSAwOwotCSAgcmUtPnUucmVzID0gcmVhZF9jb2ZmX2RhdGFfZW50cnkgKGZpbmZvLT5kYXRhICsgcnZhLCBmaW5mbywgdHlwZSk7Ci0JfQotCi0gICAgICAqcHAgPSByZTsKLSAgICAgIHBwID0gJnJlLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gcmQ7Ci19Ci0KLS8qIFJlYWQgYSByZXNvdXJjZSBkYXRhIGVudHJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotcmVhZF9jb2ZmX2RhdGFfZW50cnkgKGRhdGEsIGZpbmZvLCB0eXBlKQotICAgICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICpmaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLXsKLSAgY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZGF0YSAqZXJkOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICB1bnNpZ25lZCBsb25nIHNpemUsIHJ2YTsKLSAgY29uc3QgYmZkX2J5dGUgKnJlc2RhdGE7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygicmVzb3VyY2UgdHlwZSB1bmtub3duIikpOwotCi0gIGlmICgoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZGF0YSkgPCBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2RhdGEpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJkYXRhIGVudHJ5IikpOwotCi0gIGVyZCA9IChjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhICopIGRhdGE7Ci0KLSAgc2l6ZSA9IGdldGZpXzMyIChmaW5mbywgZXJkLT5zaXplKTsKLSAgcnZhID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPnJ2YSk7Ci0gIGlmIChydmEgPCBmaW5mby0+c2VjYWRkcgotICAgICAgfHwgcnZhIC0gZmluZm8tPnNlY2FkZHIgPj0gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGZpbmZvLT5kYXRhKSkKLSAgICBvdmVycnVuIChmaW5mbywgXygicmVzb3VyY2UgZGF0YSIpKTsKLQotICByZXNkYXRhID0gZmluZm8tPmRhdGEgKyAocnZhIC0gZmluZm8tPnNlY2FkZHIpOwotCi0gIGlmIChzaXplID4gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIHJlc2RhdGEpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJyZXNvdXJjZSBkYXRhIHNpemUiKSk7Ci0KLSAgciA9IGJpbl90b19yZXMgKCp0eXBlLCByZXNkYXRhLCBzaXplLCBmaW5mby0+YmlnX2VuZGlhbik7Ci0KLSAgbWVtc2V0ICgmci0+cmVzX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotICByLT5jb2ZmX2luZm8uY29kZXBhZ2UgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+Y29kZXBhZ2UpOwotICByLT5jb2ZmX2luZm8ucmVzZXJ2ZWQgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+cmVzZXJ2ZWQpOwotCi0gIHJldHVybiByOwotfQotDAotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBidWlsZCBhIGxpc3Qgb2YgYmluZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGJpbmRhdGFfYnVpbGQKLXsKLSAgLyogVGhlIGRhdGEuICAqLwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgLyogVGhlIGxhc3Qgc3RydWN0dXJlIHdlIGhhdmUgYWRkZWQgdG8gdGhlIGxpc3QuICAqLwotICBzdHJ1Y3QgYmluZGF0YSAqbGFzdDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIGxpc3QgYXMgYSB3aG9sZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgaW5mb3JtYXRpb24gYXMgd2UgYnVpbGQgdGhlIGRpcmVjdG9yeQotICAgdHJlZS4gICovCi0KLXN0cnVjdCBjb2ZmX3dyaXRlX2luZm8KLXsKLSAgLyogVGhlc2UgZmllbGRzIGFyZSBiYXNlZCBvbiB0aGUgQkZELiAgKi8KLSAgLyogVGhlIEJGRCBpdHNlbGYuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSBmaWxlIGlzIGJpZyBlbmRpYW4uICAqLwotICBpbnQgYmlnX2VuZGlhbjsKLSAgLyogUG9pbnRlciB0byBzZWN0aW9uIHN5bWJvbCB1c2VkIHRvIGJ1aWxkIFJWQSByZWxvY3MuICAqLwotICBhc3ltYm9sICoqc3ltcHA7Ci0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBpbml0aWFsbHksIGFuZCB0aGVuIG5vdCBjaGFuZ2VkLiAgKi8KLSAgLyogTGVuZ3RoIG9mIGRpcmVjdG9yeSB0YWJsZXMgYW5kIGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGRpcnNpemU7Ci0gIC8qIExlbmd0aCBvZiBkaXJlY3RvcnkgZW50cnkgc3RyaW5ncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZGlyc3Ryc2l6ZTsKLSAgLyogTGVuZ3RoIG9mIHJlc291cmNlIGRhdGEgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZGF0YWVudHNpemU7Ci0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSB1cGRhdGVkIGFzIHdlIGFkZCBkYXRhLiAgKi8KLSAgLyogRGlyZWN0b3J5IHRhYmxlcyBhbmQgZW50cmllcy4gICovCi0gIHN0cnVjdCBiaW5kYXRhX2J1aWxkIGRpcnM7Ci0gIC8qIERpcmVjdG9yeSBlbnRyeSBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgZGlyc3RyczsKLSAgLyogUmVzb3VyY2UgZGF0YSBlbnRyaWVzLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgZGF0YWVudHM7Ci0gIC8qIEFjdHVhbCByZXNvdXJjZSBkYXRhLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgcmVzb3VyY2VzOwotICAvKiBSZWxvY2F0aW9ucy4gICovCi0gIGFyZWxlbnQgKipyZWxvY3M7Ci0gIC8qIE51bWJlciBvZiByZWxvY2F0aW9ucy4gICovCi0gIHVuc2lnbmVkIGludCByZWxvY19jb3VudDsKLX07Ci0KLS8qIE1hY3JvcyB0byBzd2FwIG91dCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIHB1dGN3aV8xNihjd2ksIHYsIHMpIFwKLSAgKChjd2ktPmJpZ19lbmRpYW4pID8gYmZkX3B1dGIxNiAoKHYpLCAocykpIDogYmZkX3B1dGwxNiAoKHYpLCAocykpKQotI2RlZmluZSBwdXRjd2lfMzIoY3dpLCB2LCBzKSBcCi0gICgoY3dpLT5iaWdfZW5kaWFuKSA/IGJmZF9wdXRiMzIgKCh2KSwgKHMpKSA6IGJmZF9wdXRsMzIgKCh2KSwgKHMpKSkKLQotc3RhdGljIHZvaWQgY29mZl9iaW5fc2l6ZXMKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqY29mZl9hbGxvYyBQQVJBTVMgKChzdHJ1Y3QgYmluZGF0YV9idWlsZCAqLCBzaXplX3QpKTsKLXN0YXRpYyB2b2lkIGNvZmZfdG9fYmluCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICosIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKikpOwotc3RhdGljIHZvaWQgY29mZl9yZXNfdG9fYmluCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqKSk7Ci0KLS8qIFdyaXRlIHJlc291cmNlcyB0byBhIENPRkYgZmlsZS4gIFJFU09VUkNFUyBzaG91bGQgYWxyZWFkeSBiZQotICAgc29ydGVkLgotCi0gICBSaWdodCBub3cgd2UgYWx3YXlzIGNyZWF0ZSBhIG5ldyBmaWxlLiAgU29tZWRheSB3ZSBzaG91bGQgYWxzbwotICAgb2ZmZXIgdGhlIGFiaWxpdHkgdG8gbWVyZ2UgcmVzb3VyY2VzIGludG8gYW4gZXhpc3RpbmcgZmlsZS4gIFRoaXMKLSAgIHdvdWxkIHJlcXVpcmUgZG9pbmcgdGhlIGJhc2ljIHdvcmsgb2Ygb2JqY29weSwganVzdCBtb2RpZnlpbmcgb3IKLSAgIGFkZGluZyB0aGUgLnJzcmMgc2VjdGlvbi4gICovCi0KLXZvaWQKLXdyaXRlX2NvZmZfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCwgcmVzb3VyY2VzKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0OwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotewotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gY3dpOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGgsIG9mZnNldDsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgb3V0cHV0IikpOwotCi0gIGFiZmQgPSBiZmRfb3BlbncgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOwotCi0gIGlmICghIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2Zvcm1hdCIpOwotCi0jaWYgZGVmaW5lZCBETExUT09MX1NICi0gIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zaCwgMCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9hcmNoX21hY2goc2gpIik7Ci0jZWxpZiBkZWZpbmVkIERMTFRPT0xfTUlQUwotICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbWlwcywgMCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9hcmNoX21hY2gobWlwcykiKTsKLSNlbGlmIGRlZmluZWQgRExMVE9PTF9BUk0KLSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FybSwgMCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9hcmNoX21hY2goYXJtKSIpOwotI2Vsc2UKLSAgLyogRklYTUU6IFRoaXMgaXMgb2J2aW91c2x5IGkzODYgc3BlY2lmaWMuICAqLwotICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfaTM4NiwgMCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9hcmNoX21hY2goaTM4NikiKTsKLSNlbmRpZgotCi0gIGlmICghIGJmZF9zZXRfZmlsZV9mbGFncyAoYWJmZCwgSEFTX1NZTVMgfCBIQVNfUkVMT0MpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfZmlsZV9mbGFncyIpOwotCi0gIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucnNyYyIpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsICgiYmZkX21ha2Vfc2VjdGlvbiIpOwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLAotCQkJICAgICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DCi0JCQkJfCBTRUNfTE9BRCB8IFNFQ19EQVRBKSkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX2ZsYWdzIik7Ci0KLSAgaWYgKCEgYmZkX3NldF9zeW10YWIgKGFiZmQsIHNlYy0+c3ltYm9sX3B0cl9wdHIsIDEpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfc3ltdGFiIik7Ci0KLSAgLyogUmVxdWlyaW5nIHRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gQkZELiAgKi8KLSAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNlYzsKLQotICAvKiBUaGUgb3JkZXIgb2YgZGF0YSBpbiB0aGUgLnJzcmMgc2VjdGlvbiBpcwotICAgICAgIHJlc291cmNlIGRpcmVjdG9yeSB0YWJsZXMgYW5kIGVudHJpZXMKLSAgICAgICByZXNvdXJjZSBkaXJlY3Rvcnkgc3RyaW5ncwotICAgICAgIHJlc291cmNlIGRhdGEgZW50cmllcwotICAgICAgIGFjdHVhbCByZXNvdXJjZSBkYXRhCi0KLSAgICAgV2UgYnVpbGQgdGhlc2UgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgaW4gZGlmZmVyZW50IGxpc3RzLiAgKi8KLQotICBjd2kuYWJmZCA9IGFiZmQ7Ci0gIGN3aS5iaWdfZW5kaWFuID0gYmZkX2JpZ19lbmRpYW4gKGFiZmQpOwotICBjd2kuc3ltcHAgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotICBjd2kuZGlyc2l6ZSA9IDA7Ci0gIGN3aS5kaXJzdHJzaXplID0gMDsKLSAgY3dpLmRhdGFlbnRzaXplID0gMDsKLSAgY3dpLmRpcnMuZCA9IE5VTEw7Ci0gIGN3aS5kaXJzLmxhc3QgPSBOVUxMOwotICBjd2kuZGlycy5sZW5ndGggPSAwOwotICBjd2kuZGlyc3Rycy5kID0gTlVMTDsKLSAgY3dpLmRpcnN0cnMubGFzdCA9IE5VTEw7Ci0gIGN3aS5kaXJzdHJzLmxlbmd0aCA9IDA7Ci0gIGN3aS5kYXRhZW50cy5kID0gTlVMTDsKLSAgY3dpLmRhdGFlbnRzLmxhc3QgPSBOVUxMOwotICBjd2kuZGF0YWVudHMubGVuZ3RoID0gMDsKLSAgY3dpLnJlc291cmNlcy5kID0gTlVMTDsKLSAgY3dpLnJlc291cmNlcy5sYXN0ID0gTlVMTDsKLSAgY3dpLnJlc291cmNlcy5sZW5ndGggPSAwOwotICBjd2kucmVsb2NzID0gTlVMTDsKLSAgY3dpLnJlbG9jX2NvdW50ID0gMDsKLQotICAvKiBXb3JrIG91dCB0aGUgc2l6ZXMgb2YgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBlbnRyaWVzLCBzbyB0aGF0IHdlCi0gICAgIGtub3cgdGhlIHZhcmlvdXMgb2Zmc2V0cyB3ZSB3aWxsIG5lZWQuICAqLwotICBjb2ZmX2Jpbl9zaXplcyAocmVzb3VyY2VzLCAmY3dpKTsKLQotICAvKiBGb3JjZSB0aGUgZGlyZWN0b3J5IHN0cmluZ3MgdG8gYmUgMzIgYml0IGFsaWduZWQuICBFdmVyeSBvdGhlcgotICAgICBzdHJ1Y3R1cmUgaXMgMzIgYml0IGFsaWduZWQgYW55aG93LiAgKi8KLSAgY3dpLmRpcnN0cnNpemUgPSAoY3dpLmRpcnN0cnNpemUgKyAzKSAmfiAzOwotCi0gIC8qIEFjdHVhbGx5IGNvbnZlcnQgdGhlIHJlc291cmNlcyB0byBiaW5hcnkuICAqLwotICBjb2ZmX3RvX2JpbiAocmVzb3VyY2VzLCAmY3dpKTsKLQotICAvKiBBZGQgYW5vdGhlciAyIGJ5dGVzIHRvIHRoZSBkaXJlY3Rvcnkgc3RyaW5ncyBpZiBuZWVkZWQgZm9yCi0gICAgIGFsaWdubWVudC4gICovCi0gIGlmICgoY3dpLmRpcnN0cnMubGVuZ3RoICYgMykgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpleDsKLQotICAgICAgZXggPSBjb2ZmX2FsbG9jICgmY3dpLmRpcnN0cnMsIDIpOwotICAgICAgZXhbMF0gPSAwOwotICAgICAgZXhbMV0gPSAwOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZGF0YSB3ZSBidWlsdCBjYW1lIG91dCB0byB0aGUgc2FtZSBzaXplIGFzIHdlCi0gICAgIGNhbGN1bGF0ZWQgaW5pdGlhbGx5LiAgKi8KLSAgYXNzZXJ0IChjd2kuZGlycy5sZW5ndGggPT0gY3dpLmRpcnNpemUpOwotICBhc3NlcnQgKGN3aS5kaXJzdHJzLmxlbmd0aCA9PSBjd2kuZGlyc3Ryc2l6ZSk7Ci0gIGFzc2VydCAoY3dpLmRhdGFlbnRzLmxlbmd0aCA9PSBjd2kuZGF0YWVudHNpemUpOwotCi0gIGxlbmd0aCA9IChjd2kuZGlyc2l6ZQotCSAgICArIGN3aS5kaXJzdHJzaXplCi0JICAgICsgY3dpLmRhdGFlbnRzaXplCi0JICAgICsgY3dpLnJlc291cmNlcy5sZW5ndGgpOwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMsIGxlbmd0aCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX3NpemUiKTsKLQotICBiZmRfc2V0X3JlbG9jIChhYmZkLCBzZWMsIGN3aS5yZWxvY3MsIGN3aS5yZWxvY19jb3VudCk7Ci0KLSAgb2Zmc2V0ID0gMDsKLSAgZm9yIChkID0gY3dpLmRpcnMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQotCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOwotICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKLSAgICB9Ci0gIGZvciAoZCA9IGN3aS5kaXJzdHJzLmQ7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGQtPmRhdGEsIG9mZnNldCwgZC0+bGVuZ3RoKSkKLQliZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIG9mZnNldCArPSBkLT5sZW5ndGg7Ci0gICAgfQotICBmb3IgKGQgPSBjd2kuZGF0YWVudHMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQotCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOwotICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKLSAgICB9Ci0gIGZvciAoZCA9IGN3aS5yZXNvdXJjZXMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQotCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOwotICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKLSAgICB9Ci0KLSAgYXNzZXJ0IChvZmZzZXQgPT0gbGVuZ3RoKTsKLQotICBpZiAoISBiZmRfY2xvc2UgKGFiZmQpKQotICAgIGJmZF9mYXRhbCAoImJmZF9jbG9zZSIpOwotCi0gIC8qIFdlIGFsbG9jYXRlZCB0aGUgcmVsb2NzIGFycmF5IHVzaW5nIG1hbGxvYy4gICovCi0gIGZyZWUgKGN3aS5yZWxvY3MpOwotfQotCi0vKiBXb3JrIG91dCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZml4ZWQgc2l6ZSByZXNvdXJjZSBkaXJlY3RvcnkKLSAgIGVudHJpZXMuICBUaGlzIHVwZGF0ZXMgZmllbGRzIGluIENXSS4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX2Jpbl9zaXplcyAocmVzZGlyLCBjd2kpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNkaXI7Ci0gICAgIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKmN3aTsKLXsKLSAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0KLSAgY3dpLT5kaXJzaXplICs9IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5KTsKLQotICBmb3IgKHJlID0gcmVzZGlyLT5lbnRyaWVzOyByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQotICAgIHsKLSAgICAgIGN3aS0+ZGlyc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5KTsKLQotICAgICAgaWYgKHJlLT5pZC5uYW1lZCkKLQljd2ktPmRpcnN0cnNpemUgKz0gcmUtPmlkLnUubi5sZW5ndGggKiAyICsgMjsKLQotICAgICAgaWYgKHJlLT5zdWJkaXIpCi0JY29mZl9iaW5fc2l6ZXMgKHJlLT51LmRpciwgY3dpKTsKLSAgICAgIGVsc2UKLQljd2ktPmRhdGFlbnRzaXplICs9IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZGF0YSk7Ci0gICAgfQotfQotCi0vKiBBbGxvY2F0ZSBkYXRhIGZvciBhIHBhcnRpY3VsYXIgbGlzdC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLWNvZmZfYWxsb2MgKGJiLCBzaXplKQotICAgICBzdHJ1Y3QgYmluZGF0YV9idWlsZCAqYmI7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCi0gIGQtPm5leHQgPSBOVUxMOwotICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKHNpemUpOwotICBkLT5sZW5ndGggPSBzaXplOwotCi0gIGlmIChiYi0+ZCA9PSBOVUxMKQotICAgIGJiLT5kID0gZDsKLSAgZWxzZQotICAgIGJiLT5sYXN0LT5uZXh0ID0gZDsKLSAgYmItPmxhc3QgPSBkOwotICBiYi0+bGVuZ3RoICs9IHNpemU7Ci0KLSAgcmV0dXJuIGQtPmRhdGE7Ci19Ci0KLS8qIENvbnZlcnQgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBSRVNESVIgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfdG9fYmluIChyZXNkaXIsIGN3aSkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKLSAgICAgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqY3dpOwotewotICBzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKmVyZDsKLSAgaW50IGNpLCBjbjsKLSAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqZTsKLSAgc3RydWN0IGV4dGVybl9yZXNfZW50cnkgKmVyZTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRpcmVjdG9yeSB0YWJsZS4gICovCi0KLSAgZXJkID0gKChzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKikKLQkgY29mZl9hbGxvYyAoJmN3aS0+ZGlycywgc2l6ZW9mICgqZXJkKSkpOwotCi0gIHB1dGN3aV8zMiAoY3dpLCByZXNkaXItPmNoYXJhY3RlcmlzdGljcywgZXJkLT5jaGFyYWN0ZXJpc3RpY3MpOwotICBwdXRjd2lfMzIgKGN3aSwgcmVzZGlyLT50aW1lLCBlcmQtPnRpbWUpOwotICBwdXRjd2lfMTYgKGN3aSwgcmVzZGlyLT5tYWpvciwgZXJkLT5tYWpvcik7Ci0gIHB1dGN3aV8xNiAoY3dpLCByZXNkaXItPm1pbm9yLCBlcmQtPm1pbm9yKTsKLQotICBjaSA9IDA7Ci0gIGNuID0gMDsKLSAgZm9yIChlID0gcmVzZGlyLT5lbnRyaWVzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChlLT5pZC5uYW1lZCkKLQkrK2NuOwotICAgICAgZWxzZQotCSsrY2k7Ci0gICAgfQotCi0gIHB1dGN3aV8xNiAoY3dpLCBjbiwgZXJkLT5uYW1lX2NvdW50KTsKLSAgcHV0Y3dpXzE2IChjd2ksIGNpLCBlcmQtPmlkX2NvdW50KTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRhdGEgZW50cmllcy4gIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSBzcGFjZSBmb3IgYWxsCi0gICAgIHRoZSBlbnRyaWVzIGJlZm9yZSB3cml0aW5nIHRoZW0gb3V0LiAgVGhhdCBwZXJtaXRzIGEgcmVjdXJzaXZlCi0gICAgIGNhbGwgdG8gd29yayBjb3JyZWN0bHkgd2hlbiB3cml0aW5nIG91dCBzdWJkaXJlY3Rvcmllcy4gICovCi0KLSAgZXJlID0gKChzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeSAqKQotCSBjb2ZmX2FsbG9jICgmY3dpLT5kaXJzLCAoY2kgKyBjbikgKiBzaXplb2YgKCplcmUpKSk7Ci0gIGZvciAoZSA9IHJlc2Rpci0+ZW50cmllczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCwgZXJlKyspCi0gICAgewotICAgICAgaWYgKCEgZS0+aWQubmFtZWQpCi0JcHV0Y3dpXzMyIChjd2ksIGUtPmlkLnUuaWQsIGVyZS0+bmFtZSk7Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgY2hhciAqc3RyOwotCSAgaW50IGk7Ci0KLQkgIC8qIEZvciBzb21lIHJlYXNvbiBleGlzdGluZyBmaWxlcyBzZWVtIHRvIGhhdmUgdGhlIGhpZ2ggYml0Ci0gICAgICAgICAgICAgc2V0IG9uIHRoZSBhZGRyZXNzIG9mIHRoZSBuYW1lLCBhbHRob3VnaCB0aGF0IGlzIG5vdAotICAgICAgICAgICAgIGRvY3VtZW50ZWQuICAqLwotCSAgcHV0Y3dpXzMyIChjd2ksCi0JCSAgICAgMHg4MDAwMDAwMCB8IChjd2ktPmRpcnNpemUgKyBjd2ktPmRpcnN0cnMubGVuZ3RoKSwKLQkJICAgICBlcmUtPm5hbWUpOwotCi0JICBzdHIgPSBjb2ZmX2FsbG9jICgmY3dpLT5kaXJzdHJzLCBlLT5pZC51Lm4ubGVuZ3RoICogMiArIDIpOwotCSAgcHV0Y3dpXzE2IChjd2ksIGUtPmlkLnUubi5sZW5ndGgsIHN0cik7Ci0JICBmb3IgKGkgPSAwOyBpIDwgZS0+aWQudS5uLmxlbmd0aDsgaSsrKQotCSAgICBwdXRjd2lfMTYgKGN3aSwgZS0+aWQudS5uLm5hbWVbaV0sIHN0ciArIGkgKiAyICsgMik7Ci0JfQotCi0gICAgICBpZiAoZS0+c3ViZGlyKQotCXsKLQkgIHB1dGN3aV8zMiAoY3dpLCAweDgwMDAwMDAwIHwgY3dpLT5kaXJzLmxlbmd0aCwgZXJlLT5ydmEpOwotCSAgY29mZl90b19iaW4gKGUtPnUuZGlyLCBjd2kpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwdXRjd2lfMzIgKGN3aSwKLQkJICAgICBjd2ktPmRpcnNpemUgKyBjd2ktPmRpcnN0cnNpemUgKyBjd2ktPmRhdGFlbnRzLmxlbmd0aCwKLQkJICAgICBlcmUtPnJ2YSk7Ci0KLQkgIGNvZmZfcmVzX3RvX2JpbiAoZS0+dS5yZXMsIGN3aSk7Ci0JfQotICAgIH0KLX0KLQotLyogQ29udmVydCB0aGUgcmVzb3VyY2UgUkVTIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3Jlc190b19iaW4gKHJlcywgY3dpKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gICAgIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKmN3aTsKLXsKLSAgYXJlbGVudCAqcjsKLSAgc3RydWN0IGV4dGVybl9yZXNfZGF0YSAqZXJkOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uLCBhbHRob3VnaCBldmVyeSBvdGhlciBhZGRyZXNzIGlzIGEgc2VjdGlvbgotICAgICBvZmZzZXQsIHRoZSBhZGRyZXNzIG9mIHRoZSByZXNvdXJjZSBkYXRhIGl0c2VsZiBpcyBhbiBSVkEuICBUaGF0Ci0gICAgIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIHJlbG9jYXRpb24gZm9yIGl0LiAgV2UgYWxsb2NhdGUKLSAgICAgdGhlIHJlbG9jcyBhcnJheSB1c2luZyBtYWxsb2Mgc28gdGhhdCB3ZSBjYW4gdXNlIHJlYWxsb2MuICBGSVhNRToKLSAgICAgVGhpcyByZWxvY2F0aW9uIGhhbmRsaW5nIGlzIGNvcnJlY3QgZm9yIHRoZSBpMzg2LCBidXQgcHJvYmFibHkKLSAgICAgbm90IGZvciBhbnkgb3RoZXIgdGFyZ2V0LiAgKi8KLQotICByID0gKGFyZWxlbnQgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByLT5zeW1fcHRyX3B0ciA9IGN3aS0+c3ltcHA7Ci0gIHItPmFkZHJlc3MgPSBjd2ktPmRpcnNpemUgKyBjd2ktPmRpcnN0cnNpemUgKyBjd2ktPmRhdGFlbnRzLmxlbmd0aDsKLSAgci0+YWRkZW5kID0gMDsKLSAgci0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGN3aS0+YWJmZCwgQkZEX1JFTE9DX1JWQSk7Ci0gIGlmIChyLT5ob3d0byA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoXygiY2FuJ3QgZ2V0IEJGRF9SRUxPQ19SVkEgcmVsb2NhdGlvbiB0eXBlIikpOwotCi0gIGN3aS0+cmVsb2NzID0geHJlYWxsb2MgKGN3aS0+cmVsb2NzLAotCQkJICAoY3dpLT5yZWxvY19jb3VudCArIDIpICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgY3dpLT5yZWxvY3NbY3dpLT5yZWxvY19jb3VudF0gPSByOwotICBjd2ktPnJlbG9jc1tjd2ktPnJlbG9jX2NvdW50ICsgMV0gPSBOVUxMOwotICArK2N3aS0+cmVsb2NfY291bnQ7Ci0KLSAgZXJkID0gKHN0cnVjdCBleHRlcm5fcmVzX2RhdGEgKikgY29mZl9hbGxvYyAoJmN3aS0+ZGF0YWVudHMsIHNpemVvZiAoKmVyZCkpOwotCi0gIHB1dGN3aV8zMiAoY3dpLAotCSAgICAgKGN3aS0+ZGlyc2l6ZQotCSAgICAgICsgY3dpLT5kaXJzdHJzaXplCi0JICAgICAgKyBjd2ktPmRhdGFlbnRzaXplCi0JICAgICAgKyBjd2ktPnJlc291cmNlcy5sZW5ndGgpLAotCSAgICAgZXJkLT5ydmEpOwotICBwdXRjd2lfMzIgKGN3aSwgcmVzLT5jb2ZmX2luZm8uY29kZXBhZ2UsIGVyZC0+Y29kZXBhZ2UpOwotICBwdXRjd2lfMzIgKGN3aSwgcmVzLT5jb2ZmX2luZm8ucmVzZXJ2ZWQsIGVyZC0+cmVzZXJ2ZWQpOwotCi0gIGQgPSByZXNfdG9fYmluIChyZXMsIGN3aS0+YmlnX2VuZGlhbik7Ci0KLSAgaWYgKGN3aS0+cmVzb3VyY2VzLmQgPT0gTlVMTCkKLSAgICBjd2ktPnJlc291cmNlcy5kID0gZDsKLSAgZWxzZQotICAgIGN3aS0+cmVzb3VyY2VzLmxhc3QtPm5leHQgPSBkOwotCi0gIGxlbmd0aCA9IDA7Ci0gIGZvciAoOyBkLT5uZXh0ICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotICAgIGxlbmd0aCArPSBkLT5sZW5ndGg7Ci0gIGxlbmd0aCArPSBkLT5sZW5ndGg7Ci0gIGN3aS0+cmVzb3VyY2VzLmxhc3QgPSBkOwotICBjd2ktPnJlc291cmNlcy5sZW5ndGggKz0gbGVuZ3RoOwotCi0gIHB1dGN3aV8zMiAoY3dpLCBsZW5ndGgsIGVyZC0+c2l6ZSk7Ci0KLSAgLyogRm9yY2UgdGhlIG5leHQgcmVzb3VyY2UgdG8gaGF2ZSAzMiBiaXQgYWxpZ25tZW50LiAgKi8KLQotICBpZiAoKGxlbmd0aCAmIDMpICE9IDApCi0gICAgewotICAgICAgaW50IGFkZDsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmV4OwotCi0gICAgICBhZGQgPSA0IC0gKGxlbmd0aCAmIDMpOwotCi0gICAgICBleCA9IGNvZmZfYWxsb2MgKCZjd2ktPnJlc291cmNlcywgYWRkKTsKLSAgICAgIG1lbXNldCAoZXgsIDAsIGFkZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmVzcmMuYyBiL2JpbnV0aWxzL3Jlc3JjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjM2M5YTcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVzcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NTAgKzAsMCBAQAotLyogcmVzcmMuYyAtLSByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJjIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgcmVhZCBhbmQgd3JpdGUgV2luZG93cyByYyBmaWxlcy4KLSAgIFRoZXNlIGFyZSB0ZXh0IGZpbGVzIHRoYXQgcmVwcmVzZW50IHJlc291cmNlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jZWxzZSAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKQotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpJjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykmMDM3NykgIT0gMDE3NyAmJiAoKHcpJn4wMzc3KSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAwMTc3KQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpID4+IDgpICYgMDM3NykKLSNlbmRpZgotI2Vsc2UgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOX18pICovCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQodykJKCgodykgJiAweGZmKSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdJRlNJR05BTEVECi0jZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpICYgMHhmZikgIT0gMCAmJiAoKHcpICYgMHhmZikgIT0gMHg3ZikKLSNlbmRpZgotI2lmbmRlZiBXVEVSTVNJRwotI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMHg3ZikKLSNlbmRpZgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSAmIDB4ZmYwMCkgPj4gOCkKLSNlbmRpZgotI2VuZGlmIC8qIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTl9fKSAqLwotI2VuZGlmIC8qICEgSEFWRV9TWVNfV0FJVF9IICovCi0KLSNpZm5kZWYgU1RET1VUX0ZJTEVOTwotI2RlZmluZSBTVERPVVRfRklMRU5PIDEKLSNlbmRpZgotIAotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTl9fKQotI2RlZmluZSBwb3BlbiBfcG9wZW4KLSNkZWZpbmUgcGNsb3NlIF9wY2xvc2UKLSNlbmRpZgotCi0vKiBUaGUgZGVmYXVsdCBwcmVwcm9jZXNzb3IuICAqLwotCi0jZGVmaW5lIERFRkFVTFRfUFJFUFJPQ0VTU09SICJnY2MgLUUgLXhjLWhlYWRlciAtRFJDX0lOVk9LRUQiCi0KLS8qIFdlIHJlYWQgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGluIGEgY3Vyc29yIG9yIGljb24gZmlsZSBpbnRvCi0gICBpbnN0YW5jZXMgb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgaWNvbmRpcgotewotICAvKiBXaWR0aCBvZiBpbWFnZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgd2lkdGg7Ci0gIC8qIEhlaWdodCBvZiBpbWFnZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgaGVpZ2h0OwotICAvKiBOdW1iZXIgb2YgY29sb3JzIGluIGltYWdlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBjb2xvcmNvdW50OwotICB1bmlvbgotICB7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogQ29sb3IgcGxhbmVzLiAgKi8KLSAgICAgIHVuc2lnbmVkIHNob3J0IHBsYW5lczsKLSAgICAgIC8qIEJpdHMgcGVyIHBpeGVsLiAgKi8KLSAgICAgIHVuc2lnbmVkIHNob3J0IGJpdHM7Ci0gICAgfSBpY29uOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIFggY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgICAgIHVuc2lnbmVkIHNob3J0IHhob3RzcG90OwotICAgICAgLyogWSBjb29yZGluYXRlIG9mIGhvdHNwb3QuICAqLwotICAgICAgdW5zaWduZWQgc2hvcnQgeWhvdHNwb3Q7Ci0gICAgfSBjdXJzb3I7Ci0gIH0gdTsKLSAgLyogQnl0ZXMgaW4gaW1hZ2UuICAqLwotICB1bnNpZ25lZCBsb25nIGJ5dGVzOwotICAvKiBGaWxlIG9mZnNldCBvZiBpbWFnZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotfTsKLQotLyogVGhlIG5hbWUgb2YgdGhlIHJjIGZpbGUgd2UgYXJlIHJlYWRpbmcuICAqLwotCi1jaGFyICpyY19maWxlbmFtZTsKLQotLyogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSByYyBmaWxlLiAgKi8KLQotaW50IHJjX2xpbmVubzsKLQotLyogVGhlIHBpcGUgd2UgYXJlIHJlYWRpbmcgZnJvbSwgc28gdGhhdCB3ZSBjYW4gY2xvc2UgaXQgaWYgd2UgZXhpdC4gICovCi0KLXN0YXRpYyBGSUxFICpjcHBfcGlwZTsKLQotLyogVGhlIHRlbXBvcmFyeSBmaWxlIHVzZWQgaWYgd2UncmUgbm90IHVzaW5nIHBvcGVuLCBzbyB3ZSBjYW4gZGVsZXRlIGl0Ci0gICBpZiB3ZSBleGl0LiAgKi8KLQotc3RhdGljIGNoYXIgKmNwcF90ZW1wX2ZpbGU7Ci0KLS8qIElucHV0IHN0cmVhbSBpcyBlaXRoZXIgYSBmaWxlIG9yIGEgcGlwZS4gKi8KLQotc3RhdGljIGVudW0ge0lTVFJFQU1fUElQRSwgSVNUUkVBTV9GSUxFfSBpc3RyZWFtX3R5cGU7Ci0KLS8qIEFzIHdlIHJlYWQgdGhlIHJjIGZpbGUsIHdlIGF0dGFjaCBpbmZvcm1hdGlvbiB0byB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotCi0vKiBUaGUgbnVtYmVyIG9mIGN1cnNvciByZXNvdXJjZXMgd2UgaGF2ZSB3cml0dGVuIG91dC4gICovCi0KLXN0YXRpYyBpbnQgY3Vyc29yczsKLQotLyogVGhlIG51bWJlciBvZiBmb250IHJlc291cmNlcyB3ZSBoYXZlIHdyaXR0ZW4gb3V0LiAgKi8KLQotc3RhdGljIGludCBmb250czsKLQotLyogRm9udCBkaXJlY3RvcnkgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgZm9udGRpciAqZm9udGRpcnM7Ci0KLS8qIFJlc291cmNlIGluZm8gdG8gdXNlIGZvciBmb250ZGlycy4gICovCi0KLXN0cnVjdCByZXNfcmVzX2luZm8gZm9udGRpcnNfcmVzaW5mbzsKLQotLyogVGhlIG51bWJlciBvZiBpY29uIHJlc291cmNlcyB3ZSBoYXZlIHdyaXR0ZW4gb3V0LiAgKi8KLQotc3RhdGljIGludCBpY29uczsKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGludCBydW5fY21kIFBBUkFNUyAoKGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgRklMRSAqb3Blbl9pbnB1dF9zdHJlYW0gUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgRklMRSAqbG9va19mb3JfZGVmYXVsdCBQQVJBTVMgKChjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LAotCQkJCSAgICAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgY2xvc2VfaW5wdXRfc3RyZWFtIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHVuZXhwZWN0ZWRfZW9mIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBnZXRfd29yZCBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2xvbmcgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGdldF9kYXRhCi0gIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlZmluZV9mb250ZGlycyBQQVJBTVMgKCh2b2lkKSk7Ci0MCi0vKiBSdW4gYGNtZCcgYW5kIHJlZGlyZWN0IHRoZSBvdXRwdXQgdG8gYHJlZGlyJy4gKi8KLQotc3RhdGljIGludAotcnVuX2NtZCAoY21kLCByZWRpcikKLSAgICAgY2hhciAqY21kOwotICAgICBjb25zdCBjaGFyICpyZWRpcjsKLXsKLSAgY2hhciAqczsKLSAgaW50IHBpZCwgd2FpdF9zdGF0dXMsIHJldGNvZGU7Ci0gIGludCBpOwotICBjb25zdCBjaGFyICoqYXJndjsKLSAgY2hhciAqZXJybXNnX2ZtdCwgKmVycm1zZ19hcmc7Ci0gIGNoYXIgKnRlbXBfYmFzZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gIGludCBpbl9xdW90ZTsKLSAgY2hhciBzZXA7Ci0gIGludCByZWRpcl9oYW5kbGUgPSAtMTsKLSAgaW50IHN0ZG91dF9zYXZlID0gLTE7Ci0KLSAgLyogQ291bnQgdGhlIGFyZ3MuICAqLwotICBpID0gMDsKLSAgCi0gIGZvciAocyA9IGNtZDsgKnM7IHMrKykKLSAgICBpZiAoKnMgPT0gJyAnKQotICAgICAgaSsrOwotICAKLSAgaSsrOwotICBhcmd2ID0gYWxsb2NhIChzaXplb2YgKGNoYXIgKikgKiAoaSArIDMpKTsKLSAgaSA9IDA7Ci0gIHMgPSBjbWQ7Ci0gIAotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoKnMgPT0gJyAnICYmICpzICE9IDApCi0JcysrOwotICAgICAgCi0gICAgICBpZiAoKnMgPT0gMCkKLQlicmVhazsKLSAgICAgIAotICAgICAgaW5fcXVvdGUgPSAoKnMgPT0gJ1wnJyB8fCAqcyA9PSAnIicpOwotICAgICAgc2VwID0gKGluX3F1b3RlKSA/ICpzKysgOiAnICc7Ci0gICAgICBhcmd2W2krK10gPSBzOwotICAgICAgCi0gICAgICB3aGlsZSAoKnMgIT0gc2VwICYmICpzICE9IDApCi0JcysrOwotICAgICAgCi0gICAgICBpZiAoKnMgPT0gMCkKLQlicmVhazsKLSAgICAgIAotICAgICAgKnMrKyA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChpbl9xdW90ZSkKLSAgICAgICAgcysrOwotICAgIH0KLSAgYXJndltpKytdID0gTlVMTDsKLQotICAvKiBTZXR1cCB0aGUgcmVkaXJlY3Rpb24uICBXZSBjYW4ndCB1c2UgdGhlIHVzdWFsIGZvcmsvZXhlYyBhbmQgcmVkaXJlY3QKLSAgICAgc2luY2Ugd2UgbWF5IGJlIHJ1bm5pbmcgb24gbm9uLVBPU0lYIFdpbmRvd3MgaG9zdC4gICovCi0KLSAgZmZsdXNoIChzdGRvdXQpOwotICBmZmx1c2ggKHN0ZGVycik7Ci0KLSAgLyogT3BlbiB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUuICAqLwotICByZWRpcl9oYW5kbGUgPSBvcGVuIChyZWRpciwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgMDY2Nik7Ci0gIGlmIChyZWRpcl9oYW5kbGUgPT0gLTEpCi0gICAgZmF0YWwgKF8oImNhbid0IG9wZW4gdGVtcG9yYXJ5IGZpbGUgYCVzJzogJXMiKSwgcmVkaXIsIAotICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKLQotICAvKiBEdXBsaWNhdGUgdGhlIHN0ZG91dCBmaWxlIGhhbmRsZSBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIuICAqLwotICBzdGRvdXRfc2F2ZSA9IGR1cCAoU1RET1VUX0ZJTEVOTyk7Ci0gIGlmIChzdGRvdXRfc2F2ZSA9PSAtMSkKLSAgICBmYXRhbCAoXygiY2FuJ3QgcmVkaXJlY3Qgc3Rkb3V0OiBgJXMnOiAlcyIpLCByZWRpciwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgLyogUmVkaXJlY3Qgc3Rkb3V0IHRvIG91ciBvdXRwdXQgZmlsZS4gICovCi0gIGR1cDIgKHJlZGlyX2hhbmRsZSwgU1RET1VUX0ZJTEVOTyk7Ci0KLSAgcGlkID0gcGV4ZWN1dGUgKGFyZ3ZbMF0sIChjaGFyICogY29uc3QgKikgYXJndiwgcHJvZ3JhbV9uYW1lLCB0ZW1wX2Jhc2UsCi0JCSAgJmVycm1zZ19mbXQsICZlcnJtc2dfYXJnLCBQRVhFQ1VURV9PTkUgfCBQRVhFQ1VURV9TRUFSQ0gpOwotCi0gIC8qIFJlc3RvcmUgc3Rkb3V0IHRvIGl0cyBwcmV2aW91cyBzZXR0aW5nLiAgKi8KLSAgZHVwMiAoc3Rkb3V0X3NhdmUsIFNURE9VVF9GSUxFTk8pOwotCi0gIC8qIENsb3NlIHJlcG9uc2UgZmlsZS4gICovCi0gIGNsb3NlIChyZWRpcl9oYW5kbGUpOwotCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgZmF0YWwgKF8oIiVzICVzOiAlcyIpLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXRjb2RlID0gMDsKLSAgcGlkID0gcHdhaXQgKHBpZCwgJndhaXRfc3RhdHVzLCAwKTsKLSAgCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgZmF0YWwgKF8oIndhaXQ6ICVzIiksIHN0cmVycm9yIChlcnJubykpOwotICAgICAgcmV0Y29kZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChXSUZTSUdOQUxFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIGZhdGFsIChfKCJzdWJwcm9jZXNzIGdvdCBmYXRhbCBzaWduYWwgJWQiKSwgV1RFUk1TSUcgKHdhaXRfc3RhdHVzKSk7Ci0gICAgICByZXRjb2RlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFdJRkVYSVRFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIGlmIChXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpICE9IDApCi0JewotCSAgZmF0YWwgKF8oIiVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZCIpLCBjbWQsIAotCSAgICAgICAgIFdFWElUU1RBVFVTICh3YWl0X3N0YXR1cykpOwotCSAgcmV0Y29kZSA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHJldGNvZGUgPSAxOwotICAKLSAgcmV0dXJuIHJldGNvZGU7Ci19Ci0KLXN0YXRpYyBGSUxFICoKLW9wZW5faW5wdXRfc3RyZWFtIChjbWQpCi0gICAgIGNoYXIgKmNtZDsKLXsKLSAgaWYgKGlzdHJlYW1fdHlwZSA9PSBJU1RSRUFNX0ZJTEUpCi0gICAgewotICAgICAgY2hhciAqZmlsZXByZWZpeDsKLQotICAgICAgZmlsZXByZWZpeCA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gICAgICBjcHBfdGVtcF9maWxlID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDUpOwotICAgICAgc3ByaW50ZiAoY3BwX3RlbXBfZmlsZSwgIiVzLmlyYyIsIGZpbGVwcmVmaXgpOwotICAgICAgZnJlZSAoZmlsZXByZWZpeCk7Ci0KLSAgICAgIGlmIChydW5fY21kIChjbWQsIGNwcF90ZW1wX2ZpbGUpKQotCWZhdGFsIChfKCJjYW4ndCBleGVjdXRlIGAlcyc6ICVzIiksIGNtZCwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgICAgIGNwcF9waXBlID0gZm9wZW4gKGNwcF90ZW1wX2ZpbGUsIEZPUEVOX1JUKTs7Ci0gICAgICBpZiAoY3BwX3BpcGUgPT0gTlVMTCkKLSAgICAgICAgZmF0YWwgKF8oImNhbid0IG9wZW4gdGVtcG9yYXJ5IGZpbGUgYCVzJzogJXMiKSwgCi0JICAgICAgIGNwcF90ZW1wX2ZpbGUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgCi0gICAgICBpZiAodmVyYm9zZSkKLQlmcHJpbnRmIChzdGRlcnIsIAotCSAgICAgICAgIF8oIlVzaW5nIHRlbXBvcmFyeSBmaWxlIGAlcycgdG8gcmVhZCBwcmVwcm9jZXNzb3Igb3V0cHV0XG4iKSwKLQkJIGNwcF90ZW1wX2ZpbGUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNwcF9waXBlID0gcG9wZW4gKGNtZCwgRk9QRU5fUlQpOwotICAgICAgaWYgKGNwcF9waXBlID09IE5VTEwpCi0gICAgICAgIGZhdGFsIChfKCJjYW4ndCBwb3BlbiBgJXMnOiAlcyIpLCBjbWQsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgaWYgKHZlcmJvc2UpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCJVc2luZyBwb3BlbiB0byByZWFkIHByZXByb2Nlc3NvciBvdXRwdXRcbiIpKTsKLSAgICB9Ci0KLSAgeGF0ZXhpdCAoY2xvc2VfaW5wdXRfc3RyZWFtKTsKLSAgcmV0dXJuIGNwcF9waXBlOwotfQotCi0vKiBsb29rIGZvciB0aGUgcHJlcHJvY2Vzc29yIHByb2dyYW0gKi8KLQotc3RhdGljIEZJTEUgKgotbG9va19mb3JfZGVmYXVsdCAoY21kLCBwcmVmaXgsIGVuZF9wcmVmaXgsIHByZXByb2NhcmdzLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqY21kOwotICAgICBjb25zdCBjaGFyICpwcmVmaXg7Ci0gICAgIGludCBlbmRfcHJlZml4OwotICAgICBjb25zdCBjaGFyICpwcmVwcm9jYXJnczsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGNoYXIgKnNwYWNlOwotICBpbnQgZm91bmQ7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0KLSAgc3RyY3B5IChjbWQsIHByZWZpeCk7Ci0KLSAgc3ByaW50ZiAoY21kICsgZW5kX3ByZWZpeCwgIiVzIiwgREVGQVVMVF9QUkVQUk9DRVNTT1IpOwotICBzcGFjZSA9IHN0cmNociAoY21kICsgZW5kX3ByZWZpeCwgJyAnKTsKLSAgaWYgKHNwYWNlKQotICAgICpzcGFjZSA9IDA7Ci0KLSAgaWYgKAotI2lmIGRlZmluZWQgKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX1dJTjMyKQotICAgICAgc3RyY2hyIChjbWQsICdcXCcpIHx8Ci0jZW5kaWYKLSAgICAgIHN0cmNociAoY21kLCAnLycpKQotICAgIHsKLSAgICAgIGZvdW5kID0gKHN0YXQgKGNtZCwgJnMpID09IDAKLSNpZmRlZiBIQVZFX0VYRUNVVEFCTEVfU1VGRklYCi0JICAgICAgIHx8IHN0YXQgKHN0cmNhdCAoY21kLCBFWEVDVVRBQkxFX1NVRkZJWCksICZzKSA9PSAwCi0jZW5kaWYKLQkgICAgICAgKTsKLQotICAgICAgaWYgKCEgZm91bmQpCi0JewotCSAgaWYgKHZlcmJvc2UpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiVHJpZWQgYCVzJ1xuIiksIGNtZCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHN0cmNweSAoY21kLCBwcmVmaXgpOwotCi0gIHNwcmludGYgKGNtZCArIGVuZF9wcmVmaXgsICIlcyAlcyAlcyIsCi0JICAgREVGQVVMVF9QUkVQUk9DRVNTT1IsIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVc2luZyBgJXMnXG4iKSwgY21kKTsKLQotICBjcHBfcGlwZSA9IG9wZW5faW5wdXRfc3RyZWFtIChjbWQpOwotICByZXR1cm4gY3BwX3BpcGU7Ci19Ci0KLS8qIFJlYWQgYW4gcmMgZmlsZS4gICovCi0KLXN0cnVjdCByZXNfZGlyZWN0b3J5ICoKLXJlYWRfcmNfZmlsZSAoZmlsZW5hbWUsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsIGxhbmd1YWdlLCB1c2VfdGVtcF9maWxlKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcHJlcHJvY2Vzc29yOwotICAgICBjb25zdCBjaGFyICpwcmVwcm9jYXJnczsKLSAgICAgaW50IGxhbmd1YWdlOwotICAgICBpbnQgdXNlX3RlbXBfZmlsZTsKLXsKLSAgY2hhciAqY21kOwotCi0gIGlzdHJlYW1fdHlwZSA9ICh1c2VfdGVtcF9maWxlKSA/IElTVFJFQU1fRklMRSA6IElTVFJFQU1fUElQRTsKLQotICBpZiAocHJlcHJvY2FyZ3MgPT0gTlVMTCkKLSAgICBwcmVwcm9jYXJncyA9ICIiOwotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9ICItIjsKLQotICBpZiAocHJlcHJvY2Vzc29yKQotICAgIHsKLSAgICAgIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAocHJlcHJvY2Vzc29yKQotCQkgICAgICsgc3RybGVuIChwcmVwcm9jYXJncykKLQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCSAgICAgKyAxMCk7Ci0gICAgICBzcHJpbnRmIChjbWQsICIlcyAlcyAlcyIsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsIGZpbGVuYW1lKTsKLQotICAgICAgY3BwX3BpcGUgPSBvcGVuX2lucHV0X3N0cmVhbSAoY21kKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpkYXNoLCAqc2xhc2gsICpjcDsKLQotICAgICAgcHJlcHJvY2Vzc29yID0gREVGQVVMVF9QUkVQUk9DRVNTT1I7Ci0KLSAgICAgIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAocHJvZ3JhbV9uYW1lKQotCQkgICAgICsgc3RybGVuIChwcmVwcm9jZXNzb3IpCi0JCSAgICAgKyBzdHJsZW4gKHByZXByb2NhcmdzKQotCQkgICAgICsgc3RybGVuIChmaWxlbmFtZSkKLSNpZmRlZiBIQVZFX0VYRUNVVEFCTEVfU1VGRklYCi0JCSAgICAgKyBzdHJsZW4gKEVYRUNVVEFCTEVfU1VGRklYKQotI2VuZGlmCi0JCSAgICAgKyAxMCk7Ci0KLQotICAgICAgZGFzaCA9IHNsYXNoID0gMDsKLSAgICAgIGZvciAoY3AgPSBwcm9ncmFtX25hbWU7ICpjcDsgY3ArKykKLQl7Ci0JICBpZiAoKmNwID09ICctJykKLQkgICAgZGFzaCA9IGNwOwotCSAgaWYgKAotI2lmIGRlZmluZWQgKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfV0lOMzIpCi0JICAgICAgKmNwID09ICc6JyB8fCAqY3AgPT0gJ1xcJyB8fAotI2VuZGlmCi0JICAgICAgKmNwID09ICcvJykKLQkgICAgewotCSAgICAgIHNsYXNoID0gY3A7Ci0JICAgICAgZGFzaCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGNwcF9waXBlID0gMDsKLQotICAgICAgaWYgKGRhc2gpCi0JewotCSAgLyogRmlyc3QsIHRyeSBsb29raW5nIGZvciBhIHByZWZpeGVkIGdjYyBpbiB0aGUgd2luZHJlcwotCSAgICAgZGlyZWN0b3J5LCB3aXRoIHRoZSBzYW1lIHByZWZpeCBhcyB3aW5kcmVzICovCi0KLQkgIGNwcF9waXBlID0gbG9va19mb3JfZGVmYXVsdCAoY21kLCBwcm9ncmFtX25hbWUsIGRhc2gtcHJvZ3JhbV9uYW1lKzEsCi0JCQkJICAgICAgIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICBpZiAoc2xhc2ggJiYgIWNwcF9waXBlKQotCXsKLQkgIC8qIE5leHQsIHRyeSBsb29raW5nIGZvciBhIGdjYyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMKLSAgICAgICAgICAgICB0aGF0IHdpbmRyZXMgKi8KLQotCSAgY3BwX3BpcGUgPSBsb29rX2Zvcl9kZWZhdWx0IChjbWQsIHByb2dyYW1fbmFtZSwgc2xhc2gtcHJvZ3JhbV9uYW1lKzEsCi0JCQkJICAgICAgIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICBpZiAoIWNwcF9waXBlKQotCXsKLQkgIC8qIFNpZ2gsIHRyeSB0aGUgZGVmYXVsdCAqLwotCi0JICBjcHBfcGlwZSA9IGxvb2tfZm9yX2RlZmF1bHQgKGNtZCwgIiIsIDAsIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgfQotICAKLSAgZnJlZSAoY21kKTsKLQotICByY19maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgcmNfbGluZW5vID0gMTsKLSAgaWYgKGxhbmd1YWdlICE9IC0xKQotICAgIHJjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5ndWFnZSk7Ci0gIHl5aW4gPSBjcHBfcGlwZTsKLSAgeXlwYXJzZSAoKTsKLQotICBjbG9zZV9pbnB1dF9zdHJlYW0gKCk7Ci0gIAotICBpZiAoZm9udGRpcnMgIT0gTlVMTCkKLSAgICBkZWZpbmVfZm9udGRpcnMgKCk7Ci0KLSAgZnJlZSAocmNfZmlsZW5hbWUpOwotICByY19maWxlbmFtZSA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJlc291cmNlczsKLX0KLQotLyogQ2xvc2UgdGhlIGlucHV0IHN0cmVhbSBpZiBpdCBpcyBvcGVuLiAgKi8KLQotc3RhdGljIHZvaWQKLWNsb3NlX2lucHV0X3N0cmVhbSAoKQotewotICBpZiAoY3BwX3BpcGUgIT0gTlVMTCkKLSAgICBwY2xvc2UgKGNwcF9waXBlKTsKLSAgCi0gIGlmIChpc3RyZWFtX3R5cGUgPT0gSVNUUkVBTV9GSUxFKQotICAgIHsKLSAgICAgIGlmIChjcHBfcGlwZSAhPSBOVUxMKQotCWZjbG9zZSAoY3BwX3BpcGUpOwotCi0gICAgICBpZiAoY3BwX3RlbXBfZmlsZSAhPSBOVUxMKQotCXsKLQkgIGludCBlcnJub19zYXZlID0gZXJybm87Ci0JICAKLQkgIHVubGluayAoY3BwX3RlbXBfZmlsZSk7Ci0JICBlcnJubyA9IGVycm5vX3NhdmU7Ci0JICBmcmVlIChjcHBfdGVtcF9maWxlKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGNwcF9waXBlICE9IE5VTEwpCi0JcGNsb3NlIChjcHBfcGlwZSk7Ci0gICAgfQotCi0gIC8qIFNpbmNlIHRoaXMgaXMgYWxzbyBydW4gdmlhIHhhdGV4aXQsIHNhZmVndWFyZC4gKi8KLSAgY3BwX3BpcGUgPSBOVUxMOwotICBjcHBfdGVtcF9maWxlID0gTlVMTDsKLX0KLQotLyogUmVwb3J0IGFuIGVycm9yIHdoaWxlIHJlYWRpbmcgYW4gcmMgZmlsZS4gICovCi0KLXZvaWQKLXl5ZXJyb3IgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBmYXRhbCAoIiVzOiVkOiAlcyIsIHJjX2ZpbGVuYW1lLCByY19saW5lbm8sIG1zZyk7Ci19Ci0KLS8qIElzc3VlIGEgd2FybmluZyB3aGlsZSByZWFkaW5nIGFuIHJjIGZpbGUuICAqLwotCi12b2lkCi1yY3BhcnNlX3dhcm5pbmcgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVkOiAlc1xuIiksIHJjX2ZpbGVuYW1lLCByY19saW5lbm8sIG1zZyk7Ci19Ci0KLS8qIERpZSBpZiB3ZSBnZXQgYW4gdW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi11bmV4cGVjdGVkX2VvZiAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZhdGFsIChfKCIlczogdW5leHBlY3RlZCBFT0YiKSwgbXNnKTsKLX0KLQotLyogUmVhZCBhIDE2IGJpdCB3b3JkIGZyb20gYSBmaWxlLiAgVGhlIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBsaXR0bGUKLSAgIGVuZGlhbi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF93b3JkIChlLCBtc2cpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IGIxLCBiMjsKLQotICBiMSA9IGdldGMgKGUpOwotICBiMiA9IGdldGMgKGUpOwotICBpZiAoZmVvZiAoZSkpCi0gICAgdW5leHBlY3RlZF9lb2YgKG1zZyk7Ci0gIHJldHVybiAoKGIyICYgMHhmZikgPDwgOCkgfCAoYjEgJiAweGZmKTsKLX0KLQotLyogUmVhZCBhIDMyIGJpdCB3b3JkIGZyb20gYSBmaWxlLiAgVGhlIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBsaXR0bGUKLSAgIGVuZGlhbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1nZXRfbG9uZyAoZSwgbXNnKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGludCBiMSwgYjIsIGIzLCBiNDsKLQotICBiMSA9IGdldGMgKGUpOwotICBiMiA9IGdldGMgKGUpOwotICBiMyA9IGdldGMgKGUpOwotICBiNCA9IGdldGMgKGUpOwotICBpZiAoZmVvZiAoZSkpCi0gICAgdW5leHBlY3RlZF9lb2YgKG1zZyk7Ci0gIHJldHVybiAoKCgoKCgoYjQgJiAweGZmKSA8PCA4KQotCSAgICAgIHwgKGIzICYgMHhmZikpIDw8IDgpCi0JICAgIHwgKGIyICYgMHhmZikpIDw8IDgpCi0JICB8IChiMSAmIDB4ZmYpKTsKLX0KLQotLyogUmVhZCBkYXRhIGZyb20gYSBmaWxlLiAgVGhpcyBpcyBhIHdyYXBwZXIgdG8gZG8gZXJyb3IgY2hlY2tpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotZ2V0X2RhdGEgKGUsIHAsIGMsIG1zZykKLSAgICAgRklMRSAqZTsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjOwotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgZ290OwotCi0gIGdvdCA9IGZyZWFkIChwLCAxLCBjLCBlKTsKLSAgaWYgKGdvdCA9PSBjKQotICAgIHJldHVybjsKLQotICBmYXRhbCAoXygiJXM6IHJlYWQgb2YgJWx1IHJldHVybmVkICVsdSIpLCBtc2csIGMsIGdvdCk7Ci19Ci0MCi0vKiBEZWZpbmUgYW4gYWNjZWxlcmF0b3IgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfYWNjZWxlcmF0b3IgKGlkLCByZXNpbmZvLCBkYXRhKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmRhdGE7Ci17Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfQUNDRUxFUkFUT1IsIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0FDQ0VMRVJBVE9SOwotICByLT51LmFjYyA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGJpdG1hcCByZXNvdXJjZS4gIEJpdG1hcCBkYXRhIGlzIHN0b3JlZCBpbiBhIGZpbGUuICBUaGUKLSAgIGZpcnN0IDE0IGJ5dGVzIG9mIHRoZSBmaWxlIGFyZSBhIHN0YW5kYXJkIGhlYWRlciwgd2hpY2ggaXMgbm90Ci0gICBpbmNsdWRlZCBpbiB0aGUgcmVzb3VyY2UgZGF0YS4gICovCi0KLSNkZWZpbmUgQklUTUFQX1NLSVAgKDE0KQotCi12b2lkCi1kZWZpbmVfYml0bWFwIChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBzdHJ1Y3Qgc3RhdCBzOwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBpbnQgaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBlID0gb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIEZPUEVOX1JCLCAiYml0bWFwIGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplIC0gQklUTUFQX1NLSVApOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCSVRNQVBfU0tJUDsgaSsrKQotICAgIGdldGMgKGUpOwotCi0gIGdldF9kYXRhIChlLCBkYXRhLCBzLnN0X3NpemUgLSBCSVRNQVBfU0tJUCwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgZmNsb3NlIChlKTsKLSAgZnJlZSAocmVhbF9maWxlbmFtZSk7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfQklUTUFQLCBpZCwKLQkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0KLSAgci0+dHlwZSA9IFJFU19UWVBFX0JJVE1BUDsKLSAgci0+dS5kYXRhLmxlbmd0aCA9IHMuc3Rfc2l6ZSAtIEJJVE1BUF9TS0lQOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGN1cnNvciByZXNvdXJjZS4gIEEgY3Vyc29yIGZpbGUgbWF5IGNvbnRhaW4gYSBzZXQgb2YKLSAgIGJpdG1hcHMsIGVhY2ggcmVwcmVzZW50aW5nIHRoZSBzYW1lIGN1cnNvciBhdCB2YXJpb3VzIGRpZmZlcmVudAotICAgcmVzb2x1dGlvbnMuICBUaGV5IGVhY2ggZ2V0IHdyaXR0ZW4gb3V0IHdpdGggYSBkaWZmZXJlbnQgSUQuICBUaGUKLSAgIHJlYWwgY3Vyc29yIHJlc291cmNlIGlzIHRoZW4gYSBncm91cCByZXNvdXJjZSB3aGljaCBjYW4gYmUgdXNlZCB0bwotICAgc2VsZWN0IG9uZSBvZiB0aGUgYWN0dWFsIGN1cnNvcnMuICAqLwotCi12b2lkCi1kZWZpbmVfY3Vyc29yIChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBpbnQgdHlwZSwgY291bnQsIGk7Ci0gIHN0cnVjdCBpY29uZGlyICppY29uZGlyczsKLSAgaW50IGZpcnN0X2N1cnNvcjsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgc3RydWN0IGdyb3VwX2N1cnNvciAqZmlyc3QsICoqcHA7Ci0KLSAgZSA9IG9wZW5fZmlsZV9zZWFyY2ggKGZpbGVuYW1lLCBGT1BFTl9SQiwgImN1cnNvciBmaWxlIiwgJnJlYWxfZmlsZW5hbWUpOwotCi0gIC8qIEEgY3Vyc29yIGZpbGUgaXMgYmFzaWNhbGx5IGFuIGljb24gZmlsZS4gIFRoZSBzdGFydCBvZiB0aGUgZmlsZQotICAgICBpcyBhIHRocmVlIHdvcmQgc3RydWN0dXJlLiAgVGhlIGZpcnN0IHdvcmQgaXMgaWdub3JlZC4gIFRoZQotICAgICBzZWNvbmQgd29yZCBpcyB0aGUgdHlwZSBvZiBkYXRhLiAgVGhlIHRoaXJkIHdvcmQgaXMgdGhlIG51bWJlciBvZgotICAgICBlbnRyaWVzLiAgKi8KLQotICBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIHR5cGUgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIGNvdW50ID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICBpZiAodHlwZSAhPSAyKQotICAgIGZhdGFsIChfKCJjdXJzb3IgZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gY3Vyc29yIGRhdGEiKSwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgaWNvbiBkaXJlY3RvcnkgZW50cmllcy4gICovCi0KLSAgaWNvbmRpcnMgPSAoc3RydWN0IGljb25kaXIgKikgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKmljb25kaXJzKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpY29uZGlyc1tpXS53aWR0aCA9IGdldGMgKGUpOwotICAgICAgaWNvbmRpcnNbaV0uaGVpZ2h0ID0gZ2V0YyAoZSk7Ci0gICAgICBpY29uZGlyc1tpXS5jb2xvcmNvdW50ID0gZ2V0YyAoZSk7Ci0gICAgICBnZXRjIChlKTsKLSAgICAgIGljb25kaXJzW2ldLnUuY3Vyc29yLnhob3RzcG90ID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICAgICAgaWNvbmRpcnNbaV0udS5jdXJzb3IueWhvdHNwb3QgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gICAgICBpY29uZGlyc1tpXS5ieXRlcyA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgICAgIGljb25kaXJzW2ldLm9mZnNldCA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKLQotICAgICAgaWYgKGZlb2YgKGUpKQotCXVuZXhwZWN0ZWRfZW9mIChyZWFsX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIGVhY2ggY3Vyc29yIGFzIGEgdW5pcXVlIHJlc291cmNlLiAgKi8KLQotICBmaXJzdF9jdXJzb3IgPSBjdXJzb3JzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgICBzdHJ1Y3QgcmVzX2lkIG5hbWU7Ci0gICAgICBzdHJ1Y3QgY3Vyc29yICpjOwotCi0gICAgICBpZiAoZnNlZWsgKGUsIGljb25kaXJzW2ldLm9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JZmF0YWwgKF8oIiVzOiBmc2VlayB0byAlbHUgZmFpbGVkOiAlcyIpLCByZWFsX2ZpbGVuYW1lLAotCSAgICAgICBpY29uZGlyc1tpXS5vZmZzZXQsIHN0cmVycm9yIChlcnJubykpOwotCi0gICAgICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChpY29uZGlyc1tpXS5ieXRlcyk7Ci0KLSAgICAgIGdldF9kYXRhIChlLCBkYXRhLCBpY29uZGlyc1tpXS5ieXRlcywgcmVhbF9maWxlbmFtZSk7Ci0KLSAgICAgIGMgPSAoc3RydWN0IGN1cnNvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYyk7Ci0gICAgICBjLT54aG90c3BvdCA9IGljb25kaXJzW2ldLnUuY3Vyc29yLnhob3RzcG90OwotICAgICAgYy0+eWhvdHNwb3QgPSBpY29uZGlyc1tpXS51LmN1cnNvci55aG90c3BvdDsKLSAgICAgIGMtPmxlbmd0aCA9IGljb25kaXJzW2ldLmJ5dGVzOwotICAgICAgYy0+ZGF0YSA9IGRhdGE7Ci0KLSAgICAgICsrY3Vyc29yczsKLQotICAgICAgbmFtZS5uYW1lZCA9IDA7Ci0gICAgICBuYW1lLnUuaWQgPSBjdXJzb3JzOwotCi0gICAgICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9DVVJTT1IsIG5hbWUsCi0JCQkJICAgIHJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgICAgIHItPnR5cGUgPSBSRVNfVFlQRV9DVVJTT1I7Ci0gICAgICByLT51LmN1cnNvciA9IGM7Ci0gICAgICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotICAgIH0KLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICAvKiBEZWZpbmUgYSBjdXJzb3IgZ3JvdXAgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBncm91cF9jdXJzb3IgKmNnOwotCi0gICAgICBjZyA9IChzdHJ1Y3QgZ3JvdXBfY3Vyc29yICopIHJlc19hbGxvYyAoc2l6ZW9mICpjZyk7Ci0gICAgICBjZy0+bmV4dCA9IE5VTEw7Ci0gICAgICBjZy0+d2lkdGggPSBpY29uZGlyc1tpXS53aWR0aDsKLSAgICAgIGNnLT5oZWlnaHQgPSAyICogaWNvbmRpcnNbaV0uaGVpZ2h0OwotCi0gICAgICAvKiBGSVhNRTogV2hhdCBzaG91bGQgdGhlc2UgYmUgc2V0IHRvPyAgKi8KLSAgICAgIGNnLT5wbGFuZXMgPSAxOwotICAgICAgY2ctPmJpdHMgPSAxOwotCi0gICAgICBjZy0+Ynl0ZXMgPSBpY29uZGlyc1tpXS5ieXRlcyArIDQ7Ci0gICAgICBjZy0+aW5kZXggPSBmaXJzdF9jdXJzb3IgKyBpICsgMTsKLQotICAgICAgKnBwID0gY2c7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoaWNvbmRpcnMpOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0dST1VQX0NVUlNPUiwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfR1JPVVBfQ1VSU09SOwotICByLT51Lmdyb3VwX2N1cnNvciA9IGZpcnN0OwotICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYSBkaWFsb2cgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfZGlhbG9nIChpZCwgcmVzaW5mbywgZGlhbG9nKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci17Ci0gIHN0cnVjdCBkaWFsb2cgKmNvcHk7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgY29weSA9IChzdHJ1Y3QgZGlhbG9nICopIHJlc19hbGxvYyAoc2l6ZW9mICpjb3B5KTsKLSAgKmNvcHkgPSAqZGlhbG9nOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0RJQUxPRywgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfRElBTE9HOwotICByLT51LmRpYWxvZyA9IGNvcHk7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGRpYWxvZyBjb250cm9sLiAgVGhpcyBkb2VzIG5vdCBkZWZpbmUgYSByZXNvdXJjZSwgYnV0Ci0gICBtZXJlbHkgYWxsb2NhdGVzIGFuZCBmaWxscyBpbiBhIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBkaWFsb2dfY29udHJvbCAqCi1kZWZpbmVfY29udHJvbCAodGV4dCwgaWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGNsYXNzLCBzdHlsZSwgZXhzdHlsZSkKLSAgICAgY29uc3QgY2hhciAqdGV4dDsKLSAgICAgdW5zaWduZWQgbG9uZyBpZDsKLSAgICAgdW5zaWduZWQgbG9uZyB4OwotICAgICB1bnNpZ25lZCBsb25nIHk7Ci0gICAgIHVuc2lnbmVkIGxvbmcgd2lkdGg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaGVpZ2h0OwotICAgICB1bnNpZ25lZCBsb25nIGNsYXNzOwotICAgICB1bnNpZ25lZCBsb25nIHN0eWxlOwotICAgICB1bnNpZ25lZCBsb25nIGV4c3R5bGU7Ci17Ci0gIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqbjsKLQotICBuID0gKHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKSByZXNfYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5pZCA9IGlkOwotICBuLT5zdHlsZSA9IHN0eWxlOwotICBuLT5leHN0eWxlID0gZXhzdHlsZTsKLSAgbi0+eCA9IHg7Ci0gIG4tPnkgPSB5OwotICBuLT53aWR0aCA9IHdpZHRoOwotICBuLT5oZWlnaHQgPSBoZWlnaHQ7Ci0gIG4tPmNsYXNzLm5hbWVkID0gMDsKLSAgbi0+Y2xhc3MudS5pZCA9IGNsYXNzOwotICBpZiAodGV4dCAhPSBOVUxMKQotICAgIHJlc19zdHJpbmdfdG9faWQgKCZuLT50ZXh0LCB0ZXh0KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG4tPnRleHQubmFtZWQgPSAwOwotICAgICAgbi0+dGV4dC51LmlkID0gMDsKLSAgICB9Ci0gIG4tPmRhdGEgPSBOVUxMOwotICBuLT5oZWxwID0gMDsKLQotICByZXR1cm4gbjsKLX0KLQotLyogRGVmaW5lIGEgZm9udCByZXNvdXJjZS4gICovCi0KLXZvaWQKLWRlZmluZV9mb250IChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBzdHJ1Y3Qgc3RhdCBzOwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBsb25nIG9mZnNldDsKLSAgbG9uZyBmb250ZGF0YWxlbmd0aDsKLSAgdW5zaWduZWQgY2hhciAqZm9udGRhdGE7Ci0gIHN0cnVjdCBmb250ZGlyICpmZDsKLSAgY29uc3QgY2hhciAqZGV2aWNlLCAqZmFjZTsKLSAgc3RydWN0IGZvbnRkaXIgKipwcDsKLQotICBlID0gb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIEZPUEVOX1JCLCAiZm9udCBmaWxlIiwgJnJlYWxfZmlsZW5hbWUpOwotCi0gIGlmIChzdGF0IChyZWFsX2ZpbGVuYW1lLCAmcykgPCAwKQotICAgIGZhdGFsIChfKCJzdGF0IGZhaWxlZCBvbiBiaXRtYXAgZmlsZSBgJXMnOiAlcyIpLCByZWFsX2ZpbGVuYW1lLAotCSAgIHN0cmVycm9yIChlcnJubykpOwotCi0gIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKHMuc3Rfc2l6ZSk7Ci0KLSAgZ2V0X2RhdGEgKGUsIGRhdGEsIHMuc3Rfc2l6ZSwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgZmNsb3NlIChlKTsKLSAgZnJlZSAocmVhbF9maWxlbmFtZSk7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfRk9OVCwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotCi0gIHItPnR5cGUgPSBSRVNfVFlQRV9GT05UOwotICByLT51LmRhdGEubGVuZ3RoID0gcy5zdF9zaXplOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci0KLSAgLyogRm9yIGVhY2ggZm9udCByZXNvdXJjZSwgd2UgbXVzdCBhZGQgYW4gZW50cnkgaW4gdGhlIEZPTlRESVIKLSAgICAgcmVzb3VyY2UuICBUaGUgRk9OVERJUiByZXNvdXJjZSBpbmNsdWRlcyBzb21lIHN0cmluZ3MgaW4gdGhlIGZvbnQKLSAgICAgZmlsZS4gIFRvIGZpbmQgdGhlbSwgd2UgaGF2ZSB0byBkbyBzb21lIG1hZ2ljIG9uIHRoZSBkYXRhIHdlIGhhdmUKLSAgICAgcmVhZC4gICovCi0KLSAgb2Zmc2V0ID0gKCgoKCgoZGF0YVs0N10gPDwgOCkKLQkJfCBkYXRhWzQ2XSkgPDwgOCkKLQkgICAgICB8IGRhdGFbNDVdKSA8PCA4KQotCSAgICB8IGRhdGFbNDRdKTsKLSAgaWYgKG9mZnNldCA+IDAgJiYgb2Zmc2V0IDwgcy5zdF9zaXplKQotICAgIGRldmljZSA9IChjaGFyICopIGRhdGEgKyBvZmZzZXQ7Ci0gIGVsc2UKLSAgICBkZXZpY2UgPSAiIjsKLQotICBvZmZzZXQgPSAoKCgoKChkYXRhWzUxXSA8PCA4KQotCQl8IGRhdGFbNTBdKSA8PCA4KQotCSAgICAgIHwgZGF0YVs0OV0pIDw8IDgpCi0JICAgIHwgZGF0YVs0OF0pOwotICBpZiAob2Zmc2V0ID4gMCAmJiBvZmZzZXQgPCBzLnN0X3NpemUpCi0gICAgZmFjZSA9IChjaGFyICopIGRhdGEgKyBvZmZzZXQ7Ci0gIGVsc2UKLSAgICBmYWNlID0gIiI7Ci0KLSAgKytmb250czsKLQotICBmb250ZGF0YWxlbmd0aCA9IDU4ICsgc3RybGVuIChkZXZpY2UpICsgc3RybGVuIChmYWNlKTsKLSAgZm9udGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKGZvbnRkYXRhbGVuZ3RoKTsKLSAgbWVtY3B5IChmb250ZGF0YSwgZGF0YSwgNTYpOwotICBzdHJjcHkgKChjaGFyICopIGZvbnRkYXRhICsgNTYsIGRldmljZSk7Ci0gIHN0cmNweSAoKGNoYXIgKikgZm9udGRhdGEgKyA1NyArIHN0cmxlbiAoZGV2aWNlKSwgZmFjZSk7Ci0KLSAgZmQgPSAoc3RydWN0IGZvbnRkaXIgKikgcmVzX2FsbG9jIChzaXplb2YgKmZkKTsKLSAgZmQtPm5leHQgPSBOVUxMOwotICBmZC0+aW5kZXggPSBmb250czsKLSAgZmQtPmxlbmd0aCA9IGZvbnRkYXRhbGVuZ3RoOwotICBmZC0+ZGF0YSA9IGZvbnRkYXRhOwotCi0gIGZvciAocHAgPSAmZm9udGRpcnM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IGZkOwotCi0gIC8qIEZvciB0aGUgc2luZ2xlIGZvbnRkaXJzIHJlc291cmNlLCB3ZSBhbHdheXMgdXNlIHRoZSByZXNvdXJjZQotICAgICBpbmZvcm1hdGlvbiBvZiB0aGUgbGFzdCBmb250LiAgSSBkb24ndCBrbm93IHdoYXQgZWxzZSB0byBkby4gICovCi0gIGZvbnRkaXJzX3Jlc2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIHRoZSBmb250ZGlycyByZXNvdXJjZS4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBlbnRpcmUgcmMKLSAgIGZpbGUgaGFzIGJlZW4gcGFyc2VkLCBpZiBhbnkgZm9udCByZXNvdXJjZXMgd2VyZSBzZWVuLiAgKi8KLQotc3RhdGljIHZvaWQKLWRlZmluZV9mb250ZGlycyAoKQotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBzdHJ1Y3QgcmVzX2lkIGlkOwotCi0gIGlkLm5hbWVkID0gMDsKLSAgaWQudS5pZCA9IDE7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfRk9OVERJUiwgaWQsIDB4NDA5LCAwKTsKLQotICByLT50eXBlID0gUkVTX1RZUEVfRk9OVERJUjsKLSAgci0+dS5mb250ZGlyID0gZm9udGRpcnM7Ci0gIHItPnJlc19pbmZvID0gZm9udGRpcnNfcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIGFuIGljb24gcmVzb3VyY2UuICBBbiBpY29uIGZpbGUgbWF5IGNvbnRhaW4gYSBzZXQgb2YKLSAgIGJpdG1hcHMsIGVhY2ggcmVwcmVzZW50aW5nIHRoZSBzYW1lIGljb24gYXQgdmFyaW91cyBkaWZmZXJlbnQKLSAgIHJlc29sdXRpb25zLiAgVGhleSBlYWNoIGdldCB3cml0dGVuIG91dCB3aXRoIGEgZGlmZmVyZW50IElELiAgVGhlCi0gICByZWFsIGljb24gcmVzb3VyY2UgaXMgdGhlbiBhIGdyb3VwIHJlc291cmNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi0gICBzZWxlY3Qgb25lIG9mIHRoZSBhY3R1YWwgaWNvbiBiaXRtYXBzLiAgKi8KLQotdm9pZAotZGVmaW5lX2ljb24gKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIGludCB0eXBlLCBjb3VudCwgaTsKLSAgc3RydWN0IGljb25kaXIgKmljb25kaXJzOwotICBpbnQgZmlyc3RfaWNvbjsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgc3RydWN0IGdyb3VwX2ljb24gKmZpcnN0LCAqKnBwOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJpY29uIGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogVGhlIHN0YXJ0IG9mIGFuIGljb24gZmlsZSBpcyBhIHRocmVlIHdvcmQgc3RydWN0dXJlLiAgVGhlIGZpcnN0Ci0gICAgIHdvcmQgaXMgaWdub3JlZC4gIFRoZSBzZWNvbmQgd29yZCBpcyB0aGUgdHlwZSBvZiBkYXRhLiAgVGhlIHRoaXJkCi0gICAgIHdvcmQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KLQotICBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIHR5cGUgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIGNvdW50ID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICBpZiAodHlwZSAhPSAxKQotICAgIGZhdGFsIChfKCJpY29uIGZpbGUgYCVzJyBkb2VzIG5vdCBjb250YWluIGljb24gZGF0YSIpLCByZWFsX2ZpbGVuYW1lKTsKLQotICAvKiBSZWFkIGluIHRoZSBpY29uIGRpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLQotICBpY29uZGlycyA9IChzdHJ1Y3QgaWNvbmRpciAqKSB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAqaWNvbmRpcnMpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGljb25kaXJzW2ldLndpZHRoID0gZ2V0YyAoZSk7Ci0gICAgICBpY29uZGlyc1tpXS5oZWlnaHQgPSBnZXRjIChlKTsKLSAgICAgIGljb25kaXJzW2ldLmNvbG9yY291bnQgPSBnZXRjIChlKTsKLSAgICAgIGdldGMgKGUpOwotICAgICAgaWNvbmRpcnNbaV0udS5pY29uLnBsYW5lcyA9IGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgICAgIGljb25kaXJzW2ldLnUuaWNvbi5iaXRzID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICAgICAgaWNvbmRpcnNbaV0uYnl0ZXMgPSBnZXRfbG9uZyAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gICAgICBpY29uZGlyc1tpXS5vZmZzZXQgPSBnZXRfbG9uZyAoZSwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgICAgIGlmIChmZW9mIChlKSkKLQl1bmV4cGVjdGVkX2VvZiAocmVhbF9maWxlbmFtZSk7Ci0gICAgfQotCi0gIC8qIERlZmluZSBlYWNoIGljb24gYXMgYSB1bmlxdWUgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0X2ljb24gPSBpY29uczsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICAgc3RydWN0IHJlc19pZCBuYW1lOwotCi0gICAgICBpZiAoZnNlZWsgKGUsIGljb25kaXJzW2ldLm9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JZmF0YWwgKF8oIiVzOiBmc2VlayB0byAlbHUgZmFpbGVkOiAlcyIpLCByZWFsX2ZpbGVuYW1lLAotCSAgICAgICBpY29uZGlyc1tpXS5vZmZzZXQsIHN0cmVycm9yIChlcnJubykpOwotCi0gICAgICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChpY29uZGlyc1tpXS5ieXRlcyk7Ci0KLSAgICAgIGdldF9kYXRhIChlLCBkYXRhLCBpY29uZGlyc1tpXS5ieXRlcywgcmVhbF9maWxlbmFtZSk7Ci0KLSAgICAgICsraWNvbnM7Ci0KLSAgICAgIG5hbWUubmFtZWQgPSAwOwotICAgICAgbmFtZS51LmlkID0gaWNvbnM7Ci0KLSAgICAgIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0lDT04sIG5hbWUsCi0JCQkJICAgIHJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgICAgIHItPnR5cGUgPSBSRVNfVFlQRV9JQ09OOwotICAgICAgci0+dS5kYXRhLmxlbmd0aCA9IGljb25kaXJzW2ldLmJ5dGVzOwotICAgICAgci0+dS5kYXRhLmRhdGEgPSBkYXRhOwotICAgICAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLSAgICB9Ci0KLSAgZmNsb3NlIChlKTsKLSAgZnJlZSAocmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogRGVmaW5lIGFuIGljb24gZ3JvdXAgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBncm91cF9pY29uICpjZzsKLQotICAgICAgLyogRm9yIHNvbWUgcmVhc29uLCBhdCBsZWFzdCBpbiBzb21lIGZpbGVzIHRoZSBwbGFuZXMgYW5kIGJpdHMKLSAgICAgICAgIGFyZSB6ZXJvLiAgV2UgaW5zdGVhZCBzZXQgdGhlbSBmcm9tIHRoZSBjb2xvci4gIFRoaXMgaXMKLSAgICAgICAgIGNvcGllZCBmcm9tIHJjbC4gICovCi0KLSAgICAgIGNnID0gKHN0cnVjdCBncm91cF9pY29uICopIHJlc19hbGxvYyAoc2l6ZW9mICpjZyk7Ci0gICAgICBjZy0+bmV4dCA9IE5VTEw7Ci0gICAgICBjZy0+d2lkdGggPSBpY29uZGlyc1tpXS53aWR0aDsKLSAgICAgIGNnLT5oZWlnaHQgPSBpY29uZGlyc1tpXS5oZWlnaHQ7Ci0gICAgICBjZy0+Y29sb3JzID0gaWNvbmRpcnNbaV0uY29sb3Jjb3VudDsKLQotICAgICAgY2ctPnBsYW5lcyA9IDE7Ci0gICAgICBjZy0+Yml0cyA9IDA7Ci0gICAgICB3aGlsZSAoKDEgPDwgY2ctPmJpdHMpIDwgY2ctPmNvbG9ycykKLQkrK2NnLT5iaXRzOwotCi0gICAgICBjZy0+Ynl0ZXMgPSBpY29uZGlyc1tpXS5ieXRlczsKLSAgICAgIGNnLT5pbmRleCA9IGZpcnN0X2ljb24gKyBpICsgMTsKLQotICAgICAgKnBwID0gY2c7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoaWNvbmRpcnMpOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0dST1VQX0lDT04sIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0dST1VQX0lDT047Ci0gIHItPnUuZ3JvdXBfaWNvbiA9IGZpcnN0OwotICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYSBtZW51IHJlc291cmNlLiAgKi8KLQotdm9pZAotZGVmaW5lX21lbnUgKGlkLCByZXNpbmZvLCBtZW51aXRlbXMpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIHN0cnVjdCBtZW51aXRlbSAqbWVudWl0ZW1zOwotewotICBzdHJ1Y3QgbWVudSAqbTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBtID0gKHN0cnVjdCBtZW51ICopIHJlc19hbGxvYyAoc2l6ZW9mICptKTsKLSAgbS0+aXRlbXMgPSBtZW51aXRlbXM7Ci0gIG0tPmhlbHAgPSAwOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX01FTlUsIGlkLCByZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9NRU5VOwotICByLT51Lm1lbnUgPSBtOwotICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYSBtZW51IGl0ZW0uICBUaGlzIGRvZXMgbm90IGRlZmluZSBhIHJlc291cmNlLCBidXQgbWVyZWx5Ci0gICBhbGxvY2F0ZXMgYW5kIGZpbGxzIGluIGEgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG1lbnVpdGVtICoKLWRlZmluZV9tZW51aXRlbSAodGV4dCwgbWVudWlkLCB0eXBlLCBzdGF0ZSwgaGVscCwgbWVudWl0ZW1zKQotICAgICBjb25zdCBjaGFyICp0ZXh0OwotICAgICBpbnQgbWVudWlkOwotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3RhdGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaGVscDsKLSAgICAgc3RydWN0IG1lbnVpdGVtICptZW51aXRlbXM7Ci17Ci0gIHN0cnVjdCBtZW51aXRlbSAqbWk7Ci0KLSAgbWkgPSAoc3RydWN0IG1lbnVpdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICptaSk7Ci0gIG1pLT5uZXh0ID0gTlVMTDsKLSAgbWktPnR5cGUgPSB0eXBlOwotICBtaS0+c3RhdGUgPSBzdGF0ZTsKLSAgbWktPmlkID0gbWVudWlkOwotICBpZiAodGV4dCA9PSBOVUxMKQotICAgIG1pLT50ZXh0ID0gTlVMTDsKLSAgZWxzZQotICAgIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmbWktPnRleHQsIHRleHQpOwotICBtaS0+aGVscCA9IGhlbHA7Ci0gIG1pLT5wb3B1cCA9IG1lbnVpdGVtczsKLSAgcmV0dXJuIG1pOwotfQotCi0vKiBEZWZpbmUgYSBtZXNzYWdldGFibGUgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfbWVzc2FnZXRhYmxlIChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBzdHJ1Y3Qgc3RhdCBzOwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJtZXNzYWdldGFibGUgZmlsZSIsCi0JCQkmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplKTsKLQotICBnZXRfZGF0YSAoZSwgZGF0YSwgcy5zdF9zaXplLCByZWFsX2ZpbGVuYW1lKTsKLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9NRVNTQUdFVEFCTEUsIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLQotICByLT50eXBlID0gUkVTX1RZUEVfTUVTU0FHRVRBQkxFOwotICByLT51LmRhdGEubGVuZ3RoID0gcy5zdF9zaXplOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhbiByY2RhdGEgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfcmNkYXRhIChpZCwgcmVzaW5mbywgZGF0YSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgc3RydWN0IHJjZGF0YV9pdGVtICpkYXRhOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX1JDREFUQSwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfUkNEQVRBOwotICByLT51LnJjZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIENyZWF0ZSBhbiByY2RhdGEgaXRlbSBob2xkaW5nIGEgc3RyaW5nLiAgKi8KLQotc3RydWN0IHJjZGF0YV9pdGVtICoKLWRlZmluZV9yY2RhdGFfc3RyaW5nIChzdHJpbmcsIGxlbikKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICB1bnNpZ25lZCBsb25nIGxlbjsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLSAgY2hhciAqczsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IFJDREFUQV9TVFJJTkc7Ci0gIHJpLT51LnN0cmluZy5sZW5ndGggPSBsZW47Ci0gIHMgPSAoY2hhciAqKSByZXNfYWxsb2MgKGxlbik7Ci0gIG1lbWNweSAocywgc3RyaW5nLCBsZW4pOwotICByaS0+dS5zdHJpbmcucyA9IHM7Ci0KLSAgcmV0dXJuIHJpOwotfQotCi0vKiBDcmVhdGUgYW4gcmNkYXRhIGl0ZW0gaG9sZGluZyBhIG51bWJlci4gICovCi0KLXN0cnVjdCByY2RhdGFfaXRlbSAqCi1kZWZpbmVfcmNkYXRhX251bWJlciAodmFsLCBkd29yZCkKLSAgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gICAgIGludCBkd29yZDsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IGR3b3JkID8gUkNEQVRBX0RXT1JEIDogUkNEQVRBX1dPUkQ7Ci0gIHJpLT51LndvcmQgPSB2YWw7Ci0KLSAgcmV0dXJuIHJpOwotfQotCi0vKiBEZWZpbmUgYSBzdHJpbmd0YWJsZSByZXNvdXJjZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHN0cmluZwotICAgd2hpY2ggYXBwZWFycyBpbiBhIFNUUklOR1RBQkxFIHN0YXRlbWVudC4gICovCi0KLXZvaWQKLWRlZmluZV9zdHJpbmd0YWJsZSAocmVzaW5mbywgc3RyaW5naWQsIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBzdHJpbmdpZDsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgcmVzX2lkIGlkOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlkLm5hbWVkID0gMDsKLSAgaWQudS5pZCA9IChzdHJpbmdpZCA+PiA0KSArIDE7Ci0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX1NUUklORywgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDEpOwotCi0gIGlmIChyLT50eXBlID09IFJFU19UWVBFX1VOSU5JVElBTElaRUQpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIHItPnR5cGUgPSBSRVNfVFlQRV9TVFJJTkdUQUJMRTsKLSAgICAgIHItPnUuc3RyaW5ndGFibGUgPSAoKHN0cnVjdCBzdHJpbmd0YWJsZSAqKQotCQkJICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmluZ3RhYmxlKSkpOwotICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JewotCSAgci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5sZW5ndGggPSAwOwotCSAgci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5zdHJpbmcgPSBOVUxMOwotCX0KLQotICAgICAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLSAgICB9Ci0KLSAgdW5pY29kZV9mcm9tX2FzY2lpICgmci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tzdHJpbmdpZCAmIDB4Zl0ubGVuZ3RoLAotCQkgICAgICAmci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tzdHJpbmdpZCAmIDB4Zl0uc3RyaW5nLAotCQkgICAgICBzdHJpbmcpOwotfQotCi0vKiBEZWZpbmUgYSB1c2VyIGRhdGEgcmVzb3VyY2Ugd2hlcmUgdGhlIGRhdGEgaXMgaW4gdGhlIHJjIGZpbGUuICAqLwotCi12b2lkCi1kZWZpbmVfdXNlcl9kYXRhIChpZCwgdHlwZSwgcmVzaW5mbywgZGF0YSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgc3RydWN0IHJlc19pZCB0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRhdGE7Ci17Ci0gIHN0cnVjdCByZXNfaWQgaWRzWzNdOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlkc1swXSA9IHR5cGU7Ci0gIGlkc1sxXSA9IGlkOwotICBpZHNbMl0ubmFtZWQgPSAwOwotICBpZHNbMl0udS5pZCA9IHJlc2luZm8tPmxhbmd1YWdlOwotCi0gIHIgPSBkZWZpbmVfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIDMsIGlkcywgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9VU0VSREFUQTsKLSAgci0+dS51c2VyZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIHVzZXIgZGF0YSByZXNvdXJjZSB3aGVyZSB0aGUgZGF0YSBpcyBpbiBhIGZpbGUuICAqLwotCi12b2lkCi1kZWZpbmVfdXNlcl9maWxlIChpZCwgdHlwZSwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIHN0cnVjdCByZXNfaWQgdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIHN0cnVjdCByZXNfaWQgaWRzWzNdOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJmb250IGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplKTsKLQotICBnZXRfZGF0YSAoZSwgZGF0YSwgcy5zdF9zaXplLCByZWFsX2ZpbGVuYW1lKTsKLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICBpZHNbMF0gPSB0eXBlOwotICBpZHNbMV0gPSBpZDsKLSAgaWRzWzJdLm5hbWVkID0gMDsKLSAgaWRzWzJdLnUuaWQgPSByZXNpbmZvLT5sYW5ndWFnZTsKLQotICByID0gZGVmaW5lX3Jlc291cmNlICgmcmVzb3VyY2VzLCAzLCBpZHMsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfVVNFUkRBVEE7Ci0gIHItPnUudXNlcmRhdGEgPSAoKHN0cnVjdCByY2RhdGFfaXRlbSAqKQotCQkgICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IHJjZGF0YV9pdGVtKSkpOwotICByLT51LnVzZXJkYXRhLT5uZXh0ID0gTlVMTDsKLSAgci0+dS51c2VyZGF0YS0+dHlwZSA9IFJDREFUQV9CVUZGRVI7Ci0gIHItPnUudXNlcmRhdGEtPnUuYnVmZmVyLmxlbmd0aCA9IHMuc3Rfc2l6ZTsKLSAgci0+dS51c2VyZGF0YS0+dS5idWZmZXIuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIHZlcnNpb25pbmZvIHJlc291cmNlLiAgKi8KLQotdm9pZAotZGVmaW5lX3ZlcnNpb25pbmZvIChpZCwgbGFuZ3VhZ2UsIGZpeGVkdmVyaW5mbywgdmVyaW5mbykKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgaW50IGxhbmd1YWdlOwotICAgICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpeGVkdmVyaW5mbzsKLSAgICAgc3RydWN0IHZlcl9pbmZvICp2ZXJpbmZvOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX1ZFUlNJT04sIGlkLCBsYW5ndWFnZSwgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9WRVJTSU9OSU5GTzsKLSAgci0+dS52ZXJzaW9uaW5mbyA9ICgoc3RydWN0IHZlcnNpb25pbmZvICopCi0JCSAgICAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdmVyc2lvbmluZm8pKSk7Ci0gIHItPnUudmVyc2lvbmluZm8tPmZpeGVkID0gZml4ZWR2ZXJpbmZvOwotICByLT51LnZlcnNpb25pbmZvLT52YXIgPSB2ZXJpbmZvOwotICByLT5yZXNfaW5mby5sYW5ndWFnZSA9IGxhbmd1YWdlOwotfQotCi0vKiBBZGQgc3RyaW5nIHZlcnNpb24gaW5mbyB0byBhIGxpc3Qgb2YgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCB2ZXJfaW5mbyAqCi1hcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvICh2ZXJpbmZvLCBsYW5ndWFnZSwgc3RyaW5ncykKLSAgICAgc3RydWN0IHZlcl9pbmZvICp2ZXJpbmZvOwotICAgICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLSAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpzdHJpbmdzOwotewotICBzdHJ1Y3QgdmVyX2luZm8gKnZpLCAqKnBwOwotCi0gIHZpID0gKHN0cnVjdCB2ZXJfaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdmkpOwotICB2aS0+bmV4dCA9IE5VTEw7Ci0gIHZpLT50eXBlID0gVkVSSU5GT19TVFJJTkc7Ci0gIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmdmktPnUuc3RyaW5nLmxhbmd1YWdlLCBsYW5ndWFnZSk7Ci0gIHZpLT51LnN0cmluZy5zdHJpbmdzID0gc3RyaW5nczsKLQotICBmb3IgKHBwID0gJnZlcmluZm87ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZpOwotCi0gIHJldHVybiB2ZXJpbmZvOwotfQotCi0vKiBBZGQgdmFyaWFibGUgdmVyc2lvbiBpbmZvIHRvIGEgbGlzdCBvZiB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl9pbmZvICoKLWFwcGVuZF92ZXJfdmFyZmlsZWluZm8gKHZlcmluZm8sIGtleSwgdmFyKQotICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZlcmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgc3RydWN0IHZlcl92YXJpbmZvICp2YXI7Ci17Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqdmksICoqcHA7Ci0KLSAgdmkgPSAoc3RydWN0IHZlcl9pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2aSk7Ci0gIHZpLT5uZXh0ID0gTlVMTDsKLSAgdmktPnR5cGUgPSBWRVJJTkZPX1ZBUjsKLSAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2aS0+dS52YXIua2V5LCBrZXkpOwotICB2aS0+dS52YXIudmFyID0gdmFyOwotCi0gIGZvciAocHAgPSAmdmVyaW5mbzsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gdmk7Ci0KLSAgcmV0dXJuIHZlcmluZm87Ci19Ci0KLS8qIEFwcGVuZCB2ZXJzaW9uIHN0cmluZyBpbmZvcm1hdGlvbiB0byBhIGxpc3QuICAqLwotCi1zdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKgotYXBwZW5kX3ZlcnZhbCAoc3RyaW5ncywga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpzdHJpbmdzOwotICAgICBjb25zdCBjaGFyICprZXk7Ci0gICAgIGNvbnN0IGNoYXIgKnZhbHVlOwotewotICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZzLCAqKnBwOwotCi0gIHZzID0gKHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnMpOwotICB2cy0+bmV4dCA9IE5VTEw7Ci0gIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmdnMtPmtleSwga2V5KTsKLSAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2cy0+dmFsdWUsIHZhbHVlKTsKLQotICBmb3IgKHBwID0gJnN0cmluZ3M7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZzOwotCi0gIHJldHVybiBzdHJpbmdzOwotfQotCi0vKiBBcHBlbmQgdmVyc2lvbiB2YXJpYWJsZSBpbmZvcm1hdGlvbiB0byBhIGxpc3QuICAqLwotCi1zdHJ1Y3QgdmVyX3ZhcmluZm8gKgotYXBwZW5kX3ZlcnRyYW5zICh2YXIsIGxhbmd1YWdlLCBjaGFyc2V0KQotICAgICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZhcjsKLSAgICAgdW5zaWduZWQgbG9uZyBsYW5ndWFnZTsKLSAgICAgdW5zaWduZWQgbG9uZyBjaGFyc2V0OwotewotICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2LCAqKnBwOwotCi0gIHZ2ID0gKHN0cnVjdCB2ZXJfdmFyaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnYpOwotICB2di0+bmV4dCA9IE5VTEw7Ci0gIHZ2LT5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICB2di0+Y2hhcnNldCA9IGNoYXJzZXQ7Ci0KLSAgZm9yIChwcCA9ICZ2YXI7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZ2OwotCi0gIHJldHVybiB2YXI7Ci19Ci0MCi0vKiBMb2NhbCBmdW5jdGlvbnMgdXNlZCB0byB3cml0ZSBvdXQgYW4gcmMgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGluZGVudCBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZGlyZWN0b3J5Ci0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50ICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfc3ViZGlyCi0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19yZXNvdXJjZQotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2FjY2VsZXJhdG9ycwotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19jdXJzb3IgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgY3Vyc29yICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2dyb3VwX2N1cnNvcgotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZGlhbG9nIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGRpYWxvZyAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19kaWFsb2dfY29udHJvbAotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19mb250ZGlyIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGZvbnRkaXIgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZ3JvdXBfaWNvbiBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX21lbnUgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgbWVudSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX21lbnVpdGVtcwotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfcmNkYXRhIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfc3RyaW5ndGFibGUKLSAgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY192ZXJzaW9uaW5mbyBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCB2ZXJzaW9uaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19maWxlZGF0YQotICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotCi0vKiBJbmRlbnQgYSBnaXZlbiBudW1iZXIgb2Ygc3BhY2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLWluZGVudCAoZSwgYykKLSAgICAgRklMRSAqZTsKLSAgICAgaW50IGM7Ci17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgcHV0YyAoJyAnLCBlKTsKLX0KLQotLyogRHVtcCB0aGUgcmVzb3VyY2VzIHdlIGhhdmUgcmVhZCBpbiB0aGUgZm9ybWF0IG9mIGFuIHJjIGZpbGUuCi0KLSAgIEFjdHVhbGx5LCB3ZSBkb24ndCB1c2UgdGhlIGZvcm1hdCBvZiBhbiByYyBmaWxlLCBiZWNhdXNlIGl0J3Mgd2F5Ci0gICB0b28gbXVjaCBvZiBhIHBhaW4tLWZvciBleGFtcGxlLCB3ZSdkIGhhdmUgdG8gd3JpdGUgaWNvbiByZXNvdXJjZXMKLSAgIGludG8gYSBmaWxlIGFuZCByZWZlciB0byB0aGF0IGZpbGUuICBXZSBqdXN0IGdlbmVyYXRlIGEgcmVhZGFibGUKLSAgIGZvcm1hdCB0aGF0IGtpbmQgb2YgbG9va3MgbGlrZSBhbiByYyBmaWxlLCBhbmQgaXMgdXNlZnVsIGZvcgotICAgdW5kZXJzdGFuZGluZyB0aGUgY29udGVudHMgb2YgYSByZXNvdXJjZSBmaWxlLiAgU29tZWRheSB3ZSBtYXkgd2FudAotICAgdG8gZ2VuZXJhdGUgYW4gcmMgZmlsZSB3aGljaCB0aGUgcmMgY29tcGlsZXIgY2FuIHJlYWQ7IGlmIHRoYXQgZGF5Ci0gICBjb21lcywgdGhpcyBjb2RlIHdpbGwgaGF2ZSB0byBiZSBmaXhlZCB1cC4gICovCi0KLXZvaWQKLXdyaXRlX3JjX2ZpbGUgKGZpbGVuYW1lLCByZXNvdXJjZXMpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotewotICBGSUxFICplOwotICBpbnQgbGFuZ3VhZ2U7Ci0KLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZSA9IHN0ZG91dDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGUgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1dUKTsKLSAgICAgIGlmIChlID09IE5VTEwpCi0JZmF0YWwgKF8oImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIpLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgfQotCi0gIGxhbmd1YWdlID0gLTE7Ci0gIHdyaXRlX3JjX2RpcmVjdG9yeSAoZSwgcmVzb3VyY2VzLCAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLAotCQkgICAgICAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLCAmbGFuZ3VhZ2UsIDEpOwotfQotCi0vKiBXcml0ZSBvdXQgYSBkaXJlY3RvcnkuICBFIGlzIHRoZSBmaWxlIHRvIHdyaXRlIHRvLiAgUkQgaXMgdGhlCi0gICBkaXJlY3RvcnkuICBUWVBFIGlzIGEgcG9pbnRlciB0byB0aGUgbGV2ZWwgMSBJRCB3aGljaCBzZXJ2ZXMgYXMgdGhlCi0gICByZXNvdXJjZSB0eXBlLiAgTkFNRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGxldmVsIDIgSUQgd2hpY2ggc2VydmVzIGFzCi0gICBhbiBpbmRpdmlkdWFsIHJlc291cmNlIG5hbWUuICBMQU5HVUFHRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQKLSAgIGxhbmd1YWdlLiAgTEVWRUwgaXMgdGhlIGxldmVsIGluIHRoZSB0cmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2RpcmVjdG9yeSAoZSwgcmQsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBpbnQgKmxhbmd1YWdlOwotICAgICBpbnQgbGV2ZWw7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKnJlOwotCi0gIC8qIFByaW50IG91dCBzb21lIENPRkYgaW5mb3JtYXRpb24gdGhhdCByYyBmaWxlcyBjYW4ndCByZXByZXNlbnQuICAqLwotCi0gIGlmIChyZC0+dGltZSAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBUaW1lIHN0YW1wOiAlbHVcbiIsIHJkLT50aW1lKTsKLSAgaWYgKHJkLT5jaGFyYWN0ZXJpc3RpY3MgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gQ2hhcmFjdGVyaXN0aWNzOiAlbHVcbiIsIHJkLT5jaGFyYWN0ZXJpc3RpY3MpOwotICBpZiAocmQtPm1ham9yICE9IDAgfHwgcmQtPm1pbm9yICE9IDApCi0gICAgZnByaW50ZiAoZSwgIi8vIFZlcnNpb246ICVkICVkXG4iLCByZC0+bWFqb3IsIHJkLT5taW5vcik7Ci0KLSAgZm9yIChyZSA9IHJkLT5lbnRyaWVzOyAgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGxldmVsKQotCXsKLQljYXNlIDE6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAxLCB0aGUga2V5IG9mIHRoaXMgcmVzb3VyY2UgaXMgdGhlCi0gICAgICAgICAgICAgdHlwZS4gIFRoaXMgbm9ybWFsbHkgZHVwbGljYXRlcyB0aGUgaW5mb3JtYXRpb24gd2UgaGF2ZQotICAgICAgICAgICAgIHN0b3JlZCB3aXRoIHRoZSByZXNvdXJjZSBpdHNlbGYsIGJ1dCB3ZSBuZWVkIHRvIHJlbWVtYmVyCi0gICAgICAgICAgICAgdGhlIHR5cGUgaWYgdGhpcyBpcyBhIHVzZXIgZGVmaW5lIHJlc291cmNlIHR5cGUuICAqLwotCSAgdHlwZSA9ICZyZS0+aWQ7Ci0JICBicmVhazsKLQotCWNhc2UgMjoKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDIsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUgbmFtZQotCSAgICAgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbiB0aGUgcmMgcHJpbnRvdXQuICovCi0JICBuYW1lID0gJnJlLT5pZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMywgdGhlbiB0aGlzIGtleSByZXByZXNlbnRzIGEgbGFuZ3VhZ2UuCi0JICAgICBVc2UgaXQgdG8gdXBkYXRlIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAgKi8KLQkgIGlmICghIHJlLT5pZC5uYW1lZAotCSAgICAgICYmIHJlLT5pZC51LmlkICE9ICh1bnNpZ25lZCBsb25nKSAodW5zaWduZWQgaW50KSAqbGFuZ3VhZ2UKLQkgICAgICAmJiAocmUtPmlkLnUuaWQgJiAweGZmZmYpID09IHJlLT5pZC51LmlkKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoZSwgIkxBTkdVQUdFICVsdSwgJWx1XG4iLAotCQkgICAgICAgcmUtPmlkLnUuaWQgJiAweGZmLCAocmUtPmlkLnUuaWQgPj4gOCkgJiAweGZmKTsKLQkgICAgICAqbGFuZ3VhZ2UgPSByZS0+aWQudS5pZDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmUtPnN1YmRpcikKLQl3cml0ZV9yY19zdWJkaXIgKGUsIHJlLCB0eXBlLCBuYW1lLCBsYW5ndWFnZSwgbGV2ZWwpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChsZXZlbCA9PSAzKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgbm9ybWFsIGNhc2U6IHRoZSB0aHJlZSBsZXZlbHMgYXJlCi0gICAgICAgICAgICAgICAgIFRZUEUvTkFNRS9MQU5HVUFHRS4gIE5BTUUgd2lsbCBoYXZlIGJlZW4gc2V0IGF0IGxldmVsCi0gICAgICAgICAgICAgICAgIDIsIGFuZCByZXByZXNlbnRzIHRoZSBuYW1lIHRvIHVzZS4gIFdlIHByb2JhYmx5IGp1c3QKLSAgICAgICAgICAgICAgICAgc2V0IExBTkdVQUdFLCBhbmQgaXQgd2lsbCBwcm9iYWJseSBtYXRjaCB3aGF0IHRoZQotICAgICAgICAgICAgICAgICByZXNvdXJjZSBpdHNlbGYgcmVjb3JkcyBpZiBhbnl0aGluZy4gICovCi0JICAgICAgd3JpdGVfcmNfcmVzb3VyY2UgKGUsIHR5cGUsIG5hbWUsIHJlLT51LnJlcywgbGFuZ3VhZ2UpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChlLCAiLy8gUmVzb3VyY2UgYXQgdW5leHBlY3RlZCBsZXZlbCAlZFxuIiwgbGV2ZWwpOwotCSAgICAgIHdyaXRlX3JjX3Jlc291cmNlIChlLCB0eXBlLCAoc3RydWN0IHJlc19pZCAqKSBOVUxMLCByZS0+dS5yZXMsCi0JCQkJIGxhbmd1YWdlKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN1YmRpcmVjdG9yeSBlbnRyeS4gIEUgaXMgdGhlIGZpbGUgdG8gd3JpdGUgdG8uICBSRSBpcwotICAgdGhlIHN1YmRpcmVjdG9yeSBlbnRyeS4gIFRZUEUgYW5kIE5BTUUgYXJlIHBvaW50ZXJzIHRvIGhpZ2hlciBsZXZlbAotICAgSURzLCBvciBOVUxMLiAgTEFOR1VBR0UgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxhbmd1YWdlLgotICAgTEVWRUwgaXMgdGhlIGxldmVsIGluIHRoZSB0cmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3N1YmRpciAoZSwgcmUsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci0gICAgIGludCBsZXZlbDsKLXsKLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0gIHN3aXRjaCAobGV2ZWwpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGZwcmludGYgKGUsICIvLyBUeXBlOiAiKTsKLSAgICAgIGlmIChyZS0+aWQubmFtZWQpCi0JcmVzX2lkX3ByaW50IChlLCByZS0+aWQsIDEpOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKnM7Ci0KLQkgIHN3aXRjaCAocmUtPmlkLnUuaWQpCi0JICAgIHsKLQkgICAgY2FzZSBSVF9DVVJTT1I6IHMgPSAiY3Vyc29yIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfQklUTUFQOiBzID0gImJpdG1hcCI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0lDT046IHMgPSAiaWNvbiI7IGJyZWFrOwotCSAgICBjYXNlIFJUX01FTlU6IHMgPSAibWVudSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0RJQUxPRzogcyA9ICJkaWFsb2ciOyBicmVhazsKLQkgICAgY2FzZSBSVF9TVFJJTkc6IHMgPSAic3RyaW5ndGFibGUiOyBicmVhazsKLQkgICAgY2FzZSBSVF9GT05URElSOiBzID0gImZvbnRkaXIiOyBicmVhazsKLQkgICAgY2FzZSBSVF9GT05UOiBzID0gImZvbnQiOyBicmVhazsKLQkgICAgY2FzZSBSVF9BQ0NFTEVSQVRPUjogcyA9ICJhY2NlbGVyYXRvcnMiOyBicmVhazsKLQkgICAgY2FzZSBSVF9SQ0RBVEE6IHMgPSAicmNkYXRhIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfTUVTU0FHRVRBQkxFOiBzID0gIm1lc3NhZ2V0YWJsZSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0dST1VQX0NVUlNPUjogcyA9ICJncm91cCBjdXJzb3IiOyBicmVhazsKLQkgICAgY2FzZSBSVF9HUk9VUF9JQ09OOiBzID0gImdyb3VwIGljb24iOyBicmVhazsKLQkgICAgY2FzZSBSVF9WRVJTSU9OOiBzID0gInZlcnNpb24iOyBicmVhazsKLQkgICAgY2FzZSBSVF9ETEdJTkNMVURFOiBzID0gImRsZ2luY2x1ZGUiOyBicmVhazsKLQkgICAgY2FzZSBSVF9QTFVHUExBWTogcyA9ICJwbHVncGxheSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX1ZYRDogcyA9ICJ2eGQiOyBicmVhazsKLQkgICAgY2FzZSBSVF9BTklDVVJTT1I6IHMgPSAiYW5pY3Vyc29yIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfQU5JSUNPTjogcyA9ICJhbmlpY29uIjsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6IHMgPSBOVUxMOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAocyAhPSBOVUxMKQotCSAgICBmcHJpbnRmIChlLCAiJXMiLCBzKTsKLQkgIGVsc2UKLQkgICAgcmVzX2lkX3ByaW50IChlLCByZS0+aWQsIDEpOwotCX0KLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gTmFtZTogIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgZnByaW50ZiAoZSwgIi8vIExhbmd1YWdlOiAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgcmUtPmlkLCAxKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoZSwgIi8vIExldmVsICVkOiAiLCBsZXZlbCk7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9CQkKLQotICB3cml0ZV9yY19kaXJlY3RvcnkgKGUsIHJlLT51LmRpciwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsICsgMSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHNpbmdsZSByZXNvdXJjZS4gIEUgaXMgdGhlIGZpbGUgdG8gd3JpdGUgdG8uICBUWVBFIGlzIGEKLSAgIHBvaW50ZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLiAgTkFNRSBpcyBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKLSAgIG9mIHRoZSByZXNvdXJjZTsgaXQgd2lsbCBiZSBOVUxMIGlmIHRoZXJlIGlzIGEgbGV2ZWwgbWlzbWF0Y2guICBSRVMKLSAgIGlzIHRoZSByZXNvdXJjZSBkYXRhLiAgTEFOR1VBR0UgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50Ci0gICBsYW5ndWFnZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19yZXNvdXJjZSAoZSwgdHlwZSwgbmFtZSwgcmVzLCBsYW5ndWFnZSkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICAgICBpbnQgKmxhbmd1YWdlOwotewotICBjb25zdCBjaGFyICpzOwotICBpbnQgcnQ7Ci0gIGludCBtZW51ZXggPSAwOwotCi0gIGZwcmludGYgKGUsICJcbiIpOwotCi0gIHN3aXRjaCAocmVzLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgotICAgICAgcyA9ICJBQ0NFTEVSQVRPUiI7Ci0gICAgICBydCA9IFJUX0FDQ0VMRVJBVE9SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKLSAgICAgIHMgPSAiQklUTUFQIjsKLSAgICAgIHJ0ID0gUlRfQklUTUFQOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0NVUlNPUjoKLSAgICAgIHMgPSAiQ1VSU09SIjsKLSAgICAgIHJ0ID0gUlRfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKLSAgICAgIHMgPSAiR1JPVVBfQ1VSU09SIjsKLSAgICAgIHJ0ID0gUlRfR1JPVVBfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKLSAgICAgIGlmIChleHRlbmRlZF9kaWFsb2cgKHJlcy0+dS5kaWFsb2cpKQotCXMgPSAiRElBTE9HRVgiOwotICAgICAgZWxzZQotCXMgPSAiRElBTE9HIjsKLSAgICAgIHJ0ID0gUlRfRElBTE9HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6Ci0gICAgICBzID0gIkZPTlQiOwotICAgICAgcnQgPSBSVF9GT05UOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0ZPTlRESVI6Ci0gICAgICBzID0gIkZPTlRESVIiOwotICAgICAgcnQgPSBSVF9GT05URElSOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0lDT046Ci0gICAgICBzID0gIklDT04iOwotICAgICAgcnQgPSBSVF9JQ09OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046Ci0gICAgICBzID0gIkdST1VQX0lDT04iOwotICAgICAgcnQgPSBSVF9HUk9VUF9JQ09OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FTlU6Ci0gICAgICBpZiAoZXh0ZW5kZWRfbWVudSAocmVzLT51Lm1lbnUpKQotCXsKLQkgIHMgPSAiTUVOVUVYIjsKLQkgIG1lbnVleCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHMgPSAiTUVOVSI7Ci0JICBtZW51ZXggPSAwOwotCX0KLSAgICAgIHJ0ID0gUlRfTUVOVTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9NRVNTQUdFVEFCTEU6Ci0gICAgICBzID0gIk1FU1NBR0VUQUJMRSI7Ci0gICAgICBydCA9IFJUX01FU1NBR0VUQUJMRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0gICAgICBzID0gIlJDREFUQSI7Ci0gICAgICBydCA9IFJUX1JDREFUQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLSAgICAgIHMgPSAiU1RSSU5HVEFCTEUiOwotICAgICAgcnQgPSBSVF9TVFJJTkc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICBzID0gTlVMTDsKLSAgICAgIHJ0ID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9WRVJTSU9OSU5GTzoKLSAgICAgIHMgPSAiVkVSU0lPTklORk8iOwotICAgICAgcnQgPSBSVF9WRVJTSU9OOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChydCAhPSAwCi0gICAgICAmJiB0eXBlICE9IE5VTEwKLSAgICAgICYmICh0eXBlLT5uYW1lZCB8fCB0eXBlLT51LmlkICE9ICh1bnNpZ25lZCBsb25nKSBydCkpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIFVuZXhwZWN0ZWQgcmVzb3VyY2UgdHlwZSBtaXNtYXRjaDogIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsICp0eXBlLCAxKTsKLSAgICAgIGZwcmludGYgKGUsICIgIT0gJWQiLCBydCk7Ci0gICAgfQotCi0gIGlmIChyZXMtPmNvZmZfaW5mby5jb2RlcGFnZSAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBDb2RlIHBhZ2U6ICVsdVxuIiwgcmVzLT5jb2ZmX2luZm8uY29kZXBhZ2UpOwotICBpZiAocmVzLT5jb2ZmX2luZm8ucmVzZXJ2ZWQgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gQ09GRiByZXNlcnZlZCB2YWx1ZTogJWx1XG4iLCByZXMtPmNvZmZfaW5mby5yZXNlcnZlZCk7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICByZXNfaWRfcHJpbnQgKGUsICpuYW1lLCAwKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGUsICI/P1Vua25vd24tTmFtZT8/Iik7Ci0KLSAgZnByaW50ZiAoZSwgIiAiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChlLCAiJXMiLCBzKTsKLSAgZWxzZSBpZiAodHlwZSAhPSBOVUxMKQotICAgIHJlc19pZF9wcmludCAoZSwgKnR5cGUsIDApOwotICBlbHNlCi0gICAgZnByaW50ZiAoZSwgIj8/VW5rbm93bi1UeXBlPz8iKTsKLQotICBpZiAocmVzLT5yZXNfaW5mby5tZW1mbGFncyAhPSAwKQotICAgIHsKLSAgICAgIGlmICgocmVzLT5yZXNfaW5mby5tZW1mbGFncyAmIE1FTUZMQUdfTU9WRUFCTEUpICE9IDApCi0JZnByaW50ZiAoZSwgIiBNT1ZFQUJMRSIpOwotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19QVVJFKSAhPSAwKQotCWZwcmludGYgKGUsICIgUFVSRSIpOwotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19QUkVMT0FEKSAhPSAwKQotCWZwcmludGYgKGUsICIgUFJFTE9BRCIpOwotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19ESVNDQVJEQUJMRSkgIT0gMCkKLQlmcHJpbnRmIChlLCAiIERJU0NBUkRBQkxFIik7Ci0gICAgfQotCi0gIGlmIChyZXMtPnR5cGUgPT0gUkVTX1RZUEVfRElBTE9HKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIgJWQsICVkLCAlZCwgJWQiLCByZXMtPnUuZGlhbG9nLT54LCByZXMtPnUuZGlhbG9nLT55LAotCSAgICAgICByZXMtPnUuZGlhbG9nLT53aWR0aCwgcmVzLT51LmRpYWxvZy0+aGVpZ2h0KTsKLSAgICAgIGlmIChyZXMtPnUuZGlhbG9nLT5leCAhPSBOVUxMCi0JICAmJiByZXMtPnUuZGlhbG9nLT5leC0+aGVscCAhPSAwKQotCWZwcmludGYgKGUsICIsICVsdSIsIHJlcy0+dS5kaWFsb2ctPmV4LT5oZWxwKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0KLSAgaWYgKChyZXMtPnJlc19pbmZvLmxhbmd1YWdlICE9IDAgJiYgcmVzLT5yZXNfaW5mby5sYW5ndWFnZSAhPSAqbGFuZ3VhZ2UpCi0gICAgICB8fCByZXMtPnJlc19pbmZvLmNoYXJhY3RlcmlzdGljcyAhPSAwCi0gICAgICB8fCByZXMtPnJlc19pbmZvLnZlcnNpb24gIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgbW9kaWZpZXJzOwotCi0gICAgICBzd2l0Y2ggKHJlcy0+dHlwZSkKLQl7Ci0JY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLQljYXNlIFJFU19UWVBFX0RJQUxPRzoKLQljYXNlIFJFU19UWVBFX01FTlU6Ci0JY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0JY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLQkgIG1vZGlmaWVycyA9IDE7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBtb2RpZmllcnMgPSAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmVzLT5yZXNfaW5mby5sYW5ndWFnZSAhPSAwICYmIHJlcy0+cmVzX2luZm8ubGFuZ3VhZ2UgIT0gKmxhbmd1YWdlKQotCWZwcmludGYgKGUsICIlc0xBTkdVQUdFICVkLCAlZFxuIiwKLQkJIG1vZGlmaWVycyA/ICIvLyAiIDogIiIsCi0JCSByZXMtPnJlc19pbmZvLmxhbmd1YWdlICYgMHhmZiwKLQkJIChyZXMtPnJlc19pbmZvLmxhbmd1YWdlID4+IDgpICYgMHhmZik7Ci0gICAgICBpZiAocmVzLT5yZXNfaW5mby5jaGFyYWN0ZXJpc3RpY3MgIT0gMCkKLQlmcHJpbnRmIChlLCAiJXNDSEFSQUNURVJJU1RJQ1MgJWx1XG4iLAotCQkgbW9kaWZpZXJzID8gIi8vICIgOiAiIiwKLQkJIHJlcy0+cmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzKTsKLSAgICAgIGlmIChyZXMtPnJlc19pbmZvLnZlcnNpb24gIT0gMCkKLQlmcHJpbnRmIChlLCAiJXNWRVJTSU9OICVsdVxuIiwKLQkJIG1vZGlmaWVycyA/ICIvLyAiIDogIiIsCi0JCSByZXMtPnJlc19pbmZvLnZlcnNpb24pOwotICAgIH0KLQotICBzd2l0Y2ggKHJlcy0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLSAgICAgIHdyaXRlX3JjX2FjY2VsZXJhdG9ycyAoZSwgcmVzLT51LmFjYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgotICAgICAgd3JpdGVfcmNfY3Vyc29yIChlLCByZXMtPnUuY3Vyc29yKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I6Ci0gICAgICB3cml0ZV9yY19ncm91cF9jdXJzb3IgKGUsIHJlcy0+dS5ncm91cF9jdXJzb3IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKLSAgICAgIHdyaXRlX3JjX2RpYWxvZyAoZSwgcmVzLT51LmRpYWxvZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKLSAgICAgIHdyaXRlX3JjX2ZvbnRkaXIgKGUsIHJlcy0+dS5mb250ZGlyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9JQ09OOgotICAgICAgd3JpdGVfcmNfZ3JvdXBfaWNvbiAoZSwgcmVzLT51Lmdyb3VwX2ljb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FTlU6Ci0gICAgICB3cml0ZV9yY19tZW51IChlLCByZXMtPnUubWVudSwgbWVudWV4KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0gICAgICB3cml0ZV9yY19yY2RhdGEgKGUsIHJlcy0+dS5yY2RhdGEsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgotICAgICAgd3JpdGVfcmNfc3RyaW5ndGFibGUgKGUsIG5hbWUsIHJlcy0+dS5zdHJpbmd0YWJsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICB3cml0ZV9yY19yY2RhdGEgKGUsIHJlcy0+dS51c2VyZGF0YSwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVkVSU0lPTklORk86Ci0gICAgICB3cml0ZV9yY192ZXJzaW9uaW5mbyAoZSwgcmVzLT51LnZlcnNpb25pbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9CSVRNQVA6Ci0gICAgY2FzZSBSRVNfVFlQRV9GT05UOgotICAgIGNhc2UgUkVTX1RZUEVfSUNPTjoKLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHdyaXRlX3JjX2ZpbGVkYXRhIChlLCByZXMtPnUuZGF0YS5sZW5ndGgsIHJlcy0+dS5kYXRhLmRhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYWNjZWxlcmF0b3IgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfYWNjZWxlcmF0b3JzIChlLCBhY2NlbGVyYXRvcnMpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjZWxlcmF0b3JzOwotewotICBjb25zdCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmFjYzsKLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotICBmb3IgKGFjYyA9IGFjY2VsZXJhdG9yczsgYWNjICE9IE5VTEw7IGFjYyA9IGFjYy0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgcHJpbnRhYmxlOwotCi0gICAgICBmcHJpbnRmIChlLCAiICAiKTsKLQotICAgICAgaWYgKChhY2MtPmtleSAmIDB4N2YpID09IGFjYy0+a2V5Ci0JICAmJiBpc3ByaW50ICgodW5zaWduZWQgY2hhcikgYWNjLT5rZXkpCi0JICAmJiAoYWNjLT5mbGFncyAmIEFDQ19WSVJUS0VZKSA9PSAwKQotCXsKLQkgIGZwcmludGYgKGUsICJcIiVjXCIiLCBhY2MtPmtleSk7Ci0JICBwcmludGFibGUgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcHJpbnRmIChlLCAiJWQiLCBhY2MtPmtleSk7Ci0JICBwcmludGFibGUgPSAwOwotCX0KLQotICAgICAgZnByaW50ZiAoZSwgIiwgJWQiLCBhY2MtPmlkKTsKLQotICAgICAgaWYgKCEgcHJpbnRhYmxlKQotCXsKLQkgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19WSVJUS0VZKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBWSVJUS0VZIik7Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKGUsICIsIEFTQ0lJIik7Ci0JfQotCi0gICAgICBpZiAoKGFjYy0+ZmxhZ3MgJiBBQ0NfU0hJRlQpICE9IDApCi0JZnByaW50ZiAoZSwgIiwgU0hJRlQiKTsKLSAgICAgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19DT05UUk9MKSAhPSAwKQotCWZwcmludGYgKGUsICIsIENPTlRST0wiKTsKLSAgICAgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19BTFQpICE9IDApCi0JZnByaW50ZiAoZSwgIiwgQUxUIik7Ci0KLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKLX0KLQotLyogV3JpdGUgb3V0IGN1cnNvciBpbmZvcm1hdGlvbi4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgaW4gYSBzZXBhcmF0ZQotICAgZmlsZSwgd2hpY2ggdGhlIHJjIGZpbGUgd291bGQgaW5jbHVkZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19jdXJzb3IgKGUsIGN1cnNvcikKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IGN1cnNvciAqY3Vyc29yOwotewotICBmcHJpbnRmIChlLCAiLy8gSG90c3BvdDogeDogJWQ7IHk6ICVkXG4iLCBjdXJzb3ItPnhob3RzcG90LAotCSAgIGN1cnNvci0+eWhvdHNwb3QpOwotICB3cml0ZV9yY19maWxlZGF0YSAoZSwgY3Vyc29yLT5sZW5ndGgsIGN1cnNvci0+ZGF0YSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBncm91cCBjdXJzb3IgZGF0YS4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgYnVpbHQgZnJvbSB0aGUKLSAgIGN1cnNvciBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2dyb3VwX2N1cnNvciAoZSwgZ3JvdXBfY3Vyc29yKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpncm91cF9jdXJzb3I7Ci17Ci0gIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKmdjOwotCi0gIGZvciAoZ2MgPSBncm91cF9jdXJzb3I7IGdjICE9IE5VTEw7IGdjID0gZ2MtPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIHdpZHRoOiAlZDsgaGVpZ2h0ICVkOyBwbGFuZXMgJWQ7IGJpdHMgJWRcbiIsCi0JICAgICBnYy0+d2lkdGgsIGdjLT5oZWlnaHQsIGdjLT5wbGFuZXMsIGdjLT5iaXRzKTsKLSAgICAgIGZwcmludGYgKGUsICIvLyBkYXRhIGJ5dGVzOiAlbHU7IGluZGV4OiAlZFxuIiwKLQkgICAgICAgZ2MtPmJ5dGVzLCBnYy0+aW5kZXgpOwotICAgIH0KLX0KLQotLyogV3JpdGUgZGlhbG9nIGRhdGEuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfZGlhbG9nIChlLCBkaWFsb2cpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpYWxvZ19jb250cm9sICpjb250cm9sOwotCi0gIGlmIChkaWFsb2ctPnN0eWxlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIlNUWUxFIDB4JWx4XG4iLCBkaWFsb2ctPnN0eWxlKTsKLSAgaWYgKGRpYWxvZy0+ZXhzdHlsZSAhPSAwKQotICAgIGZwcmludGYgKGUsICJFWFNUWUxFIDB4JWx4XG4iLCBkaWFsb2ctPmV4c3R5bGUpOwotICBpZiAoKGRpYWxvZy0+Y2xhc3MubmFtZWQgJiYgZGlhbG9nLT5jbGFzcy51Lm4ubGVuZ3RoID4gMCkKLSAgICAgIHx8IGRpYWxvZy0+Y2xhc3MudS5pZCAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICJDTEFTUyAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgZGlhbG9nLT5jbGFzcywgMCk7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9Ci0gIGlmIChkaWFsb2ctPmNhcHRpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiQ0FQVElPTiBcIiIpOwotICAgICAgdW5pY29kZV9wcmludCAoZSwgZGlhbG9nLT5jYXB0aW9uLCAtMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXCJcbiIpOwotICAgIH0KLSAgaWYgKChkaWFsb2ctPm1lbnUubmFtZWQgJiYgZGlhbG9nLT5tZW51LnUubi5sZW5ndGggPiAwKQotICAgICAgfHwgZGlhbG9nLT5tZW51LnUuaWQgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiTUVOVSAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgZGlhbG9nLT5tZW51LCAwKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLSAgaWYgKGRpYWxvZy0+Zm9udCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICJGT05UICVkLCBcIiIsIGRpYWxvZy0+cG9pbnRzaXplKTsKLSAgICAgIHVuaWNvZGVfcHJpbnQgKGUsIGRpYWxvZy0+Zm9udCwgLTEpOwotICAgICAgZnByaW50ZiAoZSwgIlwiIik7Ci0gICAgICBpZiAoZGlhbG9nLT5leCAhPSBOVUxMCi0JICAmJiAoZGlhbG9nLT5leC0+d2VpZ2h0ICE9IDAgfHwgZGlhbG9nLT5leC0+aXRhbGljICE9IDApKQotCWZwcmludGYgKGUsICIsICVkLCAlZCIsIGRpYWxvZy0+ZXgtPndlaWdodCwgZGlhbG9nLT5leC0+aXRhbGljKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotCi0gIGZvciAoY29udHJvbCA9IGRpYWxvZy0+Y29udHJvbHM7IGNvbnRyb2wgIT0gTlVMTDsgY29udHJvbCA9IGNvbnRyb2wtPm5leHQpCi0gICAgd3JpdGVfcmNfZGlhbG9nX2NvbnRyb2wgKGUsIGNvbnRyb2wpOwotCi0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBGb3IgZWFjaCBwcmVkZWZpbmVkIGNvbnRyb2wga2V5d29yZCwgdGhpcyB0YWJsZSBwcm92aWRlcyB0aGUgY2xhc3MKLSAgIGFuZCB0aGUgc3R5bGUuICAqLwotCi1zdHJ1Y3QgY29udHJvbF9pbmZvCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIHNob3J0IGNsYXNzOwotICB1bnNpZ25lZCBsb25nIHN0eWxlOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjb250cm9sX2luZm8gY29udHJvbF9pbmZvW10gPQotewotICB7ICJBVVRPM1NUQVRFIiwgQ1RMX0JVVFRPTiwgQlNfQVVUTzNTVEFURSB9LAotICB7ICJBVVRPQ0hFQ0tCT1giLCBDVExfQlVUVE9OLCBCU19BVVRPQ0hFQ0tCT1ggfSwKLSAgeyAiQVVUT1JBRElPQlVUVE9OIiwgQ1RMX0JVVFRPTiwgQlNfQVVUT1JBRElPQlVUVE9OIH0sCi0gIHsgIkNIRUNLQk9YIiwgQ1RMX0JVVFRPTiwgQlNfQ0hFQ0tCT1ggfSwKLSAgeyAiQ09NQk9CT1giLCBDVExfQ09NQk9CT1gsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJDVEVYVCIsIENUTF9TVEFUSUMsIFNTX0NFTlRFUiB9LAotICB7ICJERUZQVVNIQlVUVE9OIiwgQ1RMX0JVVFRPTiwgQlNfREVGUFVTSEJVVFRPTiB9LAotICB7ICJFRElUVEVYVCIsIENUTF9FRElULCAodW5zaWduZWQgbG9uZykgLTEgfSwKLSAgeyAiR1JPVVBCT1giLCBDVExfQlVUVE9OLCBCU19HUk9VUEJPWCB9LAotICB7ICJJQ09OIiwgQ1RMX1NUQVRJQywgU1NfSUNPTiB9LAotICB7ICJMSVNUQk9YIiwgQ1RMX0xJU1RCT1gsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJMVEVYVCIsIENUTF9TVEFUSUMsIFNTX0xFRlQgfSwKLSAgeyAiUFVTSEJPWCIsIENUTF9CVVRUT04sIEJTX1BVU0hCT1ggfSwKLSAgeyAiUFVTSEJVVFRPTiIsIENUTF9CVVRUT04sIEJTX1BVU0hCVVRUT04gfSwKLSAgeyAiUkFESU9CVVRUT04iLCBDVExfQlVUVE9OLCBCU19SQURJT0JVVFRPTiB9LAotICB7ICJSVEVYVCIsIENUTF9TVEFUSUMsIFNTX1JJR0hUIH0sCi0gIHsgIlNDUk9MTEJBUiIsIENUTF9TQ1JPTExCQVIsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJTVEFURTMiLCBDVExfQlVUVE9OLCBCU18zU1RBVEUgfSwKLSAgLyogSXQncyBpbXBvcnRhbnQgdGhhdCBVU0VSQlVUVE9OIGNvbWUgYWZ0ZXIgYWxsIHRoZSBvdGhlciBidXR0b24KLSAgICAgdHlwZXMsIHNvIHRoYXQgaXQgd29uJ3QgYmUgbWF0Y2hlZCB0b28gZWFybHkuICAqLwotICB7ICJVU0VSQlVUVE9OIiwgQ1RMX0JVVFRPTiwgKHVuc2lnbmVkIGxvbmcpIC0xIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi0vKiBXcml0ZSBhIGRpYWxvZyBjb250cm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2RpYWxvZ19jb250cm9sIChlLCBjb250cm9sKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmNvbnRyb2w7Ci17Ci0gIGNvbnN0IHN0cnVjdCBjb250cm9sX2luZm8gKmNpOwotCi0gIGZwcmludGYgKGUsICIgICIpOwotCi0gIGlmIChjb250cm9sLT5jbGFzcy5uYW1lZCkKLSAgICBjaSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGNpID0gY29udHJvbF9pbmZvOyBjaS0+bmFtZSAhPSBOVUxMOyArK2NpKQotCWlmIChjaS0+Y2xhc3MgPT0gY29udHJvbC0+Y2xhc3MudS5pZAotCSAgICAmJiAoY2ktPnN0eWxlID09ICh1bnNpZ25lZCBsb25nKSAtMQotCQl8fCBjaS0+c3R5bGUgPT0gKGNvbnRyb2wtPnN0eWxlICYgMHhmZikpKQotCSAgYnJlYWs7Ci0gICAgfQotICBpZiAoY2kgPT0gTlVMTCkKLSAgICBmcHJpbnRmIChlLCAiQ09OVFJPTCIpOwotICBlbHNlIGlmIChjaS0+bmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKGUsICIlcyIsIGNpLT5uYW1lKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGUsICJDT05UUk9MIik7Ci0gIAotICBpZiAoY29udHJvbC0+dGV4dC5uYW1lZCB8fCBjb250cm9sLT50ZXh0LnUuaWQgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiICIpOwotICAgICAgcmVzX2lkX3ByaW50IChlLCBjb250cm9sLT50ZXh0LCAxKTsKLSAgICAgIGZwcmludGYgKGUsICIsIik7Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICIgJWQsICIsIGNvbnRyb2wtPmlkKTsKLQotICBpZiAoY2kgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29udHJvbC0+Y2xhc3MubmFtZWQpCi0JZnByaW50ZiAoZSwgIlwiIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIGNvbnRyb2wtPmNsYXNzLCAwKTsKLSAgICAgIGlmIChjb250cm9sLT5jbGFzcy5uYW1lZCkKLQlmcHJpbnRmIChlLCAiXCIiKTsKLSAgICAgIGZwcmludGYgKGUsICIsIDB4JWx4LCAiLCBjb250cm9sLT5zdHlsZSk7Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICIlZCwgJWQiLCBjb250cm9sLT54LCBjb250cm9sLT55KTsKLQotICBpZiAoY29udHJvbC0+c3R5bGUgIT0gU1NfSUNPTgotICAgICAgfHwgY29udHJvbC0+ZXhzdHlsZSAhPSAwCi0gICAgICB8fCBjb250cm9sLT53aWR0aCAhPSAwCi0gICAgICB8fCBjb250cm9sLT5oZWlnaHQgIT0gMAotICAgICAgfHwgY29udHJvbC0+aGVscCAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIsICVkLCAlZCIsIGNvbnRyb2wtPndpZHRoLCBjb250cm9sLT5oZWlnaHQpOwotCi0gICAgICAvKiBGSVhNRTogV2UgZG9uJ3QgbmVlZCB0byBwcmludCB0aGUgc3R5bGUgaWYgaXQgaXMgdGhlIGRlZmF1bHQuCi0JIE1vcmUgaW1wb3J0YW50bHksIGluIGNlcnRhaW4gY2FzZXMgd2UgYWN0dWFsbHkgbmVlZCB0byB0dXJuCi0JIG9mZiBwYXJ0cyBvZiB0aGUgZm9yY2VkIHN0eWxlLCBieSB1c2luZyBOT1QuICAqLwotICAgICAgZnByaW50ZiAoZSwgIiwgMHglbHgiLCBjb250cm9sLT5zdHlsZSk7Ci0KLSAgICAgIGlmIChjb250cm9sLT5leHN0eWxlICE9IDAgfHwgY29udHJvbC0+aGVscCAhPSAwKQotCWZwcmludGYgKGUsICIsIDB4JWx4LCAlbHUiLCBjb250cm9sLT5leHN0eWxlLCBjb250cm9sLT5oZWxwKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0KLSAgaWYgKGNvbnRyb2wtPmRhdGEgIT0gTlVMTCkKLSAgICB3cml0ZV9yY19yY2RhdGEgKGUsIGNvbnRyb2wtPmRhdGEsIDIpOwotfQotCi0vKiBXcml0ZSBvdXQgZm9udCBkaXJlY3RvcnkgZGF0YS4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgYnVpbHQgZnJvbQotICAgdGhlIGZvbnQgZGF0YS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19mb250ZGlyIChlLCBmb250ZGlyKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgZm9udGRpciAqZm9udGRpcjsKLXsKLSAgY29uc3Qgc3RydWN0IGZvbnRkaXIgKmZjOwotCi0gIGZvciAoZmMgPSBmb250ZGlyOyBmYyAhPSBOVUxMOyBmYyA9IGZjLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIvLyBGb250IGluZGV4OiAlZFxuIiwgZmMtPmluZGV4KTsKLSAgICAgIHdyaXRlX3JjX2ZpbGVkYXRhIChlLCBmYy0+bGVuZ3RoLCBmYy0+ZGF0YSk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgZ3JvdXAgaWNvbiBkYXRhLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZSBidWlsdCBmcm9tIHRoZQotICAgaWNvbiBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2dyb3VwX2ljb24gKGUsIGdyb3VwX2ljb24pCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICpncm91cF9pY29uOwotewotICBjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ2k7Ci0KLSAgZm9yIChnaSA9IGdyb3VwX2ljb247IGdpICE9IE5VTEw7IGdpID0gZ2ktPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIHdpZHRoOiAlZDsgaGVpZ2h0ICVkOyBjb2xvcnM6ICVkOyBwbGFuZXMgJWQ7IGJpdHMgJWRcbiIsCi0JICAgICAgIGdpLT53aWR0aCwgZ2ktPmhlaWdodCwgZ2ktPmNvbG9ycywgZ2ktPnBsYW5lcywgZ2ktPmJpdHMpOwotICAgICAgZnByaW50ZiAoZSwgIi8vIGRhdGEgYnl0ZXM6ICVsdTsgaW5kZXg6ICVkXG4iLAotCSAgICAgICBnaS0+Ynl0ZXMsIGdpLT5pbmRleCk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYSBtZW51IHJlc291cmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX21lbnUgKGUsIG1lbnUsIG1lbnVleCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IG1lbnUgKm1lbnU7Ci0gICAgIGludCBtZW51ZXg7Ci17Ci0gIGlmIChtZW51LT5oZWxwICE9IDApCi0gICAgZnByaW50ZiAoZSwgIi8vIEhlbHAgSUQ6ICVsdVxuIiwgbWVudS0+aGVscCk7Ci0gIHdyaXRlX3JjX21lbnVpdGVtcyAoZSwgbWVudS0+aXRlbXMsIG1lbnVleCwgMCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBtZW51aXRlbXMuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfbWVudWl0ZW1zIChlLCBtZW51aXRlbXMsIG1lbnVleCwgaW5kKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtczsKLSAgICAgaW50IG1lbnVleDsKLSAgICAgaW50IGluZDsKLXsKLSAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICBpbmRlbnQgKGUsIGluZCk7Ci0gIGZwcmludGYgKGUsICJCRUdJTlxuIik7Ci0KLSAgZm9yIChtaSA9IG1lbnVpdGVtczsgbWkgIT0gTlVMTDsgbWkgPSBtaS0+bmV4dCkKLSAgICB7Ci0gICAgICBpbmRlbnQgKGUsIGluZCArIDIpOwotCi0gICAgICBpZiAobWktPnBvcHVwID09IE5VTEwpCi0JZnByaW50ZiAoZSwgIk1FTlVJVEVNIik7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZSwgIlBPUFVQIik7Ci0KLSAgICAgIGlmICghIG1lbnVleAotCSAgJiYgbWktPnBvcHVwID09IE5VTEwKLQkgICYmIG1pLT50ZXh0ID09IE5VTEwKLQkgICYmIG1pLT50eXBlID09IDAKLQkgICYmIG1pLT5pZCA9PSAwKQotCXsKLQkgIGZwcmludGYgKGUsICIgU0VQQVJBVE9SXG4iKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKG1pLT50ZXh0ID09IE5VTEwpCi0JZnByaW50ZiAoZSwgIiBcIlwiIik7Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAoZSwgIiBcIiIpOwotCSAgdW5pY29kZV9wcmludCAoZSwgbWktPnRleHQsIC0xKTsKLQkgIGZwcmludGYgKGUsICJcIiIpOwotCX0KLQotICAgICAgaWYgKCEgbWVudWV4KQotCXsKLQkgIGlmIChtaS0+cG9wdXAgPT0gTlVMTCkKLQkgICAgZnByaW50ZiAoZSwgIiwgJWQiLCBtaS0+aWQpOwotCi0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fQ0hFQ0tFRCkgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgQ0hFQ0tFRCIpOwotCSAgaWYgKChtaS0+dHlwZSAmIE1FTlVJVEVNX0dSQVlFRCkgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgR1JBWUVEIik7Ci0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fSEVMUCkgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgSEVMUCIpOwotCSAgaWYgKChtaS0+dHlwZSAmIE1FTlVJVEVNX0lOQUNUSVZFKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBJTkFDVElWRSIpOwotCSAgaWYgKChtaS0+dHlwZSAmIE1FTlVJVEVNX01FTlVCQVJCUkVBSykgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgTUVOVUJBUkJSRUFLIik7Ci0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fTUVOVUJSRUFLKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBNRU5VQlJFQUsiKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG1pLT5pZCAhPSAwIHx8IG1pLT50eXBlICE9IDAgfHwgbWktPnN0YXRlICE9IDAgfHwgbWktPmhlbHAgIT0gMCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKGUsICIsICVkIiwgbWktPmlkKTsKLQkgICAgICBpZiAobWktPnR5cGUgIT0gMCB8fCBtaS0+c3RhdGUgIT0gMCB8fCBtaS0+aGVscCAhPSAwKQotCQl7Ci0JCSAgZnByaW50ZiAoZSwgIiwgJWx1IiwgbWktPnR5cGUpOwotCQkgIGlmIChtaS0+c3RhdGUgIT0gMCB8fCBtaS0+aGVscCAhPSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChlLCAiLCAlbHUiLCBtaS0+c3RhdGUpOwotCQkgICAgICBpZiAobWktPmhlbHAgIT0gMCkKLQkJCWZwcmludGYgKGUsICIsICVsdSIsIG1pLT5oZWxwKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLQotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCXdyaXRlX3JjX21lbnVpdGVtcyAoZSwgbWktPnBvcHVwLCBtZW51ZXgsIGluZCArIDIpOwotICAgIH0KLQotICBpbmRlbnQgKGUsIGluZCk7Ci0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gcmNkYXRhIHJlc291cmNlLiAgVGhpcyBpcyBhbHNvIHVzZWQgZm9yIG90aGVyIHR5cGVzIG9mCi0gICByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIHByaW50IGFyYml0cmFyeSBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3JjZGF0YSAoZSwgcmNkYXRhLCBpbmQpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhOwotICAgICBpbnQgaW5kOwotewotICBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotCi0gIGluZGVudCAoZSwgaW5kKTsKLSAgZnByaW50ZiAoZSwgIkJFR0lOXG4iKTsKLQotICBmb3IgKHJpID0gcmNkYXRhOyByaSAhPSBOVUxMOyByaSA9IHJpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChyaS0+dHlwZSA9PSBSQ0RBVEFfQlVGRkVSICYmIHJpLT51LmJ1ZmZlci5sZW5ndGggPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaW5kZW50IChlLCBpbmQgKyAyKTsKLQotICAgICAgc3dpdGNoIChyaS0+dHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBSQ0RBVEFfV09SRDoKLQkgIGZwcmludGYgKGUsICIlZCIsIHJpLT51LndvcmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9EV09SRDoKLQkgIGZwcmludGYgKGUsICIlbHVMIiwgcmktPnUuZHdvcmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9TVFJJTkc6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaTsKLQotCSAgICBmcHJpbnRmIChlLCAiXCIiKTsKLQkgICAgcyA9IHJpLT51LnN0cmluZy5zOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgcmktPnUuc3RyaW5nLmxlbmd0aDsgaSsrKQotCSAgICAgIHsKLQkJaWYgKGlzcHJpbnQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSAgcHV0YyAoKnMsIGUpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZSwgIlxcJTAzbyIsICpzKTsKLQkgICAgICB9Ci0JICAgIGZwcmludGYgKGUsICJcIiIpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgUkNEQVRBX1dTVFJJTkc6Ci0JICBmcHJpbnRmIChlLCAiTFwiIik7Ci0JICB1bmljb2RlX3ByaW50IChlLCByaS0+dS53c3RyaW5nLncsIHJpLT51LndzdHJpbmcubGVuZ3RoKTsKLQkgIGZwcmludGYgKGUsICJcIiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9CVUZGRVI6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaTsKLQkgICAgaW50IGZpcnN0OwotCi0JICAgIC8qIEFzc3VtZSBsaXR0bGUgZW5kaWFuIGRhdGEuICAqLwotCi0JICAgIGZpcnN0ID0gMTsKLQkgICAgZm9yIChpID0gMDsgaSArIDMgPCByaS0+dS5idWZmZXIubGVuZ3RoOyBpICs9IDQpCi0JICAgICAgewotCQl1bnNpZ25lZCBsb25nIGw7Ci0JCWludCBqOwotCi0JCWlmICghIGZpcnN0KQotCQkgIGluZGVudCAoZSwgaW5kICsgMik7Ci0JCWwgPSAoKCgoKChyaS0+dS5idWZmZXIuZGF0YVtpICsgM10gPDwgOCkKLQkJCSB8IHJpLT51LmJ1ZmZlci5kYXRhW2kgKyAyXSkgPDwgOCkKLQkJICAgICAgIHwgcmktPnUuYnVmZmVyLmRhdGFbaSArIDFdKSA8PCA4KQotCQkgICAgIHwgcmktPnUuYnVmZmVyLmRhdGFbaV0pOwotCQlmcHJpbnRmIChlLCAiJWx1TCIsIGwpOwotCQlpZiAoaSArIDQgPCByaS0+dS5idWZmZXIubGVuZ3RoIHx8IHJpLT5uZXh0ICE9IE5VTEwpCi0JCSAgZnByaW50ZiAoZSwgIiwiKTsKLQkJZm9yIChqID0gMDsgaiA8IDQ7ICsraikKLQkJICBpZiAoISBpc3ByaW50IChyaS0+dS5idWZmZXIuZGF0YVtpICsgal0pCi0JCSAgICAgICYmIHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JCWlmIChqID49IDQpCi0JCSAgewotCQkgICAgZnByaW50ZiAoZSwgIlx0Ly8gIik7Ci0JCSAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKQotCQkgICAgICB7Ci0JCQlpZiAoISBpc3ByaW50IChyaS0+dS5idWZmZXIuZGF0YVtpICsgal0pKQotCQkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgcmktPnUuYnVmZmVyLmRhdGFbaSArIGpdKTsKLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGlmIChyaS0+dS5idWZmZXIuZGF0YVtpICsgal0gPT0gJ1xcJykKLQkJCSAgICAgIGZwcmludGYgKGUsICJcXCIpOwotCQkJICAgIGZwcmludGYgKGUsICIlYyIsIHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0KLQkJZnByaW50ZiAoZSwgIlxuIik7Ci0JCWZpcnN0ID0gMDsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGkgKyAxIDwgcmktPnUuYnVmZmVyLmxlbmd0aCkKLQkgICAgICB7Ci0JCWludCBzOwotCQlpbnQgajsKLQotCQlpZiAoISBmaXJzdCkKLQkJICBpbmRlbnQgKGUsIGluZCArIDIpOwotCQlzID0gKHJpLT51LmJ1ZmZlci5kYXRhW2kgKyAxXSA8PCA4KSB8IHJpLT51LmJ1ZmZlci5kYXRhW2ldOwotCQlmcHJpbnRmIChlLCAiJWQiLCBzKTsKLQkJaWYgKGkgKyAyIDwgcmktPnUuYnVmZmVyLmxlbmd0aCB8fCByaS0+bmV4dCAhPSBOVUxMKQotCQkgIGZwcmludGYgKGUsICIsIik7Ci0JCWZvciAoaiA9IDA7IGogPCAyOyArK2opCi0JCSAgaWYgKCEgaXNwcmludCAocmktPnUuYnVmZmVyLmRhdGFbaSArIGpdKQotCQkgICAgICAmJiByaS0+dS5idWZmZXIuZGF0YVtpICsgal0gIT0gMCkKLQkJICAgIGJyZWFrOwotCQlpZiAoaiA+PSAyKQotCQkgIHsKLQkJICAgIGZwcmludGYgKGUsICJcdC8vICIpOwotCQkgICAgZm9yIChqID0gMDsgaiA8IDI7ICsraikKLQkJICAgICAgewotCQkJaWYgKCEgaXNwcmludCAocmktPnUuYnVmZmVyLmRhdGFbaSArIGpdKSkKLQkJCSAgZnByaW50ZiAoZSwgIlxcJTAzbyIsIHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSk7Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpZiAocmktPnUuYnVmZmVyLmRhdGFbaSArIGpdID09ICdcXCcpCi0JCQkgICAgICBmcHJpbnRmIChlLCAiXFwiKTsKLQkJCSAgICBmcHJpbnRmIChlLCAiJWMiLCByaS0+dS5idWZmZXIuZGF0YVtpICsgal0pOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWZwcmludGYgKGUsICJcbiIpOwotCQlpICs9IDI7Ci0JCWZpcnN0ID0gMDsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGkgPCByaS0+dS5idWZmZXIubGVuZ3RoKQotCSAgICAgIHsKLQkJaWYgKCEgZmlyc3QpCi0JCSAgaW5kZW50IChlLCBpbmQgKyAyKTsKLQkJaWYgKChyaS0+dS5idWZmZXIuZGF0YVtpXSAmIDB4N2YpID09IHJpLT51LmJ1ZmZlci5kYXRhW2ldCi0JCSAgICAmJiBpc3ByaW50IChyaS0+dS5idWZmZXIuZGF0YVtpXSkpCi0JCSAgZnByaW50ZiAoZSwgIlwiJWNcIiIsIHJpLT51LmJ1ZmZlci5kYXRhW2ldKTsKLQkJZWxzZQotCQkgIGZwcmludGYgKGUsICJcIlxcJTAzb1wiIiwgcmktPnUuYnVmZmVyLmRhdGFbaV0pOwotCQlpZiAocmktPm5leHQgIT0gTlVMTCkKLQkJICBmcHJpbnRmIChlLCAiLCIpOwotCQlmcHJpbnRmIChlLCAiXG4iKTsKLQkJZmlyc3QgPSAwOwotCSAgICAgIH0KLQotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0KLSAgICAgIGlmIChyaS0+dHlwZSAhPSBSQ0RBVEFfQlVGRkVSKQotCXsKLQkgIGlmIChyaS0+bmV4dCAhPSBOVUxMKQotCSAgICBmcHJpbnRmIChlLCAiLCIpOwotCSAgZnByaW50ZiAoZSwgIlxuIik7Ci0JfQotICAgIH0KLQotICBpbmRlbnQgKGUsIGluZCk7Ci0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzdHJpbmd0YWJsZSByZXNvdXJjZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19zdHJpbmd0YWJsZSAoZSwgbmFtZSwgc3RyaW5ndGFibGUpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqc3RyaW5ndGFibGU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICBpbnQgaTsKLQotICBpZiAobmFtZSAhPSBOVUxMICYmICEgbmFtZS0+bmFtZWQpCi0gICAgb2Zmc2V0ID0gKG5hbWUtPnUuaWQgLSAxKSA8PCA0OwotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vICVzIHN0cmluZyB0YWJsZSBuYW1lXG4iLAotCSAgICAgICBuYW1lID09IE5VTEwgPyAiTWlzc2luZyIgOiAiSW52YWxpZCIpOwotICAgICAgb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIkJFR0lOXG4iKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyaW5ndGFibGUtPnN0cmluZ3NbaV0ubGVuZ3RoICE9IDApCi0JewotCSAgZnByaW50ZiAoZSwgIiAgJWx1LCBcIiIsIG9mZnNldCArIGkpOwotCSAgdW5pY29kZV9wcmludCAoZSwgc3RyaW5ndGFibGUtPnN0cmluZ3NbaV0uc3RyaW5nLAotCQkJIHN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLmxlbmd0aCk7Ci0JICBmcHJpbnRmIChlLCAiXCJcbiIpOwotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIkVORFxuIik7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHZlcnNpb25pbmZvIHJlc291cmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3ZlcnNpb25pbmZvIChlLCB2ZXJzaW9uaW5mbykKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHZlcnNpb25pbmZvICp2ZXJzaW9uaW5mbzsKLXsKLSAgY29uc3Qgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmOwotICBjb25zdCBzdHJ1Y3QgdmVyX2luZm8gKnZpOwotCi0gIGYgPSB2ZXJzaW9uaW5mby0+Zml4ZWQ7Ci0gIGlmIChmLT5maWxlX3ZlcnNpb25fbXMgIT0gMCB8fCBmLT5maWxlX3ZlcnNpb25fbHMgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVWRVJTSU9OICVsdSwgJWx1LCAlbHUsICVsdVxuIiwKLQkgICAgIChmLT5maWxlX3ZlcnNpb25fbXMgPj4gMTYpICYgMHhmZmZmLAotCSAgICAgZi0+ZmlsZV92ZXJzaW9uX21zICYgMHhmZmZmLAotCSAgICAgKGYtPmZpbGVfdmVyc2lvbl9scyA+PiAxNikgJiAweGZmZmYsCi0JICAgICBmLT5maWxlX3ZlcnNpb25fbHMgJiAweGZmZmYpOwotICBpZiAoZi0+cHJvZHVjdF92ZXJzaW9uX21zICE9IDAgfHwgZi0+cHJvZHVjdF92ZXJzaW9uX2xzICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBQUk9EVUNUVkVSU0lPTiAlbHUsICVsdSwgJWx1LCAlbHVcbiIsCi0JICAgICAoZi0+cHJvZHVjdF92ZXJzaW9uX21zID4+IDE2KSAmIDB4ZmZmZiwKLQkgICAgIGYtPnByb2R1Y3RfdmVyc2lvbl9tcyAmIDB4ZmZmZiwKLQkgICAgIChmLT5wcm9kdWN0X3ZlcnNpb25fbHMgPj4gMTYpICYgMHhmZmZmLAotCSAgICAgZi0+cHJvZHVjdF92ZXJzaW9uX2xzICYgMHhmZmZmKTsKLSAgaWYgKGYtPmZpbGVfZmxhZ3NfbWFzayAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRUZMQUdTTUFTSyAweCVseFxuIiwgZi0+ZmlsZV9mbGFnc19tYXNrKTsKLSAgaWYgKGYtPmZpbGVfZmxhZ3MgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVGTEFHUyAweCVseFxuIiwgZi0+ZmlsZV9mbGFncyk7Ci0gIGlmIChmLT5maWxlX29zICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFT1MgMHglbHhcbiIsIGYtPmZpbGVfb3MpOwotICBpZiAoZi0+ZmlsZV90eXBlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFVFlQRSAweCVseFxuIiwgZi0+ZmlsZV90eXBlKTsKLSAgaWYgKGYtPmZpbGVfc3VidHlwZSAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRVNVQlRZUEUgMHglbHhcbiIsIGYtPmZpbGVfc3VidHlwZSk7Ci0gIGlmIChmLT5maWxlX2RhdGVfbXMgIT0gMCB8fCBmLT5maWxlX2RhdGVfbHMgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gRGF0ZTogJWx1LCAlbHVcbiIsIGYtPmZpbGVfZGF0ZV9tcywgZi0+ZmlsZV9kYXRlX2xzKTsKLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotCi0gIGZvciAodmkgPSB2ZXJzaW9uaW5mby0+dmFyOyB2aSAhPSBOVUxMOyB2aSA9IHZpLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAodmktPnR5cGUpCi0JewotCWNhc2UgVkVSSU5GT19TVFJJTkc6Ci0JICB7Ci0JICAgIGNvbnN0IHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqdnM7Ci0KLQkgICAgZnByaW50ZiAoZSwgIiAgQkxPQ0sgXCJTdHJpbmdGaWxlSW5mb1wiXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgQkVHSU5cbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICAgIEJMT0NLIFwiIik7Ci0JICAgIHVuaWNvZGVfcHJpbnQgKGUsIHZpLT51LnN0cmluZy5sYW5ndWFnZSwgLTEpOwotCSAgICBmcHJpbnRmIChlLCAiXCJcbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICAgIEJFR0lOXG4iKTsKLQotCSAgICBmb3IgKHZzID0gdmktPnUuc3RyaW5nLnN0cmluZ3M7IHZzICE9IE5VTEw7IHZzID0gdnMtPm5leHQpCi0JICAgICAgewotCQlmcHJpbnRmIChlLCAiICAgICAgVkFMVUUgXCIiKTsKLQkJdW5pY29kZV9wcmludCAoZSwgdnMtPmtleSwgLTEpOwotCQlmcHJpbnRmIChlLCAiXCIsIFwiIik7Ci0JCXVuaWNvZGVfcHJpbnQgKGUsIHZzLT52YWx1ZSwgLTEpOwotCQlmcHJpbnRmIChlLCAiXCJcbiIpOwotCSAgICAgIH0KLQotCSAgICBmcHJpbnRmIChlLCAiICAgIEVORFxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgIEVORFxuIik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBWRVJJTkZPX1ZBUjoKLQkgIHsKLQkgICAgY29uc3Qgc3RydWN0IHZlcl92YXJpbmZvICp2djsKLQotCSAgICBmcHJpbnRmIChlLCAiICBCTE9DSyBcIlZhckZpbGVJbmZvXCJcbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICBCRUdJTlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgICAgVkFMVUUgXCIiKTsKLQkgICAgdW5pY29kZV9wcmludCAoZSwgdmktPnUudmFyLmtleSwgLTEpOwotCSAgICBmcHJpbnRmIChlLCAiXCIiKTsKLQotCSAgICBmb3IgKHZ2ID0gdmktPnUudmFyLnZhcjsgdnYgIT0gTlVMTDsgdnYgPSB2di0+bmV4dCkKLQkgICAgICBmcHJpbnRmIChlLCAiLCAweCV4LCAlZCIsICh1bnNpZ25lZCBpbnQpIHZ2LT5sYW5ndWFnZSwKLQkJICAgICAgIHZ2LT5jaGFyc2V0KTsKLQotCSAgICBmcHJpbnRmIChlLCAiXG4gIEVORFxuIik7Ci0KLQkgICAgYnJlYWs7Ci0JICB9Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKLX0KLQotLyogV3JpdGUgb3V0IGRhdGEgd2hpY2ggd291bGQgbm9ybWFsbHkgYmUgcmVhZCBmcm9tIGEgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19maWxlZGF0YSAoZSwgbGVuZ3RoLCBkYXRhKQotICAgICBGSUxFICplOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLXsKLSAgdW5zaWduZWQgbG9uZyBpOwotCi0gIGZvciAoaSA9IDA7IGkgKyAxNSA8IGxlbmd0aDsgaSArPSAxNikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gJTRseDogIiwgaSk7Ci0gICAgICBmcHJpbnRmIChlLCAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIsCi0JICAgICAgIGRhdGFbaSArIDBdLCBkYXRhW2kgKyAxXSwgZGF0YVtpICsgMl0sIGRhdGFbaSArIDNdLAotCSAgICAgICBkYXRhW2kgKyA0XSwgZGF0YVtpICsgNV0sIGRhdGFbaSArIDZdLCBkYXRhW2kgKyA3XSk7Ci0gICAgICBmcHJpbnRmIChlLCAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotCSAgICAgICBkYXRhW2kgKyAgOF0sIGRhdGFbaSArICA5XSwgZGF0YVtpICsgMTBdLCBkYXRhW2kgKyAxMV0sCi0JICAgICAgIGRhdGFbaSArIDEyXSwgZGF0YVtpICsgMTNdLCBkYXRhW2kgKyAxNF0sIGRhdGFbaSArIDE1XSk7Ci0gICAgfQotCi0gIGlmIChpIDwgbGVuZ3RoKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIvLyAlNGx4OiIsIGkpOwotICAgICAgd2hpbGUgKGkgPCBsZW5ndGgpCi0JewotCSAgZnByaW50ZiAoZSwgIiAlMDJ4IiwgZGF0YVtpXSk7Ci0JICArK2k7Ci0JfQotICAgICAgZnByaW50ZiAoZSwgIlxuIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmVzcmVzLmMgYi9iaW51dGlscy9yZXNyZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4NjBlYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZXNyZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKiByZXNyZXMuYzogcmVhZF9yZXNfZmlsZSBhbmQgd3JpdGVfcmVzX2ZpbGUgaW1wbGVtZW50YXRpb24gZm9yIHdpbmRyZXMuCi0gICBDb3B5cmlnaHQgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQW5kZXJzIE5vcmxhbmRlciA8YW5vcmxhbmRAaGVtMi5wYXNzYWdlbi5zZT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZJWE1FOiBUaGlzIGZpbGUgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaW4gYSBjcm9zcyBjb25maWd1cmF0aW9uLgotICAgSXQgYXNzdW1lcyB0aGF0IGl0IGNhbiB1c2UgZnJlYWQgYW5kIGZ3cml0ZSB0byByZWFkIGFuZCB3cml0ZQotICAgaW50ZWdlcnMuICBJdCBkb2VzIG5vIHN3YXBwaW5nLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotc3RydWN0IHJlc19oZHIKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgZGF0YV9zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgaGVhZGVyX3NpemU7Ci0gIH07Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19kaXJlY3RvcnkKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBpbnQgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfcmVzb3VyY2UKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBpbnQgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2JpbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKikpOwotCi1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfaWQgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19pZCAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfaW5mbyBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19kYXRhIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19oZWFkZXIKLSAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqKSk7Ci0KLXN0YXRpYyBpbnQgcmVhZF9yZXNvdXJjZV9lbnRyeSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCByZWFkX3Jlc19kYXRhIFBBUkFNUyAoKHZvaWQgKiwgc2l6ZV90LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHJlYWRfcmVzX2lkIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQgKikpOwotc3RhdGljIHVuaWNoYXIgKnJlYWRfdW5pc3RyaW5nIFBBUkFNUyAoKGludCAqKSk7Ci1zdGF0aWMgdm9pZCBza2lwX251bGxfcmVzb3VyY2UgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfaWRfc2l6ZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKLXN0YXRpYyB2b2lkIHJlc19hbGlnbl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLSAgcmVzX2FkZF9yZXNvdXJjZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCwgaW50KSk7Ci0KLXZvaWQKLSAgcmVzX2FwcGVuZF9yZXNvdXJjZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgc3RydWN0IHJlc19yZXNvdXJjZSAqLAotCSAgIGludCwgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQpKTsKLQotc3RhdGljIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXMgPSBOVUxMOwotCi1zdGF0aWMgRklMRSAqZnJlczsKLXN0YXRpYyBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogUmVhZCByZXNvdXJjZSBmaWxlICovCi1zdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1yZWFkX3Jlc19maWxlIChmbikKLSAgICAgY29uc3QgY2hhciAqZm47Ci17Ci0gIGZpbGVuYW1lID0gZm47Ci0gIGZyZXMgPSBmb3BlbiAoZmlsZW5hbWUsICJyYiIpOwotICBpZiAoZnJlcyA9PSBOVUxMKQotICAgIGZhdGFsICgiY2FuJ3Qgb3BlbiBgJXMnIGZvciBvdXRwdXQ6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIHNraXBfbnVsbF9yZXNvdXJjZSAoKTsKLQotICB3aGlsZSAocmVhZF9yZXNvdXJjZV9lbnRyeSAoKSkKLSAgICA7Ci0KLSAgZmNsb3NlIChmcmVzKTsKLQotICByZXR1cm4gcmVzb3VyY2VzOwotfQotCi0vKiBXcml0ZSByZXNvdXJjZSBmaWxlICovCi12b2lkCi13cml0ZV9yZXNfZmlsZSAoZm4sIHJlc2RpcikKLSAgICAgY29uc3QgY2hhciAqZm47Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNkaXI7Ci17Ci0gIGludCBsYW5ndWFnZTsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2lnbltdID0KLSAgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotICBsb25nIGZwb3M7Ci0KLSAgZmlsZW5hbWUgPSBmbjsKLQotICBmcmVzID0gZm9wZW4gKGZpbGVuYW1lLCAid2IiKTsKLSAgaWYgKGZyZXMgPT0gTlVMTCkKLSAgICBmYXRhbCAoImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQotICAvKiBXcml0ZSAzMiBiaXQgcmVzb3VyY2Ugc2lnbmF0dXJlICovCi0gIHdyaXRlX3Jlc19kYXRhIChzaWduLCBzaXplb2YgKHNpZ24pLCAxKTsKLQotICAvKiB3cml0ZSByZXNvdXJjZXMgKi8KLQotICBsYW5ndWFnZSA9IC0xOwotICB3cml0ZV9yZXNfZGlyZWN0b3J5IChyZXNkaXIsIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsCi0JCSAgICAgICAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLCAmbGFuZ3VhZ2UsIDEpOwotCi0gIC8qIGVuZCBmaWxlIG9uIERXT1JEIGJvdW5kYXJ5ICovCi0gIGZwb3MgPSBmdGVsbCAoZnJlcyk7Ci0gIGlmIChmcG9zICUgNCkKLSAgICB3cml0ZV9yZXNfZGF0YSAoc2lnbiwgZnBvcyAlIDQsIDEpOwotCi0gIGZjbG9zZSAoZnJlcyk7Ci19Ci0KLS8qIFJlYWQgYSByZXNvdXJjZSBlbnRyeSwgcmV0dXJucyAwIHdoZW4gYWxsIHJlc291cmNlcyBhcmUgcmVhZCAqLwotc3RhdGljIGludAotcmVhZF9yZXNvdXJjZV9lbnRyeSAodm9pZCkKLXsKLSAgc3RydWN0IHJlc19pZCB0eXBlOwotICBzdHJ1Y3QgcmVzX2lkIG5hbWU7Ci0gIHN0cnVjdCByZXNfcmVzX2luZm8gcmVzaW5mbzsKLSAgc3RydWN0IHJlc19oZHIgcmVzaGRyOwotICBsb25nIHZlcnNpb247Ci0gIHZvaWQgKmJ1ZmY7Ci0KLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByZXNfYWxpZ25fZmlsZSAoKTsKLQotICAvKiBSZWFkIGhlYWRlciAqLwotICBpZiAoZnJlYWQgKCZyZXNoZHIsIHNpemVvZiAocmVzaGRyKSwgMSwgZnJlcykgIT0gMSkKLSAgICByZXR1cm4gMDsKLQotICAvKiByZWFkIHJlc291cmNlIHR5cGUgKi8KLSAgcmVhZF9yZXNfaWQgKCZ0eXBlKTsKLSAgLyogcmVhZCByZXNvdXJjZSBpZCAqLwotICByZWFkX3Jlc19pZCAoJm5hbWUpOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotCi0gIC8qIFJlYWQgYWRkaXRpb25hbCByZXNvdXJjZSBoZWFkZXIgKi8KLSAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8udmVyc2lvbiwgc2l6ZW9mIChyZXNpbmZvLnZlcnNpb24pLCAxKTsKLSAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8ubWVtZmxhZ3MsIHNpemVvZiAocmVzaW5mby5tZW1mbGFncyksIDEpOwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby5sYW5ndWFnZSwgc2l6ZW9mIChyZXNpbmZvLmxhbmd1YWdlKSwgMSk7Ci0gIHJlYWRfcmVzX2RhdGEgKCZ2ZXJzaW9uLCBzaXplb2YgKHZlcnNpb24pLCAxKTsKLSAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8uY2hhcmFjdGVyaXN0aWNzLCBzaXplb2YgKHJlc2luZm8uY2hhcmFjdGVyaXN0aWNzKSwgMSk7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0KLSAgLyogQWxsb2NhdGUgYnVmZmVyIGZvciBkYXRhICovCi0gIGJ1ZmYgPSByZXNfYWxsb2MgKHJlc2hkci5kYXRhX3NpemUpOwotICAvKiBSZWFkIGRhdGEgKi8KLSAgcmVhZF9yZXNfZGF0YSAoYnVmZiwgcmVzaGRyLmRhdGFfc2l6ZSwgMSk7Ci0gIC8qIENvbnZlcnQgYmluYXJ5IGRhdGEgdG8gcmVzb3VyY2UgKi8KLSAgciA9IGJpbl90b19yZXMgKHR5cGUsIGJ1ZmYsIHJlc2hkci5kYXRhX3NpemUsIDApOwotICByLT5yZXNfaW5mbyA9IHJlc2luZm87Ci0gIC8qIEFkZCByZXNvdXJjZSB0byByZXNvdXJjZSBkaXJlY3RvcnkgKi8KLSAgcmVzX2FkZF9yZXNvdXJjZSAociwgJnR5cGUsICZuYW1lLCByZXNpbmZvLmxhbmd1YWdlLCAwKTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogd3JpdGUgcmVzb3VyY2UgZGlyZWN0b3J5IHRvIGJpbmFyeSByZXNvdXJjZSBmaWxlICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2RpcmVjdG9yeSAocmQsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBpbnQgKmxhbmd1YWdlOwotICAgICBpbnQgbGV2ZWw7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKnJlOwotCi0gIGZvciAocmUgPSByZC0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGxldmVsKQotCXsKLQljYXNlIDE6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAxLCB0aGUga2V5IG9mIHRoaXMgcmVzb3VyY2UgaXMgdGhlCi0JICAgICB0eXBlLiAgVGhpcyBub3JtYWxseSBkdXBsaWNhdGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlCi0JICAgICBzdG9yZWQgd2l0aCB0aGUgcmVzb3VyY2UgaXRzZWxmLCBidXQgd2UgbmVlZCB0byByZW1lbWJlcgotCSAgICAgdGhlIHR5cGUgaWYgdGhpcyBpcyBhIHVzZXIgZGVmaW5lIHJlc291cmNlIHR5cGUuICAqLwotCSAgdHlwZSA9ICZyZS0+aWQ7Ci0JICBicmVhazsKLQotCWNhc2UgMjoKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDIsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUgbmFtZQotCSAgICAgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbiB0aGUgcmMgcHJpbnRvdXQuICovCi0JICBuYW1lID0gJnJlLT5pZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMywgdGhlbiB0aGlzIGtleSByZXByZXNlbnRzIGEgbGFuZ3VhZ2UuCi0JICAgICBVc2UgaXQgdG8gdXBkYXRlIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAgKi8KLQkgIGlmICghcmUtPmlkLm5hbWVkCi0JICAgICAgJiYgcmUtPmlkLnUuaWQgIT0gKHVuc2lnbmVkIGxvbmcpICpsYW5ndWFnZQotCSAgICAgICYmIChyZS0+aWQudS5pZCAmIDB4ZmZmZikgPT0gcmUtPmlkLnUuaWQpCi0JICAgIHsKLQkgICAgICAqbGFuZ3VhZ2UgPSByZS0+aWQudS5pZDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmUtPnN1YmRpcikKLQl3cml0ZV9yZXNfZGlyZWN0b3J5IChyZS0+dS5kaXIsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCArIDEpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChsZXZlbCA9PSAzKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgbm9ybWFsIGNhc2U6IHRoZSB0aHJlZSBsZXZlbHMgYXJlCi0JICAgICAgICAgVFlQRS9OQU1FL0xBTkdVQUdFLiAgTkFNRSB3aWxsIGhhdmUgYmVlbiBzZXQgYXQgbGV2ZWwKLQkgICAgICAgICAyLCBhbmQgcmVwcmVzZW50cyB0aGUgbmFtZSB0byB1c2UuICBXZSBwcm9iYWJseSBqdXN0Ci0JICAgICAgICAgc2V0IExBTkdVQUdFLCBhbmQgaXQgd2lsbCBwcm9iYWJseSBtYXRjaCB3aGF0IHRoZQotCSAgICAgICAgIHJlc291cmNlIGl0c2VsZiByZWNvcmRzIGlmIGFueXRoaW5nLiAgKi8KLQkgICAgICB3cml0ZV9yZXNfcmVzb3VyY2UgKHR5cGUsIG5hbWUsIHJlLT51LnJlcywgbGFuZ3VhZ2UpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIvLyBSZXNvdXJjZSBhdCB1bmV4cGVjdGVkIGxldmVsICVkXG4iLCBsZXZlbCk7Ci0JICAgICAgd3JpdGVfcmVzX3Jlc291cmNlICh0eXBlLCAoc3RydWN0IHJlc19pZCAqKSBOVUxMLCByZS0+dS5yZXMsCi0JCQkJICBsYW5ndWFnZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfcmVzb3VyY2UgKHR5cGUsIG5hbWUsIHJlcywgbGFuZ3VhZ2UpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgICAgaW50ICpsYW5ndWFnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgcnQ7Ci0KLSAgc3dpdGNoIChyZXMtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgUkVTX1RZUEVfQUNDRUxFUkFUT1I6Ci0gICAgICBydCA9IFJUX0FDQ0VMRVJBVE9SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKLSAgICAgIHJ0ID0gUlRfQklUTUFQOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0NVUlNPUjoKLSAgICAgIHJ0ID0gUlRfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKLSAgICAgIHJ0ID0gUlRfR1JPVVBfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKLSAgICAgIHJ0ID0gUlRfRElBTE9HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6Ci0gICAgICBydCA9IFJUX0ZPTlQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKLSAgICAgIHJ0ID0gUlRfRk9OVERJUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9JQ09OOgotICAgICAgcnQgPSBSVF9JQ09OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046Ci0gICAgICBydCA9IFJUX0dST1VQX0lDT047Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKLSAgICAgIHJ0ID0gUlRfTUVOVTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9NRVNTQUdFVEFCTEU6Ci0gICAgICBydCA9IFJUX01FU1NBR0VUQUJMRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0gICAgICBydCA9IFJUX1JDREFUQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLSAgICAgIHJ0ID0gUlRfU1RSSU5HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1VTRVJEQVRBOgotICAgICAgcnQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1ZFUlNJT05JTkZPOgotICAgICAgcnQgPSBSVF9WRVJTSU9OOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChydCAhPSAwCi0gICAgICAmJiB0eXBlICE9IE5VTEwKLSAgICAgICYmICh0eXBlLT5uYW1lZCB8fCB0eXBlLT51LmlkICE9ICh1bnNpZ25lZCBsb25nKSBydCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLy8gVW5leHBlY3RlZCByZXNvdXJjZSB0eXBlIG1pc21hdGNoOiAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoc3RkZXJyLCAqdHlwZSwgMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgIT0gJWQiLCBydCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgd3JpdGVfcmVzX2JpbiAocmVzLCB0eXBlLCBuYW1lLCAmcmVzLT5yZXNfaW5mbyk7Ci0gIHJldHVybjsKLX0KLQotLyogV3JpdGUgYSByZXNvdXJjZSBpbiBiaW5hcnkgcmVzb3VyY2UgZm9ybWF0ICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2JpbiAocmVzLCB0eXBlLCBuYW1lLCByZXNpbmZvKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci17Ci0gIHVuc2lnbmVkIGxvbmcgZGF0YXNpemUgPSAwOwotICBjb25zdCBzdHJ1Y3QgYmluZGF0YSAqYmluX3JlcCwgKmRhdGE7Ci0KLSAgYmluX3JlcCA9IHJlc190b19iaW4gKHJlcywgMCk7Ci0gIGZvciAoZGF0YSA9IGJpbl9yZXA7IGRhdGEgIT0gTlVMTDsgZGF0YSA9IGRhdGEtPm5leHQpCi0gICAgZGF0YXNpemUgKz0gZGF0YS0+bGVuZ3RoOwotCi0gIHdyaXRlX3Jlc19oZWFkZXIgKGRhdGFzaXplLCB0eXBlLCBuYW1lLCByZXNpbmZvKTsKLQotICBmb3IgKGRhdGEgPSBiaW5fcmVwOyBkYXRhICE9IE5VTEw7IGRhdGEgPSBkYXRhLT5uZXh0KQotICAgIHdyaXRlX3Jlc19kYXRhIChkYXRhLT5kYXRhLCBkYXRhLT5sZW5ndGgsIDEpOwotfQotCi0vKiBHZXQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBzdG9yZSBhbiBpZCBpbiBiaW5hcnkgZm9ybWF0ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X2lkX3NpemUgKGlkKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZDsKLXsKLSAgaWYgKGlkLT5uYW1lZCkKLSAgICByZXR1cm4gc2l6ZW9mICh1bmljaGFyKSAqIChpZC0+dS5uLmxlbmd0aCArIDEpOwotICBlbHNlCi0gICAgcmV0dXJuIHNpemVvZiAodW5pY2hhcikgKiAyOwotfQotCi0vKiBXcml0ZSBhIHJlc291cmNlIGhlYWRlciAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19oZWFkZXIgKGRhdGFzaXplLCB0eXBlLCBuYW1lLCByZXNpbmZvKQotICAgICB1bnNpZ25lZCBsb25nIGRhdGFzaXplOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotewotICBzdHJ1Y3QgcmVzX2hkciByZXNoZHI7Ci0gIHJlc2hkci5kYXRhX3NpemUgPSBkYXRhc2l6ZTsKLSAgcmVzaGRyLmhlYWRlcl9zaXplID0gMjQgKyBnZXRfaWRfc2l6ZSAodHlwZSkgKyBnZXRfaWRfc2l6ZSAobmFtZSk7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmcmVzaGRyLCBzaXplb2YgKHJlc2hkciksIDEpOwotICB3cml0ZV9yZXNfaWQgKHR5cGUpOwotICB3cml0ZV9yZXNfaWQgKG5hbWUpOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotCi0gIHdyaXRlX3Jlc19pbmZvIChyZXNpbmZvKTsKLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci19Ci0KLQotLyogV3JpdGUgZGF0YSB0byBmaWxlLCBhYm9ydCBvbiBmYWlsdXJlICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2RhdGEgKGRhdGEsIHNpemUsIGNvdW50KQotICAgICBjb25zdCB2b2lkICpkYXRhOwotICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgaW50IGNvdW50OwotewotICBpZiAoZndyaXRlIChkYXRhLCBzaXplLCBjb3VudCwgZnJlcykgIT0gKHNpemVfdCkgY291bnQpCi0gICAgZmF0YWwgKCIlczogY291bGQgbm90IHdyaXRlIHRvIGZpbGUiLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIFJlYWQgZGF0YSBmcm9tIGZpbGUsIGFib3J0IG9uIGZhaWx1cmUgKi8KLXN0YXRpYyB2b2lkCi1yZWFkX3Jlc19kYXRhIChkYXRhLCBzaXplLCBjb3VudCkKLSAgICAgdm9pZCAqZGF0YTsKLSAgICAgc2l6ZV90IHNpemU7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaWYgKGZyZWFkIChkYXRhLCBzaXplLCBjb3VudCwgZnJlcykgIT0gKHNpemVfdCkgY291bnQpCi0gICAgZmF0YWwgKCIlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSIsIGZpbGVuYW1lKTsKLX0KLQotLyogV3JpdGUgYSByZXNvdXJjZSBpZCAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19pZCAoaWQpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkOwotewotICBpZiAoaWQtPm5hbWVkKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuID0gaWQtPnUubi5sZW5ndGg7Ci0gICAgICB1bmljaGFyIG51bGxfdGVybSA9IDA7Ci0gICAgICB3cml0ZV9yZXNfZGF0YSAoaWQtPnUubi5uYW1lLCBsZW4gKiBzaXplb2YgKHVuaWNoYXIpLCAxKTsKLSAgICAgIHdyaXRlX3Jlc19kYXRhICgmbnVsbF90ZXJtLCBzaXplb2YgKG51bGxfdGVybSksIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGkgPSAweEZGRkY7Ci0gICAgICB3cml0ZV9yZXNfZGF0YSAoJmksIHNpemVvZiAoaSksIDEpOwotICAgICAgaSA9IGlkLT51LmlkOwotICAgICAgd3JpdGVfcmVzX2RhdGEgKCZpLCBzaXplb2YgKGkpLCAxKTsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIHJlc291cmNlIGluZm8gKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfaW5mbyAoaW5mbykKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqaW5mbzsKLXsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT52ZXJzaW9uLCBzaXplb2YgKGluZm8tPnZlcnNpb24pLCAxKTsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT5tZW1mbGFncywgc2l6ZW9mIChpbmZvLT5tZW1mbGFncyksIDEpOwotICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPmxhbmd1YWdlLCBzaXplb2YgKGluZm8tPmxhbmd1YWdlKSwgMSk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+dmVyc2lvbiwgc2l6ZW9mIChpbmZvLT52ZXJzaW9uKSwgMSk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+Y2hhcmFjdGVyaXN0aWNzLCBzaXplb2YgKGluZm8tPmNoYXJhY3RlcmlzdGljcyksIDEpOwotfQotCi0vKiByZWFkIGEgcmVzb3VyY2UgaWRlbnRpZmllciAqLwotdm9pZCAKLXJlYWRfcmVzX2lkIChpZCkKLSAgICAgc3RydWN0IHJlc19pZCAqaWQ7Ci17Ci0gIHVuc2lnbmVkIHNob3J0IG9yZDsKLSAgdW5pY2hhciAqaWRfcyA9IE5VTEw7Ci0gIGludCBsZW47Ci0KLSAgcmVhZF9yZXNfZGF0YSAoJm9yZCwgc2l6ZW9mIChvcmQpLCAxKTsKLSAgaWYgKG9yZCA9PSAweEZGRkYpCQkvKiBhbiBvcmRpbmFsIGlkICovCi0gICAgewotICAgICAgcmVhZF9yZXNfZGF0YSAoJm9yZCwgc2l6ZW9mIChvcmQpLCAxKTsKLSAgICAgIGlkLT5uYW1lZCA9IDA7Ci0gICAgICBpZC0+dS5pZCA9IG9yZDsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBuYW1lZCBpZCAqLwotICAgIHsKLSAgICAgIGlmIChmc2VlayAoZnJlcywgLXNpemVvZiAob3JkKSwgU0VFS19DVVIpICE9IDApCi0JZmF0YWwgKCIlczogJXM6IGNvdWxkIG5vdCBzZWVrIGluIGZpbGUiLCBwcm9ncmFtX25hbWUsIGZpbGVuYW1lKTsKLSAgICAgIGlkX3MgPSByZWFkX3VuaXN0cmluZyAoJmxlbik7Ci0gICAgICBpZC0+bmFtZWQgPSAxOwotICAgICAgaWQtPnUubi5sZW5ndGggPSBsZW47Ci0gICAgICBpZC0+dS5uLm5hbWUgPSBpZF9zOwotICAgIH0KLX0KLQotLyogUmVhZCBhIG51bGwgdGVybWluYXRlZCBVTklDT0RFIHN0cmluZyAqLwotc3RhdGljIHVuaWNoYXIgKgotcmVhZF91bmlzdHJpbmcgKGxlbikKLSAgICAgaW50ICpsZW47Ci17Ci0gIHVuaWNoYXIgKnM7Ci0gIHVuaWNoYXIgYzsKLSAgdW5pY2hhciAqcDsKLSAgaW50IGw7Ci0KLSAgKmxlbiA9IDA7Ci0gIGwgPSAwOwotCi0gIC8qIHRoZXJlIGFyZSBoYXJkbHkgYW55IG5hbWVzIGxvbmdlciB0aGFuIDI1NiBjaGFyYWN0ZXJzICovCi0gIHAgPSBzID0gKHVuaWNoYXIgKikgeG1hbGxvYyAoc2l6ZW9mICh1bmljaGFyKSAqIDI1Nik7Ci0gIGRvCi0gICAgewotICAgICAgcmVhZF9yZXNfZGF0YSAoJmMsIHNpemVvZiAoYyksIDEpOwotICAgICAgKnArKyA9IGM7Ci0gICAgICBpZiAoYyAhPSAwKQotCWwrKzsKLSAgICB9Ci0gIHdoaWxlIChjICE9IDApOwotICAqbGVuID0gbDsKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIGFsaWduIGZpbGUgb24gRFdPUkQgYm91bmRhcnkgKi8KLXN0YXRpYyB2b2lkCi1yZXNfYWxpZ25fZmlsZSAodm9pZCkKLXsKLSAgaWYgKGZzZWVrIChmcmVzLCBmdGVsbCAoZnJlcykgJSA0LCBTRUVLX0NVUikgIT0gMCkKLSAgICBmYXRhbCAoIiVzOiAlczogdW5hYmxlIHRvIGFsaWduIGZpbGUiLCBwcm9ncmFtX25hbWUsIGZpbGVuYW1lKTsKLX0KLQotLyogQ2hlY2sgaWYgZmlsZSBpcyBhIHdpbjMyIGJpbmFyeSByZXNvdXJjZSBmaWxlLCBpZiBzbwotICAgc2tpcCBwYXN0IHRoZSBudWxsIHJlc291cmNlLiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgb24KLSAgIGVycm9yLgotICovCi1zdGF0aWMgdm9pZAotc2tpcF9udWxsX3Jlc291cmNlICh2b2lkKQotewotICBzdHJ1Y3QgcmVzX2hkciByZXNoZHIgPQotICB7MCwgMH07Ci0gIHJlYWRfcmVzX2RhdGEgKCZyZXNoZHIsIHNpemVvZiAocmVzaGRyKSwgMSk7Ci0gIGlmICgocmVzaGRyLmRhdGFfc2l6ZSAhPSAwKSB8fCAocmVzaGRyLmhlYWRlcl9zaXplICE9IDB4MjApKQotICAgIGdvdG8gc2tpcF9lcnI7Ci0KLSAgLyogU3VidHJhY3Qgc2l6ZSBvZiBIZWFkZXJTaXplIGFuZCBEYXRhU2l6ZSAqLwotICBpZiAoZnNlZWsgKGZyZXMsIHJlc2hkci5oZWFkZXJfc2l6ZSAtIDgsIFNFRUtfQ1VSKSAhPSAwKQotICAgIGdvdG8gc2tpcF9lcnI7Ci0KLSAgcmV0dXJuOwotCi1za2lwX2VycjoKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiBOb3QgYSB2YWxpZCBXSU4zMiByZXNvdXJjZSBmaWxlXG4iLCBwcm9ncmFtX25hbWUsCi0JICAgZmlsZW5hbWUpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLS8qIEFkZCBhIHJlc291cmNlIHRvIHJlc291cmNlIGRpcmVjdG9yeSAqLwotdm9pZAotcmVzX2FkZF9yZXNvdXJjZSAociwgdHlwZSwgaWQsIGxhbmd1YWdlLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWQ7Ci0gICAgIGludCBsYW5ndWFnZTsKLSAgICAgaW50IGR1cG9rOwotewotICBzdHJ1Y3QgcmVzX2lkIGFbM107Ci0KLSAgYVswXSA9ICp0eXBlOwotICBhWzFdID0gKmlkOwotICBhWzJdLm5hbWVkID0gMDsKLSAgYVsyXS51LmlkID0gbGFuZ3VhZ2U7Ci0gIHJlc19hcHBlbmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIHIsIDMsIGEsIGR1cG9rKTsKLX0KLQotLyogQXBwZW5kIGEgcmVzb3VyY2UgdG8gcmVzb3VyY2UgZGlyZWN0b3J5LgotICAgVGhpcyBpcyBqdXN0IGNvcGllZCBmcm9tIGRlZmluZV9yZXNvdXJjZQotICAgYW5kIG1vZGlmaWVkIHRvIGFkZCBhbiBleGlzdGluZyByZXNvdXJjZS4KLSAqLwotdm9pZAotcmVzX2FwcGVuZF9yZXNvdXJjZSAocmVzb3VyY2VzLCByZXNvdXJjZSwgY2lkcywgaWRzLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7Ci0gICAgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlc291cmNlOwotICAgICBpbnQgY2lkczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfZW50cnkgKnJlID0gTlVMTDsKLSAgaW50IGk7Ci0KLSAgYXNzZXJ0IChjaWRzID4gMCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjaWRzOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHJlc19lbnRyeSAqKnBwOwotCi0gICAgICBpZiAoKnJlc291cmNlcyA9PSBOVUxMKQotCXsKLQkgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWV2YWw7Ci0KLQkgIC8qIFVzZSB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGV2ZXJ5IHJlc291cmNlIGNyZWF0ZWQgaW4gYQotCSAgICAgc2luZ2xlIHJ1bi4gICovCi0JICBpZiAodGltZXZhbCA9PSAwKQotCSAgICB0aW1ldmFsID0gdGltZSAoTlVMTCk7Ci0KLQkgICpyZXNvdXJjZXMgPSAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopCi0JCQlyZXNfYWxsb2MgKHNpemVvZiAqKnJlc291cmNlcykpOwotCSAgKCpyZXNvdXJjZXMpLT5jaGFyYWN0ZXJpc3RpY3MgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT50aW1lID0gdGltZXZhbDsKLQkgICgqcmVzb3VyY2VzKS0+bWFqb3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5taW5vciA9IDA7Ci0JICAoKnJlc291cmNlcyktPmVudHJpZXMgPSBOVUxMOwotCX0KLQotICAgICAgZm9yIChwcCA9ICYoKnJlc291cmNlcyktPmVudHJpZXM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQlpZiAocmVzX2lkX2NtcCAoKCpwcCktPmlkLCBpZHNbaV0pID09IDApCi0JICBicmVhazsKLQotICAgICAgaWYgKCpwcCAhPSBOVUxMKQotCXJlID0gKnBwOwotICAgICAgZWxzZQotCXsKLQkgIHJlID0gKHN0cnVjdCByZXNfZW50cnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJlKTsKLQkgIHJlLT5uZXh0ID0gTlVMTDsKLQkgIHJlLT5pZCA9IGlkc1tpXTsKLQkgIGlmICgoaSArIDEpIDwgY2lkcykKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAxOwotCSAgICAgIHJlLT51LmRpciA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAwOwotCSAgICAgIHJlLT51LnJlcyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnBwID0gcmU7Ci0JfQotCi0gICAgICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JewotCSAgaWYgKCFyZS0+c3ViZGlyKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBpLCBpZHMpOwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIpOwotCSAgICAgIHhleGl0ICgxKTsKLQkgICAgfQotCi0JICByZXNvdXJjZXMgPSAmcmUtPnUuZGlyOwotCX0KLSAgICB9Ci0KLSAgaWYgKHJlLT5zdWJkaXIpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0gICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGNpZHMsIGlkcyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6IGV4cGVjdGVkIHRvIGJlIGEgbGVhZlxuIik7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChyZS0+dS5yZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZHVwb2spCi0JcmV0dXJuOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogd2FybmluZzogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZHVwbGljYXRlIHZhbHVlXG4iKTsKLSAgICB9Ci0KLSAgcmUtPnUucmVzID0gcmVzb3VyY2U7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zYW5pdHkuc2ggYi9iaW51dGlscy9zYW5pdHkuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0MmNhYmYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc2FuaXR5LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyEvYmluL3NoCi0jIyMgcXVpY2sgc2FuaXR5IHRlc3QgZm9yIHRoZSBiaW51dGlscy4KLSMjIwotIyMjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBhbmQgaXMgbWFpbnRhaW5lZCBieSBLLiBSaWNoYXJkIFBpeGxleSwKLSMjIyByaWNoQGN5Z251cy5jb20uCi0KLSMjIyBmYWlsIG9uIGVycm9ycwotc2V0IC1lCi0KLSMjIyBmaXJzdCBhcmcgaXMgZGlyZWN0b3J5IGluIHdoaWNoIGJpbmFyaWVzIHRvIGJlIHRlc3RlZCByZXNpZGUuCi1jYXNlICIkMSIgaW4KLSIiKSBCSU49LiA7OwotKikgIEJJTj0iJDEiIDs7Ci1lc2FjCi0KLSMjIyBzaXplCi1mb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgc3RyaXAgcmFubGliIDsgZG8KLQkke0JJTn0vc2l6ZSAke0JJTn0vJGkgPiAvZGV2L251bGwKLWRvbmUKLQotIyMjIG9iamR1bXAKLWZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciBzdHJpcCByYW5saWIgOyBkbwotCSR7QklOfS9vYmpkdW1wIC1haGlmZHJ0eHNsICR7QklOfS8kaSA+IC9kZXYvbnVsbAotZG9uZQotCi0jIyMgbm0KLWZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciBzdHJpcCByYW5saWIgOyBkbwotCSR7QklOfS9ubSAke0JJTn0vJGkgPiAvZGV2L251bGwKLWRvbmUKLQotIyMjIHN0cmlwCi1UTVBESVI9Li9iaW51dGlscy0kJAotbWtkaXIgJHtUTVBESVJ9Ci0KLWNwICR7QklOfS9zdHJpcCAke1RNUERJUn0vc3RyaXAKLQotZm9yIGkgaW4gc2l6ZSBvYmpkdW1wIG5tIGFyIHJhbmxpYiA7IGRvCi0JY3AgJHtCSU59LyRpICR7VE1QRElSfS8kaQotCSR7QklOfS9zdHJpcCAke1RNUERJUn0vJGkKLQljcCAke0JJTn0vJGkgJHtUTVBESVJ9LyRpCi0JJHtUTVBESVJ9L3N0cmlwICR7VE1QRElSfS8kaQotZG9uZQotCi0jIyMgYXIKLQotIyMjIHJhbmxpYgotCi1ybSAtcmYgJHtUTVBESVJ9Ci0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvYmludXRpbHMvc2l6ZS4xIGIvYmludXRpbHMvc2l6ZS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE5YmQyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3NpemUuMQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggc2l6ZSAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1zaXplIFwtIGxpc3Qgc2VjdGlvbiBzaXplcyBhbmQgdG90YWwgc2l6ZS4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIHNpemUKLS5SQiAiW1x8IiBcLUEgXHx8XHwgXC1CIFx8fFx8IFxjCi0uQkkgIlwtXC1mb3JtYXQ9IiBjb21wYXRpYmlsaXR5XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIgCi0uUkIgIltcfCIgXC1kIFx8fFx8IFwtbyBcfHxcfCBcLXhcYwotXHx8XHxcYwotLkJJICJcLVwtcmFkaXg9IiBudW1iZXJcYwotXCZcfF0KLS5SQiAiW1x8IiBcYwotLkJJICJcLVwtdGFyZ2V0PSIgYmZkbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtViBcfHxcfCBcLVwtdmVyc2lvbiAiXHxdIiAgCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLVRoZSBHTlUgXGMKLS5CIHNpemVcYwotXCYgdXRpbGl0eSBsaXN0cyB0aGUgc2VjdGlvbiBzaXplc1woZW1cJmFuZCB0aGUgdG90YWwKLXNpemVcKGVtXCZmb3IgZWFjaCBvZiB0aGUgb2JqZWN0IGZpbGVzCi0uSSBvYmpmaWxlCi1pbiBpdHMgYXJndW1lbnQgbGlzdC4KLUJ5IGRlZmF1bHQsIG9uZSBsaW5lIG9mIG91dHB1dCBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggb2JqZWN0IGZpbGUgb3IgZWFjaAotbW9kdWxlIGluIGFuIGFyY2hpdmUuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtQQotLlRQCi0uQiBcLUIKLS5UUAotLkJJICJcLVwtZm9ybWF0ICIgImNvbXBhdGliaWxpdHkiCi1Vc2luZyBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBjaG9vc2Ugd2hldGhlciB0aGUgb3V0cHV0IGZyb20gR05VCi1cYwotLkIgc2l6ZVxjCi1cJiByZXNlbWJsZXMgb3V0cHV0IGZyb20gU3lzdGVtIFYgXGMKLS5CIHNpemVcYwotXCYgKHVzaW5nIGBcfFxjCi0uQiBcLUFcYwotXHwnLAotb3IgYFx8XGMKLS5CIFwtXC1mb3JtYXQ9c3lzdlxjCi1cfCcpLCBvciBCZXJrZWxleSBcYwotLkIgc2l6ZVxjCi1cJiAodXNpbmcgYFx8XGMKLS5CIFwtQlxjCi1cfCcsIG9yCi1gXHxcYwotLkIgXC1cLWZvcm1hdD1iZXJrZWxleVxjCi1cfCcpLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG9uZS1saW5lIGZvcm1hdCBzaW1pbGFyIHRvCi1CZXJrZWxleSdzLiAgCi0KLS5UUAotLkIgXC1cLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIGFjY2VwdGFibGUgYXJndW1lbnRzIGFuZCBvcHRpb25zLgotCi0uVFAKLS5CIFwtZAotLlRQCi0uQiBcLW8KLS5UUAotLkIgXC14Ci0uVFAKLS5CSSAiXC1cLXJhZGl4ICIgIm51bWJlciIKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUgc2l6ZSBvZiBlYWNoCi1zZWN0aW9uIGlzIGdpdmVuIGluIGRlY2ltYWwgKGBcfFxjCi0uQiBcLWRcYwotXHwnLCBvciBgXHxcYwotLkIgXC1cLXJhZGl4IDEwXGMKLVx8Jyk7IG9jdGFsCi0oYFx8XGMKLS5CIFwtb1xjCi1cfCcsIG9yIGBcfFxjCi0uQiBcLVwtcmFkaXggOFxjCi1cfCcpOyBvciBoZXhhZGVjaW1hbCAoYFx8XGMKLS5CIFwteFxjCi1cfCcsIG9yCi1gXHxcYwotLkIgXC1cLXJhZGl4IDE2XGMKLVx8JykuICBJbiBgXHxcYwotLkIgXC1cLXJhZGl4IFxjCi0uSSBudW1iZXJcYwotXCZcYwotXHwnLCBvbmx5IHRoZSB0aHJlZQotdmFsdWVzICg4LCAxMCwgMTYpIGFyZSBzdXBwb3J0ZWQuICBUaGUgdG90YWwgc2l6ZSBpcyBhbHdheXMgZ2l2ZW4gaW4gdHdvCi1yYWRpY2VzOyBkZWNpbWFsIGFuZCBoZXhhZGVjaW1hbCBmb3IgYFx8XGMKLS5CIFwtZFxjCi1cfCcgb3IgYFx8XGMKLS5CIFwteFxjCi1cfCcgb3V0cHV0LCBvcgotb2N0YWwgYW5kIGhleGFkZWNpbWFsIGlmIHlvdSdyZSB1c2luZyBgXHxcYwotLkIgXC1vXGMKLVx8Jy4KLQotLlRQCi0uQkkgIlwtXC10YXJnZXQgIiAiYmZkbmFtZSIKLVlvdSBjYW4gc3BlY2lmeSBhIHBhcnRpY3VsYXIgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciBcYwotLkkgb2JqZmlsZVxjCi1cJiBhcwotXGMKLS5JIGJmZG5hbWVcYwotXCYuICBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBcYwotLkkgc2l6ZVxjCi1cJiBjYW4KLWF1dG9tYXRpY2FsbHkgcmVjb2duaXplIG1hbnkgZm9ybWF0cy4gICBTZWUgCi0uQlIgb2JqZHVtcCAoIDEgKSAKLWZvciBpbmZvcm1hdGlvbgotb24gbGlzdGluZyBhdmFpbGFibGUgZm9ybWF0cy4KLQotLlRQCi0uQiBcLVYKLS5UUAotLkIgXC1cLXZlcnNpb24KLURpc3BsYXkgdmVyc2lvbiBudW1iZXIgaW5mb3JtYXRpb24gb24gXGMKLS5CIHNpemVcYwotXCYgaXRzZWxmLgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQlIgaW5mbyA7Ci0uSVIgIlRoZSBHTlUgQmluYXJ5IFV0aWxpdGllcyIgLAotIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgYXIgIigiIDEgIiksIgotLkJSIG9iamR1bXAgKCAxICkuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3NpemUuYyBiL2JpbnV0aWxzL3NpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzODUwYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zaXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLyogc2l6ZS5jIC0tIHJlcG9ydCBzaXplIG9mIHZhcmlvdXMgc2VjdGlvbnMgb2YgYW4gZXhlY3V0YWJsZSBmaWxlLgotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogRXh0ZW5zaW9ucy9pbmNvbXBhdGliaWxpdGllczoKLSAgIG8gLSBCU0Qgb3V0cHV0IGhhcyBmaWxlbmFtZXMgYXQgdGhlIGVuZC4KLSAgIG8gLSBCU0Qgb3V0cHV0IGNhbiBhcHBlYXIgaW4gZGlmZmVyZW50IHJhZGljaWVzLgotICAgbyAtIFN5c1Ygb3V0cHV0IGhhcyBsZXNzIHJlZHVuZGFudCB3aGl0ZXNwYWNlLiAgRmlsZW5hbWUgY29tZXMgYXQgZW5kLgotICAgbyAtIFN5c1Ygb3V0cHV0IGRvZXNuJ3Qgc2hvdyBWTUEgd2hpY2ggaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBQTUEuCi0gICBvIC0gV2UgYWxzbyBoYW5kbGUgY29yZSBmaWxlcy4KLSAgIG8gLSBXZSBhbHNvIGhhbmRsZSBhcmNoaXZlcy4KLSAgIElmIHlvdSB3cml0ZSBzaGVsbCBzY3JpcHRzIHdoaWNoIG1hbmlwdWxhdGUgdGhpcyBpbmZvIHRoZW4geW91IG1heSBiZQotICAgb3V0IG9mIGx1Y2s7IHRoZXJlJ3Mgbm8gLS1jb21wYXRpYmlsaXR5IG9yIC0tcGVkYW50aWMgb3B0aW9uLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZuZGVmIEJTRF9ERUZBVUxUCi0jZGVmaW5lIEJTRF9ERUZBVUxUIDEKLSNlbmRpZgotCi0vKiBQcm9ncmFtIG9wdGlvbnMuICAqLwotCi1lbnVtCi0gIHsKLSAgICBkZWNpbWFsLCBvY3RhbCwgaGV4Ci0gIH0gcmFkaXggPSBkZWNpbWFsOwotaW50IGJlcmtlbGV5X2Zvcm1hdCA9IEJTRF9ERUZBVUxUOwkvKiAwIG1lYW5zIHVzZSBBVCZULXN0eWxlIG91dHB1dC4gICovCi1pbnQgc2hvd192ZXJzaW9uID0gMDsKLWludCBzaG93X2hlbHAgPSAwOwotCi0vKiBQcm9ncmFtIGV4aXQgc3RhdHVzLiAgKi8KLWludCByZXR1cm5fY29kZSA9IDA7Ci0KLXN0YXRpYyBjaGFyICp0YXJnZXQgPSBOVUxMOwotCi0vKiBTdGF0aWMgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5X2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLXN0YXRpYyB2b2lkIGRpc3BsYXlfYmZkIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5X2FyY2hpdmUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc2l6ZV9udW1iZXIgUEFSQU1TICgoYmZkX3NpemVfdHlwZSkpOwotI2lmIDAKLXN0YXRpYyB2b2lkIGxwcmludF9udW1iZXIgUEFSQU1TICgoaW50LCBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIHJwcmludF9udW1iZXIgUEFSQU1TICgoaW50LCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9iZXJrZWxleV9mb3JtYXQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHN5c3ZfaW50ZXJuYWxfc2l6ZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgc3lzdl9pbnRlcm5hbF9wcmludGVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHByaW50X3N5c3ZfZm9ybWF0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zaXplcyBQQVJBTVMgKChiZmQgKiBmaWxlKSk7Ci1zdGF0aWMgdm9pZCBiZXJrZWxleV9zdW0gUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUikpOwotDAotc3RhdGljIHZvaWQKLXVzYWdlIChzdHJlYW0sIHN0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLUFCZG94Vl0gWy0tZm9ybWF0PWJlcmtlbGV5fHN5c3ZdIFstLXJhZGl4PTh8MTB8MTZdXG5cCi0gICAgICAgWy0tdGFyZ2V0PWJmZG5hbWVdIFstLXZlcnNpb25dIFstLWhlbHBdIFtmaWxlLi4uXVxuIiksIHByb2dyYW1fbmFtZSk7Ci0jaWYgQlNEX0RFRkFVTFQKLSAgZnB1dHMgKF8oImRlZmF1bHQgaXMgLS1mb3JtYXQ9YmVya2VsZXlcbiIpLCBzdHJlYW0pOwotI2Vsc2UKLSAgZnB1dHMgKF8oImRlZmF1bHQgaXMgLS1mb3JtYXQ9c3lzdlxuIiksIHN0cmVhbSk7Ci0jZW5kaWYKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMH0sCi0gIHsicmFkaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMjAxfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMjAyfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsICZzaG93X3ZlcnNpb24sIDF9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgJnNob3dfaGVscCwgMX0sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgdGVtcDsKLSAgaW50IGM7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiQUJWZG94IiwgbG9uZ19vcHRpb25zLAotCQkJICAgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHN3aXRjaCAoYykKLSAgICAgIHsKLSAgICAgIGNhc2UgMjAwOgkJLyogLS1mb3JtYXQgKi8KLQlzd2l0Y2ggKCpvcHRhcmcpCi0JICB7Ci0JICBjYXNlICdCJzoKLQkgIGNhc2UgJ2InOgotCSAgICBiZXJrZWxleV9mb3JtYXQgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1MnOgotCSAgY2FzZSAncyc6Ci0JICAgIGJlcmtlbGV5X2Zvcm1hdCA9IDA7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnZhbGlkIGFyZ3VtZW50IHRvIC0tZm9ybWF0OiAlc1xuIiksIG9wdGFyZyk7Ci0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlIDIwMjoJCS8qIC0tdGFyZ2V0ICovCi0JdGFyZ2V0ID0gb3B0YXJnOwotCWJyZWFrOwotCi0gICAgICBjYXNlIDIwMToJCS8qIC0tcmFkaXggKi8KLSNpZmRlZiBBTlNJX0xJQlJBUklFUwotCXRlbXAgPSBzdHJ0b2wgKG9wdGFyZywgTlVMTCwgMTApOwotI2Vsc2UKLQl0ZW1wID0gYXRvbCAob3B0YXJnKTsKLSNlbmRpZgotCXN3aXRjaCAodGVtcCkKLQkgIHsKLQkgIGNhc2UgMTA6Ci0JICAgIHJhZGl4ID0gZGVjaW1hbDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDg6Ci0JICAgIHJhZGl4ID0gb2N0YWw7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxNjoKLQkgICAgcmFkaXggPSBoZXg7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgcHJpbnRmIChfKCJJbnZhbGlkIHJhZGl4OiAlc1xuIiksIG9wdGFyZyk7Ci0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlICdBJzoKLQliZXJrZWxleV9mb3JtYXQgPSAwOwotCWJyZWFrOwotICAgICAgY2FzZSAnQic6Ci0JYmVya2VsZXlfZm9ybWF0ID0gMTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ1YnOgotCXNob3dfdmVyc2lvbiA9IDE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdkJzoKLQlyYWRpeCA9IGRlY2ltYWw7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICd4JzoKLQlyYWRpeCA9IGhleDsKLQlicmVhazsKLSAgICAgIGNhc2UgJ28nOgotCXJhZGl4ID0gb2N0YWw7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDA6Ci0JYnJlYWs7Ci0gICAgICBjYXNlICc/JzoKLQl1c2FnZSAoc3RkZXJyLCAxKTsKLSAgICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJzaXplIik7Ci0gIGlmIChzaG93X2hlbHApCi0gICAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0KLSAgaWYgKG9wdGluZCA9PSBhcmdjKQotICAgIGRpc3BsYXlfZmlsZSAoImEub3V0Iik7Ci0gIGVsc2UKLSAgICBmb3IgKDsgb3B0aW5kIDwgYXJnYzspCi0gICAgICBkaXNwbGF5X2ZpbGUgKGFyZ3Zbb3B0aW5kKytdKTsKLQotICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci0MCi0vKiBEaXNwbGF5IHN0YXRzIG9uIGZpbGUgb3IgYXJjaGl2ZSBtZW1iZXIgQUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2JmZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9hcmNoaXZlKSkKLSAgICAvKiBBbiBhcmNoaXZlIHdpdGhpbiBhbiBhcmNoaXZlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBwcmludF9zaXplcyAoYWJmZCk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0gICAgICBmcmVlIChtYXRjaGluZyk7Ci0gICAgICByZXR1cm5fY29kZSA9IDM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9jb3JlLCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIENPTlNUIGNoYXIgKmNvcmVfY21kOwotCi0gICAgICBwcmludF9zaXplcyAoYWJmZCk7Ci0gICAgICBmcHV0cyAoIiAoY29yZSBmaWxlIiwgc3Rkb3V0KTsKLQotICAgICAgY29yZV9jbWQgPSBiZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCk7Ci0gICAgICBpZiAoY29yZV9jbWQpCi0JcHJpbnRmICgiIGludm9rZWQgYXMgJXMiLCBjb3JlX2NtZCk7Ci0KLSAgICAgIHB1dHMgKCIpXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLSAgICB7Ci0gICAgICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLSAgICAgIGZyZWUgKG1hdGNoaW5nKTsKLSAgICB9Ci0KLSAgcmV0dXJuX2NvZGUgPSAzOwotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9hcmNoaXZlIChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIGJmZCAqYXJmaWxlID0gKGJmZCAqKSBOVUxMOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotICAgICAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLSAgICAgIGlmIChhcmZpbGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcykKLQkgICAgewotCSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotCSAgICAgIHJldHVybl9jb2RlID0gMjsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBkaXNwbGF5X2JmZCAoYXJmaWxlKTsKLSAgICAgIC8qIERvbid0IGNsb3NlIHRoZSBhcmNoaXZlIGVsZW1lbnRzOyB3ZSBuZWVkIHRoZW0gZm9yIG5leHRfYXJjaGl2ZSAqLwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBiZmQgKmZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuX2NvZGUgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpID09IHRydWUpCi0gICAgZGlzcGxheV9hcmNoaXZlIChmaWxlKTsKLSAgZWxzZQotICAgIGRpc3BsYXlfYmZkIChmaWxlKTsKLQotICBpZiAoYmZkX2Nsb3NlIChmaWxlKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybl9jb2RlID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0MCi0vKiBUaGlzIGlzIHdoYXQgbGV4aWNhbCBmdW5jdGlvbnMgYXJlIGZvci4gICovCi0KLXN0YXRpYyBpbnQKLXNpemVfbnVtYmVyIChudW0pCi0gICAgIGJmZF9zaXplX3R5cGUgbnVtOwotewotICBjaGFyIGJ1ZmZlcls0MF07Ci0gIHNwcmludGYgKGJ1ZmZlciwKLQkgICAocmFkaXggPT0gZGVjaW1hbCA/ICIlbHUiIDoKLQkgICAoKHJhZGl4ID09IG9jdGFsKSA/ICIwJWxvIiA6ICIweCVseCIpKSwKLQkgICAodW5zaWduZWQgbG9uZykgbnVtKTsKLQotICByZXR1cm4gc3RybGVuIChidWZmZXIpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLWxwcmludF9udW1iZXIgKHdpZHRoLCBudW0pCi0gICAgIGludCB3aWR0aDsKLSAgICAgYmZkX3NpemVfdHlwZSBudW07Ci17Ci0gIGNoYXIgYnVmZmVyWzQwXTsKLSAgc3ByaW50ZiAoYnVmZmVyLAotCSAgIChyYWRpeCA9PSBkZWNpbWFsID8gIiVsdSIgOgotCSAgICgocmFkaXggPT0gb2N0YWwpID8gIjAlbG8iIDogIjB4JWx4IikpLAotCSAgICh1bnNpZ25lZCBsb25nKSBudW0pOwotCi0gIHByaW50ZiAoIiUtKnMiLCB3aWR0aCwgYnVmZmVyKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1ycHJpbnRfbnVtYmVyICh3aWR0aCwgbnVtKQotICAgICBpbnQgd2lkdGg7Ci0gICAgIGJmZF9zaXplX3R5cGUgbnVtOwotewotICBjaGFyIGJ1ZmZlcls0MF07Ci0gIHNwcmludGYgKGJ1ZmZlciwKLQkgICAocmFkaXggPT0gZGVjaW1hbCA/ICIlbHUiIDoKLQkgICAoKHJhZGl4ID09IG9jdGFsKSA/ICIwJWxvIiA6ICIweCVseCIpKSwKLQkgICAodW5zaWduZWQgbG9uZykgbnVtKTsKLQotICBwcmludGYgKCIlKnMiLCB3aWR0aCwgYnVmZmVyKTsKLX0KLQotc3RhdGljIGJmZF9zaXplX3R5cGUgYnNzc2l6ZTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGRhdGFzaXplOwotc3RhdGljIGJmZF9zaXplX3R5cGUgdGV4dHNpemU7Ci0KLXN0YXRpYyB2b2lkCi1iZXJrZWxleV9zdW0gKGFiZmQsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWM7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLSAgaWYgKChmbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLSAgaWYgKChmbGFncyAmIFNFQ19DT0RFKSAhPSAwIHx8IChmbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLSAgICB0ZXh0c2l6ZSArPSBzaXplOwotICBlbHNlIGlmICgoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotICAgIGRhdGFzaXplICs9IHNpemU7Ci0gIGVsc2UKLSAgICBic3NzaXplICs9IHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIAotcHJpbnRfYmVya2VsZXlfZm9ybWF0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBpbnQgZmlsZXNfc2VlbiA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgdG90YWw7Ci0KLSAgYnNzc2l6ZSA9IDA7Ci0gIGRhdGFzaXplID0gMDsKLSAgdGV4dHNpemUgPSAwOwotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgYmVya2VsZXlfc3VtLCAoUFRSKSBOVUxMKTsKLQotICBpZiAoZmlsZXNfc2VlbisrID09IDApCi0jaWYgMAotICAgIC8qIEludGVsIGRvZXNuJ3QgbGlrZSBic3Mvc3RrIGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGNvcmUgZmlsZXMuICAqLwotICAgIHB1dHMgKChyYWRpeCA9PSBvY3RhbCkgPyAiICAgdGV4dFx0ICAgZGF0YVx0YnNzL3N0a1x0ICAgIG9jdFx0ICAgIGhleFx0ZmlsZW5hbWUiIDoKLQkgICIgICB0ZXh0XHQgICBkYXRhXHRic3Mvc3RrXHQgICAgZGVjXHQgICAgaGV4XHRmaWxlbmFtZSIpOwotI2Vsc2UKLSAgICBwdXRzICgocmFkaXggPT0gb2N0YWwpID8gIiAgIHRleHRcdCAgIGRhdGFcdCAgICBic3NcdCAgICBvY3RcdCAgICBoZXhcdGZpbGVuYW1lIiA6Ci0JICAiICAgdGV4dFx0ICAgZGF0YVx0ICAgIGJzc1x0ICAgIGRlY1x0ICAgIGhleFx0ZmlsZW5hbWUiKTsKLSNlbmRpZgotCi0gIHRvdGFsID0gdGV4dHNpemUgKyBkYXRhc2l6ZSArIGJzc3NpemU7Ci0KLSAgcnByaW50X251bWJlciAoNywgdGV4dHNpemUpOwotICBwdXRjaGFyICgnXHQnKTsKLSAgcnByaW50X251bWJlciAoNywgZGF0YXNpemUpOwotICBwdXRjaGFyICgnXHQnKTsKLSAgcnByaW50X251bWJlciAoNywgYnNzc2l6ZSk7Ci0gIHByaW50ZiAoKChyYWRpeCA9PSBvY3RhbCkgPyAiXHQlN2xvXHQlN2x4XHQiIDogIlx0JTdsdVx0JTdseFx0IiksCi0JICAodW5zaWduZWQgbG9uZykgdG90YWwsICh1bnNpZ25lZCBsb25nKSB0b3RhbCk7Ci0KLSAgZnB1dHMgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdGRvdXQpOwotICBpZiAoYmZkX215X2FyY2hpdmUgKGFiZmQpKQotICAgIHByaW50ZiAoIiAoZXggJXMpIiwgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGFiZmQpKSk7Ci19Ci0KLS8qIEkgUkVBTExZIG1pc3MgbGV4aWNhbCBmdW5jdGlvbnMhICovCi1iZmRfc2l6ZV90eXBlIHN2aV90b3RhbCA9IDA7Ci1iZmRfdm1hIHN2aV9tYXh2bWEgPSAwOwotaW50IHN2aV9uYW1lbGVuID0gMDsKLWludCBzdmlfdm1hbGVuID0gMDsKLWludCBzdmlfc2l6ZWxlbiA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1zeXN2X2ludGVybmFsX3NpemVyIChmaWxlLCBzZWMsIGlnbm9yZSkKLSAgICAgYmZkICpmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgc2VjOwotICAgICBQVFIgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGZpbGUsIHNlYyk7Ci0gIGlmICghYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQotICAgIHsKLSAgICAgIGludCBuYW1lbGVuID0gc3RybGVuIChiZmRfc2VjdGlvbl9uYW1lIChmaWxlLCBzZWMpKTsKLSAgICAgIGlmIChuYW1lbGVuID4gc3ZpX25hbWVsZW4pCi0Jc3ZpX25hbWVsZW4gPSBuYW1lbGVuOwotCi0gICAgICBzdmlfdG90YWwgKz0gc2l6ZTsKLSAgICAgIGlmIChiZmRfc2VjdGlvbl92bWEgKGZpbGUsIHNlYykgPiBzdmlfbWF4dm1hKQotCXN2aV9tYXh2bWEgPSBiZmRfc2VjdGlvbl92bWEgKGZpbGUsIHNlYyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3lzdl9pbnRlcm5hbF9wcmludGVyIChmaWxlLCBzZWMsIGlnbm9yZSkKLSAgICAgYmZkICpmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgc2VjOwotICAgICBQVFIgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGZpbGUsIHNlYyk7Ci0gIGlmICghYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQotICAgIHsKLSAgICAgIHN2aV90b3RhbCArPSBzaXplOwotCi0gICAgICBwcmludGYgKCIlLSpzICAgIiwgc3ZpX25hbWVsZW4sIGJmZF9zZWN0aW9uX25hbWUgKGZpbGUsIHNlYykpOwotICAgICAgcnByaW50X251bWJlciAoc3ZpX3NpemVsZW4sIHNpemUpOwotICAgICAgcHJpbnRmICgiICAgIik7Ci0gICAgICBycHJpbnRfbnVtYmVyIChzdmlfdm1hbGVuLCBiZmRfc2VjdGlvbl92bWEgKGZpbGUsIHNlYykpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeXN2X2Zvcm1hdCAoZmlsZSkKLSAgICAgYmZkICpmaWxlOwotewotICAvKiBzaXplIGFsbCBvZiB0aGUgY29sdW1ucyAqLwotICBzdmlfdG90YWwgPSAwOwotICBzdmlfbWF4dm1hID0gMDsKLSAgc3ZpX25hbWVsZW4gPSAwOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGZpbGUsIHN5c3ZfaW50ZXJuYWxfc2l6ZXIsIChQVFIpIE5VTEwpOwotICBzdmlfdm1hbGVuID0gc2l6ZV9udW1iZXIgKChiZmRfc2l6ZV90eXBlKXN2aV9tYXh2bWEpOwotICBpZiAoKHNpemVfdCkgc3ZpX3ZtYWxlbiA8IHNpemVvZiAoImFkZHIiKSAtIDEpCi0gICAgc3ZpX3ZtYWxlbiA9IHNpemVvZiAoImFkZHIiKS0xOwotCi0gIHN2aV9zaXplbGVuID0gc2l6ZV9udW1iZXIgKHN2aV90b3RhbCk7Ci0gIGlmICgoc2l6ZV90KSBzdmlfc2l6ZWxlbiA8IHNpemVvZiAoInNpemUiKSAtIDEpCi0gICAgc3ZpX3NpemVsZW4gPSBzaXplb2YgKCJzaXplIiktMTsKLQotICBzdmlfdG90YWwgPSAwOwotICBwcmludGYgKCIlcyAgIiwgYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotICBpZiAoYmZkX215X2FyY2hpdmUgKGZpbGUpKQotICAgIHByaW50ZiAoIiAoZXggJXMpIiwgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGZpbGUpKSk7Ci0KLSAgcHJpbnRmICgiOlxuJS0qcyAgICUqcyAgICUqc1xuIiwgc3ZpX25hbWVsZW4sICJzZWN0aW9uIiwKLQkgIHN2aV9zaXplbGVuLCAic2l6ZSIsIHN2aV92bWFsZW4sICJhZGRyIik7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoZmlsZSwgc3lzdl9pbnRlcm5hbF9wcmludGVyLCAoUFRSKSBOVUxMKTsKLQotICBwcmludGYgKCIlLSpzICAgIiwgc3ZpX25hbWVsZW4sICJUb3RhbCIpOwotICBycHJpbnRfbnVtYmVyIChzdmlfc2l6ZWxlbiwgc3ZpX3RvdGFsKTsKLSAgcHJpbnRmICgiXG5cbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2l6ZXMgKGZpbGUpCi0gICAgIGJmZCAqZmlsZTsKLXsKLSAgaWYgKGJlcmtlbGV5X2Zvcm1hdCkKLSAgICBwcmludF9iZXJrZWxleV9mb3JtYXQgKGZpbGUpOwotICBlbHNlCi0gICAgcHJpbnRfc3lzdl9mb3JtYXQgKGZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3Jjb252LmMgYi9iaW51dGlscy9zcmNvbnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwZjJiNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zcmNvbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMzYgKzAsMCBAQAotLyogc3Jjb252LmMgLS0gU3lzcm9mZiBjb252ZXJzaW9uIHByb2dyYW0KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pCi0KLSAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGEgY29mZiBvYmplY3QgZmlsZQotICAgaW50byBhIEhpdGFjaGkgT00vTE0gKFN5c3JvZmYpIGZvcm1hdC4KLQotICAgQWxsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBwcmVzZXJ2ZWQgKi8KLQotI2luY2x1ZGUgPGJmZC5oPgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgInN5c3JvZmYuaCIKLSNpbmNsdWRlICJjb2ZmZ3Jvay5oIgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0KLSNkZWZpbmUgUFJPR1JBTV9WRVJTSU9OICIxLjUiCi0vKiNkZWZpbmUgRk9PUDEgMSAqLwotCi1zdGF0aWMgaW50IGFkZHJzaXplOwotc3RhdGljIGNoYXIgKnRvb2xuYW1lOwotc3RhdGljIGNoYXIgKipybmFtZXM7Ci0KLXN0YXRpYyB2b2lkIHdyX2NzICgpOwotc3RhdGljIHZvaWQgd2Fsa190cmVlX3Njb3BlICgpOwotc3RhdGljIHZvaWQgd3JfZ2xvYmFscyAoKTsKLXN0YXRpYyBpbnQgZmluZF9iYXNlICgpOwotCi1zdGF0aWMgRklMRSAqZmlsZTsKLXN0YXRpYyBiZmQgKmFiZmQ7Ci1zdGF0aWMgaW50IGRlYnVnID0gMDsKLXN0YXRpYyBpbnQgcXVpY2sgPSAwOwotc3RhdGljIGludCBub3ByZXNjYW4gPSAwOwotc3RhdGljIHN0cnVjdCBjb2ZmX29maWxlICp0cmVlOwotLyogT2Jzb2xldGUgPz8gCi0gICBzdGF0aWMgaW50IGFic29sdXRlX3A7Ci0gKi8KLQotc3RhdGljIGludCBzZWdtZW50ZWRfcDsKLXN0YXRpYyBpbnQgY29kZTsKLQotc3RhdGljIGludCBpZHMxWzIwMDAwXTsKLXN0YXRpYyBpbnQgaWRzMlsyMDAwMF07Ci0KLXN0YXRpYyBpbnQgYmFzZTEgPSAweDE4Owotc3RhdGljIGludCBiYXNlMiA9IDB4MjAxODsKLQotc3RhdGljIGludAotZ2V0X21lbWJlcl9pZCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGlmIChpZHMyW3hdKQotICAgIHsKLSAgICAgIHJldHVybiBpZHMyW3hdOwotICAgIH0KLSAgaWRzMlt4XSA9IGJhc2UyKys7Ci0gIHJldHVybiBpZHMyW3hdOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfb3JkaW5hcnlfaWQgKHgpCi0gICAgIGludCB4OwotewotICBpZiAoaWRzMVt4XSkKLSAgICB7Ci0gICAgICByZXR1cm4gaWRzMVt4XTsKLSAgICB9Ci0gIGlkczFbeF0gPSBiYXNlMSsrOwotICByZXR1cm4gaWRzMVt4XTsKLX0KLXN0YXRpYyBjaGFyICoKLXNlY3Rpb25fdHJhbnNsYXRlIChuKQotICAgICBjaGFyICpuOwotewotICBpZiAoc3RyY21wIChuLCAiLnRleHQiKSA9PSAwKQotICAgIHJldHVybiAiUCI7Ci0gIGlmIChzdHJjbXAgKG4sICIuZGF0YSIpID09IDApCi0gICAgcmV0dXJuICJEIjsKLSAgaWYgKHN0cmNtcCAobiwgIi5ic3MiKSA9PSAwKQotICAgIHJldHVybiAiQiI7Ci0gIHJldHVybiBuOwotfQotCi0KLQotI2RlZmluZSBEQVRFICI5NDAyMDEwNzMwMDAiOwkvKiBKdXN0IGEgdGltZSBvbiBteSBiaXJ0aGRheSAqLwotCi0KLXN0YXRpYwotY2hhciAqCi1zdHJpcF9zdWZmaXggKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCBpOwotICBjaGFyICpyZXM7Ci0gIGZvciAoaSA9IDA7IG5hbWVbaV0gIT0gMCAmJiBuYW1lW2ldICE9ICcuJzsgaSsrKQotICAgIDsKLSAgcmVzID0gKGNoYXIgKikgeG1hbGxvYyAoaSArIDEpOwotICBtZW1jcHkgKHJlcywgbmFtZSwgaSk7Ci0gIHJlc1tpXSA9IDA7Ci0gIHJldHVybiByZXM7Ci19Ci0KLQotLyogSVQgTEVOIHN0dWZmIENTICovCi1zdGF0aWMgdm9pZAotY2hlY2tzdW0gKGZpbGUsIHB0ciwgc2l6ZSwgY29kZSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIGludCBqOwotICBpbnQgbGFzdDsKLSAgaW50IHN1bSA9IDA7Ci0gIGludCBieXRlcyA9IHNpemUgLyA4OwotICBsYXN0ID0gIShjb2RlICYgMHhmZjAwKTsKLSAgaWYgKHNpemUgJiAweDcpCi0gICAgYWJvcnQgKCk7Ci0gIHB0clswXSA9IGNvZGUgfCAobGFzdCA/IDB4ODAgOiAwKTsKLSAgcHRyWzFdID0gYnl0ZXMgKyAxOwotCi0gIGZvciAoaiA9IDA7IGogPCBieXRlczsgaisrKQotICAgIHsKLSAgICAgIHN1bSArPSBwdHJbal07Ci0gICAgfQotICAvKiBHbHVlIG9uIGEgY2hlY2tzdW0gdG9vICovCi0gIHB0cltieXRlc10gPSB+c3VtOwotICBmd3JpdGUgKHB0ciwgYnl0ZXMgKyAxLCAxLCBmaWxlKTsKLX0KLQotCi0KLQotc3RhdGljIHZvaWQKLXdyaXRlSU5UIChuLCBwdHIsIGlkeCwgc2l6ZSwgZmlsZSkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplOwotICAgICBGSUxFICpmaWxlOwotewotICBpbnQgYnl0ZSA9ICppZHggLyA4OwotCi0gIGlmIChzaXplID09IC0yKQotICAgIHNpemUgPSBhZGRyc2l6ZTsKLSAgZWxzZSBpZiAoc2l6ZSA9PSAtMSkKLSAgICBzaXplID0gMDsKLQotICBpZiAoYnl0ZSA+IDI0MCkKLSAgICB7Ci0gICAgICAvKiBMZXRzIHdyaXRlIG91dCB0aGF0IHJlY29yZCBhbmQgZG8gYW5vdGhlciBvbmUgKi8KLSAgICAgIGNoZWNrc3VtIChmaWxlLCBwdHIsICppZHgsIGNvZGUgfCAweDEwMDApOwotICAgICAgKmlkeCA9IDE2OwotICAgICAgYnl0ZSA9ICppZHggLyA4OwotICAgIH0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBwdHJbYnl0ZV0gPSBuOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcHRyW2J5dGUgKyAwXSA9IG4gPj4gODsKLSAgICAgIHB0cltieXRlICsgMV0gPSBuOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgcHRyW2J5dGUgKyAwXSA9IG4gPj4gMjQ7Ci0gICAgICBwdHJbYnl0ZSArIDFdID0gbiA+PiAxNjsKLSAgICAgIHB0cltieXRlICsgMl0gPSBuID4+IDg7Ci0gICAgICBwdHJbYnl0ZSArIDNdID0gbiA+PiAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgKmlkeCArPSBzaXplICogODsKLX0KLQotCi1zdGF0aWMgdm9pZAotd3JpdGVCSVRTICh2YWwsIHB0ciwgaWR4LCBzaXplKQotICAgICBpbnQgdmFsOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLSAgaW50IGJpdCA9ICppZHggJSA4OwotICBpbnQgb2xkOwotICAqaWR4ICs9IHNpemU7Ci0KLSAgb2xkID0gcHRyW2J5dGVdOwotICAvKiBUdXJuIG9mZiBhbGwgYWJvdXQgdG8gY2hhbmdlIGJpdHMgKi8KLSAgb2xkICY9IH4oKH4wID4+ICg4IC0gYml0IC0gc2l6ZSkpICYgKCgxIDw8IHNpemUpIC0gMSkpOwotICAvKiBUdXJuIG9uIHRoZSBiaXRzIHdlIHdhbnQgKi8KLSAgb2xkIHw9ICh2YWwgJiAoKDEgPDwgc2l6ZSkgLSAxKSkgPDwgKDggLSBiaXQgLSBzaXplKTsKLSAgcHRyW2J5dGVdID0gb2xkOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVCQVJSQVkgKGRhdGEsIHB0ciwgaWR4LCBzaXplLCBmaWxlKQotICAgICBiYXJyYXkgZGF0YTsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemU7Ci0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGludCBpOwotICB3cml0ZUlOVCAoZGF0YS5sZW4sIHB0ciwgaWR4LCAxLCBmaWxlKTsKLSAgZm9yIChpID0gMDsgaSA8IGRhdGEubGVuOyBpKyspCi0gICAgewotICAgICAgd3JpdGVJTlQgKGRhdGEuZGF0YVtpXSwgcHRyLCBpZHgsIDEsIGZpbGUpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotd3JpdGVDSEFSUyAoc3RyaW5nLCBwdHIsIGlkeCwgc2l6ZSwgZmlsZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaW50IGkgPSAqaWR4IC8gODsKLQotICBpZiAoaSA+IDI0MCkKLSAgICB7Ci0gICAgICAvKiBMZXRzIHdyaXRlIG91dCB0aGF0IHJlY29yZCBhbmQgZG8gYW5vdGhlciBvbmUgKi8KLSAgICAgIGNoZWNrc3VtIChmaWxlLCBwdHIsICppZHgsIGNvZGUgfCAweDEwMDApOwotICAgICAgKmlkeCA9IDE2OwotICAgICAgaSA9ICppZHggLyA4OwotICAgIH0KLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFZhcmlhYmxlIGxlbmd0aCBzdHJpbmcgKi8KLSAgICAgIHNpemUgPSBzdHJsZW4gKHN0cmluZyk7Ci0gICAgICBwdHJbaSsrXSA9IHNpemU7Ci0gICAgfQotCi0gIC8qIEJVRyBXQUlUSU5HIFRPIEhBUFBFTiAqLwotICBtZW1jcHkgKHB0ciArIGksIHN0cmluZywgc2l6ZSk7Ci0gIGkgKz0gc2l6ZTsKLSAgKmlkeCA9IGkgKiA4OwotfQotCi0jZGVmaW5lIFNZU1JPRkZfU1dBUF9PVVQKLSNpbmNsdWRlICJzeXNyb2ZmLmMiCi0KLQotc3RhdGljIGNoYXIgKnJuYW1lX3NoW10gPQotewotICAiUjAiLCAiUjEiLCAiUjIiLCAiUjMiLCAiUjQiLCAiUjUiLCAiUjYiLCAiUjciLCAiUjgiLCAiUjkiLCAiUjEwIiwgIlIxMSIsICJSMTIiLCAiUjEzIiwgIlIxNCIsICJSMTUiCi19OwotCi1zdGF0aWMgY2hhciAqcm5hbWVfaDgzMDBbXSA9Ci17Ci0gICJFUjAiLCAiRVIxIiwgIkVSMiIsICJFUjMiLCAiRVI0IiwgIkVSNSIsICJFUjYiLCAiRVI3IiwgIlBDIiwgIkNDUiIKLX07Ci0KLXN0YXRpYyB2b2lkCi13cl90ciAoKQotewotICAvKiBUaGUgVFIgYmxvY2sgaXMgbm90IG5vcm1hbCAtIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgY29udGVudHMuICovCi0KLSAgc3RhdGljIGNoYXIgYltdID0gewotICAgIDB4ZmYsCQkJLyogSVQgKi8KLSAgICAweDAzLAkJCS8qIFJMICovCi0gICAgMHhmZCwJCQkvKiBDUyAqLwotICB9OwotICBmd3JpdGUgKGIsIDEsIHNpemVvZiAoYiksIGZpbGUpOwotfQotCi1zdGF0aWMgdm9pZAotd3JfdW4gKHB0ciwgc2ZpbGUsIGZpcnN0LCBuc2VjcykKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgZmlyc3Q7Ci0gICAgIGludCBuc2VjczsKLXsKLSAgc3RydWN0IElUX3VuIHVuOwotCi0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqczsKLQotICB1bi5zcGFyZTEgPSAwOwotCi0gIGlmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKQotICAgIHVuLmZvcm1hdCA9IEZPUk1BVF9MTTsKLSAgZWxzZQotICAgIHVuLmZvcm1hdCA9IEZPUk1BVF9PTTsKLSAgdW4uc3BhcmUxID0gMDsKLQotCi0jaWYgMQotICB1bi5uc2VjdGlvbnMgPSBwdHItPm5zZWN0aW9ucyAtIDE7CS8qICBEb24ndCBjb3VudCB0aGUgYWJzIHNlY3Rpb24gKi8KLSNlbHNlCi0gIC8qTkVXIC0gb25seSBjb3VudCBzZWN0aW9ucyB3aXRoIHNpemUgKi8KLSAgdW4ubnNlY3Rpb25zID0gbnNlY3M7Ci0jZW5kaWYKLQotICB1bi5uZXh0ZGVmcyA9IDA7Ci0gIHVuLm5leHRyZWZzID0gMDsKLSAgLyogQ291bnQgYWxsIHRoZSB1bmRlZmluZWQgYW5kIGRlZmluZWQgdmFyaWFibGVzIHdpdGggZ2xvYmFsIHNjb3BlICovCi0KLSAgaWYgKGZpcnN0KQotICAgIHsKLSAgICAgIGZvciAocyA9IHB0ci0+c3ltYm9sX2xpc3RfaGVhZDsgczsgcyA9IHMtPm5leHRfaW5fb2ZpbGVfbGlzdCkKLQl7Ci0JICBpZiAocy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfZGVmCi0JICAgICAgfHwgcy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19jb21tb24pCi0JICAgIHVuLm5leHRkZWZzKys7Ci0KLQkgIGlmIChzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCi0JICAgIHVuLm5leHRyZWZzKys7Ci0JfQotICAgIH0KLSAgdW4udG9vbCA9IHRvb2xuYW1lOwotICB1bi50Y2QgPSBEQVRFOwotICB1bi5saW5rZXIgPSAiTF9HWDAwIjsKLSAgdW4ubGNkID0gREFURTsKLSAgdW4ubmFtZSA9IHNmaWxlLT5uYW1lOwotICBzeXNyb2ZmX3N3YXBfdW5fb3V0IChmaWxlLCAmdW4pOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cl9oZCAocCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci17Ci0gIHN0cnVjdCBJVF9oZCBoZDsKLQotICBoZC5zcGFyZTEgPSAwOwotICBpZiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICBoZC5tdCA9IE1UWVBFX0FCU19MTTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZC5tdCA9IE1UWVBFX09NU19PUl9MTVM7Ci0gICAgfQotICBoZC5jZCA9IERBVEU7Ci0KLSAgaGQubnUgPSBwLT5uc291cmNlczsJCS8qIEFsd2F5cyBvbmUgdW5pdCAqLwotICBoZC5jb2RlID0gMDsJCQkvKiBBbHdheXMgQVNDSUkgKi8KLSAgaGQudmVyID0gIjAyMDAiOwkJLyogVmVyc2lvbiAyLjAwICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9oODMwMDoKLSAgICAgIGhkLmF1ID0gODsKLSAgICAgIGhkLnNpID0gMDsKLSAgICAgIGhkLnNwY3N6ID0gMzI7Ci0gICAgICBoZC5zZWdzeiA9IDA7Ci0gICAgICBoZC5zZWdzaCA9IDA7Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfaDgzMDA6Ci0JICBoZC5jcHUgPSAiSDgzMDAiOwotCSAgaGQuYWZsID0gMjsKLQkgIGFkZHJzaXplID0gMjsKLQkgIHRvb2xuYW1lID0gIkNfSDgvMzAwIjsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfaDgzMDBoOgotCSAgaGQuY3B1ID0gIkg4MzAwSCI7Ci0JICBoZC5hZmwgPSA0OwotCSAgYWRkcnNpemUgPSA0OwotCSAgdG9vbG5hbWUgPSAiQ19IOC8zMDBIIjsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfaDgzMDBzOgotCSAgaGQuY3B1ID0gIkg4MzAwUyI7Ci0JICBoZC5hZmwgPSA0OwotCSAgYWRkcnNpemUgPSA0OwotCSAgdG9vbG5hbWUgPSAiQ19IOC8zMDBTIjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCgpOwotCX0KLSAgICAgIHJuYW1lcyA9IHJuYW1lX2g4MzAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSAgICAgIGhkLmF1ID0gODsKLSAgICAgIGhkLnNpID0gMDsKLSAgICAgIGhkLmFmbCA9IDQ7Ci0gICAgICBoZC5zcGNzeiA9IDMyOwotICAgICAgaGQuc2Vnc3ogPSAwOwotICAgICAgaGQuc2Vnc2ggPSAwOwotICAgICAgaGQuY3B1ID0gIlNIIjsKLSAgICAgIGFkZHJzaXplID0gNDsKLSAgICAgIHRvb2xuYW1lID0gIkNfU0giOwotICAgICAgcm5hbWVzID0gcm5hbWVfc2g7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmICghIGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICBoZC5lcCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGQuZXAgPSAxOwotICAgICAgaGQudWFuID0gMDsKLSAgICAgIGhkLnNhID0gMDsKLSAgICAgIGhkLnNhZCA9IDA7Ci0gICAgICBoZC5hZGRyZXNzID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgICB9Ci0KLSAgaGQub3MgPSAiIjsKLSAgaGQuc3lzID0gIiI7Ci0gIGhkLm1uID0gc3RyaXBfc3VmZml4IChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgc3lzcm9mZl9zd2FwX2hkX291dCAoZmlsZSwgJmhkKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotd3Jfc2ggKHAsIHNlYykKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlYzsKLXsKLSAgc3RydWN0IElUX3NoIHNoOwotICBzaC51bml0ID0gMDsKLSAgc2guc2VjdGlvbiA9IHNlYy0+bnVtYmVyOwotI2lmZGVmIEZPT1AxCi0gIHNoLnNlY3Rpb24gPSAwOwotI2VuZGlmCi0gIHN5c3JvZmZfc3dhcF9zaF9vdXQgKGZpbGUsICZzaCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyX29iIChwLCBzZWN0aW9uKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBpbnQgZmlyc3QgPSAxOwotICB1bnNpZ25lZCBjaGFyIHN0dWZmWzIwMF07Ci0KLSAgaSA9IDA7Ci0gIHdoaWxlIChpIDwgc2VjdGlvbi0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgSVRfb2Igb2I7Ci0gICAgICBpbnQgdG9kbyA9IDIwMDsJCS8qIENvcHkgaW4gMjAwIGJ5dGUgbHVtcHMgKi8KLSAgICAgIG9iLnNwYXJlID0gMDsKLSAgICAgIGlmIChpICsgdG9kbyA+IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JdG9kbyA9IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgLSBpOwotCi0gICAgICBpZiAoZmlyc3QpCi0JewotCSAgb2Iuc2FmID0gMTsKLQkgIGlmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKQotCSAgICBvYi5hZGRyZXNzID0gc2VjdGlvbi0+YWRkcmVzczsKLQkgIGVsc2UKLQkgICAgb2IuYWRkcmVzcyA9IDA7Ci0KLQkgIGZpcnN0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb2Iuc2FmID0gMDsKLQl9Ci0KLSAgICAgIG9iLmNwZiA9IDA7CQkvKiBOZXZlciBjb21wcmVzcyAqLwotICAgICAgb2IuZGF0YS5sZW4gPSB0b2RvOwotICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLT5iZmRfc2VjdGlvbiwgc3R1ZmYsIGksIHRvZG8pOwotICAgICAgb2IuZGF0YS5kYXRhID0gc3R1ZmY7Ci0gICAgICBzeXNyb2ZmX3N3YXBfb2Jfb3V0IChmaWxlLCAmb2IgLyosIGkgKyB0b2RvIDwgc2VjdGlvbi0+c2l6ZSAqLyApOwotICAgICAgaSArPSB0b2RvOwotICAgIH0KLSAgLyogTm93IGZpbGwgdGhlIHJlc3Qgd2l0aCBibGFua3MgKi8KLSAgd2hpbGUgKGkgPCAoYmZkX3NpemVfdHlwZSkgc2VjdGlvbi0+c2l6ZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgSVRfb2Igb2I7Ci0gICAgICBpbnQgdG9kbyA9IDIwMDsJCS8qIENvcHkgaW4gMjAwIGJ5dGUgbHVtcHMgKi8KLSAgICAgIG9iLnNwYXJlID0gMDsKLSAgICAgIGlmIChpICsgdG9kbyA+IChiZmRfc2l6ZV90eXBlKSBzZWN0aW9uLT5zaXplKQotCXRvZG8gPSBzZWN0aW9uLT5zaXplIC0gaTsKLSAgICAgIG9iLnNhZiA9IDA7Ci0KLSAgICAgIG9iLmNwZiA9IDA7CQkvKiBOZXZlciBjb21wcmVzcyAqLwotICAgICAgb2IuZGF0YS5sZW4gPSB0b2RvOwotICAgICAgbWVtc2V0IChzdHVmZiwgMCwgdG9kbyk7Ci0gICAgICBvYi5kYXRhLmRhdGEgPSBzdHVmZjsKLSAgICAgIHN5c3JvZmZfc3dhcF9vYl9vdXQgKGZpbGUsICZvYik7Ci0gICAgICBpICs9IHRvZG87Ci0gICAgfQotICAvKiBOb3cgZmlsbCB0aGUgcmVzdCB3aXRoIGJsYW5rcyAqLwotCi19Ci0KLXN0YXRpYyB2b2lkCi13cl9ybCAocHRyLCBzZWMpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlYzsKLXsKLSAgaW50IG5yID0gc2VjLT5ucmVsb2NzOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGNvZmZfcmVsb2MgKnIgPSBzZWMtPnJlbG9jcyArIGk7Ci0gICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnJlZjsKLSAgICAgIHN0cnVjdCBJVF9ybCBybDsKLSAgICAgIHJsLmFwb2wgPSAwOwotICAgICAgcmwuYm91bmRhcnkgPSAwOwotICAgICAgcmwuc2VnbWVudCA9IDE7Ci0gICAgICBybC5zaWduID0gMDsKLSAgICAgIHJsLmNoZWNrID0gMDsKLSAgICAgIHJsLmFkZHIgPSByLT5vZmZzZXQ7Ci0gICAgICBybC5iaXRsb2MgPSAwOwotICAgICAgcmwuZmxlbiA9IDMyOwkJLyogU0ggU3BlY2lmaWMgKi8KLSAgICAgIC8qIFdoYXQgc29ydCBvZiByZWxvYyA/IExvb2sgaW4gdGhlIHNlY3Rpb24gdG8gZmluZCBvdXQgKi8KLSAgICAgIHJlZiA9IHItPnN5bWJvbDsKLSAgICAgIGlmIChyZWYtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X3JlZikKLQl7Ci0JICBybC5iY291bnQgPSA0OwkvKiBBbHdheXMgNCBmb3IgdXMgKi8KLQkgIHJsLm9wID0gT1BfRVhUX1JFRjsKLQkgIHJsLnN5bW4gPSByZWYtPmVyX251bWJlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChyZWYtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfY29tbW9uKQotCXsKLQkgIHJsLmJjb3VudCA9IDExOwkvKiBBbHdheXMgMTEgZm9yIHVzICovCi0JICBybC5vcCA9IE9QX1NFQ19SRUY7Ci0JICBybC5zZWNuID0gcmVmLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCSAgcmwuY29wY29kZV9pc18zID0gMzsKLQkgIHJsLmFsZW5ndGhfaXNfNCA9IDQ7Ci0JICBybC5hZGRlbmQgPSByZWYtPndoZXJlLT5vZmZzZXQgLSByZWYtPndoZXJlLT5zZWN0aW9uLT5hZGRyZXNzOwotCSAgcmwuYW9wY29kZV9pc18weDIwID0gMHgyMDsKLQl9Ci0KLSAgICAgIGVsc2UKLQl7Ci0JICBybC5iY291bnQgPSAxMTsJLyogQWx3YXlzIDExIGZvciB1cyAqLwotCSAgcmwub3AgPSBPUF9TRUNfUkVGOwotCSAgcmwuc2VjbiA9IHJlZi0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQkgIHJsLmNvcGNvZGVfaXNfMyA9IDM7Ci0JICBybC5hbGVuZ3RoX2lzXzQgPSA0OwotCSAgcmwuYWRkZW5kID0gLXJlZi0+d2hlcmUtPnNlY3Rpb24tPmFkZHJlc3M7Ci0JICBybC5hb3Bjb2RlX2lzXzB4MjAgPSAweDIwOwotCX0KLSAgICAgIHJsLmVuZCA9IDB4ZmY7Ci0gICAgICBpZiAocmwub3AgPT0gT1BfU0VDX1JFRgotCSAgfHwgcmwub3AgPT0gT1BfRVhUX1JFRikKLQl7Ci0JICBzeXNyb2ZmX3N3YXBfcmxfb3V0IChmaWxlLCAmcmwpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9vYmplY3RfYm9keSAocCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci17Ci0gIGludCBpOwotICBmb3IgKGkgPSAxOyBpIDwgcC0+bnNlY3Rpb25zOyBpKyspCi0gICAgewotICAgICAgd3Jfc2ggKHAsIHAtPnNlY3Rpb25zICsgaSk7Ci0gICAgICB3cl9vYiAocCwgcC0+c2VjdGlvbnMgKyBpKTsKLSAgICAgIHdyX3JsIChwLCBwLT5zZWN0aW9ucyArIGkpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyX2Rwc19zdGFydCAoc2ZpbGUsIHNlY3Rpb24sIHNjb3BlLCB0eXBlLCBuZXN0KQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpzY29wZTsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBuZXN0OwotewotICBzdHJ1Y3QgSVRfZHBzIGRwczsKLSAgZHBzLmVuZCA9IDA7Ci0gIGRwcy5vcHQgPSAwOwotICBkcHMudHlwZSA9IHR5cGU7Ci0gIGlmIChzY29wZS0+c2VjKQotICAgIHsKLSAgICAgIGRwcy5zYW4gPSBzY29wZS0+c2VjLT5udW1iZXI7Ci0gICAgICBkcHMuYWRkcmVzcyA9IHNjb3BlLT5vZmZzZXQgLSBmaW5kX2Jhc2UgKHNmaWxlLCBzY29wZS0+c2VjKTsKLSAgICAgIGRwcy5ibG9ja19zaXplID0gc2NvcGUtPnNpemU7Ci0gICAgICBpZiAoZGVidWcpCi0JewotCSAgcHJpbnRmICgiRFBTICVzICVkICV4XG4iLAotCQkgIHNmaWxlLT5uYW1lLAotCQkgIG5lc3QsCi0JCSAgZHBzLmFkZHJlc3MpOwotCi0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRwcy5zYW4gPSAwOwotICAgICAgZHBzLmFkZHJlc3MgPSAwOwotICAgICAgZHBzLmJsb2NrX3NpemUgPSAwOwotICAgIH0KLQotICBkcHMubmVzdGluZyA9IG5lc3Q7Ci0gIGRwcy5uZWcgPSAweDEwMDE7Ci0gIHN5c3JvZmZfc3dhcF9kcHNfb3V0IChmaWxlLCAmZHBzKTsKLX0KLQotc3RhdGljIHZvaWQKLXdyX2Rwc19lbmQgKHNlY3Rpb24sIHNjb3BlLCB0eXBlKQotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqc2NvcGU7Ci0gICAgIGludCB0eXBlOwotewotICBzdHJ1Y3QgSVRfZHBzIGRwczsKLSAgZHBzLmVuZCA9IDE7Ci0gIGRwcy50eXBlID0gdHlwZTsKLSAgc3lzcm9mZl9zd2FwX2Rwc19vdXQgKGZpbGUsICZkcHMpOwotfQotCi1zdGF0aWMgaW50ICoKLW5pbnRzICh4KQotICAgICBpbnQgeDsKLXsKLSAgcmV0dXJuIChpbnQgKikgKHhjYWxsb2MgKHNpemVvZiAoaW50KSwgeCkpOwotfQotCi1zdGF0aWMgdm9pZCB3YWxrX3RyZWVfc3ltYm9sICgpOwotc3RhdGljIHZvaWQKLXdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpCi0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnR5cGU7Ci0gICAgIGludCBuZXN0OwotewotICBzd2l0Y2ggKHR5cGUtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl9zZWNkZWZfdHlwZToKLSAgICBjYXNlIGNvZmZfYmFzaWNfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGRidDsKLQotCXN3aXRjaCAodHlwZS0+dS5iYXNpYykKLQkgIHsKLQkgIGNhc2UgVF9OVUxMOgotCSAgY2FzZSBUX1ZPSUQ6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX1ZPSUQ7Ci0JICAgIGRidC5zaWduID0gQlRZUEVfVU5TUEVDOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX0NIQVI6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0NIQVI7Ci0JICAgIGRidC5zaWduID0gQlRZUEVfVU5TUEVDOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX1NIT1JUOgotCSAgY2FzZSBUX0lOVDoKLQkgIGNhc2UgVF9MT05HOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9JTlQ7Ci0JICAgIGRidC5zaWduID0gU0lHTl9TSUdORUQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfRkxPQVQ6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0ZMT0FUOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX1NJTkdMRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfRE9VQkxFOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9GTE9BVDsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9ET1VCTEU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX0xOR0RCTDoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfRkxPQVQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfRVhURU5ERUQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX1VDSEFSOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9DSEFSOwotCSAgICBkYnQuc2lnbiA9IFNJR05fVU5TSUdORUQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfVVNIT1JUOgotCSAgY2FzZSBUX1VJTlQ6Ci0JICBjYXNlIFRfVUxPTkc6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0lOVDsKLQkgICAgZGJ0LnNpZ24gPSBTSUdOX1VOU0lHTkVEOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgfQotCWRidC5iaXRzaXplID0gdHlwZS0+c2l6ZTsKLQlkYnQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIGNvZmZfcG9pbnRlcl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kcHQgZHB0OwotCXdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUtPnUucG9pbnRlci5wb2ludHNfdG8sIG5lc3QgKyAxKTsKLQlkcHQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kcHRfb3V0IChmaWxlLCAmZHB0KTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgY29mZl9mdW5jdGlvbl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kZnAgZGZwOwotCXN0cnVjdCBjb2ZmX3N5bWJvbCAqcGFyYW07Ci0JZGZwLmVuZCA9IDA7Ci0JZGZwLnNwYXJlID0gMDsKLQlkZnAubnBhcmFtcyA9IHR5cGUtPnUuZnVuY3Rpb24ucGFyYW1ldGVycy0+bnZhcnM7Ci0JZGZwLm5lZyA9IDB4MTAwMTsKLQotCXdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUtPnUuZnVuY3Rpb24uZnVuY3Rpb25fcmV0dXJucywgbmVzdCArIDEpOwotCi0Jc3lzcm9mZl9zd2FwX2RmcF9vdXQgKGZpbGUsICZkZnApOwotCi0JZm9yIChwYXJhbSA9IHR5cGUtPnUuZnVuY3Rpb24ucGFyYW1ldGVycy0+dmFyc19oZWFkOwotCSAgICAgcGFyYW07Ci0JICAgICBwYXJhbSA9IHBhcmFtLT5uZXh0KQotCSAgewotCSAgICB3YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgMCwgcGFyYW0sIG5lc3QpOwotCSAgfQotCWRmcC5lbmQgPSAxOwotCXN5c3JvZmZfc3dhcF9kZnBfb3V0IChmaWxlLCAmZGZwKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgY29mZl9zdHJ1Y3RkZWZfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGRidDsKLQlzdHJ1Y3QgSVRfZGRzIGRkczsKLQlzdHJ1Y3QgY29mZl9zeW1ib2wgKm1lbWJlcjsKLQlkZHMuc3BhcmUgPSAwOwotCWRidC5idHlwZSA9IEJUWVBFX1NUUlVDVDsKLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKLQlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JZGJ0LnNpZCA9IGdldF9tZW1iZXJfaWQgKHR5cGUtPnUuYXN0cnVjdGRlZi5pZHgpOwotCWRidC5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2RidF9vdXQgKGZpbGUsICZkYnQpOwotCWRkcy5lbmQgPSAwOwotCWRkcy5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2Rkc19vdXQgKGZpbGUsICZkZHMpOwotCWZvciAobWVtYmVyID0gdHlwZS0+dS5hc3RydWN0ZGVmLmVsZW1lbnRzLT52YXJzX2hlYWQ7Ci0JICAgICBtZW1iZXI7Ci0JICAgICBtZW1iZXIgPSBtZW1iZXItPm5leHQpCi0JICB7Ci0JICAgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCAwLCBtZW1iZXIsIG5lc3QgKyAxKTsKLQkgIH0KLQotCWRkcy5lbmQgPSAxOwotCXN5c3JvZmZfc3dhcF9kZHNfb3V0IChmaWxlLCAmZGRzKTsKLQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3N0cnVjdHJlZl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZGJ0OwotCWRidC5idHlwZSA9IEJUWVBFX1RBRzsKLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKLQlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JaWYgKHR5cGUtPnUuYXN0cnVjdHJlZi5yZWYpCi0JICB7Ci0JICAgIGRidC5zaWQgPSBnZXRfbWVtYmVyX2lkICh0eXBlLT51LmFzdHJ1Y3RyZWYucmVmLT5udW1iZXIpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZGJ0LnNpZCA9IDA7Ci0JICB9Ci0KLQlkYnQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9hcnJheV90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kYXIgZGFyOwotCWludCBqOwotCWludCBkaW1zID0gMTsJCS8qIE9ubHkgb3V0cHV0IG9uZSBkaW1lbnNpb24gYXQgYSB0aW1lICovCi0JZGFyLmRpbXMgPSBkaW1zOwotCWRhci52YXJpYWJsZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIuc3VidHlwZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIuc3BhcmUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1heF92YXJpYWJsZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIubWF4c3BhcmUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1heCA9IG5pbnRzIChkaW1zKTsKLQlkYXIubWluX3ZhcmlhYmxlID0gbmludHMgKGRpbXMpOwotCWRhci5taW4gPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1pbnNwYXJlID0gbmludHMgKGRpbXMpOwotCWRhci5uZWcgPSAweDEwMDE7Ci0JZGFyLmxlbmd0aCA9IHR5cGUtPnNpemUgLyB0eXBlLT51LmFycmF5LmRpbTsKLQlmb3IgKGogPSAwOyBqIDwgZGltczsgaisrKQotCSAgewotCSAgICBkYXIudmFyaWFibGVbal0gPSBWQVJJQUJMRV9GSVhFRDsKLQkgICAgZGFyLnN1YnR5cGVbal0gPSBTVUJfSU5URUdFUjsKLQkgICAgZGFyLnNwYXJlW2pdID0gMDsKLQkgICAgZGFyLm1heF92YXJpYWJsZVtqXSA9IDA7Ci0JICAgIGRhci5tYXhbal0gPSB0eXBlLT51LmFycmF5LmRpbTsKLQkgICAgZGFyLm1pbl92YXJpYWJsZVtqXSA9IDA7Ci0JICAgIGRhci5taW5bal0gPSAxOwkvKiBXaHkgaXNuJ3QgdGhpcyAwID8gKi8KLQkgIH0KLQl3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLT51LmFycmF5LmFycmF5X29mLCBuZXN0ICsgMSk7Ci0Jc3lzcm9mZl9zd2FwX2Rhcl9vdXQgKGZpbGUsICZkYXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1kZWZfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGRidDsKLQlzdHJ1Y3QgSVRfZGVuIGRlbjsKLQlzdHJ1Y3QgY29mZl9zeW1ib2wgKm1lbWJlcjsKLQlkYnQuYnR5cGUgPSBCVFlQRV9FTlVNOwotCWRidC5iaXRzaXplID0gdHlwZS0+c2l6ZTsKLQlkYnQuc2lnbiA9IFNJR05fVU5TUEVDOwotCWRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQlkYnQuc2lkID0gZ2V0X21lbWJlcl9pZCAodHlwZS0+dS5hZW51bWRlZi5pZHgpOwotCWRidC5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2RidF9vdXQgKGZpbGUsICZkYnQpOwotCi0JZGVuLmVuZCA9IDA7Ci0JZGVuLm5lZyA9IDB4MTAwMTsKLQlkZW4uc3BhcmUgPSAwOwotCXN5c3JvZmZfc3dhcF9kZW5fb3V0IChmaWxlLCAmZGVuKTsKLQlmb3IgKG1lbWJlciA9IHR5cGUtPnUuYWVudW1kZWYuZWxlbWVudHMtPnZhcnNfaGVhZDsKLQkgICAgIG1lbWJlcjsKLQkgICAgIG1lbWJlciA9IG1lbWJlci0+bmV4dCkKLQkgIHsKLQkgICAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIDAsIG1lbWJlciwgbmVzdCArIDEpOwotCSAgfQotCi0JZGVuLmVuZCA9IDE7Ci0Jc3lzcm9mZl9zd2FwX2Rlbl9vdXQgKGZpbGUsICZkZW4pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9lbnVtcmVmX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkYnQ7Ci0JZGJ0LmJ0eXBlID0gQlRZUEVfVEFHOwotCWRidC5iaXRzaXplID0gdHlwZS0+c2l6ZTsKLQlkYnQuc2lnbiA9IFNJR05fVU5TUEVDOwotCWRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQlkYnQuc2lkID0gZ2V0X21lbWJlcl9pZCAodHlwZS0+dS5hZW51bXJlZi5yZWYtPm51bWJlcik7Ci0JZGJ0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBPYnNvbGV0ZSA/IAotICAgc3RhdGljIHZvaWQKLSAgIGR0eV9zdGFydCAoKQotICAgewotICAgc3RydWN0IElUX2R0eSBkdHk7Ci0gICBkdHkuZW5kID0gMDsKLSAgIGR0eS5uZWcgPSAweDEwMDE7Ci0gICBkdHkuc3BhcmUgPSAwOwotICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotICAgfQotCi0gICBzdGF0aWMgdm9pZAotICAgZHR5X3N0b3AgKCkKLSAgIHsKLSAgIHN0cnVjdCBJVF9kdHkgZHR5OwotICAgZHR5LmVuZCA9IDA7Ci0gICBkdHkubmVnID0gMHgxMDAxOwotICAgZHR5LmVuZCA9IDE7Ci0gICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0gICB9Ci0KLQotICAgc3RhdGljIHZvaWQKLSAgIGR1bXBfdHJlZV9zdHJ1Y3R1cmUgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpCi0gICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgIHN0cnVjdCBjb2ZmX3R5cGUgKnR5cGU7Ci0gICBpbnQgbmVzdDsKLSAgIHsKLSAgIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotICAgewotCi0KLSAgIH0KLQotICAgfQotICovCi0KLXN0YXRpYyB2b2lkCi13YWxrX3RyZWVfdHlwZSAoc2ZpbGUsIHN5bWJvbCwgdHlwZSwgbmVzdCkKLQotICAgICBzdHJ1Y3QKLSAgICAgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOwotICAgICBpbnQgbmVzdDsKLXsKLSAgaWYgKHN5bWJvbC0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0gICAgewotCi0gICAgICBzdHJ1Y3QgSVRfZHR5IGR0eTsKLSAgICAgIGR0eS5lbmQgPSAwOwotICAgICAgZHR5Lm5lZyA9IDB4MTAwMTsKLQotICAgICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotICAgICAgd2Fsa190cmVlX3R5cGVfMSAoc2ZpbGUsIHN5bWJvbCwgdHlwZSwgbmVzdCk7Ci0gICAgICBkdHkuZW5kID0gMTsKLSAgICAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLQotICAgICAgd3JfZHBzX3N0YXJ0IChzZmlsZSwKLQkJICAgIHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCi0JCSAgICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKLQkJICAgIEJMT0NLX1RZUEVfRlVOQ1RJT04sIG5lc3QpOwotICAgICAgd3JfZHBzX3N0YXJ0IChzZmlsZSwgc3ltYm9sLT53aGVyZS0+c2VjdGlvbiwKLQkJICAgIHN5bWJvbC0+dHlwZS0+dS5mdW5jdGlvbi5jb2RlLAotCQkgICAgQkxPQ0tfVFlQRV9CTE9DSywgbmVzdCk7Ci0gICAgICB3YWxrX3RyZWVfc2NvcGUgKHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCi0JCSAgICAgICBzZmlsZSwKLQkJICAgICAgIHN5bWJvbC0+dHlwZS0+dS5mdW5jdGlvbi5jb2RlLAotCQkgICAgICAgbmVzdCArIDEsIEJMT0NLX1RZUEVfQkxPQ0spOwotCi0gICAgICB3cl9kcHNfZW5kIChzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAotCQkgIHN5bWJvbC0+dHlwZS0+dS5mdW5jdGlvbi5jb2RlLAotCQkgIEJMT0NLX1RZUEVfQkxPQ0spOwotICAgICAgd3JfZHBzX2VuZCAoc3ltYm9sLT53aGVyZS0+c2VjdGlvbiwKLQkJICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwgQkxPQ0tfVFlQRV9GVU5DVElPTik7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgSVRfZHR5IGR0eTsKLSAgICAgIGR0eS5lbmQgPSAwOwotICAgICAgZHR5Lm5lZyA9IDB4MTAwMTsKLSAgICAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLSAgICAgIHdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpOwotICAgICAgZHR5LmVuZCA9IDE7Ci0gICAgICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0gICAgfQotCi19Ci0KLQotCi1zdGF0aWMgdm9pZAotd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIHNlY3Rpb24sIHN5bWJvbCwgbmVzdCkKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIHN0cnVjdCBJVF9kc3kgZHN5OwotCi0gIG1lbXNldCgmZHN5LCAwLCBzaXplb2YoZHN5KSk7Ci0gIGRzeS5uZXN0aW5nID0gbmVzdDsKLQotICBzd2l0Y2ggKHN5bWJvbC0+dHlwZS0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX2Z1bmN0aW9uX3R5cGU6Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX0ZVTkM7Ci0gICAgICBkc3kuYXNzaWduID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9zdHJ1Y3RyZWZfdHlwZToKLSAgICBjYXNlIGNvZmZfcG9pbnRlcl90eXBlOgotICAgIGNhc2UgY29mZl9hcnJheV90eXBlOgotICAgIGNhc2UgY29mZl9iYXNpY190eXBlOgotICAgIGNhc2UgY29mZl9lbnVtcmVmX3R5cGU6Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX1ZBUjsKLSAgICAgIGRzeS5hc3NpZ24gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1kZWZfdHlwZToKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfVEFHOwotICAgICAgZHN5LmFzc2lnbiA9IDA7Ci0gICAgICBkc3kubWFnaWMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3N0cnVjdGRlZl90eXBlOgotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9UQUc7Ci0gICAgICBkc3kuYXNzaWduID0gMDsKLSAgICAgIGRzeS5tYWdpYyA9IHN5bWJvbC0+dHlwZS0+dS5hc3RydWN0ZGVmLmlzc3RydWN0ID8gMCA6IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc2VjZGVmX3R5cGU6Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0KQotICAgIHsKLSAgICAgIGRzeS5hc3NpZ24gPSAwOwotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9NRU1CRVI7Ci0gICAgfQotICBpZiAoc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bSkKLSAgICB7Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX0VOVU07Ci0gICAgICBkc3kuYXNzaWduID0gMDsKLSAgICAgIGRzeS5ldmFsbGVuID0gNDsKLSAgICAgIGRzeS5ldmFsdWUgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7Ci0gICAgfQotCi0gIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9zdHJ1Y3RkZWZfdHlwZQotICAgICAgfHwgc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9lbnRhZwotICAgICAgfHwgc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9zdHJ0YWcpCi0gICAgewotICAgICAgZHN5LnNudW1iZXIgPSBnZXRfbWVtYmVyX2lkIChzeW1ib2wtPm51bWJlcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZHN5LnNudW1iZXIgPSBnZXRfb3JkaW5hcnlfaWQgKHN5bWJvbC0+bnVtYmVyKTsKLSAgICB9Ci0KLQotICBkc3kuc25hbWUgPSBzeW1ib2wtPm5hbWVbMF0gPT0gJ18nID8gc3ltYm9sLT5uYW1lICsgMSA6IHN5bWJvbC0+bmFtZTsKLQotICBzd2l0Y2ggKHN5bWJvbC0+dmlzaWJsZS0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3Zpc19jb21tb246Ci0gICAgY2FzZSBjb2ZmX3Zpc19leHRfZGVmOgotICAgICAgZHN5LmFpbmZvID0gQUlORk9fU1RBVElDX0VYVF9ERUY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9yZWY6Ci0gICAgICBkc3kuYWluZm8gPSBBSU5GT19TVEFUSUNfRVhUX1JFRjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfaW50X2RlZjoKLSAgICAgIGRzeS5haW5mbyA9IEFJTkZPX1NUQVRJQ19JTlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG86Ci0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvcGFyYW06Ci0gICAgICBkc3kuYWluZm8gPSBBSU5GT19BVVRPOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdpc3RlcjoKLSAgICBjYXNlIGNvZmZfdmlzX3JlZ3BhcmFtOgotICAgICAgZHN5LmFpbmZvID0gQUlORk9fUkVHOwotICAgICAgYnJlYWs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX3RhZzoKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgZHN5LmRsZW5ndGggPSBzeW1ib2wtPnR5cGUtPnNpemU7Ci0gIHN3aXRjaCAoc3ltYm9sLT53aGVyZS0+d2hlcmUpCi0gICAgewotICAgIGNhc2UgY29mZl93aGVyZV9tZW1vcnk6Ci0KLSAgICAgIGRzeS5zZWN0aW9uID0gc3ltYm9sLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotI2lmZGVmIEZPT1AKLSAgICAgIGRzeS5zZWN0aW9uID0gMDsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOgotICAgIGNhc2UgY29mZl93aGVyZV9zdGFjazoKLSAgICBjYXNlIGNvZmZfd2hlcmVfcmVnaXN0ZXI6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3Vua25vd246Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0cnRhZzoKLQotICAgIGNhc2UgY29mZl93aGVyZV9lbnRhZzoKLSAgICBjYXNlIGNvZmZfd2hlcmVfdHlwZWRlZjoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChzeW1ib2wtPndoZXJlLT53aGVyZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbW9yeToKLSAgICAgIGRzeS5hZGRyZXNzID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0IC0gZmluZF9iYXNlIChzZmlsZSwgc3ltYm9sLT53aGVyZS0+c2VjdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RhY2s6Ci0gICAgICBkc3kuYWRkcmVzcyA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OgotCi0KLSAgICAgIGlmIChzeW1ib2wtPndoZXJlLT5iaXRzaXplKQotCXsKLQkgIGludCBiaXRzID0gKHN5bWJvbC0+d2hlcmUtPm9mZnNldCAqIDggKyBzeW1ib2wtPndoZXJlLT5iaXRvZmZzZXQpOwotCSAgZHN5LmJpdHVuaXQgPSAxOwotCSAgZHN5LmZpZWxkX2xlbiA9IHN5bWJvbC0+d2hlcmUtPmJpdHNpemU7Ci0JICBkc3kuZmllbGRfb2ZmID0gKGJpdHMgLyAzMikgKiA0OwotCSAgZHN5LmZpZWxkX2JpdG9mZiA9IGJpdHMgJSAzMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZHN5LmJpdHVuaXQgPSAwOwotCi0JICBkc3kuZmllbGRfbGVuID0gc3ltYm9sLT50eXBlLT5zaXplOwotCSAgZHN5LmZpZWxkX29mZiA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW06Ci0gICAgICAvKiAgICAgIGRzeS5iaXR1bml0ID0gMDsKLSAgICAgICAgIGRzeS5maWVsZF9sZW4gID0gc3ltYm9sLT50eXBlLT5zaXplOwotICAgICAgICAgZHN5LmZpZWxkX29mZiA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9yZWdpc3RlcjoKLSAgICBjYXNlIGNvZmZfd2hlcmVfdW5rbm93bjoKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RydGFnOgotCi0gICAgY2FzZSBjb2ZmX3doZXJlX2VudGFnOgotICAgIGNhc2UgY29mZl93aGVyZV90eXBlZGVmOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9yZWdpc3RlcikKLSAgICBkc3kucmVnID0gcm5hbWVzW3N5bWJvbC0+d2hlcmUtPm9mZnNldF07Ci0KLSAgc3dpdGNoIChzeW1ib2wtPnZpc2libGUtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl92aXNfY29tbW9uOgotICAgICAgLyogV2UgZG8gdGhpcyAnY2F1c2UgY29tbW9uIEMgc3ltYm9scyBhcmUgdHJlYXRlZCBhcyBleHRkZWZzICovCi0gICAgY2FzZSBjb2ZmX3Zpc19leHRfZGVmOgotICAgIGNhc2UgY29mZl92aXNfZXh0X3JlZjoKLQotICAgICAgZHN5LmVuYW1lID0gc3ltYm9sLT5uYW1lOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvZmZfdmlzX3JlZ3BhcmFtOgotICAgIGNhc2UgY29mZl92aXNfYXV0b3BhcmFtOgotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9QQVJBTUVURVI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29mZl92aXNfaW50X2RlZjoKLQotICAgIGNhc2UgY29mZl92aXNfYXV0bzoKLSAgICBjYXNlIGNvZmZfdmlzX3JlZ2lzdGVyOgotICAgIGNhc2UgY29mZl92aXNfdGFnOgotICAgIGNhc2UgY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdDoKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBkc3kuc2ZuID0gMDsKLSAgZHN5LnNsbiA9IDI7Ci0KLSAgZHN5Lm5lZyA9IDB4MTAwMTsKLQotCi0gIHN5c3JvZmZfc3dhcF9kc3lfb3V0IChmaWxlLCAmZHN5KTsKLQotICB3YWxrX3RyZWVfdHlwZSAoc2ZpbGUsIHN5bWJvbCwgc3ltYm9sLT50eXBlLCBuZXN0KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotd2Fsa190cmVlX3Njb3BlIChzZWN0aW9uLCBzZmlsZSwgc2NvcGUsIG5lc3QsIHR5cGUpCi0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnNjb3BlOwotICAgICBpbnQgbmVzdDsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqdmFyczsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKmNoaWxkOwotCi0gIGlmIChzY29wZS0+dmFyc19oZWFkCi0gICAgICB8fCAoc2NvcGUtPmxpc3RfaGVhZCAmJiBzY29wZS0+bGlzdF9oZWFkLT52YXJzX2hlYWQpKQotICAgIHsKLSAgICAgIHdyX2Rwc19zdGFydCAoc2ZpbGUsIHNlY3Rpb24sIHNjb3BlLCB0eXBlLCBuZXN0KTsKLQotICAgICAgaWYgKG5lc3QgPT0gMCkKLQl3cl9nbG9iYWxzICh0cmVlLCBzZmlsZSwgbmVzdCArIDEpOwotCi0gICAgICBmb3IgKHZhcnMgPSBzY29wZS0+dmFyc19oZWFkOyB2YXJzOyB2YXJzID0gdmFycy0+bmV4dCkKLQl7Ci0JICB3YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgc2VjdGlvbiwgdmFycywgbmVzdCk7Ci0JfQotCi0gICAgICBmb3IgKGNoaWxkID0gc2NvcGUtPmxpc3RfaGVhZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCi0JewotCSAgd2Fsa190cmVlX3Njb3BlIChzZWN0aW9uLCBzZmlsZSwgY2hpbGQsIG5lc3QgKyAxLCBCTE9DS19UWVBFX0JMT0NLKTsKLQl9Ci0KLSAgICAgIHdyX2Rwc19lbmQgKHNlY3Rpb24sIHNjb3BlLCB0eXBlKTsKLSAgICB9Ci19Ci1zdGF0aWMgdm9pZAotd2Fsa190cmVlX3NmaWxlIChzZWN0aW9uLCBzZmlsZSkKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotewotICB3YWxrX3RyZWVfc2NvcGUgKHNlY3Rpb24sIHNmaWxlLCBzZmlsZS0+c2NvcGUsIDAsIEJMT0NLX1RZUEVfQ09NUFVOSVQpOwotCi19Ci0KLXN0YXRpYyB2b2lkCi13cl9wcm9ncmFtX3N0cnVjdHVyZSAocCwgc2ZpbGUpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci17Ci0KLSAgd2Fsa190cmVlX3NmaWxlIChwLT5zZWN0aW9ucyArIDQsIHNmaWxlKTsKLQotfQotCi1zdGF0aWMgdm9pZAotd3JfZHUgKHAsIHNmaWxlLCBuKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgbjsKLXsKLSAgc3RydWN0IElUX2R1IGR1OwotICBpbnQgbGltOwotI2lmIDAKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gIHN0YXRpYyBpbnQgaW5jaXQgPSAweDUwMDAwMDsKLSAgaW50IHVzZWQgPSAwOwotI2VuZGlmCi0gIGludCBpOwotICBpbnQgajsKLSAgdW5zaWduZWQgaW50ICpsb3dlc3QgPSAodW5zaWduZWQgKikgbmludHMgKHAtPm5zZWN0aW9ucyk7Ci0gIHVuc2lnbmVkIGludCAqaGlnaGVzdCA9ICh1bnNpZ25lZCAqKSBuaW50cyAocC0+bnNlY3Rpb25zKTsKLSAgZHUuZm9ybWF0ID0gYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCA/IDAgOiAxOwotICBkdS5vcHRpbWl6ZWQgPSAwOwotICBkdS5zdGFja2ZybXQgPSAwOwotICBkdS5zcGFyZSA9IDA7Ci0gIGR1LnVuaXQgPSBuOwotICBkdS5zZWN0aW9ucyA9IHAtPm5zZWN0aW9ucyAtIDE7Ci0gIGR1LnNhbiA9IChpbnQgKikgeGNhbGxvYyAoc2l6ZW9mIChpbnQpLCBkdS5zZWN0aW9ucyk7Ci0gIGR1LmFkZHJlc3MgPSBuaW50cyAoZHUuc2VjdGlvbnMpOwotICBkdS5sZW5ndGggPSBuaW50cyAoZHUuc2VjdGlvbnMpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBkdS5zZWN0aW9uczsgaSsrKQotICAgIHsKLSAgICAgIGxvd2VzdFtpXSA9IH4wOwotICAgICAgaGlnaGVzdFtpXSA9IDA7Ci0gICAgfQotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMgYW5kIHRyeSBhbmQgd29yayBvdXQgdGhlIGV4dGVudHMgaW4gdGhpcwotICAgICBzb3VyY2UgZmlsZSAqLwotI2lmIDAKLSAgZm9yIChzeW1ib2wgPSBzZmlsZS0+c2NvcGUtPnZhcnNfaGVhZDsKLSAgICAgICBzeW1ib2w7Ci0gICAgICAgc3ltYm9sID0gc3ltYm9sLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9zZWNkZWZfdHlwZSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbG93ID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OwotCSAgdW5zaWduZWQgaW50IGhpZ2ggPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQgKyBzeW1ib2wtPnR5cGUtPnNpemUgLSAxOwotCSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbiA9IHN5bWJvbC0+d2hlcmUtPnNlY3Rpb247Ci0KLQkgIGludCBzbiA9IHNlY3Rpb24tPm51bWJlcjsKLQkgIGlmIChsb3cgPCBsb3dlc3Rbc25dKQotCSAgICBsb3dlc3Rbc25dID0gbG93OwotCSAgaWYgKGhpZ2ggPiBoaWdoZXN0W3NuXSkKLQkgICAgaGlnaGVzdFtzbl0gPSBoaWdoOwotCX0KLSAgICB9Ci0KLQotICBmb3IgKGkgPSAwOyBpIDwgZHUuc2VjdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaGlnaGVzdFtpXSA9PSAwKQotCXsKLQkgIGxvd2VzdFtpXSA9IGhpZ2hlc3RbaV0gPSBpbmNpdDsKLQl9Ci0gICAgICBkdS5zYW5bdXNlZF0gPSBpOwotICAgICAgZHUubGVuZ3RoW3VzZWRdID0gaGlnaGVzdFtpXSAtIGxvd2VzdFtpXTsKLSAgICAgIGR1LmFkZHJlc3NbdXNlZF0gPSBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QID8gbG93ZXN0W2ldIDogMDsKLSAgICAgIGlmIChkZWJ1ZykKLQl7Ci0JICBwcmludGYgKCIgc2VjdGlvbiAlNnMgMHglMDh4Li4weCUwOHhcbiIsCi0JCSAgcC0+c2VjdGlvbnNbaSArIDFdLm5hbWUsCi0JCSAgbG93ZXN0W2ldLAotCQkgIGhpZ2hlc3RbaV0pOwotCX0KLSAgICAgIHVzZWQrKzsKLSAgICB9Ci0KLSNlbmRpZgotICBsaW0gPSBkdS5zZWN0aW9uczsKLSAgZm9yIChqID0gMDsgaiA8IGxpbTsgaisrKQotICAgIHsKLSAgICAgIGludCBzcmMgPSBqOwotICAgICAgaW50IGRzdCA9IGo7Ci0gICAgICBkdS5zYW5bZHN0XSA9IGRzdDsKLSAgICAgIGlmIChzZmlsZS0+c2VjdGlvbltzcmNdLmluaXQpCi0JewotCSAgZHUubGVuZ3RoW2RzdF0KLQkgICAgPSBzZmlsZS0+c2VjdGlvbltzcmNdLmhpZ2ggLSBzZmlsZS0+c2VjdGlvbltzcmNdLmxvdyArIDE7Ci0JICBkdS5hZGRyZXNzW2RzdF0KLQkgICAgPSBzZmlsZS0+c2VjdGlvbltzcmNdLmxvdzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZHUubGVuZ3RoW2RzdF0gPSAwOwotCSAgZHUuYWRkcmVzc1tkc3RdID0gMDsKLQl9Ci0gICAgICBpZiAoZGVidWcpCi0JewotCSAgaWYgKHNmaWxlLT5zZWN0aW9uW3NyY10ucGFyZW50KQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiIHNlY3Rpb24gJTZzIDB4JTA4eC4uMHglMDh4XG4iLAotCQkgICAgICBzZmlsZS0+c2VjdGlvbltzcmNdLnBhcmVudC0+bmFtZSwKLQkJICAgICAgZHUuYWRkcmVzc1tkc3RdLAotCQkgICAgICBkdS5hZGRyZXNzW2RzdF0gKyBkdS5sZW5ndGhbZHN0XSAtIDEpOwotCSAgICB9Ci0JfQotICAgICAgZHUuc2VjdGlvbnMgPSBkc3QgKyAxOwotICAgIH0KLQotICBkdS50b29sID0gImNfZ2NjIjsKLSAgZHUuZGF0ZSA9IERBVEU7Ci0KLSAgc3lzcm9mZl9zd2FwX2R1X291dCAoZmlsZSwgJmR1KTsKLX0KLQotc3RhdGljIHZvaWQKLXdyX2R1cyAocCwgc2ZpbGUpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci17Ci0KLSAgc3RydWN0IElUX2R1cyBkdXM7Ci0KLSAgZHVzLmVmbiA9IDB4MTAwMTsKLSAgZHVzLm5zID0gMTsJCQkvKiBwLT5uc291cmNlczsgc2FjIDE0IGp1bCA5NCAqLwotICBkdXMuZHJiID0gbmludHMgKGR1cy5ucyk7Ci0gIGR1cy5mbmFtZSA9IChjaGFyICoqKSB4Y2FsbG9jIChzaXplb2YgKGNoYXIgKiksIGR1cy5ucyk7Ci0gIGR1cy5zcGFyZSA9IG5pbnRzIChkdXMubnMpOwotICBkdXMubmRpciA9IDA7Ci0gIC8qIEZpbmQgdGhlIGZpbGVuYW1lcyAqLwotI2lmIDAKLSAgaSA9IDA7Ci0KLSAgZm9yIChzZmlsZSA9IHAtPnNvdXJjZV9oZWFkOwotICAgICAgIHNmaWxlOwotICAgICAgIHNmaWxlID0gc2ZpbGUtPm5leHQpCi0gICAgewotICAgICAgZHVzLmRyYltpXSA9IDA7Ci0gICAgICBkdXMuc3BhcmVbaV0gPSAwOwotICAgICAgZHVzLmZuYW1lW2ldID0gc2ZpbGUtPm5hbWU7Ci0gICAgICBpKys7Ci0gICAgfQotI2Vsc2UKLSAgZHVzLmRyYlswXSA9IDA7Ci0gIGR1cy5mbmFtZVswXSA9IHNmaWxlLT5uYW1lOwotI2VuZGlmCi0KLSAgc3lzcm9mZl9zd2FwX2R1c19vdXQgKGZpbGUsICZkdXMpOwotCi19Ci0KLS8qIEZpbmQgdGhlIG9mZnNldCBvZiB0aGUgLnRleHQgc2VjdGlvbiBmb3IgdGhpcyBzZmlsZSBpbiB0aGUKLSAgIC50ZXh0IHNlY3Rpb24gZm9yIHRoZSBvdXRwdXQgZmlsZSAqLwotCi1zdGF0aWMgaW50Ci1maW5kX2Jhc2UgKHNmaWxlLCBzZWN0aW9uKQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHJldHVybiBzZmlsZS0+c2VjdGlvbltzZWN0aW9uLT5udW1iZXJdLmxvdzsKLX0KLXN0YXRpYyB2b2lkCi13cl9kbG4gKHAsIHNmaWxlLCBuKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgbjsKLQotewotI2lmIDAKLSAgaWYgKG4gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBDb3VudCB1cCBhbGwgdGhlIGxpbmVudW1iZXJzICovCi0gICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5OwotICAgICAgaW50IGxjID0gMDsKLSAgICAgIHN0cnVjdCBJVF9kbG4gZGxuOwotCi0gICAgICBpbnQgaWR4OwotCi0gICAgICBmb3IgKHN5ID0gcC0+c3ltYm9sX2xpc3RfaGVhZDsKLQkgICBzeTsKLQkgICBzeSA9IHN5LT5uZXh0X2luX29maWxlX2xpc3QpCi0JewotCSAgc3RydWN0IGNvZmZfdHlwZSAqdCA9IHN5LT50eXBlOwotCSAgaWYgKHQtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGNvZmZfbGluZSAqbCA9IHQtPnUuZnVuY3Rpb24ubGluZXM7Ci0JICAgICAgbGMgKz0gbC0+bmxpbmVzOwotCSAgICB9Ci0JfQotCi0gICAgICBkbG4uc2ZuID0gbmludHMgKGxjKTsKLSAgICAgIGRsbi5zbG4gPSBuaW50cyAobGMpOwotICAgICAgZGxuLmxsbiA9IG5pbnRzIChsYyk7Ci0gICAgICBkbG4uc2VjdGlvbiA9IG5pbnRzIChsYyk7Ci0KLSAgICAgIGRsbi5mcm9tX2FkZHJlc3MgPSBuaW50cyAobGMpOwotICAgICAgZGxuLnRvX2FkZHJlc3MgPSBuaW50cyAobGMpOwotCi0KLSAgICAgIGRsbi5uZWcgPSAweDEwMDE7Ci0KLSAgICAgIGRsbi5ubG4gPSBsYzsKLQotICAgICAgLyogUnVuIHRocm91Z2ggb25jZSBtb3JlIGFuZCBmaWxsIHVwIHRoZSBzdHJ1Y3R1cmUgKi8KLSAgICAgIGlkeCA9IDA7Ci0gICAgICBmb3IgKHN5ID0gcC0+c3ltYm9sX2xpc3RfaGVhZDsKLQkgICBzeTsKLQkgICBzeSA9IHN5LT5uZXh0X2luX29maWxlX2xpc3QpCi0JewotCSAgaWYgKHN5LT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLQkgICAgewotCSAgICAgIGludCBpOwotCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmUgKmwgPSBzeS0+dHlwZS0+dS5mdW5jdGlvbi5saW5lczsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgbC0+bmxpbmVzOyBpKyspCi0JCXsKLQkJICBkbG4uc2VjdGlvbltpZHhdID0gc3ktPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0JCSAgZGxuLnNmbltpZHhdID0gbjsKLQkJICBkbG4uc2xuW2lkeF0gPSBsLT5saW5lc1tpXTsKLQkJICBkbG4uZnJvbV9hZGRyZXNzW2lkeF0gPSBsLT5hZGRyZXNzZXNbaV07Ci0JCSAgaWYgKGlkeCkKLQkJICAgIGRsbi50b19hZGRyZXNzW2lkeCAtIDFdID0gZGxuLmZyb21fYWRkcmVzc1tpZHhdOwotCQkgIGlkeCsrOwotCQl9Ci0JICAgIH0KLQkgIG4rKzsKLQl9Ci0gICAgICBzeXNyb2ZmX3N3YXBfZGxuX291dCAoZmlsZSwgJmRsbik7Ci0gICAgfQotCi0jZW5kaWYKLSNpZiAxCi0gIC8qIENvdW50IHVwIGFsbCB0aGUgbGluZW51bWJlcnMgKi8KLQotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5OwotICBpbnQgbGMgPSAwOwotICBzdHJ1Y3QgSVRfZGxuIGRsbjsKLQotICBpbnQgaWR4OwotCi0gIGZvciAoc3kgPSBzZmlsZS0+c2NvcGUtPnZhcnNfaGVhZDsKLSAgICAgICBzeTsKLSAgICAgICBzeSA9IHN5LT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnQgPSBzeS0+dHlwZTsKLSAgICAgIGlmICh0LT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLQl7Ci0JICBzdHJ1Y3QgY29mZl9saW5lICpsID0gdC0+dS5mdW5jdGlvbi5saW5lczsKLQkgIGlmIChsKQotCSAgICBsYyArPSBsLT5ubGluZXM7Ci0JfQotICAgIH0KLQotICBkbG4uc2ZuID0gbmludHMgKGxjKTsKLSAgZGxuLnNsbiA9IG5pbnRzIChsYyk7Ci0gIGRsbi5jYyA9IG5pbnRzIChsYyk7Ci0gIGRsbi5zZWN0aW9uID0gbmludHMgKGxjKTsKLQotICBkbG4uZnJvbV9hZGRyZXNzID0gbmludHMgKGxjKTsKLSAgZGxuLnRvX2FkZHJlc3MgPSBuaW50cyAobGMpOwotCi0KLSAgZGxuLm5lZyA9IDB4MTAwMTsKLQotICBkbG4ubmxuID0gbGM7Ci0KLSAgLyogUnVuIHRocm91Z2ggb25jZSBtb3JlIGFuZCBmaWxsIHVwIHRoZSBzdHJ1Y3R1cmUgKi8KLSAgaWR4ID0gMDsKLSAgZm9yIChzeSA9IHNmaWxlLT5zY29wZS0+dmFyc19oZWFkOwotICAgICAgIHN5OwotICAgICAgIHN5ID0gc3ktPm5leHQpCi0gICAgewotICAgICAgaWYgKHN5LT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLQl7Ci0JICBpbnQgaTsKLQkgIHN0cnVjdCBjb2ZmX2xpbmUgKmwgPSBzeS0+dHlwZS0+dS5mdW5jdGlvbi5saW5lczsKLQkgIGlmIChsKQotCSAgICB7Ci0JICAgICAgaW50IGJhc2UgPSBmaW5kX2Jhc2UgKHNmaWxlLCBzeS0+d2hlcmUtPnNlY3Rpb24pOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBsLT5ubGluZXM7IGkrKykKLQkJewotCQkgIGRsbi5zZWN0aW9uW2lkeF0gPSBzeS0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQkJICBkbG4uc2ZuW2lkeF0gPSAwOwotCQkgIGRsbi5zbG5baWR4XSA9IGwtPmxpbmVzW2ldOwotCQkgIGRsbi5mcm9tX2FkZHJlc3NbaWR4XSA9Ci0JCSAgICBsLT5hZGRyZXNzZXNbaV0gKyBzeS0+d2hlcmUtPnNlY3Rpb24tPmFkZHJlc3MgLSBiYXNlOwotCQkgIGRsbi5jY1tpZHhdID0gMDsKLQkJICBpZiAoaWR4KQotCQkgICAgZGxuLnRvX2FkZHJlc3NbaWR4IC0gMV0gPSBkbG4uZnJvbV9hZGRyZXNzW2lkeF07Ci0JCSAgaWR4Kys7Ci0KLQkJfQotCSAgICAgIGRsbi50b19hZGRyZXNzW2lkeCAtIDFdID0gZGxuLmZyb21fYWRkcmVzc1tpZHggLSAxXSArIDI7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAobGMpCi0gICAgc3lzcm9mZl9zd2FwX2Rsbl9vdXQgKGZpbGUsICZkbG4pOwotI2VuZGlmCi19Ci0KLS8qIFdyaXRlIHRoZSBnbG9iYWwgc3ltYm9scyBvdXQgdG8gdGhlIGRlYnVnIGluZm8gKi8KLXN0YXRpYyB2b2lkCi13cl9nbG9iYWxzIChwLCBzZmlsZSwgbikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IG47Ci17Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3k7Ci0gIGZvciAoc3kgPSBwLT5zeW1ib2xfbGlzdF9oZWFkOwotICAgICAgIHN5OwotICAgICAgIHN5ID0gc3ktPm5leHRfaW5fb2ZpbGVfbGlzdCkKLSAgICB7Ci0gICAgICBpZiAoc3ktPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X2RlZgotCSAgfHwgc3ktPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X3JlZikKLQl7Ci0JICAvKiBPbmx5IHdyaXRlIG91dCBzeW1ib2xzIGlmIHRoZXkgYmVsb25nIHRvCi0JICAgICB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSAqLwotCSAgaWYgKHN5LT5zZmlsZSA9PSBzZmlsZSkKLQkgICAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIDAsIHN5LCAwKTsKLQotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9kZWJ1ZyAocCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci17Ci0gIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgaW50IG4gPSAwOwotICBmb3IgKHNmaWxlID0gcC0+c291cmNlX2hlYWQ7Ci0gICAgICAgc2ZpbGU7Ci0gICAgICAgc2ZpbGUgPSBzZmlsZS0+bmV4dCkKLQotICAgIHsKLSAgICAgIGlmIChkZWJ1ZykKLQl7Ci0JICBwcmludGYgKCIlc1xuIiwgc2ZpbGUtPm5hbWUpOwotCX0KLSAgICAgIHdyX2R1IChwLCBzZmlsZSwgbik7Ci0gICAgICB3cl9kdXMgKHAsIHNmaWxlKTsKLSAgICAgIHdyX3Byb2dyYW1fc3RydWN0dXJlIChwLCBzZmlsZSk7Ci0gICAgICB3cl9kbG4gKHAsIHNmaWxlLCBuKTsKLSAgICAgIG4rKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9jcyAoKQotewotICAvKiBJdCBzZWVtcyB0aGF0IHRoZSBDUyBzdHJ1Y3QgaXMgbm90IG5vcm1hbCAtIHRoZSBzaXplIGlzIHdyb25nCi0gICAgIGhlcmVzIG9uZSBJIHByZXBhcmVkIGVhcmxpZXIuLiAqLwotICBzdGF0aWMgY2hhciBiW10gPSB7Ci0gICAgMHg4MCwJCQkvKiBJVCAqLwotICAgIDB4MjEsCQkJLyogUkwgKi8KLSAgICAweDAwLAkJCS8qIG51bWJlciBvZiBjaGFycyBpbiB2YXJpYWJsZSBsZW5ndGggcGFydCAqLwotICAgIDB4ODAsCQkJLyogaGQgKi8gCi0gICAgMHgwMCwJCQkvKiBocyAqLyAKLSAgICAweDgwLAkJCS8qIHVuICovIAotICAgIDB4MDAsCQkJLyogdXMgKi8gCi0gICAgMHg4MCwJCQkvKiBzYyAqLyAKLSAgICAweDAwLAkJCS8qIHNzICovIAotICAgIDB4ODAsCQkJLyogZXIgKi8gCi0gICAgMHg4MCwJCQkvKiBlZCAqLyAKLSAgICAweDgwLAkJCS8qIHNoICovIAotICAgIDB4ODAsCQkJLyogb2IgKi8gCi0gICAgMHg4MCwJCQkvKiBybCAqLyAKLSAgICAweDgwLAkJCS8qIGR1ICovCi0gICAgMHg4MCwJCQkvKiBkcHMgKi8KLSAgICAweDgwLAkJCS8qIGRzeSAqLwotICAgIDB4ODAsCQkJLyogZHR5ICovCi0gICAgMHg4MCwJCQkvKiBkbG4gKi8KLSAgICAweDgwLAkJCS8qIGRzbyAqLwotICAgIDB4ODAsCQkJLyogZHVzICovCi0gICAgMHgwMCwJCQkvKiBkc3MgKi8KLSAgICAweDgwLAkJCS8qIGRidCAqLwotICAgIDB4MDAsCQkJLyogZHBwICovCi0gICAgMHg4MCwJCQkvKiBkZnAgKi8KLSAgICAweDgwLAkJCS8qIGRlbiAqLwotICAgIDB4ODAsCQkJLyogZGRzICovCi0gICAgMHg4MCwJCQkvKiBkYXIgKi8KLSAgICAweDgwLAkJCS8qIGRwdCAqLwotICAgIDB4MDAsCQkJLyogZHVsICovCi0gICAgMHgwMCwJCQkvKiBkc2UgKi8KLSAgICAweDAwLAkJCS8qIGRvdCAqLwotICAgIDB4REUJCQkvKiBDUyAqLwotICB9OwotICBmd3JpdGUgKGIsIDEsIHNpemVvZiAoYiksIGZpbGUpOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIFNDIHJlY29yZHMgZm9yIGEgdW5pdC4gIENyZWF0ZSBhbiBTQwotICAgZm9yIGFsbCB0aGUgc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIHRoZSBvdXRwdXQgZmlsZSwgZXZlbgotICAgaWYgdGhlcmUgaXNuJ3QgYW4gZXF1aXZhbGVudCBvbmUgb24gdGhlIGlucHV0ICovCi0KLXN0YXRpYyBpbnQKLXdyX3NjIChwdHIsIHNmaWxlKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci17Ci0gIGludCBpOwotaW50IHNjb3VudCA9IDA7Ci0gIC8qIEZpcnN0IHdvcmsgb3V0IHRoZSB0b3RhbCBudW1iZXIgb2Ygc2VjdGlvbnMgKi8KLQotICBpbnQgdG90YWxfc2VjID0gcHRyLT5uc2VjdGlvbnM7Ci0KLSAgc3RydWN0IG15aW5mbwotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgIH07Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotCi0gIHN0cnVjdCBteWluZm8gKmluZm8KLSAgICA9IChzdHJ1Y3QgbXlpbmZvICopIGNhbGxvYyAodG90YWxfc2VjLCBzaXplb2YgKHN0cnVjdCBteWluZm8pKTsKLQotCi0KLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3NlYzsgaSsrKQotICAgIHsKLSAgICAgIGluZm9baV0uc2VjID0gcHRyLT5zZWN0aW9ucyArIGk7Ci0gICAgICBpbmZvW2ldLnN5bWJvbCA9IDA7Ci0gICAgfQotCi0gIGZvciAoc3ltYm9sID0gc2ZpbGUtPnNjb3BlLT52YXJzX2hlYWQ7Ci0gICAgICAgc3ltYm9sOwotICAgICAgIHN5bWJvbCA9IHN5bWJvbC0+bmV4dCkKLSAgICB7Ci0KLSAgICAgIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9zZWNkZWZfdHlwZSkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfc2VjOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3ltYm9sLT53aGVyZS0+c2VjdGlvbiA9PSBpbmZvW2ldLnNlYykKLQkJewotCQkgIGluZm9baV0uc3ltYm9sID0gc3ltYm9sOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBvdXRwdXQgYWxsIHRoZSBzZWN0aW9uIGluZm8sIGFuZCBmYWtlIHVwIHNvbWUgc3R1ZmYgZm9yIHNlY3Rpb25zCi0gICAgIHdlIGRvbid0IGhhdmUgKi8KLQotICBmb3IgKGkgPSAxOyBpIDwgdG90YWxfc2VjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IElUX3NjIHNjOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIHN5bWJvbCA9IGluZm9baV0uc3ltYm9sOwotICAgICAgc2Muc3BhcmUgPSAwOwotICAgICAgc2Muc3BhcmUxID0gMDsKLSAgICAgIGlmICghc3ltYm9sKQotCXsKLQkgIC8qIERvbid0IGhhdmUgYSBzeW1ib2wgc2V0IGFzaWRlIGZvciB0aGlzIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgbm90aGluZwotCSAgICAgaW4gdGhpcyBmaWxlIGRvZXMgYW55dGhpbmcgZm9yIHRoZSBzZWN0aW9uLiAqLwotCSAgc2MuZm9ybWF0ID0gIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKTsKLQkgIHNjLmFkZHIgPSAwOwotCSAgc2MubGVuZ3RoID0gMDsKLQkgIG5hbWUgPSBpbmZvW2ldLnNlYy0+bmFtZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1ApCi0JICAgIHsKLQkgICAgICBzYy5mb3JtYXQgPSAwOwotCSAgICAgIHNjLmFkZHIgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNjLmZvcm1hdCA9IDE7Ci0JICAgICAgc2MuYWRkciA9IDA7Ci0JICAgIH0KLQkgIHNjLmxlbmd0aCA9IHN5bWJvbC0+dHlwZS0+c2l6ZTsKLQkgIG5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0JfQotCi0gICAgICBzYy5hbGlnbiA9IDQ7Ci0KLSAgICAgIHNjLmNvbmNhdCA9IENPTkNBVF9TSU1QTEU7Ci0gICAgICBzYy5yZWFkID0gMzsKLSAgICAgIHNjLndyaXRlID0gMzsKLSAgICAgIHNjLmV4ZWMgPSAzOwotICAgICAgc2MuaW5pdCA9IDM7Ci0gICAgICBzYy5tb2RlID0gMzsKLSAgICAgIHNjLnNwYXJlID0gMDsKLSAgICAgIHNjLnNlZ2FkZCA9IDA7Ci0gICAgICBzYy5zcGFyZTEgPSAwOwkJLyogSWYgbm90IHplcm8sIHRoZW4gaXQgZG9lc24ndCB3b3JrICovCi0gICAgICBzYy5uYW1lID0gc2VjdGlvbl90cmFuc2xhdGUgKG5hbWUpOwotICAgICAgaWYgKHN0cmxlbiAoc2MubmFtZSkgPT0gMSkKLQl7Ci0JICBzd2l0Y2ggKHNjLm5hbWVbMF0pCi0JICAgIHsKLQkgICAgY2FzZSAnRCc6Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIHNjLmNvbnRlbnRzID0gQ09OVEVOVFNfREFUQTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzYy5jb250ZW50cyA9IENPTlRFTlRTX0NPREU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2MuY29udGVudHMgPSBDT05URU5UU19DT0RFOwotCX0KLSNpZiAwCi0gICAgICAvKiBORVcgKi8KLSAgICAgIGlmIChzYy5sZW5ndGgpIHsKLSNlbmRpZgotCXN5c3JvZmZfc3dhcF9zY19vdXQgKGZpbGUsICZzYyk7Ci0Jc2NvdW50Kys7Ci0jaWYgMAotICAgICAgfQotI2VuZGlmCi0gICAgfQotcmV0dXJuIHNjb3VudDsKLX0KLQotCi0vKiBXcml0ZSBvdXQgdGhlIEVSIHJlY29yZHMgZm9yIGEgdW5pdC4gKi8KLXN0YXRpYyB2b2lkCi13cl9lciAocHRyLCBzZmlsZSwgZmlyc3QpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IGZpcnN0OwotewotICBpbnQgaWR4ID0gMDsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW07Ci0gIGlmIChmaXJzdCkKLSAgICB7Ci0gICAgICBmb3IgKHN5bSA9IHB0ci0+c3ltYm9sX2xpc3RfaGVhZDsgc3ltOyBzeW0gPSBzeW0tPm5leHRfaW5fb2ZpbGVfbGlzdCkKLQl7Ci0JICBpZiAoc3ltLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgSVRfZXIgZXI7Ci0JICAgICAgZXIuc3BhcmUgPSAwOwotCSAgICAgIGVyLnR5cGUgPSBFUl9OT1RTUEVDOwotCSAgICAgIGVyLm5hbWUgPSBzeW0tPm5hbWU7Ci0JICAgICAgc3lzcm9mZl9zd2FwX2VyX291dCAoZmlsZSwgJmVyKTsKLQkgICAgICBzeW0tPmVyX251bWJlciA9IGlkeCsrOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogV3JpdGUgb3V0IHRoZSBFRCByZWNvcmRzIGZvciBhIHVuaXQuICovCi1zdGF0aWMgdm9pZAotd3JfZWQgKHB0ciwgc2ZpbGUsIGZpcnN0KQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIGludCBmaXJzdDsKLXsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzOwotICBpZiAoZmlyc3QpCi0gICAgewotICAgICAgZm9yIChzID0gcHRyLT5zeW1ib2xfbGlzdF9oZWFkOyBzOyBzID0gcy0+bmV4dF9pbl9vZmlsZV9saXN0KQotCXsKLQkgIGlmIChzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9kZWYKLQkgICAgICB8fCBzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2NvbW1vbikKLQkgICAgewotCSAgICAgIHN0cnVjdCBJVF9lZCBlZDsKLQotCSAgICAgIGVkLnNlY3Rpb24gPSBzLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCSAgICAgIGVkLnNwYXJlID0gMDsKLQkgICAgICBpZiAocy0+d2hlcmUtPnNlY3Rpb24tPmRhdGEpCi0JCXsKLQkJICBlZC50eXBlID0gRURfVFlQRV9EQVRBOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocy0+d2hlcmUtPnNlY3Rpb24tPmNvZGUgJiBTRUNfQ09ERSkKLQkJewotCQkgIGVkLnR5cGUgPSBFRF9UWVBFX0VOVFJZOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZWQudHlwZSA9IEVEX1RZUEVfTk9UU1BFQzsKLQkJICBlZC50eXBlID0gRURfVFlQRV9EQVRBOwotCQl9Ci0JICAgICAgZWQuYWRkcmVzcyA9IHMtPndoZXJlLT5vZmZzZXQgLSBzLT53aGVyZS0+c2VjdGlvbi0+YWRkcmVzczsKLQkgICAgICBlZC5uYW1lID0gcy0+bmFtZTsKLQkgICAgICBzeXNyb2ZmX3N3YXBfZWRfb3V0IChmaWxlLCAmZWQpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyX3VuaXRfaW5mbyAocHRyKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotewotICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gIGludCBmaXJzdCA9IDE7Ci0gIGZvciAoc2ZpbGUgPSBwdHItPnNvdXJjZV9oZWFkOwotICAgICAgIHNmaWxlOwotICAgICAgIHNmaWxlID0gc2ZpbGUtPm5leHQpCi0gICAgewotICAgICAgbG9uZyBwMTsKLSAgICAgIGxvbmcgcDI7Ci0gICAgICBpbnQgbnNlY3M7Ci0gICAgICBwMSA9IGZ0ZWxsIChmaWxlKTsKLSAgICAgIHdyX3VuIChwdHIsIHNmaWxlLCBmaXJzdCwgMCk7Ci0gICAgICBuc2VjcyA9IHdyX3NjIChwdHIsIHNmaWxlKTsKLSAgICAgIHAyID0gZnRlbGwgKGZpbGUpOwotICAgICAgZnNlZWsgKGZpbGUsIHAxLCBTRUVLX1NFVCk7Ci0gICAgICB3cl91biAocHRyLCBzZmlsZSwgZmlyc3QsIG5zZWNzKTsKLSAgICAgIGZzZWVrIChmaWxlLCBwMiwgU0VFS19TRVQpOyAKLSAgICAgIHdyX2VyIChwdHIsIHNmaWxlLCBmaXJzdCk7Ci0gICAgICB3cl9lZCAocHRyLCBzZmlsZSwgZmlyc3QpOwotICAgICAgZmlyc3QgPSAwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyX21vZHVsZSAocCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci17Ci0gIHdyX2NzICgpOwotICB3cl9oZCAocCk7Ci0gIHdyX3VuaXRfaW5mbyAocCk7Ci0gIHdyX29iamVjdF9ib2R5IChwKTsKLSAgd3JfZGVidWcgKHApOwotICB3cl90ciAoKTsKLX0KLQotc3RhdGljIGludAotYWxpZ24gKHgpCi0gICAgIGludCB4OwotewotICByZXR1cm4gKHggKyAzKSAmIH4zOwotfQotCi0vKiBGaW5kIGFsbCB0aGUgY29tbW9uIHZhcmlhYmxlcyBhbmQgdHVybiB0aGVtIGludG8KLSAgIG9yZGluYXJ5IGRlZnMgLSBkdW5ubyB3aHksIGJ1dCB0aGF0cyB3aGF0IGhpdGFjaGkgZG9lcyB3aXRoICdlbSAqLwotCi1zdGF0aWMgdm9pZAotcHJlc2NhbiAodHJlZSkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnRyZWU7Ci17Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqczsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqY29tbW9uX3NlY3Rpb247Ci0gIC8qIEZpbmQgdGhlIGNvbW1vbiBzZWN0aW9uIC0gYWx3YXlzIHNlY3Rpb24gMyAqLwotICBjb21tb25fc2VjdGlvbiA9IHRyZWUtPnNlY3Rpb25zICsgMzsKLSAgZm9yIChzID0gdHJlZS0+c3ltYm9sX2xpc3RfaGVhZDsKLSAgICAgICBzOwotICAgICAgIHMgPSBzLT5uZXh0X2luX29maWxlX2xpc3QpCi0gICAgewotICAgICAgaWYgKHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfY29tbW9uKQotCXsKLQkgIHN0cnVjdCBjb2ZmX3doZXJlICp3ID0gcy0+d2hlcmU7Ci0JICAvKiAgICAgIHMtPnZpc2libGUtPnR5cGUgPSBjb2ZmX3Zpc19leHRfZGVmOyBsZWF2ZSBpdCBhcyBjb21tb24gKi8KLQkgIGNvbW1vbl9zZWN0aW9uLT5zaXplID0gYWxpZ24gKGNvbW1vbl9zZWN0aW9uLT5zaXplKTsKLQkgIHctPm9mZnNldCA9IGNvbW1vbl9zZWN0aW9uLT5zaXplICsgY29tbW9uX3NlY3Rpb24tPmFkZHJlc3M7Ci0JICB3LT5zZWN0aW9uID0gY29tbW9uX3NlY3Rpb247Ci0JICBjb21tb25fc2VjdGlvbi0+c2l6ZSArPSBzLT50eXBlLT5zaXplOwotCSAgY29tbW9uX3NlY3Rpb24tPnNpemUgPSBhbGlnbiAoY29tbW9uX3NlY3Rpb24tPnNpemUpOwotCX0KLSAgICB9Ci19Ci0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiVXNhZ2U6ICVzIFstZGhWcV0gaW4tZmlsZSBbb3V0LWZpbGVdXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXNob3dfaGVscCAoKQotewotICBwcmludGYgKF8oIiVzOiBDb252ZXJ0IGEgQ09GRiBvYmplY3QgZmlsZSBpbnRvIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIiksCi0JICBwcm9ncmFtX25hbWUpOwotICBzaG93X3VzYWdlIChzdGRvdXQsIDApOwotfQotCi0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqYXZbXTsKLXsKLSAgaW50IG9wdDsKLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotICB7Ci0gICAgeyJkZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnZCd9LAotICAgIHsicXVpY2siLCBub19hcmd1bWVudCwgMCwgJ3EnfSwKLSAgICB7Im5vcHJlc2NhbiIsIG5vX2FyZ3VtZW50LCAwLCAnbid9LAotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgMCwgMH0KLSAgfTsKLSAgY2hhciAqKm1hdGNoaW5nOwotICBjaGFyICppbnB1dF9maWxlOwotICBjaGFyICpvdXRwdXRfZmlsZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiZGhWcW4iLCBsb25nX29wdGlvbnMsCi0JCQkgICAgIChpbnQgKikgTlVMTCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAncSc6Ci0JICBxdWljayA9IDE7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIG5vcHJlc2NhbiA9IDE7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRlYnVnID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgc2hvd19oZWxwICgpOwotCSAgLypOT1RSRUFDSEVEICovCi0JY2FzZSAnVic6Ci0JICBwcmludGYgKF8oIkdOVSAlcyB2ZXJzaW9uICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBQUk9HUkFNX1ZFUlNJT04pOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQgKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCAqLwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbWF5IGJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICBvdXRwdXRfZmlsZSA9IE5VTEw7Ci0gIGlmIChvcHRpbmQgPCBhYykKLSAgICB7Ci0gICAgICBpbnB1dF9maWxlID0gYXZbb3B0aW5kXTsKLSAgICAgICsrb3B0aW5kOwotICAgICAgaWYgKG9wdGluZCA8IGFjKQotCXsKLQkgIG91dHB1dF9maWxlID0gYXZbb3B0aW5kXTsKLQkgICsrb3B0aW5kOwotCSAgaWYgKG9wdGluZCA8IGFjKQotCSAgICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgaWYgKHN0cmNtcCAoaW5wdXRfZmlsZSwgb3V0cHV0X2ZpbGUpID09IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtdXN0IGJlIGRpZmZlcmVudFxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGlucHV0X2ZpbGUgPSAwOwotCi0gIGlmICghaW5wdXRfZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKCFvdXRwdXRfZmlsZSkKLSAgICB7Ci0gICAgICAvKiBUYWtlIGEgLm8gb2ZmIHRoZSBpbnB1dCBmaWxlIGFuZCBzdGljayBvbiBhIC5vYmouICBJZgotICAgICAgICAgaXQgZG9lc24ndCBlbmQgaW4gLm8sIHRoZW4gc3RpY2sgYSAub2JqIG9uIGFueXdheSAqLwotCi0gICAgICBpbnQgbGVuID0gc3RybGVuIChpbnB1dF9maWxlKTsKLSAgICAgIG91dHB1dF9maWxlID0geG1hbGxvYyAobGVuICsgNSk7Ci0gICAgICBzdHJjcHkgKG91dHB1dF9maWxlLCBpbnB1dF9maWxlKTsKLSAgICAgIGlmIChsZW4gPiAzCi0JICAmJiBvdXRwdXRfZmlsZVtsZW4gLSAyXSA9PSAnLicKLQkgICYmIG91dHB1dF9maWxlW2xlbiAtIDFdID09ICdvJykKLQl7Ci0JICBvdXRwdXRfZmlsZVtsZW5dID0gJ2InOwotCSAgb3V0cHV0X2ZpbGVbbGVuICsgMV0gPSAnaic7Ci0JICBvdXRwdXRfZmlsZVtsZW4gKyAyXSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cmNhdCAob3V0cHV0X2ZpbGUsICIub2JqIik7Ci0JfQotICAgIH0KLQotICBhYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlLCAwKTsKLQotICBpZiAoIWFiZmQpCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLQotICBpZiAoIWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZmlsZSA9IGZvcGVuIChvdXRwdXRfZmlsZSwgRk9QRU5fV0IpOwotCi0gIGlmICghZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgb3V0cHV0X2ZpbGUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChkZWJ1ZykKLSAgICBwcmludGYgKCJpZHMgJWQgJWRcbiIsIGJhc2UxLCBiYXNlMik7Ci0gIHRyZWUgPSBjb2ZmX2dyb2sgKGFiZmQpOwotICBpZiAoIW5vcHJlc2NhbikKLSAgICBwcmVzY2FuICh0cmVlKTsKLSAgd3JfbW9kdWxlICh0cmVlKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zdGFicy5jIGIvYmludXRpbHMvc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyMGVkMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIwOSArMCwwIEBACi0vKiBzdGFicy5jIC0tIFBhcnNlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIHBhcnNlcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBUaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGUgZ2RiIHN0YWJzIHJlYWRpbmcKLSAgIGNvZGUuICBUaGUgam9iIGl0IGRvZXMgaXMgc29tZXdoYXQgZGlmZmVyZW50LCBiZWNhdXNlIGl0IGlzIG5vdAotICAgdHJ5aW5nIHRvIGlkZW50aWZ5IHRoZSBjb3JyZWN0IGFkZHJlc3MgZm9yIGFueXRoaW5nLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi0vKiBNZWFuaW5nbGVzcyBkZWZpbml0aW9uIG5lZWRzIGJ5IGFvdXQ2NC5oLiAgRklYTUUuICAqLwotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnXFwnCi0jZWxzZQotI2RlZmluZSBESVJfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBwcmVkZWZpbmVkIFhDT0ZGIHR5cGVzLiAgKi8KLQotI2RlZmluZSBYQ09GRl9UWVBFX0NPVU5UIDM0Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYXMgYSBoYW5kbGUgc28gdGhhdCB0aGUgc3RhYiBwYXJzaW5nIGRvZXNuJ3QKLSAgIG5lZWQgdG8gdXNlIGFueSBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLQotc3RydWN0IHN0YWJfaGFuZGxlCi17Ci0gIC8qIFRoZSBCRkQuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIFRydWUgaWYgdGhpcyBpcyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gc2VjdGlvbnM7Ci0gIC8qIFRoZSBzeW1ib2wgdGFibGUuICAqLwotICBhc3ltYm9sICoqc3ltczsKLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgLyogVGhlIGFjY3VtdWxhdGVkIGZpbGUgbmFtZSBzdHJpbmcuICAqLwotICBjaGFyICpzb19zdHJpbmc7Ci0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBOX1NPIHN5bWJvbC4gICovCi0gIGJmZF92bWEgc29fdmFsdWU7Ci0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBmaWxlCi0gICAgIHJlbGF0aXZlIE5fTEJSQUMgYW5kIE5fUkJSQUMgc3ltYm9scy4gICovCi0gIGJmZF92bWEgZmlsZV9zdGFydF9vZmZzZXQ7Ci0gIC8qIFRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgc28gdGhhdCB3ZSBjYW4gaGFuZGxlCi0gICAgIGZ1bmN0aW9uIHJlbGF0aXZlIE5fTEJSQUMgYW5kIE5fUkJSQUMgc3ltYm9scy4gICovCi0gIGJmZF92bWEgZnVuY3Rpb25fc3RhcnRfb2Zmc2V0OwotICAvKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgZ2NjIHdoaWNoIGNvbXBpbGVkIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uCi0gICAgIHVuaXQsIDAgaWYgbm90IGNvbXBpbGVkIGJ5IGdjYy4gICovCi0gIGludCBnY2NfY29tcGlsZWQ7Ci0gIC8qIFdoZXRoZXIgYW4gTl9PUFQgc3ltYm9sIHdhcyBzZWVuIHRoYXQgd2FzIG5vdCBnZW5lcmF0ZWQgYnkgZ2NjLAotICAgICBzbyB0aGF0IHdlIGNhbiBkZXRlY3QgdGhlIFN1blBSTyBjb21waWxlci4gICovCi0gIGJvb2xlYW4gbl9vcHRfZm91bmQ7Ci0gIC8qIFRoZSBtYWluIGZpbGUgbmFtZS4gICovCi0gIGNoYXIgKm1haW5fZmlsZW5hbWU7Ci0gIC8qIEEgc3RhY2sgb2YgdW5maW5pc2hlZCBOX0JJTkNMIGZpbGVzLiAgKi8KLSAgc3RydWN0IGJpbmNsX2ZpbGUgKmJpbmNsX3N0YWNrOwotICAvKiBBIGxpc3Qgb2YgZmluaXNoZWQgTl9CSU5DTCBmaWxlcy4gICovCi0gIHN0cnVjdCBiaW5jbF9maWxlICpiaW5jbF9saXN0OwotICAvKiBXaGV0aGVyIHdlIGFyZSBpbnNpZGUgYSBmdW5jdGlvbiBvciBub3QuICAqLwotICBib29sZWFuIHdpdGhpbl9mdW5jdGlvbjsKLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHVzZWQgaWYgd2UgaGF2ZSBzZWVuIGFuCi0gICAgIE5fRlVOIHN5bWJvbCB3aGlsZSBpbiBhIGZ1bmN0aW9uLiAgVGhpcyBpcyAtMSBpZiB3ZSBoYXZlIG5vdCBzZWVuCi0gICAgIGFuIE5fRlVOICh0aGUgbm9ybWFsIGNhc2UpLiAgKi8KLSAgYmZkX3ZtYSBmdW5jdGlvbl9lbmQ7Ci0gIC8qIFRoZSBkZXB0aCBvZiBibG9jayBuZXN0aW5nLiAgKi8KLSAgaW50IGJsb2NrX2RlcHRoOwotICAvKiBMaXN0IG9mIHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICAqLwotICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqcGVuZGluZzsKLSAgLyogTnVtYmVyIG9mIGZpbGVzIGZvciB3aGljaCB3ZSBoYXZlIHR5cGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGZpbGVzOwotICAvKiBMaXN0cyBvZiB0eXBlcyBwZXIgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICoqZmlsZV90eXBlczsKLSAgLyogUHJlZGVmaW5lZCBYQ09GRiB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgeGNvZmZfdHlwZXNbWENPRkZfVFlQRV9DT1VOVF07Ci0gIC8qIFVuZGVmaW5lZCB0YWdzLiAgKi8KLSAgc3RydWN0IHN0YWJfdGFnICp0YWdzOwotICAvKiBTZXQgYnkgcGFyc2Vfc3RhYl90eXBlIGlmIGl0IHNlZXMgYSBzdHJ1Y3R1cmUgZGVmaW5lZCBhcyBhIGNyb3NzCi0gICAgIHJlZmVyZW5jZSB0byBpdHNlbGYuICBSZXNldCBieSBwYXJzZV9zdGFiX3R5cGUgb3RoZXJ3aXNlLiAgKi8KLSAgYm9vbGVhbiBzZWxmX2Nyb3NzcmVmOwotfTsKLQotLyogQSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgdXNlZCB0byBob2xkIHBlbmRpbmcgdmFyaWFibGUKLSAgIGRlZmluaXRpb25zIHNlZW4gYmVmb3JlIHRoZSBOX0xCUkFDIG9mIGEgYmxvY2suICAqLwotCi1zdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhcgotewotICAvKiBOZXh0IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbi4gICovCi0gIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogS2luZC4gICovCi0gIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgLyogVmFsdWUuICAqLwotICBiZmRfdm1hIHZhbDsKLX07Ci0KLS8qIEEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHVzZWQgdG8gaG9sZCB0aGUgdHlwZXMgZm9yIGEgc2luZ2xlCi0gICBmaWxlLiAgKi8KLQotc3RydWN0IHN0YWJfdHlwZXMKLXsKLSAgLyogTmV4dCBzZXQgb2Ygc2xvdHMgZm9yIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICpuZXh0OwotICAvKiBUeXBlcyBpbmRleGVkIGJ5IHR5cGUgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU1RBQl9UWVBFU19TTE9UUyAoMTYpCi0gIGRlYnVnX3R5cGUgdHlwZXNbU1RBQl9UWVBFU19TTE9UU107Ci19OwotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiB1bmRlZmluZWQgdGFncyB0aGF0IHdlIGVuY291bnRlciwgc28gdGhhdCB3ZSBjYW4KLSAgIGZpbGwgdGhlbSBpbiBpZiB0aGUgdGFnIGlzIGxhdGVyIGRlZmluZWQuICAqLwotCi1zdHJ1Y3Qgc3RhYl90YWcKLXsKLSAgLyogTmV4dCB1bmRlZmluZWQgdGFnLiAgKi8KLSAgc3RydWN0IHN0YWJfdGFnICpuZXh0OwotICAvKiBUYWcgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFR5cGUga2luZC4gICovCi0gIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gIC8qIFNsb3QgdG8gaG9sZCByZWFsIHR5cGUgd2hlbiB3ZSBkaXNjb3ZlciBpdC4gIElmIHdlIGRvbid0LCB3ZSBmaWxsCi0gICAgIGluIGFuIHVuZGVmaW5lZCB0YWcgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgc2xvdDsKLSAgLyogSW5kaXJlY3QgdHlwZSB3ZSBoYXZlIGNyZWF0ZWQgdG8gcG9pbnQgYXQgc2xvdC4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLX07Ci0KLXN0YXRpYyBjaGFyICpzYXZlc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSBwYXJzZV9udW1iZXIgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBiYWRfc3RhYiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHdhcm5fc3RhYiBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9zdHJpbmcKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgaW50LCBpbnQsIGJmZF92bWEsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkgICBkZWJ1Z190eXBlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIGludCAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3JhbmdlX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGludCAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N1bl9mbG9hdGluZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9lbnVtX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYm9vbGVhbiwKLQkgICBjb25zdCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9iYXNlY2xhc3NlcwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19iYXNlY2xhc3MgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfc3RydWN0X2ZpZWxkcwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19maWVsZCAqKiwKLQkgICBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfY3BwX2FiYnJldgotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19maWVsZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX29uZV9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqLAotCSAgIGRlYnVnX2ZpZWxkICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9tZW1iZXJzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBpbnQgKiwgZGVidWdfbWV0aG9kICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX2FyZ3R5cGVzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl90aWxkZV9maWVsZAotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBpbnQgKiwKLQkgICBkZWJ1Z190eXBlICosIGJvb2xlYW4gKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIHB1c2hfYmluY2wgUEFSQU1TICgoc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnBvcF9iaW5jbCBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikpOwotc3RhdGljIGJvb2xlYW4gZmluZF9leGNsCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcmVjb3JkX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwKLQkgICBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VtaXRfcGVuZGluZ192YXJzIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlICpzdGFiX2ZpbmRfc2xvdAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgaW50ICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHN0YWJfZmluZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3JlY29yZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqLCBkZWJ1Z190eXBlKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBzdGFiX3hjb2ZmX2J1aWx0aW5fdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHN0YWJfZmluZF90YWdnZWRfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGludCwKLQkgICBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGRlYnVnX3R5cGUgKnN0YWJfZGVtYW5nbGVfYXJndHlwZXMKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuICopKTsKLQotLyogU2F2ZSBhIHN0cmluZyBpbiBtZW1vcnkuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zYXZlc3RyaW5nIChzdGFydCwgbGVuKQotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbjsKLXsKLSAgY2hhciAqcmV0OwotCi0gIHJldCA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHJldCwgc3RhcnQsIGxlbik7Ci0gIHJldFtsZW5dID0gJ1wwJzsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmVhZCBhIG51bWJlciBmcm9tIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLXBhcnNlX251bWJlciAocHAsIHBvdmVyZmxvdykKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBib29sZWFuICpwb3ZlcmZsb3c7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdWw7Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0KLSAgaWYgKHBvdmVyZmxvdyAhPSBOVUxMKQotICAgICpwb3ZlcmZsb3cgPSBmYWxzZTsKLQotICBvcmlnID0gKnBwOwotCi0gIGVycm5vID0gMDsKLSAgdWwgPSBzdHJ0b3VsICgqcHAsIChjaGFyICoqKSBwcCwgMCk7Ci0gIGlmICh1bCArIDEgIT0gMCB8fCBlcnJubyA9PSAwKQotICAgIHsKLSAgICAgIC8qIElmIGJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gdW5zaWduZWQgbG9uZywgYW5kIHRoZSBudW1iZXIgaXMKLSAgICAgICAgIG1lYW50IHRvIGJlIG5lZ2F0aXZlLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHNpZ24KLSAgICAgICAgIGV4dGVuZCBwcm9wZXJseS4gICovCi0gICAgICBpZiAoKm9yaWcgPT0gJy0nKQotCXJldHVybiAoYmZkX3ZtYSkgKGJmZF9zaWduZWRfdm1hKSAobG9uZykgdWw7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIHVsOwotICAgIH0KLQotICAvKiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggc3RydG91bCBvdmVyZmxvd2VkLCBpdCBzaG91bGQgaGF2ZSBzZXQgKnBwCi0gICAgIHRvIHRoZSBlbmQgb2YgdGhlIG51bWJlciwgd2hpY2ggaXMgd2hlcmUgd2Ugd2FudCBpdC4gICovCi0KLSAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPiBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgICBib29sZWFuIG5lZzsKLSAgICAgIGludCBiYXNlOwotICAgICAgYmZkX3ZtYSBvdmVyLCBsYXN0ZGlnOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLSAgICAgIGJmZF92bWEgdjsKLQotICAgICAgLyogT3VyIG93biB2ZXJzaW9uIG9mIHN0cnRvdWwsIGZvciBhIGJmZF92bWEuICAqLwotCi0gICAgICBwID0gb3JpZzsKLQotICAgICAgbmVnID0gZmFsc2U7Ci0gICAgICBpZiAoKnAgPT0gJysnKQotCSsrcDsKLSAgICAgIGVsc2UgaWYgKCpwID09ICctJykKLQl7Ci0JICBuZWcgPSB0cnVlOwotCSAgKytwOwotCX0KLQotICAgICAgYmFzZSA9IDEwOwotICAgICAgaWYgKCpwID09ICcwJykKLQl7Ci0JICBpZiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpCi0JICAgIHsKLQkgICAgICBiYXNlID0gMTY7Ci0JICAgICAgcCArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiYXNlID0gODsKLQkgICAgICArK3A7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG92ZXIgPSAoKGJmZF92bWEpIChiZmRfc2lnbmVkX3ZtYSkgLTEpIC8gKGJmZF92bWEpIGJhc2U7Ci0gICAgICBsYXN0ZGlnID0gKChiZmRfdm1hKSAoYmZkX3NpZ25lZF92bWEpIC0xKSAlIChiZmRfdm1hKSBiYXNlOwotCi0gICAgICBvdmVyZmxvdyA9IGZhbHNlOwotICAgICAgdiA9IDA7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpbnQgZDsKLQotCSAgZCA9ICpwKys7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGQpKQotCSAgICBkIC09ICcwJzsKLQkgIGVsc2UgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBkKSkKLQkgICAgZCAtPSAnQSc7Ci0JICBlbHNlIGlmIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgZCkpCi0JICAgIGQgLT0gJ2EnOwotCSAgZWxzZQotCSAgICBicmVhazsKLQotCSAgaWYgKGQgPj0gYmFzZSkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICh2ID4gb3ZlciB8fCAodiA9PSBvdmVyICYmIChiZmRfdm1hKSBkID4gbGFzdGRpZykpCi0JICAgIHsKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIG92ZXJmbG93KQotCXsKLQkgIGlmIChuZWcpCi0JICAgIHYgPSAtIHY7Ci0JICByZXR1cm4gdjsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGdldCBoZXJlLCB0aGUgbnVtYmVyIGlzIHRvbyBsYXJnZSB0byByZXByZXNlbnQgaW4gYQotICAgICBiZmRfdm1hLiAgKi8KLQotICBpZiAocG92ZXJmbG93ICE9IE5VTEwpCi0gICAgKnBvdmVyZmxvdyA9IHRydWU7Ci0gIGVsc2UKLSAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm51bWVyaWMgb3ZlcmZsb3ciKSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEdpdmUgYW4gZXJyb3IgZm9yIGEgYmFkIHN0YWIgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWJhZF9zdGFiIChwKQotICAgICBjb25zdCBjaGFyICpwOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIkJhZCBzdGFiOiAlc1xuIiksIHApOwotfQotCi0vKiBXYXJuIGFib3V0IHNvbWV0aGluZyBpbiBhIHN0YWIgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXdhcm5fc3RhYiAocCwgZXJyKQotICAgICBjb25zdCBjaGFyICpwOwotICAgICBjb25zdCBjaGFyICplcnI7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiV2FybmluZzogJXM6ICVzXG4iKSwgZXJyLCBwKTsKLX0KLQotLyogQ3JlYXRlIGEgaGFuZGxlIHRvIHBhcnNlIHN0YWJzIHN5bWJvbHMgd2l0aC4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1zdGFydF9zdGFiIChkaGFuZGxlLCBhYmZkLCBzZWN0aW9ucywgc3ltcywgc3ltY291bnQpCi0gICAgIFBUUiBkaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBzZWN0aW9uczsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci17Ci0gIHN0cnVjdCBzdGFiX2hhbmRsZSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICBtZW1zZXQgKHJldCwgMCwgc2l6ZW9mICpyZXQpOwotICByZXQtPmFiZmQgPSBhYmZkOwotICByZXQtPnNlY3Rpb25zID0gc2VjdGlvbnM7Ci0gIHJldC0+c3ltcyA9IHN5bXM7Ci0gIHJldC0+c3ltY291bnQgPSBzeW1jb3VudDsKLSAgcmV0LT5maWxlcyA9IDE7Ci0gIHJldC0+ZmlsZV90eXBlcyA9IChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQtPmZpbGVfdHlwZXMpOwotICByZXQtPmZpbGVfdHlwZXNbMF0gPSBOVUxMOwotICByZXQtPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogV2hlbiB3ZSBoYXZlIHByb2Nlc3NlZCBhbGwgdGhlIHN0YWJzIGluZm9ybWF0aW9uLCB3ZSBuZWVkIHRvIGdvCi0gICB0aHJvdWdoIGFuZCBmaWxsIGluIGFsbCB0aGUgdW5kZWZpbmVkIHRhZ3MuICAqLwotCi1ib29sZWFuCi1maW5pc2hfc3RhYiAoZGhhbmRsZSwgaGFuZGxlKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgUFRSIGhhbmRsZTsKLXsKLSAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBzdGFiX3RhZyAqc3Q7Ci0KLSAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbikKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotCSAgfHwgISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGluZm8tPmZ1bmN0aW9uX2VuZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+d2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7Ci0gICAgICBpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgfQotCi0gIGZvciAoc3QgPSBpbmZvLT50YWdzOyBzdCAhPSBOVUxMOyBzdCA9IHN0LT5uZXh0KQotICAgIHsKLSAgICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0KLSAgICAgIGtpbmQgPSBzdC0+a2luZDsKLSAgICAgIGlmIChraW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKLQlraW5kID0gREVCVUdfS0lORF9TVFJVQ1Q7Ci0gICAgICBzdC0+c2xvdCA9IGRlYnVnX21ha2VfdW5kZWZpbmVkX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBzdC0+bmFtZSwga2luZCk7Ci0gICAgICBpZiAoc3QtPnNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIHNpbmdsZSBzdGFicyBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1wYXJzZV9zdGFiIChkaGFuZGxlLCBoYW5kbGUsIHR5cGUsIGRlc2MsIHZhbHVlLCBzdHJpbmcpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBQVFIgaGFuZGxlOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGRlc2M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgLyogZ2NjIHdpbGwgZW1pdCB0d28gTl9TTyBzdHJpbmdzIHBlciBjb21waWxhdGlvbiB1bml0LCBvbmUgZm9yIHRoZQotICAgICBkaXJlY3RvcnkgbmFtZSBhbmQgb25lIGZvciB0aGUgZmlsZSBuYW1lLiAgV2UganVzdCBjb2xsZWN0IE5fU08KLSAgICAgc3RyaW5ncyBhcyB3ZSBzZWUgdGhlbSwgYW5kIHN0YXJ0IHRoZSBuZXcgY29tcGlsYXRpb24gdW5pdCB3aGVuCi0gICAgIHdlIHNlZSBhIG5vbiBOX1NPIHN5bWJvbC4gICovCi0gIGlmIChpbmZvLT5zb19zdHJpbmcgIT0gTlVMTAotICAgICAgJiYgKHR5cGUgIT0gTl9TTyB8fCAqc3RyaW5nID09ICdcMCcgfHwgdmFsdWUgIT0gaW5mby0+c29fdmFsdWUpKQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoZGhhbmRsZSwgaW5mby0+c29fc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT5tYWluX2ZpbGVuYW1lID0gaW5mby0+c29fc3RyaW5nOwotCi0gICAgICBpbmZvLT5nY2NfY29tcGlsZWQgPSAwOwotICAgICAgaW5mby0+bl9vcHRfZm91bmQgPSBmYWxzZTsKLQotICAgICAgLyogR2VuZXJhbGx5LCBmb3Igc3RhYnMgaW4gdGhlIHN5bWJvbCB0YWJsZSwgdGhlIE5fTEJSQUMgYW5kCi0JIE5fUkJSQUMgc3ltYm9scyBhcmUgcmVsYXRpdmUgdG8gdGhlIE5fU08gc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNlY3Rpb25zKQotCWluZm8tPmZpbGVfc3RhcnRfb2Zmc2V0ID0gaW5mby0+c29fdmFsdWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gcmVzZXQgdGhlIG1hcHBpbmcgZnJvbSB0eXBlIG51bWJlcnMgdG8gdHlwZXMuICBXZQotCSBjYW4ndCBmcmVlIHRoZSBvbGQgbWFwcGluZywgYmVjYXVzZSBvZiB0aGUgdXNlIG9mCi0JIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZS4gICovCi0gICAgICBpbmZvLT5maWxlcyA9IDE7Ci0gICAgICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJCSAgeG1hbGxvYyAoc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSk7Ci0gICAgICBpbmZvLT5maWxlX3R5cGVzWzBdID0gTlVMTDsKLQotICAgICAgaW5mby0+c29fc3RyaW5nID0gTlVMTDsKLQotICAgICAgLyogTm93IHByb2Nlc3Mgd2hhdGV2ZXIgdHlwZSB3ZSBqdXN0IGdvdC4gICovCi0gICAgfQotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBOX0ZOOgotICAgIGNhc2UgTl9GTl9TRVE6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9MQlJBQzoKLSAgICAgIC8qIElnbm9yZSBleHRyYSBvdXRlcm1vc3QgY29udGV4dCBmcm9tIFN1blBSTyBjYyBhbmQgYWNjLiAgKi8KLSAgICAgIGlmIChpbmZvLT5uX29wdF9mb3VuZCAmJiBkZXNjID09IDEpCi0JYnJlYWs7Ci0KLSAgICAgIGlmICghIGluZm8tPndpdGhpbl9mdW5jdGlvbikKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIk5fTEJSQUMgbm90IHdpdGhpbiBmdW5jdGlvblxuIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogU3RhcnQgYW4gaW5uZXIgbGV4aWNhbCBibG9jay4gICovCi0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9ibG9jayAoZGhhbmRsZSwKLQkJCSAgICAgICAodmFsdWUKLQkJCQkrIGluZm8tPmZpbGVfc3RhcnRfb2Zmc2V0Ci0JCQkJKyBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICAqLwotICAgICAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICArK2luZm8tPmJsb2NrX2RlcHRoOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fUkJSQUM6Ci0gICAgICAvKiBJZ25vcmUgZXh0cmEgb3V0ZXJtb3N0IGNvbnRleHQgZnJvbSBTdW5QUk8gY2MgYW5kIGFjYy4gICovCi0gICAgICBpZiAoaW5mby0+bl9vcHRfZm91bmQgJiYgZGVzYyA9PSAxKQotCWJyZWFrOwotCi0gICAgICAvKiBXZSBzaG91bGRuJ3QgaGF2ZSBhbnkgcGVuZGluZyB2YXJpYWJsZSBkZWZpbml0aW9ucyBoZXJlLCBidXQsCi0gICAgICAgICBpZiB3ZSBkbywgd2UgcHJvYmFibHkgbmVlZCB0byBlbWl0IHRoZW0gYmVmb3JlIGNsb3NpbmcgdGhlCi0gICAgICAgICBibG9jay4gICovCi0gICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEVuZCBhbiBpbm5lciBsZXhpY2FsIGJsb2NrLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX2VuZF9ibG9jayAoZGhhbmRsZSwKLQkJCSAgICAgKHZhbHVlCi0JCQkgICAgICArIGluZm8tPmZpbGVfc3RhcnRfb2Zmc2V0Ci0JCQkgICAgICArIGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldCkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLS1pbmZvLT5ibG9ja19kZXB0aDsKLSAgICAgIGlmIChpbmZvLT5ibG9ja19kZXB0aCA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJUb28gbWFueSBOX1JCUkFDc1xuIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NPOgotICAgICAgLyogVGhpcyBhbHdheXMgZW5kcyBhIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24pCi0JewotCSAgYmZkX3ZtYSBlbmR2YWw7Ci0KLQkgIGVuZHZhbCA9IHZhbHVlOwotCSAgaWYgKCpzdHJpbmcgIT0gJ1wwJwotCSAgICAgICYmIGluZm8tPmZ1bmN0aW9uX2VuZCAhPSAoYmZkX3ZtYSkgLTEKLQkgICAgICAmJiBpbmZvLT5mdW5jdGlvbl9lbmQgPCBlbmR2YWwpCi0JICAgIGVuZHZhbCA9IGluZm8tPmZ1bmN0aW9uX2VuZDsKLQkgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCi0JICAgICAgfHwgISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGVuZHZhbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGluZm8tPndpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOwotCSAgaW5mby0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotCX0KLQotICAgICAgLyogQW4gZW1wdHkgc3RyaW5nIGlzIGVtaXR0ZWQgYnkgZ2NjIGF0IHRoZSBlbmQgb2YgYSBjb21waWxhdGlvbgotICAgICAgICAgdW5pdC4gICovCi0gICAgICBpZiAoKnN0cmluZyA9PSAnXDAnKQotCXJldHVybiB0cnVlOwotCi0gICAgICAvKiBKdXN0IGFjY3VtdWxhdGUgc3RyaW5ncyB1bnRpbCB3ZSBzZWUgYSBub24gTl9TTyBzeW1ib2wuICBJZgotICAgICAgICAgdGhlIHN0cmluZyBzdGFydHMgd2l0aCBhIGRpcmVjdG9yeSBzZXBhcmF0b3Igb3Igc29tZSBvdGhlcgotCSBmb3JtIG9mIGFic29sdXRlIHBhdGggc3BlY2lmaWNhdGlvbiwgd2UgZGlzY2FyZCB0aGUgcHJldmlvdXNseQotICAgICAgICAgYWNjdW11bGF0ZWQgc3RyaW5ncy4gICovCi0gICAgICBpZiAoaW5mby0+c29fc3RyaW5nID09IE5VTEwpCi0JaW5mby0+c29fc3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpmOwotCi0JICBmID0gaW5mby0+c29fc3RyaW5nOwotCi0JICBpZiAoICAgKHN0cmluZ1swXSA9PSAnLycpCi0JICAgICAgfHwgKHN0cmluZ1swXSA9PSBESVJfU0VQQVJBVE9SKQotCSAgICAgIHx8ICggICAoRElSX1NFUEFSQVRPUiA9PSAnXFwnKQotCQkgICYmIChzdHJpbmdbMV0gPT0gJzonKQotCQkgICYmICggICAoc3RyaW5nWzJdID09IERJUl9TRVBBUkFUT1IpCi0JCSAgICAgIHx8IChzdHJpbmdbMl0gPT0gJy8nKSkpKQotCSAgICBpbmZvLT5zb19zdHJpbmcgPSB4c3RyZHVwIChzdHJpbmcpOwotCSAgZWxzZQotCSAgICBpbmZvLT5zb19zdHJpbmcgPSBjb25jYXQgKGluZm8tPnNvX3N0cmluZywgc3RyaW5nLAotCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgZnJlZSAoZik7Ci0JfQotCi0gICAgICBpbmZvLT5zb192YWx1ZSA9IHZhbHVlOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9TT0w6Ci0gICAgICAvKiBTdGFydCBhbiBpbmNsdWRlIGZpbGUuICAqLwotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChkaGFuZGxlLCBzdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0JJTkNMOgotICAgICAgLyogU3RhcnQgYW4gaW5jbHVkZSBmaWxlIHdoaWNoIG1heSBiZSByZXBsYWNlZC4gICovCi0gICAgICBwdXNoX2JpbmNsIChpbmZvLCBzdHJpbmcsIHZhbHVlKTsKLSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoZGhhbmRsZSwgc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9FSU5DTDoKLSAgICAgIC8qIEVuZCBhbiBOX0JJTkNMIGluY2x1ZGUuICAqLwotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChkaGFuZGxlLCBwb3BfYmluY2wgKGluZm8pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9FWENMOgotICAgICAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBvZiBhIGhlYWRlciBmaWxlIG5hbWVkIGJ5IE5fQklOQ0wgd2hpY2gKLSAgICAgICAgIHdhcyBlbGltaW5hdGVkIGJ5IHRoZSBsaW5rZXIuICAqLwotICAgICAgaWYgKCEgZmluZF9leGNsIChpbmZvLCBzdHJpbmcsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9TTElORToKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9saW5lIChkaGFuZGxlLCBkZXNjLAotCQkJICAgICAgIHZhbHVlICsgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9CQ09NTToKLSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jayAoZGhhbmRsZSwgc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9FQ09NTToKLSAgICAgIGlmICghIGRlYnVnX2VuZF9jb21tb25fYmxvY2sgKGRoYW5kbGUsIHN0cmluZykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fRlVOOgotICAgICAgaWYgKCpzdHJpbmcgPT0gJ1wwJykKLQl7Ci0JICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhbHdheXMgbWFya3MgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uOyB3ZSBkb24ndAotICAgICAgICAgICAgICAgICBuZWVkIHRvIHdvcnJ5IGFib3V0IGluZm8tPmZ1bmN0aW9uX2VuZC4gICovCi0JICAgICAgaWYgKGluZm8tPnNlY3Rpb25zKQotCQl2YWx1ZSArPSBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQ7Ci0JICAgICAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykKLQkJICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgdmFsdWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaW5mby0+d2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7Ci0JICAgICAgaW5mby0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEEgY29uc3Qgc3RhdGljIHN5bWJvbCBpbiB0aGUgLnRleHQgc2VjdGlvbiB3aWxsIGhhdmUgYW4gTl9GVU4KLSAgICAgICAgIGVudHJ5LiAgV2UgbmVlZCB0byB1c2UgdGhlc2UgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwKLSAgICAgICAgIGluIGNhc2Ugd2UgYXJlIGxvb2tpbmcgYXQgZ2NjIG91dHB1dCBiZWZvcmUgaXQgd2FzIGNoYW5nZWQgdG8KLSAgICAgICAgIGFsd2F5cyBlbWl0IGFuIGVtcHR5IE5fRlVOLiAgV2UgY2FuJ3QgY2FsbCBkZWJ1Z19lbmRfZnVuY3Rpb24KLSAgICAgICAgIGhlcmUsIGJlY2F1c2UgaXQgbWlnaHQgYmUgYSBsb2NhbCBzdGF0aWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24KLQkgICYmIChpbmZvLT5mdW5jdGlvbl9lbmQgPT0gKGJmZF92bWEpIC0xCi0JICAgICAgfHwgdmFsdWUgPCBpbmZvLT5mdW5jdGlvbl9lbmQpKQotCWluZm8tPmZ1bmN0aW9uX2VuZCA9IHZhbHVlOwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3MgdGhlIHN0cmluZyBmb3IgTl9TVFNZTSwgTl9MQ1NZTSBvciBOX1JPU1lNCi0gICAgICAgICBzeW1ib2xzLCBhbmQgaWYgaXQgZG9lcyBub3Qgc3RhcnQgd2l0aCA6UywgZ2RiIHJlbG9jYXRlcyB0aGUKLSAgICAgICAgIHZhbHVlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbi4gIGdjYyBhbHdheXMgc2VlbXMgdG8gdXNlCi0gICAgICAgICA6Uywgc28gd2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhpcy4gICovCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqY29sb247Ci0KLQljb2xvbiA9IHN0cmNociAoc3RyaW5nLCAnOicpOwotCWlmIChjb2xvbiAhPSBOVUxMCi0JICAgICYmIChjb2xvblsxXSA9PSAnZicgfHwgY29sb25bMV0gPT0gJ0YnKSkKLQkgIHsKLQkgICAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbikKLQkgICAgICB7Ci0JCWJmZF92bWEgZW5kdmFsOwotCi0JCWVuZHZhbCA9IHZhbHVlOwotCQlpZiAoaW5mby0+ZnVuY3Rpb25fZW5kICE9IChiZmRfdm1hKSAtMQotCQkgICAgJiYgaW5mby0+ZnVuY3Rpb25fZW5kIDwgZW5kdmFsKQotCQkgIGVuZHZhbCA9IGluZm8tPmZ1bmN0aW9uX2VuZDsKLQkJaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykKLQkJICAgIHx8ICEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCBlbmR2YWwpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaW5mby0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotCSAgICAgIH0KLQkgICAgLyogRm9yIHN0YWJzIGluIHNlY3Rpb25zLCBsaW5lIG51bWJlcnMgYW5kIGJsb2NrIGFkZHJlc3NlcwotICAgICAgICAgICAgICAgYXJlIG9mZnNldHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgaWYgKGluZm8tPnNlY3Rpb25zKQotCSAgICAgIGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldCA9IHZhbHVlOwotCSAgICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSB0cnVlOwotCSAgfQotCi0JaWYgKCEgcGFyc2Vfc3RhYl9zdHJpbmcgKGRoYW5kbGUsIGluZm8sIHR5cGUsIGRlc2MsIHZhbHVlLCBzdHJpbmcpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fT1BUOgotICAgICAgaWYgKHN0cmluZyAhPSBOVUxMICYmIHN0cmNtcCAoc3RyaW5nLCAiZ2NjMl9jb21waWxlZC4iKSA9PSAwKQotCWluZm8tPmdjY19jb21waWxlZCA9IDI7Ci0gICAgICBlbHNlIGlmIChzdHJpbmcgIT0gTlVMTCAmJiBzdHJjbXAgKHN0cmluZywgImdjY19jb21waWxlZC4iKSA9PSAwKQotCWluZm8tPmdjY19jb21waWxlZCA9IDE7Ci0gICAgICBlbHNlCi0JaW5mby0+bl9vcHRfZm91bmQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fT0JKOgotICAgIGNhc2UgTl9FTkRNOgotICAgIGNhc2UgTl9NQUlOOgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSB0aGUgc3RhYnMgc3RyaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfc3RyaW5nIChkaGFuZGxlLCBpbmZvLCBzdGFidHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgaW50IHN0YWJ0eXBlOwotICAgICBpbnQgZGVzYzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBjaGFyICpwOwotICBjaGFyICpuYW1lOwotICBpbnQgdHlwZTsKLSAgZGVidWdfdHlwZSBkdHlwZTsKLSAgYm9vbGVhbiBzeW5vbnltOwotICBib29sZWFuIHNlbGZfY3Jvc3NyZWY7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0gIGRlYnVnX3R5cGUgKnNsb3Q7Ci0KLSAgcCA9IHN0cmNociAoc3RyaW5nLCAnOicpOwotICBpZiAocCA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHdoaWxlIChwWzFdID09ICc6JykKLSAgICB7Ci0gICAgICBwICs9IDI7Ci0gICAgICBwID0gc3RyY2hyIChwLCAnOicpOwotICAgICAgaWYgKHAgPT0gTlVMTCkKLQl7Ci0JICBiYWRfc3RhYiAoc3RyaW5nKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIEdDQyAyLnggcHV0cyB0aGUgbGluZSBudW1iZXIgaW4gZGVzYy4gIFN1bk9TIGFwcGFyZW50bHkgcHV0cyBpbgotICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IGEgdHlwZSBvciBvYmplY3QsIHdoaWNoIHdlCi0gICAgIGlnbm9yZS4gICovCi0gIGlmIChpbmZvLT5nY2NfY29tcGlsZWQgPj0gMikKLSAgICBsaW5lbm8gPSBkZXNjOwotICBlbHNlCi0gICAgbGluZW5vID0gMDsKLQotICAvKiBGSVhNRTogU29tZXRpbWVzIHRoZSBzcGVjaWFsIEMrKyBuYW1lcyBzdGFydCB3aXRoICcuJy4gICovCi0gIG5hbWUgPSBOVUxMOwotICBpZiAoc3RyaW5nWzBdID09ICckJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHN0cmluZ1sxXSkKLQl7Ci0JY2FzZSAndCc6Ci0JICBuYW1lID0gInRoaXMiOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICAvKiBXYXM6IG5hbWUgPSAidnB0ciI7ICovCi0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIG5hbWUgPSAiZWhfdGhyb3ciOwotCSAgYnJlYWs7Ci0JY2FzZSAnXyc6Ci0JICAvKiBUaGlzIHdhcyBhbiBhbm9ueW1vdXMgdHlwZSB0aGF0IHdhcyBuZXZlciBmaXhlZCB1cC4gICovCi0JICBicmVhazsKLQljYXNlICdYJzoKLQkgIC8qIFN1blBSTyAoMy4wIGF0IGxlYXN0KSBzdGF0aWMgdmFyaWFibGUgZW5jb2RpbmcuICAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHdhcm5fc3RhYiAoc3RyaW5nLCBfKCJ1bmtub3duIEMrKyBlbmNvZGVkIG5hbWUiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKHAgPT0gc3RyaW5nIHx8IChzdHJpbmdbMF0gPT0gJyAnICYmIHAgPT0gc3RyaW5nICsgMSkpCi0JbmFtZSA9IE5VTEw7Ci0gICAgICBlbHNlCi0JbmFtZSA9IHNhdmVzdHJpbmcgKHN0cmluZywgcCAtIHN0cmluZyk7Ci0gICAgfQotCi0gICsrcDsKLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJygnIHx8ICpwID09ICctJykKLSAgICB0eXBlID0gJ2wnOwotICBlbHNlCi0gICAgdHlwZSA9ICpwKys7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdjJzoKLSAgICAgIC8qIGMgaXMgYSBzcGVjaWFsIGNhc2UsIG5vdCBmb2xsb3dlZCBieSBhIHR5cGUtbnVtYmVyLgotCSBTWU1CT0w6Yz1pVkFMVUUgZm9yIGFuIGludGVnZXIgY29uc3RhbnQgc3ltYm9sLgotCSBTWU1CT0w6Yz1yVkFMVUUgZm9yIGEgZmxvYXRpbmcgY29uc3RhbnQgc3ltYm9sLgotCSBTWU1CT0w6Yz1lVFlQRSxJTlRWQUxVRSBmb3IgYW4gZW51bSBjb25zdGFudCBzeW1ib2wuCi0JIGUuZy4gImI6Yz1lNiwwIiBmb3IgImNvbnN0IGIgPSBibG9iMSIKLQkgKHdoZXJlIHR5cGUgNiBpcyBkZWZpbmVkIGJ5ICJibG9iczp0Nj1lYmxvYjE6MCxibG9iMjoxLDsiKS4gICovCi0gICAgICBpZiAoKnAgIT0gJz0nKQotCXsKLQkgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrcDsKLSAgICAgIHN3aXRjaCAoKnArKykKLQl7Ci0JY2FzZSAncic6Ci0JICAvKiBGbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0JICBpZiAoISBkZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgKGRoYW5kbGUsIG5hbWUsIGF0b2YgKHApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICAvKiBJbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQkgIC8qIERlZmluaW5nIGludGVnZXIgY29uc3RhbnRzIHRoaXMgd2F5IGlzIGtpbmQgb2Ygc2lsbHksCi0JICAgICBzaW5jZSAnZScgY29uc3RhbnRzIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZ2l2ZSBub3Qgb25seQotCSAgICAgdGhlIHZhbHVlLCBidXQgdGhlIHR5cGUgYXMgd2VsbC4gIEMgaGFzIGF0IGxlYXN0IGludCwKLQkgICAgIGxvbmcsIHVuc2lnbmVkIGludCwgYW5kIGxvbmcgbG9uZyBhcyBjb25zdGFudCB0eXBlczsKLQkgICAgIG90aGVyIGxhbmd1YWdlcyBwcm9iYWJseSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB1bnNpZ25lZCBhcwotCSAgICAgd2VsbCBhcyBzaWduZWQgY29uc3RhbnRzLiAgKi8KLQkgIGlmICghIGRlYnVnX3JlY29yZF9pbnRfY29uc3QgKGRoYW5kbGUsIG5hbWUsIGF0b2kgKHApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICAvKiBTWU1CT0w6Yz1lVFlQRSxJTlRWQUxVRSBmb3IgYSBjb25zdGFudCBzeW1ib2wgd2hvc2UgdmFsdWUKLQkgICAgIGNhbiBiZSByZXByZXNlbnRlZCBhcyBpbnRlZ3JhbC4KLQkgICAgIGUuZy4gImI6Yz1lNiwwIiBmb3IgImNvbnN0IGIgPSBibG9iMSIKLQkgICAgICh3aGVyZSB0eXBlIDYgaXMgZGVmaW5lZCBieSAiYmxvYnM6dDY9ZWJsb2IxOjAsYmxvYjI6MSw7IikuICAqLwotCSAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgJnAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICgqcCAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAoc3RyaW5nKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghIGRlYnVnX3JlY29yZF90eXBlZF9jb25zdCAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIGF0b2kgKHApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgIC8qIFRoZSBuYW1lIG9mIGEgY2F1Z2h0IGV4Y2VwdGlvbi4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCSAgICAgICAmcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfbGFiZWwgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIC8qIEEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCB0eXBlID09ICdGJywgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU3VuIGFjYyBwdXRzIGRlY2xhcmVkIHR5cGVzIG9mIGFyZ3VtZW50cyBoZXJlLiAgV2UgZG9uJ3QgY2FyZQotCSBhYm91dCB0aGVpciBhY3R1YWwgdHlwZXMgKEZJWE1FIC0tIHdlIHNob3VsZCByZW1lbWJlciB0aGUgd2hvbGUKLQkgZnVuY3Rpb24gcHJvdG90eXBlKSwgYnV0IHRoZSBsaXN0IG1heSBkZWZpbmUgc29tZSBuZXcgdHlwZXMKLQkgdGhhdCB3ZSBoYXZlIHRvIHJlbWVtYmVyLCBzbyB3ZSBtdXN0IHNjYW4gaXQgbm93LiAgKi8KLSAgICAgIHdoaWxlICgqcCA9PSAnOycpCi0JewotCSAgKytwOwotCSAgaWYgKHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpCi0JICAgICAgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgewotCWNoYXIgbGVhZGluZzsKLQlsb25nIGM7Ci0JYXN5bWJvbCAqKnBzOwotCi0JLyogQSBnbG9iYWwgc3ltYm9sLiAgVGhlIHZhbHVlIG11c3QgYmUgZXh0cmFjdGVkIGZyb20gdGhlCi0JICAgc3ltYm9sIHRhYmxlLiAgKi8KLQlkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQlpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCWxlYWRpbmcgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGluZm8tPmFiZmQpOwotCWZvciAoYyA9IGluZm8tPnN5bWNvdW50LCBwcyA9IGluZm8tPnN5bXM7IGMgPiAwOyAtLWMsICsrcHMpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm47Ci0KLQkgICAgbiA9IGJmZF9hc3ltYm9sX25hbWUgKCpwcyk7Ci0JICAgIGlmIChsZWFkaW5nICE9ICdcMCcgJiYgKm4gPT0gbGVhZGluZykKLQkgICAgICArK247Ci0JICAgIGlmICgqbiA9PSAqbmFtZSAmJiBzdHJjbXAgKG4sIG5hbWUpID09IDApCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JaWYgKGMgPiAwKQotCSAgdmFsdWUgPSBiZmRfYXN5bWJvbF92YWx1ZSAoKnBzKTsKLQlpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX0dMT0JBTCwKLQkJCQkgICAgdmFsdWUpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoaXMgY2FzZSBpcyBmYWtlZCBieSBhIGNvbmRpdGlvbmFsIGFib3ZlLCB3aGVuIHRoZXJlIGlzIG5vCi0JIGNvZGUgbGV0dGVyIGluIHRoZSBkYnggZGF0YS4gIERieCBkYXRhIG5ldmVyIGFjdHVhbGx5Ci0JIGNvbnRhaW5zICdsJy4gICovCi0gICAgY2FzZSAnbCc6Ci0gICAgY2FzZSAncyc6Ci0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX0xPQ0FMLAotCQkJCSAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgICAvKiBBIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCi0gICAgICBpZiAoKnAgIT0gJ0YnKQotCWR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgZWxzZQotCXsKLQkvKiBwRiBpcyBhIHR3by1sZXR0ZXIgY29kZSB0aGF0IG1lYW5zIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGluCi0JICAgRm9ydHJhbi4gIFRoZSB0eXBlLW51bWJlciBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybgotCSAgIHZhbHVlLiAgVHJhbnNsYXRlIGl0IGludG8gYSBwb2ludGVyLXRvLWZ1bmN0aW9uIHR5cGUuICAqLwotCSAgKytwOwotCSAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJCSAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChkdHlwZSAhPSBERUJVR19UWVBFX05VTEwpCi0JICAgIHsKLQkgICAgICBkZWJ1Z190eXBlIGZ0eXBlOwotCi0JICAgICAgZnR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIGR0eXBlLAotCQkJCQkJKGRlYnVnX3R5cGUgKikgTlVMTCwgZmFsc2UpOwotCSAgICAgIGR0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsIGZ0eXBlKTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIERFQlVHX1BBUk1fU1RBQ0ssCi0JCQkJICAgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZJWE1FOiBBdCB0aGlzIHBvaW50IGdkYiBjb25zaWRlcnMgcmVhcnJhbmdpbmcgdGhlIHBhcmFtZXRlcgotCSBhZGRyZXNzIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiBhbiBpbnQuCi0JIFdlIGhhdmUgbm8gd2F5IHRvIGRvIHRoYXQsIHNpbmNlIHdlIGRvbid0IHJlYWxseSBrbm93IG11Y2gKLQkgYWJvdXQgdGhlIHRhcmdldC4gICovCi0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUCc6Ci0gICAgICBpZiAoc3RhYnR5cGUgPT0gTl9GVU4pCi0JewotCSAgLyogUHJvdG90eXBlIG9mIGEgZnVuY3Rpb24gcmVmZXJlbmNlZCBieSB0aGlzIGZpbGUuICAqLwotCSAgd2hpbGUgKCpwID09ICc7JykKLQkgICAgewotCSAgICAgICsrcDsKLQkgICAgICBpZiAocGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCQkgICAoZGVidWdfdHlwZSAqKikgTlVMTCkKLQkJICA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICdSJzoKLSAgICAgIC8qIFBhcmFtZXRlciB3aGljaCBpcyBpbiBhIHJlZ2lzdGVyLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBERUJVR19QQVJNX1JFRywKLQkJCQkgICAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgICAvKiBSZWdpc3RlciB2YXJpYWJsZSAoZWl0aGVyIGdsb2JhbCBvciBsb2NhbCkuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19SRUdJU1RFUiwKLQkJCQkgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZJWE1FOiBBdCB0aGlzIHBvaW50IGdkYiBjaGVja3MgdG8gY29tYmluZSBwYWlycyBvZiAncCcgYW5kCi0JICdyJyBzdGFicyBpbnRvIGEgc2luZ2xlICdQJyBzdGFiLiAgKi8KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgIC8qIFN0YXRpYyBzeW1ib2wgYXQgdG9wIGxldmVsIG9mIGZpbGUgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfU1RBVElDLAotCQkJCSAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICAvKiBBIHR5cGVkZWYuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsICZwLCAmc2xvdCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JewotCSAgLyogQSBuYW1lbGVzcyB0eXBlLiAgTm90aGluZyB0byBkby4gICovCi0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGR0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCBkdHlwZSk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHNsb3QgIT0gTlVMTCkKLQkqc2xvdCA9IGR0eXBlOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogU3RydWN0LCB1bmlvbiwgb3IgZW51bSB0YWcuICBGb3IgR05VIEMrKywgdGhpcyBjYW4gYmUgYmUgZm9sbG93ZWQKLQkgYnkgJ3QnIHdoaWNoIG1lYW5zIHdlIGFyZSB0eXBlZGVmJ2luZyBpdCBhcyB3ZWxsLiAgKi8KLSAgICAgIGlmICgqcCAhPSAndCcpCi0JewotCSAgc3lub255bSA9IGZhbHNlOwotCSAgLyogRklYTUU6IGdkYiBzZXRzIHN5bm9ueW0gdG8gdHJ1ZSBpZiB0aGUgY3VycmVudCBsYW5ndWFnZQotICAgICAgICAgICAgIGlzIEMrKy4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bm9ueW0gPSB0cnVlOwotCSAgKytwOwotCX0KLQotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsICZwLCAmc2xvdCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIElORk8tPlNFTEZfQ1JPU1NSRUYgaXMgc2V0IGJ5IHBhcnNlX3N0YWJfdHlwZSBpZiB0aGlzIHR5cGUgaXMKLSAgICAgICAgIGEgY3Jvc3MgcmVmZXJlbmNlIHRvIGl0c2VsZi4gIFRoZXNlIGFyZSBnZW5lcmF0ZWQgYnkgc29tZQotICAgICAgICAgdmVyc2lvbnMgb2YgZysrLiAgKi8KLSAgICAgIHNlbGZfY3Jvc3NyZWYgPSBpbmZvLT5zZWxmX2Nyb3NzcmVmOwotCi0gICAgICBkdHlwZSA9IGRlYnVnX3RhZ190eXBlIChkaGFuZGxlLCBuYW1lLCBkdHlwZSk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChzbG90ICE9IE5VTEwpCi0JKnNsb3QgPSBkdHlwZTsKLQotICAgICAgLyogU2VlIGlmIHdlIGhhdmUgYSBjcm9zcyByZWZlcmVuY2UgdG8gdGhpcyB0YWcgd2hpY2ggd2UgY2FuIG5vdwotICAgICAgICAgZmlsbCBpbi4gIEF2b2lkIGZpbGxpbmcgaW4gYSBjcm9zcyByZWZlcmVuY2UgdG8gb3Vyc2VsdmVzLAotICAgICAgICAgYmVjYXVzZSB0aGF0IHdvdWxkIGxlYWQgdG8gY2lyY3VsYXIgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmICghIHNlbGZfY3Jvc3NyZWYpCi0JewotCSAgcmVnaXN0ZXIgc3RydWN0IHN0YWJfdGFnICoqcHN0OwotCi0JICBmb3IgKHBzdCA9ICZpbmZvLT50YWdzOyAqcHN0ICE9IE5VTEw7IHBzdCA9ICYoKnBzdCktPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKCpwc3QpLT5uYW1lWzBdID09IG5hbWVbMF0KLQkJICAmJiBzdHJjbXAgKCgqcHN0KS0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJewotCQkgICgqcHN0KS0+c2xvdCA9IGR0eXBlOwotCQkgICpwc3QgPSAoKnBzdCktPm5leHQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHN5bm9ueW0pCi0JewotCSAgZHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIGR0eXBlKTsKLQkgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKHNsb3QgIT0gTlVMTCkKLQkgICAgKnNsb3QgPSBkdHlwZTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICAvKiBTdGF0aWMgc3ltYm9sIG9mIGxvY2FsIHNjb3BlICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLAotCQkJCSAgREVCVUdfTE9DQUxfU1RBVElDLCB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd2JzoKLSAgICAgIC8qIFJlZmVyZW5jZSBwYXJhbWV0ZXIuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIERFQlVHX1BBUk1fUkVGRVJFTkNFLAotCQkJCSAgICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdhJzoKLSAgICAgIC8qIFJlZmVyZW5jZSBwYXJhbWV0ZXIgd2hpY2ggaXMgaW4gYSByZWdpc3Rlci4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9SRUZfUkVHLAotCQkJCSAgICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICAgIC8qIFRoaXMgaXMgdXNlZCBieSBTdW4gRk9SVFJBTiBmb3IgImZ1bmN0aW9uIHJlc3VsdCB2YWx1ZSIuCi0JIFN1biBjbGFpbXMgKCJkYnggYW5kIGRieHRvb2wgaW50ZXJmYWNlcyIsIDJuZCBlZCkKLQkgdGhhdCBQYXNjYWwgdXNlcyBpdCB0b28sIGJ1dCB3aGVuIEkgdHJpZWQgaXQgUGFzY2FsIHVzZWQKLQkgIng6MyIgKGxvY2FsIHN5bWJvbCkgaW5zdGVhZC4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX0xPQ0FMLAotCQkJCSAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJhZF9zdGFiIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBGSVhNRTogZ2RiIGNvbnZlcnRzIHN0cnVjdHVyZSB2YWx1ZXMgdG8gc3RydWN0dXJlIHBvaW50ZXJzIGluIGEKLSAgICAgY291cGxlIG9mIGNhc2VzLCBkZXBlbmRpbmcgdXBvbiB0aGUgdGFyZ2V0LiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYSBzdGFicyB0eXBlLiAgVGhlIHR5cGVuYW1lIGFyZ3VtZW50IGlzIG5vbi1OVUxMIGlmIHRoaXMgaXMgYQotICAgdHlwZWRlZiBvciBhIHRhZyBkZWZpbml0aW9uLiAgVGhlIHBwIGFyZ3VtZW50IHBvaW50cyB0byB0aGUgc3RhYgotICAgc3RyaW5nLCBhbmQgaXMgdXBkYXRlZC4gIFRoZSBzbG90cCBhcmd1bWVudCBwb2ludHMgdG8gYSBwbGFjZSB0bwotICAgc3RvcmUgdGhlIHNsb3QgdXNlZCBpZiB0aGUgdHlwZSBpcyBiZWluZyBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW5hbWUsIHBwLCBzbG90cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqKnNsb3RwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBpbnQgdHlwZW51bXNbMl07Ci0gIGludCBzaXplOwotICBib29sZWFuIHN0cmluZ3A7Ci0gIGludCBkZXNjcmlwdG9yOwotICBkZWJ1Z190eXBlIGR0eXBlOwotCi0gIGlmIChzbG90cCAhPSBOVUxMKQotICAgICpzbG90cCA9IE5VTEw7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBzaXplID0gLTE7Ci0gIHN0cmluZ3AgPSBmYWxzZTsKLQotICBpbmZvLT5zZWxmX2Nyb3NzcmVmID0gZmFsc2U7Ci0KLSAgLyogUmVhZCB0eXBlIG51bWJlciBpZiBwcmVzZW50LiAgVGhlIHR5cGUgbnVtYmVyIG1heSBiZSBvbWl0dGVkLgotICAgICBmb3IgaW5zdGFuY2UgaW4gYSB0d28tZGltZW5zaW9uYWwgYXJyYXkgZGVjbGFyZWQgd2l0aCB0eXBlCi0gICAgICJhcjE7MTsxMDthcjE7MTsxMDs0Ii4gICovCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSAmJiAqKnBwICE9ICcoJyAmJiAqKnBwICE9ICctJykKLSAgICB7Ci0gICAgICAvKiAndHlwZW51bXM9JyBub3QgcHJlc2VudCwgdHlwZSBpcyBhbm9ueW1vdXMuICBSZWFkIGFuZCByZXR1cm4KLQkgdGhlIGRlZmluaXRpb24sIGJ1dCBkb24ndCBwdXQgaXQgaW4gdGhlIHR5cGUgdmVjdG9yLiAgKi8KLSAgICAgIHR5cGVudW1zWzBdID0gdHlwZW51bXNbMV0gPSAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgdHlwZW51bXMpKQotCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgICAgIGlmICgqKnBwICE9ICc9JykKLQl7Ci0JICAvKiBUeXBlIGlzIG5vdCBiZWluZyBkZWZpbmVkIGhlcmUuICBFaXRoZXIgaXQgYWxyZWFkeQotCSAgICAgZXhpc3RzLCBvciB0aGlzIGlzIGEgZm9yd2FyZCByZWZlcmVuY2UgdG8gaXQuICAqLwotCSAgcmV0dXJuIHN0YWJfZmluZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcyk7Ci0JfQotCi0gICAgICAvKiBPbmx5IHNldCB0aGUgc2xvdCBpZiB0aGUgdHlwZSBpcyBiZWluZyBkZWZpbmVkLiAgVGhpcyBtZWFucwotICAgICAgICAgdGhhdCB0aGUgbWFwcGluZyBmcm9tIHR5cGUgbnVtYmVycyB0byB0eXBlcyB3aWxsIG9ubHkgcmVjb3JkCi0gICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZiB3aGljaCBkZWZpbmVzIGEgdHlwZS4gIElmIHdlIGRvbid0IGRvCi0gICAgICAgICB0aGlzLCB0aGVuIHNvbWV0aGluZyBsaWtlCi0JICAgICB0eXBlZGVmIGludCBmb287Ci0JICAgICBpbnQgaTsKLQkgd2lsbCByZWNvcmQgdGhhdCBpIGlzIG9mIHR5cGUgZm9vLiAgVW5mb3J0dW5hdGVseSwgc3RhYnMKLQkgaW5mb3JtYXRpb24gaXMgYW1iaWd1b3VzIGFib3V0IHZhcmlhYmxlIHR5cGVzLiAgRm9yIHRoaXMgY29kZSwKLQkgICAgIHR5cGVkZWYgaW50IGZvbzsKLQkgICAgIGludCBpOwotCSAgICAgZm9vIGo7Ci0JIHRoZSBzdGFicyBpbmZvcm1hdGlvbiByZWNvcmRzIGJvdGggaSBhbmQgaiBhcyBoYXZpbmcgdGhlIHNhbWUKLQkgdHlwZS4gIFRoaXMgY291bGQgYmUgZml4ZWQgYnkgcGF0Y2hpbmcgdGhlIGNvbXBpbGVyLiAgKi8KLSAgICAgIGlmIChzbG90cCAhPSBOVUxMICYmIHR5cGVudW1zWzBdID49IDAgJiYgdHlwZW51bXNbMV0gPj0gMCkKLQkqc2xvdHAgPSBzdGFiX2ZpbmRfc2xvdCAoaW5mbywgdHlwZW51bXMpOwotCi0gICAgICAvKiBUeXBlIGlzIGJlaW5nIGRlZmluZWQgaGVyZS4gICovCi0gICAgICAvKiBTa2lwIHRoZSAnPScuICAqLwotICAgICAgKysqcHA7Ci0KLSAgICAgIHdoaWxlICgqKnBwID09ICdAJykKLQl7Ci0JICBjb25zdCBjaGFyICpwID0gKnBwICsgMTsKLQkgIGNvbnN0IGNoYXIgKmF0dHI7Ci0KLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApIHx8ICpwID09ICcoJyB8fCAqcCA9PSAnLScpCi0JICAgIHsKLQkgICAgICAvKiBNZW1iZXIgdHlwZS4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogVHlwZSBhdHRyaWJ1dGVzLiAgKi8KLQkgIGF0dHIgPSBwOwotCi0JICBmb3IgKDsgKnAgIT0gJzsnOyArK3ApCi0JICAgIHsKLQkgICAgICBpZiAoKnAgPT0gJ1wwJykKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCQl9Ci0JICAgIH0KLQkgICpwcCA9IHAgKyAxOwotCi0JICBzd2l0Y2ggKCphdHRyKQotCSAgICB7Ci0JICAgIGNhc2UgJ3MnOgotCSAgICAgIHNpemUgPSBhdG9pIChhdHRyICsgMSk7Ci0JICAgICAgaWYgKHNpemUgPD0gMCkKLQkJc2l6ZSA9IC0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIHN0cmluZ3AgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogSWdub3JlIHVucmVjb2duaXplZCB0eXBlIGF0dHJpYnV0ZXMsIHNvIGZ1dHVyZQotCQkgY29tcGlsZXJzIGNhbiBpbnZlbnQgbmV3IG9uZXMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBkZXNjcmlwdG9yID0gKipwcDsKLSAgKysqcHA7Ci0KLSAgc3dpdGNoIChkZXNjcmlwdG9yKQotICAgIHsKLSAgICBjYXNlICd4JzoKLSAgICAgIHsKLQllbnVtIGRlYnVnX3R5cGVfa2luZCBjb2RlOwotCWNvbnN0IGNoYXIgKnExLCAqcTIsICpwOwotCi0JLyogQSBjcm9zcyByZWZlcmVuY2UgdG8gYW5vdGhlciB0eXBlLiAgKi8KLQotCXN3aXRjaCAoKipwcCkKLQkgIHsKLQkgIGNhc2UgJ3MnOgotCSAgICBjb2RlID0gREVCVUdfS0lORF9TVFJVQ1Q7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAndSc6Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX1VOSU9OOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2UnOgotCSAgICBjb2RlID0gREVCVUdfS0lORF9FTlVNOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIC8qIENvbXBsYWluIGFuZCBrZWVwIGdvaW5nLCBzbyBjb21waWxlcnMgY2FuIGludmVudCBuZXcKLQkgICAgICAgY3Jvc3MtcmVmZXJlbmNlIHR5cGVzLiAgKi8KLQkgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bnJlY29nbml6ZWQgY3Jvc3MgcmVmZXJlbmNlIHR5cGUiKSk7Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX1NUUlVDVDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JKysqcHA7Ci0KLQlxMSA9IHN0cmNociAoKnBwLCAnPCcpOwotCXAgPSBzdHJjaHIgKCpwcCwgJzonKTsKLQlpZiAocCA9PSBOVUxMKQotCSAgewotCSAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICB9Ci0JaWYgKHExICE9IE5VTEwgJiYgcCA+IHExICYmIHBbMV0gPT0gJzonKQotCSAgewotCSAgICBpbnQgbmVzdCA9IDA7Ci0KLQkgICAgZm9yIChxMiA9IHExOyAqcTIgIT0gJ1wwJzsgKytxMikKLQkgICAgICB7Ci0JCWlmICgqcTIgPT0gJzwnKQotCQkgICsrbmVzdDsKLQkJZWxzZSBpZiAoKnEyID09ICc+JykKLQkJICAtLW5lc3Q7Ci0JCWVsc2UgaWYgKCpxMiA9PSAnOicgJiYgbmVzdCA9PSAwKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgcCA9IHEyOwotCSAgICBpZiAoKnAgIT0gJzonKQotCSAgICAgIHsKLQkJYmFkX3N0YWIgKG9yaWcpOwotCQlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIFNvbWUgdmVyc2lvbnMgb2YgZysrIGNhbiBlbWl0IHN0YWJzIGxpa2UKLQkgICAgICAgZmxlZXA6VDIwPXhzZmxlZXA6Ci0JICAgd2hpY2ggZGVmaW5lIHN0cnVjdHVyZXMgaW4gdGVybXMgb2YgdGhlbXNlbHZlcy4gIFdlIG5lZWQgdG8KLQkgICB0ZWxsIHRoZSBjYWxsZXIgdG8gYXZvaWQgYnVpbGRpbmcgYSBjaXJjdWxhciBzdHJ1Y3R1cmUuICAqLwotCWlmICh0eXBlbmFtZSAhPSBOVUxMCi0JICAgICYmIHN0cm5jbXAgKHR5cGVuYW1lLCAqcHAsIHAgLSAqcHApID09IDAKLQkgICAgJiYgdHlwZW5hbWVbcCAtICpwcF0gPT0gJ1wwJykKLQkgIGluZm8tPnNlbGZfY3Jvc3NyZWYgPSB0cnVlOwotCi0JZHR5cGUgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIGluZm8sICpwcCwgcCAtICpwcCwgY29kZSk7Ci0KLQkqcHAgPSBwICsgMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgY2FzZSAnKCc6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqaG9sZDsKLQlpbnQgeHR5cGVudW1zWzJdOwotCi0JLyogVGhpcyB0eXBlIGlzIGRlZmluZWQgYXMgYW5vdGhlciB0eXBlLiAgKi8KLQotCSgqcHApLS07Ci0JaG9sZCA9ICpwcDsKLQotCS8qIFBlZWsgYWhlYWQgYXQgdGhlIG51bWJlciB0byBkZXRlY3Qgdm9pZC4gICovCi0JaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHh0eXBlbnVtcykpCi0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0JaWYgKHR5cGVudW1zWzBdID09IHh0eXBlbnVtc1swXSAmJiB0eXBlbnVtc1sxXSA9PSB4dHlwZW51bXNbMV0pCi0JICB7Ci0JICAgIC8qIFRoaXMgdHlwZSBpcyBiZWluZyBkZWZpbmVkIGFzIGl0c2VsZiwgd2hpY2ggbWVhbnMgdGhhdAotICAgICAgICAgICAgICAgaXQgaXMgdm9pZC4gICovCi0JICAgIGR0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgKnBwID0gaG9sZDsKLQotCSAgICAvKiBHbyBiYWNrIHRvIHRoZSBudW1iZXIgYW5kIGhhdmUgcGFyc2Vfc3RhYl90eXBlIGdldCBpdC4KLQkgICAgICAgVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBkZWFsIHdpdGggc29tZXRoaW5nIGxpa2UKLQkgICAgICAgdCgxLDIpPSgzLDQpPS4uLiB3aGljaCB0aGUgTHVjaWQgY29tcGlsZXIgdXNlcy4gICovCi0JICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICAgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCi0JaWYgKHR5cGVudW1zWzBdICE9IC0xKQotCSAgewotCSAgICBpZiAoISBzdGFiX3JlY29yZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcywgZHR5cGUpKQotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICB9Ci0KLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgJyonOgotICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgICAgcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLAotCQkJCQkJCShjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkJcHAsCi0JCQkJCQkJKGRlYnVnX3R5cGUgKiopIE5VTEwpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnJic6Ci0gICAgICAvKiBSZWZlcmVuY2UgdG8gYW5vdGhlciB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gKGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUKLQkgICAgICAgKGRoYW5kbGUsCi0JCXBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICAgIC8qIEZ1bmN0aW9uIHJldHVybmluZyBhbm90aGVyIHR5cGUuICAqLwotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLSAgICAgIGR0eXBlID0gKGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZQotCSAgICAgICAoZGhhbmRsZSwKLQkJcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpLAotCQkoZGVidWdfdHlwZSAqKSBOVUxMLCBmYWxzZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgIC8qIENvbnN0IHF1YWxpZmllciBvbiBzb21lIHR5cGUgKFN1bikuICAqLwotICAgICAgLyogRklYTUU6IGdkYiBhY2NlcHRzICdjJyBoZXJlIGlmIG9zOWtfc3RhYnMuICAqLwotICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKGRoYW5kbGUsCi0JCQkJICAgICBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkJICAgICAgcHAsCi0JCQkJCQkgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdCJzoKLSAgICAgIC8qIFZvbGF0aWxlIHF1YWwgb24gc29tZSB0eXBlIChTdW4pLiAgKi8KLSAgICAgIC8qIEZJWE1FOiBnZGIgYWNjZXB0cyAnaScgaGVyZSBpZiBvczlrX3N0YWJzLiAgKi8KLSAgICAgIGR0eXBlID0gKGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZQotCSAgICAgICAoZGhhbmRsZSwKLQkJcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0AnOgotICAgICAgLyogT2Zmc2V0IChjbGFzcyAmIHZhcmlhYmxlKSB0eXBlLiAgVGhpcyBpcyB1c2VkIGZvciBhIHBvaW50ZXIKLSAgICAgICAgIHJlbGF0aXZlIHRvIGFuIG9iamVjdC4gICovCi0gICAgICB7Ci0JZGVidWdfdHlwZSBkb21haW47Ci0JZGVidWdfdHlwZSBtZW10eXBlOwotCi0JLyogTWVtYmVyIHR5cGUuICAqLwotCi0JZG9tYWluID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQlpZiAoZG9tYWluID09IERFQlVHX1RZUEVfTlVMTCkKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQlpZiAoKipwcCAhPSAnLCcpCi0JICB7Ci0JICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQkrKypwcDsKLQotCW1lbXR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQlpZiAobWVtdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0JZHR5cGUgPSBkZWJ1Z19tYWtlX29mZnNldF90eXBlIChkaGFuZGxlLCBkb21haW4sIG1lbXR5cGUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcjJzoKLSAgICAgIC8qIE1ldGhvZCAoY2xhc3MgJiBmbikgdHlwZS4gICovCi0gICAgICBpZiAoKipwcCA9PSAnIycpCi0JewotCSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLQotCSAgKysqcHA7Ci0JICByZXR1cm5fdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICBpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgaWYgKCoqcHAgIT0gJzsnKQotCSAgICB7Ci0JICAgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgICsrKnBwOwotCSAgZHR5cGUgPSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChkaGFuZGxlLCByZXR1cm5fdHlwZSwKLQkJCQkJICBERUJVR19UWVBFX05VTEwsCi0JCQkJCSAgKGRlYnVnX3R5cGUgKikgTlVMTCwgZmFsc2UpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkZWJ1Z190eXBlIGRvbWFpbjsKLQkgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0JICBkZWJ1Z190eXBlICphcmdzOwotCSAgdW5zaWduZWQgaW50IG47Ci0JICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0JICBib29sZWFuIHZhcmFyZ3M7Ci0KLQkgIGRvbWFpbiA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgICAgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChkb21haW4gPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0JICBpZiAoKipwcCAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgICAgfQotCSAgKysqcHA7Ci0KLQkgIHJldHVybl90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChyZXR1cm5fdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQkgIGFsbG9jID0gMTA7Ci0JICBhcmdzID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmFyZ3MpOwotCSAgbiA9IDA7Ci0JICB3aGlsZSAoKipwcCAhPSAnOycpCi0JICAgIHsKLQkgICAgICBpZiAoKipwcCAhPSAnLCcpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkJfQotCSAgICAgICsrKnBwOwotCi0JICAgICAgaWYgKG4gKyAxID49IGFsbG9jKQotCQl7Ci0JCSAgYWxsb2MgKz0gMTA7Ci0JCSAgYXJncyA9ICgoZGVidWdfdHlwZSAqKQotCQkJICB4cmVhbGxvYyAoKFBUUikgYXJncywgYWxsb2MgKiBzaXplb2YgKmFyZ3MpKTsKLQkJfQotCi0JICAgICAgYXJnc1tuXSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICAgICAgaWYgKGFyZ3Nbbl0gPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICAgICsrbjsKLQkgICAgfQotCSAgKysqcHA7Ci0KLQkgIC8qIElmIHRoZSBsYXN0IHR5cGUgaXMgbm90IHZvaWQsIHRoZW4gdGhpcyBmdW5jdGlvbiB0YWtlcyBhCi0JICAgICB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgT3RoZXJ3aXNlLCB3ZSBtdXN0IHN0cmlwCi0JICAgICB0aGUgdm9pZCB0eXBlLiAgKi8KLQkgIGlmIChuID09IDAKLQkgICAgICB8fCBkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBhcmdzW24gLSAxXSkgIT0gREVCVUdfS0lORF9WT0lEKQotCSAgICB2YXJhcmdzID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC0tbjsKLQkgICAgICB2YXJhcmdzID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgYXJnc1tuXSA9IERFQlVHX1RZUEVfTlVMTDsKLQotCSAgZHR5cGUgPSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChkaGFuZGxlLCByZXR1cm5fdHlwZSwgZG9tYWluLCBhcmdzLAotCQkJCQkgIHZhcmFyZ3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgICAvKiBSYW5nZSB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9yYW5nZV90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsIHR5cGVudW1zKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6Ci0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotICAgICAgLyogU3VuIEFDQyBidWlsdGluIGludCB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9zdW5fYnVpbHRpbl90eXBlIChkaGFuZGxlLCBwcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgLyogU3VuIEFDQyBidWlsdGluIGZsb2F0IHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3N1bl9mbG9hdGluZ190eXBlIChkaGFuZGxlLCBwcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2UnOgotICAgICAgLyogRW51bWVyYXRpb24gdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfZW51bV90eXBlIChkaGFuZGxlLCBwcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ3UnOgotICAgICAgLyogU3RydWN0IG9yIHVuaW9uIHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3N0cnVjdF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsCi0JCQkJICAgICAgZGVzY3JpcHRvciA9PSAncycsIHR5cGVudW1zKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICAvKiBBcnJheSB0eXBlLiAgKi8KLSAgICAgIGlmICgqKnBwICE9ICdyJykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLSAgICAgICsrKnBwOwotCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfYXJyYXlfdHlwZSAoZGhhbmRsZSwgaW5mbywgcHAsIHN0cmluZ3ApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgIGR0eXBlID0gZGVidWdfbWFrZV9zZXRfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSAgICBwcCwKLQkJCQkJCSAgICAoZGVidWdfdHlwZSAqKikgTlVMTCksCi0JCQkJICAgc3RyaW5ncCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKHR5cGVudW1zWzBdICE9IC0xKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zLCBkdHlwZSkpCi0JcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHNpemUgIT0gLTEpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3R5cGVfc2l6ZSAoZGhhbmRsZSwgZHR5cGUsICh1bnNpZ25lZCBpbnQpIHNpemUpKQotCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkdHlwZTsKLX0KLQotLyogUmVhZCBhIG51bWJlciBieSB3aGljaCBhIHR5cGUgaXMgcmVmZXJyZWQgdG8gaW4gZGJ4IGRhdGEsIG9yCi0gICBwZXJoYXBzIHJlYWQgYSBwYWlyIChGSUxFTlVNLCBUWVBFTlVNKSBpbiBwYXJlbnRoZXNlcy4gIEp1c3QgYQotICAgc2luZ2xlIG51bWJlciBOIGlzIGVxdWl2YWxlbnQgdG8gKDAsTikuICBSZXR1cm4gdGhlIHR3byBudW1iZXJzIGJ5Ci0gICBzdG9yaW5nIHRoZW0gaW4gdGhlIHZlY3RvciBUWVBFTlVNUy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgdHlwZW51bXMpCi0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgaW50ICp0eXBlbnVtczsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLQotICBvcmlnID0gKnBwOwotCi0gIGlmICgqKnBwICE9ICcoJykKLSAgICB7Ci0gICAgICB0eXBlbnVtc1swXSA9IDA7Ci0gICAgICB0eXBlbnVtc1sxXSA9IChpbnQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICsrKnBwOwotICAgICAgdHlwZW51bXNbMF0gPSAoaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICAgIGlmICgqKnBwICE9ICcsJykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICB0eXBlbnVtc1sxXSA9IChpbnQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICAgICAgaWYgKCoqcHAgIT0gJyknKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgcmFuZ2UgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3JhbmdlX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwgdHlwZW51bXMpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGVuYW1lOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGludCByYW5nZW51bXNbMl07Ci0gIGJvb2xlYW4gc2VsZl9zdWJyYW5nZTsKLSAgZGVidWdfdHlwZSBpbmRleF90eXBlOwotICBjb25zdCBjaGFyICpzMiwgKnMzOwotICBiZmRfc2lnbmVkX3ZtYSBuMiwgbjM7Ci0gIGJvb2xlYW4gb3YyLCBvdjM7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBpbmRleF90eXBlID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIC8qIEZpcnN0IGNvbWVzIGEgdHlwZSB3ZSBhcmUgYSBzdWJyYW5nZSBvZi4KLSAgICAgSW4gQyBpdCBpcyB1c3VhbGx5IDAsIDEgb3IgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC4gICovCi0gIGlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCByYW5nZW51bXMpKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgc2VsZl9zdWJyYW5nZSA9IChyYW5nZW51bXNbMF0gPT0gdHlwZW51bXNbMF0KLQkJICAgJiYgcmFuZ2VudW1zWzFdID09IHR5cGVudW1zWzFdKTsKLQotICBpZiAoKipwcCA9PSAnPScpCi0gICAgewotICAgICAgKnBwID0gb3JpZzsKLSAgICAgIGluZGV4X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCoqcHAgPT0gJzsnKQotICAgICsrKnBwOwotCi0gIC8qIFRoZSByZW1haW5pbmcgdHdvIG9wZXJhbmRzIGFyZSB1c3VhbGx5IGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YKLSAgICAgdGhlIHJhbmdlLiAgQnV0IGluIHNvbWUgc3BlY2lhbCBjYXNlcyB0aGV5IG1lYW4gc29tZXRoaW5nIGVsc2UuICAqLwotICBzMiA9ICpwcDsKLSAgbjIgPSBwYXJzZV9udW1iZXIgKHBwLCAmb3YyKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICBzMyA9ICpwcDsKLSAgbjMgPSBwYXJzZV9udW1iZXIgKHBwLCAmb3YzKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICBpZiAob3YyIHx8IG92MykKLSAgICB7Ci0gICAgICAvKiBnY2Mgd2lsbCBlbWl0IHJhbmdlIHN0YWJzIGZvciBsb25nIGxvbmcgdHlwZXMuICBIYW5kbGUgdGhpcwotICAgICAgICAgYXMgYSBzcGVjaWFsIGNhc2UuICBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBtb3JlIGdlbmVyYWwuICAqLwotI2RlZmluZSBMTExPVyAgIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwOyIKLSNkZWZpbmUgTExISUdIICIwNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIKLSNkZWZpbmUgVUxMSElHSCAiMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7IgotICAgICAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXsKLQkgIGlmIChzdHJuY21wIChzMiwgTExMT1csIHNpemVvZiBMTExPVyAtIDEpID09IDAKLQkgICAgICAmJiBzdHJuY21wIChzMywgTExISUdILCBzaXplb2YgTExISUdIIC0gMSkgPT0gMCkKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLQkgIGlmICghIG92MgotCSAgICAgICYmIG4yID09IDAKLQkgICAgICAmJiBzdHJuY21wIChzMywgVUxMSElHSCwgc2l6ZW9mIFVMTEhJR0ggLSAxKSA9PSAwKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0JfQotCi0gICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm51bWVyaWMgb3ZlcmZsb3ciKSk7Ci0gICAgfQotCi0gIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICB7Ci0gICAgICAvKiBBIHR5cGUgZGVmaW5lZCBhcyBhIHN1YnJhbmdlIG9mIGl0c2VsZiwgd2l0aCBib3RoIGJvdW5kcyAwLAotICAgICAgICAgaXMgdm9pZC4gICovCi0gICAgICBpZiAoc2VsZl9zdWJyYW5nZSAmJiBuMiA9PSAwICYmIG4zID09IDApCi0JcmV0dXJuIGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLQotICAgICAgLyogQSB0eXBlIGRlZmluZWQgYXMgYSBzdWJyYW5nZSBvZiBpdHNlbGYsIHdpdGggbjIgcG9zaXRpdmUgYW5kCi0JIG4zIHplcm8sIGlzIGEgY29tcGxleCB0eXBlLCBhbmQgbjIgaXMgdGhlIG51bWJlciBvZiBieXRlcy4gICovCi0gICAgICBpZiAoc2VsZl9zdWJyYW5nZSAmJiBuMyA9PSAwICYmIG4yID4gMCkKLQlyZXR1cm4gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIG4yKTsKLQotICAgICAgLyogSWYgbjMgaXMgemVybyBhbmQgbjIgaXMgcG9zaXRpdmUsIHRoaXMgaXMgYSBmbG9hdGluZyBwb2ludAotICAgICAgICAgdHlwZSwgYW5kIG4yIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuICAqLwotICAgICAgaWYgKG4zID09IDAgJiYgbjIgPiAwKQotCXJldHVybiBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIG4yKTsKLQotICAgICAgLyogSWYgdGhlIHVwcGVyIGJvdW5kIGlzIC0xLCB0aGlzIGlzIGFuIHVuc2lnbmVkIGludC4gICovCi0gICAgICBpZiAobjIgPT0gMCAmJiBuMyA9PSAtMSkKLQl7Ci0JICAvKiBXaGVuIGdjYyBpcyB1c2VkIHdpdGggLWdzdGFicywgYnV0IG5vdCAtZ3N0YWJzKywgaXQgd2lsbCBlbWl0Ci0JICAgICAgICAgbG9uZyBsb25nIGludDp0Nj1yMTswOy0xOwotCQkgbG9uZyBsb25nIHVuc2lnbmVkIGludDp0Nz1yMTswOy0xOwotCSAgICAgV2UgaGFjayBoZXJlIHRvIGhhbmRsZSB0aGlzIHJlYXNvbmFibHkuICAqLwotCSAgaWYgKHR5cGVuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wICh0eXBlbmFtZSwgImxvbmcgbG9uZyBpbnQiKSA9PSAwKQotCQlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJsb25nIGxvbmcgdW5zaWduZWQgaW50IikgPT0gMCkKLQkJcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIHRydWUpOwotCSAgICB9Ci0JICAvKiBGSVhNRTogVGhlIHNpemUgaGVyZSByZWFsbHkgZGVwZW5kcyB1cG9uIHRoZSB0YXJnZXQuICAqLwotCSAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotCX0KLQotICAgICAgLyogQSByYW5nZSBvZiAwIHRvIDEyNyBpcyBjaGFyLiAgKi8KLSAgICAgIGlmIChzZWxmX3N1YnJhbmdlICYmIG4yID09IDAgJiYgbjMgPT0gMTI3KQotCXJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0KLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIGZvciB0aGUgbGFuZ3VhZ2UgQ0hJTEwgaGVyZS4gICovCi0KLSAgICAgIGlmIChuMiA9PSAwKQotCXsKLQkgIGlmIChuMyA8IDApCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAtIG4zLCB0cnVlKTsKLQkgIGVsc2UgaWYgKG4zID09IDB4ZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKLQkgIGVsc2UgaWYgKG4zID09IDB4ZmZmZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotCSAgZWxzZSBpZiAobjMgPT0gKGJmZF9zaWduZWRfdm1hKSAweGZmZmZmZmZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0jaWZkZWYgQkZENjQKLQkgIGVsc2UgaWYgKG4zID09ICgoKChiZmRfdm1hKSAweGZmZmZmZmZmKSA8PCAzMikgfCAweGZmZmZmZmZmKSkKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIHRydWUpOwotI2VuZGlmCi0JfQotICAgICAgZWxzZSBpZiAobjMgPT0gMAotCSAgICAgICAmJiBuMiA8IDAKLQkgICAgICAgJiYgKHNlbGZfc3VicmFuZ2UgfHwgbjIgPT0gLTgpKQotCXJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAtIG4yLCB0cnVlKTsKLSAgICAgIGVsc2UgaWYgKG4yID09IC0gbjMgLSAxIHx8IG4yID09IG4zICsgMSkKLQl7Ci0JICBpZiAobjMgPT0gMHg3ZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLQkgIGVsc2UgaWYgKG4zID09IDB4N2ZmZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLQkgIGVsc2UgaWYgKG4zID09IDB4N2ZmZmZmZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0jaWZkZWYgQkZENjQKLQkgIGVsc2UgaWYgKG4zID09ICgoKChiZmRfdm1hKSAweDdmZmZmZmZmKSA8PCAzMikgfCAweGZmZmZmZmZmKSkKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLSNlbmRpZgotCX0KLSAgICB9Ci0KLSAgLyogQXQgdGhpcyBwb2ludCBJIGRvbid0IGhhdmUgdGhlIGZhaW50ZXN0IGlkZWEgaG93IHRvIGRlYWwgd2l0aCBhCi0gICAgIHNlbGZfc3VicmFuZ2UgdHlwZTsgSSdtIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoaXMgaXMgdXNlZCBhcyBhbgotICAgICBpZGlvbSwgYW5kIHRoYXQgYWxsIG9mIHRoZW0gYXJlIHNwZWNpYWwgY2FzZXMuICBTbyAuIC4gLiAgKi8KLSAgaWYgKHNlbGZfc3VicmFuZ2UpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaW5kZXhfdHlwZSA9IHN0YWJfZmluZF90eXBlIChkaGFuZGxlLCBpbmZvLCByYW5nZW51bXMpOwotICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgewotICAgICAgLyogRG9lcyB0aGlzIGFjdHVhbGx5IGV2ZXIgaGFwcGVuPyAgSXMgdGhhdCB3aHkgd2UgYXJlIHdvcnJ5aW5nCi0gICAgICAgICBhYm91dCBkZWFsaW5nIHdpdGggaXQgcmF0aGVyIHRoYW4ganVzdCBjYWxsaW5nIGVycm9yX3R5cGU/ICAqLwotICAgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJtaXNzaW5nIGluZGV4IHR5cGUiKSk7Ci0gICAgICBpbmRleF90eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgIH0KLQotICByZXR1cm4gZGVidWdfbWFrZV9yYW5nZV90eXBlIChkaGFuZGxlLCBpbmRleF90eXBlLCBuMiwgbjMpOwotfQotCi0vKiBTdW4ncyBBQ0MgdXNlcyBhIHNvbWV3aGF0IHNhbmVyIG1ldGhvZCBmb3Igc3BlY2lmeWluZyB0aGUgYnVpbHRpbgotICAgdHlwZWRlZnMgaW4gZXZlcnkgZmlsZSAoZm9yIGludCwgbG9uZywgZXRjKToKLQotCXR5cGUgPSBiIDxzaWduZWQ+IDx3aWR0aD47IDxvZmZzZXQ+OyA8bmJpdHM+Ci0Jc2lnbmVkID0gdSBvciBzLiAgUG9zc2libGUgYyBpbiBhZGRpdGlvbiB0byB1IG9yIHMgKGZvciBjaGFyPykuCi0Jb2Zmc2V0ID0gb2Zmc2V0IGZyb20gaGlnaCBvcmRlciBiaXQgdG8gc3RhcnQgYml0IG9mIHR5cGUuCi0Jd2lkdGggaXMgIyBieXRlcyBpbiBvYmplY3Qgb2YgdGhpcyB0eXBlLCBuYml0cyBpcyAjIGJpdHMgaW4gdHlwZS4KLQotICAgVGhlIHdpZHRoL29mZnNldCBzdHVmZiBhcHBlYXJzIHRvIGJlIGZvciBzbWFsbCBvYmplY3RzIHN0b3JlZCBpbgotICAgbGFyZ2VyIG9uZXMgKGUuZy4gYHNob3J0cycgaW4gYGludCcgcmVnaXN0ZXJzKS4gIFdlIGlnbm9yZSBpdCBmb3Igbm93LAotICAgRklYTUUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9zdW5fYnVpbHRpbl90eXBlIChkaGFuZGxlLCBwcCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gIGJmZF92bWEgYml0czsKLQotICBvcmlnID0gKnBwOwotCi0gIHN3aXRjaCAoKipwcCkKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgICB1bnNpZ25lZHAgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3UnOgotICAgICAgdW5zaWduZWRwID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgLyogRm9yIHNvbWUgb2RkIHJlYXNvbiwgYWxsIGZvcm1zIG9mIGNoYXIgcHV0IGEgYyBoZXJlLiAgVGhpcyBpcyBzdHJhbmdlCi0gICAgIGJlY2F1c2Ugbm8gb3RoZXIgdHlwZSBoYXMgdGhpcyBob25vci4gIFdlIGNhbiBzYWZlbHkgaWdub3JlIHRoaXMgYmVjYXVzZQotICAgICB3ZSBhY3R1YWxseSBkZXRlcm1pbmUgJ2NoYXInYWN0ZXJuZXNzIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgaW4KLSAgICAgdGhlIGRlc2NyaXB0b3IuICAqLwotICBpZiAoKipwcCA9PSAnYycpCi0gICAgKysqcHA7Ci0KLSAgLyogVGhlIGZpcnN0IG51bWJlciBhcHBlYXJzIHRvIGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQKLSAgICAgYnkgdGhpcyB0eXBlLCBleGNlcHQgdGhhdCB1bnNpZ25lZCBzaG9ydCBpcyA0IGluc3RlYWQgb2YgMi4KLSAgICAgU2luY2UgdGhpcyBpbmZvcm1hdGlvbiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgdGhpcmQgbnVtYmVyLAotICAgICB3ZSB3aWxsIGlnbm9yZSBpdC4gICovCi0gICh2b2lkKSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICAvKiBUaGUgc2Vjb25kIG51bWJlciBpcyBhbHdheXMgMCwgc28gaWdub3JlIGl0IHRvby4gKi8KLSAgKHZvaWQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gICsrKnBwOwotCi0gIC8qIFRoZSB0aGlyZCBudW1iZXIgaXMgdGhlIG51bWJlciBvZiBiaXRzIGZvciB0aGlzIHR5cGUuICovCi0gIGJpdHMgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLQotICAvKiBUaGUgdHlwZSAqc2hvdWxkKiBlbmQgd2l0aCBhIHNlbWljb2xvbi4gIElmIGl0IGFyZSBlbWJlZGRlZAotICAgICBpbiBhIGxhcmdlciB0eXBlIHRoZSBzZW1pY29sb24gbWF5IGJlIHRoZSBvbmx5IHdheSB0byBrbm93IHdoZXJlCi0gICAgIHRoZSB0eXBlIGVuZHMuICBJZiB0aGlzIHR5cGUgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RhYnN0cmluZyB3ZQotICAgICBjYW4gZGVhbCB3aXRoIHRoZSBvbWl0dGVkIHNlbWljb2xvbiAoYnV0IHdlIGRvbid0IGhhdmUgdG8gbGlrZQotICAgICBpdCkuICBEb24ndCBib3RoZXIgdG8gY29tcGxhaW4oKSwgU3VuJ3MgY29tcGlsZXIgb21pdHMgdGhlIHNlbWljb2xvbgotICAgICBmb3IgInZvaWQiLiAgKi8KLSAgaWYgKCoqcHAgPT0gJzsnKQotICAgICsrKnBwOwotCi0gIGlmIChiaXRzID09IDApCi0gICAgcmV0dXJuIGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLQotICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgYml0cyAvIDgsIHVuc2lnbmVkcCk7Ci19Ci0KLS8qIFBhcnNlIGEgYnVpbHRpbiBmbG9hdGluZyB0eXBlIGdlbmVyYXRlZCBieSB0aGUgU3VuIGNvbXBpbGVyLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfc3VuX2Zsb2F0aW5nX3R5cGUgKGRoYW5kbGUsIHBwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBiZmRfdm1hIGRldGFpbHM7Ci0gIGJmZF92bWEgYnl0ZXM7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICAvKiBUaGUgZmlyc3QgbnVtYmVyIGhhcyBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIHR5cGUsIGZvciBleGFtcGxlCi0gICAgIEZOX0NPTVBMRVguICAqLwotICBkZXRhaWxzID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICAvKiBUaGUgc2Vjb25kIG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IHRoaXMgdHlwZSAqLwotICBieXRlcyA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGRldGFpbHMgPT0gTkZfQ09NUExFWAotICAgICAgfHwgZGV0YWlscyA9PSBORl9DT01QTEVYMTYKLSAgICAgIHx8IGRldGFpbHMgPT0gTkZfQ09NUExFWDMyKQotICAgIHJldHVybiBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoZGhhbmRsZSwgYnl0ZXMpOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIGJ5dGVzKTsgICAgICAKLX0KLQotLyogSGFuZGxlIGFuIGVudW0gdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX2VudW1fdHlwZSAoZGhhbmRsZSwgcHApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgYmZkX3NpZ25lZF92bWEgKnZhbHVlczsKLSAgdW5zaWduZWQgaW50IG47Ci0gIHVuc2lnbmVkIGludCBhbGxvYzsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0KLSAgLyogVGhlIGFpeDQgY29tcGlsZXIgZW1pdHMgYW4gZXh0cmEgZmllbGQgYmVmb3JlIHRoZSBlbnVtIG1lbWJlcnM7Ci0gICAgIG15IGd1ZXNzIGlzIGl0J3MgYSB0eXBlIG9mIHNvbWUgc29ydC4gIEp1c3QgaWdub3JlIGl0LiAgKi8KLSAgaWYgKCoqcHAgPT0gJy0nKQotICAgIHsKLSAgICAgIHdoaWxlICgqKnBwICE9ICc6JykKLQkrKypwcDsKLSAgICAgICsrKnBwOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSB2YWx1ZS1uYW1lcyBhbmQgdGhlaXIgdmFsdWVzLgotICAgICBUaGUgaW5wdXQgc3ludGF4IGlzIE5BTUU6VkFMVUUsTkFNRTpWQUxVRSwgYW5kIHNvIG9uLgotICAgICBBIHNlbWljb2xvbiBvciBjb21tYSBpbnN0ZWFkIG9mIGEgTkFNRSBtZWFucyB0aGUgZW5kLiAgKi8KLSAgYWxsb2MgPSAxMDsKLSAgbmFtZXMgPSAoY29uc3QgY2hhciAqKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLSAgdmFsdWVzID0gKGJmZF9zaWduZWRfdm1hICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICp2YWx1ZXMpOwotICBuID0gMDsKLSAgd2hpbGUgKCoqcHAgIT0gJ1wwJyAmJiAqKnBwICE9ICc7JyAmJiAqKnBwICE9ICcsJykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpwOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHZhbDsKLQotICAgICAgcCA9ICpwcDsKLSAgICAgIHdoaWxlICgqcCAhPSAnOicpCi0JKytwOwotCi0gICAgICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQotICAgICAgKnBwID0gcCArIDE7Ci0gICAgICB2YWwgPSAoYmZkX3NpZ25lZF92bWEpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICAgICAgaWYgKCoqcHAgIT0gJywnKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotICAgICAgKysqcHA7Ci0KLSAgICAgIGlmIChuICsgMSA+PSBhbGxvYykKLQl7Ci0JICBhbGxvYyArPSAxMDsKLQkgIG5hbWVzID0gKChjb25zdCBjaGFyICoqKQotCQkgICB4cmVhbGxvYyAoKFBUUikgbmFtZXMsIGFsbG9jICogc2l6ZW9mICpuYW1lcykpOwotCSAgdmFsdWVzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkgICAgeHJlYWxsb2MgKChQVFIpIHZhbHVlcywgYWxsb2MgKiBzaXplb2YgKnZhbHVlcykpOwotCX0KLQotICAgICAgbmFtZXNbbl0gPSBuYW1lOwotICAgICAgdmFsdWVzW25dID0gdmFsOwotICAgICAgKytuOwotICAgIH0KLQotICBuYW1lc1tuXSA9IE5VTEw7Ci0gIHZhbHVlc1tuXSA9IDA7Ci0KLSAgaWYgKCoqcHAgPT0gJzsnKQotICAgICsrKnBwOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2VudW1fdHlwZSAoZGhhbmRsZSwgbmFtZXMsIHZhbHVlcyk7Ci19Ci0KLS8qIFJlYWQgdGhlIGRlc2NyaXB0aW9uIG9mIGEgc3RydWN0dXJlIChvciB1bmlvbiB0eXBlKSBhbmQgcmV0dXJuIGFuIG9iamVjdAotICAgZGVzY3JpYmluZyB0aGUgdHlwZS4KLQotICAgUFAgcG9pbnRzIHRvIGEgY2hhcmFjdGVyIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gdGhlIG5leHQgdW5jb25zdW1lZCB0b2tlbgotICAgaW4gdGhlIHRoZSBzdGFicyBzdHJpbmcuICBGb3IgZXhhbXBsZSwgZ2l2ZW4gc3RhYnMgIkE6VDQ9czRhOjEsMCwzMjs7IiwKLSAgICpQUCB3aWxsIHBvaW50IHRvICI0YToxLDAsMzI7OyIuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgaW5mbywgdGFnbmFtZSwgcHAsIHN0cnVjdHAsIHR5cGVudW1zKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0YWduYW1lOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgYmZkX3ZtYSBzaXplOwotICBkZWJ1Z19iYXNlY2xhc3MgKmJhc2VjbGFzc2VzOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICBib29sZWFuIHN0YXRpY3M7Ci0gIGRlYnVnX21ldGhvZCAqbWV0aG9kczsKLSAgZGVidWdfdHlwZSB2cHRyYmFzZTsKLSAgYm9vbGVhbiBvd252cHRyOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogR2V0IHRoZSBzaXplLiAgKi8KLSAgc2l6ZSA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotCi0gIC8qIEdldCB0aGUgb3RoZXIgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBwYXJzZV9zdGFiX2Jhc2VjbGFzc2VzIChkaGFuZGxlLCBpbmZvLCBwcCwgJmJhc2VjbGFzc2VzKQotICAgICAgfHwgISBwYXJzZV9zdGFiX3N0cnVjdF9maWVsZHMgKGRoYW5kbGUsIGluZm8sIHBwLCAmZmllbGRzLCAmc3RhdGljcykKLSAgICAgIHx8ICEgcGFyc2Vfc3RhYl9tZW1iZXJzIChkaGFuZGxlLCBpbmZvLCB0YWduYW1lLCBwcCwgdHlwZW51bXMsICZtZXRob2RzKQotICAgICAgfHwgISBwYXJzZV9zdGFiX3RpbGRlX2ZpZWxkIChkaGFuZGxlLCBpbmZvLCBwcCwgdHlwZW51bXMsICZ2cHRyYmFzZSwKLQkJCQkgICAmb3dudnB0cikpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAoISBzdGF0aWNzCi0gICAgICAmJiBiYXNlY2xhc3NlcyA9PSBOVUxMCi0gICAgICAmJiBtZXRob2RzID09IE5VTEwKLSAgICAgICYmIHZwdHJiYXNlID09IERFQlVHX1RZUEVfTlVMTAotICAgICAgJiYgISBvd252cHRyKQotICAgIHJldHVybiBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChkaGFuZGxlLCBzdHJ1Y3RwLCBzaXplLCBmaWVsZHMpOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX29iamVjdF90eXBlIChkaGFuZGxlLCBzdHJ1Y3RwLCBzaXplLCBmaWVsZHMsIGJhc2VjbGFzc2VzLAotCQkJCSBtZXRob2RzLCB2cHRyYmFzZSwgb3dudnB0cik7Ci19Ci0KLS8qIFRoZSBzdGFicyBmb3IgQysrIGRlcml2ZWQgY2xhc3NlcyBjb250YWluIGJhc2VjbGFzcyBpbmZvcm1hdGlvbiB3aGljaAotICAgaXMgbWFya2VkIGJ5IGEgJyEnIGNoYXJhY3RlciBhZnRlciB0aGUgdG90YWwgc2l6ZS4gIFRoaXMgZnVuY3Rpb24gaXMKLSAgIGNhbGxlZCB3aGVuIHdlIGVuY291bnRlciB0aGUgYmFzZWNsYXNzIG1hcmtlciwgYW5kIHNsdXJwcyB1cCBhbGwgdGhlCi0gICBiYXNlY2xhc3MgaW5mb3JtYXRpb24uCi0KLSAgIEltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgJyEnIG1hcmtlciBpcyB0aGUgbnVtYmVyIG9mIGJhc2UgY2xhc3NlcyB0aGF0Ci0gICB0aGUgY2xhc3MgaXMgZGVyaXZlZCBmcm9tLCBmb2xsb3dlZCBieSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBiYXNlIGNsYXNzLgotICAgRm9yIGVhY2ggYmFzZSBjbGFzcywgdGhlcmUgYXJlIHR3byB2aXNpYmlsaXR5IHNwZWNpZmllcnMsIGEgYml0IG9mZnNldAotICAgdG8gdGhlIGJhc2UgY2xhc3MgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBkZXJpdmVkIGNsYXNzLCBhIHJlZmVyZW5jZSB0bwotICAgdGhlIHR5cGUgZm9yIHRoZSBiYXNlIGNsYXNzLCBhbmQgYSB0ZXJtaW5hdGluZyBzZW1pY29sb24uCi0KLSAgIEEgdHlwaWNhbCBleGFtcGxlLCB3aXRoIHR3byBiYXNlIGNsYXNzZXMsIHdvdWxkIGJlICIhMiwwMjAsMTk7MDI2NCwyMTsiLgotICAgCQkJCQkJICAgICAgIF5eIF4gXiBeICBeIF4gIF4KLQlCYXNlY2xhc3MgaW5mb3JtYXRpb24gbWFya2VyIF9fX19fX19fX19fX19fX19fX3x8IHwgfCB8ICB8IHwgIHwKLQlOdW1iZXIgb2YgYmFzZWNsYXNzZXMgX19fX19fX19fX19fX19fX19fX19fX19fX198IHwgfCB8ICB8IHwgIHwKLQlWaXNpYmlsaXR5IHNwZWNpZmllcnMgKDIpIF9fX19fX19fX19fX19fX19fX19fX19fX3wgfCB8ICB8IHwgIHwKLQlPZmZzZXQgaW4gYml0cyBmcm9tIHN0YXJ0IG9mIGNsYXNzIF9fX19fX19fX19fX19fX19ffCB8ICB8IHwgIHwKLQlUeXBlIG51bWJlciBmb3IgYmFzZSBjbGFzcyBfX19fX19fX19fX19fX19fX19fX19fX19fX198ICB8IHwgIHwKLQlWaXNpYmlsaXR5IHNwZWNpZmllcnMgKDIpIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198IHwgIHwKLQlPZmZzZXQgaW4gYml0cyBmcm9tIHN0YXJ0IG9mIGNsYXNzIF9fX19fX19fX19fX19fX19fX19fX19fX3wgIHwKLQlUeXBlIG51bWJlciBvZiBiYXNlIGNsYXNzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLQotICBSZXR1cm4gdHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9iYXNlY2xhc3NlcyAoZGhhbmRsZSwgaW5mbywgcHAsIHJldHApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfYmFzZWNsYXNzICoqcmV0cDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgdW5zaWduZWQgaW50IGMsIGk7Ci0gIGRlYnVnX2Jhc2VjbGFzcyAqY2xhc3NlczsKLQotICAqcmV0cCA9IE5VTEw7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBpZiAoKipwcCAhPSAnIScpCi0gICAgewotICAgICAgLyogTm8gYmFzZSBjbGFzc2VzLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYyA9ICh1bnNpZ25lZCBpbnQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotCi0gIGlmICgqKnBwICE9ICcsJykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBjbGFzc2VzID0gKGRlYnVnX2Jhc2VjbGFzcyAqKSB4bWFsbG9jICgoYyArIDEpICogc2l6ZW9mICgqKnJldHApKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdmlydHVhbDsKLSAgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgICAgIHN3aXRjaCAoKipwcCkKLQl7Ci0JY2FzZSAnMCc6Ci0JICB2aXJ0dWFsID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICcxJzoKLQkgIHZpcnR1YWwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHdhcm5fc3RhYiAob3JpZywgXygidW5rbm93biB2aXJ0dWFsIGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIikpOwotCSAgdmlydHVhbCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKysqcHA7Ci0KLSAgICAgIHN3aXRjaCAoKipwcCkKLQl7Ci0JY2FzZSAnMCc6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCSAgYnJlYWs7Ci0JY2FzZSAnMSc6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0JICBicmVhazsKLQljYXNlICcyJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB3YXJuX3N0YWIgKG9yaWcsIF8oInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGJhc2VjbGFzcyIpKTsKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsrKnBwOwotCi0gICAgICAvKiBUaGUgcmVtYWluaW5nIHZhbHVlIGlzIHRoZSBiaXQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uIG9mIHRoZQotCSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGlzIGJhc2VjbGFzcy4gIEFsd2F5cyB6ZXJvIGluIHRoZQotCSBhYnNlbmNlIG9mIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgKi8KLSAgICAgIGJpdHBvcyA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICAgICAgaWYgKCoqcHAgIT0gJywnKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArKypwcDsKLQotICAgICAgdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBjbGFzc2VzW2ldID0gZGVidWdfbWFrZV9iYXNlY2xhc3MgKGRoYW5kbGUsIHR5cGUsIGJpdHBvcywgdmlydHVhbCwKLQkJCQkJIHZpc2liaWxpdHkpOwotICAgICAgaWYgKGNsYXNzZXNbaV0gPT0gREVCVUdfQkFTRUNMQVNTX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoKipwcCAhPSAnOycpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIGNsYXNzZXNbaV0gPSBERUJVR19CQVNFQ0xBU1NfTlVMTDsKLQotICAqcmV0cCA9IGNsYXNzZXM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgc3RydWN0IG9yIGNsYXNzIGRhdGEgZmllbGRzLiAgVGhleSBoYXZlIHRoZSBmb3JtOgotCi0gICAJTkFNRSA6IFtWSVNJQklMSVRZXSBUWVBFTlVNICwgQklUUE9TICwgQklUU0laRSA7Ci0KLSAgIEF0IHRoZSBlbmQsIHdlIHNlZSBhIHNlbWljb2xvbiBpbnN0ZWFkIG9mIGEgZmllbGQuCi0KLSAgIEluIEMrKywgdGhpcyBtYXkgd2luZCB1cCBiZWluZyBOQU1FOj9UWVBFTlVNOlBIWVNOQU1FOyBmb3IKLSAgIGEgc3RhdGljIGZpZWxkLgotCi0gICBUaGUgb3B0aW9uYWwgVklTSUJJTElUWSBpcyBvbmUgb2Y6Ci0KLSAgIAknLzAnCShWSVNJQklMSVRZX1BSSVZBVEUpCi0JJy8xJwkoVklTSUJJTElUWV9QUk9URUNURUQpCi0JJy8yJwkoVklTSUJJTElUWV9QVUJMSUMpCi0JJy85JwkoVklTSUJJTElUWV9JR05PUkUpCi0KLSAgIG9yIG5vdGhpbmcsIGZvciBDIHN0eWxlIGZpZWxkcyB3aXRoIHB1YmxpYyB2aXNpYmlsaXR5LgotCi0gICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9zdHJ1Y3RfZmllbGRzIChkaGFuZGxlLCBpbmZvLCBwcCwgcmV0cCwgc3RhdGljc3ApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfZmllbGQgKipyZXRwOwotICAgICBib29sZWFuICpzdGF0aWNzcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY29uc3QgY2hhciAqcDsKLSAgZGVidWdfZmllbGQgKmZpZWxkczsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIHVuc2lnbmVkIGludCBhbGxvYzsKLQotICAqcmV0cCA9IE5VTEw7Ci0gICpzdGF0aWNzcCA9IGZhbHNlOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgYyA9IDA7Ci0gIGFsbG9jID0gMTA7Ci0gIGZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKLSAgd2hpbGUgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0KLSAgICAgIHAgPSAqcHA7Ci0KLSAgICAgIC8qIEFkZCAxIHRvIGMgdG8gbGVhdmUgcm9vbSBmb3IgTlVMTCBwb2ludGVyIGF0IGVuZC4gICovCi0gICAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JewotCSAgYWxsb2MgKz0gMTA7Ci0JICBmaWVsZHMgPSAoKGRlYnVnX2ZpZWxkICopCi0JCSAgICB4cmVhbGxvYyAoKFBUUikgZmllbGRzLCBhbGxvYyAqIHNpemVvZiAqZmllbGRzKSk7Ci0JfQotCi0gICAgICAvKiBJZiBpdCBzdGFydHMgd2l0aCBDUExVU19NQVJLRVIgaXQgaXMgYSBzcGVjaWFsIGFiYnJldmlhdGlvbiwKLQkgdW5sZXNzIHRoZSBDUExVU19NQVJLRVIgaXMgZm9sbG93ZWQgYnkgYW4gdW5kZXJzY29yZSwgaW4KLQkgd2hpY2ggY2FzZSBpdCBpcyBqdXN0IHRoZSBuYW1lIG9mIGFuIGFub255bW91cyB0eXBlLCB3aGljaCB3ZQotCSBzaG91bGQgaGFuZGxlIGxpa2UgYW55IG90aGVyIHR5cGUgbmFtZS4gIFdlIGFjY2VwdCBlaXRoZXIgJyQnCi0JIG9yICcuJywgYmVjYXVzZSBhIGZpZWxkIG5hbWUgY2FuIG5ldmVyIGNvbnRhaW4gb25lIG9mIHRoZXNlCi0JIGNoYXJhY3RlcnMgZXhjZXB0IGFzIGEgQ1BMVVNfTUFSS0VSLiAgKi8KLQotICAgICAgaWYgKCgqcCA9PSAnJCcgfHwgKnAgPT0gJy4nKSAmJiBwWzFdICE9ICdfJykKLQl7Ci0JICArKypwcDsKLQkgIGlmICghIHBhcnNlX3N0YWJfY3BwX2FiYnJldiAoZGhhbmRsZSwgaW5mbywgcHAsIGZpZWxkcyArIGMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICArK2M7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIHRoZSAnOicgdGhhdCBzZXBhcmF0ZXMgdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUgZmllbGQKLQkgdmFsdWVzLiAgRGF0YSBtZW1iZXJzIGFyZSBkZWxpbWl0ZWQgYnkgYSBzaW5nbGUgJzonLCB3aGlsZSBtZW1iZXIKLQkgZnVuY3Rpb25zIGFyZSBkZWxpbWl0ZWQgYnkgYSBwYWlyIG9mICc6J3MuICBXaGVuIHdlIGhpdCB0aGUgbWVtYmVyCi0JIGZ1bmN0aW9ucyAoaWYgYW55KSwgdGVybWluYXRlIHNjYW4gbG9vcCBhbmQgcmV0dXJuLiAqLwotCi0gICAgICBwID0gc3RyY2hyIChwLCAnOicpOwotICAgICAgaWYgKHAgPT0gTlVMTCkKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocFsxXSA9PSAnOicpCi0JYnJlYWs7Ci0KLSAgICAgIGlmICghIHBhcnNlX3N0YWJfb25lX3N0cnVjdF9maWVsZCAoZGhhbmRsZSwgaW5mbywgcHAsIHAsIGZpZWxkcyArIGMsCi0JCQkJCSBzdGF0aWNzcCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICArK2M7Ci0gICAgfQotCi0gIGZpZWxkc1tjXSA9IERFQlVHX0ZJRUxEX05VTEw7Ci0KLSAgKnJldHAgPSBmaWVsZHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNwZWNpYWwgR05VIEMrKyBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfY3BwX2FiYnJldiAoZGhhbmRsZSwgaW5mbywgcHAsIHJldHApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfZmllbGQgKnJldHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGludCBjcHBfYWJicmV2OwotICBkZWJ1Z190eXBlIGNvbnRleHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKnR5cGVuYW1lOwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIGJmZF92bWEgYml0cG9zOwotCi0gICpyZXRwID0gREVCVUdfRklFTERfTlVMTDsKLQotICBvcmlnID0gKnBwOwotCi0gIGlmICgqKnBwICE9ICd2JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAoKnBwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGNwcF9hYmJyZXYgPSAqKnBwOwotICArKypwcDsKLQotICAvKiBBdCB0aGlzIHBvaW50LCAqcHAgcG9pbnRzIHRvIHNvbWV0aGluZyBsaWtlICIyMjoyMz0qMjIuLi4iLCB3aGVyZQotICAgICB0aGUgdHlwZSBudW1iZXIgYmVmb3JlIHRoZSAnOicgaXMgdGhlICJjb250ZXh0IiBhbmQgZXZlcnl0aGluZwotICAgICBhZnRlciBpcyBhIHJlZ3VsYXIgdHlwZSBkZWZpbml0aW9uLiAgTG9va3VwIHRoZSB0eXBlLCBmaW5kIGl0J3MKLSAgICAgbmFtZSwgYW5kIGNvbnN0cnVjdCB0aGUgZmllbGQgbmFtZS4gICovCi0KLSAgY29udGV4dCA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgaWYgKGNvbnRleHQgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzd2l0Y2ggKGNwcF9hYmJyZXYpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgLyogJHZmIC0tIGEgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBwb2ludGVyLiAgKi8KLSAgICAgIG5hbWUgPSAiX3ZwdHIkIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgICAgLyogJHZiIC0tIGEgdmlydHVhbCBic29tZXRoaW5nb3JvdGhlciAqLwotICAgICAgdHlwZW5hbWUgPSBkZWJ1Z19nZXRfdHlwZV9uYW1lIChkaGFuZGxlLCBjb250ZXh0KTsKLSAgICAgIGlmICh0eXBlbmFtZSA9PSBOVUxMKQotCXsKLQkgIHdhcm5fc3RhYiAob3JpZywgXygidW5uYW1lZCAkdmIgdHlwZSIpKTsKLQkgIHR5cGVuYW1lID0gIkZPTyI7Ci0JfQotICAgICAgbmFtZSA9IGNvbmNhdCAoIl92YiQiLCB0eXBlbmFtZSwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bnJlY29nbml6ZWQgQysrIGFiYnJldmlhdGlvbiIpKTsKLSAgICAgIG5hbWUgPSAiSU5WQUxJRF9DUExVU1BMVVNfQUJCUkVWIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoKipwcCAhPSAnOicpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJywnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGJpdHBvcyA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgKnJldHAgPSBkZWJ1Z19tYWtlX2ZpZWxkIChkaGFuZGxlLCBuYW1lLCB0eXBlLCBiaXRwb3MsIDAsCi0JCQkgICAgREVCVUdfVklTSUJJTElUWV9QUklWQVRFKTsKLSAgaWYgKCpyZXRwID09IERFQlVHX0ZJRUxEX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHNpbmdsZSBmaWVsZCBpbiBhIHN0cnVjdCBvciB1bmlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX29uZV9zdHJ1Y3RfZmllbGQgKGRoYW5kbGUsIGluZm8sIHBwLCBwLCByZXRwLCBzdGF0aWNzcCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBjaGFyICpwOwotICAgICBkZWJ1Z19maWVsZCAqcmV0cDsKLSAgICAgYm9vbGVhbiAqc3RhdGljc3A7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGNoYXIgKm5hbWU7Ci0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIGJmZF92bWEgYml0cG9zOwotICBiZmRfdm1hIGJpdHNpemU7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBBUk1fREVNQU5HTElORyBoZXJlLiAgKi8KLQotICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQotICAqcHAgPSBwICsgMTsKLQotICBpZiAoKipwcCAhPSAnLycpCi0gICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotICBlbHNlCi0gICAgewotICAgICAgKysqcHA7Ci0gICAgICBzd2l0Y2ggKCoqcHApCi0JewotCWNhc2UgJzAnOgotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkgIGJyZWFrOwotCWNhc2UgJzEnOgotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOwotCSAgYnJlYWs7Ci0JY2FzZSAnMic6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bmtub3duIHZpc2liaWxpdHkgY2hhcmFjdGVyIGZvciBmaWVsZCIpKTsKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsrKnBwOwotICAgIH0KLQotICB0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgqKnBwID09ICc6JykKLSAgICB7Ci0gICAgICBjaGFyICp2YXJuYW1lOwotCi0gICAgICAvKiBUaGlzIGlzIGEgc3RhdGljIGNsYXNzIG1lbWJlci4gICovCi0gICAgICArKypwcDsKLSAgICAgIHAgPSBzdHJjaHIgKCpwcCwgJzsnKTsKLSAgICAgIGlmIChwID09IE5VTEwpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgdmFybmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7Ci0KLSAgICAgICpwcCA9IHAgKyAxOwotCi0gICAgICAqcmV0cCA9IGRlYnVnX21ha2Vfc3RhdGljX21lbWJlciAoZGhhbmRsZSwgbmFtZSwgdHlwZSwgdmFybmFtZSwKLQkJCQkJdmlzaWJpbGl0eSk7Ci0gICAgICAqc3RhdGljc3AgPSB0cnVlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCoqcHAgIT0gJywnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGJpdHBvcyA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnLCcpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYml0c2l6ZSA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgaWYgKGJpdHBvcyA9PSAwICYmIGJpdHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gaW4gdHdvIGNhc2VzOiAoMSkgYXQgbGVhc3QgZm9yIGdjYyAyLjQuNSBvcgotCSBzbywgaXQgaXMgYSBmaWVsZCB3aGljaCBoYXMgYmVlbiBvcHRpbWl6ZWQgb3V0LiAgVGhlIGNvcnJlY3QKLQkgc3RhYiBmb3IgdGhpcyBjYXNlIGlzIHRvIHVzZSBWSVNJQklMSVRZX0lHTk9SRSwgYnV0IHRoYXQgaXMgYQotCSByZWNlbnQgaW52ZW50aW9uLiAgKDIpIEl0IGlzIGEgMC1zaXplIGFycmF5LiAgRm9yIGV4YW1wbGUKLQkgdW5pb24geyBpbnQgbnVtOyBjaGFyIHN0clswXTsgfSBmb28uICBQcmludGluZyAiPG5vIHZhbHVlPiIKLQkgZm9yIHN0ciBpbiAicCBmb28iIGlzIE9LLCBzaW5jZSBmb28uc3RyIChhbmQgdGh1cyBmb28uc3RyWzNdKQotCSB3aWxsIGNvbnRpbnVlIHRvIHdvcmssIGFuZCBhIDAtc2l6ZSBhcnJheSBhcyBhIHdob2xlIGRvZXNuJ3QKLQkgaGF2ZSBhbnkgY29udGVudHMgdG8gcHJpbnQuCi0KLQkgSSBzdXNwZWN0IHRoaXMgcHJvYmFibHkgY291bGQgYWxzbyBoYXBwZW4gd2l0aCBnY2MgLWdzdGFicwotCSAobm90IC1nc3RhYnMrKSBmb3Igc3RhdGljIGZpZWxkcywgYW5kIHBlcmhhcHMgb3RoZXIgQysrCi0JIGV4dGVuc2lvbnMuICBIb3BlZnVsbHkgZmV3IHBlb3BsZSB1c2UgLWdzdGFicyB3aXRoIGdkYiwgc2luY2UKLQkgaXQgaXMgaW50ZW5kZWQgZm9yIGRieCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX0lHTk9SRTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IGdkYiBkb2VzIHNvbWUgc3R1ZmYgaGVyZSB0byBtYXJrIGZpZWxkcyBhcyB1bnBhY2tlZC4gICovCi0KLSAgKnJldHAgPSBkZWJ1Z19tYWtlX2ZpZWxkIChkaGFuZGxlLCBuYW1lLCB0eXBlLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIG1lbWJlciBmdW5jdGlvbiBzdGFicyBpbmZvIGZvciBDKysgY2xhc3Nlcy4gIFRoZSBmb3JtIG9mIGVhY2ggbWVtYmVyCi0gICBmdW5jdGlvbiBkYXRhIGlzOgotCi0JTkFNRSA6OiBUWVBFTlVNWz10eXBlIGRlZmluaXRpb25dIEFSR1MgOiBQSFlTTkFNRSA7Ci0KLSAgIEFuIGV4YW1wbGUgd2l0aCB0d28gbWVtYmVyIGZ1bmN0aW9ucyBpczoKLQotCWFmdW5jMTo6MjA9IyMxNTs6aTsyQS47YWZ1bmMyOjoyMDppOzJBLjsKLQotICAgRm9yIHRoZSBjYXNlIG9mIG92ZXJsb2FkZWQgb3BlcmF0b3JzLCB0aGUgZm9ybWF0IGlzIG9wJDo6Ki5mdW5jcywgd2hlcmUKLSAgICQgaXMgdGhlIENQTFVTX01BUktFUiAodXN1YWxseSAnJCcpLCBgKicgaG9sZHMgdGhlIHBsYWNlIGZvciBhbiBvcGVyYXRvcgotICAgbmFtZSAoc3VjaCBhcyBgKz0nKSBhbmQgYC4nIG1hcmtzIHRoZSBlbmQgb2YgdGhlIG9wZXJhdG9yIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9tZW1iZXJzIChkaGFuZGxlLCBpbmZvLCB0YWduYW1lLCBwcCwgdHlwZW51bXMsIHJldHApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnRhZ25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLSAgICAgZGVidWdfbWV0aG9kICoqcmV0cDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgZGVidWdfbWV0aG9kICptZXRob2RzOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0gICpyZXRwID0gTlVMTDsKLQotICBvcmlnID0gKnBwOwotCi0gIGFsbG9jID0gMDsKLSAgbWV0aG9kcyA9IE5VTEw7Ci0gIGMgPSAwOwotCi0gIHdoaWxlICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpwOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGRlYnVnX21ldGhvZF92YXJpYW50ICp2YXJpYW50czsKLSAgICAgIHVuc2lnbmVkIGludCBjdmFyczsKLSAgICAgIHVuc2lnbmVkIGludCBhbGxvY3ZhcnM7Ci0gICAgICBkZWJ1Z190eXBlIGxvb2tfYWhlYWRfdHlwZTsKLQotICAgICAgcCA9IHN0cmNociAoKnBwLCAnOicpOwotICAgICAgaWYgKHAgPT0gTlVMTCB8fCBwWzFdICE9ICc6JykKLQlicmVhazsKLQotICAgICAgLyogRklYTUU6IFNvbWUgc3lzdGVtcyB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gJyQnIGhlcmUuICAqLwotICAgICAgaWYgKCgqcHApWzBdICE9ICdvJyB8fCAoKnBwKVsxXSAhPSAncCcgfHwgKCpwcClbMl0gIT0gJyQnKQotCXsKLQkgIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCSAgKnBwID0gcCArIDI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBjb21wbGV0ZWx5IHdpZXJkIGNhc2UuICBJbiBvcmRlciB0byBzdHVmZiBpbiB0aGUKLQkgICAgIG5hbWVzIHRoYXQgbWlnaHQgY29udGFpbiBjb2xvbnMgKHRoZSB1c3VhbCBuYW1lIGRlbGltaXRlciksCi0JICAgICBNaWtlIFRpZW1hbm4gZGVmaW5lZCBhIGRpZmZlcmVudCBuYW1lIGZvcm1hdCB3aGljaCBpcwotCSAgICAgc2lnbmFsbGVkIGlmIHRoZSBpZGVudGlmaWVyIGlzICJvcCQiLiAgSW4gdGhhdCBjYXNlLCB0aGUKLQkgICAgIGZvcm1hdCBpcyAib3AkOjpYWFhYLiIgd2hlcmUgWFhYWCBpcyB0aGUgbmFtZS4gIFRoaXMgaXMKLQkgICAgIHVzZWQgZm9yIG5hbWVzIGxpa2UgIisiIG9yICI9Ii4gIFlVVVVVVVVVSyEgIEZJWE1FISAgKi8KLQkgICpwcCA9IHAgKyAyOwotCSAgZm9yIChwID0gKnBwOyAqcCAhPSAnLicgJiYgKnAgIT0gJ1wwJzsgcCsrKQotCSAgICA7Ci0JICBpZiAoKnAgIT0gJy4nKQotCSAgICB7Ci0JICAgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7Ci0JICAqcHAgPSBwICsgMTsKLQl9Ci0KLSAgICAgIGFsbG9jdmFycyA9IDEwOwotICAgICAgdmFyaWFudHMgPSAoKGRlYnVnX21ldGhvZF92YXJpYW50ICopCi0JCSAgeG1hbGxvYyAoYWxsb2N2YXJzICogc2l6ZW9mICp2YXJpYW50cykpOwotICAgICAgY3ZhcnMgPSAwOwotCi0gICAgICBsb29rX2FoZWFkX3R5cGUgPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgICAgIGRvCi0JewotCSAgZGVidWdfdHlwZSB0eXBlOwotCSAgYm9vbGVhbiBzdHViOwotCSAgY2hhciAqYXJndHlwZXM7Ci0JICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLQkgIGJvb2xlYW4gY29uc3RwLCB2b2xhdGlsZXAsIHN0YXRpY3A7Ci0JICBiZmRfdm1hIHZvZmZzZXQ7Ci0JICBkZWJ1Z190eXBlIGNvbnRleHQ7Ci0JICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLQkgIGJvb2xlYW4gdmFyYXJnczsKLQotCSAgaWYgKGxvb2tfYWhlYWRfdHlwZSAhPSBERUJVR19UWVBFX05VTEwpCi0JICAgIHsKLQkgICAgICAvKiBnKysgdmVyc2lvbiAxIGtsdWRnZSAqLwotCSAgICAgIHR5cGUgPSBsb29rX2FoZWFkX3R5cGU7Ci0JICAgICAgbG9va19haGVhZF90eXBlID0gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKCoqcHAgIT0gJzonKQotCQl7Ci0JCSAgYmFkX3N0YWIgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgICsrKnBwOwotCSAgcCA9IHN0cmNociAoKnBwLCAnOycpOwotCSAgaWYgKHAgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgc3R1YiA9IGZhbHNlOwotCSAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIHR5cGUpID09IERFQlVHX0tJTkRfTUVUSE9ECi0JICAgICAgJiYgZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyAoZGhhbmRsZSwgdHlwZSwgJnZhcmFyZ3MpID09IE5VTEwpCi0JICAgIHN0dWIgPSB0cnVlOwotCi0JICBhcmd0eXBlcyA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7Ci0JICAqcHAgPSBwICsgMTsKLQotCSAgc3dpdGNoICgqKnBwKQotCSAgICB7Ci0JICAgIGNhc2UgJzAnOgotCSAgICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzEnOgotCSAgICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgICsrKnBwOwotCi0JICBjb25zdHAgPSBmYWxzZTsKLQkgIHZvbGF0aWxlcCA9IGZhbHNlOwotCSAgc3dpdGNoICgqKnBwKQotCSAgICB7Ci0JICAgIGNhc2UgJ0EnOgotCSAgICAgIC8qIE5vcm1hbCBmdW5jdGlvbi4gICovCi0JICAgICAgKysqcHA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIC8qIGNvbnN0IG1lbWJlciBmdW5jdGlvbi4gICovCi0JICAgICAgY29uc3RwID0gdHJ1ZTsKLQkgICAgICArKypwcDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQyc6Ci0JICAgICAgLyogdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkgICAgICB2b2xhdGlsZXAgPSB0cnVlOwotCSAgICAgICsrKnBwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdEJzoKLQkgICAgICAvKiBjb25zdCB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24uICAqLwotCSAgICAgIGNvbnN0cCA9IHRydWU7Ci0JICAgICAgdm9sYXRpbGVwID0gdHJ1ZTsKLQkgICAgICArKypwcDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnKic6Ci0JICAgIGNhc2UgJz8nOgotCSAgICBjYXNlICcuJzoKLQkgICAgICAvKiBGaWxlIGNvbXBpbGVkIHdpdGggZysrIHZlcnNpb24gMTsgbm8gaW5mb3JtYXRpb24uICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHdhcm5fc3RhYiAob3JpZywgXygiY29uc3Qvdm9sYXRpbGUgaW5kaWNhdG9yIG1pc3NpbmciKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgc3RhdGljcCA9IGZhbHNlOwotCSAgc3dpdGNoICgqKnBwKQotCSAgICB7Ci0JICAgIGNhc2UgJyonOgotCSAgICAgIC8qIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uLCBmb2xsb3dlZCBieSBpbmRleC4gIFRoZSBzaWduCi0JCSBiaXQgaXMgc3VwcG9zZWRseSBzZXQgdG8gZGlzdGluZ3Vpc2gKLQkJIHBvaW50ZXJzLXRvLW1ldGhvZHMgZnJvbSB2aXJ0dWFsIGZ1bmN0aW9uIGluZGljaWVzLiAgKi8KLQkgICAgICArKypwcDsKLQkgICAgICB2b2Zmc2V0ID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0JICAgICAgaWYgKCoqcHAgIT0gJzsnKQotCQl7Ci0JCSAgYmFkX3N0YWIgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgICsrKnBwOwotCSAgICAgIHZvZmZzZXQgJj0gMHg3ZmZmZmZmZjsKLQotCSAgICAgIGlmICgqKnBwID09ICc7JyB8fCAqcHAgPT0gJ1wwJykKLQkJewotCQkgIC8qIE11c3QgYmUgZysrIHZlcnNpb24gMS4gICovCi0JCSAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEZpZ3VyZSBvdXQgZnJvbSB3aGVuY2UgdGhpcyB2aXJ0dWFsIGZ1bmN0aW9uCi0JCSAgICAgY2FtZS4gIEl0IG1heSBiZWxvbmcgdG8gdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBvZgotCQkgICAgIG9uZSBvZiBpdHMgYmFzZWNsYXNzZXMuICAqLwotCQkgICAgbG9va19haGVhZF90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLAotCQkJCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgICAgcHAsCi0JCQkJCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCQkgICAgaWYgKCoqcHAgPT0gJzonKQotCQkgICAgICB7Ci0JCQkvKiBnKysgdmVyc2lvbiAxIG92ZXJsb2FkZWQgbWV0aG9kcy4gICovCi0JCQljb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWNvbnRleHQgPSBsb29rX2FoZWFkX3R5cGU7Ci0JCQlsb29rX2FoZWFkX3R5cGUgPSBERUJVR19UWVBFX05VTEw7Ci0JCQlpZiAoKipwcCAhPSAnOycpCi0JCQkgIHsKLQkJCSAgICBiYWRfc3RhYiAob3JpZyk7Ci0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICB9Ci0JCQkrKypwcDsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc/JzoKLQkgICAgICAvKiBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkgICAgICArKypwcDsKLQkgICAgICBzdGF0aWNwID0gdHJ1ZTsKLQkgICAgICB2b2Zmc2V0ID0gMDsKLQkgICAgICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCSAgICAgIGlmIChzdHJuY21wIChhcmd0eXBlcywgbmFtZSwgc3RybGVuIChuYW1lKSkgIT0gMCkKLQkJc3R1YiA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICB3YXJuX3N0YWIgKG9yaWcsICJtZW1iZXIgZnVuY3Rpb24gdHlwZSBtaXNzaW5nIik7Ci0JICAgICAgdm9mZnNldCA9IDA7Ci0JICAgICAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcuJzoKLQkgICAgICArKypwcDsKLQkgICAgICB2b2Zmc2V0ID0gMDsKLQkgICAgICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoZSB0eXBlIGlzIG5vdCBhIHN0dWIsIHRoZW4gdGhlIGFyZ3R5cGVzIHN0cmluZyBpcwotICAgICAgICAgICAgIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gIE90aGVyd2lzZSB0aGUKLSAgICAgICAgICAgICBhcmd0eXBlcyBzdHJpbmcgaXMgdGhlIG1hbmdsZWQgZm9ybSBvZiB0aGUgYXJndW1lbnQKLSAgICAgICAgICAgICB0eXBlcywgYW5kIHRoZSBmdWxsIHR5cGUgYW5kIHRoZSBwaHlzaWNhbCBuYW1lIG11c3QgYmUKLSAgICAgICAgICAgICBleHRyYWN0ZWQgZnJvbSB0aGVtLiAgKi8KLQkgIGlmICghIHN0dWIpCi0JICAgIHBoeXNuYW1lID0gYXJndHlwZXM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBkZWJ1Z190eXBlIGNsYXNzX3R5cGUsIHJldHVybl90eXBlOwotCi0JICAgICAgY2xhc3NfdHlwZSA9IHN0YWJfZmluZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcyk7Ci0JICAgICAgaWYgKGNsYXNzX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmV0dXJuX3R5cGUgPSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgKGRoYW5kbGUsIHR5cGUpOwotCSAgICAgIGlmIChyZXR1cm5fdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgdHlwZSA9IHBhcnNlX3N0YWJfYXJndHlwZXMgKGRoYW5kbGUsIGluZm8sIGNsYXNzX3R5cGUsIG5hbWUsCi0JCQkJCSAgdGFnbmFtZSwgcmV0dXJuX3R5cGUsIGFyZ3R5cGVzLAotCQkJCQkgIGNvbnN0cCwgdm9sYXRpbGVwLCAmcGh5c25hbWUpOwotCSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChjdmFycyArIDEgPj0gYWxsb2N2YXJzKQotCSAgICB7Ci0JICAgICAgYWxsb2N2YXJzICs9IDEwOwotCSAgICAgIHZhcmlhbnRzID0gKChkZWJ1Z19tZXRob2RfdmFyaWFudCAqKQotCQkJICB4cmVhbGxvYyAoKFBUUikgdmFyaWFudHMsCi0JCQkJICAgIGFsbG9jdmFycyAqIHNpemVvZiAqdmFyaWFudHMpKTsKLQkgICAgfQotCi0JICBpZiAoISBzdGF0aWNwKQotCSAgICB2YXJpYW50c1tjdmFyc10gPSBkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50IChkaGFuZGxlLCBwaHlzbmFtZSwKLQkJCQkJCQkgdHlwZSwgdmlzaWJpbGl0eSwKLQkJCQkJCQkgY29uc3RwLCB2b2xhdGlsZXAsCi0JCQkJCQkJIHZvZmZzZXQsIGNvbnRleHQpOwotCSAgZWxzZQotCSAgICB2YXJpYW50c1tjdmFyc10gPSBkZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCAoZGhhbmRsZSwKLQkJCQkJCQkJcGh5c25hbWUsCi0JCQkJCQkJCXR5cGUsCi0JCQkJCQkJCXZpc2liaWxpdHksCi0JCQkJCQkJCWNvbnN0cCwKLQkJCQkJCQkJdm9sYXRpbGVwKTsKLQkgIGlmICh2YXJpYW50c1tjdmFyc10gPT0gREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICArK2N2YXJzOwotCX0KLSAgICAgIHdoaWxlICgqKnBwICE9ICc7JyAmJiAqKnBwICE9ICdcMCcpOwotCi0gICAgICB2YXJpYW50c1tjdmFyc10gPSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMOwotCi0gICAgICBpZiAoKipwcCAhPSAnXDAnKQotCSsrKnBwOwotCi0gICAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JewotCSAgYWxsb2MgKz0gMTA7Ci0JICBtZXRob2RzID0gKChkZWJ1Z19tZXRob2QgKikKLQkJICAgICB4cmVhbGxvYyAoKFBUUikgbWV0aG9kcywgYWxsb2MgKiBzaXplb2YgKm1ldGhvZHMpKTsKLQl9Ci0KLSAgICAgIG1ldGhvZHNbY10gPSBkZWJ1Z19tYWtlX21ldGhvZCAoZGhhbmRsZSwgbmFtZSwgdmFyaWFudHMpOwotCi0gICAgICArK2M7Ci0gICAgfQotCi0gIGlmIChtZXRob2RzICE9IE5VTEwpCi0gICAgbWV0aG9kc1tjXSA9IERFQlVHX01FVEhPRF9OVUxMOwotCi0gICpyZXRwID0gbWV0aG9kczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGFyZ3VtZW50IHR5cGVzIGZvciBhIG1ldGhvZC4gIFN0YWJzCi0gICB0cmllcyB0byBzYXZlIHNwYWNlIGJ5IHBhY2tpbmcgYXJndW1lbnQgdHlwZXMgaW50byBhIG1hbmdsZWQKLSAgIHN0cmluZy4gIFRoaXMgc3RyaW5nIHNob3VsZCBnaXZlIHVzIGVub3VnaCBpbmZvcm1hdGlvbiB0byBleHRyYWN0Ci0gICBib3RoIGFyZ3VtZW50IHR5cGVzIGFuZCB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIGdpdmVuCi0gICB0aGUgdGFnIG5hbWUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9hcmd0eXBlcyAoZGhhbmRsZSwgaW5mbywgY2xhc3NfdHlwZSwgZmllbGRuYW1lLCB0YWduYW1lLAotCQkgICAgIHJldHVybl90eXBlLCBhcmd0eXBlcywgY29uc3RwLCB2b2xhdGlsZXAsIHBwaHlzbmFtZSkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgZGVidWdfdHlwZSBjbGFzc190eXBlOwotICAgICBjb25zdCBjaGFyICpmaWVsZG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZ25hbWU7Ci0gICAgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gICAgIGNvbnN0IGNoYXIgKmFyZ3R5cGVzOwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGNvbnN0IGNoYXIgKipwcGh5c25hbWU7Ci17Ci0gIGJvb2xlYW4gaXNfZnVsbF9waHlzbmFtZV9jb25zdHJ1Y3RvcjsKLSAgYm9vbGVhbiBpc19jb25zdHJ1Y3RvcjsKLSAgYm9vbGVhbiBpc19kZXN0cnVjdG9yOwotICBkZWJ1Z190eXBlICphcmdzOwotICBib29sZWFuIHZhcmFyZ3M7Ci0KLSAgLyogQ29uc3RydWN0b3JzIGFyZSBzb21ldGltZXMgaGFuZGxlZCBzcGVjaWFsbHkuICAqLwotICBpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yID0gKChhcmd0eXBlc1swXSA9PSAnXycKLQkJCQkgICAmJiBhcmd0eXBlc1sxXSA9PSAnXycKLQkJCQkgICAmJiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGFyZ3R5cGVzWzJdKQotCQkJCSAgICAgICB8fCBhcmd0eXBlc1syXSA9PSAnUScKLQkJCQkgICAgICAgfHwgYXJndHlwZXNbMl0gPT0gJ3QnKSkKLQkJCQkgIHx8IHN0cm5jbXAgKGFyZ3R5cGVzLCAiX19jdCIsIDQpID09IDApOwotCi0gIGlzX2NvbnN0cnVjdG9yID0gKGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IKLQkJICAgIHx8ICh0YWduYW1lICE9IE5VTEwKLQkJCSYmIHN0cmNtcCAoZmllbGRuYW1lLCB0YWduYW1lKSA9PSAwKSk7Ci0gIGlzX2Rlc3RydWN0b3IgPSAoKGFyZ3R5cGVzWzBdID09ICdfJwotCQkgICAgJiYgKGFyZ3R5cGVzWzFdID09ICckJyB8fCBhcmd0eXBlc1sxXSA9PSAnLicpCi0JCSAgICAmJiBhcmd0eXBlc1syXSA9PSAnXycpCi0JCSAgIHx8IHN0cm5jbXAgKGFyZ3R5cGVzLCAiX19kdCIsIDQpID09IDApOwotCi0gIGlmIChpc19kZXN0cnVjdG9yIHx8IGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IpCi0gICAgKnBwaHlzbmFtZSA9IGFyZ3R5cGVzOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxlbjsKLSAgICAgIGNvbnN0IGNoYXIgKmNvbnN0X3ByZWZpeDsKLSAgICAgIGNvbnN0IGNoYXIgKnZvbGF0aWxlX3ByZWZpeDsKLSAgICAgIGNoYXIgYnVmWzIwXTsKLSAgICAgIHVuc2lnbmVkIGludCBtYW5nbGVkX25hbWVfbGVuOwotICAgICAgY2hhciAqcGh5c25hbWU7Ci0KLSAgICAgIGxlbiA9IHRhZ25hbWUgPT0gTlVMTCA/IDAgOiBzdHJsZW4gKHRhZ25hbWUpOwotICAgICAgY29uc3RfcHJlZml4ID0gY29uc3RwID8gIkMiIDogIiI7Ci0gICAgICB2b2xhdGlsZV9wcmVmaXggPSB2b2xhdGlsZXAgPyAiViIgOiAiIjsKLQotICAgICAgaWYgKGxlbiA9PSAwKQotCXNwcmludGYgKGJ1ZiwgIl9fJXMlcyIsIGNvbnN0X3ByZWZpeCwgdm9sYXRpbGVfcHJlZml4KTsKLSAgICAgIGVsc2UgaWYgKHRhZ25hbWUgIT0gTlVMTCAmJiBzdHJjaHIgKHRhZ25hbWUsICc8JykgIT0gTlVMTCkKLQl7Ci0JICAvKiBUZW1wbGF0ZSBtZXRob2RzIGFyZSBmdWxseSBtYW5nbGVkLiAgKi8KLQkgIHNwcmludGYgKGJ1ZiwgIl9fJXMlcyIsIGNvbnN0X3ByZWZpeCwgdm9sYXRpbGVfcHJlZml4KTsKLQkgIHRhZ25hbWUgPSBOVUxMOwotCSAgbGVuID0gMDsKLQl9Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmLCAiX18lcyVzJWQiLCBjb25zdF9wcmVmaXgsIHZvbGF0aWxlX3ByZWZpeCwgbGVuKTsKLQotICAgICAgbWFuZ2xlZF9uYW1lX2xlbiA9ICgoaXNfY29uc3RydWN0b3IgPyAwIDogc3RybGVuIChmaWVsZG5hbWUpKQotCQkJICArIHN0cmxlbiAoYnVmKQotCQkJICArIGxlbgotCQkJICArIHN0cmxlbiAoYXJndHlwZXMpCi0JCQkgICsgMSk7Ci0KLSAgICAgIGlmIChmaWVsZG5hbWVbMF0gPT0gJ28nCi0JICAmJiBmaWVsZG5hbWVbMV0gPT0gJ3AnCi0JICAmJiAoZmllbGRuYW1lWzJdID09ICckJyB8fCBmaWVsZG5hbWVbMl0gPT0gJy4nKSkKLQl7Ci0JICBjb25zdCBjaGFyICpvcG5hbWU7Ci0KLQkgIG9wbmFtZSA9IGNwbHVzX21hbmdsZV9vcG5hbWUgKGZpZWxkbmFtZSArIDMsIDApOwotCSAgaWYgKG9wbmFtZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJObyBtYW5nbGluZyBmb3IgXCIlc1wiXG4iKSwgZmllbGRuYW1lKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICBtYW5nbGVkX25hbWVfbGVuICs9IHN0cmxlbiAob3BuYW1lKTsKLQkgIHBoeXNuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobWFuZ2xlZF9uYW1lX2xlbik7Ci0JICBzdHJuY3B5IChwaHlzbmFtZSwgZmllbGRuYW1lLCAzKTsKLQkgIHN0cmNweSAocGh5c25hbWUgKyAzLCBvcG5hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwaHlzbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKG1hbmdsZWRfbmFtZV9sZW4pOwotCSAgaWYgKGlzX2NvbnN0cnVjdG9yKQotCSAgICBwaHlzbmFtZVswXSA9ICdcMCc7Ci0JICBlbHNlCi0JICAgIHN0cmNweSAocGh5c25hbWUsIGZpZWxkbmFtZSk7Ci0JfQotCi0gICAgICBzdHJjYXQgKHBoeXNuYW1lLCBidWYpOwotICAgICAgaWYgKHRhZ25hbWUgIT0gTlVMTCkKLQlzdHJjYXQgKHBoeXNuYW1lLCB0YWduYW1lKTsKLSAgICAgIHN0cmNhdCAocGh5c25hbWUsIGFyZ3R5cGVzKTsKLQotICAgICAgKnBwaHlzbmFtZSA9IHBoeXNuYW1lOwotICAgIH0KLQotICBpZiAoKmFyZ3R5cGVzID09ICdcMCcgfHwgaXNfZGVzdHJ1Y3RvcikKLSAgICB7Ci0gICAgICBhcmdzID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICphcmdzKTsKLSAgICAgICphcmdzID0gTlVMTDsKLSAgICAgIHJldHVybiBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChkaGFuZGxlLCByZXR1cm5fdHlwZSwgY2xhc3NfdHlwZSwgYXJncywKLQkJCQkgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgYXJncyA9IHN0YWJfZGVtYW5nbGVfYXJndHlwZXMgKGRoYW5kbGUsIGluZm8sICpwcGh5c25hbWUsICZ2YXJhcmdzKTsKLSAgaWYgKGFyZ3MgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChkaGFuZGxlLCByZXR1cm5fdHlwZSwgY2xhc3NfdHlwZSwgYXJncywKLQkJCQkgdmFyYXJncyk7Ci19Ci0KLS8qIFRoZSB0YWlsIGVuZCBvZiBzdGFicyBmb3IgQysrIGNsYXNzZXMgdGhhdCBjb250YWluIGEgdmlydHVhbCBmdW5jdGlvbgotICAgcG9pbnRlciBjb250YWlucyBhIHRpbGRlLCBhICUsIGFuZCBhIHR5cGUgbnVtYmVyLgotICAgVGhlIHR5cGUgbnVtYmVyIHJlZmVycyB0byB0aGUgYmFzZSBjbGFzcyAocG9zc2libHkgdGhpcyBjbGFzcyBpdHNlbGYpIHdoaWNoCi0gICBjb250YWlucyB0aGUgdnRhYmxlIHBvaW50ZXIgZm9yIHRoZSBjdXJyZW50IGNsYXNzLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIGhhdmUgcGFyc2VkIGFsbCB0aGUgbWV0aG9kIGRlY2xhcmF0aW9ucywKLSAgIHNvIHdlIGNhbiBsb29rIGZvciB0aGUgdnB0ciBiYXNlIGNsYXNzIGluZm8uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl90aWxkZV9maWVsZCAoZGhhbmRsZSwgaW5mbywgcHAsIHR5cGVudW1zLCByZXR2cHRyYmFzZSwgcmV0b3dudnB0cikKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotICAgICBkZWJ1Z190eXBlICpyZXR2cHRyYmFzZTsKLSAgICAgYm9vbGVhbiAqcmV0b3dudnB0cjsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY29uc3QgY2hhciAqaG9sZDsKLSAgaW50IHZ0eXBlbnVtc1syXTsKLQotICAqcmV0dnB0cmJhc2UgPSBERUJVR19UWVBFX05VTEw7Ci0gICpyZXRvd252cHRyID0gZmFsc2U7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICAvKiBJZiB3ZSBhcmUgcG9zaXRpb25lZCBhdCBhICc7JywgdGhlbiBza2lwIGl0LiAqLwotICBpZiAoKipwcCA9PSAnOycpCi0gICAgKysqcHA7Ci0KLSAgaWYgKCoqcHAgIT0gJ34nKQotICAgIHJldHVybiB0cnVlOwotCi0gICsrKnBwOwotCi0gIGlmICgqKnBwID09ICc9JyB8fCAqKnBwID09ICcrJyB8fCAqKnBwID09ICctJykKLSAgICB7Ci0gICAgICAvKiBPYnNvbGV0ZSBmbGFncyB0aGF0IHVzZWQgdG8gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mCi0JIGNvbnN0cnVjdG9ycyBhbmQvb3IgZGVzdHJ1Y3RvcnMuICovCi0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgaWYgKCoqcHAgIT0gJyUnKQotICAgIHJldHVybiB0cnVlOwotCi0gICsrKnBwOwotCi0gIGhvbGQgPSAqcHA7Ci0KLSAgLyogVGhlIG5leHQgbnVtYmVyIGlzIHRoZSB0eXBlIG51bWJlciBvZiB0aGUgYmFzZSBjbGFzcyAocG9zc2libHkKLSAgICAgb3VyIG93biBjbGFzcykgd2hpY2ggc3VwcGxpZXMgdGhlIHZ0YWJsZSBmb3IgdGhpcyBjbGFzcy4gICovCi0gIGlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCB2dHlwZW51bXMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodnR5cGVudW1zWzBdID09IHR5cGVudW1zWzBdCi0gICAgICAmJiB2dHlwZW51bXNbMV0gPT0gdHlwZW51bXNbMV0pCi0gICAgKnJldG93bnZwdHIgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgZGVidWdfdHlwZSB2dHlwZTsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICAgICpwcCA9IGhvbGQ7Ci0KLSAgICAgIHZ0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBmb3IgKHAgPSAqcHA7ICpwICE9ICc7JyAmJiAqcCAhPSAnXDAnOyBwKyspCi0JOwotICAgICAgaWYgKCpwICE9ICc7JykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAqcmV0dnB0cmJhc2UgPSB2dHlwZTsKLQotICAgICAgKnBwID0gcCArIDE7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOyAgICAKLX0KLQotLyogUmVhZCBhIGRlZmluaXRpb24gb2YgYW4gYXJyYXkgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX2FycmF5X3R5cGUgKGRoYW5kbGUsIGluZm8sIHBwLCBzdHJpbmdwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY29uc3QgY2hhciAqcDsKLSAgaW50IHR5cGVudW1zWzJdOwotICBkZWJ1Z190eXBlIGluZGV4X3R5cGU7Ci0gIGJvb2xlYW4gYWRqdXN0YWJsZTsKLSAgYmZkX3NpZ25lZF92bWEgbG93ZXIsIHVwcGVyOwotICBkZWJ1Z190eXBlIGVsZW1lbnRfdHlwZTsKLQotICAvKiBGb3JtYXQgb2YgYW4gYXJyYXkgdHlwZToKLSAgICAgImFyPGluZGV4IHR5cGU+O2xvd2VyO3VwcGVyOzxhcnJheV9jb250ZW50c190eXBlPiIuCi0gICAgIE9TOTAwMDogImFybG93ZXIsdXBwZXI7PGFycmF5X2NvbnRlbnRzX3R5cGU+Ii4KLQotICAgICBGb3J0cmFuIGFkanVzdGFibGUgYXJyYXlzIHVzZSBBZGlnaXRzIG9yIFRkaWdpdHMgZm9yIGxvd2VyIG9yIHVwcGVyOwotICAgICBmb3IgdGhlc2UsIHByb2R1Y2UgYSB0eXBlIGxpa2UgZmxvYXRbXVtdLiAgKi8KLQotICBvcmlnID0gKnBwOwotCi0gIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0KLSAgLyogSWYgdGhlIGluZGV4IHR5cGUgaXMgdHlwZSAwLCB3ZSB0YWtlIGl0IGFzIGludC4gICovCi0gIHAgPSAqcHA7Ci0gIGlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKCZwLCB0eXBlbnVtcykpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgaWYgKHR5cGVudW1zWzBdID09IDAgJiYgdHlwZW51bXNbMV0gPT0gMCAmJiAqKnBwICE9ICc9JykKLSAgICB7Ci0gICAgICBpbmRleF90eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChkaGFuZGxlLCAiaW50Iik7Ci0gICAgICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JewotCSAgaW5kZXhfdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLQkgIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQl9Ci0gICAgICAqcHAgPSBwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgfQotCi0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYWRqdXN0YWJsZSA9IGZhbHNlOwotCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSAmJiAqKnBwICE9ICctJykKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIGFkanVzdGFibGUgPSB0cnVlOwotICAgIH0KLQotICBsb3dlciA9IChiZmRfc2lnbmVkX3ZtYSkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApICYmICoqcHAgIT0gJy0nKQotICAgIHsKLSAgICAgICsrKnBwOwotICAgICAgYWRqdXN0YWJsZSA9IHRydWU7Ci0gICAgfQotCi0gIHVwcGVyID0gKGJmZF9zaWduZWRfdm1hKSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICBlbGVtZW50X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICBpZiAoZWxlbWVudF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmIChhZGp1c3RhYmxlKQotICAgIHsKLSAgICAgIGxvd2VyID0gMDsKLSAgICAgIHVwcGVyID0gLTE7Ci0gICAgfQotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIGVsZW1lbnRfdHlwZSwgaW5kZXhfdHlwZSwgbG93ZXIsCi0JCQkJdXBwZXIsIHN0cmluZ3ApOwotfQotCi0vKiBUaGlzIHN0cnVjdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBmaWxlcyB3ZSBoYXZlIHNlZW4gdXNpbmcKLSAgIE5fQklOQ0wuICAqLwotCi1zdHJ1Y3QgYmluY2xfZmlsZQotewotICAvKiBUaGUgbmV4dCBOX0JJTkNMIGZpbGUuICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbmV4dDsKLSAgLyogVGhlIG5leHQgTl9CSU5DTCBvbiB0aGUgc3RhY2suICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbmV4dF9zdGFjazsKLSAgLyogVGhlIGZpbGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBoYXNoIHZhbHVlLiAgKi8KLSAgYmZkX3ZtYSBoYXNoOwotICAvKiBUaGUgZmlsZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBmaWxlOwotICAvKiBUaGUgbGlzdCBvZiB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICpmaWxlX3R5cGVzOwotfTsKLQotLyogU3RhcnQgYSBuZXcgTl9CSU5DTCBmaWxlLCBwdXNoaW5nIGl0IG9udG8gdGhlIHN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXB1c2hfYmluY2wgKGluZm8sIG5hbWUsIGhhc2gpCi0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBoYXNoOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbjsKLQotICBuID0gKHN0cnVjdCBiaW5jbF9maWxlICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm5leHQgPSBpbmZvLT5iaW5jbF9saXN0OwotICBuLT5uZXh0X3N0YWNrID0gaW5mby0+YmluY2xfc3RhY2s7Ci0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT5oYXNoID0gaGFzaDsKLSAgbi0+ZmlsZSA9IGluZm8tPmZpbGVzOwotICBuLT5maWxlX3R5cGVzID0gTlVMTDsKLSAgaW5mby0+YmluY2xfbGlzdCA9IG47Ci0gIGluZm8tPmJpbmNsX3N0YWNrID0gbjsKLQotICArK2luZm8tPmZpbGVzOwotICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJICAgICAgeHJlYWxsb2MgKChQVFIpIGluZm8tPmZpbGVfdHlwZXMsCi0JCQkJKGluZm8tPmZpbGVzCi0JCQkJICogc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSkpOwotICBpbmZvLT5maWxlX3R5cGVzW24tPmZpbGVdID0gTlVMTDsKLX0KLQotLyogRmluaXNoIGFuIE5fQklOQ0wgZmlsZSwgYXQgYW4gTl9FSU5DTCwgcG9wcGluZyB0aGUgbmFtZSBvZmYgdGhlCi0gICBzdGFjay4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBvcF9iaW5jbCAoaW5mbykKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbzsKLQotICBvID0gaW5mby0+YmluY2xfc3RhY2s7Ci0gIGlmIChvID09IE5VTEwpCi0gICAgcmV0dXJuIGluZm8tPm1haW5fZmlsZW5hbWU7Ci0gIGluZm8tPmJpbmNsX3N0YWNrID0gby0+bmV4dF9zdGFjazsKLQotICBvLT5maWxlX3R5cGVzID0gaW5mby0+ZmlsZV90eXBlc1tvLT5maWxlXTsKLQotICBpZiAoaW5mby0+YmluY2xfc3RhY2sgPT0gTlVMTCkKLSAgICByZXR1cm4gaW5mby0+bWFpbl9maWxlbmFtZTsKLSAgcmV0dXJuIGluZm8tPmJpbmNsX3N0YWNrLT5uYW1lOwotfQotCi0vKiBIYW5kbGUgYW4gTl9FWENMOiBnZXQgdGhlIHR5cGVzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgTl9CSU5DTC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1maW5kX2V4Y2wgKGluZm8sIG5hbWUsIGhhc2gpCi0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBoYXNoOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbDsKLQotICArK2luZm8tPmZpbGVzOwotICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJICAgICAgeHJlYWxsb2MgKChQVFIpIGluZm8tPmZpbGVfdHlwZXMsCi0JCQkJKGluZm8tPmZpbGVzCi0JCQkJICogc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSkpOwotCi0gIGZvciAobCA9IGluZm8tPmJpbmNsX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgaWYgKGwtPmhhc2ggPT0gaGFzaCAmJiBzdHJjbXAgKGwtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBicmVhazsKLSAgaWYgKGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB3YXJuX3N0YWIgKG5hbWUsIF8oIlVuZGVmaW5lZCBOX0VYQ0wiKSk7Ci0gICAgICBpbmZvLT5maWxlX3R5cGVzW2luZm8tPmZpbGVzIC0gMV0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZm8tPmZpbGVfdHlwZXNbaW5mby0+ZmlsZXMgLSAxXSA9IGwtPmZpbGVfdHlwZXM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIHZhcmlhYmxlIGRlZmluaXRpb24uICBnY2MgZW1pdHMgdmFyaWFibGUgZGVmaW5pdGlvbnMgZm9yIGEKLSAgIGJsb2NrIGJlZm9yZSB0aGUgTl9MQlJBQywgc28gd2UgbXVzdCBob2xkIG9udG8gdGhlbSB1bnRpbCB3ZSBzZWUKLSAgIGl0LiAgVGhlIFN1blBSTyBjb21waWxlciBlbWl0cyB2YXJpYWJsZSBkZWZpbml0aW9ucyBhZnRlciB0aGUKLSAgIE5fTEJSQUMsIHNvIHdlIGNhbiBjYWxsIGRlYnVnX3JlY29yZF92YXJpYWJsZSBpbW1lZGlhdGVseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgdHlwZSwga2luZCwgdmFsKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICp2OwotCi0gIGlmICgoa2luZCA9PSBERUJVR19HTE9CQUwgfHwga2luZCA9PSBERUJVR19TVEFUSUMpCi0gICAgICB8fCAhIGluZm8tPndpdGhpbl9mdW5jdGlvbgotICAgICAgfHwgKGluZm8tPmdjY19jb21waWxlZCA9PSAwICYmIGluZm8tPm5fb3B0X2ZvdW5kKSkKLSAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpOwotCi0gIHYgPSAoc3RydWN0IHN0YWJfcGVuZGluZ192YXIgKikgeG1hbGxvYyAoc2l6ZW9mICp2KTsKLSAgbWVtc2V0ICh2LCAwLCBzaXplb2YgKnYpOwotCi0gIHYtPm5leHQgPSBpbmZvLT5wZW5kaW5nOwotICB2LT5uYW1lID0gbmFtZTsKLSAgdi0+dHlwZSA9IHR5cGU7Ci0gIHYtPmtpbmQgPSBraW5kOwotICB2LT52YWwgPSB2YWw7Ci0gIGluZm8tPnBlbmRpbmcgPSB2OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbWl0IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICBUaGlzIGlzIGNhbGxlZCBhZnRlciB3ZSBzZWUgdGhlCi0gICBOX0xCUkFDIHRoYXQgc3RhcnRzIHRoZSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqdjsKLQotICB2ID0gaW5mby0+cGVuZGluZzsKLSAgd2hpbGUgKHYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqbmV4dDsKLQotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCB2LT5uYW1lLCB2LT50eXBlLCB2LT5raW5kLCB2LT52YWwpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbmV4dCA9IHYtPm5leHQ7Ci0gICAgICBmcmVlICh2KTsKLSAgICAgIHYgPSBuZXh0OwotICAgIH0KLQotICBpbmZvLT5wZW5kaW5nID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluZCB0aGUgc2xvdCBmb3IgYSB0eXBlIGluIHRoZSBkYXRhYmFzZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLXN0YWJfZmluZF9zbG90IChpbmZvLCB0eXBlbnVtcykKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBpbnQgZmlsZW51bTsKLSAgaW50IGluZGV4OwotICBzdHJ1Y3Qgc3RhYl90eXBlcyAqKnBzOwotCi0gIGZpbGVudW0gPSB0eXBlbnVtc1swXTsKLSAgaW5kZXggPSB0eXBlbnVtc1sxXTsKLQotICBpZiAoZmlsZW51bSA8IDAgfHwgKHVuc2lnbmVkIGludCkgZmlsZW51bSA+PSBpbmZvLT5maWxlcykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlR5cGUgZmlsZSBudW1iZXIgJWQgb3V0IG9mIHJhbmdlXG4iKSwgZmlsZW51bSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChpbmRleCA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJUeXBlIGluZGV4IG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIpLCBpbmRleCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcHMgPSBpbmZvLT5maWxlX3R5cGVzICsgZmlsZW51bTsKLQotICB3aGlsZSAoaW5kZXggPj0gU1RBQl9UWVBFU19TTE9UUykKLSAgICB7Ci0gICAgICBpZiAoKnBzID09IE5VTEwpCi0JewotCSAgKnBzID0gKHN0cnVjdCBzdGFiX3R5cGVzICopIHhtYWxsb2MgKHNpemVvZiAqKnBzKTsKLQkgIG1lbXNldCAoKnBzLCAwLCBzaXplb2YgKipwcyk7Ci0JfQotICAgICAgcHMgPSAmKCpwcyktPm5leHQ7Ci0gICAgICBpbmRleCAtPSBTVEFCX1RZUEVTX1NMT1RTOwotICAgIH0KLSAgaWYgKCpwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpwcyA9IChzdHJ1Y3Qgc3RhYl90eXBlcyAqKSB4bWFsbG9jIChzaXplb2YgKipwcyk7Ci0gICAgICBtZW1zZXQgKCpwcywgMCwgc2l6ZW9mICoqcHMpOwotICAgIH0KLQotICByZXR1cm4gKCpwcyktPnR5cGVzICsgaW5kZXg7Ci19Ci0KLS8qIEZpbmQgYSB0eXBlIGdpdmVuIGEgdHlwZSBudW1iZXIuICBJZiB0aGUgdHlwZSBoYXMgbm90IGJlZW4KLSAgIGFsbG9jYXRlZCB5ZXQsIGNyZWF0ZSBhbiBpbmRpcmVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXN0YWJfZmluZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLXsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBpZiAodHlwZW51bXNbMF0gPT0gMCAmJiB0eXBlbnVtc1sxXSA8IDApCi0gICAgewotICAgICAgLyogQSBuZWdhdGl2ZSB0eXBlIG51bWJlciBpbmRpY2F0ZXMgYW4gWENPRkYgYnVpbHRpbiB0eXBlLiAgKi8KLSAgICAgIHJldHVybiBzdGFiX3hjb2ZmX2J1aWx0aW5fdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXNbMV0pOwotICAgIH0KLQotICBzbG90ID0gc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKTsKLSAgaWYgKHNsb3QgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICgqc2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgc2xvdCwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLSAgcmV0dXJuICpzbG90OwotfQotCi0vKiBSZWNvcmQgdGhhdCBhIGdpdmVuIHR5cGUgbnVtYmVyIHJlZmVycyB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9yZWNvcmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMsIHR5cGUpCi0gICAgIFBUUiBkaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBkZWJ1Z190eXBlICpzbG90OwotCi0gIHNsb3QgPSBzdGFiX2ZpbmRfc2xvdCAoaW5mbywgdHlwZW51bXMpOwotICBpZiAoc2xvdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBnZGIgYXBwZWFycyB0byBpZ25vcmUgdHlwZSByZWRlZmluaXRpb25zLCBzbyB3ZSBkbyBhcyB3ZWxsLiAgKi8KLQotICAqc2xvdCA9IHR5cGU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiBhbiBYQ09GRiBidWlsdGluIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotc3RhYl94Y29mZl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW0pCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGludCB0eXBlbnVtOwotewotICBkZWJ1Z190eXBlIHJldHR5cGU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKHR5cGVudW0gPj0gMCB8fCB0eXBlbnVtIDwgLVhDT0ZGX1RZUEVfQ09VTlQpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgWENPRkYgdHlwZSAlZFxuIiksIHR5cGVudW0pOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gIGlmIChpbmZvLT54Y29mZl90eXBlc1stdHlwZW51bV0gIT0gTlVMTCkKLSAgICByZXR1cm4gaW5mby0+eGNvZmZfdHlwZXNbLXR5cGVudW1dOwotCi0gIHN3aXRjaCAoLXR5cGVudW0pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIC8qIFRoZSBzaXplIG9mIHRoaXMgYW5kIGFsbCB0aGUgb3RoZXIgdHlwZXMgYXJlIGZpeGVkLCBkZWZpbmVkCi0JIGJ5IHRoZSBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLSAgICAgIG5hbWUgPSAiaW50IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBuYW1lID0gImNoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIG5hbWUgPSAic2hvcnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG5hbWUgPSAibG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgIG5hbWUgPSAic2lnbmVkIGNoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNzoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBpbnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgY2FzZSAxMDoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDExOgotICAgICAgbmFtZSA9ICJ2b2lkIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgICAgLyogSUVFRSBzaW5nbGUgcHJlY2lzaW9uICgzMiBiaXQpLiAgKi8KLSAgICAgIG5hbWUgPSAiZmxvYXQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEzOgotICAgICAgLyogSUVFRSBkb3VibGUgcHJlY2lzaW9uICg2NCBiaXQpLiAgKi8KLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNDoKLSAgICAgIC8qIFRoaXMgaXMgYW4gSUVFRSBkb3VibGUgb24gdGhlIFJTLzYwMDAsIGFuZCBkaWZmZXJlbnQgbWFjaGluZXMKLQkgd2l0aCBkaWZmZXJlbnQgc2l6ZXMgZm9yICJsb25nIGRvdWJsZSIgc2hvdWxkIHVzZSBkaWZmZXJlbnQKLQkgbmVnYXRpdmUgdHlwZSBudW1iZXJzLiAgU2VlIHN0YWJzLnRleGluZm8uICAqLwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTU6Ci0gICAgICBuYW1lID0gImludGVnZXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBuYW1lID0gImJvb2xlYW4iOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTc6Ci0gICAgICBuYW1lID0gInNob3J0IHJlYWwiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE4OgotICAgICAgbmFtZSA9ICJyZWFsIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOToKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBuYW1lID0gInN0cmluZ3B0ciI7Ci0gICAgICByZXR0eXBlID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjA6Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgbmFtZSA9ICJjaGFyYWN0ZXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMToKLSAgICAgIG5hbWUgPSAibG9naWNhbCoxIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIyOgotICAgICAgbmFtZSA9ICJsb2dpY2FsKjIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCAyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjM6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwqNCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIG5hbWUgPSAibG9naWNhbCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNToKLSAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIHNpbmdsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KLSAgICAgIG5hbWUgPSAiY29tcGxleCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNjoKLSAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIGRvdWJsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KLSAgICAgIG5hbWUgPSAiZG91YmxlIGNvbXBsZXgiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI3OgotICAgICAgbmFtZSA9ICJpbnRlZ2VyKjEiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjg6Ci0gICAgICBuYW1lID0gImludGVnZXIqMiI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOToKLSAgICAgIG5hbWUgPSAiaW50ZWdlcio0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMwOgotICAgICAgLyogRklYTUUgKi8KLSAgICAgIG5hbWUgPSAid2NoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzE6Ci0gICAgICBuYW1lID0gImxvbmcgbG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyBsb25nIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzM6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwqOCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzNDoKLSAgICAgIG5hbWUgPSAiaW50ZWdlcio4IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHJldHR5cGUpOwotCi0gIGluZm8tPnhjb2ZmX3R5cGVzWy10eXBlbnVtXSA9IHJldHR5cGU7Ci0KLSAgcmV0dXJuIHJldHR5cGU7Ci19Ci0KLS8qIEZpbmQgb3IgY3JlYXRlIGEgdGFnZ2VkIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotc3RhYl9maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBpbmZvLCBwLCBsZW4sIGtpbmQpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgIGludCBsZW47Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGRlYnVnX3R5cGUgZHR5cGU7Ci0gIHN0cnVjdCBzdGFiX3RhZyAqc3Q7Ci0KLSAgbmFtZSA9IHNhdmVzdHJpbmcgKHAsIGxlbik7Ci0KLSAgLyogV2UgcGFzcyBERUJVR19LSU5EX0lMTEVHQUwgYmVjYXVzZSB3ZSB3YW50IGFsbCB0YWdzIGluIHRoZSBzYW1lCi0gICAgIG5hbWVzcGFjZS4gIFRoaXMgaXMgcmlnaHQgZm9yIEMsIGFuZCBJIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZQotICAgICBvdGhlciBsYW5ndWFnZXMuICBGSVhNRS4gICovCi0gIGR0eXBlID0gZGVidWdfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgbmFtZSwgREVCVUdfS0lORF9JTExFR0FMKTsKLSAgaWYgKGR0eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChuYW1lKTsKLSAgICAgIHJldHVybiBkdHlwZTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBlbnRyeSBvbiB0aGUgdW5kZWZpbmVkIHRhZyBsaXN0LiAgKi8KLSAgZm9yIChzdCA9IGluZm8tPnRhZ3M7IHN0ICE9IE5VTEw7IHN0ID0gc3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0LT5uYW1lWzBdID09IG5hbWVbMF0KLQkgICYmIHN0cmNtcCAoc3QtPm5hbWUsIG5hbWUpID09IDApCi0JewotCSAgaWYgKHN0LT5raW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKLQkgICAgc3QtPmtpbmQgPSBraW5kOwotCSAgZnJlZSAobmFtZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBpZiAoc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdCA9IChzdHJ1Y3Qgc3RhYl90YWcgKikgeG1hbGxvYyAoc2l6ZW9mICpzdCk7Ci0gICAgICBtZW1zZXQgKHN0LCAwLCBzaXplb2YgKnN0KTsKLQotICAgICAgc3QtPm5leHQgPSBpbmZvLT50YWdzOwotICAgICAgc3QtPm5hbWUgPSBuYW1lOwotICAgICAgc3QtPmtpbmQgPSBraW5kOwotICAgICAgc3QtPnNsb3QgPSBERUJVR19UWVBFX05VTEw7Ci0gICAgICBzdC0+dHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgJnN0LT5zbG90LCBuYW1lKTsKLSAgICAgIGluZm8tPnRhZ3MgPSBzdDsKLSAgICB9Ci0KLSAgcmV0dXJuIHN0LT50eXBlOwotfQotDAotLyogSW4gb3JkZXIgdG8gZ2V0IHRoZSBjb3JyZWN0IGFyZ3VtZW50IHR5cGVzIGZvciBhIHN0dWJiZWQgbWV0aG9kLCB3ZQotICAgbmVlZCB0byBleHRyYWN0IHRoZSBhcmd1bWVudCB0eXBlcyBmcm9tIGEgQysrIG1hbmdsZWQgc3RyaW5nLgotICAgU2luY2UgdGhlIGFyZ3VtZW50IHR5cGVzIGNhbiByZWZlciBiYWNrIHRvIHRoZSByZXR1cm4gdHlwZSwgdGhpcwotICAgbWVhbnMgdGhhdCB3ZSBtdXN0IGRlbWFuZ2xlIHRoZSBlbnRpcmUgcGh5c2ljYWwgbmFtZS4gIEluIGdkYiB0aGlzCi0gICBpcyBkb25lIGJ5IGNhbGxpbmcgY3BsdXNfZGVtYW5nbGUgYW5kIHJ1bm5pbmcgdGhlIHJlc3VsdHMgYmFjawotICAgdGhyb3VnaCB0aGUgQysrIGV4cHJlc3Npb24gcGFyc2VyLiAgU2luY2Ugd2UgaGF2ZSBubyBleHByZXNzaW9uCi0gICBwYXJzZXIsIHdlIG11c3QgZHVwbGljYXRlIG11Y2ggb2YgdGhlIHdvcmsgb2YgY3BsdXNfZGVtYW5nbGUgaGVyZS4KLQotICAgV2UgYXNzdW1lIHRoYXQgR05VIHN0eWxlIGRlbWFuZ2xpbmcgaXMgdXNlZCwgc2luY2UgdGhpcyBpcyBvbmx5Ci0gICBkb25lIGZvciBtZXRob2Qgc3R1YnMsIGFuZCBvbmx5IGcrKyBzaG91bGQgb3V0cHV0IHRoYXQgZm9ybSBvZgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgcG9pbnRlciB0byB0eXBlIGluZm9ybWF0aW9uIHdoaWNoCi0gICBkZW1hbmdsaW5nIGEgc3RyaW5nLiAgKi8KLQotc3RydWN0IHN0YWJfZGVtYW5nbGVfdHlwZXN0cmluZwotewotICAvKiBUaGUgc3RhcnQgb2YgdGhlIHR5cGUuICBUaGlzIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQuICAqLwotICBjb25zdCBjaGFyICp0eXBlc3RyaW5nOwotICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGxlbjsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiB3aGlsZSBkZW1hbmdsaW5nIGEKLSAgIHN0cmluZy4gICovCi0KLXN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8KLXsKLSAgLyogVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoYW5kbGUuICAqLwotICBQVFIgZGhhbmRsZTsKLSAgLyogVGhlIHN0YWIgaW5mb3JtYXRpb24gaGFuZGxlLiAgKi8KLSAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAvKiBUaGUgYXJyYXkgb2YgYXJndW1lbnRzIHdlIGFyZSBidWlsZGluZy4gICovCi0gIGRlYnVnX3R5cGUgKmFyZ3M7Ci0gIC8qIFdoZXRoZXIgdGhlIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBib29sZWFuIHZhcmFyZ3M7Ci0gIC8qIFRoZSBhcnJheSBvZiB0eXBlcyB3ZSBoYXZlIHJlbWVtYmVyZWQuICAqLwotICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV90eXBlc3RyaW5nICp0eXBlc3RyaW5nczsKLSAgLyogVGhlIG51bWJlciBvZiB0eXBlc3RyaW5ncy4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlc3RyaW5nX2NvdW50OwotICAvKiBUaGUgbnVtYmVyIG9mIHR5cGVzdHJpbmcgc2xvdHMgd2UgaGF2ZSBhbGxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZXN0cmluZ19hbGxvYzsKLX07Ci0KLXN0YXRpYyB2b2lkIHN0YWJfYmFkX2RlbWFuZ2xlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFiX2RlbWFuZ2xlX2NvdW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3ByZWZpeAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9zaWduYXR1cmUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfY2xhc3MKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2FyZ3MKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICoqLAotCSAgIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9hcmcKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICoqLAotCSAgIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotLyogV2FybiBhYm91dCBhIGJhZCBkZW1hbmdsaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXN0YWJfYmFkX2RlbWFuZ2xlIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oImJhZCBtYW5nbGVkIG5hbWUgYCVzJ1xuIiksIHMpOwotfQotCi0vKiBHZXQgYSBjb3VudCBmcm9tIGEgc3RhYiBzdHJpbmcuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1zdGFiX2RlbWFuZ2xlX2NvdW50IChwcCkKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgY291bnQgPSAwOwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotICAgIHsKLSAgICAgIGNvdW50ICo9IDEwOwotICAgICAgY291bnQgKz0gKipwcCAtICcwJzsKLSAgICAgICsrKnBwOwotICAgIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXF1aXJlIGEgY291bnQgaW4gYSBzdHJpbmcuICBUaGUgY291bnQgbWF5IGJlIG11bHRpcGxlIGRpZ2l0cywgaW4KLSAgIHdoaWNoIGNhc2UgaXQgbXVzdCBlbmQgaW4gYW4gdW5kZXJzY29yZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsIHBpKQotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIHVuc2lnbmVkIGludCAqcGk7Ci17Ci0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnBpID0gKipwcCAtICcwJzsKLSAgKysqcHA7Ci0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNvdW50OwotICAgICAgY29uc3QgY2hhciAqcDsKLQotICAgICAgY291bnQgPSAqcGk7Ci0gICAgICBwID0gKnBwOwotICAgICAgZG8KLQl7Ci0JICBjb3VudCAqPSAxMDsKLQkgIGNvdW50ICs9ICpwIC0gJzAnOwotCSAgKytwOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKTsKLSAgICAgIGlmICgqcCA9PSAnXycpCi0JewotCSAgKnBwID0gcCArIDE7Ci0JICAqcGkgPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRlbWFuZ2xlcyBhIHBoeXNpY2FsIG5hbWUsIHJldHVybmluZyBhIE5VTEwKLSAgIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZSAqCi1zdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCBwaHlzbmFtZSwgcHZhcmFyZ3MpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBib29sZWFuICpwdmFyYXJnczsKLXsKLSAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyBtaW5mbzsKLQotICBtaW5mby5kaGFuZGxlID0gZGhhbmRsZTsKLSAgbWluZm8uaW5mbyA9IGluZm87Ci0gIG1pbmZvLmFyZ3MgPSBOVUxMOwotICBtaW5mby52YXJhcmdzID0gZmFsc2U7Ci0gIG1pbmZvLnR5cGVzdHJpbmdfYWxsb2MgPSAxMDsKLSAgbWluZm8udHlwZXN0cmluZ3MgPSAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcgKikKLQkJICAgICAgIHhtYWxsb2MgKG1pbmZvLnR5cGVzdHJpbmdfYWxsb2MKLQkJCQkqIHNpemVvZiAqbWluZm8udHlwZXN0cmluZ3MpKTsKLSAgbWluZm8udHlwZXN0cmluZ19jb3VudCA9IDA7Ci0KLSAgLyogY3BsdXNfZGVtYW5nbGUgY2hlY2tzIGZvciBzcGVjaWFsIEdOVSBtYW5nbGVkIGZvcm1zLCBidXQgd2UgY2FuJ3QKLSAgICAgc2VlIGFueSBvZiB0aGVtIGluIG1hbmdsZWQgbWV0aG9kIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotICBpZiAoISBzdGFiX2RlbWFuZ2xlX3ByZWZpeCAoJm1pbmZvLCAmcGh5c25hbWUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICgqcGh5c25hbWUgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3NpZ25hdHVyZSAoJm1pbmZvLCAmcGh5c25hbWUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmcmVlIChtaW5mby50eXBlc3RyaW5ncyk7Ci0gIG1pbmZvLnR5cGVzdHJpbmdzID0gTlVMTDsKLQotICBpZiAobWluZm8uYXJncyA9PSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygibm8gYXJndW1lbnQgdHlwZXMgaW4gbWFuZ2xlZCBzdHJpbmdcbiIpKTsKLQotICAqcHZhcmFyZ3MgPSBtaW5mby52YXJhcmdzOwotICByZXR1cm4gbWluZm8uYXJnczsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKG1pbmZvLnR5cGVzdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAobWluZm8udHlwZXN0cmluZ3MpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVtYW5nbGUgdGhlIHByZWZpeCBvZiB0aGUgbWFuZ2xlZCBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfcHJlZml4IChtaW5mbywgcHApCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKnNjYW47Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIGNwbHVzX2RlbWFuZ2xlIGNoZWNrcyBmb3IgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCi0gICAgIGJ1dCB3ZSBjYW4ndCBzZWUgdGhlbSBpbiBtYW5nbGVkIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotICAvKiBMb29rIGZvciBgX18nLiAgKi8KLSAgc2NhbiA9ICpwcDsKLSAgZG8KLSAgICB7Ci0gICAgICBzY2FuID0gc3RyY2hyIChzY2FuLCAnXycpOwotICAgIH0KLSAgd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiAqKytzY2FuICE9ICdfJyk7Ci0KLSAgaWYgKHNjYW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLS1zY2FuOwotCi0gIC8qIFdlIGZvdW5kIGBfXyc7IG1vdmUgYWhlYWQgdG8gdGhlIGxhc3QgY29udGlndW91cyBgX18nIHBhaXIuICAqLwotICBpID0gc3Ryc3BuIChzY2FuLCAiXyIpOwotICBpZiAoaSA+IDIpCi0gICAgc2NhbiArPSBpIC0gMjsKLQotICBpZiAoc2NhbiA9PSAqcHAKLSAgICAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc2NhblsyXSkKLQkgIHx8IHNjYW5bMl0gPT0gJ1EnCi0JICB8fCBzY2FuWzJdID09ICd0JykpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIEdOVSBzdHlsZSBjb25zdHJ1Y3RvciBuYW1lLiAgKi8KLSAgICAgICpwcCA9IHNjYW4gKyAyOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlIGlmIChzY2FuID09ICpwcAotCSAgICYmICEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNjYW5bMl0pCi0JICAgJiYgc2NhblsyXSAhPSAndCcpCi0gICAgewotICAgICAgLyogTG9vayBmb3IgdGhlIGBfXycgdGhhdCBzZXBhcmF0ZXMgdGhlIHByZWZpeCBmcm9tIHRoZQotICAgICAgICAgc2lnbmF0dXJlLiAgKi8KLSAgICAgIHdoaWxlICgqc2NhbiA9PSAnXycpCi0JKytzY2FuOwotICAgICAgc2NhbiA9IHN0cnN0ciAoc2NhbiwgIl9fIik7Ci0gICAgICBpZiAoc2NhbiA9PSBOVUxMIHx8IHNjYW5bMl0gPT0gJ1wwJykKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiBzdGFiX2RlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKG1pbmZvLCBwcCwgc2Nhbik7Ci0gICAgfQotICBlbHNlIGlmIChzY2FuWzJdICE9ICdcMCcpCi0gICAgewotICAgICAgLyogVGhlIG5hbWUgZG9lc24ndCBzdGFydCB3aXRoIGBfXycsIGJ1dCBpdCBkb2VzIGNvbnRhaW4gYF9fJy4gICovCi0gICAgICByZXR1cm4gc3RhYl9kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIChtaW5mbywgcHAsIHNjYW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlICgqcHApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogRGVtYW5nbGUgYSBmdW5jdGlvbiBuYW1lIHByZWZpeC4gIFRoZSBzY2FuIGFyZ3VtZW50IHBvaW50cyB0byB0aGUKLSAgIGRvdWJsZSB1bmRlcnNjb3JlIHdoaWNoIHNlcGFyYXRlcyB0aGUgZnVuY3Rpb24gbmFtZSBmcm9tIHRoZQotICAgc2lnbmF0dXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAobWluZm8sIHBwLCBzY2FuKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBjaGFyICpzY2FuOwotewotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBzdHJpbmcgZnJvbSAqcHAgdG8gc2NhbiBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBXZQotICAgICBkb24ndCBjYXJlIGFib3V0IHRoZSBuYW1lLCBzaW5jZSB3ZSBqdXN0IGxvb2tpbmcgZm9yIGFyZ3VtZW50Ci0gICAgIHR5cGVzLiAgSG93ZXZlciwgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCB0aGUgbmFtZSBtYXkgaW5jbHVkZSBhCi0gICAgIHR5cGUgd2hpY2ggd2UgbXVzdCByZW1lbWJlciBpbiBvcmRlciB0byBoYW5kbGUgYmFja3JlZmVyZW5jZXMuICAqLwotCi0gIG5hbWUgPSAqcHA7Ci0gICpwcCA9IHNjYW4gKyAyOwotCi0gIGlmICgqcHAgLSBuYW1lID49IDUKLQkgICAmJiBzdHJuY21wIChuYW1lLCAidHlwZSIsIDQpID09IDAKLQkgICAmJiAobmFtZVs0XSA9PSAnJCcgfHwgbmFtZVs0XSA9PSAnLicpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnRlbTsKLQotICAgICAgLyogVGhpcyBpcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBuYW1lICsgNTsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZ0ZW0sIChkZWJ1Z190eXBlICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKG5hbWVbMF0gPT0gJ18nCi0JICAgJiYgbmFtZVsxXSA9PSAnXycKLQkgICAmJiBuYW1lWzJdID09ICdvJwotCSAgICYmIG5hbWVbM10gPT0gJ3AnKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnRlbTsKLQotICAgICAgLyogVGhpcyBpcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBuYW1lICsgNDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZ0ZW0sIChkZWJ1Z190eXBlICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSBzaWduYXR1cmUuICBUaGlzIGlzIHdoZXJlIHRoZSBhcmd1bWVudCB0eXBlcyBhcmUKLSAgIGZvdW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfc2lnbmF0dXJlIChtaW5mbywgcHApCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJvb2xlYW4gZXhwZWN0X2Z1bmMsIGZ1bmNfZG9uZTsKLSAgY29uc3QgY2hhciAqaG9sZDsKLQotICBvcmlnID0gKnBwOwotCi0gIGV4cGVjdF9mdW5jID0gZmFsc2U7Ci0gIGZ1bmNfZG9uZSA9IGZhbHNlOwotICBob2xkID0gTlVMTDsKLQotICB3aGlsZSAoKipwcCAhPSAnXDAnKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKipwcCkKLQl7Ci0JY2FzZSAnUSc6Ci0JICBob2xkID0gKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgKGRlYnVnX3R5cGUgKikgTlVMTCkKLQkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBleHBlY3RfZnVuYyA9IHRydWU7Ci0JICBob2xkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUyc6Ci0JICAvKiBTdGF0aWMgbWVtYmVyIGZ1bmN0aW9uLiAgRklYTUU6IENhbiB0aGlzIGhhcHBlbj8gICovCi0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCSAgLyogQ29uc3QgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkgIGlmIChob2xkID09IE5VTEwpCi0JICAgIGhvbGQgPSAqcHA7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkgIGlmIChob2xkID09IE5VTEwpCi0JICAgIGhvbGQgPSAqcHA7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2NsYXNzIChtaW5mbywgcHAsIChjb25zdCBjaGFyICoqKSBOVUxMKQotCSAgICAgIHx8ICEgc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgaG9sZCwgKnBwIC0gaG9sZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGV4cGVjdF9mdW5jID0gdHJ1ZTsKLQkgIGhvbGQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIC8qIEZ1bmN0aW9uLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgYWN0dWFsbHkgaGFwcGVucyB3aXRoIGcrKwotICAgICAgICAgICAgIG91dHB1dC4gICovCi0JICBob2xkID0gTlVMTDsKLQkgIGZ1bmNfZG9uZSA9IHRydWU7Ci0JICArKypwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAndCc6Ci0JICAvKiBUZW1wbGF0ZS4gICovCi0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLCAoY2hhciAqKikgTlVMTCkKLQkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBob2xkID0gTlVMTDsKLQkgIGV4cGVjdF9mdW5jID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXyc6Ci0JICAvKiBBdCB0aGUgb3V0ZXJtb3N0IGxldmVsLCB3ZSBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlCi0JICAgICBzcGVjaWZpZWQsIHNvIGlmIHdlIHJ1biBpbnRvIGFub3RoZXIgJ18nIGF0IHRoaXMgcG9pbnQgd2UKLQkgICAgIGFyZSBkZWFsaW5nIHdpdGggYSBtYW5nbGVkIG5hbWUgdGhhdCBpcyBlaXRoZXIgYm9ndXMsIG9yCi0JICAgICBoYXMgYmVlbiBtYW5nbGVkIGJ5IHNvbWUgYWxnb3JpdGhtIHdlIGRvbid0IGtub3cgaG93IHRvCi0JICAgICBkZWFsIHdpdGguICBTbyBqdXN0IHJlamVjdCB0aGUgZW50aXJlIGRlbWFuZ2xpbmcuICAqLwotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JZGVmYXVsdDoKLQkgIC8qIEFzc3VtZSB3ZSBoYXZlIHN0dW1ibGVkIG9udG8gdGhlIGZpcnN0IG91dGVybW9zdCBmdW5jdGlvbgotCSAgICAgYXJndW1lbnQgdG9rZW4sIGFuZCBzdGFydCBwcm9jZXNzaW5nIGFyZ3MuICAqLwotCSAgZnVuY19kb25lID0gdHJ1ZTsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGV4cGVjdF9mdW5jKQotCXsKLQkgIGZ1bmNfZG9uZSA9IHRydWU7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgJm1pbmZvLT5hcmdzLCAmbWluZm8tPnZhcmFyZ3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBmdW5jX2RvbmUpCi0gICAgewotICAgICAgLyogV2l0aCBHTlUgc3R5bGUgZGVtYW5nbGluZywgYmFyX18zZm9vIGlzICdmb286OmJhcih2b2lkKScsIGFuZAotCSBiYXJfXzNmb29pIGlzICdmb286OmJhcihpbnQpJy4gIFdlIGdldCBoZXJlIHdoZW4gd2UgZmluZCB0aGUKLQkgZmlyc3QgY2FzZSwgYW5kIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlICcodm9pZCknIGdldHMgYWRkZWQKLQkgdG8gdGhlIGN1cnJlbnQgZGVjbHAuICAqLwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsICZtaW5mby0+YXJncywgJm1pbmZvLT52YXJhcmdzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIHF1YWxpZmllZCBuYW1lLCBzdWNoIGFzICJRMjVPdXRlcjVJbm5lciIgd2hpY2ggaXMgdGhlCi0gICBtYW5nbGVkIGZvcm0gb2YgIk91dGVyOjpJbm5lciIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgcHR5cGUpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKnB0eXBlOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgcXVhbGlmaWVyczsKLSAgZGVidWdfdHlwZSBjb250ZXh0OwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgc3dpdGNoICgoKnBwKVsxXSkKLSAgICB7Ci0gICAgY2FzZSAnXyc6Ci0gICAgICAvKiBHTlUgbWFuZ2xlZCBuYW1lIHdpdGggbW9yZSB0aGFuIDkgY2xhc3Nlcy4gIFRoZSBjb3VudCBpcwotCSBwcmVjZWRlZCBieSBhbiB1bmRlcnNjb3JlICh0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSA8PSA5Ci0JIGNhc2UpIGFuZCBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIHAgPSAqcHAgKyAyOwotICAgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnMCcpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHF1YWxpZmllcnMgPSBhdG9pIChwKTsKLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKQotCSsrcDsKLSAgICAgIGlmICgqcCAhPSAnXycpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICpwcCA9IHAgKyAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0gICAgICBxdWFsaWZpZXJzID0gKCpwcClbMV0gLSAnMCc7Ci0gICAgICAvKiBTa2lwIGFuIG9wdGlvbmFsIHVuZGVyc2NvcmUgYWZ0ZXIgdGhlIGNvdW50LiAgKi8KLSAgICAgIGlmICgoKnBwKVsyXSA9PSAnXycpCi0JKysqcHA7Ci0gICAgICAqcHAgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAvKiBQaWNrIG9mZiB0aGUgbmFtZXMuICAqLwotICB3aGlsZSAocXVhbGlmaWVycy0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKipwcCA9PSAnXycpCi0JKysqcHA7Ci0gICAgICBpZiAoKipwcCA9PSAndCcpCi0JewotCSAgY2hhciAqbmFtZTsKLQotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLAotCQkJCQlwdHlwZSAhPSBOVUxMID8gJm5hbWUgOiBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAocHR5cGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnRleHQgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKLQkJCQkJICAgICAgIG5hbWUsIHN0cmxlbiAobmFtZSksCi0JCQkJCSAgICAgICBERUJVR19LSU5EX0NMQVNTKTsKLQkgICAgICBmcmVlIChuYW1lKTsKLQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JICBsZW4gPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7Ci0JICBpZiAoc3RybGVuICgqcHApIDwgbGVuKQotCSAgICB7Ci0JICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAocHR5cGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnN0IGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0KLQkgICAgICBmaWVsZHMgPSBOVUxMOwotCSAgICAgIGlmIChjb250ZXh0ICE9IERFQlVHX1RZUEVfTlVMTCkKLQkJZmllbGRzID0gZGVidWdfZ2V0X2ZpZWxkcyAobWluZm8tPmRoYW5kbGUsIGNvbnRleHQpOwotCi0JICAgICAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQotCSAgICAgIGlmIChmaWVsZHMgIT0gTlVMTCkKLQkJewotCQkgIGNoYXIgKm5hbWU7Ci0KLQkJICAvKiBUcnkgdG8gZmluZCB0aGUgdHlwZSBieSBsb29raW5nIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAgICAgICAgICBmaWVsZHMgb2YgY29udGV4dCB1bnRpbCB3ZSBmaW5kIGEgZmllbGQgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHNhbWUgdHlwZS4gIFRoaXMgb3VnaHQgdG8gd29yayBmb3IgYSBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcywgYnV0IGl0IHdvbid0IHdvcmsgZm9yLAotICAgICAgICAgICAgICAgICAgICAgZS5nLiwgYW4gZW51bSBkZWZpbmVkIHdpdGhpbiBhIGNsYXNzLiAgc3RhYnMgZG9lcwotICAgICAgICAgICAgICAgICAgICAgbm90IGdpdmUgdXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICBsYXR0ZXIgY2FzZS4gICovCi0KLQkJICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBsZW4pOwotCi0JCSAgZm9yICg7ICpmaWVsZHMgIT0gREVCVUdfRklFTERfTlVMTDsgZmllbGRzKyspCi0JCSAgICB7Ci0JCSAgICAgIGRlYnVnX3R5cGUgZnQ7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmRuOwotCi0JCSAgICAgIGZ0ID0gZGVidWdfZ2V0X2ZpZWxkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqZmllbGRzKTsKLQkJICAgICAgaWYgKGZ0ID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGRuID0gZGVidWdfZ2V0X3R5cGVfbmFtZSAobWluZm8tPmRoYW5kbGUsIGZ0KTsKLQkJICAgICAgaWYgKGRuICE9IE5VTEwgJiYgc3RyY21wIChkbiwgbmFtZSkgPT0gMCkKLQkJCXsKLQkJCSAgY29udGV4dCA9IGZ0OwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGZyZWUgKG5hbWUpOwotCQl9Ci0KLQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCXsKLQkJICAvKiBXZSBoYXZlIHRvIGZhbGwgYmFjayBvbiBmaW5kaW5nIHRoZSB0eXBlIGJ5IG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBhcmUgbW9yZSB0eXBlcyB0byBjb21lLCB0aGVuIHRoaXMgbXVzdAotICAgICAgICAgICAgICAgICAgICAgYmUgYSBjbGFzcy4gIE90aGVyd2lzZSwgaXQgY291bGQgYmUgYW55dGhpbmcuICAqLwotCi0JCSAgaWYgKHF1YWxpZmllcnMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY2hhciAqbmFtZTsKLQotCQkgICAgICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBsZW4pOwotCQkgICAgICBjb250ZXh0ID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJCSAgICAgICBuYW1lKTsKLQkJICAgICAgZnJlZSAobmFtZSk7Ci0JCSAgICB9Ci0KLQkJICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnRleHQgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkJICAgICAgIG1pbmZvLT5pbmZvLAotCQkJCQkJICAgICAgICpwcCwgbGVuLAotCQkJCQkJICAgICAgIChxdWFsaWZpZXJzID09IDAKLQkJCQkJCQk/IERFQlVHX0tJTkRfSUxMRUdBTAotCQkJCQkJCTogREVCVUdfS0lORF9DTEFTUykpOwotCQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAqcHAgKz0gbGVuOwotCX0KLSAgICB9Ci0KLSAgaWYgKHB0eXBlICE9IE5VTEwpCi0gICAgKnB0eXBlID0gY29udGV4dDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSB0ZW1wbGF0ZS4gIElmIFBOQU1FIGlzIG5vdCBOVUxMLCB0aGlzIHNldHMgKlBOQU1FIHRvIGEKLSAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLCBwbmFtZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY2hhciAqKnBuYW1lOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICB1bnNpZ25lZCBpbnQgciwgaTsKLQotICBvcmlnID0gKnBwOwotCi0gICsrKnBwOwotCi0gIC8qIFNraXAgdGhlIHRlbXBsYXRlIG5hbWUuICAqLwotICByID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotICBpZiAociA9PSAwIHx8IHN0cmxlbiAoKnBwKSA8IHIpCi0gICAgewotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKnBwICs9IHI7Ci0KLSAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdC4gICovCi0gIGlmIChzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZyKSA9PSAwKQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKipwcCA9PSAnWicpCi0JewotCSAgLyogVGhpcyBpcyBhIHR5cGUgcGFyYW1ldGVyLiAgKi8KLQkgICsrKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIChkZWJ1Z190eXBlICopIE5VTEwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKm9sZF9wOwotCSAgYm9vbGVhbiBwb2ludGVycCwgcmVhbHAsIGludGVncmFscCwgY2hhcnAsIGJvb2xwOwotCSAgYm9vbGVhbiBkb25lOwotCi0JICBvbGRfcCA9ICpwcDsKLQkgIHBvaW50ZXJwID0gZmFsc2U7Ci0JICByZWFscCA9IGZhbHNlOwotCSAgaW50ZWdyYWxwID0gZmFsc2U7Ci0JICBjaGFycCA9IGZhbHNlOwotCSAgYm9vbHAgPSBmYWxzZTsKLQkgIGRvbmUgPSBmYWxzZTsKLQotCSAgLyogVGhpcyBpcyBhIHZhbHVlIHBhcmFtZXRlci4gICovCi0KLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICB3aGlsZSAoKm9sZF9wICE9ICdcMCcgJiYgISBkb25lKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqb2xkX3ApCi0JCXsKLQkJY2FzZSAnUCc6Ci0JCWNhc2UgJ3AnOgotCQljYXNlICdSJzoKLQkJICBwb2ludGVycCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0MnOgkvKiBDb25zdC4gICovCi0JCWNhc2UgJ1MnOgkvKiBTaWduZWQuICAqLwotCQljYXNlICdVJzoJLyogVW5zaWduZWQuICAqLwotCQljYXNlICdWJzoJLyogVm9sYXRpbGUuICAqLwotCQljYXNlICdGJzoJLyogRnVuY3Rpb24uICAqLwotCQljYXNlICdNJzoJLyogTWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkJY2FzZSAnTyc6CS8qID8/PyAqLwotCQkgICsrb2xkX3A7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1EnOgkvKiBRdWFsaWZpZWQgbmFtZS4gICovCi0JCSAgaW50ZWdyYWxwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAnVCc6CS8qIFJlbWVtYmVyZWQgdHlwZS4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgJ3YnOgkvKiBWb2lkLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJY2FzZSAneCc6CS8qIExvbmcgbG9uZy4gICovCi0JCWNhc2UgJ2wnOgkvKiBMb25nLiAgKi8KLQkJY2FzZSAnaSc6CS8qIEludC4gICovCi0JCWNhc2UgJ3MnOgkvKiBTaG9ydC4gICovCi0JCWNhc2UgJ3cnOgkvKiBXY2hhcl90LiAgKi8KLQkJICBpbnRlZ3JhbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdiJzoJLyogQm9vbC4gICovCi0JCSAgYm9vbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdjJzoJLyogQ2hhci4gICovCi0JCSAgY2hhcnAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdyJzoJLyogTG9uZyBkb3VibGUuICAqLwotCQljYXNlICdkJzoJLyogRG91YmxlLiAgKi8KLQkJY2FzZSAnZic6CS8qIEZsb2F0LiAgKi8KLQkJICByZWFscCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgLyogQXNzdW1lIGl0J3MgYSB1c2VyIGRlZmluZWQgaW50ZWdyYWwgdHlwZS4gICovCi0JCSAgaW50ZWdyYWxwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpbnRlZ3JhbHApCi0JICAgIHsKLQkgICAgICBpZiAoKipwcCA9PSAnbScpCi0JCSsrKnBwOwotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0JCSsrKnBwOwotCSAgICB9Ci0JICBlbHNlIGlmIChjaGFycCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCB2YWw7Ci0KLQkgICAgICBpZiAoKipwcCA9PSAnbScpCi0JCSsrKnBwOwotCSAgICAgIHZhbCA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQkgICAgICBpZiAodmFsID09IDApCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJvb2xwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbDsKLQotCSAgICAgIHZhbCA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQkgICAgICBpZiAodmFsICE9IDAgJiYgdmFsICE9IDEpCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJlYWxwKQotCSAgICB7Ci0JICAgICAgaWYgKCoqcHAgPT0gJ20nKQotCQkrKypwcDsKLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkrKypwcDsKLQkgICAgICBpZiAoKipwcCA9PSAnLicpCi0JCXsKLQkJICArKypwcDsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkgICAgKysqcHA7Ci0JCX0KLQkgICAgICBpZiAoKipwcCA9PSAnZScpCi0JCXsKLQkJICArKypwcDsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkgICAgKysqcHA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocG9pbnRlcnApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmbGVuKSkKLQkJewotCQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICAqcHAgKz0gbGVuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBXZSBjYW4gdHJhbnNsYXRlIHRoaXMgdG8gYSBzdHJpbmcgZmFpcmx5IGVhc2lseSBieSBpbnZva2luZyB0aGUKLSAgICAgcmVndWxhciBkZW1hbmdsaW5nIHJvdXRpbmUuICAqLwotICBpZiAocG5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzMSwgKnMyLCAqczMsICpzNDsKLSAgICAgIGNoYXIgKmZyb20sICp0bzsKLQotICAgICAgczEgPSBzYXZlc3RyaW5nIChvcmlnLCAqcHAgLSBvcmlnKTsKLQotICAgICAgczIgPSBjb25jYXQgKCJOb1N1Y2hTdHJpbkdfXyIsIHMxLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQotICAgICAgZnJlZSAoczEpOwotCi0gICAgICBzMyA9IGNwbHVzX2RlbWFuZ2xlIChzMiwgRE1HTF9BTlNJKTsKLQotICAgICAgZnJlZSAoczIpOwotCi0gICAgICBpZiAoczMgIT0gTlVMTCkKLQlzNCA9IHN0cnN0ciAoczMsICI6Ok5vU3VjaFN0cmluRyIpOwotICAgICAgaWYgKHMzID09IE5VTEwgfHwgczQgPT0gTlVMTCkKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICBpZiAoczMgIT0gTlVMTCkKLQkgICAgZnJlZSAoczMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogRWxpbWluYXRpbmcgYWxsIHNwYWNlcywgZXhjZXB0IHRob3NlIGJldHdlZW4gPiBjaGFyYWN0ZXJzLAotICAgICAgICAgbWFrZXMgaXQgbW9yZSBsaWtlbHkgdGhhdCB0aGUgZGVtYW5nbGVkIG5hbWUgd2lsbCBtYXRjaCB0aGUKLSAgICAgICAgIG5hbWUgd2hpY2ggZysrIHVzZWQgYXMgdGhlIHN0cnVjdHVyZSBuYW1lLiAgKi8KLSAgICAgIGZvciAoZnJvbSA9IHRvID0gczM7IGZyb20gIT0gczQ7ICsrZnJvbSkKLQlpZiAoKmZyb20gIT0gJyAnCi0JICAgIHx8IChmcm9tWzFdID09ICc+JyAmJiBmcm9tID4gczMgJiYgZnJvbVstMV0gPT0gJz4nKSkKLQkgICp0bysrID0gKmZyb207Ci0KLSAgICAgICpwbmFtZSA9IHNhdmVzdHJpbmcgKHMzLCB0byAtIHMzKTsKLQotICAgICAgZnJlZSAoczMpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSBjbGFzcyBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfY2xhc3MgKG1pbmZvLCBwcCwgcHN0YXJ0KQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGNoYXIgKipwc3RhcnQ7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIHVuc2lnbmVkIGludCBuOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgbiA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLSAgaWYgKHN0cmxlbiAoKnBwKSA8IG4pCi0gICAgewotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAocHN0YXJ0ICE9IE5VTEwpCi0gICAgKnBzdGFydCA9ICpwcDsKLQotICAqcHAgKz0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgZnVuY3Rpb24gYXJndW1lbnRzLiAgSWYgdGhlIHBhcmdzIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCBpdAotICAgaXMgc2V0IHRvIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IGhvbGRpbmcgdGhlIGFyZ3VtZW50cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgcGFyZ3MsIHB2YXJhcmdzKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICoqcGFyZ3M7Ci0gICAgIGJvb2xlYW4gKnB2YXJhcmdzOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICB1bnNpZ25lZCBpbnQgYWxsb2MsIGNvdW50OwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgYWxsb2MgPSAxMDsKLSAgaWYgKHBhcmdzICE9IE5VTEwpCi0gICAgewotICAgICAgKnBhcmdzID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKipwYXJncyk7Ci0gICAgICAqcHZhcmFyZ3MgPSBmYWxzZTsKLSAgICB9Ci0gIGNvdW50ID0gMDsKLQotICB3aGlsZSAoKipwcCAhPSAnXycgJiYgKipwcCAhPSAnXDAnICYmICoqcHAgIT0gJ2UnKQotICAgIHsKLSAgICAgIGlmICgqKnBwID09ICdOJyB8fCAqKnBwID09ICdUJykKLQl7Ci0JICBjaGFyIHRlbXB0eXBlOwotCSAgdW5zaWduZWQgaW50IHIsIHQ7Ci0KLQkgIHRlbXB0eXBlID0gKipwcDsKLQkgICsrKnBwOwotCi0JICBpZiAodGVtcHR5cGUgPT0gJ1QnKQotCSAgICByID0gMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJnIpKQotCQl7Ci0JCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJnQpKQotCSAgICB7Ci0JICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAodCA+PSBtaW5mby0+dHlwZXN0cmluZ19jb3VudCkKLQkgICAgewotCSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIHdoaWxlIChyLS0gPiAwKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqdGVtOwotCi0JICAgICAgdGVtID0gbWluZm8tPnR5cGVzdHJpbmdzW3RdLnR5cGVzdHJpbmc7Ci0JICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmcgKG1pbmZvLCAmdGVtLCBwYXJncywgJmNvdW50LCAmYWxsb2MpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmcgKG1pbmZvLCBwcCwgcGFyZ3MsICZjb3VudCwgJmFsbG9jKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHBhcmdzICE9IE5VTEwpCi0gICAgKCpwYXJncylbY291bnRdID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICgqKnBwID09ICdlJykKLSAgICB7Ci0gICAgICBpZiAocGFyZ3MgIT0gTlVMTCkKLQkqcHZhcmFyZ3MgPSB0cnVlOwotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIHNpbmdsZSBhcmd1bWVudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2FyZyAobWluZm8sIHBwLCBwYXJncywgcGNvdW50LCBwYWxsb2MpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKipwYXJnczsKLSAgICAgdW5zaWduZWQgaW50ICpwY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCAqcGFsbG9jOwotewotICBjb25zdCBjaGFyICpzdGFydDsKLSAgZGVidWdfdHlwZSB0eXBlOwotCi0gIHN0YXJ0ID0gKnBwOwotICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwKLQkJCSAgICBwYXJncyA9PSBOVUxMID8gKGRlYnVnX3R5cGUgKikgTlVMTCA6ICZ0eXBlKQotICAgICAgfHwgISBzdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBzdGFydCwgKnBwIC0gc3RhcnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAocGFyZ3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoKnBjb3VudCArIDEgPj0gKnBhbGxvYykKLQl7Ci0JICAqcGFsbG9jICs9IDEwOwotCSAgKnBhcmdzID0gKChkZWJ1Z190eXBlICopCi0JCSAgICB4cmVhbGxvYyAoKnBhcmdzLCAqcGFsbG9jICogc2l6ZW9mICoqcGFyZ3MpKTsKLQl9Ci0gICAgICAoKnBhcmdzKVsqcGNvdW50XSA9IHR5cGU7Ci0gICAgICArKypwY291bnQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIHR5cGUuICBJZiB0aGUgcHR5cGUgYXJndW1lbnQgaXMgbm90IE5VTEwsICpwdHlwZSBpcyBzZXQKLSAgIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKnB0eXBlOwotewotICBjb25zdCBjaGFyICpvcmlnOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgc3dpdGNoICgqKnBwKQotICAgIHsKLSAgICBjYXNlICdQJzoKLSAgICBjYXNlICdwJzoKLSAgICAgIC8qIEEgcG9pbnRlciB0eXBlLiAgKi8KLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgLyogQSByZWZlcmVuY2UgdHlwZS4gICovCi0gICAgICArKypwcDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JKnB0eXBlID0gZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOgotICAgICAgLyogQW4gYXJyYXkuICAqLwotICAgICAgewotCXVuc2lnbmVkIGxvbmcgaGlnaDsKLQotCSsrKnBwOwotCWhpZ2ggPSAwOwotCXdoaWxlICgqKnBwICE9ICdcMCcgJiYgKipwcCAhPSAnXycpCi0JICB7Ci0JICAgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkgICAgICB7Ci0JCXN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgaGlnaCAqPSAxMDsKLQkgICAgaGlnaCArPSAqKnBwIC0gJzAnOwotCSAgICArKypwcDsKLQkgIH0KLQlpZiAoKipwcCAhPSAnXycpCi0JICB7Ci0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSsrKnBwOwotCi0JaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgIHsKLQkgICAgZGVidWdfdHlwZSBpbnRfdHlwZTsKLQotCSAgICBpbnRfdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJpbnQiKTsKLQkgICAgaWYgKGludF90eXBlID09IE5VTEwpCi0JICAgICAgaW50X3R5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCwgZmFsc2UpOwotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUsIGludF90eXBlLAotCQkJCQkgICAgMCwgaGlnaCwgZmFsc2UpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIC8qIEEgYmFjayByZWZlcmVuY2UgdG8gYSByZW1lbWJlcmVkIHR5cGUuICAqLwotICAgICAgewotCXVuc2lnbmVkIGludCBpOwotCWNvbnN0IGNoYXIgKnA7Ci0KLQkrKypwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZpKSkKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JaWYgKGkgPj0gbWluZm8tPnR5cGVzdHJpbmdfY291bnQpCi0JICB7Ci0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCXAgPSBtaW5mby0+dHlwZXN0cmluZ3NbaV0udHlwZXN0cmluZzsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCAmcCwgcHR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdGJzoKLSAgICAgIC8qIEEgZnVuY3Rpb24uICAqLwotICAgICAgewotCWRlYnVnX3R5cGUgKmFyZ3M7Ci0JYm9vbGVhbiB2YXJhcmdzOwotCi0JKysqcHA7Ci0JaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsCi0JCQkJICAocHR5cGUgPT0gTlVMTAotCQkJCSAgID8gKGRlYnVnX3R5cGUgKiopIE5VTEwKLQkJCQkgICA6ICZhcmdzKSwKLQkJCQkgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgPyAoYm9vbGVhbiAqKSBOVUxMCi0JCQkJICAgOiAmdmFyYXJncykpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICgqKnBwICE9ICdfJykKLQkgIHsKLQkgICAgLyogY3BsdXNfZGVtYW5nbGUgd2lsbCBhY2NlcHQgYSBmdW5jdGlvbiB3aXRob3V0IGEgcmV0dXJuCi0JICAgICAgIHR5cGUsIGJ1dCBJIGRvbid0IGtub3cgd2hlbiB0aGF0IHdpbGwgaGFwcGVuLCBvciB3aGF0Ci0JICAgICAgIHRvIGRvIGlmIGl0IGRvZXMuICAqLwotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkrKypwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgKnB0eXBlID0gZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlLCBhcmdzLAotCQkJCQkgICAgIHZhcmFyZ3MpOwotCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ00nOgotICAgIGNhc2UgJ08nOgotICAgICAgewotCWJvb2xlYW4gbWVtYmVycCwgY29uc3RwLCB2b2xhdGlsZXA7Ci0JZGVidWdfdHlwZSBjbGFzc190eXBlID0gREVCVUdfVFlQRV9OVUxMOwotCWRlYnVnX3R5cGUgKmFyZ3M7Ci0JYm9vbGVhbiB2YXJhcmdzOwotCXVuc2lnbmVkIGludCBuOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQltZW1iZXJwID0gKipwcCA9PSAnTSc7Ci0JY29uc3RwID0gZmFsc2U7Ci0Jdm9sYXRpbGVwID0gZmFsc2U7Ci0JYXJncyA9IE5VTEw7Ci0JdmFyYXJncyA9IGZhbHNlOwotCi0JKysqcHA7Ci0JaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkgIHsKLQkgICAgbiA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQkgICAgaWYgKHN0cmxlbiAoKnBwKSA8IG4pCi0JICAgICAgewotCQlzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgIG5hbWUgPSAqcHA7Ci0JICAgICpwcCArPSBuOwotCi0JICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCSAgICAgIHsKLQkJY2xhc3NfdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCQkgICAgbWluZm8tPmluZm8sCi0JCQkJCQkgICAgbmFtZSwgKGludCkgbiwKLQkJCQkJCSAgICBERUJVR19LSU5EX0NMQVNTKTsKLQkJaWYgKGNsYXNzX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAoKipwcCA9PSAnUScpCi0JICB7Ci0JICAgIGlmICghIHN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkIChtaW5mbywgcHAsCi0JCQkJCSAgIChwdHlwZSA9PSBOVUxMCi0JCQkJCSAgICA/IChkZWJ1Z190eXBlICopIE5VTEwKLQkJCQkJICAgIDogJmNsYXNzX3R5cGUpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCWlmIChtZW1iZXJwKQotCSAgewotCSAgICBpZiAoKipwcCA9PSAnQycpCi0JICAgICAgewotCQljb25zdHAgPSB0cnVlOwotCQkrKypwcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKCoqcHAgPT0gJ1YnKQotCSAgICAgIHsKLQkJdm9sYXRpbGVwID0gdHJ1ZTsKLQkJKysqcHA7Ci0JICAgICAgfQotCSAgICBpZiAoKipwcCAhPSAnRicpCi0JICAgICAgewotCQlzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICsrKnBwOwotCSAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwKLQkJCQkgICAgICAocHR5cGUgPT0gTlVMTAotCQkJCSAgICAgICA/IChkZWJ1Z190eXBlICoqKSBOVUxMCi0JCQkJICAgICAgIDogJmFyZ3MpLAotCQkJCSAgICAgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgICAgID8gKGJvb2xlYW4gKikgTlVMTAotCQkJCSAgICAgICA6ICZ2YXJhcmdzKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JaWYgKCoqcHAgIT0gJ18nKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkrKypwcDsKLQotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgIHsKLQkgICAgaWYgKCEgbWVtYmVycCkKLQkgICAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX29mZnNldF90eXBlIChtaW5mby0+ZGhhbmRsZSwgY2xhc3NfdHlwZSwKLQkJCQkJICAgICAgICpwdHlwZSk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIEZJWE1FOiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgY29uc3RwIG9yCi0gICAgICAgICAgICAgICAgICAgdm9sYXRpbGVwLiAgKi8KLQkJKnB0eXBlID0gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSwKLQkJCQkJCSBjbGFzc190eXBlLCBhcmdzLCB2YXJhcmdzKTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgKysqcHA7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQyc6Ci0gICAgICArKypwcDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JKnB0eXBlID0gZGVidWdfbWFrZV9jb25zdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUSc6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqaG9sZDsKLQotCWhvbGQgPSAqcHA7Ci0JaWYgKCEgc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgcHR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9mdW5kX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSBmdW5kYW1lbnRhbCB0eXBlLiAgSWYgdGhlIHB0eXBlIGFyZ3VtZW50IGlzIG5vdCBOVUxMLAotICAgKnB0eXBlIGlzIHNldCB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9mdW5kX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKnB0eXBlOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBib29sZWFuIGNvbnN0cCwgdm9sYXRpbGVwLCB1bnNpZ25lZHAsIHNpZ25lZHA7Ci0gIGJvb2xlYW4gZG9uZTsKLQotICBvcmlnID0gKnBwOwotCi0gIGNvbnN0cCA9IGZhbHNlOwotICB2b2xhdGlsZXAgPSBmYWxzZTsKLSAgdW5zaWduZWRwID0gZmFsc2U7Ci0gIHNpZ25lZHAgPSBmYWxzZTsKLQotICBkb25lID0gZmFsc2U7Ci0gIHdoaWxlICghIGRvbmUpCi0gICAgewotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICdDJzoKLQkgIGNvbnN0cCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVSc6Ci0JICB1bnNpZ25lZHAgPSB0cnVlOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWNhc2UgJ1MnOgotCSAgc2lnbmVkcCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVic6Ci0JICB2b2xhdGlsZXAgPSB0cnVlOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBkb25lID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgc3dpdGNoICgqKnBwKQotICAgIHsKLSAgICBjYXNlICdcMCc6Ci0gICAgY2FzZSAnXyc6Ci0gICAgICAvKiBjcGx1c19kZW1hbmdsZSBwZXJtaXRzIHRoaXMsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCBpdCBtZWFucy4gICovCi0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3YnOiAvKiB2b2lkICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAidm9pZCIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChtaW5mby0+ZGhhbmRsZSk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOiAvKiBsb25nIGxvbmcgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCSAgKHVuc2lnbmVkcAotCQkJCQkgICA/ICJsb25nIGxvbmcgdW5zaWduZWQgaW50IgotCQkJCQkgICA6ICJsb25nIGxvbmcgaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA4LCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdsJzogLyogbG9uZyAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gImxvbmcgdW5zaWduZWQgaW50IgotCQkJCQkgICA6ICJsb25nIGludCIpKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCwgdW5zaWduZWRwKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaSc6IC8qIGludCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gInVuc2lnbmVkIGludCIKLQkJCQkJICAgOiAiaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0LCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzogLyogc2hvcnQgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCSAgKHVuc2lnbmVkcAotCQkJCQkgICA/ICJzaG9ydCB1bnNpZ25lZCBpbnQiCi0JCQkJCSAgIDogInNob3J0IGludCIpKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgMiwgdW5zaWduZWRwKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6IC8qIGJvb2wgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJib29sIik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0KTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYyc6IC8qIGNoYXIgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCSAgKHVuc2lnbmVkcAotCQkJCQkgICA/ICJ1bnNpZ25lZCBjaGFyIgotCQkJCQkgICA6IChzaWduZWRwCi0JCQkJCSAgICAgID8gInNpZ25lZCBjaGFyIgotCQkJCQkgICAgICA6ICJjaGFyIikpKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgMSwgdW5zaWduZWRwKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndyc6IC8qIHdjaGFyX3QgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJfX3djaGFyX3QiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgMiwgdHJ1ZSk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3InOiAvKiBsb25nIGRvdWJsZSAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImxvbmcgZG91YmxlIik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgOCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOiAvKiBkb3VibGUgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJkb3VibGUiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA4KTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZic6IC8qIGZsb2F0ICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiZmxvYXQiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0KTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICArKypwcDsKLSAgICAgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgewotCWNvbnN0IGNoYXIgKmhvbGQ7Ci0KLQlpZiAoISBzdGFiX2RlbWFuZ2xlX2NsYXNzIChtaW5mbywgcHAsICZob2xkKSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgIHsKLQkgICAgY2hhciAqbmFtZTsKLQotCSAgICBuYW1lID0gc2F2ZXN0cmluZyAoaG9sZCwgKnBwIC0gaG9sZCk7Ci0JICAgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG5hbWUpOwotCSAgICBmcmVlIChuYW1lKTsKLQkgICAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgewotCQkvKiBGSVhNRTogSXQgaXMgcHJvYmFibHkgaW5jb3JyZWN0IHRvIGFzc3VtZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIHR5cGVzIGFyZSB0YWdnZWQgdHlwZXMuICAqLwotCQkqcHR5cGUgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKLQkJCQkJCWhvbGQsICpwcCAtIGhvbGQsCi0JCQkJCQlERUJVR19LSU5EX0lMTEVHQUwpOwotCQlpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIHsKLQljaGFyICpuYW1lOwotCi0JaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLAotCQkJCSAgICAgIHB0eXBlICE9IE5VTEwgPyAmbmFtZSA6IE5VTEwpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICAqcHR5cGUgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKLQkJCQkJICAgIG5hbWUsIHN0cmxlbiAobmFtZSksCi0JCQkJCSAgICBERUJVR19LSU5EX0NMQVNTKTsKLQkgICAgZnJlZSAobmFtZSk7Ci0JICAgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHB0eXBlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGNvbnN0cCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOwotICAgICAgaWYgKHZvbGF0aWxlcCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVtZW1iZXIgYSB0eXBlIHN0cmluZyBpbiBhIGRlbWFuZ2xlZCBzdHJpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgcCwgbGVuKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgaW50IGxlbjsKLXsKLSAgaWYgKG1pbmZvLT50eXBlc3RyaW5nX2NvdW50ID49IG1pbmZvLT50eXBlc3RyaW5nX2FsbG9jKQotICAgIHsKLSAgICAgIG1pbmZvLT50eXBlc3RyaW5nX2FsbG9jICs9IDEwOwotICAgICAgbWluZm8tPnR5cGVzdHJpbmdzID0gKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV90eXBlc3RyaW5nICopCi0JCQkgICAgeHJlYWxsb2MgKG1pbmZvLT50eXBlc3RyaW5ncywKLQkJCQkgICAgICAobWluZm8tPnR5cGVzdHJpbmdfYWxsb2MKLQkJCQkgICAgICAgKiBzaXplb2YgKm1pbmZvLT50eXBlc3RyaW5ncykpKTsKLSAgICB9Ci0KLSAgbWluZm8tPnR5cGVzdHJpbmdzW21pbmZvLT50eXBlc3RyaW5nX2NvdW50XS50eXBlc3RyaW5nID0gcDsKLSAgbWluZm8tPnR5cGVzdHJpbmdzW21pbmZvLT50eXBlc3RyaW5nX2NvdW50XS5sZW4gPSAodW5zaWduZWQgaW50KSBsZW47Ci0gICsrbWluZm8tPnR5cGVzdHJpbmdfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zdGFtcC1oLmluIGIvYmludXRpbHMvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpbmdzLjEgYi9iaW51dGlscy9zdHJpbmdzLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTQ2ZTUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RyaW5ncy4xCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBzdHJpbmdzIDEgIjI1IEp1bmUgMTk5MyIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLXN0cmluZ3MgXC0gcHJpbnQgdGhlIHN0cmluZ3Mgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gZmlsZXMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIHN0cmluZ3MKLS5SQiAiW1x8IiBcLWEgfCBcLVxjCi0uUkIgfCBcLVwtYWxsICJcfF0iIAotLlJCICJbXHwiIFwtZiB8IFwtXC1wcmludFwtZmlsZVwtbmFtZSAiXHxdIgotLlJCICJbXHwiIFwtbyAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIiAKLS5SQiAiW1x8IiBcLXYgfCBcLVwtdmVyc2lvbiAiXHxdIiAgCi0uUkIgIltcfCIgXC1uCi0uSSBtaW5cLWxlblxjCi0uUkkgfCBcLW1pblwtbGVuXGMKLS5SQiB8ICJcLVwtYnl0ZXM9IlxjCi0uSSBtaW5cLWxlblxjCi1cJlx8XQotLlJCICJbXHwiIFwtdAotLkkge28seCxkfVxjCi0uUkIgIltcfCIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIgIlx8XSIKLS5SQiB8ICJcLVwtcmFkaXg9IlxjCi0uSSB7byx4LGR9XGMKLVwmXHxdCi0uSSBmaWxlXGMKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1Gb3IgZWFjaAotLkkgZmlsZQotZ2l2ZW4sIEdOVSBcYwotLkIgc3RyaW5ncwotcHJpbnRzIHRoZSBwcmludGFibGUgY2hhcmFjdGVyIHNlcXVlbmNlcyB0aGF0IGFyZSBhdCBsZWFzdCA0Ci1jaGFyYWN0ZXJzIGxvbmcgKG9yIHRoZSBudW1iZXIgZ2l2ZW4gd2l0aCB0aGUgb3B0aW9ucyBiZWxvdykgYW5kIGFyZQotZm9sbG93ZWQgYnkgYW4gdW5wcmludGFibGUgY2hhcmFjdGVyLiAgQnkgZGVmYXVsdCwgaXQgb25seSBwcmludHMgdGhlCi1zdHJpbmdzIGZyb20gdGhlIGluaXRpYWxpemVkIGFuZCBsb2FkZWQgc2VjdGlvbnMgb2Ygb2JqZWN0IGZpbGVzOyBmb3IKLW90aGVyIHR5cGVzIG9mIGZpbGVzLCBpdCBwcmludHMgdGhlIHN0cmluZ3MgZnJvbSB0aGUgd2hvbGUgZmlsZS4KLQotLlBQCi0uQiBzdHJpbmdzCi1pcyBtYWlubHkgdXNlZnVsIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudHMgb2Ygbm9uLXRleHQgZmlsZXMuCi0KLS5TSCBPUFRJT05TCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotLlRQCi0uQiBcLWEKLS5UUAotLkIgXC1cLWFsbAotLlRQCi0uQiBcLQotRG8gbm90IHNjYW4gb25seSB0aGUgaW5pdGlhbGl6ZWQgYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7Ci1zY2FuIHRoZSB3aG9sZSBmaWxlcy4KLQotLlRQCi0uQiBcLWYKLS5UUAotLkIgXC1cLXByaW50XC1maWxlXC1uYW1lCi1QcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgc3RyaW5ncwotb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLQotLlRQCi0uQiBcLXYKLS5UUAotLkIgXC1cLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlcgotb2YKLS5CIHN0cmluZ3MKLW9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi0KLS5UUAotLkIgIlwtbiBcZkltaW5cLWxlblxmUCIKLS5UUAotLkIgIlwtXGZJbWluXC1sZW5cZlAiCi0uVFAKLS5CICJcLVwtYnl0ZXM9XGZJbWluXC1sZW5cZlAiCi1QcmludCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhdCBsZWFzdAotLkkgbWluXC1sZW4KLWNoYXJhY3RlcnMgbG9uZywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA0LgotCi0uVFAKLS5CUiAiXC10ICIge28seCxkfQotLlRQCi0uQlIgIlwtXC1yYWRpeD0iIHtvLHgsZH0KLVByaW50IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4gIFRoZSBzaW5nbGUKLWNoYXJhY3RlciBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHJhZGl4IG9mIHRoZSBvZmZzZXRcKGVtb2N0YWwsCi1oZXhhZGVjaW1hbCwgb3IgZGVjaW1hbC4KLQotLlRQCi0uQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLVNlZSAKLS5CUiBvYmpkdW1wICggMSApLAotZm9yIGluZm9ybWF0aW9uIG9uIGxpc3RpbmcgYXZhaWxhYmxlIGZvcm1hdHMuCi0KLS5UUAotLkIgXC1vCi1MaWtlCi0uQlIgIlwtdCBvIiAuCi0KLS5QUAotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsKLS5CUiBhciAoIDEgKSwKLS5CUiBubSAoIDEgKSwKLS5CUiBvYmpkdW1wICggMSApLAotLkJSIHJhbmxpYiAoIDEgKS4KLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpbmdzLmMgYi9iaW51dGlscy9zdHJpbmdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTM5ZmEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RyaW5ncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qIHN0cmluZ3MgLS0gcHJpbnQgdGhlIHN0cmluZ3Mgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gZmlsZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qIFVzYWdlOiBzdHJpbmdzIFtvcHRpb25zXSBmaWxlLi4uCi0KLSAgIE9wdGlvbnM6Ci0gICAtLWFsbAotICAgLWEKLSAgIC0JCURvIG5vdCBzY2FuIG9ubHkgdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBvZiBvYmplY3QgZmlsZXMuCi0KLSAgIC0tcHJpbnQtZmlsZS1uYW1lCi0gICAtZgkJUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLgotCi0gICAtLWJ5dGVzPW1pbi1sZW4KLSAgIC1uIG1pbi1sZW4KLSAgIC1taW4tbGVuCVByaW50IGdyYXBoaWMgY2hhciBzZXF1ZW5jZXMsIE1JTi1MRU4gb3IgbW9yZSBieXRlcyBsb25nLAotCQl0aGF0IGFyZSBmb2xsb3dlZCBieSBhIE5VTCBvciBhIG5ld2xpbmUuICBEZWZhdWx0IGlzIDQuCi0KLSAgIC0tcmFkaXg9e28seCxkfQotICAgLXQge28seCxkfQlQcmludCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcsCi0JCWluIG9jdGFsL2hleC9kZWNpbWFsLgotCi0gICAtbwkJTGlrZSAtdG8uICAoU29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaGF2ZSAtbyBsaWtlIC10bywKLQkJb3RoZXJzIGxpa2UgLXRkLiAgV2UgY2hvc2Ugb25lIGFyYml0cmFyaWx5LikKLQotICAgLS10YXJnZXQ9QkZETkFNRQotCQlTcGVjaWZ5IGEgbm9uLWRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi0gICAtLWhlbHAKLSAgIC1oCQlQcmludCB0aGUgdXNhZ2UgbWVzc2FnZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi0gICAtLXZlcnNpb24KLSAgIC12CQlQcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uIG51bWJlci4KLQotICAgV3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIDxybXNAZ251LmFpLm1pdC5lZHU+Ci0gICBhbmQgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZkZWYgaXNhc2NpaQotI2RlZmluZSBpc2dyYXBoaWMoYykgKGlzYXNjaWkgKGMpICYmIGlzcHJpbnQgKGMpKQotI2Vsc2UKLSNkZWZpbmUgaXNncmFwaGljKGMpIChpc3ByaW50IChjKSkKLSNlbmRpZgotCi0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLS8qIFRoZSBCRkQgc2VjdGlvbiBmbGFncyB0aGF0IGlkZW50aWZ5IGFuIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIERBVEFfRkxBR1MgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUykKLQotLyogUmFkaXggZm9yIHByaW50aW5nIGFkZHJlc3NlcyAobXVzdCBiZSA4LCAxMCBvciAxNikuICAqLwotc3RhdGljIGludCBhZGRyZXNzX3JhZGl4OwotCi0vKiBNaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSBvZiBncmFwaGljIGNoYXJzIHRvIHRyaWdnZXIgb3V0cHV0LiAgKi8KLXN0YXRpYyBpbnQgc3RyaW5nX21pbjsKLQotLyogdHJ1ZSBtZWFucyBwcmludCBhZGRyZXNzIHdpdGhpbiBmaWxlIGZvciBlYWNoIHN0cmluZy4gICovCi1zdGF0aWMgYm9vbGVhbiBwcmludF9hZGRyZXNzZXM7Ci0KLS8qIHRydWUgbWVhbnMgcHJpbnQgZmlsZW5hbWUgZm9yIGVhY2ggc3RyaW5nLiAgKi8KLXN0YXRpYyBib29sZWFuIHByaW50X2ZpbGVuYW1lczsKLQotLyogdHJ1ZSBtZWFucyBmb3Igb2JqZWN0IGZpbGVzIHNjYW4gb25seSB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuIGRhdGFzZWN0aW9uX29ubHk7Ci0KLS8qIHRydWUgaWYgd2UgZm91bmQgYW4gaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGluIHRoZSBjdXJyZW50IGZpbGUuICAqLwotc3RhdGljIGJvb2xlYW4gZ290X2Ffc2VjdGlvbjsKLQotLyogVGhlIEJGRCBvYmplY3QgZmlsZSBmb3JtYXQuICAqLwotc3RhdGljIGNoYXIgKnRhcmdldDsKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ImFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7InByaW50LWZpbGUtbmFtZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZid9LAotICB7ImJ5dGVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICduJ30sCi0gIHsicmFkaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3QnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1QnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7TlVMTCwgMCwgTlVMTCwgMH0KLX07Ci0KLXN0YXRpYyB2b2lkIHN0cmluZ3NfYV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0cmluZ3Nfb2JqZWN0X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdHJpbmdzX2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZSkpOwotc3RhdGljIGludCBpbnRlZ2VyX2FyZyBQQVJBTVMgKChjaGFyICpzKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdHJpbmdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBGSUxFICpzdHJlYW0sCi0JCQkJICBmaWxlX3B0ciBhZGRyZXNzLCBpbnQgc3RvcF9wb2ludCwKLQkJCQkgIGludCBtYWdpY2NvdW50LCBjaGFyICptYWdpYykpOwotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqc3RyZWFtLCBpbnQgc3RhdHVzKSk7Ci0MCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IG9wdGM7Ci0gIGludCBleGl0X3N0YXR1cyA9IDA7Ci0gIGJvb2xlYW4gZmlsZXNfZ2l2ZW4gPSBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLSAgc3RyaW5nX21pbiA9IC0xOwotICBwcmludF9hZGRyZXNzZXMgPSBmYWxzZTsKLSAgcHJpbnRfZmlsZW5hbWVzID0gZmFsc2U7Ci0gIGRhdGFzZWN0aW9uX29ubHkgPSB0cnVlOwotICB0YXJnZXQgPSBOVUxMOwotCi0gIHdoaWxlICgob3B0YyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYWZuOm90OnYwMTIzNDU2Nzg5IiwKLQkJCSAgICAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0YykKLQl7Ci0JY2FzZSAnYSc6Ci0JICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgcHJpbnRfZmlsZW5hbWVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQotCWNhc2UgJ24nOgotCSAgc3RyaW5nX21pbiA9IGludGVnZXJfYXJnIChvcHRhcmcpOwotCSAgaWYgKHN0cmluZ19taW4gPCAxKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW52YWxpZCBudW1iZXIgJXNcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCSAgcHJpbnRfYWRkcmVzc2VzID0gdHJ1ZTsKLQkgIGFkZHJlc3NfcmFkaXggPSA4OwotCSAgYnJlYWs7Ci0KLQljYXNlICd0JzoKLQkgIHByaW50X2FkZHJlc3NlcyA9IHRydWU7Ci0JICBpZiAob3B0YXJnWzFdICE9ICdcMCcpCi0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgc3dpdGNoIChvcHRhcmdbMF0pCi0JICAgIHsKLQkgICAgY2FzZSAnbyc6Ci0JICAgICAgYWRkcmVzc19yYWRpeCA9IDg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgYWRkcmVzc19yYWRpeCA9IDEwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIGFkZHJlc3NfcmFkaXggPSAxNjsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ1QnOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICd2JzoKLQkgIHByaW50X3ZlcnNpb24gKCJzdHJpbmdzIik7Ci0JICBicmVhazsKLQotCWNhc2UgJz8nOgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHN0cmluZ19taW4gPCAwKQotCSAgICBzdHJpbmdfbWluID0gb3B0YyAtICcwJzsKLQkgIGVsc2UKLQkgICAgc3RyaW5nX21pbiA9IHN0cmluZ19taW4gKiAxMCArIG9wdGMgLSAnMCc7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChzdHJpbmdfbWluIDwgMCkKLSAgICBzdHJpbmdfbWluID0gNDsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICBpZiAob3B0aW5kID49IGFyZ2MpCi0gICAgewotICAgICAgZGF0YXNlY3Rpb25fb25seSA9IGZhbHNlOwotICAgICAgcHJpbnRfc3RyaW5ncyAoIntzdGFuZGFyZCBpbnB1dH0iLCBzdGRpbiwgMCwgMCwgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBmaWxlc19naXZlbiA9IHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yICg7IG9wdGluZCA8IGFyZ2M7ICsrb3B0aW5kKQotCXsKLQkgIGlmIChzdHJjbXAgKGFyZ3Zbb3B0aW5kXSwgIi0iKSA9PSAwKQotCSAgICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlc19naXZlbiA9IHRydWU7Ci0JICAgICAgZXhpdF9zdGF0dXMgfD0gKHN0cmluZ3NfZmlsZSAoYXJndltvcHRpbmRdKSA9PSBmYWxzZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmaWxlc19naXZlbiA9PSBmYWxzZSkKLSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQotICByZXR1cm4gKGV4aXRfc3RhdHVzKTsKLX0KLQwKLS8qIFNjYW4gc2VjdGlvbiBTRUNUIG9mIHRoZSBmaWxlIEFCRkQsIHdob3NlIHByaW50YWJsZSBuYW1lIGlzIEZJTEUuCi0gICBJZiBpdCBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLAotICAgc2V0IGBnb3RfYV9zZWN0aW9uJyBhbmQgcHJpbnQgdGhlIHN0cmluZ3MgaW4gaXQuICAqLwotCi1zdGF0aWMgdm9pZAotc3RyaW5nc19hX3NlY3Rpb24gKGFiZmQsIHNlY3QsIGZpbGVhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Q7Ci0gICAgIFBUUiBmaWxlYXJnOwotewotICBjb25zdCBjaGFyICpmaWxlID0gKGNvbnN0IGNoYXIgKikgZmlsZWFyZzsKLQotICBpZiAoKHNlY3QtPmZsYWdzICYgREFUQV9GTEFHUykgPT0gREFUQV9GTEFHUykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN6ID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KTsKLSAgICAgIFBUUiBtZW0gPSB4bWFsbG9jIChzeik7Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0LCBtZW0sIChmaWxlX3B0cikgMCwgc3opKQotCXsKLQkgIGdvdF9hX3NlY3Rpb24gPSB0cnVlOwotCSAgcHJpbnRfc3RyaW5ncyAoZmlsZSwgKEZJTEUgKikgTlVMTCwgc2VjdC0+ZmlsZXBvcywgMCwgc3osIG1lbSk7Ci0JfQotICAgICAgZnJlZSAobWVtKTsKLSAgICB9Ci19Ci0KLS8qIFNjYW4gYWxsIG9mIHRoZSBzZWN0aW9ucyBpbiBGSUxFLCBhbmQgcHJpbnQgdGhlIHN0cmluZ3MKLSAgIGluIHRoZSBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24ocykuCi0KLSAgIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsCi0gICBmYWxzZSBpZiBub3QgKHN1Y2ggYXMgaWYgRklMRSBpcyBub3QgYW4gb2JqZWN0IGZpbGUpLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0cmluZ3Nfb2JqZWN0X2ZpbGUgKGZpbGUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIGJmZCAqYWJmZCA9IGJmZF9vcGVuciAoZmlsZSwgdGFyZ2V0KTsKLQotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRyZWF0IHRoZSBmaWxlIGFzIGEgbm9uLW9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBjYWxsIGlzIG1haW5seSBmb3IgaXRzIHNpZGUgZWZmZWN0IG9mIHJlYWRpbmcgaW4gdGhlIHNlY3Rpb25zLgotICAgICBXZSBmb2xsb3cgdGhlIHRyYWRpdGlvbmFsIGJlaGF2aW9yIG9mIGBzdHJpbmdzJyBpbiB0aGF0IHdlIGRvbid0Ci0gICAgIGNvbXBsYWluIGlmIHdlIGRvbid0IHJlY29nbml6ZSBhIGZpbGUgdG8gYmUgYW4gb2JqZWN0IGZpbGUuICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZ290X2Ffc2VjdGlvbiA9IGZhbHNlOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIHN0cmluZ3NfYV9zZWN0aW9uLCAoUFRSKSBmaWxlKTsKLQotICBpZiAoIWJmZF9jbG9zZSAoYWJmZCkpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGdvdF9hX3NlY3Rpb247Ci19Ci0KLS8qIFByaW50IHRoZSBzdHJpbmdzIGluIEZJTEUuICBSZXR1cm4gdHJ1ZSBpZiBvaywgZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0cmluZ3NfZmlsZSAoZmlsZSkKLSAgICAgY2hhciAqZmlsZTsKLXsKLSAgLyogSWYgd2Ugd2VyZW4ndCB0b2xkIHRvIHNjYW4gdGhlIHdob2xlIGZpbGUsCi0gICAgIHRyeSB0byBvcGVuIGl0IGFzIGFuIG9iamVjdCBmaWxlIGFuZCBvbmx5IGxvb2sgYXQKLSAgICAgaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9ucy4gIElmIHRoYXQgZmFpbHMsIGZhbGwgYmFjayB0byB0aGUKLSAgICAgd2hvbGUgZmlsZS4gICovCi0gIGlmICghZGF0YXNlY3Rpb25fb25seSB8fCAhc3RyaW5nc19vYmplY3RfZmlsZSAoZmlsZSkpCi0gICAgewotICAgICAgRklMRSAqc3RyZWFtOwotCi0gICAgICBzdHJlYW0gPSBmb3BlbiAoZmlsZSwgInJiIik7Ci0gICAgICAvKiBOb3QgYWxsIHN5c3RlbXMgcGVybWl0ICJyYiIsIHNvIHRyeSAiciIgaWYgaXQgZmFpbGVkLiAgKi8KLSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQlzdHJlYW0gPSBmb3BlbiAoZmlsZSwgInIiKTsKLSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgIHBlcnJvciAoZmlsZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBwcmludF9zdHJpbmdzIChmaWxlLCBzdHJlYW0sIChmaWxlX3B0cikgMCwgMCwgMCwgKGNoYXIgKikgMCk7Ci0KLSAgICAgIGlmIChmY2xvc2UgKHN0cmVhbSkgPT0gRU9GKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgcGVycm9yIChmaWxlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRmluZCB0aGUgc3RyaW5ncyBpbiBmaWxlIEZJTEVOQU1FLCByZWFkIGZyb20gU1RSRUFNLgotICAgQXNzdW1lIHRoYXQgU1RSRUFNIGlzIHBvc2l0aW9uZWQgc28gdGhhdCB0aGUgbmV4dCBieXRlIHJlYWQKLSAgIGlzIGF0IGFkZHJlc3MgQUREUkVTUyBpbiB0aGUgZmlsZS4KLSAgIFN0b3AgcmVhZGluZyBhdCBhZGRyZXNzIFNUT1BfUE9JTlQgaW4gdGhlIGZpbGUsIGlmIG5vbnplcm8uCi0KLSAgIElmIFNUUkVBTSBpcyBOVUxMLCBkbyBub3QgcmVhZCBmcm9tIGl0LgotICAgVGhlIGNhbGxlciBjYW4gc3VwcGx5IGEgYnVmZmVyIG9mIGNoYXJhY3RlcnMKLSAgIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGRhdGEgaW4gU1RSRUFNLgotICAgTUFHSUMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbmQKLSAgIE1BR0lDQ09VTlQgaXMgaG93IG1hbnkgY2hhcmFjdGVycyBhcmUgaW4gaXQuCi0gICBUaG9zZSBjaGFyYWN0ZXJzIGNvbWUgYXQgYWRkcmVzcyBBRERSRVNTIGFuZCB0aGUgZGF0YSBpbiBTVFJFQU0gZm9sbG93LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N0cmluZ3MgKGZpbGVuYW1lLCBzdHJlYW0sIGFkZHJlc3MsIHN0b3BfcG9pbnQsIG1hZ2ljY291bnQsIG1hZ2ljKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBmaWxlX3B0ciBhZGRyZXNzOwotICAgICBpbnQgc3RvcF9wb2ludDsKLSAgICAgaW50IG1hZ2ljY291bnQ7Ci0gICAgIGNoYXIgKm1hZ2ljOwotewotICBjaGFyICpidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJpbmdfbWluICsgMSk7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgZmlsZV9wdHIgc3RhcnQ7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBjOwotCi0gICAgICAvKiBTZWUgaWYgdGhlIG5leHQgYHN0cmluZ19taW4nIGNoYXJzIGFyZSBhbGwgZ3JhcGhpYyBjaGFycy4gICovCi0gICAgdHJ5bGluZToKLSAgICAgIGlmIChzdG9wX3BvaW50ICYmIGFkZHJlc3MgPj0gc3RvcF9wb2ludCkKLQlicmVhazsKLSAgICAgIHN0YXJ0ID0gYWRkcmVzczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdfbWluOyBpKyspCi0JewotCSAgaWYgKG1hZ2ljY291bnQpCi0JICAgIHsKLQkgICAgICBtYWdpY2NvdW50LS07Ci0JICAgICAgYyA9ICptYWdpYysrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0JCXJldHVybjsKLQkgICAgICBjID0gZ2V0YyAoc3RyZWFtKTsKLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXJldHVybjsKLQkgICAgfQotCSAgYWRkcmVzcysrOwotCSAgaWYgKCFpc2dyYXBoaWMgKGMpKQotCSAgICAvKiBGb3VuZCBhIG5vbi1ncmFwaGljLiAgVHJ5IGFnYWluIHN0YXJ0aW5nIHdpdGggbmV4dCBjaGFyLiAgKi8KLQkgICAgZ290byB0cnlsaW5lOwotCSAgYnVmW2ldID0gYzsKLQl9Ci0KLSAgICAgIC8qIFdlIGZvdW5kIGEgcnVuIG9mIGBzdHJpbmdfbWluJyBncmFwaGljIGNoYXJhY3RlcnMuICBQcmludCB1cAotICAgICAgICAgdG8gdGhlIG5leHQgbm9uLWdyYXBoaWMgY2hhcmFjdGVyLiAgKi8KLQotICAgICAgaWYgKHByaW50X2ZpbGVuYW1lcykKLQlwcmludGYgKCIlczogIiwgZmlsZW5hbWUpOwotICAgICAgaWYgKHByaW50X2FkZHJlc3NlcykKLQlzd2l0Y2ggKGFkZHJlc3NfcmFkaXgpCi0JICB7Ci0JICBjYXNlIDg6Ci0JICAgIHByaW50ZiAoIiU3bG8gIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMTA6Ci0JICAgIHByaW50ZiAoIiU3bGQgIiwgKGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMTY6Ci0JICAgIHByaW50ZiAoIiU3bHggIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLSAgICAgIGJ1ZltpXSA9ICdcMCc7Ci0gICAgICBmcHV0cyAoYnVmLCBzdGRvdXQpOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAobWFnaWNjb3VudCkKLQkgICAgewotCSAgICAgIG1hZ2ljY291bnQtLTsKLQkgICAgICBjID0gKm1hZ2ljKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgICAgYyA9IGdldGMgKHN0cmVhbSk7Ci0JICAgICAgaWYgKGMgPT0gRU9GKQotCQlicmVhazsKLQkgICAgfQotCSAgYWRkcmVzcysrOwotCSAgaWYgKCEgaXNncmFwaGljIChjKSkKLQkgICAgYnJlYWs7Ci0JICBwdXRjaGFyIChjKTsKLQl9Ci0KLSAgICAgIHB1dGNoYXIgKCdcbicpOwotICAgIH0KLX0KLQwKLS8qIFBhcnNlIHN0cmluZyBTIGFzIGFuIGludGVnZXIsIHVzaW5nIGRlY2ltYWwgcmFkaXggYnkgZGVmYXVsdCwKLSAgIGJ1dCBhbGxvd2luZyBvY3RhbCBhbmQgaGV4IG51bWJlcnMgYXMgaW4gQy4gICovCi0KLXN0YXRpYyBpbnQKLWludGVnZXJfYXJnIChzKQotICAgICBjaGFyICpzOwotewotICBpbnQgdmFsdWU7Ci0gIGludCByYWRpeCA9IDEwOwotICBjaGFyICpwID0gczsKLSAgaW50IGM7Ci0KLSAgaWYgKCpwICE9ICcwJykKLSAgICByYWRpeCA9IDEwOwotICBlbHNlIGlmICgqKytwID09ICd4JykKLSAgICB7Ci0gICAgICByYWRpeCA9IDE2OwotICAgICAgcCsrOwotICAgIH0KLSAgZWxzZQotICAgIHJhZGl4ID0gODsKLQotICB2YWx1ZSA9IDA7Ci0gIHdoaWxlICgoKGMgPSAqcCsrKSA+PSAnMCcgJiYgYyA8PSAnOScpCi0JIHx8IChyYWRpeCA9PSAxNiAmJiAoYyAmIH40MCkgPj0gJ0EnICYmIChjICYgfjQwKSA8PSAnWicpKQotICAgIHsKLSAgICAgIHZhbHVlICo9IHJhZGl4OwotICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCXZhbHVlICs9IGMgLSAnMCc7Ci0gICAgICBlbHNlCi0JdmFsdWUgKz0gKGMgJiB+NDApIC0gJ0EnOwotICAgIH0KLQotICBpZiAoYyA9PSAnYicpCi0gICAgdmFsdWUgKj0gNTEyOwotICBlbHNlIGlmIChjID09ICdCJykKLSAgICB2YWx1ZSAqPSAxMDI0OwotICBlbHNlCi0gICAgcC0tOwotCi0gIGlmICgqcCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnZhbGlkIGludGVnZXIgYXJndW1lbnQgJXNcbiIpLCBwcm9ncmFtX25hbWUsIHMpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1hZm92XSBbLW4gbWluLWxlbl0gWy1taW4tbGVuXSBbLXQge28seCxkfV0gWy1dXG5cCi0gICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPW1pbi1sZW5dIFstLXJhZGl4PXtvLHgsZH1dXG5cCi0gICAgICAgWy0tdGFyZ2V0PWJmZG5hbWVdIFstLWhlbHBdIFstLXZlcnNpb25dIGZpbGUuLi5cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpcC4xIGIvYmludXRpbHMvc3RyaXAuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4ODE3ZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdHJpcC4xCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBzdHJpcCAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1zdHJpcCBcLSBEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBzdHJpcAotLlJCICJbXHwiIFwtRlwgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLXRhcmdldD1cZkliZmRuYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1JXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1PXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUCAiXHxdIgotLlJCICJbXHwiIFwtUlwgXGZJc2VjdGlvbm5hbWVcZlJcIHxcIFxmQlwtXC1yZW1vdmVcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWVcZlAgIlx8XSIKLS5SQiAiW1x8IiBcLXNcZlJcIHxcIFxmQlwtXC1zdHJpcFwtYWxsICJcfF0iCi0uUkIgIltcfCIgXC1TXGZSXCB8XCBcZkJcLWdcZlJcIHxcIFxmQlwtXC1zdHJpcFwtZGVidWcgIlx8XSIKLS5SQiAiW1x8IiBcLVwtc3RyaXBcLXVubmVlZGVkXGZSICJcfF0iCi0uUkIgIltcfCIgXC14XGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtYWxsICJcfF0iCi0uUkIgIltcfCIgXC1YXGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtbG9jYWxzICJcfF0iCi0uUkIgIltcfCIgXC1LXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1OXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1vXCBcZklmaWxlXGZcUiAiXHxdIgotLlJCICJbXHwiIFwtcFxmUlwgfFwgXGZCXC1cLXByZXNlcnZlXC1kYXRlcyAiXHxdIgotLlJCICJbXHwiIFwtdlxmUlwgfFwgXGZCXC1cLXZlcmJvc2UgIlx8XSIKLS5SQiAiW1x8IiBcLVZcZlJcIHxcIFxmQlwtXC12ZXJzaW9uICJcfF0iCi0uUkIgIltcfCIgXC1WXGZSXCB8XCBcZkJcLVwtaGVscCAiXHxdIgotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC4KLQotLlNIIERFU0NSSVBUSU9OCi1HTlUKLS5CIHN0cmlwCi1kaXNjYXJkcyBhbGwgc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZXMKLS5JUiBvYmpmaWxlIC4KLVRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyBtYXkgaW5jbHVkZSBhcmNoaXZlcy4KLUF0IGxlYXN0IG9uZSBvYmplY3QgZmlsZSBtdXN0IGJlIGdpdmVuLgotCi0uUAotLkIgc3RyaXAKLW1vZGlmaWVzIHRoZSBmaWxlcyBuYW1lZCBpbiBpdHMgYXJndW1lbnQsCi1yYXRoZXIgdGhhbiB3cml0aW5nIG1vZGlmaWVkIGNvcGllcyB1bmRlciBkaWZmZXJlbnQgbmFtZXMuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CICJcLUYgXGZJYmZkbmFtZSIKLS5UUAotLkIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIKLVRyZWF0IHRoZSBvcmlnaW5hbCBcZklvYmpmaWxlXGZQIGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKLWNvZGUgZm9ybWF0IFxmSWJmZG5hbWVcZlAsIGFuZCByZXdyaXRlIGl0IGluIHRoZSBzYW1lIGZvcm1hdC4KLQotLlRQCi0uQiBcLVwtaGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIHN0cmlwCi1hbmQgZXhpdC4KLQotLlRQCi0uQiAiXC1JIFxmSWJmZG5hbWUKLS5UUAotLkIgIlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUiCi1UcmVhdCB0aGUgb3JpZ2luYWwgXGZJb2JqZmlsZVxmUCBhcyBhIGZpbGUgd2l0aCB0aGUgb2JqZWN0Ci1jb2RlIGZvcm1hdCBcZkliZmRuYW1lXGZQLgotCi0uVFAKLS5CICJcLU8gXGZJYmZkbmFtZVxmUCIKLS5UUAotLkIgIlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lIgotUmVwbGFjZSBcZklvYmpmaWxlXGZQIHdpdGggYSBmaWxlIGluIHRoZSBvdXRwdXQgZm9ybWF0IFxmSWJmZG5hbWVcZlAuCi0KLS5UUAotLkIgIlwtUiBcZklzZWN0aW9ubmFtZVxmUCIKLS5UUAotLkIgIlwtXC1yZW1vdmVcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWUiCi1SZW1vdmUgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlCi10aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZQotb2JqZWN0IGZpbGUgdW51c2FibGUuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1zdHJpcFwtYWxsCi1SZW1vdmUgYWxsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1TCi0uVFAKLS5CIFwtZwotLlRQCi0uQiBcLVwtc3RyaXBcLWRlYnVnCi1SZW1vdmUgZGVidWdnaW5nIHN5bWJvbHMgb25seS4KLQotLlRQCi0uQiBcLVwtc3RyaXBcLXVubmVlZGVkCi1TdHJpcCBhbGwgc3ltYm9scyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciByZWxvY2F0aW9uIHByb2Nlc3NpbmcuCi0KLS5UUAotLkIgXC1OIFxmSXN5bWJvbG5hbWVcZlIKLS5UUAotLkIgXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotUmVtb3ZlIHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLCBhbmQgbWF5IGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgc3RyaXAKLW9wdGlvbnMuCi0KLS5UUAotLkIgXC1vIFxmSWZpbGVcZlIKLVB1dCB0aGUgc3RyaXBwZWQgb3V0cHV0IGluIFxmSWZpbGVcZlIsIHJhdGhlciB0aGFuIHJlcGxhY2luZyB0aGUKLWV4aXN0aW5nIGZpbGUuICBXaGVuIHRoaXMgYXJndW1lbnQgaXMgdXNlZCwgb25seSBvbmUgXGZJb2JqZmlsZVxmUgotYXJndW1lbnQgbWF5IGJlIHNwZWNpZmllZC4KLQotLlRQCi0uQiBcLXAKLS5UUAotLkIgXC1cLXByZXNlcnZlLWRhdGVzCi1QcmVzZXJ2ZSB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIGZpbGUuCi0KLS5UUAotLkIgXC14Ci0uVFAKLS5CIFwtXC1kaXNjYXJkXC1hbGwKLVJlbW92ZSBub24tZ2xvYmFsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1YCi0uVFAKLS5CIFwtXC1kaXNjYXJkXC1sb2NhbHMKLVJlbW92ZSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgc3ltYm9scy4KLShUaGVzZSB1c3VhbGx5IHN0YXJ0IHdpdGggYGBMJycgb3IgYGAuJycuKQotCi0uVFAKLS5CIFwtSyBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLUNvcHkgb25seSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotLlRQCi0uQiBcLU4gXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotRG8gbm90IGNvcHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGFuZCBtYXkgYmUgY29tYmluZWQgd2l0aCBzdHJpcCBvcHRpb25zCi1vdGhlciB0aGFuIFxmQlwtS1xmUi4KLQotLlRQCi0uQiBcLXYKLS5UUAotLkIgXC1cLXZlcmJvc2UKLVZlcmJvc2Ugb3V0cHV0OiBsaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWQuICBJbiB0aGUgY2FzZSBvZgotYXJjaGl2ZXMsCi0uQiAic3RyaXAgXC12IgotbGlzdHMgYWxsIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUuCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGZCc3RyaXBcZlAgYW5kIGV4aXQuCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIgCi1lbnRyeSBpbiAKLS5CUiBpbmZvIDsKLS5JUiAiVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzIiAsCi1Sb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2R1bXAuYyBiL2JpbnV0aWxzL3N5c2R1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyMWU4Yy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTAgKzAsMCBAQAotLyogU3lzcm9mZiBvYmplY3QgZm9ybWF0IGR1bXBlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPi4KLQotIFRoaXMgcHJvZ3JhbSByZWFkcyBhIFNZU1JPRkYgb2JqZWN0IGZpbGUgYW5kIHByaW50cyBpdCBpbiBhbgotIGFsbW9zdCBodW1hbiByZWFkYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgInN5c3JvZmYuaCIKLQotI2RlZmluZSBQUk9HUkFNX1ZFUlNJT04gIjEuMCIKLQotc3RhdGljIGludCBkdW1wID0gMTsKLXN0YXRpYyBpbnQgc2VnbWVudGVkX3A7Ci1zdGF0aWMgaW50IGNvZGU7Ci1zdGF0aWMgaW50IGFkZHJzaXplID0gNDsKLXN0YXRpYyBGSUxFICpmaWxlOwotCi1jaGFyICoKLWdldENIQVJTIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG1heDsKLXsKLSAgaW50IG9jID0gKmlkeCAvIDg7Ci0gIGNoYXIgKnI7Ci0gIGludCBiID0gc2l6ZTsKLSAgaWYgKGIgPj0gbWF4KQotICAgIHsKLSAgICAgIHJldHVybiAiKnVuZGVmaW5lZCoiOwotICAgIH0KLQotICBpZiAoYiA9PSAwKQotICAgIHsKLSAgICAgIC8qIEdvdCB0byB3b3JrIG91dCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgZnJvbSBzZWxmICovCi0gICAgICBiID0gcHRyW29jKytdOwotICAgICAgKCppZHgpICs9IDg7Ci0gICAgfQotCi0gICppZHggKz0gYiAqIDg7Ci0gIHIgPSB4Y2FsbG9jIChiICsgMSwgMSk7Ci0gIG1lbWNweSAociwgcHRyICsgb2MsIGIpOwotICByW2JdID0gMDsKLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaCAocHRyLCBzaXplKQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLSAgaW50IGo7Ci0gIGludCBzcGFuID0gMTY7Ci0KLSAgcHJpbnRmICgiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IHNwYW4pCi0gICAgewotICAgICAgZm9yIChqID0gMDsgaiA8IHNwYW47IGorKykKLQl7Ci0JICBpZiAoaiArIGkgPCBzaXplKSAKLQkgICAgcHJpbnRmICgiJTAyeCAiLCBwdHJbaSArIGpdKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYgKCIgICAiKTsKLQl9Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBzcGFuICYmIGogKyBpIDwgc2l6ZTsgaisrKQotCXsKLQkgIGludCBjID0gcHRyW2kgKyBqXTsKLQkgIGlmIChjIDwgMzIgfHwgYyA+IDEyNykKLQkgICAgYyA9ICcuJzsKLQkgIHByaW50ZiAoIiVjIiwgYyk7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLWludAotZmlsbHVwIChwdHIpCi0gICAgIGNoYXIgKnB0cjsKLXsKLSAgaW50IHNpemU7Ci0gIGludCBzdW07Ci0gIGludCBpOwotICBzaXplID0gZ2V0YyAoZmlsZSkgLSAyOwotICBmcmVhZCAocHRyLCAxLCBzaXplLCBmaWxlKTsKLSAgc3VtID0gY29kZSArIHNpemUgKyAyOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN1bSArPSBwdHJbaV07Ci0gICAgfQotCi0gIGlmICgoc3VtICYgMHhmZikgIT0gMHhmZikKLSAgICB7Ci0gICAgICBwcmludGYgKCJTVU0gSVMgJXhcbiIsIHN1bSk7Ci0gICAgfQotICBpZiAoZHVtcCkKLSAgICBkaCAocHRyLCBzaXplKTsKLQotICByZXR1cm4gc2l6ZSAtIDE7Ci19Ci0KLWJhcnJheQotZ2V0QkFSUkFZIChwdHIsIGlkeCwgZHNpemUsIG1heCkKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IGRzaXplOwotICAgICBpbnQgbWF4OwotewotICBiYXJyYXkgcmVzOwotICBpbnQgaTsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLSAgaW50IHNpemUgPSBwdHJbYnl0ZSsrXTsKLSAgcmVzLmxlbiA9IHNpemU7Ci0gIHJlcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoc2l6ZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgcmVzLmRhdGFbaV0gPSBwdHJbYnl0ZSsrXTsKLSAgICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLWludAotZ2V0SU5UIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG1heDsKLXsKLSAgaW50IG4gPSAwOwotICBpbnQgYnl0ZSA9ICppZHggLyA4OwotCi0gIGlmIChieXRlID49IG1heCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaXplID09IC0yKQotICAgIHNpemUgPSBhZGRyc2l6ZTsKLSAgaWYgKHNpemUgPT0gLTEpCi0gICAgc2l6ZSA9IDA7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSAxOgotICAgICAgbiA9IChwdHJbYnl0ZV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbiA9IChwdHJbYnl0ZSArIDBdIDw8IDgpICsgcHRyW2J5dGUgKyAxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG4gPSAocHRyW2J5dGUgKyAwXSA8PCAyNCkgKyAocHRyW2J5dGUgKyAxXSA8PCAxNikgKyAocHRyW2J5dGUgKyAyXSA8PCA4KSArIChwdHJbYnl0ZSArIDNdKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gICppZHggKz0gc2l6ZSAqIDg7Ci0gIHJldHVybiBuOwotfQotCi1pbnQKLWdldEJJVFMgKHB0ciwgaWR4LCBzaXplLCBtYXgpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplLCBtYXg7Ci17Ci0gIGludCBieXRlID0gKmlkeCAvIDg7Ci0gIGludCBiaXQgPSAqaWR4ICUgODsKLQotICBpZiAoYnl0ZSA+PSBtYXgpCi0gICAgcmV0dXJuIDA7Ci0KLSAgKmlkeCArPSBzaXplOwotCi0gIHJldHVybiAocHRyW2J5dGVdID4+ICg4IC0gYml0IC0gc2l6ZSkpICYgKCgxIDw8IHNpemUpIC0gMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pdGhlYWRlciAobmFtZSwgY29kZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHByaW50ZiAoIlxuJXMgMHglMDJ4XG4iLCBuYW1lLCBjb2RlKTsKLX0KLQotc3RhdGljIGludCBpbmRlbnQ7Ci1zdGF0aWMgdm9pZAotcCAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoInwgIik7Ci0gICAgfQotICBwcmludGYgKCI+ICIpOwotfQotCi1zdGF0aWMgdm9pZAotdGFib3V0ICgpCi17Ci0gIHAgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYmFycmF5ICh5KQotICAgICBiYXJyYXkgKnk7Ci17Ci0gIGludCB4OwotICBwcmludGYgKCIlZCAoIiwgeS0+bGVuKTsKLSAgZm9yICh4ID0gMDsgeCA8IHktPmxlbjsgeCsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiglMDJ4ICVjKSIsIHktPmRhdGFbeF0sIGlzcHJpbnQgKHktPmRhdGFbeF0pID8geS0+ZGF0YVt4XSA6ICcuJyk7Ci0gICAgfQotICBwcmludGYgKCIpXG4iKTsKLX0KLQotI2RlZmluZSBTWVNST0ZGX1BSSU5UCi0jZGVmaW5lIFNZU1JPRkZfU1dBUF9JTgotCi0jaW5jbHVkZSAic3lzcm9mZi5jIgotCi0vKiAKLSAqIEZJWE1FOiBzeXNpbmZvLCB3aGljaCBnZW5lcmF0ZXMgc3lzcm9mZi5bY2hdIGZyb20gc3lzcm9mZi5pbmZvLCBjYW4ndAotICogaGFjayB0aGUgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ciBibG9jaywgd2hpY2ggaGFzIG5vIGNvbnRlbnRzLiAgU28gd2UKLSAqIGltcGxlbWVudCBvdXIgb3duIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBpbiBhbmQgcHJpbnRpbmcgb3V0IHRoZSB0cgotICogYmxvY2suCi0gKi8KLQotI2RlZmluZSBJVF90cl9DT0RFCTB4N2YKLXZvaWQKLXN5c3JvZmZfc3dhcF90cl9pbigpCi17Ci0JY2hhciByYXdbMjU1XTsKLQotCW1lbXNldChyYXcsIDAsIDI1NSk7Ci0JZmlsbHVwKHJhdyk7Ci19Ci0KLXZvaWQKLXN5c3JvZmZfcHJpbnRfdHJfb3V0KCkKLXsKLQlpdGhlYWRlcigidHIiLCBJVF90cl9DT0RFKTsKLX0KLQotc3RhdGljIGludAotZ2V0b25lICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IGMgPSBnZXRjIChmaWxlKTsKLSAgY29kZSA9IGM7Ci0KLSAgaWYgKChjICYgMHg3ZikgIT0gdHlwZSkKLSAgICB7Ci0gICAgICB1bmdldGMgKGMsIGZpbGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHN3aXRjaCAoYyAmIDB4N2YpCi0gICAgewotICAgIGNhc2UgSVRfY3NfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfY3MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2NzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfY3Nfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kbG5fQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGxuIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kbG5faW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kbG5fb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9oZF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9oZCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfaGRfaW4gKCZkdW1teSk7Ci0JYWRkcnNpemUgPSBkdW1teS5hZmw7Ci0Jc3lzcm9mZl9wcmludF9oZF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rhcl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kYXIgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rhcl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rhcl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RzeV9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc3kgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RzeV9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RzeV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RmcF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZnAgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RmcF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RmcF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rzb19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc28gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rzb19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rzb19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RwdF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kcHQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RwdF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RwdF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rlbl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZW4gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rlbl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rlbl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RidF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RidF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RidF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R0eV9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdHkgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R0eV9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R0eV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3VuX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3VuIGR1bW15OwotCXN5c3JvZmZfc3dhcF91bl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3VuX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfc2NfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfc2MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3NjX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfc2Nfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9lcl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9lciBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZXJfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9lcl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2VkX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2VkIGR1bW15OwotCXN5c3JvZmZfc3dhcF9lZF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2VkX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfc2hfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfc2ggZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3NoX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfc2hfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9vYl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9vYiBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfb2JfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9vYl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3JsX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3JsIGR1bW15OwotCXN5c3JvZmZfc3dhcF9ybF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3JsX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHVfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHUgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1X2luICgmZHVtbXkpOwotCi0Jc3lzcm9mZl9wcmludF9kdV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R1c19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdXMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1c19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R1c19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R1bF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdWwgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1bF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R1bF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rzc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc3MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rzc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rzc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2hzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2hzIGR1bW15OwotCXN5c3JvZmZfc3dhcF9oc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2hzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHBzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RwcyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHBzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHBzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfdHJfQ09ERToKLSAgICAgIHsKLQlzeXNyb2ZmX3N3YXBfdHJfaW4gKCk7Ci0Jc3lzcm9mZl9wcmludF90cl9vdXQgKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rkc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZHMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rkc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rkc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRmICgiR09UIEEgJXhcbiIsIGMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1vcHQgKHgpCi0gICAgIGludCB4OwotewotICByZXR1cm4gZ2V0b25lICh4KTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi11bml0X2luZm9fbGlzdCAoKQotewotICB3aGlsZSAob3B0IChJVF91bl9DT0RFKSkKLSAgICB7Ci0gICAgICBnZXRvbmUgKElUX3VzX0NPREUpOwotCi0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9zY19DT0RFKSkKLQlnZXRvbmUgKElUX3NzX0NPREUpOwotCi0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9lcl9DT0RFKSkKLQk7Ci0KLSAgICAgIHdoaWxlIChnZXRvbmUgKElUX2VkX0NPREUpKQotCTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamVjdF9ib2R5X2xpc3QgKCkKLXsKLSAgd2hpbGUgKGdldG9uZSAoSVRfc2hfQ09ERSkpCi0gICAgewotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfb2JfQ09ERSkpCi0JOwotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfcmxfQ09ERSkpCi0JOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1tdXN0ICh4KQotICAgICBpbnQgeDsKLXsKLSAgaWYgKCFnZXRvbmUgKHgpKQotICAgIHsKLSAgICAgIHByaW50ZiAoIldBTlRFRCAleCEhXG4iLCB4KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi10YWIgKGksIHMpCi0gICAgIGludCBpOwotICAgICBjaGFyICpzOwotewotICBpbmRlbnQgKz0gaTsKLSAgaWYgKHMpCi0gICAgewotICAgICAgcCAoKTsKLSAgICAgIHByaW50ZiAocyk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZGVyaXZlZF90eXBlICgpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9zeW1ib2xfaW5mbyAoKQotewotICB0YWIgKDEsICJTWU1CT0wgSU5GTyIpOwotICB3aGlsZSAob3B0IChJVF9kc3lfQ09ERSkpCi0gICAgewotICAgICAgaWYgKG9wdCAoSVRfZHR5X0NPREUpKQotCXsKLQkgIG11c3QgKElUX2RidF9DT0RFKTsKLQkgIGRlcml2ZWRfdHlwZSAoKTsKLQkgIG11c3QgKElUX2R0eV9DT0RFKTsKLQl9Ci0gICAgfQotICB0YWIgKC0xLCAiIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZXJpdmVkX3R5cGUgKCkKLXsKLSAgdGFiICgxLCAiREVSSVZFRCBUWVBFIik7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChvcHQgKElUX2RwcF9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZHBwX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGZwX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZnBfQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kZW5fQ09ERSkpCi0JewotCSAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKLQkgIG11c3QgKElUX2Rlbl9DT0RFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2Rlbl9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZGVuX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGRzX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZHNfQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kYXJfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZHB0X0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2R1bF9DT0RFKSkKLQl7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kc2VfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZG90X0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotCi0gIHRhYiAoLTEsICIiKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9ncmFtX3N0cnVjdHVyZSAoKQotewotICB0YWIgKDEsICJQUk9HUkFNIFNUUlVDVFVSRSIpOwotICB3aGlsZSAob3B0IChJVF9kcHNfQ09ERSkpCi0gICAgewotICAgICAgbXVzdCAoSVRfZHNvX0NPREUpOwotICAgICAgb3B0IChJVF9kc3NfQ09ERSk7Ci0gICAgICBkdW1wX3N5bWJvbF9pbmZvICgpOwotICAgICAgbXVzdCAoSVRfZHBzX0NPREUpOwotICAgIH0KLSAgdGFiICgtMSwgIiIpOwotfQotCi0jZW5kaWYKLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19saXN0ICgpCi17Ci0gIHRhYiAoMSwgIkRFQlVHIExJU1QiKTsKLQotICBtdXN0IChJVF9kdV9DT0RFKTsKLSAgb3B0IChJVF9kdXNfQ09ERSk7Ci0gIHByb2dyYW1fc3RydWN0dXJlICgpOwotICBtdXN0IChJVF9kbG5fQ09ERSk7Ci0KLSAgdGFiICgtMSwgIiIpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLW1vZHVsZSAoKQotewotICBpbnQgYyA9IDA7Ci0gIGludCBsID0gMDsKLQotICB0YWIgKDEsICJNT0RVTEUqKipcbiIpOwotCi0gIGRvCi0gICAgewotICAgICAgYyA9IGdldGMgKGZpbGUpOwotICAgICAgdW5nZXRjIChjLCBmaWxlKTsKLQotICAgICAgYyAmPSAweDdmOwotICAgIH0KLSAgd2hpbGUgKGdldG9uZSAoYykgJiYgYyAhPSBJVF90cl9DT0RFKTsKLQotI2lmIDAKLSAgbXVzdCAoSVRfY3NfQ09ERSk7Ci0gIG11c3QgKElUX2hkX0NPREUpOwotICBvcHQgKElUX2hzX0NPREUpOwotCi0gIHVuaXRfaW5mb19saXN0ICgpOwotICBvYmplY3RfYm9keV9saXN0ICgpOwotICBkZWJ1Z19saXN0ICgpOwotCi0gIG11c3QgKElUX3RyX0NPREUpOwotI2VuZGlmCi0gIHRhYiAoLTEsICIiKTsKLQotICBjID0gZ2V0YyAoZmlsZSk7Ci0gIHdoaWxlIChjICE9IEVPRikKLSAgICB7Ci0gICAgICBwcmludGYgKCIlMDJ4ICIsIGMpOwotICAgICAgbCsrOwotICAgICAgaWYgKGwgPT0gMzIpCi0JewotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGwgPSAwOwotCX0KLSAgICAgIGMgPSBnZXRjIChmaWxlKTsKLSAgICB9Ci19Ci0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiVXNhZ2U6ICVzIFstaFZdIGluLWZpbGVcbiIpLCBwcm9ncmFtX25hbWUpOwotICBleGl0IChzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgY2hhciAqaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIGludCBvcHQ7Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLSAgewotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgMCwgMH0KLSAgfTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiaFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgTlVMTCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgJ1YnOgotCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKLQkgIGV4aXQgKDApOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JfQotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtYXkgYmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLSAgaWYgKG9wdGluZCA8IGFjKQotICAgIHsKLSAgICAgIGlucHV0X2ZpbGUgPSBhdltvcHRpbmRdOwotICAgIH0KLQotICBpZiAoIWlucHV0X2ZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGZpbGUgPSBmb3BlbiAoaW5wdXRfZmlsZSwgRk9QRU5fUkIpOwotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgaW5wdXRfZmlsZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgbW9kdWxlICgpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2luZm8ueSBiL2JpbnV0aWxzL3N5c2luZm8ueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhODczNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNpbmZvLnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotJXsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1leHRlcm4gY2hhciAqd29yZDsKLWV4dGVybiBjaGFyIHdyaXRlY29kZTsKLWV4dGVybiBpbnQgbnVtYmVyOwotZXh0ZXJuIGludCB1bml0OwotY2hhciBuaWNlX25hbWVbMTAwMF07Ci1jaGFyICppdDsKLWludCBzb2ZhcjsKLWludCB3aWR0aDsKLWludCBjb2RlOwotY2hhciAqIHJlcGVhdDsKLWNoYXIgKm9sZHJlcGVhdDsKLWNoYXIgKm5hbWU7Ci1pbnQgcmRlcHRoOwotY2hhciAqbG9vcCBbXSA9IHsiIiwibiIsIm0iLCIvKkJBRCovIn07Ci1jaGFyICpuYW1lc1tdID0geyIgIiwiW25dIiwiW25dW21dIn07Ci1jaGFyICpwbmFtZXNbXT0geyIiLCIqIiwiKioifTsKLSV9Ci0KLQotJXVuaW9uIHsKLSBpbnQgaTsKLSBjaGFyICpzOwotfSAKLSV0b2tlbiBDT05ECi0ldG9rZW4gUkVQRUFUCi0ldG9rZW4gJygnICcpJwotJXRva2VuIDxzPiBUWVBFCi0ldG9rZW4gPHM+IE5BTUUKLSV0b2tlbiA8aT4gTlVNQkVSIFVOSVQKLSV0eXBlIDxpPiBhdHRyX3NpemUgCi0ldHlwZSA8cz4gYXR0cl9kZXNjIGF0dHJfaWQgYXR0cl90eXBlCi0lJQotCi10b3A6ICB7Ci0gIHN3aXRjaCAod3JpdGVjb2RlKQotICAgIHsKLSAgICBjYXNlICdpJzoKLSAgICAgIHByaW50ZigiI2lmZGVmIFNZU1JPRkZfU1dBUF9JTlxuIik7Ci0gICAgICBicmVhazsgCi0gICAgY2FzZSAncCc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX3BcbiIpOwotICAgICAgYnJlYWs7IAotICAgIGNhc2UgJ2QnOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZyc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX1NXQVBfT1VUXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2MnOgotICAgICAgcHJpbnRmKCIjaWZkZWYgU1lTUk9GRl9QUklOVFxuIik7Ci0gICAgICBwcmludGYoIiNpbmNsdWRlIDxzdGRpby5oPlxuIik7Ci0gICAgICBwcmludGYoIiNpbmNsdWRlIDxzdGRsaWIuaD5cbiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotIH0gCi1pdF9saXN0IHsKLSAgc3dpdGNoICh3cml0ZWNvZGUpIHsKLSAgY2FzZSAnaSc6Ci0gIGNhc2UgJ3AnOgotICBjYXNlICdnJzoKLSAgY2FzZSAnYyc6Ci0gICAgcHJpbnRmKCIjZW5kaWZcbiIpOwotICAgIGJyZWFrOyAKLSAgY2FzZSAnZCc6Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotICA7Ci0KLQotaXRfbGlzdDogaXQgaXRfbGlzdAotICB8Ci0gIDsKLQotaXQ6Ci0JJygnIE5BTUUgTlVNQkVSIAotICAgICAgewotCWl0ID0gJDI7IGNvZGUgPSAkMzsKLQlzd2l0Y2ggKHdyaXRlY29kZSkgCi0JICB7Ci0JICBjYXNlICdkJzoKLQkgICAgcHJpbnRmKCJcblxuXG4jZGVmaW5lIElUXyVzX0NPREUgMHgleFxuIiwgaXQsY29kZSk7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzIHsgXG4iLCBpdCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnaSc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3N3YXBfJXNfaW4ocHRyKVxuIiwkMik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLCBpdCk7Ci0JICAgIHByaW50Zigie1xuIik7Ci0JICAgIHByaW50ZigiY2hhciByYXdbMjU1XTtcbiIpOwotCSAgICBwcmludGYoIlx0aW50IGlkeCA9IDAgO1xuIik7Ci0JICAgIHByaW50ZigiXHRpbnQgc2l6ZTtcbiIpOwotCSAgICBwcmludGYoIm1lbXNldChyYXcsMCwyNTUpO1xuIik7CQotCSAgICBwcmludGYoIm1lbXNldChwdHIsMCxzaXplb2YoKnB0cikpO1xuIik7Ci0JICAgIHByaW50Zigic2l6ZSA9IGZpbGx1cChyYXcpO1xuIik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnZyc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3N3YXBfJXNfb3V0KGZpbGUscHRyKVxuIiwkMik7Ci0JICAgIHByaW50ZigiRklMRSAqIGZpbGU7XG4iKTsKLQkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgKnB0cjtcbiIsIGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJcdGNoYXIgcmF3WzI1NV07XG4iKTsKLQkgICAgcHJpbnRmKCJcdGludCBpZHggPSAxNiA7XG4iKTsKLQkgICAgcHJpbnRmKCJcdG1lbXNldCAocmF3LCAwLCAyNTUpO1xuIik7Ci0JICAgIHByaW50ZigiXHRjb2RlID0gSVRfJXNfQ09ERTtcbiIsIGl0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdvJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfc3dhcF8lc19vdXQoYWJmZCxwdHIpXG4iLCQyKTsKLQkgICAgcHJpbnRmKCJiZmQgKiBhYmZkO1xuIik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJpbnQgaWR4ID0gMCA7XG4iKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdjJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfcHJpbnRfJXNfb3V0KHB0cilcbiIsJDIpOwotCSAgICBwcmludGYoInN0cnVjdCBJVF8lcyAqcHRyO1xuIiwgaXQpOwotCSAgICBwcmludGYoIntcbiIpOwotCSAgICBwcmludGYoIml0aGVhZGVyKFwiJXNcIiwgSVRfJXNfQ09ERSk7XG4iLCQyLCQyKTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgJ3QnOgotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgfSAKLQlpdF9maWVsZF9saXN0IAotJyknCi17Ci0gIHN3aXRjaCAod3JpdGVjb2RlKSB7Ci0gIGNhc2UgJ2QnOiAKLSAgICBwcmludGYoIn07XG4iKTsKLSAgICBicmVhazsKLSAgY2FzZSAnZyc6Ci0gICAgcHJpbnRmKCJcdGNoZWNrc3VtKGZpbGUscmF3LCBpZHgsIElUXyVzX0NPREUpO1xuIiwgaXQpOwotICAgIAotICBjYXNlICdpJzoKLQotICBjYXNlICdvJzoKLSAgY2FzZSAnYyc6Ci0gICAgcHJpbnRmKCJ9XG4iKTsKLSAgfQotfQotOwotCi0KLQotaXRfZmllbGRfbGlzdDoKLQkJaXRfZmllbGQgaXRfZmllbGRfbGlzdAotCXwJY29uZF9pdF9maWVsZCBpdF9maWVsZF9saXN0CQotCXwJcmVwZWF0X2l0X2ZpZWxkIGl0X2ZpZWxkX2xpc3QKLQl8Ci0JOwotCi1yZXBlYXRfaXRfZmllbGQ6ICcoJyBSRVBFQVQgTkFNRQotCXsKLQkgIHJkZXB0aCsrOwotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgIGlmIChyZGVwdGg9PTEpCi0JICAgICAgcHJpbnRmKCJcdHByaW50ZihcInJlcGVhdCAlJWRcXG5cIiwgJXMpO1xuIiwkMyk7Ci0JICAgICAgaWYgKHJkZXB0aD09MikKLQkgICAgICBwcmludGYoIlx0cHJpbnRmKFwicmVwZWF0ICUlZFxcblwiLCAlc1tuXSk7XG4iLCQzKTsKLQkgICAgY2FzZSAnaSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdvJzoKLQotCSAgICAgIGlmIChyZGVwdGg9PTEpIAotCQl7Ci0JICAgICAgcHJpbnRmKCJcdHsgaW50IG47IGZvciAobiA9IDA7IG4gPCAlczsgbisrKSB7XG4iLCAgICAkMyk7Ci0JICAgIH0KLQkgICAgICBpZiAocmRlcHRoID09IDIpIHsKLQkgICAgICBwcmludGYoIlx0eyBpbnQgbTsgZm9yIChtID0gMDsgbSA8ICVzW25dOyBtKyspIHtcbiIsICAgICQzKTsKLQkgICAgfQkJCi0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBvbGRyZXBlYXQgPSByZXBlYXQ7Ci0gICAgICAgICByZXBlYXQgPSAkMzsKLQl9Ci0KLQkgaXRfZmllbGRfbGlzdCAnKScgCi0KLQl7Ci0JICByZXBlYXQgPSBvbGRyZXBlYXQ7Ci0JICBvbGRyZXBlYXQgPTA7Ci0JICByZGVwdGgtLTsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgcHJpbnRmKCJcdH19XG4iKTsKLQl9Ci0JfQotICAgICAgIDsKLQotCi1jb25kX2l0X2ZpZWxkOiAnKCcgQ09ORCBOQU1FCi0JewotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgIHByaW50ZigiXHRpZiAoJXMpIHtcbiIsICQzKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotCSBpdF9maWVsZF9saXN0ICcpJyAKLQl7Ci0JICBzd2l0Y2ggKHdyaXRlY29kZSkKLQkgICAgewotCSAgICBjYXNlICdpJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgIGNhc2UgJ28nOgotCSAgICBjYXNlICdjJzoKLQkgIHByaW50ZigiXHR9XG4iKTsKLQl9Ci0JfQotICAgICAgIDsKLQotaXRfZmllbGQ6Ci0JJygnIGF0dHJfZGVzYyAnKCcgYXR0cl90eXBlIGF0dHJfc2l6ZSAnKScgYXR0cl9pZCAKLQl7bmFtZSA9ICQ3OyB9IAotCWVudW1zICcpJwotCXsKLQkgIGNoYXIgKmRlc2MgPSAkMjsKLQkgIGNoYXIgKnR5cGUgPSAkNDsKLQkgIGludCBzaXplID0gJDU7Ci0JICBjaGFyICppZCA9ICQ3OwotY2hhciAqcCA9IG5hbWVzW3JkZXB0aF07Ci1jaGFyICpwdHIgPSBwbmFtZXNbcmRlcHRoXTsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdnJzoKLQkgICAgICBpZiAoc2l6ZSAlIDgpIAotCQl7Ci0JCSAgCi0JCSAgcHJpbnRmKCJcdHdyaXRlQklUUyhwdHItPiVzJXMscmF3LCZpZHgsJWQpO1xuIiwKLQkJCSBpZCwKLQkJCSBuYW1lc1tyZGVwdGhdLCBzaXplKTsKLQotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCXByaW50ZigiXHR3cml0ZSVzKHB0ci0+JXMlcyxyYXcsJmlkeCwlZCxmaWxlKTtcbiIsCi0JCSAgICAgICB0eXBlLAotCQkgICAgICAgaWQsCi0JCSAgICAgICBuYW1lc1tyZGVwdGhdLHNpemUvOCk7Ci0JCX0KLQkgICAgICBicmVhazsJICAgICAgCi0JICAgIGNhc2UgJ2knOgotCSAgICAgIHsKLQotCQlpZiAocmRlcHRoID49IDEpCi0KLQkJICB7Ci0JCSAgICBwcmludGYoImlmICghcHRyLT4lcykgcHRyLT4lcyA9ICglcyopeGNhbGxvYyglcywgc2l6ZW9mKHB0ci0+JXNbMF0pKTtcbiIsIAotCQkJICAgaWQsIAotCQkJICAgaWQsCi0JCQkgICB0eXBlLAotCQkJICAgcmVwZWF0LAotCQkJICAgaWQpOwotCQkgIH0KLQotCQlpZiAocmRlcHRoID09IDIpCi0JCSAgewotCQkgICAgcHJpbnRmKCJpZiAoIXB0ci0+JXNbbl0pIHB0ci0+JXNbbl0gPSAoJXMqKil4Y2FsbG9jKCVzW25dLCBzaXplb2YocHRyLT4lc1tuXVswXSkpO1xuIiwgCi0JCQkgICBpZCwgCi0JCQkgICBpZCwKLQkJCSAgIHR5cGUsCi0JCQkgICByZXBlYXQsCi0JCQkgICBpZCk7Ci0JCSAgfQotCi0JICAgICAgfQotCi0JICAgICAgaWYgKHNpemUgJSA4KSAKLQkJewotCQkgIHByaW50ZigiXHRwdHItPiVzJXMgPSBnZXRCSVRTKHJhdywmaWR4LCAlZCxzaXplKTtcbiIsCi0JCQkgaWQsCi0JCQkgbmFtZXNbcmRlcHRoXSwgCi0JCQkgc2l6ZSk7Ci0JCX0KLQkgICAgICBlbHNlIHsKLQkJcHJpbnRmKCJcdHB0ci0+JXMlcyA9IGdldCVzKHJhdywmaWR4LCAlZCxzaXplKTtcbiIsCi0JCSAgICAgICBpZCwKLQkJICAgICAgIG5hbWVzW3JkZXB0aF0sCi0JCSAgICAgICB0eXBlLAotCQkgICAgICAgc2l6ZS84KTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdvJzoKLQkgICAgICBwcmludGYoIlx0cHV0JXMocmF3LCVkLCVkLCZpZHgscHRyLT4lcyVzKTtcbiIsIHR5cGUsc2l6ZS84LHNpemUlOCxpZCxuYW1lc1tyZGVwdGhdKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgaWYgKHJlcGVhdCkgCi0JCXByaW50ZigiXHQvKiByZXBlYXQgJXMgKi9cbiIsIHJlcGVhdCk7Ci0KLQkJICBpZiAodHlwZVswXSA9PSAnSScpIHsKLQkJICBwcmludGYoIlx0aW50ICVzJXM7IFx0LyogJXMgKi9cbiIscHRyLGlkLCBkZXNjKTsKLQkJfQotCQkgIGVsc2UgaWYgKHR5cGVbMF0gPT0nQycpIHsKLQkJICBwcmludGYoIlx0Y2hhciAlcyolcztcdCAvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOwotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCXByaW50ZigiXHRiYXJyYXkgJXMlcztcdCAvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOwotCSAgICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSAnYyc6Ci0JICAgICAgcHJpbnRmKCJ0YWJvdXQoKTtcbiIpOwotCQkgIHByaW50ZigiXHRwcmludGYoXCIvKiUtMzBzKi8gcHRyLT4lcyA9IFwiKTtcbiIsIGRlc2MsIGlkKTsKLQotCQkgIGlmICh0eXBlWzBdID09ICdJJykKLQkJICBwcmludGYoIlx0cHJpbnRmKFwiJSVkXFxuXCIscHRyLT4lcyVzKTtcbiIsIGlkLHApOwotCQkgIGVsc2UgICBpZiAodHlwZVswXSA9PSAnQycpCi0JCSAgcHJpbnRmKCJcdHByaW50ZihcIiUlc1xcblwiLHB0ci0+JXMlcyk7XG4iLCBpZCxwKTsKLQotCQkgIGVsc2UgICBpZiAodHlwZVswXSA9PSAnQicpIAotCQkgICAgewotCQkgIHByaW50ZigiXHRwYmFycmF5KCZwdHItPiVzJXMpO1xuIiwgaWQscCk7Ci0JCX0KLQkgICAgICBlbHNlIGFib3J0KCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQl9Ci0KLQk7Ci0KLQotYXR0cl90eXBlOgkKLQkgVFlQRSB7ICQkID0gJDE7IH0KLSAJfCAgeyAkJCA9ICJJTlQiO30KLQk7Ci0KLWF0dHJfZGVzYzogCi0JJygnIE5BTUUgJyknCQotCXsgJCQgPSAkMjsgfQotCTsKLQotYXR0cl9zaXplOgotCSBOVU1CRVIgVU5JVCAKLQl7ICQkID0gJDEgKiAkMjsgfQotCTsKLQotCi1hdHRyX2lkOgotCQknKCcgTkFNRSAnKScJeyAkJCA9ICQyOyB9Ci0JfAl7ICQkID0gImR1bW15Ijt9Ci0JOwkKLQkKLWVudW1zOiAKLQl8ICcoJyBlbnVtX2xpc3QgJyknIDsKLQotZW51bV9saXN0OgotCXwKLQllbnVtX2xpc3QgJygnIE5BTUUgTkFNRSAnKScgeyAKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdkJzoKLQkgICAgICBwcmludGYoIiNkZWZpbmUgJXMgJXNcbiIsICQzLCQ0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYyc6Ci0JCXByaW50ZigiaWYgKHB0ci0+JXMlcyA9PSAlcykgeyB0YWJvdXQoKTsgcHJpbnRmKFwiJXNcXG5cIik7fVxuIiwgbmFtZSwgbmFtZXNbcmRlcHRoXSwkNCwkMyk7Ci0JICAgIH0KLQl9Ci0KLQk7Ci0KLQotCi0lJQotLyogZm91ciBtb2RlcwotCi0gICAtZCB3cml0ZSBzdHJ1Y3R1cmUgZGVmaW50aW9ucyBmb3Igc3lzcm9mZiBpbiBob3N0IGZvcm1hdAotICAgLWkgd3JpdGUgZnVuY3Rpb25zIHRvIHN3YXAgaW50byBzeXNyb2ZmIGZvcm1hdCBpbgotICAgLW8gd3JpdGUgZnVuY3Rpb25zIHRvIHN3YXAgaW50byBzeXNyb2ZmIGZvcm1hdCBvdXQKLSAgIC1jIHdyaXRlIGNvZGUgdG8gcHJpbnQgaW5mbyBpbiBodW1hbiBmb3JtICovCi0KLWludCB5eWRlYnVnOwotY2hhciB3cml0ZWNvZGU7Ci0KLWludCAKLW1haW4oYWMsYXYpCi1pbnQgYWM7Ci1jaGFyICoqYXY7Ci17Ci0gIHl5ZGVidWc9MDsKLSAgaWYgKGFjID4gMSkKLSAgICB3cml0ZWNvZGUgPSBhdlsxXVsxXTsKLWlmICh3cml0ZWNvZGUgPT0gJ2QnKQotICB7Ci0gICAgcHJpbnRmKCJ0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBsZW47IH0gYmFycmF5OyBcbiIpOwotICAgIHByaW50ZigidHlwZWRlZiAgaW50IElOVDtcbiIpOwotICAgIHByaW50ZigidHlwZWRlZiAgY2hhciAqIENIQVJTO1xuIik7Ci0KLSAgfQotICB5eXBhcnNlKCk7Ci1yZXR1cm4gMDsKLX0KLQotaW50Ci15eWVycm9yKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIGZwcmludGYoc3RkZXJyLCAiJXNcbiIgLCBzKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zeXNsZXgubCBiL2JpbnV0aWxzL3N5c2xleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk0ODQyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N5c2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotJXsKLSNpbmNsdWRlICJzeXNpbmZvLmgiCi1jaGFyICp3b3JkOwotaW50IG51bWJlcjsKLWludCB1bml0OwotCi0jaWZuZGVmIHl5d3JhcAotc3RhdGljIGludCB5eXdyYXAgKCkgeyByZXR1cm4gMTsgfQotI2VuZGlmCi0lfQotJSUKLSIoIiB7IHJldHVybiAnKCc7fQotIikiIHsgcmV0dXJuICcpJzt9Ci0iWyIgeyByZXR1cm4gJ1snO30KLSJdIiB7IHJldHVybiAnXSc7fQotIiAiIHsgOyB9Ci0iOyIuKiB7IDsgfSAKLSJcdCIgeyA7IH0KLSJcbiIgeyA7IH0KLSJcIiJbXlwiXSoiXCIiIHsKLXl5bHZhbC5zID0gbWFsbG9jKHN0cmxlbiAoeXl0ZXh0KSk7Ci1zdHJjcHkoeXlsdmFsLnMsIHl5dGV4dCsxKTsKLXl5bHZhbC5zW3N0cmxlbih5eWx2YWwucyktMV0gPSAwOwotICAgICAgICByZXR1cm4gTkFNRTsKLQl9Ci0KLTB4WzAtOWEtZl0rIHsKLSAgICAgICAgeXlsdmFsLmkgPSBzdHJ0b2woeXl0ZXh0LDAsMTYpOwotCXJldHVybiAgTlVNQkVSOwotCX0KLQotWzAtOV0rIHsKLSAgICAgICAgeXlsdmFsLmkgPSBhdG9pKHl5dGV4dCk7Ci0JcmV0dXJuICBOVU1CRVI7Ci0JfQotCi0KLSJiaXRzIiB7IHl5bHZhbC5pID0xIDtyZXR1cm4gVU5JVDt9Ci0iYml0IiB7IHl5bHZhbC5pID0gMTsgcmV0dXJuIFVOSVQ7fQotImJ5dGVzIiB7IHl5bHZhbC5pPSA4OyByZXR1cm4gVU5JVDt9Ci0iYnl0ZSIgeyB5eWx2YWwuaSA9IDg7IHJldHVybiBVTklUO30KLQotImludCIgeyB5eWx2YWwucyA9ICJJTlQiOyByZXR1cm4gVFlQRTt9Ci0iYmFycmF5IiB7IHl5bHZhbC5zID0gIkJBUlJBWSI7IHJldHVybiBUWVBFO30KLSJjaGFycyIgeyB5eWx2YWwucyA9ICJDSEFSUyI7IHJldHVybiBUWVBFO30KLSJ2YXJpYWJsZSIgeyB5eWx2YWwuaSA9IDA7IHJldHVybiBOVU1CRVI7fQotImNvdW50ZWQiIHsgeXlsdmFsLmkgPSAtNDsgcmV0dXJuIE5VTUJFUjt9Ci0iYWRkcnNpemUiIHsgeXlsdmFsLmkgPSAtMjsgcmV0dXJuIE5VTUJFUjsgfQotInNlZ3NpemUiIHsgeXlsdmFsLmkgPSAtMTsgcmV0dXJuIE5VTUJFUjsgfQotImNvbmQiIHsgcmV0dXJuIENPTkQ7fQotInJlcGVhdCIgeyByZXR1cm4gUkVQRUFUO30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c3JvZmYuaW5mbyBiL2JpbnV0aWxzL3N5c3JvZmYuaW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmMDAxYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNyb2ZmLmluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotKCJjcyIgMHgwCi0gKCgic2l6ZSIpICgxIGJ5dGUpICgic2l6ZSIpKQotCi0gKCgiaGQiKSAoMSBieXRlKSAoImhkIikpCi0gKCgiaHMiKSAoMSBieXRlKSAoImhzIikpCi0gKCgidW4iKSAoMSBieXRlKSAoInVuIikpCi0gKCgidXMiKSAoMSBieXRlKSAoInVzIikpCi0KLSAoKCJzYyIpICgxIGJ5dGUpICgic2MiKSkKLSAoKCJzcyIpICgxIGJ5dGUpICgic3MiKSkKLSAoKCJlciIpICgxIGJ5dGUpICgiZXIiKSkKLSAoKCJlZCIpICgxIGJ5dGUpICgiZWQiKSkKLQotICgoInNoIikgKDEgYnl0ZSkgKCJzaCIpKQotICgoIm9iIikgKDEgYnl0ZSkgKCJvYiIpKQotICgoInJsIikgKDEgYnl0ZSkgKCJybCIpKQotICgoImR1IikgKDEgYnl0ZSkgKCJkdSIpKQotCi0gKCgiZHBzIikgKDEgYnl0ZSkgKCJkcHMiKSkKLSAoKCJkc3kiKSAoMSBieXRlKSAoImRzeSIpKQotICgoImR0eSIpICgxIGJ5dGUpICgiZHR5IikpCi0gKCgiZGxuIikgKDEgYnl0ZSkgKCJkbG4iKSkKLQotICgoImRzbyIpICgxIGJ5dGUpICgiZHNvIikpCi0gKCgiZHVzIikgKDEgYnl0ZSkgKCJkdXMiKSkKLSAoKCJkc3MiKSAoMSBieXRlKSAoImRzcyIpKQotICgoImRidCIpICgxIGJ5dGUpICgiZGJ0IikpCi0KLSAoKCJkcHAiKSAoMSBieXRlKSAoImRwcCIpKQotICgoImRmcCIpICgxIGJ5dGUpICgiZGZwIikpCi0gKCgiZGVuIikgKDEgYnl0ZSkgKCJkZW4iKSkKLSAoKCJkZHMiKSAoMSBieXRlKSAoImRkcyIpKQotCi0gKCgiZGFyIikgKDEgYnl0ZSkgKCJkYXIiKSkKLSAoKCJkcHQiKSAoMSBieXRlKSAoImRwdCIpKQotICgoImR1bCIpICgxIGJ5dGUpICgiZHVsIikpCi0gKCgiZHNlIikgKDEgYnl0ZSkgKCJkc2UiKSkKLQotICgoImRvdCIpICgxIGJ5dGUpICgiZG90IikpKQotCi0KLSgiaGQiIDB4MDQKLSAoKCJtb2R1bGUgdHlwZSIpICg0IGJpdHMpICgibXQiKQotICAoKCJNVFlQRV9BQlNfTE0iIAkiMCIpCi0gICAoIk1UWVBFX1JFTF9MTSIgCSIxIikKLSAgICgiTVRZUEVfT01TX09SX0xNUyIgCSIyIikKLSAgICgiTVRZUEVfVU5TUEVDIiAJIjB4ZiIpKSkKLSAoKCJzcGFyZSIpKDQgYml0cykgKCJzcGFyZTEiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikoIGNoYXJzIDEyIGJ5dGVzKSggImNkIikpCi0gKCgibnVtYmVyIG9mIHVuaXRzIikgKDIgYnl0ZXMpICgibnUiKSkKLSAoKCJjb2RlIikgKDEgYnl0ZSkgKCJjb2RlIikpCi0gKCgidmVyc2lvbiIpIChjaGFycyA0IGJ5dGVzKSAoInZlciIpKQotICgoImFkZHJlc3MgdXBkYXRlIikgKDEgYnl0ZSkgKCJhdSIpKQotICgoInNlZ21lbnQgaWRlbnRpZmllciIpICgxIGJpdCkgKCJzaSIpKQotICgoImFkZHJlc3MgZmllbGQgbGVuZ3RoIikgKDQgYml0cykgKCJhZmwiKSkKLSAoKCJzcGFyZSIpKDMgYml0cykgKCJzcGFyZTIiKSkKLSAoKCJzcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IikgKDEgYnl0ZSkgKCJzcGNzeiIpKQotICgoInNlZ21lbnQgc2l6ZSIpICAJKDEgYnl0ZSkgKCJzZWdzeiIpKQotICgoInNlZ21lbnQgc2hpZnQiKSAJKDEgYnl0ZSkgKCJzZWdzaCIpKQotICgoImVudHJ5IHBvaW50IikgCSgxIGJ5dGUpICgiZXAiKSkKLSAoY29uZCAicHRyLT5lcCIKLSAgICAgICAoY29uZCAicHRyLT5tdCAhPSBNVFlQRV9BQlNfTE0iIAotCSAgICAgKCgidW5pdCBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInVhbiIpKQotCSAgICAgKCgic2VjdGlvbiBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInNhIikpKQotICAgICAgIChjb25kICJzZWdtZW50ZWRfcCIKLQkgICAgICgoInNlZ21lbnQgYWRkcmVzcyIpIChzZWdzaXplIGJ5dGVzKSAoInNhZCIpKSkKLSAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gKCgib3MgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJvcyIpKQotICgoInN5cyBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInN5cyIpKQotICgoIm1vZHVsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1uIikpCi0gKCgiY3B1IikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImNwdSIpKSkKLQotCi0oImhzIiAweDA1Ci0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCi0oInVuIiAweDA2Ci0gKCgiZm9ybWF0IikgKDIgYml0cykgKCJmb3JtYXQiKQotICAoKCJGT1JNQVRfTE0iICIwIikKLSAgICgiRk9STUFUX09NIiAiMSIpCi0gICAoIkZPUk1BVF9PTVNfT1JfTE1TIiAiMiIpKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCi0gKCgibnVtYmVyIG9mIHNlY3Rpb25zIikgKDIgYnl0ZXMpICgibnNlY3Rpb25zIikpCi0gKCgibnVtYmVyIG9mIGV4dGVybmFsIHJlZnMiKSAoMiBieXRlcykgKCJuZXh0cmVmcyIpKQotICgoIm51bWJlciBvZiBleHRlcm5hbCBkZWZzIikgKDIgYnl0ZXMpICgibmV4dGRlZnMiKSkKLSAoKCJ1bml0IG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpCi0gKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQotICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgidGNkIikpCi0gKCgibGlua2VyIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJsaW5rZXIiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikgKGNoYXJzIDEyIGJ5dGVzKSAoImxjZCIpKSkKLQotCi0oInVzIiAweDA3Ci0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKQotCi0KLSgic2MiIDB4MDgKLSAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLSAoKCJzZWdtZW50IGFkZHJlc3MiKSAoc2Vnc2l6ZSBieXRlcykgKCJzZWdhZGQiKSkKLSAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKLSAoKCJsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgibGVuZ3RoIikpCi0gKCgiYWxpZ25tZW50IikgKGFkZHJzaXplIGJ5dGVzKSAoImFsaWduIikpCi0gKCgiY29udGVudHMiKSAoNCBiaXRzKSAoImNvbnRlbnRzIikKLSAgKCgiQ09OVEVOVFNfQ09ERSIgIjAiKQotICAgKCJDT05URU5UU19EQVRBIiAiMSIpCi0gICAoIkNPTlRFTlRTX1NUQUNLIiAiMiIpCi0gICAoIkNPTlRFTlRTX0RVTU1ZIiAiMyIpCi0gICAoIkNPTlRFTlRTX1NQRUNJQUwiICI0IikKLSAgICgiQ09OVEVOVFNfTk9OU1BFQyIgIjB4ZiIpKSkKLSAoKCJjb25jYXQiKSAoNCBiaXRzKSAoImNvbmNhdCIpCi0gICgoIkNPTkNBVF9TSU1QTEUiICIwIikKLSAgICgiQ09OQ0FUX1NIQVJFREMiICIxIikKLSAgICgiQ09OQ0FUX0RVTU1ZIiAiMiIpCi0gICAoIkNPTkNBVF9HUk9VUCIgIjMiKQotICAgKCJDT05DQVRfU0hBUkVEIiAiNCIpCi0gICAoIkNPTkNBVF9QUklWQVRFIiAiNSIpCi0gICAoIkNPTkNBVF9VTlNQRUMiICIweGYiKSkpCi0gKCgicmVhZCIpICgyIGJpdHMpICgicmVhZCIpKQotICgoIndyaXRlIikgKDIgYml0cykgKCJ3cml0ZSIpKQotICgoImV4ZWMiKSAoMiBiaXRzKSAoImV4ZWMiKSkKLSAoKCJpbml0aWFsaXplZCIpICgyIGJpdHMpICgiaW5pdCIpKQotICgoIm1vZGUiKSAoMiBiaXRzKSAoIm1vZGUiKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCi0gKCgibmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoIm5hbWUiKSkpCi0KLQotKCJzcyIgMHgwOQotICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLQkKLSgiZXIiIDB4MGMKLSAoKCJzeW1ib2wgdHlwZSIpICgyIGJpdHMpICgidHlwZSIpCi0gICgoIkVSX0VOVFJZIiAiMCIpCi0gICAoIkVSX0RBVEEiICIxIikKLSAgICgiRVJfTk9UREVGIiAiMiIpCi0gICAoIkVSX05PVFNQRUMiICIzIikpKQotICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZSIpKQotICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgibmFtZSIpKSkKLQkKLQotKCJlZCIgMHgxNAotICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpCi0gKCgic3ltYm9sIHR5cGUiKSAoMyBiaXRzKSAoInR5cGUiKQotICAoKCJFRF9UWVBFX0VOVFJZIiAiMCIpCi0gICAoIkVEX1RZUEVfREFUQSIgIjEiKQotICAgKCJFRF9UWVBFX0NPTlNUIiAiMiIpCi0gICAoIkVEX1RZUEVfTk9UU1BFQyIgIjciKSkpCi0gKCgic3BhcmUiKSAoNSBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgInB0ci0+dHlwZT09RURfVFlQRV9FTlRSWSB8fCBwdHItPnR5cGU9PUVEX1RZUEVfREFUQSIKLSAgICAgICAoKCJzeW1ib2wgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpKQotIChjb25kICJwdHItPnR5cGU9PUVEX1RZUEVfQ09OU1QiCi0gICAgICAgKCgiY29uc3RhbnQgdmFsdWUiKSAoYWRkcnNpemUgYnl0ZXMpICgiY29uc3RhbnQiKSkpCi0gKCgic3ltYm9sIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpKQotCi0KLSgic2giIDB4MWEKLSAoKCJ1bml0IGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQotICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpKQotCi0KLSgib2IiIDB4MWMKLSAoKCJzdGFydGluZyBhZGRyZXNzIGZsYWciKSAoMSBiaXQpICgic2FmIikpCi0gKCgiY29tcHJlc3Npb24gZmxhZyIpICgxIGJpdCkgKCJjcGYiKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAicHRyLT5zYWYiCi0gICAgICAgKCAoInN0YXJ0aW5nIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKSkKLSAoY29uZCAicHRyLT5jcGYiCi0gICAgICAgKCgiY29tcCByZXBzIikgKGFkZHJzaXplIGJ5dGVzKSAoImNvbXByZXBzIikpKQotICgoImRhdGEiKSAoYmFycmF5IGNvdW50ZWQgYnl0ZSkgKCJkYXRhIikpKQotCQotCi0oInJsIiAweDIwCi0gKCgiYm91bmRhcnkgb2YgcmVsb2NhdGVhYmxlIGFyZWEiKSAoNCBiaXRzKSAoImJvdW5kYXJ5IikpCi0gKCgiYWRkcmVzcyBwb2xhcml0eSIpICgxIGJpdCkgKCJhcG9sIikpCi0gKCgic2VnbWVudCBudW1iZXIiKSAoMSBiaXQpICgic2VnbWVudCIpKQotICgoInNpZ24gb2YgcmVsb2NhdGlvbiIpICgxIGJpdCkgKCJzaWduIikpCi0gKCgiY2hlY2sgcmFuZ2UiKSAoMSBiaXQpICgiY2hlY2siKSkKLSAoKCJyZWxvYyBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKLQotICgoImJpdCBsb2MiKSAoMSBieXRlKSAoImJpdGxvYyIpKQotICgoImZpZWxkIGxlbmd0aCIpICgxIGJ5dGUpICgiZmxlbiIpKQotICgoImJjb3VudCIpICgxIGJ5dGUpICgiYmNvdW50IikpCi0gKCgib3BlcmF0b3IiKSAoMSBieXRlKSAoIm9wIikKLSAgKCgiT1BfUkVMT0NfQUREUiIgIjEiKQotICAgKCJPUF9TRUNfUkVGIiAiMCIpCi0gICAoIk9QX0VYVF9SRUYiICIyIikpKQotIChjb25kICJwdHItPm9wID09IE9QX0VYVF9SRUYiCi0gICAgICAgKCgic3ltYm9sIG51bWJlciIpICgyIGJ5dGVzKSAoInN5bW4iKSkJKQotCQotIChjb25kICJwdHItPm9wID09IE9QX1NFQ19SRUYiCi0gICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzZWNuIikpCi0gICAgICAgKCgiY29uc3Qgb3Bjb2RlIikgKDEgYnl0ZSkgKCJjb3Bjb2RlX2lzXzMiKSkKLSAgICAgICAoKCJhZGRlbmQgbGVuZ3RoIikgKDEgYnl0ZSkgKCJhbGVuZ3RoX2lzXzQiKSkKLSAgICAgICAoKCJhZGRlbmQiKSAoNCBieXRlKSAoImFkZGVuZCIpKQotICAgICAgICgoInBsdXMgb3Bjb2RlIikgKDEgYnl0ZSkgKCJhb3Bjb2RlX2lzXzB4MjAiKSkpCi0KLSAoY29uZCAicHRyLT5vcCA9PSBPUF9SRUxPQ19BRERSIgotICAgICAgICgoImR1bm5vIikgKDIgYnl0ZXMpICgiZHVubm8iKSkpCi0KLSAoKCJlbmQiKSAgKDEgYnl0ZSkgKCJlbmQiKSkpCi0JCi0KLSgiZHUiIDB4MzAKLSAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQotICgoIm9wdGltaXplZCIpICgxIGJpdCkgKCJvcHRpbWl6ZWQiKSkKLSAoKCJzdGFja2ZybXQiKSAoMiBiaXRzKSAoInN0YWNrZnJtdCIpKQotICgoInNwYXJlIikgKDMgYml0cykgKCJzcGFyZSIpKQotICgoInVuaXQgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQotICgoInNlY3Rpb25zIikgKDIgYnl0ZXMpICgic2VjdGlvbnMiKSkKLSAocmVwZWF0ICJwdHItPnNlY3Rpb25zIgotCSAoKCJzZWN0aW9uIGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgic2FuIikpCi0JICgoImFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKQotCSAoKCJzZWN0aW9uIGxlbmd0aCIpIChhZGRyc2l6ZSBieXRlcykgKCJsZW5ndGgiKSkpCi0gKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQotICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgiZGF0ZSIpKSkKLQotCi0oImRzeSIgMHgzNAotICgoInN5bWJvbCB0eXBlIikgKDcgYml0cykgKCJ0eXBlIikKLSAgKCgiU1RZUEVfVkFSIiAiMCIpCi0gICAoIlNUWVBFX0xBQiIgIjEiKQotICAgKCJTVFlQRV9QUk9DIiAiMiIpCi0gICAoIlNUWVBFX0ZVTkMiICIzIikKLSAgICgiU1RZUEVfVFlQRSIgIjQiKQotICAgKCJTVFlQRV9DT05TVCIgIjUiKQotICAgKCJTVFlQRV9FTlRSWSIgIjYiKQotICAgKCJTVFlQRV9NRU1CRVIiICI3IikKLSAgICgiU1RZUEVfRU5VTSIgIjgiKQotICAgKCJTVFlQRV9UQUciICI5IikKLSAgICgiU1RZUEVfUEFDS0FHRSIgIjEwIikKLSAgICgiU1RZUEVfR0VORVJJQyIgIjExIikKLSAgICgiU1RZUEVfVEFTSyIgIjEyIikKLSAgICgiU1RZUEVfRVhDRVBUSU9OIiAiMTMiKQotICAgKCJTVFlQRV9QQVJBTUVURVIiICIxNCIpCi0gICAoIlNUWVBFX0VRVUFURSIgIjE1IikKLSAgICgiU1RZUEVfVU5TUEVDIiAiMHg3ZiIpKSkKLSAoKCJhc3NpZ25tZW50IGluZm8iKSAoMSBiaXQpICgiYXNzaWduIikpCi0gKCgic3ltYm9sIGlkIikgKDIgYnl0ZXMpICgic251bWJlciIpKQotICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInNuYW1lIikpCi0gKCgibmVzdGluZyBsZXZlbCIpICgyIGJ5dGVzKSAoIm5lc3RpbmciKSkKLSAoY29uZCAicHRyLT5hc3NpZ24iCi0gICAgICAgKCgiYXNzaWdubWVudCB0eXBlIikgKDEgYnl0ZSkgICgiYWluZm8iKQotCSgoIkFJTkZPX1JFRyIgIjEiKQotCSAoIkFJTkZPX1NUQVRJQ19FWFRfREVGIiAiMiIpCi0JICgiQUlORk9fU1RBVElDX0VYVF9SRUYiICIzIikKLQkgKCJBSU5GT19TVEFUSUNfSU5UIiAiNCIpCi0JICgiQUlORk9fU1RBVElDX0NPTSIgIjUiKQotCSAoIkFJTkZPX0FVVE8iICI2IikKLQkgKCJBSU5GT19DT05TVCIgIjciKQotCSAoIkFJTkZPX1VOU1BFQyIgIjB4ZmYiKSkpCi0gICAgICAgKCgiZGF0YSBsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgiZGxlbmd0aCIpKQotICAgICAgIChjb25kICJwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19FWFRfREVGCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19JTlQKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0NPTSIKLQkgICAgICgoInNlY3Rpb24gbnVtYmVyIikgICgyIGJ5dGVzKSAoInNlY3Rpb24iKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0lOVAotICAgICAgICAgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfQ09NCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX0FVVE8iCi0JICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fUkVHIgotCSAgICAgKCgicmVnaXN0ZXIgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJyZWciKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKLQkgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfRVhUX1JFRiIKLQkgICAgICgoImV4dGVybmFsIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiZW5hbWUiKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fQ09OU1QiCi0JICAgICAoKCJjb25zdGFudCIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJjb25zdGFudCIpKSkpCi0gKGNvbmQgInB0ci0+dHlwZSA9PSBTVFlQRV9NRU1CRVIiCi0gICAgICAgKCgiYXNzaWdubWVudCB1bml0IikgKDEgYml0KSAoImJpdHVuaXQiKSkKLSAgICAgICAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUyIikpCi0gICAgICAgKCgiZmllbGQgbGVuZ3RoIikgKGFkZHJzaXplIGJ5dGVzKSAoImZpZWxkX2xlbiIpKQotICAgICAgICgoImZpZWxkIG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9vZmYiKSkKLSAgICAgICAoY29uZCAicHRyLT5iaXR1bml0IgotCSAgICAgKCgiYml0IG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9iaXRvZmYiKSkpKQotIChjb25kICJwdHItPnR5cGU9PSBTVFlQRV9FTlVNIgotICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgiZXZhbGxlbiIpKQotICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgiZXZhbHVlIikpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfQ09OU1QiCi0gICAgICAgKCgidmFsdWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiY3ZhbHVlIikpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfRVFVQVRFIgotICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgicXZhbGxlbiIpKQotICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgicXZhbHVlIikpCi0gICAgICAgKCgiYmFzaWMgdHlwZSIpICgxIGJ5dGUpICgiYnR5cGUiKSkKLSAgICAgICAoKCJzaXplIGluZm9ybWF0aW9uIikgKGFkZHJzaXplIGJ5dGVzKSAoInNpemVpbmZvIikpCi0gICAgICAgKCgic2lnbiIpICgyIGJpdHMpICgic2lnbiIpKQotICAgICAgICgoImZsb2F0aW5nIHBvaW50IHR5cGUiKSAoNiBiaXRzKSAoImZsdF90eXBlIikpKQotICgoInNvdXJjZSBmaWxlIG51bWJlciIpICgyIGJ5dGVzKSAoInNmbiIpKQotICgoInNvdXJjZSBsaW5lIG51bWJlciIpICgyIGJ5dGVzKSAoInNsbiIpKQotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfVEFHIgotICAgICAgICgoIm1hZ2ljIikgKDEgYnl0ZSkgKCJtYWdpYyIpKSkpCi0KLSAKLQotKCJkdWwiIDB4NTIKLSAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQotICgoIm1heCBzcGFyZSIpICg3IGJpdHMpICgibWF4c3BhcmUiKSkKLSAoY29uZCAicHRyLT5tYXhfdmFyaWFibGUgPT0gMCIKLSAgICAgICAoKCJtYXhpbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1heCIpKQotICAgICAgICgoIm1heCBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1heG1vZGUiKSkpCi0KLSAoKCJtaW4gZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1pbl92YXJpYWJsZSIpKQotICgoIm1pbiBzcGFyZSIpICg3IGJpdHMpICgibWluc3BhcmUiKSkKLSAoY29uZCAicHRyLT5taW5fdmFyaWFibGUgPT0gMCIKLSAgICAgICAoKCJtaW5pbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1pbiIpKQotICAgICAgICgoIm1pbiBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1pbm1vZGUiKSkpKQotCi0KLSgiZHR5IiAweDM2Ci0gKCgiZW5kIGZsYWciKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLQotKCJkYnQiIDB4NDQKLSAoKCJiYXNpYyB0eXBlIikgKDEgYnl0ZSkgKCJidHlwZSIpCi0gICgoIkJUWVBFX1ZPSUQiICIwIikKLSAgICgiQlRZUEVfVU5ERUYiICIxIikKLSAgICgiQlRZUEVfQ0hBUiIgIjIiKQotICAgKCJCVFlQRV9JTlQiICIzIikKLSAgICgiQlRZUEVfRkxPQVQiICI0IikKLSAgICgiQlRZUEVfQklUIiAiNSIpCi0gICAoIkJUWVBFX1NUUklORyIgIjYiKQotICAgKCJCVFlQRV9ERUNJTUFMIiAiNyIpCi0gICAoIkJUWVBFX0VOVU0iICI4IikKLSAgICgiQlRZUEVfU1RSVUNUIiAiOSIpCi0gICAoIkJUWVBFX1RZUEUiICIxMCIpCi0gICAoIkJUWVBFX1RBRyIgIjExIikKLSAgICgiQlRZUEVfVU5TUEVDIiAiMHhmZiIpKSkKLSAoKCJzaXplIGluZm8iKSAoYWRkcnNpemUgYnl0ZXMpICgiYml0c2l6ZSIpKQotICgoInNpZ24iKSAoMiBiaXRzKSAoInNpZ24iKQotICAoKCJTSUdOX1NJR05FRCIgIjAiKQotICAgKCJTSUdOX1VOU0lHTkVEIiAiMSIpCi0gICAoIlNJR05fVU5TUEVDIiAiMyIpKSkKLSAoKCJmbG9hdGluZyBwb2ludCB0eXBlIikgKDYgYml0cykgKCJmcHR5cGUiKQotICAoKCJGUFRZUEVfU0lOR0xFIiAiMCIpCi0gICAoIkZQVFlQRV9ET1VCTEUiICIxIikKLSAgICgiRlBUWVBFX0VYVEVOREVEIiAiMiIpCi0gICAoIkZQVFlQRV9OT1RTUEVDIiAiMHgzZiIpKSkKLSAoY29uZCAicHRyLT5idHlwZT09QlRZUEVfVEFHIHx8IHB0ci0+YnR5cGUgPT0gQlRZUEVfVFlQRSIKLSAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJzaWQiKSkpCi0gKCgibmVnb3RpYXRpb24iKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLSgiZGFyIiAweDRlCi0gKCgiZWxlbWVudCBsZW5ndGgiICkgKGFkZHJzaXplIGJ5dGVzKSAoImxlbmd0aCIpKQotICgoImRpbXMiKSAoMSBieXRlKSAoImRpbXMiKSkKLSAocmVwZWF0ICJwdHItPmRpbXMiCi0JICgoInZhcmlhYmxlIGZsYWciKSAoMSBiaXQpICgidmFyaWFibGUiKQotCSAgKCgiVkFSSUFCTEVfRklYRUQiICIwIikKLQkgICAoIlZBUklBQkxFX1ZBUklBQkxFIiAiMSIpKSkKLQotCSAoKCJzdWJzY3JpcHQgdHlwZSIpICgxIGJpdCkgKCJzdWJ0eXBlIikKLQkgICgoIlNVQl9JTlRFR0VSIiAiMCIpCi0JICAgKCJTVUJfVFlQRSIgICAgIjEiKSkpCi0KLQkgKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlIikpCi0KLQkgKGNvbmQgInB0ci0+c3VidHlwZVtuXSA9PSBTVUJfVFlQRSIKLQkgICAgICAgKCgic3ViIHN5bWJvbCBpZCIpICgyIGJ5dGVzKSAoInNpZCIpKSkKLQotCSAoY29uZCAicHRyLT5zdWJ0eXBlW25dID09IFNVQl9JTlRFR0VSIgotCSAgICAgICAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQotCSAgICAgICAoKCJtYXggc3BhcmUiKSAoNyBiaXRzKSAoIm1heHNwYXJlIikpCi0JICAgICAgIDs7IEZJWE1FOiBuZXh0IGZpZWxkIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBtYXhfdmFyaWFibGUsCi0JICAgICAgICgoIm1heGltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWF4IikpCi0KLQkgICAgICAgKCgibWluIGRlY2xhcmF0aW9uIHR5cGUgZmxhZyIpICgxIGJpdCkgKCJtaW5fdmFyaWFibGUiKSkKLQkgICAgICAgKCgibWluIHNwYXJlIikgKDcgYml0cykgKCJtaW5zcGFyZSIpKQotCSAgICAgICA7OyBGSVhNRTogbmV4dCBmaWVsZCBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gbWluX3ZhcmlhYmxlCi0JICAgICAgICgoIm1pbmltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWluIikpKSkKLSAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCSAgICAgICAKLSgiZHNvIiAweDNhCi0gKCgiZnVuY3Rpb24gbmFtZSIpICgyIGJ5dGVzKSAoInNpZCIpKQotICgoInNwIHVwZGF0ZSBjb3VudCIpICg0IGJ5dGVzKSAoInNwdXBkYXRlcyIpKQotIChyZXBlYXQgInB0ci0+c3B1cGRhdGVzIgotCSAoKCJ1cGRhdGUgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpCi0JICgoIm9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJvZmZzZXQiKSkpKQotCi0oImRsbiIgMHgzOAotICgoIm51bWJlciBvZiBsaW5lcyIpICgyIGJ5dGVzKSAoIm5sbiIpKQotIChyZXBlYXQgInB0ci0+bmxuIgotCSAoKCJzb3VyY2UgZmlsZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZm4iKSkKLQkgKCgic291cmNlIGxpbmUgbnVtYmVyIikgKDIgYnl0ZXMpICgic2xuIikpCi0JICgoInNlY3Rpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgic2VjdGlvbiIpKQotCSAoKCJmcm9tIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiZnJvbV9hZGRyZXNzIikpCi0JICgoInRvIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgidG9fYWRkcmVzcyIpKQotCSAoKCJjYWxsIGNvdW50IikgKDIgYnl0ZXMpICgiY2MiKSkKLQkgKQotICgoIm5lZyIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLSAKLSgiZHBwIiAweDQ2Ci0gKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgicGFyYW1zIikgKDEgYnl0ZSkgKCJwYXJhbXMiKSkKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkZW4iIDB4NGEKLSAoKCJzdGFydC9lbmQiKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkZnAiIDB4NDgKLSAoKCJzdGFydC9lbmQgZmxhZyIpICgxIGJpdCkgKCJlbmQiKSkKLSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm51bWJlciBvZiBwYXJhbWV0ZXJzIikgKDEgYnl0ZSkgKCJucGFyYW1zIikpCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZGRzIiAweDRjCi0gKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZHB0IiAweDUwCi0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQotICgoImR1bm5vIikgKDEgYnl0ZSkgKCJkdW5ubyIpKSkKLQotKCJkc2UiIDB4NTQKLSAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpCi0gKCgiZHVubm8iKSAoMSBieXRlKSAoImR1bm5vIikpKQotCi0oImRvdCIgMHg1NgotICgoInVua25vd24iKSAoMSBieXRlKSAoInVua25vd24iKSkpCi07IEZJWE1FOiB1bmtub3duIGZpZWxkIHNob3VsZCBiZSByZXBlYXRlZCBzeW1ib2wgbnVtYmVyPwotCi0KLSgiZHNzIiAweDQyCi0gKCgidHlwZSIpICgxIGJ5dGUpICgidHlwZSIpKQotICgoImV4dGVybmFsL2ludGVybmFsIikgKDEgYml0KSAoImludGVybmFsIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmludGVybmFsIgotICAgICAgICggICgicGFja2FnZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicGFja2FnZSIpKSkKLSAoY29uZCAicHRyLT5pbnRlcm5hbCIKLSAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJpZCIpKSkKLSAoKCJyZWNvcmQgdHlwZSIpICgyIGJ5dGVzKSAoInJlY29yZCIpKQotICgoInJ1bGVzIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicnVsZXMiKSkKLSAoKCJudW1iZXIgb2Ygc3ltYm9scyIpICgyIGJ5dGVzKSAoIm5zeW1ib2xzIikpCi0gKCgidW5rbm93biIgKSAoMiBieXRlcykgKCJmaXhtZSIpKSkKLSAgICAgCi0oInBzcyIgMHg0MAotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoImVmbiIpKQotICgoIm51bWJlciBvZiBzb3VyY2UgZmlsZXMiKSAoMiBieXRlcykgKCJucyIpKQotIChyZXBlYXQgInB0ci0+bnMiCi0JICgoImRpcmVjdG9yeSByZWZlcmVuY2UgYml0IikgKDEgYml0KSAoImRyYiIpKQotCSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLQkgKCgiY29tcGxldGVkIGZpbGUgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoImZuYW1lIikpCi0JIChjb25kICJwdHItPmRyYltuXSIgCi0JICAgICAgICgoImRpcmVjdG9yeSBhcHBlcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgiZGFuIikpKSkKLSAKLSAoKCJudW1iZXIgb2YgZGlyZWN0b3JpZXMiKSAoMiBieXRlcykgKCJuZGlyIikpCi0gKHJlcGVhdCAicHRyLT5uZGlyIgotCSAoKCJkaXJlY3RvcnkgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJkbmFtZSIpKSkpCi0KLQotOyBGSVhNRTogdGhlIHRyIGJsb2NrIGhhcyBubyBjb250ZW50cy4gc3lzaW5mbywgZXRjLiBhcmVuJ3QgcHJlcGFyZWQgCi07IHRvIGRlYWwgd2l0aCB0aGF0LgotOyAoInRyIiAweDdmKQotCi0KLSgiZHVzIiAweDQwCi0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgiZWZuIikpCi0gKCgibnVtYmVyIG9mIHNvdXJjZSBmaWxlcyIpICgyIGJ5dGVzKSAoIm5zIikpCi0gKHJlcGVhdCAicHRyLT5ucyIKLQkgKCgiZGlyZWN0b3J5IHJlZmVyZW5jZSBiaXQiKSAoMSBiaXQpICgiZHJiIikpCi0JICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotCSAoKCJjb21wbGV0ZWQgZmlsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgiZm5hbWUiKSkKLQkgKGNvbmQgInB0ci0+ZHJiW25dIiAKLQkgICAgICAgKCgiZGlyZWN0b3J5IGFwcGVyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJkYW4iKSkpKQotICgoIm51bWJlciBvZiBkaXJlY3RvcmllcyIpICgyIGJ5dGVzKSAoIm5kaXIiKSkKLSAocmVwZWF0ICJwdHItPm5kaXIiCi0JICgoImRpcmVjdG9yeSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImRuYW1lIikpKSkKLQotCi0oImRwcyIgMHgzMgotICgoInN0YXJ0L2VuZCBmbGFnIikgKDEgYml0KSAoImVuZCIpKQotICgoImJsb2NrIHR5cGUiKSAoNyBiaXRzKSAoInR5cGUiKQotICAoKCJCTE9DS19UWVBFX0NPTVBVTklUIiAiMCIpCi0gICAoIkJMT0NLX1RZUEVfUFJPQ0VEVVJFIiAiMiIpCi0gICAoIkJMT0NLX1RZUEVfRlVOQ1RJT04iICIzIikKLSAgICgiQkxPQ0tfVFlQRV9CTE9DSyIgIjQiKQotICAgKCJCTE9DS19UWVBFX0JBU0lDIiAiOSIpKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm9wdGltaXphdGlvbiIpICgxIGJ5dGUpICgib3B0IikpCi0gICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzYW4iKSkKLSAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkKLSAgICAgICAoKCJibG9jayBzaXplIikgKGFkZHJzaXplIGJ5dGVzKSAoImJsb2NrX3NpemUiKSkKLSAgICAgICAoKCJuZXN0aW5nIikgKDEgYnl0ZSkgKCJuZXN0aW5nIikpCi0gICAgICAgKGNvbmQgInB0ci0+dHlwZSA9PSBCTE9DS19UWVBFX1BST0NFRFVSRSAKLQkgICAgfHwgcHRyLT50eXBlID09IEJMT0NLX1RZUEVfRlVOQ1RJT04iCi0JICAgICAoKCJyZXR1cm4gYWRkcmVzcyIpICgxIGJpdCkgKCJyZXRhZGRyIikpCi0JICAgICAoKCJpbnRlcnJ1cHQgZnVuY3Rpb24gZmxhZyIpICgxIGJpdCkgKCJpbnRyZmxhZyIpKQotCSAgICAgKCgic3RhY2sgdXBkYXRlIGZsYWciKSAoMSBiaXQpICgic3RhY2tmbGFnIikpCi0JICAgICAoKCJpbnRyYSBwYWdlIEpNUCIpICgxIGJpdCkgKCJpbnRycGFnZWptcCIpKQotCSAgICAgKCgic3BhcmUiKSAoNCBiaXRzKSAoInNwYXJlIikpKQotICAgICAgICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpKQotCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nIGIvYmludXRpbHMvdGVzdHN1aXRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4ZjhkNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLTIwMDAtMDMtMTMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IEFkanVzdCB0byBtYXRjaCBub2V3IGZvcm1hdCBvZiByZWFkZWxmCi0Jb3V0cHV0LiAKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnNzOiBBZGp1c3QgdG8gbWF0Y2ggbm9ldyBmb3JtYXQgb2YgcmVhZGVsZiAKLQlvdXRwdXQuIAotCi0xOTk5LTExLTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEV4cGVjdCBzaW1wbGUgb2JqY29weSB0ZXN0IGZvciBmYWlsCi0JZm9yIENPRkYgYmFzZWQgQVJNIGFuZCBUaHVtYiBwb3J0cy4KLQotVHVlIFNlcCAxNCAwMDoyODoxNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwOiBEbyBub3QgcnVuIGZvciBQQTY0LgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogQWRkIHBqIHRvIGNwdXNfZXhwZWN0ZWQuCi0KLVNhdCBBdWcgMjggMDA6MjQ6MjcgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9ocHBhL2ZyZWcuczogIE5ldyBmaWxlLgotCSogYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHA6ICBBZGQgZnJlZy5zIHRlc3QuCi0KLTE5OTktMDgtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2ltcGxlIGNvcHkgdGVzdAotCWZvciBpKjg2LSotbXNkb3MqLgotCi0xOTk5LTA3LTIxICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGJpbnV0aWxzLWFsbC90ZXN0cHJvZy5jOiBJbmNsdWRlIDxzdGRpby5oPi4KLQotMTk5OS0wNi0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBBZGQgZnIzMCBhbmQgTUNvcmUgdG8gZXhwZWN0ZWQgY3B1cwotCWxpc3QuIAotCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5yOiBEbyBub3QgYXNzdW1lIGEgZml4ZWQgbnVtYmVyIG9mIHNwYWNlcwotCWluIHRoZSBvdXRwdXQuCi0KLTE5OTktMDYtMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLndpOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IG91dHB1dC4KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmg6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3Qgb3V0cHV0LgotCi1XZWQgSnVuICA5IDExOjU5OjIyIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBUaWdodGVuIHJlZ2V4cCB0byBtYXRjaCBgb2JqZHVtcCAtaScKLQlvdXRwdXQgdG8gYXZvaWQgbWFzc2l2ZSBleHBvbmVudGlhbCBiZWhhdmlvdXIuCi0KLTE5OTktMDUtMjggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5oOiBVcGRhdGUgZm9yIGNoYW5nZXMgb2YgMTk5OS0wNC0wOC4KLQotMTk5OS0wMy0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL3JlYWRlbGYud2k6IFJlbW92ZSBGUjMwIHNwZWNpZmljIGNvbXBvbm50cy4KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IFJlbW92ZSBSRUxBIHNwZWNpZmljIGNvbXBvbmVudHMuCi0KLTE5OTktMDItMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IERvIG5vdCBhc3N1bWUgc2VjdGlvbiBhbGlnbm1lbnQgaXMgNC4KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnI6IERvIG5vdCBhc3N1bWUgcmVsYSdzIGFyZSBiZWluZyB1c2VkLiAKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cDogZGlzYWJsZSB0ZXN0cyBmb3Igbm9uIEVMRiBiYXNlZAotCXRhcmdldHMuCi0KLTE5OTktMDItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLndpOiBBbWVuZCB0byBtYXRjaCBuZXcgcmVhZGVsZiBvdXRwdXQuCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5yOiBEbyBub3QgYXNzdW1lIHRoYXQgUkVMQXMgd2lsbCBiZSB1c2VkLgotCi0xOTk5LTAxLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IEFkZCBkZWZpbml0aW9ucyBvZiBSRUFERUxGIGFuZCBSRUFERUxGRkxBR1MuCi0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cDogTmV3IGZpbGU6IFJlYWRlbGYgdGVzdHMKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmg6IE5ldyBmaWxlOiBFeHBlY3RlZCByZXN1bHRzIGZvciAncmVhZGVsZiAtaCcKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IE5ldyBmaWxlOiBFeHBlY3RlZCByZXN1bHRzIGZvciAncmVhZGVsZiAtUycKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnNzOiBOZXcgZmlsZTogRXhwZWN0ZWQgcmVzdWx0cyBmb3IgJ3JlYWRlbGYgLXMnCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5yOiBOZXcgZmlsZTogRXhwZWN0ZWQgcmVzdWx0cyBmb3IgJ3JlYWRlbGYgLXInCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi53aTogTmV3IGZpbGU6IEV4cGVjdGVkIHJlc3VsdHMgZm9yICdyZWFkZWxmIC13aScKLQotV2VkIERlYyAgOSAxOToxMTozOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cCAoY29weV9leGVjdXRhYmxlKTogRXhwZWN0IGNvbXBhcmlzb24KLQlmYWlsdXJlIGZvciBtaXBzKi0qLWVsZi4KLQotRnJpIE9jdCAxNiAyMjo1NzoxMiAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogZml4ICJubyBzeW1ib2xzIiBtZXNzYWdlLgotCi1UdWUgSnVsIDI4IDE1OjE0OjA0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBLZWVwICJtYWluIiBhbmQgIl9tYWluIiBmb3Igc3RyaXAgd2l0aAotCXNhdmluZyBzeW1ib2wgdGVzdHMuICBMb29rIGZvciBlaXRoZXIgIm1haW4iIG9yICJfbWFpbiIgaW4gdGhlIG91dHB1dAotCWZpbGUuICBGaXggdGVzdCBmb3IgIm5vIHN5bWJvbHMiIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotMTk5OC0wNy0yMiAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogUG9saXNoIG91dHB1dCBhYm91dCBmYWlsIGZvciBvYmpjb3B5Ci0JKHNpbXBsZSBjb3B5KSwgc3RyaXAgd2l0aC93aXRob3V0IHNhdmluZyBhIHN5bWJvbCBmb3Igb2JqZWN0IGZpbGUKLQlhbmQgZXhlY3V0YWJsZS4KLQotV2VkIEp1bCAgMSAxNjoyNzo0MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFSTSBzaW1wbGUgb2JqY29weSBub3cgcGFzc2VzLgotCi1XZWQgSnVuIDI0IDA5OjIwOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogTG9vayBmb3IgJy5kYXRhJyByYXRoZXIgdGhhbiAnZGF0YScKLQl3aGVuIHBhcnNpbmcgb3V0cHV0IG9mIG9iamR1bXAgLWguCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IExvb2sgZm9yICcuZGF0YScgcmF0aGVyIHRoYW4gJ2RhdGEnIHdoZW4KLQlwYXJzaW5nIG91dHB1dCBvZiBzaXplIC1BLgotCi0xOTk4LTA3LTIwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5leHA6IFR3byBuZXcgdGVzdHMgLSBzdHJpcCBvYmplY3QgZmlsZSB3aXRoIHNhdmluZyBhCi0Jc3ltYm9sIGFuZCBzdHJpcCBleGVjdXRhYmxlIGZpbGUgd2l0aCBzYXZpbmcgYSBzeW1ib2wuCi0KLUZyaSBNYXkgMjkgMTQ6NTA6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERvbid0IHhmYWlsIHRoZSBzaW1wbGUgb2JqY29weSB0ZXN0Ci0Jd2hlbiBjcm9zcyBjb21waWxpbmcuCi0KLVRodSBOb3YgIDYgMTQ6MzI6MzcgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwOiBUZW1wb3JhcnkgZGVmaW5pdGlvbiBvZiB0YXJnZXRfYXNzZW1ibGUgYW5kCi0gCWRlZmF1bHRfdGFyZ2V0X2Fzc2VtYmxlIHNvIHRoYXQgdGVzdGluZyBjYW4gd29yayB3aXRoIG9sZGVyCi0gCWRlamFnbnUgdmVyc2lvbnMuCi0KLVdlZCBTZXAgMjQgMTI6MDk6MTUgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cChzdHJpcF9leGVjdXRhYmxlKTogTWFrZSBhIG5ldyBjb3B5IG9mCi0gCXRoZSBleGVjdXRhYmxlIGJlaW5nIHRlc3RlZC4KLQotTW9uIFNlcCAxNSAyMToyNToyMCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBDb21waWxlIHRoZSBleGVjdXRhYmxlcyB0byBiZSB0ZXN0ZWQKLSAJb24gdGhlIHRhcmdldCB3aXRoIGEgc3RhdHVzIHdyYXBwZXIgKGFzIG5lY2Vzc2FyeSkuCi0KLQkqIGJpbnV0aWxzLWFsbC9hci5leHA6IElmIHRlc3Rpbmcgb24gYSByZW1vdGUgaG9zdCwgZG9uJ3QgYm90aGVyCi0gCWxvb2tpbmcgb24gdGhlIGxvY2FsIGhvc3QgZm9yIHRoZSBwcm9ncmFtIGJlaW5nIHRlc3RlZC4gVXNlIHRoZQotIAljb3JyZWN0IGZpbGVuYW1lcyBvbiB0aGUgcmVtb3RlIGhvc3QuCi0KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IERpdHRvLgotCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IERpdHRvLgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IERpdHRvLgotIAkoY3B1c19leHBlY3RlZCk6IEFkZCB0aGUgdGFyZ2V0IENQVSB0byB0aGUgcmVnZXhwIG9mIENQVXMgdG8gYmUKLSAJZXhwZWN0ZWQsIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuCi0KLVRodSBBdWcgMjggMDk6NTc6MjcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwIChjcHVzX2V4cGVjdGVkKTogQWRkIGFyYy4KLQotVHVlIEF1ZyAgNSAwMDowMzoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogTG9vayBmb3Igbm0tbmV3IGFuZCBzdHJpcC1uZXcuCi0KLVR1ZSBKdW4gIDMgMTc6MTI6NTQgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVtb3ZlIGV4cGVjdF9iZWZvcmUgc3RhdGVtZW50LgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERvbid0IHVzZSBnbG9iYWwgZXhlY19vdXRwdXQgdmFyaWFibGU7Ci0gCXRoZSBvdXRwdXQgaXMgcmV0dXJuZWQgZnJvbSByZW1vdGVfbG9hZCBpbnN0ZWFkLgotCi1Nb24gTWF5IDEyIDIyOjE0OjIwIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHAoc3RyaXBfdGVzdCk6IFRlc3RzIHRoYXQKLQlmYWlsIHRvIGNvbXBpbGUgYXJlIHVudGVzdGVkLCBub3QgdW5yZXNvbHZlZC4KLQkoY29weV9zZXR1cCk6IERpdHRvLgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cChkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlKTogQ2FsbAotCXRhcmdldF9hc3NlbWJsZSBpbnN0ZWFkIG9mIHRhcmdldF9jb21waWxlLgotCi1XZWQgQXByIDMwIDIwOjM3OjUxIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyB0byBzdXBwb3J0IG11bHRpbGliIGFuZCByZW1vdGUgaG9zdGVkIHRlc3RpbmcsIGFsb25nIHdpdGgKLSAJZ2VuZXJhbCBjbGVhbnVwcyBhbmQgc2ltcGxpZmljYXRpb25zLgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cChiaW51dGlsX3ZlcnNpb24pOiBVc2UgcmVtb3RlX2V4ZWMuCi0JKGRlZmF1bHRfYmludXRpbHNfcnVuKTogRGl0dG8uCi0JKGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUpOiBSZW1vdmUgZmlyc3QgYXJndW1lbnQ7IGNhbGwKLSAJdGFyZ2V0X2NvbXBpbGUgdG8gYWN0dWFsbHkgZG8gdGhlIGFzc2VtYmx5LgotCShkZWZhdWx0X2JpbnV0aWxzX2NvbXBpbGUsZGVmYXVsdF9iaW51dGlsc19yZW1vdmUscHJ1bmVfd2FybmluZ3MpOgotIAlEZWxldGUuCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVtb3ZlIEFTIGFuZCBBU0ZMQUdTLgotCShiaW51dGlsc19jb21waWxlLGJpbnV0aWxzX3JlbW92ZSk6IERlbGV0ZS4KLQkoYmludXRpbHNfYXNzZW1ibGUpOiBSZW1vdmUgZmlyc3QgYXJndW1lbnQuCi0KLQkqIGJpbnV0aWxzLWFsbC9hci5leHA6IFNlZSBpZiB3ZSdyZSBydW5uaW5nIHRoZSB0ZXN0cyBvbgotCWEgcmVtb3RlIGhvc3QsIGFuZCBkb3dubG9hZC91cGxvYWQgZmlsZXMgYXMgYXBwcm9wcmlhdGUuCi0JUmVwbGFjZSBjYWxscyB0byBiaW51dGlsc19yZW1vdmUgd2l0aCByZW1vdGVfZmlsZS4gUmVwbGFjZQotCWNhbGxzIHRvIGJpbnV0aWxzX2NvbXBpbGUgd2l0aCB0YXJnZXRfY29tcGlsZS4gUmVtb3ZlIGluaXRpYWwKLQlhcmd1bWVudCB0byBiaW51dGlsc19hc3NlbWJsZS4gVXNlIHJlbW90ZV9sb2FkIHRvIGV4ZWN1dGUKLQlwcm9ncmFtcyBvbiB0aGUgdGFyZ2V0LgotCSogYmludXRpbHMtYWxsL25tLmV4cDogRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6ICBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogIERpdHRvLgotCSogYmludXRpbHMtYWxsL3NpemUuZXhwOiBEaXR0by4KLQotTW9uIEFwciAxNCAxMjozNjo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9hci5leHAgKGxvbmdfZmlsZW5hbWVzKTogQ2hlY2sgZm9yIGEgZmlsZSBzeXN0ZW0KLQl3aXRoIGEgMTQgY2hhcmFjdGVyIGZpbGUgbmFtZSBsZW5ndGggbGltaXQuCi0KLVR1ZSBBcHIgIDEgMDk6NTI6MTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IEhhbmRsZSBkMTB2LgotCi1GcmkgRmViICA3IDE2OjQ1OjM0IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvYXIuZXhwOiBVc2UgcHJ1bmVfd2FybmluZ3MgaW5zdGVhZCBvZgotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBEaXR0by4KLQotV2VkIEphbiAyOSAwMDoxNjo0MyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL25tLmV4cDogVXNlIC8gYmV0d2VlbiAkc3JjZGlyIGFuZCAkc3ViZGlyLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IERpdHRvLgotCSogYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHA6IERpdHRvLgotCQotCi1XZWQgT2N0IDE2IDIyOjU3OjU5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBBZGQgbW4xMDIwMCBhbmQgbW4xMDMwMCB0byBleHBlY3RlZAotCWNwdXMgbGlzdC4KLQotVHVlIE9jdCAgMSAxNTowNjo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChiaW51dGlsX3ZlcnNpb24pOiBGaXggZm9yIGN1cnJlbnQgdmVyc2lvbgotCXByaW50aW5nLgotCi1TdW4gQXVnICA0IDIyOjI1OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBGaXggZW5kIG9mIGxpbmUgbWF0Y2hpbmcgaW4gc3JlYyB0ZXN0cwotCXRvIHdvcmsgd2l0aCBUQ0wgNy41LgotCi1TYXQgSnVuIDI5IDEyOjUxOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBTaW1wbGUgY29weSB0ZXN0IHdvcmtzIGZvciBpOTYwIGIub3V0Ci0JdGFyZ2V0cy4KLQotTW9uIEp1biAyNCAxNDozMzowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogT24gT1NGLzEsIHRoZSBzaW1wbGUgY29weSB0ZXN0IHdpbGwKLQlzdWNjZWVkIHdpdGggZ2FzLCBhbmQgZmFpbCB3aXRoIC9iaW4vYXMsIHNvIG1hcmsgaXQgYXMgYW4gZXhwZWN0ZWQKLQlmYWlsdXJlIG9ubHkgaWYgaXQgZmFpbHMuCi0KLVR1ZSBNYXIgMjYgMTY6NTU6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IE5vIGxvbmdlciBleHBlY3QgYWRqdXN0LXNlY3Rpb24tdm1hCi0JdGVzdCB0byBmYWlsIGZvciBocHBhKi0qLXByb2VsZiouCi0KLU1vbiBNYXIgMTEgMDg6MjU6MTQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IExvb2sgZm9yICIkQ09ERSQiLCBub3QganVzdCAiQ09ERSIuCi0KLVdlZCBKYW4gMzEgMTE6NTU6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEV4cGVjdCBhZGp1c3Qtc2VjdGlvbi12bWEgdGVzdHMgdG8KLQlmYWlsIGZvciBocHBhKi0qLXByb2VsZiogdGFyZ2V0cy4KLQotVGh1IEphbiAyNSAxMzo1MzowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogVXBkYXRlIGZvciBvYmpkdW1wIC1oIGZvcm1hdCBjaGFuZ2UuCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IExpa2V3aXNlLgotCi1Nb24gSmFuIDE1IDE4OjE0OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBVc2UgdGhlIGxtYSwgbm90IHRoZSB2bWEsIHdoZW4gdGVzdGluZwotCWFkZHJlc3MgYWRqdXN0bWVudHMuCi0KLUZyaSBEZWMgMTUgMTY6MzE6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IFVwZGF0ZSBvYmpkdW1wIC1pIHRlc3QgZm9yIGN1cnJlbnQKLQlvYmpkdW1wIG91dHB1dC4KLQotTW9uIE5vdiAyNyAxNToxNTowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ29ycmVjdCBmYWlsIGNhbGxzIHRvIGFsd2F5cyB1c2UgdGhlCi0Jc2FtZSBzdHJpbmcgYXMgdGhlIHBhc3MgY2FsbC4KLQotV2VkIE5vdiAyMiAxMzoxODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChwcnVuZV9zeXN0ZW1fY3J1ZCk6IERpc2NhcmQgLWcgLU8gd2FybmluZ3MKLQlmcm9tIG5hdGl2ZSBjb21waWxlcnMgb24gT1NGLzEgYW5kIFN1bk9TLgotCi1GcmkgTm92IDE3IDEwOjM2OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfY29tcGlsZXI6IENoYW5nZSBlcnJvcgotCW1lc3NhZ2UgdG8gc2F5IGNvbXBpbGF0aW9uIHJhdGhlciB0aGFuIGFzc2VtYmx5LgotCi1XZWQgTm92IDE1IDE4OjM0OjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IFNpbXBsZSBjb3B5IHRlc3QgZG9lcyBhcHBlYXIgdG8gd29yawotCW9uIGkqODYtc3ZyNC4KLQotV2VkIE5vdiAxNSAxMjoxOToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogSWYgYXNzZW1ibHkgZmFpbHMsIGNhbGwgdW5yZXNvbHZlZC4KLQlUZXN0IHJ1bm5pbmcgb2JqY29weSBhbmQgc3RyaXAgb24gYSBmaW5hbCBleGVjdXRhYmxlLgotCSogYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL2RlZmF1bHQuZXhwIChTVFJJUCwgU1RSSVBGTEFHUyk6IERlZmluZS4KLQkoYmludXRpbHNfY29tcGlsZSk6IE5ldyBwcm9jZWR1cmUuCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoZGVmYXVsdF9iaW51dGlsc19jb21waWxlKTogTmV3IHByb2NlZHVyZS4KLQotRnJpIE5vdiAgMyAxMzoyMjozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX3J1bik6IERvbid0IHVzZSB2ZXJib3NlCi0JLWxvZywgcmV2ZXJ0aW5nIHBhcnQgb2YgT2N0IDIgY2hhbmdlLgotCi1XZWQgTm92ICAxIDE1OjA5OjU3IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yCi0JbTY4Ki1tb3Rvcm9sYS1zeXN2KiBhbmQgbTg4Ki1tb3Rvcm9sYS1zeXN2Ki4KLQotV2VkIE9jdCAgNCAxNDozODozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIFhDT0ZGLgotCi1Nb24gT2N0ICAyIDEyOjQxOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL2FyLmV4cDogTmV3IGZpbGUuCi0JKiBiaW51dGlscy1hbGwvYmludGVzdC5zOiBNYWtlIHRleHRfc3ltYm9sIGFuZCBkYXRhX3N5bWJvbCBnbG9iYWwuCi0JQWRkIG5ldyBzdGF0aWMgc3ltYm9scyBzdGF0aWNfdGV4dF9zeW1ib2wgYW5kIHN0YXRpY19kYXRhX3N5bWJvbC4KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IEFkanVzdCBhY2NvcmRpbmdseS4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCAoQVIpOiBTZXQgaWYgbm90IHNldC4KLQkoYmludXRpbHNfcmVtb3ZlKTogTmV3IHByb2NlZHVyZS4KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX3J1bik6IENhbGwKLQlwcnVuZV9zeXN0ZW1fY3J1ZCBvbiBwcm9ncmFtIG91dHB1dC4gIFVzZSB2ZXJib3NlIC1sb2cgaW5zdGVhZCBvZgotCWJvdGggdmVyYm9zZSBhbmQgc2VuZF9sb2cuCi0JKGRlZmF1bHRfYmludXRpbHNfcmVtb3ZlKTogTmV3IHByb2NlZHVyZS4KLQotCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUpOiBDYWxsCi0JcHJ1bmVfc3lzdGVtX2NydWQgb24gYXNzZW1ibGVyIG91dHB1dC4KLQotVHVlIFNlcCAyNiAxNDowNzowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3Igc2ltcGxlIGNvcHkgdGVzdAotCWZvciBpMzg2IENPRkYgdGFyZ2V0cy4KLQotV2VkIFNlcCAxMyAxMzoyMDoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChwcnVuZV9zeXN0ZW1fY3J1ZCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZCBvbiBjbXAgb3V0cHV0LgotCi1TYXQgQXVnIDE5IDE3OjM4OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgeGZhaWwgZm9yIGkqODYtKi1hb3V0KiBmb3Igc2ltcGxlCi0JY29weSB0ZXN0LgotCi1XZWQgQXVnIDE2IDE2OjUyOjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL25tLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBtaXBzKi1zb255LWJzZCogZm9yCi0JdGVzdHMgd2hpY2ggZmFpbCBvbiBFQ09GRiB0YXJnZXRzLgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IENoYW5nZSBpKjg2LSotbGludXggeGZhaWwgZm9yIHNpbXBsZQotCWNvcHkgdGVzdCB0byBjaGVjayBmb3IgaSo4Ni0qLWxpbnV4YW91dCogaW5zdGVhZC4KLQotVHVlIEF1ZyAgOCAxNzo0ODozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBhMjlrLSotdnh3b3JrcyoKLQlmb3Igc2ltcGxlIGNvcHkgdGVzdC4KLQotVHVlIEp1bCAyNSAxMTo1NzoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ2hhbmdlIHNldHVwX3hmYWlsIGZvciBzaW1wbGUgY29weQotCXRlc3QgZnJvbSBpOTYwLSotdnh3b3JrczUuMSB0byBpOTYwLSotdnh3b3JrcyouCi0KLU1vbiBKdWwgMTAgMTI6MjU6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgejgqLSotY29mZiBmb3IKLQlzaW1wbGUgY29weSB0ZXN0LgotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwIChjcHVzX2V4cGVjdGVkKTogQWRkIHo4MDAxIGFuZCB6ODAwMi4KLQotU3VuIE1heSAyMSAyMDozMjo1MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAgKGFkZGVuZGJ1Zyk6IEhhbmRsZSBQQSBFTEYgdGFyZ2V0cwotCXRvby4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cCAoc2ltcGxlIGNvcHkpOiBEb24ndCBleHBlY3QgUEEgRUxGCi0JdGFyZ2V0cyB0byBmYWlsLgotCi1UdWUgQXByICA0IDE0OjUyOjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiaW51dGlscy1hbGwvaHBwYTogUmVuYW1lZCBmcm9tIGJpbnV0aWxzLWhwcGEuCi0KLVdlZCBNYXIgMjkgMTI6MDI6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2ltcGxlIGNvcHkgdGVzdAotCWZvciBoODUwMC0qLWhtcyBhbmQgaDg1MDAtKi1jb2ZmLgotCi1UdWUgTWFyIDI4IDExOjE4OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHNpbXBsZSBjb3B5IHRlc3QKLQlmb3IgbTY4Ki1lcmljc3Nvbi1vc2UgYW5kIG04OCotKi1jb2ZmLgotCi1Nb24gTWFyIDI3IDExOjI3OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHNpbXBsZSBjb3B5IHRlc3QKLQlmb3IgbTY4Ki0qLXZ4d29ya3MqLgotCi1GcmkgTWFyIDI0IDExOjQ0OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtaHBwYS9vYmpkdW1wLmV4cDogQ29ycmVjdCBocHBhKi0qLSogY2hlY2suCi0KLVR1ZSBNYXIgMjEgMTA6NDg6NDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJpbnV0aWxzLWhwcGEvYWRkZW5kYnVnLnM6IE5ldyB0ZXN0Y2FzZS4KLQkqIGJpbnV0aWxzLWhwcGEvb2JqZHVtcC5leHA6IFJ1biBpdC4KLQotTW9uIE1hciAyMCAxMTozMTowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX3J1bik6IFF1b3RlIGFueSBkb2xsYXIgc2lnbnMKLQlpbiBwcm9nYXJncyBiZWZvcmUgcGFzc2luZyBpdCB0byBleGVjLgotCi1GcmkgTWFyIDE3IDE2OjM5OjMxIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvaHBwYS5zZWQ6IFNlZCBzY3JpcHQgdG8gdHJhbnNmb3JtIGJpbnRlc3QucyBpbnRvIHByb3BlcgotCVBBIGFzc2VtYmx5IGNvZGUuCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBFbmFibGUgdGhlc2UgdGVzdHMgb24gdGhlIFBBLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBFbmFibGUgdGhlc2UgdGVzdHMgb24gdGhlIFBBLiAgRXhwZWN0Ci0Jc2ltcGxlIGNvcHkgdG8gZmFpbC4KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogRW5hYmxlIHRoZXNlIHRlc3RzIG9uIHRoZSBQQS4gIEhhbmRsZQotCSJDT0RFIiBhcyBhIHNlY3Rpb24gbmFtZS4KLQkqIGJpbnV0aWxzLWFsbC9zaXplLmV4cDogRW5hYmxlIHRoZXNlIHRlc3RzIG9uIHRoZSBQQS4KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlKTogRm9yICJocHBhKi0qLSoiLAotCXJ1biB0aGUgYXNzZW1ibHkgdGhyb3VnaCBhIHNlZCBzY3JpcHQgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlCi0JYXNzZW1ibGVyLgotCi1XZWQgTWFyIDE1IDE2OjQ3OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBGb3JjZSBzZWN0aW9uIHNpemVzIHRvIGJlIGludGVycHJldGVkCi0JaW4gaGV4LiAgQ2hhbmdlIG9iamR1bXAgLWggZmFpbHVyZSBtb2RlIHRvIGFsd2F5cyB1c2UgdGhlIHNhbWUKLQlzdHJpbmcuCi0KLVRodSBKYW4gIDUgMTM6MDE6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBKdXN0IGNoZWNrIGZvciBpcml4NCosIHJhdGhlciB0aGFuCi0JaXJpeFxbMC00XF0qLCB0byBhdm9pZCBEZWphR251IGJ1Zy4KLQotVGh1IERlYyAxNSAxOTozNTozMSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEV4cGVjdCBzaW1wbGUtb2JqY29weSB0ZXN0IHRvIGZhaWwKLQlmb3IgdmFyaW91cyBvdGhlciB0YXJnZXRzIGZvciB3aGljaCBnYXMgZG9lc24ndCB1c2UgYmZkOiBzaC1obXMsCi0JbTY4ay1ocHV4LCBtNjhrLXN1bm9zLCBtNjhrLWNvZmYsIGkzODYtbGludXgsIGEyOWstdWRpLCBhMjlrLWNvZmYsCi0JaTk2MC12eHdvcmtzNS4xLCBpOTYwLWNvZmYsIGg4MzAwLWhtcywgaDgzMDAtY29mZi4KLQotV2VkIERlYyAxNCAxNTo1NDo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IFNraXAgdGVzdHMgcmVxdWlyaW5nIGJpbnRlc3QubyBvbiBocHBhLAotCXNpbmNlIGl0IChjb3JyZWN0bHkpIGdlbmVyYXRlcyBzeW50YXggZXJyb3JzIG9uIHRoYXQgcGxhdGZvcm0uCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IERpdHRvLgotCSogYmludXRpbHMtYWxsL25tLmV4cDogRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERpdHRvLiAgQWxzbywgbW92ZSBzZXR1cF94ZmFpbCBmb3IKLQlzaC1jb2ZmIHRvIGJyYW5jaCB3aGVyZSBvYmpjb3B5IGV4ZWN1dGlvbiBwcm9kdWNlZCBubyBlcnJvcgotCW1lc3NhZ2VzLiAgRXhwZWN0IGZhaWx1cmUgZm9yIGhwMzAwIGFsc28uCi0KLVRodSBEZWMgIDggMTQ6MzY6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwIChjcHVzX2V4cGVjdGVkKTogTmV3IHZhcmlhYmxlLCB0YWtlbgotCWZyb20gb2JqZHVtcCAtaSB0ZXN0LCBhZGRlZCBuczMyayBhbmQgcG93ZXJwYywgc29ydGVkLgotCShvYmpkdW1wIC1pLCAtZiB0ZXN0cyk6IFVzZSAkY3B1c19leHBlY3RlZC4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBGb3Igc2ltcGxlLWNvcHkgdGVzdCwgZXhwZWN0IGZhaWx1cmUKLQlmb3Igc2gtY29mZi4KLQotVHVlIE9jdCAyNSAxNjowMDoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRqdXN0IC0tYWRqdXN0LXNlY3Rpb24tdm1hIHRlc3RzIGZvcgotCW5ldyBTLXJlY29yZCBzZWN0aW9uIGhhbmRsaW5nLgotCi1UdWUgT2N0IDE4IDExOjE4OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL25tLmV4cDogbm0gd2l0aCBubyBhcmd1bWVudHMgYW5kIG5tIC1QIGRvIG5vdCB3b3JrCi0JYXMgZXhwZWN0ZWQgb24gRUNPRkYgdGFyZ2V0czsgYWRkIGNhbGxzIHRvIHNldHVwX3hmYWlsLgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IE5ldyBmaWxlLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBJbml0aWFsaXplIE9CSkNPUFkgYW5kIE9CSkNPUFlGTEFHUy4KLQotRnJpIE9jdCAxNCAxNDo0NjoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQlSZXdyaXRlIHRlc3RzdWl0ZS4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IFJlbW92ZS4KLQkqIGJpbnV0aWxzLWFsbC9jb25maWd1cmUuaW4sIGJpbnV0aWxzLWFsbC9NYWtlZmlsZS5pbjogUmVtb3ZlLgotCSogYmludXRpbHMtYWxsL2JpbnRlc3QuYzogUmVtb3ZlLgotCSogYmludXRpbHMtYWxsL2JpbnRlc3QuczogTmV3IGZpbGUuCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwLCBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IFJld3JpdGUuCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IFJld3JpdGUuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IExvYWQgdXRpbHMtbGliLmV4cC4gIFNldCBBUyBhbmQgQVNGTEFHUy4KLQlEb24ndCBnbyB1cCBvbmUgZGlyZWN0b3J5IGZyb20gJGJhc2VfZGlyLiAgQ3JlYXRlIHRtcGRpci4KLQkoYmludXRpbHNfcnVuLCBiaW51dGlscy1hc3NlbWJsZSk6IE5ldyBwcm9jZWR1cmVzLgotCSogY29uZmlnL3VuaXguZXhwOiBSZW1vdmUuCi0JKiBjb25maWcvbXQtYTI5ay11ZGksIGNvbmZpZy9tdC1pMzg2LWFvdXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC1pOTYwLW5pbmR5LCBjb25maWcvbXQtbHlueCwgY29uZmlnL210LW02OGs6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC1taXBzLWVjb2ZmLCBjb25maWcvbXQtc2xpdGU6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC1zcGFyYy1hb3V0LCBjb25maWcvbXQtdnh3b3JrczogUmVtb3ZlLgotCSogbGliL3V0aWxzLWxpYi5leHAgKGJpbnV0aWxfdmVyc2lvbik6IERvbid0IHJlZGlyZWN0IHN0YW5kYXJkCi0JaW5wdXQgd2hlbiBnZXR0aW5nIHZlcnNpb24uICBEb24ndCB1bnNldCBlcnJvckluZm8uCi0JKGRlZmF1bHRfYmludXRpbHNfcnVuKTogTmV3IHByb2NlZHVyZS4KLQkoZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZSk6IE5ldyBwcm9jZWR1cmUuCi0KLVRodSBTZXAgMjkgMTI6NDU6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBWTVMgZG9lcyBub3QgcGVybWl0IGAuJyBpbiBkaXJlY3RvcnkgbmFtZXM6IHJlbmFtZWQgYmludXRpbHMuYWxsCi0JdG8gYmludXRpbHMtYWxsLgotCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogQ2hhbmdlIGJpbnV0aWxzLmFsbCB0byBiaW51dGlscy1hbGwuCi0KLUZyaSBTZXAgMjMgMTY6MDE6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtdC1tNjhrIGZvciBtNjhrKi0qLWFvdXQqIGFuZCBtNjhrKi0qLWNvZmYqLAotCW5vdCBmb3IgbTY4ay0qLSouCi0KLUZyaSBTZXAgMjMgMTM6NTQ6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMuYWxsL29iamR1bXAuZXhwOiBBZGRlZCBBUk0gdG8gbGlzdCBvZiBDUFUgdHlwZXMuCi0KLVRodSBTZXAgMjIgMTE6MDQ6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IFVwZGF0ZSBmb3IgbmV3IHVzYWdlIG1lc3NhZ2UuCi0JKiBiaW51dGlscy5hbGwvc2l6ZS5leHA6IFVzZSBhIGRvdWJsZSBiYWNrc2xhc2ggaW4gdGhlIHN0cmluZyB0bwotCWdldCBhIHNpbmdsZSBiYWNrc2xhc2ggdG8gdGhlIHJlZ2V4cCBtYXRjaGVyLiAgQWNjZXB0ICRURVhUJCwKLQkkREFUQSQgYW5kICRCU1MkIGFzIHdlbGwgYXMgLnRleHQsIC5kYXRhIGFuZCAuYnNzLCBmb3IgSFAvVVguCi0KLUZyaSBTZXAgIDIgMTI6NTM6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdW5peC5leHA6IElmIG5tLm5ldyBkb2VzIG5vdCBleGlzdCwgdXNlIFt0cmFuc2Zvcm0gbm1dLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAyNCAxMjo0MTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgYmludXRpbHMuYWxsL2NvbmZpZ3VyZS5pbjogQ2hhbmdlIGkzODYgdG8KLQlpWzM0NV04Ni4KLQotVHVlIEp1bCAxOSAxNToyMzo1MyAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC1taXBzLWVjb2ZmOiBBZGQgLVRpZHAubGQgb3B0aW9uLgotCi1UaHUgSnVuIDMwIDEyOjQxOjU1IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBVc2Ugbm0ubmV3LCBub3Qgbm0sIGZyb20gbmV3bHkgYnVpbHQgdHJlZS4KLQotVHVlIE1heSAxNyAxNDowNDowNSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCwgY29uZmlnL3VuaXguZXhwOiBSZXBsYWNlIGVycm9yCi0JICBwcm9jIGNhbGxzIHdpdGggcGVycm9yLgotCi1UdWUgTWF5IDEwIDExOjIwOjU0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChzcGFyY2xpdGUpOiBNYXRjaCBvbiBzcGFyY2xpdGUqLSotKi4KLQotV2VkIEFwciAxMyAxODoyNToxOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdW5peC5leHA6IFVzZSBubS5uZXcsIG5vdCBubSwgZnJvbSBuZXdseSBidWlsdCB0cmVlLgotCi0JKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IEFkZCBtb3JlIHdpbGRjYXJkcyB0byBsaXN0IG9mCi0Jc2luZ2xlLWxldHRlciBvcHRpb25zIGluIHBhdHRlcm4gZm9yIHVzYWdlIG1lc3NhZ2UuCi0KLQkqIGJpbnV0aWxzLmFsbC9ubS5leHA6IERlbGV0ZWQgZGVidWctc3ltYm9scyB0ZXN0LCBzaW5jZSBpdCBvbmx5Ci0Jd29ya3MgZm9yIGEub3V0L3N0YWJzIHN5c3RlbXMuICBGaXhlZCByZWdleHBzIHRvIG1ha2UgdW5kZXJzY29yZXMKLQlvcHRpb25hbCwgc2luY2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndCBwcmVwZW5kIHRoZW0uICBEZWxldGVkCi0JY2hlY2sgZm9yIGZvby5vIHN5bWJvbCwgc2luY2UgYWdhaW4gc29tZSBzeXN0ZW1zIGRvbid0IGdlbmVyYXRlCi0JaXQuCi0KLU1vbiBBcHIgMTEgMTA6MzE6MDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBTZXQgVENMX0xJQlJBUlkgZm9yIHJ1bnRlc3QuCi0KLU1vbiBGZWIgMTQgMTk6MzQ6MDMgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVXNlIG5ldyBjb25maWcgZmVhdHVyZXMgb2YgRGVqYUdudSBpbiBzaXRlLmV4cAotCWZpbGUuICJNYWtlIGNoZWNrIiBzaG91bGQgbm93IHdvcmsgZm9yIGFsbCBjcm9zc2VzLgotCi1GcmkgSmFuIDI4IDE4OjAwOjI5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogSW4gdXNhZ2UgbWVzc2FnZSwgYWNjZXB0Ci0JInNlY3Rpb24tbmFtZSIgYXMgd2VsbCBhcyAic2VjdGlvbl9uYW1lIi4KLQotTW9uIEphbiAxNyAxNjo1NzowMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IFRyaW0gbGlzdCBvZiBmb3JtYXQgbmFtZXMgZXhwZWN0ZWQsCi0JYW5kIGFjY2VwdCBhbnkga25vd24gQ1BVIHR5cGUuCi0KLVRodSBEZWMgIDIgMjA6NTA6MjQgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHNvbWUgc3R1ZmYgZnJvbSB0aGUgc2l0ZS5leHAgZmlsZS4KLQkqIGNvbmZpZy91bml4LmV4cDogQWRkIGdsb2JhbCBiZWZvcmUgc2VlaW5nIGlmIHRoZSB2YXJpYWJsZXMgZm9yCi0Jbm0sIG9iamR1bXAsIGFuZCBzaXplIGV4aXN0LgotCi1XZWQgTm92ICAzIDExOjEyOjMyIDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3VkaS5leHAsdW5peC5leHA6IFRyYW5zZm9ybSB0b29sIG5hbWUuCi0JKiBiaW51dGlscy5hbGwvKi5leHA6IENsZWFyIGVycm9ySW5mbyBhZnRlciBleGVjLgotCi1GcmkgSnVsICAyIDEyOjQxOjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMuYWxsLyouZXhwOiBVc2UgLS0gZm9yIGxvbmcgYXJndW1lbnRzIHJhdGhlciB0aGFuICsuCi0KLUZyaSBKdW4gIDQgMTA6NTI6MjkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGNoYW5nZSBzcmN0cmlnZ2VyIHRvIE1ha2VmaWxlLmluIAotCi1XZWQgTWF5IDI2IDE3OjI3OjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gQ0MgYW5kIENGTEFHUy4KLQotRnJpIE1heSAgNyAxMzo1ODo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogVXBkYXRlIGZvciBuZXcgdXNhZ2UgbWVzc2FnZS4KLQotTW9uIEFwciAxOSAxNDowODo1MiAxOTkzICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLmFsbC8qLmV4cDogVXNlIHRoZSBuZXcgdXRpbF90ZXN0IHByb2MuCi0JKiBNYWtlZmlsZS5pbjogQ3JlYXRlIGEgbG9jYWwgc2l0ZS5leHAgZmlsZSB3aXRoIGNvbmZpZyBpbmZvLgotCi1UaHUgTWFyIDI1IDA1OjM4OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBubS5hbGwvY29uZmlndXJlLmluIChzcmNuYW1lKTogRGVsZXRlIGV4dHJhIHF1b3RlLgotCi1Nb24gRmViIDIyIDA3OjU0OjAzIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBiaW51dGlscy90ZXN0c3VpdGU6IG1hZGUgbW9kaWZpY2F0aW9ucyB0byB0ZXN0Y2FzZXMsIGV0Yy4sIHRvIGFsbG93Ci0gICAgICAgIHRoZW0gdG8gd29yayBwcm9wZXJseSAgZ2l2ZW4gdGhlIHJlb3JnYW5pemF0aW9uIG9mIGRlamEtZ251IGFuZCB0aGUKLSAgICAgICAgcmVsb2NhdGlvbiBvZiB0aGUgdGVzdGNhc2VzIGZyb20gZGVqYS1nbnUgdG8gYSAidG9vbCIgc3ViZGlyZWN0b3J5LgotCi1TdW4gRmViIDIxIDEwOjU1OjU1IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogSW5pdGlhbCBjcmVhdGlvbiBvZiBiaW51dGlscy90ZXN0c3VpdGUuCi0JTWlncmF0ZWQgZGVqYWdudSB0ZXN0Y2FzZXMgYW5kIHN1cHBvcnQgZmlsZXMgZm9yIHRlc3Rpbmcgbm0gdG8KLQliaW51dGlscy90ZXN0c3VpdGUgZnJvbSBkZWphLWdudS4gIFRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgotCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4gIFRoaXMgbWlncmF0aW9uIGlzIHBhcnQgb2YgYSBtYWpvciBvdmVyaGF1bAotCW9mIGRlamFnbnUuICBUaGUgbW9kaWZpY2F0aW9ucyB0byB0aGVzZSB0ZXN0Y2FzZXMsIGV0Yy4sIHdoaWNoCi0Jd2lsbCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgbmV3IHZlcnNpb24gb2YgZGVqYWdudSB3aWxsIGJlCi0JbWFkZSBpbiBhIGZ1dHVyZSB1cGRhdGUuCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYXIuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9hci5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzhjNmIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9hci5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRBUl0gPT0gMH0gdGhlbiB7Ci0gICAgICAgIHBlcnJvciAiJEFSIGRvZXMgbm90IGV4aXN0IgotICAgICAgICByZXR1cm4KLSAgICB9Ci19Ci0KLSMgc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJEFSXSIKLQotIyBUZXN0IGxvbmcgZmlsZSBuYW1lIHN1cHBvcnQKLQotcHJvYyBsb25nX2ZpbGVuYW1lcyB7IH0gewotICAgIGdsb2JhbCBBUgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNldCB0ZXN0bmFtZSAiYXIgbG9uZyBmaWxlIG5hbWVzIgotCi0gICAgc2V0IG4xICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEiCi0gICAgc2V0IG4yICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejIiCi0gICAgc2V0IGZpbGUxIHRtcGRpci8kbjEKLSAgICBzZXQgZmlsZTIgdG1wZGlyLyRuMgotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlICRmaWxlMQotCi0gICAgIyBTb21lIGZpbGUgc3lzdGVtcyB0cnVuY2F0ZSBmaWxlIG5hbWVzIGF0IDE0IGNoYXJhY3RlcnMsIHdoaWNoCi0gICAgIyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHJ1biB0aGlzIHRlc3QuICBDaGVjayBmb3IgdGhhdCBub3cuCi0gICAgc2V0IHN0YXR1cyBbY2F0Y2ggInNldCBmIFtvcGVuIHRtcGRpci8kbjEgd10iIGVycnNdCi0gICAgaWYgeyAkc3RhdHVzICE9IDAgfSB7Ci0JdmVyYm9zZSAtbG9nICJvcGVuIHRtcGRpci8kbjEgcmV0dXJuZWQgJGVycnMiCi0JdW5zdXBwb3J0ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIHB1dHMgJGYgImZpcnN0IgotICAgIGNsb3NlICRmCi0KLQotICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSAkZmlsZTIKLQotICAgIHNldCBzdGF0dXMgW2NhdGNoICJzZXQgZiBbb3BlbiB0bXBkaXIvJG4yIHddIiBlcnJzXQotICAgIGlmIHsgJHN0YXR1cyAhPSAwIH0gewotCXZlcmJvc2UgLWxvZyAib3BlbiB0bXBkaXIvJG4yIHJldHVybmVkICRlcnJzIgotCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLSAgICBwdXRzICRmICJzZWNvbmQiCi0gICAgY2xvc2UgJGYKLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBmaWxlMSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJGZpbGUxXTsKLQlzZXQgZmlsZTIgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRmaWxlMl07Ci0Jc2V0IGRlc3QgYXJ0ZXN0LmEKLSAgICB9IGVsc2UgewotCXNldCBkZXN0IHRtcGRpci9hcnRlc3QuYQotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRkZXN0OwotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGRlc3QgJGZpbGUxICRmaWxlMiJdCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICRmaWxlMSB0bXBkaXIvJG4xCi0gICAgfQotCi0gICAgc2V0IGYgW29wZW4gdG1wZGlyLyRuMSByXQotICAgIGdldHMgJGYgc3RyaW5nCi0gICAgY2xvc2UgJGYKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiZmlyc3QiICRzdHJpbmddIHsKLQl2ZXJib3NlIC1sb2cgInJlYWRpbmcgdG1wZGlyLyRuMSByZXR1cm5lZCAkc3RyaW5nIgotCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRkZXN0OwotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkQVIgInJjICRkZXN0ICRmaWxlMSAkZmlsZTIiXQotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlIHRtcGRpci8kbjEKLSAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgdG1wZGlyLyRuMgotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAidCAkZGVzdCJdCi0gICAgcmVnc3ViICJcW1xyXG4gXHRcXSokIiAiJGdvdCIgIiIgZ290OwotICAgIGlmICFbc3RyaW5nIG1hdGNoICIkbjEqJG4yIiAkZ290XSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGZpbGUxOwotCXJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRmaWxlMjsKLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRBUiB4ICRkZXN0IgotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRBUiAieCAkZGVzdCJdCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICRuMSB0bXBkaXIvJG4xOwotCXJlbW90ZV91cGxvYWQgaG9zdCAkbjIgdG1wZGlyLyRuMjsKLQlzZXQgZmlsZTEgdG1wZGlyLyRuMQotCXNldCBmaWxlMiB0bXBkaXIvJG4yCi0gICAgfSBlbHNlIHsKLQlzZXQgZmlsZTEgJG4xCi0Jc2V0IGZpbGUyICRuMgotICAgIH0KLQotICAgIGlmICFbZmlsZSBleGlzdHMgJGZpbGUxXSB7Ci0JdmVyYm9zZSAtbG9nICIkZmlsZTEgZG9lcyBub3QgZXhpc3QiCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgaWYgIVtmaWxlIGV4aXN0cyAkZmlsZTJdIHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMiBkb2VzIG5vdCBleGlzdCIKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHNldCBmIFtvcGVuICRmaWxlMSByXQotICAgIGlmIHsgW2dldHMgJGYgbGluZV0gPT0gLTEgfHwgJGxpbmUgIT0gImZpcnN0IiB9IHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMSBjb250ZW50czoiCi0JdmVyYm9zZSAtbG9nICIkbGluZSIKLQljbG9zZSAkZgotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIGNsb3NlICRmCi0KLSAgICBzZXQgZiBbb3BlbiAkZmlsZTIgcl0KLSAgICBpZiB7IFtnZXRzICRmIGxpbmVdID09IC0xIHx8ICRsaW5lICE9ICJzZWNvbmQiIH0gewotCXZlcmJvc2UgLWxvZyAiJGZpbGUyIGNvbnRlbnRzOiIKLQl2ZXJib3NlIC1sb2cgIiRsaW5lIgotCWNsb3NlICRmCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgY2xvc2UgJGYKLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgVGVzdCBidWlsZGluZyB0aGUgc3ltYm9sIHRhYmxlLgotCi1wcm9jIHN5bWJvbF90YWJsZSB7IH0gewotICAgIGdsb2JhbCBBUgotICAgIGdsb2JhbCBBUwotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdG5hbWUgImFyIHN5bWJvbCB0YWJsZSIKLQotICAgIGlmICFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgYXJjaGl2ZSBhcnRlc3QuYQotCXNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotCXJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRhcmNoaXZlCi0gICAgfSBlbHNlIHsKLQlzZXQgYXJjaGl2ZSB0bXBkaXIvYXJ0ZXN0LmEKLQlzZXQgb2JqZmlsZSB0bXBkaXIvYmludGVzdC5vCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlIHRtcGRpci9hcnRlc3QuYQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGFyY2hpdmUgJHtvYmpmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiLS1wcmludC1hcm1hcCAkYXJjaGl2ZSJdCi0gICAgaWYgeyAhW3N0cmluZyBtYXRjaCAiKnRleHRfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgIVtzdHJpbmcgbWF0Y2ggIipkYXRhX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8ICFbc3RyaW5nIG1hdGNoICIqY29tbW9uX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIipzdGF0aWNfdGV4dF9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqc3RhdGljX2RhdGFfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKmV4dGVybmFsX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSB9IHsKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgUnVuIHRoZSB0ZXN0cy4KLQotbG9uZ19maWxlbmFtZXMKLXN5bWJvbF90YWJsZQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9iaW50ZXN0LnMgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwMDY1MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuZ2xvYmwgdGV4dF9zeW1ib2wKLQkudGV4dAotdGV4dF9zeW1ib2w6CQotc3RhdGljX3RleHRfc3ltYm9sOgotCS5sb25nCTEKLQkubG9uZwlleHRlcm5hbF9zeW1ib2wKLQkuZ2xvYmwgZGF0YV9zeW1ib2wKLQkuZGF0YQotZGF0YV9zeW1ib2w6Ci1zdGF0aWNfZGF0YV9zeW1ib2w6Ci0JLmxvbmcJMgotCS5jb21tIGNvbW1vbl9zeW1ib2wsNApkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTkzMDZmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9hZGRlbmRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGluaXRpYWxpemVfY2hhcl9zeW50YXgsQ09ERQotCS5FWFBPUlQgaW5pdGlhbGl6ZV9jaGFyX3N5bnRheCxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotaW5pdGlhbGl6ZV9jaGFyX3N5bnRheAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCWFkZGlsIEwnaXNfaWRjaGFyLSRnbG9iYWwkLTMyLCVyMjcKLQkuRVhJVAotCS5QUk9DRU5ECi1pc19pZGNoYXIJLmNvbW0gMjU2CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvZnJlZy5zIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2ZyZWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZTEwZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvZnJlZy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuTlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlmbXB5ZmFkZCxzZ2wgJWZyNEwsJWZyNFIsJWZyNVIsJWZyNUwKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMjE1NWUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICByZXR1cm4KLX0KLQotIyBUaGVzZSB0ZXN0cyBhcmUgbm90IHN1aXRhYmxlIGZvciB3aWRlIG1vZGUuCi1pZiBbaXN0YXJnZXQgaHBwYSp3LSotKl0gdGhlbiB7Ci0gIHJldHVybgotfQotCi1pZiB7W3doaWNoICRPQkpEVU1QXSA9PSAwfSB0aGVuIHsKLSAgICBwZXJyb3IgIiRPQkpEVU1QIGRvZXMgbm90IGV4aXN0IgotICAgIHJldHVybgotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkT0JKRFVNUF0iCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9hZGRlbmRidWcucyB0bXBkaXIvYWRkZW5kYnVnLm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9hZGRlbmRidWcub10KLX0gZWxzZSB7Ci0gICAgc2V0IG9iamZpbGUgdG1wZGlyL2FkZGVuZGJ1Zy5vCi19Ci0KLSMgTWFrZSBzdXJlIHRoZSBTT00gQkZEIGNvZGUgc2lnbiBleHRlbmRzIGNvbnN0YW50cyBpbiBSX0RBVEFfT1ZFUlJJREUgZml4dXBzLgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXIgJG9iamZpbGUiXQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0gIHNldCB3YW50ICIwMDAwMDAwMCBSX1BBUklTQ19EUFJFTDIxTFxbIAlcXStpc19pZGNoYXJcXCsweGZmZmZmZmUwLioiCi19IGVsc2UgewotICBzZXQgd2FudCAiMDAwMDAwMDAgUl9EUF9SRUxBVElWRVxbIAlcXStpc19pZGNoYXJcXCsweGZmZmZmZmUwLioiCi19Ci0KLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJhZGRlbmRidWcgdGVzdCIKLX0gZWxzZSB7Ci0gICAgZmFpbCAiYWRkZW5kYnVnIHRlc3QiCi19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTZXQgdXAgdGhlIHRlc3Qgb2YgZnJlZy5zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2ZyZWcucyB0bXBkaXIvZnJlZy5vXX0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvZnJlZy5vXQotfSBlbHNlIHsKLSAgICBzZXQgb2JqZmlsZSB0bXBkaXIvZnJlZy5vCi19Ci0KLSMgTWFrZSBzdXJlIHRoYXQgd2UgZ2V0IFIgZmxvYXQgcmVncyBsaWtlIHdlJ3JlIHN1cHBvc2VkIHRvCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtLWRpc2Fzc2VtYmxlICRvYmpmaWxlIl0KLQotc2V0IHdhbnQgImZtcHlmYWRkLHNnbCBmcjQsZnI0UixmcjVSLGZyNSIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJmcmVnIHRlc3QiCi19IGVsc2UgewotICAgIGZhaWwgImZyZWcgdGVzdCIKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvbm0uZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ubS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzdjNWYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ubS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJE5NXSA9PSAwfSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkTk0gZG9lcyBub3QgZXhpc3QiCi0gICAgICAgIHJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE5NXSIKLQotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgdG1wZGlyL2JpbnRlc3QubwotfQotCi0jIFRlc3Qgbm0gd2l0aCBubyBhcmd1bWVudHMuCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIEVDT0ZGIHRhcmdldHMsIGJlY2F1c2UgRUNPRkYKLSMgc3RvcmVzIG1vc3Qgc3ltYm9scyB0d2ljZSwgd2hpY2ggbWVzc2VzIHVwIHRoZSBubSBvdXRwdXQuCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotb3NmKiIgImFscGhhKi0qLW5ldHdhcmUqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotdWx0cml4KiIgIm1pcHMqLSotZWNvZmYqIiAibWlwcyotKi1pcml4NCoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi1yaXNjb3MqIiAibWlwcyotKi1zeXN2MyoiICJtaXBzKi1zb255LWJzZCoiCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIFhDT0ZGIHRhcmdldHMsIGJlY2F1c2UgWENPRkYKLSMgZG9lcyBub3QgZW50ZXIgc3RhdGljIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLXNldHVwX3hmYWlsICIqLSotYWl4KiIKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgJHRlbXBmaWxlIl0KLQotaWYgW2luZm8gZXhpc3RzIHZhcnNdIHRoZW4geyB1bnNldCB2YXJzIH0KLXdoaWxlIHtbcmVnZXhwICIoXFthLXpBLVpcXSkgKFxbYS16X1xdKl9zeW1ib2wpKC4qKSIgJGdvdCBhbGwgdHlwZSBzeW1ib2wgcmVzdF19IHsKLSAgICBzZXQgdmFycygkc3ltYm9sKSAkdHlwZQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnModGV4dF9zeW1ib2wpICE9ICJUIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnMoZGF0YV9zeW1ib2wpICE9ICJEIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhjb21tb25fc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhjb21tb25fc3ltYm9sKSAhPSAiQyIgXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZXh0ZXJuYWxfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhleHRlcm5hbF9zeW1ib2wpICE9ICJVIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhzdGF0aWNfdGV4dF9zeW1ib2wpXSBcCi0gICAgIHx8ICR2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCkgIT0gInQiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY19kYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKSAhPSAiZCJ9IHsKLSAgICBmYWlsICJubSAobm8gYXJndW1lbnRzKSIKLX0gZWxzZSB7Ci0gICAgcGFzcyAibm0gKG5vIGFyZ3VtZW50cykiCi19Ci0KLSMgVGVzdCBubSAtZwotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAtZyAkdGVtcGZpbGUiXQotCi1pZiBbaW5mbyBleGlzdHMgdmFyc10gdGhlbiB7IHVuc2V0IHZhcnMgfQotd2hpbGUge1tyZWdleHAgIihcW2Etel9cXSpfc3ltYm9sKSguKikiICRnb3QgYWxsIHN5bWJvbCByZXN0XX0gewotICAgIHNldCB2YXJzKCRzeW1ib2wpIDEKLSAgICBzZXQgZ290ICRyZXN0Ci19Ci0KLWlmIHshW2luZm8gZXhpc3RzIHZhcnModGV4dF9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGNvbW1vbl9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhleHRlcm5hbF9zeW1ib2wpXSBcCi0gICAgIHx8IFtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKV19IHsKLSAgICBmYWlsICJubSAtZyIKLX0gZWxzZSB7Ci0gICAgcGFzcyAibm0gLWciCi19Ci0KLSMgVGVzdCBubSAtUAotCi0jIFRoaXMgdGVzdCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBFQ09GRiB0YXJnZXRzLCBiZWNhdXNlIEVDT0ZGCi0jIHN0b3JlcyBtb3N0IHN5bWJvbHMgdHdpY2UsIHdoaWNoIG1lc3NlcyB1cCB0aGUgbm0gb3V0cHV0Lgotc2V0dXBfeGZhaWwgImFscGhhKi0qLW9zZioiICJhbHBoYSotKi1uZXR3YXJlKiIKLXNldHVwX3hmYWlsICJtaXBzKi0qLXVsdHJpeCoiICJtaXBzKi0qLWVjb2ZmKiIgIm1pcHMqLSotaXJpeDQqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotcmlzY29zKiIgIm1pcHMqLSotc3lzdjMqIiAibWlwcyotc29ueS1ic2QqIgotCi0jIFRoaXMgdGVzdCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBYQ09GRiB0YXJnZXRzLCBiZWNhdXNlIFhDT0ZGCi0jIGRvZXMgbm90IGVudGVyIHN0YXRpYyBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUuCi1zZXR1cF94ZmFpbCAiKi0qLWFpeCoiCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTIC1QICR0ZW1wZmlsZSJdCi0KLXNldCB3YW50ICJjb21tb25fc3ltYm9sIEMgXFswXF0qNC4qZGF0YV9zeW1ib2wgRCBcWzAtOWEtZkEtRlxdKi4qZXh0ZXJuYWxfc3ltYm9sIFUuKnN0YXRpY19kYXRhX3N5bWJvbCBkIFxbMC05YS1mQS1GXF0qLipzdGF0aWNfdGV4dF9zeW1ib2wgdCBcWzAtOWEtZkEtRlxdKi4qdGV4dF9zeW1ib2wgVCBcWzAtOWEtZkEtRlxdKiIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJubSAtUCIKLX0gZWxzZSB7Ci0gICAgZmFpbCAibm0gLVAiCi19Ci0KLSMgVGhlcmUgYXJlIGNlcnRhaW5seSBvdGhlciB0ZXN0cyB0aGF0IGNvdWxkIGJlIHJ1bi4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamNvcHkuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwZTBhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRPQkpDT1BZXSA9PSAwfSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkT0JKQ09QWSBkb2VzIG5vdCBleGlzdCIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkT0JKQ09QWV0iCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHBlcnJvciAidW5yZXNvbHZlZCAxIgotICAgIHVucmVzb2x2ZWQgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvYmludGVzdC5vOwotICAgIHNldCBjb3B5ZmlsZSB0bXBkaXIvY29weTsKLX0gZWxzZSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotICAgIHNldCBjb3B5ZmlsZSBjb3B5Ci19Ci0KLSMgVGVzdCB0aGF0IG9iamNvcHkgZG9lcyBub3QgbW9kaWZ5IGEgZmlsZSB3aGVuIGNvcHlpbmcgaXQuCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0ubyJdCi0KLWlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotICAgIGZhaWwgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLX0gZWxzZSB7Ci0gICAgc2VuZF9sb2cgImNtcCAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0ub1xuIgotICAgIHZlcmJvc2UgImNtcCAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0ubyIKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgc3JjMSB0bXBkaXIvYmludGVzdC5vCi0Jc2V0IHNyYzIgdG1wZGlyL2NvcHkubwotCXJlbW90ZV91cGxvYWQgaG9zdCAkdGVtcGZpbGUgJHNyYzE7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICR7Y29weWZpbGV9Lm8gJHNyYzI7Ci0gICAgfSBlbHNlIHsKLQlzZXQgc3JjMSAke3RlbXBmaWxlfQotCXNldCBzcmMyICR7Y29weWZpbGV9Lm8KLSAgICB9Ci0gICAgc2V0IHN0YXR1cyBbcmVtb3RlX2V4ZWMgYnVpbGQgY21wICIke3NyYzF9ICR7c3JjMn0iXTsKLSAgICBzZXQgZXhlY19vdXRwdXQgW2xpbmRleCAkc3RhdHVzIDFdOwotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgIyBPbiBzb21lIHN5c3RlbXMgdGhlIHJlc3VsdCBvZiBvYmpjb3B5IHdpbGwgbm90IGJlIGlkZW50aWNhbC4KLSAgICAjIFVzdWFsbHkgdGhpcyBpcyBqdXN0IGJlY2F1c2UgZ2FzIGlzbid0IHVzaW5nIGJmZCB0byB3cml0ZSB0aGUgZmlsZXMKLSAgICAjIGluIHRoZSBmaXJzdCBwbGFjZSwgYW5kIG1heSBvcmRlciB0aGluZ3MgYSBsaXR0bGUgZGlmZmVyZW50bHkuCi0gICAgIyBUaG9zZSBzeXN0ZW1zIHNob3VsZCB1c2Ugc2V0dXBfeGZhaWwgaGVyZS4KLQotICAgIHNldHVwX3hmYWlsICJzaC0qLWNvZmYiICJzaC0qLWhtcyIgCi0gICAgc2V0dXBfeGZhaWwgIm02OCotKi1ocHV4KiIgIm02OCotKi1zdW5vcyoiICJtNjgqLSotY29mZiIgIm02OCotKi12eHdvcmtzKiIKLSAgICBzZXR1cF94ZmFpbCAibTY4Ki1lcmljc3Nvbi1vc2UiICJtNjhrKi1tb3Rvcm9sYS1zeXN2KiIKLSAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLWxpbnV4YW91dCoiICJpKjg2LSotYW91dCoiCi0gICAgc2V0dXBfeGZhaWwgImkqODYtKi1zeXN2MyIgImkqODYtKi1pc2MqIiAiaSo4Ni0qLXNjbyoiICJpKjg2LSotY29mZiIKLSAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLWFpeCoiICJpKjg2LSotZ28zMioiICJpKjg2LSotbXNkb3MqIgotICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIiAiYTI5ay0qLWNvZmYiICJhMjlrLSotdnh3b3JrcyoiCi0gICAgc2V0dXBfeGZhaWwgImk5NjAtKi1jb2ZmIgotICAgIHNldHVwX3hmYWlsICJoODMwMC0qLWhtcyIgImg4MzAwLSotY29mZiIKLSAgICBzZXR1cF94ZmFpbCAiaDg1MDAtKi1obXMiICJoODUwMC0qLWNvZmYiCi0gICAgc2V0dXBfeGZhaWwgImhwcGEqLSotKiIKLSAgICBjbGVhcl94ZmFpbCAiaHBwYSotKi0qZWxmKiIKLSAgICBzZXR1cF94ZmFpbCAibTg4Ki0qLWNvZmYiICJtODgqLW1vdG9yb2xhLXN5c3YqIgotICAgIHNldHVwX3hmYWlsICJ6OCotKi1jb2ZmIgotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXBhc3MgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQotCSMgT24gT1NGLzEsIHRoaXMgc3VjY2VlZHMgd2l0aCBnYXMgYW5kIGZhaWxzIHdpdGggL2Jpbi9hcy4KLQlzZXR1cF94ZmFpbCAiYWxwaGEqLSotb3NmKiIKLQotCSMgVGhpcyBmYWlscyBmb3IgQ09GRiBpOTYwLXZ4d29ya3MgdGFyZ2V0cy4KLQlzZXR1cF94ZmFpbCAiaTk2MC0qLXZ4d29ya3MqIgotCi0JZmFpbCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotICAgIH0KLX0KLQotIyBUZXN0IGdlbmVyYXRpbmcgUyByZWNvcmRzLgotCi0jIFdlIG1ha2UgdGhlIHNyZWMgZmlsZW5hbWUgOC4zIGNvbXBhdGlibGUuIE5vdGUgdGhhdCB0aGUgaGVhZGVyIHN0cmluZwotIyBtYXRjaGVkIGFnYWluc3QgZGVwZW5kcyBvbiB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gVWdoLgotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgc3JlY2ZpbGUgY29weS5zcmUKLSAgICBzZXQgaGVhZGVyX3N0cmluZyBTMDBCMDAwMDYzNkY3MDc5MkU3MzcyNjVDMQotfSBlbHNlIHsKLSAgICBzZXQgc3JlY2ZpbGUgJHtjb3B5ZmlsZX0uc3JlYwotICAgIHNldCBoZWFkZXJfc3RyaW5nIFMwMTMwMDAwNzQ2RDcwNjQ2OTcyMkY2MzZGNzA3OTJFNzM3MjY1NjM5NwotfQotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtzcmVjZmlsZX0iXQotCi1pZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLSAgICBmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi19IGVsc2UgewotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke3NyZWNmaWxlfSB0bXBkaXIvY29weS5zcmVjOwotCXNldCBzcmVjZmlsZSB0bXBkaXIvY29weS5zcmVjOwotICAgIH0KLSAgICBzZXQgZmlsZSBbb3BlbiAke3NyZWNmaWxlfSByXQotCi0gICAgIyBUaGUgZmlyc3QgUyByZWNvcmQgaXMgZml4ZWQgYnkgdGhlIGZpbGUgbmFtZSB3ZSBhcmUgdXNpbmcuCi0gICAgZ2V0cyAkZmlsZSBsaW5lCi0gICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0gICAgdmVyYm9zZSAkbGluZQotICAgIGlmICFbcmVnZXhwICIkaGVhZGVyX3N0cmluZy4qIiAkbGluZV0gewotCXNlbmRfbG9nICJiYWQgaGVhZGVyXG4iCi0JZmFpbCAib2JqY29weSAtTyBzcmVjIgotICAgIH0gZWxzZSB7Ci0Jd2hpbGUge1tnZXRzICRmaWxlIGxpbmVdICE9IC0xIFwKLQkgICAgICAgJiYgW3JlZ2V4cCAiXlNcWzEyM1xdXFswLTlhLWZBLUZcXStcW1xyXG5cXSokIiAkbGluZV19IHsKLQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0JICAgIHZlcmJvc2UgJGxpbmUKLQkgICAgc2V0IGxpbmUgIioqRU9GKioiCi0JfQotCXNlbmRfbG9nICIkbGluZVxuIgotCXZlcmJvc2UgJGxpbmUKLQlpZiAhW3JlZ2V4cCAiXlNcWzc4OVxdXFswLTlhLWZBLUZcXStcW1xyXG5cXSokIiAkbGluZV0gdGhlbiB7Ci0JICAgIHNlbmRfbG9nICJiYWQgdHJhaWxlclxuIgotCSAgICBmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi0JfSBlbHNlIHsKLQkgICAgaWYge1tnZXRzICRmaWxlIGxpbmVdICE9IC0xfSB0aGVuIHsKLQkJc2VuZF9sb2cgImdhcmJhZ2UgYXQgZW5kXG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQl2ZXJib3NlICRsaW5lCi0JCWZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLQkgICAgfSBlbHNlIHsKLQkJc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR7Y29weWZpbGV9LnNyZWMiXQotCQlpZiAhW3JlZ2V4cCAiZmlsZSBmb3JtYXQgc3JlYyIgJGdvdF0gdGhlbiB7Ci0JCSAgICBzZW5kX2xvZyAib2JqZHVtcCBmYWlsZWRcbiIKLQkJICAgIGZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLQkJfSBlbHNlIHsKLQkJICAgIHBhc3MgIm9iamNvcHkgLU8gc3JlYyIKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGNsb3NlICRmaWxlCi19Ci0KLSMgVGVzdCBzZXR0aW5nIGFuZCBhZGp1c3RpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuICBXZSBvbmx5IHRlc3QgdGhpcwotIyB3aGlsZSBnZW5lcmF0aW5nIFMgcmVjb3JkcywgYmVjYXVzZSB3ZSBtYXkgbm90IGJlIGFibGUgdG8gc2V0IHRoZQotIyBzdGFydCBhZGRyZXNzIGZvciBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLCBhbmQgdGhlIFMgcmVjb3JkIGNhc2UKLSMgaXMgdGhlIG9ubHkgdXNlZnVsIG9uZSBhbnlob3cuCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAkdGVtcGZpbGUiXQotaWYgIVtyZWdleHAgInN0YXJ0IGFkZHJlc3MgKFxbMC05YS1mQS1GeFhcXSspIiAkZ290IGFsbCBvcmlnc3RhcnRdIHRoZW4gewotICAgIHBlcnJvciAib2JqZHVtcCBjYW4gbm90IHJlY29nbml6ZSBiaW50ZXN0Lm8iCi0gICAgc2V0IG9yaWdzdGFydCAiIgotfSBlbHNlIHsKLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAtLXNldC1zdGFydCAweDc2NTQiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCWZhaWwgIm9iamNvcHkgLS1zZXQtc3RhcnQiCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHtjb3B5ZmlsZX0uc3JlYyJdCi0JaWYgIVtyZWdleHAgImZpbGUgZm9ybWF0IHNyZWMuKnN0YXJ0IGFkZHJlc3MgKFxbMC05YS1mQS1GeFhcXSspIiAkZ290IGFsbCBzcmVjc3RhcnRdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tc2V0LXN0YXJ0IgotCX0gZWxzZSB7Ci0JICAgIGlmIHskc3JlY3N0YXJ0ICE9IDB4NzY1NH0gdGhlbiB7Ci0JCXNlbmRfbG9nICIkc3JlY3N0YXJ0ICE9IDB4NzY1NFxuIgotCQlmYWlsICJvYmpjb3B5IC0tc2V0LXN0YXJ0IgotCSAgICB9IGVsc2UgewotCQlwYXNzICJvYmpjb3B5IC0tc2V0LXN0YXJ0IgotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjIC0tYWRqdXN0LXN0YXJ0IDB4MTIzIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXN0YXJ0IgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR7Y29weWZpbGV9LnNyZWMiXQotCWlmICFbcmVnZXhwICJmaWxlIGZvcm1hdCBzcmVjLipzdGFydCBhZGRyZXNzIChcWzAtOWEtZkEtRnhYXF0rKSIgJGdvdCBhbGwgc3JlY3N0YXJ0XSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC1zdGFydCIKLQl9IGVsc2UgewotCSAgICBpZiB7JHNyZWNzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjN9IHRoZW4gewotCQlzZW5kX2xvZyAiJHNyZWNzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjNcbiIKLQkJZmFpbCAib2JqY29weSAtLWFkanVzdC1zdGFydCIKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAib2JqY29weSAtLWFkanVzdC1zdGFydCIKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLSMgVGVzdCBhZGp1c3RpbmcgdGhlIG92ZXJhbGwgVk1BLCBhbmQgYWRqdXN0aW5nIHRoZSBWTUEgb2YgYQotIyBwYXJ0aWN1bGFyIHNlY3Rpb24uICBXZSBhZ2FpbiBvbmx5IHRlc3QgdGhpcyB3aGVuIGdlbmVyYXRpbmcgUwotIyByZWNvcmRzLgotCi1zZXQgbG93ICIiCi1zZXQgbG93bmFtZSAiIgotCi1zZXQgaGVhZGVycyBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1oICR0ZW1wZmlsZSJdCi0KLXNldCBoZWFkZXJzX3JlZ2V4cCAiXFsgCTAtOVxdKyhcW14gCVxdKylcWyAJXF0qKFxbMC05YS1mQS1GXF0rKVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsoXFswLTlhLWZBLUZcXSspXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKzJcWypcXVxbKlxdXFswLTlcXSsoLiopIgotCi1zZXQgZ290ICRoZWFkZXJzCi13aGlsZSB7W3JlZ2V4cCAkaGVhZGVyc19yZWdleHAgJGdvdCBhbGwgbmFtZSBzaXplIHZtYSByZXN0XX0gewotICAgIHNldCB2bWEgMHgkdm1hCi0gICAgc2V0IHNpemUgMHgkc2l6ZQotICAgIGlmIHskc2l6ZSAhPSAwfSB7Ci0JaWYgeyRsb3cgPT0gIiIgfHwgJHZtYSA8ICRsb3d9IHsKLSAgICAgICAgICAgIHNldCBsb3cgJHZtYQotCSAgICBzZXQgbG93bmFtZSAkbmFtZQotCX0KLSAgICB9Ci0gICAgc2V0IGdvdCAkcmVzdAotfQotCi1pZiB7JGxvdyA9PSAiIiB8fCAkb3JpZ3N0YXJ0ID09ICIifSB0aGVuIHsKLSAgICBwZXJyb3IgIm9iamR1bXAgY2FuIG5vdCByZWNvZ25pemUgYmludGVzdC5vIgotfSBlbHNlIHsKLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAtLWFkanVzdC12bWEgMHgxMjMiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotICAgICAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZmggJHtjb3B5ZmlsZX0uc3JlYyJdCi0Jc2V0IHdhbnQgImZpbGUgZm9ybWF0IHNyZWMuKnN0YXJ0IGFkZHJlc3NcWyAJXF0qKFxbMC05YS1mQS1GeFhcXSspLipzZWMxXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKyhcWzAtOWEtZkEtRlxdKykiCi0JaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgc3RhcnQgdm1hXSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC12bWEiCi0JfSBlbHNlIHsKLQkgICAgc2V0IHZtYSAweCR2bWEKLQkgICAgaWYgeyR2bWEgIT0gJGxvdyArIDB4MTIzfSB0aGVuIHsKLQkJc2VuZF9sb2cgIiR2bWEgIT0gJGxvdyArIDB4MTIzXG4iCi0JCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotCSAgICB9IGVsc2UgewotCQlpZiB7JHN0YXJ0ICE9ICRvcmlnc3RhcnQgKyAweDEyM30gdGhlbiB7Ci0JCSAgICBzZW5kX2xvZyAiJHN0YXJ0ICE9ICRvcmlnc3RhcnQgKyAweDEyM1xuIgotCQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC12bWEiCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHNldCBhcmcgIiIKLSAgICBzZXQgZ290ICRoZWFkZXJzCi0gICAgd2hpbGUge1tyZWdleHAgJGhlYWRlcnNfcmVnZXhwICRnb3QgYWxsIG5hbWUgc2l6ZSB2bWEgcmVzdF19IHsKLQlzZXQgdm1hIDB4JHZtYQotCWlmIHskdm1hID09ICRsb3d9IHRoZW4gewotCSAgICBzZXQgYXJnICIkYXJnIC0tYWRqdXN0LXNlY3Rpb24tdm1hICRuYW1lKzQiCi0JfQotCXNldCBnb3QgJHJlc3QKLSAgICB9Ci0KLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAkYXJnIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hICsiCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHtjb3B5ZmlsZX0uc3JlYyJdCi0Jc2V0IHdhbnQgImZpbGUgZm9ybWF0IHNyZWMuKnNlYzFcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKSIKLQlpZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB2bWFdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hICsiCi0JfSBlbHNlIHsKLQkgICAgc2V0IHZtYSAweCR2bWEKLQkgICAgaWYgeyR2bWEgIT0gJGxvdyArIDR9IHRoZW4gewotCQlzZW5kX2xvZyAiJHZtYSAhPSAkbG93ICsgNFxuIgotCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hICsiCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgKyIKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICByZWdzdWIgLWFsbCAiXFwrNCIgJGFyZyAiPVtleHByICRsb3cgKyA0XSIgYXJnZXEKLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAkYXJnZXEiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgPSIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaCAke2NvcHlmaWxlfS5zcmVjIl0KLQlzZXQgd2FudCAiZmlsZSBmb3JtYXQgc3JlYy4qc2VjMVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsoXFswLTlhLWZBLUZcXSspIgotCWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHZtYV0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgPSIKLQl9IGVsc2UgewotCSAgICBzZXQgdm1hIDB4JHZtYQotCSAgICBpZiB7JHZtYSAhPSAkbG93ICsgNH0gdGhlbiB7Ci0JCXNlbmRfbG9nICIkdm1hICE9ICRsb3cgKyA0XG4iCi0JCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgPSIKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSA9IgotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBvYmplY3QuCi0KLXByb2Mgc3RyaXBfdGVzdCB7IH0gewotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBTVFJJUAotICAgIGdsb2JhbCBTVFJJUEZMQUdTCi0gICAgZ2xvYmFsIE5NCi0gICAgZ2xvYmFsIE5NRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotCi0gICAgc2V0IHRlc3QgInN0cmlwIgotCi0gICAgaWYgeyBbdGFyZ2V0X2NvbXBpbGUgJHNyY2Rpci8kc3ViZGlyL3Rlc3Rwcm9nLmMgdG1wZGlyL3Rlc3Rwcm9nLm8gb2JqZWN0IGRlYnVnXSAhPSAiIiB9IHsKLQl1bnRlc3RlZCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvdGVzdHByb2cub107Ci0gICAgfSBlbHNlIHsKLQlzZXQgb2JqZmlsZSB0bXBkaXIvdGVzdHByb2cubwotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRTVFJJUCAiJFNUUklQRkxBR1MgJG9iamZpbGUiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkTk0gIi1hICROTUZMQUdTICRvYmpmaWxlIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiKjogbm8gc3ltYm9scyoiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLXN0cmlwX3Rlc3QKLQotIyBUZXN0IHN0cmlwcGluZyBhbiBvYmplY3QgZmlsZSB3aXRoIHNhdmluZyBhIHN5bWJvbAotCi1wcm9jIHN0cmlwX3Rlc3Rfd2l0aF9zYXZpbmdfYV9zeW1ib2wgeyB9IHsKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgU1RSSVAKLSAgICBnbG9iYWwgU1RSSVBGTEFHUwotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLQotICAgIHNldCB0ZXN0ICJzdHJpcCB3aXRoIHNhdmluZyBhIHN5bWJvbCIKLQotICAgIGlmIHsgW3RhcmdldF9jb21waWxlICRzcmNkaXIvJHN1YmRpci90ZXN0cHJvZy5jIHRtcGRpci90ZXN0cHJvZy5vIG9iamVjdCBkZWJ1Z10gIT0gIiIgfSB7Ci0JdW50ZXN0ZWQgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgb2JqZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3Rlc3Rwcm9nLm9dOwotICAgIH0gZWxzZSB7Ci0Jc2V0IG9iamZpbGUgdG1wZGlyL3Rlc3Rwcm9nLm8KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkU1RSSVAgIiRTVFJJUEZMQUdTIC1LIG1haW4gLUsgX21haW4gJG9iamZpbGUiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTICRvYmpmaWxlIl0KLSAgICBpZiB7IVtyZWdleHAge14oWzAtOWEtZkEtRl0rKT9bIF0rVCBtYWlufSAkZXhlY19vdXRwdXRdIFwKLSAgICAgICAgICYmICFbcmVnZXhwIHteKFswLTlhLWZBLUZdKyk/WyBdK1QgX21haW59ICRleGVjX291dHB1dF19IHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgcGFzcyAkdGVzdAotfQotCi1zdHJpcF90ZXN0X3dpdGhfc2F2aW5nX2Ffc3ltYm9sCi0KLSMgQnVpbGQgYSBmaW5hbCBleGVjdXRhYmxlLgotCi1wcm9jIGNvcHlfc2V0dXAgeyB9IHsKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIAotICAgIHNldCByZXMgW2J1aWxkX3dyYXBwZXIgdGVzdGdsdWUub107Ci0gICAgc2V0IGZsYWdzIHsgZGVidWcgfTsKLSAgICAKLSAgICBpZiB7ICRyZXMgIT0gIiIgfSB7Ci0JbGFwcGVuZCBmbGFncyAiYWRkaXRpb25hbF9mbGFncz1bbGluZGV4ICRyZXMgMV0iOwotCXNldCBhZGRfbGlicyAidGVzdGdsdWUubyI7Ci0gICAgfSBlbHNlIHsKLQlzZXQgYWRkX2xpYnMgIiI7Ci0gICAgfQotCi0gICAgaWYgeyBbdGFyZ2V0X2NvbXBpbGUgIiRzcmNkaXIvJHN1YmRpci90ZXN0cHJvZy5jICRhZGRfbGlicyIgdG1wZGlyL3Rlc3Rwcm9nIGV4ZWN1dGFibGUgJGZsYWdzXSAgIT0gIiIgfSB7Ci0JcmV0dXJuIDIKLSAgICB9Ci0KLSAgICBzZXQgcmVzdWx0IFtyZW1vdGVfbG9hZCB0YXJnZXQgdG1wZGlyL3Rlc3Rwcm9nXTsKLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLQotICAgIGlmIHsgJHN0YXR1cyAhPSAicGFzcyIgIH0gewotCXBlcnJvciAidW5yZXNvbHZlZCBzZXR1cCwgc3RhdHVzID0gJHN0YXR1cyIKLQlyZXR1cm4gMwotICAgIH0KLQotICAgIHJldHVybiAwCi19Ci0KLSMgVGVzdCBjb3B5aW5nIGFuIGV4ZWN1dGFibGUuCi0KLXByb2MgY29weV9leGVjdXRhYmxlIHsgcHJvZyBmbGFncyB0ZXN0MSB0ZXN0MiB9IHsKLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCB0ZXN0ZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3Rlc3Rwcm9nXTsKLQlzZXQgdGVzdGNvcHkgY29weXByb2cKLSAgICB9IGVsc2UgewotCXNldCB0ZXN0ZmlsZSB0bXBkaXIvdGVzdHByb2cKLQlzZXQgdGVzdGNvcHkgdG1wZGlyL2NvcHlwcm9nCi0gICAgfQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICR0ZXN0Y29weTsKLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRwcm9nICIkZmxhZ3MgJHRlc3RmaWxlICR0ZXN0Y29weSJdCi0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0MQotCWZhaWwgJHRlc3QyCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICR0ZXN0Y29weSB0bXBkaXIvY29weXByb2cKLSAgICB9Ci0KLSAgICBzZXQgc3RhdHVzIFtyZW1vdGVfZXhlYyBidWlsZCAiY21wIiAidG1wZGlyL3Rlc3Rwcm9nIHRtcGRpci9jb3B5cHJvZyJdCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtsaW5kZXggJHN0YXR1cyAxXTsKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlwYXNzICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQotCSMgVGhpcyB3aWxsIGZhaWwgZm9yIG1hbnkgcmVhc29ucy4gIEZvciBleGFtcGxlLCBpdCB3aWxsIG1vc3QKLQkjIGxpa2VseSBmYWlsIGlmIGEgbm9uLUdOVSBsaW5rZXIgaXMgdXNlZC4gIFRoZXJlZm9yZSwgd2UgZG8KLQkjIG5vdCBpbnNpc3QgdGhhdCBpdCBwYXNzLiAgSWYgeW91IGFyZSB1c2luZyBhbiBhc3NlbWJsZXIgYW5kCi0JIyBsaW5rZXIgYmFzZWQgb24gdGhlIHNhbWUgQkZEIGFzIG9iamNvcHksIGl0IGlzIHdvcnRoCi0JIyBpbnZlc3RpZ2F0aW5nIHRvIHNlZSB3aHkgdGhpcyBmYWlsdXJlIG9jY3Vycy4gIElmIHdlIGFyZQotCSMgY3Jvc3MgY29tcGlsaW5nLCB3ZSBhc3N1bWUgdGhhdCBhIEdOVSBsaW5rZXIgaXMgYmVpbmcgdXNlZCwKLQkjIGFuZCBleHBlY3QgaXQgdG8gc3VjY2VlZC4KLQlpZiB7W2lzbmF0aXZlXX0gdGhlbiB7Ci0JICAgIHNldHVwX3hmYWlsICIqLSotKiIKLQl9Ci0KLQkjIFRoaXMgYWxzbyBmYWlscyBmb3IgbWlwcyotKi1lbGYgdGFyZ2V0cy4gIFNlZSBlbGYzMi1taXBzLmMKLQkjIG1pcHNfZWxmX3N5bV9pc19nbG9iYWwuCi0Jc2V0dXBfeGZhaWwgIm1pcHMqLSotZWxmIgotCi0Jc2V0dXBfeGZhaWwgImFybSotKi1jb2ZmIgotCXNldHVwX3hmYWlsICJhcm0qLSotcGUiCi0Jc2V0dXBfeGZhaWwgInRodW1iKi0qLWNvZmYiCi0Jc2V0dXBfeGZhaWwgInRodW1iKi0qLXBlIgotICAgIAotCWZhaWwgJHRlc3QxCi0gICAgfQotCi0gICAgc2V0IG91dHB1dCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9jb3B5cHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJG91dHB1dCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlwYXNzICR0ZXN0MgotICAgIH0KLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlCi0KLXByb2Mgc3RyaXBfZXhlY3V0YWJsZSB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotCi0gICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107Ci0gICAgfSBlbHNlIHsKLQlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7Ci0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QKLSAgICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIio6IG5vIHN5bWJvbHMqIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3QKLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sCi0KLXByb2Mgc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotCi0gICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107Ci0gICAgfSBlbHNlIHsKLQlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7Ci0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QKLSAgICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCi0gICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZkEtRl0rIFQgbWFpbn0gJGV4ZWNfb3V0cHV0XSBcCi0gICAgICAgICAmJiAhW3JlZ2V4cCB7XlswLTlhLWZBLUZdKyBUIF9tYWlufSAkZXhlY19vdXRwdXRdfSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLXNldCB0ZXN0MSAic2ltcGxlIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKLXNldCB0ZXN0MiAicnVuIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKLXNldCB0ZXN0MyAicnVuIHN0cmlwcGVkIGV4ZWN1dGFibGUiCi1zZXQgdGVzdDQgInJ1biBzdHJpcHBlZCBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sIgotCi1zd2l0Y2ggW2NvcHlfc2V0dXBdIHsKLSAgICAiMSIgewotCSMgZG8gbm90aGluZwotICAgIH0KLSAgICAiMiIgewotCXVudGVzdGVkICR0ZXN0MQotCXVudGVzdGVkICR0ZXN0MgotCXVudGVzdGVkICR0ZXN0MwotCXVudGVzdGVkICR0ZXN0NAotICAgIH0KLSAgICAiMyIgewotCXVucmVzb2x2ZWQgJHRlc3QxCi0JdW5yZXNvbHZlZCAkdGVzdDIKLQl1bnJlc29sdmVkICR0ZXN0MwotCXVucmVzb2x2ZWQgJHRlc3Q0Ci0gICAgfQotICAgICIwIiB7Ci0JY29weV9leGVjdXRhYmxlICIkT0JKQ09QWSIgIiRPQkpDT1BZRkxBR1MiICIkdGVzdDEiICIkdGVzdDIiCi0Jc3RyaXBfZXhlY3V0YWJsZSAiJFNUUklQIiAiJFNUUklQRkxBR1MiICIkdGVzdDMiCi0Jc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCAiJFNUUklQIiAiLUsgbWFpbiAtSyBfbWFpbiAkU1RSSVBGTEFHUyIgIiR0ZXN0NCIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwNDBmYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZSA8cm9iQGN5Z251cy5jb20+Ci0jIGFuZCByZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRPQkpEVU1QXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRPQkpEVU1QIGRvZXMgbm90IGV4aXN0IgotCXJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE9CSkRVTVBdIgotCi0jIFNpbXBsZSB0ZXN0IG9mIG9iamR1bXAgLWkKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1pIl0KLQotc2V0IGNwdXNfZXhwZWN0ZWQgIihhMjlrfGFsbGlhbnR8YWxwaGF8YXJjfGFybXxjb252ZXh8ZDEwdnxkMzB2fGZyMzB8aDh8aHBwYXxpMzg2fGk4NjB8aTk2MHxtMzJyfG02OGt8bTg4a3xNQ29yZXxtaXBzfG1uMTAyMDB8bW4xMDMwMHxuczMya3xwanxwb3dlcnBjfHB5cmFtaWR8cm9tcHxyczYwMDB8c2h8c3BhcmN8dGFob2V8djg1MHx2YXh8d2UzMmt8ejhrfHo4MDAxfHo4MDAyKSIKLQotIyBNYWtlIHN1cmUgdGhlIHRhcmdldCBDUFUgc2hvd3MgdXAgaW4gdGhlIGxpc3QuCi1pZiAhW3JlZ2V4cCAkY3B1c19leHBlY3RlZCAkdGFyZ2V0X2NwdV0gewotICAgIHJlZ3N1YiAiXlxbKFxdIiAiJGNwdXNfZXhwZWN0ZWQiICIoJHt0YXJnZXRfY3B1fXwiIGNwdXNfZXhwZWN0ZWQ7Ci19Ci0KLXNldCB3YW50ICJCRkQgaGVhZGVyIGZpbGUgdmVyc2lvbi4qc3JlY1xbXlxuXF0qXG5cW15cblxdKmhlYWRlciBcW15cblxdKmVuZGlhblxbXlxuXF0qLCBkYXRhIFxbXlxuXF0qZW5kaWFuLiokY3B1c19leHBlY3RlZCIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJvYmpkdW1wIC1pIgotfSBlbHNlIHsKLSAgICBmYWlsICJvYmpkdW1wIC1pIgotfQotCi0jIFRoZSByZW1haW5pbmcgdGVzdHMgcmVxdWlyZSBhIHRlc3QgZmlsZS4KLQotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZXN0ZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2JpbnRlc3Qub10KLX0gZWxzZSB7Ci0gICAgc2V0IHRlc3RmaWxlIHRtcGRpci9iaW50ZXN0Lm8KLX0KLQotIyBUZXN0IG9iamR1bXAgLWYKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIkdGVzdGZpbGU6XFsgCVxdKmZpbGUgZm9ybWF0LiphcmNoaXRlY3R1cmU6XFsgCVxdKiR7Y3B1c19leHBlY3RlZH0uKkhBU19SRUxPQy4qSEFTX1NZTVMiCi0KLWlmICFbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIGZhaWwgIm9iamR1bXAgLWYiCi19IGVsc2UgewotICAgIHBhc3MgIm9iamR1bXAgLWYiCi19Ci0KLSMgVGVzdCBvYmpkdW1wIC1oCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaCAkdGVzdGZpbGUiXQotCi1zZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qU2VjdGlvbnMuKlxbMC05XF0rXFsgCVxdK1xbXiAJXF0qKHRleHR8VEVYVHxcXFwkQ09ERVxcXCQpXFteIAlcXSpcWyAJXF0qKFxbMC05YS1mQS1GXF0rKS4qXFswLTlcXStcWyAJXF0rXFteIAlcXSooXFwuZGF0YXxEQVRBKVxbXiAJXF0qXFsgCVxdKihcWzAtOWEtZkEtRlxdKykiCi0KLWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHRleHRfbmFtZSB0ZXh0X3NpemUgZGF0YV9uYW1lIGRhdGFfc2l6ZV0gdGhlbiB7Ci0gICAgZmFpbCAib2JqZHVtcCAtaCIKLX0gZWxzZSB7Ci0gICAgdmVyYm9zZSAidGV4dCBuYW1lIGlzICR0ZXh0X25hbWUgc2l6ZSBpcyAkdGV4dF9zaXplIgotICAgIHZlcmJvc2UgImRhdGEgbmFtZSBpcyAkZGF0YV9uYW1lIHNpemUgaXMgJGRhdGFfc2l6ZSIKLSAgICBpZiB7W2V4cHIgIjB4JHRleHRfc2l6ZSJdIDwgOCB8fCBbZXhwciAiMHgkZGF0YV9zaXplIl0gPCA0fSB0aGVuIHsKLQlzZW5kX2xvZyAic2l6ZXMgdG9vIHNtYWxsXG4iCi0JZmFpbCAib2JqZHVtcCAtaCIKLSAgICB9IGVsc2UgewotCXBhc3MgIm9iamR1bXAgLWgiCi0gICAgfQotfQotCi0jIFRlc3Qgb2JqZHVtcCAtdAotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXQgJHRlc3RmaWxlIl0KLQotaWYgW2luZm8gZXhpc3RzIHZhcnNdIHRoZW4geyB1bnNldCB2YXJzIH0KLXdoaWxlIHtbcmVnZXhwICIoXFthLXpcXSpfc3ltYm9sKSguKikiICRnb3QgYWxsIHN5bWJvbCByZXN0XX0gewotICAgIHNldCB2YXJzKCRzeW1ib2wpIDEKLSAgICBzZXQgZ290ICRyZXN0Ci19Ci0KLWlmIHshW2luZm8gZXhpc3RzIHZhcnModGV4dF9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGNvbW1vbl9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhleHRlcm5hbF9zeW1ib2wpXX0gdGhlbiB7Ci0gICAgZmFpbCAib2JqZHVtcCAtdCIKLX0gZWxzZSB7Ci0gICAgcGFzcyAib2JqZHVtcCAtdCIKLX0KLQotIyBUZXN0IG9iamR1bXAgLXIKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1yICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIkdGVzdGZpbGU6XFsgCVxdKmZpbGUgZm9ybWF0LipSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxcXFtcW15cXVxdKih0ZXh0fFRFWFR8XFxcJENPREVcXFwkKVxbXlxdXF0qXFxcXS4qZXh0ZXJuYWxfc3ltYm9sIgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgIm9iamR1bXAgLXIiCi19IGVsc2UgewotICAgIGZhaWwgIm9iamR1bXAgLXIiCi19Ci0KLSMgVGVzdCBvYmpkdW1wIC1zCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtcyAkdGVzdGZpbGUiXQotCi1zZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qQ29udGVudHMuKih0ZXh0fFRFWFR8XFxcJENPREVcXFwkKVxbXjAtOVxdKlxbIAlcXSpcWzAtOWEtZkEtRlxdKlxbIAlcXSooMDAwMDAwMDF8MDEwMDAwMDApLipDb250ZW50cy4qKGRhdGF8REFUQSlcW14wLTlcXSpcWyAJXF0qXFswLTlhLWZBLUZcXSpcWyAJXF0qKDAwMDAwMDAyfDAyMDAwMDAwKSIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJvYmpkdW1wIC1zIgotfSBlbHNlIHsKLSAgICBmYWlsICJvYmpkdW1wIC1zIgotfQotCi0jIE9wdGlvbnMgd2hpY2ggYXJlIG5vdCB0ZXN0ZWQ6IC1hIC1kIC1EIC1SIC1UIC14IC1sIC0tc3RhYnMKLSMgSSBkb24ndCBzZWUgYW55IGdlbmVyaWMgd2F5IHRvIHRlc3QgYW55IG9mIHRoZXNlIG90aGVyIHRoYW4gLWEuCi0jIFRlc3RzIGNvdWxkIGJlIHdyaXR0ZW4gZm9yIHNwZWNpZmljIHRhcmdldHMsIGFuZCB0aGF0IHNob3VsZCBiZSBkb25lCi0jIGlmIHNwZWNpZmljIHByb2JsZW1zIGFyZSBmb3VuZC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmY3NDRjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFdyaXR0ZW4gYnkgTmljayBDbGlmdG8gIDxuaWNrY0BjeWdudXMuY29tPgotIyBCYXNlZCBvbiBzY3JpcHRzIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0jIGFuZCBLZW4gUmFlYnVybiA8cmFlYnVybkBjeWdudXMuY29tPi4KLQotIyBGaXJzdCBzb21lIGhlbHBmdWwgcHJvY2VkdXJlcywgdGhlbiB0aGUgdGVzdHMgdGhlbXNlbHZlcwotCi0jIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVuYW1lIGdpdmVuCi1wcm9jIGZpbGVfY29udGVudHMgeyBmaWxlbmFtZSB9IHsKLSAgICBzZXQgZmlsZSBbb3BlbiAkZmlsZW5hbWUgcl0KLSAgICBzZXQgY29udGVudHMgW3JlYWQgJGZpbGVdCi0gICAgY2xvc2UgJGZpbGUKLSAgICByZXR1cm4gJGNvbnRlbnRzCi19Ci0KLSMgcmVnZXhwX2RpZmYsIGJhc2VkIG9uIHNpbXBsZV9kaWZmIHRha2VuIGZyb20gbGQgdGVzdCBzdWl0ZQotIwljb21wYXJlcyB0d28gZmlsZXMgbGluZS1ieS1saW5lCi0jCWZpbGUxIGNvbnRhaW5zIHN0cmluZ3MsIGZpbGUyIGNvbnRhaW5zIHJlZ2V4cHMgYW5kICMtY29tbWVudHMKLSMJYmxhbmsgbGluZXMgYXJlIGlnbm9yZWQgaW4gZWl0aGVyIGZpbGUKLSMJcmV0dXJucyBub24temVybyBpZiBkaWZmZXJlbmNlcyBleGlzdAotIwotcHJvYyByZWdleHBfZGlmZiB7IGZpbGVfMSBmaWxlXzIgfSB7Ci0KLSAgICBzZXQgZW9mIC0xCi0gICAgc2V0IGVuZF8xIDAKLSAgICBzZXQgZW5kXzIgMAotICAgIHNldCBkaWZmZXJlbmNlcyAwCi0gICAgc2V0IGRpZmZfcGFzcyAwCi0KLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMV0gdGhlbiB7Ci0Jc2V0IGZpbGVfYSBbb3BlbiAkZmlsZV8xIHJdCi0gICAgfSBlbHNlIHsKLQl3YXJuaW5nICIkZmlsZV8xIGRvZXNuJ3QgZXhpc3QiCi0JcmV0dXJuIDEKLSAgICB9Ci0KLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMl0gdGhlbiB7Ci0Jc2V0IGZpbGVfYiBbb3BlbiAkZmlsZV8yIHJdCi0gICAgfSBlbHNlIHsKLQlmYWlsICIkZmlsZV8yIGRvZXNuJ3QgZXhpc3QiCi0JY2xvc2UgJGZpbGVfYQotCXJldHVybiAxCi0gICAgfQotCi0gICAgdmVyYm9zZSAiIFJlZ2V4cC1kaWZmJ2luZzogJGZpbGVfMSAkZmlsZV8yIiAyCi0KLSAgICB3aGlsZSB7IDEgfSB7Ci0Jc2V0IGxpbmVfYSAiIgotCXNldCBsaW5lX2IgIiIKLQl3aGlsZSB7IFtzdHJpbmcgbGVuZ3RoICRsaW5lX2FdID09IDAgfSB7Ci0JICAgIGlmIHsgW2dldHMgJGZpbGVfYSBsaW5lX2FdID09ICRlb2YgfSB7Ci0JCXNldCBlbmRfMSAxCi0JCWJyZWFrCi0JICAgIH0KLQl9Ci0Jd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9iXSA9PSAwIHx8IFtzdHJpbmcgbWF0Y2ggIiMqIiAkbGluZV9iXSB9IHsKLQkgICAgaWYgWyBzdHJpbmcgbWF0Y2ggIiNwYXNzIiAkbGluZV9iIF0gewotCQlzZXQgZW5kXzIgMQotCQlzZXQgZGlmZl9wYXNzIDEKLQkJYnJlYWsKLQkgICAgfQotCSAgICBpZiB7IFtnZXRzICRmaWxlX2IgbGluZV9iXSA9PSAkZW9mIH0gewotCQlzZXQgZW5kXzIgMQotCQlicmVhawotCSAgICB9Ci0JfQotCi0gICAgICAgIGlmIHsgJGRpZmZfcGFzcyB9IHsgCi0gICAgICAgICAgICBicmVhayAKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzEgJiYgJGVuZF8yIH0geyAKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzFcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzEiIDMKLSAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMiB9IHsKLSAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSBsaW5lcyBpbiAkZmlsZV8xIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYSRcIlxuRU9GIGZyb20gJGZpbGVfMlxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIgMwotICAgICAgICAgICAgc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZXJib3NlICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiIiAzCi0gICAgICAgICAgICBpZiAhW3JlZ2V4cCAiXiRsaW5lX2IkIiAiJGxpbmVfYSJdIHsKLQkJc2VuZF9sb2cgInJlZ2V4cF9kaWZmIG1hdGNoIGZhaWx1cmVcbiIKLQkJc2VuZF9sb2cgInJlZ2V4cCBcIl4kbGluZV9iJFwiXG5saW5lICAgXCIkbGluZV9hXCJcbiIKLQkJc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgeyAkZGlmZmVyZW5jZXMgPT0gMCAmJiAhJGRpZmZfcGFzcyAmJiBbZW9mICRmaWxlX2FdICE9IFtlb2YgJGZpbGVfYl0gfSB7Ci0Jc2VuZF9sb2cgIiRmaWxlXzEgYW5kICRmaWxlXzIgYXJlIGRpZmZlcmVudCBsZW5ndGhzXG4iCi0JdmVyYm9zZSAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHMiIDMKLQlzZXQgZGlmZmVyZW5jZXMgMQotICAgIH0KLQotICAgIGNsb3NlICRmaWxlX2EKLSAgICBjbG9zZSAkZmlsZV9iCi0KLSAgICByZXR1cm4gJGRpZmZlcmVuY2VzCi19Ci0KLSMgUnVuIGFuIGluZGl2aWR1YWwgcmVhZGVsZiB0ZXN0LgotIyBCYXNpY2FsbHkgcmVhZGVsZiBpcyBydW4gb24gdGhlIGJpbmFyeV9maWxlIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuCi0jIFJlYWRlbGYncyBvdXRwdXQgaXMgY2FwdHVyZWQgYW5kIHRoZW4gY29tcGFyZWQgYWdhaW5zdCB0aGUgY29udGVudHMKLSMgb2YgdGhlIHJlZ2V4cF9maWxlLgotCi1wcm9jIHJlYWRlbGZfdGVzdCB7IG9wdGlvbnMgYmluYXJ5X2ZpbGUgcmVnZXhwX2ZpbGUgeGZhaWxzIH0gewotCi0gICAgZ2xvYmFsIFJFQURFTEYKLSAgICBnbG9iYWwgUkVBREVMRkZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICAKLSAgICBzZW5kX2xvZyAiZXhlYyAkUkVBREVMRiAkUkVBREVMRkZMQUdTICRvcHRpb25zICRiaW5hcnlfZmlsZSA+IHJlYWRlbGYub3V0IgotICAgIGNhdGNoICJleGVjICRSRUFERUxGICRSRUFERUxGRkxBR1MgJG9wdGlvbnMgJGJpbmFyeV9maWxlID4gcmVhZGVsZi5vdXQiIGdvdAotCi0gICAgaWYgeyBbbGxlbmd0aCAkeGZhaWxzXSAhPSAwIH0gdGhlbiB7Ci0Jc2V0dXBfeGZhaWwgJHhmYWlscwotICAgIH0KLSAgICAKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlzZW5kX2xvZyAkZ290Ci0JZmFpbCAicmVhZGVsZiAkb3B0aW9ucyIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiB7IFtyZWdleHBfZGlmZiByZWFkZWxmLm91dCAkc3JjZGlyLyRzdWJkaXIvJHJlZ2V4cF9maWxlXSB9IHRoZW4gewotCWZhaWwgInJlYWRlbGYgJG9wdGlvbnMiCi0JdmVyYm9zZSAib3V0cHV0IGlzIFxuW2ZpbGVfY29udGVudHMgcmVhZGVsZi5vdXRdIiAyCi0JcmV0dXJuCi0gICAgfQotCi0gICAgcGFzcyAicmVhZGVsZiAkb3B0aW9ucyIKLX0KLQotCi0KLSMgT25seSBFTEYgYmFzZWQgdG9vbGNoYWlucyBuZWVkIHJlYWRlbGYuCi0jIEZvciBub3cgYmUgcGFyYW5vaWQgYW5kIGFzc3VtZSB0aGF0IGlmIEVMRiBpcyBub3QgbWVudGlvbmVkCi0jIGluIHRoZSB0YXJnZXQgc3RyaW5nLCB0aGVuIHRoZSB0YXJnZXQgaXMgbm90IGFuIEVMRiBiYXNlZCBwb3J0LgotCi1pZiAhW2lzdGFyZ2V0ICIqLSplbGYiXSB0aGVuIHsKLSAgICB2ZXJib3NlICIkUkVBREVMRiBpcyBvbmx5IGludGVudGVkZWQgZm9yIEVMRiB0YXJnZXRzIiAyCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRSRUFERUxGXSA9PSAwfSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkUkVBREVMRiBkb2VzIG5vdCBleGlzdCIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkUkVBREVMRl0iCi0KLSMgQXNzZW1sZSB0aGUgdGVzdCBmaWxlLgotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcGVycm9yICJ1bnJlc29sdmVkIDEiCi0gICAgdW5yZXNvbHZlZCAicmVhZGVsZiAtIGZhaWxlZCB0byBhc3NlbWJsZSIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvYmludGVzdC5vOwotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi19Ci0KLSMgUnVuIHRoZSB0ZXN0cwotcmVhZGVsZl90ZXN0IC1oICR0ZW1wZmlsZSByZWFkZWxmLmggIHt9Ci0KLSMgVGhlIHY4NTAgZmFpbHMgdGhlIG5leHQgdHdvIHRlc3RzIGJlY2F1c2UgaXQgY3JlYXRlcyB0d28gc3BlY2lhbAotIyBzZWN0aW9ucyBvZiBpdHMgb3duOiAuY2FsbF90YWJsZV9kYXRhIGFuZCAuY2FsbF90YWJsZV90ZXh0Ci0jIFRoZSByZWdleHAgc2NyaXB0cyBhcmUgbm90IGV4cGVjdGluZyB0aGVzZSBzZWN0aW9ucy4uLgotCi1yZWFkZWxmX3Rlc3QgLVMgJHRlbXBmaWxlIHJlYWRlbGYucyAge3Y4NTAqLSotKn0KLXJlYWRlbGZfdGVzdCAtcyAkdGVtcGZpbGUgcmVhZGVsZi5zcyB7djg1MCotKi0qfQotcmVhZGVsZl90ZXN0IC1yICR0ZW1wZmlsZSByZWFkZWxmLnIgIHt9Ci0KLQotIyBDb21waWxlIHRoZSBzZWNvbmQgdGVzdCBmaWxlLgotaWYgeyBbdGFyZ2V0X2NvbXBpbGUgJHNyY2Rpci8kc3ViZGlyL3Rlc3Rwcm9nLmMgdG1wZGlyL3Rlc3Rwcm9nLm8gb2JqZWN0IGRlYnVnXSAhPSAiIiB9IHsKLSAgICB1bnRlc3RlZCAicmVhZGVsZiAtdyIKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvdGVzdHByb2cub107Ci19IGVsc2UgewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvdGVzdHByb2cubwotfQotCi0jIFRoZSB4ZmFpbCB0YXJnZXRzIGhlcmUgZG8gbm90IGRlZmF1bHQgdG8gRFdBUkYyIGZvcm1hdCBkZWJ1ZyBpbmZvcm1hdGlvbgotIyBUaGUgc3ltcHRvbSBpcyB0aGF0IHRoZSBvdXRwdXQgb2YgJ3JlYWRlbGYgLXdpJyBpcyBlbXB0eS4KLQotcmVhZGVsZl90ZXN0IC13aSAkdGVtcGZpbGUgcmVhZGVsZi53aSB7djg1MCotKi0qfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmggYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwZWFiNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUVMRiBIZWFkZXI6Ci0gIE1hZ2ljOiAgIDdmIDQ1IDRjIDQ2IDBbMTJdIDBbMTJdIDAxIC4uIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIAotICBDbGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRlszNl1bMjRdCi0gIERhdGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMidzIGNvbXBsZW1lbnQsLiogZW5kaWFuCi0gIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBcKGN1cnJlbnRcKQotICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4qCi0gIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgLioKLSAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUwgXChSZWxvY2F0YWJsZSBmaWxlXCkKLSAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAuKgotICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQotICBFbnRyeSBwb2ludCBhZGRyZXNzOiAgICAgICAgICAgICAgIDB4MAotICBTdGFydCBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgIDAgXChieXRlcyBpbnRvIGZpbGVcKQotICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgIC4qIFwoYnl0ZXMgaW50byBmaWxlXCkKLSAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuKgotICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgIC4qIFwoYnl0ZXNcKQotICBTaXplIG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgIDAgXChieXRlc1wpCi0gIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgMAotICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgIC4qIFwoYnl0ZXNcKQotICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgIC4qCi0gIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogLioKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5yIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDk2NTkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotUmVsb2NhdGlvbiBzZWN0aW9uICcucmVsLip0ZXh0JyBhdCBvZmZzZXQgMHguKiBjb250YWlucyAxIGVudHJpZXM6Ci0gIE9mZnNldCAgICBJbmZvICBUeXBlICAgICAgICAgICAgU3ltYm9sJ3MgVmFsdWUgIFN5bWJvbCdzIE5hbWUuKgotICAwMDAwMDAwNCAgMDAuKiBSXy4qMDAwMDAwMDAgIGV4dGVybmFsX3N5bWJvbC4qCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYucyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFlMGZjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotVGhlcmUgYXJlIC4qIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IC4qOgotCi1TZWN0aW9uIEhlYWRlcnM6Ci0gIFxbTnJcXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGcgTGsgSW5mIEFsCi0gIFxbIDBcXSAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgMDAwMDAwMDAgMDAwMDAwIDAwMDAwMCAwMCAgICAgICAwICAgMCAwCi0gIFxbIDFcXSAudGV4dCAgICAgICAgICAgICBQUk9HQklUUyAgICAgICAgMDAwMDAwMDAgMDAwMDM0IDAwMDAwOCAwMCAgQVggICAwICAgMCAuCi0gIFxbIDJcXSAucmVsLit0ZXh0ICtSRUwuICswKyAwKy4qIDAwMDAwLiAwLiAgICAgICAuICAgMSA0Ci0gIFxbIDNcXSAuZGF0YSAgICAgICAgICAgICBQUk9HQklUUyAgICAgICAgMDAwMDAwMDAgMDAwMDNjIDAwMDAwNCAwMCAgV0EgICAwICAgMCAuCi0gIFxbIDRcXSAuYnNzICAgICAgICAgICAgICBOT0JJVFMgICAgICAgICAgMDAwMDAwMDAgMDAwMDQwIDAwMDAwMCAwMCAgV0EgICAwICAgMCAuCi0gIFxbIC5cXSAuc2hzdHJ0YWIgICAgICAgICBTVFJUQUIgICAgICAgICAgMDAwMDAwMDAgMDAwMDQwIDAwMDAuKiAwMCAgICAgICAwICAgMCAuCi0gIFxbIC5cXSAuc3ltdGFiICAgICAgICAgICBTWU1UQUIgICAgICAgICAgMDAwMDAwMDAgMCsuKiAwKy4qIDEwICAgICAgIDcgICA2IDQKLSAgXFsgLlxdIC5zdHJ0YWIgICAgICAgICAgIFNUUlRBQiAgICAgICAgICAwMDAwMDAwMCAwKy4qIDArLiogMDAgICAgICAgMCAgIDAgMQotS2V5IHRvIEZsYWdzOiBXIFwod3JpdGVcKSwgQSBcKGFsbG9jXCksIFggXChleGVjdXRlXCksIE0gXChtZXJnZVwpLCBTIFwoc3RyaW5nc1wpCi0gICAgICAgICAgICAgIEkgXChpbmZvXCksIEwgXChsaW5rIG9yZGVyXCksIE8gXChleHRyYSBPUyBwcm9jZXNzaW5nIHJlcXVpcmVkXCkKLSAgICAgICAgICAgICAgbyBcKG9zIHNwZWNpZmljXCksIHAgXChwcm9jZXNzb3Igc3BlY2lmaWNcKSB4IFwodW5rbm93blwpCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zcyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI2NjEyZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLVN5bWJvbCB0YWJsZSAnLnN5bXRhYicgY29udGFpbnMgLiogZW50cmllczoKLSAgIE51bTogICAgVmFsdWUgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgTmR4IE5hbWUKLSAgICAgMDogMDAwMDAwMDAgICAgIDAgTk9UWVBFICBMT0NBTCAgREVGQVVMVCAgVU5EIAotICAgICAxOiAwMDAwMDAwMCAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgIDEgCi0gICAgIDI6IDAwMDAwMDAwICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgMyAKLSAgICAgMzogMDAwMDAwMDAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICA0IAotICAgICA0OiAwMDAwMDAwMCAgICAgMCBOT1RZUEUgIExPQ0FMICBERUZBVUxUICAgIDEgc3RhdGljX3RleHRfc3ltYm9sCi0gICAgIDU6IDAwMDAwMDAwICAgICAwIE5PVFlQRSAgTE9DQUwgIERFRkFVTFQgICAgMyBzdGF0aWNfZGF0YV9zeW1ib2wKLS4qICAgLjogMDAwMDAwMDAgICAgIDAgTk9UWVBFICBHTE9CQUwgREVGQVVMVCAgICAxIHRleHRfc3ltYm9sCi0gICAgIC46IDAwMDAwMDAwICAgICAwIE5PVFlQRSAgR0xPQkFMIERFRkFVTFQgIFVORCBleHRlcm5hbF9zeW1ib2wKLSAgICAgLjogMDAwMDAwMDAgICAgIDAgTk9UWVBFICBHTE9CQUwgREVGQVVMVCAgICAzIGRhdGFfc3ltYm9sCi0gICAgIC46IDAwMDAwMDA0ICAgICA0IE9CSkVDVCAgR0xPQkFMIERFRkFVTFQgIENPTSBjb21tb25fc3ltYm9sCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYud2kgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYud2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjJmZmYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLndpCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotVGhlIHNlY3Rpb24gLmRlYnVnX2luZm8gY29udGFpbnM6Ci0KLSAgQ29tcGlsYXRpb24gVW5pdDoKLSAgIExlbmd0aDogICAgICAgIC4qCi0gICBWZXJzaW9uOiAgICAgICAyCi0gICBBYmJyZXYgT2Zmc2V0OiAwCi0gICBQb2ludGVyIFNpemU6ICA0Ci0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogMSBcKERXX1RBR19jb21waWxlX3VuaXRcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IC4qL3Rlc3Rwcm9nLmMJCi0gICAgIERXX0FUX2NvbXBfZGlyICAgIDogLiovYmludXRpbHMJCi0gICAgIERXX0FUX3Byb2R1Y2VyICAgIDogR05VIEMgLioJCi0gICAgIERXX0FUX2xhbmd1YWdlICAgIDogMQlcKEFOU0kgQ1wpCi0gICAgIERXX0FUX2xvd19wYyAgICAgIDogMAkKLSAgICAgRFdfQVRfaGlnaF9wYyAgICAgOiAuKgkKLSAgICAgRFdfQVRfc3RtdF9saXN0ICAgOiAwCQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDIgXChEV19UQUdfc3VicHJvZ3JhbVwpCi0gICAgIERXX0FUX2V4dGVybmFsICAgIDogMQkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBmbgkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDEwCQotICAgICBEV19BVF90eXBlICAgICAgICA6IC4qCQotICAgICBEV19BVF9sb3dfcGMgICAgICA6IDAJCi0gICAgIERXX0FUX2hpZ2hfcGMgICAgIDogLioJCi0gICAgIERXX0FUX2ZyYW1lX2Jhc2UgIDogMSBieXRlIGJsb2NrOiAuKgotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDMgXChEV19UQUdfYmFzZV90eXBlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBpbnQJCi0gICAgIERXX0FUX2J5dGVfc2l6ZSAgIDogNAkKLSAgICAgRFdfQVRfZW5jb2RpbmcgICAgOiA1CVwoc2lnbmVkXCkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA0IFwoRFdfVEFHX3N1YnByb2dyYW1cKQotICAgICBEV19BVF9zaWJsaW5nICAgICA6IC4qCQotICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogbWFpbgkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDE2CQotICAgICBEV19BVF90eXBlICAgICAgICA6IC4qCQotICAgICBEV19BVF9sb3dfcGMgICAgICA6IC4qCQotICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQotICAgICBEV19BVF9mcmFtZV9iYXNlICA6IDEgYnl0ZSBibG9jazogLioKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA1IFwoRFdfVEFHX2xleGljYWxfYmxvY2tcKQotICAgICBEV19BVF9sb3dfcGMgICAgICA6IC4qCQotICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDYgXChEV19UQUdfdmFyaWFibGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGNvbW1vbgkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDMJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogPC4qPgkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9sb2NhdGlvbiAgICA6IDUgYnl0ZSBibG9jazogMyAwIDAgMCAwIAlcKERXX09QX2FkZHI6IDBcKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDYgXChEV19UQUdfdmFyaWFibGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGdsb2JhbAkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDQJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogPC4qPgkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9sb2NhdGlvbiAgICA6IDUgYnl0ZSBibG9jazogMyAwIDAgMCAwIAlcKERXX09QX2FkZHI6IDBcKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDcgXChEV19UQUdfdmFyaWFibGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGxvY2FsCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogNQkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiA8Lio+CQotICAgICBEV19BVF9sb2NhdGlvbiAgICA6IDUgYnl0ZSBibG9jazogMyAuIDAgMCAuIAlcKERXX09QX2FkZHI6IC5cKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDggXChEV19UQUdfYXJyYXlfdHlwZVwpCi0gICAgIERXX0FUX3NpYmxpbmcgICAgIDogPC4qPgkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiA8Lio+CQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDkgXChEV19UQUdfc3VicmFuZ2VfdHlwZVwpCi0gICAgIERXX0FUX3VwcGVyX2JvdW5kIDogNgkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiAzIFwoRFdfVEFHX2Jhc2VfdHlwZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogY2hhcgkKLSAgICAgRFdfQVRfYnl0ZV9zaXplICAgOiAxCQotICAgICBEV19BVF9lbmNvZGluZyAgICA6IDgJXCh1bnNpZ25lZCBjaGFyXCkKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiA3IFwoRFdfVEFHX3ZhcmlhYmxlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBzdHJpbmcJCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiA2CQotICAgICBEV19BVF90eXBlICAgICAgICA6IDwuKj4JCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIC4gMCAwIC4gCVwoRFdfT1BfYWRkcjogLlwpCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9zaXplLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwOGM5MS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJFNJWkVdID09IDB9IHRoZW4gewotCXBlcnJvciAiJFNJWkUgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkU0laRV0iCi0KLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZXN0ZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2JpbnRlc3Qub10KLX0gZWxzZSB7Ci0gICAgc2V0IHRlc3RmaWxlIHRtcGRpci9iaW50ZXN0Lm8KLX0KLQotc2V0IGRlYyAiXFswLTlcXSsiCi1zZXQgaGV4ICJcWzAtOWEtZkEtRlxdKyIKLQotIyBUZXN0IHNpemUgd2l0aCBubyBhcmd1bWVudHMKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRTSVpFICIkU0laRUZMQUdTICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIoJGRlYylcWyAJXF0rKCRkZWMpXFsgCVxdKygkZGVjKVxbIAlcXSsoJGRlYylcWyAJXF0rKCRoZXgpXFsgCVxdKyR7dGVzdGZpbGV9IgotCi1pZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB0ZXh0IGRhdGEgYnNzIGR0b3QgaGV4dG90XSB0aGVuIHsKLSAgICBmYWlsICJzaXplIChubyBhcmd1bWVudHMpIgotfSBlbHNlIHsKLSAgICBpZiB7JHRleHQgPCA4IHx8ICRkYXRhIDwgNH0gdGhlbiB7Ci0JZmFpbCAic2l6ZSAobm8gYXJndW1lbnRzKSIKLSAgICB9IGVsc2UgewotCXBhc3MgInNpemUgKG5vIGFyZ3VtZW50cykiCi0gICAgfQotfQotCi0jIFRlc3Qgc2l6ZSAtQQotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJFNJWkUgIiRTSVpFRkxBR1MgLUEgJHt0ZXN0ZmlsZX0iXQotCi1zZXQgd2FudCAiJHt0ZXN0ZmlsZX0uKih0ZXh0fFRFWFQpXFteXG5cclxdKlxbIAlcXSgkZGVjKVxbIAlcXSskZGVjLiooXFwuZGF0YXxEQVRBKVxbXlxuXHJcXSpcWyAJXF0oJGRlYylcWyAJXF0rJGRlYyIKLQotaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdGV4dG5hbWUgdGV4dHNpemUgZGF0YW5hbWUgZGF0YXNpemVdIHRoZW4gewotICAgIGZhaWwgInNpemUgLUEiCi19IGVsc2UgewotICAgIHZlcmJvc2UgInRleHQgc2l6ZTogJHRleHRzaXplIgotICAgIHZlcmJvc2UgImRhdGEgc2l6ZTogJGRhdGFzaXplIgotICAgIGlmIHskdGV4dHNpemUgPCA4IHx8ICRkYXRhc2l6ZSA8IDR9IHRoZW4gewotCWZhaWwgInNpemUgLUEiCi0gICAgfSBlbHNlIHsKLQlwYXNzICJzaXplIC1BIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvdGVzdHByb2cuYyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvdGVzdHByb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiMTg1Ni4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byB0ZXN0IG9iamNvcHkgYW5kIHN0cmlwLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludCBjb21tb247Ci1pbnQgZ2xvYmFsID0gMTsKLXN0YXRpYyBpbnQgbG9jYWwgPSAyOwotc3RhdGljIGNoYXIgc3RyaW5nW10gPSAic3RyaW5nIjsKLQotaW50Ci1mbiAoKQotewotICByZXR1cm4gMzsKLX0KLQotaW50Ci1tYWluICgpCi17Ci0gIGlmIChjb21tb24gIT0gMAotICAgICAgfHwgZ2xvYmFsICE9IDEKLSAgICAgIHx8IGxvY2FsICE9IDIKLSAgICAgIHx8IHN0cmNtcCAoc3RyaW5nLCAic3RyaW5nIikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsZWRcbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHByaW50ZiAoIm9rXG4iKTsKLSAgZXhpdCAoMCk7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyODAyZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llLiAocm9iQGN5Z251cy5jb20pCi0KLWxvYWRfbGliIHV0aWwtZGVmcy5leHAKLWxvYWRfbGliIHV0aWxzLWxpYi5leHAKLQotaWYgIVtpbmZvIGV4aXN0cyBOTV0gdGhlbiB7Ci0gICAgc2V0IE5NIFtmaW5kZmlsZSAkYmFzZV9kaXIvbm0tbmV3ICRiYXNlX2Rpci9ubS1uZXcgW3RyYW5zZm9ybSBubV1dCi19Ci1pZiAhW2luZm8gZXhpc3RzIE5NRkxBR1NdIHRoZW4gewotICAgIHNldCBOTUZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgU0laRV0gdGhlbiB7Ci0gICAgc2V0IFNJWkUgW2ZpbmRmaWxlICRiYXNlX2Rpci9zaXplXQotfQotaWYgIVtpbmZvIGV4aXN0cyBTSVpFRkxBR1NdIHRoZW4gewotICAgIHNldCBTSVpFRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpEVU1QXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUCBbZmluZGZpbGUgJGJhc2VfZGlyL29iamR1bXBdCi19Ci1pZiAhW2luZm8gZXhpc3RzIE9CSkRVTVBGTEFHU10gdGhlbiB7Ci0gICAgc2V0IE9CSkRVTVBGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkNPUFldIHRoZW4gewotICAgIHNldCBPQkpDT1BZIFtmaW5kZmlsZSAkYmFzZV9kaXIvb2JqY29weV0KLX0KLWlmICFbaW5mbyBleGlzdHMgT0JKQ09QWUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKQ09QWUZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgQVJdIHRoZW4gewotICAgIHNldCBBUiBbZmluZGZpbGUgJGJhc2VfZGlyL2FyXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIFNUUklQXSB0aGVuIHsKLSAgICBzZXQgU1RSSVAgW2ZpbmRmaWxlICRiYXNlX2Rpci9zdHJpcC1uZXcgJGJhc2VfZGlyL3N0cmlwLW5ldyBbdHJhbnNmb3JtIHN0cmlwXV0KLX0KLWlmICFbaW5mbyBleGlzdHMgU1RSSVBGTEFHU10gdGhlbiB7Ci0gICAgc2V0IFNUUklQRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBSRUFERUxGXSB0aGVuIHsKLSAgICBzZXQgUkVBREVMRiBbZmluZGZpbGUgJGJhc2VfZGlyL3JlYWRlbGZdCi19Ci1pZiAhW2luZm8gZXhpc3RzIFJFQURFTEZGTEFHU10gdGhlbiB7Ci0gICAgc2V0IFJFQURFTEZGTEFHUyAiIgotfQotCi1pZiAhW2ZpbGUgaXNkaXJlY3RvcnkgdG1wZGlyXSB7Y2F0Y2ggImV4ZWMgbWtkaXIgdG1wZGlyIiBzdGF0dXN9Ci0KLSMKLSMgYmludXRpbHNfcnVuCi0jCXJ1biBhIHByb2dyYW0sIHJldHVybmluZyB0aGUgb3V0cHV0Ci0jCXNldHMgYmludXRpbHNfcnVuX2ZhaWxlZCBpZiB0aGUgcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAotIwotcHJvYyBiaW51dGlsc19ydW4geyBwcm9nIHByb2dhcmdzIH0gewotICAgIGRlZmF1bHRfYmludXRpbHNfcnVuICRwcm9nICRwcm9nYXJncwotfQotCi0jCi0jIGJpbnV0aWxzX2Fzc2VtYmxlCi0jCWFzc2VtYmxlIGEgZmlsZQotIwotcHJvYyBiaW51dGlsc19hc3NlbWJsZSB7IHNvdXJjZSBvYmplY3QgfSB7Ci0gICAgZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZSAkc291cmNlICRvYmplY3QKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvaHBwYS5zZWQgYi9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2hwcGEuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODYwN2Q4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvaHBwYS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXMvIyBPbGQgT1NGIHNlZCBibG93cyB1cCBpZiB5b3UgaGF2ZSBhIHNlZCBjb21tYW5kIHN0YXJ0aW5nIHdpdGggIiMiLy8KLXMvIyBBdm9pZCBpdCBieSBwdXR0aW5nIHRoZSBjb21tZW50cyB3aXRoaW4gcmVhbCBzZWQgY29tbWFuZHMuLy8KLXMvIyBGaXggdGhlIGRlZmluaXRpb24gb2YgY29tbW9uX3N5bWJvbCB0byBiZSBjb3JyZWN0IGZvciB0aGUgUEEgYXNzZWJtbGVycy4vLwotcy8JXC5jb21tIGNvbW1vbl9zeW1ib2wsNC9jb21tb25fc3ltYm9sCS5jb21tIDQvCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvbGliL3V0aWxzLWxpYi5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvbGliL3V0aWxzLWxpYi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2YyMTcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2xpYi91dGlscy1saWIuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZSA8cm9iQGN5Z251cy5jb20+Ci0jIGFuZCBleHRlbmRlZCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotcHJvYyBiaW51dGlsX3ZlcnNpb24geyBwcm9nIH0gewotICAgIGlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgcGF0aCBbd2hpY2ggJHByb2ddOwotCWlmIHskcGF0aCA9PSAwfSB0aGVuIHsKLQkgICAgcGVycm9yICIkcHJvZyBjYW4ndCBiZSBydW4sIGZpbGUgbm90IGZvdW5kLiIKLQkgICAgcmV0dXJuICIiCi0JfQotICAgIH0gZWxzZSB7Ci0Jc2V0IHBhdGggJHByb2cKLSAgICB9Ci0gICAgc2V0IHN0YXRlIFtyZW1vdGVfZXhlYyBob3N0ICRwcm9nIC0tdmVyc2lvbl07Ci0gICAgc2V0IHRtcCAiW2xpbmRleCAkc3RhdGUgMV1cbiI7Ci0gICAgIyBTaG91bGQgZmluZCBhIHdheSB0byBkaXNjYXJkIGNvbnN0YW50IHBhcnRzLCBrZWVwIHdoYXRldmVyJ3MKLSAgICAjIGxlZnQsIHNvIHRoZSB2ZXJzaW9uIHN0cmluZyBjb3VsZCBiZSBhbG1vc3QgYW55dGhpbmcgYXQgYWxsLi4uCi0gICAgcmVnZXhwICJcW15cblxdKiAoY3lnbnVzLXwpKFxbLTAtOS5hLXpBLVotXF0rKVxbXHJcblxdLioiICIkdG1wIiB2ZXJzaW9uIGN5ZyBudW1iZXIKLSAgICBpZiAhW2luZm8gZXhpc3RzIG51bWJlcl0gdGhlbiB7Ci0gICAgICAgIHJldHVybiAiJHBhdGggKG5vIHZlcnNpb24gbnVtYmVyKVxuIgotICAgIH0KLSAgICByZXR1cm4gIiRwYXRoICRudW1iZXJcbiIKLX0KLQotIwotIyBkZWZhdWx0X2JpbnV0aWxzX3J1bgotIwlydW4gYSBwcm9ncmFtLCByZXR1cm5pbmcgdGhlIG91dHB1dAotIwlzZXRzIGJpbnV0aWxzX3J1bl9mYWlsZWQgaWYgdGhlIHByb2dyYW0gZG9lcyBub3QgZXhpc3QKLSMKLXByb2MgZGVmYXVsdF9iaW51dGlsc19ydW4geyBwcm9nIHByb2dhcmdzIH0gewotICAgIGdsb2JhbCBiaW51dGlsc19ydW5fZmFpbGVkCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgc2V0IGJpbnV0aWxzX3J1bl9mYWlsZWQgMAotCi0gICAgaWYgIVtpc19yZW1vdGUgaG9zdF0gewotCWlmIHtbd2hpY2ggJHByb2ddID09IDB9IHRoZW4gewotCSAgICBwZXJyb3IgIiRwcm9nIGRvZXMgbm90IGV4aXN0IgotCSAgICBzZXQgYmludXRpbHNfcnVuX2ZhaWxlZCAxCi0JICAgIHJldHVybiAiIgotCX0KLSAgICB9Ci0KLSAgICBzZW5kX2xvZyAiJHByb2cgJHByb2dhcmdzXG4iCi0gICAgdmVyYm9zZSAiJHByb2cgJHByb2dhcmdzIgotCi0gICAgIyBHb3R0YSBxdW90ZSBkb2xsYXItc2lnbnMgYmVjYXVzZSB0aGV5IGdldCBtYW5nbGVkIGJ5IHRoZQotICAgICMgc2hlbGwgb3RoZXJ3aXNlLgotICAgIHJlZ3N1YiAtYWxsICJcXCQiICIkcHJvZ2FyZ3MiICJcXCQiIHByb2dhcmdzCi0KLSAgICBzZXQgc3RhdGUgW3JlbW90ZV9leGVjIGhvc3QgJHByb2cgJHByb2dhcmdzXQotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgW2xpbmRleCAkc3RhdGUgMV1dOwotICAgIGlmIHshW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdfSB0aGVuIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotICAgIH0KLSAgICByZXR1cm4gJGV4ZWNfb3V0cHV0Ci19Ci0KLSMKLSMgZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZQotIwlhc3NlbWJsZSBhIGZpbGUKLSMKLXByb2MgZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZSB7IHNvdXJjZSBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgICMgVGhlIEhQUEEgYXNzZW1ibGVyIHN5bnRheCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQgdGhhbiBtb3N0LCB0byBtYWtlCi0gICAgIyB0aGUgdGVzdCBzb3VyY2UgZmlsZSBhc3NlbWJsZSB3ZSBuZWVkIHRvIHJ1biBpdCB0aHJvdWdoIHNlZC4KLSAgICAjCi0gICAgIyBUaGlzIGlzIGEgaGFjayBpbiB0aGF0IGl0IHdvbid0IHNjYWxlIHdlbGwgaWYgb3RoZXIgdGFyZ2V0cyBuZWVkCi0gICAgIyBzaW1pbGFyIHRyYW5zZm9ybWF0aW9ucyB0byBhc3NlbWJsZS4gIFdlJ2xsIGdlbmVyYWxpemUgdGhlIGhhY2sKLSAgICAjIGlmL3doZW4gb3RoZXIgdGFyZ2V0cyBuZWVkIHNpbWlsYXIgaGFuZGxpbmcuCi0gICAgaWYgW2lzdGFyZ2V0ICJocHBhKi0qLSoiIF0gdGhlbiB7Ci0Jc2VuZF9sb2cgInNlZCAtZiAkc3JjZGlyL2NvbmZpZy9ocHBhLnNlZCA8ICRzb3VyY2UgPiBhc20uc1xuIgotCXZlcmJvc2UgInNlZCAtZiAkc3JjZGlyL2NvbmZpZy9ocHBhLnNlZCA8ICRzb3VyY2UgPiBhc20ucyIKLQljYXRjaCAiZXhlYyBzZWQgLWYgJHNyY2Rpci9jb25maWcvaHBwYS5zZWQgPCAkc291cmNlID4gYXNtLnMiOwotCXNldCBzb3VyY2UgYXNtLnMKLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW3RhcmdldF9hc3NlbWJsZSAkc291cmNlICRvYmplY3QgIiJdOwotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQlwZXJyb3IgIiRzb3VyY2U6IGFzc2VtYmx5IGZhaWxlZCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyB0YXJnZXRfYXNzZW1ibGVdIHsKLSMKLSMgU3RvbGVuIGZyb20gZGVqYWdudS9saWIvdGFyZ2V0LmV4cC0tcGxlYXNlIHJlbW92ZSBhZnRlciAxLzEvOTguCi0jCi11cGxldmVsICMwIHsKLSAgICBwcm9jIHRhcmdldF9hc3NlbWJsZSB7IHNvdXJjZSBkZXN0ZmlsZSBmbGFncyB9IHsKLQlyZXR1cm4gW2RlZmF1bHRfdGFyZ2V0X2Fzc2VtYmxlICRzb3VyY2UgJGRlc3RmaWxlICRmbGFnc107Ci0gICAgfQotCi0gICAgcHJvYyBkZWZhdWx0X3RhcmdldF9hc3NlbWJsZSB7IHNvdXJjZSBkZXN0ZmlsZSBmbGFncyB9IHsKLQlnbG9iYWwgQVNfRk9SX1RBUkdFVDsKLQlnbG9iYWwgQVNGTEFHU19GT1JfVEFSR0VUOwotCi0JaWYgW2luZm8gZXhpc3RzIEFTX0ZPUl9UQVJHRVRdIHsKLQkgICAgc2V0IEFTICIkQVNfRk9SX1RBUkdFVCI7Ci0JfSBlbHNlIHsKLQkgICAgaWYgIVtib2FyZF9pbmZvIHRhcmdldCBleGlzdHMgYXNzZW1ibGVyXSB7Ci0JCXNldCBBUyBbZmluZF9nYXNdOwotCSAgICB9IGVsc2UgewotCQlzZXQgQVMgW2JvYXJkX2luZm8gdGFyZ2V0IGFzc2VtYmxlcl07Ci0JICAgIH0KLQl9Ci0KLQlpZiBbaW5mbyBleGlzdHMgQVNGTEFHU19GT1JfVEFSR0VUXSB7Ci0JICAgIGFwcGVuZCBmbGFncyAiICRBU0ZMQUdTX0ZPUl9UQVJHRVQiOwotCX0KLQotCWlmIFtpc19yZW1vdGUgaG9zdF0gewotCSAgICBzZXQgc291cmNlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCAkc291cmNlXTsKLQkgICAgc2V0IGRlc3QgImEub3V0IgotCX0gZWxzZSB7Ci0JICAgIHNldCBkZXN0ICRkZXN0ZmlsZQotCX0KLQlzZXQgc3RhdHVzIFtyZW1vdGVfZXhlYyBob3N0ICIkQVMgJHNvdXJjZSAkZmxhZ3MgLW8gJGRlc3QiXQotCWlmIFtpc19yZW1vdGUgaG9zdF0gewotCSAgICByZW1vdGVfdXBsb2FkIGhvc3QgJGRlc3QgJGRlc3RmaWxlCi0JfQotCi0Jc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyBbbGluZGV4ICRzdGF0dXMgMV1dOwotCWlmIHsgW2xpbmRleCAkc3RhdHVzIDBdICE9IDAgfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiYXNzZW1ibGVyIGV4aXRlZCB3aXRoIHN0YXR1cyBbbGluZGV4ICRzdGF0dXMgMF0iOwotCX0KLQlpZiB7IFtsaW5kZXggJHN0YXR1cyAxXSAhPSAiIiB9IHsKLQkgICAgdmVyYm9zZSAtbG9nICJhc3NlbWJsZXIgb3V0cHV0IGlzOlxuW2xpbmRleCAkc3RhdHVzIDFdIiAyOwotCX0KLQlyZXR1cm4gJHtjb21wX291dHB1dH07Ci19Ci19Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy92ZXJzaW9uLmMgYi9iaW51dGlscy92ZXJzaW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNTU5MzkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdmVyc2lvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyogdmVyc2lvbi5jIC0tIGJpbnV0aWxzIHZlcnNpb24gaW5mb3JtYXRpb24KLSAgIENvcHlyaWdodCAxOTkxLCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0vKiBUaGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlcnMgZm9yIHRoZSBiaW51dGlscy4gIFRoZXkgYWxsIGNoYW5nZSBpbgotICAgbG9ja3N0ZXAgLS0gaXQncyBlYXNpZXIgdGhhdCB3YXkuICovCi0KLWNvbnN0IGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9IFZFUlNJT047Ci0KLS8qIFByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgY29weXJpZ2h0IGluZm9ybWF0aW9uLCBhbmQgZXhpdC4gIFRoaXMKLSAgIGltcGxlbWVudHMgdGhlIC0tdmVyc2lvbiBvcHRpb24gZm9yIHRoZSB2YXJpb3VzIHByb2dyYW1zLiAgKi8KLQotdm9pZAotcHJpbnRfdmVyc2lvbiAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LiAgKi8KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgcHJpbnRmICgiR05VICVzICVzXG4iLCBuYW1lLCBwcm9ncmFtX3ZlcnNpb24pOwotICBwcmludGYgKF8oIkNvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIikpOwotICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKLSAgZXhpdCAoMCk7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy93aW5kcmVzLmMgYi9iaW51dGlscy93aW5kcmVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMjRiNDcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvd2luZHJlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwOSArMCwwIEBACi0vKiB3aW5kcmVzLmMgLS0gYSBwcm9ncmFtIHRvIG1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMKLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBwcm9ncmFtIGNhbiByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJlc291cmNlcyBpbiB2YXJpb3VzCi0gICBmb3JtYXRzLiAgSW4gcGFydGljdWxhciwgaXQgY2FuIGFjdCBsaWtlIHRoZSByYyByZXNvdXJjZSBjb21waWxlcgotICAgcHJvZ3JhbSwgYW5kIGl0IGNhbiBhY3QgbGlrZSB0aGUgY3Z0cmVzIHJlcyB0byBDT0ZGIGNvbnZlcnNpb24KLSAgIHByb2dyYW0uCi0KLSAgIEl0IGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIHRha2VuIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzOgotCi0gICAqIE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uLgotCi0gICAqIFRoZSByY2wgcHJvZ3JhbSwgd3JpdHRlbiBieSBHdW50aGVyIEViZXJ0Ci0gICAgIDxndW50aGVyLmViZXJ0QGl4b3MtbGVpcHppZy5kZT4uCi0KLSAgICogVGhlIHJlczJjb2ZmIHByb2dyYW0sIHdyaXR0ZW4gYnkgUGVkcm8gQS4gQXJhbmRhIDxwYWFnQHRpZC5lcz4uCi0KLSAgICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qIHVzZWQgYnkgcmVzcmMuYyBhdCBsZWFzdCAqLwotCi1pbnQgdmVyYm9zZSA9IDA7Ci0KLS8qIEFuIGVudW1lcmF0aW9uIG9mIGZvcm1hdCB0eXBlcy4gICovCi0KLWVudW0gcmVzX2Zvcm1hdAotewotICAvKiBVbmtub3duIGZvcm1hdC4gICovCi0gIFJFU19GT1JNQVRfVU5LTk9XTiwKLSAgLyogVGV4dHVhbCBSQyBmaWxlLiAgKi8KLSAgUkVTX0ZPUk1BVF9SQywKLSAgLyogQmluYXJ5IFJFUyBmaWxlLiAgKi8KLSAgUkVTX0ZPUk1BVF9SRVMsCi0gIC8qIENPRkYgZmlsZS4gICovCi0gIFJFU19GT1JNQVRfQ09GRgotfTsKLQotLyogQSBzdHJ1Y3R1cmUgdXNlZCB0byBtYXAgYmV0d2VlbiBmb3JtYXQgdHlwZXMgYW5kIHN0cmluZ3MuICAqLwotCi1zdHJ1Y3QgZm9ybWF0X21hcAotewotICBjb25zdCBjaGFyICpuYW1lOwotICBlbnVtIHJlc19mb3JtYXQgZm9ybWF0OwotfTsKLQotLyogQSBtYXBwaW5nIGJldHdlZW4gbmFtZXMgYW5kIGZvcm1hdCB0eXBlcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZm9ybWF0X21hcCBmb3JtYXRfbmFtZXNbXSA9Ci17Ci0gIHsgInJjIiwgUkVTX0ZPUk1BVF9SQyB9LAotICB7ICJyZXMiLCBSRVNfRk9STUFUX1JFUyB9LAotICB7ICJjb2ZmIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCi0gIHsgTlVMTCwgUkVTX0ZPUk1BVF9VTktOT1dOIH0KLX07Ci0KLS8qIEEgbWFwcGluZyBmcm9tIGZpbGUgZXh0ZW5zaW9ucyB0byBmb3JtYXQgdHlwZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgZm9ybWF0X2ZpbGVleHRzW10gPQotewotICB7ICJyYyIsIFJFU19GT1JNQVRfUkMgfSwKLSAgeyAicmVzIiwgUkVTX0ZPUk1BVF9SRVMgfSwKLSAgeyAiZXhlIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCi0gIHsgIm9iaiIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7ICJvIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCi0gIHsgTlVMTCwgUkVTX0ZPUk1BVF9VTktOT1dOIH0KLX07Ci0KLS8qIEEgbGlzdCBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzLiAgKi8KLQotc3RydWN0IGluY2x1ZGVfZGlyCi17Ci0gIHN0cnVjdCBpbmNsdWRlX2RpciAqbmV4dDsKLSAgY2hhciAqZGlyOwotfTsKLQotc3RhdGljIHN0cnVjdCBpbmNsdWRlX2RpciAqaW5jbHVkZV9kaXJzOwotCi0vKiBMb25nIG9wdGlvbnMuICAqLwotCi0vKiAxNTAgaXNuJ3Qgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0RFRklORSAxNTAKLSNkZWZpbmUgT1BUSU9OX0hFTFAgKE9QVElPTl9ERUZJTkUgKyAxKQotI2RlZmluZSBPUFRJT05fSU5DTFVERV9ESVIgKE9QVElPTl9IRUxQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0xBTkdVQUdFIChPUFRJT05fSU5DTFVERV9ESVIgKyAxKQotI2RlZmluZSBPUFRJT05fUFJFUFJPQ0VTU09SIChPUFRJT05fTEFOR1VBR0UgKyAxKQotI2RlZmluZSBPUFRJT05fVVNFX1RFTVBfRklMRSAoT1BUSU9OX1BSRVBST0NFU1NPUiArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19VU0VfVEVNUF9GSUxFIChPUFRJT05fVVNFX1RFTVBfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OIChPUFRJT05fTk9fVVNFX1RFTVBfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9ZWURFQlVHIChPUFRJT05fVkVSU0lPTiArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJkZWZpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0RFRklORX0sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fSEVMUH0sCi0gIHsiaW5jbHVkZS1kaXIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0lOQ0xVREVfRElSfSwKLSAgeyJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJsYW5ndWFnZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fTEFOR1VBR0V9LAotICB7Im91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJwcmVwcm9jZXNzb3IiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX1BSRVBST0NFU1NPUn0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCi0gIHsidXNlLXRlbXAtZmlsZSIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fVVNFX1RFTVBfRklMRX0sCi0gIHsibm8tdXNlLXRlbXAtZmlsZSIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fTk9fVVNFX1RFTVBfRklMRX0sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1ZFUlNJT059LAotICB7Inl5ZGVidWciLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1lZREVCVUd9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0vKiBTdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgcmVzX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBleHRlbmRlZF9tZW51aXRlbXMgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnVpdGVtICopKTsKLXN0YXRpYyBlbnVtIHJlc19mb3JtYXQgZm9ybWF0X2Zyb21fbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBlbnVtIHJlc19mb3JtYXQgZm9ybWF0X2Zyb21fZmlsZW5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGNtcF9yZXNfZW50cnkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqc29ydF9yZXNvdXJjZXMgUEFSQU1TICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOwotDAotLyogV2hlbiB3ZSBhcmUgYnVpbGRpbmcgYSByZXNvdXJjZSB0cmVlLCB3ZSBhbGxvY2F0ZSBldmVyeXRoaW5nIG9udG8KLSAgIGFuIG9ic3RhY2ssIHNvIHRoYXQgd2UgY2FuIGZyZWUgaXQgYWxsIGF0IG9uY2UgaWYgd2Ugd2FudC4gICovCi0KLSNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCi0KLS8qIFRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvYnN0YWNrIHJlc19vYnN0YWNrOwotCi0vKiBJbml0aWFsaXplIHRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlc19pbml0ICgpCi17Ci0gIG9ic3RhY2tfaW5pdCAoJnJlc19vYnN0YWNrKTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2Ugb24gdGhlIHJlc291cmNlIGJ1aWxkaW5nIG9ic3RhY2suICAqLwotCi1QVFIKLXJlc19hbGxvYyAoYnl0ZXMpCi0gICAgIHNpemVfdCBieXRlczsKLXsKLSAgcmV0dXJuIChQVFIpIG9ic3RhY2tfYWxsb2MgKCZyZXNfb2JzdGFjaywgYnl0ZXMpOwotfQotCi0vKiBXZSBhbHNvIHVzZSBhbiBvYnN0YWNrIHRvIHNhdmUgbWVtb3J5IHVzZWQgd2hpbGUgd3JpdGluZyBvdXQgYSBzZXQKLSAgIG9mIHJlc291cmNlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayByZXN3cl9vYnN0YWNrOwotCi0vKiBJbml0aWFsaXplIHRoZSByZXNvdXJjZSB3cml0aW5nIG9ic3RhY2suICAqLwotCi1zdGF0aWMgdm9pZAotcmVzd3JfaW5pdCAoKQotewotICBvYnN0YWNrX2luaXQgKCZyZXN3cl9vYnN0YWNrKTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2Ugb24gdGhlIHJlc291cmNlIHdyaXRpbmcgb2JzdGFjay4gICovCi0KLVBUUgotcmVzd3JfYWxsb2MgKGJ5dGVzKQotICAgICBzaXplX3QgYnl0ZXM7Ci17Ci0gIHJldHVybiAoUFRSKSBvYnN0YWNrX2FsbG9jICgmcmVzd3Jfb2JzdGFjaywgYnl0ZXMpOwotfQotDAotLyogT3BlbiBhIGZpbGUgdXNpbmcgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IHNlYXJjaCBsaXN0LiAgKi8KLQotRklMRSAqCi1vcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgbW9kZSwgZXJybXNnLCByZWFsX2ZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbW9kZTsKLSAgICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgICBjaGFyICoqcmVhbF9maWxlbmFtZTsKLXsKLSAgRklMRSAqZTsKLSAgc3RydWN0IGluY2x1ZGVfZGlyICpkOwotCi0gIGUgPSBmb3BlbiAoZmlsZW5hbWUsIG1vZGUpOwotICBpZiAoZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICpyZWFsX2ZpbGVuYW1lID0geHN0cmR1cCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gIGlmIChlcnJubyA9PSBFTk9FTlQpCi0gICAgewotICAgICAgZm9yIChkID0gaW5jbHVkZV9kaXJzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCXsKLQkgIGNoYXIgKm47Ci0KLQkgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGQtPmRpcikgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDIpOwotCSAgc3ByaW50ZiAobiwgIiVzLyVzIiwgZC0+ZGlyLCBmaWxlbmFtZSk7Ci0JICBlID0gZm9wZW4gKG4sIG1vZGUpOwotCSAgaWYgKGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgICpyZWFsX2ZpbGVuYW1lID0gbjsKLQkgICAgICByZXR1cm4gZTsKLQkgICAgfQotCi0JICBpZiAoZXJybm8gIT0gRU5PRU5UKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZhdGFsIChfKCJjYW4ndCBvcGVuICVzIGAlcyc6ICVzIiksIGVycm1zZywgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIC8qIFJldHVybiBhIHZhbHVlIHRvIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZy4gICovCi0gIHJldHVybiBOVUxMOwotfQotDAotLyogQ29tcGFyZSB0d28gcmVzb3VyY2UgSUQncy4gIFdlIGNvbnNpZGVyIG5hbWUgZW50cmllcyB0byBjb21lIGJlZm9yZQotICAgbnVtZXJpYyBlbnRyaWVzLCBiZWNhdXNlIHRoYXQgaXMgaG93IHRoZXkgYXBwZWFyIGluIHRoZSBDT0ZGIC5yc3JjCi0gICBzZWN0aW9uLiAgKi8KLQotaW50Ci1yZXNfaWRfY21wIChhLCBiKQotICAgICBzdHJ1Y3QgcmVzX2lkIGE7Ci0gICAgIHN0cnVjdCByZXNfaWQgYjsKLXsKLSAgaWYgKCEgYS5uYW1lZCkKLSAgICB7Ci0gICAgICBpZiAoYi5uYW1lZCkKLQlyZXR1cm4gMTsKLSAgICAgIGlmIChhLnUuaWQgPiBiLnUuaWQpCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlIGlmIChhLnUuaWQgPCBiLnUuaWQpCi0JcmV0dXJuIC0xOwotICAgICAgZWxzZQotCXJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuaWNoYXIgKmFzLCAqYXNlLCAqYnMsICpic2U7Ci0KLSAgICAgIGlmICghIGIubmFtZWQpCi0JcmV0dXJuIC0xOwotCi0gICAgICBhcyA9IGEudS5uLm5hbWU7Ci0gICAgICBhc2UgPSBhcyArIGEudS5uLmxlbmd0aDsKLSAgICAgIGJzID0gYi51Lm4ubmFtZTsKLSAgICAgIGJzZSA9IGJzICsgYi51Lm4ubGVuZ3RoOwotCi0gICAgICB3aGlsZSAoYXMgPCBhc2UpCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmIChicyA+PSBic2UpCi0JICAgIHJldHVybiAxOwotCSAgaSA9IChpbnQpICphcyAtIChpbnQpICpiczsKLQkgIGlmIChpICE9IDApCi0JICAgIHJldHVybiBpOwotCSAgKythczsKLQkgICsrYnM7Ci0JfQotCi0gICAgICBpZiAoYnMgPCBic2UpCi0JcmV0dXJuIC0xOwotCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgcmVzb3VyY2UgSUQuICAqLwotCi12b2lkCi1yZXNfaWRfcHJpbnQgKHN0cmVhbSwgaWQsIHF1b3RlKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGludCBxdW90ZTsKLXsKLSAgaWYgKCEgaWQubmFtZWQpCi0gICAgZnByaW50ZiAoc3RyZWFtLCAiJWx1IiwgaWQudS5pZCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocXVvdGUpCi0JcHV0YyAoJyInLCBzdHJlYW0pOwotICAgICAgdW5pY29kZV9wcmludCAoc3RyZWFtLCBpZC51Lm4ubmFtZSwgaWQudS5uLmxlbmd0aCk7Ci0gICAgICBpZiAocXVvdGUpCi0JcHV0YyAoJyInLCBzdHJlYW0pOwotICAgIH0KLX0KLQotLyogUHJpbnQgYSBsaXN0IG9mIHJlc291cmNlIElEJ3MuICAqLwotCi12b2lkCi1yZXNfaWRzX3ByaW50IChzdHJlYW0sIGNpZHMsIGlkcykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgY2lkczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2lkczsgaSsrKQotICAgIHsKLSAgICAgIHJlc19pZF9wcmludCAoc3RyZWFtLCBpZHNbaV0sIDEpOwotICAgICAgaWYgKGkgKyAxIDwgY2lkcykKLQlmcHJpbnRmIChzdHJlYW0sICI6ICIpOwotICAgIH0KLX0KLQotLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSByZXNvdXJjZSBJRC4gICovCi0KLXZvaWQKLXJlc19zdHJpbmdfdG9faWQgKHJlc19pZCwgc3RyaW5nKQotICAgICBzdHJ1Y3QgcmVzX2lkICpyZXNfaWQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgcmVzX2lkLT5uYW1lZCA9IDE7Ci0gIHVuaWNvZGVfZnJvbV9hc2NpaSAoJnJlc19pZC0+dS5uLmxlbmd0aCwgJnJlc19pZC0+dS5uLm5hbWUsIHN0cmluZyk7Ci19Ci0KLS8qIERlZmluZSBhIHJlc291cmNlLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHJlc291cmNlIHRyZWUsIFJFU09VUkNFUywKLSAgIGFuZCB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdG8gcHV0IGl0IGluIHRoZSB0cmVlLCBDSURTIGFuZCBJRFMuCi0gICBUaGlzIHJldHVybnMgYSBuZXdseSBhbGxvY2F0ZWQgcmVzX3Jlc291cmNlIHN0cnVjdHVyZSwgd2hpY2ggdGhlCi0gICBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaW5pdGlhbGl6ZS4gIElmIERVUE9LIGlzIG5vbi16ZXJvLCB0aGVuIGlmIGEKLSAgIHJlc291cmNlIHdpdGggdGhpcyBJRCBleGlzdHMsIGl0IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBhIHdhcm5pbmcKLSAgIGlzIGlzc3VlZCwgYW5kIGEgbmV3IHJlc291cmNlIGlzIGNyZWF0ZWQgcmVwbGFjaW5nIHRoZSBleGlzdGluZwotICAgb25lLiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1kZWZpbmVfcmVzb3VyY2UgKHJlc291cmNlcywgY2lkcywgaWRzLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7Ci0gICAgIGludCBjaWRzOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZHM7Ci0gICAgIGludCBkdXBvazsKLXsKLSAgc3RydWN0IHJlc19lbnRyeSAqcmUgPSBOVUxMOwotICBpbnQgaTsKLQotICBhc3NlcnQgKGNpZHMgPiAwKTsKLSAgZm9yIChpID0gMDsgaSA8IGNpZHM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICoqcHA7Ci0KLSAgICAgIGlmICgqcmVzb3VyY2VzID09IE5VTEwpCi0JewotCSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXZhbDsKLQotCSAgLyogVXNlIHRoZSBzYW1lIHRpbWVzdGFtcCBmb3IgZXZlcnkgcmVzb3VyY2UgY3JlYXRlZCBpbiBhCi0gICAgICAgICAgICAgc2luZ2xlIHJ1bi4gICovCi0JICBpZiAodGltZXZhbCA9PSAwKQotCSAgICB0aW1ldmFsID0gdGltZSAoTlVMTCk7Ci0KLQkgICpyZXNvdXJjZXMgPSAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopCi0JCQlyZXNfYWxsb2MgKHNpemVvZiAqKnJlc291cmNlcykpOwotCSAgKCpyZXNvdXJjZXMpLT5jaGFyYWN0ZXJpc3RpY3MgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT50aW1lID0gdGltZXZhbDsKLQkgICgqcmVzb3VyY2VzKS0+bWFqb3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5taW5vciA9IDA7Ci0JICAoKnJlc291cmNlcyktPmVudHJpZXMgPSBOVUxMOwotCX0KLQotICAgICAgZm9yIChwcCA9ICYoKnJlc291cmNlcyktPmVudHJpZXM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQlpZiAocmVzX2lkX2NtcCAoKCpwcCktPmlkLCBpZHNbaV0pID09IDApCi0JICBicmVhazsKLQotICAgICAgaWYgKCpwcCAhPSBOVUxMKQotCXJlID0gKnBwOwotICAgICAgZWxzZQotCXsKLQkgIHJlID0gKHN0cnVjdCByZXNfZW50cnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJlKTsKLQkgIHJlLT5uZXh0ID0gTlVMTDsKLQkgIHJlLT5pZCA9IGlkc1tpXTsKLQkgIGlmICgoaSArIDEpIDwgY2lkcykKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAxOwotCSAgICAgIHJlLT51LmRpciA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAwOwotCSAgICAgIHJlLT51LnJlcyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnBwID0gcmU7Ci0JfQotCi0gICAgICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JewotCSAgaWYgKCEgcmUtPnN1YmRpcikKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgaSwgaWRzKTsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIpKTsKLQkgICAgICB4ZXhpdCAoMSk7Ci0JICAgIH0KLQotCSAgcmVzb3VyY2VzID0gJnJlLT51LmRpcjsKLQl9Ci0gICAgfQotCi0gIGlmIChyZS0+c3ViZGlyKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGV4cGVjdGVkIHRvIGJlIGEgbGVhZlxuIikpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocmUtPnUucmVzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR1cG9rKQotCXJldHVybiByZS0+dS5yZXM7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6ICIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGR1cGxpY2F0ZSB2YWx1ZVxuIikpOwotICAgIH0KLQotICByZS0+dS5yZXMgPSAoKHN0cnVjdCByZXNfcmVzb3VyY2UgKikKLQkgICAgICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCByZXNfcmVzb3VyY2UpKSk7Ci0KLSAgcmUtPnUucmVzLT50eXBlID0gUkVTX1RZUEVfVU5JTklUSUFMSVpFRDsKLSAgbWVtc2V0ICgmcmUtPnUucmVzLT5yZXNfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7Ci0gIG1lbXNldCAoJnJlLT51LnJlcy0+Y29mZl9pbmZvLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfY29mZl9pbmZvKSk7Ci0KLSAgcmV0dXJuIHJlLT51LnJlczsKLX0KLQotLyogRGVmaW5lIGEgc3RhbmRhcmQgcmVzb3VyY2UuICBUaGlzIGlzIGEgdmVyc2lvbiBvZiBkZWZpbmVfcmVzb3VyY2UKLSAgIHRoYXQganVzdCB0YWtlcyB0eXBlLCBuYW1lLCBhbmQgbGFuZ3VhZ2UgYXJndW1lbnRzLiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1kZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKHJlc291cmNlcywgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGR1cG9rKQotICAgICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKnJlc291cmNlczsKLSAgICAgaW50IHR5cGU7Ci0gICAgIHN0cnVjdCByZXNfaWQgbmFtZTsKLSAgICAgaW50IGxhbmd1YWdlOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfaWQgYVszXTsKLQotICBhWzBdLm5hbWVkID0gMDsKLSAgYVswXS51LmlkID0gdHlwZTsKLSAgYVsxXSA9IG5hbWU7Ci0gIGFbMl0ubmFtZWQgPSAwOwotICBhWzJdLnUuaWQgPSBsYW5ndWFnZTsKLSAgcmV0dXJuIGRlZmluZV9yZXNvdXJjZSAocmVzb3VyY2VzLCAzLCBhLCBkdXBvayk7Ci19Ci0KLS8qIENvbXBhcmlzb24gcm91dGluZSBmb3IgcmVzb3VyY2Ugc29ydGluZy4gICovCi0KLXN0YXRpYyBpbnQKLWNtcF9yZXNfZW50cnkgKHAxLCBwMikKLSAgICAgY29uc3QgUFRSIHAxOwotICAgICBjb25zdCBQVFIgcDI7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKipyZTEsICoqcmUyOwotCi0gIHJlMSA9IChjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqKSBwMTsKLSAgcmUyID0gKGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKiopIHAyOwotICByZXR1cm4gcmVzX2lkX2NtcCAoKCpyZTEpLT5pZCwgKCpyZTIpLT5pZCk7Ci19Ci0KLS8qIFNvcnQgdGhlIHJlc291cmNlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1zb3J0X3Jlc291cmNlcyAocmVzZGlyKQotICAgICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzZGlyOwotewotICBpbnQgYywgaTsKLSAgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0gIHN0cnVjdCByZXNfZW50cnkgKiphOwotCi0gIGlmIChyZXNkaXItPmVudHJpZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gcmVzZGlyOwotCi0gIGMgPSAwOwotICBmb3IgKHJlID0gcmVzZGlyLT5lbnRyaWVzOyByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQotICAgICsrYzsKLQotICAvKiBUaGlzIGlzIGEgcmVjdXJzaXZlIHJvdXRpbmUsIHNvIHVzaW5nIHhtYWxsb2MgaXMgcHJvYmFibHkgYmV0dGVyCi0gICAgIHRoYW4gYWxsb2NhLiAgKi8KLSAgYSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICoqKSB4bWFsbG9jIChjICogc2l6ZW9mIChzdHJ1Y3QgcmVzX2VudHJ5ICopKTsKLQotICBmb3IgKGkgPSAwLCByZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCwgaSsrKQotICAgIGFbaV0gPSByZTsKLQotICBxc29ydCAoYSwgYywgc2l6ZW9mIChzdHJ1Y3QgcmVzX2VudHJ5ICopLCBjbXBfcmVzX2VudHJ5KTsKLQotICByZXNkaXItPmVudHJpZXMgPSBhWzBdOwotICBmb3IgKGkgPSAwOyBpIDwgYyAtIDE7IGkrKykKLSAgICBhW2ldLT5uZXh0ID0gYVtpICsgMV07Ci0gIGFbaV0tPm5leHQgPSBOVUxMOwotCi0gIGZyZWUgKGEpOwotCi0gIC8qIE5vdyBzb3J0IHRoZSBzdWJkaXJlY3Rvcmllcy4gICovCi0KLSAgZm9yIChyZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICBpZiAocmUtPnN1YmRpcikKLSAgICAgIHJlLT51LmRpciA9IHNvcnRfcmVzb3VyY2VzIChyZS0+dS5kaXIpOwotCi0gIHJldHVybiByZXNkaXI7Ci19Ci0MCi0vKiBSZXR1cm4gd2hldGhlciB0aGUgZGlhbG9nIHJlc291cmNlIERJQUxPRyBpcyBhIERJQUxPRyBvciBhCi0gICBESUFMT0dFWC4gICovCi0KLWludAotZXh0ZW5kZWRfZGlhbG9nIChkaWFsb2cpCi0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpYWxvZ19jb250cm9sICpjOwotCi0gIGlmIChkaWFsb2ctPmV4ICE9IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0KLSAgZm9yIChjID0gZGlhbG9nLT5jb250cm9sczsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dCkKLSAgICBpZiAoYy0+ZGF0YSAhPSBOVUxMIHx8IGMtPmhlbHAgIT0gMCkKLSAgICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBNRU5VSVRFTVMgYXJlIGEgTUVOVSBvciBhIE1FTlVFWC4gICovCi0KLWludAotZXh0ZW5kZWRfbWVudSAobWVudSkKLSAgICAgY29uc3Qgc3RydWN0IG1lbnUgKm1lbnU7Ci17Ci0gIHJldHVybiBleHRlbmRlZF9tZW51aXRlbXMgKG1lbnUtPml0ZW1zKTsKLX0KLQotc3RhdGljIGludAotZXh0ZW5kZWRfbWVudWl0ZW1zIChtZW51aXRlbXMpCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWVudWl0ZW1zOwotewotICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gIGZvciAobWkgPSBtZW51aXRlbXM7IG1pICE9IE5VTEw7IG1pID0gbWktPm5leHQpCi0gICAgewotICAgICAgaWYgKG1pLT5oZWxwICE9IDAgfHwgbWktPnN0YXRlICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwgJiYgbWktPmlkICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKG1pLT50eXBlCi0JICAgJiB+IChNRU5VSVRFTV9DSEVDS0VECi0JCXwgTUVOVUlURU1fR1JBWUVECi0JCXwgTUVOVUlURU1fSEVMUAotCQl8IE1FTlVJVEVNX0lOQUNUSVZFCi0JCXwgTUVOVUlURU1fTUVOVUJBUkJSRUFLCi0JCXwgTUVOVUlURU1fTUVOVUJSRUFLKSkKLQkgICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JewotCSAgaWYgKGV4dGVuZGVkX21lbnVpdGVtcyAobWktPnBvcHVwKSkKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQwKLS8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBmb3JtYXQgdHlwZSwgb3IgZXhpdCBpZiBpdCBjYW4ndCBiZSBkb25lLiAgKi8KLQotc3RhdGljIGVudW0gcmVzX2Zvcm1hdAotZm9ybWF0X2Zyb21fbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgKm07Ci0KLSAgZm9yIChtID0gZm9ybWF0X25hbWVzOyBtLT5uYW1lICE9IE5VTEw7IG0rKykKLSAgICBpZiAoc3RyY2FzZWNtcCAobS0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChtLT5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5rbm93biBmb3JtYXQgdHlwZSBgJXMnXG4iKSwgcHJvZ3JhbV9uYW1lLCBuYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHN1cHBvcnRlZCBmb3JtYXRzOiIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgZm9yIChtID0gZm9ybWF0X25hbWVzOyBtLT5uYW1lICE9IE5VTEw7IG0rKykKLQlmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBtLT5uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIHJldHVybiBtLT5mb3JtYXQ7Ci19Ci0KLS8qIFdvcmsgb3V0IGEgZm9ybWF0IHR5cGUgZ2l2ZW4gYSBmaWxlIG5hbWUuICBJZiBJTlBVVCBpcyBub24temVybywKLSAgIGl0J3MgT0sgdG8gbG9vayBhdCB0aGUgZmlsZSBpdHNlbGYuICAqLwotCi1zdGF0aWMgZW51bSByZXNfZm9ybWF0Ci1mb3JtYXRfZnJvbV9maWxlbmFtZSAoZmlsZW5hbWUsIGlucHV0KQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgaW50IGlucHV0OwotewotICBjb25zdCBjaGFyICpleHQ7Ci0gIEZJTEUgKmU7Ci0gIHVuc2lnbmVkIGNoYXIgYjEsIGIyLCBiMywgYjQsIGI1OwotICBpbnQgbWFnaWM7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbiBleHRlbnNpb24sIHNlZSBpZiB3ZSByZWNvZ25pemUgaXQgYXMgaW1wbHlpbmcgYQotICAgICBwYXJ0aWN1bGFyIGZvcm1hdC4gICovCi0gIGV4dCA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLicpOwotICBpZiAoZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgKm07Ci0KLSAgICAgICsrZXh0OwotICAgICAgZm9yIChtID0gZm9ybWF0X2ZpbGVleHRzOyBtLT5uYW1lICE9IE5VTEw7IG0rKykKLQlpZiAoc3RyY2FzZWNtcCAobS0+bmFtZSwgZXh0KSA9PSAwKQotCSAgcmV0dXJuIG0tPmZvcm1hdDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgZG9uJ3QgcmVjb2duaXplIHRoZSBuYW1lIG9mIGFuIG91dHB1dCBmaWxlLCBhc3N1bWUgaXQncyBhCi0gICAgIENPRkYgZmlsZS4gICovCi0KLSAgaWYgKCEgaW5wdXQpCi0gICAgcmV0dXJuIFJFU19GT1JNQVRfQ09GRjsKLQotICAvKiBSZWFkIHRoZSBmaXJzdCBmZXcgYnl0ZXMgb2YgdGhlIGZpbGUgdG8gc2VlIGlmIHdlIGNhbiBndWVzcyB3aGF0Ci0gICAgIGl0IGlzLiAgKi8KLQotICBlID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7Ci0gIGlmIChlID09IE5VTEwpCi0gICAgZmF0YWwgKCIlczogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgYjEgPSBnZXRjIChlKTsKLSAgYjIgPSBnZXRjIChlKTsKLSAgYjMgPSBnZXRjIChlKTsKLSAgYjQgPSBnZXRjIChlKTsKLSAgYjUgPSBnZXRjIChlKTsKLQotICBmY2xvc2UgKGUpOwotCi0gIC8qIEEgUEUgZXhlY3V0YWJsZSBzdGFydHMgd2l0aCAweDRkIDB4NWEuICAqLwotICBpZiAoYjEgPT0gMHg0ZCAmJiBiMiA9PSAweDVhKQotICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7Ci0KLSAgLyogQSBDT0ZGIC5vIGZpbGUgc3RhcnRzIHdpdGggYSBDT0ZGIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljID0gKGIyIDw8IDgpIHwgYjE7Ci0gIHN3aXRjaCAobWFnaWMpCi0gICAgewotICAgIGNhc2UgMHgxNGM6IC8qIGkzODYgKi8KLSAgICBjYXNlIDB4MTY2OiAvKiBNSVBTICovCi0gICAgY2FzZSAweDE4NDogLyogQWxwaGEgKi8KLSAgICBjYXNlIDB4MjY4OiAvKiA2OGsgKi8KLSAgICBjYXNlIDB4MWYwOiAvKiBQb3dlclBDICovCi0gICAgY2FzZSAweDI5MDogLyogUEEgKi8KLSAgICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7Ci0gICAgfQotCi0gIC8qIEEgUkVTIGZpbGUgc3RhcnRzIHdpdGggMHgwIDB4MCAweDAgMHgwIDB4MjAgMHgwIDB4MCAweDAuICAqLwotICBpZiAoYjEgPT0gMCAmJiBiMiA9PSAwICYmIGIzID09IDAgJiYgYjQgPT0gMCAmJiBiNSA9PSAweDIwKQotICAgIHJldHVybiBSRVNfRk9STUFUX1JFUzsKLQotICAvKiBJZiBldmVyeSBjaGFyYWN0ZXIgaXMgcHJpbnRhYmxlIG9yIHNwYWNlLCBhc3N1bWUgaXQncyBhbiBSQyBmaWxlLiAgKi8KLSAgaWYgKChpc3ByaW50IChiMSkgfHwgaXNzcGFjZSAoYjEpKQotICAgICAgJiYgKGlzcHJpbnQgKGIyKSB8fCBpc3NwYWNlIChiMikpCi0gICAgICAmJiAoaXNwcmludCAoYjMpIHx8IGlzc3BhY2UgKGIzKSkKLSAgICAgICYmIChpc3ByaW50IChiNCkgfHwgaXNzcGFjZSAoYjQpKQotICAgICAgJiYgKGlzcHJpbnQgKGI1KSB8fCBpc3NwYWNlIChiNSkpKQotICAgIHJldHVybiBSRVNfRk9STUFUX1JDOwotCi0gIC8qIE90aGVyd2lzZSwgd2UgZ2l2ZSB1cC4gICovCi0gIGZhdGFsIChfKCJjYW4gbm90IGRldGVybWluZSB0eXBlIG9mIGZpbGUgYCVzJzsgdXNlIHRoZSAtSSBvcHRpb24iKSwKLQkgZmlsZW5hbWUpOwotCi0gIC8qIFJldHVybiBzb21ldGhpbmcgdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIgd2FybmluZy4gICovCi0gIHJldHVybiBSRVNfRk9STUFUX1VOS05PV047Ci19Ci0KLS8qIFByaW50IGEgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4gICovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJVc2FnZTogJXMgW29wdGlvbnNdIFtpbnB1dC1maWxlXSBbb3V0cHV0LWZpbGVdXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLU9wdGlvbnM6XG5cCi0gIC1pIEZJTEUsIC0taW5wdXQgRklMRSAgICAgICBOYW1lIGlucHV0IGZpbGVcblwKLSAgLW8gRklMRSwgLS1vdXRwdXQgRklMRSAgICAgIE5hbWUgb3V0cHV0IGZpbGVcblwKLSAgLUkgRk9STUFULCAtLWlucHV0LWZvcm1hdCBGT1JNQVRcblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgaW5wdXQgZm9ybWF0XG5cCi0gIC1PIEZPUk1BVCwgLS1vdXRwdXQtZm9ybWF0IEZPUk1BVFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBvdXRwdXQgZm9ybWF0XG5cCi0gIC1GIFRBUkdFVCwgLS10YXJnZXQgVEFSR0VUICBTcGVjaWZ5IENPRkYgdGFyZ2V0XG5cCi0gIC0tcHJlcHJvY2Vzc29yIFBST0dSQU0gICAgICBQcm9ncmFtIHRvIHVzZSB0byBwcmVwcm9jZXNzIHJjIGZpbGVcblwKLSAgLS1pbmNsdWRlLWRpciBESVIgICAgICAgICAgIEluY2x1ZGUgZGlyZWN0b3J5IHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG5cCi0gIC1EU1lNWz1WQUxdLCAtLWRlZmluZSBTWU1bPVZBTF1cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSBTWU0gd2hlbiBwcmVwcm9jZXNzaW5nIHJjIGZpbGVcblwKLSAgLXYgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcmJvc2UgLSB0ZWxscyB5b3Ugd2hhdCBpdCdzIGRvaW5nXG5cCi0gIC0tbGFuZ3VhZ2UgVkFMICAgICAgICAgICAgICBTZXQgbGFuZ3VhZ2Ugd2hlbiByZWFkaW5nIHJjIGZpbGVcblwKLSAgLS11c2UtdGVtcC1maWxlICAgICAgICAgICAgIFVzZSBhIHRlbXBvcmFyeSBmaWxlIGluc3RlYWQgb2YgcG9wZW4gdG8gcmVhZFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZXByb2Nlc3NvciBvdXRwdXRcblwKLSAgLS1uby11c2UtdGVtcC1maWxlICAgICAgICAgIFVzZSBwb3BlbiAoZGVmYXVsdClcbiIpKTsKLSNpZmRlZiBZWURFQlVHCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLXl5ZGVidWcgICAgICAgICAgICAgICAgICAgVHVybiBvbiBwYXJzZXIgZGVidWdnaW5nXG4iKSk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuXAotICAtLXZlcnNpb24gICAgICAgICAgICAgICAgICAgUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvblxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLUZPUk1BVCBpcyBvbmUgb2YgcmMsIHJlcywgb3IgY29mZiwgYW5kIGlzIGRlZHVjZWQgZnJvbSB0aGUgZmlsZSBuYW1lXG5cCi1leHRlbnNpb24gaWYgbm90IHNwZWNpZmllZC4gIEEgc2luZ2xlIGZpbGUgbmFtZSBpcyBhbiBpbnB1dCBmaWxlLlxuXAotTm8gaW5wdXQtZmlsZSBpcyBzdGRpbiwgZGVmYXVsdCByYy4gIE5vIG91dHB1dC1maWxlIGlzIHN0ZG91dCwgZGVmYXVsdCByYy5cbiIpKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogUXVvdGUgY2hhcmFjdGVycyB0aGF0IHdpbGwgY29uZnVzZSB0aGUgc2hlbGwgd2hlbiB3ZSBydW4gdGhlIHByZXByb2Nlc3NvciAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnF1b3QgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdGF0aWMgY2hhciAqYnVmID0gMDsKLSAgc3RhdGljIGludCBidWZsZW4gPSAwOwotICBpbnQgc2xlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgY29uc3QgY2hhciAqc3JjOwotICBjaGFyICpkZXN0OwotCi0gIGlmICgoYnVmbGVuIDwgc2xlbiAqIDIgKyAyKSB8fCAhYnVmKQotICAgIHsKLSAgICAgIGJ1ZmxlbiA9IHNsZW4gKiAyICsgMjsKLSAgICAgIGlmIChidWYpCi0JZnJlZSAoYnVmKTsKLSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGJ1Zmxlbik7Ci0gICAgfQotCi0gIGZvciAoc3JjPXN0cmluZywgZGVzdD1idWY7ICpzcmM7IHNyYysrLCBkZXN0KyspCi0gICAgewotICAgICAgaWYgKCpzcmMgPT0gJygnIHx8ICpzcmMgPT0gJyknIHx8ICpzcmMgPT0gJyAnKQotCSpkZXN0KysgPSAnXFwnOwotICAgICAgKmRlc3QgPSAqc3JjOwotICAgIH0KLSAgKmRlc3QgPSAwOwotICByZXR1cm4gYnVmOwotfQotCi0vKiBUaGUgbWFpbiBmdW5jdGlvbi4gICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYzsKLSAgY2hhciAqaW5wdXRfZmlsZW5hbWU7Ci0gIGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLSAgZW51bSByZXNfZm9ybWF0IGlucHV0X2Zvcm1hdDsKLSAgZW51bSByZXNfZm9ybWF0IG91dHB1dF9mb3JtYXQ7Ci0gIGNoYXIgKnRhcmdldDsKLSAgY2hhciAqcHJlcHJvY2Vzc29yOwotICBjaGFyICpwcmVwcm9jYXJnczsKLSAgY29uc3QgY2hhciAqcXVvdGVkYXJnOwotICBpbnQgbGFuZ3VhZ2U7Ci0gIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXM7Ci0gIGludCB1c2VfdGVtcF9maWxlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHJlc19pbml0ICgpOwotCi0gIGlucHV0X2ZpbGVuYW1lID0gTlVMTDsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLSAgaW5wdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9VTktOT1dOOwotICBvdXRwdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9VTktOT1dOOwotICB0YXJnZXQgPSBOVUxMOwotICBwcmVwcm9jZXNzb3IgPSBOVUxMOwotICBwcmVwcm9jYXJncyA9IE5VTEw7Ci0gIGxhbmd1YWdlID0gLTE7Ci0gIHVzZV90ZW1wX2ZpbGUgPSAwOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiaTpvOkk6TzpGOkQ6diIsIGxvbmdfb3B0aW9ucywKLQkJCSAgIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ2knOgotCSAgaW5wdXRfZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCSAgb3V0cHV0X2ZpbGVuYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoKLQkgIGlucHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX25hbWUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ08nOgotCSAgb3V0cHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX25hbWUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9QUkVQUk9DRVNTT1I6Ci0JICBwcmVwcm9jZXNzb3IgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgJ0QnOgotCWNhc2UgT1BUSU9OX0RFRklORToKLQkgIGlmIChwcmVwcm9jYXJncyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcXVvdGVkYXJnID0gcXVvdCAob3B0YXJnKTsKLQkgICAgICBwcmVwcm9jYXJncyA9IHhtYWxsb2MgKHN0cmxlbiAocXVvdGVkYXJnKSArIDMpOwotCSAgICAgIHNwcmludGYgKHByZXByb2NhcmdzLCAiLUQlcyIsIHF1b3RlZGFyZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBxdW90ZWRhcmcgPSBxdW90IChvcHRhcmcpOwotCSAgICAgIG4gPSB4bWFsbG9jIChzdHJsZW4gKHByZXByb2NhcmdzKSArIHN0cmxlbiAocXVvdGVkYXJnKSArIDQpOwotCSAgICAgIHNwcmludGYgKG4sICIlcyAtRCVzIiwgcHJlcHJvY2FyZ3MsIHF1b3RlZGFyZyk7Ci0JICAgICAgZnJlZSAocHJlcHJvY2FyZ3MpOwotCSAgICAgIHByZXByb2NhcmdzID0gbjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgKys7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0lOQ0xVREVfRElSOgotCSAgaWYgKHByZXByb2NhcmdzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBxdW90ZWRhcmcgPSBxdW90IChvcHRhcmcpOwotCSAgICAgIHByZXByb2NhcmdzID0geG1hbGxvYyAoc3RybGVuIChxdW90ZWRhcmcpICsgMyk7Ci0JICAgICAgc3ByaW50ZiAocHJlcHJvY2FyZ3MsICItSSVzIiwgcXVvdGVkYXJnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqbjsKLQotCSAgICAgIHF1b3RlZGFyZyA9IHF1b3QgKG9wdGFyZyk7Ci0JICAgICAgbiA9IHhtYWxsb2MgKHN0cmxlbiAocHJlcHJvY2FyZ3MpICsgc3RybGVuIChxdW90ZWRhcmcpICsgNCk7Ci0JICAgICAgc3ByaW50ZiAobiwgIiVzIC1JJXMiLCBwcmVwcm9jYXJncywgcXVvdGVkYXJnKTsKLQkgICAgICBmcmVlIChwcmVwcm9jYXJncyk7Ci0JICAgICAgcHJlcHJvY2FyZ3MgPSBuOwotCSAgICB9Ci0KLQkgIHsKLQkgICAgc3RydWN0IGluY2x1ZGVfZGlyICpuLCAqKnBwOwotCi0JICAgIG4gPSAoc3RydWN0IGluY2x1ZGVfZGlyICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0JICAgIG4tPm5leHQgPSBOVUxMOwotCSAgICBuLT5kaXIgPSBvcHRhcmc7Ci0KLQkgICAgZm9yIChwcCA9ICZpbmNsdWRlX2RpcnM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQkgICAgICA7Ci0JICAgICpwcCA9IG47Ci0JICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fTEFOR1VBR0U6Ci0JICBsYW5ndWFnZSA9IHN0cnRvbCAob3B0YXJnLCAoY2hhciAqKikgTlVMTCwgMTYpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9VU0VfVEVNUF9GSUxFOgotCSAgdXNlX3RlbXBfZmlsZSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX05PX1VTRV9URU1QX0ZJTEU6Ci0JICB1c2VfdGVtcF9maWxlID0gMDsKLQkgIGJyZWFrOwotCi0jaWZkZWYgWVlERUJVRwotCWNhc2UgT1BUSU9OX1lZREVCVUc6Ci0JICB5eWRlYnVnID0gMTsKLQkgIGJyZWFrOwotI2VuZGlmCi0KLQljYXNlIE9QVElPTl9IRUxQOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1ZFUlNJT046Ci0JICBwcmludF92ZXJzaW9uICgid2luZHJlcyIpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChpbnB1dF9maWxlbmFtZSA9PSBOVUxMICYmIG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgaW5wdXRfZmlsZW5hbWUgPSBhcmd2W29wdGluZF07Ci0gICAgICArK29wdGluZDsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9maWxlbmFtZSA9PSBOVUxMICYmIG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICAgICAgKytvcHRpbmQ7Ci0gICAgfQotCi0gIGlmIChhcmdjICE9IG9wdGluZCkKLSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQotICBpZiAoaW5wdXRfZm9ybWF0ID09IFJFU19GT1JNQVRfVU5LTk9XTikKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRfZmlsZW5hbWUgPT0gTlVMTCkKLQlpbnB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1JDOwotICAgICAgZWxzZQotCWlucHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIChpbnB1dF9maWxlbmFtZSwgMSk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfZm9ybWF0ID09IFJFU19GT1JNQVRfVU5LTk9XTikKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2ZpbGVuYW1lID09IE5VTEwpCi0Jb3V0cHV0X2Zvcm1hdCA9IFJFU19GT1JNQVRfUkM7Ci0gICAgICBlbHNlCi0Jb3V0cHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIChvdXRwdXRfZmlsZW5hbWUsIDApOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBpbnB1dCBmaWxlLiAgKi8KLQotICBzd2l0Y2ggKGlucHV0X2Zvcm1hdCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SQzoKLSAgICAgIHJlc291cmNlcyA9IHJlYWRfcmNfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsCi0JCQkJbGFuZ3VhZ2UsIHVzZV90ZW1wX2ZpbGUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVNfRk9STUFUX1JFUzoKLSAgICAgIHJlc291cmNlcyA9IHJlYWRfcmVzX2ZpbGUgKGlucHV0X2ZpbGVuYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9DT0ZGOgotICAgICAgcmVzb3VyY2VzID0gcmVhZF9jb2ZmX3JzcmMgKGlucHV0X2ZpbGVuYW1lLCB0YXJnZXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChyZXNvdXJjZXMgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygibm8gcmVzb3VyY2VzIikpOwotCi0gIC8qIFNvcnQgdGhlIHJlc291cmNlcy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIENPRkYsIGNvbnZlbmllbnQgZm9yCi0gICAgIHJjLCBhbmQgdW5pbXBvcnRhbnQgZm9yIHJlcy4gICovCi0KLSAgcmVzb3VyY2VzID0gc29ydF9yZXNvdXJjZXMgKHJlc291cmNlcyk7Ci0KLSAgLyogV3JpdGUgdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICByZXN3cl9pbml0ICgpOwotCi0gIHN3aXRjaCAob3V0cHV0X2Zvcm1hdCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SQzoKLSAgICAgIHdyaXRlX3JjX2ZpbGUgKG91dHB1dF9maWxlbmFtZSwgcmVzb3VyY2VzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SRVM6Ci0gICAgICB3cml0ZV9yZXNfZmlsZSAob3V0cHV0X2ZpbGVuYW1lLCByZXNvdXJjZXMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVNfRk9STUFUX0NPRkY6Ci0gICAgICB3cml0ZV9jb2ZmX2ZpbGUgKG91dHB1dF9maWxlbmFtZSwgdGFyZ2V0LCByZXNvdXJjZXMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHhleGl0ICgwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmRyZXMuaCBiL2JpbnV0aWxzL3dpbmRyZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3MzYxMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kcmVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NDkgKzAsMCBAQAotLyogd2luZHJlcy5oIC0tIGhlYWRlciBmaWxlIGZvciB3aW5kcmVzIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBUaGlzIGlzIHRoZSBoZWFkZXIgZmlsZSBmb3IgdGhlIHdpbmRyZXMgcHJvZ3JhbS4gIEl0IGRlZmluZXMKLSAgIHN0cnVjdHVyZXMgYW5kIGRlY2xhcmVzIGZ1bmN0aW9ucyB1c2VkIHdpdGhpbiB0aGUgcHJvZ3JhbS4gICovCi0KLSNpbmNsdWRlICJ3aW5kdW5pLmgiCi0KLS8qIFdlIHJlcHJlc2VudCByZXNvdXJjZXMgaW50ZXJuYWxseSBhcyBhIHRyZWUsIHNpbWlsYXIgdG8gdGhlIHRyZWUKLSAgIHVzZWQgaW4gdGhlIC5yc3JjIHNlY3Rpb24gb2YgYSBDT0ZGIGZpbGUuICBUaGUgcm9vdCBpcyBhCi0gICByZXNfZGlyZWN0b3J5IHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCByZXNfZGlyZWN0b3J5Ci17Ci0gIC8qIFJlc291cmNlIGZsYWdzLiAgQWNjb3JkaW5nIHRvIHRoZSBNUyBkb2NzLCB0aGlzIGlzIGN1cnJlbnRseQotICAgICBhbHdheXMgemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgY2hhcmFjdGVyaXN0aWNzOwotICAvKiBUaW1lL2RhdGUgc3RhbXAuICAqLwotICB1bnNpZ25lZCBsb25nIHRpbWU7Ci0gIC8qIE1ham9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWFqb3I7Ci0gIC8qIE1pbm9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWlub3I7Ci0gIC8qIERpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLSAgc3RydWN0IHJlc19lbnRyeSAqZW50cmllczsKLX07Ci0KLS8qIEEgcmVzb3VyY2UgSUQgaXMgc3RvcmVkIGluIGEgcmVzX2lkIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCByZXNfaWQKLXsKLSAgLyogTm9uLXplcm8gaWYgdGhpcyBlbnRyeSBoYXMgYSBuYW1lIHJhdGhlciB0aGFuIGFuIElELiAgKi8KLSAgdW5zaWduZWQgaW50IG5hbWVkIDogMTsKLSAgdW5pb24KLSAgewotICAgIC8qIElmIHRoZSBuYW1lZCBmaWVsZCBpcyBub24temVybywgdGhpcyBpcyB0aGUgbmFtZS4gICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogTGVuZ3RoIG9mIHRoZSBuYW1lLiAgKi8KLSAgICAgIGludCBsZW5ndGg7Ci0gICAgICAvKiBQb2ludGVyIHRvIHRoZSBuYW1lLCB3aGljaCBpcyBhIFVuaWNvZGUgc3RyaW5nLiAgKi8KLSAgICAgIHVuaWNoYXIgKm5hbWU7Ci0gICAgfSBuOwotICAgIC8qIElmIHRoZSBuYW1lZCBmaWVsZCBpcyB6ZXJvLCB0aGlzIGlzIHRoZSBJRC4gICovCi0gICAgdW5zaWduZWQgbG9uZyBpZDsKLSAgfSB1OwotfTsKLQotLyogRWFjaCBlbnRyeSBpbiB0aGUgdHJlZSBpcyBhIHJlc19lbnRyeSBzdHJ1Y3R1cmUuICBXZSBtaXgKLSAgIGRpcmVjdG9yaWVzIGFuZCByZXNvdXJjZXMgYmVjYXVzZSBpbiBhIENPRkYgZmlsZSBhbGwgZW50cmllcyBpbiBhCi0gICBkaXJlY3RvcnkgYXJlIHNvcnRlZCB0b2dldGhlciwgd2hldGhlciB0aGUgZW50cmllcyBhcmUKLSAgIHN1YmRpcmVjdG9yaWVzIG9yIHJlc291cmNlcy4gICovCi0KLXN0cnVjdCByZXNfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeS4gICovCi0gIHN0cnVjdCByZXNfZW50cnkgKm5leHQ7Ci0gIC8qIFJlc291cmNlIElELiAgKi8KLSAgc3RydWN0IHJlc19pZCBpZDsKLSAgLyogTm9uLXplcm8gaWYgdGhpcyBlbnRyeSBpcyBhIHN1YmRpcmVjdG9yeSByYXRoZXIgdGhhbiBhIGxlYWYuICAqLwotICB1bnNpZ25lZCBpbnQgc3ViZGlyIDogMTsKLSAgdW5pb24KLSAgewotICAgIC8qIElmIHRoZSBzdWJkaXIgZmllbGQgaXMgbm9uLXplcm8sIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZQotICAgICAgIHN1YmRpcmVjdG9yeS4gICovCi0gICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKmRpcjsKLSAgICAvKiBJZiB0aGUgc3ViZGlyIGZpZWxkIGlzIHplcm8sIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZQotICAgICAgIGRhdGEuICAqLwotICAgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgfSB1OwotfTsKLQotLyogVHlwZXMgb2YgcmVzb3VyY2VzLiAgKi8KLQotZW51bSByZXNfdHlwZQotewotICBSRVNfVFlQRV9VTklOSVRJQUxJWkVELAotICBSRVNfVFlQRV9BQ0NFTEVSQVRPUiwKLSAgUkVTX1RZUEVfQklUTUFQLAotICBSRVNfVFlQRV9DVVJTT1IsCi0gIFJFU19UWVBFX0dST1VQX0NVUlNPUiwKLSAgUkVTX1RZUEVfRElBTE9HLAotICBSRVNfVFlQRV9GT05ULAotICBSRVNfVFlQRV9GT05URElSLAotICBSRVNfVFlQRV9JQ09OLAotICBSRVNfVFlQRV9HUk9VUF9JQ09OLAotICBSRVNfVFlQRV9NRU5VLAotICBSRVNfVFlQRV9NRVNTQUdFVEFCTEUsCi0gIFJFU19UWVBFX1JDREFUQSwKLSAgUkVTX1RZUEVfU1RSSU5HVEFCTEUsCi0gIFJFU19UWVBFX1VTRVJEQVRBLAotICBSRVNfVFlQRV9WRVJTSU9OSU5GTwotfTsKLQotLyogQSByZXMgZmlsZSBhbmQgYSBDT0ZGIGZpbGUgc3RvcmUgaW5mb3JtYXRpb24gZGlmZmVyZW50bHkuICBUaGUKLSAgIHJlc19pbmZvIHN0cnVjdHVyZXMgaG9sZHMgZGF0YSB3aGljaCBpbiBhIHJlcyBmaWxlIGlzIHN0b3JlZCB3aXRoCi0gICBlYWNoIHJlc291cmNlLCBidXQgaW4gYSBDT0ZGIGZpbGUgaXMgc3RvcmVkIGVsc2V3aGVyZS4gICovCi0KLXN0cnVjdCByZXNfcmVzX2luZm8KLXsKLSAgLyogTGFuZ3VhZ2UuICBJbiBhIENPRkYgZmlsZSwgdGhlIHRoaXJkIGxldmVsIG9mIHRoZSBkaXJlY3RvcnkgaXMKLSAgICAga2V5ZWQgYnkgdGhlIGxhbmd1YWdlLCBzbyB0aGUgbGFuZ3VhZ2Ugb2YgYSByZXNvdXJjZSBpcyBkZWZpbmVkCi0gICAgIGJ5IGl0cyBsb2NhdGlvbiBpbiB0aGUgcmVzb3VyY2UgdHJlZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IGxhbmd1YWdlOwotICAvKiBDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHJlc291cmNlLiAgRW50aXJlbHkgdXNlciBkZWZpbmVkLiAgSW4gYQotICAgICBDT0ZGIGZpbGUsIHRoZSByZXNfZGlyZWN0b3J5IHN0cnVjdHVyZSBoYXMgYSBjaGFyYWN0ZXJpc3RpY3MKLSAgICAgZmllbGQsIGJ1dCBJIGRvbid0IGtub3cgaWYgaXQncyByZWxhdGVkIHRvIHRoZSBvbmUgaW4gdGhlIHJlcwotICAgICBmaWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBjaGFyYWN0ZXJpc3RpY3M7Ci0gIC8qIFZlcnNpb24gb2YgdGhlIHJlc291cmNlLiAgRW50aXJlbHkgdXNlciBkZWZpbmVkLiAgSW4gYSBDT0ZGIGZpbGUsCi0gICAgIHRoZSByZXNfZGlyZWN0b3J5IHN0cnVjdHVyZSBoYXMgYSBjaGFyYWN0ZXJpc3RpY3MgZmllbGQsIGJ1dCBJCi0gICAgIGRvbid0IGtub3cgaWYgaXQncyByZWxhdGVkIHRvIHRoZSBvbmUgaW4gdGhlIHJlcyBmaWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyB2ZXJzaW9uOwotICAvKiBNZW1vcnkgZmxhZ3MuICBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIE1FTUZMQUcgdmFsdWVzCi0gICAgIGRlZmluZWQgYmVsb3cuICBNb3N0IG9mIHRoZXNlIHZhbHVlcyBhcmUgaGlzdG9yaWNhbCwgYW5kIGFyZSBub3QKLSAgICAgbWVhbmluZ2Z1bCBmb3Igd2luMzIuICBJIGRvbid0IHRoaW5rIHRoZXJlIGlzIGFueSB3YXkgdG8gc3RvcmUKLSAgICAgdGhpcyBpbmZvcm1hdGlvbiBpbiBhIENPRkYgZmlsZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IG1lbWZsYWdzOwotfTsKLQotLyogRWFjaCByZXNvdXJjZSBpbiBhIENPRkYgZmlsZSBoYXMgc29tZSBpbmZvcm1hdGlvbiB3aGljaCBjYW4gZG9lcwotICAgbm90IGFwcGVhciBpbiBhIHJlcyBmaWxlLiAgKi8KLQotc3RydWN0IHJlc19jb2ZmX2luZm8KLXsKLSAgLyogVGhlIGNvZGUgcGFnZSB1c2VkIGZvciB0aGUgZGF0YS4gIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGlzCi0gICAgIHNob3VsZCBiZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgY29kZXBhZ2U7Ci0gIC8qIEEgcmVzb3VyY2UgZW50cnkgaW4gYSBDT0ZGIGZpbGUgaGFzIGEgcmVzZXJ2ZWQgZmllbGQsIHdoaWNoIHdlCi0gICAgIHJlY29yZCBoZXJlIHdoZW4gcmVhZGluZyBhIENPRkYgZmlsZS4gIFdoZW4gd3JpdGluZyBhIENPRkYgZmlsZSwKLSAgICAgd2Ugc2V0IHRoaXMgZmllbGQgdG8gemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQ7Ci19OwotCi0vKiBSZXNvdXJjZSBkYXRhIGlzIHN0b3JlZCBpbiBhIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc291cmNlCi17Ci0gIC8qIFRoZSB0eXBlIG9mIHJlc291cmNlLiAgKi8KLSAgZW51bSByZXNfdHlwZSB0eXBlOwotICAvKiBUaGUgZGF0YSBmb3IgdGhlIHJlc291cmNlLiAgKi8KLSAgdW5pb24KLSAgewotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICB9IGRhdGE7Ci0gICAgc3RydWN0IGFjY2VsZXJhdG9yICphY2M7Ci0gICAgc3RydWN0IGN1cnNvciAqY3Vyc29yOwotICAgIHN0cnVjdCBncm91cF9jdXJzb3IgKmdyb3VwX2N1cnNvcjsKLSAgICBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci0gICAgc3RydWN0IGZvbnRkaXIgKmZvbnRkaXI7Ci0gICAgc3RydWN0IGdyb3VwX2ljb24gKmdyb3VwX2ljb247Ci0gICAgc3RydWN0IG1lbnUgKm1lbnU7Ci0gICAgc3RydWN0IHJjZGF0YV9pdGVtICpyY2RhdGE7Ci0gICAgc3RydWN0IHN0cmluZ3RhYmxlICpzdHJpbmd0YWJsZTsKLSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnVzZXJkYXRhOwotICAgIHN0cnVjdCB2ZXJzaW9uaW5mbyAqdmVyc2lvbmluZm87Ci0gIH0gdTsKLSAgLyogSW5mb3JtYXRpb24gZnJvbSBhIHJlcyBmaWxlLiAgKi8KLSAgc3RydWN0IHJlc19yZXNfaW5mbyByZXNfaW5mbzsKLSAgLyogSW5mb3JtYXRpb24gZnJvbSBhIENPRkYgZmlsZS4gICovCi0gIHN0cnVjdCByZXNfY29mZl9pbmZvIGNvZmZfaW5mbzsKLX07Ci0KLS8qIE1lbW9yeSBmbGFncyBpbiB0aGUgbWVtZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgcmVzX3Jlc291cmNlLiAgKi8KLQotI2RlZmluZSBNRU1GTEFHX01PVkVBQkxFCTB4MTAKLSNkZWZpbmUgTUVNRkxBR19QVVJFCQkweDIwCi0jZGVmaW5lIE1FTUZMQUdfUFJFTE9BRAkJMHg0MAotI2RlZmluZSBNRU1GTEFHX0RJU0NBUkRBQkxFCTB4MTAwMAotCi0vKiBTdGFuZGFyZCByZXNvdXJjZSB0eXBlIGNvZGVzLiAgVGhlc2UgYXJlIHVzZWQgaW4gdGhlIElEIGZpZWxkIG9mIGEKLSAgIHJlc19lbnRyeSBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFJUX0NVUlNPUgkJIDEKLSNkZWZpbmUgUlRfQklUTUFQCQkgMgotI2RlZmluZSBSVF9JQ09OCQkJIDMKLSNkZWZpbmUgUlRfTUVOVQkJCSA0Ci0jZGVmaW5lIFJUX0RJQUxPRwkJIDUKLSNkZWZpbmUgUlRfU1RSSU5HCQkgNgotI2RlZmluZSBSVF9GT05URElSCQkgNwotI2RlZmluZSBSVF9GT05UCQkJIDgKLSNkZWZpbmUgUlRfQUNDRUxFUkFUT1IJCSA5Ci0jZGVmaW5lIFJUX1JDREFUQQkJMTAKLSNkZWZpbmUgUlRfTUVTU0FHRVRBQkxFCQkxMQotI2RlZmluZSBSVF9HUk9VUF9DVVJTT1IJCTEyCi0jZGVmaW5lIFJUX0dST1VQX0lDT04JCTE0Ci0jZGVmaW5lIFJUX1ZFUlNJT04JCTE2Ci0jZGVmaW5lIFJUX0RMR0lOQ0xVREUJCTE3Ci0jZGVmaW5lIFJUX1BMVUdQTEFZCQkxOQotI2RlZmluZSBSVF9WWEQJCQkyMAotI2RlZmluZSBSVF9BTklDVVJTT1IJCTIxCi0jZGVmaW5lIFJUX0FOSUlDT04JCTIyCi0KLS8qIEFuIGFjY2VsZXJhdG9yIHJlc291cmNlIGlzIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBhY2NlbGVyYXRvcgotewotICAvKiBOZXh0IGFjY2VsZXJhdG9yLiAgKi8KLSAgc3RydWN0IGFjY2VsZXJhdG9yICpuZXh0OwotICAvKiBGbGFncy4gIEEgY29tYmluYXRpb24gb2YgdGhlIEFDQyB2YWx1ZXMgZGVmaW5lZCBiZWxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGZsYWdzOwotICAvKiBLZXkgdmFsdWUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBrZXk7Ci0gIC8qIFJlc291cmNlIElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaWQ7Ci19OwotCi0vKiBBY2NlbGVyYXRvciBmbGFncyBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgYWNjZWxlcmF0b3IuCi0gICBUaGVzZSBhcmUgdGhlIHNhbWUgdmFsdWVzIHRoYXQgYXBwZWFyIGluIGEgcmVzIGZpbGUuICBJIGhvcGUuICAqLwotCi0jZGVmaW5lIEFDQ19WSVJUS0VZCTB4MDEKLSNkZWZpbmUgQUNDX05PSU5WRVJUCTB4MDIKLSNkZWZpbmUgQUNDX1NISUZUCTB4MDQKLSNkZWZpbmUgQUNDX0NPTlRST0wJMHgwOAotI2RlZmluZSBBQ0NfQUxUCQkweDEwCi0jZGVmaW5lIEFDQ19MQVNUCTB4ODAKLQotLyogQSBjdXJzb3IgcmVzb3VyY2UuICAqLwotCi1zdHJ1Y3QgY3Vyc29yCi17Ci0gIC8qIFggY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgc2hvcnQgeGhvdHNwb3Q7Ci0gIC8qIFkgY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgc2hvcnQgeWhvdHNwb3Q7Ci0gIC8qIExlbmd0aCBvZiBiaXRtYXAgZGF0YS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAvKiBEYXRhLiAgKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLX07Ci0KLS8qIEEgZ3JvdXBfY3Vyc29yIHJlc291cmNlIGlzIGEgbGlzdCBvZiBncm91cF9jdXJzb3Igc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBncm91cF9jdXJzb3IKLXsKLSAgLyogTmV4dCBjdXJzb3IgaW4gZ3JvdXAuICAqLwotICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpuZXh0OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHdpZHRoOwotICAvKiBIZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7Ci0gIC8qIFBsYW5lcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IHBsYW5lczsKLSAgLyogQml0cyBwZXIgcGl4ZWwuICAqLwotICB1bnNpZ25lZCBzaG9ydCBiaXRzOwotICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBieXRlczsKLSAgLyogSW5kZXggb2YgY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaW5kZXg7Ci19OwotCi0vKiBBIGRpYWxvZyByZXNvdXJjZS4gICovCi0KLXN0cnVjdCBkaWFsb2cKLXsKLSAgLyogQmFzaWMgd2luZG93IHN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBzdHlsZTsKLSAgLyogRXh0ZW5kZWQgd2luZG93IHN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBleHN0eWxlOwotICAvKiBYIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB4OwotICAvKiBZIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB5OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHdpZHRoOwotICAvKiBIZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7Ci0gIC8qIE1lbnUgbmFtZS4gICovCi0gIHN0cnVjdCByZXNfaWQgbWVudTsKLSAgLyogQ2xhc3MgbmFtZS4gICovCi0gIHN0cnVjdCByZXNfaWQgY2xhc3M7Ci0gIC8qIENhcHRpb24uICAqLwotICB1bmljaGFyICpjYXB0aW9uOwotICAvKiBGb250IHBvaW50IHNpemUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBwb2ludHNpemU7Ci0gIC8qIEZvbnQgbmFtZS4gICovCi0gIHVuaWNoYXIgKmZvbnQ7Ci0gIC8qIEV4dGVuZGVkIGluZm9ybWF0aW9uIGZvciBhIGRpYWxvZ2V4LiAgKi8KLSAgc3RydWN0IGRpYWxvZ19leCAqZXg7Ci0gIC8qIENvbnRyb2xzLiAgKi8KLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpjb250cm9sczsKLX07Ci0KLS8qIEFuIGV4dGVuZGVkIGRpYWxvZyBoYXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBkaWFsb2dfZXgKLXsKLSAgLyogSGVscCBJRC4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGVscDsKLSAgLyogRm9udCB3ZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCB3ZWlnaHQ7Ci0gIC8qIFdoZXRoZXIgdGhlIGZvbnQgaXMgaXRhbGljLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaXRhbGljOwotfTsKLQotLyogV2luZG93IHN0eWxlIGZsYWdzLCBmcm9tIHRoZSB3aW5zdXAgRGVmaW5lcy5oIGhlYWRlciBmaWxlLiAgVGhlc2UKLSAgIGNhbiBhcHBlYXIgaW4gdGhlIHN0eWxlIGZpZWxkIG9mIGEgc3RydWN0IGRpYWxvZyBvciBhIHN0cnVjdAotICAgZGlhbG9nX2NvbnRyb2wuICAqLwotCi0jZGVmaW5lIENXX1VTRURFRkFVTFQJKDB4ODAwMDAwMDApCi0jZGVmaW5lIFdTX0JPUkRFUgkoMHg4MDAwMDBMKQotI2RlZmluZSBXU19DQVBUSU9OCSgweGMwMDAwMEwpCi0jZGVmaW5lIFdTX0NISUxECSgweDQwMDAwMDAwTCkKLSNkZWZpbmUgV1NfQ0hJTERXSU5ET1cJKDB4NDAwMDAwMDBMKQotI2RlZmluZSBXU19DTElQQ0hJTERSRU4JKDB4MjAwMDAwMEwpCi0jZGVmaW5lIFdTX0NMSVBTSUJMSU5HUwkoMHg0MDAwMDAwTCkKLSNkZWZpbmUgV1NfRElTQUJMRUQJKDB4ODAwMDAwMEwpCi0jZGVmaW5lIFdTX0RMR0ZSQU1FCSgweDQwMDAwMEwpCi0jZGVmaW5lIFdTX0dST1VQCSgweDIwMDAwTCkKLSNkZWZpbmUgV1NfSFNDUk9MTAkoMHgxMDAwMDBMKQotI2RlZmluZSBXU19JQ09OSUMJKDB4MjAwMDAwMDBMKQotI2RlZmluZSBXU19NQVhJTUlaRQkoMHgxMDAwMDAwTCkKLSNkZWZpbmUgV1NfTUFYSU1JWkVCT1gJKDB4MTAwMDBMKQotI2RlZmluZSBXU19NSU5JTUlaRQkoMHgyMDAwMDAwMEwpCi0jZGVmaW5lIFdTX01JTklNSVpFQk9YCSgweDIwMDAwTCkKLSNkZWZpbmUgV1NfT1ZFUkxBUFBFRAkoMEwpCi0jZGVmaW5lIFdTX09WRVJMQVBQRURXSU5ET1cJKDB4Y2YwMDAwTCkKLSNkZWZpbmUgV1NfUE9QVVAJKDB4ODAwMDAwMDBMKQotI2RlZmluZSBXU19QT1BVUFdJTkRPVwkoMHg4MDg4MDAwMEwpCi0jZGVmaW5lIFdTX1NJWkVCT1gJKDB4NDAwMDBMKQotI2RlZmluZSBXU19TWVNNRU5VCSgweDgwMDAwTCkKLSNkZWZpbmUgV1NfVEFCU1RPUAkoMHgxMDAwMEwpCi0jZGVmaW5lIFdTX1RISUNLRlJBTUUJKDB4NDAwMDBMKQotI2RlZmluZSBXU19USUxFRAkoMEwpCi0jZGVmaW5lIFdTX1RJTEVEV0lORE9XCSgweGNmMDAwMEwpCi0jZGVmaW5lIFdTX1ZJU0lCTEUJKDB4MTAwMDAwMDBMKQotI2RlZmluZSBXU19WU0NST0xMCSgweDIwMDAwMEwpCi0jZGVmaW5lIE1ESVNfQUxMQ0hJTERTVFlMRVMJKDB4MSkKLSNkZWZpbmUgQlNfM1NUQVRFCSgweDVMKQotI2RlZmluZSBCU19BVVRPM1NUQVRFCSgweDZMKQotI2RlZmluZSBCU19BVVRPQ0hFQ0tCT1gJKDB4M0wpCi0jZGVmaW5lIEJTX0FVVE9SQURJT0JVVFRPTgkoMHg5TCkKLSNkZWZpbmUgQlNfQklUTUFQCSgweDgwTCkKLSNkZWZpbmUgQlNfQk9UVE9NCSgweDgwMEwpCi0jZGVmaW5lIEJTX0NFTlRFUgkoMHgzMDBMKQotI2RlZmluZSBCU19DSEVDS0JPWAkoMHgyTCkKLSNkZWZpbmUgQlNfREVGUFVTSEJVVFRPTgkoMHgxTCkKLSNkZWZpbmUgQlNfR1JPVVBCT1gJKDB4N0wpCi0jZGVmaW5lIEJTX0lDT04JKDB4NDBMKQotI2RlZmluZSBCU19MRUZUCSgweDEwMEwpCi0jZGVmaW5lIEJTX0xFRlRURVhUCSgweDIwTCkKLSNkZWZpbmUgQlNfTVVMVElMSU5FCSgweDIwMDBMKQotI2RlZmluZSBCU19OT1RJRlkJKDB4NDAwMEwpCi0jZGVmaW5lIEJTX09XTkVSRFJBVwkoMHhiTCkKLSNkZWZpbmUgQlNfUFVTSEJPWAkoMHhjTCkJCS8qIEZJWE1FISAgV2hhdCBzaG91bGQgdGhpcyBiZT8gICovCi0jZGVmaW5lIEJTX1BVU0hCVVRUT04JKDBMKQotI2RlZmluZSBCU19QVVNITElLRQkoMHgxMDAwTCkKLSNkZWZpbmUgQlNfUkFESU9CVVRUT04JKDB4NEwpCi0jZGVmaW5lIEJTX1JJR0hUCSgweDIwMEwpCi0jZGVmaW5lIEJTX1JJR0hUQlVUVE9OCSgweDIwTCkKLSNkZWZpbmUgQlNfVEVYVAkoMEwpCi0jZGVmaW5lIEJTX1RPUAkoMHg0MDBMKQotI2RlZmluZSBCU19VU0VSQlVUVE9OCSgweDhMKQotI2RlZmluZSBCU19WQ0VOVEVSCSgweGMwMEwpCi0jZGVmaW5lIENCU19BVVRPSFNDUk9MTAkoMHg0MEwpCi0jZGVmaW5lIENCU19ESVNBQkxFTk9TQ1JPTEwJKDB4ODAwTCkKLSNkZWZpbmUgQ0JTX0RST1BET1dOCSgweDJMKQotI2RlZmluZSBDQlNfRFJPUERPV05MSVNUCSgweDNMKQotI2RlZmluZSBDQlNfSEFTU1RSSU5HUwkoMHgyMDBMKQotI2RlZmluZSBDQlNfTE9XRVJDQVNFCSgweDQwMDBMKQotI2RlZmluZSBDQlNfTk9JTlRFR1JBTEhFSUdIVAkoMHg0MDBMKQotI2RlZmluZSBDQlNfT0VNQ09OVkVSVAkoMHg4MEwpCi0jZGVmaW5lIENCU19PV05FUkRSQVdGSVhFRAkoMHgxMEwpCi0jZGVmaW5lIENCU19PV05FUkRSQVdWQVJJQUJMRQkoMHgyMEwpCi0jZGVmaW5lIENCU19TSU1QTEUJKDB4MUwpCi0jZGVmaW5lIENCU19TT1JUCSgweDEwMEwpCi0jZGVmaW5lIENCU19VUFBFUkNBU0UJKDB4MjAwMEwpCi0jZGVmaW5lIEVTX0FVVE9IU0NST0xMCSgweDgwTCkKLSNkZWZpbmUgRVNfQVVUT1ZTQ1JPTEwJKDB4NDBMKQotI2RlZmluZSBFU19DRU5URVIJKDB4MUwpCi0jZGVmaW5lIEVTX0xFRlQJKDBMKQotI2RlZmluZSBFU19MT1dFUkNBU0UJKDB4MTBMKQotI2RlZmluZSBFU19NVUxUSUxJTkUJKDB4NEwpCi0jZGVmaW5lIEVTX05PSElERVNFTAkoMHgxMDBMKQotI2RlZmluZSBFU19OVU1CRVIJKDB4MjAwMEwpCi0jZGVmaW5lIEVTX09FTUNPTlZFUlQJKDB4NDAwTCkKLSNkZWZpbmUgRVNfUEFTU1dPUkQJKDB4MjBMKQotI2RlZmluZSBFU19SRUFET05MWQkoMHg4MDBMKQotI2RlZmluZSBFU19SSUdIVAkoMHgyTCkKLSNkZWZpbmUgRVNfVVBQRVJDQVNFCSgweDhMKQotI2RlZmluZSBFU19XQU5UUkVUVVJOCSgweDEwMDBMKQotI2RlZmluZSBMQlNfRElTQUJMRU5PU0NST0xMCSgweDEwMDBMKQotI2RlZmluZSBMQlNfRVhURU5ERURTRUwJKDB4ODAwTCkKLSNkZWZpbmUgTEJTX0hBU1NUUklOR1MJKDB4NDBMKQotI2RlZmluZSBMQlNfTVVMVElDT0xVTU4JKDB4MjAwTCkKLSNkZWZpbmUgTEJTX01VTFRJUExFU0VMCSgweDhMKQotI2RlZmluZSBMQlNfTk9EQVRBCSgweDIwMDBMKQotI2RlZmluZSBMQlNfTk9JTlRFR1JBTEhFSUdIVAkoMHgxMDBMKQotI2RlZmluZSBMQlNfTk9SRURSQVcJKDB4NEwpCi0jZGVmaW5lIExCU19OT1NFTAkoMHg0MDAwTCkKLSNkZWZpbmUgTEJTX05PVElGWQkoMHgxTCkKLSNkZWZpbmUgTEJTX09XTkVSRFJBV0ZJWEVECSgweDEwTCkKLSNkZWZpbmUgTEJTX09XTkVSRFJBV1ZBUklBQkxFCSgweDIwTCkKLSNkZWZpbmUgTEJTX1NPUlQJKDB4MkwpCi0jZGVmaW5lIExCU19TVEFOREFSRAkoMHhhMDAwMDNMKQotI2RlZmluZSBMQlNfVVNFVEFCU1RPUFMJKDB4ODBMKQotI2RlZmluZSBMQlNfV0FOVEtFWUJPQVJESU5QVVQJKDB4NDAwTCkKLSNkZWZpbmUgU0JTX0JPVFRPTUFMSUdOCSgweDRMKQotI2RlZmluZSBTQlNfSE9SWgkoMEwpCi0jZGVmaW5lIFNCU19MRUZUQUxJR04JKDB4MkwpCi0jZGVmaW5lIFNCU19SSUdIVEFMSUdOCSgweDRMKQotI2RlZmluZSBTQlNfU0laRUJPWAkoMHg4TCkKLSNkZWZpbmUgU0JTX1NJWkVCT1hCT1RUT01SSUdIVEFMSUdOCSgweDRMKQotI2RlZmluZSBTQlNfU0laRUJPWFRPUExFRlRBTElHTgkoMHgyTCkKLSNkZWZpbmUgU0JTX1NJWkVHUklQCSgweDEwTCkKLSNkZWZpbmUgU0JTX1RPUEFMSUdOCSgweDJMKQotI2RlZmluZSBTQlNfVkVSVAkoMHgxTCkKLSNkZWZpbmUgU1NfQklUTUFQCSgweGVMKQotI2RlZmluZSBTU19CTEFDS0ZSQU1FCSgweDdMKQotI2RlZmluZSBTU19CTEFDS1JFQ1QJKDB4NEwpCi0jZGVmaW5lIFNTX0NFTlRFUgkoMHgxTCkKLSNkZWZpbmUgU1NfQ0VOVEVSSU1BR0UJKDB4MjAwTCkKLSNkZWZpbmUgU1NfRU5ITUVUQUZJTEUJKDB4ZkwpCi0jZGVmaW5lIFNTX0VUQ0hFREZSQU1FCSgweDEyTCkKLSNkZWZpbmUgU1NfRVRDSEVESE9SWgkoMHgxMEwpCi0jZGVmaW5lIFNTX0VUQ0hFRFZFUlQJKDB4MTFMKQotI2RlZmluZSBTU19HUkFZRlJBTUUJKDB4OEwpCi0jZGVmaW5lIFNTX0dSQVlSRUNUCSgweDVMKQotI2RlZmluZSBTU19JQ09OCSgweDNMKQotI2RlZmluZSBTU19MRUZUCSgwTCkKLSNkZWZpbmUgU1NfTEVGVE5PV09SRFdSQVAJKDB4Y0wpCi0jZGVmaW5lIFNTX05PUFJFRklYCSgweDgwTCkKLSNkZWZpbmUgU1NfTk9USUZZCSgweDEwMEwpCi0jZGVmaW5lIFNTX09XTkVSRFJBVwkoMHhkTCkKLSNkZWZpbmUgU1NfUkVBTFNJWkVJTUFHRQkoMHg4MDBMKQotI2RlZmluZSBTU19SSUdIVAkoMHgyTCkKLSNkZWZpbmUgU1NfUklHSFRKVVNUCSgweDQwMEwpCi0jZGVmaW5lIFNTX1NJTVBMRQkoMHhiTCkKLSNkZWZpbmUgU1NfU1VOS0VOCSgweDEwMDBMKQotI2RlZmluZSBTU19VU0VSSVRFTSAgICAgKDB4YUwpCi0jZGVmaW5lIFNTX1dISVRFRlJBTUUJKDB4OUwpCi0jZGVmaW5lIFNTX1dISVRFUkVDVAkoMHg2TCkKLSNkZWZpbmUgRFNfM0RMT09LCSgweDRMKQotI2RlZmluZSBEU19BQlNBTElHTgkoMHgxTCkKLSNkZWZpbmUgRFNfQ0VOVEVSCSgweDgwMEwpCi0jZGVmaW5lIERTX0NFTlRFUk1PVVNFCSgweDEwMDBMKQotI2RlZmluZSBEU19DT05URVhUSEVMUAkoMHgyMDAwTCkKLSNkZWZpbmUgRFNfQ09OVFJPTAkoMHg0MDBMKQotI2RlZmluZSBEU19GSVhFRFNZUwkoMHg4TCkKLSNkZWZpbmUgRFNfTE9DQUxFRElUCSgweDIwTCkKLSNkZWZpbmUgRFNfTU9EQUxGUkFNRQkoMHg4MEwpCi0jZGVmaW5lIERTX05PRkFJTENSRUFURQkoMHgxMEwpCi0jZGVmaW5lIERTX05PSURMRU1TRwkoMHgxMDBMKQotI2RlZmluZSBEU19TRVRGT05UCSgweDQwTCkKLSNkZWZpbmUgRFNfU0VURk9SRUdST1VORAkoMHgyMDBMKQotI2RlZmluZSBEU19TWVNNT0RBTAkoMHgyTCkKLQotLyogQSBkaWFsb2cgY29udHJvbC4gICovCi0KLXN0cnVjdCBkaWFsb2dfY29udHJvbAotewotICAvKiBOZXh0IGNvbnRyb2wuICAqLwotICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKm5leHQ7Ci0gIC8qIElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaWQ7Ci0gIC8qIFN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBzdHlsZTsKLSAgLyogRXh0ZW5kZWQgc3R5bGUuICAqLwotICB1bnNpZ25lZCBsb25nIGV4c3R5bGU7Ci0gIC8qIFggY29vcmRpbmF0ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHg7Ci0gIC8qIFkgY29vcmRpbmF0ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHk7Ci0gIC8qIFdpZHRoLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgd2lkdGg7Ci0gIC8qIEhlaWdodC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGhlaWdodDsKLSAgLyogQ2xhc3MgbmFtZS4gICovCi0gIHN0cnVjdCByZXNfaWQgY2xhc3M7Ci0gIC8qIEFzc29jaWF0ZWQgdGV4dC4gICovCi0gIHN0cnVjdCByZXNfaWQgdGV4dDsKLSAgLyogRXh0cmEgZGF0YSBmb3IgdGhlIHdpbmRvdyBwcm9jZWR1cmUuICAqLwotICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRhdGE7Ci0gIC8qIEhlbHAgSUQuICBPbmx5IHVzZWQgaW4gYW4gZXh0ZW5kZWQgZGlhbG9nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoZWxwOwotfTsKLQotLyogQ29udHJvbCBjbGFzc2VzLiAgVGhlc2UgY2FuIGJlIHVzZWQgYXMgdGhlIElEIGZpZWxkIGluIGEgc3RydWN0Ci0gICBkaWFsb2dfY29udHJvbC4gICovCi0KLSNkZWZpbmUgQ1RMX0JVVFRPTgkweDgwCi0jZGVmaW5lIENUTF9FRElUCTB4ODEKLSNkZWZpbmUgQ1RMX1NUQVRJQwkweDgyCi0jZGVmaW5lIENUTF9MSVNUQk9YCTB4ODMKLSNkZWZpbmUgQ1RMX1NDUk9MTEJBUgkweDg0Ci0jZGVmaW5lIENUTF9DT01CT0JPWAkweDg1Ci0KLS8qIEEgZm9udGRpciByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgZm9udGRpciBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGZvbnRkaXIKLXsKLSAgc3RydWN0IGZvbnRkaXIgKm5leHQ7Ci0gIC8qIEluZGV4IG9mIGZvbnQgZW50cnkuICAqLwotICBzaG9ydCBpbmRleDsKLSAgLyogTGVuZ3RoIG9mIGZvbnQgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgLyogRm9udCBpbmZvcm1hdGlvbi4gKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLX07Ci0KLS8qIEEgZ3JvdXBfaWNvbiByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgZ3JvdXBfaWNvbiBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGdyb3VwX2ljb24KLXsKLSAgLyogTmV4dCBpY29uIGluIGdyb3VwLiAgKi8KLSAgc3RydWN0IGdyb3VwX2ljb24gKm5leHQ7Ci0gIC8qIFdpZHRoLiAgKi8KLSAgdW5zaWduZWQgY2hhciB3aWR0aDsKLSAgLyogSGVpZ2h0LiAgKi8KLSAgdW5zaWduZWQgY2hhciBoZWlnaHQ7Ci0gIC8qIENvbG9yIGNvdW50LiAgKi8KLSAgdW5zaWduZWQgY2hhciBjb2xvcnM7Ci0gIC8qIFBsYW5lcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IHBsYW5lczsKLSAgLyogQml0cyBwZXIgcGl4ZWwuICAqLwotICB1bnNpZ25lZCBzaG9ydCBiaXRzOwotICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBieXRlczsKLSAgLyogSW5kZXggb2YgY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaW5kZXg7Ci19OwotCi0vKiBBIG1lbnUgcmVzb3VyY2UuICAqLwotCi1zdHJ1Y3QgbWVudQotewotICAvKiBMaXN0IG9mIG1lbnVpdGVtcy4gICovCi0gIHN0cnVjdCBtZW51aXRlbSAqaXRlbXM7Ci0gIC8qIEhlbHAgSUQuICBJIGRvbid0IHRoaW5rIHRoZXJlIGlzIGFueSB3YXkgdG8gc2V0IHRoaXMgaW4gYW4gcmMKLSAgICAgZmlsZSwgYnV0IGl0IGNhbiBhcHBlYXIgaW4gdGhlIGJpbmFyeSBmb3JtYXQuICAqLwotICB1bnNpZ25lZCBsb25nIGhlbHA7Ci19OwotCi0vKiBBIG1lbnUgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIG1lbnVpdGVtIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgbWVudWl0ZW0KLXsKLSAgLyogTmV4dCBtZW51aXRlbS4gICovCi0gIHN0cnVjdCBtZW51aXRlbSAqbmV4dDsKLSAgLyogVHlwZS4gIEluIGEgbm9ybWFsIG1lbnUsIHJhdGhlciB0aGFuIGEgbWVudWV4LCB0aGlzIGlzIHRoZSBmbGFncwotICAgICBmaWVsZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgdHlwZTsKLSAgLyogU3RhdGUuICBUaGlzIGlzIG9ubHkgdXNlZCBpbiBhIG1lbnVleC4gICovCi0gIHVuc2lnbmVkIGxvbmcgc3RhdGU7Ci0gIC8qIElkLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaWQ7Ci0gIC8qIFVuaWNvZGUgdGV4dC4gICovCi0gIHVuaWNoYXIgKnRleHQ7Ci0gIC8qIFBvcHVwIG1lbnUgaXRlbXMgZm9yIGEgcG9wdXAuICAqLwotICBzdHJ1Y3QgbWVudWl0ZW0gKnBvcHVwOwotICAvKiBIZWxwIElELiAgVGhpcyBpcyBvbmx5IHVzZWQgaW4gYSBtZW51ZXguICAqLwotICB1bnNpZ25lZCBsb25nIGhlbHA7Ci19OwotCi0vKiBNZW51IGl0ZW0gZmxhZ3MuICBUaGVzZSBjYW4gYXBwZWFyIGluIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdAotICAgbWVudWl0ZW0uICAqLwotCi0jZGVmaW5lIE1FTlVJVEVNX0dSQVlFRAkJMHgwMDEKLSNkZWZpbmUgTUVOVUlURU1fSU5BQ1RJVkUJMHgwMDIKLSNkZWZpbmUgTUVOVUlURU1fQklUTUFQCQkweDAwNAotI2RlZmluZSBNRU5VSVRFTV9PV05FUkRSQVcJMHgxMDAKLSNkZWZpbmUgTUVOVUlURU1fQ0hFQ0tFRAkweDAwOAotI2RlZmluZSBNRU5VSVRFTV9QT1BVUAkJMHgwMTAKLSNkZWZpbmUgTUVOVUlURU1fTUVOVUJBUkJSRUFLCTB4MDIwCi0jZGVmaW5lIE1FTlVJVEVNX01FTlVCUkVBSwkweDA0MAotI2RlZmluZSBNRU5VSVRFTV9FTkRNRU5VCTB4MDgwCi0jZGVmaW5lIE1FTlVJVEVNX0hFTFAJICAgICAgIDB4NDAwMAotCi0vKiBBbiByY2RhdGEgcmVzb3VyY2UgaXMgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiByY2RhdGFfaXRlbQotICAgc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCByY2RhdGFfaXRlbQotewotICAvKiBOZXh0IGRhdGEgaXRlbS4gICovCi0gIHN0cnVjdCByY2RhdGFfaXRlbSAqbmV4dDsKLSAgLyogVHlwZSBvZiBkYXRhLiAgKi8KLSAgZW51bQotICB7Ci0gICAgUkNEQVRBX1dPUkQsCi0gICAgUkNEQVRBX0RXT1JELAotICAgIFJDREFUQV9TVFJJTkcsCi0gICAgUkNEQVRBX1dTVFJJTkcsCi0gICAgUkNEQVRBX0JVRkZFUgotICB9IHR5cGU7Ci0gIHVuaW9uCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgd29yZDsKLSAgICB1bnNpZ25lZCBsb25nIGR3b3JkOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgY2hhciAqczsKLSAgICB9IHN0cmluZzsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgIGNvbnN0IHVuaWNoYXIgKnc7Ci0gICAgfSB3c3RyaW5nOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICB9IGJ1ZmZlcjsKLSAgfSB1OwotfTsKLQotLyogQSBzdHJpbmd0YWJsZSByZXNvdXJjZSBpcyBhIHBvaW50ZXIgdG8gYSBzdHJpbmd0YWJsZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3Qgc3RyaW5ndGFibGUKLXsKLSAgLyogRWFjaCBzdHJpbmd0YWJsZSByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgMTYgdW5pY29kZSBzdHJpbmdzLiAgKi8KLSAgc3RydWN0Ci0gIHsKLSAgICAvKiBMZW5ndGggb2Ygc3RyaW5nLiAgKi8KLSAgICBpbnQgbGVuZ3RoOwotICAgIC8qIFN0cmluZyBkYXRhIGlmIGxlbmd0aCA+IDAuICAqLwotICAgIHVuaWNoYXIgKnN0cmluZzsKLSAgfSBzdHJpbmdzWzE2XTsKLX07Ci0KLS8qIEEgdmVyc2lvbmluZm8gcmVzb3VyY2UgcG9pbnRzIHRvIGEgdmVyc2lvbmluZm8gc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHZlcnNpb25pbmZvCi17Ci0gIC8qIEZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpeGVkOwotICAvKiBWYXJpYWJsZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IHZlcl9pbmZvICp2YXI7Ci19OwotCi0vKiBUaGUgZml4ZWQgcG9ydGlvbiBvZiBhIHZlcnNpb25pbmZvIHJlc291cmNlLiAgKi8KLQotc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvCi17Ci0gIC8qIFRoZSBmaWxlIHZlcnNpb24sIHdoaWNoIGlzIHR3byAzMiBiaXQgaW50ZWdlcnMuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfdmVyc2lvbl9tczsKLSAgdW5zaWduZWQgbG9uZyBmaWxlX3ZlcnNpb25fbHM7Ci0gIC8qIFRoZSBwcm9kdWN0IHZlcnNpb24sIHdoaWNoIGlzIHR3byAzMiBiaXQgaW50ZWdlcnMuICAqLwotICB1bnNpZ25lZCBsb25nIHByb2R1Y3RfdmVyc2lvbl9tczsKLSAgdW5zaWduZWQgbG9uZyBwcm9kdWN0X3ZlcnNpb25fbHM7Ci0gIC8qIFRoZSBmaWxlIGZsYWdzIG1hc2suICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfZmxhZ3NfbWFzazsKLSAgLyogVGhlIGZpbGUgZmxhZ3MuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfZmxhZ3M7Ci0gIC8qIFRoZSBPUyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX29zOwotICAvKiBUaGUgZmlsZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX3R5cGU7Ci0gIC8qIFRoZSBmaWxlIHN1YnR5cGUuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfc3VidHlwZTsKLSAgLyogVGhlIGRhdGUsIHdoaWNoIGluIFdpbmRvd3MgaXMgdHdvIDMyIGJpdCBpbnRlZ2Vycy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV9kYXRlX21zOwotICB1bnNpZ25lZCBsb25nIGZpbGVfZGF0ZV9sczsKLX07Ci0KLS8qIEEgbGlzdCBvZiB2YXJpYWJsZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl9pbmZvCi17Ci0gIC8qIE5leHQgaXRlbS4gICovCi0gIHN0cnVjdCB2ZXJfaW5mbyAqbmV4dDsKLSAgLyogVHlwZSBvZiBkYXRhLiAgKi8KLSAgZW51bSB7IFZFUklORk9fU1RSSU5HLCBWRVJJTkZPX1ZBUiB9IHR5cGU7Ci0gIHVuaW9uCi0gIHsKLSAgICAvKiBTdHJpbmdGaWxlSW5mbyBkYXRhLiAgKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBMYW5ndWFnZS4gICovCi0gICAgICB1bmljaGFyICpsYW5ndWFnZTsKLSAgICAgIC8qIFN0cmluZ3MuICAqLwotICAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpzdHJpbmdzOwotICAgIH0gc3RyaW5nOwotICAgIC8qIFZhckZpbGVJbmZvIGRhdGEuICAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIEtleS4gICovCi0gICAgICB1bmljaGFyICprZXk7Ci0gICAgICAvKiBWYWx1ZXMuICAqLwotICAgICAgc3RydWN0IHZlcl92YXJpbmZvICp2YXI7Ci0gICAgfSB2YXI7Ci0gIH0gdTsKLX07Ci0KLS8qIEEgbGlzdCBvZiBzdHJpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCB2ZXJfc3RyaW5naW5mbwotewotICAvKiBOZXh0IHN0cmluZy4gICovCi0gIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqbmV4dDsKLSAgLyogS2V5LiAgKi8KLSAgdW5pY2hhciAqa2V5OwotICAvKiBWYWx1ZS4gICovCi0gIHVuaWNoYXIgKnZhbHVlOwotfTsKLQotLyogQSBsaXN0IG9mIHZhcmlhYmxlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgdmVyX3ZhcmluZm8KLXsKLSAgLyogTmV4dCBpdGVtLiAgKi8KLSAgc3RydWN0IHZlcl92YXJpbmZvICpuZXh0OwotICAvKiBMYW5ndWFnZSBJRC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGxhbmd1YWdlOwotICAvKiBDaGFyYWN0ZXIgc2V0IElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgY2hhcnNldDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2hlbiBjb252ZXJ0aW5nIHJlc291cmNlIGluZm9ybWF0aW9uIHRvCi0gICBiaW5hcnkuICAqLwotCi1zdHJ1Y3QgYmluZGF0YQotewotICAvKiBOZXh0IGRhdGEuICAqLwotICBzdHJ1Y3QgYmluZGF0YSAqbmV4dDsKLSAgLyogTGVuZ3RoIG9mIGRhdGEuICAqLwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgLyogRGF0YS4gICovCi0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci19OwotCi1leHRlcm4gaW50IHZlcmJvc2U7Ci0KLS8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gICovCi0KLWV4dGVybiBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVhZF9yY19maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci1leHRlcm4gc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfcmVzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfY29mZl9yc3JjCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV9yY19maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOwotZXh0ZXJuIHZvaWQgd3JpdGVfcmVzX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV9jb2ZmX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKLQotZXh0ZXJuIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXMKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLWV4dGVybiBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2JpbiBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGludCkpOwotCi1leHRlcm4gRklMRSAqb3Blbl9maWxlX3NlYXJjaAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICoqKSk7Ci0KLWV4dGVybiBQVFIgcmVzX2FsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIFBUUiByZXN3cl9hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotLyogUmVzb3VyY2UgSUQgaGFuZGxpbmcuICAqLwotCi1leHRlcm4gaW50IHJlc19pZF9jbXAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgc3RydWN0IHJlc19pZCkpOwotZXh0ZXJuIHZvaWQgcmVzX2lkX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgc3RydWN0IHJlc19pZCwgaW50KSk7Ci1leHRlcm4gdm9pZCByZXNfaWRzX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKLWV4dGVybiB2b2lkIHJlc19zdHJpbmdfdG9faWQgUEFSQU1TICgoc3RydWN0IHJlc19pZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogTWFuaXB1bGF0aW9uIG9mIHRoZSByZXNvdXJjZSB0cmVlLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCByZXNfcmVzb3VyY2UgKmRlZmluZV9yZXNvdXJjZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCkpOwotZXh0ZXJuIHN0cnVjdCByZXNfcmVzb3VyY2UgKmRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgaW50LCBzdHJ1Y3QgcmVzX2lkLCBpbnQsIGludCkpOwotCi1leHRlcm4gaW50IGV4dGVuZGVkX2RpYWxvZyBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZGlhbG9nICopKTsKLWV4dGVybiBpbnQgZXh0ZW5kZWRfbWVudSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWVudSAqKSk7Ci0KLS8qIENvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgcmMgZmlsZSBzdXBwb3J0IGFuZCB0aGUgcGFyc2VyIGFuZCBsZXhlci4gICovCi0KLWV4dGVybiBpbnQgeXlkZWJ1ZzsKLWV4dGVybiBGSUxFICp5eWluOwotZXh0ZXJuIGNoYXIgKnJjX2ZpbGVuYW1lOwotZXh0ZXJuIGludCByY19saW5lbm87Ci1leHRlcm4gaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV93YXJuaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV9zZXRfbGFuZ3VhZ2UgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX3JjZGF0YSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX25vcm1hbCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIGRlZmluZV9hY2NlbGVyYXRvcgotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHN0cnVjdCBhY2NlbGVyYXRvciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfYml0bWFwCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfY3Vyc29yCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfZGlhbG9nCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3Qgc3RydWN0IGRpYWxvZyAqKSk7Ci1leHRlcm4gc3RydWN0IGRpYWxvZ19jb250cm9sICpkZWZpbmVfY29udHJvbAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkgICB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfZm9udAotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2ljb24KLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9tZW51Ci0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgc3RydWN0IG1lbnVpdGVtICopKTsKLWV4dGVybiBzdHJ1Y3QgbWVudWl0ZW0gKmRlZmluZV9tZW51aXRlbQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkgICBzdHJ1Y3QgbWVudWl0ZW0gKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX21lc3NhZ2V0YWJsZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3JjZGF0YQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHN0cnVjdCByY2RhdGFfaXRlbSAqKSk7Ci1leHRlcm4gc3RydWN0IHJjZGF0YV9pdGVtICpkZWZpbmVfcmNkYXRhX3N0cmluZwotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRlZmluZV9yY2RhdGFfbnVtYmVyIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3N0cmluZ3RhYmxlCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgdW5zaWduZWQgbG9uZywgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfdXNlcl9kYXRhCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwKLQkgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3VzZXJfZmlsZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfdmVyc2lvbmluZm8KLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgaW50LCBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKiwKLQkgICBzdHJ1Y3QgdmVyX2luZm8gKikpOwotZXh0ZXJuIHN0cnVjdCB2ZXJfaW5mbyAqYXBwZW5kX3Zlcl9zdHJpbmdmaWxlaW5mbwotICBQQVJBTVMgKChzdHJ1Y3QgdmVyX2luZm8gKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKikpOwotZXh0ZXJuIHN0cnVjdCB2ZXJfaW5mbyAqYXBwZW5kX3Zlcl92YXJmaWxlaW5mbwotICBQQVJBTVMgKChzdHJ1Y3QgdmVyX2luZm8gKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgdmVyX3ZhcmluZm8gKikpOwotZXh0ZXJuIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqYXBwZW5kX3ZlcnZhbAotICBQQVJBTVMgKChzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBzdHJ1Y3QgdmVyX3ZhcmluZm8gKmFwcGVuZF92ZXJ0cmFucwotICBQQVJBTVMgKChzdHJ1Y3QgdmVyX3ZhcmluZm8gKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHVuaS5jIGIvYmludXRpbHMvd2luZHVuaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzlmNDdhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3dpbmR1bmkuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKiB3aW5kdW5pLmMgLS0gdW5pY29kZSBzdXBwb3J0IGZvciB0aGUgd2luZHJlcyBwcm9ncmFtLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgdW5pY29kZSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgd2luZHJlcwotICAgcHJvZ3JhbS4gIElkZWFsbHksIHdlIHdvdWxkIGhhdmUgZ2VuZXJpYyB1bmljb2RlIHN1cHBvcnQgd2hpY2gKLSAgIHdvdWxkIHdvcmsgb24gYWxsIHN5c3RlbXMuICBIb3dldmVyLCB3ZSBkb24ndC4gIEluc3RlYWQsIG9uIGEKLSAgIFdpbmRvd3MgaG9zdCwgd2UgYXJlIHByZXBhcmVkIHRvIGNhbGwgc29tZSBXaW5kb3dzIHJvdXRpbmVzLiAgVGhpcwotICAgbWVhbnMgdGhhdCB3ZSB3aWxsIGdlbmVyYXRlIGRpZmZlcmVudCBvdXRwdXQgb24gV2luZG93cyBhbmQgVW5peAotICAgaG9zdHMsIGJ1dCB0aGF0IHNlZW1zIGJldHRlciB0aGFuIG5vdCByZWFsbHkgc3VwcG9ydGluZyB1bmljb2RlIGF0Ci0gICBhbGwuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAid2luZHVuaS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi0vKiBDb252ZXJ0IGFuIEFTQ0lJIHN0cmluZyB0byBhIHVuaWNvZGUgc3RyaW5nLiAgV2UganVzdCBjb3B5IGl0LAotICAgZXhwYW5kaW5nIGNoYXJzIHRvIHNob3J0cywgcmF0aGVyIHRoYW4gZG9pbmcgc29tZXRoaW5nIGludGVsbGlnZW50LiAgKi8KLQotdm9pZAotdW5pY29kZV9mcm9tX2FzY2lpIChsZW5ndGgsIHVuaWNvZGUsIGFzY2lpKQotICAgICBpbnQgKmxlbmd0aDsKLSAgICAgdW5pY2hhciAqKnVuaWNvZGU7Ci0gICAgIGNvbnN0IGNoYXIgKmFzY2lpOwotewotICBpbnQgbGVuOwotICBjb25zdCBjaGFyICpzOwotICB1bnNpZ25lZCBzaG9ydCAqdzsKLQotICBsZW4gPSBzdHJsZW4gKGFzY2lpKTsKLQotICBpZiAobGVuZ3RoICE9IE5VTEwpCi0gICAgKmxlbmd0aCA9IGxlbjsKLQotICAqdW5pY29kZSA9ICgodW5pY2hhciAqKSByZXNfYWxsb2MgKChsZW4gKyAxKSAqIHNpemVvZiAodW5pY2hhcikpKTsKLQotI2lmZGVmIF9XSU4zMgotICAvKiBGSVhNRTogT24gV2luZG93cywgd2Ugc2hvdWxkIGJlIHVzaW5nIE11bHRpQnl0ZVRvV2lkZUNoYXIgdG8gc2V0Ci0gICAgIHRoZSBsZW5ndGguICAqLwotICBNdWx0aUJ5dGVUb1dpZGVDaGFyIChDUF9BQ1AsIDAsIGFzY2lpLCBsZW4gKyAxLCAqdW5pY29kZSwgbGVuICsgMSk7Ci0jZWxzZQotICBmb3IgKHMgPSBhc2NpaSwgdyA9ICp1bmljb2RlOyAqcyAhPSAnXDAnOyBzKyssIHcrKykKLSAgICAqdyA9ICpzICYgMHhmZjsKLSAgKncgPSAwOwotI2VuZGlmCi19Ci0KLS8qIFByaW50IHRoZSB1bmljb2RlIHN0cmluZyBVTklDT0RFIHRvIHRoZSBmaWxlIEUuICBMRU5HVEggaXMgdGhlCi0gICBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBwcmludCwgb3IgLTEgaWYgd2Ugc2hvdWxkIHByaW50IHVudGlsIHRoZQotICAgZW5kIG9mIHRoZSBzdHJpbmcuICBGSVhNRTogT24gYSBXaW5kb3dzIGhvc3QsIHdlIHNob3VsZCBiZSBjYWxsaW5nCi0gICBzb21lIFdpbmRvd3MgZnVuY3Rpb24sIHByb2JhYmx5IFdpZGVDaGFyVG9NdWx0aUJ5dGUuICAqLwotCi12b2lkCi11bmljb2RlX3ByaW50IChlLCB1bmljb2RlLCBsZW5ndGgpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHVuaWNoYXIgKnVuaWNvZGU7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHVuaWNoYXIgY2g7Ci0KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQlyZXR1cm47Ci0gICAgICBpZiAobGVuZ3RoID4gMCkKLQktLWxlbmd0aDsKLQotICAgICAgY2ggPSAqdW5pY29kZTsKLQotICAgICAgaWYgKGNoID09IDAgJiYgbGVuZ3RoIDwgMCkKLQlyZXR1cm47Ci0KLSAgICAgICsrdW5pY29kZTsKLQotICAgICAgaWYgKChjaCAmIDB4N2YpID09IGNoKQotCXsKLQkgIGlmIChjaCA9PSAnXFwnKQotCSAgICBmcHV0cyAoIlxcIiwgZSk7Ci0JICBlbHNlIGlmIChpc3ByaW50IChjaCkpCi0JICAgIHB1dGMgKGNoLCBlKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAoY2gpCi0JCXsKLQkJY2FzZSBFU0NBUEVfQToKLQkJICBmcHV0cyAoIlxcYSIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX0I6Ci0JCSAgZnB1dHMgKCJcXGIiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9GOgotCQkgIGZwdXRzICgiXFxmIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfTjoKLQkJICBmcHV0cyAoIlxcbiIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX1I6Ci0JCSAgZnB1dHMgKCJcXHIiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9UOgotCQkgIGZwdXRzICgiXFx0IiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfVjoKLQkJICBmcHV0cyAoIlxcdiIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgZnByaW50ZiAoZSwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpIGNoKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKGNoICYgMHhmZikgPT0gY2gpCi0JZnByaW50ZiAoZSwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpIGNoKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChlLCAiXFx4JXgiLCAodW5zaWduZWQgaW50KSBjaCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHVuaS5oIGIvYmludXRpbHMvd2luZHVuaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E5YWYyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3dpbmR1bmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIHdpbmR1bmkuaCAtLSBoZWFkZXIgZmlsZSBmb3IgdW5pY29kZSBzdXBwb3J0IGZvciB3aW5kcmVzIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIHRoZSB0eXBlcyBhbmQgZnVuY3Rpb25zIHdlIHVzZSBmb3IKLSAgIHVuaWNvZGUgc3VwcG9ydCBpbiB3aW5kcmVzLiAgT3VyIHVuaWNvZGUgc3VwcG9ydCBpcyB2ZXJ5IGxpbWl0ZWQgYXQKLSAgIHByZXNlbnQuCi0KLSAgIFdlIGRvbid0IHB1dCB0aGlzIHN0dWZmIGluIHdpbmRyZXMuaCBzbyB0aGF0IHdpbmR1bmkuYyBkb2Vzbid0IGhhdmUKLSAgIHRvIGluY2x1ZGUgd2luZHJlcy5oLiAgd2luZHVuaS5jIG5lZWRzIHRvIGluY2x1ZGVzIHdpbmRvd3MuaCwgYW5kCi0gICB0aGF0IHdvdWxkIGNvbmZsaWN0IHdpdGggdGhlIGRlZmluaXRpb25zIG9mIFdpbmRvd3MgbWFjcm9zIHdlCi0gICBhbHJlYWR5IGhhdmUgaW4gd2luZHJlcy5oLiAgKi8KLQotLyogV2UgdXNlIHRoaXMgdHlwZSB0byBob2xkIGEgdW5pY29kZSBjaGFyYWN0ZXIuICAqLwotCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVuaWNoYXI7Ci0KLS8qIEVzY2FwZSBjaGFyYWN0ZXIgdHJhbnNsYXRpb25zLiAgKi8KLQotI2RlZmluZSBFU0NBUEVfQSAoMDA3KQotI2RlZmluZSBFU0NBUEVfQiAoMDEwKQotI2RlZmluZSBFU0NBUEVfRiAoMDE0KQotI2RlZmluZSBFU0NBUEVfTiAoMDEyKQotI2RlZmluZSBFU0NBUEVfUiAoMDE1KQotI2RlZmluZSBFU0NBUEVfVCAoMDExKQotI2RlZmluZSBFU0NBUEVfViAoMDEzKQotCi0vKiBDb252ZXJ0IGFuIEFTQ0lJIHN0cmluZyB0byBhIHVuaWNvZGUgc3RyaW5nLiAgKi8KLQotZXh0ZXJuIHZvaWQgdW5pY29kZV9mcm9tX2FzY2lpCi0gIFBBUkFNUyAoKGludCAqLCB1bmljaGFyICoqLCBjb25zdCBjaGFyICopKTsKLQotLyogUHJpbnQgYSB1bmljb2RlIHN0cmluZyB0byBhIGZpbGUuICAqLwotCi1leHRlcm4gdm9pZCB1bmljb2RlX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgdW5pY2hhciAqLCBpbnQpKTsKLQotLyogV2luZHJlcyBzdXBwb3J0IHJvdXRpbmUgY2FsbGVkIGJ5IHVuaWNvZGVfZnJvbV9hc2NpaS4gIFRoaXMgaXMgYm90aAotICAgaGVyZSBhbmQgaW4gd2luZHJlcy5oLiAgSXQgc2hvdWxkIHByb2JhYmx5IGJlIGluIGEgc2VwYXJhdGUgaGVhZGVyCi0gICBmaWxlLCBidXQgaXQgaGFyZGx5IHNlZW1zIHdvcnRoIGl0IGZvciBvbmUgZnVuY3Rpb24uICAqLwotCi1leHRlcm4gUFRSIHJlc19hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dyc3RhYnMuYyBiL2JpbnV0aWxzL3dyc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1MTU4Ny4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93cnN0YWJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDE2ICswLDAgQEAKLS8qIHdyc3RhYnMuYyAtLSBPdXRwdXQgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggd3JpdGVzIG91dCBzdGFicyBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogTWVhbmluZ2xlc3MgZGVmaW5pdGlvbiBuZWVkcyBieSBhb3V0NjQuaC4gIEZJWE1FLiAgKi8KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotLyogVGhlIHNpemUgb2YgYSBzdGFicyBzeW1ib2wuICBUaGlzIHByZXN1bWVzIDMyIGJpdCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIFNUQUJfU1lNQk9MX1NJWkUgKDEyKQotCi0vKiBBbiBlbnRyeSBpbiBhIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBOZXh0IHN0cmluZyBpbiB0aGlzIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpuZXh0OwotICAvKiBJbmRleCBpbiBzdHJpbmcgdGFibGUuICAqLwotICBsb25nIGluZGV4OwotICAvKiBTaXplIG9mIHR5cGUgaWYgdGhpcyBpcyBhIHR5cGVkZWYuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLX07Ci0KLS8qIEEgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotfTsKLQotLyogVGhlIHR5cGUgc3RhY2suICBFYWNoIGVsZW1lbnQgb24gdGhlIHN0YWNrIGlzIGEgc3RyaW5nLiAgKi8KLQotc3RydWN0IHN0YWJfdHlwZV9zdGFjawotewotICAvKiBUaGUgbmV4dCBlbGVtZW50IG9uIHRoZSBzdGFjay4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKm5leHQ7Ci0gIC8qIFRoaXMgZWxlbWVudCBhcyBhIHN0cmluZy4gICovCi0gIGNoYXIgKnN0cmluZzsKLSAgLyogVGhlIHR5cGUgaW5kZXggb2YgdGhpcyBlbGVtZW50LiAgKi8KLSAgbG9uZyBpbmRleDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogV2hldGhlciB0eXBlIHN0cmluZyBkZWZpbmVzIGEgbmV3IHR5cGUuICAqLwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIC8qIFN0cmluZyBkZWZpbmluZyBzdHJ1Y3QgZmllbGRzLiAgKi8KLSAgY2hhciAqZmllbGRzOwotICAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncyBkZWZpbmluZyBiYXNlIGNsYXNzZXMgZm9yIGEKLSAgICAgY2xhc3MuICAqLwotICBjaGFyICoqYmFzZWNsYXNzZXM7Ci0gIC8qIFN0cmluZyBkZWZpbmluZyBjbGFzcyBtZXRob2RzLiAgKi8KLSAgY2hhciAqbWV0aG9kczsKLSAgLyogU3RyaW5nIGRlZmluaW5nIHZ0YWJsZSBwb2ludGVyIGZvciBhIGNsYXNzLiAgKi8KLSAgY2hhciAqdnRhYmxlOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHR5cGUgaW5kaWNlcyBmb3IgdGFnZ2VkCi0gICB0eXBlcy4gICovCi0KLXN0cnVjdCBzdGFiX3RhZwotewotICAvKiBUaGUgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgaW5kZXg7Ci0gIC8qIFRoZSB0YWcgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKnRhZzsKLSAgLyogVGhlIGtpbmQgb2YgdHlwZS4gIFRoaXMgaXMgc2V0IHRvIERFQlVHX0tJTkRfSUxMRUdBTCB3aGVuIHRoZQotICAgICB0eXBlIGlzIGRlZmluZWQuICAqLwotICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgc3RydWN0LiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi0vKiBXZSByZW1lbWJlciB2YXJpb3VzIHNvcnRzIG9mIHR5cGUgaW5kaWNlcy4gIFRoZXkgYXJlIG5vdCByZWxhdGVkLAotICAgYnV0LCBmb3IgY29udmVuaWVuY2UsIHdlIGtlZXAgYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzCi0gICBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3Qgc3RhYl90eXBlX2NhY2hlCi17Ci0gIC8qIFRoZSB2b2lkIHR5cGUgaW5kZXguICAqLwotICBsb25nIHZvaWRfdHlwZTsKLSAgLyogU2lnbmVkIGludGVnZXIgdHlwZSBpbmRpY2VzLCBpbmRleGVkIGJ5IHNpemUgLSAxLiAgKi8KLSAgbG9uZyBzaWduZWRfaW50ZWdlcl90eXBlc1s4XTsKLSAgLyogVW5zaWduZWQgaW50ZWdlciB0eXBlIGluZGljZXMsIGluZGV4ZWQgYnkgc2l6ZSAtIDEuICAqLwotICBsb25nIHVuc2lnbmVkX2ludGVnZXJfdHlwZXNbOF07Ci0gIC8qIEZsb2F0aW5nIHBvaW50IHR5cGVzLCBpbmRleGVkIGJ5IHNpemUgLSAxLiAgKi8KLSAgbG9uZyBmbG9hdF90eXBlc1sxNl07Ci0gIC8qIFBvaW50ZXJzIHRvIHR5cGVzLCBpbmRleGVkIGJ5IHRoZSB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyAqcG9pbnRlcl90eXBlczsKLSAgc2l6ZV90IHBvaW50ZXJfdHlwZXNfYWxsb2M7Ci0gIC8qIEZ1bmN0aW9ucyByZXR1cm5pbmcgdHlwZXMsIGluZGV4ZWQgYnkgdGhlIHR5cGUgaW5kZXguICAqLwotICBsb25nICpmdW5jdGlvbl90eXBlczsKLSAgc2l6ZV90IGZ1bmN0aW9uX3R5cGVzX2FsbG9jOwotICAvKiBSZWZlcmVuY2VzIHRvIHR5cGVzLCBpbmRleGVkIGJ5IHRoZSB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyAqcmVmZXJlbmNlX3R5cGVzOwotICBzaXplX3QgcmVmZXJlbmNlX3R5cGVzX2FsbG9jOwotICAvKiBTdHJ1Y3QvdW5pb24vY2xhc3MgdHlwZSBpbmRpY2VzLCBpbmRleGVkIGJ5IHRoZSBzdHJ1Y3QgaWQuICAqLwotICBzdHJ1Y3Qgc3RhYl90YWcgKnN0cnVjdF90eXBlczsKLSAgc2l6ZV90IHN0cnVjdF90eXBlc19hbGxvYzsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGhhbmRsZSBwYXNzZWQgdGhyb3VnaCBkZWJ1Z193cml0ZS4gICovCi0KLXN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZQotewotICAvKiBUaGUgQkZELiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBUaGlzIGJ1ZmZlciBob2xkcyB0aGUgc3ltYm9scy4gICovCi0gIGJmZF9ieXRlICpzeW1ib2xzOwotICBzaXplX3Qgc3ltYm9sc19zaXplOwotICBzaXplX3Qgc3ltYm9sc19hbGxvYzsKLSAgLyogVGhpcyBpcyBhIGxpc3Qgb2YgaGFzaCB0YWJsZSBlbnRyaWVzIGZvciB0aGUgc3RyaW5ncy4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc3RyaW5nczsKLSAgLyogVGhlIGxhc3Qgc3RyaW5nIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmxhc3Rfc3RyaW5nOwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgc3RyaW5ncy4gICovCi0gIHNpemVfdCBzdHJpbmdzX3NpemU7Ci0gIC8qIFRoaXMgaGFzaCB0YWJsZSBlbGltaW5hdGVzIGR1cGxpY2F0ZSBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIHN0cmhhc2g7Ci0gIC8qIFRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqdHlwZV9zdGFjazsKLSAgLyogVGhlIG5leHQgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgdHlwZV9pbmRleDsKLSAgLyogVGhlIHR5cGUgY2FjaGUuICAqLwotICBzdHJ1Y3Qgc3RhYl90eXBlX2NhY2hlIHR5cGVfY2FjaGU7Ci0gIC8qIEEgbWFwcGluZyBmcm9tIHR5cGVkZWYgbmFtZXMgdG8gdHlwZSBpbmRpY2VzLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIHR5cGVkZWZfaGFzaDsKLSAgLyogSWYgdGhpcyBpcyBub3QgLTEsIGl0IGlzIHRoZSBvZmZzZXQgdG8gdGhlIG1vc3QgcmVjZW50IE5fU08KLSAgICAgc3ltYm9sLCBhbmQgdGhlIHZhbHVlIG9mIHRoYXQgc3ltYm9sIG5lZWRzIHRvIGJlIHNldC4gICovCi0gIGxvbmcgc29fb2Zmc2V0OwotICAvKiBJZiB0aGlzIGlzIG5vdCAtMSwgaXQgaXMgdGhlIG9mZnNldCB0byB0aGUgbW9zdCByZWNlbnQgTl9GVU4KLSAgICAgc3ltYm9sLCBhbmQgdGhlIHZhbHVlIG9mIHRoYXQgc3ltYm9sIG5lZWRzIHRvIGJlIHNldC4gICovCi0gIGxvbmcgZnVuX29mZnNldDsKLSAgLyogVGhlIGxhc3QgdGV4dCBzZWN0aW9uIGFkZHJlc3Mgc2Vlbi4gICovCi0gIGJmZF92bWEgbGFzdF90ZXh0X2FkZHJlc3M7Ci0gIC8qIFRoZSBibG9jayBuZXN0aW5nIGRlcHRoLiAgKi8KLSAgdW5zaWduZWQgaW50IG5lc3Rpbmc7Ci0gIC8qIFRoZSBmdW5jdGlvbiBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBmbmFkZHI7Ci0gIC8qIEEgcGVuZGluZyBMQlJBQyBzeW1ib2wuICAqLwotICBiZmRfdm1hIHBlbmRpbmdfbGJyYWM7Ci0gIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGZpbGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmxpbmVub19maWxlbmFtZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0cmluZ19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfd3JpdGVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBpbnQsIGludCwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3B1c2hfc3RyaW5nCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGxvbmcsIGJvb2xlYW4sCi0JICAgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjaGFyICpzdGFiX3BvcF90eXBlIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX21vZGlmeV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBpbnQsIHVuc2lnbmVkIGludCwgbG9uZyAqKiwgc2l6ZV90ICopKTsKLXN0YXRpYyBsb25nIHN0YWJfZ2V0X3N0cnVjdF9pbmRleAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JICAgZW51bSBkZWJ1Z190eXBlX2tpbmQsIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX21ldGhvZF92YXIKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4sIGJmZF92bWEsIGJvb2xlYW4pKTsKLQotc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9jb21waWxhdGlvbl91bml0IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X3NvdXJjZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbXB0eV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl92b2lkX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2ludF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2Zsb2F0X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY29tcGxleF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2Jvb2xfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbnVtX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGJmZF9zaWduZWRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcG9pbnRlcl90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9mdW5jdGlvbl90eXBlIFBBUkFNUyAoKFBUUiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3JlZmVyZW5jZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9yYW5nZV90eXBlIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2FycmF5X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc2V0X3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX29mZnNldF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9tZXRob2RfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jb25zdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl92b2xhdGlsZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RydWN0X2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hLCBiZmRfdm1hLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW5kX3N0cnVjdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9jbGFzc190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgYm9vbGVhbiwKLQkgICBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX3N0YXRpY19tZW1iZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX2Jhc2VjbGFzcwotICBQQVJBTVMgKChQVFIsIGJmZF92bWEsIGJvb2xlYW4sIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19zdGFydF9tZXRob2QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBiZmRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX2VuZF9tZXRob2QgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VuZF9jbGFzc190eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl90eXBlZGVmX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdGFnX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdHlwZGVmIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3RhZyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9pbnRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZmxvYXRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl90eXBlZF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl92YXJpYWJsZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192YXJfa2luZCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9mdW5jdGlvbiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9mdW5jdGlvbl9wYXJhbWV0ZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfcGFybV9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X2Jsb2NrIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VuZF9mdW5jdGlvbiBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfbGluZW5vCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zIHN0YWJfZm5zID0KLXsKLSAgc3RhYl9zdGFydF9jb21waWxhdGlvbl91bml0LAotICBzdGFiX3N0YXJ0X3NvdXJjZSwKLSAgc3RhYl9lbXB0eV90eXBlLAotICBzdGFiX3ZvaWRfdHlwZSwKLSAgc3RhYl9pbnRfdHlwZSwKLSAgc3RhYl9mbG9hdF90eXBlLAotICBzdGFiX2NvbXBsZXhfdHlwZSwKLSAgc3RhYl9ib29sX3R5cGUsCi0gIHN0YWJfZW51bV90eXBlLAotICBzdGFiX3BvaW50ZXJfdHlwZSwKLSAgc3RhYl9mdW5jdGlvbl90eXBlLAotICBzdGFiX3JlZmVyZW5jZV90eXBlLAotICBzdGFiX3JhbmdlX3R5cGUsCi0gIHN0YWJfYXJyYXlfdHlwZSwKLSAgc3RhYl9zZXRfdHlwZSwKLSAgc3RhYl9vZmZzZXRfdHlwZSwKLSAgc3RhYl9tZXRob2RfdHlwZSwKLSAgc3RhYl9jb25zdF90eXBlLAotICBzdGFiX3ZvbGF0aWxlX3R5cGUsCi0gIHN0YWJfc3RhcnRfc3RydWN0X3R5cGUsCi0gIHN0YWJfc3RydWN0X2ZpZWxkLAotICBzdGFiX2VuZF9zdHJ1Y3RfdHlwZSwKLSAgc3RhYl9zdGFydF9jbGFzc190eXBlLAotICBzdGFiX2NsYXNzX3N0YXRpY19tZW1iZXIsCi0gIHN0YWJfY2xhc3NfYmFzZWNsYXNzLAotICBzdGFiX2NsYXNzX3N0YXJ0X21ldGhvZCwKLSAgc3RhYl9jbGFzc19tZXRob2RfdmFyaWFudCwKLSAgc3RhYl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQsCi0gIHN0YWJfY2xhc3NfZW5kX21ldGhvZCwKLSAgc3RhYl9lbmRfY2xhc3NfdHlwZSwKLSAgc3RhYl90eXBlZGVmX3R5cGUsCi0gIHN0YWJfdGFnX3R5cGUsCi0gIHN0YWJfdHlwZGVmLAotICBzdGFiX3RhZywKLSAgc3RhYl9pbnRfY29uc3RhbnQsCi0gIHN0YWJfZmxvYXRfY29uc3RhbnQsCi0gIHN0YWJfdHlwZWRfY29uc3RhbnQsCi0gIHN0YWJfdmFyaWFibGUsCi0gIHN0YWJfc3RhcnRfZnVuY3Rpb24sCi0gIHN0YWJfZnVuY3Rpb25fcGFyYW1ldGVyLAotICBzdGFiX3N0YXJ0X2Jsb2NrLAotICBzdGFiX2VuZF9ibG9jaywKLSAgc3RhYl9lbmRfZnVuY3Rpb24sCi0gIHN0YWJfbGluZW5vCi19OwotDAotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotc3RyaW5nX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPm5leHQgPSBOVUxMOwotICAgICAgcmV0LT5pbmRleCA9IC0xOwotICAgICAgcmV0LT5zaXplID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN0cmluZ19oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdlIGFyZSBidWlsZGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgdHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGRlc2M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzdHJ4OwotICBiZmRfYnl0ZSBzeW1bU1RBQl9TWU1CT0xfU0laRV07Ci0KLSAgaWYgKHN0cmluZyA9PSBOVUxMKQotICAgIHN0cnggPSAwOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmaW5mby0+c3RyaGFzaCwgc3RyaW5nLCB0cnVlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJzdHJpbmdfaGFzaF9sb29rdXAgZmFpbGVkOiAlc1xuIiksCi0JCSAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoaC0+aW5kZXggIT0gLTEpCi0Jc3RyeCA9IGgtPmluZGV4OwotICAgICAgZWxzZQotCXsKLQkgIHN0cnggPSBpbmZvLT5zdHJpbmdzX3NpemU7Ci0JICBoLT5pbmRleCA9IHN0cng7Ci0JICBpZiAoaW5mby0+bGFzdF9zdHJpbmcgPT0gTlVMTCkKLQkgICAgaW5mby0+c3RyaW5ncyA9IGg7Ci0JICBlbHNlCi0JICAgIGluZm8tPmxhc3Rfc3RyaW5nLT5uZXh0ID0gaDsKLQkgIGluZm8tPmxhc3Rfc3RyaW5nID0gaDsKLQkgIGluZm8tPnN0cmluZ3Nfc2l6ZSArPSBzdHJsZW4gKHN0cmluZykgKyAxOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBwcmVzdW1lcyAzMiBiaXQgdmFsdWVzLiAgKi8KLSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgc3RyeCwgc3ltKTsKLSAgYmZkX3B1dF84IChpbmZvLT5hYmZkLCB0eXBlLCBzeW0gKyA0KTsKLSAgYmZkX3B1dF84IChpbmZvLT5hYmZkLCAwLCBzeW0gKyA1KTsKLSAgYmZkX3B1dF8xNiAoaW5mby0+YWJmZCwgZGVzYywgc3ltICsgNik7Ci0gIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIHZhbHVlLCBzeW0gKyA4KTsKLQotICBpZiAoaW5mby0+c3ltYm9sc19zaXplICsgU1RBQl9TWU1CT0xfU0laRSA+IGluZm8tPnN5bWJvbHNfYWxsb2MpCi0gICAgewotICAgICAgaW5mby0+c3ltYm9sc19hbGxvYyAqPSAyOwotICAgICAgaW5mby0+c3ltYm9scyA9IChiZmRfYnl0ZSAqKSB4cmVhbGxvYyAoaW5mby0+c3ltYm9scywKLQkJCQkJICAgICBpbmZvLT5zeW1ib2xzX2FsbG9jKTsKLSAgICB9Ci0KLSAgbWVtY3B5IChpbmZvLT5zeW1ib2xzICsgaW5mby0+c3ltYm9sc19zaXplLCBzeW0sIFNUQUJfU1lNQk9MX1NJWkUpOwotCi0gIGluZm8tPnN5bWJvbHNfc2l6ZSArPSBTVEFCX1NZTUJPTF9TSVpFOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGEgc3RyaW5nIG9uIHRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIHN0cmluZywgaW5kZXgsIGRlZmluaXRpb24sIHNpemUpCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBsb25nIGluZGV4OwotICAgICBib29sZWFuIGRlZmluaXRpb247Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICpzOwotCi0gIHMgPSAoc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKnMpOwotICBzLT5zdHJpbmcgPSB4c3RyZHVwIChzdHJpbmcpOwotICBzLT5pbmRleCA9IGluZGV4OwotICBzLT5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgcy0+c2l6ZSA9IHNpemU7Ci0KLSAgcy0+ZmllbGRzID0gTlVMTDsKLSAgcy0+YmFzZWNsYXNzZXMgPSBOVUxMOwotICBzLT5tZXRob2RzID0gTlVMTDsKLSAgcy0+dnRhYmxlID0gTlVMTDsKLQotICBzLT5uZXh0ID0gaW5mby0+dHlwZV9zdGFjazsKLSAgaW5mby0+dHlwZV9zdGFjayA9IHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSB0eXBlIGluZGV4IHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmRleCwgc2l6ZSkKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBsb25nIGluZGV4OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgY2hhciBidWZbMjBdOwotCi0gIHNwcmludGYgKGJ1ZiwgIiVsZCIsIGluZGV4KTsKLSAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGZhbHNlLCBzaXplKTsKLX0KLQotLyogUG9wIGEgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2suICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgZnJlZWluZyB0aGUgc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotc3RhYl9wb3BfdHlwZSAoaW5mbykKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICpzOwotICBjaGFyICpyZXQ7Ci0KLSAgcyA9IGluZm8tPnR5cGVfc3RhY2s7Ci0gIGFzc2VydCAocyAhPSBOVUxMKTsKLQotICBpbmZvLT50eXBlX3N0YWNrID0gcy0+bmV4dDsKLQotICByZXQgPSBzLT5zdHJpbmc7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIFRoZSBnZW5lcmFsIHJvdXRpbmUgdG8gd3JpdGUgb3V0IHN0YWJzIGluIHNlY3Rpb25zIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24uICBUaGlzIGFjY3VtdWxhdGVzIHRoZSBzdGFicyBzeW1ib2xzIGFuZCB0aGUgc3RyaW5ncyBpbgotICAgdHdvIG9ic3RhY2tzLiAgV2UgY2FuJ3QgZWFzaWx5IHdyaXRlIG91dCB0aGUgaW5mb3JtYXRpb24gYXMgd2UgZ28KLSAgIGFsb25nLCBiZWNhdXNlIHdlIG5lZWQgdG8ga25vdyB0aGUgc2VjdGlvbiBzaXplcyBiZWZvcmUgd2UgY2FuCi0gICB3cml0ZSBvdXQgdGhlIHNlY3Rpb24gY29udGVudHMuICBBQkZEIGlzIHRoZSBCRkQgYW5kIERIQU5ETEUgaXMgdGhlCi0gICBoYW5kbGUgZm9yIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHNldHMgKlBTWU1TIHRvIHBvaW50IHRvCi0gICB0aGUgc3ltYm9scywgKlBTWU1TSVpFIHRoZSBzaXplIG9mIHRoZSBzeW1ib2xzLCAqUFNUUklOR1MgdG8gdGhlCi0gICBzdHJpbmdzLCBhbmQgKlBTVFJJTkdTSVpFIHRvIHRoZSBzaXplIG9mIHRoZSBzdHJpbmdzLiAgKi8KLQotYm9vbGVhbgotd3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUsIHBzeW1zLCBwc3ltc2l6ZSwKLQkJCQkJcHN0cmluZ3MsIHBzdHJpbmdzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBiZmRfYnl0ZSAqKnBzeW1zOwotICAgICBiZmRfc2l6ZV90eXBlICpwc3ltc2l6ZTsKLSAgICAgYmZkX2J5dGUgKipwc3RyaW5nczsKLSAgICAgYmZkX3NpemVfdHlwZSAqcHN0cmluZ3NpemU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSBpbmZvOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF9ieXRlICpwOwotCi0gIGluZm8uYWJmZCA9IGFiZmQ7Ci0KLSAgaW5mby5zeW1ib2xzX3NpemUgPSAwOwotICBpbmZvLnN5bWJvbHNfYWxsb2MgPSA1MDA7Ci0gIGluZm8uc3ltYm9scyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChpbmZvLnN5bWJvbHNfYWxsb2MpOwotCi0gIGluZm8uc3RyaW5ncyA9IE5VTEw7Ci0gIGluZm8ubGFzdF9zdHJpbmcgPSBOVUxMOwotICAvKiBSZXNlcnZlIDEgYnl0ZSBmb3IgYSBudWxsIGJ5dGUuICAqLwotICBpbmZvLnN0cmluZ3Nfc2l6ZSA9IDE7Ci0KLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8uc3RyaGFzaC50YWJsZSwgc3RyaW5nX2hhc2hfbmV3ZnVuYykKLSAgICAgIHx8ICEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8udHlwZWRlZl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJiZmRfaGFzaF90YWJsZV9pbml0X2ZhaWxlZDogJXNcbiIsCi0JICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby50eXBlX3N0YWNrID0gTlVMTDsKLSAgaW5mby50eXBlX2luZGV4ID0gMTsKLSAgbWVtc2V0ICgmaW5mby50eXBlX2NhY2hlLCAwLCBzaXplb2YgaW5mby50eXBlX2NhY2hlKTsKLSAgaW5mby5zb19vZmZzZXQgPSAtMTsKLSAgaW5mby5mdW5fb2Zmc2V0ID0gLTE7Ci0gIGluZm8ubGFzdF90ZXh0X2FkZHJlc3MgPSAwOwotICBpbmZvLm5lc3RpbmcgPSAwOwotICBpbmZvLmZuYWRkciA9IDA7Ci0gIGluZm8ucGVuZGluZ19sYnJhYyA9IChiZmRfdm1hKSAtMTsKLQotICAvKiBUaGUgaW5pdGlhbCBzeW1ib2wgaG9sZHMgdGhlIHN0cmluZyBzaXplLiAgKi8KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKCZpbmZvLCAwLCAwLCAwLCAoY29uc3QgY2hhciAqKSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT3V0cHV0IGFuIGluaXRpYWwgTl9TTyBzeW1ib2wuICAqLwotICBpbmZvLnNvX29mZnNldCA9IGluZm8uc3ltYm9sc19zaXplOwotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoJmluZm8sIE5fU08sIDAsIDAsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGUgKGRoYW5kbGUsICZzdGFiX2ZucywgKFBUUikgJmluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhc3NlcnQgKGluZm8ucGVuZGluZ19sYnJhYyA9PSAoYmZkX3ZtYSkgLTEpOwotCi0gIC8qIE91dHB1dCBhIHRyYWlsaW5nIE5fU08uICAqLwotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoJmluZm8sIE5fU08sIDAsIGluZm8ubGFzdF90ZXh0X2FkZHJlc3MsCi0JCQkgICAoY29uc3QgY2hhciAqKSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUHV0IHRoZSBzdHJpbmcgc2l6ZSBpbiB0aGUgaW5pdGlhbCBzeW1ib2wuICAqLwotICBiZmRfcHV0XzMyIChhYmZkLCBpbmZvLnN0cmluZ3Nfc2l6ZSwgaW5mby5zeW1ib2xzICsgOCk7Ci0KLSAgKnBzeW1zID0gaW5mby5zeW1ib2xzOwotICAqcHN5bXNpemUgPSBpbmZvLnN5bWJvbHNfc2l6ZTsKLQotICAqcHN0cmluZ3NpemUgPSBpbmZvLnN0cmluZ3Nfc2l6ZTsKLSAgKnBzdHJpbmdzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKGluZm8uc3RyaW5nc19zaXplKTsKLQotICBwID0gKnBzdHJpbmdzOwotICAqcCsrID0gJ1wwJzsKLSAgZm9yIChoID0gaW5mby5zdHJpbmdzOyBoICE9IE5VTEw7IGggPSBoLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cmNweSAoKGNoYXIgKikgcCwgaC0+cm9vdC5zdHJpbmcpOwotICAgICAgcCArPSBzdHJsZW4gKChjaGFyICopIHApICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGluZm9ybWF0aW9uIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdGFydF9jb21waWxhdGlvbl91bml0IChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogV2Ugd291bGQgbm9ybWFsbHkgb3V0cHV0IGFuIE5fU08gc3ltYm9sIGhlcmUuICBIb3dldmVyLCB0aGF0Ci0gICAgIHdvdWxkIGZvcmNlIHVzIHRvIHJlc2V0IGFsbCBvZiBvdXIgdHlwZSBpbmZvcm1hdGlvbi4gIEkgdGhpbmsgd2UKLSAgICAgd2lsbCBiZSBiZXR0ZXIgb2ZmIGp1c3Qgb3V0cHV0dGluZyBhbiBOX1NPTCBzeW1ib2wsIGFuZCBub3QKLSAgICAgd29ycnlpbmcgYWJvdXQgc3BsaXR0aW5nIGluZm9ybWF0aW9uIGJldHdlZW4gZmlsZXMuICAqLwotCi0gIGluZm8tPmxpbmVub19maWxlbmFtZSA9IGZpbGVuYW1lOwotCi0gIHJldHVybiBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9TT0wsIDAsIDAsIGZpbGVuYW1lKTsKLX0KLQotLyogU3RhcnQgd3JpdGluZyBvdXQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBzb3VyY2UgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3N0YXJ0X3NvdXJjZSAocCwgZmlsZW5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIC8qIEZJWE1FOiBUaGUgc3ltYm9sJ3MgdmFsdWUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHRleHQgc2VjdGlvbgotICAgICBhZGRyZXNzLiAgSG93ZXZlciwgd2Ugd291bGQgaGF2ZSB0byBmaWxsIGl0IGluIGxhdGVyLCBhbmQgZ2RiCi0gICAgIGRvZXNuJ3QgY2FyZSwgc28gd2UgZG9uJ3QgYm90aGVyIHdpdGggaXQuICAqLwotCi0gIGluZm8tPmxpbmVub19maWxlbmFtZSA9IGZpbGVuYW1lOwotCi0gIHJldHVybiBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9TT0wsIDAsIDAsIGZpbGVuYW1lKTsKLX0KLQotLyogUHVzaCBhbiBlbXB0eSB0eXBlLiAgVGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuLiAgV2UganVzdCB1c2UgYQotICAgdm9pZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW1wdHlfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBXZSBkb24ndCBjYWxsIHN0YWJfdm9pZF90eXBlIGlmIHRoZSB0eXBlIGlzIG5vdCB5ZXQgZGVmaW5lZCwKLSAgICAgYmVjYXVzZSB0aGF0IG1pZ2h0IHNjcmV3IHVwIHRoZSB0eXBlZGVmLiAgKi8KLQotICBpZiAoaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUgIT0gMCkKLSAgICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUsIDApOwotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbmRleDsKLSAgICAgIGNoYXIgYnVmWzQwXTsKLQotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotCi0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9JWxkIiwgaW5kZXgsIGluZGV4KTsKLQotICAgICAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGZhbHNlLCAwKTsKLSAgICB9Ci19Ci0KLS8qIFB1c2ggYSB2b2lkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl92b2lkX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgaWYgKGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlICE9IDApCi0gICAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlLCAwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW5kZXg7Ci0gICAgICBjaGFyIGJ1Zls0MF07Ci0KLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLQotICAgICAgaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUgPSBpbmRleDsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPSVsZCIsIGluZGV4LCBpbmRleCk7Ci0KLSAgICAgIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCAwKTsKLSAgICB9Ci19Ci0KLS8qIFB1c2ggYW4gaW50ZWdlciB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfaW50X3R5cGUgKHAsIHNpemUsIHVuc2lnbmVkcCkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBsb25nICpjYWNoZTsKLQotICBpZiAoc2l6ZSA8PSAwIHx8IChzaXplID4gc2l6ZW9mIChsb25nKSAmJiBzaXplICE9IDgpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygic3RhYl9pbnRfdHlwZTogYmFkIHNpemUgJXVcbiIpLCBzaXplKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHVuc2lnbmVkcCkKLSAgICBjYWNoZSA9IGluZm8tPnR5cGVfY2FjaGUuc2lnbmVkX2ludGVnZXJfdHlwZXM7Ci0gIGVsc2UKLSAgICBjYWNoZSA9IGluZm8tPnR5cGVfY2FjaGUudW5zaWduZWRfaW50ZWdlcl90eXBlczsKLQotICBpZiAoY2FjaGVbc2l6ZSAtIDFdICE9IDApCi0gICAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGNhY2hlW3NpemUgLSAxXSwgc2l6ZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIGluZGV4OwotICAgICAgY2hhciBidWZbMTAwXTsKLQotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotCi0gICAgICBjYWNoZVtzaXplIC0gMV0gPSBpbmRleDsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPXIlbGQ7IiwgaW5kZXgsIGluZGV4KTsKLSAgICAgIGlmICh1bnNpZ25lZHApCi0JewotCSAgc3RyY2F0IChidWYsICIwOyIpOwotCSAgaWYgKHNpemUgPCBzaXplb2YgKGxvbmcpKQotCSAgICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIlbGQ7IiwgKChsb25nKSAxIDw8IChzaXplICogOCkpIC0gMSk7Ci0JICBlbHNlIGlmIChzaXplID09IHNpemVvZiAobG9uZykpCi0JICAgIHN0cmNhdCAoYnVmLCAiLTE7Iik7Ci0JICBlbHNlIGlmIChzaXplID09IDgpCi0JICAgIHN0cmNhdCAoYnVmLCAiMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Iik7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc2l6ZSA8PSBzaXplb2YgKGxvbmcpKQotCSAgICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIlbGQ7JWxkOyIsCi0JCSAgICAgKGxvbmcpIC0gKCh1bnNpZ25lZCBsb25nKSAxIDw8IChzaXplICogOCAtIDEpKSwKLQkJICAgICAobG9uZykgKCgodW5zaWduZWQgbG9uZykgMSA8PCAoc2l6ZSAqIDggLSAxKSkgLSAxKSk7Ci0JICBlbHNlIGlmIChzaXplID09IDgpCi0JICAgIHN0cmNhdCAoYnVmLCAiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDA7MDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzsiKTsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgc2l6ZSk7Ci0gICAgfQotfQotCi0vKiBQdXNoIGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2Zsb2F0X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIGlmIChzaXplID4gMAotICAgICAgJiYgc2l6ZSAtIDEgPCAoc2l6ZW9mIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXMKLQkJICAgICAvIHNpemVvZiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzWzBdKQotICAgICAgJiYgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1tzaXplIC0gMV0gIT0gMCkKLSAgICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywKLQkJCQkgICBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzW3NpemUgLSAxXSwKLQkJCQkgICBzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW5kZXg7Ci0gICAgICBjaGFyICppbnRfdHlwZTsKLSAgICAgIGNoYXIgYnVmWzUwXTsKLQotICAgICAgLyogRmxvYXRzIGFyZSBkZWZpbmVkIGFzIGEgc3VicmFuZ2Ugb2YgaW50LiAgKi8KLSAgICAgIGlmICghIHN0YWJfaW50X3R5cGUgKGluZm8sIDQsIGZhbHNlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbnRfdHlwZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLSAgICAgIGlmIChzaXplID4gMAotCSAgJiYgc2l6ZSAtIDEgPCAoc2l6ZW9mIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXMKLQkJCSAvIHNpemVvZiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzWzBdKSkKLQlpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzW3NpemUgLSAxXSA9IGluZGV4OwotCi0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9ciVzOyV1OzA7IiwgaW5kZXgsIGludF90eXBlLCBzaXplKTsKLQotICAgICAgZnJlZSAoaW50X3R5cGUpOwotCi0gICAgICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgc2l6ZSk7Ci0gICAgfQotfQotCi0vKiBQdXNoIGEgY29tcGxleCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY29tcGxleF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciBidWZbNTBdOwotICBsb25nIGluZGV4OwotCi0gIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgKytpbmZvLT50eXBlX2luZGV4OwotCi0gIHNwcmludGYgKGJ1ZiwgIiVsZD1yJWxkOyV1OzA7IiwgaW5kZXgsIGluZGV4LCBzaXplKTsKLQotICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgc2l6ZSAqIDIpOwotfQotCi0vKiBQdXNoIGEgYm9vbGVhbiB0eXBlLiAgV2UgdXNlIGFuIFhDT0ZGIHByZWRlZmluZWQgdHlwZSwgc2luY2UgZ2RiCi0gICBhbHdheXMgcmVjb2duaXplcyB0aGVtLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfYm9vbF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgbG9uZyBpbmRleDsKLQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGluZGV4ID0gLTIxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBpbmRleCA9IC0yMjsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDQ6Ci0gICAgICBpbmRleCA9IC0xNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA4OgotICAgICAgaW5kZXggPSAtMzM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCBzaXplKTsKLX0KLQotLyogUHVzaCBhbiBlbnVtIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbnVtX3R5cGUgKHAsIHRhZywgbmFtZXMsIHZhbHMpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgICAgYmZkX3NpZ25lZF92bWEgKnZhbHM7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgc2l6ZV90IGxlbjsKLSAgY29uc3QgY2hhciAqKnBuOwotICBjaGFyICpidWY7Ci0gIGxvbmcgaW5kZXggPSAwOwotICBiZmRfc2lnbmVkX3ZtYSAqcHY7Ci0KLSAgaWYgKG5hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgYXNzZXJ0ICh0YWcgIT0gTlVMTCk7Ci0KLSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDEwICsgc3RybGVuICh0YWcpKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgInhlJXM6IiwgdGFnKTsKLSAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBpcyBqdXN0IGEgZ3Vlc3MuICAqLwotICAgICAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBmYWxzZSwgNCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBsZW4gPSAxMDsKLSAgaWYgKHRhZyAhPSBOVUxMKQotICAgIGxlbiArPSBzdHJsZW4gKHRhZyk7Ci0gIGZvciAocG4gPSBuYW1lczsgKnBuICE9IE5VTEw7IHBuKyspCi0gICAgbGVuICs9IHN0cmxlbiAoKnBuKSArIDIwOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0KLSAgaWYgKHRhZyA9PSBOVUxMKQotICAgIHN0cmNweSAoYnVmLCAiZSIpOwotICBlbHNlCi0gICAgewotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotICAgICAgc3ByaW50ZiAoYnVmLCAiJXM6VCVsZD1lIiwgdGFnLCBpbmRleCk7Ci0gICAgfQotCi0gIGZvciAocG4gPSBuYW1lcywgcHYgPSB2YWxzOyAqcG4gIT0gTlVMTDsgcG4rKywgcHYrKykKLSAgICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIlczolbGQsIiwgKnBuLCAobG9uZykgKnB2KTsKLSAgc3RyY2F0IChidWYsICI7Iik7Ci0KLSAgaWYgKHRhZyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBpcyBqdXN0IGEgZ3Vlc3MuICAqLwotICAgICAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBmYWxzZSwgNCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBpcyBqdXN0IGEgZ3Vlc3MuICAqLwotICAgICAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKQotCSAgfHwgISBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmRleCwgNCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGEgbW9kaWZpY2F0aW9uIG9mIHRoZSB0b3AgdHlwZSBvbiB0aGUgc3RhY2suICBDYWNoZSB0aGUKLSAgIHJlc3VsdHMgaW4gQ0FDSEUgYW5kIENBQ0hFX0FMTE9DLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sIG1vZCwgc2l6ZSwgY2FjaGUsIGNhY2hlX2FsbG9jKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci0gICAgIGludCBtb2Q7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBsb25nICoqY2FjaGU7Ci0gICAgIHNpemVfdCAqY2FjaGVfYWxsb2M7Ci17Ci0gIGxvbmcgdGFyZ2luZGV4OwotICBsb25nIGluZGV4OwotICBjaGFyICpzLCAqYnVmOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMKTsKLSAgdGFyZ2luZGV4ID0gaW5mby0+dHlwZV9zdGFjay0+aW5kZXg7Ci0KLSAgaWYgKHRhcmdpbmRleCA8PSAwCi0gICAgICB8fCBjYWNoZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZGVmaW5pdGlvbjsKLQotICAgICAgLyogRWl0aGVyIHRoZSB0YXJnZXQgdHlwZSBoYXMgbm8gaW5kZXgsIG9yIHdlIGFyZW4ndCBjYWNoaW5nCi0gICAgICAgICB0aGlzIG1vZGlmaWVyLiAgRWl0aGVyIHdheSB3ZSBoYXZlIG5vIHdheSBvZiByZWNvcmRpbmcgdGhlCi0gICAgICAgICBuZXcgdHlwZSwgc28gd2UgZG9uJ3QgYm90aGVyIHRvIGRlZmluZSBvbmUuICAqLwotICAgICAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gICAgICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMik7Ci0gICAgICBzcHJpbnRmIChidWYsICIlYyVzIiwgbW9kLCBzKTsKLSAgICAgIGZyZWUgKHMpOwotICAgICAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBkZWZpbml0aW9uLCBzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmcmVlIChidWYpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoc2l6ZV90KSB0YXJnaW5kZXggPj0gKmNhY2hlX2FsbG9jKQotCXsKLQkgIHNpemVfdCBhbGxvYzsKLQotCSAgYWxsb2MgPSAqY2FjaGVfYWxsb2M7Ci0JICBpZiAoYWxsb2MgPT0gMCkKLQkgICAgYWxsb2MgPSAxMDsKLQkgIHdoaWxlICgoc2l6ZV90KSB0YXJnaW5kZXggPj0gYWxsb2MpCi0JICAgIGFsbG9jICo9IDI7Ci0JICAqY2FjaGUgPSAobG9uZyAqKSB4cmVhbGxvYyAoKmNhY2hlLCBhbGxvYyAqIHNpemVvZiAobG9uZykpOwotCSAgbWVtc2V0ICgqY2FjaGUgKyAqY2FjaGVfYWxsb2MsIDAsCi0JCSAgKGFsbG9jIC0gKmNhY2hlX2FsbG9jKSAqIHNpemVvZiAobG9uZykpOwotCSAgKmNhY2hlX2FsbG9jID0gYWxsb2M7Ci0JfQotCi0gICAgICBpbmRleCA9ICgqY2FjaGUpW3RhcmdpbmRleF07Ci0gICAgICBpZiAoaW5kZXggIT0gMCAmJiAhIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24pCi0JewotCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgYSBtb2RpZmljYXRpb24gb2YgdGhpcyB0eXBlLCBhbmQKLSAgICAgICAgICAgICB0aGUgZW50cnkgb24gdGhlIHR5cGUgc3RhY2sgaXMgbm90IGEgZGVmaW5pdGlvbiwgc28gd2UKLSAgICAgICAgICAgICBjYW4gc2FmZWx5IGRpc2NhcmQgaXQgKHdlIG1heSBoYXZlIGEgZGVmaW5pdGlvbiBvbiB0aGUKLSAgICAgICAgICAgICBzdGFjaywgZXZlbiBpZiB3ZSBhbHJlYWR5IGRlZmluZWQgYSBtb2RpZmljYXRpb24sIGlmIGl0Ci0gICAgICAgICAgICAgaXMgYSBzdHJ1Y3Qgd2hpY2ggd2UgZGlkIG5vdCBkZWZpbmUgYXQgdGhlIHRpbWUgaXQgd2FzCi0gICAgICAgICAgICAgcmVmZXJlbmNlZCkuICAqLwotCSAgZnJlZSAoc3RhYl9wb3BfdHlwZSAoaW5mbykpOwotCSAgaWYgKCEgc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIHNpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLQkgICsraW5mby0+dHlwZV9pbmRleDsKLQotCSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDIwKTsKLQkgIHNwcmludGYgKGJ1ZiwgIiVsZD0lYyVzIiwgaW5kZXgsIG1vZCwgcyk7Ci0JICBmcmVlIChzKTsKLQotCSAgKCpjYWNoZSlbdGFyZ2luZGV4XSA9IGluZGV4OwotCi0JICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCBzaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBmcmVlIChidWYpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19ICAKLQotLyogUHVzaCBhIHBvaW50ZXIgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3BvaW50ZXJfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRTogVGhlIHNpemUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICByZXR1cm4gc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgJyonLCA0LCAmaW5mby0+dHlwZV9jYWNoZS5wb2ludGVyX3R5cGVzLAotCQkJICAgJmluZm8tPnR5cGVfY2FjaGUucG9pbnRlcl90eXBlc19hbGxvYyk7Ci19Ci0KLS8qIFB1c2ggYSBmdW5jdGlvbiB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZnVuY3Rpb25fdHlwZSAocCwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBpbnQgYXJnY291bnQ7Ci0gICAgIGJvb2xlYW4gdmFyYXJncyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGludCBpOwotCi0gIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlcHJlc2VudCB0aGUgYXJndW1lbnQgdHlwZXMsIHNvIHdlIGp1c3QKLSAgICAgZGlzY2FyZCB0aGVtLiAgSG93ZXZlciwgaWYgdGhleSBkZWZpbmUgbmV3IHR5cGVzLCB3ZSBtdXN0IG91dHB1dAotICAgICB0aGVtLiAgV2UgZG8gdGhpcyBieSBwcm9kdWNpbmcgZW1wdHkgdHlwZWRlZnMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uKQotCWZyZWUgKHN0YWJfcG9wX3R5cGUgKGluZm8pKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpzLCAqYnVmOwotCi0JICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLQkgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAzKTsKLQkgIHNwcmludGYgKGJ1ZiwgIjp0JXMiLCBzKTsKLQkgIGZyZWUgKHMpOwotCi0JICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGZyZWUgKGJ1Zik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgJ2YnLCAwLCAmaW5mby0+dHlwZV9jYWNoZS5mdW5jdGlvbl90eXBlcywKLQkJCSAgICZpbmZvLT50eXBlX2NhY2hlLmZ1bmN0aW9uX3R5cGVzX2FsbG9jKTsKLX0KLQotLyogUHVzaCBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfcmVmZXJlbmNlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUU6IFRoZSBzaXplIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICcmJywgNCwgJmluZm8tPnR5cGVfY2FjaGUucmVmZXJlbmNlX3R5cGVzLAotCQkJICAgJmluZm8tPnR5cGVfY2FjaGUucmVmZXJlbmNlX3R5cGVzX2FsbG9jKTsKLX0KLQotLyogUHVzaCBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9yYW5nZV90eXBlIChwLCBsb3csIGhpZ2gpCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgY2hhciAqcywgKmJ1ZjsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnNpemU7Ci0KLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMTAwKTsKLSAgc3ByaW50ZiAoYnVmLCAiciVzOyVsZDslbGQ7IiwgcywgKGxvbmcpIGxvdywgKGxvbmcpIGhpZ2gpOwotICBmcmVlIChzKTsKLQotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGRlZmluaXRpb24sIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGFuIGFycmF5IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9hcnJheV90eXBlIChwLCBsb3csIGhpZ2gsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIHVuc2lnbmVkIGludCBlbGVtZW50X3NpemU7Ci0gIGNoYXIgKnJhbmdlLCAqZWxlbWVudCwgKmJ1ZjsKLSAgbG9uZyBpbmRleDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHJhbmdlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgZWxlbWVudF9zaXplID0gaW5mby0+dHlwZV9zdGFjay0+c2l6ZTsKLSAgZWxlbWVudCA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocmFuZ2UpICsgc3RybGVuIChlbGVtZW50KSArIDEwMCk7Ci0KLSAgaWYgKCEgc3RyaW5ncCkKLSAgICB7Ci0gICAgICBpbmRleCA9IDA7Ci0gICAgICAqYnVmID0gJ1wwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIGRlZmluZSBhIHR5cGUgaW4gb3JkZXIgdG8gaW5jbHVkZSB0aGUgc3RyaW5nCi0gICAgICAgICBhdHRyaWJ1dGUuICAqLwotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotICAgICAgZGVmaW5pdGlvbiA9IHRydWU7Ci0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9QFM7IiwgaW5kZXgpOwotICAgIH0KLQotICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICJhciVzOyVsZDslbGQ7JXMiLAotCSAgIHJhbmdlLCAobG9uZykgbG93LCAobG9uZykgaGlnaCwgZWxlbWVudCk7Ci0gIGZyZWUgKHJhbmdlKTsKLSAgZnJlZSAoZWxlbWVudCk7Ci0KLSAgaWYgKGhpZ2ggPCBsb3cpCi0gICAgc2l6ZSA9IDA7Ci0gIGVsc2UKLSAgICBzaXplID0gZWxlbWVudF9zaXplICogKChoaWdoIC0gbG93KSArIDEpOwotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBkZWZpbml0aW9uLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHNldCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc2V0X3R5cGUgKHAsIGJpdHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBib29sZWFuIGJpdHN0cmluZ3A7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICpzLCAqYnVmOwotICBsb25nIGluZGV4OwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotCi0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDMwKTsKLQotICBpZiAoISBiaXRzdHJpbmdwKQotICAgIHsKLSAgICAgICpidWYgPSAnXDAnOwotICAgICAgaW5kZXggPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gZGVmaW5lIGEgdHlwZSBpbiBvcmRlciB0byBpbmNsdWRlIHRoZSBzdHJpbmcKLSAgICAgICAgIGF0dHJpYnV0ZS4gICovCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0gICAgICBkZWZpbml0aW9uID0gdHJ1ZTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD1AUzsiLCBpbmRleCk7Ci0gICAgfQotCi0gIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIlMlcyIsIHMpOwotICBmcmVlIChzKTsKLQotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBkZWZpbml0aW9uLCAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhbiBvZmZzZXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX29mZnNldF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKnRhcmdldCwgKmJhc2UsICpidWY7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHRhcmdldCA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIGJhc2UgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHRhcmdldCkgKyBzdHJsZW4gKGJhc2UpICsgMyk7Ci0gIHNwcmludGYgKGJ1ZiwgIkAlcywlcyIsIGJhc2UsIHRhcmdldCk7Ci0gIGZyZWUgKGJhc2UpOwotICBmcmVlICh0YXJnZXQpOwotCi0gIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZGVmaW5pdGlvbiwgMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSBtZXRob2QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX21ldGhvZF90eXBlIChwLCBkb21haW5wLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGJvb2xlYW4gZG9tYWlucDsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICpkb21haW4sICpyZXR1cm5fdHlwZSwgKmJ1ZjsKLSAgY2hhciAqKmFyZ3M7Ci0gIGludCBpOwotICBzaXplX3QgbGVuOwotCi0gIC8qIFdlIGRvbid0IGJvdGhlciB3aXRoIHN0dWIgbWV0aG9kIHR5cGVzLCBiZWNhdXNlIHRoYXQgd291bGQKLSAgICAgcmVxdWlyZSBhIG1hbmdsZXIgZm9yIEMrKyBhcmd1bWVudCB0eXBlcy4gIFRoaXMgd2lsbCB3YXN0ZSBzcGFjZQotICAgICBpbiB0aGUgZGVidWdnaW5nIG91dHB1dC4gICovCi0KLSAgLyogV2UgbmVlZCBhIGRvbWFpbi4gIEknbSBub3Qgc3VyZSBET01BSU5QIGNhbiBldmVyIGJlIGZhbHNlLAotICAgICBhbnlob3cuICAqLwotICBpZiAoISBkb21haW5wKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfZW1wdHlfdHlwZSAocCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgZG9tYWluID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQSBub24tdmFyYXJncyBmdW5jdGlvbiBpcyBpbmRpY2F0ZWQgYnkgbWFraW5nIHRoZSBsYXN0IHBhcmFtZXRlcgotICAgICB0eXBlIGJlIHZvaWQuICAqLwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgewotICAgICAgYXJncyA9IE5VTEw7Ci0gICAgICBhcmdjb3VudCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChhcmdjb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGlmICh2YXJhcmdzKQotCWFyZ3MgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGFyZ3MgPSAoY2hhciAqKikgeG1hbGxvYyAoMSAqIHNpemVvZiAoKmFyZ3MpKTsKLQkgIGlmICghIHN0YWJfZW1wdHlfdHlwZSAocCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0JICBhcmdzWzBdID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0JICBhcmdjb3VudCA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFyZ3MgPSAoY2hhciAqKikgeG1hbGxvYyAoKGFyZ2NvdW50ICsgMSkgKiBzaXplb2YgKCphcmdzKSk7Ci0gICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0JICBhcmdzW2ldID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0JfQotICAgICAgaWYgKCEgdmFyYXJncykKLQl7Ci0JICBpZiAoISBzdGFiX2VtcHR5X3R5cGUgKHApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotCSAgYXJnc1thcmdjb3VudF0gPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQkgICsrYXJnY291bnQ7Ci0JfQotICAgIH0KLQotICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICByZXR1cm5fdHlwZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGxlbiA9IHN0cmxlbiAoZG9tYWluKSArIHN0cmxlbiAocmV0dXJuX3R5cGUpICsgMTA7Ci0gIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotICAgIGxlbiArPSBzdHJsZW4gKGFyZ3NbaV0pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0KLSAgc3ByaW50ZiAoYnVmLCAiIyVzLCVzIiwgZG9tYWluLCByZXR1cm5fdHlwZSk7Ci0gIGZyZWUgKGRvbWFpbik7Ci0gIGZyZWUgKHJldHVybl90eXBlKTsKLSAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyBpKyspCi0gICAgewotICAgICAgc3RyY2F0IChidWYsICIsIik7Ci0gICAgICBzdHJjYXQgKGJ1ZiwgYXJnc1tpXSk7Ci0gICAgICBmcmVlIChhcmdzW2ldKTsKLSAgICB9Ci0gIHN0cmNhdCAoYnVmLCAiOyIpOwotCi0gIGlmIChhcmdzICE9IE5VTEwpCi0gICAgZnJlZSAoYXJncyk7Ci0KLSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBkZWZpbml0aW9uLCAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIGNvbnN0IHZlcnNpb24gb2YgYSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY29uc3RfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgJ2snLCBpbmZvLT50eXBlX3N0YWNrLT5zaXplLAotCQkJICAgKGxvbmcgKiopIE5VTEwsIChzaXplX3QgKikgTlVMTCk7Ci19Ci0KLS8qIFB1c2ggYSB2b2xhdGlsZSB2ZXJzaW9uIG9mIGEgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3ZvbGF0aWxlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICdCJywgaW5mby0+dHlwZV9zdGFjay0+c2l6ZSwKLQkJCSAgIChsb25nICoqKSBOVUxMLCAoc2l6ZV90ICopIE5VTEwpOwotfQotCi0vKiBHZXQgdGhlIHR5cGUgaW5kZXggdG8gdXNlIGZvciBhIHN0cnVjdC91bmlvbi9jbGFzcyBJRC4gIFRoaXMgc2hvdWxkCi0gICByZXR1cm4gLTEgaWYgaXQgZmFpbHMuICAqLwotCi1zdGF0aWMgbG9uZwotc3RhYl9nZXRfc3RydWN0X2luZGV4IChpbmZvLCB0YWcsIGlkLCBraW5kLCBwc2l6ZSkKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLSAgICAgdW5zaWduZWQgaW50ICpwc2l6ZTsKLXsKLSAgaWYgKGlkID49IGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzX2FsbG9jKQotICAgIHsKLSAgICAgIHNpemVfdCBhbGxvYzsKLQotICAgICAgYWxsb2MgPSBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYzsKLSAgICAgIGlmIChhbGxvYyA9PSAwKQotCWFsbG9jID0gMTA7Ci0gICAgICB3aGlsZSAoaWQgPj0gYWxsb2MpCi0JYWxsb2MgKj0gMjsKLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzID0KLQkoc3RydWN0IHN0YWJfdGFnICopIHhyZWFsbG9jIChpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlcywKLQkJCQkgICAgICBhbGxvYyAqIHNpemVvZiAoc3RydWN0IHN0YWJfdGFnKSk7Ci0gICAgICBtZW1zZXQgKChpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlcwotCSAgICAgICArIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzX2FsbG9jKSwKLQkgICAgICAwLAotCSAgICAgICgoYWxsb2MgLSBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYykKLQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBzdGFiX3RhZykpKTsKLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzX2FsbG9jID0gYWxsb2M7Ci0gICAgfQotCi0gIGlmIChpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0uaW5kZXggPT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0uaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLnRhZyA9IHRhZzsKLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5raW5kID0ga2luZDsKLSAgICB9Ci0KLSAgaWYgKGtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBkZWZpbml0aW9uIG9mIHRoZSBzdHJ1Y3QuICAqLwotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLmtpbmQgPSBraW5kOwotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLnNpemUgPSAqcHNpemU7Ci0gICAgfQotICBlbHNlCi0gICAgKnBzaXplID0gaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLnNpemU7Ci0KLSAgcmV0dXJuIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5pbmRleDsKLX0KLQotLyogU3RhcnQgb3V0cHV0dGluZyBhIHN0cnVjdC4gIFdlIGlnbm9yZSB0aGUgdGFnLCBhbmQgaGFuZGxlIGl0IGluCi0gICBzdGFiX3RhZy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfc3RydWN0X3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBsb25nIGluZGV4OwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKmJ1ZjsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICg0MCk7Ci0KLSAgaWYgKGlkID09IDApCi0gICAgewotICAgICAgaW5kZXggPSAwOwotICAgICAgKmJ1ZiA9ICdcMCc7Ci0gICAgICBkZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5kZXggPSBzdGFiX2dldF9zdHJ1Y3RfaW5kZXggKGluZm8sIHRhZywgaWQsIERFQlVHX0tJTkRfSUxMRUdBTCwKLQkJCQkgICAgICZzaXplKTsKLSAgICAgIGlmIChpbmRleCA8IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPSIsIGluZGV4KTsKLSAgICAgIGRlZmluaXRpb24gPSB0cnVlOwotICAgIH0KLQotICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIlYyV1IiwKLQkgICBzdHJ1Y3RwID8gJ3MnIDogJ3UnLAotCSAgIHNpemUpOwotCi0gIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGRlZmluaXRpb24sIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgPSAoY2hhciAqKSB4bWFsbG9jICgxKTsKLSAgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzWzBdID0gJ1wwJzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgZmllbGQgdG8gYSBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdHJ1Y3RfZmllbGQgKHAsIG5hbWUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBiZmRfdm1hIGJpdHNpemU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGNoYXIgKnMsICpuOwotICBjb25zdCBjaGFyICp2aXM7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT5zaXplOwotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQWRkIHRoaXMgZmllbGQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdHJ1Y3QgZmllbGRzLCB3aGljaCBpcwotICAgICBjdXJyZW50bHkgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzICE9IE5VTEwpOwotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpCi0JCQkrIHN0cmxlbiAobmFtZSkKLQkJCSsgc3RybGVuIChzKQotCQkJKyA1MCk7Ci0KLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgdmlzID0gIiI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgdmlzID0gIi8wIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHZpcyA9ICIvMSI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGJpdHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICBiaXRzaXplID0gc2l6ZSAqIDg7Ci0gICAgICBpZiAoYml0c2l6ZSA9PSAwKQotCWZwcmludGYgKHN0ZGVyciwKLQkJIF8oIiVzOiB3YXJuaW5nOiB1bmtub3duIHNpemUgZm9yIGZpZWxkIGAlcycgaW4gc3RydWN0XG4iKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpLCBuYW1lKTsKLSAgICB9Ci0KLSAgc3ByaW50ZiAobiwgIiVzJXM6JXMlcywlbGQsJWxkOyIsIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcywgbmFtZSwgdmlzLCBzLAotCSAgIChsb25nKSBiaXRwb3MsIChsb25nKSBiaXRzaXplKTsKLQotICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpOwotICBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgPSBuOwotCi0gIGlmIChkZWZpbml0aW9uKQotICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbmRfc3RydWN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgbG9uZyBpbmRleDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGNoYXIgKmZpZWxkcywgKmZpcnN0LCAqYnVmOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT5pbmRleDsKLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnNpemU7Ci0gIGZpZWxkcyA9IGluZm8tPnR5cGVfc3RhY2stPmZpZWxkczsKLSAgZmlyc3QgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpcnN0KSArIHN0cmxlbiAoZmllbGRzKSArIDIpOwotICBzcHJpbnRmIChidWYsICIlcyVzOyIsIGZpcnN0LCBmaWVsZHMpOwotICBmcmVlIChmaXJzdCk7Ci0gIGZyZWUgKGZpZWxkcyk7Ci0KLSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZGVmaW5pdGlvbiwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IG91dHB1dHRpbmcgYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3N0YXJ0X2NsYXNzX3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUsIHZwdHIsIG93bnZwdHIpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB2cHRyOwotICAgICBib29sZWFuIG93bnZwdHI7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICp2c3RyaW5nOwotCi0gIGlmICghIHZwdHIgfHwgb3dudnB0cikKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICB2c3RyaW5nID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgICAgIHZzdHJpbmcgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLSAgICB9Ci0KLSAgaWYgKCEgc3RhYl9zdGFydF9zdHJ1Y3RfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2cHRyKQotICAgIHsKLSAgICAgIGNoYXIgKnZ0YWJsZTsKLQotICAgICAgaWYgKG93bnZwdHIpCi0JewotCSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrLT5pbmRleCA+IDApOwotCSAgdnRhYmxlID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOwotCSAgc3ByaW50ZiAodnRhYmxlLCAifiUlJWxkIiwgaW5mby0+dHlwZV9zdGFjay0+aW5kZXgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2dGFibGUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHZzdHJpbmcpICsgMyk7Ci0JICBzcHJpbnRmICh2dGFibGUsICJ+JSUlcyIsIHZzdHJpbmcpOwotCSAgZnJlZSAodnN0cmluZyk7Ci0JfQotCi0gICAgICBpbmZvLT50eXBlX3N0YWNrLT52dGFibGUgPSB2dGFibGU7Ci0gICAgfQotCi0gIGlmIChkZWZpbml0aW9uKQotICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBzdGF0aWMgbWVtYmVyIHRvIHRoZSBjbGFzcyBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX3N0YXRpY19tZW1iZXIgKHAsIG5hbWUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqcywgKm47Ci0gIGNvbnN0IGNoYXIgKnZpczsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEFkZCB0aGlzIGZpZWxkIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc3RydWN0IGZpZWxkcywgd2hpY2ggaXMKLSAgICAgY3VycmVudGx5IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKQotCQkJKyBzdHJsZW4gKG5hbWUpCi0JCQkrIHN0cmxlbiAocykKLQkJCSsgc3RybGVuIChwaHlzbmFtZSkKLQkJCSsgMTApOwotCi0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHZpcyA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHZpcyA9ICIvMCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICB2aXMgPSAiLzEiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHNwcmludGYgKG4sICIlcyVzOiVzJXM6JXM7IiwgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzLCBuYW1lLCB2aXMsIHMsCi0JICAgcGh5c25hbWUpOwotCi0gIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyk7Ci0gIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyA9IG47Ci0KLSAgaWYgKGRlZmluaXRpb24pCi0gICAgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbiA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGJhc2UgY2xhc3MgdG8gdGhlIGNsYXNzIG9uIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3NfYmFzZWNsYXNzIChwLCBiaXRwb3MsIHZpcnR1YWwsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgKmJ1ZjsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIGNoYXIgKipiYXNlY2xhc3NlczsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEJ1aWxkIHRoZSBiYXNlIGNsYXNzIHNwZWNpZmllci4gICovCi0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDI1KTsKLSAgYnVmWzBdID0gdmlydHVhbCA/ICcxJyA6ICcwJzsKLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIGJ1ZlsxXSA9ICcwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIGJ1ZlsxXSA9ICcxJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIGJ1ZlsxXSA9ICcyJzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBzcHJpbnRmIChidWYgKyAyLCAiJWxkLCVzOyIsIChsb25nKSBiaXRwb3MsIHMpOwotICBmcmVlIChzKTsKLQotICAvKiBBZGQgdGhlIG5ldyBiYXNlY2xhc3MgdG8gdGhlIGV4aXN0aW5nIG9uZXMuICAqLwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMgPT0gTlVMTCkKLSAgICBjID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGMgPSAwOwotICAgICAgd2hpbGUgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzW2NdICE9IE5VTEwpCi0JKytjOwotICAgIH0KLQotICBiYXNlY2xhc3NlcyA9IChjaGFyICoqKSB4cmVhbGxvYyAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMsCi0JCQkJICAgIChjICsgMikgKiBzaXplb2YgKCpiYXNlY2xhc3NlcykpOwotICBiYXNlY2xhc3Nlc1tjXSA9IGJ1ZjsKLSAgYmFzZWNsYXNzZXNbYyArIDFdID0gTlVMTDsKLQotICBpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3NlcyA9IGJhc2VjbGFzc2VzOwotCi0gIGlmIChkZWZpbml0aW9uKQotICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhZGRpbmcgYSBtZXRob2QgdG8gdGhlIGNsYXNzIG9uIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3Nfc3RhcnRfbWV0aG9kIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICptOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG0gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMyk7Ci0gICAgICAqbSA9ICdcMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbSA9IChjaGFyICopIHhyZWFsbG9jIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzLAotCQkJICAgICAoc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKQotCQkJICAgICAgKyBzdHJsZW4gKG5hbWUpCi0JCQkgICAgICArIDQpKTsKLSAgICB9Ci0KLSAgc3ByaW50ZiAobSArIHN0cmxlbiAobSksICIlczo6IiwgbmFtZSk7Ci0KLSAgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyA9IG07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHZhcmlhbnQsIGVpdGhlciBzdGF0aWMgb3Igbm90LCB0byB0aGUgY3VycmVudCBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgc3RhdGljcCwgY29uc3RwLCB2b2xhdGlsZXAsCi0JCSAgICAgICB2b2Zmc2V0LCBjb250ZXh0cCkKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gc3RhdGljcDsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dHA7Ci17Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqdHlwZTsKLSAgY2hhciAqY29udGV4dCA9IE5VTEw7Ci0gIGNoYXIgdmlzYywgcXVhbGMsIHR5cGVjOwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICB0eXBlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKGNvbnRleHRwKQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gICAgICBjb250ZXh0ID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0gICAgfQotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgIT0gTlVMTCk7Ci0KLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHZpc2MgPSAnMCc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICB2aXNjID0gJzEnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgdmlzYyA9ICcyJzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoY29uc3RwKQotICAgIHsKLSAgICAgIGlmICh2b2xhdGlsZXApCi0JcXVhbGMgPSAnRCc7Ci0gICAgICBlbHNlCi0JcXVhbGMgPSAnQic7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHZvbGF0aWxlcCkKLQlxdWFsYyA9ICdDJzsKLSAgICAgIGVsc2UKLQlxdWFsYyA9ICdBJzsKLSAgICB9Ci0KLSAgaWYgKHN0YXRpY3ApCi0gICAgdHlwZWMgPSAnPyc7Ci0gIGVsc2UgaWYgKCEgY29udGV4dHApCi0gICAgdHlwZWMgPSAnLic7Ci0gIGVsc2UKLSAgICB0eXBlYyA9ICcqJzsKLQotICBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzID0KLSAgICAoY2hhciAqKSB4cmVhbGxvYyAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcywKLQkJICAgICAgIChzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpCi0JCQkrIHN0cmxlbiAodHlwZSkKLQkJCSsgc3RybGVuIChwaHlzbmFtZSkKLQkJCSsgKGNvbnRleHRwID8gc3RybGVuIChjb250ZXh0KSA6IDApCi0JCQkrIDQwKSk7Ci0KLSAgc3ByaW50ZiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyArIHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyksCi0JICAgIiVzOiVzOyVjJWMlYyIsIHR5cGUsIHBoeXNuYW1lLCB2aXNjLCBxdWFsYywgdHlwZWMpOwotICBmcmVlICh0eXBlKTsKLQotICBpZiAoY29udGV4dHApCi0gICAgewotICAgICAgc3ByaW50ZiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyArIHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyksCi0JICAgICAgICIlbGQ7JXM7IiwgKGxvbmcpIHZvZmZzZXQsIGNvbnRleHQpOwotICAgICAgZnJlZSAoY29udGV4dCk7Ci0gICAgfQotCi0gIGlmIChkZWZpbml0aW9uKQotICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSB2YXJpYW50IHRvIHRoZSBjdXJyZW50IG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXAsCi0JCQkgICB2b2Zmc2V0LCBjb250ZXh0cCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3RhYl9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgZmFsc2UsIGNvbnN0cCwKLQkJCQl2b2xhdGlsZXAsIHZvZmZzZXQsIGNvbnRleHRwKTsKLX0KLQotLyogQWRkIGEgc3RhdGljIHZhcmlhbnQgdG8gdGhlIGN1cnJlbnQgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXApCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBzdGFiX2NsYXNzX21ldGhvZF92YXIgKGluZm8sIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCB0cnVlLCBjb25zdHAsCi0JCQkJdm9sYXRpbGVwLCAwLCBmYWxzZSk7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX2VuZF9tZXRob2QgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwgJiYgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyAhPSBOVUxMKTsKLQotICAvKiBXZSBhbGxvY2F0ZWQgZW5vdWdoIHJvb20gb24gaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyB0byBhZGQgdGhlCi0gICAgIHRyYWlsaW5nIHNlbWljb2xvbi4gICovCi0gIHN0cmNhdCAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcywgIjsiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbmRfY2xhc3NfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgc2l6ZV90IGxlbjsKLSAgdW5zaWduZWQgaW50IGkgPSAwOwotICBjaGFyICpidWY7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwgJiYgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzICE9IE5VTEwpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBzaXplIHdlIG5lZWQgdG8gYWxsb2NhdGUgZm9yIHRoZSBjbGFzcyBkZWZpbml0aW9uLiAgKi8KLQotICBsZW4gPSAoc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5zdHJpbmcpCi0JICsgc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpCi0JICsgMTApOwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZW4gKz0gMjA7Ci0gICAgICBmb3IgKGkgPSAwOyBpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tpXSAhPSBOVUxMOyBpKyspCi0JbGVuICs9IHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0pOwotICAgIH0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgIT0gTlVMTCkKLSAgICBsZW4gKz0gc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKTsKLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSAhPSBOVUxMKQotICAgIGxlbiArPSBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSk7Ci0KLSAgLyogQnVpbGQgdGhlIGNsYXNzIGRlZmluaXRpb24uICAqLwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0KLSAgc3RyY3B5IChidWYsIGluZm8tPnR5cGVfc3RhY2stPnN0cmluZyk7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzICE9IE5VTEwpCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiISV1LCIsIGkpOwotICAgICAgZm9yIChpID0gMDsgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIHN0cmNhdCAoYnVmLCBpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tpXSk7Ci0JICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tpXSk7Ci0JfQotICAgICAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMpOwotICAgICAgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMgPSBOVUxMOwotICAgIH0KLQotICBzdHJjYXQgKGJ1ZiwgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKTsKLSAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKTsKLSAgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzID0gTlVMTDsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cmNhdCAoYnVmLCBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKTsKLSAgICAgIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpOwotICAgICAgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyA9IE5VTEw7Ci0gICAgfQotCi0gIHN0cmNhdCAoYnVmLCAiOyIpOwotCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT52dGFibGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJjYXQgKGJ1ZiwgaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlKTsKLSAgICAgIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSk7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT52dGFibGUgPSBOVUxMOwotICAgIH0KLQotICAvKiBSZXBsYWNlIHRoZSBzdHJpbmcgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aCB0aGUgY29tcGxldGUKLSAgICAgY2xhc3MgZGVmaW5pdGlvbi4gICovCi0gIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPnN0cmluZyk7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnN0cmluZyA9IGJ1ZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHR5cGVkZWYgd2hpY2ggd2FzIHByZXZpb3VzbHkgZGVmaW5lZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3R5cGVkZWZfdHlwZSAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZpbmZvLT50eXBlZGVmX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0gIGFzc2VydCAoaCAhPSBOVUxMICYmIGgtPmluZGV4ID4gMCk7Ci0KLSAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGgtPmluZGV4LCBoLT5zaXplKTsKLX0KLQotLyogUHVzaCBhIHN0cnVjdCwgdW5pb24gb3IgY2xhc3MgdGFnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdGFnX3R5cGUgKHAsIG5hbWUsIGlkLCBraW5kKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGxvbmcgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotCi0gIGluZGV4ID0gc3RhYl9nZXRfc3RydWN0X2luZGV4IChpbmZvLCBuYW1lLCBpZCwga2luZCwgJnNpemUpOwotICBpZiAoaW5kZXggPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIHNpemUpOwotfQotCi0vKiBEZWZpbmUgYSB0eXBlZGVmLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdHlwZGVmIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBsb25nIGluZGV4OwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgY2hhciAqcywgKmJ1ZjsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpoOwotCi0gIGluZGV4ID0gaW5mby0+dHlwZV9zdGFjay0+aW5kZXg7Ci0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT5zaXplOwotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAocykgKyAyMCk7Ci0KLSAgaWYgKGluZGV4ID4gMCkKLSAgICBzcHJpbnRmIChidWYsICIlczp0JXMiLCBuYW1lLCBzKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzOnQlbGQ9JXMiLCBuYW1lLCBpbmRleCwgcyk7Ci0gICAgfQotCi0gIGZyZWUgKHMpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgaCA9IHN0cmluZ19oYXNoX2xvb2t1cCAoJmluZm8tPnR5cGVkZWZfaGFzaCwgbmFtZSwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygic3RyaW5nX2hhc2hfbG9va3VwIGZhaWxlZDogJXNcbiIpLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEkgZG9uJ3QgdGhpbmsgd2UgY2FyZSBhYm91dCByZWRlZmluaXRpb25zLiAgKi8KLQotICBoLT5pbmRleCA9IGluZGV4OwotICBoLT5zaXplID0gc2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVmaW5lIGEgdGFnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdGFnIChwLCB0YWcpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqcywgKmJ1ZjsKLQotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuICh0YWcpICsgc3RybGVuIChzKSArIDMpOwotCi0gIHNwcmludGYgKGJ1ZiwgIiVzOlQlcyIsIHRhZywgcyk7Ci0gIGZyZWUgKHMpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfaW50X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpidWY7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDIwKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXM6Yz1pJWxkIiwgbmFtZSwgKGxvbmcpIHZhbCk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVmaW5lIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9mbG9hdF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZG91YmxlIHZhbDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpidWY7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDIwKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXM6Yz1mJWciLCBuYW1lLCB2YWwpOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhIHR5cGVkIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdHlwZWRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnMsICpidWY7Ci0KLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHMpICsgMjApOwotICBzcHJpbnRmIChidWYsICIlczpjPWUlcywlbGQiLCBuYW1lLCBzLCAobG9uZykgdmFsKTsKLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl92YXJpYWJsZSAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpzLCAqYnVmOwotICBpbnQgc3RhYl90eXBlOwotICBjb25zdCBjaGFyICpraW5kc3RyOwotCi0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgREVCVUdfR0xPQkFMOgotICAgICAgc3RhYl90eXBlID0gTl9HU1lNOwotICAgICAga2luZHN0ciA9ICJHIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19TVEFUSUM6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1NUU1lNOwotICAgICAga2luZHN0ciA9ICJTIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19MT0NBTF9TVEFUSUM6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1NUU1lNOwotICAgICAga2luZHN0ciA9ICJWIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19MT0NBTDoKLSAgICAgIHN0YWJfdHlwZSA9IE5fTFNZTTsKLSAgICAgIGtpbmRzdHIgPSAiIjsKLQotICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBhIHR5cGUgcmVmZXJlbmNlIG9yIGRlZmluaXRpb24uICAqLwotICAgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQl7Ci0JICBjaGFyICpuOwotCSAgbG9uZyBpbmRleDsKLQotCSAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotCSAgKytpbmZvLT50eXBlX2luZGV4OwotCSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAyMCk7Ci0JICBzcHJpbnRmIChuLCAiJWxkPSVzIiwgaW5kZXgsIHMpOwotCSAgZnJlZSAocyk7Ci0JICBzID0gbjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfUkVHSVNURVI6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1JTWU07Ci0gICAgICBraW5kc3RyID0gInIiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHMpICsgMyk7Ci0gIHNwcmludGYgKGJ1ZiwgIiVzOiVzJXMiLCBuYW1lLCBraW5kc3RyLCBzKTsKLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIHN0YWJfdHlwZSwgMCwgdmFsLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBvdXRwdXR0aW5nIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdGFydF9mdW5jdGlvbiAocCwgbmFtZSwgZ2xvYmFscCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJvb2xlYW4gZ2xvYmFscDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpyZXR0eXBlLCAqYnVmOwotCi0gIGFzc2VydCAoaW5mby0+bmVzdGluZyA9PSAwICYmIGluZm8tPmZ1bl9vZmZzZXQgPT0gLTEpOwotCi0gIHJldHR5cGUgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChyZXR0eXBlKSArIDMpOwotICBzcHJpbnRmIChidWYsICIlczolYyVzIiwgbmFtZSwKLQkgICBnbG9iYWxwID8gJ0YnIDogJ2YnLAotCSAgIHJldHR5cGUpOwotCi0gIC8qIFdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG5vdywgc28gd2Ugc2V0IGl0IGluIHN0YXJ0X2Jsb2NrLiAgKi8KLSAgaW5mby0+ZnVuX29mZnNldCA9IGluZm8tPnN5bWJvbHNfc2l6ZTsKLQotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9GVU4sIDAsIDAsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2Z1bmN0aW9uX3BhcmFtZXRlciAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqcywgKmJ1ZjsKLSAgaW50IHN0YWJfdHlwZTsKLSAgY2hhciBraW5kYzsKLQotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX1BBUk1fU1RBQ0s6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1BTWU07Ci0gICAgICBraW5kYyA9ICdwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19QQVJNX1JFRzoKLSAgICAgIHN0YWJfdHlwZSA9IE5fUlNZTTsKLSAgICAgIGtpbmRjID0gJ1AnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1BBUk1fUkVGRVJFTkNFOgotICAgICAgc3RhYl90eXBlID0gTl9QU1lNOwotICAgICAga2luZGMgPSAndic7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfUEFSTV9SRUZfUkVHOgotICAgICAgc3RhYl90eXBlID0gTl9SU1lNOwotICAgICAga2luZGMgPSAnYSc7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAocykgKyAzKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXM6JWMlcyIsIG5hbWUsIGtpbmRjLCBzKTsKLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIHN0YWJfdHlwZSwgMCwgdmFsLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfYmxvY2sgKHAsIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBGaWxsIGluIGFueSBzbG90cyB3aGljaCBoYXZlIGJlZW4gd2FpdGluZyBmb3IgdGhlIGZpcnN0IGtub3duCi0gICAgIHRleHQgYWRkcmVzcy4gICovCi0KLSAgaWYgKGluZm8tPnNvX29mZnNldCAhPSAtMSkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBhZGRyLCBpbmZvLT5zeW1ib2xzICsgaW5mby0+c29fb2Zmc2V0ICsgOCk7Ci0gICAgICBpbmZvLT5zb19vZmZzZXQgPSAtMTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmZ1bl9vZmZzZXQgIT0gLTEpCi0gICAgewotICAgICAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgYWRkciwgaW5mby0+c3ltYm9scyArIGluZm8tPmZ1bl9vZmZzZXQgKyA4KTsKLSAgICAgIGluZm8tPmZ1bl9vZmZzZXQgPSAtMTsKLSAgICB9Ci0KLSAgKytpbmZvLT5uZXN0aW5nOwotCi0gIC8qIFdlIHdpbGwgYmUgY2FsbGVkIHdpdGggYSB0b3AgbGV2ZWwgYmxvY2sgc3Vycm91bmRpbmcgdGhlCi0gICAgIGZ1bmN0aW9uLCBidXQgc3RhYnMgaW5mb3JtYXRpb24gZG9lcyBub3Qgb3V0cHV0IHRoYXQgYmxvY2ssIHNvIHdlCi0gICAgIGlnbm9yZSBpdC4gICovCi0KLSAgaWYgKGluZm8tPm5lc3RpbmcgPT0gMSkKLSAgICB7Ci0gICAgICBpbmZvLT5mbmFkZHIgPSBhZGRyOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gb3V0cHV0IHRoZSBMQlJBQyBzeW1ib2wgYWZ0ZXIgYW55IHZhcmlhYmxlcyB3aGljaCBhcmUKLSAgICAgZGVjbGFyZWQgaW5zaWRlIHRoZSBibG9jay4gIFdlIHBvc3Rwb25lIHRoZSBMQlJBQyB1bnRpbCB0aGUgbmV4dAotICAgICBzdGFydF9ibG9jayBvciBlbmRfYmxvY2suICAqLwotCi0gIC8qIElmIHdlIGhhdmUgcG9zdHBvbmVkIGFuIExCUkFDLCBvdXRwdXQgaXQgbm93LiAgKi8KLSAgaWYgKGluZm8tPnBlbmRpbmdfbGJyYWMgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xCUkFDLCAwLCBpbmZvLT5wZW5kaW5nX2xicmFjLAotCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUmVtZW1iZXIgdGhlIGFkZHJlc3MgYW5kIG91dHB1dCBpdCBsYXRlci4gICovCi0KLSAgaW5mby0+cGVuZGluZ19sYnJhYyA9IGFkZHIgLSBpbmZvLT5mbmFkZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW5kX2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgaWYgKGFkZHIgPiBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcykKLSAgICBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcyA9IGFkZHI7Ci0KLSAgLyogSWYgd2UgaGF2ZSBwb3N0cG9uZWQgYW4gTEJSQUMsIG91dHB1dCBpdCBub3cuICAqLwotICBpZiAoaW5mby0+cGVuZGluZ19sYnJhYyAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTEJSQUMsIDAsIGluZm8tPnBlbmRpbmdfbGJyYWMsCi0JCQkgICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+cGVuZGluZ19sYnJhYyA9IChiZmRfdm1hKSAtMTsKLSAgICB9Ci0KLSAgYXNzZXJ0IChpbmZvLT5uZXN0aW5nID4gMCk7Ci0KLSAgLS1pbmZvLT5uZXN0aW5nOwotCi0gIC8qIFdlIGlnbm9yZSB0aGUgb3V0ZXJtb3N0IGJsb2NrLiAgKi8KLSAgaWYgKGluZm8tPm5lc3RpbmcgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fUkJSQUMsIDAsIGFkZHIgLSBpbmZvLT5mbmFkZHIsCi0JCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci19Ci0KLS8qIEVuZCBhIGZ1bmN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbmRfZnVuY3Rpb24gKHApCi0gICAgIFBUUiBwIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSBsaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2xpbmVubyAocCwgZmlsZSwgbGluZW5vLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyBsaW5lbm87Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+bGluZW5vX2ZpbGVuYW1lICE9IE5VTEwpOwotCi0gIGlmIChhZGRyID4gaW5mby0+bGFzdF90ZXh0X2FkZHJlc3MpCi0gICAgaW5mby0+bGFzdF90ZXh0X2FkZHJlc3MgPSBhZGRyOwotCi0gIGlmIChzdHJjbXAgKGZpbGUsIGluZm8tPmxpbmVub19maWxlbmFtZSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9TT0wsIDAsIGFkZHIsIGZpbGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPmxpbmVub19maWxlbmFtZSA9IGZpbGU7Ci0gICAgfQotCi0gIHJldHVybiBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9TTElORSwgbGluZW5vLCBhZGRyIC0gaW5mby0+Zm5hZGRyLAotCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotfQpkaWZmIC0tZ2l0IGEvY29uZmlnLW1sLmluIGIvY29uZmlnLW1sLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNmN2NmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy1tbC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY4NyArMCwwIEBACi0jIENvbmZpZ3VyZSBmcmFnbWVudCBpbnZva2VkIGluIHRoZSBwb3N0LXRhcmdldCBzZWN0aW9uIGZvciBzdWJkaXJzCi0jIHdhbnRpbmcgbXVsdGlsaWIgc3VwcG9ydC4KLSMKLSMgSXQgaXMgYWR2aXNhYmxlIHRvIHN1cHBvcnQgYSBmZXcgLS1lbmFibGUvLS1kaXNhYmxlIG9wdGlvbnMgdG8gbGV0IHRoZQotIyB1c2VyIHNlbGVjdCB3aGljaCBsaWJyYXJpZXMgcy9oZSByZWFsbHkgd2FudHMuCi0jCi0jIFN1YmRpcmVjdG9yaWVzIHdpc2hpbmcgdG8gdXNlIG11bHRpbGliIHNob3VsZCBwdXQgdGhlIGZvbGxvd2luZyBsaW5lcwotIyBpbiB0aGUgInBvc3QtdGFyZ2V0IiBzZWN0aW9uIG9mIGNvbmZpZ3VyZS5pbi4KLSMKLSMgaWYgWyAiJHtzcmNkaXJ9IiA9ICIuIiBdIDsgdGhlbgotIyAgIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iIF0gOyB0aGVuCi0jICAgICAuICR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLi9jb25maWctbWwuaW4KLSMgICBlbHNlCi0jICAgICAuICR7d2l0aF9tdWx0aXNyY3RvcH0uLi9jb25maWctbWwuaW4KLSMgICBmaQotIyBlbHNlCi0jICAgLiAke3NyY2Rpcn0vLi4vY29uZmlnLW1sLmluCi0jIGZpCi0jCi0jIFNlZSBsaWJyeC9jb25maWd1cmUuaW4gaW4gdGhlIGxpYmcrKyBkaXN0cmlidXRpb24gZm9yIGFuIGV4YW1wbGUgb2YgaG93Ci0jIHRvIGhhbmRsZSBhdXRvY29uZidkIGxpYnJhcmllcy4KLSMKLSMgVGhpbmdzIGFyZSBjb21wbGljYXRlZCBiZWNhdXNlIDYgc2VwYXJhdGUgY2FzZXMgbXVzdCBiZSBoYW5kbGVkOgotIyAyIChuYXRpdmUsIGNyb3NzKSB4IDMgKGFic29sdXRlLXBhdGgsIHJlbGF0aXZlLW5vdC1kb3QsIGRvdCkgPSA2LgotIwotIyBzcmNkaXI9LiBpcyBzcGVjaWFsLiAgSXQgbXVzdCBoYW5kbGUgbWFrZSBwcm9ncmFtcyB0aGF0IGRvbid0IGhhbmRsZSBWUEFUSC4KLSMgVG8gaW1wbGVtZW50IHRoaXMsIGEgc3ltbGluayB0cmVlIGlzIGJ1aWx0IGZvciBlYWNoIGxpYnJhcnkgYW5kIGZvciBlYWNoCi0jIG11bHRpbGliIHN1YmRpci4KLSMKLSMgVGhlIGJ1aWxkIHRyZWUgaXMgbGF5ZWQgb3V0IGFzCi0jCi0jIC4vCi0jICAgbGliZysrCi0jICAgbmV3bGliCi0jICAgbTY4MDIwLwotIyAgICAgICAgICBsaWJnKysKLSMgICAgICAgICAgbmV3bGliCi0jICAgICAgICAgIG02ODg4MS8KLSMgICAgICAgICAgICAgICAgIGxpYmcrKwotIyAgICAgICAgICAgICAgICAgbmV3bGliCi0jCi0jIFRoZSBuaWNlIGZlYXR1cmUgYWJvdXQgdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IGludGVyLWxpYnJhcnkgcmVmZXJlbmNlcwotIyBpbiB0aGUgYnVpbGQgdHJlZSB3b3JrIHdpdGhvdXQgaGF2aW5nIHRvIGNhcmUgd2hlcmUgeW91IGFyZS4gIE5vdGUgdGhhdAotIyBpbnRlci1saWJyYXJ5IHJlZmVyZW5jZXMgYWxzbyB3b3JrIGluIHRoZSBzb3VyY2UgdHJlZSBiZWNhdXNlIHN5bWxpbmsgdHJlZXMKLSMgYXJlIGJ1aWx0IHdoZW4gc3JjZGlyPS4KLSMKLSMgVW5mb3J0dW5hdGVseSwgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgbGlicmFyaWVzIGluIHRoZSBidWlsZCB0cmVlIHJlcXVpcmVzCi0jIHRoZSB1c2VyIHRvIG1hbnVhbGx5IGNob29zZSB3aGljaCBsaWJyYXJ5IHRvIHVzZSBhcyBHQ0Mgd29uJ3QgYmUgYWJsZSB0bwotIyBmaW5kIHRoZSByaWdodCBvbmUuICBUaGlzIGlzIHZpZXdlZCBhcyB0aGUgbGVzc2VyIG9mIHR3byBldmlscy4KLSMKLSMgQ29uZmlndXJlIHZhcmlhYmxlczoKLSMgJHt3aXRoX3RhcmdldF9zdWJkaXJ9ID0gIi4iIGZvciBuYXRpdmUsIG9yICR7dGFyZ2V0X2FsaWFzfSBmb3IgY3Jvc3MuCi0jIFNldCBieSB0b3AgbGV2ZWwgTWFrZWZpbGUuCi0jICR7d2l0aF9tdWx0aXNyY3RvcH0gPSBob3cgbWFueSBsZXZlbHMgb2YgbXVsdGlsaWJzIHRoZXJlIGFyZSBpbiB0aGUgc291cmNlCi0jIHRyZWUuICBJdCBleGlzdHMgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIGNvbmZpZ3VyaW5nIGluIHRoZSBzb3VyY2UgdHJlZToKLSMgJHtzcmNkaXJ9IGlzIG5vdCBjb25zdGFudC4KLSMgJHt3aXRoX211bHRpc3ViZGlyfSA9IG5hbWUgb2YgbXVsdGlsaWIgc3ViZGlyZWN0b3J5IChlZzogbTY4MDIwL202ODg4MSkuCi0jCi0jIE1ha2VmaWxlIHZhcmlhYmxlczoKLSMgTVVMVElTUkNUT1AgPSBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIHNvdXJjZSB0cmVlICgrMSBpZiBjcm9zcykKLSMgKEZJWE1FOiBub3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdGhhbiAke3dpdGhfbXVsdGlzcmN0b3B9LiAgQ2hlY2sgb3V0LikuCi0jIE1VTFRJQlVJTERUT1AgPSBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIGJ1aWxkIHRyZWUKLSMgTVVMVElESVJTID0gbGlzdCBvZiBtdWx0aWxpYiBzdWJkaXJzIChlZzogbTY4MDAwIG02ODAyMCAuLi4pCi0jIChvbmx5IGRlZmluZWQgaW4gZWFjaCBsaWJyYXJ5J3MgbWFpbiBNYWtlZmlsZSkuCi0jIE1VTFRJU1VCRElSID0gaW5zdGFsbGVkIHN1YmRpcmVjdG9yeSBuYW1lIHdpdGggbGVhZGluZyAnLycgKGVnOiAvbTY4MDAwKQotIyAob25seSBkZWZpbmVkIGluIGVhY2ggbXVsdGlsaWIgc3ViZGlyKS4KLQotIyBGSVhNRTogTXVsdGlsaWIgaXMgY3VycmVudGx5IGRpc2FibGVkIGJ5IGRlZmF1bHQgZm9yIGV2ZXJ5dGhpbmcgb3RoZXIgdGhhbgotIyBuZXdsaWIuICBJdCBpcyB1cCB0byBlYWNoIHRhcmdldCB0byB0dXJuIG9uIG11bHRpbGliIHN1cHBvcnQgZm9yIHRoZSBvdGhlcgotIyBsaWJyYXJpZXMgYXMgZGVzaXJlZC4KLQotIyBXZSBoYXZlIHRvIGhhbmRsZSBiZWluZyBpbnZva2VkIGJ5IGJvdGggQ3lnbnVzIGNvbmZpZ3VyZSBhbmQgQXV0b2NvbmYuCi0jCi0jIEN5Z251cyBjb25maWd1cmUgaW5jb21pbmcgdmFyaWFibGVzOgotIyBzcmNkaXIsIHN1YmRpciwgaG9zdCwgYXJndW1lbnRzCi0jCi0jIEF1dG9jb25mIGluY29taW5nIHZhcmlhYmxlczoKLSMgc3JjZGlyLCBob3N0LCBhY19jb25maWd1cmVfYXJncwotIwotIyBXZSAqY291bGQqIGZpZ3VyZSBzcmNkaXIgYW5kIGhvc3Qgb3V0LCBidXQgd2UnZCBoYXZlIHRvIGRvIHdvcmsgdGhhdAotIyBvdXIgY2FsbGVyIGhhcyBhbHJlYWR5IGRvbmUgdG8gZmlndXJlIHRoZW0gb3V0IGFuZCByZXF1aXJpbmcgdGhlc2UgdHdvCi0jIHNlZW1zIHJlYXNvbmFibGUuCi0jIE5vdGUgdGhhdCBgaG9zdCcgaW4gdGhpcyBjYXNlIGlzIEdDQydzIGB0YXJnZXQnLiAgVGFyZ2V0IGxpYnJhcmllcyBhcmUKLSMgY29uZmlndXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGhvc3QuCi0KLWlmIFsgLW4gIiR7YWNfY29uZmlndXJlX2FyZ3N9IiBdOyB0aGVuCi0gIE1ha2VmaWxlPSR7YWNfZmlsZS1NYWtlZmlsZX0KLSAgbWxfY29uZmlnX3NoZWxsPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0gIG1sX2FyZ3VtZW50cz0iJHthY19jb25maWd1cmVfYXJnc30iCi0gIG1sX3JlYWxzcmNkaXI9JHtzcmNkaXJ9Ci1lbHNlCi0gIE1ha2VmaWxlPSR7TWFrZWZpbGUtTWFrZWZpbGV9Ci0gIG1sX2NvbmZpZ19zaGVsbD0ke2NvbmZpZ19zaGVsbC0vYmluL3NofQotICBtbF9hcmd1bWVudHM9IiR7YXJndW1lbnRzfSIKLSAgaWYgWyAtbiAiJHtzdWJkaXJ9IiAtYSAiJHtzdWJkaXJ9IiAhPSAiLiIgXSA7IHRoZW4KLSAgICBtbF9yZWFsc3JjZGlyPSR7c3JjZGlyfS8ke3N1YmRpcn0KLSAgZWxzZQotICAgIG1sX3JlYWxzcmNkaXI9JHtzcmNkaXJ9Ci0gIGZpCi1maQotCi0jIFNjYW4gYWxsIHRoZSBhcmd1bWVudHMgYW5kIHNldCBhbGwgdGhlIG9uZXMgd2UgbmVlZC4KLQotbWxfdmVyYm9zZT0tLXZlcmJvc2UKLWZvciBvcHRpb24gaW4gJHttbF9hcmd1bWVudHN9Ci1kbwotICBjYXNlICRvcHRpb24gaW4KLSAgLS0qKSA7OwotICAtKikgb3B0aW9uPS0kb3B0aW9uIDs7Ci0gIGVzYWMKLQotICBjYXNlICRvcHRpb24gaW4KLSAgLS0qPSopCi0Jb3B0YXJnPWBlY2hvICRvcHRpb24gfCBzZWQgLWUgJ3MvXltePV0qPS8vJ2AKLQk7OwotICBlc2FjCi0KLSAgY2FzZSAkb3B0aW9uIGluCi0gIC0tZGlzYWJsZS0qKQotCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tZGlzYWJsZS06ZW5hYmxlXzo7czotOl86ZydgCi0JZXZhbCAkZW5hYmxlb3B0PW5vCi0JOzsKLSAgLS1lbmFibGUtKikKLQljYXNlICIkb3B0aW9uIiBpbgotCSo9KikJOzsKLQkqKQlvcHRhcmc9eWVzIDs7Ci0JZXNhYwotCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JZXZhbCAkZW5hYmxlb3B0PSIkb3B0YXJnIgotCTs7Ci0gIC0tbm9yZWN1cnNpb24gfCAtLW5vKikKLQltbF9ub3JlY3Vyc2lvbj15ZXMKLQk7OwotICAtLXNpbGVudCB8IC0tc2lsKiB8IC0tcXVpZXQgfCAtLXEqKQotCW1sX3ZlcmJvc2U9LS1zaWxlbnQKLQk7OwotICAtLXZlcmJvc2UgfCAtLXYgfCAtLXZlcmIqKQotCW1sX3ZlcmJvc2U9LS12ZXJib3NlCi0JOzsKLSAgLS13aXRoLSopCi0JY2FzZSAiJG9wdGlvbiIgaW4KLQkqPSopCTs7Ci0JKikJb3B0YXJnPXllcyA7OwotCWVzYWMKLQl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOj0uKiQ6OjtzOi06XzpnJ2AKLQlldmFsICR3aXRob3B0PSIkb3B0YXJnIgotCTs7Ci0gIC0td2l0aG91dC0qKQotCXdpdGhvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6b3V0Ojo7czotOl86ZydgCi0JZXZhbCAkd2l0aG9wdD1ubwotCTs7Ci0gIGVzYWMKLWRvbmUKLQotIyBPbmx5IGRvIHRoaXMgaWYgLS1lbmFibGUtbXVsdGlsaWIuCi1pZiBbICIke2VuYWJsZV9tdWx0aWxpYn0iID0geWVzIF07IHRoZW4KLQotIyBDb21wdXRlIHdoZXRoZXIgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHRvcCBsZXZlbCBkaXJlY3RvcnkKLSMgKGllOiBub3QgYSBtdWx0aWxpYiBzdWJkaXJlY3RvcnksIGFuZCBub3QgYSBzdWJkaXJlY3RvcnkgbGlrZSBsaWJnKysvc3JjKS4KLSMgJHt3aXRoX211bHRpc3ViZGlyfSB0ZWxscyB1cyB3ZSdyZSBpbiB0aGUgcmlnaHQgYnJhbmNoLCBidXQgd2UgY291bGQgYmUKLSMgaW4gYSBzdWJkaXIgb2YgdGhhdC4KLSMgPz8/IFRoZSBwcmV2aW91cyB2ZXJzaW9uIGNvdWxkIHZvaWQgdGhpcyB0ZXN0IGJ5IHNlcGFyYXRpbmcgdGhlIHByb2Nlc3MgaW50bwotIyB0d28gZmlsZXM6IG9uZSB0aGF0IG9ubHkgdGhlIGxpYnJhcnkncyB0b3BsZXZlbCBjb25maWd1cmUuaW4gcmFuICh0bwotIyBjb25maWd1cmUgdGhlIG11bHRpbGliIHN1YmRpcnMpLCBhbmQgYW5vdGhlciB0aGF0IGFsbCBjb25maWd1cmUuaW4ncyByYW4gdG8KLSMgdXBkYXRlIHRoZSBNYWtlZmlsZS4gIEl0IHNlZW1lZCByZWFzb25hYmxlIHRvIGNvbGxhcHNlIGFsbCBtdWx0aWxpYiBzdXBwb3J0Ci0jIGludG8gb25lIGZpbGUsIGJ1dCBpdCBkb2VzIGxlYXZlIHVzIHdpdGggaGF2aW5nIHRvIHBlcmZvcm0gdGhpcyB0ZXN0LgotbWxfdG9wbGV2ZWxfcD1ubwotaWYgWyAteiAiJHt3aXRoX211bHRpc3ViZGlyfSIgXTsgdGhlbgotICBpZiBbICIke3NyY2Rpcn0iID0gIi4iIF07IHRoZW4KLSAgICAjIFVzZSAke21sX3JlYWxzcmNkaXJ9IGluc3RlYWQgb2YgJHtzcmNkaXJ9IGhlcmUgdG8gYWNjb3VudCBmb3IgJHtzdWJkaXJ9LgotICAgICMgJHt3aXRoX3RhcmdldF9zdWJkaXJ9ID0gIi4iIGZvciBuYXRpdmUsIG90aGVyd2lzZSB0YXJnZXQgYWxpYXMuCi0gICAgaWYgWyAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gICAgICBpZiBbIC1mICR7bWxfcmVhbHNyY2Rpcn0vLi4vY29uZmlnLW1sLmluIF07IHRoZW4KLQltbF90b3BsZXZlbF9wPXllcwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBpZiBbIC1mICR7bWxfcmVhbHNyY2Rpcn0vLi4vLi4vY29uZmlnLW1sLmluIF07IHRoZW4KLQltbF90b3BsZXZlbF9wPXllcwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgIyBVc2UgJHttbF9yZWFsc3JjZGlyfSBpbnN0ZWFkIG9mICR7c3JjZGlyfSBoZXJlIHRvIGFjY291bnQgZm9yICR7c3ViZGlyfS4KLSAgICBpZiBbIC1mICR7bWxfcmVhbHNyY2Rpcn0vLi4vY29uZmlnLW1sLmluIF07IHRoZW4KLSAgICAgIG1sX3RvcGxldmVsX3A9eWVzCi0gICAgZmkKLSAgZmkKLWZpCi0KLSMgSWYgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHRvcCBsZXZlbCBkaXJlY3RvcnksIHNldCBtdWx0aWRpcnMgdG8gdGhlCi0jIG11bHRpbGliIHN1YmRpcnMgdG8gc3VwcG9ydC4gIFRoaXMgbGl2ZXMgYXQgdGhlIHRvcCBiZWNhdXNlIHdlIG5lZWQKLSMgYG11bHRpZGlycycgc2V0IHJpZ2h0IGF3YXkuCi0KLWlmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KLQotbXVsdGlkaXJzPQotZm9yIGkgaW4gYCR7Q0MtZ2NjfSAtLXByaW50LW11bHRpLWxpYiAyPi9kZXYvbnVsbGA7IGRvCi0gIGRpcj1gZWNobyAkaSB8IHNlZCAtZSAncy87LiokLy8nYAotICBpZiBbICIke2Rpcn0iID0gIi4iIF07IHRoZW4KLSAgICB0cnVlCi0gIGVsc2UKLSAgICBpZiBbIC16ICIke211bHRpZGlyc30iIF07IHRoZW4KLSAgICAgIG11bHRpZGlycz0iJHtkaXJ9IgotICAgIGVsc2UKLSAgICAgIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7ZGlyfSIKLSAgICBmaQotICBmaQotZG9uZQotCi0jIFRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbmZpZ3VyZWQgZm9yIHRoZSBob3N0IHRoZXkgcnVuIG9uLCBzbyB3ZSBjaGVjawotIyAkaG9zdCBoZXJlLCBub3QgJHRhcmdldC4KLQotY2FzZSAiJHtob3N0fSIgaW4KLWFyYy0qLWVsZiopCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiAhPSB4eWVzIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICpiZSopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotYXJtLSotKikKLQlpZiBbIHgiJGVuYWJsZV9mcHUiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICpmcHUqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4IiRlbmFibGVfMjZiaXQiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICoyNmJpdCopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgiJGVuYWJsZV91bmRlcnNjb3JlIiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqdW5kZXIqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4IiRlbmFibGVfaW50ZXJ3b3JrIiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqaW50ZXJ3b3JrKikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKmxlKiApIDogOzsKLQkgICAgICAqYmUqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1tNjgqLSotKikKLQlpZiBbIHgkZW5hYmxlX3NvZnRmbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc29mdC1mbG9hdCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9tNjg4ODEgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm02ODg4MSogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9tNjgwMDAgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm02ODAwMCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9tNjgwMjAgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm02ODAyMCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLW1pcHMqLSotKikKLQlpZiBbIHgkZW5hYmxlX3NpbmdsZV9mbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc2luZ2xlKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICplbCogKSA6IDs7Ci0JICAgICAgKmViKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3NvZnRmbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc29mdC1mbG9hdCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLXBvd2VycGMqLSotKiB8IHJzNjAwMCotKi0qKQotCWlmIFsgeCRlbmFibGVfc29mdGZsb2F0ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpzb2Z0LWZsb2F0KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3Bvd2VyY3B1ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgIHBvd2VyIHwgKi9wb3dlciB8ICovcG93ZXIvKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3Bvd2VycGNjcHUgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnBvd2VycGMqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfcG93ZXJwY29zID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptY2FsbC1saW51eCogfCAqbWNhbGwtc29sYXJpcyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWxpdHRsZSogfCAqbWJpZyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9zeXN2ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptY2FsbC1zeXN2KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2FpeCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWNhbGwtYWl4KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotZXNhYwotCi0jIFJlbW92ZSBleHRyYW5lb3VzIGJsYW5rcyBmcm9tIG11bHRpZGlycy4KLSMgVGVzdHMgbGlrZSBgaWYgWyAtbiAiJG11bHRpZGlycyIgXScgcmVxdWlyZSBpdC4KLW11bHRpZGlycz1gZWNobyAiJG11bHRpZGlycyIgfCBzZWQgLWUgJ3MvXlsgXVsgXSovLycgLWUgJ3MvWyBdWyBdKiQvLycgLWUgJ3MvWyBdWyBdKi8gL2cnYAotCi0jIEFkZCBjb2RlIHRvIGxpYnJhcnkncyB0b3AgbGV2ZWwgbWFrZWZpbGUgdG8gaGFuZGxlIGJ1aWxkaW5nIHRoZSBtdWx0aWxpYgotIyBzdWJkaXJzLgotCi1jYXQgPiBNdWx0aS50ZW0gPDxcRU9GCi0KLSMgRklYTUU6IFRoZXJlIHNob3VsZCBiZSBhbiBALXNpZ24gaW4gZnJvbnQgb2YgdGhlIGBpZicuCi0jIExlYXZlIG91dCB1bnRpbCB0aGlzIGlzIHRlc3RlZCBhIGJpdCBtb3JlLgotbXVsdGktZG86Ci0JaWYgWyAteiAiJChNVUxUSURJUlMpIiBdOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbHNlIFwKLQkgIHJvb3RwcmU9YHB3ZGAvOyBleHBvcnQgcm9vdHByZTsgXAotCSAgc3Jjcm9vdHByZT1gY2QgJChzcmNkaXIpOyBwd2RgLzsgZXhwb3J0IHNyY3Jvb3RwcmU7IFwKLQkgIGxpYj1gZWNobyAkJHtyb290cHJlfSB8IHNlZCAtZSAncyxeLiovXChbXi9dW14vXSpcKS8kJCxcMSwnYDsgXAotCSAgY29tcGlsZXI9IiQoQ0MpIjsgXAotCSAgZm9yIGkgaW4gYCQke2NvbXBpbGVyfSAtLXByaW50LW11bHRpLWxpYiAyPi9kZXYvbnVsbGA7IGRvIFwKLQkgICAgZGlyPWBlY2hvICQkaSB8IHNlZCAtZSAncy87LiokJC8vJ2A7IFwKLQkgICAgaWYgWyAiJCR7ZGlyfSIgPSAiLiIgXTsgdGhlbiBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBlbHNlIFwKLQkgICAgICBpZiBbIC1kIC4uLyQke2Rpcn0vJCR7bGlifSBdOyB0aGVuIFwKLQkJZmxhZ3M9YGVjaG8gJCRpIHwgc2VkIC1lICdzL15bXjtdKjsvLycgLWUgJ3MvQC8gLS9nJ2A7IFwKLQkJaWYgKGNkIC4uLyQke2Rpcn0vJCR7bGlifTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIFwKLQkJCQlDRkxBR1M9IiQoQ0ZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQlDWFhGTEFHUz0iJChDWFhGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJTElCQ0ZMQUdTPSIkKExJQkNGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJTElCQ1hYRkxBR1M9IiQoTElCQ1hYRkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCUxERkxBR1M9IiQoTERGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJJChETykpOyB0aGVuIFwKLQkJICB0cnVlOyBcCi0JCWVsc2UgXAotCQkgIGV4aXQgMTsgXAotCQlmaTsgXAotCSAgICAgIGVsc2UgdHJ1ZTsgXAotCSAgICAgIGZpOyBcCi0JICAgIGZpOyBcCi0JICBkb25lOyBcCi0JZmkKLQotIyBGSVhNRTogVGhlcmUgc2hvdWxkIGJlIGFuIEAtc2lnbiBpbiBmcm9udCBvZiB0aGUgYGlmJy4KLSMgTGVhdmUgb3V0IHVudGlsIHRoaXMgaXMgdGVzdGVkIGEgYml0IG1vcmUuCi1tdWx0aS1jbGVhbjoKLQlpZiBbIC16ICIkKE1VTFRJRElSUykiIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsc2UgXAotCSAgbGliPWBwd2QgfCBzZWQgLWUgJ3MsXi4qL1woW14vXVteL10qXCkkJCxcMSwnYDsgXAotCSAgZm9yIGRpciBpbiBNYWtlZmlsZSAkKE1VTFRJRElSUyk7IGRvIFwKLQkgICAgaWYgWyAtZiAuLi8kJHtkaXJ9LyQke2xpYn0vTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgICAgaWYgKGNkIC4uLyQke2Rpcn0vJCR7bGlifTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoRE8pKTsgXAotCSAgICAgIHRoZW4gdHJ1ZTsgXAotCSAgICAgIGVsc2UgZXhpdCAxOyBcCi0JICAgICAgZmk7IFwKLQkgICAgZWxzZSB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBkb25lOyBcCi0JZmkKLUVPRgotCi1jYXQgJHtNYWtlZmlsZX0gTXVsdGkudGVtID4gTWFrZWZpbGUudGVtCi1ybSAtZiAke01ha2VmaWxlfSBNdWx0aS50ZW0KLW12IE1ha2VmaWxlLnRlbSAke01ha2VmaWxlfQotCi1maSAjICR7bWxfdG9wbGV2ZWxfcH0gPSB5ZXMKLQotaWYgWyAiJHttbF92ZXJib3NlfSIgPSAtLXZlcmJvc2UgXTsgdGhlbgotICBlY2hvICJBZGRpbmcgbXVsdGlsaWIgc3VwcG9ydCB0byBNYWtlZmlsZSBpbiAke21sX3JlYWxzcmNkaXJ9IgotICBpZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0gICAgZWNobyAibXVsdGlkaXJzPSR7bXVsdGlkaXJzfSIKLSAgZmkKLSAgZWNobyAid2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9IgotZmkKLQotaWYgWyAiJHtzcmNkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iIF07IHRoZW4KLSAgICBtbF9zcmNkb3Rkb3Q9Ii4uLyIKLSAgZWxzZQotICAgIG1sX3NyY2RvdGRvdD0iIgotICBmaQotZWxzZQotICBtbF9zcmNkb3Rkb3Q9IiIKLWZpCi0KLWlmIFsgLXogIiR7d2l0aF9tdWx0aXN1YmRpcn0iIF07IHRoZW4KLSAgbWxfc3ViZGlyPQotICBtbF9idWlsZGRvdGRvdD0KLSAgOiAjIG1sX3NyY2RvdGRvdD0gIyBhbHJlYWR5IHNldAotZWxzZQotICBtbF9zdWJkaXI9Ii8ke3dpdGhfbXVsdGlzdWJkaXJ9IgotICAjIFRoZSAnW14vXVteL10qJyBhcHBlYXJzIHRoYXQgd2F5IHRvIHdvcmsgYXJvdW5kIGEgU3VuT1Mgc2VkIGJ1Zy4KLSAgbWxfYnVpbGRkb3Rkb3Q9YGVjaG8gJHt3aXRoX211bHRpc3ViZGlyfSB8IHNlZCAtZSAnczpbXi9dW14vXSo6Li46ZydgLwotICBpZiBbICIkc3JjZGlyIiA9ICIuIiBdOyB0aGVuCi0gICAgbWxfc3JjZG90ZG90PSR7bWxfc3JjZG90ZG90fSR7bWxfYnVpbGRkb3Rkb3R9Ci0gIGVsc2UKLSAgICA6ICMgbWxfc3JjZG90ZG90PSAjIGFscmVhZHkgc2V0Ci0gIGZpCi1maQotCi1pZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0gIG1sX2RvPSckKE1BS0UpJwotICBtbF9jbGVhbj0nJChNQUtFKScKLWVsc2UKLSAgbWxfZG89dHJ1ZQotICBtbF9jbGVhbj10cnVlCi1maQotCi0jIFRPUCBpcyB1c2VkIGJ5IG5ld2xpYiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGVsc2V3aGVyZSBmb3IgdGhpcyBwdXJwb3NlLgotIyBNVUxUSXtTUkMsQlVJTER9VE9QIGFyZSB0aGUgcHJvcGVyIG9uZXMgdG8gdXNlLiAgTVVMVElTUkNUT1AgaXMgZW1wdHkKLSMgd2hlbiBzcmNkaXIgIT0gYnVpbGRkaXIuICBNVUxUSUJVSUxEVE9QIGlzIGFsd2F5cyBzb21lIG51bWJlciBvZiAuLi8ncy4KLSMgRklYTUU6IG5ld2xpYiBuZWVkcyB0byBiZSB1cGRhdGVkIHRvIHVzZSBNVUxUSXtTUkMsQlVJTER9VE9QIHNvIHdlIGNhbgotIyBkZWxldGUgVE9QLiAgTmV3bGliIG1heSB3aXNoIHRvIGNvbnRpbnVlIHRvIHVzZSBUT1AgZm9yIGl0cyBvd24gcHVycG9zZXMKLSMgb2YgY291cnNlLgotIyBNVUxUSURJUlMgaXMgbm9uLWVtcHR5IGZvciB0aGUgY3B1IHRvcCBsZXZlbCBNYWtlZmlsZSAoZWc6IG5ld2xpYi9NYWtlZmlsZSkKLSMgYW5kIGxpc3RzIHRoZSBzdWJkaXJlY3RvcmllcyB0byByZWN1cnNlIGludG8uCi0jIE1VTFRJU1VCRElSIGlzIG5vbi1lbXB0eSBpbiBlYWNoIGNwdSBzdWJkaXJlY3RvcnkncyBNYWtlZmlsZQotIyAoZWc6IG5ld2xpYi9oODMwMGgvTWFrZWZpbGUpIGFuZCBpcyB0aGUgaW5zdGFsbGVkIHN1YmRpcmVjdG9yeSBuYW1lIHdpdGgKLSMgYSBsZWFkaW5nICcvJy4KLSMgTVVMVElETyBpcyB1c2VkIGZvciB0YXJnZXRzIGxpa2UgYWxsLCBpbnN0YWxsLCBhbmQgY2hlY2sgd2hlcmUKLSMgJChGTEFHU19UT19QQVNTKSBhdWdtZW50ZWQgd2l0aCB0aGUgc3ViZGlyJ3MgY29tcGlsZXIgb3B0aW9uIGlzIG5lZWRlZC4KLSMgTVVMVElDTEVBTiBpcyB1c2VkIGZvciB0aGUgKmNsZWFuIHRhcmdldHMuCi0jCi0jID8/PyBJdCBpcyBwb3NzaWJsZSB0byBtZXJnZSBNVUxUSURPIGFuZCBNVUxUSUNMRUFOIGludG8gb25lLiAgVGhleSBhcmUKLSMgY3VycmVudGx5IGtlcHQgc2VwYXJhdGUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSAqY2xlYW4gdGFyZ2V0cyB0byByZXF1aXJlCi0jIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGNvbXBpbGVyICh3aGljaCBNVUxUSURPIGN1cnJlbnRseSByZXF1aXJlcykgYW5kCi0jIHRoZXJlZm9yZSB3ZSdkIGhhdmUgdG8gcmVjb3JkIHRoZSBkaXJlY3Rvcnkgb3B0aW9ucyBhcyB3ZWxsIGFzIG5hbWVzCi0jIChjdXJyZW50bHkgd2UganVzdCByZWNvcmQgdGhlIG5hbWVzIGFuZCB1c2UgLS1wcmludC1tdWx0aS1saWIgdG8gZ2V0IHRoZQotIyBvcHRpb25zKS4KLQotc2VkIC1lICJzOl5UT1BbIAldKj1bIAldKlwoWy4vXSpcKVsgCV0qJDpUT1AgPSAke21sX2J1aWxkZG90ZG90fVwxOiIgXAotICAgIC1lICJzOl5NVUxUSVNSQ1RPUFsgCV0qPS4qJDpNVUxUSVNSQ1RPUCA9ICR7bWxfc3JjZG90ZG90fToiIFwKLSAgICAtZSAiczpeTVVMVElCVUlMRFRPUFsgCV0qPS4qJDpNVUxUSUJVSUxEVE9QID0gJHttbF9idWlsZGRvdGRvdH06IiBcCi0gICAgLWUgInM6Xk1VTFRJRElSU1sgCV0qPS4qJDpNVUxUSURJUlMgPSAke211bHRpZGlyc306IiBcCi0gICAgLWUgInM6Xk1VTFRJU1VCRElSWyAJXSo9LiokOk1VTFRJU1VCRElSID0gJHttbF9zdWJkaXJ9OiIgXAotICAgIC1lICJzOl5NVUxUSURPWyAJXSo9LiokOk1VTFRJRE8gPSAkbWxfZG86IiBcCi0gICAgLWUgInM6Xk1VTFRJQ0xFQU5bIAldKj0uKiQ6TVVMVElDTEVBTiA9ICRtbF9jbGVhbjoiIFwKLQkke01ha2VmaWxlfSA+IE1ha2VmaWxlLnRlbQotcm0gLWYgJHtNYWtlZmlsZX0KLW12IE1ha2VmaWxlLnRlbSAke01ha2VmaWxlfQotCi0jIElmIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB0b3AgbGV2ZWwsIGNvbmZpZ3VyZSBlYWNoIG11bHRpbGliIHN1YmRpci4KLSMgVGhpcyBpcyBkb25lIGF0IHRoZSBlbmQgYmVjYXVzZSB0aGlzIGlzIHRoZSBsb29wIHRoYXQgcnVucyBjb25maWd1cmUKLSMgaW4gZWFjaCBtdWx0aWxpYiBzdWJkaXIgYW5kIGl0IHNlZW1lZCByZWFzb25hYmxlIHRvIGZpbmlzaCB1cGRhdGluZyB0aGUKLSMgTWFrZWZpbGUgYmVmb3JlIGdvaW5nIG9uIHRvIGNvbmZpZ3VyZSB0aGUgc3ViZGlycy4KLQotaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgotCi0jIFdlIG11c3QgZnJlc2hseSBjb25maWd1cmUgZWFjaCBzdWJkaXJlY3RvcnkuICBUaGlzIGJpdCBvZiBjb2RlIGlzCi0jIGFjdHVhbGx5IHBhcnRpYWxseSBzdG9sZW4gZnJvbSB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0LiAgRklYTUUuCi0KLWlmIFsgLW4gIiR7bXVsdGlkaXJzfSIgXSAmJiBbIC16ICIke21sX25vcmVjdXJzaW9ufSIgXTsgdGhlbgotCi0gIGlmIFsgIiR7bWxfdmVyYm9zZX0iID0gLS12ZXJib3NlIF07IHRoZW4KLSAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZSBpbiBtdWx0aWxpYiBzdWJkaXJzICR7bXVsdGlkaXJzfSIKLSAgICBlY2hvICJwd2Q6IGBwd2RgIgotICBmaQotCi0gIG1sX29yaWdkaXI9YHB3ZGAKLSAgbWxfbGliZGlyPWBlY2hvICRtbF9vcmlnZGlyIHwgc2VkIC1lICdzLF4uKi8sLCdgCi0gICMgY2QgdG8gdG9wLWxldmVsLWJ1aWxkLWRpci8ke3dpdGhfdGFyZ2V0X3N1YmRpcn0KLSAgY2QgLi4KLQotICBmb3IgbWxfZGlyIGluICR7bXVsdGlkaXJzfTsgZG8KLQotICAgIGlmIFsgIiR7bWxfdmVyYm9zZX0iID0gLS12ZXJib3NlIF07IHRoZW4KLSAgICAgIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlIGluIG11bHRpbGliIHN1YmRpciAke21sX2Rpcn0iCi0gICAgICBlY2hvICJwd2Q6IGBwd2RgIgotICAgIGZpCi0KLSAgICBpZiBbIC1kICR7bWxfZGlyfSBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgJHttbF9kaXJ9OyBmaQotICAgIGlmIFsgLWQgJHttbF9kaXJ9LyR7bWxfbGliZGlyfSBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgZmkKLQotICAgICMgRWc6IGlmICR7bWxfZGlyfSA9IG02ODAwMC9tNjg4ODEsIGRvdGRvdCA9IC4uLy4uLwotICAgIGRvdGRvdD0uLi9gZWNobyAke21sX2Rpcn0gfCBzZWQgLWUgJ3N8W14vXXx8ZycgLWUgJ3N8L3wuLi98ZydgCi0KLSAgICBjYXNlICR7c3JjZGlyfSBpbgotICAgICIuIikKLSAgICAgIGVjaG8gQnVpbGRpbmcgc3ltbGluayB0cmVlIGluIGBwd2RgLyR7bWxfZGlyfS8ke21sX2xpYmRpcn0KLSAgICAgIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iIF07IHRoZW4KLQltbF91bnN1YmRpcj0iLi4vIgotICAgICAgZWxzZQotCW1sX3Vuc3ViZGlyPSIiCi0gICAgICBmaQotICAgICAgKGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn07Ci0gICAgICAgLi4vJHtkb3Rkb3R9JHttbF91bnN1YmRpcn1zeW1saW5rLXRyZWUgLi4vJHtkb3Rkb3R9JHttbF91bnN1YmRpcn0ke21sX2xpYmRpcn0gIiIpCi0gICAgICBpZiBbIC1mICR7bWxfZGlyfS8ke21sX2xpYmRpcn0vTWFrZWZpbGUgXTsgdGhlbgotCWlmIFsgeCIke01BS0V9IiA9IHggXTsgdGhlbgotCSAgKGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn07IG1ha2UgZGlzdGNsZWFuKQotCWVsc2UKLQkgIChjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyAke01BS0V9IGRpc3RjbGVhbikKLQlmaQotICAgICAgZmkKLSAgICAgIG1sX25ld3NyY2Rpcj0iLiIKLSAgICAgIG1sX3NyY2Rpcm9wdGlvbj0KLSAgICAgIG11bHRpc3JjdG9wPSR7ZG90ZG90fQotICAgICAgOzsKLSAgICAqKQotICAgICAgY2FzZSAiJHtzcmNkaXJ9IiBpbgotICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICBtbF9uZXdzcmNkaXI9JHtzcmNkaXJ9Ci0gICAgICAgIDs7Ci0gICAgICAqKSAjIG90aGVyd2lzZSByZWxhdGl2ZQotICAgICAgICBtbF9uZXdzcmNkaXI9JHtkb3Rkb3R9JHtzcmNkaXJ9Ci0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBtbF9zcmNkaXJvcHRpb249Ii1zcmNkaXI9JHttbF9uZXdzcmNkaXJ9IgotICAgICAgbXVsdGlzcmN0b3A9Ci0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgIiR7cHJvZ25hbWV9IiBpbgotICAgIC8qKSAgICAgbWxfcmVjcHJvZz0ke3Byb2duYW1lfSA7OwotICAgICopICAgICAgbWxfcmVjcHJvZz0ke2RvdGRvdH0ke3Byb2duYW1lfSA7OwotICAgIGVzYWMKLQotICAgICMgRklYTUU6IFBPUERJUj0ke1BXRD1gcHdkYH0gZG9lc24ndCB3b3JrIGhlcmUuCi0gICAgTUxfUE9QRElSPWBwd2RgCi0gICAgY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfQotCi0gICAgaWYgWyAtZiAke21sX25ld3NyY2Rpcn0vY29uZmlndXJlIF07IHRoZW4KLSAgICAgIG1sX3JlY3Byb2c9JHttbF9uZXdzcmNkaXJ9L2NvbmZpZ3VyZQotICAgIGZpCi0gICAgaWYgZXZhbCAke21sX2NvbmZpZ19zaGVsbH0gJHttbF9yZWNwcm9nfSBcCi0JLS13aXRoLW11bHRpc3ViZGlyPSR7bWxfZGlyfSAtLXdpdGgtbXVsdGlzcmN0b3A9JHttdWx0aXNyY3RvcH0gXAotCSR7bWxfYXJndW1lbnRzfSAke21sX3NyY2Rpcm9wdGlvbn0gOyB0aGVuCi0gICAgICB0cnVlCi0gICAgZWxzZQotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGNkICR7TUxfUE9QRElSfQotCi0gIGRvbmUKLQotICBjZCAke21sX29yaWdkaXJ9Ci1maQotCi1maSAjICR7bWxfdG9wbGV2ZWxfcH0gPSB5ZXMKLWZpICMgJHtlbmFibGVfbXVsdGlsaWJ9ID0geWVzCmRpZmYgLS1naXQgYS9jb25maWcuZ3Vlc3MgYi9jb25maWcuZ3Vlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwYzk3MWEuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmd1ZXNzCisrKyAvZGV2L251bGwKQEAgLTEsMTE3MSArMCwwIEBACi0jISAvYmluL3NoCi0jIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwCi0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBXcml0dGVuIGJ5IFBlciBCb3RobmVyIDxib3RobmVyQGN5Z251cy5jb20+LgotIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IHN5c3RlbSB0eXBlIChob3N0L3RhcmdldCBuYW1lKS4KLSMKLSMgT25seSBhIGZldyBzeXN0ZW1zIGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIGxpc3Q7IHBsZWFzZSBhZGQgb3RoZXJzCi0jIChidXQgdHJ5IHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBjbGVhbikuCi0jCi0KLSMgVXNlICRIT1NUX0NDIGlmIGRlZmluZWQuICRDQyBtYXkgcG9pbnQgdG8gYSBjcm9zcy1jb21waWxlcgotaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geDsgdGhlbgotICBpZiB0ZXN0IHgiJEhPU1RfQ0MiICE9IHg7IHRoZW4KLSAgICBDQ19GT1JfQlVJTEQ9IiRIT1NUX0NDIgotICBlbHNlCi0gICAgaWYgdGVzdCB4IiRDQyIgIT0geDsgdGhlbgotICAgICAgQ0NfRk9SX0JVSUxEPSIkQ0MiCi0gICAgZWxzZQotICAgICAgQ0NfRk9SX0JVSUxEPWNjCi0gICAgZmkKLSAgZmkKLWZpCi0KLQotIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KLSMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSA4LzI0Lzk0LikKLWlmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICi1maQotCi1VTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KLVVOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgotVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9TWVNURU09dW5rbm93bgotVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCi0KLWR1bW15PWR1bW15LSQkCi10cmFwICdybSAtZiAkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXk7IGV4aXQgMScgMSAyIDE1Ci0KLSMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KLQotY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgotICAgICo6TmV0QlNEOio6KikKLQkjIE5ldGJzZCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgotCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKLQkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQotCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKLQkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKLQkjIG9iamVjdCBmaWxlIGZvcm1hdC4KLQkjIERldGVybWluZSB0aGUgbWFjaGluZS92ZW5kb3IgKGlzIHRoZSB2ZW5kb3IgcmVsZXZhbnQpLgotCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICAgIGFtaWdhKSBtYWNoaW5lPW02OGstY2JtIDs7Ci0JICAgIGFybTMyKSBtYWNoaW5lPWFybS11bmtub3duIDs7Ci0JICAgIGF0YXJpKikgbWFjaGluZT1tNjhrLWF0YXJpIDs7Ci0JICAgIHN1bjMqKSBtYWNoaW5lPW02OGstc3VuIDs7Ci0JICAgIG1hYzY4aykgbWFjaGluZT1tNjhrLWFwcGxlIDs7Ci0JICAgIG1hY3BwYykgbWFjaGluZT1wb3dlcnBjLWFwcGxlIDs7Ci0JICAgIGhwM1swLTldWzA1XSkgbWFjaGluZT1tNjhrLWhwIDs7Ci0JICAgIGlibXJ0fHJvbXAtaWJtKSBtYWNoaW5lPXJvbXAtaWJtIDs7Ci0JICAgICopIG1hY2hpbmU9JHtVTkFNRV9NQUNISU5FfS11bmtub3duIDs7Ci0JZXNhYwotCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQuCi0JaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKLQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAotCXRoZW4KLQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgotCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KLQkgICAgb3M9bmV0YnNkCi0JZWxzZQotCSAgICBvcz1uZXRic2RlbGYKLQlmaQotCSMgVGhlIE9TIHJlbGVhc2UKLQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgotCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgotCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KLQllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKLQlleGl0IDAgOzsKLSAgICBhbHBoYTpPU0YxOio6KikKLQlpZiB0ZXN0ICRVTkFNRV9SRUxFQVNFID0gIlY0LjAiOyB0aGVuCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JZmkKLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWNhdCA8PEVPRiA+JGR1bW15LnMKLQkuZGF0YQotXCRMZm9ybWF0OgotCS5ieXRlIDM3LDEwMCw0NSwzNywxMjAsMTAsMAkjICIlZC0leFxuIgotCi0JLnRleHQKLQkuZ2xvYmwgbWFpbgotCS5hbGlnbiA0Ci0JLmVudCBtYWluCi1tYWluOgotCS5mcmFtZSBcJDMwLDE2LFwkMjYsMAotCWxkZ3AgXCQyOSwwKFwkMjcpCi0JLnByb2xvZ3VlIDEKLQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciBcJDAKLQlsZGEgXCQyLC0xCi0JLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrIFwkMixcJDEKLQlsZGEgXCQxNixcJExmb3JtYXQKLQltb3YgXCQwLFwkMTcKLQlub3QgXCQxLFwkMTgKLQlqc3IgXCQyNixwcmludGYKLQlsZGdwIFwkMjksMChcJDI2KQotCW1vdiAwLFwkMTYKLQlqc3IgXCQyNixleGl0Ci0JLmVuZCBtYWluCi1FT0YKLQkkQ0NfRk9SX0JVSUxEICRkdW1teS5zIC1vICRkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCWNhc2UgYC4vJGR1bW15YCBpbgotCQkJMC0wKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxLTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTEtMSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCi0JCQkJOzsKLQkJCTEtMTAxKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCi0JCQkJOzsKLQkJCTItMzAzKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgotCQkJCTs7Ci0JCQkyLTMwNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciCi0JCQkJOzsKLQkJZXNhYwotCWZpCi0Jcm0gLWYgJGR1bW15LnMgJGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDAgOzsKLSAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKLQkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KLQllY2hvIGFscGhhLXBjLWludGVyaXgKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstY2JtLXN5c3Y0Ci0JZXhpdCAwOzsKLSAgICBhbWlnYTpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcwotCWV4aXQgMCA7OwotICAgIGFyYzY0Ok9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwczY0ZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaGttaXBzOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG1heDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc2dpOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgd2dyaXNjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOk9TLzM5MDoqOiopCi0JZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgotCWV4aXQgMCA7OwotICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKLQllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KikKLQllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCi0JZXhpdCAwOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKLQkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgotCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKLQllbHNlCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgTklMRSo6KjoqOmRjb3N4KQotCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKLQlleGl0IDAgOzsKLSAgICBzdW40SDpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KikKLQllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo2KjoqKQotCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCi0JIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKLQkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW4zKjpTdW5PUzoqOiopCi0JZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4qOio6NC4yQlNEOiopCi0JVU5BTUVfUkVMRUFTRT1gKGhlYWQgLTEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCi0JdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MwotCWNhc2UgImAvYmluL2FyY2hgIiBpbgotCSAgICBzdW4zKQotCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCSAgICBzdW40KQotCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQllc2FjCi0JZXhpdCAwIDs7Ci0gICAgYXVzaHA6U3VuT1M6KjoqKQotCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCi0gICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90Ci0gICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvciAKLSAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCi0gICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKLSAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAotICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAotICAgICMgYmUgbm8gcHJvYmxlbS4KLSAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICAqZmFsY29uKjoqTWlOVDoqOiogfCAqZmFsY29uKjoqbWludDoqOiogfCAqZmFsY29uKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgIHN1bjMqOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLwotCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0jZWxzZQotCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7Ci0jZW5kaWYKLQkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2VuZGlmCi0JICBleGl0ICgtMSk7Ci0JfQotRU9GCi0JJENDX0ZPUl9CVUlMRCAkZHVtbXkuYyAtbyAkZHVtbXkgXAotCSAgJiYgLi8kZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAotCSAgJiYgcm0gJGR1bW15LmMgJGR1bW15ICYmIGV4aXQgMAotCXJtIC1mICRkdW1teS5jICRkdW1teQotCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azpDWC9VWDo3KjoqKQotCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKLQlleGl0IDAgOzsKLSAgICBtODhrOio6NCo6UjQqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAotCWV4aXQgMCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgQVZpaU9OOmRndXg6KjoqKQotICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAotCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwXQotCXRoZW4KLQkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCi0JICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCi0JICAgIHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGVsc2UKLQkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9Ci0JICAgIGZpCi0JZWxzZQotCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLQlmaQotIAlleGl0IDAgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgTTg4KjoqOlIzKjoqKQotCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKLQllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgMCA7OwotICAgICo6SVJJWCo6KjoqKQotCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKLQlleGl0IDAgOzsKLSAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpPzg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKLSAgICAqOkFJWDoyOjMpCi0JaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYwotCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgotCi0JCW1haW4oKQotCQkJewotCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCi0JCQkJZXhpdCgxKTsKLQkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7Ci0JCQlleGl0KDApOwotCQkJfQotRU9GCi0JCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15ICYmIC4vJGR1bW15ICYmIHJtICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQkJcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6Kjo0KQotCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgaGVhZCAtMSB8IGF3ayAneyBwcmludCAkMSB9J2AKLQlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FSGwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgUE9XRVIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUlCTV9BUkNIPXJzNjAwMAotCWVsc2UKLQkJSUJNX0FSQ0g9cG93ZXJwYwotCWZpCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPTQuJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgMCA7OwotICAgICo6QUlYOio6KikKLQllY2hvIHJzNjAwMC1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCi0JZWNobyByb21wLWlibS1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAotCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KLQlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMwotICAgICo6Qk9TWDoqOiopCi0JZWNobyByczYwMDAtYnVsbC1ib3N4Ci0JZXhpdCAwIDs7Ci0gICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKLQllY2hvIG02OGstYnVsbC1zeXN2MwotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKLQllY2hvIG02OGstaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKLQllY2hvIG02OGstaHAtYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQotCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OwotCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7Ci0JICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQotICAgICAgICAgICAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgotICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSAgICAgICAgICAgICAgaW50IG1haW4gKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCi0gICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7Ci0gICAgICAgICAgICAgICNlbmRpZgotICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQotICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCi0gICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKLSAgICAgICAgICAgICAgCQl7Ci0gICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOwotICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQl9IGJyZWFrOwotICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLwotICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7Ci0gICAgICAgICAgICAgIH0KLUVPRgotCShDQ09QVFM9ICRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsICkgJiYgSFBfQVJDSD1gLi8kZHVtbXlgCi0Jcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZXNhYwotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50Ci0JbWFpbiAoKQotCXsKLQkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCi0JICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAotCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCi0JICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGNwdSkKLQkJewotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCi0JICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGV4aXQgKDApOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15ICYmIC4vJGR1bW15ICYmIHJtICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICAqOT8/KjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaT84NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIGhwcGEqOk9wZW5CU0Q6KjoqKQotCWVjaG8gaHBwYS11bmtub3duLW9wZW5ic2QKLQlleGl0IDAgOzsKLSAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQotCWVjaG8gYzEtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQ1JBWSpYLU1QOio6KjoqKQotCWVjaG8geG1wLWNyYXktdW5pY29zCi0gICAgICAgIGV4aXQgMCA7OwotICAgIENSQVkqWS1NUDoqOio6KikKLQllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8KLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0U6KjoqOiopCi0JZWNobyBhbHBoYS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycgICAgCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWS0yOio6KjoqKQotCWVjaG8gY3JheTItY3JheS11bmljb3MKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgRjMwMDpVTklYX1N5c3RlbV9WOio6KikKLSAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAotICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICJmMzAwLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgRjMwMTpVTklYX1N5c3RlbV9WOio6KikKLSAgICAgICBlY2hvIGYzMDEtZnVqaXRzdS11eHB2YGVjaG8gJFVOQU1FX1JFTEVBU0UgfCBzZWQgJ3MvIC4qLy8nYAotICAgICAgIGV4aXQgMCA7OwotICAgIGhwMzAwOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpCU0QvMzg2Oio6KiB8IGk/ODY6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzcGFyYyo6QlNEL09TOio6KikKLQllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkJTRC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCi0JICAgIGlmIHRlc3QgImVsZiIgPSAiYC91c3IvYmluL29iamZvcm1hdGAiOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RlbGZgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovLydgCi0JCWV4aXQgMAotCSAgICBmaQotCWZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOk9wZW5CU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9wZW5ic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICBpKjpDWUdXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIGkqOk1JTkdXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCi0JZXhpdCAwIDs7Ci0gICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCi0JIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPwotCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCi0JIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PwotCWVjaG8gaTM4Ni1wYy1pbnRlcml4Ci0JZXhpdCAwIDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgMCA7OwotICAgIHAqOkNZR1dJTio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgotCWV4aXQgMCA7OwotICAgIHByZXAqOlN1bk9TOjUuKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOkdOVToqOiopCi0JZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCi0JZXhpdCAwIDs7Ci0gICAgKjpMaW51eDoqOiopCi0KLQkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKLQkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCi0JbGRfaGVscF9zdHJpbmc9YGNkIC87IGxkIC0taGVscCAyPiYxYAotCWxkX3N1cHBvcnRlZF9lbXVsYXRpb25zPWBlY2hvICRsZF9oZWxwX3N0cmluZyBcCi0JCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIGVtdWxhdGlvbnM6LyFkCi0JCQkJICAgIHMvWyAJXVsgCV0qLyAvZwotCQkJCSAgICBzLy4qc3VwcG9ydGVkIGVtdWxhdGlvbnM6ICovLwotCQkJCSAgICBzLyAuKi8vCi0JCQkJICAgIHAnYAotICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnMiIGluCi0JICAqaWE2NCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4IgotCQlleGl0IDAKLQkJOzsKLQkgIGk/ODZsaW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgotCQlleGl0IDAKLQkJOzsKLQkgIGk/ODZjb2ZmKQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCi0JCWV4aXQgMAotCQk7OwotCSAgc3BhcmNsaW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiCi0JCWV4aXQgMAotCQk7OwotCSAgYXJtbGludXgpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IgotCQlleGl0IDAKLQkJOzsKLQkgIGVsZjMyYXJtKikKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudW9sZGxkIgotCQlleGl0IDAKLQkJOzsKLQkgIGFybWVsZl9saW51eCopCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUiCi0JCWV4aXQgMAotCQk7OwotCSAgbTY4a2xpbnV4KQotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIKLQkJZXhpdCAwCi0JCTs7Ci0JICBlbGYzMnBwYyB8IGVsZjMycHBjbGludXgpCi0JCSMgRGV0ZXJtaW5lIExpYiBWZXJzaW9uCi0JCWNhdCA+JGR1bW15LmMgPDxFT0YKLSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotI2lmIGRlZmluZWQoX19HTElCQ19fKQotZXh0ZXJuIGNoYXIgX19saWJjX3ZlcnNpb25bXTsKLWV4dGVybiBjaGFyIF9fbGliY19yZWxlYXNlW107Ci0jZW5kaWYKLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSNpZiBkZWZpbmVkKF9fR0xJQkNfXykKLSAgcHJpbnRmKCIlcyAlc1xuIiwgX19saWJjX3ZlcnNpb24sIF9fbGliY19yZWxlYXNlKTsKLSNlbHNlCi0gIHByaW50ZigidW5rb3duXG4iKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLUVPRgotCQlMSUJDPSIiCi0JCSRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsCi0JCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkuLyRkdW1teSB8IGdyZXAgMVwuOTkgPiAvZGV2L251bGwKLQkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkJTElCQz0ibGliYzEiCi0JCQlmaQotCQlmaQkKLQkJcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudSR7TElCQ30KLQkJZXhpdCAwCi0JCTs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAiYWxwaGEiIDsgdGhlbgotCQljYXQgPDxFT0YgPiRkdW1teS5zCi0JCQkuZGF0YQotCQlcJExmb3JtYXQ6Ci0JCQkuYnl0ZSAzNywxMDAsNDUsMzcsMTIwLDEwLDAJIyAiJWQtJXhcbiIKLQotCQkJLnRleHQKLQkJCS5nbG9ibCBtYWluCi0JCQkuYWxpZ24gNAotCQkJLmVudCBtYWluCi0JCW1haW46Ci0JCQkuZnJhbWUgXCQzMCwxNixcJDI2LDAKLQkJCWxkZ3AgXCQyOSwwKFwkMjcpCi0JCQkucHJvbG9ndWUgMQotCQkJLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgXCQwCi0JCQlsZGEgXCQyLC0xCi0JCQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgXCQyLFwkMQotCQkJbGRhIFwkMTYsXCRMZm9ybWF0Ci0JCQltb3YgXCQwLFwkMTcKLQkJCW5vdCBcJDEsXCQxOAotCQkJanNyIFwkMjYscHJpbnRmCi0JCQlsZGdwIFwkMjksMChcJDI2KQotCQkJbW92IDAsXCQxNgotCQkJanNyIFwkMjYsZXhpdAotCQkJLmVuZCBtYWluCi1FT0YKLQkJTElCQz0iIgotCQkkQ0NfRk9SX0JVSUxEICRkdW1teS5zIC1vICRkdW1teSAyPi9kZXYvbnVsbAotCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJY2FzZSBgLi8kZHVtbXlgIGluCi0JCQkwLTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCi0JCQkJOzsKLQkJCTEtMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKLQkJCQk7OwotCQkJMS0xKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKLQkJCQk7OwotCQkJMS0xMDEpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKLQkJCQk7OwotCQkJMi0zMDMpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCi0JCQkJOzsKLQkJCTItMzA3KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIKLQkJCQk7OwotCQkJZXNhYwotCi0JCQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzICRkdW1teSB8IFwKLQkJCSAgZ3JlcCBsZC5zby4xID4gL2Rldi9udWxsCi0JCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJCUxJQkM9ImxpYmMxIgotCQkJZmkKLQkJZmkKLQkJcm0gLWYgJGR1bW15LnMgJGR1bW15Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30gOyBleGl0IDAKLQllbGlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gIm1pcHMiIDsgdGhlbgotCSAgY2F0ID4kZHVtbXkuYyA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0jaWZkZWYgX19NSVBTRUJfXwotICBwcmludGYgKCIlcy11bmtub3duLWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSNpZmRlZiBfX01JUFNFTF9fCi0gIHByaW50ZiAoIiVzZWwtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JICAkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gJGR1bW15LmMgJGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZWxpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJzMzkwIjsgdGhlbgotCSAgZWNobyBzMzkwLWlibS1saW51eCAmJiBleGl0IDAKLQllbHNlCi0JICAjIEVpdGhlciBhIHByZS1CRkQgYS5vdXQgbGlua2VyIChsaW51eC1nbnVvbGRsZCkKLQkgICMgb3Igb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgotCSAgIyBHQ0Mgd2FudHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBsaW51eC1nbnVvbGRsZCBhbmQgbGludXgtZ251YW91dC4KLQkgICMgSWYgbGQgZG9lcyBub3QgcHJvdmlkZSAqYW55KiAic3VwcG9ydGVkIGVtdWxhdGlvbnM6IgotCSAgIyB0aGF0IG1lYW5zIGl0IGlzIGdudW9sZGxkLgotCSAgZWNobyAiJGxkX2hlbHBfc3RyaW5nIiB8IGdyZXAgPi9kZXYvbnVsbCAyPiYxICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCi0JICB0ZXN0ICQ/ICE9IDAgJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIgJiYgZXhpdCAwCi0KLQkgIGNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICBpPzg2KQotCSAgICBWRU5ET1I9cGM7Ci0JICAgIDs7Ci0JICAqKQotCSAgICBWRU5ET1I9dW5rbm93bjsKLQkgICAgOzsKLQkgIGVzYWMKLQkgICMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCi0JICBjYXQgPiRkdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCi0JaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSNlbHNlCi0JaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKLSNlbmRpZgotI2lmZGVmIF9fRUxGX18KLSMgaWZkZWYgX19HTElCQ19fCi0jICBpZiBfX0dMSUJDX18gPj0gMgotICAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotIyAgZWxzZQotICAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7Ci0jICBlbmRpZgotIyBlbHNlCi0gICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251bGliYzFcbiIsIGFyZ3ZbMV0pOwotIyBlbmRpZgotI2Vsc2UKLSAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWFvdXRcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JICAkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gJGR1bW15LmMgJGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgJGR1bW15LmMgJGR1bW15Ci0JZmkgOzsKLSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuICBlYXJsaWVyIHZlcnNpb25zCi0jIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aCBzeXNuYW1lIGFuZCBub2RlbmFtZS4KLSAgICBpPzg2OkRZTklYL3B0eDo0KjoqKQotCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpVTklYX1NWOjQuMk1QOjIuKikKLSAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgotICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCi0gICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKLQkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCi0gICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjoqOjQuKjoqIHwgaT84NjpTWVNURU1fVjo0Lio6KikKLQlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKLQlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9Ci0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgaT84NjoqOjU6NyopCi0gICAgICAgICMgRml4ZWQgYXQgKGFueSkgUGVudGl1bSBvciBiZXR0ZXIKLSAgICAgICAgVU5BTUVfTUFDSElORT1pNTg2Ci0gICAgICAgIGlmIFsgJHtVTkFNRV9TWVNURU19ID0gIlVuaXhXYXJlIiBdIDsgdGhlbgotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tc2NvLXN5c3Yke1VOQU1FX1JFTEVBU0V9dXcke1VOQU1FX1ZFUlNJT059Ci0JZWxzZQotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWV4aXQgMCA7OwotICAgIGk/ODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnQgP0lJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBpPzg2OipET1M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCi0JZXhpdCAwIDs7Ci0gICAgcGM6KjoqOiopCi0JIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6Ci0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgMCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDAgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjApCi0JT1NfUkVMPScnCi0JdGVzdCAtciAvZXRjLy5yZWxpZCBcCi0JJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKLSAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKLSAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0gICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKLSAgICBtNjgqOkx5bnhPUzoyLio6KikKLQllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIGk/ODY6THlueE9TOjIuKjoqIHwgaT84NjpMeW54T1M6My5bMDFdKjoqKQotCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKLQllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHJzNjAwMDpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzoyLio6KikKLQllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOkNQdW5peDo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+Ci0gICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCi0JIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgotCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjoqOio6RlRYKikKLQkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KLQllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzoqOjYqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKLSAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDAgOzsKLSAgICBTWC00OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgUG93ZXIqOk1hYypPUzoqOiopCi0JZWNobyBwb3dlcnBjLWFwcGxlLW1hY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6TWFjKk9TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtbWFjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpRTlg6Kjo0KikKLQllY2hvIGkzODYtcW54LXFueCR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDAgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWNhdCA+JGR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgaWYgKHZlcnNpb24gPCA0KQotICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSNpZiAhZGVmaW5lZCAodWx0cml4KQotICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0kQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAmJiBybSAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCi1ybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgZXNhYwotZmkKLQotI2VjaG8gJyhVbmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUpJyAxPiYyCi0KLWV4aXQgMQpkaWZmIC0tZ2l0IGEvY29uZmlnLmlmIGIvY29uZmlnLmlmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MwMjY5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5pZgorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMhIC9kZXYvbnVsbAotIyBEb24ndCBjYWxsIGl0IGRpcmVjdGx5LiBUaGlzIHNoZWxsIHNjcmlwdCBmcmFnbWVudCBpcyBjYWxsZWQgdG8KLSMgZGV0ZXJtaW5lOgotIwotIwkxLiBsaWJzdGN4eF9pbnRlcmZhY2U6IHRoZSBpbnRlcmZhY2UgbmFtZSBmb3IgbGlic3RkYysrLgotIwkyLiBjeHhfaW50ZXJmYWNlOiB0aGUgaW50ZXJmYWNlIG5hbWUgZm9yIGMrKy4KLSMJMy4gbGliY19pbnRlcmZhY2U6IHRoZSBpbnRlcmZhY2UgbmFtZSBmb3IgbGliYy4KLSMKLQotIyBHZXQgdGhlIHRvcCBsZXZlbCBzcmMgZGlyLgotaWYgWyAteiAiJHt0b3BzcmNkaXJ9IiAtYSAteiAiJHt0b3Bfc3JjZGlyfSIgXQotdGhlbgotICBlY2hvICJVbmRlZmluZWQgdG9wIGxldmVsIHNyYyBkaXI6IHRvcHNyY2RpciBhbmQgdG9wX3NyY2RpciBhcmUgZW1wdHkiID4mMgotICBleGl0IDEKLWZpCi0KLWlmIFsgLW4gIiR7dG9wc3JjZGlyfSIgXQotdGhlbgotICBpZl90b3BzcmNkaXI9JHt0b3BzcmNkaXJ9Ci1lbHNlCi0gIGlmX3RvcHNyY2Rpcj0ke3RvcF9zcmNkaXJ9Ci1maQotCi1pZiBbIC1mICR7aWZfdG9wc3JjZGlyfS9saWJzdGRjKysvTWFrZWZpbGUuaW4gXTsgdGhlbgotIyBXZSBjaGVjayBsaWJzdGRjKysgZm9yIGxpYnN0ZGN4eF9pbnRlcmZhY2UuCi1saWJzdGRjeHhfaW50ZXJmYWNlPWBncmVwICJeSU5URVJGQUNFIiAke2lmX3RvcHNyY2Rpcn0vbGlic3RkYysrL01ha2VmaWxlLmluIHwgc2VkICdzL0lOVEVSRkFDRVsgCV0qPVsgCV0qXCguKlwpL1wxLydgCi1lbHNlCi1saWJzdGRjeHhfaW50ZXJmYWNlPQotZmkKLQotaWYgWyAtZiAke2lmX3RvcHNyY2Rpcn0vZ2NjL2NwL01ha2VmaWxlLmluIF07IHRoZW4KLSMgV2UgY2hlY2sgZ2NjL2NwIGZvciBjeHhfaW50ZXJmYWNlLgotY3h4X2ludGVyZmFjZT1gZ3JlcCAiXklOVEVSRkFDRSIgJHtpZl90b3BzcmNkaXJ9L2djYy9jcC9NYWtlZmlsZS5pbiB8IHNlZCAncy9JTlRFUkZBQ0VbIAldKj1bIAldKlwoLipcKS9cMS8nYAotZWxzZQotY3h4X2ludGVyZmFjZT0KLWZpCi0KLSMgVGhlIHRyaWNraWVzdCBwYXJ0IGlzIGxpYmNfaW50ZXJmYWNlLgotaWYgWyAteiAiJHtsaWJjX2ludGVyZmFjZX0iIF0KLXRoZW4KLSAgY2FzZSAke3RhcmdldF9vc30gaW4KLSAgKmxpbnV4KmxpYmMxKnwqbGludXgqbGliYzUqKQotICAgIGNhc2UgJHt0YXJnZXRfYWxpYXN9IGluCi0gICAgKmFscGhhKnwqcG93ZXJwYyopCi0gICAgICBsaWJjX2ludGVyZmFjZT0tbGliYzUuOS0KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGxpYmNfaW50ZXJmYWNlPS1saWJjNS0KLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gICpsaW51eCpnbnUqKQotICAgICMgV2UgaGF2ZSB0byB3b3JrIGhhcmRlciB0byBmaWd1cmUgaXQgb3V0LgotICAgIGlmIFsgJHt0YXJnZXRfYWxpYXN9ID0gJHtidWlsZF9hbGlhc30gXQotICAgIHRoZW4KLSAgICAgIGR1bW15PWlmJCQKLSAgICAgIGNhdCA+JGR1bW15LmMgPDxFT0YKLSNpbmNsdWRlIDxmZWF0dXJlcy5oPiAgICAgICAgICAgICAgICAgICAgICAKLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7ICAgICAgICAgIAotICAgICBjaGFyICphcmd2W107Ci17Ci0gIHByaW50ZigiJWRcbiIsIF9fR0xJQkNfTUlOT1JfXyk7Ci0gIHJldHVybiAwOwotfQotRU9GCi0gICAgICAke0NDLWNjfSAkZHVtbXkuYyAtbyAkZHVtbXkgMj4vZGV2L251bGwKLSAgICAgIGlmIFsgIiQ/IiA9IDAgXQotICAgICAgdGhlbgotCWxpYmNfaW50ZXJmYWNlPS1saWJjNi5gLi8kZHVtbXlgLQotCXJtIC1mICRkdW1teS5jICRkdW1teQotICAgICAgZWxzZQotCSMgSXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLQllY2hvICJDYW5ub3QgZmluZCB0aGUgR05VIEMgbGlicmFyeSBtaW5vciB2ZXJzaW9uIG51bWJlci4iID4mMgotCXJtIC1mICRkdW1teS5jICRkdW1teQotCWV4aXQgMQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAjIENyb3NzIGNvbXBpbGluZy4gQXNzdW1lIGdsaWJjIDIuMS4KLSAgICAgIGxpYmNfaW50ZXJmYWNlPS1saWJjNi4xLQotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBsaWJjX2ludGVyZmFjZT0tCi0gICAgOzsKLSAgZXNhYwotZmkKZGlmZiAtLWdpdCBhL2NvbmZpZy5zdWIgYi9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDc1NjI0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LCB2ZXJzaW9uIDEuMS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgotIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCi0jIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPGJvdGhuZXJAY3lnbnVzLmNvbT4uCi0jIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LgotIwotIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KLSMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgotIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KLSMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KLQotIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKLSMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCi0jIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCi0jIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCi0jIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAotIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCi0jIGNvbmZpZ3VyYXRpb24uCi0KLSMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCi0jIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCi0jIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KLQotaWYgWyB4JDEgPSB4IF0KLXRoZW4KLQllY2hvIENvbmZpZ3VyYXRpb24gbmFtZSBtaXNzaW5nLiAxPiYyCi0JZWNobyAiVXNhZ2U6ICQwIENQVS1NRlItT1BTWVMiIDE+JjIKLQllY2hvICJvciAgICAgJDAgQUxJQVMiIDE+JjIKLQllY2hvIHdoZXJlIEFMSUFTIGlzIGEgcmVjb2duaXplZCBjb25maWd1cmF0aW9uIHR5cGUuIDE+JjIKLQlleGl0IDEKLWZpCi0KLSMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotY2FzZSAkMSBpbgotCSpsb2NhbCopCi0JCWVjaG8gJDEKLQkJZXhpdCAwCi0JCTs7Ci0JKikKLQk7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBsaW51eC1nbnUqKQotICAgIG9zPS0kbWF5YmVfb3MKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAotICAgIDs7Ci0gICopCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAotICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQotICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKLSAgICBlbHNlIG9zPTsgZmkKLSAgICA7OwotZXNhYwotCi0jIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KLSMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCi0jIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCi0jIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KLWNhc2UgJG9zIGluCi0JLXN1bipvcyopCi0JCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgotCQk7OwotCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCi0JLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCi0JLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKLQktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAotCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCi0JLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCi0JLWFwcGxlKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz0tdnh3b3JrcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLWhpdXgqKQotCQlvcz0taGl1eHdlMgotCQk7OwotCS1zY281KQotCQlvcz0tc2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28qKQotCQlvcz0tc2NvMy4ydjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS11ZGsqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWlzYykKLQkJb3M9LWlzYzIuMgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWNsaXgqKQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAotCQk7OwotCS1pc2MqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWx5bngqKQotCQlvcz0tbHlueG9zCi0JCTs7Ci0JLXB0eCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAotCQk7OwotCS13aW5kb3dzbnQqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCi0JCTs7Ci0JLXBzb3MqKQotCQlvcz0tcHNvcwotCQk7OwotCS1taW50IHwgLW1pbnRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotZXNhYwotCi0jIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgotCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCi0JdGFob2UgfCBpODYwIHwgaWE2NCB8IG0zMnIgfCBtNjhrIHwgbTY4MDAwIHwgbTg4ayB8IG5zMzJrIHwgYXJjIHwgYXJtIFwKLQkJfCBhcm1lW2xiXSB8IHB5cmFtaWQgfCBtbjEwMjAwIHwgbW4xMDMwMCB8IHRyb24gfCBhMjlrIFwKLQkJfCA1ODAgfCBpOTYwIHwgaDgzMDAgXAotCQl8IGhwcGEgfCBocHBhMS4wIHwgaHBwYTEuMSB8IGhwcGEyLjAgfCBocHBhMi4wdyB8IGhwcGEyLjBuIFwKLQkJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhcGNhNVs2N10gXAotCQl8IGFscGhhZXY2Wzc4XSBcCi0JCXwgd2UzMmsgfCBuczE2ayB8IGNsaXBwZXIgfCBpMzcwIHwgc2ggfCBwb3dlcnBjIHwgcG93ZXJwY2xlIFwKLQkJfCAxNzUwYSB8IGRzcDE2eHggfCBwZHAxMSB8IG1pcHMxNiB8IG1pcHM2NCB8IG1pcHNlbCB8IG1pcHM2NGVsIFwKLQkJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAotCQl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIHwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAotCQl8IG1pcHM2NHZyNTAwMCB8IG1pcHJzNjR2cjUwMDBlbCB8IG1jb3JlIFwKLQkJfCBzcGFyYyB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmM2NCB8IHNwYXJjdjkgfCB2ODUwIHwgYzR4IFwKLQkJfCB0aHVtYiB8IGQxMHYgfCBmcjMwIHwgYXZyKQotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJOzsKLQltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHo4ayB8IHY3MCB8IGg4NTAwIHwgdzY1IHwgcGogfCBwamwpCi0JCTs7Ci0KLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpWzM0NTY3XTg2KQotCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYwotCSAgOzsKLQkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgotCSotKi0qKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KLQkjIEZJWE1FOiBjbGVhbiB1cCB0aGUgZm9ybWF0dGluZyBoZXJlLgotCXZheC0qIHwgdGFob2UtKiB8IGlbMzQ1NjddODYtKiB8IGk4NjAtKiB8IGlhNjQtKiB8IG0zMnItKiB8IG02OGstKiB8IG02ODAwMC0qIFwKLQkgICAgICB8IG04OGstKiB8IHNwYXJjLSogfCBuczMyay0qIHwgZng4MC0qIHwgYXJjLSogfCBhcm0tKiB8IGNbMTIzXSogXAotCSAgICAgIHwgbWlwcy0qIHwgcHlyYW1pZC0qIHwgdHJvbi0qIHwgYTI5ay0qIHwgcm9tcC0qIHwgcnM2MDAwLSogXAotCSAgICAgIHwgcG93ZXItKiB8IG5vbmUtKiB8IDU4MC0qIHwgY3JheTItKiB8IGg4MzAwLSogfCBoODUwMC0qIHwgaTk2MC0qIFwKLQkgICAgICB8IHhtcC0qIHwgeW1wLSogXAotCSAgICAgIHwgaHBwYS0qIHwgaHBwYTEuMC0qIHwgaHBwYTEuMS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMHctKiB8IGhwcGEyLjBuLSogXAotCSAgICAgIHwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYXBjYTVbNjddLSogXAotCSAgICAgIHwgYWxwaGFldjZbNzhdLSogXAotCSAgICAgIHwgd2UzMmstKiB8IGN5ZHJhLSogfCBuczE2ay0qIHwgcG4tKiB8IG5wMS0qIHwgeHBzMTAwLSogXAotCSAgICAgIHwgY2xpcHBlci0qIHwgb3Jpb24tKiBcCi0JICAgICAgfCBzcGFyY2xpdGUtKiB8IHBkcDExLSogfCBzaC0qIHwgcG93ZXJwYy0qIHwgcG93ZXJwY2xlLSogXAotCSAgICAgIHwgc3BhcmM2NC0qIHwgc3BhcmN2OS0qIHwgc3BhcmM4NngtKiB8IG1pcHMxNi0qIHwgbWlwczY0LSogfCBtaXBzZWwtKiBcCi0JICAgICAgfCBtaXBzNjRlbC0qIHwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCi0JICAgICAgfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAotCSAgICAgIHwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiB8IG1jb3JlLSogXAotCSAgICAgIHwgZjMwMS0qIHwgYXJtdiotKiB8IHMzOTAtKiB8IHN2MS0qIHwgdDNlLSogXAotCSAgICAgIHwgbTg4MTEwLSogfCBtNjgwWzAxMjM0XTAtKiB8IG02ODM/Mi0qIHwgbTY4MzYwLSogfCB6OGstKiB8IGQxMHYtKiBcCi0JICAgICAgfCB0aHVtYi0qIHwgdjg1MC0qIHwgZDMwdi0qIHwgdGljMzAtKiB8IGMzMC0qIHwgZnIzMC0qICkKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCWFkb2JlNjhrKQotCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQotCQlvcz0tc2NvdXQKLQkJOzsKLQlhbGxpYW50IHwgZng4MCkKLQkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKLQkJOzsKLQlhbHRvcyB8IGFsdG9zMzA2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCi0JCTs7Ci0JYW0yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCi0JCW9zPS1ic2QKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQk7OwotCWFtaWdhb3MgfCBhbWlnYWRvcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljb252ZXgtYzEpCi0JCWJhc2ljX21hY2hpbmU9YzEtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzIpCi0JCWJhc2ljX21hY2hpbmU9YzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzMyKQotCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzQpCi0JCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzOCkKLQkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljcmF5IHwgeW1wKQotCQliYXNpY19tYWNoaW5lPXltcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljcmF5MikKLQkJYmFzaWNfbWFjaGluZT1jcmF5Mi1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQlbY3RqXTkwLWNyYXkpCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyZHMgfCB1bm9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY3JkcwotCQk7OwotCWRhMzAgfCBkYTMwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCi0JCTs7Ci0JZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQotCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCi0JCTs7Ci0JZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKLQkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCi0JCTs7Ci0JZGVsdGE4OCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCi0JCW9zPS1zeXN2MwotCQk7OwotCWRweDIwIHwgZHB4MjAtKikKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAotCQlvcz0tYm9zeAotCQk7OwotCWRweDIqIHwgZHB4MiotYnVsbCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZWJtb24yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LWVibW9uCi0JCTs7Ci0JZWx4c2kpCi0JCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKLQkJb3M9LWJzZAotCQk7OwotCWVuY29yZSB8IHVtYXggfCBtbWF4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQotCQk7OwotCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlmeDI4MDApCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50Ci0JCTs7Ci0JZ2VuaXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKLQkJOzsKLQlnbWljcm8pCi0JCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KLQkJb3M9LXN5c3YKLQkJOzsKLQloMzA1MHIqIHwgaGl1eCopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JaDgzMDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaDgzMDB4cmF5KQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LXhyYXkKLQkJOzsKLQloODUwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloYXJyaXMpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JaHAzMDAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHAzMDBic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0tYnNkCi0JCTs7Ci0JaHAzMDBocHV4KQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWhwdXgKLQkJOzsKLQlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKLQkJOzsKLQlocDlrM1syLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwcGEtbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCWhwcGFvc2YpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tb3NmCi0JCTs7Ci0JaHBwcm8pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JaTM3MC1pYm0qIHwgaWJtKikKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQk7OwotIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/Ci0JaVszNDU2N104NnYzMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2MzIKLQkJOzsKLQlpWzM0NTY3XTg2djQqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JaVszNDU2N104NnYpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdgotCQk7OwotCWlbMzQ1NjddODZzb2wyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JaTM4Nm1hY2gpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCi0JCW9zPS1tYWNoCi0JCTs7Ci0JaTM4Ni12c3RhIHwgdnN0YSkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LXZzdGEKLQkJOzsKLQlpMzg2LWdvMzIgfCBnbzMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tZ28zMgotCQk7OwotCWkzODYtbWluZ3czMiB8IG1pbmd3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1taW5ndzMyCi0JCTs7Ci0JaTM4Ni1xbnggfCBxbngpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1xbngKLQkJOzsKLQlpcmlzIHwgaXJpczRkKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCi0JCWNhc2UgJG9zIGluCi0JCSAgICAtaXJpeCopCi0JCQk7OwotCQkgICAgKikKLQkJCW9zPS1pcml4NAotCQkJOzsKLQkJZXNhYwotCQk7OwotCWlzaTY4IHwgaXNpKQotCQliYXNpY19tYWNoaW5lPW02OGstaXNpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotCW1pcHNlbCotbGludXgqKQotCQliYXNpY19tYWNoaW5lPW1pcHNlbC11bmtub3duCi0JCW9zPS1saW51eC1nbnUKLQkJOzsKLQltaXBzKi1saW51eCopCi0JCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCi0JCW9zPS1saW51eC1nbnUKLQkJOzsKLQltaXBzMyotKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKLQkJOzsKLQltaXBzMyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KLQkJOzsKLQltbWl4KikKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCW9zPS1tbWl4d2FyZQotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbXZzKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQlvcDUwbi0qIHwgb3A2MGMtKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JT1NFNjgwMDAgfCBvc2U2ODAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCW9zNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQotCQlvcz0tb3M2OGsKLQkJOzsKLQlwYS1oaXRhY2hpKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCXBhcmFnb24pCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAotCQlvcz0tb3NmCi0JCTs7Ci0JcGJkKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQotCQk7OwotCXBiYikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQotCQk7OwotICAgICAgICBwYzUzMiB8IHBjNTMyLSopCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKLQkJOzsKLQlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4ZW4pCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1wYwotCQk7OwotCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW1paSB8IHBlbnRpdW0yKQotCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhlbi0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSopCi0JCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBuKQotCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCi0JCTs7Ci0JcG93ZXIpCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQotCQk7OwotCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkgICAgICAgIDs7Ci0JcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCi0JICAgICAgICA7OwotCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCi0JCTs7Ci0Jcm9tNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0Jcm1bNDZdMDApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCi0JCTs7Ci0JcnRwYyB8IHJ0cGMtKikKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXNhMjkyMDApCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXNlcXVlbnQpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCTs7Ci0Jc2gpCi0JCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdW4yKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJOzsKLQlzdW4yb3MzKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjJvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuM29zMykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuM29zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNG9zMykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjRvczQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40c29sMikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0Jc3VuMyB8IHN1bjMtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQk7OwotCXN1bjQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0Jc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KLQkJOzsKLQlzdjEpCi0JCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9dDNlLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b3dlciB8IHRvd2VyLTMyKQotCQliYXNpY19tYWNoaW5lPW02OGstbmNyCi0JCTs7Ci0JdWRpMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQl1bHRyYTMpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKLQkJb3M9LXN5bTEKLQkJOzsKLQl2ODEwIHwgbmVjdjgxMCkKLQkJYmFzaWNfbWFjaGluZT12ODEwLW5lYwotCQlvcz0tbm9uZQotCQk7OwotCXZheHYpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tc3lzdgotCQk7OwotCXZtcykKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS12bXMKLQkJOzsKLQl2cHAqfHZ4fHZ4LSopCi0gICAgICAgICAgICAgICBiYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQotICAgICAgICAgICAgICAgOzsKLQl2eHdvcmtzOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczY4KQotCQliYXNpY19tYWNoaW5lPW02OGstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXc2NSopCi0JCWJhc2ljX21hY2hpbmU9dzY1LXdkYwotCQlvcz0tbm9uZQotCQk7OwotCXc4OWstKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJb3M9LXByb2VsZgotCQk7OwotCXhtcCkKLQkJYmFzaWNfbWFjaGluZT14bXAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0gICAgICAgIHhwcyB8IHhwczEwMCkKLQkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCi0JCTs7Ci0JejhrLSotY29mZikKLQkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgotCQlvcz0tc2ltCi0JCTs7Ci0Jbm9uZSkKLQkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKLQkJb3M9LW5vbmUKLQkJOzsKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgotIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgotCXc4OWspCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCTs7Ci0Jb3A1MG4pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlvcDYwYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW1pcHMpCi0JCWlmIFsgeCRvcyA9IHgtbGludXgtZ251IF07IHRoZW4KLQkJCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCi0JCWVsc2UKLQkJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCWZpCi0JCTs7Ci0Jcm9tcCkKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXJzNjAwMCkKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JdmF4KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJOzsKLQlwZHAxMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKLQkJOzsKLQl3ZTMyaykKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlzcGFyYyB8IHNwYXJjdjkpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0gICAgICAgIGN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCW1hYyB8IG1wdyB8IG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQk7OwotCXBtYWMgfCBwbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCi0JCTs7Ci0JYzR4KikKLQkJYmFzaWNfbWFjaGluZT1jNHgtbm9uZQotCQlvcz0tY29mZgotCQk7OwotCSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLQotIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1kaWdpdGFsKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCi0JCTs7Ci0JKi1jb21tb2RvcmUqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAotCQk7OwotCSopCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1pZiBbIHgiJG9zIiAhPSB4IiIgXQotdGhlbgotY2FzZSAkb3MgaW4KLSAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKLSAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCi0JICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIFwKLQkgICAgICB8IC1seW54b3MqIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY3lnd2luKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAotCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAotCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLXJoYXBzb2R5KiB8IC1vcGVuZWQqIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKLQkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCS1zdW5vczUqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCi0JCTs7Ci0JLXN1bm9zNiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKLQkJOzsKLQktb3BlbmVkKikKLQkJb3M9LW9wZW5lZGl0aW9uCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS0zODZic2QpCi0JCW9zPS1ic2QKLQkJOzsKLQktY3RpeCogfCAtdXRzKikKLQkJb3M9LXN5c3YKLQkJOzsKLQktbnMyICkKLQkgICAgICAgIG9zPS1uZXh0c3RlcDIKLQkJOzsKLQkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCi0JLXNpbml4NS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAotCQk7OwotCS1zaW5peCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS10cml0b24qKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktb3NzKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0gICAgICAgIC1xbngpCi0JCW9zPS1xbng0Ci0JCTs7Ci0JLXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCS1zdnIzKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3lzdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCi0JLXN5c3YqKQotCQk7OwotCS1vc2UqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLWVzMTgwMCopCi0JCW9zPS1vc2UKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotICAgICAgICAtKm1pbnQgfCAtKk1pTlQpCi0JICAgICAgICBvcz0tbWludAotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1hY29ybikKLQkJb3M9LXJpc2NpeDEuMgotCQk7OwotCWFybSotcmViZWwpCi0JCW9zPS1saW51eAotCQk7OwotCWFybSotc2VtaSkKLQkJb3M9LWFvdXQKLQkJOzsKLSAgICAgICAgcGRwMTEtKikKLQkJb3M9LW5vbmUKLQkJOzsKLQkqLWRlYyB8IHZheC0qKQotCQlvcz0tdWx0cml4NC4yCi0JCTs7Ci0JbTY4Ki1hcG9sbG8pCi0JCW9zPS1kb21haW4KLQkJOzsKLQlpMzg2LXN1bikKLQkJb3M9LXN1bm9zNC4wLjIKLQkJOzsKLQltNjgwMDAtc3VuKQotCQlvcz0tc3Vub3MzCi0JCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQotCQkjIGRlZmF1bHQuCi0JCSMgb3M9LXN1bm9zNAotCQk7OwotCW02OCotY2lzY28pCi0JCW9zPS1hb3V0Ci0JCTs7Ci0JbWlwcyotY2lzY28pCi0JCW9zPS1lbGYKLQkJOzsKLQltaXBzKi0qKQotCQlvcz0tZWxmCi0JCTs7Ci0JKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KLQkJb3M9LXN5c3YzCi0JCTs7Ci0Jc3BhcmMtKiB8ICotc3VuKQotCQlvcz0tc3Vub3M0LjEuMQotCQk7OwotCSotYmUpCi0JCW9zPS1iZW9zCi0JCTs7Ci0JKi1pYm0pCi0JCW9zPS1haXgKLQkJOzsKLQkqLXdlYykKLQkJb3M9LXByb2VsZgotCQk7OwotCSotd2luYm9uZCkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotb2tpKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1ocCkKLQkJb3M9LWhwdXgKLQkJOzsKLQkqLWhpdGFjaGkpCi0JCW9zPS1oaXV4Ci0JCTs7Ci0JaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQotCQlvcz0tc3lzdgotCQk7OwotCSotY2JtKQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCSotZGcpCi0JCW9zPS1kZ3V4Ci0JCTs7Ci0JKi1kb2xwaGluKQotCQlvcz0tc3lzdjMKLQkJOzsKLQltNjhrLWNjdXIpCi0JCW9zPS1ydHUKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJb3M9LWx1bmEKLQkJOzsKLQkqLW5leHQgKQotCQlvcz0tbmV4dHN0ZXAKLQkJOzsKLQkqLXNlcXVlbnQpCi0JCW9zPS1wdHgKLQkJOzsKLQkqLWNyZHMpCi0JCW9zPS11bm9zCi0JCTs7Ci0JKi1ucykKLQkJb3M9LWdlbml4Ci0JCTs7Ci0JaTM3MC0qKQotCQlvcz0tbXZzCi0JCTs7Ci0JKi1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0gICAgICAgICotZ291bGQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0gICAgICAgICotaGlnaGxldmVsKQotCQlvcz0tYnNkCi0JCTs7Ci0JKi1lbmNvcmUpCi0JCW9zPS1ic2QKLQkJOzsKLSAgICAgICAgKi1zZ2kpCi0JCW9zPS1pcml4Ci0JCTs7Ci0gICAgICAgICotc2llbWVucykKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JKi1tYXNzY29tcCkKLQkJb3M9LXJ0dQotCQk7OwotCWYzMDEtZnVqaXRzdSkKLQkJb3M9LXV4cHYKLQkJOzsKLQkqLXJvbTY4aykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLSpidWcpCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi1hcHBsZSkKLQkJb3M9LW1hY29zCi0JCTs7Ci0JKi1hdGFyaSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JKikKLQkJb3M9LW5vbmUKLQkJOzsKLWVzYWMKLWZpCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCi0jIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgotdmVuZG9yPXVua25vd24KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLXVua25vd24pCi0JCWNhc2UgJG9zIGluCi0JCQktcmlzY2l4KikKLQkJCQl2ZW5kb3I9YWNvcm4KLQkJCQk7OwotCQkJLXN1bm9zKikKLQkJCQl2ZW5kb3I9c3VuCi0JCQkJOzsKLQkJCS1haXgqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLWJlb3MqKQotCQkJCXZlbmRvcj1iZQotCQkJCTs7Ci0JCQktaHB1eCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1tcGVpeCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1oaXV4KikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktdW5vcyopCi0JCQkJdmVuZG9yPWNyZHMKLQkJCQk7OwotCQkJLWRndXgqKQotCQkJCXZlbmRvcj1kZwotCQkJCTs7Ci0JCQktbHVuYSopCi0JCQkJdmVuZG9yPW9tcm9uCi0JCQkJOzsKLQkJCS1nZW5peCopCi0JCQkJdmVuZG9yPW5zCi0JCQkJOzsKLQkJCS1tdnMqIHwgLW9wZW5lZCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktcHR4KikKLQkJCQl2ZW5kb3I9c2VxdWVudAotCQkJCTs7Ci0JCQktdnhzaW0qIHwgLXZ4d29ya3MqKQotCQkJCXZlbmRvcj13cnMKLQkJCQk7OwotCQkJLWF1eCopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS1obXMqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS1tcHcqIHwgLW1hY29zKikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLSptaW50IHwgLSpNaU5UKQotCQkJCXZlbmRvcj1hdGFyaQotCQkJCTs7Ci0JCWVzYWMKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKLQkJOzsKLWVzYWMKLQotZWNobyAkYmFzaWNfbWFjaGluZSRvcwpkaWZmIC0tZ2l0IGEvY29uZmlnL0NoYW5nZUxvZyBiL2NvbmZpZy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NzQ2YjEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIG1oLWkzNzBwaWM6IE5ldyBmaWxlLgotCSogbXQtaTM3MHBpYzogTmV3IGZpbGUuCi0KLTIwMDAtMDItMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tdC13aW5jZTogbmV3IGZpbGU6IE1ha2VmaWxlIGZyYWdtZW50IGZvciBXaW5DRSB0YXJnZXRzLgotCi0yMDAwLTAxLTA2ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIG1oLWFpeDQzOiBEZWxldGUsIG1vdmUgdG8gbXQtYWl4NDMuCi0JKiBtdC1haXg0MzogTmV3IGZpbGUuCi0KLTE5OTktMDQtMDcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBtdC1kMzB2OiBOZXcgZmlsZSwgcGFzcyAtZyAtT3MgLVdhLC1DIGFzIGRlZmF1bHQgb3B0aW9ucy4KLQotMTk5OS0wMi0wOCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IEFkZGVkIG1hY3JvcyB0byBmaW5kIGl0Y2wgZmlsZXMuCi0JRXhwb3J0IFRDTF9DRkxBR1MgZnJvbSB0Y2xDb25maWcuc2guCi0JRXhwb3J0IFRDTF9MSUJfRlVMTF9QQVRILCBUS19MSUJfRlVMTF9QQVRILCBJVENMX0xJQl9GVUxMX1BBVEgsCi0JSVRLX0xJQl9GVUxMX1BBVEgsIGFuZCBUSVhfTElCX0ZVTExfUEFUSAotCVJlcGxhY2UgVElYIG1hY3JvcyB3aXRoIGJldHRlciBvbmVzIGZyb20gc25hdmlnYXRvci4KLQotVHVlIEZlYiAgMiAyMjo1MToyMSAxOTk5IFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIG1oLWFybXBpYzogTmV3IGZpbGUuICBQYXRjaCBmcm9tIEppbSBQaWNrIDxqaW1AamltcGljay5jb20+LgotCSogbXQtYXJtcGljOiBMaWtld2lzZS4KLQotTW9uIEphbiAxOCAxOTo0MTowOCAxOTk5ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjeWd3aW4ubWg6IEFjdGl2YXRlIGNvbW1lbnRlZCBvdXQgZGVwZW5kZW5jaWVzIGZvcgotCWdkYjogbGlidGVybWNhcC4KLQotV2VkIE5vdiAxOCAyMDoyOTo0NiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjeWd3aW4ubWg6IEFkZCBleHRyYSBsaWJ0ZXJtY2FwIHRhcmdldCBpbmZvcm1hdGlvbi4KLQlBZGQgY29tbWVudGVkIG91dCBkZXBlbmRlbmN5IGZvciBnZGIgdG8gbGlidGVybWNhcCBmb3IKLQlmdXR1cmUgcmVhZGxpbmUgcmVxdWlyZW1lbnQuCi0KLU1vbiBOb3YgIDIgMTU6MTU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIG1oLWN5Z3dpbjMyOiBkZWxldGUKLSAgICAgICAgKiBtaC1jeWd3aW46IHdhcyBtaC1jeWd3aW4zMgotCi0xOTk4LTEwLTI2ICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogVENMSERJUiBhbmQgVEtIRElSIG5lZWQgdG8gYmUgcnVuIHRocm91Z2gKLQljeWdwYXRoIGZvciBNaWNyb3NvZnQgYnVpbGRzLgotCi0xOTk4LTEwLTIwICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogUmUtZXhwb3J0ZWQgVENMX0xJQlMgYW5kIFRDTF9MRF9TRUFSQ0hfRkxBR1MKLQliZWNhdXNlIGl0Y2wgbmVlZHMgdGhlbS4KLQotTW9uIEF1ZyAzMSAxNzo1MDo1MyAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogbWgtYWl4NDMgKE5NX0ZPUl9UQVJHRVQpOiBBZGQgLVgzMl82NCBhcyB3ZWxsLgotCi1TYXQgQXVnIDI5IDE0OjMyOjU1IDE5OTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBtaC1haXg0MzogTmV3IGZpbGUuCi0KLU1vbiBBdWcgMTAgMDA6MTU6NDcgMTk5OCAgSEogTHUgKGhqbEBnbnUub3JnKQotCi0JKiBtdC1saW51eCAoQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IEFkZCAtRF9HTlVfU09VUkNFLgotCi0xOTk4LTA1LTI5ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBjb2xsZWN0aW9uIG9mIGdlbmVyaWMgYXV0b2NvbmYgbWFjcm9zLgotCQotV2VkIEFwciAyMiAxMjoyNDoyOCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbXQtb3NwYWNlOiBOZXcgZmlsZSwgc3VwcG9ydCB1c2luZyAtT3MgaW5zdGVhZCBvZiAtTzIgdG8gY29tcGlsZQotCXRoZSBsaWJyYXJpZXMuCi0KLVdlZCBBcHIgMjIgMTA6NTM6MTQgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG10LWxpbnV4IChDWFhGTEFHU19GT1JfVEFSR0VUKTogU2V0IHRoaXMgaW5zdGVhZCBvZiBDWFhGTEFHUy4KLQotU2F0IEFwciAxMSAyMjo0MzoxNyAxOTk4ICBKLiBLZWFuIEpvaG5zdG9uICA8amtqQHNjby5jb20+Ci0KLQkqIG1oLXN2c3Y1OiBOZXcgZmlsZSAtIHN1cHBvcnQgZm9yIFNDTyBVbml4V2FyZSA3IC8gU1ZSNS4KLQotVGh1IE1hciAyNiAwMTo1NDoyNSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBtaC1jeWd3aW4zMjogc3RvcCBjb25maWd1cmluZyBhbmQgYnVpbGRpbmcgZG9zcmVsLgotCi1UaHUgU2VwIDExIDE2OjQzOjI3IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogbWgtZWxmYWxwaGFwaWMsIG10LWVsZmFscGhhcGljOiBOZXcgZmlsZXMuCi0KLVdlZCBKdWwgMjMgMTI6MzI6MTggMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBtaC1nbzMyIChDRkxBR1MpOiBEb24ndCBzZXQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIuCi0KLU1vbiBKdW4gMTYgMTk6MDY6NDEgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogbWgtcHBjcGljOiBOZXcgZmlsZS4KLQkqIG10LXBwY3BpYzogTmV3IGZpbGUuCi0KLVRodSBNYXIgMjcgMTU6NTI6NDAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogbWgtY3lnd2luMzI6IG92ZXJyaWRlIENYWEZMQUdTLCBzZXR0aW5nIHRvIC1PMiBvbmx5Ci0JKG5vIGRlYnVnKQotCi1UdWUgTWFyIDI1IDE4OjE2OjQzIDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIG1oLWN5Z3dpbjMyOiBvdmVycmlkZSBMSUJHQ0MyX0RFQlVHX0NGTEFHUyBzbyBkZWJ1ZyBpbmZvCi0JaXNuJ3QgaW5jbHVkZWQgaW4gY3lnd2luMzItaG9zdGVkIGxpYmdjYzIuYSBieSBkZWZhdWx0Ci0KLVdlZCBKYW4gIDggMTk6NTY6NDMgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIG1oLWN5Z3dpbjMyOiBvdmVycmlkZSBDRkxBR1Mgc28gZGVidWcgaW5mbyBpc24ndCBpbmNsdWRlZAotICAgICAgICBpbiBjeWd3aW4zMi1ob3N0ZWQgdG9vbHMgYnkgZGVmYXVsdAotCi1UdWUgRGVjIDMxIDE2OjA0OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtbGludXg6IFJlbW92ZS4KLQotTW9uIE5vdiAxMSAxMDoyOTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG10LXBwYzogRGVsZXRlIGZpbGUsIG9wdGlvbnMgbW92ZWQgdG8gbmV3bGliIGNvbmZpZ3VyZS4KLQotRnJpIE9jdCAgNCAxMjoyMTowMyAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogbWgtZGd1eDM4NjogTmV3IGZpbGUuICB4ODYgZGd1eCBzcGVjaWZpYyBmbGFncwotCi1Nb24gU2VwIDMwIDE1OjEwOjA3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1oLW1wdyAoRVhUUkFMSUJTX1BQQ19YQ09GRik6IE5ldywgd2FzIEVYVFJBTElCU19QUEMuCi0JKEVYVFJBTElCU19QUEMpOiBVc2Ugc2hhcmVkIGxpYnJhcmllcyBpbnN0ZWFkIG9mIHhjb2ZmLgotCi1TYXQgQXVnIDE3IDA0OjU2OjI1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQHNrYXJvLmN5Z251cy5jb20+Ci0KLQkqIG1oLWN5Z3dpbjMyOiBkb24ndCAtRF9XSU4zMiBoZXJlIGFueW1vcmUKLQotVGh1IEF1ZyAxNSAxOTo0Njo0NCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKFNFR0ZMQUdfNjhLLCBTRUdGTEFHX1BQQyk6IFJlbW92ZS4KLQkoRVhUUkFMSUJTX1BQQyk6IEFkZCBsaWJnY2MueGNvZmYuCi0KLVRodSBBdWcgIDggMTQ6NTE6NDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBtdC1wcGM6IE5ldyBmaWxlLCBhZGQgLW1yZWxvY2F0YWJsZS1saWIgYW5kIC1tbm8tZWFiaSB0byBhbGwKLQl0YXJnZXQgYnVpbGRzIGZvciBQb3dlclBDIGVhYmkgdGFyZ2V0cy4KLQotRnJpIEp1bCAxMiAxMjowNjowMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdzogTmV3IHN1YmRpciwgTWFjIE1QVyBjb25maWd1cmF0aW9uIHN1cHBvcnQgYml0cy4KLQotTW9uIEp1bCAgOCAxNzozMDo1MiAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIG1oLWlyaXg2OiBOZXcgZmlsZS4KLQotTW9uIEp1bCAgOCAxNToxNTozNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIG10LXNwYXJjcGljIChQSUNGTEFHX0ZPUl9UQVJHRVQpOiBVc2UgLWZQSUMuCi0KLUZyaSBKdWwgIDUgMTE6NDk6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1pcml4NCAoUkFOTElCKTogRG9uJ3QgZGVmaW5lOyBJcml4IDQgZG9lcyBoYXZlIHJhbmxpYi4KLQotU3VuIEp1biAyMyAyMjo1OToyNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBtaC1jeWd3aW4zMjogbmV3IGZpbGUuICBMaWtlIG1oLWdvMzIgd2l0aG91dCB0aGUgQ0ZMQUdTIGVudHJ5LgotCi1UdWUgTWFyIDI2IDE0OjEwOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtZ28zMiAoQ0ZMQUdTKTogRGVmaW5lLgotCi1UaHUgTWFyIDE0IDE5OjIwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtbmVjdjQ6IE5ldyBmaWxlLgotCi1UaHUgRmViIDE1IDEzOjA3OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtY3h1eCAoQ0MpOiBOZXcgdmFyaWFibGUuCi0JKENGTEFHUywgTERGTEFHUyk6IFJlbW92ZS4KLQkqIG1oLW5jcnN2cjQzIChDQyk6IE5ldyB2YXJpYWJsZS4KLQkoQ0ZMQUdTKTogUmVtb3ZlLgotCSogbWgtc29sYXJpcyAoQ0ZMQUdTKTogUmVtb3ZlLgotCi0JKiBtaC1nbzMyOiBSZW1vdmUgbW9zdCB2YXJpYWJsZSBzZXR0aW5ncywgc2luY2UgdGhleSBwcmVzdW1lZCBhCi0JQ2FuYWRpYW4gQ3Jvc3MsIHdoaWNoIGlzIG5vdyBoYW5kbGVkIGNvcnJlY3RseSBieSB0aGUgY29uZmlndXJlCi0Jc2NyaXB0LgotCi0JKiBtaC1zcGFyY3BpYyAoUElDRkxBRyk6IFNldCB0byAtZlBJQywgbm90IC1mcGljLgotCi1Nb24gRmViIDEyIDE0OjUzOjM5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtaC1tNjhrcGljLCBtdC1tNjhrcGljOiBOZXcgZmlsZXMuCi0KLVRodSBGZWIgIDEgMTQ6MTU6NDIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChDQ19NV0M2OEspOiBBZGQgb3B0aW9ucyBzaW1pbGFyIHRvIHRob3NlIHVzZWQKLQlpbiBDQ19NV0NQUEMsIGFuZCAtbWM2ODAyMCAtbW9kZWwgZmFyLgotCShBUl9NV0xJTks2OEspOiBBZGQgLXhtIGxpYnJhcnkuCi0JKEFSX0FSKTogRGVmaW5lLgotCShDQ19MRF9NV0xJTks2OEspOiBSZW1vdmUgLWQuCi0JKEVYVFJBTElCU19NV0M2OEspOiBEZWZpbmUuCi0KLVRodSBKYW4gMjUgMTY6MDU6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1uY3JzdnI0MyAoQ0ZMQUdTKTogUmVtb3ZlIC1Ibm9jb3B5ci4KLQotVHVlIE5vdiAgNyAxNTo0MTozMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKENDX01XQzY4SywgQ0NfTVdDUFBDKTogUmVtb3ZlIHVudXNlZCBpbmNsdWRlIHBhdGguCi0JKENDX01XQ1BQQyk6IEFkZCAtbXB3X2NoYXJzLCBkaXNhYmxlIHdhcm5pbmdzLCBhZGQgY29tbWVudHMKLQlleHBsYWluaW5nIHJlYXNvbnMgZm9yIHZhcmlvdXMgZmxhZ3MuCi0JKEVYVFJBTElCU19QUEMsIEVYVFJBTElCU19NV0NQUEMgKTogUHV0IHJ1bnRpbWUgbGlicmFyeSBmaXJzdC4KLQkKLUZyaSBPY3QgMTMgMTQ6NDQ6MjUgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIG1oLWFpeCwgbWgtc3VuOiAgUmVtb3ZlZC4KLQotCSogbWgtZGVjc3RhdGlvbiAoWDExX0VYVFJBX0NGTEFHUyk6IERlZmluZS4KLQotCSogbWgtc2NvLCBtaC1zb2xhcmlzLCBtaC1zeXN2NCAoWDExX0VYVFJBX0xJQlMpOiBEZWZpbmUuCi0KLSAgICAgICAgKiBtaC1ocDMwMCwgbWgtaHB1eCwgbWgtaHB1eDgsIG1oLXNvbGFyaXMsIG1oLXN1bjMsIG1oLXN5c3Y0OiBEb24ndCAKLQloYXJkY29kZSBsb2NhdGlvbiBvZiBYIHN0dWZmIGhlcmUuCi0KLVRodSBTZXAgMjggMTM6MTQ6NTYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3OiBBZGQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgNjhLIGFuZCBQb3dlck1hYwotCWNvbXBpbGVycywgYWRkIGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IGFuZCBsaW5rIHN0ZXBzIGZvcgotCVBvd2VyTWFjcy4KLQotVGh1IFNlcCAxNCAwODoyMDowNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbWgtaHAzMDAgKENDKTogQWRkICJDQyA9IGNjIC1XcCwtSDI1NjAwMCIgdG8gYXZvaWQKLQkidG9vIG11Y2ggZGVmaW5pbmciIGVycm9ycyBmcm9tIHRoZSBIUFVYIGNvbXBpbGVyLgotCi1UaHUgQXVnIDE3IDE3OjI4OjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogbWgtaHAzMDAgKFJBTkxJQik6IFVzZSAiYXIgdHMiLCBpbiBjYXNlIEdOVSBhciB3YXMgdXNlZCBhbmQKLQlkaWRuJ3QgYnVpbGQgYSBzeW1ib2wgdGFibGUuCi0KLVRodSBKdW4gMjIgMTc6NDc6MjQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChDQyk6IERlZmluZSBBTlNJX1BST1RPVFlQRVMuCi0KLU1vbiBBcHIgMTAgMTI6Mjk6NDggMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChFWFRSQUxJQlMpOiBBbHdheXMgbGluayBpbiBNYXRoLm8sIENTQU5FTElCLm8sCi0gICAgICAgIGFuZCBUb29sTGlicy5vLgotCi0JKiBtcHctbWgtbXB3IChDQyk6IERlZmluZSBBTE1PU1RfU1REQy4KLQkoQ0ZMQUdTKTogUmVtb3ZlIEFMTU9TVF9TVERDLCAtbWM2ODg4MS4KLQkoTERGTEFHUyk6IGFkZCAtdy4KLQotCSogbXB3LW1oLW1wdyAoQ0ZMQUdTKTogQWRkIC1iIG9wdGlvbiB0byBwdXQgc3RyaW5ncyBhdCB0aGUgZW5kcyBvZgotCWZ1bmN0aW9ucy4KLQotCSogbXB3LW1oLW1wdzogTmV3IGZpbGUsIGhvc3QgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZm9yIE1QVy4KLQotRnJpIE1hciAzMSAxMTozNToxNyAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBtdC1uZXR3YXJlOiBOZXcgZmlsZS4KLQotTW9uIE1hciAxMyAxMjozMToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWhwdXg4OiBOZXcgZmlsZS4KLQkqIG1oLWhwdXg6IFVzZSBYMTFSNSByYXRoZXIgdGhhbiBYMTFSNC4KLQotVGh1IEZlYiAgOSAxMTowNDoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWxpbnV4IChTWVNWKTogRG9uJ3QgZGVmaW5lLgotCShSQU5MSUIpOiBEb24ndCBkZWZpbmUuCi0KLVdlZCBKYW4gMTEgMTY6Mjk6MzQgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIG0/LSpwaWMgKExJQkNYWEZMQUdTKTogQWRkIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzLgotCi1UaHUgTm92ICAzIDE3OjI3OjE5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG1oLWlyaXg0IChDQyk6IEluY3JlYXNlIG1heGltdW0gc3RyaW5nIGxlbmd0aC4KLQotCSogbWgtc2NvIChDQyk6IERlZmluZSBhd2F5IGNvbnN0LCBpdCBkb2Vzbid0IHdvcmsgcmlnaHQ7IGVsZW1lbnRzCi0Jb2YgYXJyYXlzIG9mIHB0ci10by1jb25zdCBhcmUgY29uc2lkZXJlZCBjb25zdCB0aGVtc2VsdmVzLgotCi1TYXQgSnVsIDE2IDEyOjE3OjQ5IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogbWgtY3h1eDogTmV3IGZpbGUsIGZyb20gQm9iIFJ1c2sgKHJydXNrQG1haWwuY3NkLmhhcnJpcy5jb20pLgotCi1TYXQgSnVuICA0IDE3OjIyOjEyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBtaC1uY3JzdnI0MzogIE5ldyBmaWxlIGZyb20gVG9tIE1jQ29ubmVsbAotCTx0bWNjb25uZUBzZWRvbmEuaW50ZWwuY29tPi4KLQotVGh1IE1heSAxOSAwMDozMjoxMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbWgtaHB1eCAoQ0MpOiBBZGQgLVdwLC1IMjU2MDAwIHRvIGF2b2lkICJ0b28gbXVjaCBkZWZpbmluZyIKLQllcnJvcnMgZnJvbSB0aGUgSFBVWCA4IGNvbXBpbGVycy4KLQotV2VkIE1heSAgNCAyMDoxNDo0NyAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIG1oLWx5bnhyczZrOiBzZXQgU0hFTEwgdG8gL2Jpbi9iYXNoCi0KLVR1ZSBBcHIgMTIgMTI6Mzg6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaC1pcml4NCAoQ0MpOiBDaGFuZ2UgLVhOaDE1MDAgdG8gLVhOaDIwMDAuCi0KLVNhdCBEZWMgMjUgMjA6MDM6NDUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG10LWhwcGE6IERlbGV0ZS4KLQotVHVlIE5vdiAxNiAyMjo1NDozOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWgtYTY4YnNkOiBEZWZpbmUgQ0MgdG8gZ2NjLgotCi1Nb24gTm92IDE1IDE2OjU2OjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaC1saW51eDogRG9uJ3QgcHV0IC1zdGF0aWMgaW4gTERGTEFHUy4gIEFkZCBjb21tZW50cy4KLQotTW9uIE5vdiAxNSAxMzozNzo1OCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIG1oLXN5c3Y0IChBUl9GTEFHUyk6IGNoYW5nZSBmcm9tIGNxIHRvIGNyCi0KLUZyaSBOb3YgIDUgMDg6MTI6MzIgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBibHVlcy5jeWdudXMuY29tKQotCi0JKiBtaC11bml4d2FyZTogcmVtb3ZlLiAgSXQncyB0aGUgc2FtZSBhcyBzeXN2NCwgYW5kIGNvbmZpZy5ndWVzcwotCWNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UuICBTbyBkb24ndCBhbGxvdyBza2V3LgotCi1XZWQgT2N0IDIwIDIwOjM1OjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaC1ocDMwMDogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZSwgYnV0IGFkZCBjb21tZW50IGV4cGxhaW5pbmcuCi0KLVR1ZSBPY3QgMTkgMTg6NTg6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1oLWhwMzAwOiBEb24ndCBkZWZpbmUgQ0ZMQUdTIHRvIGVtcHR5LiAgV2h5IHNob3VsZCBocDMwMCBiZQotCWRpZmZlcmVudCBmcm9tIGFueXRoaW5nIGVsc2U/ICAoImdkYiBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIG5hdGl2ZQotCWRlYnVnIGZvcm1hdCIgaXNuJ3QgYSBnb29kIGVub3VnaCBhbnN3ZXIgYmVjYXVzZSB3ZSBtaWdodCBiZSB1c2luZwotCWdjYykuCi0KLVR1ZSBPY3QgIDUgMTI6MTc6NDAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBtaC1hbHBoYW9zZjogUmVtb3ZlLCBubyBsb25nZXIgbmVjZXNzYXJ5IG5vdyB0aGF0IGdkYiBrbm93cwotCWhvdyB0byBoYW5kbGUgT1NGLzEgc2hhcmVkIGxpYnJhcmllcy4KLQotVHVlIEp1bCAgNiAxMToyNzozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBtaC1hbHBoYW9zZjogTmV3IGZpbGUuCi0KLVRodSBKdWwgIDEgMTU6NDk6MzMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1oLXJpc2NvczogTmV3IGZpbGUuCi0KLU1vbiBKdW4gMTQgMTI6MDM6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaC1haXgsIG1oLWFpeDM4NiwgbWgtZGVjc3RhdGlvbiwgbWgtZGVsdGE4OCwgbWgtaHB1eCwgbWgtaXJpeDQsCi0JbWgtbmNyMzAwMCwgbWgtc29sYXJpcywgbWgtc3lzdiwgbWgtc3lzdjQ6IHJlbW92ZSBJTlNUQUxMPWNwIGxpbmUsCi0Jbm93IHRoYXQgd2UncmUgdXNpbmcgaW5zdGFsbC5zaCBnbG9iYWxseQotCi1GcmkgSnVuICA0IDE2OjA5OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWgtc3lzdjQgKElOU1RBTEwpOiBVc2UgY3AsIG5vdCAvdXNyL3VjYi9pbnN0YWxsLgotCi1UaHUgQXByICA4IDExOjIxOjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbXQtYTI5aywgbXQtZWJtb24yOWssIG10LW9zNjhrLCBtdC1vc2U2ODAwMCwgbXQtb3NlNjhrLAotCW10LXZ4d29ya3M2OCwgbXQtdnh3b3Jrczk2MDogUmVtb3ZlZCBvYnNvbGV0ZSwgdW51c2VkIHRhcmdldAotCU1ha2VmaWxlIGZyYWdtZW50IGZpbGVzLgotCi1Nb24gTWFyICA4IDE1OjA1OjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWgtYWl4Mzg2OiBOZXcgZmlsZTsgb2xkIG1oLWFpeCwgcGx1cyBuby1vcCBSQU5MSUIuCi0KLVRodSBPY3QgIDEgMTM6NTA6NDggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBtaC1zb2xhcmlzOiBJTlNUQUxMIGlzIE5PVCAvdXNyL3VjYi9pbnN0YWxsCi0KLU1vbiBBdWcgMjQgMTQ6MjU6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtdC1vc2U2ODAwMCwgbXQtb3NlNjhrOiByZW5hbWVkIGZyb20gbXQtT1NFKi4KLQotVHVlIEp1bCAyMSAwMjoxMTowMSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIG10LU9TRTY4aywgbXQtNjgwMDAwOiBuZXcgY29uZmlncy4KLQotVGh1IEp1bCAxNiAxNzoxMjowOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIG1oLWlyaXg0OiBtZXJnZWQgY2hhbmdlcyBmcm9tIHByb2dyZXNzaXZlLgotCi1UdWUgSnVuICA5IDIzOjI5OjM4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogRXZlcnl3aGVyZTogQ2hhbmdlIFJBTkxJQj1lY2hvPi9kZXYvbnVsbCAod2hpY2ggY29uZnVzZXMKLQlzb21lIHNoZWxscyAtIGFuZCBJIGRvbid0IGJsYW1lIHRoZW0pIHRvIFJBTkxJQj10cnVlLgotCSogbWgtc29sYXJpczogIFVzZSAvdXNyL3VjYi9pbnN0YWxsIGZvciBJTlNUQUxMLgotCi1TdW4gTWF5IDMxIDE0OjQ1OjIzIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCi0KLQkqIG1oLXNvbGFyaXMyOiBBZGQgbmV3IGNvbmZpZ3VyYXRpb24gZm9yIFNvbGFyaXMgMiAoc3lzdiwgbm8gcmFubGliKQotCi1GcmkgQXByIDEwIDIzOjEwOjA4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtaC1uY3IzMDAwOiAgQWRkIG5ldyBjb25maWd1cmF0aW9uIGZvciBOQ1IgMzAwMC4KLQotVHVlIERlYyAxMCAwMDoxMDo1NSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIENoYW5nZUxvZzogZnJlc2ggY2hhbmdlbG9nLgotCmRpZmYgLS1naXQgYS9jb25maWcvYWNpbmNsdWRlLm00IGIvY29uZmlnL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjc5OWNlZC4uMDAwMDAwMAotLS0gYS9jb25maWcvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTk5NCArMCwwIEBACi1kbmwgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGludG8gYWxsIGFueSBvdGhlciBhY2luY2x1ZGUgZmlsZSB0aGF0IG5lZWRzCi1kbmwgdG8gdXNlIHRoZXNlIG1hY3Jvcy4KLQotZG5sIFRoaXMgaXMgY29waWVkIGZyb20gYXV0b2NvbmYgMi4xMiwgYnV0IGRvZXMgY2FsbHMgb3VyIG93biBBQ19QUk9HX0NDX1dPUktTLAotZG5sIGFuZCBkb2Vzbid0IGNhbGwgQUNfUFJPR19DWFhfR05VLCBjYXVzZSB3ZSB0ZXN0IGZvciB0aGF0IGluICBBQ19QUk9HX0NDX1dPUktTLgotZG5sIFdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLCB3aGljaCB3aWxsIG5vdCBiZSBhYmxlIHRvIGZ1bGx5Ci1kbmwgbGluayBhbiBleGVjdXRhYmxlLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGluIGF1dG9jb25mIGl0c2VsZi4KLWRubCBGaW5kIGEgd29ya2luZyBHKysgY3Jvc3MgY29tcGlsZXIuIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIEdOVSBDKysgY29tcGlsZXIuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19DWFhfQ1JPU1MsCi1bQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NYWENQUF0pCi1BQ19DSEVDS19QUk9HUyhDWFgsICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKyssIGdjYykKLQotQ1lHX0FDX1BST0dfR1hYX1dPUktTCi0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ3h4ID0geWVzOyB0aGVuCi0gIEdYWD15ZXMKLWRubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENYWEZMQUdTIGlzIHNldCwgaW4gY2FzZSB0aGUgcGFja2FnZQotZG5sIHBsYXlzIGFyb3VuZCB3aXRoIENYWEZMQUdTIChzdWNoIGFzIHRvIGJ1aWxkIGJvdGggZGVidWdnaW5nIGFuZAotZG5sIG5vcm1hbCB2ZXJzaW9ucyBvZiBhIGxpYnJhcnkpLCB0YXN0ZWxlc3MgYXMgdGhhdCBpZGVhIGlzLgotICBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKLSAgQ1hYRkxBR1M9Ci0gIEFDX1BST0dfQ1hYX0cKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KLSAgICBDWFhGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ1hYRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR1hYPQotICB0ZXN0ICIke0NYWEZMQUdTK3NldH0iID0gc2V0IHx8IENYWEZMQUdTPSItZyIKLWZpCi1dKQotCi1kbmwgU2VlIGlmIHRoZSBHKysgY29tcGlsZXIgd2UgZm91bmQgd29ya3MuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19HWFhfV09SS1MsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBHKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSBhY3R1YWxseSB3b3Jrc10pCi1BQ19MQU5HX1NBVkUKLUFDX0xBTkdfQ1BMVVNQTFVTCi1kbmwgVHJ5IGEgdGVzdCBjYXNlLiBXZSBvbmx5IGNvbXBpbGUsIGJlY2F1c2UgaXQncyBjbG9zZSB0byBpbXBvc3NpYmxlCi1kbmwgdG8gZ2V0IGEgY29ycmVjdCBmdWxseSBsaW5rZWQgZXhlY3V0YWJsZSB3aXRoIGEgY3Jvc3MgY29tcGlsZXIuIEZvcgotZG5sIG1vc3QgY3Jvc3MgY29tcGlsZXJzLCB0aGlzIHRlc3QgaXMgYm9ndXMuIEZvciBHKyssIHdlIGNhbiB1c2UgdmFyaW91cwotZG5sIG90aGVyIGNvbXBpbGUgbGluZSBvcHRpb25zIHRvIGdldCBhIGRlY2VudCBpZGVhIHRoYXQgdGhlIGNyb3NzIGNvbXBpbGVyCi1kbmwgYWN0dWFsbHkgZG9lcyB3b3JrLCBldmVuIHRob3VnaCB3ZSBjYW4ndCBwcm9kdWNlIGFuIGV4ZWN1dGFibGUgd2l0aG91dAotZG5sIG1vcmUgaW5mbyBhYm91dCB0aGUgdGFyZ2V0IGl0J3MgYmVpbmcgY29tcGlsZWQgZm9yLiBUaGlzIG9ubHkgd29ya3MKLWRubCBmb3IgdGhlIEdOVSBDKysgY29tcGlsZXIuCi0KLWRubCBUcmFuc2Zvcm0gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIHRvIGl0J3MgY3Jvc3MgdmFyaWFudCwgdW5sZXNzCi1kbmwgQ1hYIGlzIHNldC4gVGhpcyBpcyBhbHNvIHdoYXQgQ1hYIGdldHMgc2V0IHRvIGluIHRoZSBnZW5lcmF0ZWQKLWRubCBNYWtlZmlsZS4KLWlmIHRlc3QgeCIke0NYWH0iID0geGMrKyA7IHRoZW4KLSAgICBDWFg9YGVjaG8gZ2NjIHwgc2VkIC1lICIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9ImAKLWZpCi0KLWRubCBHZXQgRysrJ3MgZnVsbCBwYXRoIHRvIGxpYmdjYy5hCi1saWJnY2NwYXRoPWAke0NYWH0gLS1wcmludC1saWJnY2NgCi0KLWRubCBJZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3aXRoIGxpYmdjYy5hIG9uIHRoZSBlbmQsIHRoaXMgaXNuJ3QgRysrLgotaWYgdGVzdCBgZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovLiovOjonYCA9IGxpYmdjYy5hIDsgdGhlbgotICAgYWNfY3ZfcHJvZ19neHg9eWVzCi1lbHNlCi0gICBhY19jdl9wcm9nX2d4eD1ubwotZmkKLQotZG5sIElmIHdlIGFyZSB1c2luZyBHKyssIGxvb2sgZm9yIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gZXhpc3QgaWYgdGhpcwotZG5sIGNvbXBpbGVyIHdvcmtzLgotaWYgdGVzdCB4IiR7YWNfY3ZfcHJvZ19neHh9IiA9IHh5ZXMgOyB0aGVuCi0gICAgZ2NjZmlsZXM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6L2xpYmdjYy5hOjonYAotICAgIGlmIHRlc3QgLWYgJHtnY2NmaWxlc30vc3BlY3MgLWEgLWYgJHtnY2NmaWxlc30vY3BwIC1hIC1mICR7Z2NjZmlsZXN9L2NjMXBsdXM7IHRoZW4KLQlnY2NmaWxlcz15ZXMKLSAgICBlbHNlCi0JZ2NjZmlsZXM9bm8KLSAgICBmaQotICAgIGdjY2xpYnM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6bGliL2djYy1saWIvOjonIC1lICdzOi9saWJnY2MuYTo6JyAtZSAncyxcKC4qXCkvLiosXDEsZydgL2xpYgotICAgIGlmIHRlc3QgLWQgJHtnY2NsaWJzfS9sZHNjcmlwdHMgLWEgLWYgJHtnY2NsaWJzfS9saWJjLmEgLWEgLWYgJHtnY2NsaWJzfS9saWJzdGRjKysuYSA7IHRoZW4KLQlnY2NsaWJzPXllcwotICAgIGVsc2UKLQlnY2NsaWJzPW5vCi0gICAgZmkKLWZpCi0KLWRubCBJZiBldmVyeXRoaW5nIGlzIE9LLCB0aGVuIHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoZSBjb21waWxlciB3b3Jrcy4KLWlmIHRlc3QgeCIke2djY2ZpbGVzfSIgPSB4bm8gLW8geCIke2djY2xpYnN9IiA9IHhubzsgdGhlbgotICAgIGFjX2N2X3Byb2dfY3h4X3dvcmtzPW5vCi0gICAgQUNfTVNHX0VSUk9SKCR7Q1hYfSBpcyBhIG5vbi13b3JraW5nIGNyb3NzIGNvbXBpbGVyKQotZWxzZQotICAgYWNfY3ZfcHJvZ19jeHhfd29ya3M9eWVzIAotZmkKLQotQUNfTEFOR19SRVNUT1JFCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9wcm9nX2N4eF93b3JrcykKLWlmIHRlc3QgeCIkYWNfY3ZfcHJvZ19jeHhfd29ya3MiID0geG5vOyB0aGVuCi0gIEFDX01TR19FUlJPUihbaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQysrIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuXSkKLWZpCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIEcrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXJdKQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jeHhfY3Jvc3MpCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCi1BQ19TVUJTVChDWFgpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIGEgd29ya2luZyBHQ0MgY3Jvc3MgY29tcGlsZXIuIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIEdOVSBnY2MgY29tcGlsZXIuCi1kbmwgVGhpcyBpcyBiYXNlZCBvbiB0aGUgbWFjcm9zIGFib3ZlIGZvciBHKysuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19DQ19DUk9TUywKLVtBQ19CRUZPUkUoWyQwXSwgW0FDX1BST0dfQ0NQUF0pCi1BQ19DSEVDS19QUk9HUyhDQywgY2MsIGdjYykKLQotQ1lHX0FDX1BST0dfR0NDX1dPUktTCi0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWRubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENGTEFHUyBpcyBzZXQsIGluIGNhc2UgdGhlIHBhY2thZ2UKLWRubCBwbGF5cyBhcm91bmQgd2l0aCBDRkxBR1MgKHN1Y2ggYXMgdG8gYnVpbGQgYm90aCBkZWJ1Z2dpbmcgYW5kCi1kbmwgbm9ybWFsIHZlcnNpb25zIG9mIGEgbGlicmFyeSksIHRhc3RlbGVzcyBhcyB0aGF0IGlkZWEgaXMuCi0gIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPQotICBBQ19QUk9HX0NDX0cKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdYWD0KLSAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKLWZpCi1dKQotCi1kbmwgU2VlIGlmIHRoZSBHQ0MgY29tcGlsZXIgd2UgZm91bmQgd29ya3MuCi1BQ19ERUZVTihDWUdfQUNfUFJPR19HQ0NfV09SS1MsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBHY2MgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBhY3R1YWxseSB3b3Jrc10pCi1BQ19MQU5HX1NBVkUKLUFDX0xBTkdfQwotZG5sIFRyeSBhIHRlc3QgY2FzZS4gV2Ugb25seSBjb21waWxlLCBiZWNhdXNlIGl0J3MgY2xvc2UgdG8gaW1wb3NzaWJsZQotZG5sIHRvIGdldCBhIGNvcnJlY3QgZnVsbHkgbGlua2VkIGV4ZWN1dGFibGUgd2l0aCBhIGNyb3NzCi1kbmwgY29tcGlsZXIuIEZvciBtb3N0IGNyb3NzIGNvbXBpbGVycywgdGhpcyB0ZXN0IGlzIGJvZ3VzLiBGb3IgRysrLAotZG5sIHdlIGNhbiB1c2UgdmFyaW91cyBvdGhlciBjb21waWxlIGxpbmUgb3B0aW9ucyB0byBnZXQgYSBkZWNlbnQgaWRlYQotZG5sIHRoYXQgdGhlIGNyb3NzIGNvbXBpbGVyIGFjdHVhbGx5IGRvZXMgd29yaywgZXZlbiB0aG91Z2ggd2UgY2FuJ3QKLWRubCBwcm9kdWNlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCBtb3JlIGluZm8gYWJvdXQgdGhlIHRhcmdldCBpdCdzCi1kbmwgYmVpbmcgY29tcGlsZWQgZm9yLiBUaGlzIG9ubHkgd29ya3MgZm9yIHRoZSBHTlUgQysrIGNvbXBpbGVyLgotCi1kbmwgVHJhbnNmb3JtIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byBpdCdzIGNyb3NzIHZhcmlhbnQsIHVubGVzcwotZG5sIENYWCBpcyBzZXQuIFRoaXMgaXMgYWxzbyB3aGF0IENDIGdldHMgc2V0IHRvIGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuCi1pZiB0ZXN0IHgiJHtDQ30iID0geGNjIDsgdGhlbgotICAgIENDPWBlY2hvIGdjYyB8IHNlZCAtZSAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSJgCi1maQotCi1kbmwgR2V0IEdjYydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotbGliZ2NjcGF0aD1gJHtDQ30gLS1wcmludC1saWJnY2NgCi0KLWRubCBJZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3aXRoIGxpYmdjYy5hIG9uIHRoZSBlbmQsIHRoaXMgaXNuJ3QgRysrLgotaWYgdGVzdCBgZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovLiovOjonYCA9IGxpYmdjYy5hIDsgdGhlbgotICAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gICBhY19jdl9wcm9nX2djYz1ubwotZmkKLQotZG5sIElmIHdlIGFyZSB1c2luZyBHY2MsIGxvb2sgZm9yIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gZXhpc3QgaWYgdGhpcwotZG5sIGNvbXBpbGVyIHdvcmtzLgotaWYgdGVzdCB4IiR7YWNfY3ZfcHJvZ19nY2N9IiA9IHh5ZXMgOyB0aGVuCi0gICAgZ2NjZmlsZXM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6L2xpYmdjYy5hOjonYAotICAgIGlmIHRlc3QgLWYgJHtnY2NmaWxlc30vc3BlY3MgLWEgLWYgJHtnY2NmaWxlc30vY3BwIC1hIC1mICR7Z2NjZmlsZXN9L2NjMXBsdXM7IHRoZW4KLQlnY2NmaWxlcz15ZXMKLSAgICBlbHNlCi0JZ2NjZmlsZXM9bm8KLSAgICBmaQotICAgIGdjY2xpYnM9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6bGliL2djYy1saWIvOjonIC1lICdzOi9saWJnY2MuYTo6JyAtZSAncyxcKC4qXCkvLiosXDEsZydgL2xpYgotICAgIGlmIHRlc3QgLWQgJHtnY2NsaWJzfS9sZHNjcmlwdHMgLWEgLWYgJHtnY2NsaWJzfS9saWJjLmEgLWEgLWYgJHtnY2NsaWJzfS9saWJzdGRjKysuYSA7IHRoZW4KLQlnY2NsaWJzPXllcwotICAgIGVsc2UKLQlnY2NsaWJzPW5vCi0gICAgZmkKLWZpCi0KLWRubCBJZiBldmVyeXRoaW5nIGlzIE9LLCB0aGVuIHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoZSBjb21waWxlciB3b3Jrcy4KLWlmIHRlc3QgeCIke2djY2ZpbGVzfSIgPSB4bm8gLW8geCIke2djY2xpYnN9IiA9IHhubzsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLSAgICBBQ19NU0dfRVJST1IoJHtDQ30gaXMgYSBub24td29ya2luZyBjcm9zcyBjb21waWxlcikgICAgCi1lbHNlCi0gICAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLWZpCi0KLUFDX0xBTkdfUkVTVE9SRQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jY193b3JrcykKLWlmIHRlc3QgeCIkYWNfY3ZfcHJvZ19jY193b3JrcyIgPSB4bm87IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDKysgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy5dKQotZmkKLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgR2NjIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlcl0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9wcm9nX2NjX2Nyb3NzKQotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi1BQ19TVUJTVChDQykKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIEJGRCBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gYWNjZXNzIGFuZAotZG5sIG1hbmlwdWxhdGUgb2JqZWN0IG9yIGV4ZWN1dGFibGUgZmlsZXMuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9CRkQsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGJmZCBoZWFkZXIgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotZG5sIExvb2sgZm9yIHRoZSBoZWFkZXIgZmlsZQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfYmZkaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9iZmQvYmZkLmgiIDsgdGhlbgotCWFjX2N2X2NfYmZkaD1gKGNkICRpL2JmZDsgcHdkKWAKLQlicmVhawotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19iZmRofSIgIT0geDsgdGhlbgotICAgIEJGREhESVI9Ii1JJHthY19jdl9jX2JmZGh9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2JmZGh9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChCRkRIRElSKQotCi1kbmwgTG9vayBmb3IgdGhlIGxpYnJhcnkKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGJmZCBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfYmZkbGliLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2JmZC9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19iZmRsaWI9YChjZCAkaS9iZmQ7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1kbmwgV2UgbGlzdCB0d28gZGlyZWN0b3JpZXMgY2F1c2UgYmZkIG5vdyB1c2VzIGxpYnRvb2wKLWlmIHRlc3QgeCIke2FjX2N2X2NfYmZkbGlifSIgIT0geDsgdGhlbgotICAgIEJGRExJQj0iLUwke2FjX2N2X2NfYmZkbGlifSAtTCR7YWNfY3ZfY19iZmRsaWJ9Ly5saWJzIgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2JmZGxpYn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKEJGRExJQikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiBUaGlzIGRlZmluZXMgbWFueSBjb21tb25seSB1c2VkIEMKLWRubCBmdW5jdGlvbnMgdGhhdCBleGlzdHMgaW4gdmFyaW91cyBzdGF0ZXMgYmFzZWQgb24gdGhlIHVuZGVybHlpbmcgT1MuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJFUlRZLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBsaWJlcnR5IGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGliZXJ0eSxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9saWJpYmVydHkvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfbGliZXJ0eT1gKGNkICRpL2xpYmliZXJ0eTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZXJ0eX0iICE9IHg7IHRoZW4KLSAgICBMSUJFUlRZPSItTCR7YWNfY3ZfY19saWJlcnR5fSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19saWJlcnR5fSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoTElCRVJUWSkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIG9wY29kZXMgbGlicmFyeS4gVGhpcyBpcyB1c2VkIHRvIGRvIGRpc3Nhc2VtYmxpZXMuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9PUENPREVTLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBvcGNvZGVzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2Nfb3BjLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL29wY29kZXMvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2Nfb3BjPWAoY2QgJGkvb3Bjb2RlczsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2Nfb3BjfSIgIT0geDsgdGhlbgotICAgIE9QQ09ERVNMSUI9Ii1MJHthY19jdl9jX29wY30iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfb3BjfSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoT1BDT0RFU0xJQikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIExvb2sgZm9yIHRoZSBEZWphR251IGhlYWRlciBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZS4gVGhpcyBmaWxlCi1kbmwgZGVmaW5lcyB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gdGVzdGluZyBzdXBwb3J0LgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfREVKQUdOVSwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgdGVzdGluZyBzdXBwb3J0IGZpbGVzIGluIHRoZSBzb3VyY2UgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19kZWphZ251LFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRzcmNkaXIvJGkvZWNjL2VjYy9pbmZyYS90ZXN0bGliL2N1cnJlbnQvaW5jbHVkZS9kZWphZ251LmgiIDsgdGhlbgotCWFjX2N2X2NfZGVqYWdudT1gKGNkICRzcmNkaXIvJGkvZWNjL2VjYy9pbmZyYS90ZXN0bGliL2N1cnJlbnQvaW5jbHVkZTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfZGVqYWdudX0iICE9IHg7IHRoZW4KLSAgICBERUpBR05VSERJUj0iLUkke2FjX2N2X2NfZGVqYWdudX0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfZGVqYWdudX0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2RlamFnbnVsaWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kaS9pbmZyYS90ZXN0bGliL2N1cnJlbnQvbGliL2hvc3R1dGlsLmV4cCIgOyB0aGVuCi0JYWNfY3ZfY19kZWphZ251bGliPWAoY2QgJHNyY2Rpci8kaS9pbmZyYS90ZXN0bGliL2N1cnJlbnQvbGliOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19kZWphZ251bGlifSIgIT0geDsgdGhlbgotICAgIERFSkFHTlVMSUI9IiR7YWNfY3ZfY19kZWphZ251bGlifSIKLWVsc2UKLSAgICBERUpBR05VTElCPSIiCi1maQotQUNfTVNHX0NIRUNLSU5HKGZvciBydW50ZXN0IGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3J1bnRlc3QsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kaS9kZWphZ251L3J1bnRlc3QiIDsgdGhlbgotCWFjX2N2X2NfcnVudGVzdD1gKGNkICRzcmNkaXIvJGkvZGVqYWdudTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfcnVudGVzdH0iICE9IHg7IHRoZW4KLSAgICBSVU5URVNURElSPSIke2FjX2N2X2NfcnVudGVzdH0iCi0gICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19ydW50ZXN0fSkKLWVsc2UKLSAgICBSVU5URVNURElSPSIiCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKFJVTlRFU1RESVIpCi1BQ19TVUJTVChERUpBR05VTElCKQotQUNfU1VCU1QoREVKQUdOVUhESVIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBsaWJpbnRsIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUuIFRoaXMgaXMgZm9yCi1kbmwgIGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JTlRMLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBpbnRsIGhlYWRlciBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1kbmwgTG9vayBmb3IgdGhlIGhlYWRlciBmaWxlCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbnRsaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9pbnRsL2xpYmludGwuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbnRsaD1gKGNkICRpL2ludGw7IHB3ZClgCi0JYnJlYWsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaW50bGh9IiAhPSB4OyB0aGVuCi0gICAgSU5UTEhESVI9Ii1JJHthY19jdl9jX2ludGxofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbnRsaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKElOVExIRElSKQotCi1kbmwgTG9vayBmb3IgdGhlIGxpYnJhcnkKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGxpYmludGwgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2ludGxsaWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvaW50bC9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19pbnRsbGliPWAoY2QgJGkvaW50bDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaW50bGxpYn0iICE9IHg7IHRoZW4KLSAgICBJTlRMTElCPSItTCR7YWNfY3ZfY19pbnRsbGlifSAtbGludGwiCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaW50bGxpYn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKElOVExMSUIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBzaW11bGF0b3IgbGlicmFyeS4KLUFDX0RFRlVOKENZR19BQ19QQVRIX1NJTSwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWNhc2UgIiR0YXJnZXRfY3B1IiBpbgotICAgIHBvd2VycGMpCXRhcmdldF9kaXI9cHBjIDs7Ci0gICAgc3BhcmMqKQl0YXJnZXRfZGlyPWVyYzMyIDs7Ci0gICAgbWlwcyopCXRhcmdldF9kaXI9bWlwcyA7OwotICAgICopCQl0YXJnZXRfZGlyPSR0YXJnZXRfY3B1IDs7Ci1lc2FjCi1kbmwgRmlyc3QgbG9vayBmb3IgdGhlIGhlYWRlciBmaWxlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBzaW11bGF0b3IgaGVhZGVyIGZpbGUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19zaW1oLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbmNsdWRlL3JlbW90ZS1zaW0uaCIgOyB0aGVuCi0JYWNfY3ZfY19zaW1oPWAoY2QgJHtzcmNkaXJ9LyRpL2luY2x1ZGU7IHB3ZClgCi0JYnJlYWsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2Nfc2ltaH0iICE9IHg7IHRoZW4KLSAgICBTSU1IRElSPSItSSR7YWNfY3ZfY19zaW1ofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19zaW1ofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoU0lNSERJUikKLQotZG5sIFNlZSB3aGV0aGVyIGl0J3MgYSBkZXZvIG9yIEZvdW5kcnkgYnJhbmNoIHNpbXVsYXRvcgotQUNfTVNHX0NIRUNLSU5HKFdoZXRoZXIgdGhpcyBpcyBhIGRldm8gc2ltdWxhdG9yICkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3NpbWRldm8sWwotICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJFNJTUhESVIiCi0gICAgQUNfRUdSRVBfSEVBREVSKFtTSU1fREVTQyBzaW1fb3Blbi4qc3RydWN0IF9iZmRdLCByZW1vdGUtc2ltLmgsCi0gICAgICAgIGFjX2N2X2Nfc2ltZGV2bz15ZXMsCi0gICAgICAgIGFjX2N2X2Nfc2ltZGV2bz1ubykKLV0pCi1pZiB0ZXN0IHgiJGFjX2N2X2Nfc2ltZGV2byIgPSB4InllcyIgOyB0aGVuCi0gICAgQUNfREVGSU5FKEhBVkVfREVWT19TSU0pCi1maQotQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfc2ltZGV2b30pCi1BQ19TVUJTVChIQVZFX0RFVk9fU0lNKQotCi1kbmwgTmV4dCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgc2ltdWxhdG9yIGxpYnJhcnkpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19zaW1saWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvc2ltLyR0YXJnZXRfZGlyL01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX3NpbWxpYj1gKGNkICRpL3NpbS8kdGFyZ2V0X2RpcjsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2Nfc2ltbGlifSIgIT0geDsgdGhlbgotICAgIFNJTUxJQj0iLUwke2FjX2N2X2Nfc2ltbGlifSIKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICAgZG5sIEZJWE1FOiB0aGlzIGlzIGtpbmRhIGJvZ3VzLCBjYXVzZSB1bXRpbWF0ZWx5IHRoZSBUTSB3aWxsIGJ1aWxkCi0gICAgZG5sIGFsbCB0aGUgbGlicmFyaWVzIGZvciBzZXZlcmFsIGFyY2hpdGVjdHVyZXMuIEJ1dCBmb3Igbm93LCB0aGlzCi0gICAgZG5sIHdpbGwgd29yayB0aWxsIHRoZW4uCi1kbmwgICAgIEFDX01TR19DSEVDS0lORyhmb3IgdGhlIHNpbXVsYXRvciBpbnN0YWxsZWQgd2l0aCB0aGUgY29tcGlsZXIgbGlicmFyaWVzKQotICAgIGRubCBUcmFuc2Zvcm0gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIHRvIGl0J3MgY3Jvc3MgdmFyaWFudCwgdW5sZXNzCi0gICAgZG5sIENYWCBpcyBzZXQuIFRoaXMgaXMgYWxzbyB3aGF0IENYWCBnZXRzIHNldCB0byBpbiB0aGUgZ2VuZXJhdGVkCi0gICAgZG5sIE1ha2VmaWxlLgotICAgIENST1NTX0dDQz1gZWNobyBnY2MgfCBzZWQgLWUgInMvXi8kdGFyZ2V0LyJgCi0KLSAgICBkbmwgR2V0IEcrKydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotY2hhbmdlcXVvdGUoLCkKLSAgICBnY2NwYXRoPWAke0NST1NTX0dDQ30gLS1wcmludC1saWJnY2MgfCBzZWQgLWUgJ3M6W2EtejAtOUEtWlwuXC1dKi9saWJnY2MuYTo6JyAtZSAnczpsaWIvZ2NjLWxpYi86OidgbGliCi1jaGFuZ2VxdW90ZShbLF0pCi0gICAgaWYgdGVzdCAtZiAkZ2NjcGF0aC9saWJzaW0uYSAtbyAtZiAkZ2NjcGF0aC9saWJzaW0uc28gOyB0aGVuCi0gICAgICAgIGFjX2N2X2Nfc2ltbGliPSIkZ2NjcGF0aC8iCi0gICAgICAgIFNJTUxJQj0iLUwke2FjX2N2X2Nfc2ltbGlifSIKLQlBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19zaW1saWJ9KQotICAgIGVsc2UKLSAgICAgICAgQU1fQ09ORElUSU9OQUwoUFNJTSwgdGVzdCB4JHBzaW0gPSB4bm8pCi0JU0lNTElCPSIiCi0JQUNfTVNHX1JFU1VMVChub25lKQotZG5sICAgICAgICAgYWNfY3ZfY19zaW1saWI9bm9uZQotICAgIGZpCi1maQotQUNfU1VCU1QoU0lNTElCKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJJQkVSVFksIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmliLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2xpYmliZXJ0eS9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19saWJpYj1gKGNkICRpL2xpYmliZXJ0eS87IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmlifSIgIT0geDsgdGhlbgotICAgIExJQklCRVJUWT0iLUwke2FjX2N2X2NfbGliaWJ9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmlifSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoTElCSUJFUlRZKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1BQ19ERUZVTihDWUdfQUNfUEFUSF9ERVZPLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGRldm8gaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfZGV2b2gsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2luY2x1ZGUvcmVtb3RlLXNpbS5oIiA7IHRoZW4KLQlhY19jdl9jX2Rldm9oPWAoY2QgJHtzcmNkaXJ9LyRpL2luY2x1ZGU7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2Rldm9ofSIgIT0geDsgdGhlbgotICAgIERFVk9IRElSPSItSSR7YWNfY3ZfY19kZXZvaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfZGV2b2h9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChERVZPSERJUikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIGZpbmQgdGhlIElERSBsaWJyYXJ5IGFuZCBoZWFkZXJzLgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSURFLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElERSBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1JREVIRElSPQotSURFTElCPQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRlaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvbGliaWRlL3NyYy9ldmVudC5oIiA7IHRoZW4KLQlhY19jdl9jX2lkZWg9YChjZCAke3NyY2Rpcn0vJGkvbGliaWRlL3NyYzsgcHdkKWA7Ci0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWh9IiAhPSB4OyB0aGVuCi0gICAgSURFSERJUj0iLUkke2FjX2N2X2NfaWRlaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRlaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBMSUJJREUgVENMIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRldGNsaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvbGliaWRldGNsL3NyYy9pZGV0Y2wuaCIgOyB0aGVuCi0JYWNfY3ZfY19pZGV0Y2xoPWAoY2QgJHtzcmNkaXJ9LyRpL2xpYmlkZXRjbC9zcmM7IHB3ZClgOwotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGV0Y2xofSIgIT0geDsgdGhlbgotICAgIElERUhESVI9IiR7SURFSERJUn0gLUkke2FjX2N2X2NfaWRldGNsaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRldGNsaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgaGVhZGVycyBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZWgyLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2xpYmlkZS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfaWRlaDI9YChjZCAkaS9saWJpZGUvc3JjOyBwd2QpYDsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWRlaDJ9IiAhPSB4OyB0aGVuCi0gICAgSURFSERJUj0iJHtJREVIRElSfSAtSSR7YWNfY3ZfY19pZGVoMn0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRlaDJ9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLWRubCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgbGlicmFyeSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZWxpYixbCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWxpYn0iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2xpYmlkZS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotICAgICAgICBhY19jdl9jX2lkZWxpYj1gKGNkICRpL2xpYmlkZS9zcmM7IHB3ZClgCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLWZpXSkgCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWxpYn0iICE9IHggOyB0aGVuCi0gICAgIElERUxJQj0iLUwke2FjX2N2X2NfaWRlbGlifSIKLSAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRlbGlifSkKLWVsc2UKLSAgICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotZG5sIGZpbmQgbGliaWRkZXRjbC5hIGlmIGl0IGV4aXN0cwotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgVENMIGxpYnJhcnkpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pZGV0Y2xsaWIsWwotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGV0Y2xsaWJ9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9saWJpZGV0Y2wvc3JjL01ha2VmaWxlIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pZGV0Y2xsaWI9YChjZCAkaS9saWJpZGV0Y2wvc3JjOyBwd2QpYAotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi1maQotXSkgCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZXRjbGxpYn0iICE9IHggOyB0aGVuCi0gICAgIElERUxJQj0iJHtJREVMSUJ9IC1MJHthY19jdl9jX2lkZXRjbGxpYn0iCi0gICAgIElERVRDTExJQj0iLWxpZGV0Y2wiCi0gICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZXRjbGxpYn0pCi1lbHNlCi0gICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChJREVIRElSKQotQUNfU1VCU1QoSURFTElCKQotQUNfU1VCU1QoSURFVENMTElCKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCBhbGwgdGhlIElMVSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lMVSwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUga2VybmVsIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWgsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2tlcm5lbC9tZXRob2QuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoPWAoY2QgJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2tlcm5lbDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1aH0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSItSSR7YWNfY3ZfY19pbHVofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElMVSBrZXJuZWwgaGVhZGVycyBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVoNSxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9pbHUvcnVudGltZS9rZXJuZWwvaWx1Y29uZi5oIiA7IHRoZW4KLQlhY19jdl9jX2lsdWg1PWAoY2QgJGkvaWx1L3J1bnRpbWUva2VybmVsOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVoNX0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSIke0lMVUhESVJ9IC1JJHthY19jdl9jX2lsdWg1fSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVoNX0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgQysrIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9zdHViYmVycy9jcHAvcmVzb3VyY2UuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoMj1gKGNkICR7c3JjZGlyfS8kaS9pbHUvc3R1YmJlcnMvY3BwOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVoMn0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSIke0lMVUhESVJ9IC1JJHthY19jdl9jX2lsdWgyfSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVoMn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgQyBoZWFkZXJzKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDMsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9zdHViYmVycy9jL3Jlc291cmNlLmgiIDsgdGhlbgotCWFjX2N2X2NfaWx1aDM9YChjZCAke3NyY2Rpcn0vJGkvaWx1L3N0dWJiZXJzL2MgIDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1aDN9IiAhPSB4OyB0aGVuCi0gICAgSUxVSERJUj0iJHtJTFVIRElSfSAtSSR7YWNfY3ZfY19pbHVoM30iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aDN9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgSUxVIEMgcnVudGltZSBoZWFkZXJzKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDQsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2MvaWx1Y3N0dWIuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoND1gKGNkICR7c3JjZGlyfS8kaS9pbHUvcnVudGltZS9jICA7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lsdWg0fSIgIT0geDsgdGhlbgotICAgIElMVUhESVI9IiR7SUxVSERJUn0gLUkke2FjX2N2X2NfaWx1aDR9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lsdWg0fSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVwYXRoLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2lsdS9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19pbHVwYXRoPWAoY2QgJGkvaWx1OyBwd2QpYAotCWJyZWFrCi0gICAgZmkKLWRvbmUKLV0pCi1JTFVUT1A9JHthY19jdl9jX2lsdXBhdGh9Ci0KLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1bGliLFsKLWlmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9rZXJuZWwvTWFrZWZpbGUiIDsgdGhlbgotICAgIGFjX2N2X2NfaWx1bGliPWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2tlcm5lbDsgcHdkKWAKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWJ9L2xpYmlsdS5hKQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm8pCi1maV0pCi0gICAKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBDKysgYmluZGluZ3MgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYjIsWwotaWYgdGVzdCAtZiAiJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2NwcC9NYWtlZmlsZSIgOyB0aGVuCi0gICAgYWNfY3ZfY19pbHVsaWIyPWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2NwcDsgcHdkKWAKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWIyfS9saWJpbHUtYysrLmEpCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLWZpXSkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgSUxVIEMgYmluZGluZ3MgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYjMsWwotaWYgdGVzdCAtZiAiJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2MvTWFrZWZpbGUiIDsgdGhlbgotICAgIGFjX2N2X2NfaWx1bGliMz1gKGNkICRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9jOyBwd2QpYAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJHthY19jdl9jX2lsdWxpYjN9L2xpYmlsdS1jLmEpCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLWZpXSkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgSUxVIFRrIGJpbmRpbmdzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWI0LFsKLWlmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9tYWlubG9vcC9NYWtlZmlsZSIgOyB0aGVuCi0gICAgYWNfY3ZfY19pbHVsaWI0PWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL21haW5sb29wOyBwd2QpYAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJHthY19jdl9jX2lsdWxpYjR9L2xpYmlsdS10ay5hKQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm8pCi1maV0pCi0KLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1bGlifSIgPSB4IC1hIHgiJHthY19jdl9jX2lsdWxpYjJ9IiA9IHg7IHRoZW4KLSAgSUxVSERJUj0iIgotZmkKLQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVsaWJ9IiAhPSB4IC1hIHgiJHthY19jdl9jX2lsdWxpYjJ9IiAhPSB4OyB0aGVuCi0gICAgSUxVTElCPSItTCR7YWNfY3ZfY19pbHVsaWJ9IC1MJHthY19jdl9jX2lsdWxpYjJ9IC1MJHthY19jdl9jX2lsdWxpYjN9IC1MJHthY19jdl9jX2lsdWxpYjR9IgotZWxzZQotICAgIElMVUxJQj0iIgotZmkKLQotaWYgdGVzdCB4IiR7SUxVTElCfSIgPSB4OyB0aGVuCi0gICAgQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgbGlicmFyaWVzIGluc3RhbGxlZCB3aXRoIHRoZSBjb21waWxlcikKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWI1LFsKLSAgICBOQVRJVkVfR0NDPWBlY2hvIGdjYyB8IHNlZCAtZSAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSJgCi0KLSAgICBkbmwgR2V0IEcrKydzIGZ1bGwgcGF0aCB0byBpdCdzIGxpYnJhcmllcwotICAgIGFjX2N2X2NfaWx1bGliNT1gJHtOQVRJVkVfR0NDfSAtLXByaW50LWxpYmdjYyB8IHNlZCAtZSAnczpsaWIvZ2NjLWxpYi8uKjo6J2BsaWIKLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX2lsdWxpYjUvbGliaWx1LWMuYSAtbyAtZiAkYWNfY3ZfY19pbHVsaWI1L2xpYmlsdS1jLnNvIDsgdGhlbgotICAgICAgICBpZiB0ZXN0IHgiJHtJTFVIRElSfSIgPSB4OyB0aGVuCi0gICAgICAgICAgICAgICBJTFVIRElSPSItSSR7YWNfY3ZfY19pbHVsaWI1fS8uLi9pbmNsdWRlIgotICAgICAgICBmaQotICAgICAgICBJTFVMSUI9Ii1MJHthY19jdl9jX2lsdWxpYjV9IgotICAgICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVsaWI1fSkKLSAgICBlbHNlCi0gICAgICAgIGFjX2N2X2NfaWx1bGliPW5vbmUKLSAgICAgICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgIGZpCi1maV0pCi1BQ19TVUJTVChJTFVIRElSKQotQUNfU1VCU1QoSUxVTElCKQotQUNfU1VCU1QoSUxVVE9QKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgVGhpcyBkZWZpbmVzIHRoZSBieXRlIG9yZGVyIGZvciB0aGUgaG9zdC4gV2UgY2FuJ3QgdXNlCi1kbmwgQUNfQ19CSUdFTkRJQU4sIGNhdXNlIHdlIHdhbnQgdG8gY3JlYXRlIGEgY29uZmlnIGZpbGUgYW5kCi1kbmwgc3Vic3RpdHVlIHRoZSByZWFsIHZhbHVlLCBzbyB0aGUgaGVhZGVyIGZpbGVzIHdvcmsgcmlnaHQKLUFDX0RFRlVOKENZR19BQ19DX0VORElBTiwgWwotQUNfTVNHX0NIRUNLSU5HKHRvIHNlZSBpZiB0aGlzIGlzIGEgbGl0dGxlIGVuZGlhbiBob3N0KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGl0dGxlX2VuZGlhbiwgWwotYWNfY3ZfY19saXR0bGVfZW5kaWFuPXVua25vd24KLSMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCi1BQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPl0sIFsKLSNpZiAhQllURV9PUkRFUiB8fCAhX0JJR19FTkRJQU4gfHwgIV9MSVRUTEVfRU5ESUFOCi0gYm9ndXMgZW5kaWFuIG1hY3JvcwotI2VuZGlmXSwgWyMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gX0xJVFRMRV9FTkRJQU4gb3Igbm90LgotQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD5dLCBbCi0jaWYgQllURV9PUkRFUiAhPSBfTElUVExFX0VORElBTgotIG5vdCBiaWcgZW5kaWFuCi0jZW5kaWZdLCBhY19jdl9jX2xpdHRsZV9lbmRpYW49eWVzLCBhY19jdl9jX2xpdHRsZV9lbmRpYW49bm8pCi1dKQotaWYgdGVzdCAke2FjX2N2X2NfbGl0dGxlX2VuZGlhbn0gPSB1bmtub3duOyB0aGVuCi1vbGRfY2ZsYWdzPSRDRkxBR1MKLUNGTEFHUz0tZwotQUNfVFJZX1JVTihbCi1tYWluICgpIHsKLSAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsOwotICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKLSAgfSB1OwotICB1LmwgPSAxOwotICBleGl0ICh1LmNbMF0gPT0gMSk7Ci19XSwKLWFjX2N2X2NfbGl0dGxlX2VuZGlhbj1ubywKLWFjX2N2X2NfbGl0dGxlX2VuZGlhbj15ZXMsWwotZG5sIFllcywgdGhpcyBpcyB1Z2x5LCBhbmQgb25seSB1c2VkIGZvciBhIGNhbmFkaWFuIGNyb3NzIGFueXdheS4gVGhpcwotZG5sIGlzIGp1c3QgdG8ga2VlcCBjb25maWd1cmUgZnJvbSBzdG9wcGluZyBoZXJlLgotY2FzZSAiJHtob3N0fSIgaW4KLWNoYW5nZXF1b3RlKCwpCi0gICBpWzM0NTZdODYtKi0qKSBhY19jdl9jX2xpdHRsZV9lbmRpYW49eWVzIDs7Ci0gICBzcGFyYyotKi0qKSAgICBhY19jdl9jX2xpdHRsZV9lbmRpYW49bm8gOzsKLWNoYW5nZXF1b3RlKFssXSkKLSAgKikgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgY3Jvc3MgY29tcGlsZSB0aGlzIHRlc3QpIDs7Ci1lc2FjXSkKLUNGTEFHUz0kb2xkX2NmbGFncwotZmldKQotCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpdHRsZV9lbmRpYW59IiA9IHh5ZXM7IHRoZW4KLSAgICBBQ19ERUZJTkUoTElUVExFX0VORElBTl9IT1NUKQotICAgIEVORElBTj0iQ1lHX0xTQkZJUlNUIjsKLWVsc2UKLSAgICBFTkRJQU49IkNZR19NU0JGSVJTVCI7Ci1maQotQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGl0dGxlX2VuZGlhbn0pCi1BQ19TVUJTVChFTkRJQU4pCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBMb29rIGZvciB0aGUgcGF0aCB0byBsaWJnY2MsIHNvIHdlIGNhbiB1c2UgaXQgdG8gZGlyZWN0bHkgbGluawotZG5sIGluIGxpYmdjYy5hIHdpdGggTEQuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHQ0MsCi1bQUNfTVNHX0NIRUNLSU5HKFtMb29raW5nIGZvciB0aGUgcGF0aCB0byBsaWJnY2MuYV0pCi1BQ19MQU5HX1NBVkUKLUFDX0xBTkdfQwotCi1kbmwgR2V0IEdjYydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotbGliZ2NjcGF0aD1gJHtDQ30gLS1wcmludC1saWJnY2NgCi0KLWRubCBJZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3aXRoIGxpYmdjYy5hIG9uIHRoZSBlbmQsIHRoaXMgaXNuJ3QgRysrLgotaWYgdGVzdCBgZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovLiovOjonYCA9IGxpYmdjYy5hIDsgdGhlbgotICAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gICBhY19jdl9wcm9nX2djYz1ubwotZmkKLQotZG5sIAotaWYgdGVzdCB4IiR7YWNfY3ZfcHJvZ19nY2N9IiA9IHh5ZXMgOyB0aGVuCi0gICBnY2NwYXRoPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi9saWJnY2MuYTo6J2AKLSAgIExJQkdDQz0iLUwke2djY3BhdGh9IgotICAgQUNfTVNHX1JFU1VMVCgke2djY3BhdGh9KQotZWxzZQotICAgTElCR0NDPSIiCi0gICBBQ19NU0dfRVJST1IoTm90IHVzaW5nIGdjYykKLWZpCi0KLUFDX0xBTkdfUkVTVE9SRQotQUNfU1VCU1QoTElCR0NDKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi1kbmwgV2FybmluZzogdHJhbnNpdGlvbiBvZiB2ZXJzaW9uIDkgdG8gMTAgd2lsbCBicmVhayB0aGlzIGFsZ29yaXRobQotZG5sIGJlY2F1c2UgMTAgc29ydHMgYmVmb3JlIDkuIFdlIGFsc28gbG9vayBmb3IganVzdCB0Y2wuIFdlIGhhdmUgdG8KLWRubCBiZSBjYXJlZnVsIHRoYXQgd2UgZG9uJ3QgbWF0Y2ggc3R1ZmYgbGlrZSB0Y2xYIGJ5IGFjY2lkZW50LgotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC10Y2xpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9UQ0wsIFsKLSAgICBDWUdfQUNfUEFUSF9UQ0xICi0gICAgQ1lHX0FDX1BBVEhfVENMQ09ORklHCi0gICAgQ1lHX0FDX0xPQURfVENMQ09ORklHCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVENMSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX3RjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIFRjbCBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0FSR19XSVRIKHRjbGluY2x1ZGUsIFsgIC0td2l0aC10Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0Y2wgaGVhZGVycyBhcmVdLCB3aXRoX3RjbGluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3RjbGgsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX3RjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF90Y2xpbmNsdWRlfS90Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX3RjbGg9YChjZCAke3dpdGhfdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfdGNsaW5jbHVkZX0vZ2VuZXJpYy90Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX3RjbGg9YChjZCAke3dpdGhfdGNsaW5jbHVkZX0vZ2VuZXJpYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGNsIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX3RjbGNvbmZpZy8kaS9nZW5lcmljL3RjbC5oIDsgdGhlbgotICAgICAgYWNfY3ZfY190Y2xoPWAoY2QgJGFjX2N2X2NfdGNsY29uZmlnLyRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUY2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICB0Y2xwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBUY2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgIGZvciBpIGluIGBscyAtZHIgJHRjbHBhdGgvdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfdGNsaD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgY2hlY2sgaWYgaXRzIGluc3RhbGxlZCB3aXRoIHRoZSBjb21waWxlcgotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0gICAgY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvaW5jbHVkZQotICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90Y2wuaDsgdGhlbgotICAgICAgICBhY19jdl9jX3RjbGg9JGNjcGF0aAotICAgIGZpCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgIEFDX0NIRUNLX0hFQURFUih0Y2wuaCwgYWNfY3ZfY190Y2xoPWluc3RhbGxlZCwgYWNfY3ZfY190Y2xoPSIiKQotZWxzZQotICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGNsaH0pCi1maQotXSkKLSAgVENMSERJUj0iIgotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBhbnkgVGNsIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iICE9IHggOyB0aGVuCi0gICAgbm9fdGNsPSIiCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotCWlmIHRlc3QgeCIke0NDfSIgPSB4Y2wgOyB0aGVuCi0JICAgIHRtcD0iYGN5Z3BhdGggLS13aW5kb3dzICR7YWNfY3ZfY190Y2xofWAiCi0JICAgIGFjX2N2X2NfdGNsaD0iYGVjaG8gJHRtcCB8IHNlZCAtZSBzI1xcXFxcXFxcIy8jZ2AiCi0JZmkKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGNsaH0pCi0gICAgICAgIFRDTEhESVI9Ii1JJHthY19jdl9jX3RjbGh9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChUQ0xIRElSKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgdGNsIGNvbmZpZ3VyYXRpb24KLUFDX0RFRlVOKENZR19BQ19QQVRIX1RDTENPTkZJRywgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGNsY29uZmlnCi1pZiB0ZXN0IHgiJHtub190Y2x9IiA9IHggOyB0aGVuCi0gIGRubCB3ZSByZXNldCBub190Y2wgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICAgIG5vX3RjbD10cnVlCi0gICAgQUNfQVJHX1dJVEgodGNsY29uZmlnLCBbICAtLXdpdGgtdGNsY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0Y2wgY29uZmlndXJhdGlvbiAodGNsQ29uZmlnLnNoKV0sCi0gICAgICAgICB3aXRoX3RjbGNvbmZpZz0ke3dpdGh2YWx9KQotICAgIEFDX01TR19DSEVDS0lORyhbZm9yIFRjbCBjb25maWd1cmF0aW9uIHNjcmlwdF0pCi0gICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGNsY29uZmlnLFsKLQotICAgIGRubCBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRjbGNvbmZpZyB3YXMgc3BlY2lmaWVkLgotICAgIGlmIHRlc3QgeCIke3dpdGhfdGNsY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt3aXRoX3RjbGNvbmZpZ30vdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfdGNsY29uZmlnPWAoY2QgJHt3aXRoX3RjbGNvbmZpZ307IHB3ZClgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RjbGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0Y2xDb25maWcuc2hdKQotICAgICAgICBmaQotICAgIGZpCi0KLSAgICBkbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGNsIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgc291cmNlIHRyZWUKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvJGkvdW5peC90Y2xDb25maWcuc2ggOyB0aGVuCi0gICAgICAgICAgICAgICAgYWNfY3ZfY190Y2xjb25maWc9YChjZCAkc3JjZGlyLyRpL3VuaXg7IHB3ZClgCi0JICAgICAgICBicmVhawotICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotICAgIGZpCi0gICAgZG5sIGNoZWNrIGluIGEgZmV3IG90aGVyIGxvY2F0aW9ucwotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRjbCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkaS90Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgICAgICB0Y2xjb25mcGF0aD0kaQotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotCi0gICAgICAgIGRubCBmaW5kIHRoZSBleGFjdCBUY2wgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICAgICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgICAgICBmb3IgaSBpbiBgbHMgLWRyICR0Y2xjb25mcGF0aC90Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtZiAkaS91bml4L3RjbENvbmZpZy5zaCA7IHRoZW4KLSAgICAgICAgICAgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICRpL3VuaXg7IHB3ZClgCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgZG5sIENoZWNrIHRvIHNlZSBpZiBpdCdzIGluc3RhbGxlZC4gV2UgaGF2ZSB0byBsb29rIGluIHRoZSAkQ0MgcGF0aAotICAgIGRubCB0byBmaW5kIGl0LCBjYXVzZSBvdXIgJHByZWZpeCBtYXkgbm90IG1hdGNoIHRoZSBjb21waWxlcnMuCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0JY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvbGliCi0gICAgICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90Y2xDb25maWcuc2g7IHRoZW4KLQkgICAgYWNfY3ZfY190Y2xjb25maWc9JGNjcGF0aAotICAgICAgICBmaQotICAgIGZpCi0gICAgXSkJZG5sIGVuZCBvZiBjYWNoZV92YWwKLQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBUQ0xDT05GSUc9IiIKLSAgICAgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBUY2wgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKLSAgICBlbHNlCi0gICAgICAgIG5vX3RjbD0iIgotICAgICAgICBUQ0xDT05GSUc9JHthY19jdl9jX3RjbGNvbmZpZ30vdGNsQ29uZmlnLnNoCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHtUQ0xDT05GSUd9KQotICAgICBmaQotZmkKLUFDX1NVQlNUKFRDTENPTkZJRykKLV0pCi0KLWRubCBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi1kbmwgZnJvbSBQQVRIX1RDTENPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCi1BQ19ERUZVTihDWUdfQUNfTE9BRF9UQ0xDT05GSUcsIFsKLSAgICAuICRUQ0xDT05GSUcKLQotZG5sIEFDX1NVQlNUKFRDTF9WRVJTSU9OKQotZG5sIEFDX1NVQlNUKFRDTF9NQUpPUl9WRVJTSU9OKQotZG5sIEFDX1NVQlNUKFRDTF9NSU5PUl9WRVJTSU9OKQotZG5sIEFDX1NVQlNUKFRDTF9DQykKLSAgICBBQ19TVUJTVChUQ0xfREVGUykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi0gICAgQUNfU1VCU1QoVENMX0xJQl9GSUxFKQotICAgIEFDX1NVQlNUKFRDTF9MSUJfRlVMTF9QQVRIKQotICAgIEFDX1NVQlNUKFRDTF9MSUJTKQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVENMX1BSRUZJWCkKLQotICAgIEFDX1NVQlNUKFRDTF9DRkxBR1MpCi0KLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sICAgIEFDX1NVQlNUKFRDTF9FWEVDX1BSRUZJWCkKLQotICAgIEFDX1NVQlNUKFRDTF9TSExJQl9DRkxBR1MpCi0gICAgQUNfU1VCU1QoVENMX1NITElCX0xEKQotZG5sIGRvbid0IGV4cG9ydCwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKLWRubCBBQ19TVUJTVChUQ0xfU0hMSUJfTERfTElCUykKLWRubCBBQ19TVUJTVChUQ0xfU0hMSUJfU1VGRklYKQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgQUNfU1VCU1QoVENMX0RMX0xJQlMpCi0gICAgQUNfU1VCU1QoVENMX0xEX0ZMQUdTKQotICAgIEFDX1NVQlNUKFRDTF9MRF9TRUFSQ0hfRkxBR1MpCi1kbmwgZG9uJ3QgZXhwb3J0LCBub3QgdXNlZCBvdXRzaWRlIG9mIGNvbmZpZ3VyZQotZG5sIEFDX1NVQlNUKFRDTF9DT01QQVRfT0JKUykKLSAgICBBQ19TVUJTVChUQ0xfUkFOTElCKQotICAgIEFDX1NVQlNUKFRDTF9CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChUQ0xfTElCX1NQRUMpCi1kbmwgQUNfU1VCU1QoVENMX0xJQl9WRVJTSU9OU19PSykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVENMX1NIQVJFRF9MSUJfU1VGRklYKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUQ0xfVU5TSEFSRURfTElCX1NVRkZJWCkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVEssIFsKLSAgICBDWUdfQUNfUEFUSF9US0gKLSAgICBDWUdfQUNfUEFUSF9US0NPTkZJRwotICAgIENZR19BQ19MT0FEX1RLQ09ORklHCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVEtILCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIHRrIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi0jIElmIHRoZSBkaXJlY3RvcnkgKHByZXN1bWFibHkgc3ltbGluaykgbmFtZWQgInRrIiBleGlzdHMsIHVzZSB0aGF0IG9uZQotIyBpbiBwcmVmZXJlbmNlIHRvIGFueSBvdGhlcnMuICBTYW1lIGxvZ2ljIGlzIHVzZWQgd2hlbiBjaG9vc2luZyBsaWJyYXJ5Ci0jIGFuZCBhZ2FpbiB3aXRoIFRjbC4gVGhlIHNlYXJjaCBvcmRlciBpcyB0aGUgYmVzdCBwbGFjZSB0byBsb29rIGZpcnN0LCB0aGVuIGluCi0jIGRlY3JlYXNpbmcgc2lnbmlmaWNhbmNlLiBUaGUgbG9vcCBicmVha3MgaWYgdGhlIHRyaWdnZXIgZmlsZSBpcyBmb3VuZC4KLSMgTm90ZSB0aGUgZ3Jvc3MgbGl0dGxlIGNvbnZlcnNpb24gaGVyZSBvZiBzcmNkaXIgYnkgY2QnaW5nIHRvIHRoZSBmb3VuZAotIyBkaXJlY3RvcnkuIFRoaXMgY29udmVydHMgdGhlIHBhdGggZnJvbSBhIHJlbGF0aXZlIHRvIGFuIGFic29sdXRlLCBzbwotIyByZWN1cnNpdmUgY2FjaGUgdmFyaWFibGVzIGZvciB0aGUgcGF0aCB3aWxsIHdvcmsgcmlnaHQuIFdlIGNoZWNrIGFsbAotIyB0aGUgcG9zc2libGUgcGF0aHMgaW4gb25lIGxvb3AgcmF0aGVyIHRoYW4gbWFueSBzZXBlcmF0ZSBsb29wcyB0byBzcGVlZAotIyB0aGluZ3MgdXAuCi0jIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC10a2luY2x1ZGUKLSMKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub190az10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIFRrIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgodGtpbmNsdWRlLCBbICAtLXdpdGgtdGtpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0ayBoZWFkZXJzIGFyZV0sIHdpdGhfdGtpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY190a2gsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGtpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfdGtpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfdGtpbmNsdWRlfS90ay5oIDsgdGhlbgotICAgIGFjX2N2X2NfdGtoPWAoY2QgJHt3aXRoX3RraW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfdGtpbmNsdWRlfS9nZW5lcmljL3RrLmggOyB0aGVuCi0gICAgYWNfY3ZfY190a2g9YChjZCAke3dpdGhfdGtpbmNsdWRlfS9nZW5lcmljOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGtpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRrIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iICE9IHggOyB0aGVuCi0gIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfdGtjb25maWcvJGkvZ2VuZXJpYy90ay5oIDsgdGhlbgotICAgICAgYWNfY3ZfY190a2g9YChjZCAkYWNfY3ZfY190a2NvbmZpZy8kaS9nZW5lcmljOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUayBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS90ayogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgdGtwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBUayBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUaywgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICR0a3BhdGgvdGsqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGsuaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX3RraD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlci4gV2UgZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiB1c2luZwotICAgIGRubCBBQ19DSEVDS19IRUFERVIsIGNhdXNlIHRoaXMgZG9lc24ndCBkZXBlbmQgaW4gaGF2aW5nIFggY29uZmlndXJlZC4KLSAgICBjY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9pbmNsdWRlCi0gICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RrLmg7IHRoZW4KLQlhY19jdl9jX3RraD0kY2NwYXRoCi0gICAgZmkKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RraH0pCi1maQotXSkKLSAgVEtIRElSPSIiCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgYW55IFRrIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgIT0geCA7IHRoZW4KLSAgICBub190az0iIgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotCWlmIHRlc3QgeCIke0NDfSIgPSB4Y2wgOyB0aGVuCi0JICAgIHRtcD0iYGN5Z3BhdGggLS13aW5kb3dzICR7YWNfY3ZfY190a2h9YCIKLQkgICAgYWNfY3ZfY190a2g9ImBlY2hvICR0bXAgfCBzZWQgLWUgcyNcXFxcXFxcXCMvI2dgIgotCWZpCi0gICAgICAgIEFDX01TR19SRVNVTFQoW2ZvdW5kIGluICR7YWNfY3ZfY190a2h9XSkKLSAgICAgICAgVEtIRElSPSItSSR7YWNfY3ZfY190a2h9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChUS0hESVIpCi1dKQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9US0NPTkZJRywgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGtjb25maWcKLWlmIHRlc3QgeCIke25vX3RrfSIgPSB4IDsgdGhlbgotICBkbmwgd2UgcmVzZXQgbm9fdGsgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICAgIG5vX3RrPXRydWUKLSAgICBBQ19BUkdfV0lUSCh0a2NvbmZpZywgWyAgLS13aXRoLXRrY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0ayBjb25maWd1cmF0aW9uICh0a0NvbmZpZy5zaCldLAotICAgICAgICAgd2l0aF90a2NvbmZpZz0ke3dpdGh2YWx9KQotICAgIEFDX01TR19DSEVDS0lORyhbZm9yIFRrIGNvbmZpZ3VyYXRpb24gc2NyaXB0XSkKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY190a2NvbmZpZyxbCi0KLSAgICBkbmwgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10a2NvbmZpZyB3YXMgc3BlY2lmaWVkLgotICAgIGlmIHRlc3QgeCIke3dpdGhfdGtjb25maWd9IiAhPSB4IDsgdGhlbgotICAgICAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGtjb25maWd9L3RrQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAke3dpdGhfdGtjb25maWd9OyBwd2QpYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90a2NvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0a0NvbmZpZy5zaF0pCi0gICAgICAgIGZpCi0gICAgZmkKLQotICAgIGRubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUayBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHNvdXJjZSB0cmVlCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvJGkvdW5peC90a0NvbmZpZy5zaCA7IHRoZW4KLSAgICAgICAgICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJHNyY2Rpci8kaS91bml4OyBwd2QpYAotCSAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotICAgIGRubCBjaGVjayBpbiBhIGZldyBvdGhlciBsb2NhdGlvbnMKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRrIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRpL3RrKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICAgICAgdGtjb25mcGF0aD0kaQotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotCi0gICAgICAgIGRubCBmaW5kIHRoZSBleGFjdCBUayBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgICAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUaywgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICAgICAgZm9yIGkgaW4gYGxzIC1kciAkdGtjb25mcGF0aC90ayogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRpL3VuaXgvdGtDb25maWcuc2ggOyB0aGVuCi0gICAgICAgICAgICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICRpL3VuaXg7IHB3ZClgCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgZG5sIENoZWNrIHRvIHNlZSBpZiBpdCdzIGluc3RhbGxlZC4gV2UgaGF2ZSB0byBsb29rIGluIHRoZSAkQ0MgcGF0aAotICAgIGRubCB0byBmaW5kIGl0LCBjYXVzZSBvdXIgJHByZWZpeCBtYXkgbm90IG1hdGNoIHRoZSBjb21waWxlcnMuCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIKLQljY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9saWIKLSAgICAgICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RrQ29uZmlnLnNoOyB0aGVuCi0JICAgIGFjX2N2X2NfdGtjb25maWc9JGNjcGF0aAotICAgICAgICBmaQotICAgIGZpCi0gICAgXSkJZG5sIGVuZCBvZiBjYWNoZV92YWwKLQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIFRLQ09ORklHPSIiCi0gICAgICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGsgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKLSAgICBlbHNlCi0gICAgICAgIG5vX3RrPSIiCi0gICAgICAgIFRLQ09ORklHPSR7YWNfY3ZfY190a2NvbmZpZ30vdGtDb25maWcuc2gKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke1RLQ09ORklHfSkKLSAgICAgZmkKLWZpCi1BQ19TVUJTVChUS0NPTkZJRykKLV0pCi0KLWRubCBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi1kbmwgZnJvbSBQQVRIX1RLQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX1RLQ09ORklHLCBbCi0gICAgaWYgdGVzdCAtZiAiJFRLQ09ORklHIiA7IHRoZW4KLSAgICAgIC4gJFRLQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKFRLX1ZFUlNJT04pCi1kbmwgbm90IGFjdHVhbGx5IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUS19NQUpPUl9WRVJTSU9OKQotZG5sICAgIEFDX1NVQlNUKFRLX01JTk9SX1ZFUlNJT04pCi0gICAgQUNfU1VCU1QoVEtfREVGUykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi0gICAgQUNfU1VCU1QoVEtfTElCX0ZJTEUpCi0gICAgQUNfU1VCU1QoVEtfTElCX0ZVTExfUEFUSCkKLSAgICBBQ19TVUJTVChUS19MSUJTKQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVEtfUFJFRklYKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUS19FWEVDX1BSRUZJWCkKLSAgICBBQ19TVUJTVChUS19CVUlMRF9JTkNMVURFUykKLSAgICBBQ19TVUJTVChUS19YSU5DTFVERVMpCi0gICAgQUNfU1VCU1QoVEtfWExJQlNXKQotICAgIEFDX1NVQlNUKFRLX0JVSUxEX0xJQl9TUEVDKQotICAgIEFDX1NVQlNUKFRLX0xJQl9TUEVDKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1pdGNsaW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTCwgWwotICAgIENZR19BQ19QQVRIX0lUQ0xICi0gICAgQ1lHX0FDX1BBVEhfSVRDTExJQgotICAgIENZR19BQ19QQVRIX0lUQ0xTSAotICAgIENZR19BQ19QQVRIX0lUQ0xNS0lEWAotXSkKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xILCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9faXRjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIEl0Y2wgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19BUkdfV0lUSChpdGNsaW5jbHVkZSwgWyAgLS13aXRoLWl0Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSBpdGNsIGhlYWRlcnMgYXJlXSwgd2l0aF9pdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbGgsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF9pdGNsaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9pdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYy9pdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggSXRjbCBjb25maWd1cmF0aW9uIGZpbGUKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iICE9IHggOyB0aGVuCi0gIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfaXRjbGNvbmZpZy8kaS9zcmMvaXRjbC5oIDsgdGhlbgotICAgICAgYWNfY3ZfY19pdGNsaD1gKGNkICRhY19jdl9jX2l0Y2xjb25maWcvJGkvc3JjOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgaXRjbHBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IEl0Y2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgSXRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRpdGNscGF0aC9pdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9zcmMvaXRjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfaXRjbGg9YChjZCAkaS9zcmM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiA9IHggOyB0aGVuCi0gICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICBBQ19DSEVDS19IRUFERVIoaXRjbC5oLCBhY19jdl9jX2l0Y2xoPWluc3RhbGxlZCwgYWNfY3ZfY19pdGNsaD0iIikKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xofSkKLWZpCi1dKQotICBJVENMSERJUj0iIgotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgYW55IEl0Y2wgaGVhZGVyc10pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iICE9IHggOyB0aGVuCi0gICAgbm9faXRjbD0iIgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiAhPSB4Imluc3RhbGxlZCIgOyB0aGVuCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xofSkKLSAgICAgICAgSVRDTEhESVI9Ii1JJHthY19jdl9jX2l0Y2xofSIKLSAgICBmaQotZmkKLQotQUNfU1VCU1QoSVRDTEhESVIpCi1dKQotCi1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBsaWJyYXJ5Ci1kbmwgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLWl0Y2xsaWIKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xMSUIsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1pZiB0ZXN0IHgiJHtub19pdGNsfSIgPSB4IDsgdGhlbgotICAgIGRubCB3ZSByZXNldCBub19pdGNsIGluY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICAgIG5vX2l0Y2w9dHJ1ZQotICAgIEFDX0FSR19XSVRIKGl0Y2xsaWIsCi0JWyAgLS13aXRoLWl0Y2xsaWIgICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgaXRjbCBsaWJyYXJ5IGlzXSwKLSAgICAgICAgd2l0aF9pdGNsbGliPSR7d2l0aHZhbH0pCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSXRjbCBsaWJyYXJ5XSkKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsbGliLFsKLSAgICBkbmwgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsbGliIHdhcyBzcGVjaWZpZWQuCi0gICAgaWYgdGVzdCB4IiR7d2l0aF9pdGNsbGlifSIgIT0geCA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt3aXRoX2l0Y2xsaWJ9L2xpYml0Y2wkVENMX1NIQVJFRF9MSUJfU1VGRklYIiA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICR7d2l0aF9pdGNsbGlifTsgcHdkKWAvbGliaXRjbCRUQ0xfU0hBUkVEX0xJQl9TVUZGSVgKLQllbHNlCi0JICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsbGlifS9saWJpdGNsJFRDTF9VTlNIQVJFRF9MSUJfU1VGRklYIjsgdGhlbgotCSAJYWNfY3ZfY19pdGNsbGliPWAoY2QgJHt3aXRoX2l0Y2xsaWJ9OyBwd2QpYC9saWJpdGNsJFRDTF9VTlNIQVJFRF9MSUJfU1VGRklYCi0JICAgIGZpCi0JZmkKLSAgICBmaQotICAgIGRubCB0aGVuIGNoZWNrIGZvciBhICBJdGNsIGxpYnJhcnkuIFNpbmNlIHRoZXNlIGFyZSB1bmluc3RhbGxlZCwKLSAgICBkbmwgdXNlIHRoZSBzaW1wbGUgbGliIG5hbWUgcm9vdC4gCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgYnVpbGQgZGlyZWN0b3J5Ci0gICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkaS9pdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICAgICAgaXRjbHBhdGg9JGkvaXRjbAotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotICAgICAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgICAgIGlmIHRlc3QgLWYgIiRpdGNscGF0aC9zcmMvbGliaXRjbC4kVENMX1NITElCX1NVRkZJWCIgOyB0aGVuCi0JICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAkaXRjbHBhdGgvc3JjOyBwd2QpYAotICAgICAgICBlbGlmIHRlc3QgLWYgIiRpdGNscGF0aC9zcmMvbGliaXRjbC5hIjsgdGhlbgotCSAgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJGl0Y2xwYXRoL3NyYzsgcHdkKWAKLQlmaQotICAgIGZpCi0gICAgZG5sIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBmb3IgaSBpbiAke2Rpcmxpc3R9OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAke3NyY2Rpcn0vJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgICAgIGl0Y2xwYXRoPSR7c3JjZGlyfS8kaQotCSAgICAgICAgYnJlYWsKLQkgICAgZmkKLSAgICAgICAgZG9uZQotICAgICAgICBmb3IgaSBpbiBgbHMgLWRyICR7aXRjbHBhdGh9L2l0Y2wqIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICAgICAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICIkaS9zcmMvbGliaXRjbCRUQ0xfU0hMSUJfU1VGRklYIiA7IHRoZW4KLQkgICAgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICRpL3NyYzsgcHdkKWAKLQkgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbGlmIHRlc3QgLWYgIiRpL3NyYy9saWJpdGNsLmEiOyB0aGVuCi0JICAgICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAkaS9zcmM7IHB3ZClgCi0JICAgICAgICBicmVhawotCSAgICBmaQkKLSAgICAgICAgZG9uZQotICAgIGZpCi0KLSAgICBkbmwgc2VlIGlmIG9uZSBpcyBjb252ZW5pZW50bHkgaW5zdGFsbGVkIHdpdGggdGhlIGNvbXBpbGVyCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgotCWNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2xpYgotICAgICAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7Y2NwYXRofS9saWJpdGNsJFRDTF9TSExJQl9TVUZGSVgiIDsgdGhlbgotCSAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAke2NjcGF0aH07IHB3ZClgCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHtjY3BhdGh9L2xpYml0Y2wuYSI7IHRoZW4KLQkgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJHtjY3BhdGh9OyBwd2QpYAotICAgICAgICBmaQotICAgIGZpCi0gICAgXSkKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xsaWJ9IiA9IHggOyB0aGVuCi0gICAgICAgIElUQ0xMSUI9IiIKLSAgICAgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBJdGNsIGxpYnJhcnkpCi0gICAgZWxzZQotICAgICAgICBJVENMTElCPSItTCR7YWNfY3ZfY19pdGNsbGlifSIKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaXRjbGxpYn0pCi0gICAgICAgIG5vX2l0Y2w9IiIKLSAgICBmaQotZmkKLQotQUNfUFJPVklERShbJDBdKQotQUNfU1VCU1QoSVRDTExJQikKLV0pCi0KLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaXRjbF9zaCBzY3JpcHQKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtaXRjbGluY2x1ZGUKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xTSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX2l0Y2w9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgaXRjbF9zaCBzY3JpcHQpCi1BQ19BUkdfV0lUSChpdGNsaW5jbHVkZSwgWyAgLS13aXRoLWl0Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSBpdGNsIGhlYWRlcnMgYXJlXSwgd2l0aF9pdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbHNoLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfaXRjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vaXRjbF9zaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xzaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYy9pdGNsX3NoIDsgdGhlbgotICAgIGFjX2N2X2NfaXRjbHNoPWAoY2QgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGNsaW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGNsX3NoXSkKLSAgZmkKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xzaH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgaXRjbHBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IEl0Y2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgSXRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRpdGNscGF0aC9pdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9zcmMvaXRjbF9zaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX2l0Y2xzaD1gKGNkICRpL3NyYzsgcHdkKWAvaXRjbF9zaAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xzaH0iID0geCA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgIEFDX1BBVEhfUFJPRyhhY19jdl9jX2l0Y2xzaCwgaXRjbF9zaCkKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xzaH0pCi1maQotXSkKLQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIHRoZSBpdGNsX3NoIHNjcmlwdF0pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiAhPSB4IDsgdGhlbgotICAgIG5vX2l0Y2w9IiIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsc2h9KQotICAgIElUQ0xTSD0iJHthY19jdl9jX2l0Y2xzaH0iCi1maQotQUNfU1VCU1QoSVRDTFNIKQotXSkKLQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSBpdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBpdGNsX3NoIHNjcmlwdAotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1pdGNsaW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTE1LSURYLCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9faXRjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGl0Y2xfbWtpbmRleC50Y2wgc2NyaXB0KQotQUNfQVJHX1dJVEgoaXRjbGluY2x1ZGUsIFsgIC0td2l0aC1pdGNsaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgaXRjbCBoZWFkZXJzIGFyZV0sIHdpdGhfaXRjbGluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xta2lkeCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX2l0Y2xpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L2l0Y2xfc2ggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsbWtpZHg9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmMvaXRjbF9zaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xta2lkeD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbF9zaF0pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbWtpZHh9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBJdGNsIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgIGl0Y2xwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBJdGNsIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIEl0Y2wsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkaXRjbHBhdGgvaXRjbCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvbGlicmFyeS9pdGNsX21raW5kZXgudGNsIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfaXRjbG1raWR4PWAoY2QgJGkvbGlicmFyeTsgcHdkKWAvaXRjbF9ta2luZGV4LnRjbAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbG1raWR4fSIgPSB4IDsgdGhlbgotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0gICAgY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2Avc2hhcmUKLSAgICBkbmwgSXRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBsaWJyYXJ5IGluIHN1YmRpci4gIExvb2sgdGhlcmUgZmlyc3QuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkY2NwYXRoL2l0Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL2l0Y2xfbWtpbmRleC50Y2wgOyB0aGVuCi0gICAgICAgICAgICBhY19jdl9jX2l0Y2xta2lkeD1gKGNkICRpOyBwd2QpYC9pdGNsX21raW5kZXgudGNsCi0gICAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi1dKQotCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xta2lkeH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgdGhlIGl0Y2xfbWtpbmRleC50Y2wgc2NyaXB0XSkKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xta2lkeH0iICE9IHggOyB0aGVuCi0gICAgbm9faXRjbD0iIgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xta2lkeH0pCi0gICAgSVRDTE1LSURYPSIke2FjX2N2X2NfaXRjbG1raWR4fSIKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChJVENMTUtJRFgpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSB0aXggc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGl4aW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVElYLCBbCi0gICAgQ1lHX0FDX1BBVEhfVElYSAotICAgIENZR19BQ19QQVRIX1RJWExJQgotXSkKLUFDX0RFRlVOKENZR19BQ19QQVRIX1RJWEgsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub190aXg9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciBUaXggaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19BUkdfV0lUSCh0aXhpbmNsdWRlLCBbICAtLXdpdGgtdGl4aW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdGl4IGhlYWRlcnMgYXJlXSwgd2l0aF90aXhpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY190aXhoLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRpeGluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF90aXhpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfdGl4aW5jbHVkZX0vdGl4LmggOyB0aGVuCi0gICAgYWNfY3ZfY190aXhoPWAoY2QgJHt3aXRoX3RpeGluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX3RpeGluY2x1ZGV9L2dlbmVyaWMvdGl4LmggOyB0aGVuCi0gICAgYWNfY3ZfY190aXhoPWAoY2QgJHt3aXRoX3RpeGluY2x1ZGV9L2dlbmVyaWM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90aXhpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRpeCBjb25maWd1cmF0aW9uIGZpbGUKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgIT0geCA7IHRoZW4KLSAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfY3ZfY190aXhjb25maWcvJGkvZ2VuZXJpYy90aXguaCA7IHRoZW4KLSAgICAgIGFjX2N2X2NfdGl4aD1gKGNkICRhY19jdl9jX3RpeGNvbmZpZy8kaS9nZW5lcmljOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgVGl4IHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL3RpeCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgdGl4cGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGl4IHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIFRpeCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICR0aXhwYXRoL3RpeCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy90aXguaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX3RpeGg9YChjZCAkaS9nZW5lcmljOyBwd2QpYAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0KLSAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyLiBXZSBkbyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHVzaW5nCi0gICAgZG5sIEFDX0NIRUNLX0hFQURFUiwgY2F1c2UgdGhpcyBkb2Vzbid0IGRlcGVuZCBpbiBoYXZpbmcgWCBjb25maWd1cmVkLgotICAgIGNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2luY2x1ZGUKLSAgICBpZiB0ZXN0IC1mICRjY3BhdGgvdGl4Lmg7IHRoZW4KLQlhY19jdl9jX3RpeGg9aW5zdGFsbGVkCi0gICAgZmkKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RpeGh9KQotZmkKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIGFueSBUaXggaGVhZGVyc10pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgIT0geCA7IHRoZW4KLSAgICBub190aXg9IiIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY190aXhofSkKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiAhPSB4Imluc3RhbGxlZCIgOyB0aGVuCi0gICAgICAgIFRJWEhESVI9Ii1JJHthY19jdl9jX3RpeGh9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChUSVhIRElSKQotXSkKLQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVElYQ09ORklHLCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIHRpeCBjb25maWd1cmF0aW9uCi0jIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKLSMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGl4Y29uZmlnCi0jCi0KLWlmIHRlc3QgeCIke25vX3RpeH0iID0geCA7IHRoZW4KLSAgIyB3ZSByZXNldCBub190aXggaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICBub190aXg9dHJ1ZQotICBBQ19BUkdfV0lUSCh0aXhjb25maWcsIFsgIC0td2l0aC10aXhjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRpeCBjb25maWd1cmF0aW9uICh0aXhDb25maWcuc2gpXSwKLSAgICAgICAgIHdpdGhfdGl4Y29uZmlnPSR7d2l0aHZhbH0pCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIFRpeCBjb25maWd1cmF0aW9uXSkKLSAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGl4Y29uZmlnLFsKLQotICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGl4Y29uZmlnIHdhcyBzcGVjaWZpZWQuCi0gIGlmIHRlc3QgeCIke3dpdGhfdGl4Y29uZmlnfSIgIT0geCA7IHRoZW4KLSAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGl4Y29uZmlnfS90aXhDb25maWcuc2giIDsgdGhlbgotICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAke3dpdGhfdGl4Y29uZmlnfTsgcHdkKWAKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90aXhjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGl4Q29uZmlnLnNoXSkKLSAgICBmaQotICBmaQotCi0gICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIFRpeCBsaWJyYXJ5Ci0gIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJLi4vdGl4IFwKLQkJYGxzIC1kciAuLi90aXhbWzRdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vdGl4IFwKLQkJYGxzIC1kciAuLi8uLi90aXhbWzRdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vLi4vdGl4IFwKLQkJYGxzIC1kciAuLi8uLi8uLi90aXhbWzRdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL3RpeENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfdGl4Y29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBgbHMgLWQgJHtwcmVmaXh9L2xpYiAvdXNyL2xvY2FsL2xpYiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvdGl4Q29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCSR7c3JjZGlyfS8uLi90aXggXAotCQlgbHMgLWRyICR7c3JjZGlyfS8uLi90aXhbWzQtOV1dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvdGl4Q29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gIF0pCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgotICAgIFRJWENPTkZJRz0iIyBubyBUaXggY29uZmlncyBmb3VuZCIKLSAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIFRpeCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQotICBlbHNlCi0gICAgbm9fdGl4PQotICAgIFRJWENPTkZJRz0ke2FjX2N2X2NfdGl4Y29uZmlnfS90aXhDb25maWcuc2gKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRUSVhDT05GSUcpCi0gIGZpCi1maQotCi1dKQotCi0jIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKLSMgZnJvbSBQQVRIX1RJWENPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCi1BQ19ERUZVTihDWUdfQUNfTE9BRF9USVhDT05GSUcsIFsKLSAgICBpZiB0ZXN0IC1mICIkVElYQ09ORklHIiA7IHRoZW4KLSAgICAgIC4gJFRJWENPTkZJRwotICAgIGZpCi0KLSAgICBBQ19TVUJTVChUSVhfQlVJTERfTElCX1NQRUMpCi0gICAgQUNfU1VCU1QoVElYX0xJQl9GVUxMX1BBVEgpCi1dKQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMQ09ORklHLCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgY29uZmlndXJhdGlvbgotIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi0jIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLWl0Y2xjb25maWcKLSMKLQotaWYgdGVzdCB4IiR7bm9faXRjbH0iID0geCA7IHRoZW4KLSAgIyB3ZSByZXNldCBub19pdGNsIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKLSAgbm9faXRjbD10cnVlCi0gIEFDX0FSR19XSVRIKGl0Y2xjb25maWcsIFsgIC0td2l0aC1pdGNsY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyBpdGNsIGNvbmZpZ3VyYXRpb24gKGl0Y2xDb25maWcuc2gpXSwKLSAgICAgICAgIHdpdGhfaXRjbGNvbmZpZz0ke3dpdGh2YWx9KQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJdGNsIGNvbmZpZ3VyYXRpb25dKQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsY29uZmlnLFsKLQotICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGNvbmZpZyB3YXMgc3BlY2lmaWVkLgotICBpZiB0ZXN0IHgiJHt3aXRoX2l0Y2xjb25maWd9IiAhPSB4IDsgdGhlbgotICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsY29uZmlnfS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICR7d2l0aF9pdGNsY29uZmlnfTsgcHdkKWAKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGNsY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGl0Y2xDb25maWcuc2hdKQotICAgIGZpCi0gIGZpCi0KLSAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgaXRjbCBsaWJyYXJ5Ci0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCS4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgLi4vLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uLy4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgLi4vLi4vLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gYGxzIC1kICR7cHJlZml4fS9saWIgL3Vzci9sb2NhbC9saWIgMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0Y2xDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRjbCBcCi0JCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRjbFtbM11dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbC9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICBdKQotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgSVRDTENPTkZJRz0iIyBubyBpdGNsIGNvbmZpZ3MgZm91bmQiCi0gICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBpdGNsIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gIGVsc2UKLSAgICBub19pdGNsPQotICAgIElUQ0xDT05GSUc9JHthY19jdl9jX2l0Y2xjb25maWd9L2l0Y2xDb25maWcuc2gKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRJVENMQ09ORklHKQotICBmaQotZmkKLQotXSkKLQotIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi0jIGZyb20gUEFUSF9JVENMQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX0lUQ0xDT05GSUcsIFsKLSAgICBpZiB0ZXN0IC1mICIkSVRDTENPTkZJRyIgOyB0aGVuCi0gICAgICAuICRJVENMQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKElUQ0xfQlVJTERfTElCX1NQRUMpCi0gICAgQUNfU1VCU1QoSVRDTF9TSCkKLSAgICBBQ19TVUJTVChJVENMX0xJQl9GSUxFKQotICAgIEFDX1NVQlNUKElUQ0xfTElCX0ZVTExfUEFUSCkKLQotXSkKLQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVEtDT05GSUcsIFsKLSMKLSMgT2ssIGxldHMgZmluZCB0aGUgaXRrIGNvbmZpZ3VyYXRpb24KLSMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC1pdGtjb25maWcKLSMKLQotaWYgdGVzdCB4IiR7bm9faXRrfSIgPSB4IDsgdGhlbgotICAjIHdlIHJlc2V0IG5vX2l0ayBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCi0gIG5vX2l0az10cnVlCi0gIEFDX0FSR19XSVRIKGl0a2NvbmZpZywgWyAgLS13aXRoLWl0a2NvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaXRrIGNvbmZpZ3VyYXRpb24gKGl0a0NvbmZpZy5zaCldLAotICAgICAgICAgd2l0aF9pdGtjb25maWc9JHt3aXRodmFsfSkKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSXRrIGNvbmZpZ3VyYXRpb25dKQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGtjb25maWcsWwotCi0gICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGtjb25maWcgd2FzIHNwZWNpZmllZC4KLSAgaWYgdGVzdCB4IiR7d2l0aF9pdGtjb25maWd9IiAhPSB4IDsgdGhlbgotICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGtjb25maWd9L2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICR7d2l0aF9pdGtjb25maWd9OyBwd2QpYAotICAgIGVsc2UKLSAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0a2NvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGtDb25maWcuc2hdKQotICAgIGZpCi0gIGZpCi0KLSAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgaXRrIGxpYnJhcnkKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gXAotCQkuLi9pdGNsL2l0ayBcCi0JCWBscyAtZHIgLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vaXRjbC9pdGsgXAotCQlgbHMgLWRyIC4uLy4uL2l0Y2wvaXRrW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uLy4uL2l0Y2wvaXRrIFwKLQkJYGxzIC1kciAuLi8uLi8uLi9pdGNsL2l0a1tbM11dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRrQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsL2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrIFwKLQkJYGxzIC1kciAke3NyY2Rpcn0vLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICBdKQotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICBJVENMQ09ORklHPSIjIG5vIGl0ayBjb25maWdzIGZvdW5kIgotICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgaXRrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gIGVsc2UKLSAgICBub19pdGs9Ci0gICAgSVRLQ09ORklHPSR7YWNfY3ZfY19pdGtjb25maWd9L2l0a0NvbmZpZy5zaAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJElUS0NPTkZJRykKLSAgZmkKLWZpCi0KLV0pCi0KLSMgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcwotIyBmcm9tIFBBVEhfSVRLQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX0lUS0NPTkZJRywgWwotICAgIGlmIHRlc3QgLWYgIiRJVEtDT05GSUciIDsgdGhlbgotICAgICAgLiAkSVRLQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKElUS19CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChJVEtfTElCX0ZJTEUpCi0gICAgQUNfU1VCU1QoSVRLX0xJQl9GVUxMX1BBVEgpCi1dKQotCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGxpYmd1aSBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1saWJndWlpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHVUksIFsKLSAgICBDWUdfQUNfUEFUSF9MSUJHVUlICi0gICAgQ1lHX0FDX1BBVEhfTElCR1VJTElCCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR1VJSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9fbGliZ3VpPXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgTGliZ3VpIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgobGliZ3VpaW5jbHVkZSwgWyAgLS13aXRoLWxpYmd1aWluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIGxpYmd1aSBoZWFkZXJzIGFyZV0sIHdpdGhfbGliZ3VpaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGliZ3VpaCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1saWJndWlpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfbGliZ3VpaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX2xpYmd1aWluY2x1ZGV9L2d1aXRjbC5oIDsgdGhlbgotICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICR7d2l0aF9saWJndWlpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF9saWJndWlpbmNsdWRlfS9zcmMvZ3VpdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19saWJndWloPWAoY2QgJHt3aXRoX2xpYmd1aWluY2x1ZGV9L3NyYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2xpYmd1aWluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggTGliZ3VpIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWljb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX2xpYmd1aWNvbmZpZy8kaS9zcmMvZ3VpdGNsLmggOyB0aGVuCi0gICAgICBhY19jdl9jX2xpYmd1aWg9YChjZCAkYWNfY3ZfY19saWJndWljb25maWcvJGkvc3JjOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgTGliZ3VpIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2xpYmd1aSogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgbGliZ3VpcGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgTGliZ3VpIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIExpYmd1aSwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRsaWJndWlwYXRoL2xpYmd1aSogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvc3JjL2d1aXRjbC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICRpL3NyYzsgcHdkKWAKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLWRubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgPSB4IDsgdGhlbgotICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgQUNfQ0hFQ0tfSEVBREVSKGd1aXRjbC5oLCBhY19jdl9jX2xpYmd1aWg9aW5zdGFsbGVkLCBhY19jdl9jX2xpYmd1aWg9IiIpCi1maQotXSkKLUxJQkdVSUhESVI9IiIKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfV0FSTihbQ2FuJ3QgZmluZCBhbnkgTGliZ3VpIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iICE9IHggOyB0aGVuCi0gICAgbm9fbGliZ3VpPSIiCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotICAgICAgICBMSUJHVUlIRElSPSItSSR7YWNfY3ZfY19saWJndWlofSIKLSAgICBmaQotZmkKLUFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmd1aWh9KQotQUNfU1VCU1QoTElCR1VJSERJUikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIGZpbmQgdGhlIEdVSSBsaWJyYXJ5Ci1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHVUlMSUIsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgR1VJIGxpYnJhcnkgIGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBsb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciBHVUkgbGlicmFyeSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmd1aWxpYixbCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWxpYn0iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2xpYmd1aS9zcmMvTWFrZWZpbGUiIDsgdGhlbgotICAgICAgICBhY19jdl9jX2xpYmd1aWxpYj1gKGNkICRpL2xpYmd1aS9zcmM7IHB3ZClgCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLWZpCi1dKSAKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpbGlifSIgIT0geCA7IHRoZW4KLSAgICAgR1VJTElCPSIke0dVSUxJQn0gLUwke2FjX2N2X2NfbGliZ3VpbGlifSIKLSAgICAgTElCR1VJTElCPSItbGd1aSIKLSAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGliZ3VpbGlifSkKLWVsc2UKLSAgICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfU1VCU1QoR1VJTElCKQotQUNfU1VCU1QoTElCR1VJTElCKQotXSkKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1hNjhic2QgYi9jb25maWcvbWgtYTY4YnNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkxMjg5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hNjhic2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1SQU5MSUI9dHJ1ZQotCi0jTm9uZSBvZiB0aGUgQXBvbGxvIGNvbXBpbGVycyBjYW4gY29tcGlsZSBnYXMgb3IgYmludXRpbHMuICBUaGUgcHJlcHJvY2Vzc29yCi0jIGNob2tlcyBvbiBiZmQsIHRoZSBjb21waWxlciB3b24ndCBsZXQgeW91IGFzc2lnbiBpbnRlZ2VycyB0byBlbnVtcywgYW5kCi0jIG90aGVyIHByb2JsZW1zLiAgRGVmaW5pbmcgQ0MgdG8gZ2NjIGlzIGEgcXVlc3Rpb25hYmxlIHdheSB0byBzYXkgImRvbid0IHVzZQotIyB0aGUgYXBvbGxvIGNvbXBpbGVyIiAodGhlIHByZWZlcnJlZCB2ZXJzaW9uIG9mIEdDQyBjb3VsZCBiZSBjYWxsZWQgY2MsCi0jIG9yIHdoYXRldmVyKSwgYnV0IEknbSBub3Qgc3VyZSBsZWF2aW5nIENDIGFzIGNjIGlzIGFueSBiZXR0ZXIuLi4KLQotI0NDPWNjIC1BIGFuc2kgLUEgcnVudHlwZSxhbnkgLUEgc3lzdHlwZSxhbnkgLVVfX1NURENfXyAtRE5PX1NUREFSRwotQ0M9Z2NjCi0KLUJJU09OPXlhY2MKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1haXgzODYgYi9jb25maWcvbWgtYWl4Mzg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNjZDFjLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1haXgzODYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1SQU5MSUIgPSBAOgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWFwb2xsbzY4IGIvY29uZmlnL21oLWFwb2xsbzY4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk3ZWQ5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hcG9sbG82OAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotSERFRklORVMgPSAtRFVTRwotUkFOTElCPXRydWUKLUNDPSBjYyAtQSBhbnNpIC1BIHJ1bnR5cGUsYW55IC1BIHN5c3R5cGUsYW55IC1VX19TVERDX18gLURVU0cKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1hcm1waWMgYi9jb25maWcvbWgtYXJtcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNmMmM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hcm1waWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbWgtY3h1eCBiL2NvbmZpZy9taC1jeHV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGIyYTE2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1jeHV4CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZvciBIYXJyaXMgQ1gvVVggNyAoYW5kIG1heWJlIDYpLCBiYXNlZCBvbiBzeXN2NCBjb25maWd1cmF0aW9uLgotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgQysrIGRlYnVnZ2luZyBpcyBub3QgeWV0IHN1cHBvcnRlZCB1bmRlciBTVlI0IChEV0FSRikKLUNYWEZMQUdTPS1PCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3EKLQotIyBVbmRlciBDWC9VWCwgd2Ugd2FudCB0byB0ZWxsIHRoZSBjb21waWxlciB0byB1c2UgQU5TSSBtb2RlLgotQ0M9Y2MgLVhhCmRpZmYgLS1naXQgYS9jb25maWcvbWgtY3lnd2luIGIvY29uZmlnL21oLWN5Z3dpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxMDI3Zi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtY3lnd2luCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1FWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUz1hbGwtbGlidGVybWNhcAotRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTPWluc3RhbGwtbGlidGVybWNhcAotCi1hbGwtZ2RiOiBhbGwtbGlidGVybWNhcAotCi1pbnN0YWxsLWdkYjogYWxsLWxpYnRlcm1jYXAKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kZWNzdGF0aW9uIGIvY29uZmlnL21oLWRlY3N0YXRpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MjAxOTIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWRlY3N0YXRpb24KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUNDID0gY2MgLVdmLC1YTmcxMDAwCi0KLSMgZm9yIFgxMSwgc2luY2UgdGhlIG5hdGl2ZSBERUN3aW5kb3dzIGluY2x1ZGUgZmlsZXMgYXJlIHJlYWxseSBicm9rZW4gd2hlbgotIyBpdCBjb21lcyB0byBmdW5jdGlvbiBwcm90b3R5cGVzLiAgCi1YMTFfRVhUUkFfQ0ZMQUdTID0gIi1ETmVlZEZ1bmN0aW9uUHJvdG90eXBlcz0wIgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRlbHRhODggYi9jb25maWcvbWgtZGVsdGE4OApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5YzQ1My4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGVsdGE4OAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotUkFOTElCID0gdHJ1ZQotCi0KLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRndXggYi9jb25maWcvbWgtZGd1eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODVkNi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGd1eAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotSERFRklORVM9LURIT1NUX1NZUz1ER1VYX1NZUwotQ0M9Z2NjIC1XYWxsIC1hbnNpIC1EX191c2luZ19ER1VYCi1SQU5MSUI9dHJ1ZQotCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGd1eDM4NiBiL2NvbmZpZy9taC1kZ3V4Mzg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTg4NWMzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kZ3V4Mzg2CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBmcm9tIG1oLWRndXgKLUhERUZJTkVTPS1ESE9TVF9TWVM9REdVWF9TWVMKLUNDPWdjYyAtV2FsbCAtYW5zaSAtRF9fdXNpbmdfREdVWAotUkFOTElCID0gdHJ1ZQotCi0jIGZyb20gbWgtc3lzdjQKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBDKysgZGVidWdnaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIHVuZGVyIFNWUjQgKERXQVJGKQotQ1hYRkxBR1M9LU8KLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcgotCi1YMTFfRVhUUkFfTElCUyA9IC1sbnNsCi0KLSMgZnJvbSBhbmdlbGEKLSMgbm8gZGVidWdnaW5nIGR1ZSB0byBicm9rZW4gY29tcGlsZXIsIHVzZSBCU0Qgc3R5bGUgdGltZW9mZGF5Ci1DRkxBR1M9LU8gLURfQlNEX1RJTUVPRkRBWV9GTEFWT1IKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRqZ3BwIGIvY29uZmlnL21oLWRqZ3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIwMDdiLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kamdwcAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBXZSBkb24ndCB3YW50IHRvIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb24gRE9TLiAgVW5mb3J0dW5hdGVseSwKLSMgdGhpcyByZXF1aXJlcyB0aGF0IHdlIHNldCBDRkxBR1MuCi0jIFRoaXMgdXNlZCB0byBzZXQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIuCi1DRkxBR1M9LU8yCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZWxmYWxwaGFwaWMgYi9jb25maWcvbWgtZWxmYWxwaGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWVsZmFscGhhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWhwMzAwIGIvY29uZmlnL21oLWhwMzAwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE3MjRkLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1ocDMwMAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTVgotIyBBdm9pZCAidG9vIG11Y2ggZGVmaW5pbmciIGVycm9ycyBmcm9tIEhQVVggY29tcGlsZXIuCi1DQyA9IGNjIC1XcCwtSDI1NjAwMAotIyBJZiAiYXIiIGluICRQQVRIIGlzIEdOVSBhciwgdGhlIHN5bWJvbCB0YWJsZSBtYXkgbmVlZCByZWJ1aWxkaW5nLgotIyBJZiBpdCdzIEhQL1VYIGFyLCB0aGlzIHNob3VsZCBiZSBoYXJtbGVzcy4KLVJBTkxJQiA9IGFyIHRzCi0KLSMgTmF0aXZlIGNjIGNhbid0IGJvb3RzdHJhcCBnY2Mgd2l0aCAtZy4gIERlZmluaW5nIENGTEFHUyBoZXJlIGxvc2VzIChhKQotIyBmb3Igbm9uLWdjYyBkaXJlY3RvcmllcywgKGIpIGlmIHdlIGFyZSBjb21waWxpbmcgd2l0aCBnY2MsIG5vdAotIyBuYXRpdmUgY2MuICBOZWl0aGVyIChhKSBub3IgKGIpIGhhcyBhIHRyaXZpYWwgZml4IHRob3VnaC4KLQotQ0ZMQUdTID0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocHV4IGIvY29uZmlnL21oLWhwdXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzFjOWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWhwdXgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotQ0MgPSBjYyAtV3AsLUgyNTYwMDAKLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocHV4OCBiL2NvbmZpZy9taC1ocHV4OApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3MWM5ZC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaHB1eDgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotQ0MgPSBjYyAtV3AsLUgyNTYwMDAKLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pMzcwcGljIGIvY29uZmlnL21oLWkzNzBwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWkzNzBwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaW50ZXJpeCBiL2NvbmZpZy9taC1pbnRlcml4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI4ZWNmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pbnRlcml4CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBUaGUgc2hlbGwgbWF5IG5vdCBiZSBpbiAvYmluLiAKLVNIRUxMID0gc2gKLVJBTkxJQiA9IHRydWUKLQotIyBXZSBkb24ndCB3YW50IGRlYnVnZ2luZyBpbmZvIGluIEludGVyaXgtaG9zdGVkIHRvb2xjaGFpbnMuCi0jIEFjY29tcGxpc2ggdGhpcyBieSBvdmVycmlkaW5nIENGTEFHUy4gVGhpcyBpcyBhbHNvIGEgd29ya2Fyb3VuZAotIyBmb3IgTEQgY3Jhc2ggd2hlbiBidWlsZGluZyBzaGFyZWQgbGlic3RkYysrLgotQ0ZMQUdTPS1PMgotQ1hYRkxBR1M9LU8yCi0KLSMgV2UgYWxzbyBuZWVkIHRvIG92ZXJyaWRlIExJQkdDQzJfREVCVUdfQ0ZMQUdTIHNvIGxpYmdjYzIgd2lsbCBiZQotIyBidWlsdCB3aXRob3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCi1MSUJHQ0MyX0RFQlVHX0NGTEFHUz0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pcml4NCBiL2NvbmZpZy9taC1pcml4NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3MjE0NS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaXJpeDQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTWFrZWZpbGUgY2hhbmdlcyBmb3IgU0dJJ3MgcnVubmluZyBJUklYLTQueC4KLSMgVGVsbCBjb21waWxlciB0byB1c2UgSyZSIEMuICBXZSBjYW4ndCBjb21waWxlIHVuZGVyIHRoZSBTR0kgQW5zaQotIyBlbnZpcm9ubWVudC4gIEFsc28gYnVtcCBzd2l0Y2ggdGFibGUgc2l6ZSBzbyB0aGF0IGNwLXBhcnNlIHdpbGwKLSMgY29tcGlsZS4gIEJ1bXAgc3RyaW5nIGxlbmd0aCBsaW1pdCBzbyBsaW5rZXIgYnVpbGRzLgotCi1DQyA9IGNjIC1jY2tyIC1XZiwtWE5nMTUwMCAtV2YsLVhOazEwMDAgLVdmLC1YTmgyMDAwIC1XZiwtWE5sODE5MgotU1lTViA9IC1EU1lTVgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg1IGIvY29uZmlnL21oLWlyaXg1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ3Yzk5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pcml4NQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNS54LgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg2IGIvY29uZmlnL21oLWlyaXg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDI1YzE2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pcml4NgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNi54LgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQotIyBTcGVjaWZ5IHRoZSBBQkksIHRvIGVuc3VyZSB0aGF0IGFsbCBJcml4IDYgc3lzdGVtcyB3aWxsIGJlaGF2ZSB0aGUgc2FtZS4KLSMgQWxzbywgdXNpbmcgLTMyIGF2b2lkcyBidWdzIHRoYXQgZXhpc3QgaW4gdGhlIG4zMi9uNjQgc3VwcG9ydCBpbiBzb21lCi0jIHZlcnNpb25zIG9mIHRoZSBTR0kgY29tcGlsZXIuCi1DQyA9IGNjIC0zMgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWx5bnhvcyBiL2NvbmZpZy9taC1seW54b3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZmNiNzkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWx5bnhvcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyAvYmluL2NjIGlzIGxlc3MgdGhhbiB1c2VmdWwgZm9yIG91ciBwdXJwb3Nlcy4gIEFsd2F5cyB1c2UgR0NDCi1DQyA9IC9iaW4vZ2NjCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbHlueHJzNmsgYi9jb25maWcvbWgtbHlueHJzNmsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzkzOTkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWx5bnhyczZrCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIEx5bnhPUyBydW5uaW5nIG9uIHRoZSByczYwMDAgZG9lc24ndCBoYXZlIHJhbmxpYgotUkFOTElCID0gdHJ1ZQotCi0jIC9iaW4vY2MgaXMgbGVzcyB0aGFuIHVzZWZ1bCBmb3Igb3VyIHB1cnBvc2VzLiAgQWx3YXlzIHVzZSBHQ0MKLUNDID0gL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvYmluL2djYwotCi0jIC9iaW4vc2ggaXMgdG9vIGJ1Z2d5LCBzbyB1c2UgL2Jpbi9iYXNoIGluc3RlYWQuCi1TSEVMTCA9IC9iaW4vYmFzaApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW02OGtwaWMgYi9jb25maWcvbWgtbTY4a3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNDhkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbTY4a3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1taW5ndzMyIGIvY29uZmlnL21oLW1pbmd3MzIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDgzOWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW1pbmd3MzIKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFdlIGRvbid0IHdhbnQgZGVidWdnaW5nIGluZm8gaW4gV2luMzItaG9zdGVkIHRvb2xjaGFpbnMuCi0jIEFjY29tcGxpc2ggdGhpcyBieSBvdmVycmlkaW5nIENGTEFHUy4KLUNGTEFHUz0tTzIKLUNYWEZMQUdTPS1PMgotCi0jIFdlIGFsc28gbmVlZCB0byBvdmVycmlkZSBMSUJHQ0MyX0RFQlVHX0NGTEFHUyBzbyBsaWJnY2MyIHdpbGwgYmUKLSMgYnVpbHQgd2l0aG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQotTElCR0NDMl9ERUJVR19DRkxBR1M9Ci0KLSMgY3VzdG9tIGluc3RhbGxhdGlvbiBydWxlcyBmb3IgbWluZ3czMiAoYXBwZW5kIC5leGUgdG8gYmluYXJpZXMsIGV0Yy4pCi0jIElOU1RBTExfRE9TUkVMPWluc3RhbGwtZG9zcmVsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbmNyMzAwMCBiL2NvbmZpZy9taC1uY3IzMDAwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJkODAzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1uY3IzMDAwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBIb3N0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYW4gTkNSIDMwMDAgKGk0ODYvU1ZSNCkgc3lzdGVtLgotCi0jIFRoZSBOQ1IgMzAwMCBzaGlwcyB3aXRoIGEgTWV0YVdhcmUgY29tcGlsZXIgaW5zdGFsbGVkIGFzIC9iaW4vY2MuCi0jIFRoaXMgY29tcGlsZXIgbm90IG9ubHkgZW1pdHMgb2Jub3hpb3VzIGNvcHlyaWdodCBtZXNzYWdlcyBldmVyeSB0aW1lCi0jIHlvdSBydW4gaXQsIGJ1dCBpdCBjaG9rZXMgYW5kIGRpZXMgb24gYSB3aG9sZSBidW5jaCBvZiBHTlUgc291cmNlCi0jIGZpbGVzLiAgRGVmYXVsdCB0byB1c2luZyB0aGUgQVQmVCBjb21waWxlciBpbnN0YWxsZWQgaW4gL3Vzci9jY3MvQVRUL2NjLgotIyBVbmZvcnR1bmF0ZWx5IHRob3VnaCwgdGhlIEFUJlQgY29tcGlsZXIgc29tZXRpbWVzIGdlbmVyYXRlcyBjb2RlIHRoYXQKLSMgdGhlIGFzc2VtYmxlciBiYXJmcyBvbiBpZiAtZyBpcyB1c2VkLCBzbyBkaXNhYmxlIGl0IGJ5IGRlZmF1bHQgYXMgd2VsbC4KLUNDID0gL3Vzci9jY3MvQVRUL2NjCi1DRkxBR1MgPQotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3EKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1uY3JzdnI0MyBiL2NvbmZpZy9taC1uY3JzdnI0MwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiMDk5MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbmNyc3ZyNDMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMgSG9zdCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGFuIE5DUiAzMDAwIChpNDg2L1NWUjQzKSBzeXN0ZW0uCi0KLSMgVGhlIE1ldGFXYXJlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgYSBjb3B5cmlnaHQgbWVzc2FnZSB1bmxlc3MgeW91Ci0jIHR1cm4gaXQgb2ZmIGJ5IGFkZGluZyB0aGUgLUhub2NvcHlyIGZsYWcuCi1DQyA9IGNjIC1Ibm9jb3B5cgotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbmVjdjQgYi9jb25maWcvbWgtbmVjdjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODc3MzYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW5lY3Y0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBIb3N0IE1ha2VmaWxlIGZyYWdtZW50IGZvciBORUMgTUlQUyBTVlI0LgotCi0jIFRoZSBDIGNvbXBpbGVyIG9uIE5FQyBNSVBTIFNWUjQgbmVlZHMgYmlnZ2VyIHRhYmxlcy4KLUNDID0gY2MgLVpYTmQ9NTAwMCAtWlhOZz0xMDAwCi0KLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBORUMgLWxYMTEgbmVlZHMgc29tZSBvdGhlciBsaWJyYXJpZXMuCi1YMTFfRVhUUkFfTElCUyA9IC1sc29ja2V0IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtcGFwaWMgYi9jb25maWcvbWgtcGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXBhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXBwY3BpYyBiL2NvbmZpZy9taC1wcGNwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXBwY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1yaXNjb3MgYi9jb25maWcvbWgtcmlzY29zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg2YjMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1yaXNjb3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIFRoaXMgaXMgZm9yIGEgTUlQUyBydW5uaW5nIFJJU0Mvb3MgNC41MkMuCi0KLSMgVGhpcyBpcyBuZWVkZWQgZm9yIEdEQiwgYnV0IG5lZWRzIHRvIGJlIGluIHRoZSB0b3AtbGV2ZWwgbWFrZSBiZWNhdXNlCi0jIGlmIGEgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIHRoZSBic2QgaGVhZGVycyBhbmQgZ2V0cyBsaW5rZWQgd2l0aCB0aGUKLSMgc3lzdiBzeXN0ZW0gbGlicmFyaWVzIGFsbCBoZWxsIGNhbiBicmVhayBsb29zZSAoZS5nLiBhIGptcF9idWYgbWlnaHQgYmUKLSMgYSBkaWZmZXJlbnQgc2l6ZSkuCi0jIHB0cmFjZSgyKSBhcHBhcmVudGx5IGhhcyBwcm9ibGVtcyBpbiB0aGUgQlNEIGVudmlyb25tZW50LiAgTm8gd29ya2Fyb3VuZCBpcwotIyBrbm93biBleGNlcHQgdG8gc2VsZWN0IHRoZSBzeXN2IGVudmlyb25tZW50LiAgQ291bGQgd2UgdXNlIC9wcm9jIGluc3RlYWQ/Ci0jIFRoZXNlICJzeXN2IGVudmlyb25tZW50cyIgYW5kICJic2QgZW52aXJvbm1lbnRzIiBvZnRlbiBlbmQgdXAgYmVpbmcgYSBwYWluLgotIwotIyBUaGlzIGlzIG5vdCBwYXJ0IG9mIENGTEFHUyBiZWNhdXNlIHBlcmhhcHMgbm90IGFsbCBDIGNvbXBpbGVycyBoYXZlIHRoaXMKLSMgb3B0aW9uLgotQ0M9IGNjIC1zeXN0eXBlIHN5c3YKLQotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNjbyBiL2NvbmZpZy9taC1zY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMzM3YzkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXNjbworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQotIyBZb3UgbWF5IG5lZWQgdGhpcyBpZiB5b3UgZG9uJ3QgaGF2ZSBiaXNvbi4KLSMgQklTT04gPSB5YWNjIC1TbTEwNDAwCi0jIFRoZSBuYXRpdmUgQyBjb21waWxlciBib3RjaGVzIHNvbWUgc2ltcGxlIHVzZXMgb2YgY29uc3QuICBVbmZvcnR1bmF0ZWx5LAotIyBpdCBkb2Vzbid0IGRlZmluZWQgYW55dGhpbmcgbGlrZSAiX19zY29fXyIgZm9yIHVzIHRvIHRlc3QgZm9yIGluIGFuc2lkZWNsLmguCi1DQyA9IGNjIC1EY29uc3Q9Ci0KLVgxMV9FWFRSQV9MSUJTID0gLWxzb2NrZXQgLWxtIC1saW50bCAtbG1hbGxvYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNvbGFyaXMgYi9jb25maWcvbWgtc29sYXJpcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiZWE1NC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc29sYXJpcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTdW5zIHJ1bm5pbmcgU29sYXJpcyAyCi0KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbCAtbHNvY2tldApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNwYXJjcGljIGIvY29uZmlnL21oLXNwYXJjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRiYzIyLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zcGFyY3BpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9YGNhc2UgIiR7TElCQ0ZMQUdTfSAke0xJQkNYWEZMQUdTfSIgaW4gKi1mcGljKiApIGVjaG8gLWZwaWMgOzsgKiApIGVjaG8gLWZQSUMgOzsgZXNhY2AKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zdW4zIGIvY29uZmlnL21oLXN1bjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDUxNTUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXN1bjMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgU3VuJ3MgQyBjb21waWxlciBuZWVkcyB0aGUgLUogZmxhZyB0byBiZSBhYmxlIHRvIGNvbXBpbGUgY3AtcGFyc2UuYwotIyB3aXRob3V0IG92ZXJmbG93aW5nIHRoZSBqdW1wIHRhYmxlcyAoLUogc2F5cyB0byB1c2UgYSAzMiBiaXQgdGFibGUpCi1DQyA9IGNjIC1KCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3lzdiBiL2NvbmZpZy9taC1zeXN2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIxMTg3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zeXN2CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zeXN2NCBiL2NvbmZpZy9taC1zeXN2NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwNjY1MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc3lzdjQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgQysrIGRlYnVnZ2luZyBpcyBub3QgeWV0IHN1cHBvcnRlZCB1bmRlciBTVlI0IChEV0FSRikKLUNYWEZMQUdTPS1PCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3IKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXN5c3Y1IGIvY29uZmlnL21oLXN5c3Y1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmEzOGU1Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zeXN2NQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNCAtRFNWUjUKLVJBTkxJQiA9IHRydWUKLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcgotCi1YMTFfRVhUUkFfTElCUyA9IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtdmF4dWx0MiBiL2NvbmZpZy9taC12YXh1bHQyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGUyZGM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC12YXh1bHQyCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFRoZSBvbGQgQlNEIHBjYyBpc24ndCB1cCB0byBjb21waWxpbmcgcGFydHMgb2YgZ2RiIHNvIHVzZSBnY2MKLUNDID0gZ2NjCmRpZmYgLS1naXQgYS9jb25maWcvbWgteDg2cGljIGIvY29uZmlnL21oLXg4NnBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNDhkOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgteDg2cGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy1taC1tcHcgYi9jb25maWcvbXB3LW1oLW1wdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzZWY0Zi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3LW1oLW1wdworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jIFRoaXMgaXMgYW4gTVBXIG1ha2VmaWxlIGZyYWdtZW50LgotCi0jIFNpbmNlIHRoZXJlIGFyZSBhIG11bHRpcGxpY2l0eSBvZiBNYWMgY29tcGlsZXJzIGFuZCB0d28gZGlmZmVyZW50Ci0jIHByb2Nlc3NvcnMsIHRoaXMgZmlsZSBpcyBwcmltYXJpbHkgYSBsaWJyYXJ5IG9mIG9wdGlvbnMgZm9yIGVhY2gKLSMgY29tcGlsZXIuICBTb21lYm9keSBlbHNlIChzdWNoIGFzIGEgY29uZmlndXJlIG9yIGJ1aWxkIHNjcmlwdCkgd2lsbAotIyBtYWtlIHRoZSBhY3R1YWwgY2hvaWNlLgotCi0jIENvbXBpbGVyIHRvIHVzZSBmb3IgY29tcGlsaW5nLgotCi1DQ19NUFdfQyA9IEMgLWQgTVBXX0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC13Ci0KLUNDX1NDID0gU0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC1pICcnIC1pIDoKLQotQ0NfTVdDNjhLID0gTVdDNjhLIC1kIE1QVyAtZW51bSBpbnQgLW1wd19jaGFycyAtc3ltIG9uIC13IG9mZiAtbWM2ODAyMCAtbW9kZWwgZmFyCi0KLUNDX1BQQ0MgPSBQUENDIC1kIHBvd2VyYz0xIC1kIHBhc2NhbD0gLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtdwotCi1DQ19NUkMgPSBNckMgLWQgcG93ZXJjPTEgLWQgcGFzY2FsPSAtZCBBTE1PU1RfU1REQyAtZCBBTlNJX1BST1RPVFlQRVMgLWQgTVBXIC1pICcnIC1pIDogLWptCi0KLUNDX1NNckMgPSBTTXJDIC1kIE1QVwotCi0jICItbXB3X2NoYXJzIiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBHTlUgc291cmNlcyBvZnRlbiBtaXggc2lnbmVkIGFuZAotIyB1bnNpZ25lZCBjYXN1YWxseS4KLSMgIi13IG9mZiIgaXMgbm90IGEgZ3JlYXQgaWRlYSwgYnV0IENXNyBpcyBjb21wbGFpbmluZyBhYm91dCBlbnVtCi0jIGFzc2lnbm1lbnRzLgotIyAiLW9wdCBnbG9iYWwscGVlcCxsNCxzcGVlZCIgaXMgc29tZXRpbWVzIGdvb2QsIGFuZCBzb21ldGltZXMgYmFkLgotIyBXZSBtdXN0IHVzZSB7Q0luY2x1ZGVzfSBzbyB0aGF0IE1QVyB0b29scyB3aWxsIHdvcms7IHtNV0NJbmNsdWRlc30KLSMgZGVmaW5lcyBzdGRvdXQsIGlzbG93ZXIsIGV0YywgaW4gd2F5cyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aCBNUFcncwotIyBydW50aW1lLiAgSG93ZXZlciwgdGhpcyBjYW5ub3QgYmUgZG9uZSB2aWEgIC1pICJ7Q0luY2x1ZGVzfSIsIHNpbmNlCi0jIHRoYXQgZG9lcyBub3QgYWZmZWN0IGhvdyA8Pi10eXBlIGluY2x1ZGVzIGhhcHBlbjsgaW5zdGVhZCwgdGhlIHZhcmlhYmxlCi0jIE1XQ0luY2x1ZGVzIG11c3QgYmUgc2V0IHRvIHBvaW50IGF0IHtDSW5jbHVkZXN9LgotCi1DQ19NV0NQUEMgPSBNV0NQUEMgLWQgTVBXIC1lbnVtIGludCAtbXB3X2NoYXJzIC1zeW0gb24gLXcgb2ZmCi0KLSMgTm90ZSB0aGF0IEdDQyBkb2VzICpub3QqIHdpcmUgaW4gYSBkZWZpbml0aW9uIG9mICJwYXNjYWwiLCBzbyB0aGF0Ci0jIGl0IGNhbiBiZSBoYW5kbGVkIGluIGFub3RoZXIgd2F5IGlmIGRlc2lyZWQuCi0KLUNDXzY4S19HQ0MgPSBnQyAtRHBhc2NhbD0gLURBTlNJX1BST1RPVFlQRVMgLURNUFcKLQotQ0NfUFBDX0dDQyA9IGdDIC1EcG93ZXJjPTEgLURwYXNjYWw9IC1EQU5TSV9QUk9UT1RZUEVTIC1ETVBXCi0KLSMgTm90aGluZyBmb3IgdGhlIGRlZmF1bHQgQ0ZMQUdTLgotCi1DRkxBR1MgPSAKLQotIyBUb29sIHRvIHVzZSBmb3IgbWFraW5nIGxpYnJhcmllcy9hcmNoaXZlcy4KLQotQVJfTElCID0gTGliCi0KLUFSX01XTElOSzY4SyA9IE1XTGluazY4SyAteG0gbGlicmFyeQotCi1BUl9QUENMSU5LID0gUFBDTGluayAteG0gbGlicmFyeQotCi1BUl9NV0xJTktQUEMgPSBNV0xpbmtQUEMgLXhtIGxpYnJhcnkKLQotQVJfQVIgPSBhcgotCi1BUl9GTEFHUyA9IC1vCi0KLVJBTkxJQl9OVUxMID0gbnVsbC1jb21tYW5kCi0KLVJBTkxJQl9SQU5MSUIgPSByYW5saWIKLQotIyBDb21waWxlciBhbmQvb3IgbGlua2VyIHRvIHVzZSBmb3IgbGlua2luZy4KLQotQ0NfTERfTElOSyA9IExpbmsgLXcgLWQgLW1vZGVsIGZhciB7Q0NfTERfVE9PTF9GTEFHU30KLQotQ0NfTERfTVdMSU5LNjhLID0gTVdMaW5rNjhLIC13IHtDQ19MRF9UT09MX0ZMQUdTfSAtc3ltIG9uIC1tb2RlbCBmYXIKLQotQ0NfTERfUFBDTElOSyA9IFBQQ0xpbmsgLW1haW4gX19zdGFydCAtb3V0cHV0Zm9ybWF0IHhjb2ZmCi0KLUNDX0xEX01XTElOS1BQQyA9IE1XTGlua1BQQyAtdyB7Q0NfTERfVE9PTF9GTEFHU30gLXN5bSBvbgotCi1DQ19MRF9HTEQgPSBnQwotCi0jIEV4dGVuc2lvbiBmb3IgbGlua2VyIG91dHB1dC4KLQotUFJPR19FWFRfNjhLID0KLQotUFJPR19FWFRfWENPRkYgPSAueGNvZmYKLQotIyBOb3RoaW5nIGZvciB0aGUgZGVmYXVsdCBMREZMQUdTLgotCi1MREZMQUdTID0gLXcKLQotQ0NfTERfVE9PTF9GTEFHUyA9IC1jICdNUFMgJyAtdCBNUFNUCi0KLSMgTGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdC4KLQotIyBJdCB3b3VsZCBhcHBlYXIgdGhhdCB0aGUgbWF0aCBsaWJyYXJpZXMgYXJlIG5vdAotIyBuZWVkZWQgZXhjZXB0IHRvIHByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBzY2FsYiwKLSMgd2hpY2ggaXMgY2FsbGVkIGZyb20gbGRleHAsIHdoaWNoIGlzIHJlZmVyZW5jZWQKLSMgaW4gdGhlIG02OGsgb3Bjb2RlcyBsaWJyYXJ5LgotCi1FWFRSQUxJQlNfQyA9IFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iU3RkQ2xpYi5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iTWF0aC5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iQ1NBTkVMaWIubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iU3R1YnMubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iUnVudGltZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJJbnRlcmZhY2UubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iVG9vbExpYnMubwotCi1FWFRSQUxJQlNfTVdDNjhLID0gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJTdGRDbGliLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJNYXRoLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJDU0FORUxpYi5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJTdHVicy5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IkludGVyZmFjZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7TVc2OEtMaWJyYXJpZXN9TVBXIEFOU0kgKDRpKSBDLjY4Sy5MaWIiCi0KLUVYVFJBTElCU19QUENfWENPRkYgPSBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iU3RkQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJNYXRoTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDTGliLnhjb2ZmIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7R0NDUFBDTGlicmFyaWVzfSJsaWJnY2MueGNvZmYKLQotRVhUUkFMSUJTX1BQQyA9IFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJJbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9Ik1hdGhMaWIgXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ1Rvb2xMaWJzLm8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ0NSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntHQ0NQUENMaWJyYXJpZXN9ImxpYmdjYy54Y29mZgotCi1FWFRSQUxJQlNfTVdDUFBDID0gXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iTVdTdGRDUnVudGltZS5MaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliIFxPcHRpb24tZAotCSJ7TVdQUENMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iTWF0aExpYiBcT3B0aW9uLWQKLQkie01XUFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vCi0KLSMgVG9vbCB0byBtYWtlIFBFRiB3aXRoLCBpZiBuZWVkZWQuCi0KLU1BS0VQRUZfTlVMTCA9IG51bGwtY29tbWFuZAotCi1NQUtFUEVGX1BQQyA9IE1ha2VQRUYKLQotTUFLRVBFRl9GTEFHUyA9IFxPcHRpb24tZAotCS1sIEludGVyZmFjZUxpYi54Y29mZj1JbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JLWwgTWF0aExpYi54Y29mZj1NYXRoTGliIFxPcHRpb24tZAotCS1sIFN0ZENMaWIueGNvZmY9U3RkQ0xpYgotCi1NQUtFUEVGX1RPT0xfRkxBR1MgPSAtZnQgTVBTVCAtZmMgJ01QUyAnCi0KLSMgUmVzb3VyY2UgY29tcGlsZXIgdG8gdXNlLgotCi1SRVpfNjhLID0gUmV6Ci0KLVJFWl9QUEMgPSBSZXogLWQgV0FOVF9DRlJHCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvQ2hhbmdlTG9nIGIvY29uZmlnL21wdy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGVmYmYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1UdWUgTm92IDI2IDEyOjM0OjEyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQ6IEZpeCBzb21lIGNvbW1lbnRzLgotCi1Nb24gU2VwIDE2IDE0OjQyOjUyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQgKEhMREVOVik6IEVkaXQgb3V0IGFsbCByZWZlcmVuY2VzLgotCi1UaHUgQXVnIDE1IDE5OjQ5OjIzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogdHJ1ZTogTmV3IHNjcmlwdCwgaWRlbnRpY2FsIHRvIG1wdy10cnVlLgotCSogZy1tcHctbWFrZS5zZWQ6IEFkZCBAREFTSF9DX0ZMQUdAIGFuZCBAU0VHTUVOVF9GTEFHKClACi0JdG8gdGhlIGVkaXRvcnMgZm9yIGNvbXBpbGUgY29tbWFuZHMuCi0KLVRodSBBdWcgIDEgMTU6MDE6NDIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctdHJ1ZSwgbXB3LXRvdWNoLCBudWxsLWNvbW1hbmQ6IE5ldyBzY3JpcHRzLgotCSogUkVBRE1FOiBEZXNjcmliZSB1c2FnZSBpbiBtb3JlIGRldGFpbC4KLQotVHVlIERlYyAxMiAxNDo1MTo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBEb24ndCBlZGl0IG91dCAidmVyc2lvbj0iIG9jY3VycmVuY2VzLgotCi1GcmkgRGVjICAxIDExOjQ2OjE4IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQgKGJpbmRpciwgbGliZGlyKTogRWRpdCB0aGUgcG9zaXRpb25zIG9mCi0JcGF0aG5hbWUgc2VwYXJhdG9ycyB0byB3b3JrIHdpdGggb3RoZXIgcGF0aG5hbWVzIGJldHRlci4KLQotVHVlIE5vdiAgNyAxNTowODowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBBZGQgY29tbWVudCBhYm91dCBEdXBsaWNhdGUgdnMgQ2F0ZW5hdGUsCi0JYWRkIGFkZGl0aW9uYWwgcGF0dGVybiBmb3IgZWRpdGluZyBsaW5rLWNvbXBpbGUgY29tbWFuZHMuCi0KLVR1ZSBPY3QgMjQgMTQ6Mjg6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZDogQWRkIGhhbmRsaW5nIGZvciAqLnRhYi5baGNdIGZpbGVzLgotCShDSElMTF9GT1JfVEFSR0VULCBDSElMTF9MSUIpOiBFZGl0IG91dCB0cmlja3kgZGVmaW5pdGlvbnMKLQlvZiB0aGVzZS4KLQotVGh1IFNlcCAyOCAyMTowNToxMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgZ2VuZXJpYyBzZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlCi0JVW5peCBtYWtlZmlsZXMgaW50byBNUFcgbWFrZWZpbGUgc3ludGF4LgotCi1GcmkgTWFyIDE3IDExOjUxOjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogUkVBRE1FOiBDbGFyaWZ5IGluc3RydWN0aW9ucy4KLQkqIGZpOiBSZW1vdmUuCi0KLVdlZCBEZWMgMjEgMTU6NDU6NTMgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNb3ZlSWZDaGFuZ2UsIFJFQURNRSwgZmksIGZvcndhcmQtaW5jbHVkZSwgb3Blbi1icmFjZSwKLSAgICAgICAgdHItN3RvOC1zcmM6IE5ldyBmaWxlcy4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvTW92ZUlmQ2hhbmdlIGIvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmMxMjUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIFJlbmFtZSBhIGZpbGUgb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSBhIHByZXZpb3VzbHkgZXhpc3RpbmcKLSMgZmlsZSBvZiB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGtlZXBpbmcgbWFrZSBmcm9tIGRvaW5nCi0jIHRvbyBtdWNoIHdvcmsgaWYgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBoYXZlbid0IGNoYW5nZWQuCi0KLSMgVGhpcyBpcyBhbiBNUFcgdHJhbnNsYXRpb24gb2YgdGhlIHN0YW5kYXJkIEdOVSBzaCBzY3JpcHQgbW92ZS1pZi1jaGFuZ2UuCi0KLVNldCBleGl0IDAKLQotSWYgImBleGlzdHMgLWYgInsyfSJgIgotICBDb21wYXJlICJ7MX0iICJ7Mn0iID5kZXY6bnVsbAotICBJZiB7c3RhdHVzfSAhPSAwCi0gICAgUmVuYW1lIC15ICJ7MX0iICJ7Mn0iCi0gIEVsc2UKLSAgICBFY2hvICJ7Mn0iIGlzIHVuY2hhbmdlZAotICAgIERlbGV0ZSAtaSAteSAiezF9IgotICBFbmQKLUVsc2UKLSAgUmVuYW1lIC15ICJ7MX0iICJ7Mn0iCi1FbmQKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvUkVBRE1FIGIvY29uZmlnL21wdy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDcwMGEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBNUFcgc2NyaXB0cyBhbmQgcmVsYXRlZCBmaWxlcyB0aGF0IGFyZSBuZWVkZWQgdG8KLWJ1aWxkIEN5Z251cyBHTlUgdG9vbHMgZm9yIE1QVy4gIFRoZSBzY3JpcHRzIHNob3VsZCBiZSBzb21ld2hlcmUgb24gdGhlCi1jb21tYW5kIHBhdGg7IG91ciB1c3VhbCBwcmFjdGljZSBoYXMgYmVlbiB0byBoYXZlIGEgc2VwYXJhdGUgZGlyZWN0b3J5Ci1mb3IgdGhlIHNjcmlwdHMsIGFuZCBwdXQgdGhlIHRvb2xzIChieWFjYywgZmxleCwgYW5kIHNlZCBhdCBsZWFzdCkgdGhlcmUKLWFsc287IHRoZW4gaXQncyBlYXNpZXIgdG8gZHJhZyB0aGUgc3VwcG9ydCBiaXRzIGFyb3VuZCBhcyBhIGdyb3VwLCBvciB0bwotdXBncmFkZSBNUFcgdmVyc2lvbnMuICBUaGUgY29tcGxldGUgcGFja2FnZSBvZiBzY3JpcHRzIGFuZCB0b29sIGJpbmFyaWVzCi1pcyB1c3VhbGx5IGF2YWlsYWJsZSBhcyBwdWIvbWFjL2J1aWxkdG9vbHMuY3B0LmhxeCBvbiBmdHAuY3lnbnVzLmNvbS4KLQotInRyLTd0bzgtc3JjIiBpcyBhY3R1YWxseSB0aGUgc291cmNlIHRvIGFuIE1QVyBzY3JpcHQgdGhhdCB0cmFuc2Zvcm1zCi1zZXF1ZW5jZXMgbGlrZSAiXE9wdGlvbi1kIiBpbnRvIHRoZSBhY3R1YWwgOC1iaXQgY2hhcnMgdGhhdCBNUFcgbmVlZHMuCi1JdCdzIG9ubHkgdGhlIHNvdXJjZSBiZWNhdXNlIGl0IGNhbid0IGl0c2VsZiBpbmNsdWRlIGFueSA4LWJpdCBjaGFycy4KLUl0ICpjYW4qIGJlIHByb2Nlc3NlZCBpbnRvIGEgZ2VudWluZSAidHItN3RvOCIgYnkgdXNpbmcgaXRzZWxmOgotCi0JdHItN3RvOCB0ci03dG84LXNyYyB8IHNlZCAtZSAncy9TcmMvLycgPm5ldy10ci03dG84Ci0KLVVzZSB0aGlzIHRvIHZlcmlmeToKLQotCWNvbXBhcmUgdHItN3RvOCBuZXctdHItN3RvOAotCi1JZiB5b3UgZG9uJ3QgaGF2ZSBhIHdvcmtpbmcgdHItN3RvOCwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5Ci1yZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiAiXE9wdGlvbi1kIiB3aXRoIHJlYWwgT3B0aW9uLWQgKHdoaWNoIGxvb2tzCi1saWtlIGEgZGVsdGEpLCB0aGVuIGRvIHNpbWlsYXJseSB3aXRoIGFsbCB0aGUgb3RoZXIgIlxPcHRpb24tLi4uIgotc3RyaW5ncywgYW5kIHRoZW4gY2hhbmdlICJcU3JjT3B0aW9uLWQiIGludG8gdGhlIHN0cmluZyAiXE9wdGlvbi1kIi4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvZm9yd2FyZC1pbmNsdWRlIGIvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDZiZDcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUVjaG8gJyNpbmNsdWRlJyC2IiJ7MX0itiIgPiJ7Mn0iLnRlbQotTW92ZUlmQ2hhbmdlICJ7Mn0iLnRlbSAiezJ9IgotCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkIGIvY29uZmlnL21wdy9nLW1wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkM2M3Ny4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4IG1ha2VmaWxlcyBpbnRvIE1QVyBtYWtlZmlsZXMuCi0jIFRoZXNlIGFyZSBub21pbmFsbHkgZ2VuZXJpYywgYnV0IHdvcmsgYmVzdCBvbiB0aGUgbWFrZWZpbGVzIHVzZWQKLSMgZm9yIEdOVSBwcm9ncmFtcy4KLQotIyBXaGFjayBvdXQgYW55IGNvbW1lbnRlZC1vdXQgbGluZXMgdGhhdCBhcmUgcHJvYmFibHkgY29tbWFuZHM7Ci0jIHRoZXkgY2FuIG9ubHkgY2F1c2UgdHJvdWJsZSBsYXRlciBvbi4KLS9eIwkvZAotCi0jIENoYW5nZSBkZXBlbmRlbmN5IGNoYXIuCi0vOiQvcy86LyBcXE9wdGlvbi1mL2cKLS9eW14gCTojXVteOl0qOi9zL1woWyAJXSpcKTpcKFsgCV0qXCkvIFxcT3B0aW9uLWYgL2cKLQotIyBDaGFuZ2Ugc3ludGF4IG9mIE1ha2VmaWxlIHZhcnMuCi0vXCQvcy9cJHtcKFthLXpBLVowLTlfLV0qXCl9L3tcMX0vZwotL1wkL3MvXCQoXChbYS16QS1aMC05Xy1dKlwpKS97XDF9L2cKLS8gJEAvcy8gJEAvIHtUYXJnfS8KLQotIyBEb3VibGUtJCBhcmUgbGl0ZXJhbHMgdG8gVW5peCBidXQgbm90IHRvIE1QVyBtYWtlLgotL1wkXCQvcy9cJFwkLyQvZwotCi0jIENoYW5nZSBwYXRobmFtZSBzeW50YXguCi0vXC8vcyxcLlwuL1wvXC5cLi8sOjo6LGcKLS9cLy9zLFwuXC4vLDo6LGcKLS9cLlwvL3MsXC4vLDosZwotL1wvL3MsLyw6LGcKLSMgVW5kbyBleGNlc3MgY2hhbmdlcy4KLS9hbmQvcyxhbmQ6b3IkLGFuZC9vciwKLS9hbmQvcyxhbmQ6b3IgLGFuZC9vciAsCi0vd2FudC9zLHdhbnQ6bmVlZCx3YW50L25lZWQsCi0jIEZpeGluZyB1cCBzZWQgY29tbWFuZHMuCi0vLWUvc18iOlwoW146XSpcKTpkIl8iL1wxL2QiX2cKLS8tZS9zXyI6XChbXjpdKlwpOiw6XChbXjpdKlwpOmQiXyIvXDEvLC9cMi9kIl9nCi0KLS89L3MvID0gXC4kLyA9IDovCi0KLSMgTWFrZSB0aGVzZSBnbyBhd2F5IHNvIHRoYXQgbGF0ZXIgZWRpdHMgbm90IGNvbmZ1c2VkLgotL0hMREVOVi9zL3tITERFTlZ9Ly8KLQotIyBDb21tZW50IG91dCBhbnkgZXhwbGljaXQgc3JjZGlyIHNldHRpbmcuCi0vc3JjZGlyL3MvXnNyY2Rpci8jIHNyY2Rpci8KLQotL0JBU0VESVIvcy9eQkFTRURJUiA9LiokL0JBU0VESVIgPSAie3NyY3Jvb3R9Ii8KLS97QkFTRURJUn06L3Mve0JBU0VESVJ9Oi97QkFTRURJUn0vZwotL3tzcmNkaXJ9Oi9zL3tzcmNkaXJ9Oi8ie3NyY2Rpcn0iL2cKLS8ie3NyY2Rpcn0iOi9zLyJ7c3JjZGlyfSI6LyJ7c3JjZGlyfSIvZwotCi0jIFR3ZWFrIHNvbWUgY29udmVudGlvbnMgdGhhdCBhcmUgYmFja3dhcmRzIGZvciB0aGUgTWFjLgotL2JpbmRpci9zL3tleGVjX3ByZWZpeH06YmluL3tleGVjX3ByZWZpeH1iaW46LwotL2xpYmRpci9zL3tleGVjX3ByZWZpeH06bGliL3tleGVjX3ByZWZpeH1saWI6LwotCi0jIENvbW1lbnQgb3V0IHNldHRpbmdzIG9mIGFueXRoaW5nIHNldCBieSBtcHcgaG9zdCBjb25maWcuCi0vQ0Mvcy9eQ0MgKj0vI0NDID0vCi0vQ0ZMQUdTL3MvXkNGTEFHUyAqPS8jQ0ZMQUdTID0vCi0vQVIvcy9eQVIgKj0vI0FSID0vCi0vQVJfRkxBR1Mvcy9eQVJfRkxBR1MgKj0vI0FSX0ZMQUdTID0vCi0vUkFOTElCL3MvXlJBTkxJQiAqPS8jUkFOTElCID0vCi0vQ0NfTEQvcy9eQ0NfTEQgKj0vI0NDX0xEID0vCi0vTERGTEFHUy9zL15MREZMQUdTICo9LyNMREZMQUdTID0vCi0KLSMgQ2hhbmdlIC1JIHVzYWdlcy4KLS8tSS9zLy1JXC4vLWkgOi9nCi0vLUkvcy8tSTo6YmZkLy1pIDo6YmZkOi9nCi0vLUkvcy8tSTo6aW5jbHVkZS8taSA6OmluY2x1ZGU6L2cKLS8tSS9zLy1JLy1pIC9nCi0KLSMgQ2hhbmdlIC1EIHVzYWdlLgotLy1EL3MvXChbID1dXCktRFwoW14gXSpcKS9cMS1kIFwyL2cKLQotIyBDaGFuZ2UgY29udGludWF0aW9uIGNoYXIuCi0vXFwkL3MvXFwkL1xcT3B0aW9uLWQvCi0KLSMgQ2hhbmdlIHdpbGRjYXJkIGNoYXIuCi0vXCovcy9cKi9cXE9wdGlvbi14L2cKLQotIyBDaGFuZ2UgcGF0aCBvZiB2YXJpb3VzIHR5cGVzIG9mIHNvdXJjZSBmaWxlcy4gIFRoaXMgcnVsZSBkb2VzIG5vdCBhbGxvdwotIyBmb3IgZmlsZSBuYW1lcyB3aXRoIG11bHRpcGxlIGRvdHMgaW4gdGhlIG5hbWUuCi0vXC5bY2hseV0vcy9cKFsgCT48PV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5cKFtjaGx5XVwpL1wxIntzfSJcMi5cMy9nCi0vXC5bY2hseV0vcy9eXChbLWEtekEtWjAtOV8ke306Il0qXClcLlwoW2NobHldXCkvIntzfSJcMS5cMi8KLSMgQWxsb3cgZmlsZXMgbmFtZWQgKi50YWIuW2NoXSBhcyBhIHNwZWNpYWwgY2FzZS4KLS9cLnRhYlwuW2NoXS9zL1woWyAJPjw9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXC50YWJcKVwuXChbY2hdXCkvXDEie3N9IlwyLlwzL2cKLS9cLnRhYlwuW2NoXS9zL15cKFstYS16QS1aMC05XyR7fToiXSpcLnRhYlwpXC5cKFtjaF1cKS8ie3N9IlwxLlwyLwotIyBGaXggc29tZSBvdmVyZW50aHVzaWFzbXMuCi0ve3N9L3MvIntzfSIie3NyY2Rpcn0iLyJ7c3JjZGlyfSIvZwotL3tzfS9zLyJ7c30ie1woW2EtekEtWjAtOV9dKlwpZGlyfS8ie1wxZGlyfSIvZwotL3tzfS9zLyJ7c30ie1woW2EtekEtWjAtOV9dKlwpRElSfS8ie1wxRElSfSIvZwotL3tzfS9zLyJ7c30iIntcKFthLXpBLVowLTlfXSpcKWRpcn0iLyJ7XDFkaXJ9Ii9nCi0ve3N9L3MvIntzfSIie1woW2EtekEtWjAtOV9dKlwpRElSfSIvIntcMURJUn0iL2cKLS97c30vcy8ie3N9IjovOi9nCi0ve3N9L3MvXiJ7c30iLy9nCi0ve3N9L3MvIntzfSIie3N9Ii8ie3N9Ii9nCi0ve3N9L3MvIntzfSIie3NyY2Rpcn0iLyJ7c30iL2cKLS97c30vcy8ie3NyY2Rpcn0iIntzfSIvIntzfSIvZwotCi0jIFRoZSAuZGVmIGZpbGVzIGFyZSBhbHNvIHR5cGljYWxseSBzb3VyY2UgZmlsZXMuCi0vXC5kZWYvcy9cKFsgCT48XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLmRlZi9cMSJ7c30iXDIuZGVmL2cKLS9cLmRlZi9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwuZGVmLyJ7c30iXDEuZGVmL2cKLQotIyBDaGFuZ2UgZXh0ZW5zaW9uIGFuZCBwYXRoIG9mIG9iamVjdHMuCi0vXC5vL3MvXChbIAk9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLm8vXDEie299IlwyLmMuby9nCi0vXC5vL3MvXlwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5vLyJ7b30iXDEuYy5vLwotIyBBbGxvdyAqLnRhYi5vIGZpbGVzIGFzIGEgc3BlY2lhbCBjYXNlIG9mIGEgMi1kb3QtbmFtZSBmaWxlLgotL1wuby9zL1woWyAJPV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC50YWJcLm8vXDEie299IlwyLnRhYi5jLm8vZwotL1wuby9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwudGFiXC5vLyJ7b30iXDEudGFiLmMuby8KLSMgQ2xlYW4gdXAuCi0vIntvfSIvcy8ie299IiJ7b30iLyJ7b30iL2cKLS8ie299Ii9zL14ie299IlwoW2EtekEtWjAtOV9dKlwpPS9cMT0vCi0KLSMgQ2hhbmdlIGV4dGVuc2lvbiBvZiBsaWJzLgotL1wuYS9zL2xpYlwoW2Etel0qXClcLmEvbGliXDEuby9nCi0KLSMgUmVtb3ZlIG5vbi1mYWlsIG9wdGlvbi4KLS8tL3MvXlwoWyAJXSpcKS0vXDEvCi0jIEZpeCBvdmVyZWFnZXJuZXNzZXMgLSBhc3N1bWVzIG5vIG9uZS1sZXR0ZXIgY29tbWFuZHMuCi0vXlsgCV0qW2Etel0gL3MvXlwoWyAJXSpcKVwoW2Etel1cKSAvXDEtXDIgLwotCi0jIFJlbW92ZSBub24tZWNobyBvcHRpb24uICh3YXRjaCBvdXQgZm9yIGF1dG9jb25mIHRoaW5ncykKLS9AL3MvXlwoWyAJXSpcKUAvXDEvCi0KLSMgQ2hhbmdlIGNwIHRvIER1cGxpY2F0ZS4KLSMgQ2F0ZW5hdGUgaXMgcGVyaGFwcyBtb3JlIGFjY3VyYXRlLCBidXQgdGhlIHBhdHRlcm4gd291bGQgaGF2ZSB0bwotIyBpZGVudGlmeSB0aGUgb3V0cHV0IGZpbGUgYW5kIGFkZCBhICc+JyByZWRpcmVjdGlvbiBpbnRvIGl0LgotL2NwL3MvXlwoWyAJXSpcKWNwIC9cMUR1cGxpY2F0ZSAtZCAteSAvCi0jIENoYW5nZSBtdiB0byBSZW5hbWUuCi0vbXYvcy9eXChbIAldKlwpbXYgL1wxUmVuYW1lIC15IC8KLS9SZW5hbWUvcy9eXChbIAldKlwpUmVuYW1lIC15IC1mL1wxUmVuYW1lIC15LwotIyBDaGFuZ2Ugcm0gdG8gRGVsZXRlLgotL3JtIC1yZi9zL15cKFsgCV0qXClybSAtcmYgL1wxRGVsZXRlIC1pIC15IC8KLS9ybSAtZi9zL15cKFsgCV0qXClybSAtZiAvXDFEZWxldGUgLWkgLXkgLwotL3JtL3MvXlwoWyAJXSpcKXJtIC9cMURlbGV0ZSAtaSAteSAvCi0jIE5vdGUgdGhhdCB3ZSBkb24ndCBtZXNzIHdpdGggbG4gLSBkaXJlY3Rvcnktc3BlY2lmaWMgc2NyaXB0cwotIyBtdXN0IGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggc3ltbGlua3MuCi0jIENoYW5nZSBjYXQgdG8gQ2F0ZW5hdGUuCi0vY2F0L3MvXlwoWyAJXSpcKWNhdCAvXDFDYXRlbmF0ZSAvCi0jIENoYW5nZSB0b3VjaCB0byBtcHctdG91Y2guCi0vdG91Y2gvcy9eXChbIAldKlwpdG91Y2ggL1wxbXB3LXRvdWNoIC8KLSMgQ2hhbmdlIG1rZGlyIHRvIE5ld0ZvbGRlci4KLS9ta2Rpci9zL15cKFsgCV0qXClta2RpciAvXDFOZXdGb2xkZXIgLwotIyBDaGFuZ2UgdmFyIHNldHRpbmcgdG8gU2V0LgotLz0vcy9eXChbIAldKlwpXChbLWEtekEtWjAtOV9dKlwpPVwoW147XSpcKTsgXFxPcHRpb24tZC9cMVNldCBcMiBcMy8KLQotIyBDaGFuZ2UgdGVzdHMuCi0vaWYgL3MvaWYgXFsgKi1mIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAqLWYgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiLwotL2lmIC9zL2lmIFxbICEgKi1mIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZiBcKFteIF0qXCkgXSAqOyAqdGhlbiBcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLQotL2lmIC9zL2lmIFxbICotZCBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIvCi0vaWYgL3MvaWYgXFsgKi1kIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZCBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgPT0gIiIvCi0vaWYgL3MvaWYgXFsgISAqLWQgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiID09ICIiLwotCi0vaWYgL3MvaWYgXFsgLWQgXChbXiBdKlwpIF0gKjsgdGhlbiB0cnVlICo7IGVsc2UgbWtkaXIgXChbXiA7XSpcKSAqOyBmaS9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIgTmV3Rm9sZGVyIFwyIEVuZCBJZi8KLQotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSA9IFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgPT0gIlwyIi8KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgPSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiID09ICJcMiIvCi0KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgIT0gXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgIlwxIiAhPSAiXDIiLwotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSAhPSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiICE9ICJcMiIvCi0KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgLWVxIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgLWVxIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLQotL15bIAldKmVsc2UgdHJ1ZSQvY1wKLQlFbHNlXAotCQltcHctdHJ1ZVwKLQotCi0vZWxzZS9zL15cKFsgCV0qXCllbHNlWyAJXSokL1wxRWxzZS8KLS9lbHNlL3MvXlwoWyAJXSpcKWVsc2VbOyAJXSpcXE9wdGlvbi1kJC9cMUVsc2UvCi0KLS9eWyAJXSplbHNlWyAJXSp0cnVlWyAJXSokL2NcCi0JRWxzZVwKLQkJbXB3LXRydWUKLQotL15bIAldKmVsc2VbIAldKnRydWVbOyAJXSpmaSQvY1wKLQlFbHNlXAotCQltcHctdHJ1ZVwKLQlFbmQgSWYKLQotL2ZpL3MvXlwoWyAJXSpcKWZpICokL1wxRW5kLwotL2ZpL3MvXlwoWyAJXSpcKWZpICo7ICpcXE9wdGlvbi1kL1wxRW5kLwotCi0jIENoYW5nZSBsb29waW5nLgotL2Zvci9zL15cKFsgCV0qXClmb3IgXChbLWEtekEtWjAtOV9dKlwpIGluIFwoW147XSpcKTsgKmRvICpcXE9wdGlvbi1kL1wxRm9yIFwyIEluIFwzLwotL15cKFsgCV0qXClkbyAqXFxPcHRpb24tZC9kCi0vZG9uZS9zL15cKFsgCV0qXClkb25lICo7ICpcXE9wdGlvbi1kL1wxRW5kLwotL2RvbmUvcy9eXChbIAldKlwpZG9uZSQvXDFFbmQvCi0KLSMgVHJhaWxpbmcgc2VtaWNvbG9ucyBhbmQgY29udGludWVkIGxpbmVzIGFyZSB1bm5lZWRlZCBzaCBzeW50YXguCi0vOyBcXE9wdGlvbi1kL3MvOyBcXE9wdGlvbi1kLy8KLQotIyBDaGFuZ2UgbW92ZS1pZi1jaGFuZ2UgdG8gTW92ZUlmQ2hhbmdlLgotL21vdmUtaWYtY2hhbmdlL3MvXChbXiAJXSpcKW1vdmUtaWYtY2hhbmdlL01vdmVJZkNoYW5nZS9nCi0KLSMgQ2hhbmdlICQoU0hFTEwpIHRvIHRoZSBzY3JpcHQgbmFtZSBieSBpdHNlbGYuCi0vU0hFTEwvcy9eXChbIAldKlwpe1NIRUxMfSAvXDEvCi0KLSMgQ2hhbmdlIHN5bnRheCBvZiBkZWZhdWx0IHJ1bGUgZGVwZW5kZW5jeS4KLS9eXC5jXC5vL3MvXlwuY1wubyBcXE9wdGlvbi1mJC8uYy5vIFxcT3B0aW9uLWYgLmMvCi0KLSMgQ2hhbmdlIGRlZmF1bHQgcnVsZSdzIGFjdGlvbi4KLS97Q0N9IC1jL3Mve0NDfSAtYyBcKC4qXCkgXCQ8JC97Q0N9IEBEQVNIX0NfRkxBR0Age0RlcERpcn17RGVmYXVsdH0uYyBcMSBAU0VHTUVOVF9GTEFHKHtEZWZhdWx0fSlAIC1vIHtUYXJnRGlyfXtEZWZhdWx0fS5jLm8vCi0KLSMgVGhpcyBpcyBwcmV0dHkgZGlzZ3VzdGluZywgYnV0IEkgY2FuJ3Qgc2VlbSB0byBkZXRlY3QgZW1wdHkgcnVsZXMuCi0vT3B0aW9uLWYkL3MvT3B0aW9uLWYkL09wdGlvbi1mIF9vbGRlc3QvZwotCi0jIFJlbW92ZSAtYyBmcm9tIGV4cGxpY2l0IGNvbXBpbGVyIGNhbGxzLiAoYnV0IHNob3VsZCBub3QgaWYgR0NDKQotIyBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzb3VyY2UgZmlsZSB0aGF0IGlzICJ7eHh4fSJmaWxlLmMuCi0vIC1jIC9zL3tcKFtBLVpfXSpcKUNDfVwoLipcKSAtYyBcKC4qXCkiXChbXiJdKlwpIlwoWy1hLXpfXSpcKVwuYy97XDFDQ31cMiBAREFTSF9DX0ZMQUdAIFwzIlw0Ilw1LmMgLW8gIntvfSJcNS5jLm8vCi0jIEhhbmRsZSB0aGUgY2FzZSBvZiBhIHNvdXJjZSBmaWxlIHRoYXQgaXMgInt4eHh9ImRpcjpmaWxlLmMuCi0vIC1jIC9zL3tcKFtBLVpfXSpcKUNDfVwoLipcKSAtYyBcKC4qXCkiXChbXiJdKlwpIlwoWy1hLXpfXSpcKTpcKFstYS16X10qXClcLmMve1wxQ0N9XDIgQERBU0hfQ19GTEFHQCBcMyJcNCJcNTpcNi5jIC1vICJ7b30iXDYuYy5vLwotCi0jIENoYW5nZSBsaW5raW5nIGNjIHRvIGxpbmtpbmcgc2VxdWVuY2UuCi0vLW8vcy9eXChbIAldKlwpe0NDfSBcKC4qXCl7XChbQS1aX10qXClDRkxBR1N9IFwoLipcKXtMREZMQUdTfSBcKC4qXCktbyBcKFteIF0qXCkgXCguKlwpJC9cMXtDQ19MRH0gXDIge1wzQ0ZMQUdTfSBcNCB7TERGTEFHU30gXDUgLW8gXDZ7UFJPR19FWFR9IFw3XAotXDF7TUFLRVBFRn0gXDZ7UFJPR19FWFR9IC1vIFw2IHtNQUtFUEVGX1RPT0xfRkxBR1N9IHtNQUtFUEVGX0ZMQUdTfVwKLVwxe1JFWn0gIntzfSJcNi5yIC1vIFw2IC1hcHBlbmQgLWQgUFJPR19OQU1FPSciJ1w2JyInIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJy8KLS8tby9zL15cKFsgCV0qXCl7Q0N9IFwoLipcKXtcKFtBLVpfXSpcKUNGTEFHU30gXCguKlwpLW8gXChbXiBdKlwpIFwoLipcKXtMREZMQUdTfSBcKC4qXCkkL1wxe0NDX0xEfSBcMiB7XDNDRkxBR1N9IFw0IHtMREZMQUdTfSBcNiAtbyBcNXtQUk9HX0VYVH0gXDdcCi1cMXtNQUtFUEVGfSBcNXtQUk9HX0VYVH0gLW8gXDUge01BS0VQRUZfVE9PTF9GTEFHU30ge01BS0VQRUZfRkxBR1N9XAotXDF7UkVafSAie3N9Ilw1LnIgLW8gXDUgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInXDUnIicgLWQgVkVSU0lPTl9TVFJJTkc9JyIne3ZlcnNpb259JyInLwotLy1vL3MvXlwoWyAJXSpcKXtIT1NUX0NDfSBcKC4qXCktbyBcKFteIF0qXCkgXCguKlwpJC9cMXtIT1NUX0NDX0xEfSBcMiAtbyBcM3tQUk9HX0VYVH0gXDRcCi1cMXtNQUtFUEVGfSBcM3tQUk9HX0VYVH0gLW8gXDMge01BS0VQRUZfVE9PTF9GTEFHU30ge01BS0VQRUZfRkxBR1N9XAotXDF7UkVafSAie3N9IlwzLnIgLW8gXDMgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInXDMnIicgLWQgVkVSU0lPTl9TVFJJTkc9JyIne3ZlcnNpb259JyInLwotCi0jIENvbW1lbnQgb3V0IC5OT0VYUE9SVCBydWxlcy4KLS9cLk5PRVhQT1JUL3MvXlwuTk9FWFBPUlQvI1wuTk9FWFBPUlQvCi0jIENvbW1lbnQgb3V0IC5QSE9OWSBydWxlcy4KLS9cLlBIT05ZL3MvXlwuUEhPTlkvI1wuUEhPTlkvCi0jIENvbW1lbnQgb3V0IC5QUkVDSU9VUyBydWxlcy4KLS9cLlBSRUNJT1VTL3MvXlwuUFJFQ0lPVVMvI1wuUFJFQ0lPVVMvCi0jIENvbW1lbnQgb3V0IC5TVUZGSVhFUyBydWxlcy4KLS9cLlNVRkZJWEVTL3MvXlwuU1VGRklYRVMvI1wuU1VGRklYRVMvCi0KLSMgU2V0IHRoZSBpbnN0YWxsIHByb2dyYW0gYXBwcm9wcmlhdGVseS4KLS9JTlNUQUxML3MvXklOU1RBTEwgKj0gKmAuKmA6aW5zdGFsbC5zaCAtYy9JTlNUQUxMID0gRHVwbGljYXRlIC15LwotCi0jIERvbid0IHRyeSB0byBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIHRyZWUncyBvd24gdG9vbHMuCi0vYmlzb24vcy9gLipiaXNvbjpiaXNvbi4qYC9iaXNvbiAteS8KLS9ieWFjYy9zL2AuKmJ5YWNjOmJ5YWNjLipgL2J5YWNjLwotL2ZsZXgvcy9gLipmbGV4OmZsZXguKmAvZmxleC8KLQotIyBUdXJuIHRyYW5zZm9ybWVkIEMgY29tbWVudHMgaW4gZWNobyBjb21tYW5kcyBiYWNrIGludG8gY29tbWVudHMuCi0vZWNoby9zLGVjaG8gJ1woLipcKTpcXE9wdGlvbi14XCguKlwpXFxPcHRpb24teDpcKC4qXCknLGVjaG8gJ1wxLypcMiovXDMnLAotCi0jIFdoYWNrIG91dCB2YXJpb3VzIGNsZXZlciBleHByZXNzaW9ucyB0aGF0IHNlYXJjaCBmb3IgdG9vbHMsIHNpbmNlCi0jIHRoZSBjbGV2ZXIgY29kZSBpcyB0b28gL2Jpbi9zaCBzcGVjaWZpYy4KLQotL15BUl9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1BUl9GT1JfVEFSR0VUID0gOjpiaW51dGlsczphclwKLQotCi0vXlJBTkxJQl9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1SQU5MSUJfRk9SX1RBUkdFVCA9IDo6YmludXRpbHM6cmFubGliXAotCi0KLS9eUkFOTElCX1RFU1RfRk9SX1RBUkdFVCA9IC8sL3JhbmxpYiBdICkkL2NcCi1SQU5MSUJfVEVTVF9GT1JfVEFSR0VUID0gXAotCi0KLS9eRVhQRUNUID0gYC8sL2AkL2NcCi1FWFBFQ1QgPSBcCi0KLQotL15SVU5URVNUID0gYC8sL2AkL2NcCi1SVU5URVNUID0gXAotCi0KLS9eQ0NfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAotQ0NfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkNYWF9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1DWFhfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkNISUxMX0ZPUl9UQVJHRVQgPSBgLywvYCQvY1wKLUNISUxMX0ZPUl9UQVJHRVQgPSBcCi0KLQotL15DSElMTF9MSUIgPSBgLywvYCQvY1wKLUNISUxMX0xJQiA9IFwKLQotL3Nhbml0L3Mve3N0YXJ0LXNhbml0Li4uLVthLXowLTldKn0vLwotL3Nhbml0L3Mve2VuZC1zYW5pdC4uLi1bYS16MC05XSp9Ly8KLQotIyBBZGQgc3RhbmRhcmQgZGVmaW5lcyBhbmQgZGVmYXVsdCBydWxlcy4KLS9eIyBzcmNkaXIvYVwKLVwKLXMgPSAie3NyY2Rpcn0iXAotXAotbyA9IDpcCi1cCi0ie299IiBcXE9wdGlvbi1mIDogIntzfSIKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9tcHctdG91Y2ggYi9jb25maWcvbXB3L21wdy10b3VjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2E1MS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L21wdy10b3VjaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyAiVG91Y2giIGNvbW1hbmQuCi0KLUlmICJgRXhpc3RzICJ7MX0iYCIgIT0gIiIKLQlTZXRGaWxlIC1tIC4gInsxfSIKLUVsc2UKLQlFY2hvICcgJyA+ICJ7MX0iCi1FbmQgSWYKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbXB3LXRydWUgYi9jb25maWcvbXB3L21wdy10cnVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTA2NTMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvbXB3LXRydWUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FeGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbnVsbC1jb21tYW5kIGIvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDRjOGUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIFRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcuCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L29wZW4tYnJhY2UgYi9jb25maWcvbXB3L29wZW4tYnJhY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDY1ZGMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9vcGVuLWJyYWNlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIE1QVyBtYWtlZmlsZXMgc2VlbSBub3QgdG8gaGF2ZSBhbnkgd2F5IHRvIGdldCBhIGxpdGVyYWwgb3BlbgotIyBicmFjZSBpbnRvIGEgcnVsZSBhbnl3aGVyZSwgc28gdGhpcyBkb2VzIHRoZSBqb2IuCi0KLUVjaG8gJ3snCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjIGIvY29uZmlnL21wdy90ci03dG84LXNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwYjY0OS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TdHJlYW1FZGl0IC1lIFxPcHRpb24tZAotICAnL1xPcHRpb24teC8gXE9wdGlvbi1kCi0gICAgUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi1kLyAiXE9wdGlvbi1kXE9wdGlvbi1kIiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLSAgICBSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLWYvICJcT3B0aW9uLWRcT3B0aW9uLWYiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tOC8gIlxPcHRpb24tZFxPcHRpb24tOCIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCi0JUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi01LyAiXE9wdGlvbi1kXE9wdGlvbi01IiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLQlSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLXgvICJcT3B0aW9uLWRcT3B0aW9uLXgiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tci8gIlxPcHRpb24tZFxPcHRpb24tciIgLWMgXE9wdGlvbi01JyAgXE9wdGlvbi1kCi0gICJ7MX0iCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RydWUgYi9jb25maWcvbXB3L3RydWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDY1MzAuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy90cnVlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRXhpdCAwCmRpZmYgLS1naXQgYS9jb25maWcvbXQtYWl4NDMgYi9jb25maWcvbXQtYWl4NDMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjc1MGMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWFpeDQzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIEFJWCA0LjMgYW5kIGFib3ZlIHJlcXVpcmVzIC1YMzJfNjQgZmxhZyB0byBhbGwgYXIgYW5kIG5tIGNvbW1hbmRzCi0jIHRvIGhhbmRsZSBib3RoIDMyLWJpdCBhbmQgNjQtYml0IG9iamVjdHMuCi1BUl9GT1JfVEFSR0VUPWFyIC1YMzJfNjQKLU5NX0ZPUl9UQVJHRVQ9bm0gLVgzMl82NApkaWZmIC0tZ2l0IGEvY29uZmlnL210LWFybXBpYyBiL2NvbmZpZy9tdC1hcm1waWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWFybXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWQzMHYgYi9jb25maWcvbXQtZDMwdgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0Yjc3NC4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtZDMwdgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBCdWlsZCBsaWJyYXJpZXMgb3B0aW1pemluZyBmb3Igc3BhY2UsIG5vdCBzcGVlZC4KLSMgVHVybiBvZmYgd2FybmluZ3MgYWJvdXQgc3ltYm9scyBuYW1lZCB0aGUgc2FtZSBhcyByZWdpc3RlcnMKLSBDRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcyAtV2EsLUMKLSBDWFhGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zIC1XYSwtQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWVsZmFscGhhcGljIGIvY29uZmlnL210LWVsZmFscGhhcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1lbGZhbHBoYXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWkzNzBwaWMgYi9jb25maWcvbXQtaTM3MHBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtaTM3MHBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWxpbnV4IGIvY29uZmlnL210LWxpbnV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDllNmYxLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBXaGVuIHVzaW5nIGdsaWJjIDIgb24gTGludXggd2UgbXVzdCBhbHdheXMgdXNlIHZ0YWJsZSB0aHVua3MuCi1DWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHUykgLWZ2dGFibGUtdGh1bmtzIC1EX0dOVV9TT1VSQ0UKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1tNjhrcGljIGIvY29uZmlnL210LW02OGtwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTg3MjcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LW02OGtwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1uZXR3YXJlIGIvY29uZmlnL210LW5ldHdhcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ODJmOWIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LW5ldHdhcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HREJfTkxNX0RFUFMgPSBhbGwtZ2NjIGFsbC1sZApkaWZmIC0tZ2l0IGEvY29uZmlnL210LW9zcGFjZSBiL2NvbmZpZy9tdC1vc3BhY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDkxMDQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LW9zcGFjZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBCdWlsZCBsaWJyYXJpZXMgb3B0aW1pemluZyBmb3Igc3BhY2UsIG5vdCBzcGVlZC4KLSBDRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcwotIENYWEZMQUdTX0ZPUl9UQVJHRVQgPSAtZyAtT3MKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1wYXBpYyBiL2NvbmZpZy9tdC1wYXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtcGFwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1wcGNwaWMgYi9jb25maWcvbXQtcHBjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1wcGNwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1zcGFyY3BpYyBiL2NvbmZpZy9tdC1zcGFyY3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwZWMyNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtc3BhcmNwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9YGNhc2UgIiR7TElCQ0ZMQUdTfSAke0xJQkNYWEZMQUdTfSIgaW4gKi1mcGljKiApIGVjaG8gLWZwaWMgOzsgKiApIGVjaG8gLWZQSUMgOzsgZXNhY2AKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC12ODEwIGIvY29uZmlnL210LXY4MTAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZGE2YzIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXY4MTAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUNDX0ZPUl9UQVJHRVQgPSBjYTczMiAtYW5zaQotQVNfRk9SX1RBUkdFVCA9IGFzNzMyCi1BUl9GT1JfVEFSR0VUID0gYXI3MzIKLVJBTkxJQl9GT1JfVEFSR0VUID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXdpbmNlIGIvY29uZmlnL210LXdpbmNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdkNjdiLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC13aW5jZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgRm9yIFdpbmRvd3MgQ0UsIHdlIG5lZWQgdG8gYnVpbGQgdGhlIHByb2dyYW0gdGhhdCBjb252ZXJ0cywgY29waWVzLAotIyBhbmQgcmVuYW1lcyB0aGUgcGxhdGZvcm0gU0RLIGZpbGVzIGludG8gZ2NjIGRpcmVjdG9yaWVzLgotCi1FWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUzo9JChFWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUykgYWxsLXV0aWxzCi1FWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVM6PSQoRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTKSBpbnN0YWxsLXV0aWxzCi0KLWFsbC11dGlscyA6IGFsbC1saWJpYmVydHkKLQotaW5zdGFsbC11dGlscyA6IGFsbC1saWJpYmVydHkKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXg4NnBpYyBiL2NvbmZpZy9tdC14ODZwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTg3MjcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXg4NnBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWYwMjkxLi4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDE2MTUgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMjIyBXQVJOSU5HOiB0aGlzIGZpbGUgY29udGFpbnMgZW1iZWRkZWQgdGFicy4gIERvIG5vdCBydW4gdW50YWJpZnkgb24gdGhpcyBmaWxlLgotCi0jIENvbmZpZ3VyYXRpb24gc2NyaXB0Ci0jIENvcHlyaWdodCAoQykgMTk4OCwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkuCi0KLSMKLSMgU2hlbGwgc2NyaXB0IHRvIGNyZWF0ZSBwcm9wZXIgbGlua3MgdG8gbWFjaGluZS1kZXBlbmRlbnQgZmlsZXMgaW4KLSMgcHJlcGFyYXRpb24gZm9yIGNvbXBpbGF0aW9uLgotIwotIyBJZiBjb25maWd1cmUgc3VjY2VlZHMsIGl0IGxlYXZlcyBpdHMgc3RhdHVzIGluIGNvbmZpZy5zdGF0dXMuCi0jIElmIGNvbmZpZ3VyZSBmYWlscyBhZnRlciBkaXN0dXJiaW5nIHRoZSBzdGF0dXMgcXVvLCAKLSMgICAgICAgY29uZmlnLnN0YXR1cyBpcyByZW1vdmVkLgotIwotCi1leHBvcnQgUEFUSCB8fCAoZWNobyAiT09QUywgdGhpcyBpc24ndCBzaC4gIERlc3BlcmF0aW9uIHRpbWUuICBJIHdpbGwgZmVlZCBteXNlbGYgdG8gc2guIjsgc2ggJDAgJGFyZ3Y7IGtpbGwgJCQpCi0KLXJlbW92ZT1ybQotaGFyZF9saW5rPWxuCi1zeW1ib2xpY19saW5rPSdsbiAtcycKLQotI2ZvciBUZXN0Ci0jcmVtb3ZlPSJlY2hvIHJtIgotI2hhcmRfbGluaz0iZWNobyBsbiIKLSNzeW1ib2xpY19saW5rPSJlY2hvIGxuIC1zIgotCi0jIGNsZWFyIHNvbWUgdGhpbmdzIHBvdGVudGlhbGx5IGluaGVyaXRlZCBmcm9tIGVudmlyb25tZW50LgotCi1NYWtlZmlsZT1NYWtlZmlsZQotTWFrZWZpbGVfaW49TWFrZWZpbGUuaW4KLWFyZ3VtZW50cz0KLWJ1aWxkX2FsaWFzPQotY2FjaGVfZmlsZT1jb25maWcuY2FjaGUKLWNhY2hlX2ZpbGVfb3B0aW9uPQotY29uZmlnZGlycz0KLWV4dHJhY29uZmlnZGlycz0KLWRpcm9wdGlvbnM9Ci1leGVjX3ByZWZpeD0KLWV4ZWNfcHJlZml4b3B0aW9uPQotZmF0YWw9Ci1mbG9hdGluZ19wb2ludD1kZWZhdWx0Ci1nYXM9ZGVmYXVsdAotZ2NjX3ZlcnNpb249Ci1nY2NfdmVyc2lvbl90cmlnZ2VyPQotaG9zdF9hbGlhcz1OT0hPU1QKLWhvc3RfbWFrZWZpbGVfZnJhZz0KLW1vdmVpZmNoYW5nZT0KLW5vcmVjdXJzaW9uPQotb3RoZXJfb3B0aW9ucz0KLXBhY2thZ2VfbWFrZWZpbGVfZnJhZz0KLXBhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZz0KLXByZWZpeD0vdXNyL2xvY2FsCi1wcm9nbmFtZT0KLXByb2dyYW1fcHJlZml4PQotcHJvZ3JhbV9wcmVmaXhvcHRpb249Ci1wcm9ncmFtX3N1ZmZpeD0KLXByb2dyYW1fc3VmZml4b3B0aW9uPQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLXByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb249Ci1yZWRpcmVjdD0KLXJlbW92aW5nPQotc2l0ZT0KLXNpdGVfbWFrZWZpbGVfZnJhZz0KLXNpdGVfb3B0aW9uPQotc3JjZGlyPQotc3JjdHJpZ2dlcj0KLXN1YmRpcnM9Ci10YXJnZXRfYWxpYXM9Tk9UQVJHRVQKLXRhcmdldF9tYWtlZmlsZV9mcmFnPQotdW5kZWZzPU5PVU5ERUZTCi12ZXJzaW9uPSIkUmV2aXNpb24kIgoteDExPWRlZmF1bHQKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIyMgd2UgbWlnaHQgbmVlZCB0byB1c2Ugc29tZSBvdGhlciBzaGVsbCB0aGFuIC9iaW4vc2ggZm9yIHJ1bm5pbmcgc3Vic2hlbGxzCi0KLSMjIyBJZiB3ZSBhcmUgb24gV2luZG93cywgc2VhcmNoIGZvciB0aGUgc2hlbGwuICBUaGlzIHdpbGwgcGVybWl0IHBlb3BsZQotIyMjIHRvIG5vdCBoYXZlIC9iaW4vc2gsIGJ1dCB0byBiZSBhYmxlIHRvIHNlZSAvU09NRS9QQVRIL3NoIGNvbmZpZ3VyZQotIyMjIHdpdGhvdXQgYWxzbyBoYXZpbmcgdG8gc2V0IENPTkZJR19TSEVMTC4gIFRoaXMgY29kZSB3aWxsIHdvcmsgd2hlbgotIyMjIHVzaW5nIGJhc2gsIHdoaWNoIHNldHMgT1NUWVBFLgotY2FzZSAiJHtPU1RZUEV9IiBpbgotKndpbjMyKikKLSAgaWYgWyB4JHtDT05GSUdfU0hFTEx9ID0geCBdOyB0aGVuCi0gICAgaWYgWyAhIC1mIC9iaW4vc2ggXTsgdGhlbgotICAgICAgaWYgWyB4JHtTSEVMTH0gIT0geCBdICYmIFsgLWYgJHtTSEVMTH0gXTsgdGhlbgotCUNPTkZJR19TSEVMTD0ke1NIRUxMfQotCWV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGVsc2UKLQlmb3IgcHJvZyBpbiBzaCBzaC5leGUgYmFzaCBiYXNoLmV4ZTsgZG8KLQkgIElGUz0iJHtJRlM9CX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLQkgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0JICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0JICAgIGlmIHRlc3QgLWYgJGRpci8kcHJvZzsgdGhlbgotCSAgICAgIENPTkZJR19TSEVMTD0kZGlyLyRwcm9nCi0JICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIHRlc3QgLW4gIiR7Q09ORklHX1NIRUxMfSIgJiYgYnJlYWsKLQlkb25lCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLWNvbmZpZ19zaGVsbD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi1OT19FRElUPSJUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gIERvIG5vdCBlZGl0LiIKLQotIyMgdGhpcyBpcyBhIGxpdHRsZSB0b3VjaHkgYW5kIHdvbid0IGFsd2F5cyB3b3JrLCBidXQuLi4KLSMjCi0jIyBpZiB0aGUgYXJndlswXSBzdGFydHMgd2l0aCBhIHNsYXNoIHRoZW4gaXQgaXMgYW4gYWJzb2x1dGUgbmFtZSB0aGF0IGNhbiAoYW5kCi0jIyBtdXN0KSBiZSB1c2VkIGFzIGlzLgotIyMKLSMjIG90aGVyd2lzZSwgaWYgYXJndlswXSBoYXMgbm8gc2xhc2ggaW4gaXQsIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBvbiB0aGUKLSMjIHBhdGguICBTaW5jZSBQQVRIIG1pZ2h0IGluY2x1ZGUgIi4iIHdlIGFsc28gYWRkIGBwd2RgIHRvIHRoZSBlbmQgb2YgUEFUSC4KLSMjCi0KLXByb2duYW1lPSQwCi0jIGlmIFBXRCBhbHJlYWR5IGhhcyBhIHZhbHVlLCBpdCBpcyBwcm9iYWJseSB3cm9uZy4KLWlmIFsgLW4gIiRQV0QiIF07IHRoZW4gUFdEPWBwd2RgOyBmaQotCi1jYXNlICIke3Byb2duYW1lfSIgaW4KLS8qKSA7OwotKi8qKSA7OwotKikKLSAgICAgICAgUEFUSD0kUEFUSDoke1BXRD1gcHdkYH0gOyBleHBvcnQgUEFUSAotICAgICAgICA7OwotZXNhYwotCi0jIExvb3Agb3ZlciBhbGwgYXJncwotCi13aGlsZSA6Ci1kbwotCi0jIEJyZWFrIG91dCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhcmdzCi0JY2FzZSAkIyBpbgotCTApCi0JCWJyZWFrCi0JCTs7Ci0JZXNhYwotCi0jIEdldCB0aGUgZmlyc3QgYXJnLCBhbmQgc2h1ZmZsZQotCW9wdGlvbj0kMQotCXNoaWZ0Ci0KLSMgTWFrZSBhbGwgb3B0aW9ucyBoYXZlIHR3byBoeXBoZW5zCi0Jb3JpZ19vcHRpb249JG9wdGlvbgkjIFNhdmUgb3JpZ2luYWwgZm9yIGVycm9yIG1lc3NhZ2VzCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qKSA7OwotCS0qKSBvcHRpb249LSRvcHRpb24gOzsKLQllc2FjCi0JCQotIyBTcGxpdCBvdXQgdGhlIGFyZ3VtZW50IGZvciBvcHRpb25zIHRoYXQgdGFrZSB0aGVtCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qPSopCi0JCW9wdGFyZz1gZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgCi0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uIgotCQk7OwotIyBUaGVzZSBvcHRpb25zIGhhdmUgbWFuZGF0b3J5IHZhbHVlcy4gIFNpbmNlIHdlIGRpZG4ndCBmaW5kIGFuID0gc2lnbiwKLSMgdGhlIHZhbHVlIG11c3QgYmUgaW4gdGhlIG5leHQgYXJndW1lbnQKLQktLWJ1KiB8IC0tY2FjaGUqIHwgLS1leCogfCAtLWhvKiB8IC0tcHJlKiB8IC0tcHJvZ3JhbS1wKiB8IC0tcHJvZ3JhbS1zKiB8IC0tcHJvZ3JhbS10KiB8IC0tc2kqIHwgLS1zciogfCAtLXRhKiB8IC0tdG0qIHwgLS14LSogfCAtLWJpKiB8IC0tc2IqIHwgLS1saSogfCAtLWRhKiB8IC0tc3kqIHwgLS1zaCogfCAtLWxvKiB8IC0taW4qIHwgLS1vbCogfCAtLW1hKikKLQkJb3B0YXJnPSQxCi0JCXNoaWZ0Ci0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uPSRvcHRhcmciCi0JCTs7Ci0JLS12KQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgLXYiCi0JCTs7Ci0JLS0qKQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgJG9wdGlvbiIKLQkJOzsKLQllc2FjCi0KLSMgTm93LCBwcm9jZXNzIHRoZSBvcHRpb25zCi0JY2FzZSAkb3B0aW9uIGluCi0KLQktLWJpKikKLQkJYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1iaW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLWJ1aWxkKiB8IC0tYnUqKQotCQljYXNlICIkYnVpbGRfYWxpYXMiIGluCi0JCSIiKSBidWlsZF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgYnVpbGQgbWFjaGluZSBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1jYWNoZSopCi0JCWNhY2hlX2ZpbGU9JG9wdGFyZwotCQk7OwotCS0tZGEqKQotCQlkYXRhZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1kYXRhZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1kaXNhYmxlLSopCi0JCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tZGlzYWJsZS06ZW5hYmxlXzo7czotOl86ZydgCi0JCWV2YWwgJGVuYWJsZW9wdD1ubwotCQlkaXNhYmxlb3B0aW9ucz0iJGRpc2FibGVvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS1lbmFibGUtKikKLQkJY2FzZSAiJG9wdGlvbiIgaW4KLQkJKj0qKQk7OwotCQkqKQlvcHRhcmc9eWVzIDs7Ci0JCWVzYWMKLQotCQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAotCQlldmFsICIkZW5hYmxlb3B0PSckb3B0YXJnJyIKLQkJZW5hYmxlb3B0aW9ucz0iJGVuYWJsZW9wdGlvbnMgJyRvcHRpb24nIgotCQk7OwotCS0tZXhlYy1wcmVmaXgqIHwgLS1leCopCi0JCWV4ZWNfcHJlZml4PSRvcHRhcmcKLQkJZXhlY19wcmVmaXhvcHRpb249Ii0tZXhlYy1wcmVmaXg9JG9wdGFyZyIKLQkJOzsKLQktLWdhcyB8IC0tZyopCi0JCWdhcz15ZXMKLQkJOzsKLQktLWhlbHAgfCAtLWhlKikKLQkJZmF0YWw9eWVzCi0JCTs7Ci0JLS1ob3N0KiB8IC0taG8qKQotCQljYXNlICRob3N0X2FsaWFzIGluCi0JCU5PSE9TVCkgaG9zdF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1pbmMqKQotCQlpbmNsdWRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmNsdWRlZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1pbmYqKQotCQlpbmZvZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmZvZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1saWJkKikKLQkJbGliZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWxpYmUqKQotCQlsaWJleGVjZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJleGVjZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1sbyopCi0JCWxvY2Fsc3RhdGVkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxvY2Fsc3RhdGVkaXI9JG9wdGFyZyIKLQkJOzsKLQktLW1hKikKLQkJbWFuZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1tYW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLW5mcCB8IC0tbmYqKQotCQlmbG9hdGluZ19wb2ludD1ubwotCQlmbG9hdGluZ19wb2ludG9wdGlvbj0iLS1uZnAiCi0JCTs7Ci0JLS1ub3JlY3Vyc2lvbiB8IC0tbm8qKQotCQlub3JlY3Vyc2lvbj15ZXMKLQkJOzsKLQktLW9sKikKLQkJb2xkaW5jbHVkZWRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tb2xkaW5jbHVkZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tcHJlZml4KiB8IC0tcHJlKikKLQkJcHJlZml4PSRvcHRhcmcKLQkJcHJlZml4b3B0aW9uPSItLXByZWZpeD0kb3B0YXJnIgotCQk7OwotCS0tcHJvZ3JhbS1wcmVmaXgqIHwgLS1wcm9ncmFtLXAqKQotCQlwcm9ncmFtX3ByZWZpeD0kb3B0YXJnCi0JCXByb2dyYW1fcHJlZml4b3B0aW9uPSItLXByb2dyYW0tcHJlZml4PSRvcHRhcmciCi0JCTs7Ci0JLS1wcm9ncmFtLXN1ZmZpeCogfCAtLXByb2dyYW0tcyopCi0JCXByb2dyYW1fc3VmZml4PSRvcHRhcmcKLQkJcHJvZ3JhbV9zdWZmaXhvcHRpb249Ii0tcHJvZ3JhbS1zdWZmaXg9JG9wdGFyZyIKLQkJOzsKLQktLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUqIHwgLS1wcm9ncmFtLXQqKQotCQkjIERvdWJsZSBhbnkgYmFja3NsYXNoZXMgb3IgZG9sbGFyIHNpZ25zIGluIHRoZSBhcmd1bWVudAotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IC1lIGBlY2hvICR7b3B0YXJnfSB8IHNlZCAtZSAncy9cXFxcL1xcXFxcXFxcL2cnIC1lICdzL1xcXCQvJCQvZydgIgotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9uPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0nJG9wdGFyZyciCi0JCTs7Ci0JLS1ybSkKLQkJcmVtb3Zpbmc9LS1ybQotCQk7OwotCS0tc2IqKQotCQlzYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zYmluZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1zaCopCi0JCXNoYXJlZHN0YXRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zaGFyZWRzdGF0ZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tc2lsZW50IHwgLS1zaWwqIHwgLS1xdWlldCB8IC0tcSopCi0JCXJlZGlyZWN0PSI+L2Rldi9udWxsIgotCQl2ZXJib3NlPS0tc2lsZW50Ci0JCTs7Ci0JLS1zaXRlKiB8IC0tc2l0KikKLQkJc2l0ZT0kb3B0YXJnCi0JCXNpdGVfb3B0aW9uPSItLXNpdGU9JG9wdGFyZyIKLQkJOzsKLQktLXNyY2RpciovIHwgLS1zciovKQotICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuICBPdGhlcndpc2UsIHdoZW4gdGhlIGZpbGUgbmFtZSBnZXRzCi0gICAgICAgICAgICAgICAgIyBib2x0ZWQgaW50byBhbiBvYmplY3QgZmlsZSBhcyBkZWJ1ZyBpbmZvLCBpdCBoYXMgdHdvIHNsYXNoZXMKLSAgICAgICAgICAgICAgICAjIGluIGl0LiAgT3JkaW5hcmlseSB0aGlzIGlzIG9rLCBidXQgZW1hY3MgdGFrZXMgZG91YmxlIHNsYXNoCi0gICAgICAgICAgICAgICAgIyB0byBtZWFuICJmb3JnZXQgdGhlIGZpcnN0IHBhcnQiLgotCQlzcmNkaXI9YGVjaG8gJG9wdGFyZyB8IHNlZCAtZSAnczovJDo6J2AKLQkJOzsKLQktLXNyY2RpciogfCAtLXNyKikKLQkJc3JjZGlyPSRvcHRhcmcKLQkJOzsKLQktLXN5KikKLQkJc3lzY29uZmRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tc3lzY29uZmRpcj0kb3B0YXJnIgotCQk7OwotCS0tdGFyZ2V0KiB8IC0tdGEqKQotCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJTk9UQVJHRVQpIHRhcmdldF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQktLXRtcGRpciogfCAtLXRtKikKLQkJVE1QRElSPSRvcHRhcmcKLQkJdG1wZGlyb3B0aW9uPSItLXRtcGRpcj0kb3B0YXJnIgotCQk7OwotCS0tdmVyYm9zZSB8IC0tdiB8IC0tdmVyYiopCi0JCXJlZGlyZWN0PQotCQl2ZXJib3NlPS0tdmVyYm9zZQotCQk7OwotCS0tdmVyc2lvbiB8IC0tViB8IC0tdmVycyopCi0JCWVjaG8gIlRoaXMgaXMgQ3lnbnVzIENvbmZpZ3VyZSB2ZXJzaW9uIiBgZWNobyAke3ZlcnNpb259IHwgc2VkICdzL1sgJDpdLy9nJ2AKLQkJZXhpdCAwCi0JCTs7Ci0JLS13aXRoLSopCi0JCWNhc2UgIiRvcHRpb24iIGluCi0JCSo9KikJOzsKLQkJKikJb3B0YXJnPXllcyA7OwotCQllc2FjCi0KLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JCWV2YWwgJHdpdGhvcHQ9IiRvcHRhcmciCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgJG9wdGlvbiIKLQkJOzsKLQktLXdpdGhvdXQtKikKLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czpvdXQ6OjtzOi06XzpnJ2AKLQkJZXZhbCAkd2l0aG9wdD1ubwotCQl3aXRob3V0b3B0aW9ucz0iJHdpdGhvdXRvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS14KQl3aXRoX3g9eWVzCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLXgiCi0JCTs7Ci0JLS14LWkqIHwgLS14LWwqKSBvdGhlcl9vcHRpb25zPSIkb3RoZXJfb3B0aW9ucyAkb3JpZ19vcHRpb24iCi0JCTs7Ci0JLS0qKQotCQllY2hvICJjb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246IFwiJG9yaWdfb3B0aW9uXCI7IHVzZSAtLWhlbHAgZm9yIHVzYWdlLiIgPiYyCi0JCWV4aXQgMQotCQk7OwotCSopCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykgdW5kZWZzPSRvcHRpb24gOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQllc2FjCi1kb25lCi0KLSMgcHJvY2VzcyBob3N0IGFuZCB0YXJnZXQKLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIFVOREVGUwotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlbid0IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgdW5kZWZzIGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyAzLiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyA1LiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgZGVmYXVsdHMgdG8gaG9zdC4KLQotY2FzZSAiJHtmYXRhbH0iIGluCi0iIikKLQkjIE1ha2Ugc3VyZSB0aGF0IGhvc3QsIHRhcmdldCAmIHVuZGVmcyBhcmVuJ3QgYWxsIHNwZWNpZmllZCBhdCB0aGUKLQkjIHNhbWUgdGltZS4KLQljYXNlICRob3N0X2FsaWFzLS0tJHRhcmdldF9hbGlhcy0tLSR1bmRlZnMgaW4KLQlOT0hPU1QtLS0qLS0tKiB8ICotLS1OT1RBUkdFVC0tLSogfCAqLS0tKi0tLU5PVU5ERUZTKQotCQk7OwotCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUuICAxPiYyCi0JICAgZmF0YWw9eWVzCi0JICAgYnJlYWsgMgotCQk7OwotCWVzYWMKLQotCSMgTm93LCBkbyBkZWZhdWx0aW5nIGZvciBob3N0LgotCWNhc2UgJGhvc3RfYWxpYXMgaW4KLQlOT0hPU1QpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCSMgTmVpdGhlciAtLWhvc3Qgb3B0aW9uIG5vciB1bmRlZnMgd2VyZSBwcmVzZW50LgotCQkJIyBDYWxsIGNvbmZpZy5ndWVzcy4KLQkJCWd1ZXNzc3lzPWBlY2hvICR7cHJvZ25hbWV9IHwgc2VkICdzL2NvbmZpZ3VyZSQvY29uZmlnLmd1ZXNzLydgCi0JCQlpZiBob3N0X2FsaWFzPWAke2NvbmZpZ19zaGVsbH0gJHtndWVzc3N5c31gCi0JCQl0aGVuCi0JCQkJIyBJZiB0aGUgc3RyaW5nIHdlIGFyZSBnb2luZyB0byB1c2UgZm9yCi0JCQkJIyB0aGUgdGFyZ2V0IGlzIGEgcHJlZml4IG9mIHRoZSBzdHJpbmcKLQkJCQkjIHdlIGp1c3QgZ3Vlc3NlZCBmb3IgdGhlIGhvc3QsIHRoZW4KLQkJCQkjIGFzc3VtZSB3ZSBhcmUgcnVubmluZyBuYXRpdmUsIGFuZCBmb3JjZQotCQkJCSMgdGhlIHNhbWUgc3RyaW5nIGZvciBib3RoIHRhcmdldCBhbmQgaG9zdC4KLQkJCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJCQlOT1RBUkdFVCkgOzsKLQkJCQkqKQotCQkJCQlpZiBleHByICRob3N0X2FsaWFzIDogJHRhcmdldF9hbGlhcyA+L2Rldi9udWxsCi0JCQkJCXRoZW4KLQkJCQkJCWhvc3RfYWxpYXM9JHRhcmdldF9hbGlhcwotCQkJCQlmaQotCQkJCQk7OwotCQkJCWVzYWMKLQkJCQllY2hvICJDb25maWd1cmluZyBmb3IgYSAke2hvc3RfYWxpYXN9IGhvc3QuIiAxPiYyCi0JCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCWVsc2UKLQkJCQllY2hvICdDb25maWcuZ3Vlc3MgZmFpbGVkIHRvIGRldGVybWluZSB0aGUgaG9zdCB0eXBlLiAgWW91IG5lZWQgdG8gc3BlY2lmeSBvbmUuJyAxPiYyCi0JCQkJZmF0YWw9eWVzCi0JCQlmaQotCQkJOzsKLQkJKikKLQkJCWhvc3RfYWxpYXM9JHVuZGVmcwotCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCXVuZGVmcz1OT1VOREVGUwotCQkJOzsKLQkJZXNhYwotCWVzYWMKLQotCSMgRG8gZGVmYXVsdGluZyBmb3IgdGFyZ2V0LiAgSWYgLS10YXJnZXQgb3B0aW9uIGlzbid0IHByZXNlbnQsIGRlZmF1bHQKLQkjIHRvIHVuZGVmcy4gIElmIHVuZGVmcyBpc24ndCBwcmVzZW50LCBkZWZhdWx0IHRvIGhvc3QuCi0JY2FzZSAkdGFyZ2V0X2FsaWFzIGluCi0JTk9UQVJHRVQpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCXRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcwotCQkJOzsKLQkJKikKLQkJCXRhcmdldF9hbGlhcz0kdW5kZWZzCi0JCQlhcmd1bWVudHM9Ii0tdGFyZ2V0PSR0YXJnZXRfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCTs7Ci0JCWVzYWMKLQllc2FjCi0JOzsKLSopIDs7Ci1lc2FjCi0KLWlmIFsgLW4gIiR7ZmF0YWx9IiAtbyAiJHtob3N0X2FsaWFzfSIgPSAiaGVscCIgXSA7IHRoZW4KLQlleGVjIDE+JjIKLQllY2hvIFVzYWdlOiBjb25maWd1cmUgW09QVElPTlNdIFtIT1NUXQotCWVjaG8KLQllY2hvIE9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0c10KLQllY2hvICcgLS1wcmVmaXg9TVlESVIJCSBpbnN0YWxsIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWV4ZWMtcHJlZml4PU1ZRElSCSBpbnN0YWxsIGhvc3QtZGVwZW5kZW50IGZpbGVzIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWhlbHAJCQkgcHJpbnQgdGhpcyBtZXNzYWdlIFtub3JtYWwgY29uZmlnXScKLQllY2hvICcgLS1idWlsZD1CVUlMRAkJIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdJwotCWVjaG8gJyAtLWhvc3Q9SE9TVAkJIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZGV0ZXJtaW5lZCB2aWEgY29uZmlnLmd1ZXNzXScKLQllY2hvICcgLS1ub3JlY3Vyc2lvbgkJIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXScKLQllY2hvICcgLS1wcm9ncmFtLXByZWZpeD1GT08JIHByZXBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS1zdWZmaXg9Rk9PCSBhcHBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QIHRyYW5zZm9ybSBpbnN0YWxsZWQgbmFtZXMgYnkgc2VkIHBhdHRlcm4gUCBbIiJdJwotCWVjaG8gJyAtLXNpdGU9U0lURQkJIGNvbmZpZ3VyZSB3aXRoIHNpdGUtc3BlY2lmaWMgbWFrZWZpbGUgZm9yIFNJVEUnCi0JZWNobyAnIC0tc3JjZGlyPURJUgkJIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFsuIG9yIC4uXScKLQllY2hvICcgLS10YXJnZXQ9VEFSR0VUCSBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdJwotCWVjaG8gJyAtLXRtcGRpcj1UTVBESVIJIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZXMgaW4gVE1QRElSIFsvdG1wXScKLQllY2hvICcgLS1uZnAJCQkgY29uZmlndXJlIGZvciBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBbaGFyZCBmbG9hdF0nCi0JZWNobyAnIC0td2l0aC1GT08sIC0td2l0aC1GT089QkFSIHBhY2thZ2UgRk9PIGlzIGF2YWlsYWJsZSAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0td2l0aG91dC1GT08JCSBwYWNrYWdlIEZPTyBpcyBOT1QgYXZhaWxhYmxlJwotCWVjaG8gJyAtLWVuYWJsZS1GT08sIC0tZW5hYmxlLUZPTz1CQVIgaW5jbHVkZSBmZWF0dXJlIEZPTyAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0tZGlzYWJsZS1GT08JCSBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTycKLQllY2hvCi0JZWNobyAnV2hlcmUgSE9TVCBhbmQgVEFSR0VUIGFyZSBzb21ldGhpbmcgbGlrZSAic3BhcmMtc3Vub3MiLCAibWlwcy1zZ2ktaXJpeDUiLCBldGMuJwotCWVjaG8KLQlpZiBbIC1yIGNvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLQkJY2F0IGNvbmZpZy5zdGF0dXMKLQlmaQotCi0JZXhpdCAxCi1maQotCi1jb25maWdzdWI9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9jb25maWcuc3ViLydgCi1tb3ZlaWZjaGFuZ2U9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9tb3ZlLWlmLWNoYW5nZS8nYAotdG9wc3JjZGlyPWBjZCBcYGRpcm5hbWUgJHtwcm9nbmFtZX1cYDsgcHdkYAotCi0KLSMgdGhpcyBpcyBhIGhhY2suICBzdW40IG11c3QgYWx3YXlzIGJlIGEgdmFsaWQgaG9zdCBhbGlhcyBvciB0aGlzIHdpbGwgZmFpbC4KLWlmICR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gc3VuNCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0gICAgICAgIHRydWUKLWVsc2UKLSAgICAgICAgZWNobyAnKioqJyBjYW5ub3QgZmluZCBjb25maWcuc3ViLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi0KLXRvdWNoIGNvbmZpZy5qdW5rCi1pZiAke2NvbmZpZ19zaGVsbH0gJHttb3ZlaWZjaGFuZ2V9IGNvbmZpZy5qdW5rIGNvbmZpZy50cmFzaCA7IHRoZW4KLSAgICAgICAgdHJ1ZQotZWxzZQotICAgICAgICBlY2hvICcqKionIGNhbm5vdCBmaW5kIG1vdmUtaWYtY2hhbmdlLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi1ybSAtZiBjb25maWcuanVuayBjb25maWcudHJhc2gKLQotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIiIpCi0gICAgICAgIGlmIFsgLXIgY29uZmlndXJlLmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgc3JjZGlyPS4KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIFsgLXIgJHtwcm9nbmFtZX0uaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY2Rpcj1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAnczovY29uZmlndXJlJDo6J2AKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJDYW4ndCBmaW5kIGNvbmZpZ3VyZS5pbi4gIFRyeSB1c2luZyAtLXNyY2Rpcj1zb21lX2RpciIgIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0qKQotCSMgU2V0IHNyY2RpciB0byAiLiIgaWYgdGhhdCdzIHdoYXQgaXQgaXMuCi0JIyBUaGlzIGlzIGltcG9ydGFudCBmb3IgbXVsdGlsaWIgc3VwcG9ydC4KLQlpZiBbICEgLWQgJHtzcmNkaXJ9IF0gOyB0aGVuCi0JCWVjaG8gIkludmFsaWQgc291cmNlIGRpcmVjdG9yeSAke3NyY2Rpcn0iID4mMgotCQlleGl0IDEKLQlmaQotCXB3ZD1gcHdkYAotCXNyY3B3ZD1gY2QgJHtzcmNkaXJ9IDsgcHdkYAotCWlmIFsgIiR7cHdkfSIgPSAiJHtzcmNwd2R9IiBdIDsgdGhlbgotCQlzcmNkaXI9LgotCWZpCi1lc2FjCi0KLSMjIyB3YXJuIGFib3V0IHNvbWUgY29uZmxpY3RpbmcgY29uZmlndXJhdGlvbnMuCi0KLWNhc2UgIiR7c3JjZGlyfSIgaW4KLSIuIikgOzsKLSopCi0gICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9L2NvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBlY2hvICcqKionIENhbm5vdCBjb25maWd1cmUgaGVyZSBpbiBcIiR7UFdEPWBwd2RgfVwiIHdoZW4gXCIke3NyY2Rpcn1cIiBpcyBjdXJyZW50bHkgY29uZmlndXJlZC4gMT4mMgotICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotZXNhYwotCi0KLSMgZGVmYXVsdCBleGVjX3ByZWZpeAotY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCi0iIikgZXhlY19wcmVmaXg9IlwkKHByZWZpeCkiIDs7Ci0qKSA7OwotZXNhYwotCi0jIERlZmluZSB0aGUgdHJpZ2dlciBmaWxlIHRvIG1ha2Ugc3VyZSBjb25maWd1cmUgd2lsbCByZS1ydW4gd2hlbmV2ZXIKLSMgdGhlIGdjYyB2ZXJzaW9uIG51bWJlciBjaGFuZ2VzLgotaWYgWyAiJHt3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIrc2V0fSIgPSBzZXQgXTsgdGhlbgotICAgIGdjY192ZXJzaW9uX3RyaWdnZXI9IiR3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIiCi0gICAgZ2NjX3ZlcnNpb249YGdyZXAgdmVyc2lvbl9zdHJpbmcgJHt3aXRoX2djY192ZXJzaW9uX3RyaWdnZXJ9IHwgc2VkIC1lICdzLy4qXCJcKFteIFwiXSpcKVsgXCJdLiovXDEvJ2AKLWVsc2UKLSAgICAjIElmIGdjYydzIHNvdXJjZXMgYXJlIGF2YWlsYWJsZSwgZGVmaW5lIHRoZSB0cmlnZ2VyIGZpbGUuCi0gICAgaWYgWyAtZiAke3RvcHNyY2Rpcn0vZ2NjL3ZlcnNpb24uYyBdIDsgdGhlbgotCWdjY192ZXJzaW9uX3RyaWdnZXI9JHt0b3BzcmNkaXJ9L2djYy92ZXJzaW9uLmMKLQlnY2NfdmVyc2lvbj1gZ3JlcCB2ZXJzaW9uX3N0cmluZyAke2djY192ZXJzaW9uX3RyaWdnZXJ9IHwgc2VkIC1lICdzLy4qXCJcKFteIFwiXSpcKVsgXCJdLiovXDEvJ2AKLQljYXNlICIkYXJndW1lbnRzIiBpbgotCSAgKi0td2l0aC1nY2MtdmVyc2lvbi10cmlnZ2VyPSRnY2NfdmVyc2lvbl90cmlnZ2VyKiApCi0JICAgIDs7Ci0JICAqICkKLQkgICAgIyBNYWtlIHN1cmUgY29uZmlndXJlLmluIGtub3dzIGFib3V0IHRoaXMuCi0JICAgIGFyZ3VtZW50cz0iLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIgJGFyZ3VtZW50cyIKLQkgICAgOzsKLQllc2FjCi0Jd2l0aG9wdGlvbnM9Ii0td2l0aC1nY2MtdmVyc2lvbi10cmlnZ2VyPSRnY2NfdmVyc2lvbl90cmlnZ2VyICR3aXRob3B0aW9ucyIKLSAgICBmaQotZmkKLQotIyMjIGJyZWFrIHVwICR7c3JjZGlyfS9jb25maWd1cmUuaW4uCi1jYXNlICJgZ3JlcCAnXiMgcGVyXC1ob3N0OicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbmAiIGluCi0iIikKLSAgICAgICAgZWNobyAnKioqJyAke3NyY2Rpcn0vY29uZmlndXJlLmluIGhhcyBubyBcInBlci1ob3N0OlwiIGxpbmUuIDE+JjIKLQkjIENoZWNrIGZvciBhIGRpcmVjdG9yeSB0aGF0J3MgYmVlbiBjb252ZXJ0ZWQgdG8gdXNlIGF1dG9jb25mIHNpbmNlCi0JIyBpdCB3YXMgbGFzdCBjb25maWd1cmVkLgotCWlmIGdyZXAgQUNfT1VUUFVUICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPi9kZXYvbnVsbCA7IHRoZW4KLQkgIGVjaG8gJyoqKicgSG1tLCBsb29rcyBsaWtlIHRoaXMgZGlyZWN0b3J5IGhhcyBiZWVuIGF1dG9jb25maXNjYXRlZC4gMT4mMgotCSAgaWYgWyAtciAke3NyY2Rpcn0vY29uZmlndXJlIF0gOyB0aGVuCi0JICAgIGVjaG8gJyoqKicgUnVubmluZyB0aGUgbG9jYWwgY29uZmlndXJlIHNjcmlwdC4gMT4mMgotCSAgICBjYXNlICIke2NhY2hlX2ZpbGV9IiBpbgotCSAgICAiIikgY2FjaGVfZmlsZV9vcHRpb249IDs7Ci0JICAgICopICBjYWNoZV9maWxlX29wdGlvbj0iLS1jYWNoZS1maWxlPSR7Y2FjaGVfZmlsZX0iIDs7Ci0JICAgIGVzYWMKLQkgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke3NyY2Rpcn0iCi0JICAgIGNhc2UgIiR7YnVpbGRfYWxpYXN9IiBpbgotCSAgICAiIikgYnVpbGRvcHQ9IDs7Ci0JICAgICopICBidWlsZG9wdD0iLS1idWlsZD0ke2J1aWxkX2FsaWFzfSIgOzsKLQkgICAgZXNhYwotCSAgICBldmFsIGV4ZWMgJHtjb25maWdfc2hlbGx9ICR7c3JjZGlyfS9jb25maWd1cmUgJHt2ZXJib3NlfSBcCi0JCSR7YnVpbGRvcHR9IC0taG9zdD0ke2hvc3RfYWxpYXN9IC0tdGFyZ2V0PSR7dGFyZ2V0X2FsaWFzfSBcCi0JCSR7cHJlZml4b3B0aW9ufSAke3RtcGRpcm9wdGlvbn0gJHtleGVjX3ByZWZpeG9wdGlvbn0gXAotCQkke3NyY2Rpcm9wdGlvbn0gJHtkaXJvcHRpb25zfSBcCi0JCSR7cHJvZ3JhbV9wcmVmaXhvcHRpb259ICR7cHJvZ3JhbV9zdWZmaXhvcHRpb259IFwKLQkJJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9ufSAke3NpdGVfb3B0aW9ufSBcCi0JCSR7d2l0aG9wdGlvbnN9ICR7d2l0aG91dG9wdGlvbnN9IFwKLQkJJHtlbmFibGVvcHRpb25zfSAke2Rpc2FibGVvcHRpb25zfSAke2Zsb2F0aW5nX3BvaW50b3B0aW9ufSBcCi0JCSR7Y2FjaGVfZmlsZV9vcHRpb259ICR7cmVtb3Zpbmd9ICR7b3RoZXJfb3B0aW9uc30gJHtyZWRpcmVjdH0KLQkgIGVsc2UKLQkgICAgZWNobyAnKioqJyBUaGVyZSBpcyBubyBjb25maWd1cmUgc2NyaXB0IHByZXNlbnQgdGhvdWdoLiAxPiYyCi0JICBmaQotCWZpCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotKikgOzsKLWVzYWMKLQotY2FzZSAiYGdyZXAgJ14jIHBlclwtdGFyZ2V0OicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbmAiIGluCi0iIikKLSAgICAgICAgZWNobyAnKioqJyAke3NyY2Rpcn0vY29uZmlndXJlLmluIGhhcyBubyBcInBlci10YXJnZXQ6XCIgbGluZS4gMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSopIDs7Ci1lc2FjCi0KLWNhc2UgIiR7VE1QRElSfSIgaW4KLSIiKSBUTVBESVI9L3RtcCA7IGV4cG9ydCBUTVBESVIgOzsKLSopIDs7Ci1lc2FjCi0KLSMga2VlcCB0aGlzIGZpbGVuYW1lIHNob3J0IGZvciAmJSolJCojIDE0IGNoYXIgZmlsZSBuYW1lcyBhbmQgOCszIGZpbGUgbmFtZXMKLXRtcGZpbGU9JHtUTVBESVJ9L2NOZiQkCi0jIE5vdGUgdGhhdCB1bmRlciBtYW55IHZlcnNpb25zIG9mIHNoIGEgdHJhcCBoYW5kbGVyIGZvciAwIHdpbGwgKm92ZXJyaWRlKiBhbnkKLSMgZXhpdCBzdGF0dXMgeW91IGV4cGxpY2l0bHkgc3BlY2lmeSEgIEF0IHRoaXMgcG9pbnQsIHRoZSBvbmx5IG5vbi1lcnJvciBleGl0Ci0jIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHNjcmlwdDsgdGhlc2UgYWN0aW9ucyBhcmUgZHVwbGljYXRlZCB0aGVyZSwgbWludXMKLSMgdGhlICJleGl0IDEiLiAgRG9uJ3QgdXNlICJleGl0IDAiIGFueXdoZXJlIGFmdGVyIHRoaXMgd2l0aG91dCByZXNldHRpbmcgdGhlCi0jIHRyYXAgaGFuZGxlciwgb3IgeW91J2xsIGxvc2UuCi10cmFwICJybSAtZiBNYWtlZmlsZS50ZW0gJHt0bXBmaWxlfS5jb20gJHt0bXBmaWxlfS50Z3QgJHt0bXBmaWxlfS5oc3QgJHt0bXBmaWxlfS5wb3M7IGV4aXQgMSIgMCAxIDIgMTUKLQotIyBzcGxpdCAke3NyY2Rpcn0vY29uZmlndXJlLmluIGludG8gY29tbW9uLCBwZXItaG9zdCwgcGVyLXRhcmdldCwKLSMgYW5kIHBvc3QtdGFyZ2V0IHBhcnRzLiAgUG9zdC10YXJnZXQgaXMgb3B0aW9uYWwuCi1zZWQgLWUgJy9eIyBwZXJcLWhvc3Q6LywkZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0uY29tCi1zZWQgLWUgJzEsL14jIHBlclwtaG9zdDovZCcgLWUgJy9eIyBwZXJcLXRhcmdldDovLCRkJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS5oc3QKLWlmIGdyZXAgJ14jIHBvc3QtdGFyZ2V0OicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+L2Rldi9udWxsIDsgdGhlbgotICBzZWQgLWUgJzEsL14jIHBlclwtdGFyZ2V0Oi9kJyAtZSAnL14jIHBvc3RcLXRhcmdldDovLCRkJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS50Z3QKLSAgc2VkIC1lICcxLC9eIyBwb3N0XC10YXJnZXQ6L2QnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnBvcwotZWxzZQotICBzZWQgLWUgJzEsL14jIHBlclwtdGFyZ2V0Oi9kJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS50Z3QKLSAgZWNobyA+JHt0bXBmaWxlfS5wb3MKLWZpCi0KLSMjIyBkbyBjb21tb24gcGFydCBvZiBjb25maWd1cmUuaW4KLQotIyBJZiB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgY29tcGlsZXIgZG9lcyBub3QgZXhpc3QsIGJ1dCB0aGUgImdjYyIgZGlyZWN0b3J5IGRvZXMsCi0jIHdlIHdpbGwgc2tpcCB0aGlzIGRpcmVjdG9yeTsgaW4gdGhpcyBjYXNlIHRoZSBzdWItZGlyZWN0b3J5J3MgY29tbW9uIHBhcnQKLSMgb2YgY29uZmlndXJlLmluIHdpbGwgY3JlYXRlIGEgc21hbGwgc2hlbGwgc2NyaXB0ICJza2lwLXRoaXMtZGlyIiBjb250YWluaW5nCi0jIGNvbW1hbmRzIHRvIGNvbXBsZXRlbHkgY2xlYW4gdXAgYW55IHRlbXBvcmFyeSBvciBjcmVhdGVkIGZpbGVzLgotCi0uICR7dG1wZmlsZX0uY29tCi0KLWlmIHRlc3QgLWYgc2tpcC10aGlzLWRpcjsgdGhlbgotCSMgUGVyZm9ybSB0aGUgc2FtZSBjbGVhbnVwIGFzIHRoZSB0cmFwIGhhbmRsZXIsIG1pbnVzIHRoZSAiZXhpdCAxIiBvZiBjb3Vyc2UsCi0JIyBhbmQgcmVzZXQgdGhlIHRyYXAgaGFuZGxlci4KLQl0cmFwIDAKLQlybSAtZiBNYWtlZmlsZSogJHt0bXBmaWxlfS5jb20gJHt0bXBmaWxlfS50Z3QgJHt0bXBmaWxlfS5oc3QgJHt0bXBmaWxlfS5wb3MKLQkjIEV4ZWN1dGUgdGhlIGZpbmFsIGNsZWFuLXVwIGFjdGlvbnMKLQkke2NvbmZpZ19zaGVsbH0gc2tpcC10aGlzLWRpcgotCSMgYW5kIHN0b3AgY29uZmlndXJpbmcgdGhpcyBkaXJlY3RvcnkuCi0JZXhpdCAwCi1maQotCi0jIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiBjb25maWd1cmUuaW4KLWNhc2UgIiR7c3JjdHJpZ2dlcn0iIGluCi0iIikKLSAgICAgICAgZWNobyAnKioqJyBzcmN0cmlnZ2VyIG5vdCBzZXQgaW4gJHtQV0Q9YHB3ZGB9L2NvbmZpZ3VyZS5pbi4gIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1jYXNlICIke2J1aWxkX2FsaWFzfSIgaW4KLSIiKQotCWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke2hvc3RfYWxpYXN9YCA7IHRoZW4KLQkgICAgYnVpbGRfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotCSAgICBidWlsZF92ZW5kb3I9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi0JICAgIGJ1aWxkX29zPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotCSAgICBidWlsZD0ke2J1aWxkX2NwdX0tJHtidWlsZF92ZW5kb3J9LSR7YnVpbGRfb3N9Ci0JICAgIGJ1aWxkX2FsaWFzPSR7aG9zdF9hbGlhc30KLQlmaQotCTs7Ci0qKQotCWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke2J1aWxkX2FsaWFzfWAgOyB0aGVuCi0JICAgIGJ1aWxkb3B0PSItLWJ1aWxkPSR7YnVpbGRfYWxpYXN9IgotCSAgICBidWlsZF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0JICAgIGJ1aWxkX3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLQkgICAgYnVpbGRfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0JICAgIGJ1aWxkPSR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KLQllbHNlCi0JICAgIGVjaG8gIlVucmVjb2duaXplZCBidWlsZCBzeXN0ZW0gbmFtZSAke2J1aWxkX2FsaWFzfS4iIDE+JjIKLQkgICAgZXhpdCAxCi0JZmkKLQk7OwotZXNhYwotCi1pZiByZXN1bHQ9YCR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gJHtob3N0X2FsaWFzfWAgOyB0aGVuCi0gICAgdHJ1ZQotZWxzZQotICAgIGVjaG8gIlVucmVjb2duaXplZCBob3N0IHN5c3RlbSBuYW1lICR7aG9zdF9hbGlhc30uIiAxPiYyCi0gICAgZXhpdCAxCi1maQotaG9zdF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1ob3N0PSR7aG9zdF9jcHV9LSR7aG9zdF92ZW5kb3J9LSR7aG9zdF9vc30KLQotLiAke3RtcGZpbGV9LmhzdAotCi1pZiByZXN1bHQ9YCR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gJHt0YXJnZXRfYWxpYXN9YCA7IHRoZW4KLSAgICB0cnVlCi1lbHNlCi0gICAgZWNobyAiVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gbmFtZSAke3RhcmdldF9hbGlhc30uIiAxPiYyCi0gICAgZXhpdCAxCi1maQotdGFyZ2V0X2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi10YXJnZXQ9JHt0YXJnZXRfY3B1fS0ke3RhcmdldF92ZW5kb3J9LSR7dGFyZ2V0X29zfQotCi0uICR7dG1wZmlsZX0udGd0Ci0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWNhc2UgIiR7c3JjZGlyfSIgaW4KLSIiKQotICAgICAgICBzcmNkaXJkZWZhdWx0ZWQ9MQotICAgICAgICBzcmNkaXI9LgotICAgICAgICBpZiBbICEgLXIgJHtzcmN0cmlnZ2VyfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgIHNyY2Rpcj0uLgotICAgICAgICBmaQotICAgICAgICA7OwotKikgOzsKLWVzYWMKLQotaWYgWyAhIC1yICR7c3JjZGlyfS8ke3NyY3RyaWdnZXJ9IF0gOyB0aGVuCi0gICAgICAgIGNhc2UgIiR7c3JjZGlyZGVmYXVsdGVkfSIgaW4KLSAgICAgICAgIiIpIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBDYW4ndCBmaW5kICR7c3JjbmFtZX0gc291cmNlcyBpbiAke1BXRD1gcHdkYH0vJHtzcmNkaXJ9IiAxPiYyIDs7Ci0gICAgICAgICopICBlY2hvICcqKionICIke3Byb2duYW1lfTogQ2FuJ3QgZmluZCAke3NyY25hbWV9IHNvdXJjZXMgaW4gJHtQV0Q9YHB3ZGB9Ly4gb3IgJHtQV0Q9YHB3ZGB9Ly4uIiAxPiYyIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBlY2hvICcqKionIFwoQXQgbGVhc3QgJHtzcmN0cmlnZ2VyfSBpcyBtaXNzaW5nLlwpIDE+JjIKLSAgICAgICAgZXhpdCAxCi1maQotCi0jIFNvbWUgc3lzdGVtcyAoZS5nLiwgb25lIG9mIHRoZSBpMzg2LWFpeCBzeXN0ZW1zIHRoZSBnYXMgdGVzdGVycyBhcmUKLSMgdXNpbmcpIGRvbid0IGhhbmRsZSAiXCQiIGNvcnJlY3RseSwgc28gZG9uJ3QgdXNlIGl0IGhlcmUuCi10b29sZGlyPSckKGV4ZWNfcHJlZml4KScvJHt0YXJnZXRfYWxpYXN9Ci0KLWlmIFsgIiR7aG9zdF9hbGlhc30iICE9ICIke3RhcmdldF9hbGlhc30iIF0gOyB0aGVuCi0gICAgaWYgWyAiJHtwcm9ncmFtX3ByZWZpeG9wdGlvbn0iID0gIiIgXSA7IHRoZW4KLSAgICAgICAgaWYgWyAiJHtwcm9ncmFtX3N1ZmZpeG9wdGlvbn0iID0gIiIgXSA7IHRoZW4gCi0gICAgICAgICAgICBpZiBbICIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259IiA9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LSA7Ci0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgIGZpCi1maQotCi0jIE1lcmdlIHByb2dyYW1fcHJlZml4IGFuZCBwcm9ncmFtX3N1ZmZpeCBvbnRvIHByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0jIChwcm9ncmFtX3N1ZmZpeCB1c2VkIHRvIHVzZSAkLCBidXQgaXQncyBoYXJkIHRvIHByZXNlcnZlICQgdGhyb3VnaCBib3RoCi0jIG1ha2UgYW5kIHNoLikKLWlmIFsgIiR7cHJvZ3JhbV9zdWZmaXh9IiAhPSAiIiBdIDsgdGhlbgotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ii1lIHMsXFxcXCguKlxcXFwpLFxcXFwxJHtwcm9ncmFtX3N1ZmZpeH0sICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iCi1maQotCi1pZiBbICIke3Byb2dyYW1fcHJlZml4fSIgIT0gIiIgXSA7IHRoZW4KLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSItZSBzLF4sJHtwcm9ncmFtX3ByZWZpeH0sICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iCi1maQotCi0jIElmIENDIGFuZCBDWFggYXJlIG5vdCBzZXQgaW4gdGhlIGVudmlyb25tZW50LCBhbmQgdGhlIE1ha2VmaWxlCi0jIGV4aXN0cywgdHJ5IHRvIGV4dHJhY3QgdGhlbSBmcm9tIGl0LiAgVGhpcyBpcyB0byBoYW5kbGUgcnVubmluZwotIyAuL2NvbmZpZy5zdGF0dXMgYnkgaGFuZC4KLWlmIFsgLXogIiR7Q0N9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL15DQ1sgCV0qPS8gcy9DQ1sgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYwotICBDQz1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKLSAgcm0gLWYgTWFrZWZpbGUuY2MKLWZpCi0KLWlmIFsgLXogIiR7Q0ZMQUdTfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ0ZMQUdTWyAJXSo9LyBzL0NGTEFHU1sgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYwotICBDRkxBR1M9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi1pZiBbIC16ICIke0NYWH0iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXkNYWFsgCV0qPS8gcy9DWFhbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKLSAgQ1hYPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAotICBybSAtZiBNYWtlZmlsZS5jYwotZmkKLQotaWYgWyAteiAiJHtDWFhGTEFHU30iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXkNYWEZMQUdTWyAJXSo9LyBzL0NYWEZMQUdTWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENYWEZMQUdTPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAotICBybSAtZiBNYWtlZmlsZS5jYwotZmkKLQotIyBHZW5lcmF0ZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgWUFDQy4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgbWFrZWZpbGUgY2FuJ3QKLSMgbG9jYXRlIGJpc29uIG9yIGJ5YWNjIGluIG9iamRpci4KLQotZm9yIHByb2cgaW4gJ2Jpc29uIC15JyBieWFjYyB5YWNjCi1kbwotICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyLyR0bXA7IHRoZW4KLSAgICAgIERFRkFVTFRfWUFDQz0iJHByb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgdGVzdCAtbiAiJERFRkFVTFRfWUFDQyIgJiYgYnJlYWsKLWRvbmUKLQotIyBHZW5lcmF0ZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgTTQuICBUaGlzIGlzIHVzZWQgaWYgdGhlIG1ha2VmaWxlIGNhbid0Ci0jIGxvY2F0ZSBtNCBpbiBvYmpkaXIuCi0KLWZvciBwcm9nIGluIGdtNCBnbnVtNCBtNAotZG8KLSAgc2V0IGR1bW15ICRwcm9nOyB0bXA9JDIKLSAgSUZTPSIke0lGUz0gICB9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvJHRtcDsgdGhlbgotICAgICAgREVGQVVMVF9NND0iJHByb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgdGVzdCAtbiAiJERFRkFVTFRfTTQiICYmIGJyZWFrCi1kb25lCi0KLSMgR2VuZXJhdGUgYSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIExFWC4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgbWFrZWZpbGUgY2FuJ3QKLSMgbG9jYXRlIGZsZXggaW4gb2JqZGlyLgotCi1mb3IgcHJvZyBpbiBmbGV4IGxleAotZG8KLSAgc2V0IGR1bW15ICRwcm9nOyB0bXA9JDIKLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci8kdG1wOyB0aGVuCi0gICAgICBERUZBVUxUX0xFWD0iJHByb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgdGVzdCAtbiAiJERFRkFVTFRfTEVYIiAmJiBicmVhawotZG9uZQotCi0jIEJJTlVUSUxTIExPQ0FMOiBUaGlzIGlzIGluY2x1ZGVkIGluIHRoZSBkZWZhdWx0IENGTEFHUyB3aGVuIHVzaW5nIGdjYy4KLXdhcm5fY2ZsYWdzPSItVyAtV2FsbCIKLQotaWYgWyAiJHtidWlsZH0iICE9ICIke2hvc3R9IiBdOyB0aGVuCi0gICMgSWYgd2UgYXJlIGRvaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MsIGluIHdoaWNoIHRoZSBob3N0IGFuZCBidWlsZCBzeXN0ZW1zCi0gICMgYXJlIG5vdCB0aGUgc2FtZSwgd2Ugc2V0IHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB0b29scy4KLQotICB0b29scz0iQVIgQVJfRk9SX1RBUkdFVCBBUyBBU19GT1JfVEFSR0VUIEJJU09OIENDX0ZPUl9CVUlMRCIKLSAgdG9vbHM9IiR7dG9vbHN9IENDX0ZPUl9UQVJHRVQgQ1hYX0ZPUl9UQVJHRVQiCi0gIHRvb2xzPSIke3Rvb2xzfSBETExUT09MIERMTFRPT0xfRk9SX1RBUkdFVCBHQ0NfRk9SX1RBUkdFVCBIT1NUX1BSRUZJWCIKLSAgdG9vbHM9IiR7dG9vbHN9IEhPU1RfUFJFRklYXzEgTEQgTERfRk9SX1RBUkdFVCBMRVggTUFLRUlORk8gTk0iCi0gIHRvb2xzPSIke3Rvb2xzfSBOTV9GT1JfVEFSR0VUIFJBTkxJQiBSQU5MSUJfRk9SX1RBUkdFVCIKLSAgdG9vbHM9IiR7dG9vbHN9IFdJTkRSRVMgV0lORFJFU19GT1JfVEFSR0VUIFlBQ0MiCi0KLSAgZm9yIHZhciBpbiAke3Rvb2xzfTsgZG8KLSAgICBpZiBbIC16ICJgZXZhbCAnZWNobyAkJyIke3Zhcn0iYCIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgICAgIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXiciJHt2YXJ9IidbIAldKj0vIHMvJyIke3Zhcn0iJ1sgCV0qPVsgCV0qXCguKlwpL1wxL3AnIFwKLQk8IE1ha2VmaWxlID4gTWFrZWZpbGUudgotICAgICAgdD1gdGFpbCAtMSBNYWtlZmlsZS52YAotICAgICAgaWYgWyAtbiAiJHt0fSIgXTsgdGhlbgotCWV2YWwgIiR7dmFyfT0nJHt0fSciCi0gICAgICBmaQotICAgICAgcm0gLWYgTWFrZWZpbGUudgotICAgIGZpCi0gIGRvbmUKLQotICBBUj0ke0FSLSR7aG9zdF9hbGlhc30tYXJ9Ci0gIEFSX0ZPUl9UQVJHRVQ9JHtBUl9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1hcn0KLSAgQVM9JHtBUy0ke2hvc3RfYWxpYXN9LWFzfQotICBBU19GT1JfVEFSR0VUPSR7QVNfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYXN9Ci0gIEJJU09OPSR7QklTT04tYmlzb259Ci0gIENDPSR7Q0MtJHtob3N0X2FsaWFzfS1nY2N9Ci0gIENGTEFHUz0ke0NGTEFHUy0iLWcgLU8yICR7d2Fybl9jZmxhZ3N9In0KLSAgQ1hYPSR7Q1hYLSR7aG9zdF9hbGlhc30tYysrfQotICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotICBDQ19GT1JfQlVJTEQ9JHtDQ19GT1JfQlVJTEQtZ2NjfQotICBDQ19GT1JfVEFSR0VUPSR7Q0NfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tZ2NjfQotICBDWFhfRk9SX1RBUkdFVD0ke0NYWF9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1jKyt9Ci0gIERMTFRPT0w9JHtETExUT09MLSR7aG9zdF9hbGlhc30tZGxsdG9vbH0KLSAgRExMVE9PTF9GT1JfVEFSR0VUPSR7RExMVE9PTF9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1kbGx0b29sfQotICBHQ0NfRk9SX1RBUkdFVD0ke0dDQ19GT1JfVEFSR0VULSR7Q0NfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tZ2NjfX0KLSAgSE9TVF9QUkVGSVg9JHtidWlsZF9hbGlhc30tCi0gIEhPU1RfUFJFRklYXzE9JHtidWlsZF9hbGlhc30tCi0gIExEPSR7TEQtJHtob3N0X2FsaWFzfS1sZH0KLSAgTERfRk9SX1RBUkdFVD0ke0xEX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWxkfQotICBNQUtFSU5GTz0ke01BS0VJTkZPLW1ha2VpbmZvfQotICBOTT0ke05NLSR7aG9zdF9hbGlhc30tbm19Ci0gIE5NX0ZPUl9UQVJHRVQ9JHtOTV9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1ubX0KLSAgUkFOTElCPSR7UkFOTElCLSR7aG9zdF9hbGlhc30tcmFubGlifQotICBSQU5MSUJfRk9SX1RBUkdFVD0ke1JBTkxJQl9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1yYW5saWJ9Ci0gIFdJTkRSRVM9JHtXSU5EUkVTLSR7aG9zdF9hbGlhc30td2luZHJlc30KLSAgV0lORFJFU19GT1JfVEFSR0VUPSR7V0lORFJFU19GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS13aW5kcmVzfQotCi0gIGlmIFsgLXogIiR7WUFDQ30iIF07IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2Jpc29uOyB0aGVuCi0JWUFDQz0iYmlzb24gLXkiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvYnlhY2M7IHRoZW4KLQlZQUNDPWJ5YWNjCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1mICRkaXIveWFjYzsgdGhlbgotCVlBQ0M9eWFjYwotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBpZiBbIC16ICIke1lBQ0N9IiBdOyB0aGVuCi0gICAgICBZQUNDPSJiaXNvbiAteSIKLSAgICBmaQotICBmaQotCi0gIGlmIFsgLXogIiR7TEVYfSIgXTsgdGhlbgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZmxleDsgdGhlbgotCUxFWD1mbGV4Ci0JYnJlYWsKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvbGV4OyB0aGVuCi0JTEVYPWxleAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBMRVg9JHtMRVgtZmxleH0KLSAgZmkKLQotICAjIEV4cG9ydCB2YXJpYWJsZXMgd2hpY2ggYXV0b2NvbmYgbWlnaHQgdHJ5IHRvIHNldC4KLSAgZXhwb3J0IEFTCi0gIGV4cG9ydCBBUgotICBleHBvcnQgQ0NfRk9SX0JVSUxECi0gIGV4cG9ydCBETExUT09MCi0gIGV4cG9ydCBMRAotICBleHBvcnQgTk0KLSAgZXhwb3J0IFJBTkxJQgotICBleHBvcnQgV0lORFJFUwotZWxzZQotICAjIElmIENDIGlzIHN0aWxsIG5vdCBzZXQsIHRyeSB0byBnZXQgZ2NjLgotICBpZiBbIC16ICIke0NDfSIgXTsgdGhlbgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCi0JQ0M9ImdjYyIKLQllY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLQlpZiB0ZXN0IC16ICJgJHtDQ30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLQkgIENGTEFHUz0ke0NGTEFHUy0iLWcgLU8yICR7d2Fybl9jZmxhZ3N9In0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1nIC1PMiJ9Ci0JZWxzZQotCSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzIgJHt3YXJuX2NmbGFnc30ifQotCSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLU8yIn0KLQlmaQotCXJtIC1mIGNvbmZ0ZXN0KgotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBDQz0ke0NDLWNjfQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJHtDRkxBR1N9IjsgdGhlbgotICAgICAgIyBIZXJlIENDIGlzIHNldCBidXQgQ0ZMQUdTIGlzIG5vdC4gIFVzZSBhIHF1aWNrIGhhY2sgdG8gdXNlIC1PMiBpZiBDQwotICAgICAgIyBpcyBzZXQgdG8gYSB2ZXJzaW9uIG9mIGdjYy4KLSAgICAgIGNhc2UgIiR7Q0N9IiBpbgotICAgICAgKmdjYykKLQllY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLQlpZiB0ZXN0IC16ICJgJHtDQ30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLQkgIENGTEFHUz0ke0NGTEFHUy0iLWcgLU8yICR7d2Fybl9jZmxhZ3N9In0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1nIC1PMiJ9Ci0JZWxzZQotCSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzIgJHt3YXJuX2NmbGFnc30ifQotCSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLU8yIn0KLQlmaQotCXJtIC1mIGNvbmZ0ZXN0KgotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZmkKLQotICBDWFg9JHtDWFgtImMrKyJ9Ci0gIENGTEFHUz0ke0NGTEFHUy0iLWcifQotICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotZmkKLQotZXhwb3J0IENDCi1leHBvcnQgQ1hYCi1leHBvcnQgQ0ZMQUdTCi1leHBvcnQgQ1hYRkxBR1MKLQotIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgaW4gY29uZmlndXJlLmluLCBub3QgY29uZmlndXJlCi1jYXNlICIkaG9zdCIgaW4KLQkqZ28zMiopCi0JICAgIGVuYWJsZV9nZGJ0az1ubyA7OwotCSptc2Rvc2RqZ3BwKikKLQkgICAgZW5hYmxlX2dkYnRrPW5vIDs7Ci1lc2FjCi0KLSMgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGluIGNvbmZpZ3VyZS5pbiwgbm90IGNvbmZpZ3VyZQotIyBEZXRlcm1pbmUgd2hldGhlciBnZGIgbmVlZHMgdGsvdGNsIG9yIG5vdC4KLWlmIFsgIiRlbmFibGVfZ2RidGsiICE9ICJubyIgXTsgdGhlbgotCUdEQl9USz0iYWxsLXRjbCBhbGwtdGsgYWxsLWl0Y2wgYWxsLXRpeCBhbGwtbGliZ3VpIgotZWxzZQotCUdEQl9USz0iIgotZmkKLQotZm9yIHN1YmRpciBpbiAuICR7c3ViZGlyc30gOyBkbwotCi0gICAgIyAke3N1YmRpcn0gaXMgcmVsYXRpdmUgcGF0aCBmcm9tIC4gdG8gdGhlIGRpcmVjdG9yeSB3ZSdyZSBjdXJyZW50bHkKLSAgICAjIGNvbmZpZ3VyaW5nLgotICAgICMgJHtpbnZzdWJkaXJ9IGlzIGludmVyc2Ugb2YgJHtzdWJkaXIpLCAqd2l0aCogdHJhaWxpbmcgLywgaWYgbmVlZGVkLgotICAgIGludnN1YmRpcj1gZWNobyAke3N1YmRpcn0vIHwgc2VkIC1lICdzfFwuL3x8ZycgLWUgJ3N8W14vXSovfC4uL3xnJ2AKLQotICAgICMjIyBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBzcmNkaXIKLSAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAgICIuIikgICMgbm8gLXNyY2RpciBvcHRpb24uICBXZSdyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICAgICAgICAgICAgICBtYWtlc3JjZGlyPS4gOzsKLSAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICAgICAgICAgIG1ha2VzcmNkaXI9YGVjaG8gJHtzcmNkaXJ9LyR7c3ViZGlyfSB8IHNlZCAtZSAnc3wvXC4kfHwnYAotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICopICMgb3RoZXJ3aXNlIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgY2FzZSAiJHtzdWJkaXJ9IiBpbgotICAgICAgICAgICAgICAgIC4pIG1ha2VzcmNkaXI9JHtzcmNkaXJ9IDs7Ci0gICAgICAgICAgICAgICAgKikgbWFrZXNyY2Rpcj0ke2ludnN1YmRpcn0ke3NyY2Rpcn0vJHtzdWJkaXJ9IDs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgWyAiJHtzdWJkaXJ9LyIgIT0gIi4vIiBdIDsgdGhlbgotICAgICAgICBNYWtlZmlsZT0ke3N1YmRpcn0vTWFrZWZpbGUKLSAgICBmaQotCi0gICAgaWYgWyAhIC1kICR7c3ViZGlyfSBdIDsgdGhlbgotICAgICAgICBpZiBta2RpciAke3N1YmRpcn0gOyB0aGVuCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke3N1YmRpcn0iIDE+JjIKLSAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLSAgICBmaQotCi0gICAgY2FzZSAiJHtyZW1vdmluZ30iIGluCi0gICAgIiIpCi0gICAgICAgIGNhc2UgIiR7c3ViZGlyfSIgaW4KLSAgICAgICAgLikgOzsKLSAgICAgICAgKikgZXZhbCBlY2hvIEJ1aWxkaW5nIGluICR7c3ViZGlyfSAke3JlZGlyZWN0fSA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgIyBGSVhNRSBTaG91bGQgdGhpcyBiZSBkb25lIHJlY3Vyc2l2ZWx5ID8/PyAoVXNlZnVsIGZvciBlLmcuIGdkYnRlc3QpCi0gICAgICAgICMgU2V0IHVwIHRoZSBsaXN0IG9mIGxpbmtzIHRvIGJlIG1hZGUuCi0gICAgICAgICMgJHtsaW5rc30gaXMgdGhlIGxpc3Qgb2YgbGluayBuYW1lcywgYW5kICR7ZmlsZXN9IGlzIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGxpbmsgdG8uCi0KLSAgICAgICAgIyBNYWtlIHRoZSBsaW5rcy4KLSAgICAgICAgY29uZmlnbGlua3M9IiR7bGlua3N9IgotICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuc3RhdHVzIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgbXYgLWYgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMgJHtzdWJkaXJ9L2NvbmZpZy5iYWNrCi0gICAgICAgIGZpCi0gICAgICAgIHdoaWxlIFsgLW4gIiR7ZmlsZXN9IiBdIDsgZG8KLSAgICAgICAgICAgICAgICAjIHNldCBmaWxlIHRvIGNhciBvZiBmaWxlcywgZmlsZXMgdG8gY2RyIG9mIGZpbGVzCi0gICAgICAgICAgICAgICAgc2V0ICR7ZmlsZXN9OyBmaWxlPSQxOyBzaGlmdDsgZmlsZXM9JCoKLSAgICAgICAgICAgICAgICBzZXQgJHtsaW5rc307IGxpbms9JDE7IHNoaWZ0OyBsaW5rcz0kKgotCi0gICAgICAgICAgICAgICAgaWYgWyAhIC1yICR7c3JjZGlyfS8ke2ZpbGV9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtmaWxlfSBdIDsgdGhlbgotCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogY2Fubm90IGNyZWF0ZSBhIGxpbmsgXCIke2xpbmt9XCIsIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJzaW5jZSB0aGUgZmlsZSBcIiR7c3JjZGlyfS8ke2ZpbGV9XCIgZG9lcyBub3QgZXhpc3QuIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLQkJICBlbHNlCi0JCQlzcmNmaWxlPSR7ZmlsZX0KLQkJICBmaQotCQllbHNlCi0JCQlzcmNmaWxlPSR7c3JjZGlyfS8ke2ZpbGV9Ci0gICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgICR7cmVtb3ZlfSAtZiAke2xpbmt9Ci0JCSMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGUsIG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsKLQkJaWYgJHtzeW1ib2xpY19saW5rfSAke3NyY2ZpbGV9ICR7bGlua30gPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCQkJdHJ1ZQotCQllbHNlCi0JCQkjIFdlIG5lZWQgdG8gcmUtcmVtb3ZlIHRoZSBmaWxlIGJlY2F1c2UgTHlueCBsZWF2ZXMgYSAKLQkJCSMgdmVyeSBzdHJhbmdlIGRpcmVjdG9yeSB0aGVyZSB3aGVuIGl0IGZhaWxzIGFuIE5GUyBzeW1saW5rLgotCQkJJHtyZW1vdmV9IC1yIC1mICR7bGlua30KLQkJCSR7aGFyZF9saW5rfSAke3NyY2ZpbGV9ICR7bGlua30KLQkJZmkKLSAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtsaW5rfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IHVuYWJsZSB0byBsaW5rIFwiJHtsaW5rfVwiIHRvIFwiJHtzcmNmaWxlfVwiLiIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgICAgZmkKLQotICAgICAgICAgICAgICAgIGVjaG8gIkxpbmtlZCBcIiR7bGlua31cIiB0byBcIiR7c3JjZmlsZX1cIi4iCi0gICAgICAgIGRvbmUKLQotICAgICAgICAjIENyZWF0ZSBhIC5nZGJpbml0IGZpbGUgd2hpY2ggcnVucyB0aGUgb25lIGluIHNyY2RpcgotICAgICAgICAjIGFuZCB0ZWxscyBHREIgdG8gbG9vayB0aGVyZSBmb3Igc291cmNlIGZpbGVzLgotCi0gICAgICAgIGlmIFsgLXIgJHtzcmNkaXJ9LyR7c3ViZGlyfS8uZ2RiaW5pdCBdIDsgdGhlbgotICAgICAgICAgICAgICAgIGNhc2UgJHtzcmNkaXJ9IGluCi0gICAgICAgICAgICAgICAgLikgOzsKLSAgICAgICAgICAgICAgICAqKSBjYXQgPiAke3N1YmRpcn0vLmdkYmluaXQgPDxFT0YKLSMgJHtOT19FRElUfQotZGlyICR7bWFrZXNyY2Rpcn0KLWRpciAuCi1zb3VyY2UgJHttYWtlc3JjZGlyfS8uZ2RiaW5pdAotRU9GCi0gICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgIGVzYWMKLSAgICAgICAgZmkKLQotICAgICAgICAjIEluc3RhbGwgYSBtYWtlZmlsZSwgYW5kIG1ha2UgaXQgc2V0IFZQQVRICi0gICAgICAgICMgaWYgbmVjZXNzYXJ5IHNvIHRoYXQgdGhlIHNvdXJjZXMgYXJlIGZvdW5kLgotICAgICAgICAjIEFsc28gY2hhbmdlIGl0cyB2YWx1ZSBvZiBzcmNkaXIuCi0gICAgICAgICMgTk9URTogTWFrZWZpbGUgZ2VuZXJhdGlvbiBjb25zdGl0dXRlcyB0aGUgbWFqb3JpdHkgb2YgdGhlIHRpbWUgaW4gY29uZmlndXJlLiAgSGVuY2UsIHRoaXMgc2VjdGlvbiBoYXMKLSAgICAgICAgIyBiZWVuIHNvbWV3aGF0IG9wdGltaXplZCBhbmQgaXMgcGVyaGFwcyBhIGJpdCB0d2lzdHkuCi0KLSAgICAgICAgIyBjb2RlIGlzIG9yZGVyIHNvIGFzIHRvIHRyeSB0byBzZWQgdGhlIHNtYWxsZXN0IGlucHV0IGZpbGVzIHdlIGtub3cuCi0gICAgICAgICMgc28gZG8gdGhlc2Ugc2VwYXJhdGVseSBiZWNhdXNlIEkgZG9uJ3QgdHJ1c3QgdGhlIG9yZGVyIG9mIHNlZCAtZSBleHByZXNzaW9ucy4KLQotICAgICAgICAjIHRoZSBmaXZlIG1ha2VmaWxlIGZyYWdtZW50cyBNVVNUIGVuZCB1cCBpbiB0aGUgcmVzdWx0aW5nIE1ha2VmaWxlIGluIHRoaXMgb3JkZXI6IAotICAgICAgICAjIHBhY2thZ2UgbWFjcm9zLCB0YXJnZXQsIGhvc3QsIHNpdGUsIGFuZCBwYWNrYWdlIHJ1bGVzLgotCi0gICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSBdIDsgdGhlbgotCi0gICAgICAgICAgICAjIENvbmRpdGlvbmFsaXplIHRoZSBtYWtlZmlsZSBmb3IgdGhpcyBwYWNrYWdlIGZyb20gIk1ha2VmaWxlLmluIiAob3Igd2hhdGV2ZXIgaXQncyBjYWxsZWQpIGludG8gTWFrZWZpbGUudGVtLgotICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9LyR7TWFrZWZpbGV9LnRlbQotICAgICAgICAgICAgY2FzZSAiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59ID4gJHtNYWtlZmlsZX0udGVtCi0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBFeHBlY3RlZCBwYWNrYWdlIG1ha2VmaWxlIHJ1bGVzIGZyYWdtZW50IFwiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9XCIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBpcyBtaXNzaW5nIGluICR7UFdEPWBwd2RgfS4gMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke01ha2VmaWxlfS50ZW0KLQotICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSBmb3IgdGhpcyBzaXRlLgotICAgICAgICAgICAgcm0gLWYgJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgY2FzZSAiJHtzaXRlfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9L2NvbmZpZy9tcy0ke3NpdGV9Ci0KLSAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSIgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7TWFrZWZpbGV9Ci0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIGhvc3QuCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7aG9zdF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtob3N0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtob3N0X21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIGhvc3QgbWFrZWZpbGUgZnJhZ21lbnQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke3N1YmRpcikvTWFrZWZpbGUudGVtCi0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIHRhcmdldC4KLSAgICAgICAgICAgIHJtIC1mICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICBjYXNlICIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3RhcmdldF9tYWtlZmlsZV9mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAjIHdvcmtpbmcgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyBFbWl0IHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGlzIHBhY2thZ2UncyBtYWNyb3MuCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICBjYXNlICIke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIHBhY2thZ2UgbWFrZWZpbGUgZnJhZ21lbnQgXCIke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgcmVhbCBjb3B5IG5vdyBpbiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0KLSAgICAgICAgICAgICMgcHJlcGVuZCB3YXJuaW5nIGFib3V0IGVkaXR0aW5nLCBhbmQgYSBidW5jaCBvZiB2YXJpYWJsZXMuCi0gICAgICAgICAgICBybSAtZiAke01ha2VmaWxlfQotICAgICAgICAgICAgY2F0ID4gJHtNYWtlZmlsZX0gPDxFT0YKLSMgJHtOT19FRElUfQotVlBBVEggPSAke21ha2VzcmNkaXJ9Ci1saW5rcyA9ICR7Y29uZmlnbGlua3N9Ci1ob3N0X2FsaWFzID0gJHtob3N0X2FsaWFzfQotaG9zdF9jcHUgPSAke2hvc3RfY3B1fQotaG9zdF92ZW5kb3IgPSAke2hvc3RfdmVuZG9yfQotaG9zdF9vcyA9ICR7aG9zdF9vc30KLWhvc3RfY2Fub25pY2FsID0gJHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0tJHtob3N0X29zfQotdGFyZ2V0X2FsaWFzID0gJHt0YXJnZXRfYWxpYXN9Ci10YXJnZXRfY3B1ID0gJHt0YXJnZXRfY3B1fQotdGFyZ2V0X3ZlbmRvciA9ICR7dGFyZ2V0X3ZlbmRvcn0KLXRhcmdldF9vcyA9ICR7dGFyZ2V0X29zfQotdGFyZ2V0X2Nhbm9uaWNhbCA9ICR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfS0ke3RhcmdldF9vc30KLUVPRgotCSAgICBjYXNlICIke2J1aWxkfSIgaW4KLQkgICAgICAiIikgOzsKLQkgICAgICAqKSAgY2F0ID4+ICR7TWFrZWZpbGV9IDw8IEVPRgotYnVpbGRfYWxpYXMgPSAke2J1aWxkX2FsaWFzfQotYnVpbGRfY3B1ID0gJHtidWlsZF9jcHV9Ci1idWlsZF92ZW5kb3IgPSAke2J1aWxkX3ZlbmRvcn0KLWJ1aWxkX29zID0gJHtidWlsZF9vc30KLWJ1aWxkX2Nhbm9uaWNhbCA9ICR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KLUVPRgotCSAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIDs7Ci0gICAgICAgICAgICAgIC8qKSBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgOzsKLSAgICAgICAgICAgICAgLyopIGVjaG8gdGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIHRhcmdldF9tYWtlZmlsZV9mcmFnID0gJHtpbnZzdWJkaXJ9JHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSA7OwotICAgICAgICAgICAgICAvKikgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKSAgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBpZiBbICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iICE9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgZWNobyBzaXRlX21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke3NpdGVfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfQotICAgICAgICAgICAgZmkgCi0KLQkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBidWlsZCBzaGFyZWQgbGlicy4KLQkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfc2hhcmVkfSI7IHRoZW4KLQkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9IG5vID4+ICR7TWFrZWZpbGV9Ci0JICAgIGVsc2UKLQkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9ICR7ZW5hYmxlX3NoYXJlZH0gPj4gJHtNYWtlZmlsZX0KLQkgICAgZmkKLQkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBydW10aW1lIGxpYnJhcnkgc3R1ZmYgaW5zdGFsbGVkIGluIGxpYnN1YmRpci4KLQkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnN9IjsgdGhlbgotCSAgICAgICAgZWNobyBlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMgPSBubyA+PiAke01ha2VmaWxlfQotCSAgICBlbHNlCi0JICAgICAgICBlY2hvIGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyA9ICR7ZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzfSA+PiAke01ha2VmaWxlfQotCSAgICBmaQotCi0JICAgICMgRW1pdCBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgZmlsZSBjb250YWluaW5nIGdjYydzCi0JICAgICMgdmVyc2lvbiBudW1iZXIuCi0JICAgIGVjaG8gZ2NjX3ZlcnNpb25fdHJpZ2dlciA9ICR7Z2NjX3ZlcnNpb25fdHJpZ2dlcn0gPj4gJHtNYWtlZmlsZX0KLQkgICAgIyBBbmQgZW1pdCBhIG1hY3JvIGRlZmluaW5nIGdjYydzIHZlcnNpb24gbnVtYmVyLgotCSAgICBlY2hvIGdjY192ZXJzaW9uID0gJHtnY2NfdmVyc2lvbn0gPj4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyByZXNldCBwcmVmaXgsIGV4ZWNfcHJlZml4LCBzcmNkaXIsIFNVQkRJUlMsIE5PTlNVQkRJUlMsCi0gICAgICAgICAgICAjIHJlbW92ZSBhbnkgZm9ybSBmZWVkcy4KLSAgICAgICAgICAgIGlmIFsgLXogIiR7c3ViZGlyc30iIF07IHRoZW4KLSAgICAgICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudG0yCi0gICAgICAgICAgICAgICAgc2VkIC1lICJzOl5TVUJESVJTWyAJXSo9LiokOlNVQkRJUlMgPSAke2NvbmZpZ2RpcnN9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpeTk9OU1VCRElSU1sgCV0qPS4qJDpOT05TVUJESVJTID0gJHtub2NvbmZpZ2RpcnN9OiIgXAotICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtzdWJkaXJ9L01ha2VmaWxlLnRtMgotICAgICAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudG0yICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLQkgICAgZmkKLQkgICAgc2VkICAgICAtZSAic3xecHJlZml4WyAJXSo9LiokfHByZWZpeCA9ICR7cHJlZml4fXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmV4ZWNfcHJlZml4WyAJXSo9LiokfGV4ZWNfcHJlZml4ID0gJHtleGVjX3ByZWZpeH18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5iaW5kaXJbIAldKj0uKiR8YmluZGlyID0gJHtiaW5kaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec2JpbmRpclsgCV0qPS4qJHxzYmluZGlyID0gJHtzYmluZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmxpYmV4ZWNkaXJbIAldKj0uKiR8bGliZXhlY2RpciA9ICR7bGliZXhlY2Rpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5kYXRhZGlyWyAJXSo9LiokfGRhdGFkaXIgPSAke2RhdGFkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec3lzY29uZmRpclsgCV0qPS4qJHxzeXNjb25mZGlyID0gJHtzeXNjb25mZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnNoYXJlZHN0YXRlZGlyWyAJXSo9LiokfHNoYXJlZHN0YXRlZGlyID0gJHtzaGFyZWRzdGF0ZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5sb2NhbHN0YXRlZGlyWyAJXSo9LiokfGxvY2Fsc3RhdGVkaXIgPSAke2xvY2Fsc3RhdGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xebGliZGlyWyAJXSo9LiokfGxpYmRpciA9ICR7bGliZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmluY2x1ZGVkaXJbIAldKj0uKiR8aW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5vbGRpbmNsdWRlZGlyWyAJXSo9LiokfG9sZGluY2x1ZGVkaXIgPSAke29sZGluY2x1ZGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeaW5mb2RpclsgCV0qPS4qJHxpbmZvZGlyID0gJHtpbmZvZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8Xm1hbmRpclsgCV0qPS4qJHxtYW5kaXIgPSAke21hbmRpcn18IiBcCi0JCSAgICAtZSAiL15DQ1sgCV0qPS97Ci0JCQk6bG9vcDEKLQkJCS9cXFxcJC8gTgotCQkJcy9cXFxcXFxuLy9nCi0JCQl0IGxvb3AxCi0JCQlzJV5DQ1sgCV0qPS4qJCVDQyA9ICR7Q0N9JQotCQkJfSIgXAotCQkgICAgLWUgIi9eQ1hYWyAJXSo9L3sKLQkJCTpsb29wMgotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDIKLQkJCXMlXkNYWFsgCV0qPS4qJCVDWFggPSAke0NYWH0lCi0JCQl9IiBcCi0JCSAgICAtZSAiL15DRkxBR1NbIAldKj0vewotCQkJOmxvb3AzCi0JCQkvXFxcXCQvIE4KLQkJCXMvXFxcXFxcbi8vZwotCQkJdCBsb29wMwotCQkJcyVeQ0ZMQUdTWyAJXSo9LiokJUNGTEFHUyA9ICR7Q0ZMQUdTfSUKLQkJCX0iIFwKLQkJICAgIC1lICIvXkNYWEZMQUdTWyAJXSo9L3sKLQkJCTpsb29wNAotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDQKLQkJCXMlXkNYWEZMQUdTWyAJXSo9LiokJUNYWEZMQUdTID0gJHtDWFhGTEFHU30lCi0JCQl9IiBcCi0JCSAgICAtZSAic3xeU0hFTExbCSBdKj0uKiR8U0hFTEwgPSAke2NvbmZpZ19zaGVsbH18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5zcmNkaXJbIAldKj0uKiR8c3JjZGlyID0gJHttYWtlc3JjZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInMvDC8vIiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzOl5wcm9ncmFtX3ByZWZpeFsgCV0qPS4qJDpwcm9ncmFtX3ByZWZpeCA9ICR7cHJvZ3JhbV9wcmVmaXh9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpecHJvZ3JhbV9zdWZmaXhbIAldKj0uKiQ6cHJvZ3JhbV9zdWZmaXggPSAke3Byb2dyYW1fc3VmZml4fToiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInM6XnByb2dyYW1fdHJhbnNmb3JtX25hbWVbIAldKj0uKiQ6cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX06IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF50b29sZGlyWyAJXSo9LiokfHRvb2xkaXIgPSAke3Rvb2xkaXJ9fCIgXAotCQkgICAgLWUgInM6XkRFRkFVTFRfWUFDQ1sJIF0qPS4qJDpERUZBVUxUX1lBQ0MgPSAke0RFRkFVTFRfWUFDQ306IiBcCi0JCSAgICAtZSAiczpeREVGQVVMVF9MRVhbCSBdKj0uKiQ6REVGQVVMVF9MRVggPSAke0RFRkFVTFRfTEVYfToiIFwKLQkJICAgIC1lICJzOl5ERUZBVUxUX000WyAgXSo9LiokOkRFRkFVTFRfTTQgPSAke0RFRkFVTFRfTTR9OiIgXAotICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4+ICR7TWFrZWZpbGV9Ci0gIAotCSAgICBzZWQgLWUgInM6XkdEQl9US1sJIF0qPS4qJDpHREJfVEsgPSAke0dEQl9US306IiAke01ha2VmaWxlfSA+JHtNYWtlZmlsZX0udGVtCi0JICAgIG12IC1mICR7TWFrZWZpbGV9LnRlbSAke01ha2VmaWxlfQotCi0JICAgICMgSWYgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzLCBwcmVzZXQgdGhlIHZhbHVlcyBvZiBtYW55IG1vcmUKLQkgICAgIyB0b29scy4KLQkgICAgaWYgWyAiJHtidWlsZH0iICE9ICIke2hvc3R9IiBdOyB0aGVuCi0JCWZvciB2YXIgaW4gJHt0b29sc307IGRvCi0JCSAgICB2YWw9YGV2YWwgJ2VjaG8gJCciJHt2YXJ9ImAKLQkJICAgIHNlZCAtZSAiL14ke3Zhcn1bIAldKj0vewotCQkJICAgOmxvb3AxCi0JCQkgICAvXFxcXCQvIE4KLQkJCSAgIC9cXFxcJC8gYiBsb29wMQotCQkJICAgcy9cXFxcXFxuLy9nCi0JCQkgICBzJV4ke3Zhcn1bIAldKj0uKiQlJHt2YXJ9ID0gJHt2YWx9JQotCQkJICAgfSIgJHtNYWtlZmlsZX0gPiAke01ha2VmaWxlfS50ZW0KLQkJICAgIG12IC1mICR7TWFrZWZpbGV9LnRlbSAke01ha2VmaWxlfQotCQlkb25lCi0JICAgIGZpCi0KLSAgICAgICAgICAgICMgZmluYWwgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGVjaG8gIk5vIE1ha2VmaWxlLmluIGZvdW5kIGluICR7c3JjZGlyfS8ke3N1YmRpcn0sIHVuYWJsZSB0byBjb25maWd1cmUiIDE+JjIKLSAgICAgICAgZmkKLQotICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0KLSAgICAgICAgY2FzZSAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAiIikgdXNpbmc9IDs7Ci0gICAgICAgICopIHVzaW5nPSJhbmQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAiIikgOzsKLSAgICAgICAgKikgdXNpbmc9IiR7dXNpbmd9IGFuZCBcIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9XCIiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBjYXNlICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICIiKSA7OwotICAgICAgICAqKSB1c2luZz0iJHt1c2luZ30gYW5kIFwiJHtzaXRlX21ha2VmaWxlX2ZyYWd9XCIiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBuZXd1c2luZz1gZWNobyAiJHt1c2luZ30iIHwgc2VkICdzL2FuZC91c2luZy8nYAotICAgICAgICB1c2luZz0ke25ld3VzaW5nfQotICAgICAgICBlY2hvICJDcmVhdGVkIFwiJHtNYWtlZmlsZX1cIiBpbiIgJHtQV0Q9YHB3ZGB9ICR7dXNpbmd9Ci0KLSAgICAgICAgLiAke3RtcGZpbGV9LnBvcwotCi0gICAgICAgICMgZGVzY3JpYmUgdGhlIGNob3NlbiBjb25maWd1cmF0aW9uIGluIGNvbmZpZy5zdGF0dXMuCi0gICAgICAgICMgTWFrZSB0aGF0IGZpbGUgYSBzaGVsbHNjcmlwdCB3aGljaCB3aWxsIHJlZXN0YWJsaXNoCi0gICAgICAgICMgdGhlIHNhbWUgY29uZmlndXJhdGlvbi4gIFVzZWQgaW4gTWFrZWZpbGVzIHRvIHJlYnVpbGQKLSAgICAgICAgIyBNYWtlZmlsZXMuCi0KLSAgICAgICAgY2FzZSAiJHtub3JlY3Vyc2lvbn0iIGluCi0gICAgICAgICIiKSBhcmd1bWVudHM9IiR7YXJndW1lbnRzfSAtLW5vcmVjdXJzaW9uIiA7OwotICAgICAgICAqKSA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgaWYgWyAke3N1YmRpcn0gPSAuIF0gOyB0aGVuCi0gICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKLSMgJHtOT19FRElUfQotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotJHtwcm9nbmFtZX0iICR7YXJndW1lbnRzfSAgIgotIyAke3VzaW5nfSIgPiAke3N1YmRpcn0vY29uZmlnLm5ldwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKLSMgJHtOT19FRElUfQotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotY2QgJHtpbnZzdWJkaXJ9Ci0ke3Byb2duYW1lfSIgJHthcmd1bWVudHN9ICAiCi0jICR7dXNpbmd9IiA+ICR7c3ViZGlyfS9jb25maWcubmV3Ci0gICAgICAgIGZpCi0gICAgICAgIGNobW9kIGEreCAke3N1YmRpcn0vY29uZmlnLm5ldwotICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuYmFjayBdIDsgdGhlbgotICAgICAgICAgICAgICAgIG12IC1mICR7c3ViZGlyfS9jb25maWcuYmFjayAke3N1YmRpcn0vY29uZmlnLnN0YXR1cwotICAgICAgICBmaQotCSR7Y29uZmlnX3NoZWxsfSAke21vdmVpZmNoYW5nZX0gJHtzdWJkaXJ9L2NvbmZpZy5uZXcgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMKLSAgICAgICAgOzsKLQotICAgICopICBybSAtZiAke01ha2VmaWxlfSAke3N1YmRpcn0vY29uZmlnLnN0YXR1cyAke2xpbmtzfSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBJZiB0aGVyZSBhcmUgc3ViZGlyZWN0b3JpZXMsIHRoZW4gcmVjdXIuCi1pZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke2NvbmZpZ2RpcnN9IiBdIDsgdGhlbiAKLSAgICAgICAgZm9yIGNvbmZpZ2RpciBpbiAke2NvbmZpZ2RpcnN9ICR7ZXh0cmFjb25maWdkaXJzfSA7IGRvCi0KLQkJIyBJZiBjb25maWdkaXIgY29udGFpbnMgJywnIGl0IGlzCi0JCSMgc3JjZGlyLGJ1aWxkZGlyLHRhcmdldF9hbGlhcwotCQkjIFRoZXNlIGNvbWUgZnJvbSBleHRyYWNvbmZpZ2RpcnMuCi0JCWNhc2UgJHtjb25maWdkaXJ9IGluCi0JCSosKikKLQkJICAgIGV2YWwgYGVjaG8gJHtjb25maWdkaXJ9IHwgc2VkIC1lICdzL1woW14sXSpcKSxcKFteLF0qXCksXCguKlwpL2NmZ19kaXI9XDEgYmxkX2Rpcj1cMiB0Z3RfYWxpYXM9XDMvJ2AKLQkJICAgIDs7Ci0JCSopCi0JCSAgICBjZmdfZGlyPSR7Y29uZmlnZGlyfQotCQkgICAgYmxkX2Rpcj0ke2NvbmZpZ2Rpcn0KLQkJICAgIHRndF9hbGlhcz0ke3RhcmdldF9hbGlhc30KLQkJICAgIDs7Ci0JCWVzYWMKLQotICAgICAgICAgICAgICAgIGlmIFsgLWQgJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwgZWNobyBDb25maWd1cmluZyAke2NvbmZpZ2Rpcn0uLi4gJHtyZWRpcmVjdH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICIuIikgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZCAuLyR7YmxkX2Rpcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBta2RpciAuLyR7YmxkX2Rpcn0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke2JsZF9kaXJ9IiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICAgICAgICAgICAgICBQT1BESVI9JHtQV0Q9YHB3ZGB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZCAke2JsZF9kaXJ9IAotCi0jIyMgZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggc3JjZGlyCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAiLiIpIG5ld3NyY2Rpcj0ke3NyY2Rpcn0gOzsgIyBubyAtc3JjZGlyIG9wdGlvbi4gIFdlJ3JlIGJ1aWxkaW5nIGluIHBsYWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICA/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKSAjIG90aGVyd2lzZSByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9Li4vJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0KLQkJCSMgSGFuZGxlIC0tY2FjaGUtZmlsZT0uLi9YWFgKLQkJCWNhc2UgIiR7Y2FjaGVfZmlsZX0iIGluCi0JCQkiIikgIyBlbXB0eQotCQkJCTs7Ci0JCQkvKikgIyBhYnNvbHV0ZSBwYXRoCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQk/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgotCQkJCWNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIKLQkJCQk7OwotCQkJKikgIyByZWxhdGl2ZSBwYXRoCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0uLi8ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQllc2FjCi0KLSMjIyBjaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUsIG90aGVyd2lzZSBmaXggcG9zc2libHkgcmVsYXRpdmUgcHJvZ25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNwcm9nPSR7bmV3c3JjZGlyfS9jb25maWd1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgWyAtZiAke25ld3NyY2Rpcn0vY29uZmlndXJlLmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7cHJvZ25hbWV9IiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKikgICAgIHJlY3Byb2c9JHtwcm9nbmFtZX0gOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzoqKSAgICByZWNwcm9nPSR7cHJvZ25hbWV9IDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopICAgICAgcmVjcHJvZz0uLi8ke3Byb2duYW1lfSA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0JCQllbHNlCi0JCQkJZXZhbCBlY2hvIE5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gJHtjZmdfZGlyfSAke3JlZGlyZWN0fQotCQkJCXJlY3Byb2c9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaQotCi0jIyMgVGhlIHJlY3Vyc2lvbiBsaW5lIGlzIGhlcmUuCi0JCQlpZiBbICEgLXogIiR7cmVjcHJvZ30iIF0gOyB0aGVuCi0JICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXZhbCAke2NvbmZpZ19zaGVsbH0gJHtyZWNwcm9nfSAke3ZlcmJvc2V9ICR7YnVpbGRvcHR9IC0taG9zdD0ke2hvc3RfYWxpYXN9IC0tdGFyZ2V0PSR7dGd0X2FsaWFzfSBcCi0gICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAke3ByZWZpeG9wdGlvbn0gJHt0bXBkaXJvcHRpb259ICR7ZXhlY19wcmVmaXhvcHRpb259IFwKLSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICR7c3JjZGlyb3B0aW9ufSAke2Rpcm9wdGlvbnN9ICR7cHJvZ3JhbV9wcmVmaXhvcHRpb259ICR7cHJvZ3JhbV9zdWZmaXhvcHRpb259ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0gJHtzaXRlX29wdGlvbn0gJHt3aXRob3B0aW9uc30gJHt3aXRob3V0b3B0aW9uc30gJHtlbmFibGVvcHRpb25zfSAke2Rpc2FibGVvcHRpb25zfSAke2Zsb2F0aW5nX3BvaW50b3B0aW9ufSAke2NhY2hlX2ZpbGVfb3B0aW9ufSAke3JlbW92aW5nfSAke290aGVyX29wdGlvbnN9ICR7cmVkaXJlY3R9IDsgdGhlbgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UKLQkJCQkJZWNobyBDb25maWd1cmUgaW4gYHB3ZGAgZmFpbGVkLCBleGl0aW5nLiAxPiYyCi0gICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIAlmaQotCQkJZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2QgJHtQT1BESVJ9Ci0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotZmkKLQotIyBQZXJmb3JtIHRoZSBzYW1lIGNsZWFudXAgYXMgdGhlIHRyYXAgaGFuZGxlciwgbWludXMgdGhlICJleGl0IDEiIG9mIGNvdXJzZSwKLSMgYW5kIHJlc2V0IHRoZSB0cmFwIGhhbmRsZXIuCi1ybSAtZiAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvcwotdHJhcCAwCi0KLWV4aXQgMAotCi0jCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgZmlsbC1jb2x1bW46IDEzMQotIyBFbmQ6Ci0jCi0KLSMgZW5kIG9mIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTFiMDRmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEyMDggKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCi0jIyBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKLSMjIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKLSMjIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LiAgCi0KLSMjIEJlIHdhcm5lZCwgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjb25maWd1cmUuaW4gZmlsZXMuICBUaGVyZSBhcmUgdGhvc2UKLSMjIHVzZWQgYnkgQXV0b2NvbmYsIHdoaWNoIGFyZSBtYWNyb3Mgd2hpY2ggYXJlIGV4cGFuZGVkIGludG8gYSBjb25maWd1cmUKLSMjIHNjcmlwdCBieSBhdXRvY29uZi4gIFRoZSBvdGhlciBzb3J0LCBvZiB3aGljaCB0aGlzIGlzIG9uZSwgaXMgZXhlY3V0ZWQKLSMjIGJ5IEN5Z251cyBjb25maWd1cmUuICAKLQotIyMgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgdHdvIHN5c3RlbXMsIGNoZWNrIG91dCB0aGUgZG9jdW1lbnRhdGlvbgotIyMgZm9yICdBdXRvY29uZicgKGF1dG9jb25mLnRleGkpIGFuZCAnQ29uZmlndXJlJyAoY29uZmlndXJlLnRleGkpLiAgCi0KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTItOTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMgVG8gYWRkIGEgbmV3IGRpcmVjdG9yeSB0byB0aGUgdHJlZSwgZmlyc3QgY2hvb3NlIHdoZXRoZXIgaXQgaXMgYSB0YXJnZXQKLSMjIyBvciBhIGhvc3QgZGVwZW5kZW50IHRvb2wuICBUaGVuIHB1dCBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0Ci0jIyMgKGxpYnJhcnkgb3IgdG9vbHMsIGhvc3Qgb3IgdGFyZ2V0KSwgZG9pbmcgYSBkZXBlbmRlbmN5IHNvcnQuICBGb3IKLSMjIyBleGFtcGxlLCBnZGIgcmVxdWlyZXMgdGhhdCBieWFjYyAob3IgYmlzb24pIGJlIGJ1aWx0IGZpcnN0LCBzbyBpdCBpcyBpbgotIyMjIHRoZSAke2hvc3RfdG9vbHN9IGxpc3QgYWZ0ZXIgYnlhY2MgYW5kIGJpc29uLiAgCi0KLQotIyB0aGVzZSBsaWJyYXJpZXMgYXJlIHVzZWQgYnkgdmFyaW91cyBwcm9ncmFtcyBidWlsdCBmb3IgdGhlIGhvc3QgZW52aXJvbm1lbnQKLSMKLWhvc3RfbGlicz0iaW50bCBtbWFsbG9jIGxpYmliZXJ0eSBvcGNvZGVzIGJmZCByZWFkbGluZSBnYXNoIGRiIHRjbCB0ayB0Y2w4LjEgdGs4LjEgdGNsWCBpdGNsIHRpeCBsaWJndWkiCi0KLWlmIFsgIiR7ZW5hYmxlX2dkYmd1aX0iID0gInllcyIgXSA7IHRoZW4KLQlob3N0X2xpYnM9IiR7aG9zdF9saWJzfSBsaWJndWkiCi1maQotCi0jIHRoZXNlIHRvb2xzIGFyZSBidWlsdCBmb3IgdGhlIGhvc3QgZW52aXJvbm1lbnQKLSMgTm90ZSwgdGhlIHBvd2VycGMtZWFiaSBidWlsZCBkZXBlbmRzIG9uIHNpbSBvY2N1cnJpbmcgYmVmb3JlIGdkYiBpbiBvcmRlciB0bwotIyBrbm93IHRoYXQgd2UgYXJlIGJ1aWxkaW5nIHRoZSBzaW11bGF0b3IuCi1ob3N0X3Rvb2xzPSJ0ZXhpbmZvIGJ5YWNjIGZsZXggYmlzb24gYmludXRpbHMgbGQgZ2FzIGdjYyBzaW0gZ2RiIG1ha2UgcGF0Y2ggcHJtcyBzZW5kLXByIGdwcm9mIGdkYnRlc3QgdGdhcyBldGMgZXhwZWN0IGRlamFnbnUgYXNoIGJhc2ggYnppcDIgbTQgYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbCBpc3BlbGwgZ3JlcCBkaWZmIHJjcyBjdnNzcmMgZmlsZXV0aWxzIHNoZWxsdXRpbHMgdGltZSB0ZXh0dXRpbHMgd2RpZmYgZmluZCBlbWFjcyBlbWFjczE5IHV1ZGVjb2RlIGhlbGxvIHRhciBnemlwIGluZGVudCByZWNvZGUgcmVsZWFzZSBzZWQgdXRpbHMgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBnYXdrIGZpbmR1dGlscyBzbmF2aWdhdG9yIGxpYnRvb2wgZ2V0dGV4dCB6aXAiCi0KLSMgdGhlc2UgbGlicmFyaWVzIGFyZSBidWlsdCBmb3IgdGhlIHRhcmdldCBlbnZpcm9ubWVudCwgYW5kIGFyZSBidWlsdCBhZnRlcgotIyB0aGUgaG9zdCBsaWJyYXJpZXMgYW5kIHRoZSBob3N0IHRvb2xzICh3aGljaCBtYXkgYmUgYSBjcm9zcyBjb21waWxlcikKLSMKLXRhcmdldF9saWJzPSJ0YXJnZXQtbGliaWJlcnR5IFwKLQkJdGFyZ2V0LWxpYmdsb3NzIFwKLQkJdGFyZ2V0LW5ld2xpYiBcCi0JCXRhcmdldC1saWJpbyBcCi0JCXRhcmdldC1saWJyeCBcCi0JCXRhcmdldC1saWJzdGRjKysgXAotCQl0YXJnZXQtbGliZysrIgotCi0jIHRoZXNlIHRvb2xzIGFyZSBidWlsdCB1c2luZyB0aGUgdGFyZ2V0IGxpYnMsIGFuZCBhcmUgaW50ZW5kZWQgdG8gcnVuIG9ubHkKLSMgaW4gdGhlIHRhcmdldCBlbnZpcm9ubWVudAotIwotIyBub3RlOiBhbnkgcHJvZ3JhbSB0aGF0ICp1c2VzKiBsaWJyYXJpZXMgdGhhdCBhcmUgaW4gdGhlICJ0YXJnZXRfbGlicyIKLSMgbGlzdCBiZWxvbmdzIGluIHRoaXMgbGlzdC4gIHRob3NlIHByb2dyYW1zIGFyZSBhbHNvIHZlcnkgbGlrZWx5Ci0jIGNhbmRpZGF0ZXMgZm9yIHRoZSAibmF0aXZlX29ubHkiIGxpc3Qgd2hpY2ggZm9sbG93cwotIwotdGFyZ2V0X3Rvb2xzPSJ0YXJnZXQtZXhhbXBsZXMgdGFyZ2V0LWdyb2ZmIHRhcmdldC1ncGVyZiIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgVGhlc2UgdHdvIGxpc3RzIGFyZSBvZiBkaXJlY3RvcmllcyB0aGF0IGFyZSB0byBiZSByZW1vdmVkIGZyb20gdGhlCi0jIyAke2NvbmZpZ2RpcnN9IGxpc3QgZm9yIGVpdGhlciBjcm9zcy1jb21waWxhdGlvbnMgb3IgZm9yIG5hdGl2ZS0KLSMjIGNvbXBpbGF0aW9ucy4gIEZvciBleGFtcGxlLCBpdCBkb2Vzbid0IG1ha2UgdGhhdCBtdWNoIHNlbnNlIHRvCi0jIyBjcm9zcy1jb21waWxlIEVtYWNzLCBub3IgaXMgaXQgdGVycmlibHkgdXNlZnVsIHRvIGNvbXBpbGUgdGFyZ2V0LWxpYmliZXJ0eSBpbgotIyMgYSBuYXRpdmUgZW52aXJvbm1lbnQuICAKLQotIyBkaXJlY3RvcmllcyB0byBiZSBidWlsdCBpbiB0aGUgbmF0aXZlIGVudmlyb25tZW50IG9ubHkKLSMKLSMgVGhpcyBtdXN0IGJlIGEgc2luZ2xlIGxpbmUgYmVjYXVzZSBvZiB0aGUgd2F5IGl0IGlzIHNlYXJjaGVkIGJ5IGdyZXAgaW4KLSMgdGhlIGNvZGUgYmVsb3cuCi1uYXRpdmVfb25seT0iYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbCBjdnNzcmMgZW1hY3MgZW1hY3MxOSBmaWxldXRpbHMgZmluZCBnYXdrIGdldHRleHQgZ3JlcCBnemlwIGhlbGxvIGluZGVudCBpc3BlbGwgbTQgcmNzIHJlY29kZSBzZWQgc2hlbGx1dGlscyB0YXIgdGV4dHV0aWxzIGdhc2ggdXVkZWNvZGUgd2RpZmYgZ3Byb2YgdGFyZ2V0LWdyb2ZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgdGltZSBhc2ggYmFzaCBiemlwMiBwcm1zIHNuYXZpZ2F0b3IgZ251c2VydiB0YXJnZXQtZ3BlcmYiCi0KLSMgZGlyZWN0b3JpZXMgdG8gYmUgYnVpbHQgaW4gYSBjcm9zcyBlbnZpcm9ubWVudCBvbmx5Ci0jCi1jcm9zc19vbmx5PSJ0YXJnZXQtbGliZ2xvc3MgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtY3lnbW9uIHRhcmdldC1vcGNvZGVzIHRhcmdldC1saWJzdHViIgotCi0jIyBBbGwgdG9vbHMgYmVsb25nIGluIG9uZSBvZiB0aGUgZm91ciBjYXRlZ29yaWVzLCBhbmQgYXJlIGFzc2lnbmVkIGFib3ZlCi0jIyBXZSBhc3NpZ24gJHtjb25maWdkaXJzfSB0aGlzIHdheSB0byByZW1vdmUgYWxsIGVtYmVkZGVkIG5ld2xpbmVzLiAgVGhpcwotIyMgaXMgaW1wb3J0YW50IGJlY2F1c2UgY29uZmlndXJlIHdpbGwgY2hva2UgaWYgdGhleSBldmVyIGdldCB0aHJvdWdoLgotIyMgJHtjb25maWdkaXJzfSBpcyBkaXJlY3RvcmllcyB3ZSBidWlsZCB1c2luZyB0aGUgaG9zdCB0b29scy4KLSMjICR7dGFyZ2V0X2NvbmZpZ2RpcnN9IGlzIGRpcmVjdG9yaWVzIHdlIGJ1aWxkIHVzaW5nIHRoZSB0YXJnZXQgdG9vbHMuCi0jCi1jb25maWdkaXJzPWBlY2hvICR7aG9zdF9saWJzfSAke2hvc3RfdG9vbHN9YAotdGFyZ2V0X2NvbmZpZ2RpcnM9YGVjaG8gJHt0YXJnZXRfbGlic30gJHt0YXJnZXRfdG9vbHN9YAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1zcmN0cmlnZ2VyPW1vdmUtaWYtY2hhbmdlCi1zcmNuYW1lPSJnbnUgZGV2ZWxvcG1lbnQgcGFja2FnZSIKLQotIyBUaGlzIGdldHMgc2V0IG5vbi1lbXB0eSBmb3Igc29tZSBuZXQgcmVsZWFzZXMgb2YgcGFja2FnZXMuCi1hcHBkaXJzPSIiCi0KLSMgcGVyLWhvc3Q6Ci0KLSMgV29yayBpbiBkaXN0cmlidXRpb25zIHRoYXQgY29udGFpbiBubyBjb21waWxlciB0b29scywgbGlrZSBBdXRvY29uZi4KLWlmIFsgLWQgJHtzcmNkaXJ9L2NvbmZpZyBdOyB0aGVuCi1jYXNlICIke2hvc3R9IiBpbgotICBtNjhrLWhwLWhwdXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocDMwMCIKLSAgICA7OwotICBtNjhrLWFwb2xsby1zeXN2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYXBvbGxvNjgiCi0gICAgOzsKLSAgbTY4ay1hcG9sbG8tYnNkKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYTY4YnNkIgotICAgIDs7Ci0gIG04OGstZGctZGd1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWRndXgiCi0gICAgOzsKLSAgbTg4ay1oYXJyaXMtY3h1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWN4dXgiCi0gICAgOzsKLSAgbTg4ay1tb3Rvcm9sYS1zeXN2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGVsdGE4OCIKLSAgICA7OwotICBtaXBzKi1kZWMtdWx0cml4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGVjc3RhdGlvbiIKLSAgICA7OwotICBtaXBzKi1uZWMtc3lzdjQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uZWN2NCIKLSAgICA7OwotICBtaXBzKi1zZ2ktaXJpeDYqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pcml4NiIKLSAgICA7OwotICBtaXBzKi1zZ2ktaXJpeDUqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pcml4NSIKLSAgICA7OwotICBtaXBzKi1zZ2ktaXJpeDQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pcml4NCIKLSAgICA7OwotICBtaXBzKi1zZ2ktaXJpeDMqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2IgotICAgIDs7Ci0gIG1pcHMqLSotc3lzdjQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NCIKLSAgICA7OwotICBtaXBzKi0qLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1yaXNjb3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc3lzdjUqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NSIKLSAgICA7OwotICBpWzM0NTZdODYtKi1kZ3V4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGd1eDM4NiIKLSAgICA7OwotICBpWzM0NTZdODYtbmNyLXN5c3Y0LjMqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uY3JzdnI0MyIKLSAgICA7OwotICBpWzM0NTZdODYtbmNyLXN5c3Y0KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbmNyMzAwMCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28zLjJ2NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc2NvIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXVkayopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y1IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWlzYyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc29sYXJpczIqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1haXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1haXgzODYiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbXNkb3NkamdwcCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWRqZ3BwIgotICAgIDs7Ci0gICotY3lnd2luKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtY3lnd2luIgotICAgIDs7Ci0gICotbWluZ3czMiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW1pbmd3MzIiCi0gICAgOzsKLSAgKi1pbnRlcml4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaW50ZXJpeCIKLSAgICA7OwotICAqLXdpbmRvd3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC13aW5kb3dzIgotICAgIDs7Ci0gIHZheC0qLXVsdHJpeDIqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC12YXh1bHQyIgotICAgIDs7Ci0gICotKi1zb2xhcmlzMiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXNvbGFyaXMiCi0gICAgOzsKLSAgbTY4ay1zdW4tc3Vub3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zdW4zIgotICAgIDs7Ci0gICotaHAtaHB1eFs3OF0qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4OCIKLSAgICA7OwotICAqLWhwLWhwdXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4IgotICAgIDs7Ci0gICotKi1oaXV4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaHB1eCIKLSAgICA7OwotICByczYwMDAtKi1seW54b3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1seW54cnM2ayIKLSAgICA7OwotICAqLSotbHlueG9zKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbHlueG9zIgotICAgIDs7Ci0gICotKi1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y0IgotICAgIDs7Ci0gICotKi1zeXN2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotZXNhYwotZmkKLQotIyBJZiB3ZSBhcmVuJ3QgZ29pbmcgdG8gYmUgdXNpbmcgZ2NjLCBzZWUgaWYgd2UgY2FuIGV4dHJhY3QgYSBkZWZpbml0aW9uCi0jIG9mIENDIGZyb20gdGhlIGZyYWdtZW50LgotaWYgWyAteiAiJHtDQ30iIF0gJiYgWyAiJHtidWlsZH0iID0gIiR7aG9zdH0iIF07IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm91bmQ9Ci0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCi0gICAgICBmb3VuZD15ZXMKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLSAgaWYgWyAteiAiJHtmb3VuZH0iIF0gJiYgWyAtbiAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdICYmIFsgLWYgIiR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30iIF07IHRoZW4KLSAgICB4eD1gc2VkIC1uIC1lICdzL15bIAldKkNDWyAJXSo9WyAJXSpcKC4qXCkkL1wxL3AnIDwgJHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfWAKLSAgICBpZiBbIC1uICIke3h4fSIgXSA7IHRoZW4KLSAgICAgIENDPSR4eAotICAgIGZpCi0gIGZpCi1maQotCi0jIFdlIGRlZmF1bHQgdG8gLS13aXRoLXNoYXJlZCBvbiBwbGF0Zm9ybXMgd2hlcmUgLWZwaWMgaXMgbWVhbmluZ2xlc3MuCi0jIFdlbGwsIHdlIGRvbid0IHlldCwgYnV0IHdlIHdpbGwuCi1pZiBmYWxzZSAmJiBbICIke2hvc3R9IiA9ICIke3RhcmdldH0iIF0gJiYgWyB4JHtlbmFibGVfc2hhcmVkfSA9IHggXTsgdGhlbgotICBjYXNlICIke3RhcmdldH0iIGluCi0gICAgYWxwaGEqLWRlYy1vc2YqKQllbmFibGVfc2hhcmVkPXllcyA7OwotICAgIGFscGhhKi0qLWxpbnV4KikJZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBtaXBzLXNnaS1pcml4NSopCWVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci0gICAgKikJCQllbmFibGVfc2hhcmVkPW5vIDs7Ci0gIGVzYWMKLWZpCi0KLWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCi0gIHllcykgc2hhcmVkPXllcyA7OwotICBubykgc2hhcmVkPW5vIDs7Ci0gICIiKSBzaGFyZWQ9bm8gOzsKLSAgKikgc2hhcmVkPXllcyA7OwotZXNhYwotCi1pZiBbIHgke3NoYXJlZH0gPSB4eWVzIF07IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICBhbHBoYSotKi1saW51eCopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZWxmYWxwaGFwaWMiCi0gICAgICA7OwotICAgIGFybSotKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFybXBpYyIKLSAgICAgIDs7Ci0gICAgaHBwYSotKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXBhcGljIgotICAgICAgOzsKLSAgICBpWzM0NTZdODYtKi1jeWd3aW4qKQotICAgICAgIyBXZSBkb24ndCB3YW50IC1mUElDIG9uIEN5Z3dpbi4KLSAgICAgIDs7Ci0gICAgaVszNDU2XTg2LSotKikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC14ODZwaWMiCi0gICAgICA7OwotICAgIGkzNzAtKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWkzNzBwaWMiCi0gICAgICA7OwotICAgIHNwYXJjNjQtKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXNwYXJjcGljIgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qLWFpeCopCi0gICAgICAjIFdlIGRvbid0IHdhbnQgLWZQSUMgb24gQUlYLgotICAgICAgOzsKLSAgICBwb3dlcnBjKi0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtcHBjcGljIgotICAgICAgOzsKLSAgICAqLSotKikKLSAgICAgIGlmIHRlc3QgLWYgJHtzcmNkaXJ9L2NvbmZpZy9taC0ke2hvc3RfY3B1fXBpYzsgdGhlbgotICAgICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtJHtob3N0X2NwdX1waWMiCi0gICAgICBmaQotICAgICAgOzsKLSAgZXNhYwotZmkKLQotcm0gLWYgbWgtZnJhZwotaWYgWyAtbiAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdIDsgdGhlbgotICBmb3IgZiBpbiAke2hvc3RfbWFrZWZpbGVfZnJhZ30KLSAgZG8KLSAgICBjYXQgJHtzcmNkaXJ9LyRmID4+IG1oLWZyYWcKLSAgZG9uZQotICBob3N0X21ha2VmaWxlX2ZyYWc9bWgtZnJhZwotZmkKLQotIyBwZXItdGFyZ2V0OgotCi1jYXNlICIke3RhcmdldH0iIGluCi0gIHY4MTAqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtdjgxMCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXR3YXJlKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW5ldHdhcmUiCi0gICAgOzsKLSAgcG93ZXJwYy0qLW5ldHdhcmUqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbmV0d2FyZSIKLSAgICA7OwotICAqLSotbGludXgtZ251KikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LWxpbnV4IgotICAgIDs7Ci0gICotKi1haXg0LlszNDU2Nzg5XSogfCAqLSotYWl4WzU2Nzg5XS4qKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtYWl4NDMiCi0gICAgOzsKLSAgbWlwcyotKi1wZSB8IHNoKi0qLXBlIHwgKmFybS13aW5jZS1wZSkKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXdpbmNlIgotICAgIDs7Ci1lc2FjCi0KLSMgSWYgLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlIGFsd2F5cyB1c2UgLU9zIGluc3RlYWQgb2YgLU8yIHRvIGJ1aWxkCi0jIHRoZSB0YXJnZXQgbGlicmFyaWVzLCBzaW1pbGFybHkgaWYgaXQgaXMgbm90IHNwZWNpZmllZCwgdXNlIC1PcwotIyBvbiBzZWxlY3RlZCBwbGF0Zm9ybXMuCi1jYXNlICIke2VuYWJsZV90YXJnZXRfb3B0c3BhY2V9OiR7dGFyZ2V0fSIgaW4KLSAgeWVzOiopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1vc3BhY2UiCi0gICAgOzsKLSAgOmQzMHYtKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LWQzMHYiCi0gICAgOzsKLSAgOm0zMnItKiB8IDpkMTB2LSogfCA6ZnIzMC0qKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtb3NwYWNlIgotICAgIDs7Ci0gIG5vOiogfCA6KikKLSAgICA7OwotICAqKQotICAgIGVjaG8gIioqKiBiYWQgdmFsdWUgXCIke2VuYWJsZV90YXJnZXRfb3B0c3BhY2V9XCIgZm9yIC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSBmbGFnOyBpZ25vcmVkIiAxPiYyCi0gICAgOzsKLWVzYWMKLQotc2tpcGRpcnM9Ci1nYXNkaXI9Z2FzCi11c2VfZ251X2xkPQotdXNlX2dudV9hcz0KLQotIyBzb21lIHRvb2xzIGFyZSBzbyBkZXBlbmRlbnQgdXBvbiBYMTEgdGhhdCBpZiB3ZSdyZSBub3QgYnVpbGRpbmcgd2l0aCBYLCAKLSMgaXQncyBub3QgZXZlbiB3b3J0aCB0cnlpbmcgdG8gY29uZmlndXJlLCBtdWNoIGxlc3MgYnVpbGQsIHRoYXQgdG9vbC4KLQotY2FzZSAke3dpdGhfeH0gaW4KLSAgeWVzIHwgIiIpICAjIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHRyZWUgaXMgdGhhdCBYMTEgaXMgYXZhaWxhYmxlCi0JOzsKLSAgbm8pCi0Jc2tpcGRpcnM9IiR7c2tpcGRpcnN9IHRrIGxpYmd1aSBnYXNoIgotCTs7Ci0gICopCi0gICAgCWVjaG8gIioqKiBiYWQgdmFsdWUgXCIke3dpdGhfeH1cIiBmb3IgLXdpdGgteCBmbGFnOyBpZ25vcmVkIiAxPiYyCi0gICAgCTs7Ci1lc2FjCi0KLSMgU29tZSB0b29scyBhcmUgb25seSBzdWl0YWJsZSBmb3IgYnVpbGRpbmcgaW4gYSAibmF0aXZlIiBzaXR1YXRpb24uCi0jIFRob3NlIGFyZSBhZGRlZCB3aGVuIHdlIGhhdmUgYSBob3N0PT10YXJnZXQgY29uZmlndXJhdGlvbi4gIEZvciBjcm9zcwotIyB0b29sY2hhaW5zLCB3ZSBhZGQgc29tZSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWZ1bCBpbiBhCi0jIGNyb3NzLWNvbXBpbGVyLgotCi1pc19jcm9zc19jb21waWxlcj0KLQotaWYgWyB4IiR7aG9zdH0iID0geCIke3RhcmdldH0iIF0gOyB0aGVuCi0JIyB3aGVuIGRvaW5nIGEgbmF0aXZlIHRvb2xjaGFpbiwgZG9uJ3QgYnVpbGQgdGhlIHRhcmdldHMKLQkjIHRoYXQgYXJlIGluIHRoZSAnY3Jvc3Mgb25seScgbGlzdAotCXNraXBkaXJzPSIke3NraXBkaXJzfSAke2Nyb3NzX29ubHl9IgotCWlzX2Nyb3NzX2NvbXBpbGVyPW5vCi1lbHNlCi0JIyBzaW1pbGFybHksIGRvbid0IGJ1aWxkIHRoZSB0YXJnZXRzIGluIHRoZSAnbmF0aXZlIG9ubHknIAotCSMgbGlzdCB3aGVuIGJ1aWxkaW5nIGEgY3Jvc3MgY29tcGlsZXIKLQlza2lwZGlycz0iJHtza2lwZGlyc30gJHtuYXRpdmVfb25seX0iCi0JaXNfY3Jvc3NfY29tcGlsZXI9eWVzCi1maQkKLQotIyBXZSBhbHdheXMgd2FudCB0byB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgdGhpcyBkaXJlY3RvcnksIHNvIHRoYXQgZGVqYWdudQotIyBjYW4gcmVsaWFibHkgZmluZCBpdC4KLXRhcmdldF9zdWJkaXI9JHt0YXJnZXRfYWxpYXN9Ci0KLWlmIFsgISAtZCAke3RhcmdldF9zdWJkaXJ9IF0gOyB0aGVuCi0gIGlmIG1rZGlyICR7dGFyZ2V0X3N1YmRpcn0gOyB0aGVuIHRydWUKLSAgZWxzZQotICAgIGVjaG8gIicqKiogY291bGQgbm90IG1ha2UgJHtQV0Q9YHB3ZGB9LyR7dGFyZ2V0X3N1YmRpcn0iIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpCi0KLWNvcHlfZGlycz0KLQotIyBIYW5kbGUgLS13aXRoLWhlYWRlcnM9WFhYLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBuYW1lZCBkaXJlY3RvcnkgYXJlCi0jIGNvcGllZCB0byAkKHRvb2xkaXIpL3N5cy1pbmNsdWRlLgotaWYgWyB4IiR7d2l0aF9oZWFkZXJzfSIgIT0geCBdOyB0aGVuCi0gIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ID0geG5vIF07IHRoZW4KLSAgICBlY2hvIDE+JjIgJyoqKicgLS13aXRoLWhlYWRlcnMgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiBjcm9zcyBjb21waWxpbmcKLSAgICBleGl0IDEKLSAgZmkKLSAgY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCi0gICIiKSB4PSR7cHJlZml4fSA7OwotICAqKSB4PSR7ZXhlY19wcmVmaXh9IDs7Ci0gIGVzYWMKLSAgY29weV9kaXJzPSIke2NvcHlfZGlyc30gJHt3aXRoX2hlYWRlcnN9ICR4LyR7dGFyZ2V0X2FsaWFzfS9zeXMtaW5jbHVkZSIKLWZpCi0KLSMgSGFuZGxlIC0td2l0aC1saWJzPVhYWC4gIE11bHRpcGxlIGRpcmVjdG9yaWVzIGFyZSBwZXJtaXR0ZWQuICBUaGUKLSMgY29udGVudHMgYXJlIGNvcGllZCB0byAkKHRvb2xkaXIpL2xpYi4KLWlmIFsgeCIke3dpdGhfbGlic30iICE9IHggXTsgdGhlbgotICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSA9IHhubyBdOyB0aGVuCi0gICAgZWNobyAxPiYyICcqKionIC0td2l0aC1saWJzIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gY3Jvc3MgY29tcGlsaW5nCi0gICAgZXhpdCAxCi0gIGZpCi0gICMgQ29weSB0aGUgbGlicmFyaWVzIGluIHJldmVyc2Ugb3JkZXIsIHNvIHRoYXQgZmlsZXMgaW4gdGhlIGZpcnN0IG5hbWVkCi0gICMgbGlicmFyeSBvdmVycmlkZSBmaWxlcyBpbiBzdWJzZXF1ZW50IGxpYnJhcmllcy4KLSAgY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCi0gICIiKSB4PSR7cHJlZml4fSA7OwotICAqKSB4PSR7ZXhlY19wcmVmaXh9IDs7Ci0gIGVzYWMKLSAgZm9yIGwgaW4gJHt3aXRoX2xpYnN9OyBkbwotICAgIGNvcHlfZGlycz0iJGwgJHgvJHt0YXJnZXRfYWxpYXN9L2xpYiAke2NvcHlfZGlyc30iCi0gIGRvbmUKLWZpCi0KLSMgSWYgYm90aCAtLXdpdGgtaGVhZGVycyBhbmQgLS13aXRoLWxpYnMgYXJlIHNwZWNpZmllZCwgZGVmYXVsdCB0bwotIyAtLXdpdGhvdXQtbmV3bGliLgotaWYgWyB4IiR7d2l0aF9oZWFkZXJzfSIgIT0geCBdICYmIFsgeCIke3dpdGhfbGlic30iICE9IHggXTsgdGhlbgotICBpZiBbIHgiJHt3aXRoX25ld2xpYn0iID0geCBdOyB0aGVuCi0gICAgd2l0aF9uZXdsaWI9bm8KLSAgZmkKLWZpCi0KLSMgUmVjb2duaXplIC0td2l0aC1uZXdsaWIvLS13aXRob3V0LW5ld2xpYi4KLWlmIFsgeCR7d2l0aF9uZXdsaWJ9ID0geG5vIF07IHRoZW4KLSAgc2tpcGRpcnM9IiR7c2tpcGRpcnN9IHRhcmdldC1uZXdsaWIiCi1lbGlmIFsgeCR7d2l0aF9uZXdsaWJ9ID0geHllcyBdOyB0aGVuCi0gIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gdGFyZ2V0LW5ld2xpYiAvIC8nYAotZmkKLQotIyBEZWZhdWx0IHRvIHVzaW5nIC0td2l0aC1zdGFicyBmb3IgY2VydGFpbiB0YXJnZXRzLgotaWYgWyB4JHt3aXRoX3N0YWJzfSA9IHggXTsgdGhlbgotICBjYXNlICIke3RhcmdldH0iIGluCi0gIG1pcHMqLSotaXJpeDYqKQotICAgIDs7Ci0gIG1pcHMqLSotKiB8IGFscGhhKi0qLW9zZiopCi0gICAgd2l0aF9zdGFicz15ZXM7Ci0gICAgd2l0aG9wdGlvbnM9IiR7d2l0aG9wdGlvbnN9IC0td2l0aC1zdGFicyIKLSAgICA7OwotICBlc2FjCi1maQotCi0jIEhhbmRsZSAke2NvcHlfZGlyc30KLXNldCBmbm9yZCAke2NvcHlfZGlyc30KLXNoaWZ0Ci13aGlsZSBbICQjICE9IDAgXTsgZG8KLSAgaWYgWyAtZiAkMi9DT1BJRUQgXSAmJiBbIHgiYGNhdCAkMi9DT1BJRURgIiA9IHgiJDEiIF07IHRoZW4KLSAgICA6Ci0gIGVsc2UKLSAgICBlY2hvIENvcHlpbmcgJDEgdG8gJDIKLQotICAgICMgVXNlIHRoZSBpbnN0YWxsIHNjcmlwdCB0byBjcmVhdGUgdGhlIGRpcmVjdG9yeSBhbmQgYWxsIHJlcXVpcmVkCi0gICAgIyBwYXJlbnQgZGlyZWN0b3JpZXMuCi0gICAgaWYgWyAtZCAkMiBdOyB0aGVuCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgZWNobyA+Y29uZmlnLnRlbXAKLSAgICAgICR7c3JjZGlyfS9pbnN0YWxsLXNoIC1jIC1tIDY0NCBjb25maWcudGVtcCAkMi9DT1BJRUQKLSAgICBmaQotCi0gICAgIyBDb3B5IHRoZSBkaXJlY3RvcnksIGFzc3VtaW5nIHdlIGhhdmUgdGFyLgotICAgICMgRklYTUU6IFNob3VsZCB3ZSB1c2UgQiBpbiB0aGUgc2Vjb25kIHRhcj8gIE5vdCBhbGwgc3lzdGVtcyBzdXBwb3J0IGl0LgotICAgIChjZCAkMTsgdGFyIC1jZiAtIC4pIHwgKGNkICQyOyB0YXIgLXhwZiAtKQotCi0gICAgIyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHVzZXIgdG8gY29ycmVjdGx5IGFkanVzdCBhbGwKLSAgICAjIHN5bWxpbmtzLiAgSWYgc29tZWJvZHkgY2FuIGZpZ3VyZSBvdXQgaG93IHRvIGhhbmRsZSB0aGVtIGNvcnJlY3RseQotICAgICMgaGVyZSwgZmVlbCBmcmVlIHRvIGFkZCB0aGUgY29kZS4KLQotICAgIGVjaG8gJDEgPiAkMi9DT1BJRUQKLSAgZmkKLSAgc2hpZnQ7IHNoaWZ0Ci1kb25lCi0KLSMgQ29uZmlndXJlIGV4dHJhIGRpcmVjdG9yaWVzIHdoaWNoIGFyZSBob3N0IHNwZWNpZmljCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0JaVszNDU2XTg2LSotZ28zMiopCi0JICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBkb3NyZWwiIDs7Ci0JaVszNDU2XTg2LSotbWluZ3czMiopCi0JICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBkb3NyZWwiIDs7Ci0JKi1jeWd3aW4qKQotCSAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgbGlidGVybWNhcCBkb3NyZWwiIDs7Ci1lc2FjCi0KLSMgUmVtb3ZlIG1vcmUgcHJvZ3JhbXMgZnJvbSBjb25zaWRlcmF0aW9uLCBiYXNlZCBvbiB0aGUgaG9zdCBvciAKLSMgdGFyZ2V0IHRoaXMgdXN1YWxseSBtZWFucyB0aGF0IGEgcG9ydCBvZiB0aGUgcHJvZ3JhbSBkb2Vzbid0Ci0jIGV4aXN0IHlldC4KLQotbm9jb25maWdkaXJzPSIiCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0gIGlbMzQ1Nl04Ni0qLXZzdGEpCi0gICAgbm9jb25maWdkaXJzPSJ0Y2wgZXhwZWN0IGRlamFnbnUgbWFrZSB0ZXhpbmZvIGJpc29uIHBhdGNoIGZsZXggYnlhY2Mgc2VuZC1wciBncHJvZiB1dWRlY29kZSBkZWphZ251IGRpZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYgZ2V0dGV4dCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1nbzMyKiB8IGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKQotICAgIG5vY29uZmlnZGlycz0idGNsIHRrIGV4cGVjdCBkZWphZ251IG1ha2UgdGV4aW5mbyBiaXNvbiBwYXRjaCBmbGV4IGJ5YWNjIHNlbmQtcHIgdXVkZWNvZGUgZGVqYWdudSBkaWZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IGdldHRleHQiCi0JOzsKLSAgaVszNDU2XTg2LSotbWluZ3czMiopCi0gICAgIyBub2NvbmZpZ2RpcnM9InRjbCB0ayBleHBlY3QgZGVqYWdudSBtYWtlIHRleGluZm8gYmlzb24gcGF0Y2ggZmxleCBieWFjYyBzZW5kLXByIHV1ZGVjb2RlIGRlamFnbnUgZGlmZiBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICAgbm9jb25maWdkaXJzPSJleHBlY3QgZGVqYWdudSBjdnMgYXV0b2NvbmYgYXV0b21ha2Ugc2VuZC1wciByY3MgZ3VpbGUgcGVybCB0ZXhpbmZvIGFwYWNoZSBpbmV0IGxpYnRvb2wiCi0JOzsKLSAgaVszNDU2XTg2LSotYmVvcyopCi0gICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0ayBpdGNsIHRpeCBsaWJndWkgZ2RiIgotICAgICA7OwotICAqLSotY3lnd2luKikKLSAgICAgbm9jb25maWdkaXJzPSJhdXRvY29uZiBhdXRvbWFrZSBzZW5kLXByIHJjcyBndWlsZSBwZXJsIHRleGluZm8gYXBhY2hlIGluZXQiCi0gICAgOzsKLSAgKi0qLW5ldGJzZCopCi0gICAgbm9jb25maWdkaXJzPSJyY3MiCi0gICAgOzsKLSAgcHBjKi0qLXBlKQotICAgICBub2NvbmZpZ2RpcnM9InBhdGNoIGRpZmYgbWFrZSB0ayB0Y2wgZXhwZWN0IGRlamFnbnUgY3Zzc3JjIGF1dG9jb25mIGF1dG9tYWtlIHRleGluZm8gYmlzb24gc2VuZC1wciBncHJvZiByY3MgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgOzsKLWVzYWMKLQotCi1jYXNlICIke3RhcmdldH0iIGluCi0gICotKi1uZXR3YXJlKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYnJ4IHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmliZXJ0eSB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgKi0qLXJ0ZW1zKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gICotKi12eHdvcmtzKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYWxwaGEqLWRlYy1vc2YqKQotICAgICMgbGQgd29ya3MsIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuICBlbWFjcyBkb2Vzbid0Ci0gICAgIyB3b3JrLiAgbmV3bGliIGlzIG5vdCA2NCBiaXQgcmVhZHkuICBJJ20gbm90IHN1cmUgYWJvdXQgZmlsZXV0aWxzLgotICAgICMgZ2FzIGRvZXNuJ3QgZ2VuZXJhdGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnYXMgbGQgZW1hY3MgZmlsZXV0aWxzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFscGhhKi0qLSp2bXMqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgbGQgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYWxwaGEqLSotbGludXgqKQotICAgICMgbmV3bGliIGlzIG5vdCA2NCBiaXQgcmVhZHkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgIyBsaW51eCBoYXMgcnggaW4gbGliYwotICAgIHNraXBkaXJzPSIkc2tpcGRpcnMgdGFyZ2V0LWxpYnJ4IgotICAgIDs7Ci0gIGFscGhhKi0qLSopCi0gICAgIyBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBzaCotKi1wZXxtaXBzKi0qLXBlfCphcm0td2luY2UtcGUpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJqYXZhIHRhcmdldC1saWJmZmkgdGFyZ2V0LXpsaWIiCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1ib2VobS1nYyB0YXJnZXQtcXRocmVhZHMgdGFyZ2V0LWV4YW1wbGVzIgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGlicnggdGFyZ2V0LWxpYmliZXJ0eSB0ZXhpbmZvIHNlbmQtcHIiCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRjbCB0aXggdGsgaXRjbCBsaWJndWkgc2ltIgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBleHBlY3QgZGVqYWdudSIKLSAgICAjIHRoZSBDKysgbGlicmFyaWVzIGRvbid0IGJ1aWxkIG9uIHRvcCBvZiBDRSdzIEMgbGlicmFyaWVzCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8iCi0gICAgc2tpcGRpcnM9IiRza2lwZGlycyB0YXJnZXQtbmV3bGliIgotICAgIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgICAqLSotY3lnd2luKikgOzsgIyBrZWVwIGdkYiBhbmQgcmVhZGxpbmUKLSAgICAgICopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgcmVhZGxpbmUgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmcrKyIKLQkgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgYXJjLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLXBlKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFybS0qLWNvZmYqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIGFybS0qLWVsZiopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgYXJtLSotb2FiaSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBjNHgtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdGh1bWItKi1jb2ZmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdGh1bWItKi1lbGYpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB0aHVtYi0qLW9hYmkpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBzdHJvbmdhcm0tKi1lbGYpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3Ryb25nYXJtLSotY29mZikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICB0aHVtYi0qLXBlKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYXJtLSotcmlzY2l4KikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGQxMHYtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGlicnggdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyIKLSAgICA7OwotICBkMzB2LSotKikKLSAgICA7OwotICBmcjMwLSotZWxmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgaDgzMDAqLSotKiB8IFwKLSAgaDg1MDAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaHBwYSotKi0qZWxmKiB8IFwKLSAgaHBwYSotKi1saW51eC1nbnUqIHwgXAotICBocHBhKi0qLWxpdGVzKikKLSAgICAjIERvIGNvbmZpZ3VyZSBsZC9iaW51dGlscy9nYXMgZm9yIHRoZSBhYm92ZSBjYXNlcy4KLSAgICA7OwotICBocHBhKi0qLSopCi0gICAgIyBIUCdzIEMgY29tcGlsZXIgZG9lc24ndCBoYW5kbGUgRW1hY3MgY29ycmVjdGx5IChidXQgb24gQlNEIGFuZCBNYWNoCi0gICAgIyBjYyBpcyBnY2MsIGFuZCBvbiBhbnkgc3lzdGVtIGEgdXNlciBzaG91bGQgYmUgYWJsZSB0byBsaW5rIGNjIHRvCi0gICAgIyB3aGF0ZXZlciB0aGV5IHdhbnQuICBGSVhNRSwgZW1hY3MgZW1hY3MxOSkuCi0gICAgY2FzZSAiJHtDQ30iIGluCi0JIiIgfCBjYyopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IiA7OwotICAgICAgICAqKSA7OwotICAgIGVzYWMKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgc2hlbGx1dGlscyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1jb2ZmIHwgaVszNDU2XTg2LSotZWxmKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotICAgICAgICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBpWzM0NTZdODYtKi1nbzMyKiB8IGlbMzQ1Nl0tKi1tc2Rvc2RqZ3BwKikKLSAgICAjIGJ1dCBkb24ndCBidWlsZCBnZGIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotICAgIHRhcmdldF9jb25maWdkaXJzPSIkdGFyZ2V0X2NvbmZpZ2RpcnMgdGFyZ2V0LW1pbmd3IgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBleHBlY3QgdGFyZ2V0LWxpYmdsb3NzIgotCi0gICAgIyBDYW4ndCBidWlsZCBnZGIgZm9yIG1pbmd3MzIgaWYgbm90IG5hdGl2ZS4KLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICAgaVszNDU2XTg2LSotbWluZ3czMikgOzsgIyBrZWVwIGdkYiB0Y2wgdGsgZXhwZWN0IGV0Yy4KLSAgICAgICopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgICAgICA7OwotICAgIGVzYWMKLSAgICA7OyAgICAKLSAgKi0qLWN5Z3dpbiopCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR0YXJnZXRfY29uZmlnZGlycyB0YXJnZXQtbGlidGVybWNhcCB0YXJnZXQtd2luc3VwIgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgIyBhbHdheXMgYnVpbGQgbmV3bGliLgotICAgIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gdGFyZ2V0LW5ld2xpYiAvIC8nYAotCi0gICAgIyBDYW4ndCBidWlsZCBnZGIgZm9yIEN5Z3dpbiBpZiBub3QgbmF0aXZlLgotICAgIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgICAqLSotY3lnd2luKikgOzsgIyBrZWVwIGdkYiB0Y2wgdGsgZXhwZWN0IGV0Yy4KLSAgICAgICopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBsaWJndWkgZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsgICAgCi0gIGlbMzQ1Nl04Ni0qLXBlKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotICAgICMgVGhlIGxpbmtlciBkb2VzIG5vdCB5ZXQga25vdyBhYm91dCB3ZWFrIHN5bWJvbHMgaW4gQ09GRiwKLSAgICAjIGFuZCBpcyBub3QgY29uZmlndXJlZCB0byBoYW5kbGUgbWl4ZWQgRUxGIGFuZCBDT0ZGLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNvbGFyaXMyKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXN5c3Y0KikKLSAgICAjIFRoZSBTWVNWNCBDIGNvbXBpbGVyIGRvZXNuJ3QgaGFuZGxlIEVtYWNzIGNvcnJlY3RseQotICAgIGNhc2UgIiR7Q0N9IiBpbgotCSIiIHwgY2MqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZW1hY3MgZW1hY3MxOSIgOzsKLSAgICAgICAgKikgOzsKLSAgICBlc2FjCi0gICAgIyBidXQgdGhhdCdzIG9rYXkgc2luY2UgZW1hY3MgZG9lc24ndCB3b3JrIGFueXdheQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1iZW9zKikKLSAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICAgOzsKLSAgbTY4ay0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIG02OGstKi1jb2ZmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbW4xMDIwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbW4xMDMwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBwb3dlcnBjLSotYWl4KikKLSAgICAjIGNvcGllZCBmcm9tIHJzNjAwMC0qLSogZW50cnkKLSAgICAjIFRoZSBjb25maWd1cmUgYW5kIGJ1aWxkIG9mIGxkIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgYmVjYXVzZQotICAgICMgR05VIGxkIGlzIGtub3duIHRvIGJlIGJyb2tlbiBmb3IgQUlYIDQuMiBhbmQgNC4zIChhdCBsZWFzdCkKLSAgICAjIFRoZSBzeW1wdG9tIGlzIHRoYXQgR0RCdGsgNC4xOCBmYWlscyBhdCBzdGFydHVwIHdpdGggYSBzZWdmYXVsdAotICAgICMgaWYgbGlua2VkIGJ5IEdOVSBsZCwgYnV0IG5vdCBpZiBsaW5rZWQgYnkgdGhlIG5hdGl2ZSBsZC4KLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgY3Zzc3JjIHRhcmdldC1saWJnbG9zcyBsZCIKLSAgICB1c2VfZ251X2xkPW5vCi0gICAgOzsKLSAgcG93ZXJwYyotKi13aW5udCogfCBwb3dlcnBjKi0qLXBlKiB8IHBwYyotKi1wZSkKLSAgICB0YXJnZXRfY29uZmlnZGlycz0iJHRhcmdldF9jb25maWdkaXJzIHRhcmdldC13aW5zdXAiCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0Y2wgdGsgbWFrZSBleHBlY3QgdGFyZ2V0LWxpYmdsb3NzIGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICAjIGFsd2F5cyBidWlsZCBuZXdsaWIuCi0gICAgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyB0YXJnZXQtbmV3bGliIC8gLydgCi0gICAgOzsKLSAgICAjIFRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIGNhbiBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcwotICBwb3dlcnBjbGUtKi1zb2xhcmlzKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHNpbSBtYWtlIHRjbCB0ayBleHBlY3QgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgIDs7Ci0gIHBvd2VycGMtKi1lYWJpKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICByczYwMDAtKi1seW54b3MqKQotICAgICMgVGhlIENWUyBzZXJ2ZXIgY29kZSBkb2Vzbid0IHdvcmsgb24gdGhlIFJTLzYwMDAKLSAgICAjIE5ld2xpYiBtYWtlcyBwcm9ibGVtcyBmb3IgbGliZysrIGluIGNyb3NzZXMuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgZ3Byb2YgY3Zzc3JjIgotICAgIDs7Ci0gIHJzNjAwMC0qLWFpeCopCi0gICAgIyBUaGUgY29uZmlndXJlIGFuZCBidWlsZCBvZiBsZCBhcmUgY3VycmVudGx5IGRpc2FibGVkIGJlY2F1c2UKLSAgICAjIEdOVSBsZCBpcyBrbm93biB0byBiZSBicm9rZW4gZm9yIEFJWCA0LjIgYW5kIDQuMyAoYXQgbGVhc3QpCi0gICAgIyBUaGUgc3ltcHRvbSBpcyB0aGF0IEdEQnRrIDQuMTggZmFpbHMgYXQgc3RhcnR1cCB3aXRoIGEgc2VnZmF1bHQKLSAgICAjIGlmIGxpbmtlZCBieSBHTlUgbGQsIGJ1dCBub3QgaWYgbGlua2VkIGJ5IHRoZSBuYXRpdmUgbGQuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIGxkIgotICAgIHVzZV9nbnVfbGQ9bm8KLSAgICA7OwotICByczYwMDAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIKLSAgICA7OwotICBtNjhrLWFwb2xsby0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCBiaW51dGlscyBncHJvZiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgbWlwcyotKi1pcml4NSopCi0gICAgIyBUaGUgR05VIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgIyBlbWFjcyBpcyBlbWFjcyAxOCwgd2hpY2ggZG9lcyBub3Qgd29yayBvbiBJcml4IDUgKGVtYWNzMTkgZG9lcyB3b3JrKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCBncHJvZiBlbWFjcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgbWlwcyotKi1pcml4NiopCi0gICAgIyBUaGUgR05VIGFzc2VtYmxlciBkb2VzIG5vdCBzdXBwb3J0IElSSVggNi4KLSAgICAjIGVtYWNzIGlzIGVtYWNzIDE4LCB3aGljaCBkb2VzIG5vdCB3b3JrIG9uIElyaXggNSAoZW1hY3MxOSBkb2VzIHdvcmspCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdhcyBncHJvZiBlbWFjcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgbWlwcyotKi1saW51eCopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIgotICAgICMgbGludXggaGFzIHJ4IGluIGxpYmMKLSAgICBza2lwZGlycz0iJHNraXBkaXJzIHRhcmdldC1saWJyeCIKLSAgICA7OwotICBtaXBzKi1kZWMtYnNkKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLSotYnNkKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHN0eDM5LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YiICAgIyBzYW1lIGFzIGdlbmVyaWMgbWlwcwotICAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICA7OwotICBtaXBzKi0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIgotICAgIDs7Ci0gIHJvbXAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgbGQgZ2FzIG9wY29kZXMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHNoLSotKikKLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICAgaVszNDU2XTg2LSotdnN0YSkgOzsgIyBkb24ndCBhZGQgZ3Byb2YgYmFjayBpbgotICAgICAgaVszNDU2XTg2LSotZ28zMiopIDs7ICMgZG9uJ3QgYWRkIGdwcm9mIGJhY2sgaW4KLSAgICAgIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKSA7OyAjIGRvbid0IGFkZCBncHJvZiBiYWNrIGluCi0gICAgICAqKSBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIGdwcm9mIC8gLydgIDs7Ci0gICAgZXNhYwotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgc3BhcmMtKi1lbGYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3BhcmM2NC0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzcGFyY2xpdGUtKi0qKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzcGFyYy0qLXN1bm9zNCopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0gICAgICAgICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgZ2RidGVzdCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICBlbHNlCi0gICAgICAgICAgIHVzZV9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIHY4MTAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBiZmQgYmludXRpbHMgZ2FzIGdjYyBnZGIgbGQgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyBvcGNvZGVzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2ODUwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHY4NTBlLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHY4NTBlYS0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2YXgtKi12bXMpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGJmZCBiaW51dGlscyBnZGIgbGQgdGFyZ2V0LW5ld2xpYiBvcGNvZGVzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2YXgtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICAqLSotbGludXgqKQotICAgICMgbGludXggaGFzIHJ4IGluIGxpYmMKLSAgICBza2lwZGlycz0iJHNraXBkaXJzIHRhcmdldC1saWJyeCIKLSAgICA7OwotICAqLSotbHlueG9zKikKLSAgICAjIE5ld2xpYiBtYWtlcyBwcm9ibGVtcyBmb3IgbGliZysrIGluIGNyb3NzZXMuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7IAotICAqLSotbWFjb3MqIHwgXAotICAqLSotbXB3KikKLSAgICAjIE1hY3Mgd2FudCBhIHJlc291cmNlIGNvbXBpbGVyLgotICAgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGdyZXoiCi0gICAgOzsgICAgCi1lc2FjCi0KLSMgSWYgd2UgYXJlbid0IGJ1aWxkaW5nIG5ld2xpYiwgdGhlbiBkb24ndCBidWlsZCBsaWJnbG9zcywgc2luY2UgbGliZ2xvc3MKLSMgZGVwZW5kcyB1cG9uIHNvbWUgbmV3bGliIGhlYWRlciBmaWxlcy4KLWNhc2UgIiR7bm9jb25maWdkaXJzfSIgaW4KLSAgKnRhcmdldC1saWJnbG9zcyopIDs7Ci0gICp0YXJnZXQtbmV3bGliKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIgOzsKLWVzYWMKLQotIyBNYWtlIHN1cmUgd2UgZG9uJ3QgbGV0IEdOVSBsZCBiZSBhZGRlZCBpZiB3ZSBkaWRuJ3Qgd2FudCBpdC4KLWlmIFsgeCR3aXRoX2dudV9sZCA9IHhubyBdOyB0aGVuCi0gIHVzZV9nbnVfbGQ9bm8KLSAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIgotZmkKLQotIyBNYWtlIHN1cmUgd2UgZG9uJ3QgbGV0IEdOVSBhcyBiZSBhZGRlZCBpZiB3ZSBkaWRuJ3Qgd2FudCBpdC4KLWlmIFsgeCR3aXRoX2dudV9hcyA9IHhubyBdOyB0aGVuCi0gIHVzZV9nbnVfYXM9bm8KLSAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdhcyIKLWZpCi0KLSMgUmVtb3ZlIHRoZSBlbnRyaWVzIGluICRza2lwZGlycyBhbmQgJG5vY29uZmlnZGlycyBmcm9tICRjb25maWdkaXJzIGFuZAotIyAkdGFyZ2V0X2NvbmZpZ2RpcnMuCi0jIElmIHdlIGhhdmUgdGhlIHNvdXJjZSBmb3IgJG5vY29uZmlnZGlycyBlbnRyaWVzLCBhZGQgdGhlbSB0byAkbm90c3VwcC4KLQotbm90c3VwcD0iIgotZm9yIGRpciBpbiAuICRza2lwZGlycyAkbm9jb25maWdkaXJzIDsgZG8KLSAgZGlybmFtZT1gZWNobyAkZGlyIHwgc2VkIC1lIHMvdGFyZ2V0LS8vZ2AKLSAgaWYgWyAkZGlyICE9IC4gXSAgJiYgZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBjb25maWdkaXJzPWBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgc2VkIC1lICJzLyAke2Rpcn0gLyAvImAKLSAgICBpZiBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlIF0gXAotCXx8IFsgLXIgJHNyY2Rpci8kZGlybmFtZS9jb25maWd1cmUuaW4gXTsgdGhlbgotICAgICAgaWYgZWNobyAiICR7c2tpcGRpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JdHJ1ZQotICAgICAgZWxzZQotCW5vdHN1cHA9IiRub3RzdXBwICRkaXIiCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi0gIGlmIFsgJGRpciAhPSAuIF0gICYmIGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIHRhcmdldF9jb25maWdkaXJzPWBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IHNlZCAtZSAicy8gJHtkaXJ9IC8gLyJgCi0gICAgaWYgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZSBdIFwKLQl8fCBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlLmluIF07IHRoZW4KLSAgICAgIGlmIGVjaG8gIiAke3NraXBkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCXRydWUKLSAgICAgIGVsc2UKLQlub3RzdXBwPSIkbm90c3VwcCAkZGlyIgotICAgICAgZmkKLSAgICBmaQotICBmaQotZG9uZQotCi0jIFNvbWV0aW1lcyB0aGUgdG9vbHMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggbGliaWJlcnR5IGJ1dCB3aXRoIG5vIG90aGVyCi0jIGxpYnJhcmllcy4gIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBidWlsZCB0YXJnZXQtbGliaWJlcnR5LgotaWYgWyAtbiAiJHt0YXJnZXRfY29uZmlnZGlyc30iIF07IHRoZW4KLSAgb3RoZXJzPQotICBmb3IgaSBpbiBgZWNobyAke3RhcmdldF9jb25maWdkaXJzfSB8IHNlZCAtZSBzL3RhcmdldC0vL2dgIDsgZG8KLSAgICBpZiBbICIkaSIgIT0gImxpYmliZXJ0eSIgXTsgdGhlbgotICAgICAgaWYgWyAtciAkc3JjZGlyLyRpL2NvbmZpZ3VyZSBdIHx8IFsgLXIgJHNyY2Rpci8kaS9jb25maWd1cmUuaW4gXTsgdGhlbgotCW90aGVycz15ZXM7Ci0JYnJlYWs7Ci0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgaWYgWyAteiAiJHtvdGhlcnN9IiBdOyB0aGVuCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9Ci0gIGZpCi1maQotCi0jIERlY29uZmlndXJlIGFsbCBzdWJkaXJlY3RvcmllcywgaW4gY2FzZSB3ZSBhcmUgY2hhbmdpbmcgdGhlCi0jIGNvbmZpZ3VyYXRpb24gZnJvbSBvbmUgd2hlcmUgYSBzdWJkaXJlY3RvcnkgaXMgc3VwcG9ydGVkIHRvIG9uZSB3aGVyZSBpdAotIyBpcyBub3QuCi1pZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke2NvbmZpZ2RpcnN9IiBdOyB0aGVuCi0gIGZvciBpIGluIGBlY2hvICR7Y29uZmlnZGlyc30gfCBzZWQgLWUgcy90YXJnZXQtLy9nYCA7IGRvCi0gICAgcm0gLWYgJGkvTWFrZWZpbGUKLSAgZG9uZQotZmkKLWlmIFsgLXogIiR7bm9yZWN1cnNpb259IiBdICYmIFsgLW4gIiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IiBdOyB0aGVuCi0gIGZvciBpIGluIGBlY2hvICR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHwgc2VkIC1lIHMvdGFyZ2V0LS8vZ2AgOyBkbwotICAgIHJtIC1mICR7dGFyZ2V0X3N1YmRpcn0vJGkvTWFrZWZpbGUKLSAgZG9uZQotZmkKLQotIyBQcm9kdWNlIGEgd2FybmluZyBtZXNzYWdlIGZvciB0aGUgc3ViZGlycyB3ZSBjYW4ndCBjb25maWd1cmUuCi0jIFRoaXMgaXNuJ3QgZXNwZWNpYWxseSBpbnRlcmVzdGluZyBpbiB0aGUgQ3lnbnVzIHRyZWUsIGJ1dCBpbiB0aGUgaW5kaXZpZHVhbAotIyBGU0YgcmVsZWFzZXMsIGl0J3MgaW1wb3J0YW50IHRvIGxldCBwZW9wbGUga25vdyB3aGVuIHRoZWlyIG1hY2hpbmUgaXNuJ3QKLSMgc3VwcG9ydGVkIGJ5IHRoZSBvbmUgb3IgdHdvIHByb2dyYW1zIGluIGEgcGFja2FnZS4KLQotaWYgWyAtbiAiJHtub3RzdXBwfSIgXSAmJiBbIC16ICIke25vcmVjdXJzaW9ufSIgXTsgdGhlbgotICAjIElmICRhcHBkaXJzIGlzIG5vbi1lbXB0eSwgYXQgbGVhc3Qgb25lIG9mIHRob3NlIGRpcmVjdG9yaWVzIG11c3Qgc3RpbGwKLSAgIyBiZSBjb25maWd1cmVkLCBvciB3ZSBlcnJvciBvdXQuICAoRS5nLiwgaWYgdGhlIGdhcyByZWxlYXNlIHN1cHBvcnRzIGEKLSAgIyBzcGVjaWZpZWQgdGFyZ2V0IGluIHNvbWUgc3ViZGlycyBidXQgbm90IHRoZSBnYXMgc3ViZGlyLCB3ZSBzaG91bGRuJ3QKLSAgIyBwcmV0ZW5kIHRoYXQgYWxsIGlzIHdlbGwuKQotICBpZiBbIC1uICIkYXBwZGlycyIgXTsgdGhlbgotICAgIGZvciBkaXIgaW4gJGFwcGRpcnMgOyBkbwotICAgICAgaWYgWyAtciAkZGlyL01ha2VmaWxlLmluIF07IHRoZW4KLQlpZiBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgYXBwZGlycz0iIgotCSAgYnJlYWsKLQlmaQotCWlmIGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgYXBwZGlycz0iIgotCSAgYnJlYWsKLQlmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgaWYgWyAtbiAiJGFwcGRpcnMiIF07IHRoZW4KLSAgICAgIGVjaG8gIioqKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBhY2thZ2UuIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotICBmaQotICAjIE9rYXksIHNvbWUgYXBwbGljYXRpb24gd2lsbCBidWlsZCwgb3Igd2UgZG9uJ3QgY2FyZSB0byBjaGVjay4gIFN0aWxsCi0gICMgbm90aWZ5IG9mIHN1YmRpcnMgbm90IGdldHRpbmcgYnVpbHQuCi0gIGVjaG8gIioqKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZm9sbG93aW5nIHN1YmRpcmVjdG9yaWVzOiIgMT4mMgotICBlY2hvICIgICAgJHtub3RzdXBwfSIgMT4mMgotICBlY2hvICIgICAgKEFueSBvdGhlciBkaXJlY3RvcmllcyBzaG91bGQgc3RpbGwgd29yayBmaW5lLikiIDE+JjIKLWZpCi0KLSMgU2V0IHdpdGhfZ251X2FzIGFuZCB3aXRoX2dudV9sZCBhcyBhcHByb3ByaWF0ZS4KLSMKLSMgVGhpcyBpcyBkb25lIGJ5IGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkKLSMgaXMgYXZhaWxhYmxlLCBhbmQgYnkgY2hlY2tpbmcgd2hldGhlciBvciBub3Qgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMKLSMgaGF2ZSByZXF1ZXN0ZWQgdGhhdCB0aGlzIG1hZ2ljIG5vdCBoYXBwZW4uCi0jIAotIyBUaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYWx3YXlzIG92ZXJyaWRlIHRoZSBleHBsaWNpdCBzZXR0aW5ncyBpbiAKLSMgY29uZmlndXJlLmluLCBhbmQgdGhlIHNldHRpbmdzIGluIGNvbmZpZ3VyZS5pbiBvdmVycmlkZSB0aGlzIG1hZ2ljLgotIwotIyBJZiB0aGUgZGVmYXVsdCBmb3IgYSB0b29sY2hhaW4gaXMgdG8gdXNlIEdOVSBhcyBhbmQgbGQsIGFuZCB5b3UgZG9uJ3QgCi0jIHdhbnQgdG8gZG8gdGhhdCwgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgLS13aXRob3V0LWdudS1hcyBhbmQKLSMgLS13aXRob3V0LWdudS1sZCBvcHRpb25zIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdC4KLQotaWYgWyB4JHt1c2VfZ251X2FzfSA9IHggXSA7IHRoZW4KLSAgaWYgWyB4JHt3aXRoX2dudV9hc30gIT0geG5vIF0gJiYgZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2dhc2Rpcn0gIiA+IC9kZXYvbnVsbCAyPiYxICYmIFsgLWQgJHtzcmNkaXJ9LyR7Z2FzZGlyfSBdIDsgdGhlbgotICAgIHdpdGhfZ251X2FzPXllcwotICAgIHdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLWdudS1hcyIKLSAgZmkKLWZpCi0KLWlmIFsgeCR7dXNlX2dudV9sZH0gPSB4IF0gOyB0aGVuCi0gIGlmIFsgeCR7d2l0aF9nbnVfbGR9ICE9IHhubyBdICYmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgbGQgIiA+IC9kZXYvbnVsbCAyPiYxICYmIFsgLWQgJHtzcmNkaXJ9L2xkIF0gOyB0aGVuCi0gICAgd2l0aF9nbnVfbGQ9eWVzCi0gICAgd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAtLXdpdGgtZ251LWxkIgotICBmaQotZmkKLQotIyBJZiB1c2luZyBuZXdsaWIsIGFkZCAtLXdpdGgtbmV3bGliIHRvIHRoZSB3aXRob3B0aW9ucyBzbyB0aGF0IGdjYy9jb25maWd1cmUKLSMgY2FuIGRldGVjdCB0aGlzIGNhc2UuCi0KLWlmIFsgeCR7d2l0aF9uZXdsaWJ9ICE9IHhubyBdICYmIGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgZ3JlcCAiIHRhcmdldC1uZXdsaWIgIiA+IC9kZXYvbnVsbCAyPiYxICYmIFsgLWQgJHtzcmNkaXJ9L25ld2xpYiBdIDsgdGhlbgotICB3aXRoX25ld2xpYj15ZXMKLSAgd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAtLXdpdGgtbmV3bGliIgotZmkKLQotaWYgWyB4JHtzaGFyZWR9ID0geHllcyBdOyB0aGVuCi0gIGNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgICBocHBhKikKLSAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtcGFwaWMiCi0gICAgICA7OwotICAgIGlbMzQ1Nl04Ni0qKQotICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC14ODZwaWMiCi0gICAgICA7OwotICAgIHBvd2VycGMqLSopCi0gICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXBwY3BpYyIKLSAgICAgIDs7Ci0gICAgYWxwaGEqLSotbGludXgqKQotICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1lbGZhbHBoYXBpYyIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgLWYgJHtzcmNkaXJ9L2NvbmZpZy9tdC0ke3RhcmdldF9jcHV9cGljOyB0aGVuCi0gICAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtJHt0YXJnZXRfY3B1fXBpYyIKLSAgICAgIGZpCi0gICAgICA7OwotICBlc2FjCi1maQotCi1ybSAtZiBtdC1mcmFnCi1pZiBbIC1uICIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgXSA7IHRoZW4KLSAgZm9yIGYgaW4gJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30KLSAgZG8KLSAgICBjYXQgJHtzcmNkaXJ9LyRmID4+IG10LWZyYWcKLSAgZG9uZQotICB0YXJnZXRfbWFrZWZpbGVfZnJhZz1tdC1mcmFnCi1maQotCi0jIHBvc3QtdGFyZ2V0OgotCi0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBjb21waWxlciBpcyBhYmxlIHRvIGdlbmVyYXRlIGFuIGV4ZWN1dGFibGUuICBJZiBpdAotIyBjYW4ndCwgd2UgYXJlIHByb2JhYmx5IGluIHRyb3VibGUuICBXZSBkb24ndCBjYXJlIHdoZXRoZXIgd2UgY2FuIHJ1biB0aGUKLSMgZXhlY3V0YWJsZS0td2UgbWlnaHQgYmUgdXNpbmcgYSBjcm9zcyBjb21waWxlci0td2Ugb25seSBjYXJlIHdoZXRoZXIgaXQKLSMgY2FuIGJlIGNyZWF0ZWQuICBBdCB0aGlzIHBvaW50IHRoZSBtYWluIGNvbmZpZ3VyZSBzY3JpcHQgaGFzIHNldCBDQy4KLWVjaG8gImludCBtYWluICgpIHsgcmV0dXJuIDA7IH0iID4gY29uZnRlc3QuYwotJHtDQ30gLW8gY29uZnRlc3QgJHtDRkxBR1N9ICR7Q1BQRkxBR1N9ICR7TERGTEFHU30gY29uZnRlc3QuYwotaWYgWyAkPyA9IDAgXSAmJiBbIC1zIGNvbmZ0ZXN0IC1vIC1zIGNvbmZ0ZXN0LmV4ZSBdOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAxPiYyICIqKiogVGhlIGNvbW1hbmQgJyR7Q0N9IC1vIGNvbmZ0ZXN0ICR7Q0ZMQUdTfSAke0NQUEZMQUdTfSAke0xERkxBR1N9IGNvbmZ0ZXN0LmMnIGZhaWxlZC4iCi0gIGVjaG8gMT4mMiAiKioqIFlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0MgdG8gYSB3b3JraW5nIGNvbXBpbGVyLiIKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGV4aXQgMQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi0jIFRoZSBTb2xhcmlzIC91c3IvdWNiL2NjIGNvbXBpbGVyIGRvZXMgbm90IGFwcGVhciB0byB3b3JrLgotY2FzZSAiJHtob3N0fSIgaW4KLSAgc3BhcmMtc3VuLXNvbGFyaXMyKikKLSAgICAgIENDQkFTRT0iYGVjaG8gJHtDQy1jY30gfCBzZWQgJ3MvIC4qJC8vJ2AiCi0gICAgICBpZiBbICJgL3Vzci9iaW4vd2hpY2ggJENDQkFTRWAiID0gIi91c3IvdWNiL2NjIiBdIDsgdGhlbgotICAgICAgICAgIGNvdWxkX3VzZT0KLSAgICAgICAgICBbIC1kIC9vcHQvU1VOV3Nwcm8vYmluIF0gJiYgY291bGRfdXNlPSIvb3B0L1NVTldzcHJvL2JpbiIKLSAgICAgICAgICBpZiBbIC1kIC9vcHQvY3lnbnVzL2JpbiBdIDsgdGhlbgotICAgICAgICAgICAgICBpZiBbICIkY291bGRfdXNlIiA9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICBjb3VsZF91c2U9Ii9vcHQvY3lnbnVzL2JpbiIKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgY291bGRfdXNlPSIkY291bGRfdXNlIG9yIC9vcHQvY3lnbnVzL2JpbiIKLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICBmaQotICAgICAgICBpZiBbICIkY291bGRfdXNlIiA9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICBlY2hvICJXYXJuaW5nOiBjb21waWxhdGlvbiBtYXkgZmFpbCBiZWNhdXNlIHlvdSdyZSB1c2luZyIKLSAgICAgICAgICAgIGVjaG8gIi91c3IvdWNiL2NjLiAgWW91IHNob3VsZCBjaGFuZ2UgeW91ciBQQVRIIG9yIENDICIKLSAgICAgICAgICAgIGVjaG8gInZhcmlhYmxlIGFuZCByZXJ1biBjb25maWd1cmUuIgotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlY2hvICJXYXJuaW5nOiBjb21waWxhdGlvbiBtYXkgZmFpbCBiZWNhdXNlIHlvdSdyZSB1c2luZyIKLSAgICAgICAgICAgIGVjaG8gIi91c3IvdWNiL2NjLCB3aGVuIHlvdSBzaG91bGQgdXNlIHRoZSBDIGNvbXBpbGVyIGZyb20iCi0gICAgICAgICAgICBlY2hvICIkY291bGRfdXNlLiAgWW91IHNob3VsZCBjaGFuZ2UgeW91ciIKLSAgICAgICAgICAgIGVjaG8gIlBBVEggb3IgQ0MgdmFyaWFibGUgYW5kIHJlcnVuIGNvbmZpZ3VyZS4iCi0gICAgICAgIGZpCi0gICAgICBmaQotICA7OwotZXNhYwotCi0jIElmIC0tZW5hYmxlLXNoYXJlZCB3YXMgc2V0LCB3ZSBtdXN0IHNldCBMRF9MSUJSQVJZX1BBVEggc28gdGhhdCB0aGUKLSMgYmludXRpbHMgdG9vbHMgd2lsbCBmaW5kIGxpYmJmZC5zby4KLWlmIFsgIiR7c2hhcmVkfSIgPSAieWVzIiBdOyB0aGVuCi0gIHNlZCAtZSAncy9eU0VUX0xJQl9QQVRIWyAJXSo9LiokL1NFVF9MSUJfUEFUSCA9ICQoUkVBTExZX1NFVF9MSUJfUEFUSCkvJyBcCi0gICAgICBNYWtlZmlsZSA+IE1ha2VmaWxlLnRlbQotICBybSAtZiBNYWtlZmlsZQotICBtdiAtZiBNYWtlZmlsZS50ZW0gTWFrZWZpbGUKLQotICBjYXNlICIke2hvc3R9IiBpbgotICAqLSotaHB1eCopCi0gICAgc2VkIC1lICdzL15SUEFUSF9FTlZWQVJbIAldKj0uKiQvUlBBVEhfRU5WVkFSID0gU0hMSUJfUEFUSC8nIFwKLQlNYWtlZmlsZSA+IE1ha2VmaWxlLnRlbQotICAgIHJtIC1mIE1ha2VmaWxlCi0gICAgbXYgLWYgTWFrZWZpbGUudGVtIE1ha2VmaWxlCi0gICAgOzsKLSAgZXNhYwotZmkKLQotIyBSZWNvcmQgdGFyZ2V0X2NvbmZpZ2RpcnMgYW5kIHRoZSBjb25maWd1cmUgYXJndW1lbnRzIGluIE1ha2VmaWxlLgotdGFyZ2V0X2NvbmZpZ2RpcnM9YGVjaG8gIiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IiB8IHNlZCAtZSAncy90YXJnZXQtLy9nJ2AKLXRhcmdhcmdzPWBlY2hvICIke2FyZ3VtZW50c30iIHwgXAotCXNlZCAtZSAncy8tLW5vW14gCV0qLy8nIFwKLQkgICAgLWUgJ3MvLS1jYWNoZVthLXotXSo9W14gCV0qLy8nIFwKLQkgICAgLWUgJ3MvLS1ob1thLXotXSo9W14gCV0qLy8nIFwKLQkgICAgLWUgJ3MvLS1idVthLXotXSo9W14gCV0qLy8nIFwKLQkgICAgLWUgJ3MvLS10YVthLXotXSo9W14gCV0qLy8nYAotCi0jIFBhc3NpbmcgYSAtLXdpdGgtY3Jvc3MtaG9zdCBhcmd1bWVudCBsZXRzIHRoZSB0YXJnZXQgbGlicmFyaWVzIGtub3cKLSMgd2hldGhlciB0aGV5IGFyZSBiZWluZyBidWlsdCB3aXRoIGEgY3Jvc3MtY29tcGlsZXIgb3IgYmVpbmcgYnVpbHQKLSMgbmF0aXZlLiAgSG93ZXZlciwgaXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBvdGhlciBtZWNoYW5pc21zIHRvIG1ha2UgdGhlCi0jIHNvcnRzIG9mIGRlY2lzaW9ucyB0aGV5IHdhbnQgdG8gbWFrZSBvbiB0aGlzIGJhc2lzLiAgUGxlYXNlIGNvbnNpZGVyCi0jIHRoaXMgb3B0aW9uIHRvIGJlIGRlcHJlY2F0ZWQuICBGSVhNRS4KLWlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ID0geHllcyBdOyB0aGVuCi0gIHRhcmdhcmdzPSItLXdpdGgtY3Jvc3MtaG9zdD0ke2hvc3RfYWxpYXN9ICR7dGFyZ2FyZ3N9IgotZmkKLQotIyBEZWZhdWx0IHRvIC0tZW5hYmxlLW11bHRpbGliLgotaWYgWyB4JHtlbmFibGVfbXVsdGlsaWJ9ID0geCBdOyB0aGVuCi0gIHRhcmdhcmdzPSItLWVuYWJsZS1tdWx0aWxpYiAke3RhcmdhcmdzfSIKLWZpCi0KLSMgUGFzcyAtLXdpdGgtbmV3bGliIGlmIGFwcHJvcHJpYXRlLiAgTm90ZSB0aGF0IHRhcmdldF9jb25maWdkaXJzIGhhcwotIyBjaGFuZ2VkIGZyb20gdGhlIGVhcmxpZXIgc2V0dGluZyBvZiB3aXRoX25ld2xpYi4KLWlmIFsgeCR7d2l0aF9uZXdsaWJ9ICE9IHhubyBdICYmIGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgZ3JlcCAiIG5ld2xpYiAiID4gL2Rldi9udWxsIDI+JjEgJiYgWyAtZCAke3NyY2Rpcn0vbmV3bGliIF0gOyB0aGVuCi0gIHRhcmdhcmdzPSItLXdpdGgtbmV3bGliICR7dGFyZ2FyZ3N9IgotZmkKLQotIyBwcm92aWRlIGEgcHJvcGVyIGd4eF9pbmNsdWRlX2Rpci4KLSMgTm90ZSwgaWYgeW91IGNoYW5nZSB0aGUgZGVmYXVsdCwgbWFrZSBzdXJlIHRvIGZpeCBib3RoIGhlcmUgYW5kIGluCi0jIHRoZSBnY2MsIGxpYmlvLCBsaWJzdGRjKysgYW5kIGxpYmcrKyBzdWJkaXJlY3Rvcmllcy4KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ3h4LWluY2x1ZGUtZGlyIG9yIC0td2l0aG91dC1neHgtaW5jbHVkZS1kaXIgd2FzIGdpdmVuLgotZ3h4X2luY2x1ZGVfZGlyPQotaWYgdGVzdCAtbiAiJHt3aXRoX2d4eF9pbmNsdWRlX2Rpcn0iOyB0aGVuCi0gIGNhc2UgIiR7d2l0aF9neHhfaW5jbHVkZV9kaXJ9IiBpbgotICAgIHllcyApCi0gICAgICBlY2hvICJjb25maWd1cmUuaW46IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBnaXZlbiBmb3IgZysrIGluY2x1ZGUgZGlyZWN0b3J5IiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgbm8gKQotICAgICAgOzsKLSAgICAqICkKLSAgICAgIGd4eF9pbmNsdWRlX2Rpcj0ke3dpdGhfZ3h4X2luY2x1ZGVfZGlyfQotICAgICAgOzsKLSAgZXNhYwotZmkKLWlmIHRlc3QgeCR7Z3h4X2luY2x1ZGVfZGlyfSA9IHg7IHRoZW4KLSAgaWYgdGVzdCB4JHtlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnN9ID0geHllczsgdGhlbgotICAgIGd4eF9pbmNsdWRlX2Rpcj0nJHtsaWJzdWJkaXJ9L2luY2x1ZGUvZysrJwotICBlbHNlCi0gICAgLiAke3RvcHNyY2Rpcn0vY29uZmlnLmlmCi0gICAgZ3h4X2luY2x1ZGVfZGlyPScke3ByZWZpeH0vaW5jbHVkZS9nKysnLSR7bGlic3RkY3h4X2ludGVyZmFjZX0KLSAgZmkKLWVsc2UKLSAgZ3h4X2luY2x1ZGVfZGlyPSR7Z3h4X2luY2x1ZGVfZGlyfQotZmkKLQotdGFyZ2FyZ3M9Ii0taG9zdD0ke3RhcmdldF9hbGlhc30gLS1idWlsZD0ke2J1aWxkX2FsaWFzfSAke3RhcmdhcmdzfSIKLXNlZCAtZSAiczpeVEFSR0VUX0NPTkZJR0RJUlNbIAldKj0uKiQ6VEFSR0VUX0NPTkZJR0RJUlMgPSAke3RhcmdldF9jb25maWdkaXJzfToiIFwKLSAgICAtZSAicyVeQ09ORklHX0FSR1VNRU5UU1sgCV0qPS4qJCVDT05GSUdfQVJHVU1FTlRTID0gJHt0YXJnYXJnc30lIiBcCi0gICAgLWUgInMlXlRBUkdFVF9TVUJESVJbIAldKj0uKiQlVEFSR0VUX1NVQkRJUiA9ICR7dGFyZ2V0X3N1YmRpcn0lIiBcCi0gICAgLWUgInMlXmd4eF9pbmNsdWRlX2RpclsgCV0qPS4qJCVneHhfaW5jbHVkZV9kaXI9JHtneHhfaW5jbHVkZV9kaXJ9JSIgXAotICAgICAgIE1ha2VmaWxlID4gTWFrZWZpbGUudGVtCi1ybSAtZiBNYWtlZmlsZQotbXYgLWYgTWFrZWZpbGUudGVtIE1ha2VmaWxlCi0KLSMKLSMgTG9jYWwgVmFyaWFibGVzOgotIyBmaWxsLWNvbHVtbjogMTMxCi0jIEVuZDoKLSMKZGlmZiAtLWdpdCBhL2V0Yy9DaGFuZ2VMb2cgYi9ldGMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUzYTNlLi4wMDAwMDAwCi0tLSBhL2V0Yy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotMTk5OS0wNC0wMSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBhZGQtbG9nLmVsLCBhZGQtbG9nLnZpOiBOZXcgZmlsZXMuCi0KLVdlZCBKYW4gMjAgMDE6MzM6NTAgMTk5OSAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIGNvbXAtdG9vbHMtdmVyaWZ5OiBSZW1vdmUgc29tZSBjaGVja3MgdGhhdCBhcmUgbm8gbG9uZ2VyIHZhbGlkLgotCi0xOTk4LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB0YXJnZXRkb2MvZnIzMC50ZXhpOiBOZXcgZG9jdW1lbnQuCi0JCi1UaHUgT2N0ICAxIDIxOjE1OjU5IDE5OTggIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjb21wLXRvb2xzLWZpeCwgY3Jvc3MtdG9vbHMtZml4OiBSZXBsYWNlIC91c3IvaW5jbHVkZQotCXdpdGggJHtGSVhJTkNESVJ9LgotCi1UdWUgQXVnIDExIDE5OjIyOjExIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlICh2ZXJzaW9uKTogVXBkYXRlIGNhbGN1bGF0aW9uLgotCi1GcmkgSnVuIDEyIDIxOjM0OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRleGk6IFZhcmlvdXMgYWRkaXRpb25zLgotCSogTWFrZWZpbGUuaW4gKFRFWEkySFRNTCwgRFZJUFMpOiBOZXcgdmFyaWFibGVzLgotCShzdGFuZGFyZHMucHMpOiBOZXcgdGFyZ2V0LgotCShjb25maWd1cmUuZHZpKTogQ29weSAudGluIGZpbGVzIGluIGFzIHdlbGwuCi0JKGNvbmZpZ3VyZS5wcywgY29uZmlndXJlLmh0bWwpOiBOZXcgdGFyZ2V0cy4KLQkoY2xlYW4pOiBSZW1vdmUgY29uZmlnZGV2LmpwZyBhbmQgY29uZmlnYnVpbGQuanBnLgotCSogY29uZmlnZGV2LmZpZzogTmV3IGZpbGUuCi0JKiBjb25maWdkZXYuZWluOiBOZXcgZmlsZSAoRVBTIHZlcnNpb24gb2YgY29uZmlnZGV2LmZpZykuCi0JKiBjb25maWdkZXYuamluOiBOZXcgZmlsZSAoSlBFRyB2ZXJzaW9uIG9mIGNvbmZpZ2Rldi5maWcpLgotCSogY29uZmlnYnVpbGQuZmlnOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ2J1aWxkLmVpbjogTmV3IGZpbGUgKEVQUyB2ZXJzaW9uIG9mIGNvbmZpZ2J1aWxkLmZpZykuCi0JKiBjb25maWdidWlsZC5qaW46IE5ldyBmaWxlIChKUEVHIHZlcnNpb24gb2YgY29uZmlnYnVpbGQuZmlnKS4KLQotV2VkIEp1biAxMCAxNDo0MToyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ2Rldi50aW46IE5ldyBmaWxlLgotCSogY29uZmlnYnVpbGQudGluOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChNQUtFSU5GTyk6IFVzZSBtYWtlaW5mbyBmcm9tIHRleGluZm8gZGlyZWN0b3J5IGlmCi0JaXQgZXhpc3RzLgotCShURVhJMkRWSSk6IExpa2V3aXNlIGZvciB0ZXhpMmR2aS4KLQkoSU5GT0ZJTEVTKTogQWRkIGNvbmZpZ3VyZS5pbmZvLgotCShEVklGSUxFUyk6IEFkZCBjb25maWd1cmUuZHZpLgotCShpbmZvKTogT25seSBidWlsZCBpbmZvIGZpbGVzIGlmIHRoZSBzb3VyY2UgZmlsZXMgZXhpc3QuCi0JKGluc3RhbGwtaW5mbyk6IE9ubHkgaW5zdGFsbCBpbmZvIGZpbGVzIGlmIHRoZXkgZXhpc3QuCi0JKGR2aSk6IE9ubHkgYnVpbGQgRFZJIGZpbGVzIGlmIHRoZSBzb3VyY2VzIGZpbGVzIGV4aXN0LgotCShjb25maWd1cmUuaW5mbyk6IE5ldyB0YXJnZXQuCi0JKGNvbmZpZ3VyZS5kdmkpOiBOZXcgdGFyZ2V0LgotCShjbGVhbik6IFJlbW92ZSBjb25maWdkZXYgYW5kIGNvbmZpZ2J1aWxkIGRlcml2ZWQgZmlsZXMuCi0KLQlSZW1vdmUgb2Jzb2xldGUgZG9jdW1lbnRhdGlvbi4KLQkqIGludHJvLnRleGk6IFJlbW92ZS4KLQkqIGluc3RhbGwudGV4aTogUmVtb3ZlLgotCSogY29uZmlnLW5hbWVzLnRleGk6IFJlbW92ZS4KLQkqIHNjcmVlbjEuZXBzOiBSZW1vdmUuCi0JKiBzY3JlZW4xLm9iajogUmVtb3ZlLgotCSogc2NyZWVuMi5lcHM6IFJlbW92ZS4KLQkqIHNjcmVlbjIub2JqOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIGFib3ZlLgotCi1UaHUgTWF5IDIxIDE0OjM0OjUxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldGRvYy9hcm0taW50ZXJ3b3JrLnRleGk6IEFkZCBub3RlIGFib3V0IGlnbm9yaW5nIGxpbmtlcgotCXdhcm5pbmcgbWVzc2FnZSB3aGVuIHVzaW5nIC0tc3VwcG9ydC1vbGQtY29kZS4KLQotTW9uIE1heSAxOCAxNDoyNzozNyAxOTk4ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbiwgY29tcC10b29scy1maXgsIGNvbXAtdG9vbHMtdmVyaWZ5LCBjcm9zcy10b29scy1maXg6Ci0JVXNlICRHQ0N2biByYXRoZXIgdGhhbiBzdWJzdGl0dXRlIGV2ZXJ5d2hlcmUuCi0KLVRodSBNYXkgMTQgMTQ6NDM6MTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0ZG9jL2FybS1pbnRlcndvcmsudGV4aTogRG9jdW1lbnQgZGxsdG9vbCBzdXBwb3J0IG9mCi0JaW50ZXJ3b3JraW5nLiAKLQotVGh1IE1heSAgNyAxNjo0OTozOCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gVENMX0xJQlJBUlksIFRLX0xJQlJBUlksCi0JYW5kIEdEQlRLX0ZJTEVOQU1FLgotCi1XZWQgQXByICAxIDE3OjExOjQ0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldGRvYy9hcm0taW50ZXJ3b3JrLnRleGk6IERvY3VtZW50IEFSTS90aHVtYiBpbnRlcndvcmtpbmcuIAotCi1UdWUgTWFyIDMxIDE1OjI4OjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhbmRhcmRzLnRleGksIG1ha2Utc3Rkcy50ZXhpOiBVcGRhdGUgdG8gY3VycmVudCBGU0YgdmVyc2lvbnMuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbmRhcmRzLmluZm8pOiBEZXBlbmQgdXBvbiBtYWtlLXN0ZC50ZXhpLgotCi1UdWUgTWFyIDI0IDE2OjEzOjI2IDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJodW5hLmN5Z251cy5jby51az4KLQotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuMTIuMSB0byBmaXggc2hlbGwgaXNzdWVzCi0JZm9yIE5UIG5hdGl2ZSBidWlsZHMuIAotCi1Nb24gTWFyICA5IDE2OjQxOjA0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlIChiaW5wcm9ncyk6IEFkZCBvYmpjb3B5LgotCi1UdWUgRmViIDI0IDE4OjExOjU4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlOiBhcy5uZXcgLT4gYXMtbmV3LCBsZC5uZXcgLT4gbGQtbmV3Ci0Jbm0ubmV3IC0+IG5tLW5ldy4gIE1ha2Ugc3ltbGlua3MgdG8gY3J0Ki5vLgotCi1GcmkgTm92IDIxIDEyOjU0OjU4IDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIC0tbm8tc3BsaXQgYXJndW1lbnQgdG8gYXZvaWQgY3JlYXRpbmcgZmlsZXMKLQl3aXRoIG5hbWVzIGxvbmdlciB0aGFuIDE0IGNoYXJhY3RlcnMuCi0KLVRodSBTZXAgMjUgMTM6MTM6MTEgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBlcm4uY3lnbnVzLmNvbSkKLQotCSogaW50cm8udGV4aTogQWRkIGNsb3NpbmcgaWZzZXQuCi0KLU1vbiBTZXAgIDEgMTA6MzE6MzIgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IE1vdmUgc2V0dGluZyBIT1NUIGFuZCBUQVJHRVQgdG8gdGhlIGJlZ2lubmluZwotCW9mIHRoZSBmaWxlIGZvciBlZGl0aW5nIGNvbnZlbmllbmNlLgotCi1Nb24gU2VwICAxIDEwOjI4OjM3IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluLjogTW9yZSBmcmllbmRseSBvcHRpb25zL21lc3NhZ2VzIHdoZW4gZXh0cmFjdGluZwotCWZyb20gYSBmaWxlIGluc3RlYWQgb2YgYSB0YXBlIGRldmljZS4KLQotVHVlIEp1biAxNyAxNTo1MDoyMyAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogQWRkIC91c3IvYnNkIHRvIFBBVEggZm9yIElyaXggKGhvbWUgb2YgY29tcHJlc3MpCi0KLVRodSBKdW4gMTIgMTM6NDc6MDAgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluIChzaG93X2V4ZWNfcHJlZml4X21zZyk6IGZpeCBxdW90aW5nCi0KLVdlZCBKdW4gIDQgMTU6MzE6NDMgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogcmVidWlsZGluZy50ZXhpOiBSZW1vdmVkLgotCi1TYXQgTWF5IDI0IDE4OjAyOjIwIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjcm9zcy10b29scy1maXg6ICBSZW1vdmUgaG9zdCBjaGVjayBzaW5jZSBpdCBkb2Vzbid0IG1hdHRlcgotCWZvciB0aGlzIGNhc2UuCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiBjbGVhbiB1cCBtb3JlIHVudXNlZCBob3N0cy4KLQkqIEluc3RhbGwuaW4sIGNyb3NzLXRvb2xzLWZpeCwgY29tcC10b29scy1maXgsIGNvbXAtdG9vbHMtdmVyaWZ5OgotCUhhY2sgZm9yIGhvc3QgY2hlY2sgdG8gbm90IHdhcm4gdGhlIHVzZXIgZm9yIGNlcnRhaW4gY2FzZXMuCi0KLUZyaSBNYXkgMjMgMjM6NDY6MTAgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6IFJlbW92ZSBhIGxvdCBvZiB1bnVzZWQgY29kZQotCSogSW5zdGFsbC5pbjogUmVtb3ZlIHJlZmVyZW5jZSB0byBUQVBFZGZsdCwgdXNlIHZhcmlhYmxlcyBpbnN0ZWFkIG9mCi0Jc3RyaW5nIHN1YnN0aXR1dGlvbiB3aGVuIGFibGUuCi0KLUZyaSBBcHIgMTEgMTc6MjU6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBmaWxlIG5hbWVkIGluIEFDX0lOSVQgdG8gTWFrZWZpbGUuaW4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgMTEgMTg6MTI6NDIgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogQmFjayBvdXQgY2hhbmdlIHRvIElOU1RBTExIT1NUIHRvCi0JY2FsbCBhbGwgSVJJWCBzeXN0ZW1zICJtaXBzLXNnaS1pcml4NCIKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIGNvbmZpZ3VyZS50ZXhpIGFuZCBjZmctcGFwZXIudGV4aS4KLQotVGh1IEFwciAxMCAyMzoyNjo0NSAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBzcmN0cmVlLnRleGksIGVtYWNzLXJlbG5vdGVzLnRleGksIGNmZy1wYXBlci50ZXhpOiBSZW1vdmUuCi0JKiBJbnN0YWxsLmluOiBSZW1vdmUgVWx0cml4LXNwZWNpZmljIGhhY2tzLgotCVVwZGF0ZSBDeWdudXMgcGhvbmUgbnVtYmVycy4KLQkoZ3Vlc3Nfc3lzdGVtKTogUmVtb3ZlIHNvbWUgb2xkIHN5c3RlbXMgKFVsdHJpeCwgT1NGMSB2MSAmIDIsCi0JbTY4ay1IUFVYLCBtNjhrIFN1bk9TLCBldGMuKQotCShzaG93X2dudV9yb290X21zZyk6IFJlbW92ZS4KLQlSZW1vdmVkIGFsbCB0aGUgcmVtb3ZlIG9wdGlvbiBjb2RlLgotCi1UaHUgQXByIDEwIDIzOjIzOjMzIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIGNvbmZpZ3VyZS5tYW4sIGNvbmZpZ3VyZS50ZXhpOiBSZW1vdGUuCi0KLU1vbiBBcHIgIDcgMTg6MTU6MDAgMTk5NyAgQnJlbmRhbiBLZWhvZSA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0gICAgICAgICogRml4IHRoZSB2ZXJzaW9uIHN0cmluZyBmb3IgT1NGMSA0LjAgdG8gcmVjb2duaXplIGVpdGhlcgotICAgICAgICBWNC4qIG9yIFg0LioKLQotTW9uIEFwciAgNyAxNTozNDo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YW5kYXJkcy50ZXhpLCBtYWtlLXN0ZHMudGV4aTogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb25zLgotCi1UdWUgTm92IDE5IDE1OjM2OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlOiBOZXcgZmlsZS4KLQotV2VkIE9jdCAyMyAwMDozNDowNyAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogTG90cyBvZiBwYXRjaGVzIGZyb20gcHJvZ3Jlc3NpdmUuLi4KLSAJKiBJbnN0YWxsLmluOiByZXN0b3JlIERET1BUUyBmb3IgQUlYIDQueAotIAkqIEluc3RhbGwuaW4sIHN1YnN0LXN0cmluZ3M6IGFkZCBjYXNlIGZvciBERyBBdmlpb24KLSAJKiBzdWJzdC1zdHJpbmdzOiBmaXggdHlwbyBpbiBJTlNUQUxMZGlyIHZhciBzZXR0aW5nCi0gCSogY29tcC10b29scy12ZXJpZnk6IHNldCBTSExJQl9QQVRIIGZvciBzaGFyZWQgbGlicwotIAkqIEluc3RhbGwuaW4sIHN1YnN0LXN0cmluZ3M6ICBhZGQgY2FzZSBmb3Igc29sYXJpczIuNQotIAkqIEluc3RhbGwuaW46IGZpeCByZWdyZXNzaW9uIGZvciBocHBhMS4xIGNoZWNrCi0gCSogY29tcC10b29scy1maXg6IHNldCBMRF9MSUJSQVJZX1BBVEgKLSAJKiBjb21wLXRvb2xzLWZpeDogSWYgZml4aW5jbHVkZXMgZml4ZXMgL3Vzci9pbmNsdWRlL2xpbWl0cy5oLAotIAlpbnN0YWxsIGl0IGFzIHN5c2xpbWl0cy5oLgotCi1XZWQgT2N0IDE2IDE5OjIwOjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogVHJlYXQgcG93ZXJwYy1pYm0tYWl4NC4xIHRoZSBzYW1lIGFzCi0JcnM2MDAwLWlibS1haXg0LjEsIHNpbmNlIHRoZSBjb21waWxlciBub3cgdXNlcyBjb21tb24gbW9kZSBieQotCWRlZmF1bHQuCi0KLVdlZCBPY3QgIDIgMTU6Mzk6MDcgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogY29uZmlndXJlLmluIChBQ19QUk9HX0lOU1RBTEwpOiBBZGRlZC4KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi1XZWQgT2N0ICAyIDE0OjMzOjU4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3dpdGNoIHRvIGF1dG9jb25mIGNvbmZpZ3VyZS5pbi4KLQkqIGNvbmZpZ3VyZTogTmV3LgotCSogTWFrZWZpbGUuaW46IFVzZSBhdXRvY29uZi1zdWJzdGl0dXRlZCB2YWx1ZXMuCi0KLVR1ZSBKdW4gMjUgMTg6NTY6MDggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBDaGFuZ2VkIHRvICQocHJlZml4KS9zaGFyZS4KLQotRnJpIE1hciAyOSAxMTozODowMSAxOTk2ICBKLlQuIENvbmtsaW4gIChqdGNAbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUubWFuOiBDaGFuZ2VkIHRvIGJlIHJlY29nbml6ZWQgYnkgY2F0bWFuIC13IG9uIFNvbGFyaXMuCi0KLVdlZCBEZWMgIDYgMTU6NDA6MjggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tcC10b29scy1maXggKGZpeGluY2x1ZGVzKTogRGVmaW5lIEZJWFBST1RPX0RFRklORVMgZnJvbQotCS4uLi9pbnN0YWxsLXRvb2xzL2ZpeHByb3RvLWRlZmluZXMuCi0KLVN1biBOb3YgMTIgMTk6MzE6MjcgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbXAtdG9vbHMtdmVyaWZ5ICh2ZXJpZnlfY3h4X2luaXRpYWxpemVycyk6IGRlbGV0ZSBhcmd2LAotCWFyZ2MgZGVjbGFyYXRpb25zLCBhZGQgLXN0YXRpYyB0byBjb21waWxlIGxpbmUuCi0JKHZlcmlmeV9jeHhfaGVsbG9fd29ybGQpOiBkZWxldGUgYXJndiwgYXJnYyBkZWNsYXJhdGlvbnMsIGFkZAotCS1zdGF0aWMgdG8gY29tcGlsZSBsaW5lLgotCi1XZWQgU2VwIDIwIDEzOjIxOjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgotCXJlYWxjbGVhbi4KLQotTW9uIEF1ZyAyOCAxNzoyNTo0OSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbiAoUEFUSCk6ICBhZGQgL3Vzci91Y2IgdG8gJFBBVEggKGZvciBTdW5PUyA0LjEueCkuCi0KLVR1ZSBBdWcgMTUgMjE6NTE6NTggMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IE1hdGNoIE9TRi8xIHYzLnggYXMgdGhlIHNhbWUgYXMgCi0gICAgICAgIHYyLngtLXYyLnggYmluYXJpZXMgYXJlIHVwd2FyZCBjb21wYXRpYmxlLgotCi1UdWUgQXVnIDE1IDIxOjQ2OjU0IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiByZWNvZ25pemUgSFAgOTAwMC84MDAgc3lzdGVtcyBhcyB0aGUKLQlzYW1lIGFzIEhQIDkwMDAvNzAwIHN5c3RlbXMuCi0KLVR1ZSBBdWcgIDggMTM6MTE6NTYgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBJbnN0YWxsLmluOiBGb3IgZW1hY3MsIHJ1biBzaG93X2VtYWNzX2FsdGVybmF0ZV9tc2cgYW5kIGV4aXQuCi0JKHNob3dfZW1hY3NfYWx0ZXJuYXRlX21zZyk6IE5ldyBtZXNzYWdlIHNheWluZyBob3cgZW1hY3MgY2FuJ3QgYmUKLQlpbnN0YWxsZWQgaW4gYW4gYWx0ZXJuYXRlIHByZWZpeC4KLQotVGh1IEp1biAgOCAwMDo0Mjo1NiAxOTk1ICBBbmdlbGEgTWFyaWUgVGhvbWFzICA8YW5nZWxhQGNpcmRhbi5jeWdudXMuY29tPgotCi0gICAgICAgICogc3Vic3Qtc3RyaW5nczogY2hhbmdlIGR1IGNvbW1hbmRzIHRvICRCSU5ESVIvLiAmICRTUkNESVIvLiBqdXN0Ci0gICAgICAgIGluIGNhc2UgdGhleSBhcmUgc3ltbGlua3MuCi0KLVR1ZSBBcHIgMTggMTQ6MjM6MTAgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjZGstZml4OiBFeHRyYWN0ZWQgdGFibGUgb2YgdGFyZ2V0cyB0aGF0IGRvbid0IG5lZWQgdGhlaXIKLQkgIGhlYWRlcnMgZml4ZWQgZnJvbSBnY2MncyBjb25maWd1cmUgc2NyaXB0LgotCi0JKiBjZGstZml4LCBjZGstdmVyaWZ5OiBVc2UgJHtIT1NUfSBpbnN0ZWFkIG9mIHx8SE9TVHN0cnx8Ci0KLQkqIGNkay1maXgsIGNkay12ZXJpZnk6IE5ldyBmaWxlcywgaW5zdGFsbCBzY3JpcHQgZnJhZ21lbnRzIHVzZWQKLQkgIGZvciBDeWdudXMgRGV2ZWxvcGVyJ3MgS2l0LgotCi0JKiBJbnN0YWxsLmluIChkb19ta2Rpcik6IE5ldyBmdW5jdGlvbi4KLQotCSogSW5zdGFsbC5pbjogQWRkZWQgc3VwcG9ydCBmb3IgLS13aXRoIGFuZCAtLXdpdGhvdXQgb3B0aW9ucy4KLQkgIENoYW5nZWQgc28gdGhhdCB0YXBlIGNvbW1hbmRzIGFyZSBub3QgcnVuIHdoZW4gZXh0cmFjdGluZyAKLQkgIGZyb20gYSBmaWxlLgotCSAgKGRvX210KTogQ2hhbmdlZCB0byB0YWtlIG9ubHkgb25lIGFyZ3VtZW50LgotCi1XZWQgTWFyIDI5IDExOjE2OjM4IDE5OTUgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IGNhdGNoIFVOQU1FPT1hbHBoYS1kZWMtb3NmMi54IGFuZCBjb3JyZWN0IGVudHJ5IGZvcgotCWFscGhhLWRlYy1vc2YxLngKLQkKLUZyaSBKYW4gMjcgMTI6MDQ6MjkgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzdWJzdC1zdHJpbmdzIChtaXBzLXNnaS1pcml4NSk6IE5ldyBlbnRyeSBpbiB0YWJsZS4KLQotVGh1IEphbiAxOSAxMjoxNTo0NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIEluc3RhbGwuaW46IE1ham9yIHJld3JpdGUsIGJ1bmRsZSBkZXBlbmRlbnQgY29kZSAoZm9yIGV4YW1wbGUsCi0JICBmaXhpbmNsdWRlcyBmb3IgY29tcC10b29scykgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBJbnN0YWxsCi0JICBzY3JpcHQgd2hlbiBpdCBpcyBnZW5lcmF0ZWQuCi0KLVR1ZSBKYW4gMTcgMTY6NTE6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBSZWJ1aWxkIHVzaW5nICQoU0hFTEwpLgotCi1UaHUgTm92ICAzIDE5OjMwOjMzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBEZXBlbmQgb24gaW5mby4KLQotRnJpIEF1ZyAxOSAxNjoxNjozOCAxOTk0ICBKYXNvbiBNb2xlbmRhICAgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogc2V0ICRGSVhfSEVBREVSIHNvIGZpeHByb3RvIGNhbiBmaW5kIGZpeC1oZWFkZXIuCi0KLUZyaSBNYXkgIDYgMTY6MTg6NTggMTk5NCAgSmFzb24gTW9sZW5kYSAgICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogYWRkIGEgc2VtaWNvbG9uIGluIHRoZSBpZiBzdGF0ZW1lbnQuCi0KLUZyaSBBcHIgMjkgMTY6NTY6MDcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjZmctcGFwZXIudGV4aTogVXBkYXRlIHNvbWUgb3V0ZGF0ZWQgaW5mb3JtYXRpb24uCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBQYXNzIGZpbGUsIG5vdCBkaXJlY3RvcnksIGFzIGxhc3QKLQlhcmcgdG8gSU5TVEFMTF9EQVRBLgotCSh1bmluc3RhbGwpOiBOZXcgdGFyZ2V0LgotCi1UaHUgQXByIDI4IDE0OjQyOjIyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IENvbW1lbnQgb3V0IEBzbWFsbGJvb2suCi0KLQkqIE1ha2VmaWxlLmluOiBEZWZpbmUgVEVYSTJEVkkgYW5kIFRFWElESVIsIGFuZCB1c2UgdGhlIGxhdHRlci4KLQlSZW1vdmUgaW5mbyBmaWxlcyBpbiByZWFsY2xlYW4sIG5vdCBjbGVhbiwgcGVyIGNvZGluZyBzdGFuZGFyZHMuCi0JUmVtb3ZlIFRlWCBvdXRwdXQgaW4gY2xlYW4uCi0KLVR1ZSBBcHIgMjYgMTc6MTg6MDMgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiAgZml4aW5jbHVkZXMgb3V0cHV0IGlzIGFjdHVhbGx5IHB1dCBpbiBmaXhpbmNsdWRlcy5sb2csCi0gICAgICAgIGJ1dCBlY2hvJ2VkIG1lc3NhZ2VzIGNsYWltIGl0IGlzIGZpeGluYy5sb2cuICBUaGlzIGlzIHRoZSBzYW1lCi0JbWVzc2FnZXMgYXMgSSBsb2dnZWQgaW4gTWFyY2ggNCAxOTk0LCBidXQgZm9yIHNvbWUgcmVhc29uIHdlIGZvdW5kCi0JdGhlIGNoYW5nZSBoYWRuJ3QgYmVlbiBkb25lLiAgSSdsbCBoYXZlIHRvIGRpZyB0aHJvdWdoIHRoZSBsb2dzCi0JYW5kIGZpbmQgb3V0IHdoYXQgSSByZWFsbHkgZGlkIGRvIHRoYXQgZGF5LiA6KQotCi1Nb24gQXByIDI1IDIwOjI4OjE5IDE5OTQgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46ICB1c2UgZXZhbCB0byBjYWxsIGRvX210KCkgZm9yIFVsdHJpeCBicm9rZW5uZXNzLgotCi1Nb24gQXByIDI1IDIwOjAwOjAwIDE5OTQgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4oZG9fbXQpOiBleGl0IHdpdGggZXJyb3Igc3RhdHVzIDEgaWYgIyBvZiBwYXJhbWV0ZXJzCi0JIT0gMy4KLQotTW9uIEFwciAyNSAxOTo0MjozNiAxOTk0ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiAgbG9zZSBUQVBFX0ZPUldBUkQgYW5kIFRBUEVfUkVXSU5ELCBhZGQgZG9fbXQoKQotCXRvIGRvIGFsbCB0YXBlIG1vdmVtZW50IG9wZXJhdGlvbnMuICBDdXJyZW50bHkgdW50ZXN0ZWQuICBBZGRyZXNzZXMKLQlQUiAjIDQ4ODYgZnJvbSBidWxsLgotCi0JKiBJbnN0YWxsLmluOiBhZGQgMTk5NCB0byB0aGUgY29weXJpZ2h0IHRoaW5nLgotCi1GcmkgQXByIDIyIDE5OjA1OjEzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IFVwZGF0ZSBmcm9tIEZTRi4KLQotRnJpIEFwciAyMiAxNTo0NjoxMCAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBBZGQgJERET1BUUywgaGFzIGBgYnM9MTI0YicnIGZvciBhbGwgc3lzdGVtcyBleGNlcHQKLQlBSVggKHNvbWUgdmVyc2lvbnMgb2YgQUlYIGRvbid0IHVuZGVyc3RhbmQgYnM9MTI0Yi4gIFNpbGx5IE9TKS4KLQotTW9uIEFwciAgNCAyMjo1NTowNSAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogbnVsbCBvdXQgJFRPT0xTIGJlZm9yZSBhZGRpbmcgc3R1ZmYgdG8gaXQKLQlub24tZGVzdHJ1Y3RpdmVseS4KLQotV2VkIE1hciAzMCAyMTo0NTozNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBGaXggdHlwby4KLQotCSogY29uZmlndXJlLnRleGksIGNvbmZpZ3VyZS5tYW46IERvY3VtZW50IC0tZGlzYWJsZS0uCi0KLU1vbiBNYXIgMjggMTM6MjI6MTUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogVXBkYXRlIGZyb20gRlNGLgotCi1TYXQgTWFyIDI2IDA5OjIxOjQ0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGksIG1ha2Utc3Rkcy50ZXhpOiBVcGRhdGUgZnJvbSBGU0YuCi0KLUZyaSBNYXIgMjUgMjI6NTk6NDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUudGV4aSwgY29uZmlndXJlLm1hbjogRG9jdW1lbnQgLS1lbmFibGUtKiBvcHRpb25zLgotCi1XZWQgTWFyIDIzIDIzOjM4OjI0IDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogc2V0IENQUCB0byBiZSBnY2MgLUUgZm9yIGZpeGluY2x1ZGVzLgotCi1XZWQgTWFyIDIzIDEzOjQyOjQ4IDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIEluc3RhbGwuaW46IHNldCBQQVRIIHRvICRQQVRIOi9iaW46L3Vzci9iaW4gc28gd2UgY2FuIHBpY2sKLSAgICAgICAgdXAgbmF0aXZlIHRvb2xzIGV2ZW4gaWYgdGhlIHVzZXIgZG9lc24ndCBoYXZlIHRoZW0gaW4gaGlzCi0gICAgICAgIHBhdGguCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiBgYGhwcGEtMS4xLWhwLWhwdXgnJyAtPiBgYGhwcGExLjEtaHAtaHB1eCcnLgotCi1UdWUgTWFyIDE1IDIyOjA5OjIwIDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLSAgICAgICAgCi0gICAgICAgICogSW5zdGFsbC5pbjogVEFQRV9SRVdJTkQgYW5kIFRBUEVfRk9SV0FSRCB2YXJpYWJsZXMgZm9yIFVuaXh1bmF3YXJlLAotICAgICAgICBhZGRlZCBzd2l0Y2ggc3RhdGVtZW50IHRvIGRldGVjdCBpZiBzeXN0ZW0gaXMgVW5peHVuYXdhcmUuCi0KLUZyaSBNYXIgIDQgMTI6MTA6MzAgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiAgZml4aW5jbHVkZXMgb3V0cHV0IGlzIGFjdHVhbGx5IHB1dCBpbiBmaXhpbmNsdWRlcy5sb2csCi0gICAgICAgIGJ1dCBlY2hvJ2VkIG1lc3NhZ2VzIGNsYWltIGl0IGlzIGZpeGluYy5sb2cuCi0KLVdlZCBOb3YgIDMgMDI6NTg6MDIgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6ICBvdXRwdXQgVEVYQlVORExFIGZvciBtb3JlIGluc3RhbGwgbm90ZXMgbWF0Y2hpbmcKLQkqIGluc3RhbGwtdGV4aS5pbjogIFBSTVMgaW5mbyBub3cgZXhpc3RzCi0KLVR1ZSBPY3QgMjYgMTY6NTc6MTIgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiBtYXRjaCBzb2xhcmlzKi4gIEFsc28sIGFkZCBkZWZhdWx0IGNhc2UgdG8gY2F0Y2gKLQkgIGFuZCBlcnJvciBvdXQgZm9yIHVucmVjb2duaXplZCBzeXN0ZW1zLgotCi1UaHUgQXVnIDE5IDE4OjIxOjMxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogaGFuZGxlIHRoZSBuZXcgZml4cHJvdG8gd29yawotCi1Nb24gSnVsIDE5IDEyOjA1OjQxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogcmVtb3ZlICJNVD10Y3RsIiBmb3IgQUlYIChub3QgbmVlZGVkLCBhbmQgYmFyZWx5Ci0Jd29ya2VkIGFueXdheSkKLQotTW9uIEp1biAxNCAxOTowOToyMiAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiBjaGFuZ2VkIEhPU1QgdG8gcmVjb2duaXplIFNvbGFyaXMgZm9yIGluc3RhbGwgbm90ZXMKLQotVGh1IEp1biAxMCAxNjowMToyNSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBkb3MtaW5zdC50ZXhpOiAgbmV3IGZpbGUuCi0KLVdlZCBKdW4gIDkgMTk6MjM6NTkgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAcnRsLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBpbnN0YWxsLXRleGkuaW46ICAgICAgICBhZGRlZCBjb25kaXRpb25hbHMgKG5lYXJseSBjb21wbGV0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbmVkIHVwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgc3VwcG9ydCBmb3Igb3RoZXIgcmVsZWFzZXMgKG5vdCBkb25lKQotCi1XZWQgSnVuICA5IDE1OjUzOjU4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogVXNlIElOU1RBTExfREFUQS4KLQkoe2Rpc3QscmVhbH1jbGVhbik6IEFsc28gZGVsZXRlIE1ha2VmaWxlIGFuZCBjb25maWcuc3RhdHVzLgotCi1GcmkgSnVuICA0IDE3OjA5OjU2IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6ICBhZGRlZCBkYXRhIGZvciBPU19TVFJJTkcKLQotCSogc3Vic3Qtc3RyaW5nczogIGFkZGVkIHN1cHBvcnQgZm9yIE9TX1NUUklORwotCi1UaHUgSnVuICAzIDAwOjM3OjAxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogcHVsbCBDT1BZSU5HIGFuZCBDT1BZSU5HLkxJQiBvZmYgb2YgdGhlIHRhcGUgCi0KLVR1ZSBKdW4gIDEgMTY6NTI6MDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiByZXBsYWNlIFJFTEVBU0VfRElSIHRvbwotCi1Nb24gTWFyIDIyIDIzOjU1OjI3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLVdlZCBNYXIgMTcgMDI6MjE6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBmaXggJ3NvdXJjZSBvbmx5JyBleHRyYWN0aW9uIGJ1ZyB3aGVyZSBpdCBsb29rZWQgZm9yCi0JdGhlIHNyYyBkaXIgdW5kZXIgSC08aG9zdD4vc3JjIGluc3RlYWQgb2Ygc3JjOyBhbHNvIHJlbW92ZSBzdHJheQotCXJlZmVyZW5jZSB0byBFTUFDU0hJQklOCi0KLU1vbiBNYXIgMTUgMDE6MjU6NDUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBtYWtlLXN0ZHMudGV4aTogYWRkZWQgJ2luc3RhbGxjaGVjaycgdG8gdGhlIHN0YW5kYXJkIHRhcmdldHMKLQotVHVlIE1hciAgOSAxOTo0ODoyOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBhZGRlZCBJTkZPLURJUi1FTlRSWSwgdXBkYXRlZCB2ZXJzaW9uIGZyb20gdGhlIEZTRgotCi1UdWUgRmViICA5IDEyOjQwOjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0YW5kYXJkcy5pbmZvKTogQWRkZWQgLUkkKHNyY2RpcikgdG8gZmluZAotCW1ha2Utc3Rkcy50ZXhpLgotCi1Nb24gRmViICAxIDE2OjMyOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IHVwZGF0ZWQgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLCB3aGljaCBpbmNsdWRlczoKLQotCSogbWFrZS1zdGRzLnRleGk6IG5ldyBmaWxlCi0KLU1vbiBOb3YgMzAgMDE6MzE6NDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLXRleGkuaW4sIHJlbG5vdGVzLnRleGksIGludHJvLnRleGk6IGNoYW5nZWQgQ3lnbnVzIHBob25lCi0JbnVtYmVycyBmcm9tIHRoZSBvbGQgUGFsbyBBbHRvIG9uZXMgdG8gdGhlIG5ldyBNdG4uIFZpZXcgbnVtYmVycwotCi1Nb24gTm92IDE2IDE2OjUwOjQzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSAkKFJNKSB0byAicm0gLWYiCi0KLVN1biBPY3QgMTEgMTY6MDU6NDggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBpbnRyby50ZXhpOiBhZGRlZCBJTkZPLURJUi1FTlRSWQotCmRpZmYgLS1naXQgYS9ldGMvTWFrZWZpbGUuaW4gYi9ldGMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZGM4YzkuLjAwMDAwMDAKLS0tIGEvZXRjL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMgCi0jIE1ha2VmaWxlLmluIGZvciBldGMKLSMKLQotcHJlZml4IAkJPSBAcHJlZml4QAotZXhlY19wcmVmaXggCT0gQGV4ZWNfcHJlZml4QAotCi1zcmNkaXIgID0gQHNyY2RpckAKLVZQQVRICT0gQHNyY2RpckAKLQotYmluZGlyICA9IEBiaW5kaXJACi1saWJkaXIgID0gQGxpYmRpckAKLXRvb2xkaXIgPSAkKGxpYmRpcikKLWRhdGFkaXIgPSBAZGF0YWRpckAKLQotbWFuZGlyICA9IEBtYW5kaXJACi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLW1hbjJkaXIgPSAkKG1hbmRpcikvbWFuMgotbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCi1tYW40ZGlyID0gJChtYW5kaXIpL21hbjQKLW1hbjVkaXIgPSAkKG1hbmRpcikvbWFuNQotbWFuNmRpciA9ICQobWFuZGlyKS9tYW42Ci1tYW43ZGlyID0gJChtYW5kaXIpL21hbjcKLW1hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAotbWFuOWRpciA9ICQobWFuZGlyKS9tYW45Ci1pbmZvZGlyID0gQGluZm9kaXJACi0KLVNIRUxMID0gL2Jpbi9zaAotCi1JTlNUQUxMIAk9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSAgICA9IEBJTlNUQUxMX0RBVEFACi0KLU1BS0VJTkZPID0gYGlmIFsgLWYgLi4vdGV4aW5mby9tYWtlaW5mby9tYWtlaW5mbyBdOyBcCi0JdGhlbiBlY2hvIC4uL3RleGluZm8vbWFrZWluZm8vbWFrZWluZm87IFwKLQllbHNlIGVjaG8gbWFrZWluZm87IGZpYAotVEVYSTJEVkkgPSBgaWYgWyAtZiAuLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmkgXTsgXAotCXRoZW4gZWNobyAuLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IFwKLQllbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSTJIVE1MID0gdGV4aTJodG1sCi1EVklQUyA9IGR2aXBzCi0KLSMgV2hlcmUgdG8gZmluZCB0ZXhpbmZvLnRleCB0byBmb3JtYXQgZG9jdW1lbnRhdGlvbiB3aXRoIFRlWC4KLVRFWElESVIgPSAkKHNyY2RpcikvLi4vdGV4aW5mbwotCi0jIyMjIEhvc3QsIHRhcmdldCwgYW5kIHNpdGUgc3BlY2lmaWMgTWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLSMjIwotCi1JTkZPRklMRVMgPSBzdGFuZGFyZHMuaW5mbyBjb25maWd1cmUuaW5mbwotRFZJRklMRVMgPSBzdGFuZGFyZHMuZHZpIGNvbmZpZ3VyZS5kdmkKLQotYWxsOgotCi1pbnN0YWxsOgotCi11bmluc3RhbGw6Ci0KLWluZm86Ci0JZm9yIGYgaW4gJChJTkZPRklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS9gZWNobyAkJGYgfCBzZWQgLWUgJ3MvLmluZm8kJC8udGV4aS8nYDsgdGhlbiBcCi0JICAgIGlmICQoTUFLRSkgIk1BS0VJTkZPPSQoTUFLRUlORk8pIiAkJGY7IHRoZW4gXAotCSAgICAgIHRydWU7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgZXhpdCAxOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQotaW5zdGFsbC1pbmZvOiBpbmZvCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21raW5zdGFsbGRpcnMgJChpbmZvZGlyKQotCWlmIHRlc3QgISAtZiBzdGFuZGFyZHMuaW5mbzsgdGhlbiBjZCAkKHNyY2Rpcik7IGZpOyBcCi0JaWYgdGVzdCAtZiBzdGFuZGFyZHMuaW5mbzsgdGhlbiBcCi0JICBmb3IgaSBpbiBzdGFuZGFyZHMuaW5mbyo7IGRvIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkaSAkKGluZm9kaXIpLyQkaTsgXAotCSAgZG9uZTsgXAotCWZpCi0JaWYgdGVzdCAhIC1mIGNvbmZpZ3VyZS5pbmZvOyB0aGVuIGNkICQoc3JjZGlyKTsgZmk7IFwKLQlpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5pbmZvOyB0aGVuIFwKLQkgIGZvciBpIGluIGNvbmZpZ3VyZS5pbmZvKjsgZG8gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRpICQoaW5mb2RpcikvJCRpOyBcCi0JICBkb25lOyBcCi0JZmkKLQotZHZpOgotCWZvciBmIGluICQoRFZJRklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS9gZWNobyAkJGYgfCBzZWQgLWUgJ3MvLmR2aSQkLy50ZXhpLydgOyB0aGVuIFwKLQkgICAgaWYgJChNQUtFKSAiVEVYSTJEVkk9JChURVhJMkRWSSkiICQkZjsgdGhlbiBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBlbHNlIFwKLQkgICAgICBleGl0IDE7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1zdGFuZGFyZHMuaW5mbzogJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpICQoc3JjZGlyKS9tYWtlLXN0ZHMudGV4aQotCSQoTUFLRUlORk8pIC0tbm8tc3BsaXQgLUkkKHNyY2RpcikgLW8gc3RhbmRhcmRzLmluZm8gJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpCi0KLXN0YW5kYXJkcy5kdmk6ICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQotCVRFWElOUFVUUz0kKFRFWElESVIpOiQkVEVYSU5QVVRTICQoVEVYSTJEVkkpICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQotCi1zdGFuZGFyZHMucHM6IHN0YW5kYXJkcy5kdmkKLQkkKERWSVBTKSBzdGFuZGFyZHMuZHZpIC1vIHN0YW5kYXJkcy5wcwotCi0jIG1ha2VpbmZvIHJlcXVpcmVzIGltYWdlcyB0byBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi1jb25maWd1cmUuaW5mbzogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpICQoc3JjZGlyKS9jb25maWdkZXYudGluICQoc3JjZGlyKS9jb25maWdidWlsZC50aW4KLQlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dAotCWNwICQoc3JjZGlyKS9jb25maWdkZXYudGluIGNvbmZpZ2Rldi50eHQKLQljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQudGluIGNvbmZpZ2J1aWxkLnR4dAotCSQoTUFLRUlORk8pIC1JJChzcmNkaXIpIC1vIGNvbmZpZ3VyZS5pbmZvICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0Ci0KLSMgdGV4aTJkdmkgd2FudHMgYm90aCB0aGUgLnR4dCBhbmQgdGhlIC5lcHMgZmlsZXMuCi1jb25maWd1cmUuZHZpOiAkKHNyY2RpcikvY29uZmlndXJlLnRleGkgJChzcmNkaXIpL2NvbmZpZ2Rldi50aW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiAkKHNyY2RpcikvY29uZmlnZGV2LmVpbiAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQKLQljcCAkKHNyY2RpcikvY29uZmlnZGV2LnRpbiBjb25maWdkZXYudHh0Ci0JY3AgJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiBjb25maWdidWlsZC50eHQKLQlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCWNwICQoc3JjZGlyKS9jb25maWdkZXYuZWluIGNvbmZpZ2Rldi5lcHMKLQljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluIGNvbmZpZ2J1aWxkLmVwcwotCVRFWElOUFVUUz0kKFRFWElESVIpOiQkVEVYSU5QVVRTICQoVEVYSTJEVkkpICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0Ci0Jcm0gLWYgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQotIyBkdmlwcyByZXF1aXJlcyBpbWFnZXMgdG8gYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci1jb25maWd1cmUucHM6IGNvbmZpZ3VyZS5kdmkgJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLmVpbgotCXJtIC1mIGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCi0JY3AgJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gY29uZmlnZGV2LmVwcwotCWNwICQoc3JjZGlyKS9jb25maWdidWlsZC5laW4gY29uZmlnYnVpbGQuZXBzCi0JJChEVklQUykgY29uZmlndXJlLmR2aSAtbyBjb25maWd1cmUucHMKLQlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCi1jb25maWd1cmUuaHRtbDogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpCi0JJChURVhJMkhUTUwpIC1zcGxpdF9jaGFwdGVyICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCi1jbGVhbjoKLQlybSAtZiAqLmF1eCAqLmNwICouY3BzICouZHZpICouZm4gKi5mbnMgKi5reSAqLmt5cyAqLmxvZwotCXJtIC1mICoucGcgKi5wZ3MgKi50b2MgKi50cCAqLnRwcyAqLnZyICoudnJzCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQlybSAtZiBjb25maWdkZXYuanBnIGNvbmZpZ2J1aWxkLmpwZwotCi1tb3N0bHljbGVhbjogY2xlYW4KLQotZGlzdGNsZWFuOiAgIGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUKLQotbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46ICAgZGlzdGNsZWFuCi0Jcm0gLWYgKi5pbmZvKgotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQoaG9zdF9tYWtlZmlsZV9mcmFnKSAkKHRhcmdldF9tYWtlZmlsZV9mcmFnKQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIyB0aGVzZSBsYXN0IHRhcmdldHMgYXJlIGZvciBzdGFuZGFyZHMudGV4aSBjb25mb3JtYW5jZQotZGlzdDoKLWNoZWNrOgotaW5zdGFsbGNoZWNrOgotVEFHUzoKZGlmZiAtLWdpdCBhL2V0Yy9hZGQtbG9nLmVsIGIvZXRjL2FkZC1sb2cuZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzg4ZTguLjAwMDAwMDAKLS0tIGEvZXRjL2FkZC1sb2cuZWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMgKzAsMCBAQAotOzs7ID09PT09PT09PT09PSBOT1RFIFdFTEwhID09PT09PT09PT09PT0KLTs7OwotOzs7IFlvdSBvbmx5IG5lZWQgdG8gdXNlIHRoaXMgZmlsZSBpZiB5b3UncmUgdXNpbmcgYSB2ZXJzaW9uIG9mIEVtYWNzCi07OzsgcHJpb3IgdG8gMjAuMSB0byB3b3JrIG9uIEdEQi4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzCi07OzsgYW5kIHRoZSBzdGFuZGFyZCBhZGQtbG9nLmVsIHByb3ZpZGVkIHdpdGggMTkuMzQgaXMgdGhhdCBpdAotOzs7IGdlbmVyYXRlcyBkYXRlcyB1c2luZyB0aGUgdGVyc2VyIGZvcm1hdCB1c2VkIGJ5IEVtYWNzIDIwLiAgVGhpcyBpcwotOzs7IHRoZSBmb3JtYXQgcmVjb21tZW5kZWQgZm9yIHVzZSBpbiBHREIgQ2hhbmdlTG9ncy4KLTs7OwotOzs7IFRvIHVzZSB0aGlzIGNvZGUsIHlvdSBzaG91bGQgY3JlYXRlIGEgZGlyZWN0b3J5IGB+L2VsaXNwJywgc2F2ZSB0aGUgY29kZQotOzs7IGJlbG93IGluIGB+L2VsaXNwL2FkZC1sb2cuZWwnLCBhbmQgdGhlbiBwdXQgc29tZXRoaW5nIGxpa2UgdGhpcyBpbgotOzs7IHlvdXIgYH4vLmVtYWNzJyBmaWxlLCB0byB0ZWxsIEVtYWNzIHdoZXJlIHRvIGZpbmQgaXQ6Ci07OzsgCi07OzsgKHNldHEgbG9hZC1wYXRoCi07OzsgICAgICAgKGNvbnMgKGV4cGFuZC1maWxlLW5hbWUgIn4vZWxpc3AiKQotOzs7ICAgICAgICAgICAgIGxvYWQtcGF0aCkpCi07OzsgCi07OzsgSWYgeW91IHdhbnQsIHlvdSBjYW4gYWxzbyBieXRlLWNvbXBpbGUgaXQgLS0tIGl0J2xsIHJ1biBhIGxpdHRsZQotOzs7IGZhc3RlciwgYW5kIHVzZSBhIGxpdHRsZSBsZXNzIG1lbW9yeS4gIChOb3QgdGhhdCB0aG9zZSBtYXR0ZXIgbXVjaCBmb3IKLTs7OyB0aGlzIGZpbGUuKSAgVG8gZG8gdGhhdCwgYWZ0ZXIgeW91J3ZlIHNhdmVkIHRoZSB0ZXh0IGFzCi07Ozsgfi9lbGlzcC9hZGQtbG9nLmVsLCBicmluZyBpdCB1cCBpbiBFbWFjcywgYW5kIHR5cGUKLTs7OyAKLTs7OyAgICAgQy11IE0teCBieXRlLWNvbXBpbGUtZmlsZQotOzs7Ci07OzsgLS0tIEppbSBCbGFuZHkKLQotOzs7IGFkZC1sb2cuZWwgLS0tIGNoYW5nZSBsb2cgbWFpbnRlbmFuY2UgY29tbWFuZHMgZm9yIEVtYWNzCi0KLTs7IENvcHlyaWdodCAoQykgMTk4NSwgMTk4NiwgMTk4OCwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotOzsgS2V5d29yZHM6IG1haW50Ci0KLTs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KLQotOzsgR05VIEVtYWNzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLTs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci07OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi07OyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotOzsgR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi07OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLTs7IGFsb25nIHdpdGggR05VIEVtYWNzOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi07OyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLTs7IEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi07OzsgQ29tbWVudGFyeToKLQotOzsgVGhpcyBmYWNpbGl0eSBpcyBkb2N1bWVudGVkIGluIHRoZSBFbWFjcyBNYW51YWwuCi0KLTs7OyBDb2RlOgotCi0oZGVmdmFyIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lIG5pbAotICAiKk5hbWUgb2YgYSBjaGFuZ2UgbG9nIGZpbGUgZm9yIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5XS4iKQotCi0oZGVmdmFyIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1mdW5jdGlvbiBuaWwKLSAgIlwKLSpJZiBub24tbmlsLCBmdW5jdGlvbiB0byBndWVzcyBuYW1lIG9mIGN1cnJlbnQgZnVuY3Rpb24gZnJvbSBzdXJyb3VuZGluZyB0ZXh0LgotXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldIGNhbGxzIHRoaXMgZnVuY3Rpb24gKGlmIG5pbCwgYGFkZC1sb2ctY3VycmVudC1kZWZ1bicKLWluc3RlYWQpIHdpdGggbm8gYXJndW1lbnRzLiAgSXQgcmV0dXJucyBhIHN0cmluZyBvciBuaWwgaWYgaXQgY2Fubm90IGd1ZXNzLiIpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdmFyIGFkZC1sb2ctZnVsbC1uYW1lIG5pbAotICAiKkZ1bGwgbmFtZSBvZiB1c2VyLCBmb3IgaW5jbHVzaW9uIGluIENoYW5nZUxvZyBkYWlseSBoZWFkZXJzLgotVGhpcyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGB1c2VyLWZ1bGwtbmFtZScgZnVuY3Rpb24uIikKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ2YXIgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MgbmlsCi0gICIqRWxlY3Ryb25pYyBtYWlsIGFkZHJlc3Mgb2YgdXNlciwgZm9yIGluY2x1c2lvbiBpbiBDaGFuZ2VMb2cgZGFpbHkgaGVhZGVycy4KLVRoaXMgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIGB1c2VyLW1haWwtYWRkcmVzcycuIikKLQotKGRlZnZhciBjaGFuZ2UtbG9nLWZvbnQtbG9jay1rZXl3b3JkcwotICAnKCgiXltTTVRXRl0uKyIgLiBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKQk7IERhdGUgbGluZS4KLSAgICAoIl5cdFxcKiBcXChbXiA6XG5dK1xcKSIgMSBmb250LWxvY2stY29tbWVudC1mYWNlKQk7IEZpbGUgbmFtZS4KLSAgICAoIihcXChbXilcbl0rXFwpKToiIDEgZm9udC1sb2NrLWtleXdvcmQtZmFjZSkpCTsgRnVuY3Rpb24gbmFtZS4KLSAgIkFkZGl0aW9uYWwgZXhwcmVzc2lvbnMgdG8gaGlnaGxpZ2h0IGluIENoYW5nZSBMb2cgbW9kZS4iKQotCi0oZGVmdmFyIGNoYW5nZS1sb2ctbW9kZS1tYXAgbmlsCi0gICJLZXltYXAgZm9yIENoYW5nZSBMb2cgbWFqb3IgbW9kZS4iKQotKGlmIGNoYW5nZS1sb2ctbW9kZS1tYXAKLSAgICBuaWwKLSAgKHNldHEgY2hhbmdlLWxvZy1tb2RlLW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkKLSAgKGRlZmluZS1rZXkgY2hhbmdlLWxvZy1tb2RlLW1hcCAiXE0tcSIgJ2NoYW5nZS1sb2ctZmlsbC1wYXJhZ3JhcGgpKQotCi0oZGVmdW4gY2hhbmdlLWxvZy1uYW1lICgpCi0gIChvciBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZQotICAgICAgKGlmIChlcSBzeXN0ZW0tdHlwZSAndmF4LXZtcykgCi0JICAiJENIQU5HRV9MT0ckLlRYVCIgCi0JKGlmIChvciAoZXEgc3lzdGVtLXR5cGUgJ21zLWRvcykgKGVxIHN5c3RlbS10eXBlICd3aW5kb3dzLW50KSkKLQkgICAgImNoYW5nZWxvIgotCSAgIkNoYW5nZUxvZyIpKSkpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gcHJvbXB0LWZvci1jaGFuZ2UtbG9nLW5hbWUgKCkKLSAgIlByb21wdCBmb3IgYSBjaGFuZ2UgbG9nIG5hbWUuIgotICAobGV0KiAoKGRlZmF1bHQgKGNoYW5nZS1sb2ctbmFtZSkpCi0JIChuYW1lIChleHBhbmQtZmlsZS1uYW1lCi0JCShyZWFkLWZpbGUtbmFtZSAoZm9ybWF0ICJMb2cgZmlsZSAoZGVmYXVsdCAlcyk6ICIgZGVmYXVsdCkKLQkJCQluaWwgZGVmYXVsdCkpKSkKLSAgICA7OyBIYW5kbGUgc29tZXRoaW5nIHRoYXQgaXMgc3ludGFjdGljYWxseSBhIGRpcmVjdG9yeSBuYW1lLgotICAgIDs7IExvb2sgZm9yIENoYW5nZUxvZyBvciB3aGF0ZXZlciBpbiB0aGF0IGRpcmVjdG9yeS4KLSAgICAoaWYgKHN0cmluZz0gKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgbmFtZSkgIiIpCi0JKGV4cGFuZC1maWxlLW5hbWUgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZGVmYXVsdCkKLQkJCSAgbmFtZSkKLSAgICAgIDs7IEhhbmRsZSBzcGVjaWZ5aW5nIGEgZmlsZSB0aGF0IGlzIGEgZGlyZWN0b3J5LgotICAgICAgKGlmIChmaWxlLWRpcmVjdG9yeS1wIG5hbWUpCi0JICAoZXhwYW5kLWZpbGUtbmFtZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBkZWZhdWx0KQotCQkJICAgIChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IG5hbWUpKQotCW5hbWUpKSkpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gZmluZC1jaGFuZ2UtbG9nICgmb3B0aW9uYWwgZmlsZS1uYW1lKQotICAiRmluZCBhIGNoYW5nZSBsb2cgZmlsZSBmb3IgXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldIGFuZCByZXR1cm4gdGhlIG5hbWUuCi0KLU9wdGlvbmFsIGFyZyBGSUxFLU5BTUUgc3BlY2lmaWVzIHRoZSBmaWxlIHRvIHVzZS4KLUlmIEZJTEUtTkFNRSBpcyBuaWwsIHVzZSB0aGUgdmFsdWUgb2YgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJy4KLUlmICdjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScgaXMgbmlsLCBiZWhhdmUgYXMgdGhvdWdoIGl0IHdlcmUgJ0NoYW5nZUxvZycKLVwob3Igd2hhdGV2ZXIgd2UgdXNlIG9uIHRoaXMgb3BlcmF0aW5nIHN5c3RlbSkuCi0KLUlmICdjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScgY29udGFpbnMgYSBsZWFkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4KLXNpbXBseSBmaW5kIGl0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIE90aGVyd2lzZSwgc2VhcmNoIGluIHRoZSBjdXJyZW50IAotZGlyZWN0b3J5IGFuZCBpdHMgc3VjY2Vzc2l2ZSBwYXJlbnRzIGZvciBhIGZpbGUgc28gbmFtZWQuCi0KLU9uY2UgYSBmaWxlIGlzIGZvdW5kLCBgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnIGlzIHNldCBsb2NhbGx5IGluIHRoZQotY3VycmVudCBidWZmZXIgdG8gdGhlIGNvbXBsZXRlIGZpbGUgbmFtZS4iCi0gIDs7IElmIHVzZXIgc3BlY2lmaWVkIGEgZmlsZSBuYW1lIG9yIGlmIHRoaXMgYnVmZmVyIGtub3dzIHdoaWNoIG9uZSB0byB1c2UsCi0gIDs7IGp1c3QgdXNlIHRoYXQuCi0gIChvciBmaWxlLW5hbWUKLSAgICAgIChzZXRxIGZpbGUtbmFtZSAoYW5kIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lCi0JCQkgICAoZmlsZS1uYW1lLWRpcmVjdG9yeSBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZSkKLQkJCSAgIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lKSkKLSAgICAgIChwcm9nbgotCTs7IENoYXNlIGxpbmtzIGluIHRoZSBzb3VyY2UgZmlsZQotCTs7IGFuZCB1c2UgdGhlIGNoYW5nZSBsb2cgaW4gdGhlIGRpciB3aGVyZSBpdCBwb2ludHMuCi0JKHNldHEgZmlsZS1uYW1lIChvciAoYW5kIGJ1ZmZlci1maWxlLW5hbWUKLQkJCQkgKGZpbGUtbmFtZS1kaXJlY3RvcnkKLQkJCQkgIChmaWxlLWNoYXNlLWxpbmtzIGJ1ZmZlci1maWxlLW5hbWUpKSkKLQkJCSAgICBkZWZhdWx0LWRpcmVjdG9yeSkpCi0JKGlmIChmaWxlLWRpcmVjdG9yeS1wIGZpbGUtbmFtZSkKLQkgICAgKHNldHEgZmlsZS1uYW1lIChleHBhbmQtZmlsZS1uYW1lIChjaGFuZ2UtbG9nLW5hbWUpIGZpbGUtbmFtZSkpKQotCTs7IENoYXNlIGxpbmtzIGJlZm9yZSB2aXNpdGluZyB0aGUgZmlsZS4KLQk7OyBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2UgYSBzaW5nbGUgY2hhbmdlIGxvZyBmaWxlCi0JOzsgZm9yIHNldmVyYWwgcmVsYXRlZCBkaXJlY3Rvcmllcy4KLQkoc2V0cSBmaWxlLW5hbWUgKGZpbGUtY2hhc2UtbGlua3MgZmlsZS1uYW1lKSkKLQkoc2V0cSBmaWxlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgZmlsZS1uYW1lKSkKLQk7OyBNb3ZlIHVwIGluIHRoZSBkaXIgaGllcmFyY2h5IHRpbGwgd2UgZmluZCBhIGNoYW5nZSBsb2cgZmlsZS4KLQkobGV0ICgoZmlsZTEgZmlsZS1uYW1lKQotCSAgICAgIHBhcmVudC1kaXIpCi0JICAod2hpbGUgKGFuZCAobm90IChvciAoZ2V0LWZpbGUtYnVmZmVyIGZpbGUxKSAoZmlsZS1leGlzdHMtcCBmaWxlMSkpKQotCQkgICAgICAocHJvZ24gKHNldHEgcGFyZW50LWRpcgotCQkJCSAgIChmaWxlLW5hbWUtZGlyZWN0b3J5Ci0JCQkJICAgIChkaXJlY3RvcnktZmlsZS1uYW1lCi0JCQkJICAgICAoZmlsZS1uYW1lLWRpcmVjdG9yeSBmaWxlMSkpKSkKLQkJCSAgICAgOzsgR2l2ZSB1cCBpZiB3ZSBhcmUgYWxyZWFkeSBhdCB0aGUgcm9vdCBkaXIuCi0JCQkgICAgIChub3QgKHN0cmluZz0gKGZpbGUtbmFtZS1kaXJlY3RvcnkgZmlsZTEpCi0JCQkJCSAgIHBhcmVudC1kaXIpKSkpCi0JICAgIDs7IE1vdmUgdXAgdG8gdGhlIHBhcmVudCBkaXIgYW5kIHRyeSBhZ2Fpbi4KLQkgICAgKHNldHEgZmlsZTEgKGV4cGFuZC1maWxlLW5hbWUgCi0JCQkgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgKGNoYW5nZS1sb2ctbmFtZSkpCi0JCQkgcGFyZW50LWRpcikpKQotCSAgOzsgSWYgd2UgZm91bmQgYSBjaGFuZ2UgbG9nIGluIGEgcGFyZW50LCB1c2UgdGhhdC4KLQkgIChpZiAob3IgKGdldC1maWxlLWJ1ZmZlciBmaWxlMSkgKGZpbGUtZXhpc3RzLXAgZmlsZTEpKQotCSAgICAgIChzZXRxIGZpbGUtbmFtZSBmaWxlMSkpKSkpCi0gIDs7IE1ha2UgYSBsb2NhbCB2YXJpYWJsZSBpbiB0aGlzIGJ1ZmZlciBzbyB3ZSBuZWVkbid0IHNlYXJjaCBhZ2Fpbi4KLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUpIGZpbGUtbmFtZSkKLSAgZmlsZS1uYW1lKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGFkZC1jaGFuZ2UtbG9nLWVudHJ5ICgmb3B0aW9uYWwgd2hvYW1pIGZpbGUtbmFtZSBvdGhlci13aW5kb3cgbmV3LWVudHJ5KQotICAiRmluZCBjaGFuZ2UgbG9nIGZpbGUgYW5kIGFkZCBhbiBlbnRyeSBmb3IgdG9kYXkuCi1PcHRpb25hbCBhcmcgKGludGVyYWN0aXZlIHByZWZpeCkgbm9uLW5pbCBtZWFucyBwcm9tcHQgZm9yIHVzZXIgbmFtZSBhbmQgc2l0ZS4KLVNlY29uZCBhcmcgaXMgZmlsZSBuYW1lIG9mIGNoYW5nZSBsb2cuICBJZiBuaWwsIHVzZXMgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJy4KLVRoaXJkIGFyZyBPVEhFUi1XSU5ET1cgbm9uLW5pbCBtZWFucyB2aXNpdCBpbiBvdGhlciB3aW5kb3cuCi1Gb3VydGggYXJnIE5FVy1FTlRSWSBub24tbmlsIG1lYW5zIGFsd2F5cyBjcmVhdGUgYSBuZXcgZW50cnkgYXQgdGhlIGZyb250OwotbmV2ZXIgYXBwZW5kIHRvIGFuIGV4aXN0aW5nIGVudHJ5LiIKLSAgKGludGVyYWN0aXZlIChsaXN0IGN1cnJlbnQtcHJlZml4LWFyZwotCQkgICAgIChwcm9tcHQtZm9yLWNoYW5nZS1sb2ctbmFtZSkpKQotICAob3IgYWRkLWxvZy1mdWxsLW5hbWUKLSAgICAgIChzZXRxIGFkZC1sb2ctZnVsbC1uYW1lICh1c2VyLWZ1bGwtbmFtZSkpKQotICAob3IgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MKLSAgICAgIChzZXRxIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzIHVzZXItbWFpbC1hZGRyZXNzKSkKLSAgKGlmIHdob2FtaQotICAgICAgKHByb2duCi0JKHNldHEgYWRkLWxvZy1mdWxsLW5hbWUgKHJlYWQtaW5wdXQgIkZ1bGwgbmFtZTogIiBhZGQtbG9nLWZ1bGwtbmFtZSkpCi0JIDs7IE5vdGUgdGhhdCBzb21lIHNpdGVzIGhhdmUgcm9vbSBhbmQgcGhvbmUgbnVtYmVyIGZpZWxkcyBpbgotCSA7OyBmdWxsIG5hbWUgd2hpY2ggbG9vayBzaWxseSB3aGVuIGluc2VydGVkLiAgUmF0aGVyIHRoYW4gZG8KLQkgOzsgYW55dGhpbmcgYWJvdXQgdGhhdCBoZXJlLCBsZXQgdXNlciBnaXZlIHByZWZpeCBhcmd1bWVudCBzbyB0aGF0Ci0JIDs7IHMvaGUgY2FuIGVkaXQgdGhlIGZ1bGwgbmFtZSBmaWVsZCBpbiBwcm9tcHRlciBpZiBzL2hlIHdhbnRzLgotCShzZXRxIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzCi0JICAgICAgKHJlYWQtaW5wdXQgIk1haWxpbmcgYWRkcmVzczogIiBhZGQtbG9nLW1haWxpbmctYWRkcmVzcykpKSkKLSAgKGxldCAoKGRlZnVuIChmdW5jYWxsIChvciBhZGQtbG9nLWN1cnJlbnQtZGVmdW4tZnVuY3Rpb24KLQkJCSAgICAnYWRkLWxvZy1jdXJyZW50LWRlZnVuKSkpCi0JcGFyYWdyYXBoLWVuZCBlbnRyeSkKLQotICAgIChzZXRxIGZpbGUtbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSAoZmluZC1jaGFuZ2UtbG9nIGZpbGUtbmFtZSkpKQotCi0gICAgOzsgU2V0IEVOVFJZIHRvIHRoZSBmaWxlIG5hbWUgdG8gdXNlIGluIHRoZSBuZXcgZW50cnkuCi0gICAgKGFuZCBidWZmZXItZmlsZS1uYW1lCi0JIDs7IE5ldmVyIHdhbnQgdG8gYWRkIGEgY2hhbmdlIGxvZyBlbnRyeSBmb3IgdGhlIENoYW5nZUxvZyBmaWxlIGl0c2VsZi4KLQkgKG5vdCAoc3RyaW5nPSBidWZmZXItZmlsZS1uYW1lIGZpbGUtbmFtZSkpCi0JIChzZXRxIGVudHJ5IChpZiAoc3RyaW5nLW1hdGNoCi0JCQkgIChjb25jYXQgIl4iIChyZWdleHAtcXVvdGUgKGZpbGUtbmFtZS1kaXJlY3RvcnkKLQkJCQkJCSAgICAgZmlsZS1uYW1lKSkpCi0JCQkgIGJ1ZmZlci1maWxlLW5hbWUpCi0JCQkgKHN1YnN0cmluZyBidWZmZXItZmlsZS1uYW1lIChtYXRjaC1lbmQgMCkpCi0JCSAgICAgICAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBidWZmZXItZmlsZS1uYW1lKSkpKQotCi0gICAgKGlmIChhbmQgb3RoZXItd2luZG93IChub3QgKGVxdWFsIGZpbGUtbmFtZSBidWZmZXItZmlsZS1uYW1lKSkpCi0JKGZpbmQtZmlsZS1vdGhlci13aW5kb3cgZmlsZS1uYW1lKQotICAgICAgKGZpbmQtZmlsZSBmaWxlLW5hbWUpKQotICAgIChvciAoZXEgbWFqb3ItbW9kZSAnY2hhbmdlLWxvZy1tb2RlKQotCShjaGFuZ2UtbG9nLW1vZGUpKQotICAgICh1bmRvLWJvdW5kYXJ5KQotICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCi0gICAgKGxldCAoKGhlYWRpbmcgKGZvcm1hdCAiJXMgICVzICA8JXM+IgotCQkJICAgKGZvcm1hdC10aW1lLXN0cmluZyAiJVktJW0tJWQiKQotCQkJICAgYWRkLWxvZy1mdWxsLW5hbWUKLQkJCSAgIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzKSkpCi0gICAgICAoaWYgKGxvb2tpbmctYXQgKHJlZ2V4cC1xdW90ZSBoZWFkaW5nKSkKLQkgIChmb3J3YXJkLWxpbmUgMSkKLQkoaW5zZXJ0IGhlYWRpbmcgIlxuXG4iKSkpCi0KLSAgICA7OyBTZWFyY2ggb25seSB3aXRoaW4gdGhlIGZpcnN0IHBhcmFncmFwaC4KLSAgICAoaWYgKGxvb2tpbmctYXQgIlxuKlteXG4qIFx0XSIpCi0JKHNraXAtY2hhcnMtZm9yd2FyZCAiXG4iKQotICAgICAgKGZvcndhcmQtcGFyYWdyYXBoIDEpKQotICAgIChzZXRxIHBhcmFncmFwaC1lbmQgKHBvaW50KSkKLSAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQotCi0gICAgOzsgTm93IGluc2VydCB0aGUgbmV3IGxpbmUgZm9yIHRoaXMgZW50cnkuCi0gICAgKGNvbmQgKChyZS1zZWFyY2gtZm9yd2FyZCAiXlxccyAqXFwqXFxzICokIiBwYXJhZ3JhcGgtZW5kIHQpCi0JICAgOzsgUHV0IHRoaXMgZmlsZSBuYW1lIGludG8gdGhlIGV4aXN0aW5nIGVtcHR5IGVudHJ5LgotCSAgIChpZiBlbnRyeQotCSAgICAgICAoaW5zZXJ0IGVudHJ5KSkpCi0JICAoKGFuZCAobm90IG5ldy1lbnRyeSkKLQkJKGxldCAoY2FzZS1mb2xkLXNlYXJjaCkKLQkJICAocmUtc2VhcmNoLWZvcndhcmQKLQkJICAgKGNvbmNhdCAocmVnZXhwLXF1b3RlIChjb25jYXQgIiogIiBlbnRyeSkpCi0JCQkgICA7OyBEb24ndCBhY2NlcHQgYGZvby5iYXInIHdoZW4KLQkJCSAgIDs7IGxvb2tpbmcgZm9yIGBmb28nOgotCQkJICAgIlxcKFxccyBcXHxbKCksOl1cXCkiKQotCQkgICBwYXJhZ3JhcGgtZW5kIHQpKSkKLQkgICA7OyBBZGQgdG8gdGhlIGV4aXN0aW5nIGVudHJ5IGZvciB0aGUgc2FtZSBmaWxlLgotCSAgIChyZS1zZWFyY2gtZm9yd2FyZCAiXlxccyAqJFxcfF5cXHMgXFwqIikKLQkgICAoZ290by1jaGFyIChtYXRjaC1iZWdpbm5pbmcgMCkpCi0JICAgOzsgRGVsZXRlIGV4Y2VzcyBlbXB0eSBsaW5lczsgbWFrZSBqdXN0IDIuCi0JICAgKHdoaWxlIChhbmQgKG5vdCAoZW9icCkpIChsb29raW5nLWF0ICJeXFxzICokIikpCi0JICAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQpIChzYXZlLWV4Y3Vyc2lvbiAoZm9yd2FyZC1saW5lIDEpIChwb2ludCkpKSkKLQkgICAoaW5zZXJ0ICJcblxuIikKLQkgICAoZm9yd2FyZC1saW5lIC0yKQotCSAgIChpbmRlbnQtcmVsYXRpdmUtbWF5YmUpKQotCSAgKHQKLQkgICA7OyBNYWtlIGEgbmV3IGVudHJ5LgotCSAgIChmb3J3YXJkLWxpbmUgMSkKLQkgICAod2hpbGUgKGxvb2tpbmctYXQgIlxcc1ciKQotCSAgICAgKGZvcndhcmQtbGluZSAxKSkKLQkgICAod2hpbGUgKGFuZCAobm90IChlb2JwKSkgKGxvb2tpbmctYXQgIl5cXHMgKiQiKSkKLQkgICAgIChkZWxldGUtcmVnaW9uIChwb2ludCkgKHNhdmUtZXhjdXJzaW9uIChmb3J3YXJkLWxpbmUgMSkgKHBvaW50KSkpKQotCSAgIChpbnNlcnQgIlxuXG5cbiIpCi0JICAgKGZvcndhcmQtbGluZSAtMikKLQkgICAoaW5kZW50LXRvIGxlZnQtbWFyZ2luKQotCSAgIChpbnNlcnQgIiogIiAob3IgZW50cnkgIiIpKSkpCi0gICAgOzsgTm93IGluc2VydCB0aGUgZnVuY3Rpb24gbmFtZSwgaWYgd2UgaGF2ZSBvbmUuCi0gICAgOzsgUG9pbnQgaXMgYXQgdGhlIGVudHJ5IGZvciB0aGlzIGZpbGUsCi0gICAgOzsgZWl0aGVyIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgb3IgYXQgdGhlIGZpcnN0IGJsYW5rIGxpbmUuCi0gICAgKGlmIGRlZnVuCi0JKHByb2duCi0JICA7OyBNYWtlIGl0IGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLQkgICh1bmRvLWJvdW5kYXJ5KQotCSAgKGluc2VydCAoaWYgKHNhdmUtZXhjdXJzaW9uCi0JCQkoYmVnaW5uaW5nLW9mLWxpbmUgMSkKLQkJCShsb29raW5nLWF0ICJcXHMgKiQiKSkgCi0JCSAgICAgICIiCi0JCSAgICAiICIpCi0JCSAgIigiIGRlZnVuICIpOiAiKSkKLSAgICAgIDs7IE5vIGZ1bmN0aW9uIG5hbWUsIHNvIHB1dCBpbiBhIGNvbG9uIHVubGVzcyB3ZSBoYXZlIGp1c3QgYSBzdGFyLgotICAgICAgKGlmIChub3QgKHNhdmUtZXhjdXJzaW9uCi0JCSAoYmVnaW5uaW5nLW9mLWxpbmUgMSkKLQkJIChsb29raW5nLWF0ICJcXHMgKlxcKFxcKlxccyAqXFwpPyQiKSkpCi0JICAoaW5zZXJ0ICI6ICIpKSkpKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGFkZC1jaGFuZ2UtbG9nLWVudHJ5LW90aGVyLXdpbmRvdyAoJm9wdGlvbmFsIHdob2FtaSBmaWxlLW5hbWUpCi0gICJGaW5kIGNoYW5nZSBsb2cgZmlsZSBpbiBvdGhlciB3aW5kb3cgYW5kIGFkZCBhbiBlbnRyeSBmb3IgdG9kYXkuCi1PcHRpb25hbCBhcmcgKGludGVyYWN0aXZlIHByZWZpeCkgbm9uLW5pbCBtZWFucyBwcm9tcHQgZm9yIHVzZXIgbmFtZSBhbmQgc2l0ZS4KLVNlY29uZCBhcmcgaXMgZmlsZSBuYW1lIG9mIGNoYW5nZSBsb2cuICBcCi1JZiBuaWwsIHVzZXMgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJy4iCi0gIChpbnRlcmFjdGl2ZSAoaWYgY3VycmVudC1wcmVmaXgtYXJnCi0JCSAgIChsaXN0IGN1cnJlbnQtcHJlZml4LWFyZwotCQkJIChwcm9tcHQtZm9yLWNoYW5nZS1sb2ctbmFtZSkpKSkKLSAgKGFkZC1jaGFuZ2UtbG9nLWVudHJ5IHdob2FtaSBmaWxlLW5hbWUgdCkpCi07OzsjIyNhdXRvbG9hZCAoZGVmaW5lLWtleSBjdGwteC00LW1hcCAiYSIgJ2FkZC1jaGFuZ2UtbG9nLWVudHJ5LW90aGVyLXdpbmRvdykKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBjaGFuZ2UtbG9nLW1vZGUgKCkKLSAgIk1ham9yIG1vZGUgZm9yIGVkaXRpbmcgY2hhbmdlIGxvZ3M7IGxpa2UgSW5kZW50ZWQgVGV4dCBNb2RlLgotUHJldmVudHMgbnVtZXJpYyBiYWNrdXBzIGFuZCBzZXRzIGBsZWZ0LW1hcmdpbicgdG8gOCBhbmQgYGZpbGwtY29sdW1uJyB0byA3NC4KLU5ldyBsb2cgZW50cmllcyBhcmUgdXN1YWxseSBtYWRlIHdpdGggXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldIG9yIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5LW90aGVyLXdpbmRvd10uCi1FYWNoIGVudHJ5IGJlaGF2ZXMgYXMgYSBwYXJhZ3JhcGgsIGFuZCB0aGUgZW50cmllcyBmb3Igb25lIGRheSBhcyBhIHBhZ2UuCi1SdW5zIGBjaGFuZ2UtbG9nLW1vZGUtaG9vaycuIgotICAoaW50ZXJhY3RpdmUpCi0gIChraWxsLWFsbC1sb2NhbC12YXJpYWJsZXMpCi0gIChpbmRlbnRlZC10ZXh0LW1vZGUpCi0gIChzZXRxIG1ham9yLW1vZGUgJ2NoYW5nZS1sb2ctbW9kZQotCW1vZGUtbmFtZSAiQ2hhbmdlIExvZyIKLQlsZWZ0LW1hcmdpbiA4Ci0JZmlsbC1jb2x1bW4gNzQKLSAgICBpbmRlbnQtdGFicy1tb2RlIHQKLSAgICB0YWItd2lkdGggOCkKLSAgKHVzZS1sb2NhbC1tYXAgY2hhbmdlLWxvZy1tb2RlLW1hcCkKLSAgOzsgTGV0IGVhY2ggZW50cnkgYmVoYXZlIGFzIG9uZSBwYXJhZ3JhcGg6Ci0gIDs7IFdlIHJlYWxseSBkbyB3YW50ICJeIiBpbiBwYXJhZ3JhcGgtc3RhcnQgYmVsb3c6IGl0IGlzIG9ubHkgdGhlIGxpbmVzIHRoYXQKLSAgOzsgYmVnaW4gYXQgY29sdW1uIDAgKGRlc3BpdGUgdGhlIGxlZnQtbWFyZ2luIG9mIDgpIHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLgotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYXJhZ3JhcGgtc3RhcnQpICJcXHMgKiRcXHxcZlxcfF5cXHN3IikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAncGFyYWdyYXBoLXNlcGFyYXRlKSAiXFxzICokXFx8XGZcXHxeXFxzdyIpCi0gIDs7IExldCBhbGwgZW50cmllcyBmb3Igb25lIGRheSBiZWhhdmUgYXMgb25lIHBhZ2UuCi0gIDs7IE1hdGNoIG51bGwgc3RyaW5nIG9uIHRoZSBkYXRlLWxpbmUgc28gdGhhdCB0aGUgZGF0ZS1saW5lCi0gIDs7IGlzIGdyb3VwZWQgd2l0aCB3aGF0IGZvbGxvd3MuCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhZ2UtZGVsaW1pdGVyKSAiXlxcPFxcfF5cZiIpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3ZlcnNpb24tY29udHJvbCkgJ25ldmVyKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdhZGFwdGl2ZS1maWxsLXJlZ2V4cCkgIlxccyAqIikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZm9udC1sb2NrLWRlZmF1bHRzKQotICAgICAgICcoY2hhbmdlLWxvZy1mb250LWxvY2sta2V5d29yZHMgdCkpCi0gIChydW4taG9va3MgJ2NoYW5nZS1sb2ctbW9kZS1ob29rKSkKLQotOzsgSXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgZ2VuZXJhbCBmZWF0dXJlIHRvIHJlcGxhY2UgdGhpcy4gIFRoZSBpZGVhIEkKLTs7IGhhdmUgaXMgYSB2YXJpYWJsZSBnaXZpbmcgYSByZWdleHAgbWF0Y2hpbmcgdGV4dCB3aGljaCBzaG91bGQgbm90IGJlCi07OyBtb3ZlZCBmcm9tIGJvbCBieSBmaWxsaW5nLiAgY2hhbmdlLWxvZy1tb2RlIHdvdWxkIHNldCB0aGlzIHRvICJeXFxzICpcXHMoIi4KLTs7IEJ1dCBJIGRvbid0IGZlZWwgdXAgdG8gaW1wbGVtZW50aW5nIHRoYXQgdG9kYXkuCi0oZGVmdW4gY2hhbmdlLWxvZy1maWxsLXBhcmFncmFwaCAoJm9wdGlvbmFsIGp1c3RpZnkpCi0gICJGaWxsIHRoZSBwYXJhZ3JhcGgsIGJ1dCBwcmVzZXJ2ZSBvcGVuIHBhcmVudGhlc2VzIGF0IGJlZ2lubmluZyBvZiBsaW5lcy4KLVByZWZpeCBhcmcgbWVhbnMganVzdGlmeSBhcyB3ZWxsLiIKLSAgKGludGVyYWN0aXZlICJQIikKLSAgKGxldCAoKGVuZCAoc2F2ZS1leGN1cnNpb24gKGZvcndhcmQtcGFyYWdyYXBoKSAocG9pbnQpKSkKLQkoYmVnIChzYXZlLWV4Y3Vyc2lvbiAoYmFja3dhcmQtcGFyYWdyYXBoKShwb2ludCkpKQotCShwYXJhZ3JhcGgtc3RhcnQgKGNvbmNhdCBwYXJhZ3JhcGgtc3RhcnQgIlxcfFxccyAqXFxzKCIpKSkKLSAgICAoZmlsbC1yZWdpb24gYmVnIGVuZCBqdXN0aWZ5KSkpCi0MCi0oZGVmdmFyIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1oZWFkZXItcmVnZXhwCi0gICJeXFwoW0EtWl1bQS1aXyBdKltBLVpfXVxcfFstX2EtekEtWl0rXFwpWyBcdF0qWzo9XSIKLSAgIipIZXVyaXN0aWMgcmVnZXhwIHVzZWQgYnkgYGFkZC1sb2ctY3VycmVudC1kZWZ1bicgZm9yIHVua25vd24gbWFqb3IgbW9kZXMuIikKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBhZGQtbG9nLWN1cnJlbnQtZGVmdW4gKCkKLSAgIlJldHVybiBuYW1lIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gcG9pbnQgaXMgaW4sIG9yIG5pbC4KLQotVW5kZXJzdGFuZHMgQywgTGlzcCwgTGFUZVggKFwiZnVuY3Rpb25zXCIgYXJlIGNoYXB0ZXJzLCBzZWN0aW9ucywgLi4uKSwKLVRleGluZm8gKEBub2RlIHRpdGxlcyksIFBlcmwsIGFuZCBGb3J0cmFuLgotCi1PdGhlciBtb2RlcyBhcmUgaGFuZGxlZCBieSBhIGhldXJpc3RpYyB0aGF0IGxvb2tzIGluIHRoZSAxMEsgYmVmb3JlCi1wb2ludCBmb3IgdXBwZXJjYXNlIGhlYWRpbmdzIHN0YXJ0aW5nIGluIHRoZSBmaXJzdCBjb2x1bW4gb3IKLWlkZW50aWZpZXJzIGZvbGxvd2VkIGJ5IGA6JyBvciBgPScsIHNlZSB2YXJpYWJsZQotYGFkZC1sb2ctY3VycmVudC1kZWZ1bi1oZWFkZXItcmVnZXhwJy4KLQotSGFzIGEgcHJlZmVyZW5jZSBvZiBsb29raW5nIGJhY2t3YXJkcy4iCi0gIChjb25kaXRpb24tY2FzZSBuaWwKLSAgICAgIChzYXZlLWV4Y3Vyc2lvbgotCShsZXQgKChsb2NhdGlvbiAocG9pbnQpKSkKLQkgIChjb25kICgobWVtcSBtYWpvci1tb2RlICcoZW1hY3MtbGlzcC1tb2RlIGxpc3AtbW9kZSBzY2hlbWUtbW9kZQotCQkJCQkJICAgIGxpc3AtaW50ZXJhY3Rpb24tbW9kZSkpCi0JCSA7OyBJZiB3ZSBhcmUgbm93IHByZWNpc2VseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZGVmdW4sCi0JCSA7OyBtYWtlIHN1cmUgYmVnaW5uaW5nLW9mLWRlZnVuIGZpbmRzIHRoYXQgb25lCi0JCSA7OyByYXRoZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lLgotCQkgKG9yIChlb2JwKSAoZm9yd2FyZC1jaGFyIDEpKQotCQkgKGJlZ2lubmluZy1vZi1kZWZ1bikKLQkJIDs7IE1ha2Ugc3VyZSB3ZSBhcmUgcmVhbGx5IGluc2lkZSB0aGUgZGVmdW4gZm91bmQsIG5vdCBhZnRlciBpdC4KLQkJIChpZiAoYW5kIChsb29raW5nLWF0ICJcXHMoIikKLQkJCSAgKHByb2duIChlbmQtb2YtZGVmdW4pCi0JCQkJICg8IGxvY2F0aW9uIChwb2ludCkpKQotCQkJICAocHJvZ24gKGZvcndhcmQtc2V4cCAtMSkKLQkJCQkgKD49IGxvY2F0aW9uIChwb2ludCkpKSkKLQkJICAgICAocHJvZ24KLQkJICAgICAgIChpZiAobG9va2luZy1hdCAiXFxzKCIpCi0JCQkgICAoZm9yd2FyZC1jaGFyIDEpKQotCQkgICAgICAgKGZvcndhcmQtc2V4cCAxKQotCQkgICAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiICciKQotCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQotCQkJCQkgKHByb2duIChmb3J3YXJkLXNleHAgMSkgKHBvaW50KSkpKSkpCi0JCSgoYW5kIChtZW1xIG1ham9yLW1vZGUgJyhjLW1vZGUgYysrLW1vZGUgYysrLWMtbW9kZSBvYmpjLW1vZGUpKQotCQkgICAgICAoc2F2ZS1leGN1cnNpb24gKGJlZ2lubmluZy1vZi1saW5lKQotCQkJCSAgICAgIDs7IFVzZSBlcSBpbnN0ZWFkIG9mID0gaGVyZSB0byBhdm9pZAotCQkJCSAgICAgIDs7IGVycm9yIHdoZW4gYXQgYm9iIGFuZCBjaGFyLWFmdGVyCi0JCQkJICAgICAgOzsgcmV0dXJucyBuaWwuCi0JCQkJICAgICAgKHdoaWxlIChlcSAoY2hhci1hZnRlciAoLSAocG9pbnQpIDIpKSA/XFwpCi0JCQkJCShmb3J3YXJkLWxpbmUgLTEpKQotCQkJCSAgICAgIChsb29raW5nLWF0ICJbIFx0XSojWyBcdF0qZGVmaW5lWyBcdF0iKSkpCi0JCSA7OyBIYW5kbGUgYSBDIG1hY3JvIGRlZmluaXRpb24uCi0JCSAoYmVnaW5uaW5nLW9mLWxpbmUpCi0JCSAod2hpbGUgKGVxIChjaGFyLWFmdGVyICgtIChwb2ludCkgMikpID9cXCkgO25vdCA9OyBub3RlIGFib3ZlCi0JCSAgIChmb3J3YXJkLWxpbmUgLTEpKQotCQkgKHNlYXJjaC1mb3J3YXJkICJkZWZpbmUiKQotCQkgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKLQkJIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkKLQkJCQkgICAocHJvZ24gKGZvcndhcmQtc2V4cCAxKSAocG9pbnQpKSkpCi0JCSgobWVtcSBtYWpvci1tb2RlICcoYy1tb2RlIGMrKy1tb2RlIGMrKy1jLW1vZGUgb2JqYy1tb2RlKSkKLQkJIChiZWdpbm5pbmctb2YtbGluZSkKLQkJIDs7IFNlZSBpZiB3ZSBhcmUgaW4gdGhlIGJlZ2lubmluZyBwYXJ0IG9mIGEgZnVuY3Rpb24sCi0JCSA7OyBiZWZvcmUgdGhlIG9wZW4gYnJhY2UuICBJZiBzbywgYWR2YW5jZSBmb3J3YXJkLgotCQkgKHdoaWxlIChub3QgKGxvb2tpbmctYXQgIntcXHxcXChcXHMgKiRcXCkiKSkKLQkJICAgKGZvcndhcmQtbGluZSAxKSkKLQkJIChvciAoZW9icCkKLQkJICAgICAoZm9yd2FyZC1jaGFyIDEpKQotCQkgKGJlZ2lubmluZy1vZi1kZWZ1bikKLQkJIChpZiAocHJvZ24gKGVuZC1vZi1kZWZ1bikKLQkJCSAgICAoPCBsb2NhdGlvbiAocG9pbnQpKSkKLQkJICAgICAocHJvZ24KLQkJICAgICAgIChiYWNrd2FyZC1zZXhwIDEpCi0JCSAgICAgICAobGV0IChiZWcgdGVtKQotCi0JCQkgKGZvcndhcmQtbGluZSAtMSkKLQkJCSA7OyBTa2lwIGJhY2sgb3ZlciB0eXBlZGVmcyBvZiBhcmdsaXN0LgotCQkJICh3aGlsZSAoYW5kIChub3QgKGJvYnApKQotCQkJCSAgICAgKGxvb2tpbmctYXQgIlsgXHRcbl0iKSkKLQkJCSAgIChmb3J3YXJkLWxpbmUgLTEpKQotCQkJIDs7IFNlZSBpZiB0aGlzIGlzIHVzaW5nIHRoZSBERUZVTiBtYWNybyB1c2VkIGluIEVtYWNzLAotCQkJIDs7IG9yIHRoZSBERUZVTiBtYWNybyB1c2VkIGJ5IHRoZSBDIGxpYnJhcnkuCi0JCQkgKGlmIChjb25kaXRpb24tY2FzZSBuaWwKLQkJCQkgKGFuZCAoc2F2ZS1leGN1cnNpb24KLQkJCQkJKGVuZC1vZi1saW5lKQotCQkJCQkod2hpbGUgKD0gKHByZWNlZGluZy1jaGFyKSA/XFwpCi0JCQkJCSAgKGVuZC1vZi1saW5lIDIpKQotCQkJCQkoYmFja3dhcmQtc2V4cCAxKQotCQkJCQkoYmVnaW5uaW5nLW9mLWxpbmUpCi0JCQkJCShzZXRxIHRlbSAocG9pbnQpKQotCQkJCQkobG9va2luZy1hdCAiREVGVU5cXGIiKSkKLQkJCQkgICAgICAoPj0gbG9jYXRpb24gdGVtKSkKLQkJCSAgICAgICAoZXJyb3IgbmlsKSkKLQkJCSAgICAgKHByb2duCi0JCQkgICAgICAgKGdvdG8tY2hhciB0ZW0pCi0JCQkgICAgICAgKGRvd24tbGlzdCAxKQotCQkJICAgICAgIChpZiAoPSAoY2hhci1hZnRlciAocG9pbnQpKSA/XCIpCi0JCQkJICAgKHByb2duCi0JCQkJICAgICAoZm9yd2FyZC1zZXhwIDEpCi0JCQkJICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICIgLCIpKSkKLQkJCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpCi0JCQkJCQkgKHByb2duIChmb3J3YXJkLXNleHAgMSkgKHBvaW50KSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChsb29raW5nLWF0ICJeWystXSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldC1tZXRob2QtZGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgT3JkaW5hcnkgQyBmdW5jdGlvbiBzeW50YXguCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIGJlZyAocG9pbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGFuZCAoY29uZGl0aW9uLWNhc2UgbmlsCi0JCQkJCSAgOzsgUHJvdGVjdCBhZ2FpbnN0ICJVbmJhbGFuY2VkIHBhcmVucyIgZXJyb3IuCi0JCQkJCSAgKHByb2duCi0JCQkJCSAgICAoZG93bi1saXN0IDEpIDsgaW50byBhcmdsaXN0Ci0JCQkJCSAgICAoYmFja3dhcmQtdXAtbGlzdCAxKQotCQkJCQkgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdCIpCi0JCQkJCSAgICB0KQotCQkJCQkoZXJyb3IgbmlsKSkKLQkJCQkgICAgICA7OyBWZXJpZnkgaW5pdGlhbCBwb3Mgd2FzIGFmdGVyCi0JCQkJICAgICAgOzsgcmVhbCBzdGFydCBvZiBmdW5jdGlvbi4KLQkJCQkgICAgICAoc2F2ZS1leGN1cnNpb24KLQkJCQkJKGdvdG8tY2hhciBiZWcpCi0JCQkJCTs7IEZvciB0aGlzIHB1cnBvc2UsIGluY2x1ZGUgdGhlIGxpbmUKLQkJCQkJOzsgdGhhdCBoYXMgdGhlIGRlY2wga2V5d29yZHMuICBUaGlzCi0JCQkJCTs7IG1heSBhbHNvIGluY2x1ZGUgc29tZSBvZiB0aGUKLQkJCQkJOzsgY29tbWVudHMgYmVmb3JlIHRoZSBmdW5jdGlvbi4KLQkJCQkJKHdoaWxlIChhbmQgKG5vdCAoYm9icCkpCi0JCQkJCQkgICAgKHNhdmUtZXhjdXJzaW9uCi0JCQkJCQkgICAgICAoZm9yd2FyZC1saW5lIC0xKQotCQkJCQkJICAgICAgKGxvb2tpbmctYXQgIlteXG5cZl0iKSkpCi0JCQkJCSAgKGZvcndhcmQtbGluZSAtMSkpCi0JCQkJCSg+PSBsb2NhdGlvbiAocG9pbnQpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IENvbnNpc3RlbmN5IGNoZWNrOiBnb2luZyBkb3duIGFuZCB1cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgc2hvdWxkbid0IHRha2UgdXMgYmFjayBiZWZvcmUgQkVHLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD4gKHBvaW50KSBiZWcpKQotCQkJCSAobGV0IChlbmQgbWlkZGxlKQotCQkJCSAgIDs7IERvbid0IGluY2x1ZGUgYW55IGZpbmFsIG5ld2xpbmUKLQkJCQkgICA7OyBpbiB0aGUgbmFtZSB3ZSB1c2UuCi0JCQkJICAgKGlmICg9IChwcmVjZWRpbmctY2hhcikgP1xuKQotCQkJCSAgICAgICAoZm9yd2FyZC1jaGFyIC0xKSkKLQkJCQkgICAoc2V0cSBlbmQgKHBvaW50KSkKLQkJCQkgICAoYmFja3dhcmQtc2V4cCAxKQotCQkJCSAgIDs7IE5vdyBmaW5kIHRoZSByaWdodCBiZWdpbm5pbmcgb2YgdGhlIG5hbWUuCi0JCQkJICAgOzsgSW5jbHVkZSBjZXJ0YWluIGtleXdvcmRzIGlmIHRoZXkKLQkJCQkgICA7OyBwcmVjZWRlIHRoZSBuYW1lLgotCQkJCSAgIChzZXRxIG1pZGRsZSAocG9pbnQpKQotCQkJCSAgIChmb3J3YXJkLXdvcmQgLTEpCi0JCQkJICAgOzsgSWdub3JlIHRoZXNlIHN1YnBhcnRzIG9mIGEgY2xhc3MgZGVjbAotCQkJCSAgIDs7IGFuZCBtb3ZlIGJhY2sgdG8gdGhlIGNsYXNzIG5hbWUgaXRzZWxmLgotCQkJCSAgICh3aGlsZSAobG9va2luZy1hdCAicHVibGljIFxcfHByaXZhdGUgIikKLQkJCQkgICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQ6IikKLQkJCQkgICAgIChzZXRxIGVuZCAocG9pbnQpKQotCQkJCSAgICAgKGJhY2t3YXJkLXNleHAgMSkKLQkJCQkgICAgIChzZXRxIG1pZGRsZSAocG9pbnQpKQotCQkJCSAgICAgKGZvcndhcmQtd29yZCAtMSkpCi0JCQkJICAgKGFuZCAoYm9scCkKLQkJCQkJKGxvb2tpbmctYXQgInN0cnVjdCBcXHx1bmlvbiBcXHxjbGFzcyAiKQotCQkJCQkoc2V0cSBtaWRkbGUgKHBvaW50KSkpCi0JCQkJICAgKGJ1ZmZlci1zdWJzdHJpbmcgbWlkZGxlIGVuZCkpKSkpKSkpKQotCQkoKG1lbXEgbWFqb3ItbW9kZQotCQkgICAgICAgJyhUZVgtbW9kZSBwbGFpbi1UZVgtbW9kZSBMYVRlWC1tb2RlOzsgdGV4LW1vZGUuZWwKLQkJCQkgIHBsYWluLXRleC1tb2RlIGxhdGV4LW1vZGU7OyBjbXV0ZXguZWwKLQkJCQkgICkpCi0JCSAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZAotCQkgICAgICAiXFxcXFxcKHN1YlxcKSpcXChzZWN0aW9uXFx8cGFyYWdyYXBoXFx8Y2hhcHRlclxcKSIgbmlsIHQpCi0JCSAgICAgKHByb2duCi0JCSAgICAgICAoZ290by1jaGFyIChtYXRjaC1iZWdpbm5pbmcgMCkpCi0JCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAoMSsgKHBvaW50KSk7OyB3aXRob3V0IGluaXRpYWwgYmFja3NsYXNoCi0JCQkJCSAocHJvZ24KLQkJCQkJICAgKGVuZC1vZi1saW5lKQotCQkJCQkgICAocG9pbnQpKSkpKSkKLQkJKChlcSBtYWpvci1tb2RlICd0ZXhpbmZvLW1vZGUpCi0JCSAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZCAiXkBub2RlWyBcdF0rXFwoW14sXG5dK1xcKSIgbmlsIHQpCi0JCSAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKQotCQkJCSAgICAgICAobWF0Y2gtZW5kIDEpKSkpCi0JCSgoZXEgbWFqb3ItbW9kZSAncGVybC1tb2RlKQotCQkgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgIl5zdWJbIFx0XStcXChbXiBcdFxuXStcXCkiIG5pbCB0KQotCQkgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkKLQkJCQkgICAgICAgKG1hdGNoLWVuZCAxKSkpKQotICAgICAgICAgICAgICAgICgoZXEgbWFqb3ItbW9kZSAnZm9ydHJhbi1tb2RlKQotICAgICAgICAgICAgICAgICA7OyBtdXN0IGJlIGluc2lkZSBmdW5jdGlvbiBib2R5IGZvciB0aGlzIHRvIHdvcmsKLSAgICAgICAgICAgICAgICAgKGJlZ2lubmluZy1vZi1mb3J0cmFuLXN1YnByb2dyYW0pCi0gICAgICAgICAgICAgICAgIChsZXQgKChjYXNlLWZvbGQtc2VhcmNoIHQpKSA7IGNhc2UtaW5zZW5zaXRpdmUKLSAgICAgICAgICAgICAgICAgICA7OyBzZWFyY2ggZm9yIGZvcnRyYW4gc3VicHJvZ3JhbSBzdGFydAotICAgICAgICAgICAgICAgICAgIChpZiAocmUtc2VhcmNoLWZvcndhcmQKLQkJCSAiXlsgXHRdKlxcKHByb2dyYW1cXHxzdWJyb3V0aW5lXFx8ZnVuY3Rpb25cCi1cXHxbIFx0YS16MC05Kl0qWyBcdF0rZnVuY3Rpb25cXCkiCi0JCQkgbmlsIHQpCi0gICAgICAgICAgICAgICAgICAgICAgIChwcm9nbgotICAgICAgICAgICAgICAgICAgICAgICAgIDs7IG1vdmUgdG8gRU9MIG9yIGJlZm9yZSBmaXJzdCBsZWZ0IHBhcmVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChyZS1zZWFyY2gtZm9yd2FyZCAiWyhcbl0iIG5pbCB0KQotCQkJICAgICAocHJvZ24gKGZvcndhcmQtY2hhciAtMSkKLQkJCQkgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdCIpKQotCQkJICAgKGVuZC1vZi1saW5lKSkKLQkJCSA7OyBVc2UgdGhlIG5hbWUgcHJlY2VkaW5nIHRoYXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9nbiAoZm9yd2FyZC1zZXhwIC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnQpKSkpKSkpCi0JCSh0Ci0JCSA7OyBJZiBhbGwgZWxzZSBmYWlscywgdHJ5IGhldXJpc3RpY3MKLQkJIChsZXQgKGNhc2UtZm9sZC1zZWFyY2gpCi0JCSAgIChlbmQtb2YtbGluZSkKLQkJICAgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWhlYWRlci1yZWdleHAKLQkJCQkJICAgKC0gKHBvaW50KSAxMDAwMCkKLQkJCQkJICAgdCkKLQkJICAgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkKLQkJCQkJIChtYXRjaC1lbmQgMSkpKSkpKSkpCi0gICAgKGVycm9yIG5pbCkpKQotCi0oZGVmdmFyIGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCkKLQotOzsgU3Vicm91dGluZSB1c2VkIHdpdGhpbiBnZXQtbWV0aG9kLWRlZmluaXRpb24uCi07OyBBZGQgdGhlIGxhc3QgbWF0Y2ggaW4gdGhlIGJ1ZmZlciB0byB0aGUgZW5kIG9mIGBtZCcsCi07OyBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIEVORDsgbW92ZSB0byB0aGUgZW5kIG9mIHRoYXQgbWF0Y2guCi0oZGVmdW4gZ2V0LW1ldGhvZC1kZWZpbml0aW9uLTEgKGVuZCkKLSAgKHNldHEgZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kCi0JKGNvbmNhdCBnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQgCi0JCShidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkKLQkJZW5kKSkKLSAgKGdvdG8tY2hhciAobWF0Y2gtZW5kIDApKSkKLQotOzsgRm9yIG9iamVjdGl2ZSBDLCByZXR1cm4gdGhlIG1ldGhvZCBuYW1lIGlmIHdlIGFyZSBpbiBhIG1ldGhvZC4KLShkZWZ1biBnZXQtbWV0aG9kLWRlZmluaXRpb24gKCkKLSAgKGxldCAoKGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCAiWyIpKQotICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgIl5AaW1wbGVtZW50YXRpb25cXHMtKlxcKFtBLVphLXpfXSpcXCkiIG5pbCB0KQotCSAgKGdldC1tZXRob2QtZGVmaW5pdGlvbi0xICIgIikpKQotICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgKGNvbmQKLSAgICAgICAoKHJlLXNlYXJjaC1mb3J3YXJkICJeXFwoWy0rXVxcKVsgXHRcblxmXHJdKlxcKChbXildKilcXCk/XFxzLSoiIG5pbCB0KQotCShnZXQtbWV0aG9kLWRlZmluaXRpb24tMSAiIikKLQkod2hpbGUgKG5vdCAobG9va2luZy1hdCAiW3s7XSIpKQotCSAgKGxvb2tpbmctYXQKLQkgICAiXFwoW0EtWmEtel9dKjo/XFwpXFxzLSpcXCgoW14pXSopXFwpP1tBLVphLXpfXSpbIFx0XG5cZlxyXSoiKQotCSAgKGdldC1tZXRob2QtZGVmaW5pdGlvbi0xICIiKSkKLQkoY29uY2F0IGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCAiXSIpKSkpKSkKLQotCi0ocHJvdmlkZSAnYWRkLWxvZykKLQotOzs7IGFkZC1sb2cuZWwgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9ldGMvYWRkLWxvZy52aSBiL2V0Yy9hZGQtbG9nLnZpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI4Yzc3Li4wMDAwMDAwCi0tLSBhL2V0Yy9hZGQtbG9nLnZpCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmVpbiBiL2V0Yy9jb25maWdidWlsZC5laW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMGUyMTQuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLmVpbgorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0lIVBTLUFkb2JlLTIuMCBFUFNGLTIuMAotJSVUaXRsZTogY29uZmlnYnVpbGQuZmlnCi0lJUNyZWF0b3I6IGZpZzJkZXYgVmVyc2lvbiAzLjEgUGF0Y2hsZXZlbCAxCi0lJUNyZWF0aW9uRGF0ZTogRnJpIEp1biAxMiAyMDoxMzoxNiAxOTk4Ci0lJUZvcjogaWFuQHRpdG8uY3lnbnVzLmNvbSAoSWFuIExhbmNlIFRheWxvcikKLSUlT3JpZW50YXRpb246IFBvcnRyYWl0Ci0lJUJvdW5kaW5nQm94OiAwIDAgMzIyIDE3MwotJSVQYWdlczogMAotJSVCZWdpblNldHVwCi0lJUluY2x1ZGVGZWF0dXJlOiAqUGFnZVNpemUgTGV0dGVyCi0lJUVuZFNldHVwCi0lJUVuZENvbW1lbnRzCi0vJEYycHNEaWN0IDIwMCBkaWN0IGRlZgotJEYycHNEaWN0IGJlZ2luCi0kRjJwc0RpY3QgL210cnggbWF0cml4IHB1dAotL2NvbC0xIHt9IGRlZgotL2NvbDAgezAuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMSB7MC4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyIHswLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDMgezAuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNCB7MS4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w1IHsxLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDYgezEuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNyB7MS4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w4IHswLjAwMCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDkgezAuMDAwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTAgezAuMDAwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTEgezAuNTMwIDAuODEwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTIgezAuMDAwIDAuNTYwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTMgezAuMDAwIDAuNjkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTQgezAuMDAwIDAuODIwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTUgezAuMDAwIDAuNTYwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTYgezAuMDAwIDAuNjkwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTcgezAuMDAwIDAuODIwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTggezAuNTYwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTkgezAuNjkwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjAgezAuODIwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjEgezAuNTYwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjIgezAuNjkwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjMgezAuODIwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjQgezAuNTAwIDAuMTkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjUgezAuNjMwIDAuMjUwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjYgezAuNzUwIDAuMzgwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjcgezEuMDAwIDAuNTAwIDAuNTAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjggezEuMDAwIDAuNjMwIDAuNjMwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjkgezEuMDAwIDAuNzUwIDAuNzUwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzAgezEuMDAwIDAuODgwIDAuODgwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzEgezEuMDAwIDAuODQwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0KLWVuZAotc2F2ZQotLTYyLjAgMjI2LjAgdHJhbnNsYXRlCi0xIC0xIHNjYWxlCi0KLS9jbHAge2Nsb3NlcGF0aH0gYmluZCBkZWYKLS9lZiB7ZW9maWxsfSBiaW5kIGRlZgotL2dyIHtncmVzdG9yZX0gYmluZCBkZWYKLS9ncyB7Z3NhdmV9IGJpbmQgZGVmCi0vbCB7bGluZXRvfSBiaW5kIGRlZgotL20ge21vdmV0b30gYmluZCBkZWYKLS9uIHtuZXdwYXRofSBiaW5kIGRlZgotL3Mge3N0cm9rZX0gYmluZCBkZWYKLS9zbGMge3NldGxpbmVjYXB9IGJpbmQgZGVmCi0vc2xqIHtzZXRsaW5lam9pbn0gYmluZCBkZWYKLS9zbHcge3NldGxpbmV3aWR0aH0gYmluZCBkZWYKLS9zcmdiIHtzZXRyZ2Jjb2xvcn0gYmluZCBkZWYKLS9yb3Qge3JvdGF0ZX0gYmluZCBkZWYKLS9zYyB7c2NhbGV9IGJpbmQgZGVmCi0vdHIge3RyYW5zbGF0ZX0gYmluZCBkZWYKLS90bnQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkIHNyZ2J9Ci0gIGJpbmQgZGVmCi0vc2hkIHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvciA0IC0yIHJvbGwgbXVsIDQgLTIgcm9sbCBtdWwKLSAgNCAtMiByb2xsIG11bCBzcmdifSBiaW5kIGRlZgotLyRGMnBzQmVnaW4geyRGMnBzRGljdCBiZWdpbiAvJEYycHNFbnRlcmVkU3RhdGUgc2F2ZSBkZWZ9IGRlZgotLyRGMnBzRW5kIHskRjJwc0VudGVyZWRTdGF0ZSByZXN0b3JlIGVuZH0gZGVmCi0lJUVuZFByb2xvZwotCi0kRjJwc0JlZ2luCi0xMCBzZXRtaXRlcmxpbWl0Ci0gMC4wNjAwMCAwLjA2MDAwIHNjCi03LjUwMCBzbHcKLSUgUG9seWxpbmUKLW4gMTA1MCA5MDAgbSAyMTAwIDkwMCBsICAyMTAwIDE0MjUgbCAgMTA1MCAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMTUwMCAxNDI1IG0gMTUwMCAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE1MzAuMDAgMTk4MC4wMCBtIDE1MDAuMDAgMjEwMC4wMCBsIDE0NzAuMDAgMTk4MC4wMCBsICAxNTAwLjUwIDE5ODAuNTAgbCAxNTMwLjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMTUwMCAyNjI1IG0gMTUwMCAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE1MzAuMDAgMzE4MC4wMCBtIDE1MDAuMDAgMzMwMC4wMCBsIDE0NzAuMDAgMzE4MC4wMCBsICAxNTAwLjUwIDMxODAuNTAgbCAxNTMwLjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMjkyNSA5MDAgbSAzODI1IDkwMCBsICAzODI1IDE0MjUgbCAgMjkyNSAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMTE1NSAyMTAwIG0gMTA1MCAyMTAwIDEwNTAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMTA1MCAyNjI1IDIyMjAgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjMyNSAyNjI1IDIzMjUgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjMyNSAyMTAwIDExNTUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAyODUwIDIxMDAgbSA0MTI1IDIxMDAgbCAgNDEyNSAyNjI1IGwgIDI4NTAgMjYyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDMzNzUgMTQyNSBtIDMzNzUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiAzNDA1LjAwIDE5ODAuMDAgbSAzMzc1LjAwIDIxMDAuMDAgbCAzMzQ1LjAwIDE5ODAuMDAgbCAgMzM3NS41MCAxOTgwLjUwIGwgMzQwNS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDUxMDAgOTAwIG0gNjMwMCA5MDAgbCAgNjMwMCAxMzUwIGwgIDUxMDAgMTM1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU2MjUgMTM1MCBtIDU2MjUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiA1NjU1LjAwIDE5ODAuMDAgbSA1NjI1LjAwIDIxMDAuMDAgbCA1NTk1LjAwIDE5ODAuMDAgbCAgNTYyNS41MCAxOTgwLjUwIGwgNTY1NS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDUyMDUgMjEwMCBtIDUxMDAgMjEwMCA1MTAwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDUxMDAgMjYyNSA2MjcwIDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDYzNzUgMjYyNSA2Mzc1IDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDYzNzUgMjEwMCA1MjA1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTYyNSAyNjI1IG0gNTYyNSAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU2NTUuMDAgMzE4MC4wMCBtIDU2MjUuMDAgMzMwMC4wMCBsIDU1OTUuMDAgMzE4MC4wMCBsICA1NjI1LjUwIDMxODAuNTAgbCA1NjU1LjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNTEwMCAzMzAwIG0gNjIyNSAzMzAwIGwgIDYyMjUgMzc1MCBsICA1MTAwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotCVsxIDUwLjBdIDUwLjAwMDAwMCBzZXRkYXNoCi1uIDI4NTAgMjQwMCBtIDIzMjUgMjQwMCBsICBncyBjb2wtMSBzIGdyIAlbXSAwIHNldGRhc2gKLW4gMjQ0NS4wMCAyNDMwLjAwIG0gMjMyNS4wMCAyNDAwLjAwIGwgMjQ0NS4wMCAyMzcwLjAwIGwgIDI0NDUuNTAgMjQwMC41MCBsIDI0NDUuMDAgMjQzMC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotCVsxIDUwLjBdIDUwLjAwMDAwMCBzZXRkYXNoCi1uIDQxMjUgMjQwMCBtIDUxMDAgMjQwMCBsICBncyBjb2wtMSBzIGdyIAlbXSAwIHNldGRhc2gKLW4gNDk4MC4wMCAyMzcwLjAwIG0gNTEwMC4wMCAyNDAwLjAwIGwgNDk4MC4wMCAyNDMwLjAwIGwgIDQ5ODAuNTAgMjQwMC41MCBsIDQ5ODAuMDAgMjM3MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxMDUwIDMzMDAgbSAxOTUwIDMzMDAgbCAgMTk1MCAzNzUwIGwgIDEwNTAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlndXJlKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDI0MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLnN0YXR1cykgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAyNDAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5zdGF0dXMpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMzYwMCBtCi1ncyAxIC0xIHNjIChjb25maWcuaCkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTI1MCAxMjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01MjUwIDI0MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLnN0YXR1cykgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTI1MCAzNjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlKSBjb2wtMSBzaG93IGdyCi0kRjJwc0VuZAotcmVzdG9yZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmZpZyBiL2V0Yy9jb25maWdidWlsZC5maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzU5MmQuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLmZpZworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSNGSUcgMy4xCi1Qb3J0cmFpdAotQ2VudGVyCi1JbmNoZXMKLTEyMDAgMgotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAxMDUwIDkwMCAyMTAwIDkwMCAyMTAwIDE0MjUgMTA1MCAxNDI1IDEwNTAgOTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxNTAwIDE0MjUgMTUwMCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxNTAwIDI2MjUgMTUwMCAzMzAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDI5MjUgOTAwIDM4MjUgOTAwIDM4MjUgMTQyNSAyOTI1IDE0MjUgMjkyNSA5MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgMjMyNSAyNjI1IDIzMjUgMjEwMCAxMDUwIDIxMDAgMTA1MCAyNjI1IDIzMjUgMjYyNQotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAyODUwIDIxMDAgNDEyNSAyMTAwIDQxMjUgMjYyNSAyODUwIDI2MjUgMjg1MCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzc1IDE0MjUgMzM3NSAyMTAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDUxMDAgOTAwIDYzMDAgOTAwIDYzMDAgMTM1MCA1MTAwIDEzNTAgNTEwMCA5MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDU2MjUgMTM1MCA1NjI1IDIxMDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgNjM3NSAyNjI1IDYzNzUgMjEwMCA1MTAwIDIxMDAgNTEwMCAyNjI1IDYzNzUgMjYyNQotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNTYyNSAyNjI1IDU2MjUgMzMwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1MTAwIDMzMDAgNjIyNSAzMzAwIDYyMjUgMzc1MCA1MTAwIDM3NTAgNTEwMCAzMzAwCi0yIDEgMiAxIC0xIDcgMCAwIC0xIDMuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAyODUwIDI0MDAgMjMyNSAyNDAwCi0yIDEgMiAxIC0xIDcgMCAwIC0xIDMuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MTI1IDI0MDAgNTEwMCAyNDAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDEwNTAgMzMwMCAxOTUwIDMzMDAgMTk1MCAzNzUwIDEwNTAgMzc1MCAxMDUwIDMzMDAKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNjQ1IDEyMDAgMTIwMCBjb25maWcuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDcwNSAzMDAwIDEyMDAgY29uZmlndXJlXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA5OTAgMzAwMCAyNDAwIGNvbmZpZy5zdGF0dXNcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDk5MCAxMjAwIDI0MDAgY29uZmlnLnN0YXR1c1wwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNjAwIDEyMDAgMzYwMCBjb25maWcuaFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODU1IDUyNTAgMTIwMCBNYWtlZmlsZS5pblwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgOTkwIDUyNTAgMjQwMCBjb25maWcuc3RhdHVzXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA2NzUgNTI1MCAzNjAwIE1ha2VmaWxlXDAwMQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmppbiBiL2V0Yy9jb25maWdidWlsZC5qaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Y2Q5MzkuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLmppbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC50aW4gYi9ldGMvY29uZmlnYnVpbGQudGluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRkNmZlLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdidWlsZC50aW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSAgIGNvbmZpZy5pbiAgICAgICAgKmNvbmZpZ3VyZSogICAgICBNYWtlZmlsZS5pbgotICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gICAqY29uZmlnLnN0YXR1cyo8PT09PT09Kz09PT09PT09PT0+KmNvbmZpZy5zdGF0dXMqCi0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdgotICAgY29uZmlnLmggICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmVpbiBiL2V0Yy9jb25maWdkZXYuZWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjgzNzg1Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYuZWluCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLSUhUFMtQWRvYmUtMi4wIEVQU0YtMi4wCi0lJVRpdGxlOiBjb25maWdkZXYuZmlnCi0lJUNyZWF0b3I6IGZpZzJkZXYgVmVyc2lvbiAzLjEgUGF0Y2hsZXZlbCAxCi0lJUNyZWF0aW9uRGF0ZTogTW9uIEp1biAxNSAxNzozNToxOSAxOTk4Ci0lJUZvcjogaWFuQHRpdG8uY3lnbnVzLmNvbSAoSWFuIExhbmNlIFRheWxvcikKLSUlT3JpZW50YXRpb246IFBvcnRyYWl0Ci0lJUJvdW5kaW5nQm94OiAwIDAgMzQ0IDMxNwotJSVQYWdlczogMAotJSVCZWdpblNldHVwCi0lJUluY2x1ZGVGZWF0dXJlOiAqUGFnZVNpemUgTGV0dGVyCi0lJUVuZFNldHVwCi0lJUVuZENvbW1lbnRzCi0vJEYycHNEaWN0IDIwMCBkaWN0IGRlZgotJEYycHNEaWN0IGJlZ2luCi0kRjJwc0RpY3QgL210cnggbWF0cml4IHB1dAotL2NvbC0xIHt9IGRlZgotL2NvbDAgezAuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMSB7MC4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyIHswLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDMgezAuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNCB7MS4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w1IHsxLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDYgezEuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNyB7MS4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w4IHswLjAwMCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDkgezAuMDAwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTAgezAuMDAwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTEgezAuNTMwIDAuODEwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTIgezAuMDAwIDAuNTYwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTMgezAuMDAwIDAuNjkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTQgezAuMDAwIDAuODIwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTUgezAuMDAwIDAuNTYwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTYgezAuMDAwIDAuNjkwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTcgezAuMDAwIDAuODIwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTggezAuNTYwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTkgezAuNjkwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjAgezAuODIwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjEgezAuNTYwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjIgezAuNjkwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjMgezAuODIwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjQgezAuNTAwIDAuMTkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjUgezAuNjMwIDAuMjUwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjYgezAuNzUwIDAuMzgwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjcgezEuMDAwIDAuNTAwIDAuNTAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjggezEuMDAwIDAuNjMwIDAuNjMwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjkgezEuMDAwIDAuNzUwIDAuNzUwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzAgezEuMDAwIDAuODgwIDAuODgwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzEgezEuMDAwIDAuODQwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0KLWVuZAotc2F2ZQotLTYyLjAgMzcwLjAgdHJhbnNsYXRlCi0xIC0xIHNjYWxlCi0KLS9jbHAge2Nsb3NlcGF0aH0gYmluZCBkZWYKLS9lZiB7ZW9maWxsfSBiaW5kIGRlZgotL2dyIHtncmVzdG9yZX0gYmluZCBkZWYKLS9ncyB7Z3NhdmV9IGJpbmQgZGVmCi0vbCB7bGluZXRvfSBiaW5kIGRlZgotL20ge21vdmV0b30gYmluZCBkZWYKLS9uIHtuZXdwYXRofSBiaW5kIGRlZgotL3Mge3N0cm9rZX0gYmluZCBkZWYKLS9zbGMge3NldGxpbmVjYXB9IGJpbmQgZGVmCi0vc2xqIHtzZXRsaW5lam9pbn0gYmluZCBkZWYKLS9zbHcge3NldGxpbmV3aWR0aH0gYmluZCBkZWYKLS9zcmdiIHtzZXRyZ2Jjb2xvcn0gYmluZCBkZWYKLS9yb3Qge3JvdGF0ZX0gYmluZCBkZWYKLS9zYyB7c2NhbGV9IGJpbmQgZGVmCi0vdHIge3RyYW5zbGF0ZX0gYmluZCBkZWYKLS90bnQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkIHNyZ2J9Ci0gIGJpbmQgZGVmCi0vc2hkIHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvciA0IC0yIHJvbGwgbXVsIDQgLTIgcm9sbCBtdWwKLSAgNCAtMiByb2xsIG11bCBzcmdifSBiaW5kIGRlZgotLyRGMnBzQmVnaW4geyRGMnBzRGljdCBiZWdpbiAvJEYycHNFbnRlcmVkU3RhdGUgc2F2ZSBkZWZ9IGRlZgotLyRGMnBzRW5kIHskRjJwc0VudGVyZWRTdGF0ZSByZXN0b3JlIGVuZH0gZGVmCi0lJUVuZFByb2xvZwotCi0kRjJwc0JlZ2luCi0xMCBzZXRtaXRlcmxpbWl0Ci0gMC4wNjAwMCAwLjA2MDAwIHNjCi03LjUwMCBzbHcKLSUgUG9seWxpbmUKLW4gMTA1MCA5MDAgbSAyMTAwIDkwMCBsICAyMTAwIDE0MjUgbCAgMTA1MCAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMjkyNSA5MDAgbSAzOTc1IDkwMCBsICAzOTc1IDE0MjUgbCAgMjkyNSAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTU1MCA5MDAgbSA2NzUwIDkwMCBsICA2NzUwIDEzNTAgbCAgNTU1MCAxMzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMzc1MCAxODAwIG0gNTAyNSAxODAwIGwgIDUwMjUgMjI1MCBsICAzNzUwIDIyNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAxMTU1IDIxMDAgbSAxMDUwIDIxMDAgMTA1MCAyNTIwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAxMDUwIDI2MjUgMjA3MCAyNjI1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyMTc1IDI2MjUgMjE3NSAyMjA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyMTc1IDIxMDAgMTE1NSAyMTAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU1NTAgMzMwMCBtIDY2NzUgMzMwMCBsICA2Njc1IDM3NTAgbCAgNTU1MCAzNzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTY1NSAyMTAwIG0gNTU1MCAyMTAwIDU1NTAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNTU1MCAyNjI1IDY0OTUgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNjYwMCAyNjI1IDY2MDAgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNjYwMCAyMTAwIDU2NTUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzNzUwIDM2MDAgbSA0ODc1IDM2MDAgbCAgNDg3NSA0MDUwIGwgIDM3NTAgNDA1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDM4NTUgMjcwMCBtIDM3NTAgMjcwMCAzNzUwIDMwNDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDM3NTAgMzE1MCA0NTQ1IDMxNTAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDQ2NTAgMzE1MCA0NjUwIDI4MDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDQ2NTAgMjcwMCAzODU1IDI3MDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMjg1MCA1NzAwIG0gMzc1MCA1NzAwIGwgIDM3NTAgNjE1MCBsICAyODUwIDYxNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzMDMwIDQ4MDAgbSAyOTI1IDQ4MDAgMjkyNSA1MTQ1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyOTI1IDUyNTAgMzY0NSA1MjUwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAzNzUwIDUyNTAgMzc1MCA0OTA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAzNzUwIDQ4MDAgMzAzMCA0ODAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDE1MDAgMTQyNSBtIDE1MDAgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiAxNTMwLjAwIDE5ODAuMDAgbSAxNTAwLjAwIDIxMDAuMDAgbCAxNDcwLjAwIDE5ODAuMDAgbCAgMTUwMC41MCAxOTgwLjUwIGwgMTUzMC4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDMzMDAgMTQyNSBtIDMzMDAgNDgwMCBsICBncyBjb2wtMSBzIGdyIAotbiAzMzMwLjAwIDQ2ODAuMDAgbSAzMzAwLjAwIDQ4MDAuMDAgbCAzMjcwLjAwIDQ2ODAuMDAgbCAgMzMwMC41MCA0NjgwLjUwIGwgMzMzMC4wMCA0NjgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDMzMDAgMTU3NSBtIDE4NzUgMTU3NSBsICAxODc1IDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTkwNS4wMCAxOTgwLjAwIG0gMTg3NS4wMCAyMTAwLjAwIGwgMTg0NS4wMCAxOTgwLjAwIGwgIDE4NzUuNTAgMTk4MC41MCBsIDE5MDUuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDE1NzUgbSA1NzAwIDE1NzUgbCAgNTcwMCAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU3MzAuMDAgMTk4MC4wMCBtIDU3MDAuMDAgMjEwMC4wMCBsIDU2NzAuMDAgMTk4MC4wMCBsICA1NzAwLjUwIDE5ODAuNTAgbCA1NzMwLjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNjIyNSAxMzUwIG0gNjIyNSAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDYyNTUuMDAgMTk4MC4wMCBtIDYyMjUuMDAgMjEwMC4wMCBsIDYxOTUuMDAgMTk4MC4wMCBsICA2MjI1LjUwIDE5ODAuNTAgbCA2MjU1LjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNjA3NSAyNjI1IG0gNjA3NSAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDYxMDUuMDAgMzE4MC4wMCBtIDYwNzUuMDAgMzMwMC4wMCBsIDYwNDUuMDAgMzE4MC4wMCBsICA2MDc1LjUwIDMxODAuNTAgbCA2MTA1LjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNDIwMCAyMjUwIG0gNDIwMCAyNzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDQyMzAuMDAgMjU4MC4wMCBtIDQyMDAuMDAgMjcwMC4wMCBsIDQxNzAuMDAgMjU4MC4wMCBsICA0MjAwLjUwIDI1ODAuNTAgbCA0MjMwLjAwIDI1ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNDIwMCAzMTUwIG0gNDIwMCAzNjAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDQyMzAuMDAgMzQ4MC4wMCBtIDQyMDAuMDAgMzYwMC4wMCBsIDQxNzAuMDAgMzQ4MC4wMCBsICA0MjAwLjUwIDM0ODAuNTAgbCA0MjMwLjAwIDM0ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNDIwMCA0MDUwIG0gNDIwMCA0NTAwIGwgIDM2NzUgNDUwMCBsICAzNjc1IDQ4MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzcwNS4wMCA0NjgwLjAwIG0gMzY3NS4wMCA0ODAwLjAwIGwgMzY0NS4wMCA0NjgwLjAwIGwgIDM2NzUuNTAgNDY4MC41MCBsIDM3MDUuMDAgNDY4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzc1IDUyNTAgbSAzMzc1IDU3MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzQwNS4wMCA1NTgwLjAwIG0gMzM3NS4wMCA1NzAwLjAwIGwgMzM0NS4wMCA1NTgwLjAwIGwgIDMzNzUuNTAgNTU4MC41MCBsIDM0MDUuMDAgNTU4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDI5MjUgbSAzNzUwIDI5MjUgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzYzMC4wMCAyODk1LjAwIG0gMzc1MC4wMCAyOTI1LjAwIGwgMzYzMC4wMCAyOTU1LjAwIGwgIDM2MzAuNTAgMjkyNS41MCBsIDM2MzAuMDAgMjg5NS4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxNTAwIDI2MjUgbSAxNTAwIDMzMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTUzMC4wMCAzMTgwLjAwIG0gMTUwMC4wMCAzMzAwLjAwIGwgMTQ3MC4wMCAzMTgwLjAwIGwgIDE1MDAuNTAgMzE4MC41MCBsIDE1MzAuMDAgMzE4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxMDUwIDMzMDAgbSAyMTAwIDMzMDAgbCAgMjEwMCAzNzUwIGwgIDEwNTAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDQ4NzUgMzgyNSBtIDUyNTAgMzgyNSBsICA1MjUwIDI0MDAgbCAgNTU1MCAyNDAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU0MzAuMDAgMjM3MC4wMCBtIDU1NTAuMDAgMjQwMC4wMCBsIDU0MzAuMDAgMjQzMC4wMCBsICA1NDMwLjUwIDI0MDAuNTAgbCA1NDMwLjAwIDIzNzAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMTIwMCBtCi1ncyAxIC0xIHNjIChhY2NvbmZpZy5oKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlndXJlLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01NzAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoTWFrZWZpbGUuYW0pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTM5MDAgMjEwMCBtCi1ncyAxIC0xIHNjIChhY2luY2x1ZGUubTQpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMjQwMCBtCi1ncyAxIC0xIHNjIChhdXRvaGVhZGVyKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDM2MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01NzAwIDM2MDAgbQotZ3MgMSAtMSBzYyAoTWFrZWZpbGUuaW4pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTU3MDAgMjQwMCBtCi1ncyAxIC0xIHNjIChhdXRvbWFrZSkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzkwMCAzOTAwIG0KLWdzIDEgLTEgc2MgKGFjbG9jYWwubTQpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTM5MDAgMzAwMCBtCi1ncyAxIC0xIHNjIChhY2xvY2FsKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDYwMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlndXJlKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDUxMDAgbQotZ3MgMSAtMSBzYyAoYXV0b2NvbmYpIGNvbC0xIHNob3cgZ3IKLSRGMnBzRW5kCi1yZXN0b3JlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmZpZyBiL2V0Yy9jb25maWdkZXYuZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM4NmVjLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYuZmlnCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI0ZJRyAzLjEKLVBvcnRyYWl0Ci1DZW50ZXIKLUluY2hlcwotMTIwMCAyCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDEwNTAgOTAwIDIxMDAgOTAwIDIxMDAgMTQyNSAxMDUwIDE0MjUgMTA1MCA5MDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMjkyNSA5MDAgMzk3NSA5MDAgMzk3NSAxNDI1IDI5MjUgMTQyNSAyOTI1IDkwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1NTUwIDkwMCA2NzUwIDkwMCA2NzUwIDEzNTAgNTU1MCAxMzUwIDU1NTAgOTAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDM3NTAgMTgwMCA1MDI1IDE4MDAgNTAyNSAyMjUwIDM3NTAgMjI1MCAzNzUwIDE4MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgMjE3NSAyNjI1IDIxNzUgMjEwMCAxMDUwIDIxMDAgMTA1MCAyNjI1IDIxNzUgMjYyNQotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1NTUwIDMzMDAgNjY3NSAzMzAwIDY2NzUgMzc1MCA1NTUwIDM3NTAgNTU1MCAzMzAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDY2MDAgMjYyNSA2NjAwIDIxMDAgNTU1MCAyMTAwIDU1NTAgMjYyNSA2NjAwIDI2MjUKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMzc1MCAzNjAwIDQ4NzUgMzYwMCA0ODc1IDQwNTAgMzc1MCA0MDUwIDM3NTAgMzYwMAotMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQotCSA0NjUwIDMxNTAgNDY1MCAyNzAwIDM3NTAgMjcwMCAzNzUwIDMxNTAgNDY1MCAzMTUwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDI4NTAgNTcwMCAzNzUwIDU3MDAgMzc1MCA2MTUwIDI4NTAgNjE1MCAyODUwIDU3MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgMzc1MCA1MjUwIDM3NTAgNDgwMCAyOTI1IDQ4MDAgMjkyNSA1MjUwIDM3NTAgNTI1MAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTUwMCAxNDI1IDE1MDAgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzMwMCAxNDI1IDMzMDAgNDgwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDMKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzMwMCAxNTc1IDE4NzUgMTU3NSAxODc1IDIxMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAzCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMTU3NSA1NzAwIDE1NzUgNTcwMCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA2MjI1IDEzNTAgNjIyNSAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA2MDc1IDI2MjUgNjA3NSAzMzAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MjAwIDIyNTAgNDIwMCAyNzAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MjAwIDMxNTAgNDIwMCAzNjAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgNAotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MjAwIDQwNTAgNDIwMCA0NTAwIDM2NzUgNDUwMCAzNjc1IDQ4MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzNzUgNTI1MCAzMzc1IDU3MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMjkyNSAzNzUwIDI5MjUKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDE1MDAgMjYyNSAxNTAwIDMzMDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMTA1MCAzMzAwIDIxMDAgMzMwMCAyMTAwIDM3NTAgMTA1MCAzNzUwIDEwNTAgMzMwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDQKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDg3NSAzODI1IDUyNTAgMzgyNSA1MjUwIDI0MDAgNTU1MCAyNDAwCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDc4MCAxMjAwIDEyMDAgYWNjb25maWcuaFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgODg1IDMwMDAgMTIwMCBjb25maWd1cmUuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDk0NSA1NzAwIDEyMDAgTWFrZWZpbGUuYW1cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDk5MCAzOTAwIDIxMDAgYWNpbmNsdWRlLm00XDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4NDAgMTIwMCAyNDAwIGF1dG9oZWFkZXJcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDY0NSAxMjAwIDM2MDAgY29uZmlnLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4NTUgNTcwMCAzNjAwIE1ha2VmaWxlLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA3MzUgNTcwMCAyNDAwIGF1dG9tYWtlXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4MTAgMzkwMCAzOTAwIGFjbG9jYWwubTRcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDU0MCAzOTAwIDMwMDAgYWNsb2NhbFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNzA1IDMwMDAgNjAwMCBjb25maWd1cmVcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDY2MCAzMDAwIDUxMDAgYXV0b2NvbmZcMDAxCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmppbiBiL2V0Yy9jb25maWdkZXYuamluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjExYTcxLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYuamluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi50aW4gYi9ldGMvY29uZmlnZGV2LnRpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliNmYzNC4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnZGV2LnRpbgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSAgIGFjY29uZmlnLmggICAgICAgY29uZmlndXJlLmluICAgICAgICAgICAgICAgICBNYWtlZmlsZS5hbQotICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICB8ICAtLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICB8Ci0gICAgICAgfCAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfAotICAgICAgIHYgIHYgICAgICAgICAgICAgfCAgICBhY2luY2x1ZGUubTQgICAgIHwgICAgIHwKLSAgICphdXRvaGVhZGVyKiAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB2ICAgICB2Ci0gICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgdiAgICAgIC0tLT4qYXV0b21ha2UqIAotICAgICAgIHYgICAgICAgICAgICAgICAgfC0tLT4qYWNsb2NhbCogICB8ICAgICAgIHwgICAgICAKLSAgIGNvbmZpZy5pbiAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfCAgICAgICB2ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgdiAgICAgIHwgICBNYWtlZmlsZS5pbgotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBhY2xvY2FsLm00LS0tCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ICAgICB2Ci0gICAgICAgICAgICAgICAgICAgICAgICphdXRvY29uZioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKLSAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlIGIvZXRjL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAxZmNlZi4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsODYyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU1NTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgotIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KLSMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KLWNhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKLXMlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCi1zJVxbJVxcJiVnCi1zJVxdJVxcJiVnCi1zJVwkJSQkJWcKLUVPRgotREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCi1ybSAtZiBjb25mdGVzdC5kZWZzCi0KLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2V0Yy9jb25maWd1cmUuaW4gYi9ldGMvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzg1MDY4Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotQUNfUFJFUkVRKDIuNSkKLUFDX0lOSVQoTWFrZWZpbGUuaW4pCi0KLUFDX1BST0dfSU5TVEFMTAotCi1BQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlLnRleGkgYi9ldGMvY29uZmlndXJlLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDAxNjcuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ3VyZS50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjY0NCArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQGMgJSoqc3RhcnQgb2YgaGVhZGVyCi1Ac2V0ZmlsZW5hbWUgY29uZmlndXJlLmluZm8KLUBzZXR0aXRsZSBUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmCi1AYyAlKiplbmQgb2YgaGVhZGVyCi0KLUBkaXJjYXRlZ29yeSBHTlUgYWRtaW4KLUBkaXJlbnRyeQotKiBjb25maWd1cmU6IChjb25maWd1cmUpLglUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi1AZW5kIGRpcmVudHJ5Ci0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbS4KLQotQ29weXJpZ2h0IChDKSAxOTk4IEN5Z251cyBTb2x1dGlvbnMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLQotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRm91bmRhdGlvbi4KLUBlbmQgaWZpbmZvCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi1AYXV0aG9yIElhbiBMYW5jZSBUYXlsb3IKLQotQHBhZ2UKLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5OCBDeWdudXMgU29sdXRpb25zCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uCi1hcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtLgotCi1AbWVudQotKiBJbnRyb2R1Y3Rpb246OgkJSW50cm9kdWN0aW9uLgotKiBHZXR0aW5nIFN0YXJ0ZWQ6OgkJR2V0dGluZyBTdGFydGVkLgotKiBGaWxlczo6CQkJRmlsZXMuCi0qIENvbmZpZ3VyYXRpb24gTmFtZXM6OgkJQ29uZmlndXJhdGlvbiBOYW1lcy4KLSogQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHM6OglDcm9zcyBDb21waWxhdGlvbiBUb29scy4KLSogQ2FuYWRpYW4gQ3Jvc3M6OgkJQ2FuYWRpYW4gQ3Jvc3MuCi0qIEN5Z251cyBDb25maWd1cmU6OgkJQ3lnbnVzIENvbmZpZ3VyZS4KLSogTXVsdGlsaWJzOjoJCQlNdWx0aWxpYnMuCi0qIEZBUTo6CQkJCUZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zLgotKiBJbmRleDo6CQkJSW5kZXguCi1AZW5kIG1lbnUKLQotQGVuZCBpZmluZm8KLQotQG5vZGUgSW50cm9kdWN0aW9uCi1AY2hhcHRlciBJbnRyb2R1Y3Rpb24KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbXMuICBJdAotZGVzY3JpYmVzIGhvdyBhdXRvY29uZiwgYXV0b21ha2UsIGxpYnRvb2wsIGFuZCBtYWtlIGZpdCB0b2dldGhlci4gIEl0Ci1hbHNvIGluY2x1ZGVzIGEgZGlzY3Vzc2lvbiBvZiB0aGUgb2xkZXIgQ3lnbnVzIGNvbmZpZ3VyZSBzeXN0ZW0uCi0KLVRoaXMgZG9jdW1lbnQgZG9lcyBub3QgZGVzY3JpYmUgaW4gZGV0YWlsIGhvdyB0byB1c2UgZWFjaCBvZiB0aGUgdG9vbHM7Ci1zZWUgdGhlIHJlc3BlY3RpdmUgbWFudWFscyBmb3IgdGhhdC4gIEluc3RlYWQsIGl0IGRlc2NyaWJlcyB3aGljaCBmaWxlcwotdGhlIGRldmVsb3BlciBtdXN0IHdyaXRlLCB3aGljaCBmaWxlcyBhcmUgbWFjaGluZSBnZW5lcmF0ZWQgYW5kIGhvdyB0aGV5Ci1hcmUgZ2VuZXJhdGVkLCBhbmQgd2hlcmUgY2VydGFpbiBjb21tb24gcHJvYmxlbXMgc2hvdWxkIGJlIGFkZHJlc3NlZC4KLQotQGlmbm90aHRtbAotVGhpcyBkb2N1bWVudCBkcmF3cyBvbiBzZXZlcmFsIHNvdXJjZXMsIGluY2x1ZGluZyB0aGUgYXV0b2NvbmYgbWFudWFsIGJ5Ci1EYXZpZCBNYWNLZW56aWUgKEBweHJlZntUb3AsICwgYXV0b2NvbmYgb3ZlcnZpZXcsIGF1dG9jb25mLCBBdXRvY29uZn0pLAotdGhlIGF1dG9tYWtlIG1hbnVhbCBieSBEYXZpZCBNYWNLZW56aWUgYW5kIFRvbSBUcm9tZXkgKEBweHJlZntUb3AsICwKLWF1dG9tYWtlIG92ZXJ2aWV3LCBhdXRvbWFrZSwgR05VIEF1dG9tYWtlfSksIHRoZSBsaWJ0b29sIG1hbnVhbCBieQotR29yZG9uIE1hdHppZ2tlaXQgKEBweHJlZntUb3AsICwgbGlidG9vbCBvdmVydmlldywgbGlidG9vbCwgR05VCi1saWJ0b29sfSksIGFuZCB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBtYW51YWwgYnkgSy4gUmljaGFyZCBQaXhsZXkuCi1AZW5kIGlmbm90aHRtbAotQGlmaHRtbAotVGhpcyBkb2N1bWVudCBkcmF3cyBvbiBzZXZlcmFsIHNvdXJjZXMsIGluY2x1ZGluZwotQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvY29uZi9hdXRvY29uZl90b2MuaHRtbCwgdGhlCi1hdXRvY29uZiBtYW51YWx9IGJ5IERhdmlkIE1hY0tlbnppZSwKLUB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b21ha2UvYXV0b21ha2VfdG9jLmh0bWwsIHRoZQotYXV0b21ha2UgbWFudWFsfSBieSBEYXZpZCBNYWNLZW56aWUgYW5kIFRvbSBUcm9tZXksCi1AdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2xpYnRvb2wvbGlidG9vbF90b2MuaHRtbCwgdGhlCi1saWJ0b29sIG1hbnVhbH0gYnkgR29yZG9uIE1hdHppZ2tlaXQsIGFuZCB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBtYW51YWwgYnkKLUsuIFJpY2hhcmQgUGl4bGV5LgotQGVuZCBpZmh0bWwKLQotQG1lbnUKLSogR29hbHM6OgkJCUdvYWxzLgotKiBUb29sczo6CQkJVGhlIHRvb2xzLgotKiBIaXN0b3J5OjoJCQlIaXN0b3J5LgotKiBCdWlsZGluZzo6CQkJQnVpbGRpbmcuCi1AZW5kIG1lbnUKLQotQG5vZGUgR29hbHMKLUBzZWN0aW9uIEdvYWxzCi1AY2luZGV4IGdvYWxzCi0KLVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gaGFzIHR3byBtYWluIGdvYWxzLgotCi1UaGUgZmlyc3QgaXMgdG8gc2ltcGxpZnkgdGhlIGRldmVsb3BtZW50IG9mIHBvcnRhYmxlIHByb2dyYW1zLiAgVGhlCi1zeXN0ZW0gcGVybWl0cyB0aGUgZGV2ZWxvcGVyIHRvIGNvbmNlbnRyYXRlIG9uIHdyaXRpbmcgdGhlIHByb2dyYW0sCi1zaW1wbGlmeWluZyBtYW55IGRldGFpbHMgb2YgcG9ydGFiaWxpdHkgYWNyb3NzIFVuaXggYW5kIGV2ZW4gV2luZG93cwotc3lzdGVtcywgYW5kIHBlcm1pdHRpbmcgdGhlIGRldmVsb3BlciB0byBkZXNjcmliZSBob3cgdG8gYnVpbGQgdGhlCi1wcm9ncmFtIHVzaW5nIHNpbXBsZSBydWxlcyByYXRoZXIgdGhhbiBjb21wbGV4IE1ha2VmaWxlcy4KLQotVGhlIHNlY29uZCBpcyB0byBzaW1wbGlmeSB0aGUgYnVpbGRpbmcgb2YgcHJvZ3JhbXMgZGlzdHJpYnV0ZWQgYXMgc291cmNlCi1jb2RlLiAgQWxsIHByb2dyYW1zIGFyZSBidWlsdCB1c2luZyBhIHNpbXBsZSwgc3RhbmRhcmRpemVkLCB0d28gc3RlcAotcHJvY2Vzcy4gIFRoZSBwcm9ncmFtIGJ1aWxkZXIgbmVlZCBub3QgaW5zdGFsbCBhbnkgc3BlY2lhbCB0b29scyBpbgotb3JkZXIgdG8gYnVpbGQgdGhlIHByb2dyYW0uCi0KLUBub2RlIFRvb2xzCi1Ac2VjdGlvbiBUb29scwotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIGlzIGNvbXByaXNlZCBvZiBzZXZlcmFsIGRpZmZlcmVudAotdG9vbHMuICBQcm9ncmFtIGRldmVsb3BlcnMgbXVzdCBidWlsZCBhbmQgaW5zdGFsbCBhbGwgb2YgdGhlc2UgdG9vbHMuCi0KLVBlb3BsZSB3aG8ganVzdCB3YW50IHRvIGJ1aWxkIHByb2dyYW1zIGZyb20gZGlzdHJpYnV0ZWQgc291cmNlcyBub3JtYWxseQotZG8gbm90IG5lZWQgYW55IHNwZWNpYWwgdG9vbHMgYmV5b25kIGEgVW5peCBzaGVsbCwgYSBtYWtlIHByb2dyYW0sIGFuZCBhCi1DIGNvbXBpbGVyLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGF1dG9jb25mCi1wcm92aWRlcyBhIGdlbmVyYWwgcG9ydGFiaWxpdHkgZnJhbWV3b3JrLCBiYXNlZCBvbiB0ZXN0aW5nIHRoZSBmZWF0dXJlcwotb2YgdGhlIGhvc3Qgc3lzdGVtIGF0IGJ1aWxkIHRpbWUuCi1AaXRlbSBhdXRvbWFrZQotYSBzeXN0ZW0gZm9yIGRlc2NyaWJpbmcgaG93IHRvIGJ1aWxkIGEgcHJvZ3JhbSwgcGVybWl0dGluZyB0aGUgZGV2ZWxvcGVyCi10byB3cml0ZSBhIHNpbXBsaWZpZWQgQGZpbGV7TWFrZWZpbGV9LgotQGl0ZW0gbGlidG9vbAotYSBzdGFuZGFyZGl6ZWQgYXBwcm9hY2ggdG8gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLUBpdGVtIGdldHRleHQKLXByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciB0cmFuc2xhdGlvbiBvZiB0ZXh0IG1lc3NhZ2VzIGludG8gb3RoZXIKLWxhbmd1YWdlczsgbm90IHJlYWxseSBkaXNjdXNzZWQgaW4gdGhpcyBkb2N1bWVudC4KLUBpdGVtIG00Ci1hdXRvY29uZiByZXF1aXJlcyB0aGUgR05VIHZlcnNpb24gb2YgbTQ7IHRoZSBzdGFuZGFyZCBVbml4IG00IGRvZXMgbm90Ci1zdWZmaWNlLgotQGl0ZW0gcGVybAotYXV0b21ha2UgcmVxdWlyZXMgcGVybC4KLUBlbmQgdGFibGUKLQotQG5vZGUgSGlzdG9yeQotQHNlY3Rpb24gSGlzdG9yeQotQGNpbmRleCBoaXN0b3J5Ci0KLVRoaXMgaXMgYSB2ZXJ5IGJyaWVmIGFuZCBwcm9iYWJseSBpbmFjY3VyYXRlIGhpc3RvcnkuCi0KLUFzIHRoZSBudW1iZXIgb2YgVW5peCB2YXJpYW50cyBpbmNyZWFzZWQgZHVyaW5nIHRoZSAxOTgwcywgaXQgYmVjYW1lCi1oYXJkZXIgdG8gd3JpdGUgcHJvZ3JhbXMgd2hpY2ggY291bGQgcnVuIG9uIGFsbCB2YXJpYW50cy4gIFdoaWxlIGl0IHdhcwotb2Z0ZW4gcG9zc2libGUgdG8gdXNlIEBjb2RleyNpZmRlZn0gdG8gaWRlbnRpZnkgcGFydGljdWxhciBzeXN0ZW1zLAotZGV2ZWxvcGVycyBmcmVxdWVudGx5IGRpZCBub3QgaGF2ZSBhY2Nlc3MgdG8gZXZlcnkgc3lzdGVtLCBhbmQgdGhlCi1jaGFyYWN0ZXJpc3RpY3Mgb2Ygc29tZSBzeXN0ZW1zIGNoYW5nZWQgZnJvbSB2ZXJzaW9uIHRvIHZlcnNpb24uCi0KLUJ5IDE5OTIsIGF0IGxlYXN0IHRocmVlIGRpZmZlcmVudCBhcHByb2FjaGVzIGhhZCBiZWVuIGRldmVsb3BlZDoKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgTWV0YWNvbmZpZyBwcm9ncmFtLCBieSBMYXJyeSBXYWxsLCBIYXJsYW4gU3Rlbm4sIGFuZCBSYXBoYWVsCi1NYW5mcmVkaS4KLUBpdGVtCi1UaGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQsIGJ5IEsuIFJpY2hhcmQgUGl4bGV5LCBhbmQgdGhlIGdjYyBjb25maWd1cmUKLXNjcmlwdCwgYnkgUmljaGFyZCBTdGFsbG1hbi4gIFRoZXNlIHVzZSBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcHByb2FjaCwKLWFuZCB0aGUgZGV2ZWxvcGVycyBjb21tdW5pY2F0ZWQgcmVndWxhcmx5LgotQGl0ZW0KLVRoZSBhdXRvY29uZiBwcm9ncmFtLCBieSBEYXZpZCBNYWNLZW56aWUuCi1AZW5kIGl0ZW1pemUKLQotVGhlIE1ldGFjb25maWcgcHJvZ3JhbSBpcyBzdGlsbCB1c2VkIGZvciBQZXJsIGFuZCBhIGZldyBvdGhlciBwcm9ncmFtcy4KLUl0IGlzIHBhcnQgb2YgdGhlIERpc3QgcGFja2FnZS4gIEkgZG8gbm90IGtub3cgaWYgaXQgaXMgYmVpbmcgZGV2ZWxvcGVkLgotCi1JbiAxOTk0LCBEYXZpZCBNYWNLZW56aWUgYW5kIG90aGVycyBtb2RpZmllZCBhdXRvY29uZiB0byBpbmNvcnBvcmF0ZSBhbGwKLXRoZSBmZWF0dXJlcyBvZiBDeWdudXMgY29uZmlndXJlLiAgU2luY2UgdGhlbiwgdGhlcmUgaGFzIGJlZW4gYSBzbG93IGJ1dAotc3RlYWR5IGNvbnZlcnNpb24gb2YgR05VIHByb2dyYW1zIGZyb20gQ3lnbnVzIGNvbmZpZ3VyZSB0byBhdXRvY29uZi4gZ2NjCi1oYXMgYmVlbiBjb252ZXJ0ZWQsIGVsaW1pbmF0aW5nIHRoZSBnY2MgY29uZmlndXJlIHNjcmlwdC4KLQotR05VIGF1dG9jb25mIHdhcyByZWd1bGFybHkgbWFpbnRhaW5lZCB1bnRpbCBsYXRlIDE5OTYuICBBcyBvZiB0aGlzCi13cml0aW5nIGluIEp1bmUsIDE5OTgsIGl0IGhhcyBubyBwdWJsaWMgbWFpbnRhaW5lci4KLQotTW9zdCBwcm9ncmFtcyBhcmUgYnVpbHQgdXNpbmcgdGhlIG1ha2UgcHJvZ3JhbSwgd2hpY2ggcmVxdWlyZXMgdGhlCi1kZXZlbG9wZXIgdG8gd3JpdGUgTWFrZWZpbGVzIGRlc2NyaWJpbmcgaG93IHRvIGJ1aWxkIHRoZSBwcm9ncmFtcy4KLVNpbmNlIG1vc3QgcHJvZ3JhbXMgYXJlIGJ1aWx0IGluIHByZXR0eSBtdWNoIHRoZSBzYW1lIHdheSwgdGhpcyBsZWQgdG8gYQotbG90IG9mIGR1cGxpY2F0aW9uLgotCi1UaGUgWCBXaW5kb3cgc3lzdGVtIGlzIGJ1aWx0IHVzaW5nIHRoZSBpbWFrZSB0b29sLCB3aGljaCB1c2VzIGEgZGF0YWJhc2UKLW9mIHJ1bGVzIHRvIGVsaW1pbmF0ZSB0aGUgZHVwbGljYXRpb24uICBIb3dldmVyLCBidWlsZGluZyBhIHRvb2wgd2hpY2gKLXdhcyBkZXZlbG9wZWQgdXNpbmcgaW1ha2UgcmVxdWlyZXMgdGhhdCB0aGUgYnVpbGRlciBoYXZlIGltYWtlCi1pbnN0YWxsZWQsIHZpb2xhdGluZyBvbmUgb2YgdGhlIGdvYWxzIG9mIHRoZSBHTlUgc3lzdGVtLgotCi1UaGUgbmV3IEJTRCBtYWtlIHByb3ZpZGVzIGEgc3RhbmRhcmQgbGlicmFyeSBvZiBNYWtlZmlsZSBmcmFnbWVudHMsCi13aGljaCBwZXJtaXRzIGRldmVsb3BlcnMgdG8gd3JpdGUgdmVyeSBzaW1wbGUgTWFrZWZpbGVzLiAgSG93ZXZlciwgdGhpcwotcmVxdWlyZXMgdGhhdCB0aGUgYnVpbGRlciBpbnN0YWxsIHRoZSBuZXcgQlNEIG1ha2UgcHJvZ3JhbS4KLQotSW4gMTk5NCwgRGF2aWQgTWFjS2VuemllIHdyb3RlIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIGF1dG9tYWtlLCB3aGljaAotcGVybWl0dGVkIHdyaXRpbmcgYSBzaW1wbGUgYnVpbGQgZGVzY3JpcHRpb24gd2hpY2ggd2FzIGNvbnZlcnRlZCBpbnRvIGEKLU1ha2VmaWxlIHdoaWNoIGNvdWxkIGJlIHVzZWQgYnkgdGhlIHN0YW5kYXJkIG1ha2UgcHJvZ3JhbS4gIEluIDE5OTUsIFRvbQotVHJvbWV5IGNvbXBsZXRlbHkgcmV3cm90ZSBhdXRvbWFrZSBpbiBQZXJsLCBhbmQgaGUgY29udGludWVzIHRvIGVuaGFuY2UKLWl0LgotCi1WYXJpb3VzIGZyZWUgcGFja2FnZXMgYnVpbHQgbGlicmFyaWVzLCBhbmQgYnkgYXJvdW5kIDE5OTUgc2V2ZXJhbAotaW5jbHVkZWQgc3VwcG9ydCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLgotSG93ZXZlciwgdGhlcmUgd2FzIG5vIGNvbnNpc3RlbnQgYXBwcm9hY2guICBJbiBlYXJseSAxOTk2LCBHb3Jkb24KLU1hdHppZ2tlaXQgYmVnYW4gd29ya2luZyBvbiBsaWJ0b29sLCB3aGljaCBwcm92aWRlZCBhIHN0YW5kYXJkaXplZAotYXBwcm9hY2ggdG8gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgd2FzIGludGVncmF0ZWQgaW50bwotYXV0b21ha2UgZnJvbSB0aGUgc3RhcnQuCi0KLVRoZSBkZXZlbG9wbWVudCBvZiBhdXRvbWFrZSBhbmQgbGlidG9vbCB3YXMgZHJpdmVuIGJ5IHRoZSBHTklUUyBwcm9qZWN0LAotYSBncm91cCBvZiBHTlUgbWFpbnRhaW5lcnMgd2hvIGRlc2lnbmVkIHN0YW5kYXJkaXplZCB0b29scyB0byBoZWxwIG1lZXQKLXRoZSBHTlUgY29kaW5nIHN0YW5kYXJkcy4KLQotQG5vZGUgQnVpbGRpbmcKLUBzZWN0aW9uIEJ1aWxkaW5nCi0KLU1vc3QgcmVhZGVycyBvZiB0aGlzIGRvY3VtZW50IHNob3VsZCBhbHJlYWR5IGtub3cgaG93IHRvIGJ1aWxkIGEgdG9vbCBieQotcnVubmluZyBAc2FtcHtjb25maWd1cmV9IGFuZCBAc2FtcHttYWtlfS4gIFRoaXMgc2VjdGlvbiBtYXkgc2VydmUgYXMgYQotcXVpY2sgaW50cm9kdWN0aW9uIG9yIHJlbWluZGVyLgotCi1CdWlsZGluZyBhIHRvb2wgaXMgbm9ybWFsbHkgYXMgc2ltcGxlIGFzIHJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfQotZm9sbG93ZWQgYnkgQHNhbXB7bWFrZX0uICBZb3Ugc2hvdWxkIG5vcm1hbGx5IHJ1biBAc2FtcHtjb25maWd1cmV9IGZyb20KLWFuIGVtcHR5IGRpcmVjdG9yeSwgdXNpbmcgc29tZSBwYXRoIHRvIHJlZmVyIHRvIHRoZSBAc2FtcHtjb25maWd1cmV9Ci1zY3JpcHQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBydW4KLUBzYW1we2NvbmZpZ3VyZX0gaXMgY2FsbGVkIHRoZSBAZGZue29iamVjdCBkaXJlY3Rvcnl9LgotCi1JbiBvcmRlciB0byB1c2UgYSBvYmplY3QgZGlyZWN0b3J5IHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzb3VyY2UKLWRpcmVjdG9yeSwgeW91IG11c3QgYmUgdXNpbmcgdGhlIEdOVSB2ZXJzaW9uIG9mIEBzYW1we21ha2V9LCB3aGljaCBoYXMKLXRoZSByZXF1aXJlZCBAc2FtcHtWUEFUSH0gc3VwcG9ydC4gIERlc3BpdGUgdGhpcyByZXN0cmljdGlvbiwgdXNpbmcgYQotZGlmZmVyZW50IG9iamVjdCBkaXJlY3RvcnkgaXMgaGlnaGx5IHJlY29tbWVuZGVkOgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUl0IGtlZXBzIHRoZSBmaWxlcyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBidWlsZCBmcm9tIGNsdXR0ZXJpbmcgdXAgeW91cgotc291cmNlcy4KLUBpdGVtIAotSXQgcGVybWl0cyB5b3UgdG8gcmVtb3ZlIHRoZSBidWlsdCBmaWxlcyBieSBzaW1wbHkgcmVtb3ZpbmcgdGhlIGVudGlyZQotYnVpbGQgZGlyZWN0b3J5LgotQGl0ZW0KLUl0IHBlcm1pdHMgeW91IHRvIGJ1aWxkIGZyb20gdGhlIHNhbWUgc291cmNlcyB3aXRoIHNldmVyYWwgc2V0cyBvZgotY29uZmlndXJlIG9wdGlvbnMgc2ltdWx0YW5lb3VzbHkuCi1AZW5kIGl0ZW1pemUKLQotSWYgeW91IGRvbid0IGhhdmUgR05VIEBzYW1we21ha2V9LCB5b3Ugd2lsbCBoYXZlIHRvIHJ1biBAc2FtcHtjb25maWd1cmV9Ci1pbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIEFsbCBHTlUgcGFja2FnZXMgc2hvdWxkIHN1cHBvcnQgdGhpczsgaW4KLXBhcnRpY3VsYXIsIEdOVSBwYWNrYWdlcyBzaG91bGQgbm90IGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2YgR05VCi1Ac2FtcHttYWtlfS4KLQotQWZ0ZXIgcnVubmluZyBAc2FtcHtjb25maWd1cmV9LCB5b3UgY2FuIGJ1aWxkIHRoZSB0b29scyBieSBydW5uaW5nCi1Ac2FtcHttYWtlfS4KLQotVG8gaW5zdGFsbCB0aGUgdG9vbHMsIHJ1biBAc2FtcHttYWtlIGluc3RhbGx9LiAgSW5zdGFsbGluZyB0aGUgdG9vbHMKLXdpbGwgY29weSB0aGUgcHJvZ3JhbXMgYW5kIGFueSByZXF1aXJlZCBzdXBwb3J0IGZpbGVzIHRvIHRoZQotQGRmbntpbnN0YWxsYXRpb24gZGlyZWN0b3J5fS4gIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5zdGFsbGF0aW9uCi1kaXJlY3RvcnkgaXMgY29udHJvbGxlZCBieSBAc2FtcHtjb25maWd1cmV9IG9wdGlvbnMsIGFzIGRlc2NyaWJlZCBiZWxvdy4KLQotSW4gdGhlIEN5Z251cyB0cmVlIGF0IHByZXNlbnQsIHRoZSBpbmZvIGZpbGVzIGFyZSBidWlsdCBhbmQgaW5zdGFsbGVkIGFzCi1hIHNlcGFyYXRlIHN0ZXAuICBUbyBidWlsZCB0aGVtLCBydW4gQHNhbXB7bWFrZSBpbmZvfS4gIFRvIGluc3RhbGwgdGhlbSwKLXJ1biBAc2FtcHttYWtlIGluc3RhbGwtaW5mb30uCi0KLUFsbCBAc2FtcHtjb25maWd1cmV9IHNjcmlwdHMgc3VwcG9ydCBhIHdpZGUgdmFyaWV0eSBvZiBvcHRpb25zLiAgVGhlCi1tb3N0IGludGVyZXN0aW5nIG9uZXMgYXJlIEBzYW1wey0td2l0aH0gYW5kIEBzYW1wey0tZW5hYmxlfSBvcHRpb25zCi13aGljaCBhcmUgZ2VuZXJhbGx5IHNwZWNpZmljIHRvIHBhcnRpY3VsYXIgdG9vbHMuICBZb3UgY2FuIHVzdWFsbHkgdXNlCi10aGUgQHNhbXB7LS1oZWxwfSBvcHRpb24gdG8gZ2V0IGEgbGlzdCBvZiBpbnRlcmVzdGluZyBvcHRpb25zIGZvciBhCi1wYXJ0aWN1bGFyIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLVRoZSBvbmx5IGdlbmVyaWMgb3B0aW9ucyB5b3UgYXJlIGxpa2VseSB0byB1c2UgYXJlIHRoZSBAc2FtcHstLXByZWZpeH0KLWFuZCBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb25zLiAgVGhlc2Ugb3B0aW9ucyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZQotaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQotVGhlIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUgQHNhbXB7LS1wcmVmaXh9IG9wdGlvbiB3aWxsIGhvbGQgbWFjaGluZQotaW5kZXBlbmRlbnQgZmlsZXMgc3VjaCBhcyBpbmZvIGZpbGVzLgotCi1UaGUgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb24sIHdoaWNoIGlzCi1ub3JtYWxseSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgQHNhbXB7LS1wcmVmaXh9IGRpcmVjdG9yeSwgd2lsbCBob2xkCi1tYWNoaW5lIGRlcGVuZGVudCBmaWxlcyBzdWNoIGFzIGV4ZWN1dGFibGVzLgotCi1UaGUgZGVmYXVsdCBmb3IgQHNhbXB7LS1wcmVmaXh9IGlzIEBmaWxley91c3IvbG9jYWx9LiAgVGhlIGRlZmF1bHQgZm9yCi1Ac2FtcHstLWV4ZWMtcHJlZml4fSBpcyB0aGUgdmFsdWUgdXNlZCBmb3IgQHNhbXB7LS1wcmVmaXh9LgotCi1UaGUgY29udmVudGlvbiB1c2VkIGluIEN5Z251cyByZWxlYXNlcyBpcyB0byB1c2UgYSBAc2FtcHstLXByZWZpeH0KLW9wdGlvbiBvZiBAZmlsZXsvdXNyL2N5Z251cy9AdmFye3JlbGVhc2V9fSwgd2hlcmUgQHZhcntyZWxlYXNlfSBpcyB0aGUKLW5hbWUgb2YgdGhlIHJlbGVhc2UsIGFuZCB0byB1c2UgYSBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb24gb2YKLUBmaWxley91c3IvY3lnbnVzL0B2YXJ7cmVsZWFzZX0vSC1AdmFye2hvc3R9fSwgd2hlcmUgQHZhcntob3N0fSBpcyB0aGUKLWNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgaG9zdCBzeXN0ZW0gKEBweHJlZntDb25maWd1cmF0aW9uIE5hbWVzfSkuCi0KLURvIG5vdCB1c2UgZWl0aGVyIHRoZSBzb3VyY2Ugb3IgdGhlIG9iamVjdCBkaXJlY3RvcnkgYXMgdGhlIGluc3RhbGxhdGlvbgotZGlyZWN0b3J5LiAgVGhhdCB3aWxsIGp1c3QgbGVhZCB0byBjb25mdXNpb24uCi0KLUBub2RlIEdldHRpbmcgU3RhcnRlZAotQGNoYXB0ZXIgR2V0dGluZyBTdGFydGVkCi0KLVRvIHN0YXJ0IHVzaW5nIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gd2l0aCB5b3VyIHNvZnR3YXJlCi1wYWNrYWdlLCB5b3UgbXVzdCB3cml0ZSB0aHJlZSBmaWxlcywgYW5kIHlvdSBtdXN0IHJ1biBzb21lIHRvb2xzIHRvCi1tYW51YWxseSBnZW5lcmF0ZSBhZGRpdGlvbmFsIGZpbGVzLgotCi1AbWVudQotKiBXcml0ZSBjb25maWd1cmUuaW46OgkJV3JpdGUgY29uZmlndXJlLmluLgotKiBXcml0ZSBNYWtlZmlsZS5hbTo6CQlXcml0ZSBNYWtlZmlsZS5hbS4KLSogV3JpdGUgYWNjb25maWcuaDo6CQlXcml0ZSBhY2NvbmZpZy5oLgotKiBHZW5lcmF0ZSBmaWxlczo6CQlHZW5lcmF0ZSBmaWxlcy4KLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGU6OglFeGFtcGxlLgotQGVuZCBtZW51Ci0KLUBub2RlIFdyaXRlIGNvbmZpZ3VyZS5pbgotQHNlY3Rpb24gV3JpdGUgY29uZmlndXJlLmluCi1AY2luZGV4IEBmaWxle2NvbmZpZ3VyZS5pbn0sIHdyaXRpbmcKLQotWW91IG11c3QgZmlyc3Qgd3JpdGUgdGhlIGZpbGUgQGZpbGV7Y29uZmlndXJlLmlufS4gIFRoaXMgaXMgYW4gYXV0b2NvbmYKLWlucHV0IGZpbGUsIGFuZCB0aGUgYXV0b2NvbmYgbWFudWFsIGRlc2NyaWJlcyBpbiBkZXRhaWwgd2hhdCB0aGlzIGZpbGUKLXNob3VsZCBsb29rIGxpa2UuCi0KLVlvdSB3aWxsIHdyaXRlIHRlc3RzIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIHRvIGNoZWNrIGZvcgotY29uZGl0aW9ucyB0aGF0IG1heSBjaGFuZ2UgZnJvbSBvbmUgc3lzdGVtIHRvIGFub3RoZXIsIHN1Y2ggYXMgdGhlCi1wcmVzZW5jZSBvZiBwYXJ0aWN1bGFyIGhlYWRlciBmaWxlcyBvciBmdW5jdGlvbnMuCi0KLUZvciBleGFtcGxlLCBub3QgYWxsIHN5c3RlbXMgc3VwcG9ydCB0aGUgQHNhbXB7Z2V0dGltZW9mZGF5fSBmdW5jdGlvbi4KLUlmIHlvdSB3YW50IHRvIHVzZSB0aGUgQHNhbXB7Z2V0dGltZW9mZGF5fSBmdW5jdGlvbiB3aGVuIGl0IGlzCi1hdmFpbGFibGUsIGFuZCB0byB1c2Ugc29tZSBvdGhlciBmdW5jdGlvbiB3aGVuIGl0IGlzIG5vdCwgeW91IHdvdWxkCi1jaGVjayBmb3IgdGhpcyBieSBwdXR0aW5nIEBzYW1we0FDX0NIRUNLX0ZVTkNTKGdldHRpbWVvZmRheSl9IGluCi1AZmlsZXtjb25maWd1cmUuaW59LgotCi1XaGVuIHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIHJ1biBhdCBidWlsZCB0aW1lLCB0aGlzIHdpbGwgYXJyYW5nZSB0bwotZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8gQHNhbXB7SEFWRV9HRVRUSU1FT0ZEQVl9IHRvIHRoZSB2YWx1ZSAxIGlmCi10aGUgQHNhbXB7Z2V0dGltZW9mZGF5fSBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIGFuZCB0byBub3QgZGVmaW5lIHRoZQotbWFjcm8gYXQgYWxsIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgWW91ciBjb2RlIGNhbiB0aGVuIHVzZQotQHNhbXB7I2lmZGVmfSB0byB0ZXN0IHdoZXRoZXIgaXQgaXMgc2FmZSB0byBjYWxsIEBzYW1we2dldHRpbWVvZmRheX0uCi0KLUlmIHlvdSBoYXZlIGFuIGV4aXN0aW5nIGJvZHkgb2YgY29kZSwgdGhlIEBzYW1we2F1dG9zY2FufSBwcm9ncmFtIG1heQotaGVscCBpZGVudGlmeSBwb3RlbnRpYWwgcG9ydGFiaWxpdHkgcHJvYmxlbXMsIGFuZCBoZW5jZSBjb25maWd1cmUgdGVzdHMKLXRoYXQgeW91IHdpbGwgd2FudCB0byB1c2UuCi1AaWZub3RodG1sCi1AeHJlZntJbnZva2luZyBhdXRvc2NhbiwgLCAsIGF1dG9jb25mLCB0aGUgYXV0b2NvbmYgbWFudWFsfS4KLUBlbmQgaWZub3RodG1sCi1AaWZodG1sCi1TZWUgQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvY29uZi9hdXRvY29uZl80Lmh0bWwsIHRoZQotYXV0b3NjYW4gZG9jdW1lbnRhdGlvbn0uCi1AZW5kIGlmaHRtbAotCi1Bbm90aGVyIGhhbmR5IHRvb2wgZm9yIGFuIGV4aXN0aW5nIGJvZHkgb2YgY29kZSBpcyBAc2FtcHtpZm5hbWVzfS4gIFRoaXMKLXdpbGwgc2hvdyB5b3UgYWxsIHRoZSBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzIHRoYXQgdGhlIGNvZGUgYWxyZWFkeQotdXNlcy4KLUBpZm5vdGh0bWwKLUB4cmVme0ludm9raW5nIGlmbmFtZXMsICwgLCBhdXRvY29uZiwgdGhlIGF1dG9jb25mIG1hbnVhbH0uCi1AZW5kIGlmbm90aHRtbAotQGlmaHRtbAotU2VlIEB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b2NvbmYvYXV0b2NvbmZfNS5odG1sLCB0aGUKLWlmbmFtZXMgZG9jdW1lbnRhdGlvbn0uCi1AZW5kIGlmaHRtbAotCi1CZXNpZGVzIHRoZSBwb3J0YWJpbGl0eSB0ZXN0cyB3aGljaCBhcmUgc3BlY2lmaWMgdG8geW91ciBwYXJ0aWN1bGFyCi1wYWNrYWdlLCBldmVyeSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZwotbWFjcm9zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIEFDX0lOSVQKLUBjaW5kZXggQHNhbXB7QUNfSU5JVH0KLVRoaXMgbWFjcm8gdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBuYW1lIG9mIGEgZmlsZSBpbiB5b3VyCi1wYWNrYWdlLiAgRm9yIGV4YW1wbGUsIEBzYW1we0FDX0lOSVQoZm9vLmMpfS4KLQotQGl0ZW0gQUNfUFJFUkVRKEB2YXJ7VkVSU0lPTn0pCi1AY2luZGV4IEBzYW1we0FDX1BSRVJFUX0KLVRoaXMgbWFjcm8gaXMgb3B0aW9uYWwuICBJdCBtYXkgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZgotQHNhbXB7YXV0b2NvbmZ9IHRoYXQgeW91IGFyZSB1c2luZy4gIFRoaXMgd2lsbCBwcmV2ZW50IHVzZXJzIGZyb20KLXJ1bm5pbmcgYW4gZWFybGllciB2ZXJzaW9uIG9mIEBzYW1we2F1dG9jb25mfSBhbmQgcGVyaGFwcyBnZXR0aW5nIGFuCi1pbnZhbGlkIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LiAgRm9yIGV4YW1wbGUsIEBzYW1we0FDX1BSRVJFUSgyLjEyKX0uCi0KLUBpdGVtIEFNX0lOSVRfQVVUT01BS0UKLUBjaW5kZXggQHNhbXB7QU1fSU5JVF9BVVRPTUFLRX0KLVRoaXMgbWFjcm8gdGFrZXMgdHdvIGFyZ3VtZW50czogdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UsIGFuZCBhIHZlcnNpb24KLW51bWJlci4gIEZvciBleGFtcGxlLCBAc2FtcHtBTV9JTklUX0FVVE9NQUtFKGZvbywgMS4wKX0uICAoVGhpcyBtYWNybyBpcwotbm90IG5lZWRlZCBpZiB5b3UgYXJlIG5vdCB1c2luZyBhdXRvbWFrZSkuCi0KLUBpdGVtIEFNX0NPTkZJR19IRUFERVIKLUBjaW5kZXggQHNhbXB7QU1fQ09ORklHX0hFQURFUn0KLVRoaXMgbWFjcm8gbmFtZXMgdGhlIGhlYWRlciBmaWxlIHdoaWNoIHdpbGwgaG9sZCB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvCi1kZWZpbml0aW9ucyBhdCBydW4gdGltZS4gIE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIEBmaWxle2NvbmZpZy5ofS4gIFlvdXIKLXNvdXJjZXMgd291bGQgdGhlbiB1c2UgQHNhbXB7I2luY2x1ZGUgImNvbmZpZy5oIn0gdG8gaW5jbHVkZSBpdC4KLQotVGhpcyBtYWNybyBtYXkgb3B0aW9uYWxseSBuYW1lIHRoZSBpbnB1dCBmaWxlIGZvciB0aGF0IGhlYWRlciBmaWxlOyBieQotZGVmYXVsdCwgdGhpcyBpcyBAZmlsZXtjb25maWcuaC5pbn0sIGJ1dCB0aGF0IGZpbGUgbmFtZSB3b3JrcyBwb29ybHkgb24KLURPUyBmaWxlc3lzdGVtcy4gIFRoZXJlZm9yZSwgaXQgaXMgb2Z0ZW4gYmV0dGVyIHRvIG5hbWUgaXQgZXhwbGljaXRseSBhcwotQGZpbGV7Y29uZmlnLmlufS4KLQotVGhpcyBpcyB3aGF0IHlvdSBzaG91bGQgbm9ybWFsbHkgcHV0IGluIEBmaWxle2NvbmZpZ3VyZS5pbn06Ci1AZXhhbXBsZQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi1AZW5kIGV4YW1wbGUKLQotQGNpbmRleCBAc2FtcHtBQ19DT05GSUdfSEVBREVSfQotKElmIHlvdSBhcmUgbm90IHVzaW5nIGF1dG9tYWtlLCB1c2UgQHNhbXB7QUNfQ09ORklHX0hFQURFUn0gcmF0aGVyIHRoYW4KLUBzYW1we0FNX0NPTkZJR19IRUFERVJ9KS4KLQotQGl0ZW0gQU1fTUFJTlRBSU5FUl9NT0RFCi1AY2luZGV4IEBzYW1we0FNX01BSU5UQUlORVJfTU9ERX0KLVRoaXMgbWFjcm8gYWx3YXlzIGFwcGVhcnMgaW4gQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHRzLiAgT3RoZXIgcHJvZ3JhbXMKLW1heSBvciBtYXkgbm90IHVzZSBpdC4KLQotSWYgdGhpcyBtYWNybyBpcyB1c2VkLCB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24gaXMKLXJlcXVpcmVkIHRvIGVuYWJsZSBhdXRvbWF0aWMgcmVidWlsZGluZyBvZiBnZW5lcmF0ZWQgZmlsZXMgdXNlZCBieSB0aGUKLWNvbmZpZ3VyZSBzeXN0ZW0uICBUaGlzIG9mIGNvdXJzZSByZXF1aXJlcyB0aGF0IGRldmVsb3BlcnMgYmUgYXdhcmUgb2YsCi1hbmQgdXNlLCB0aGF0IG9wdGlvbi4KLQotSWYgdGhpcyBtYWNybyBpcyBub3QgdXNlZCwgdGhlbiB0aGUgZ2VuZXJhdGVkIGZpbGVzIHdpbGwgYWx3YXlzIGJlCi1yZWJ1aWx0IGF1dG9tYXRpY2FsbHkuICBUaGlzIHdpbGwgY2F1c2UgcHJvYmxlbXMgaWYgdGhlIHdyb25nIHZlcnNpb25zCi1vZiBhdXRvY29uZiwgYXV0b21ha2UsIG9yIG90aGVycyBhcmUgaW4gdGhlIGJ1aWxkZXIncyBAc2FtcHtQQVRIfS4KLQotKElmIHlvdSBhcmUgbm90IHVzaW5nIGF1dG9tYWtlLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoaXMgbWFjcm8pLgotCi1AaXRlbSBBQ19FWEVFWFQKLUBjaW5kZXggQHNhbXB7QUNfRVhFRVhUfQotQGNpbmRleCBAc2FtcHtBTV9FWEVFWFR9Ci1FaXRoZXIgdGhpcyBtYWNybyBvciBAc2FtcHtBTV9FWEVFWFR9IGFsd2F5cyBhcHBlYXJzIGluIEN5Z251cyBjb25maWd1cmUKLWZpbGVzLiAgT3RoZXIgcHJvZ3JhbXMgbWF5IG9yIG1heSBub3QgdXNlIG9uZSBvZiB0aGVtLgotCi1UaGlzIG1hY3JvIGxvb2tzIGZvciB0aGUgZXhlY3V0YWJsZSBzdWZmaXggdXNlZCBvbiB0aGUgaG9zdCBzeXN0ZW0uICBPbgotVW5peCBzeXN0ZW1zLCB0aGlzIGlzIHRoZSBlbXB0eSBzdHJpbmcuICBPbiBXaW5kb3dzIHN5c3RlbXMsIHRoaXMgaXMKLUBzYW1wey5leGV9LiAgVGhpcyBtYWNybyBkaXJlY3RzIGF1dG9tYWtlIHRvIHVzZSB0aGUgZXhlY3V0YWJsZSBzdWZmaXgKLWFzIGFwcHJvcHJpYXRlIHdoZW4gY3JlYXRpbmcgcHJvZ3JhbXMuICBUaGlzIG1hY3JvIGRvZXMgbm90IHRha2UgYW55Ci1hcmd1bWVudHMuCi0KLVRoZSBAc2FtcHtBQ19FWEVFWFR9IGZvcm0gaXMgbmV3LCBhbmQgaXMgcGFydCBvZiBhIEN5Z251cyBwYXRjaCB0bwotYXV0b2NvbmYgdG8gc3VwcG9ydCBjb21waWxpbmcgd2l0aCBWaXN1YWwgQysrLiAgT2xkZXIgcHJvZ3JhbXMgdXNlCi1Ac2FtcHtBTV9FWEVFWFR9IGluc3RlYWQuCi0KLShQcm9ncmFtcyB3aGljaCBkbyBub3QgdXNlIGF1dG9tYWtlIHVzZSBuZWl0aGVyIEBzYW1we0FDX0VYRUVYVH0gbm9yCi1Ac2FtcHtBTV9FWEVFWFR9KS4KLQotQGl0ZW0gQUNfUFJPR19DQwotQGNpbmRleCBAc2FtcHtBQ19QUk9HX0NDfQotSWYgeW91IGFyZSB3cml0aW5nIEMgY29kZSwgeW91IHdpbGwgbm9ybWFsbHkgd2FudCB0byB1c2UgdGhpcyBtYWNyby4gIEl0Ci1sb2NhdGVzIHRoZSBDIGNvbXBpbGVyIHRvIHVzZS4gIEl0IGRvZXMgbm90IHRha2UgYW55IGFyZ3VtZW50cy4KLQotSG93ZXZlciwgaWYgdGhpcyBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaXMgZm9yIGEgbGlicmFyeSB3aGljaCBpcyB0bwotYmUgY29tcGlsZWQgYnkgYSBjcm9zcyBjb21waWxlciB3aGljaCBtYXkgbm90IGZ1bGx5IHdvcmssIHRoZW4geW91IHdpbGwKLW5vdCB3YW50IHRvIHVzZSBAc2FtcHtBQ19QUk9HX0NDfS4gIEluc3RlYWQsIHlvdSB3aWxsIHdhbnQgdG8gdXNlIGEKLXZhcmlhbnQgd2hpY2ggZG9lcyBub3QgY2FsbCB0aGUgbWFjcm8gQHNhbXB7QUNfUFJPR19DQ19XT1JLU30uICBFeGFtcGxlcwotY2FuIGJlIGZvdW5kIGluIHZhcmlvdXMgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlcyBmb3IgbGlicmFyaWVzIHRoYXQgYXJlCi1jb21waWxlZCB3aXRoIGNyb3NzIGNvbXBpbGVycywgc3VjaCBhcyBsaWJpYmVydHkgb3IgbGliZ2xvc3MuICBUaGlzIGlzCi1lc3NlbnRpYWxseSBhIGJ1ZyBpbiBhdXRvY29uZiwgYW5kIHRoZXJlIHdpbGwgcHJvYmFibHkgYmUgYSBiZXR0ZXIKLXdvcmthcm91bmQgYXQgc29tZSBwb2ludC4KLQotQGl0ZW0gQUNfUFJPR19DWFgKLUBjaW5kZXggQHNhbXB7QUNfUFJPR19DWFh9Ci1JZiB5b3UgYXJlIHdyaXRpbmcgQysrIGNvZGUsIHlvdSB3aWxsIHdhbnQgdG8gdXNlIHRoaXMgbWFjcm8uICBJdAotbG9jYXRlcyB0aGUgQysrIGNvbXBpbGVyIHRvIHVzZS4gIEl0IGRvZXMgbm90IHRha2UgYW55IGFyZ3VtZW50cy4gIFRoZQotc2FtZSBjcm9zcyBjb21waWxlciBjb21tZW50cyBhcHBseSBhcyBmb3IgQHNhbXB7QUNfUFJPR19DQ30uCi0KLUBpdGVtIEFNX1BST0dfTElCVE9PTAotQGNpbmRleCBAc2FtcHtBTV9QUk9HX0xJQlRPT0x9Ci1JZiB5b3Ugd2FudCB0byBidWlsZCBsaWJyYXJpZXMsIGFuZCB5b3Ugd2FudCB0byBwZXJtaXQgdGhlbSB0byBiZQotc2hhcmVkLCBvciB5b3Ugd2FudCB0byBsaW5rIGFnYWluc3QgbGlicmFyaWVzIHdoaWNoIHdlcmUgYnVpbHQgdXNpbmcKLWxpYnRvb2wsIHRoZW4geW91IHdpbGwgbmVlZCB0aGlzIG1hY3JvLiAgVGhpcyBtYWNybyBpcyByZXF1aXJlZCBpbiBvcmRlcgotdG8gdXNlIGxpYnRvb2wuCi0KLUBjaW5kZXggQHNhbXB7QU1fRElTQUJMRV9TSEFSRUR9Ci1CeSBkZWZhdWx0LCB0aGlzIHdpbGwgY2F1c2UgYWxsIGxpYnJhcmllcyB0byBiZSBidWlsdCBhcyBzaGFyZWQKLWxpYnJhcmllcy4gIFRvIHByZXZlbnQgdGhpcy0tdG8gY2hhbmdlIHRoZSBkZWZhdWx0LS11c2UKLUBzYW1we0FNX0RJU0FCTEVfU0hBUkVEfSBiZWZvcmUgQHNhbXB7QU1fUFJPR19MSUJUT09MfS4gIFRoZSBjb25maWd1cmUKLW9wdGlvbnMgQHNhbXB7LS1lbmFibGUtc2hhcmVkfSBhbmQgQHNhbXB7LS1kaXNhYmxlLXNoYXJlZH0gbWF5IGJlIHVzZWQKLXRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGF0IGJ1aWxkIHRpbWUuCi0KLUBpdGVtIEFDX0RFRklORShfR05VX1NPVVJDRSkKLUBjaW5kZXggQHNhbXB7X0dOVV9TT1VSQ0V9Ci1HTlUgcGFja2FnZXMgc2hvdWxkIG5vcm1hbGx5IGluY2x1ZGUgdGhpcyBsaW5lIGJlZm9yZSBhbnkgb3RoZXIgZmVhdHVyZQotdGVzdHMuICBUaGlzIGRlZmluZXMgdGhlIG1hY3JvIEBzYW1we19HTlVfU09VUkNFfSB3aGVuIGNvbXBpbGluZywgd2hpY2gKLWRpcmVjdHMgdGhlIGxpYmMgaGVhZGVyIGZpbGVzIHRvIHByb3ZpZGUgdGhlIHN0YW5kYXJkIEdOVSBzeXN0ZW0KLWludGVyZmFjZXMgaW5jbHVkaW5nIGFsbCBHTlUgZXh0ZW5zaW9ucy4gIElmIHRoaXMgbWFjcm8gaXMgbm90IGRlZmluZWQsCi1jZXJ0YWluIEdOVSBleHRlbnNpb25zIG1heSBub3QgYmUgYXZhaWxhYmxlLgotCi1AaXRlbSBBQ19PVVRQVVQKLUBjaW5kZXggQHNhbXB7QUNfT1VUUFVUfQotVGhpcyBtYWNybyB0YWtlcyBhIGxpc3Qgb2YgZmlsZSBuYW1lcyB3aGljaCB0aGUgY29uZmlndXJlIHByb2Nlc3Mgc2hvdWxkCi1wcm9kdWNlLiAgVGhpcyBpcyBub3JtYWxseSBhIGxpc3Qgb2Ygb25lIG9yIG1vcmUgQGZpbGV7TWFrZWZpbGV9IGZpbGVzCi1pbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuICBJZiB5b3VyIHBhY2thZ2UgbGl2ZXMgZW50aXJlbHkgaW4gYSBzaW5nbGUKLWRpcmVjdG9yeSwgeW91IHdvdWxkIHVzZSBzaW1wbHkgQHNhbXB7QUNfT1VUUFVUKE1ha2VmaWxlKX0uICBJZiB5b3UgYWxzbwotaGF2ZSwgZm9yIGV4YW1wbGUsIGEgQGZpbGV7bGlifSBzdWJkaXJlY3RvcnksIHlvdSB3b3VsZCB1c2UKLUBzYW1we0FDX09VVFBVVChNYWtlZmlsZSBsaWIvTWFrZWZpbGUpfS4KLUBlbmQgdGFibGUKLQotSWYgeW91IHdhbnQgdG8gdXNlIGxvY2FsbHkgZGVmaW5lZCBtYWNyb3MgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59Ci1maWxlLCB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gd3JpdGUgYSBAZmlsZXthY2luY2x1ZGUubTR9IGZpbGUgd2hpY2gKLWRlZmluZXMgdGhlbSAoaWYgbm90IHVzaW5nIGF1dG9tYWtlLCB0aGlzIGZpbGUgaXMgY2FsbGVkCi1AZmlsZXthY2xvY2FsLm00fSkuICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHB1dCBzZXBhcmF0ZSBtYWNyb3MgaW4gYW4KLUBmaWxle200fSBzdWJkaXJlY3RvcnksIGFuZCBwdXQgQHNhbXB7QUNMT0NBTF9BTUZMQUdTID0gLUkgbTR9IGluIHlvdXIKLUBmaWxle01ha2VmaWxlLmFtfSBmaWxlIHNvIHRoYXQgdGhlIEBzYW1we2FjbG9jYWx9IHByb2dyYW0gd2lsbCBiZSBhYmxlCi10byBmaW5kIHRoZW0uCi0KLVRoZSBkaWZmZXJlbnQgbWFjcm8gcHJlZml4ZXMgaW5kaWNhdGUgd2hpY2ggdG9vbCBkZWZpbmVzIHRoZSBtYWNyby4KLU1hY3JvcyB3aGljaCBzdGFydCB3aXRoIEBzYW1we0FDX30gYXJlIHBhcnQgb2YgYXV0b2NvbmYuICBNYWNyb3Mgd2hpY2gKLXN0YXJ0IHdpdGggQHNhbXB7QU1ffSBhcmUgcHJvdmlkZWQgYnkgYXV0b21ha2Ugb3IgbGlidG9vbC4KLQotQG5vZGUgV3JpdGUgTWFrZWZpbGUuYW0KLUBzZWN0aW9uIFdyaXRlIE1ha2VmaWxlLmFtCi1AY2luZGV4IEBmaWxle01ha2VmaWxlLmFtfSwgd3JpdGluZwotCi1Zb3UgbXVzdCB3cml0ZSB0aGUgZmlsZSBAZmlsZXtNYWtlZmlsZS5hbX0uICBUaGlzIGlzIGFuIGF1dG9tYWtlIGlucHV0Ci1maWxlLCBhbmQgdGhlIGF1dG9tYWtlIG1hbnVhbCBkZXNjcmliZXMgaW4gZGV0YWlsIHdoYXQgdGhpcyBmaWxlIHNob3VsZAotbG9vayBsaWtlLgotCi1UaGUgYXV0b21ha2UgY29tbWFuZHMgaW4gQGZpbGV7TWFrZWZpbGUuYW19IG1vc3RseSBsb29rIGxpa2UgdmFyaWFibGUKLWFzc2lnbm1lbnRzIGluIGEgQGZpbGV7TWFrZWZpbGV9LiAgYXV0b21ha2UgcmVjb2duaXplcyBzcGVjaWFsIHZhcmlhYmxlCi1uYW1lcywgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIG1ha2UgcnVsZXMgdG8gdGhlIG91dHB1dCBhcyBuZWVkZWQuCi0KLVRoZXJlIHdpbGwgYmUgb25lIEBmaWxle01ha2VmaWxlLmFtfSBmaWxlIGZvciBlYWNoIGRpcmVjdG9yeSBpbiB5b3VyCi1wYWNrYWdlLiAgRm9yIGVhY2ggZGlyZWN0b3J5IHdpdGggc3ViZGlyZWN0b3JpZXMsIHRoZSBAZmlsZXtNYWtlZmlsZS5hbX0KLWZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGxpbmUKLUBzbWFsbGV4YW1wbGUKLVNVQkRJUlMgPSBAdmFye2Rpcn0gQHZhcntkaXJ9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIGVhY2ggQHZhcntkaXJ9IGlzIHRoZSBuYW1lIG9mIGEgc3ViZGlyZWN0b3J5LgotCi1Gb3IgZWFjaCBAZmlsZXtNYWtlZmlsZS5hbX0sIHRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcKLUBmaWxle01ha2VmaWxlfSBpbiB0aGUgQHNhbXB7QUNfT1VUUFVUfSBtYWNybyBpbiBAZmlsZXtjb25maWd1cmUuaW59LgotCi1FdmVyeSBAZmlsZXtNYWtlZmlsZS5hbX0gd3JpdHRlbiBhdCBDeWdudXMgc2hvdWxkIGNvbnRhaW4gdGhlIGxpbmUKLUBzbWFsbGV4YW1wbGUKLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoaXMgcHV0cyBhdXRvbWFrZSBpbnRvIEN5Z251cyBtb2RlLiAgU2VlIHRoZSBhdXRvbWFrZSBtYW51YWwgZm9yCi1kZXRhaWxzLgotCi1Zb3UgbWF5IHRvIGluY2x1ZGUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBzYW1we2F1dG9tYWtlfSB0aGF0IHlvdSBhcmUKLXVzaW5nIG9uIHRoZSBAc2FtcHtBVVRPTUFLRV9PUFRJT05TfSBsaW5lLiAgRm9yIGV4YW1wbGUsCi1Ac21hbGxleGFtcGxlCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIDEuMwotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyB3aWxsIHByZXZlbnQgdXNlcnMgZnJvbSBydW5uaW5nIGFuIGVhcmxpZXIgdmVyc2lvbiBvZgotQHNhbXB7YXV0b21ha2V9IGFuZCBwZXJoYXBzIGdldHRpbmcgYW4gaW52YWxpZCBAZmlsZXtNYWtlZmlsZS5pbn0uCi0KLUlmIHlvdXIgcGFja2FnZSBidWlsZHMgYSBwcm9ncmFtLCB0aGVuIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhhdAotcHJvZ3JhbSBpcyBidWlsdCB5b3Ugd2lsbCBub3JtYWxseSB3YW50IGEgbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1iaW5fUFJPR1JBTVMgPSBAdmFye3Byb2dyYW19Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBAdmFye3Byb2dyYW19IGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtLiAgWW91IHdpbGwgdGhlbiB3YW50IGEKLWxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotQHZhcntwcm9ncmFtfV9TT1VSQ0VTID0gQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIGVhY2ggQHZhcntmaWxlfSBpcyB0aGUgbmFtZSBvZiBhIHNvdXJjZSBmaWxlIHRvIGxpbmsgaW50byB0aGUKLXByb2dyYW0gKGUuZy4sIEBzYW1we2Zvby5jfSkuCi0KLUlmIHlvdXIgcGFja2FnZSBidWlsZHMgYSBsaWJyYXJ5LCBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBsaWJyYXJ5IHRvCi1ldmVyIGJlIGJ1aWx0IGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGF0Ci1saWJyYXJ5IGlzIGJ1aWx0IHlvdSB3aWxsIG5vcm1hbGx5IHdhbnQgYSBsaW5lIGxpa2UKLUBzbWFsbGV4YW1wbGUKLWxpYl9MSUJSQVJJRVMgPSBsaWJAdmFye25hbWV9LmEKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIEBzYW1we2xpYkB2YXJ7bmFtZX0uYX0gaXMgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkuICBZb3Ugd2lsbCB0aGVuCi13YW50IGEgbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1saWJAdmFye25hbWV9X2FfU09VUkNFUyA9IEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBlYWNoIEB2YXJ7ZmlsZX0gaXMgdGhlIG5hbWUgb2YgYSBzb3VyY2UgZmlsZSB0byBhZGQgdG8gdGhlCi1saWJyYXJ5LgotCi1JZiB5b3VyIHBhY2thZ2UgYnVpbGRzIGEgbGlicmFyeSwgYW5kIHlvdSB3YW50IHRvIHBlcm1pdCBidWlsZGluZyB0aGUKLWxpYnJhcnkgYXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoYXQgbGlicmFyeSBpcwotYnVpbHQgeW91IHdpbGwgbm9ybWFsbHkgd2FudCBhIGxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotbGliX0xUTElCUkFSSUVTID0gbGliQHZhcntuYW1lfS5sYQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSB1c2Ugb2YgQHNhbXB7TFRMSUJSQVJJRVN9LCBhbmQgdGhlIEBzYW1wey5sYX0gZXh0ZW5zaW9uLCBpbmRpY2F0ZSBhCi1saWJyYXJ5IHRvIGJlIGJ1aWx0IHVzaW5nIGxpYnRvb2wuICBBcyB1c3VhbCwgeW91IHdpbGwgdGhlbiB3YW50IGEgbGluZQotbGlrZQotQHNtYWxsZXhhbXBsZQotbGliQHZhcntuYW1lfV9sYV9TT1VSQ0VTID0gQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBzdHJpbmdzIEBzYW1we2Jpbn0gYW5kIEBzYW1we2xpYn0gdGhhdCBhcHBlYXIgYWJvdmUgaW4KLUBzYW1we2Jpbl9QUk9HUkFNU30gYW5kIEBzYW1we2xpYl9MSUJSQVJJRVN9IGFyZSBub3QgYXJiaXRyYXJ5LiAgVGhleQotcmVmZXIgdG8gcGFydGljdWxhciBkaXJlY3Rvcmllcywgd2hpY2ggbWF5IGJlIHNldCBieSB0aGUgQHNhbXB7LS1iaW5kaXJ9Ci1hbmQgQHNhbXB7LS1saWJkaXJ9IG9wdGlvbnMgdG8gQGZpbGV7Y29uZmlndXJlfS4gIElmIHRob3NlIG9wdGlvbnMgYXJlCi1ub3QgdXNlZCwgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgQHNhbXB7LS1wcmVmaXh9IG9yCi1Ac2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb25zIHRvIEBmaWxle2NvbmZpZ3VyZX0uICBJdCBpcyBwb3NzaWJsZSB0byB1c2UKLW90aGVyIG5hbWVzIGlmIHRoZSBwcm9ncmFtIG9yIGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiBzb21lIG90aGVyCi1kaXJlY3RvcnkuCi0KLVRoZSBAZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBtYXkgYWxzbyBjb250YWluIGFsbW9zdCBhbnl0aGluZyB0aGF0IG1heQotYXBwZWFyIGluIGEgbm9ybWFsIEBmaWxle01ha2VmaWxlfS4gIGF1dG9tYWtlIGFsc28gc3VwcG9ydHMgbWFueSBvdGhlcgotc3BlY2lhbCB2YXJpYWJsZXMsIGFzIHdlbGwgYXMgY29uZGl0aW9uYWxzLgotCi1TZWUgdGhlIGF1dG9tYWtlIG1hbnVhbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQG5vZGUgV3JpdGUgYWNjb25maWcuaAotQHNlY3Rpb24gV3JpdGUgYWNjb25maWcuaAotQGNpbmRleCBAZmlsZXthY2NvbmZpZy5ofSwgd3JpdGluZwotCi1JZiB5b3UgYXJlIGdlbmVyYXRpbmcgYSBwb3J0YWJpbGl0eSBoZWFkZXIgZmlsZSwgKGkuZS4sIHlvdSBhcmUgdXNpbmcKLUBzYW1we0FNX0NPTkZJR19IRUFERVJ9IGluIEBmaWxle2NvbmZpZ3VyZS5pbn0pLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8KLXdyaXRlIGEgQGZpbGV7YWNjb25maWcuaH0gZmlsZS4gIEl0IHdpbGwgaGF2ZSB0byBjb250YWluIHRoZSBmb2xsb3dpbmcKLWxpbmVzLgotCi1Ac21hbGxleGFtcGxlCi0vKiBOYW1lIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBWRVJTSU9OCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHJlcXVpcmVtZW50IGlzIHJlYWxseSBhIGJ1ZyBpbiB0aGUgc3lzdGVtLCBhbmQgdGhlIHJlcXVpcmVtZW50IG1heQotYmUgZWxpbWluYXRlZCBhdCBzb21lIGxhdGVyIGRhdGUuCi0KLVRoZSBAZmlsZXthY2NvbmZpZy5ofSBmaWxlIHdpbGwgYWxzbyBzaW1pbGFyIGNvbW1lbnQgYW5kIEBzYW1weyN1bmRlZn0KLWxpbmVzIGZvciBhbnkgdW51c3VhbCBtYWNyb3MgaW4gdGhlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSwgaW5jbHVkaW5nCi1hbnkgbWFjcm8gd2hpY2ggYXBwZWFycyBpbiBhIEBzYW1we0FDX0RFRklORX0gbWFjcm8uCi0KLUluIHBhcnRpY3VsYXIsIGlmIHlvdSBhcmUgd3JpdGluZyBhIEdOVSBwYWNrYWdlIGFuZCB0aGVyZWZvcmUgaW5jbHVkZQotQHNhbXB7QUNfREVGSU5FKF9HTlVfU09VUkNFKX0gaW4gQGZpbGV7Y29uZmlndXJlLmlufSBhcyBzdWdnZXN0ZWQgYWJvdmUsCi15b3Ugd2lsbCBuZWVkIGxpbmVzIGxpa2UgdGhpcyBpbiBAZmlsZXthY2NvbmZpZy5ofToKLUBzbWFsbGV4YW1wbGUKLS8qIEVuYWJsZSBHTlUgZXh0ZW5zaW9ucy4gICovCi0jdW5kZWYgX0dOVV9TT1VSQ0UKLUBlbmQgc21hbGxleGFtcGxlCi0KLU5vcm1hbGx5IHRoZSBAc2FtcHthdXRvaGVhZGVyfSBwcm9ncmFtIHdpbGwgaW5mb3JtIHlvdSBvZiBhbnkgc3VjaAotcmVxdWlyZW1lbnRzIGJ5IHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBpdCBpcyBydW4uICBIb3dldmVyLCBpZgoteW91IGRvIGFueXRoaW5nIHBhcnRpY3VsYXIgb2RkIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCB5b3UKLXdpbGwgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmlnaHQgZW50cmllcyBhcHBlYXIgaW4KLUBmaWxle2FjY29uZmlnLmh9LCBzaW5jZSBvdGhlcndpc2UgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIG1heSBub3QgYmUKLWF2YWlsYWJsZSBpbiB0aGUgQGZpbGV7Y29uZmlnLmh9IGZpbGUgd2hpY2ggeW91ciBjb2RlIHdpbGwgdXNlLgotCi0oVGhlZSBAc2FtcHtQQUNLQUdFfSBhbmQgQHNhbXB7VkVSU0lPTn0gbGluZXMgYXJlIG5vdCByZXF1aXJlZCBpZiB5b3UKLWFyZSBub3QgdXNpbmcgYXV0b21ha2UsIGFuZCBpbiB0aGF0IGNhc2UgeW91IG1heSBub3QgbmVlZCBhCi1AZmlsZXthY2NvbmZpZy5ofSBmaWxlIGF0IGFsbCkuCi0KLUBub2RlIEdlbmVyYXRlIGZpbGVzCi1Ac2VjdGlvbiBHZW5lcmF0ZSBmaWxlcwotCi1PbmNlIHlvdSBoYXZlIHdyaXR0ZW4gQGZpbGV7Y29uZmlndXJlLmlufSwgQGZpbGV7TWFrZWZpbGUuYW19LAotQGZpbGV7YWNjb25maWcuaH0sIGFuZCBwb3NzaWJseSBAZmlsZXthY2luY2x1ZGUubTR9LCB5b3UgbXVzdCB1c2UKLWF1dG9jb25mIGFuZCBhdXRvbWFrZSBwcm9ncmFtcyB0byBwcm9kdWNlIHRoZSBmaXJzdCB2ZXJzaW9ucyBvZiB0aGUKLWdlbmVyYXRlZCBmaWxlcy4gIFRoaXMgaXMgZG9uZSBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZgotY29tbWFuZHMuCi0KLUBzbWFsbGV4YW1wbGUKLWFjbG9jYWwKLWF1dG9jb25mCi1hdXRvaGVhZGVyCi1hdXRvbWFrZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzYW1we2FjbG9jYWx9IGFuZCBAc2FtcHthdXRvbWFrZX0gY29tbWFuZHMgYXJlIHBhcnQgb2YgdGhlIGF1dG9tYWtlCi1wYWNrYWdlLCBhbmQgdGhlIEBzYW1we2F1dG9jb25mfSBhbmQgQHNhbXB7YXV0b2hlYWRlcn0gY29tbWFuZHMgYXJlIHBhcnQKLW9mIHRoZSBhdXRvY29uZiBwYWNrYWdlLgotCi1JZiB5b3UgYXJlIHVzaW5nIGEgQGZpbGV7bTR9IHN1YmRpcmVjdG9yeSBmb3IgeW91ciBtYWNyb3MsIHlvdSB3aWxsIG5lZWQKLXRvIHVzZSB0aGUgQHNhbXB7LUkgbTR9IG9wdGlvbiB3aGVuIHlvdSBydW4gQHNhbXB7YWNsb2NhbH0uCi0KLUlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBDeWdudXMgdHJlZSwgdXNlIHRoZSBAc2FtcHstYX0gb3B0aW9uIHdoZW4KLXJ1bm5pbmcgQHNhbXB7YXV0b21ha2V9IGNvbW1hbmQgaW4gb3JkZXIgdG8gY29weSB0aGUgcmVxdWlyZWQgc3VwcG9ydAotZmlsZXMgaW50byB5b3VyIHNvdXJjZSBkaXJlY3RvcnkuCi0KLUlmIHlvdSBhcmUgdXNpbmcgbGlidG9vbCwgeW91IG11c3QgYnVpbGQgYW5kIGluc3RhbGwgdGhlIGxpYnRvb2wgcGFja2FnZQotd2l0aCB0aGUgc2FtZSBAc2FtcHstLXByZWZpeH0gYW5kIEBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbnMgYXMgeW91Ci11c2VkIHdpdGggdGhlIGF1dG9jb25mIGFuZCBhdXRvbWFrZSBwYWNrYWdlcy4gIFlvdSBtdXN0IGRvIHRoaXMgYmVmb3JlCi1ydW5uaW5nIGFueSBvZiB0aGUgYWJvdmUgY29tbWFuZHMuICBJZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgQ3lnbnVzCi10cmVlLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biB0aGUgQHNhbXB7bGlidG9vbGl6ZX0gcHJvZ3JhbSB0byBjb3B5IHRoZQotbGlidG9vbCBzdXBwb3J0IGZpbGVzIGludG8geW91ciBkaXJlY3RvcnkuCi0KLU9uY2UgeW91IGhhdmUgbWFuYWdlZCB0byBydW4gdGhlc2UgY29tbWFuZHMgd2l0aG91dCBnZXR0aW5nIGFueSBlcnJvcnMsCi15b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBlbXB0eSBkaXJlY3RvcnksIGFuZCBydW4gdGhlIEBzYW1we2NvbmZpZ3VyZX0KLXNjcmlwdCB3aGljaCB3aWxsIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IEBzYW1we2F1dG9jb25mfSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24uICBUaGlzIHdpbGwgZ2l2ZSB5b3UgYSBzZXQgb2YKLU1ha2VmaWxlcyB3aGljaCB3aWxsIGluY2x1ZGUgcnVsZXMgdG8gYXV0b21hdGljYWxseSByZWJ1aWxkIGFsbCB0aGUKLWdlbmVyYXRlZCBmaWxlcy4KLQotQWZ0ZXIgZG9pbmcgdGhhdCwgd2hlbmV2ZXIgeW91IGhhdmUgY2hhbmdlZCBzb21lIG9mIHRoZSBpbnB1dCBmaWxlcyBhbmQKLXdhbnQgdG8gcmVnZW5lcmF0ZWQgdGhlIG90aGVyIGZpbGVzLCBnbyB0byB5b3VyIG9iamVjdCBkaXJlY3RvcnkgYW5kIHJ1bgotQHNhbXB7bWFrZX0uICBEb2luZyB0aGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiB0cnlpbmcgdG8gcmVidWlsZCB0aGUKLWZpbGVzIG1hbnVhbGx5LCBiZWNhdXNlIHRoZXJlIGFyZSBjb21wbGV4IG9yZGVyIGRlcGVuZGVuY2llcyBhbmQgaXQgaXMKLWVhc3kgdG8gZm9yZ2V0IHNvbWV0aGluZy4KLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUKLUBzZWN0aW9uIEV4YW1wbGUKLQotTGV0J3MgY29uc2lkZXIgYSB0cml2aWFsIGV4YW1wbGUuCi0KLVN1cHBvc2Ugd2Ugd2FudCB0byB3cml0ZSBhIHNpbXBsZSB2ZXJzaW9uIG9mIEBzYW1we3RvdWNofS4gIE91ciBwcm9ncmFtLAotd2hpY2ggd2Ugd2lsbCBjYWxsIEBzYW1we3Bva2V9LCB3aWxsIHRha2UgYSBzaW5nbGUgZmlsZSBuYW1lIGFyZ3VtZW50LAotYW5kIHVzZSB0aGUgQHNhbXB7dXRpbWV9IHN5c3RlbSBjYWxsIHRvIHNldCB0aGUgbW9kaWZpY2F0aW9uIGFuZCBhY2Nlc3MKLXRpbWVzIG9mIHRoZSBmaWxlIHRvIHRoZSBjdXJyZW50IHRpbWUuICBXZSB3YW50IHRoaXMgcHJvZ3JhbSB0byBiZQotaGlnaGx5IHBvcnRhYmxlLgotCi1XZSdsbCBmaXJzdCBzZWUgd2hhdCB0aGlzIGxvb2tzIGxpa2Ugd2l0aG91dCB1c2luZyBhdXRvY29uZiBhbmQKLWF1dG9tYWtlLCBhbmQgdGhlbiBzZWUgd2hhdCBpdCBsb29rcyBsaWtlIHdpdGggdGhlbS4KLQotQG1lbnUKLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMTo6CQlGaXJzdCBUcnkuCi0qIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDI6OgkJU2Vjb25kIFRyeS4KLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMzo6CQlUaGlyZCBUcnkuCi0qIEdlbmVyYXRlIEZpbGVzIGluIEV4YW1wbGU6OgkJR2VuZXJhdGUgRmlsZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMQotQHN1YnNlY3Rpb24gRmlyc3QgVHJ5Ci0KLUhlcmUgaXMgb3VyIGZpcnN0IHRyeSBhdCBAc2FtcHtwb2tlLmN9LiAgTm90ZSB0aGF0IHdlJ3ZlIHdyaXR0ZW4gaXQKLXdpdGhvdXQgQU5TSS9JU08gQyBwcm90b3R5cGVzLCBzaW5jZSB3ZSB3YW50IGl0IHRvIGJlIGhpZ2hseSBwb3J0YWJsZS4KLQotQGV4YW1wbGUKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aW1lLmg+Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotQHsKLSAgaWYgKGFyZ2MgIT0gMikKLSAgICBAewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6IHBva2UgZmlsZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICBAfQotCi0gIGlmICh1dGltZSAoYXJndlsxXSwgTlVMTCkgPCAwKQotICAgIEB7Ci0gICAgICBwZXJyb3IgKCJ1dGltZSIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBleGl0ICgwKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotV2UgYWxzbyB3cml0ZSBhIHNpbXBsZSBAZmlsZXtNYWtlZmlsZX0uCi0KLUBleGFtcGxlCi1DQyA9IGdjYwotQ0ZMQUdTID0gLWcgLU8yCi0KLWFsbDogcG9rZQotCi1wb2tlOiBwb2tlLm8KLQkkKENDKSAtbyBwb2tlICQoQ0ZMQUdTKSAkKExERkxBR1MpIHBva2UubwotQGVuZCBleGFtcGxlCi0KLVNvIGZhciwgc28gZ29vZC4KLQotVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIGEgZmV3IHByb2JsZW1zLgotCi1PbiBvbGRlciBVbml4IHN5c3RlbXMgZGVyaXZlZCBmcm9tIEJTRCA0LjMsIHRoZSBAc2FtcHt1dGltZX0gc3lzdGVtIGNhbGwKLWRvZXMgbm90IGFjY2VwdCBhIHNlY29uZCBhcmd1bWVudCBvZiBAc2FtcHtOVUxMfS4gIE9uIHRob3NlIHN5c3RlbXMsIHdlCi1uZWVkIHRvIHBhc3MgYSBwb2ludGVyIHRvIEBzYW1we3N0cnVjdCB1dGltYnVmfSBzdHJ1Y3R1cmUuCi1VbmZvcnR1bmF0ZWx5LCBldmVuIG9sZGVyIHN5c3RlbXMgZG9uJ3QgZGVmaW5lIHRoYXQgc3RydWN0dXJlOyBvbiB0aG9zZQotc3lzdGVtcywgd2UgbmVlZCB0byBwYXNzIGFuIGFycmF5IG9mIHR3byBAc2FtcHtsb25nfSB2YWx1ZXMuCi0KLVRoZSBoZWFkZXIgZmlsZSBAZmlsZXtzdGRsaWIuaH0gd2FzIGludmVudGVkIGJ5IEFOU0kgQywgYW5kIG9sZGVyCi1zeXN0ZW1zIGRvbid0IGhhdmUgYSBjb3B5LiAgV2UgaW5jbHVkZWQgaXQgYWJvdmUgdG8gZ2V0IGEgZGVjbGFyYXRpb24gb2YKLUBzYW1we2V4aXR9LgotCi1XZSBjYW4gZmluZCBzb21lIG9mIHRoZXNlIHBvcnRhYmlsaXR5IHByb2JsZW1zIGJ5IHJ1bm5pbmcKLUBzYW1we2F1dG9zY2FufSwgd2hpY2ggd2lsbCBjcmVhdGUgYSBAZmlsZXtjb25maWd1cmUuc2Nhbn0gZmlsZSB3aGljaCB3ZQotY2FuIHVzZSBhcyBhIHByb3RvdHlwZSBmb3Igb3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZS4gIEkgd29uJ3Qgc2hvdwotdGhlIG91dHB1dCwgYnV0IGl0IHdpbGwgbm90aWNlIHRoZSBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCBAc2FtcHt1dGltZX0KLWFuZCBAZmlsZXtzdGRsaWIuaH0uCi0KLUluIG91ciBAZmlsZXtNYWtlZmlsZX0sIHdlIGRvbid0IHByb3ZpZGUgYW55IHdheSB0byBpbnN0YWxsIHRoZSBwcm9ncmFtLgotVGhpcyBkb2Vzbid0IG1hdHRlciBtdWNoIGZvciBzdWNoIGEgc2ltcGxlIGV4YW1wbGUsIGJ1dCBhIHJlYWwgcHJvZ3JhbQotd2lsbCBuZWVkIGFuIEBzYW1we2luc3RhbGx9IHRhcmdldC4gIEZvciB0aGF0IG1hdHRlciwgd2Ugd2lsbCBhbHNvIHdhbnQKLWEgQHNhbXB7Y2xlYW59IHRhcmdldC4KLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMgotQHN1YnNlY3Rpb24gU2Vjb25kIFRyeQotCi1IZXJlIGlzIG91ciBzZWNvbmQgdHJ5IGF0IHRoaXMgcHJvZ3JhbS4KLQotV2UgbW9kaWZ5IEBmaWxle3Bva2UuY30gdG8gdXNlIHByZXByb2Nlc3NvciBtYWNyb3MgdG8gY29udHJvbCB3aGF0Ci1mZWF0dXJlcyBhcmUgYXZhaWxhYmxlLiAgKEkndmUgY2hlYXRlZCBhIGJpdCBieSB1c2luZyB0aGUgc2FtZSBtYWNybwotbmFtZXMgd2hpY2ggYXV0b2NvbmYgd2lsbCB1c2UpLgotCi1AZXhhbXBsZQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBIQVZFX1VUSU1FX0gKLSNpbmNsdWRlIDx1dGltZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9VVElNRV9OVUxMCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpZm5kZWYgSEFWRV9TVFJVQ1RfVVRJTUJVRgotCi1zdHJ1Y3QgdXRpbWJ1ZgotQHsKLSAgbG9uZyBhY3RpbWU7Ci0gIGxvbmcgbW9kdGltZTsKLUB9OwotCi0jZW5kaWYKLQotc3RhdGljIGludAotdXRpbWVfbm93IChmaWxlKQotICAgICBjaGFyICpmaWxlOwotQHsKLSAgc3RydWN0IHV0aW1idWYgbm93OwotCi0gIG5vdy5hY3RpbWUgPSBub3cubW9kdGltZSA9IHRpbWUgKE5VTEwpOwotICByZXR1cm4gdXRpbWUgKGZpbGUsICZub3cpOwotQH0KLQotI2RlZmluZSB1dGltZShmLCBwKSB1dGltZV9ub3cgKGYpCi0KLSNlbmRpZiAvKiBIQVZFX1VUSU1FX05VTEwgICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotQHsKLSAgaWYgKGFyZ2MgIT0gMikKLSAgICBAewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6IHBva2UgZmlsZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICBAfQotCi0gIGlmICh1dGltZSAoYXJndlsxXSwgTlVMTCkgPCAwKQotICAgIEB7Ci0gICAgICBwZXJyb3IgKCJ1dGltZSIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBleGl0ICgwKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotSGVyZSBpcyB0aGUgYXNzb2NpYXRlZCBAZmlsZXtNYWtlZmlsZX0uICBXZSd2ZSBhZGRlZCBzdXBwb3J0IGZvciB0aGUKLXByZXByb2Nlc3NvciBmbGFncyB3ZSB1c2UuICBXZSd2ZSBhbHNvIGFkZGVkIEBzYW1we2luc3RhbGx9IGFuZAotQHNhbXB7Y2xlYW59IHRhcmdldHMuCi0KLUBleGFtcGxlCi0jIFNldCB0aGlzIHRvIHlvdXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLWJpbmRpciA9IC91c3IvbG9jYWwvYmluCi0KLSMgVW5jb21tZW50IHRoaXMgaWYgeW91IGhhdmUgdGhlIHN0YW5kYXJkIEFOU0kvSVNPIEMgaGVhZGVyIGZpbGVzLgotIyBTVERDX0hEUlMgPSAtRFNURENfSEVBREVSUwotCi0jIFVuY29tbWVudCB0aGlzIGlmIHlvdSBoYXZlIHV0aW1lLmguCi0jIFVUSU1FX0ggPSAtREhBVkVfVVRJTUVfSAotCi0jIFVuY29tbWVudCB0aGlzIGlmIHV0aW1lIChGSUxFLCBOVUxMKSB3b3JrcyBvbiB5b3VyIHN5c3RlbS4KLSMgVVRJTUVfTlVMTCA9IC1ESEFWRV9VVElNRV9OVUxMCi0KLSMgVW5jb21tZW50IHRoaXMgaWYgc3RydWN0IHV0aW1idWYgaXMgZGVmaW5lZCBpbiB1dGltZS5oLgotIyBVVElNQlVGID0gLURIQVZFX1NUUlVDVF9VVElNQlVGCi0KLUNDID0gZ2NjCi1DRkxBR1MgPSAtZyAtTzIKLQotQUxMX0NGTEFHUyA9ICQoU1REQ19IRFJTKSAkKFVUSU1FX0gpICQoVVRJTUVfTlVMTCkgJChVVElNQlVGKSAkKENGTEFHUykKLQotYWxsOiBwb2tlCi0KLXBva2U6IHBva2UubwotCSQoQ0MpIC1vIHBva2UgJChBTExfQ0ZMQUdTKSAkKExERkxBR1MpIHBva2UubwotCi0uYy5vOgotCSQoQ0MpIC1jICQoQUxMX0NGTEFHUykgcG9rZS5jCi0KLWluc3RhbGw6IHBva2UKLQljcCBwb2tlICQoYmluZGlyKS9wb2tlCi0KLWNsZWFuOgotCXJtIHBva2UgcG9rZS5vCi1AZW5kIGV4YW1wbGUKLQotU29tZSBwcm9ibGVtcyB3aXRoIHRoaXMgYXBwcm9hY2ggc2hvdWxkIGJlIGNsZWFyLgotCi1Vc2VycyB3aG8gd2FudCB0byBjb21waWxlIHBva2Ugd2lsbCBoYXZlIHRvIGtub3cgaG93IEBzYW1we3V0aW1lfSB3b3Jrcwotb24gdGhlaXIgc3lzdGVtcywgc28gdGhhdCB0aGV5IGNhbiB1bmNvbW1lbnQgdGhlIEBmaWxle01ha2VmaWxlfQotY29ycmVjdGx5LgotCi1UaGUgaW5zdGFsbGF0aW9uIGlzIGRvbmUgdXNpbmcgQHNhbXB7Y3B9LCBidXQgbWFueSBzeXN0ZW1zIGhhdmUgYW4KLUBzYW1we2luc3RhbGx9IHByb2dyYW0gd2hpY2ggbWF5IGJlIHVzZWQsIGFuZCB3aGljaCBzdXBwb3J0cyBvcHRpb25hbAotZmVhdHVyZXMgc3VjaCBhcyBzdHJpcHBpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgaW5zdGFsbGVkCi1iaW5hcnkuCi0KLVRoZSB1c2Ugb2YgQGZpbGV7TWFrZWZpbGV9IHZhcmlhYmxlcyBsaWtlIEBzYW1we0NDfSwgQHNhbXB7Q0ZMQUdTfSBhbmQKLUBzYW1we0xERkxBR1N9IGZvbGxvd3MgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIHN0YW5kYXJkcy4gIFRoaXMgaXMKLWNvbnZlbmllbnQgZm9yIGFsbCBwYWNrYWdlcywgc2luY2UgaXQgcmVkdWNlcyBzdXJwcmlzZXMgZm9yIHVzZXJzLgotSG93ZXZlciwgaXQgaXMgZWFzeSB0byBnZXQgdGhlIGRldGFpbHMgd3JvbmcsIGFuZCB3aW5kIHVwIHdpdGggYQotc2xpZ2h0bHkgbm9uc3RhbmRhcmQgZGlzdHJpYnV0aW9uLgotCi1Abm9kZSBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAzCi1Ac3Vic2VjdGlvbiBUaGlyZCBUcnkKLQotRm9yIG91ciB0aGlyZCB0cnkgYXQgdGhpcyBwcm9ncmFtLCB3ZSB3aWxsIHdyaXRlIGEgQGZpbGV7Y29uZmlndXJlLmlufQotc2NyaXB0IHRvIGRpc2NvdmVyIHRoZSBjb25maWd1cmF0aW9uIGZlYXR1cmVzIG9uIHRoZSBob3N0IHN5c3RlbSwgcmF0aGVyCi10aGFuIHJlcXVpcmluZyB0aGUgdXNlciB0byBlZGl0IHRoZSBAZmlsZXtNYWtlZmlsZX0uICBXZSB3aWxsIGFsc28gd3JpdGUKLWEgQGZpbGV7TWFrZWZpbGUuYW19IHJhdGhlciB0aGFuIGEgQGZpbGV7TWFrZWZpbGV9LgotCi1UaGUgb25seSBjaGFuZ2UgdG8gQGZpbGV7cG9rZS5jfSBpcyB0byBhZGQgYSBsaW5lIGF0IHRoZSBzdGFydCBvZiB0aGUKLWZpbGU6Ci1Ac21hbGxleGFtcGxlCi0jaW5jbHVkZSAiY29uZmlnLmgiCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgbmV3IEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBpcyBhcyBmb2xsb3dzLgotCi1AZXhhbXBsZQotQUNfSU5JVChwb2tlLmMpCi1BTV9JTklUX0FVVE9NQUtFKHBva2UsIDEuMCkKLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotQUNfUFJPR19DQwotQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlModXRpbWUuaCkKLUFDX0VHUkVQX0hFQURFUih1dGltYnVmLCB1dGltZS5oLCBBQ19ERUZJTkUoSEFWRV9TVFJVQ1RfVVRJTUJVRikpCi1BQ19GVU5DX1VUSU1FX05VTEwKLUFDX09VVFBVVChNYWtlZmlsZSkKLUBlbmQgZXhhbXBsZQotCi1UaGUgZmlyc3QgZm91ciBtYWNyb3MgaW4gdGhpcyBmaWxlLCBhbmQgdGhlIGxhc3Qgb25lLCB3ZXJlIGRlc2NyaWJlZAotYWJvdmU7IHNlZSBAcmVme1dyaXRlIGNvbmZpZ3VyZS5pbn0uICBJZiB3ZSBvbWl0IHRoZXNlIG1hY3JvcywgdGhlbiB3aGVuCi13ZSBydW4gQHNhbXB7YXV0b21ha2V9IHdlIHdpbGwgZ2V0IGEgcmVtaW5kZXIgdGhhdCB3ZSBuZWVkIHRoZW0uCi0KLVRoZSBvdGhlciBtYWNyb3MgYXJlIHN0YW5kYXJkIGF1dG9jb25mIG1hY3Jvcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBBQ19IRUFERVJfU1REQwotQ2hlY2sgZm9yIHN0YW5kYXJkIEMgaGVhZGVycy4KLUBpdGVtIEFDX0NIRUNLX0hFQURFUlMKLUNoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGhlYWRlciBmaWxlIGV4aXN0cy4KLUBpdGVtIEFDX0VHUkVQX0hFQURFUgotQ2hlY2sgZm9yIGEgcGFydGljdWxhciBzdHJpbmcgaW4gYSBwYXJ0aWN1bGFyIGhlYWRlciBmaWxlLCBpbiB0aGlzIGNhc2UKLWNoZWNraW5nIGZvciBAc2FtcHt1dGltYnVmfSBpbiBAZmlsZXt1dGltZS5ofS4KLUBpdGVtIEFDX0ZVTkNfVVRJTUVfTlVMTAotQ2hlY2sgd2hldGhlciBAc2FtcHt1dGltZX0gYWNjZXB0cyBhIE5VTEwgc2Vjb25kIGFyZ3VtZW50IHRvIHNldCB0aGUKLWZpbGUgY2hhbmdlIHRpbWUgdG8gdGhlIGN1cnJlbnQgdGltZS4KLUBlbmQgdGFibGUKLQotU2VlIHRoZSBhdXRvY29uZiBtYW51YWwgZm9yIGEgbW9yZSBjb21wbGV0ZSBkZXNjcmlwdGlvbi4KLQotVGhlIG5ldyBAZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBpcyBhcyBmb2xsb3dzLiAgTm90ZSBob3cgc2ltcGxlIHRoaXMgaXMKLWNvbXBhcmVkIHRvIG91ciBlYXJsaWVyIEBmaWxle01ha2VmaWxlfS4KLQotQGV4YW1wbGUKLWJpbl9QUk9HUkFNUyA9IHBva2UKLQotcG9rZV9TT1VSQ0VTID0gcG9rZS5jCi1AZW5kIGV4YW1wbGUKLQotVGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCBidWlsZCBhIHNpbmdsZSBwcm9ncmFtIG5hbWUgQHNhbXB7cG9rZX0uICBJdAotc2hvdWxkIGJlIGluc3RhbGxlZCBpbiB0aGUgYmluYXJ5IGRpcmVjdG9yeSwgd2hpY2ggd2UgY2FsbGVkCi1Ac2FtcHtiaW5kaXJ9IGVhcmxpZXIuICBUaGUgcHJvZ3JhbSBAc2FtcHtwb2tlfSBpcyBidWlsdCBmcm9tIHRoZSBzb3VyY2UKLWZpbGUgQGZpbGV7cG9rZS5jfS4KLQotV2UgbXVzdCBhbHNvIHdyaXRlIGEgQGZpbGV7YWNjb25maWcuaH0gZmlsZS4gIEJlc2lkZXMgQHNhbXB7UEFDS0FHRX0gYW5kCi1Ac2FtcHtWRVJTSU9OfSwgd2hpY2ggbXVzdCBiZSBtZW50aW9uZWQgZm9yIGFsbCBwYWNrYWdlcyB3aGljaCB1c2UKLWF1dG9tYWtlLCB3ZSBtdXN0IGluY2x1ZGUgQHNhbXB7SEFWRV9TVFJVQ1RfVVRJTUJVRn0sIHNpbmNlIHdlIG1lbnRpb25lZAotaXQgaW4gYW4gQHNhbXB7QUNfREVGSU5FfS4KLQotQGV4YW1wbGUKLS8qIE5hbWUgb2YgcGFja2FnZS4gICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogV2hldGhlciB1dGltZS5oIGRlZmluZXMgc3RydWN0IHV0aW1idWYuICAqLwotI3VuZGVmIEhBVkVfU1RSVUNUX1VUSU1CVUYKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBHZW5lcmF0ZSBGaWxlcyBpbiBFeGFtcGxlCi1Ac3Vic2VjdGlvbiBHZW5lcmF0ZSBGaWxlcwotCi1XZSBtdXN0IG5vdyBnZW5lcmF0ZSB0aGUgb3RoZXIgZmlsZXMsIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMuCi0KLUBzbWFsbGV4YW1wbGUKLWFjbG9jYWwKLWF1dG9jb25mCi1hdXRvaGVhZGVyCi1hdXRvbWFrZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotV2hlbiB3ZSBydW4gQHNhbXB7YXV0b2hlYWRlcn0sIGl0IHdpbGwgcmVtaW5kIHVzIG9mIGFueSBtYWNyb3Mgd2UgZm9yZ290Ci10byBhZGQgdG8gQGZpbGV7YWNjb25maWcuaH0uCi0KLVdoZW4gd2UgcnVuIEBzYW1we2F1dG9tYWtlfSwgaXQgd2lsbCB3YW50IHRvIGFkZCBzb21lIGZpbGVzIHRvIG91cgotZGlzdHJpYnV0aW9uLiAgSXQgd2lsbCBhZGQgdGhlbSBhdXRvbWF0aWNhbGx5IGlmIHdlIHVzZSB0aGUKLUBzYW1wey0tYWRkLW1pc3Npbmd9IG9wdGlvbi4KLQotQnkgZGVmYXVsdCwgQHNhbXB7YXV0b21ha2V9IHdpbGwgcnVuIGluIEdOVSBtb2RlLCB3aGljaCBtZWFucyB0aGF0IGl0Ci13aWxsIHdhbnQgdXMgdG8gY3JlYXRlIGNlcnRhaW4gYWRkaXRpb25hbCBmaWxlczsgYXMgb2YgdGhpcyB3cml0aW5nLCBpdAotd2lsbCB3YW50IEBmaWxle05FV1N9LCBAZmlsZXtSRUFETUV9LCBAZmlsZXtBVVRIT1JTfSwgYW5kCi1AZmlsZXtDaGFuZ2VMb2d9LCBhbGwgb2Ygd2hpY2ggYXJlIGZpbGVzIHdoaWNoIHNob3VsZCBhcHBlYXIgaW4gYQotc3RhbmRhcmQgR05VIGRpc3RyaWJ1dGlvbi4gIFdlIGNhbiBlaXRoZXIgYWRkIHRob3NlIGZpbGVzLCBvciBydW4KLUBzYW1we2F1dG9tYWtlfSB3aXRoIHRoZSBAc2FtcHstLWZvcmVpZ259IG9wdGlvbi4KLQotUnVubmluZyB0aGVzZSB0b29scyB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgZmlsZXMsIGFsbCBvZiB3aGljaCBhcmUKLWRlc2NyaWJlZCBpbiB0aGUgbmV4dCBjaGFwdGVyLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQGZpbGV7YWNsb2NhbC5tNH0KLUBpdGVtCi1AZmlsZXtjb25maWd1cmV9Ci1AaXRlbQotQGZpbGV7Y29uZmlnLmlufQotQGl0ZW0KLUBmaWxle01ha2VmaWxlLmlufQotQGl0ZW0KLUBmaWxle3N0YW1wLWguaW59Ci1AZW5kIGl0ZW1pemUKLQotQG5vZGUgRmlsZXMKLUBjaGFwdGVyIEZpbGVzCi0KLUFzIHdhcyBzZWVuIGluIHRoZSBwcmV2aW91cyBjaGFwdGVyLCB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi11c2VzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBmaWxlcy4gIFRoZSBkZXZlbG9wZXIgbXVzdCB3cml0ZSBhIGZldyBmaWxlcy4KLVRoZSBvdGhlcnMgYXJlIGdlbmVyYXRlZCBieSB2YXJpb3VzIHRvb2xzLgotCi1UaGUgc3lzdGVtIGlzIHJhdGhlciBmbGV4aWJsZSwgYW5kIGNhbiBiZSB1c2VkIGluIG1hbnkgZGlmZmVyZW50IHdheXMuCi1JbiBkZXNjcmliaW5nIHRoZSBmaWxlcyB0aGF0IGl0IHVzZXMsIEkgd2lsbCBkZXNjcmliZSB0aGUgY29tbW9uIGNhc2UsCi1hbmQgbWVudGlvbiBzb21lIG90aGVyIGNhc2VzIHRoYXQgbWF5IGFyaXNlLgotCi1AbWVudQotKiBEZXZlbG9wZXIgRmlsZXM6OgkJRGV2ZWxvcGVyIEZpbGVzLgotKiBCdWlsZCBGaWxlczo6CQkJQnVpbGQgRmlsZXMuCi0qIFN1cHBvcnQgRmlsZXM6OgkJU3VwcG9ydCBGaWxlcy4KLUBlbmQgbWVudQotCi1Abm9kZSBEZXZlbG9wZXIgRmlsZXMKLUBzZWN0aW9uIERldmVsb3BlciBGaWxlcwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBmaWxlcyB3cml0dGVuIG9yIGdlbmVyYXRlZCBieSB0aGUgZGV2ZWxvcGVyCi1vZiBhIHBhY2thZ2UuCi0KLUBtZW51Ci0qIERldmVsb3BlciBGaWxlcyBQaWN0dXJlOjoJRGV2ZWxvcGVyIEZpbGVzIFBpY3R1cmUuCi0qIFdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzOjoJV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXMuCi0qIEdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXM6OglHZW5lcmF0ZWQgRGV2ZWxvcGVyIEZpbGVzLgotQGVuZCBtZW51Ci0KLUBub2RlIERldmVsb3BlciBGaWxlcyBQaWN0dXJlCi1Ac3Vic2VjdGlvbiBEZXZlbG9wZXIgRmlsZXMgUGljdHVyZQotCi1IZXJlIGlzIGEgcGljdHVyZSBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIHdyaXR0ZW4gYnkgdGhlIGRldmVsb3BlciwgdGhlCi1nZW5lcmF0ZWQgZmlsZXMgd2hpY2ggd291bGQgYmUgaW5jbHVkZWQgd2l0aCBhIGNvbXBsZXRlIHNvdXJjZQotZGlzdHJpYnV0aW9uLCBhbmQgdGhlIHRvb2xzIHdoaWNoIGNyZWF0ZSB0aG9zZSBmaWxlcy4KLUBpZmluZm8KLVRoZSBmaWxlIG5hbWVzIGFyZSBwbGFpbiB0ZXh0IGFuZCB0aGUgdG9vbCBuYW1lcyBhcmUgZW5jbG9zZWQgYnkKLUBzYW1weyp9IGNoYXJhY3RlcnMKLUBlbmQgaWZpbmZvCi1AaWZub3RpbmZvCi1UaGUgZmlsZSBuYW1lcyBhcmUgaW4gcmVjdGFuZ2xlcyB3aXRoIHNxdWFyZSBjb3JuZXJzIGFuZCB0aGUgdG9vbCBuYW1lcwotYXJlIGluIHJlY3RhbmdsZXMgd2l0aCByb3VuZGVkIGNvcm5lcnMKLUBlbmQgaWZub3RpbmZvCi0oZS5nLiwgQHNhbXB7YXV0b2hlYWRlcn0gaXMgdGhlIG5hbWUgb2YgYSB0b29sLCBub3QgdGhlIG5hbWUgb2YgYSBmaWxlKS4KLQotQGltYWdle2NvbmZpZ2Rldn0KLQotQG5vZGUgV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXMKLUBzdWJzZWN0aW9uIFdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzCi0KLVRoZSBmb2xsb3dpbmcgZmlsZXMgd291bGQgYmUgd3JpdHRlbiBieSB0aGUgZGV2ZWxvcGVyLgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGNvbmZpZ3VyZS5pbgotQGNpbmRleCBAZmlsZXtjb25maWd1cmUuaW59Ci1UaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdC4gIFRoaXMgc2NyaXB0IGNvbnRhaW5zIGludm9jYXRpb25zIG9mCi1hdXRvY29uZiBtYWNyb3MuICBJdCBtYXkgYWxzbyBjb250YWluIG9yZGluYXJ5IHNoZWxsIHNjcmlwdCBjb2RlLiAgVGhpcwotZmlsZSB3aWxsIGNvbnRhaW4gZmVhdHVyZSB0ZXN0cyBmb3IgcG9ydGFiaWxpdHkgaXNzdWVzLiAgVGhlIGxhc3QgdGhpbmcKLWluIHRoZSBmaWxlIHdpbGwgbm9ybWFsbHkgYmUgYW4gQHNhbXB7QUNfT1VUUFVUfSBtYWNybyBsaXN0aW5nIHdoaWNoCi1maWxlcyB0byBjcmVhdGUgd2hlbiB0aGUgYnVpbGRlciBydW5zIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgVGhpcyBmaWxlCi1pcyBhbHdheXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgR05VIGNvbmZpZ3VyZSBzeXN0ZW0uICBAeHJlZntXcml0ZQotY29uZmlndXJlLmlufS4KLQotQGl0ZW0gTWFrZWZpbGUuYW0KLUBjaW5kZXggQGZpbGV7TWFrZWZpbGUuYW19Ci1UaGlzIGlzIHRoZSBhdXRvbWFrZSBpbnB1dCBmaWxlLiAgSXQgZGVzY3JpYmVzIGhvdyB0aGUgY29kZSBzaG91bGQgYmUKLWJ1aWx0LiAgSXQgY29uc2lzdHMgb2YgZGVmaW5pdGlvbnMgb2YgYXV0b21ha2UgdmFyaWFibGVzLiAgSXQgbWF5IGFsc28KLWNvbnRhaW4gb3JkaW5hcnkgTWFrZWZpbGUgdGFyZ2V0cy4gIFRoaXMgZmlsZSBpcyBvbmx5IG5lZWRlZCB3aGVuIHVzaW5nCi1hdXRvbWFrZSAobmV3ZXIgdG9vbHMgbm9ybWFsbHkgdXNlIGF1dG9tYWtlLCBidXQgdGhlcmUgYXJlIHN0aWxsIG9sZGVyCi10b29scyB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbnZlcnRlZCwgaW4gd2hpY2ggdGhlIGRldmVsb3BlciB3cml0ZXMKLUBmaWxle01ha2VmaWxlLmlufSBkaXJlY3RseSkuICBAeHJlZntXcml0ZSBNYWtlZmlsZS5hbX0uCi0KLUBpdGVtIGFjY29uZmlnLmgKLUBjaW5kZXggQGZpbGV7YWNjb25maWcuaH0KLVdoZW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY3JlYXRlcyBhIHBvcnRhYmlsaXR5IGhlYWRlciBmaWxlLCBieSB1c2luZwotQHNhbXB7QU1fQ09ORklHX0hFQURFUn0gKG9yLCBpZiBub3QgdXNpbmcgYXV0b21ha2UsCi1Ac2FtcHtBQ19DT05GSUdfSEVBREVSfSksIHRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlc2NyaWJlIG1hY3JvcyB3aGljaCBhcmUKLW5vdCByZWNvZ25pemVkIGJ5IHRoZSBAc2FtcHthdXRvaGVhZGVyfSBjb21tYW5kLiAgVGhpcyBpcyBub3JtYWxseSBhCi1mYWlybHkgdW5pbnRlcmVzdGluZyBmaWxlLCBjb25zaXN0aW5nIG9mIGEgY29sbGVjdGlvbiBvZiBAc2FtcHsjdW5kZWZ9Ci1saW5lcyB3aXRoIGNvbW1lbnRzLiAgTm9ybWFsbHkgYW55IGNhbGwgdG8gQHNhbXB7QUNfREVGSU5FfSBpbgotQGZpbGV7Y29uZmlndXJlLmlufSB3aWxsIHJlcXVpcmUgYSBsaW5lIGluIHRoaXMgZmlsZS4gQHhyZWZ7V3JpdGUKLWFjY29uZmlnLmh9LgotCi1AaXRlbSBhY2luY2x1ZGUubTQKLUBjaW5kZXggQGZpbGV7YWNpbmNsdWRlLm00fQotVGhpcyBmaWxlIGlzIG5vdCBhbHdheXMgcmVxdWlyZWQuICBJdCBkZWZpbmVzIGxvY2FsIGF1dG9jb25mIG1hY3Jvcy4KLVRoZXNlIG1hY3JvcyBtYXkgdGhlbiBiZSB1c2VkIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBJZiB5b3UgZG9uJ3QgbmVlZAotYW55IGxvY2FsIGF1dG9jb25mIG1hY3JvcywgdGhlbiB5b3UgZG9uJ3QgbmVlZCB0aGlzIGZpbGUgYXQgYWxsLiAgSW4KLWZhY3QsIGluIGdlbmVyYWwsIHlvdSBuZXZlciBuZWVkIGxvY2FsIGF1dG9jb25mIG1hY3Jvcywgc2luY2UgeW91IGNhbgotcHV0IGV2ZXJ5dGhpbmcgaW4gQGZpbGV7Y29uZmlndXJlLmlufSwgYnV0IHNvbWV0aW1lcyBhIGxvY2FsIG1hY3JvIGlzCi1jb252ZW5pZW50LgotCi1OZXdlciB0b29scyBtYXkgb21pdCBAZmlsZXthY2luY2x1ZGUubTR9LCBhbmQgaW5zdGVhZCB1c2UgYQotc3ViZGlyZWN0b3J5LCB0eXBpY2FsbHkgbmFtZWQgQGZpbGV7bTR9LCBhbmQgZGVmaW5lCi1Ac2FtcHtBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNH0gaW4gQGZpbGV7TWFrZWZpbGUuYW19IHRvIGZvcmNlCi1Ac2FtcHthY2xvY2FsfSB0byBsb29rIHRoZXJlIGZvciBtYWNybyBkZWZpbml0aW9ucy4gIFRoZSBtYWNybwotZGVmaW5pdGlvbnMgYXJlIHRoZW4gcGxhY2VkIGluIHNlcGFyYXRlIGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5LgotCi1UaGUgQGZpbGV7YWNpbmNsdWRlLm00fSBmaWxlIGlzIG9ubHkgdXNlZCB3aGVuIHVzaW5nIGF1dG9tYWtlOyBpbiBvbGRlcgotdG9vbHMsIHRoZSBkZXZlbG9wZXIgd3JpdGVzIEBmaWxle2FjbG9jYWwubTR9IGRpcmVjdGx5LCBpZiBpdCBpcyBuZWVkZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXMKLUBzdWJzZWN0aW9uIEdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXMKLQotVGhlIGZvbGxvd2luZyBmaWxlcyB3b3VsZCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGRldmVsb3Blci4KLQotV2hlbiB1c2luZyBhdXRvbWFrZSwgdGhlc2UgZmlsZXMgYXJlIG5vcm1hbGx5IG5vdCBnZW5lcmF0ZWQgbWFudWFsbHkKLWFmdGVyIHRoZSBmaXJzdCB0aW1lLiAgSW5zdGVhZCwgdGhlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gY29udGFpbnMKLXJ1bGVzIHRvIGF1dG9tYXRpY2FsbHkgcmVidWlsZCB0aGUgZmlsZXMgYXMgcmVxdWlyZWQuICBXaGVuCi1Ac2FtcHtBTV9NQUlOVEFJTkVSX01PREV9IGlzIHVzZWQgaW4gQGZpbGV7Y29uZmlndXJlLmlufSAodGhlIG5vcm1hbAotY2FzZSBpbiBDeWdudXMgY29kZSksIHRoZSBhdXRvbWF0aWMgcmVidWlsZGluZyBydWxlcyB3aWxsIG9ubHkgYmUKLWRlZmluZWQgaWYgeW91IGNvbmZpZ3VyZSB1c2luZyB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfQotb3B0aW9uLgotCi1XaGVuIHVzaW5nIGF1dG9tYXRpYyByZWJ1aWxkaW5nLCBpdCBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQgYWxsIHRoZQotdmFyaW91cyB0b29scyBoYXZlIGJlZW4gYnVpbHQgYW5kIGluc3RhbGxlZCBvbiB5b3VyIEBzYW1we1BBVEh9LiAgVXNpbmcKLWF1dG9tYXRpYyByZWJ1aWxkaW5nIGlzIGhpZ2hseSByZWNvbW1lbmRlZCwgc28gbXVjaCBzbyB0aGF0IEknbSBub3QKLWdvaW5nIHRvIGV4cGxhaW4gd2hhdCB5b3UgaGF2ZSB0byBkbyBpZiB5b3UgZG9uJ3QgdXNlIGl0LgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGNvbmZpZ3VyZQotQGNpbmRleCBAZmlsZXtjb25maWd1cmV9Ci1UaGlzIGlzIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoaWNoIHdpbGwgYmUgcnVuIHdoZW4gYnVpbGRpbmcgdGhlCi1wYWNrYWdlLiAgVGhpcyBpcyBnZW5lcmF0ZWQgYnkgQHNhbXB7YXV0b2NvbmZ9IGZyb20gQGZpbGV7Y29uZmlndXJlLmlufQotYW5kIEBmaWxle2FjbG9jYWwubTR9LiAgVGhpcyBpcyBhIHNoZWxsIHNjcmlwdC4KLQotQGl0ZW0gTWFrZWZpbGUuaW4KLUBjaW5kZXggQGZpbGV7TWFrZWZpbGUuaW59Ci1UaGlzIGlzIHRoZSBmaWxlIHdoaWNoIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgdHVybiBpbnRvIHRoZQotQGZpbGV7TWFrZWZpbGV9IGF0IGJ1aWxkIHRpbWUuICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5Ci1Ac2FtcHthdXRvbWFrZX0gZnJvbSBAZmlsZXtNYWtlZmlsZS5hbX0uICBJZiB5b3UgYXJlbid0IHVzaW5nIGF1dG9tYWtlLAoteW91IG11c3Qgd3JpdGUgdGhpcyBmaWxlIHlvdXJzZWxmLiAgVGhpcyBmaWxlIGlzIHByZXR0eSBtdWNoIGEgbm9ybWFsCi1AZmlsZXtNYWtlZmlsZX0sIHdpdGggc29tZSBjb25maWd1cmUgc3Vic3RpdHV0aW9ucyBmb3IgY2VydGFpbgotdmFyaWFibGVzLgotCi1AaXRlbSBhY2xvY2FsLm00Ci1AY2luZGV4IEBmaWxle2FjbG9jYWwubTR9Ci1UaGlzIGZpbGUgaXMgY3JlYXRlZCBieSB0aGUgQHNhbXB7YWNsb2NhbH0gcHJvZ3JhbSwgYmFzZWQgb24gdGhlCi1jb250ZW50cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IGFuZCBAZmlsZXthY2luY2x1ZGUubTR9IChvciwgYXMgbm90ZWQgaW4KLXRoZSBkZXNjcmlwdGlvbiBvZiBAZmlsZXthY2luY2x1ZGUubTR9IGFib3ZlLCBvbiB0aGUgY29udGVudHMgb2YgYW4KLUBmaWxle200fSBzdWJkaXJlY3RvcnkpLiAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIGF1dG9jb25mCi1tYWNyb3Mgd2hpY2ggQHNhbXB7YXV0b2NvbmZ9IHdpbGwgdXNlIHdoZW4gZ2VuZXJhdGluZyB0aGUgZmlsZQotQGZpbGV7Y29uZmlndXJlfS4gIFRoZXNlIGF1dG9jb25mIG1hY3JvcyBtYXkgYmUgZGVmaW5lZCBieSB5b3UgaW4KLUBmaWxle2FjaW5jbHVkZS5tNH0gb3IgdGhleSBtYXkgYmUgZGVmaW5lZCBieSBvdGhlciBwYWNrYWdlcyBzdWNoIGFzCi1hdXRvbWFrZSwgbGlidG9vbCBvciBnZXR0ZXh0LiAgSWYgeW91IGFyZW4ndCB1c2luZyBhdXRvbWFrZSwgeW91IHdpbGwKLW5vcm1hbGx5IHdyaXRlIHRoaXMgZmlsZSB5b3Vyc2VsZjsgaW4gdGhhdCBjYXNlLCBpZiBAZmlsZXtjb25maWd1cmUuaW59Ci11c2VzIG9ubHkgc3RhbmRhcmQgYXV0b2NvbmYgbWFjcm9zLCB0aGlzIGZpbGUgd2lsbCBub3QgYmUgbmVlZGVkIGF0IGFsbC4KLQotQGl0ZW0gY29uZmlnLmluCi1AY2luZGV4IEBmaWxle2NvbmZpZy5pbn0KLUBjaW5kZXggQGZpbGV7Y29uZmlnLmguaW59Ci1UaGlzIGZpbGUgaXMgY3JlYXRlZCBieSBAc2FtcHthdXRvaGVhZGVyfSBiYXNlZCBvbiBAZmlsZXthY2NvbmZpZy5ofSBhbmQKLUBmaWxle2NvbmZpZ3VyZS5pbn0uICBBdCBidWlsZCB0aW1lLCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGRlZmluZQotc29tZSBvZiB0aGUgbWFjcm9zIGluIGl0IHRvIGNyZWF0ZSBAZmlsZXtjb25maWcuaH0sIHdoaWNoIG1heSB0aGVuIGJlCi1pbmNsdWRlZCBieSB5b3VyIHByb2dyYW0uICBUaGlzIHBlcm1pdHMgeW91ciBDIGNvZGUgdG8gdXNlIHByZXByb2Nlc3NvcgotY29uZGl0aW9uYWxzIHRvIGNoYW5nZSBpdHMgYmVoYXZpb3VyIGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlCi1ob3N0IHN5c3RlbS4gIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBjYWxsZWQgQGZpbGV7Y29uZmlnLmguaW59LgotCi1AaXRlbSBzdGFtcC5oLWluCi1AY2luZGV4IEBmaWxle3N0YW1wLWguaW59Ci1UaGlzIHJhdGhlciB1bmludGVyZXN0aW5nIGZpbGUsIHdoaWNoIEkgb21pdHRlZCBmcm9tIHRoZSBwaWN0dXJlLCBpcwotZ2VuZXJhdGVkIGJ5IEBzYW1we2F1dG9tYWtlfS4gIEl0IGFsd2F5cyBjb250YWlucyB0aGUgc3RyaW5nCi1Ac2FtcHt0aW1lc3RhbXB9LiAgSXQgaXMgdXNlZCBhcyBhIHRpbWVzdGFtcCBmaWxlIGluZGljYXRpbmcgd2hldGhlcgotQGZpbGV7Y29uZmlnLmlufSBpcyB1cCB0byBkYXRlLiAgVXNpbmcgYSB0aW1lc3RhbXAgZmlsZSBtZWFucyB0aGF0Ci1AZmlsZXtjb25maWcuaW59IGNhbiBiZSBtYXJrZWQgYXMgdXAgdG8gZGF0ZSB3aXRob3V0IGFjdHVhbGx5IGNoYW5naW5nCi1pdHMgbW9kaWZpY2F0aW9uIHRpbWUuICBUaGlzIGlzIHVzZWZ1bCBzaW5jZSBAZmlsZXtjb25maWcuaW59IGRlcGVuZHMKLXVwb24gQGZpbGV7Y29uZmlndXJlLmlufSwgYnV0IGl0IGlzIGVhc3kgdG8gY2hhbmdlIEBmaWxle2NvbmZpZ3VyZS5pbn0KLWluIGEgd2F5IHdoaWNoIGRvZXMgbm90IGFmZmVjdCBAZmlsZXtjb25maWcuaW59LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCdWlsZCBGaWxlcwotQHNlY3Rpb24gQnVpbGQgRmlsZXMKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZmlsZXMgd2hpY2ggYXJlIGNyZWF0ZWQgYXQgY29uZmlndXJlIGFuZAotYnVpbGQgdGltZS4gIFRoZXNlIGFyZSB0aGUgZmlsZXMgd2hpY2ggc29tZWJvZHkgd2hvIGJ1aWxkcyB0aGUgcGFja2FnZQotd2lsbCBzZWUuCi0KLU9mIGNvdXJzZSwgdGhlIGRldmVsb3BlciB3aWxsIGFsc28gYnVpbGQgdGhlIHBhY2thZ2UuICBUaGUgZGlzdGluY3Rpb24KLWJldHdlZW4gZGV2ZWxvcGVyIGZpbGVzIGFuZCBidWlsZCBmaWxlcyBpcyBub3QgdGhhdCB0aGUgZGV2ZWxvcGVyIGRvZXMKLW5vdCBzZWUgdGhlIGJ1aWxkIGZpbGVzLCBidXQgdGhhdCBzb21lYm9keSB3aG8gb25seSBidWlsZHMgdGhlIHBhY2thZ2UKLWRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGRldmVsb3BlciBmaWxlcy4KLQotQG1lbnUKLSogQnVpbGQgRmlsZXMgUGljdHVyZTo6CQlCdWlsZCBGaWxlcyBQaWN0dXJlLgotKiBCdWlsZCBGaWxlcyBEZXNjcmlwdGlvbjo6CUJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uLgotQGVuZCBtZW51Ci0KLUBub2RlIEJ1aWxkIEZpbGVzIFBpY3R1cmUKLUBzdWJzZWN0aW9uIEJ1aWxkIEZpbGVzIFBpY3R1cmUKLQotSGVyZSBpcyBhIHBpY3R1cmUgb2YgdGhlIGZpbGVzIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBhdCBidWlsZCB0aW1lLgotQGZpbGV7Y29uZmlnLnN0YXR1c30gaXMgYm90aCBhIGNyZWF0ZWQgZmlsZSBhbmQgYSBzaGVsbCBzY3JpcHQgd2hpY2ggaXMKLXJ1biB0byBjcmVhdGUgb3RoZXIgZmlsZXMsIGFuZCB0aGUgcGljdHVyZSBhdHRlbXB0cyB0byBzaG93IHRoYXQuCi0KLUBpbWFnZXtjb25maWdidWlsZH0KLQotQG5vZGUgQnVpbGQgRmlsZXMgRGVzY3JpcHRpb24KLUBzdWJzZWN0aW9uIEJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uCi0KLVRoaXMgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIGNyZWF0ZWQgYXQgYnVpbGQgdGltZS4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBjb25maWcuc3RhdHVzCi1AY2luZGV4IEBmaWxle2NvbmZpZy5zdGF0dXN9Ci1UaGUgZmlyc3Qgc3RlcCBpbiBidWlsZGluZyBhIHBhY2thZ2UgaXMgdG8gcnVuIHRoZSBAZmlsZXtjb25maWd1cmV9Ci1zY3JpcHQuICBUaGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBjcmVhdGUgdGhlIGZpbGUKLUBmaWxle2NvbmZpZy5zdGF0dXN9LCB3aGljaCBpcyBpdHNlbGYgYSBzaGVsbCBzY3JpcHQuICBXaGVuIHlvdSBmaXJzdAotcnVuIEBmaWxle2NvbmZpZ3VyZX0sIGl0IHdpbGwgYXV0b21hdGljYWxseSBydW4gQGZpbGV7Y29uZmlnLnN0YXR1c30uCi1BbiBAZmlsZXtNYWtlZmlsZX0gZGVyaXZlZCBmcm9tIGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZS5pbn0KLXdpbGwgY29udGFpbiBydWxlcyB0byBhdXRvbWF0aWNhbGx5IHJ1biBAZmlsZXtjb25maWcuc3RhdHVzfSBhZ2FpbiB3aGVuCi1uZWNlc3NhcnkgdG8gcmVjcmVhdGUgY2VydGFpbiBmaWxlcyBpZiB0aGVpciBpbnB1dHMgY2hhbmdlLgotCi1AaXRlbSBNYWtlZmlsZQotQGNpbmRleCBAZmlsZXtNYWtlZmlsZX0KLVRoaXMgaXMgdGhlIGZpbGUgd2hpY2ggbWFrZSB3aWxsIHJlYWQgdG8gYnVpbGQgdGhlIHByb2dyYW0uICBUaGUKLUBmaWxle2NvbmZpZy5zdGF0dXN9IHNjcmlwdCB3aWxsIHRyYW5zZm9ybSBAZmlsZXtNYWtlZmlsZS5pbn0gaW50bwotQGZpbGV7TWFrZWZpbGV9LgotCi1AaXRlbSBjb25maWcuaAotQGNpbmRleCBAZmlsZXtjb25maWcuaH0KLVRoaXMgZmlsZSBkZWZpbmVzIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyB3aGljaCBDIGNvZGUgY2FuIHVzZSB0byBhZGp1c3QKLWl0cyBiZWhhdmlvdXIgb24gZGlmZmVyZW50IHN5c3RlbXMuICBUaGUgQGZpbGV7Y29uZmlnLnN0YXR1c30gc2NyaXB0Ci13aWxsIHRyYW5zZm9ybSBAZmlsZXtjb25maWcuaW59IGludG8gQGZpbGV7Y29uZmlnLmh9LgotCi1AaXRlbSBjb25maWcuY2FjaGUKLUBjaW5kZXggQGZpbGV7Y29uZmlnLmNhY2hlfQotVGhpcyBmaWxlIGRpZCBub3QgZml0IG5lYXRseSBpbnRvIHRoZSBwaWN0dXJlLCBhbmQgSSBvbWl0dGVkIGl0LiAgSXQgaXMKLXVzZWQgYnkgdGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHRvIGNhY2hlIHJlc3VsdHMgYmV0d2VlbiBydW5zLiAgVGhpcwotY2FuIGJlIGFuIGltcG9ydGFudCBzcGVlZHVwLiAgSWYgeW91IG1vZGlmeSBAZmlsZXtjb25maWd1cmUuaW59IGluIHN1Y2gKLWEgd2F5IHRoYXQgdGhlIHJlc3VsdHMgb2Ygb2xkIHRlc3RzIHNob3VsZCBjaGFuZ2UgKHBlcmhhcHMgeW91IGhhdmUKLWFkZGVkIGEgbmV3IGxpYnJhcnkgdG8gQHNhbXB7TERGTEFHU30pLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gcmVtb3ZlCi1AZmlsZXtjb25maWcuY2FjaGV9IHRvIGZvcmNlIHRoZSB0ZXN0cyB0byBiZSByZXJ1bi4KLQotVGhlIGF1dG9jb25mIG1hbnVhbCBleHBsYWlucyBob3cgdG8gc2V0IHVwIGEgc2l0ZSBzcGVjaWZpYyBjYWNoZSBmaWxlLgotVGhpcyBjYW4gc3BlZWQgdXAgcnVubmluZyBAZmlsZXtjb25maWd1cmV9IHNjcmlwdHMgb24geW91ciBzeXN0ZW0uCi0KLUBpdGVtIHN0YW1wLmgKLUBjaW5kZXggQGZpbGV7c3RhbXAtaH0KLVRoaXMgZmlsZSwgd2hpY2ggSSBvbWl0dGVkIGZyb20gdGhlIHBpY3R1cmUsIGlzIHNpbWlsYXIgdG8KLUBmaWxle3N0YW1wLWguaW59LiAgSXQgaXMgdXNlZCBhcyBhIHRpbWVzdGFtcCBmaWxlIGluZGljYXRpbmcgd2hldGhlcgotQGZpbGV7Y29uZmlnLmh9IGlzIHVwIHRvIGRhdGUuICBUaGlzIGlzIHVzZWZ1bCBzaW5jZSBAZmlsZXtjb25maWcuaH0KLWRlcGVuZHMgdXBvbiBAZmlsZXtjb25maWcuc3RhdHVzfSwgYnV0IGl0IGlzIGVhc3kgZm9yCi1AZmlsZXtjb25maWcuc3RhdHVzfSB0byBjaGFuZ2UgaW4gYSB3YXkgd2hpY2ggZG9lcyBub3QgYWZmZWN0Ci1AZmlsZXtjb25maWcuaH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIFN1cHBvcnQgRmlsZXMKLUBzZWN0aW9uIFN1cHBvcnQgRmlsZXMKLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSByZXF1aXJlcyBzZXZlcmFsIHN1cHBvcnQgZmlsZXMgdG8gYmUKLWluY2x1ZGVkIHdpdGggeW91ciBkaXN0cmlidXRpb24uICBZb3UgZG8gbm90IG5vcm1hbGx5IG5lZWQgdG8gY29uY2VybgoteW91cnNlbGYgd2l0aCB0aGVzZS4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCBtb3N0IGFyZSBhbHJlYWR5Ci1wcmVzZW50LiAgT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgaW5zdGFsbGVkIHdpdGggeW91ciBzb3VyY2UgYnkKLUBzYW1we2F1dG9tYWtlfSAod2l0aCB0aGUgQHNhbXB7LS1hZGQtbWlzc2luZ30gb3B0aW9uKSBhbmQKLUBzYW1we2xpYnRvb2xpemV9LgotCi1Zb3UgZG9uJ3QgaGF2ZSB0byBwdXQgdGhlIHN1cHBvcnQgZmlsZXMgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkuICBZb3UKLWNhbiBwdXQgdGhlbSBpbiBhIHN1YmRpcmVjdG9yeSwgYW5kIHVzZSB0aGUgQHNhbXB7QUNfQ09ORklHX0FVWF9ESVJ9Ci1tYWNybyBpbiBAZmlsZXtjb25maWd1cmUuaW59IHRvIHRlbGwgQHNhbXB7YXV0b21ha2V9IGFuZCB0aGUKLUBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHdoZXJlIHRoZXkgYXJlLgotCi1JbiB0aGlzIHNlY3Rpb24sIEkgZGVzY3JpYmUgdGhlIHN1cHBvcnQgZmlsZXMsIHNvIHRoYXQgeW91IGNhbiBrbm93IHdoYXQKLXRoZXkgYXJlIGFuZCB3aHkgdGhleSBhcmUgdGhlcmUuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gQUJPVVQtTkxTCi1BZGRlZCBieSBhdXRvbWFrZSBpZiB5b3UgYXJlIHVzaW5nIGdldHRleHQuICBUaGlzIGlzIGEgZG9jdW1lbnRhdGlvbgotZmlsZSBhYm91dCB0aGUgZ2V0dGV4dCBwcm9qZWN0LgotQGl0ZW0gYW5zaTJrbnIuYwotVXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IGlmIHlvdSBwdXQgQHNhbXB7YW5zaTJrbnJ9Ci1pbiBAc2FtcHtBVVRPTUFLRV9PUFRJT05TfSBpbiBAZmlsZXtNYWtlZmlsZS5hbX0uICBUaGlzIHBlcm1pdHMKLWNvbXBpbGluZyBBTlNJIEMgY29kZSB3aXRoIGEgSyZSIEMgY29tcGlsZXIuCi1AaXRlbSBhbnNpMmtuci4xCi1UaGUgbWFuIHBhZ2Ugd2hpY2ggZ29lcyB3aXRoIEBmaWxle2Fuc2kya25yLmN9LgotQGl0ZW0gY29uZmlnLmd1ZXNzCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBkZXRlcm1pbmVzIHRoZSBjb25maWd1cmF0aW9uIG5hbWUgZm9yIHRoZSBzeXN0ZW0gb24KLXdoaWNoIGl0IGlzIHJ1bi4KLUBpdGVtIGNvbmZpZy5zdWIKLUEgc2hlbGwgc2NyaXB0IHdoaWNoIGNhbm9uaWNhbGl6ZXMgYSBjb25maWd1cmF0aW9uIG5hbWUgZW50ZXJlZCBieSBhCi11c2VyLgotQGl0ZW0gZWxpc3AtY29tcAotVXNlZCB0byBjb21waWxlIEVtYWNzIExJU1AgZmlsZXMuCi1AaXRlbSBpbnN0YWxsLXNoCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBpbnN0YWxscyBhIHByb2dyYW0uICBUaGlzIGlzIHVzZWQgaWYgdGhlIGNvbmZpZ3VyZQotc2NyaXB0IGNhbiBub3QgZmluZCBhbiBpbnN0YWxsIGJpbmFyeS4KLUBpdGVtIGx0Y29uZmlnCi1Vc2VkIGJ5IGxpYnRvb2wuICBUaGlzIGlzIGEgc2hlbGwgc2NyaXB0IHdoaWNoIGNvbmZpZ3VyZXMgbGlidG9vbCBmb3IKLXRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBvbiB3aGljaCBpdCBpcyB1c2VkLgotQGl0ZW0gbHRtYWluLnNoCi1Vc2VkIGJ5IGxpYnRvb2wuICBUaGlzIGlzIHRoZSBhY3R1YWwgbGlidG9vbCBzY3JpcHQgd2hpY2ggaXMgdXNlZCwgYWZ0ZXIKLWl0IGlzIGNvbmZpZ3VyZWQgYnkgQGZpbGV7bHRjb25maWd9IHRvIGJ1aWxkIGEgbGlicmFyeS4KLUBpdGVtIG1kYXRlLXNoCi1BIHNoZWxsIHNjcmlwdCB1c2VkIGJ5IGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gdG8gcHJldHR5Ci1wcmludCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBmaWxlLiAgVGhpcyBpcyB1c2VkIHRvIG1haW50YWluIHZlcnNpb24KLW51bWJlcnMgZm9yIHRleGluZm8gZmlsZXMuCi1AaXRlbSBtaXNzaW5nCi1BIHNoZWxsIHNjcmlwdCB1c2VkIGlmIHNvbWUgdG9vbCBpcyBtaXNzaW5nIGVudGlyZWx5LiAgVGhpcyBpcyB1c2VkIGJ5Ci1hbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IHRvIGF2b2lkIGNlcnRhaW4gc29ydHMgb2YKLXRpbWVzdGFtcCBwcm9ibGVtcy4KLUBpdGVtIG1raW5zdGFsbGRpcnMKLUEgc2hlbGwgc2NyaXB0IHdoaWNoIGNyZWF0ZXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBhbGwgcGFyZW50Ci1kaXJlY3Rvcmllcy4gIFRoaXMgaXMgdXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9Ci1kdXJpbmcgaW5zdGFsbGF0aW9uLgotQGl0ZW0gdGV4aW5mby50ZXgKLVJlcXVpcmVkIGlmIHlvdSBoYXZlIGFueSB0ZXhpbmZvIGZpbGVzLiAgVGhpcyBpcyB1c2VkIHdoZW4gY29udmVydGluZwotVGV4aW5mbyBmaWxlcyBpbnRvIERWSSB1c2luZyBAc2FtcHt0ZXhpMmR2aX0gYW5kIEBUZVh7fS4KLUBpdGVtIHlsd3JhcAotQSBzaGVsbCBzY3JpcHQgdXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IHRvIHJ1bgotcHJvZ3JhbXMgbGlrZSBAc2FtcHtiaXNvbn0sIEBzYW1we3lhY2N9LCBAc2FtcHtmbGV4fSwgYW5kIEBzYW1we2xleH0uCi1UaGVzZSBwcm9ncmFtcyBkZWZhdWx0IHRvIHByb2R1Y2luZyBvdXRwdXQgZmlsZXMgd2l0aCBhIGZpeGVkIG5hbWUsIGFuZAotdGhlIEBmaWxle3lsd3JhcH0gc2NyaXB0IHJ1bnMgdGhlbSBpbiBhIHN1YmRpcmVjdG9yeSB0byBhdm9pZCBmaWxlIG5hbWUKLWNvbmZsaWN0cyB3aGVuIHVzaW5nIGEgcGFyYWxsZWwgbWFrZSBwcm9ncmFtLgotQGVuZCB0YWJsZQotCi1Abm9kZSBDb25maWd1cmF0aW9uIE5hbWVzCi1AY2hhcHRlciBDb25maWd1cmF0aW9uIE5hbWVzCi1AY2luZGV4IGNvbmZpZ3VyYXRpb24gbmFtZXMKLUBjaW5kZXggY29uZmlndXJhdGlvbiB0cmlwbGV0cwotQGNpbmRleCB0cmlwbGV0cwotQGNpbmRleCBob3N0IG5hbWVzCi1AY2luZGV4IGhvc3QgdHJpcGxldHMKLUBjaW5kZXggY2Fub25pY2FsIHN5c3RlbSBuYW1lcwotQGNpbmRleCBzeXN0ZW0gbmFtZXMKLUBjaW5kZXggc3lzdGVtIHR5cGVzCi0KLVRoZSBHTlUgY29uZmlndXJlIHN5c3RlbSBuYW1lcyBhbGwgc3lzdGVtcyB1c2luZyBhIEBkZm57Y29uZmlndXJhdGlvbgotbmFtZX0uICBBbGwgc3VjaCBuYW1lcyB1c2VkIHRvIGJlIHRyaXBsZXRzICh0aGV5IG1heSBub3cgY29udGFpbiBmb3VyCi1wYXJ0cyBpbiBjZXJ0YWluIGNhc2VzKSwgYW5kIHRoZSB0ZXJtIEBkZm57Y29uZmlndXJhdGlvbiB0cmlwbGV0fSBpcwotc3RpbGwgc2Vlbi4KLQotQG1lbnUKLSogQ29uZmlndXJhdGlvbiBOYW1lIERlZmluaXRpb246OglDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbi4KLSogVXNpbmcgQ29uZmlndXJhdGlvbiBOYW1lczo6CQlVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzLgotQGVuZCBtZW51Ci0KLUBub2RlIENvbmZpZ3VyYXRpb24gTmFtZSBEZWZpbml0aW9uCi1Ac2VjdGlvbiBDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbgotCi1UaGlzIGlzIGEgc3RyaW5nIG9mIHRoZSBmb3JtCi1AdmFye2NwdX0tQHZhcnttYW51ZmFjdHVyZXJ9LUB2YXJ7b3BlcmF0aW5nX3N5c3RlbX0uICBJbiBzb21lIGNhc2VzLAotdGhpcyBpcyBleHRlbmRlZCB0byBhIGZvdXIgcGFydCBmb3JtOgotQHZhcntjcHV9LUB2YXJ7bWFudWZhY3R1cmVyfS1AdmFye2tlcm5lbH0tQHZhcntvcGVyYXRpbmdfc3lzdGVtfS4KLQotV2hlbiB1c2luZyBhIGNvbmZpZ3VyYXRpb24gbmFtZSBpbiBhIGNvbmZpZ3VyZSBvcHRpb24sIGl0IGlzIG5vcm1hbGx5Ci1ub3QgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgYW4gZW50aXJlIG5hbWUuICBJbiBwYXJ0aWN1bGFyLCB0aGUKLUB2YXJ7bWFudWZhY3R1cmVyfSBmaWVsZCBpcyBvZnRlbiBvbWl0dGVkLCBsZWFkaW5nIHRvIHN0cmluZ3Mgc3VjaCBhcwotQHNhbXB7aTM4Ni1saW51eH0gb3IgQHNhbXB7c3BhcmMtc3Vub3N9LiAgVGhlIHNoZWxsIHNjcmlwdAotQGZpbGV7Y29uZmlnLnN1Yn0gd2lsbCB0cmFuc2xhdGUgdGhlc2Ugc2hvcnRlbmVkIHN0cmluZ3MgaW50byB0aGUKLWNhbm9uaWNhbCBmb3JtLiAgYXV0b2NvbmYgd2lsbCBhcnJhbmdlIGZvciBAZmlsZXtjb25maWcuc3VifSB0byBiZSBydW4KLWF1dG9tYXRpY2FsbHkgd2hlbiBpdCBpcyBuZWVkZWQuCi0KLVRoZSBmaWVsZHMgb2YgYSBjb25maWd1cmF0aW9uIG5hbWUgYXJlIGFzIGZvbGxvd3M6Ci0KLUB0YWJsZSBAdmFyCi1AaXRlbSBjcHUKLVRoZSB0eXBlIG9mIHByb2Nlc3Nvci4gIFRoaXMgaXMgdHlwaWNhbGx5IHNvbWV0aGluZyBsaWtlIEBzYW1we2kzODZ9IG9yCi1Ac2FtcHtzcGFyY30uICBNb3JlIHNwZWNpZmljIHZhcmlhbnRzIGFyZSB1c2VkIGFzIHdlbGwsIHN1Y2ggYXMKLUBzYW1we21pcHNlbH0gdG8gaW5kaWNhdGUgYSBsaXR0bGUgZW5kaWFuIE1JUFMgcHJvY2Vzc29yLgotQGl0ZW0gbWFudWZhY3R1cmVyCi1BIHNvbWV3aGF0IGZyZWVmb3JtIGZpZWxkIHdoaWNoIGluZGljYXRlcyB0aGUgbWFudWZhY3R1cmVyIG9mIHRoZQotc3lzdGVtLiAgVGhpcyBpcyBvZnRlbiBzaW1wbHkgQHNhbXB7dW5rbm93bn0uICBPdGhlciBjb21tb24gc3RyaW5ncyBhcmUKLUBzYW1we3BjfSBmb3IgYW4gSUJNIFBDIGNvbXBhdGlibGUgc3lzdGVtLCBvciB0aGUgbmFtZSBvZiBhIHdvcmtzdGF0aW9uCi12ZW5kb3IsIHN1Y2ggYXMgQHNhbXB7c3VufS4KLUBpdGVtIG9wZXJhdGluZ19zeXN0ZW0KLVRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdoaWNoIGlzIHJ1biBvbiB0aGUgc3lzdGVtLiAgVGhpcyB3aWxsCi1iZSBzb21ldGhpbmcgbGlrZSBAc2FtcHtzb2xhcmlzMi41fSBvciBAc2FtcHtpcml4Ni4zfS4gIFRoZXJlIGlzIG5vCi1wYXJ0aWN1bGFyIHJlc3RyaWN0aW9uIG9uIHRoZSB2ZXJzaW9uIG51bWJlciwgYW5kIHN0cmluZ3MgbGlrZQotQHNhbXB7YWl4NC4xLjQuMH0gYXJlIHNlZW4uICBGb3IgYW4gZW1iZWRkZWQgc3lzdGVtLCB3aGljaCBoYXMgbm8KLW9wZXJhdGluZyBzeXN0ZW0sIHRoaXMgZmllbGQgbm9ybWFsbHkgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIG9iamVjdCBmaWxlCi1mb3JtYXQsIHN1Y2ggYXMgQHNhbXB7ZWxmfSBvciBAc2FtcHtjb2ZmfS4KLUBpdGVtIGtlcm5lbAotVGhpcyBpcyB1c2VkIG1haW5seSBmb3IgR05VL0xpbnV4LiAgQSB0eXBpY2FsIEdOVS9MaW51eCBjb25maWd1cmF0aW9uCi1uYW1lIGlzIEBzYW1we2k1ODYtcGMtbGludXgtZ251bGliYzF9LiAgSW4gdGhpcyBjYXNlIHRoZSBrZXJuZWwsCi1Ac2FtcHtsaW51eH0sIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLCBAc2FtcHtnbnVsaWJjMX0uCi1AZW5kIHRhYmxlCi0KLVRoZSBzaGVsbCBzY3JpcHQgQGZpbGV7Y29uZmlnLmd1ZXNzfSB3aWxsIG5vcm1hbGx5IHByaW50IHRoZSBjb3JyZWN0Ci1jb25maWd1cmF0aW9uIG5hbWUgZm9yIHRoZSBzeXN0ZW0gb24gd2hpY2ggaXQgaXMgcnVuLiAgSXQgZG9lcyBieQotcnVubmluZyBAc2FtcHt1bmFtZX0gYW5kIGJ5IGV4YW1pbmluZyBvdGhlciBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlCi1zeXN0ZW0uCi0KLUJlY2F1c2UgQGZpbGV7Y29uZmlnLmd1ZXNzfSBjYW4gbm9ybWFsbHkgZGV0ZXJtaW5lIHRoZSBjb25maWd1cmF0aW9uCi1uYW1lIGZvciBhIG1hY2hpbmUsIGl0IGlzIG5vcm1hbGx5IG9ubHkgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgYQotY29uZmlndXJhdGlvbiBuYW1lIHdoZW4gYnVpbGRpbmcgYSBjcm9zcy1jb21waWxlciBvciB3aGVuIGJ1aWxkaW5nIHVzaW5nCi1hIGNyb3NzLWNvbXBpbGVyLgotCi1Abm9kZSBVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzCi1Ac2VjdGlvbiBVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzCi0KLUEgY29uZmlndXJlIHNjcmlwdCB3aWxsIHNvbWV0aW1lcyBoYXZlIHRvIG1ha2UgYSBkZWNpc2lvbiBiYXNlZCBvbiBhCi1jb25maWd1cmF0aW9uIG5hbWUuICBZb3Ugd2lsbCBuZWVkIHRvIGRvIHRoaXMgaWYgeW91IGhhdmUgdG8gY29tcGlsZQotY29kZSBkaWZmZXJlbnRseSBiYXNlZCBvbiBzb21ldGhpbmcgd2hpY2ggY2FuIG5vdCBiZSB0ZXN0ZWQgdXNpbmcgYQotc3RhbmRhcmQgYXV0b2NvbmYgZmVhdHVyZSB0ZXN0LgotCi1JdCBpcyBub3JtYWxseSBiZXR0ZXIgdG8gdGVzdCBmb3IgcGFydGljdWxhciBmZWF0dXJlcywgcmF0aGVyIHRoYW4gdG8KLXRlc3QgZm9yIGEgcGFydGljdWxhciBzeXN0ZW0uICBUaGlzIGlzIGJlY2F1c2UgYXMgVW5peCBldm9sdmVzLAotZGlmZmVyZW50IHN5c3RlbXMgY29weSBmZWF0dXJlcyBmcm9tIG9uZSBhbm90aGVyLiAgRXZlbiBpZiB5b3UgbmVlZCB0bwotZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJhc2VkIG9uIGEgY29uZmlndXJhdGlvbgotbmFtZSwgeW91IHNob3VsZCBkZWZpbmUgYSBtYWNybyB3aGljaCBkZXNjcmliZXMgdGhlIGZlYXR1cmUsIHJhdGhlciB0aGFuCi1kZWZpbmluZyBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgcGFydGljdWxhciBzeXN0ZW0geW91IGFyZSBvbi4KLQotVGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbSBpcyBub3JtYWxseSBkb25lIHVzaW5nIGEgY2FzZSBzdGF0ZW1lbnQKLWluIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBUaGUgY2FzZSBzdGF0ZW1lbnQgbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZQotdGhlIGZvbGxvd2luZywgYXNzdW1pbmcgdGhhdCBAc2FtcHtob3N0fSBpcyBhIHNoZWxsIHZhcmlhYmxlIGhvbGRpbmcgYQotY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZSAod2hpY2ggd2lsbCBiZSB0aGUgY2FzZSBpZgotQGZpbGV7Y29uZmlndXJlLmlufSB1c2VzIHRoZSBAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0gb3IKLUBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19IG1hY3JvKS4KLQotQHNtYWxsZXhhbXBsZQotY2FzZSAiJEB7aG9zdEB9IiBpbgotaVszNDU2XTg2LSotbGludXgtZ251KikgZG8gc29tZXRoaW5nIDs7Ci1zcGFyYyotc3VuLXNvbGFyaXMyLls1Njc4OV0qKSBkbyBzb21ldGhpbmcgOzsKLXNwYXJjKi1zdW4tc29sYXJpcyopIGRvIHNvbWV0aGluZyA7OwotbWlwcyotKi1lbGYqKSBkbyBzb21ldGhpbmcgOzsKLWVzYWMKLUBlbmQgc21hbGxleGFtcGxlCi0KLUl0IGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgdG8gdXNlIEBzYW1weyp9IGFmdGVyIHRoZSBvcGVyYXRpbmcgc3lzdGVtCi1maWVsZCwgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIHZlcnNpb24gbnVtYmVyIHdoaWNoIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5Ci1AZmlsZXtjb25maWcuZ3Vlc3N9LgotCi1JbiBtb3N0IGNhc2VzIHlvdSBtdXN0IGJlIGNhcmVmdWwgdG8gbWF0Y2ggYSByYW5nZSBvZiBwcm9jZXNzb3IgdHlwZXMuCi1Gb3IgbW9zdCBwcm9jZXNzb3IgZmFtaWxpZXMsIGEgdHJhaWxpbmcgQHNhbXB7Kn0gc3VmZmljZXMsIGFzIGluCi1Ac2FtcHttaXBzKn0gYWJvdmUuICBGb3IgdGhlIGkzODYgZmFtaWx5LCBzb21ldGhpbmcgYWxvbmcgdGhlIGxpbmVzIG9mCi1Ac2FtcHtpWzM0NTZdODZ9IHN1ZmZpY2VzIGF0IHByZXNlbnQuICBGb3IgdGhlIG02OGsgZmFtaWx5LCB5b3Ugd2lsbAotbmVlZCBzb21ldGhpbmcgbGlrZSBAc2FtcHttNjgqfS4gIE9mIGNvdXJzZSwgaWYgeW91IGRvIG5vdCBuZWVkIHRvIG1hdGNoCi1vbiB0aGUgcHJvY2Vzc29yLCBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgcmVwbGFjZSB0aGUgZW50aXJlIGZpZWxkIGJ5IGEKLUBzYW1weyp9LCBhcyBpbiBAc2FtcHsqLSotaXJpeCp9LgotCi1Abm9kZSBDcm9zcyBDb21waWxhdGlvbiBUb29scwotQGNoYXB0ZXIgQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHMKLUBjaW5kZXggY3Jvc3MgdG9vbHMKLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSBjYW4gYmUgdXNlZCB0byBidWlsZCBAZGZue2Nyb3NzCi1jb21waWxhdGlvbn0gdG9vbHMuICBBIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wgaXMgYSB0b29sIHdoaWNoIHJ1bnMgb24KLW9uZSBzeXN0ZW0gYW5kIHByb2R1Y2VzIGNvZGUgd2hpY2ggcnVucyBvbiBhbm90aGVyIHN5c3RlbS4KLQotQG1lbnUKLSogQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHM6OgkJQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHMuCi0qIEhvc3QgYW5kIFRhcmdldDo6CQkJSG9zdCBhbmQgVGFyZ2V0LgotKiBVc2luZyB0aGUgSG9zdCBUeXBlOjoJCQlVc2luZyB0aGUgSG9zdCBUeXBlLgotKiBTcGVjaWZ5aW5nIHRoZSBUYXJnZXQ6OiAgICAgICAJU3BlY2lmeWluZyB0aGUgVGFyZ2V0LgotKiBVc2luZyB0aGUgVGFyZ2V0IFR5cGU6OgkJVXNpbmcgdGhlIFRhcmdldCBUeXBlLgotKiBDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWU6OglDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWUKLUBlbmQgbWVudQotCi1Abm9kZSBDcm9zcyBDb21waWxhdGlvbiBDb25jZXB0cwotQHNlY3Rpb24gQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHMKLQotQGNpbmRleCBjcm9zcyBjb21waWxlcgotQSBjb21waWxlciB3aGljaCBwcm9kdWNlcyBwcm9ncmFtcyB3aGljaCBydW4gb24gYSBkaWZmZXJlbnQgc3lzdGVtIGlzIGEKLWNyb3NzIGNvbXBpbGF0aW9uIGNvbXBpbGVyLCBvciBzaW1wbHkgYSBAZGZue2Nyb3NzIGNvbXBpbGVyfS4KLVNpbWlsYXJseSwgd2Ugc3BlYWsgb2YgY3Jvc3MgYXNzZW1ibGVycywgY3Jvc3MgbGlua2VycywgZXRjLgotCi1JbiB0aGUgbm9ybWFsIGNhc2UsIGEgY29tcGlsZXIgcHJvZHVjZXMgY29kZSB3aGljaCBydW5zIG9uIHRoZSBzYW1lCi1zeXN0ZW0gYXMgdGhlIG9uZSBvbiB3aGljaCB0aGUgY29tcGlsZXIgcnVucy4gIFdoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvCi1kaXN0aW5ndWlzaCB0aGlzIGNhc2UgZnJvbSB0aGUgY3Jvc3MgY29tcGlsYXRpb24gY2FzZSwgc3VjaCBhIGNvbXBpbGVyCi1pcyBjYWxsZWQgYSBAZGZue25hdGl2ZSBjb21waWxlcn0uICBTaW1pbGFybHksIHdlIHNwZWFrIG9mIG5hdGl2ZQotYXNzZW1ibGVycywgZXRjLgotCi1BbHRob3VnaCB0aGUgZGVidWdnZXIgaXMgbm90IHN0cmljdGx5IHNwZWFraW5nIGEgY29tcGlsYXRpb24gdG9vbCwgaXQgaXMKLW5ldmVydGhlbGVzcyBtZWFuaW5nZnVsIHRvIHNwZWFrIG9mIGEgY3Jvc3MgZGVidWdnZXI6IGEgZGVidWdnZXIgd2hpY2gKLWlzIHVzZWQgdG8gZGVidWcgY29kZSB3aGljaCBydW5zIG9uIGFub3RoZXIgc3lzdGVtLiAgRXZlcnl0aGluZyB0aGF0IGlzCi1zYWlkIGJlbG93IGFib3V0IGNvbmZpZ3VyaW5nIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2xzIGFwcGxpZXMgdG8gdGhlCi1kZWJ1Z2dlciBhcyB3ZWxsLgotCi1Abm9kZSBIb3N0IGFuZCBUYXJnZXQKLUBzZWN0aW9uIEhvc3QgYW5kIFRhcmdldAotQGNpbmRleCBob3N0IHN5c3RlbQotQGNpbmRleCB0YXJnZXQgc3lzdGVtCi0KLVdoZW4gYnVpbGRpbmcgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHN5c3RlbXMKLWludm9sdmVkOiB0aGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1biwgYW5kIHRoZSBzeXN0ZW0gZm9yCi13aGljaCB0aGUgdG9vbHMgZ2VuZXJhdGUgY29kZS4KLQotVGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgd2lsbCBydW4gaXMgY2FsbGVkIHRoZSBAZGZue2hvc3R9IHN5c3RlbS4KLQotVGhlIHN5c3RlbSBmb3Igd2hpY2ggdGhlIHRvb2xzIGdlbmVyYXRlIGNvZGUgaXMgY2FsbGVkIHRoZSBAZGZue3RhcmdldH0KLXN5c3RlbS4KLQotRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgYSBjb21waWxlciB3aGljaCBydW5zIG9uIGEgR05VL0xpbnV4Ci1zeXN0ZW0gYW5kIGdlbmVyYXRlcyBFTEYgcHJvZ3JhbXMgZm9yIGEgTUlQUyBlbWJlZGRlZCBzeXN0ZW0uICBJbiB0aGlzCi1jYXNlIHRoZSBHTlUvTGludXggc3lzdGVtIGlzIHRoZSBob3N0LCBhbmQgdGhlIE1JUFMgRUxGIHN5c3RlbSBpcyB0aGUKLXRhcmdldC4gIFN1Y2ggYSBjb21waWxlciBjb3VsZCBiZSBjYWxsZWQgYSBHTlUvTGludXggY3Jvc3MgTUlQUyBFTEYKLWNvbXBpbGVyLCBvciwgZXF1aXZhbGVudGx5LCBhIEBzYW1we2kzODYtbGludXgtZ251fSBjcm9zcwotQHNhbXB7bWlwcy1lbGZ9IGNvbXBpbGVyLgotCi1OYXR1cmFsbHksIG1vc3QgcHJvZ3JhbXMgYXJlIG5vdCBjcm9zcyBjb21waWxhdGlvbiB0b29scy4gIEZvciB0aG9zZQotcHJvZ3JhbXMsIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gc3BlYWsgb2YgYSB0YXJnZXQuICBJdCBvbmx5IG1ha2VzCi1zZW5zZSB0byBzcGVhayBvZiBhIHRhcmdldCBmb3IgdG9vbHMgbGlrZSBAc2FtcHtnY2N9IG9yIHRoZQotQHNhbXB7YmludXRpbHN9IHdoaWNoIGFjdHVhbGx5IHByb2R1Y2UgcnVubmluZyBjb2RlLiAgRm9yIGV4YW1wbGUsIGl0Ci1kb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHNwZWFrIG9mIHRoZSB0YXJnZXQgb2YgYSB0b29sIGxpa2UgQHNhbXB7Ymlzb259Ci1vciBAc2FtcHttYWtlfS4KLQotTW9zdCBjcm9zcyBjb21waWxhdGlvbiB0b29scyBjYW4gYWxzbyBzZXJ2ZSBhcyBuYXRpdmUgdG9vbHMuICBGb3IgYQotbmF0aXZlIGNvbXBpbGF0aW9uIHRvb2wsIGl0IGlzIHN0aWxsIG1lYW5pbmdmdWwgdG8gc3BlYWsgb2YgYSB0YXJnZXQuCi1Gb3IgYSBuYXRpdmUgdG9vbCwgdGhlIHRhcmdldCBpcyB0aGUgc2FtZSBhcyB0aGUgaG9zdC4gIEZvciBleGFtcGxlLCBmb3IKLWEgR05VL0xpbnV4IG5hdGl2ZSBjb21waWxlciwgdGhlIGhvc3QgaXMgR05VL0xpbnV4LCBhbmQgdGhlIHRhcmdldCBpcwotYWxzbyBHTlUvTGludXguCi0KLUBub2RlIFVzaW5nIHRoZSBIb3N0IFR5cGUKLUBzZWN0aW9uIFVzaW5nIHRoZSBIb3N0IFR5cGUKLQotSW4gYWxtb3N0IGFsbCBjYXNlcyB0aGUgaG9zdCBzeXN0ZW0gaXMgdGhlIHN5c3RlbSBvbiB3aGljaCB5b3UgcnVuIHRoZQotQHNhbXB7Y29uZmlndXJlfSBzY3JpcHQsIGFuZCBvbiB3aGljaCB5b3UgYnVpbGQgdGhlIHRvb2xzIChmb3IgdGhlIGNhc2UKLXdoZW4gdGhleSBkaWZmZXIsIEBweHJlZntDYW5hZGlhbiBDcm9zc30pLgotCi1AY2luZGV4IEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfQotSWYgeW91ciBjb25maWd1cmUgc2NyaXB0IG5lZWRzIHRvIGtub3cgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUKLWhvc3Qgc3lzdGVtLCBhbmQgdGhlIHBhY2thZ2UgaXMgbm90IGEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbCBhbmQKLXRoZXJlZm9yZSBkb2VzIG5vdCBoYXZlIGEgdGFyZ2V0LCBwdXQgQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9IGluCi1AZmlsZXtjb25maWd1cmUuaW59LiAgVGhpcyBtYWNybyB3aWxsIGFycmFuZ2UgdG8gZGVmaW5lIGEgZmV3IHNoZWxsCi12YXJpYWJsZXMgd2hlbiB0aGUgQHNhbXB7Y29uZmlndXJlfSBzY3JpcHQgaXMgcnVuLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGhvc3QKLVRoZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBob3N0LiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlCi1kZXRlcm1pbmVkIGJ5IHJ1bm5pbmcgdGhlIEBmaWxle2NvbmZpZy5ndWVzc30gc2hlbGwgc2NyaXB0LCBhbHRob3VnaCB0aGUKLXVzZXIgaXMgcGVybWl0dGVkIHRvIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgYW4gZXhwbGljaXQgQHNhbXB7LS1ob3N0fQotb3B0aW9uLgotQGl0ZW0gaG9zdF9hbGlhcwotSW4gdGhlIHVudXN1YWwgY2FzZSB0aGF0IHRoZSB1c2VyIHVzZWQgYW4gZXhwbGljaXQgQHNhbXB7LS1ob3N0fSBvcHRpb24sCi10aGlzIHdpbGwgYmUgdGhlIGFyZ3VtZW50IHRvIEBzYW1wey0taG9zdH0uICBJbiB0aGUgbm9ybWFsIGNhc2UsIHRoaXMKLXdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIEBzYW1we2hvc3R9IHZhcmlhYmxlLgotQGl0ZW0gaG9zdF9jcHUKLUBpdGVteCBob3N0X3ZlbmRvcgotQGl0ZW14IGhvc3Rfb3MKLVRoZSBmaXJzdCB0aHJlZSBwYXJ0cyBvZiB0aGUgY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZS4KLUBlbmQgdGFibGUKLQotVGhlIHNoZWxsIHZhcmlhYmxlcyBtYXkgYmUgdXNlZCBieSBwdXR0aW5nIHNoZWxsIGNvZGUgaW4KLUBmaWxle2NvbmZpZ3VyZS5pbn0uICBGb3IgYW4gZXhhbXBsZSwgc2VlIEByZWZ7VXNpbmcgQ29uZmlndXJhdGlvbgotTmFtZXN9LgotCi1Abm9kZSBTcGVjaWZ5aW5nIHRoZSBUYXJnZXQKLUBzZWN0aW9uIFNwZWNpZnlpbmcgdGhlIFRhcmdldAotCi1CeSBkZWZhdWx0LCB0aGUgQHNhbXB7Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGlzCi10aGUgc2FtZSBhcyB0aGUgaG9zdC4gIFRoaXMgaXMgdGhlIG1vcmUgY29tbW9uIGNhc2U7IGZvciBleGFtcGxlLCBpdAotbGVhZHMgdG8gYSBuYXRpdmUgY29tcGlsZXIgcmF0aGVyIHRoYW4gYSBjcm9zcyBjb21waWxlci4KLQotQGNpbmRleCBAc2FtcHstLXRhcmdldH0gb3B0aW9uCi1AY2luZGV4IHRhcmdldCBvcHRpb24KLUBjaW5kZXggY29uZmlndXJlIHRhcmdldAotSWYgeW91IHdhbnQgdG8gYnVpbGQgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZQotdGFyZ2V0IGV4cGxpY2l0bHkgYnkgdXNpbmcgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gd2hlbiB5b3UgcnVuCi1Ac2FtcHtjb25maWd1cmV9LiAgVGhlIGFyZ3VtZW50IHRvIEBzYW1wey0tdGFyZ2V0fSBpcyB0aGUgY29uZmlndXJhdGlvbgotbmFtZSBvZiB0aGUgc3lzdGVtIGZvciB3aGljaCB5b3Ugd2lzaCB0byBnZW5lcmF0ZSBjb2RlLgotQHhyZWZ7Q29uZmlndXJhdGlvbiBOYW1lc30uCi0KLUZvciBleGFtcGxlLCB0byBidWlsZCB0b29scyB3aGljaCBnZW5lcmF0ZSBjb2RlIGZvciBhIE1JUFMgRUxGIGVtYmVkZGVkCi1zeXN0ZW0sIHlvdSB3b3VsZCB1c2UgQHNhbXB7LS10YXJnZXQgbWlwcy1lbGZ9LgotCi1Abm9kZSBVc2luZyB0aGUgVGFyZ2V0IFR5cGUKLUBzZWN0aW9uIFVzaW5nIHRoZSBUYXJnZXQgVHlwZQotCi1AY2luZGV4IEBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19Ci1XaGVuIHdyaXRpbmcgQGZpbGV7Y29uZmlndXJlLmlufSBmb3IgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sLCB5b3Ugd2lsbAotbmVlZCB0byB1c2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhcmdldC4gIFRvIGRvIHRoaXMsIHB1dAotQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0gaW4gQGZpbGV7Y29uZmlndXJlLmlufS4KLQotQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0gd2lsbCBsb29rIGZvciBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gYW5kCi1jYW5vbmljYWxpemUgaXQgdXNpbmcgdGhlIEBmaWxle2NvbmZpZy5zdWJ9IHNoZWxsIHNjcmlwdC4gIEl0IHdpbGwgYWxzbwotcnVuIEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfSAoQHB4cmVme1VzaW5nIHRoZSBIb3N0IFR5cGV9KS4KLQotVGhlIHRhcmdldCB0eXBlIHdpbGwgYmUgcmVjb3JkZWQgaW4gdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXMuICBOb3RlCi10aGF0IHRoZSBob3N0IHZlcnNpb25zIG9mIHRoZXNlIHZhcmlhYmxlcyB3aWxsIGFsc28gYmUgZGVmaW5lZCBieQotQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9LgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIHRhcmdldAotVGhlIGNhbm9uaWNhbCBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHRhcmdldC4KLUBpdGVtIHRhcmdldF9hbGlhcwotVGhlIGFyZ3VtZW50IHRvIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLiAgSWYgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5Ci1hIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24sIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyBAc2FtcHtob3N0X2FsaWFzfS4KLUBpdGVtIHRhcmdldF9jcHUKLUBpdGVteCB0YXJnZXRfdmVuZG9yCi1AaXRlbXggdGFyZ2V0X29zCi1UaGUgZmlyc3QgdGhyZWUgcGFydHMgb2YgdGhlIGNhbm9uaWNhbCB0YXJnZXQgY29uZmlndXJhdGlvbiBuYW1lLgotQGVuZCB0YWJsZQotCi1Ob3RlIHRoYXQgaWYgQHNhbXB7aG9zdH0gYW5kIEBzYW1we3RhcmdldH0gYXJlIHRoZSBzYW1lIHN0cmluZywgeW91IGNhbgotYXNzdW1lIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24uICBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHlvdSBjYW4gYXNzdW1lIGEKLWNyb3NzIGNvbmZpZ3VyYXRpb24uCi0KLUl0IGlzIGFyZ3VhYmx5IHBvc3NpYmxlIGZvciBAc2FtcHtob3N0fSBhbmQgQHNhbXB7dGFyZ2V0fSB0byByZXByZXNlbnQKLXRoZSBzYW1lIHN5c3RlbSwgYnV0IGZvciB0aGUgc3RyaW5ncyB0byBub3QgYmUgaWRlbnRpY2FsLiAgRm9yIGV4YW1wbGUsCi1pZiBAc2FtcHtjb25maWcuZ3Vlc3N9IHJldHVybnMgQHNhbXB7c3BhcmMtc3VuLXN1bm9zNC4xLjR9LCBhbmQgc29tZWJvZHkKLWNvbmZpZ3VyZXMgd2l0aCBAc2FtcHstLXRhcmdldCBzcGFyYy1zdW4tc3Vub3M0LjF9LCB0aGVuIHRoZSBzbGlnaHQKLWRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucyBvZiBTdW5PUyBtYXkgYmUgdW5pbXBvcnRhbnQgZm9yCi15b3VyIHRvb2wuICBIb3dldmVyLCBpbiB0aGUgZ2VuZXJhbCBjYXNlIGl0IGNhbiBiZSBxdWl0ZSBkaWZmaWN1bHQgdG8KLWRldGVybWluZSB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBjb25maWd1cmF0aW9uIG5hbWVzIGFyZQotc2lnbmlmaWNhbnQgb3Igbm90LiAgVGhlcmVmb3JlLCBieSBjb252ZW50aW9uLCBpZiB0aGUgdXNlciBzcGVjaWZpZXMgYQotQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB3aXRob3V0IHNwZWNpZnlpbmcgYSBAc2FtcHstLWhvc3R9IG9wdGlvbiwgaXQgaXMKLWFzc3VtZWQgdGhhdCB0aGUgdXNlciB3YW50cyB0byBjb25maWd1cmUgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sLgotCi1UaGUgdmFyaWFibGVzIEBzYW1we3RhcmdldH0gYW5kIEBzYW1we3RhcmdldF9hbGlhc30gc2hvdWxkIGJlIGhhbmRsZWQKLWRpZmZlcmVudGx5LgotCi1JbiBnZW5lcmFsLCB3aGVuZXZlciB0aGUgdXNlciBtYXkgYWN0dWFsbHkgc2VlIGEgc3RyaW5nLAotQHNhbXB7dGFyZ2V0X2FsaWFzfSBzaG91bGQgYmUgdXNlZC4gIFRoaXMgaW5jbHVkZXMgYW55dGhpbmcgd2hpY2ggbWF5Ci1hcHBlYXIgaW4gdGhlIGZpbGUgc3lzdGVtLCBzdWNoIGFzIGEgZGlyZWN0b3J5IG5hbWUgb3IgcGFydCBvZiBhIHRvb2wKLW5hbWUuICBJdCBhbHNvIGluY2x1ZGVzIGFueSB0b29sIG91dHB1dCwgdW5sZXNzIGl0IGlzIGNsZWFybHkgbGFiZWxsZWQKLWFzIHRoZSBjYW5vbmljYWwgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gbmFtZS4gIFRoaXMgcGVybWl0cyB0aGUgdXNlciB0bwotdXNlIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIHRvIHNwZWNpZnkgaG93IHRoZSB0b29sIHdpbGwgYXBwZWFyIHRvCi10aGUgb3V0c2lkZSB3b3JsZC4KLQotT24gdGhlIG90aGVyIGhhbmQsIHdoZW4gY2hlY2tpbmcgZm9yIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgdGFyZ2V0Ci1zeXN0ZW0sIEBzYW1we3RhcmdldH0gc2hvdWxkIGJlIHVzZWQuICBUaGlzIGlzIGJlY2F1c2UgYSB3aWRlIHZhcmlldHkgb2YKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb25zIG1heSBtYXAgaW50byB0aGUgc2FtZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbgotbmFtZS4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gZHVwbGljYXRlIHRoZSBjYW5vbmljYWxpemF0aW9uIGRvbmUgYnkKLUBzYW1we2NvbmZpZy5zdWJ9IGluIHlvdXIgb3duIGNvZGUuCi0KLUJ5IGNvbnZlbnRpb24sIGNyb3NzIHRvb2xzIGFyZSBpbnN0YWxsZWQgd2l0aCBhIHByZWZpeCBvZiB0aGUgYXJndW1lbnQKLXVzZWQgd2l0aCB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgYWxzbyBrbm93biBhcyBAc2FtcHt0YXJnZXRfYWxpYXN9Ci0oQHB4cmVme1VzaW5nIHRoZSBUYXJnZXQgVHlwZX0pLiAgSWYgdGhlIHVzZXIgZG9lcyBub3QgdXNlIHRoZQotQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgYW5kIHRodXMgaXMgYnVpbGRpbmcgYSBuYXRpdmUgdG9vbCwgbm8gcHJlZml4IGlzCi11c2VkLgotCi1Gb3IgZXhhbXBsZSwgaWYgZ2NjIGlzIGNvbmZpZ3VyZWQgd2l0aCBAc2FtcHstLXRhcmdldCBtaXBzLWVsZn0sIHRoZW4KLXRoZSBpbnN0YWxsZWQgYmluYXJ5IHdpbGwgYmUgbmFtZWQgQHNhbXB7bWlwcy1lbGYtZ2NjfS4gIElmIGdjYyBpcwotY29uZmlndXJlZCB3aXRob3V0IGEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgdGhlbiB0aGUgaW5zdGFsbGVkIGJpbmFyeQotd2lsbCBiZSBuYW1lZCBAc2FtcHtnY2N9LgotCi1UaGUgYXV0b2NvbmYgbWFjcm8gQHNhbXB7QUNfQVJHX1BST0dSQU19IHdpbGwgaGFuZGxlIHRoaXMgZm9yIHlvdS4gIElmCi15b3UgYXJlIHVzaW5nIGF1dG9tYWtlLCBubyBtb3JlIG5lZWQgYmUgZG9uZTsgdGhlIHByb2dyYW1zIHdpbGwKLWF1dG9tYXRpY2FsbHkgYmUgaW5zdGFsbGVkIHdpdGggdGhlIGNvcnJlY3QgcHJlZml4ZXMuICBPdGhlcndpc2UsIHNlZQotdGhlIGF1dG9jb25mIGRvY3VtZW50YXRpb24gZm9yIEBzYW1we0FDX0FSR19QUk9HUkFNfS4KLQotQG5vZGUgQ3Jvc3MgVG9vbHMgaW4gdGhlIEN5Z251cyBUcmVlCi1Ac2VjdGlvbiBDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWUKLQotVGhlIEN5Z251cyB0cmVlIGlzIHVzZWQgZm9yIHZhcmlvdXMgcGFja2FnZXMgaW5jbHVkaW5nIGdkYiwgdGhlIEdOVQotYmludXRpbHMsIGFuZCBlZ2NzLiAgSXQgaXMgYWxzbywgb2YgY291cnNlLCB1c2VkIGZvciBDeWdudXMgcmVsZWFzZXMuCi0KLUluIHRoZSBDeWdudXMgdHJlZSwgdGhlIHRvcCBsZXZlbCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB1c2VzIHRoZSBvbGQKLUN5Z251cyBjb25maWd1cmUgc3lzdGVtLCBub3QgYXV0b2NvbmYuICBUaGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlLmlufQotaXMgd3JpdHRlbiB0byBidWlsZCBwYWNrYWdlcyBiYXNlZCBvbiB3aGF0IGlzIGluIHRoZSBzb3VyY2UgdHJlZSwgYW5kCi1zdXBwb3J0cyBidWlsZGluZyBhIGxhcmdlIG51bWJlciBvZiB0b29scyBpbiBhIHNpbmdsZQotQHNhbXB7Y29uZmlndXJlfS9Ac2FtcHttYWtlfSBzdGVwLgotCi1UaGUgQ3lnbnVzIHRyZWUgbWF5IGJlIGNvbmZpZ3VyZWQgd2l0aCBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24uICBUaGUKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gYXBwbGllcyByZWN1cnNpdmVseSB0byBldmVyeSBzdWJkaXJlY3RvcnksIGFuZAotcGVybWl0cyBidWlsZGluZyBhbiBlbnRpcmUgc2V0IG9mIGNyb3NzIHRvb2xzIGF0IG9uY2UuCi0KLUBtZW51Ci0qIEhvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXM6OgkJSG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllcy4KLSogVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHM6OglUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0cy4KLSogTWFrZSBUYXJnZXRzIGluIEN5Z251cyBUcmVlOjogICAgICAgICBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWUuCi0qIFRhcmdldCBsaWJpYmVydHk6OgkJCVRhcmdldCBsaWJpYmVydHkKLUBlbmQgbWVudQotCi1Abm9kZSBIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzCi1Ac3Vic2VjdGlvbiBIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzCi0KLVRoZSBDeWdudXMgdHJlZSBkaXN0aW5ndWlzaGVzIGhvc3QgbGlicmFyaWVzIGZyb20gdGFyZ2V0IGxpYnJhcmllcy4KLQotSG9zdCBsaWJyYXJpZXMgYXJlIGJ1aWx0IHdpdGggdGhlIGNvbXBpbGVyIHVzZWQgdG8gYnVpbGQgdGhlIHByb2dyYW1zCi13aGljaCBydW4gb24gdGhlIGhvc3QsIHdoaWNoIGlzIGNhbGxlZCB0aGUgaG9zdCBjb21waWxlci4gIFRoaXMgaW5jbHVkZXMKLWxpYnJhcmllcyBzdWNoIGFzIEBzYW1we2JmZH0gYW5kIEBzYW1we3RjbH0uICBUaGVzZSBsaWJyYXJpZXMgYXJlIGJ1aWx0Ci13aXRoIHRoZSBob3N0IGNvbXBpbGVyLCBhbmQgYXJlIGxpbmtlZCBpbnRvIHByb2dyYW1zIGxpa2UgdGhlIGJpbnV0aWxzCi1vciBnY2Mgd2hpY2ggcnVuIG9uIHRoZSBob3N0LgotCi1UYXJnZXQgbGlicmFyaWVzIGFyZSBidWlsdCB3aXRoIHRoZSB0YXJnZXQgY29tcGlsZXIuICBJZiBnY2MgaXMgcHJlc2VudAotaW4gdGhlIHNvdXJjZSB0cmVlLCB0aGVuIHRoZSB0YXJnZXQgY29tcGlsZXIgaXMgdGhlIGdjYyB0aGF0IGlzIGJ1aWx0Ci11c2luZyB0aGUgaG9zdCBjb21waWxlci4gIFRhcmdldCBsaWJyYXJpZXMgYXJlIGxpYnJhcmllcyBzdWNoIGFzCi1Ac2FtcHtuZXdsaWJ9IGFuZCBAc2FtcHtsaWJzdGRjKyt9LiAgVGhlc2UgbGlicmFyaWVzIGFyZSBub3QgbGlua2VkIGludG8KLXRoZSBob3N0IHByb2dyYW1zLCBidXQgYXJlIGluc3RlYWQgbWFkZSBhdmFpbGFibGUgZm9yIHVzZSB3aXRoIHByb2dyYW1zCi1idWlsdCB3aXRoIHRoZSB0YXJnZXQgY29tcGlsZXIuCi0KLUZvciB0aGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24sIGFzc3VtZSB0aGF0IGdjYyBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UKLXRyZWUsIHNvIHRoYXQgaXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotCi1UaGVyZSBpcyBhIGNvbXBsaWNhdGlvbiBoZXJlLiAgVGhlIGNvbmZpZ3VyZSBwcm9jZXNzIG5lZWRzIHRvIGtub3cgd2hpY2gKLWNvbXBpbGVyIHlvdSBhcmUgZ29pbmcgdG8gdXNlIHRvIGJ1aWxkIGEgdG9vbDsgb3RoZXJ3aXNlLCB0aGUgZmVhdHVyZQotdGVzdHMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuICBUaGUgQ3lnbnVzIHRyZWUgaGFuZGxlcyB0aGlzIGJ5IG5vdAotY29uZmlndXJpbmcgdGhlIHRhcmdldCBsaWJyYXJpZXMgdW50aWwgdGhlIHRhcmdldCBjb21waWxlciBpcyBidWlsdC4gIEluCi1vcmRlciB0byBwZXJtaXQgZXZlcnl0aGluZyB0byBidWlsZCB1c2luZyBhIHNpbmdsZQotQHNhbXB7Y29uZmlndXJlfS9Ac2FtcHttYWtlfSwgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhcmdldCBsaWJyYXJpZXMKLWlzIGFjdHVhbGx5IHRyaWdnZXJlZCBkdXJpbmcgdGhlIG1ha2Ugc3RlcC4KLQotV2hlbiB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgY29uZmlndXJlZCwgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gaXMKLW5vdCB1c2VkLiAgSW5zdGVhZCwgdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIGlzIHVzZWQgd2l0aCB0aGUgYXJndW1lbnQKLW9mIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIGZvciB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLiAgSWYgbm8KLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gd2FzIHVzZWQgZm9yIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24sIHRoZQotQHNhbXB7LS1ob3N0fSBvcHRpb24gd2lsbCBiZSBwYXNzZWQgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZQotQGZpbGV7Y29uZmlnLmd1ZXNzfSBzaGVsbCBzY3JpcHQuICBBbnkgQHNhbXB7LS1idWlsZH0gb3B0aW9uIGlzIHBhc3NlZAotZG93biB1bmNoYW5nZWQuCi0KLVRoaXMgdHJhbnNsYXRpb24gb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIGlzIGRvbmUgYmVjYXVzZSBzaW5jZSB0aGUKLXRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbXBpbGVkIHdpdGggdGhlIHRhcmdldCBjb21waWxlciwgdGhleSBhcmUgYmVpbmcKLWJ1aWx0IGluIG9yZGVyIHRvIHJ1biBvbiB0aGUgdGFyZ2V0IG9mIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24uICBCeQotdGhlIGRlZmluaXRpb24gb2YgaG9zdCwgdGhpcyBtZWFucyB0aGF0IHRoZWlyIGhvc3Qgc3lzdGVtIGlzIHRoZSBzYW1lIGFzCi10aGUgdGFyZ2V0IHN5c3RlbSBvZiB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLgotCi1UaGUgc2FtZSBwcm9jZXNzIGlzIHVzZWQgZm9yIGJvdGggYSBuYXRpdmUgY29uZmlndXJhdGlvbiBhbmQgYSBjcm9zcwotY29uZmlndXJhdGlvbi4gIEV2ZW4gd2hlbiB1c2luZyBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCB0aGUgdGFyZ2V0Ci1saWJyYXJpZXMgd2lsbCBiZSBjb25maWd1cmVkIGFuZCBidWlsdCB1c2luZyB0aGUgbmV3bHkgYnVpbHQgY29tcGlsZXIuCi1UaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIHRoZSBDKysgbGlicmFyaWVzLCBzaW5jZSB0aGVyZSBpcyBubwotcmVhc29uIHRvIGFzc3VtZSB0aGF0IHRoZSBDKysgY29tcGlsZXIgdXNlZCB0byBidWlsZCB0aGUgaG9zdCB0b29scyAoaWYKLXRoZXJlIGV2ZW4gaXMgb25lKSB1c2VzIHRoZSBzYW1lIEFCSSBhcyB0aGUgZysrIGNvbXBpbGVyIHdoaWNoIHdpbGwgYmUKLXVzZWQgdG8gYnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi0KLVRoZXJlIGlzIG9uZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiBhbmQgYSBjcm9zcwotY29uZmlndXJhdGlvbi4gIEluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIHRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZQotbm9ybWFsbHkgY29uZmlndXJlZCBhbmQgYnVpbHQgYXMgc2libGluZ3Mgb2YgdGhlIGhvc3QgdG9vbHMuICBJbiBhIGNyb3NzCi1jb25maWd1cmF0aW9uLCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgbm9ybWFsbHkgYnVpbHQgaW4gYSBzdWJkaXJlY3RvcnkKLXdob3NlIG5hbWUgaXMgdGhlIGFyZ3VtZW50IHRvIEBzYW1wey0tdGFyZ2V0fS4gIFRoaXMgaXMgbWFpbmx5IGZvcgotaGlzdG9yaWNhbCByZWFzb25zLgotCi1UbyBzdW1tYXJpemUsIHJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfSBpbiB0aGUgQ3lnbnVzIHRyZWUgY29uZmlndXJlcyBhbGwKLXRoZSBob3N0IGxpYnJhcmllcyBhbmQgdG9vbHMsIGJ1dCBkb2VzIG5vdCBjb25maWd1cmUgYW55IG9mIHRoZSB0YXJnZXQKLWxpYnJhcmllcy4gIFJ1bm5pbmcgQHNhbXB7bWFrZX0gdGhlbiBkb2VzIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1CdWlsZCB0aGUgaG9zdCBsaWJyYXJpZXMuCi1AaXRlbQotQnVpbGQgdGhlIGhvc3QgcHJvZ3JhbXMsIGluY2x1ZGluZyBnY2MuICBOb3RlIHRoYXQgd2UgY2FsbCBnY2MgYm90aCBhCi1ob3N0IHByb2dyYW0gKHNpbmNlIGl0IHJ1bnMgb24gdGhlIGhvc3QpIGFuZCBhIHRhcmdldCBjb21waWxlciAoc2luY2UgaXQKLWdlbmVyYXRlcyBjb2RlIGZvciB0aGUgdGFyZ2V0KS4KLUBpdGVtCi1Vc2luZyB0aGUgbmV3bHkgYnVpbHQgdGFyZ2V0IGNvbXBpbGVyLCBjb25maWd1cmUgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi1AaXRlbQotQnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi1AZW5kIGl0ZW1pemUKLQotVGhlIHN0ZXBzIG5lZWQgbm90IGJlIGRvbmUgaW4gcHJlY2lzZWx5IHRoaXMgb3JkZXIsIHNpbmNlIHRoZXkgYXJlCi1hY3R1YWxseSBjb250cm9sbGVkIGJ5IEBmaWxle01ha2VmaWxlfSB0YXJnZXRzLgotCi1Abm9kZSBUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0cwotQHN1YnNlY3Rpb24gVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHMKLQotVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB5b3UgbXVzdCBrbm93IGluIG9yZGVyIHRvIHdyaXRlIGEgY29uZmlndXJlCi1zY3JpcHQgZm9yIGEgdGFyZ2V0IGxpYnJhcnkuICBUaGlzIGlzIGp1c3QgYSBxdWljayBza2V0Y2gsIGFuZCBiZWdpbm5lcnMKLXNob3VsZG4ndCB3b3JyeSBpZiB0aGV5IGRvbid0IGZvbGxvdyBldmVyeXRoaW5nIGhlcmUuCi0KLVRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZSBjb25maWd1cmVkIGFuZCBidWlsdCB1c2luZyBhIG5ld2x5IGJ1aWx0IHRhcmdldAotY29tcGlsZXIuICBUaGVyZSBtYXkgbm90IGJlIGFueSBzdGFydHVwIGZpbGVzIG9yIGxpYnJhcmllcyBmb3IgdGhpcwotdGFyZ2V0IGNvbXBpbGVyLiAgSW4gZmFjdCwgdGhvc2UgZmlsZXMgd2lsbCBwcm9iYWJseSBiZSBidWlsdCBhcyBwYXJ0IG9mCi1zb21lIHRhcmdldCBsaWJyYXJ5LCB3aGljaCBuYXR1cmFsbHkgbWVhbnMgdGhhdCB0aGV5IHdpbGwgbm90IGV4aXN0IHdoZW4KLXlvdXIgdGFyZ2V0IGxpYnJhcnkgaXMgY29uZmlndXJlZC4KLQotVGhpcyBtZWFucyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBhIHRhcmdldCBsaWJyYXJ5IG1heSBub3QgdXNlCi1hbnkgdGVzdCB3aGljaCByZXF1aXJlcyBkb2luZyBhIGxpbmsuICBUaGlzIHVuZm9ydHVuYXRlbHkgaW5jbHVkZXMgbWFueQotdXNlZnVsIGF1dG9jb25mIG1hY3Jvcywgc3VjaCBhcyBAc2FtcHtBQ19DSEVDS19GVU5DU30uICBhdXRvY29uZiBtYWNyb3MKLXdoaWNoIGRvIGEgY29tcGlsZSBidXQgbm90IGEgbGluaywgc3VjaCBhcyBAc2FtcHtBQ19DSEVDS19IRUFERVJTfSwgbWF5Ci1iZSB1c2VkLgotCi1UaGlzIGlzIGEgc2V2ZXJlIHJlc3RyaWN0aW9uLCBidXQgbm9ybWFsbHkgbm90IGEgZmF0YWwgb25lLCBhcyB0YXJnZXQKLWxpYnJhcmllcyBjYW4gb2Z0ZW4gYXNzdW1lIHRoZSBwcmVzZW5jZSBvZiBvdGhlciB0YXJnZXQgbGlicmFyaWVzLCBhbmQKLXRodXMga25vdyB3aGljaCBmdW5jdGlvbnMgd2lsbCBiZSBhdmFpbGFibGUuCi0KLUFzIG9mIHRoaXMgd3JpdGluZywgdGhlIGF1dG9jb25mIG1hY3JvIEBzYW1we0FDX1BST0dfQ0N9IGRvZXMgYSBsaW5rIHRvCi1tYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgd29ya3MuICBUaGlzIG1heSBmYWlsIGluIGEgdGFyZ2V0IGxpYnJhcnksCi1zbyB0YXJnZXQgbGlicmFyaWVzIG11c3QgdXNlIGEgZGlmZmVyZW50IHNldCBvZiBtYWNyb3MgdG8gbG9jYXRlIHRoZQotY29tcGlsZXIuICBTZWUgdGhlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBpbiBhIGRpcmVjdG9yeSBsaWtlCi1AZmlsZXtsaWJpYmVydHl9IG9yIEBmaWxle2xpYmdsb3NzfSBmb3IgYW4gZXhhbXBsZS4KLQotQXMgbm90ZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRhcmdldCBsaWJyYXJpZXMgYXJlIHNvbWV0aW1lcyBidWlsdAotaW4gZGlyZWN0b3JpZXMgd2hpY2ggYXJlIHNpYmxpbmdzIHRvIHRoZSBob3N0IHRvb2xzLCBhbmQgYXJlIHNvbWV0aW1lcwotYnVpbHQgaW4gYSBzdWJkaXJlY3RvcnkuICBUaGUgQHNhbXB7LS13aXRoLXRhcmdldC1zdWJkaXJ9IGNvbmZpZ3VyZQotb3B0aW9uIHdpbGwgYmUgcGFzc2VkIHdoZW4gdGhlIGxpYnJhcnkgaXMgY29uZmlndXJlZC4gIEl0cyB2YWx1ZSB3aWxsIGJlCi1hbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHRhcmdldCBsaWJyYXJ5IGlzIGEgc2libGluZy4gIEl0cyB2YWx1ZSB3aWxsIGJlCi10aGUgbmFtZSBvZiB0aGUgc3ViZGlyZWN0b3J5IGlmIHRoZSB0YXJnZXQgbGlicmFyeSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLQotSWYgdGhlIG92ZXJhbGwgYnVpbGQgaXMgbm90IGEgbmF0aXZlIGJ1aWxkIChpLmUuLCB0aGUgb3ZlcmFsbCBjb25maWd1cmUKLXVzZWQgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24pLCB0aGVuIHRoZSBsaWJyYXJ5IHdpbGwgYmUgY29uZmlndXJlZAotd2l0aCB0aGUgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbi4gIFRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbiB3aWxsCi1iZSB0aGUgaG9zdCBzeXN0ZW0gb2YgdGhlIG92ZXJhbGwgYnVpbGQuICBSZWNhbGwgdGhhdCB0aGUgaG9zdCBzeXN0ZW0gb2YKLXRoZSBsaWJyYXJ5IHdpbGwgYmUgdGhlIHRhcmdldCBvZiB0aGUgb3ZlcmFsbCBidWlsZC4gIElmIHRoZSBvdmVyYWxsCi1idWlsZCBpcyBhIG5hdGl2ZSBidWlsZCwgdGhlIEBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBvcHRpb24gd2lsbCBub3QgYmUKLXVzZWQuCi0KLUEgbGlicmFyeSB3aGljaCBjYW4gYmUgYnVpbHQgYm90aCBzdGFuZGFsb25lIGFuZCBhcyBhIHRhcmdldCBsaWJyYXJ5IG1heQotd2FudCB0byBpbnN0YWxsIGl0c2VsZiBpbnRvIGRpZmZlcmVudCBkaXJlY3RvcmllcyBkZXBlbmRpbmcgdXBvbiB0aGUKLWNhc2UuICBXaGVuIGJ1aWx0IHN0YW5kYWxvbmUsIG9yIHdoZW4gYnVpbHQgbmF0aXZlLCB0aGUgbGlicmFyeSBzaG91bGQKLWJlIGluc3RhbGxlZCBpbiBAc2FtcHskKGxpYmRpcil9LiAgV2hlbiBidWlsdCBhcyBhIHRhcmdldCBsaWJyYXJ5IHdoaWNoCi1pcyBub3QgbmF0aXZlLCB0aGUgbGlicmFyeSBzaG91bGQgYmUgaW5zdGFsbGVkIGluIEBzYW1weyQodG9vbGRpcikvbGlifS4KLVRoZSBAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gb3B0aW9uIG1heSBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlCi1jYXNlcy4KLQotVGhpcyBzYW1lIHRlc3Qgb2YgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG1heSBiZSB1c2VkIHRvIHNlZSB3aGV0aGVyIGl0Ci1pcyBPSyB0byB1c2UgbGluayB0ZXN0cyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4gIElmIHRoZQotQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlbiB0aGUgbGlicmFyeSBpcyBiZWluZwotYnVpbHQgZWl0aGVyIHN0YW5kYWxvbmUgb3IgbmF0aXZlLCBhbmQgYSBsaW5rIHNob3VsZCB3b3JrLgotCi1Abm9kZSBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWUKLUBzdWJzZWN0aW9uIE1ha2UgVGFyZ2V0cyBpbiBDeWdudXMgVHJlZQotCi1UaGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBpbiB0aGUgQ3lnbnVzIHRyZWUgZGVmaW5lcyB0YXJnZXRzIGZvcgotZXZlcnkga25vd24gc3ViZGlyZWN0b3J5LgotCi1Gb3IgZXZlcnkgc3ViZGlyZWN0b3J5IEB2YXJ7ZGlyfSB3aGljaCBob2xkcyBhIGhvc3QgbGlicmFyeSBvciBwcm9ncmFtLAotdGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXQgQHNhbXB7YWxsLUB2YXJ7ZGlyfX0gd2lsbCBidWlsZCB0aGF0IGxpYnJhcnkKLW9yIHByb2dyYW0uCi0KLVRoZXJlIGFyZSBkZXBlbmRlbmNpZXMgYW1vbmcgaG9zdCB0b29scy4gIEZvciBleGFtcGxlLCBidWlsZGluZyBnY2MKLXJlcXVpcmVzIGZpcnN0IGJ1aWxkaW5nIGdhcywgYmVjYXVzZSB0aGUgZ2NjIGJ1aWxkIHByb2Nlc3MgaW52b2tlcyB0aGUKLXRhcmdldCBhc3NlbWJsZXIuICBUaGVzZSBkZXBlbmRlbmNpZXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgdG9wIGxldmVsCi1AZmlsZXtNYWtlZmlsZX0uCi0KLUZvciBldmVyeSBzdWJkaXJlY3RvcnkgQHZhcntkaXJ9IHdoaWNoIGhvbGRzIGEgdGFyZ2V0IGxpYnJhcnksIHRoZQotQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBAc2FtcHtjb25maWd1cmUtdGFyZ2V0LUB2YXJ7ZGlyfX0gd2lsbCBjb25maWd1cmUKLXRoYXQgbGlicmFyeS4gIFRoZSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0IEBzYW1we2FsbC10YXJnZXQtQHZhcntkaXJ9fQotd2lsbCBidWlsZCB0aGF0IGxpYnJhcnkuCi0KLUV2ZXJ5IEBzYW1we2NvbmZpZ3VyZS10YXJnZXQtQHZhcntkaXJ9fSB0YXJnZXQgZGVwZW5kcyB1cG9uCi1Ac2FtcHthbGwtZ2NjfSwgc2luY2UgZ2NjLCB0aGUgdGFyZ2V0IGNvbXBpbGVyLCBpcyByZXF1aXJlZCB0byBjb25maWd1cmUKLXRoZSB0b29sLiAgRXZlcnkgQHNhbXB7YWxsLXRhcmdldC1AdmFye2Rpcn19IHRhcmdldCBkZXBlbmRzIHVwb24gdGhlCi1jb3JyZXNwb25kaW5nIEBzYW1we2NvbmZpZ3VyZS10YXJnZXQtQHZhcntkaXJ9fSB0YXJnZXQuCi0KLVRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIHRhcmdldHMgd2hpY2ggbWF5IGJlIG9mIGludGVyZXN0IGZvciBlYWNoCi1kaXJlY3Rvcnk6IEBzYW1we2luc3RhbGwtQHZhcntkaXJ9fSwgQHNhbXB7Y2xlYW4tQHZhcntkaXJ9fSwgYW5kCi1Ac2FtcHtjaGVjay1AdmFye2Rpcn19LiAgVGhlcmUgYXJlIGFsc28gY29ycmVzcG9uZGluZyBAc2FtcHt0YXJnZXR9Ci12ZXJzaW9ucyBvZiB0aGVzZSBmb3IgdGhlIHRhcmdldCBsaWJyYXJpZXMgLCBzdWNoIGFzCi1Ac2FtcHtpbnN0YWxsLXRhcmdldC1AdmFye2Rpcn19LgotCi1Abm9kZSBUYXJnZXQgbGliaWJlcnR5Ci1Ac3Vic2VjdGlvbiBUYXJnZXQgbGliaWJlcnR5Ci0KLVRoZSBAZmlsZXtsaWJpYmVydHl9IHN1YmRpcmVjdG9yeSBpcyBjdXJyZW50bHkgYSBzcGVjaWFsIGNhc2UsIGluIHRoYXQKLWl0IGlzIHRoZSBvbmx5IGRpcmVjdG9yeSB3aGljaCBpcyBidWlsdCBib3RoIHVzaW5nIHRoZSBob3N0IGNvbXBpbGVyIGFuZAotdXNpbmcgdGhlIHRhcmdldCBjb21waWxlci4KLQotVGhpcyBpcyBiZWNhdXNlIHRoZSBmaWxlcyBpbiBAZmlsZXtsaWJpYmVydHl9IGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgdGhlCi1ob3N0IHRvb2xzLCBhbmQgdGhleSBhcmUgYWxzbyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgQGZpbGV7bGlic3RkYysrfQotdGFyZ2V0IGxpYnJhcnkgYXMgc3VwcG9ydCBjb2RlLgotCi1UaGlzIGR1YWxpdHkgZG9lcyBub3QgcG9zZSBhbnkgcGFydGljdWxhciBkaWZmaWN1bHRpZXMuICBJdCBtZWFucyB0aGF0Ci10aGVyZSBhcmUgdGFyZ2V0cyBmb3IgYm90aCBAc2FtcHthbGwtbGliaWJlcnR5fSBhbmQKLUBzYW1we2FsbC10YXJnZXQtbGliaWJlcnR5fS4KLQotSW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgd2hlbiB0YXJnZXQgbGlicmFyaWVzIGFyZSBub3QgYnVpbHQgaW4gYQotc3ViZGlyZWN0b3J5LCB0aGUgc2FtZSBvYmplY3RzIGFyZSBub3JtYWxseSB1c2VkIGFzIGJvdGggdGhlIGhvc3QgYnVpbGQKLWFuZCB0aGUgdGFyZ2V0IGJ1aWxkLiAgVGhpcyBpcyBub3JtYWxseSBPSywgc2luY2UgbGliaWJlcnR5IGNvbnRhaW5zCi1vbmx5IEMgY29kZSwgYW5kIGluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24gdGhlIHJlc3VsdHMgb2YgdGhlIGhvc3QKLWNvbXBpbGVyIGFuZCB0aGUgdGFyZ2V0IGNvbXBpbGVyIGFyZSBub3JtYWxseSBpbnRlcm9wZXJhYmxlLgotCi1Jcml4IDYgaXMgYWdhaW4gYW4gZXhjZXB0aW9uIGhlcmUsIHNpbmNlIHRoZSBTR0kgbmF0aXZlIGNvbXBpbGVyCi1kZWZhdWx0cyB0byB1c2luZyB0aGUgQHNhbXB7TzMyfSBBQkksIGFuZCBnY2MgZGVmYXVsdHMgdG8gdXNpbmcgdGhlCi1Ac2FtcHtOMzJ9IEFCSS4gIE9uIElyaXggNiwgdGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIGEKLXN1YmRpcmVjdG9yeSBldmVuIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCBhdm9pZGluZyB0aGlzIHByb2JsZW0uCi0KLVRoZXJlIGFyZSBjdXJyZW50bHkgbm8gb3RoZXIgbGlicmFyaWVzIGJ1aWx0IGZvciBib3RoIHRoZSBob3N0IGFuZCB0aGUKLXRhcmdldCwgYnV0IHRoZXJlIGlzIG5vIGNvbmNlcHR1YWwgcHJvYmxlbSB3aXRoIGFkZGluZyBtb3JlLgotCi1Abm9kZSBDYW5hZGlhbiBDcm9zcwotQGNoYXB0ZXIgQ2FuYWRpYW4gQ3Jvc3MKLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MKLUBjaW5kZXggYnVpbGRpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyCi1AY2luZGV4IGNyb3NzIGNvbXBpbGVyLCBidWlsZGluZyB3aXRoCi0KLUl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIHRvIGJ1aWxkIGEKLXByb2dyYW0gd2hpY2ggd2lsbCBydW4gb24gYSBzeXN0ZW0gd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIHN5c3RlbSBvbgotd2hpY2ggdGhlIHRvb2xzIGFyZSBidWlsdC4gIEluIG90aGVyIHdvcmRzLCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZAotcHJvZ3JhbXMgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLQotVGhpcyBpcyByZWZlcnJlZCB0byBhcyBhIEBkZm57Q2FuYWRpYW4gQ3Jvc3N9LgotCi1AbWVudQotKiBDYW5hZGlhbiBDcm9zcyBFeGFtcGxlOjoJCUNhbmFkaWFuIENyb3NzIEV4YW1wbGUuCi0qIENhbmFkaWFuIENyb3NzIENvbmNlcHRzOjoJCUNhbmFkaWFuIENyb3NzIENvbmNlcHRzLgotKiBCdWlsZCBDcm9zcyBIb3N0IFRvb2xzOjoJCUJ1aWxkIENyb3NzIEhvc3QgVG9vbHMuCi0qIEJ1aWxkIGFuZCBIb3N0IE9wdGlvbnM6OgkJQnVpbGQgYW5kIEhvc3QgT3B0aW9ucy4KLSogQ0Nyb3NzIG5vdCBpbiBDeWdudXMgVHJlZTo6CQlDYW5hZGlhbiBDcm9zcyBub3QgaW4gQ3lnbnVzIFRyZWUuCi0qIENDcm9zcyBpbiBDeWdudXMgVHJlZTo6CQlDYW5hZGlhbiBDcm9zcyBpbiBDeWdudXMgVHJlZS4KLSogU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zczo6CQlTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzLgotQGVuZCBtZW51Ci0KLUBub2RlIENhbmFkaWFuIENyb3NzIEV4YW1wbGUKLUBzZWN0aW9uIENhbmFkaWFuIENyb3NzIEV4YW1wbGUKLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgQ2FuYWRpYW4gQ3Jvc3MuCi0KLVdoaWxlIHJ1bm5pbmcgb24gYSBHTlUvTGludXgsIHlvdSBjYW4gYnVpbGQgYSBwcm9ncmFtIHdoaWNoIHdpbGwgcnVuIG9uCi1hIFNvbGFyaXMgc3lzdGVtLiAgWW91IHdvdWxkIHVzZSBhIEdOVS9MaW51eCBjcm9zcyBTb2xhcmlzIGNvbXBpbGVyIHRvCi1idWlsZCB0aGUgcHJvZ3JhbS4KLQotT2YgY291cnNlLCB5b3UgY291bGQgbm90IHJ1biB0aGUgcmVzdWx0aW5nIHByb2dyYW0gb24geW91ciBHTlUvTGludXgKLXN5c3RlbS4gIFlvdSB3b3VsZCBoYXZlIHRvIGNvcHkgaXQgb3ZlciB0byBhIFNvbGFyaXMgc3lzdGVtIGJlZm9yZSB5b3UKLXdvdWxkIHJ1biBpdC4KLQotT2YgY291cnNlLCB5b3UgY291bGQgYWxzbyBzaW1wbHkgYnVpbGQgdGhlIHByb2dyYW1zIG9uIHRoZSBTb2xhcmlzCi1zeXN0ZW0gaW4gdGhlIGZpcnN0IHBsYWNlLiAgSG93ZXZlciwgcGVyaGFwcyB0aGUgU29sYXJpcyBzeXN0ZW0gaXMgbm90Ci1hdmFpbGFibGUgZm9yIHNvbWUgcmVhc29uOyBwZXJoYXBzIHlvdSBhY3R1YWxseSBkb24ndCBoYXZlIG9uZSwgYnV0IHlvdQotd2FudCB0byBidWlsZCB0aGUgdG9vbHMgZm9yIHNvbWVib2R5IGVsc2UgdG8gdXNlLiAgT3IgcGVyaGFwcyB5b3VyCi1HTlUvTGludXggc3lzdGVtIGlzIG11Y2ggZmFzdGVyIHRoYW4geW91ciBTb2xhcmlzIHN5c3RlbS4KLQotQSBDYW5hZGlhbiBDcm9zcyBidWlsZCBpcyBtb3N0IGZyZXF1ZW50bHkgdXNlZCB3aGVuIGJ1aWxkaW5nIHByb2dyYW1zIHRvCi1ydW4gb24gYSBub24tVW5peCBzeXN0ZW0sIHN1Y2ggYXMgRE9TIG9yIFdpbmRvd3MuICBJdCBtYXkgYmUgc2ltcGxlciB0bwotY29uZmlndXJlIGFuZCBidWlsZCBvbiBhIFVuaXggc3lzdGVtIHRoYW4gdG8gc3VwcG9ydCB0aGUgY29uZmlndXJhdGlvbgotbWFjaGluZXJ5IG9uIGEgbm9uLVVuaXggc3lzdGVtLgotCi1Abm9kZSBDYW5hZGlhbiBDcm9zcyBDb25jZXB0cwotQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3MgQ29uY2VwdHMKLQotV2hlbiBidWlsZGluZyBhIENhbmFkaWFuIENyb3NzLCB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIGRpZmZlcmVudCBzeXN0ZW1zCi1pbnZvbHZlZDogdGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgYXJlIGJlaW5nIGJ1aWx0LCBhbmQgdGhlIHN5c3RlbQotb24gd2hpY2ggdGhlIHRvb2xzIHdpbGwgcnVuLgotCi1UaGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyBhcmUgYmVpbmcgYnVpbHQgaXMgY2FsbGVkIHRoZSBAZGZue2J1aWxkfQotc3lzdGVtLgotCi1UaGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1biBpcyBjYWxsZWQgdGhlIGhvc3Qgc3lzdGVtLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBidWlsZGluZyBhIFNvbGFyaXMgcHJvZ3JhbSBvbiBhIEdOVS9MaW51eAotc3lzdGVtLCBhcyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGhlIGJ1aWxkIHN5c3RlbSB3b3VsZCBiZSBHTlUvTGludXgsCi1hbmQgdGhlIGhvc3Qgc3lzdGVtIHdvdWxkIGJlIFNvbGFyaXMuCi0KLUl0IGlzLCBvZiBjb3Vyc2UsIHBvc3NpYmxlIHRvIGJ1aWxkIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgYSBDYW5hZGlhbgotQ3Jvc3MgKGkuZS4sIGJ1aWxkIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgYSBjcm9zcyBjb21waWxlcikuICBJbiB0aGlzCi1jYXNlLCB0aGUgc3lzdGVtIGZvciB3aGljaCB0aGUgcmVzdWx0aW5nIGNyb3NzIGNvbXBpbGVyIGdlbmVyYXRlcyBjb2RlCi1pcyBjYWxsZWQgdGhlIHRhcmdldCBzeXN0ZW0uICAoRm9yIGEgbW9yZSBjb21wbGV0ZSBkaXNjdXNzaW9uIG9mIGhvc3QKLWFuZCB0YXJnZXQgc3lzdGVtcywgQHB4cmVme0hvc3QgYW5kIFRhcmdldH0pLgotCi1BbiBleGFtcGxlIG9mIGJ1aWxkaW5nIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgYSBDYW5hZGlhbiBDcm9zcyB3b3VsZCBiZQotYnVpbGRpbmcgYSBXaW5kb3dzIGNyb3NzIE1JUFMgRUxGIGNvbXBpbGVyIG9uIGEgR05VL0xpbnV4IHN5c3RlbS4gIEluCi10aGlzIGNhc2UgdGhlIGJ1aWxkIHN5c3RlbSB3b3VsZCBiZSBHTlUvTGludXgsIHRoZSBob3N0IHN5c3RlbSB3b3VsZCBiZQotV2luZG93cywgYW5kIHRoZSB0YXJnZXQgc3lzdGVtIHdvdWxkIGJlIE1JUFMgRUxGLgotCi1UaGUgbmFtZSBDYW5hZGlhbiBDcm9zcyBjb21lcyBmcm9tIHRoZSBjYXNlIHdoZW4gdGhlIGJ1aWxkLCBob3N0LCBhbmQKLXRhcmdldCBzeXN0ZW1zIGFyZSBhbGwgZGlmZmVyZW50LiAgQXQgdGhlIHRpbWUgdGhhdCB0aGVzZSBpc3N1ZXMgd2VyZQotYWxsIGJlaW5nIGhhc2hlZCBvdXQsIENhbmFkYSBoYWQgdGhyZWUgbmF0aW9uYWwgcG9saXRpY2FsIHBhcnRpZXMuCi0KLUBub2RlIEJ1aWxkIENyb3NzIEhvc3QgVG9vbHMKLUBzZWN0aW9uIEJ1aWxkIENyb3NzIEhvc3QgVG9vbHMKLQotSW4gb3JkZXIgdG8gY29uZmlndXJlIGEgcHJvZ3JhbSBmb3IgYSBDYW5hZGlhbiBDcm9zcyBidWlsZCwgeW91IG11c3QKLWZpcnN0IGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBzZXQgb2YgY3Jvc3MgdG9vbHMgeW91IHdpbGwgdXNlIHRvIGJ1aWxkIHRoZQotcHJvZ3JhbS4KLQotVGhlc2UgdG9vbHMgd2lsbCBiZSBidWlsZCBjcm9zcyBob3N0IHRvb2xzLiAgVGhhdCBpcywgdGhleSB3aWxsIHJ1biBvbgotdGhlIGJ1aWxkIHN5c3RlbSwgYW5kIHdpbGwgcHJvZHVjZSBjb2RlIHRoYXQgcnVucyBvbiB0aGUgaG9zdCBzeXN0ZW0uCi0KLUl0IGlzIGVhc3kgdG8gY29uZnVzZSB0aGUgbWVhbmluZyBvZiBidWlsZCBhbmQgaG9zdCBoZXJlLiAgQWx3YXlzCi1yZW1lbWJlciB0aGF0IHRoZSBidWlsZCBzeXN0ZW0gaXMgd2hlcmUgeW91IGFyZSBkb2luZyB0aGUgYnVpbGQsIGFuZCB0aGUKLWhvc3Qgc3lzdGVtIGlzIHdoZXJlIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSB3aWxsIHJ1bi4gIFRoZXJlZm9yZSwgeW91Ci1uZWVkIGEgYnVpbGQgY3Jvc3MgaG9zdCBjb21waWxlci4KLQotSW4gZ2VuZXJhbCwgeW91IG11c3QgaGF2ZSBhIGNvbXBsZXRlIGNyb3NzIGVudmlyb25tZW50IGluIG9yZGVyIHRvIGRvCi10aGUgYnVpbGQuICBUaGlzIG5vcm1hbGx5IG1lYW5zIGEgY3Jvc3MgY29tcGlsZXIsIGNyb3NzIGFzc2VtYmxlciwgYW5kCi1zbyBmb3J0aCwgYXMgd2VsbCBhcyBsaWJyYXJpZXMgYW5kIGluY2x1ZGUgZmlsZXMgZm9yIHRoZSBob3N0IHN5c3RlbS4KLQotQG5vZGUgQnVpbGQgYW5kIEhvc3QgT3B0aW9ucwotQHNlY3Rpb24gQnVpbGQgYW5kIEhvc3QgT3B0aW9ucwotQGNpbmRleCBjb25maWd1cmluZyBhIGNhbmFkaWFuIGNyb3NzCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzLCBjb25maWd1cmluZwotCi1XaGVuIHlvdSBydW4gQGZpbGV7Y29uZmlndXJlfSwgeW91IG11c3QgdXNlIGJvdGggdGhlIEBzYW1wey0tYnVpbGR9IGFuZAotQHNhbXB7LS1ob3N0fSBvcHRpb25zLgotCi1AY2luZGV4IEBzYW1wey0tYnVpbGR9IG9wdGlvbgotQGNpbmRleCBidWlsZCBvcHRpb24KLUBjaW5kZXggY29uZmlndXJlIGJ1aWxkIHN5c3RlbQotVGhlIEBzYW1wey0tYnVpbGR9IG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZgotdGhlIGJ1aWxkIHN5c3RlbS4gIFRoaXMgY2FuIG5vcm1hbGx5IGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUKLUBmaWxle2NvbmZpZy5ndWVzc30gc2hlbGwgc2NyaXB0LCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byB1c2UKLUBzYW1wey0tYnVpbGQ9YGNvbmZpZy5ndWVzc2B9LgotCi1AY2luZGV4IEBzYW1wey0taG9zdH0gb3B0aW9uCi1AY2luZGV4IGhvc3Qgb3B0aW9uCi1AY2luZGV4IGNvbmZpZ3VyZSBob3N0Ci1UaGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YKLXRoZSBob3N0IHN5c3RlbS4KLQotQXMgd2UgZXhwbGFpbmVkIGVhcmxpZXIsIEBmaWxle2NvbmZpZy5ndWVzc30gaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQKLXZhbHVlIGZvciB0aGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gKEBweHJlZntVc2luZyB0aGUgSG9zdCBUeXBlfSkuICBXZQotY2FuIG5vdyBzZWUgdGhhdCBzaW5jZSBAZmlsZXtjb25maWcuZ3Vlc3N9IHJldHVybnMgdGhlIHR5cGUgb2Ygc3lzdGVtIG9uCi13aGljaCBpdCBpcyBydW4sIGl0IHJlYWxseSBpZGVudGlmaWVzIHRoZSBidWlsZCBzeXN0ZW0uICBTaW5jZSB0aGUgaG9zdAotc3lzdGVtIGlzIG5vcm1hbGx5IHRoZSBzYW1lIGFzIHRoZSBidWlsZCBzeXN0ZW0gKGkuZS4sIHBlb3BsZSBkbyBub3QKLW5vcm1hbGx5IGJ1aWxkIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIpLCBpdCBpcyByZWFzb25hYmxlIHRvIHVzZSB0aGUKLXJlc3VsdCBvZiBAZmlsZXtjb25maWcuZ3Vlc3N9IGFzIHRoZSBkZWZhdWx0IGZvciB0aGUgaG9zdCBzeXN0ZW0gd2hlbgotdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIGlzIG5vdCB1c2VkLgotCi1JdCBtaWdodCBzZWVtIHRoYXQgaWYgdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIHdlcmUgdXNlZCB3aXRob3V0IHRoZQotQHNhbXB7LS1idWlsZH0gb3B0aW9uIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY291bGQgcnVuCi1AZmlsZXtjb25maWcuZ3Vlc3N9IHRvIGRldGVybWluZSB0aGUgYnVpbGQgc3lzdGVtLCBhbmQgcHJlc3VtZSBhCi1DYW5hZGlhbiBDcm9zcyBpZiB0aGUgcmVzdWx0IG9mIEBmaWxle2NvbmZpZy5ndWVzc30gZGlmZmVyZWQgZnJvbSB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uLiAgSG93ZXZlciwgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgc29tZSBjb25maWd1cmUKLXNjcmlwdHMgYXJlIHJvdXRpbmVseSBydW4gdXNpbmcgYW4gZXhwbGljaXQgQHNhbXB7LS1ob3N0fSBvcHRpb24sIHJhdGhlcgotdGhhbiB1c2luZyB0aGUgZGVmYXVsdCBmcm9tIEBmaWxle2NvbmZpZy5ndWVzc30uICBBcyBub3RlZCBlYXJsaWVyLCBpdAotaXMgZGlmZmljdWx0IG9yIGltcG9zc2libGUgdG8gcmVsaWFibHkgY29tcGFyZSBjb25maWd1cmF0aW9uIG5hbWVzCi0oQHB4cmVme1VzaW5nIHRoZSBUYXJnZXQgVHlwZX0pLiAgVGhlcmVmb3JlLCBieSBjb252ZW50aW9uLCBpZiB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uIGlzIHVzZWQsIGJ1dCB0aGUgQHNhbXB7LS1idWlsZH0gb3B0aW9uIGlzIG5vdCB1c2VkLAotdGhlbiB0aGUgYnVpbGQgc3lzdGVtIGRlZmF1bHRzIHRvIHRoZSBob3N0IHN5c3RlbS4KLQotQG5vZGUgQ0Nyb3NzIG5vdCBpbiBDeWdudXMgVHJlZQotQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3Mgbm90IGluIEN5Z251cyBUcmVlLgotCi1JZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgQ3lnbnVzIHRyZWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUKLWNyb3NzIHRvb2xzIHdoaWNoIHlvdSB3YW50IHRvIHVzZSB0byBidWlsZCB0aGUgcHJvZ3JhbS4gIFRoaXMgaXMgZG9uZSBieQotc2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHJ1bm5pbmcgdGhlIEBmaWxle2NvbmZpZ3VyZX0KLXNjcmlwdC4KLQotWW91IG11c3Qgbm9ybWFsbHkgc2V0IGF0IGxlYXN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQHNhbXB7Q0N9LAotQHNhbXB7QVJ9LCBhbmQgQHNhbXB7UkFOTElCfSB0byB0aGUgY3Jvc3MgdG9vbHMgd2hpY2ggeW91IHdhbnQgdG8gdXNlIHRvCi1idWlsZC4KLQotRm9yIHNvbWUgcHJvZ3JhbXMsIHlvdSBtdXN0IHNldCBhZGRpdGlvbmFsIGNyb3NzIHRvb2xzIGFzIHdlbGwsIHN1Y2ggYXMKLUBzYW1we0FTfSwgQHNhbXB7TER9LCBvciBAc2FtcHtOTX0uCi0KLVlvdSB3b3VsZCBzZXQgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHRoZSBidWlsZCBjcm9zcyB0b29scyB3aGljaAoteW91IGFyZSBnb2luZyB0byB1c2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgU29sYXJpcyBwcm9ncmFtIG9uIGEgR05VL0xpbnV4Ci1zeXN0ZW0sIGFuZCB5b3VyIEdOVS9MaW51eCBjcm9zcyBTb2xhcmlzIGNvbXBpbGVyIHdlcmUgbmFtZWQKLUBzYW1we3NvbGFyaXMtZ2NjfSwgdGhlbiB5b3Ugd291bGQgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotQHNhbXB7Q0N9IHRvIEBzYW1we3NvbGFyaXMtZ2NjfS4KLQotQG5vZGUgQ0Nyb3NzIGluIEN5Z251cyBUcmVlCi1Ac2VjdGlvbiBDYW5hZGlhbiBDcm9zcyBpbiBDeWdudXMgVHJlZQotQGNpbmRleCBjYW5hZGlhbiBjcm9zcyBpbiBjeWdudXMgdHJlZQotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGNvbmZpZ3VyaW5nIGFuZCBidWlsZGluZyBhIENhbmFkaWFuIENyb3NzIHdoZW4KLXVzaW5nIHRoZSBDeWdudXMgdHJlZS4KLQotQG1lbnUKLSogU3RhbmRhcmQgQ3lnbnVzIENDcm9zczo6CUJ1aWxkaW5nIGEgTm9ybWFsIFByb2dyYW0uCi0qIENyb3NzIEN5Z251cyBDQ3Jvc3M6OgkJQnVpbGRpbmcgYSBDcm9zcyBQcm9ncmFtLgotQGVuZCBtZW51Ci0KLUBub2RlIFN0YW5kYXJkIEN5Z251cyBDQ3Jvc3MKLUBzdWJzZWN0aW9uIEJ1aWxkaW5nIGEgTm9ybWFsIFByb2dyYW0KLQotV2hlbiBjb25maWd1cmluZyBhIENhbmFkaWFuIENyb3NzIGluIHRoZSBDeWdudXMgdHJlZSwgYWxsIHRoZQotYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IHNldCB0bwotQHNhbXB7QHZhcntob3N0fS1AdmFye3Rvb2x9fSwgd2hlcmUgQHZhcntob3N0fSBpcyB0aGUgdmFsdWUgdXNlZCBmb3IgdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiwgYW5kIEB2YXJ7dG9vbH0gaXMgdGhlIG5hbWUgb2YgdGhlIHRvb2wgKGUuZy4sCi1Ac2FtcHtnY2N9LCBAc2FtcHthc30sIGV0Yy4pLiAgVGhlc2UgdG9vbHMgbXVzdCBiZSBvbiB5b3VyIEBzYW1we1BBVEh9LgotCi1BZGRpbmcgYSBwcmVmaXggb2YgQHZhcntob3N0fSB3aWxsIGdpdmUgdGhlIHVzdWFsIG5hbWUgZm9yIHRoZSBidWlsZAotY3Jvc3MgaG9zdCB0b29scy4gIFRvIHNlZSB0aGlzLCBjb25zaWRlciB0aGF0IHdoZW4gdGhlc2UgY3Jvc3MgdG9vbHMKLXdlcmUgYnVpbHQsIHRoZXkgd2VyZSBjb25maWd1cmVkIHRvIHJ1biBvbiB0aGUgYnVpbGQgc3lzdGVtIGFuZCB0bwotcHJvZHVjZSBjb2RlIGZvciB0aGUgaG9zdCBzeXN0ZW0uICBUaGF0IGlzLCB0aGV5IHdlcmUgY29uZmlndXJlZCB3aXRoIGEKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gdGhhdCBpcyB0aGUgc2FtZSBhcyB0aGUgc3lzdGVtIHdoaWNoIHdlIGFyZSBub3cKLWNhbGxpbmcgdGhlIGhvc3QuICBSZWNhbGwgdGhhdCB0aGUgZGVmYXVsdCBuYW1lIGZvciBpbnN0YWxsZWQgY3Jvc3MKLXRvb2xzIHVzZXMgdGhlIHRhcmdldCBzeXN0ZW0gYXMgYSBwcmVmaXggKEBweHJlZntVc2luZyB0aGUgVGFyZ2V0Ci1UeXBlfSkuICBTaW5jZSB0aGF0IGlzIHRoZSBzeXN0ZW0gd2hpY2ggd2UgYXJlIG5vdyBjYWxsaW5nIHRoZSBob3N0LAotQHZhcntob3N0fSBpcyB0aGUgcmlnaHQgcHJlZml4IHRvIHVzZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBjb25maWd1cmUgd2l0aCBAc2FtcHstLWJ1aWxkPWkzODYtbGludXgtZ251fSBhbmQKLUBzYW1wey0taG9zdD1zb2xhcmlzfSwgdGhlbiB0aGUgQ3lnbnVzIHRyZWUgd2lsbCBhdXRvbWF0aWNhbGx5IGRlZmF1bHQKLXRvIHVzaW5nIHRoZSBjb21waWxlciBAc2FtcHtzb2xhcmlzLWdjY30uICBZb3UgbXVzdCBoYXZlIHByZXZpb3VzbHkKLWJ1aWx0IGFuZCBpbnN0YWxsZWQgdGhpcyBjb21waWxlciwgcHJvYmFibHkgYnkgZG9pbmcgYSBidWlsZCB3aXRoIG5vCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiBhbmQgd2l0aCBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gb2YKLUBzYW1we3NvbGFyaXN9LgotCi1Abm9kZSBDcm9zcyBDeWdudXMgQ0Nyb3NzCi1Ac3Vic2VjdGlvbiBCdWlsZGluZyBhIENyb3NzIFByb2dyYW0KLQotVGhlcmUgYXJlIGFkZGl0aW9uYWwgY29uc2lkZXJhdGlvbnMgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBjcm9zcwotY29tcGlsZXIsIHJhdGhlciB0aGFuIGEgbmF0aXZlIGNvbXBpbGVyLCBpbiB0aGUgQ3lnbnVzIHRyZWUgdXNpbmcgYQotQ2FuYWRpYW4gQ3Jvc3MuCi0KLVdoZW4geW91IGJ1aWxkIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCB0aGVuIHRoZSB0YXJnZXQKLWxpYnJhcmllcyB3aWxsIG5vcm1hbGx5IGJlIGJ1aWx0IHdpdGggdGhlIG5ld2x5IGJ1aWx0IHRhcmdldCBjb21waWxlcgotKEBweHJlZntIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzfSkuICBIb3dldmVyLCB0aGlzIHdpbGwgbm90IHdvcmsgd2hlbgotYnVpbGRpbmcgd2l0aCBhIENhbmFkaWFuIENyb3NzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBuZXdseSBidWlsdCB0YXJnZXQKLWNvbXBpbGVyIHdpbGwgYmUgYSBwcm9ncmFtIHdoaWNoIHJ1bnMgb24gdGhlIGhvc3Qgc3lzdGVtLCBhbmQgdGhlcmVmb3JlCi13aWxsIG5vdCBiZSBhYmxlIHRvIHJ1biBvbiB0aGUgYnVpbGQgc3lzdGVtLgotCi1UaGVyZWZvcmUsIHdoZW4gYnVpbGRpbmcgYSBjcm9zcyBjb21waWxlciB3aXRoIHRoZSBDeWdudXMgdHJlZSwgeW91IG11c3QKLWZpcnN0IGluc3RhbGwgYSBzZXQgb2YgYnVpbGQgY3Jvc3MgdGFyZ2V0IHRvb2xzLiAgVGhlc2UgdG9vbHMgd2lsbCBiZQotdXNlZCB3aGVuIGJ1aWxkaW5nIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotCi1Ob3RlIHRoYXQgdGhpcyBpcyBub3QgYSByZXF1aXJlbWVudCBvZiBhIENhbmFkaWFuIENyb3NzIGluIGdlbmVyYWwuICBGb3IKLWV4YW1wbGUsIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGJ1aWxkIGp1c3QgdGhlIGhvc3QgY3Jvc3MgdGFyZ2V0IHRvb2xzCi1vbiB0aGUgYnVpbGQgc3lzdGVtLCB0byBjb3B5IHRoZSB0b29scyB0byB0aGUgaG9zdCBzeXN0ZW0sIGFuZCB0byBidWlsZAotdGhlIHRhcmdldCBsaWJyYXJpZXMgb24gdGhlIGhvc3Qgc3lzdGVtLiAgVGhlIHJlcXVpcmVtZW50IGZvciBidWlsZAotY3Jvc3MgdGFyZ2V0IHRvb2xzIGlzIGltcG9zZWQgYnkgdGhlIEN5Z251cyB0cmVlLCB3aGljaCBleHBlY3RzIHRvIGJlCi1hYmxlIHRvIGJ1aWxkIGJvdGggaG9zdCBwcm9ncmFtcyBhbmQgdGFyZ2V0IGxpYnJhcmllcyBpbiBhIHNpbmdsZQotQHNhbXB7Y29uZmlndXJlfS9Ac2FtcHttYWtlfSBzdGVwLiAgQmVjYXVzZSBpdCBidWlsZHMgdGhlc2UgaW4gYSBzaW5nbGUKLXN0ZXAsIGl0IGV4cGVjdHMgdG8gYmUgYWJsZSB0byBidWlsZCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBvbiB0aGUgYnVpbGQKLXN5c3RlbSwgd2hpY2ggbWVhbnMgdGhhdCBpdCBtdXN0IHVzZSBhIGJ1aWxkIGNyb3NzIHRhcmdldCB0b29sY2hhaW4uCi0KLUZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50IHRvIGJ1aWxkIGEgV2luZG93cyBjcm9zcyBNSVBTIEVMRiBjb21waWxlcgotb24gYSBHTlUvTGludXggc3lzdGVtLiAgWW91IG11c3QgaGF2ZSBwcmV2aW91c2x5IGluc3RhbGxlZCBib3RoIGEKLUdOVS9MaW51eCBjcm9zcyBXaW5kb3dzIGNvbXBpbGVyIGFuZCBhIEdOVS9MaW51eCBjcm9zcyBNSVBTIEVMRgotY29tcGlsZXIuCi0KLUluIG9yZGVyIHRvIGJ1aWxkIHRoZSBXaW5kb3dzIChjb25maWd1cmF0aW9uIG5hbWUgQHNhbXB7aTM4Ni1jeWd3aW4zMn0pCi1jcm9zcyBNSVBTIEVMRiAoY29uZmlndXJlIG5hbWUgQHNhbXB7bWlwcy1lbGZ9KSBjb21waWxlciwgeW91IG1pZ2h0Ci1leGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgKGxvbmcgY29tbWFuZCBsaW5lcyBhcmUgYnJva2VuIGFjcm9zcwotbGluZXMgd2l0aCBhIHRyYWlsaW5nIGJhY2tzbGFzaCBhcyBhIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIpLgotCi1AZXhhbXBsZQotbWtkaXIgbGludXgteC1jeWd3aW4zMgotY2QgbGludXgteC1jeWd3aW4zMgotQHZhcntzcmNkaXJ9L2NvbmZpZ3VyZSAtLXRhcmdldCBpMzg2LWN5Z3dpbjMyIC0tcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0gXAotICAtLWV4ZWMtcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0vSC1pMzg2LWxpbnV4Ci1tYWtlCi1tYWtlIGluc3RhbGwKLWNkIC4uCi1ta2RpciBsaW51eC14LW1pcHMtZWxmCi1jZCBsaW51eC14LW1pcHMtZWxmCi1AdmFye3NyY2Rpcn0vY29uZmlndXJlIC0tdGFyZ2V0IG1pcHMtZWxmIC0tcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0gXAotICAtLWV4ZWMtcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0vSC1pMzg2LWxpbnV4Ci1tYWtlCi1tYWtlIGluc3RhbGwKLWNkIC4uCi1ta2RpciBjeWd3aW4zMi14LW1pcHMtZWxmCi1jZCBjeWd3aW4zMi14LW1pcHMtZWxmCi1AdmFye3NyY2Rpcn0vY29uZmlndXJlIC0tYnVpbGQ9aTM4Ni1saW51eC1nbnUgLS1ob3N0PWkzODYtY3lnd2luMzIgXAotICAtLXRhcmdldD1taXBzLWVsZiAtLXByZWZpeD1AdmFye3dpbmluc3RhbGxkaXJ9IFwKLSAgLS1leGVjLXByZWZpeD1AdmFye3dpbmluc3RhbGxkaXJ9L0gtaTM4Ni1jeWd3aW4zMgotbWFrZQotbWFrZSBpbnN0YWxsCi1AZW5kIGV4YW1wbGUKLQotWW91IHdvdWxkIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YgQHZhcnt3aW5pbnN0YWxsZGlyfSBvdmVyIHRvIHRoZQotV2luZG93cyBtYWNoaW5lLCBhbmQgcnVuIHRoZSByZXN1bHRpbmcgcHJvZ3JhbXMuCi0KLUBub2RlIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MKLUBzZWN0aW9uIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MKLQotSWYgeW91IHdhbnQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBidWlsZCBhIHByb2dyYW0geW91IGFyZSBkZXZlbG9waW5nCi11c2luZyBhIENhbmFkaWFuIENyb3NzLCB5b3UgbXVzdCB0YWtlIHNvbWUgY2FyZSB3aGVuIHdyaXRpbmcgeW91cgotY29uZmlndXJlIGFuZCBtYWtlIHJ1bGVzLiAgU2ltcGxlIGNhc2VzIHdpbGwgbm9ybWFsbHkgd29yayBjb3JyZWN0bHkuCi1Ib3dldmVyLCBpdCBpcyBub3QgaGFyZCB0byB3cml0ZSBjb25maWd1cmUgYW5kIG1ha2UgdGVzdHMgd2hpY2ggd2lsbAotZmFpbCBpbiBhIENhbmFkaWFuIENyb3NzLgotCi1AbWVudQotKiBDQ3Jvc3MgaW4gQ29uZmlndXJlOjoJCVN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gQ29uZmlndXJlIFNjcmlwdHMuCi0qIENDcm9zcyBpbiBNYWtlOjoJCVN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gTWFrZWZpbGVzLgotQGVuZCBtZW51Ci0KLUBub2RlIENDcm9zcyBpbiBDb25maWd1cmUKLUBzdWJzZWN0aW9uIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gQ29uZmlndXJlIFNjcmlwdHMKLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MgaW4gY29uZmlndXJlCi0KLUluIGEgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCBhZnRlciBjYWxsaW5nIEBzYW1we0FDX1BST0dfQ0N9LCB5b3UgY2FuCi1maW5kIG91dCB3aGV0aGVyIHRoaXMgaXMgYSBDYW5hZGlhbiBDcm9zcyBjb25maWd1cmUgYnkgZXhhbWluaW5nIHRoZQotc2hlbGwgdmFyaWFibGUgQHNhbXB7Y3Jvc3NfY29tcGlsaW5nfS4gIEluIGEgQ2FuYWRpYW4gQ3Jvc3MsIHdoaWNoIG1lYW5zCi10aGF0IHRoZSBjb21waWxlciBpcyBhIGNyb3NzIGNvbXBpbGVyLCBAc2FtcHtjcm9zc19jb21waWxpbmd9IHdpbGwgYmUKLUBzYW1we3llc30uICBJbiBhIG5vcm1hbCBjb25maWd1cmF0aW9uLCBAc2FtcHtjcm9zc19jb21waWxpbmd9IHdpbGwgYmUKLUBzYW1we25vfS4KLQotWW91IG9yZGluYXJpbHkgZG8gbm90IG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiB0aGUgYnVpbGQgc3lzdGVtIGluIGEKLWNvbmZpZ3VyZSBzY3JpcHQuICBIb3dldmVyLCBpZiB5b3UgZG8gbmVlZCB0aGF0IGluZm9ybWF0aW9uLCB5b3UgY2FuIGdldAotaXQgYnkgdXNpbmcgdGhlIG1hY3JvIEBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19LCB0aGUgc2FtZSBtYWNybyB0aGF0IGlzCi11c2VkIHRvIGRldGVybWluZSB0aGUgdGFyZ2V0IHN5c3RlbS4gIFRoaXMgbWFjcm8gd2lsbCBzZXQgdGhlIHZhcmlhYmxlcwotQHNhbXB7YnVpbGR9LCBAc2FtcHtidWlsZF9hbGlhc30sIEBzYW1we2J1aWxkX2NwdX0sIEBzYW1we2J1aWxkX3ZlbmRvcn0sCi1hbmQgQHNhbXB7YnVpbGRfb3N9LCB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBzaW1pbGFyIEBzYW1we3RhcmdldH0gYW5kCi1Ac2FtcHtob3N0fSB2YXJpYWJsZXMsIGV4Y2VwdCB0aGF0IHRoZXkgZGVzY3JpYmUgdGhlIGJ1aWxkIHN5c3RlbS4KLQotV2hlbiB3cml0aW5nIHRlc3RzIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0sIHlvdSBtdXN0IHJlbWVtYmVyIHRoYXQgeW91Ci13YW50IHRvIHRlc3QgdGhlIGhvc3QgZW52aXJvbm1lbnQsIG5vdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQuCi0KLU1hY3JvcyBsaWtlIEBzYW1we0FDX0NIRUNLX0ZVTkNTfSB3aGljaCB1c2UgdGhlIGNvbXBpbGVyIHdpbGwgdGVzdCB0aGUKLWhvc3QgZW52aXJvbm1lbnQuICBUaGF0IGlzIGJlY2F1c2UgdGhlIHRlc3RzIHdpbGwgYmUgZG9uZSBieSBydW5uaW5nIHRoZQotY29tcGlsZXIsIHdoaWNoIGlzIGFjdHVhbGx5IGEgYnVpbGQgY3Jvc3MgaG9zdCBjb21waWxlci4gIElmIHRoZQotY29tcGlsZXIgY2FuIGZpbmQgdGhlIGZ1bmN0aW9uLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIHByZXNlbnQKLWluIHRoZSBob3N0IGVudmlyb25tZW50LgotCi1UZXN0cyBsaWtlIEBzYW1we3Rlc3QgLWYgL2Rldi9wdHlwMH0sIG9uIHRoZSBvdGhlciBoYW5kLCB3aWxsIHRlc3QgdGhlCi1idWlsZCBlbnZpcm9ubWVudC4gIFJlbWVtYmVyIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgcnVubmluZyBvbiB0aGUKLWJ1aWxkIHN5c3RlbSwgbm90IHRoZSBob3N0IHN5c3RlbS4gIElmIHlvdXIgY29uZmlndXJlIHNjcmlwdHMgZXhhbWluZXMKLWZpbGVzLCB0aG9zZSBmaWxlcyB3aWxsIGJlIG9uIHRoZSBidWlsZCBzeXN0ZW0uICBXaGF0ZXZlciB5b3UgZGV0ZXJtaW5lCi1iYXNlZCBvbiB0aG9zZSBmaWxlcyBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgY2FzZSBvbiB0aGUgaG9zdCBzeXN0ZW0uCi0KLU1vc3QgYXV0b2NvbmYgbWFjcm9zIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIGEgQ2FuYWRpYW4gQ3Jvc3MuICBUaGUgbWFpbgotZXhjZXB0aW9uIGlzIEBzYW1we0FDX1RSWV9SVU59LiAgVGhpcyBtYWNybyB0cmllcyB0byBjb21waWxlIGFuZCBydW4gYQotdGVzdCBwcm9ncmFtLiAgVGhpcyB3aWxsIGZhaWwgaW4gYSBDYW5hZGlhbiBDcm9zcywgYmVjYXVzZSB0aGUgcHJvZ3JhbQotd2lsbCBiZSBjb21waWxlZCBmb3IgdGhlIGhvc3Qgc3lzdGVtLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgbm90IHJ1bgotb24gdGhlIGJ1aWxkIHN5c3RlbS4KLQotVGhlIEBzYW1we0FDX1RSWV9SVU59IG1hY3JvIHByb3ZpZGVzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHRlbGwgdGhlCi1jb25maWd1cmUgc2NyaXB0IHdoYXQgdG8gZG8gaW4gYSBDYW5hZGlhbiBDcm9zcy4gIElmIHRoYXQgYXJndW1lbnQgaXMKLW5vdCBwcmVzZW50LCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIHdoZW4geW91IHJ1biBAc2FtcHthdXRvY29uZn06Ci1Ac21hbGxleGFtcGxlCi13YXJuaW5nOiBBQ19UUllfUlVOIGNhbGxlZCB3aXRob3V0IGRlZmF1bHQgdG8gYWxsb3cgY3Jvc3MgY29tcGlsaW5nCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHRlbGxzIHlvdSB0aGF0IHRoZSByZXN1bHRpbmcgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBub3Qgd29yawotd2l0aCBhIENhbmFkaWFuIENyb3NzLgotCi1JbiBzb21lIGNhc2VzIHdoaWxlIGl0IG1heSBiZXR0ZXIgdG8gcGVyZm9ybSBhIHRlc3QgYXQgY29uZmlndXJlIHRpbWUsCi1pdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIHRlc3QgYXQgcnVuIHRpbWUuICBJbiBzdWNoIGEgY2FzZSB5b3UKLWNhbiB1c2UgdGhlIGNyb3NzIGNvbXBpbGluZyBhcmd1bWVudCB0byBAc2FtcHtBQ19UUllfUlVOfSB0byB0ZWxsIHlvdXIKLXByb2dyYW0gdGhhdCB0aGUgdGVzdCBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGF0IGNvbmZpZ3VyZSB0aW1lLgotCi1UaGVyZSBhcmUgYSBmZXcgb3RoZXIgYXV0b2NvbmYgbWFjcm9zIHdoaWNoIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IHdpdGgKLWEgQ2FuYWRpYW4gQ3Jvc3M6IGEgcGFydGlhbCBsaXN0IGlzIEBzYW1we0FDX0ZVTkNfR0VUUEdSUH0sCi1Ac2FtcHtBQ19GVU5DX1NFVFBHUlB9LCBAc2FtcHtBQ19GVU5DX1NFVFZCVUZfUkVWRVJTRUR9LCBhbmQKLUBzYW1we0FDX1NZU19SRVNUQVJUQUJMRV9TWVNDQUxMU30uICBUaGUgQHNhbXB7QUNfQ0hFQ0tfU0laRU9GfSBtYWNybyBpcwotZ2VuZXJhbGx5IG5vdCB2ZXJ5IHVzZWZ1bCB3aXRoIGEgQ2FuYWRpYW4gQ3Jvc3M7IGl0IHBlcm1pdHMgYW4gb3B0aW9uYWwKLWFyZ3VtZW50IGluZGljYXRpbmcgdGhlIGRlZmF1bHQgc2l6ZSwgYnV0IHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoYXQKLXRoZSBjb3JyZWN0IGRlZmF1bHQgc2hvdWxkIGJlLgotCi1Abm9kZSBDQ3Jvc3MgaW4gTWFrZQotQHN1YnNlY3Rpb24gU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcyBpbiBNYWtlZmlsZXMuCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzIGluIG1ha2VmaWxlCi0KLVRoZSBtYWluIENhbmFkaWFuIENyb3NzIGlzc3VlIGluIGEgQGZpbGV7TWFrZWZpbGV9IGFyaXNlcyB3aGVuIHlvdSB3YW50Ci10byB1c2UgYSBzdWJzaWRpYXJ5IHByb2dyYW0gdG8gZ2VuZXJhdGUgY29kZSBvciBkYXRhIHdoaWNoIHlvdSB3aWxsIHRoZW4KLWluY2x1ZGUgaW4geW91ciByZWFsIHByb2dyYW0uCi0KLUlmIHlvdSBjb21waWxlIHRoaXMgc3Vic2lkaWFyeSBwcm9ncmFtIHVzaW5nIEBzYW1weyQoQ0MpfSBpbiB0aGUgdXN1YWwKLXdheSwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gcnVuIGl0LiAgVGhpcyBpcyBiZWNhdXNlIEBzYW1weyQoQ0MpfSB3aWxsCi1idWlsZCBhIHByb2dyYW0gZm9yIHRoZSBob3N0IHN5c3RlbSwgYnV0IHRoZSBwcm9ncmFtIGlzIGJlaW5nIGJ1aWx0IG9uCi10aGUgYnVpbGQgc3lzdGVtLgotCi1Zb3UgbXVzdCBpbnN0ZWFkIHVzZSBhIGNvbXBpbGVyIGZvciB0aGUgYnVpbGQgc3lzdGVtLCByYXRoZXIgdGhhbiB0aGUKLWhvc3Qgc3lzdGVtLiAgSW4gdGhlIEN5Z251cyB0cmVlLCB0aGlzIG1ha2UgdmFyaWFibGUKLUBzYW1weyQoQ0NfRk9SX0JVSUxEKX0gd2lsbCBob2xkIGEgY29tcGlsZXIgZm9yIHRoZSBidWlsZCBzeXN0ZW0uCi0KLU5vdGUgdGhhdCB5b3Ugc2hvdWxkIG5vdCBpbmNsdWRlIEBmaWxle2NvbmZpZy5ofSBpbiBhIGZpbGUgeW91IGFyZQotY29tcGlsaW5nIHdpdGggQHNhbXB7JChDQ19GT1JfQlVJTEQpfS4gIFRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB3aWxsCi1idWlsZCBAZmlsZXtjb25maWcuaH0gd2l0aCBpbmZvcm1hdGlvbiBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAgSG93ZXZlciwKLXlvdSBhcmUgY29tcGlsaW5nIHRoZSBmaWxlIHVzaW5nIGEgY29tcGlsZXIgZm9yIHRoZSBidWlsZCBzeXN0ZW0gKGEKLW5hdGl2ZSBjb21waWxlcikuICBTdWJzaWRpYXJ5IHByb2dyYW1zIGFyZSBub3JtYWxseSBzaW1wbGUgZmlsdGVycyB3aGljaAotZG8gbm8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGl0IGlzIG5vcm1hbGx5IHBvc3NpYmxlIHRvIHdyaXRlIHRoZW0gaW4gYQotaGlnaGx5IHBvcnRhYmxlIGZhc2hpb24gc28gdGhhdCB0aGUgYWJzZW5jZSBvZiBAZmlsZXtjb25maWcuaH0gaXMgbm90Ci1jcnVjaWFsLgotCi1AY2luZGV4IEBzYW1we0hPU1RfQ0N9Ci1UaGUgZ2NjIEBmaWxle01ha2VmaWxlLmlufSBzaG93cyBhIGNvbXBsZXggc2l0dWF0aW9uIGluIHdoaWNoIGNlcnRhaW4KLWZpbGVzLCBzdWNoIGFzIEBmaWxle3J0bC5jfSwgbXVzdCBiZSBjb21waWxlZCBpbnRvIGJvdGggc3Vic2lkaWFyeQotcHJvZ3JhbXMgcnVuIG9uIHRoZSBidWlsZCBzeXN0ZW0gYW5kIGludG8gdGhlIGZpbmFsIHByb2dyYW0uICBUaGlzCi1hcHByb2FjaCBtYXkgYmUgb2YgaW50ZXJlc3QgZm9yIGFkdmFuY2VkIGJ1aWxkIHN5c3RlbSBoYWNrZXJzLiAgTm90ZQotdGhhdCB0aGUgYnVpbGQgc3lzdGVtIGNvbXBpbGVyIGlzIHJhdGhlciBjb25mdXNpbmdseSBjYWxsZWQKLUBzYW1we0hPU1RfQ0N9LgotCi1Abm9kZSBDeWdudXMgQ29uZmlndXJlCi1AY2hhcHRlciBDeWdudXMgQ29uZmlndXJlCi1AY2luZGV4IGN5Z251cyBjb25maWd1cmUKLQotVGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0IHByZWRhdGVzIGF1dG9jb25mLiAgQWxsIG9mIGl0cyBpbnRlcmVzdGluZwotZmVhdHVyZXMgaGF2ZSBiZWVuIGluY29ycG9yYXRlZCBpbnRvIGF1dG9jb25mLiAgTm8gbmV3IHByb2dyYW1zIHNob3VsZAotYmUgd3JpdHRlbiB0byB1c2UgdGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0LgotCi1Ib3dldmVyLCB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgc3RpbGwgdXNlZCBpbiBhIGZldyBwbGFjZXM6IGF0Ci10aGUgdG9wIG9mIHRoZSBDeWdudXMgdHJlZSBhbmQgaW4gYSBmZXcgdGFyZ2V0IGxpYnJhcmllcyBpbiB0aGUgQ3lnbnVzCi10cmVlLiAgVW50aWwgdGhvc2UgdXNlcyBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBhdXRvY29uZiwgc29tZSBicmllZgotbm90ZXMgYXJlIGFwcHJvcHJpYXRlIGhlcmUuICBUaGlzIGlzIG5vdCBjb21wbGV0ZSBkb2N1bWVudGF0aW9uLCBidXQgaXQKLXNob3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyBhcyBhIGd1aWRlIHdoaWxlIGV4YW1pbmluZyB0aGUgc2NyaXB0cwotdGhlbXNlbHZlcy4KLQotQG1lbnUKLSogQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3M6OgkJQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3MuCi0qIEN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllczo6CUN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDeWdudXMgQ29uZmlndXJlIEJhc2ljcwotQHNlY3Rpb24gQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3MKLQotQ3lnbnVzIGNvbmZpZ3VyZSBkb2VzIG5vdCB1c2UgYW55IGdlbmVyYXRlZCBmaWxlczsgdGhlcmUgaXMgbm8gcHJvZ3JhbQotY29ycmVzcG9uZGluZyB0byBAc2FtcHthdXRvY29uZn0uICBJbnN0ZWFkLCB0aGVyZSBpcyBhIHNpbmdsZSBzaGVsbAotc2NyaXB0IG5hbWVkIEBzYW1we2NvbmZpZ3VyZX0gd2hpY2ggbWF5IGJlIGZvdW5kIGF0IHRoZSB0b3Agb2YgdGhlCi1DeWdudXMgdHJlZS4gIFRoaXMgc2hlbGwgc2NyaXB0IHdhcyB3cml0dGVuIGJ5IGhhbmQ7IGl0IHdhcyBub3QKLWdlbmVyYXRlZCBieSBhdXRvY29uZiwgYW5kIGl0IGlzIGluY29ycmVjdCwgYW5kIGluZGVlZCBoYXJtZnVsLCB0byBydW4KLUBzYW1we2F1dG9jb25mfSBpbiB0aGUgdG9wIGxldmVsIG9mIGEgQ3lnbnVzIHRyZWUuCi0KLUN5Z251cyBjb25maWd1cmUgd29ya3MgaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBieSBleGFtaW5pbmcgdGhlIGZpbGUKLUBmaWxle2NvbmZpZ3VyZS5pbn0gaW4gdGhhdCBkaXJlY3RvcnkuICBUaGF0IGZpbGUgaXMgYnJva2VuIGludG8gZm91cgotc2VwYXJhdGUgc2hlbGwgc2NyaXB0cy4KLQotVGhlIGZpcnN0IGlzIHRoZSBjb250ZW50cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IHVwIHRvIGEgbGluZSB0aGF0Ci1zdGFydHMgd2l0aCBAc2FtcHsjIHBlci1ob3N0On0uICBUaGlzIGlzIHRoZSBjb21tb24gcGFydC4KLQotVGhlIHNlY29uZCBpcyB0aGUgcmVzdCBvZiBAZmlsZXtjb25maWd1cmUuaW59IHVwIHRvIGEgbGluZSB0aGF0IHN0YXJ0cwotd2l0aCBAc2FtcHsjIHBlci10YXJnZXQ6fS4gIFRoaXMgaXMgdGhlIHBlciBob3N0IHBhcnQuCi0KLVRoZSB0aGlyZCBpcyB0aGUgcmVzdCBvZiBAZmlsZXtjb25maWd1cmUuaW59IHVwIHRvIGEgbGluZSB0aGF0IHN0YXJ0cwotd2l0aCBAc2FtcHsjIHBvc3QtdGFyZ2V0On0uICBUaGlzIGlzIHRoZSBwZXIgdGFyZ2V0IHBhcnQuCi0KLVRoZSBmb3VydGggaXMgdGhlIHJlbWFpbmRlciBvZiBAZmlsZXtjb25maWd1cmUuaW59LiAgVGhpcyBpcyB0aGUgcG9zdAotdGFyZ2V0IHBhcnQuCi0KLUlmIGFueSBvZiB0aGVzZSBjb21tZW50IGxpbmVzIGFyZSBtaXNzaW5nLCB0aGUgY29ycmVzcG9uZGluZyBzaGVsbAotc2NyaXB0IGlzIGVtcHR5LgotCi1DeWdudXMgY29uZmlndXJlIHdpbGwgZmlyc3QgZXhlY3V0ZSB0aGUgY29tbW9uIHBhcnQuICBUaGlzIG11c3Qgc2V0IHRoZQotc2hlbGwgdmFyaWFibGUgQHNhbXB7c3JjdHJpZ2dlcn0gdG8gdGhlIG5hbWUgb2YgYSBzb3VyY2UgZmlsZSwgdG8KLWNvbmZpcm0gdGhhdCBDeWdudXMgY29uZmlndXJlIGlzIGxvb2tpbmcgYXQgdGhlIHJpZ2h0IGRpcmVjdG9yeS4gIFRoaXMKLW1heSBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlcyBAc2FtcHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IGFuZAotQHNhbXB7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfS4KLQotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIG5leHQgc2V0IHRoZSBAc2FtcHtidWlsZH0gYW5kIEBzYW1we2hvc3R9IHNoZWxsCi12YXJpYWJsZXMsIGFuZCBleGVjdXRlIHRoZSBwZXIgaG9zdCBwYXJ0LiAgVGhpcyBtYXkgc2V0IHRoZSBzaGVsbAotdmFyaWFibGUgQHNhbXB7aG9zdF9tYWtlZmlsZV9mcmFnfS4KLQotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIG5leHQgc2V0IHRoZSBAc2FtcHt0YXJnZXR9IHZhcmlhYmxlLCBhbmQgZXhlY3V0ZQotdGhlIHBlciB0YXJnZXQgcGFydC4gIFRoaXMgbWF5IHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBzYW1we3RhcmdldF9tYWtlZmlsZV9mcmFnfS4KLQotQW55IG9mIHRoZXNlIHNjcmlwdHMgbWF5IHNldCB0aGUgQHNhbXB7c3ViZGlyc30gc2hlbGwgdmFyaWFibGUuICBUaGlzCi12YXJpYWJsZSBpcyBhIGxpc3Qgb2Ygc3ViZGlyZWN0b3JpZXMgd2hlcmUgYSBAZmlsZXtNYWtlZmlsZS5pbn0gZmlsZSBtYXkKLWJlIGZvdW5kLiAgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGF1dG9tYXRpY2FsbHkgbG9vayBmb3IgYQotQGZpbGV7TWFrZWZpbGUuaW59IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgVGhlIEBzYW1we3N1YmRpcnN9Ci1zaGVsbCB2YXJpYWJsZSBpcyBub3Qgbm9ybWFsbHkgdXNlZCwgYW5kIEkgYmVsaWV2ZSB0aGF0IHRoZSBvbmx5Ci1kaXJlY3Rvcnkgd2hpY2ggdXNlcyBpdCBhdCBwcmVzZW50IGlzIEBmaWxle25ld2xpYn0uCi0KLUZvciBlYWNoIEBmaWxle01ha2VmaWxlLmlufSwgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlCi1hIEBmaWxle01ha2VmaWxlfSBieSBhZGRpbmcgZGVmaW5pdGlvbnMgZm9yIEBzYW1we21ha2V9IHZhcmlhYmxlcyBzdWNoCi1hcyBAc2FtcHtob3N0fSBhbmQgQHNhbXB7dGFyZ2V0fSwgYW5kIGF1dG9tYXRpY2FsbHkgZWRpdGluZyB0aGUgdmFsdWVzCi1vZiBAc2FtcHttYWtlfSB2YXJpYWJsZXMgc3VjaCBhcyBAc2FtcHtwcmVmaXh9IGlmIHRoZXkgYXJlIHByZXNlbnQuCi0KLUFsc28sIGlmIGFueSBvZiB0aGUgQHNhbXB7bWFrZWZpbGVfZnJhZ30gc2hlbGwgdmFyaWFibGVzIGFyZSBzZXQsIEN5Z251cwotY29uZmlndXJlIHdpbGwgaW50ZXJwcmV0IHRoZW0gYXMgZmlsZSBuYW1lcyByZWxhdGl2ZSB0byBlaXRoZXIgdGhlCi13b3JraW5nIGRpcmVjdG9yeSBvciB0aGUgc291cmNlIGRpcmVjdG9yeSwgYW5kIHdpbGwgcmVhZCB0aGUgY29udGVudHMgb2YKLXRoZSBmaWxlIGludG8gdGhlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0uICBUaGUgZmlsZSBjb250ZW50cyB3aWxsIGJlCi1yZWFkIGluIGFmdGVyIHRoZSBmaXJzdCBsaW5lIGluIEBmaWxle01ha2VmaWxlLmlufSB3aGljaCBzdGFydHMgd2l0aAotQHNhbXB7IyMjI30uCi0KLVRoZXNlIEBmaWxle01ha2VmaWxlfSBmcmFnbWVudHMgYXJlIHVzZWQgdG8gY3VzdG9taXplIGJlaGF2aW91ciBmb3IgYQotcGFydGljdWxhciBob3N0IG9yIHRhcmdldC4gIFRoZXkgc2VydmUgdG8gc2VsZWN0IHBhcnRpY3VsYXIgZmlsZXMgdG8KLWNvbXBpbGUsIGFuZCB0byBkZWZpbmUgcGFydGljdWxhciBwcmVwcm9jZXNzb3IgbWFjcm9zIGJ5IHByb3ZpZGluZwotdmFsdWVzIGZvciBAc2FtcHttYWtlfSB2YXJpYWJsZXMgd2hpY2ggYXJlIHRoZW4gdXNlZCBkdXJpbmcgY29tcGlsYXRpb24uCi1DeWdudXMgY29uZmlndXJlLCB1bmxpa2UgYXV0b2NvbmYsIG5vcm1hbGx5IGRvZXMgbm90IGRvIGZlYXR1cmUgdGVzdHMsCi1hbmQgbm9ybWFsbHkgcmVxdWlyZXMgc3VwcG9ydCB0byBiZSBhZGRlZCBtYW51YWxseSBmb3IgZWFjaCBuZXcgaG9zdC4KLQotVGhlIEBmaWxle01ha2VmaWxlfSBmcmFnbWVudCBzdXBwb3J0IGlzIHNpbWlsYXIgdG8gdGhlIGF1dG9jb25mCi1Ac2FtcHtBQ19TVUJTVF9GSUxFfSBtYWNyby4KLQotQWZ0ZXIgY3JlYXRpbmcgZWFjaCBAZmlsZXtNYWtlZmlsZX0sIHRoZSBwb3N0IHRhcmdldCBzY3JpcHQgd2lsbCBiZSBydW4KLShpLmUuLCBpdCBtYXkgYmUgcnVuIHNldmVyYWwgdGltZXMpLiAgVGhpcyBzY3JpcHQgbWF5IGZ1cnRoZXIgY3VzdG9taXplCi10aGUgQGZpbGV7TWFrZWZpbGV9LiAgV2hlbiBpdCBpcyBydW4sIHRoZSBzaGVsbCB2YXJpYWJsZSBAc2FtcHtNYWtlZmlsZX0KLXdpbGwgaG9sZCB0aGUgbmFtZSBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9LCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlCi1kaXJlY3RvcnkgY29tcG9uZW50LgotCi1MaWtlIGFuIGF1dG9jb25mIGdlbmVyYXRlZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCwgQ3lnbnVzIGNvbmZpZ3VyZQotd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle2NvbmZpZy5zdGF0dXN9IHdoaWNoLCB3aGVuIHJ1biwgd2lsbAotYXV0b21hdGljYWxseSByZWNyZWF0ZSB0aGUgY29uZmlndXJhdGlvbi4gIFRoZSBAZmlsZXtjb25maWcuc3RhdHVzfSBmaWxlCi13aWxsIHNpbXBseSBleGVjdXRlIHRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdCBhZ2FpbiB3aXRoIHRoZQotYXBwcm9wcmlhdGUgYXJndW1lbnRzLgotCi1Bbnkgb2YgdGhlIHBhcnRzIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gbWF5IHNldCB0aGUgc2hlbGwgdmFyaWFibGVzCi1Ac2FtcHtmaWxlc30gYW5kIEBzYW1we2xpbmtzfS4gIEN5Z251cyBjb25maWd1cmUgd2lsbCBzZXQgdXAgc3ltbGlua3MKLWZyb20gdGhlIG5hbWVzIGluIEBzYW1we2xpbmtzfSB0byB0aGUgZmlsZXMgbmFtZWQgaW4gQHNhbXB7ZmlsZXN9LiAgVGhpcwotaXMgc2ltaWxhciB0byB0aGUgYXV0b2NvbmYgQHNhbXB7QUNfTElOS19GSUxFU30gbWFjcm8uCi0KLUZpbmFsbHksIGFueSBvZiB0aGUgcGFydHMgb2YgQGZpbGV7Y29uZmlndXJlLmlufSBtYXkgc2V0IHRoZSBzaGVsbAotdmFyaWFibGUgQHNhbXB7Y29uZmlnZGlyc30gdG8gYSBzZXQgb2Ygc3ViZGlyZWN0b3JpZXMuICBJZiBpdCBpcyBzZXQsCi1DeWdudXMgY29uZmlndXJlIHdpbGwgcmVjdXJzaXZlbHkgcnVuIHRoZSBjb25maWd1cmUgcHJvY2VzcyBpbiBlYWNoCi1zdWJkaXJlY3RvcnkuICBJZiB0aGUgc3ViZGlyZWN0b3J5IHVzZXMgQ3lnbnVzIGNvbmZpZ3VyZSwgaXQgd2lsbAotY29udGFpbiBhIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBidXQgbm8gQGZpbGV7Y29uZmlndXJlfSBmaWxlLCBpbgotd2hpY2ggY2FzZSBDeWdudXMgY29uZmlndXJlIHdpbGwgaW52b2tlIGl0c2VsZiByZWN1cnNpdmVseS4gIElmIHRoZQotc3ViZGlyZWN0b3J5IGhhcyBhIEBmaWxle2NvbmZpZ3VyZX0gZmlsZSwgQ3lnbnVzIGNvbmZpZ3VyZSBhc3N1bWVzIHRoYXQKLWl0IGlzIGFuIGF1dG9jb25mIGdlbmVyYXRlZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCwgYW5kIHNpbXBseSBpbnZva2VzCi1pdCBkaXJlY3RseS4KLQotQG5vZGUgQ3lnbnVzIENvbmZpZ3VyZSBpbiBDKysgTGlicmFyaWVzCi1Ac2VjdGlvbiBDeWdudXMgQ29uZmlndXJlIGluIEMrKyBMaWJyYXJpZXMKLUBjaW5kZXggQGZpbGV7bGlic3RkYysrfSBjb25maWd1cmUKLUBjaW5kZXggQGZpbGV7bGliaW99IGNvbmZpZ3VyZQotQGNpbmRleCBAZmlsZXtsaWJnKyt9IGNvbmZpZ3VyZQotCi1UaGUgQysrIGxpYnJhcnkgY29uZmlndXJlIHN5c3RlbSwgd3JpdHRlbiBieSBQZXIgQm90aG5lciwgZGVzZXJ2ZXMKLXNwZWNpYWwgbWVudGlvbi4gIEl0IHVzZXMgQ3lnbnVzIGNvbmZpZ3VyZSwgYnV0IGl0IGRvZXMgZmVhdHVyZSB0ZXN0aW5nCi1saWtlIHRoYXQgZG9uZSBieSBhdXRvY29uZiBnZW5lcmF0ZWQgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHRzLiAgVGhpcwotYXBwcm9hY2ggaXMgdXNlZCBpbiB0aGUgbGlicmFyaWVzIEBmaWxle2xpYmlvfSwgQGZpbGV7bGlic3RkYysrfSwgYW5kCi1AZmlsZXtsaWJnKyt9LgotCi1Nb3N0IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBvdXQgYnkgdGhlIHNoZWxsCi1zY3JpcHQgQGZpbGV7bGliaW8vY29uZmlnLnNoYXJlZH0uICBFYWNoIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBzZXRzCi1jZXJ0YWluIHNoZWxsIHZhcmlhYmxlcywgYW5kIHRoZW4gaW52b2tlcyBAZmlsZXtjb25maWcuc2hhcmVkfSB0byBjcmVhdGUKLXR3byBwYWNrYWdlIEBmaWxle01ha2VmaWxlfSBmcmFnbWVudHMuICBUaGVzZSBmcmFnbWVudHMgYXJlIHRoZW4KLWluY29ycG9yYXRlZCBpbnRvIHRoZSByZXN1bHRpbmcgQGZpbGV7TWFrZWZpbGV9IGJ5IHRoZSBDeWdudXMgY29uZmlndXJlCi1zY3JpcHQuCi0KLVRoZSBmaWxlIEBmaWxle19HX2NvbmZpZy5ofSBpcyBjcmVhdGVkIGluIHRoZSBAZmlsZXtsaWJpb30gb2JqZWN0Ci1kaXJlY3RvcnkgYnkgcnVubmluZyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2xpYmlvL2dlbi1wYXJhbXN9LiAgVGhpcwotc2hlbGwgc2NyaXB0IHVzZXMgZmVhdHVyZSB0ZXN0cyB0byBkZWZpbmUgbWFjcm9zIGFuZCB0eXBlZGVmcyBpbgotQGZpbGV7X0dfY29uZmlnLmh9LgotCi1Abm9kZSBNdWx0aWxpYnMKLUBjaGFwdGVyIE11bHRpbGlicwotQGNpbmRleCBtdWx0aWxpYnMKLQotRm9yIHNvbWUgdGFyZ2V0cyBnY2MgbWF5IGhhdmUgZGlmZmVyZW50IHByb2Nlc3NvciByZXF1aXJlbWVudHMgZGVwZW5kaW5nCi11cG9uIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgQW4gb2J2aW91cyBleGFtcGxlIGlzIHRoZQotQHNhbXB7LW1zb2Z0LWZsb2F0fSBvcHRpb24gc3VwcG9ydGVkIG9uIHNldmVyYWwgcHJvY2Vzc29ycy4gIFRoaXMgb3B0aW9uCi1tZWFucyB0aGF0IHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYXJlIG5vdCBhdmFpbGFibGUsIHdoaWNoIG1lYW5zCi10aGF0IGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgbXVzdCBiZSBkb25lIGJ5IGNhbGxpbmcgYW4gZW11bGF0aW9uCi1zdWJyb3V0aW5lIHJhdGhlciB0aGFuIGJ5IHVzaW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgotCi1Gb3Igc3VjaCBvcHRpb25zLCBnY2MgaXMgb2Z0ZW4gY29uZmlndXJlZCB0byBjb21waWxlIHRhcmdldCBsaWJyYXJpZXMKLXR3aWNlOiBvbmNlIHdpdGggQHNhbXB7LW1zb2Z0LWZsb2F0fSBhbmQgb25jZSB3aXRob3V0LiAgV2hlbiBnY2MKLWNvbXBpbGVzIHRhcmdldCBsaWJyYXJpZXMgbW9yZSB0aGFuIG9uY2UsIHRoZSByZXN1bHRpbmcgbGlicmFyaWVzIGFyZQotY2FsbGVkIEBkZm57bXVsdGlsaWJzfS4KLQotTXVsdGlsaWJzIGFyZSBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSwgYnV0Ci13ZSBkaXNjdXNzIHRoZW0gaGVyZSBzaW5jZSB0aGV5IHJlcXVpcmUgc3VwcG9ydCBpbiB0aGUgQGZpbGV7Y29uZmlndXJlfQotc2NyaXB0cyBhbmQgQGZpbGV7TWFrZWZpbGV9cyB1c2VkIGZvciB0YXJnZXQgbGlicmFyaWVzLgotCi1AbWVudQotKiBNdWx0aWxpYnMgaW4gZ2NjOjoJCSAgICAgICAgTXVsdGlsaWJzIGluIGdjYy4KLSogTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXM6OglNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllcy4KLUBlbmQgbWVudQotCi1Abm9kZSBNdWx0aWxpYnMgaW4gZ2NjCi1Ac2VjdGlvbiBNdWx0aWxpYnMgaW4gZ2NjCi0KLUluIGdjYywgbXVsdGlsaWJzIGFyZSBkZWZpbmVkIGJ5IHNldHRpbmcgdGhlIHZhcmlhYmxlCi1Ac2FtcHtNVUxUSUxJQl9PUFRJT05TfSBpbiB0aGUgdGFyZ2V0IEBmaWxle01ha2VmaWxlfSBmcmFnbWVudC4gIFNldmVyYWwKLW90aGVyIEBzYW1we01VTFRJTElCfSB2YXJpYWJsZXMgbWF5IGFsc28gYmUgZGVmaW5lZCB0aGVyZS4gIEB4cmVme1RhcmdldAotRnJhZ21lbnQsICwgVGhlIFRhcmdldCBNYWtlZmlsZSBGcmFnbWVudCwgZ2NjLCBVc2luZyBhbmQgUG9ydGluZyBHTlUKLUNDfS4KLQotSWYgeW91IGhhdmUgYnVpbHQgZ2NjLCB5b3UgY2FuIHNlZSB3aGF0IG11bHRpbGlicyBpdCB1c2VzIGJ5IHJ1bm5pbmcgaXQKLXdpdGggdGhlIEBzYW1wey1wcmludC1tdWx0aS1saWJ9IG9wdGlvbi4gIFRoZSBvdXRwdXQgQHNhbXB7Ljt9IG1lYW5zCi10aGF0IG5vIG11bHRpbGlicyBhcmUgdXNlZC4gIEluIGdlbmVyYWwsIHRoZSBvdXRwdXQgaXMgYSBzZXF1ZW5jZSBvZgotbGluZXMsIG9uZSBwZXIgbXVsdGlsaWIuICBUaGUgZmlyc3QgcGFydCBvZiBlYWNoIGxpbmUsIHVwIHRvIHRoZQotQHNhbXB7O30sIGlzIHRoZSBuYW1lIG9mIHRoZSBtdWx0aWxpYiBkaXJlY3RvcnkuICBUaGUgc2Vjb25kIHBhcnQgaXMgYQotbGlzdCBvZiBjb21waWxlciBvcHRpb25zIHNlcGFyYXRlZCBieSBAc2FtcHtAQH0gY2hhcmFjdGVycy4KLQotTXVsdGlsaWJzIGFyZSBidWlsdCBpbiBhIHRyZWUgb2YgZGlyZWN0b3JpZXMuICBUaGUgdG9wIG9mIHRoZSB0cmVlLAotcmVwcmVzZW50ZWQgYnkgQHNhbXB7Ln0gaW4gdGhlIGxpc3Qgb2YgbXVsdGlsaWIgZGlyZWN0b3JpZXMsIGlzIHRoZQotZGVmYXVsdCBsaWJyYXJ5IHRvIHVzZSB3aGVuIG5vIHNwZWNpYWwgY29tcGlsZXIgb3B0aW9ucyBhcmUgdXNlZC4gIFRoZQotc3ViZGlyZWN0b3JpZXMgb2YgdGhlIHRyZWUgaG9sZCB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSB0byB1c2Ugd2hlbgotcGFydGljdWxhciBjb21waWxlciBvcHRpb25zIGFyZSB1c2VkLgotCi1Abm9kZSBNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllcwotQHNlY3Rpb24gTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXMKLQotVGhlIHRhcmdldCBsaWJyYXJpZXMgaW4gdGhlIEN5Z251cyB0cmVlIGFyZSBhdXRvbWF0aWNhbGx5IGJ1aWx0IHdpdGgKLW11bHRpbGlicy4gIFRoYXQgbWVhbnMgdGhhdCBlYWNoIGxpYnJhcnkgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMuCi0KLVRoaXMgZGVmYXVsdCBpcyBzZXQgaW4gdGhlIHRvcCBsZXZlbCBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUsIGJ5IGFkZGluZwotQHNhbXB7LS1lbmFibGUtbXVsdGlsaWJ9IHRvIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gY29uZmlndXJlCi13aGVuIGl0IGlzIHJ1biBmb3IgdGhlIHRhcmdldCBsaWJyYXJpZXMgKEBweHJlZntIb3N0IGFuZCBUYXJnZXQKLUxpYnJhcmllc30pLgotCi1FYWNoIHRhcmdldCBsaWJyYXJ5IHVzZXMgdGhlIHNoZWxsIHNjcmlwdCBAZmlsZXtjb25maWctbWwuaW59LCB3cml0dGVuCi1ieSBEb3VnIEV2YW5zLCB0byBwcmVwYXJlIHRvIGJ1aWxkIHRhcmdldCBsaWJyYXJpZXMuICBUaGlzIHNoZWxsIHNjcmlwdAotaXMgaW52b2tlZCBhZnRlciB0aGUgQGZpbGV7TWFrZWZpbGV9IGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlCi1AZmlsZXtjb25maWd1cmV9IHNjcmlwdC4gIElmIG11bHRpbGlicyBhcmUgbm90IGVuYWJsZWQsIGl0IGRvZXMgbm90aGluZywKLW90aGVyd2lzZSBpdCBtb2RpZmllcyB0aGUgQGZpbGV7TWFrZWZpbGV9IHRvIHN1cHBvcnQgbXVsdGlsaWJzLgotCi1UaGUgQGZpbGV7Y29uZmlnLW1sLmlufSBzY3JpcHQgbWFrZXMgb25lIGNvcHkgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBmb3IKLWVhY2ggbXVsdGlsaWIgaW4gdGhlIGFwcHJvcHJpYXRlIHN1YmRpcmVjdG9yeS4gIFdoZW4gY29uZmlndXJpbmcgaW4gdGhlCi1zb3VyY2UgZGlyZWN0b3J5ICh3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLCBpdCB3aWxsIGJ1aWxkIGEgc3ltbGluawotdHJlZSBvZiB0aGUgc291cmNlcyBpbiBlYWNoIHN1YmRpcmVjdG9yeS4KLQotVGhlIEBmaWxle2NvbmZpZy1tbC5pbn0gc2NyaXB0IHNldHMgc2V2ZXJhbCB2YXJpYWJsZXMgaW4gdGhlIHZhcmlvdXMKLUBmaWxle01ha2VmaWxlfXMuICBUaGUgQGZpbGV7TWFrZWZpbGUuaW59IG11c3QgaGF2ZSBkZWZpbml0aW9ucyBmb3IKLXRoZXNlIHZhcmlhYmxlcyBhbHJlYWR5OyBAZmlsZXtjb25maWctbWwuaW59IHNpbXBseSBjaGFuZ2VzIHRoZSBleGlzdGluZwotdmFsdWVzLiAgVGhlIEBmaWxle01ha2VmaWxlfSBzaG91bGQgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVzZQotdmFyaWFibGVzIHdoaWNoIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGluIHRoZSBzdWJkaXJlY3Rvcmllcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBNVUxUSVNSQ1RPUAotQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldCB0aGlzIHRvIGEgc2VxdWVuY2Ugb2YgQHNhbXB7Li4vfSBzdHJpbmdzLAotd2hlcmUgdGhlIG51bWJlciBvZiBzdHJpbmdzIGlzIHRoZSBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIHRoZQotc291cmNlIHRyZWUuICBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgdGhlIGVtcHR5IHN0cmluZy4KLUBpdGVtIE1VTFRJQlVJTERUT1AKLUBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcyB0byBhIHNlcXVlbmNlIG9mIEBzYW1wey4uL30gc3RyaW5ncywKLXdoZXJlIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpcyBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIHRoZSBvYmplY3QKLWRpcmVjdG9yeS4gIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSB0aGUgZW1wdHkgc3RyaW5nLiAgVGhpcyB3aWxsCi1kaWZmZXIgZnJvbSBAc2FtcHtNVUxUSVNSQ1RPUH0gd2hlbiBjb25maWd1cmluZyBpbiB0aGUgc291cmNlIHRyZWUKLSh3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLgotQGl0ZW0gTVVMVElESVJTCi1JbiB0aGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBvbmx5LCBAZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0IHRoaXMKLXRvIHRoZSBsaXN0IG9mIG11bHRpbGliIHN1YmRpcmVjdG9yaWVzLiAgVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHRoZQotZW1wdHkgc3RyaW5nLgotQGl0ZW0gTVVMVElTVUJESVIKLUBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcyB0byB0aGUgaW5zdGFsbGVkIHN1YmRpcmVjdG9yeSBuYW1lIHRvCi11c2UgZm9yIHRoaXMgc3ViZGlyZWN0b3J5LCB3aXRoIGEgbGVhZGluZyBAc2FtcHsvfS4gIFRoZSBkZWZhdWx0IHZhbHVlCi1zaG9sZCBiZSB0aGUgZW1wdHkgc3RyaW5nLgotQGl0ZW0gTVVMVElETwotQGl0ZW14IE1VTFRJQ0xFQU4KLUluIHRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IG9ubHksIEBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQKLXRoZXNlIHZhcmlhYmxlcyB0byBjb21tYW5kcyB0byB1c2Ugd2hlbiBkb2luZyBhIHJlY3Vyc2l2ZSBtYWtlLiAgVGhlc2UKLXZhcmlhYmxlcyBzaG91bGQgYm90aCBkZWZhdWx0IHRvIHRoZSBzdHJpbmcgQHNhbXB7dHJ1ZX0sIHNvIHRoYXQgYnkKLWRlZmF1bHQgbm90aGluZyBoYXBwZW5zLgotQGVuZCB0YWJsZQotCi1BbGwgcmVmZXJlbmNlcyB0byB0aGUgcGFyZW50IG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHNob3VsZCB1c2UgdGhlCi12YXJpYWJsZSBAc2FtcHtNVUxUSVNSQ1RPUH0uICBJbnN0ZWFkIG9mIHdyaXRpbmcgQHNhbXB7JChzcmNkaXIpLy4ufSwKLXlvdSBtdXN0IHdyaXRlIEBzYW1weyQoc3JjZGlyKS8kKE1VTFRJU1JDVE9QKS4ufS4KLQotU2ltaWxhcmx5LCByZWZlcmVuY2VzIHRvIHRoZSBwYXJlbnQgb2YgdGhlIG9iamVjdCBkaXJlY3Rvcnkgc2hvdWxkIHVzZQotdGhlIHZhcmlhYmxlIEBzYW1we01VTFRJQlVJTERUT1B9LgotCi1JbiB0aGUgaW5zdGFsbGF0aW9uIHRhcmdldCwgdGhlIGxpYnJhcmllcyBzaG91bGQgYmUgaW5zdGFsbGVkIGluIHRoZQotc3ViZGlyZWN0b3J5IEBzYW1we01VTFRJU1VCRElSfS4gIEluc3RlYWQgb2YgaW5zdGFsbGluZwotQHNhbXB7JChsaWJkaXIpL2xpYmZvby5hfSwgaW5zdGFsbAotQHNhbXB7JChsaWJkaXIpJChNVUxUSVNVQkRJUikvbGliZm9vLmF9LgotCi1UaGUgQGZpbGV7Y29uZmlnLW1sLmlufSBzY3JpcHQgYWxzbyBtb2RpZmllcyB0aGUgdG9wIGxldmVsCi1AZmlsZXtNYWtlZmlsZX0gdG8gYWRkIEBzYW1we211bHRpLWRvfSBhbmQgQHNhbXB7bXVsdGktY2xlYW59IHRhcmdldHMKLXdoaWNoIGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgbXVsdGlsaWJzLgotCi1UaGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBzaG91bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nCi1jb21tYW5kOgotQHNtYWxsZXhhbXBsZQotQEAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgRE89YWxsIG11bHRpLWRvCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIGFzc3VtZXMgdGhhdCBAc2FtcHskKEZMQUdTX1RPX1BBU1MpfSBpcyBkZWZpbmVkIGFzIGEgc2V0IG9mCi12YXJpYWJsZXMgdG8gcGFzcyB0byBhIHJlY3Vyc2l2ZSBpbnZvY2F0aW9uIG9mIEBzYW1we21ha2V9LiAgVGhpcyB3aWxsCi1idWlsZCBhbGwgdGhlIG11bHRpbGlicy4gIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAc2FtcHtNVUxUSURPfQotaXMgQHNhbXB7dHJ1ZX0sIHNvIGJ5IGRlZmF1bHQgdGhpcyBjb21tYW5kIHdpbGwgZG8gbm90aGluZy4gIEl0IHdpbGwKLW9ubHkgZG8gc29tZXRoaW5nIGluIHRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IGlmIG11bHRpbGlicyB3ZXJlCi1lbmFibGVkLgotCi1UaGUgQHNhbXB7aW5zdGFsbH0gdGFyZ2V0IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gc2hvdWxkIGluY2x1ZGUgdGhlCi1mb2xsb3dpbmcgY29tbWFuZDoKLUBzbWFsbGV4YW1wbGUKLUBAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIERPPWluc3RhbGwgbXVsdGktZG8KLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIGdlbmVyYWwsIGFueSBvcGVyYXRpb24sIG90aGVyIHRoYW4gY2xlYW4sIHdoaWNoIHNob3VsZCBiZSBwZXJmb3JtZWQKLW9uIGFsbCB0aGUgbXVsdGlsaWJzIHNob3VsZCB1c2UgYSBAc2FtcHskKE1VTFRJRE8pfSBsaW5lLCBzZXR0aW5nIHRoZQotdmFyaWFibGUgQHNhbXB7RE99IHRvIHRoZSB0YXJnZXQgb2YgZWFjaCByZWN1cnNpdmUgY2FsbCB0byBAc2FtcHttYWtlfS4KLQotVGhlIEBzYW1we2NsZWFufSB0YXJnZXRzIChAc2FtcHtjbGVhbn0sIEBzYW1we21vc3RseWNsZWFufSwgZXRjLikgc2hvdWxkCi11c2UgQHNhbXB7JChNVUxUSUNMRUFOKX0uICBGb3IgZXhhbXBsZSwgdGhlIEBzYW1we2NsZWFufSB0YXJnZXQgc2hvdWxkCi1kbyB0aGlzOgotQHNtYWxsZXhhbXBsZQotQEAkKE1VTFRJQ0xFQU4pIERPPWNsZWFuIG11bHRpLWNsZWFuCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBGQVEKLUBjaGFwdGVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCi0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gV2hpY2ggZG8gSSBydW4gZmlyc3QsIEBzYW1we2F1dG9jb25mfSBvciBAc2FtcHthdXRvbWFrZX0/Ci1FeGNlcHQgd2hlbiB5b3UgZmlyc3QgYWRkIGF1dG9jb25mIG9yIGF1dG9tYWtlIHN1cHBvcnQgdG8gYSBwYWNrYWdlLCB5b3UKLXNob3VsZG4ndCBydW4gZWl0aGVyIGJ5IGhhbmQuICBJbnN0ZWFkLCBjb25maWd1cmUgd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLCBhbmQgbGV0IEBzYW1we21ha2V9IHRha2UgY2FyZSBvZgotaXQuCi0KLUBjaW5kZXggdW5kZWZpbmVkIG1hY3JvcwotQGl0ZW0gQHNhbXB7YXV0b2NvbmZ9IHNheXMgc29tZXRoaW5nIGFib3V0IHVuZGVmaW5lZCBtYWNyb3MuCi1UaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgbWFjcm9zIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSB3aGljaCBhcmUKLW5vdCBkZWZpbmVkIGJ5IEBzYW1we2F1dG9jb25mfS4gIFlvdSBtYXkgYmUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YKLUBzYW1we2F1dG9jb25mfTsgdHJ5IGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIGEgbmV3ZXIgb25lLiAgTWFrZSBzdXJlIHRoZQotbmV3bHkgaW5zdGFsbGxlZCBAc2FtcHthdXRvY29uZn0gaXMgZmlyc3Qgb24geW91ciBAc2FtcHtQQVRIfS4gIEFsc28sCi1zZWUgdGhlIG5leHQgcXVlc3Rpb24uCi0KLUBjaW5kZXggQHNhbXB7Q1lfR05VX0dFVFRFWFR9IGluIEBmaWxle2NvbmZpZ3VyZX0KLUBjaW5kZXggQHNhbXB7QU1fUFJPR19MSUJUT09MfSBpbiBAZmlsZXtjb25maWd1cmV9Ci1AaXRlbSBNeSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCBoYXMgc3R1ZmYgbGlrZSBAc2FtcHtDWV9HTlVfR0VUVEVYVH0gaW4gaXQuCi1UaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgbWFjcm9zIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSB3aGljaCBzaG91bGQKLWJlIGRlZmluZWQgaW4geW91ciBAZmlsZXthY2xvY2FsLm00fSBmaWxlLCBidXQgYXJlbid0LiAgVGhpcyB1c3VhbGx5Ci1tZWFucyB0aGF0IEBzYW1we2FjbG9jYWx9IHdhcyBub3QgYWJsZSB0byBhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyBvZiB0aGUKLW1hY3Jvcy4gIE1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZCBhbGwgdGhlIHBhY2thZ2VzIHlvdSBuZWVkLgotSW4gcGFydGljdWxhciwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkIGxpYnRvb2wgKHRoaXMgaXMgd2hlcmUKLUBzYW1we0FNX1BST0dfTElCVE9PTH0gaXMgZGVmaW5lZCkgYW5kIGdldHRleHQgKHRoaXMgaXMgd2hlcmUKLUBzYW1we0NZX0dOVV9HRVRURVhUfSBpcyBkZWZpbmVkLCBhdCBsZWFzdCBpbiB0aGUgQ3lnbnVzIHZlcnNpb24gb2YKLWdldHRleHQpLgotCi1AY2luZGV4IEBmaWxle01ha2VmaWxlfSwgZ2FyYmFnZSBjaGFyYWN0ZXJzCi1AaXRlbSBNeSBAZmlsZXtNYWtlZmlsZX0gaGFzIEBzYW1we0BAfSBjaGFyYWN0ZXJzIGluIGl0LgotVGhpcyBtYXkgbWVhbiB0aGF0IHlvdSB0cmllZCB0byB1c2UgYW4gYXV0b2NvbmYgc3Vic3RpdHV0aW9uIGluIHlvdXIKLUBmaWxle01ha2VmaWxlLmlufSB3aXRob3V0IGFkZGluZyB0aGUgYXBwcm9wcmlhdGUgQHNhbXB7QUNfU1VCU1R9IGNhbGwKLXRvIHlvdXIgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQuICBPciBpdCBtYXkganVzdCBtZWFuIHRoYXQgeW91IG5lZWQgdG8KLXJlYnVpbGQgQGZpbGV7TWFrZWZpbGV9IGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LiAgVG8gcmVidWlsZAotQGZpbGV7TWFrZWZpbGV9IGZyb20gQGZpbGV7TWFrZWZpbGUuaW59LCBydW4gdGhlIHNoZWxsIHNjcmlwdAotQGZpbGV7Y29uZmlnLnN0YXR1c30gd2l0aCBubyBhcmd1bWVudHMuICBJZiB5b3UgbmVlZCB0byBmb3JjZQotQGZpbGV7Y29uZmlndXJlfSB0byBydW4gYWdhaW4sIGZpcnN0IHJ1biBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30uCi1UaGVzZSBydW5zIGFyZSBub3JtYWxseSBkb25lIGF1dG9tYXRpY2FsbHkgYnkgQGZpbGV7TWFrZWZpbGV9IHRhcmdldHMsCi1idXQgaWYgeW91ciBAZmlsZXtNYWtlZmlsZX0gaGFzIGdvdHRlbiBtZXNzZWQgdXAgeW91J2xsIG5lZWQgdG8gaGVscAotdGhlbSBhbG9uZy4KLQotQGNpbmRleCBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30KLUBpdGVtIFdoeSBkbyBJIGhhdmUgdG8gcnVuIGJvdGggQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9IGFuZCBAc2FtcHtjb25maWcuc3RhdHVzfT8KLU5vcm1hbGx5LCB5b3UgZG9uJ3Q7IHRoZXkgd2lsbCBiZSBydW4gYXV0b21hdGljYWxseSBieSBAZmlsZXtNYWtlZmlsZX0KLXRhcmdldHMuICBJZiB5b3UgZG8gbmVlZCB0byBydW4gdGhlbSwgdXNlIEBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfQotdG8gcnVuIHRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCBhZ2FpbiB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUKLWZpcnN0IHRpbWUgeW91IHJhbiBpdC4gIFVzZSBAc2FtcHtjb25maWcuc3RhdHVzfSAod2l0aCBubyBhcmd1bWVudHMpIHRvCi1yZWdlbmVyYXRlIGFsbCBmaWxlcyAoQGZpbGV7TWFrZWZpbGV9LCBAZmlsZXtjb25maWcuaH0sIGV0Yy4pIGJhc2VkIG9uCi10aGUgcmVzdWx0cyBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4gIFRoZSB0d28gY2FzZXMgYXJlIHNlcGFyYXRlIGJlY2F1c2UKLWl0IGlzbid0IGFsd2F5cyBuZWNlc3NhcnkgdG8gcmVnZW5lcmF0ZSBhbGwgdGhlIGZpbGVzIGFmdGVyIHJ1bm5pbmcKLUBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfS4gIFRoZSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0cyBnZW5lcmF0ZWQKLWJ5IGF1dG9tYWtlIHdpbGwgdXNlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQHNhbXB7Q09ORklHX0ZJTEVTfSBhbmQKLUBzYW1we0NPTkZJR19IRUFERVJTfSB0byBvbmx5IHJlZ2VuZXJhdGUgZmlsZXMgYXMgdGhleSBhcmUgbmVlZGVkLgotCi1AaXRlbSBXaGF0IGlzIHRoZSBDeWdudXMgdHJlZT8KLVRoZSBDeWdudXMgdHJlZSBpcyB1c2VkIGZvciB2YXJpb3VzIHBhY2thZ2VzIGluY2x1ZGluZyBnZGIsIHRoZSBHTlUKLWJpbnV0aWxzLCBhbmQgZWdjcy4gIEl0IGlzIGFsc28sIG9mIGNvdXJzZSwgdXNlZCBmb3IgQ3lnbnVzIHJlbGVhc2VzLgotSXQgaXMgdGhlIGJ1aWxkIHN5c3RlbSB3aGljaCB3YXMgZGV2ZWxvcGVkIGF0IEN5Z251cywgdXNpbmcgdGhlIEN5Z251cwotY29uZmlndXJlIHNjcmlwdC4gIEl0IHBlcm1pdHMgYnVpbGRpbmcgbWFueSBkaWZmZXJlbnQgcGFja2FnZXMgd2l0aCBhCi1zaW5nbGUgY29uZmlndXJlIGFuZCBtYWtlLiAgVGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGluIHRoZSB0cmVlIGFyZSBiZWluZwotY29udmVydGVkIHRvIGF1dG9jb25mLCBidXQgdGhlIGdlbmVyYWwgYnVpbGQgc3RydWN0dXJlIHJlbWFpbnMgaW50YWN0LgotCi1AaXRlbSBXaHkgZG8gSSBoYXZlIHRvIGtlZXAgcmVidWlsZGluZyBhbmQgcmVpbnN0YWxsaW5nIHRoZSB0b29scz8KLUkga25vdywgaXQncyBhIHBhaW4uICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgYnVncyBpbiB0aGUgdG9vbHMKLXRoZW1zZWx2ZXMgd2hpY2ggbmVlZCB0byBiZSBmaXhlZCwgYW5kIGVhY2ggdGltZSB0aGF0IGhhcHBlbnMgZXZlcnlib2R5Ci13aG8gdXNlcyB0aGUgdG9vbHMgbmVlZCB0byByZWluc3RhbGwgbmV3IHZlcnNpb25zIG9mIHRoZW0uICBJIGRvbid0IGtub3cKLWlmIHRoZXJlIGlzIGdvaW5nIHRvIGJlIGEgY2xldmVyIGZpeCB1bnRpbCB0aGUgdG9vbHMgc3RhYmlsaXplLgotCi1AaXRlbSBXaHkgbm90IGp1c3QgaGF2ZSBhIEN5Z251cyB0cmVlIEBzYW1we21ha2V9IHRhcmdldCB0byB1cGRhdGUgdGhlIHRvb2xzPwotVGhlIHRvb2xzIHVuZm9ydHVuYXRlbHkgbmVlZCB0byBiZSBpbnN0YWxsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQuCi1UaGF0IG1lYW5zIHRoYXQgdGhleSBtdXN0IGJlIGJ1aWx0IHVzaW5nIGFuIGFwcHJvcHJpYXRlIHByZWZpeCwgYW5kIGl0Ci1zZWVtcyB1bndpc2UgdG8gYXNzdW1lIHRoYXQgZXZlcnkgY29uZmlndXJhdGlvbiB1c2VzIGFuIGFwcHJvcHJpYXRlCi1wcmVmaXguICBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoZW0gd29yayBpbiBwbGFjZSwgb3IgaXQgbWlnaHQgYmUKLXBvc3NpYmxlIHRvIGluc3RhbGwgdGhlbSBpbiBzb21lIHN1YmRpcmVjdG9yeTsgc28gZmFyIHRoZXNlIGFwcHJvYWNoZXMKLWhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2V0Yy9tYWtlLXN0ZHMudGV4aSBiL2V0Yy9tYWtlLXN0ZHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0OTc2NC4uMDAwMDAwMAotLS0gYS9ldGMvbWFrZS1zdGRzLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotQGNvbW1lbnQgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IGJvdGggc3RhbmRhcmRzLnRleGkgYW5kIG1ha2UudGV4aW5mby4KLUBjb21tZW50IEl0IHdhcyBicm9rZW4gb3V0IG9mIHN0YW5kYXJkcy50ZXhpIG9uIDEvNi85MyBieSByb2xhbmQuCi0KLUBub2RlIE1ha2VmaWxlIENvbnZlbnRpb25zCi1AY2hhcHRlciBNYWtlZmlsZSBDb252ZW50aW9ucwotQGNvbW1lbnQgc3RhbmRhcmRzLnRleGkgZG9lcyBub3QgcHJpbnQgYW4gaW5kZXgsIGJ1dCBtYWtlLnRleGluZm8gZG9lcy4KLUBjaW5kZXggbWFrZWZpbGUsIGNvbnZlbnRpb25zIGZvcgotQGNpbmRleCBjb252ZW50aW9ucyBmb3IgbWFrZWZpbGVzCi1AY2luZGV4IHN0YW5kYXJkcyBmb3IgbWFrZWZpbGVzCi0KLVRoaXMKLUBpZmluZm8KLW5vZGUKLUBlbmQgaWZpbmZvCi1AaWZ0ZXgKLUBpZnNldCBDT0RFU1RECi1zZWN0aW9uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBDT0RFU1RECi1jaGFwdGVyCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZ0ZXgKLWRlc2NyaWJlcyBjb252ZW50aW9ucyBmb3Igd3JpdGluZyB0aGUgTWFrZWZpbGVzIGZvciBHTlUgcHJvZ3JhbXMuCi0KLUBtZW51Ci0qIE1ha2VmaWxlIEJhc2ljczo6CQlHZW5lcmFsIENvbnZlbnRpb25zIGZvciBNYWtlZmlsZXMKLSogVXRpbGl0aWVzIGluIE1ha2VmaWxlczo6CVV0aWxpdGllcyBpbiBNYWtlZmlsZXMKLSogQ29tbWFuZCBWYXJpYWJsZXM6OgkJVmFyaWFibGVzIGZvciBTcGVjaWZ5aW5nIENvbW1hbmRzCi0qIERpcmVjdG9yeSBWYXJpYWJsZXM6OgkJVmFyaWFibGVzIGZvciBJbnN0YWxsYXRpb24gRGlyZWN0b3JpZXMKLSogU3RhbmRhcmQgVGFyZ2V0czo6CQlTdGFuZGFyZCBUYXJnZXRzIGZvciBVc2VycwotKiBJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllczo6ICBUaHJlZSBjYXRlZ29yaWVzIG9mIGNvbW1hbmRzIGluIHRoZSBgaW5zdGFsbCcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlOiBub3JtYWwsIHByZS1pbnN0YWxsIGFuZCBwb3N0LWluc3RhbGwuCi1AZW5kIG1lbnUKLQotQG5vZGUgTWFrZWZpbGUgQmFzaWNzCi1Ac2VjdGlvbiBHZW5lcmFsIENvbnZlbnRpb25zIGZvciBNYWtlZmlsZXMKLQotRXZlcnkgTWFrZWZpbGUgc2hvdWxkIGNvbnRhaW4gdGhpcyBsaW5lOgotCi1AZXhhbXBsZQotU0hFTEwgPSAvYmluL3NoCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci10byBhdm9pZCB0cm91YmxlIG9uIHN5c3RlbXMgd2hlcmUgdGhlIEBjb2Rle1NIRUxMfSB2YXJpYWJsZSBtaWdodCBiZQotaW5oZXJpdGVkIGZyb20gdGhlIGVudmlyb25tZW50LiAgKFRoaXMgaXMgbmV2ZXIgYSBwcm9ibGVtIHdpdGggR05VCi1AY29kZXttYWtlfS4pCi0KLURpZmZlcmVudCBAY29kZXttYWtlfSBwcm9ncmFtcyBoYXZlIGluY29tcGF0aWJsZSBzdWZmaXggbGlzdHMgYW5kCi1pbXBsaWNpdCBydWxlcywgYW5kIHRoaXMgc29tZXRpbWVzIGNyZWF0ZXMgY29uZnVzaW9uIG9yIG1pc2JlaGF2aW9yLiAgU28KLWl0IGlzIGEgZ29vZCBpZGVhIHRvIHNldCB0aGUgc3VmZml4IGxpc3QgZXhwbGljaXRseSB1c2luZyBvbmx5IHRoZQotc3VmZml4ZXMgeW91IG5lZWQgaW4gdGhlIHBhcnRpY3VsYXIgTWFrZWZpbGUsIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBmaXJzdCBsaW5lIGNsZWFycyBvdXQgdGhlIHN1ZmZpeCBsaXN0LCB0aGUgc2Vjb25kIGludHJvZHVjZXMgYWxsCi1zdWZmaXhlcyB3aGljaCBtYXkgYmUgc3ViamVjdCB0byBpbXBsaWNpdCBydWxlcyBpbiB0aGlzIE1ha2VmaWxlLgotCi1Eb24ndCBhc3N1bWUgdGhhdCBAZmlsZXsufSBpcyBpbiB0aGUgcGF0aCBmb3IgY29tbWFuZCBleGVjdXRpb24uICBXaGVuCi15b3UgbmVlZCB0byBydW4gcHJvZ3JhbXMgdGhhdCBhcmUgYSBwYXJ0IG9mIHlvdXIgcGFja2FnZSBkdXJpbmcgdGhlCi1tYWtlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgaXQgdXNlcyBAZmlsZXsuL30gaWYgdGhlIHByb2dyYW0gaXMgYnVpbHQgYXMKLXBhcnQgb2YgdGhlIG1ha2Ugb3IgQGZpbGV7JChzcmNkaXIpL30gaWYgdGhlIGZpbGUgaXMgYW4gdW5jaGFuZ2luZyBwYXJ0Ci1vZiB0aGUgc291cmNlIGNvZGUuICBXaXRob3V0IG9uZSBvZiB0aGVzZSBwcmVmaXhlcywgdGhlIGN1cnJlbnQgc2VhcmNoCi1wYXRoIGlzIHVzZWQuCi0KLVRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIEBmaWxley4vfSAodGhlIEBkZm57YnVpbGQgZGlyZWN0b3J5fSkgYW5kCi1AZmlsZXskKHNyY2RpcikvfSAodGhlIEBkZm57c291cmNlIGRpcmVjdG9yeX0pIGlzIGltcG9ydGFudCBiZWNhdXNlCi11c2VycyBjYW4gYnVpbGQgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnkgdXNpbmcgdGhlIEBzYW1wey0tc3JjZGlyfSBvcHRpb24KLXRvIEBmaWxle2NvbmZpZ3VyZX0uICBBIHJ1bGUgb2YgdGhlIGZvcm06Ci0KLUBzbWFsbGV4YW1wbGUKLWZvby4xIDogZm9vLm1hbiBzZWRzY3JpcHQKLSAgICAgICAgc2VkIC1lIHNlZHNjcmlwdCBmb28ubWFuID4gZm9vLjEKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotd2lsbCBmYWlsIHdoZW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyBub3QgdGhlIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UKLUBmaWxle2Zvby5tYW59IGFuZCBAZmlsZXtzZWRzY3JpcHR9IGFyZSBpbiB0aGUgdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi0KLVdoZW4gdXNpbmcgR05VIEBjb2Rle21ha2V9LCByZWx5aW5nIG9uIEBzYW1we1ZQQVRIfSB0byBmaW5kIHRoZSBzb3VyY2UKLWZpbGUgd2lsbCB3b3JrIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIGEgc2luZ2xlIGRlcGVuZGVuY3kgZmlsZSwKLXNpbmNlIHRoZSBAY29kZXttYWtlfSBhdXRvbWF0aWMgdmFyaWFibGUgQHNhbXB7JDx9IHdpbGwgcmVwcmVzZW50IHRoZQotc291cmNlIGZpbGUgd2hlcmV2ZXIgaXQgaXMuICAoTWFueSB2ZXJzaW9ucyBvZiBAY29kZXttYWtlfSBzZXQgQHNhbXB7JDx9Ci1vbmx5IGluIGltcGxpY2l0IHJ1bGVzLikgIEEgTWFrZWZpbGUgdGFyZ2V0IGxpa2UKLQotQHNtYWxsZXhhbXBsZQotZm9vLm8gOiBiYXIuYwotICAgICAgICAkKENDKSAtSS4gLUkkKHNyY2RpcikgJChDRkxBR1MpIC1jIGJhci5jIC1vIGZvby5vCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLXNob3VsZCBpbnN0ZWFkIGJlIHdyaXR0ZW4gYXMKLQotQHNtYWxsZXhhbXBsZQotZm9vLm8gOiBiYXIuYwotICAgICAgICAkKENDKSAtSS4gLUkkKHNyY2RpcikgJChDRkxBR1MpIC1jICQ8IC1vICRAQAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1pbiBvcmRlciB0byBhbGxvdyBAc2FtcHtWUEFUSH0gdG8gd29yayBjb3JyZWN0bHkuICBXaGVuIHRoZSB0YXJnZXQgaGFzCi1tdWx0aXBsZSBkZXBlbmRlbmNpZXMsIHVzaW5nIGFuIGV4cGxpY2l0IEBzYW1weyQoc3JjZGlyKX0gaXMgdGhlIGVhc2llc3QKLXdheSB0byBtYWtlIHRoZSBydWxlIHdvcmsgd2VsbC4gIEZvciBleGFtcGxlLCB0aGUgdGFyZ2V0IGFib3ZlIGZvcgotQGZpbGV7Zm9vLjF9IGlzIGJlc3Qgd3JpdHRlbiBhczoKLQotQHNtYWxsZXhhbXBsZQotZm9vLjEgOiBmb28ubWFuIHNlZHNjcmlwdAotICAgICAgICBzZWQgLWUgJChzcmNkaXIpL3NlZHNjcmlwdCAkKHNyY2RpcikvZm9vLm1hbiA+ICRAQAotQGVuZCBzbWFsbGV4YW1wbGUKLQotR05VIGRpc3RyaWJ1dGlvbnMgdXN1YWxseSBjb250YWluIHNvbWUgZmlsZXMgd2hpY2ggYXJlIG5vdCBzb3VyY2UKLWZpbGVzLS0tZm9yIGV4YW1wbGUsIEluZm8gZmlsZXMsIGFuZCB0aGUgb3V0cHV0IGZyb20gQXV0b2NvbmYsIEF1dG9tYWtlLAotQmlzb24gb3IgRmxleC4gIFNpbmNlIHRoZXNlIGZpbGVzIG5vcm1hbGx5IGFwcGVhciBpbiB0aGUgc291cmNlCi1kaXJlY3RvcnksIHRoZXkgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIG5vdCBpbiB0aGUKLWJ1aWxkIGRpcmVjdG9yeS4gIFNvIE1ha2VmaWxlIHJ1bGVzIHRvIHVwZGF0ZSB0aGVtIHNob3VsZCBwdXQgdGhlCi11cGRhdGVkIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotCi1Ib3dldmVyLCBpZiBhIGZpbGUgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBkaXN0cmlidXRpb24sIHRoZW4gdGhlCi1NYWtlZmlsZSBzaG91bGQgbm90IHB1dCBpdCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSBidWlsZGluZyBhCi1wcm9ncmFtIGluIG9yZGluYXJ5IGNpcmN1bXN0YW5jZXMgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIHNvdXJjZSBkaXJlY3RvcnkKLWluIGFueSB3YXkuCi0KLVRyeSB0byBtYWtlIHRoZSBidWlsZCBhbmQgaW5zdGFsbGF0aW9uIHRhcmdldHMsIGF0IGxlYXN0IChhbmQgYWxsIHRoZWlyCi1zdWJ0YXJnZXRzKSB3b3JrIGNvcnJlY3RseSB3aXRoIGEgcGFyYWxsZWwgQGNvZGV7bWFrZX0uCi0KLUBub2RlIFV0aWxpdGllcyBpbiBNYWtlZmlsZXMKLUBzZWN0aW9uIFV0aWxpdGllcyBpbiBNYWtlZmlsZXMKLQotV3JpdGUgdGhlIE1ha2VmaWxlIGNvbW1hbmRzIChhbmQgYW55IHNoZWxsIHNjcmlwdHMsIHN1Y2ggYXMKLUBjb2Rle2NvbmZpZ3VyZX0pIHRvIHJ1biBpbiBAY29kZXtzaH0sIG5vdCBpbiBAY29kZXtjc2h9LiAgRG9uJ3QgdXNlIGFueQotc3BlY2lhbCBmZWF0dXJlcyBvZiBAY29kZXtrc2h9IG9yIEBjb2Rle2Jhc2h9LgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgYW5kIHRoZSBNYWtlZmlsZSBydWxlcyBmb3IgYnVpbGRpbmcgYW5kCi1pbnN0YWxsYXRpb24gc2hvdWxkIG5vdCB1c2UgYW55IHV0aWxpdGllcyBkaXJlY3RseSBleGNlcHQgdGhlc2U6Ci0KLUBjIGRkIGZpbmQKLUBjIGd1bnppcCBnemlwIG1kNXN1bQotQGMgbWtmaWZvIG1rbm9kIHRlZSB1bmFtZSAKLQotQGV4YW1wbGUKLWNhdCBjbXAgY3AgZGlmZiBlY2hvIGVncmVwIGV4cHIgZmFsc2UgZ3JlcCBpbnN0YWxsLWluZm8KLWxuIGxzIG1rZGlyIG12IHB3ZCBybSBybWRpciBzZWQgc2xlZXAgc29ydCB0YXIgdGVzdCB0b3VjaCB0cnVlCi1AZW5kIGV4YW1wbGUKLQotVGhlIGNvbXByZXNzaW9uIHByb2dyYW0gQGNvZGV7Z3ppcH0gY2FuIGJlIHVzZWQgaW4gdGhlIEBjb2Rle2Rpc3R9IHJ1bGUuCi0KLVN0aWNrIHRvIHRoZSBnZW5lcmFsbHkgc3VwcG9ydGVkIG9wdGlvbnMgZm9yIHRoZXNlIHByb2dyYW1zLiAgRm9yCi1leGFtcGxlLCBkb24ndCB1c2UgQHNhbXB7bWtkaXIgLXB9LCBjb252ZW5pZW50IGFzIGl0IG1heSBiZSwgYmVjYXVzZQotbW9zdCBzeXN0ZW1zIGRvbid0IHN1cHBvcnQgaXQuCi0KLUl0IGlzIGEgZ29vZCBpZGVhIHRvIGF2b2lkIGNyZWF0aW5nIHN5bWJvbGljIGxpbmtzIGluIG1ha2VmaWxlcywgc2luY2UgYQotZmV3IHN5c3RlbXMgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotCi1UaGUgTWFrZWZpbGUgcnVsZXMgZm9yIGJ1aWxkaW5nIGFuZCBpbnN0YWxsYXRpb24gY2FuIGFsc28gdXNlIGNvbXBpbGVycwotYW5kIHJlbGF0ZWQgcHJvZ3JhbXMsIGJ1dCBzaG91bGQgZG8gc28gdmlhIEBjb2Rle21ha2V9IHZhcmlhYmxlcyBzbyB0aGF0IHRoZQotdXNlciBjYW4gc3Vic3RpdHV0ZSBhbHRlcm5hdGl2ZXMuICBIZXJlIGFyZSBzb21lIG9mIHRoZSBwcm9ncmFtcyB3ZQotbWVhbjoKLQotQGV4YW1wbGUKLWFyIGJpc29uIGNjIGZsZXggaW5zdGFsbCBsZCBsZGNvbmZpZyBsZXgKLW1ha2UgbWFrZWluZm8gcmFubGliIHRleGkyZHZpIHlhY2MKLUBlbmQgZXhhbXBsZQotCi1Vc2UgdGhlIGZvbGxvd2luZyBAY29kZXttYWtlfSB2YXJpYWJsZXMgdG8gcnVuIHRob3NlIHByb2dyYW1zOgotCi1AZXhhbXBsZQotJChBUikgJChCSVNPTikgJChDQykgJChGTEVYKSAkKElOU1RBTEwpICQoTEQpICQoTERDT05GSUcpICQoTEVYKQotJChNQUtFKSAkKE1BS0VJTkZPKSAkKFJBTkxJQikgJChURVhJMkRWSSkgJChZQUNDKQotQGVuZCBleGFtcGxlCi0KLVdoZW4geW91IHVzZSBAY29kZXtyYW5saWJ9IG9yIEBjb2Rle2xkY29uZmlnfSwgeW91IHNob3VsZCBtYWtlIHN1cmUKLW5vdGhpbmcgYmFkIGhhcHBlbnMgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBwcm9ncmFtIGluIHF1ZXN0aW9uLgotQXJyYW5nZSB0byBpZ25vcmUgYW4gZXJyb3IgZnJvbSB0aGF0IGNvbW1hbmQsIGFuZCBwcmludCBhIG1lc3NhZ2UgYmVmb3JlCi10aGUgY29tbWFuZCB0byB0ZWxsIHRoZSB1c2VyIHRoYXQgZmFpbHVyZSBvZiB0aGlzIGNvbW1hbmQgZG9lcyBub3QgbWVhbgotYSBwcm9ibGVtLiAgKFRoZSBBdXRvY29uZiBAc2FtcHtBQ19QUk9HX1JBTkxJQn0gbWFjcm8gY2FuIGhlbHAgd2l0aAotdGhpcy4pCi0KLUlmIHlvdSB1c2Ugc3ltYm9saWMgbGlua3MsIHlvdSBzaG91bGQgaW1wbGVtZW50IGEgZmFsbGJhY2sgZm9yIHN5c3RlbXMKLXRoYXQgZG9uJ3QgaGF2ZSBzeW1ib2xpYyBsaW5rcy4KLQotQWRkaXRpb25hbCB1dGlsaXRpZXMgdGhhdCBjYW4gYmUgdXNlZCB2aWEgTWFrZSB2YXJpYWJsZXMgYXJlOgotCi1AZXhhbXBsZQotY2hncnAgY2htb2QgY2hvd24gbWtub2QKLUBlbmQgZXhhbXBsZQotCi1JdCBpcyBvayB0byB1c2Ugb3RoZXIgdXRpbGl0aWVzIGluIE1ha2VmaWxlIHBvcnRpb25zIChvciBzY3JpcHRzKQotaW50ZW5kZWQgb25seSBmb3IgcGFydGljdWxhciBzeXN0ZW1zIHdoZXJlIHlvdSBrbm93IHRob3NlIHV0aWxpdGllcwotZXhpc3QuCi0KLUBub2RlIENvbW1hbmQgVmFyaWFibGVzCi1Ac2VjdGlvbiBWYXJpYWJsZXMgZm9yIFNwZWNpZnlpbmcgQ29tbWFuZHMKLQotTWFrZWZpbGVzIHNob3VsZCBwcm92aWRlIHZhcmlhYmxlcyBmb3Igb3ZlcnJpZGluZyBjZXJ0YWluIGNvbW1hbmRzLCBvcHRpb25zLAotYW5kIHNvIG9uLgotCi1JbiBwYXJ0aWN1bGFyLCB5b3Ugc2hvdWxkIHJ1biBtb3N0IHV0aWxpdHkgcHJvZ3JhbXMgdmlhIHZhcmlhYmxlcy4KLVRodXMsIGlmIHlvdSB1c2UgQmlzb24sIGhhdmUgYSB2YXJpYWJsZSBuYW1lZCBAY29kZXtCSVNPTn0gd2hvc2UgZGVmYXVsdAotdmFsdWUgaXMgc2V0IHdpdGggQHNhbXB7QklTT04gPSBiaXNvbn0sIGFuZCByZWZlciB0byBpdCB3aXRoCi1AY29kZXskKEJJU09OKX0gd2hlbmV2ZXIgeW91IG5lZWQgdG8gdXNlIEJpc29uLgotCi1GaWxlIG1hbmFnZW1lbnQgdXRpbGl0aWVzIHN1Y2ggYXMgQGNvZGV7bG59LCBAY29kZXtybX0sIEBjb2Rle212fSwgYW5kCi1zbyBvbiwgbmVlZCBub3QgYmUgcmVmZXJyZWQgdG8gdGhyb3VnaCB2YXJpYWJsZXMgaW4gdGhpcyB3YXksIHNpbmNlIHVzZXJzCi1kb24ndCBuZWVkIHRvIHJlcGxhY2UgdGhlbSB3aXRoIG90aGVyIHByb2dyYW1zLgotCi1FYWNoIHByb2dyYW0tbmFtZSB2YXJpYWJsZSBzaG91bGQgY29tZSB3aXRoIGFuIG9wdGlvbnMgdmFyaWFibGUgdGhhdCBpcwotdXNlZCB0byBzdXBwbHkgb3B0aW9ucyB0byB0aGUgcHJvZ3JhbS4gIEFwcGVuZCBAc2FtcHtGTEFHU30gdG8gdGhlCi1wcm9ncmFtLW5hbWUgdmFyaWFibGUgbmFtZSB0byBnZXQgdGhlIG9wdGlvbnMgdmFyaWFibGUgbmFtZS0tLWZvcgotZXhhbXBsZSwgQGNvZGV7QklTT05GTEFHU30uICAoVGhlIG5hbWVzIEBjb2Rle0NGTEFHU30gZm9yIHRoZSBDCi1jb21waWxlciwgQGNvZGV7WUZMQUdTfSBmb3IgeWFjYywgYW5kIEBjb2Rle0xGTEFHU30gZm9yIGxleCwgYXJlCi1leGNlcHRpb25zIHRvIHRoaXMgcnVsZSwgYnV0IHdlIGtlZXAgdGhlbSBiZWNhdXNlIHRoZXkgYXJlIHN0YW5kYXJkLikKLVVzZSBAY29kZXtDUFBGTEFHU30gaW4gYW55IGNvbXBpbGF0aW9uIGNvbW1hbmQgdGhhdCBydW5zIHRoZQotcHJlcHJvY2Vzc29yLCBhbmQgdXNlIEBjb2Rle0xERkxBR1N9IGluIGFueSBjb21waWxhdGlvbiBjb21tYW5kIHRoYXQKLWRvZXMgbGlua2luZyBhcyB3ZWxsIGFzIGluIGFueSBkaXJlY3QgdXNlIG9mIEBjb2Rle2xkfS4KLQotSWYgdGhlcmUgYXJlIEMgY29tcGlsZXIgb3B0aW9ucyB0aGF0IEBlbXBoe211c3R9IGJlIHVzZWQgZm9yIHByb3BlcgotY29tcGlsYXRpb24gb2YgY2VydGFpbiBmaWxlcywgZG8gbm90IGluY2x1ZGUgdGhlbSBpbiBAY29kZXtDRkxBR1N9LgotVXNlcnMgZXhwZWN0IHRvIGJlIGFibGUgdG8gc3BlY2lmeSBAY29kZXtDRkxBR1N9IGZyZWVseSB0aGVtc2VsdmVzLgotSW5zdGVhZCwgYXJyYW5nZSB0byBwYXNzIHRoZSBuZWNlc3Nhcnkgb3B0aW9ucyB0byB0aGUgQyBjb21waWxlcgotaW5kZXBlbmRlbnRseSBvZiBAY29kZXtDRkxBR1N9LCBieSB3cml0aW5nIHRoZW0gZXhwbGljaXRseSBpbiB0aGUKLWNvbXBpbGF0aW9uIGNvbW1hbmRzIG9yIGJ5IGRlZmluaW5nIGFuIGltcGxpY2l0IHJ1bGUsIGxpa2UgdGhpczoKLQotQHNtYWxsZXhhbXBsZQotQ0ZMQUdTID0gLWcKLUFMTF9DRkxBR1MgPSAtSS4gJChDRkxBR1MpCi0uYy5vOgotICAgICAgICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKEFMTF9DRkxBR1MpICQ8Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1EbyBpbmNsdWRlIHRoZSBAc2FtcHstZ30gb3B0aW9uIGluIEBjb2Rle0NGTEFHU30sIGJlY2F1c2UgdGhhdCBpcyBub3QKLUBlbXBoe3JlcXVpcmVkfSBmb3IgcHJvcGVyIGNvbXBpbGF0aW9uLiAgWW91IGNhbiBjb25zaWRlciBpdCBhIGRlZmF1bHQKLXRoYXQgaXMgb25seSByZWNvbW1lbmRlZC4gIElmIHRoZSBwYWNrYWdlIGlzIHNldCB1cCBzbyB0aGF0IGl0IGlzCi1jb21waWxlZCB3aXRoIEdDQyBieSBkZWZhdWx0LCB0aGVuIHlvdSBtaWdodCBhcyB3ZWxsIGluY2x1ZGUgQHNhbXB7LU99Ci1pbiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtDRkxBR1N9IGFzIHdlbGwuCi0KLVB1dCBAY29kZXtDRkxBR1N9IGxhc3QgaW4gdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQsIGFmdGVyIG90aGVyIHZhcmlhYmxlcwotY29udGFpbmluZyBjb21waWxlciBvcHRpb25zLCBzbyB0aGUgdXNlciBjYW4gdXNlIEBjb2Rle0NGTEFHU30gdG8KLW92ZXJyaWRlIHRoZSBvdGhlcnMuCi0KLUBjb2Rle0NGTEFHU30gc2hvdWxkIGJlIHVzZWQgaW4gZXZlcnkgaW52b2NhdGlvbiBvZiB0aGUgQyBjb21waWxlciwKLWJvdGggdGhvc2Ugd2hpY2ggZG8gY29tcGlsYXRpb24gYW5kIHRob3NlIHdoaWNoIGRvIGxpbmtpbmcuCi0KLUV2ZXJ5IE1ha2VmaWxlIHNob3VsZCBkZWZpbmUgdGhlIHZhcmlhYmxlIEBjb2Rle0lOU1RBTEx9LCB3aGljaCBpcyB0aGUKLWJhc2ljIGNvbW1hbmQgZm9yIGluc3RhbGxpbmcgYSBmaWxlIGludG8gdGhlIHN5c3RlbS4KLQotRXZlcnkgTWFrZWZpbGUgc2hvdWxkIGFsc28gZGVmaW5lIHRoZSB2YXJpYWJsZXMgQGNvZGV7SU5TVEFMTF9QUk9HUkFNfQotYW5kIEBjb2Rle0lOU1RBTExfREFUQX0uICAoVGhlIGRlZmF1bHQgZm9yIGVhY2ggb2YgdGhlc2Ugc2hvdWxkIGJlCi1AY29kZXskKElOU1RBTEwpfS4pICBUaGVuIGl0IHNob3VsZCB1c2UgdGhvc2UgdmFyaWFibGVzIGFzIHRoZSBjb21tYW5kcwotZm9yIGFjdHVhbCBpbnN0YWxsYXRpb24sIGZvciBleGVjdXRhYmxlcyBhbmQgbm9uZXhlY3V0YWJsZXMKLXJlc3BlY3RpdmVseS4gIFVzZSB0aGVzZSB2YXJpYWJsZXMgYXMgZm9sbG93czoKLQotQGV4YW1wbGUKLSQoSU5TVEFMTF9QUk9HUkFNKSBmb28gJChiaW5kaXIpL2ZvbwotJChJTlNUQUxMX0RBVEEpIGxpYmZvby5hICQobGliZGlyKS9saWJmb28uYQotQGVuZCBleGFtcGxlCi0KLU9wdGlvbmFsbHksIHlvdSBtYXkgcHJlcGVuZCB0aGUgdmFsdWUgb2YgQGNvZGV7REVTVERJUn0gdG8gdGhlIHRhcmdldAotZmlsZW5hbWUuICBEb2luZyB0aGlzIGFsbG93cyB0aGUgaW5zdGFsbGVyIHRvIGNyZWF0ZSBhIHNuYXBzaG90IG9mIHRoZQotaW5zdGFsbGF0aW9uIHRvIGJlIGNvcGllZCBvbnRvIHRoZSByZWFsIHRhcmdldCBmaWxlc3lzdGVtIGxhdGVyLiAgRG8gbm90Ci1zZXQgdGhlIHZhbHVlIG9mIEBjb2Rle0RFU1RESVJ9IGluIHlvdXIgTWFrZWZpbGUsIGFuZCBkbyBub3QgaW5jbHVkZSBpdAotaW4gYW55IGluc3RhbGxlZCBmaWxlcy4gIFdpdGggc3VwcG9ydCBmb3IgQGNvZGV7REVTVERJUn0sIHRoZSBhYm92ZQotZXhhbXBsZXMgYmVjb21lOgotCi1AZXhhbXBsZQotJChJTlNUQUxMX1BST0dSQU0pIGZvbyAkKERFU1RESVIpJChiaW5kaXIpL2ZvbwotJChJTlNUQUxMX0RBVEEpIGxpYmZvby5hICQoREVTVERJUikkKGxpYmRpcikvbGliZm9vLmEKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUFsd2F5cyB1c2UgYSBmaWxlIG5hbWUsIG5vdCBhIGRpcmVjdG9yeSBuYW1lLCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mCi10aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgVXNlIGEgc2VwYXJhdGUgY29tbWFuZCBmb3IgZWFjaCBmaWxlIHRvIGJlCi1pbnN0YWxsZWQuCi0KLUBub2RlIERpcmVjdG9yeSBWYXJpYWJsZXMKLUBzZWN0aW9uIFZhcmlhYmxlcyBmb3IgSW5zdGFsbGF0aW9uIERpcmVjdG9yaWVzCi0KLUluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBzaG91bGQgYWx3YXlzIGJlIG5hbWVkIGJ5IHZhcmlhYmxlcywgc28gaXQgaXMKLWVhc3kgdG8gaW5zdGFsbCBpbiBhIG5vbnN0YW5kYXJkIHBsYWNlLiAgVGhlIHN0YW5kYXJkIG5hbWVzIGZvciB0aGVzZQotdmFyaWFibGVzIGFyZSBkZXNjcmliZWQgYmVsb3cuICBUaGV5IGFyZSBiYXNlZCBvbiBhIHN0YW5kYXJkIGZpbGVzeXN0ZW0KLWxheW91dDsgdmFyaWFudHMgb2YgaXQgYXJlIHVzZWQgaW4gU1ZSNCwgNC40QlNELCBMaW51eCwgVWx0cml4IHY0LCBhbmQKLW90aGVyIG1vZGVybiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotVGhlc2UgdHdvIHZhcmlhYmxlcyBzZXQgdGhlIHJvb3QgZm9yIHRoZSBpbnN0YWxsYXRpb24uICBBbGwgdGhlIG90aGVyCi1pbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgc2hvdWxkIGJlIHN1YmRpcmVjdG9yaWVzIG9mIG9uZSBvZiB0aGVzZSB0d28sCi1hbmQgbm90aGluZyBzaG91bGQgYmUgZGlyZWN0bHkgaW5zdGFsbGVkIGludG8gdGhlc2UgdHdvIGRpcmVjdG9yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIHByZWZpeAotQSBwcmVmaXggdXNlZCBpbiBjb25zdHJ1Y3RpbmcgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSB2YXJpYWJsZXMgbGlzdGVkCi1iZWxvdy4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIEBjb2Rle3ByZWZpeH0gc2hvdWxkIGJlIEBmaWxley91c3IvbG9jYWx9LgotV2hlbiBidWlsZGluZyB0aGUgY29tcGxldGUgR05VIHN5c3RlbSwgdGhlIHByZWZpeCB3aWxsIGJlIGVtcHR5IGFuZAotQGZpbGV7L3Vzcn0gd2lsbCBiZSBhIHN5bWJvbGljIGxpbmsgdG8gQGZpbGV7L30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBwcmVmaXhAQH0uKQotCi1SdW5uaW5nIEBzYW1we21ha2UgaW5zdGFsbH0gd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBvZiBAY29kZXtwcmVmaXh9Ci1mcm9tIHRoZSBvbmUgdXNlZCB0byBidWlsZCB0aGUgcHJvZ3JhbSBzaG91bGQgQHZhcntub3R9IHJlY29tcGlsZQotdGhlIHByb2dyYW0uCi0KLUBpdGVtIGV4ZWNfcHJlZml4Ci1BIHByZWZpeCB1c2VkIGluIGNvbnN0cnVjdGluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgb2Ygc29tZSBvZiB0aGUKLXZhcmlhYmxlcyBsaXN0ZWQgYmVsb3cuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtleGVjX3ByZWZpeH0gc2hvdWxkCi1iZSBAY29kZXskKHByZWZpeCl9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAZXhlY19wcmVmaXhAQH0uKQotCi1HZW5lcmFsbHksIEBjb2RleyQoZXhlY19wcmVmaXgpfSBpcyB1c2VkIGZvciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KLW1hY2hpbmUtc3BlY2lmaWMgZmlsZXMgKHN1Y2ggYXMgZXhlY3V0YWJsZXMgYW5kIHN1YnJvdXRpbmUgbGlicmFyaWVzKSwKLXdoaWxlIEBjb2RleyQocHJlZml4KX0gaXMgdXNlZCBkaXJlY3RseSBmb3Igb3RoZXIgZGlyZWN0b3JpZXMuCi0KLVJ1bm5pbmcgQHNhbXB7bWFrZSBpbnN0YWxsfSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIG9mIEBjb2Rle2V4ZWNfcHJlZml4fQotZnJvbSB0aGUgb25lIHVzZWQgdG8gYnVpbGQgdGhlIHByb2dyYW0gc2hvdWxkIEB2YXJ7bm90fSByZWNvbXBpbGUgdGhlCi1wcm9ncmFtLgotQGVuZCB0YWJsZQotCi1FeGVjdXRhYmxlIHByb2dyYW1zIGFyZSBpbnN0YWxsZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmluZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbXMgdGhhdCB1c2VycyBjYW4gcnVuLgotVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9iaW59LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQoZXhlY19wcmVmaXgpL2Jpbn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBiaW5kaXJAQH0uKQotCi1AaXRlbSBzYmluZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbXMgdGhhdCBjYW4gYmUgcnVuIGZyb20KLXRoZSBzaGVsbCwgYnV0IGFyZSBvbmx5IGdlbmVyYWxseSB1c2VmdWwgdG8gc3lzdGVtIGFkbWluaXN0cmF0b3JzLiAgVGhpcwotc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvc2Jpbn0sIGJ1dCB3cml0ZSBpdCBhcwotQGZpbGV7JChleGVjX3ByZWZpeCkvc2Jpbn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBzYmluZGlyQEB9LikKLQotQGl0ZW0gbGliZXhlY2RpcgotQGNvbW1lbnQgVGhpcyBwYXJhZ3JhcGggYWRqdXN0ZWQgdG8gYXZvaWQgb3ZlcmZ1bGwgaGJveCAtLXJvbGFuZCA1anVsOTQKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgZXhlY3V0YWJsZSBwcm9ncmFtcyB0byBiZSBydW4gYnkgb3RoZXIKLXByb2dyYW1zIHJhdGhlciB0aGFuIGJ5IHVzZXJzLiAgVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIG5vcm1hbGx5IGJlCi1AZmlsZXsvdXNyL2xvY2FsL2xpYmV4ZWN9LCBidXQgd3JpdGUgaXQgYXMgQGZpbGV7JChleGVjX3ByZWZpeCkvbGliZXhlY30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBsaWJleGVjZGlyQEB9LikKLUBlbmQgdGFibGUKLQotRGF0YSBmaWxlcyB1c2VkIGJ5IHRoZSBwcm9ncmFtIGR1cmluZyBpdHMgZXhlY3V0aW9uIGFyZSBkaXZpZGVkIGludG8KLWNhdGVnb3JpZXMgaW4gdHdvIHdheXMuCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Tb21lIGZpbGVzIGFyZSBub3JtYWxseSBtb2RpZmllZCBieSBwcm9ncmFtczsgb3RoZXJzIGFyZSBuZXZlciBub3JtYWxseQotbW9kaWZpZWQgKHRob3VnaCB1c2VycyBtYXkgZWRpdCBzb21lIG9mIHRoZXNlKS4KLQotQGl0ZW0KLVNvbWUgZmlsZXMgYXJlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBhbmQgY2FuIGJlIHNoYXJlZCBieSBhbGwKLW1hY2hpbmVzIGF0IGEgc2l0ZTsgc29tZSBhcmUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBhbmQgY2FuIGJlIHNoYXJlZAotb25seSBieSBtYWNoaW5lcyBvZiB0aGUgc2FtZSBraW5kIGFuZCBvcGVyYXRpbmcgc3lzdGVtOyBvdGhlcnMgbWF5IG5ldmVyCi1iZSBzaGFyZWQgYmV0d2VlbiB0d28gbWFjaGluZXMuCi1AZW5kIGl0ZW1pemUKLQotVGhpcyBtYWtlcyBmb3Igc2l4IGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzLiAgSG93ZXZlciwgd2Ugd2FudCB0bwotZGlzY291cmFnZSB0aGUgdXNlIG9mIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMsIGFzaWRlIGZyb20gb2JqZWN0Ci1maWxlcyBhbmQgbGlicmFyaWVzLiAgSXQgaXMgbXVjaCBjbGVhbmVyIHRvIG1ha2Ugb3RoZXIgZGF0YSBmaWxlcwotYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50LCBhbmQgaXQgaXMgZ2VuZXJhbGx5IG5vdCBoYXJkLgotCi1UaGVyZWZvcmUsIGhlcmUgYXJlIHRoZSB2YXJpYWJsZXMgTWFrZWZpbGVzIHNob3VsZCB1c2UgdG8gc3BlY2lmeQotZGlyZWN0b3JpZXM6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gZGF0YWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGRhdGEKLWZpbGVzLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9zaGFyZX0sIGJ1dCB3cml0ZSBpdCBhcwotQGZpbGV7JChwcmVmaXgpL3NoYXJlfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGRhdGFkaXJAQH0uKQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgc2VlIEBmaWxleyQoaW5mb2Rpcil9Ci1hbmQgQGZpbGV7JChpbmNsdWRlZGlyKX0gYmVsb3cuCi0KLUBpdGVtIHN5c2NvbmZkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgcmVhZC1vbmx5IGRhdGEgZmlsZXMgdGhhdCBwZXJ0YWluIHRvIGEKLXNpbmdsZSBtYWNoaW5lLS10aGF0IGlzIHRvIHNheSwgZmlsZXMgZm9yIGNvbmZpZ3VyaW5nIGEgaG9zdC4gIE1haWxlcgotYW5kIG5ldHdvcmsgY29uZmlndXJhdGlvbiBmaWxlcywgQGZpbGV7L2V0Yy9wYXNzd2R9LCBhbmQgc28gZm9ydGggYmVsb25nCi1oZXJlLiAgQWxsIHRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgb3JkaW5hcnkgQVNDSUkgdGV4dAotZmlsZXMuICBUaGlzIGRpcmVjdG9yeSBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9ldGN9LCBidXQKLXdyaXRlIGl0IGFzIEBmaWxleyQocHJlZml4KS9ldGN9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAc3lzY29uZmRpckBAfS4pCi0KLURvIG5vdCBpbnN0YWxsIGV4ZWN1dGFibGVzIGhlcmUgaW4gdGhpcyBkaXJlY3RvcnkgKHRoZXkgcHJvYmFibHkgYmVsb25nCi1pbiBAZmlsZXskKGxpYmV4ZWNkaXIpfSBvciBAZmlsZXskKHNiaW5kaXIpfSkuICBBbHNvIGRvIG5vdCBpbnN0YWxsCi1maWxlcyB0aGF0IGFyZSBtb2RpZmllZCBpbiB0aGUgbm9ybWFsIGNvdXJzZSBvZiB0aGVpciB1c2UgKHByb2dyYW1zCi13aG9zZSBwdXJwb3NlIGlzIHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc3lzdGVtIGV4Y2x1ZGVkKS4KLVRob3NlIHByb2JhYmx5IGJlbG9uZyBpbiBAZmlsZXskKGxvY2Fsc3RhdGVkaXIpfS4KLQotQGl0ZW0gc2hhcmVkc3RhdGVkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgZmlsZXMgd2hpY2gKLXRoZSBwcm9ncmFtcyBtb2RpZnkgd2hpbGUgdGhleSBydW4uICBUaGlzIHNob3VsZCBub3JtYWxseSBiZQotQGZpbGV7L3Vzci9sb2NhbC9jb219LCBidXQgd3JpdGUgaXQgYXMgQGZpbGV7JChwcmVmaXgpL2NvbX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBzaGFyZWRzdGF0ZWRpckBAfS4pCi0KLUBpdGVtIGxvY2Fsc3RhdGVkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgZGF0YSBmaWxlcyB3aGljaCB0aGUgcHJvZ3JhbXMgbW9kaWZ5IHdoaWxlCi10aGV5IHJ1biwgYW5kIHRoYXQgcGVydGFpbiB0byBvbmUgc3BlY2lmaWMgbWFjaGluZS4gIFVzZXJzIHNob3VsZCBuZXZlcgotbmVlZCB0byBtb2RpZnkgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlJ3MKLW9wZXJhdGlvbjsgcHV0IHN1Y2ggY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiBzZXBhcmF0ZSBmaWxlcyB0aGF0IGdvCi1pbiBAZmlsZXskKGRhdGFkaXIpfSBvciBAZmlsZXskKHN5c2NvbmZkaXIpfS4gIEBmaWxleyQobG9jYWxzdGF0ZWRpcil9Ci1zaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC92YXJ9LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQocHJlZml4KS92YXJ9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbG9jYWxzdGF0ZWRpckBAfS4pCi0KLUBpdGVtIGxpYmRpcgotVGhlIGRpcmVjdG9yeSBmb3Igb2JqZWN0IGZpbGVzIGFuZCBsaWJyYXJpZXMgb2Ygb2JqZWN0IGNvZGUuICBEbyBub3QKLWluc3RhbGwgZXhlY3V0YWJsZXMgaGVyZSwgdGhleSBwcm9iYWJseSBvdWdodCB0byBnbyBpbiBAZmlsZXskKGxpYmV4ZWNkaXIpfQotaW5zdGVhZC4gIFRoZSB2YWx1ZSBvZiBAY29kZXtsaWJkaXJ9IHNob3VsZCBub3JtYWxseSBiZQotQGZpbGV7L3Vzci9sb2NhbC9saWJ9LCBidXQgd3JpdGUgaXQgYXMgQGZpbGV7JChleGVjX3ByZWZpeCkvbGlifS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGxpYmRpckBAfS4pCi0KLUBpdGVtIGluZm9kaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIEluZm8gZmlsZXMgZm9yIHRoaXMgcGFja2FnZS4gIEJ5Ci1kZWZhdWx0LCBpdCBzaG91bGQgYmUgQGZpbGV7L3Vzci9sb2NhbC9pbmZvfSwgYnV0IGl0IHNob3VsZCBiZSB3cml0dGVuCi1hcyBAZmlsZXskKHByZWZpeCkvaW5mb30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBpbmZvZGlyQEB9LikKLQotQGl0ZW0gbGlzcGRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBhbnkgRW1hY3MgTGlzcCBmaWxlcyBpbiB0aGlzIHBhY2thZ2UuICBCeQotZGVmYXVsdCwgaXQgc2hvdWxkIGJlIEBmaWxley91c3IvbG9jYWwvc2hhcmUvZW1hY3Mvc2l0ZS1saXNwfSwgYnV0IGl0Ci1zaG91bGQgYmUgd3JpdHRlbiBhcyBAZmlsZXskKHByZWZpeCkvc2hhcmUvZW1hY3Mvc2l0ZS1saXNwfS4KLQotSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgdGhlIGRlZmF1bHQgYXMgQHNhbXB7QEBsaXNwZGlyQEB9LgotSW4gb3JkZXIgdG8gbWFrZSBAc2FtcHtAQGxpc3BkaXJAQH0gd29yaywgeW91IG5lZWQgdGhlIGZvbGxvd2luZyBsaW5lcwotaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IGZpbGU6Ci0KLUBleGFtcGxlCi1saXNwZGlyPSckQHtkYXRhZGlyQH0vZW1hY3Mvc2l0ZS1saXNwJwotQUNfU1VCU1QobGlzcGRpcikKLUBlbmQgZXhhbXBsZQotCi1AaXRlbSBpbmNsdWRlZGlyCi1AYyByZXdyaXR0ZW4gdG8gYXZvaWQgb3ZlcmZ1bGwgaGJveCAtLXJvbGFuZAotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBoZWFkZXIgZmlsZXMgdG8gYmUgaW5jbHVkZWQgYnkgdXNlcgotcHJvZ3JhbXMgd2l0aCB0aGUgQyBAc2FtcHsjaW5jbHVkZX0gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZS4gIFRoaXMKLXNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL2luY2x1ZGV9LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQocHJlZml4KS9pbmNsdWRlfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGluY2x1ZGVkaXJAQH0uKQotCi1Nb3N0IGNvbXBpbGVycyBvdGhlciB0aGFuIEdDQyBkbyBub3QgbG9vayBmb3IgaGVhZGVyIGZpbGVzIGluIGRpcmVjdG9yeQotQGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlfS4gIFNvIGluc3RhbGxpbmcgdGhlIGhlYWRlciBmaWxlcyB0aGlzIHdheSBpcwotb25seSB1c2VmdWwgd2l0aCBHQ0MuICBTb21ldGltZXMgdGhpcyBpcyBub3QgYSBwcm9ibGVtIGJlY2F1c2Ugc29tZQotbGlicmFyaWVzIGFyZSBvbmx5IHJlYWxseSBpbnRlbmRlZCB0byB3b3JrIHdpdGggR0NDLiAgQnV0IHNvbWUgbGlicmFyaWVzCi1hcmUgaW50ZW5kZWQgdG8gd29yayB3aXRoIG90aGVyIGNvbXBpbGVycy4gIFRoZXkgc2hvdWxkIGluc3RhbGwgdGhlaXIKLWhlYWRlciBmaWxlcyBpbiB0d28gcGxhY2VzLCBvbmUgc3BlY2lmaWVkIGJ5IEBjb2Rle2luY2x1ZGVkaXJ9IGFuZCBvbmUKLXNwZWNpZmllZCBieSBAY29kZXtvbGRpbmNsdWRlZGlyfS4KLQotQGl0ZW0gb2xkaW5jbHVkZWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBAc2FtcHsjaW5jbHVkZX0gaGVhZGVyIGZpbGVzIGZvciB1c2Ugd2l0aAotY29tcGlsZXJzIG90aGVyIHRoYW4gR0NDLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9pbmNsdWRlfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB5b3UgY2FuIHdyaXRlIGl0IGFzIEBzYW1we0BAb2xkaW5jbHVkZWRpckBAfS4pCi0KLVRoZSBNYWtlZmlsZSBjb21tYW5kcyBzaG91bGQgY2hlY2sgd2hldGhlciB0aGUgdmFsdWUgb2YKLUBjb2Rle29sZGluY2x1ZGVkaXJ9IGlzIGVtcHR5LiAgSWYgaXQgaXMsIHRoZXkgc2hvdWxkIG5vdCB0cnkgdG8gdXNlCi1pdDsgdGhleSBzaG91bGQgY2FuY2VsIHRoZSBzZWNvbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBoZWFkZXIgZmlsZXMuCi0KLUEgcGFja2FnZSBzaG91bGQgbm90IHJlcGxhY2UgYW4gZXhpc3RpbmcgaGVhZGVyIGluIHRoaXMgZGlyZWN0b3J5IHVubGVzcwotdGhlIGhlYWRlciBjYW1lIGZyb20gdGhlIHNhbWUgcGFja2FnZS4gIFRodXMsIGlmIHlvdXIgRm9vIHBhY2thZ2UKLXByb3ZpZGVzIGEgaGVhZGVyIGZpbGUgQGZpbGV7Zm9vLmh9LCB0aGVuIGl0IHNob3VsZCBpbnN0YWxsIHRoZSBoZWFkZXIKLWZpbGUgaW4gdGhlIEBjb2Rle29sZGluY2x1ZGVkaXJ9IGRpcmVjdG9yeSBpZiBlaXRoZXIgKDEpIHRoZXJlIGlzIG5vCi1AZmlsZXtmb28uaH0gdGhlcmUgb3IgKDIpIHRoZSBAZmlsZXtmb28uaH0gdGhhdCBleGlzdHMgY2FtZSBmcm9tIHRoZSBGb28KLXBhY2thZ2UuCi0KLVRvIHRlbGwgd2hldGhlciBAZmlsZXtmb28uaH0gY2FtZSBmcm9tIHRoZSBGb28gcGFja2FnZSwgcHV0IGEgbWFnaWMKLXN0cmluZyBpbiB0aGUgZmlsZS0tLXBhcnQgb2YgYSBjb21tZW50LS0tYW5kIEBjb2Rle2dyZXB9IGZvciB0aGF0IHN0cmluZy4KLUBlbmQgdGFibGUKLQotVW5peC1zdHlsZSBtYW4gcGFnZXMgYXJlIGluc3RhbGxlZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBtYW5kaXIKLVRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBtYW4gcGFnZXMgKGlmIGFueSkgZm9yIHRoaXMKLXBhY2thZ2UuICBJdCB3aWxsIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvbWFufSwgYnV0IHlvdSBzaG91bGQKLXdyaXRlIGl0IGFzIEBmaWxleyQocHJlZml4KS9tYW59LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbWFuZGlyQEB9LikKLQotQGl0ZW0gbWFuMWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBzZWN0aW9uIDEgbWFuIHBhZ2VzLiAgV3JpdGUgaXQgYXMKLUBmaWxleyQobWFuZGlyKS9tYW4xfS4KLUBpdGVtIG1hbjJkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgc2VjdGlvbiAyIG1hbiBwYWdlcy4gIFdyaXRlIGl0IGFzCi1AZmlsZXskKG1hbmRpcikvbWFuMn0KLUBpdGVtIEBkb3Rze30KLQotQHN0cm9uZ3tEb24ndCBtYWtlIHRoZSBwcmltYXJ5IGRvY3VtZW50YXRpb24gZm9yIGFueSBHTlUgc29mdHdhcmUgYmUgYQotbWFuIHBhZ2UuICBXcml0ZSBhIG1hbnVhbCBpbiBUZXhpbmZvIGluc3RlYWQuICBNYW4gcGFnZXMgYXJlIGp1c3QgZm9yCi10aGUgc2FrZSBvZiBwZW9wbGUgcnVubmluZyBHTlUgc29mdHdhcmUgb24gVW5peCwgd2hpY2ggaXMgYSBzZWNvbmRhcnkKLWFwcGxpY2F0aW9uIG9ubHkufQotCi1AaXRlbSBtYW5leHQKLVRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uIGZvciB0aGUgaW5zdGFsbGVkIG1hbiBwYWdlLiAgVGhpcyBzaG91bGQgY29udGFpbgotYSBwZXJpb2QgZm9sbG93ZWQgYnkgdGhlIGFwcHJvcHJpYXRlIGRpZ2l0OyBpdCBzaG91bGQgbm9ybWFsbHkgYmUgQHNhbXB7LjF9LgotCi1AaXRlbSBtYW4xZXh0Ci1UaGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgaW5zdGFsbGVkIHNlY3Rpb24gMSBtYW4gcGFnZXMuCi1AaXRlbSBtYW4yZXh0Ci1UaGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgaW5zdGFsbGVkIHNlY3Rpb24gMiBtYW4gcGFnZXMuCi1AaXRlbSBAZG90c3t9Ci1Vc2UgdGhlc2UgbmFtZXMgaW5zdGVhZCBvZiBAc2FtcHttYW5leHR9IGlmIHRoZSBwYWNrYWdlIG5lZWRzIHRvIGluc3RhbGwgbWFuCi1wYWdlcyBpbiBtb3JlIHRoYW4gb25lIHNlY3Rpb24gb2YgdGhlIG1hbnVhbC4KLUBlbmQgdGFibGUKLQotQW5kIGZpbmFsbHksIHlvdSBzaG91bGQgc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGU6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gc3JjZGlyCi1UaGUgZGlyZWN0b3J5IGZvciB0aGUgc291cmNlcyBiZWluZyBjb21waWxlZC4gIFRoZSB2YWx1ZSBvZiB0aGlzCi12YXJpYWJsZSBpcyBub3JtYWxseSBpbnNlcnRlZCBieSB0aGUgQGNvZGV7Y29uZmlndXJlfSBzaGVsbCBzY3JpcHQuCi0oSWYgeW91IGFyZSB1c2luZyBBdXRjb25mLCB1c2UgQHNhbXB7c3JjZGlyID0gQEBzcmNkaXJAQH0uKQotQGVuZCB0YWJsZQotCi1Gb3IgZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotQGMgSSBoYXZlIGNoYW5nZWQgc29tZSBvZiB0aGUgY29tbWVudHMgaGVyZSBzbGlnaHRseSB0byBmaXggYW4gb3ZlcmZ1bGwKLUBjIGhib3gsIHNvIHRoZSBtYWtlIG1hbnVhbCBjYW4gZm9ybWF0IGNvcnJlY3RseS4gLS1yb2xhbmQKLSMgQ29tbW9uIHByZWZpeCBmb3IgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotIyBOT1RFOiBUaGlzIGRpcmVjdG9yeSBtdXN0IGV4aXN0IHdoZW4geW91IHN0YXJ0IHRoZSBpbnN0YWxsLgotcHJlZml4ID0gL3Vzci9sb2NhbAotZXhlY19wcmVmaXggPSAkKHByZWZpeCkKLSMgV2hlcmUgdG8gcHV0IHRoZSBleGVjdXRhYmxlIGZvciB0aGUgY29tbWFuZCBgZ2NjJy4KLWJpbmRpciA9ICQoZXhlY19wcmVmaXgpL2JpbgotIyBXaGVyZSB0byBwdXQgdGhlIGRpcmVjdG9yaWVzIHVzZWQgYnkgdGhlIGNvbXBpbGVyLgotbGliZXhlY2RpciA9ICQoZXhlY19wcmVmaXgpL2xpYmV4ZWMKLSMgV2hlcmUgdG8gcHV0IHRoZSBJbmZvIGZpbGVzLgotaW5mb2RpciA9ICQocHJlZml4KS9pbmZvCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3VyIHByb2dyYW0gaW5zdGFsbHMgYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgaW50byBvbmUgb2YgdGhlCi1zdGFuZGFyZCB1c2VyLXNwZWNpZmllZCBkaXJlY3RvcmllcywgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIGdyb3VwIHRoZW0KLWludG8gYSBzdWJkaXJlY3RvcnkgcGFydGljdWxhciB0byB0aGF0IHByb2dyYW0uICBJZiB5b3UgZG8gdGhpcywgeW91Ci1zaG91bGQgd3JpdGUgdGhlIEBjb2Rle2luc3RhbGx9IHJ1bGUgdG8gY3JlYXRlIHRoZXNlIHN1YmRpcmVjdG9yaWVzLgotCi1EbyBub3QgZXhwZWN0IHRoZSB1c2VyIHRvIGluY2x1ZGUgdGhlIHN1YmRpcmVjdG9yeSBuYW1lIGluIHRoZSB2YWx1ZSBvZgotYW55IG9mIHRoZSB2YXJpYWJsZXMgbGlzdGVkIGFib3ZlLiAgVGhlIGlkZWEgb2YgaGF2aW5nIGEgdW5pZm9ybSBzZXQgb2YKLXZhcmlhYmxlIG5hbWVzIGZvciBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgaXMgdG8gZW5hYmxlIHRoZSB1c2VyIHRvCi1zcGVjaWZ5IHRoZSBleGFjdCBzYW1lIHZhbHVlcyBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgR05VIHBhY2thZ2VzLiAgSW4KLW9yZGVyIGZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgYWxsIHRoZSBwYWNrYWdlcyBtdXN0IGJlIGRlc2lnbmVkIHNvIHRoYXQKLXRoZXkgd2lsbCB3b3JrIHNlbnNpYmx5IHdoZW4gdGhlIHVzZXIgZG9lcyBzby4KLQotQG5vZGUgU3RhbmRhcmQgVGFyZ2V0cwotQHNlY3Rpb24gU3RhbmRhcmQgVGFyZ2V0cyBmb3IgVXNlcnMKLQotQWxsIEdOVSBwcm9ncmFtcyBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHRhcmdldHMgaW4gdGhlaXIgTWFrZWZpbGVzOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGFsbAotQ29tcGlsZSB0aGUgZW50aXJlIHByb2dyYW0uICBUaGlzIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQuICBUaGlzCi10YXJnZXQgbmVlZCBub3QgcmVidWlsZCBhbnkgZG9jdW1lbnRhdGlvbiBmaWxlczsgSW5mbyBmaWxlcyBzaG91bGQKLW5vcm1hbGx5IGJlIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24sIGFuZCBEVkkgZmlsZXMgc2hvdWxkIGJlIG1hZGUKLW9ubHkgd2hlbiBleHBsaWNpdGx5IGFza2VkIGZvci4KLQotQnkgZGVmYXVsdCwgdGhlIE1ha2UgcnVsZXMgc2hvdWxkIGNvbXBpbGUgYW5kIGxpbmsgd2l0aCBAc2FtcHstZ30sIHNvCi10aGF0IGV4ZWN1dGFibGUgcHJvZ3JhbXMgaGF2ZSBkZWJ1Z2dpbmcgc3ltYm9scy4gIFVzZXJzIHdobyBkb24ndCBtaW5kCi1iZWluZyBoZWxwbGVzcyBjYW4gc3RyaXAgdGhlIGV4ZWN1dGFibGVzIGxhdGVyIGlmIHRoZXkgd2lzaC4KLQotQGl0ZW0gaW5zdGFsbAotQ29tcGlsZSB0aGUgcHJvZ3JhbSBhbmQgY29weSB0aGUgZXhlY3V0YWJsZXMsIGxpYnJhcmllcywgYW5kIHNvIG9uIHRvCi10aGUgZmlsZSBuYW1lcyB3aGVyZSB0aGV5IHNob3VsZCByZXNpZGUgZm9yIGFjdHVhbCB1c2UuICBJZiB0aGVyZSBpcyBhCi1zaW1wbGUgdGVzdCB0byB2ZXJpZnkgdGhhdCBhIHByb2dyYW0gaXMgcHJvcGVybHkgaW5zdGFsbGVkLCB0aGlzIHRhcmdldAotc2hvdWxkIHJ1biB0aGF0IHRlc3QuCi0KLURvIG5vdCBzdHJpcCBleGVjdXRhYmxlcyB3aGVuIGluc3RhbGxpbmcgdGhlbS4gIERldmlsLW1heS1jYXJlIHVzZXJzIGNhbgotdXNlIHRoZSBAY29kZXtpbnN0YWxsLXN0cmlwfSB0YXJnZXQgdG8gZG8gdGhhdC4KLQotSWYgcG9zc2libGUsIHdyaXRlIHRoZSBAY29kZXtpbnN0YWxsfSB0YXJnZXQgcnVsZSBzbyB0aGF0IGl0IGRvZXMgbm90Ci1tb2RpZnkgYW55dGhpbmcgaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgcHJvZ3JhbSB3YXMgYnVpbHQsIHByb3ZpZGVkCi1Ac2FtcHttYWtlIGFsbH0gaGFzIGp1c3QgYmVlbiBkb25lLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciBidWlsZGluZyB0aGUKLXByb2dyYW0gdW5kZXIgb25lIHVzZXIgbmFtZSBhbmQgaW5zdGFsbGluZyBpdCB1bmRlciBhbm90aGVyLgotCi1UaGUgY29tbWFuZHMgc2hvdWxkIGNyZWF0ZSBhbGwgdGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIGZpbGVzIGFyZSB0byBiZQotaW5zdGFsbGVkLCBpZiB0aGV5IGRvbid0IGFscmVhZHkgZXhpc3QuICBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3Rvcmllcwotc3BlY2lmaWVkIGFzIHRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlcyBAY29kZXtwcmVmaXh9IGFuZAotQGNvZGV7ZXhlY19wcmVmaXh9LCBhcyB3ZWxsIGFzIGFsbCBzdWJkaXJlY3RvcmllcyB0aGF0IGFyZSBuZWVkZWQuCi1PbmUgd2F5IHRvIGRvIHRoaXMgaXMgYnkgbWVhbnMgb2YgYW4gQGNvZGV7aW5zdGFsbGRpcnN9IHRhcmdldAotYXMgZGVzY3JpYmVkIGJlbG93LgotCi1Vc2UgQHNhbXB7LX0gYmVmb3JlIGFueSBjb21tYW5kIGZvciBpbnN0YWxsaW5nIGEgbWFuIHBhZ2UsIHNvIHRoYXQKLUBjb2Rle21ha2V9IHdpbGwgaWdub3JlIGFueSBlcnJvcnMuICBUaGlzIGlzIGluIGNhc2UgdGhlcmUgYXJlIHN5c3RlbXMKLXRoYXQgZG9uJ3QgaGF2ZSB0aGUgVW5peCBtYW4gcGFnZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBpbnN0YWxsZWQuCi0KLVRoZSB3YXkgdG8gaW5zdGFsbCBJbmZvIGZpbGVzIGlzIHRvIGNvcHkgdGhlbSBpbnRvIEBmaWxleyQoaW5mb2Rpcil9Ci13aXRoIEBjb2RleyQoSU5TVEFMTF9EQVRBKX0gKEBweHJlZntDb21tYW5kIFZhcmlhYmxlc30pLCBhbmQgdGhlbiBydW4KLXRoZSBAY29kZXtpbnN0YWxsLWluZm99IHByb2dyYW0gaWYgaXQgaXMgcHJlc2VudC4gIEBjb2Rle2luc3RhbGwtaW5mb30KLWlzIGEgcHJvZ3JhbSB0aGF0IGVkaXRzIHRoZSBJbmZvIEBmaWxle2Rpcn0gZmlsZSB0byBhZGQgb3IgdXBkYXRlIHRoZQotbWVudSBlbnRyeSBmb3IgdGhlIGdpdmVuIEluZm8gZmlsZTsgaXQgaXMgcGFydCBvZiB0aGUgVGV4aW5mbyBwYWNrYWdlLgotSGVyZSBpcyBhIHNhbXBsZSBydWxlIHRvIGluc3RhbGwgYW4gSW5mbyBmaWxlOgotCi1AY29tbWVudCBUaGlzIGV4YW1wbGUgaGFzIGJlZW4gY2FyZWZ1bGx5IGZvcm1hdHRlZCBmb3IgdGhlIE1ha2UgbWFudWFsLgotQGNvbW1lbnQgUGxlYXNlIGRvIG5vdCByZWZvcm1hdCBpdCB3aXRob3V0IHRhbGtpbmcgdG8gcm9sYW5kQGdudS5haS5taXQuZWR1LgotQHNtYWxsZXhhbXBsZQotJChERVNURElSKSQoaW5mb2RpcikvZm9vLmluZm86IGZvby5pbmZvCi0gICAgICAgICQoUE9TVF9JTlNUQUxMKQotIyBUaGVyZSBtYXkgYmUgYSBuZXdlciBpbmZvIGZpbGUgaW4gLiB0aGFuIGluIHNyY2Rpci4KLSAgICAgICAgLWlmIHRlc3QgLWYgZm9vLmluZm87IHRoZW4gZD0uOyBcCi0gICAgICAgICBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotICAgICAgICAkKElOU1RBTExfREFUQSkgJCRkL2Zvby5pbmZvICQoREVTVERJUikkQEA7IFwKLSMgUnVuIGluc3RhbGwtaW5mbyBvbmx5IGlmIGl0IGV4aXN0cy4KLSMgVXNlIGBpZicgaW5zdGVhZCBvZiBqdXN0IHByZXBlbmRpbmcgYC0nIHRvIHRoZQotIyBsaW5lIHNvIHdlIG5vdGljZSByZWFsIGVycm9ycyBmcm9tIGluc3RhbGwtaW5mby4KLSMgV2UgdXNlIGAkKFNIRUxMKSAtYycgYmVjYXVzZSBzb21lIHNoZWxscyBkbyBub3QKLSMgZmFpbCBncmFjZWZ1bGx5IHdoZW4gdGhlcmUgaXMgYW4gdW5rbm93biBjb21tYW5kLgotICAgICAgICBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbicgXAotICAgICAgICAgICA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotICAgICAgICAgIGluc3RhbGwtaW5mbyAtLWRpci1maWxlPSQoREVTVERJUikkKGluZm9kaXIpL2RpciBcCi0gICAgICAgICAgICAgICAgICAgICAgICQoREVTVERJUikkKGluZm9kaXIpL2Zvby5pbmZvOyBcCi0gICAgICAgIGVsc2UgdHJ1ZTsgZmkKLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4gd3JpdGluZyB0aGUgQGNvZGV7aW5zdGFsbH0gdGFyZ2V0LCB5b3UgbXVzdCBjbGFzc2lmeSBhbGwgdGhlCi1jb21tYW5kcyBpbnRvIHRocmVlIGNhdGVnb3JpZXM6IG5vcm1hbCBvbmVzLCBAZGZue3ByZS1pbnN0YWxsYXRpb259Ci1jb21tYW5kcyBhbmQgQGRmbntwb3N0LWluc3RhbGxhdGlvbn0gY29tbWFuZHMuICBAeHJlZntJbnN0YWxsIENvbW1hbmQKLUNhdGVnb3JpZXN9LgotCi1AaXRlbSB1bmluc3RhbGwKLURlbGV0ZSBhbGwgdGhlIGluc3RhbGxlZCBmaWxlcy0tLXRoZSBjb3BpZXMgdGhhdCB0aGUgQHNhbXB7aW5zdGFsbH0KLXRhcmdldCBjcmVhdGVzLgotCi1UaGlzIHJ1bGUgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIGNvbXBpbGF0aW9uIGlzIGRvbmUsCi1vbmx5IHRoZSBkaXJlY3RvcmllcyB3aGVyZSBmaWxlcyBhcmUgaW5zdGFsbGVkLgotCi1UaGUgdW5pbnN0YWxsYXRpb24gY29tbWFuZHMgYXJlIGRpdmlkZWQgaW50byB0aHJlZSBjYXRlZ29yaWVzLCBqdXN0IGxpa2UKLXRoZSBpbnN0YWxsYXRpb24gY29tbWFuZHMuICBAeHJlZntJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllc30uCi0KLUBpdGVtIGluc3RhbGwtc3RyaXAKLUxpa2UgQGNvZGV7aW5zdGFsbH0sIGJ1dCBzdHJpcCB0aGUgZXhlY3V0YWJsZSBmaWxlcyB3aGlsZSBpbnN0YWxsaW5nCi10aGVtLiAgSW4gbWFueSBjYXNlcywgdGhlIGRlZmluaXRpb24gb2YgdGhpcyB0YXJnZXQgY2FuIGJlIHZlcnkgc2ltcGxlOgotCi1Ac21hbGxleGFtcGxlCi1pbnN0YWxsLXN0cmlwOgotICAgICAgICAkKE1BS0UpIElOU1RBTExfUFJPR1JBTT0nJChJTlNUQUxMX1BST0dSQU0pIC1zJyBcCi0gICAgICAgICAgICAgICAgaW5zdGFsbAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm9ybWFsbHkgd2UgZG8gbm90IHJlY29tbWVuZCBzdHJpcHBpbmcgYW4gZXhlY3V0YWJsZSB1bmxlc3MgeW91IGFyZSBzdXJlCi10aGUgcHJvZ3JhbSBoYXMgbm8gYnVncy4gIEhvd2V2ZXIsIGl0IGNhbiBiZSByZWFzb25hYmxlIHRvIGluc3RhbGwgYQotc3RyaXBwZWQgZXhlY3V0YWJsZSBmb3IgYWN0dWFsIGV4ZWN1dGlvbiB3aGlsZSBzYXZpbmcgdGhlIHVuc3RyaXBwZWQKLWV4ZWN1dGFibGUgZWxzZXdoZXJlIGluIGNhc2UgdGhlcmUgaXMgYSBidWcuCi0KLUBjb21tZW50IFRoZSBncmF0dWl0b3VzIGJsYW5rIGxpbmUgaGVyZSBpcyB0byBtYWtlIHRoZSB0YWJsZSBsb29rIGJldHRlcgotQGNvbW1lbnQgaW4gdGhlIHByaW50ZWQgTWFrZSBtYW51YWwuICBQbGVhc2UgbGVhdmUgaXQgaW4uCi1AaXRlbSBjbGVhbgotCi1EZWxldGUgYWxsIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgYXJlIG5vcm1hbGx5IGNyZWF0ZWQgYnkKLWJ1aWxkaW5nIHRoZSBwcm9ncmFtLiAgRG9uJ3QgZGVsZXRlIHRoZSBmaWxlcyB0aGF0IHJlY29yZCB0aGUKLWNvbmZpZ3VyYXRpb24uICBBbHNvIHByZXNlcnZlIGZpbGVzIHRoYXQgY291bGQgYmUgbWFkZSBieSBidWlsZGluZywgYnV0Ci1ub3JtYWxseSBhcmVuJ3QgYmVjYXVzZSB0aGUgZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggdGhlbS4KLQotRGVsZXRlIEBmaWxley5kdml9IGZpbGVzIGhlcmUgaWYgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KLQotQGl0ZW0gZGlzdGNsZWFuCi1EZWxldGUgYWxsIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgYXJlIGNyZWF0ZWQgYnkKLWNvbmZpZ3VyaW5nIG9yIGJ1aWxkaW5nIHRoZSBwcm9ncmFtLiAgSWYgeW91IGhhdmUgdW5wYWNrZWQgdGhlIHNvdXJjZQotYW5kIGJ1aWx0IHRoZSBwcm9ncmFtIHdpdGhvdXQgY3JlYXRpbmcgYW55IG90aGVyIGZpbGVzLCBAc2FtcHttYWtlCi1kaXN0Y2xlYW59IHNob3VsZCBsZWF2ZSBvbmx5IHRoZSBmaWxlcyB0aGF0IHdlcmUgaW4gdGhlIGRpc3RyaWJ1dGlvbi4KLQotQGl0ZW0gbW9zdGx5Y2xlYW4KLUxpa2UgQHNhbXB7Y2xlYW59LCBidXQgbWF5IHJlZnJhaW4gZnJvbSBkZWxldGluZyBhIGZldyBmaWxlcyB0aGF0IHBlb3BsZQotbm9ybWFsbHkgZG9uJ3Qgd2FudCB0byByZWNvbXBpbGUuICBGb3IgZXhhbXBsZSwgdGhlIEBzYW1we21vc3RseWNsZWFufQotdGFyZ2V0IGZvciBHQ0MgZG9lcyBub3QgZGVsZXRlIEBmaWxle2xpYmdjYy5hfSwgYmVjYXVzZSByZWNvbXBpbGluZyBpdAotaXMgcmFyZWx5IG5lY2Vzc2FyeSBhbmQgdGFrZXMgYSBsb3Qgb2YgdGltZS4KLQotQGl0ZW0gbWFpbnRhaW5lci1jbGVhbgotRGVsZXRlIGFsbW9zdCBldmVyeXRoaW5nIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgY2FuIGJlCi1yZWNvbnN0cnVjdGVkIHdpdGggdGhpcyBNYWtlZmlsZS4gIFRoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIGV2ZXJ5dGhpbmcKLWRlbGV0ZWQgYnkgQGNvZGV7ZGlzdGNsZWFufSwgcGx1cyBtb3JlOiBDIHNvdXJjZSBmaWxlcyBwcm9kdWNlZCBieQotQmlzb24sIHRhZ3MgdGFibGVzLCBJbmZvIGZpbGVzLCBhbmQgc28gb24uCi0KLVRoZSByZWFzb24gd2Ugc2F5IGBgYWxtb3N0IGV2ZXJ5dGhpbmcnJyBpcyB0aGF0IHJ1bm5pbmcgdGhlIGNvbW1hbmQKLUBzYW1we21ha2UgbWFpbnRhaW5lci1jbGVhbn0gc2hvdWxkIG5vdCBkZWxldGUgQGZpbGV7Y29uZmlndXJlfSBldmVuIGlmCi1AZmlsZXtjb25maWd1cmV9IGNhbiBiZSByZW1hZGUgdXNpbmcgYSBydWxlIGluIHRoZSBNYWtlZmlsZS4gIE1vcmUgZ2VuZXJhbGx5LAotQHNhbXB7bWFrZSBtYWludGFpbmVyLWNsZWFufSBzaG91bGQgbm90IGRlbGV0ZSBhbnl0aGluZyB0aGF0IG5lZWRzIHRvCi1leGlzdCBpbiBvcmRlciB0byBydW4gQGZpbGV7Y29uZmlndXJlfSBhbmQgdGhlbiBiZWdpbiB0byBidWlsZCB0aGUKLXByb2dyYW0uICBUaGlzIGlzIHRoZSBvbmx5IGV4Y2VwdGlvbjsgQGNvZGV7bWFpbnRhaW5lci1jbGVhbn0gc2hvdWxkCi1kZWxldGUgZXZlcnl0aGluZyBlbHNlIHRoYXQgY2FuIGJlIHJlYnVpbHQuCi0KLVRoZSBAc2FtcHttYWludGFpbmVyLWNsZWFufSB0YXJnZXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBhIG1haW50YWluZXIgb2YKLXRoZSBwYWNrYWdlLCBub3QgYnkgb3JkaW5hcnkgdXNlcnMuICBZb3UgbWF5IG5lZWQgc3BlY2lhbCB0b29scyB0bwotcmVjb25zdHJ1Y3Qgc29tZSBvZiB0aGUgZmlsZXMgdGhhdCBAc2FtcHttYWtlIG1haW50YWluZXItY2xlYW59IGRlbGV0ZXMuCi1TaW5jZSB0aGVzZSBmaWxlcyBhcmUgbm9ybWFsbHkgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgd2UgZG9uJ3QKLXRha2UgY2FyZSB0byBtYWtlIHRoZW0gZWFzeSB0byByZWNvbnN0cnVjdC4gIElmIHlvdSBmaW5kIHlvdSBuZWVkIHRvCi11bnBhY2sgdGhlIGZ1bGwgZGlzdHJpYnV0aW9uIGFnYWluLCBkb24ndCBibGFtZSB1cy4KLQotVG8gaGVscCBtYWtlIHVzZXJzIGF3YXJlIG9mIHRoaXMsIHRoZSBjb21tYW5kcyBmb3IgdGhlIHNwZWNpYWwKLUBjb2Rle21haW50YWluZXItY2xlYW59IHRhcmdldCBzaG91bGQgc3RhcnQgd2l0aCB0aGVzZSB0d286Ci0KLUBzbWFsbGV4YW1wbGUKLUBAZWNobyAnVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IGl0JwotQEBlY2hvICdkZWxldGVzIGZpbGVzIHRoYXQgbWF5IG5lZWQgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLicKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIFRBR1MKLVVwZGF0ZSBhIHRhZ3MgdGFibGUgZm9yIHRoaXMgcHJvZ3JhbS4KLUBjIEFEUjogaG93PwotCi1AaXRlbSBpbmZvCi1HZW5lcmF0ZSBhbnkgSW5mbyBmaWxlcyBuZWVkZWQuICBUaGUgYmVzdCB3YXkgdG8gd3JpdGUgdGhlIHJ1bGVzIGlzIGFzCi1mb2xsb3dzOgotCi1Ac21hbGxleGFtcGxlCi1pbmZvOiBmb28uaW5mbwotCi1mb28uaW5mbzogZm9vLnRleGkgY2hhcDEudGV4aSBjaGFwMi50ZXhpCi0gICAgICAgICQoTUFLRUlORk8pICQoc3JjZGlyKS9mb28udGV4aQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1Zb3UgbXVzdCBkZWZpbmUgdGhlIHZhcmlhYmxlIEBjb2Rle01BS0VJTkZPfSBpbiB0aGUgTWFrZWZpbGUuICBJdCBzaG91bGQKLXJ1biB0aGUgQGNvZGV7bWFrZWluZm99IHByb2dyYW0sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIFRleGluZm8KLWRpc3RyaWJ1dGlvbi4KLQotTm9ybWFsbHkgYSBHTlUgZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggSW5mbyBmaWxlcywgYW5kIHRoYXQgbWVhbnMgdGhlCi1JbmZvIGZpbGVzIGFyZSBwcmVzZW50IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgVGhlcmVmb3JlLCB0aGUgTWFrZQotcnVsZSBmb3IgYW4gaW5mbyBmaWxlIHNob3VsZCB1cGRhdGUgaXQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBXaGVuCi11c2VycyBidWlsZCB0aGUgcGFja2FnZSwgb3JkaW5hcmlseSBNYWtlIHdpbGwgbm90IHVwZGF0ZSB0aGUgSW5mbyBmaWxlcwotYmVjYXVzZSB0aGV5IHdpbGwgYWxyZWFkeSBiZSB1cCB0byBkYXRlLgotCi1AaXRlbSBkdmkKLUdlbmVyYXRlIERWSSBmaWxlcyBmb3IgYWxsIFRleGluZm8gZG9jdW1lbnRhdGlvbi4KLUZvciBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi1kdmk6IGZvby5kdmkKLQotZm9vLmR2aTogZm9vLnRleGkgY2hhcDEudGV4aSBjaGFwMi50ZXhpCi0gICAgICAgICQoVEVYSTJEVkkpICQoc3JjZGlyKS9mb28udGV4aQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1Zb3UgbXVzdCBkZWZpbmUgdGhlIHZhcmlhYmxlIEBjb2Rle1RFWEkyRFZJfSBpbiB0aGUgTWFrZWZpbGUuICBJdCBzaG91bGQKLXJ1biB0aGUgcHJvZ3JhbSBAY29kZXt0ZXhpMmR2aX0sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIFRleGluZm8KLWRpc3RyaWJ1dGlvbi5AZm9vdG5vdGV7QGNvZGV7dGV4aTJkdml9IHVzZXMgQFRlWHt9IHRvIGRvIHRoZSByZWFsIHdvcmsKLW9mIGZvcm1hdHRpbmcuIEBUZVh7fSBpcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCBUZXhpbmZvLn0gIEFsdGVybmF0aXZlbHksCi13cml0ZSBqdXN0IHRoZSBkZXBlbmRlbmNpZXMsIGFuZCBhbGxvdyBHTlUgQGNvZGV7bWFrZX0gdG8gcHJvdmlkZSB0aGUgY29tbWFuZC4KLQotQGl0ZW0gZGlzdAotQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIHRhciBmaWxlIGZvciB0aGlzIHByb2dyYW0uICBUaGUgdGFyIGZpbGUgc2hvdWxkIGJlCi1zZXQgdXAgc28gdGhhdCB0aGUgZmlsZSBuYW1lcyBpbiB0aGUgdGFyIGZpbGUgc3RhcnQgd2l0aCBhIHN1YmRpcmVjdG9yeQotbmFtZSB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBpdCBpcyBhIGRpc3RyaWJ1dGlvbiBmb3IuICBUaGlzCi1uYW1lIGNhbiBpbmNsdWRlIHRoZSB2ZXJzaW9uIG51bWJlci4KLQotRm9yIGV4YW1wbGUsIHRoZSBkaXN0cmlidXRpb24gdGFyIGZpbGUgb2YgR0NDIHZlcnNpb24gMS40MCB1bnBhY2tzIGludG8KLWEgc3ViZGlyZWN0b3J5IG5hbWVkIEBmaWxle2djYy0xLjQwfS4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY3JlYXRlIGEgc3ViZGlyZWN0b3J5IGFwcHJvcHJpYXRlbHkKLW5hbWVkLCB1c2UgQGNvZGV7bG59IG9yIEBjb2Rle2NwfSB0byBpbnN0YWxsIHRoZSBwcm9wZXIgZmlsZXMgaW4gaXQsIGFuZAotdGhlbiBAY29kZXt0YXJ9IHRoYXQgc3ViZGlyZWN0b3J5LgotCi1Db21wcmVzcyB0aGUgdGFyIGZpbGUgZmlsZSB3aXRoIEBjb2Rle2d6aXB9LiAgRm9yIGV4YW1wbGUsIHRoZSBhY3R1YWwKLWRpc3RyaWJ1dGlvbiBmaWxlIGZvciBHQ0MgdmVyc2lvbiAxLjQwIGlzIGNhbGxlZCBAZmlsZXtnY2MtMS40MC50YXIuZ3p9LgotCi1UaGUgQGNvZGV7ZGlzdH0gdGFyZ2V0IHNob3VsZCBleHBsaWNpdGx5IGRlcGVuZCBvbiBhbGwgbm9uLXNvdXJjZSBmaWxlcwotdGhhdCBhcmUgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHVwIHRvIGRhdGUgaW4gdGhlCi1kaXN0cmlidXRpb24uCi1AaWZzZXQgQ09ERVNURAotQHhyZWZ7UmVsZWFzZXMsICwgTWFraW5nIFJlbGVhc2VzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIENPREVTVEQKLUB4cmVme1JlbGVhc2VzLCAsIE1ha2luZyBSZWxlYXNlcywgc3RhbmRhcmRzLCBHTlUgQ29kaW5nIFN0YW5kYXJkc30uCi1AZW5kIGlmY2xlYXIKLQotQGl0ZW0gY2hlY2sKLVBlcmZvcm0gc2VsZi10ZXN0cyAoaWYgYW55KS4gIFRoZSB1c2VyIG11c3QgYnVpbGQgdGhlIHByb2dyYW0gYmVmb3JlCi1ydW5uaW5nIHRoZSB0ZXN0cywgYnV0IG5lZWQgbm90IGluc3RhbGwgdGhlIHByb2dyYW07IHlvdSBzaG91bGQgd3JpdGUKLXRoZSBzZWxmLXRlc3RzIHNvIHRoYXQgdGhleSB3b3JrIHdoZW4gdGhlIHByb2dyYW0gaXMgYnVpbHQgYnV0IG5vdAotaW5zdGFsbGVkLgotQGVuZCB0YWJsZQotCi1UaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIHN1Z2dlc3RlZCBhcyBjb252ZW50aW9uYWwgbmFtZXMsIGZvciBwcm9ncmFtcwotaW4gd2hpY2ggdGhleSBhcmUgdXNlZnVsLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGluc3RhbGxjaGVjawotUGVyZm9ybSBpbnN0YWxsYXRpb24gdGVzdHMgKGlmIGFueSkuICBUaGUgdXNlciBtdXN0IGJ1aWxkIGFuZCBpbnN0YWxsCi10aGUgcHJvZ3JhbSBiZWZvcmUgcnVubmluZyB0aGUgdGVzdHMuICBZb3Ugc2hvdWxkIG5vdCBhc3N1bWUgdGhhdAotQGZpbGV7JChiaW5kaXIpfSBpcyBpbiB0aGUgc2VhcmNoIHBhdGguCi0KLUBpdGVtIGluc3RhbGxkaXJzCi1JdCdzIHVzZWZ1bCB0byBhZGQgYSB0YXJnZXQgbmFtZWQgQHNhbXB7aW5zdGFsbGRpcnN9IHRvIGNyZWF0ZSB0aGUKLWRpcmVjdG9yaWVzIHdoZXJlIGZpbGVzIGFyZSBpbnN0YWxsZWQsIGFuZCB0aGVpciBwYXJlbnQgZGlyZWN0b3JpZXMuCi1UaGVyZSBpcyBhIHNjcmlwdCBjYWxsZWQgQGZpbGV7bWtpbnN0YWxsZGlyc30gd2hpY2ggaXMgY29udmVuaWVudCBmb3IKLXRoaXM7IHlvdSBjYW4gZmluZCBpdCBpbiB0aGUgVGV4aW5mbyBwYWNrYWdlLgotQGMgSXQncyBpbiAvZ2QvZ251L2xpYi9ta2luc3RhbGxkaXJzLgotWW91IGNhbiB1c2UgYSBydWxlIGxpa2UgdGhpczoKLQotQGNvbW1lbnQgVGhpcyBoYXMgYmVlbiBjYXJlZnVsbHkgZm9ybWF0dGVkIHRvIGxvb2sgZGVjZW50IGluIHRoZSBNYWtlIG1hbnVhbC4KLUBjb21tZW50IFBsZWFzZSBiZSBzdXJlIG5vdCB0byBtYWtlIGl0IGV4dGVuZCBhbnkgZnVydGhlciB0byB0aGUgcmlnaHQuLS1yb2xhbmQKLUBzbWFsbGV4YW1wbGUKLSMgTWFrZSBzdXJlIGFsbCBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgKGUuZy4gJChiaW5kaXIpKQotIyBhY3R1YWxseSBleGlzdCBieSBtYWtpbmcgdGhlbSBpZiBuZWNlc3NhcnkuCi1pbnN0YWxsZGlyczogbWtpbnN0YWxsZGlycwotICAgICAgICAkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKGJpbmRpcikgJChkYXRhZGlyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobGliZGlyKSAkKGluZm9kaXIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChtYW5kaXIpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHJ1bGUgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIGNvbXBpbGF0aW9uIGlzIGRvbmUuCi1JdCBzaG91bGQgZG8gbm90aGluZyBidXQgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXMKLUBzZWN0aW9uIEluc3RhbGwgQ29tbWFuZCBDYXRlZ29yaWVzCi0KLUBjaW5kZXggcHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcwotQGNpbmRleCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcwotV2hlbiB3cml0aW5nIHRoZSBAY29kZXtpbnN0YWxsfSB0YXJnZXQsIHlvdSBtdXN0IGNsYXNzaWZ5IGFsbCB0aGUKLWNvbW1hbmRzIGludG8gdGhyZWUgY2F0ZWdvcmllczogbm9ybWFsIG9uZXMsIEBkZm57cHJlLWluc3RhbGxhdGlvbn0KLWNvbW1hbmRzIGFuZCBAZGZue3Bvc3QtaW5zdGFsbGF0aW9ufSBjb21tYW5kcy4KLQotTm9ybWFsIGNvbW1hbmRzIG1vdmUgZmlsZXMgaW50byB0aGVpciBwcm9wZXIgcGxhY2VzLCBhbmQgc2V0IHRoZWlyCi1tb2Rlcy4gIFRoZXkgbWF5IG5vdCBhbHRlciBhbnkgZmlsZXMgZXhjZXB0IHRoZSBvbmVzIHRoYXQgY29tZSBlbnRpcmVseQotZnJvbSB0aGUgcGFja2FnZSB0aGV5IGJlbG9uZyB0by4KLQotUHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMgbWF5IGFsdGVyIG90aGVyIGZpbGVzOwotaW4gcGFydGljdWxhciwgdGhleSBjYW4gZWRpdCBnbG9iYWwgY29uZmlndXJhdGlvbiBmaWxlcyBvciBkYXRhIGJhc2VzLgotCi1QcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGFyZSB0eXBpY2FsbHkgZXhlY3V0ZWQgYmVmb3JlIHRoZSBub3JtYWwKLWNvbW1hbmRzLCBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMgYXJlIHR5cGljYWxseSBydW4gYWZ0ZXIgdGhlCi1ub3JtYWwgY29tbWFuZHMuCi0KLVRoZSBtb3N0IGNvbW1vbiB1c2UgZm9yIGEgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZCBpcyB0byBydW4KLUBjb2Rle2luc3RhbGwtaW5mb30uICBUaGlzIGNhbm5vdCBiZSBkb25lIHdpdGggYSBub3JtYWwgY29tbWFuZCwgc2luY2UKLWl0IGFsdGVycyBhIGZpbGUgKHRoZSBJbmZvIGRpcmVjdG9yeSkgd2hpY2ggZG9lcyBub3QgY29tZSBlbnRpcmVseSBhbmQKLXNvbGVseSBmcm9tIHRoZSBwYWNrYWdlIGJlaW5nIGluc3RhbGxlZC4gIEl0IGlzIGEgcG9zdC1pbnN0YWxsYXRpb24KLWNvbW1hbmQgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSBkb25lIGFmdGVyIHRoZSBub3JtYWwgY29tbWFuZCB3aGljaAotaW5zdGFsbHMgdGhlIHBhY2thZ2UncyBJbmZvIGZpbGVzLgotCi1Nb3N0IHByb2dyYW1zIGRvbid0IG5lZWQgYW55IHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHMsIGJ1dCB3ZSBoYXZlIHRoZQotZmVhdHVyZSBqdXN0IGluIGNhc2UgaXQgaXMgbmVlZGVkLgotCi1UbyBjbGFzc2lmeSB0aGUgY29tbWFuZHMgaW4gdGhlIEBjb2Rle2luc3RhbGx9IHJ1bGUgaW50byB0aGVzZSB0aHJlZQotY2F0ZWdvcmllcywgaW5zZXJ0IEBkZm57Y2F0ZWdvcnkgbGluZXN9IGFtb25nIHRoZW0uICBBIGNhdGVnb3J5IGxpbmUKLXNwZWNpZmllcyB0aGUgY2F0ZWdvcnkgZm9yIHRoZSBjb21tYW5kcyB0aGF0IGZvbGxvdy4KLQotQSBjYXRlZ29yeSBsaW5lIGNvbnNpc3RzIG9mIGEgdGFiIGFuZCBhIHJlZmVyZW5jZSB0byBhIHNwZWNpYWwgTWFrZQotdmFyaWFibGUsIHBsdXMgYW4gb3B0aW9uYWwgY29tbWVudCBhdCB0aGUgZW5kLiAgVGhlcmUgYXJlIHRocmVlCi12YXJpYWJsZXMgeW91IGNhbiB1c2UsIG9uZSBmb3IgZWFjaCBjYXRlZ29yeTsgdGhlIHZhcmlhYmxlIG5hbWUKLXNwZWNpZmllcyB0aGUgY2F0ZWdvcnkuICBDYXRlZ29yeSBsaW5lcyBhcmUgbm8tb3BzIGluIG9yZGluYXJ5IGV4ZWN1dGlvbgotYmVjYXVzZSB0aGVzZSB0aHJlZSBNYWtlIHZhcmlhYmxlcyBhcmUgbm9ybWFsbHkgdW5kZWZpbmVkIChhbmQgeW91Ci1AZW1waHtzaG91bGQgbm90fSBkZWZpbmUgdGhlbSBpbiB0aGUgbWFrZWZpbGUpLgotCi1IZXJlIGFyZSB0aGUgdGhyZWUgcG9zc2libGUgY2F0ZWdvcnkgbGluZXMsIGVhY2ggd2l0aCBhIGNvbW1lbnQgdGhhdAotZXhwbGFpbnMgd2hhdCBpdCBtZWFuczoKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAkKFBSRV9JTlNUQUxMKSAgICAgIyBAcntQcmUtaW5zdGFsbCBjb21tYW5kcyBmb2xsb3cufQotICAgICAgICAkKFBPU1RfSU5TVEFMTCkgICAgIyBAcntQb3N0LWluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChOT1JNQUxfSU5TVEFMTCkgICMgQHJ7Tm9ybWFsIGNvbW1hbmRzIGZvbGxvdy59Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3UgZG9uJ3QgdXNlIGEgY2F0ZWdvcnkgbGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBAY29kZXtpbnN0YWxsfQotcnVsZSwgYWxsIHRoZSBjb21tYW5kcyBhcmUgY2xhc3NpZmllZCBhcyBub3JtYWwgdW50aWwgdGhlIGZpcnN0IGNhdGVnb3J5Ci1saW5lLiAgSWYgeW91IGRvbid0IHVzZSBhbnkgY2F0ZWdvcnkgbGluZXMsIGFsbCB0aGUgY29tbWFuZHMgYXJlCi1jbGFzc2lmaWVkIGFzIG5vcm1hbC4KLQotVGhlc2UgYXJlIHRoZSBjYXRlZ29yeSBsaW5lcyBmb3IgQGNvZGV7dW5pbnN0YWxsfToKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAkKFBSRV9VTklOU1RBTEwpICAgICAjIEBye1ByZS11bmluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChQT1NUX1VOSU5TVEFMTCkgICAgIyBAcntQb3N0LXVuaW5zdGFsbCBjb21tYW5kcyBmb2xsb3cufQotICAgICAgICAkKE5PUk1BTF9VTklOU1RBTEwpICAjIEBye05vcm1hbCBjb21tYW5kcyBmb2xsb3cufQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVHlwaWNhbGx5LCBhIHByZS11bmluc3RhbGwgY29tbWFuZCB3b3VsZCBiZSB1c2VkIGZvciBkZWxldGluZyBlbnRyaWVzCi1mcm9tIHRoZSBJbmZvIGRpcmVjdG9yeS4KLQotSWYgdGhlIEBjb2Rle2luc3RhbGx9IG9yIEBjb2Rle3VuaW5zdGFsbH0gdGFyZ2V0IGhhcyBhbnkgZGVwZW5kZW5jaWVzCi13aGljaCBhY3QgYXMgc3Vicm91dGluZXMgb2YgaW5zdGFsbGF0aW9uLCB0aGVuIHlvdSBzaG91bGQgc3RhcnQKLUBlbXBoe2VhY2h9IGRlcGVuZGVuY3kncyBjb21tYW5kcyB3aXRoIGEgY2F0ZWdvcnkgbGluZSwgYW5kIHN0YXJ0IHRoZQotbWFpbiB0YXJnZXQncyBjb21tYW5kcyB3aXRoIGEgY2F0ZWdvcnkgbGluZSBhbHNvLiAgVGhpcyB3YXksIHlvdSBjYW4KLWVuc3VyZSB0aGF0IGVhY2ggY29tbWFuZCBpcyBwbGFjZWQgaW4gdGhlIHJpZ2h0IGNhdGVnb3J5IHJlZ2FyZGxlc3Mgb2YKLXdoaWNoIG9mIHRoZSBkZXBlbmRlbmNpZXMgYWN0dWFsbHkgcnVuLgotCi1QcmUtaW5zdGFsbGF0aW9uIGFuZCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcyBzaG91bGQgbm90IHJ1biBhbnkKLXByb2dyYW1zIGV4Y2VwdCBmb3IgdGhlc2U6Ci0KLUBleGFtcGxlCi1bIGJhc2VuYW1lIGJhc2ggY2F0IGNoZ3JwIGNobW9kIGNob3duIGNtcCBjcCBkZCBkaWZmIGVjaG8KLWVncmVwIGV4cGFuZCBleHByIGZhbHNlIGZncmVwIGZpbmQgZ2V0b3B0IGdyZXAgZ3VuemlwIGd6aXAKLWhvc3RuYW1lIGluc3RhbGwgaW5zdGFsbC1pbmZvIGtpbGwgbGRjb25maWcgbG4gbHMgbWQ1c3VtCi1ta2RpciBta2ZpZm8gbWtub2QgbXYgcHJpbnRlbnYgcHdkIHJtIHJtZGlyIHNlZCBzb3J0IHRlZQotdGVzdCB0b3VjaCB0cnVlIHVuYW1lIHhhcmdzIHllcwotQGVuZCBleGFtcGxlCi0KLUBjaW5kZXggYmluYXJ5IHBhY2thZ2VzCi1UaGUgcmVhc29uIGZvciBkaXN0aW5ndWlzaGluZyB0aGUgY29tbWFuZHMgaW4gdGhpcyB3YXkgaXMgZm9yIHRoZSBzYWtlCi1vZiBtYWtpbmcgYmluYXJ5IHBhY2thZ2VzLiAgVHlwaWNhbGx5IGEgYmluYXJ5IHBhY2thZ2UgY29udGFpbnMgYWxsIHRoZQotZXhlY3V0YWJsZXMgYW5kIG90aGVyIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBpbnN0YWxsZWQsIGFuZCBoYXMgaXRzIG93bgotbWV0aG9kIG9mIGluc3RhbGxpbmcgdGhlbS0tLXNvIGl0IGRvZXMgbm90IG5lZWQgdG8gcnVuIHRoZSBub3JtYWwKLWluc3RhbGxhdGlvbiBjb21tYW5kcy4gIEJ1dCBpbnN0YWxsaW5nIHRoZSBiaW5hcnkgcGFja2FnZSBkb2VzIG5lZWQgdG8KLWV4ZWN1dGUgdGhlIHByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzLgotCi1Qcm9ncmFtcyB0byBidWlsZCBiaW5hcnkgcGFja2FnZXMgd29yayBieSBleHRyYWN0aW5nIHRoZQotcHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMuICBIZXJlIGlzIG9uZSB3YXkgb2YKLWV4dHJhY3RpbmcgdGhlIHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHM6Ci0KLUBzbWFsbGV4YW1wbGUKLW1ha2UgLW4gaW5zdGFsbCAtbyBhbGwgXAotICAgICAgUFJFX0lOU1RBTEw9cHJlLWluc3RhbGwgXAotICAgICAgUE9TVF9JTlNUQUxMPXBvc3QtaW5zdGFsbCBcCi0gICAgICBOT1JNQUxfSU5TVEFMTD1ub3JtYWwtaW5zdGFsbCBcCi0gIHwgZ2F3ayAtZiBwcmUtaW5zdGFsbC5hd2sKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgdGhlIGZpbGUgQGZpbGV7cHJlLWluc3RhbGwuYXdrfSBjb3VsZCBjb250YWluIHRoaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLSQwIH4gL15cdFsgXHRdKihub3JtYWxfaW5zdGFsbHxwb3N0X2luc3RhbGwpWyBcdF0qJC8gQHtvbiA9IDBAfQotb24gQHtwcmludCAkMEB9Ci0kMCB+IC9eXHRbIFx0XSpwcmVfaW5zdGFsbFsgXHRdKiQvIEB7b24gPSAxQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSByZXN1bHRpbmcgZmlsZSBvZiBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGlzIGV4ZWN1dGVkIGFzIGEgc2hlbGwKLXNjcmlwdCBhcyBwYXJ0IG9mIGluc3RhbGxpbmcgdGhlIGJpbmFyeSBwYWNrYWdlLgpkaWZmIC0tZ2l0IGEvZXRjL3N0YW5kYXJkcy50ZXhpIGIvZXRjL3N0YW5kYXJkcy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBiZjhiLi4wMDAwMDAwCi0tLSBhL2V0Yy9zdGFuZGFyZHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDMwOTMgKzAsMCBAQAotXGlucHV0IHRleGluZm8gQGMgLSotdGV4aW5mby0qLQotQGMgJSoqc3RhcnQgb2YgaGVhZGVyCi1Ac2V0ZmlsZW5hbWUgc3RhbmRhcmRzLmluZm8KLUBzZXR0aXRsZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotQGMgVGhpcyBkYXRlIGlzIGF1dG9tYWdpY2FsbHkgdXBkYXRlZCB3aGVuIHlvdSBzYXZlIHRoaXMgZmlsZToKLUBzZXQgbGFzdHVwZGF0ZSBNYXJjaCAxMywgMTk5OAotQGMgJSoqZW5kIG9mIGhlYWRlcgotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBTdGFuZGFyZHM6IChzdGFuZGFyZHMpLiAgICAgICAgR05VIGNvZGluZyBzdGFuZGFyZHMuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AYyBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmCi0KLUBjIFRoaXMgaXMgdXNlZCBieSBhIGNyb3NzIHJlZiBpbiBtYWtlLXN0ZHMudGV4aQotQHNldCBDT0RFU1REICAxCi1AaWZ0ZXgKLUBzZXQgQ0hBUFRFUiBjaGFwdGVyCi1AZW5kIGlmdGV4Ci1AaWZpbmZvCi1Ac2V0IENIQVBURVIgbm9kZQotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotR05VIENvZGluZyBTdGFuZGFyZHMKLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotQGVuZCBpZ25vcmUKLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotQGVuZCBpZmluZm8KLQotQHRpdGxlcGFnZQotQHRpdGxlIEdOVSBDb2RpbmcgU3RhbmRhcmRzCi1AYXV0aG9yIFJpY2hhcmQgU3RhbGxtYW4KLUBhdXRob3IgbGFzdCB1cGRhdGVkIEB2YWx1ZXtsYXN0dXBkYXRlfQotQHBhZ2UKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUBub2RlIFRvcCwgUHJlZmFjZSwgKGRpciksIChkaXIpCi1AdG9wIFZlcnNpb24KLQotTGFzdCB1cGRhdGVkIEB2YWx1ZXtsYXN0dXBkYXRlfS4KLUBlbmQgaWZpbmZvCi0KLUBtZW51Ci0qIFByZWZhY2U6OiAgICAgICAgICAgICAgICAgICAgIEFib3V0IHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotKiBJbnRlbGxlY3R1YWwgUHJvcGVydHk6OiAgICAgICBLZWVwaW5nIEZyZWUgU29mdHdhcmUgRnJlZQotKiBEZXNpZ24gQWR2aWNlOjogICAgICAgICAgICAgICBHZW5lcmFsIFByb2dyYW0gRGVzaWduCi0qIFByb2dyYW0gQmVoYXZpb3I6OiAgICAgICAgICAgIFByb2dyYW0gQmVoYXZpb3IgZm9yIEFsbCBQcm9ncmFtcwotKiBXcml0aW5nIEM6OiAgICAgICAgICAgICAgICAgICBNYWtpbmcgVGhlIEJlc3QgVXNlIG9mIEMKLSogRG9jdW1lbnRhdGlvbjo6ICAgICAgICAgICAgICAgRG9jdW1lbnRpbmcgUHJvZ3JhbXMKLSogTWFuYWdpbmcgUmVsZWFzZXM6OiAgICAgICAgICAgVGhlIFJlbGVhc2UgUHJvY2VzcwotQGVuZCBtZW51Ci0KLUBub2RlIFByZWZhY2UKLUBjaGFwdGVyIEFib3V0IHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotCi1UaGUgR05VIENvZGluZyBTdGFuZGFyZHMgd2VyZSB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYW5kIG90aGVyIEdOVQotUHJvamVjdCB2b2x1bnRlZXJzLiAgVGhlaXIgcHVycG9zZSBpcyB0byBtYWtlIHRoZSBHTlUgc3lzdGVtIGNsZWFuLAotY29uc2lzdGVudCwgYW5kIGVhc3kgdG8gaW5zdGFsbC4gIFRoaXMgZG9jdW1lbnQgY2FuIGFsc28gYmUgcmVhZCBhcyBhCi1ndWlkZSB0byB3cml0aW5nIHBvcnRhYmxlLCByb2J1c3QgYW5kIHJlbGlhYmxlIHByb2dyYW1zLiAgSXQgZm9jdXNlcyBvbgotcHJvZ3JhbXMgd3JpdHRlbiBpbiBDLCBidXQgbWFueSBvZiB0aGUgcnVsZXMgYW5kIHByaW5jaXBsZXMgYXJlIHVzZWZ1bAotZXZlbiBpZiB5b3Ugd3JpdGUgaW4gYW5vdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZS4gIFRoZSBydWxlcyBvZnRlbgotc3RhdGUgcmVhc29ucyBmb3Igd3JpdGluZyBpbiBhIGNlcnRhaW4gd2F5LgotCi1Db3JyZWN0aW9ucyBvciBzdWdnZXN0aW9ucyBmb3IgdGhpcyBkb2N1bWVudCBzaG91bGQgYmUgc2VudCB0bwotQGVtYWlse2dudUBAZ251Lm9yZ30uICBJZiB5b3UgbWFrZSBhIHN1Z2dlc3Rpb24sIHBsZWFzZSBpbmNsdWRlIGEKLXN1Z2dlc3RlZCBuZXcgd29yZGluZyBmb3IgaXQ7IG91ciB0aW1lIGlzIGxpbWl0ZWQuICBXZSBwcmVmZXIgYSBjb250ZXh0Ci1kaWZmIHRvIHRoZSBAZmlsZXtzdGFuZGFyZHMudGV4aX0gb3IgQGZpbGV7bWFrZS1zdGRzLnRleGl9IGZpbGVzLCBidXQgaWYKLXlvdSBkb24ndCBoYXZlIHRob3NlIGZpbGVzLCBwbGVhc2UgbWFpbCB5b3VyIHN1Z2dlc3Rpb24gYW55d2F5LgotCi1UaGlzIHJlbGVhc2Ugb2YgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzIHdhcyBsYXN0IHVwZGF0ZWQKLUB2YWx1ZXtsYXN0dXBkYXRlfS4KLQotQG5vZGUgSW50ZWxsZWN0dWFsIFByb3BlcnR5Ci1AY2hhcHRlciBLZWVwaW5nIEZyZWUgU29mdHdhcmUgRnJlZQotCi1UaGlzIEB2YWx1ZXtDSEFQVEVSfSBkaXNjdXNzZXMgaG93IHlvdSBjYW4gbWFrZSBzdXJlIHRoYXQgR05VIHNvZnR3YXJlCi1yZW1haW5zIHVuZW5jdW1iZXJlZC4KLQotQG1lbnUKLSogUmVhZGluZyBOb24tRnJlZSBDb2RlOjogICAgICAgUmVmZXJyaW5nIHRvIFByb3ByaWV0YXJ5IFByb2dyYW1zCi0qIENvbnRyaWJ1dGlvbnM6OiAgICAgICAgICAgICAgIEFjY2VwdGluZyBDb250cmlidXRpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgUmVhZGluZyBOb24tRnJlZSBDb2RlCi1Ac2VjdGlvbiBSZWZlcnJpbmcgdG8gUHJvcHJpZXRhcnkgUHJvZ3JhbXMKLQotRG9uJ3QgaW4gYW55IGNpcmN1bXN0YW5jZXMgcmVmZXIgdG8gVW5peCBzb3VyY2UgY29kZSBmb3Igb3IgZHVyaW5nCi15b3VyIHdvcmsgb24gR05VISAgKE9yIHRvIGFueSBvdGhlciBwcm9wcmlldGFyeSBwcm9ncmFtcy4pCi0KLUlmIHlvdSBoYXZlIGEgdmFndWUgcmVjb2xsZWN0aW9uIG9mIHRoZSBpbnRlcm5hbHMgb2YgYSBVbml4IHByb2dyYW0sCi10aGlzIGRvZXMgbm90IGFic29sdXRlbHkgbWVhbiB5b3UgY2FuJ3Qgd3JpdGUgYW4gaW1pdGF0aW9uIG9mIGl0LCBidXQKLWRvIHRyeSB0byBvcmdhbml6ZSB0aGUgaW1pdGF0aW9uIGludGVybmFsbHkgYWxvbmcgZGlmZmVyZW50IGxpbmVzLAotYmVjYXVzZSB0aGlzIGlzIGxpa2VseSB0byBtYWtlIHRoZSBkZXRhaWxzIG9mIHRoZSBVbml4IHZlcnNpb24KLWlycmVsZXZhbnQgYW5kIGRpc3NpbWlsYXIgdG8geW91ciByZXN1bHRzLgotCi1Gb3IgZXhhbXBsZSwgVW5peCB1dGlsaXRpZXMgd2VyZSBnZW5lcmFsbHkgb3B0aW1pemVkIHRvIG1pbmltaXplCi1tZW1vcnkgdXNlOyBpZiB5b3UgZ28gZm9yIHNwZWVkIGluc3RlYWQsIHlvdXIgcHJvZ3JhbSB3aWxsIGJlIHZlcnkKLWRpZmZlcmVudC4gIFlvdSBjb3VsZCBrZWVwIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSBpbiBjb3JlIGFuZCBzY2FuIGl0Ci10aGVyZSBpbnN0ZWFkIG9mIHVzaW5nIHN0ZGlvLiAgVXNlIGEgc21hcnRlciBhbGdvcml0aG0gZGlzY292ZXJlZCBtb3JlCi1yZWNlbnRseSB0aGFuIHRoZSBVbml4IHByb2dyYW0uICBFbGltaW5hdGUgdXNlIG9mIHRlbXBvcmFyeSBmaWxlcy4gIERvCi1pdCBpbiBvbmUgcGFzcyBpbnN0ZWFkIG9mIHR3byAod2UgZGlkIHRoaXMgaW4gdGhlIGFzc2VtYmxlcikuCi0KLU9yLCBvbiB0aGUgY29udHJhcnksIGVtcGhhc2l6ZSBzaW1wbGljaXR5IGluc3RlYWQgb2Ygc3BlZWQuICBGb3Igc29tZQotYXBwbGljYXRpb25zLCB0aGUgc3BlZWQgb2YgdG9kYXkncyBjb21wdXRlcnMgbWFrZXMgc2ltcGxlciBhbGdvcml0aG1zCi1hZGVxdWF0ZS4KLQotT3IgZ28gZm9yIGdlbmVyYWxpdHkuICBGb3IgZXhhbXBsZSwgVW5peCBwcm9ncmFtcyBvZnRlbiBoYXZlIHN0YXRpYwotdGFibGVzIG9yIGZpeGVkLXNpemUgc3RyaW5ncywgd2hpY2ggbWFrZSBmb3IgYXJiaXRyYXJ5IGxpbWl0czsgdXNlCi1keW5hbWljIGFsbG9jYXRpb24gaW5zdGVhZC4gIE1ha2Ugc3VyZSB5b3VyIHByb2dyYW0gaGFuZGxlcyBOVUxzIGFuZAotb3RoZXIgZnVubnkgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgZmlsZXMuICBBZGQgYSBwcm9ncmFtbWluZyBsYW5ndWFnZQotZm9yIGV4dGVuc2liaWxpdHkgYW5kIHdyaXRlIHBhcnQgb2YgdGhlIHByb2dyYW0gaW4gdGhhdCBsYW5ndWFnZS4KLQotT3IgdHVybiBzb21lIHBhcnRzIG9mIHRoZSBwcm9ncmFtIGludG8gaW5kZXBlbmRlbnRseSB1c2FibGUgbGlicmFyaWVzLgotT3IgdXNlIGEgc2ltcGxlIGdhcmJhZ2UgY29sbGVjdG9yIGluc3RlYWQgb2YgdHJhY2tpbmcgcHJlY2lzZWx5IHdoZW4KLXRvIGZyZWUgbWVtb3J5LCBvciB1c2UgYSBuZXcgR05VIGZhY2lsaXR5IHN1Y2ggYXMgb2JzdGFja3MuCi0KLQotQG5vZGUgQ29udHJpYnV0aW9ucwotQHNlY3Rpb24gQWNjZXB0aW5nIENvbnRyaWJ1dGlvbnMKLQotSWYgc29tZW9uZSBlbHNlIHNlbmRzIHlvdSBhIHBpZWNlIG9mIGNvZGUgdG8gYWRkIHRvIHRoZSBwcm9ncmFtIHlvdSBhcmUKLXdvcmtpbmcgb24sIHdlIG5lZWQgbGVnYWwgcGFwZXJzIHRvIHVzZSBpdC0tLXRoZSBzYW1lIHNvcnQgb2YgbGVnYWwKLXBhcGVycyB3ZSB3aWxsIG5lZWQgdG8gZ2V0IGZyb20geW91LiAgQGVtcGh7RWFjaH0gc2lnbmlmaWNhbnQKLWNvbnRyaWJ1dG9yIHRvIGEgcHJvZ3JhbSBtdXN0IHNpZ24gc29tZSBzb3J0IG9mIGxlZ2FsIHBhcGVycyBpbiBvcmRlcgotZm9yIHVzIHRvIGhhdmUgY2xlYXIgdGl0bGUgdG8gdGhlIHByb2dyYW0uICBUaGUgbWFpbiBhdXRob3IgYWxvbmUgaXMgbm90Ci1lbm91Z2guCi0KLVNvLCBiZWZvcmUgYWRkaW5nIGluIGFueSBjb250cmlidXRpb25zIGZyb20gb3RoZXIgcGVvcGxlLCBwbGVhc2UgdGVsbAotdXMsIHNvIHdlIGNhbiBhcnJhbmdlIHRvIGdldCB0aGUgcGFwZXJzLiAgVGhlbiB3YWl0IHVudGlsIHdlIHRlbGwgeW91Ci10aGF0IHdlIGhhdmUgcmVjZWl2ZWQgdGhlIHNpZ25lZCBwYXBlcnMsIGJlZm9yZSB5b3UgYWN0dWFsbHkgdXNlIHRoZQotY29udHJpYnV0aW9uLgotCi1UaGlzIGFwcGxpZXMgYm90aCBiZWZvcmUgeW91IHJlbGVhc2UgdGhlIHByb2dyYW0gYW5kIGFmdGVyd2FyZC4gIElmCi15b3UgcmVjZWl2ZSBkaWZmcyB0byBmaXggYSBidWcsIGFuZCB0aGV5IG1ha2Ugc2lnbmlmaWNhbnQgY2hhbmdlcywgd2UKLW5lZWQgbGVnYWwgcGFwZXJzIGZvciB0aGF0IGNoYW5nZS4KLQotVGhpcyBhbHNvIGFwcGxpZXMgdG8gY29tbWVudHMgYW5kIGRvY3VtZW50YXRpb24gZmlsZXMuICBGb3IgY29weXJpZ2h0Ci1sYXcsIGNvbW1lbnRzIGFuZCBjb2RlIGFyZSBqdXN0IHRleHQuICBDb3B5cmlnaHQgYXBwbGllcyB0byBhbGwga2luZHMgb2YKLXRleHQsIHNvIHdlIG5lZWQgbGVnYWwgcGFwZXJzIGZvciBhbGwga2luZHMuCi0KLVlvdSBkb24ndCBuZWVkIHBhcGVycyBmb3IgY2hhbmdlcyBvZiBhIGZldyBsaW5lcyBoZXJlIG9yIHRoZXJlLCBzaW5jZQotdGhleSBhcmUgbm90IHNpZ25pZmljYW50IGZvciBjb3B5cmlnaHQgcHVycG9zZXMuICBBbHNvLCB5b3UgZG9uJ3QgbmVlZAotcGFwZXJzIGlmIGFsbCB5b3UgZ2V0IGZyb20gdGhlIHN1Z2dlc3Rpb24gaXMgc29tZSBpZGVhcywgbm90IGFjdHVhbCBjb2RlCi13aGljaCB5b3UgdXNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3cml0ZSBhIGRpZmZlcmVudCBzb2x1dGlvbiB0byB0aGUKLXByb2JsZW0sIHlvdSBkb24ndCBuZWVkIHRvIGdldCBwYXBlcnMuCi0KLVdlIGtub3cgdGhpcyBpcyBmcnVzdHJhdGluZzsgaXQncyBmcnVzdHJhdGluZyBmb3IgdXMgYXMgd2VsbC4gIEJ1dCBpZgoteW91IGRvbid0IHdhaXQsIHlvdSBhcmUgZ29pbmcgb3V0IG9uIGEgbGltYi0tLWZvciBleGFtcGxlLCB3aGF0IGlmIHRoZQotY29udHJpYnV0b3IncyBlbXBsb3llciB3b24ndCBzaWduIGEgZGlzY2xhaW1lcj8gIFlvdSBtaWdodCBoYXZlIHRvIHRha2UKLXRoYXQgY29kZSBvdXQgYWdhaW4hCi0KLVRoZSB2ZXJ5IHdvcnN0IHRoaW5nIGlzIGlmIHlvdSBmb3JnZXQgdG8gdGVsbCB1cyBhYm91dCB0aGUgb3RoZXIKLWNvbnRyaWJ1dG9yLiAgV2UgY291bGQgYmUgdmVyeSBlbWJhcnJhc3NlZCBpbiBjb3VydCBzb21lIGRheSBhcyBhCi1yZXN1bHQuCi0KLVdlIGhhdmUgbW9yZSBkZXRhaWxlZCBhZHZpY2UgZm9yIG1haW50YWluZXJzIG9mIHByb2dyYW1zOyBpZiB5b3UgaGF2ZQotcmVhY2hlZCB0aGUgc3RhZ2Ugb2YgYWN0dWFsbHkgbWFpbnRhaW5pbmcgYSBwcm9ncmFtIGZvciBHTlUgKHdoZXRoZXIKLXJlbGVhc2VkIG9yIG5vdCksIHBsZWFzZSBhc2sgdXMgZm9yIGEgY29weS4KLQotQG5vZGUgRGVzaWduIEFkdmljZQotQGNoYXB0ZXIgR2VuZXJhbCBQcm9ncmFtIERlc2lnbgotCi1UaGlzIEB2YWx1ZXtDSEFQVEVSfSBkaXNjdXNzZXMgc29tZSBvZiB0aGUgaXNzdWVzIHlvdSBzaG91bGQgdGFrZSBpbnRvCi1hY2NvdW50IHdoZW4gZGVzaWduaW5nIHlvdXIgcHJvZ3JhbS4KLQotQG1lbnUKLSogQ29tcGF0aWJpbGl0eTo6ICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucwotKiBVc2luZyBFeHRlbnNpb25zOjogICAgICAgICAgICBVc2luZyBub24tc3RhbmRhcmQgZmVhdHVyZXMKLSogQU5TSSBDOjogICAgICAgICAgICAgICAgICAgICAgVXNpbmcgQU5TSSBDIGZlYXR1cmVzCi0qIFNvdXJjZSBMYW5ndWFnZTo6ICAgICAgICAgICAgIFVzaW5nIGxhbmd1YWdlcyBvdGhlciB0aGFuIEMKLUBlbmQgbWVudQotCi1Abm9kZSBDb21wYXRpYmlsaXR5Ci1Ac2VjdGlvbiBDb21wYXRpYmlsaXR5IHdpdGggT3RoZXIgSW1wbGVtZW50YXRpb25zCi0KLVdpdGggb2NjYXNpb25hbCBleGNlcHRpb25zLCB1dGlsaXR5IHByb2dyYW1zIGFuZCBsaWJyYXJpZXMgZm9yIEdOVQotc2hvdWxkIGJlIHVwd2FyZCBjb21wYXRpYmxlIHdpdGggdGhvc2UgaW4gQmVya2VsZXkgVW5peCwgYW5kIHVwd2FyZAotY29tcGF0aWJsZSB3aXRoIEBzY3thbnNpfSBDIGlmIEBzY3thbnNpfSBDIHNwZWNpZmllcyB0aGVpciBiZWhhdmlvciwgYW5kCi11cHdhcmQgY29tcGF0aWJsZSB3aXRoIEBzY3tQT1NJWH0gaWYgQHNje1BPU0lYfSBzcGVjaWZpZXMgdGhlaXIKLWJlaGF2aW9yLgotCi1XaGVuIHRoZXNlIHN0YW5kYXJkcyBjb25mbGljdCwgaXQgaXMgdXNlZnVsIHRvIG9mZmVyIGNvbXBhdGliaWxpdHkKLW1vZGVzIGZvciBlYWNoIG9mIHRoZW0uCi0KLUBzY3thbnNpfSBDIGFuZCBAc2N7UE9TSVh9IHByb2hpYml0IG1hbnkga2luZHMgb2YgZXh0ZW5zaW9ucy4gIEZlZWwgZnJlZQotdG8gbWFrZSB0aGUgZXh0ZW5zaW9ucyBhbnl3YXksIGFuZCBpbmNsdWRlIGEgQHNhbXB7LS1hbnNpfSwKLUBzYW1wey0tcG9zaXh9LCBvciBAc2FtcHstLWNvbXBhdGlibGV9IG9wdGlvbiB0byB0dXJuIHRoZW0gb2ZmLgotSG93ZXZlciwgaWYgdGhlIGV4dGVuc2lvbiBoYXMgYSBzaWduaWZpY2FudCBjaGFuY2Ugb2YgYnJlYWtpbmcgYW55IHJlYWwKLXByb2dyYW1zIG9yIHNjcmlwdHMsIHRoZW4gaXQgaXMgbm90IHJlYWxseSB1cHdhcmQgY29tcGF0aWJsZS4gIFRyeSB0bwotcmVkZXNpZ24gaXRzIGludGVyZmFjZS4KLQotTWFueSBHTlUgcHJvZ3JhbXMgc3VwcHJlc3MgZXh0ZW5zaW9ucyB0aGF0IGNvbmZsaWN0IHdpdGggUE9TSVggaWYgdGhlCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtQT1NJWExZX0NPUlJFQ1R9IGlzIGRlZmluZWQgKGV2ZW4gaWYgaXQgaXMKLWRlZmluZWQgd2l0aCBhIG51bGwgdmFsdWUpLiAgUGxlYXNlIG1ha2UgeW91ciBwcm9ncmFtIHJlY29nbml6ZSB0aGlzCi12YXJpYWJsZSBpZiBhcHByb3ByaWF0ZS4KLQotV2hlbiBhIGZlYXR1cmUgaXMgdXNlZCBvbmx5IGJ5IHVzZXJzIChub3QgYnkgcHJvZ3JhbXMgb3IgY29tbWFuZAotZmlsZXMpLCBhbmQgaXQgaXMgZG9uZSBwb29ybHkgaW4gVW5peCwgZmVlbCBmcmVlIHRvIHJlcGxhY2UgaXQKLWNvbXBsZXRlbHkgd2l0aCBzb21ldGhpbmcgdG90YWxseSBkaWZmZXJlbnQgYW5kIGJldHRlci4gIChGb3IgZXhhbXBsZSwKLUBjb2Rle3ZpfSBpcyByZXBsYWNlZCB3aXRoIEVtYWNzLikgIEJ1dCBpdCBpcyBuaWNlIHRvIG9mZmVyIGEgY29tcGF0aWJsZQotZmVhdHVyZSBhcyB3ZWxsLiAgKFRoZXJlIGlzIGEgZnJlZSBAY29kZXt2aX0gY2xvbmUsIHNvIHdlIG9mZmVyIGl0LikKLQotQWRkaXRpb25hbCB1c2VmdWwgZmVhdHVyZXMgbm90IGluIEJlcmtlbGV5IFVuaXggYXJlIHdlbGNvbWUuCi0KLUBub2RlIFVzaW5nIEV4dGVuc2lvbnMKLUBzZWN0aW9uIFVzaW5nIE5vbi1zdGFuZGFyZCBGZWF0dXJlcwotCi1NYW55IEdOVSBmYWNpbGl0aWVzIHRoYXQgYWxyZWFkeSBleGlzdCBzdXBwb3J0IGEgbnVtYmVyIG9mIGNvbnZlbmllbnQKLWV4dGVuc2lvbnMgb3ZlciB0aGUgY29tcGFyYWJsZSBVbml4IGZhY2lsaXRpZXMuICBXaGV0aGVyIHRvIHVzZSB0aGVzZQotZXh0ZW5zaW9ucyBpbiBpbXBsZW1lbnRpbmcgeW91ciBwcm9ncmFtIGlzIGEgZGlmZmljdWx0IHF1ZXN0aW9uLgotCi1PbiB0aGUgb25lIGhhbmQsIHVzaW5nIHRoZSBleHRlbnNpb25zIGNhbiBtYWtlIGEgY2xlYW5lciBwcm9ncmFtLgotT24gdGhlIG90aGVyIGhhbmQsIHBlb3BsZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtCi11bmxlc3MgdGhlIG90aGVyIEdOVSB0b29scyBhcmUgYXZhaWxhYmxlLiAgVGhpcyBtaWdodCBjYXVzZSB0aGUKLXByb2dyYW0gdG8gd29yayBvbiBmZXdlciBraW5kcyBvZiBtYWNoaW5lcy4KLQotV2l0aCBzb21lIGV4dGVuc2lvbnMsIGl0IG1pZ2h0IGJlIGVhc3kgdG8gcHJvdmlkZSBib3RoIGFsdGVybmF0aXZlcy4KLUZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBmdW5jdGlvbnMgd2l0aCBhIGBga2V5d29yZCcnIEBjb2Rle0lOTElORX0KLWFuZCBkZWZpbmUgdGhhdCBhcyBhIG1hY3JvIHRvIGV4cGFuZCBpbnRvIGVpdGhlciBAY29kZXtpbmxpbmV9IG9yCi1ub3RoaW5nLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLgotCi1JbiBnZW5lcmFsLCBwZXJoYXBzIGl0IGlzIGJlc3Qgbm90IHRvIHVzZSB0aGUgZXh0ZW5zaW9ucyBpZiB5b3UgY2FuCi1zdHJhaWdodGZvcndhcmRseSBkbyB3aXRob3V0IHRoZW0sIGJ1dCB0byB1c2UgdGhlIGV4dGVuc2lvbnMgaWYgdGhleQotYXJlIGEgYmlnIGltcHJvdmVtZW50LgotCi1BbiBleGNlcHRpb24gdG8gdGhpcyBydWxlIGFyZSB0aGUgbGFyZ2UsIGVzdGFibGlzaGVkIHByb2dyYW1zIChzdWNoIGFzCi1FbWFjcykgd2hpY2ggcnVuIG9uIGEgZ3JlYXQgdmFyaWV0eSBvZiBzeXN0ZW1zLiAgU3VjaCBwcm9ncmFtcyB3b3VsZAotYmUgYnJva2VuIGJ5IHVzZSBvZiBHTlUgZXh0ZW5zaW9ucy4KLQotQW5vdGhlciBleGNlcHRpb24gaXMgZm9yIHByb2dyYW1zIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZgotY29tcGlsYXRpb246IGFueXRoaW5nIHRoYXQgbXVzdCBiZSBjb21waWxlZCB3aXRoIG90aGVyIGNvbXBpbGVycyBpbgotb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBHTlUgY29tcGlsYXRpb24gZmFjaWxpdGllcy4gIElmIHRoZXNlIHJlcXVpcmUKLXRoZSBHTlUgY29tcGlsZXIsIHRoZW4gbm8gb25lIGNhbiBjb21waWxlIHRoZW0gd2l0aG91dCBoYXZpbmcgdGhlbQotaW5zdGFsbGVkIGFscmVhZHkuICBUaGF0IHdvdWxkIGJlIG5vIGdvb2QuCi0KLUBub2RlIEFOU0kgQwotQHNlY3Rpb24gQHNje2Fuc2l9IEMgYW5kIHByZS1Ac2N7YW5zaX0gQwotCi1EbyBub3QgZXZlciB1c2UgdGhlIGBgdHJpZ3JhcGgnJyBmZWF0dXJlIG9mIEBzY3thbnNpfSBDLgotCi1Ac2N7YW5zaX0gQyBpcyB3aWRlc3ByZWFkIGVub3VnaCBub3cgdGhhdCBpdCBpcyBvayB0byB3cml0ZSBuZXcgcHJvZ3JhbXMKLXRoYXQgdXNlIEBzY3thbnNpfSBDIGZlYXR1cmVzIChhbmQgdGhlcmVmb3JlIHdpbGwgbm90IHdvcmsgaW4KLW5vbi1Ac2N7YW5zaX0gY29tcGlsZXJzKS4gIEFuZCBpZiBhIHByb2dyYW0gaXMgYWxyZWFkeSB3cml0dGVuIGluCi1Ac2N7YW5zaX0gQywgdGhlcmUncyBubyBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gc3VwcG9ydCBub24tQHNje2Fuc2l9Ci1jb21waWxlcnMuCi0KLUhvd2V2ZXIsIGl0IGlzIGVhc3kgdG8gc3VwcG9ydCBub24tQHNje2Fuc2l9IGNvbXBpbGVycyBpbiBtb3N0IHByb2dyYW1zLAotc28geW91IG1pZ2h0IHN0aWxsIGNvbnNpZGVyIGRvaW5nIHNvIHdoZW4geW91IHdyaXRlIGEgcHJvZ3JhbS4gIEluc3RlYWQKLW9mIHdyaXRpbmcgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaW4gQHNje2Fuc2l9IHByb3RvdHlwZSBmb3JtLAotCi1AZXhhbXBsZQotaW50Ci1mb28gKGludCB4LCBpbnQgeSkKLUBkb3Rze30KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdyaXRlIHRoZSBkZWZpbml0aW9uIGluIHByZS1Ac2N7YW5zaX0gc3R5bGUgbGlrZSB0aGlzLAotCi1AZXhhbXBsZQotaW50Ci1mb28gKHgsIHkpCi0gICAgIGludCB4LCB5OwotQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotYW5kIHVzZSBhIHNlcGFyYXRlIGRlY2xhcmF0aW9uIHRvIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHByb3RvdHlwZToKLQotQGV4YW1wbGUKLWludCBmb28gKGludCwgaW50KTsKLUBlbmQgZXhhbXBsZQotCi1Zb3UgbmVlZCBzdWNoIGEgZGVjbGFyYXRpb24gYW55d2F5LCBpbiBhIGhlYWRlciBmaWxlLCB0byBnZXQgdGhlIGJlbmVmaXQKLW9mIEBzY3thbnNpfSBDIHByb3RvdHlwZXMgaW4gYWxsIHRoZSBmaWxlcyB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgotQW5kIG9uY2UgeW91IGhhdmUgaXQsIHlvdSBsb3NlIG5vdGhpbmcgYnkgd3JpdGluZyB0aGUgZnVuY3Rpb24KLWRlZmluaXRpb24gaW4gdGhlIHByZS1Ac2N7YW5zaX0gc3R5bGUuCi0KLUlmIHlvdSBkb24ndCBrbm93IG5vbi1Ac2N7YW5zaX0gQywgdGhlcmUncyBubyBuZWVkIHRvIGxlYXJuIGl0OyBqdXN0Ci13cml0ZSBpbiBAc2N7YW5zaX0gQy4KLQotQG5vZGUgU291cmNlIExhbmd1YWdlCi1Ac2VjdGlvbiBVc2luZyBMYW5ndWFnZXMgT3RoZXIgVGhhbiBDCi0KLVVzaW5nIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiBDIGlzIGxpa2UgdXNpbmcgYSBub24tc3RhbmRhcmQgZmVhdHVyZTogaXQKLXdpbGwgY2F1c2UgdHJvdWJsZSBmb3IgdXNlcnMuICBFdmVuIGlmIEdDQyBzdXBwb3J0cyB0aGUgb3RoZXIgbGFuZ3VhZ2UsCi11c2VycyBtYXkgZmluZCBpdCBpbmNvbnZlbmllbnQgdG8gaGF2ZSB0byBpbnN0YWxsIHRoZSBjb21waWxlciBmb3IgdGhhdAotb3RoZXIgbGFuZ3VhZ2UgaW4gb3JkZXIgdG8gYnVpbGQgeW91ciBwcm9ncmFtLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQotd3JpdGUgeW91ciBwcm9ncmFtIGluIEMrKywgcGVvcGxlIHdpbGwgaGF2ZSB0byBpbnN0YWxsIHRoZSBDKysgY29tcGlsZXIKLWluIG9yZGVyIHRvIGNvbXBpbGUgeW91ciBwcm9ncmFtLiAgVGh1cywgaXQgaXMgYmV0dGVyIGlmIHlvdSB3cml0ZSBpbiBDLgotCi1CdXQgdGhlcmUgYXJlIHRocmVlIHNpdHVhdGlvbnMgd2hlbiB0aGVyZSBpcyBubyBkaXNhZHZhbnRhZ2UgaW4gdXNpbmcKLXNvbWUgb3RoZXIgbGFuZ3VhZ2U6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1JdCBpcyBva2F5IHRvIHVzZSBhbm90aGVyIGxhbmd1YWdlIGlmIHlvdXIgcHJvZ3JhbSBjb250YWlucyBhbgotaW50ZXJwcmV0ZXIgZm9yIHRoYXQgbGFuZ3VhZ2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3VyIHByb2dyYW0gbGlua3Mgd2l0aCBHVUlMRSwgaXQgaXMgb2sgdG8gd3JpdGUgcGFydCBvZgotdGhlIHByb2dyYW0gaW4gU2NoZW1lIG9yIGFub3RoZXIgbGFuZ3VhZ2Ugc3VwcG9ydGVkIGJ5IEdVSUxFLgotCi1AaXRlbQotSXQgaXMgb2theSB0byB1c2UgYW5vdGhlciBsYW5ndWFnZSBpbiBhIHRvb2wgc3BlY2lmaWNhbGx5IGludGVuZGVkIGZvcgotdXNlIHdpdGggdGhhdCBsYW5ndWFnZS4KLQotVGhpcyBpcyBva2F5IGJlY2F1c2UgdGhlIG9ubHkgcGVvcGxlIHdobyB3YW50IHRvIGJ1aWxkIHRoZSB0b29sIHdpbGwgYmUKLXRob3NlIHdobyBoYXZlIGluc3RhbGxlZCB0aGUgb3RoZXIgbGFuZ3VhZ2UgYW55d2F5LgotCi1AaXRlbQotSWYgYW4gYXBwbGljYXRpb24gaXMgb2YgaW50ZXJlc3QgdG8gYSBuYXJyb3cgY29tbXVuaXR5LCB0aGVuIHBlcmhhcHMKLWl0J3Mgbm90IGltcG9ydGFudCBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5jb252ZW5pZW50IHRvIGluc3RhbGwuCi1AZW5kIGl0ZW1pemUKLQotQyBoYXMgb25lIG90aGVyIGFkdmFudGFnZSBvdmVyIEMrKyBhbmQgb3RoZXIgY29tcGlsZWQgbGFuZ3VhZ2VzOiBtb3JlCi1wZW9wbGUga25vdyBDLCBzbyBtb3JlIHBlb3BsZSB3aWxsIGZpbmQgaXQgZWFzeSB0byByZWFkIGFuZCBtb2RpZnkgdGhlCi1wcm9ncmFtIGlmIGl0IGlzIHdyaXR0ZW4gaW4gQy4KLQotQG5vZGUgUHJvZ3JhbSBCZWhhdmlvcgotQGNoYXB0ZXIgUHJvZ3JhbSBCZWhhdmlvciBmb3IgQWxsIFByb2dyYW1zCi0KLVRoaXMgQHZhbHVle0NIQVBURVJ9IGRlc2NyaWJlcyBob3cgdG8gd3JpdGUgcm9idXN0IHNvZnR3YXJlLiBJdCBhbHNvCi1kZXNjcmliZXMgZ2VuZXJhbCBzdGFuZGFyZHMgZm9yIGVycm9yIG1lc3NhZ2VzLCB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSwKLWFuZCBob3cgbGlicmFyaWVzIHNob3VsZCBiZWhhdmUuCi0KLUBtZW51Ci0qIFNlbWFudGljczo6ICAgICAgICAgICAgICAgICAgIFdyaXRpbmcgcm9idXN0IHByb2dyYW1zCi0qIExpYnJhcmllczo6ICAgICAgICAgICAgICAgICAgIExpYnJhcnkgYmVoYXZpb3IKLSogRXJyb3JzOjogICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcwotKiBVc2VyIEludGVyZmFjZXM6OiAgICAgICAgICAgICBTdGFuZGFyZHMgZm9yIGNvbW1hbmQgbGluZSBpbnRlcmZhY2VzCi0qIE9wdGlvbiBUYWJsZTo6ICAgICAgICAgICAgICAgIFRhYmxlIG9mIGxvbmcgb3B0aW9ucy4KLSogTWVtb3J5IFVzYWdlOjogICAgICAgICAgICAgICAgV2hlbiBhbmQgaG93IHRvIGNhcmUgYWJvdXQgbWVtb3J5IG5lZWRzCi1AZW5kIG1lbnUKLQotQG5vZGUgU2VtYW50aWNzCi1Ac2VjdGlvbiBXcml0aW5nIFJvYnVzdCBQcm9ncmFtcwotCi1Bdm9pZCBhcmJpdHJhcnkgbGltaXRzIG9uIHRoZSBsZW5ndGggb3IgbnVtYmVyIG9mIEBlbXBoe2FueX0gZGF0YQotc3RydWN0dXJlLCBpbmNsdWRpbmcgZmlsZSBuYW1lcywgbGluZXMsIGZpbGVzLCBhbmQgc3ltYm9scywgYnkgYWxsb2NhdGluZwotYWxsIGRhdGEgc3RydWN0dXJlcyBkeW5hbWljYWxseS4gIEluIG1vc3QgVW5peCB1dGlsaXRpZXMsIGBgbG9uZyBsaW5lcwotYXJlIHNpbGVudGx5IHRydW5jYXRlZCcnLiAgVGhpcyBpcyBub3QgYWNjZXB0YWJsZSBpbiBhIEdOVSB1dGlsaXR5LgotCi1VdGlsaXRpZXMgcmVhZGluZyBmaWxlcyBzaG91bGQgbm90IGRyb3AgTlVMIGNoYXJhY3RlcnMsIG9yIGFueSBvdGhlcgotbm9ucHJpbnRpbmcgY2hhcmFjdGVycyBAZW1waHtpbmNsdWRpbmcgdGhvc2Ugd2l0aCBjb2RlcyBhYm92ZSAwMTc3fS4gIFRoZQotb25seSBzZW5zaWJsZSBleGNlcHRpb25zIHdvdWxkIGJlIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgaW50ZW5kZWQgZm9yCi1pbnRlcmZhY2UgdG8gY2VydGFpbiB0eXBlcyBvZiBwcmludGVycyB0aGF0IGNhbid0IGhhbmRsZSB0aG9zZSBjaGFyYWN0ZXJzLgotCi1DaGVjayBldmVyeSBzeXN0ZW0gY2FsbCBmb3IgYW4gZXJyb3IgcmV0dXJuLCB1bmxlc3MgeW91IGtub3cgeW91IHdpc2ggdG8KLWlnbm9yZSBlcnJvcnMuICBJbmNsdWRlIHRoZSBzeXN0ZW0gZXJyb3IgdGV4dCAoZnJvbSBAY29kZXtwZXJyb3J9IG9yCi1lcXVpdmFsZW50KSBpbiBAZW1waHtldmVyeX0gZXJyb3IgbWVzc2FnZSByZXN1bHRpbmcgZnJvbSBhIGZhaWxpbmcKLXN5c3RlbSBjYWxsLCBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlmIGFueSBhbmQgdGhlIG5hbWUgb2YgdGhlCi11dGlsaXR5LiAgSnVzdCBgYGNhbm5vdCBvcGVuIGZvby5jJycgb3IgYGBzdGF0IGZhaWxlZCcnIGlzIG5vdAotc3VmZmljaWVudC4KLQotQ2hlY2sgZXZlcnkgY2FsbCB0byBAY29kZXttYWxsb2N9IG9yIEBjb2Rle3JlYWxsb2N9IHRvIHNlZSBpZiBpdAotcmV0dXJuZWQgemVyby4gIENoZWNrIEBjb2Rle3JlYWxsb2N9IGV2ZW4gaWYgeW91IGFyZSBtYWtpbmcgdGhlIGJsb2NrCi1zbWFsbGVyOyBpbiBhIHN5c3RlbSB0aGF0IHJvdW5kcyBibG9jayBzaXplcyB0byBhIHBvd2VyIG9mIDIsCi1AY29kZXtyZWFsbG9jfSBtYXkgZ2V0IGEgZGlmZmVyZW50IGJsb2NrIGlmIHlvdSBhc2sgZm9yIGxlc3Mgc3BhY2UuCi0KLUluIFVuaXgsIEBjb2Rle3JlYWxsb2N9IGNhbiBkZXN0cm95IHRoZSBzdG9yYWdlIGJsb2NrIGlmIGl0IHJldHVybnMKLXplcm8uICBHTlUgQGNvZGV7cmVhbGxvY30gZG9lcyBub3QgaGF2ZSB0aGlzIGJ1ZzogaWYgaXQgZmFpbHMsIHRoZQotb3JpZ2luYWwgYmxvY2sgaXMgdW5jaGFuZ2VkLiAgRmVlbCBmcmVlIHRvIGFzc3VtZSB0aGUgYnVnIGlzIGZpeGVkLiAgSWYKLXlvdSB3aXNoIHRvIHJ1biB5b3VyIHByb2dyYW0gb24gVW5peCwgYW5kIHdpc2ggdG8gYXZvaWQgbG9zc2FnZSBpbiB0aGlzCi1jYXNlLCB5b3UgY2FuIHVzZSB0aGUgR05VIEBjb2Rle21hbGxvY30uCi0KLVlvdSBtdXN0IGV4cGVjdCBAY29kZXtmcmVlfSB0byBhbHRlciB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIHRoYXQgd2FzCi1mcmVlZC4gIEFueXRoaW5nIHlvdSB3YW50IHRvIGZldGNoIGZyb20gdGhlIGJsb2NrLCB5b3UgbXVzdCBmZXRjaCBiZWZvcmUKLWNhbGxpbmcgQGNvZGV7ZnJlZX0uCi0KLUlmIEBjb2Rle21hbGxvY30gZmFpbHMgaW4gYSBub25pbnRlcmFjdGl2ZSBwcm9ncmFtLCBtYWtlIHRoYXQgYSBmYXRhbAotZXJyb3IuICBJbiBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIChvbmUgdGhhdCByZWFkcyBjb21tYW5kcyBmcm9tIHRoZQotdXNlciksIGl0IGlzIGJldHRlciB0byBhYm9ydCB0aGUgY29tbWFuZCBhbmQgcmV0dXJuIHRvIHRoZSBjb21tYW5kCi1yZWFkZXIgbG9vcC4gIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGtpbGwgb3RoZXIgcHJvY2Vzc2VzIHRvIGZyZWUgdXAKLXZpcnR1YWwgbWVtb3J5LCBhbmQgdGhlbiB0cnkgdGhlIGNvbW1hbmQgYWdhaW4uCi0KLVVzZSBAY29kZXtnZXRvcHRfbG9uZ30gdG8gZGVjb2RlIGFyZ3VtZW50cywgdW5sZXNzIHRoZSBhcmd1bWVudCBzeW50YXgKLW1ha2VzIHRoaXMgdW5yZWFzb25hYmxlLgotCi1XaGVuIHN0YXRpYyBzdG9yYWdlIGlzIHRvIGJlIHdyaXR0ZW4gaW4gZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLCB1c2UKLWV4cGxpY2l0IEMgY29kZSB0byBpbml0aWFsaXplIGl0LiAgUmVzZXJ2ZSBDIGluaXRpYWxpemVkIGRlY2xhcmF0aW9ucwotZm9yIGRhdGEgdGhhdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgotQGMgQURSOiB3aHk/Ci0KLVRyeSB0byBhdm9pZCBsb3ctbGV2ZWwgaW50ZXJmYWNlcyB0byBvYnNjdXJlIFVuaXggZGF0YSBzdHJ1Y3R1cmVzIChzdWNoCi1hcyBmaWxlIGRpcmVjdG9yaWVzLCB1dG1wLCBvciB0aGUgbGF5b3V0IG9mIGtlcm5lbCBtZW1vcnkpLCBzaW5jZSB0aGVzZQotYXJlIGxlc3MgbGlrZWx5IHRvIHdvcmsgY29tcGF0aWJseS4gIElmIHlvdSBuZWVkIHRvIGZpbmQgYWxsIHRoZSBmaWxlcwotaW4gYSBkaXJlY3RvcnksIHVzZSBAY29kZXtyZWFkZGlyfSBvciBzb21lIG90aGVyIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlLgotVGhlc2Ugd2lsbCBiZSBzdXBwb3J0ZWQgY29tcGF0aWJseSBieSBHTlUuCi0KLUJ5IGRlZmF1bHQsIHRoZSBHTlUgc3lzdGVtIHdpbGwgcHJvdmlkZSB0aGUgc2lnbmFsIGhhbmRsaW5nIGZ1bmN0aW9ucyBvZgotQHNje0JTRH0gYW5kIG9mIEBzY3tQT1NJWH0uICBTbyBHTlUgc29mdHdhcmUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdXNlCi10aGVzZS4KLQotSW4gZXJyb3IgY2hlY2tzIHRoYXQgZGV0ZWN0IGBgaW1wb3NzaWJsZScnIGNvbmRpdGlvbnMsIGp1c3QgYWJvcnQuCi1UaGVyZSBpcyB1c3VhbGx5IG5vIHBvaW50IGluIHByaW50aW5nIGFueSBtZXNzYWdlLiAgVGhlc2UgY2hlY2tzCi1pbmRpY2F0ZSB0aGUgZXhpc3RlbmNlIG9mIGJ1Z3MuICBXaG9ldmVyIHdhbnRzIHRvIGZpeCB0aGUgYnVncyB3aWxsIGhhdmUKLXRvIHJlYWQgdGhlIHNvdXJjZSBjb2RlIGFuZCBydW4gYSBkZWJ1Z2dlci4gIFNvIGV4cGxhaW4gdGhlIHByb2JsZW0gd2l0aAotY29tbWVudHMgaW4gdGhlIHNvdXJjZS4gIFRoZSByZWxldmFudCBkYXRhIHdpbGwgYmUgaW4gdmFyaWFibGVzLCB3aGljaAotYXJlIGVhc3kgdG8gZXhhbWluZSB3aXRoIHRoZSBkZWJ1Z2dlciwgc28gdGhlcmUgaXMgbm8gcG9pbnQgbW92aW5nIHRoZW0KLWVsc2V3aGVyZS4KLQotRG8gbm90IHVzZSBhIGNvdW50IG9mIGVycm9ycyBhcyB0aGUgZXhpdCBzdGF0dXMgZm9yIGEgcHJvZ3JhbS4KLUBlbXBoe1RoYXQgZG9lcyBub3Qgd29ya30sIGJlY2F1c2UgZXhpdCBzdGF0dXMgdmFsdWVzIGFyZSBsaW1pdGVkIHRvIDgKLWJpdHMgKDAgdGhyb3VnaCAyNTUpLiAgQSBzaW5nbGUgcnVuIG9mIHRoZSBwcm9ncmFtIG1pZ2h0IGhhdmUgMjU2Ci1lcnJvcnM7IGlmIHlvdSB0cnkgdG8gcmV0dXJuIDI1NiBhcyB0aGUgZXhpdCBzdGF0dXMsIHRoZSBwYXJlbnQgcHJvY2Vzcwotd2lsbCBzZWUgMCBhcyB0aGUgc3RhdHVzLCBhbmQgaXQgd2lsbCBhcHBlYXIgdGhhdCB0aGUgcHJvZ3JhbSBzdWNjZWVkZWQuCi0KLUlmIHlvdSBtYWtlIHRlbXBvcmFyeSBmaWxlcywgY2hlY2sgdGhlIEBjb2Rle1RNUERJUn0gZW52aXJvbm1lbnQKLXZhcmlhYmxlOyBpZiB0aGF0IHZhcmlhYmxlIGlzIGRlZmluZWQsIHVzZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotaW5zdGVhZCBvZiBAZmlsZXsvdG1wfS4KLQotQG5vZGUgTGlicmFyaWVzCi1Ac2VjdGlvbiBMaWJyYXJ5IEJlaGF2aW9yCi0KLVRyeSB0byBtYWtlIGxpYnJhcnkgZnVuY3Rpb25zIHJlZW50cmFudC4gIElmIHRoZXkgbmVlZCB0byBkbyBkeW5hbWljCi1zdG9yYWdlIGFsbG9jYXRpb24sIGF0IGxlYXN0IHRyeSB0byBhdm9pZCBhbnkgbm9ucmVlbnRyYW5jeSBhc2lkZSBmcm9tCi10aGF0IG9mIEBjb2Rle21hbGxvY30gaXRzZWxmLgotCi1IZXJlIGFyZSBjZXJ0YWluIG5hbWUgY29udmVudGlvbnMgZm9yIGxpYnJhcmllcywgdG8gYXZvaWQgbmFtZQotY29uZmxpY3RzLgotCi1DaG9vc2UgYSBuYW1lIHByZWZpeCBmb3IgdGhlIGxpYnJhcnksIG1vcmUgdGhhbiB0d28gY2hhcmFjdGVycyBsb25nLgotQWxsIGV4dGVybmFsIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBuYW1lcyBzaG91bGQgc3RhcnQgd2l0aCB0aGlzCi1wcmVmaXguICBJbiBhZGRpdGlvbiwgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIG9mIHRoZXNlIGluIGFueSBnaXZlbgotbGlicmFyeSBtZW1iZXIuICBUaGlzIHVzdWFsbHkgbWVhbnMgcHV0dGluZyBlYWNoIG9uZSBpbiBhIHNlcGFyYXRlCi1zb3VyY2UgZmlsZS4KLQotQW4gZXhjZXB0aW9uIGNhbiBiZSBtYWRlIHdoZW4gdHdvIGV4dGVybmFsIHN5bWJvbHMgYXJlIGFsd2F5cyB1c2VkCi10b2dldGhlciwgc28gdGhhdCBubyByZWFzb25hYmxlIHByb2dyYW0gY291bGQgdXNlIG9uZSB3aXRob3V0IHRoZQotb3RoZXI7IHRoZW4gdGhleSBjYW4gYm90aCBnbyBpbiB0aGUgc2FtZSBmaWxlLgotCi1FeHRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBkb2N1bWVudGVkIGVudHJ5IHBvaW50cyBmb3IgdGhlIHVzZXIKLXNob3VsZCBoYXZlIG5hbWVzIGJlZ2lubmluZyB3aXRoIEBzYW1we199LiAgVGhleSBzaG91bGQgYWxzbyBjb250YWluCi10aGUgY2hvc2VuIG5hbWUgcHJlZml4IGZvciB0aGUgbGlicmFyeSwgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGgKLW90aGVyIGxpYnJhcmllcy4gIFRoZXNlIGNhbiBnbyBpbiB0aGUgc2FtZSBmaWxlcyB3aXRoIHVzZXIgZW50cnkKLXBvaW50cyBpZiB5b3UgbGlrZS4KLQotU3RhdGljIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGNhbiBiZSB1c2VkIGFzIHlvdSBsaWtlIGFuZCBuZWVkIG5vdAotZml0IGFueSBuYW1pbmcgY29udmVudGlvbi4KLQotQG5vZGUgRXJyb3JzCi1Ac2VjdGlvbiBGb3JtYXR0aW5nIEVycm9yIE1lc3NhZ2VzCi0KLUVycm9yIG1lc3NhZ2VzIGZyb20gY29tcGlsZXJzIHNob3VsZCBsb29rIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLUB2YXJ7c291cmNlLWZpbGUtbmFtZX06QHZhcntsaW5lbm99OiBAdmFye21lc3NhZ2V9Ci1AZW5kIGV4YW1wbGUKLQotRXJyb3IgbWVzc2FnZXMgZnJvbSBvdGhlciBub25pbnRlcmFjdGl2ZSBwcm9ncmFtcyBzaG91bGQgbG9vayBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye3Byb2dyYW19OkB2YXJ7c291cmNlLWZpbGUtbmFtZX06QHZhcntsaW5lbm99OiBAdmFye21lc3NhZ2V9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVuIHRoZXJlIGlzIGFuIGFwcHJvcHJpYXRlIHNvdXJjZSBmaWxlLCBvciBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye3Byb2dyYW19OiBAdmFye21lc3NhZ2V9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVuIHRoZXJlIGlzIG5vIHJlbGV2YW50IHNvdXJjZSBmaWxlLgotCi1JbiBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIChvbmUgdGhhdCBpcyByZWFkaW5nIGNvbW1hbmRzIGZyb20gYQotdGVybWluYWwpLCBpdCBpcyBiZXR0ZXIgbm90IHRvIGluY2x1ZGUgdGhlIHByb2dyYW0gbmFtZSBpbiBhbiBlcnJvcgotbWVzc2FnZS4gIFRoZSBwbGFjZSB0byBpbmRpY2F0ZSB3aGljaCBwcm9ncmFtIGlzIHJ1bm5pbmcgaXMgaW4gdGhlCi1wcm9tcHQgb3Igd2l0aCB0aGUgc2NyZWVuIGxheW91dC4gIChXaGVuIHRoZSBzYW1lIHByb2dyYW0gcnVucyB3aXRoCi1pbnB1dCBmcm9tIGEgc291cmNlIG90aGVyIHRoYW4gYSB0ZXJtaW5hbCwgaXQgaXMgbm90IGludGVyYWN0aXZlIGFuZAotd291bGQgZG8gYmVzdCB0byBwcmludCBlcnJvciBtZXNzYWdlcyB1c2luZyB0aGUgbm9uaW50ZXJhY3RpdmUgc3R5bGUuKQotCi1UaGUgc3RyaW5nIEB2YXJ7bWVzc2FnZX0gc2hvdWxkIG5vdCBiZWdpbiB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgd2hlbgotaXQgZm9sbG93cyBhIHByb2dyYW0gbmFtZSBhbmQvb3IgZmlsZSBuYW1lLiAgQWxzbywgaXQgc2hvdWxkIG5vdCBlbmQKLXdpdGggYSBwZXJpb2QuCi0KLUVycm9yIG1lc3NhZ2VzIGZyb20gaW50ZXJhY3RpdmUgcHJvZ3JhbXMsIGFuZCBvdGhlciBtZXNzYWdlcyBzdWNoIGFzCi11c2FnZSBtZXNzYWdlcywgc2hvdWxkIHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlci4gIEJ1dCB0aGV5IHNob3VsZCBub3QKLWVuZCB3aXRoIGEgcGVyaW9kLgotCi1Abm9kZSBVc2VyIEludGVyZmFjZXMKLUBzZWN0aW9uIFN0YW5kYXJkcyBmb3IgQ29tbWFuZCBMaW5lIEludGVyZmFjZXMKLQotUGxlYXNlIGRvbid0IG1ha2UgdGhlIGJlaGF2aW9yIG9mIGEgdXRpbGl0eSBkZXBlbmQgb24gdGhlIG5hbWUgdXNlZAotdG8gaW52b2tlIGl0LiAgSXQgaXMgdXNlZnVsIHNvbWV0aW1lcyB0byBtYWtlIGEgbGluayB0byBhIHV0aWxpdHkKLXdpdGggYSBkaWZmZXJlbnQgbmFtZSwgYW5kIHRoYXQgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hhdCBpdCBkb2VzLgotCi1JbnN0ZWFkLCB1c2UgYSBydW4gdGltZSBvcHRpb24gb3IgYSBjb21waWxhdGlvbiBzd2l0Y2ggb3IgYm90aAotdG8gc2VsZWN0IGFtb25nIHRoZSBhbHRlcm5hdGUgYmVoYXZpb3JzLgotCi1MaWtld2lzZSwgcGxlYXNlIGRvbid0IG1ha2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9ncmFtIGRlcGVuZCBvbiB0aGUKLXR5cGUgb2Ygb3V0cHV0IGRldmljZSBpdCBpcyB1c2VkIHdpdGguICBEZXZpY2UgaW5kZXBlbmRlbmNlIGlzIGFuCi1pbXBvcnRhbnQgcHJpbmNpcGxlIG9mIHRoZSBzeXN0ZW0ncyBkZXNpZ247IGRvIG5vdCBjb21wcm9taXNlIGl0Ci1tZXJlbHkgdG8gc2F2ZSBzb21lb25lIGZyb20gdHlwaW5nIGFuIG9wdGlvbiBub3cgYW5kIHRoZW4uCi0KLUlmIHlvdSB0aGluayBvbmUgYmVoYXZpb3IgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgb3V0cHV0IGlzIHRvIGEKLXRlcm1pbmFsLCBhbmQgYW5vdGhlciBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBvdXRwdXQgaXMgYSBmaWxlIG9yIGEKLXBpcGUsIHRoZW4gaXQgaXMgdXN1YWxseSBiZXN0IHRvIG1ha2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdGhlIG9uZSB0aGF0Ci1pcyB1c2VmdWwgd2l0aCBvdXRwdXQgdG8gYSB0ZXJtaW5hbCwgYW5kIGhhdmUgYW4gb3B0aW9uIGZvciB0aGUgb3RoZXIKLWJlaGF2aW9yLgotCi1Db21wYXRpYmlsaXR5IHJlcXVpcmVzIGNlcnRhaW4gcHJvZ3JhbXMgdG8gZGVwZW5kIG9uIHRoZSB0eXBlIG9mIG91dHB1dAotZGV2aWNlLiAgSXQgd291bGQgYmUgZGlzYXN0cm91cyBpZiBAY29kZXtsc30gb3IgQGNvZGV7c2h9IGRpZCBub3QgZG8gc28KLWluIHRoZSB3YXkgYWxsIHVzZXJzIGV4cGVjdC4gIEluIHNvbWUgb2YgdGhlc2UgY2FzZXMsIHdlIHN1cHBsZW1lbnQgdGhlCi1wcm9ncmFtIHdpdGggYSBwcmVmZXJyZWQgYWx0ZXJuYXRlIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlCi1vdXRwdXQgZGV2aWNlIHR5cGUuICBGb3IgZXhhbXBsZSwgd2UgcHJvdmlkZSBhIEBjb2Rle2Rpcn0gcHJvZ3JhbSBtdWNoCi1saWtlIEBjb2Rle2xzfSBleGNlcHQgdGhhdCBpdHMgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IGlzIGFsd2F5cwotbXVsdGktY29sdW1uIGZvcm1hdC4KLQotSXQgaXMgYSBnb29kIGlkZWEgdG8gZm9sbG93IHRoZSBAc2N7UE9TSVh9IGd1aWRlbGluZXMgZm9yIHRoZQotY29tbWFuZC1saW5lIG9wdGlvbnMgb2YgYSBwcm9ncmFtLiAgVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdXNlCi1AY29kZXtnZXRvcHR9IHRvIHBhcnNlIHRoZW0uICBOb3RlIHRoYXQgdGhlIEdOVSB2ZXJzaW9uIG9mIEBjb2Rle2dldG9wdH0KLXdpbGwgbm9ybWFsbHkgcGVybWl0IG9wdGlvbnMgYW55d2hlcmUgYW1vbmcgdGhlIGFyZ3VtZW50cyB1bmxlc3MgdGhlCi1zcGVjaWFsIGFyZ3VtZW50IEBzYW1wey0tfSBpcyB1c2VkLiAgVGhpcyBpcyBub3Qgd2hhdCBAc2N7UE9TSVh9Ci1zcGVjaWZpZXM7IGl0IGlzIGEgR05VIGV4dGVuc2lvbi4KLQotUGxlYXNlIGRlZmluZSBsb25nLW5hbWVkIG9wdGlvbnMgdGhhdCBhcmUgZXF1aXZhbGVudCB0byB0aGUKLXNpbmdsZS1sZXR0ZXIgVW5peC1zdHlsZSBvcHRpb25zLiAgV2UgaG9wZSB0byBtYWtlIEdOVSBtb3JlIHVzZXIKLWZyaWVuZGx5IHRoaXMgd2F5LiAgVGhpcyBpcyBlYXN5IHRvIGRvIHdpdGggdGhlIEdOVSBmdW5jdGlvbgotQGNvZGV7Z2V0b3B0X2xvbmd9LgotCi1PbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgbG9uZy1uYW1lZCBvcHRpb25zIGlzIHRoYXQgdGhleSBjYW4gYmUKLWNvbnNpc3RlbnQgZnJvbSBwcm9ncmFtIHRvIHByb2dyYW0uICBGb3IgZXhhbXBsZSwgdXNlcnMgc2hvdWxkIGJlIGFibGUKLXRvIGV4cGVjdCB0aGUgYGB2ZXJib3NlJycgb3B0aW9uIG9mIGFueSBHTlUgcHJvZ3JhbSB3aGljaCBoYXMgb25lLCB0byBiZQotc3BlbGxlZCBwcmVjaXNlbHkgQHNhbXB7LS12ZXJib3NlfS4gIFRvIGFjaGlldmUgdGhpcyB1bmlmb3JtaXR5LCBsb29rIGF0Ci10aGUgdGFibGUgb2YgY29tbW9uIGxvbmctb3B0aW9uIG5hbWVzIHdoZW4geW91IGNob29zZSB0aGUgb3B0aW9uIG5hbWVzCi1mb3IgeW91ciBwcm9ncmFtIChAcHhyZWZ7T3B0aW9uIFRhYmxlfSkuCi0KLUl0IGlzIHVzdWFsbHkgYSBnb29kIGlkZWEgZm9yIGZpbGUgbmFtZXMgZ2l2ZW4gYXMgb3JkaW5hcnkgYXJndW1lbnRzIHRvCi1iZSBpbnB1dCBmaWxlcyBvbmx5OyBhbnkgb3V0cHV0IGZpbGVzIHdvdWxkIGJlIHNwZWNpZmllZCB1c2luZyBvcHRpb25zCi0ocHJlZmVyYWJseSBAc2FtcHstb30gb3IgQHNhbXB7LS1vdXRwdXR9KS4gIEV2ZW4gaWYgeW91IGFsbG93IGFuIG91dHB1dAotZmlsZSBuYW1lIGFzIGFuIG9yZGluYXJ5IGFyZ3VtZW50IGZvciBjb21wYXRpYmlsaXR5LCB0cnkgdG8gcHJvdmlkZSBhbgotb3B0aW9uIGFzIGFub3RoZXIgd2F5IHRvIHNwZWNpZnkgaXQuICBUaGlzIHdpbGwgbGVhZCB0byBtb3JlIGNvbnNpc3RlbmN5Ci1hbW9uZyBHTlUgdXRpbGl0aWVzLCBhbmQgZmV3ZXIgaWRpb3N5bmNyYWNpZXMgZm9yIHVzZXJzIHRvIHJlbWVtYmVyLgotCi1BbGwgcHJvZ3JhbXMgc2hvdWxkIHN1cHBvcnQgdHdvIHN0YW5kYXJkIG9wdGlvbnM6IEBzYW1wey0tdmVyc2lvbn0KLWFuZCBAc2FtcHstLWhlbHB9LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC0tdmVyc2lvbgotVGhpcyBvcHRpb24gc2hvdWxkIGRpcmVjdCB0aGUgcHJvZ3JhbSB0byBpbmZvcm1hdGlvbiBhYm91dCBpdHMgbmFtZSwKLXZlcnNpb24sIG9yaWdpbiBhbmQgbGVnYWwgc3RhdHVzLCBhbGwgb24gc3RhbmRhcmQgb3V0cHV0LCBhbmQgdGhlbiBleGl0Ci1zdWNjZXNzZnVsbHkuICBPdGhlciBvcHRpb25zIGFuZCBhcmd1bWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb25jZSB0aGlzCi1pcyBzZWVuLCBhbmQgdGhlIHByb2dyYW0gc2hvdWxkIG5vdCBwZXJmb3JtIGl0cyBub3JtYWwgZnVuY3Rpb24uCi0KLVRoZSBmaXJzdCBsaW5lIGlzIG1lYW50IHRvIGJlIGVhc3kgZm9yIGEgcHJvZ3JhbSB0byBwYXJzZTsgdGhlIHZlcnNpb24KLW51bWJlciBwcm9wZXIgc3RhcnRzIGFmdGVyIHRoZSBsYXN0IHNwYWNlLiAgSW4gYWRkaXRpb24sIGl0IGNvbnRhaW5zCi10aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoaXMgcHJvZ3JhbSwgaW4gdGhpcyBmb3JtYXQ6Ci0KLUBleGFtcGxlCi1HTlUgRW1hY3MgMTkuMzAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBwcm9ncmFtJ3MgbmFtZSBzaG91bGQgYmUgYSBjb25zdGFudCBzdHJpbmc7IEBlbXBoe2Rvbid0fSBjb21wdXRlIGl0Ci1mcm9tIEBjb2Rle2FyZ3ZbMF19LiAgVGhlIGlkZWEgaXMgdG8gc3RhdGUgdGhlIHN0YW5kYXJkIG9yIGNhbm9uaWNhbAotbmFtZSBmb3IgdGhlIHByb2dyYW0sIG5vdCBpdHMgZmlsZSBuYW1lLiAgVGhlcmUgYXJlIG90aGVyIHdheXMgdG8gZmluZAotb3V0IHRoZSBwcmVjaXNlIGZpbGUgbmFtZSB3aGVyZSBhIGNvbW1hbmQgaXMgZm91bmQgaW4gQGNvZGV7UEFUSH0uCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGEgc3Vic2lkaWFyeSBwYXJ0IG9mIGEgbGFyZ2VyIHBhY2thZ2UsIG1lbnRpb24gdGhlCi1wYWNrYWdlIG5hbWUgaW4gcGFyZW50aGVzZXMsIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWVtYWNzc2VydmVyIChHTlUgRW1hY3MpIDE5LjMwCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1JZiB0aGUgcGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzCi1wcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIsIHlvdSBjYW4gbWVudGlvbiB0aGUgcGFja2FnZSB2ZXJzaW9uIG51bWJlcgotanVzdCBiZWZvcmUgdGhlIGNsb3NlLXBhcmVudGhlc2lzLgotCi1JZiB5b3UgQHN0cm9uZ3tuZWVkfSB0byBtZW50aW9uIHRoZSB2ZXJzaW9uIG51bWJlcnMgb2YgbGlicmFyaWVzIHdoaWNoCi1hcmUgZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIHRoaXMgcHJvZ3JhbSwKLXlvdSBjYW4gZG8gc28gYnkgcHJpbnRpbmcgYW4gYWRkaXRpb25hbCBsaW5lIG9mIHZlcnNpb24gaW5mbyBmb3IgZWFjaAotbGlicmFyeSB5b3Ugd2FudCB0byBtZW50aW9uLiAgVXNlIHRoZSBzYW1lIGZvcm1hdCBmb3IgdGhlc2UgbGluZXMgYXMgZm9yCi10aGUgZmlyc3QgbGluZS4KLQotUGxlYXNlIGRvIG5vdCBtZW50aW9uIGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgdGhlIHByb2dyYW0gdXNlcyBgYGp1c3QKLWZvciBjb21wbGV0ZW5lc3MnJy0tLXRoYXQgd291bGQgcHJvZHVjZSBhIGxvdCBvZiB1bmhlbHBmdWwgY2x1dHRlci4KLVBsZWFzZSBtZW50aW9uIGxpYnJhcnkgdmVyc2lvbiBudW1iZXJzIG9ubHkgaWYgeW91IGZpbmQgaW4gcHJhY3RpY2UgdGhhdAotdGhleSBhcmUgdmVyeSBpbXBvcnRhbnQgdG8geW91IGluIGRlYnVnZ2luZy4KLQotVGhlIGZvbGxvd2luZyBsaW5lLCBhZnRlciB0aGUgdmVyc2lvbiBudW1iZXIgbGluZSBvciBsaW5lcywgc2hvdWxkIGJlIGEKLWNvcHlyaWdodCBub3RpY2UuICBJZiBtb3JlIHRoYW4gb25lIGNvcHlyaWdodCBub3RpY2UgaXMgY2FsbGVkIGZvciwgcHV0Ci1lYWNoIG9uIGEgc2VwYXJhdGUgbGluZS4KLQotTmV4dCBzaG91bGQgZm9sbG93IGEgYnJpZWYgc3RhdGVtZW50IHRoYXQgdGhlIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZSwKLWFuZCB0aGF0IHVzZXJzIGFyZSBmcmVlIHRvIGNvcHkgYW5kIGNoYW5nZSBpdCBvbiBjZXJ0YWluIGNvbmRpdGlvbnMuICBJZgotdGhlIHByb2dyYW0gaXMgY292ZXJlZCBieSB0aGUgR05VIEdQTCwgc2F5IHNvIGhlcmUuICBBbHNvIG1lbnRpb24gdGhhdAotdGhlcmUgaXMgbm8gd2FycmFudHksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy4KLQotSXQgaXMgb2sgdG8gZmluaXNoIHRoZSBvdXRwdXQgd2l0aCBhIGxpc3Qgb2YgdGhlIG1ham9yIGF1dGhvcnMgb2YgdGhlCi1wcm9ncmFtLCBhcyBhIHdheSBvZiBnaXZpbmcgY3JlZGl0LgotCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiBvdXRwdXQgdGhhdCBmb2xsb3dzIHRoZXNlIHJ1bGVzOgotCi1Ac21hbGxleGFtcGxlCi1HTlUgRW1hY3MgMTkuMzQuNQotQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotR05VIEVtYWNzIGNvbWVzIHdpdGggTk8gV0FSUkFOVFksCi10byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuCi1Zb3UgbWF5IHJlZGlzdHJpYnV0ZSBjb3BpZXMgb2YgR05VIEVtYWNzCi11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgbWF0dGVycywKLXNlZSB0aGUgZmlsZXMgbmFtZWQgQ09QWUlORy4KLUBlbmQgc21hbGxleGFtcGxlCi0KLVlvdSBzaG91bGQgYWRhcHQgdGhpcyB0byB5b3VyIHByb2dyYW0sIG9mIGNvdXJzZSwgZmlsbGluZyBpbiB0aGUgcHJvcGVyCi15ZWFyLCBjb3B5cmlnaHQgaG9sZGVyLCBuYW1lIG9mIHByb2dyYW0sIGFuZCB0aGUgcmVmZXJlbmNlcyB0bwotZGlzdHJpYnV0aW9uIHRlcm1zLCBhbmQgY2hhbmdpbmcgdGhlIHJlc3Qgb2YgdGhlIHdvcmRpbmcgYXMgbmVjZXNzYXJ5LgotCi1UaGlzIGNvcHlyaWdodCBub3RpY2Ugb25seSBuZWVkcyB0byBtZW50aW9uIHRoZSBtb3N0IHJlY2VudCB5ZWFyIGluCi13aGljaCBjaGFuZ2VzIHdlcmUgbWFkZS0tLXRoZXJlJ3Mgbm8gbmVlZCB0byBsaXN0IHRoZSB5ZWFycyBmb3IgcHJldmlvdXMKLXZlcnNpb25zJyBjaGFuZ2VzLiAgWW91IGRvbid0IGhhdmUgdG8gbWVudGlvbiB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBpbgotdGhlc2Ugbm90aWNlcywgaWYgdGhhdCBpcyBpbmNvbnZlbmllbnQsIHNpbmNlIGl0IGFwcGVhcmVkIGluIHRoZSBmaXJzdAotbGluZS4KLQotQGl0ZW0gLS1oZWxwCi1UaGlzIG9wdGlvbiBzaG91bGQgb3V0cHV0IGJyaWVmIGRvY3VtZW50YXRpb24gZm9yIGhvdyB0byBpbnZva2UgdGhlCi1wcm9ncmFtLCBvbiBzdGFuZGFyZCBvdXRwdXQsIHRoZW4gZXhpdCBzdWNjZXNzZnVsbHkuICBPdGhlciBvcHRpb25zIGFuZAotYXJndW1lbnRzIHNob3VsZCBiZSBpZ25vcmVkIG9uY2UgdGhpcyBpcyBzZWVuLCBhbmQgdGhlIHByb2dyYW0gc2hvdWxkCi1ub3QgcGVyZm9ybSBpdHMgbm9ybWFsIGZ1bmN0aW9uLgotCi1OZWFyIHRoZSBlbmQgb2YgdGhlIEBzYW1wey0taGVscH0gb3B0aW9uJ3Mgb3V0cHV0IHRoZXJlIHNob3VsZCBiZSBhIGxpbmUKLXRoYXQgc2F5cyB3aGVyZSB0byBtYWlsIGJ1ZyByZXBvcnRzLiAgSXQgc2hvdWxkIGhhdmUgdGhpcyBmb3JtYXQ6Ci0KLUBleGFtcGxlCi1SZXBvcnQgYnVncyB0byBAdmFye21haWxpbmctYWRkcmVzc30uCi1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLQotQG5vZGUgT3B0aW9uIFRhYmxlCi1Ac2VjdGlvbiBUYWJsZSBvZiBMb25nIE9wdGlvbnMKLQotSGVyZSBpcyBhIHRhYmxlIG9mIGxvbmcgb3B0aW9ucyB1c2VkIGJ5IEdOVSBwcm9ncmFtcy4gIEl0IGlzIHN1cmVseQotaW5jb21wbGV0ZSwgYnV0IHdlIGFpbSB0byBsaXN0IGFsbCB0aGUgb3B0aW9ucyB0aGF0IGEgbmV3IHByb2dyYW0gbWlnaHQKLXdhbnQgdG8gYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYgeW91IHVzZSBuYW1lcyBub3QgYWxyZWFkeSBpbiB0aGUgdGFibGUsCi1wbGVhc2Ugc2VuZCBAZW1haWx7Z251QEBnbnUub3JnfSBhIGxpc3Qgb2YgdGhlbSwgd2l0aCB0aGVpcgotbWVhbmluZ3MsIHNvIHdlIGNhbiB1cGRhdGUgdGhlIHRhYmxlLgotCi1AYyBQbGVhc2UgbGVhdmUgbmV3bGluZXMgYmV0d2VlbiBpdGVtcyBpbiB0aGlzIHRhYmxlOyBpdCdzIG11Y2ggZWFzaWVyCi1AYyB0byB1cGRhdGUgd2hlbiBpdCBpc24ndCBjb21wbGV0ZWx5IHNxdWFzaGVkIHRvZ2V0aGVyIGFuZCB1bnJlYWRhYmxlLgotQGMgV2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHNob3J0IG9wdGlvbiBmb3IgYSBsb25nIG9wdGlvbiBuYW1lLCBwdXQKLUBjIGEgc2VtaWNvbG9uIGJldHdlZW4gdGhlIGxpc3RzIG9mIHRoZSBwcm9ncmFtcyB0aGF0IHVzZSB0aGVtLCBub3QgYQotQGMgcGVyaW9kLiAgIC0tZnJpZWRtYW4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBhZnRlci1kYXRlCi1Ac2FtcHstTn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gYWxsCi1Ac2FtcHstYX0gaW4gQGNvZGV7ZHV9LCBAY29kZXtsc30sIEBjb2Rle25tfSwgQGNvZGV7c3R0eX0sIEBjb2Rle3VuYW1lfSwKLWFuZCBAY29kZXt1bmV4cGFuZH0uCi0KLUBpdGVtIGFsbC10ZXh0Ci1Ac2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGFsbW9zdC1hbGwKLUBzYW1wey1BfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGFwcGVuZAotQHNhbXB7LWF9IGluIEBjb2Rle2V0YWdzfSwgQGNvZGV7dGVlfSwgQGNvZGV7dGltZX07Ci1Ac2FtcHstcn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gYXJjaGl2ZQotQHNhbXB7LWF9IGluIEBjb2Rle2NwfS4KLQotQGl0ZW0gYXJjaGl2ZS1uYW1lCi1Ac2FtcHstbn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGFyZ2xlbmd0aAotQHNhbXB7LWx9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gYXNjaWkKLUBzYW1wey1hfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gYXNzaWduCi1Ac2FtcHstdn0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGFzc3VtZS1uZXcKLUBzYW1wey1XfSBpbiBNYWtlLgotCi1AaXRlbSBhc3N1bWUtb2xkCi1Ac2FtcHstb30gaW4gTWFrZS4KLQotQGl0ZW0gYXV0by1jaGVjawotQHNhbXB7LWF9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGF1dG8tcGFnZXIKLUBzYW1wey1hfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGF1dG8tcmVmZXJlbmNlCi1Ac2FtcHstQX0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gYXZvaWQtd3JhcHMKLUBzYW1wey1ufSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGJhY2t3YXJkLXNlYXJjaAotQHNhbXB7LUJ9IGluIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gYmFzZW5hbWUKLUBzYW1wey1mfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gYmF0Y2gKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBiYXVkCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gYmVmb3JlCi1Ac2FtcHstYn0gaW4gQGNvZGV7dGFjfS4KLQotQGl0ZW0gYmluYXJ5Ci1Ac2FtcHstYn0gaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBiaXRzLXBlci1jb2RlCi1Ac2FtcHstYn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGJsb2NrLXNpemUKLVVzZWQgaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGJsb2NrcwotQHNhbXB7LWJ9IGluIEBjb2Rle2hlYWR9IGFuZCBAY29kZXt0YWlsfS4KLQotQGl0ZW0gYnJlYWstZmlsZQotQHNhbXB7LWJ9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGJyaWVmCi1Vc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gbWFrZSBvdXRwdXQgc2hvcnRlci4KLQotQGl0ZW0gYnl0ZXMKLUBzYW1wey1jfSBpbiBAY29kZXtoZWFkfSwgQGNvZGV7c3BsaXR9LCBhbmQgQGNvZGV7dGFpbH0uCi0KLUBpdGVtIGNAdHsrK30KLUBzYW1wey1DfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIGNhdGVuYXRlCi1Ac2FtcHstQX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gY2QKLVVzZWQgaW4gdmFyaW91cyBwcm9ncmFtcyB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgdG8gdXNlLgotCi1AaXRlbSBjaGFuZ2VzCi1Ac2FtcHstY30gaW4gQGNvZGV7Y2hncnB9IGFuZCBAY29kZXtjaG93bn0uCi0KLUBpdGVtIGNsYXNzaWZ5Ci1Ac2FtcHstRn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBjb2xvbnMKLUBzYW1wey1jfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBjb21tYW5kCi1Ac2FtcHstY30gaW4gQGNvZGV7c3V9OwotQHNhbXB7LXh9IGluIEdEQi4KLQotQGl0ZW0gY29tcGFyZQotQHNhbXB7LWR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGNvbXBhdAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gY29tcHJlc3MKLUBzYW1wey1afSBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtzaGFyfS4KLQotQGl0ZW0gY29uY2F0ZW5hdGUKLUBzYW1wey1BfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBjb25maXJtYXRpb24KLUBzYW1wey13fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBjb250ZXh0Ci1Vc2VkIGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBjb3B5bGVmdAotQHNhbXB7LVcgY29weWxlZnR9IGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBjb3B5cmlnaHQKLUBzYW1wey1DfSBpbiBAY29kZXtwdHh9LCBAY29kZXtyZWNvZGV9LCBhbmQgQGNvZGV7d2RpZmZ9OwotQHNhbXB7LVcgY29weXJpZ2h0fSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gY29yZQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGNvdW50Ci1Ac2FtcHstcX0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gY291bnQtbGlua3MKLUBzYW1wey1sfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIGNyZWF0ZQotVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtjcGlvfS4KLQotQGl0ZW0gY3V0LW1hcmsKLUBzYW1wey1jfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gY3hyZWYKLUBzYW1wey14fSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIGRhdGUKLUBzYW1wey1kfSBpbiBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIGRlYnVnCi1Ac2FtcHstZH0gaW4gTWFrZSBhbmQgQGNvZGV7bTR9OwotQHNhbXB7LXR9IGluIEJpc29uLgotCi1AaXRlbSBkZWZpbmUKLUBzYW1wey1EfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGRlZmluZXMKLUBzYW1wey1kfSBpbiBCaXNvbiBhbmQgQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSBkZWxldGUKLUBzYW1wey1EfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBkZXJlZmVyZW5jZQotQHNhbXB7LUx9IGluIEBjb2Rle2NoZ3JwfSwgQGNvZGV7Y2hvd259LCBAY29kZXtjcGlvfSwgQGNvZGV7ZHV9LAotQGNvZGV7bHN9LCBhbmQgQGNvZGV7dGFyfS4KLQotQGl0ZW0gZGVyZWZlcmVuY2UtYXJncwotQHNhbXB7LUR9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gZGlhY3JpdGljcwotQHNhbXB7LWR9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGRpY3Rpb25hcnktb3JkZXIKLUBzYW1wey1kfSBpbiBAY29kZXtsb29rfS4KLQotQGl0ZW0gZGlmZgotQHNhbXB7LWR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGRpZ2l0cwotQHNhbXB7LW59IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIGRpcmVjdG9yeQotU3BlY2lmeSB0aGUgZGlyZWN0b3J5IHRvIHVzZSwgaW4gdmFyaW91cyBwcm9ncmFtcy4gIEluIEBjb2Rle2xzfSwgaXQKLW1lYW5zIHRvIHNob3cgZGlyZWN0b3JpZXMgdGhlbXNlbHZlcyByYXRoZXIgdGhhbiB0aGVpciBjb250ZW50cy4gIEluCi1AY29kZXtybX0gYW5kIEBjb2Rle2xufSwgaXQgbWVhbnMgdG8gbm90IHRyZWF0IGxpbmtzIHRvIGRpcmVjdG9yaWVzCi1zcGVjaWFsbHkuCi0KLUBpdGVtIGRpc2NhcmQtYWxsCi1Ac2FtcHsteH0gaW4gQGNvZGV7c3RyaXB9LgotCi1AaXRlbSBkaXNjYXJkLWxvY2FscwotQHNhbXB7LVh9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gZHJ5LXJ1bgotQHNhbXB7LW59IGluIE1ha2UuCi0KLUBpdGVtIGVkCi1Ac2FtcHstZX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGVsaWRlLWVtcHR5LWZpbGVzCi1Ac2FtcHsten0gaW4gQGNvZGV7Y3NwbGl0fS4KLQotQGl0ZW0gZW5kLWRlbGV0ZQotQHNhbXB7LXh9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gZW5kLWluc2VydAotQHNhbXB7LXp9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gZW50aXJlLW5ldy1maWxlCi1Ac2FtcHstTn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGVudmlyb25tZW50LW92ZXJyaWRlcwotQHNhbXB7LWV9IGluIE1ha2UuCi0KLUBpdGVtIGVvZgotQHNhbXB7LWV9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gZXBvY2gKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBlcnJvci1saW1pdAotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIGVycm9yLW91dHB1dAotQHNhbXB7LW99IGluIEBjb2Rle200fS4KLQotQGl0ZW0gZXNjYXBlCi1Ac2FtcHstYn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBleGNsdWRlLWZyb20KLUBzYW1wey1YfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBleGVjCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gZXhpdAotQHNhbXB7LXh9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gZXhpdC0wCi1Ac2FtcHstZX0gaW4gQGNvZGV7dW5zaGFyfS4KLQotQGl0ZW0gZXhwYW5kLXRhYnMKLUBzYW1wey10fSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gZXhwcmVzc2lvbgotQHNhbXB7LWV9IGluIEBjb2Rle3NlZH0uCi0KLUBpdGVtIGV4dGVybi1vbmx5Ci1Ac2FtcHstZ30gaW4gQGNvZGV7bm19LgotCi1AaXRlbSBleHRyYWN0Ci1Ac2FtcHstaX0gaW4gQGNvZGV7Y3Bpb307Ci1Ac2FtcHsteH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZmFjZXMKLUBzYW1wey1mfSBpbiBAY29kZXtmaW5nZXJ9LgotCi1AaXRlbSBmYXN0Ci1Ac2FtcHstZn0gaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBmYXRhbC13YXJuaW5ncwotQHNhbXB7LUV9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gZmlsZQotQHNhbXB7LWZ9IGluIEBjb2Rle2luZm99LCBAY29kZXtnYXdrfSwgTWFrZSwgQGNvZGV7bXR9LCBhbmQgQGNvZGV7dGFyfTsKLUBzYW1wey1ufSBpbiBAY29kZXtzZWR9OwotQHNhbXB7LXJ9IGluIEBjb2Rle3RvdWNofS4KLQotQGl0ZW0gZmllbGQtc2VwYXJhdG9yCi1Ac2FtcHstRn0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGZpbGUtcHJlZml4Ci1Ac2FtcHstYn0gaW4gQmlzb24uCi0KLUBpdGVtIGZpbGUtdHlwZQotQHNhbXB7LUZ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gZmlsZXMtZnJvbQotQHNhbXB7LVR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGZpbGwtY29sdW1uCi1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gZmxhZy10cnVuY2F0aW9uCi1Ac2FtcHstRn0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gZml4ZWQtb3V0cHV0LWZpbGVzCi1Ac2FtcHsteX0gaW4gQmlzb24uCi0KLUBpdGVtIGZvbGxvdwotQHNhbXB7LWZ9IGluIEBjb2Rle3RhaWx9LgotCi1AaXRlbSBmb290bm90ZS1zdHlsZQotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIGZvcmNlCi1Ac2FtcHstZn0gaW4gQGNvZGV7Y3B9LCBAY29kZXtsbn0sIEBjb2Rle212fSwgYW5kIEBjb2Rle3JtfS4KLQotQGl0ZW0gZm9yY2UtcHJlZml4Ci1Ac2FtcHstRn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGZvcm1hdAotVXNlZCBpbiBAY29kZXtsc30sIEBjb2Rle3RpbWV9LCBhbmQgQGNvZGV7cHR4fS4KLQotQGl0ZW0gZnJlZXplLXN0YXRlCi1Ac2FtcHstRn0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBmdWxsbmFtZQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGdhcC1zaXplCi1Ac2FtcHstZ30gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gZ2V0Ci1Ac2FtcHsteH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZ3JhcGhpYwotQHNhbXB7LWl9IGluIEBjb2Rle3VsfS4KLQotQGl0ZW0gZ3JhcGhpY3MKLUBzYW1wey1nfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBncm91cAotQHNhbXB7LWd9IGluIEBjb2Rle2luc3RhbGx9LgotCi1AaXRlbSBnemlwCi1Ac2FtcHsten0gaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGhhc2hzaXplCi1Ac2FtcHstSH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBoZWFkZXIKLUBzYW1wey1ofSBpbiBAY29kZXtvYmpkdW1wfSBhbmQgQGNvZGV7cmVjb2RlfQotCi1AaXRlbSBoZWFkaW5nCi1Ac2FtcHstSH0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gaGVscAotVXNlZCB0byBhc2sgZm9yIGJyaWVmIHVzYWdlIGluZm9ybWF0aW9uLgotCi1AaXRlbSBoZXJlLWRlbGltaXRlcgotQHNhbXB7LWR9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBoaWRlLWNvbnRyb2wtY2hhcnMKLUBzYW1wey1xfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGlkbGUKLUBzYW1wey11fSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBpZmRlZgotQHNhbXB7LUR9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUKLUBzYW1wey1JfSBpbiBAY29kZXtsc307Ci1Ac2FtcHsteH0gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gaWdub3JlLWFsbC1zcGFjZQotQHNhbXB7LXd9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtYmFja3VwcwotQHNhbXB7LUJ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gaWdub3JlLWJsYW5rLWxpbmVzCi1Ac2FtcHstQn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZS1jYXNlCi1Ac2FtcHstZn0gaW4gQGNvZGV7bG9va30gYW5kIEBjb2Rle3B0eH07Ci1Ac2FtcHstaX0gaW4gQGNvZGV7ZGlmZn0gYW5kIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gaWdub3JlLWVycm9ycwotQHNhbXB7LWl9IGluIE1ha2UuCi0KLUBpdGVtIGlnbm9yZS1maWxlCi1Ac2FtcHstaX0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gaWdub3JlLWluZGVudGF0aW9uCi1Ac2FtcHstSX0gaW4gQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSBpZ25vcmUtaW5pdC1maWxlCi1Ac2FtcHstZn0gaW4gT2xlby4KLQotQGl0ZW0gaWdub3JlLWludGVycnVwdHMKLUBzYW1wey1pfSBpbiBAY29kZXt0ZWV9LgotCi1AaXRlbSBpZ25vcmUtbWF0Y2hpbmctbGluZXMKLUBzYW1wey1JfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlLXNwYWNlLWNoYW5nZQotQHNhbXB7LWJ9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtemVyb3MKLUBzYW1wey1pfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBpbmNsdWRlCi1Ac2FtcHstaX0gaW4gQGNvZGV7ZXRhZ3N9OwotQHNhbXB7LUl9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gaW5jbHVkZS1kaXIKLUBzYW1wey1JfSBpbiBNYWtlLgotCi1AaXRlbSBpbmNyZW1lbnRhbAotQHNhbXB7LUd9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGluZm8KLUBzYW1wey1pfSwgQHNhbXB7LWx9LCBhbmQgQHNhbXB7LW19IGluIEZpbmdlci4KLQotQGl0ZW0gaW5pdGlhbAotQHNhbXB7LWl9IGluIEBjb2Rle2V4cGFuZH0uCi0KLUBpdGVtIGluaXRpYWwtdGFiCi1Ac2FtcHstVH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlub2RlCi1Ac2FtcHstaX0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBpbnRlcmFjdGl2ZQotQHNhbXB7LWl9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0sIEBjb2Rle3JtfTsKLUBzYW1wey1lfSBpbiBAY29kZXttNH07Ci1Ac2FtcHstcH0gaW4gQGNvZGV7eGFyZ3N9OwotQHNhbXB7LXd9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGludGVybWl4LXR5cGUKLUBzYW1wey1wfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gam9icwotQHNhbXB7LWp9IGluIE1ha2UuCi0KLUBpdGVtIGp1c3QtcHJpbnQKLUBzYW1wey1ufSBpbiBNYWtlLgotCi1AaXRlbSBrZWVwLWdvaW5nCi1Ac2FtcHsta30gaW4gTWFrZS4KLQotQGl0ZW0ga2VlcC1maWxlcwotQHNhbXB7LWt9IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIGtpbG9ieXRlcwotQHNhbXB7LWt9IGluIEBjb2Rle2R1fSBhbmQgQGNvZGV7bHN9LgotCi1AaXRlbSBsYW5ndWFnZQotQHNhbXB7LWx9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gbGVzcy1tb2RlCi1Ac2FtcHstbH0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBsZXZlbC1mb3ItZ3ppcAotQHNhbXB7LWd9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBsaW5lLWJ5dGVzCi1Ac2FtcHstQ30gaW4gQGNvZGV7c3BsaXR9LgotCi1AaXRlbSBsaW5lcwotVXNlZCBpbiBAY29kZXtzcGxpdH0sIEBjb2Rle2hlYWR9LCBhbmQgQGNvZGV7dGFpbH0uCi0KLUBpdGVtIGxpbmsKLUBzYW1wey1sfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gbGludAotQGl0ZW14IGxpbnQtb2xkCi1Vc2VkIGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBsaXN0Ci1Ac2FtcHstdH0gaW4gQGNvZGV7Y3Bpb307Ci1Ac2FtcHstbH0gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gbGlzdAotQHNhbXB7LXR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGxpdGVyYWwKLUBzYW1wey1OfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGxvYWQtYXZlcmFnZQotQHNhbXB7LWx9IGluIE1ha2UuCi0KLUBpdGVtIGxvZ2luCi1Vc2VkIGluIEBjb2Rle3N1fS4KLQotQGl0ZW0gbWFjaGluZQotTm8gbGlzdGluZyBvZiB3aGljaCBwcm9ncmFtcyBhbHJlYWR5IHVzZSB0aGlzOwotc29tZW9uZSBzaG91bGQgY2hlY2sgdG8KLXNlZSBpZiBhbnkgYWN0dWFsbHkgZG8sIGFuZCB0ZWxsIEBlbWFpbHtnbnVAQGdudS5vcmd9LgotCi1AaXRlbSBtYWNyby1uYW1lCi1Ac2FtcHstTX0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gbWFpbAotQHNhbXB7LW19IGluIEBjb2Rle2hlbGxvfSBhbmQgQGNvZGV7dW5hbWV9LgotCi1AaXRlbSBtYWtlLWRpcmVjdG9yaWVzCi1Ac2FtcHstZH0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIG1ha2VmaWxlCi1Ac2FtcHstZn0gaW4gTWFrZS4KLQotQGl0ZW0gbWFwcGVkCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gbWF4LWFyZ3MKLUBzYW1wey1ufSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG1heC1jaGFycwotQHNhbXB7LW59IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbWF4LWxpbmVzCi1Ac2FtcHstbH0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBtYXgtbG9hZAotQHNhbXB7LWx9IGluIE1ha2UuCi0KLUBpdGVtIG1heC1wcm9jcwotQHNhbXB7LVB9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbWVzZwotQHNhbXB7LVR9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIG1lc3NhZ2UKLUBzYW1wey1UfSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBtaW5pbWFsCi1Ac2FtcHstZH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIG1peGVkLXV1ZW5jb2RlCi1Ac2FtcHstTX0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG1vZGUKLUBzYW1wey1tfSBpbiBAY29kZXtpbnN0YWxsfSwgQGNvZGV7bWtkaXJ9LCBhbmQgQGNvZGV7bWtmaWZvfS4KLQotQGl0ZW0gbW9kaWZpY2F0aW9uLXRpbWUKLUBzYW1wey1tfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBtdWx0aS12b2x1bWUKLUBzYW1wey1NfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBuYW1lLXByZWZpeAotQHNhbXB7LWF9IGluIEJpc29uLgotCi1AaXRlbSBuZXN0aW5nLWxpbWl0Ci1Ac2FtcHstTH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBuZXQtaGVhZGVycwotQHNhbXB7LWF9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuZXctZmlsZQotQHNhbXB7LVd9IGluIE1ha2UuCi0KLUBpdGVtIG5vLWJ1aWx0aW4tcnVsZXMKLUBzYW1wey1yfSBpbiBNYWtlLgotCi1AaXRlbSBuby1jaGFyYWN0ZXItY291bnQKLUBzYW1wey13fSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tY2hlY2stZXhpc3RpbmcKLUBzYW1wey14fSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tY29tbW9uCi1Ac2FtcHstM30gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBuby1jcmVhdGUKLUBzYW1wey1jfSBpbiBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIG5vLWRlZmluZXMKLUBzYW1wey1EfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIG5vLWRlbGV0ZWQKLUBzYW1wey0xfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIG5vLWRlcmVmZXJlbmNlCi1Ac2FtcHstZH0gaW4gQGNvZGV7Y3B9LgotCi1AaXRlbSBuby1pbnNlcnRlZAotQHNhbXB7LTJ9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gbm8ta2VlcC1nb2luZwotQHNhbXB7LVN9IGluIE1ha2UuCi0KLUBpdGVtIG5vLWxpbmVzCi1Ac2FtcHstbH0gaW4gQmlzb24uCi0KLUBpdGVtIG5vLXBpcGluZwotQHNhbXB7LVB9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuby1wcm9mCi1Ac2FtcHstZX0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBuby1yZWdleAotQHNhbXB7LVJ9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gbm8tc29ydAotQHNhbXB7LXB9IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gbm8tc3BsaXQKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBuby1zdGF0aWMKLUBzYW1wey1hfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG5vLXRpbWUKLUBzYW1wey1FfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG5vLXRpbWVzdGFtcAotQHNhbXB7LW19IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuby12YWxpZGF0ZQotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIG5vLXdhaXQKLVVzZWQgaW4gQGNvZGV7ZW1hY3NjbGllbnR9LgotCi1AaXRlbSBuby13YXJuCi1Vc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gaW5oaWJpdCB3YXJuaW5ncy4KLQotQGl0ZW0gbm9kZQotQHNhbXB7LW59IGluIEBjb2Rle2luZm99LgotCi1AaXRlbSBub2RlbmFtZQotQHNhbXB7LW59IGluIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gbm9ubWF0Y2hpbmcKLUBzYW1wey1mfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gbnN0dWZmCi1Ac2FtcHstbn0gaW4gQGNvZGV7b2JqZHVtcH0uCi0KLUBpdGVtIG51bGwKLUBzYW1wey0wfSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG51bWJlcgotQHNhbXB7LW59IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIG51bWJlci1ub25ibGFuawotQHNhbXB7LWJ9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIG51bWVyaWMtc29ydAotQHNhbXB7LW59IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gbnVtZXJpYy11aWQtZ2lkCi1Ac2FtcHstbn0gaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle2xzfS4KLQotQGl0ZW0gbngKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBvbGQtYXJjaGl2ZQotQHNhbXB7LW99IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIG9sZC1maWxlCi1Ac2FtcHstb30gaW4gTWFrZS4KLQotQGl0ZW0gb25lLWZpbGUtc3lzdGVtCi1Ac2FtcHstbH0gaW4gQGNvZGV7dGFyfSwgQGNvZGV7Y3B9LCBhbmQgQGNvZGV7ZHV9LgotCi1AaXRlbSBvbmx5LWZpbGUKLUBzYW1wey1vfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBvbmx5LXByb2YKLUBzYW1wey1mfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG9ubHktdGltZQotQHNhbXB7LUZ9IGluIEBjb2Rle2dwcm9mfS4KLQotQGl0ZW0gb3V0cHV0Ci1JbiB2YXJpb3VzIHByb2dyYW1zLCBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBuYW1lLgotCi1AaXRlbSBvdXRwdXQtcHJlZml4Ci1Ac2FtcHstb30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG92ZXJyaWRlCi1Ac2FtcHstb30gaW4gQGNvZGV7cm19LgotCi1AaXRlbSBvdmVyd3JpdGUKLUBzYW1wey1jfSBpbiBAY29kZXt1bnNoYXJ9LgotCi1AaXRlbSBvd25lcgotQHNhbXB7LW99IGluIEBjb2Rle2luc3RhbGx9LgotCi1AaXRlbSBwYWdpbmF0ZQotQHNhbXB7LWx9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBwYXJhZ3JhcGgtaW5kZW50Ci1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gcGFyZW50cwotQHNhbXB7LXB9IGluIEBjb2Rle21rZGlyfSBhbmQgQGNvZGV7cm1kaXJ9LgotCi1AaXRlbSBwYXNzLWFsbAotQHNhbXB7LXB9IGluIEBjb2Rle3VsfS4KLQotQGl0ZW0gcGFzcy10aHJvdWdoCi1Ac2FtcHstcH0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIHBvcnQKLUBzYW1wey1QfSBpbiBAY29kZXtmaW5nZXJ9LgotCi1AaXRlbSBwb3J0YWJpbGl0eQotQHNhbXB7LWN9IGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXt0YXJ9LgotCi1AaXRlbSBwb3NpeAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gcHJlZml4LWJ1aWx0aW5zCi1Ac2FtcHstUH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBwcmVmaXgKLUBzYW1wey1mfSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBwcmVzZXJ2ZQotVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtjcH0uCi0KLUBpdGVtIHByZXNlcnZlLWVudmlyb25tZW50Ci1Ac2FtcHstcH0gaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBwcmVzZXJ2ZS1tb2RpZmljYXRpb24tdGltZQotQHNhbXB7LW19IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSBwcmVzZXJ2ZS1vcmRlcgotQHNhbXB7LXN9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHByZXNlcnZlLXBlcm1pc3Npb25zCi1Ac2FtcHstcH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gcHJpbnQKLUBzYW1wey1sfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcHJpbnQtY2hhcnMKLUBzYW1wey1MfSBpbiBAY29kZXtjbXB9LgotCi1AaXRlbSBwcmludC1kYXRhLWJhc2UKLUBzYW1wey1wfSBpbiBNYWtlLgotCi1AaXRlbSBwcmludC1kaXJlY3RvcnkKLUBzYW1wey13fSBpbiBNYWtlLgotCi1AaXRlbSBwcmludC1maWxlLW5hbWUKLUBzYW1wey1vfSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIHByaW50LXN5bWRlZnMKLUBzYW1wey1zfSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIHByaW50ZXIKLUBzYW1wey1wfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHByb21wdAotQHNhbXB7LXB9IGluIEBjb2Rle2VkfS4KLQotQGl0ZW0gcXVlcnktdXNlcgotQHNhbXB7LVh9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBxdWVzdGlvbgotQHNhbXB7LXF9IGluIE1ha2UuCi0KLUBpdGVtIHF1aWV0Ci1Vc2VkIGluIG1hbnkgcHJvZ3JhbXMgdG8gaW5oaWJpdCB0aGUgdXN1YWwgb3V0cHV0LiAgQHN0cm9uZ3tOb3RlOn0gZXZlcnkKLXByb2dyYW0gYWNjZXB0aW5nIEBzYW1wey0tcXVpZXR9IHNob3VsZCBhY2NlcHQgQHNhbXB7LS1zaWxlbnR9IGFzIGEKLXN5bm9ueW0uCi0KLUBpdGVtIHF1aWV0LXVuc2hhcgotQHNhbXB7LVF9IGluIEBjb2Rle3NoYXJ9Ci0KLUBpdGVtIHF1b3RlLW5hbWUKLUBzYW1wey1RfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIHJjcwotQHNhbXB7LW59IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSByZS1pbnRlcnZhbAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gcmVhZC1mdWxsLWJsb2NrcwotQHNhbXB7LUJ9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHJlYWRub3cKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSByZWNvbgotQHNhbXB7LW59IGluIE1ha2UuCi0KLUBpdGVtIHJlY29yZC1udW1iZXIKLUBzYW1wey1SfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSByZWN1cnNpdmUKLVVzZWQgaW4gQGNvZGV7Y2hncnB9LCBAY29kZXtjaG93bn0sIEBjb2Rle2NwfSwgQGNvZGV7bHN9LCBAY29kZXtkaWZmfSwKLWFuZCBAY29kZXtybX0uCi0KLUBpdGVtIHJlZmVyZW5jZS1saW1pdAotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIHJlZmVyZW5jZXMKLUBzYW1wey1yfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSByZWdleAotQHNhbXB7LXJ9IGluIEBjb2Rle3RhY30gYW5kIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gcmVsZWFzZQotQHNhbXB7LXJ9IGluIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gcmVsb2FkLXN0YXRlCi1Ac2FtcHstUn0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSByZWxvY2F0aW9uCi1Ac2FtcHstcn0gaW4gQGNvZGV7b2JqZHVtcH0uCi0KLUBpdGVtIHJlbmFtZQotQHNhbXB7LXJ9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSByZXBsYWNlCi1Ac2FtcHstaX0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSByZXBvcnQtaWRlbnRpY2FsLWZpbGVzCi1Ac2FtcHstc30gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHJlc2V0LWFjY2Vzcy10aW1lCi1Ac2FtcHstYX0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIHJldmVyc2UKLUBzYW1wey1yfSBpbiBAY29kZXtsc30gYW5kIEBjb2Rle25tfS4KLQotQGl0ZW0gcmV2ZXJzZWQtZWQKLUBzYW1wey1mfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcmlnaHQtc2lkZS1kZWZzCi1Ac2FtcHstUn0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gc2FtZS1vcmRlcgotQHNhbXB7LXN9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHNhbWUtcGVybWlzc2lvbnMKLUBzYW1wey1wfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBzYXZlCi1Ac2FtcHstZ30gaW4gQGNvZGV7c3R0eX0uCi0KLUBpdGVtIHNlCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gc2VudGVuY2UtcmVnZXhwCi1Ac2FtcHstU30gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gc2VwYXJhdGUtZGlycwotQHNhbXB7LVN9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gc2VwYXJhdG9yCi1Ac2FtcHstc30gaW4gQGNvZGV7dGFjfS4KLQotQGl0ZW0gc2VxdWVuY2UKLVVzZWQgYnkgQGNvZGV7cmVjb2RlfSB0byBjaG9zZSBmaWxlcyBvciBwaXBlcyBmb3Igc2VxdWVuY2luZyBwYXNzZXMuCi0KLUBpdGVtIHNoZWxsCi1Ac2FtcHstc30gaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBzaG93LWFsbAotQHNhbXB7LUF9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIHNob3ctYy1mdW5jdGlvbgotQHNhbXB7LXB9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBzaG93LWVuZHMKLUBzYW1wey1FfSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBzaG93LWZ1bmN0aW9uLWxpbmUKLUBzYW1wey1GfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gc2hvdy10YWJzCi1Ac2FtcHstVH0gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gc2lsZW50Ci1Vc2VkIGluIG1hbnkgcHJvZ3JhbXMgdG8gaW5oaWJpdCB0aGUgdXN1YWwgb3V0cHV0LgotQHN0cm9uZ3tOb3RlOn0gZXZlcnkgcHJvZ3JhbSBhY2NlcHRpbmcKLUBzYW1wey0tc2lsZW50fSBzaG91bGQgYWNjZXB0IEBzYW1wey0tcXVpZXR9IGFzIGEgc3lub255bS4KLQotQGl0ZW0gc2l6ZQotQHNhbXB7LXN9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gc29ydAotVXNlZCBpbiBAY29kZXtsc30uCi0KLUBpdGVtIHNvdXJjZQotQHNhbXB7LVcgc291cmNlfSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gc3BhcnNlCi1Ac2FtcHstU30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gc3BlZWQtbGFyZ2UtZmlsZXMKLUBzYW1wey1IfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gc3BsaXQtYXQKLUBzYW1wey1FfSBpbiBAY29kZXt1bnNoYXJ9LgotCi1AaXRlbSBzcGxpdC1zaXplLWxpbWl0Ci1Ac2FtcHstTH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHNxdWVlemUtYmxhbmsKLUBzYW1wey1zfSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBzdGFydC1kZWxldGUKLUBzYW1wey13fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHN0YXJ0LWluc2VydAotQHNhbXB7LXl9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gc3RhcnRpbmctZmlsZQotVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtkaWZmfSB0byBzcGVjaWZ5IHdoaWNoIGZpbGUgd2l0aGluCi1hIGRpcmVjdG9yeSB0byBzdGFydCBwcm9jZXNzaW5nIHdpdGguCi0KLUBpdGVtIHN0YXRpc3RpY3MKLUBzYW1wey1zfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHN0ZGluLWZpbGUtbGlzdAotQHNhbXB7LVN9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBzdG9wCi1Ac2FtcHstU30gaW4gTWFrZS4KLQotQGl0ZW0gc3RyaWN0Ci1Ac2FtcHstc30gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gc3RyaXAKLUBzYW1wey1zfSBpbiBAY29kZXtpbnN0YWxsfS4KLQotQGl0ZW0gc3RyaXAtYWxsCi1Ac2FtcHstc30gaW4gQGNvZGV7c3RyaXB9LgotCi1AaXRlbSBzdHJpcC1kZWJ1ZwotQHNhbXB7LVN9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gc3VibWl0dGVyCi1Ac2FtcHstc30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHN1ZmZpeAotQHNhbXB7LVN9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0uCi0KLUBpdGVtIHN1ZmZpeC1mb3JtYXQKLUBzYW1wey1ifSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBzdW0KLUBzYW1wey1zfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIHN1bW1hcml6ZQotQHNhbXB7LXN9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gc3ltYm9saWMKLUBzYW1wey1zfSBpbiBAY29kZXtsbn0uCi0KLUBpdGVtIHN5bWJvbHMKLVVzZWQgaW4gR0RCIGFuZCBAY29kZXtvYmpkdW1wfS4KLQotQGl0ZW0gc3luY2xpbmVzCi1Ac2FtcHstc30gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBzeXNuYW1lCi1Ac2FtcHstc30gaW4gQGNvZGV7dW5hbWV9LgotCi1AaXRlbSB0YWJzCi1Ac2FtcHstdH0gaW4gQGNvZGV7ZXhwYW5kfSBhbmQgQGNvZGV7dW5leHBhbmR9LgotCi1AaXRlbSB0YWJzaXplCi1Ac2FtcHstVH0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSB0ZXJtaW5hbAotQHNhbXB7LVR9IGluIEBjb2Rle3RwdXR9IGFuZCBAY29kZXt1bH0uCi1Ac2FtcHstdH0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSB0ZXh0Ci1Ac2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHRleHQtZmlsZXMKLUBzYW1wey1UfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gdGltZQotVXNlZCBpbiBAY29kZXtsc30gYW5kIEBjb2Rle3RvdWNofS4KLQotQGl0ZW0gdG8tc3Rkb3V0Ci1Ac2FtcHstT30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gdG90YWwKLUBzYW1wey1jfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIHRvdWNoCi1Ac2FtcHstdH0gaW4gTWFrZSwgQGNvZGV7cmFubGlifSwgYW5kIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIHRyYWNlCi1Ac2FtcHstdH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSB0cmFkaXRpb25hbAotQHNhbXB7LXR9IGluIEBjb2Rle2hlbGxvfTsKLUBzYW1wey1XIHRyYWRpdGlvbmFsfSBpbiBAY29kZXtnYXdrfTsKLUBzYW1wey1HfSBpbiBAY29kZXtlZH0sIEBjb2Rle200fSwgYW5kIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHR0eQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIHR5cGVkZWZzCi1Ac2FtcHstdH0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSB0eXBlZGVmcy1hbmQtYysrCi1Ac2FtcHstVH0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSB0eXBlc2V0LW1vZGUKLUBzYW1wey10fSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSB1bmNvbXByZXNzCi1Ac2FtcHsten0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gdW5jb25kaXRpb25hbAotQHNhbXB7LXV9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSB1bmRlZmluZQotQHNhbXB7LVV9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gdW5kZWZpbmVkLW9ubHkKLUBzYW1wey11fSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIHVwZGF0ZQotQHNhbXB7LXV9IGluIEBjb2Rle2NwfSwgQGNvZGV7Y3RhZ3N9LCBAY29kZXttdn0sIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHVzYWdlCi1Vc2VkIGluIEBjb2Rle2dhd2t9OyBzYW1lIGFzIEBzYW1wey0taGVscH0uCi0KLUBpdGVtIHV1ZW5jb2RlCi1Ac2FtcHstQn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHZhbmlsbGEtb3BlcmF0aW9uCi1Ac2FtcHstVn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHZlcmJvc2UKLVByaW50IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHJvZ3Jlc3MuICBNYW55IHByb2dyYW1zIHN1cHBvcnQgdGhpcy4KLQotQGl0ZW0gdmVyaWZ5Ci1Ac2FtcHstV30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyLgotCi1AaXRlbSB2ZXJzaW9uLWNvbnRyb2wKLUBzYW1wey1WfSBpbiBAY29kZXtjcH0sIEBjb2Rle2xufSwgQGNvZGV7bXZ9LgotCi1AaXRlbSB2Z3JpbmQKLUBzYW1wey12fSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIHZvbHVtZQotQHNhbXB7LVZ9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHdoYXQtaWYKLUBzYW1wey1XfSBpbiBNYWtlLgotCi1AaXRlbSB3aG9sZS1zaXplLWxpbWl0Ci1Ac2FtcHstbH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHdpZHRoCi1Ac2FtcHstd30gaW4gQGNvZGV7bHN9IGFuZCBAY29kZXtwdHh9LgotCi1AaXRlbSB3b3JkLXJlZ2V4cAotQHNhbXB7LVd9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHdyaXRhYmxlCi1Ac2FtcHstVH0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gemVyb3MKLUBzYW1wey16fSBpbiBAY29kZXtncHJvZn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIE1lbW9yeSBVc2FnZQotQHNlY3Rpb24gTWVtb3J5IFVzYWdlCi0KLUlmIGl0IHR5cGljYWxseSB1c2VzIGp1c3QgYSBmZXcgbWVnIG9mIG1lbW9yeSwgZG9uJ3QgYm90aGVyIG1ha2luZyBhbnkKLWVmZm9ydCB0byByZWR1Y2UgbWVtb3J5IHVzYWdlLiAgRm9yIGV4YW1wbGUsIGlmIGl0IGlzIGltcHJhY3RpY2FsIGZvcgotb3RoZXIgcmVhc29ucyB0byBvcGVyYXRlIG9uIGZpbGVzIG1vcmUgdGhhbiBhIGZldyBtZWcgbG9uZywgaXQgaXMKLXJlYXNvbmFibGUgdG8gcmVhZCBlbnRpcmUgaW5wdXQgZmlsZXMgaW50byBjb3JlIHRvIG9wZXJhdGUgb24gdGhlbS4KLQotSG93ZXZlciwgZm9yIHByb2dyYW1zIHN1Y2ggYXMgQGNvZGV7Y2F0fSBvciBAY29kZXt0YWlsfSwgdGhhdCBjYW4KLXVzZWZ1bGx5IG9wZXJhdGUgb24gdmVyeSBsYXJnZSBmaWxlcywgaXQgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHVzaW5nIGEKLXRlY2huaXF1ZSB0aGF0IHdvdWxkIGFydGlmaWNpYWxseSBsaW1pdCB0aGUgc2l6ZSBvZiBmaWxlcyBpdCBjYW4gaGFuZGxlLgotSWYgYSBwcm9ncmFtIHdvcmtzIGJ5IGxpbmVzIGFuZCBjb3VsZCBiZSBhcHBsaWVkIHRvIGFyYml0cmFyeQotdXNlci1zdXBwbGllZCBpbnB1dCBmaWxlcywgaXQgc2hvdWxkIGtlZXAgb25seSBhIGxpbmUgaW4gbWVtb3J5LCBiZWNhdXNlCi10aGlzIGlzIG5vdCB2ZXJ5IGhhcmQgYW5kIHVzZXJzIHdpbGwgd2FudCB0byBiZSBhYmxlIHRvIG9wZXJhdGUgb24gaW5wdXQKLWZpbGVzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIHdpbGwgZml0IGluIGNvcmUgYWxsIGF0IG9uY2UuCi0KLUlmIHlvdXIgcHJvZ3JhbSBjcmVhdGVzIGNvbXBsaWNhdGVkIGRhdGEgc3RydWN0dXJlcywganVzdCBtYWtlIHRoZW0gaW4KLWNvcmUgYW5kIGdpdmUgYSBmYXRhbCBlcnJvciBpZiBAY29kZXttYWxsb2N9IHJldHVybnMgemVyby4KLQotQG5vZGUgV3JpdGluZyBDCi1AY2hhcHRlciBNYWtpbmcgVGhlIEJlc3QgVXNlIG9mIEMKLQotVGhpcyBAdmFsdWV7Q0hBUFRFUn0gcHJvdmlkZXMgYWR2aWNlIG9uIGhvdyBiZXN0IHRvIHVzZSB0aGUgQyBsYW5ndWFnZQotd2hlbiB3cml0aW5nIEdOVSBzb2Z0d2FyZS4KLQotQG1lbnUKLSogRm9ybWF0dGluZzo6ICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZyBZb3VyIFNvdXJjZSBDb2RlCi0qIENvbW1lbnRzOjogICAgICAgICAgICAgICAgICAgIENvbW1lbnRpbmcgWW91ciBXb3JrCi0qIFN5bnRhY3RpYyBDb252ZW50aW9uczo6ICAgICAgIENsZWFuIFVzZSBvZiBDIENvbnN0cnVjdHMKLSogTmFtZXM6OiAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCi0qIFN5c3RlbSBQb3J0YWJpbGl0eTo6ICAgICAgICAgIFBvcnRhYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IG9wZXJhdGluZyBzeXN0ZW1zCi0qIENQVSBQb3J0YWJpbGl0eTo6ICAgICAgICAgICAgIFN1cHBvcnRpbmcgdGhlIHJhbmdlIG9mIENQVSB0eXBlcwotKiBTeXN0ZW0gRnVuY3Rpb25zOjogICAgICAgICAgICBQb3J0YWJpbGl0eSBhbmQgYGBzdGFuZGFyZCcnIGxpYnJhcnkgZnVuY3Rpb25zCi0qIEludGVybmF0aW9uYWxpemF0aW9uOjogICAgICAgIFRlY2huaXF1ZXMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uCi0qIE1tYXA6OiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB5b3UgY2FuIHNhZmVseSB1c2UgQGNvZGV7bW1hcH0uCi1AZW5kIG1lbnUKLQotQG5vZGUgRm9ybWF0dGluZwotQHNlY3Rpb24gRm9ybWF0dGluZyBZb3VyIFNvdXJjZSBDb2RlCi0KLUl0IGlzIGltcG9ydGFudCB0byBwdXQgdGhlIG9wZW4tYnJhY2UgdGhhdCBzdGFydHMgdGhlIGJvZHkgb2YgYSBDCi1mdW5jdGlvbiBpbiBjb2x1bW4gemVybywgYW5kIGF2b2lkIHB1dHRpbmcgYW55IG90aGVyIG9wZW4tYnJhY2Ugb3IKLW9wZW4tcGFyZW50aGVzaXMgb3Igb3Blbi1icmFja2V0IGluIGNvbHVtbiB6ZXJvLiAgU2V2ZXJhbCB0b29scyBsb29rCi1mb3Igb3Blbi1icmFjZXMgaW4gY29sdW1uIHplcm8gdG8gZmluZCB0aGUgYmVnaW5uaW5ncyBvZiBDIGZ1bmN0aW9ucy4KLVRoZXNlIHRvb2xzIHdpbGwgbm90IHdvcmsgb24gY29kZSBub3QgZm9ybWF0dGVkIHRoYXQgd2F5LgotCi1JdCBpcyBhbHNvIGltcG9ydGFudCBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gc3RhcnQgdGhlIG5hbWUgb2YgdGhlCi1mdW5jdGlvbiBpbiBjb2x1bW4gemVyby4gIFRoaXMgaGVscHMgcGVvcGxlIHRvIHNlYXJjaCBmb3IgZnVuY3Rpb24KLWRlZmluaXRpb25zLCBhbmQgbWF5IGFsc28gaGVscCBjZXJ0YWluIHRvb2xzIHJlY29nbml6ZSB0aGVtLiAgVGh1cywKLXRoZSBwcm9wZXIgZm9ybWF0IGlzIHRoaXM6Ci0KLUBleGFtcGxlCi1zdGF0aWMgY2hhciAqCi1jb25jYXQgKHMxLCBzMikgICAgICAgIC8qIE5hbWUgc3RhcnRzIGluIGNvbHVtbiB6ZXJvIGhlcmUgKi8KLSAgICAgY2hhciAqczEsICpzMjsKLUB7ICAgICAgICAgICAgICAgICAgICAgLyogT3BlbiBicmFjZSBpbiBjb2x1bW4gemVybyBoZXJlICovCi0gIEBkb3Rze30KLUB9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1vciwgaWYgeW91IHdhbnQgdG8gdXNlIEBzY3thbnNpfSBDLCBmb3JtYXQgdGhlIGRlZmluaXRpb24gbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotc3RhdGljIGNoYXIgKgotY29uY2F0IChjaGFyICpzMSwgY2hhciAqczIpCi1AewotICBAZG90c3t9Ci1AfQotQGVuZCBleGFtcGxlCi0KLUluIEBzY3thbnNpfSBDLCBpZiB0aGUgYXJndW1lbnRzIGRvbid0IGZpdCBuaWNlbHkgb24gb25lIGxpbmUsCi1zcGxpdCBpdCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1pbnQKLWxvdHNfb2ZfYXJncyAoaW50IGFuX2ludGVnZXIsIGxvbmcgYV9sb25nLCBzaG9ydCBhX3Nob3J0LAotICAgICAgICAgICAgICBkb3VibGUgYV9kb3VibGUsIGZsb2F0IGFfZmxvYXQpCi1AZG90c3t9Ci1AZW5kIGV4YW1wbGUKLQotRm9yIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgd2UgcHJlZmVyIGNvZGUgZm9ybWF0dGVkIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmICh4IDwgZm9vICh5LCB6KSkKLSAgaGFoYSA9IGJhcls0XSArIDU7Ci1lbHNlCi0gIEB7Ci0gICAgd2hpbGUgKHopCi0gICAgICBAewotICAgICAgICBoYWhhICs9IGZvbyAoeiwgeik7Ci0gICAgICAgIHotLTsKLSAgICAgIEB9Ci0gICAgcmV0dXJuICsreCArIGJhciAoKTsKLSAgQH0KLUBlbmQgZXhhbXBsZQotCi1XZSBmaW5kIGl0IGVhc2llciB0byByZWFkIGEgcHJvZ3JhbSB3aGVuIGl0IGhhcyBzcGFjZXMgYmVmb3JlIHRoZQotb3Blbi1wYXJlbnRoZXNlcyBhbmQgYWZ0ZXIgdGhlIGNvbW1hcy4gIEVzcGVjaWFsbHkgYWZ0ZXIgdGhlIGNvbW1hcy4KLQotV2hlbiB5b3Ugc3BsaXQgYW4gZXhwcmVzc2lvbiBpbnRvIG11bHRpcGxlIGxpbmVzLCBzcGxpdCBpdAotYmVmb3JlIGFuIG9wZXJhdG9yLCBub3QgYWZ0ZXIgb25lLiAgSGVyZSBpcyB0aGUgcmlnaHQgd2F5OgotCi1AZXhhbXBsZQotaWYgKGZvb190aGlzX2lzX2xvbmcgJiYgYmFyID4gd2luICh4LCB5LCB6KQotICAgICYmIHJlbWFpbmluZ19jb25kaXRpb24pCi1AZW5kIGV4YW1wbGUKLQotVHJ5IHRvIGF2b2lkIGhhdmluZyB0d28gb3BlcmF0b3JzIG9mIGRpZmZlcmVudCBwcmVjZWRlbmNlIGF0IHRoZSBzYW1lCi1sZXZlbCBvZiBpbmRlbnRhdGlvbi4gIEZvciBleGFtcGxlLCBkb24ndCB3cml0ZSB0aGlzOgotCi1AZXhhbXBsZQotbW9kZSA9IChpbm1vZGVbal0gPT0gVk9JRG1vZGUKLSAgICAgICAgfHwgR0VUX01PREVfU0laRSAob3V0bW9kZVtqXSkgPiBHRVRfTU9ERV9TSVpFIChpbm1vZGVbal0pCi0gICAgICAgID8gb3V0bW9kZVtqXSA6IGlubW9kZVtqXSk7Ci1AZW5kIGV4YW1wbGUKLQotSW5zdGVhZCwgdXNlIGV4dHJhIHBhcmVudGhlc2VzIHNvIHRoYXQgdGhlIGluZGVudGF0aW9uIHNob3dzIHRoZSBuZXN0aW5nOgotCi1AZXhhbXBsZQotbW9kZSA9ICgoaW5tb2RlW2pdID09IFZPSURtb2RlCi0gICAgICAgICB8fCAoR0VUX01PREVfU0laRSAob3V0bW9kZVtqXSkgPiBHRVRfTU9ERV9TSVpFIChpbm1vZGVbal0pKSkKLSAgICAgICAgPyBvdXRtb2RlW2pdIDogaW5tb2RlW2pdKTsKLUBlbmQgZXhhbXBsZQotCi1JbnNlcnQgZXh0cmEgcGFyZW50aGVzZXMgc28gdGhhdCBFbWFjcyB3aWxsIGluZGVudCB0aGUgY29kZSBwcm9wZXJseS4KLUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGluZGVudGF0aW9uIGxvb2tzIG5pY2UgaWYgeW91IGRvIGl0IGJ5IGhhbmQsCi1idXQgRW1hY3Mgd291bGQgbWVzcyBpdCB1cDoKLQotQGV4YW1wbGUKLXYgPSBydXAtPnJ1X3V0aW1lLnR2X3NlYyoxMDAwICsgcnVwLT5ydV91dGltZS50dl91c2VjLzEwMDAKLSAgICArIHJ1cC0+cnVfc3RpbWUudHZfc2VjKjEwMDAgKyBydXAtPnJ1X3N0aW1lLnR2X3VzZWMvMTAwMDsKLUBlbmQgZXhhbXBsZQotCi1CdXQgYWRkaW5nIGEgc2V0IG9mIHBhcmVudGhlc2VzIHNvbHZlcyB0aGUgcHJvYmxlbToKLQotQGV4YW1wbGUKLXYgPSAocnVwLT5ydV91dGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfdXRpbWUudHZfdXNlYy8xMDAwCi0gICAgICsgcnVwLT5ydV9zdGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfc3RpbWUudHZfdXNlYy8xMDAwKTsKLUBlbmQgZXhhbXBsZQotCi1Gb3JtYXQgZG8td2hpbGUgc3RhdGVtZW50cyBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1kbwotICBAewotICAgIGEgPSBmb28gKGEpOwotICBAfQotd2hpbGUgKGEgPiAwKTsKLUBlbmQgZXhhbXBsZQotCi1QbGVhc2UgdXNlIGZvcm1mZWVkIGNoYXJhY3RlcnMgKGNvbnRyb2wtTCkgdG8gZGl2aWRlIHRoZSBwcm9ncmFtIGludG8KLXBhZ2VzIGF0IGxvZ2ljYWwgcGxhY2VzIChidXQgbm90IHdpdGhpbiBhIGZ1bmN0aW9uKS4gIEl0IGRvZXMgbm90IG1hdHRlcgotanVzdCBob3cgbG9uZyB0aGUgcGFnZXMgYXJlLCBzaW5jZSB0aGV5IGRvIG5vdCBoYXZlIHRvIGZpdCBvbiBhIHByaW50ZWQKLXBhZ2UuICBUaGUgZm9ybWZlZWRzIHNob3VsZCBhcHBlYXIgYWxvbmUgb24gbGluZXMgYnkgdGhlbXNlbHZlcy4KLQotCi1Abm9kZSBDb21tZW50cwotQHNlY3Rpb24gQ29tbWVudGluZyBZb3VyIFdvcmsKLQotRXZlcnkgcHJvZ3JhbSBzaG91bGQgc3RhcnQgd2l0aCBhIGNvbW1lbnQgc2F5aW5nIGJyaWVmbHkgd2hhdCBpdCBpcyBmb3IuCi1FeGFtcGxlOiBAc2FtcHtmbXQgLSBmaWx0ZXIgZm9yIHNpbXBsZSBmaWxsaW5nIG9mIHRleHR9LgotCi1QbGVhc2Ugd3JpdGUgdGhlIGNvbW1lbnRzIGluIGEgR05VIHByb2dyYW0gaW4gRW5nbGlzaCwgYmVjYXVzZSBFbmdsaXNoCi1pcyB0aGUgb25lIGxhbmd1YWdlIHRoYXQgbmVhcmx5IGFsbCBwcm9ncmFtbWVycyBpbiBhbGwgY291bnRyaWVzIGNhbgotcmVhZC4gIElmIHlvdSBkbyBub3Qgd3JpdGUgRW5nbGlzaCB3ZWxsLCBwbGVhc2Ugd3JpdGUgY29tbWVudHMgaW4KLUVuZ2xpc2ggYXMgd2VsbCBhcyB5b3UgY2FuLCB0aGVuIGFzayBvdGhlciBwZW9wbGUgdG8gaGVscCByZXdyaXRlIHRoZW0uCi1JZiB5b3UgY2FuJ3Qgd3JpdGUgY29tbWVudHMgaW4gRW5nbGlzaCwgcGxlYXNlIGZpbmQgc29tZW9uZSB0byB3b3JrIHdpdGgKLXlvdSBhbmQgdHJhbnNsYXRlIHlvdXIgY29tbWVudHMgaW50byBFbmdsaXNoLgotCi1QbGVhc2UgcHV0IGEgY29tbWVudCBvbiBlYWNoIGZ1bmN0aW9uIHNheWluZyB3aGF0IHRoZSBmdW5jdGlvbiBkb2VzLAotd2hhdCBzb3J0cyBvZiBhcmd1bWVudHMgaXQgZ2V0cywgYW5kIHdoYXQgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZgotYXJndW1lbnRzIG1lYW4gYW5kIGFyZSB1c2VkIGZvci4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZHVwbGljYXRlIGluCi13b3JkcyB0aGUgbWVhbmluZyBvZiB0aGUgQyBhcmd1bWVudCBkZWNsYXJhdGlvbnMsIGlmIGEgQyB0eXBlIGlzIGJlaW5nCi11c2VkIGluIGl0cyBjdXN0b21hcnkgZmFzaGlvbi4gIElmIHRoZXJlIGlzIGFueXRoaW5nIG5vbnN0YW5kYXJkIGFib3V0Ci1pdHMgdXNlIChzdWNoIGFzIGFuIGFyZ3VtZW50IG9mIHR5cGUgQGNvZGV7Y2hhciAqfSB3aGljaCBpcyByZWFsbHkgdGhlCi1hZGRyZXNzIG9mIHRoZSBzZWNvbmQgY2hhcmFjdGVyIG9mIGEgc3RyaW5nLCBub3QgdGhlIGZpcnN0KSwgb3IgYW55Ci1wb3NzaWJsZSB2YWx1ZXMgdGhhdCB3b3VsZCBub3Qgd29yayB0aGUgd2F5IG9uZSB3b3VsZCBleHBlY3QgKHN1Y2ggYXMsCi10aGF0IHN0cmluZ3MgY29udGFpbmluZyBuZXdsaW5lcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gd29yayksIGJlIHN1cmUKLXRvIHNheSBzby4KLQotQWxzbyBleHBsYWluIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIHJldHVybiB2YWx1ZSwgaWYgdGhlcmUgaXMgb25lLgotCi1QbGVhc2UgcHV0IHR3byBzcGFjZXMgYWZ0ZXIgdGhlIGVuZCBvZiBhIHNlbnRlbmNlIGluIHlvdXIgY29tbWVudHMsIHNvCi10aGF0IHRoZSBFbWFjcyBzZW50ZW5jZSBjb21tYW5kcyB3aWxsIHdvcmsuICBBbHNvLCBwbGVhc2Ugd3JpdGUKLWNvbXBsZXRlIHNlbnRlbmNlcyBhbmQgY2FwaXRhbGl6ZSB0aGUgZmlyc3Qgd29yZC4gIElmIGEgbG93ZXItY2FzZQotaWRlbnRpZmllciBjb21lcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2VudGVuY2UsIGRvbid0IGNhcGl0YWxpemUgaXQhCi1DaGFuZ2luZyB0aGUgc3BlbGxpbmcgbWFrZXMgaXQgYSBkaWZmZXJlbnQgaWRlbnRpZmllci4gIElmIHlvdSBkb24ndAotbGlrZSBzdGFydGluZyBhIHNlbnRlbmNlIHdpdGggYSBsb3dlciBjYXNlIGxldHRlciwgd3JpdGUgdGhlIHNlbnRlbmNlCi1kaWZmZXJlbnRseSAoZS5nLiwgYGBUaGUgaWRlbnRpZmllciBsb3dlci1jYXNlIGlzIEBkb3Rze30nJykuCi0KLVRoZSBjb21tZW50IG9uIGEgZnVuY3Rpb24gaXMgbXVjaCBjbGVhcmVyIGlmIHlvdSB1c2UgdGhlIGFyZ3VtZW50Ci1uYW1lcyB0byBzcGVhayBhYm91dCB0aGUgYXJndW1lbnQgdmFsdWVzLiAgVGhlIHZhcmlhYmxlIG5hbWUgaXRzZWxmCi1zaG91bGQgYmUgbG93ZXIgY2FzZSwgYnV0IHdyaXRlIGl0IGluIHVwcGVyIGNhc2Ugd2hlbiB5b3UgYXJlIHNwZWFraW5nCi1hYm91dCB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIHZhcmlhYmxlIGl0c2VsZi4gIFRodXMsIGBgdGhlIGlub2RlCi1udW1iZXIgTk9ERV9OVU0nJyByYXRoZXIgdGhhbiBgYGFuIGlub2RlJycuCi0KLVRoZXJlIGlzIHVzdWFsbHkgbm8gcHVycG9zZSBpbiByZXN0YXRpbmcgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluCi10aGUgY29tbWVudCBiZWZvcmUgaXQsIGJlY2F1c2UgdGhlIHJlYWRlciBjYW4gc2VlIHRoYXQgZm9yIGhpbXNlbGYuCi1UaGVyZSBtaWdodCBiZSBhbiBleGNlcHRpb24gd2hlbiB0aGUgY29tbWVudCBpcyBzbyBsb25nIHRoYXQgdGhlIGZ1bmN0aW9uCi1pdHNlbGYgd291bGQgYmUgb2ZmIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4KLQotVGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBvbiBlYWNoIHN0YXRpYyB2YXJpYWJsZSBhcyB3ZWxsLCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi0vKiBOb256ZXJvIG1lYW5zIHRydW5jYXRlIGxpbmVzIGluIHRoZSBkaXNwbGF5OwotICAgemVybyBtZWFucyBjb250aW51ZSB0aGVtLiAgKi8KLWludCB0cnVuY2F0ZV9saW5lczsKLUBlbmQgZXhhbXBsZQotCi1FdmVyeSBAc2FtcHsjZW5kaWZ9IHNob3VsZCBoYXZlIGEgY29tbWVudCwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHNob3J0Ci1jb25kaXRpb25hbHMgKGp1c3QgYSBmZXcgbGluZXMpIHRoYXQgYXJlIG5vdCBuZXN0ZWQuICBUaGUgY29tbWVudCBzaG91bGQKLXN0YXRlIHRoZSBjb25kaXRpb24gb2YgdGhlIGNvbmRpdGlvbmFsIHRoYXQgaXMgZW5kaW5nLCBAZW1waHtpbmNsdWRpbmcKLWl0cyBzZW5zZX0uICBAc2FtcHsjZWxzZX0gc2hvdWxkIGhhdmUgYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbgotQGVtcGh7YW5kIHNlbnNlfSBvZiB0aGUgY29kZSB0aGF0IGZvbGxvd3MuICBGb3IgZXhhbXBsZToKLQotQGV4YW1wbGUKLUBncm91cAotI2lmZGVmIGZvbwotICBAZG90c3t9Ci0jZWxzZSAvKiBub3QgZm9vICovCi0gIEBkb3Rze30KLSNlbmRpZiAvKiBub3QgZm9vICovCi1AZW5kIGdyb3VwCi1AZ3JvdXAKLSNpZmRlZiBmb28KLSAgQGRvdHN7fQotI2VuZGlmIC8qIGZvbyAqLwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotYnV0LCBieSBjb250cmFzdCwgd3JpdGUgdGhlIGNvbW1lbnRzIHRoaXMgd2F5IGZvciBhIEBzYW1weyNpZm5kZWZ9OgotCi1AZXhhbXBsZQotQGdyb3VwCi0jaWZuZGVmIGZvbwotICBAZG90c3t9Ci0jZWxzZSAvKiBmb28gKi8KLSAgQGRvdHN7fQotI2VuZGlmIC8qIGZvbyAqLwotQGVuZCBncm91cAotQGdyb3VwCi0jaWZuZGVmIGZvbwotICBAZG90c3t9Ci0jZW5kaWYgLyogbm90IGZvbyAqLwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2RlIFN5bnRhY3RpYyBDb252ZW50aW9ucwotQHNlY3Rpb24gQ2xlYW4gVXNlIG9mIEMgQ29uc3RydWN0cwotCi1QbGVhc2UgZXhwbGljaXRseSBkZWNsYXJlIGFsbCBhcmd1bWVudHMgdG8gZnVuY3Rpb25zLgotRG9uJ3Qgb21pdCB0aGVtIGp1c3QgYmVjYXVzZSB0aGV5IGFyZSBAY29kZXtpbnR9cy4KLQotRGVjbGFyYXRpb25zIG9mIGV4dGVybmFsIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb25zIHRvIGFwcGVhciBsYXRlciBpbiB0aGUKLXNvdXJjZSBmaWxlIHNob3VsZCBhbGwgZ28gaW4gb25lIHBsYWNlIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZQotKHNvbWV3aGVyZSBiZWZvcmUgdGhlIGZpcnN0IGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gdGhlIGZpbGUpLCBvciBlbHNlCi1zaG91bGQgZ28gaW4gYSBoZWFkZXIgZmlsZS4gIERvbid0IHB1dCBAY29kZXtleHRlcm59IGRlY2xhcmF0aW9ucyBpbnNpZGUKLWZ1bmN0aW9ucy4KLQotSXQgdXNlZCB0byBiZSBjb21tb24gcHJhY3RpY2UgdG8gdXNlIHRoZSBzYW1lIGxvY2FsIHZhcmlhYmxlcyAod2l0aAotbmFtZXMgbGlrZSBAY29kZXt0ZW19KSBvdmVyIGFuZCBvdmVyIGZvciBkaWZmZXJlbnQgdmFsdWVzIHdpdGhpbiBvbmUKLWZ1bmN0aW9uLiAgSW5zdGVhZCBvZiBkb2luZyB0aGlzLCBpdCBpcyBiZXR0ZXIgZGVjbGFyZSBhIHNlcGFyYXRlIGxvY2FsCi12YXJpYWJsZSBmb3IgZWFjaCBkaXN0aW5jdCBwdXJwb3NlLCBhbmQgZ2l2ZSBpdCBhIG5hbWUgd2hpY2ggaXMKLW1lYW5pbmdmdWwuICBUaGlzIG5vdCBvbmx5IG1ha2VzIHByb2dyYW1zIGVhc2llciB0byB1bmRlcnN0YW5kLCBpdCBhbHNvCi1mYWNpbGl0YXRlcyBvcHRpbWl6YXRpb24gYnkgZ29vZCBjb21waWxlcnMuICBZb3UgY2FuIGFsc28gbW92ZSB0aGUKLWRlY2xhcmF0aW9uIG9mIGVhY2ggbG9jYWwgdmFyaWFibGUgaW50byB0aGUgc21hbGxlc3Qgc2NvcGUgdGhhdCBpbmNsdWRlcwotYWxsIGl0cyB1c2VzLiAgVGhpcyBtYWtlcyB0aGUgcHJvZ3JhbSBldmVuIGNsZWFuZXIuCi0KLURvbid0IHVzZSBsb2NhbCB2YXJpYWJsZXMgb3IgcGFyYW1ldGVycyB0aGF0IHNoYWRvdyBnbG9iYWwgaWRlbnRpZmllcnMuCi0KLURvbid0IGRlY2xhcmUgbXVsdGlwbGUgdmFyaWFibGVzIGluIG9uZSBkZWNsYXJhdGlvbiB0aGF0IHNwYW5zIGxpbmVzLgotU3RhcnQgYSBuZXcgZGVjbGFyYXRpb24gb24gZWFjaCBsaW5lLCBpbnN0ZWFkLiAgRm9yIGV4YW1wbGUsIGluc3RlYWQKLW9mIHRoaXM6Ci0KLUBleGFtcGxlCi1AZ3JvdXAKLWludCAgICBmb28sCi0gICAgICAgYmFyOwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd3JpdGUgZWl0aGVyIHRoaXM6Ci0KLUBleGFtcGxlCi1pbnQgZm9vLCBiYXI7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1vciB0aGlzOgotCi1AZXhhbXBsZQotaW50IGZvbzsKLWludCBiYXI7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci0oSWYgdGhleSBhcmUgZ2xvYmFsIHZhcmlhYmxlcywgZWFjaCBzaG91bGQgaGF2ZSBhIGNvbW1lbnQgcHJlY2VkaW5nIGl0Ci1hbnl3YXkuKQotCi1XaGVuIHlvdSBoYXZlIGFuIEBjb2Rle2lmfS1AY29kZXtlbHNlfSBzdGF0ZW1lbnQgbmVzdGVkIGluIGFub3RoZXIKLUBjb2Rle2lmfSBzdGF0ZW1lbnQsIGFsd2F5cyBwdXQgYnJhY2VzIGFyb3VuZCB0aGUgQGNvZGV7aWZ9LUBjb2Rle2Vsc2V9LgotVGh1cywgbmV2ZXIgd3JpdGUgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaWYgKGZvbykKLSAgaWYgKGJhcikKLSAgICB3aW4gKCk7Ci0gIGVsc2UKLSAgICBsb3NlICgpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotYWx3YXlzIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIEB7Ci0gICAgaWYgKGJhcikKLSAgICAgIHdpbiAoKTsKLSAgICBlbHNlCi0gICAgICBsb3NlICgpOwotICBAfQotQGVuZCBleGFtcGxlCi0KLUlmIHlvdSBoYXZlIGFuIEBjb2Rle2lmfSBzdGF0ZW1lbnQgbmVzdGVkIGluc2lkZSBvZiBhbiBAY29kZXtlbHNlfQotc3RhdGVtZW50LCBlaXRoZXIgd3JpdGUgQGNvZGV7ZWxzZSBpZn0gb24gb25lIGxpbmUsIGxpa2UgdGhpcywKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIEBkb3Rze30KLWVsc2UgaWYgKGJhcikKLSAgQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2l0aCBpdHMgQGNvZGV7dGhlbn0tcGFydCBpbmRlbnRlZCBsaWtlIHRoZSBwcmVjZWRpbmcgQGNvZGV7dGhlbn0tcGFydCwKLW9yIHdyaXRlIHRoZSBuZXN0ZWQgQGNvZGV7aWZ9IHdpdGhpbiBicmFjZXMgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaWYgKGZvbykKLSAgQGRvdHN7fQotZWxzZQotICBAewotICAgIGlmIChiYXIpCi0gICAgICBAZG90c3t9Ci0gIEB9Ci1AZW5kIGV4YW1wbGUKLQotRG9uJ3QgZGVjbGFyZSBib3RoIGEgc3RydWN0dXJlIHRhZyBhbmQgdmFyaWFibGVzIG9yIHR5cGVkZWZzIGluIHRoZQotc2FtZSBkZWNsYXJhdGlvbi4gIEluc3RlYWQsIGRlY2xhcmUgdGhlIHN0cnVjdHVyZSB0YWcgc2VwYXJhdGVseQotYW5kIHRoZW4gdXNlIGl0IHRvIGRlY2xhcmUgdGhlIHZhcmlhYmxlcyBvciB0eXBlZGVmcy4KLQotVHJ5IHRvIGF2b2lkIGFzc2lnbm1lbnRzIGluc2lkZSBAY29kZXtpZn0tY29uZGl0aW9ucy4gIEZvciBleGFtcGxlLAotZG9uJ3Qgd3JpdGUgdGhpczoKLQotQGV4YW1wbGUKLWlmICgoZm9vID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKmZvbykpID09IDApCi0gIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1pbnN0ZWFkLCB3cml0ZSB0aGlzOgotCi1AZXhhbXBsZQotZm9vID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKmZvbyk7Ci1pZiAoZm9vID09IDApCi0gIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci1AZW5kIGV4YW1wbGUKLQotRG9uJ3QgbWFrZSB0aGUgcHJvZ3JhbSB1Z2x5IHRvIHBsYWNhdGUgQGNvZGV7bGludH0uICBQbGVhc2UgZG9uJ3QgaW5zZXJ0IGFueQotY2FzdHMgdG8gQGNvZGV7dm9pZH0uICBaZXJvIHdpdGhvdXQgYSBjYXN0IGlzIHBlcmZlY3RseSBmaW5lIGFzIGEgbnVsbAotcG9pbnRlciBjb25zdGFudCwgZXhjZXB0IHdoZW4gY2FsbGluZyBhIHZhcmFyZ3MgZnVuY3Rpb24uCi0KLUBub2RlICBOYW1lcwotQHNlY3Rpb24gTmFtaW5nIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCi0KLVRoZSBuYW1lcyBvZiBnbG9iYWwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgaW4gYSBwcm9ncmFtIHNlcnZlIGFzCi1jb21tZW50cyBvZiBhIHNvcnQuICBTbyBkb24ndCBjaG9vc2UgdGVyc2UgbmFtZXMtLS1pbnN0ZWFkLCBsb29rIGZvcgotbmFtZXMgdGhhdCBnaXZlIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaWFibGUgb3IKLWZ1bmN0aW9uLiAgSW4gYSBHTlUgcHJvZ3JhbSwgbmFtZXMgc2hvdWxkIGJlIEVuZ2xpc2gsIGxpa2Ugb3RoZXIKLWNvbW1lbnRzLgotCi1Mb2NhbCB2YXJpYWJsZSBuYW1lcyBjYW4gYmUgc2hvcnRlciwgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIG9ubHkgd2l0aGluCi1vbmUgY29udGV4dCwgd2hlcmUgKHByZXN1bWFibHkpIGNvbW1lbnRzIGV4cGxhaW4gdGhlaXIgcHVycG9zZS4KLQotUGxlYXNlIHVzZSB1bmRlcnNjb3JlcyB0byBzZXBhcmF0ZSB3b3JkcyBpbiBhIG5hbWUsIHNvIHRoYXQgdGhlIEVtYWNzCi13b3JkIGNvbW1hbmRzIGNhbiBiZSB1c2VmdWwgd2l0aGluIHRoZW0uICBTdGljayB0byBsb3dlciBjYXNlOyByZXNlcnZlCi11cHBlciBjYXNlIGZvciBtYWNyb3MgYW5kIEBjb2Rle2VudW19IGNvbnN0YW50cywgYW5kIGZvciBuYW1lLXByZWZpeGVzCi10aGF0IGZvbGxvdyBhIHVuaWZvcm0gY29udmVudGlvbi4KLQotRm9yIGV4YW1wbGUsIHlvdSBzaG91bGQgdXNlIG5hbWVzIGxpa2UgQGNvZGV7aWdub3JlX3NwYWNlX2NoYW5nZV9mbGFnfTsKLWRvbid0IHVzZSBuYW1lcyBsaWtlIEBjb2Rle2lDYW50UmVhZFRoaXN9LgotCi1WYXJpYWJsZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIGNvbW1hbmQtbGluZSBvcHRpb25zIGhhdmUgYmVlbgotc3BlY2lmaWVkIHNob3VsZCBiZSBuYW1lZCBhZnRlciB0aGUgbWVhbmluZyBvZiB0aGUgb3B0aW9uLCBub3QgYWZ0ZXIKLXRoZSBvcHRpb24tbGV0dGVyLiAgQSBjb21tZW50IHNob3VsZCBzdGF0ZSBib3RoIHRoZSBleGFjdCBtZWFuaW5nIG9mCi10aGUgb3B0aW9uIGFuZCBpdHMgbGV0dGVyLiAgRm9yIGV4YW1wbGUsCi0KLUBleGFtcGxlCi1AZ3JvdXAKLS8qIElnbm9yZSBjaGFuZ2VzIGluIGhvcml6b250YWwgd2hpdGVzcGFjZSAoLWIpLiAgKi8KLWludCBpZ25vcmVfc3BhY2VfY2hhbmdlX2ZsYWc7Ci1AZW5kIGdyb3VwCi1AZW5kIGV4YW1wbGUKLQotV2hlbiB5b3Ugd2FudCB0byBkZWZpbmUgbmFtZXMgd2l0aCBjb25zdGFudCBpbnRlZ2VyIHZhbHVlcywgdXNlCi1AY29kZXtlbnVtfSByYXRoZXIgdGhhbiBAc2FtcHsjZGVmaW5lfS4gIEdEQiBrbm93cyBhYm91dCBlbnVtZXJhdGlvbgotY29uc3RhbnRzLgotCi1Vc2UgZmlsZSBuYW1lcyBvZiAxNCBjaGFyYWN0ZXJzIG9yIGxlc3MsIHRvIGF2b2lkIGNyZWF0aW5nIGdyYXR1aXRvdXMKLXByb2JsZW1zIG9uIG9sZGVyIFN5c3RlbSBWIHN5c3RlbXMuICBZb3UgY2FuIHVzZSB0aGUgcHJvZ3JhbQotQGNvZGV7ZG9zY2hrfSB0byB0ZXN0IGZvciB0aGlzLiAgQGNvZGV7ZG9zY2hrfSBhbHNvIHRlc3RzIGZvciBwb3RlbnRpYWwKLW5hbWUgY29uZmxpY3RzIGlmIHRoZSBmaWxlcyB3ZXJlIGxvYWRlZCBvbnRvIGFuIE1TLURPUyBmaWxlCi1zeXN0ZW0tLS1zb21ldGhpbmcgeW91IG1heSBvciBtYXkgbm90IGNhcmUgYWJvdXQuCi0KLUBub2RlIFN5c3RlbSBQb3J0YWJpbGl0eQotQHNlY3Rpb24gUG9ydGFiaWxpdHkgYmV0d2VlbiBTeXN0ZW0gVHlwZXMKLQotSW4gdGhlIFVuaXggd29ybGQsIGBgcG9ydGFiaWxpdHknJyByZWZlcnMgdG8gcG9ydGluZyB0byBkaWZmZXJlbnQgVW5peAotdmVyc2lvbnMuICBGb3IgYSBHTlUgcHJvZ3JhbSwgdGhpcyBraW5kIG9mIHBvcnRhYmlsaXR5IGlzIGRlc2lyYWJsZSwgYnV0Ci1ub3QgcGFyYW1vdW50LgotCi1UaGUgcHJpbWFyeSBwdXJwb3NlIG9mIEdOVSBzb2Z0d2FyZSBpcyB0byBydW4gb24gdG9wIG9mIHRoZSBHTlUga2VybmVsLAotY29tcGlsZWQgd2l0aCB0aGUgR05VIEMgY29tcGlsZXIsIG9uIHZhcmlvdXMgdHlwZXMgb2YgQHNje2NwdX0uICBUaGUKLWFtb3VudCBhbmQga2luZHMgb2YgdmFyaWF0aW9uIGFtb25nIEdOVSBzeXN0ZW1zIG9uIGRpZmZlcmVudCBAc2N7Y3B1fXMKLXdpbGwgYmUgY29tcGFyYWJsZSB0byB0aGUgdmFyaWF0aW9uIGFtb25nIExpbnV4LWJhc2VkIEdOVSBzeXN0ZW1zIG9yCi1hbW9uZyBCU0Qgc3lzdGVtcyB0b2RheS4gIFNvIHRoZSBraW5kcyBvZiBwb3J0YWJpbGl0eSB0aGF0IGFyZSBhYnNvbHV0ZWx5Ci1uZWNlc3NhcnkgYXJlIHF1aXRlIGxpbWl0ZWQuCi0KLUJ1dCBtYW55IHVzZXJzIGRvIHJ1biBHTlUgc29mdHdhcmUgb24gbm9uLUdOVSBVbml4IG9yIFVuaXgtbGlrZSBzeXN0ZW1zLgotU28gc3VwcG9ydGluZyBhIHZhcmlldHkgb2YgVW5peC1saWtlIHN5c3RlbXMgaXMgZGVzaXJhYmxlLCBhbHRob3VnaCBub3QKLXBhcmFtb3VudC4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGFjaGlldmUgcG9ydGFiaWxpdHkgdG8gbW9zdCBVbml4LWxpa2Ugc3lzdGVtcyBpcyB0bwotdXNlIEF1dG9jb25mLiAgSXQncyB1bmxpa2VseSB0aGF0IHlvdXIgcHJvZ3JhbSBuZWVkcyB0byBrbm93IG1vcmUKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBob3N0IHBsYXRmb3JtIHRoYW4gQXV0b2NvbmYgY2FuIHByb3ZpZGUsIHNpbXBseQotYmVjYXVzZSBtb3N0IG9mIHRoZSBwcm9ncmFtcyB0aGF0IG5lZWQgc3VjaCBrbm93bGVkZ2UgaGF2ZSBhbHJlYWR5IGJlZW4KLXdyaXR0ZW4uCi0KLUF2b2lkIHVzaW5nIHRoZSBmb3JtYXQgb2Ygc2VtaS1pbnRlcm5hbCBkYXRhIGJhc2VzIChlLmcuLCBkaXJlY3RvcmllcykKLXdoZW4gdGhlcmUgaXMgYSBoaWdoZXItbGV2ZWwgYWx0ZXJuYXRpdmUgKEBjb2Rle3JlYWRkaXJ9KS4KLQotQXMgZm9yIHN5c3RlbXMgdGhhdCBhcmUgbm90IGxpa2UgVW5peCwgc3VjaCBhcyBNU0RPUywgV2luZG93cywgdGhlCi1NYWNpbnRvc2gsIFZNUywgYW5kIE1WUywgc3VwcG9ydGluZyB0aGVtIGlzIHVzdWFsbHkgc28gbXVjaCB3b3JrIHRoYXQgaXQKLWlzIGJldHRlciBpZiB5b3UgZG9uJ3QuCi0KLVRoZSBwbGFubmVkIEdOVSBrZXJuZWwgaXMgbm90IGZpbmlzaGVkIHlldCwgYnV0IHlvdSBjYW4gdGVsbCB3aGljaAotZmFjaWxpdGllcyBpdCB3aWxsIHByb3ZpZGUgYnkgbG9va2luZyBhdCB0aGUgR05VIEMgTGlicmFyeSBNYW51YWwuICBUaGUKLUdOVSBrZXJuZWwgaXMgYmFzZWQgb24gTWFjaCwgc28gdGhlIGZlYXR1cmVzIG9mIE1hY2ggd2lsbCBhbHNvIGJlCi1hdmFpbGFibGUuICBIb3dldmVyLCBpZiB5b3UgdXNlIE1hY2ggZmVhdHVyZXMsIHlvdSdsbCBwcm9iYWJseSBoYXZlCi10cm91YmxlIGRlYnVnZ2luZyB5b3VyIHByb2dyYW0gdG9kYXkuCi0KLUBub2RlIENQVSBQb3J0YWJpbGl0eQotQHNlY3Rpb24gUG9ydGFiaWxpdHkgYmV0d2VlbiBAc2N7Y3B1fXMKLQotRXZlbiBHTlUgc3lzdGVtcyB3aWxsIGRpZmZlciBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGFtb25nIEBzY3tjcHV9Ci10eXBlcy0tLWZvciBleGFtcGxlLCBkaWZmZXJlbmNlIGluIGJ5dGUgb3JkZXJpbmcgYW5kIGFsaWdubWVudAotcmVxdWlyZW1lbnRzLiAgSXQgaXMgYWJzb2x1dGVseSBlc3NlbnRpYWwgdG8gaGFuZGxlIHRoZXNlIGRpZmZlcmVuY2VzLgotSG93ZXZlciwgZG9uJ3QgbWFrZSBhbnkgZWZmb3J0IHRvIGNhdGVyIHRvIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGFuCi1AY29kZXtpbnR9IHdpbGwgYmUgbGVzcyB0aGFuIDMyIGJpdHMuICBXZSBkb24ndCBzdXBwb3J0IDE2LWJpdCBtYWNoaW5lcwotaW4gR05VLgotCi1Eb24ndCBhc3N1bWUgdGhhdCB0aGUgYWRkcmVzcyBvZiBhbiBAY29kZXtpbnR9IG9iamVjdCBpcyBhbHNvIHRoZQotYWRkcmVzcyBvZiBpdHMgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZS4gIFRoaXMgaXMgZmFsc2Ugb24gYmlnLWVuZGlhbgotbWFjaGluZXMuICBUaHVzLCBkb24ndCBtYWtlIHRoZSBmb2xsb3dpbmcgbWlzdGFrZToKLQotQGV4YW1wbGUKLWludCBjOwotQGRvdHN7fQotd2hpbGUgKChjID0gZ2V0Y2hhcigpKSAhPSBFT0YpCi0gIHdyaXRlKGZpbGVfZGVzY3JpcHRvciwgJmMsIDEpOwotQGVuZCBleGFtcGxlCi0KLVdoZW4gY2FsbGluZyBmdW5jdGlvbnMsIHlvdSBuZWVkIG5vdCB3b3JyeSBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi1wb2ludGVycyBvZiB2YXJpb3VzIHR5cGVzLCBvciBiZXR3ZWVuIHBvaW50ZXJzIGFuZCBpbnRlZ2Vycy4gIE9uIG1vc3QKLW1hY2hpbmVzLCB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgYW55d2F5LiAgQXMgZm9yIHRoZSBmZXcgbWFjaGluZXMgd2hlcmUKLXRoZXJlIGlzIGEgZGlmZmVyZW5jZSwgYWxsIG9mIHRoZW0gc3VwcG9ydCBAc2N7YW5zaX0gQywgc28geW91IGNhbiB1c2UKLXByb3RvdHlwZXMgKGNvbmRpdGlvbmFsaXplZCB0byBiZSBhY3RpdmUgb25seSBpbiBAc2N7YW5zaX0gQykgdG8gbWFrZQotdGhlIGNvZGUgd29yayBvbiB0aG9zZSBzeXN0ZW1zLgotCi1JbiBjZXJ0YWluIGNhc2VzLCBpdCBpcyBvayB0byBwYXNzIGludGVnZXIgYW5kIHBvaW50ZXIgYXJndW1lbnRzCi1pbmRpc2NyaW1pbmF0ZWx5IHRvIHRoZSBzYW1lIGZ1bmN0aW9uLCBhbmQgdXNlIG5vIHByb3RvdHlwZSBvbiBhbnkKLXN5c3RlbS4gIEZvciBleGFtcGxlLCBtYW55IEdOVSBwcm9ncmFtcyBoYXZlIGVycm9yLXJlcG9ydGluZyBmdW5jdGlvbnMKLXRoYXQgcGFzcyB0aGVpciBhcmd1bWVudHMgYWxvbmcgdG8gQGNvZGV7cHJpbnRmfSBhbmQgZnJpZW5kczoKLQotQGV4YW1wbGUKLWVycm9yIChzLCBhMSwgYTIsIGEzKQotICAgICBjaGFyICpzOwotICAgICBpbnQgYTEsIGEyLCBhMzsKLUB7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVycm9yOiAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBzLCBhMSwgYTIsIGEzKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1JbiBwcmFjdGljZSwgdGhpcyB3b3JrcyBvbiBhbGwgbWFjaGluZXMsIGFuZCBpdCBpcyBtdWNoIHNpbXBsZXIgdGhhbiBhbnkKLWBgY29ycmVjdCcnIGFsdGVybmF0aXZlLiAgQmUgc3VyZSBAZW1waHtub3R9IHRvIHVzZSBhIHByb3RvdHlwZQotZm9yIHN1Y2ggZnVuY3Rpb25zLgotCi1Ib3dldmVyLCBhdm9pZCBjYXN0aW5nIHBvaW50ZXJzIHRvIGludGVnZXJzIHVubGVzcyB5b3UgcmVhbGx5IG5lZWQgdG8uCi1UaGVzZSBhc3N1bXB0aW9ucyByZWFsbHkgcmVkdWNlIHBvcnRhYmlsaXR5LCBhbmQgaW4gbW9zdCBwcm9ncmFtcyB0aGV5Ci1hcmUgZWFzeSB0byBhdm9pZC4gIEluIHRoZSBjYXNlcyB3aGVyZSBjYXN0aW5nIHBvaW50ZXJzIHRvIGludGVnZXJzIGlzCi1lc3NlbnRpYWwtLS1zdWNoIGFzLCBhIExpc3AgaW50ZXJwcmV0ZXIgd2hpY2ggc3RvcmVzIHR5cGUgaW5mb3JtYXRpb24gYXMKLXdlbGwgYXMgYW4gYWRkcmVzcyBpbiBvbmUgd29yZC0tLWl0IGlzIG9rIHRvIGRvIHNvLCBidXQgeW91J2xsIGhhdmUgdG8KLW1ha2UgZXhwbGljaXQgcHJvdmlzaW9ucyB0byBoYW5kbGUgZGlmZmVyZW50IHdvcmQgc2l6ZXMuCi0KLUBub2RlIFN5c3RlbSBGdW5jdGlvbnMKLUBzZWN0aW9uIENhbGxpbmcgU3lzdGVtIEZ1bmN0aW9ucwotCi1DIGltcGxlbWVudGF0aW9ucyBkaWZmZXIgc3Vic3RhbnRpYWxseS4gIEBzY3thbnNpfSBDIHJlZHVjZXMgYnV0IGRvZXMgbm90Ci1lbGltaW5hdGUgdGhlIGluY29tcGF0aWJpbGl0aWVzOyBtZWFud2hpbGUsIG1hbnkgdXNlcnMgd2lzaCB0byBjb21waWxlCi1HTlUgc29mdHdhcmUgd2l0aCBwcmUtQHNje2Fuc2l9IGNvbXBpbGVycy4gIFRoaXMgY2hhcHRlciBnaXZlcwotcmVjb21tZW5kYXRpb25zIGZvciBob3cgdG8gdXNlIHRoZSBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQgQyBsaWJyYXJ5Ci1mdW5jdGlvbnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbG9zcyBvZiBwb3J0YWJpbGl0eS4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLURvbid0IHVzZSB0aGUgdmFsdWUgb2YgQGNvZGV7c3ByaW50Zn0uICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YKLWNoYXJhY3RlcnMgd3JpdHRlbiBvbiBzb21lIHN5c3RlbXMsIGJ1dCBub3Qgb24gYWxsIHN5c3RlbXMuCi0KLUBpdGVtCi1AY29kZXttYWlufSBzaG91bGQgYmUgZGVjbGFyZWQgdG8gcmV0dXJuIHR5cGUgQGNvZGV7aW50fS4gIEl0IHNob3VsZAotdGVybWluYXRlIGVpdGhlciBieSBjYWxsaW5nIEBjb2Rle2V4aXR9IG9yIGJ5IHJldHVybmluZyB0aGUgaW50ZWdlcgotc3RhdHVzIGNvZGU7IG1ha2Ugc3VyZSBpdCBjYW5ub3QgZXZlciByZXR1cm4gYW4gdW5kZWZpbmVkIHZhbHVlLgotCi1AaXRlbQotRG9uJ3QgZGVjbGFyZSBzeXN0ZW0gZnVuY3Rpb25zIGV4cGxpY2l0bHkuCi0KLUFsbW9zdCBhbnkgZGVjbGFyYXRpb24gZm9yIGEgc3lzdGVtIGZ1bmN0aW9uIGlzIHdyb25nIG9uIHNvbWUgc3lzdGVtLgotVG8gbWluaW1pemUgY29uZmxpY3RzLCBsZWF2ZSBpdCB0byB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyB0byBkZWNsYXJlCi1zeXN0ZW0gZnVuY3Rpb25zLiAgSWYgdGhlIGhlYWRlcnMgZG9uJ3QgZGVjbGFyZSBhIGZ1bmN0aW9uLCBsZXQgaXQKLXJlbWFpbiB1bmRlY2xhcmVkLgotCi1XaGlsZSBpdCBtYXkgc2VlbSB1bmNsZWFuIHRvIHVzZSBhIGZ1bmN0aW9uIHdpdGhvdXQgZGVjbGFyaW5nIGl0LCBpbgotcHJhY3RpY2UgdGhpcyB3b3JrcyBmaW5lIGZvciBtb3N0IHN5c3RlbSBsaWJyYXJ5IGZ1bmN0aW9ucyBvbiB0aGUKLXN5c3RlbXMgd2hlcmUgdGhpcyByZWFsbHkgaGFwcGVuczsgdGh1cywgdGhlIGRpc2FkdmFudGFnZSBpcyBvbmx5Ci10aGVvcmV0aWNhbC4gIEJ5IGNvbnRyYXN0LCBhY3R1YWwgZGVjbGFyYXRpb25zIGhhdmUgZnJlcXVlbnRseSBjYXVzZWQKLWFjdHVhbCBjb25mbGljdHMuCi0KLUBpdGVtCi1JZiB5b3UgbXVzdCBkZWNsYXJlIGEgc3lzdGVtIGZ1bmN0aW9uLCBkb24ndCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcy4KLVVzZSBhbiBvbGQtc3R5bGUgZGVjbGFyYXRpb24sIG5vdCBhbiBAc2N7YW5zaX0gcHJvdG90eXBlLiAgVGhlIG1vcmUgeW91Ci1zcGVjaWZ5IGFib3V0IHRoZSBmdW5jdGlvbiwgdGhlIG1vcmUgbGlrZWx5IGEgY29uZmxpY3QuCi0KLUBpdGVtCi1JbiBwYXJ0aWN1bGFyLCBkb24ndCB1bmNvbmRpdGlvbmFsbHkgZGVjbGFyZSBAY29kZXttYWxsb2N9IG9yCi1AY29kZXtyZWFsbG9jfS4KLQotTW9zdCBHTlUgcHJvZ3JhbXMgdXNlIHRob3NlIGZ1bmN0aW9ucyBqdXN0IG9uY2UsIGluIGZ1bmN0aW9ucwotY29udmVudGlvbmFsbHkgbmFtZWQgQGNvZGV7eG1hbGxvY30gYW5kIEBjb2Rle3hyZWFsbG9jfS4gIFRoZXNlCi1mdW5jdGlvbnMgY2FsbCBAY29kZXttYWxsb2N9IGFuZCBAY29kZXtyZWFsbG9jfSwgcmVzcGVjdGl2ZWx5LCBhbmQKLWNoZWNrIHRoZSByZXN1bHRzLgotCi1CZWNhdXNlIEBjb2Rle3htYWxsb2N9IGFuZCBAY29kZXt4cmVhbGxvY30gYXJlIGRlZmluZWQgaW4geW91ciBwcm9ncmFtLAoteW91IGNhbiBkZWNsYXJlIHRoZW0gaW4gb3RoZXIgZmlsZXMgd2l0aG91dCBhbnkgcmlzayBvZiB0eXBlIGNvbmZsaWN0LgotCi1PbiBtb3N0IHN5c3RlbXMsIEBjb2Rle2ludH0gaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIGEgcG9pbnRlcjsgdGh1cywgdGhlCi1jYWxscyB0byBAY29kZXttYWxsb2N9IGFuZCBAY29kZXtyZWFsbG9jfSB3b3JrIGZpbmUuICBGb3IgdGhlIGZldwotZXhjZXB0aW9uYWwgc3lzdGVtcyAobW9zdGx5IDY0LWJpdCBtYWNoaW5lcyksIHlvdSBjYW4gdXNlCi1Ac3Ryb25ne2NvbmRpdGlvbmFsaXplZH0gZGVjbGFyYXRpb25zIG9mIEBjb2Rle21hbGxvY30gYW5kCi1AY29kZXtyZWFsbG9jfS0tLW9yIHB1dCB0aGVzZSBkZWNsYXJhdGlvbnMgaW4gY29uZmlndXJhdGlvbiBmaWxlcwotc3BlY2lmaWMgdG8gdGhvc2Ugc3lzdGVtcy4KLQotQGl0ZW0KLVRoZSBzdHJpbmcgZnVuY3Rpb25zIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQuICBTb21lIFVuaXggc3lzdGVtcyBoYXZlCi1hIGhlYWRlciBmaWxlIEBmaWxle3N0cmluZy5ofTsgb3RoZXJzIGhhdmUgQGZpbGV7c3RyaW5ncy5ofS4gIE5laXRoZXIKLWZpbGUgbmFtZSBpcyBwb3J0YWJsZS4gIFRoZXJlIGFyZSB0d28gdGhpbmdzIHlvdSBjYW4gZG86IHVzZSBBdXRvY29uZiB0bwotZmlndXJlIG91dCB3aGljaCBmaWxlIHRvIGluY2x1ZGUsIG9yIGRvbid0IGluY2x1ZGUgZWl0aGVyIGZpbGUuCi0KLUBpdGVtCi1JZiB5b3UgZG9uJ3QgaW5jbHVkZSBlaXRoZXIgc3RyaW5ncyBmaWxlLCB5b3UgY2FuJ3QgZ2V0IGRlY2xhcmF0aW9ucyBmb3IKLXRoZSBzdHJpbmcgZnVuY3Rpb25zIGZyb20gdGhlIGhlYWRlciBmaWxlIGluIHRoZSB1c3VhbCB3YXkuCi0KLVRoYXQgY2F1c2VzIGxlc3Mgb2YgYSBwcm9ibGVtIHRoYW4geW91IG1pZ2h0IHRoaW5rLiAgVGhlIG5ld2VyIEBzY3thbnNpfQotc3RyaW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgYXZvaWRlZCBhbnl3YXkgYmVjYXVzZSBtYW55IHN5c3RlbXMgc3RpbGwKLWRvbid0IHN1cHBvcnQgdGhlbS4gIFRoZSBzdHJpbmcgZnVuY3Rpb25zIHlvdSBjYW4gdXNlIGFyZSB0aGVzZToKLQotQGV4YW1wbGUKLXN0cmNweSAgIHN0cm5jcHkgICBzdHJjYXQgICBzdHJuY2F0Ci1zdHJsZW4gICBzdHJjbXAgICAgc3RybmNtcAotc3RyY2hyICAgc3RycmNocgotQGVuZCBleGFtcGxlCi0KLVRoZSBjb3B5IGFuZCBjb25jYXRlbmF0ZSBmdW5jdGlvbnMgd29yayBmaW5lIHdpdGhvdXQgYSBkZWNsYXJhdGlvbiBhcwotbG9uZyBhcyB5b3UgZG9uJ3QgdXNlIHRoZWlyIHZhbHVlcy4gIFVzaW5nIHRoZWlyIHZhbHVlcyB3aXRob3V0IGEKLWRlY2xhcmF0aW9uIGZhaWxzIG9uIHN5c3RlbXMgd2hlcmUgdGhlIHdpZHRoIG9mIGEgcG9pbnRlciBkaWZmZXJzIGZyb20KLXRoZSB3aWR0aCBvZiBAY29kZXtpbnR9LCBhbmQgcGVyaGFwcyBpbiBvdGhlciBjYXNlcy4gIEl0IGlzIHRyaXZpYWwgdG8KLWF2b2lkIHVzaW5nIHRoZWlyIHZhbHVlcywgc28gZG8gdGhhdC4KLQotVGhlIGNvbXBhcmUgZnVuY3Rpb25zIGFuZCBAY29kZXtzdHJsZW59IHdvcmsgZmluZSB3aXRob3V0IGEgZGVjbGFyYXRpb24KLW9uIG1vc3Qgc3lzdGVtcywgcG9zc2libHkgYWxsIHRoZSBvbmVzIHRoYXQgR05VIHNvZnR3YXJlIHJ1bnMgb24uCi1Zb3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGRlY2xhcmUgdGhlbSBAc3Ryb25ne2NvbmRpdGlvbmFsbHl9IG9uIGEKLWZldyBzeXN0ZW1zLgotCi1UaGUgc2VhcmNoIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIHRvIHJldHVybiBAY29kZXtjaGFyICp9LiAgTHVja2lseSwKLXRoZXJlIGlzIG5vIHZhcmlhdGlvbiBpbiB0aGUgZGF0YSB0eXBlIHRoZXkgcmV0dXJuLiAgQnV0IHRoZXJlIGlzCi12YXJpYXRpb24gaW4gdGhlaXIgbmFtZXMuICBTb21lIHN5c3RlbXMgZ2l2ZSB0aGVzZSBmdW5jdGlvbnMgdGhlIG5hbWVzCi1AY29kZXtpbmRleH0gYW5kIEBjb2Rle3JpbmRleH07IG90aGVyIHN5c3RlbXMgdXNlIHRoZSBuYW1lcwotQGNvZGV7c3RyY2hyfSBhbmQgQGNvZGV7c3RycmNocn0uICBTb21lIHN5c3RlbXMgc3VwcG9ydCBib3RoIHBhaXJzIG9mCi1uYW1lcywgYnV0IG5laXRoZXIgcGFpciB3b3JrcyBvbiBhbGwgc3lzdGVtcy4KLQotWW91IHNob3VsZCBwaWNrIGEgc2luZ2xlIHBhaXIgb2YgbmFtZXMgYW5kIHVzZSBpdCB0aHJvdWdob3V0IHlvdXIKLXByb2dyYW0uICAoTm93YWRheXMsIGl0IGlzIGJldHRlciB0byBjaG9vc2UgQGNvZGV7c3RyY2hyfSBhbmQKLUBjb2Rle3N0cnJjaHJ9IGZvciBuZXcgcHJvZ3JhbXMsIHNpbmNlIHRob3NlIGFyZSB0aGUgc3RhbmRhcmQgQHNje2Fuc2l9Ci1uYW1lcy4pICBEZWNsYXJlIGJvdGggb2YgdGhvc2UgbmFtZXMgYXMgZnVuY3Rpb25zIHJldHVybmluZyBAY29kZXtjaGFyCi0qfS4gIE9uIHN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aG9zZSBuYW1lcywgZGVmaW5lIHRoZW0gYXMgbWFjcm9zCi1pbiB0ZXJtcyBvZiB0aGUgb3RoZXIgcGFpci4gIEZvciBleGFtcGxlLCBoZXJlIGlzIHdoYXQgdG8gcHV0IGF0IHRoZQotYmVnaW5uaW5nIG9mIHlvdXIgZmlsZSAob3IgaW4gYSBoZWFkZXIpIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgbmFtZXMKLUBjb2Rle3N0cmNocn0gYW5kIEBjb2Rle3N0cnJjaHJ9IHRocm91Z2hvdXQ6Ci0KLUBleGFtcGxlCi0jaWZuZGVmIEhBVkVfU1RSQ0hSCi0jZGVmaW5lIHN0cmNociBpbmRleAotI2VuZGlmCi0jaWZuZGVmIEhBVkVfU1RSUkNIUgotI2RlZmluZSBzdHJyY2hyIHJpbmRleAotI2VuZGlmCi0KLWNoYXIgKnN0cmNociAoKTsKLWNoYXIgKnN0cnJjaHIgKCk7Ci1AZW5kIGV4YW1wbGUKLUBlbmQgaXRlbWl6ZQotCi1IZXJlIHdlIGFzc3VtZSB0aGF0IEBjb2Rle0hBVkVfU1RSQ0hSfSBhbmQgQGNvZGV7SEFWRV9TVFJSQ0hSfSBhcmUKLW1hY3JvcyBkZWZpbmVkIGluIHN5c3RlbXMgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIGV4aXN0LgotT25lIHdheSB0byBnZXQgdGhlbSBwcm9wZXJseSBkZWZpbmVkIGlzIHRvIHVzZSBBdXRvY29uZi4KLQotQG5vZGUgSW50ZXJuYXRpb25hbGl6YXRpb24KLUBzZWN0aW9uIEludGVybmF0aW9uYWxpemF0aW9uCi0KLUdOVSBoYXMgYSBsaWJyYXJ5IGNhbGxlZCBHTlUgZ2V0dGV4dCB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gdHJhbnNsYXRlIHRoZQotbWVzc2FnZXMgaW4gYSBwcm9ncmFtIGludG8gdmFyaW91cyBsYW5ndWFnZXMuICBZb3Ugc2hvdWxkIHVzZSB0aGlzCi1saWJyYXJ5IGluIGV2ZXJ5IHByb2dyYW0uICBVc2UgRW5nbGlzaCBmb3IgdGhlIG1lc3NhZ2VzIGFzIHRoZXkgYXBwZWFyCi1pbiB0aGUgcHJvZ3JhbSwgYW5kIGxldCBnZXR0ZXh0IHByb3ZpZGUgdGhlIHdheSB0byB0cmFuc2xhdGUgdGhlbSBpbnRvCi1vdGhlciBsYW5ndWFnZXMuCi0KLVVzaW5nIEdOVSBnZXR0ZXh0IGludm9sdmVzIHB1dHRpbmcgYSBjYWxsIHRvIHRoZSBAY29kZXtnZXR0ZXh0fSBtYWNybwotYXJvdW5kIGVhY2ggc3RyaW5nIHRoYXQgbWlnaHQgbmVlZCB0cmFuc2xhdGlvbi0tLWxpa2UgdGhpczoKLQotQGV4YW1wbGUKLXByaW50ZiAoZ2V0dGV4dCAoIlByb2Nlc3NpbmcgZmlsZSBgJXMnLi4uIikpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBwZXJtaXRzIEdOVSBnZXR0ZXh0IHRvIHJlcGxhY2UgdGhlIHN0cmluZyBAY29kZXsiUHJvY2Vzc2luZyBmaWxlCi1gJXMnLi4uIn0gd2l0aCBhIHRyYW5zbGF0ZWQgdmVyc2lvbi4KLQotT25jZSBhIHByb2dyYW0gdXNlcyBnZXR0ZXh0LCBwbGVhc2UgbWFrZSBhIHBvaW50IG9mIHdyaXRpbmcgY2FsbHMgdG8KLUBjb2Rle2dldHRleHR9IHdoZW4geW91IGFkZCBuZXcgc3RyaW5ncyB0aGF0IGNhbGwgZm9yIHRyYW5zbGF0aW9uLgotCi1Vc2luZyBHTlUgZ2V0dGV4dCBpbiBhIHBhY2thZ2UgaW52b2x2ZXMgc3BlY2lmeWluZyBhIEBkZm57dGV4dCBkb21haW4KLW5hbWV9IGZvciB0aGUgcGFja2FnZS4gIFRoZSB0ZXh0IGRvbWFpbiBuYW1lIGlzIHVzZWQgdG8gc2VwYXJhdGUgdGhlCi10cmFuc2xhdGlvbnMgZm9yIHRoaXMgcGFja2FnZSBmcm9tIHRoZSB0cmFuc2xhdGlvbnMgZm9yIG90aGVyIHBhY2thZ2VzLgotTm9ybWFsbHksIHRoZSB0ZXh0IGRvbWFpbiBuYW1lIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUKLXBhY2thZ2UtLS1mb3IgZXhhbXBsZSwgQHNhbXB7ZmlsZXV0aWxzfSBmb3IgdGhlIEdOVSBmaWxlIHV0aWxpdGllcy4KLQotVG8gZW5hYmxlIGdldHRleHQgdG8gd29yayB3ZWxsLCBhdm9pZCB3cml0aW5nIGNvZGUgdGhhdCBtYWtlcwotYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHN0cnVjdHVyZSBvZiB3b3JkcyBvciBzZW50ZW5jZXMuICBXaGVuIHlvdSB3YW50Ci10aGUgcHJlY2lzZSB0ZXh0IG9mIGEgc2VudGVuY2UgdG8gdmFyeSBkZXBlbmRpbmcgb24gdGhlIGRhdGEsIHVzZSB0d28gb3IKLW1vcmUgYWx0ZXJuYXRpdmUgc3RyaW5nIGNvbnN0YW50cyBlYWNoIGNvbnRhaW5pbmcgYSBjb21wbGV0ZSBzZW50ZW5jZXMsCi1yYXRoZXIgdGhhbiBpbnNlcnRpbmcgY29uZGl0aW9uYWxpemVkIHdvcmRzIG9yIHBocmFzZXMgaW50byBhIHNpbmdsZQotc2VudGVuY2UgZnJhbWV3b3JrLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2Ygd2hhdCBub3QgdG8gZG86Ci0KLUBleGFtcGxlCi1wcmludGYgKCIlZCBmaWxlJXMgcHJvY2Vzc2VkIiwgbmZpbGVzLAotICAgICAgICBuZmlsZXMgIT0gMSA/ICJzIiA6ICIiKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBwcm9ibGVtIHdpdGggdGhhdCBleGFtcGxlIGlzIHRoYXQgaXQgYXNzdW1lcyB0aGF0IHBsdXJhbHMgYXJlIG1hZGUKLWJ5IGFkZGluZyBgcycuICBJZiB5b3UgYXBwbHkgZ2V0dGV4dCB0byB0aGUgZm9ybWF0IHN0cmluZywgbGlrZSB0aGlzLAotCi1AZXhhbXBsZQotcHJpbnRmIChnZXR0ZXh0ICgiJWQgZmlsZSVzIHByb2Nlc3NlZCIpLCBuZmlsZXMsCi0gICAgICAgIG5maWxlcyAhPSAxID8gInMiIDogIiIpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotdGhlIG1lc3NhZ2UgY2FuIHVzZSBkaWZmZXJlbnQgd29yZHMsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlIGZvcmNlZCB0byB1c2UKLWBzJyBmb3IgdGhlIHBsdXJhbC4gIEhlcmUgaXMgYSBiZXR0ZXIgd2F5OgotCi1AZXhhbXBsZQotcHJpbnRmICgobmZpbGVzICE9IDEgPyAiJWQgZmlsZXMgcHJvY2Vzc2VkIgotICAgICAgICAgOiAiJWQgZmlsZSBwcm9jZXNzZWQiKSwKLSAgICAgICAgbmZpbGVzKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgd2F5LCB5b3UgY2FuIGFwcGx5IGdldHRleHQgdG8gZWFjaCBvZiB0aGUgdHdvIHN0cmluZ3MKLWluZGVwZW5kZW50bHk6Ci0KLUBleGFtcGxlCi1wcmludGYgKChuZmlsZXMgIT0gMSA/IGdldHRleHQgKCIlZCBmaWxlcyBwcm9jZXNzZWQiKQotICAgICAgICAgOiBnZXR0ZXh0ICgiJWQgZmlsZSBwcm9jZXNzZWQiKSksCi0gICAgICAgIG5maWxlcyk7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGlzIGNhbiBiZSBhbnkgbWV0aG9kIG9mIGZvcm1pbmcgdGhlIHBsdXJhbCBvZiB0aGUgd29yZCBmb3IgYGBmaWxlJycsIGFuZAotYWxzbyBoYW5kbGVzIGxhbmd1YWdlcyB0aGF0IHJlcXVpcmUgYWdyZWVtZW50IGluIHRoZSB3b3JkIGZvcgotYGBwcm9jZXNzZWQnJy4KLQotQSBzaW1pbGFyIHByb2JsZW0gYXBwZWFycyBhdCB0aGUgbGV2ZWwgb2Ygc2VudGVuY2Ugc3RydWN0dXJlIHdpdGggdGhpcwotY29kZToKLQotQGV4YW1wbGUKLXByaW50ZiAoIiMgIEltcGxpY2l0IHJ1bGUgc2VhcmNoIGhhcyVzIGJlZW4gZG9uZS5cbiIsCi0gICAgICAgIGYtPnRyaWVkX2ltcGxpY2l0ID8gIiIgOiAiIG5vdCIpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotQWRkaW5nIEBjb2Rle2dldHRleHR9IGNhbGxzIHRvIHRoaXMgY29kZSBjYW5ub3QgZ2l2ZSBjb3JyZWN0IHJlc3VsdHMgZm9yCi1hbGwgbGFuZ3VhZ2VzLCBiZWNhdXNlIG5lZ2F0aW9uIGluIHNvbWUgbGFuZ3VhZ2VzIHJlcXVpcmVzIGFkZGluZyB3b3JkcwotYXQgbW9yZSB0aGFuIG9uZSBwbGFjZSBpbiB0aGUgc2VudGVuY2UuICBCeSBjb250cmFzdCwgYWRkaW5nCi1AY29kZXtnZXR0ZXh0fSBjYWxscyBkb2VzIHRoZSBqb2Igc3RyYWlnaHRmb3dhcmRseSBpZiB0aGUgY29kZSBzdGFydHMKLW91dCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1wcmludGYgKGYtPnRyaWVkX2ltcGxpY2l0Ci0gICAgICAgID8gIiMgIEltcGxpY2l0IHJ1bGUgc2VhcmNoIGhhcyBiZWVuIGRvbmUuXG4iLAotICAgICAgICA6ICIjICBJbXBsaWNpdCBydWxlIHNlYXJjaCBoYXMgbm90IGJlZW4gZG9uZS5cbiIpOwotQGVuZCBleGFtcGxlCi0KLUBub2RlIE1tYXAKLUBzZWN0aW9uIE1tYXAKLQotRG9uJ3QgYXNzdW1lIHRoYXQgQGNvZGV7bW1hcH0gZWl0aGVyIHdvcmtzIG9uIGFsbCBmaWxlcyBvciBmYWlscwotZm9yIGFsbCBmaWxlcy4gIEl0IG1heSB3b3JrIG9uIHNvbWUgZmlsZXMgYW5kIGZhaWwgb24gb3RoZXJzLgotCi1UaGUgcHJvcGVyIHdheSB0byB1c2UgQGNvZGV7bW1hcH0gaXMgdG8gdHJ5IGl0IG9uIHRoZSBzcGVjaWZpYyBmaWxlIGZvcgotd2hpY2ggeW91IHdhbnQgdG8gdXNlIGl0LS0tYW5kIGlmIEBjb2Rle21tYXB9IGRvZXNuJ3Qgd29yaywgZmFsbCBiYWNrIG9uCi1kb2luZyB0aGUgam9iIGluIGFub3RoZXIgd2F5IHVzaW5nIEBjb2Rle3JlYWR9IGFuZCBAY29kZXt3cml0ZX0uCi0KLVRoZSByZWFzb24gdGhpcyBwcmVjYXV0aW9uIGlzIG5lZWRlZCBpcyB0aGF0IHRoZSBHTlUga2VybmVsICh0aGUgSFVSRCkKLXByb3ZpZGVzIGEgdXNlci1leHRlbnNpYmxlIGZpbGUgc3lzdGVtLCBpbiB3aGljaCB0aGVyZSBjYW4gYmUgbWFueQotZGlmZmVyZW50IGtpbmRzIG9mIGBgb3JkaW5hcnkgZmlsZXMuJycgIE1hbnkgb2YgdGhlbSBzdXBwb3J0Ci1AY29kZXttbWFwfSwgYnV0IHNvbWUgZG8gbm90LiAgSXQgaXMgaW1wb3J0YW50IHRvIG1ha2UgcHJvZ3JhbXMgaGFuZGxlCi1hbGwgdGhlc2Uga2luZHMgb2YgZmlsZXMuCi0KLUBub2RlIERvY3VtZW50YXRpb24KLUBjaGFwdGVyIERvY3VtZW50aW5nIFByb2dyYW1zCi0KLUBtZW51Ci0qIEdOVSBNYW51YWxzOjogICAgICAgICAgICAgICAgIFdyaXRpbmcgcHJvcGVyIG1hbnVhbHMuCi0qIE1hbnVhbCBTdHJ1Y3R1cmUgRGV0YWlsczo6ICAgIFNwZWNpZmljIHN0cnVjdHVyZSBjb252ZW50aW9ucy4KLSogTkVXUyBGaWxlOjogICAgICAgICAgICAgICAgICAgTkVXUyBmaWxlcyBzdXBwbGVtZW50IG1hbnVhbHMuCi0qIENoYW5nZSBMb2dzOjogICAgICAgICAgICAgICAgIFJlY29yZGluZyBDaGFuZ2VzCi0qIE1hbiBQYWdlczo6ICAgICAgICAgICAgICAgICAgIE1hbiBwYWdlcyBhcmUgc2Vjb25kYXJ5LgotKiBSZWFkaW5nIG90aGVyIE1hbnVhbHM6OiAgICAgICBIb3cgZmFyIHlvdSBjYW4gZ28gaW4gbGVhcm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBvdGhlciBtYW51YWxzLgotQGVuZCBtZW51Ci0KLUBub2RlIEdOVSBNYW51YWxzCi1Ac2VjdGlvbiBHTlUgTWFudWFscwotCi1UaGUgcHJlZmVycmVkIHdheSB0byBkb2N1bWVudCBwYXJ0IG9mIHRoZSBHTlUgc3lzdGVtIGlzIHRvIHdyaXRlIGEKLW1hbnVhbCBpbiB0aGUgVGV4aW5mbyBmb3JtYXR0aW5nIGxhbmd1YWdlLiAgU2VlIHRoZSBUZXhpbmZvIG1hbnVhbCwKLWVpdGhlciB0aGUgaGFyZGNvcHksIG9yIHRoZSBvbi1saW5lIHZlcnNpb24gYXZhaWxhYmxlIHRocm91Z2gKLUBjb2Rle2luZm99IG9yIHRoZSBFbWFjcyBJbmZvIHN1YnN5c3RlbSAoQGtiZHtDLWggaX0pLgotCi1Qcm9ncmFtbWVycyBvZnRlbiBmaW5kIGl0IG1vc3QgbmF0dXJhbCB0byBzdHJ1Y3R1cmUgdGhlIGRvY3VtZW50YXRpb24KLWZvbGxvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdGhleSBrbm93LiAgQnV0Ci10aGlzIHN0cnVjdHVyZSBpcyBub3QgbmVjZXNzYXJpbHkgZ29vZCBmb3IgZXhwbGFpbmluZyBob3cgdG8gdXNlIHRoZQotcHJvZ3JhbTsgaXQgbWF5IGJlIGlycmVsZXZhbnQgYW5kIGNvbmZ1c2luZyBmb3IgYSB1c2VyLgotCi1BdCBldmVyeSBsZXZlbCwgZnJvbSB0aGUgc2VudGVuY2VzIGluIGEgcGFyYWdyYXBoIHRvIHRoZSBncm91cGluZyBvZgotdG9waWNzIGludG8gc2VwYXJhdGUgbWFudWFscywgdGhlIHJpZ2h0IHdheSB0byBzdHJ1Y3R1cmUgZG9jdW1lbnRhdGlvbgotaXMgYWNjb3JkaW5nIHRvIHRoZSBjb25jZXB0cyBhbmQgcXVlc3Rpb25zIHRoYXQgYSB1c2VyIHdpbGwgaGF2ZSBpbiBtaW5kCi13aGVuIHJlYWRpbmcgaXQuICBTb21ldGltZXMgdGhpcyBzdHJ1Y3R1cmUgb2YgaWRlYXMgbWF0Y2hlcyB0aGUKLXN0cnVjdHVyZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvZnR3YXJlIGJlaW5nIGRvY3VtZW50ZWQtLS1idXQKLW9mdGVuIHRoZXkgYXJlIGRpZmZlcmVudC4gIE9mdGVuIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIGxlYXJuaW5nIHRvCi13cml0ZSBnb29kIGRvY3VtZW50YXRpb24gaXMgbGVhcm5pbmcgdG8gbm90aWNlIHdoZW4geW91IGFyZSBzdHJ1Y3R1cmluZwotdGhlIGRvY3VtZW50YXRpb24gbGlrZSB0aGUgaW1wbGVtZW50YXRpb24sIGFuZCB0aGluayBhYm91dCBiZXR0ZXIKLWFsdGVybmF0aXZlcy4KLQotRm9yIGV4YW1wbGUsIGVhY2ggcHJvZ3JhbSBpbiB0aGUgR05VIHN5c3RlbSBwcm9iYWJseSBvdWdodCB0byBiZQotZG9jdW1lbnRlZCBpbiBvbmUgbWFudWFsOyBidXQgdGhpcyBkb2VzIG5vdCBtZWFuIGVhY2ggcHJvZ3JhbSBzaG91bGQKLWhhdmUgaXRzIG93biBtYW51YWwuICBUaGF0IHdvdWxkIGJlIGZvbGxvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZQotaW1wbGVtZW50YXRpb24sIHJhdGhlciB0aGFuIHRoZSBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyB0aGUgdXNlcgotdW5kZXJzdGFuZC4KLQotSW5zdGVhZCwgZWFjaCBtYW51YWwgc2hvdWxkIGNvdmVyIGEgY29oZXJlbnQgQGVtcGh7dG9waWN9LiAgRm9yIGV4YW1wbGUsCi1pbnN0ZWFkIG9mIGEgbWFudWFsIGZvciBAY29kZXtkaWZmfSBhbmQgYSBtYW51YWwgZm9yIEBjb2Rle2RpZmYzfSwgd2UKLWhhdmUgb25lIG1hbnVhbCBmb3IgYGBjb21wYXJpc29uIG9mIGZpbGVzJycgd2hpY2ggY292ZXJzIGJvdGggb2YgdGhvc2UKLXByb2dyYW1zLCBhcyB3ZWxsIGFzIEBjb2Rle2NtcH0uICBCeSBkb2N1bWVudGluZyB0aGVzZSBwcm9ncmFtcwotdG9nZXRoZXIsIHdlIGNhbiBtYWtlIHRoZSB3aG9sZSBzdWJqZWN0IGNsZWFyZXIuCi0KLVRoZSBtYW51YWwgd2hpY2ggZGlzY3Vzc2VzIGEgcHJvZ3JhbSBzaG91bGQgZG9jdW1lbnQgYWxsIG9mIHRoZQotcHJvZ3JhbSdzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBhbGwgb2YgaXRzIGNvbW1hbmRzLiAgSXQgc2hvdWxkIGdpdmUKLWV4YW1wbGVzIG9mIHRoZWlyIHVzZS4gIEJ1dCBkb24ndCBvcmdhbml6ZSB0aGUgbWFudWFsIGFzIGEgbGlzdCBvZgotZmVhdHVyZXMuICBJbnN0ZWFkLCBvcmdhbml6ZSBpdCBsb2dpY2FsbHksIGJ5IHN1YnRvcGljcy4gIEFkZHJlc3MgdGhlCi1xdWVzdGlvbnMgdGhhdCBhIHVzZXIgd2lsbCBhc2sgd2hlbiB0aGlua2luZyBhYm91dCB0aGUgam9iIHRoYXQgdGhlCi1wcm9ncmFtIGRvZXMuCi0KLUluIGdlbmVyYWwsIGEgR05VIG1hbnVhbCBzaG91bGQgc2VydmUgYm90aCBhcyB0dXRvcmlhbCBhbmQgcmVmZXJlbmNlLgotSXQgc2hvdWxkIGJlIHNldCB1cCBmb3IgY29udmVuaWVudCBhY2Nlc3MgdG8gZWFjaCB0b3BpYyB0aHJvdWdoIEluZm8sCi1hbmQgZm9yIHJlYWRpbmcgc3RyYWlnaHQgdGhyb3VnaCAoYXBwZW5kaXhlcyBhc2lkZSkuICBBIEdOVSBtYW51YWwKLXNob3VsZCBnaXZlIGEgZ29vZCBpbnRyb2R1Y3Rpb24gdG8gYSBiZWdpbm5lciByZWFkaW5nIHRocm91Z2ggZnJvbSB0aGUKLXN0YXJ0LCBhbmQgc2hvdWxkIGFsc28gcHJvdmlkZSBhbGwgdGhlIGRldGFpbHMgdGhhdCBoYWNrZXJzIHdhbnQuCi0KLVRoYXQgaXMgbm90IGFzIGhhcmQgYXMgaXQgZmlyc3Qgc291bmRzLiAgQXJyYW5nZSBlYWNoIGNoYXB0ZXIgYXMgYQotbG9naWNhbCBicmVha2Rvd24gb2YgaXRzIHRvcGljLCBidXQgb3JkZXIgdGhlIHNlY3Rpb25zLCBhbmQgd3JpdGUgdGhlaXIKLXRleHQsIHNvIHRoYXQgcmVhZGluZyB0aGUgY2hhcHRlciBzdHJhaWdodCB0aHJvdWdoIG1ha2VzIHNlbnNlLiAgRG8KLWxpa2V3aXNlIHdoZW4gc3RydWN0dXJpbmcgdGhlIGJvb2sgaW50byBjaGFwdGVycywgYW5kIHdoZW4gc3RydWN0dXJpbmcgYQotc2VjdGlvbiBpbnRvIHBhcmFncmFwaHMuICBUaGUgd2F0Y2h3b3JkIGlzLCBAZW1waHthdCBlYWNoIHBvaW50LCBhZGRyZXNzCi10aGUgbW9zdCBmdW5kYW1lbnRhbCBhbmQgaW1wb3J0YW50IGlzc3VlIHJhaXNlZCBieSB0aGUgcHJlY2VkaW5nIHRleHQufQotCi1JZiBuZWNlc3NhcnksIGFkZCBleHRyYSBjaGFwdGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYW51YWwgd2hpY2gKLWFyZSBwdXJlbHkgdHV0b3JpYWwgYW5kIGNvdmVyIHRoZSBiYXNpY3Mgb2YgdGhlIHN1YmplY3QuICBUaGVzZSBwcm92aWRlCi10aGUgZnJhbWV3b3JrIGZvciBhIGJlZ2lubmVyIHRvIHVuZGVyc3RhbmQgdGhlIHJlc3Qgb2YgdGhlIG1hbnVhbC4gIFRoZQotQmlzb24gbWFudWFsIHByb3ZpZGVzIGEgZ29vZCBleGFtcGxlIG9mIGhvdyB0byBkbyB0aGlzLgotCi1Eb24ndCB1c2UgVW5peCBtYW4gcGFnZXMgYXMgYSBtb2RlbCBmb3IgaG93IHRvIHdyaXRlIEdOVSBkb2N1bWVudGF0aW9uOwotbW9zdCBvZiB0aGVtIGFyZSB0ZXJzZSwgYmFkbHkgc3RydWN0dXJlZCwgYW5kIGdpdmUgaW5hZGVxdWF0ZQotZXhwbGFuYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgY29uY2VwdHMuICAoVGhlcmUgYXJlLCBvZiBjb3Vyc2UKLWV4Y2VwdGlvbnMuKSAgQWxzbyBVbml4IG1hbiBwYWdlcyB1c2UgYSBwYXJ0aWN1bGFyIGZvcm1hdCB3aGljaCBpcwotZGlmZmVyZW50IGZyb20gd2hhdCB3ZSB1c2UgaW4gR05VIG1hbnVhbHMuCi0KLVBsZWFzZSBkbyBub3QgdXNlIHRoZSB0ZXJtIGBgcGF0aG5hbWUnJyB0aGF0IGlzIHVzZWQgaW4gVW5peAotZG9jdW1lbnRhdGlvbjsgdXNlIGBgZmlsZSBuYW1lJycgKHR3byB3b3JkcykgaW5zdGVhZC4gIFdlIHVzZSB0aGUgdGVybQotYGBwYXRoJycgb25seSBmb3Igc2VhcmNoIHBhdGhzLCB3aGljaCBhcmUgbGlzdHMgb2YgZmlsZSBuYW1lcy4KLQotUGxlYXNlIGRvIG5vdCB1c2UgdGhlIHRlcm0gYGBpbGxlZ2FsJycgdG8gcmVmZXIgdG8gZXJyb25lb3VzIGlucHV0IHRvIGEKLWNvbXB1dGVyIHByb2dyYW0uICBQbGVhc2UgdXNlIGBgaW52YWxpZCcnIGZvciB0aGlzLCBhbmQgcmVzZXJ2ZSB0aGUgdGVybQotYGBpbGxlZ2FsJycgZm9yIHZpb2xhdGlvbnMgb2YgbGF3LgotCi1Abm9kZSBNYW51YWwgU3RydWN0dXJlIERldGFpbHMKLUBzZWN0aW9uIE1hbnVhbCBTdHJ1Y3R1cmUgRGV0YWlscwotCi1UaGUgdGl0bGUgcGFnZSBvZiB0aGUgbWFudWFsIHNob3VsZCBzdGF0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbXMgb3IKLXBhY2thZ2VzIGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbC4gIFRoZSBUb3Agbm9kZSBvZiB0aGUgbWFudWFsIHNob3VsZAotYWxzbyBjb250YWluIHRoaXMgaW5mb3JtYXRpb24uICBJZiB0aGUgbWFudWFsIGlzIGNoYW5naW5nIG1vcmUKLWZyZXF1ZW50bHkgdGhhbiBvciBpbmRlcGVuZGVudCBvZiB0aGUgcHJvZ3JhbSwgYWxzbyBzdGF0ZSBhIHZlcnNpb24KLW51bWJlciBmb3IgdGhlIG1hbnVhbCBpbiBib3RoIG9mIHRoZXNlIHBsYWNlcy4KLQotRWFjaCBwcm9ncmFtIGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbCBzaG91bGQgc2hvdWxkIGhhdmUgYSBub2RlIG5hbWVkCi1Ac2FtcHtAdmFye3Byb2dyYW19IEludm9jYXRpb259IG9yIEBzYW1we0ludm9raW5nIEB2YXJ7cHJvZ3JhbX19LiAgVGhpcwotbm9kZSAodG9nZXRoZXIgd2l0aCBpdHMgc3Vibm9kZXMsIGlmIGFueSkgc2hvdWxkIGRlc2NyaWJlIHRoZSBwcm9ncmFtJ3MKLWNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIGhvdyB0byBydW4gaXQgKHRoZSBzb3J0IG9mIGluZm9ybWF0aW9uIHBlb3BsZQotd291bGQgbG9vayBpbiBhIG1hbiBwYWdlIGZvcikuICBTdGFydCB3aXRoIGFuIEBzYW1we0BAZXhhbXBsZX0KLWNvbnRhaW5pbmcgYSB0ZW1wbGF0ZSBmb3IgYWxsIHRoZSBvcHRpb25zIGFuZCBhcmd1bWVudHMgdGhhdCB0aGUgcHJvZ3JhbQotdXNlcy4KLQotQWx0ZXJuYXRpdmVseSwgcHV0IGEgbWVudSBpdGVtIGluIHNvbWUgbWVudSB3aG9zZSBpdGVtIG5hbWUgZml0cyBvbmUgb2YKLXRoZSBhYm92ZSBwYXR0ZXJucy4gIFRoaXMgaWRlbnRpZmllcyB0aGUgbm9kZSB3aGljaCB0aGF0IGl0ZW0gcG9pbnRzIHRvCi1hcyB0aGUgbm9kZSBmb3IgdGhpcyBwdXJwb3NlLCByZWdhcmRsZXNzIG9mIHRoZSBub2RlJ3MgYWN0dWFsIG5hbWUuCi0KLVRoZXJlIHdpbGwgYmUgYXV0b21hdGljIGZlYXR1cmVzIGZvciBzcGVjaWZ5aW5nIGEgcHJvZ3JhbSBuYW1lIGFuZAotcXVpY2tseSByZWFkaW5nIGp1c3QgdGhpcyBwYXJ0IG9mIGl0cyBtYW51YWwuCi0KLUlmIG9uZSBtYW51YWwgZGVzY3JpYmVzIHNldmVyYWwgcHJvZ3JhbXMsIGl0IHNob3VsZCBoYXZlIHN1Y2ggYSBub2RlIGZvcgotZWFjaCBwcm9ncmFtIGRlc2NyaWJlZC4KLQotQG5vZGUgTkVXUyBGaWxlCi1Ac2VjdGlvbiBUaGUgTkVXUyBGaWxlCi0KLUluIGFkZGl0aW9uIHRvIGl0cyBtYW51YWwsIHRoZSBwYWNrYWdlIHNob3VsZCBoYXZlIGEgZmlsZSBuYW1lZAotQGZpbGV7TkVXU30gd2hpY2ggY29udGFpbnMgYSBsaXN0IG9mIHVzZXItdmlzaWJsZSBjaGFuZ2VzIHdvcnRoCi1tZW50aW9uaW5nLiAgSW4gZWFjaCBuZXcgcmVsZWFzZSwgYWRkIGl0ZW1zIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBhbmQKLWlkZW50aWZ5IHRoZSB2ZXJzaW9uIHRoZXkgcGVydGFpbiB0by4gIERvbid0IGRpc2NhcmQgb2xkIGl0ZW1zOyBsZWF2ZQotdGhlbSBpbiB0aGUgZmlsZSBhZnRlciB0aGUgbmV3ZXIgaXRlbXMuICBUaGlzIHdheSwgYSB1c2VyIHVwZ3JhZGluZyBmcm9tCi1hbnkgcHJldmlvdXMgdmVyc2lvbiBjYW4gc2VlIHdoYXQgaXMgbmV3LgotCi1JZiB0aGUgQGZpbGV7TkVXU30gZmlsZSBnZXRzIHZlcnkgbG9uZywgbW92ZSBzb21lIG9mIHRoZSBvbGRlciBpdGVtcwotaW50byBhIGZpbGUgbmFtZWQgQGZpbGV7T05FV1N9IGFuZCBwdXQgYSBub3RlIGF0IHRoZSBlbmQgcmVmZXJyaW5nIHRoZQotdXNlciB0byB0aGF0IGZpbGUuCi0KLUBub2RlIENoYW5nZSBMb2dzCi1Ac2VjdGlvbiBDaGFuZ2UgTG9ncwotCi1LZWVwIGEgY2hhbmdlIGxvZyB0byBkZXNjcmliZSBhbGwgdGhlIGNoYW5nZXMgbWFkZSB0byBwcm9ncmFtIHNvdXJjZQotZmlsZXMuICBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHNvIHRoYXQgcGVvcGxlIGludmVzdGlnYXRpbmcgYnVncyBpbiB0aGUKLWZ1dHVyZSB3aWxsIGtub3cgYWJvdXQgdGhlIGNoYW5nZXMgdGhhdCBtaWdodCBoYXZlIGludHJvZHVjZWQgdGhlIGJ1Zy4KLU9mdGVuIGEgbmV3IGJ1ZyBjYW4gYmUgZm91bmQgYnkgbG9va2luZyBhdCB3aGF0IHdhcyByZWNlbnRseSBjaGFuZ2VkLgotTW9yZSBpbXBvcnRhbnRseSwgY2hhbmdlIGxvZ3MgY2FuIGhlbHAgeW91IGVsaW1pbmF0ZSBjb25jZXB0dWFsCi1pbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBkaWZmZXJlbnQgcGFydHMgb2YgYSBwcm9ncmFtLCBieSBnaXZpbmcgeW91IGEKLWhpc3Rvcnkgb2YgaG93IHRoZSBjb25mbGljdGluZyBjb25jZXB0cyBhcm9zZSBhbmQgd2hvIHRoZXkgY2FtZSBmcm9tLgotCi1AbWVudQotKiBDaGFuZ2UgTG9nIENvbmNlcHRzOjogICAgICAgICAKLSogU3R5bGUgb2YgQ2hhbmdlIExvZ3M6OiAgICAgICAgCi0qIFNpbXBsZSBDaGFuZ2VzOjogICAgICAgICAgICAgIAotKiBDb25kaXRpb25hbCBDaGFuZ2VzOjogICAgICAgICAKLUBlbmQgbWVudQotCi1Abm9kZSBDaGFuZ2UgTG9nIENvbmNlcHRzCi1Ac3Vic2VjdGlvbiBDaGFuZ2UgTG9nIENvbmNlcHRzCi0KLVlvdSBjYW4gdGhpbmsgb2YgdGhlIGNoYW5nZSBsb2cgYXMgYSBjb25jZXB0dWFsIGBgdW5kbyBsaXN0Jycgd2hpY2gKLWV4cGxhaW5zIGhvdyBlYXJsaWVyIHZlcnNpb25zIHdlcmUgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgdmVyc2lvbi4KLVBlb3BsZSBjYW4gc2VlIHRoZSBjdXJyZW50IHZlcnNpb247IHRoZXkgZG9uJ3QgbmVlZCB0aGUgY2hhbmdlIGxvZwotdG8gdGVsbCB0aGVtIHdoYXQgaXMgaW4gaXQuICBXaGF0IHRoZXkgd2FudCBmcm9tIGEgY2hhbmdlIGxvZyBpcyBhCi1jbGVhciBleHBsYW5hdGlvbiBvZiBob3cgdGhlIGVhcmxpZXIgdmVyc2lvbiBkaWZmZXJlZC4KLQotVGhlIGNoYW5nZSBsb2cgZmlsZSBpcyBub3JtYWxseSBjYWxsZWQgQGZpbGV7Q2hhbmdlTG9nfSBhbmQgY292ZXJzIGFuCi1lbnRpcmUgZGlyZWN0b3J5LiAgRWFjaCBkaXJlY3RvcnkgY2FuIGhhdmUgaXRzIG93biBjaGFuZ2UgbG9nLCBvciBhCi1kaXJlY3RvcnkgY2FuIHVzZSB0aGUgY2hhbmdlIGxvZyBvZiBpdHMgcGFyZW50IGRpcmVjdG9yeS0taXQncyB1cCB0bwoteW91LgotCi1Bbm90aGVyIGFsdGVybmF0aXZlIGlzIHRvIHJlY29yZCBjaGFuZ2UgbG9nIGluZm9ybWF0aW9uIHdpdGggYSB2ZXJzaW9uCi1jb250cm9sIHN5c3RlbSBzdWNoIGFzIFJDUyBvciBDVlMuICBUaGlzIGNhbiBiZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseQotdG8gYSBAZmlsZXtDaGFuZ2VMb2d9IGZpbGUuCi0KLVRoZXJlJ3Mgbm8gbmVlZCB0byBkZXNjcmliZSB0aGUgZnVsbCBwdXJwb3NlIG9mIHRoZSBjaGFuZ2VzIG9yIGhvdyB0aGV5Ci13b3JrIHRvZ2V0aGVyLiAgSWYgeW91IHRoaW5rIHRoYXQgYSBjaGFuZ2UgY2FsbHMgZm9yIGV4cGxhbmF0aW9uLCB5b3UncmUKLXByb2JhYmx5IHJpZ2h0LiAgUGxlYXNlIGRvIGV4cGxhaW4gaXQtLS1idXQgcGxlYXNlIHB1dCB0aGUgZXhwbGFuYXRpb24KLWluIGNvbW1lbnRzIGluIHRoZSBjb2RlLCB3aGVyZSBwZW9wbGUgd2lsbCBzZWUgaXQgd2hlbmV2ZXIgdGhleSBzZWUgdGhlCi1jb2RlLiAgRm9yIGV4YW1wbGUsIGBgTmV3IGZ1bmN0aW9uJycgaXMgZW5vdWdoIGZvciB0aGUgY2hhbmdlIGxvZyB3aGVuCi15b3UgYWRkIGEgZnVuY3Rpb24sIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBiZWZvcmUgdGhlCi1mdW5jdGlvbiBkZWZpbml0aW9uIHRvIGV4cGxhaW4gd2hhdCBpdCBkb2VzLgotCi1Ib3dldmVyLCBzb21ldGltZXMgaXQgaXMgdXNlZnVsIHRvIHdyaXRlIG9uZSBsaW5lIHRvIGRlc2NyaWJlIHRoZQotb3ZlcmFsbCBwdXJwb3NlIG9mIGEgYmF0Y2ggb2YgY2hhbmdlcy4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGFkZCBhbiBlbnRyeSB0byBAZmlsZXtDaGFuZ2VMb2d9IGlzIHdpdGggdGhlIEVtYWNzCi1jb21tYW5kIEBrYmR7TS14IGFkZC1jaGFuZ2UtbG9nLWVudHJ5fS4gIEFuIGVudHJ5IHNob3VsZCBoYXZlIGFuCi1hc3RlcmlzaywgdGhlIG5hbWUgb2YgdGhlIGNoYW5nZWQgZmlsZSwgYW5kIHRoZW4gaW4gcGFyZW50aGVzZXMgdGhlIG5hbWUKLW9mIHRoZSBjaGFuZ2VkIGZ1bmN0aW9ucywgdmFyaWFibGVzIG9yIHdoYXRldmVyLCBmb2xsb3dlZCBieSBhIGNvbG9uLgotVGhlbiBkZXNjcmliZSB0aGUgY2hhbmdlcyB5b3UgbWFkZSB0byB0aGF0IGZ1bmN0aW9uIG9yIHZhcmlhYmxlLgotCi1Abm9kZSBTdHlsZSBvZiBDaGFuZ2UgTG9ncwotQHN1YnNlY3Rpb24gU3R5bGUgb2YgQ2hhbmdlIExvZ3MKLQotSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBjaGFuZ2UgbG9nIGVudHJpZXM6Ci0KLUBleGFtcGxlCi0qIHJlZ2lzdGVyLmVsIChpbnNlcnQtcmVnaXN0ZXIpOiBSZXR1cm4gbmlsLgotKGp1bXAtdG8tcmVnaXN0ZXIpOiBMaWtld2lzZS4KLQotKiBzb3J0LmVsIChzb3J0LXN1YnIpOiBSZXR1cm4gbmlsLgotCi0qIHRleC1tb2RlLmVsICh0ZXgtYmlidGV4LWZpbGUsIHRleC1maWxlLCB0ZXgtcmVnaW9uKToKLVJlc3RhcnQgdGhlIHRleCBzaGVsbCBpZiBwcm9jZXNzIGlzIGdvbmUgb3Igc3RvcHBlZC4KLSh0ZXgtc2hlbGwtcnVubmluZyk6IE5ldyBmdW5jdGlvbi4KLQotKiBleHByLmMgKHN0b3JlX29uZV9hcmcpOiBSb3VuZCBzaXplIHVwIGZvciBtb3ZlX2Jsb2NrX3RvX3JlZy4KLShleHBhbmRfY2FsbCk6IFJvdW5kIHVwIHdoZW4gZW1pdHRpbmcgVVNFIGluc25zLgotKiBzdG10LmMgKGFzc2lnbl9wYXJtcyk6IFJvdW5kIHNpemUgdXAgZm9yIG1vdmVfYmxvY2tfZnJvbV9yZWcuCi1AZW5kIGV4YW1wbGUKLQotSXQncyBpbXBvcnRhbnQgdG8gbmFtZSB0aGUgY2hhbmdlZCBmdW5jdGlvbiBvciB2YXJpYWJsZSBpbiBmdWxsLiAgRG9uJ3QKLWFiYnJldmlhdGUgZnVuY3Rpb24gb3IgdmFyaWFibGUgbmFtZXMsIGFuZCBkb24ndCBjb21iaW5lIHRoZW0uCi1TdWJzZXF1ZW50IG1haW50YWluZXJzIHdpbGwgb2Z0ZW4gc2VhcmNoIGZvciBhIGZ1bmN0aW9uIG5hbWUgdG8gZmluZCBhbGwKLXRoZSBjaGFuZ2UgbG9nIGVudHJpZXMgdGhhdCBwZXJ0YWluIHRvIGl0OyBpZiB5b3UgYWJicmV2aWF0ZSB0aGUgbmFtZSwKLXRoZXkgd29uJ3QgZmluZCBpdCB3aGVuIHRoZXkgc2VhcmNoLgotCi1Gb3IgZXhhbXBsZSwgc29tZSBwZW9wbGUgYXJlIHRlbXB0ZWQgdG8gYWJicmV2aWF0ZSBncm91cHMgb2YgZnVuY3Rpb24KLW5hbWVzIGJ5IHdyaXRpbmcgQHNhbXB7KiByZWdpc3Rlci5lbCAoQHtpbnNlcnQsanVtcC10b0B9LXJlZ2lzdGVyKX07Ci10aGlzIGlzIG5vdCBhIGdvb2QgaWRlYSwgc2luY2Ugc2VhcmNoaW5nIGZvciBAY29kZXtqdW1wLXRvLXJlZ2lzdGVyfSBvcgotQGNvZGV7aW5zZXJ0LXJlZ2lzdGVyfSB3b3VsZCBub3QgZmluZCB0aGF0IGVudHJ5LgotCi1TZXBhcmF0ZSB1bnJlbGF0ZWQgY2hhbmdlIGxvZyBlbnRyaWVzIHdpdGggYmxhbmsgbGluZXMuICBXaGVuIHR3bwotZW50cmllcyByZXByZXNlbnQgcGFydHMgb2YgdGhlIHNhbWUgY2hhbmdlLCBzbyB0aGF0IHRoZXkgd29yayB0b2dldGhlciwKLXRoZW4gZG9uJ3QgcHV0IGJsYW5rIGxpbmVzIGJldHdlZW4gdGhlbS4gIFRoZW4geW91IGNhbiBvbWl0IHRoZSBmaWxlCi1uYW1lIGFuZCB0aGUgYXN0ZXJpc2sgd2hlbiBzdWNjZXNzaXZlIGVudHJpZXMgYXJlIGluIHRoZSBzYW1lIGZpbGUuCi0KLUBub2RlIFNpbXBsZSBDaGFuZ2VzCi1Ac3Vic2VjdGlvbiBTaW1wbGUgQ2hhbmdlcwotCi1DZXJ0YWluIHNpbXBsZSBraW5kcyBvZiBjaGFuZ2VzIGRvbid0IG5lZWQgbXVjaCBkZXRhaWwgaW4gdGhlIGNoYW5nZQotbG9nLgotCi1XaGVuIHlvdSBjaGFuZ2UgdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb2YgYSBmdW5jdGlvbiBpbiBhIHNpbXBsZSBmYXNoaW9uLAotYW5kIHlvdSBjaGFuZ2UgYWxsIHRoZSBjYWxsZXJzIG9mIHRoZSBmdW5jdGlvbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBtYWtlCi1pbmRpdmlkdWFsIGVudHJpZXMgZm9yIGFsbCB0aGUgY2FsbGVycyB0aGF0IHlvdSBjaGFuZ2VkLiAgSnVzdCB3cml0ZSBpbgotdGhlIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLCBgYEFsbCBjYWxsZXJzIGNoYW5nZWQuJycKLQotQGV4YW1wbGUKLSoga2V5Ym9hcmQuYyAoRmNvbW1hbmRfZXhlY3V0ZSk6IE5ldyBhcmcgU1BFQ0lBTC4KLUFsbCBjYWxsZXJzIGNoYW5nZWQuCi1AZW5kIGV4YW1wbGUKLQotV2hlbiB5b3UgY2hhbmdlIGp1c3QgY29tbWVudHMgb3IgZG9jIHN0cmluZ3MsIGl0IGlzIGVub3VnaCB0byB3cml0ZSBhbgotZW50cnkgZm9yIHRoZSBmaWxlLCB3aXRob3V0IG1lbnRpb25pbmcgdGhlIGZ1bmN0aW9ucy4gIEp1c3QgYGBEb2MKLWZpeGVzJycgaXMgZW5vdWdoIGZvciB0aGUgY2hhbmdlIGxvZy4KLQotVGhlcmUncyBubyBuZWVkIHRvIG1ha2UgY2hhbmdlIGxvZyBlbnRyaWVzIGZvciBkb2N1bWVudGF0aW9uIGZpbGVzLgotVGhpcyBpcyBiZWNhdXNlIGRvY3VtZW50YXRpb24gaXMgbm90IHN1c2NlcHRpYmxlIHRvIGJ1Z3MgdGhhdCBhcmUgaGFyZAotdG8gZml4LiAgRG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBjb25zaXN0IG9mIHBhcnRzIHRoYXQgbXVzdCBpbnRlcmFjdCBpbiBhCi1wcmVjaXNlbHkgZW5naW5lZXJlZCBmYXNoaW9uLiAgVG8gY29ycmVjdCBhbiBlcnJvciwgeW91IG5lZWQgbm90IGtub3cKLXRoZSBoaXN0b3J5IG9mIHRoZSBlcnJvbmVvdXMgcGFzc2FnZTsgaXQgaXMgZW5vdWdoIHRvIGNvbXBhcmUgd2hhdCB0aGUKLWRvY3VtZW50YXRpb24gc2F5cyB3aXRoIHRoZSB3YXkgdGhlIHByb2dyYW0gYWN0dWFsbHkgd29ya3MuCi0KLUBub2RlIENvbmRpdGlvbmFsIENoYW5nZXMKLUBzdWJzZWN0aW9uIENvbmRpdGlvbmFsIENoYW5nZXMKLQotQyBwcm9ncmFtcyBvZnRlbiBjb250YWluIGNvbXBpbGUtdGltZSBAY29kZXsjaWZ9IGNvbmRpdGlvbmFscy4gIE1hbnkKLWNoYW5nZXMgYXJlIGNvbmRpdGlvbmFsOyBzb21ldGltZXMgeW91IGFkZCBhIG5ldyBkZWZpbml0aW9uIHdoaWNoIGlzCi1lbnRpcmVseSBjb250YWluZWQgaW4gYSBjb25kaXRpb25hbC4gIEl0IGlzIHZlcnkgdXNlZnVsIHRvIGluZGljYXRlIGluCi10aGUgY2hhbmdlIGxvZyB0aGUgY29uZGl0aW9ucyBmb3Igd2hpY2ggdGhlIGNoYW5nZSBhcHBsaWVzLgotCi1PdXIgY29udmVudGlvbiBmb3IgaW5kaWNhdGluZyBjb25kaXRpb25hbCBjaGFuZ2VzIGlzIHRvIHVzZSBzcXVhcmUKLWJyYWNrZXRzIGFyb3VuZCB0aGUgbmFtZSBvZiB0aGUgY29uZGl0aW9uLgotCi1IZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGUsIGRlc2NyaWJpbmcgYSBjaGFuZ2Ugd2hpY2ggaXMgY29uZGl0aW9uYWwgYnV0Ci1kb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24gb3IgZW50aXR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0OgotCi1AZXhhbXBsZQotKiB4dGVybS5jIFtTT0xBUklTMl06IEluY2x1ZGUgc3RyaW5nLmguCi1AZW5kIGV4YW1wbGUKLQotSGVyZSBpcyBhbiBlbnRyeSBkZXNjcmliaW5nIGEgbmV3IGRlZmluaXRpb24gd2hpY2ggaXMgZW50aXJlbHkKLWNvbmRpdGlvbmFsLiAgVGhpcyBuZXcgZGVmaW5pdGlvbiBmb3IgdGhlIG1hY3JvIEBjb2Rle0ZSQU1FX1dJTkRPV19QfSBpcwotdXNlZCBvbmx5IHdoZW4gQGNvZGV7SEFWRV9YX1dJTkRPV1N9IGlzIGRlZmluZWQ6Ci0KLUBleGFtcGxlCi0qIGZyYW1lLmggW0hBVkVfWF9XSU5ET1dTXSAoRlJBTUVfV0lORE9XX1ApOiBNYWNybyBkZWZpbmVkLgotQGVuZCBleGFtcGxlCi0KLUhlcmUgaXMgYW4gZW50cnkgZm9yIGEgY2hhbmdlIHdpdGhpbiB0aGUgZnVuY3Rpb24gQGNvZGV7aW5pdF9kaXNwbGF5fSwKLXdob3NlIGRlZmluaXRpb24gYXMgYSB3aG9sZSBpcyB1bmNvbmRpdGlvbmFsLCBidXQgdGhlIGNoYW5nZXMgdGhlbXNlbHZlcwotYXJlIGNvbnRhaW5lZCBpbiBhIEBzYW1weyNpZmRlZiBIQVZFX0xJQk5DVVJTRVN9IGNvbmRpdGlvbmFsOgotCi1AZXhhbXBsZQotKiBkaXNwbmV3LmMgKGluaXRfZGlzcGxheSkgW0hBVkVfTElCTkNVUlNFU106IElmIFgsIGNhbGwgdGdldGVudC4KLUBlbmQgZXhhbXBsZQotCi1IZXJlIGlzIGFuIGVudHJ5IGZvciBhIGNoYW5nZSB0aGF0IHRha2VzIGFmZmVjdCBvbmx5IHdoZW4KLWEgY2VydGFpbiBtYWNybyBpcyBAZW1waHtub3R9IGRlZmluZWQ6Ci0KLUBleGFtcGxlCi0oZ2V0aG9zdG5hbWUpIFshSEFWRV9TT0NLRVRTXTogUmVwbGFjZSB3aXRoIHdpbnNvY2sgdmVyc2lvbi4KLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBNYW4gUGFnZXMKLUBzZWN0aW9uIE1hbiBQYWdlcwotCi1JbiB0aGUgR05VIHByb2plY3QsIG1hbiBwYWdlcyBhcmUgc2Vjb25kYXJ5LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBvcgotZXhwZWN0ZWQgZm9yIGV2ZXJ5IEdOVSBwcm9ncmFtIHRvIGhhdmUgYSBtYW4gcGFnZSwgYnV0IHNvbWUgb2YgdGhlbSBkby4KLUl0J3MgeW91ciBjaG9pY2Ugd2hldGhlciB0byBpbmNsdWRlIGEgbWFuIHBhZ2UgaW4geW91ciBwcm9ncmFtLgotCi1XaGVuIHlvdSBtYWtlIHRoaXMgZGVjaXNpb24sIGNvbnNpZGVyIHRoYXQgc3VwcG9ydGluZyBhIG1hbiBwYWdlCi1yZXF1aXJlcyBjb250aW51YWwgZWZmb3J0IGVhY2ggdGltZSB0aGUgcHJvZ3JhbSBpcyBjaGFuZ2VkLiAgVGhlIHRpbWUKLXlvdSBzcGVuZCBvbiB0aGUgbWFuIHBhZ2UgaXMgdGltZSB0YWtlbiBhd2F5IGZyb20gbW9yZSB1c2VmdWwgd29yay4KLQotRm9yIGEgc2ltcGxlIHByb2dyYW0gd2hpY2ggY2hhbmdlcyBsaXR0bGUsIHVwZGF0aW5nIHRoZSBtYW4gcGFnZSBtYXkgYmUKLWEgc21hbGwgam9iLiAgVGhlbiB0aGVyZSBpcyBsaXR0bGUgcmVhc29uIG5vdCB0byBpbmNsdWRlIGEgbWFuIHBhZ2UsIGlmCi15b3UgaGF2ZSBvbmUuCi0KLUZvciBhIGxhcmdlIHByb2dyYW0gdGhhdCBjaGFuZ2VzIGEgZ3JlYXQgZGVhbCwgdXBkYXRpbmcgYSBtYW4gcGFnZSBtYXkKLWJlIGEgc3Vic3RhbnRpYWwgYnVyZGVuLiAgSWYgYSB1c2VyIG9mZmVycyB0byBkb25hdGUgYSBtYW4gcGFnZSwgeW91IG1heQotZmluZCB0aGlzIGdpZnQgY29zdGx5IHRvIGFjY2VwdC4gIEl0IG1heSBiZSBiZXR0ZXIgdG8gcmVmdXNlIHRoZSBtYW4KLXBhZ2UgdW5sZXNzIHRoZSBzYW1lIHBlcnNvbiBhZ3JlZXMgdG8gdGFrZSBmdWxsIHJlc3BvbnNpYmlsaXR5IGZvcgotbWFpbnRhaW5pbmcgaXQtLS1zbyB0aGF0IHlvdSBjYW4gd2FzaCB5b3VyIGhhbmRzIG9mIGl0IGVudGlyZWx5LiAgSWYKLXRoaXMgdm9sdW50ZWVyIGxhdGVyIGNlYXNlcyB0byBkbyB0aGUgam9iLCB0aGVuIGRvbid0IGZlZWwgb2JsaWdlZCB0bwotcGljayBpdCB1cCB5b3Vyc2VsZjsgaXQgbWF5IGJlIGJldHRlciB0byB3aXRoZHJhdyB0aGUgbWFuIHBhZ2UgZnJvbSB0aGUKLWRpc3RyaWJ1dGlvbiB1bnRpbCBzb21lb25lIGVsc2UgYWdyZWVzIHRvIHVwZGF0ZSBpdC4KLQotV2hlbiBhIHByb2dyYW0gY2hhbmdlcyBvbmx5IGEgbGl0dGxlLCB5b3UgbWF5IGZlZWwgdGhhdCB0aGUKLWRpc2NyZXBhbmNpZXMgYXJlIHNtYWxsIGVub3VnaCB0aGF0IHRoZSBtYW4gcGFnZSByZW1haW5zIHVzZWZ1bCB3aXRob3V0Ci11cGRhdGluZy4gIElmIHNvLCBwdXQgYSBwcm9taW5lbnQgbm90ZSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hbgotcGFnZSBleHBsYWluaW5nIHRoYXQgeW91IGRvbid0IG1haW50YWluIGl0IGFuZCB0aGF0IHRoZSBUZXhpbmZvIG1hbnVhbAotaXMgbW9yZSBhdXRob3JpdGF0aXZlLiAgVGhlIG5vdGUgc2hvdWxkIHNheSBob3cgdG8gYWNjZXNzIHRoZSBUZXhpbmZvCi1kb2N1bWVudGF0aW9uLgotCi1Abm9kZSBSZWFkaW5nIG90aGVyIE1hbnVhbHMKLUBzZWN0aW9uIFJlYWRpbmcgb3RoZXIgTWFudWFscwotCi1UaGVyZSBtYXkgYmUgbm9uLWZyZWUgYm9va3Mgb3IgZG9jdW1lbnRhdGlvbiBmaWxlcyB0aGF0IGRlc2NyaWJlIHRoZQotcHJvZ3JhbSB5b3UgYXJlIGRvY3VtZW50aW5nLgotCi1JdCBpcyBvayB0byB1c2UgdGhlc2UgZG9jdW1lbnRzIGZvciByZWZlcmVuY2UsIGp1c3QgYXMgdGhlIGF1dGhvciBvZiBhCi1uZXcgYWxnZWJyYSB0ZXh0Ym9vayBjYW4gcmVhZCBvdGhlciBib29rcyBvbiBhbGdlYnJhLiAgQSBsYXJnZSBwb3J0aW9uCi1vZiBhbnkgbm9uLWZpY3Rpb24gYm9vayBjb25zaXN0cyBvZiBmYWN0cywgaW4gdGhpcyBjYXNlIGZhY3RzIGFib3V0IGhvdwotYSBjZXJ0YWluIHByb2dyYW0gd29ya3MsIGFuZCB0aGVzZSBmYWN0cyBhcmUgbmVjZXNzYXJpbHkgdGhlIHNhbWUgZm9yCi1ldmVyeW9uZSB3aG8gd3JpdGVzIGFib3V0IHRoZSBzdWJqZWN0LiAgQnV0IGJlIGNhcmVmdWwgbm90IHRvIGNvcHkgeW91cgotb3V0bGluZSBzdHJ1Y3R1cmUsIHdvcmRpbmcsIHRhYmxlcyBvciBleGFtcGxlcyBmcm9tIHByZWV4aXN0aW5nIG5vbi1mcmVlCi1kb2N1bWVudGF0aW9uLiAgQ29weWluZyBmcm9tIGZyZWUgZG9jdW1lbnRhdGlvbiBtYXkgYmUgb2s7IHBsZWFzZSBjaGVjawotd2l0aCB0aGUgRlNGIGFib3V0IHRoZSBpbmRpdmlkdWFsIGNhc2UuCi0KLUBub2RlIE1hbmFnaW5nIFJlbGVhc2VzCi1AY2hhcHRlciBUaGUgUmVsZWFzZSBQcm9jZXNzCi0KLU1ha2luZyBhIHJlbGVhc2UgaXMgbW9yZSB0aGFuIGp1c3QgYnVuZGxpbmcgdXAgeW91ciBzb3VyY2UgZmlsZXMgaW4gYQotdGFyIGZpbGUgYW5kIHB1dHRpbmcgaXQgdXAgZm9yIEZUUC4gIFlvdSBzaG91bGQgc2V0IHVwIHlvdXIgc29mdHdhcmUgc28KLXRoYXQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIGEgdmFyaWV0eSBvZiBzeXN0ZW1zLiAgWW91ciBNYWtlZmlsZQotc2hvdWxkIGNvbmZvcm0gdG8gdGhlIEdOVSBzdGFuZGFyZHMgZGVzY3JpYmVkIGJlbG93LCBhbmQgeW91ciBkaXJlY3RvcnkKLWxheW91dCBzaG91bGQgYWxzbyBjb25mb3JtIHRvIHRoZSBzdGFuZGFyZHMgZGlzY3Vzc2VkIGJlbG93LiAgRG9pbmcgc28KLW1ha2VzIGl0IGVhc3kgdG8gaW5jbHVkZSB5b3VyIHBhY2thZ2UgaW50byB0aGUgbGFyZ2VyIGZyYW1ld29yayBvZgotYWxsIEdOVSBzb2Z0d2FyZS4KLQotQG1lbnUKLSogQ29uZmlndXJhdGlvbjo6ICAgICAgICAgICAgICAgSG93IENvbmZpZ3VyYXRpb24gU2hvdWxkIFdvcmsKLSogTWFrZWZpbGUgQ29udmVudGlvbnM6OglNYWtlZmlsZSBDb252ZW50aW9ucwotKiBSZWxlYXNlczo6ICAgICAgICAgICAgICAgICAgICBNYWtpbmcgUmVsZWFzZXMKLUBlbmQgbWVudQotCi1Abm9kZSBDb25maWd1cmF0aW9uCi1Ac2VjdGlvbiBIb3cgQ29uZmlndXJhdGlvbiBTaG91bGQgV29yawotCi1FYWNoIEdOVSBkaXN0cmlidXRpb24gc2hvdWxkIGNvbWUgd2l0aCBhIHNoZWxsIHNjcmlwdCBuYW1lZAotQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgc2NyaXB0IGlzIGdpdmVuIGFyZ3VtZW50cyB3aGljaCBkZXNjcmliZSB0aGUKLWtpbmQgb2YgbWFjaGluZSBhbmQgc3lzdGVtIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIHByb2dyYW0gZm9yLgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgbXVzdCByZWNvcmQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBzbwotdGhhdCB0aGV5IGFmZmVjdCBjb21waWxhdGlvbi4KLQotT25lIHdheSB0byBkbyB0aGlzIGlzIHRvIG1ha2UgYSBsaW5rIGZyb20gYSBzdGFuZGFyZCBuYW1lIHN1Y2ggYXMKLUBmaWxle2NvbmZpZy5ofSB0byB0aGUgcHJvcGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGNob3NlbiBzeXN0ZW0uCi1JZiB5b3UgdXNlIHRoaXMgdGVjaG5pcXVlLCB0aGUgZGlzdHJpYnV0aW9uIHNob3VsZCBAZW1waHtub3R9IGNvbnRhaW4gYQotZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuaH0uICBUaGlzIGlzIHNvIHRoYXQgcGVvcGxlIHdvbid0IGJlIGFibGUgdG8KLWJ1aWxkIHRoZSBwcm9ncmFtIHdpdGhvdXQgY29uZmlndXJpbmcgaXQgZmlyc3QuCi0KLUFub3RoZXIgdGhpbmcgdGhhdCBAY29kZXtjb25maWd1cmV9IGNhbiBkbyBpcyB0byBlZGl0IHRoZSBNYWtlZmlsZS4gIElmCi15b3UgZG8gdGhpcywgdGhlIGRpc3RyaWJ1dGlvbiBzaG91bGQgQGVtcGh7bm90fSBjb250YWluIGEgZmlsZSBuYW1lZAotQGZpbGV7TWFrZWZpbGV9LiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluY2x1ZGUgYSBmaWxlIEBmaWxle01ha2VmaWxlLmlufSB3aGljaAotY29udGFpbnMgdGhlIGlucHV0IHVzZWQgZm9yIGVkaXRpbmcuICBPbmNlIGFnYWluLCB0aGlzIGlzIHNvIHRoYXQgcGVvcGxlCi13b24ndCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIHdpdGhvdXQgY29uZmlndXJpbmcgaXQgZmlyc3QuCi0KLUlmIEBjb2Rle2NvbmZpZ3VyZX0gZG9lcyB3cml0ZSB0aGUgQGZpbGV7TWFrZWZpbGV9LCB0aGVuIEBmaWxle01ha2VmaWxlfQotc2hvdWxkIGhhdmUgYSB0YXJnZXQgbmFtZWQgQGZpbGV7TWFrZWZpbGV9IHdoaWNoIGNhdXNlcyBAY29kZXtjb25maWd1cmV9Ci10byBiZSByZXJ1biwgc2V0dGluZyB1cCB0aGUgc2FtZSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHNldCB1cCBsYXN0Ci10aW1lLiAgVGhlIGZpbGVzIHRoYXQgQGNvZGV7Y29uZmlndXJlfSByZWFkcyBzaG91bGQgYmUgbGlzdGVkIGFzCi1kZXBlbmRlbmNpZXMgb2YgQGZpbGV7TWFrZWZpbGV9LgotCi1BbGwgdGhlIGZpbGVzIHdoaWNoIGFyZSBvdXRwdXQgZnJvbSB0aGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkCi1oYXZlIGNvbW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgZXhwbGFpbmluZyB0aGF0IHRoZXkgd2VyZSBnZW5lcmF0ZWQKLWF1dG9tYXRpY2FsbHkgdXNpbmcgQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgaXMgc28gdGhhdCB1c2VycyB3b24ndCB0aGluawotb2YgdHJ5aW5nIHRvIGVkaXQgdGhlbSBieSBoYW5kLgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIHdyaXRlIGEgZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuc3RhdHVzfQotd2hpY2ggZGVzY3JpYmVzIHdoaWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3ZXJlIHNwZWNpZmllZCB3aGVuIHRoZQotcHJvZ3JhbSB3YXMgbGFzdCBjb25maWd1cmVkLiAgVGhpcyBmaWxlIHNob3VsZCBiZSBhIHNoZWxsIHNjcmlwdCB3aGljaCwKLWlmIHJ1biwgd2lsbCByZWNyZWF0ZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uLgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIGFjY2VwdCBhbiBvcHRpb24gb2YgdGhlIGZvcm0KLUBzYW1wey0tc3JjZGlyPUB2YXJ7ZGlybmFtZX19IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSBzb3VyY2VzIGFyZSBmb3VuZAotKGlmIGl0IGlzIG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkpLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBidWlsZAotdGhlIHByb2dyYW0gaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHNvIHRoYXQgdGhlIGFjdHVhbCBzb3VyY2UgZGlyZWN0b3J5Ci1pcyBub3QgbW9kaWZpZWQuCi0KLUlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgQHNhbXB7LS1zcmNkaXJ9LCB0aGVuIEBjb2Rle2NvbmZpZ3VyZX0gc2hvdWxkCi1jaGVjayBib3RoIEBmaWxley59IGFuZCBAZmlsZXsuLn0gdG8gc2VlIGlmIGl0IGNhbiBmaW5kIHRoZSBzb3VyY2VzLiAgSWYKLWl0IGZpbmRzIHRoZSBzb3VyY2VzIGluIG9uZSBvZiB0aGVzZSBwbGFjZXMsIGl0IHNob3VsZCB1c2UgdGhlbSBmcm9tCi10aGVyZS4gIE90aGVyd2lzZSwgaXQgc2hvdWxkIHJlcG9ydCB0aGF0IGl0IGNhbm5vdCBmaW5kIHRoZSBzb3VyY2VzLCBhbmQKLXNob3VsZCBleGl0IHdpdGggbm9uemVybyBzdGF0dXMuCi0KLVVzdWFsbHkgdGhlIGVhc3kgd2F5IHRvIHN1cHBvcnQgQHNhbXB7LS1zcmNkaXJ9IGlzIGJ5IGVkaXRpbmcgYQotZGVmaW5pdGlvbiBvZiBAY29kZXtWUEFUSH0gaW50byB0aGUgTWFrZWZpbGUuICBTb21lIHJ1bGVzIG1heSBuZWVkIHRvCi1yZWZlciBleHBsaWNpdGx5IHRvIHRoZSBzcGVjaWZpZWQgc291cmNlIGRpcmVjdG9yeS4gIFRvIG1ha2UgdGhpcwotcG9zc2libGUsIEBjb2Rle2NvbmZpZ3VyZX0gY2FuIGFkZCB0byB0aGUgTWFrZWZpbGUgYSB2YXJpYWJsZSBuYW1lZAotQGNvZGV7c3JjZGlyfSB3aG9zZSB2YWx1ZSBpcyBwcmVjaXNlbHkgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0KLVRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBzaG91bGQgYWxzbyB0YWtlIGFuIGFyZ3VtZW50IHdoaWNoIHNwZWNpZmllcyB0aGUKLXR5cGUgb2Ygc3lzdGVtIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIGZvci4gIFRoaXMgYXJndW1lbnQgc2hvdWxkIGxvb2sgbGlrZQotdGhpczoKLQotQGV4YW1wbGUKLUB2YXJ7Y3B1fS1AdmFye2NvbXBhbnl9LUB2YXJ7c3lzdGVtfQotQGVuZCBleGFtcGxlCi0KLUZvciBleGFtcGxlLCBhIFN1biAzIG1pZ2h0IGJlIEBzYW1we202OGstc3VuLXN1bm9zNC4xfS4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IG5lZWRzIHRvIGJlIGFibGUgdG8gZGVjb2RlIGFsbCBwbGF1c2libGUKLWFsdGVybmF0aXZlcyBmb3IgaG93IHRvIGRlc2NyaWJlIGEgbWFjaGluZS4gIFRodXMsIEBzYW1we3N1bjMtc3Vub3M0LjF9Ci13b3VsZCBiZSBhIHZhbGlkIGFsaWFzLiAgRm9yIG1hbnkgcHJvZ3JhbXMsIEBzYW1we3ZheC1kZWMtdWx0cml4fSB3b3VsZAotYmUgYW4gYWxpYXMgZm9yIEBzYW1we3ZheC1kZWMtYnNkfSwgc2ltcGx5IGJlY2F1c2UgdGhlIGRpZmZlcmVuY2VzCi1iZXR3ZWVuIFVsdHJpeCBhbmQgQHNje0JTRH0gYXJlIHJhcmVseSBub3RpY2VhYmxlLCBidXQgYSBmZXcgcHJvZ3JhbXMKLW1pZ2h0IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlbS4KLUBjIFJlYWwgNC40QlNEIG5vdyBydW5zIG9uIHNvbWUgU3Vucy4KLQotVGhlcmUgaXMgYSBzaGVsbCBzY3JpcHQgY2FsbGVkIEBmaWxle2NvbmZpZy5zdWJ9IHRoYXQgeW91IGNhbiB1c2UKLWFzIGEgc3Vicm91dGluZSB0byB2YWxpZGF0ZSBzeXN0ZW0gdHlwZXMgYW5kIGNhbm9uaWNhbGl6ZSBhbGlhc2VzLgotCi1PdGhlciBvcHRpb25zIGFyZSBwZXJtaXR0ZWQgdG8gc3BlY2lmeSBpbiBtb3JlIGRldGFpbCB0aGUgc29mdHdhcmUKLW9yIGhhcmR3YXJlIHByZXNlbnQgb24gdGhlIG1hY2hpbmUsIGFuZCBpbmNsdWRlIG9yIGV4Y2x1ZGUgb3B0aW9uYWwKLXBhcnRzIG9mIHRoZSBwYWNrYWdlOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC0tZW5hYmxlLUB2YXJ7ZmVhdHVyZX1AcntbfT1AdmFye3BhcmFtZXRlcn1AcntdfQotQ29uZmlndXJlIHRoZSBwYWNrYWdlIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9wdGlvbmFsIHVzZXItbGV2ZWwKLWZhY2lsaXR5IGNhbGxlZCBAdmFye2ZlYXR1cmV9LiAgVGhpcyBhbGxvd3MgdXNlcnMgdG8gY2hvb3NlIHdoaWNoCi1vcHRpb25hbCBmZWF0dXJlcyB0byBpbmNsdWRlLiAgR2l2aW5nIGFuIG9wdGlvbmFsIEB2YXJ7cGFyYW1ldGVyfSBvZgotQHNhbXB7bm99IHNob3VsZCBvbWl0IEB2YXJ7ZmVhdHVyZX0sIGlmIGl0IGlzIGJ1aWx0IGJ5IGRlZmF1bHQuCi0KLU5vIEBzYW1wey0tZW5hYmxlfSBvcHRpb24gc2hvdWxkIEBzdHJvbmd7ZXZlcn0gY2F1c2Ugb25lIGZlYXR1cmUgdG8KLXJlcGxhY2UgYW5vdGhlci4gIE5vIEBzYW1wey0tZW5hYmxlfSBvcHRpb24gc2hvdWxkIGV2ZXIgc3Vic3RpdHV0ZSBvbmUKLXVzZWZ1bCBiZWhhdmlvciBmb3IgYW5vdGhlciB1c2VmdWwgYmVoYXZpb3IuICBUaGUgb25seSBwcm9wZXIgdXNlIGZvcgotQHNhbXB7LS1lbmFibGV9IGlzIGZvciBxdWVzdGlvbnMgb2Ygd2hldGhlciB0byBidWlsZCBwYXJ0IG9mIHRoZSBwcm9ncmFtCi1vciBleGNsdWRlIGl0LgotCi1AaXRlbSAtLXdpdGgtQHZhcntwYWNrYWdlfQotQGMgQHJ7W309QHZhcntwYXJhbWV0ZXJ9QHJ7XX0KLVRoZSBwYWNrYWdlIEB2YXJ7cGFja2FnZX0gd2lsbCBiZSBpbnN0YWxsZWQsIHNvIGNvbmZpZ3VyZSB0aGlzIHBhY2thZ2UKLXRvIHdvcmsgd2l0aCBAdmFye3BhY2thZ2V9LgotCi1AYyAgR2l2aW5nIGFuIG9wdGlvbmFsIEB2YXJ7cGFyYW1ldGVyfSBvZgotQGMgQHNhbXB7bm99IHNob3VsZCBvbWl0IEB2YXJ7cGFja2FnZX0sIGlmIGl0IGlzIHVzZWQgYnkgZGVmYXVsdC4KLQotUG9zc2libGUgdmFsdWVzIG9mIEB2YXJ7cGFja2FnZX0gaW5jbHVkZSAKLUBzYW1we2dudS1hc30gKG9yIEBzYW1we2dhc30pLCBAc2FtcHtnbnUtbGR9LCBAc2FtcHtnbnUtbGliY30sCi1Ac2FtcHtnZGJ9LAotQHNhbXB7eH0sIAotYW5kCi1Ac2FtcHt4LXRvb2xraXR9LgotCi1EbyBub3QgdXNlIGEgQHNhbXB7LS13aXRofSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIHRvIHVzZSB0bwotZmluZCBjZXJ0YWluIGZpbGVzLiAgVGhhdCBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiB3aGF0IEBzYW1wey0td2l0aH0KLW9wdGlvbnMgYXJlIGZvci4KLQotQGl0ZW0gLS1uZnAKLVRoZSB0YXJnZXQgbWFjaGluZSBoYXMgbm8gZmxvYXRpbmcgcG9pbnQgcHJvY2Vzc29yLgotCi1AaXRlbSAtLWdhcwotVGhlIHRhcmdldCBtYWNoaW5lIGFzc2VtYmxlciBpcyBHQVMsIHRoZSBHTlUgYXNzZW1ibGVyLgotVGhpcyBpcyBvYnNvbGV0ZTsgdXNlcnMgc2hvdWxkIHVzZSBAc2FtcHstLXdpdGgtZ251LWFzfSBpbnN0ZWFkLgotCi1AaXRlbSAtLXgKLVRoZSB0YXJnZXQgbWFjaGluZSBoYXMgdGhlIFggV2luZG93IFN5c3RlbSBpbnN0YWxsZWQuCi1UaGlzIGlzIG9ic29sZXRlOyB1c2VycyBzaG91bGQgdXNlIEBzYW1wey0td2l0aC14fSBpbnN0ZWFkLgotQGVuZCB0YWJsZQotCi1BbGwgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHRzIHNob3VsZCBhY2NlcHQgYWxsIG9mIHRoZXNlIGBgZGV0YWlsJycKLW9wdGlvbnMsIHdoZXRoZXIgb3Igbm90IHRoZXkgbWFrZSBhbnkgZGlmZmVyZW5jZSB0byB0aGUgcGFydGljdWxhcgotcGFja2FnZSBhdCBoYW5kLiAgSW4gcGFydGljdWxhciwgdGhleSBzaG91bGQgYWNjZXB0IGFueSBvcHRpb24gdGhhdAotc3RhcnRzIHdpdGggQHNhbXB7LS13aXRoLX0gb3IgQHNhbXB7LS1lbmFibGUtfS4gIFRoaXMgaXMgc28gdXNlcnMgd2lsbAotYmUgYWJsZSB0byBjb25maWd1cmUgYW4gZW50aXJlIEdOVSBzb3VyY2UgdHJlZSBhdCBvbmNlIHdpdGggYSBzaW5nbGUgc2V0Ci1vZiBvcHRpb25zLgotCi1Zb3Ugd2lsbCBub3RlIHRoYXQgdGhlIGNhdGVnb3JpZXMgQHNhbXB7LS13aXRoLX0gYW5kIEBzYW1wey0tZW5hYmxlLX0KLWFyZSBuYXJyb3c6IHRoZXkgQHN0cm9uZ3tkbyBub3R9IHByb3ZpZGUgYSBwbGFjZSBmb3IgYW55IHNvcnQgb2Ygb3B0aW9uCi15b3UgbWlnaHQgdGhpbmsgb2YuICBUaGF0IGlzIGRlbGliZXJhdGUuICBXZSB3YW50IHRvIGxpbWl0IHRoZSBwb3NzaWJsZQotY29uZmlndXJhdGlvbiBvcHRpb25zIGluIEdOVSBzb2Z0d2FyZS4gIFdlIGRvIG5vdCB3YW50IEdOVSBwcm9ncmFtcyB0bwotaGF2ZSBpZGlvc3luY3JhdGljIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KLQotUGFja2FnZXMgdGhhdCBwZXJmb3JtIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MgbWF5IHN1cHBvcnQgY3Jvc3MtY29tcGlsYXRpb24uCi1JbiBzdWNoIGEgY2FzZSwgdGhlIGhvc3QgYW5kIHRhcmdldCBtYWNoaW5lcyBmb3IgdGhlIHByb2dyYW0gbWF5IGJlCi1kaWZmZXJlbnQuICBUaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIG5vcm1hbGx5IHRyZWF0IHRoZQotc3BlY2lmaWVkIHR5cGUgb2Ygc3lzdGVtIGFzIGJvdGggdGhlIGhvc3QgYW5kIHRoZSB0YXJnZXQsIHRodXMgcHJvZHVjaW5nCi1hIHByb2dyYW0gd2hpY2ggd29ya3MgZm9yIHRoZSBzYW1lIHR5cGUgb2YgbWFjaGluZSB0aGF0IGl0IHJ1bnMgb24uCi0KLVRoZSB3YXkgdG8gYnVpbGQgYSBjcm9zcy1jb21waWxlciwgY3Jvc3MtYXNzZW1ibGVyLCBvciB3aGF0IGhhdmUgeW91LCBpcwotdG8gc3BlY2lmeSB0aGUgb3B0aW9uIEBzYW1wey0taG9zdD1AdmFye2hvc3R0eXBlfX0gd2hlbiBydW5uaW5nCi1AY29kZXtjb25maWd1cmV9LiAgVGhpcyBzcGVjaWZpZXMgdGhlIGhvc3Qgc3lzdGVtIHdpdGhvdXQgY2hhbmdpbmcgdGhlCi10eXBlIG9mIHRhcmdldCBzeXN0ZW0uICBUaGUgc3ludGF4IGZvciBAdmFye2hvc3R0eXBlfSBpcyB0aGUgc2FtZSBhcwotZGVzY3JpYmVkIGFib3ZlLgotCi1Cb290c3RyYXBwaW5nIGEgY3Jvc3MtY29tcGlsZXIgcmVxdWlyZXMgY29tcGlsaW5nIGl0IG9uIGEgbWFjaGluZSBvdGhlcgotdGhhbiB0aGUgaG9zdCBpdCB3aWxsIHJ1biBvbi4gIENvbXBpbGF0aW9uIHBhY2thZ2VzIGFjY2VwdCBhCi1jb25maWd1cmF0aW9uIG9wdGlvbiBAc2FtcHstLWJ1aWxkPUB2YXJ7aG9zdHR5cGV9fSBmb3Igc3BlY2lmeWluZyB0aGUKLWNvbmZpZ3VyYXRpb24gb24gd2hpY2ggeW91IHdpbGwgY29tcGlsZSB0aGVtLCBpbiBjYXNlIHRoYXQgaXMgZGlmZmVyZW50Ci1mcm9tIHRoZSBob3N0LgotCi1Qcm9ncmFtcyBmb3Igd2hpY2ggY3Jvc3Mtb3BlcmF0aW9uIGlzIG5vdCBtZWFuaW5nZnVsIG5lZWQgbm90IGFjY2VwdCB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uLCBiZWNhdXNlIGNvbmZpZ3VyaW5nIGFuIGVudGlyZSBvcGVyYXRpbmcgc3lzdGVtIGZvcgotY3Jvc3Mtb3BlcmF0aW9uIGlzIG5vdCBhIG1lYW5pbmdmdWwgdGhpbmcuCi0KLVNvbWUgcHJvZ3JhbXMgaGF2ZSB3YXlzIG9mIGNvbmZpZ3VyaW5nIHRoZW1zZWx2ZXMgYXV0b21hdGljYWxseS4gIElmCi15b3VyIHByb2dyYW0gaXMgc2V0IHVwIHRvIGRvIHRoaXMsIHlvdXIgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgY2FuIHNpbXBseQotaWdub3JlIG1vc3Qgb2YgaXRzIGFyZ3VtZW50cy4KLQotQGNvbW1lbnQgVGhlIG1ha2VmaWxlIHN0YW5kYXJkcyBhcmUgaW4gYSBzZXBhcmF0ZSBmaWxlIHRoYXQgaXMgYWxzbwotQGNvbW1lbnQgaW5jbHVkZWQgYnkgbWFrZS50ZXhpbmZvLiAgRG9uZSBieSByb2xhbmRAZ251LmFpLm1pdC5lZHUgb24gMS82LzkzLgotQGNvbW1lbnQgRm9yIHRoaXMgZG9jdW1lbnQsIHR1cm4gY2hhcHRlcnMgaW50byBzZWN0aW9ucywgZXRjLgotQGxvd2Vyc2VjdGlvbnMKLUBpbmNsdWRlIG1ha2Utc3Rkcy50ZXhpCi1AcmFpc2VzZWN0aW9ucwotCi1Abm9kZSBSZWxlYXNlcwotQHNlY3Rpb24gTWFraW5nIFJlbGVhc2VzCi0KLVBhY2thZ2UgdGhlIGRpc3RyaWJ1dGlvbiBvZiBAY29kZXtGb28gdmVyc2lvbiA2OS45Nn0gdXAgaW4gYSBnemlwcGVkIHRhcgotZmlsZSB3aXRoIHRoZSBuYW1lIEBmaWxle2Zvby02OS45Ni50YXIuZ3p9LiAgSXQgc2hvdWxkIHVucGFjayBpbnRvIGEKLXN1YmRpcmVjdG9yeSBuYW1lZCBAZmlsZXtmb28tNjkuOTZ9LgotCi1CdWlsZGluZyBhbmQgaW5zdGFsbGluZyB0aGUgcHJvZ3JhbSBzaG91bGQgbmV2ZXIgbW9kaWZ5IGFueSBvZiB0aGUgZmlsZXMKLWNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgVGhpcyBtZWFucyB0aGF0IGFsbCB0aGUgZmlsZXMgdGhhdCBmb3JtCi1wYXJ0IG9mIHRoZSBwcm9ncmFtIGluIGFueSB3YXkgbXVzdCBiZSBjbGFzc2lmaWVkIGludG8gQGRmbntzb3VyY2UKLWZpbGVzfSBhbmQgQGRmbntub24tc291cmNlIGZpbGVzfS4gIFNvdXJjZSBmaWxlcyBhcmUgd3JpdHRlbiBieSBodW1hbnMKLWFuZCBuZXZlciBjaGFuZ2VkIGF1dG9tYXRpY2FsbHk7IG5vbi1zb3VyY2UgZmlsZXMgYXJlIHByb2R1Y2VkIGZyb20KLXNvdXJjZSBmaWxlcyBieSBwcm9ncmFtcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgTWFrZWZpbGUuCi0KLU5hdHVyYWxseSwgYWxsIHRoZSBzb3VyY2UgZmlsZXMgbXVzdCBiZSBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgSXQgaXMgb2theQotdG8gaW5jbHVkZSBub24tc291cmNlIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24sIHByb3ZpZGVkIHRoZXkgYXJlCi11cC10by1kYXRlIGFuZCBtYWNoaW5lLWluZGVwZW5kZW50LCBzbyB0aGF0IGJ1aWxkaW5nIHRoZSBkaXN0cmlidXRpb24KLW5vcm1hbGx5IHdpbGwgbmV2ZXIgbW9kaWZ5IHRoZW0uICBXZSBjb21tb25seSBpbmNsdWRlIG5vbi1zb3VyY2UgZmlsZXMKLXByb2R1Y2VkIGJ5IEJpc29uLCBAY29kZXtsZXh9LCBAVGVYe30sIGFuZCBAY29kZXttYWtlaW5mb307IHRoaXMgaGVscHMgYXZvaWQKLXVubmVjZXNzYXJ5IGRlcGVuZGVuY2llcyBiZXR3ZWVuIG91ciBkaXN0cmlidXRpb25zLCBzbyB0aGF0IHVzZXJzIGNhbgotaW5zdGFsbCB3aGljaGV2ZXIgcGFja2FnZXMgdGhleSB3YW50IHRvIGluc3RhbGwuCi0KLU5vbi1zb3VyY2UgZmlsZXMgdGhhdCBtaWdodCBhY3R1YWxseSBiZSBtb2RpZmllZCBieSBidWlsZGluZyBhbmQKLWluc3RhbGxpbmcgdGhlIHByb2dyYW0gc2hvdWxkIEBzdHJvbmd7bmV2ZXJ9IGJlIGluY2x1ZGVkIGluIHRoZQotZGlzdHJpYnV0aW9uLiAgU28gaWYgeW91IGRvIGRpc3RyaWJ1dGUgbm9uLXNvdXJjZSBmaWxlcywgYWx3YXlzIG1ha2UKLXN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZSB3aGVuIHlvdSBtYWtlIGEgbmV3IGRpc3RyaWJ1dGlvbi4KLQotTWFrZSBzdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBkaXN0cmlidXRpb24gdW5wYWNrcyAoYXMKLXdlbGwgYXMgYW55IHN1YmRpcmVjdG9yaWVzKSBhcmUgYWxsIHdvcmxkLXdyaXRhYmxlIChvY3RhbCBtb2RlIDc3NykuCi1UaGlzIGlzIHNvIHRoYXQgb2xkIHZlcnNpb25zIG9mIEBjb2Rle3Rhcn0gd2hpY2ggcHJlc2VydmUgdGhlCi1vd25lcnNoaXAgYW5kIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlcyBmcm9tIHRoZSB0YXIgYXJjaGl2ZSB3aWxsIGJlCi1hYmxlIHRvIGV4dHJhY3QgYWxsIHRoZSBmaWxlcyBldmVuIGlmIHRoZSB1c2VyIGlzIHVucHJpdmlsZWdlZC4KLQotTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZSB3b3JsZC1yZWFkYWJsZS4KLQotTWFrZSBzdXJlIHRoYXQgbm8gZmlsZSBuYW1lIGluIHRoZSBkaXN0cmlidXRpb24gaXMgbW9yZSB0aGFuIDE0Ci1jaGFyYWN0ZXJzIGxvbmcuICBMaWtld2lzZSwgbm8gZmlsZSBjcmVhdGVkIGJ5IGJ1aWxkaW5nIHRoZSBwcm9ncmFtCi1zaG91bGQgaGF2ZSBhIG5hbWUgbG9uZ2VyIHRoYW4gMTQgY2hhcmFjdGVycy4gIFRoZSByZWFzb24gZm9yIHRoaXMgaXMKLXRoYXQgc29tZSBzeXN0ZW1zIGFkaGVyZSB0byBhIGZvb2xpc2ggaW50ZXJwcmV0YXRpb24gb2YgdGhlIFBPU0lYCi1zdGFuZGFyZCwgYW5kIHJlZnVzZSB0byBvcGVuIGEgbG9uZ2VyIG5hbWUsIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgYXMKLXRoZXkgZGlkIGluIHRoZSBwYXN0LgotCi1Eb24ndCBpbmNsdWRlIGFueSBzeW1ib2xpYyBsaW5rcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGl0c2VsZi4gIElmIHRoZSB0YXIKLWZpbGUgY29udGFpbnMgc3ltYm9saWMgbGlua3MsIHRoZW4gcGVvcGxlIGNhbm5vdCBldmVuIHVucGFjayBpdCBvbgotc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc3ltYm9saWMgbGlua3MuICBBbHNvLCBkb24ndCB1c2UgbXVsdGlwbGUKLW5hbWVzIGZvciBvbmUgZmlsZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMsIGJlY2F1c2UgY2VydGFpbiBmaWxlCi1zeXN0ZW1zIGNhbm5vdCBoYW5kbGUgdGhpcyBhbmQgdGhhdCBwcmV2ZW50cyB1bnBhY2tpbmcgdGhlCi1kaXN0cmlidXRpb24uCi0KLVRyeSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGZpbGUgbmFtZXMgd2lsbCBiZSB1bmlxdWUgb24gTVMtRE9TLiAgQQotbmFtZSBvbiBNUy1ET1MgY29uc2lzdHMgb2YgdXAgdG8gOCBjaGFyYWN0ZXJzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEKLXBlcmlvZCBhbmQgdXAgdG8gdGhyZWUgY2hhcmFjdGVycy4gIE1TLURPUyB3aWxsIHRydW5jYXRlIGV4dHJhCi1jaGFyYWN0ZXJzIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgcGVyaW9kLiAgVGh1cywKLUBmaWxle2Zvb2JhcmhhY2tlci5jfSBhbmQgQGZpbGV7Zm9vYmFyaGFja2VyLm99IGFyZSBub3QgYW1iaWd1b3VzOyB0aGV5Ci1hcmUgdHJ1bmNhdGVkIHRvIEBmaWxle2Zvb2JhcmhhLmN9IGFuZCBAZmlsZXtmb29iYXJoYS5vfSwgd2hpY2ggYXJlCi1kaXN0aW5jdC4KLQotSW5jbHVkZSBpbiB5b3VyIGRpc3RyaWJ1dGlvbiBhIGNvcHkgb2YgdGhlIEBmaWxle3RleGluZm8udGV4fSB5b3UgdXNlZAotdG8gdGVzdCBwcmludCBhbnkgQGZpbGV7Ki50ZXhpbmZvfSBvciBAZmlsZXsqLnRleGl9IGZpbGVzLgotCi1MaWtld2lzZSwgaWYgeW91ciBwcm9ncmFtIHVzZXMgc21hbGwgR05VIHNvZnR3YXJlIHBhY2thZ2VzIGxpa2UgcmVnZXgsCi1nZXRvcHQsIG9ic3RhY2ssIG9yIHRlcm1jYXAsIGluY2x1ZGUgdGhlbSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZpbGUuCi1MZWF2aW5nIHRoZW0gb3V0IHdvdWxkIG1ha2UgdGhlIGRpc3RyaWJ1dGlvbiBmaWxlIGEgbGl0dGxlIHNtYWxsZXIgYXQKLXRoZSBleHBlbnNlIG9mIHBvc3NpYmxlIGluY29udmVuaWVuY2UgdG8gYSB1c2VyIHdobyBkb2Vzbid0IGtub3cgd2hhdAotb3RoZXIgZmlsZXMgdG8gZ2V0LgotCi1AY29udGVudHMKLQotQGJ5ZQotTG9jYWwgdmFyaWFibGVzOgotdXBkYXRlLWRhdGUtbGVhZGluZy1yZWdleHA6ICJAYyBUaGlzIGRhdGUgaXMgYXV0b21hZ2ljYWxseSB1cGRhdGVkIHdoZW4geW91IHNhdmUgdGhpcyBmaWxlOlxuQHNldCBsYXN0dXBkYXRlICIKLXVwZGF0ZS1kYXRlLXRyYWlsaW5nLXJlZ2V4cDogIiIKLWV2YWw6IChsb2FkICIvZ2QvZ251b3JnL3VwZGF0ZS1kYXRlLmVsIikKLWV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndXBkYXRlLWRhdGUpCi1FbmQ6CmRpZmYgLS1naXQgYS9nYXMvQ09OVFJJQlVUT1JTIGIvZ2FzL0NPTlRSSUJVVE9SUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmZDAzZS4uMDAwMDAwMAotLS0gYS9nYXMvQ09OVFJJQlVUT1JTCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLShUaGlzIGZpbGUgaXMgdW5kZXIgY29uc3RydWN0aW9uLikJCQktKi0gdGV4dCAtKi0KLQotSWYgeW91J3ZlIGNvbnRyaWJ1dGVkIHRvIGdhcyBhbmQgeW91ciBuYW1lIGlzbid0IGxpc3RlZCBoZXJlLCBpdCBpcwotbm90IG1lYW50IGFzIGEgc2xpZ2h0LiAgSSBqdXN0IGRvbid0IGtub3cgYWJvdXQgaXQuICBFbWFpbCBtZSwKLXJhZWJ1cm5AY3lnbnVzLmNvbSBhbmQgSSdsbCBjb3JyZWN0IHRoZSBzaXR1YXRpb24uCi0KLVRoaXMgZmlsZSB3aWxsIGV2ZW50dWFsbHkgYmUgZGVsZXRlZDogVGhlIGdlbmVyYWwgaW5mbyB3aWxsIGdvIGludG8KLXRoZSBkb2N1bWVudGF0aW9uLCBhbmQgaW5mbyBvbiBzcGVjaWZpYyBmaWxlcyB3aWxsIGdvIGludG8gYW4gQVVUSE9SUwotZmlsZSwgYXMgcmVxdWVzdGVkIGJ5IHRoZSBGU0YuCi0KLSsrKysrKysrKysrKysrKysKLQotRGVhbiBFbHNuZXIgd3JvdGUgdGhlIG9yaWdpbmFsIGdhcyBmb3IgdmF4LiAgW21vcmUgZGV0YWlscz9dCi0KLUpheSBGZW5sYXNvbiBtYWludGFpbmVkIGdhcyBmb3IgYSB3aGlsZSwgYWRkaW5nIHN1cHBvcnQgZm9yCi1nZGItc3BlY2lmaWMgZGVidWcgaW5mb3JtYXRpb24gYW5kIHRoZSA2OGsgc2VyaWVzIG1hY2hpbmVzLCBtb3N0IG9mCi10aGUgcHJlcHJvY2Vzc2luZyBwYXNzLCBhbmQgZXh0ZW5zaXZlIGNoYW5nZXMgaW4gbWVzc2FnZXMuYywKLWlucHV0LWZpbGUuYywgd3JpdGUuYy4KLQotSy4gUmljaGFyZCBQaXhsZXkgbWFpbnRhaW5lZCBnYXMgZm9yIGEgd2hpbGUsIGFkZGluZyB2YXJpb3VzCi1lbmhhbmNlbWVudHMgYW5kIG1hbnkgYnVnIGZpeGVzLCBpbmNsdWRpbmcgbWVyZ2luZyBzdXBwb3J0IGZvciBzZXZlcmFsCi1wcm9jZXNzb3JzLCBicmVha2luZyBnYXMgdXAgdG8gaGFuZGxlIG11bHRpcGxlIG9iamVjdCBmaWxlIGZvcm1hdAotYmFja2VuZHMgKGluY2x1ZGluZyBoZWF2eSByZXdyaXRlLCB0ZXN0aW5nLCBhbiBpbnRlZ3JhdGlvbiBvZiB0aGUgY29mZgotYW5kIGIub3V0IGJhY2tlbmRzKSwgYWRkaW5nIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIGhlYXZ5IHRlc3RpbmcgYW5kCi12ZXJpZmljYXRpb24gb2YgY3Jvc3MgYXNzZW1ibGVycyBhbmQgZmlsZSBzcGxpdHMgYW5kIHJlbmFtaW5nLAotY29udmVydGVkIGdhcyB0byBzdHJpY3RseSBhbnNpIEMgaW5jbHVkaW5nIGZ1bGwgcHJvdG90eXBlcywgYWRkZWQKLXN1cHBvcnQgZm9yIG02ODBbMzRdMCAmIGNwdTMyLCBjb25zaWRlcmFibGUgd29yayBvbiBpOTYwIGluY2x1ZGluZyBhCi1jb2ZmIHBvcnQgKGluY2x1ZGluZyBjb25zaWRlcmFibGUgYW1vdW50cyBvZiByZXZlcnNlIGVuZ2luZWVyaW5nKSwgYQotc3BhcmMgb3Bjb2RlIGZpbGUgcmV3cml0ZSwgZGVjc3RhdGlvbiwgcnM2MDAwLCBhbmQgaHAzMDBocHV4IGhvc3QKLXBvcnRzLCB1cGRhdGVkICJrbm93IiBhc3NlcnRpb25zIGFuZCBtYWRlIHRoZW0gd29yaywgbXVjaCBvdGhlcgotcmVvcmdhbml6YXRpb24sIGNsZWFudXAsIGFuZCBsaW50LgotCi1LZW4gUmFlYnVybiBjdXJyZW50bHkgbWFpbnRhaW5zIGdhcywgYW5kIHdyb3RlIHRoZSBoaWdoLWxldmVsIEJGRAotaW50ZXJmYWNlIGNvZGUgdG8gcmVwbGFjZSBtb3N0IG9mIHRoZSBjb2RlIGluIGZvcm1hdC1zcGVjaWZpYyBJL08KLW1vZHVsZXMuCi0KLVRoZSBvcmlnaW5hbCBWYXgtVk1TIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IERhdmlkIEwuIEthc2h0YW4uCi1FcmljIFlvdW5nZGFsZSBhbmQgUGF0IFJhbmtpbiBoYXZlIGRvbmUgbXVjaCB3b3JrIHdpdGggaXQgc2luY2UuCi0KLVRoZSBJbnRlbCA4MDM4NiBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyB3cml0dGVuIGJ5IEVsaW90IERyZXNzZWxoYXVzLgotCi1NaW5oIFRyYW4tTGUgYXQgSW50ZWxsaUNvcnAgY29udHJpYnV0ZWQgc29tZSBBSVggMzg2IHN1cHBvcnQuCi0KLVRoZSBNb3Rvcm9sYSA4OGsgbWFjaGluZSBkZXNjcmlwdGlvbiB3YXMgY29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YKLUJ1ZmZhbG8gVW5pdmVyc2l0eSBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mCi1Db21wdXRlciBTY2llbmNlLgotCi1LZWl0aCBLbm93bGVzIGF0IHRoZSBPcGVuIFNvZnR3YXJlIEZvdW5kYXRpb24gd3JvdGUgdGhlIG9yaWdpbmFsIE1JUFMKLWJhY2sgZW5kICh0Yy1taXBzLmMsIHRjLW1pcHMuaCksIGFuZCBjb250cmlidXRlZCBSb3NlIGZvcm1hdCBzdXBwb3J0Ci10aGF0IGhhc24ndCBiZWVuIG1lcmdlZCBpbiB5ZXQuICBSYWxwaCBDYW1wYmVsbCB3b3JrZWQgd2l0aCB0aGUgTUlQUwotY29kZSB0byBzdXBwb3J0IGEub3V0IGZvcm1hdC4KLQotU3VwcG9ydCBmb3IgdGhlIFppbG9nIFo4ayBhbmQgSGl0YWNoaSBIOC8zMDAsIEg4LzUwMCBhbmQgU0ggcHJvY2Vzc29ycwotKHRjLXo4aywgdGMtaDgzMDAsIHRjLWg4NTAwLCB0Yy1zaCksIGFuZCBJRUVFIDY5NSBvYmplY3QgZmlsZSBmb3JtYXQKLShvYmotaWVlZSksIHdhcyB3cml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTb2x1dGlvbnMuCi1TdGV2ZSBhbHNvIG1vZGlmaWVkIHRoZSBDT0ZGIGJhY2sgZW5kIChvYmotY29mZmJmZCkgdG8gdXNlIEJGRCBmb3IKLXNvbWUgbG93LWxldmVsIG9wZXJhdGlvbnMsIGZvciB1c2Ugd2l0aCB0aGUgSGl0YWNoaSwgMjlrIGFuZCBaaWxvZwotdGFyZ2V0cy4KLQotSm9obiBHaWxtb3JlIGJ1aWx0IHRoZSBBTUQgMjkwMDAgc3VwcG9ydCwgYWRkZWQgLmluY2x1ZGUgc3VwcG9ydCwgYW5kCi1zaW1wbGlmaWVkIHRoZSBjb25maWd1cmF0aW9uIG9mIHdoaWNoIHZlcnNpb25zIGFjY2VwdCB3aGljaAotcHNldWRvLW9wcy4gIEhlIHVwZGF0ZWQgdGhlIDY4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHNvIHRoYXQgTW90b3JvbGEncwotb3Bjb2RlcyBhbHdheXMgcHJvZHVjZWQgZml4ZWQtc2l6ZSBpbnN0cnVjdGlvbnMgKGUuZy4ganNyKSwgd2hpbGUKLXN5bnRoZXRpYyBpbnN0cnVjdGlvbnMgcmVtYWluZWQgc2hyaW5rYWJsZSAoamJzcikuICBKb2huIGZpeGVkIG1hbnkKLWJ1Z3MsIGluY2x1ZGluZyB0cnVlIHRlc3RlZCBjcm9zcy1jb21waWxhdGlvbiBzdXBwb3J0LCBhbmQgb25lIGJ1ZyBpbgotcmVsYXhhdGlvbiB0aGF0IHRvb2sgYSB3ZWVrIGFuZCByZXF1aXJlZCB0aGUgcHJvdmVyYmlhbCBvbmUtYml0IGZpeC4KLQotSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMgU29sdXRpb25zIG1lcmdlZCB0aGUgTW90b3JvbGEgYW5kIE1JVAotc3ludGF4ZXMgZm9yIHRoZSA2OGssIGNvbXBsZXRlZCBzdXBwb3J0IGZvciBzb21lIENPRkYgdGFyZ2V0cyAoNjhrLAotaTM4NiBTVlIzLCBhbmQgU0NPIFVuaXgpLCB3cm90ZSB0aGUgRUNPRkYgc3VwcG9ydCBiYXNlZCBvbiBNaWNoYWVsCi1NZWlzc25lcidzIG1pcHMtdGZpbGUgcHJvZ3JhbSwgd3JvdGUgdGhlIFBvd2VyUEMgYW5kIFJTLzYwMDAgc3VwcG9ydCwKLWFuZCBtYWRlIGEgZmV3IG90aGVyIG1pbm9yIHBhdGNoZXMuICBIZSBoYW5kbGVkIHRoZSBiaW51dGlscyByZWxlYXNlcwotZm9yIHZlcnNpb25zIDIuNyB0aHJvdWdoIDIuOS4KLQotRGF2aWQgRWRlbHNvaG4gY29udHJpYnV0ZWQgZml4ZXMgZm9yIHRoZSBQb3dlclBDIGFuZCBBSVggc3VwcG9ydC4KLQotU3RldmUgQ2hhbWJlcmxhaW4gbWFkZSBnYXMgYWJsZSB0byBnZW5lcmF0ZSBsaXN0aW5ncy4KLQotU3VwcG9ydCBmb3IgdGhlIEhQOTAwMC8zMDAgd2FzIGNvbnRyaWJ1dGVkIGJ5IEdsZW5uIEVuZ2VsIG9mIEhQLgotCi1TdXBwb3J0IGZvciBFTEYgZm9ybWF0IGZpbGVzIGhhcyBiZWVuIHdvcmtlZCBvbiBieSBNYXJrIEVpY2hpbiBvZgotQ3lnbnVzIFNvbHV0aW9ucyAob3JpZ2luYWwsIGluY29tcGxldGUgaW1wbGVtZW50YXRpb24pLCBQZXRlCi1Ib29nZW5ib29tIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggKEhQUEEgbWFpbmx5KSwgTWljaGFlbCBNZWlzc25lcgotb2YgdGhlIE9wZW4gU29mdHdhcmUgRm91bmRhdGlvbiAoaTM4NiBtYWlubHkpLCBhbmQgS2VuIFJhZWJ1cm4gb2YKLUN5Z251cyBTb2x1dGlvbnMgKHNwYXJjLCBpbml0aWFsIDY0LWJpdCBzdXBwb3J0KS4KLQotU2V2ZXJhbCBlbmdpbmVlcnMgYXQgQ3lnbnVzIFNvbHV0aW9ucyBoYXZlIGFsc28gcHJvdmlkZWQgbWFueSBzbWFsbAotYnVnIGZpeGVzIGFuZCBjb25maWd1cmF0aW9uIGVuaGFuY2VtZW50cy4KLQotVGhlIGluaXRpYWwgQWxwaGEgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgQ2FybmVnaWUtTWVsbG9uCi1Vbml2ZXJzaXR5LiAgQWRkaXRpb25hbCB3b3JrIHdhcyBkb25lIGJ5IEtlbiBSYWVidXJuIG9mIEN5Z251cwotU29sdXRpb25zLiAgUmljaGFyZCBIZW5kZXJzb24gdGhlbiByZXdyb3RlIG11Y2ggb2YgdGhlIEFscGhhIHN1cHBvcnQuCi0KLUlhbiBEYWxsIHVwZGF0ZWQgdGhlIHN1cHBvcnQgY29kZSBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgMzIwMDAKLXNlcmllcywgYW5kIGFkZGVkIHN1cHBvcnQgZm9yIE1hY2ggMyBhbmQgTmV0QlNEIHJ1bm5pbmcgb24gdGhlIFBDNTMyLgotCi1LbGF1cyBLYWVtcGYgcG9ydGVkIHRoZSBhc3NlbWJsZXIgYW5kIHRoZSBiaW51dGlscyB0byBvcGVuVk1TL0FscGhhLgotCi1TdGV2ZSBIYXdvcnRoIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1Y3Rpb24gYzMwCi0odG1zMzIwYzMwKS4KLQotSC5KLiBMdSBoYXMgY29udHJpYnV0ZWQgbWFueSBwYXRjaGVzIGFuZCBtdWNoIHRlc3RpbmcuCi0KLUFsYW4gTW9kcmEgcmV3b3JrZWQgbXVjaCBvZiB0aGUgaTM4NiBiYWNrZW5kLCBpbXByb3ZpbmcgdGhlIGVycm9yCi1jaGVja2luZywgdXBkYXRpbmcgdGhlIGNvZGUsIGFuZCBpbXByb3ZpbmcgdGhlIDE2IGJpdCBzdXBwb3J0LCB1c2luZwotcGF0Y2hlcyBmcm9tIHRoZSB3b3JrIG9mIE1hcnR5bmFzIEt1bmlnZWxpcyBhbmQgSC5KLiBMdS4KLQotTWFueSBvdGhlcnMgaGF2ZSBjb250cmlidXRlZCBsYXJnZSBvciBzbWFsbCBidWdmaXhlcyBhbmQgZW5oYW5jZW1lbnRzLiAgSWYKLXlvdSd2ZSBjb250cmlidXRlZCBzaWduaWZpY2FudCB3b3JrIGFuZCBhcmUgbm90IG1lbnRpb25lZCBvbiB0aGlzIGxpc3QsIGFuZAotd2FudCB0byBiZSwgbGV0IHVzIGtub3cuICBTb21lIG9mIHRoZSBoaXN0b3J5IGhhcyBiZWVuIGxvc3Q7IHdlIGFyZW4ndAotaW50ZW50aW9uYWxseSBsZWF2aW5nIGFueW9uZSBvdXQuCmRpZmYgLS1naXQgYS9nYXMvQ09QWUlORyBiL2dhcy9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU0OWJlLi4wMDAwMDAwCi0tLSBhL2dhcy9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZ2FzL0NoYW5nZUxvZyBiL2dhcy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWVmZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDU2MDYgKzAsMCBAQAotMjAwMC0wNC0wMiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoY2hlY2tfcmFuZ2UpOiBBbGxvdyBzaWduZWQgb3IgdW5zaWduZWQgMzItYml0Ci0JcXVhbnRpdGllcy4gIENvcnJlY3QgcmlnaHQgc2hpZnQgc2lnbiBleHRlbnNpb24uCi0JKGJ1aWxkX2luc24pOiBNYWtlIGBudW1iZXInIHVuc2lnbmVkIGxvbmcuICBNYXNrIHRvcCA2IGJpdHMgb2YKLQkzMi1iaXQgdmFsdWUgd2hlbiBzaGlmdGluZyBpbnRvIHBsYWNlLgotCi0yMDAwLTA0LTAxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYXBwLmM6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIGFzIG5lZWRlZC4KLQkqIGNvbmZpZy90Yy1wcGMuYzogTGlrZXdpc2UuCi0JKHBwY19zaXplKTogTWFrZSB1bnNpZ25lZCBsb25nLgotCShwcGNfaW5zZXJ0X29wZXJhbmQpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLTIwMDAtMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVmaW5lLgotCi0yMDAwLTAzLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guaCAoU0VHX05BTUUpOiBOZXcgbWFjcm86IHJldHVybiB0aGUgbmFtZSBvZiBhCi0Jc2VnbWVudC4gIFdvcmtzIGZvciBib3RoIEJGRF9BU1NFTUJMRVIgYW5kIG90aGVycy4KLQkoU1VCX1NFR01FTlRfQUxJR04pOiBVc2UgU0VHX05BTUUuCi0KLTIwMDAtMDMtMjkgIE5pY2sgQ2xpZnRvbiA8bmlja2NAY3lnbnVzLmNvbQotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRpbnNucyk6IEFkZCAiYmFsIiBpbnN0cnVjdGlvbiBwYXR0ZXJuLgotCi0yMDAwLTAzLTI4ICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JKiBsaXN0aW5nLmMgKExJU1RJTkdfTEhTX1dJRFRIKTogRGVmYXVsdCBkZXBlbmRzIG9uCi0JTElTVElOR19XT1JEX1NJWkUuCi0JKExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORCk6IERlZmF1bHQgdG8gTElTVElOR19MSFNfV0lEVEguCi0KLTIwMDAtMDMtMjcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfc2hvd191c2FnZSk6IFVzZSBiYWNrc2xhc2ggYmVmb3JlIG5ld2xpbmUgaW4KLQlzdHJpbmcgbGl0ZXJhbC4KLQotMjAwMC0wMy0yNyAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogY29uZmlnL3RjLWF2ci5oIChUQ19IQU5ETEVTX0ZYX0RPTkUpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1hdnIuYyAobWN1X3R5cGVzKTogQWRkIG1pc3NpbmcgaW5pdGlhbGlzZXIuCi0JKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IEFkZCBwcm90b3R5cGUuCi0JKGF2cl9vcGVyYW5kKTogUmVtb3ZlIHJlZHVuZGFudCB0ZXN0IG9mIHVuc2lnbmVkIDwgMC4KLQkoYXZyX2NvbnNfZml4X25ldyk6IEVuc3VyZSBleHBfbW9kX3BtIHplcm8gb24gZnVuY3Rpb24gZXhpdC4KLQotMjAwMC0wMy0yNyAgRGVuaXMgQ2hlcnR5a292ICA8ZGVuaXNjQG92ZXJ0YS5ydT4KLQotCSogY29uZmlnL3RjLWF2ci5jOiBOZXcgZmlsZSBmb3IgQVZSIHN1cHBvcnQuCi0JKiBjb25maWcvdGMtYXZyLmg6IExpa2V3aXNlLgotCSogY29uZmlndXJlLmluOiBBZGQgQVZSIHN1cHBvcnQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTIwMDAtMDMtMjYgIFRpbW90aHkgV2FsbCA8dHdhbGxAY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChtYWNyb19vcCk6IEFkZCBuZXcgYXJndW1lbnQgdG8gY2hlY2tfbWFjcm8gY2FsbC4KLQlNYWNybyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgbW92ZWQgdG8gbWFjcm8uaAotCSogc2IuaDogIEFkZCBhcmd1bWVudCB0byBwcm90b3R5cGUgZm9yIGlucHV0X3NjcnViX2luY2x1ZGVfc2IuCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiKTogQWxsb3cgZGlzYWJsaW5nIG9mIHNiCi0JbmVzdGluZyBjaGVja3Mgd2l0aCBhbiBhZGRpdGlvbmFsIGZsYWcuCi0JKHN0cnVjdCBpbnB1dF9zYXZlKTogQWRkIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjdXJyZW50IHNiCi0Jc2hvdWxkIGJlIGNoZWNrZWQgZm9yIHByb3BlciBtYWNyby9jb25kaXRpb25hbCBuZXN0aW5nLgotCShpbnB1dF9zY3J1Yl9wdXNoL3BvcCk6IFNhdmUvcmVzdG9yZSBuZXN0IGNoZWNrIGZsYWcuCi0JKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogRGl0dG8uICBBbHNvIGNhbGwgZW5kIG9mIG1hY3JvIGhvb2sgaWYKLQlkZWZpbmVkLiAKLQkqIG1hY3JvLmMgKGNoZWNrX21hY3JvKTogIEFsbG93IGNhbGxlciB0byByZXRyaWV2ZSBwYXJzZWQgbWFjcm8KLQlpbmZvcm1hdGlvbiBpZiBhIHBvaW50ZXIgaXMgcHJvdmlkZWQuICBUaGlzIGluZm9ybWF0aW9uIG1heSBiZQotCXVzZWQgYnkgdGhlIG5ldyBtYWNybyBob29rcy4KLQkqIG1hY3JvLmg6IFVwZGF0ZSBwcm90b3R5cGUgZm9yIGNoZWNrX21hY3JvLiAgTWFjcm8gc3RydWN0Ci0JZGVmaW5pdGlvbnMgbW92ZWQgaGVyZSBmcm9tIG1hY3JvLmMvZ2FzcC5jLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBBZGQgcGFyYW1ldGVyIHRvIGNoZWNrX21hY3JvIGNhbGwsCi0JYW5kIHBhc3MgbWFjcm8gaW5mbyB0byB0aGUgbWFjcm8gaG9vaywgaWYgZGVmaW5lZC4KLQkoaW5wdXRfc2NydWJfaW5zZXJ0X2xpbmUpOiBOZXcuICBBbGxvdyBpbnNlcnRpb24gb2YgYSBsaW5lIG9mCi0JY2hhcmFjdGVycyBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0JKGlucHV0X3NjcnViX2luc2VydF9maWxlKTogTmV3LiAgQWxsb3cgaW5zZXJ0aW9uIG9mIGFuIGFyYml0cmFyeQotCWZpbGUgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotCShzX2luY2x1ZGUpOiBVc2UgaW5wdXRfc2NydWJfaW5zZXJ0X2ZpbGUuCi0JKiBpbnRlcm5hbHMudGV4aTogRG9jdW1lbnQgbmV3IG1hY3JvIGhvb2tzLgotCSogYXMuaDogTmV3IHByb3RvdHlwZXMgYWRkZWQuCi0JCi0yMDAwLTAzLTI2ICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tLmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBEb24ndCBzdGFydCBhbnkgYXNfYmFkIG9yIGFzX3dhcm4gbWVzc2FnZSB3aXRoCi0JYW4gaW5pdGlhbCBjYXBpdGFsIGxldHRlci4KLQkoaTM4Nl9pbmRleF9jaGVjayk6IFJlaW5kZW50LgotCi0yMDAwLTAzLTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggYnVnIGRldGVjdG5nIG92ZXJmbG93IG9mIHBjCi0JcmVsYXRpdmUgYnJhbmNoZXMuCi0KLTIwMDAtMDMtMTcgVGhvbWFzIGRlIExlbGxpcyA8dGRlbEB3aW5kcml2ZXIuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jIChkb190X2Fkcik6IEZsYWcgImFkciBSZCxsYWJlbCIKLSAgICAgICAgaW5zdHJ1Y3Rpb24gb3BlcmFuZCBiYWQgaWYgUmQgPiA3IHdoZW4gZ2VuZXJhdGluZwotICAgICAgICB0aHVtYiBpbnN0cnVjdGlvbnMuIFByZXZlbnRzIGZvciBleGFtcGxlLAotICAgICAgICAiYWRyIHIxMixsYWJlbCIgZnJvbSBzaWxlbnRseSBmYWlsaW5nIGFuZCBnZW5lcmF0aW5nCi0gICAgICAgIHRoZSB3cm9uZyBpbnN0cnVjdGlvbi4KLSAgICAgICAgCi0yMDAwLTAzLTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgc2FtZS1zZWN0aW9uIHJlbG9jYXRpb25zCi0JdGhhdCBoYXZlIGEgZGVzdGluZ2F0aW9uID49IDB4NDAwMDAwLgotCUZpeCBjb21waWxlIHRpbWUgd2FybmluZyBtZXNzYWdlcy4gCi0KLVRodSBNYXIgMTYgMjM6NDU6MTYgMjAwMCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBXaGVuIGVuY291bnRlcmluZyBpbnNuIHRoYXQgYXJlCi0Jbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBhcmNoLCBvbmx5IGNoYW5nZSB0aGUgbmFtZSBpZgotCWl0cyBjb250ZW50cyBhcmUgdGhlIHNhbWUgYXMgcHJldl9uYW1lLgotCShnZXRfc3BlY2lmaWMpOiBJZiB0aGUgdGhlIGFyY2hpdGVjdHVyZSBkb2Vzbid0IG1hdGNoLCBmYWlsLgotCi1UaHUgTWFyIDE2IDIxOjE4OjEzIDIwMDAgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLXNoLmMgKElERU5UX0NIQVIpOiBEZWZpbmUuCi0JKHBhcnNlX3JlZyk6IFVzZSBpdCBpbnN0ZWFkIG9mIGlzYWxudW0uICBQdXQgclswLi43XV9iYW5rIG9wZXJhbmQKLQltYXRjaGluZyBiYWNrIHdoZXJlIGl0IGNhbWUgZnJvbS4KLQotVGh1IE1hciAxNiAyMDo1ODoxMCAyMDAwICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9zaG93X3VzYWdlKTogQWRkIGRlc2NyaXB0aW9uIG9mIC1kc3AuCi0KLTIwMDAtMDMtMTUgIEpvbmF0aGFuIExhcm1vdXIgIDxqbGFybW91ckByZWRoYXQuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9yZWcpOiBNYXRjaCByWzAuLjddX2Jhbmsgb3BlcmFuZHMgYmVmb3JlCi0Jbm9ybWFsIG9wZXJhbmRzLgotCi0yMDAwLTAzLTE1ICBLYXp1IEhpcmF0YSAgPGthenVAaHhpLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmM6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIGFzIGFwcHJvcHJpYXRlLgotCi1Nb24gTWFyIDEzIDIyOjAyOjU5IDIwMDAgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuc2U+Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCkgW2Nhc2UgJ2YnXTogV2hlbiB0ZXN0aW5nIGlmICcwZicgY2FuIHN0YXJ0IGEKLQlmbG9hdGluZy1wb2ludC1udW1iZXIsIG1ha2Ugc3VyZSAnZicgaXMgaW4gRkxUX0NIQVJTLgotCi1TYXQgTWFyIDExIDAwOjAxOjM5IDIwMDAgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuc2U+Ci0KLQkqIHJlYWQuYyAoVENfSU1QTElDSVRfTENPTU1fQUxJR05NRU5UKTogTmV3IGRlZmF1bHQtZGVmaW5pdGlvbi4KLQkoc19sY29tbV9pbnRlcm5hbCk6IFVzZSBpdC4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBEb2N1bWVudCBpdC4KLQkqIGNvbmZpZy9vYmotZXZheC5oIChUQ19JTVBMSUNJVF9MQ09NTV9BTElHTk1FTlQpOiBTZXQgdG8gMioqMwotCWJ5dGVzLgotCi0yMDAwLTAzLTEwICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCBwdXQgc3R1ZmYgaW4gLnJvZGF0YQotCXdoZW4gZW1iZWRkZWQtcGljLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChTV0lUQ0hfVEFCTEUpOiBUaGUgRUxGIGVtYmVkZGVkLXBpYwotIAlpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGhhdmUgc3BlY2lhbCBoYW5kbGluZyBmb3Igc3dpdGNoCi0gCXN0YXRlbWVudHMuCi0JKG1hY3JvX2J1aWxkKTogQWxsb3cgZm9yIGNvZGUgaW4gc2VjdGlvbnMgb3RoZXIgdGhhbiAudGV4dC4KLQkobWFjcm8pOiBMaWtld2lzZS4KLQkobWlwc19pcCk6IExpa2V3aXNlLgotCShtZF9hcHBseV9maXgpOiBEbyBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIG1hZG5lc3MgZm9yIE1JUFMgRUxGLgotICAJRG9uJ3QgcGVyZm9ybSByZWxvY3MgaWYgd2Ugd2lsbCBiZSBvdXRwdXR0aW5nIHRoZW0uCi0JKHRjX2dlbl9yZWxvYyk6IEZvciBFTEYsIGp1c3QgdXNlIGZ4X2FkZG51bWJlciBmb3IgcGMtcmVsYXRpdmUKLSAJcmVsb2NhdGlvbnMuICBBbGxvdyBCRkRfUkVMT0NfMTZfUENSRUxfUzIgcmVsb2NzIHdoZW4KLSAJZW1iZWRkZWQtcGljLgotCi0yMDAwLTAzLTA5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2ZpeF9hZGp1c3RhYmxlKTogIExvb2sgdXAgdGhlCi0gICAgICAgIHJlbG9jYXRpb24gdHlwZSBiYXNlZCBvbiB0aGUgZW50cnkgaW4gdGhlIGZpeHVwIHN0cnVjdHVyZS4KLQotMjAwMC0wMy0wOCAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLXRvb2xkaXIpOiBEZXBlbmQgb24KLQlpbnN0YWxsLWV4ZWMtYmluZGlyIGZvciBwYXJhbGxlbCBtYWtlLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi0yMDAwLTAzLTA2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChzdHJ1Y3QgbWRfbG9uZ29wdHMpOiBBZGQgLW0zMnIgY29tbWFuZCBsaW5lCi0Jc3dpdGNoLgotCShtZF9wYXJzZV9vcHRpb24pOiBQYXJzZSAtbTMyciBjb21tYW5kIGxpbmUgc3dpdGNoIC0gZGlzYWJsZSBtMzJyeAotCWNvbXBhdGFiaWxpdHkuCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCBuZXcgb3B0aW9uLgotCi0JKiBkb2MvTWFrZWZpbGUuYW0gKENQVV9ET0NTKTogQWRkIGMtbTMyci50ZXhpLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogZG9jL2MtbTMyci50ZXhpIChNMzJSLU9wdHMpOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaC4KLQotMjAwMC0wMy0wMiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGNoZWNrX3JhbmdlKTogUmVtb3ZlIGNvZGUgdGhhdCBpbmNvcnJlY3RseQotCXNpZ24gZXh0ZW5kZWQgdmFsdWVzIHdoZXJlIGJpdHMgPCAzMi4KLQotMjAwMC0wMy0wMiAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQotCi0JKiBjb25maWd1cmUuaW46IFN1cHBvcnQgLS1lbmFibGUtdGFyZ2V0cz1hbGwgb24gaWEzMi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLTIwMDAtMDMtMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAoZG9fYWxpZ24pOiBSZW1vdmUgYm9ndXMgY2hlY2sgb2YgYWxpZ25tZW50IHZhbHVlLgotCi0yMDAwLTAyLTI3ICBUaG9tYXMgZGUgTGVsbGlzICA8dGRlbEB3aW5kcml2ZXIuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBSZW1vdmUgY29kZSB3aGljaCB3aGVuCi0JVENfUFBDIHdhcyBkZWZpbmVkIGZvcmNlZCB0aGUgdHlwZSBvZiBhIHN5bWJvbCB3aXRoIG5vIG90aGVyIHR5cGUKLQl0byBiZSBCU0ZfT0JKRUNULgotCi0yMDAwLTAyLTI3ICBIYW5zLVBldGVyIE5pbHNzb24gIDxocEBheGlzLmNvbT4KLQotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IE1lbnRpb24gdGhhdAotCWxpbmVfc2VwYXJhdG9yX2NoYXJzIGRvIG5vdCBicmVhayB1cCBjb21tZW50cy4gIEZpeCB0eXBvcyBmb3IKLQlMRVhfQVQgYW5kIExFWF9OQU1FIGRlc2NyaXB0aW9ucy4gIERvY3VtZW50IG9wZXJhbmRzIGZvcgotCVRDX0VRVUFMX0lOX0lOU04sIG1kX29wZXJhbmQgYW5kIG1kX3NlY3Rpb25fYWxpZ24uICBDb3JyZWN0Ci0JZGVzY3JpcHRpb24gb2YgbWRfY3JlYXRlX3Nob3J0X2p1bXAgdXNhZ2UuICBEb2N1bWVudCBhcmd1bWVudCBmb3IKLQltZF91bmRlZmluZWRfc3ltYm9sLgotCi0yMDAwLTAyLTI3ICBKYWt1YiBKZWxpbmVrICA8amFrdWJAcmVkaGF0LmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKE9QVElPTl9VTkRFQ0xBUkVEX1JFR1MpOiBOZXcgb3B0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgaXQuCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCBpdC4KLQotMjAwMC0wMi0yNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9hc3NlbWJsZSk6IEFjY2VwdCBgMScgYW5kIGA5JyBpbiBhbgotCW9wY29kZSwgZm9yIHRoZSBpbnN0cnVjdGlvbiBgcGFsMTknLiAgRnJvbSBBbmRyZWEgQXJjYW5nZWxpCi0JPGFuZHJlYUBzdXNlLmRlPi4KLQotMjAwMC0wMi0yNiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ltbWVkaWF0ZSk6IE1vdmUgY29uc3RhbnQgb3BlcmFuZCBzaXppbmcKLQlmcm9tIGhlcmUuLgotCShtZF9hc3NlbWJsZSk6IFRvIGhlcmUsIGJlZm9yZSB0ZW1wbGF0ZSBvcGVyYW5kcyBhcmUgbWF0Y2hlZC4KLQlBbHNvIGVuc3VyZSBhIGNvbnN0YW50IGltbWVkaWF0ZSBpcyBzaWduIGV4dGVuZGVkIHdoZW4gd2Uga25vdyB0aGUKLQlzaXplIGlzIGF0IG1vc3QgMTYgYml0cy4gIFRoaXMgaXMgdG8gY2F0Y2ggY2FzZXMgbGlrZSAiYWRkCi0JJDB4ZmZjMCwlYXgiIHdoZXJlIHdlIGRvbid0IGtub3cgdGhlIHNpemUsIGFuZCB0aHVzIHRoYXQgdGhlCi0JaW1tZWRpYXRlIGNhbiBiZSByZXByZXNlbnRlZCBhcyBJbW04UyB1bnRpbCBhZnRlciBwYXJzaW5nIHRoZQotCXJlZ2lzdGVyIG9wZXJhbmQuCi0JKGkzODZfZGlzcGxhY2VtZW50KTogU2ltaWxhcmx5IHNpZ24gZXh0ZW5kIDE2IGJpdCBjb25zdGFudAotCWRpc3BsYWNlbWVudHMuCi0JKG1kX2Fzc2VtYmxlKTogUmVsYXggMTYtYml0IGp1bXAgY29uc3RhbnQgcmFuZ2UgY2hlY2sgdG8gc3VpdCBzaWduCi0JZXh0ZW5kZWQgZGlzcGxhY2VtZW50cy4KLQotMjAwMC0wMi0yNiAgQW5kcmVhcyBKYWVnZXIgIDxhakBzdXNlLmRlPgotCi0JKiBkb2MvYy1taXBzLnRleGkgKE1JUFMgT3B0cyk6IEZpeCB0eXBvIGluIGxhc3QgcGF0Y2guCi0KLTIwMDAtMDItMjUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBzd2FwIGludGVyc2VnbWVudCBqbXAgYW5kCi0JY2FsbCBvcGVyYW5kcyB3aGVuIGludGVsX3N5bnRheC4KLQkoaW50ZWxfZmxvYXRfb3BlcmFuZCk6IFJldHVybiAyIGZvciAiZmkuLi4iLgotCShpMzg2X29wZXJhbmRfbW9kaWZpZXIpOiBDaGFuZ2UgIkRXT1JEIFBUUiIgdGVzdCB0byBzdWl0IGFib3ZlLgotCVJldHVybiBTSE9SVF9NTkVNX1NVRkZJWCBmb3IgIldPUkQgUFRSIiB3aGVuICJmaS4uLiIuICBSZXZlcnQKLQllYXJsaWVyICJTSE9SVCIgY2hhbmdlLgotCShtZF9hc3NlbWJsZSk6IFdoZW4gZGV0ZXJtaW5pbmcgc3VmZml4IGZyb20gUmVncywgZXhjbHVkZQotCUluT3V0UG9ydFJlZy4KLQotMjAwMC0wMi0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBBZGQgYXJtLXdpbmNlLCBtaXBzLXBlIGFuZCBzaC1wZSB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoQ09GRl9XSVRIX1BFKTogRGVmaW5lIGZvciBtaXBzLXBlIGFuZAotCXNoLXBlIHRhcmdldHMuCi0JKFRBUkdFVF9GT1JNQVQpOiBTZXQgdG8gInBlLXNobCIgZm9yIHRoZSBzaC1wZSB0YXJnZXQgYW5kIHRvCi0JInBlLW1pcHMiIGZvciB0aGUgbWlwcy1wZSB0YXJnZXQuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoaW5zbnMpOiBDaGFuZ2UgZGlzcGxhY2VtZW50IGVuY29kZWQgaW4gQkwKLQlhbmQgQiBpbnN0cnVjdGlvbnMgaWYgdGhlIHRhcmdldCBwb3J0IGlzIGFybS13aW5jZS4KLQkoZG9fbGRzdCk6IERvIG5vdCBiaWFzIHRoZSByZWxvY2F0aW9uIG9mZnNldCBpZiB0aGUgdGFyZ2V0Ci0JcG9ydCBpcyBhcm0td2luY2UuCi0JKG1kX3BjcmVsX2Zyb20pOiBBZGQgaW4gbWlzc2luZyByZWxvY2F0aW9uIG9mZnNldCBiaWFzIGlmIHRoZQotCXRhcmdldCBvcyBhcm0td2luY2UuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IFN1cHBvcnQgQ09GRiBmbGF2b3VyLgotCShtZF9iZWdpbik6IERpc2FibGUgLUcgc3VwcG9ydCBmb3IgbWlwcy1wZSB0YXJnZXQuCi0JKG1kX2FwcGx5X2ZpeCk6IFRyZWF0IEJGRF9SRUxPQ19SVkEgcmVsb2MgYXMgQkZEX1JFTE9DXzMyLgotCSogY29uZmlnL3RjLW1pcHMuaCAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCk6IEFkZCBzdXBwb3J0IGZvcgotCUNPRkYgZmxhdm91ci4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogc2gtcGUgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4uCi0JKiBjb25maWcvdGMtc2guaCAoU1VCX1NFR01FTlRfQUxJR04pOiBJZiB1c2luZyBhIEJGRAotCWFzc2VtYmxlciwganVzdCBzZXQgdGhlIGFsaWdubWVudCB0byA0LgotCi0JKiBjb25maWcvdGUtd2luY2UtcGUuaDogTmV3IGZpbGUgZm9yIFdpbkNFIHRhcmdldHMuICBEZWZpbmUKLQlURV9XSU5DRS4KLQotMjAwMC0wMi0yNSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFN3YXAgc2VnbWVudHMgdG9vIGZvciBpbnRlbCBtb2RlCi0Jc3RyaW5nIGluc3RydWN0aW9ucy4KLQkoaTM4Nl9vcGVyYW5kX21vZGlmaWVyKTogU2V0IGkuc3VmZml4ID0gV09SRF9NTkVNX1NVRkZJWCBmb3IgU0hPUlQuCi0JKGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQpOiBBZnRlciBmaW5kaW5nIGEgc2VnbWVudCBvdmVycmlkZSwKLQljaGVjayBhZ2FpbiBmb3Igbm8gYFsnIGJlZm9yZSBsb29raW5nIGZvciBhIGRpc3BsYWNlbWVudC4gIEJvbWIgaWYKLQltb3JlIHRoYW4gb25lIGRpc3BsYWNlbWVudCByYXRoZXIgdGhhbiBzaWxlbnRseSBkaXNjYXJkaW5nIHRoZQotCXNlY29uZCBhbmQgc3Vic2VxdWVudCBvbmVzLiAgRnJlZSBzdHJpbmdzIG1hbGxvYydkIGJ5Ci0JYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZy4KLQotMjAwMC0wMi0yNCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgIndlYWsiLgotCShvYmpfc29tX3dlYWspOiBOZXcgcm91dGluZS4KLQotMjAwMC0wMi0yNCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh1bmlvbiBpMzg2X29wKTogTmV3LgotCShzdHJ1Y3QgX2kzODZfaW5zbik6IERlbGV0ZSBkaXNwc1tdLCBpbW1zW10sIHJlZ3NbXS4gIEFkZCBvcFtdLgotCVRocm91Z2hvdXQgZmlsZSByZXBsYWNlIG9jY3VyZW5jZXMgb2YgZGlzcHNbbl0sIGltbXNbbl0sIHJlZ3Nbbl0KLQl3aXRoIGVxdWl2YWxlbnQgb3Bbbl0uZGlzcHMsIG9wW25dLmltbXMsIG9wW25dLnJlZ3MuICBTaW1wbGlmeQotCWludGVsIG1vZGUgb3BlcmFuZCBzd2FwcGluZy4gIEFkZCBhc3NlcnQgaW4gcmVnS2x1ZGdlIGFuZAotCWZha2VfemVyb19kaXNwbGFjZW1lbnQgY29kZS4gIFRlc3QgaS50eXBlc1tuXSB3aGVuIG91dHB1dHRpbmcKLQlkaXNwbGFjZW1lbnRzIGFuZCBpbW1lZGlhdGVzLiAgQ29tYmluZSBvdXRwdXQgb2YgRGlzcDE2IHdpdGgKLQlEaXNwMzIuCi0JKG1kX2Fzc2VtYmxlKTogRG9uJ3QgdHJ5IHRvIGZpeCBicm9rZW4gVU5JWFdBUkVfQ09NUEFUIG9wY29kZXMKLQl3aGVuIGluIGludGVsIG1vZGUgYnkgKG5vdCkgcmV2ZXJzaW5nIGZzdWIgYW5kIGZkaXYgb3BlcmFuZHMKLQliZWZvcmUgdGhlIHRlbXBsYXRlIHNlYXJjaC4gIFRoaXMgZmFpbHMgZm9yIHNpbmdsZSBvcGVyYW5kCi0Jc2hvcnRoYW5kIGZvcm1zIG9mIHRoZSBpbnN0cnVjdGlvbiwgYW5kIGlmIFVOSVhXQVJFX0NPTVBBVCBpcwotCXVuZGVmaW5lZC4gIEluc3RlYWQgZml4IHRoZSBiYXNlX29wY29kZSBhZnRlciB3ZSd2ZSBmb3VuZCB0aGUKLQl0ZW1wbGF0ZS4gIE1vdmUgYmFzZV9vcGNvZGUgeG9yIHdpdGggZm91bmRfcmV2ZXJzZV9tYXRjaCBmcm9tCi0Jb3Bjb2RlIG91dHB1dCBjb2RlIHRvIGJlZm9yZSB0aGlzIGZpeCBzbyB3ZSB0ZXN0IGZvciB0aGUgY29ycmVjdAotCW9wY29kZXMuCi0JKG1kX2Fzc2VtYmxlKTogRG9uJ3QgdXNlIHN0cmNtcCB3aGVuIGRlY2lkaW5nIHRvIGlnbm9yZSB0aGUgc3VmZml4Ci0JY2hlY2sgaW4gaW50ZWwgbW9kZS4gIEluc3RlYWQgY29tcGFyZSBvcGNvZGVzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19SRUxPQyk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFRDX1JFTE9DKTogRGVsZXRlLiAgUmVwbGFjZSB1c2FnZSBvZiBUQ19SRUxPQwotCXdpdGggZXF1aXZhbGVudCBjYWxsIHRvIHJlbG9jLgotCi0JKiBhcy5oIChmbGFnX202OGtfbXJpKTogTW92ZSBkZWNsYXJhdGlvbiBhZnRlciB0YXJnZXQgaW5jbHVkZSwgYW5kCi0Jb25seSBkZWNsYXJlIHdoZW4gVENfTTY4SyBkZWZpbmVkLiAgRGVmaW5lIGFzIHplcm8gb3RoZXJ3aXNlLgotCShMQUJFTFNfV0lUSE9VVF9DT0xPTlMsIE5PX1BTRVVET19ET1QpOiBJZiB1bmRlZmluZWQsIGRlZmluZSBhcyAwLgotCSogYXBwLmMgKHNjcnViX202OGtfbXJpKTogRGVjbGFyZSBvbmx5IHdoZW4gVENfTTY4SyBkZWZpbmVkLgotCURlZmluZSBhcyB6ZXJvIG90aGVyd2lzZS4KLQkoZG9fc2NydWJfYmVnaW4pOiBVc2UgbTY4a19tcmkgcGFyYW1ldGVyIG9ubHkgd2hlbiBUQ19NNjhLIGRlZmluZWQuCi0JKHN0cnVjdCBhcHBfc2F2ZSk6IERlY2xhcmUgc2NydWJfbTY4a19tcmkgb25seSB3aGVuIFRDX002OEsuCi0JKGFwcF9wdXNoLCBhcHBfcG9wKTogU2F2ZSBzY3J1Yl9tNjhrX21yaSBvbmx5IHdoZW4gVENfTTY4Sy4KLQkoZG9fc2NydWJfY2hhcnMpOiBVc2UgTEFCRUxTX1dJVEhPVVRfQ09MT05TIGRpcmVjdGx5IHJhdGhlciB0aGFuCi0JdGVzdGluZyB3aGV0aGVyIGRlZmluZWQuCi0JKiBjb25kLmMgKGlnbm9yZV9pbnB1dCk6IFVzZSBOT19QU0VVRE9fRE9UIGRpcmVjdGx5LgotCSogZXhwci5jIChvcGVyYW5kKTogI2lmZGVmIHVudXNlZCBjYXNlIGxhYmVscyB3aGVuIFRDX002OEsgdW5kZWZpbmVkLgotCSogcmVhZC5jOiBVc2UgTEFCRUxTX1dJVEhPVVRfQ09MT05TIGFuZCBOT19QU0VVRE9fRE9UIGRpcmVjdGx5Ci0JcmF0aGVyIHRoYW4gdGVzdGluZyB3aGV0aGVyIGRlZmluZWQuCi0JKHNfbXJpKTogU2V0IGZsYWdfbTY4a19tcmkgb25seSB3aGVuIFRDX002OEsgZGVmaW5lZC4KLQkocGFyc2VfbXJpX2NvbnMpOiBEZWNsYXJlIGFuZCB1c2Ugb25seSB3aGVuIFRDX002OEsuCi0JKiBjb25maWcvdGMtaHBwYS5oIChMQUJFTFNfV0lUSE9VVF9DT0xPTlMpOiBEZWZpbmUgYXMgMS4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKE5PX1BTRVVET19ET1QpOiBEZWZpbmUgYXMgMS4KLQkqIGNvbmZpZy90Yy1tODhrLmggKE5PX1BTRVVET19ET1QpOiBEZWZpbmUgYXMgMS4KLQotCSogTkVXUzogTWVudGlvbiBJQk0gMzcwIHN1cHBvcnQuCi0KLTIwMDAtMDItMjMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogV2hlbiBzd2FwcGluZyBvcGVyYW5kcyBmb3IKLQlpbnRlbF9zeW50YXgsIGFzc3VtZSBldmVyeXRoaW5nIHRoYXQncyBub3QgSW1tIG9yIERpc3AgaXMgYQotCXJlZ2lzdGVyLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIGNvbmZpZy90Yy1pMzcwLmMsIGNvbmZpZy90Yy1pMzcwLmg6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTGludXgvSUJNIDM3MC4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBEb24ndCBsZXggc2luZ2xlIHF1b3RlIHdoZW4gVENfSTM3MC4KLQkqIGNvbmZpZy9vYmotZWxmLmM6IEluY2x1ZGUgZWxmL2kzNzAuaAotCShvYmpfZWxmX3NlY3Rpb24pOiBEb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciBmbGFnX21yaSBpZiBUQ19JMzcwLgotCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogZG9jL2MtaTM3MC50ZXhpOiBOZXcgZmlsZS4KLQkqIGRvYy9hbGwudGV4aTogSW5jbHVkZSBpdC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBBbmQgaGVyZS4KLQkqIGRvYy9NYWtlZmlsZS5hbShDUFVfRE9DUyk6IEFkZCBjLWkzNzAudGV4aS4gCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLTIwMDAtMDItMTkgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckByZWRoYXQuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IFVzZSBGTEFHX05PVF9XSVRIX0FERFNVQnBwcCB0bwotCWRldGVybWluZSBpZiBhbiBpbnN0cnVjdGlvbiBjYW4gYmUgdXNlZCBpbiBwYXJhbGxlbCB3aXRoIGFuIEFERHBwcAotCW9yIFNVQnBwcCBpbnN0cnVjdGlvbi4KLQotMjAwMC0wMi0yMiAgQW5kcmV3IEhhbGV5ICA8YXBoQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW1pcHMudGV4aSAoTUlQUyBPcHRzKTogRG9jdW1lbnQgLW1ncDMyIGFuZCAtbWdwNjQuCi0KLTE5OTktMTItMzAgIEFuZHJldyBIYWxleSAgPGFwaEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2dwMzIpOiBOZXcgdmFyaWFibGUuCi0JKG1hY3JvX2J1aWxkKSBVc2UgbWlwc19ncDMyLgotCShtaXBzX2lwKTogRGl0dG8uCi0JKG1kX2xvbmdvcHRzKTogQWRkICItbWdwMzIiIGFuZCAiLW1ncDY0Ii4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIE9QVElPTl9HUDMyIGFuZCBPUFRJT05fR1A2NC4KLQkKLTIwMDAtMDItMjIgIEFsZXhhbmRyZSBPbGl2YSAgPG9saXZhQGxzZC5pYy51bmljYW1wLmJyPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoYWRkX2xpbmVubyk6IEFjY2VwdCBub24tcG9zaXRpdmUgbGluZW5vIHdpdGgKLQl3YXJuaW5nLCBhbmQgYnVtcCBpdCB0byAxLgotCi0yMDAwLTAyLTIyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gQnJhZCBMdWNpZXIgPGx1Y2llckBtYXRoLnB1cmR1ZS5lZHU+OgotCSogZHdhcmYyZGJnLmMgKHByaW50X3N0YXRzKTogQWRkIGNhc3QgdG8gZm9yY2UgcHJpbnRmIGFyZ3VtZW50IHRvCi0JbWF0Y2ggZm9ybWF0LgotCi0yMDAwLTAyLTIxICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoTUZfSElMT19JTlNOKTogRGVmaW5lLgotCShtaXBzXzcwMDBfaGlsb19maXgpOiBEZWNsYXJlLgotCShhcHBlbmRfaW5zbik6IENvbmRpdGlvbmFsbHkgaW5zZXJ0IG5vcHMgYWZ0ZXIgYW4gbWZoaS9tZmxvIGluc24uCi0JKG1kX3BhcnNlX29wdGlvbik6IENoZWNrIGZvciA3MDAwX0hJTE9fRklYIG9wdGlvbnMuCi0JKE9QVElPTl9NNzAwMF9ISUxPX0ZJWCk6IERlZmluZS4KLQkoT1BUSU9OX05PX003MDAwX0hJTE9fRklYKTogRGVmaW5lLgotCSogZG9jL2MtbWlwcy50ZXhpICgtbWZpeDcwMDApOiBEZXNjcmliZS4KLQotMjAwMC0wMi0yMSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBsaXN0aW5nLmMgKHByaW50X2xpbmVzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgZW5kJy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBVc2UgYHJlbG9jKCknIHRvIHNlbGVjdCByZWxvYwotCXR5cGUgZm9yIEp1bXBJbnRlclNlZ21lbnQgb3V0cHV0LiBVc2UgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGZvcgotCXJlbG9jX3R5cGUgd2hlbiBCRkRfQVNTRU1CTEVSLiAKLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBVc2UgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGZvcgotCXJlbG9jX3R5cGUgd2hlbiBCRkRfQVNTRU1CTEVSLiBNb3ZlIGNvbW1vbiBjb2RlIG91dCBvZiBzd2l0Y2gKLQlzdGF0ZW1lbnQgYW5kIHF1ZWxsIHNpZ25lZCB2cy4gdW5zaWduZWQgY29tcGFyaXNvbiB3YXJuaW5nLiAKLQotMjAwMC0wMi0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBBZGQgYSBzeW1ib2wncyB2YWx1ZSB0bwotCXRoZSBjb21wdXRlZCBmcmFnIG9mZnNldCwgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcgaXQuCi0KLVRodSBGZWIgMTcgMDA6MTE6MDggMjAwMCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtc2guYyAoImVsZi9zaC5oIik6IEluY2x1ZGUuCi0JKHNoX2RzcCwgdmFsaWRfYXJjaCwgcmVnX3gsIHJlZ195LCByZWdfZWZnKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1kLmJlZ2luKTogSW5pdGlhbGl6ZSB0YXJnZXRfYXJjaC4KLQlPbmx5IGluY2x1ZGUgb3Bjb2RlcyBpbiBoYXMgdGFibGUgdGhhdCBtYXRjaCBzZWxlY3RlZCBhcmNoaXRlY3R1cmUuCi0JKHBhcnNlX3JlZyk6IFJlY29nbml6ZSByZWdpc3RlciBuYW1lcyBmb3Igc2gtZHNwLgotCShwYXJzZV9hdCk6IFJlY29nbml6ZSBwb3N0LW1vZGlmeSBhZGRyZXNzaW5nLgotCShnZXRfb3BlcmFuZHMpOiBUaGUgbGVhZGluZyBzcGFjZSBpcyBub3cgb3B0aW9uYWwuCi0JKGdldF9zcGVjaWZpYyk6IFJlbW92ZSBGRFJFR19OIHN1cHBvcnQuICBBZGQgc3VwcG9ydCBmb3Igc2gtZHNwCi0JYXJndW1lbnRzLiAgVXBkYXRlIHZhbGlkX2FyY2guCi0JKGJ1aWxkX015dGVzKTogQWRkIHN1cHBvcnQgZm9yIFNEVF9SRUdfTi4KLQkoZmluZF9jb29rZWRfb3Bjb2RlKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIG1kX2Fzc2VtYmxlLgotCShhc3NlbWJsZV9wcGksIHNoX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9ucy4KLQkobWRfYXNzZW1ibGUpOiBVc2UgZmluZF9jb29rZWRfb3Bjb2RlIGFuZCBhc3NlbWJsZV9wcGkuCi0JKG1kX2xvbmdvcHRzLCBtZF9wYXJzZV9vcHRpb24pOiBOZXcgb3B0aW9uOiAtZHNwLgotCSogY29uZmlnL3RjLXNoLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nKTogRGVmaW5lLgotCShzaF9lbGZfZmluYWxfcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0KLUZyaSBGZWIgMTEgMTQ6MjE6NTEgMjAwMCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBVc2Ugc3Vic2VnX25ldyB0byBjcmVhdGUKLQl0aGUgdW53aW5kZXIgc3Vic3BhY2UuICBTYXZlIHRoZSBjdXJyZW50IHNlZy9zdWJzZWcgYmVmb3JlIGNyZWF0aW5nCi0JdGhlIG5ldyBzZWcvc3Vic2VnLgotCi0yMDAwLTAyLTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAoSU5TVF9CWVRFMCk6IFJlZGVmaW5lIHRvIGhhbmRsZSBiaWcgYW5kCi0gICAgICAgIGxpdHRsZSBlbmRpYW4gdGFyZ2V0cy4KLQkoSU5TVF9CWVRFMSk6IFJlZGVmaW5lIHRvIGhhbmRsZSBiaWcgYW5kIGxpdHRsZSBlbmRpYW4KLSAgICAgICAgdGFyZ2V0cy4KLQkoY3B1X3R5cGUpOiBOZXcgdHlwZTogU2VsZWN0IGJldHdlZW4gTTM0MCBhbmQgTTIxMC4KLQkocGFyc2VfcHNybW9kKTogTmV3IGZ1bmN0aW9uOiBQYXJzZSB0aGUgUFNSQ0xSIGFuZCBQU1JTRVQKLSAgICAgICAgaW5zdHJ1Y3Rpb25zIG9mIHRoZSBNMzQwLgotCShtZF9hc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciB0aGUgTVVMU0ggYW5kIE9QU1IgY2xhc3NlcyBvZgotICAgICAgICBpbnN0cnVjdGlvbnMuCi0JKG1kX2F0b2YpOiBBZGQgc3VwcG9ydCBmb3IgbGl0dGxlIGVuZGlhbiB0YXJnZXRzLgotCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLUVMLCAtRUIgYW5kIC1tY3B1IGNvbW1hbmQKLSAgICAgICAgbGluZSBzd2l0Y2hlcy4KLQkobWRfY29udmVydF9mcmFnKTogQWRkIHN1cHBvcnQgZm9yIGxpdHRsZSBlbmRpYW4gdGFyZ2V0cy4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBzdXBwb3J0IGZvciBsaXR0bGUgZW5kaWFuIHRhcmdldHMuCi0JKG1kX251bWJlcl90b19jaGFycyk6IEFkZCBzdXBwb3J0IGZvciBsaXR0bGUgZW5kaWFuIHRhcmdldHMuCi0KLTIwMDAtMDItMTAgIFRpbW90aHkgV2FsbCAgPHR3YWxsQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgVENfU1RBUlRfTEFCRUxfV0lUSE9VVF9DT0xPTiBpcwotCWRlZmluZWQsIHVzZSBpdCB0byB2ZXJpZnkgdGhlIHN5bWJvbCBqdXN0IHJlYWQgc2hvdWxkIGJlIGEgbGFiZWwuCi0KLTIwMDAtMDItMTAgIFRpbW90aHkgV2FsbCAgPHR3YWxsQHJlZGhhdC5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEhhbmRsZSAifHwiIGZvciBwYXJhbGxlbCBpbnN0cnVjdGlvbnMKLQl3aGVuIERPVUJMRUJBUl9QQVJBTExFTCBpcyBkZWZpbmVkLiAgQXZvaWQgc3RyaXBwaW5nIHdoaXRlc3BhY2UKLQlhcm91bmQgY29sb25zIHdoZW4gS0VFUF9XSElURV9BUk9VTkRfQ09MT04gaXMgZGVmaW5lZC4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBEb2N1bWVudCBET1VCTEVCQVJfUEFSQUxMRUwKLQlhbmQgS0VFUF9XSElURV9BUk9VTkRfQ09MT04uCi0KLTIwMDAtMDItMDggIFRpbW90aHkgV2FsbCAgPHR3YWxsQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWQuYyAoc19yZXB0KTogQ2FsbCBkb19yZXBlYXQsIHdoaWNoIGFic3RyYWN0cyB0aGUgcmVwZWF0Ci0JbG9naWMuIAotCShkb19yZXBlYXQpOiBOZXcuICBBYnN0cmFjdCByZXBlYXQgbG9naWMgc28gdGhhdCBhICJicmVhayIgY2FuIGJlCi0JaW1wbGVtZW50ZWQuIAotCShlbmRfcmVwZWF0KTogTmV3LiAgUHJvdmlkZSBzdXBwb3J0IGZvciBhICJicmVhayIgb3V0IG9mIHRoZQotCXJlcGVhdCBsb29wLgotCSogcmVhZC5oOiBBZGQgcHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucy4KLQkKLTIwMDAtMDItMDggIFRpbW90aHkgV2FsbCAgPHR3YWxsQHJlZGhhdC5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRG9jdW1lbnQgTlVNQkVSU19XSVRIX1NVRkZJWCBtYWNyby4KLQkqIGFzLmg6IFByb3ZpZGUgYSBkZWZhdWx0IE5VTUJFUlNfV0lUSF9TVUZGSVggZGVmaW5pdGlvbiAoemVybykuCi0JKiBleHByLmM6IEhhbmRsZSBudW1iZXJzIHdpdGggc3VmZml4ZXMgaWYgTlVNQkVSU19XSVRIX1NVRkZJWCBpcwotCW5vbi16ZXJvLiAKLQkKLTIwMDAtMDItMDggIFRpbW90aHkgV2FsbCAgPHR3YWxsQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWQuYzogQWRkZWQgZWxzZWlmIHRvIGRpcmVjdGl2ZXMgdGFibGUuCi0JKiByZWFkLmg6IEFkZGVkIHByb3RvdHlwZSBmb3Igc19lbHNlaWYuCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkZWQgZGVzY3JpcHRpb24gZm9yIGVsc2VpZi4KLQkqIGNvbmQuYyAoc19lbHNlaWYpOiBOZXcgZnVuY3Rpb24KLQkKLTIwMDAtMDItMDQgIFRpbW90aHkgV2FsbCAgPHR3YWxsQHJlZGhhdC5jb20+Ci0KLQkqIGxpc3RpbmcuYyAocHJpbnRfbGluZXMpOiBSZW1vdmUgY29uZGl0aW9uYWxzIGNhdXNpbmcgYnVnIGluCi0JbGlzdGluZ3MuIAotCi0yMDAwLTAyLTAzICBUaW1vdGh5IFdhbGwgIDx0d2FsbEBjeWdudXMuY29tPgotCQotCSogYXMuaDogRGVmaW5lIE9DVEVUU19QRVJfQllURSBhbmQgT0NURVRTX1BFUl9CWVRFX1BPV0VSCi0JZGVmYXVsdAl2YWx1ZXMuCi0JKiBmcmFncy5jIChmcmFnX25ldyk6IENhbGN1bGF0ZSBmcl9maXggaW4gb2N0ZXRzCi0JKGZyYWdfbm93X2ZpeCkgUmV0dXJuIG9mZnNldCBhcyB0YXJnZXQgYWRkcmVzcyBvZmZzZXQgKGJ5dGVzKS4KLQkoZnJhZ19ub3dfZml4X29jdGV0cykgTmV3IC0gUmV0dXJuIG9mZnNldCBpbiBvY3RldHMgKDgtYml0Ci0JcXVhbnRpdGllcykuIAotCSogZnJhZ3MuaDogQWRkZWQgcHJvdG90eXBlIGZvciBmcmFnX25vd19maXhfb2N0ZXRzKCkuCi0JRGlzdGluZ3Vpc2ggYmV0d2VlbiBvY3RldHMgYW5kIGJ5dGVzIGluIGZpZWxkIGRlc2NyaXB0aW9ucy4KLQkqIGxpc3RpbmcuYyAoY2FsY19oZXgpOiBBY2NvdW50IGZvciBvY3RldHMgdnMgYnl0ZXMgd2hlbgotCXByaW50aW5nIGFkZHJlc3Nlcy9vZmZzZXRzLgotCShwcmludF9saW5lcykgRGl0dG8uICBBbHNvLCBpZiBMSVNUSU5HX1dPUkRfU0laRSBpcyBub3QgMSwgYW5kCi0JdGFyZ2V0IGlzIGxpdHRsZS1lbmRpYW4sIHByaW50IHRoZSBvY3RldHMgaW4gYSB3b3JkIGluIGJpZy1lbmRpYW4KLQlvcmRlciBzbyB0aGF0IHRoZSBkaXNwbGF5IGxvb2tzIGxpa2UgYSBwcm9wZXIgaGV4YWRlY2ltYWwgbnVtYmVyLAotCWluc3RlYWQgb2YgaGF2aW5nIHRoZSBvY3RldHMgcmV2ZXJzZWQuCi0JKiByZWFkLmMgKGRvX2FsaWduKTogV2hlbiByZWNvcmRpbmcgYWxpZ25tZW50LCBhbGlnbm1lbnQgcG93ZXIKLQlzaG91bGQgYmUgaW4gdGVybXMgb2YgdGFyZ2V0IGJ5dGVzIChtaW5pbXVtIGFkZHJlc3NpYmxlIHVuaXQpCi0JaW5zdGVhZCBvZiBvY3RldHMuCi0JKGRvX29yZykgQ29udmVydCBPUkcgdGFyZ2V0IGFkZHJlc3MgKGJ5dGUpIGFyZ3VtZW50IGludG8gYW4KLQlvY3RldCBvZmZzZXQgd2hlbiBnZW5lcmF0aW5nIGEgdmFyaWFibGUgZnJhZ21lbnQuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogU3ltYm9sIGZpbmFsIHZhbHVlCi0JY29udmVydGVkIHRvIGEgdGFyZ2V0IGFkZHJlc3Mgb2Zmc2V0IChieXRlcykgZnJvbSBpdHMgb2N0ZXQgb2Zmc2V0LgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBTeW1ib2wgdGFyZ2V0IGFkZHJlc3MKLQlvZmZzZXQgKGJ5dGVzKSBpcyBhZGp1c3RlZCBieSB0aGUgZnJhZyBvZmZzZXQgKG9jdGV0cykgY29udmVydGVkCi0JdG8gYnl0ZXMuCi0JKGNvZmZfZnJvYl9zZWN0aW9uKSBTZWN0aW9uIGFsaWdubWVudCBwb3dlciBpcyBpbiB0ZXJtcyBvZiBieXRlczsKLQljb252ZXJ0IGl0IHRvIGFuIG9jdGV0IGFsaWdubWVudCBwb3dlciB3aGVuIGNhbGN1bGF0aW5nIHNpemUgKGFuZAotCXNpemUgbWFzaykgaW4gb2N0ZXRzLiAgRG9uJ3QgbW9kaWZ5IHRoZSBzZWN0aW9uIHNpemUgaW4gb3JkZXIgdG8KLQkiYWxpZ24iIGl0IGZvciBUSSBDT0ZGLCBzaW5jZSB0aGF0IGZvcm1hdCBoYXMgYSBkaWZmZXJlbnQgbWV0aG9kCi0JZm9yIHN0b3JpbmcgYWxpZ25tZW50IGluZm9ybWF0aW9uLgotCQotMjAwMC0wMi0wMSAgVGltb3RoeSBXYWxsICA8dHdhbGxAY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoZ2VuZXJhdGVfYXNtX2ZpbGUpOiBFc2NhcGUgYmFja3NsYXNoZXMgaW4gc3RhYnMgZmlsZQotCWVudHJpZXMsIG1hdGNoaW5nIHRoZSB3YXkgR0NDIGdlbmVyYXRlcyB0aGVtLiAgSWYgbm90IGVzY2FwZWQsIHRoZQotCWZpbGVuYW1lIGlzIGVuY29kZWQgaW5jb3JyZWN0bHkuCi0KLTIwMDAtMDEtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0JKiBjb25maWcvdGMtYXJtLmMgKHJlZ190YWJsZSk6IEFkZCBzdXBwb3J0IGZvciBBVFBDUyByZWdpc3RlcgotCW5hbWluZyBjb252ZW50aW9ucy4KLQotMjAwMC0wMS0zMSAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCQotCSogY29uZmlnL29iai1jb2ZmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogRG9uJ3QgZGVmaW5lIGlmCi0JYWxyZWFkeSBkZWZpbmVkLgotCSogY29uZmlnL3RjLXBwYy5oIFtPQkpfWENPRkZdIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IAotCU5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgbG9vayBhdCB0aGUgZnJhZwotCW9mIGEgc3ltYm9sIHdoZW4gd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXRzIHZhbHVlLgotCi0yMDAwLTAxLTE5ICBDaGFuZHJhIENoYXZ2YSAgIDxjY2hhdnZhQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChtZF9hc3NlbWJsZSk6IEdpdmUgd2FybmluZyBtZXNzYWdlIGlmCi0Jb3BlcmFuZHMgcGFzc2VzIHRvIGluc3RydWN0aW9uIGFyZSBtb3JlIHRoYW4gdGhlIHNwZWMuCi0KLTIwMDAtMDEtMjcgIFRob21hcyBkZSBMZWxsaXMgPHRkZWxAd2luZHJpdmVyLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAoYXJtYWRqdXN0X3N5bXRhYik6IElmIHRoZSBhc3NlbWJsZXIgaXMgaW4KLQlUaHVtYiBtb2RlIGJ1dCB0aGUgbGFiZWwgc2VlbiB3YXMgbm90IGRlY2xhcmVkIGFzICcudGh1bWJfZnVuYycKLQl0aGVuIHNldCB0aGUgU1RfSU5GTyB0eXBlIHRvIFNUVF9BUk1fMTZCSVQgbW9kZS4gICBUaGlzIGFsbG93cwotCWNvcnJlY3QgZGlzYXNzZW1ibHkgb2YgVGh1bWIgY29kZSBib3VuZGVkIGJ5IG5vbiBmdW5jdGlvbiBsYWJlbHMuIAotCi0yMDAwLTAxLTI3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIE1ha2VmaWxlLmFtIChNVUxUSV9DRklMRVMpOiBBZGQgY29uZmlnL2UtaTM4NmFvdXQuYwotCUFkZCBkZXBlbmRlbmNpZXMgZm9yIGUtaTM4NmFvdXQuby4gIEZpeCAyIGNvbW1lbnQgbGluZXMuCi0KLQkqIE1ha2VmaWxlLmluOiBTYW1lIGhlcmUuCi0JVXBkYXRlIGNvcHlyaWdodC4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYmZkX2dhcyBmb3IgaTM4Ni1hb3V0IHdoZW4gcHJpbWFyeSB0YXJnZXQKLQlpcyBiZmQuICBIYW5kbGUgaTM4NmFvdXQgZW11bGF0aW9uLiAgRG9uJ3QgdXNlIHRlX2ZpbGU9bXVsdGksIGFzCi0Jd2UgbWF5IG5lZWQgdGhlIHByaW1hcnkgdGVfZmlsZS4gIFJlbW92ZSBpbmNvcnJlY3QgY29tbWVudC4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWcvZS1pMzg2YW91dC5jOiBOZXcgZmlsZS4KLQotCSogYXMuYyAoVVNFX0VNVUxBVElPTlMpOiBNb3ZlIHRvIGJlZm9yZSBwcmludF92ZXJzaW9uX2lkLgotCShzdHJ1Y3QgZW11bGF0aW9uKTogQWRkIGkzODZhb3V0LgotCShzaG93X3VzYWdlKTogU3BsaXQgdGV4dCBzdHJpbmdzLiAgUmVmb3JtYXQgLWEgdGV4dC4gIEFkZCAtLWVtCi0JaGVscC4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpOiBBZGQgc19nZXRfb3RoZXIgYW5kIHNfZ2V0X2Rlc2MuCi0JKGFvdXRfZm9ybWF0X29wcyk6IE5ldy4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiByZWFkLmMgKHNfbGNvbW1faW50ZXJuYWwpOiBSZXdyaXRlIE9CSl9BT1VULE9CSl9CT1VUCi0JcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFsIGFuZCBhZGQgYW91dCBVU0VfRU1VTEFUSU9OUyB0ZXN0cy4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogRG9uJ3QgcGFzcyBlcnJvciBzdHJpbmdzIHRvIHByaW50ZiBhcwotCWZvcm1hdCBhcmcuCi0JVXBkYXRlIGNvcHlyaWdodC4KLQotCSogZ2FzcC5jIChleHBfZ2V0X2Ficyk6IERvbid0IHBhc3MgZXJyb3Igc3RyaW5ncyB0byBwcmludGYgYXMKLQlmb3JtYXQgYXJnLgotCShkb19kYXRhKTogU2FtZSBoZXJlLgotCShwcm9jZXNzX2ZpbGUpOiBBbmQgaGVyZS4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogUmV3cml0ZSAiYWxyZWFkeSBkZWZpbmVkIiBmYXRhbCBtZXNzYWdlCi0JY29kZSBmb3IgYW91dCB3aXRoIFVTRV9FTVVMQVRJT05TLgotCVVwZGF0ZSBjb3B5cmlnaHQuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChPQkpfSEVBREVSKTogRGVmaW5lLgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVuYW1lIHRvIGFvdXRfcHNldWRvX3RhYmxlLiAgSW5pdCBhbGwKLQlmaWVsZHMgb2Ygc2VudGluZWwuIAotCShvYmpfYW91dF9mcm9iX3N5bWJvbCk6IEV4cGFuZCBTX0dFVF9ERVNDLCBTX0dFVF9UWVBFLAotCVNfR0VUX09USEVSLCBTX1NFVF9UWVBFIG1hY3JvcyBzaW5jZSB3ZSBkb24ndCBuZWVkIG9iai1tdWx0aQotCWZvcm1zIGhlcmUuCi0JKG9ial9hb3V0X3R5cGUpOiBFeHBhbmQgU19TRVRfT1RIRVIgaGVyZSB0b28uCi0JKG9ial9yZWFkX2JlZ2luX2hvb2spOiBSZW1vdmUuCi0JKGFvdXRfcG9wX2luc2VydCk6IE5ldy4KLQkob2JqX2FvdXRfc19nZXRfb3RoZXIpOiBOZXcuCi0JKG9ial9hb3V0X3NfZ2V0X2Rlc2MpOiBOZXcuCi0JKGFvdXRfZm9ybWF0X29wcyk6IE5ldy4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAob2JqX3BvcF9pbnNlcnQpOiBEZWZpbmUgc28gbm9uLW11bHRpIHVzYWdlCi0JZ2V0cyBhb3V0X3BzZXVkb190YWJsZS4KLQkoYW91dF9wc2V1ZG9fdGFibGUpOiBEZWNsYXJlLgotCShvYmpfcmVhZF9iZWdpbl9ob29rKTogRGVmaW5lLgotCVVwZGF0ZSBjb3B5cmlnaHQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogUmVuYW1lIHRvCi0JY29mZl9wc2V1ZG9fdGFibGUuCi0JKGNvZmZfcG9wX2luc2VydCk6IFVzZSBjb2ZmX3BzZXVkb190YWJsZS4KLQkoY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IFJlbW92ZS4KLQkoY29mZl9mb3JtYXRfb3BzKTogQWRkIDAgZW50cmllcyBmb3Igc19nZXRfc2l6ZSwgc19zZXRfc2l6ZSwKLQlhbmQgY29tbWVudCBhbGwgemVybyBlbnRyaWVzIGFuZCByZW1vdmUgI2lmIDAgY29kZS4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX3BvcF9pbnNlcnQpOiBEZWZpbmUuCi0JKGNvZmZfcHNldWRvX3RhYmxlKTogRGVjbGFyZS4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zvcm1hdF9vcHMpOiBBZGQgMCBlbnRyaWVzIGZvcgotCXNfZ2V0X3NpemUsIHNfc2V0X3NpemUuICBDb21tZW50IGFsbCB6ZXJvIGVudHJpZXMuCi0JVXBkYXRlIGNvcHlyaWdodC4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3NfZ2V0X290aGVyKTogTmV3IGZ1bmN0aW9uLgotCShvYmpfcmVhZF9iZWdpbl9ob29rKTogUmVuYW1lIHRvIGVsZl9vYmpfcmVhZF9iZWdpbl9ob29rLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogUmVuYW1lIHRvIGVsZl9vYmpfc3ltYm9sX25ld19ob29rLgotCShlbGZfZm9ybWF0X29wcyk6IEFkZCBlbGZfc19nZXRfb3RoZXIsIDAgc19nZXRfc2l6ZSBlbnRyeSwgYW5kCi0JY29tbWVudC4KLQkob2JqX2VsZl9wYXJzZV9zZWN0aW9uX2xldHRlcnMpOiBEb24ndCBwYXNzIGVycm9yIHN0cmluZ3MgdG8KLQlwcmludGYgYXMgZm9ybWF0IGFyZy4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChFQ09GRl9ERUJVR0dJTkcpOiBEZWZpbmUgd2hlbgotCU9CSl9NQVlCRV9FQ09GRi4KLQkoZWxmX3NfZ2V0X290aGVyKTogRGVjbGFyZS4KLQkoU19HRVRfT1RIRVIpIERlZmluZSBhcyBlbGZfc19nZXRfb3RoZXIgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShTX1NFVF9PVEhFUik6IE9ubHkgZGVmaW5lIHdoZW4gbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoZWxmX29ial9yZWFkX2JlZ2luX2hvb2spOiBEZWNsYXJlLgotCShvYmpfcmVhZF9iZWdpbl9ob29rKTogRGVmaW5lLgotCShlbGZfb2JqX3N5bWJvbF9uZXdfaG9vayk6IERlY2xhcmUuCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWZpbmUuCi0JVXBkYXRlIGNvcHlyaWdodC4KLQotCSogY29uZmlnL29iai1tdWx0aS5oOiBBZGQgY29weXJpZ2h0IGhlYWRlciBhbmQgcHJvdGVjdCBhZ2FpbnN0Ci0JbXVsdGlwbGUgaW5jbHVzaW9uLiAgQWRkICogdG8gYWxsIGZ1bmN0aW9uIHBvaW50ZXJzLgotCShPQkpfSEVBREVSKTogSWYgZGVmaW5lZCwgaW5jbHVkZSBpdCByYXRoZXIgdGhhbiBvdGhlciBkZWZpbmVzCi0JaW4gdGhpcyBmaWxlLgotCShvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IFRlc3QgZm9yIE5VTEwuCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBIZXJlIHRvby4KLQkob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogQW5kIGhlcmUuCi0JKFNfR0VUX09USEVSKTogRGVmaW5lLgotCShTX0dFVF9ERVNDKTogRGVmaW5lLgotCShFQ09GRl9ERUJVR0dJTkcpOiBSZW1vdmUgYXMgaXQncyBkb25lIGluIG9iai1lbGYuaAotCShPQkpfTUFZQkVfRUxGKTogVXBkYXRlIGNvbW1lbnQuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW1tZWRpYXRlKTogQWRkIE9CSl9NQVlCRV9BT1VUIHRvCi0JT0JKX0FPVVQgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFsIGFuZCBoYW5kbGUgZW11bGF0aW9uIGJ5Ci0JdGVzdGluZyBPVVRQVVRfRkxBVk9SLgotCShpMzg2X2Rpc3BsYWNlbWVudCk6IEhlcmUgdG9vLgotCShtZF9zZWN0aW9uX2FsaWduKTogU2ltaWxhcmx5IGhlcmUuCi0JKGkzODZfdGFyZ2V0X2Zvcm1hdCk6IENvbmRpdGlvbmFsbHkgY29tcGlsZSB3aGVuIG1vcmUgdGhhbiBvbmUKLQlvZiBPQkpfTUFZQkVfe0VMRixDT0ZGLEFPVVR9IGRlZmluZWQuICBBZGQgYW91dCBjYXNlLgotCShpMzg2X2ltbWVkaWF0ZSk6IEZpeCBlcnJvciBtZXNzYWdlIGZvciBhb3V0IEJGRF9BU1NNQkxFUi4KLQkoaTM4Nl9kaXNwbGFjZW1lbnQpOiBIZXJlIHRvby4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChBT1VUX1RBUkdFVF9GT1JNQVQpOiBEZWZpbmUgZm9yIGVhY2ggVEVfKi4KLQlEZWZpbmUgVEFSR0VUX0ZPUk1BVCBmb3IgYW91dCBvbmx5IHdoZW4gbm90IG11bHRpLgotCVVwZGF0ZSBjb3B5cmlnaHQuCi0KLQkqIGNvbmZpZy90ZS1tdWx0aS5oOiBEZWxldGUgZmlsZSBhcyBpdCdzIGlkZW50aWNhbCB0byB0ZS1nZW5lcmljLmgKLQotMjAwMC0wMS0xNSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChEV09SRF9NTkVNX1NVRkZJWCk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKERXT1JEX01ORU1fU1VGRklYKTogUmVuYW1lIGFsbCBvY2N1cnJlbmNlcyB0bwotCUxPTkdfTU5FTV9TVUZGSVguCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKElOVEVMX0RXT1JEX01ORU1fU1VGRklYKTogUmVuYW1lIHRvCi0JRFdPUkRfTU5FTV9TVUZGSVguCi0JKiBjb25maWcvdGMtaTM4Ni5jIChJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCk6IEhlcmUgdG9vLiAgRml4IHNvbWUKLQljb21tZW50cy4KLQotMjAwMC0wMS0xMyAgQ2xpbnRvbiBQb3BldHogIDxjcG9wZXR6QGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2RvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmggKG1kX2RvX2FsaWduKTogRGVmaW5lLgotCi0yMDAwLTAxLTEwICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIE9wdGlvbnMpOiBGaXggdHlwby4KLSAJKEFSTS1DaGFycyk6IENvcnJlY3QgZGVzY3JpcHRpb24gb2YgYCMnLiAgTWVudGlvbiAgdGhhdCBgOycgaXMgYSAKLQlsaW5lIHNlcGFyYXRvciBmb3IgTGludXguCi0JKiBkb2MvYXMudGV4aW5mbyAoQ29tbWVudHMpOiBNZW50aW9uIHRoZSBBUk0uCi0KLTIwMDAtMDEtMTAgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQGZ1dHVyZXR2LmNvbT4KLQotCSogY29uZmlndXJlLmluIChhcm0qLSotY29uaXgqKTogTmV3IHRhcmdldC4KLQkoYXJtKi0qLWxpbnV4LWdudSopOiBNYXRjaCBpbnN0ZWFkIG9mIGFybS0qLWxpbnV4KiBhbmQKLQlhcm12Ki0qLWxpbnV4LWdudS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMjAwMC0wMS0wMyAgTWFydGluIHYuIExvZXdpcyAgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IERlZmluZSB2aXNpYmlsaXR5IHBzZXVkb3MuCi0JKG9ial9lbGZfdmlzaWJpbGl0eSk6IE5ldyBmdW5jdGlvbi4KLQkKLQkqIGRvYy9hcy50ZXhpbmZvIChWaXNpYmlsaXR5KTogTmV3IG5vZGU6IGRvY3VtZW50IHZpc2liaWxpdHkKLQlwc2V1ZG8gb3BzLgotCi0xOTk5LTEyLTI3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKE1BVENIKTogUmVsYXggSnVtcEFic29sdXRlIGNoZWNrLiAgRW1pdCBhCi0Jd2FybmluZyBmb3IgYWJzb2x1dGUganVtcC9jYWxsIHdpdGhvdXQgYConIGluIG5vbi1pbnRlbCBtb2RlLiAgTm8KLQluZWVkIHRvIHNldCBpLnR5cGVzWzBdIEp1bXBBYnNvbHV0ZSBpbiBpbnRlbCBtb2RlLgotCi0xOTk5LTEyLTIyICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBmdXR1cmV0di5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYXJtX3NfdGV4dCk6IElmIE9CSl9FTEYsIGNhbGwgdGhlIGFwcHJvcHJpYXRlCi0JaG9vayBmdW5jdGlvbiB3aGVuIGNoYW5naW5nIHNlY3Rpb25zLgotCShhcm1fc19kYXRhKTogTGlrZXdpc2UuCi0KLTE5OTktMTItMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIC1tYXJtNzIwCi0JY29tbWFuZCBsaW5lIHN3aXRjaC4KLQotVHVlIE5vdiAzMCAyMjo1OTowMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiLmFtMzMiIHBzZXVkby1vcC4KLQkocl9yZWdpc3RlcnMsIHhyX3JlZ2lzdGVycyk6IERlZmluZS4KLQkocl9yZWdpc3Rlcl9uYW1lLCB4cl9yZWdpc3Rlcl9uYW1lKTogTmV3IGZ1bmN0aW9ucy4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgbmV3IGFtMzMgb3BlcmFuZCB0eXBlcyBhbmQgaW5zdHJ1Y3Rpb24KLQlmb3JtYXRzLgotCShtbjEwMzAwX2luc2VydF9vcGVyYW5kLCBjaGVja19vcGVyYW5kKTogTGlrZXdpc2UuCi0KLTE5OTktMTEtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAodGh1bWJfbW9kZSk6IFR1cm4gaW50byBhIHRyaXN0YXRlIHZhcmlhYmxlLgotCShzX2ZvcmNlX3RodW1iKTogU2V0IHRodW1iX21vZGUgdG8gMi4KLQkobWRfYXNzZW1ibGUpOiBEbyBub3QgY29tcGxhaW4gYWJvdXQgdGh1bWIgaW5zdHJ1Y3Rpb25zIG9uIGEKLQlub24tdGh1bWIgdGFyZ2V0IGlmIHRodW1iX21vZGUgaXMgc2V0IHRvIDIuCi0KLTE5OTktMTEtMjggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAodG9wbGV2ZWwpOiBJbmNsdWRlIHN0cnVjLXN5bWJvbC5oLgotCShhbHBoYV9tYWNyb19hcmcpOiBBZGQgTUFDUk9fe0xJVEVSQUwsQkFTRSxCWVRPRkYsSlNSfSBjYXNlcy4KLQkoT18uLi4pOiBBZGQgbmV3IG1hY2hpbmUgZGVwZW5kZW50IGV4cHJlc3Npb25zIGlmIHdlIGFyZSBoYW5kbGluZwotCWV4cGxpY2l0IHJlbG9jYXRpb25zLgotCShhbHBoYV9yZWxvY19vcCk6IE5ldyBzdGF0aWMgdGFibGUgaG9sZGluZyB0aGUgZXhwbGljaXQgcmVsb2NhdGlvbgotCWluZm9ybWF0aW9uLgotCShhbHBoYV9saXRlcmFsX2hhc2gpOiBOZXcgc3RhdGljIHRvIGhvbGQgdGhlIGhhc2ggdGFibGUgZm9yCi0JZXhwbGljaXQgcmVsb2NhdGlvbnMuCi0JKGFscGhhX21hY3Jvcyk6IEFkZCBzdXBwb3J0IGZvciBleHBsaWNpdCByZWxvY2F0aW9ucy4KLQkobWRfYmVnaW4pOiBJZiBleHBsaWNpdCByZWxvY2F0aW9ucywgaW5pdGlhbGl6ZSBoYXNoIHRhYmxlLgotCShtZF9hc3NlbWJsZSk6IERvbid0IHByaW50IGEgc2Vjb25kIGVycm9yIGlmIHRva2VuaXplX2FyZ3VtZW50cwotCWFscmVhZHkgcHJpbnRlZCBhbiBlcnJvciBtZXNzYWdlLgotCShtZF9hcHBseV9maXgpOiBBZGQgc3VwcG9ydCBmb3IgZXhwbGljaXQgcmVsb2NhdGlvbnMuCi0JKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBEaXR0by4KLQkoYWxwaGFfZml4X2FkanVzdGFibGUpOiBEaXR0by4KLQkoYWxwaGFfYWRqdXN0X3N5bXRhYik6IE5ldyBmdW5jdGlvbiB0byBzdXBwb3J0IGV4cGxpY2l0Ci0JcmVsb2NhdGlvbnMuCi0JKGFscGhhX2FkanVzdF9zeW10YWJfcmVsb2NzKTogRGl0dG8uCi0JKGRlYnVnX2V4cCk6IERlYnVnIHN0dWIgY29tcGlsZWQgaWYgREVCVUdfQUxQSEEgaXMgZGVmaW5lZC4KLQkodG9rZW5pemVfYXJndW1lbnRzKTogQWRkIGRlYnVnIGNvZGUgaWYgREVCVUdfQUxQSEEgaXMgZGVmaW5lZC4KLQlBZGQgc3VwcG9ydCBmb3IgZXhwbGljaXQgcmVsb2NhdGlvbnMuICBSZXR1cm4gLTIgaWYgYW4gZXJyb3IKLQltZXNzYWdlIHdhcyBhbHJlYWR5IHByaW50ZWQuCi0JKGZpbmRfbWFjcm9fbWF0Y2gpOiBBZGQgc3VwcG9ydCBmb3IgZXhwbGljaXQgcmVsb2NhdGlvbnMuICBDb21tZW50Ci0JZWFjaCBvZiB0aGUgY2FzZXMuCi0JKGVtaXRfaW5zbik6IEFkZCBzdXBwb3J0IGZvciBleHBsaWNpdCByZWxvY2F0aW9ucy4KLQkoYXNzZW1ibGVfdG9rZW5zKTogRGl0dG8uCi0JKGVtaXRfbGRncCk6IERpdHRvLgotCShsb2FkX2V4cHJlc3Npb24pOiBEaXR0by4KLQkoZW1pdF9sZGEpOiBEaXR0by4KLQkoZW1pdF9sZGFoKTogRGl0dG8uCi0JKGVtaXRfaXJfbG9hZCk6IERpdHRvLgotCShlbWl0X2xvYWRzdG9yZSk6IERpdHRvLgotCShlbWl0X2xkWHUpOiBEaXR0by4KLQkoZW1pdF9sZGlsKTogRGl0dG8uCi0JKGVtaXRfc2V4dFgpOiBEaXR0by4KLQkoZW1pdF9kaXZpc2lvbik6IERpdHRvLgotCShlbWl0X2pzcmptcCk6IERpdHRvLgotCShlbWl0X3JldGpjcik6IERpdHRvLgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoUkVMT0NfT1BfUCk6IEVuYWJsZSBleHBsaWNpdCByZWxvY2F0aW9ucyBpZgotCUVMRiBvYmplY3QgZm9ybWF0LgotCSh0Y19hZGp1c3Rfc3ltdGFiKTogSWYgZXhwbGljaXQgcmVsb2NhdGlvbnMsIGNhbGwgdGhlIGZ1bmN0aW9uCi0JYWxwaGFfYWRqdXN0X3N5bXRhYi4KLQkoVENfRklYX1RZUEUpOiBBZGQgZmllbGRzIHRvIGJlIGFibGUgdG8gbW92ZSBleHBsaWNpdCBsaXR1c2UKLQlyZWxvY2F0aW9ucyBuZXh0IHRvIHRoZSBsaXRlcmFsIHJlbG9jYXRpb24gdGhleSByZWZlcmVuY2UuCi0JKFRDX0lOSVRfRklYX0RBVEEpOiBJbml0aWFsaXplIHRoZSBuZXcgZmllbGRzLgotCShUQ19GSVhfREFUQV9QUklOVCk6IFByaW50IHRoZSBuZXcgZmllbGRzIGlmIERFQlVHNSBpcyBkZWZpbmVkLgotCi1XZWQgTm92IDI0IDIwOjI3OjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBIYW5kbGUgUEEyLjAgdW5pdCBjb21wbGV0ZXJzLiAgSGFuZGxlCi0JJ0InIG9wZXJhbmQgZm9yIFBBMi4wIGJiIGluc3RydWN0aW9uLgotCQotMTk5OS0xMS0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUgZm9yIE1jb3JlLXBlCi0JdGFyZ2V0LgotCQotCSogY29uZmlnL3RjLW1jb3JlLmMgKHRjX2dlbl9yZWxvYyk6IFN1cHBvcnQgZ2VuZXJhdGlvbiBvZiBSVkEKLQlyZWxvY3MuCi0JKG1jb3JlX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyB0byBiZSBnZW5lcmF0ZWQgZm9yCi0JUlZBIHJlbG9jcy4KLQotMTk5OS0xMS0xNiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ltbWVkaWF0ZSk6IERpc2FsbG93IE9fYmlnIGltbWVkaWF0ZXMuCi0JKGkzODZfZGlzcGxhY2VtZW50KTogRGlzYWxsb3cgT19iaWcgZGlzcGxhY2VtZW50cy4KLQotTW9uIE5vdiAxNSAyMDoxMjo0MyAxOTk5ICBEb25hbGQgTGluZHNheSAgPGRsaW5kc2F5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fbWlhLGRvX21hcixkb19tcmEsZG9fcGxkLGRvX2xkcmwsZG9fY29fcmVnKTogU21hbGwKLQlpbXByb3ZlbWVudHMgaW4gZXJyb3IgY2hlY2tpbmcuCi0JKG1kX2Fzc2VtYmxlKTogU3VwcG9ydCBmb3IgdW5jb25kaXRpb25hbCBBUk0gaW5zdHJ1Y3Rpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBTdXBwb3J0IGZvciAtbVthcm1ddjVlIGZsYWcuCi0KLTE5OTktMTEtMTIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKGJ1ZmZlcl9hbmRfbmVzdCk6IERvIG5vdCBjaGVjayBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKLQlidWZmZXIuIAotCi0xOTk5LTExLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtYWNyby5jIChidWZmZXJfYW5kX25lc3QpOiBMb29rIGZvciBzZXBlcmF0b3IgYWZ0ZXIgVE8gYW5kCi0JRlJPTSB0b2tlbnMuCi0KLTE5OTktMTEtMDggIEFuZHJldyBIYWxleSAgPGFwaEBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBXaGVuIGluIFN0YXRlIDEwLCB0cmVhdCBiYWNrc2xhc2gKLQljaGFyYWN0ZXJzIGluIHRoZSBzYW1lIHdheSBhcyBhcyBzeW1ib2wgY2hhcmFjdGVycy4KLQotMTk5OS0xMS0wNyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2FsaWduKTogQ2hlY2ssIGRvbid0IGFzc2VydCwgdGhhdAotCXRoZSBwcmV2aW91cyBsYWJlbCB3YXMgaW4gdGhlIGN1cnJlbnQgc2VjdGlvbiBiZWZvcmUgcGxheWluZwotCXdpdGggYXV0by1hbGlnbm1lbnQuCi0KLTE5OTktMTEtMDYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jYXRpb24KLSAgICAgICAgZm9yIHdlYWsgc3ltYm9scy4KLQkodjg1MF9wY3JlbF9mcm9tX3NlbGVjdGlvbik6IERvIG5vdCBjb21wdXRlIGEgcGNyZWwgb2Zmc2V0IGlmCi0gICAgICAgIHRoZSBzeW1ib2wgaXMgd2Vhay4KLQotMTk5OS0xMS0wNSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogSW5jcmVhc2UgbWFjaGluZSBkZXBlbmRlbnQgb3BlcmF0b3JzIHRvIDE2LgotCSogZXhwci5jIChvcF9yYW5rKTogRGl0dG8uCi0KLTE5OTktMTEtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBSZWplY3QgYXR0ZW1wdHMgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhCi0Jc2VjdGlvbiBzeW1ib2wuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaWRlbnQpOiBDYWxsIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0JaWYgaXQgaXMgZGVmaW5lZC4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3NldF9pbmRleCk6IEFkZCBBVFRSSUJVVEVfVU5VU0VELgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERvbid0IHBhc3MgTlVMTAotCXRvIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cy4KLQotMTk5OS0xMS0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogQ2hhbmdlIHRvIGZhbHNlLgotCi0xOTk5LTExLTAxICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBVc2UgT1BDT0RFX0lTX01FTUJFUi4KLQkobWlwc19pcCk6IFVzZSBPUENPREVfSVNfTUVNQkVSLgotCi1XZWQgT2N0IDI3IDE2OjUwOjQ0IDE5OTkgIERvbiBMaW5kc2F5ICA8ZGxpbmRzYXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChyZWdfcmVxdWlyZWRfaGVyZSk6IEltcHJvdmUgY29tbWVudHMuCi0KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKHRodW1iX29wY29kZSk6IEFkZCAidmFyaWFudHMiIGZpZWxkLgotICAgICAgICAodGluc25zKTogSW5pdGlhbGl6ZSB2YXJpYW50cyBmaWVsZC4KLQotCSogY29uZmlnL3RjLWFybS5jIChiYWRfYXJncywgYmFkX3BjKTogUmVuYW1lZCB0byBCQURfQVJHUyBhbmQKLQlCQURfUEMgcmVzcGVjdGl2ZWx5LgotCi0xOTk5LTEwLTI3ICBTY290dCBCYW1icm91Z2ggIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLQotCSogY29uZmlnL3RjLWFybS5jIChyZWxvY19tYXBbXSk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCSogY29uZmlnL3RjLWFybS5oOiBGaXggY29tcGlsZSB0aW1lIHdhcm5pbmdzLgotCi1Nb24gT2N0IDE4IDE4OjExOjEwIE1EVCAxOTk5CURpZWdvIE5vdmlsbG8gPGRub3ZpbGxvQGN5Z251cy5jb20+Ci0KLQkqIHRjX2QxMHYuYyAoZmluZF9vcGNvZGUpOiBBbGxvdyBBVFNJR04gdG8gbWF0Y2ggZXhwcmVzc2lvbnMgb2YgdGhlCi0JZm9ybSBAYWJzMTYsIEAoYWJzMTYpIGFuZCBAKGFiczE2ICsgaW1tKS4KLQotMTk5OS0xMC0yMSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKElTQV9IQVNfQ09QUk9DX0RFTEFZUykgOiBOZXcuCi0JKElTQV9IQVNfNjRfQklUX1JFR1MpIE5ldy4KLQkoZ3ByX2ludGVybG9ja3MsbWRfYmVnaW4scmVnX25lZWRzX2RlbGF5LGFwcGVuZF9pbnNuLAotCW1pcHNfZW1pdF9kZWxheXMsbWFjcm9fYnVpbGQsbG9hZF9yZWdpc3Rlcixsb2FkX2FkZHJlc3NzLAotCW1hY3JvLG1hY3JvMixtaXBzX2lwLHNfY3ByZXN0b3JlLHNfY3BhZGQpOiBTaW1wbGlmeQotCWFuZC9vciB1c2UgbmV3IElTQV94eHggbWFjcm9zIGluIGV4cHJlc3Npb25zIGludm9sdmluZwotCUlTQSwgcGFydGljdWxhcmx5IG1pcHNfb3B0cy5pc2EuCi0KLTE5OTktMTAtMTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IEFkZCBtYWNoaW5lIGRlcGVuZGVudCBvcGVyYXRvcnMgbWQxLi5tZDguCi0JKGV4cHJlc3Npb25TKTogTWFrZSBYX29wIDggYml0cyBpbnN0ZWFkIG9mIDcuICBBZGQgYSBYX21kIGZpZWxkCi0JZm9yIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBvcGVyYXRvcnMgdG8gdXNlLgotCi0JKiBleHByLmMgKG9wX3JhbmspOiBBZGQgbWFjaGluZSBkZXBlbmRlbnQgb3BlcmF0b3JzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoT19wcmVnaXN0ZXIpOiBEZWZpbmUgYXMgYSBtYWNoaW5lIGRlcGVuZGVudAotCW9wZXJhdG9yLgotCShPX2NwcmVnaXN0ZXIpOiBEaXR0by4KLQkobWRfYmVnaW4pOiBDaGFuZ2UgWF9vcCB0ZXN0IHRoYXQgZmllbGQgaXMgd2lkZSBlbm91Z2ggdG8gdXNlCi0JT19tYXggaW5zdGVhZCBvZiBPX2FscGhhX21heC4KLQkoY3B1X3R5cGVzKTogRmlsbCBpbiBtaXNzaW5nIGluaXRpYWxpemVyLgotCShhbHBoYV9udW1fbWFjcm9zKTogTWFrZSB1bnNpZ25lZC4KLQkobWRfYXNzZW1ibGUpOiBNYWtlIG9wbmFtZWxlbiBiZSBzaXplX3QuCi0JKG1kX2FwcGx5X2ZpeCk6IENhc3QgYWxwaGFfbnVtX29wZXJhbmRzIHRvIGludCBiZWZvcmUgdGVzdGluZy4KLQkoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IERpdHRvLgotCShhbHBoYV9maXhfYWRqdXN0YWJsZSk6IERpdHRvLgotCShhbHBoYV9maXhfYWRqdXN0YWJsZSk6IE1hcmsgdW51c2VkIGFyZ3VtZW50cyBBVFRSSUJVVEVfVU5VU0VELgotCSh0Y19nZW5fcmVsb2MpOiBEaXR0by4KLQkodGNfZ2V0X3JlZ2lzdGVyKTogRGl0dG8uCi0JKGVtaXRfbGRncCk6IERpdHRvLgotCShlbWl0X2xkYSk6IERpdHRvLgotCShlbWl0X2xkYWgpOiBEaXR0by4KLQkoZW1pdF9sZGlsKTogRGl0dG8uCi0JKHNfYWxwaGFfZW50KTogRGl0dG8uCi0JKHNfYWxwaGFfZW5kKTogRGl0dG8uCi0JKHNfYWxwaGFfZnJhbWUpOiBEaXR0by4KLQkoc19hbHBoYV9wcm9sb2d1ZSk6IERpdHRvLgotCShzX2FscGhhX2ZpbGUpOiBEaXR0by4KLQkoc19hbHBoYV9ncHJlbDMyKTogRGl0dG8uCi0JKHNfYWxwaGFfcHJvYyk6IERpdHRvLgotCShzX2FscGhhX3NldCk6IERpdHRvLgotCShzX2FscGhhX2Jhc2UpOiBEaXR0by4KLQkoc19hbHBoYV9hbGlnbik6IERpdHRvLgotCShzX2FscGhhX2FyY2gpOiBEaXR0by4KLQkoYWxwaGFfYWxpZ24pOiBEaXR0by4KLQkoYXNzZW1ibGVfaW5zbik6IFN1cHByZXNzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgotCShlbWl0X2luc24pOiBEaXR0by4KLQkoYXNzZW1ibGVfaW5zbik6IERvbid0IGFzc3VtZSBYX29wIGFuZCBYX3Vuc2lnbmVkIGFyZSBpbiBhIGdpdmVuCi0Jb3JkZXIgaW4gdGhlIHN0cnVjdHVyZS4KLQkoc19hbHBoYV9jb2ZmX3dyYXBwZXIpOiBBdm9pZCBpbnQvdW5zaWduZWQgY29tcGFyaXNvbi4KLQotU3VuIE9jdCAxNyAxNzoxNTo1OCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IE1ha2UgImZtdCIgYW4gaW50LgotCi0xOTk5LTEwLTEyICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW5kZXhfY2hlY2spOiBDb3JyZWN0ICNlbmRpZiBsb2NhdGlvbi4KLQotTW9uIE9jdCAxMSAxNDowMjo0MCAxOTk5ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQkocGFyc2VfYXJncyk6IEFkZCAtLW5vLXdhcm4sIC0td2FybiwgLS1mYXRhbC13YXJuaW5ncywKLQl3aGljaCBiZWNvbWUgJ1cnLCBPUFRJT05fV0FSTiwgYW5kIE9QVElPTl9XQVJOX0ZBVEFMLgotCShwYXJzZV9hcmdzKTogUGFyc2UgdGhlIG5ldyBvcHRpb25zLgotCShtYWluKTogSWYgdGhlcmUgd2VyZSB3YXJuaW5ncywgYW5kIC0tZmF0YWwtd2FybmluZ3MKLQl3YXMgc3BlY2lmaWVkLCBwcmludCBhbiBlcnJvci4KLQkqIGFzLmg6IE5ldyB2YXJpYWJsZSwgZmxhZ19mYXRhbF93YXJuaW5ncywgZm9yIG5ldyBvcHRpb24uCi0KLVN1biBPY3QgMTAgMDE6NDc6MjMgMTk5OSAgSmVycnkgUXVpbm4gPGplcnJ5LnF1aW5uLmFkdjkxQGFsdW0uZGFydG1vdXRoLm9yZz4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgQWRkIG5ldyBjb2RlcyAnY2MnLCAnY2QnLCAnY0MnLCAnY28nLAotCSdAJy4gIENoYW5nZSBhdXRvaW5jcmVtZW50IGNvbXBsZXRlcnMgdG8gZmFsbCB0aHJvdWdoIHRvIGNhY2hlIGNvbnRyb2wKLQljb21wbGV0ZXJzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBSZW1vdmUgdW51c2VkIGFyZ3MuICBBZGQgY29kZSB0byAnP1cnCi0JYXJnLiAKLQkocGFfcGFyc2VfYWRkYl82NF9jbXBsdHIpOiAgTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBDaGFuZ2UgZXJyb3IgbWVzc2FnZS4KLQkocGFfaXAscGFfcGFyc2VfY21wYl82NF9jbXBsdHIscGFfcGFyc2VfY21waWJfNjRfY21wbHRyKSAgRml4ICc/TicgYW5kCi0JJz9RJyBhcmdzIHRvIGFsbG93IGZhbGxpbmcgdGhyb3VnaC4KLQotCSogY29uZmlndGMtaHBwYS5jIChwYV9pcCk6ICBJbXBsZW1lbnQgY29uZGl0aW9uYWwgY29kZXMgIj9OIiwgIj9RIi4KLQlSZW1vdmUgdW51c2VkIGNvbmRpdGlvbmFsIGNvZGVzLgotCShwYV9wYXJzZV9jbXBiXzY0X2NtcGx0cixwYV9wYXJzZV9jbXBpYl82NF9jbXBsdHIpOiAgTmV3LgotCi1UaHUgT2N0ICA3IDAwOjIzOjUzIE1EVCAxOTk5CURpZWdvIE5vdmlsbG8gPGRub3ZpbGxvQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKENIQVJfQklUKTogRGVmaW5lLgotCShjaGVja19yYW5nZSk6IEZpeCBiaXQgb3BlcmF0aW9ucyB0byBzdXBwb3J0IGludGVnZXJzIGJpZ2dlciB0aGFuCi0JMzIgYml0cy4KLQotVGh1IE9jdCAgNyAwMDoxMTo1MCBNRFQgMTk5OQlEaWVnbyBOb3ZpbGxvIDxkbm92aWxsb0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChjaGVja19yYW5nZSk6IENoZWNrIHJhbmdlIGZvciBSRVNUUklDVEVEX05VTTMKLQlvcGVyYW5kcy4KLQotTW9uIE9jdCAgNCAxNzoyNDoyMyAxOTk5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCQkJICBEb3VnIEV2YW5zICA8ZGV2YW5zQGN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgbTMycnguCi0JKiBjb25maWcvdGMtbTMyci5jIChlbmFibGVfbTMycngpOiBOZXcgc3RhdGljIGdsb2JhbC4KLQkoZW5hYmxlX3NwZWNpYWwsd2Fybl9leHBsaWNpdF9wYXJhbGxlbF9jb25mbGljdHMsb3B0aW1pemUpOiBEaXR0by4KLQkoYWxsb3dfbTMycngpOiBOZXcgZnVuY3Rpb24uCi0JKE0zMlJfU0hPUlRPUFRTKTogQWRkIGBPJy4KLQkobWRfbG9uZ29wdHMpOiBBZGQgLS1tMzJyeCBwbHVzIHNldmVyYWwgd2FybmluZyBvcHRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBQcmludCB0aGVtLgotCShtZF9iZWdpbik6IEVuYWJsZSBtMzJyeC4KLQkoT1BFUkFORF9JU19DT05EX0JJVCk6IE5ldyBtYWNyby4KLQkoZmlyc3Rfd3JpdGVzX3RvX3NlY29uZHNfb3BlcmFuZHMpOiBOZXcgZnVuY3Rpb24uCi0JKHdyaXRlc190b19wYyxjYW5fbWFrZV9wYXJhbGxlbCxtYWtlX3BhcmFsbGVsKTogTmV3IGZ1bmN0aW9ucy4KLQkodGFyZ2V0X21ha2VfcGFyYWxsZWwsYXNzZW1ibGVfdHdvX2luc25zKTogTmV3IGZ1bmN0aW9ucy4KLQkobWRfYXNzZW1ibGUpOiBSZWNvZ25pemUgImluc24xIC0+IGluc24yIiBhbmQgImluc24xIHx8IGluc24yIi4KLQlJZiBvcHRpbWl6aW5nIGFuZCBtMzJyeCwgdHJ5IHRvIG1ha2UgY29uc2VjdXRpdmUgaW5zbnMgcGFyYWxsZWwuCi0KLVR1ZSBTZXAgMjggMTQ6MDY6NDQgMTk5OSAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChub3BpY19uZWVkX3JlbGF4KTogQWxsb3cgZm9yIHRoZQotCS5zZGF0YS5mb28gc2VjdGlvbnMgZ2VuZXJhdGVkIGJ5IC1mZGF0YS1zZWN0aW9ucywKLQlhbmQgZm9yIHRoZSAuZ251LmxpbmtvbmNlLnMgc2VjdGlvbnMgZ2VuZXJhdGVkIGJ5IEMrKy4KLQotVGh1IFNlcCAyMyAwNzoxMzo0NSAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBSZXBsYWNlICdCJywgJ00nLCAnbCcgYW5kICdnJyBoYW5kbGluZwotCXdpdGggY2xlYW5lciBjb2RlIHVzaW5nIGNvbXBsZXRlciBwcmVmaXhlcy4gICBBZGQgJ1knLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBBZGQgcGFyZW5zIHRvIHNpbGVuY2UgY29tcGlsZXIuCi0KLVdlZCBTZXAgMjIgMDk6Mzc6MTkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBBdm9pZCBBTlNJIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLgotCShwYV9pcCwgY2FzZSAnbScpOiBGYWlsdXJlIHRvIGdldCBhIENCSVQgc3BlY2lmaWVyIGp1c3QgbWVhbnMgdGhlCi0JaW5zbiBkb2VzIG5vdCBtYXRjaCBhbmQgd2Ugc2hvdWxkIHRyeSB0aGUgbmV4dCBpbnNuIGluIHRoZSB0YWJsZS4KLQotMTk5OS0wOS0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChNVUxUSV9TRVRfUFNSKTogUmVuYW1lIHRvIExETV9UWVBFXzJfT1JfMy4KLQotTW9uIFNlcCAyMCAwNDowMTo0MSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogRml4IHRoaW5rb3MgaW4gcmVjZW50IGNsZWFudXAKLQlvZiBQQTIuMCBzdXBwb3J0LgotCi0xOTk5LTA5LTE5ICBBbGV4YW5kcmUgT2xpdmEgIDxvbGl2YUBsc2QuaWMudW5pY2FtcC5icj4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfc2hvcnRvcHRzKTogQ2hlY2sgT0JKX01BWUJFX0VMRiBhcyB3ZWxsIGFzCi0JT0JKX0VMRi4gIElmIEVMRiwgYWRkICJzcSIuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIEVMRiwgaWdub3JlIC1zIGFuZCAtcS4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gRUxGIG9wdGlvbnMuCi0KLVN1biBTZXAgMTkgMTA6NDM6MzEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnSicsICdLJyBhbmQgJ2NjJyAKLQlvcGVyYW5kcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOyBIYW5kbGUgImZlIiwgYW5kICdjSicuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdkJywgJyMnIGFuZCAnY3EnLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzdHJ1Y3QgcGFfaXQpOiBOZXcgZmllbGQgInRydW5jIi4KLQkocGFfaXApOiBIYWRubGUgJ2gnLCAnbScsICc9JywgJ3snLCBhbmQgJ18nIG9wZXJhbmRzLgotCShwYV9wYXJzZV9mdGVzdF9nZnhfY29tcGxldGVyKTogTmV3IGZ1bmN0aW9uCi0JKHBhX3BhcnNlX2ZwX2Nudl9mb3JtYXQpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdYJyBvcGVyYW5kLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgMjJiaXQgcGMtcmVsIGJyYW5jaGVzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnQicgb3BlcmFuZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBIYW5kbGUgJ0wnIGFuZCAnTScgb3BlcmFuZHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdsJyBvcGVyYW5kLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnZycgb3BlcmFuZC4KLQotYXQgU2VwIDE4IDEyOjEzOjI4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXNzZW1ibGUpOiBGaXggZHdhcmYyIGxpbmUgaGFuZGxpbmcuCi0JKHBhX2lwKTogSGFuZGxlICdmWCcuCi0KLVNhdCBTZXAgMTggMTI6MTM6MjggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLWhwcGEuYyAobWRfYXNzZW1ibGUpOiBGaXggZHdhcmYyIGxpbmUgaGFuZGxpbmcuCi0gICAgICAgIChwYV9pcCk6IEhhbmRsZSAnZlgnLgotCi1GcmkgU2VwIDE3IDExOjU3OjM0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogRG8gbm90IGJ1aWxkCi0JdW53aW5kcyB1bmxlc3MgdGhlIGZ1bmN0aW9uIGlzIGluIHRoZSB0ZXh0IHNwYWNlLgotCShwYV90eXBlX2FyZ3MpOiBTZXQgQlNGX0ZVTkNUSU9OIGZvciBhbiBleHByb3RlZCBkYXRhIHN5bWJvbC4KLQotV2VkIFNlcCAxNSAwNToxNDozMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogTW92ZSBkd2FyZjIgc3R1ZmYgZnJvbSBoZXJlLgotCShtZF9hc3NlbWJsZSk6IFRvIGhlcmUuICBUd2VhayBhZGRyZXNzIGdlbmVyYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IEluY2x1ZGUgZHdhcmYyZGJnLmggaWYgT0JKX0VMRi4gIERlY2xhcmUKLQlkZWJ1Z19saW5lLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgLmZpbGUgYW5kIC5saW5lIHBzZXVkby1vcHMgZm9yIE9CSl9FTEYuCi0JKG1kX2Fzc2VtYmxlKTogQ2FsbCBkd2FyZjJfd2hlcmUgZm9yIE9CSl9FTEYuCi0JKHBhX2lwKTogQ2FsbCBkd2FyZjJfZ2VuX2xpbmVfaW5mbyBmb3IgT0JKX0VMRi4KLQkocGFfZW5kX29mX3NvdXJjZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHRjLWhwcGEuaCAobWRfZW5kKTogRGVmaW5lIGZvciBPQkpfRUxGLgotCi0xOTk5LTA5LTE0ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChDYW5vbmljYWxpemF0aW9uIG9mIHRhcmdldCBuYW1lcyk6IFJlbW92ZSBhZGRpbmcKLQkke0NPTkZJR19TSEVMTH0gaW4gZnJvbnQgb2YgJGFjX2NvbmZpZ19zdWIsIHNpbmNlIGF1dG9jb25maWcgMi4xNAotCWdlbmVyYXRlcyAkYWNfY29uZmlnX3N1YiB3aXRoIGEgJHtDT05GSUdfU0hFTEx9IGFscmVhZHkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDktMTQgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBjb25maWcvdGUtaW50ZXJpeC5oIChHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOiBEZWZpbmUuCi0KLTE5OTktMDktMTMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgImptcC9jYWxsIGNvbnN0YW50IiBhcyBhCi0JcGMtcmVsYXRpdmUgam1wL2NhbGwgdG8gYW4gYWJzb2x1dGUgc3ltYm9sLgotCShtZF9hcHBseV9maXgzKTogV2hlbiBPQkpfRUxGLCBkb24ndCBhZGQgdGhlIHZhbHVlcyBpbiB0d2ljZSBmb3IKLQlhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbHMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdCBmcmFnX3ZhciBzaXplLiAgVGlkeQotCWp1bXAgaGFuZGxpbmcgY29kZSBhbmQgY29tbWVudHMuCi0KLTE5OTktMDktMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogQWRkIGhvcnJpYmxlIGFkanVzdG1lbnRzIHRvCi0JdGhlIHZhbHVlIGlmIFRFX1BFIGFuZCBhIGdsb2JhbCBkZWZpbmVkIHN5bWJvbC4KLQotMTk5OS0wOS0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHdyaXRlLmMgKGR1bXBfc2VjdGlvbl9yZWxvY3MpOiBDYWxsIHByaW50X3N5bWJvbF92YWx1ZV8xIHRvCi0JcHJpbnQgdGhlIHN5bWJvbCwgcmF0aGVyIHRoYW4gcHJpbnRpbmcgaXQgaGVyZS4KLQotMTk5OS0wOS0xMSAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QKLQlCRkRfUkVMT0NfUlZBIHJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF91bmRlZmluZWRfc3ltYm9sKTogQ29tcGFyZSB0aGUgbmFtZSBhZ2FpbnN0Ci0JdGhlIG1hY3JvIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSwgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhhdCBpdAotCXN0YXJ0cyB3aXRoICJfRyIuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IENhbGwgU0VUX1NFQ1RJT05fUkVMT0NTIGlmIGl0IGlzCi0JZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVRfU0VDVElPTl9SRUxPQ1MpOiBEZWZpbmUuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKE9iamVjdCBmb3JtYXQgYmFja2VuZCk6IERvY3VtZW50Ci0JU0VUX1NFQ1RJT05fUkVMT0NTLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0Ci0JcmVsb2NhdGlvbnMgYWdhaW5zdCBnbG9iYWwgc3ltYm9scyBpZiBURV9QRS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2lkZW50KTogQWRkIEJGRF9BU1NFTUJMRVIgdmVyc2lvbi4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFsd2F5cyBoYW5kbGUgIi5pZGVudCIgd2l0aCBvYmotY29mZl9pZGVudC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBQcm9oaWJpdCB3ZWFrIGNvbW1vbgotCXN5bWJvbHMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9lbmRlZik6IERvbid0IG1lcmdlIGxhYmVscywgb3IKLQlzeW1ib2xzIHdoaWNoIGRvIG5vdCBoYXZlIGEgY29uc3RhbnQgdmFsdWUsIG9yIHRhZ3Mgd2l0aAotCW5vbi10YWdzLiAgUmVtb3ZlIHRoZSBzeW1ib2wgZnJvbSB0aGUgbGlzdCBiZWZvcmUgYWRkaW5nIGl0IGF0IHRoZQotCWVuZC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKSBbQkZEX0FTU0VNQkxFUl06IEhhbmRsZSAuZWYKLQlDX0ZDTiBzeW1ib2wgZGlmZmVyZW50bHkgaWYgVEVfUEUuCi0JKG9ial9jb2ZmX2xpbmUpIFtCRkRfQVNTRU1CTEVSXTogQWx3YXlzIHVzZSB0aGUgbGluZSBudW1iZXIgd2hpY2gKLQlhcHBlYXJzIGluIHRoZSBwc2V1ZG8tb3AsIHJhdGhlciBjb2ZmX2xpbmVfYmFzZSB3aGljaCBpcyBvbmx5IHNldAotCWZvciBhIC5iZiBzeW1ib2wuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9sb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvYmpfcHNldWRvX3RhYmxlKTogQWRkICJsb2MiLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoYWRkX2xpbmVubyk6IENoZWNrIHRoYXQgdGhlIGxpbmUgbnVtYmVyIGlzCi0JcG9zaXRpdmUuCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoYXRvZl9pZWVlKTogQ2hhbmdlIHdoYXRfa2luZCB0byBpbnQuCi0JKiBjb25maWcvYXRvZi12YXguYyAoZmxvbnVtX2dlbjJ2YXgpOiBDaGFuZ2UgZm9ybWF0X2xldHRlciB0bwotCWludC4KLQkobWRfYXRvZik6IFJldHVybiBOVUxMIHJhdGhlciB0aGFuIDAuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hdG9mKTogQ2hhbmdlIHR5cGUgdG8gaW50LgotCSogZXhwci5jIChleHByKTogQ2hhbmdlIGZpcnN0IHBhcmFtZXRlciB0byBpbnQuCi0JKiBjb25maWcvb2JqLWNvZmYuYzogQWRkIGRlY2xhcmF0aW9ucyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IFVzZSBTWU1fQVVYRU5ULgotCSogY29uZmlnL3RjLWkzODYuaCAoZmxhZ18xNmJpdF9jb2RlKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWZhdWx0IHRvIHNldHRpbmcKLQlTRUNfTE9BRC4gIERvbid0IHNldCBTRUNfREFUQSBmb3IgJ3cnIG1vZGlmaWVyLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFByaW50IGFkanVzdGVkIGZpeHVwLgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBDb3JyZWN0IHRvb19tYW55X2RpZ2l0cyBjYWxjdWxhdGlvbgotCWluIGJhc2UgMTAgY2FzZS4KLQotMTk5OS0wOS0wOSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogZG9jL2MtYXJtLnRleGk6IEZpeCBhcmd1bWVudHMgb2YgQHZhciB0byBub3QgY29udGFpbgotCXB1bmN0dWF0aW9uLgotCi0xOTk5LTA5LTA4ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlnL3RjLWFybS5jIChzX3RodW1iX3NldCk6IE9ubHkgc3VwcG9ydCBpbnRlcndvcmtpbmcgZm9yIEVMRiAKLQlhbmQgQ09GRiB0YXJnZXRzLgotCShtZF9wYXJzZV9vcHRpb24pOiBPbmx5IHN1cHBvcnQgLWsgZmxhZyBmb3IgRUxGIGFuZCBDT0ZGIHRhcmdldHMuCi0KLVR1ZSBTZXAgIDcgMTM6Mjg6NTkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFB1dCBzdHJpY3QgcmVnaXN0ZXIgY2hlY2tzIGJlZm9yZQotCWNhbGwgdG8gcGFfcGFyc2VfbnVtYmVyLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFN1cHBvcnQgJ1onIGFyZ3VtZW50LgotCi0xOTk5LTA5LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIGFzIG5lZWRlZCBmb3IKLQlCRkRfQVNTRU1CTEVSIGNvZGUuCi0KLTE5OTktMDktMDYgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBTZXQgU0VDX0RBVEEgZm9yIGRhdGFfc2VjdGlvbi4KLQotTW9uIFNlcCAgNiAwNDoyNjo1NiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogR2V0IHN0cmljdC9ub24tc3RyaWN0IG1vZGUgZnJvbSB0aGUKLQljYW5kaWRhdGUgaW5zdHJ1Y3Rpb24uICBSZXF1aXJlIHJlZ2lzdGVycyBmb3IgcmVnaXN0ZXIgYXJndW1lbnRzCi0Jd2hlbiBpbiBzdHJpY3QgbW9kZS4gIFJlcXVpcmUgYXNzZW1ibGUtdGltZSBjb25zdGFudHMgZm9yCi0JY29uc3RhbnRzIHdoZW4gaW4gc3RyaWN0IG1vZGUuCi0JKHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uKTogUmVxdWlyZSBhIGNvbnN0YW50IHdoZW4gaW4gc3RyaWN0Ci0JbW9kZS4KLQkKLTE5OTktMDktMDYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2xvbmdvcHRzKTogRml4IHZhbHVlIGZvciAtV251aC4KLQotMTk5OS0wOS0wNCAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcG9ib3guY29tPgotCi0JKiBjb25maWcvdGMtcGouYzogTmV3IGZpbGUsIHN1cHBvcnRzIHBpY29KYXZhIGluIEVMRi4KLQkqIGNvbmZpZy90Yy1wai5oOiBEaXR0by4KLQkqIGNvbmZpZ3VyZS5pbiAocGpsKiwgcGoqKTogTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENQVV9UWVBFUyk6IEFkZCBwai4KLQkoVEFSR0VUX0NQVV9DRklMRVMpOiBBZGQgY29uZmlnL3RjLXBqLmMuCi0JKFRBUkdFVF9DUFVfSEZJTEVTKTogQWRkIGNvbmZpZy90Yy1wai5oLgotCSogZG9jL2MtcGoudGV4aTogTmV3IGZpbGUuCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIHNvbWUgUEogc3BlY2lmaWNzLgotCSogZG9jL2FsbC50ZXhpOiBBZGQgUEogdG8gdGhlIGxpc3Qgb2YgYWxsIGFyY2hpdGVjdHVyZXMsIHNvcnQgdGhlbQotCWFsbCBhbHBoYWJldGljYWxseS4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoQ1BVX0RPQ1MpOiBBZGQgYy1wai50ZXhpLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTAyICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaDogSW5jbHVkZSBvYmotZWxmLmggaWYgT0JKX01BWUJFX0VMRi4gUmVmb3JtYXQuCi0JKG9ial9mcm9iX2ZpbGUpOiBUZXN0IGZvciBudWxsIHBvaW50ZXIuCi0JKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogSGVyZSB0b28uCi0JKE9CSl9QUk9DRVNTX1NUQUIpOiBBbmQgaGVyZS4KLQkoZWxmX29ial9zeSk6IFJlbW92ZQotCi0JKiBjb25maWcvb2JqLWVsZi5oOiAjaWZuZGVmIGV2ZXJ5dGhpbmcgZGVmaW5lZCBpbiBvYmotbXVsdGkuaCwKLQlleGNlcHQgT0JKX1BST0NFU1NfU1RBQiwgd2hpY2ggd2UgI3VuZGVmIGZvciBlY29mZi4KLQkoZWxmX29ial9zeSk6IFJlbW92ZSAjaWZuZGVmIE9CSl9TWU1GSUVMRF9UWVBFLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAobm9fZnVuYyk6IFJlbW92ZS4KLQkoY29mZl9mb3JtYXRfb3BzKTogQ2hhbmdlIG9jY3VycmVuY2VzIG9mIG5vX2Z1bmMgdG8gMCwgYXMgd2UgdGVzdAotCWZvciAwIGluIG9iai1tdWx0aS5oLgotCi0JKiBjb25maWd1cmUuaW46ICBFbmFibGUgYmZkIGZvciBpMzg2LWNvZmYgd2hlbiBwcmltYXJ5IHRhcmdldCBpcwotCWJmZC4gIEVuYWJsZSBpMzg2IGVsZixjb2ZmIGVtdWxhdGlvbiBzdXBwb3J0LiAgRG9uJ3Qgc2V0Ci0JVVNFX0VNVUxBVElPTlM9MSBvciB0ZV9maWxlPW11bHRpIHVubGVzcyB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCi0JZW11bGF0aW9uIHRvIHN1cHBvcnQuCi0JKmNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wOS0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1jb3JlX3Nfc2VjdGlvbik6IERvIG5vdCBkdW1wIGxpdGVyYWxzIGlmIGEKLQkuc2VjdGlvbiAubGluZSBkaXJlY3RpdmUgaXMgZW5jb3VudGVyZWQuCi0KLTE5OTktMDktMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfc2VjdGlvbl9hbGlnbik6IERvIG5vdCBhbGlnbiBzZWN0aW9ucyBpbiBFTEYKLQlmb3JtYXQuIAotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogQWRkIC0tZ2R3YXJmMiB0byBsaXN0IG9mIG9wdGlvbnMgZGlzcGxheWVkLgotCSogYXMudGV4aW5mbzogRG9jdW1lbnQgLS1nZHdhcmYyIGNvbW1hbmQgbGluZSBvcHRpb24uCi0JQWRkIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiBvZiBBUk0gY29tbWFuZCBsaW5lIHN3aXRjaGVzLgotCi0xOTk5LTA4LTMwICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQpOiBDb21iaW5lCi0JaTM4Nl9pc19yZWcgYW5kIHBhcnNlX3JlZ2lzdGVyIGNhbGxzLiAgUmVtb3ZlIEVORF9TVFJJTkdfQU5EX1NBVkUKLQlhbmQgUkVTVE9SRV9FTkRfU1RSSU5HIGFyb3VuZCBwYXJzZV9yZWdpc3RlciBjYWxscy4KLQkoaTM4Nl9vcGVyYW5kKTogSGVyZSB0b28uCi0JKGkzODZfaXNfcmVnKTogUmVtb3ZlLgotCShwYXJzZV9yZWdpc3Rlcik6IE1vdmUgYXNfYmFkIGNhbGxzIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24gdG8KLQljYWxsZXJzLgotCi0xOTk5LTA4LTI5ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCSogY29uZmlnL3RjLWkzODYuYyAocGFyc2VfcmVnaXN0ZXIpOiBIYW5kbGUgRlAgcmVncyBzcGVjaWFsbHkuCi0JKG1kX2JlZ2luKTogUmVtb3ZlICcoJyBhbmQgJyknIGZyb20gcmVnaXN0ZXJfY2hhcnMuCi0KLTE5OTktMDgtMjkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfcGFyc2Vfb3B0aW9uKTogRGVsZXRlIHVucmVjb2duaXplZCBvcHRpb24KLQllcnJvciBtZXNzYWdlIChkb25lIGVsc2V3aGVyZSkuCi0KLVNhdCBBdWcgMjggMDE6MjM6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IERvIG5vdCBhbGxvdyAnKicgaW4gMzJiaXQgY29tcGxldGVycy4KLQotU2F0IEF1ZyAyOCAwMDoyNjoyNiAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogUmVwbGFjZSAnZicgYnkgJ3YnLiAgUHJlZml4IGZsb2F0IHJlZ2lzdGVyCi0JYXJncyBieSAnZicuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogQWRkIGFyZ3MgcSwgJSwgYW5kIHwuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIEFic29yYiB3aGl0ZSBzcGFjZSBpbiBpbnN0cnVjdGlvbnMKLQliZXR3ZWVuIGFyZ3MuCi0JQWRkIG5ldyBjb21wbGV0ZXJzLiAgRml4IGJ1ZyBpbiA2NCBiaXQgY29uZGl0aW9uIGhhbmRsaW5nLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBBZGQgY29tcGxldGVyIGNvZGVzICdhJywgJ2NoJywgJ2NIJywKLQknY1MnLCBhbmQgJ2MqJy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBQbGFjZSBjb21wbGV0ZXJzIGJlaGluZCBwcmVmaXggJ2MnLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBBZGQgY2FzZXMgZm9yICcuJywgJ34nLiAnJCcuIGFuZCAnIScKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgQWRkIGNhc2UgZm9yICdJJy4gIAotCi0xOTk5LTA4LTI3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChNQVhfU1BFQ0lBTF9BRERSX0RFTFRBKTogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCi0JKHN0cnVjdCBscyk6IEFkZCBmcmFnIGZpZWxkLiAgSW5pdGlhbGl6ZSBpdCB0byB6ZXJvLgotCShvdXRfZW5kX3NlcXVlbmNlKTogTmV3IGxvY2FsIHRleHRfZnJhZy4gIFNldCBpdCB3aGlsZSBpbiB0ZXh0IHNlY3Rpb24uCi0JUmVwbGFjZSBhZGRyZXNzIGNoZWNrIHdpdGggZnJhZyBjaGVjay4gIFNldCBscy5mcmFnIHRvIHRleHRfZnJhZyBpZgotCW91dF9zZXRfYWRkciBjYWxsZWQuCi0JKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogQWRkIGV4cGxhbmF0b3J5IGNvbW1lbnQuICBOZXcgbG9jYWwgc2F2ZWRfZnJhZy4KLQlTZXQgaXQgYmVmb3JlIHN3aXRjaGluZyBzZWN0aW9ucy4gIFJlcGxhY2UgYWRkcmVzcyBjaGVjayB3aXRoIGZyYWcKLQljaGVjay4gIFNldCBscy5mcmFnIHRvIHNhdmVkX2ZyYWcgaWYgb3V0X3NldF9hZGRyIGNhbGxlZC4KLQotMTk5OS0wOC0yNiAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLSAgICAgICAgKiBkd2FyZjJkYmcuYyAob3V0X2VuZF9zZXF1ZW5jZSk6IElmIGFkZHJlc3MgY2hhbmdlZCwgZGlyZWN0bHkKLQlvdXRwdXQgImFkdmFuY2VfcGMiIG9wY29kZSBpbnN0ZWFkIG9mIGNhbGxpbmcgZ2VuX2FkZHJfbGluZSgpLgotCVRoZSBsYXR0ZXIgaGFzIHRoZSB1bmRlc2lyZWQgc2lkZS1lZmZlY3Qgb2YgY3JlYXRpbmcgYSBuZXcgcm93Ci0JaW4gdGhlIGRlYnVnIGxpbmUgaW5mbyBtYXRyaXguIAotCi0xOTk5LTA4LTI2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChvdXRfZW5kX3NlcXVlbmNlKTogQ29ycmVjdCBjb21tZW50cy4gIFNldCBsYXN0IHRvCi0JbHMubGFzdF9maWxlbmFtZSBpZiBsYXN0IGlzIGxlc3MgdGhhbiB6ZXJvLiAgU2V0IGxzLmxhc3RfZmlsZW5hbWUKLQl3aGVuIGFsbG9jYXRpbmcgbmV3IGVudHJ5LgotCShkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IFNhdmUgc2VnIGFuZCBzdWJzZWcgaW5mbyBiZWZvcmUgc3Vic2VnX25ldwotCWNhbGwuCi0KLTE5OTktMDgtMjAgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbmRleF9jaGVjayk6IEZpeCB0aGUgZGlzcGxhY2VtZW50IHNpemUKLQl3aGVuIElORkVSX0FERFJfUFJFRklYLgotCi0xOTk5LTA4LTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBJZiBhbiBvZmZzZXQgaXMgaW52YWxpZCwKLQlkaXNwbGF5IGl0cyB2YWx1ZS4KLQotMTk5OS0wOC0xNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBUcmltIEBoYSBjb25zdGFudCB0byAxNiBiaXRzLCB0bwotCWhhbmRsZSAweGZmZmZOTk5OIGNvbnN0YW50cyBjb3JyZWN0bHkuCi0KLTE5OTktMDgtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fbGRzdCk6IExvb2sgZm9yIHJlZ2lzdGVyIGNvbmZsaWN0cyBvbiBzdG9yZXMKLQlhcyB3ZWxsIGFzIGxvYWRzLgotCi0xOTk5LTA4LTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHZhbGlkYXRlX29mZnNldF9pbW0pOiBXb3JrIG9uIHVuc2lnbmVkIHZhbHVlcy4KLQkobWRfYXBwbHlfZml4Myk6IEFsd2F5cyBwYXNzIHBvc2l0aXZlIHZhbHVlcyB0bwotCXZhbGlkYXRlX29mZnNldF9pbW0uCi0KLTE5OTktMDgtMTIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoc2tpcF93aGl0ZXNwYWNlKTogTmV3IG1hY3JvLgotCUZvcm1hdHRpbmcgdGlkeSB1cHMuCi0JCi0JKG1kX2FwcGx5X2ZpeDMpOiBTdG9yZSByZWxvY2F0aW9uIG9mZnNldCBpbiBhZGRlbmQgZm9yIEVMRiBiYXNlZAotCXJlbG9jcy4KLQkoYXJtX2ZvcmNlX3JlbG9jYXRpb24pOiBBbHdheXMgZ2VuZXJhdGUgcmVsb2NzIGZvciBUaHVtYiBmdW5jdGlvbgotCWNhbGxzLiAKLQkKLTE5OTktMDgtMTEgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBSZW1vdmUgZGVhZCBjb2RlLiAgaW50ZWxfc3ludGF4Ci0JTE9OR19ET1VCTEVfTU5FTV9TVUZGSVggZmxvYXRpbmcgcG9pbnQgaXMgZG9uZSBpbiBvcGNvZGUvaTM4Ni5oCi0KLVR1ZSBBdWcgMTAgMTI6NTg6MzEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBVc2Ugc2FuZSBzZWN0aW9uCi0JZmxhZ3MgZm9yIHRoZSB1bndpbmQgc3Vic3BhY2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKFVOV0lORF9TRUNUSU9OX05BTUUpOiBEZWZpbmUgZm9yIEVMRi4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogUmVtb3ZlICNpZiAwIHdyYXBwZXIuICBTZWxlY3QgYQotCXN1aXRhYmxlIHJlbG9jYXRpb24gYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIHRhcmdldCdzIHBvaW50ZXIuCi0JQWx3YXlzIFVzZSBzdWJzZWdtZW50IHplcm8gZm9yIHRoZSB1bndpbmRlcnMuCi0JKHBhX2xldmVsKTogSGFuZGxlICIyLjB3Ii4KLQotTW9uIEF1ZyAgOSAyMDowMjoyMiAxOTk4ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRG9uJ3QgZ3JvdXAgcmVwZWF0IGluc3RydWN0aW9ucwotCXdpdGggdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbiB1bmxlc3MgdGhpcyB3YXMgc3BlY2lmaWVkLgotCi0xOTk5LTA4LTA5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBJZiBURV9HTzMyLCByZXR1cm4gNCBmb3IKLQljZXJ0YWluIHNlY3Rpb25zLCB0byBtYXRjaCBCRkQgY2hhbmdlcy4KLQotMTk5OS0wOC0wOCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfU0NSSVBUUyk6IENoYW5nZSAuZ2RiaW5pdCB0byAkKEdEQklOSVQpLgotCShFWFRSQV9TQ1JJUFRTKTogRGVmaW5lIHRvIGtlZXAgYXV0b21ha2UgaGFwcHkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZW5hbWUgLmRlcCogZmlsZXMgdG8gREVQKi4KLQkoTUtERVApOiBSZW5hbWUgZnJvbSBERVAuICBDaGFuZ2UgYWxsIHVzZXMuICBVc2UgJCR7c3JjZGlyfSByYXRoZXIKLQl0aGFuICQoc3JjZGlyKS4gIFJlbmFtZSBUQ0RFUCB0YXJnZXRzIHRvIERFUFRDLiAgUmVuYW1lIE9CSkRFUAotCXRhcmdldHMgdG8gREVQT0JKLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDgtMDggIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWxsb3cgYXNzZW1ibHkgb2YgJWxvKCkrJXJlZy4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBDaGFuZ2UgYWxsIHVzZXMgb2YgaXRibC10ZXN0LW9wcyB0byBpdGJsLXRvcHMgdG8KLQlhdm9pZCBwcm9ibGVtcyBvbiBET1MgZmlsZXN5c3RlbXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogZG9jL2FzLnRleGluZm8gKFNlY3Rpb24pOiBEb2N1bWVudCAncycgZmxhZyBmb3IgQ09GRiB2ZXJzaW9uLgotCi0xOTk5LTA4LTA4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBIYW5kbGUgJ3MnIChzaGFyZWQpCi0Jc2VjdGlvbiBmbGFnLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgYW5kIHN1YnN0aXR1dGUgR0RCSU5JVC4gIENoYW5nZSBBQ19PVVRQVVQKLQlsaW5lIHRvIGNyZWF0ZSAke0dEQklOSVR9IHJhdGhlciB0aGFuIC5nZGJpbml0LgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXVnICA2IDEyOjEyOjQ0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXAsIGNhc2UgJz8nKTogQWRkIG1pc3NpbmcgYnJlYWsuCi0KLUZyaSBBdWcgIDYgMDk6NDY6MzUgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIEFkZCA2NCBiaXQgY29uZGl0aW9uIGNvbXBsZXRlcnMuCi0KLTE5OTktMDgtMDYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRml4IGNoZWNrIGZvciBQSUMgbG9jYWwKLQlub24tYWRqdXN0YWJsZSBzeW1ib2xzLgotCi1UaHUgQXVnICA1IDE2OjUyOjUxIDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IENoYW5nZSBjb25kaXRpb24gYXJncyB0byBoYXZlICc/JyBwcmVmaXguCi0KLVRodSBBdWcgIDUgMjM6MDU6NTYgMTk5OSAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2Fzc2VtYmxlKTogIENhbGwgYXNfYmFkIHdoZW4gdGhlcmUgYXJlIGV4Y2VzcwotCW9wZXJhbmRzLgotCi0xOTk5LTA4LTA1ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogY29uZmlnL3RlLWludGVyaXguaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1pbnRlcml4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDQgMTM6MTI6MTcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jaGtfZmllbGRfc2VsZWN0b3IpOiBBbGxvdyAzIGJ5dGUKLQlzZWxlY3RvcnMgZm9yIEVMRiB0b28uCi0JKHNlbGVjdG9yX3RhYmxlKTogQWRkICJsdHAiIGFuZCAicnRwIiBzZWxlY3RvcnMuCi0KLTE5OTktMDgtMDQgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogTm8gbmVlZCB0byBjaGFuZ2UKLQlvcGVyYW5kX3N0cmluZyBwb2ludGVyIGluIHNlZ21lbnQgcmVnIGNhc2UgYmVmb3JlIGdvdG8KLQlkb19tZW1vcnlfcmVmZXJlbmNlLiAgSW5pdGlhbGlzZSBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0IGFuZAotCWRpc3BsYWNlbWVudF9zdHJpbmdfZW5kIGFmdGVyIGRvX21lbW9yeV9yZWZlcmVuY2UgbGFiZWwuCi0JKGkzODZfaW5kZXhfY2hlY2spOiBBZGQgb3BlcmFuZF9zdHJpbmcgcGFyYW0sIGFuZCBwcmludCBlcnJvcgotCW1lc3NhZ2Ugb24gZmFpbHVyZSBoZXJlLgotCShpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogSW5zdGVhZCBvZiBoZXJlLgotCShpMzg2X29wZXJhbmQpOiBBbmQgaGVyZS4KLQkoSU5GRVJfQUREUl9QUkVGSVgpOiBFbmFibGUuCi0KLQkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni0xNmJpdCk6IERvY3VtZW50IC5jb2RlMTZnY2MuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKERlZmF1bHRTaXplKTogRGVmaW5lLiAgUmVudW1iZXIgZm9sbG93aW5nCi0Jb3Bjb2RlX21vZGlmaWVyIGRlZmluZXMuCi0KLQlGcm9tIEV0aWVubmUgTG9ycmFpbiAgPGV0aWVubmUubG9ycmFpbkBpYm0ubmV0PgotCSogY29uZmlnL3RjLWkzODYuYyAoc3RhY2tvcF9zaXplKTogTmV3IHZhcmlhYmxlLgotCShzZXRfMTZiaXRfY29kZV9mbGFnKTogQ2xlYXIgaXQgaGVyZS4KLQkoc2V0XzE2Yml0X2djY19jb2RlX2ZsYWcpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiY29kZTE2Z2NjIiBlbnRyeS4KLQkobWRfYXNzZW1ibGUpOiBTZXQgaS5zdWZmaXggZm9yIGluc25zIHdpdGggRGVmYXVsdFNpemUgbW9kaWZpZXIuCi0KLTE5OTktMDgtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IEFsd2F5cyB1cGRhdGUgc2V0X2VuZCB3aXRoCi0JbmV4dF9zZXRfZW5kIGV2ZW4gaWYgdGhlIGVuZCBzeW1ib2wgaXMgYmVpbmcgZGlzY2FyZGVkLgotCi0JKiBnYXNwLmM6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIGFzIG5lZWRlZCBmb3Igbm9uLUJGRF9BU1NFTUJMRVIuCi0JKiBvdXRwdXQtZmlsZS5jLCBzeW1ib2xzLmMsIGNvbmZpZy90Yy1pMzg2LmM6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmM6IExpa2V3aXNlLgotCShzZWdfaW5mb190eXBlKTogUmVtb3ZlLgotCShzZWdfaW5mb19vZmZfYnlfNCk6IENoYW5nZSB0byBhcnJheSBvZiBzZWdULgotCShzX2dldF9zZWdtZW50KTogQWRqdXN0IGFjY29yZGluZ2x5LgotCShvYmpfcHNldWRvX3RhYmxlKTogRnVsbHkgaW5pdGlhbGl6ZSBzZW50aW5lbCBlbnRyeS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBDb3JyZWN0IElOU05fU1lOQyB0ZXN0LiAgRnJvbQotCVJhbGYgQmFlY2hsZSA8cmFsZkB1bmkta29ibGVuei5kZT4uCi0KLTE5OTktMDgtMDMgIEV0aWVubmUgTG9ycmFpbiAgPGV0aWVubmUubG9ycmFpbkBpYm0ubmV0PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChmMTZfMyk6IE5ldy4gRml4ZXMgMTYgYml0IDMgYnl0ZSBub3AuCi0KLTE5OTktMDgtMDMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYzogSW5kZW50YXRpb24gYW5kIHdoaXRlIHNwYWNlIGNoYW5nZXMuCi0JKGkzODZfaW5kZXhfY2hlY2spOiBOZXcgZnVuY3Rpb24uICBBZGQgSU5GRVJfQUREUl9QUkVGSVggY29kZSwgYnV0Ci0JZG9uJ3QgZW5hYmxlIGl0IGJ5IGRlZmF1bHQuCi0JKGkzODZfaW50ZWxfb3BlcmFuZCk6IFJlbW92ZSByZWR1bmRhbnQgcHJvdG90eXBlLgotCU1vdmUgY2hlY2sgb24gbnVtYmVyIG9mIG1lbW9yeSBvcGVyYW5kcywgYW5kIGkubWVtX29wZXJhbmRzKysKLQkoaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCk6IFRvIGhlcmUuCi0JUmVtb3ZlIGkzODZfaW1tZWRpYXRlIGNvZGUgZnJvbSBoZXJlLiAgUmVtb3ZlIHNwZWNpYWwgY2FzZSBjb2RlCi0JZm9yIGlucHV0IGFuZCBvdXRwdXQgdXNpbmcgKCVkeCkuICBSZW1vdmUgYmFzZS9pbmRleCBjaGVja3MgYW5kCi0JY2FsbCBpMzg2X2luZGV4X2NoZWNrIGluc3RlYWQuICBTYXZlIGluaXRpYWwgb3BlcmFuZF9zdHJpbmcKLQlhcmd1bWVudCBmb3IgZXJyb3IgbWVzc2FnZS4KLQkoaTM4Nl9vcGVyYW5kKTogUmVtb3ZlIHJlZHVuZGFudCBwcm90b3R5cGUuICBNb3ZlIGJhc2UvaW5kZXgKLQljaGVja3MgdG8gaTM4Nl9pbmRleF9jaGVjay4KLQkoaTM4Nl9kaXNwbGFjZW1lbnQpOiBNb3ZlIGludGVsIG1vZGUgY2hlY2sgZm9yIG5vbi16ZXJvCi0JaS5kaXNwX29wZXJhbmQKLQkoaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCk6IFRvIGhlcmUuCi0KLTE5OTktMDctMzAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2xvbmdvcHRzKTogQWRkIC0tbm8tdW5kZWNsYXJlZC1yZWdzIG9wdGlvbi4KLQkoc3BhcmNfaXApOiBXYXJuIGlmICVnMiBvciAlZzMgcmVnaXN0ZXIgaXMgdXNlZCBhbmQgbm90IGNvdmVyZWQKLQlieSAucmVnaXN0ZXIgcHNldWRvLW9wIGlmIC02NCBhbmQgLS1uby11bmRlY2xhcmVkLXJlZ3MuCi0JKHNfcmVnaXN0ZXIsIHNwYXJjX2FkanVzdF9zeW10YWIpOiBOZXcgZnVuY3Rpb25zLgotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2FkanVzdF9zeW10YWIsIHNwYXJjX2FkanVzdF9zeW10YWIpOgotCURlY2xhcmUgc3BhcmNfYWRqdXN0X3N5bXRhYiBhcyB0Y19hZGp1c3Rfc3ltdGFiLgotCSogZG9jL2Mtc3BhcmMudGV4aTogQWRkIGRlc2NyaXB0aW9uIG9mICNpZ25vcmUgc3BlY2lhbCBsaXRlcmFsCi0JZm9yIC5yZWdpc3RlciBwc2V1ZG8tb3AuCi0KLTE5OTktMDctMzAgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRjX2dlbl9yZWxvYyk6ICBSZWNvcmQgdGhlIHZ0YWJsZSBlbnRyeSBpbgotCXRoZSByZWxvY2F0aW9uJ3Mgc2VjdGlvbiBvZmZzZXQuCi0KLTE5OTktMDctMjkgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEZpeCBnZW5lcmljIGVycm9yIGNoZWNrIG92ZXJmbG93IHRlc3QuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHBlKTogQ2hhbmdlICVkIHRvICVsZCwgJXggdG8gJWx4LCBhbmQgY2FzdAotCVhfYWRkX251bWJlciB0byBsb25nLgotCi1XZWQgSnVsIDI4IDAyOjA0OjI0IDE5OTkgICJKZXJyeSBRdWlubiIgPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIEFkZCAnSicgYW5kICdLJyBjb2RlCi0JcHJvY2Vzc2luZy4gCi0KLTE5OTktMDctMjcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgR09ULCBQTFQsIG9yCi0JVlRBQkxFIHJlbG9jYXRpb25zLgotCi0xOTk5LTA3LTIxICBNYXJrIEVsYnJlY2h0ICA8c25vd2JhbGwzQGJpZ2Zvb3QuY29tPgotCi0JKiBjb25maWcvdGUtZ28zMi5oIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQkqIGNvbmZpZy9nbzMyLmNmZzogTGlrZXdpc2UuCi0KLTE5OTktMDctMjEgIEJyYWQgTS4gR2FyY2lhICA8YmdhcmNpYUBmb3JlLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotdnh3b3JrcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA3LTE2ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGRvYy9jLXNwYXJjLnRleGk6IERvY3VtZW50IC5yZWdpc3RlciBhbmQgLm53b3JkIHBzZXVkby1vcHMuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWxsb3cgT0xPMTAgcmVsb2NhdGlvbnMKLQlvbiAtNjQgYW5kIG5vdCBwaWMuCi0JKG91dHB1dF9pbnNuKTogUHV0IE9MTzEwJ3Mgc2Vjb25kYXJ5IGFkZGVuZCBpbnRvIHRjX2ZpeF9kYXRhLgotCShtZF9hcHBseV9maXgzKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19PTE8xMC4KLQkodGNfZ2VuX3JlbG9jKTogUmV0dXJuIHR3byByZWxvY3MgZm9yIE9MTzEwLCBMTzEwIGFuZCBTUEFSQzEzLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRSwKLQlNQVhfUkVMT0NfRVhQQU5TSU9OKTogRGVmaW5lLgotCShUQ19GSVhfVFlQRSwgVENfSU5JVF9GSVhfREFUQSwgVENfRklYX0RBVEFfUFJJTlQpOiBMaWtld2lzZS4KLQotMTk5OS0wNy0xNiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpbnRlbF9mbG9hdF9vcGVyYW5kKTogQWRkIHByb3RvdHlwZSwgbWFrZSBzdGF0aWMuCi0JKG1kX2Fzc2VtYmxlKTogTG9jYWxpemUgKmV4cCB2YXJpYWJsZSB0byBpZiAoZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCkKLQlibG9jay4gIFByaW50IGEgd2FybmluZyBpZiBhbiA4LWJpdCBvciAxNi1iaXQgY29uc3RhbnQKLQlkaXNwbGFjZW1lbnQgb3IgaW1tZWRpYXRlIGlzIHRydW5jYXRlZCBvbiBvdXRwdXQuCi0JKGkzODZfaW1tZWRpYXRlKTogRW5zdXJlIEltbTE2IGlzIGFsd2F5cyBsZWdhbCBmb3IgYSAxNi1iaXQgbW9kZQotCWltbWVkaWF0ZS4KLQkoaTM4Nl9vcGVyYW5kKTogRGlzYWxsb3cgaW1tZWRpYXRlIGp1bXAgYWJzb2x1dGUgb3BlcmFuZC4KLQotMTk5OS0wNy0xNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVtcCB2ZXJzaW9uIG51bWJlciB0byAyLjkuNS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogZHdhcmYyZGJnLmMgKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogRG9uJ3QgYXNzdW1lIHRoYXQgbG9uZyBsb25nCi0Jb3IgJWxseCB3b3JrLgotCi1UaHUgSnVsIDE1IDAyOjQ1OjMwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIuZHdvcmQiIHBzZXVkby1vcC4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBEZXJpdmUgc2l6ZSBvZiBmaXh1cCBmcm9tIHNpemUgb2YgdGhlIG9iamVjdC4KLQotMTk5OS0wNy0xNCAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIHN5bWJvbHMuYyAoZG9sbGFyX2xhYmVsX25hbWUpOiBQcmVwZW5kIExPQ0FMX0xBQkVMX1BSRUZJWCBpZiBpdAotCWlzIGRlZmluZWQuCi0JKiBjb25maWcvdGMtYXJtLmggKExPQ0FMX0xBQkVMX1BSRUZJWCk6IERlZmluZSB0byAnLicgZm9yIEVMRi4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9iZWdpbik6IFNldCBGX1NPRlRGTE9BVCBpbiB0aGUgb3V0cHV0IGZpbGUKLQlpZiAtbW5vLWZwdSB3YXMgZ2l2ZW4uCi0JKHRjX2dlbl9yZWxvYyk6IEZpeCB0eXBvLiAgRGVsZXRlIGJvZ3VzIGNvZGUgcmVsYXRlZCB0byBHT1RQQwotCXJlbG9jcy4KLQkoY29uc19maXhfbmV3X2FybSk6IFJlbW92ZSBtaXNsZWFkaW5nIGNvbW1lbnRzLgotCi0xOTk5LTA3LTE0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IFVzZSBmcmFnIGZpbGUgYW5kIGxpbmUgaW4gcnNfb3JnCi0JZXJyb3IgbWVzc2FnZS4KLQkocmVsYXhfc2VnbWVudCk6IExpa2V3aXNlLiAgQWZ0ZXIgZ2l2aW5nIGEgcnNfb3JnIGVycm9yLCBjb252ZXJ0Ci0JdGhlIGZyYWcgdG8gcnNfYWxpZ24gdG8gYXZvaWQgY2FzY2FkaW5nIGVycm9ycy4KLQotMTk5OS0wNy0xMiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYzogQWRkIHNvbWUgQVRUUklCVVRFX1VOVVNFRC4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBBZGQgQVRUUklCVVRFX1VOVVNFRAotCWFzIGFwcHJvcHJpYXRlLiAgRmlsbCBpbiBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLiAgQWRkIHZhcmlhYmxlCi0JaW5pdGlhbGl6YXRpb25zLiAgQWRkIGNhc3RzLgotCSogZHdhcmYyZGJnLmMgKHByaW50X3N0YXRzKTogQ2hhbmdlIGkgdG8gc2l6ZV90LgotCSogbGlzdGluZy5jIChsaXN0aW5nX2xpc3RpbmcpOiBDaGFuZ2UgbGlzdF9saW5lIHRvIHVuc2lnbmVkIGludC4KLQotMTk5OS0wNy0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpIFtPQkpfRUxGXTogQ2FsbCBTX0lTX0xPQ0FMCi0JcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIFwwMDEgYW5kIFwwMDIgaW4gc3ltYm9sIG5hbWUuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpIFtPQkpfRUxGXTogTGlrZXdpc2UuCi0KLVRodSBKdWwgIDggMTI6MzI6MjMgMTk5OSAgSm9obiBEYXZpZCBBbmdsaW4gPGRhdmVAaGlhdWx5MS5oaWEubnJjLmNhPgotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLWxpbnV4LWdudSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi0xOTk5LTA3LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIERpcmVjdGl2ZXMpOiBEb2N1bWVudCAudGh1bWJfc2V0IGRpcmVjdGl2ZS4gCi0KLTE5OTktMDctMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IFVzZSBzeW1ib2xfZ2V0X29iaigpIHJhdGhlciB0aGFuCi0JYWNjZXNzaW5nIHN5bWJvbFAgZGlyZWN0bHkuCi0KLVR1ZSBKdWwgIDYgMTA6NDE6NDIgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX3N5bWJvbCk6IEFsd2F5cyBwdW50ICIkZ2xvYmFsJCIgc3ltYm9sCi0JZm9yIEVMRi4KLQotMTk5OS0wNy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChBUk1fRVhUX1Y1KTogRGVmaW5lLgotCShBUk1fQVJDSF9WNSwgQVJNX0FSQ0hfVjVUKTogRGVmaW5lLgotCShtZF9iZWdpbik6IERldGVjdCBBUk0gdjUgYXJjaGl0ZWN0dXJlcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IGFybSB2NSBzcGVjaWZpY2F0aW9uLgotCShtZF9zaG93X3VzYWdlKTogRG9jdW1tZW50IC1tYXJtdjUgc3dpdGNoLgotCi0JKiBkb2MvYy1hcm0udGV4aTogRG9jdW1lbnQgLW1hcm12NSBjb21tYW5kIGxpbmUgb3B0aW9uLgotCQotCSogY29uZmlnL3RjLWFybS5jIChkb19hZHJsKTogTmV3IGZ1bmN0aW9uLiAgSW1wbGVtZW50IEFEUkwgcHNldWRvCi0Jb3AuCi0JKHZhbGlkYXRlX2ltbWVkaWF0ZV90d29wYXJ0KTogTmV3IGZ1bmN0aW9uLiAgRGV0ZXJtaW5lIGlmIGEKLQljb25zdGFudCBjYW4gYmUgY29tcHV0ZWQgYnkgdHdvIEFERCBpbnN0cnVjdGlvbnMuCi0JKG91dHB1dF9pbnN0KTogUmVtb3ZlIGl0cyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIC0gaXQgd2FzIG5ldmVyCi0JdXNlZC4KLQkobWRfYXBwbHlfZml4Myk6IFN1cHBvcnQgQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURSwgdXNlZCB0bwotCWltcGxlbWVtdCB0aGUgQURSTCBwc2V1ZG8gb3AuCi0JKHRjX2dlbl9yZWxvYyk6IEdlbmVyYXRlIGEgc3VpdGFibGUgZXJyb3IgbWVzc2FnZSBpZiBhbiBBRFJMCi0JaW5zdHJ1Y3Rpb24gdHJpZXMgdG8gZ2VuZXJhdGUgYSByZWFsIHJlbG9jLgotCi0JKiBkb2MvYy1hcm0udGV4aTogRG9jdW1lbnQgTk9QLCBBRFIgYW5kIEFEUkwgcHNldWRvIG9wcy4KLQotVGh1IEp1bCAgMSAxNTozMzoxMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogQ29udmVydCB0aGUgb3Bjb2RlIGFuZCBhbGwgY29tcGxldGVycwotCWludG8gbG93ZXIgY2FzZS4KLQotMTk5OS0wNi0yNyAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ190ZXh0X3ApOiBVc2UgMS8wIGluc3RlYWQgb2YgdHJ1ZS9mYWxzZSBmb3IKLQlub24gQkZEX0FTU0VNQkxFUiBjYXNlLgotCi0xOTk5LTA2LTI2ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBNYXJrIHdyaXRhYmxlIHNlY3Rpb25zIGFzCi0JZGF0YS4KLQotMTk5OS0wNi0yNiAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IERvbid0IGNhbGwKLQlvdXRfZW5kX3NlcXVlbmNlKCkgd2hlbiB0aGUgYWRkcmVzcyBkZWNyZWFzZXMgZHVlIHRvIGEgbmV3IGZyYWcuCi0JKGdlbl9kaXJfbGlzdCk6IFNldCBscy5maWxlW2ldLmRpciB0byBqICsgMSAobm90IGopIGJlY2F1c2UgZmlsZQotCW51bWJlcmluZyBzdGFydHMgd2l0aCAxLgotCi0xOTk5LTA2LTIzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIC5jb21tIGZvciBFTEYgYW5kIGFsbG93Ci0JLnNlY3Rpb24gZm9yIENPRkYuCi0JKG1jb3JlX3NfdGV4dCk6IENhbGwgb2JqX2VsZl90ZXh0IGZvciBFTEYgdGFyZ2V0LgotCShtY29yZV9zX2RhdGEpOiBDYWxsIG9ial9lbGZfZGF0YSBmb3IgRUxGIHRhcmdldC4KLQkobWNvcmVfc19zZWN0aW9uKTogTm8gbG9uZ2VyIEVMRiBzcGVjaWZpYy4gIENhbGwgb2JqX2NvZmZfc2VjdGlvbgotCWZvciBDT0ZGIHRhcmdldC4KLQkobWNvcmVfc19ic3MpOiBOZXcgZnVuY3Rpb246ICBEdW1wIGxpdGVyYWwgdGFibGUgYmVmb3JlIGNoYW5naW5nCi0Jc2VjdGlvbnMuCi0JKG1jb3JlX3NfY29tbSk6IE5ldyBmdW5jdGlvbjogIER1bXAgbGl0ZXJhbCB0YWJsZSBiZWZvcmUgY2hhbmdpbmcKLQlzZWN0aW9ucy4KLQkKLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uLCBvYmpfZWxmX2RhdGEsIG9ial9lbGZfdGV4dCk6Ci0JTm8gbG9uZ2VyIHN0YXRpYyBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX2NvbW1vbiwgb2JqX2VsZl9kYXRhLCBvYmpfZWxmX3RleHQpOgotCVByb3ZpZGUgcHJvdG90eXBlcyBmb3IgdGhlc2UgZnVuY3Rpb25zLgotCi0xOTk5LTA2LTIyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfdGV4dF9wKTogUmV3cml0ZSBub24gQkZEX0FTU0VNQkxFUiBjYXNlIHRvIHVzZQotCWEgbGlzdCBvZiBuYW1lcywgdG8gdHJ5IG9ial9zZWdtZW50X25hbWUsIGFuZCB0byB0cnkgYWJicmV2aWF0ZWQKLQluYW1lcyB3aGVuIHVzaW5nIENPRkYgd2l0aG91dCBsb25nIHNlY3Rpb24gbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBNb3JlIHVzZSBvZiBzeW1ib2wgYWNjZXNzb3IgZnVuY3Rpb25zLgotCSogY29uZmlnL3RjLWFyYy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWZyMzAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTg2MC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1jb3JlLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW5zMzJrLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1hcmMuYyAoZ2V0X2FyY19leHBfcmVsb2NfdHlwZSk6IENoYW5nZSB1c2VzIG9mCi0Jc3lfdmFsdWUgd2l0aCBhcHByb3ByaWF0ZSBhY2Nlc3NvciBmdW5jdGlvbnMuCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKEFUX1dPUkRfUCk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYyAocmVnX25hbWVfc2VhcmNoKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX2Vjb2ZmX3NldF9leHQpOiBDaGFuZ2UgdXNlcyBvZiBic3ltIHRvCi0JdXNlIHN5bWJvbF9nZXRfYmZkc3ltIGluc3RlYWQuCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2NvbW0pOiBMaWtld2lzZS4KLQotMTk5OS0wNi0yMiAgSm9uYXRoYW4gTGFybW91ciAgPGpsYXJtb3VyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFyYy5jICh0Y19nZW5fcmVsb2MpOiBVc2Ugc3ltYm9sX2dldF9iZmRzeW0gdG8gZ2V0IGF0Ci0JdGhlIHN5bWJvbCwgcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBic3ltIG1lbWJlci4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWQzMHYuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWNvcmUuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXRpYzMwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMjEgMTY6NDU6MTkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGUpOiBSZW5hbWVkIGZyb20gZWxmMzJfaHBwYV9yZWxvY190eXBlLgotCShocHBhX2dlbl9yZWxvY190eXBlKTogQ29uZGl0aW9uYWxpemUgb24gQkZENjQuCi0JKHRjX2dlbl9yZWxvYyk6IFJlLWVuYWJsZSBFTEYgcmVsb2NhdGlvbnMuCi0JKiB0Yy1ocHBhLmggKFRBUkdFVF9GT1JNQVQpOiBIYW5kbGUgZWxmNjQtaHBwYSBmb3JtYXQuCi0KLTE5OTktMDYtMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGxkc3RfZXh0ZW5kKTogQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkCi0Jd2FybmluZy4KLQkoZG9fbGRzdCk6IE1vdmUgYXNzaWdubWVudCBvdXQgb2YgaWYgY29uZGl0aW9uLgotCShtZF9hcHBseV9maXgzKTogQWRkIGNhc3RzIHRvIGF2b2lkIHByaW50ZiBmb3JtYXQgd2FybmluZ3MuICBBZGQKLQlwYXJlbnRoZXNlcyB0byBhdm9pZCB3YXJuaW5nLgotCi0xOTk5LTA2LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV9hZGp1c3Rfc3ltdGFiKTogVXNlIHN5bWJvbF9nZXRfYmZkc3ltKCkKLQltYWNybyB0byBnZXQgYXQgdGhlIEJGRCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgR0FTIHN5bWJvbC4KLQotMTk5OS0wNi0xOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYzogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBMaWtld2lzZS4KLQotRnJpIEp1biAxOCAxNDozNDoxOCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYzogR2VuZXJhbCBjbGVhbnVwcyBvZiBFTEYgc3VwcG9ydC4gIE5vIG1vcmUgc3BhY2VzCi0JYW5kIHN1YnNwYWNlcyBmb3IgRUxGLgotCShHREJfREVCVUdfU1BBQ0VfTkFNRSk6IERlbGV0ZSBkZWZpbml0aW9uIGZvciBFTEYuCi0JKEdEQl9TVFJJTkdTX1NVQlNQQUNFX05BTUUpOiBMaWtld2lzZS4KLQkoR0RCX1NZTUJPTFNfU1VCU1BBQ0VfTkFNRSk6IExpa2V3aXNlCi0JKFVOV0lORF9TRUNUSU9OX05BTUUpOiBMaWtld2lzZS4KLQkoc3BhY2Uvc3Vic3BhY2UgcmVsYXRlZCBzdHJ1Y3R1cmVzKTogQ29uZGl0aW9uYWxpemUgZGVmaW5pdGlvbnMKLQlvbiBPQkpfU09NLgotCShzcGFjZS9zdWJzcGFjZSBkaXJlY3RpdmVzIGFuZCBzdXBwb3J0IHJvdXRpbmVzKTogQ29uZGl0aW9uYWxpemUKLQlkZWZpbml0aW9ucyBhbmQgcmVmZXJlbmNlcy91c2VzIG9uIE9CSl9TT00uCi0JKGxhYmVsX3N5bWJvbF9zdHJ1Y3QpOiBGb3IgRUxGLCB0cmFjayB0aGUgc3ltYm9sJ3Mgc2VnbWVudC4gIEZvcgotCVNPTSB0cmFjayBpdHMgc3BhY2UuCi0JKHBhX2RlZmluZV9sYWJlbCwgcGFfdW5kZWZpbmVfbGFiZWwsIHBhX2dldF9sYWJlbCk6IENvcnJlc3BvbmRpbmcKLQljaGFuZ2VzLgotCShVU0VfQUxJQVNFUyk6IEtpbGwgZm9yIGJvdGggU09NICYgRUxGLgotCShwYV9kZWZfc3Vic3BhY2VzLCBwYV9kZWZfc3BhY2VzKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCShwYV9zcGFjZSwgcGFfc3Vic3BhY2UpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKHBhX3NwYWNlc19iZWdpbik6IENvcnJlc3BvbmRpbmcgY2hhZ25lcy4KLQkobWRfYmVnaW4pOiBEbyBub3QgbXVjayBhcm91bmQgd2l0aCBzcGFjZS9zdWJzcGFjZSBzdHVmZiBmb3IKLQlPQkpfRUxGLgotCShtZF9hcHBseV9maXgpOiBUZW1wb3JhcmlseSBkaXNhYmxlIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1ZmYKLQlmb3IgT0JKX0VMRi4KLQkodGNfZ2VuX3JlbG9jKTogVGVtcG9yYXJpbHkgZGlzYWJsZSByZWxvY2F0aW9uIGdlbmVyYXRpb24gZm9yCi0JT0JKX0VMRgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBTaW1pbGFybHkuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAodGh1bWJfc2V0KTogTmV3IHBzZXVkbyBvcC4KLQkodGV4dCwgZGF0YSwgc2VjdGlvbik6IE92ZXJyaWRlIHRoZXNlIHBzZXVkbyBvcHMgd2l0aCBBUk0KLQlzcGVjaWZpYyB2ZXJzaW9ucy4KLQkoc190aHVtYl9zZXQpOiBOZXcgZnVuY3Rpb246IFBlcmZvcm0gdGhlIHNhbWUgYXMgYSAuc2V0IHBzZXVkbwotCW9wLCBidXQgYWxzbyBtYXJrIHRoZSBhbGlhcydlZCBzeW1ib2wgYXMgYmVpbmcgYSBUaHVtYgotCWZ1bmN0aW9uLgotCShhcm1fc190ZXh0KTogTmV3IGZ1bmN0aW9uOiBQZXJmb3JtIHRoZSBzYW1lIGFzIHRoZSAudGV4dAotCXBzZXVkbyBvcCwgYnV0IGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUgY2hhbmdpbmcKLQlzZWN0aW9ucy4gCi0JKGFybV9zX2RhdGEpOiBOZXcgZnVuY3Rpb246IFBlcmZvcm0gdGhlIHNhbWUgYXMgdGhlIC5kYXRhCi0JcHNldWRvIG9wLCBidXQgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGJlZm9yZSBjaGFuZ2luZwotCXNlY3Rpb25zLiAKLQkoYXJtX3Nfc2VjdGlvbik6IE5ldyBmdW5jdGlvbjogUGVyZm9ybSB0aGUgc2FtZSBhcyB0aGUKLQkuc2VjdGlvbiBwc2V1ZG8gb3AsIGJ1dCBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgYmVmb3JlIGNoYW5naW5nIAotCXNlY3Rpb25zLiAKLQkoYXJtX2NsZWFudXApOiBEbyBub3QgcmVzZXQgdGhlIGN1cnJlbnQgc2VjdGlvbiBiZWZvcmUgZHVtcGluZwotCXRoZSBsaXRlcmFsIHBvb2wuCi0KLTE5OTktMDYtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2xvbmdvcHRzKTogRml4IE9QVElPTl9XQVJOX1VOTUFUQ0hFRCBhbmQKLQlPUFRJT05fTk9fV0FSTl9VTk1BVENIRUQgZW50cmllcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogR2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgYW4gdW5yZWNvZ25pc2VkCi0Jb3B0aW9uIGlzIGVuY291bnRlcmVkLgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChkb19ub3RfaWdub3JlX2hhc2gpOiBOZXcgdmFyaWFibGUuCi0JKGdldF9vcGVyYW5kcyk6IFdoZW4gcGFyc2luZyBhbiBleHByZXNzaW9uIGFmdGVyIGFuICdAJyBzeW1ib2wKLQloYXMgYmVlbiBkZXRlY3RlZCwgZG8gbm90IGlnbm9yZSAnIycgc3ltYm9scy4KLQkobWRfb3BlcmFuZCk6IE9ubHkgaWdub3JlICcjJyBzeW1ib2xzIGlmIGRvX25vdF9pZ25vcmVfaGFzaCBpcwotCWZhbHNlLiAKLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEsuIFJpY2hhcmQgUGl4bGV5IDxyaWNoQG5vaXIuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAocHBjLSotdnh3b3JrcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTEyICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCBoYW5kbGluZyBvZiBHT1RQQyByZWxvY3MuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFJhdGhlciB0aGFuIG5ldmVyIHJlZHVjaW5nIHJlbG9jCi0Jd2hpY2ggcmVmZXIgdG8gc3ltYm9scyBpbiBsaW5rb25jZSBzZWN0aW9ucywgcGVybWl0IHJlZHVjaW5nIHRoZQotCXJlbG9jcyBpZiB0aGUgc3ltYm9sIGlzIGxvY2FsLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfdGV4dF9wKTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoc3Vic2VnX3RleHRfcCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGRvX2FsaWduKTogVXNlIHN1YnNlZ190ZXh0X3AgdG8gc2V0IHRoZSBkZWZhdWx0IGZpbGwuCi0JKiB3cml0ZS5jIChzdWJzZWdzX2ZpbmlzaCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9tYXliZV90ZXh0KTogRG9uJ3QgZGVmaW5lLgotCShtZF9kb19hbGlnbik6IFVzZSBzdWJzZWdfdGV4dF9wIHRvIHNldCB0aGUgZGVmYXVsdCBmaWxsLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQotMTk5OS0wNi0xMiAgRGF2aWQgTydCcmllbiAgPG9icmllbkBmcmVlYnNkLm9yZz4KLQotCSogY29uZmlndXJlLmluOiAoaVszNDU2XTg2LSotZnJlZWJzZCopOiBOb3cgZGVmYXVsdHMgdG8gRUxGLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZHdhcmYyZGJnLmM6IEluY2x1ZGUgZWxmL2R3YXJmMi5oIHdpdGggIiIsIG5vdCA8Pi4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ltbWVkaWF0ZSk6IFJlbW92ZSB1bnVzZWQgbGFiZWwKLQlzZWdfdW5pbXBsZW1lbnRlZC4KLQotCSogc3RydWMtc3ltYm9sLmg6IFB1dCBsb2NhbF9zeW1ib2wgY29kZSBpbiBpZmRlZiBCRkRfQVNTRU1CTEVSLgotCSogc3ltYm9scy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogUmVmZXIgZGlyZWN0bHkgdG8KLQlzeV9uZXh0IGZpZWxkIHdoZW4gdGFraW5nIGFkZHJlc3MsIHJhdGhlciB0aGFuIHN5bWJvbF9uZXh0LgotCi0JKiBkd2FyZjJkYmcuYzogQ2hhbmdlIGJmZF92bWEgdG8gYWRkcmVzc1QgYW5kIGJmZF9zaWduZWRfdm1hIHRvCi0Jb2Zmc2V0VC4KLQkob3V0X3NldF9hZGRyKTogRG9uJ3QgdXNlIEJZVEVTX1BFUl9BRERSRVNTLiAgSW5zdGVhZCwgZ2V0IHRoZQotCXZhbHVlIGZyb20gdGhlIG91dHB1dCBmaWxlIGFyY2hpdGVjdHVyZS4KLQkoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBJZmRlZiBCRkRfQVNTRU1CTEVSIHNwZWNpZmljIGNvZGUuCi0JKiBkd2FyZjJkYmcuaDogQ2hhbmdlIGJmZF92bWEgdG8gYWRkcmVzc1QuCi0KLTE5OTktMDYtMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkd2FyZjJkYmcuaDogVXNlIFBBUkFNUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0KLTE5OTktMDYtMTEgIE1hcnRpbiBEb3JleSAgPG1kb3JleUBtYWRnZS5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIGZvciBpOTYwIEVMRi4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHNfbGVhZnByb2MpOiBEb24ndCBjYWxsIHRjX3NldF9iYWxfb2ZfY2FsIGlmCi0JT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4KTogU2ltcGxpZnkgQkZEX0FTU0VNQkxFUiBoYW5kbGluZy4KLQotMTk5OS0wNi0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IFJlbW92ZSBwdXNoc2VjdGlvbiBhbmQKLQlwb3BzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHJlbG9jIHN3aXRjaC4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBPbmx5IGRlY2xhcmUgaW5lc2NhcGUgaWYKLQlRVU9URVNfSU5fSU5TTi4KLQotCSogaXRibC1vcHMuYyAoaXRibF9kaXNhc3NlbWJsZSk6IENoYW5nZSBzcHJpbnRmIGZvcm1hdCBzdHJpbmdzIHRvCi0JbWF0Y2ggcGFyYW1ldGVycy4KLQkoZmluZF9lbnRyeV9ieXZhbCk6IEFkZCBwYXJlbnMgdG8gYXZvaWQgd2FybmluZy4KLQotCSogYXMuYzogSWYgSEFWRV9JVEJMX0NQVSwgaW5jbHVkZSAiaXRibC1vcHMuaCIuCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBEb24ndCBwZXJtaXQgc3VidHJhY3Rpb24gb2YKLQl1bmRlZmluZWQgc3ltYm9scy4KLQotMTk5OS0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0gICAgICAgICogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRG9uJ3QgdXNlIHNpZGUtZWZmZWN0IGV4cHJlc3Npb24KLQl3aXRoIGlzb2N0YWwuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzeW50aGV0aXplX3NldHV3LCBzeW50aGV0aXplX3NldHN3LAotCXN5bnRoZXRpemVfc2V0eCk6IE5ldyBmdW5jdGlvbnMuCi0JKG1kX2Fzc2VtYmxlKTogQnJva2VuIHRoZSBzcGVjaWFsIGNhc2VzIGludG8gdGhlIGFib3ZlCi0JZnVuY3Rpb25zLiBNYWtlIGNvbXBpbGVyIGhhcHB5IGlmIHNpemVvZihiZmRfdm1hKT09NC4KLQlGaXggc2V0aGkgZ2VuZXJhdGVkIGZyb20gc2V0L3NldHV3LiBJZiBpbnN0cnVjdGlvbnMgaGF2ZSBhIHJlbGxvYywKLQlhbHdheXMgY2xlYXIgdGhlIGZpZWxkcyB0byBiZSByZWxvY2F0ZWQgaW4gdGhlIG9wY29kZS4KLQkoc3BhcmNfaXApOiBSZW1vdmUgc3BlY2lhbF9jYXNlIGdsb2JhbCB2YXJpYWJsZS4KLQotMTk5OS0wNi0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSm9obiBXLiBXb3puYWNrIDxqd296bmFja0Bjb25jZW50cmljLm5ldD46Ci0JKiBpdGJsLW9wcy5jIChpdGJsX2dldF9yZWdfdmFsKTogQWRkIHB2YWwgcGFyYW1ldGVyLiAgUmV0dXJuCi0JaW5kaWNhdGlvbiBvZiBzdWNjZXNzIHJhdGhlciB0aGFuIGEgdmFsdWUuCi0JKGl0YmxfZ2V0X3ZhbCk6IExpa2V3aXNlLgotCShpdGJsX2dldF9maWVsZCk6IFVzZSBzdHJjc3BuLiAgQ2hhbmdlIGRlbGltaXRlcnMgdG8gaW5jbHVkZQotCXBhcmVucy4KLQkqIGl0Ymwtb3BzLmggKGl0YmxfZ2V0X3JlZ192YWwpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGl0YmxfZ2V0X3ZhbCk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFVwZGF0ZSBjYWxsIHRvIGl0YmxfZ2V0X3JlZ192YWwuCi0KLQkqIHN5bWJvbHMuYyAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IENvbnZlcnQgbG9jYWwgc3ltYm9scyB0bwotCXJlZ3VsYXIgc3ltYm9scy4KLQotMTk5OS0wNi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgQVJNOTIwIGFuZAotCUFSTTkyMHQuIAotCi0xOTk5LTA2LTA3ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hc3NlbWJsZSk6IEZpeCB1cCBzZXR4LCBzdXBwb3J0IHNldHN3LgotCU9wdGltaXplIHNldCBpZiBzaXplb2YoYmZkX3ZtYSkgPT0gNjQuCi0JKHNwYXJjX2lwKTogRml4IHNldGhpIC0gd2l0aG91dCAlaGkoKSBpdCBzaG91bGQgZ2VuZXJhdGUKLQlSX1NQQVJDXzIyIHJlbG9jLCBub3QgUl9TUEFSQ19ISTIyLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDMjIuCi0KLTE5OTktMDYtMDcgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2JlZ2luKTogSGFuZGxlIG5hdGl2ZSB3b3Jkc2l6ZSBhbGlhc2VzLgotCShzX25jb25zKTogTmV3IGZ1bmN0aW9uLgotCShuYXRpdmVfb3BfdGFibGUpOiBOZXcgdGFibGUuCi0JKHNwYXJjX2lwKTogQmUgbW9yZSBzdHJpY3Qgb24gJWhpKCkgZXRjLjsgcHJlcGFyZSBhc3NlbWJsZXIgZm9yCi0JUl9TUEFSQ19PTE8xMCBoYW5kbGluZy4KLQotTW9uIEp1biAgNyAxMDoyMjoxNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBleHByLmggKHN0cnVjdCBleHByZXNzaW9uUyk6IFJldmVydCBsYXN0IGNoYW5nZTsgd2lkZW4gWF9vcC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9iZWdpbik6IENoZWNrIHRoZSBmaWVsZCBpcyB3aWRlIGVub3VnaC4KLQotTW9uIEp1biAgNyAxMToyNToxNiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCBjb25maWcvdGMtZnIzMC5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCBjb25maWcvdGMtZnIzMC5oLgotCShUQVJHX0VOVl9IRklMRVMpOiBBZGQgY29uZmlnL3RlLWVwb2MtcGUuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBJbiBNUkkgbW9kZSBpZiBjYWxsZWQgYXMKLQlgY29tbW9uJyBwYXNzIG9uIHRvIHNfbXJpX2NvbW1vbi4KLQkoZWxmX3BzZXVkb190YWJsZSk6IFBhc3MgMSB0byBvYmpfZWxmX2NvbW1vbiBmb3IgYGNvbW1vbicuIAotCi0xOTk5LTA2LTA2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBEb24ndCBmcmVlIHRoZSByZXR1cm4KLQl2YWx1ZSBvZiBkZW1hbmRfY29weV9DX3N0cmluZy4KLQotMTk5OS0wNi0wNSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyZGJnLmMgKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogTWlycm9yIHRoZSBzZWN0aW9uIHN5bWJvbAotCWNyZWF0aW9uIGxvZ2ljIGZyb20gb2JqX2VsZl9jcmVhdGVfc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWIpOiBBZGQgcHVzaHNlY3Rpb24vcG9wc2VjdGlvbi4KLQkoc2VjdGlvbl9zdGFjayk6IE5ldy4KLQkoc3BlY2lhbF9zZWN0aW9ucyk6IE1ha2UgY29uc3QuCi0JKG9ial9lbGZfc2VjdGlvbik6IEd1dCBhbmQgcmV3cml0ZSBwYXJzaW5nLgotCShvYmpfZWxmX2NoYW5nZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIGJyb2tlbiBvdXQgb2Ygb2JqX2VsZl9zZWN0aW9uLgotCShvYmpfZWxmX3BhcnNlX3NlY3Rpb25fbGV0dGVycyk6IExpa2V3aXNlLgotCShvYmpfZWxmX3NlY3Rpb25fd29yZCk6IExpa2V3aXNlLgotCShvYmpfZWxmX3NlY3Rpb25fdHlwZSk6IExpa2V3aXNlLgotCShvYmpfZWxmX3ByZXZpb3VzKTogVHJlYXQgYXMgYSB0b2dnbGUuCi0JKG9ial9lbGZfcG9wc2VjdGlvbik6IE5ldy4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NlY3Rpb25fd29yZCk6IFRha2Ugc3RyK2xlbiBub3QgcHRyX3N0ci4KLQkocHBjX3NlY3Rpb25fdHlwZSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXBwYy5oOiBMaWtld2lzZS4KLQotCSogZXhwci5oIChzdHJ1Y3QgZXhwcmVzc2lvblMpOiBEb24ndCBtYWtlIFhfb3AgYSBiaXRmaWVsZC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBVcGRhdGUgZm9yIHN5bWJvbCBoYW5kbGluZyBjaGFuZ2VzLgotCShtZF9hcHBseV9maXgpIFtjYXNlIEdQUkVMXTogVXNlIG5vd19zZWcgaW5zdGVhZCBvZiBhYnNvbHV0ZV9zZWN0aW9uLgotCShsb2FkX2V4cHJlc3Npb24sIGVtaXRfaXJfbG9hZCwgZW1pdF9sb2Fkc3RvcmUsIGVtaXRfanNyam1wKTogTGlrZXdpc2UuCi0KLTE5OTktMDYtMDUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jICgqKTogQ29udmVydCB0byBLJlIgKyBwcm90b3R5cGVzLgotCShkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IEtpbGwgdW51c2VkIHZhcmlhYmxlcy4KLQkoZHdhcmYyX2ZpbmlzaCk6IExpa2V3aXNlLgotCShkd2FyZjJfd2hlcmUpOiBMaWtld2lzZS4KLQkoZHdhcmYyX2RpcmVjdGl2ZV9maWxlKTogSWYgd2UndmUgb25seSBnb3QgYSBzdHJpbmcsCi0JaGFuZCBvZmYgdG8gc19hcHBfZmlsZS4KLQkqIGVjb2ZmLmM6IE1vdmUgdGhlIGluY2x1ZGUgb2YgZWNvZmYuaC4KLQkqIHN5bWJvbHMuaCAoU19JU19GVU5DVElPTik6IFByb3RvdHlwZS4KLQotCSogcmVhZC5jIChMRVhfSEFTSCk6IFN1cHBseSBhIGRlZmF1bHQuCi0JKGxleF90eXBlKTogVXNlIGl0LgotCShzX2dsb2JsKTogVXBkYXRlIGBjJyBhZnRlciBza2lwcGluZyB3aGl0ZXNwYWNlLgotCSogcmVhZC5oIChMRVhfRU5EX05BTUUsIGlzX25hbWVfZW5kZXIpOiBOZXcuCi0JKiBleHByLmMgKGdldF9zeW1ib2xfZW5kKTogUmVzcGVjdCBpdC4KLQotMTk5OS0wNi0wNCAgTWFyayBLbGVpbiA8bWtsZWluQGRpcy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2JlZ2luKTogQ29udmVydCBsb2NhbCBzeW1ib2wgZHVtbXlfc3ltYm9sCi0JdG8gcmVhbCBpZiBPQkpfU09NCi0JKHRjX2dlbl9yZWxvYyk6IFN0aWxsIG5lZWQgYmZkX2Fic19zeW1ib2wgaW4gc29tZSByZWxvY3MuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjZ2VuLmM6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0JKiBjb25maWcvdGMtbTMyci5jOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtYXJtLmg6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0JKiBjb25maWcvdGMtYXJtLmM6IExpa2V3aXNlLgotCShzeW1ib2xfbWFrZV9lbXB0eSk6IFJlbW92ZS4gIEp1c3QgdXNlIHN5bWJvbF9jcmVhdGUuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX3NldF90Yyk6IENvcnJlY3QgbmFtZS4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSgkKE9CSlMpKTogRG9uJ3QgZGVwZW5kIHVwb24gc3RydWMtc3ltYm9sLmguCi0JKC5kZXAxLCAudGNkZXAsIC5vYmpkZXApOiBDcmVhdGUgaXRibC1wYXJzZS5oLgotCSogZGVwLWluLnNlZDogRG9uJ3QgcmVtb3ZlIHN0cnVjLXN5bWJvbC5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoU3ltYm9scyk6IERlc2NyaWJlIGNoYW5nZXMgaW4gc3ltYm9sCi0JaGFuZGxpbmcuCi0KLTE5OTktMDYtMDMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IFVzZSBzZWN0aW9uX3N5bWJvbAotCWluc3RlYWQgb2YgZG9pbmcgdGhlIHdvcmsgYnkgaGFuZC4KLQotMTk5OS0wNi0wMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChJTklUSUFMX1NUQVRFKTogTmV3IG1hY3JvIGVuY2Fwc3VsYXRpbmcgaW5pdGlhbAotCXN0YXRlIG9mIGxpbmUgc3RhdGUtbWFjaGluZS4KLQkoc3RydWN0IGxzKTogQ29sbGVjdCBEV0FSRjIgbGluZSBzdGF0ZS1tYWNoaW5lIHN0YXRlIGluIG5ldyBtZW1iZXIKLQlTTS4gIEFkZCBtZW1iZXIgRU1QVFlfU0VRVUVOQ0UgdG8ga2VlcCB0cmFjayBpZiBhIGNvZGUgc2VxdWVuY2UKLQlyZXN1bHRlZCBpbiBhbnkgRFdBUkYyIGRpcmVjdGl2ZXMuCi0JKHJlc2V0X3N0YXRlX21hY2hpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKG91dF9lbmRfc2VxdWVuY2UpOiBEaXR0by4KLQkoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBXaGVuIHN3aXRjaGluZyBzZWN0aW9ucyBvciBzd2l0Y2hpbmcgdG8gYQotCWxvd2VyIHRleHQgYWRkcmVzcywgY2FsbCBvdXRfZW5kX3NlcXVlbmNlKCkgZmlyc3QgdG8gdGVybWluYXRlIHRoZQotCXByZXZpb3VzIGNvZGUgc2VxdWVuY2UgYXMgY29kZSBzZXF1ZW5jZXMgTVVTVCBoYXZlIG1vbm90b25pY2FsbHkKLQlpbmNyZWFzaW5nIGFkZHJlc3Nlcy4KLQkoZHdhcmYyX2ZpbmlzaCk6IENhbGwgb3V0X2VuZF9zZXF1ZW5jZSgpIGluc3RlYWQgb2Ygb3BlbiBjb2RpbmcgaXQuCi0KLTE5OTktMDYtMDMgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIG9wdGlvbiAtZ2R3YXJmMiB0byBhbGxvdyByZXF1ZXN0aW5nCi0JRFdBUkYyIGRlYnVnIGluZm8gKGxpbmUgaW5mb3JtYXRpb24gb25seSwgYXQgdGhpcyBwb2ludCkuCi0JKiBhcy5oOiBVcGRhdGUgY29tbWVudCBhYm91dCBzdXBwb3J0ZWQgZGVidWcgZm9ybWF0cy4KLQkqIGR3YXJmMmRiZy5jLCBkd2FyZjJkYmcuaDogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuYW0gKEdBU19DRklMRVMsIEhGSUxFUywgR0VORVJJQ19PQkpTKTogQWRkIHRoZW0uCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IERvbid0IHVzZSBbIGZvciBwYXJlbnMgaWYgd2Ugd2FudCBhbiBpbmRleCBvcC4KLQkob3BfZW5jb2RpbmcpOiBTd2l0Y2ggWyBpbnRvIE9faW5kZXgsIGlmIGRlc2lyZWQuCi0JKG9wX3JhbmspOiBSZW51bWJlciB3aXRoIE9faW5kZXggb24gYm90dG9tLgotCShleHByKTogSWYgT19pbmRleCwgbWF0Y2ggY2xvc2luZyBicmFja2V0LgotCSogZXhwci5oIChPX2luZGV4KTogTmV3LgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENvbmRpdGlvbmFsbHkgYWxsb3cgbWF0Y2hlZCAiCi0JaW4gbGluZXMgcGFzc2VkIHRvIG1kX2Fzc2VtYmxlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkIGBjb21tb24nLgotCi0xOTk5LTA2LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBzdG9yaW5nIGxvY2FsIHN5bWJvbHMgaW4gYSBzbWFsbCBzdHJ1Y3R1cmUgdG8gc2F2ZQotCW1lbW9yeSB3aGVuIGFzc2VtYmxpbmcgbGFyZ2UgZmlsZXMuCi0JKiBhcy5oOiBEb24ndCBpbmNsdWRlIHN0cnVjLXN5bWJvbC5oLgotCShzeW1ib2xTKTogQWRkIHR5cGVkZWYuCi0JKiBzeW1ib2xzLmM6IEluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKGxvY2FsX2hhc2gpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzYXZlX3N5bWJvbF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgZnJvbSBzeW1ib2xfY3JlYXRlLgotCShzeW1ib2xfY3JlYXRlKTogQ2FsbCBzYXZlX3N5bWJvbF9uYW1lLgotCShsb2NhbF9zeW1ib2xfY291bnQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb2NhbF9zeW1ib2xfY29udmVyc2lvbl9jb3VudCk6IExpa2V3aXNlLgotCShMT0NBTF9TWU1CT0xfQ0hFQ0spOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9tYWtlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobG9jYWxfc3ltYm9sX2NvbnZlcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2xvbik6IEhhbmRsZSBsb2NhbCBzeW1ib2xzLiAgQ3JlYXRlIGxvY2FsIHN5bWJvbCBmb3IgbG9jYWwKLQlsYWJlbCBuYW1lLgotCShzeW1ib2xfdGFibGVfaW5zZXJ0KTogSGFuZGxlIGxvY2FsIHN5bWJvbHMuCi0JKHN5bWJvbF9maW5kX29yX21ha2UpOiBDcmVhdGUgbG9jYWwgc3ltYm9sIGZvciBsb2NhbCBsYWJlbCBuYW1lLgotCShzeW1ib2xfZmluZF9iYXNlKTogQ2hlY2sgZm9yIGxvY2FsIHN5bWJvbC4KLQkoc3ltYm9sX2FwcGVuZCwgc3ltYm9sX2luc2VydCk6IENoZWNrIGZvciBsb2NhbCBzeW1ib2xzLgotCShzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycywgc3ltYm9sX3JlbW92ZSk6IExpa2V3aXNlLgotCSh2ZXJpZnlfc3ltYm9sX2NoYWluKTogTGlrZXdpc2UuCi0JKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBMaWtld2lzZS4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgbG9jYWwgc3ltYm9scy4KLQkocmVzb2x2ZV9sb2NhbF9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShyZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IEhhbmRsZSBsb2NhbCBzeW1ib2xzLgotCShTX0lTX0ZVTkNUSU9OLCBTX0lTX0VYVEVSTkFMLCBTX0lTX1dFQUssIFNfSVNfQ09NTU9OKTogTGlrZXdpc2UuCi0JKFNfSVNfREVGSU5FRCwgU19JU19ERUJVRywgU19JU19MT0NBTCwgU19HRVRfTkFNRSk6IExpa2V3aXNlLgotCShTX0dFVF9TRUdNRU5ULCBTX1NFVF9TRUdNRU5ULCBTX1NFVF9FWFRFUk5BTCk6IExpa2V3aXNlLgotCShTX0NMRUFSX0VYVEVSTkFMLCBTX1NFVF9XRUFLLCBTX1NFVF9OQU1FKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9wcmV2aW91cywgc3ltYm9sX25leHQpOiBOZXcgZnVuY3Rpb25zLgotCShzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24pOiBMaWtld2lzZS4KLQkoc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9zZXRfZnJhZywgc3ltYm9sX2dldF9mcmFnKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3VzZWQsIHN5bWJvbF9jbGVhcl91c2VkLCBzeW1ib2xfdXNlZF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MsIHN5bWJvbF91c2VkX2luX3JlbG9jX3ApOiBMaWtld2lzZS4KLQkoc3ltYm9sX21hcmtfbXJpX2NvbW1vbiwgc3ltYm9sX2NsZWFyX21yaV9jb21tb24pOiBMaWtld2lzZS4KLQkoc3ltYm9sX21yaV9jb21tb25fcCk6IExpa2V3aXNlLgotCShzeW1ib2xfbWFya193cml0dGVuLCBzeW1ib2xfY2xlYXJfd3JpdHRlbik6IExpa2V3aXNlLgotCShzeW1ib2xfd3JpdHRlbl9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3Jlc29sdmVkLCBzeW1ib2xfcmVzb2x2ZWRfcCk6IExpa2V3aXNlLgotCShzeW1ib2xfc2VjdGlvbl9wLCBzeW1ib2xfZXF1YXRlZF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9jb25zdGFudF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9nZXRfYmZkc3ltLCBzeW1ib2xfc2V0X2JmZHN5bSk6IExpa2V3aXNlLgotCShzeW1ib2xfZ2V0X29iaiwgc3ltYm9sX3NldF9vYmopOiBMaWtld2lzZS4KLQkoc3ltYm9sX2dldF90Yywgc3ltYm9sX3NldF90Yyk6IExpa2V3aXNlLgotCShzeW1ib2xfYmVnaW4pOiBJbml0aWFsaXplIGxvY2FsX2hhc2guCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMuCi0JKHN5bWJvbF9wcmludF9zdGF0aXN0aWNzKTogUHJpbnQgbG9jYWwgc3ltYm9sIHN0YXRpc3RpY3MuCi0JKiBzeW1ib2xzLmg6IEluY2x1ZGUgInN0cnVjLXN5bWJvbC5oIiBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQlEZWNsYXJlIG5ldyBzeW1ib2xzLmMgZnVuY3Rpb25zLiAgTW92ZSBtYW55IGRlY2xhcmF0aW9ucyBoZXJlIGZyb20KLQlzdHJ1Yy1zeW1ib2wuaC4KLQkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IERlZmluZSBpZiBuZWVkZWQuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IERvbid0IHNldC4KLQkoc3RydWN0IHN5bWJvbCk6IE1vdmUgYnN5bSB0byBtYWtlIGl0IGNsZWFybHkgdGhlIGZpcnN0IGZpZWxkLgotCVJlbW92ZSBUQVJHRVRfU1lNQk9MX0ZJRUxEUy4KLQkoc3ltYm9sUyk6IERvbid0IHR5cGVkZWYuCi0JKHN0cnVjdCBicm9rZW5fd29yZCk6IFJlbW92ZS4KLQkoTl9UWVBFX3NlZywgc2VnX05fVFlQRSk6IE1vdmUgdG8gc3ltYm9sLmguCi0JKFNFR01FTlRfVE9fU1lNQk9MX1RZUEUsIE5fUkVHSVNURVIpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2luc2VydCwgc3ltYm9sX3JlbW92ZSk6IExpa2V3aXNlLgotCShzeW1ib2xfcHJldmlvdXMsIHN5bWJvbF9hcHBlbmQpOiBMaWtld2lzZS4KLQkodmVyaWZ5X3N5bWJvbF9jaGFpbiwgdmVyaWZ5X3N5bWJvbF9jaGFpbl8yKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBsb2NhbF9zeW1ib2wpOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9jb252ZXJ0ZWRfcCwgbG9jYWxfc3ltYm9sX21hcmtfY29udmVydGVkKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfcmVzb2x2ZWRfcCwgbG9jYWxfc3ltYm9sX21hcmtfcmVzb2x2ZWQpOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9nZXRfZnJhZywgbG9jYWxfc3ltYm9sX3NldF9mcmFnKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfZ2V0X3JlYWxfc3ltYm9sKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfc2V0X3JlYWxfc3ltYm9sKTogRGVmaW5lLgotCURlZmluZS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCByZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogRGVmaW5lLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogQWRkIGxvY2FsIGZpZWxkLiAgSWYKLQlFQ09GRl9ERUJVR0dJTkcsIGFkZCBFQ09GRiBmaWVsZHMuCi0JKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUywgVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvb2JqLW11bHRpLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogQWRkIGxvY2FsIGZpZWxkLiAgSWYKLQlFQ09GRl9ERUJVR0dJTkcsIGFkZCBFQ09GRiBmaWVsZHMuCi0JKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUywgVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKEVDT0ZGX0RFQlVHX1RBUkdFVF9TWU1CT0xfRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLW1jb3JlLmg6IERvbid0IGluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgbWNvcmVfdGNfc3kpOiBEZWZpbmUuCi0JKFRDX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUuCi0JKiBNYW55IGZpbGVzOiBVc2Ugc3ltYm9sUyBpbnN0ZWFkIG9mIHN0cnVjdCBzeW1ib2wuICBVc2UgbmV3Ci0JYWNjZXNzb3IgZnVuY3Rpb25zIHJhdGhlciB0aGFuIHJlZmVycmluZyB0byBzeW1ib2xTIGZpZWxkcwotCWRpcmVjdGx5LgotCi0JKiByZWFkLmMgKHNfbXJpX2NvbW1vbik6IERvbid0IGFkZCBpbiB2YWx1ZSBvZiBsaW5lX2xhYmVsLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gd2hlbgotCWNoZWNraW5nIGZvciBTRUNfTElOS19PTkNFLgotCi0JKiBjb25maWcvdGMtc2guaCAoc2hfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCi0JKiBhcHAuYyAoaW5wdXRfYnVmZmVyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXBwX3B1c2gpOiBTYXZlIHNhdmVkX2lucHV0IGluIGFsbG9jYXRlZCBidWZmZXIuCi0JKGFwcF9wb3ApOiBSZXN0b3JlZCBzYXZlZF9pbnB1dC4KLQkoZG9fc2NydWJfY2hhcnMpOiBDaGFuZ2UgZ2V0IHBhcmFtZXRlciB0byB0YWtlIGNoYXIgKiBhbmQgaW50IGFzCi0JYXJndW1lbnRzLiAgQ2hhbmdlIEdFVCBtYWNybyB0byBwYXNzIGlucHV0X2J1ZmZlciB0byBnZXQKLQlmdW5jdGlvbi4gIERvbid0IHNhdmUgaW5wdXQgaW50byBhbGxvY2F0ZWQgYnVmZmVyLgotCSogYXMuaCAoZG9fc2NydWJfY2hhcnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfZ2V0KTogQ2hhbmdlIHRvIHRha2UgY2hhciAqIGFuZCBpbnQuCi0JUmVhZCBkYXRhIGludG8gcGFzc2VkIGluIGJ1ZmZlci4gIFJlbW92ZSBzdGF0aWMgYnVmZmVyLgotCSogcmVhZC5jIChzY3J1Yl9mcm9tX3N0cmluZyk6IENoYW5nZSB0byB0YWtlIGNoYXIgKiBhbmQgaW50LiAgQ29weQotCWRhdGEgaW50byBwYXNzZWQgaW4gYnVmZmVyLgotCi0JKiBoYXNoLmg6IE5lYXRlbi4gIERlY2xhcmUgaGFzaF90cmF2ZXJzZS4KLQkqIGhhc2guYzogQ29tcGxldGUgcmV3cml0ZSBiYXNlZCBvbiBCRkQgaGFzaGluZyBjb2RlLgotCSogZ2FzcC5jIChjaHVua3NpemUpOiBOZXcgdmFyaWFibGUuCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IENhbGwgaGFzaF9qYW0gd2l0aCBOVUxMIHJhdGhlciB0aGFuCi0JaGFzaF9kZWxldGUuCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEFkZCBwaXBlbGluZSBvZmZzZXQgaW50byByZWxvYwotCWFkZGVuZCB1bmxlc3MgdGhlIHRhcmdldCB1c2VzIGFuIG9sZCBBQkkuCi0KLU1vbiBNYXkgMjQgMTM6MzY6NTUgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCS1XY2hhci1zdWJzY3JpcHRzIGNsZWFudXAKLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogVXNlIHVuc2lnbmVkIGNoYXIgdmFyaWFibGUsIHNvCi0gCWNhbGxzIHRvIGlzYXNjaWksaXNjbnRybCBhcmUgY29ycmVjdC4KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBDYXN0IGFyZyB0byBpc2RpZ2l0LCBldC4gYWwuIHdpdGgKLQkodW5zaWduZWQgY2hhcikuCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZW50LGVjb2ZmX3N0YWIpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsbWlwczE2X2lwKTogRGl0dG8uCi0JKG15X2dldFNtYWxsRXhwcmVzc2lvbixnZXRfbnVtYmVyLHNfbWlwc19lbnQpOiBEaXR0by4KLQotMTk5OS0wNS0yOCAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQG1hdGVtYXRpay5zdS5zZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENoZWNrIGZvciBkaXNhbGxvd2VkIGluZGV4IHJlZ2lzdGVyCi0Jd2lkdGggZm9yIENvbGRmaXJlLgotCShhcmNoX2NvbGRmaXJlX3ApOiBOZXcgI2RlZmluZS4KLQkobTY4a19pcCwgbTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgYXJjaF9jb2xkZmlyZV9wLgotCi0xOTk5LTA1LTI4ICBMaW51cyBOb3JkYmVyZyAgPGxpbnVzLm5vcmRiZXJnQGNhbml0LnNlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbnN0YWxsX29wZXJhbmQpOiBBZGQgcGxhY2VzIGBuJywgYG8nLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWRkIGZvcm1hdHMgYEUnLCBgRycsIGBIJy4KLQkoaW5zdGFsbF9vcGVyYW5kKTogQWRkIHBsYWNlIGBOJy4KLQkoaW5pdF90YWJsZSk6IEFkZCByZWdpc3RlcnMgQUNDLCBNQUNTUiwgTUFTSy4KLQotCSogY29uZmlnL202OGstcGFyc2UuaCAobTY4a19yZWdpc3Rlcik6IEFkZCBBQ0MsIE1BQ1NSLCBNQVNLLgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBDaGFuZ2UgbWNmNTIwMCAtLT4gbWNmLgotCShhcmNocyk6IEFkZCBtY2Y1MjA2ZSwgbWNmNTMwNy4KLQkobTY4a19pcCk6IEFkZCBmb3JtYXQgYHUnLgotCShpbnN0YWxsX29wZXJhbmQpOiBBZGQgcGxhY2UgYG0nLCBgTScsIGBoJy4KLQkoaW5pdF90YWJsZSk6IEFkZCB1cHBlci9sb3dlciByZWdpc3RlcnMuCi0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKG02OGtfcmVnaXN0ZXIpOiBBZGQgdXBwZXIvbG93ZXIgcmVnaXN0ZXJzLgotCi0xOTk5LTA1LTI4ICBNYXJ0aW4gRG9yZXkgIDxtZG9yZXlAbWFkZ2UuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jOiBTZXZlcmFsIG1pbm9yIGNoYW5nZXMgdG8gYWRkIEVMRiBhbmQKLQlCRkRfQVNTRU1CTEVSIHN1cHBvcnQuCi0JKiBjb25maWcvdGMtaTk2MC5oOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZS5pbiAoaTk2MC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTI1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBPbmx5IGRvIDE5OTktMDUtMTcgZnhfcGNyZWwKLQlyZWxvYyBjaGFuZ2VzIHdoZW4gZGVmaW5lZChCRkRfQVNTRU1CTEVSKS4KLQotMTk5OS0wNS0xNyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBSZW1vdmUgRiBhbmQgTUFQIG1hY3Jvcy4KLQotCSogd3JpdGUuYyAod3JpdGVfcHJpbnRfc3RhdGlzdGljcyk6IE91dHB1dCB0byBmaWxlLCBub3Qgc3RkZXJyLgotCi0JKiBleHByLmMgKGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyLDY0KTogUHJvdG90eXBlLgotCi0JKiByZWFkLmMgKHNfbGNvbW1faW50ZXJuYWwsIHNpemVvZl9zbGViMTI4LCBzaXplb2ZfdWxlYjEyOCwKLQlvdXRwdXRfc2xlYjEyOCwgb3V0cHV0X3VsZWIxMjgsIG91dHB1dF9iaWdfc2xlYjEyOCwKLQlvdXRwdXRfYmlnX3VsZWIxMjgsIG91dHB1dF9iaWdfbGViMTI4KTogUHJvdG90eXBlLgotCShvdXRwdXRfYmlnX3NsZWIxMjgsIG91dHB1dF9iaWdfdWxlYjEyOCk6IE1ha2UgaW5saW5lLgotCShvdXRwdXRfYmlnX2xlYjEyOCk6IFJlbW92ZSBpbmxpbmUKLQotCUZyb20gTWFjaWVqIFcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogQ29udmVydCBCRkRfUkVMT0NfMTYgd2l0aAotCWZ4X3BjcmVsIHNldCB0byBCRkRfUkVMT0NfMTZfUENSRUwuICBTaW1pbGFybHkgZm9yIEJGRF9SRUxPQ184LgotCUhhbmRsZSBCRkRfUkVMT0NfMTZfUENSRUwgYW5kIEJGRF9SRUxPQ184X1BDUkVMLiAgUmV0dXJuIGNoYW5nZWQKLQl2YWx1ZSBmb3IgY29ycmVjdCBvdmVyZmxvdyBjaGVjayBpbiB3cml0ZS5jOmZpeHVwX3NlZ21lbnQuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogTW92ZSBiaXRmaWVsZCBvdmVyZmxvdyBjaGVja3MgdG8gYWZ0ZXIKLQl0aGUgbWRfYXBwbHlfZml4IGNhbGwuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IE1lbnRpb24gbWRfYXBwbHlfZml4IG1vZGlmeWluZwotCXZhbHVlVCAqdmFsIGFyZ3VtZW50LgotCi1GcmkgTWF5IDE0IDEwOjUyOjEzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBDb3JyZWN0bHkgcm91bmQgYQotCWRlbm9ybWFsaXplZCBudW1iZXIuICBGaXggb2ZmLWJ5LW9uZSBpbiByYW5nZSBjaGVja2luZyBmb3IKLQlleHBvbmVudCBpbiBhIGRlbm9ybWFsLiAKLQotMTk5OS0wNS0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKHBhcnNlX3JlZyk6IEFjY2VwdCAnc3AnIGFzIGEgdmFsaWQgcmVnaXN0ZXIKLQluYW1lLiAKLQotVGh1IE1heSAxMyAwOTo0Njo1OSAxOTk5ICBKb2VsIFNoZXJyaWxsIChqb2VsQE9BUmNvcnAuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1ydGVtc2VsZiosIHNoLSotcnRlbXNlbGYqKTogTmV3IHRhcmdldHMuCi0KLTE5OTktMDUtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoSW52TWVtKTogTmV3IGZsYWcuICBBZGQgdG8gQW55TWVtLgotCShSZXZlcnNlUmVnUmVnbWVtKTogUmVtb3ZlLgotCShJbW1FeHQpOiBOZXcgZmxhZy4gIFJlbnVtYmVyIHNvbWUgb2YgdGhlIG9wY29kZV9tb2RpZmllciBiaXRzLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBUZXN0IGZvciBQSUlJIFNJTUQgYW5kIEFNRAotCTNETm93ISB2aWEgSW1tRXh0IG9wY29kZV9tb2RpZmllci4gIFJlbW92ZSBSZXZlcnNlUmVnUmVnbWVtCi0Ja2x1ZGdlLgotCi0JRnJvbSAgRG91ZyBMZWRmb3JkIDxkbGVkZm9yZEByZWRoYXQuY29tPgotCSogY29uZmlnL3RjLWkzODYuaCAoUmVnWE1NKTogTmV3IGZvciBQL0lJSS4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IEFkZCBzdXBwb3J0IGZvciBQL0lJSS4KLQotU2F0IE1heSAgOCAyMzoyODo1MCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IFJlY29nbml6ZSAtbXBwYzY0YnJpZGdlLgotCShtZF9iZWdpbik6IEFsbG93IHBwYzMyIGluc25zIGluIHBwYzY0YnJpZGdlIG1vZGUuCi0JKHBwY19pbnNlcnRfb3BlcmFuZCk6IEFjY2VwdCBTSUdOT1BUIGluIHBwYzY0IG1vZGUuCi0KLVRodSBNYXkgIDYgMjM6MTM6MzkgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbW1lZGlhdGUpOiBTa2lwIHdoaXRlc3BhY2UgYmVmb3JlCi0JY29tcGxhaW5pbmcgYWJvdXQganVuayBhZnRlciBleHByZXNzaW9uLgotCShpMzg2X2Rpc3BsYWNlbWVudCk6IExpa2V3aXNlLgotCi1UaHUgTWF5ICA2IDE5OjUwOjE0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2ZpbmRfYmFzZSk6IFVzZSBtZW1jcHkgaW5zdGVhZCBvZiBzdHJjcHkuCi0JRG9uJ3QgY29weSBiZWZvcmUgZG93bmNhc2VpbmcuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIHRjLW02OGsuYzogSW5jbHVkZSBlbGYvbTY4ay5oLgotICAgICAgICAobTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IE5ldyByb3V0aW5lLgotICAgICAgICAqIHRjLW02OGsuaCAoZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcgbTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZyk6Ci0gICAgICAgIERlZmluZS4KLSAKLU1vbiBNYXkgIDMgMTA6MjY6MDMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgMjIgYml0IGZtdCBpbnNuIGxpa2UgYQotCTE3IGJpdCBmbXQgaW5zbi4KLQotMTk5OS0wNC0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1jb3JlX3Nfc2VjdGlvbik6IER1bXAgbGl0ZXJhbHMgYmVmb3JlCi0JY2hhbmdpbmcgc2VjdGlvbi4KLQotMTk5OS0wNC0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX2FwcGx5X2ZpeDMpOiBJbnNlcnQgcmVsb2MgYWRkZW5kIGludG8gaW5zbgotCWZvciBDT0ZGL1BFIHBvcnQuCi0KLU1vbiBBcHIgMjYgMTI6MzQ6MzcgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuaCAoVENfRklYX1RZUEUpOiBEZWxldGUsIGNnZW4gZmllbGRzIG1vdmVkIHRvIHdyaXRlLmguCi0JKFRDX0lOSVRfRklYX0RBVEEpOiBEZWxldGUuCi0JKiBjb25maWcvdGMtbTMyci5oIChUQ19GSVhfVFlQRSk6IERlbGV0ZSwgY2dlbiBmaWVsZHMgbW92ZWQgdG8gd3JpdGUuaC4KLQkoVENfSU5JVF9GSVhfREFUQSk6IERlbGV0ZS4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBOZXcgbWVtYmVyIGZ4X2NnZW4sIGlmZGVmIFVTSU5HX0NHRU4uCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBmeF9jZ2VuIG1lbWJlci4KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwLGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHApOiBVcGRhdGUuCi0JKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUuCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZS4KLQkobWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogVXBkYXRlLgotCShGWF9PUElORk9fUl9UWVBFKTogVXBkYXRlLgotCi0JKiBmcmFncy5jIChmcmFnX3ZhcixmcmFnX3ZhcmlhbnQpOiBJbml0aWFsaXplIGZyX2NnZW4gaGVyZS4KLQkqIGNvbmZpZy90Yy1mcjMwLmggKFRDX0ZSQUdfSU5JVCk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKFRDX0ZSQUdfSU5JVCk6IERlbGV0ZS4KLQkqIGZyYWdzLmggKHN0cnVjdCBmcmFnKTogTWFrZSBvcGluZGV4LCBvcGluZm8gaW50cy4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAoRlhfT1BJTkZPX1JfVFlQRSk6IERlbGV0ZSwgdW51c2VkLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWVkIGZ1bmN0aW9uIGZyb20KLQltZF9hcHBseV9maXguIAotCShtZF9hcHBseV9maXgzKTogRG8gbm90IGZpeCB1cCBhYnNvbHV0ZSByZWxvY2F0aW9ucyBhZ2FpbnN0Ci0Jc3ltYm9saWMgdmFsdWVzLgotCi0JKiBjb25maWcvdGMtbWNvcmUuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotMTk5OS0wNC0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBpbnRlcmNlcHRzIGZvciBzZWN0aW9uCi0JY2hhbmdlcyBhbmQgZGF0YS1pbi10ZXh0IGRpcmVjdGl2ZXMuCi0JKG1jb3JlX2NvbnMpOiBOZXcgZnVuY3Rpb246IGludGVyY2VwdCBjb25zKCkgb3BlcmF0aW9ucy4KLQkobWNvcmVfZmxvYXRfY29ucyk6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IGZsb2F0X2NvbnMoKQotCW9wZXJhdGlvbnMuIAotCShtY29yZV9zdHJpbmdlcik6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IHN0cmluZ2VyKCkgb3BlcmF0aW9ucy4KLQotMTk5OS0wNC0xOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IENoYW5nZSBnZW5lcmF0ZV9hc21fbGluZW5vIGZpZWxkIHRvCi0JdGFrZSBubyBwYXJhbWV0ZXJzLgotCSogY29uZmlnL29iai1lY29mZi5oIChPQkpfR0VORVJBVEVfQVNNX0xJTkVOTyk6IERvbid0IGRlZmluZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGZpbmRfb3Bjb2RlX21hdGNoKTogQWRkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaC4KLQkoZmluZF9tYWNyb19tYXRjaCk6IExpa2V3aXNlLgotCShsb2FkX2V4cHJlc3Npb24pOiBQYXJlbnRoZXNpemUgJiYgd2l0aGluIHx8LgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lLgotCi0xOTk5LTA0LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIG92ZXJyaWRlcyBmb3IgLmJzcwotCS50ZXh0IC5kYXRhIC5zZWN0aW9uIHBzZXVkbyBvcHMuCi0JKG1jb3JlX3Nfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCi0JKG1jb3JlX3NfdGV4dCk6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCi0JKG1jb3JlX3NfZGF0YSk6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCi0KLTE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzMyYml0bW9kZSk6IE5ldy4KLQkobWRfYmVnaW4pOiBTZXQgbWlwc18zMmJpdG1vZGUgaWYgbmVlZGVkLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogRG9uJ3Qgc2V0IEVGX01JUFNfQVJDSC4KLQlTZXQgRUZfTUlQU18zMkJJVE1PREUuCi0KLUZyaSBBcHIgMTYgMTI6MjY6MzkgMTk5OSAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3NlY3Rpb25fc3ltYm9sKTogRml4IHR5cG8gaW4gcHJldmlvdXMKLQljaGFuZ2UuCi0KLTE5OTktMDQtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUgdG8gMS4KLQotVGh1IEFwciAxNSAxNjo1MjowOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfZ2V0X2Fic29sdXRlX2V4cmVzc2lvbik6IFRyeSB0byBoYW5kbGUgIjUgJXIzIiAKLQlleHByZXNzaW9ucyBjb3JyZWN0bHkuCi0KLQotMTk5OS0wNC0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBTZXQgRUZfTUlQU19BUkNILgotCi1Nb24gQXByIDEyIDIzOjQ1OjA3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnMycpOiBOZXcgY2FzZSBmb3IgUEEyLjAgZm1weWZhZGQKLQlhbmQgZm1weW5mYWRkIGluc3RydWN0aW9ucy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZW52aXJvbik6IERlY2xhcmUgaXQsIGlmIG5lZWRlZC4KLQkqIGFzLmMgKGR1bXBfc3RhdGlzdGljcyk6IERvbid0IGRlY2xhcmUgZW52aXJvbi4KLQkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW1tZWRpYXRlKTogQWNjZXB0IEBHT1QgcmVsb2NhdGlvbnMuCi0JKGkzODZfZGlzcGxhY2VtZW50KTogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciByZXBsYWNlbWVudCBidWZmZXIuCi0JQ2xlYW4gdXAgcmVwbGFjZW1lbnQgYnVmZmVyIGluaXRpYWxpemF0aW9uLgotCi0xOTk5LTA0LTExICBCb2IgTWFuc29uIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPjoKLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IERvbid0IGNyZWF0ZSBhIG5ldyBzeW1ib2wgaWYgb25lCi0JYWxyZWFkeSBleGlzdHM7IGluc3RlYWQsIHVzZSB0aGUgZXhpc3Rpbmcgb25lLCBidXQgc2V0IGl0cyBzZWdtZW50Ci0JYW5kIGZyYWcgZGF0YSBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zZWN0aW9uX3N5bWJvbCk6IExpa2V3aXNlLgotCi1TYXQgQXByIDEwIDIwOjEwOjAyIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IENhbGwgYXNfYmFkIGluc3RlYWQgb2YgYWJvcnQuCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCByb3V0aW5lcyBmb3IgTUNvcmUKLQlhc3NlbWJsZXIuCi0JKiBjb25maWcvdGMtbWNvcmUuaDogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBNQ29yZSBhc3NlbWJsZXIuIAotCSogY29uZmlnL29iai1jb2ZmLmM6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXQuCi0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogZG9jL2FsbC50ZXhpOiBTZXQgTUNPUkUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgTUNvcmUgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0JCi0JKiB3cml0ZS5oOiBQcmV2ZW50IG11bHRpcGxlIGluY2x1c2lvbi4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFzaW50bC5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQkqIGFzLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUgc3lzdGVtCi0JZG9lcyBub3QgZGVmaW5lIGl0LgotCSogZ2FzcC5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlIHN5c3RlbQotCWRvZXMgbm90IGRlZmluZSBpdC4KLQotCSogTWFrZWZpbGUuYW0gKG02OGstcGFyc2UuYyk6IElmIGNvbmZpZ3VyaW5nIGluIHRoZSBzb3VyY2UKLQlkaXJlY3RvcnksIGNvcHkgbTY4ay1wYXJzZS55IGludG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBiZWZvcmUKLQlydW5uaW5nIHlsd3JhcCwgdG8gcmVtb3ZlIHNwdXJpb3VzIGRpZmZlcmVuY2VzIHdoZW4gZ2VuZXJhdGluZwotCXNuYXBzaG90cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBKdXN0IGFsbG9jYXRlIHRoZSBudW1iZXIgb2YKLQlieXRlcyBuZWNlc3NhcnksIHJhdGhlciB0aGFuIGFsd2F5cyBhbGxvY2F0aW5nIDEwMjQuCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKiByZWFkLmMgKGdlbmVyYXRlX2xpbmVub19kZWJ1Zyk6IEFkZCBjYXNlcyB0byBzd2l0Y2guICBSZWluZGVudC4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfc2NhbGUpOiBBZGQgcmV0dXJuIHZhbHVlLgotCShidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB0ZW1wX2Rpc3AyLgotCShpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHdhcm5pbmcuCi0JKGkzODZfaW50ZWxfb3BlcmFuZCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgZW5kX29mX29wZXJhbmRfc3RyaW5nLgotCShpMzg2X29wZXJhbmQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG9wZXJhbmRfbW9kaWZpZXIuCi0JKGkzODZfb3BlcmFuZCk6IEFkZCBwYXJlbnMgdG8gYXZvaWQgd2FybmluZy4KLQotMTk5OS0wNC0wNCAgRG9uIEJvd21hbiA8ZG9uQHBpeHNjaS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG1pcHMqLSotdnh3b3JrcyogdGFyZ2V0OyBoYXZlIGl0IGRlZmluZQotCU1JUFNfU1RBQlNfRUxGLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy90ZS1lcG9jLXBlLmg6IE5ldyBmaWxlLiAgRGVmaW5lIG1hY3JvcyBzcGVjaWZpYyB0bwotCWFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGNvbmZpZy90Yy1hcm0uaDogU2VsZWN0IGVwb2MtcGUtYXJtIHRhcmdldCBmb3JtYXQgaWYgY29uZmlndXJlZAotCWZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0KLU1vbiBNYXIgMjkgMTA6MTU6NDAgQ1NUIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiB0Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6ICBBZGp1c3QgdmFsdWUgZm9yIGxpbmtvbmNlIHNlY3Rpb25zLgotCi1XZWQgTWFyIDI0IDE0OjExOjEwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IENsZWFuIHVwIGNvZGUgdG8KLQlkZXRlY3QgIixuIiB3aXRob3V0IGEgY29uZGl0aW9uLgotCShwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0cik6IExpa2V3aXNlLgotCi0KLVR1ZSBNYXIgMjMgMTE6Mjg6MjMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd+Jyk6IFRoZSBjb25kaXRpb24gZm9yIGEgYnJhbmNoIG9uIGJpdAotCWluc3RydWN0aW9uIGlzIGVuY29kZWQgd2l0aCBvbmUgYml0LgotCi0KLTE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogTWVudGlvbiB0aGF0Ci0JbGluZV9zZXBhcmF0b3JfY2hhcnMgc2hvdWxkIG5vdCBpbmNsdWRlIG5ld2xpbmUuICBGcm9tIHRoaQotCTx0dG5AbWluZ2xlLmdsdWcub3JnPi4KLQotMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gbTMycl9jZ2VuX2NwdV9vcGVuLgotCi1TdW4gTWFyIDIxIDE4OjA4OjE4IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWFscGhhLmMgKG1kX2Fzc2VtYmxlKTogQWxsb3cgJzYnIGluIGFuIG9wY29kZS4KLQotVGh1IE1hciAxOCAxMDo1NTozMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ2EnKTogRG8gbm90IGNhbGwgcGFfcGFyc2VfLi4uX2NtcHN1Yl9jbXBsdHIuCi0KLQotVGh1IE1hciAxOCAwMjozMDowNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ2QnKTogRG8gbm90IGFsbG93ICIsbiIuCi0JCi0xOTk5LTAzLTE1ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogQ2hhbmdlICctJyBiYWNrIHRvIGEgc3ltYm9sIGNoYXIKLQlzbyB3ZSBjYW4gdXNlIG11bHRpcGxlIG9wY29kZXMgb24gYSBsaW5lIGFnYWluLgotCi0JKiBjb25maWcvdGMtZDMwdi5jOiBCeSBkZWZhdWx0LCB3YXJuIGlmIGEgc3ltYm9sIGhhcwotCXRoZSBzYW1lIG5hbWUgYXMgYSByZWdpc3Rlci4gIFBsdXMgc29tZSBtaW5vcgotCXVwZGF0ZXMgZnJvbSB0aGUgYnJhbmNoLgotCi0xOTk5LTAzLTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogSGFuZGxlIEJGRF9SRUxPQ184LAotCUJGRF9SRUxPQ18xNiBhbmQgQkZEX1JFTE9DXzY0LgotCi0xOTk5LTAzLTEyICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGV4cHIuYyAoZXhwcik6IEFkZCBtaXNzaW5nIGVsc2UuCi0KLTE5OTktMDMtMTIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ1BVX1RZUEVTKTogQWRkIGZyMzAuCi0JKGNnZW4ubyk6IEFkZCAkKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIGRlcGVuZGVuY3kuCi0JKGZyMzAsbTMyciBkZXBlbmRlbmNpZXMpOiBVcGRhdGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9yZWNvcmRfZml4dXApOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCi0JKGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHApOiBEaXR0by4KLQkoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBDYWxsIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtLgotCShnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogRGl0dG8uICBVcGRhdGUgY2FsbCB0byBzZXRfdm1hX29wZXJhbmQuCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQkobWRfY29udmVydF9mcmFnKTogQ2FsbCBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bS4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCi0JKG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGl0dG8uCi0KLTE5OTktMDMtMDkgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCBtZXNzYWdlLgotCi0xOTk5LTAzLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIFN5bnRheCk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoZXMKLQlhbmQgTERSIHJlZyw9PGV4cHI+IGluc3RydWN0aW9uLgotCi0JKiBjb25maWcvdGMtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciAtbWNwdT1hcm04MTAsIC1tY3B1PWFybTkgYW5kCi0JLW1jcHU9YXJtOXRkbWkuCi0KLUZyaSBGZWIgMTkgMDk6MzY6MzAgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNLUNoYXJzKTogRml4IHR5cG8gaW4gdXNlIG9mICdAJy4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVRoaXMgcGF0Y2ggd2FzIGNyZWF0ZWQgYnk6IFNjb3R0IEJhbWJyb3VnaAotCTxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0JCi0JKiBhcHAuYzogCi0JICBTcGVjaWFsIGNhc2VkICdAJyBjaGFyYWN0ZXIuICBUaGUgJ0AnIGNoYXJhY3RlciBpcyB1c2VkIGFzIHRoZQotCSAgQVJNIGFzc2VtYmxlciBjb21tZW50IGNoYXJhY3RlciwgYXMgYSBzcGVjaWFsIGNoYXJhY3RlciAKLQkgIGFuZCBpbiBFTEYgLnN5bXZlciBwc2V1ZG8tb3AncywgYW5kIGFzIGEgc3BlY2lhbCBjaGFyYWN0ZXIgaW4KLQkgIC50eXBlIGFuZCAuc2VjdGlvbiBwc2V1ZG8tb3BzLgotCShzeW12ZXJfcHNldWRvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3ltdmVyX3N0YXRlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3RydWN0IGFwcF9zYXZlKTogQWRkIGZpZWxkICdzeW12ZXJfc3RhdGUnLgotCShhcHBfcHVzaCk6IFNhdmUgZ2xvYmFsIHN5bXZlcl9zdGF0ZSBpbnQgc3RydWN0IGFwcF9zYXZlLgotCShhcHBfcG9wKTogUmVzdG9yZSBnbG9iYWwgc3ltdmVyX3N0YXRlIGZyb20gc3RydWN0IGFwcF9zYXZlLgotICAJKGRvX3NjcnViX2NoYXJzKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mICdAJyBjaGFyYWN0ZXIgaW4KLQkuc3ltdmVyIHBzZXVkby1vcHMuIAotCi0JKiBjb25maWd1cmUuaW46IE1vZGlmaWVkIHRvIHJlY29nbml6ZSBhcm12KiB1bmFtZSBzeW50YXggZnJvbSBBUk0KLQlMaW51eCBrZXJuZWwuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgJyUnIGFzIHdlbGwgYXMgJ0AnIGFzCi0JYSBwcmVmaXggdG8gdGhlIHNlY3Rpb24ncyB0eXBlLgotCShvYmpfZWxmX3R5cGUpOiBBbGxvdyAnJScgYXMgd2VsbCBhcyAnQCcgYW5kICcjJyBhcyBwcmVmaXhlcyB0bwotCXRoZSB0eXBlJ3MgdHlwZW5hbWUuCi0KLQkqIGNvbmZpZy90Yy1hcm0uaDogQWRkIHN1cHBvcnQgZm9yIFBJQyBnZW5lcmF0aW9uOgotCShwaWNfY29kZSk6IE5ldyBib29sZWFuLgotCShvYmpfcmVsb2NhdGVfZXh0ZXJuKTogRGVmaW5lLgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUKLQkoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZS4KLQkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmaW5lLgotCQotCSogY29uZmlnL3RjLWFybS5jOiBBZGQgc3VwcG9ydCBmb3IgUElDIGdlbmVyYXRpb246Ci0JKGxpbmVfc2VwZXJhdG9yX2NoYXJzKTogQWxsb3cgJzsnIGFzIGEgc2VwZXJhdG9yIGZvciBMaW51eC4KLQkoaXNfaW1tZWRpYXRlX3ByZWZpeCk6IE5ldyBtYWNyby4KLQkoYXJtX3BhcnNlX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShzX2FybV9lbGZfY29ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZG9fYnJhbmNoKTogU3BlY2lhbCBjYXNlIGZvciBCRkRfUkVMT0NfQVJNX1BMVDMyLgotCShtZF91bmRlZmluZWRfc3ltYm9sKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciB0aGUgR2xvYmFsIE9mZnNldAotCSAgVGFibGUncyBzeW1ib2wuCi0JKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgUElDIHJlbG9jcy4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIFBJQyByZWxvY3MuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAnLWsnIGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8KLQkgIGVuYWJsZSBQSUMgZ2VuZXJhdGlvbi4KLQkoY29uc19maXhfbmV3X2FybSk6IE5ldyBmdW5jdGlvbi4KLQkoc19hcm1fZWxmX2NvbnMpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBGZWIgMTYgMTY6MzE6NTMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50cyBmb3IgdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2luY2x1ZGUubTQ6IExpa2V3aXNlLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTE1ICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcDogY2FzZSAnbycpOiBGaXggYXNzZXJ0aW9uIGZhaWx1cmUgZm9yCi0Jbm9uLWNvbnN0YW50IG9mZnNldCBmcm9tIGEgYmFzZSByZWdpc3Rlci4KLQotMTk5OS0wMi0xNCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQHJhZWJ1cm4ub3JnPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvd191c2FnZSk6IFB1dCBcIGJlZm9yZSBuZXdsaW5lIGluCi0Jc3RyaW5ncyBhbHdheXMuCi0KLVNhdCBGZWIgMTMgMTQ6MTA6MTAgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGNwdV90eXBlcyk6IEVuYWJsZSBFVjYgUEFMY29kZSB3aXRoIC1tMjEyNjQuCi0JKGVtaXRfaW5zbik6IExvb2sgZm9yIHBjLXJlbGF0aXZlIGFuZCBuby1vdmVyZmxvdyBzcGVjaWZpZXJzIG9uCi0JaW50ZXJuYWwgcmVsb2NhdGlvbiB0eXBlcy4KLQotMTk5OS0wMi0xMyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBkb2MvYy1taXBzLnRleGkgKE1JUFMgT3B0cyk6IFVwZGF0ZWQgbGlzdCBvZiAtbU5OTk4gYW5kCi0JLW1jcHU9Tk5OTiBmbGFncy4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogUmVtb3ZlIGFsbCB0aGUgbWlwc19OTk5OIHZhcmlhYmxlczsganVzdCB1c2UKLQltaXBzX2NwdSBpbnN0ZWFkLgotCShtaXBzXzQ2NTAsIG1pcHNfNDAxMCwgbWlwc180MTAwKTogVmFyaWFibGVzIHJlbW92ZWQuCi0JKGhpbG9faW50ZXJsb2NrcywgZ3ByX2ludGVybG9ja3MsIGFwcGVuZF9pbnNuLCBtYWNyb19idWlsZCwgbWFjcm8sCi0JbWFjcm8yLCBtaXBzMTZfbWFjcm8sIG1pcHNfaXApOiBUZXN0IG1pcHNfY3B1LCBub3QgdGhlIG1pcHNfTk5OTgotCXZhcmlhYmxlcy4KLQkobWRfYmVnaW4pOiBEb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nIHRoZSBtaXBzX05OTk4gdmFyaWFibGVzOwotCW1pcHNfY3B1IGlzIHNldCwgYW5kIHRoYXQncyBnb29kIGVub3VnaCBub3cuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhdmUgdGhlIC1tTk5OTiBvcHRpb25zIHNldCBtaXBzX2NwdSBpbnN0ZWFkIG9mCi0JdGhlIG1pcHNfTk5OTiB2YXJpYWJsZS4gIFRoZSAtbm8tbU5OTk4gZmxhZ3MgYXJlIG5vdyBuby1vcHMuCi0JKHNob3cpOiBOZXcgZnVuY3Rpb24sIHRvIGhhbmRsZSB3cmFwcGluZyBpbiB0aGUgQ1BVIGxpc3RzLgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlIGxpc3RzIG9mIC1tY3B1IGFuZCAtbU5OTk4gc3dpdGNoZXMuCi0KLVNhdCBGZWIgMTMgMDA6MTc6MjYgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbnRlbF9vcGVyYW5kKTogSWdub3JlIGBTSE9SVCcgcmF0aGVyCi0JdGhhbiB0cmVhdCBhcyBhbiBpbW1lZGlhdGUgc3BlY2lmaWVyLgotCi1UaHUgRmViIDExIDE2OjE4OjMxIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFByb3RvdHlwZSBtYW55IGZ1bmN0aW9ucy4KLQkoc2V0X2ludGVsX3N5bnRheCk6IEFjY2VwdCBgcHJlZml4Jy9gbm9wcmVmaXgnIHNwZWNpZmllcnMuCi0JKGkzODZfaW1tZWRpYXRlKTogUmVtb3ZlIHVudXNlZCBzZWNvbmQgYXJndW1lbnQuCi0JKGkzODZfaW50ZWxfb3BlcmFuZCk6IEZpeCBpMzg2X2lzX3JlZyB0eXBvLgotCShpMzg2X29wZXJhbmQpOiBVc2UgYWxsb3dfbmFrZWRfcmVnLgotCShvdXRwdXRfaW52YWxpZCk6IE1ha2Ugb3BlcmFuZCBpbnQgZm9yIEsmUi4KLQotVGh1IEZlYiAxMSAxMToyMTowMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9hc19uZXdfU09VUkNFUyk6IFVuY29tbWVudC0tZml4ZWQgYnkgYXV0b21ha2UKLQlwYXRjaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IENoYW5nZSBjZ2VuLW9wYy5oIHRvIGNnZW4tZGVzYy5oLgotCShjZ2VuLm8pOiBEaXR0by4KLQkoRVhUUkFfYXNfbmV3X1NPVVJDRVMpOiBDb21tZW50IG91dC4KLQkoLnRjZGVwKTogPGFyY2g+LW9wYy5oIHJlbmFtZWQgdG8gPGFyY2g+LWRlc2MuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTMuICBSZWRvIHVzaW5nX2NnZW4gaGFuZGxpbmcuCi0JRGVsZXRlIGNhbGwgdG8gQU1fQ1lHV0lOMzIuICBSZXBsYWNlIEFNX0VYRUVYVCB3aXRoIEFDX0VYRUVYVC4KLQkoQUNfT1VUUFVUKTogPGFyY2g+LW9wYy5oIHJlbmFtZWQgdG8gPGFyY2g+LWRlc2MuaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBjZ2VuLmM6IEluY2x1ZGUgY2dlbi1kZXNjLmgsIG5vdCBjZ2VuLW9wYy5oLgotCSgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKGdhc19jZ2VuX2NwdV9kZXNjKTogUmVuYW1lZCBmcm9tIGdhc19jZ2VuX29wY29kZV9kZXNjLgotCUNHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCi0JQ0dFTl9PUEVSQU5EX0FUVFIgcmVuYW1lZCB0byBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRS4KLQkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwKTogUmVtb3ZlIHVubmVjZXNzYXJ5ICE9IDAgdGVzdC4KLQkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERpdHRvLgotCShnYXNfY2dlbl9maW5pc2hfaW5zbik6IERpdHRvLiAgUmVmZXIgdG8gb3BlcmFuZCB0YWJsZSB2aWEgY3B1Ci0JZGVzY3JpcHRvciwgbm90IGdsb2JhbCB2YXJpYWJsZS4KLQkoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IFJlZmVyIHRvIG9wZXJhbmRfdGFibGUgdmlhIGNwdQotCWRlc2NyaXB0b3IsIG5vdCBnbG9iYWwgdmFyaWFibGUuICBSZWZlciB0byBpbnNlcnRfb3BlcmFuZCBoYW5kbGVyCi0JdmlhIGNwdSBkZXNjcmlwdG9yLCBub3QgZ2xvYmFsIGZ1bmN0aW9uLgotCSogY2dlbi5oICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKiBjb25maWcvdGMtZnIzMC5jOiBJbmNsdWRlIG9wY29kZXMvZnIzMC1kZXNjLmguCi0JKCopOiBnYXNfY2dlbl9vcGNvZGVfZGVzYyByZW5hbWVkIHRvIGdhc19jZ2VuX2NwdV9kZXNjLgotCUNHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCi0JVXBkYXRlIGNhbGwgdG8gQ0dFTl9PUEVSQU5EX1RZUEUsQ0dFTl9JTlNOX09QRVJBTkRTLgotCSogY29uZmlnL3RjLW0zMnIuYzogRGl0dG8uCi0JKGFzc2VtYmxlX3R3b19pbnNucyk6IFVwZGF0ZSBjYWxscyB0byBjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcy4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQkobWRfY29udmVydF9mcmFnKTogVXBkYXRlIGNhbGwgdG8gQ0dFTl9PUEVSQU5EX0VOVFJZLgotCi0xOTk5LTAyLTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggaGFuZGxpbmcgb2YgbGFiZWwxIC0gbGFiZWwyCi0JcmVsb2NhdGlvbnMgZm9yIEVMRiB0YXJnZXRzLgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBTdHJvbmdBUk0gdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAyLTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmg6IFRpZHkgT0JKX0VMRiBhbmQgT0JKX0NPRkYgZGVmaW5pdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEZpeCBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAotCWZvciBDT0ZGIHBvcnRzLgotCi1XZWQgRmViICAzIDExOjM1OjQ3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgcGNhNTYgYW5kIGV2NiBvcHRpb25zLgotCi1Nb24gRmViICAxIDIwOjM3OjMwIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWkzODYuaCAoTE9OR19ET1VCTEVfTU5FTV9TVUZGSVgpOiAgRGVmaW5lLgotICAgICAgICAoSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgpOiAgRGVmaW5lLgotICAgICAgICAoQllURV9QVFIpOiAgRGVmaW5lLgotICAgICAgICAoV09SRF9QVFIpOiAgRGVmaW5lLgotICAgICAgICAoRFdPUkRfUFRSKTogIERlZmluZS4KLSAgICAgICAgKFhXT1JEX1BUUik6ICBEZWZpbmUuCi0gICAgICAgIChTSE9SVCk6ICBEZWZpbmUuCi0gICAgICAgIChPRkZTRVRfRkxBVCk6ICBEZWZpbmUuCi0gICAgICAgIChGTEFUKTogIERlZmluZS4KLSAgICAgICAgKE5PTkVfRk9VTkQpOiAgRGVmaW5lLgotICAgICAgICAoTm9fZFN1Zik6ICBEZWZpbmUuCi0gICAgICAgIChOb194U3VmKTogIERlZmluZS4KLSAgICAgICAgKiBjb25maWcvdGMtaTM4Ni5jICAoc2V0X2ludGVsX3N5bnRheCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGludGVsX3N5bnRheCk6ICBEZWNsYXJlLgotICAgICAgICAoYWxsb3dfbmFrZWRfcmVnKTogIERlY2xhcmUuCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiAgU3VwcG9ydCAuaW50ZWxfc3ludGF4IGFuZCAuYXR0X3N5bnRheC4KLSAgICAgICAgKGludGVsX2Zsb2F0X29wZXJhbmQpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChtZF9hc3NlbWJsZSk6ICBIYW5kbGUgSU5URUxfRFdPUkRfTU5FTV9TVUZGSVguCi0gICAgICAgIEhhbmRsZSBicmFja2V0cyBhcyB3ZWxsIGFzIHBhcmVucy4gIENhbGwgaTM4Nl9pbnRlbF9vcGVyYW5kIGZvcgotICAgICAgICBpbnRlbCBzeW50YXguICBSZXZlcnNlIG9wZXJhbmRzIGlmIGFwcHJvcHJpYXRlLiAgSGFuZGxlIG5ldwotICAgICAgICBzdWZmaXhlcy4gIEhhbmRsZSBtb3Z6eCBhbmQgbW92c3guCi0gICAgICAgIChpMzg2X2lzX3JlZyk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfaW1tZWRpYXRlKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9zY2FsZSk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfZGlzcGxhY2VtZW50KTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9vcGVyYW5kX21vZGlmaWVyKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfcGFyc2Vfc2VnKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfaW50ZWxfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfb3BlcmFuZCk6ICBDYWxsIGkzODZfZGlzcGxhY2VtZW50LCBpMzg2X2ltbWVkaWF0ZSwKLSAgICAgICAgaTM4Nl9zY2FsZSwgZXRjLiAgaW5zdGVhZCBvZiBoYW5kbGluZyBpbmxpbmUuCi0gICAgICAgIChwYXJzZV9yZWdpc3Rlcik6ICBIYW5kbGUgcmVnaXN0ZXJzIHdpdGhvdXQgcHJlZml4LgotCi1Nb24gRmViICAxIDEyOjI0OjU4IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGFybS0qLW9hYmkpOiAgTmV3LgotICAgICAgICAodGh1bWItKi1vYWJpKTogIE5ldy4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKHRhcmdldF9vYWJpKTogIERlY2xhcmUuCi0gICAgICAgIChtZF9hcHBseV9maXgzKTogU3VwcG9ydCBSRUwgcmVsb2NzLgotICAgICAgICAobWRfcGFyc2Vfb3B0aW9uKTogIEhhbmRsZSAtb2FiaS4KLSAgICAgICAgKGVsZjMyX2FybV90YXJnZXRfZm9ybWF0KTogIE5ldyByb3V0aW5lLgotICAgICAgICAobWRfbG9uZ29wdHMpOiAgQWRkIE9QVElPTl9PQUJJLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIFJlZGVmaW5lIFRBUkdFVF9GT1JNQVQuCi0KLQotMTk5OS0wMS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSGFuZGxlIG91dCBvZiByYW5nZSBlcnJvci4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAoZnIzMF9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkoZnIzMF9mb3JjZV9yZWxvY2F0aW9uKTogRGVmYXVsdCB0byAwLgotCi0JKiBjb25maWcvdGMtZnIzMC5oIChvYmpfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCi0JKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IERvIG5vdCBhcHBseSBmaXhlcyB0byBWVEFCTEUKLQlyZWxvY3MuIAotCi0xOTk5LTAxLTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRG8gbm90IGdlbmVyYXRlIGEgc2VxdWVudGlhbAotCW1lcmdlIG9mIHR3byBpbnN0cnVjdGlvbnMgaWYgdGhlIGxlZnQgaW5zdHJ1Y2l0b24ga2lsbHMgdGhlIHJpZ2h0LgotCi0xOTk5LTAxLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluOiBSZWRvIHRlc3QgZm9yIHVzaW5nIGNnZW4uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfYWRqdXN0X3N5bXRhYik6IFByZXZlbnQgYWNjaWRlbnRhbAotCXJlZGVmaW5pdGlvbiBvZiB0aGlzIG1hY3JvLgotCi1UdWUgSmFuICA1IDIxOjU4OjAzIDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZnJvYl9maWxlKTogRGlzYWJsZSAiVW5tYXRjaGVkICVoaSByZWxvYyIKLQl3YXJuaW5nLgotCi0xOTk4LTEyLTI5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBGb3IgbWlwczE2LCBpbnNlcnQgYSBub3AgYmV0d2VlbgotCWEgcmVhZCBvZiBISSBvciBMTyBhbmQgYW4gaW1tZWRpYXRseSBmb2xsb3dpbmcgYnJhbmNoLgotCi0xOTk4LTEyLTI5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBBbm90aGVyIGNvcnJlY3Rpb24gdG8gdGhlIHNldHRpbmcgb2YKLQltaXBzX2VhYmk2NC4KLQotMTk5OC0xMi0yMyAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQ29ycmVjdCB0eXBlLW8gaW4gc2V0dGluZyBvZiBtaXBzX2VhYmk2NC4KLQotMTk5OC0xMi0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYXNzZW1ibGUpOiBFbWl0IGEgTk9QIGFmdGVyIGEgcmVsYXhhYmxlIDE2Ci0JYml0IGluc24gd2hlbiBvcHRpbWl6aW5nLCBzbyB0aGF0IHBhcmFsbGVsaXNlZCBpbnN0cnVjdGlvbnMgd2lsbAotCXN0YXJ0IG9uIGEgMzIgYml0IGJvdW5kYXJ5LgotCi0xOTk4LTEyLTE5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lYWJpNjQpOiBOZXcuCi0JKG1kX2JlZ2luKTogU2V0IG1pcHNfZWFiaTY0LgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogVXNlIGl0LgotCi0xOTk4LTEyLTE4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IAotCUNvcnJlY3Qgc2V0dGluZyBvZiBBQkkgaW4gZV9mbGFncy4KLQotV2VkIERlYyAxNiAxNjoxNzoyMiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2Fzc2VtYmxlKTogV2FybiBhYm91dCBpbnZhbGlkIGluc3RydWN0aW9ucyBpbiBkZWxheSBzbG90cy4KLQotMTk5OC0xMi0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luLG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB2cjQxMTEuCi0JCi0xOTk4LTEyLTE1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IE1hcmsgYXMgYW4gZXJyb3IsIHJhdGhlciB0aGFuIGEKLQl3YXJuaW5nLCB2YWx1ZXMgdGhhdCBkb24ndCBmaXQgaW4gdGhlIGZpZWxkLgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19hYmlfc3RyaW5nKTogTmV3LgotCShtZF9wYXJzZV9vcHRpb24sbWRfbG9uZ29wdHMpOiBBZGQgbWFiaS4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IFNldCBlX2ZsYWdzIGJhc2VkIG9uIG1hYmkgZmxhZy4KLQotMTk5OC0xMi0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB2cjQxMTEuIAotCi05OC0xMi0xMSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IENoYW5nZSBtZXNzYWdlIGdpdmVuIGlmIHRoZQotCWluc3RydWN0aW9uIHJlcXVpcmVzIEg4LzMwMEggbW9kZSBhbmQgd2UncmUgbm90IGluIEhtb2RlLCB0bwotCXN1Z2dlc3QgdGhhdCBpdCBtYXkgYmUgdGhlIG9wZXJhbmQgbW9kZXMgdGhhdCBhcmUgdGhlIHByb2JsZW0sIG5vdAotCW5lY2Vzc2FyaWx5IHRoZSBvcGNvZGUuCi0KLTE5OTgtMTItMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IEFkZCBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIuCi0KLVR1ZSBEZWMgIDggMTk6NTE6NTAgMTk5OCAgTWFyayBLbGVpbiAgPG1rbGVpbkBkaXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEtKi1tcGVpeCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL29iai1zb20uaCAob2JqX3NvbV9jb21waWxlcik6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLXNvbS5jIChjb21waWxlcl9zZWVuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkob2JqX3NvbV9jb21waWxlcik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFVwZGF0ZSB0Y19kYXRhIHVzZXMgZm9yIGNoYW5nZSB0byBiZmQvc29tLmguCi0gCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImNvbXBpbGVyIiBpZiBPQkpfU09NLgotCShwYV90eXBlX2FyZ3MpOiBTZXQgaHBwYV9wcml2X2xldmVsLgotCShwYV9jb21waWxlcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24gaWYgT0JKX1NPTS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIERlYyAgOCAxNTowMDo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAob3V0cHV0X2xlYjEyOCk6IERvbid0IG1hcmsgYXMgaW5saW5lLgotCi0xOTk4LTEyLTA4ICBBbmRyZXcgTWFjTGVvZCAgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3ZieXRlKTogUHJvdG90eXBlIGFuZCBuZXcgZnVuY3Rpb24gZm9yIAotCUFJWCAudmJ5dGUgdW5hbGlnbmVkIGRhdGEgc3VwcG9ydC4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkICd2Ynl0ZScgdG8gbGlzdCBvZiB2YWxpZCBwc2V1ZG9zLgotCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFkZCBlaF9mcmFtZSB0byBsaXN0IG9mIEVMRiByZWxvY2F0YWJsZSAKLQlzZWN0aW9ucy4KLQotMTk5OC0xMi0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUsIGRvX2Fzc2VtYmxlKTogSW1wcm92ZSBlcnJvbmVvdXMKLQlpbnB1dCBoYW5kbGluZy4gCi0KLU1vbiBEZWMgIDcgMDk6NDg6MzQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKGVsZjMyX2FybV9mb3JjZV9yZWxvY2F0aW9uKTogIENoZWNrIGZvcgotICAgICAgICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSC4KLQotU3VuIERlYyAgNiAxMjo0NjozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIFRBUkdFVF9CWVRFU197QklHLExJVFRMRX1fRU5ESUFOIGFmdGVyCi0JY2hlY2tpbmcgdGhlIHRhcmdldCB0eXBlLgotCShtaXBzLWRlYy1ic2QqKTogU2V0IGVuZGlhbiB0byBsaXR0bGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQlDT0ZGIHdlYWsgc3ltYm9sIHN1cHBvcnQsIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNYXJrIEVsYnJlY2h0Ci0JPHNub3diYWxsM0B1c2EubmV0PjoKLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX1dFQUspOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfd2Vhayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9ial9jb2ZmX2VuZGVmKSBbYm90aCB2ZXJzaW9uc106IEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBMaWtld2lzZS4KLQkoeWFua19zeW1ib2xzKTogTGlrZXdpc2UuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgIndlYWsiLgotCi0JKiBjb25maWd1cmUuaW4gKG02OGstKi1nbnUqKTogTmV3IHRhcmdldC4gIEZyb20gQXltZXJpYyBWaW5jZW50Ci0JPGF5bWVyaWMudmluY2VudEBlbWkudS1ib3JkZWF1eC5mcj4uCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggY3VycmVudCB0b29scy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGVtaXRfbGRncCk6IEdpdmUgYW4gZXJyb3IgbWVzc2FnZSByYXRoZXIgdGhhbgotCWFuIGFzc2VydGlvbiBmYWlsdXJlIGZvciBhIGNhc2Ugd2UgY2FuJ3QgaGFuZGxlIHdoZW4gT0JKX0VDT0ZGLgotCi0JKiBleHByLmMgKG9wZXJhdG9yKTogQW5kIHdpdGggMHhmZiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNpZ25lZAotCWNoYXIuCi0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogR2VuZXJhdGUKLQlCRkRfUkVMT0NfRlIzMF80OCBpbnN0ZWFkIG9mIEJGRF9SRUxPQ19GUjMwXzMyLgotCi0xOTk4LTEyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IEVuYWJsZSByZWxvY3MgZm9yCi0JTERJOjIwIGluc24uCi0KLVRodSBOb3YgMjYgMTE6MjM6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBSZXN0b3JlIHByZXZpb3VzIGNhbGN1bGF0aW9uCi0Jb2YgcGNyZWwgcG9pbnQuCi0KLVR1ZSBOb3YgMjQgMTc6MjE6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogRml4IGNhbGN1bGF0aW9uIG9mCi0JcGNyZWwgcG9pbnQuCi0KLVR1ZSBOb3YgMjQgMTQ6NTQ6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBNYWtlIHN0YXRpYyAnZXR5cGUnIGhhdmUgZmlsZQotCXNjb3BlLgotCShkMTB2X2NsZWFudXApOiBPbmx5IGdlbmVyYXRlIHByZXZpb3VzIGluc24gaWYgYSBtdWx0aWxpbmUgaW5zbiBpcwotCW5vdCBwZW5kaW5nLgotCi1GcmkgTm92IDIwIDExOjQxOjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogQWRkIHN1cHBvcnQgZm9yCi0JRlIzMF9PUEVSQU5EX0kzMi4gCi0KLVRodSBOb3YgMTkgMTU6MDE6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLW1hcm03eHh4IGFuZAotCS1tYXJtNnh4eCBjb21tYW5kIGxpbmUgc3dpdGNoZXMuCi0KLTE5OTgtMTEtMTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERFUCk6IFVzZSAkKHNyY2RpcikvLi4vbWtkZXAuCi0JKGl0Ymwtb3BzLm8pOiBEZWxldGUgZHVwbGljYXRlIGRlcGVuZGVuY2llcy4KLQlSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQlBZGQgZnIzMCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIE5vdiAxNyAxMzo0Mjo0MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0Ci0Jb3Bjb2RlIGxpc3QuCi0JKiBsaXN0aW5nLmM6IElnbm9yZSBsaW5lIHRlcm1pbmF0b3IgY2hhcmFjdGVycyBmb3VuZCBpbnNpZGUKLQlzdHJpbmdzLiAKLQotVGh1IE5vdiAxMiAxOToyMToyNCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2dhcy5wb3Q6IFJlZ2VuZXJhdGVkLgotCi1UaHUgTm92IDEyIDEwOjU0OjE2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKGZyMzBfaXNfY29sb25faW5zbik6IE5ldyBuYW1lIGZvcgotCWZyMzBfaXNfbGFiZWxfc3RhcnQoKS4gIEFsc28gY2hlY2tzIGZvciBkZWxheSBzbG90IGluc25zLgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChmcjMwX2lzX2xhYmVsX3N0YXJ0KTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUKLQlGUjMwIGluc3RydWN0aW9ucyB3aGljaCBjb250YWluIGEgY29sb24gaW4gdGhlIG1uZW1vbmljLgotCi0JKiBjb25maWcvdGMtZnIzMC5oIChUQ19TVEFSVF9MQUJFTCk6IERlZmluZSB0aGlzIG1hY3JvLgotCi1XZWQgTm92IDExIDA5OjU4OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IFJlbW92ZWQgY3VycmVudGx5IHN1cGVyZmxvdXMgY29kZS4KLQotVHVlIE5vdiAxMCAxMzoxMzowNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IFR3ZWFraW5nIHNvIHRoYXQgaXQgd2lsbCBjb21waWxlLgotCi1UdWUgTm92IDEwIDE0OjQxOjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWQxMHYuaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZS4KLSAgICAgICAgKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiAgRGVmaW5lLgotICAgICAgICAoZDEwdl9mb3JjZV9yZWxvY2F0aW9uKTogIERlY2xhcmUuCi0gICAgICAgICogY29uZmlnL3RjLWQxMHYuYyAodGNfZ2VuX3JlbG9jKTogIEhhbmRsZSBWdGFibGUgcmVsb2NzLgotICAgICAgICAobWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgVnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKGQxMHZfZml4X2FkanVzdGFibGUpOiAgTmV3LgotICAgICAgICAoZDEwdl9mb3JjZV9yZWxvY2F0aW9uKTogIE5ldy4KLQotTW9uIE5vdiAgOSAxNDoyNTowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jOiBDaGFuZ2UgZGVmYXVsdCBiZWhhdmlvdXIgdG8gaWdub3JlIHBvdGVudGlhbAotCWNvbmZsaWN0cyBiZXR3ZWVuIHJlZ2lzdGVyIG5hbWUgYW5kIHN5bWJvbCBuYW1lcy4KLQotV2VkIE5vdiAgNCAxODo0MjowMCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGZyMzAtKi0qLgotCSogY29uZmlnL3RjLWZyMzAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0JKiBwby9nYXMucG90OiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAgMiAyMDo1NDoxNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV90d29faW5zbnMpOiBFbnN1cmUgYm90aCBpbnNucwotCWFyZSAxNiBiaXQgaW5zbnMuCi0KLU1vbiBOb3YgIDIgMjA6MTA6MTggMTk5OCAgTWFydGluIHZvbiBMb2V3aXMgIDxsb2V3aXNAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IFNldCBjaGFyYWN0ZXJzIGFib3ZlIDEyNyB0byBiZSBzeW1ib2wKLQljaGFyYWN0ZXJzLgotCShkb19zY3J1Yl9jaGFycyk6IEFkZCBzb21lIGNhc3RzIHRvIHVuc2lnbmVkIGNoYXIgdG8gYXZvaWQKLQl1bndhbnRlZCBzaWduIGV4dGVuc2lvbi4KLQkqIHJlYWQuYyAobGV4X3R5cGUpOiBTZXQgY2hhcmFjdGVycyBhYm91dCAxMjcgdG8gYmUgc3ltYm9sCi0JY2hhcmFjdGVycy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2JlZ2luKTogU2V0IGlkZW50aWZpZXJfY2hhcnMgYW5kCi0Jb3BlcmFuZF9jaGFycyBmb3IgdmFsdWVzIGFib3ZlIDEyNy4KLQotTW9uIE5vdiAgMiAxNTowNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgT2N0IDI3IDEzOjE4OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYzogQWRkIHN1cHBvcnQgZm9yIHByb2R1Y2luZyBhIGxpc3RpbmcgZnJvbSBwaXBlZAotCWlucHV0LiAKLQotVHVlIE9jdCAyNyAwODo1Njo0NCAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaGlsb19pbnRlcmxvY2tzKTogUmVtb3ZlIG1pcHNfMzkwMC4KLQkoYXBwZW5kX2luc24pOiBBY2NvdW50IGZvciB0aGUgdHgzOSdzIG11bHRpcGx5IGJlaGF2aW9yLgotCi0xOTk4LTEwLTI2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAoYXNzZW1ibGVfdHdvX2luc25zKTogUmVuYW1lIGFzc2VtYmxlX3R3b19pbnNucwotCWZyb20gYXNzZW1ibGVfcGFyYWxsZWxfaW5zbnMuICBBZGQgc3VwcG9ydCBmb3IgJy0+JyB0byBpbmRpY2F0ZQotCWV4cGxpY2l0bHkgc2VyaWFsaXppbmcgdGhlIGluc3RydWN0aW9ucy4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQotU2F0IE9jdCAyNCAxNToxMjoxOSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1zaC5jIChzaF9maXhfYWRqdXN0YWJsZSk6ICBBZGp1c3QgRVhURVJOIGFuZAotICAgICAgICBXRUFLIGhhbmRsaW5nLgotCi1UaHUgT2N0IDIyIDEyOjQxOjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogIFJldmVydCBsYXN0IGNoYW5nZS4KLQotVGh1IE9jdCAyMiAxMDowMzoxNSAxOTk4ICBSb24gVW5yYXUgIDxydW5yYXVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyA6IHN1cHBvcnQgZnJhbWUgYW5kIHJlZ21hc2svZnJlZ21hc2sgd2hlbgotCSAgTUlQU19TVEFCU19FTEYgaXMgc3BlY2lmaWVkLgotCi1XZWQgT2N0IDIxIDExOzM0OjUxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIE9ubHkgaW5jbHVkZSBpZiBPQkpfRUxGLgotICAgICAgICAobWRfYXBwbHlfZml4KTogIERvbid0IHJldHVybiAxIGZvciBWVEFCTEUgcmVsb2NzLgotICAgICAgICAqIGNvbmZpZy90Yy1zaC5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lIG9ubHkgaWYgT0JKX0VMRi4KLQotVHVlIE9jdCAyMCAxMToxODoyOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRvYy9jLWkzODYudGV4aTogUmVwbGFjZSBvY2N1cmVuY2VzIG9mICJvcGNvZGUiIHdpdGgKLQkiaW5zdHJ1Y3Rpb24gbW5lbW9uaWMiLCAiaW5zdHJ1Y3Rpb24iLCBvciAibW5lbW9uaWMiIHdoZW4KLQlyZWZlcnJpbmcgdG8gdGhlIG5hbWUgb2YgYW4gaW5zdHJ1Y3Rpb24uICBVc2UgIm9wY29kZSIgd2hlbgotCXJlZmVycmluZyB0byB0aGUgc2VxdWVuY2Ugb2YgbWFjaGluZSBieXRlcy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAob3Bjb2RlX2NoYXJzKTogUmVuYW1lIHRvIG1uZW1vbmljX2NoYXJzLgotCShpc19vcGNvZGVfY2hhcik6IFJlbmFtZSB0byBpc19tbmVtb25pY19jaGFyLgotCShtZF9hc3NlbWJsZSBhbmQgaTM4Nl9vcGVyYW5kKTogQ29ycmVjdCBlcnJvciBtZXNzYWdlcyBmcm9tCi0gICAgICAgICJvcGNvZGUiIHRvICJpbnN0cnVjdGlvbiBtbmVtb25pYyIKLQlSZW5hbWUgdGhyb3VnaG91dCBvcGNvZGVbXSAtPiBtbmVtb25pY1tdLCBvcHAgLT4gbW5lbV9wLAotCU1BWF9PUENPREVfU0laRSAtPiBNQVhfTU5FTV9TSVpFLAotCURXT1JEX09QQ09ERV9TVUZGSVggLT4gRFdPUkRfTU5FTV9TVUZGSVgsCi0JV09SRF9PUENPREVfU1VGRklYIC0+IFdPUkRfTU5FTV9TVUZGSVgsCi0JQllURV9PUENPREVfU1VGRklYIC0+IEJZVEVfTU5FTV9TVUZGSVgsCi0JU0hPUlRfT1BDT0RFX1NVRkZJWCAtPiBTSE9SVF9NTkVNX1NVRkZJWAotCUxPTkdfT1BDT0RFX1NVRkZJWCAtPiBMT05HX01ORU1fU1VGRklYCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKCpfTU5FTV9TVUZGSVgpOiBSZW5hbWUgZnJvbSAqX09QQ09ERV9TVUZGSVguCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoZWNrIGZvciBnYXJiYWdlIGFmdGVyCi0JcmVnaXN0ZXIgbmFtZS4KLQotVHVlIE9jdCAyMCAxMDo0OTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGFuZ2UgaGFuZGxpbmcgb2YgUENSRUwgcmVsb2MKLSAJZm9yIEJGRF9BU1NFTUJMRVIgdG8gb25seSBjaGFuZ2UgdmFsdWUgd2hlbiBDT0ZGIGlmIFRFX1BFLgotCi1Nb24gT2N0IDE5IDIwOjIwOjQyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNoLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCi0gICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiAgSGFuZGxlIFZUIHJlbG9jcy4KLSAgICAgICAgKG1kX2FwcGx5X2ZpeCk6ICBMaWtld2lzZS4KLSAgICAgICAgKHRjX2dlbl9yZWxvYyk6ICBMaWtld2lzZS4KLSAgICAgICAgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIE5ldy4KLQotTW9uIE9jdCAxOSAxMjozNTo0MyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9maW5pc2hfaW5zbik6IFVwZGF0ZSBoYW5kbGluZyBvZiBDR0VOX0lOVF9JTlNOX1AuCi0JKiBjZ2VuLmggKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfaW5zbik6IENHRU5fSU5UX0lOU04gLT4gQ0dFTl9JTlRfSU5TTl9QLgotCWNnZW5faW5zbl90IC0+IENHRU5fSU5TTl9JTlQuCi0JKG1ha2VfcGFyYWxsZWwpOiBVcGRhdGUgaGFuZGxpbmcgb2YgQ0dFTl9JTlRfSU5TTl9QLgotCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogRGl0dG8uCi0JKHRhcmdldF9tYWtlX3BhcmFsbGVsKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFVzZSBpdC4KLQotTW9uIE9jdCAxOSAxMzoxNjoxMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZm9yY2VfcmVsb2NhdGlvbik6ICBGaXggdHlwby4KLQotU3VuIE9jdCAxOCAxODo0ODo1NyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3VyZSB0aGUgZW50aXJlIG9wY29kZSBpcwotCWNvbnZlcnRlZCBpbnRvIGxvd2VyIGNhc2UuCi0KLUZyaSBPY3QgMTYgMTM6MzY6MzQgQ0RUIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogIEhhbmRsZSBWVEFCTEUgcmVsb2NzLgotICAgICAgICAoZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jKTogIExpa2V3aXNlLgotICAgICAgICAqIGNvbmZpZy90Yy1tMzJyLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCi0gICAgICAgICogY29uZmlnL3RjLW0zMnIuYyAobTMycl9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCi0gICAgICAgIChtMzJyX2ZvcmNlX3JlbG9jYXRpb24pOiAgSGFuZGxlIFZUQUJMRSByZWxvY3MuCi0KLVdlZCBPY3QgMTQgMTE6MzM6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBEaXJlY3RpdmVzKTogRG9jdW1lbnQgLmx0b3JuIGRpcmVjdGl2ZS4KLQotTW9uIE9jdCAxMiAxMTowNzoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogQ29udmVydCBzZWNvbmQgb3Bjb2RlCi0JdG8gbG93ZXIgY2FzZSBiZWZvcmUgcGFyc2luZy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBJZ25vcmUgY29uZmxpY3RzIHdoZW4gZXhwbGljaXRseQotCXBhcmFsbGVsIGluc25zIG1vZGlmdCBidXRzIGluIHRoZSBQU1cgYXMgYSBzaWRlIGVmZmVjdC4KLQotVGh1IE9jdCAgOCAxMDoxODozMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IFRlc3QgZm9yIG1pc3NpbmcgZmxhZyBhbmQKLQljb250cm9sIHJlZ2lzdGVycy4KLQkKLQkobWRfYXBwbHlfZml4Myk6IEZpeCBlcnJvciBtZXNzYWdlcyB0byBhdm9pZAotCWFzc3VtcHRpb24gYWJvdXQgcHJlc2VuY2Ugb2YgYSBzeW1ib2wuCi0KLQkocGFyYWxsZWxfb2spOiBEaXNhbGxvdyBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgdGhhdCBib3RoIG1vZGlmeSB0aGUKLQlzYW1lIGZsYWcgcmVnaXN0ZXIuCi0KLQkoZmluZF9mb3JtYXQpOiBHZW5lcmF0ZSBhIHdhcm5pbmcgaWYgYW4gb2RkIG51bWJlcmVkIHJlZ2lzdGVyIGlzCi0JdXNlZCBhcyB0aGUgZmlyc3QgcmVnaXN0ZXIgaW4gYSBtdXRsaS1yZWdpc3RlciBpbnN0cnVjdGlvbi4KLQotV2VkIE9jdCAgNyAxNDowOToxNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogRG8gbm90IGFzc3VtZSB0aGF0IGJhZAotCXJlbG9jYXRpb25zIGFyZSBhbHdheXMgYXNzb2NpYXRlZCB3aXRoIGEgc3ltYm9sLgotCi1UdWUgT2N0ICA2IDA5OjMxOjE1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogdGMtc3BhcmMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCi0gICAgICAgIChlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uKTogIERlY2xhcmUuCi0gICAgICAgICogdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgdnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKHRjX2dlbl9yZWxvYyk6ICBIYW5kbGUgdnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKGVsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgotCi1Nb24gT2N0ICA1IDA5OjI1OjMyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWduc3UuY29tPgotCi0gICAgICAgICogc3ltYm9scy5jIChTX0lTX0ZVTkNUSU9OKTogIE5ldy4KLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lLgotICAgICAgICAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCi0gICAgICAgICh2ODUwX2ZvcmNlX3JlbG9jYXRpb24pOiAgRGVjbGFyZS4KLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jICh0Y19nZW5fcmVsb2MpOiAgVXNlIG9mZnNldCBpbnN0ZWFkCi0gICAgICAgIG9mIGZ4X2FkZG51bWJlciBmb3IgVlRBQkxFIHJlbG9jIGFkZGVuZHMuCi0gICAgICAgIChtZF9hcHBseV9maXgzKTogIEhhbmRsZSBWVEFCTEUgcmVsb2NzLgotICAgICAgICAodjg1MF9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCi0gICAgICAgICh2ODUwX2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgotCi1Nb24gT2N0ICA1IDAwOjQ4OjUyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChmcF9vcGVyYW5kX2Zvcm1hdCk6IEFkZCBzb21lIGFkZGl0aW9uYWwgZm9ybWF0cy4KLQkocGFfaXApOiBEbyBub3QgYXV0b21hdGljYWxseSBwcm9tb3RlIGludG8gcGEyLjAgbW9kZS4KLQkocGFfbGV2ZWwpOiBIYW5kbGUgIi5sZXZlbCAyLjAiLgotCi1TdW4gT2N0ICA0IDIwOjU3OjQzIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgQU1EXzNETk9XX09QQ09ERS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRlbXBsYXRlLmV4dGVuc2lvbl9vcGNvZGUpOiBDaGFuZ2UgdG8KLSAgICAgICAgdW5zaWduZWQgaW50IHRvIGFsbG93IGZ1bGwgcmFuZ2Ugb2YgOC1iaXQgb3Bjb2RlIHN1ZmZpeGVzLgotCShOb25lKTogUmVkZWZpbmUgYXMgMHhmZmZmLgotCi0JRnJvbSBKZWZmIEIgRXBsZXIgPGplcGxlckB1c2dzLmdvdj4KLQkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1TSU1EKTogTmV3IHNlY3Rpb24uCi0KLVRodSBPY3QgIDEgMTU6Mzc6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChkaXNjYXJkX3Jlc3Rfb2ZfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaDogRGVjbGFyZSBpdC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX21hc2ssIHNfYWxwaGFfZnJhbWUpOiBVc2UgaXQuCi0KLVRodSBPY3QgIDEgMTA6MzM6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbmRfb3Bjb2RlKTogQ29wZSB3aXRoIHRoZSBjYXNlIHdoZXJlIGEgcmVnaXN0ZXIgbmFtZSBtYXRjaGVzCi0JYSBzeW1ib2wgbmFtZS4KLQotV2VkIFNlcCAzMCAxMDo1MjozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wY3JlbF9mcm9tKTogUmVuYW1lIHRvCi0Jdjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24uCi0JKHY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uKTogRG8gbm90IHJlc29sdmVzIHN5bWJvbHMgaW4gb3RoZXIKLQlzZWN0aW9ucy4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IERlZmluZS4KLQotTW9uIFNlcCAyOCAxMTowMToyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEdlbmVyYXRlIGFuIGVycm9yIGlmIGEgcmVnaXN0ZXIKLQlpcyBzdXBwbGllZCBmb3IgYW4gb3BlcmFuZCB0aGF0IHNob3VsZCBub3QgYmUgYSByZWdpc3Rlci4KLQotRnJpIFNlcCAyNSAxMDowNDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogQnV0IGRvIGFsbG93IGRlbGF5ZWQgYnJhbmNoCi0JaW5zdHJ1Y3Rpb25zIHRvIGhhdmUgYW5vdGhlciBpbnN0cnVjdGlvbiBpbiB0aGUgcmlnaHQgYmluLgotCi1UaHUgU2VwIDI0IDA5OjI4OjM0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBEbyBub3QgYWxsb3cgaW5zdHJ1Y3Rpb25zIGluCi0JdGhlIHJpZ2h0IGNvbnRhaW5lciBpZiB0aGUgbGVmdCBjb250YWluZXIgaG9sZHMgYSBicmFuY2gKLQlpbnN0cnVjdGlvbi4gCi0KLVdlZCBTZXAgMjMgMTA6NTQ6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocmVnX25hbWVfc2VhcmNoKTogT25seSB3YXJuIGlmIGEgbmFtZSBtYXRjaGVzCi0JYm90aCBhIHJlZ2lzdGVyIG5hbWUgYW5kIHN5bWJvbCBuYW1lLgotCShmaW5kX2Zvcm1hdCk6IEFsbG93IGNvcnJlY3QgcGFyc2luZyBvZiBNVlRTWVMgYW5kIE1WRlNZUyBpbnNucy4KLQotVHVlIFNlcCAyMiAxNzo0OToxNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogSW1wbGVtZW50IEVJVEhFUl9CVVRfUFJFRkVSX01VCi0JZXhlY3V0aW9uIHVuaXQgY2xhc3MuCi0KLQkocmVnX25hbWVfc2VhcmNoKTogSWYgYSBuYW1lIG1hdGNoZXMgYSByZWdpc3RlciBhbmQgYSBzeW1ib2wsCi0JcHJlZmVyIHRoZSByZWdpc3Rlci4KLQkoZmluZF9mb3JtYXQpOiBEaXNhbGxvdyBmbGFnIHJlZ2lzdGVycyB3aGVuIGEgZ2VuZXJhbCBwdXJwb3NlCi0JcmVnaXN0ZXIgaXMgcmVxdWlyZWQuCi0JSWYgYSBudW1iZXIgaXMgcmVxdWlyZWQsIGJ1dCBhIHJlZ2lzdGVyIGhhcyBiZWVuIGdpdmVuLCBjaGVjayB0bwotCXNlZSBpZiBhIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyIGV4aXN0cywgYW5kIGlmCi0Jc28sIHVzZSB0aGF0IHN5bWJvbC4KLQotVHVlIFNlcCAyMiAxNjo0MDo1MiAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVDT0ZGX0RFQlVHR0lORyk6IEFkZCBtaXNzaW5nIHBhcmVucy4KLQotVHVlIFNlcCAyMiAxNTo0NDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IERvIG5vdCBhY2NlcHQgZmxhZyByZWdpc3RlcnMgYXMKLQlnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgotCShmaW5kX2Zvcm1hdCk6IElmIGFuIGltbWVkaWF0ZSB2YWx1ZSBpcyBleHBlY3RlZCBhdCBhIGdpdmVuIHBsYWNlCi0JaW4gYSBmb3JtYXQsIGJ1dCBhIHJlZ2lzdGVyIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQgaW5zdGVhZCwgY2hlY2sKLQl0byBzZWUgaWYgdGhhdCByZWdpc3RlciBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkCi0Jc3ltYm9sIGFuZCBpZiBpdCBkb2VzLCB0aGVuIHVzZSB0aGUgc3ltYm9sIGluc3RlYWQuCi0JKHJlZ19uYW1lX3NlYXJjaCk6IElmIGEgcmVnaXN0ZXIgbmFtZSBtYXRjaGVzIGEgc3ltYm9sIG5hbWUsCi0JcHJlZmVyIHRoZSByZWdpc3RlciBuYW1lIHRvIHRoZSBzeW1ib2wgbmFtZS4KLQotTW9uIFNlcCAyMSAxMDo0Mjo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2RvX2FsaWduKTogQWZ0ZXIgaW5zZXJ0aW5nIE5PUHMsIHJlc2V0Ci0JdGhlIHByZXZpb3VzIGluc24gdG8gZW1wdHkuCi0KLTE5OTgtMDktMjAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBEbyBub3QgYnJlYWsgc3RyaW5nIGludG8gdHdvCi0JcGllY2VzLCBmb3JjaW5nIHRoZSB1c2Ugb2YgYW4gQU5TSSBjb21waWxlci4KLQotU3VuIFNlcCAyMCAwMDo1ODoxMiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IE5ldyBtYWNyby4gIEZvcmNlIHZ0YWJsZQotCXJlbG9jcy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogRG8gbm90aGluZyBmb3IgdnRhYmxlIHJlbG9jcy4KLQotVHVlIFNlcCAxNSAwODo1MTowNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0KTogIEhhbmRsZSBhcm0KLSAgICAgICAgYXNzZW1ibGVyIHN5bnRheC4KLSAgICAgICAgKG9ial9lbGZfdnRhYmxlX2VudHJ5KTogIExpa2V3aXNlLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIGZvciBPQkpfRUxGLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBWVEFCTEUgcmVsb2NhdGlvbnMuCi0gICAgICAgICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLSAgICAgICAgKGFybV9maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgotICAgICAgICAoZWxmMzJfYXJtX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcuCi0gICAgICAgIChhcm1lbGZfZnJvYl9zeW1ib2wpOiAgUmVtb3ZlIGNvZmYtc3R5bGUgc3ltYm9sIHN1cHBvcnQuCi0KLVdlZCBTZXAgIDkgMTE6Mjc6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRml4IHR5cG8gaW4gbGFzdCBwYXRjaC4KLQotVHVlIFNlcCAgOCAxODoxMDowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKGFybV9hZGp1c3Rfc3ltdGFiKTogIE1vdmUgI2lmZGVmCi0gICAgICAgIE9CSl9DT0ZGIHNvIHRoYXQgcm91dGluZSBpcyBkZWZpbmVkIGZvciBhLm91dCBmb3JtYXQuCi0KLVR1ZSBTZXAgIDggMTU6NTY6MTkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRGV0ZWN0IG5vbi1zZWdtZW50IHJlZ2lzdGVycwotCXVzZWQgYXMgc2VnbWVudCBwcmVmaXhlcy4KLQotU2F0IFNlcCAgNSAxOTowMDozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVob3B0LmMgKGNoZWNrX2VoX2ZyYW1lKTogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIEZERSwgYW5kIGRvbid0Ci0Jb3B0aW1pemUgYWNyb3NzIEZERSBib3VuZGFyaWVzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IFByZXNlcnZlIGFueSBsaW5rIG9uY2UKLQlmbGFncyB3aGVuIHNldHRpbmcgdGhlIHNlY3Rpb24gZmxhZ3MuCi0KLUZyaSBTZXAgIDQgMTc6MDc6MTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChvYmpfYWRqdXN0X3N5bXRhYik6IEZpeGVkIHR5cG8uCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybWVsZl9hZGp1c3Rfc3ltdGFiKTogUmVmb3JtYXR0ZWQuCi0KLUZyaSBTZXAgIDQgMTM6NTc6NDMgMTk5OCAgSmFrdWIgSmVsaW5layA8ampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGluX3NpZ25lZF9yYW5nZSk6IFNpZ24gZXh0ZW5kIDMyLWJpdCB3b3JkcwotCXRvIHRoZSBob3N0IHdpZHRoLgotCi1XZWQgU2VwICAyIDExOjMxOjE0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmMgKGZyYWdfZ3Jvdyk6IEluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGZyYWcgc3RydWN0IGluIHRoZQotCW9ic3RhY2sgY2h1bmsgc2l6ZS4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBBZGp1c3QgdGhlIHNlZ2luZm8gZnJjaGFpbiBzdGFydAotCWlmIHRoZSBuZXcgc3Vic2VnIGNvbWVzIGJlZm9yZSB0aGUgb2xkLgotCi1UdWUgU2VwICAxIDE1OjAxOjMzIDE5OTggIEpha3ViIEplbGluZWsgPGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFsbG93IGFsbCBkaWdpdHMgaW4gYW4gaW5zdHJ1Y3Rpb24KLQl0byBoYW5kbGUgZWRnZTggYW5kIGVkZ2UxNi4KLQotTW9uIEF1ZyAzMSAwOTo1MToxNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0KTogUHJpbnQgZXJyb3IgbWVzc2FnZQotCWJlZm9yZSB3ZSBjbG9iYmVyIHRoZSBzeW1ib2wgaW52b2x2ZWQuCi0KLU1vbiBBdWcgMzEgMTA6NTg6MDYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmM6ICBSZW1vdmUgT0JKX0VMRiBkZWZpbml0aW9ucyBmb3IgCi0gICAgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgYW5kIFNfU0VUX1NUT1JBR0VfQ0xBU1MuICBPbmx5Ci0gICAgICAgIHVzZSBhcm1fYWRqdXN0X3N5bXRhYiBmb3IgT0JKX0NPRkYuCi0gICAgICAgIChhcm1lbGZfYWRqdXN0X3N5bXRhYik6ICBOZXcgUm91dGluZS4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmg6ICBEZWZpbmUgb2JqX2FkanVzdF9zeW10YWIgdG8KLSAgICAgICAgYXJtZWxmX2FkanVzdF9zeW10YWIgZm9yIE9CSl9FTEYuCi0gICAgICAgIAotU2F0IEF1ZyAyOSAyMjoxODo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IE1ha2UgYWxsIGkzODYtZWxmIHRhcmdldHMgdXNlIGJmZF9nYXMuCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcuCi0JKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBmaXggdnRhYmxlIHJlbG9jcy4KLQkobWRfYXBwbHlfZml4Myk6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgdGhlbS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBBbHdheXMgZGVmaW5lLCBjYWxsaW5nCi0JdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uLgotCi1Nb24gQXVnIDI0IDEzOjQwOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfc2hvd191c2FnZSk6IEltcHJvdmUgZm9ybWF0dGluZyBvZiAtLWhlbHAgb3V0cHV0LgotCi1GcmkgQXVnIDIxIDE4OjQzOjQ4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogQ29weSBwcmV2aW91cyBvcGNvZGUgb3ZlcgotCWN1cnJlbnQgb3Bjb2RlIGFmdGVyIHdyaXRpbmcgdGhlIGZpcnN0IGluc3R1cmN0aW9uIG9mIGEgcmV2ZXJzZQotCXNlcXVlbnRpYWwgcGFpci4gCi0JCi1GcmkgQXVnIDIxIDA3OjMwOjM1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogQWRkIHByb3RvdHlwZS4KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogTWFrZSBub24tc3RhdGljLgotCi1UaHUgQXVnIDIwIDIzOjE3OjA0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBPbmx5IHdhcm4gZm9yIGFkZHJlc3MvZGF0YSBzaXplCi0JcHJlZml4ZXMuCi0KLVRodSBBdWcgMjAgMTQ6NDU6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChhcm1fZml4X2FkanVzdGFibGUpOiBEbyBub3QgYWRqdXN0IHJlbG9jYXRpb25zCi0JYWdhaW5zdCBUaHVtYiBmdW5jdGlvbiBuYW1lcywgYXMgdGhlIGxpbmtlciBuZWVkcyB0aGlzIGluZm9ybWF0aW9uLgotCi0xOTk4LTA4LTIwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcGVyYW5kKTogQ2hlY2sgYWxzbyB0aGF0IHRoZXJlIGlzIG5vIGFkdmFuY2UgaW4gb3BlcmFuZAotCWFmdGVyIGF0b2ZfZ2VuZXJpYyBpbiBvcmRlciB0byBkZWNpZGUgImlzIGl0IGxhYmVsIDBmIG9yIGZsb2F0aW5nCi0JcG9pbnQgbnVtYmVyPyIuCi0KLVdlZCBBdWcgMTkgMDk6MzA6MTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYzogUmVwbGFjZSBkb3VibGUgZGFzaCBwcmVmaXggdG8gTTMyUiBzcGVjaWZpYwotCWNvbW1hbmQgbGluZSBvcHRpb25zIHdpdGggYSBzaW5nbGUgZGFzaC4KLQkqIGRvYy9jLW0zMnIudGV4aTogUmVwbGFjZSBkb3VibGUgZGFzaCBwcmVmaXggd2l0aCBhIHNpbmdsZSBkYXNoLgotCi1UdWUgQXVnIDE4IDExOjU5OjQzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiB0Yy1hcm0uaDogRGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZSBmb3IgT0JKX0VMRi4KLSAgICAgICAqIHRjLWFybS5jIChhcm1fZml4X2FkanVzdGFibGUpOiBOZXcgcm91dGluZS4KLQotMTk5OC0wOC0xMyAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19hbGlnbiwgc19jb21tLCBzX21yaV9jb21tb24sIHNfZmFpbCwgc19nbG9ibCwgc19zcGFjZSwKLQlzX2Zsb2F0X3NwYWNlLCBzX3N0cnVjdCwgY29uc193b3JrZXIpOiBNb3ZlIGlnbm9yZV9yZXN0X29mX2xpbmUgb3IKLQlkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lIGJlZm9yZSBtcmlfY29tbWVudF9lbmQuCi0JKGVxdWFscyk6IENoZWNrIGdhcmJhZ2UgYWZ0ZXIgZXhwcmVzc2lvbiBiZWZvcmUKLQltcmlfY29tbWVudF9lbmQgaW4gTVJJIG1vZGUuCi0KLVRodSBBdWcgMTMgMTU6MDg6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgTV9TR0VfSS9NX1NHRVVJX0kgY2FzZSBmb3IgYQotCXNtYWxsIGltbWVkaWF0ZSBjb25zdGFudCB0byB1c2UgdGhlIGNvbnN0YW50IGl0c2VsZiByYXRoZXIgdGhhbgotCWFsd2F5cyB1c2luZyAxLgotCi1XZWQgQXVnIDEyIDE4OjQ3OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZW50ZXIpOiBDYWxsIGFzX2JhZCByYXRoZXIgdGhhbiBhYm9ydC4KLQkocGFfbGVhdmUpOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAxMiAxMzoyNTowMyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRW1pdCBhIHdhcm5pbmcgZm9yIHN0YW5kLWFsb25lCi0JcHJlZml4ZXMuCi0JKGkzODZfb3BlcmFuZCk6IEZpeCBhbiBlcnJvciBtZXNzYWdlLgotCi1UdWUgQXVnIDExIDE0OjQ0OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0gRGlyZWN0aXZlcyk6IERvY3VtZW50IC5yZXEgZGlyZWN0aXZlLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHJlZ19yZXF1aXJlZF9oZXJlKTogRGlzcGxheSBlcnJvbmVvdXMgc3RyaW5nIGlmCi0JdGhlIHJlZ2lzdGVyIG5hbWUgY291bGQgbm90IGJlIGRlY29kZWQuCi0JRG8gbm90IHNldCBpbnN0Lmluc3RydWN0aW9uIGlmIHRoZSBzaWZ0IGlzIC0xLgotCi1Nb24gQXVnIDEwIDE1OjM5OjU2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh0Y19nZW5fcmVsb2MpOiBCaWFzIFdFQUsgc3ltYm9scyBqdXN0IGFzCi0Jd2UgZG8gZm9yIEVYVEVSTi4KLQotTW9uIEF1ZyAxMCAxNTowNjoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkMzB2X2FsaWduKTogQWx3YXlzIHBlcmZvcm0gYWxpZ25tZW50IHJlcXVlc3QsCi0JZXZlbiBpZiBpdCBpcyBiZWxpdmVkIHRvIGJlIHVubmVjZXNzYXJ5LgotCi1Nb24gQXVnIDEwIDE3OjQ4OjA5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCWNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IFNpemUgaW1tZWRpYXRlIGNvbnN0YW50cyBieQotCXN1ZmZpeCAoZXJyb25lb3VzbHkgcmVtb3ZlZCBhcyBwYXJ0IG9mIEp1bHkgNyBjaGFuZ2UpLgotCi1TdW4gQXVnICA5IDIwOjQ1OjMyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL29iai1lbGYuaDogIENoZWNrIGZvciByZWRlZmluaXRpb24gb2Ygb2JqX2Zyb2Jfc3ltYm9sLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYzogIERlZmluZSBTX0dFVF9TVE9SQUdFX0NMQVNTIGFuZCBTX1NFVF9TVE9SQUdFX0NMQVNTLgotICAgICAgICAoYXJtZWxmX2Zyb2Jfc3ltYm9sKTogIE5ldyBSb3V0aW5lLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBvYmpfZnJvYl9zeW1ib2wgaWYgT0JKX0VMRi4KLQotU2F0IEF1ZyAgOCAxNToyMToyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3Qgd2VhayBzeW1zLgotCi1XZWQgQXVnICA1IDE1OjU0OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBTZXQgQkZEIHByaXZhdGUgZmxhZ3MgZGVwZW5kaW5nIHVwb24KLQljb21tYW5kIGxpbmUgc3dpdGNoZXMgcGFzc2VkIHRvIGFzc2VtYmxlci4KLQotTW9uIEF1ZyAgMyAxNDowMjo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChHQVNfQ0dFTl9NQVhfRklYVVBTKTogR0FTXyBwcmVwZW5kZWQsIGFsbCB1c2VzIHVwZGF0ZWQuCi0JKGdhc19jZ2VuX29wY29kZV9kZXNjKTogRGVjbGFyZS4KLQkoZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCk6IERlY2xhcmUuCi0JKCopOiBQcmVwZW5kIGdhc18gdG8gZ2FzIHNwZWNpZmljIGZucyB0byBkZW5vdGUgdGhlbSBhcyBzdWNoLgotCUFsbCB1c2VzIHVwZGF0ZWQuCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX29wY29kZV9kZXNjKTogTmV3IGdsb2JhbAotCShnYXNfY2dlbl9pbml0X3BhcnNlKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX2luaXRfcGFyc2UuCi0JKHF1ZXVlX2ZpeHVwKTogUmVuYW1lZCBmcm9tIGNnZW5fcXVldWVfZml4dXAuCi0JKCopOiBQcmVwZW5kIGdhc18gdG8gZ2FzIHNwZWNpZmljIGZucyB0byBkZW5vdGUgdGhlbSBhcyBzdWNoLgotCUFsbCB1c2VzIHVwZGF0ZWQuCi0JKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUgY2FsbCB0byBpbnNlcnRfb3BlcmFuZC4KLQkoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fZmluaXNoX2luc24uCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFJlbW92ZSB1c2Ugb2YgQ0dFTl9TWU0uCi0JT3BlbiBvcGNvZGUgdGFibGUgYW5kIGluaXRpYWxpemUgaXQuCi0JKG1ha2VfcGFyYWxsZWwpOiBVc2UgZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MuCi0JKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBEaXR0by4gIFJlbW92ZSB1c2Ugb2YgQ0dFTl9TWU0uCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0KLVNhdCBBdWcgIDEgMTk6Mjc6MzAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZGVidWdfaW5mb190eXBlKTogQWRkIGVudHJpZXMgZm9yIHVuc3BlY2lmaWVkIGFuZCBkd2FyZiouCi0JKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogVGFrZSBubyBhcmd1bWVudHM7IGNhbGwKLQlhc193aGVyZSBvdXJzZWx2ZXMuICBQcm92aWRlIGEgc3R1YiBmb3IgIUVDT0ZGX0RFQlVHR0lORy4KLQkqIGVjb2ZmLmg6IE1vdmUgRUNPRkZfREVCVUdHSU5HIHByb3RlY3Rpb24gaW5zaWRlIEdBU19FQ09GRl9ILgotCU1vdmUgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyBvdXRzaWRlIEVDT0ZGX0RFQlVHR0lORyBwcm90ZWN0aW9uLgotCSogcmVhZC5jIChnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBUaWR5IEVDT0ZGIGJpdHMuICBVc2UKLQlERUJVR19VTlNQRUNJRklFRCByYXRoZXIgdGhhbiBERUJVR19OT05FIGZvciBpbml0aWFsIHRlc3QuCi0JKiBjb25maWcvb2JqLWVsZi5oIChFQ09GRl9ERUJVR0dJTkcpIFtUQ19BTFBIQV06IERlZmluZSB0byBhIHZhcmlhYmxlLgotCShTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogQ29uZGl0aW9uYWxpemUgb24gdmFsdWUgb2YgRUNPRkZfREVCVUdHSU5HLgotCShJTklUX1NUQUJfU0VDVElPTik6IExpa2V3aXNlLgotCShPQkpfUFJPQ0VTU19TVEFCKTogTGlrZXdpc2UuCi0JCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfbG9uZ29wdHMpOiBOZXcgb3B0aW9ucyAtbWRlYnVnLy1uby1tZGVidWcuCi0JKG1kX3BhcnNlX29wdGlvbik6IFdhdGNoIGZvciB0aGVtLgotCShhbHBoYV9jdXJfZW50X3N5bSwgYWxwaGFfZmxhZ19tZGVidWcpOiBOZXcgdmFyaWFibGVzLgotCShtZF9iZWdpbik6IEtpbGwgbmV2ZXJkZWYgY29kZS4KLQkoc19hbHBoYV9lbnQsIHNfYWxwaGFfZW5kLCBzX2FscGhhX21hc2ssIHNfYWxwaGFfZnJhbWUpOiBOZXcuCi0JKHNfYWxwaGFfcHJvbG9ndWUpOiBXYXRjaCBhbHBoYV9jdXJfZW50X3N5bS4KLQkoc19hbHBoYV9jb2ZmX3dyYXBwZXIpOiBOZXcuCi0JKG1kX3BzZXVkb190YWJsZSk6IFRyYXAgYWxsIEVDT0ZGIHBzZXVkb3MuCi0JCi1GcmkgSnVsIDMxIDE2OjQ1OjU0IDE5OTggIFJvbiBVbnJhdSA8cnVucmF1QGN5Z251cy5jb20+Ci0KLQlTdGFydCBvZiBjaGFuZ2VzIHRvIHJlbW92ZSBtZGVidWcgc2VjdGlvbiBmcm9tIG1pcHMqLWVsZgotCUJhc2VkIG9uIE1JUFNfU1RBQl9FTEYgZGVmaW5pdGlvbgotCSogYWNjb25maWcuaDogdW5kZWYgaWYgbm90IGNvbmZpZ3VyZWQKLQkqIGNvbmZpZy5pbjogdW5kZWYgaWYgbm90IGNvbmZpZ3VyZWQKLQkqIGNvbmZpZy9taXBzLWVsZi5oOiBvbmx5IHNldCBFQ09GRiBkZWJ1Z2dpbmcgaWYgbm90IHN0YWJzLWluLWVsZgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19lbnQpOiBzZXQgQlNGX0ZVTkNUSU9OCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IGZsdXNoIGZyYWcKLQotRnJpIEp1bCAzMSAxNjoxNDo0NSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogKGFybS0qLWVsZik6ICBIYW5kbGUuCi0gICAgICAgICh0aHVtYi0qLWVsZik6IEhhbmRsZS4KLSAgICAgICAgKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotICAgICAgICAqIHJlYWQuYyAoc3RyaW5nZXIpOiBGaXggdHlwbyBpbiBjb21tZW50LgotICAgICAgICAqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIHRvIGFkZGVuZCBpZgotICAgICAgICBUQ19BUk0gYW5kIE9CSl9FTEYuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jIChtZF9zZWN0aW9uX2FsaWduKTogIERvbid0IGFsaWduIGR3YXJmIGRlYnVnCi0gICAgICAgIHNlY3Rpb25zLgotICAgICAgICAodGNfZ2VuX3JlbG9jKTogIEFsd2F5cyBzZXQgdGhlIHJlbG9jIGFkZGVuZCB0byBmaXhwLT5meF9vZmZzZXQKLSAgICAgICAgZm9yIE9CSl9FTEYuCi0KLVRodSBKdWwgMzAgMjE6Mzg6NDMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoe2N1cixwcmV2fV9sZWZ0X2tpbGxzX3JpZ2h0X3ApOiBOZXcgdmFyaWFibGVzLgotCSh3cml0ZV8yX3Nob3J0KTogRW1pdCB3YXJuaW5nIGlmIG5ldyBmbGFnIGlzIHNldC4KLQkoZG9fYXNzZW1ibGUpOiBTZXQgZmxhZ3MgaWYgbGVmdCBpbnN0cnVjdGlvbiBpcyBvbmUgb2Ygc3BlY2lhbAotCSJyaWdodC1pbnN0cnVjdGlvbi1raWxsZXIiIHR5cGUuCi0KLVR1ZSBKdW4gMjggMTg6MTI6MjggMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0JCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfbnVtYmVyX3RvX2NoYXJzLCBjb25zX2ZpeF9uZXdfc3BhcmMpOgotCUFsd2F5cyBvdXRwdXQgd29yZHMgaW4gZGVidWdfaW5mbyBzZWN0aW9uIGFzIGJpZyBlbmRpYW4uCi0JKHNwYXJjX3RhcmdldF9mb3JtYXQpOiBDaG9vc2UgY29ycmVjdCBiZmQgdGFyZ2V0LgotCShtZF9hcHBseV9maXgzKTogUmVuYW1lIEJGRF9SRUxPQ19TUEFSQ18zMkxFIHRvIEJGRF9SRUxPQ19TUEFSQ19SRVYzMi4KLQkKLVR1ZSBKdWwgMjggMTE6MDE6MjEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEZpeCAiZXJybXNnIiBpbml0aWFsaXphdGlvbgotCXRvIHdvcmsgd2l0aCBpbnRlcm5hdGlvbmFsaXphdGlvbiBjb2RlLiAgSXNzdWUgYW4gZXJyb3Igd2hlbiB0d28KLQlvcGVyYW5kcyBtYXRjaCB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBtYXRjaC4KLQotTW9uIEp1bCAyNyAxNjoyNTo1OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGluc3RhbGxfdG9vbGRpcik6IEFsbG93IHRhcmdldCB0byBzcGVjaWZ5IHdoZXRoZXIKLQlpdCB3YW50cyB0byBiZSBpbnN0YWxsZWQgaW4gJCh0b29sZGlyKS9iaW4uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogU2V0IGluc3RhbGwtZXhlYy10b29sZGlyCi0JZGVwZW5kZW5jeSB2aWEgY29uZmlndXJlLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLUZyaSBKdWwgMjQgMTk6NTg6NTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IFNwbGl0IGludG8gdHdvIC4uLgotCShpbnN0YWxsLWV4ZWMtYmluZGlyLGluc3RhbGwtZXhlYy10b29sZGlyKTogTmV3IHJ1bGVzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLUZyaSBKdWwgMjQgMTY6MzE6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgcmVtb3ZlIHRoZSBmaWxlIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgJChiaW5kaXIpID09ICQodG9vbGRpcikvYmluLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgSnVsIDI0IDA5OjEzOjQ2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoY2dlbl9tZF9hcHBseV9maXgzKTogVXBkYXRlIGNhbGwgdG8gbWRfY2dlbl9sb29rdXBfcmVsb2MuCi0JKGNnZW5fdGNfZ2VuX3JlbG9jKTogVXNlIHhtYWxsb2MsIG5vdCBiZmRfYWxsb2MuCi0JKiBjZ2VuLmggKGNnZW5fbWRfYXBwbHlfZml4MyxjZ2VuX3RjX2dlbl9yZWxvYyk6IERlY2xhcmUuCi0JKG1kX2NnZW5fbG9va3VwX3JlbG9jKSk6IERlY2xhcmUuCi0JKG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTMyci5oIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBEZWNsYXJlLgotCShtMzJyX3JlbGF4X2ZyYWcpOiBEZWNsYXJlLgotCShjZ2VuX21kX2FwcGx5X2ZpeDMpOiBEZWNscyBtb3ZlZCB0byBjZ2VuLmguCi0JKGNnZW5fcmVjb3JkX2ZpeHVwX2V4cCxjZ2VuX3RjX2dlbl9yZWxvYyk6IERpdHRvLgotCShtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERlbGV0ZSBkZWNsLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9jcHVfZGVzYyk6ICNpZiAwIG91dC4KLQkoYXNzZW1ibGVfbm9wKTogRGVsZXRlLgotCShleHBhbmRfZGVidWdfc3ltcyk6IERlbGV0ZSB1bnVzZWQgYGV4cCcuCi0JKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogUmVuYW1lZCBmcm9tIENHRU5fU1lNIChsb29rdXBfcmVsb2MpLgotCUFkZCBkZWZhdWx0IGNhc2UgZm9yIC1XYWxsLgotCShtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IEFkZCBkZWZhdWx0IGNhc2UgZm9yIC1XYWxsLgotCShtZF9hdG9mKTogRGVsZXRlIHVudXNlZCB3b3JkUC4KLQotVGh1IEp1bCAyMyAxMzoxOTo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTWFrZSBzdXJlICJlcnJtc2ciIGhhcyBhIG5vbi1OVUxMCi0JdmFsdWUuCi0KLVdlZCBKdWwgMjIgMTQ6MzY6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIGRvY3VtZW50YXRpb24gZm9yIC5lbmQsIC5leGl0bSwgLmZhaWwsCi0JLmlmYywgLmlmZXFzLCAuaWZnZSwgLmlmZ3QsIC5pZmxlLCAuaWZsdCwgLmlmbmMsIC5pZm5lLCAuaWZuZXMsCi0JLnByaW50LCAucHVyZ2VtLCBhbmQgLnN0cnVjdC4gIFJlbW92ZSBkb2N1bWVudGF0aW9uIGZvcgotCS5hcHAtZmlsZS4KLQotVHVlIEp1bCAyMSAxNjo1MDo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX21kX2FwcGx5X2ZpeDMpOiBzZXRfb3BlcmFuZCByZW5hbWVkIHRvIHNldF92bWFfb3BlcmFuZC4KLQlVcGRhdGUgY2FsbCB0byBpbnNlcnRfb3BlcmFuZC4KLQotRnJpIEp1bCAxNyAxMTo0MjoyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtc19zaG93X3VzYWdlKTogRm9ybWF0dGluZyBjaGFuZ2VzLgotCi1XZWQgSnVsIDE1IDE1OjM4OjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgdHJhaWxpbmcKLQl3aGl0ZXNwYWNlIGFmdGVyIGEgcHJlZml4IG9wZXJhdG9yLgotCi1UdWUgSnVsIDE0IDE1OjMyOjU2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWJlb3N7cGUsZWxmLH0qKTogUmVjb2duaXplLgotCi1UdWUgSnVsIDE0IDEyOjMzOjQ0IDE5OTggIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsb2cyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc19yZXNlcnZlKTogVXNlIGxvZzIgdG8gY29udmVydCBhbGlnbm1lbnQgYmVmb3JlIGNhbGxpbmcKLQlyZWNvcmRfYWxpZ25tZW50LgotCShzX2NvbW1vbik6IFVzZSBsb2cyIHRvIGNvbnZlcnQgYWxpZ25tZW50IGJlZm9yZSBjYWxsaW5nCi0JcmVjb3JkX2FsaWdubWVudCBhbmQgZnJhZ19hbGlnbi4KLQkoc3BhcmNfY29uc19hbGlnbik6IFVzZSBsb2cyLgotCi1UdWUgSnVsIDE0IDExOjU4OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IFNldCBzeW1ib2wgc2l6ZSBpZiBPQkpfRUxGLgotCShzX2NvbW1vbik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaGFuZGxlX2FsaWduKTogUmVpbmRlbnQgYSBiaXQuICBDb3JyZWN0Ci0JaW5pdGlhbGl6YXRpb24gb2Ygd2FkZHIuCi0JKHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0KLVR1ZSBKdWwgMTQgMTE6MDA6MTYgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBkb2MvYy1pMzg2LnRleGk6IEZpeCBhIHR5cG8uICBVc2UgdGhlIHRlcm0gODAtYml0IHJlYWwgcmF0aGVyCi0JdGhhbiB0ZW1wb3JhcnkgcmVhbC4KLQotTW9uIEp1bCAxMyAxMzo1NTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogRG9uJ3QgYWxpZ24gdGhlIHNlZ21lbnRzIGlmIHRoZXJlIHdlcmUKLQlhbnkgZXJyb3JzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zeW1ib2xfbWVyZ2UpOiBDb3JyZWN0IG51bWJlciBvZiBieXRlcyB3aGVuCi0JY29weWluZyBhdXggaW5mb3JtYXRpb24uCi0KLQkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IENhdGNoIGF0dGVtcHRzIHRvIHR1cm4gYW4gT19iaWcKLQlleHByZXNzaW9uIGludG8gYSBzeW1ib2wuCi0KLU1vbiBKdWwgMTMgMTM6Mjk6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtb2RlX2Zyb21fZGlzcF9zaXplKTogQ2hhbmdlIGFyZyBhbmQgcmV0dXJuCi0JdHlwZSB0byB1bnNpZ25lZCBpbnQuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIHR5cGUgdXNlZCB0byBzdG9yZSBvZmZzZXRzIGZyb20gdW5zaWduZWQKLQlsb25nIHRvIGxvbmcuCi0JKGkzODZfb3BlcmFuZCk6IFN3aXRjaCBlcnJvciBjaGVjayB0byBvbmx5IGNhbGwgUkVTVE9SRV9FTkRfU1RSSU5HCi0Jb25jZSBhZnRlciBwYXJzZV9yZWdpc3Rlci4KLQotRnJpIEp1bCAxMCAxNjowMDowNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9zaG93X3VzYWdlKTogQ2hhbmdlZCBmb3JtYXQgdG8gbWF0Y2ggdGhhdAotCW9mIGdjYywgbGQsIGV0Yy4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IENoYW5nZWQgZm9ybWF0IHRvIG1hdGNoIHRoYXQgb2YgZ2NjLCBsZCwgZXRjLgotCi1UaHUgSnVsICA5IDEyOjA5OjU3IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHZ0YWJsZQotCXJlbG9jcy4KLQkobWRfYXBwbHlfZml4XzIpOiBGb3JjZSB0aGUgc3ltYm9sIG9mIHRoZSB2dGFibGUgcmVsb2MgdG8gYmUKLQl3ZWFrLgotCi1UaHUgSnVsICA5IDExOjMxOjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL01ha2VmaWxlLmFtIChNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEp1bCAgOCAxMjoxODo1NiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwLCBjYXNlICdpJyBhbmQgJ2onKTogTWFzayBvZmYgaGlnaCBiaXRzCi0gICAgICAgIGZvciAlbG8gZXhwcmVzc2lvbnMuCi0gICAgICAgIChtaXBzX2lwLCBjYXNlICd1Jyk6IE1vdmUgcmFuZ2UgY2hlY2sgYWZ0ZXIgY29kZSB0byBtYXNrCi0gICAgICAgIG9mZiBiaXRzIGluICVoaS8lbG8gZXhwcmVzc2lvbnMuICBNYXNrIG9mZiBoaWdoIGJpdHMgZm9yCi0gICAgICAgICVsbyBleHByZXNzaW9ucy4KLQotVHVlIEp1bCAgNyAxNzo1NzozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9NYWtlZmlsZS5hbSAoZ2FzdmVyLnRleGkpOiBOZXcgdGFyZ2V0LgotCShhcy5pbmZvLCBhcy5kdmkpOiBEZXBlbmRzIHVwb24gZ2FzdmVyLnRleGkuCi0JKiBkb2MvYXMudGV4aW5mbzogSW5jbHVkZSBnYXN2ZXIudGV4aS4gIE1lbnRpb24gdmVyc2lvbiBudW1iZXIgb24KLQl0aXRsZSBwYWdlIGFuZCBpbiB0b3Agbm9kZS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1bCAgNyAxMTo0MjoxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbGlzdGluZyk6IEZvciBFRElDVF9MSVNULCBza2lwIGFsbCBsaW5lcyB1cCB0bwotCWJ1dCBub3QgaW5jbHVkaW5nIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGVkaWN0LgotCSogbGlzdGluZy5oIChMSVNUSU5HX0VPRik6IE5ldy4KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogQ2FsbCBpdC4KLQotVHVlIEp1bCAgNyAxMzowMDozNyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IERvbid0IHNldCB0aGUgc2l6ZSBvZiBhbgotIAlpbW1lZGlhdGUgYWRkcmVzcyBiYXNlZCBzb2xlbHkgb24gdGhlIHN1ZmZpeCBhbmQgdGhlIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRkIGFzc2VydGlvbiB0byBtYWtlIHN1cmUKLQlvdmVybGFwMiBkb2VzIG5vdCBzZXQgSW1tLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzcGFjZV9jaGFycyk6IFJlbW92ZS4gVGhlIHNjcnViYmVyIGNvbnZlcnRzCi0Jc2VxdWVuY2VzIG9mIHdoaXRlc3BhY2UgdG8gYSBzaW5nbGUgc3BhY2UuCi0JKGlzX3NwYWNlX2NoYXJzKTogSnVzdCBjb21wYXJlIHdpdGggc3BhY2UuCi0JKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSBzcGFjZV9jaGFycy4KLQkobWRfYXNzZW1ibGUpOiBKdXN0IHNraXAgYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuCi0JKGkzODZfb3BlcmFuZCk6IFJld3JpdGUgYmFzZS1pbmRleCBwYXJzaW5nIHRvIHVzZSBuZXcKLQlwYXJzZV9yZWdpc3RlciwgYW5kIHRvIHNraXAgd2hpdGUgc3BhY2UuICBTa2lwIHdoaXRlIHNwYWNlIGluIGEKLQludW1iZXIgb2Ygb3RoZXIgcGxhY2VzIHRvby4gIERvbid0IGdpdmUgZXJyb3IgbWVzc2FnZSBpZgotCXBhcnNlX3JlZ2lzdGVyIGZhaWxzLgotCShwYXJzZV9yZWdpc3Rlcik6IENoYW5nZSByZWdfc3RyaW5nIHBhcmFtZXRlciB0byBiZSBub24tY29uc3QuCi0JQWRkIGVuZF9vcCBwYXJhbWV0ZXIuICBTa2lwIHdoaXRlIHNwYWNlIGFmdGVyIHRoZSBgJScsIGFuZCByZXR1cm4KLQllbmQgb2YgcmVnaXN0ZXIgc3RyaW5nLiAgR2l2ZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW4KLQljYWxsZXIuCi0KLUZyaSBKdWwgIDMgMTU6MzQ6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXR0IFNlbWVyc2t5IDxtYXR0c0BzY2QuaHAuY29tPjoKLQkqIGV4cHIuYyAob3BfZW5jb2RpbmcpOiBNYWtlIGNvbnN0LgotCShleHByX3NldF9wcmVjZWRlbmNlKTogTmV3IGZ1bmN0aW9uLgotCShleHByX2JlZ2luKTogRG9uJ3Qgc2V0IG9wZXJhdG9yIHJhbmtpbmdzLCBqdXN0IGNhbGwKLQlleHByX3NldF9wcmVjZWRlbmNlLgotCSogZXhwci5oIChleHByX3NldF9wcmVjZWRlbmNlKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoc19tcmkpOiBDYWxsIGV4cHJfc2V0X3ByZWNlZGVuY2UuCi0KLVRodSBKdWwgIDIgMTY6MjQ6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoU3RhdGVtZW50cyk6IFJlbW92ZSBwYXJhZ3JhcGggZGlzY3Vzc2luZwotCWNvbnRpbnVpbmcgbGluZXMgd2l0aCBhIGJhY2tzbGFzaC4gIFRoaXMgaGFzbid0IHdvcmtlZCBmb3IgeWVhcnMsCi0JaWYgaXQgZXZlciBkaWQuCi0KLVRodSBKdWwgIDIgMTQ6MDY6MjIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+Ci0KLSAgICAgICAgKiBvYmotdm1zLmM6IEFkZCBDKysgc3VwcG9ydCB3aXRoIGN0b3JzL2R0b3JzIHNlY3Rpb25zLiAgQWRkIHdlYWsKLQlzeW1ib2wgZGVmaW5pdGlvbnMuCi0JKEN0b3JzX1N5bWJvbHMsIER0b3JzX1N5bWJvbHMpOiBOZXcgc3ltYm9sIGNoYWlucy4KLQkocHNfQ1RPUlMsIHBzX0RUT1JTKTogTmV3IHNlY3Rpb24gdHlwZXMuCi0JKHZtc19maXh1cF94dG9yc19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uCi0JKEN0b3JzX1BzZWN0LCBEdG9yc19Qc2VjdCk6IERlZmluZS4KLQkoSVNfR1hYX1hUT1IpOiBEZWZpbmUKLQkoZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBDaGFuZ2UgY2hlY2sgb2YgZ3h4X2J1Z19maXhlZCB0byAwLgotCUZpbHRlciBzdGF0aWMgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIGFuZCBhZGQgdG8KLQlDdG9yc19TeW1ib2xzL0R0b3JzX1N5bWJvbHMgY2hhaW4uCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSk6IFdyaXRlIEN0b3JzX1N5bWJvbHMvRHRvcnNfU3ltYm9scyB0bwotCWFwcHJvcHJpYXRlIHNlY3Rpb24uCi0KLSAgICAgICAgKiB0Yy1hbHBoYS5oIChUQVJHRVRfRk9STUFUKTogUmVuYW1lICJldmF4LWFscGhhIiB0byAidm1zLWFscGhhIi4KLQkqIG1ha2VmaWxlLnZtczogTWVyZ2UgdmF4L3ZtcyBzdXBwb3J0LgotCi1XZWQgSnVsICAxIDIwOjA2OjIwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQsIG9ial9lbGZfdnRhYmxlX2VudHJ5KTogTmV3LgotCShlbGZfcHNldWRvX3RhYmxlKTogQWRkIHRoZW0uCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSB2dGFibGUgcmVsb2NzLgotCShtZF9hcHBseV9maXgpOiBBY2NlcHQgdGhlbS4KLQkobWlwc19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB0aGVtLgotCSh0Y19nZW5fcmVsb2MpOiBNdW5nIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkgZm9yIFJlbC4KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFjY2VwdCB2dGFibGUgcmVsb2NzLgotCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04pOiBGb3JjZSB2dGFibGUgcmVsb2NzLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB0aGVtLgotCi1XZWQgSnVsICAxIDE2OjM1OjMyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0dFTl9DUFVfUFJFRklYKTogTmV3IHZhcmlhYmxlLgotCShjZ2VuLm8pOiBVc2UgaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogQUNfU1VCU1QgY2dlbl9jcHVfcHJlZml4LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1XZWQgSnVsICAxIDIxOjM4OjU2IDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1zaCAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTJfREVMQVlfTEVOR1RIKTogRGVmaW5lLgotCUNoYW5nZWQgYWxsIHVzZXJzIG9mIENPTkQxMl9ERUxBWS4KLQotRnJpIEp1biAyNiAxMToyMToxMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHNldF9hcmNoX21hY2gpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBwc2V1ZG8tb3BzIHRvIHNldCB0aGUgY3VycmVudCBtYWNoaW5lIHR5cGUuCi0JKG1kX2JlZ2luKTogRGVmYXVsdCB0byBtbjEwMzAwIG1vZGUuCi0JKG1kX2Fzc2VtYmxlKTogT25seSBhY2NlcHQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY29yZSBtbjEwMzAwCi0JY2hpcCBhbmQgdGhlIGFjdGl2ZSBtYWNoaW5lIHR5cGUuCi0KLVdlZCBKdW4gMjQgMTk6MDY6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogR2l2ZSB0aGUgc3RydWN0IGEgbmFtZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oICh0Y19yZWxvY19tYW5nbGUpOiBBZGQgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLWg4NTAwLmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtc2guaCAoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBBZGQgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLXc2NS5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXo4ay5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgotCi1XZWQgSnVuIDI0IDEzOjQ1OjAwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogIFJlc3RvcmUgb2xkIHNlY3Rpb24KLSAgICAgICAgYWZ0ZXIgY29tbW9uIHByb2Nlc3NpbmcuCi0KLVdlZCBKdW4gMjQgMTE6NTA6NTQgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKENyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUpOiBGb3JjZSBiaW5hcnkgZmlsZS4KLQotVHVlIEp1biAyMyAxNzo0NzozMSAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChkb19hX2ZpeF9pbW0sIGJ1aWxkX2J5dGVzKTogUmVwbGFjZSBjYXN0IHRvCi0JY2hhciB3aXRoIGNvZGUgdGhhdCBleHBsaWNpdGx5IHNpZ24tZXh0ZW5kcy4KLQotVHVlIEp1biAyMyAxMzo1NDo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiBSZXN0b3JlIHRleHQgc2VjdGlvbiBhcyB0aGUgY3VycmVudAotCXNlY3Rpb24gYWZ0ZXIgY3JlYXRpbmcgY2FsbCB0YWJsZSBzZWN0aW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTWU1fQVVYSU5GTyk6IE5ldyBtYWNybyB0byBjb25jZWFsIHVnbHkKLQljb2RlLiAKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogUmVwbGFjZSBjb21wbGV4IGV4cHJlc2lvbgotCXdpdGggY2FsbCB0byBtYWNybyBTWU1fQVVYSU5GTy4KLQotVHVlIEp1biAyMyAxNTowOToyNyAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQotCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEp1biAyMiAxOTo1Mjo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3N5bWJvbF9tZXJnZSk6IEZpeCBjb3B5aW5nIG9mIGF1eGlsaWFyeQotCWluZm9ybWF0aW9uLgotCi1Nb24gSnVuIDIyIDE1OjE4OjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogQmUgcHJlcGFyZWQgZm9yIGEgc3BhY2UgYmV0d2VlbgotCXRoZSBvcGVuIHBhcmVudGhlc2lzIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyIG9wZXJhbmQsCi0JYmVjYXVzZSBvZiB0aGUgSnVuZSAxNiBjaGFuZ2UuCi0KLVN1biBKdW4gMjEgMjE6Mjc6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIHdlYWsgc3ltYm9scyBjb3JyZWN0bHkgaWYKLQlCRkRfQVNTRU1CTEVSLgotCi1TdW4gSnVuIDIxIDEyOjI2OjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGQzMHZfYWxpZ24pOiBBbHdheXMgcGVyZm9ybSBhbGlnbm1lbnQgcmVxdWVzdCwKLQlldmVuIGlmIGl0IGlzIGJlbGl2ZWQgdG8gYmUgdW5uZWNlc3NhcnkuCi0KLUZyaSBKdW4gMTkgMTM6NTc6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IE5ldmVyIGFkanVzdCByZWxvY3MgYWdhaW5zdCB3ZWFrCi0Jc3ltYm9scy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotRnJpIEp1biAxOSAwOTo1MDoxNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBEbyBub3QgaGFyZGNvZGUgdGhlCi0Jc2hpZnQgYW1vdW50IGZvciBhIHJlcGVhdGVkIG9wZXJhbmQuICBUaGUgc2hpZnQgYW1vdW50IGZvciB0aGUKLQlyZXBlYXRlZCBjb3B5IGNvbWVzIGZyb20gdGhlIHNpemUgb2YgdGhlIG9wZXJhbmQuCi0KLUZyaSBKdW4gMTkgMDA6NDQ6MTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X29wZXJhbmQpOiBGaXggdHlwb3MgaW4gbGRtL3N0bSBzdXBwb3J0LgotCi1XZWQgSnVuIDE3IDEzOjA3OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCAtbWlwc04gdXNhZ2UuCi0KLVR1ZSBKdW4gMTYgMTM6MDY6MjEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJZiB0Y19zeW1ib2xfY2hhcnMgaXMgZGVmaW5lZCwgdHJlYXQgYWxsCi0JY2hhcmFjdGVycyBpbiBpdCBhcyBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRjX3N5bWJvbF9jaGFycyk6IERlZmluZS4KLQkoZXh0cmFfc3ltYm9sX2NoYXJzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGV4dHJhX3N5bWJvbF9jaGFycyk6IERlZmluZS4KLQkoY29tbWVudF9jaGFycyk6IERvbid0IHVzZSAnLycgYXMgY29tbWVudCBzdGFydCBpZiBURV9MSU5VWC4KLQkobGluZV9jb21tZW50X2NoYXJzKTogU2V0IHRvICcvJyBpZiBURV9MSU5VWC4KLQkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1wcmVmaXhlcyk6IFVwZGF0ZS4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBEb2N1bWVudCB0Y19zeW1ib2xfY2hhcnMuCi0KLUZyaSBKdW4gMTIgMTM6MzY6NTQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLTE5OTgtMDYtMTIgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hcHBseV9maXgzKTogQ2hlY2tpbmcgZGlzcGxhY2VtZW50Ci0JY29uc3RyYWludCBpbiBpbnN0cnVjdGlvbnMgUkVQICYgUkVQSS4KLQotVGh1IEp1biAxMSAwODo1Njo0NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogQ2F0Y2ggQkZEX1JFTE9DXzgsCi0JQkZEX1JFTE9DXzE2LCBCRkRfUkVMT0NfNjQgYW5kIGlzc3VlIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2VzLiAgCi0KLQkoY2hlY2tfcmFuZ2UpOiBJZiB0aGUgb3BlcmFuZCBpcyBzaGlmdGVkLCB0aGVuIHNoaWZ0IHRoZSBudW1iZXIKLQliZWZvcmUgY2hlY2tpbmcgaXRzIHJhbmdlLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IEFkZCBtb3JlIGNoZWNrcyBmb3IgTlVMTCBwb2ludGVycy4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IFNldCBTRUNfQ09NTU9OIGJpdCBvbiBzcGVjaWFsCi0JY29tbW9uIHNlY3Rpb25zLgotCi1XZWQgSnVuIDEwIDE3OjI2OjM1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IENyZWF0ZSBzcGVjaWFsIHNlY3Rpb25zIGFzIG5lZWRlZC4KLQotMTk5OC0wNi0xMCAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBBZGRpdGlvbiBvZiBzd2FwcGluZwotCWluc3RydWN0aW9ucyBmb3Igc2VxdWVudGlhbCBhbmQgcmV2ZXJzZSBzZXF1ZW50aWFsIG9yZGVyIHdoZW4KLQlnaXZlbiBvcmRlciBpcyBub3QgcG9zc2libGUuCi0KLVR1ZSBKdW4gIDkgMTM6NTI6NTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShERVBfSU5DTFVERVMpOiBGaXggcmVmZXJlbmNlIHRvIGludGwgYnVpbGQgZGlyZWN0b3J5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdW4gIDkgMTI6MjA6MDUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBkb2MvYy1pMzg2LnRleGk6IFVwZGF0ZSAxNiBiaXQgZG9jdW1lbnRhdGlvbi4KLQotCSogY29uZmlnL3RjLWkzODYuaDogQ2hhbmdlIERhdGExNiB0byBTaXplMTYsIERhdGEzMiB0byBTaXplMzIsCi0JSWdub3JlRGF0YVNpemUgdG8gSWdub3JlU2l6ZSBhcyB0aGV5IGFyZSB1c2VkIGZvciBhZGRyZXNzIHNpemUgYXMKLQl3ZWxsIGFzIGRhdGEgc2l6ZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IExpa2V3aXNlLiAgQWRkIGNvZGUgdG8gcmVqZWN0IGFkZHIzMi9kYXRhMzIgaW4KLQkzMi1iaXQgbW9kZSwgc2ltaWxhcmx5IGFkZHIxNi9kYXRhMTYgYW5kIHZhcmlhbnRzLgotCi1Nb24gSnVuICA4IDE4OjMyOjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogRml4IGhhbmRsaW5nIG9mIHJldmVyc2UKLQlzZXF1ZW50aWFsIHdvcmQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zLgotCQotCShkb19hc3NlbWJsZSk6IEFkZCBleHRyYSBjb21tYW5kIGxpbmUgYXJndW1lbnQsIHRvIGFsbG93IG11bDMyCi0JYXR0cmlidXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3MgcGFyYWxsZWwgaW5zbnMuCi0JKG1kX2Fzc2VtYmxlKTogSW5zZXJ0IE5PUHMgYmV0d2VlbiBleHBsaWNpdGx5IHBhcmFsbGVsIGluc25zIHdoaWNoCi0JY29udGFpbiBhbiAzMiBiaXQgbXVsdGlwbHkgYW5kIGEgMTYgbXVsdGlwbHkuCi0KLU1vbiBKdW4gIDggMTI6MjA6MzAgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSRVBORSByZW5hbWVkIHRvIFJFUE5FX1BSRUZJWF9PUENPREUsIGFuZAotCWxpa2V3aXNlIGZvciBSRVBFLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChyZWxvYyk6IEFkZCBicmFjZXMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogUmVuYW1lIGJpIHRvIHNpYiB0byBiZQotCWNvbnNpc3RlbnQgd2l0aCBJbnRlbCBuYW1pbmcuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChiYXNlX2luZGV4X2J5dGUpOiBSZW5hbWUgdG8gc2liX2J5dGUuICBEb24ndAotCXVzZSBiaXRmaWVsZHMgaW4gc2liX2J5dGUuCi0JKG1vZHJtX2J5dGUpOiBEb24ndCB1c2UgYml0ZmllbGRzIGhlcmUgZWl0aGVyLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjdXJyZW50X3RlbXBsYXRlcyk6IEFkZCBjb25zdC4KLQkocGFyc2VfcmVnaXN0ZXIpOiBBZGQgY29uc3QgdG8gcmV0dXJuLCBwYXJhbSwgYW5kIGNoYXIgKnMuCi0JKGkzODZfb3BlcmFuZCk6IEFkZCBjb25zdCB0byByZWdfZW50cnkgKnIuCi0JKiBjb25maWcvdGMtaTM4Ni5oICh0ZW1wbGF0ZXMpOiBBZGQgY29uc3QgdG8gc3RhcnQsIGVuZC4KLQotCUluc3BpcmVkIGJ5IGNvZGUgZm9yIDE2IGJpdCBnYXMgc3VwcG9ydCBmcm9tIE1hcnR5bmFzIEt1bmlnZWxpcwotCTxtYXJ0eW5hc0BubTMua3R1Lmx0PjoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRkIGZ1bGwgc3VwcG9ydCBmb3IgMTYgYml0Ci0JbW9kcm0sIGFuZCBKdW1wLCBKdW1wQnl0ZSwgSnVtcER3b3JkLCBKdW1wSW50ZXJTZWdtZW50IGluc25zLgotCSh1c2VzX21lbV9hZGRybW9kZSk6IFJlbW92ZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBBZGQgc3VwcG9ydCBoZXJlIHRvby4KLQkobWRfcmVsYXhfdGFibGUpOiBSZXdyaXRlIGludGVyZmFjZSB0byBtZF9yZWxheCBmb3IgMTYgYml0Ci0Jc3VwcG9ydC4KLQkoQllURSwgV09SRCwgRFdPUkQsIFVOS05PV05fU0laRSk6IFJlbW92ZS4KLQkob3Bjb2RlX3N1ZmZpeF90b190eXBlKTogUmVtb3ZlLgotCShDT0RFMTYsIFNNQUxMLCBTTUFMTDE2LCBCSUcsIEJJRzE2KTogRGVmaW5lLgotCShTSVpFX0ZST01fUkVMQVhfU1RBVEUpOiBNb2RpZnkgdG8gc3VpdCBhYm92ZS4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKGkzODZfb3BlcmFuZCk6IEFkZCBzdXBwb3J0IGZvciAxNiBiaXQgYmFzZS9pbmRleCByZWdzLAotCWltbWVkaWF0ZXMsIGFuZCBkaXNwbGFjZW1lbnRzLiAgUmVtb3ZlIHNvbWUgdW5uZWNlc3NhcnkgY2FzdHMsIGFuZAotCWxvY2FsaXNlIGVuZF9vZl9vcGVyYW5kX3N0cmluZywgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCwKLQlkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCB2YXJpYWJsZXMuICBBZGQgR0NDX0FTTV9PX0hBQ0suCi0JKiBjb25maWcvdGMtaTM4Ni5oIChOT19CQVNFX1JFR0lTVEVSXzE2KTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwcmVmaXhfaGFzaCk6IFJlbW92ZS4KLQkobWRfYmVnaW4pOiBSZXdyaXRlIHdpdGhvdXQgb2JzdGFja3MuICBSZW1vdmUgcHJlZml4IGhhc2ggdGFibGUKLQloYW5kbGluZy4gIFJld3JpdGUgbGV4aWNhbCB0YWJsZSBoYW5kbGluZy4KLQkoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogRG9uJ3QgcHJpbnQgcHJlZml4IHN0YXRpc3RpY3MuCi0JKG1kX2Fzc2VtYmxlKTogUmV3cml0ZSBpbnN0cnVjdGlvbiBwYXJzZXIgc28gdGhhdCBsaW5lIGlzIG5vdAotCWNvbnZlcnRlZCB0byBsb3dlciBjYXNlLiAgRG9uJ3QgZG8gYSBoYXNoX2ZpbmQgZm9yIHByZWZpeGVzLAotCWluc3RlYWQgcmVjb2duaXNlIHRoZW0gdmlhIG9wY29kZSBtb2RpZmllci4KLQkoZXhwZWN0aW5nX29wZXJhbmQsIHBhcmVuX25vdF9iYWxhbmNlZCk6IExvY2FsaXNlIHZhcmlhYmxlcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKElzUHJlZml4KTogRGVmaW5lLgotCShwcmVmaXhfZW50cnkpOiBSZW1vdmUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFBSRUZJWF9TRVBFUkFUT1IpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChQUkVGSVhfU0VQQVJBVE9SKTogRGVmaW5lIGhlcmUgaW5zdGVhZCwgdXNpbmcKLQknXFwnIGluIGNhc2Ugd2hlcmUgY29tbWVudF9jaGFycyBjb250YWlucyAnLycuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKE1BVENIKTogRW5zdXJlIGdpdmVuIG9wZXJhbmQgYW5kIHRlbXBsYXRlCi0JbWF0Y2ggZm9yIEp1bXBBYnNvbHV0ZS4gIE1ha2VzIGUuZy4gYGxqbXAgdGFibGUoJWVieCknIGludmFsaWQ7Ci0JeW91IG11c3Qgd3JpdGUgYGxqbXAgKnRhYmxlKCVlYngpJy4KLQotCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogY29uZmlnL3RjLWkzODYuYyAoQkZEX1JFTE9DXzE2LCBCRkRfUkVMT0NfMTZfUENSRUwpOiBEZWZpbmUKLQlhcyAwIGlmbmRlZiBCRkRfQVNTRU1CTEVSLgotCShtZF9hc3NlbWJsZSk6IEFsbG93IGltbWVkaWF0ZSBvcGVyYW5kcyB3aXRob3V0IHN1ZmZpeCBvcgotCW90aGVyIHJlZyBvcGVyYW5kIHRvIGRlZmF1bHQgaW4gc2l6ZSB0byB0aGUgY3VycmVudCBjb2RlIHNpemUuCi0KLU1vbiBKdW4gIDggMDk6NDU6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiAgUmVzdG9yZSBjcmVhdGlvbiBvZgotICAgICAgICAuY2FsbF90YWJsZV90ZXh0IGFuZCAuY2FsbF90YWJsZV9kYXRhIHNlY3Rpb25zLgotCi1TYXQgSnVuICA2IDAwOjAyOjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogU2V0IGV4ZWN1dGlvbiB0eXBlIHRvIHVua25vd24KLQlhZnRlciBlbWl0dGluZyBhIHdvcmQgb2Ygbm9vcHMuCi0KLUZyaSBKdW4gIDUgMjM6Mjc6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtb2RlX2Zyb21fZGlzcF9zaXplKTogRGlzcDE2IGlzIG1vZGUgMi4KLQkoaTM4Nl9vcGVyYW5kKTogU2ltcGxpZnkgY2hlY2tzIGZvciB2YWxpZCBiYXNlL2luZGV4IGNvbWJpbmF0aW9ucy4KLQlEaXNhbGxvdyBgaW4gNCglZHgpLCVhbCcuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogTWFrZSByZWdzLCBiYXNlX3JlZywgYW5kCi0JaW5kZXhfcmVnIGNvbnN0LgotCShhZGRfcHJlZml4KTogQ2hhbmdlIHBhcmFtZXRlciBmcm9tIGNoYXIgdG8gaW50LgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChVZ2gpOiBEZWZpbmUgb3Bjb2RlIG1vZGlmaWVyLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBQcmludCB3YXJuaW5ncyBmb3IgVWdoIGluc25zLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFJld3JpdGUgTUFUQ0ggYW5kCi0JQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCBtYWNyb3MgdG8gY2hlY2sgcmVnaXN0ZXIgdHlwZXMgbW9yZQotCXRob3JvdWdobHkuICBDaGVjayBmb3IgaWxsZWdhbCBzdWZmaXgvb3BlcmFuZCBjb21iaW5hdGlvbnMKLQl3aGVuIG1hdGNoaW5nIGluc25zIHdpdGggb3BlcmFuZHMuICBIYW5kbGUgbmV3IGBzJyBzdWZmaXgsIGFuZAotCWFzc29jaWF0ZWQgRmxvYXRNRiBvcGNvZGUgbW9kaWZpZXIgZm9yIGZsb2F0IGluc25zIHdpdGggbWVtb3J5Ci0Jb3BlcmFuZHMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChGbG9hdE1GKTogRGVmaW5lIG5ldyBvcGNvZGUgbW9kaWZpZXIuCi0JKE5vX3NTdWYsIE5vX2JTdWYsIE5vX3dTdWYsIE5vX2xTdWYpOiBMaWtld2lzZS4KLQkoU0hPUlRfT1BDT0RFX1NVRkZJWCwgTE9OR19PUENPREVfU1VGRklYKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYzogUmVuYW1lIFdPUkRfUFJFRklYX09QQ09ERSB0bwotCURBVEFfUFJFRklYX09QQ09ERSB0aHJvdWdob3V0LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChSRUdJU1RFUl9XQVJOSU5HUyk6IERlZmluZS4KLQkobWRfYXNzZW1ibGUpOiBSZXdyaXRlIHN1ZmZpeC9yZWdpc3RlciBvcGVyYW5kIGNoZWNraW5nIGNvZGUgdG8gYmUKLQltb3JlIHRob3JvdWdoLiAgUmVtb3ZlIEFiczgsMTYsMzIuICBDaGFuZ2Ugb2NjdXJyZW5jZXMgb2YgTWVtIHRvCi0JQW55TWVtLCB0aGUgYmV0dGVyIHRvIGdyZXAuCi0JKHBpKTogUmVtb3ZlIEFicy4KLQkoaTM4Nl9vcGVyYW5kKTogRG9uJ3Qgc2V0IE1lbSBiaXRzIGluIGkudHlwZXNbdGhpc19vcGVyYW5kXSB3aGVuCi0JZ2l2ZW4gYSBtZW1vcnkgb3BlcmFuZC4gIERvbid0IHNldCBBYnMgYml0cyBlaXRoZXIuCi0JKHR5cGVfbmFtZXMpOiBSZW1vdmUgTWVtKiwgQWJzKi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE1lbTgsIE1lbTE2LCBNZW0zMiwgQWJzOCwgQWJzMTYsIEFiczMyKTogRG9uJ3QKLQlkZWZpbmUgb3Bjb2RlX21vZGlmaWVycyBhcyB0aGVzZSBjYXNlcyBhcmUgaGFuZGxlZCBieSBEaXNwOCwKLQlEaXNwMTYsIERpc3AzMiBhbmQgc3VmZml4IGNoZWNrcy4KLQkoQ09NRVNfSU5fQk9USF9ESVJFQ1RJT05TKTogUmVtb3ZlLgotCShGbG9hdFIpOiBEZWZpbmUuIEl0J3MgT0sgdG8gc2hhcmUgdGhlIGJpdCB3aXRoIFJldmVyc2VSZWdSZWdtZW0uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZW1pdCBvcGVyYW5kIHNpemUgcHJlZml4Ci0JaWYgSWdub3JlRGF0YVNpemUgbW9kaWZpZXIgZ2l2ZW4uICBSZW1vdmUgU2hvcnRmb3JtVyBtb2RpZmllcgotCXRlc3QuICBBZGQgdGVzdCBmb3IgU2hvcnRGb3JtIGluIFcgYmFzZV9vcGNvZGUgbW9kaWZpY2F0aW9uLgotCU1lcmdlIFNlZzJTaG9ydEZvcm0gYW5kIFNlZzNTaG9ydEZvcm0gY29kZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFNob3J0Rm9ybVcpOiBSZW1vdmUuCi0JKElnbm9yZURhdGFTaXplKTogRGVmaW5lLgotCi1GcmkgSnVuICA1IDEwOjUwOjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogU3RvcmUgcHJldmlvdXMgc2VnbWVudCBzdGF0ZQotCXdpdGggcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBKdW4JIDMgMTg6MjE6NTYgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChTQ0FMRTFfV0hFTl9OT19JTkRFWCk6IERlZmluZS4KLQkoZWJwLCBlc3ApOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlcy4KLQkoTUFUQ0gpOiBSZW1vdmUgdGVzdCBmb3IgSW5PdXRQb3J0UmVnLgotCShpMzg2X29wZXJhbmQpOiBQcm9wZXJseSBoYW5kbGUgSW5PdXRQb3J0UmVnIGhlcmUgaW5zdGVhZC4KLQlEaXNhbGxvd3MgYGluYiAoJWR4LDIpJywgYGluYiAlZXM6KCVkeCknIGFuZCBgbW92ICglZHgpLCVheCcKLQkobWRfYXNzZW1ibGUpOiBTaW1wbGlmeSBhbmQgY29ycmVjdCBtb2RybSBhbmQgc2liIGdlbmVyYXRpb24uCi0JKGkzODZfb3BlcmFuZCk6IEFkZCB3YXJuaW5nIGZvciBzY2FsZSB3aXRob3V0IGluZGV4LgotCVJld3JpdGUgY2hlY2tzIGZvciB2YWxpZCBiYXNlL2luZGV4IGNvbWJpbmF0aW9ucy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoRU5EX1NUUklOR19BTkRfU0FWRSk6IFByb3RlY3QgYXJndW1lbnRzIG9mCi0JbWFjcm9zIGFuZCBlbmNsb3NlIGluIGRvIHdoaWxlKDApLgotCShSRVNUT1JFX0VORF9TVFJJTkcpOiBMaWtld2lzZS4KLQkobWRfYXNzZW1ibGUpOiBBZGQgb25lIHRvIHByaW50ZWQgb3BlcmFuZCBudW1iZXIgc28gd2Ugc3RhcnQKLQlmcm9tIDEgbm90IDAuICBBZGQgc29tZSBtb3JlIGdldHRleHQgaW52b2NhdGlvbnMuCi0JKGkzODZfb3BlcmFuZCk6IEZpeCBgJSVzJyAtPiBgJSUlcycuIEluYyBwcmludGVkIG9wZXJhbmQKLQludW1iZXIgaGVyZSB0b28uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFdBSVRfUFJFRklYLCBMT0NLUkVQX1BSRUZJWCwgQUREUl9QUkVGSVgsCi0JREFUQV9QUkVGSVgsIFNFR19QUkVGSVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzdHJ1Y3QgX2kzODZfaW5zbik6IFJlbW92ZSB3YWl0X3ByZWZpeCBmaWVsZC4KLQkoY2hlY2tfcHJlZml4KTogUmVtb3ZlIGZ1bmN0aW9uLgotCShhZGRfcHJlZml4KTogTmV3IGZ1bmN0aW9uLiAgQWRkIHByZWZpeCB0byBpLnByZWZpeCBhcyB3ZWxsIGFzCi0JZG9pbmcgY2hlY2tzLgotCShtZF9hc3NlbWJsZSk6IENoYW5nZXMgZm9yIGFkZF9wcmVmaXguCVJlbW92ZSBoYWNrIGZvciB3YWl0Ci0JcHJlZml4LCBpbnN0ZWFkIGFsd2F5cyBvdXRwdXQgcHJlZml4ZXMgaW4gZml4ZWQgb3JkZXIuCVRlc3QKLQlmb3IgamN4ei9sb29wIHdoZW4gc2VsZWN0aW5nIGJldHdlZW4gd29yZCAmIGR3b3JkIG9wZXJhdGlvbnMsCi0JYW5kIGFkZCBhZGRyZXNzIHNpemUgcHJlZml4IHJhdGhlciB0aGFuIG9wZXJhbmQgc2l6ZSBwcmVmaXguCi0JUmVtb3ZlIG9wZXJhbmQgLT4gYWRkcmVzcyBzaXplIGhhY2sgd2hlbiBlbWl0dGluZyBqY3h6L2xvb3AuCi0JKGkzODZfb3BlcmFuZCk6IFJlbW92ZSBPX0Fic2VudCBjaGVjayBhcyBpdCdzIGRvbmUgaW4gZXhwci4KLQotV2VkIEp1biAgMyAxNTowOToxMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG01MjAwIGFzIGEgY3B1X3R5cGUgb2YgbTY4ay4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKdW4gIDMgMTQ6MTE6NTkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQWRkIG1vcmUgY2FsbHMKLQl0byByZWxheGFibGVfc3ltYm9sIHRvIHByZXZlbnQgcmVmZXJlbmNlcyB0byBleHRlcm5hbCBzeW1ib2wgZnJvbQotCWJlaW5nIHJlbGF4ZWQuCi0KLVdlZCBKdW4gIDMgMTQ6MTA6MzYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChyZWxheGFibGVfc3ltYm9sKTogSWYgVEFSR0VUX09TIGlzICJlbGYiLCBhbGwKLQlzeW1ib2xzIGFyZSByZWxheGFibGUuCi0KLVdlZCBKdW4gIDMgMDk6MTY6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiAgRG9uJ3QgY3JlYXRlIHNwZWNpYWwKLSAgICAgICAgc2VjdGlvbnMgYnkgZGVmYXVsdC4KLSAKLVR1ZSBKdW4gIDIgMTQ6NTI6NTYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEZvciBkaXYgYW5kIHVkaXYsIGNsb3NlIHRoZQotCXJlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZS4KLQotVHVlIEp1biAgMiAxNTozNjoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIE1hdHQgU2VtZXJza3kgPG1hdHRzQHNjZC5ocC5jb20+OgotCSogbWFjcm8uYyAobWFjcm9fbXJpX21vZGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBtYWNyby5oIChtYWNyb19tcmlfbW9kZSk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHNfbXJpKTogQ2FsbCBtYWNyb19tcmlfbW9kZSB3aGVuIHN3aXRjaGluZyBpbiBhbmQgb3V0IG9mCi0JTVJJIG1vZGUuCi0KLVR1ZSBKdW4gIDIgMTM6MzI6MjIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX2NvbW0pOiBBbGxvdyBhbGlnbm1lbnQgcGFyYW1ldGVyIGluCi0JT0JKX0VWQVggY2FzZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IERlZmVyIHJlc3RvcmluZyBjaGFyYWN0ZXIKLQl1bnRpbCBhZnRlciB4c3RyZHVwIGluIE9CSl9FVkFYIGNhc2UuCi0KLVR1ZSBKdW4gIDIgMTM6MTE6MTMgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfY3JlYXRlX3Nob3J0X2p1bXApOiBGaXggb2ZmIGJ5IHR3byBidWcgaW4KLQlvZmZzZXQgY2FsY3VsYXRpb24uICBBbHNvLCB1c2UgVkFYX0JSVyBmcm9tIHZheC1pbnN0LmggaW5zdGVhZAotCW9mIGhhcmRjb2RlZCBtYWdpYyBudW1iZXIuCi0JKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBVc2UgVkFYX0pNUCBhbmQgVkFYX0FCU09MVVRFX01PREUgbWFjcm9zLgotCi1UdWUgSnVuICAyIDA5OjI1OjM0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZG9fc19mdW5jKTogTmV3IGZ1bmN0aW9uLgotCShzX2Z1bmMpOiBDYWxsIGl0LgotCSogcmVhZC5oIChkb19zX2Z1bmMpOiBBZGQgcHJvdG90eXBlLgotCi1Nb24gSnVuICAxIDEyOjQ3OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBPbmx5IGZpbGwgY29kZSBzZWN0aW9ucyB3aXRoCi0Jbm9wcyBpZiBmaWxsIHBhdHRlcm4gbm90IHNwZWNpZmllZC4KLQotTW9uIEp1biAgMSAxNDowODozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEFuZHJldyBDcmFidHJlZSA8YW5kcmV3Y0B0eXBob29uLnJvc2UuaHAuY29tPjoKLQkqIGNvbmZpZy90ZS1nbzMyLmggKFRFX0dPMzIpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChMT0NBTF9MQUJFTCk6IERvbid0IGRlZmluZSBpZiBURV9HTzMyLgotCi1TdW4gTWF5IDMxIDE1OjQzOjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlJbXBsZW1lbnQgLmZ1bmMvLmVuZGZ1bmMgcHNldWRvLW9wcy4KLQkqIHJlYWQuaCAoc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMsc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMpOiBEZWNsYXJlLgotCShzX2Z1bmMpOiBEZWNsYXJlLgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIC5mdW5jLC5lbmRmdW5jLgotCShzX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fZnVuYyxzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoaW5fZG9jX2Z1bmNfcCxjdXJyZW50X2Z1bmN0aW9uX2xhYmVsKTogTmV3IHN0YXRpYyBnbG9iYWxzLgotCShzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogRW1pdCBmdW5jdGlvbiByZWxhdGl2ZSBzdGFicyBpZiBpbiAuZnVuYy4KLQotRnJpIE1heSAyOSAxODoxMzoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hMjlrLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaHBwYS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWk4NjAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtdGljMzAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy13NjUuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy16OGsuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IERvbid0IGRlZmluZSBtZF9zaG9ydF9qdW1wX3NpemUsCi0gCW1kX2xvbmdfanVtcF9zaXplLCBtZF9jcmVhdGVfc2hvcnRfanVtcCBvciBtZF9jcmVhdGVfbG9uZ19qdW1wLgotCSogY29uZmlnL3RjLWFscGhhLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFscGhhLmg6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFybS5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk4NjAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTk2MC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1wcGMuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc3BhcmMuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdGljMzAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdzY1LmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXo4ay5jOiBMaWtld2lzZS4KLQotRnJpIE1heSAyOSAxNjowMzoyNiAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL3RjLXZheC5jIChfKTogRGVsZXRlIHRoaXMgbWFjcm8gdXNlZCBmb3IgcGxhY2Vob2xkZXIKLQl2YWx1ZXMgaW4gdmF4X29wZXJhbmRfd2lkdGhfc2l6ZTsgaXQgY29uZmxpY3RzIHdpdGggdGhlIF8oKSBtYWNybwotCXVzZWQgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotCi1GcmkgTWF5IDI5IDEzOjQ2OjA3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfZmluZF9iYXNlKTogRml4IGNhc2UgaW5zZW5zaXRpdmUgc3ltYm9sIG5hbWUKLQljb2RlLiAgRnJvbSBDaHJpcyBNb2xsZXIgPG1vbGxlckBib3BzLmNvbT4uCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEtsYXVzIEthZW1wZiA8a2thZW1wZkBwcm9naXMuZGU+OgotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBicm9rZW5fd29yZCk6IEFkZCBzZWcgYW5kIHN1YnNlZyBmaWVsZHMuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IEluaXRpYWxpemUgc2VnIGFuZCBzdWJzZWcgZmllbGRzIG9mIGEgbmV3Ci0JYnJva2VuIHdvcmQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFN3aXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgc2VnbWVudAotCWFuZCBzdWJzZWdtZW50IHdoZW4gcHJvY2Vzc2luZyBhIGJyb2tlbiB3b3JkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtcmlfYXNzZW1ibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2FsbCBtcmlfYXNzZW1ibGUgcmF0aGVyIHRoYW4KLQltZF9hc3NlbWJsZS4KLQkoc19tcmlfZWxzZSwgc19tcmlfYnJlYWssIHNfbXJpX25leHQsIHNfbXJpX2Zvcik6IExpa2V3aXNlLgotCShzX21yaV9lbmRmLCBzX21yaV9lbmR3KTogTGlrZXdpc2UuCi0KLVdlZCBNYXkgMjcgMTE6MTY6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfb3JnKTogQ2FsbCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpZiBpdCBpcyBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvd191c2FnZSk6IEFkZCBcblwgdG8gbmV3IHN0cmluZy4KLQotVHVlIE1heSAyNiAxOToyNzo1MiAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQSk6IE5ldy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIGZvciBzYW1lLgotCShzcGFyY19tZF9lbmQpOiBTZXQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgotCShtZF9hcHBseV9maXgzLCB0Y19nZW5fcmVsb2MpOiBBbGxvdyBCRkRfUkVMT0NfU1BBUkNfMzJMRS4KLQkoY29uc19maXhfbmV3X3NwYXJjKTogQWRkZWQgdG8gY3JlYXRlIEJGRF9SRUxPQ19TUEFSQ18zMkxFLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoY29uc19maXhfbmV3X3NwYXJjKTogQWRkZWQuCi0JCi1UaHUgTWF5IDIxIDE1OjAyOjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZmluZF9yZWFsX3N0YXJ0KTogUmVsYXggZGVmaW5pdGlvbiBvZiBsb2NhbAotCWxhYmVscy4KLQotVHVlIE1heSAxOSAxNjo1OTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkMzB2X2FsaWduKTogQXBwbHkgYWRkcmVzcyBhZGp1c3RtZW50IHRvIGFsbAotCXN5bWJvbHMgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIG5vdCBqdXN0IHRoZSBsYXN0IG9uZSBzcGVjaWZpZWQuCi0KLVR1ZSBNYXkgMTkgMDg6MjU6MTkgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19oYW5kbGVfYWxpZ24pOiBVc2UgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbgotICAgICAgICBvciBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIHRvIHdyaXRlIGRhdGEuCi0KLU1vbiBNYXkgMTggMTc6MDk6MzAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBSZW1vdmUgYXJ0aWZpY2lhbGx5IGNyZWF0ZWQKLQlyZWdpc3RlciBuYW1lIHN5bWJvbHMuCi0KLU1vbiBNYXkgMTggMTM6NDc6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSAic2VnbWVudCIgdG8gInNlY3Rpb24iIGluCi0JZXJyb3IgbWVzc2FnZS4KLQotTW9uIE1heSAxOCAxNjo1NTo0MCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSBzeW0xLXN5bTIgbWVzc2FnZSBhZ2Fpbi4KLQotTW9uIE1heSAxOCAwOTozMTo0MyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZSBmb3Igc3ltMS1zeW0yCi0JZXJyb3JzIHdoZW4gc3ltMSBpcyBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGZyb20gc3ltMi4KLQotV2VkIE1heSAxMyAxMDoxNjozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jICh3YXJuX3VubWF0Y2hlZF9oaWdoKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoT1BUSU9OX1dBUk5fUEFSQUxMRUwpOiBSZW5hbWUgZnJvbSBPUFRJT05fV0FSTi4KLQkoT1BUSU9OX05PX1dBUk5fUEFSQUxMRUwpOiBSZW5hbWUgZnJvbSBPUFRJT05fTk9fV0FSTi4KLQkobWRfbG9uZ29wdHMpOiBSZWNvZ25pemUgLS17bm8tLH13YXJuLXVubWF0Y2hlZC1oaWdoLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkobWRfc2hvd191c2FnZSk6IExpa2V3aXNlLgotCShtMzJyX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKGdlbmVyYXRlX2ZpbGVfZGVidWcsZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogTmV3IGZ1bmN0aW9ucy4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCB0aGVtLgotCSogcmVhZC5oIChzdGFic19nZW5lcmF0ZV9hc21fZmlsZSk6IERlY2xhcmUuCi0JKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJhdGVfYXNtX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBNb3ZlIGZpbGUgbmFtZSBoYW5kbGluZyBpbnRvCi0JZ2VuZXJhdGVfYXNtX2ZpbGUuCi0KLVR1ZSBNYXkgMTIgMTI6MDM6NDQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoY3VyX211bDMyX3AsIHByZXZfbXVsMzJfcCk6IE1ha2Ugc3RhdGljLgotICAgICAgICAoZDMwdl9jdXJyZW50X2FsaWduLCBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnKTogTmV3IHZhcmlhYmxlcy4KLSAgICAgICAgKGQzMHZfbGFzdF9sYWJlbCk6IE5ldyB2YXJpYWJsZS4KLSAgICAgICAgKGQzMHZfYWxpZ24sIHNfZDMwdl9hbGlnbiwgc19kMzB2X3RleHQpOiBOZXcgZnVuY3Rpb25zLgotICAgICAgICAoc19kMzB2X2RhdGEsIHNfZDMwdl9zZWN0aW9uKTogTGlrZXdpc2UuCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIHRoZW0uCi0gICAgICAgIChtZF9iZWdpbik6IEluaXRpYWxpemUgZDMwdl9jdXJyZW50X2FsaWduX3NlZy4KLSAgICAgICAgKG1kX2Fzc2VtYmxlKTogQ2FsbCBkMzB2X2FsaWduIHdoZW4gbmVlZGVkIGJ5IGtub3duIGN1cnJlbnQgYWxpZ25tZW50LgotICAgICAgICAoZDMwdl9mcm9iX2xhYmVsLCBkMzB2X2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb25zLgotICAgICAgICAqIGNvbmZpZy90Yy1kMzB2LmggKG1kX2RvX2FsaWduKTogUmVtb3ZlLgotICAgICAgICAodGNfZnJvYl9sYWJlbCk6IENhbGwgZDMwdl9mcm9iX2xhYmVsLgotICAgICAgICAobWRfY29uc19hbGlnbik6IE5ldy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZmluZF9mb3JtYXQpOiBDb252ZXJ0IGNvbXBsZXggZXhwcmVzc2lvbnMgdG8gCi0JZXhwcmVzc2lvbiBzeW1ib2xzIGJlZm9yZSBwcm9jZXNzaW5nLiAgQ2xlYW4gdXAgY29kZSBmb3JtYXR0aW5nLgotCi1TdW4gTWF5IDEwIDIyOjM1OjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotVGh1IE1heSAgNyAxNTo0OTowNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlICJicmEiIGp1c3QgbGlrZSAiam1wIgotCWluc3RydWN0aW9ucy4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0KLVRodSBNYXkgIDcgMTE6NDc6MjIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFVwZGF0ZSB3aXRoIGBtYWtlIGRlcC1hbScuCi0JKEhGSUxFUyk6IEFkZCBjZ2VuLmguCi0JKGNnZW4ubyk6IERlcGVuZCBvbiBjZ2VuLmguCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotCSogY2dlbi5jIChjZ2VuX21kX2FwcGx5X2ZpeDMpOiBEb24ndCBwYXNzIG5ld2xpbmUgdG8gYXNfd2Fybl93aGVyZS4KLQotVGh1IE1heSAgNyAxMzoyMDo1NiAxOTk4ICBBbmRlcnMgQmxvbWRlbGwgIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+Ci0KLQkqIGdhc3AuYyAoZ3JhYl9sYWJlbCk6IFBlcm1pdCBhIGxhYmVsIHRvIGJlIGEgcHJlcHJvY2Vzc29yCi0JdmFyaWFibGUgYnkgcGVybWl0dGluZyBhIGxhYmVsIHRvIHN0YXJ0IHdpdGggYSBiYWNrc2xhc2guCi0KLVRodSBNYXkgIDcgMTI6NTA6MzMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAodmFsaWRhdGVfbWlwc19pbnNuKTogUmVtb3ZlZCBoYWNrCi0JZm9yIHByZXZpb3VzbHkgaW5hY2Nlc3NpYmxlIGJpdGZpZWxkcyBpbiBzb21lIElOU05fVFJBUAotCWluc3RydWN0aW9ucy4KLQotVGh1IE1heSAgNyAxMToxMzowMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IEFib3J0IHdpdGggZXJyb3IgbWVzc2FnZQotCWlmIG9wY29kZSBvcGVyYW5kcyBkbyBub3QgbWF0Y2guCi0JCi1UaHUgTWF5ICA3IDA5OjM2OjA2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkLCB2YWxpZGF0ZV9taXBzX2luc24pOiBJbXBsZW1lbnQKLQkncScgb3BlcmFuZCBmb3JtYXQgZm9yIDIwLWJpdCAiYnJlYWsiLyJzZGJicCIgaW5zdHJ1Y3Rpb25zLgotCShtaXBzX2lwKTogVHJ1bmNhdGUgb3ZlcmZsb3dlZCAiYnJlYWsiICdjJyBvcGVyYW5kLiAgSW1wbGVtZW50Ci0Jc2ltaWxhciBuZXcgJ3EnIG9wZXJhbmQuCi0KLVRodSBNYXkgIDcgMDc6NDc6MTQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9hc21fZmluaXNoX2luc24pOiBGaXggdHlwby4KLQotVGh1IE1heSAgNyAwMjoxOToxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBOZXcgZmlsZS4KLQkqIGNnZW4uYzogSW5jbHVkZSBpdC4KLQkoTUFYX0ZJWFVQUyk6IFJlbmFtZWQgdG8gQ0dFTl9NQVhfRklYVVBTLgotCShjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFJlc3VsdCBpcyBub3cgdm9pZC4gIE5ldyBhcmcgYHJlc3VsdCcuCi0JQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IEluY2x1ZGUgY2dlbi5oLgotCShtMjNyX2luc24pOiBOZXcgbWVtYmVycyBudW1fZml4dXBzLGZpeHVwcy4KLQotV2VkIE1heSAgNiAxNjoyOToxOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IFNsaWdodGx5IHJld29yayBzb21lIGNvZGUKLQl0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgotCi1XZWQgTWF5ICA2IDE1OjI2OjM0IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJ1biBkZWMgYyB3aXRoIC9ub2RlYnVnLiAgUGFzcyBDQyB2YWx1ZSB3aGVuCi0JY2FsbGluZyBtYWtlLgotCi0gICAgICAgICogbWFrZWZpbGUudm1zIChPQkpTKTogQWRkIGVob3B0Lm9iagotCi1XZWQgTWF5ICA2IDE1OjExOjEyIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBkb2MvYy12YXgudGV4aTogQ29ycmVjdCBhbmQgZXh0ZW5kIHZheC92bXMgZG9jdW1lbnRhdGlvbi4KLQotV2VkIE1heSAgNiAxMTo1MTo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IEFjY2VwdCBhIG5ldyBwYXJhbWV0ZXIgcmVxdWVzdGluZwotCWEgc2hvcnQgZm9ybWF0IGluc24uCi0JKG1kX2Fzc2VtYmxlKTogU2V0IGl0IGZvciBleHBsaWNpdGx5IHBhY2tlZCBpbnNucy4KLQkKLVR1ZSBNYXkgIDUgMTM6MjM6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogRG8gbm90IHRha2UgYWRkcmVzcyBvZgotCW5hdGl2ZSBmaWVsZHMgd2hlbiBwZXJmb3JtaW5nIHRoZSBtZW1jcHkuCi0KLVR1ZSBNYXkgIDUgMTM6MTA6NDEgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvLG1hY3JvMik6IEltcGxlbWVudCAKLQlNX0RNVUxPX0ksIE1fTVVMT19JLCBNX0RNVUxPVV9JLCBhbmQgTV9NVUxPVV9JLgotCi1Nb24gTWF5ICA0IDE3OjQ5OjE0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBDaGFuZ2VkIHRvIGtlZXAKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IGdsb2JhbGx5IHZpc2libGUgc3ltYm9scy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHJlbGF4YWJsZV9zeW1ib2wpOiBOZXcgbWFjcm8uCi0JKG02OGtfaXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXNlIGl0LgotCSh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogQWxzbyBoYW5kbGUgd2VhayBzeW1ib2xzLgotCi1Nb24gTWF5ICA0IDE2OjEyOjIzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogS2VlcCByZWxvY3MgZm9yIGFsbAotCXJlZmVyZW5jZXMgdG8gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogV2hlbiBPQkpfRUxGLCBkb24ndCBhZGQgdGhlCi0gCXZhbHVlcyBpbiB0d2ljZSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBpZiB0aGUgc3ltYm9sIGlzCi0gCWV4dGVybmFsbHkgZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0FPVVRdOiBXaGVuIFBJQywKLQlkb24ndCBhZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZQotCXN5bWJvbC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzKTogV2hlbiBnZW5lcmF0aW5nIGEub3V0IFBJQywKLQlmb3IgYSBQQyByZWxhdGl2ZSBmaXh1cCBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZSBkZWZpbmVkCi0Jc3ltYm9sLCBhcnJhbmdlIHRvIHN0b3JlIG9iamVjdCBmaWxlIGFuZCBhZGRlbmQgdmFsdWVzIGFzIHRob3VnaAotCXRoZSBzeW1ib2wgd2VyZSBub3QgZGVmaW5lZC4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLVRodSBBcHIgMzAgMTM6MDk6MzkgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQG5pbmVtb29ucy5jb20+Ci0KLQkqIHJlYWQuYyAoc2l6ZW9mX2xlYjEyOCk6IFJlZmVyZW5jZWQgZXh0ZXJuYWxseSBieSB3cml0ZS5jIHNvCi0JZG9uJ3QgaW5saW5lLgotCi1XZWQgQXByIDI5IDE1OjQ1OjU3IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jICh7LGV4cGFuZF99ZGVidWdfc3ltKTogTmV3IGZ1bmN0aW9ucyB0byByZWNvcmQKLQlhbmQgZXhwYW5kIGEgJ2RlYnVnJyBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uCi0JdGhhdCBkb2VzIG5vdCBjYXVzZSBhIHNob3J0IGluc3RydWN0aW9uIHRvIGJlIGZpbGxlZCB3aXRoIGEgTk9QLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgc3VwcG9ydCBmb3IgLmRlYnVnc3ltLgotCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogQWRkIGNhbGxzIHRvIGV4cGFuZF9kZWJ1Z19zeW0gYXMKLQlhcHByb3ByaWF0ZS4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQotVHVlIEFwciAyOCAxOToxNjoyNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgotCSogZ2FzcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc2ludGwuaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCi0JKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgotCi1UdWUgQXByIDI4IDE4OjMzOjIzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3Nob3dfdXNhZ2UpOiBDb3JyZWN0IGdldHRleHQgdHlwby4KLQkKLVR1ZSBBcHIgMjggMTI6MTY6MzAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBDaGFuZ2UgYWxsIGNhbGxzIHRvIGJ6ZXJvIHRvIHVzZSBtZW1zZXQuCi0JKHBhX2lwKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkodGNfZ2VuX3JlbG9jLCBtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KLQkocGFfZmluZF9zcGFjZV9ieV9udW1iZXIpOiBMaWtld2lzZS4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKHBhX2Jsb2NrKTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCSogY29uZmlnL29iai1zb20uaCAob2JqX3NvbV9jb3B5cmlnaHQpOiBEZWNsYXJlLgotCi1UdWUgQXByIDI4IDExOjM1OjU2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2xpbmVubyk6IERvIG5vdCB1c2UgZHVtbXkgZmlyc3RfbGluZW5vCi0JZm9yIGxpbmUgbnVtYmVycyBmb3IgYXNzZW1ibHkgc291cmNlLgotCi1Nb24gQXByIDI3IDE1OjU4OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEFwciAyNyAxMjowNzozMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX2FzbV9maW5pc2hfaW5zbik6IE5ldyBhcmcgcmVsYXhfcC4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0KLU1vbiBBcHIgMjcgMTU6MTY6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oOiBDaGFuZ2Ugc3ltYm9sUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0byBzdHJ1Y3QKLQlzeW1ib2wuCi0KLVN1biBBcHIgMjYgMTM6NDQ6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBGaXggaTE4biB0eXBvLgotCi1TYXQgQXByIDI1IDIwOjEyOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9jdXJfcHJvY19zeW0pOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5oOiBQcm90b3lwZSBpdC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIFtFTEZdIChzX2FscGhhX3Byb2xvZ3VlKTogTmV3IGZ1bmN0aW9uLgotCVtFVkFYXSAoc19hbHBoYV9wcm9sb2d1ZSk6IERlbGV0ZS4KLQkobWRfcHNldWRvX3RhYmxlKTogVXBkYXRlLgotCi1TYXQgQXByIDI1IDE0OjAwOjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfYXNzZW1ibGUpOiBDaGFuZ2UgYnBfZXJyb3JfbXNnIGZyb20gc3RhdGljCi0JYXJyYXkgdG8gbG9jYWwgcG9pbnRlci4KLQkoZ2V0X2FyZ3MsIHBhcnNlX2V4cHIpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLUZyaSBBcHIgMjQgMTI6NDc6NDIgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0KLQkqIHJlYWQuYyAoc19zZXQpOiBDYXN0IHhtYWxsb2MgcmV0dXJuIHZhbHVlIHRvIGZyYWdTICouCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRnVuY3Rpb24gbWFkZSBzdGF0aWMgdG8gbWF0Y2gKLQlwcmV2aW91cyBmb3J3YXJkIGRlY2xhcmF0aW9uLgotCShpbnNlcnRfcmVnLCBpbml0X3JlZ3RhYmxlLCBtZF9jb252ZXJ0X2ZyYWdfMSk6IExpa2V3aXNlLgotCi1GcmkgQXByIDI0IDA5OjI2OjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEFkZCBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MgdG8gZXJyb3IKLQlzdHJpbmdzLiAgCi0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGNhbl9tYWtlX3BhcmFsbGVsKTogQWRkIGludGVybmF0aW9uYWxpc2F0aW9uCi0JbWFjcm9zIHRvIGVycm9yIHN0cmluZ3MuCi0KLVRodSBBcHIgMjMgMTk6MjM6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19maXhfYWRqdXN0YWJsZSk6IENvcnJlY3QgdGVzdCBvZiB3aGV0aGVyIGEKLQlyZWxvYyBpcyBpbiB0aGUgVE9DIGNzZWN0LgotCShtZF9hcHBseV9maXgzKTogQ29ycmVjdCBnZXR0ZXh0IHR5cG8uCi0KLVRodSBBcHIgMjMgMTQ6NTg6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChmaW5kX3JlYWxfc3RhcnQpOiBJZ25vcmUgc3ltYm9scyBzdGFydGluZyB3aXRoCi0JLkwgLSB0aGV5IGFyZSBsb2NhbCBsYWJlbHMgYW5kIHRoZSBicmFuY2hlcyBhcmUgbm90IHJlYWxseQotCWZ1bmN0aW9uIGNhbGxzIGJ1dCByYXRoZXIgZmFyIGp1bXBzLgotCi1XZWQgQXByIDIyIDE1OjU3OjIxIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAxNDo1MjozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogUHJpbnQgb3BlcmFuZCBudW1iZXIgcmF0aGVyIHRoYW4KLQl1c2luZyBvcmRpbmFsX25hbWVzLgotCShpMzg2X29wZXJhbmQpOiBMaWtld2lzZS4KLQotVHVlIEFwciAyMSAyMjozNDoyNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoSU5UTExJQlMpOiBEZWZpbmUgdG8gd29yayBhcm91bmQgYXBwYXJlbnQgYXV0b21ha2UKLQlidWcuCi0JQWxsIE1ha2VmaWxlczogUmVnZW5lcmF0ZWQuCi0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBhY2NvbmZpZy5oIChFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VUVEVYVCwgSEFWRV9TVFBDUFksCi0JSEFWRV9MQ19NRVNTQUdFUyk6IERlZmluZS4KLQkqIGRlcC1pbi5zZWQ6IEFkZGVkIGFzaW50bC5oLgotCSogcG8vTWFrZS1pbjogTmV3IGZpbGUuCi0JKiBnYXNwLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIGFuZCB0ZXh0ZG9tYWluLgotCUluY2x1ZGUgImFzaW50bC5oIi4KLQkqIHJlYWQuYyAoWl8pOiBSZW5hbWVkIGZyb20gYF8nLgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBBZGRlZCBwby4KLQkoUE9URklMRVMpOiBuZXcgbWFjcm8uCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkoJChPQkpTKSk6IEFkZGVkIGFzaW50bC5oLgotCShIRklMRVMpOiBMaWtld2lzZS4KLQkoSU5DTFVERVMpOiBBZGRlZCAtRExPQ0FMRURJUiwgLUkkKHRvcF9zcmNkaXIpLy4uL2ludGwuCi0JKGFzX25ld19MREFERCk6IEFkZGVkICQoSU5UTExJQlMpLgotCShhc19uZXdfREVQRU5ERU5DSUVTKTogQWRkZWQgJChJTlRMREVQUykuCi0JKGdhc3BfbmV3X0xEQUREKTogQWRkZWQgJChJTlRMTElCUykuCi0JKGdhc3BfbmV3X0RFUEVOREVOQ0lFUyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsdC4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBDWV9HTlVfR0VUVEVYVC4gIEdlbmVyYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLgotCShBTExfTElOR1VBUyk6IERlZmluZS4KLQkqIG1hY3JvLmM6IEluY2x1ZGUgImFzaW50bC5oIi4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIGFuZCB0ZXh0ZG9tYWluLgotCSogYXMuaDogSW5jbHVkZSAiYXNpbnRsLmgiLgotCSogY29uZmlnL3RjLWkzODYuYyAob3JkaW5hbF9uYW1lcyk6IFJlbW92ZWQuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlZCBlcnJvciB0ZXh0IHRvIGF2b2lkIG9yZGluYWxfbmFtZXMuCi0JKGkzODZfb3BlcmFuZCk6IExpa2V3aXNlLgotCShyZWxvYyk6IEFkZGVkIGFzX2JhZCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYmFkX2FyZ3MpOiBOb3cgYSAjZGVmaW5lLgotCShiYWRfcGMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19zdGFiX3BhcnNlKTogQ2hhbmdlZCB0eXBlIG9mCi0JYGxvbmdfY29uc3RfbXNnJy4KLQkoZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBVbmlmaWVkIHN0cmluZ3MgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogY29uZmlnL3RjLW02OGsuYyAoZ2V0X3JlbG9jX2NvZGUpOiBBZGRlZCBzb21lIGFzX2JhZCBjYWxscyB0bwotCWF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAocmVsb2MpOiBBZGRlZCBhc19iYWQgdG8gYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFkZGVkIGFzX2JhZF93aGVyZSB0byBhdm9pZAotCWkxOG4gcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogQWRkZWQgYXNfYmFkIHRvIGF2b2lkIGkxOG4KLQlwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ2hhbmdlZCBDKysgY29tbWVudCBpbnRvIEMKLQljb21tZW50LgotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IEFkZGVkIGFzX3dhcm4gdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogYXMuYyAocHJpbnRfdmVyc2lvbl9pZCk6IEFkZGVkIGFuIGZwcmludGYgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogY29uZC5jIChjb25kX2ZpbmlzaF9jaGVjayk6IEFkZGVkIGFzX2JhZCBjYWxsIHRvIGF2b2lkIGkxOG4KLQlwcm9ibGVtcy4KLQkqIGV4cHIuYyAoZXhwcik6IEFkZGVkIGFzX3dhcm4gY2FsbCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCSogbWVzc2FnZXMuYyAoYXNfYXNzZXJ0KTogQ2hhbmdlZCBjb2RlIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKGFzX2Fib3J0KTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBBZGRlZCBhc19iYWQgY2FsbCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCShzX3NwYWNlKTogTGlrZXdpc2UuCi0JKiBwby9NYWtlLWluLCBwby9QT1RGSUxFUy5pbiwgcG8vZ2FzLnBvdDogTmV3IGZpbGVzLgotCi1UdWUgQXByIDIxIDE3OjAxOjIyIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoY2hlY2tfcHJlZml4KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgc3BsaXQgb3V0Ci0JZnJvbSBtZF9hc3NlbWJsZS4KLQkoc3RydWN0IF9pMzg2X2luc24pOiBBZGQgd2FpdF9wcmVmaXggZmllbGQuCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIHdhaXRfcHJlZml4IGxvY2FsIHZhcmlhYmxlLiAgVXNlCi0JY2hlY2tfcHJlZml4IHdoZW4gYWRkaW5nIGEgcHJlZml4LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjdXJyZW50X3RlbXBsYXRlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIGN1cnJlbnRfdGVtcGxhdGVzIGxvY2FsIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSwgaTM4Nl9vcGVyYW5kKTogSW1wcm92ZSBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBpbgotCW1hbnkgcGxhY2VzLiAgQWRkIFJFU1RPUkVfRU5EX1NUUklORyBpbiBtYW55IHBsYWNlcyBiZWZvcmUgZXJyb3IKLQlyZXR1cm4uICBDbGFyaWZ5IHNvbWUgY29tbWVudHMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogQ2hhbmdlIHNlZyBmaWVsZCB0byBhIHR3bwotCWVsZW1lbnQgYXJyYXkuCi0JKG1kX2Fzc2VtYmxlKTogUGFyc2Ugc3RyaW5nIGluc3RydWN0aW9uIG9wZXJhbmRzLCBsb29raW5nIGZvcgotCXNlZ21lbnQgb3ZlcnJpZGUgcHJlZml4ZXMuICBDaGVjayBmb3IgaW52YWxpZCBzZWdtZW50IHByZWZpeGVzIG9uCi0Jc3RyaW5nIGluc3RydWN0aW9uLgotCShpMzg2X29wZXJhbmQpOiBpLnNlZ1tdIGFuZCBtYXggbWVtX29wZXJhbmQgY2hhbmdlcyBmb3Igc3RyaW5nCi0JaW5zbnMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChFc1NlZyk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWkzODYuaCAocmVnS2x1ZGdlKTogRGVmaW5lLgotCShpY2xyS2x1ZGdlLCBpbXVsS2x1ZGdlKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBNZXJnZSBpbXVsS2x1ZGdlIGFuZCBpY2xyS2x1ZGdlCi0JY29kZS4gIE1vdmUgUmV2ZXJzZVJlZ1JlZ21lbSBmdWRnZXMgaW50byBNb2RybSBjYXNlLiAgUmVvcmRlcgotCW9wY29kZV9tb2RpZmllciBjaGVja3MgdG8gbG9vayBmb3IgbW9yZSBjb21tb24gY2FzZXMgZmlyc3QuICBBZGQKLQlkZWZhdWx0X3NlZyBmb3IgSXNTdHJpbmcgY2FzZS4KLQotVHVlIEFwciAyMSAxNjoxODoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9QUk9HX0xFWCByYXRoZXIgdGhhbiBBQ19QUk9HX0xFWCBhbmQKLQlBQ19ERUNMX1lZVEVYVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZSBhbmQgbGlidG9vbC4KLQkqIGFjbG9jYWwubTQsIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotCSogZG9jL01ha2VmaWxlLmFtIChhcy5kdmkpOiBOZXcgdGFyZ2V0LgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TYXQgQXByIDE4IDAxOjIxOjA0IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIHNwYXJjODZ4IHN1cHBvcnQuCi0JCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobG9va3VwX2FyY2gpOiBBZGRlZCBhcmNoX3R5cGUgdG8gc3RydWN0Ci0Jc3BhcmNfYXJjaC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogV2FybiBpZiAtRUwgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChTUEFSQ19CSUVORElBTikgQWx3YXlzIGRlZmluZS4KLQkKLVNhdCBBcHIgMTggMDE6MTk6MDEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE5vdGUgd2hlbiB3ZSB1c2UgZ2V0IG1hdGNoIG9uCi0gICAgICAgIHRoZSBmdWxsIGluc3RydWN0aW9uIG5hbWUuCi0KLVdlZCBBcHIgMTUgMTU6MTc6MjcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSkgW09fc3ltYm9sXTogQWxzbyBzdG9yZSB0aGUgc3ltYm9sCi0JYmFjayBpbnRvIHRoZSBleHByZXNzaW9uIHRvIGhhbmRsZSBhZGQvc3ViIHNpbXBsaWZpY2F0aW9uIGNvcnJlY3RseS4KLQotV2VkIEFwciAxNSAwNzowNjowNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKGhpbG9faW50ZXJsb2Nrcyk6IFJlbW92ZSA0MzAwLgotCi1Nb24gQXByIDEzIDE2OjUxOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fbXNyKTogU3VwcG9ydCB1bmRvY3VtZW50ZWQgJ21zciBjcHNyX2ZsZywKLQkjPG4+JyBpbnN0cnVjdGlvbi4KLQotVGh1IEFwciAgOSAxMDoyOTo0MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKG1heF9pbmRlbnRfbGV2ZWwpOiBOZXcgZ2xvYmFsLgotCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IFVzZSBpdC4KLQkqIGV4cHIuaCAoZXhwcl9idWlsZF9kb3QpOiBEZWNsYXJlLgotCSogZXhwci5jIChleHByX2J1aWxkX2RvdCk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIEFwciAgOCAxNjoxNjoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHByaW50X2JpbmFyeSk6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfZXhwcl8xKTogQ2FsbCBpdC4KLQotTW9uIEFwciAgNiAxMjowNjozOSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSAiI0IiKTogSW5zdGFsbCB0aGUgb2Zmc2V0IG9mIHRoZQotCW9wZXJhbmQgaW4gdGhlIG9wY29kZS4KLQotRnJpIEFwciAgMyAxMTo1ODoxOSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2Lmg6IFJlb3JkZXIgb3BlcmFuZCBmbGFncyBhbmQgb3Bjb2RlIG1vZGlmaWVyCi0JZmxhZ3MgZm9yIGNsYXJpdHkuICBSZW1vdmUgdW51c2VkIGRlZmluaXRpb25zOiBVbmtub3duLAotCUltbVVua25vd24sIERpc3BVbmtub3duLCBOb01vZHJtLgotCSogY29uZmlnL3RjLWkzODYuYyAodHlwZV9uYW1lcyk6IEFkZCBtaXNzaW5nIERlYnVnIHR5cGUuCi0JKG1kX2Fzc2VtYmxlKTogQmV0dGVyIGR1cGxpY2F0ZSBwcmVmaXggY2hlY2tpbmcuICBRdWlja2VyIHN0cmluZwotCWluc3RydWN0aW9uIGNoZWNrIHZpYSBuZXcgb3Bjb2RlX21vZGlmaWVyIGZsYWcuCi0KLUZyaSBBcHIgIDMgMTE6NDQ6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoSW52b2tpbmcpOiBDbGFyaWZ5IC1XYSBleGFtcGxlLgotCi1GcmkgQXByICAzIDA5OjEyOjIzIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjZXR1cy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3BzZXVkb190YWJsZSk6IEFkZCB3ZWFrZXh0IGVudHJ5LiAKLQkoc19taXBzX3dlYWtleHQpOiBEZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCk6IERvbid0IGRlZmluZSBpZiBkZWZpbmVkKFRDX01JUFMpLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogRG9uJ3QgYWRkIHdlYWtleHQgaWYgCi0JZGVmaW5lZChUQ19NSVBTKS4JCi0JCi1UaHUgQXByICAyIDIyOjQyOjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAodGNfZ2VuX3JlbG9jKTogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMKLQlpcyBhbiBlcnJvciBpZiB0aGUgdmFsdWUgY2FuIG5vdCBiZSBjb21wdXRlZCBhdCBhc3NlbWJseSB0aW1lLgotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAodGNfZ2VuLXJlbG9jKTogTGlrZXdpc2UuCi0KLVRodSBBcHIgIDIgMTY6MzY6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKG1haW4pOiBTZXQgbmV4dCBmaWVsZCBvZiBuZXcgaW5jbHVkZV9wYXRoIHN0cnVjdHVyZSB0bwotCU5VTEwuICBGcm9tIEF2ZXJ5IFBlbm5hcnVuIDxhdmVyeXBAZ2RjLmNhPi4KLQotCSogcmVhZC5jIChzX21yaV9zZWN0KTogQ2FsbCBhc19iYWQgcmF0aGVyIHRoYW4gYWJvcnQgZm9yIGFuCi0JdW5zdXBwb3J0ZWQgTVJJIHRhcmdldC4KLQotV2VkIEFwciAgMSAxMTowODoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV92YWxpZGF0ZV9maXgpOiBOZXcgZnVuY3Rpb24uICBEZXRlcm1pbmUgaWYKLQl0aGUgZGVzdGluYXRpb24gb2YgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGFsdGVyZWQuCi0JKGZpbmRfcmVhbF9zdGFydCk6IE5ldyBmdW5jdGlvbjogIExvY2F0ZSB0aGUgcmVhbCwgVGh1bWIgY29kZWQKLQlzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLgotCShkb190X2JyYW5jaDIzKTogQWx0ZXIgdGhlIGRlc3RpbmF0aW9uIG9mIGJyYW5jaGVzIHRvIFRodW1iCi0JZnVuY3Rpb25zLiAKLQotCSogY29uZmlnL3RjLWFybS5oOiBEZWZpbmUgVENfVkFMSURBVEVfRklYLgotCi1UdWUgTWFyIDMxIDEzOjI3OjMzIDE5OTggIERlYW4gTS4gRGVhdmVyICA8ZGVhdmVyQGFtdC50YXkxLmRlYy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZGVjb2RlX3NoaWZ0KTogSGFuZGxlIGFkZHJlc3NpbmcgbW9kZSAyIHcvcnJ4Ci0JYWxzby4KLQotV2VkIEFwciAgMSAxMzoxMzoyMCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZG9jL2FzLnRleGluZm86IFVzZSBAaXRlbXggZm9yIGEgc2Vjb25kYXJ5IGl0ZW0gaW4gYSB0YWJsZS4KLQkqIGRvYy9jLWhwcGEudGV4aTogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMzEgMTc6NTI6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW0gKERFUF9JTkNMVURFUyk6IE5ldyB2YXJpYWJsZS4KLQkoLmRlcDEpOiBDaGFuZ2UgdG8gd29yayB3aGVuIHNyY2RpciBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aC4KLQkoLnRjZGVwLCAub2JqZGVwLCAuZGVwMiwgZGVwLnNlZCk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBNYXIgMzAgMTI6NDY6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oLCBjb25maWcvdGMtaTM4Ni5jOiBSZXZlcnQgTWFyY2ggMjQKLQlMaW5lYXJBZGRyZXNzIHBhdGNoLgotCi0JKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLU1vbiBNYXIgMzAgMTE6MjI6MDggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChGV2FpdCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRW1pdCBmd2FpdCBwcmVmaXggYmVmb3JlIGFueQotCW90aGVyIHByZWZpeGVzLiAgQ2hlY2sgRldhaXQgZmxhZyBpbiBvcGNvZGUgdGFibGUgdG8gc2VlIHdoaWNoCi0JaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgYW4gZndhaXQgcHJlZml4LgotCi1Nb24gTWFyIDMwIDEwOjEyOjAwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogQWx3YXlzIGNyZWF0ZSBhIHN0YWIgc3RyaW5nCi0Jc2VjdGlvbi4KLQotU2F0IE1hciAyOCAyMjoyODowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBMaWtld2lzZS4KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwgb3BlcmFuZCk6IExpa2V3aXNlLgotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IExpa2V3aXNlLgotCSogZ2FzcC5jIChsZXZlbF8wLCBjaGFuZ2VfYmFzZSwgZG9pbnN0cik6IExpa2V3aXNlLgotCSogaGFzaC5jIChoYXNoX2Fzayk6IExpa2V3aXNlLgotCSogbGlzdGluZy5jIChsaXN0aW5nX3BhZ2UsIGNhbGNfaGV4LCBwcmludF9saW5lcyk6IExpa2V3aXNlLgotCShkZWJ1Z2dpbmdfcHNldWRvKTogTGlrZXdpc2UuCi0JKiBtYWNyby5jIChkZWZpbmVfbWFjcm8sIGNoZWNrX21hY3JvKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSwgc19hbGlnbiwgc19mbG9hdF9zcGFjZSk6IExpa2V3aXNlLgotCShpZ25vcmVfcmVzdF9vZl9saW5lLCBmbG9hdF9jb25zKTogTGlrZXdpc2UuCi0JKiBzeW1ib2xzLmMgKGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lKTogTGlrZXdpc2UuCi0JKiB3cml0ZS5jIChyZWNvcmRfYWxpZ25tZW50LCBjdnNfZnJhZ190b19maWxsKTogTGlrZXdpc2UuCi0JKGZpeHVwX3NlZ21lbnQsIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4pOiBMaWtld2lzZS4KLQkobnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbik6IExpa2V3aXNlLgotCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbiwgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQkoc3BhcmNfaXAsIHBhcnNlX2tleXdvcmRfYXJnLCBzX2NvbW1vbik6IExpa2V3aXNlLgotCSogcmVhZC5jIChvdXRwdXRfYmlnX3NsZWIxMjgpOiBJbml0aWFsaXplIGxvY2FscyB0byBhdm9pZAotCXdhcm5pbmdzLgotCShvdXRwdXRfYmlnX3VsZWIxMjgsIGVxdWFscyk6IExpa2V3aXNlLgotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IENoYW5nZSBudW1iZXJfb2ZfZGlnaXRzXyogbG9jYWxzCi0JdG8gdW5zaWduZWQgaW50LiAgQ2hhbmdlIHplcm9zIHRvIHVuc2lnbmVkIGludC4KLQkqIGNvbmQuYyAoc19pZik6IEFkZCByZXR1cm4gdG8gZGVmYXVsdCBjYXNlLgotCSogZnJhZ3MuYyAoZnJhZ19ub3dfZml4KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGFkZHJlc3NULgotCSogZnJhZ3MuaCAoZnJhZ19ub3dfZml4KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGlzdGluZy5jIChmaWxlX2luZm9fc3RydWN0KTogQ2hhbmdlIGxpbmVudW0gdG8gdW5zaWduZWQgaW50LgotCShzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCk6IENoYW5nZSBobGxfbGluZSB0byB1bnNpZ25lZCBpbnQuCi0JKHByaW50X3NvdXJjZSk6IFVwZGF0ZSBmb3JtYXQgc3RyaW5nLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBDaGFuZ2Ugc2NhbiB0byB1bnNpZ25lZCBpbnQsIGFuZCBkb24ndAotCWJvdGhlciB0byBpbml0aWFsaXplIGl0LgotCSogc3ltYm9scy5jIChkb2xsYXJfbGFiZWxfY291bnQpOiBDaGFuZ2UgdG8gdW5zaWduZWQgbG9uZy4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVtb3ZlIHVudXNlZCBsYWJlbCByZWR1Y2VfZml4dXAuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfbWVtb3J5X21vZGVsKTogT25seSBkZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBBZGQgcmV0dXJuIHRvIGRlZmF1bHQgY2FzZS4KLQotRnJpIE1hciAyNyAxMjo0Njo0NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDaGVjayBsZWdhbCBhZGRyZXNzaW5nIG1vZGVzIGZvcgotIAltY2Y1MjAwIGp1c3QgYXMgd2UgZG8gZm9yIG02ODAwMC4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBMaWtld2lzZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KLQotRnJpIE1hciAyNyAxMDozMDowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiAgU3RvcmUgcmVsb2NhdGlvbiBhZGRlbmQgaW4KLQlmaXh1cCBpbnN0ZWFkIG9mIGluc3RydWN0aW9uLgotCi1UaHUgTWFyIDI2IDIzOjA3OjE4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBTd2FwIHRlbXBsYXRlIGFyZ3VtZW50cyB0bwotCUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggbWFjcm8gaW4gcmV2ZXJzZSBkaXJlY3Rpb24gdGVzdC4KLQlUaGlzIG1hY3JvIGlzIGN1cnJlbnRseSBzeW1tZXRyaWMsIHNvIHBhc3NpbmcgdGhlbSB0aGUgd3JvbmcKLQl3YXkgZGlkbid0IGNhdXNlIGFueSBwcm9ibGVtLCBidXQgbWF5IGlmIHRoZSBtYWNybyBpcyBjaGFuZ2VkCi0JaW4gdGhlIGZ1dHVyZS4KLQlBZnRlciBjb3B5aW5nIHRlbXBsYXRlIHRvIGkudG0sIHVzZSBpLnRtLiByYXRoZXIgdGhhbiB0LT4gdG8KLQlhY2Nlc3MgZmllbGRzLCBhbmQgbWFrZSB0IGEgY29uc3QqCi0JTW92ZSBpLnRtLm9wZXJhbmRfdHlwZXNbXSBzd2FwIHRvIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb3B5LgotCi1XZWQgTWFyIDI1IDEzOjQ0OjE4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGV4cHIuaCAoZXhwcl9idWlsZF91Y29uc3RhbnQpOiBBZGQgcHJvdG90eXBlLgotCShleHByX2J1aWxkX3VuYXJ5LGV4cHJfYnVpbGRfYmluYXJ5KTogQWRkIHByb3RvdHlwZXMuCi0JKiBleHByLmMgKGV4cHJfYnVpbGRfdWNvbnN0YW50KTogTmV3IGZ1bmN0aW9uLgotCShleHByX2J1aWxkX3VuYXJ5LGV4cHJfYnVpbGRfYmluYXJ5KTogTmV3IGZ1bmN0aW9ucy4KLQotV2VkIE1hciAyNSAxMzoxMDo0MiAxOTk4ICBCcnVubyBIYWlibGUgIDxicnVub0BsaW51aXgubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotCi0gICAgICAgICogZ2FzcC5jIChJUyopOiBDYXN0IGFyZ3VtZW50IHRvIHVuc2lnbmVkIGNoYXIsIG5vdCB1bnNpZ25lZCBpbnQuCi0gICAgICAgICogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBJbmNyZWFzZSBidWZmZXIgc2l6ZS4KLSAgICAgICAgKiBtZXNzYWdlcy5jIChhc193YXJuKTogTGlrZXdpc2UuCi0JKGFzX3dhcm5fd2hlcmUsIGFzX2JhZCwgYXNfYmFkX3doZXJlKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMjUgMTI6NTk6MDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZS4KLQkoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgTWFyIDI0IDE2OjUxOjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmggKG1kX2NsZWFudXAsIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogQ2FsbAotCW0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2suCi0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBOZXcgZnVuY3Rpb24gdG8KLQllbWl0IGEgbm9wIGlmIGEgc2VjdGlvbiBlbmRzIHdpdGggYSAxNiBiaXQgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBNYXIgMjQgMTk6NDg6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfYnNzKTogQ29tcGlsZSB1bmNvbmRpdGlvbmFsbHkuICBDYWxsCi0Jc19sY29tbSByYXRoZXIgdGhhbiBvYmpfY29mZl9sY29tbS4KLQkob2JqX3BzZXVkb190YWJsZSk6IENvbXBpbGUgLmJzcyBwc2V1ZG8tb3AgdW5jb25kaXRpb25hbGx5LgotCi1UdWUgTWFyIDI0IDE4OjMwOjU4IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoTGluZWFyQWRkcmVzcyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSWYgTGluZWFyQWRkcmVzcyBpcyBzZXQgZm9yIHRoZQotCWluc3RydWN0aW9uLCBkb24ndCB1c2UgYSBkZWZhdWx0IHNlZ21lbnQuCi0KLU1vbiBNYXIgMjMgMTg6NTM6NDAgMTk5OCAgSm9lbCBTaGVycmlsbCAgPGpvZWxAT0FSY29ycC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogKHNoKi0qLXJ0ZW1zKik6IFN3aXRjaGVkIGZyb20gRUxGIHRvIENPRkYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjAgMTk6MTU6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotVGh1IE1hciAxOSAxNjowMzoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBmaXggY29kZSB0byB0ZXN0IHRoZSByYW5nZSBvZgotCVBDIHJlbGF0aXZlIGJyYW5jaGVzLiAgUGF0Y2ggY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uLiAKLQotCQotV2VkIE1hciAxOCAwOToyOTo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgotCi0xOTk4LTAzLTE3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaXRibC1sZXgubCAoeXl3cmFwKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZCBhcyBhCi0JbWFjcm8uCi0KLUZyaSBNYXIgMTMgMTY6MzE6MzggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBkZXBlbmQuYyAocXVvdGVfc3RyaW5nX2Zvcl9tYWtlKTogTmV3IGZ1bmN0aW9uLgotCSh3cmFwX291dHB1dCk6IFVzZSBpdC4KLQotVGh1IE1hciAxMiAxODoyODoyMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgYnNzIGZsYWcgaW4gc2VnX2luZm8KLQlzdHJ1Y3R1cmUgaWYgdHlwZSBpcyBTSFRfTk9CSVRTLiAgW0J1ZyBmaXggY291cnRlc3kgb2YgcnRoXQotCi1TYXQgRmViIDI4IDE3OjI4OjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG9ydG9wdHMsIG1kX2xvbmdvcHRzLCBtZF9wYXJzZV9vcHRpb24pOgotCVJlY29nbml6ZSAtR04gYW5kIC1yZWxheC4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIGdwIHNpemUgZnJvbSAtRyBzd2l0Y2guCi0JKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBBbHdheXMgZm9yY2UgaWYgLXJlbGF4LgotCShhbHBoYV9hbGlnbik6IFRha2UgYSBuZXcgYXJndW1lbnQgdGhhdCB3aWxsIHNwZWNpZnkgd2hlbiB0byAKLQllbWl0IGFuIFJfQUxQSEFfQUxJR04gcmVsb2NhdGlvbiAodGhvdWdoIHdlIGRvbid0IGRvIHRoYXQgbm93KS4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuICBFbWl0IG5vcCBhbGlnbm1lbnQgcGFkZGluZyBhcyBub3ArdW5vcCBwYWlyLgotCi1TYXQgRmViIDI4IDE3OjA2OjIyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgW1RDX0FMUEhBXTogSW5jbHVkZSA8ZWxmL2FscGhhLmg+LgotCSogY29uZmlnL3RjLWFscGhhLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogTmV3LgotCi1UaHUgRmViIDI2IDE1OjQ5OjA0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRGVsYXllZCBqc3IgaW5zdHJ1Y3Rpb25zIGRvbid0Ci0JcmVxdWlyZSBwYWRkaW5nIHRvIHRoZSBuZXh0IGxvbmcgd29yZCBib3VuZGFyeS4KLQotTW9uIEZlYiAyMyAxMToyOTowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiAjaW5jbHVkZSBzeW1jYXQuaC4KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IExpa2V3aXNlLgotCi1Nb24gRmViIDIzIDEwOjI3OjQwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgY2FzZSAnUCcpOiBNYWtlICdQJyBhcmd1bWVudHMgYmUKLQlhYnNvbHV0ZSBleHByZXNzaW9ucyBpbnN0ZWFkIG9mICckJyBwcmVmaXhlZCByZWdpc3RlciBuYW1lcy4KLQotU2F0IEZlYiAyMSAyMjozNjo1MiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfc2V0KTogUmVjb3JkIGZpbGUgYW5kIGxpbmUgaW5mbyBmb3Igc3ltYm9scyB3aGVuIC1hcy4KLQkocHNldWRvX3NldCk6IERvbid0IG92ZXJ3cml0ZSB0aGF0IGR1bW15IGZyYWdtZW50LgotCi1GcmkgRmViIDIwIDE1OjAzOjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNlY3Rpb24iLgotCShwcGNfbmFtZWRfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVRodSBGZWIgMTkgMjI6MjU6NDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtcHBjLmMgKHBwY19iaWVpKTogQ2FjaGUgdGhlIGxhc3Qgc3ltYm9sIHdlIGluc2VydGVkCi0Jc28gd2UgZG9uJ3QgaGF2ZSB0byBzY2FuIHRoZSBlbnRpcmUgbGlzdC4KLQotVHVlIEZlYiAxNyAxNzowMjoxNSAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBGb3IgdGhlIGV4cGxpY2l0bHkgcGFyYWxsZWwKLSAJY2FzZSwgYWxsb3cgdGhlIHBhcmFsbGVsIGluc3RydWN0aW9ucyB0byBtb2RpZnkgdGhlIHNhbWUgZmxhZwotIAliaXRzLgotCi1UaHUgRmViIDE5IDE2OjA4OjE1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBDYXRlZ29yaXplIHN5bWJvbHMgYnkKLQl1bmRlZmluZWRfc2VjdGlvbiByYXRoZXIgdGhhbiBzeV9mcmFnLT5saW5lID09IE5VTEwuCi0KLVdlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgotCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgotCi1UdWUgRmViIDE3IDE4OjU4OjUxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fbWRfYXBwbHlfZml4Myk6IERlbGV0ZSBjYWxsIHRvIHZhbGlkYXRlX29wZXJhbmQuCi0JVGVzdCByZXN1bHQgb2YgaW5zZXJ0X29wZXJhbmQgZm9yIGVycm9yLgotCi1GcmkgRmViIDEzIDE2OjQxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBBZGQgY3lnbnVzLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0JKiBkb2MvTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBGZWIgMTMgMDA6NDc6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IEhhbmRsZSBvcGVyYW5kIHR5cGUgJ0MnLgotCShtYWNybyk6IEZpeCBoYW5kbGluZyBvZiBNX0NPUFswLTNdLgotCi1UaHUgRmViIDEyIDE0OjA2OjU5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSb3NzIEhhcnZleSA8cm9zc0B0ZXJhZmxvcC5jb20+OgotCSogbWFjcm8uYyAoSVNTRVApOiBPbmx5IHRyZWF0ICc8JyBhbmQgJz4nIGFzIHNlcGFyYXRvciBjaGFyYWN0ZXJzCi0JaWYgbWFjcm9fYWx0ZXJuYXRlIG9yIG1hY3JvX21yaS4KLQkoZ2V0c3RyaW5nKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGJ5dGUgY29uc3RhbnRzIGJldHdlZW4gPCBhbmQgPi4KLQkoZ2V0X2FueV9zdHJpbmcpOiAnPCcgb25seSBzdGFydHMgYSBzdHJpbmcgaWYgbWFjcm9fYWx0ZXJuYXRlIG9yCi0JbWFjcm9fbXJpLgotCShtYWNyb19leHBhbmRfYm9keSk6IFBlcm1pdCBrZXl3b3JkIHBhcmFtZXRlcnMgZm9sbG93aW5nCi0JcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL3RlLW5ic2QuaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBhcy5oIChmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKTogTW92ZSBmcm9tIGhlcmUuLi4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApOiAuLi50bwotCWhlcmUsIGFuZCBtYWtlIHN0YXRpYy4KLQotCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBPbmx5IHVzZSBzZWdfaW5mbyBpZgotCUJGRF9BU1NFTUJMRVIgb3IgTUFOWV9TRUdNRU5UUy4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCi0JKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBMaWtld2lzZS4KLQkqIGRvYy9hcy50ZXhpbmZvIChCdWcgUmVwb3J0aW5nKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMTEgMjM6MjY6MjggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogRG9uJ3QgdXNlIG1pcHMgSUlJIG9yIG1pcHMgSVYKLQlpbnNucyByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIGEgcG9pbnRlciBpZiB3ZSdyZSBpbiBtaXBzIEkgb3IKLQlNSVBTIElJIG1vZGUuCi0gICAgICAgIChtYWNybywgbWFjcm8yLCBzX2NwcmVzdG9yZSwgc19jcGFkZCk6IExpa2V3aXNlLgotCi1UaHUgRmViIDEyIDAzOjQxOjAwIDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLUZpeCByYWMgdG8gYWNjZXB0IG9ubHkgYTA6Ci0JKiB0Yy1kMTB2LmMgKHBhcmFsbGVsX29rLCBmaW5kX29wY29kZSk6Ci0JU3BsaXQgT1BFUkFORF9BQ0MgaW50byBPUEVSQU5EX0FDQzAgYW5kIE9QRVJBTkRfQUNDMS4KLQlJbnRyb2R1Y2UgT1BFUkFORF9HUFIuCi0KLVdlZCBGZWIgMTEgMTY6Mjg6MTMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2ZpbGwpOiBIYW5kbGUgbm9uLWNvbnN0YW50IHJlcGVhdCBjb3VudHMgYnkgY3JlYXRpbmcKLQlhbiByc19zcGFjZSBmcmFnbWVudC4KLQotVHVlIEZlYiAxMCAxODozMTozMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoYW5nZSBlcnJvciBhZGRlZCBKYW4gMiAxOTk4Ci0JZnJvbSBhc19iYWQgdG8gYXNfd2Fybi4KLQotVHVlIEZlYiAxMCAxODowNDowMCAxOTk4ICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KLQotCSogYXMuYzogKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IFVzZSBbVEVYVHxEQVRBfEJTU11fU0VDVElPTl9OQU1FCi0JKiBhcy5oOiBEZWZpbmUgZGVmYXVsdCB2YWx1ZXMgb2YgW1RFWFR8REFUQXxCU1NdX1NFQ1RJT05fTkFNRQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2JlZ2luKTogVXNlIFtURVhUfERBVEF8QlNTXV9TRUNUSU9OX05BTUUKLQotVHVlIEZlYiAxMCAxNzo1ODoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVob3B0LmMgKGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50KTogSWYgbm90IEJGRF9BU1NFTUJMRVIsIHVzZQotCXNlZ19maXhfcm90UCByYXRoZXIgdGhhbiBmaXhfcm9vdCBmcm9tIHNlZ19pbmZvLgotCi1UdWUgRmViIDEwIDE1OjMyOjIyIDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgotCi0JKiBleHByLmM6IEFkZCBzdXBwb3J0IGZvciAweDFfMl8zXzQgYmlnbnVtcy4KLQotVHVlIEZlYiAxMCAxNDo0Mzo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IFRyZWF0IFxyIGFzIHdoaXRlc3BhY2UuCi0KLU1vbiBGZWIgIDkgMTQ6MTY6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TYXQgRmViICA3IDE1OjMzOjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLUZyaSBGZWIgIDYgMTY6MDg6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiBtaXBzX2NwdSBpcyBzZXQsIHRoZW4gdXNlIGl0IGFzCi0gICAgICAgIHRoZSBhcmd1bWVudCB0byBiZmRfc2V0X2FyY2hfbWFjaC4KLSAgICAgICAgKGxvYWRfYWRkcmVzcyk6IFVzZSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIHRvIGRldGVybWluZSB0aGUKLSAgICAgICAgYml0IHNpemUgb2YgYW4gYWRkcmVzcyBpbnN0ZWFkIG9mIGxvb2tpbmcgYXQgdGhlIGlzYSBsZXZlbC4KLSAgICAgICAgKG1hY3JvLCBtYWNybzIsIHNfY3ByZXN0b3JlLCBzX2NwYWRkKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgIDYgMTQ6NDQ6MzQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIC1tdjg1MGFueSBjb21tYW5kIGxpbmUgb3B0aW9uLgotCi1UaHUgRmViICA1IDEyOjM5OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWhvcHQuYzogTmV3IGZpbGUuCi0JKiBhcy5oIChlbnVtIF9yZWxheF9zdGF0ZSk6IEFkZCByc19jZmEuCi0JKGNoZWNrX2VoX2ZyYW1lLCBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IERlY2xhcmUuCi0JKGVoX2ZyYW1lX3JlbGF4X2ZyYWcsIGVoX2ZyYW1lX2NvbnZlcnRfZnJhZyk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IENhbGwgY2hlY2tfZWhfZnJhbWUuCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogSGFuZGxlIHJzX2NmYS4KLQkocmVsYXhfc2VnbWVudCk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoR0FTX0NGSUxFUyk6IEFkZCBlaG9wdC5jLgotCShHRU5FUklDX09CSlMpOiBBZGQgZWhvcHQuby4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoRnJhZ3MpOiBEb2N1bWVudCByc19jZmEuCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIC0tdHJhZGl0aW9uYWwtZm9ybWF0LgotCShwYXJzZV9hcmdzKTogQWNjZXB0IC0tdHJhZGl0aW9uYWwtZm9ybWF0LgotCSogYXMuaCAoZmxhZ190cmFkaXRpb25hbF9mb3JtYXQpOiBEZWNsYXJlLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogSWYgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQsCi0Jc2V0IEJGRF9UUkFESVRJT05BTF9GT1JNQVQgb24gc3Rkb3V0cHV0LgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtLXRyYWRpdGlvbmFsLWZvcm1hdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBNYWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEKLQlmaXh1cCBmb3IgYW4gdW5tYXRjaGVkICVoaSByZWxvYywgaXQgZG9lcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEKLQl2YXJpYW50IGZyYWcuCi0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGRvYy9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDQgMTU6NDE6NTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAoY2hlY2tfZm9yX3NpZGVfZWZmZWN0cyk6IE5ldyBmdW5jdGlvbi4KLQkoY2FuX21ha2VfcGFyYWxsZWwpOiBBZGQgY2hlY2tzIGZvciBpbnN0cnVjdGlvbiBzaWRlIGVmZmVjdHMKLQljbGFzaGluZyB3aXRoIHRoZSBvdGhlciBpbnN0cnVjdGlvbi4KLQkoYXNzZW1ibGVfcGFyYWxsZWxfaW5zbik6IEltcHJvdmUgd2FybmluZyBtZXNzYWdlcy4gIFJldHVybiBlcnJvcgotCW1lc3NhZ2UgZnJvbSBub24tc3dhcHBlZCBpbnN0cnVjdGlvbiBvcmRlci4KLQotV2VkIEZlYiAgNCAyMDowMDoyNiAxOTk4ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEB0ZWtuZW1hLmRlbW9uLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IFJlbmFtZSBhcm1fYWZ0ZXJfcGFzc19ob29rKCkgdG8gYXJtX2NsZWFudXAoKS4KLQotCSogY29uZmlnL3RjLWFybS5oOiBSZXBsYWNlIG1kX2FmdGVyX3Bhc3NfaG9vayBkZWZpbml0aW9uIHdpdGggYQotIAltZF9jbGVhbnVwIGRlZmluaXRpb24uICBUaGlzIG1vdmVzIHRoZSBmb3JjZWQgbGl0ZXJhbCBvdXRwdXQgdG8KLSAJdGhlIGVuZCBvZiB0aGUgc291cmNlIHBhc3MsIGFuZCBhdm9pZHMgbWFjcm8ncyBpbnNlcnRpbmcgbGl0ZXJhbHMKLSAJaW50byB0aGUgY29kZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgbWFjcm8gZXhwYW5zaW9uLgotCi1XZWQgRmViICA0IDEzOjE3OjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0VMRl06IEEgcmVsb2MgYWdhaW5zdAotCWEgZ2FzIGludGVybmFsIHN5bWJvbCBpcyBhZGp1c3RhYmxlLgotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgotCi0JKiBhcy5oOiBJZiBnY2MgdmVyc2lvbiBncmVhdGVyIHRoYW4gMi42LCB1c2UgYF9fZm9ybWF0X18nIGFuZAotCWBfX3ByaW50Zl9fJyBpbiBmdW5jdGlvbiBhdHRyaWJ1dGVzLCByYXRoZXIgdGhhbiBgZm9ybWF0JyBhbmQKLQlgcHJpbnRmJy4KLQotTW9uIEZlYiAgMiAxODozODoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBPbmx5IGluY2x1ZGUgZWxmL3NwYXJjLmggaWYgT0JKX0VMRi4KLQotTW9uIEZlYiAgMiAxODozMDozNCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JQWRkIHRtczMyMGMzMCBzdXBwb3J0OgotCSogY29uZmlnL3RjLXRpYzMwLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLXRpYzMwLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1jb2ZmLmg6IElmIFRDX1RJQzMwLCBpbmNsdWRlIGNvZmYvdGljMzAuaCBhbmQgZGVmaW5lCi0JVEFSR0VUX0ZPUk1BVCBhcyAiY29mZi10aWMzMCIuCi0JKiBjb25maWd1cmUuaW4gKHRpYzMwLSotKmFvdXQqLCB0aWMzMC0qLSpjb2ZmKik6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDUFVfVFlQRVMpOiBBZGQgdGljMzAuCi0JKENQVV9PQkpfVkFMSUQpOiB0aWMzMC1hb3V0IGlzIHZhbGlkLgotCShUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCBjb25maWcvdGMtdGljMzAuYy4KLQkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgY29uZmlnL3RjLXRpYzMwLmguCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViICAyIDEwOjIwOjM3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSW1wcm92ZW1lbnRzIHRvIGVycm9yIG1lc3NhZ2VzLgotCi1Nb24gRmViICAyIDEyOjM5OjA1IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IENoYW5nZSBCRkRfUkVMT0NfSEkxNiBhbmQKLSAJQkZEX1JFTE9DX0hJMTZfUyB0byBzdG9yZSB0aGUgaGlnaCBiaXRzIG9mIGFueSB2YWx1ZS4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IFVuZG8gY2hhbmdlIG9mIEZyaSBKdW4gMjcuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERvbid0IGxldCB0aGUKLQlhc3NlbWJsZXIgY2FsY3VsYXRlIHJlbG9jYXRpb25zIHRvIGFueSBleHRlcm5hbCBzeW1ib2wgYXQgYWxsLgotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKSBbT0JKX0VMRl06IENvcnJlY3QgYnVncwotCWludm9sdmluZyBnZW5lcmF0aW9uIG9mIHBjLXJlbGF0aXZlIHJlbG9jcy4KLQkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKSBbT0JKX0VMRl06IFRoZSBqb2IgdGhpcyBjb2RlIHVzZWQgdG8gZG8KLQloYXMgYmVlbiBtb3ZlZCB0byBtZF9hcHBseV9maXgzLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggdGVzdCBmb3IgdG9vLWZhciBicmFuY2guCi0JKHBwY19lbGZfc3VmZml4KTogV2FybiBhYm91dCAnaWRlbnRpZmllcitjb25zdGFudEBnb3QnIHN5bnRheCwKLQl3aGljaCBhY3R1YWxseSBtZWFucyAodGhlIGFkZHJlc3Mgb2YgaWRlbnRpZmllcidzIEdPVCBlbnRyeSkgKwotCWNvbnN0YW50LCB3aGljaCBpcyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bC4KLQotRnJpIEphbiAzMCAxMTowMjozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWFkLmggKGluY2x1ZGVfZGlycyk6IERlY2xhcmUuCi0JKGluY2x1ZGVfZGlyX2NvdW50LGluY2x1ZGVfZGlyX21heGxlbik6IERlY2xhcmUuCi0KLUZyaSBKYW4gMzAgMTE6NDc6MDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENvcnJlY3QgY2hlY2sgZm9yIHNoYXJlZCBvcGNvZGVzIGxpYnJhcnkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGxpc3RpbmcuYyAoYnVmZmVyX2xpbmUpOiBJZiB3ZSBjYW4ndCBvcGVuIHRoZSBmaWxlLCBzZXQgYXRfZW5kLgotCShsaXN0aW5nX3ByaW50KTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBmaS4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAocmVnbGlzdHBhaXIpOiBIYW5kbGUgcmVnaXN0ZXIgbGlzdCBpbgotCWVpdGhlciBvcmRlci4KLQotCSogY29uZmlnL3Ztcy1jb25mLmg6IERvbid0IHVuZGVmIFZFUlNJT04uCi0KLVRodSBKYW4gMjkgMTQ6NDI6NDQgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIE1ha2VmaWxlLmFtIChDT05GSUdfT0JKUyk6IE5ldyB2YXJpYWJsZSwgY29udGFpbmluZyBwYXJ0IG9mIG9sZAotCU9CSlMgdmFyaWFibGUuCi0JKEdFTkVSSUNfT0JKUyk6IE5ldyB2YXJpYWJsZSwgd2l0aCB0aGUgcmVzdCBvZiB0aGUgb2xkIE9CSlMKLQl2YXJpYWJsZS4KLQkoT0JKUyk6IE5vdyBqdXN0ICQoQ09ORklHX09CSlMpIGFuZCAkKEdFTkVSSUNfT0JKUykuCi0JKCQoc3JjZGlyKS9tYWtlLWdhcy5jb20pOiBSZW5hbWUgZnJvbSBtYWtlLWdhcy5jb20uCi0JKHN0YW1wLW1rLmNvbSk6IFJlcGxhY2UgJChPQkpTKSB3aXRoICQoR0VORVJJQ19PQkpTKS4KLQkoRVhUUkFfRElTVCk6IERlZmluZS4KLQkqIHZtc2NvbmYuc2g6IEhhbmRsZSB7dGFyZy1jcHUsIG9iai1mb3JtYXQsIGF0b2YtdGFyZ30gbW9kdWxlcwotCWV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gdmlhIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcy4KLQkoZ2NjLWFzLm9wdCk6IE5ldyBmaWxlIGNyZWF0ZWQgd2hlbiBtYWtlLWdhcy5jb20gaXMgcnVuLgotCSogY29uZmlnLWdhcy5jb206IENyZWF0ZSB7dGFyZy1jcHUuaCwgb2JqLWZvcm1hdC5oLCB0YXJnLWVudi5oLAotCWl0YmwtY3B1Lmh9IHRvICNpbmNsdWRlIGFwcHJvcHJpYXRlIGZpbGUgcmF0aGVyIHRoYW4gY29weWluZyB0aGF0Ci0JZmlsZS4KLQkqIGNvbmZpZy92bXMtY29uZi5oOiBTeW5jaHJvbml6ZSB3aXRoIGN1cnJlbnQgY29uZmlnLmluLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKYW4gMjkgMTg6NDg6MTkgMTk5OCAgQmlsbCBNb3llciAgPGJpbGxtQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQWRkZWQgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsLgotCShwYXJhbGxlbF9vayk6IFJlbGF4ZWQgcGFyYWxsZWwgc3ViaW5zdHJ1Y3Rpb24gZGVwZW5kZW5jeSBjaGVjay4KLQotV2VkIEphbiAyOCAxNDozNTowMCAxOTk4ICBCaWxsIE1veWVyIDxiaWxsbUBjeWdudXMuY29tPgotCi0JKiBhcy5oIChmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKTogYWRkZWQgbmV3IGZsYWcuCi0JKiB0Yy1kMTB2LmMgKG1kX3BhcnNlX29wdGlvbixtZF9sb25nb3B0cyk6IGFkZGVkICItLW5vd2FybnN3YXAiIAotCWNvbW1hbmQgbGluZSBhcmd1bWVudC4KLQkqIHRjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IGVtaXQgIlN3YXBwaW5nIGluc3RydWN0aW9ucyIKLQl3YXJuaW5nIG9ubHkgaWYgZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCBpcyBmYWxzZS4KLQotV2VkIEphbiAyOCAxNjo0MToxOSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbWluZ3czMiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDI4IDE0OjUxOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IHNldCB0aGUgc2VnbWVudCBpZiBpdAotCWhhc24ndCBjaGFuZ2VkLCBhbmQgdGhpcyBpcyBPQkpfQU9VVCB3aXRob3V0IEJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0xPQ0FMKTogQ29ycmVjdCB0eXBvLS1wYXNzIGFyZ3VtZW50IHRvCi0JU19HRVRfU0VHTUVOVC4KLQotV2VkIEphbiAyOCAxMzo1NDo1MCAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCWFzLmggKHVubGluayk6IFJldmVyc2UgMTMtRmViLTk3IGNoYW5nZTsgdXNlIG9mIHVubGluayB2cyByZW1vdmUKLQlkZXBlbmRzIHVwb24gSEFWRV97VU5MSU5LLFJFTU9WRX0gdmFsdWVzIHJhdGhlciB0aGFuIGhvc3QKLQljb21waWxlci4KLQotV2VkIEphbiAyOCAxMzo0ODowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04pOiBEZWZpbmUuCi0KLVdlZCBKYW4gMjggMDk6NTI6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9pbnNlcnRfb3BlcmFuZCk6IERpc3BsYXkgaW5zdHJ1Y3Rpb24gd2hlbgotCWFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotCi1UdWUgSmFuIDI3IDEzOjMyOjAxIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotc2NvMy4ydjUqKTogRGVmYXVsdHMgdG8gRUxGIG5vdy4KLQkoaTM4Ni0qLXNjbzMuMnY1KmNvZmYpOiBOZXcgdGFyZ2V0LgotCShpMzg2LSotc2NvMy4yKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBKYW4gMjcgMTE6MDY6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogVGlkeSBlcnJvciBtZXNzYWdlIHByb2R1Y3Rpb24uCi0KLVR1ZSBKYW4gMjcgMTI6MjQ6MzIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgbmV3IHZhcmlhYmxlIG5ld2ltbSB0byBob2xkCi0JdmFsaWRhdGVfaW1tZWRpYXRlIHJldHVybiB2YWx1ZSBpbiB0aGUgcmlnaHQgdHlwZSBmb3IgY29tcGFyaXNvbnMKLQl0byBGQUlMLgotCi1UdWUgSmFuIDI3IDA2OjUxOjU5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAoTUFYX0JZVEVTKTogVXNlIGxpc3RpbmcgdmFyaWFibGVzIG5vdCBjb25zdGFudHMuCi0JKGRhdGFfYnVmZmVyKTogTm8gbG9uZ2VyIGFuIGFycmF5LCBidXQgYSBwb2ludGVyLgotCShjYWxjX2hleCk6IHNpemVvZihkYXRhX2J1ZmZlcikgLT4gTUFYX0JZVEVTLgotCShsaXN0aW5nX2xpc3RpbmcpOiBBbGxvY2F0ZSBkYXRhX2J1ZmZlci4KLQotVHVlIEphbiAyNyAwNjozODozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIC0tbGlzdGluZy1saHMtd2lkdGgsIC0tbGlzdGluZy1saHMtd2lkdGgyLAotCS0tbGlzdGluZy1yaHMtd2lkdGgsIC0tbGlzdGluZy1jb250LWxpbmVzLgotCShzaG93X3VzYWdlKTogVXBkYXRlLgotCSogbGlzdGluZy5jIChsaXN0aW5nX2xoc193aWR0aCwgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kKTogTmV3IHZhcnMuCi0JKGxpc3RpbmdfbGhzX2NvbnRfbGluZXMsIGxpc3RpbmdfcmhzX3dpZHRoKTogTmV3IHZhcnMuCi0JKHByaW50X2xpbmVzKTogVXNlIHRoZSB2YXJpYWJsZXMgaW5zdGVhZCBvZiB0aGUgY29uc3RhbnRzLgotCShsaXN0aW5nX2xpc3RpbmcpOiBMaWtld2lzZS4JCi0JKiBsaXN0aW5nLmg6IERlY2xhcmUgdGhlIG5ldyB2YXJzLgotCQotVHVlIEphbiAyNyAwNTozMjowNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIC0ta2VlcC1sb2NhbHMgYWxpYXMgZm9yIC1MLgotCUFkZCAtLXN0cmlwLWxvY2FsLWFic29sdXRlLgotCShzaG93X3VzYWdlKTogVXBkYXRlLgotCSogYXMuaCAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZSk6IE5ldyBmbGFnLgotCSogc3ltYm9scy5jIChTX0lTX0xPQ0FMKTogVXNlIGl0LgotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfTE9DQUwpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0lTX0xPQ0FMKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgotCi1Nb24gSmFuIDI2IDEzOjA3OjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IERldGVjdCBpZiBleHBsaWNpdGx5IHBhcmFsbGVsIGluc3RydWN0aW9ucwotCW1pZ2h0IGhhdmUgYW4gaW8gY29uZmxpY3QgYW5kIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlLiAKLQotVGh1IEphbiAyMiAxNzo1MTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fc2F2ZV9maXh1cHMsIGNnZW5fcmVzdG9yZV9maXh1cHMsCi0JY2dlbl9zd2FwX2ZpeHVwcyk6IEZ1bmN0aW9ucyB0byBzYXZlLCByZXN0b3JlIGFuZCBzd2FwIHRoZSBmaXh1cAotCWNoYWluIHdpdGggYSBiYWNrdXAgY29weS4KLQkoY2dlbl9hc21fZmluaXNoX2luc24pOiBSZXR1cm5zIGFkZHJlc3Mgb2YgY29uc3RydWN0ZWQgaW5zbi4KLQotV2VkIEphbiAyMSAxNjo0OToxMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mb19zdHJ1Y3QpOiBSZW1vdmUgRklMRSwgYWRkIFBPUy4KLQkobGFzdF9vcGVuX2ZpbGVfaW5mbywgbGFzdF9vcGVuX2ZpbGUpOiBOZXc7IGEgb25lIGVudHJ5IEZJTEUqIGNhY2hlLgotCShmaWxlX2luZm8pOiBEb24ndCBvcGVuIHRoZSBmaWxlLgotCShidWZmZXJfbGluZSk6IENoZWNrIGZvciB0aGUgZmlsZSBpbiB0aGUgbGFzdF9vcGVuIGNhY2hlLCB1cGRhdGluZwotCWFzIG5lY2Vzc2FyeS4KLQkocHJpbnRfc291cmNlKTogRG9uJ3QgcmVmZXJlbmNlIGZpbGVfaW5mby0+ZmlsZS4KLQkobGlzdGluZ19saXN0aW5nKTogTGlrZXdpc2UuCi0JKGxpc3RpbmdfcHJpbnQpOiBDbG9zZSB0aGUgZmlsZSBpbiB0aGUgY2FjaGUsIGlmIGFueS4KLQotRnJpIEphbiAxNiAxNDo1MTo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZHdhcmZfZmlsZV9zdHJpbmcpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGVtaXRfZXhwcik6IExvb2sgZm9yIGNvbnN0YW50IHNlcXVlbmNlIHRoYXQgbGVhZHMgdXAgdG8gYSBmaWxlCi0JbmFtZSBpbiBEV0FSRiBkZWJ1Z2dpbmcgb3V0cHV0LgotCShzdHJpbmdlcik6IFVzZSBkd2FyZl9maWxlX3N0cmluZyB0byBkZWNpZGUgd2hldGhlciB0byBhY2NlcHQgYQotCXN0cmluZyBhcyBhIGZpbGUgbmFtZS4KLQotRnJpIEphbiAxNiAxMTozMDozNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1tNjhrLmMgKG02OGtfaXApOiBSZW1vdmUgYWJzbC0+cmVnbHN0IE1SSSBoYWNrLgotCShjcmFja19vcGVyYW5kKTogQWRkIHJlZy0+cmVnbHN0IE1SSSBoYWNrLgotCShyX3NlZyk6IFB1dCByZWdsc3Qgc3ltYm9scyBpbiByZWdfc2VjdGlvbi4KLQkobTY4a19mcm9iX3N5bWJvbCk6IEZyb2IgcmVnbHN0IHN5bWJvbHMgaW50byBhYnNvbHV0ZV9zZWN0aW9uLgotCi1UaHUgSmFuIDE1IDE0OjE5OjAxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLXNoLmMgKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBTR1IgJiBEQlIuCi0KLVRodSBKYW4gMTUgMTM6NDY6NDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtaDgzMDAuYyAocGFyc2VfcmVnKTogVGFrZSB0aGUgbGVuZ3RoIG9mIHRoZSBzeW1ib2wgaW50bwotCWFjY291bnQgd2hlbiBhdHRlbXB0aW5nIHRvIG1hdGNoIGEgcmVnaXN0ZXIgbmFtZS4KLQkqIHRjLWg4NTAwLmMgKHBhcnNlX3JlZyk6IExpa2V3aXNlLgotCi1XZWQgSmFuIDE0IDE3OjUyOjMzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYzogRm9ybWF0dGluZyBjaGFuZ2VzIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCi0KLVdlZCBKYW4gMTQgMTU6NDE6NDEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFJld29yayBkaXZpc2lvbiBjb2RlIHRvIGF2b2lkIHVuZmlsbGVkCi0JZGVsYXkgc2xvdC4KLQotV2VkIEphbiAxNCAxODowNDoyMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBKaW0gV2lsc29uCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IFJlbW92ZSBub24tYW5zaSBkZWZhdWx0IGNhc2UuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBjcm9zcyBzZWN0aW9uIFBDIHJlbGF0aXZlIHJlbG9jcwotCWNvcnJlY3RseS4KLQotV2VkIEphbiAxNCAxNTowMjoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHRlc3QgcGluZm8gZmxhZ3MgaWYgSU5TTl9NQUNSTy4KLQotTW9uIEphbiAxMiAxMzowNDo1NyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiAjaW5jbHVkZSBzZXRqbXAuaC4gIENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCi0JKGV4cHJfam1wX2J1Zik6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKGNnZW5fcGFyc2Vfb3BlcmFuZCk6IEFsbG93IHVzZSBvZiBsb25nam1wIGluIHBhcnNpbmcgdG8gaGFuZGxlIGVycm9ycy4KLQkoY2dlbl9tZF9vcGVyYW5kKTogTmV3IGZ1bmN0aW9uLgotCSogdGMtbTMyci5jOiBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFVzZSBDR0VOX0lOU05fTU5FTU9OSUMuCi0KLVR1ZSBKYW4gIDYgMTU6MzY6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX1NFVF9TRUdNRU5UKTogRG9uJ3Qgc2V0IHRoZSBzZWdtZW50IGZvciBzZWN0aW9uIHN5bXMuCi0JKFNfSVNfRVhURVJOQUwsIFNfSVNfTE9DQUwpOiBDb3JyZWN0IHBhcmVudGhldGljYXRpb24uCi0KLUZyaSBKYW4gIDIgMTY6MDg6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBHaXZlIGFuIGVycm9yIGlmIHRoZXJlIGFyZQotCXVucmVjb2duaXplZCBjaGFyYWN0ZXJzIGFmdGVyIGFuIGV4cHJlc3Npb24uCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTY5NwpkaWZmIC0tZ2l0IGEvZ2FzL0NoYW5nZUxvZy05Mjk1IGIvZ2FzL0NoYW5nZUxvZy05Mjk1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE0OGU2Li4wMDAwMDAwCi0tLSBhL2dhcy9DaGFuZ2VMb2ctOTI5NQorKysgL2Rldi9udWxsCkBAIC0xLDEzMTEwICswLDAgQEAKLVNhdCBEZWMgMzAgMjM6NDI6NTEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogU2ltcGxpZnkuICBDb3JyZWN0bHkgaGFuZGxlIHN5bSArIG9mZnNldAotCWFkZHJlc3NlcyBmb3Igc3RhdGljIHZhcmlhYmxlcy4KLQotVGh1IERlYyAyMSAxMjo1NDozMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWFwcGluZyk6IE1ha2UgQGdvdCBnaXZlIGEgcmVhbCBHT1QgcmVsb2NhdGlvbiwKLQlhbmQgeGdvdCBnaXZlIHRoZSBvbGQgdG9jMTYgcmVsb2NhdGlvbi4KLQkobWRfYXBwbHlfZml4Myk6IFN1cHBvcnQgYWxsIEdPVCByZWxvY2F0aW9ucy4KLQotV2VkIERlYyAyMCAxNDo1NzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfYWRkcmVzcyk6IENvcnJlY3RseSBoYW5kbGUgYSBjb25zdGFudCBpbgotCVNWUjRfUElDIGNhc2UuICBGcm9tIFJpY2hhcmQgS2VubmVyIDxrZW5uZXJAdmxzaTEudWx0cmEubnl1LmVkdT4uCi0KLUZyaSBEZWMgMTUgMTQ6MjU6MDcgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogUmVjb2duaXplIFNIMyByZWdpc3RlcnMuCi0JKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBBX1NTUiwgQV9TUEMgYW5kIEFfUkVHX0IuCi0JKGJ1aWxkX01ieXRlcyk6IEhhbmRsZSBSRUdfQi4KLQotRnJpIERlYyAxNSAxNjowNzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2F1eCk6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCi0KLUZyaSBEZWMgMTUgMTI6MTE6NDggMTk5NSAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBJZiBsaW5raW5nLCBlZGl0IEFMTF9DRkxBR1MgdG8gQ0ZMQUdTLgotCi1UaHUgRGVjIDE0IDE1OjA5OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2V0IHRoZSBzX2FsaWduIGZpZWxkIHRvCi0JdGhlIG51bWJlciBvZiBieXRlcywgcmF0aGVyIHRoYW4gdG8gdGhlIHBvd2VyIG9mIDIuCi0KLVR1ZSBEZWMgMTIgMTI6MTk6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVENMRUFOX0hFUkUpOiBOZXcgdmFyaWFibGUuCi0JKGRpc3RjbGVhbik6IFVzZSBpdC4KLQkobWFpbnRhaW5lci1jbGVhbik6IERlcGVuZCB1cG9uIGNsZWFuLWhlcmUgcmF0aGVyIHRoYW4gY2xlYW4sCi0JZGlzdGNsZWFuLCBhbmQgY2xlYW4taW5mby4gIFJ1biBtYWtlIG1haW50YWluZXItY2xlYW4gaW4gZG9jLgotCVJlbW92ZSBmaWxlcyBsaXN0ZWQgaW4gRElTVENMRUFOX0hFUkUuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogU3BsaXQgb3V0IGZyb20KLQlkaXN0Y2xlYW4uICBEZXBlbmQgdXBvbiBjbGVhbi1pbmZvIGFuZCBkaXN0Y2xlYW4uCi0KLU1vbiBEZWMgMTEgMTY6MjM6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtYWMtYXMucjogRml4IGNvcHlyaWdodCBhbmQgdmVyc2lvbiBzdHJpbmdzLgotCShjZnJnKTogVXNlIFBST0dfTkFNRSBpbnN0ZWFkIG9mIGxpdGVyYWwgbmFtZS4KLQotTW9uIERlYyAxMSAxNDoxNDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgdGNfdW5yZWNvZ25pemVkX2xpbmUgaXMgZGVmaW5lZCwKLQljYWxsIGl0LgotCSogY29uZmlnL3RjLWEyOWsuaCAodGNfdW5yZWNvZ25pemVkX2xpbmUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYTI5ay5jIChhMjlrX3VucmVjb2duaXplZF9saW5lKTogTmV3IGZ1bmN0aW9uLgotCShtZF9vcGVyYW5kKTogSGFuZGxlIGEyOWsgc3R5bGUgbG9jYWwgZG9sbGFyIGxhYmVscy4KLQotV2VkIERlYyAgNiAxNzo1Mjo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaDogSWYgT0JKX01BWUJFX0VMRiwgZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFLgotCi1UdWUgRGVjICA1IDEzOjI2OjM0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfZmlsbCk6IElmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlzIGRlZmluZWQsIGNhbGwKLQlpdC4KLQotTW9uIERlYyAgNCAxNToxMDo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbiwgZmlsbF9zZWN0aW9uLCBmaXh1cF9tZGVwcyk6Ci0JVHJlYXQgcnNfYWxpZ25fY29kZSBsaWtlIHJzX2FsaWduLgotCi1TdW4gRGVjICAzIDE2OjQ2OjU0IDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogY29uZmlnL3RjLWFybS5jIChjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUpOiBTZXQgcHJlX2luYyB3aGVuCi0JY29udmVydGluZyBhbiBhYnNvbHV0ZSBhZGRyZXNzIGludG8gYSBQQy1yZWxhdGl2ZSBvbmUuCi0KLUZyaSBEZWMgIDEgMTE6NTc6NTYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBEb24ndCBhbHdheXMgdXNlIHRlLWdlbmVyaWMuaCBmb3IgZW11bGF0aW9uLgotCShwb3dlcnBjLWFwcGxlLW1hY29zKTogVXNlIGVtdWxhdGlvbiB0ZS1tYWNvcy5oLgotCSogbXB3LW1ha2Uuc2VkIChpbnN0YWxsLCBpbnN0YWxsLW9ubHkpOiBFZGl0IGluIE1hYy1zcGVjaWZpYwotCWluc3RhbGwgcHJvY2VkdXJlLgotCi1GcmkgRGVjICAxIDEwOjU5OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJbXByb3ZlIG1lc3NhZ2UgYWJvdXQgdW5zdXBwb3J0ZWQgRUxGIHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG04OGtfZG9fYWxpZ24pOiBDb3JyZWN0IGNoZWNrIGZvciB3aGV0aGVyIGZpbGwKLQlwYXR0ZXJuIGlzIHplcm8uICBGcm9tIE1hbmZyZWQgSG9sbHN0ZWluLgotCi1UaHUgTm92IDMwIDEzOjI1OjQ5IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19wZV9zZWN0aW9uKTogVG8gZ2V0IHRoZSBhbGlnbm1lbnQgcmlnaHQgZm9yCi0JdGhlIHZhcmlvdXMgaWRhdGEgc2VjdGlvbnMsIHdlIGNoZWNrIHRoZSBuYW1lIG9uIHRoZSAuc2VjdGlvbiBwc2V1ZG8uCi0KLVRodSBOb3YgMzAgMTE6MjM6NDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogSWYgVENfTTg4SyBpcyBkZWZpbmVkLCBkbyBub3QKLQlhZGQgc2VjdGlvbidzIHBhZGRyIHRvIGFkZF9udW1iZXI7IGNvbXBhdGliaWxpdHkgdG8gbmF0aXZlIGFzIGFuZAotCWxkIGZvcmJpZHMuCi0KLVdlZCBOb3YgMjkgMjM6MTQ6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVHJlYXQgbTY4ay1zeXN2NCBsaWtlIG02OGstZWxmLCBub3QgbTY4ay1zeXN2My4KLQotCSogaGFzaC5jIChzdHJ1Y3QgaGFzaF9lbnRyeSk6IE1vdmVkIGhlcmUuLi4KLQkqIGhhc2guaCAoc3RydWN0IGhhc2hfZW50cnkpOiAuLi5mcm9tIGhlcmUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IERvbid0IGZyZWUgYW5kIGNsZWFyIHN5X29iagotCWlmIGl0J3MgYWxyZWFkeSBrbm93biB0byBiZSBudWxsLgotCi1XZWQgTm92IDI5IDEzOjAwOjIwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogRG9uJ3QgYWRqdXN0IHRoZSB2YWx1ZSBmb3IgMzIKLQliaXQgcmVsb2NzIGNvbnZlcnRlZCB0byBQQyByZWxhdGl2ZSByZWxvY3MuICBUaGlzIHR1cm5lZCBvdXQgdG8KLQlhZGQgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgLnRleHQgdHdpY2UuCi0KLVR1ZSBOb3YgMjggMTA6NDI6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogSW4gJ3MnIGNhc2UsIGZyZWUgc3RyaW5nIGZyb20KLQlvYnN0YWNrLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBSZW1vdmUgdW51c2VkIGZpZWxkCi0Jc3lfbmFtZV9vZmZzZXQuCi0JKiBjb25maWcvb2JqLW11bHRpLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUykgW09CSl9NQVlCRV9FTEZdOgotCURpdHRvLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogTWFrZSBiaXRmaWVsZHMgdW5zaWduZWQuCi0KLQkqIGV4cHIuaCAoc3RydWN0IGV4cHJlc3Npb25TKTogTWFrZSBYX29wIGFuZCBYX3Vuc2lnbmVkIGJpdGZpZWxkcywKLQlhbmQgbW92ZSB0aGVtIHRvZ2V0aGVyLiAgT24gbW9zdCBzeXN0ZW1zIHRoaXMgd2lsbCByZWR1Y2UgdGhlCi0Jc3RydWN0dXJlIHNpemUgYnkgb25lIHdvcmQuCi0JKG9wZXJhdG9yVCk6IERlZmluZSBPX21heC4KLQkqIGV4cHIuYyAoZXhwcl9iZWdpbik6IFZlcmlmeSB0aGF0IFhfb3AgaXMgd2lkZSBlbm91Z2ggdG8gaG9sZAotCU9fbWF4LgotCi0JKiByZWFkLmMgKHBvcF9pbnNlcnQpOiBQcmludCBlcnJvciByZXR1cm5lZCBieSBoYXNoIHRhYmxlCi0JaW5zZXJ0aW9uIGNvZGUuCi0KLQkqIGFzLmMgKGR1bXBfc3RhdGlzdGljcyk6IFNwbGl0IG91dCBmcm9tIG1haW47IGR1bXAgc29tZSBoYXNoCi0JdGFibGUgc3RhdHMgYW5kIHRhcmdldC1zcGVjaWZpYyBzdGF0cy4KLQkoc3RhcnRfdGltZSk6IE5vIGxvbmdlciBhdXRvbWF0aWMgdG8gbWFpbi4KLQkobWFpbik6IFNldCBmaWxlLWxldmVsIHN0YXJ0X3RpbWUgYW5kIGNhbGwgZHVtcF9zdGF0aXN0aWNzIGF0Ci0JZXhpdC4gIEV4aXQgYnkgY2FsbGluZyB4ZXhpdC4KLQkoc2hvd191c2FnZSk6IE1ha2UgLS1zdGF0aXN0aWNzIGRlc2NyaXB0aW9uIGxlc3Mgc3BlY2lmaWMuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KLQkqIHdyaXRlLmMgKHdyaXRlX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKG5fZml4dXBzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZml4X25ld19pbnRlcm5hbCk6IEluY3JlbWVudCBpdC4KLQkqIHJlYWQuYyAocmVhZF9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oIChyZWFkX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogc3ltYm9sLmMgKHN5bWJvbF9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogc3ltYm9sLmggKHN5bWJvbF9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIGhhc2guYyAoaGFzaF9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogaGFzaC5oIChoYXNoX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWkzODYuaCAoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkodGNfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBtYWNyby4KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsLCBhc19hc3NlcnQsIGFzX2Fib3J0KTogVXNlIHhleGl0LCBub3QKLQlleGl0LgotCi0JKiBoYXNoLmMgKERFTEVURUQpOiBSZXdyaXRlIHRvIHVzZSBhIHZhbGlkIGJ1dCB1bmlxdWUgYWRkcmVzcy4KLQkoU1RBUlRfUE9XRVIpOiBSZWR1Y2UgdG8gMTAuCi0JKGVudW0gc3RhdF9lbnVtKTogTmV3IGVudW1lcmF0b3IsIHJlcGxhY2luZyBTVEFUXyogaW5kZXggbWFjcm9zLgotCUFkZCBuZXcgdmFsdWVzIGZvciBjb3VudGluZyBzdHJjbXAgY2FsbHMuCi0JKEdST1dfRkFDVE9SKTogTmV3IG1hY3JvLgotCShoYXNoX2dyb3cpOiBVc2UgR1JPV19GQUNUT1IuICBSZXdyaXRlIGZvciBxdWljayByZXR1cm5zIGluc3RlYWQKLQlvZiBuZXN0aW5nIGJsb2Nrcy4KLQkoRlVMTF9WQUxVRSk6IE5ldyBtYWNyby4gIFVzZSAxLzQgb2YgdGFibGUgc2l6ZSBpbnN0ZWFkIG9mIDEvMi4KLQkoaGFzaF9uZXcpOiBVc2UgRlVMTF9WQUxVRS4KLQkoc3RydWN0IGhhc2hfY29udHJvbCk6IERlZmluaXRpb24gbW92ZWQgaGVyZS4KLQkoaGFzaF9jb2RlKTogRG9uJ3QgbWFzayB0byBsb3cgYml0cy4KLQkoaGFzaF9hc2spOiBNYXNrIHJldHVybmVkIGhhc2ggY29kZSBoZXJlLiAgQ2hlY2sgaGFzaCB2YWx1ZSBiZWZvcmUKLQljYWxsaW5nIHN0cmNtcDsgY291bnQgc3RyY21wIGNhbGxzLgotCSogaGFzaC5oIChzdHJ1Y3QgaGFzaF9jb250cm9sKTogRGVjbGFyZSwgZG9uJ3QgZGVmaW5lLCBoZXJlLgotCShIQVNIX1NUQVRMRU5HVEgpOiBEZWxldGVkLgotCShzdHJ1Y3QgaGFzaF9lbnRyeSk6IEFkZCBmaWVsZCBmb3IgaGFzaCBjb2RlLgotCShoYXNoX3NheSwgaGFzaF9hcHBseSk6IERvbid0IGRlY2xhcmUuCi0KLQkqIGhhc2guYyAoZGVzdHJveSk6IFJldHVybiB2b2lkLgotCShhcHBsaWNhdGVlKTogRGl0dG8uCi0JKG1haW4pOiBGaXggZGVjbGFyYXRpb25zLgotCShoYXNoX2FwcGx5KTogUmV0dXJuIHZvaWQuICBBcmd1bWVudCBgZnVuY3Rpb24nIHJldHVybnMgdm9pZC4gIFB1dAotCWluc2lkZSAiI2lmZGVmIFRFU1QiLgotCShoYXNoX3NheSk6IERlZmluZSBvbmx5IGlmIFRFU1QgaXMgZGVmaW5lZC4KLQkqIGhhc2guaCAoaGFzaF9hcHBseSwgaGFzaF9zYXkpOiBEZWNsYXJhdGlvbnMgZGVsZXRlZC4KLQotTW9uIE5vdiAyNyAxMzoxODoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNy4KLQotVHVlIE5vdiAyMSAxODozOTowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBSZW1vdmUgbG9jYWwgZGVmaW5pdGlvbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotTW9uIE5vdiAyMCAxNzoyNjowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2RlYnVnX25hbWVfc2VjdGlvbl9zaXplKTogUmVtb3ZlLgotCShwcGNfc3RhYngpOiBEb24ndCBpbmNyZW1lbnQgcHBjX2RlYnVnX25hbWVfc2VjdGlvbl9zaXplLgotCShwcGNfYmMpOiBMaWtld2lzZS4KLQkocHBjX2Zyb2JfZmlsZSk6IFJlbW92ZS4KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZnJvYl9maWxlKTogRG9uJ3QgZGVmaW5lLgotCShwcGNfZnJvYl9maWxlKTogRG9uJ3QgZGVjbGFyZS4KLQotTW9uIE5vdiAyMCAxMzozNzowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF9hbHBoYSk6IE1lbnRpb24gYWxwaGEtb3Bjb2RlLmguCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IEluY2x1ZGUgb25lLW9wZXJhbmQgdmFyaWFudHMgb2Ygam1wIGFuZAotCWpzci4KLQotCSogY29uZmlnL3RlLWRlbHQ4OC5oOiBSZW5hbWVkIGZyb20gdGUtZGVsdGE4OC5oLCB0byBhdm9pZCBjb25mbGljdAotCXdpdGggdGUtZGVsdGEuaCBpbiA4LjMgZmlsZSBzeXN0ZW1zLgotCSogY29uZmlndXJlLmluOiBBZGp1c3RlZC4KLQotVGh1IE5vdiAxNiAxMjo0OTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZXJyKTogUmVtb3ZlOyBqdXN0IHVzZSB0aGUgb25lIGluIHJlYWQuYy4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAoeXlsZXgpOiBJbiBNUkkgbW9kZSwgJ0AnIGNhbiBzdGFydCBhbiBvY3RhbAotCW51bWJlci4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEhhbmRsZSBNUkkgc3VmZml4ZXMgYWZ0ZXIgdW5hZG9ybmVkIDAuCi0KLVRodSBOb3YgMTYgMDA6MjE6NDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlWZXJzaW9uIDIuNiByZWxlYXNlZC4KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byAyLjYuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENoYW5nZSB1c2Ugb2YgbWRfZG9fYWxpZ24KLQl0byBwYXNzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhIGZpbGwgdmFsdWUsIHRvIG1hdGNoIG90aGVyIHVzZXMuCi0KLVdlZCBOb3YgMTUgMDM6NTI6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1uczMyay5oIChUQ19GSVhfVFlQRSk6IEFkZCBtaXNzaW5nIHNlbWljb2xvbi4KLQotCSogYXMuYyAobWFpbik6IE1vdmUgbWRfZW5kIGNhbGwgdG8ganVzdCBhZnRlciBjYWxsIHRvCi0JcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzLiAgRGVsZXRlIGNwdS1zcGVjaWZpYyBjb2RlIGhlcmUuCi0JKiBjb25maWcvdGMtaTk2MC5oIChtZF9lbmQpOiBOZXcgbWFjcm8sIGNhbGxzIGJydGFiX2VtaXQuCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2VuZCk6IFVudXNlZCBmdW5jdGlvbiBkZWxldGVkLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2VuZCk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGhlcmUKLQlmcm9tIEhBTkRMRV9BTElHTiBtYWNyby4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEhBTkRMRV9BTElHTik6IENhbGwgaXQuCi0KLQlNb24gSnVsIDMxIDE0OjUzOjE5IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiBjYXN0IGZpbGwgYW5kIDB4OTAgdG8gY2hhcgotIAliZWZvcmUgY29tcGFyaW5nCi0KLQlNb24gTWF5ICAxIDEwOjkxOjQ5IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiAgTWFrZSAiLmFsaWduIG4sMHg5MCIgZ2VuZXJhdGUKLQltdWx0aS1ieXRlIG5vcHMgdG8gYXZvaWQgY2hhbmdpbmcgZ2NjLiAgVGhlIG5lY2Vzc2FyeSBnY2MgY2hhbmdlCi0JbWlnaHQgYnJlYWsgb2xkIGFzc2VtYmxlcnMuCi0KLQlTYXQgQXByIDIyIDIwOjUzOjA1IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24sIEhBTkRMRV9BTElHTik6ICBBZGQgbWFjcm9zIHRvCi0JZ2VuZXJhdGUgb3B0aW1hbCBtdWx0aS1ieXRlIG5vcCBpbnN0cnVjdGlvbnMgZm9yICIuYWxpZ24gbiIKLQkiLmFsaWduIG4sMHg5MCIsIGFuZCBhbGlnbnMgcmVxdWlyaW5nIG1vcmUgdGhhbiAxNSBieXRlcyBvZgotCXBhZGRpbmcgc3RpbGwgZ2VuZXJhdGUgbXVsdGlwbGUgMHg5MCdzIGFzIGJlZm9yZS4KLQotTW9uIE5vdiAxMyAxNzo0MDoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfbXJpX3VudGlsKTogQ2FsbCBwb3BfbXJpX2NvbnRyb2wuCi0KLU1vbiBOb3YgMTMgMjA6Mzk6MDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBwYy0qLW1hY29zKiwgcHBjLSotbXB3Kik6IE5ldyBjb25maWd1cmF0aW9ucy4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlLgotCSogbXB3LW1ha2Uuc2VkOiBSZW9yZGVyIGNvbW1hbmRzIHRvIG1ha2Ugc2VkIGhhcHBpZXIuCi0JKiBjb25maWcvdGUtbWFjb3MuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtcHBjLmggKFRBUkdFVF9GT1JNQVQpOiBTZXQgY29ycmVjdGx5IGZvciBQb3dlck1hYy4KLQotU3VuIE5vdiAxMiAyMToxNDo1NiAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogRml4IG9mZi1ieS0yIGJ1ZyBpbiBsZW5ndGggY2hlY2sgZm9yCi0JY29uZGl0aW9uYWwgYnJhbmNoZXMuCi0JKG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCi1UaHUgTm92ICA5IDE2OjE0OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYXBwbHlfZml4KTogV2FybiBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8KLQlnZW5lcmF0ZSBhIHJlbG9jIHdoaWNoIHRoZSBsaW5rZXIgd2lsbCBub3QgaGFuZGxlIGNvcnJlY3RseS4gIEZpeAotCW92ZXJmbG93IGNoZWNraW5nLS1SX0lSRUwgaXMgMTggYml0cywgbm90IDE3LgotCi1XZWQgTm92ICA4IDE5OjU5OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBzdWJ0cmFjdCBtZF9wY3JlbF9mcm9tCi0JZnJvbSBhIFBDIHJlbGF0aXZlIHJlbG9jIGlmIFRDX0EyOUsuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKGxpbmVfc2VwYXJhdG9yX2NoYXJzKTogUmVzdG9yZSAnQCcuICBFeGlzdGluZwotCWNvZGUgZGVwZW5kcyB1cG9uIGl0LgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9vcGVyYW5kKTogSGFuZGxlICRmbG9hdCwgJGRvdWJsZSwgYW5kCi0JJGV4dGVuZC4gIEJhc2VkIG9uIGNvZGUgZnJvbSBFcmljIEZyZXVkZW50aGFsCi0JPGZyZXVkZW50aGFsQG55dS5lZHU+LgotCSogY29uZmlnL3RjLWEyOWsuaCAoTEVYX0RPTExBUik6IERlZmluZS4KLQkqIHJlYWQuYyAoTEVYX0RPTExBUik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkobGV4X3R5cGUpOiBVc2UgTEVYX0RPTExBUi4KLQotV2VkIE5vdiAgOCAxNjozODoxNCAxOTk1ICBFcmljIEZyZXVkZW50aGFsIDxmcmV1ZGVudGhhbEBueXUuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKGEyOWstbnl1LXN5bTEpOiBOZXcgdGFyZ2V0LCBqdXN0IGxpa2Ugb3RoZXIgYTI5awotCXRhcmdldHMuCi0KLVdlZCBOb3YgIDggMTE6Mzg6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19kb3RfZmlsZV9zeW1ib2wpOiBDYXN0IHhtYWxsb2MgcmV0dXJuLgotCi1UdWUgTm92ICA3IDA5OjE0OjM1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGRlZCBCRkRfUkVMT0NfUlZBLiBDdXJyZW50bHkKLQl1c2VkIG9ubHkgYnkgImRsbHRvb2wuYyIuCi0KLU1vbiBOb3YgIDYgMTg6NTE6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogVW5kZWZpbmUgaW5saW5lIGlmIG5vdCBfX0dOVUNfXy4KLQkobWRfcHNldWRvX3RhYmxlKTogRG9uJ3QgZGVmaW5lICJleHRlcm4iLgotCi1TYXQgTm92ICA0IDAwOjUxOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmllaSk6IEZvcmNlIHN5bWJvbCBpbnRvIHRleHRfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9zaG93X3VzYWdlKTogUHV0IGJhY2tzbGFzaCBhdCBlbmQgb2YgbGluZS4KLQotRnJpIE5vdiAgMyAxMzowMjo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogRG9uJ3Qgd2FybiBhYm91dCA9PSB3aXRoIGEKLQlub25leGlzdGVudCBwYXJhbWV0ZXIsIGluIGNhc2UgaXQgaXMgaW4gYSBjb21tZW50IGZpZWxkLgotCi0JKiBhcy5jIChtYWluKTogT24gVENfQTI5SywgY2FsbCBtYWNyb19pbml0IHdpdGggbWFjcm9fYWx0ZXJuYXRlCi0Jc2V0IHRvIDEuCi0JKiBtYWNyby5jIChnZXRfYW55X3N0cmluZyk6IERvbid0IGtlZXAgcXVvdGVzIGlmIG1hY3JvX3N0cmlwX2F0IGlzCi0Jc2V0LCBldmVuIGlmIG1hY3JvX2FsdGVybmF0ZSBpcyBzZXQuCi0JKGdldF9hcG9zdF90b2tlbik6IElmIG1hY3JvX3N0cmlwX2F0LCBvbmx5IHNraXAga2luZCBpZiBpdCBpcyAnQCcuCi0JKHN1Yl9hY3R1YWwpOiBJZiBtYWNyb19zdHJpcF9hdCwgYW5kIGtpbmQgaXMgJ0AnLCBkb24ndCBsb29rIHVwCi0JdGhlIHRva2VuIHVubGVzcyBpdCBlbmRlZCBpbiAnQCcuCi0JKiBjb25maWcvdGMtYTI5ay5jIChsaW5lX3NlcGFyYXRvcl9jaGFycyk6IFJlbW92ZSAnQCcuCi0JKiBkb2MvYy1hMjlrLnRleGk6IERvY3VtZW50IG1hY3JvIHVzYWdlIG9uIEEyOUsuCi0KLVRodSBOb3YgIDIgMjM6MDc6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSGFuZGxlIG5ldyAnVycgcGxhY2UsIG1lYW5pbmcgYQotCXNpZ25lZCB3b3JkLgotCShpbnN0YWxsX29wZXJhbmQpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTogQWRkICJleHRlcm4iLgotCi1XZWQgTm92ICAxIDE1OjE3OjAyIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb25maWd1cmUuaW4gKG04OGstbW90b3JvbGEtc3lzdiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLWRlbHRhODguaDogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgbWRfZG9fYWxpZ24gaWYgaXQgaXMKLQlkZWZpbmVkLgotCSogY29uZmlnL3RjLW04OGsuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUuCi0JKG1kX2RvX2FsaWduKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW04OGsuYzogSW5jbHVkZSAic3Vic2Vncy5oIi4KLQkobTg4a19kb19hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RlLWRlbHRhLmggKFNUUklQX1VOREVSU0NPUkUpOiBEb24ndCBkZWZpbmUuCi0JKENPRkZfTk9MT0FEX1BST0JMRU0pOiBEZWZpbmUuCi0JKExPQ0FMX0xBQkVMU19ET0xMQVIsIExPQ0FMX0xBQkVMU19GQik6IERlZmluZS4KLQotV2VkIE5vdiAgMSAxNjowNzo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBGb3IgYSBqdW1wIGluc3RydWN0aW9uIHdpdGgKLQlub24tY29uc3RhbnQgdGFyZ2V0LCByZXF1aXJlIDcgYXZhaWxhYmxlIGJ5dGVzIGluIHRoZSBjdXJyZW50Ci0JZnJhZywgbm90IDYuCi0KLVR1ZSBPY3QgMzEgMTU6Mzc6MTYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5oOiBJbmNsdWRlIGJmZC9lbGYtYmZkLmggcmF0aGVyIHRoYW4KLQliZmQvbGliZWxmLmguCi0KLVR1ZSBPY3QgMzEgMTY6MzQ6MjggMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLWxpbnV4Kik6IFVzZSBlY29mZi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4pOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoZWNvZmZfc2V0dXBfZXh0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogV2FybiBhYm91dCB3ZWFrIGNvbW1vbiBzeW1ib2xzLgotCSogZWNvZmYuaCAoZWNvZmZfZGlyZWN0aXZlX2V4dGVybik6IERlY2xhcmUuCi0JKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAoU19JU19XRUFLKTogTmV3IGZ1bmN0aW9uLgotCSogc3ltYm9scy5oIChTX0lTX1dFQUspOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogQWRkICJleHRlcm4iIGFuZAotCSJ3ZWFrZXh0Ii4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogUmVtb3ZlICJleHRlcm4iLgotCShzX2V4dGVybik6IFJlbW92ZS4KLQotVHVlIE9jdCAzMSAxMzoyOTowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2xnbG9ibCk6IERvIHRoZSByaWdodCB0aGluZy4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmIpOiBDYWxsIFNGX1NFVF9QUk9DRVNTLgotCShwcGNfZWIpOiBMaWtld2lzZS4gIFNldCB0aGUgc3RvcmFnZSBjbGFzcyB0byBDX0JMT0NLLCBub3QgQ19GQ04uCi0JKHBwY19mcm9iX3N5bWJvbCk6IERvbid0IGNoYW5nZSBDX0JMT0NLIHN5bWJvbHMgdG8gQ19ISURFWFQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IERvbid0IGNhbGwKLQlTQV9TRVRfU1lNX0VORE5EWCB3aXRoIHRoZSBjdXJyZW50IHN5bWJvbDsgY2FsbCBpdCB3aXRoIHRoZSBuZXh0Ci0Jb25lLiAgSWYgT0JKX1hDT0ZGLCB0cnkgdG8gZmlndXJlIG91dCB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgZ29pbmcKLQl0byBiZSBkcm9wcGVkLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiYmMiIGFuZCAiZWMiLgotCShwcGNfc3RhYl9zeW1ib2wpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcGNfY2hhbmdlX2NzZWN0KTogQ2hlY2sgdGhhdCBwcGNfdG9jX2NzZWN0IGlzIG5vdCBOVUxMLgotCShwcGNfc3RhYngpOiBTZXQgcHBjX3N0YWJfc3ltYm9sIGFyb3VuZCBjYWxsIHRvIHN5bWJvbF9tYWtlLiAgU2V0Ci0Jc3lfdGMucmVhbF9uYW1lIHRvIHRoZSBzdGFiIHN0cmluZy4KLQkocHBjX2JjLCBwcGNfZWMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkocHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSk6IElmIHBwY19zdGFiX3N5bWJvbCBpcyBzZXQsIGRvbid0Ci0JZG8gYW55dGhpbmcuCi0JKHBwY19zeW1ib2xfbmV3X2hvb2spOiBJZiBwcGNfc3RhYl9zeW1ib2wgaXMgc2V0LCBkb24ndCBsb29rIGZvciBhCi0Jc3VmZml4LgotCShwcGNfZnJvYl9zeW1ib2wpOiBTZXQgQlNGX05PVF9BVF9FTkQgZm9yIHN5bWJvbHMgd2l0aCBjc2VjdCBhdXgKLQllbnRyaWVzLgotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9wdXNoKTogUmVzZXQgc2JfaW5kZXguCi0KLU1vbiBPY3QgMzAgMTc6NTI6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IERvbid0IGNyZWF0ZSBhIGZyYWcgaW4gdGhlIGFic29sdXRlCi0Jc2VjdGlvbi4KLQotU2F0IE9jdCAyOCAwMTowMjowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJkYXRhIiBhbmQgInRleHQiLgotCShwcGNfY3NlY3QpOiBNb3ZlIG1vc3Qgb2YgdGhlIGNvZGUgdG8gcHBjX2NoYW5nZV9jc2VjdCwgYW5kIGNhbGwKLQlpdC4KLQkocHBjX2NoYW5nZV9jc2VjdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHRha2VuIGZyb20gcHBjX2NzZWN0LgotCShwcGNfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHBwY19zYXdfYWJzKTogTmV3IHN0YXRpYyB2YXJhYmxlLgotCShwcGNfZnJvYl9zeW1ib2wpOiBDcmVhdGUgYXV4IGVudHJ5IGZvciBhYnNvbHV0ZSBzeW1ib2xzLiAgV2FybiBpZgotCWEgc3ltYm9sIGhhcyBubyBjc2VjdC4KLQkocHBjX2FkanVzdF9zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2FkanVzdF9zeW10YWIpOiBEZWZpbmUgaWYgT0JKX1hDT0ZGLgotCShwcGNfYWRqdXN0X3N5bXRhYik6IERlY2xhcmUgaWYgT0JKX1hDT0ZGLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIHRjX2FkanVzdF9zeW10YWIgaXMgZGVmaW5lZCwKLQljYWxsIGl0IGp1c3QgYmVmb3JlIHRoZSBjYWxsIHRvIG9ial9hZGp1c3Rfc3ltdGFiLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9maW5kX29yX21ha2UpOiBDaGFuZ2UgbmFtZSB0byBiZSBjb25zdC4KLQkqIHN5bWJvbHMuaCAoc3ltYm9sX2ZpbmRfb3JfbWFrZSk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotVGh1IE9jdCAyNiAxOToxODoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKEFsaWduKTogTWVudGlvbiBTSC4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1EaXJlY3RpdmVzLCAuZXZlbik6IERlc2NyaWJlIGJlaGF2aW9yLCBub3QKLQkuYWxpZ24gdmFsdWUuCi0JKiBkb2MvYy16OGsudGV4aSAoWjgwMDAgRGlyZWN0aXZlcywgZ2xvYmFsKTogRml4IG1pbm9yIHR5cG8uCi0JKFo4MDAwIERpcmVjdGl2ZXMsIGV2ZW4pOiBEb24ndCBnaXZlIG51bWVyaWMgYWxpZ24gdmFsdWUsIGluc3RlYWQKLQlleHBsYWluIGJlaGF2aW9yLgotCi1UaHUgT2N0IDI2IDExOjQ1OjAzIDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogdGMtYXJtLmMgKGRvX2xkc3QpOiBBc3NlbWJsZSBsZHIvc3RyIHIwLCBbcjFdIGFzIGEgcHJlLWluY3JlbWVudAotCWluc3RydWN0aW9uLgotCi1XZWQgT2N0IDI1IDExOjU5OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIEFsc28gbWFrZSBpbmZvLgotCShtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6ICBBbHNvIG1ha2UgY2xlYW4taW5mby4KLQotVHVlIE9jdCAyNCAxNToyMTozMyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBuZXcgIi5uc3Vic3BhIiBvcGNvZGUuCi0JKHBhX3N1YnNwYWNlKTogRm9yICIubnN1YnNwYSIsIGFsd2F5cyBjcmVhdGUgYSBuZXcgc3Vic3BhY2UKLQl3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLCBldmVuIGlmIG9uZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZQotCXNhbWUgbmFtZS4KLQotVHVlIE9jdCAyNCAxNDo1MDozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OKTogUmVuYW1lIGZyb20KLQlUQ19GT1JDRV9SRUxPQ0FUSU9OLCB0YWtpbmcgYW4gYWRkaXRpb25hbCBzZWN0aW9uIGFyZ3VtZW50LiAgSWYKLQl0aGUgc2VjdGlvbiBvZiB0aGUgdGFyZ2V0IHN5bWJvbCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQKLQlzZWN0aW9uLCBhbHdheXMgZm9yY2UgdGhlIHJlbG9jYXRpb24gdG8gYmUgdXNlZC4KLQkoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogTmV3IG1hY3JvIHRvIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IFJlbmFtZSBmcm9tIHRoZQotCW1kX3BjcmVsX2Zyb20gZnVuY3Rpb24sIHRha2luZyBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gYXJndW1lbnQuCi0JSW52b2tlIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTiBpbnN0ZWFkIG9mIFRDX0ZPUkNFX1JFTE9DQVRJT04uCi0KLQkqIHdyaXRlLmMgKFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTik6IERlZmluZSBpbiB0ZXJtcyBvZiB0aGUKLQlvbGRlciBUQ19GT1JDRV9SRUxPQ0FUSU9OIGlmIG5vdCBkZWZpbmVkLgotCShNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBJZiBub3QgZGVmaW5lZCwgaW52b2tlIG1kX3BjcmVsX2Zyb20uCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgTURfUENSRUxfRlJPTV9TRUNUSU9OIGluc3RlYWQgb2YKLQltZF9wY3JlbF9mcm9tLCBhbmQgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OIGluc3RlYWQgb2YKLQlUQ19GT1JDRV9SRUxPQ0FUSU9OLgotCQotTW9uIE9jdCAyMyAxNjoyMDowNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaW5wdXQtc2NydWIuYyAoYXNfd2hlcmUpOiBTZXQgbmFtZSB0byBudWxsIHBvaW50ZXIgaWYgd2UgZG9uJ3QKLQloYXZlIGEgZmlsZSBuYW1lLgotCSogbWVzc2FnZXMuYyAoaWRlbnRpZnkpOiBPbmx5IHByaW50IGZpbGVuYW1lIGlmIG5vbi1udWxsLgotCShhc19zaG93X3doZXJlKTogRGl0dG8sIGZvciBsaW5lIG51bWJlciB0b28uCi0JKGFzX3dhcm5faW50ZXJuYWwsIGFzX2JhZF9pbnRlcm5hbCk6IERpdHRvLgotCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IElmIHRoZSBpbnB1dCBmaWxlIGNhbid0IGJlCi0Jb3BlbmVkLCBjb25zaWRlciBpdCBhbiBlcnJvci4KLQotTW9uIE9jdCAyMyAxMToxNTo0NCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQWRkZWQgbWlwc180MTAwIGNvbnRyb2wsIGFuZCBzdXBwb3J0IGZvcgotIAlhY2NlcHRpbmcgdGhlIDQxMDAgYXMgYSBNSVBTIGFyY2hpdGVjdHVyZSB2YXJpYW50IChtZF9iZWdpbiwKLSAJbWFjcm9fYnVpbGQsIG1pcHNfaXAsIG1kX3BhcnNlX29wdGlvbikuIEFkZGluZyBzdWl0YWJsZQotIAljb21tYW5kLWxpbmUgT1BUSU9OcywgYW5kIHVwZGF0aW5nIHRoZSBoZWxwIHRleHQgKG1kX3Nob3dfdXNhZ2UpLgotCQotV2VkIE9jdCAxOCAxMzoyMDozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfYmVnaW4pOiBPbmx5IHNldCBhYnNvbHV0ZV9mcmNoYWluLmZpeF8qIHdoZW4KLQlCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQuCi0KLQkqIFVzZSBvbmUgYWN0aXZlIGZyYWcgYW5kIG9uZSBvYnN0YWNrIHBlciBmcmFnIGNoYWluOgotCSogZnJhZ3MuYyAoZnJhZ3MpOiBWYXJpYWJsZSBkZWxldGVkLgotCShmcmFnX2FsbG9jKTogTmV3IGZ1bmN0aW9uLgotCShmcmFnX2dyb3csIGZyYWdfbW9yZSwgZnJhZ192YXJpYW50LCBmcmFnX25vd19maXgsCi0JZnJhZ19hcHBlbmRfMV9jaGFyKTogUmVmZXIgdG8gZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjayBpbnN0ZWFkIG9mCi0JZnJhZ3MgdmFyaWFibGUuCi0JKGZyYWdfbmV3KTogRGl0dG8uICBWZXJpZnkgdGhhdCBmcmNoX2xhc3QgYW5kIGZyYWdfbm93IG1hdGNoIG9uCi0JZW50cnkgYW5kIGV4aXQsIGFuZCB0aGF0IG9sZCBmcmFnX25vdyBoYXMgbm9uLXplcm8gdHlwZS4gIFJlcGxhY2UKLQkia25vdyIgdXNlcyB3aXRoICJhc3NlcnQiLiAgVXNlIGZyYWdfYWxsb2MgaW5zdGVhZCBvZiBtdWNraW5nIHdpdGgKLQlvYnN0YWNrIGFsaWdubWVudC4KLQkqIGZyYWdzLmggKGZyYWdzKTogRGVjbGFyYXRpb24gZGVsZXRlZC4KLQkqIHN1YnNlZ3MuaCAoc3RydWN0IGZyY2hhaW4pOiBBZGQgbmV3IGZpZWxkIGZyY2hfZnJhZ19ub3cuCi0JKiBzdWJzZWdzLmMgKGZyY2hhaW5zLCBkdW1teV9mcmFnLCBhYnNvbHV0ZV9mcmNoYWluKTogTmV3IHN0YXRpYwotCXZhcmlhYmxlcy4KLQkoc3Vic2Vnc19iZWdpbik6IEluaXRpYWxpemUgZnJjaGFpbnMgb2JzdGFjay4gIFVuZGVyIGdjYywgZG9uJ3QKLQlnaXZlIGl0IGFueSBzdHJpY3RlciBhbGlnbm1lbnQgdGhhbiBmcmNoYWluUyBzdHJ1Y3R1cmVzIG5lZWQuICBEbwotCW5vdCBpbml0aWFsaXplIGZyYWdzIG9ic3RhY2suICBTZXQgZnJhZ19ub3cgdG8gcG9pbnQgdG8KLQlkdW1teV9vYnN0YWNrLiAgSW5pdGlhbGl6ZSBhYnNvbHV0ZV9mcmNoYWluLgotCShzdWJzZWdfc2V0X3Jlc3QpOiBTYXZlIGFuZCByZXN0b3JlIGZyYWdfbm93IGluIGZyY2hfZnJhZ19ub3cKLQlmaWVsZCBvZiBmcmNoYWluUy4gIERvbid0IGNyZWF0ZSBuZXcgZnJhZ3Mgb24gc2VjdGlvbiBzd2l0Y2gsIGFuZAotCXVzZSBmcmFnX2FsbG9jIHdoZW4gY3JlYXRpbmcgYSBuZXcgZnJhZyBjaGFpbi4gIEZvciBhYnNvbHV0ZQotCXNlY3Rpb24sIHNldCBmcmNoYWluX25vdyB0byBhYnNvbHV0ZV9mcmNoYWluLiAgVmVyaWZ5IHRoYXQKLQlmcmNoX2xhc3QgYW5kIGZyYWdfbm93IG1hdGNoIG9uIGVudHJ5IGFuZCBleGl0LiAgSW5pdGlhbGl6ZQotCXBlci1jaGFpbiBvYnN0YWNrLCBhbmQgdW5kZXIgZ2NjLCBzZXQgcmVxdWlyZWQgYWxpZ25tZW50IHRvIHRoYXQKLQluZWVkZWQgYnkgZnJhZ1Mgc3RydWN0dXJlLgotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlcl8xKTogVmVyaWZ5IGZyX3R5cGUgaXMgbm9uemVyby4KLQotCSogc3RhYnMuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IE9ubHkgY29weSBpbnB1dCBzdHJpbmcgaWYgYQotCWZyZXNoIGNvcHkgaXMgbmVlZGVkLCBub3QgaWYgdGhlIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMuCi0JKHNfc3RhYl9nZW5lcmljKTogQ2FjaGUgc3RhYiBzZWN0aW9uIG5hbWUgdG8gYnlwYXNzIGxvb2t1cHMsIHNpbmNlCi0JdXN1YWxseSBpdCB3aWxsIG1hdGNoLiAgQ291bGQgYmUgbWFkZSBmYXN0ZXIgc3RpbGwgYnkgY2hhbmdpbmcgdGhlCi0JbWVtb3J5IGFsbG9jYXRpb24gcnVsZXMuCi0JKHNfeHN0YWIpOiBDYWNoZSBzZWN0aW9uIG5hbWUgdG8gYnlwYXNzIHJlcGVhdGVkIHN0cmluZwotCWFsbG9jYXRpb24uCi0KLQkqIGZyYWdzLmMgKGZyYWdfbmV3KTogRGVsZXRlZCByZWdpc3RlciBkZWNsYXJhdGlvbnMuCi0KLQkqIGxpc3RpbmcuYyAoZnJhZ19ub3cpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBhcy5jIChjaHVua3NpemUpOiBOZXcgdmFyaWFibGUuCi0JKGRlYnVnX21lbW9yeSk6IE5ldyB2YXJpYWJsZS4KLQkobWFpbik6IElmIGRlYnVnX21lbW9yeSBpcyBzZXQsIHJlZHVjZSBjaHVua3NpemUgYW5kCi0JX2JmZF9jaHVua3NpemUuCi0JKiBhcy5oIChjaHVua3NpemUpOiBEZWNsYXJlIGl0LgotCSogcmVhZC5jIChyZWFkX2JlZ2luKTogVXNlIGl0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvcnRvcHRzKTogSW5jbHVkZSAnZycuCi0JKG1kX3BhcnNlX29wdGlvbik6IElnbm9yZSBpdC4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBNYWtlZmlsZSBhbmQgY29uZmlnLnN0YXR1cyBmcm9tCi0JdGVzdHN1aXRlIGRpcmVjdG9yeS4KLQkoY2xlYW4taGVyZSk6IERvbid0IGRlbGV0ZSB0ZXN0c3VpdGUuICBJbnN0ZWFkLCBkZWxldGUgb25seSB0aGUKLQlmaWxlcyB3aXRoaW4gaXQgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQgYnkgcnVubmluZyB0ZXN0cy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24pOiBDYWxsCi0JZnJhZ19ub3dfZml4IGluc3RlYWQgb2YgYWNjZXNzaW5nIG9ic3RhY2sgaW5mbyBkaXJlY3RseS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoc19sdG9yZyk6IERpdHRvLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IENhbGwgZnJhZ19ncm93IGluc3RlYWQgb2YKLQlvYnN0YWNrX3Jvb20uCi0KLVdlZCBPY3QgMTggMTI6MjI6NTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKGFvdXRfcHJvY2Vzc19zdGFiKTogSW5zZXJ0IGRlYnVnIHN5bWJvbCBpbnRvIHN5bWJvbAotCWNoYWluIGFmdGVyIHBhcnNpbmcgdmFsdWUgZXhwcmVzc2lvbiwgaWYgYW55LCB0byBhdm9pZCBzZXBhcmF0aW5nCi0JY29udGludWVkIC5zdGFicyBsaW5lcy4KLQotTW9uIE9jdCAxNiAxMDo1Njo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZWxmX3BzZXVkb190YWJsZSk6IFJlbW92ZS4KLQkobWlwc19wb3BfaW5zZXJ0KTogRG9uJ3QgY2FsbCBwb3BfaW5zZXJ0IG9uIG1pcHNfZWxmX3BzZXVkb190YWJsZS4KLQotTW9uIE9jdCAxNiAwNzowNzozNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogVXNlIG5ldyBmbGFncyBQUENfT1BDT0RFX0NPTU1PTiBmb3IKLQktbWNvbSBzdXBwb3J0IGFuZCBQUENfT1BDT0RFX0FOWSBmb3IgLW1hbnkuCi0JKG1kX3BhcnNlX29wdGlvbik6IERpdHRvLgotCShwcGNfYXJjaCk6IERpdHRvLgotCShtZF9iZWdpbik6IEZvciBkdXBsaWNhdGUgaW5zdHJ1Y3Rpb25zLCBwcmludCBhbGwgZHVwbGljYXRlcwotCWJlZm9yZSBhYm9ydGluZy4KLQotU3VuIE9jdCAxNSAyMjowNjoxNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBTdXBwb3J0IGZvciAtbWNvbSB0byB0dXJuIG9uCi0JY29tbW9uIG1vZGUgb3BlcmF0aW9uLgotCShtZF9zaG93X3VzYWdlKTogQWRkIC1tY29tIHRvIHVzYWdlIG1lc3NhZ2UuCi0KLUZyaSBPY3QgMTMgMTM6MzI6NDUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcF9yYW5rKTogQWRkIE9fc3ltYm9sX3J2YS4KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogQWRkIE9fc3ltYm9sX3J2YS4KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBTZXQgT19zeW1ib2xfcnZhIHdoZW4gbmVjZXNzYXJ5LgotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBVbmRlcnN0YW5kIE9fc3ltYm9sX3J2YS4KLQotVHVlIE9jdCAxMCAxMTozNDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IENvcnJlY3Qgc19jb25zIGFyZ3VtZW50cy4gIEZyb20gTWljaGFlbAotCUpvb3N0ZW4gPGpvb3N0QG9yaS5jYWRsYWIuZGU+LgotCi1Nb24gT2N0ICA5IDE5OjU5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfbWFjcm8pOiBNYWtlIGNvdW50IHVuc2lnbmVkLgotCShwcGNfYmllaSk6IFNldCBzZWdtZW50IHRvIG5vd19zZWcgYW5kIHZhbHVlIHRvIGNvZmZfbl9saW5lX25vcy4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogSGFuZGxlIENfQklOQ0wgYW5kIENfRUlOQ0wgc3ltYm9scyBieSBzZXR0aW5nCi0JdGhlIGZpeF9saW5lIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfbl9saW5lX25vcyk6IFJlbmFtZSBmcm9tIG5fbGluZV9ub3MsIGFuZAotCW1ha2Ugbm9uLXN0YXRpYy4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9uX2xpbmVfbm9zKTogRGVjbGFyZS4KLQotRnJpIE9jdCAgNiAxNjoyNDoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfQVJHX1dJVEgoYmZkLWFzc2VtYmxlcikpOiBGaXggaGVscCBtZXNzYWdlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IENvbnZlcnQgc3BlY2lmaWVkIGJ5dGUKLQlhbGlnbm1lbnQgdG8gcG93ZXIgb2YgdHdvLiAgU2V0IHNpemUgb2YgbG9jYWwgYnNzIHN5bWJvbC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAodGNfZ2VuX3JlbG9jKTogRml4IHR5cG8gaW4gdmFyaWFibGUgbmFtZS4KLQotRnJpIE9jdCAgNiAxNToyMjoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNiLmMsIG1hY3JvLmM6IERlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgPHN0cmluZy5oPiBvcgotCTxzdHJpbmdzLmg+IGp1c3QgYXMgYXMuaCBkb2VzLgotCi1GcmkgT2N0ICA2IDA5OjU1OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzaXRlLmV4cCk6IEZpeCBzZXR0aW5nIG9mICRzcmNkaXIuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXRvZik6IEZpeCBsaXR0bGUtZW5kaWFuIG91dHB1dC4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoQVJNX0JJX0VORElBTik6IE1vdmUgZGVmaW5pdGlvbiBzbyBkZWZpbmVkIGZvcgotCWFsbCBjb2ZmIHRhcmdldHMuCi0KLVRodSBPY3QgIDUgMjA6MTc6MzAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBTcGxpdCBvdXQgdGhlIE5TMzJrIGZhbWlseSBkb2N1bWVudGF0aW9uLAotCWRlc3BpdGUgaXRzIGJlaW5nIGNvbW1lbnRlZCBvdXQgZm9yIG5vdy4KLQkqIGRvYy9jLW5zMzJrLnRleGk6IE5ldyBmaWxlLgotCi0JKiBzYi5jLCBtYWNyby5jOiBJbmNsdWRlIHN0cmluZy5oLgotCi0JKiBNYWtlZmlsZS5pbiAoY29tcGFyaXNvbik6IE9ubHkgY2hlY2sgKi5vOyB3ZSBkb24ndCBjYXJlIGlmCi0JdGltZXN0YW1wcyBpbnNlcnRlZCBieSB0aGUgbmF0aXZlIGxpbmtlciBkaWZmZXIuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9hbGlnbik6IE9ubHkgZmlsbCB3aXRoIGEgbm8tb3AgcGF0dGVybgotCWlmIGFsaWdubWVudCBzdHJpY3RlciB0aGFuIDQgYnl0ZXMgaXMgcmVxdWVzdGVkOyBpbiB0aGF0IGNhc2UsCi0JYWxpZ24gdG8gYSA0LWJ5dGUgYm91bmRhcnkgZmlyc3QuCi0KLQlUaHUgU2VwIDI4IDE5OjM1OjI3IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfUlNZTV9QYXJzZSk6IGVsaW1pbmF0ZSAibWlnaHQgYmUgdXNlZAotCXVuaW5pdGlhbGl6ZWQiIHdhcm5pbmcgZm9yIGBNYXhfU291cmNlX09mZnNldCcuCi0KLVdlZCBPY3QgIDQgMTY6MTc6MDIgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocGFyc2VfdG9jX2VudHJ5KTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIFt0b2NdCi0JcXVhbGlmaWVycyBhbmQgZGV0ZWN0IGVycm9ycyBpZiBwcmVzZW50LgotCShtZF9hc3NlbWJsZSk6IEFkZCBjYWxsIHRvIHBhcnNlX3RvY19lbnRyeS4gQWxzbyBhZGRlZCBzb21lIHN1cHBvcnQKLQlmb3IgdGhlIFt0b2N2XSBxdWFsaWZpZXIuCi0JKHBwY19wZV90b2NkKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQgZGF0YSBpbiB0aGUgdG9jIHNlY3Rpb24uCi0KLVdlZCBPY3QgIDQgMTQ6MDM6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19mcm9iX3N5bWJvbCk6IERvbid0IGNyZWF0ZSBhbiBhdXggZW50cnkgZm9yCi0JYW4gYWJzb2x1dGUgc3ltYm9sLgotCi1UdWUgT2N0ICAzIDEyOjE4OjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaXN3b3JkKTogQWNjZXB0IGFsbCB2YWx1ZXMgZnJvbSAtNjU1MzYgdG8KLQkrNjU1MzUsCXNvIH5WQUwgd2lsbCBub3QgYmUgcmVqZWN0ZWQuCi0KLQkqIGNvbmQuYyAoc19lbmRpZik6IENhbGwgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4gIEluIE1SSSBtb2RlLAotCXNraXAgY2hhcmFjdGVycyBhZnRlciB0aGUgcHNldWRvLW9wLgotCShzX2Vsc2UpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBEb24ndCBsb29rIHBhc3QgYnVmZmVyX2xpbWl0LgotCShzX2luY2x1ZGUpOiBJbiBNUkkgbW9kZSwgc2tpcCBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBmaWxlIG5hbWUuCi0KLU1vbiBPY3QgIDIgMTY6MTU6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtNjhrX3JlZ19wYXJzZSk6IEluIE1SSSBtb2RlLCBwZXJtaXQKLQlwZXJpb2RzIGluIHJlZ2lzdGVyIG5hbWVzLgotCi1TYXQgU2VwIDMwIDIzOjAzOjMxIDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IERQIHJlbGF0aXZlIHJlbG9jcwotCWFyZSBub3QgYWRqdXN0YWJsZSBpbiBTT00gdG8gYXZvaWQgY29uZnVzaW5nIHRoZSBvcHRpbWl6aW5nCi0JbGlua2VyLgotCi1GcmkgU2VwIDI5IDE1OjE4OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBzb21lIHN1cHBvcnQgZm9yIGk5NjAgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBlbmRpYW4uCi0JKGdldF9hcmdzKTogRG9uJ3QgZGlzY2FyZCBhIHNwYWNlIGJldHdlZW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuCi0JKGdldF9jZGlzcCk6IENoYW5nZSB0ZXh0X3NlY3Rpb24gdG8gbm93X3NlZy4KLQkoc19lbmRpYW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWk5NjAuaCAoTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVCk6IERlZmluZS4KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogQWRkIE9fbG9naWNhbF9ub3QsIE9fbG9naWNhbF9hbmQsIGFuZAotCU9fbG9naWNhbF9vci4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFRyZWF0ICchJyBhcyBsb2dpY2FsIG5vdCBvcGVyYXRvci4gIElmCi0JVENfSTk2MCwgaW4gTVJJIG1vZGUgcGVybWl0IGBzaXplb2Ygc2VjbmFtZScgYW5kIGBzdGFydG9mCi0Jc2VjbmFtZScuCi0JKG9wX3JhbmspOiBCdW1wIHZhbHVlcyBieSAyIHRvIG1ha2Ugcm9vbSBmb3IgJiYgYW5kIHx8LiAgQWRkCi0JZW50cmllcyBmb3IgISwgJiYsIGFuZCB8fC4KLQkoZXhwcl9iZWdpbik6IE9ubHkgZG8gTVJJIGNoYW5nZXMgaWYgVENfTTY4Sy4KLQkob3BlcmF0b3IpOiBSZWNvZ25pemUgfHwgYW5kICYmLgotCShleHByKTogSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBuZXcgb3BlcmF0b3JUIHZhbHVlcy4KLQkocHJpbnRfZXhwcl8xKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgZGVidWcsIGVyciwgaXJlcCwgaXJlcGMsIHByaW50LCBwdXJnZW0sCi0JYW5kIHJlcC4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSGFuZGxlIE1SSV9NT0RFX05FRURTX1BTRVVET19ET1QuCi0JKG1yaV9jb21tZW50X2ZpZWxkKTogT25seSBoYW5kbGUgd2VpcmQgY29tbWVudHMgaWYgVENfTTY4Sy4KLQkoc19lcnIpOiBOZXcgZnVuY3Rpb24uCi0JKHNfb3JnKTogT25seSBwdW50IGluIE1SSSBtb2RlIGlmIFRDX002OEsuCi0JKHNfbXJpX3NlY3QpOiBXcml0ZSBUQ19JOTYwIHZlcnNpb24uCi0JKHNfcHJpbnQsIHNfcHVyZ2VtKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHJlYWQuaCAoc19lcnIsIHNfcHJpbnQsIHNfcHVyZ2VtKTogRGVjbGFyZS4KLQkqIGNvbmQuYyAoc19pZmVxcyk6IEltcGxlbWVudC4KLQkoaWdub3JlX2lucHV0KTogSGFuZGxlIE1SSV9NT0RFX05FRURTX1BTRVVET19ET1QuCi0JKiBtYWNyby5jIChtYWNyb19zdHJpcF9hdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1hY3JvX2luaXQpOiBBZGQgc3RyaXBfYXQgcGFyYW1ldGVyLgotCShkb19mb3JtYWxzKTogSWYgbWFjcm9fc3RyaXBfYXQsIGNoYW5nZSBOQVJHIHRvICROQVJHLgotCShkZWZpbmVfbWFjcm8pOiBTa2lwIGEgY29tbWEgYWZ0ZXIgdGhlIG1hY3JvIG5hbWUuCi0JKGdldF9hcG9zdF90b2tlbik6IFNraXAgY2hhcmFjdGVyIGlmIG1hY3JvX3N0cmlwX2F0LCBldmVuIGlmCi0JbWFjcm9fbXJpLgotCShtYWNyb19leHBhbmRfYm9keSk6IElmIG1hY3JvX3N0cmlwX2F0LCBkb24ndCByZWNvZ25pemUgcGFyYW1ldGVycwotCWluIHN0cmluZ3MgdW5sZXNzIHRoZXkgYXJlIHByZWNlZGVkIGJ5IGFuICdAJy4gIElmIG1hY3JvX3N0cmlwX2F0LAotCXBhc3MgJ0AnIGFzIHN0cmlwIGNoYXJhY3RlciB0byBzdWJfYWN0dWFsLiAgSWYgbWFjcm9fc3RyaXBfYXQsCi0Jc3RyaXAgJ0AnIGNoYXJhY3RlcnMuCi0JKG1hY3JvX2V4cGFuZCk6IElmIG1hY3JvX3N0cmlwX2F0LCBjaGFuZ2UgTkFSRyB0byAkTkFSRy4KLQkoZGVsZXRlX21hY3JvKTogTmV3IGZ1bmN0aW9uLgotCShleHBhbmRfaXJwKTogU2tpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyAnIicgY2hhcmFjdGVycyBpZiBpcnBjLgotCSogbWFjcm8uaCAobWFjcm9faW5pdCk6IE1lbnRpb24gbmV3IHN0cmlwX2F0IHBhcmFtZXRlci4KLQkoZGVsZXRlX21hY3JvKTogRGVjbGFyZS4KLQkqIGFzLmMgKG1haW4pOiBJZiBUQ19JOTYwLCBwYXNzIGZsYWdfbXJpIHRvIG1hY3JvX2luaXQgYXMKLQlzdHJpcF9hdDsgb3RoZXJ3aXNlLCBwYXNzIDAuCi0JKiBnYXNwLmMgKHByb2Nlc3NfcHNldWRvX29wKTogUGFzcyAwIHRvIG1hY3JvX2luaXQgYXMgc3RyaXBfYXQuCi0JKG1haW4pOiBMaWtld2lzZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBpOTYwIE1SSSBtb2RlLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogTWVudGlvbiAtLWRlZnN5bS4KLQotVGh1IFNlcCAyOCAxOToyNTowNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFRyYW5zbGF0ZSAicG93ZXJwYyIgaW50byAicHBjIiwgcmVtb3ZlIGdlbiBvZgotCVZFUlNJT04sIG1vdmUgZ2VuIG9mICJjb25mIiBoZXJlIGZyb20gbWFrZWZpbGUuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBzZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlIFVuaXggbWFrZWZpbGUKLQlpbnRvIE1QVyBzeW50YXguCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogbWFjLWFzLnI6IE5ldyBmaWxlLCBNYWMgcmVzb3VyY2UgZmlsZS4KLQkqIGFzLmggKGlubGluZSk6IERvbid0IGRlY2lkZSBhYm91dCBkZWZpbmluZyBpZiBfX01XRVJLU19fLAotCXJlbW92ZSByZWR1bmRhbnQgY29uZGl0aW9uYWwgYW5kIGRlZmluaXRpb24uCi0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogRml4IHN5bnRheCBmb3IgT0JKX1BST0NFU1NfU1RBQi4KLQotVGh1IFNlcCAyOCAxNTo0MzoxNSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW1vdmVkIHNvbWUgVEVfUEUgc3BlY2lmaWMgCi0JbWFuaXB1bGF0aW9ucywgc2luY2UgSSBjYW4ndCBwcm92ZSB0aGV5J3JlIG5lZWRlZC4KLQkobWRfYmVnaW4pOiBSZW1vdmVkIGluaXRfcmVndGFibGUsIGluc2VydF9yZWcsIGFuZCB0aGUgY2FsbCBwb2ludHMuCi0JKHJlZ2lzdGVyX25hbWUpOiBOZXcgZnVuY3Rpb24uIFBhcnNlcyBhIHJlZ2lzdGVyIG5hbWUsIGlmIGFwcHJvcHJpYXRlLgotCShtZF9hc3NlbWJsZSk6IEFkZGVkIGNhbGwgdG8gcmVnaXN0ZXJfbmFtZSB0byBoYW5kbGUgc3ltYm9saWMgbmFtZXMuCi0JKHBwY19wZV9zZWN0aW9uKTogUmVtb3ZlZCBhbGwgZHVwbGljYXRlIElNQUdFIGRlZmluZXMsIGFuZCBpbmNsdWRlCi0JY29mZi9wZS5oIGluc3RlYWQuCi0KLVRodSBTZXAgMjggMTI6MDk6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lLgotCShwcGNfcGVfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfcGVfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBTZXAgMjggMDE6MTE6NTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgZm9yIGFybS1jb2ZmLgotCi1XZWQgU2VwIDI3IDEyOjUzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX0lTX0xPQ0FMKTogQWxsIHN5bWJvbHMgaW4gcmVnX3NlY3Rpb24gYXJlIGxvY2FsLgotCi0JKiBjb25maWcvdGMtcHBjLmggKE9CSl9YQ09GRik6IERlZmluZSBpZiBPQkpfQ09GRiBhbmQgbm90IFRFX1BFLgotCUNoYW5nZSBPQkpfQ09GRiBjaGVja3MgdG8gY2hlY2sgT0JKX1hDT0ZGIGluc3RlYWQuCi0JKFRBUkdFVF9GT1JNQVQpOiBGdWxseSBwYXJlbnRoZXNpemUuCi0JKExFWF9RTSk6IERlZmluZSBpZiBURV9QRS4KLQkqIGNvbmZpZy90Yy1wcGMuYzogUmVwbGFjZSBPQkpfQ09GRiBieSBPQkpfWENPRkYgdGhyb3VnaG91dC4KLQlSZW1vdmUgY2hlY2tzIG9mIFRFX1BFIHdpdGhpbiAjaWZkZWYgT0JKX1hDT0ZGIHNlY3Rpb25zLgotCShpbml0X3JlZ3RhYmxlKTogTWFrZSBpIHVuc2lnbmVkLgotCShwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbik6IFJlbmFtZSBmcm9tIHNldEN1cnJlbnRTZWN0aW9uLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuCi0JKHBwY19hcmNoKTogUmV0dXJuIGFmdGVyIGFzX2ZhdGFsIHRvIGF2b2lkIGdjYyB3YXJuaW5nLgotCShtZF9hc3NlbWJsZSk6IE9ubHkgZGVjbGFyZSByZWxvYyBpZiBPQkpfRUxGLiAgQWRkIGRlZmF1bHQgdG8KLQlzd2l0Y2ggb24gZml4dXBzW2ldLnJlbG9jIHRvIGF2b2lkIGdjYyB3YXJuaW5nLgotCShJTUFHRV9TR05fTE5LX09USEVSKTogRml4IG5lc3RlZCBjb21tZW50LgotCShwcGNfcGVfZnVuY3Rpb24pOiBEb24ndCBjYWxsIHBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUuCi0JKHBwY19mcm9iX3N5bWJvbCk6IFJlbW92ZSBURV9QRSBzZWN0aW9uIGNoZWNrcy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBSZXR1cm4gYWZ0ZXIgYWJvcnQgdG8gYXZvaWQgZ2NjCi0Jd2FybmluZy4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBCRkRfUkVMT0NfMTZfR09UX1BDUkVMIHRvIHN3aXRjaC4KLQkqIHJlYWQuYyAoTEVYX1FNKTogRGVmaW5lIGFzIDAgaWYgbm90IGRlZmluZWQuCi0JKGxleF90eXBlKTogVXNlIExFWF9RTSBmb3IgJz8nLgotCi0JKiBjb25maWd1cmUuaW46IE5vIG5lZWQgdG8gY2hlY2sgd2hldGhlciAke2NwdV90eXBlfSBpcyBwb3dlcnBjOwotCWl0IG5ldmVyIHdpbGwgYmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgMjcgMTE6MzM6MzggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW1vdmUgU2VwIDI2IGNoYW5nZXMgdG8gdGhpcwotCWZ1bmN0aW9uLCBrZWVwaW5nIG90aGVyIFNlcC4gMjYgY2hhbmdlcy4KLQotV2VkIFNlcCAyNyAxMDoyOToxMyAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGRlZCBzdXBwb3J0IGZvciBwcGNsZS0qLVtwZXx3aW5udF0KLQkodGFyZ2V0X2ZyYWcpOiBSZW1vdmVkIGFuIGV4dHJhbmVvdXMgUFBDIGRlZmluaXRpb24uCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBTYW1lCi0JKiBjb25maWcvdGMtcHBjLmg6Ci0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IEJhc2Ugc3VwcG9ydCBmb3IgbmV3IG9yIGFsdGVyZWQKLQlwc2V1ZG8gb3BzIC0gPHByZXZpb3VzLCBwZGF0YSwgeWRhdGEsIHJlbGRhdGEsIHJkYXRhLCB1YWxvbmcsIHpub3AsCi0Jc2VjdGlvbiwgY29tbSwgZnVuY3Rpb24+IFRoZXJlIHdpbGwgYmUgbW9yZS4KLQkocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogUHJlZGVmaW5lZCByZWcgdGFibGUgdG8gbmFtZSByZWdpc3RlcnMsIGV0YwotCShtZF9iZWdpbik6IFNldHVwIHJlZyB0YWJsZSBpbml0aWFsaXphdGlvbgotCShtZF9hc3NlbWJsZSk6IEluaXRpYWwgW3RvY114KHJ0b2MpIHN1cHBvcnQKLQkocHBjX2Zyb2JfbGFiZWwpOiBSZW1vdmVkIHNvbWUgeGNvZmYgc3BlY2lmaWMgcHJvY2Vzc2luZyBmcm9tIFRFX1BFCi0JKHBwY19mcm9iX3N5bWJvbCk6IFJlbW92ZWQgc29tZSB4Y29mZiBzcGVjaWZpYyBwcm9jZXNzaW5nIGZyb20gVEVfUEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIG1vcmUgcHJlZGVmaW5lZCBzZWN0aW9ucwotICAgICAgICAocHBjX2Zyb2Jfc2VjdGlvbik6IFJlbW92ZWQgc29tZSB4Y29mZiBzcGVjaWZpYyBwcm9jZXNzaW5nIGZyb20gVEVfUEUKLQkocHBjX2ZpeF9hZGp1c3RhYmxlKTogUmVtb3ZlZCBmcm9tIFRFX1BFIG1haW5saW5lCi0JKG1kX2FwcGx5X2ZpeDMpOiBGb3IgVEVfUEUgdG9jIGVudHJpZXMsIHdlIGRvbid0IG5lZWQgdG8gbWVzcyAKLSAgICAgICAgd2l0aCBmeF9hZGRudW1iZXIuIFJlbW92ZWQgZm9yIHRoZSB0aW1lIGJlaW5nLgotCShsb3RzKTogUHV0IGJhY2sgbWlzc2luZyBhc3NpZ25tZW50cyB0byBwcGNfY3VycmVudF9jc2VjdC4KLQotVHVlIFNlcCAyNiAxNDo1Nzo1OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBTdXBwb3J0IGFsbCBvZiB0aGUgVi40Ci0JcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfY29ucyk6IFJlbW92ZSByZXN0cmljdGlvbiB0aGF0IEAgc3VmZml4ZXMgbXVzdCBiZSBkb25lCi0Jd2l0aCAubG9uZy4gIEFkZCBlcnJvciBpZiByZWxvY2F0aW9uIGRvZXMgbm90IGZpdCBpbiB0aGUgbnVtYmVyIG9mCi0JYnl0ZXMgcHJvdmlkZWQuCi0JKG1kX2Fzc2VtYmxlKTogRm9yIGFic29sdXRlIGJyYW5jaGVzLCBtYXAgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMKLQliYWNrIGludG8gYW4gZXF1aXZhbGVudCBhYnNvbHV0ZSByZWxvY2F0aW9uLgotCShtZF9wY3JlbF9mcm9tKTogSWYgVENfRk9SQ0VfUkVMT0NBVElPTiBpcyB0cnVlLCByZWxvY2F0aW9uIG9mZnNldAotCWlzIDAsIG5vdCBzZWdtZW50IHN0YXJ0LgotCShtZF9hcHBseV9maXgzKTogRG9uJ3QgYm90aGVyIHdyaXRpbmcgYWRkZW5kIGludG8gdGhlIGluc3RydWN0aW9uLAotCXNpbmNlIGl0IGlzIGlnbm9yZWQsIGdpdmVuIHRoYXQgd2UgdXNlIFJFTEEgcmVsb2NhdGlvbnMgZm9yIEVMRi4KLQotCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lIHRvIGZvcmNlIGFsbAotCWJyYW5jaCBwcmVkaWN0aW9uIHJlbG9jYXRpb25zIHRvIGFsd2F5cyBiZSBlbWl0dGVkLgotCi1Nb24gU2VwIDI1IDE2OjA4OjQzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IExvd2VyIGNhc2UgcmVsb2MgYmVmb3JlCi0JdGVzdGluZy4KLQkobWRfYXNzZW1ibGUpOiBCZSBtb3JlIHJvYnVzdCBpbiB0ZXJtcyBvZiByZWxvY2F0aW9ucy4KLQkobWRfYXBwbHlfZml4Myk6IEFsbG93IDE0IGJpdCByZWxvY3MgdG8gYmUgZW1pdHRlZCBmb3IgZXh0ZXJuYWwKLQlzeW1ib2xzIGluIGFkZGl0aW9uIHRvIDI2IGJpdCByZWxvY3MuICBQcm9wZXJseSBpbnNlcnQgMjYvMTQgYml0Ci0JcmVsb2MgdmFsdWUgZmllbGRzIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbS4JCi0KLU1vbiBTZXAgMjUgMDA6MjM6MTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2F0b2YpOiBPdXRwdXQgbGl0dGxlIGVuZGlhbiBjb25zdGFudHMgaW4KLQlsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogUGFzcyAmdHlwZSwgbm90IHR5cGUsCi0Jc19tcmlfc2VjdC4KLQotCSogY29uZmlndXJlLmluOiBGaXggdHlwbzogZm10LWVsZiB0byBmbXQ9ZWxmLgotCi1GcmkgU2VwIDIyIDE2OjM0OjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IFJld3JpdGUgdG8gdXNlIGEgdGFibGUgb2YKLQlzdHJpbmdzIGFuZCByZWxvY2F0aW9ucyB0aGV5IHJlcHJlc2VudC4gIEFkZCBAYnJ7LG59dGFrZW4gZm9yCi0JYnJhbmNoIHRha2VuL25vdCB0YWtlbiBzdXBwb3J0LgotCShtZF9hcHBseV9maXgzKTogQWRkIEJGRF9SRUxPQ19QUENfQjE2X0JSeyxOfVRBS0VOIHN1cHBvcnQuCi0KLVRodSBTZXAgMjEgMjE6MTA6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogLW1yZWxvY2F0YWJsZS1saWIgbm93IG9ubHkKLQlzZXRzIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgYW5kIG5vdCBhbHNvIEVGX1BQQ19SRUxPQ0FUQUJMRS4KLQotVGh1IFNlcCAyMSAxNjozMDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldCk6IFBlcm1pdCBTRUdfQUJTT0xVVEUgaW4ga25vdyBleHByZXNzaW9uLgotCSogZXhwci5jIChleHByKTogQWNjb3VudCBmb3IgbmV3IG9wZXJhdG9yVCB2YWx1ZXMgaW4ga25vdwotCWV4cHJlc3Npb24uCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDbGVhciBmaXhwLT5meF9zdWJzeSBpZiB0aGUgcmVsb2NhdGlvbgotCWlzIGZ1bGx5IHJlc29sdmVkLgotCi1UaHUgU2VwIDIxIDE0OjExOjQ5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19mbGFncyk6IE5ldyB2YXJpYWJsZSB0byBob2xkIHRoZSBmbGFnIGJpdHMKLQl0byBzZXQgaW4gdGhlIEVMRiBoZWFkZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbXJlbG9jYXRhYmxlLWxpYi4gIE1ha2UgYm90aAotCS1tcmVsb2NhdGFibGUgYW5kIC1tcmVsb2NhdGFibGUtbGliIHNldCBwcGNfZmxhZ3MuCi0JKG1kX2JlZ2luKTogU2V0IEVMRiBmbGFncyB3aXRoIHBwY19mbGFncy4KLQotV2VkIFNlcCAyMCAxMzowMTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKLQlyZWFsY2xlYW4uICBBZGQgR05VIHN0YW5kYXJkIG1haW50YWluZXItY2xlYW4gZWNob3MuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgotCXJlYWxjbGVhbi4KLQotVHVlIFNlcCAxOSAxMTozMTozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgaW1tZWRpYXRlIG9wZXJhbmRzIGZvciAnJScuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgaW1tZWRpYXRlIG9wZXJhbmRzIGZvciAnfCcuCi0JUmVwbGFjZSAnUCcgd2l0aCAnMCcsICcxJywgYW5kICcyJy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAocGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IENoYW5nZSBsZWZ0c3RvcAotCWFuZCByaWdodHN0b3AgdG8gbm90IGJlIGNvbnN0LgotCShwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQpOiBMaWtld2lzZS4gIFVzZSBtNjhrX2lwX29wIHRvIGV4YW1pbmUKLQl0aGUgb3BlcmFuZCwgbm90IG02OGtfcmVnX3BhcnNlLgotCShzX21yaV9pZik6IEluIE1SSSBtb2RlLCBzdG9wIGF0IHRoZSBmaXJzdCAnKicuCi0JKHNfbXJpX3doaWxlKTogTGlrZXdpc2UuCi0JKHNfbXJpX2Vsc2UpOiBJbiBNUkkgbW9kZSwgaWdub3JlIHRyYWlsaW5nIGNoYXJhY3RlcnMuCi0JKHNfbXJpX2VuZGksIHNfbXJpX2JyZWFrLCBzX21yaV9uZXh0LCBzX21yaV9mb3IpOiBMaWtld2lzZS4KLQkoc19tcmlfZW5kZiwgc19tcmlfcmVwZWF0LCBzX21yaV91bnRpbCwgc19tcmlfZW5kdyk6IExpa2V3aXNlLgotCSogY29uZmlnL202OGstcGFyc2UueTogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmg6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0KLU1vbiBTZXAgMTggMTU6MjI6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2hhbmdlIGxlZnRzdGFydAotCWFuZCByaWdodHN0YXJ0IHRvIG5vdCBiZSBjb25zdC4KLQkocGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogTGlrZXdpc2UuICBJZiB0aGUgbGVmdCBzaWRlIG9mIHRoZQotCWNvbXBhcmlzb24gaXMgYSByZWdpc3RlciwgYW5kIHRoZSByaWdodCBzaWRlIGlzIG5vdCwgc3dhcCB0aGUgdHdvCi0Jc2lkZXMuCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtNjhrX3JlZ19wYXJzZSk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKG02OGtfcmVnX3BhcnNlKTogRGVjbGFyZS4KLQotCSogcmVhZC5jIChtcmlfY29tbWVudF9maWVsZCk6IE5ldyBmdW5jdGlvbi4KLQkobXJpX2NvbW1lbnRfZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzX2FsaWduX2J5dGVzKTogVXNlIG1yaV9jb21tZW50X2ZpZWxkLgotCShzX2FsaWduX3B0d28sIHNfY29tbSwgc19tcmlfY29tbW9uLCBzX2ZhaWwsIHNfZ2xvYmwpOiBMaWtld2lzZS4KLQkoc19mbG9hdF9zcGFjZSwgc19zdHJ1Y3QpOiBMaWtld2lzZS4KLQkoc19zcGFjZSk6IFVzZSBtcmlfY29tbWVudF9maWVsZCByYXRoZXIgdGhhbiBkb2luZyBpdCBieSBoYW5kLgotCShjb25zX3dvcmtlciwgZXF1YWxzKTogTGlrZXdpc2UuCi0JKHNfZW5kKTogSWdub3JlIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGggJyonIG9yICchJy4KLQkqIHJlYWQuaCAobXJpX2NvbW1lbnRfZmllbGQpOiBEZWNsYXJlLgotCShtcmlfY29tbWVudF9lbmQpOiBEZWNsYXJlLgotCSogY29uZC5jIChzX2lmKTogVXNlIG1yaV9jb21tZW50X2ZpZWxkLgotCSogY29uZmlnL3RjLW02OGsuYyAoc19jaGlwLCBzX3JlZyk6IExpa2V3aXNlLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSGFuZGxlIEFCUy1zeW0gaW4gLXN5bSBjYXNlIHJhdGhlciB0aGFuCi0Jc3ltLXN5bSBjYXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4gIFBlcm1pdCBuZWdhdGl2ZQotCXN5bWJvbHMgaWYgVENfTTY4Sy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2NvZmZfZml4MnJ0eXBlKTogSWYgZnhfdGNiaXQgaXMgc2V0LCByZXR1cm4KLQlSX1JFTExPTkdfTkVHLgotCSh0Y19nZW5fcmVsb2MpOiBJZiBmeF90Y2JpdCBpcyBzZXQsIGFib3J0LgotCShtZF9hcHBseV9maXhfMik6IEZvciBhIG5lZ2F0aXZlIHJlbG9jLCBtb3ZlIGZ4X3N1YnN5IHRvIGZ4X2FkZHN5LAotCWFuZCBzZXQgZnhfdGNiaXQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfcmVnKTogSWdub3JlIGNvbW1lbnQgZmllbGQgaW4gTVJJIG1vZGUuCi0KLU1vbiBTZXAgMTggMTQ6NDQ6MDQgMTk5NSAgQXJuZSBILiBKdXVsICA8YXJuZWpAcHZ2LnVuaXQubm8+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVN1biBTZXAgMTcgMjI6MTc6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbmRpYW4gdG8gbGl0dGxlIGZvciBtaXBzLSotdWx0cml4Ki4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIFNlcCAxNSAxMzoxNjo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoY3VycmVudF9sb2NhdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uICBIYW5kbGUgbWFnaWMKLQlzeW1ib2wgYC4nOyBpbiBhYnNvbHV0ZSBzZWN0aW9uLCByZXR1cm4gYSBjb25zdGFudC4KLQkob3BlcmFuZCk6IENhbGwgY3VycmVudF9sb2NhdGlvbiBmb3IgJy4nIGFuZCAnJCcsIGluc3RlYWQgb2YgZG9pbmcKLQlpdCBpbmxpbmUuICBJbiBNUkkgbW9kZSwgY2FsbCBjdXJyZW50X2xvY2F0aW9uIGZvciAnKicuCi0KLUZyaSBTZXAgMTUgMjE6Mzk6MjkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IENoYW5nZSBzb21lICJDT05TVCIgcmVmZXJlbmNlcyB0byAiY29uc3QiLgotCi1GcmkgU2VwIDE1IDE3OjI3OjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVHVlIFNlcCAxMiAxNzowODoyMyAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3N0YWJfcGFyc2UpOiBzaW1wbGlmeSBmaXJzdCBsb29wOwotCXVzZSBTX0dFVF9OQU1FL21vZGlmeS9TX1NFVF9OQU1FIHNlcXVlbmNlIGluc3RlYWQgb2YgYWJ1c2luZwotCVNfR0VUX05BTUUgd2hlbiB1cGRhdGluZyBzeW1ib2wgbmFtZS4KLQkobG9jYWxfc3ltYm9sc19EU1QpOiBmaXJzdCBwcmVmaXgvcG9zdGZpeCB0eXBvIGZyb20gSnVseSAyMXN0LgotCVtwbHVzIGNvbW1lbnQgcmVmb3JtYXR0aW5nIC0ta3JdCi0KLVdlZCBTZXAgMTMgMTI6MzM6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhQRUNUKTogTmV3IHZhcmlhYmxlLgotCShDSEVDS0ZMQUdTKTogUmVtb3ZlLgotCShzaXRlLmV4cCk6IE5ldyB0YXJnZXQuCi0JKGNoZWNrKTogUmV3cml0ZSB0byBpbnZva2UgcnVudGVzdCBkaXJlY3RseSwgcmF0aGVyIHRoYW4gcmVjdXJyaW5nCi0JZG93biBpbnRvIHRlc3RzdWl0ZS4KLQkoY2xlYW4taGVyZSk6IFJlbW92ZSB0ZXN0c3VpdGUgZGlyZWN0b3J5LgotCShjbGVhbiwgZGlzdGNsZWFuKTogRG9uJ3QgcmVjdXIgaW50byB0ZXN0c3VpdGUuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNhbGwgQUNfQ09ORklHX1NVQkRJUlModGVzdHN1aXRlKS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQ2hhbmdlIHRvIHRoZSBzZWdtZW50IHdlIGFyZQotCXJlbGF4aW5nLCBpbiBjYXNlIG1kX2NvbnZlcnRfZnJhZywgY2FsbGVkIGJ5IGN2dF9mcmFnX3RvX2ZpbGwsCi0Jd2FudHMgdG8gY2FsbCBmaXhfbmV3LgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFBlcm1pdCBQQyByZWxhdGl2ZSBjb2RlIGlmIHRoZQotCXNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpcyB0aGUgY3VycmVudCBzZWdtZW50LCBub3QganVzdCBpbgotCXRleHRfc2VjdGlvbi4KLQkobWRfY29udmVydF9mcmFnXzEpOiBEb24ndCBjYWxsIHN1YnNlZ19jaGFuZ2UuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0KLVR1ZSBTZXAgMTIgMTA6MzY6NDAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hdG9mKTogRml4IGRlYnVnZ2luZyBwcmludGYsIGFuZCBsZWF2ZSBpdAotCW91dCBieSBkZWZhdWx0LgotCi1Nb24gU2VwIDExIDExOjM5OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2NvbmZpZ3VyZS5pbjogUmVtb3ZlIHVudXNlZCBmaWxlLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBHcmFiIGFsbCBhdmFpbGFibGUgc3BhY2VzIGF0IHN0YXJ0IG9mCi0JbGluZSBiZWZvcmUgcHJlc2VydmluZyBhIHNpbmdsZSBzcGFjZS4gIFJlbW92ZSBzdGF0ZSA9PSAwIHRlc3QKLQl3aGljaCB3aWxsIG5ldmVyIHN1Y2NlZWQuCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IERlbGV0ZSBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUKLQlmb3JtYWwgaGFzaCB0YWJsZS4KLQkobWFjcm9fZXhwYW5kKTogSW4gTVJJIG1vZGUsIHN0b3Agd2hlbiB3aGl0ZXNwYWNlIGlzIHNlZW4gaW4gdGhlCi0JYXJndW1lbnQgbGlzdC4KLQotCSogc2IuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCSogbWFjcm8uYzogTGlrZXdpc2UuICBBbHNvIGluY2x1ZGUgPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuCi0KLUZyaSBTZXAgIDggMDA6Mjc6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJbiBNUkkgbW9kZSwga2VlcCBhIHNwYWNlIGJlZm9yZSBhCi0JcG9zc2libGUgY29tbWVudCBjaGFyYWN0ZXIuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSW4gTVJJIG1vZGUsIGlnbm9yZSBhbnl0aGluZyBhZnRlcgotCWFuIGluc3RydWN0aW9uIHdoaWNoIHRha2VzIG5vIG9wZXJhbmRzLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgZ2FzcCBpbiAkKHRvb2xkaXIpLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEhhbmRsZSBhIG5vbiB6ZXJvIGJhc2UgcmVnaXN0ZXIgZm9yCi0JTV9Ve0wsU317RCxXLEh9X0EuCi0KLQkqIGdhc3AuYyAoc2hvd191c2FnZSk6IFB1dCBwcm9ncmFtX25hbWUgYXJndW1lbnQgaW4gZmlyc3QgZnByaW50ZiwKLQlub3Qgc2Vjb25kLgotCi1UaHUgU2VwICA3IDEyOjMzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSGFuZGxlIDA4IGFuZCAwOSBpbiBNUkkgbW9kZS4KLQkqIG1hY3JvLmMgKElTU0VQKTogUmVtb3ZlIGR1cGxpY2F0ZWQgYCInIGNoYXJhY3Rlci4KLSAJKGdldF9hbnlfc3RyaW5nKTogQ29weSBzb21lIGNoYXJhY3RlcnMgZm9yIHdoaWNoIElTU0VQIGlzIHRydWU6Ci0JJzsnLCAnPicsICcoJywgJyknLiAgT3RoZXJ3aXNlIHdlIGNhbiBnZXQgaW4gYW4gaW5maW5pdGUgbG9vcC4KLQkqIHJlYWQuYyAoc19zcGFjZSk6IEluIE1SSSBtb2RlLCB0aGUgZXhwcmVzc2lvbnMgc3RvcCBhdCB0aGUgZmlyc3QKLQl1bnF1b3RlZCBzcGFjZS4KLQkoY29uc193b3JrZXIpOiBJbiBNUkkgbW9kZSwgcmVzdG9yZSB0aGUgdGVybWluYXRpbmcgY2hhcmFjdGVyIGF0Ci0JdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi0KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBEb24ndCB1c2UgI2VsaWY7IG9sZCBjb21waWxlcnMgZG9uJ3QKLQlzdXBwb3J0IGl0LgotCi1XZWQgU2VwICA2IDIxOjEzOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSW4gTVJJIG1vZGUsIHNpbGVudGx5IGVuZCBxdW90ZWQgc3RyaW5ncwotCWF0IG5ld2xpbmUgY2hhcmFjdGVycy4gIEluIE1SSSBtb2RlLCBhbHdheXMga2VlcCBzcGFjZXMgaW4gdGhlCi0Jb3BlcmFuZHMgZmllbGQuICBJbiBNUkkgbW9kZSwgdHJlYXQgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIGFzIGEKLQlyZWd1bGFyIGNvbW1lbnQgY2hhcmFjdGVyIGZvbGxvd2luZyBhIHNwYWNlLgotCSogY29uZC5jIChpZ25vcmVfaW5wdXQpOiBVc2Ugc3RybmNhc2VjbXAgcmF0aGVyIHRoYW4gc3RybmNtcCB3aGVuCi0JbG9va2luZyBmb3Igc3BlY2lhbCBwc2V1ZG8tb3BzLgotCSogcmVhZC5jIChjb25zX3dvcmtlcik6IEluIE1SSSBtb2RlLCB0aGUgZXhwcmVzc2lvbnMgc3RvcCBhdCB0aGUKLQlmaXJzdCB1bnF1b3RlZCBzcGFjZS4KLQkoZXF1YWxzKTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgIDYgMTU6MDM6NTMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoZ2V0X29wZXJhbmRzKTogUmVhZCB0aGlyZCBhcmcgaWYgaXQgZXhpc3RzLgotCU90aGVyd2lzZSwgY2xlYXIgaXQuCi0JKGdldF9zcGVjaWZpYywgY2FzZSBGX0ZSMCk6IEFkZC4KLQotV2VkIFNlcCAgNiAxNTowMzo1MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChnZXRfc3BlY2lmaWMpOiBEZWxldGUgYXJnX3RvX3Rlc3QuCi0JKG1kX2Fzc2VtYmxlKTogSW5jcmVhc2Ugb3BlcmFuZCBhcnJheSBmcm9tIDIgdG8gMy4KLQotVHVlIFNlcCAgNSAxNjo0NzozNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlbW92ZSBDWUdOVVMgTE9DQUwgY29tbWVudHMuCi0JKG1kX2JlZ2luKTogVXNlIDAvMSBpbnN0ZWFkIG9mIFRSVUUvRkFMU0UuCi0JKG1kX3Nob3dfdXNhZ2UpOiBCcmVhayB1cCBsb25nIGZvcm1hdCBzdHJpbmcgZm9yIHRoZSBiZW5lZml0Ci0Jb2YgbGFtZSBjb21waWxlcnMuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zaG93X3VzYWdlKTogRGl0dG8uCi0JKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBEaXR0by4KLQkqIG1hY3JvLmMgKGNoZWNrX21hY3JvKTogQ2FzdCByZXN1bHQgb2YgaGFzaF9maW5kLgotCi1UdWUgU2VwICA1IDE0OjQ2OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFdoZW4gdGVzdGluZyBmb3IgYSBmcmVlKCkgZGVjbGFyYXRpb24gaW4gc3lzdGVtCi0JaGVhZGVyIGZpbGVzLCBjYXN0IHRoZSBhZGRyZXNzIHRvIGEgZnVuY3Rpb24gcG9pbnRlciwgbm90IHRvIGFuCi0JaW50ZWdlci4KLQotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IENhbGwgVENfSU5JVF9GSVhfREFUQSBpZiBUQ19GSVhfVFlQRQotCWlzIGRlZmluZWQuICBEb24ndCBpbml0aWFsaXplIGZ4X2Jzci4gIFZlcmlmeSB0aGF0IGZ4X3NpemUgZmllbGQKLQlpcyB3aWRlIGVub3VnaCB0byBob2xkIHN0b3JlZCB2YWx1ZS4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBDaGFuZ2UgdGNfZml4X2RhdGEgdG8gdHlwZSBUQ19GSVhfVFlQRSBpZgotCXRoYXQgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIG9taXQgaXQuICBEZWxldGUgZnhfYnNyLiAgQ2hhbmdlCi0JZnhfc2l6ZSB0byB1bnNpZ25lZCBjaGFyLgotCSogY29uZmlnL3RjLWk5NjAuaCAoVENfRklYX1RZUEUsIGZ4X2JzciwgVENfSU5JVF9GSVhfREFUQSk6IE5ldwotCW1hY3Jvcy4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChUQ19GSVhfVFlQRSwgZnhfYnNyLCBUQ19JTklUX0ZJWF9EQVRBKTogTmV3Ci0JbWFjcm9zLgotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfRklYX1RZUEUpOiBEZWZpbmUgYXMgUFRSLgotCi0JKiBjb25maWcvdGMtaTg2MC5jIChtZF9hcHBseV9maXgpOiBEZWxldGUgY29kZSBmb3IgY2hlY2tpbmcKLQlmeF9pbV9kaXNwLCBhbmQgZm9yIGhhbmRsaW5nIG5vbi16ZXJvIHZhbHVlcywgc2luY2UgaXQgbmV2ZXIgZ2V0cwotCXNldCBhZnRlciBiZWluZyBpbml0aWFsaXplZCB0byB6ZXJvLgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogTWFrZSBmeF9pbV9kaXNwIGFsd2F5cyAyIGJpdHMsIHNpbmNlIHRoZQotCW9ubHkgdGMtKiBmaWxlcyBhY3R1YWxseSB1c2luZyBpdCBuZWVkIHRoYXQgbXVjaC4KLQotCU5TMzJLIGNoYW5nZXMgZnJvbSBJYW4gRGFsbDoKLQkqIGNvbmZpZ3VyZS5pbjogVHJlYXQgbnMzMmstcGM1MzItdXgqIGxpa2UgbnMzMmstcGM1MzItbWFjaCosIGFuZAotCW5zMzJrLXBjNTMyLWxpdGVzKiBsaWtlIG5zMzJrLXBjNTMyLW5ldGJzZCouCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lIHRvIDEuCi0KLUZyaSBTZXAgIDEgMTc6MDI6MTUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEdldCBUQ19GT1JDRV9SRUxPQ0FUSU9OIHVwIHRoZQotCXJpZ2h0IHdheSEKLQotRnJpIFNlcCAgMSAwODoyMDoxOSAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBiZWF1dHkuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbiwgbWRfYmVnaW4sIG1kX3Nob3dfdXNhZ2UpOgotCUFkZCBzdXBwb3J0IGZvciAiLW1jcHU9dnI0MzAwIiBhcyBwcm9jZXNzb3IgaWRlbnRpZmllci4KLQotVGh1IEF1ZyAzMSAxNjo0MTowNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogUmVtb3ZlIGNoYW5nZSBvZiAyOXRoLgotCSogY29uZmlnL3RjLXtpMzg2LGFybX0uaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IEtlZXAgUlZBIHJlbG9jcy4KLQotVHVlIEF1ZyAyOSAxOTo0Mjo1OCAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCkgW2Nhc2UgUE9TVC9QUkUvQkFTRV06IEZpeCB0eXBvIHdoZW4KLSAJbG9va2luZyBhdCBvdXRlciBkaXNwbGFjZW1lbnQuICBEb24ndCBzZXQgdGhlIHBvc3RpbmRleCBiaXQgaWYgdGhlCi0gCWluZGV4IHN1cHByZXNzIGJpdCBpcyBzZXQgKGZvciBtZW1vcnkgaW5kaXJlY3QgYWRkcmVzc2luZyBtb2RlKS4KLQotVGh1IEF1ZyAzMSAwNjo0OTozNyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRjX2dlbl9yZWxvYyk6IERlbGV0ZSBkdXBsaWNhdGVkIGNvZGUuCi0KLVdlZCBBdWcgMzAgMjM6NTE6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBGcmVlIHNhdmVkX2lucHV0IHdoZW4gdGhlIGZyb20gYnVmZmVyCi0JZXhhY3RseSBmaWxscyB0aGUgdG8gYnVmZmVyLgotCi1XZWQgQXVnIDMwIDEzOjQ2OjM5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChwYXJzZV9rZXl3b3JkX2FyZywgcGFyc2VfY29uc3RfZXhwcl9hcmcpOiBOZXcgZm5zLgotCShzcGFyY19pcCk6IENhbGwgdGhlbSBmb3IgYXNpLCBtZW1iYXIsIGFuZCBwcmVmZXRjaCBwYXJzaW5nLgotCi1UdWUgQXVnIDI5IDE1OjQ1OjM3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZW1iYXJfbWFza3MpOiBEZWxldGVkLgotCShzcGFyY19pcCk6IENsZWFuIHVwIEFTSSBhbmQgbWVtYmFyIHN1cHBvcnQuCi0KLVR1ZSBBdWcgMjkgMTM6MjA6MjcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogUnZhIGlzIG5ldyBlbnRyeS4KLQkoY29uc193b3JrZXIpOiBOZXcsIHNwbGl0IGZyb20gY29ucy4gIEhhbmRsZXMgcnZhLgotCShjb25zLCBzX3J2YSk6IENhbGwgY29uc193b3JrZXIuCi0JKiByZWFkLmggKHNfcnZhKTogTmV3IGRlY2xhcmF0aW9uLgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IHRocm93IGF3YXkgcnZhIHJlbG9jcy4KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4LCB0Y19nZW5fcmVsb2MpOiBIYW5kbGUgUlZBLgotCSogY29uZmlnL3RjLWkzODYuYyAodGNfY29mZl9maXgydHlwZSk6IEhhbmRsZSBSVkEuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19DT1VOVF9SRUxPQyk6IFJlbWVtYmVyIFJWQXMuCi0JKFRDX1JWQV9SRUxPQyk6IE5ldyBkZWZpbml0aW9uLgotCi1TdW4gQXVnIDI3IDE3OjQxOjA1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fc3dpKTogQWxsb3cgb3B0aW9uYWwgbGVhZGluZyAnIycuCi0KLVNhdCBBdWcgMjYgMTc6MjQ6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKTogSWYgVEVfREVMVEEgaXMgZGVmaW5lZCwKLQlpbmNsdWRlICcjJy4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKE5PX1BTRVVET19ET1QpOiBEZWZpbmUgaWYgVEVfREVMVEEgaXMKLQlkZWZpbmVkLgotCi0JKiBjb25maWcvdGUtZGVsdGEuaDogSW5jbHVkZSBvYmotZm9ybWF0LmguCi0JKiBjb25maWcvdGUtc2NvMzg2Lmg6IExpa2V3aXNlLgotCSogY29uZmlnL3RlLXN5c3YzMi5oOiBMaWtld2lzZS4KLQotCSogYXBwLmMgKHNjcnViX2ZpbGUpOiBSZW1vdmUuCi0JKHNjcnViX2Zyb21fZmlsZSwgc2NydWJfdG9fZmlsZSk6IFJlbW92ZS4KLQkoc2NydWJfc3RyaW5nLCBzY3J1Yl9sYXN0X3N0cmluZyk6IFJlbW92ZS4KLQkoc2NydWJfZnJvbV9zdHJpbmcsIHNjcnViX3RvX3N0cmluZyk6IFJlbW92ZS4KLQkoc2F2ZWRfaW5wdXQsIHNhdmVkX2lucHV0X2xlbik6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3QgYXBwX3NhdmVkKTogUmVtb3ZlIHNjcnViX3N0cmluZywgc2NydWJfbGFzdF9zdHJpbmcsIGFuZAotCXNjcnViX2ZpbGUgZmllbGRzLiAgQWRkIHNhdmVkX2lucHV0IGFuZCBzYXZlZF9pbnB1dF9sZW4gZmllbGRzLgotCShhcHBfcHVzaCk6IEFkanVzdCBzYXZlZCBmaWVsZHMgZm9yIGNoYW5nZXMgaW4gc3RydWN0IGFwcF9zYXZlLgotCUluaXRpYWxpemUgc3RhdGUgYW5kIHNhdmVkX2lucHV0LgotCShhcHBfcG9wKTogQWRqdXN0IHNhdmVkIGZpZWxkcyBmb3IgY2hhbmdlcyBpbiBzdHJ1Y3QgYXBwX3NhdmUuCi0JKGRvX3NjcnViX2NoYXJzKTogUmVuYW1lIGZyb20gZG9fc2NydWJfbmV4dF9jaGFyIGFuZCByZXdyaXRlIHRvCi0JcHJvY2VzcyBhIGJ1ZmZlciBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gYSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgotCShtYWluLCBhc193YXJuKTogUmVtb3ZlIG9ic29sZXRlIHRlc3RpbmcgY29kZS4KLQkqIGFzLmggKGRvX3NjcnViX25leHRfY2hhcik6IERvbid0IGRlY2xhcmUuCi0JKGRvX3NjcnViX2NoYXJzKTogRGVjbGFyZS4KLQkoc2NydWJfZnJvbV9maWxlLCBzY3J1Yl9mcm9tX3N0cmluZyk6IERvbid0IGRlY2xhcmUuCi0JKHNjcnViX3RvX2ZpbGUsIHNjcnViX3RvX3N0cmluZyk6IERvbid0IGRlY2xhcmUuCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfZ2V0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKTogQ2FsbCBkb19zY3J1Yl9jaGFycyByYXRoZXIgdGhhbgotCWRvX3NjcnViX25leHRfY2hhci4KLQkqIHJlYWQuYyAoc2NydWJfc3RyaW5nLCBzY3J1Yl9zdHJpbmdfZW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHNjcnViX2Zyb21fc3RyaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCBkb19zY3J1Yl9jaGFycyByYXRoZXIgdGhhbgotCWRvX3NjcnViX25leHRfY2hhci4KLQotVGh1IEF1ZyAyNCAxODo1MDoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAoYXNfYWJvcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBzYi5jIChzYl9idWlsZCk6IFJldmVydCB5ZXN0ZXJkYXkncyBwYXRjaC4KLQotCSogTWFrZWZpbGUuaW4gKGdhc3AubmV3KTogRGVwZW5kIHVwb24gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hLgotCUp1c3QgbGluayBhZ2FpbnN0IGxpYmliZXJ0eSwgbm90IGFnYWluc3QgJChMSUJTKS4KLQotV2VkIEF1ZyAyMyAxNToxODoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNiLmMgKHNiX2J1aWxkKTogVW5kZWZpbmUgYWJvcnQgYmVmb3JlIGNhbGxpbmcgaXQsIHNpbmNlIGdhc3AKLQlkb2VzIG5vdCBwcm92aWRlIGFzX2Fib3J0LgotCi1XZWQgQXVnIDIzIDEwOjQwOjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChzZXRfdGFyZ2V0X2VuZGlhbik6IE5ldyBzdGF0aWMgdG8gc2F5IHdoZXRoZXIKLQl3ZSd2ZSBpbml0aWFsaXplZCB0YXJnZXRfYmlnX2VuZGlhbiBvciBub3QuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBzZXRfdGFyZ2V0X2VuZGlhbiBpZiB3ZSBzZXQgdGhlIHZhcmlhYmxlCi0JdGFyZ2V0X2JpZ19lbmRpYW4uCi0JKG1kX2JlZ2luKTogT25seSBzZXQgdGFyZ2V0X2JpZ19lbmRpYW4gaWYgIXNldF90YXJnZXRfZW5kaWFuLgotCi1UdWUgQXVnIDIyIDAzOjAwOjMzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVNhdCBBdWcgMTkgMTg6MDg6MTYgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmggKERTVF9TX0NfU1JDX1NFVFJFQ19XLCBEU1RfU19DX1NSQ19ERUZMSU5FU19CKToKLQlOZXcgbWFjcm9zLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uLAotCVZNU19UQlRfU291cmNlX0xpbmVzKTogTWFrZSB0cmFjZWJhY2sgaW5mbyBiZSByb2J1c3QgZW5vdWdoIHRvCi0JaGFuZGxlIGh1Z2Ugc291cmNlIGZpbGVzLgotCShWTVNfVEJUX1NvdXJjZV9GaWxlKTogUmVvcmdhbml6ZSB0aGUgbmF0aXZlLSB2cyBjcm9zcy1hc3NlbWJseQotCXN1cHBvcnQgc28gdGhhdCBhY3R1YWwgb2JqZWN0IGZpbGUgb3V0cHV0IGlzIGNsZWFyZXIuCi0JKFZNU19UQlRfU291cmNlX0ZpbGU6IEZhYiwgTmFtLCBEYXRlX1hhYiwgRmlsZV9IZWFkZXJfWGFiKToKLQlSZXBsYWNlIHN0YXRpYyB2YXJpYWJsZXMgd2l0aCBhdXRvbWF0aWMgb25lcy4KLQotCVNhdCBBdWcgMTIgMjA6MTg6MTUgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKE1vZHVsZV9OYW1lKTogbmV3IGZpbGUgc2NvcGUgdmFyaWFibGUuCi0JKFZNU19UQlRfTW9kdWxlX0JlZ2luKTogdXNlIGl0IGluc3RlYWQgb2YgbG9jYWwgdmFyaWFibGUuCi0JKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6IGRpdHRvOyBhc3NpZ24gaXRzIHZhbHVlIGhlcmUuCi0JKFdyaXRlX1ZNU19FT01fUmVjb3JkKTogc2Vjb25kIGFyZ3VtZW50IGhhcyB0eXBlIHZhbHVlVC4KLQkoVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSk6ICBzaW1wbGlmeSBzZWFyY2ggbG9vcDsgcmV0dXJuCi0JdHlwZSBpcyBvZmZzZXRUOyBzZWNvbmQgYXJndW1lbnQgaXMgdW5zaWduZWQuCi0KLQlTYXQgSnVuIDE3IDE5OjA1OjI1IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBtZXNzYWdlcy5jIChhc19wZXJyb3IpOiBVc2UgeHN0cmVycm9yIGluc3RlYWQgb2Ygc3RyZXJyb3IuCi0KLU1vbiBBdWcgMjEgMTM6NTc6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWNjZXB0IC0tZGVmc3ltIFNZTT1WQUxVRS4KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYXMuMTogRG9jdW1lbnQgLS1kZWZzeW0uCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSW4gTVJJIG1vZGUsIGRvbid0IGVuZCB0aGUKLQlzdGF0ZW1lbnQgaW5zaWRlIGEgcXVvdGF0aW9uLgotCShzX3NwYWNlKTogRG9uJ3Qgd2FybiBhYm91dCBhIHplcm8gcmVwZWF0IGNvdW50IGluIE1SSSBtb2RlLgotCSogY29uZmlnL3RjLW02OGsuYyAoY3JhY2tfb3BlcmFuZCk6IEluIE1SSSBtb2RlLCBkb24ndCBjb3VudAotCXBhcmVudGhlc2VzIGluc2lkZSBxdW90ZXMuCi0JKG1kX2Fzc2VtYmxlKTogSW4gTVJJIG1vZGUsIGFueXRoaW5nIGFmdGVyIHRoZSBvcGVyYW5kcyBmaWVsZCBpcyBhCi0JY29tbWVudC4KLQkocGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IEFkanVzdCBzdGFydCBhbmQgc3RvcCB0byByZW1vdmUKLQlzcGFjZXMuCi0JKHNfbXJpX2Zvcik6IExpa2V3aXNlLgotCi0JKiBjb25kLmMgKHNfaWZkZWYpOiBSZXN0b3JlIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHN5bWJvbCBuYW1lLAotCWluIGNhc2UgaXQgaXMgYSBuZXdsaW5lLgotCShzX2lmKTogSWYgaWdub3JpbmcgdGhlIGN1cnJlbnQgdHJlZSwgZG9uJ3QgdHJ5IHRvIHBhcnNlIHRoZQotCWV4cHJlc3Npb24uCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBMRVhfSVNfU1RSSU5HUVVPVEUgb3IKLQlMRVhfSVNfT05FQ0hBUl9RVU9URSBpcyBzZWVuIGluCXN0YXRlIDEwLCBwcmVzZXJ2ZSBvbmUgc3BhY2UuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBpcnAsIGlycGMsIG1hY3JvLCBhbmQgcmVwdC4gTVJJIG1vZGUKLQlub3cgc3VwcG9ydHMgbWFjcm9zLCBpZmMsIGlmbmMsIGlycCwgaXJwYywgcmVwdCwgYW5kIGVuZHIsIHdpdGhvdXQKLQl1c2luZyBnYXNwLgotCi0JQWRkIHN1cHBvcnQgZm9yIG1hY3Jvcy4KLQkqIGFzLmM6IEluY2x1ZGUgc2IuaCBhbmQgbWFjcm8uaC4KLQkobWF4X21hY3JvX25leHQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShtYWluKTogQ2FsbCBtYWNyb19pbml0LgotCShtYWNyb19leHByKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGFzLmggKG1heF9tYWNyb19uZXN0KTogRGVjbGFyZS4KLQkqIHJlYWQuYyAobGluZV9sYWJlbCk6IFJlbmFtZSBmcm9tIG1yaV9saW5lX2xhYmVsLiAgQ2hhbmdlIGFsbAotCXVzZXMuCi0JKHBvdGFibGUpOiBBZGQgZXhpdG0sIGlycCwgaXJwYywgbWFjcm8sIG1leGl0LCByZXB0LgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBBbHdheXMgY2xlYXIgbGluZV9sYWJlbCBhdCB0aGUgc3RhcnQgb2YgYQotCWxpbmUsIG5vdCBqdXN0IHdoZW4gZmxhZ19tcmkgb3IgTEFCRUxTX1dJVEhPVVRfQ09MT05TLiAgRml4Ci0JTVJJL0xBQkVMU19XSVRIT1VUX0NPTE9OUyBoYW5kbGluZy4gIEluIE1SSSBtb2RlLCBwZXJtaXQgbGFiZWw6Ci0JZXF1IHZhbC4gIFNldCBsaW5lX2xhYmVsIHdoZW4gY2FsbGluZyBjb2xvbi4gIEluIE1SSSBtb2RlLCBhCi0JbGVhZGluZyAnLicgZG9lcyBub3QgaW1wbHkgYSBwc2V1ZG8tb3AuICBDaGVjayBmb3IgbWFjcm8gZXhwYW5zaW9uCi0JYmVmb3JlIGNhbGxpbmcgbWRfYXNzZW1ibGUuCi0JKHNfaXJwKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfbGluZV9zYik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfbWFjcm8pOiBOZXcgZnVuY3Rpb24uCi0JKHNfbWV4aXQpOiBOZXcgZnVuY3Rpb24uCi0JKHNfcmVwdCk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAobGluZV9sYWJlbCk6IFJlbmFtZSBmcm9tIG1yaV9saW5lX2xhYmVsLgotCShzX2lycCwgc19yZXB0KTogRGVjbGFyZS4KLQkoc19tYWNybywgc19tZXhpdCk6IERlY2xhcmUuCi0JKiBpbnB1dC1zY3J1Yi5jOiBJbmNsdWRlIHNiLmguCi0JKHNiX2luZGV4LCBmcm9tX3NiKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1hY3JvX25lc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzdHJ1Y3QgaW5wdXRfc2F2ZSk6IEFkZCBzYl9pbmRleCBhbmQgZnJvbV9zYiBmaWVsZHMuICBDaGFuZ2UKLQluZXh0X3NhdmVkX2ZpbGUgZmllbGQgdG8gYmUgc3RydWN0IGlucHV0X3NhdmUgKi4KLQkobmV4dF9zYXZlZF9maWxlKTogQ2hhbmdlZCB0byBiZSBzdHJ1Y3QgaW5wdXRfc2F2ZSAqLgotCShpbnB1dF9zY3J1Yl9wdXNoKTogQ2hhbmdlIHRvIHJldHVybiB0eXBlIHN0cnVjdCBpbnB1dF9zYXZlICouCi0JU2F2ZSBzYl9pbmRleCBhbmQgZnJvbV9zYi4KLQkoaW5wdXRfc2NydWJfcG9wKTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlIHRvIHN0cnVjdCBpbnB1dF9zYXZlICouCi0JUmVzdG9yZSBzYl9pbmRleCBhbmQgZnJvbV9zYi4KLQkoaW5wdXRfc2NydWJfaW5jbHVkZV9zYik6IE5ldyBmdW5jdGlvbi4KLQkoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBIYW5kbGUgcmVhZGluZyBmcm9tIGZyb21fc2IuCi0JKGJ1bXBfbGluZV9jb3VudGVycyk6IE9ubHkgaW5jcmVtZW50IGxpbmVzIGlmIG5vdCB1c2luZyBmcm9tX3NiLgotCSogY29uZmlnL3RjLW02OGsuYyAob3B0X3RhYmxlKTogQWRkIG5lc3QuCi0JKG9wdF9uZXN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGdhc3AuYzogSW5jbHVkZSBzYi5oIGFuZCBtYWNyby5oLiAgTW92ZSBhbGwgc2IgcmVsYXRlZCBmdW5jdGlvbnMKLQlhbmQgZGVmaW5pdGlvbnMgdG8gc2IuaCBhbmQgc2IuYy4gIE1vdmUgYWxsIG1hY3JvIHJlbGF0ZWQKLQlmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIHRvIG1hY3JvLmggYW5kIG1hY3JvLmMuCi0JKiBzYi5oLCBzYi5jOiBOZXcgZmlsZXMsIGV4dHJhY3RlZCBmcm9tIGdhc3AuYy4KLQkqIG1hY3JvLmgsIG1hY3JvLmM6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKE9CSlMpOiBBZGQgc2IubyBhbmQgbWFjcm8ubwotCShHQVNQT0JKUyk6IERlZmluZS4KLQkoZ2FzcC5uZXcpOiBEZXBlbmQgdXBvbiAkKEdBU1BPQkpTKS4gIFVzZSAkKEdBU1BPQkpTKSB0byBsaW5rLgotCShUQVJHX0NQVV9ERVBfbTY4ayk6IERlcGVuZCB1cG9uIHN1YnNlZ3MuaC4KLQkoZ2FzcC5vKTogRGVwZW5kIHVwb24gc2IuaCBhbmQgbWFjcm8uaC4KLQkoc2Iubyk6IE5ldyB0YXJnZXQuCi0JKG1hY3JvLm8pOiBOZXcgdGFyZ2V0LgotCShhcy5vKTogRGVwZW5kIHVwb24gc2IuaCBhbmQgbWFjcm8uaC4KLQkoaW5wdXQtc2NydWIubyk6IERlcGVuZCB1cG9uIHNiLmguCi0JKHJlYWQubyk6IERlcGVuZCB1cG9uIHNiLmggYW5kIG1hY3JvLmguCi0KLQkqIGNvbmQuYyAoZ2V0X21yaV9zdHJpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX2lmYyk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBpZmMgYW5kIGlmbmMuCi0JKiByZWFkLmggKHNfaWZjKTogRGVjbGFyZS4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogSW4gTVJJIG1vZGUsIHNldCBsZXggb2YgJyB0bwotCUxFWF9JU19TVFJJTkdRVU9URS4KLQotTW9uIEF1ZyAyMSAxMzo0MTozMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IEFsbG93IEBIQSwgQEwsIGFuZCBASCBzdWZmaXhlcyBvbgotCWNvbnN0YW50IGV4cHJlc3Npb25zLgotCi1TdW4gQXVnIDIwIDE1OjU0OjM3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9yZWxvY19zaXplKTogQWRkIGNvbnN0IHRvIGRlY2xhcmF0aW9uLgotCi1GcmkgQXVnIDE4IDEwOjU4OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2luY2x1ZGUpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgZXhwZWN0IHF1b3RlcyBhcm91bmQgdGhlCi0JZmlsZSBuYW1lLgotCSogbGlzdGluZy5jIChsaXN0aW5nX3RpdGxlKTogRG9uJ3QgcmVxdWlyZSB0aGUgdGl0bGUgdG8gYmUgcXVvdGVkLgotCi0JKiBnYXNwLmMgKGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSk6IEFsd2F5cyBzdWJ0cmFjdCAxIGZyb20KLQlsaW5lY291bnQgYmVmb3JlIHByaW50aW5nIGl0LgotCShwcm9jZXNzX2ZpbGUpOiBJbiBNUkkgbW9kZSwgbGluZXMgYmVnaW5uaW5nIHdpdGggJyonIG9yICchJyBhcmUKLQljb21tZW50cy4KLQkoZG9fcmVnKTogSW4gTVJJIG1vZGUsIGRvbid0IHJlcXVpcmUgcGFyZW50aGVzZXMuCi0JKGRvX2luY2x1ZGUpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgcmVxdWlyZXMgcXVvdGVzLiAgSWYgdGhlIGZpbGUgY2FuCi0Jbm90IGJlIGZvdW5kIGluIHRoZSBpbmNsdWRlIHBhdGgsIHRyeSBvcGVuaW5nIGl0IGluIHRoZSBjdXJyZW50Ci0JZGlyZWN0b3J5LiAgUHJpbnQgdGhlIGZpbGUgbmFtZSBjb3JyZWN0bHkgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JKGNoYXJ0eXBlX2luaXQpOiBJbiBNUkkgbW9kZSwgc2V0IEZJUlNUQklUIGZvciAnLicuCi0JKG1haW4pOiBTZXQgY29tbWVudF9jaGFyIHRvICc7JyB3aGVuIGVudGVyaW5nIE1SSSBtb2RlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkobTY4a19pcCk6IFBhc3MgNjQgcmF0aGVyIHRoYW4gLTEgdG8gYWRkX0ZpeCBpbiAnQicgJ0InIGNhc2UuCi0JKG1kX3BjcmVsX2Zyb20pOiBJZiBmeF9wY3JlbF9hZGp1c3QgaXMgNjQsIHVzZSAtMSBpbnN0ZWFkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpOiBGb3IgT0JKX0FPVVQgY2FzZSwgYWRqdXN0Ci0JQkZEX1JFTE9DXzE2IGFuZCBCRkRfUkVMT0NfMzIgcmVsb2NzLgotCi1XZWQgQXVnIDE2IDE0OjQ4OjQ0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoYWxsb2NhKTogVXNlIHZvaWQqIGRlY2xhcmF0aW9uIG9uIEhQL1VYLgotCi1XZWQgQXVnIDE2IDEyOjQ5OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IElmIFBJQywgb25seSBjaGFuZ2UgUENSRUxfUzIKLQl0byBXUExUMzAgZm9yIGFuIHVuZGVmaW5lZCBvciBleHRlcm5hbCBzeW1ib2wuICBEb24ndCBjb25zaWRlcgotCVBDMTAgb3IgUEMyMiB0byBiZSBhIFBDIHJlbGF0aXZlIHJlbG9jIHdoZW4gY2hvb3NpbmcgYmV0d2VlbgotCWZ4X2FkZG51bWJlciBhbmQgZnhfb2Zmc2V0LgotCi0JKiBjb25maWcvdGMtejhrLmMgKG1kX251bWJlcl90b19jaGFycyk6IERvbid0IGRvIGl0IGhlcmUsIGNhbGwKLQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuLgotCSogY29uZmlnL3RjLXo4ay5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogQWRkIHN1cHBvcnQgZm9yIC5zdGFydG9mLiBhbmQgLnNpemVvZi4gYnkKLQl1c2luZyBtYWdpYyBzeW1ib2wgbmFtZXMgd2hpY2ggdGhlIGxpbmtlciB3aWxsIHJlY29nbml6ZQotCXNwZWNpYWxseS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBUYWtlIG91dCBub3RlIHRoYXQgLnN0YXJ0b2YuIGFuZCAuc2l6ZW9mLiBhcmUKLQlub3Qgc3VwcG9ydGVkLgotCi1UdWUgQXVnIDE1IDE1OjA4OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wKLQlkaXJlY3RpdmVzOiBpZiwgaWYuYiwgaWYudywgaWYubCwgZWxzZSwgZWxzZS5zLCBlbHNlLmwsIGVuZGksCi0JYnJlYWssIGJyZWFrLnMsIGJyZWFrLmwsIG5leHQsIG5leHQucywgbmV4dC5sLCBmb3IsIGZvci5iLCBmb3IudywKLQlmb3IubCwgZW5kZiwgcmVwZWF0LCB1bnRpbCwgdW50aWwuYiwgdW50aWwudywgdW50aWwubCwgd2hpbGUsCi0Jd2hpbGUuYiwgd2hpbGUudywgd2hpbGUubCwgZW5kdy4KLQkoZW51bSBtcmlfY29udHJvbF90eXBlKTogRGVmaW5lLgotCShzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyk6IERlZmluZS4KLQkobXJpX2NvbnRyb2xfc3RhY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtcmlfY29udHJvbF9pbmRleCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1yaV9jb250cm9sX2xhYmVsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHVzaF9tcmlfY29udHJvbCwgcG9wX21yaV9jb250cm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHBhcnNlX21yaV9jb25kaXRpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3dhcF9tcmlfY29uZGl0aW9uLCByZXZlcnNlX21yaV9jb25kaXRpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX21yaV9pZiwgc19tcmlfZWxzZSwgc19tcmlfZW5kaSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV9icmVhaywgc19tcmlfbmV4dCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV9mb3IsIHNfbXJpX2VuZGYpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc19tcmlfcmVwZWF0LCBzX21yaV91bnRpbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV93aGlsZSwgc19tcmlfZW5kdyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCSogZ2FzcC5jIChtcmlraW5mbyk6IFJlbW92ZSBJRi4KLQkqIGV4cHIuYyAoZ2V0X3N5bWJvbF9lbmQpOiBBY2NlcHQgXDAwMSBhcyBwYXJ0IG9mIGEgbmFtZS4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IENoYW5nZSBwYXJhbWV0ZXIgdG8gY29uc3QgY2hhciAqLgotCSogc3ltYm9scy5oIChjb2xvbik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotTW9uIEF1ZyAxNCAyMDo1MTo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogQWx3YXlzIGRvIGl0IHRoZSBCRkRfRkFTVF9TRUNUSU9OX0ZJTEwKLQl3YXkuICBSZWZvcm1hdCBhbmQgcmVpbmRlbnQgdGhhdCBjb2RlIHRvIEdOVSBzdGFuZGFyZHMuCi0JKEJGRF9GQVNUX1NFQ1RJT05fRklMTCk6IERvbid0IGRlZmluZS4KLQotTW9uIEF1ZyAxNCAxNDowODowNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG9uJ3QgdHJ5IHRvIGFwcGx5IEJFR0lOX0JSVEFCCi0Jb3IgRU5EX0JSVEFCIGZpeHVwcy4KLQotTW9uIEF1ZyAxNCAxNTo0NTowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAoZG9fYWxpZ24sIGdldF9hbnlfc3RyaW5nKTogTWFyayBhcyBzdGF0aWMuCi0JKGRvX2Fzc2lnbmEsIGRvX2Fzc2lnbmMsIG5ld19maWxlKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfcmVnKTogUmVuYW1lIGxvY2FsIG9wIHRvIHJvcCB0byBhdm9pZAotCWNvbmZ1c2lvbiB3aXRoIG1hY3JvIG9wLgotCi0JKiBnYXNwLmMgKHN0cmlwX2NvbW1lbnRzKTogQ29tbWVudCBvdXQ7IGl0J3Mgbm90IHVzZWQuCi0JKGRvX2VuZCk6IEFkZCBwYXJhbWV0ZXIuICBJbiBNUkkgbW9kZSwgcHJpbnQgaXQgb3V0LgotCShkb19pcnApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdWJfYWN0dWFsKTogQ2hhbmdlIHBhcmFtZXRlciBtIHRvIGZvcm1hbF9oYXNoLCBjaGFuZ2luZyB0eXBlCi0JZnJvbSBtYWNyb19lbnRyeWggKiB0byBoYXNoX3RhYmxlICouCi0JKG1hY3JvX2V4cGFuZF9ib2R5KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW1hY3JvX2V4cGFuZC4KLQkobWFjcm9fZXhwYW5kKTogQ2FsbCBtYWNyb19leHBhbmRfYm9keS4KLQkoS18qKTogRnVsbHkgcGFyZW50aGVzaXplLgotCShLX0lSUCwgS19JUlBDKTogRGVmaW5lLgotCShtcmlraW5mbyk6IEFkZCBJUlAgYW5kIElSUEMuCi0JKHByb2Nlc3NfcHNldWRvX29wKTogSW4gTVJJIG1vZGUsIHByaW50IG91dCBFTkQgcHNldWRvLW9wLiAgUGFzcwotCWxpbmUgdG8gZG9fZW5kLiAgSGFuZGxlIEtfSVJQIGFuZCBLX0lSUEMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfb3B0KTogUmVzZXQgKmlucHV0X2xpbmVfcG9pbnRlciBldmVuIGlmIHdlCi0JZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgb3B0aW9uLgotCi1TdW4gQXVnIDEzIDE3OjAzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IEhhbmRsZSBhYnNvbHV0ZV9zZWN0aW9uLgotCSogd3JpdGUuYyAocmVjb3JkX2FsaWdubWVudCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFNraXAgaW5zbnMgd2l0aCBhbiBpbmFwcHJvcHJpYXRlCi0JSVNBIGxldmVsLgotCi1TdW4gQXVnIDEzIDAwOjM1OjAyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IKLQkiYmVnaW5fYnJ0YWIiIGFuZCAiZW5kX2JydGFiIiBwc2V1ZG8tb3BzLgotCShwYV9icnRhYik6IE5ldyBmdW5jdGlvbi4KLQkodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEhhbmRsZSBSX0JFR0lOX0JSVEFCIGFuZCBSX0VORF9CUlRBQi4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NhdGlvbnMgZm9yIEJSVEFCIGZpeHVwcwotCXdoZW4gT0JKX1NPTSBpcyBkZWZpbmVkLgotCi1GcmkgQXVnIDExIDIwOjM0OjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRFX09CSlMpOiBBZGQgZW1wdHkgZGVmaW5pdGlvbi4KLQotRnJpIEF1ZyAxMSAxOToxNjowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAoY2hhbmdlX2Jhc2UpOiBEb24ndCB0cmVhdCAnIHNwZWNpYWxseSBpbiBNUkkgbW9kZS4KLQkocHJvY2Vzc19maWxlKTogRG9uJ3Qgd2FybiBhYm91dCBtaXNzaW5nIEVORCBpbiBNUkkgbW9kZS4KLQkoZG9faWYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnZXRfbXJpX3N0cmluZywgZG9faWZjKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGJ1ZmZlcl9hbmRfbmVzdCk6IFRyZWF0IE1SSSBtb2RlIGxpa2UgYWx0ZXJuYXRlIHN5bnRheCBtb2RlLgotCShkb19hZW5kcik6IENoYW5nZSBlcnJvciBtZXNzYWdlIGluIE1SSSBtb2RlLgotCShkb19hcmVwZWF0KTogVXNlIFJFUFQvRU5EUiBpbiBNUkkgbW9kZS4KLQkoZG9fZm9ybWFscyk6IEluIE1SSSBtb2RlLCBhZGQgc3BlY2lhbCBOQVJHIGZvcm1hbC4KLQkobWFjcm9fZXhwYW5kKTogVmFyaW91cyBjaGFuZ2VzIGZvciBNUkkgbW9kZTogcGVybWl0IGEgcXVhbGlmaWVyCi0Jb24gdGhlIG1hY3JvIG5hbWU7IHNldCBzcGVjaWFsIE5BUkcgZm9ybWFsOyBwZXJtaXQgdW5uYW1lZAotCXBvc2l0aW9uYWwgYXJndW1lbnRzOyB1c2UgJiYgdG8gY29uY2F0ZW5hdGUgbmFtZWQgcGFyYW1ldGVyczsKLQlwZXJtaXQgXGQgdG8gc3BlY2lmeSBhbiB1bm5hbWVkIHBhcmFtZXRlcjsgcGVybWl0IG5hbWVkIHBhcmFtZXRlcnMKLQl0byBub3Qgc3RhcnQgd2l0aCBcOyB1c2UgPT0gdG8gc2VlIGlmIGEgcGFyYW1ldGVyIGV4aXN0cy4KLQkoZ2V0c3RyaW5nKTogSW4gTVJJIG1vZGUsIGFsbG93IDw+IHRvIHF1b3RlIGEgc3RyaW5nLgotCShLX0lGRVEsIEtfSUZORSwgS19JRkxULCBLX0lGTEUsIEtfSUZHRSwgS19JRkdUKTogRGVmaW5lLgotCShLX0lGQywgS19JRk5DKTogRGVmaW5lLgotCShzdHJ1Y3Qga2V5d29yZCk6IE5hbWUgc3RydWN0dXJlIHVzZWQgaW4ga2luZm8gYXJyYXkuCi0JKG1yaWtpbmZvKTogTmV3IHN0YXRpYyBhcnJheS4KLQkocHJvY2Vzc19wc2V1ZG9fb3ApOiBEb24ndCByZXF1aXJlIGxlYWRpbmcgJy4nIGluIE1SSSBtb2RlLgotCUhhbmRsZSBuZXcgTVJJIHBzZXVkby1vcCBkZWZpbml0aW9ucy4KLQkoYWRkX2tleXdvcmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIHByb2Nlc3NfaW5pdC4KLQkocHJvY2Vzc19pbml0KTogVXNlIGFkZF9rZXl3b3JkLiAgSW4gTVJJIG1vZGUsIGFkZCBtcmlraW5mbyB0YWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJtcmkiLgotCShzaG93X3VzYWdlKTogTWVudGlvbiAtTS8tLW1yaS4KLQkobWFpbik6IENhbGwgcHJvY2Vzc19pbml0IGFmdGVyIHByb2Nlc3NpbmcgYXJndW1lbnRzLiAgSGFuZGxlIC1NLgotCSogZG9jL2dhc3AudGV4aTogRG9jdW1lbnQgLU0vLS1tcmkuCi0KLQkqIGdhc3AuYzogSW5jbHVkZSBhbnNpZGVjbC5oLiAgTWFrZSBhbGwgbG9jYWwgZnVuY3Rpb25zIHN0YXRpYy4KLSAgICAgICAgQWRkIHByb3RvdHlwZXMgZm9yIGFsbCBzdGF0aWMgZnVuY3Rpb25zLgotCShtcmkpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShzYl9hZGRfY2hhcik6IENoYW5nZSBwYXJhbWV0ZXIgYyBmcm9tIGNoYXIgdG8gaW50LgotCShzYl9hZGRfc3RyaW5nKTogTWFrZSBwYXJhbWV0ZXIgcyBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQkoc2JfYWRkX2J1ZmZlcik6IExpa2V3aXNlLgotCShjaGVja2NvbnN0KTogQ2hhbmdlIHBhcmFtZXRlciBvcCBmcm9tIGNoYXIgdG8gaW50LgotCShleHBfZ2V0X2Ficyk6IE1ha2UgcGFyYW1ldGVyIGVtc2cgaW50byBhIGNvbnN0IHBvaW50ZXIuCi0JKGRvX3Jlcyk6IENoYW5nZSBwYXJhbWV0ZXIgdHlwZSBmcm9tIGNoYXIgdG8gaW50LgotCShidWZmZXJfYW5kX25lc3QpOiBNYWtlIHBhcmFtZXRlcnMgZnJvbSBhbmQgdG8gaW50byBjb25zdAotCXBvaW50ZXJzLgotCShkb19zZGF0YSk6IENoYW5nZSBwYXJhbWV0ZXIgdHlwZSBmcm9tIGNoYXIgdG8gaW50LgotCShuZXdfZmlsZSk6IE1ha2UgcGFyYW1ldGVyIG5hbWUgaW50byBhIGNvbnN0IHBvaW50ZXIuCi0JKGRvX2RlZmluZSk6IE1ha2UgcGFyYW1ldGVyIHN0cmluZyBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX251bWJlcl90b19jaGFycyk6IERvbid0IGRvIGl0IGhlcmUsIGNhbGwKLQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCi1GcmkgQXVnIDExIDEzOjIzOjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkIG5ldyBmaWVsZCBmeF9ub19vdmVyZmxvdy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IElmIGZ4X25vX292ZXJmbG93IGlzIG5vbi16ZXJvLCBkb24ndAotCWNvbXBsYWluIGlmIHRoZSBhZGRlbmQgaXMgdG9vIGxhcmdlLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogU2V0IGZ4X25vX292ZXJmbG93IGlmIHRoZSBoYWxmCi0Jd29yZCByZWxvY2F0aW9ucyBCRkRfUkVMT0Nfe0xPMTYsSEkxNixISTE2X1N9LgotCi1UaHUgQXVnIDEwIDIwOjU2OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbXJpX3NlY3QpIFtCRkRfQVNTRU1CTEVSXTogRml4IHR5cG9zIGluIGNob29zaW5nIGFuZAotCXNldHRpbmcgc2VjdGlvbiBmbGFncy4KLQotVGh1IEF1ZyAxMCAwMDozODoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLQkqIGRvYy9hcy4xOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFdoZW4gcmVjb2duaXppbmcgJyMnLCB1c2UgaXNieXRlIGFuZAotCWl3b3JkIHJhdGhlciB0aGFuIGV4cHI4IGFuZCBleHByMTYuICBXaGVuIHJlY29nbml6aW5nICdNJywgdXNlCi0JaXNzYnl0ZSByYXRoZXIgdGhhbiBleHByOC4gIFdoZW4gcmVjb2duaXppbmcgJ1EnIGFuZCAndCcsIGp1c3QKLQljaGVjayBmb3IgT19jb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHByOC4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKGV4cHI4LCBleHByMTYpOiBEb24ndCBkZWZpbmUuCi0JKiBNYWtlZmlsZS5pbiAobTY4ay1wYXJzZS5vKTogRGVwZW5kIHVwb24gbTY4ay1wYXJzZS5oLCBub3QKLQltNjhrLXBhcnNlLnkuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBzcGMsIHR0bCwgeGNvbSwgeHJlZi4KLQkoc19tcmlfc2VjdCk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAoc19tcmlfc2VjdCk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbikgKGJvdGggdmVyc2lvbnMpOiBJbiBNUkkKLQltb2RlLCBjYWxsIHNfbXJpX3NlY3QuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgc2VjdC5zIGFuZCBzZWN0aW9uLnMuICBNb3ZlIHNlY3Qgb3V0c2lkZQotCW9mIGlmbmRlZiBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCBzZWN0aW9uLnMsIHNlY3QsCi0Jc2VjdC5zLgotCShvYmpfZWxmX3NlY3Rpb24pOiBJbiBNUkkgbW9kZSwgY2FsbCBzX21yaV9zZWN0LgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIHJlc3RvcmUsIHNhdmUuCi0JKHN0cnVjdCBzYXZlX29wdHMpOiBEZWZpbmUuCi0JKHNhdmVfc3RhY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX3NhdmUsIHNfcmVzdG9yZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCi0JKiByZWFkLmMgKHNfc2V0KTogUmVtb3ZlIHVudXNlZCBsb2NhbCBwdHIuCi0JKGhleF9mbG9hdCk6IENoZWNrIHRhcmdldF9iaWdfZW5kaWFuLgotCShlcXVhbHMpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHAuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWhwcGEuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTg2MC5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW04OGsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtdGFob2UuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc2guYyAobGl0dGxlKTogU2V0IHRhcmdldF9iaWdfZW5kaWFuLgotCShtZF9iZWdpbik6IExpa2V3aXNlLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkoYnVpbGRfcmVsYXgpOiBDaGVjayB0YXJnZXRfYmlnX2VuZGlhbiByYXRoZXIgdGhhbiBzaGwuCi0JKGJ1aWxkX015dGVzLCBtZF9hdG9mKTogTGlrZXdpc2UuCi0JKG1kX2NvbnZlcnRfZnJhZywgbWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0JKG1kX251bWJlcl90b19jaGFycyk6IExpa2V3aXNlLgotCQotV2VkIEF1ZyAgOSAxMDo1MTo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfYWJzcGNhZGQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtNjhrX3F1aWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobTY4a19yZWwzMik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBvcHQgYW5kIHJlZy4KLQkobTY4a19pcCk6IFBlcm1pdCBhYnNvbHV0ZSBzeW1ib2xzIGluICdsJy8nTCcgcmVjb2duaXRpb24uICBDaGVjawotCW02OGtfcXVpY2sgaW4gJ00nIGFuZCAnUScgcmVjb2duaXRpb24uICBDaGVjayBtNjhrX2Fic3BjYWRkIGluCi0JRElTUCBoYW5kbGluZy4gIENoZWNrIG02OGtfcmVsMzIgaW4gQkFTRS9QT1NUL1BSRSBoYW5kbGluZy4KLQkobWRfYmVnaW4pOiBJbiBNUkkgbW9kZSwgaW5pdGlhbGl6ZSBtNjhrX2Fic3BjYWRkIGFuZCBtNjhrX3JlbDMyLgotCUluIE1SSSBtb2RlLCBjaGFuZ2UgdW5zaXplZCBicmFuY2ggYWxpYXNlcyB0byBiZSB2YXJpYWJsZSBzaXplZC4KLQkoc3RydWN0IG9wdF9hY3Rpb24pOiBEZWZpbmUuCi0JKG9wdF90YWJsZSk6IERlZmluZS4KLQkoc19vcHQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShza2lwX3RvX2NvbW1hKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3B0X2NoaXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvcHRfbGlzdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9wdF9saXN0X3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX3JlZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBhcy5oIChmbGFnX2tlZXBfbG9jYWxzKTogQ2hhbmdlIGZyb20gdW5zaWduZWQgY2hhciB0byBpbnQuCi0JKGZsYWdfbm9fd2FybmluZ3MpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChtcmlfbGluZV9sYWJlbCk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkocG90YWJsZSk6IEFkZCBub3BhZ2UsIHBhZ2UsIHBsZW4uCi0JKHNfb3JnKTogRXJyb3IgaWYgaW4gTVJJIG1vZGUuCi0JKiByZWFkLmggKG1yaV9saW5lX2xhYmVsKTogRGVjbGFyZS4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19ub3BhZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaXN0aW5nLmggKGxpc3Rpbmdfbm9wYWdlKTogRGVjbGFyZS4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfYmVnaW4pOiBTZXQgc3lfZnJhZyBvZiBhYnNfc3ltYm9sIHRvCi0JJnplcm9fYWRkcmVzc19mcmFnLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IENoZWNrIHRoYXQgc3ltYm9sIGlzIG5vdCBOVUxMCi0JYmVmb3JlIGNoZWNraW5nIHN5X21yaV9jb21tb24uCi0JKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAoYWJzX3NlY3Rpb25fb2Zmc2V0KTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkocG90YWJsZSk6IEFkZCBvZmZzZXQsIHN0cnVjdC4KLQkoZG9fb3JnKTogTmV3IHN0YXRpYyBmdW5jdGlvbjsgaGFuZGxlIGNoYW5naW5nIHRoZSBvcmlnaW4gaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4KLQkoc19vcmcpOiBVc2UgZG9fb3JnLgotCShzX3NldCk6IExpa2V3aXNlLgotCShlcXVhbHMpOiBMaWtld2lzZS4KLQkoc19zcGFjZSk6IEluIGFic29sdXRlX3NlY3Rpb24sIGp1c3QgaW5jcmVhc2UgYWJzX3NlY3Rpb25fb2Zmc2V0LgotCShzX3N0cnVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoZW1pdF9leHByKTogSGFuZGxlIGFic29sdXRlX3NlY3Rpb24gc3BlY2lhbGx5LgotCSogcmVhZC5oIChhYnNfc2VjdGlvbl9vZmZzZXQpOiBEZWNsYXJlLgotCShzX3N0cnVjdCk6IERlY2xhcmUuCi0JKiBmcmFncy5jIChmcmFnX21vcmUpOiBXYXJuIGlmIGluIGFic29sdXRlX3NlY3Rpb24uCi0JKGZyYWdfbm93X2ZpeCk6IEluIGFic29sdXRlX3NlY3Rpb24sIHJldHVybiBhYnNfc2VjdGlvbl9vZmZzZXQuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBJZiBzd2l0Y2hpbmcgdG8gYWJzb2x1dGVfc2VjdGlvbiwKLQlqdXN0IHNldCBub3dfc2VnIGFuZCBub3dfc3Vic2VnLgotCShzdWJzZWdfc2V0X3Jlc3QpOiBTcGVjaWFsIGhhbmRsaW5nIHdoZW4gc3dpdGNoaW5nIHRvIG9yIGZyb20KLQlhYnNvbHV0ZV9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2Zsb2F0X2NvcG51bSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBmb3B0IGFuZCBtYXNrMi4KLQkobTY4a19pcCk6IFVzZSBtNjhrX2Zsb2F0X2NvcG51bSwgbm90IENPUE5VTSwgd2hlbiBzZXR0aW5nCi0JY29wcm9jZXNzb3IgcmVnaXN0ZXIgdG8gdXNlLiAgSW4gY2FzZSAnSScgd2hlbiBjaGVja2luZyBvcGVyYW5kcywKLQljb3JyZWN0IGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG51bWJlcnMuICBJbiBjYXNlICdJJyB3aGVuIHNldHRpbmcKLQlvcGVyYW5kcywgZG9uJ3QgYWRkIDEuCi0JKHNfZm9wdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oIChDT1BOVU0pOiBEb24ndCBkZWZpbmUuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBpZmVxLCBpZmdlLCBpZmd0LCBpZmxlLCBpZmx0LCBpZm5lLgotCUNoYW5nZSBpZiB0byBwYXNzIE9fbmUgdG8gc19pZi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogRG9uJ3QgZGVmaW5lIGFuIGxhYmVsIHdpdGhvdXQgYSBjb2xvbiBpZgotCWlnbm9yZV9pbnB1dCByZXR1cm5zIHRydWUuCi0JKiBjb25kLmMgKHNfaWYpOiBUcmVhdCBhcmd1bWVudCBhcyBhbiBvcGVyYXRvclQgZGVzY3JpYmluZyBob3cgdG8KLQljb21wYXJlIHRoZSBhcmd1bWVudCBhZ2FpbnN0IHplcm8uCi0JKGlnbm9yZV9pbnB1dCk6IERvbid0IHJlcXVpcmUgYW4gaW5pdGlhbCBkb3QgaW4gTVJJIG1vZGUsIG9yIGlmCi0JTk9fUFNFVURPX0RPVCBpcyBkZWZpbmVkLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgZGNiLCBkY2IuYiwgZGNiLmQsIGRjYi5sLCBkY2IucywgZGNiLncsCi0JZGNiLngsIGRzLmQsIGRzLnAsIGRzLnMsIGRzLngsIGVsc2VjLCBlbmRjLCBmYWlsLCBmb3JtYXQsIGxsZW4sCi0Jbm9mb3JtYXQuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IElmIHBzZXVkby1vcCBoYW5kbGVyIGlzIHNfZW5kLCBxdWl0Ci0JaW1tZWRpYXRlbHkuCi0JKHNfZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzX2ZhaWwpOiBOZXcgZnVuY3Rpb24uCi0JKHNfZmxvYXRfc3BhY2UpOiBOZXcgZnVuY3Rpb24uCi0JKGhleF9mbG9hdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZsb2F0X2NvbnMpOiBVc2UgaGV4X2Zsb2F0LgotCSogcmVhZC5oIChzX2ZhaWwpOiBEZWNsYXJlLgotCShzX2Zsb2F0X3NwYWNlKTogRGVjbGFyZS4KLQkqIGNvbmQuYyAoc19lbmQpOiBSZW1vdmUuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcHNpemUpOiBUcmVhdCBhcmd1bWVudCBhcyBpbmRpY2F0aW5nIHdoZXRoZXIKLQlhIGhlaWdodCBpcyBleHBlY3RlZC4KLQotCSogcmVhZC5jIChtcmlfcGVuZGluZ19hbGlnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEhhbmRsZSBtcmlfcGVuZGluZ19hbGlnbi4KLQkoY29ucyk6IFNldCBtcmlfcGVuZGluZ19hbGlnbiBpZiBhcHByb3ByaWF0ZS4KLQotCSogY29uZmlndXJlLmluOiBNb3ZlIHJhbmRvbSBzcGVjaWFsIHRhcmdldCBoYW5kbGluZyBiZWZvcmUKLQlwb3NzaWJsZSBicmVhay4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEF1ZyAgOCAyMzo0MToyNSAxOTk1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29uc2lzdGVudGx5IHVzZSAke3RhcmdldF9jcHVfdHlwZX0gcmF0aGVyIHRoYW4KLQkke2NwdV90eXBlfSBhZnRlciB0aGUgbG9vcC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluICh0YXJnLWNwdS5vKTogVXNlIEB0YXJnZXRfY3B1X3R5cGVAIHJhdGhlciB0aGFuCi0JQGNwdV90eXBlQC4KLQotVHVlIEF1ZyAgOCAxNzoyNzoxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5oIChvcGVyYXRvclQpOiBSZW1vdmUgY29tbWEgYWZ0ZXIgbGFzdCBlbnVtZXJhdG9yIHZhbHVlLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBTb21lIHdoaXRlc3BhY2UgY2xlYW51cCBmcm9tIFBhdCBSYW5raW4uCi0KLQkqIGFzLmggKGFsbG9jYSk6IElmIF9fU1REQ19fLCBkZWNsYXJlIHZvaWQqIGluc3RlYWQgb2YgY2hhciouCi0KLQlXZWQgQXVnICAyIDE4OjU0OjM3IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIsCi0JQ2xvc2VfVk1TX09iamVjdF9GaWxlKTogUmVvcmdhbml6ZSB0aGUgYCNpZiAhVk1TJyBjcm9zcy1hc3NtZWJsZXIKLQlzdXBwb3J0IGNvZGUuCi0JKENsb3NlX1ZNU19PYmplY3RfRmlsZSk6IENhbGwgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgdG8gZmx1c2gKLQlvdXRwdXQgYnVmZmVyLS1qdXN0IGluIGNhc2UtLWJlZm9yZSBjbG9zaW5nIHRoZSBmaWxlLgotCi1UdWUgQXVnICA4IDEzOjA3OjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoYXJjaHMpOiBBZGQgNjhlYzAwMCwgNjhoYzAwMCwgNjhoYzAwMSwKLQk2OGVjMDIwLCA2OGVjMDMwLCA2OGVjMDQwLCBhbmQgNjgzMzAuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBjaGlwIGFuZCBjb21saW5lLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSBzdHJjYXNlY21wIHdoZW4gY29tcGFyaW5nIGRlZmF1bHRfY3B1Ci0JYWdhaW5zdCBhcmNoaXRlY3R1cmVzLgotCShtcmlfY2hpcCwgc19jaGlwKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogQWRkIHN5X21yaV9jb21tb24gYml0LgotCSogcmVhZC5oIChtcmlfY29tb25fc3ltYm9sKTogRGVjbGFyZS4KLQkoc19tcmlfY29tbW9uKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAobXJpX2xpbmVfbGFiZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtcmlfY29tbW9uX3N5bWJvbCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHBvdGFibGUpOiBBZGQgImNvbW1vbiIgYW5kICJjb21tb24ucyIuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEluIE1SSSBtb2RlLCBzZXQgbXJpX2xpbmVfbGFiZWwgZm9yIGEgbGFiZWwKLQlhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgotCShzX21yaV9jb21tb24pOiBOZXcgZnVuY3Rpb24uCi0JKHNfc3BhY2UpOiBIYW5kbGUgbXJpX2NvbW1vbl9zeW1ib2wuCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBmcm9tIHZvaWQgdG8gc3ltYm9sUyAqLAotCWFuZCByZXR1cm4gbmV3IHN5bWJvbC4gIElmIG1yaV9jb21tb25fc3ltYm9sIGlzIHNldCwgYXR0YWNoIHRoZQotCW5ldyBzeW1ib2wgdG8gaXQuCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIGFuIHN5X21yaV9jb21tb24gc3ltYm9sLgotCSogc3ltYm9scy5oIChjb2xvbik6IENoYW5nZSByZXR1cm4gdmFsdWUgaW4gZGVjbGFyYXRpb24uCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENsZWFyIG1yaV9jb21tb25fc3ltYm9sLgotCShzdWJzZWdfc2V0IChib3RoIHZlcnNpb25zKSk6IExpa2V3aXNlLgotCSogZnJhZ3MuYyAoZnJhZ19tb3JlKTogV2FybiBpZiBtcmlfY29tbW9uX3N5bWJvbCBpcyBub3QgTlVMTC4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2tpcCBzeV9tcmlfY29tbW9uIHN5bWJvbHMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogRGlzY2FyZCBzeV9tcmlfY29tbW9uIHN5bWJvbHMuCi0JKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2UgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeV9tcmlfY29tbW9uIHN5bWJvbHMKLQl0byBiZSBhZ2FpbnN0IHRoZSBjb21tb24gc3ltYm9sIGl0c2VsZi4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh5YW5rX3N5bWJvbHMpOiBEaXNjYXJkIHN5X21yaV9jb21tb24gc3ltYm9scy4KLQkoZml4dXBfc2VnbWVudCk6IENoYW5nZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5X21yaV9jb21tb24gc3ltYm9scwotCXRvIGJlIGFnYWluc3QgdGhlIGNvbW1vbiBzeW1ib2wgaXRzZWxmLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBEaXNjYXJkCi0Jc3lfbXJpX2NvbW1vbiBzeW1ib2xzLgotCi0JKiBkb2MvYy1tNjhrLnRleGk6IEFkZCBkb2N1bWVudGF0aW9uIGZvciBDUFUgc3BlY2lmaWMgb3B0aW9ucywgYW5kCi0JZm9yIE1vdG9yb2xhIHN5bnRheC4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAobW90b3JvbGFfb3BlcmFuZCk6IEZvciAoJXBjKSwgc2V0IG1vZGUgdG8KLQlESVNQLCBub3QgQkFTRS4KLQotVHVlIEF1ZyAgOCAwMjozMTozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAocmVsYXhfYWxpZ24pOiBBZGQgZXh0cmEgcGFkZGluZyBmb3IgbGlua3JlbGF4IG9ubHkgaWYKLQlMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZIGlzIGRlZmluZWQuCi0JKiBjb25maWcvdGMtaTk2MC5oIChMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZKTogRGVmaW5lIGl0LgotCSogZG9jL2ludGVybmFscy50ZXhpIChSZWxheGF0aW9uKTogV3JpdGUgdXAgc29tZSBzdHVmZiBvbiBsaW5rZXIKLQlyZWxheGluZyBhbmQgTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWS4KLQotTW9uIEF1ZyAgNyAxNzoxODoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnk6IE5ldyBmaWxlOiBiaXNvbiBncmFtbWFyIGZvciBtNjhrIG9wZXJhbmRzLAotCWluY2x1ZGluZyBzdXBwb3J0IGZvciBNb3Rvcm9sYSBzeW50YXguCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oOiBOZXcgZmlsZTsgZGVmaW5pdGlvbnMgc2hhcmVkIGJldHdlZW4KLQltNjhrLXBhcnNlLnkgYW5kIHRjLW02OGsuYy4KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEluY2x1ZGUgbTY4ay1wYXJzZS5oLgotCShlbnVtIG9wZXJhbmRfdHlwZSk6IE1vdmUgdG8gbTY4ay1wYXJzZS5oLCB3aGVyZSBpdCBpcyBuYW1lZAotCW02OGtfb3BlcmFuZF90eXBlLiAgUmVuYW1lIGFsbCB1c2VzLiAgUmVhcnJhbmdlIHNvbWV3aGF0LiAgQWRkCi0JRlBSRUcuICBSZW5hbWUgQU9GRiB0byBESVNQLiAgUmVuYW1lIEFJTkRYIHRvIEJBU0UuICBSZW5hbWUgQVBPRFgKLQl0byBQT1NULiAgUmVuYW1lIEFQUkRYIHRvIFBSRS4gIFJlbW92ZSBBTUlORC4gIFJlbmFtZSBNU0NSIHRvCi0JQ09OVFJPTC4gIFJlbW92ZSBESU5EUi4KLQkoc3RydWN0IG02OGtfZXhwKTogTW92ZSB0byBtNjhrLXBhcnNlLmguICBSZW1vdmUgZV9iZWcsIGVfZW5kIGFuZAotCWVfc2VnIGZpZWxkcy4gIFJlbmFtZSBlX2V4cCB0byBleHAuICBSZW5hbWUgZV9zaXogdG8gc2l6ZSwgYW5kCi0JY2hhbmdlIHR5cGUgdG8gZW51bSBtNjhrX3NpemUuICBDaGFuZ2UgYWxsIHVzZXMuCi0JKGVudW0gX3JlZ2lzdGVyKTogTW92ZSB0byBtNjhrLXBhcnNlLmgsIHdoZXJlIGl0IGlzIG5hbWVkCi0JbTY4a19yZWdpc3Rlci4gIFJlbmFtZSBhbGwgdXNlcy4gIEFkZCBaREFUQTAtNyBhbmQgWkFERFIwLTcuCi0JKHN0cnVjdCBtNjhrX29wKTogTW92ZSB0byBtNjhrLXBhcnNlLmguICBDaGFuZ2UgYWxsIGZpZWxkcy4KLQkoc2VnKTogRG9uJ3QgZGVmaW5lLgotCShhZGRfZXhwKTogUmVtb3ZlLgotCShGQUlMLCBPSyk6IFJlbW92ZS4KLQkobTY4a19yZWdfcGFyc2UpOiBNb3ZlIHRvIG02OGstcGFyc2UueSwgYW5kIHJld3JpdGUuCi0JKFNLSVBfV0hJVEUsIFNLSVBfVyk6IFJlbW92ZS4KLQkodHJ5X21vdG9faW5kZXgsIHRyeV9pbmRleCk6IFJlbW92ZS4KLQkobTY4a19pcF9vcCk6IE1vdmUgdG8gbTY4ay1wYXJzZS55LCBhbmQgcmV3cml0ZSB0byB1c2UgZ3JhbW1hci4KLQkobWFpbik6IFJlbW92ZSBvYnNvbGV0ZSB0ZXN0IGZ1bmN0aW9uLgotCShtNjhrX2lwKTogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gdXNlIG5ldyBncmFtbWFyLgotCShnZXRfcmVncyk6IFJlbW92ZS4KLQkoY3JhY2tfb3BlcmFuZCk6IG02OGtfaXBfb3Agbm93IHJldHVybnMgMCBvbiBzdWNjZXNzLgotCShpbml0X3RhYmxlKTogQWRkIHNzcCwgemQwLTcgYW5kIHphMC03LgotCShtZF9hc3NlbWJsZSk6IE1ha2UgZXIgY29uc3QuICBDb3JyZWN0IGxvb3Agb3ZlciBvcGVyYW5kcyB3aGVuCi0JbG9va2luZyBmb3IgZXJyb3IgbWVzc2FnZS4KLQkobWRfYmVnaW4pOiBTZXQgYWx0X25vdGVuZF90YWJsZSBmb3IgJygnIGFuZCAnQCcuCi0JKGdldF9udW0pOiBFeHByZXNzaW9uIGlzIGFscmVhZHkgcGFyc2VkLiAgRG9uJ3Qgc2V0IHNlZy4KLQkqIGNvbmZpZ3VyZS5pbjogSWYgY3B1X3R5cGUgaXMgbTY4aywgcHV0IG02OGstcGFyc2UubyBpbgotCWV4dHJhLW9iamVjdHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIG02OGstcGFyc2UuYy4KLQkoQklTT04pOiBVc2UgLi4vYmlzb24vYmlzb24gaWYgaXQgZXhpc3RzLgotCShCSVNPTkZMQUdTKTogRGVmaW5lIGFzIGVtcHR5LgotCShUQVJHX0NQVV9ERVBfbTY4ayk6IERlcGVuZCB1cG9uICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oLgotCShtNjhrLXBhcnNlLmMsIG02OGstcGFyc2Uubyk6IE5ldyB0YXJnZXRzLgotCi1Nb24gQXVnICA3IDAyOjU0OjIwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogSGFuZGxlIG5ldyBGUCByZWdpc3RlcnMuCi0JKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlcy4KLQotRnJpIEF1ZyAgNCAxMjoyOToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BfZW5jb2RpbmcpOiBNYWtlIG5vbi1jb25zdC4gIERvbid0IHNldCAnIicgdG8KLSAgICAgICAgT19iaXRfbm90LgotCShleHByX2JlZ2luKTogU2V0IG9wX2VuY29kaW5nWyciJ10gaW4gTVJJIG1vZGUuCi0KLVdlZCBBdWcgIDIgMTg6Mzk6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBSZW1vdmUgQlJFQUtfVVBfQklHX0RFQ0wgc3R1ZmYuCi0JKHN0cnVjdCBtNjhrX2luY2FudCk6IENoYW5nZSBtX29wZXJhbmRzIGZpZWxkIHRvIGJlIGNvbnN0LgotCShzdHJ1Y3QgbTY4a19pdCk6IENoYW5nZSBhcmdzIGZpZWxkIHRvIGJlIGNvbnN0LgotCShtNjhrX2lwKTogQ2hhbmdlIGxvY2FsIHZhcmlhYmxlIHMgdG8gYmUgY29uc3QuCi0JKG9wY29kZV9wdHIpOiBSZW1vdmUuCi0JKG1kX2JlZ2luKTogVXNlIG02OGtfbnVtb3Bjb2Rlcywgbm90IG51bW9wY29kZXMuICBVc2UKLQltNjhrX29wY29kZXMsIG5vdCByZW1vdmVkIG9wY29kZV9wdHIuICBVc2UgbTY4a19udW1hbGlhc2VzLCBub3QKLQludW1hbGlhc2VzLgotCi1UdWUgQXVnICAxIDE3OjM1OjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaW5pdF90YWJsZSk6IEFkZCAiY29udHJvbCIsICJzdGF0dXMiLCAiaWFkZHIiLAotCSJzZmNyIiwgYW5kICJkZmNyIiBhcyBzeW5vbnltcyBmb3IgZXhpc3RpbmcgZW50cmllcy4KLQkobWRfYmVnaW4pOiBJbiBNUkkgbW9kZSwgZm9yY2UgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsIHRvIDEuCi0JKG1kX3BhcnNlX29wdGlvbik6IFJlbW92ZWQgdW51c2VkIGxvY2FscyBpIGFuZCBhcmNoLiAgQ2hhbmdlIHR5cGUKLQlvZiBhcmNoIChhbm90aGVyIG9uZSkgdG8gdW5zaWduZWQgbG9uZy4KLQkodGNfY29mZl9zaXplbWFjaGRlcCk6IEFkZCByZXR1cm4gYWZ0ZXIgYWJvcnQgdG8gYXZvaWQgd2FybmluZy4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgTVJJIHN0eWxlIGxhYmVscyBhbmQgZXhwcmVzc2lvbnMuCi0JKiBhcy5oIChmbGFnX21yaSk6IERlY2xhcmUvZGVmaW5lLgotCSogYXMuYyAoc2hvd191c2FnZSk6IE1lbnRpb24gLU0gYW5kIGl0cyBzeW5vbnltIC0tbXJpLgotCShwYXJzZV9hcmdzKTogQWRkICdNJyB0byBzdGRfc2hvcnRvcHRzLiAgQWRkICJtcmkiIHRvCi0Jc3RkX2xvbmdvcHRzLiAgU2V0IGZsYWdfbXJpIGlmIC1NIGlzIHNlZW4uCi0JKG1haW4pOiBDYWxsIHBhcnNlX2FyZ3MgYmVmb3JlIGlucHV0X3NjcnViX2JlZ2luLiAgQ2FsbAotCWV4cHJfYmVnaW4uCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBEb24ndCBzZXQgbGV4IGZvciAnIicgb3IgJ1wnJyBpbiBNUkkKLQltb2RlLiAgRG8gc2V0IGxleCBmb3IgJzsnLCAnKicsIGFuZCAnIScgaW4gTVJJIG1vZGUuCi0JKGRvX3NjcnViX25leHRfY2hhcik6IFJlbW92ZSBNUkkgaWZkZWYgaW4gTEVYX0lTX1dISVRFU1BBQ0UgY2FzZS4KLQlJbiBNUkkgbW9kZSwga2VlcCBzcGFjZXMgYmV0d2VlbiBsYWJlbHMgYW5kIGNvbG9ucy4gIFJlbW92ZSBNUkkKLQlpZm5kZWYgYXJvdW5kIExFWF9JU19PTkVDSEFSX1FVT1RFIGNhc2UuICBJbiBNUkkgbW9kZSwgZG9uJ3QgdXNlCi0JJyEnIG9yICcqJyBhcyBjb21tZW50IGNoYXJhY3RlcnMgZXZlbiBpZiB0aGV5IGFyZSBpbgotCWNvbW1lbnRfY2hhcnMuCi0JKiByZWFkLmggKGxleF90eXBlKTogTm8gbG9uZ2VyIGNvbnN0LgotCSogcmVhZC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShsZXhfdHlwZSk6IE5vIGxvbmdlciBjb25zdC4KLQkocmVhZF9iZWdpbik6IEluIE1SSSBtb2RlLCBzZXQgbGV4X3R5cGUgb2YgJz8nIHRvIDMuCi0JKHBvdGFibGUpOiBBZGQgZGMsIGRjLmIsIGRjLmQsIGRjLmwsIGRjLnMsIGRjLncsIGRjLngsIGRzLCBkcy5iLAotCWRzLmwsIGRzLncsIGFuZCB4ZGVmLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDaGFuZ2UgTEFCRUxTX1dJVEhPVVRfQ09MT04gaWZkZWYgdG8gY2hlY2sKLQlmb3IgTVJJIG1vZGUgYXQgcnVudGltZSByYXRoZXIgdGhhbiBjb21waWxlIHRpbWUuICBIYW5kbGUgdGhlIEVRVQotCXBzZXVkby1vcCBpbiBNUkkgbW9kZS4gIFJlbW92ZSBib2d1cyBNUkkgaWZkZWYgYXJvdW5kIGRvbmVfcHNldWRvLgotCUNoYW5nZSBOT19QU0VVRE9fRE9UIGlmZGVmIHRvIGFsc28gdGFrZSBlZmZlY3QgZm9yIE1SSSBtb2RlIGF0Ci0JcnVudGltZS4KLQkoY29ucyk6IEluIE1SSSBtb2RlLCBhbHdheXMgY2FsbCBwYXJzZV9tcmlfY29ucyByYXRoZXIgdGhhbgotCVRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTi4KLQkocGFyc2VfbXJpX2NvbnMpOiBBbHdheXMgY29tcGlsZSwgbm90IGp1c3Qgd2hlbiBNUkkgaXMgZGVmaW5lZC4KLQlDYWxsIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiwgbm90IGV4cHJlc3Npb24sIHdoZW4gdGhlIGlucHV0IGlzCi0Jbm90IGEgc3RyaW5nIGNvbnN0YW50LiAgSGFuZGxlIEEgYW5kIEUgbW9kaWZpZXJzLgotCShmbG9hdF9jb25zKTogQWNjZXB0IDp4eHh4LCB3aGVyZSB0aGUgeCdzIGFyZSBoZXggZGlnaXRzLgotCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgT19lcSwgT19uZSwgT19sdCwgT19sZSwgT19nZSwgT19ndC4KLQkoZXhwcl9iZWdpbik6IERlY2xhcmUuCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBJbiBNUkkgbW9kZSwgaWYgdGhlIGJhc2Ugd2FzIG5vdAotCXNwZWNpZmllZCwgbG9vayBmb3IgYSBzdWZmaXggb24gdGhlIG51bWJlciB0byBzZXQgdGhlIGJhc2UuCi0JKG1yaV9jaGFyX2NvbnN0YW50KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3BlcmFuZCk6IFJlbW92ZSBNUkkgaWZkZWYuICBJbiBNUkkgbW9kZSwgZG8gdmFyaW91cyB0aGluZ3M6IFBhc3MKLQkwIGFzIHRoZSBiYXNlIHdoZW4gY2FsbGluZyBpbnRlZ2VyX2NvbnN0YW50IGlmIHRoZXJlIHdhcyBubwotCXByZWZpeC4gIENoZWNrIGZvciBhIGhleCBjb25zdGFudCBzdWZmaXggaWYgd2hlbiBhIGxlYWRpbmcgJzAnIGlzCi0Jc2Vlbi4gIERvbid0IGFjY2VwdCAweCBvciAwYiBhcyBhIHByZWZpeC4gIENoZWNrIGZvciBFJ2NoYXJzJyBhbmQKLQlBJ2NoYXJzJy4gIEhhbmRsZSBNUkkgY2hhcmFjdGVyIGNvbnN0YW50cy4gIFRyZWF0ICciJyBhcyB0aGUKLQl1bmFyeSBiaXR3aXNlIG5vdCBvcGVyYXRvci4gIFRyZWF0ICQgYXMgdGhlIHByb2dyYW0gY291bnRlciwgb3IgYXMKLQl0aGUgcHJlZml4IGZvciBhIGhleCBjb25zdGFudC4gIFRyZWF0ICUgYXMgdGhlIHByZWZpeCBmb3IgYSBiaW5hcnkKLQljb25zdGFudCBhbmQgQCBhcyB0aGUgcHJlZml4IGZvciBhbiBvY3RhbCBjb25zdGFudC4gIFRyZWF0IDogYXMKLQl0aGUgcHJlZml4IGZvciBhIGhleCBjb25zdGFudC4KLQkob3BfZW5jb2RpbmcpOiBTZXQgJyInIHRvIE9fYml0X25vdCwgJzwnIHRvIE9fbHQsIGFuZCAnPicgdG8gT19ndC4KLQkob3BfcmFuayk6IE5vIGxvbmdlciBjb25zdC4gIENoYW5nZSByYW5rIHZhbHVlcy4KLQkoZXhwcl9iZWdpbik6IE5ldyBmdW5jdGlvbi4KLQkob3BlcmF0b3IpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShleHByKTogVXNlIG9wZXJhdG9yLiAgRG9uJ3QgYm90aGVyIHRvIG1lbnRpb24gdGhlIG9wZXJhdG9yIGluCi0Jd2FybmluZ3MuICBSZW1vdmUgYm9ndXMgI2lmIDAgY29kZS4gIEhhbmRsZSBuZXcgb3BlcmF0b3JUIHZhbHVlcy4KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBJbiBNUkkgbW9kZSwgYWNjZXB0IHVuZGVyc2NvcmVzCi0JYXJvdW5kIHRoZSBleHBvbmVudCBpbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLgotCSogc3ltYm9scy5oIChzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHN5bWJvbF9jcmVhdGUpOiBDaGVjayBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlLgotCShzeW1ib2xfZmluZF9iYXNlKTogTGlrZXdpc2UuCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCShwcmludF9leHByXzEpOiBMaWtld2lzZS4KLQkoU19JU19MT0NBTCk6IEluIE1SSSBtb2RlLCBuYW1lcyBiZWdpbm5pbmcgd2l0aCB0d28gJz8nIGNoYXJhY3RlcnMKLQlhcmUgbG9jYWwuCi0KLVR1ZSBBdWcgIDEgMTE6MzU6MTggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogTWFrZSBzb21lIGVycm9yIG1lc3NhZ2VzIG1vcmUKLQlleHBsaWN0LgotCi1Nb24gSnVsIDMxIDIxOjQwOjQ3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JU2F0IEp1bCAyOSAxODo1NToyMyAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoQ09QWV9TSE9SVCwgQ09QWV9MT05HLCBQVVRfU0hPUlQsIFBVVF9MT05HKToKLQlNYWtlIGV4cGFuc2lvbiBiZSBzYWZlIGZvciB1c2UgaW4gZXhwcmVzc2lvbnMuCi0JKFBVVF9DT1VOVEVEX1NUUklORyk6IEJyYWNrZXQgZXhwYW5zaW9uIHdpdGggYGRvIHsuLi59IHdoaWxlICgwKScKLQlyYXRoZXIgdGhhbiBqdXN0IGB7Li4ufScuCi0KLU1vbiBKdWwgMzEgMTg6MTk6MjYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChtYWluKTogUGFyc2UgLUkgb3B0aW9uLgotCShkb19pbmNsdWRlKTogTG9vayB0aHJvdWdoIGluY2x1ZGUgbGlzdC4KLQkqIGdhc3AuYyAoY2hhbmdlX2Jhc2UpOiBEb24ndCBtb2RpZnkgbnVtYmVycyBpbiBzdHJpbmdzLiAKLQotTW9uIEp1bCAzMSAxMjoxNjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUuICBGcm9tIE5pY2xhcwotCUFuZGVyc3NvbiA8bmljYW5AaWRhLmxpdS5zZT4uCi0KLVRodSBKdWwgMjcgMjA6NDc6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgZG8gZnVydGhlciBwY3JlbAotCXByb2Nlc3NpbmcgYWZ0ZXIgY29udmVydGluZyBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZQotCXNhbWUgc2VnbWVudC4gIEZyb20gSmltIFdpbHNvbi4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbGludXhvbGRsZCk6IEFkZCBhcyBzeW5vbnltIGZvcgotCWkzODYtKi1saW51eCphb3V0Ki4gIEZyb20gRnJlZCBGaXNoLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEp1bCAyNyAxNjoxNDo1NiAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoZW51bSBwc190eXBlIHtwc19URVhULHBzX0RBVEEscHNfQ09NTU9OLAotCXBzX0NPTlNUfSk6IE5ldyBjb25zdGFudHMuCi0JKFZNU19Qc2VjdF9TcGVjKTogVXNlIHRoZW0gaW5zdGVhZCBvZiBsaXRlcmFsIHN0cmluZ3MuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSwgZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBBZGp1c3QgY2FsbGVycy4KLQotV2VkIEp1bCAyNiAxODozMTozNSAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoY29uc3RfZmxhZyk6IENoYW5nZSBmcm9tIGNoYXIgdG8gdW5zaWduZWQgY2hhci4KLQkqIGNvbmZpZy9vYmotdm1zLmggKGNvbnN0X2ZsYWcpOiBEaXR0by4KLQkoc3RydWN0IG5saXN0KTogUmVwbGFjZSB1bmlvbiBuX3VuIGFuZCBuX3VuLntuX25hbWUsbl9uZXh0LG5fc3RyeH0KLQlmaWVsZHMgd2l0aCBqdXN0IG5fbmFtZTsgZGVsZXRlIGZpZWxkIG5fdmFsdWU7IGNoYW5nZSBuX290aGVyIGZyb20KLQljaGFyIHRvIHVuc2lnbmVkIGNoYXIgYW5kIG5fZGVzYyBmcm9tIHNob3J0IHRvIGludDsgaW5zZXJ0IGV4cGxpY2l0Ci0JcGFkZGluZyBmb3IgYWxpZ25tZW50LgotCi1Nb24gSnVsIDI0IDIwOjA2OjE3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHN0cnVjdCBzZWdfaW5mb190cmFzaCk6IE1ha2UgYml0ZmllbGQgdHlwZXMgdmFsaWQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTG9jYWwgYWRkX251bWJlciBzaG91bGQgbm90Ci0JYmUgZGVjbGFyZWQgcmVnaXN0ZXIgc2luY2UgaXRzIGFkZHJlc3MgaXMgdGFrZW4gZm9yCi0JTURfQVBQTFlfRklYMy4KLQotCUZyaSBKdWwgMjEgMTU6Mjg6MTggMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQlTcGxpdCBodWdlIHZtc193cml0ZV9vYmplY3RfZmlsZSByb3V0aW5lIGludG8gbWFuYWdhYmxlIHBpZWNlcy4KLQotCSogY29uZmlnL29iai12bXMuYyAodm1zX2ZpeHVwX3RleHRfc2VjdGlvbiwgc3ludGhlc2l6ZV9kYXRhX3NlZ21lbnQsCi0Jdm1zX2ZpeHVwX2RhdGFfc2VjdGlvbiwgZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnksIGxvY2FsX3N5bWJvbHNfRFNULAotCXZtc19idWlsZF9EU1QpOiBOZXcgcm91dGluZXMuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgdGhlbS4KLQkoc3RydWN0IHZtc19vYmpfc3RhdGUpOiBOZXcgZmlsZSBzY29wZSB2YXJpYWJsZSB1c2VkIGJ5IHRoZSBhYm92ZS4KLQotTW9uIEp1bCAyNCAxNDoxMDoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInVzZXMiLgotCShzX3VzZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaF9jb2ZmX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfY29udmVydF9mcmFnKTogQ2FsbCBzdWJzZWdfY2hhbmdlIGJlZm9yZSBjYWxsaW5nIGZpeF9uZXcuCi0JKHNoX2hhbmRsZV9hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkoU1dJVENIX1RBQkxFKTogRGVmaW5lLgotCShzaF9mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgUl9TSF9VU0VTLCBSX1NIX0NPVU5UIGFuZCBSX1NIX0FMSUdOLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IExpa2V3aXNlLiAgQWxzbyBoYW5kbGUgc3dpdGNoIHRhYmxlCi0JZW50cmllcy4KLQkqIGNvbmZpZy90Yy1zaC5oIChIQU5ETEVfQUxJR04pOiBEZWZpbmUuCi0JKHNoX2hhbmRsZV9hbGlnbik6IERlY2xhcmUuCi0JKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0JKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiBEZWNsYXJlLgotCShUQ19DT1VOVF9SRUxPQyk6IFNpbXBsaWZ5OyByZWx5IG9uIFRDX0ZPUkNFX1JFTE9DQVRJT04gaW5zdGVhZC4KLQkodGNfZnJvYl9maWxlKTogRGVmaW5lLgotCShzaF9jb2ZmX2Zyb2JfZmlsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHRjX2Zyb2JfZmlsZSBpZiBpdAotCWlzIGRlZmluZWQuCi0JKGZpeHVwX21kZXBzKTogQ2FsbCBIQU5ETEVfQUxJR04gaWYgaXQgaXMgZGVmaW5lZC4KLQkoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIHRvIGRlY2lkZSB3aGV0aGVyIHRvCi0JY2xlYXIgdGhlIHN5bWJvbCBmaWVsZHMgb2YgZml4UC4KLQotRnJpIEp1bCAyMSAyMjozODowMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IEFkZCBzdXBwb3J0IGZvciBSX1BQQ19TREFSRUwKLQlyZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogRGl0dG8uCi0KLVRodSBKdWwgMjAgMTM6MDA6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFJlbmFtZSBhcmd1bWVudCBzZWcgdG8gc2VjLAotCXNpbmNlIHNlZyBpcyBhIG1hY3JvIG5hbWUgaW4gdGhpcyBmaWxlLgotCi0JKiBjb25maWd1cmUuaW4gKGFybS0qLXJpc2NpeCopOiBEb24ndCBzZXQgZW11bGF0aW9uLgotCi1XZWQgSnVsIDE5IDE2OjA4OjI5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChURV9QRSk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoQllURV9PUkRFUik6IERlbGV0ZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IFByb3ZpZGUgdmFsdWUgZm9yIE9CSl9DT0ZGIGFuZCBURV9QRS4KLQkoQVJNX0JJX0VORElBTik6IERlZmluZSBpZiBPQkpfQ09GRiBhbmQgVEVfUEUuCi0JKiBjb25maWcvdGMtYXJtLmMgKGJ5dGVfb3JkZXIpOiBEZWxldGUuCi0JKG1kX251bWJlcl90b19jaGFycyk6IFJlZmVyZW5jZSB0YXJnZXRfYmlnX2VuZGlhbiwgbm90IGJ5dGVfb3JkZXIuCi0JKG1kX2NoYXJzX3RvX251bWJlcik6IExpa2V3aXNlLgotCShtZF9sb25nb3B0cyk6IEFkZCAtRUIvLUVMIGlmIEFSTV9CSV9FTkRJQU4uCi0JKG1kX3BhcnNlX29wdGlvbnMpOiBSZWNvZ25pemUgLUVCLy1FTC4KLQkobWRfc2hvd191c2FnZSk6IExpc3QgLUVCLy1FTC4KLQotV2VkIEp1bCAxOSAxMTo0OToyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAocHJvY2Vzc19hc3NpZ25zKTogVXNlIHRvdXBwZXIgYmVmb3JlIGNvbXBhcmluZyBhZ2FpbnN0Ci0JdXBwZXIgY2FzZSBsZXR0ZXIuCi0JKHdoYXRjb25kKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9yZWxheCk6IFJlbmFtZSBmcm9tIHJlbGF4LCBhbmQgbWFrZSBnbG9iYWwuCi0JUmVuYW1lZCBhbGwgdXNlcy4KLQkoaW5zZXJ0KTogUGFzcyBhIHNpemUgb2YgMiwgbm90IDQuCi0JKGJ1aWxkX3JlbGF4KTogUmVtb3ZlIHVudXNlZCBsZW4gdmFyaWFibGUuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC1saXR0bGUgb3B0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBBZGQgc2VnVCBhcmd1bWVudC4gIFJld3JpdGUgdG8gZ2VuZXJhdGUgcmVsb2NzCi0JcmF0aGVyIHRoYW4gdG8gZ2VuZXJhdGUgY29tcGxldGUgaW5zdHJ1Y3Rpb25zIGhlcmUuCi0JKG1kX2FwcGx5X2ZpeCk6IEFkanVzdCBhbmQgY2xhcmlmeSBSX1NIX1BDUkVMSU1NOEJZNCBjYXNlIGZvcgotCWNoYW5nZXMgaW4gaW5zZXJ0IGFuZCBtZF9wY3JlbF9mcm9tLiAgQWRkIGNhc2VzIGZvciBSX1NIX1BDRElTUAotCWFuZCBSX1NIX1BDRElTUDhCWTIuCi0JKG1kX3BjcmVsX2Zyb20pOiBEb24ndCBzdWJ0cmFjdCAxLCBhZGQgMi4KLQkodGNfY29mZl9maXgycnR5cGUpOiBSZW1vdmUuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXNoLmggKFRDX0NPRkZfRklYMlJUWVBFKTogSnVzdCByZXR1cm4gZnhfcl90eXBlLgotCShzaF9yZWxheCk6IERlY2xhcmUuCi0JKFRDX0NPVU5UX1JFTE9DKTogSWYgcmVsYXhpbmcsIGNvdW50IFBDIHJlbGF0aXZlIHJlbG9jcy4KLQkoVENfUkVMT0NfTUFOR0xFKTogRGVmaW5lLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0JKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBEZWNsYXJlLgotCSogdGMuaCAobWRfY29udmVydF9mcmFnKTogQWRkIHNlZ1QgcGFyYW1ldGVyIHRvIG5vbiBCRkRfQVNTRU1CTEVSCi0JZGVjbGFyYXRpb24uCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogQWRkIHNlYyBhcmd1bWVudCB0byBub24KLQlCRkRfQVNTRU1CTEVSIHZlcnNpb24uICBQYXNzIGl0IHRvIG1kX2NvbnZlcnRfZnJhZy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBQYXNzIFNFR19URVhUIHRvIGN2c19mcmFnX3RvX2ZpbGwuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IFBhc3Mgc2VnbWVudCBpbmZvIHRvCi0JVENfUkVMT0NfTUFOR0xFLgotCShmaXh1cF9tZGVwcyk6IFBhc3Mgc2VnbWVudCB0eXBlIHRvIG1kX2NvbnZlcnRfZnJhZy4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEFkZCBzZWdUIGFyZ3VtZW50LgotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWg4NTAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTg2MC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5oIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy10YWhvZS5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdzY1LmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXo4ay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChUQ19SRUxPQ19NQU5HTEUpOiBBZGQgc2VnbWVudCBhcmd1bWVudC4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChUQ19SRUxPQ19NQU5HTEUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy13NjUuaCAoVENfUkVMT0NfTUFOR0xFKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtejhrLmggKFRDX1JFTE9DX01BTkdMRSk6IExpa2V3aXNlLgotCi1Nb24gSnVsIDE3IDE1OjAyOjU0IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpOiBEZWxldGUgYXMgZmlsZQotCXNjb3BlIHZhcmlhYmxlcy4KLQkoRGVmaW5lX1JvdXRpbmUsIERlZmluZV9Mb2NhbF9TeW1ib2xzKTogVGFrZSBDdXJyZW50X1JvdXRpbmUgYW5kCi0JVGV4dF9Qc2VjdCBhcyBhcmd1bWVudHMuCi0JKFZNU19EQkdfRGVmaW5lX1JvdXRpbmUpOiBEZWxldGUuCi0JKFZNU19UQlRfQmxvY2tfRW5kKTogQ2hhbmdlIGBTaXplJyBhcmd1bWVudCBmcm9tIGludCB0byB2YWx1ZVQuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogdGV4dCBhbmQgZGF0YSBmaXh1cCBsb29wcyk6IERpZmZlcmVuY2UKLQlvZiB0d28gc3ltYm9scyBoYXMgdHlwZSBvZmZzZXRUIHJhdGhlciB0aGFuIGludDsgY29udmVydCB3aXRoCi0JbWRfbnVtYmVyX3RvX2NoYXJzIGJlZm9yZSBwYXNzaW5nIHRvIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YS4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiBkZWJ1ZyBzeW1ib2wgbG9vcCk6IENhbGwgRGVmaW5lX1JvdXRpbmUKLQlpbnN0ZWFkIG9mIFZNU19EQkdfRGVmaW5lX1JvdXRpbmUuCi0KLVNhdCBKdWwgMTUgMDA6MDE6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBBZGQgQGZpeHVwIHNvIHRoYXQgdGhlCi0JY29tcGlsZXIgY2FuIG1hcmsgd2hpY2ggcmVsb2NzIG5vdCB0byBjb21wbGFpbiBhYm91dCB3aXRoCi0JLW1yZWxvY2F0YWJsZS4KLQkocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBZGQgLmZpeHVwIHRvIHNlY3Rpb25zIG5vdCB0byBjb21wbGFpbgotCWFib3V0LCBhbmQgYWxzbyBkb24ndCBjb21wbGFpbiBmb3IgQkZEX1JFTE9DX0NUT1IgcmVsb2NhdGlvbnMgaW4KLQl3cml0YWJsZSBub24tY29kZSBzZWdtZW50cy4KLQkobWRfYXBwbHlfZml4KTogVHJlYXQgQkZEX1JFTE9DX0NUT1IganVzdCBsaWtlIEJGRF9SRUxPQ18zMi4KLQotRnJpIEp1bCAxNCAxOTo1NDoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgU1BBUkMgU3VuT1MgUElDOgotCSogY29uZmlnL3RjLXNwYXJjLmggKHNwYXJjX3BpY19jb2RlKTogQWx3YXlzIGRlY2xhcmUsIG5vdCBqdXN0Ci0Jd2hlbiBPQkpfRUxGLgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUgd2hlbiBPQkpfQU9VVC4KLQkodGNfZml4X2FkanVzdGFibGUpOiBOZXcgZGVmaW5pdGlvbiBmb3IgT0JKX0FPVVQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfcGljX2NvZGUpOiBBbHdheXMgZGVmaW5lLCBub3QganVzdCB3aGVuCi0JT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4KTogQWRqdXN0IHJlbG9jIGFkZGVuZCBmb3IgT0JKX0FPVVQgYW5kIFBJQy4gIEluCi0JQkZEX1JFTE9DXzMyX1BDUkVMX1MyIGNhc2UsIGRvbid0IGluY3JlbWVudCB2YWwgZm9yIGFuIGV4dGVybmFsCi0Jc3ltYm9sIHdoZW4gUElDLgotCSh0Y19nZW5fcmVsb2MpOiBHZW5lcmF0ZSBkaWZmZXJlbnQgUElDIHJlbG9jcyB3aGVuIE9CSl9BT1VULCBhcwotCXdlbGwgYXMgd2hlbiBPQkpfRUxGLgotCShtZF9zaG9ydG9wdHMpOiBJZiBPQkpfQU9VVCwgaW5jbHVkZSBgaycuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIE9CSl9BT1VULCBoYW5kbGUgJ2snLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtayBpZiBPQkpfQU9VVCwgYW5kIC1LUElDIGlmIE9CSl9FTEYuCi0JKG1kX3BjcmVsX2Zyb20pOiBEb24ndCBhZGQgaW4gc2l6ZSBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sIHdoZW4KLQlQSUMuCi0KLVRodSBKdWwgMTMgMjE6MTY6NDMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFVOREVGSU5FRF9ESUZGRVJFTkNFX09LKTogRGVmaW5lIGZvciBTT00uCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNldCBzeV91c2VkX2luX3JlbG9jIGZvciBib3RoCi0Jc3ltYm9scyBpbiBhIGZpeHVwIHdoZXJlIGEgZGVmaW5lZCBzeW1ib2wgaXMgc3VidHJhY3RlZCBmcm9tIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCAod2hlbiBVTkRFRklORURfRElGRkVSRU5DRV9PSyBpcyBkZWZpbmVkKS4KLQkoZml4dXBfc2VnbWVudCk6IERvIG5vdGhpbmcgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGlmCi0JVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sgaXMgZGVmaW5lZC4KLQotV2VkIEp1bCAxMiAyMzozMzo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogU3VwcG9ydCBNRF9BUFBMWV9GSVgzLgotCi1XZWQgSnVsIDEyIDAxOjEyOjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXhfbmV3KTogVXNlIGludCwgbm90IHNob3J0IGludCwgZm9yIGFyZ3VtZW50IHR5cGUuCi0JKGZpeF9uZXdfZXhwKTogRGl0dG8uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotcmlzY2l4Kik6IERvbid0IHNldCBlbXVsYXRpb25zLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChOT19FQ09GRl9ERUJVR0dJTkcpOiBEZWZpbmUgaWYgRUNPRkZfREVCVUdHSU5HCi0Jd2Fzbid0IHByZXZpb3VzbHkgZGVmaW5lZC4KLQkoc19leHRlcm4pOiBEb24ndCBzZXQgZWNvZmZfZXh0ZXJuX3NpemUgaWYgTk9fRUNPRkZfREVCVUdHSU5HLgotCShub3BpY19uZWVkX3JlbGF4KTogRG9uJ3QgY2hlY2sgaXQgaWYgTk9fRUNPRkZfREVCVUdHSU5HLgotCShtYWNyb19idWlsZCkgWyFVU0VfU1REQVJHXTogRG9uJ3QgdXNlIHZhcmlhZGljIHByb3RvdHlwZS4KLQkobWlwc19sb2NhbF9sYWJlbCkgW05PX0VDT0ZGX0RFQlVHR0lOR106IERvbid0IHByZXNlcnZlIHBvdGVudGlhbAotCUVDT0ZGIGRlYnVnZ2luZyBzeW1ib2xzLgotCi0JKiBlbXVsLmggKHN0cnVjdCBlbXVsYXRpb24pOiBVc2UgdW5zaWduZWQsIG5vdCB1bnNpZ25lZCBjaGFyLCBmb3IKLQliaXRmaWVsZHMuCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWFybS5jIChzeW1ib2xfbWFrZV9lbXB0eSkgW0JGRF9BU1NFTUJMRVJdOiBTZXQKLQl1ZGF0YS5wLCBub3QgdWRhdGEuCi0KLVR1ZSBKdWwgMTEgMTQ6MzA6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC1tNDAxMCBhbmQgLW1uby00MDEwLgotCi1UdWUgSnVsIDExIDE0OjI4OjU1IDE5OTUgIEplZmYgU3BpZWdlbCAgPGplZmZzQGxzaWwuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzQwMTApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbnRlcmxvY2tzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBDaGVjayBmb3IgYSBjcHUgb2YgInI0MDEwIi4gIFNldCBtaXBzXzQwMTAgY29ycmVjdGx5LgotCUlmIG1pcHNfNDY1MCBvciBtaXBzXzQwMTAsIHNldCBpbnRlcmxvY2tzLgotCShhcHBlbmRfaW5zbik6IENoZWNrIGludGVybG9ja3MsIG5vdCBtaXBzXzQ2NTAuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBMaWtld2lzZS4KLQkobWlwc19pcCk6IE9ubHkgcGVybWl0IElOU05fNDAxMCBpbnN0cnVjdGlvbnMgaWYgbWlwc180MDEwLgotCShtZF9sb25nb3B0cyk6IEFkZCAibTQwMTAiIGFuZCAibm8tbTQwMTAiLgotCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgLW1jcHU9cjQwMTAuICBIYW5kbGUgLW00MDEwIGFuZAotCS1uby1tNDAxMC4KLQkobWRfc2hvd191c2FnZSk6IERvY3VtZW50IC1tNDAxMCBhbmQgLW5vLW00MDEwLgotCi1UdWUgSnVsIDExIDEzOjIyOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoc3RydWN0IGVmZHIpOiBBZGQgbmV3IGZpZWxkIGZha2UuCi0JKGluaXRfZmlsZSk6IEluaXRpYWxpemUgZmFrZS4KLQkoYWRkX2ZpbGUpOiBBZGQgbmV3IHBhcmFtZXRlciBmYWtlLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShlY29mZl9idWlsZF9kZWJ1Zyk6IERvbid0IHdhcm4gYWJvdXQgYSBtaXNzaW5nIC5lbmQgZm9yIGEgZmFrZQotCWZpbGUuCi0KLU1vbiBKdWwgMTAgMTY6MDE6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBTcGxpdCBvdXQgbW9zdCBjcHUgY2hhcHRlcnMuLi4KLQkqIGRvYy9jLSoudGV4aTogLi4udG8gaGVyZS4KLQotCSogcmVhZC5jIChwb19oYXNoKTogTm93IHN0YXRpYy4KLQotTW9uIEp1bCAxMCAxMzo0NzoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSC5KLiBMdSA8aGpsQG55bmV4c3QuY29tPjoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgZnJvbSBtZF9hcHBseV9maXgxLgotCUFjY2VwdCBwb2ludGVyIHRvIHZhbHVlIGFuZCBzZWdtZW50LiAgRml4IE9CSl9FTEYgUENSRUwgY2FzZSB0bwotCWhhbmRsZSBnbG9iYWwgZGVmaW5lZCBzeW1ib2xzIGNvcnJlY3RseS4KLQkobWRfYXBwbHlfZml4KTogUmVtb3ZlIGJvdGggdmVyc2lvbnMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuaW46IFdoZW4gc3dpdGNoaW5nIG9uICR7Y3B1fSwgdXNlICR7Y3B1fSwgbm90Ci0JJFt0YXJnZXRfY3B1fSwgaW4gZGVmYXVsdCBjYXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgSnVsICA4IDEzOjI3OjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENhbGwgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgb24KLQlzdWJfc3ltYm9sUCwgaW4gY2FzZSBpdCBpc24ndCBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCi1GcmkgSnVsICA3IDExOjE3OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2xjb21tKTogRm9yIC5sY29tbSAxLCBzZXQgYWxpZ24gdG8gMCwgbm90IDEuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogSWYgU0ZfR0VUX0ZVTkNUSU9OLCBzZXQKLQlCU0ZfRlVOQ1RJT04uCi0JKHN5bWJvbF9nbG9iYWxQLCBzeW1ib2xfZ2xvYmFsX2xhc3RQKTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKHlhbmtfc3ltYm9scyk6IFNvcnQgZGVmaW5lZCBnbG9iYWwgc3ltYm9scyB0byB0aGUgZW5kLCBqdXN0Ci0JYmVmb3JlIHRoZSB1bmRlZmluZWQgc3ltYm9scy4KLQkoZ2x1ZV9zeW1ib2xzKTogQWRkIHR3byBhcmd1bWVudHMsIGFuZCB1c2UgdGhlbSBpbnN0ZWFkIG9mCi0JcmVmZXJyaW5nIGRpcmVjdGx5IHRvIGdsb2JhbCB2YXJpYWJsZXMuCi0JKGNyYXdsX3N5bWJvbHMpOiBDYWxsIGdsdWVfc3ltYm9scyB0d2ljZSwgb25jZSBmb3IgZGVmaW5lZCBnbG9iYWxzCi0JYW5kIG9uY2UgZm9yIHVuZGVmaW5lZC4gIEFkZCBjb3JyZXNwb25kaW5nIGtub3cgY2FsbHMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBbHdheXMgYWNjZXB0IFx2LiAgRG9uJ3QgbWFrZSBpdAotCWNvbmRpdGlvbmFsIG9uIEJBQ0tTTEFTSF9WLgotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoQkFDS1NMQVNIX1YpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChCQUNLU0xBU0hfVik6IERvbid0IGRlZmluZS4KLQotCUFkZCBTUEFSQyBFTEYgUElDIHN1cHBvcnQuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogUGFzcyBmaXhQIHRvIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCwKLQlub3QgZml4UC0+Znhfcl90eXBlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX3BpY19jb2RlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4gCi0JKG1kX2FwcGx5X2ZpeCk6IElmIGdlbmVyYXRpbmcgUElDLCBhZGp1c3QgZnhfYWRkbnVtYmVyIGZvciBhbnkgbm9uCi0JUEMgcmVsYXRpdmUgcmVsb2MuCi0JKHRjX2dlbl9yZWxvYyk6IElmIGdlbmVyYXRpbmcgUElDLCBhZGp1c3QgdmFyaW91cyByZWxvYyB0eXBlcy4KLQlSZW1vdmUgZnhfcGNyZWwgYXNzZXJ0LCBzaW5jZSBpdCBpcyBubyBsb25nZXIgdHJ1ZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC1LIFBJQy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChzcGFyY19waWNfY29kZSk6IERlY2xhcmUgaWYgT0JKX0VMRi4KLQkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lIGlmIE9CSl9FTEYuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBQSUMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBUYWtlIGEgZml4cCwgbm90IGEKLQlyZWxvYyB0eXBlLgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBBZGQgZGVwZW5kZW5jeSBvbiBjb25mLmluLCBzbyB0aGF0IGNvbmYKLQlpcyByZWJ1aWx0IHdoZW4gY29uZi5pbiBjaGFuZ2VzLgotCi1UaHUgSnVsICA2IDE2OjQ5OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBBbGwgZmlsZXM6IFVwZGF0ZWQgRlNGIGFkZHJlc3MuCi0KLVRodSBKdWwgIDYgMTY6MzA6MzQgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IERvbid0IGNvbGxhcHNlIG11bHRpcGxlIC5maWxlIGNvbW1hbmRzIGludG8KLQlhIHNpbmdsZSBmaWxlIHN0cnVjdHVyZS4KLQkoZWNvZmZfYnVpbGRfbGluZW5vKTogU2V0IGlsaW5lQmFzZSB0byBzdW0gb2YgcHJldmlvdXMgZmlsZSdzCi0JaWxpbmVCYXNlIGFuZCBjbGluZS4KLQotVGh1IEp1bCAgNiAxMjo1NDoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gSmVycnkgQmxha2VseSA8Z2VycnlfYmxha2xleUB3ZWxsZmxlZXQuY29tPjoKLQkqIGFzLmMgKGxpc3RpbmdfZmlsZW5hbWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzaG93X3VzYWdlKTogTWVudGlvbiAtYT1maWxlLgotCShwYXJzZV9hcmdzKTogU3VwcG9ydCA9IG9wdGlvbiBvZiAtYSB0byBzZXQgbmFtZSBvZiBsaXN0aW5nIGZpbGUuCi0JKG1haW4pOiBQYXNzIGxpc3RpbmdfZmlsZW5hbWUgdG8gbGlzdGluZ19wcmludC4KLQkqIGxpc3RpbmcuYyAobGlzdF9maWxlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodmFyaW91cyk6IFJlcGxhY2UgcHJpbnRmIHdpdGggZnByaW50ZiB0byBsaXN0X2ZpbGUuCi0JKGxpc3RpbmdfcHJpbnQpOiBJZiBuYW1lIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCBvcGVuIGl0IGFzCi0JbGlzdF9maWxlLgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtYT1maWxlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogRG9uJ3QgcGVybWl0IHJlZGVmaW5pdGlvbiwgZXZlbgotCWlmIHRoZSBzeW1ib2wgd2FzIGFscmVhZHkgaW4gYnNzX3NlY3Rpb24uICBGaXggd2FybmluZyBtZXNzYWdlLgotCi0JKiBsaXN0aW5nLmMgKHN0cnVjdCBmaWxlX2luZm9fc3RydWN0KTogUmVuYW1lIGVuZF9wZW5kaW5nIGZpZWxkIHRvCi0JYXRfZW5kLgotCShmaWxlX2luZm8pOiBJbml0aWFsaXplIGF0X2VuZCwgbm90IGVuZF9wZW5kaW5nLgotCShidWZmZXJfbGluZSk6IElmIGF0X2VuZCBzZXQsIGp1c3QgcmV0dXJuIGltbWVkaWF0ZWx5LiAgRG9uJ3QKLQl3b3JyeSBhYm91dCBlbmRfcGVuZGluZyBjYXNlcy4gIFNldCBhdF9lbmQgd2hlbiBFT0YgaXMgcmVhZC4KLQkocHJpbnRfc291cmNlKTogQ2hlY2sgYXRfZW5kLCBub3QgZW5kX3BlbmRpbmcuCi0JKGxpc3RpbmdfbGlzdGluZyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoYWxwaGFfZG9fYWxpZ24pOiBEb24ndCBkZWNsYXJlLgotCShtZF9kb19hbGlnbik6IERvbid0IGRlZmluZS4KLQkodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KLQkoYWxwaGFfZGVmaW5lX2xhYmVsKTogRGVjbGFyZS4KLQkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWZpbmUuCi0JKGFscGhhX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChpbnNuX2xhYmVsKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXV0b19hbGlnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBjYXNlcyBmb3IgLnRleHQsIC5kYXRhLCAuYWxpZ24sIC5ieXRlLAotCS5od29yZCwgLmludCwgLmxvbmcsIC5vY3RhLCAucXVhZCwgLnNob3J0LCAud29yZCwgLmRvdWJsZSwgLmZsb2F0LAotCWFuZCAuc2luZ2xlLiAgQ2hhbmdlIC50X2Zsb2F0aW5nLCAuc19mbG9hdGluZywgLmZfZmxvYXRpbmcsCi0JLmdfZmxvYXRpbmcsIGFuZCAuZF9mbG9hdGluZyB0byB1c2Ugc19hbHBoYV9mbG9hdF9jb25zIHJhdGhlciB0aGFuCi0JZmxvYXRfY29ucy4KLQkoc19hbHBoYV90ZXh0LCBzX2FscGhhX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc19yZGF0YSwgc19zZGF0YSk6IENsZWFyIGluc25fbGFiZWwgYW5kIHNldCBhdXRvX2FsaWduLgotCShzX2dwcmVsMzIpOiBJZiBhdXRvX2FsaWduLCBhbGlnbi4gIENsZWFyIGluc25fbGFiZWwuCi0JKGVtaXRfaW5zbik6IENsZWFyIGluc25fbGFiZWwuCi0JKHNfYWxwaGFfYWxpZ24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9hbGlnbik6IE1ha2Ugc3RhdGljLiAgVGFrZSBsYWJlbCBhcmd1bWVudC4KLQkoYWxwaGFfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX2FscGhhX2NvbnMsIHNfYWxwaGFfZmxvYXRfY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShhbHBoYV9kZWZpbmVfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBKdWwgIDUgMjI6NDk6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmYuaW46IFJlZ2VuZXJhdGUgd2l0aCBhdXRvcmVjb25mLgotCi0JTW9uIEp1bCAgMyAxOTo0Nzo1MyAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKTogVXNlIGZ1bGwgcHJvdG90eXBlLgotCSh2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwsIHRjX2Zyb2JfbGFiZWwpOiBNb3ZlIHRoZW0gdG8gZ3JvdXAKLQl3aXRoIG90aGVyIHByb3RvdHlwZXMuCi0JW1dBTlRfVk1TX09CSl9ERUZTXTogT25seSBkZWZpbmUgdGhlIG1hbnkgT0JKX3gsIERCR194LCBhbmQgRFNUX3gKLQltYWNyb3Mgd2hlbiB0aGlzIGlzIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLXZtcy5jOiBGdWxseSBwcm90b3R5cGUgYWxsIGxvY2FsIGZ1bmN0aW9ucy4KLQlbc3ltYm9sUywgZnJhZ1NdOiBVc2UgY29uc2lzdGVudGx5IGluc3RlYWQgb2YgdGhlaXIgc3RydWN0IHRhZ3MuCi0JW1dBTlRfVk1TX09CSl9ERUZTXTogRGVmaW5lIHRoaXMuCi0JKHNfY29uc3QpOiBNYWtlIGRlZmluaXRpb24gY29ycmVjdGx5IG1hdGNoIGFjdHVhbCB1c2FnZS4KLQkoVk1TX3N0YWJfcGFyc2UpOiBNYWtlIGBleHBlY3RlZF90eXBlJyBhcmcgYmUgaW50IHJhdGhlciB0aGFuIGNoYXIuCi0JKGdldF9WTVNfdGltZV9vbl91bml4KTogRGVmaW5lIGFzIGBzdGF0aWMgdm9pZCcuCi0JKGhhc2hfc3RyaW5nKTogTWFrZSBkZWZpbml0aW9uIG1hdGNoIGFjdHVhbCB1c2FnZTsgYXJndW1lbnQgaXMKLQlgY2hhciBjb25zdCAqJyByYXRoZXIgdGhhbiBgdW5zaWduZWQgY2hhciAqJy4KLQkoVk1TX0Nhc2VfSGFja19TeW1ib2wsIFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcywgVk1TX1BzZWN0X1NwZWMsCi0JVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyk6IERlY2xhcmUgc3RyaW5nIGFyZ3MgYXMgYGNvbnN0IGNoYXIgKicuCi0JW0lTX0dYWF9WVEFCTEVdOiBOZXcgbWFjcm8uCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogR1NEIGxvb3ApOiBVc2UgaXQuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogZGF0YSBzZWdtZW50KTogUmVvcmdhbml6ZSBgZmlsbCcgbG9vcC4KLQotV2VkIEp1bCAgNSAxMjowMTo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG9ydG9wdHMpOiBBZGQgIks6IiBpZiBPQkpfRUxGLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiBPQkpfRUxGLCBjaGVjayBmb3IgLUsuICBEaWUgaWYgLUsgUElDLCBzaW5jZQotCVBJQyBjb2RlIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQ2hhbmdlIHN0ZF9zaG9ydG9wdHMgdG8gYmUgYW4gYXJyYXkgcmF0aGVyCi0JdGhhbiBhIGNvbnN0YW50IHN0cmluZy4gIE9ubHkgaW5jbHVkZSAnSycgaWYgV09SS0lOR19ET1RfV09SRCBpcwotCW5vdCBkZWZpbmVkLiAgT25seSBjaGVjayBmb3IgJ0snIGluIHRoYXQgY2FzZSBhcyB3ZWxsLgotCSogYXMuaCAoZmxhZ193YXJuX2Rpc3BsYWNlbWVudCk6IE9ubHkgZGVjbGFyZSBpZiBXT1JLSU5HX0RPVF9XT1JECi0JaXMgbm90IGRlZmluZWQuCi0KLQkqIGNvbmYuaW46IEFkZCB1bmRlZiBvZiBIQVZFX1NCUksuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9saW5lKTogQ2FsbCBsaXN0aW5nX3NvdXJjZV9saW5lLCBpbgotCWJvdGggQkZEX0FTU0VNQkxFUiBhbmQgbm9uIEJGRF9BU1NFTUJMRVIgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uLgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX0VYVEVSTkFMKTogV2FybiBpZiBzeW1ib2wgaXMgd2Vhay4KLQkoU19DTEVBUl9FWFRFUk5BTCk6IExpa2V3aXNlLgotCShTX1NFVF9XRUFLKTogV2FybiBpZiBzeW1ib2wgaXMgZ2xvYmFsLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQKLQl0byBwdXQgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbnRvIGEgc2V0LgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIEBjb25maWd1cmVfaW5wdXRAOyBpdCdzIG5vdCBuZWVkZWQgaW4KLQlmaWxlcyBuYW1lZCBNYWtlZmlsZS4KLQotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIuc2V0IiBzbyB0aGF0IHRoZQotCWV4cGxpY2l0IHBzZXVkby1vcCB3b3Jrcywgd2hpbGUgY29udGludWluZyB0byB0cmVhdCAic2V0IiBhcyBhbgotCWluc3RydWN0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9kZWJ1Z2dpbmdfc2Vlbik6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9kZWYpOiBTZXQgZWNvZmZfZGVidWdnaW5nX3NlZW4uCi0JKGVjb2ZmX3N0YWIpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmg6IE1ha2UgaWRlbXBvdGVudC4KLQkoZWNvZmZfZGVidWdnaW5nX3NlZW4pOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBlY29mZi5oLgotCShtaXBzX2RlYnVnKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19zdHJpbmdlciwgc19taXBzX3NwYWNlKTogUmVtb3ZlIHVubmVlZGVkIGRlY2xhcmF0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSW4gY2FzZSAnZycsIHNldCBtaXBzX2RlYnVnIHRvIGRlYnVnZ2luZyBsZXZlbC4KLQkobWlwc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBDYWxsIG1pcHNfbG9jYWxfbGFiZWwuCi0JKG1pcHNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlLgotCi1XZWQgSnVsICA1IDAwOjU5OjIyIDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhcy5jIChtYWluKTogIE9ubHkgdXNlIHNicmsgd2hlbiBIQVZFX1NCUksgZGVmaW5lZC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCB0ZXN0IGZvciBzYnJrLgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB1c2luZyBhdXRvY29uZiAyLjQuCi0KLU1vbiBKdWwgIDMgMTU6NTg6MTYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKE1BWF9SRUxPQ19FWFBBTlNJT04pOiBCdW1wIHRvIDYuCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlCi0JcmVsb2NhdGlvbnMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byAocG9zc2libHkgZXh0ZXJuYWwpCi0Jc3ltYm9scy4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IEZvciBTT00sIHJlamVjdCByZWR1Y3Rpb25zIGludm9sdmluZwotCXRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyBmb3IgZXhwcmVzc2lvbnMKLQlpbnZvbHZpbmcgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuCi0KLU1vbiBKdWwgIDMgMTQ6MjI6NTkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlWy5pbl0gKGkzODYtKi13aW4zMik6IE5ldyBob3N0IGFuZCB0YXJnZXQuCi0KLVRodSBKdW4gMjkgMTc6MjU6NDMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIGxvbmcgZmlsZW5hbWVzIG5vbi1iZmQgY29mZi4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaWxlbmFtZV9saXN0X2hlYWQsIGZpbGVuYW1lX2xpc3RfdGFpbCk6IE5ldy4KLQkoeWFua19zeW1ib2xzKTogTm90aWNlIGFuZCByZWNvcmQgZmlsZW5hbWVzIHdoaWNoIGFyZSB0b28gbG9uZy4KLQkod19zdHJpbmdzKTogV3JpdGUgb3V0IGZpbGVuYW1lIHN0cmluZ3MuCi0JKGNfZG90X2ZpbGVfc3ltYm9scyk6IFB1dCBsb25nIGZpbGVuYW1lcyBvbnRvIGxpc3QuCi0KLVdlZCBKdW4gMjggMTc6MzM6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBQRSBkb2Vzbid0IHVzZQotCXRoZSBzdHJhbmdlIGNvbW1vbiBzeW1ib2wgZm9ybWF0IHRoYXQgb3RoZXIgMzg2cyBmb3JtYXRzCi0JZG8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9iZWdpbik6IElmIExFWF9BVCBkZWZpbmVkIHRoZW4KLQknQCcgaXMgaW4gdGhlIHNldCBvZiBpZGVudGlmaWVycy4KLQkoaTM4Nl9vcGVyYW5kKTogSWYgTEVYX0FULCB0aGVuIGRvbid0IGxvb2sgZm9yIEBnb3RvIHN0dWZmLgotCSogY29uZmlnL3RlLXBlLmg6IERlZmluZSBMRVhfQVQuCi0KLVdlZCBKdW4gMjggMTc6NDk6NTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChIOC81MDAgRmxvYXRpbmcgUG9pbnQpOiBJbmRpY2F0ZSB0aGF0IElFRUUgRlAKLQludW1iZXJzIGFyZSBmb3IgdGhlIHN0YW5kYXJkIGVtdWxhdGlvbiBjb2RlLgotCShTSCBGbG9hdGluZyBQb2ludCk6IERpdHRvLgotCShPdmVydmlldyk6IERlc2NyaWJlIG5ldyAtLWVtdWxhdGlvbiBvcHRpb24gZm9yIE1JUFMuCi0JKiBkb2MvKi5tNDogRGVsZXRlZC4KLQotVGh1IEp1biAyMiAxOToyNjoyNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU3VuIE1heSAgNyAxMTo1Mzo0MSBNRFQgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBpMzg2LSotbW9zcyogdGFyZ2V0LgotCi1UaHUgSnVuIDIyIDE0OjQxOjIzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYXN0IGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lCi0JYXJndW1lbnQgdG8gY2hhciAqIHRvIGF2b2lkIHdhcm5pbmcuCi0KLVdlZCBKdW4gMjEgMTg6MDc6NTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluc3dvcmQpOiBJbmNyZW1lbnQgdGhlIGZyYWcgb2Zmc2V0cy4KLQkoc3RydWN0IG02OGtfaXQpOiBBZGQgcmVsb2NbXS5wY3JlbF9maXggZmllbGQgdG8gaG9sZCBwYy1yZWwKLQlmaXh1cC4KLQkoYWRkX2ZpeCk6IEFjY2VwdCBhZGRpdGlvbmFsIHBhcmFtZXRlciwgdGhlIHBjLXJlbCBmaXh1cC4gQWxsCi0JY2FsbGVycyBjaGFuZ2VkLiAgRml4IG9mZnNldCBhZGRyZXNzIGlmIHdpZHRoID09ICdiJy4KLQkobTY4a19pcCkgW2Nhc2UgQUlORFhdOiBBbGxvdyBleHBsaWNpdCBzaXplIHNwZWMuICBEb24ndCBtYWtlIHRoZQotCW91dGVyIGRpc3BsYWNlbWVudCBwYy1yZWxhdGl2ZS4KLQkobWRfcGNyZWxfZnJvbSk6IE1ha2UgaXQgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGV4dGVuc2lvbiB3b3JkIG9mCi0JdGhlIG9wZXJhbmQuCi0JKG9wY29kZV9wdHIpOiBNYWtlIGl0IGEgbWFjcm8gaWYgRE9fQlJFQUtfVVBfQklHX0RFQ0wgaXMKLQl1bmRlZmluZWQuCi0JKG1kX2NvbnZlcnRfZnJhZ18xKTogRG9uJ3QgcmVmZXJlbmNlIGZyYWdQLT5mcl9vcGNvZGVbMi4uXS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpIFtjYXNlIFRBQiAoRkJSQU5DSCwgU1pfVU5ERUYpXToKLQlUdXJuIG9uIGxvbmcgYml0LgotCShtNjhrX2lwKSBbY2FzZSAnQyddOiBEb24ndCBzZXQgc2V0IGxvbmcgYml0LCBzZXQgaXQgaW4gdGhlIG9wY29kZQotIAl0YWJsZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpIFtjYXNlIFRBQiAoUENJTkRFWCwgU1pfVU5ERUYpXToKLQlWYXJpYWJsZSBwYXJ0IGluY3JlYXNlcyBieSBmb3VyLCBub3Qgc2l4LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCkgW1RDX002OEtdOiBEb24ndCBkbyBmdXJ0aGVyIHBjcmVsCi0JcHJvY2Vzc2luZyBhZnRlciBjb252ZXJ0aW5nIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlCi0Jc2FtZSBzZWdtZW50LgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgY29uZGl0aW9uYWxpemUgdGhlIHBjcmVsIGZpeCBvbgotCVRDX002OEsuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCwgY2FzZSAnQScpOiBJZiBBU0kgaXMgbm90IGEgIiMiCi0JdmFsdWUsIGRvbid0IHNoaWZ0IGl0IGFuIGV4dHJhIHRpbWUuCi0KLVdlZCBKdW4gMjEgMTQ6MTg6MzcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChkb19wcmludCwgZG9fZm9ybSwgYnVmZmVyX2FuZF9uZXN0KTogVXNlIGNhc2UgaW5zZW5zaXRpdmUKLQlzdHJpbmcgY29tcGFyZXMuCi0KLVR1ZSBKdW4gMjAgMTQ6NTU6MDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FzdCB0aW1lKCkgYXJndW1lbnQgdG8KLQl0aW1lX3QgKi4KLQotVHVlIEp1biAyMCAxMjowMDo1MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogRml4IHR5cG8gaW4gbGFzdAotCWNoYW5nZS4KLQotTW9uIEp1biAxOSAxNToyNzoxNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogWmVybyBvdXQgbWVtb3J5Ci0JZnJvbSBmcmFnX21vcmUgY2FsbHMuCi0KLVRodSBKdW4gMTUgMTY6NTM6MzcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogRG9uJ3QgdXNlICJiZmQvIiB3aGVuIGluY2x1ZGluZyBsaWJiZmQuaAotCWFuZCBsaWJjb2ZmLmguCi0JKGZpbGxfc2VjdGlvbik6IENhbGwgUFJPR1JFU1MuCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBBZGQgYmZkIHNyY2Rpci4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIGJmZF9nYXMgZmxhZyBhbmQgc2V0IGZvciBlYWNoIGNvbmZpZy4KLQkoaTM4Ni11bmtub3duLWdvMzIsIG02OGstdW5rbm93bi1jb2ZmKTogUmVjb2duaXplLgotCSogbXB3LW1ha2UuaW4gKEhBQ0tfT19SQU1BLCBPQkpfQ09GRl9PTUlUX1RJTUVTVEFNUCk6IEFkZCB0bwotCWNvbmZpZy5oLgotCi1UaHUgSnVuIDE1IDEwOjA0OjI2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoTE9DQUxfTEFCRUwpOiBQcmVwZW5kICcuJyBpZiBub3QgT0JKX0FPVVQuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDEyIDIyOjI1OjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IENoZWNrIGZvciBpbnZhbGlkIHJlZ2lzdGVyIGluIHNpbmdsZQotCXByZWNpc2lvbiBmbXB5YWRkIGFuZCBmbXB5c3ViIGluc3RydWN0aW9ucy4KLQotVGh1IEp1biAgOCAxOTozMzowMiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAobXluYW1lKTogRGVsZXRlIGFsbCByZWZlcmVuY2VzLgotCShWTVNfc3RhYl9wYXJzZSwgV3JpdGVfVk1TX01IRF9SZWNvcmRzLCBWTVNfQ2FzZV9IYWNrX1N5bWJvbCk6Ci0JUmVwbGFjZSBwcmludGYgY2FsbHMgd2l0aCBhc190c2t0c2suCi0JKFBVVF9MT05HLCBQVVRfU0hPUlQpOiBVc2UgQ09QWV9MT05HLCBDT1BZX1NIT1JULgotCShWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEpOiBNb3ZlIHNlY29uZCBidWZmZXIgY2FwYWNpdHkgY2hlY2sKLQliZWxvdyBib3R0b20gb2YgbG9vcDsgZmlyc3QgY2hlY2sgYXQgdG9wIHN1ZmZpY2VzIGZvciBsb29wIGl0c2VsZi4KLQkoZmluZF9maWxlKTogUmVtb3ZlIHJlZHVuZGFudCBwb2ludGVyIGNoZWNrcyBpbiBmaXJzdCB0d28gbG9vcHM7Ci0JcmVwbGFjZSB0aGlyZCBsb29wIHdpdGggcG9pbnRlciB0byBsYXN0IGxpc3QgZWxlbWVudCBkZXRlcm1pbmVkCi0JaW4gZmlyc3QgbG9vcC4KLQotVHVlIEp1biAgNiAxMzo1MzowNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBIYW5kbGUgZGVmaW5lZCBhYnNvbHV0ZSBzeW1ib2xzIGFzCi0JQVNJIHZhbHVlcy4KLQotCSogY29uZmlnL29iai12bXMuYyAodm1zX3dyaXRlX29iamVjdF9maWxlLCBjYXNlIE5fREFUQSk6IFVzZQotCXN0cmNtcCBhZ2FpbnN0IEZBS0VfTEFCRUxfTkFNRSBpbnN0ZWFkIG9mIGNoZWNraW5nIHRoaXJkCi0JY2hhcmFjdGVyLiAgKFN1Z2dlc3RlZCBieSBQYXQgUmFua2luLikKLQotTW9uIEp1biAgNSAyMDoxMDo0NiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCUFkZCBzdXBwb3J0IGZvciBOX0FCUyBhbmQgTl9BQlN8Tl9FWFQgdHlwZSBzeW1ib2xzLgotCi0JKiBjb25maWcvb2JqLXZtcy5oIChMU1lfU19NX3tERUYsUkVMfSwgRU5WX1NfTV97REVGLE5FU1RFRH0pOgotCU5ldyBtYWNyb3MgZm9yIGxvY2FsIHN5bWJvbHMgKGZyb20gPGxzeWRlZi5oPiBhbmQgPGVudmRlZi5oPikuCi0JKiBjb25maWcvb2JqLXZtcy5jIChDdXJyZW50X0Vudmlyb25tZW50KTogTmV3IGZpbGUtc2NvcGUgdmFyaWFibGUuCi0JKFZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCk6IE5ldyByb3V0aW5lLgotCShHQkxTWU1fTENMKTogTmV3IG1hY3JvLgotCShWTVNfR2xvYmFsX1N5bWJvbF9TcGVjKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMgdG9vLgotCShWTVNfUHNlY3RfU3BlYyk6IFNldCBHTE9CQUxWQUxVRV9CSVQgZm9yIGFic29sdXRlIHN5bWJvbHMuCi0JKFZNU19FbWl0X0dsb2JhbHZhbHVlcyk6IEhhbmRsZSBsb2NhbCBhbmQgZ2xvYmFsIGFic29sdXRlIHN5bWJvbHMuCi0JKFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSk6IERpdHRvLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGU6IEdTRCBzeW1ib2wgbG9vcCk6IERpdHRvLgotCi1Nb24gSnVuICA1IDE2OjEwOjQwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCi1Nb24gSnVuICA1IDAyOjE3OjU4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251Kik6IEFsd2F5cyB1c2UgR05VIEVMRiBjb25maWcuCi0KLVdlZCBNYXkgMzEgMTc6NDk6MTggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBVcGRhdGUgKnN5bWJvbFBQCi0JaW4gYGVsc2UnIGNsYXVzZSB3aGVuIHJlbW92aW5nIGEgc3ltYm9sLiAgQWxzbywgcmV2aXNlIGNvbW1lbnRzCi0JdG8gbWF0Y2ggdGhlIGNvZGUuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSAoR1NEIHN5bWJvbCBsb29wLCBjYXNlIE5fREFUQSkpOiBOZXZlcgotCW91dHB1dCBzeW1ib2wgZGVmaW5pdGlvbnMgZm9yIGxvY2FsIG51bWVyaWMgbGFiZWxzLgotCi1UdWUgTWF5IDMwIDE4OjI5OjEwIDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogY29uZmlndXJlLmluIChhcmNoaXRlY3R1cmUgdmFyaWFudHMsIGNhc2VzIGFybWViIGFuZCBhcm0qKTogUmVtb3ZlCi0Jc3BhY2VzIHJvdW5kIGFzc2lnbm1lbnQgdG8gZW5kaWFuLgotCi1UdWUgTWF5IDMwIDEyOjMxOjMxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hlY2sgZm9yIHVuZGVmaW5lZCBsb2NhbCBkb2xsYXIKLQlhbmQgZmIgbGFiZWxzLgotCi0JKiBzeW1ib2xzLmMgKGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lKTogRXh0cmFjdCBpbnN0YW5jZSBudW1iZXIKLQlmcm9tIHRoZSBjb3JyZWN0IGxvY2F0aW9uLgotCi1TYXQgTWF5IDI3IDIxOjI4OjQ5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RlLWRweDIuaDogSW5jbHVkZSBvYmotZm9ybWF0LmguCi0JKENPRkZfTUFHSUMpOiBSZW5hbWVkIGZyb20gRklMRV9IRUFERVJfTUFHSUMuCi0KLVdlZCBNYXkgMjQgMTM6NDU6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW4sIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmYuaDoKLQlBZGQgc3VwcG9ydCBmb3IgQVJNIHBlCi0KLVR1ZSBNYXkgMjMgMTc6MDA6MzIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNgotCWFuZCBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOS4KLQotVHVlIE1heSAyMyAxOToxODozMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKSBbISBVU0VfRU1VTEFUSU9OU106IEFsd2F5cyBwcmludCBhbiBlcnJvcgotCW1lc3NhZ2UuCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRG9jdW1lbnQgb2JqX2FwcF9maWxlIGFuZAotCVRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCi1Nb24gTWF5IDIyIDIwOjAzOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBBZGQgZXh0cmEgbGVhZGluZyBhcmd1bWVudCwgZm9yIDQgTWF5Ci0JY2hhbmdlLgotCSogZWNvZmYuaCAoZWNvZmZfc3RhYik6IEZpeCBkZWNsYXJhdGlvbi4KLQkqIG9iai5oIChmb3JtYXRfb3BzLnByb2Nlc3Nfc3RhYik6IEluY2x1ZGUgcHJvdG90eXBlLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1BST0NFU1NfU1RBQik6IFBhc3MgdGhyb3VnaCBzZWcgYXJndW1lbnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9CSl9QUk9DRVNTX1NUQUIpOiBEaXR0by4KLQotCSogY29uZmlnL2UtbWlwc2VsZi5jIChtaXBzZWxmKTogTmV3IGVtdWxhdGlvbiBtb2RlLCBkb2Vzbid0IGNoYW5nZQotCWVuZGlhbm5lc3MgZnJvbSBjb25maWd1cmVkIGRlZmF1bHQuCi0JKiBjb25maWcvZS1taXBzZWNvZmYuYyAobWlwc2Vjb2ZmKTogRGl0dG8uCi0JKiBjb25maWd1cmUuaW4gKG1pcHMgZWNvZmYvZWxmIHRhcmdldHMpOiBJbmNsdWRlIHRoZW0uCi0JKiBhcy5jIChtaXBzZWxmLCBtaXBzZWNvZmYpOiBEZWNsYXJlLgotCi0JKiBhcy5jIChlbXVsYXRpb25fbmFtZSk6IE5ldyB2YXJpYWJsZS4KLQkoc2VsZWN0X2VtdWxhdGlvbl9tb2RlKTogU2V0IGVtdWxhdGlvbl9uYW1lLiAgRG9uJ3QgY2hhbmdlIGFyZ3YuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1lbXVsYXRpb247IGNvbXBsYWluIGlmIHRoZSBzdXBwbGllZCBuYW1lCi0JaXNuJ3Qgd2hhdCBzZWxlY3RfZW11bGF0aW9uX25hbWUgY2FtZSB1cCB3aXRoLgotCi1TdW4gTWF5IDIxIDIxOjM2OjE3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBSZXZlcnNlIGNoYW5nZXMgZnJvbSBEZWMuIDE5dGggd2hpY2gKLQljaGFuZ2VkIHRoZSB3YXkgdW53aW5kcyB3ZXJlIGJ1aWx0IGZvciBFTEYuICBSZWx5IG9uIHJlbG9jYXRpb24KLQlzeW1ib2wgcmVkdWN0aW9ucyB0byBhdm9pZCBwbGFjaW5nIHRoZSBlbmQgb2YgZnVuY3Rpb24gbWFya2VyCi0Jc3ltYm9scyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4KLQotU2F0IE1heSAyMCAxMjozMTozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlBZGRlZCBpbXByb3ZlZCBWTVMgc3VwcG9ydCBmcm9tIFBhdCBSYW5raW46Ci0KLQlGcmkgMTkgTWF5IDE2OjUxOjQwIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChBT1VUX1NUQUJTKTogRGVmaW5lLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChmcHVzaCwgcnB1c2gpOiBOZXcgcm91dGluZXMuCi0JKHB1c2gpOiBSZXBsYWNlZCBieSB0aGUgYWJvdmUuCi0JKGZpbmRfc3ltYm9sKTogU2xpZ2h0IHJlb3JnYW5pemF0aW9uIHRvIGV4cG9zZSB0YWlsIHJlY3Vyc2lvbi4KLQotCUZyaSBNYXIgMTcgMTg6NDA6MzYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChWTVNfT1RIRVJfT0JKUyk6ICBkZWxldGUgdGhpcy4KLQkqIHZtc2NvbmYuc2ggKG1ha2UtZ2FzLmNvbSk6ICBidWlsZCAuLi9saWJpYmVydHkvbGliZXJ0eS5vbGIKLQlmaXJzdCBpZiBuZWNlc3Nhcnk7IGxpbmsgZ2FzIGFnYWluc3QgaXQuCi0KLUZyaSBNYXkgMTkgMTY6Mzc6MzkgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBnYXNwLmMgKGlzdHJ1ZSk6IENvcnJlY3RseSB0ZXN0IGZvciBzdHJpbmcgaW5lcXVhbGl0eS4KLQotVGh1IE1heSAxOCAwNDoyNToxMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlXZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBjb25maWcvdGMtYXJtLmMgKENQX1Rfe1ByZSxVRCxXQn0pOiBEZWZpbmUsIGJpdHMgaW4gY28tcHJvY2Vzc29yCi0JaW5zdHJ1Y3Rpb25zLgotCShbbHNdZm1fZmxhZ3MpOiBDb3JyZWN0IGVycm9yIGluIGJpdG1hc2tzLgotCShjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUpOiBEZWxldGUgc2Vjb25kIHBhcmFtZXRlciwgRkxBR1MuICBBbGwKLQljYWxsZXJzIGNoYW5nZWQuICBSZW1vdmUgYWxsIGRlYWQgY29kZSByZWZlcnJpbmcgdG8gRkxBR1MuICBJZgotCWFkZHJlc3MgaXMganVzdCAiW1JlZ10iIHRoZW4gY29udmVydCBpbnRvIGEgUFJFLUlOQ1JFTUVOVCBVUCBmb3JtYXQuCi0JKGRvX2ZwX2xkbXN0bSk6IEhhbmRsZSBmdWxsLWRlc2NlbmRpbmcgYW5kIGVtcHR5LWFzY2VuZGluZyBzdGFjawotCWZvcm1hdHMgZXhwbGljaXRseS4KLQotCSogY29uZmlnL3RjLWFybS5jIChpbnRlcm5hbEVycm9yKTogRGVmaW5lLgotCShBUk1fezEsMiwyNTAsMyw2LDcsN0RNLEFOWSwyVVAsQUxMLDNVUCw2VVAsTE9OR01VTH0pOiBEZWZpbmUgcHJvY2Vzc29yCi0JdmFyaWFudHMuCi0JKEZQVV97Q09SRSxGUEExMCxGUEExMSxOT05FLEFMTCxNRU1NVUxUSX0pOiBEZWZpbmUgZmxvYXRpbmcgcG9pbnQKLQl2YXJpYW50cy4KLQkoe0NQVSxGUFV9X0RFRkFVTFQpOiBEZWZpbmUuCi0JKGNwdV92YXJpYW50KTogTmV3IHZhcmlhYmxlLgotCShhc21fZmxnKTogQ2hhbmdlIG1vcmVfZmxhZ3MgdG8gZmxhZ19iaXRzLgotCUFkZCBwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zLgotCShGTEFHX3tTLFAsQixULEVELEZELEZBLEVBLElCLElBLERCLERBLEx9KTogRGVsZXRlLgotCShzX2ZsYWdbXSwgbGRzdF9mbGFnc1tdLCBieXRlX2ZsYWdbXSwgY21wX2ZsYWdzW10sIGxkbV9mbGFnc1tdLAotCSBzdG1fZmxhZ3NbXSwgbGZtX2ZsYWdzW10sIHNmbV9mbGFnc1tdLCByb3VuZF9mbGFnc1tdLCBleGNlcHRfZmxhZ3NbXSwKLQkgY3Bsb25nX2ZsYWdbXSk6IE5ldyB2YXJpYWJsZXMuCi0JKGFzbV9vcGNvZGUsIGluc25zW10pOiBOZXcgZm9ybWF0LCBhZGQgdmVyc2lvbiBzdXBwb3J0LgotCShhcm1fZmxnX2hzaCk6IERlbGV0ZS4KLQkoZG9fbXVsLCBkb19tbGEpOiBSZW1vdmUgIldhcm5pbmciIGZyb20gd2FybmluZyBtZXNzYWdlcy4KLQkoZG9fYXJpdCk6IFNpbXBsaWZ5LgotCShkb19zd2FwKTogTWFrZSBlcnJvciBtZXNzYWdlIG1vcmUgYXBwcm9wcmlhdGUuCi0JKG1kX2JlZ2luKTogQnVpbGQgaGFzaCB0YWJsZXMgc3RhcnRpbmcgYXQgZmlyc3QgZW50cnkgaW4gdGFibGVzLgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBDb3BlIHdpdGggYmlnL2xpdHRsZS1lbmRpYW4gc2VsZWN0aW9uLgotCShtZF9jaGFyc190b19udW1iZXIpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IFJld3JpdGUgdG8gbWFrZSBlbmRpYW4gaW5kZXBlbmRlbnQuCi0JKHRjX2dlbl9yZWxvYyk6IEJldHRlciBlcnJvciBtZXNzYWdlcy4KLQkobWRfYXNzZW1ibGUpOiBSZWplY3Qgb3Bjb2RlcyBmb3JiaWRkZW4gYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjcHUKLQl2YXJpYW50LiAgUmV3cml0ZSBoYW5kbGluZyBjb2RlIGZvciBpbnN0cnVjdGlvbiBmbGFncy4KLQkobWRfc2hvcnRvcHRzKTogQWRkIG9wdGlvbiAibToiLgotCShtZF9wYXJzZV9vcHRpb24pOiBHZXQgdGhlIGRlc2lyZWQgY3B1L2ZwdSB2YXJpYW50LgotCi0JRnJvbTogRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQkqIGNvbmZpZ3VyZS5pbiAoYXJjaGl0ZWN0dXJlIHZhcmlhbnRzKTogQ2hlY2sgZm9yICJhcm1lYiIgYW5kICJhcm0qIiwKLQlzZXQgZW5kaWFubmVzcyBhY2NvcmRpbmdseS4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogTmV3IGhvb2tzIG1kX3N0YXJ0X2xpbmVfaG9vayBhbmQKLQltZF9hZnRlcl9wYXNzX2hvb2suCi0JKiBjb25maWcvYXJtLXtiaWcsbGl0fS5tdDogTmV3IGZpbGVzCi0JKiBjb25maWcvdGMtYXJtLmggKHtMSVRUTEUsQklHfV9FTkRJQU4sIEJZVEVfT1JERVIpOiBEZWZpbmUuCi0JKFRBUkdFVF9GT1JNQVQpOiBTZWxlY3QgZGVwZW5kaW5nIG9uIGVuZGlhbm5lc3MgYW5kIGVtdWxhdGlvbiBhbmQKLQlvYmplY3QgZm9ybWF0LgotCShtZF9hZnRlcl9wYXNzX2hvb2ssIG1kX3N0YXJ0X2xpbmVfaG9vayk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hcm0uYzogSW5jbHVkZSBzdWJzZWdzLmgsIHN5bWJvbHMuaCBhbmQgbGlzdGluZy5oLgotCShzaGlmdFtdKTogQWRkIHVwcHBlciBjYXNlIGVxdWl2YWxlbnRzLgotCShDUF9UX1tYWV0sIFRSQU5TX0JJVCk6IERlZmluZS4KLQkoY29uZHNbXSk6IERlbGV0ZSBpbml0aWFsIE5VTEwgZW50cnksIGFkZCAibG8iIGVudHJ5IGFzIHN5bm9ueW0gZm9yCi0JImNjIi4KLQkoTE9OR0VTVF9GTEFHLCBmbGFnc1tdKTogRGVsZXRlLgotCShhcm1fcHNyKTogTmV3IHN0cnVjdHVyZS4KLQkocHNyc1tdKTogTmV3IHZhcmlhYmxlLgotCShQU1JfQUxMKTogRGVmaW5lLgotCShMT05HRVNUX0lOU1QpOiBCdW1wIHRvIDUuCi0JKExJVEVSQUxfTUFTSywgQ09ORF9NQVNLLCBPUENPREVfTUFTSywgREFUQV9PUF9TSElGVCk6IERlZmluZS4KLQkoT1BDT0RFX3tBTkQsRU9SLFNVQixSU0IsQURELEFEQyxTQkMsUlNDLFRTVCxURVEsQ01QLENNTixPUlIsTU9WLEJJQywKLQkgTVZOfSk6IERlZmluZS4KLQkoaW5zbnNbXSk6IEFkZCBzbXVsbCwgdW11bGwsIHNtbGFsLCB1bWxhbCwgbGRmbSwgc3RmbSwgbXNyIGFuZCBtcnMKLQlpbnN0cnVjdGlvbnMuICBBZGQgbm9wIGFuZCBhZHIgcHNldWRvIG9wcy4KLQkocmVnX3RhYmxlKTogQWRkIEFQQ1MgcmVnaXN0ZXIgbmFtZSB2YXJpYW50cy4KLQkoYXJtX3Bzcl9oc2gpOiBOZXcgaGFzaCB0YWJsZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkICJsdG9yZyIsICJwb29sIiwgImV4dGVuZCIsICJsZG91YmxlIiBhbmQKLQkicGFja2VkIi4KLQkoTUFYX0xJVEVSQUxfUE9PTF9TSVpFKTogRGVmaW5lLgotCShzdHJ1Y3QgbGl0ZXJhbFMpOiBOZXcgc3RydWN0dXJlLgotCShsaXRlcmFscywgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UsIGxpdF9wb29sX251bSwgY3VycmVudF9wb29sUCk6IE5ldwotCXZhcmlhYmxlcy4KLQkoYWRkX3RvX2xpdF9wb29sLCBzeW1ib2xfbG9jYXRlLCBzeW1ib2xfbWFrZV9lbXB0eSk6IE5ldyBmdW5jdGlvbnMuCi0JKHZhbGlkYXRlX2ltbWVkaWF0ZSk6IFJldHVybiBGQUlMIG9uIGZhaWx1cmUuCi0JKHNfbHRvcmcpOiBOZXcgZnVuY3Rpb24uCi0JKHBzcl9yZXF1aXJlZF9oZXJlLCBwc3JmX3JlcXVpcmVkX2hlcmUpOiBOZXcgZnVuY3Rpb25zLgotCShjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUpOiBOZXcgcGFyYW1ldGVyLCBmbGFnLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgotCUlmIGZsYWcgaXMgbm9uLXplcm8sIHJlc3RyaWN0IHRoZSBsZWdhbCBhZGRyZXNzaW5nIG1vZGVzLgotCShkb19ub3AsIGRvX21ycywgZG9fbXNyLCBkb19tdWxsKTogTmV3IGZ1bmN0aW9ucy4KLQkobmVnYXRlX2RhdGFfb3ApOiBOZXcgZnVuY3Rpb24uCi0JKGRhdGFfb3AyKTogYWNjZXB0ICN4LHkgbWVhbmluZyB4IHJvdGF0ZWQgcmlnaHQgYnkgeSwgYnV0IG9ubHkgd2hlbgotCXN1aXRhYmxlIGNvbnN0YW50cy4gIElmIGltbWVkaWF0ZSBpcyBub3QgbGVnYWwsIHRyeSBjaGFuZ2luZyB0aGUKLQlvcGNvZGUuCi0JKGRvX2Fkcik6IE5ldyBmdW5jdGlvbi4KLQkoZG9fbGRzdCk6IGFjY2VwdCAibGRyIHJlZywgPWV4cHIiLiAgUHV0IGV4cHIgaW4gdGhlIHBvb2wgaWYgaXQgY2FuJ3QKLQliZSBkb25lIGFzIGFuIGltbWVkaWF0ZS4KLQkoZG9fZnBfbGRzdCk6IFVzZSBDUF9UX1tYWV0sIG5vdCBpbW1lZGlhdGUgdmFsdWVzLgotCShkb19mcF9sZG1zdG0pOiBOZXcgZnVuY3Rpb24uCi0JKGFybV9wc3JfcGFyc2UpOiBOZXcgZnVuY3Rpb24uCi0JKG91dHB1dF9pbnN0KTogVXNlIElOU05fU0laRSBpbiBjYWxsIHRvIG1kX251bWJlcl90b19jaGFycy4KLQkobWRfYXNzZW1ibGUpOiBBZGQgaGFjayBzbyB0aGF0ICJMYWJlbCBpbnN0cnVjdGlvbiIgY2F1c2VzIGFsaWdubWVudCBvZgotCXRoZSBsYWJlbC4KLQkoYXJtX2FmdGVyX3Bhc3NfaG9vaywgYXJtX3N0YXJ0X2xpbmVfaG9vaywgYXJtX2Zyb2Jfc3ltYm9sKTogTmV3Ci0JZnVuY3Rpb25zLgotCi1XZWQgTWF5IDE3IDA1OjI1OjE2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9zaG93X3VzYWdlKTogQWRkIFwncyBhdCBlbmQgb2YgbGluZXMgaW4KLQlzdHJpbmdzIGZvciBub24tR0NDIGNvbXBpbGVycy4KLQotVHVlIE1heSAxNiAxOTozNjowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX3BvcF9pbnNlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2Zvcm1hdF9vcHMpOiBVc2UgaXQuCi0JKG9ial9lY29mZl9mcm9iX3N5bWJvbCk6IE5vdyBzdGF0aWMuCi0KLVdlZCBNYXkgMTcgMDA6NTk6MTIgMTk5NSAgQW5kcmV3IENhZ25leSAtIGFrYSBOb2lkICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9iZWdpbik6IFdhcyBhc3N1bWluZyB0aGF0IGFuIGluc3RydWN0aW9uIHdhcwotCWJpZ2VuZGlhbiBhbmQgaGVuY2UgMTZiaXQgcmVsb2NzIHdpdGhpbmcgaW5zdHJ1Y3Rpb25zIHdvdWxkCi0JQUxXQVlTIGJlIGF0IGFkZHJlc3NlcyBpKzItaSszLiAgSW4gTEUgbW9kZSBpdCBpcyBpKzAtaSsxLgotCi1UdWUgTWF5IDE2IDE2OjI5OjU4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAob2JqX2Zyb2Jfc3ltYm9sLCBvYmpfZnJvYl9maWxlLCBTX0dFVF9TSVpFLAotCVNfU0VUX1NJWkUsIFNfR0VUX0FMSUdOLCBTX1NFVF9BTElHTiwgb2JqX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMsCi0JT0JKX1BST0NFU1NfU1RBQik6IE5ldyBtYWNyb3MuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBQcm90ZWN0IGFnYWluc3QgcmVkZWZpbmluZyB0aGVtIGFsc28gd2hlbgotCWluY2x1ZGluZyBvYmotZWxmLmguICBUZXN0IG9ubHkgT0JKX0VMRiBmb3IgaW5jbHVkaW5nIGVsZi9taXBzLmguCi0JKG1pcHNfaW5pdF9hZnRlcl9hcmdzKTogTmV3IGZ1bmN0aW9uLiAgU2V0IGJ5dGVfb3JkZXIgaGVyZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTm90IGhlcmUuCi0JKGJ5dGVfb3JkZXIpOiBEb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBEZWNsYXJlLgotCSh0Y19pbml0X2FmdGVyX2FyZ3MpOiBOZXcgbWFjcm8uCi0KLQkqIHJlYWQuYyAoc19sY29tbSk6IERvIEVMRi9FQ09GRiB0ZXN0IGF0IHJ1biB0aW1lLCBub3QgY29tcGlsZQotCXRpbWUuCi0KLUZyaSBNYXkgMTIgMTQ6MTc6NDcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgUEUgb2JqZWN0IGZpbGVzLgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmUgKGkzODYtKi1wZSwgaTM4Ni0qLSpudCk6IEFkZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQ29wZSB3aXRoIFBFIHdpZXJkbmVzcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChURV9QRSk6IE5ldyB0YXJnZXQgZm9ybWF0LgotCi1UaHUgTWF5IDExIDE0OjU4OjIxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKE5FRURfRUNPRkZfREVCVUcpOiBEZWZpbmUgaWYgRUNPRkZfREVCVUdHSU5HCi0Jd2FzIGRlZmluZWQgYnkgaGVhZGVyIGZpbGVzLiAgVGVzdCBpbiBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzCi0JaW5zdGVhZCBvZiBFQ09GRl9ERUJVR0dJTkcuCi0JKGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZSk6IE1ha2UgZW1wdHkgaWYgTkVFRF9FQ09GRl9ERUJVRyBpcyBub3QKLQlkZWZpbmVkLgotCShvYmpfcmVhZF9iZWdpbl9ob29rLCBvYmpfc3ltYm9sX25ld19ob29rLCBlbGZfZnJvYl9zeW1ib2wsCi0JZWxmX2Zyb2JfZmlsZSk6IE9ubHkgY2FsbCBlY29mZiByb3V0aW5lcyBpZiBORUVEX0VDT0ZGX0RFQlVHIGlzCi0JZGVmaW5lZC4KLQkoZWxmX2Vjb2ZmX3NldF9leHQsIGVsZl9nZXRfZXh0ciwgZWxmX3NldF9pbmRleCk6IERlZmluZSBvbmx5IGlmCi0JTkVFRF9FQ09GRl9ERUJVRyBpcyBkZWZpbmVkLgotCShlbGZfZm9ybWF0X29wcyk6IFJlZmVyZW5jZSBlbGZfZWNvZmZfc2V0X2V4dCBvbmx5IGlmCi0JTkVFRF9FQ09GRl9ERUJVRy4KLQotV2VkIE1heSAxMCAxODowOToxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoT0JKUyk6IEluY2x1ZGUgQGV4dHJhX29iamVjdHNALgotCShvYmotZWxmLm8sIG9iai1lY29mZi5vLCBlLW1pcHNlbGYubywgZS1taXBzZWNvZmYubyk6IE5ldyBydWxlcwotCWZvciBidWlsZGluZyB0aGVzZSBpbmRlcGVuZGVudGx5LgotCSogZW11bC10YXJnZXQuaCwgY29uZmlnL2UtbWlwc2VsZi5jLCBjb25maWcvZS1taXBzZWNvZmYuYzogTmV3Ci0JZmlsZXMuCi0KLQkqIGFjY29uZmlnLmggKERFRkFVTFRfRU1VTEFUSU9OLCBFTVVMQVRJT05TLCBVU0VfRU1VTEFUSU9OUywKLQlPQkpfTUFZQkVfKiwgSTM4NkNPRkYsIE02OEtDT0ZGLCBNODhLQ09GRik6IE5ldyBtYWNyb3MuCi0JKiBhY2xvY2FsLm00IChHQVNfVU5JUSk6IE5ldyBtYWNyby4KLQotCSogYXMuYyAoZW11bGF0aW9ucywgbl9lbXVsYXRpb25zKSBbVVNFX0VNVUxBVElPTlNdOiBOZXcgdmFyaWFibGUuCi0JKHNlbGVjdF9lbXVsYXRpb25fbW9kZSwgZGVmYXVsdF9lbXVsX2JmZF9uYW1lLCBjb21tb25fZW11bF9pbml0KQotCVtVU0VfRU1VTEFUSU9OU106IE5ldyBmdW5jdGlvbnMuCi0JKG1haW4pIFtVU0VfRU1VTEFUSU9OU106IENhbGwgc2VsZWN0X2VtdWxhdGlvbl9tb2RlIGJlZm9yZSBvdGhlcgotCWluaXRpYWxpemF0aW9uLgotCSogZW11bC5oOiBOZXcgZmlsZS4KLQkqIGFzLmggW1VTRV9FTVVMQVRJT05TXTogSW5jbHVkZSBpdC4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgZW5hYmxlLXRhcmdldHMgb3B0aW9uLiAgSXRlcmF0ZSBvdmVyIHRhcmdldAotCWxpc3QsIGJ1aWxkaW5nIHVwIGEgbGlzdCBvZiBvYmplY3QgZmlsZSBmb3JtYXRzIGFuZCBlbXVsYXRpb24KLQljb25maWd1cmF0aW9ucy4gIChPbmx5IHN1cHBvcnRzIGVtdWxhdGlvbnMgZm9yIE1JUFMgQ1BVIHNvIGZhci4pCi0JSWYgbXVsdGlwbGUgZm9ybWF0cyBhcmUgbmVlZGVkLCBzZXQgb2JqX2Zvcm1hdCB0byBtdWx0aSBhbmQgYWRkCi0JZm9ybWF0IGNvbmZpZyBmaWxlcyB0byBleHRyYV9maWxlcy4gIElmIGVtdWxhdGlvbiBtb2RlcyBhcmUKLQluZWVkZWQsIGFkZCB0aGUgcmVsZXZhbnQgZmlsZXMgdG8gZXh0cmFfZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEkzODZDT0ZGLCBNNjhLQ09GRiwgTTg4S0NPRkYgZm9yIHRob3NlCi0JY29uZmlndXJhdGlvbnMuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBGaWxlbmFtZSBhcmd1bWVudCBub3cKLQlwb2ludHMgdG8gY29uc3QuCi0JKiBlY29mZi5oIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogVXBkYXRlZCBkZWNsYXJhdGlvbi4KLQotCSogb2JqLmggKG9ial9yZWFkX2JlZ2luX2hvb2spOiBEb24ndCBkZWNsYXJlIGZ1bmN0aW9uIGlmIGl0J3MKLQlhbHJlYWR5IGEgbWFjcm8uCi0KLQkqIHJlYWQuYyAoc19zcGFjZSwgY29ucywgc3RyaW5nZXIpOiBJZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpcwotCWRlZmluZWQsIGNhbGwgaXQgb24gZW50cnkuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBJZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotCWlzIGRlZmluZWQsIGNhbGwgaXQgb24gZW50cnkuICBJZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBpcwotCWRlZmluZWQsIGNhbGwgaXQgYmVmb3JlIHJldHVybmluZyBub3JtYWxseS4KLQotCSogcmVhZC5oICh0YXJnZXRfYmlnX2VuZGlhbik6IERlY2xhcmUuCi0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IEFkZGVkIG5ldyBmdW5jdGlvbiBwb2ludGVyIGZpZWxkcwotCWVjb2ZmX3NldF9leHQsIHJlYWRfYmVnaW5faG9vaywgc3ltYm9sX25ld19ob29rLgotCShlY29mZl9mb3JtYXRfb3BzLCBlbGZfZm9ybWF0X29wcyk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc19nZXRfc2l6ZSwgZWxmX3Nfc2V0X3NpemUsCi0JZWxmX3NfZ2V0X2FsaWduLCBlbGZfc19zZXRfYWxpZ24sIGVsZl9jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLAotCWVsZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKGVsZl9mb3JtYXRfb3BzKTogTmV3IHZhcmlhYmxlLgotCShlbGZfZnJvYl9zeW1ib2wpOiBOb3cgdGFrZXMgYWRkaXRpb25hbCBpbnQqIGFyZ3VtZW50LgotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX2Zyb2Jfc3ltYm9sKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShlbGZfcG9wX2luc2VydCk6IERlY2xhcmUuCi0JKG9ial9wb3BfaW5zZXJ0KTogRGVmaW5lIHRvIGNhbGwgZWxmX3BvcF9pbnNlcnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jLAotCW9ial9lY29mZl9mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2Zvcm1hdF9vcHMpOiBOZXcgdmFyaWFibGUuCi0KLQkqIGNvbmZpZy90ZS1nZW5lcmljLmg6IElmIE9CSl9IRUFERVIgaXMgZGVmaW5lZCwgdXNlIGl0IGFzIHRoZQotCWZpbGVuYW1lIHRvIGluY2x1ZGUgaW4gcGxhY2Ugb2Ygb2JqLWZvcm1hdC5oLgotCSogY29uZmlnL3RlLW11bHRpLmg6IE5ldyBmaWxlLCBjb3BpZWQgZnJvbSB0ZS1nZW5lcmljLmguCi0JKiBjb25maWcvb2JqLWVsZi5jIChPQkpfSEVBREVSKTogRGVmaW5lIGl0IHRvICJvYmotZWxmLmgiLgotCSogY29uZmlnL29iai1lY29mZi5jIChPQkpfSEVBREVSKTogRGVmaW5lIGl0IHRvICJvYmotZWNvZmYuaCIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKEVDT0ZGX0RFQlVHR0lORyk6IERlZmF1bHQgdG8gMC4KLQkob2JqX3JlYWRfYmVnaW5faG9vaywgb2JqX3N5bWJvbF9uZXdfaG9vaywgZWxmX2Zyb2Jfc3ltYm9sLAotCWVsZl9mcm9iX2ZpbGUpOiBUZXN0IGl0IGF0IHJ1biB0aW1lLgotCShvYmpfZWNvZmZfc2V0X2V4dCwgZWxmX2dldF9leHRyLCBlbGZfc2V0X2luZGV4KTogRGVmaW5lCi0JdW5jb25kaXRpb25hbGx5LgotCShlbGZfcHNldWRvX3RhYmxlKTogUmVuYW1lZCBmcm9tIG9ial9wc2V1ZG9fdGFibGUsIG5vdyBzdGF0aWMuCi0JKGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZSk6IFNwbGl0IG9mZiBpbnRvIHNlcGFyYXRlIHRhYmxlLiAgRGVmaW5lCi0JaXQgdW5jb25kaXRpb25hbGx5LgotCShlbGZfcG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9wb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkob2JqX3BvcF9pbnNlcnQpOiBOZXcgbWFjcm8uCi0JKG9ial9lY29mZl9zZXRfZXh0KSBbIU9CSl9NQVlCRV9FTEZdOiBEZWZpbmUgdG8gZWxmX2Vjb2ZmX3NldF9leHQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9lY29mZl9zZXRfZXh0KTogRGVmaW5lIHRvIGVjb2ZmX3NldF9leHQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCShtaXBzX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgotCShtZF9wb3BfaW5zZXJ0KTogQ2FsbCBpdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogSWYgT0JKX01BWUJFX0VMRiBpcyBkZWZpbmVkLCBpbmNsdWRlCi0Jb2JqLWVsZi5oLCBidXQgcHJlc2VydmUgT1VUUFVUX0ZMQVZPUiBhbmQgcHJvdGVjdCBzb21lIG90aGVyCi0JbWFjcm9zIGZyb20gcmVkZWZpbml0aW9uLgotCShFQ09GRl9ERUJVR0dJTkcpOiBEZWZhdWx0IHRvIDAuICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkIHRvCi0JcnVuLXRpbWUgdGVzdHMgb3IgbWFkZSB1bmNvbmRpdGlvbmFsLgotCShzX3N0cmluZ2VyLCBzX21pcHNfc3BhY2UsIHNfZWxmX3NlY3Rpb24pOiBEZWxldGVkLgotCShtZF9wc2V1ZG9fdGFibGUpOiBEb24ndCByZWZlciB0byB0aGVtLiAgU3BsaXQgdGFibGUgaW50byB0aHJlZQotCXNlY3Rpb25zLCBmb3IgTUlQUywgbm9uLUVDT0ZGX0RFQlVHR0lORywgYW5kIEVMRi4KLQkobWlwc19wb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VuYWJsZV9hdXRvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc19wb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkobWRfcG9wX2luc2VydCk6IE5ldyBtYWNyby4KLQkobWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlY2xhcmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IG1hY3JvLgotCShtaXBzX2VuYWJsZV9hdXRvX2FsaWduKTogRGVjbGFyZS4KLQkobWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBOZXcgbWFjcm8sIGNhbGxzCi0JbWlwc19lbmFibGVfYXV0b19hbGlnbi4KLQotVHVlIE1heSAgOSAxNzowNzo0MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzdXBwb3J0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYuCi0JKiBjb25maWcvcHBjLWJpZy5tdDogTmV3IGZpbGUgZm9yIGJpZyBlbmRpYW4gUG93ZXJQQyBzeXN0ZW1zLgotCSogY29uZmlnL3BwYy1saXQubXQ6IE5ldyBmaWxlIGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3lzdGVtcy4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0YXJnZXRfYmlnX2VuZGlhbik6IERlY2xhcmUuCi0JKFRBUkdFVF9GT1JNQVQpOiBEZWFsIHdpdGggbGl0dGxlIGFuZCBiaWcgZW5kaWFuIEVMRiB2YXJpYW50cy4KLQkoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUgYXMgMSwgbm90IGVtcHR5LgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19iaWdfZW5kaWFuKTogRGVsZXRlIHZhcmlhYmxlLCB1c2UKLQl0YXJnZXRfYmlnX2VuZGlhbiBpbnN0ZWFkLgotCShtZF9wYXJzZV9vcHRpb24pOiBQYXJzZSAtbWxpdHRsZSBhbmQgLW1saXR0bGUtZW5kaWFuIHRvIHVzZQotCWxpdHRsZSBlbmRpYW4gc3VwcG9ydC4gIFBhcnNlIC1tYmlnIGFuZCAtbWJpZy1lbmRpYW4gdG8gdXNlIGJpZwotCWVuZGlhbiBzdXBwb3J0LgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlIHRvIHJlZmxlY3QgY3VycmVudCBzd2l0Y2hlcy4KLQkocHBjX3NldF9jcHUpOiBSZWNvZ25pemUgcG93ZXJwY2xlIGFzIGxpdHRsZSBlbmRpYW4gUG93ZXJQQy4gIFVzZQotCWFzX2ZhdGFsLCBub3QgYWJvcnQgaWYgdW5rbm93biBtYWNoaW5lLgotCi1UdWUgTWF5ICA5IDEwOjU4OjQxIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBDYXN0ICp2YWxwIHRvIGFuIGludGVnZXIgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IHNpZ25lZCB2YWx1ZXMuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IE1ha2UgImRpc3RhbmNlIiBhbiBpbnRlZ2VyLgotCi1UdWUgTWF5ICA5IDAwOjQ3OjAzIDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpIFtCRkRfQVNTRU1CTEVSXTogTmV3IHR5cGUuCi0JKHRoaXNfZm9ybWF0KSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUgbmV3IHZhcmlhYmxlLCBpZiBub3QKLQlhbHJlYWR5IGRlZmluZWQgYXMgYSBtYWNyby4KLQotTW9uIE1heSAgOCAyMTo0NDoxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHNlZ19pbmZvKTogUHJvdmlkZSBkdW1teSB2ZXJzaW9uIGZvcgotCW5vbi1CRkRfQVNTRU1CTEVSLCBub24tTUFOWV9TRUdNRU5UUyBjb25maWd1cmF0aW9uLiAgSXQgc2hvdWxkCi0JbmV2ZXIgZ2V0IGludm9rZWQsIGJ1dCB0aGlzIGlzIGVhc2llciB0aGFuIGNvbmRpdGlvbmFsaXppbmcgc29tZQotCW9mIHRoZSB1c2VzLgotCShzdHJ1Y3Qgc2VnX2luZm9fdHJhc2gpOiBEdW1teSB0eXBlIHVzZWQgYnkgYWJvdmUgdG8gbWFrZSBjb2RlCi0JY29tcGlsZS4KLQotRnJpIE1heSAgNSAxNDo0NzoxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERlZmluZSB0byAxLCBub3QKLQllbXB0eS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotc29tLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEaXR0by4KLQotVGh1IE1heSAgNCAxOToyNjo1NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogQWx3YXlzIGRlZmluZS4gIElmCi0JU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBpc24ndCBzZXQsIGFib3J0LgotCShTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmYXVsdCB0byB6ZXJvLgotCShhb3V0X3Byb2Nlc3Nfc3RhYik6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IGZyb20gc19zdGFiX2dlbmVyaWMuCi0JKE9CSl9QUk9DRVNTX1NUQUIpIFtBT1VUX1NUQUJTXTogRGVmaW5lIHRvIGNhbGwgYW91dF9wcm9jZXNzX3N0YWIsCi0JaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoc19zdGFiX2dlbmVyaWMpOiBUZXN0IFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgYXQgcnVuIHRpbWUuICBJZgotCWl0J3Mgbm90IHNldCwgYW5kIE9CSl9QUk9DRVNTX1NUQUIgaXNuJ3QgZGVmaW5lZCwgYWJvcnQuICBBbHdheXMKLQlwYXNzIHNpeCBhcmd1bWVudHMgdG8gT0JKX1BST0NFU1NfU1RBQi4KLQkqIHJlYWQuaCAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IERlY2xhcmUgdW5jb25kaXRpb25hbGx5LgotCSogY29uZmlnL29iai1hb3V0LmggKEFPVVRfU1RBQlMpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoQU9VVF9TVEFCUyk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT0JKX1BST0NFU1NfU1RBQik6IEFkZCBuZXcgZmlyc3QgYXJndW1lbnQsCi0JaWdub3JlZC4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9QUk9DRVNTX1NUQUIpIFtFQ09GRl9ERUJVR0dJTkddOiBEaXR0by4KLQotCSogY29uZmlnL29iai1lY29mZi5oIChFQ09GRl9ERUJVR0dJTkcpOiBEZWZpbmUgdG8gMSwgbm90IGVtcHR5LgotCSogY29uZmlnL29iai1lbGYuaCAoRUNPRkZfREVCVUdHSU5HKTogRGl0dG8uICBUZXN0IHZhbHVlLCBub3QKLQl3aGV0aGVyIGl0J3MgZGVmaW5lZC4KLQotV2VkIE1heSAgMyAyMTozODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcy5oIChMT0NBTF9MQUJFTFNfRE9MTEFSLCBMT0NBTF9MQUJFTFNfRkIpOiBJZiBub3QgYWxyZWFkeQotCWRlZmluZWQsIGRlZmluZSB0aGVtIHRvIHplcm8uCi0JKiBjb25maWcvdGMtKi5oLCBjb25maWcvdGUtKi5oOiBJZiBkZWZpbmluZyB0aGVtLCBkZWZpbmUgdGhlbSB0bwotCWJlIDEgaW5zdGVhZCBvZiBlbXB0eS4KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwgb3BlcmFuZCk6IFRlc3QgdGhlbSBhdCBydW4gdGltZQotCWluc3RlYWQgb2YgY29tcGlsZSB0aW1lLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBEaXR0by4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBEaXR0by4KLQkoZG9sbGFyXyosIGRlZmluZV9kb2xsYXJfbGFiZWwsIGZiXyopOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCSogc3ltYm9scy5oIChkb2xsYXJfKiwgZGVmaW5lX2RvbGxhcl9sYWJlbCwgZmJfKik6IERlY2xhcmUKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLVdlZCBNYXkgIDMgMTM6MDg6NTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvIG5vdGhpbmcgZm9yIGFuIG91dCBvZiByYW5nZQotCVBDIHJlbGF0aXZlIGNhbGwgc2luY2UgdGhvc2Ugb25seSBvY2N1ciBpbiBjYXNlcyB3aGVyZSB0aGUgbGlua2VyCi0JY2FuIGZpeCB0aGVtIHVwLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyBmb3Igb3V0IG9mIHJhbmdlIFBDCi0JcmVsYXRpdmUgY2FsbHMuCi0KLVR1ZSBNYXkgIDIgMTY6MzQ6NDcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZSAoaHBwYSotKi1saXRlcyopOiBIYW5kbGUganVzdCBsaWtlIGhwcGEqLSotKmVsZiouCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCi1UdWUgTWF5ICAyIDExOjIyOjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkocG9wX292ZXJyaWRlX29rLCBwb3BfdGFibGVfbmFtZSk6IE5ldyB2YXJpYWJsZXMuCi0JKG1kX3BvcF9pbnNlcnQsIG9ial9wb3BfaW5zZXJ0KTogTmV3IG1hY3Jvcy4KLQkocG9iZWdpbik6IFVzZSB0aGVtLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBVc2UgVVNFX1NUREFSRyBhbmQgVVNFX1ZBUkFSR1MgaW5zdGVhZCBvZgotCU5PX1NUREFSRyAmYy4KLQotCSogcmVhZC5jICh0YXJnZXRfYmlnX2VuZGlhbik6IElmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGlzCi0JZGVmaW5lZCwgaW5pdGlhbGl6ZSB0byAxLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc190YXJnZXRfZm9ybWF0KTogQ2hhbmdlZCB0byBhIGZ1bmN0aW9uLAotCWNoZWNraW5nIGZsYXZvciBhbmQgYnl0ZSBvcmRlciBhdCBydW4gdGltZS4KLQkobWRfcGFyc2Vfb3B0aW9uLCBjYXNlcyBPUFRJT05fRUIgYW5kIE9QVElPTl9FTCk6IFNldAotCXRhcmdldF9iaWdfZW5kaWFuIGhlcmUuCi0JKG1kX2JlZ2luKTogTm90IGhlcmUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX3RhcmdldF9mb3JtYXQpOiBBZGp1c3QgZGVjbGFyYXRpb24uCi0JKFRBUkdFVF9GT1JNQVQpOiBDYWxsIG1pcHNfdGFyZ2V0X2Zvcm1hdC4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCk6IERlZmluZSBpbiB0ZXJtcyBvZgotCU9VVFBVVF9GTEFWT1IuCi0JKiBjb25maWcvdGMtbWlwcy5jIChnX3N3aXRjaF92YWx1ZSwgZ19zd2l0Y2hfc2Vlbik6IERlZmluZQotCXVuY29uZGl0aW9uYWxseS4KLQkobWRfYmVnaW4sIG1pcHNfaXAsIG1kX3BhcnNlX29wdGlvbiwgc19jaGFuZ2Vfc2VjLCBzX29wdGlvbiwKLQlzX2FiaWNhbGxzLCBub3BpY19uZWVkX3JlbGF4KTogQ2hlY2sgVVNFX0dMT0JBTF9QT0lOVEVSX09QVCBhdCBydW4KLQl0aW1lLCBpbnN0ZWFkIG9mIGNvbXBpbGluZyBjb25kaXRpb25hbGx5IG9uIEdQT1BULgotCShHUE9QVCk6IERvbid0IGRlZmluZS4KLQkobWRfc2hvcnRvcHRzKTogQWx3YXlzIGluY2x1ZGUgLUcuCi0JKFJEQVRBX1NFQ1RJT05fTkFNRSk6IFNlbGVjdCBhdCBydW4gdGltZS4KLQkobWRfYmVnaW4pOiBUZXN0IGZvciBFTEYgZm9ybWF0IGF0IHJ1biB0aW1lIGluc3RlYWQgb2YgY29tcGlsZSB0aW1lLgotCShtaXBzX2lwLCBzX2NoYW5nZV9zZWMpOiBEaXR0by4KLQkobWRfcGFyc2Vfb3B0aW9uLCBjYXNlcyBPUFRJT05fQ0FMTF9TSEFSRUQgYW5kIE9QVElPTl9OT05fU0hBUkVEKToKLQlEaXR0by4KLQkoT1BUSU9OX0NBTExfU0hBUkVELCBPUFRJT05fTk9OX1NIQVJFRCwgbWlwc19yZWdtYXNrX2ZyYWcpOiBEZWZpbmUKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLVR1ZSBNYXkgIDIgMDA6MTc6MDQgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9ERVBfKik6IE5ldyB2YXJpYWJsZXMuCi0JKHRhcmctY3B1Lm8pOiBEZXBlbmQgb24gb25lLCBzZWxlY3RlZCBieSBhdXRvY29uZiBzdWJzdGl0dXRpb24sCi0JaW5zdGVhZCBvZiBUQVJHX0NQVV9ERVBFTkRFTlRTLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlICRjcHVfdHlwZSwgJG9ial9mb3JtYXQsICRhdG9mLCBhbmQKLQkkZW11bGF0aW9uIGludG8gTWFrZWZpbGUuaW4uCi0JKiBjb25maWcvaDgzMDAubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaDg1MDAubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaTM4NmNvZmYubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL202OGsubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvbTY4a2NvZmYubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL204OGtjb2ZmLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9taXBzLWJpZy5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbWlwcy1saXQubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL3NoLm10OiBEZWxldGVkLgotCSogY29uZmlnL3c2NS5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy96OGsubXQ6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy90ZS1kcHgyLmggKGRweDIpOiBEZWxldGVkIHVudXNlZCBtYWNyby4KLQkqIGNvbmZpZy90ZS1nZW5lcmljLmggKFRFX0dFTkVSSUMpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1nbzMyLmggKFRFX0dPMzIpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1ocDMwMC5oIChURV9IUDMwMCk6IERpdHRvLgotCSogY29uZmlnL3RlLWhwcGEuaCAoUEEsIF9URV9QQV9IKTogRGl0dG8uCi0JKiBjb25maWcvdGUtaWM5NjAuaCAoVEVfSUM5NjApOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1uYnNkNTMyLmggKFRFX05FVEJTRDUzMik6IERpdHRvLgotCSogY29uZmlnL3RlLXBjNTMybWFjaC5oIChURV9QQzUzMk1BQ0gpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1wcGNudy5oIChURV9QUENOVyk6IERpdHRvLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oIChzY291bml4KTogRGl0dG8uCi0KLU1vbiBNYXkgIDEgMTU6NTk6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2FwcF9maWxlKTogSWYgb2JqX2FwcF9maWxlIGlzIGRlZmluZWQsIGNhbGwgaXQgd2l0aAotCXN0cmluZyBhcyBhcmd1bWVudC4gIERvbid0IGNhbGwgY19kb3RfZmlsZV9zeW1ib2wgb3IKLQllbGZfZmlsZV9zeW1ib2wuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2FwcF9maWxlKTogRGVmaW5lIGFzIGNfZG90X2ZpbGVfc3ltYm9sLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2FwcF9maWxlKTogRGVmaW5lIGFzIGVsZl9maWxlX3N5bWJvbC4KLQotCSogYXMuaCAoT1VUUFVUX0ZMQVZPUik6IERvbid0IGRlZmluZSBoZXJlLgotCSogY29uZmlnL29iai1hb3V0LmggKE9VVFBVVF9GTEFWT1IpIFtCRkRfQVNTRU1CTEVSXTogRGVmaW5lLgotCSogY29uZmlnL29iai1ib3V0LmggKE9VVFBVVF9GTEFWT1IpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoT1VUUFVUX0ZMQVZPUikgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9VVFBVVF9GTEFWT1IpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChPVVRQVVRfRkxBVk9SKTogRGVmaW5lLgotCi1UaHUgQXByIDI3IDIwOjA3OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogVXNlIG9uZSBpbiBzcmNkaXIgaWYgcHJlc2VudC4KLQkoUlVOVEVTVEZMQUdTKTogRGVmaW5lLgotCi1XZWQgQXByIDI2IDE1OjU0OjEwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBtb3JlIHBvcnRhYmxlIGFsaWdubWVudCBoYW5kbGluZyBpbiBhc3NlbWJseSBjb2RlLAotCWJhc2VkIG9uIHBhdGNoZXMgZnJvbSBCcnlhbiBGb3JkIDxiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1PjoKLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZGVkIGJhbGlnbiBhbmQgcDJhbGlnbiwgZm9yIGFsaWduaW5nIGJ5Ci0JYnl0ZXMgb3IgcG93ZXJzIG9mIHR3byBpbmRlcGVuZGVudCBvZiB3aGF0ICIuYWxpZ24iIGRvZXMgZm9yIGEKLQlnaXZlbiB0YXJnZXQuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgdGhlbS4KLQotVHVlIEFwciAyNSAxMToxMjowNCAxOTk1ICBSb2IgU2F2b3llICA8cm9iQHRoZXB1Yi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogTG9vayBmb3IgbTY4ay0qLXZ4d29ya3MqIHJhdGhlciB0aGFuCi0JanVzdCBtNjhrLXdycy12eHdvcmtzIHNvIGdhcyBjYW4gYmUgY29uZmlndXJlZCBmb3IKLQltNjhrLXZ4d29ya3M1LjEuCi0KLUZyaSBBcHIgMjEgMTU6MTk6MDYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IElmIGZ4X3JfdHlwZSBpcyB6ZXJvLCBoYW5kbGUKLQlmeF9zaXplIG9mIDEsIGFuZCBhYm9ydCBvbiB1bnJlY29nbml6ZWQgc2l6ZXMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBGaXggYnVnIGluIGxhc3QgY2hhbmdlIHJlZ2FyZGluZwotCW5vbi1pc3ZhciBjYXNlLgotCi1TdW4gQXByIDE2IDAxOjUyOjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuaCAobWRfcmVsYXhfdGFibGUsIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOgotCU1pc3NlZCB0aGlzIG9uZSBpbiAxMSBBcHIgY2hhbmdlcy4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IEZpeCB0eXBvLgotCi1UaHUgQXByIDEzIDE4OjE4OjA4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBJbnN0ZWFkIG9mIGFib3J0aW5nIG9uIGxhcmdlCi0JZGlzcGxhY2VtZW50cywgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIERvbid0IGludm9rZSB0aGUgY29kZSB0aGF0Ci0JZm9sbG93ZWQgdGhlIGFib3J0IGNhbGwgdW50aWwgaXQncyBiZWVuIHZlcmlmaWVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zaG93X3VzYWdlKTogQWRkIDY4MDYwIHRvIGxpc3QuICBTcGxpdCBjcHUKLQlsaXN0IGludG8gdGhyZWUgbGluZXMuCi0KLVRodSBBcHIgMTMgMTQ6MzQ6MzYgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQGFkZGVyLmN5Z251cy5jb20+Ci0KLQkqIHRjLW02OGsuYyAobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBUZXN0IGZvciBtNjgzNjAuCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBtNjgzNjAuCi0JKiB0Yy1tNjhrLmggKFRBUkdFVF9XT1JEX1NJWkUpOiBEZWZpbmUuCi0JKFRBUkdFVF9BUkNIKTogRGVmaW5lLgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBJZiBUQVJHRVRfV09SRF9TSVpFIGlzIGRlZmluZWQsCi0Jc2lnbi1leHRlbmQgYXBwcm9wcmlhdGVseS4KLQotVGh1IEFwciAxMyAxMToyMDoxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBQcm9wZXJseSB1c2UgUEFSQU1TIHRvCi0JaGlkZSBwcm90b3R5cGUgZnJvbSBub24tQU5TSSBjb21waWxlcnMsIGFuZCBkb24ndCB1c2UgQU5TSSBzeW50YXgKLQlmb3IgYXJndW1lbnRzLgotCi1XZWQgQXByIDEyIDEyOjIwOjE5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiAoVERFRklORVMpOiBQdXQgZW1wdHkgZGVmaW5pdGlvbiBpbnRvCi0JbWFrZWZpbGUgZnJhZ21lbnQuCi0JKiBtcHctbWFrZS5pbiAoeG1hbGxvYy5jLm8pOiBSZW1vdmUuCi0JKGFzLm5ldyk6IERlcGVuZCBvbiBWZXJzaW9uLnIuCi0JKFZlcnNpb24ucik6IEdlbmVyYXRlIGZyb20gdmVyc2lvbiBpbmZvLgotCi0JKiBtcHctbWFrZS5pbjogRGVsZXRlIHJlZmVyZW5jZXMgdG8gaGV4LXZhbHVlLmMuCi0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBtYXBwaW5nIGZyb20gY29uZmlncyB0byBvYmplY3QgZmlsZSBmb3JtYXRzLAotCWdldCBWRVJTSU9OIGZyb20gTWFrZWZpbGUuaW4gYW5kIGFkZCB0byBtay50bXAuCi0JKG1pcHMtaWR0LWVjb2ZmKSBbVERFRklORVNdOiBBZGQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0JKiBtcHctbWFrZS5pbiAoVkVSU0lPTiwgZ0MpOiBEb24ndCBkZWZpbmUuCi0JKEFMTF9DRkxBR1MpOiBSZW1vdmUgLWQgZmxhZ3MuCi0JKGNvbmZpZy5oKTogUmVtb3ZlIGRlZmluaXRpb24gb2YgTVBXLCBhZGQgSEFWRV9TVERBUkdfSCwKLQlCRkRfQVNTRU1CTEVSLgotCi0JKiBtcHctbWFrZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCBkZWZpbml0aW9uIG9mIEhBVkVfU1REQVJHX0gsCi0JaW5jbHVkZSBvZiA6OmxpYmliZXJ0eTouCi0JKGNvbmZpZy5oKTogSWZkZWYgY29udGVudHMgb24gR0FTX1ZFUlNJT04uCi0KLQkqIG1wdy1tYWtlLmluIChhcy5jKTogQ29tcGlsZSB3aXRoIEMgbm90IGdDLgotCShjb25maWctc3RhbXApOiBUb3VjaCBjb3JyZWN0bHkuCi0JKGluc3RhbGwtb25seSk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBEZXBlbmQgb24gYWxsIGFuZCBpbnN0YWxsLW9ubHkuCi0KLQkqIG1wdy1jb25maWcuaW46IFBhcnNlIHRhcmdldCBhbmQgdXNlIHRvIGdlbmVyYXRlIGZvcndhcmQgaW5jbHVkZXMKLQl0byB0Yy0sIG9iai0sIGFuZCBhdG9mLSBmaWxlcywgdXNlIHRlLWdlbmVyaWMuaCBmb3IgZW11bGF0aW9uLgotCSogbXB3LW1ha2UuaW4gKFZFUlNJT04pOiBEZWZpbmUuCi0JKGFzLmMpOiBDb21waWxlIHdpdGggR0NDLgotCShUQVJHX09CSkVDVFMsIENMSUJTKTogRGVmaW5lLgotCShhcy5uZXcpOiBVc2UgTERGTEFHUywgVEFSR19PQkpFQ1RTLCBDTElCUyBhbmQgRVhUUkFMSUJTIGluIGxpbmsKLQljb21tYW5kLgotCShjb25maWcuaCwgY29uZmlnLXN0YW1wKTogQnVpbGQuCi0KLQkqIG1wdy1tYWtlLmluIChDLCBDRkxBR1MpOiBSZW1vdmVkIGRlZmluaXRpb25zLgotCShBTExfQ0ZMQUdTKTogRGVmaW5lLgotCVNldCBkZWZhdWx0IHJ1bGUgdG8gdXNlIHtDQ30gaW5zdGVhZCBvZiB7Q30uCi0KLQkqIG1wdy1tYWtlLmluIChpbnN0YWxsKTogTW92ZWQgaGVyZSBmcm9tIG1wdy1idWlsZC5pbi4KLQkqIG1wdy1idWlsZC5pbjogUmVtb3ZlZCwgZnVuY3Rpb25hbGl0eSBpbiBtcHctbWFrZS5pbgotCi0JKiBtcHctbWFrZS5pbiAoQ0ZMQUdTKTogQWRkIG1vcmUgaW5jbHVkZSBwYXRocy4KLQotCSogbXB3LWNvbmZpZy5pbiAodmFyYXJncy5oLCBzeXMvKi5oKTogRG9uJ3QgY3JlYXRlIHdoZW4KLQljb25maWd1cmluZy4KLQkqIG1wdy1tYWtlLmluIChDRkxBR1MpOiBBZGQgLXcgZmxhZy4KLQotCSogbXB3LW1ha2UuaW46IFJlcGxhY2UgOC1iaXQgY2hhcnMgd2l0aCB0aGVpciBuYW1lcy4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0KLVR1ZSBBcHIgMTEgMDE6NDI6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF0IGxlYXN0IGF1dG9jb25mIDIuMywgYmVjYXVzZSBlYXJsaWVyCi0JdmVyc2lvbnMgbG9zZSBvbiBzb21lIEFJWCB2ZXJzaW9ucy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG02OGstKi1lbGYuCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKSBbT0JKX0VMRl06IEluY2x1ZGUgJyMnLgotCShtZF9wc2V1ZG9fdGFibGUpIFtPQkpfRUxGXTogSWdub3JlICJzd2JlZyIuCi0JKG1kX2JlZ2luKTogU2V0IGFsdF9ub3RlbmRfdGFibGVbJyYnXSwgc28gc3ZyNC1zdHlsZSBpbW1lZGlhdGUKLQlvcGVyYW5kcyBhcmUgYWNjZXB0ZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IEFyZ3VtZW50IFZBTFAgc2hvdWxkIHBvaW50IHRvIHZhbHVlVC4KLQkobWRfY29udmVydF9mcmFnKTogQXJndW1lbnQgU0VDIHNob3VsZCBiZSB0eXBlIHNlZ1QuCi0JKG1kX3Nob3J0b3B0cykgW09CSl9FTEZdOiBBY2NlcHQgJ1EnIHdpdGggYW4gYXJndW1lbnQuCi0JKG1kX3BhcnNlX29wdGlvbik6IElnbm9yZSBpdC4KLQkobWRfY29udmVydF9mcmFnXzEpOiBBZGQgaW4gZnJhZyBhZGRyZXNzIGZvciB0aGUgc3ltYm9sIGluIHRoZQotCWRpc3BsYWNlbWVudCBjYWxjdWxhdGlvbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpIFtPQkpfRUxGXTogVXNlICJlbGYzMi1tNjhrIi4KLQkoVEFSR0VUX0FSQ0gpOiBEZWZpbmUuCi0JKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCkgW09CSl9FTEZdOiBEZWZhdWx0IHRvIDAuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUsIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCk6IEhhbmRsZQotCXRoZXNlIHRoZSBzYW1lIHdheSBmb3IgT0JKX0VMRiBhcyBmb3IgTTY4S0NPRkYuCi0KLQkqIGdkYmluaXQuaW46IEFkZCBicmVha3BvaW50IGluIGFzX2Fib3J0LgotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogSWYgb2Zmc2V0IGlzIGxlc3MgdGhhbiB6ZXJvLAotCWNvbXBsYWluIGFib3V0IGl0IHNwZWNpZmljYWxseSwgaW5zdGVhZCBvZiByZXBvcnRpbmcgYW4gYXNzZXJ0aW9uCi0JZmFpbHVyZS4KLQkocmVsYXhfc2VnbWVudCk6IENvbXBsYWluIGFib3V0IC5vcmcgYmFja3dhcmRzLCB0aGVuIGlnbm9yZSBpdC4KLQlEbyBnZW5lcmljIHJzX21hY2hpbmVfZGVwZW5kZW50IHJlbGF4YXRpb24gb25seSBpZgotCVRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgaXMgZGVmaW5lZCwgYW5kIHVzZSBpdHMgdmFsdWUgZm9yIHRoZSBiYXNlCi0Jb2YgdGhlIHRhYmxlLgotCSogdGMuaCAobWRfcmVsYXhfdGFibGUpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKiBhcy5oIChzdHJ1Y3QgcmVsYXhfdHlwZSk6IEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciB0eXBlLgotCSogY29uZmlnL3RjLWEyOWsuYzogRGVsZXRlZCBtZF9yZWxheF90YWJsZS4KLQkqIGNvbmZpZy90Yy17YWxwaGEsYXJtLGg4MzAwLGhwcGEsaTg2MCxtODhrLG1pcHMscHBjLHNwYXJjLHo4a30uYzoKLQlEaXR0by4KLQkqIGNvbmZpZy90Yy17aDg1MDAsaTM4NixpOTYwLG5zMzJrLHNoLHRhaG9lLHZheCx3NjV9Lmg6IERlY2xhcmUKLQltZF9yZWxheF90YWJsZSBoZXJlLCBhbmQgZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgdG8gZXhwYW5kCi0JdG8gbWRfcmVsYXhfdGFibGUuCi0JKiBjb25maWcvdGMtaDg1MDAuYyAobWRfcmVsYXhfdGFibGUpOiBObyBsb25nZXIgY29uc3QuCi0JKiBjb25maWcvdGMtdzY1LmMgKG1kX3JlbGF4X3RhYmxlKTogRGl0dG8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvcnRfanVtcF9zaXplLCBtZF9sb25nX2p1bXBfc2l6ZSk6Ci0JRGVsZXRlZC4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRGVzY3JpYmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBhbmQKLQlXT1JLSU5HX0RPVF9XT1JELiAgTWVudGlvbiBtZF8qX2p1bXBfc2l6ZSAoYnV0IGRlc2NyaXB0aW9uIG5lZWRzCi0JdG8gYmUgZmxlc2hlZCBvdXQgbGF0ZXIpLiAgTm90ZSBtNjhrIFBDSU5ERVggbW9kZSBoYXMgYmVlbiBjaGVja2VkCi0JaW4uCi0KLU1vbiBBcHIgMTAgMTU6NTc6NDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHNwbGl0Ci0Jb3V0IGZyb20gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXguCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQ2FsbCBpdC4KLQkobG9hZF9hZGRyZXNzLCBtYWNybyk6IEluIE5PX1BJQyBicmFuY2hlcywgaWYgbm9waWNfbmVlZF9yZWxheAotCXJldHVybnMgbm9uemVybywgZG9uJ3QgYXR0ZW1wdCBHUCBvcHRpbWl6YXRpb24uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKFBDSU5ERVgpOiBOZXcgbWFjcm8uCi0JKG1kX3JlbGF4X3RhYmxlKTogTm8gbG9uZ2VyIGNvbnN0LiAgQWRkIFBDSU5ERVggZW50cmllcy4KLQkobTY4a19pcCk6IEZvciBBSU5EWCB3aXRoIHNpbXBsZSBzeW1ib2wgb3BlcmFuZCwgZ2VuZXJhdGUgYQotCVBDSU5ERVggZnJhZyBpZiBQQyBpcyB1c2VkLCBvciBkbyBub3JtYWwgbm9uLUFJTkRYIHByb2Nlc3NpbmcgZm9yCi0JYWRkcmVzcyByZWdpc3Rlci4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBJZiBjcHUgaXMgNjgwMDAgb3IgNjgwMTAsIGZpeAotCW1kX3JlbGF4X3RhYmxlIHRvIHByZXZlbnQgcmVsYXhhdGlvbiBvZiBQQ0lOREVYL0JZVEUgbW9kZSB0bwotCVNIT1JULCBzaW5jZSB0aGV5IGRvbid0IHN1cHBvcnQgdGhhdCBtb2RlLgotCShtZF9jb252ZXJ0X2ZyYWdfMSwgY2FzZSBQQ0xFQS9MT05HKTogQWRkIDQgdG8gb2Zmc2V0LCBub3QgMi4gIEFkZAotCXN1cHBvcnQgZm9yIG5ldyBQQ0lOREVYIG1vZGVzLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFByb2Nlc3MgUENJTkRFWC9TWl9VTkRFRiBtb2RlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWdfMSwgY2FzZSBQQ0xFQS9TSE9SVCk6IEFkZCAyIHRvCi0Jb2Zmc2V0LgotCShtNjhrX2lwLCBjYXNlIG1vc3QgcHVuY3R1YXRpb24vQU9GRik6IElmIHVzaW5nIFBDLCBjYWxsIGFkZF9mcmFnCi0JdXNpbmcgUENMRUEuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IERvbid0IGV4cGxpY2l0bHkgaW5jbHVkZSBjb25maWcuaC4gIERlbGV0ZWQgYQotCWJ1bmNoIG9mICIjaWYgMCIgY29kZSBhbmQgdXNlbGVzcyBjb21tZW50cy4KLQkoc3RydWN0IG02OGtfY3B1KTogTmV3IHR5cGUuCi0JKGFyY2hzLCBuX2FyY2hzKTogTmV3IHZhcmlhYmxlcywgd2l0aCBzaW5nbGUgbGlzdCBvZiBuYW1lL2VudW0KLQltYXBwaW5nIGFuZCBhbGlhc2VzLgotCShtNjhrX2lwKTogRGVsZXRlIHRoZSB0YWJsZSBoZXJlLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSB0aGUgbmV3IHRhYmxlIGhlcmUgaW5zdGVhZCBvZgotCW9wZW4tY29kaW5nIGl0LgotCShtZF9wYXJzZV9vcHRpb24sIGNhc2UgJ20nKTogRGl0dG8uCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBGaXggcnVsZSBmb3IgcnVubmluZyBjb25maWcuc3RhdHVzLgotCShpbnRlcm5hbHMuZHZpLCBpbnRlcm5hbHMucHMsIGludGVybmFscy5wczQpOiBOZXcgdGFyZ2V0cywgbm90Ci0JYnVpbHQgYnkgZGVmYXVsdC4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBBZGQgbG91ZCBkaXNjbGFpbWVyLiAgUmVmaWxsIHRvIDc5IGNvbHVtbnMsCi0Jc3BlY2lmeSBmaWxsLWNvbHVtbiBpbiBsb2NhbC12YXJpYWJsZXMgc2VjdGlvbi4gIENoYW5nZQotCXN1YmhlYWRpbmdzIHRvIHN1YnNlY3Rpb25zIHNvIHRoZXkgY2FuIGJlIGNyb3NzLXJlZmVyZW5jZWQuCi0JRGVzY3JpYmUgYnJva2VuIHdvcmRzLCBmcmFncywgZnJhZyBjaGFpbnMsIGdlbmVyaWMgcmVsYXhhdGlvbiwKLQlyZWxheCB0YWJsZSwgbTY4ayByZWxheGF0aW9uLCBtNjhrIGFkZHJlc3NpbmcgbW9kZXMsIHRlc3Qgc3VpdGUKLQljb2RlLiAgQWRkIGEgZmV3IHdvcmRzIGFib3V0IHZhcmlvdXMgZmlsZSBmb3JtYXRzLgotCi0JKiBkb2MvYXMudGV4aW5mbyAobTY4ayk6IFJlY29tbWVuZCB1c2luZyBgJScgd2l0aCByZWdpc3RlcnMgYXMgdGhlCi0Jbm9ybWFsIGNhc2UsIGluc3RlYWQgb2YgdGhlIGV4Y2VwdGlvbmFsIGNhc2UuCi0KLVRodSBNYXIgMzAgMTQ6Mzg6NDcgMTk5NSAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBsaW51eCB0byBkZWZhdWx0IHRvIGVsZi4gIFVzaW5nCi0JaVszNDVdODYtKi1saW51eGFvdXQgd2lsbCBkZWZhdWx0cyB0byBhLm91dC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIE1hciAyOSAxNzoxNjozMCAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAYWRkZXIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBDYXN0IG5lZ2F0aXZlIG9mZnNldHMgdG8gb2Zmc2V0VAotCShmb3IgaG9zdGluZyBvbiA2NCBiaXQgbWFjaGluZXMpLgotCi1UdWUgTWFyIDIxIDE2OjUzOjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLW1pcHM0IGFuZCAtbTQ2NTAuCi0KLUZyaSBNYXIgMTcgMTY6NDc6MTMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEFkZCBQUk9HUkVTUyBtYWNyb3MuCi0KLUZyaSBNYXIgMTcgMTI6NDA6MzQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBNYWtlIHN1cmUgdG8gYWx3YXlzIHJlc2V0IHRoZSBmcmFnCi0JYW5kIHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzLgotCi1UaHUgTWFyIDE2IDE3OjI2OjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgbm9uIFBDIHJlbGF0aXZlCi0JcG9pbnRlcnMgaW4gdGhlIC5jdG9ycyBhbmQgLmR0b3JzIHNlY3Rpb24gYWxzbyB3aGVuIHVzaW5nIHRoZQotCS1tcmVsb2NhdGFibGUgb3B0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBTdXBwb3J0IC1tNDAzIGFzIGEgUG93ZXJQQyBjb21wdXRlci4KLQkobWRfc2hvd191c2FnZSk6IERpdHRvLgotCi1XZWQgTWFyIDE1IDE0OjQ1OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpOiBUaGUgY3VyX3Njb3BlIGZpZWxkIG9mIGEgZmlsX3B0cgotCW1heSBiZSBOVUxMIHdoZW4gZ2l2ZW4gc3RyYW5nZSBpbnB1dC4gIERvbid0IGNvcmUgZHVtcC4KLQotVHVlIE1hciAxNCAyMTozNjozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBEb24ndCB1c2UgYWRkaXUgZm9yIGRsaSBvZiBhbgotCXVuc2lnbmVkIHNlZW1pbmdseSBuZWdhdGl2ZSBudW1iZXIuICBEb24ndCBib3RoZXIgc2hpZnRpbmcgYSB6ZXJvCi0JdmFsdWUuCi0JKG1pcHNfaXApOiBGb3IgY2FzZSAnaicsIGlmIHRoZXJlIGFyZSBtb3JlIGFsdGVybmF0aXZlcywgYW5kIHRoZQotCUlTQSBsZXZlbCBpcyBhdCBsZWFzdCAzLCBkb24ndCBhY2NlcHQgYW4gdW5zaWduZWQgc2VlbWluZ2x5Ci0JbmVnYXRpdmUgbnVtYmVyLgotCi1UdWUgTWFyIDE0IDE5OjE2OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19hcHBfbGluZSk6IEZpeCBsYXN0IHBhdGNoIHRvIGRlYWwgd2l0aCBhIGxpbmUgbnVtYmVyCi0Jb2YgMS4KLQotVHVlIE1hciAxNCAxNzowMDo1NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBVc2UgYXNfd2Fybl93aGVyZSwgbm90Ci0JYXNfYmFkX3doZXJlIHRvIGdpdmUgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gZXJyb3IuCi0KLU1vbiBNYXIgMTMgMTc6MDM6NDYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiAgaXNzdWUgYSB3YXJuaW5nIGlmIGEgY29uc3RhbnQKLQlpcyB1c2VkIGFzIGFuIG9wZXJhbmQgd2hlcmUgYW4gaW1tZWRpYXRlIHZhbHVlIGlzIG5vdCBhbGxvd2VkLgotCi1GcmkgTWFyIDEwIDE5OjIxOjE5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBSZWRvIG15IDEwIEphbiBjaGFuZ2UsIGJ1dCBnZXQgaXQgcmlnaHQgdGhpcwotCXRpbWUuIDotKQotCShmaXh1cF9zZWdtZW50KTogSWYgbGlua3JlbGF4IGlzIHNldCwganVzdCByZXR1cm4uCi0JKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgdHJlYXQgaDgzMDAgYW5kIHo4ayBzcGVjaWFsbHkgd2l0aAotCXJlZ2FyZCB0byBmaXh1cHMuCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfYmVnaW4pOiBTZXQgbGlua3JlbGF4LgotCSogY29uZmlnL3RjLXo4ay5jIChtZF9iZWdpbik6IERpdHRvLgotCi1UaHUgTWFyICA5IDE4OjAxOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfaGVhZGVyX2FwcGVuZCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dC4KLQotVGh1IE1hciAgOSAxMzo1MTozMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JRGVsZXRlIHRoaXMgcGF0Y2gsIGl0IGJyZWFrcyB0aGUgaDgzMDAgYXNzZW1ibGVyLgotCVR1ZSBKYW4gMTAgMTM6MzQ6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IHRyZWF0IGg4MzAwIGFuZCB6OGsKLQlzcGVjaWFsbHkgd2l0aCByZWdhcmQgdG8gZml4dXBzLgotCi1UaHUgTWFyICA5IDEyOjI4OjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtcmVsb2NhdGFibGUpOiBDaGFuZ2UgdHlwZSB0byBib29sZWFuLgotCShtZF9iZWdpbik6IFNldCB0aGUgRUZfUFBDX1JFTE9DQVRBQkxFIGlmIC1tcmVsb2NhdGFibGUuCi0KLVdlZCBNYXIgIDggMTU6Mzk6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IENoZWNrIGZvciBhIGNwdSBzdHJpbmcgb2YgcjgwMDAgb3IKLQlyMTAwMDAuICBJZiBtaXBzX2lzYSBpcyA0LCBzZXQgdGhlIG1hY2hpbmUgbnVtYmVyIHRvIDgwMDAuCi0JKGFwcGVuZF9pbnNuKTogSWYgbWlwc19pc2EgaXMgYXQgbGVhc3QgNCwgZG9uJ3QgZ2VuZXJhdGUgbm9wcyBmb3IKLQljb3Byb2Nlc3NvciBkZWxheXMuICBDaGVjayBJTlNOX1JFQURfRlBSX1Igd2hlbiBzZXR0aW5nCi0JbWlwc19jcHJtYXNrWzFdLgotCShtaXBzX2VtaXRfZGVsYXlzKTogSWYgbWlwc19pc2EgaXMgYXQgbGVhc3QgNCwgZG9uJ3QgZ2VuZXJhdGUgbm9wcwotCWZvciBjb3Byb2Nlc3NvciBkZWxheXMuCi0JKG1pcHNfaXApOiBDaGVjayBmb3IgSU5TTl9JU0E0IGluc3RydWN0aW9ucy4gIEhhbmRsZSBuZXcgYXJndW1lbnQKLQl0eXBlcyAnaCcsICdSJywgJ04nLCBhbmQgJ00nLgotCShtZF9sb25nb3B0cyk6IEFjY2VwdCAibWlwczQiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLW1pcHM0LCBhbmQgLW1jcHU9MTAwMDAgYW5kIC1tY3B1PTgwMDAuCi0JKHNfbWlwc3NldCk6IFBlcm1pdCAuc2V0IG1pcHM0LgotCi1XZWQgTWFyICA4IDA5OjM2OjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFsbG93IC5zdGFiIHNlY3Rpb25zIHRvCi0JaGF2ZSBub24gUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2l0aCAtbXJlbG9jYXRhYmxlLgotCi1XZWQgTWFyICA4IDAyOjU3OjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG9wY29kZV9wdHIpOiBSZXR1cm4gcG9pbnRlciB0byBjb25zdC4KLQkobWRfYmVnaW4pOiBNYWtlIGhhc2ggdGFibGUgZXJyb3JzIGZhdGFsLiAgUHJvY2VzcyBvcGNvZGUgYWxpYXNlcwotCWFmdGVyIG1haW4gb3Bjb2RlIHRhYmxlLgotCShtZF9hcHBseV9maXhfMiwgY2FzZSA0KTogUmVjb2RlIHNldHRpbmcgb2YgbG93ZXJfbGltaXQgdG8gYXZvaWQKLQlnY2Mgd2FybmluZy4KLQotVHVlIE1hciAgNyAxNjowNzoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgU1BBUkMgVjksIGZyb20gRG91ZyBFdmFucwotCTxkamVAY3lnbnVzLmNvbT4uCi0KLU1vbiBNYXIgIDYgMDk6NTg6MzQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IENoYW5nZSBhbGwgb2NjdXJlbmNlcyBvZiBwYS04OSB3aXRoIHBhLTExIHRvCi0JYmUgY29uc2lzdGVudCB3aXRoIGN1cnJlbnQgbmFtaW5nIGNvbnZlbnRpb25zLgotCShtZF9iZWdpbik6IFNldCBhIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUuCi0JKHBhX2lwKTogSWYgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVzIGEgbmV3ZXIgbWFjaGluZSB0eXBlCi0JdGhhbiB0aGUgY3VycmVudCBtYWNoaW5lIHR5cGUsIHRoZW4gdXBkYXRlIHRoZSBjdXJyZW50IG1hY2hpbmUKLQl0eXBlLgotCShuZWVkX3BhMTFfb3Bjb2RlKTogTGlrZXdpc2UuCi0KLVN1biBNYXIgIDUgMTk6Mzg6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd6Jyk6IERvbid0IGxvc2UgYXJndW1lbnQKLQlyZWxvY2F0aW9uIGJpdHMgZm9yIGFic29sdXRlIGNhbGxzLgotCi1GcmkgTWFyICAzIDE3OjQxOjUwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC4qIChtZF9vcGVyYW5kKTogQ2hhbmdlIGVtcHR5IGZ1bmN0aW9uIHRvIGVtcHR5Ci0JbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IE1ha2UgSDgvMzAwLUggd2FybmluZyBtZXNzYWdlCi0JY2xlYXJlci4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBJZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgZmFpbHMsCi0JcHJpbnQgYSBtZXNzYWdlIGFuZCBleGl0LCBpbnN0ZWFkIG9mIGFib3J0aW5nLgotCi1GcmkgTWFyICAzIDE2OjI2OjE5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdGMuaCAobWRfYXBwbHlfZml4Myk6IElmIE1EX0FQUExZX0ZJWDMgaXMgZGVmaW5lZCwgZGVjbGFyZQotCW1kX2FwcGx5X2ZpeDMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBNRF9BUFBMWV9GSVgzIGlzIGRlZmluZWQsIGNhbGwKLQltZF9hcHBseV9maXgzIHdpdGggdGhlIG5vcm1hbCAyIGFyZ3VtZW50cyBhbmQgdGhlIGN1cnJlbnQgc2VnbWVudAotCXBvaW50ZXIgaW5zdGVhZCBvZiBtZF9hcHBseV9maXguCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IFdhcm4gaWYgLW1yZWxvY2F0YWJsZQotCWFuZCBhIG5vbiBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIHRoYXQgaXNuJ3QgaW4gdGhlIC5nb3QyIHNlZ21lbnQKLQl3YXMgcGVyZm9ybWVkLgotCShtZF9hcHBseV9maXgzKTogUmVuYW1lIGZyb20gbWRfYXBwbHlfZml4IGFuZCB0YWtlIHNlZ21lbnQgcG9pbnRlcgotCWFzIHRoaXJkIGFyZ3VtZW50LiAgSWYgRUxGIG9iamVjdCBmb3JtYXQsIGNhbGwgcHBjX2VsZl92YWxpZGF0ZV9maXgKLQlmb3Igbm9ybWFsIHJlbG9jYXRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiBFTEYgb2JqZWN0IGZvcm1hdCwgcmVjb2duaXplIHRoZQotCS1tcmVsb2NhdGFibGUgc3dpdGNoLgotCi1UaHUgTWFyICAyIDE2OjM0OjQ0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoQU9VVF9NQUNIVFlQRSk6IERlZmluZSBhcyAxMDAsIG5vdCAwLgotCi1UdWUgRmViIDI4IDE4OjI5OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYywgY29uZmlnL3RjLWFybS5oIChtZF9vcGVyYW5kKTogUmVwbGFjZWQgZW1wdHkKLQlmdW5jdGlvbiBpbiAuYyBmaWxlIHdpdGggZW1wdHkgbWFjcm8gaW4gLmggZmlsZS4KLQkqIGNvbmZpZy90Yy1oODUwMC4qLCBjb25maWcvdGMtaHBwYS4qLCBjb25maWcvdGMtaTM4Ni4qLAotCWNvbmZpZy90Yy1pODYwLiosIGNvbmZpZy90Yy1pOTYwLiosIGNvbmZpZy90Yy1uczMyay4qLAotCWNvbmZpZy90Yy1wcGMuKiwgY29uZmlnL3RjLXNoLiosIGNvbmZpZy90Yy1zcGFyYy4qLAotCWNvbmZpZy90Yy10YWhvZS4qLCBjb25maWcvdGMtdmF4LiosIGNvbmZpZy90Yy13NjUuKiwKLQljb25maWcvdGMtejhrLio6IERpdHRvLgotCSogY29uZmlnL3RjLW02OGsuKjogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1vdGVfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBkb3RzIGZyb20gb3Bjb2RlCi0JbmFtZXMuCi0KLQkqIHJlYWQuYyAoc19hcHBfbGluZSk6IElnbm9yZSBub24tcG9zaXRpdmUgbGluZSBudW1iZXJzLgotCi1UdWUgRmViIDI4IDE1OjM0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBQTFQgb3IKLQlHT1QgcmVsb2NzIGVpdGhlci4KLQotTW9uIEZlYiAyNyAxMzowMzo0MSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBhMjlrLSotdnh3b3JrcyBjb25maWd1cmF0aW9uLgotCi1GcmkgRmViIDI0IDE0OjQxOjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFRha2UgZGJsIGFyZ3VtZW50IHRvIGRldGVybWluZQotCWhhbmRsaW5nIG9mIHNpZ25lZCAzMiBiaXQgdmFsdWVzIGluIDY0IGJpdCBtb2Rlcy4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShtYWNybyk6IEhhbmRsZSBNX0RMSSBhbmQgTV9ETEFfQUIuCi0KLVdlZCBGZWIgMjIgMjM6MTA6NTYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvbid0IHN1YnRyYWN0IHRoZSB2YWx1ZSBvZiB0aGUKLQlhZGQgc3ltYm9sIGlmIGl0J3MgYSBjb21tb24gc3ltYm9sICh0aGUgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sCi0JaXMgaXRzIHNpemUsIG5vdCBhIHZhbHVlIGluIHRoZSB0cmFkaXRpb25hbCBzZW5zZSkuCi0KLVdlZCBGZWIgMjIgMjE6MTI6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IElmIGxpc3RpbmdfcHJldl9saW5lIGlzIGNhbGxlZCwKLQljYWxsIGZyYWdfZ3JvdyB0byBtYWtlIHN1cmUgdGhlcmUgaXMgc3RpbGwgcm9vbSBmb3IgYSB2YXJpYW50LgotCi1GcmkgRmViIDE3IDE0OjUwOjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIDJieXRlLCA0Ynl0ZSBhbmQgOGJ5dGUKLQlpZiBPQkpfRUxGLiAgRnJvbSBnYXJ5QEludHJlcGlkLkNPTSAoR2FyeSBGdW5jaykuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IFdhcm4gaWYgYSBzeW1ib2wgaXMgYm90aAotCXdlYWsgYW5kIGNvbW1vbi4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IExpa2V3aXNlLgotCi1GcmkgRmViIDE3IDEyOjQzOjQ3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBEb24ndCByZWRlZmluZSBieXRlIHVuZGVyCi0JRUxGLgotCShwcGNfZWxmX2NvbnMpOiBEb24ndCBzdXBwb3J0IEBwY3JlbCBhbnkgbW9yZSwgc2luY2UgRElGRl9FWFBSX09LCi0JYWxsb3dzIHRoZSBub3JtYWwgZXhwcmVzc2lvbnMgdG8gZ2VuZXJhdGUgaXQuCi0JKG1kX2FwcGx5X2ZpeCk6IENvbnZlcnQgQkZEX1JFTE9DXzMyIHdpdGggcGNyZWwgYml0IHNldCBpbnRvCi0JQkZEX1JFTE9DXzMyX1BDUkVMLiAgQWJvcnQgaWYgZWl0aGVyIEJGRF9SRUxPQ18xNiBvciBCRkRfUkVMT0NfOAotCW5lZWQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lIHRvIGFsbG93IFBDIHJlbGF0aXZlCi0JZXhwcmVzc2lvbnMgdG8gYmUgaGFuZGxlZC4KLQotVGh1IEZlYiAxNiAxNDozMDoxMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IE1vdmUgbWRfb3BlcmFuZCBoYW5kbGluZyB0byBkZWZhdWx0IGNhc2UKLQkoc28gaXQgd29ya3MpLgotCi1XZWQgRmViIDE1IDE2OjA4OjQ3IDE5OTUgIEphc29uIE1vbGVuZGEgIDxjcmFzaEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDg1MDAuYyAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogQWRkIGlnbm9yZWQKLQlwYXJhbWV0ZXIsIHRvIG1hdGNoIHByb3RvdHlwZS4KLQotV2VkIEZlYiAxNSAxNTowNzowMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgRUxGLCBnbyB0byBwcGNfZWxmX2NvbnMKLQlpbnN0ZWFkIG9mIGNvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBTaG93IGFsbCBvZiB0aGUgUG93ZXJQYyBvcHRpb25zLgotCShwcGNfZWxmX3N1ZmZpeCk6IE5ldyBmdW5jdGlvbiB0byByZWNvZ25pemUgRUxGIHN1ZmZpeGVzIHRoYXQKLQlzcGVjaWZ5IGEgcmVsb2NhdGlvbiwgc3VjaCBhcyBAR09ULgotCShwcGNfZWxmX2NvbnMpOiBSZXBsYWNlbWVudCBmb3IgdGhlIHN0YW5kYXJkIGNvbnMgZnVuY3Rpb24gdGhhdAotCWtub3dzIGFib3V0IHRoZSBFTEYgc3VmZml4ZXMuCi0JKHBwY19maXh1cCk6IEFkZCByZWxvYyBmaWVsZCB0byBob2xkIG5vbi1zdGFuZGFyZCByZWxvY2F0aW9uLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBFTEYgc3VmZml4ZXMgbGlrZSBAR09ULgotCShtZF9jcmVhdGVfc2hvcnRfanVtcCk6IER1bW15IGluIGNhc2UgV09SS0lOR19ET1RfV09SRCBpcyBub3QKLQlkZWZpbmVkLgotCShtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKG1kX3Nob3J0X2p1bXBfc2l6ZSk6IERpdHRvLgotCShtZF9sb25nX2p1bXBfc2l6ZSk6IERpdHRvLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DXzMyX1BDUkVMLCBCRkRfUkVMT0NfTE8xNiwKLQlCRkRfUkVMT0NfSEkxNiwgQkZEX1JFTE9DX0hJMTZfUywgQkZEX1JFTE9DX1BQQ19UT0MxNiwgYW5kCi0JQkZEX1JFTE9DXzE2IHJlbG9jYXRpb25zLiAgSWYgcmVsb2NhdGlvbiBjYW4gbm90IGJlIGZvdW5kLCBwcmludAotCXRoZSBkZWNpbWFsIHZhbHVlIG9mIHRoZSByZWxvY2F0aW9uLgotCi1XZWQgRmViIDE1IDExOjQ2OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogQWNjZXB0IEJGRF9SRUxPQ18xNiwgZm9yCi0JRFdBUkYuICBGcm9tIGdhcnlASW50cmVwaWQuQ09NIChHYXJ5IEZ1bmNrKS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBIYW5kbGUgTV9Ve0wsU31EW19BXSAodW5hbGlnbmVkIGRvdWJsZQotCWxvYWRzIGFuZCBzdG9yZXMpLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG8gYWRqdXN0IGdsb2JhbAotCXN5bWJvbHMgaWYgT0JKX0FPVVQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRG9uJ3QgdXNlIHRoZSB0YXJnZXQgcmVnaXN0ZXIgYXMgYQotCWJhc2UgcmVnaXN0ZXIgd2hlbiBidWlsZGluZyB0aGUgYWRkcmVzcyBmb3IgTV9Me1csRH17TCxSfV9BQi4KLQotTW9uIEZlYiAxMyAxNDo0NDozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKEtUMCwgS1QxKTogRGVmaW5lLgotCShtaXBzX2lwKTogUmVjb2duaXplICRrdDAgYW5kICRrdDEgYXMgcmVnaXN0ZXIgbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZSBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IElmIE9CSl9FTEYsIHN1YnRyYWN0IG91dCB0aGUKLQl2YWx1ZSBvZiBhIGRlZmluZWQgc3ltYm9sOyB0aGUgdmFsdWUgd2FzIGFkZGVkIGluIGJ5Ci0JZml4dXBfc2VnbWVudC4gIFRoaXMgd2FzIHByZXZpb3VzbHkgY29ycmVjdGVkLCBpZiB0aGUgcmVsb2Mgd2FzCi0JY2hhbmdlZCB0byBiZSBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIGluIHRjX2dlbl9yZWxvYy4KLQotRnJpIEZlYiAxMCAxNDowNDowNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBVc2UgU19JU19FWFRFUk4KLQlyYXRoZXIgdGhhbiAhU19JU19MT0NBTC4KLQotVGh1IEZlYiAgOSAxODoxNjozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRqdXN0IGNvbmRpdGlvbnMgZm9yIGNoYW5naW5nCi0JQkZEX1JFTE9DXzMyIHRvIEJGRF9SRUxPQ18zODZfR09UUEMgdG8gaGFuZGxlIGEgc3dpdGNoIGluIGZyYWdzLgotCVBhdGNoIG9yaWdpbmFsbHkgZnJvbSBSb2IgUnlhbiA8cm9ickBjbXUuZWR1Pi4KLQotCSogY29uZmlnL3RjLWkzODYuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlIHJldHVybiB2YWx1ZS4KLQkoaTM4Nl9vcGVyYW5kKTogRG9uJ3QgdXNlIGFuIGFzc2lnbm1lbnQgZGlyZWN0bHkgYXMgYSBjb25kaXRpb24uCi0KLVRodSBGZWIgIDkgMTA6Mzc6MTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEluIHNvbWUgY2FzZXMgc3VidHJhY3QgdGhlCi0JdmFsdWUgb2YgdGhlIGFkZCBzeW1ib2wgZnJvbSB2YWxwLiAgT2Zmc2V0cyBicmFpbmRhbWFnZSBpbiB0aGUKLQkibWFjaGluZSBpbmRlcGVuZGVudCIgZml4dXBfc2VnbWVudC4KLQotV2VkIEZlYiAgOCAxODo1MToyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtZXNzYWdlcy5jIChhc19hYm9ydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKGFzX2Fib3J0KTogRGVjbGFyZSBpdC4KLQkoYWJvcnQpOiBOZXcgbWFjcm8uCi0KLQlUaHUgSmFuIDE5IDE4OjEwOjA1IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvdm1zLWNvbmYuaCAoSEFWRV9VTklTVERfSCk6ICBkZWZpbmUgaXQgdW5jb25kaXRpb25hbGx5LgotCSogY29uZmlnLWdhcy5jb206ICB0ZXN0IGZvciBhdmFpbGFiaWxpdHkgb2YgPHVuaXN0ZC5oPjsgY3JlYXRlIGEKLQlydWRpbWVudGFyeSBvbmUgaWYgbmVjZXNzYXJ5LgotCi1UdWUgRmViICA3IDEzOjM0OjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgcG93ZXJwYy0qLWVhYmkgc3VwcG9ydCwgd2hpY2ggaXMgdGhlIHNhbWUgYXMKLQlwb3dlcnBjLSotZWxmLgotCShjb25maWd1cmUpOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYuCi0KLU1vbiBGZWIgIDYgMDM6Mzc6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBCcnlhbiBGb3JkIDxiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1PiBmb3IgaTM4NgotCTE2LWJpdCBhbmQgbXNkb3Mgc3VwcG9ydDoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGZsYWdfMTZiaXRfY29kZSk6IE5ldyB2YXJpYWJsZS4KLQkoc2V0XzE2Yml0X2NvZGVfZmxhZyk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkZWQgZW50cmllcyAiY29kZTE2IiBhbmQgImNvZGUzMiIuCi0JKG1kX2Fzc2VtYmxlKTogRW5zdXJlIHRoYXQgY29ycmVjdCBkYXRhLXNpemUgcHJlZml4ZXMgZ2V0IGVtaXR0ZWQsCi0JYmFzZWQgb24gdGhlIGN1cnJlbnQgbW9kZS4gIEVuc3VyZSB0aGF0IDMyLWJpdCBhZGRyZXNzaW5nIHdpbGwKLQlhbHdheXMgYmUgZG9uZS4gIE1vdmUgc2VnbWVudC1wcmVmaXggaGFuZGxpbmcgY29kZS4gIChXaHk/KSAgVXNlCi0JMTYtYml0IGp1bXBzIGZvciAxNi1iaXQgY29kZSwgMzItYml0IGp1bXBzIGZvciAzMi1iaXQgY29kZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE1BWF9QUkVGSVhFUyk6IEJ1bXAgdG8gNS4KLQkoRGF0YTE2LCBEYXRhMzIpOiBEZWZpbmUuCi0JKiBkb2MvYXMudGV4aW5mbyAoaTM4Ni0xNmJpdCk6IE5ldyBub2RlLgotCSogY29uZmlndXJlLmluIChpMzg2LSotbXNkb3MqKTogTmV3IHRhcmdldCwgdXNpbmcgYS5vdXQgZm9ybWF0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEZlYiAgMiAxNToyMToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChjcHUzMl9jb250cm9sX3JlZ3MpOiBOZXcgbWFjcm8uCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIGl0LCBmb3IgY3B1MzIgcHJvY2Vzc29ycy4KLQotCVR1ZSBKYW4gMzEgMTc6MjA6NDUgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZtc190aXJfc3RhY2tfcHNlY3QpOiAgbmV3IHJvdXRpbmU7Ci0JKFZNU19TZXRfRGF0YSwgVk1TX1NldF9Qc2VjdCwgVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlLAotCVZNU19UQlRfUm91dGluZV9CZWdpbiwgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uKTogIHVzZSBpdDsKLQkoVk1TX0dsb2JhbF9TeW1ib2xfU3BlYywgVk1TX1Byb2NlZHVyZV9FbnRyeV9QdCk6ICB0cmVhdAotCVBzZWN0X051bWJlciBhcyBgdW5zaWduZWQnLgotCi0JVGh1IEphbiAyNiAxNzowNjoyOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYzogIHBlcmZvcm1hbmNlIHR1bmluZy4KLQkoVk1TX1N5bWJvbF90eXBlX2xpc3QpOiAgY29udmVydCBmcm9tIHNpbmdsZSBsaXN0IGhlYWQgdG8gc21hbGwKLQlhcnJheSBvZiBsaXN0IGhlYWRzOwotCShTWU1UWVBfSEFTSCk6ICBuZXcgbWFjcm8gZm9yIGFjY2Vzc2luZyBWTVNfU3ltYm9sX3R5cGVfbGlzdFtdOwotCShmaW5kX3N5bWJvbCwgc2V0dXBfYmFzaWNfdHlwZSwgVk1TX3R5cGVkZWZfcGFyc2UpOiAgdXNlIGl0OwotCShWTVNfUlNZTV9QYXJzZSk6ICBtb3ZlIFNfR0VUX1ZBTFVFKCkgaW5zaWRlIHN3aXRjaCB0byBhdm9pZAotCWNhbGxpbmcgaXQgZm9yIHVuaW50ZXJlc3RpbmcgY2FzZXMuCi0KLVdlZCBGZWIgIDEgMjM6NTI6NDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEdvIGFoZWFkIGFuZCBjYWxsCi0JaHBwYV9maWVsZF9hZGp1c3QgdG8gZ2V0IGEgbmV3IHZhbHVlIGZvciBSX0RBVEFfT05FX1NZTUJPTAotCXJlbG9jYXRpb25zIGluIFNPTS4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IFJlZmluZSBzb21ld2hhdC4KLQotRnJpIEphbiAyNyAyMToyOTo1MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoTk9fU1RSSU5HX0VTQ0FQRVMpOiBEb24ndCBkZWZpbmUgaWYgd2UgYXJlCi0JdXNpbmcgRUxGLgotCi1UaHUgSmFuIDI2IDE5OjAzOjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBBZGQgcGFyZW5zIGFyb3VuZCB8IGluc2lkZSAmLgotCShza2lwX2NvbG9udGhpbmcpOiBTZXQgTF84IGlmICI6OCIgaXMgc3BlY2lmaWVkLgotCi1UaHUgSmFuIDI2IDE4OjM4OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9iZWdpbik6IFBlcm1pdCBtZmRlYyB0byBiZSBkdXBsaWNhdGVkIG9uIHRoZQotCTYwMS4gIENoZWNrIHRoYXQgdGhlIGVycm9yIHJldHVybiBmcm9tIGhhc2hfaW5zZXJ0IGlzICJleGlzdHMiLgotCi1UaHUgSmFuIDI2IDExOjM1OjMzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciBjb25maWd1cmluZyBwb3dlcnBjLSotZWFiaS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChHT1Rfc3ltYm9sKTogRGVmaW5lIGlmIG9iamVjdCBmb3JtYXQgaXMgRUxGLgotCi0JKiBjb25maWcvdGMtcHBjLmggKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlZmluZSBpZiBvYmplY3QKLQlmb3JtYXQgaXMgRUxGIGFuZCBub3QgZGVmaW5lZCB0byBiZSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIi4KLQotV2VkIEphbiAyNSAxNjoyMzoxMyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHRjLXNoLmMgKGxpdHRsZSk6IEFkZCBhcmd1bWVudCBJR05PUkUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBzcGFjZSBmb3IgY29uc2lzdGVudCBmb3JtYXR0aW5nLgotCShDT05EOF9SQU5HRSwgQ09ORDEyX1JBTkdFKTogRGVsZXRlIHVudXNlZCBtYWNyb3MuCi0JKENPTkQ4X0YsIENPTkQ4X00sIENPTkQxMl9GLCBDT05EMTJfTSwgVU5DT05EMTJfRiwgVU5DT05EMTJfTSk6Ci0JQ29ycmVjdCBtaW5pbXVtIGFuZCBtYXhpbXVtIGJyYW5jaCBvZmZzZXRzLiAgQWRkIGNvbW1lbnRzIGV4cGxhaW5pbmcKLQl3aHkgdGhlc2UgbnVtYmVycyBhcmUgY29ycmVjdC4KLQotV2VkIEphbiAyNSAxNTozMjowOSAxOTk1ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgbXB3cjIgYXMgYSBzeW5vbnltIGZvcgotCW1wd3J4OyBtcHBjMzIsIG02MDMsIGFuZCBtNjA0IGFzIHN5bm9ueW1zIGZvciBtcHBjOyBhbmQgbXBwYzY0IGFuZAotCW02MjAgZm9yIFBvd2VyUEM2NCBtb2RlLgotCShwcGNfc3ltYm9sX25ld19ob29rKTogQWRkIFQwIGFzIHN5bm9ueW0gZm9yIFRDMCBzdWZmaXguCi0KLVR1ZSBKYW4gMjQgMTY6NDQ6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXZheC5jICh2aXApOiBJbnRyb2R1Y2UgbmV3IHB0ci10by1jb25zdCBsb2NhbCB2YXJpYWJsZQotCWZvciBzY2FubmluZyBvcGVyYW5kIHN0cmluZy4KLQotCVNhdCBKYW4gMjEgMTc6NTA6MzggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy92YXgtaW5zdC5oIChzdHJ1Y3Qgdm9wLCBmaWVsZHMgYHZvcF93YXJuJywgYHZvcF9lcnJvcicpOgotCW1ha2UgdGhlbSBwb2ludGVycyB0byBjb25zdCBjaGFyOwotCShzdHJ1Y3Qgdml0LCBmaWVsZCBgdml0X2Vycm9yJyk6ICBkaXR0by4KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChtZF9hdG9mKTogIHJlbmFtZSBsb2NhbCBgbGl0dGxlbnVtX3BvaW50ZXInCi0JdG8gYGxpdHRsZW51bVAnIHRvIGF2b2lkIHNoYWRvd2luZyBmaWxlIHNjb3BlIHZhcmlhYmxlLgotCSogY29uZmlnL3RjLXZheC5jICh2aXBfYmVnaW4sIHZpcF9vcF9kZWZhdWx0cywgdmlwX29wXzEpOiAgbWFrZQotCXN0cmluZyBhcmd1bWVudHMgYmUgcG9pbnRlcnMgdG8gY29uc3QgY2hhcjsKLQkodmlwKTogIG1ha2UgYGFsbG9wZXJyJyBjb25zdCBjaGFyICo7Ci0JKHZpcF9vcCk6IG1ha2UgYGVycicgYW5kIGB3cm4nIGNvbnN0IGNoYXIgKjsgcmVuYW1lIGBhY2Nlc3MnIHRvCi0JYGFjY2Vzc19tb2RlJyB0byBhdm9pZCBzaGFkb3dpbmcgbGlicmFyeSBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKGBzeW1ib2xfbmFtZScpOiAgbWFrZSBpdCBjb25zdCBjaGFyICo7Ci0JKGdldF9zdHJ1Y3RfbmFtZSk6ICBjYXN0IG9uZSB1c2Ugb2YgYHN5bWJvbF9uYW1lJyB0byBjaGFyICoKLQlbY2FsbGVyIGd1YXJhbnRlZXMgdGhhdCBpdCB3b24ndCBtb2RpZnkgdGhlIHBvaW50ZXIncyB0YXJnZXRdOwotCShQVVRfQ09VTlRFRF9TVFJJTkcpOiAgdXNlIHBvaW50ZXIgdG8gY29uc3QgY2hhcjsKLQkoVk1TX3R5cGVkZWZfcGFyc2UpOiAgbWFrZSBgcG50MicgY29uc3QgY2hhciAqOwotCShXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiAgbWFrZSBgY3AnIGNvbnN0IGNoYXIgKjsKLQkoVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzLCBhcnJheSBgQXR0cmlidXRlcycpOiAgbWFrZSBjb25zdCwKLQlhbmQgbWFrZSBmaWVsZCBgTmFtZScgcG9pbnRlciB0byBjb25zdCBjaGFyOwotCi0JKiBhcy5oIChgc2VnX25hbWVbXScgZGVjbGFyYXRpb24pOiAgcG9pbnRlcnMgdG8gY29uc3QgY2hhcjsKLQkoc3RydWN0IF9wc2V1ZG9fdHlwZSwgZmllbGQgYHBvY19uYW1lJyk6ICBwb2ludGVyIHRvIGNvbnN0IGNoYXIuCi0JKiBzdWJzZWdzLmMgKGBzZWdfbmFtZVtdJyBkZWZpbml0aW9uKTogIGRpdHRvOwotCSogaGFzaC5jIChoYXNoX2Fzayk6ICByZW5hbWUgYXJndW1lbnQgYGFjY2VzcycgdG8gYGFjY2Vzc190eXBlJwotCXRvIGF2b2lkIHNoYWRvd2luZyBsaWJyYXJ5IGZ1bmN0aW9uLgotCSogd3JpdGUuYyAodmFyaWFibGUgYHRoZV9vYmplY3RfZmlsZScpOiAgbW92ZSBmcm9tIGZpbGUgc2NvcGUKLQl0byBibG9jayBzY29wZSB3aXRoaW4gd3JpdGVfb2JqZWN0X2ZpbGUoKTsgZnJlZSBpdCBhZnRlciB1c2U7Ci0JKGZpeHVwX3NlZ21lbnQpOiAgY29uZGl0aW9uYWxseSBleGNsdWRlIGl0IGZvciBPQkpfVk1TLgotCShjdnRfZnJhZ190b19maWxsKTogIHJlbmFtZSBhcmd1bWVudCBgaGVhZGVycycgdG8gYGhlYWRlcnNQJwotCXRvIGF2b2lkIHNoYWRvd2luZyBmaWxlIHNjb3BlIHZhcmlhYmxlLgotCi1Nb24gSmFuIDIzIDIxOjQyOjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnRCcpOiBGaXggdHlwbyB3aGljaCBjYXVzZWQKLQltaXNjb21waWxhdGlvbiBvZiAiZGlhZyIgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gSmFuIDIzIDE1OjUxOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0KLU1vbiBKYW4gMjMgMTQ6MDc6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guaCAodGNfaW5pdF9hZnRlcl9hcmdzKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB0YWJsZS4KLQkobWRfYXNzZW1ibGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHAuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IENhc3QgZnJfYWRkcmVzcyB0byB1bnNpZ25lZCBsb25nIGZvciBwcmludGYuCi0JKG1kX2FwcGx5X2ZpeCk6IFVzZSBhc193YXJuX3doZXJlIHJhdGhlciB0aGFuIGFzX3dhcm4uCi0JKHNoX2luaXRfYWZ0ZXJfYXJncyk6IFJlbW92ZSBlbXB0eSBmdW5jdGlvbi4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251KmVsZiopOiBOZXcgdGFyZ2V0LgotCi1TYXQgSmFuIDIxIDE5OjAyOjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogaGFzaC5jIChoYXNoX2Fzayk6IElmIHdlIGZpbmQgdGhlIHNsb3QgYWZ0ZXIgd3JhcHBpbmcgYXJvdW5kLAotCWJyZWFrIG91dCBvZiB0aGUgbG9vcC4gIEZpeGVzIGJ1ZyBpbiBKYW4gMTggY2hhbmdlLgotCi1GcmkgSmFuIDIwIDE3OjA3OjMxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGhhc2guYyAoaGFzaF9jb2RlKTogVW5kbyBsYXN0IGNoYW5nZS4KLQotVGh1IEphbiAxOSAxNDo0OTo0NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcyB0byBrZWVwCi0JZ2NjIHF1aWV0LgotCShncGRpc3BfaGkxNl9ob3d0byk6IERvbid0IHVzZSAiY29uc3QiIHdpdGggcmVsb2NfaG93dG9fdHlwZS4KLQkoaW5fcmFuZ2Vfc2lnbmVkKTogQWRkIHBhcmVucyBhcm91bmQgc3VidHJhY3Rpb24gaW5zaWRlIHNoaWZ0LgotCSogZ2FzcC5jIChkb19kYXRhKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZSAib3BuYW1lIi4KLQkoaXN0cnVlKTogUHJvdmlkZSBhIGRlZmF1bHQgY2FzZSB0byBzZXQgInJlcyIgYW5kIGtlZXAgImdjYyAtV2FsbCIKLQlxdWlldC4KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogRGVsZXRlZCB1bnVzZWQgdmFyaWFibGUuCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogRGVjbGFyZS4KLQkqIGhhc2guYyAoaGFzaF9hc2spOiBEZWxldGUgZGlzYWJsZWQgbm9uLXN0cmNtcCB2ZXJzaW9uIG9mIHRoZQotCWNvZGUsIGFuZCBhdXRvbWF0aWMgdmFyaWFibGVzIHVzZWQgb25seSBpbiB0aG9zZSBzZWN0aW9ucy4KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBPbmx5IGRlZmluZSBsb2NhbCB2YXJpYWJsZQotCSJwcmV2X2ZpeCIgaWYgQkZEX0FTU0VNQkxFUi4KLQkqIGZsb251bS1rb25zdC5jIChkdW1teTEpOiBSZXR1cm4gdm9pZC4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBSZW1vdmUgdHdvIGNvbXBhcmlzb25zIG9mCi0JdW5zaWduZWQgbnVtYmVycyB2ZXJzdXMgemVyby4KLQkqIGFzLmggKGJjb3B5KTogSWYgbmVpdGhlciBtZW1jcHkgbm9yIGJjb3B5IGlzIGRlZmluZWQgYXMgYSBtYWNybywKLQlkZWZpbmUgdG8gdXNlIG1lbWNweS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMsIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogUmV2ZXJ0IDIgSnVuZSBjaGFuZ2VzLgotCVR1cm5zIG91dCB3ZSBuZXZlciBnb3QgdGhlIGFzc2lnbm1lbnQgZG9uZSBhZnRlciBhbGwuCi0KLQlDbGVhbnVwIG9mIFZBWCBhbmQgVk1TIGNvZGUsIGZyb20gUGF0IFJhbmtpbjoKLQkqIGNvbmZpZy9vYmotdm1zLmM6IENoYW5nZWQgZXhwb3J0ZWQgZnVuY3Rpb24gbmFtZXMgdG8gbG93ZXIgY2FzZS4KLQkoQ2hhbmdlZCBjYWxsIHNpdGVzIGluIHdyaXRlLmMuKSAgRGVjbGFyZSBWTVMgc3lzdGVtIGZ1bmN0aW9uCi0JbmFtZXMgdXNlZCwgY29uZGl0aW9uYWwgb24gYWN0dWFsbHkgYmVpbmcgb24gVk1TLiAgQ2hhbmdlZCBtYW55Ci0JZnVuY3Rpb25zIHRoYXQgcmV0dXJuZWQgbm8gdXNlZnVsIHZhbHVlIHRvIG5vdyBiZSBkZWNsYXJlZCB0bwotCXJldHVybiB2b2lkLiAgUmVtb3ZlZCBtYW55IHVudXNlZCB2YXJpYWJsZXMuICBTdXBwbHkgbWlzc2luZwotCXJldHVybiBzdGF0ZW1lbnRzIG9yIHZhbHVlcy4gIFN1cHBseSBgZGVmYXVsdCcgY2FzZSBpbiBzd2l0Y2gKLQlzdGF0ZW1lbnRzLiAgRW5zdXJlIGxvY2FsIHZhcmlhYmxlcyBnZXQgaW5pdGlhbGl6ZWQuCi0JKiBjb25maWcvdGMtdmF4LmM6IE1pbm9yIGNoYW5nZXMgdG8gc2lsZW5jZSAiZ2NjIC1XYWxsIi4KLQkqIGNvbmZpZy9vYmotdm1zLmgsIGNvbmZpZy90Yy12YXguaDogQWRkZWQgc29tZSBtaXNzaW5nCi0JZGVjbGFyYXRpb25zLgotCi1XZWQgSmFuIDE4IDEzOjQ5OjI2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGF0b2YtZ2VuZXJpYy5jIChmbG9udW1fcHJpbnQpIFtUUkFDRV06IE5ldyBmdW5jdGlvbi4KLQkoYXRvZl9nZW5lcmljKSBbVFJBQ0VdOiBQcmludCBtdWx0aXBsaWVyIGJlZm9yZSBtdWx0aXBsaWNhdGlvbiwKLQlhbmQgcHJpbnQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGJlZm9yZSBhbmQgYWZ0ZXIgY29weS4KLQotCSogZmxvbnVtLW11bHQuYyAoZmxvbnVtX211bHRpcCk6IEF2b2lkIHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zCi0JYXJvdW5kIG11bHRpcGxpY2F0aW9uIG9wZXJhdGlvbi4KLQotCSogYXRvZi1nZW5lcmljLmMgKEFTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UKTogRGVmaW5lLgotCShhdG9mX2dlbmVyaWMpIFtBU1NVTUVfREVDSU1BTF9NQVJLX0lTX0RPVF06IENoZWNrIGZvciAnLicKLQlleHBsaWNpdGx5IGluc3RlYWQgb2YgY2FsbGluZyBzdHJjaHIuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFdoZW4gc2Nhbm5pbmcgc3VjY2Vzc2l2ZSBvcGNvZGUKLQl0YWJsZSBlbnRyaWVzLCBjaGVjayBuYW1lcyBmb3IgcG9pbnRlciBlcXVhbGl0eSBiZWZvcmUgZG9pbmcKLQlzdHJpbmcgY29tcGFyaXNvbnMuCi0KLQkqIGhhc2guYyAoaGFzaF9hc2spOiBDYWxsIHN0cmNtcCBpbnN0ZWFkIG9mIGV4cGFuZGluZyBpdCBpbmxpbmUuCi0JKGhhc2hfY29kZSk6IFJlcGxhY2VkIHdpdGggYSB2ZXJzaW9uIGZyb20gYmZkLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiBDT0ZGX0ZMQUdTIGlzbid0Ci0JZGVmaW5lZCwgZGVmYXVsdCBpdCB0byB6ZXJvLgotCi1XZWQgSmFuIDE4IDEyOjE2OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IENsZWFyIGZ4X2JzciBvbiB0aG9zZSB0YXJnZXRzIHdoaWNoCi0JdXNlIGl0LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBQYXJlbnRoZXNpemUgJiYgd2l0aGluIHx8LgotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBMaWtld2lzZS4KLQkobGlzdF9zeW1ib2xfdGFibGUpOiBVc2UgJWx1IHRvIHByaW50IHNpemVvZi4KLQkqIHN5bWJvbHMuYzogQ29tbWVudCBvdXQgdW51c2VkIGZ1bmN0aW9uIGluZGVudC4KLQkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBDYXN0IHBvaW50ZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBPbmx5IGRlY2xhcmUgc3ltYm9sX3B0ciBpZiBpdAotCXdpbGwgYmUgdXNlZC4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9iZWdpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcmVnLgotCShnZXRfb3BlcmFuZCk6IERlY2xhcmUgdHlwZSBvZiBwYXJhbWV0ZXIgZGlyZWN0aW9uLiAgUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlIHNpemUuCi0JKGdldF9zcGVjaWZpYyk6IEZpeCBjb21tZW50IHRvIGF2b2lkIG5lc3RlZCBjb21tZW50cy4KLQkoY2hlY2tfb3BlcmFuZCk6IENhc3QgWF9hZGRfbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KLQkoYnVpbGRfYnl0ZXMpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcyBvdXRwdXRfcHRyLCBwYXJ0LCBhbmQKLQloaWdoLgotCShidWlsZF9ieXRlcyk6IENhc3QgWF9hZGRfbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KLQkoY2xldmVyX21lc3NhZ2UpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHNjYW4uCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpLgotCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KLQkqIHRjLWg4MzAwLmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0KLVR1ZSBKYW4gMTcgMTA6NTg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzQ2NTApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IEhhbmRsZSBhIGNwdSBzdHJpbmcgb2YgIjQ2NTAiLiAgSWYgbWlwc180NjUwIHdhcyBub3QKLQlpbml0aWFsaXplZCwgc2V0IGl0IHRvIDAuCi0JKGFwcGVuZF9pbnNuKTogRG9uJ3QgaW5zZXJ0IG5vcHMgYXJvdW5kIEhJIGFuZCBMTyBvbiBhIDQ2NTAuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBMaWtld2lzZS4KLQkobWlwc19pcCk6IFVzZSBJTlNOX0lTQSBtYXNrIHRvIGNoZWNrIElTQSBvZiBpbnN0cnVjdGlvbi4gIENoZWNrCi0JZm9yIElOU05fNDY1MC4KLQkobWRfbG9uZ29wdHMpOiBBZGQgbTQ2NTAgYW5kIG5vLW00NjUwLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbWlwcy1jcHU9NDY1MC4gIEhhbmRsZSAtbTQ2NTAgYW5kCi0JLW5vLW00NjUwLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBNSVBTIG9wdGlvbnMuCi0KLVNhdCBKYW4gMTQgMjM6NDg6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAam9ubnk+Ci0KLQkqIGNvbmZpZy90Yy13NjUuYywgY29uZmlnL3RjLXc2NS5oLCBjb25maWcvdzY1Lm10OiBOZXdmaWxlcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBDb3BlIHdpdGggdzY1LgotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IFJlY29nbml6ZSB3NjUuCi0KLVRodSBKYW4gMTIgMTc6NTY6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcikgW19fR05VQ19fICYmIF9fT1BUSU1JWkVfX106IElmIGBnZXQnCi0JZnVuY3Rpb24gaXMgc2NydWJfZnJvbV9maWxlLCBjYWxsIHNjcnViX2Zyb21fZmlsZSBkaXJlY3RseSwgYW5kCi0JZ2V0IGdjYydzIGlubGluaW5nIGNhcGFiaWxpdHkgaW50byB0aGUgYWN0LgotCi0JKiBNYWtlZmlsZS5pbiAoVk1TX09USEVSX09CSlMpOiBBZGQgLi4vbGliaWJlcnR5L2hleC5vLgotCShPQkpTKTogRGVsZXRlIGhleC12YWx1ZS5vLgotCShSRUFMX1NPVVJDRVMpOiBEZWxldGUgaGV4LXZhbHVlLmMuCi0JKGhleC12YWx1ZS5vKTogRGVsZXRlIGRlcGVuZGVuY2llcy4KLQkqIGhleC12YWx1ZS5jOiBEZWxldGVkLgotCSogYXMuYyAobWFpbik6IENhbGwgaGV4X2luaXQuCi0JKiBleHByLmMsIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguICBSZXBsYWNlCi0JaGV4X3ZhbHVlIGFycmF5IHJlZmVyZW5jZXMgd2l0aCBoZXhfKiBtYWNyb3MuCi0KLVdlZCBKYW4gMTEgMTc6NTE6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmggKENPRkZfRkxBR1MpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoQ09GRl9GTEFHUyksIGNvbmZpZy90Yy1zaC5oIChDT0ZGX0ZMQUdTKSwKLQljb25maWcvdGMtejhrLmggKENPRkZfRkxBR1MpOiBEaXR0by4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKEtFRVBfUkVMT0NfSU5GTyk6IE1ha2Ugc3VyZSBpdCdzIGFsd2F5cwotCWRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2VzIEFPRkYgYW5kIEFJTkRFWCk6IERvbid0Ci0JZ2VuZXJhdGUgNjgwMjAgYWRkcmVzc2luZyBtb2RlcyBmb3IgYSA2ODAwMCBwcm9jZXNzb3IuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBjYXNlcyBQQ1JFTCBhbmQgUENMRUEpOiBEaXR0by4KLQotVHVlIEphbiAxMCAxMzozNDoxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCB0cmVhdCBoODMwMCBhbmQgejhrCi0Jc3BlY2lhbGx5IHdpdGggcmVnYXJkIHRvIGZpeHVwcy4KLQotTW9uIEphbiAgOSAxNjoyMjoyOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChSRUxBWF9SRUxPQzEsIFJFTEFYX1JFTE9DMik6IENhc3QgdmFsdWVzIHRvCi0JYmZkX3ZtYSBiZWZvcmUgc3VidHJhY3RpbmcuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzaXplX3NlY3Rpb24pOiBIYW5kbGUgcnNfc3BhY2UgbGlrZSByc19maWxsLAotCWJ1dCBtYWtlIHN1cmUgZnJfc3ltYm9sIGlzIG51bGwuCi0JKGZpbGxfc2VjdGlvbik6IERpdHRvLgotCi1TdW4gSmFuICA4IDE2OjE0OjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZpeCBoYW5kbGluZyBvZiBmbG9hdGluZyBwb2ludAotCXZhbHVlcyB3aGVuIEdQT1BUIGlzIG5vdCBkZWZpbmVkLgotCi1GcmkgSmFuICA2IDE2OjU5OjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYzogSW5jbHVkZSBzdHJpbmcuaC4gIFB1dCBjb25maWcuaCBiZWZvcmUgb3RoZXIgaW5jbHVkZXMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IERlbGF5IGNhbGxzIHRvIGVtaXRfYWRkNjQgdW50aWwKLQlhZnRlciBhbnkgcmVtYWluaW5nIG9wZXJhbmRzIGFyZSBhbHNvIGtub3duIHRvIG1hdGNoLgotCi1GcmkgRGVjIDMwIDE4OjIxOjQxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBCdWlsZCBhIGZvcm1hdCBzdHJpbmcgYmFzZWQgb24KLQl0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgdG8gYmUgcHJpbnRlZCwgYXMgbG9uZyBhcyAidW5zaWduZWQgbG9uZyIgaXMKLQlhdCBsZWFzdCBhcyB3aWRlLCBhZnRlciBoYW5kbGluZyB0aGUgc3BlY2lhbCBjYXNlIG9mIDQtYnl0ZQotCXZhbHVlcy4KLQotCSogTWFrZWZpbGUuaW4gKGRlcGVuZGVuY2llcyk6IE1ha2UgJChPQkpTKSBkZXBlbmQgb24gYXMuaCBhbmQKLQlldmVyeXRoaW5nIGl0IGluY2x1ZGVzLiAgRGVsZXRlIHRob3NlIGZpbGVzIGZyb20gcGVyLWZpbGUKLQlkZXBlbmRlbmNpZXMuCi0KLQkqIGFzLmggKHJlbGF4X3N1YnN0YXRlVCk6IE5vdyBkZWZpbmVkIHRvIGJlIHVuc2lnbmVkIGludC4KLQkocmVsYXhfc3RhdGVUKTogU2VwYXJhdGUgdHlwZWRlZiBmcm9tIGVudW0gZGVmaW5pdGlvbi4KLQkoZW51bSBfcmVsYXhfc3RhdGUpOiBSZW9yZGVyZWQgZm9yIGJldHRlciBwdW5jdHVhdGlvbi4gIEFkZGVkIG5ldwotCXZhbHVlcyByc19hbGlnbl9jb2RlIGFuZCByc19zcGFjZS4KLQkobGluZW5vLCBzdHJ1Y3QgbGluZW5vX3N0cnVjdCk6IFVudXNlZCwgZGVsZXRlZC4KLQotCSogYXMuaDogTm8gbG9uZ2VyIGluY2x1ZGUgYXNzZXJ0LmguCi0JKGFzX2Fzc2VydCk6IERlY2xhcmUuCi0JKGFzc2VydCk6IE5ldyBkZWZpbml0aW9uLCBjYWxscyBhc19hc3NlcnQgbG9uZ2VyIG5lZWRlZC4KLQkoX19QUkVUVFlfRlVOQ1RJT05fXyk6IFByb3ZpZGUgZGVmYXVsdCBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgZ2NjLgotCSogbWVzc2FnZXMuYyAoYXNfYXNzZXJ0KTogTmV3IGZ1bmN0aW9uLgotCSogZ2RiaW5pdC5pbjogUHV0IGEgYnJlYWtwb2ludCB0aGVyZS4KLQotCSogcmVhZC5jIChzX3NwYWNlKTogUmV3cml0ZSB0byBoYW5kbGUgZ2VuZXJhbCBleHByZXNzaW9ucy4KLQlHZW5lcmF0ZSByc19zcGFjZSBmcmFncyBmb3Igbm9uLWNvbnN0YW50IHZhbHVlcy4KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBUcmVhdCByc19hbGlnbl9jb2RlIGFuZCByc19zcGFjZQotCWxpa2UgcnNfYWxpZ24gYW5kIHJzX29yZy4gIFZlcmlmeSB0aGF0IGZyX29mZnNldCBpcyBub24tbmVnYXRpdmUsCi0JYW5kIGZvcmNlIGZyYWcgdHlwZSB0byByc19maWxsIG9ubHkgYWZ0ZXIgYXNzZXJ0aW9uIGNoZWNrcy4KLQkocmVsYXhfc2VnbWVudCk6IFRyZWF0IHJzX2FsaWduX2NvZGUgbGlrZSByc19hbGlnbi4gIFRyZWF0Ci0JcnNfc3BhY2UgbGlrZSByc19vcmcgaW4gdGhlIGZpcnN0IHN3aXRjaDsgaW4gdGhlIHNlY29uZCwgZm9yY2UgdGhlCi0Jb3BlcmFuZCB0byBhIGNvbnN0YW50LCBhbmQgdXNlIGl0IGZvciB0aGUgZ3Jvd3RoIHNpemUuCi0KLVdlZCBEZWMgMjggMjA6NTc6MzcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N1YnNwYWNlKTogRm9yIHNlY3Rpb25zIHdpdGggdGhlIFpFUk8KLQlhdHRyaWJ1dGUsIHNldCB0aGUgImJzcyIgZmllbGQgaW4gdGhlIGFwcHJvcHJpYXRlIHNlZ2luZm8gc3RydWN0dXJlLgotCi1XZWQgRGVjIDI4IDE1OjAxOjAxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaDogSW5jbHVkZSBvYnN0YWNrLmguCi0KLVR1ZSBEZWMgMjcgMTg6MTY6MDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBFbmFibGUgYWxpZ24qIGNvbXBvbmVudHMgbm93LgotCi1UdWUgRGVjIDIwIDE0OjU2OjMxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmMgKGZyYWdfaW5pdCk6IENhbGwgb2JzdGFja19iZWdpbiBvbiBgZnJhZ3MnLgotCSogc3Vic2Vncy5jIChzdWJzZWdzX2JlZ2luKTogRG9uJ3QgZG8gaXQgaGVyZS4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGZyYWdfaW5pdCBiZWZvcmUgc3Vic2Vnc19iZWdpbi4KLQotCSogZnJhZ3MuYyAoZnJhZ19hcHBlbmRfMV9jaGFyKTogTmV3IGZ1bmN0aW9uLgotCSogZnJhZ3MuaCAoZnJhZ19hcHBlbmRfMV9jaGFyKTogRGVjbGFyZSBpdC4KLQkoRlJBR19BUFBFTkRfMV9DSEFSKTogQ2FsbCBpdC4gIE9sZCBkZWZpbml0aW9uIGlzIGNvbW1lbnRlZCBvdXQKLQlmb3Igbm93LgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IEFkZGVkIChidXQgY29tbWVudGVkIG91dCkgbmV3IGZpZWxkcyBmb3IKLQl0cmFja2luZyBjdXJyZW50IGFsaWdubWVudC4KLQkoZnJhZ19ub3dfZml4KTogQ2hhbmdlZCBtYWNybyB0byBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KLQkqIGZyYWdzLmMgKGZyYWdfbm93X2ZpeCk6IERlZmluZSBmdW5jdGlvbiBoZXJlLgotCShmcmFnX25ldyk6IFVzZSBpdCBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBgZnJhZ3MnIGRpcmVjdGx5LgotCSogZnJhZ3MuaCAoZnJhZ3MpOiBDaGFuZ2UgY29tbWVudCB0byBpbmRpY2F0ZSBpdCBzaG91bGRuJ3QgYmUKLQlhY2Nlc3NlZCBkaXJlY3RseS4KLQkqIHN1YnNlZ3MuaCAoc3RydWN0IGZyY2hhaW4pOiBOZXcgZmllbGQgZnJjaF9vYnN0YWNrLCBpbnRlbmRlZCB0bwotCWV2ZW50dWFsbHkgcmVwbGFjZSBnbG9iYWwgYGZyYWdzJyBvYnN0YWNrLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBVc2UgZnJhZ19ub3dfZml4IGluc3RlYWQgb2YKLQlhY2Nlc3NpbmcgYGZyYWdzJyBkaXJlY3RseS4gIEluaXRpYWxpemUgZmllbGRzIG9mIG5ldyBmcmNoYWluUwotCWV4cGxpY2l0bHkgaW5zdGVhZCBvZiB3aXRoIG1lbXNldC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9sbikgWyFCRkRfQVNTRU1CTEVSXTogVXNlCi0JZnJhZ19ub3dfZml4LgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19sb2MpLCBjb25maWcvb2JqLXZtcy5jCi0JKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZiksIHN5bWJvbHMuYyAoY29sb24pOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBVc2Ugb2Zmc2V0VCBhbmQgYWRkcmVzc1QKLQlpbnN0ZWFkIG9mIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcuCi0JKG1kX2FwcGx5X2ZpeCk6IENhc3QgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oLCBjb25maWcvb2JqLWNvZmYuYywgY29uZmlnL29iai1lbGYuaCwKLQljb25maWcvb2JqLXNvbS5oLCBjb25maWcvdGMtaDg1MDAuYywgY29uZmlnL3RjLWhwcGEuYywKLQljb25maWcvdGMtaHBwYS5oLCBjb25maWcvdGMtc2guYywgY29uZmlnL3RjLXo4ay5jOiBEb24ndCByZWx5IG9uCi0JdXNlIG9mICIuLiIgd2hlbiBpbmNsdWRpbmcgaGVhZGVyIGZpbGVzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFJlZm9ybWF0IGNvbmRpdGlvbiBpbiBhbiBgaWYnCi0Jc3RhdGVtZW50LgotCi0JKiBNYWtlZmlsZS5pbiAoU1VCRElSX0lOQ0xVREVTKTogRGVsZXRlZC4KLQotVHVlIERlYyAyMCAxMzo0MDozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBJbmNsdWRlIGJmZC9saWJjb2ZmLmgsIG5vdCBsaWJjb2ZmLmguCi0KLU1vbiBEZWMgMTkgMTY6NTM6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogUmV3cml0ZSB0byBoYW5kbGUgT19iaWcgNjQgYml0Ci0JY29uc3RhbnRzLgotCShtaXBzX2lwKTogQWNjZXB0IE9fYmlnIGNvbnN0YW50cyBpbiBjYXNlICdJJy4gIENoYW5nZSBjYXNlCi0JJ2knLydqJyB0byB0cmVhdCBhbiBPX2JpZyBjb25zdGFudCBhcyBhbiBvdXQgb2YgcmFuZ2UgdmFsdWUuCi0KLU1vbiBEZWMgMTkgMTQ6MTU6MDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N1YnNwYWNlKTogTWFrZSBzdXJlIFNFQ19IQVNfQ09OVEVOVFMgaXMKLQljbGVhciBmb3IgYSBzZWN0aW9uIHdpdGggdGhlICJaRVJPIiBhdHRyaWJ1dGUuCi0KLQkqIFJlZHVjZSB1c2VsZXNzIHN5bWJvbHMgZm9yIEVMRiBpbiBhbiBhdHRlbXB0IHRvIG1ha2Ugc21hbGxlcgotCW9iamVjdHMgYW5kIHNwZWVkIHVwIHRoZSBsaW5rZXIuCi0JKiBjb25maWcvdGMtaHBwYS5jIChzdHJ1Y3QgY2FsbF9pbmZvKTogUmVwbGFjZSBlbmRfc3ltYm9sIGZpZWxkCi0Jd2l0aCBhIHNpemUgZmllbGQuCi0JKGhwcGFfZWxmX21hcmtfZW5kX2Z1bmN0aW9uKTogRGVsZXRlIHVubmVlZGVkIGZ1bmN0aW9uLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBGb3IgdGhlIDJuZCB1bndpbmQgcmVsb2NhdGlvbiwgdXNlCi0JdGhlIGZ1bmN0aW9uIHN5bWJvbCArIGZ1bmN0aW9uIHNpemUgaW5zdGVhZCBvZiBhIHNwZWNpYWwgc3ltYm9sCi0JZm9yIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgotCShwcm9jZXNzX2V4aXQpOiBDb21wdXRlIHRoZSBmdW5jdGlvbiBzaXplIGhlcmUuICBEb24ndCBjYWxsCi0JaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gYW55bW9yZS4KLQkocGFfcHJvY2VuZCk6IExpa2V3aXNlLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogT25seSByZWplY3QgMzJiaXQgcmVsb2NhdGlvbnMgZm9yIFNPTS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IFNpbXBsaWZ5LgotCi1Nb24gRGVjIDE5IDEzOjQ5OjA3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG1pcHMtc29ueS1ic2QgYW5kIG1pcHMtZGVjLWJzZCwgYnV0Ci0JcmVqZWN0IG90aGVyIHZlbmRvcnMgdW50aWwgd2UgY2FuIGJlIHN1cmUgd2UncmUgY29uc2lzdGVudCB3aXRoCi0JYmZkLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDcmVhdGVfVk1TX09iamVjdF9GaWxlKTogSW5zdGVhZCBvZiBmb3JtYXR0aW5nCi0JYSBidWZmZXIgdG8gcGFzcyB0byBgZXJyb3InLCBqdXN0IGNhbGwgYGFzX2ZhdGFsJyBkaXJlY3RseS4KLQkoVk1TX1BzZWN0X1NwZWMpOiBEaXR0by4KLQkoVk1TX1RCVF9Nb2R1bGVfQmVnaW4sIFZNU19UQlRfU291cmNlX0ZpbGUsIGdlbjEsCi0JVk1TX3R5cGVkZWZfcGFyc2UsIFZNU19MU1lNX1BhcnNlLCBWTVNfRW1pdF9HbG9iYWx2YWx1ZXMpOiBDYWxsCi0JYXNfdHNrdHNrIGluc3RlYWQgb2YgcHJpbnRmLgotCShWTVNfVEJUX01vZHVsZV9CZWdpbiwgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uLAotCVZNU19UQlRfU291cmNlX0ZpbGUsIFZNU19UQlRfU291cmNlX0xpbmVzLAotCVZNU19TdG9yZV9SZXBlYXRlZF9EYXRhLCBWTVNfQ2hlY2tfRm9yX01haW4pOiBVc2UgZXhwbGljaXQKLQlpbnRlZ2VycyByYXRoZXIgdGhhbiBzaXplb2YgZXhwcmVzc2lvbnMgdXNpbmcgYmFzaWMgaW50ZWdlciB0eXBlcywKLQlpbiBjYXNlIGhvc3QgYW5kIHRhcmdldCBhcmVuJ3QgdGhlIHNhbWUuICBVc2UgbWVtY3B5IG9yIENPUFlfKgotCW1hY3JvcyBpbnN0ZWFkIG9mIHBvc3NpYmx5IHVuYWxpZ25lZCB3b3JkIG9yIGxvbmd3b3JkIGFzc2lnbm1lbnQuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogTmV3IG1hY3JvLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlLAotCVZNU19DaGVja19Gb3JfTWFpbiwgVk1TX3dyaXRlX29iamVjdF9maWxlKTogVXNlIHN5X29iaiBpbnN0ZWFkIG9mCi0JZm9yY2luZyBzeV9udW1iZXIgdG8gaG9sZCBhIHBvaW50ZXIuCi0KLUZyaSBEZWMgMTYgMTQ6NDA6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogRG9uJ3QgZmlsbCBpbiBtZF9yZWxheF90YWJsZSBoZXJlLgotCShtZF9yZWxheF90YWJsZSk6IFVzZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChwYXJzZV9leHAsIGdldF9vcGVyYW5kcywgY2xldmVyX21lc3NhZ2UsCi0JbWRfYXNzZW1ibGUsIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgbWRfdW5kZWZpbmVkX3N5bWJvbCwKLQl0Y19oZWFkZXJzX2hvb2ssIG1kX29wZXJhbmQsIG1kX251bWJlcl90b19jaGFycyk6IERvbid0IHVzZSBERUZVTi4KLQotCSogTWFrZWZpbGUuaW4gKENIRUNLRkxBR1MpOiBEb24ndCBwYXNzIEFTX0ZPUl9UQVJHRVQsCi0JQ0NfRk9SX1RBUkdFVCwgT0JKRFVNUF9GT1JfVEFSR0VULCBOTV9GT1JfVEFSR0VUOyB0aGV5J3JlIG5vdAotCXVzZWQuCi0JKEFTX0ZPUl9UQVJHRVQsIENDX0ZPUl9UQVJHRVQsIE9CSkRVTVAsIE9CSkRVTVBfRk9SX1RBUkdFVCwgTk0sCi0JTk1fRk9SX1RBUkdFVCk6IERvbid0IGRlZmluZS4KLQkoVk1TX09USEVSX09CSlMpOiBBZGQgeG1hbGxvYy5vIGFuZCB4ZXhpdC5vIGZyb20gbGliaWJlcnR5LgotCSh0b29sZGlyKTogVXNlIGV4ZWNfcHJlZml4LCBub3QgbGliZGlyLgotCi1GcmkgRGVjIDE2IDExOjA3OjEwIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmg6IEluY2x1ZGUgbGliY29mZi5oLCBub3QgLi4vYmZkL2xpYmNvZmYuaC4KLQotCSogYXMuaDogSW5jbHVkZSBwcm9ncmVzcy5oLgotCSogYXMuYyAobWFpbik6IENhbGwgU1RBUlRfUFJPR1JFU1MgYW5kIEVORF9QUk9HUkVTUy4KLQkobWFpbiwgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogQ2FsbCBQUk9HUkVTUy4KLQotRnJpIERlYyAxNiAwMDo0NjowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogVXNlIGJmZF9pc191bmRfc2VjdGlvbiBhbmQKLQliZmRfaXNfYWJzX3NlY3Rpb24gcmF0aGVyIHRoYW4gY29tcGFyaW5nIGFnYWluc3QgJmJmZF91bmRfc2VjdGlvbgotCWFuZCAmYmZkX2Fic19zZWN0aW9uLgotCi1UaHUgRGVjIDE1IDE1OjI3OjE0IDE5OTQgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogVXNlIGEgbG9jYWwgdmFyaWFibGUgd2hlbgotCWluaXRpYWxpemluZyBtZF9yZWxheF90YWJsZSB0byBhdm9pZCBlcnJvcnMgYWJvdXQgbW9kaWZ5aW5nIGEKLQljb25zdCBkYXRhIHN0cnVjdHVyZS4KLQotVHVlIERlYyAxMyAxNTo0MjoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAodGNfZ2VuX3JlbG9jKTogUmVtb3ZlIE9CSl9FTEYgaGFjayB3aGljaAotCWFwcGVhcnMgdG8gbm8gbG9uZ2VyIGJlIG5lZWRlZC4KLQotVHVlIERlYyAxMyAwODowNDoxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogQWNjZXB0IEJGRF9SRUxPQ19QQ1JFTCogd2l0aG91dAotCXJlcXVpcmluZyB0aGF0IHRoZSBYX29wX3N5bWJvbCBiZSBpbiB0aGUgdGV4dF9zZWN0aW9uLgotCShtYWNybyk6IENoYW5nZSB0aGUgdGVzdCBmb3IgYSBsZWdlbCBleHByZXNzaW9uIGRpZmZlcmVuY2UgdG8KLQljb3JyZXNwb25kIHRvIGNoYW5nZXMgaW4gcHNldWRvX3NldCBpbiByZWFkLmMuCi0KLUZyaSBEZWMgIDkgMjE6MDQ6MTcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKSBbUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFXTogVXNlCi0JYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogSWYgdGhlcmUgaXMgbm8gY3VycmVudAotCXJvdXRpbmUsIGp1c3QgcmV0dXJuLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXAsIGNhc2UgJ0InLCBzdWJjYXNlICdjJyk6IFVzZSBvcGNvZGUKLQl2YWx1ZSBmcm9tIHBhdHRlcm4gaW5zdGVhZCBvZiBhc3N1bWluZyBqc3IuCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmggKGptcCk6IEFkZCBhICIxLEJjIiBmb3JtLgotCi1UaHUgRGVjICA4IDE3OjQ4OjI1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChOTV9GT1JfVEFSR0VUKTogVXNlIC4uL2JpbnV0aWxzL25tLm5ldywgbm90IGp1c3QKLQlwbGFpbiBubS4KLQotCSogY29uZmlndXJlLmluIChuczMyay1wYzUzMi1tYWNoKik6IFNlbGVjdCBjb3JyZWN0IGVtdWxhdGlvbi4KLQkobWlwcy1zb255LWJzZCopOiBVc2UgZWNvZmYuCi0JKG1pcHMtKi1nbnUqKTogTmV3IHRhcmdldCwgdXNpbmcgYW91dCBmb3JtYXQsIGZyb20gUm9sYW5kIE1jR3JhdGguCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDI5IDEzOjU4OjEwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlVc2UgbGliaWJlcnR5IHZlcnNpb24gb2YgeG1hbGxvYzoKLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMpOiBEZWxldGUgeG1hbGxvYy5jLgotCShPQkpTKTogRGVsZXRlIHhtYWxsb2Muby4KLQkoeG1hbGxvYy5vKTogRGVsZXRlIGRlcGVuZGVuY2llcy4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSBvbmNlIHByb2dyYW0gbmFtZSBpcwotCWtub3duLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoaW5fcmFuZ2Vfc2lnbmVkLCBpbl9yYW5nZV91bnNpZ25lZCk6IE5ldwotCXJvdXRpbmVzLCBzcGxpdCBmcm9tIGluX3JhbmdlLgotCShpbl9yYW5nZSk6IERlbGV0ZWQuICBBbGwgY2FsbHMgY2hhbmdlZCB0byBpbl9yYW5nZV8qc2lnbmVkLgotCShjcmVhdGVfbGl0YV9zZWN0aW9uKTogTWFjcm8gZGVsZXRlZC4gIFNpbmdsZSB1c2UgZXhwYW5kZWQgaW4KLQlwbGFjZS4KLQkoYWxwaGFfaXApOiBIYW5kbGUgYHQnIGFuZCBgOCcgb3BlcmFuZCB0eXBlcy4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ18xMl9QQ1JFTC4gIFByaW50IG5hbWUgb2YKLQl1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlcy4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogQWRkZWQgSEFMVCBhbmQgRFJBSU5BLiAgRGlzYWJsZWQgTU9WSSwKLQlzaW5jZSBpdCBkb2Vzbid0IHdvcmssIGFuZCBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIG5hdGl2ZQotCWFzc2VtYmxlci4KLQotCSogaW5wdXQtc2NydWIuYzogQ2hhbmdlIHdvcmRpbmcgb2YgYSBjb21tZW50IHRvIGF2b2lkIGludGVyZmVyZW5jZQotCXdpdGggQ3lnbnVzIHNvdXJjZS1jb250cm9sIHRvb2xzLgotCi0JKiBhcy5oIChlcnJubykgW05FRURfREVDTEFSQVRJT05fRVJSTk9dOiBEZWNsYXJlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogTGlzdCBidXNjciBhbmQgcGNyIGNvbnRyb2wKLQlyZWdpc3RlcnMuCi0JKG02OGtfaXAsIGNhc2UgJ0onKTogSGFuZGxlIHRoZW0uCi0KLQlEZWxldGUgc2lnbmFsIGhhbmRsZXIgY29kZS4gIEl0J3MgYmVlbiBkaXNhYmxlZCBzaW5jZSBNYXJjaCAxOTkzCi0Jd2l0aG91dCBjb21wbGFpbnRzLgotCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBzaWduYWwuaC4KLQkoZ290X3NpZyk6IFVudXNlZCBmdW5jdGlvbiBkZWxldGVkLCBkZWNsYXJhdGlvbiBkZWxldGVkLgotCShTSUdUWSk6IE1hY3JvIGRlbGV0ZWQuCi0JKG1haW4pOiBEZWxldGVkIGRpc2FibGVkIGNvZGUgZm9yIGVzdGFibGlzaGluZyBzaWduYWwgaGFuZGxlci4KLQotTW9uIE5vdiAyOCAxMTozNzozNSAxOTk0ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSW5zZXJ0IG1pc3NpbmcgbmV3bGluZSBhdCBlbmQgb2YgZmlsZQotCWxpa2Ugd2FybmluZyBzYXlzIHdlIGRvLgotCi1Nb24gTm92IDI4IDAwOjExOjE1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChwYV9jaGVja19lb2YpOiBEZWNsYXJlIG5ldyBleHRlcm4gZnVuY3Rpb24uCi0JKHRjX2Zyb2JfZmlsZSk6IERlZmluZSB0byBjYWxsIHBhX2NoZWNrX2VvZi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UpOiBOZXcKLQlmdW5jdGlvbiB0byB2ZXJpZnkgdGhlIGN1cnJlbnQgc3BhY2UgYW5kIHN1YnNwYWNlIGFyZSByZWFzb25hYmxlLgotCUNhbGwgZm9yIHRoZSBhcHByb3ByaWF0ZSBwc2V1ZG8tb3BzIGFuZCBiZWZvcmUgaW5zdHJ1Y3Rpb24gcGFyc2luZy4KLQkocGFfY2hlY2tfZW9mKTogTmV3IGZ1bmN0aW9uIHRvIHZlcmlmeSBlbnRlci9leGl0IGFuZCBwcm9jL3Byb2NlbmQKLQlwYWlycyBtYXRjaCBhdCBFT0YuCi0JKHBhX2NvZGUpOiBTaW1wbGlmeS4KLQotCSogY29uZmlnL29iai1zb20uYzogRGVsZXRlICNpZiAwIGNvZGUuCi0KLVdlZCBOb3YgMjMgMTk6MzY6MDkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFRBUkdFVF9GT1JNQVQpOiBTZWxlY3QgYmV0d2VlbiBjb2ZmLXNobCBhbmQKLQljb2ZmLXNoLgotCSogY29uZmlnL3NoLm1oIChUQVJHX0NQVV9ERVBFTkRFTlRTKTogR2V0IGl0IHJpZ2h0LgotCSogY29uZmlnL3RjLXNoLmMgIChsaXR0bGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BhcnNlX29wdGlvbik6IE5vdGljZSBuZXcgb3B0aW9uLgotCShidWlsZF9yZWxheCwgYnVpbGRfTXl0ZXMsIG1kX2F0b2YsIG1kX2NvbnZlcnRfZnJhZywgbWRfYXBwbHlfZml4KToKLQlDb3BlIHdpdGggbGl0dGxlIGVuZGlhbiBkYXRhLgotCSogY29uZmlnL3RjLXNoLmggKENPRkZfTUFHSUMsIExJU1RJTkdfSEVBREVSKTogRW5kaWFuIGRlcGVuZGVudC4KLQotV2VkIE5vdiAyMyAxMDo1NDozOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jLCBFTEYgdmFyaWFudCk6IFJldmVydCBsYXN0Ci0JY2hhbmdlLiAgVGhlIHJlYWwgYnVnIHdhcyBpbiBiZmQvZWxmY29kZS5oIGFuZCBoYXMgYmVlbiBmaXhlZC4KLQotVHVlIE5vdiAyMiAyMzozMToyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jLCBFTEYgdmFyaWFudCk6IEFkZCBzZWN0aW9uLT52bWEKLQl0byB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4KLQotVHVlIE5vdiAyMiAxNDozNzo1OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9YRk9STSk6IEZpeCB0eXBvLgotCi1UdWUgTm92IDIyIDEwOjIzOjI1IDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfc2V0KTogSWdub3JlIHRoZSAuc2V0IChubyltb3ZlIGFuZAotCSAgLnNldCAobm8pdm9sYXRpbGUgZGlyZWN0aXZlcy4KLQotVHVlIE5vdiAxNSAyMTo0NDoxMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2UpOiBNYWtlIHN1cmUgdG8gYWx3YXlzIHJlc2V0Ci0JY3VycmVudF9zdWJzcGFjZS4KLQkocGFfdGV4dCwgcGFfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9hbGlnbik6IE5ldyBmdW5jdGlvbi4gIEFsaWducyB0aGUgY3VycmVudAotCW9mZnNldCB3aXRoaW4gdGhlIGN1cnJlbnQgc3Vic3BhY2UgYWxvbmcgd2l0aCB1cGRhdGluZyB0aGUKLQlhbGlnbm1lbnQgb2YgdGhlIHN1YnNwYWNlIGl0c2VsZi4KLQkocGFfc3Vic3BhY2UpOiBEZWZhdWx0IGFsaWdubWVudCB0byBvbmUgYnl0ZSByYXRoZXJuIHRoYW4gemVybwotCWJ5dGVzIHRvIGF2b2lkIHNldHRpbmcgYWxpZ25tZW50IHRvIGxvZzIoMCkuCi0JKG1kX3BzZXVkb190YWJsZSk6IFVzZSBwYV9hbGlnbm1lbnQgZm9yIC5hbGlnbi4KLQotVHVlIE5vdiAxNSAxNToyNDo0NSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IEFsd2F5cyBwdXQgYSBzcGFjZSBhZnRlciAiZmF0YWwgZXJyb3I6IgotCXdoZW4gcHJpbnRpbmcgbWVzc2FnZS4KLQotVHVlIE5vdiAxNSAxMToxMDo0MyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAob2JqX2Zyb2Jfc3ltYm9sKTogRGVsZXRlLgotCSh0Y19mcm9iX3N5bWJvbCk6IE1ha2UgZGVmaW5pdGlvbiBjb25kaXRpb25hbCBvbiBPQkpfU09NIG9yCi0JT0JKX0VMRi4gIEZvciBFTEYgc3VidHJhY3Qgb3V0IHN5bWJvbC0+c2VjdGlvbi0+dm1hIGZvciBub24gY29tbW9uCi0Jc3ltYm9scy4KLQotV2VkIE5vdiAgOSAxNDo1MzowMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGUtZGVsdGEuaDogTmV3IGZpbGUsIGRlcml2ZWQgZnJvbSB0ZS1zeXN2MzIuaC4KLQotV2VkIE5vdiAgOSAxMTo1Mjo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2JmKTogQWx3YXlzIHNldCBjb2ZmX2xpbmVfYmFzZS4KLQotTW9uIE5vdiAgNyAwMTo1ODo0OSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEJ1bXAgdG8gMi41LjMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ29tcGFyZSBnZW5lcmljIGNwdSBuYW1lIGFnYWluc3QgInNwYXJjIiwgbm90Ci0JInNwYXJjKiIsIHNpbmNlIHNwYXJjIHZhcmlhbnRzIHNob3VsZCBiZSBjaGFuZ2VkIHRvICJzcGFyYyIuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xLgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChvY3RhbCwgdG9IZXgpOiBWYXJpYWJsZXMgZGVsZXRlZC4KLQkoaXNvY3RhbCk6IE1hY3JvIGRlbGV0ZWQuCi0JKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSB0aGVtLgotCShtYWNoaW5lX2lwLCBjYXNlICdQJy8nQScpOiBGb3IgYWJzb2x1dGUgb3BlcmFuZCwgZ2VuZXJhdGUgYW4KLQllcnJvciBtZXNzYWdlIGlmIGl0J3Mgb3V0IG9mIHJhbmdlLgotCShtZF9hcHBseV9maXgsIGNhc2UgUkVMT0NfSlVNUFRBUkcpOiBDaGVjayByYW5nZSBmb3IgUEMtcmVsYXRpdmUKLQlqdW1wcy4KLQkobWRfYXBwbHlfZml4KTogRGVsZXRlIGNvZGUgaW5zaWRlICIjaWYgMCIuCi0KLVRodSBOb3YgIDMgMjA6MjA6NDAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2dvMzIubWg6IFVudXNlZCBmaWxlIGRlbGV0ZWQuCi0KLQkqIHJlYWQuYyAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBJbmRpY2F0ZSB0aGF0IHRoZSBlcnJvciBtYXkKLQltZXJlbHkgYmUgdGhhdCB0aGUgZXhwcmVzc2lvbiBjYW4ndCBjdXJyZW50bHkgYmUgcmVkdWNlZC4KLQotVGh1IE5vdiAgMyAxNjowOTo1OSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBJZiBURV9OZXRCU0QgZGVmaW5lIGFzCi0JICAiYS5vdXQtbTY4ay1uZXRic2QiLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBJZiBURV9OZXRCU0QgZGVmaW5lIGFzCi0JICAiYS5vdXQtc3BhcmMtbmV0YnNkIi4KLQotCSogY29uZmlnL3RlLW5ic2QuaDogTmV3IGZpbGUsIE5ldEJTRCB0YXJnZXQgZW11bGF0aW9uCi0JKiBjb25maWcvdGUtbmV0YnNkLmg6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbmV0YnNkKixtNjgqLSotbmV0YnNkKixzcGFyYyotKi1uZXRic2QqKToKLQkgIFNldCBiZmRfZ2FzLiAgVXNlIG5ic2QgZW11bGF0aW9uLgotCi1UaHUgTm92ICAzIDE3OjQ0OjQ3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZyb20gbmV0IDIuNS4yIHJlbGVhc2UgYnJhbmNoOgotCi0JKiBjb25maWd1cmUuaW46IFB1dCBBQ19ERUZJTkUoc3BhcmN2OSkgb24gaXRzIG93biBsaW5lLCBzbyB0aGF0Ci0JdGhlIHNoZWxsIHZhcmlhYmxlIHNldHRpbmdzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgcGVybWFuZW50LiAgRm9yCi0JQ1BVcyByZXF1aXJpbmcgYmZkX2dhcz15ZXMsIHNlbGVjdCBpdCBiYXNlZCBvbiBDUFUgb25seSwgbm90Ci0JaW5kaXZpZHVhbCB0YXJnZXQgbmFtZXMuICBIYW5kbGUgbTY4ay1ocC1ocHV4Kiwgbm90IGp1c3QgLWhwdXguCi0KLQkqIGNvbmZpZy90Yy16OGsuYyAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogQWRkIGR1bW15IGFyZ3VtZW50Ci0JdG8gbWF0Y2ggcHJvdG90eXBlIGluIG9iai1jb2ZmLmguCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2tpcCB0ZXN0cyBmb3IgZGVmaW5pbmcgV0FOVF9GT1BFTl9CSU4gYW5kCi0JSUJNX0NPTVBJTEVSX1NVWC4KLQkqIGFjY29uZmlnLmg6IERlbGV0ZWQgdGhlbS4KLQkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMC4KLQkqIGNvbmZpZy9nbzMyLmNmZywgY29uZmlnL3Ztcy1jb25mLmg6IFVwZGF0ZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yLCBtZF9jb252ZXJ0X2ZyYWdfMSk6IEFsd2F5cyB1c2UKLQlJQk1fQ09NUElMRVJfU1VYIHZlcnNpb24gb2YgY29kZSwgd2l0aCBjb21tZW50cyBpbmRpY2F0aW5nIHdoeS4KLQotCSogbGlzdGluZy5jIChmaWxlX2luZm8pOiBVc2UgdGV4dCBtb2RlIHdoZW4gb3BlbmluZyBmaWxlIGZvciByZWFkLgotCVVzZSAiciIgZGlyZWN0bHksIG5vIG1hY3JvLgotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX29wZW4pOiBEb24ndCB1c2UgRk9QRU5fUlQsIGp1c3QgdXNlCi0JInIiLgotCSogcmVhZC5jIChzX2luY2x1ZGUpOiBEaXR0by4KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IFRyeSBib3RoICJ3YiIgYW5kICJ3IiwgZG9uJ3QKLQlib3RoZXIgd2l0aCBGT1BFTl8qIG1hY3Jvcy4KLQkqIGFzLmg6IERvbid0IGluY2x1ZGUgZm9wZW4tKi5oLgotCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IE1ha2UgInJldCIgd2l0aCBubyBvcGVyYW5kcyBlcXVpdmFsZW50IHRvCi0JInJldCB6ZXJvLChyYSkiLCB0byBtYXRjaCBPU0YxIGFuZCB0byBiZSBjb25zaXN0ZW50IHdpdGggYm90aAotCW9uZS1vcGVyYW5kIGZvcm1zLgotCi0JUGF0Y2hlcyBmcm9tIERKIERlbG9yaWU6Ci0JKiBhcy5oIChhbGxvY2EpOiB1bmRlZiBhbGxvY2EgYmVmb3JlIGRlZmluaW5nIGl0IGp1c3QgaW4gY2FzZQotCSogY29uZmlnL2dvMzIuY2ZnOiBuZXcgZmlsZSBmb3IgYXV0b2NvbmYgdmFsdWVzCi0JKiBjb25maWcvdGUtZ28zMi5oOiBuZXcgZmlsZQotCSogY29uZmlndXJlLmJhdDogbmV3IGZvciBhdXRvY29uZgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEZpeCB0eXBvIGluIEdPVFBDIGNoZWNrOyBoYWQgPQotCWZvciA9PS4KLQotCSogY29uZmlndXJlLmluOiBJZiB0YXJnZXRfZnJhZyBkb2Vzbid0IGV4aXN0LCB1c2UgL2Rldi9udWxsLgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogRm9yIG5vbi1WTVMgc3lzdGVtcywgcmUtYWRkIGB2JyB0bwotCXN0ZF9zaG9ydG9wdHMuICBBZGQgInZlcmJvc2UiIHRvIGxpc3Qgb2YgbG9uZyBvcHRpb25zLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFdoZW4gZ2VuZXJhdGluZyBhbiBhYnNvbHV0ZSBzZWN0aW9uCi0Jc3ltYm9sIGFzIGEgcGxhY2Vob2xkZXIsIGRvbid0IG1hcmsgaXQgYXMgdXNlZCBpbiBhIHJlbG9jYXRpb24KLQllbnRyeSwgaGVyZS4KLQotCSogTWFrZWZpbGUuaW4gKGNvbXBhcmlzb24pOiBDb21wYXJlIHVzaW5nIG1ha2VmaWxlIGNvZGUgZnJvbSBnY2MsCi0Jc3RyaXBwZWQgZG93biB0byBkaXNjYXJkIHN1YmRpciBzdHVmZiBhbmQgYWRhcHRlZCB0byBnaXZlIGEKLQlub24temVybyBleGl0IHN0YXR1cyBpZiBlaXRoZXIgZmlsZSBkaWZmZXJzLgotCi1UaHUgTm92ICAzIDE1OjQzOjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogRml4IFJFTEFYX0VOQ09ERSBhcmd1bWVudHMgZm9yCi0JTk9fUElDIGNhc2UuCi0KLVR1ZSBOb3YgIDEgMTY6MTA6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2NoYW5nZV9zZWMpOiBJZiBub3QgR1BPUFQsIGRvbid0IHBlcm1pdAotCXN3aXRjaGluZyB0byB0aGUgcmVhZG9ubHkgZGF0YSBzZWN0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfdHlwZSk6IEZpeCB3YXJuaW5nIG1lc3NhZ2UuCi0KLVN1biBPY3QgMzAgMDA6NTc6MzUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3Byb2MpOiBEZWxldGUgZGlzYWJsZWQgY29kZSB0byBwdXQgZWFjaAotCXByb2MgaW4gaXRzIG93biBzdWJzcGFjZSwgd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdC4KLQotVHVlIE9jdCAyNSAxNDo0NDozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRW5zdXJlIHRoYXQgbWlwczIgY2FzZSBvZiBNX0xJX0REIGluCi0JLnJkYXRhIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19jcHUpOiBJbml0aWFsaXplIHRvIC0xLgotCShtZF9iZWdpbik6IERvbid0IG1pcHNfY3B1IGlmIGl0IHdhcyBhbHJlYWR5IHNldC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRm9yIC1taXBzTiwgZG9uJ3Qgc2V0IG1pcHNfY3B1IGlmIGl0IHdhcwotCWFscmVhZHkgc2V0LiAgRm9yIC1tY3B1PSwganVzdCBzZXQgbWlwc19jcHUsIG5vdCBtaXBzX2lzYS4KLQotRnJpIE9jdCAyMSAyMDo0MjoyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IElmIE9CSl9FTEYsIGhhbmRsZSAuc2VjdGlvbi4KLQkoc19lbGZfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogRG9uJ3QgYWJvcnQgaWYgd2UgZG9uJ3QgcmVjb2duaXplCi0JdGhlIHNlY3Rpb24gd2hlbiBzZXR0aW5nIHRoZSBzdG9yYWdlIGNsYXNzOyBkZWZhdWx0IHRvIHNjX0RhdGEuCi0KLVRodSBPY3QgMjAgMDA6NDM6MzggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IFNldCBuZXdfdmFsIHRvIDggZm9yIGFsbAotCWZpeHVwcyB0byBicmFuY2ggaW5zdHJ1Y3Rpb25zIChub3QganVzdCBwYy1yZWxhdGl2ZSBvbmVzKSB3aGljaAotCXdpbGwgZ2VuZXJhdGUgU09NIHJlbG9jYXRpb25zLgotCi1XZWQgT2N0IDE5IDEzOjQxOjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWEyOWsuYzogSW5jbHVkZSBjdHlwZS5oIHdpdGggYW5nbGUgYnJhY2tldHMuCi0JKGRlZmluZV9zb21lX3JlZ3MpOiBBZGQgbmV3IHNwZWNpYWwgcmVnaXN0ZXIgbmFtZXMgZGVmaW5lZCBvbiB0aGUKLQkyOTA0MC4KLQkocGFyc2Vfb3BlcmFuZCk6IEFkZCBhcmd1bWVudCBvcHQuICBJZiBub24temVybywgZG9uJ3Qgd2FybiBhYm91dAotCWEgbWlzc2luZyBvcGVyYW5kLgotCShtYWNoaW5lX2lwKTogSWYgaGFuZGxpbmcgYXJndW1lbnQgdHlwZSAnSScsIHBhc3Mgb3B0IGFzIG5vbi16ZXJvCi0JdG8gcGFyc2Vfb3BlcmFuZC4gIEhhbmRsZSBuZXcgb3B0aW9uYWwgb3BlcmFuZCB0eXBlICdJJy4KLQkobWRfdW5kZWZpbmVkX3N5bWJvbCk6IEhhbmRsZSBzcGVjaWFsIHJlZ2lzdGVyIG5hbWVzIChzck5OKS4KLQotVHVlIE9jdCAxOCAwMDo0NToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHJlbnVtYmVyX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBCRkRfQVNTRU1CTEVSIGZ1bmN0aW9uLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgaXQgYWZ0ZXIgcmVtb3ZpbmcgZ2FzIGNyZWF0ZWQgc2VjdGlvbnMuCi0KLU1vbiBPY3QgMTcgMTg6MDY6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9jcmVhdGUpOiBVc2UgdWRhdGEucCwgbm90IGp1c3QgdWRhdGEuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWNvZmZfc2V0X2V4dCk6IExpa2V3aXNlLgotCShlbGZfZ2V0X2V4dHIpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIGFzX3doZXJlIGlzCi0JdW5zaWduZWQgaW50ICosIG5vdCBpbnQgKi4KLQotTW9uIE9jdCAxNyAwMjoyNjozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogRWxpbWluYXRlIGFsbCB1c2VzIG9mIGZ4X2FkZG51bWJlci4KLQkodGNfZ2VuX3JlbG9jKTogU2ltcGxpZnkuICBJdCdzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc2V0IGEKLQlyZWxvYydzIGFkZGVuZCBmaWVsZCB0byB6ZXJvIGZvciBmdW5jdGlvbiBzeW1ib2xzLgotCShtZF9hcHBseV9maXgpOiBTaW1wbGlmeS4gIEZvciBmaXh1cHMgd2hpY2ggd2lsbCByZXF1aXJlIGEgU09NCi0JcmVsb2MsIGp1c3QgY2xlYXIgb3V0IHRoZSBuZWNlc3NhcnkgYml0cyBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUZyaSBPY3QgMTQgMTk6MDY6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogVXNlIGJpc29uIC15LCBub3QgYmlzb24uCi0KLVRodSBPY3QgMTMgMTk6MjI6NTQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIDIuNS4KLQkoY2xlYW4taGVyZSk6IERlbGV0ZSBzdGFtcC1tay5jb20uCi0JKGRpc3RjbGVhbik6IERlbGV0ZSAuZ2RiaW5pdC4KLQkqIFZlcnNpb24gMi41IHJlbGVhc2VkLgotCi1XZWQgT2N0IDEyIDIwOjMwOjUxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90ZS1uYnNkNTMyLmg6IFJlbmFtZWQgZnJvbSB0ZS1uZXRic2Q1MzIuaC4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBBZGp1c3RlZC4KLQotV2VkIE9jdCAxMiAxNjozMzozOCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9jcGx1cy1kZW0uYzogUmVtb3ZlZC4gIEl0IGlzbid0IHVzZWQuICBFdmVuIGlmIGl0IHdhcywKLQkgIGl0J3MgYmV0dGVyIHRvIHVzZSB0aGUgb25lIGluIGxpYmliZXJ0eS4KLQotV2VkIE9jdCAxMiAxODo0ODozOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fc3ltYm9sKTogVW5kbyBsYXN0Ci0JY2hhbmdlOyBpdCBicmVha3MgdGhlIHJzNjAwMCBzdXBwb3J0LCBhbmQgZG9lc24ndCBzZWVtIHRvIGJlCi0JbmVlZGVkLgotCi1XZWQgT2N0IDEyIDExOjU2OjUwIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuaCx0ZS1uZXRic2Q1MzIuaCAoVEFSR0VUX0ZPUk1BVCk6IENoYW5nZWQgdG8KLQkgIGEub3V0LTxhcmNoPi1uZXRic2QgdG8gbWF0Y2ggY29ycmVzcG9uZGluZyBjaGFuZ2VzIGluIEJGRC4KLQotV2VkIE9jdCAxMiAxMTowNjoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogUmVzb2x2ZSBzeW1ib2wgdmFsdWVzCi0JcmF0aGVyIHRoYW4gZXhwbGljaXRseSBhZGRpbmcgdGhlIGZyYWcgYWRkcmVzcy4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogQWRkIGEgemVybyBlbnRyeSB0byBtYXJrCi0JdGhlIGVuZCBvZiB0aGUgbGluZSBudW1iZXJzOyB0aGlzIHJlcGxhY2VzIHRoZSB6ZXJvIGVudHJ5IHdoaWNoCi0JdXNlZCB0byBiZSBhZGRlZCBieSBjb2ZmX2FkZF9saW5lc3ltLCByZW1vdmVkIE9jdCA3LgotCShjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBJZ25vcmUgc2VjdGlvbnMgd2l0aCBubyBzZWdpbmZvLgotCi1XZWQgT2N0IDEyIDAxOjQxOjM3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBDcmVhdGUgYQotCSJzdGFnZSIgc3ltbGluayB0byB0aGUgYXBwcm9wcmlhdGUgc3RhZ2UqIGRpcmVjdG9yeSwgYW5kIHVzZSBpdAotCWluc3RlYWQgaW4gdGhlIC1CIG9wdGlvbnMuCi0JKGNvbXBhcmlzb24pOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgotCi1UdWUgT2N0IDExIDE2OjQ4OjExIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBGb3Igbm9uLWEub3V0IHJlbG9jYXRpb25zLCBpZgotCXBjLXJlbGF0aXZlLCB1c2UgZnhfb2Zmc2V0IG9ubHksIGlnbm9yZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24uCi0KLVR1ZSBPY3QgMTEgMTU6MjQ6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3QgdXNlIFNfSVNfTE9DQUwgd2hlbiBjaGVja2luZwotCWZvciBhbiBlbWJlZGRlZCBQSUMgc3dpdGNoIGV4cHJlc3Npb24sIHNpbmNlIHRoZSBkZWZpbml0aW9uIG9mCi0JU19JU19MT0NBTCB3YXMgY2hhbmdlZC4KLQotVHVlIE9jdCAxMSAxNTowNToxMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbXBhcmlzb24pOiBXaGVuIGNvbXBhcmluZyBhcy5uZXcgb3IgZ2FzcC5uZXcsIHRyeQotCXJ1bm5pbmcgdGhlIGJpbmFyeSB0aHJvdWdoIHNlZCB0byBhdm9pZCBkaWZmZXJlbmNlcyBkdWUgdG8KLQkic3RhZ2UxIiBvciAic3RhZ2UyIiBoYXZpbmcgYmVlbiB3cml0dGVuIGludG8gdGhlIGJpbmFyeS4KLQotU2F0IE9jdCAgOCAwMTo0ODowNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCUVMRiBzeW1ib2wgc2l6ZSBoYW5kbGluZywgYmFzZWQgb24gY29kZSBmcm9tIEVyaWMgWW91bmdkYWxlOgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBOZXcgbWFjcm8uICBBZGRzIGFuCi0JZXhwcmVzc2lvbiBwb2ludGVyIHRvIHRoZSBzeW1ib2wgc3RydWN0dXJlLCB1c2VkIGZvciBgc2l6ZScKLQlleHByZXNzaW9ucyB0aGF0IGNvdWxkbid0IGJlIHJlZHVjZWQgdG8gY29uc3RhbnRzIHdoZW4gaW5pdGlhbGx5Ci0JcHJvY2Vzc2VkLgotCShlbGZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlLgotCShvYmpfZnJvYl9zeW1ib2wpOiBDYWxsIGVsZl9mcm9iX3N5bWJvbCBhbHdheXMsIHJhdGhlciB0aGFuCi0JZWNvZmZfZnJvYl9zeW1ib2wgb25seSBpZiBFQ09GRl9ERUJVR0dJTkcgZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWxldGVkIHVudXNlZCBjb2RlLgotCUNsZWFyIHN5X29iaiBmaWVsZC4KLQkob2JqX2VsZl9zaXplKTogRGVsZXRlZCB1bnVzZWQgY29kZS4gIElmIHNpemUgaXMgbm9uLXJlZHVjaWJsZQotCWV4cHJlc3Npb24sIGFsbG9jYXRlIHNvbWUgc3RvcmFnZSBmb3IgdGhlIHN5X29iaiBmaWVsZCBhbmQgY29weQotCXRoZSBleHByZXNzaW9uLgotCShlbGZfZnJvYl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uICBDb21wdXRlcyBzaXplcywgY2FsbHMKLQllY29mZl9mcm9iX3N5bWJvbCBpZiBhcHByb3ByaWF0ZS4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEZvciBpMzg2IGVsZiBhbmQgY29mZiAoZm9yIG5vdyksIGRvbid0Ci0JYWRkIGluIHZhbHVlIG9mIHN5bWJvbCBmcm9tIGFub3RoZXIgZGVmaW5lZCBzZWN0aW9uIG9mIHRoZSBmaWxlLgotCi1GcmkgT2N0ICA3IDE3OjU0OjAyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tODhrLmggKFRDX0tFRVBfRlhfT0ZGU0VUKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBUZXN0IG9ubHkgVENfS0VFUF9GWF9PRkZTRVQsCi0JcmF0aGVyIHRoYW4gYm90aCBpdCBhbmQgVENfTTg4Sy4KLQkoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2Zyb2Jfc2VjdGlvbik6IEZvciBub24tZW1wdHkgc2VjdGlvbnMsIGNyZWF0ZSBhdXggZW50cnkgZm9yCi0JdGhlIHNlY3Rpb24gc3ltYm9sLCBpbmRpY2F0aW5nIHRoZSBzaXplLgotCShuX2xpbmVfbm9zKTogTmV3IHZhcmlhYmxlLgotCShhZGRfbGluZW5vKTogSW5jcmVtZW50IGl0LgotCShjb2ZmX2FkZF9saW5lc3ltKTogSW5jcmVtZW50IG5fbGluZV9ub3MsIGRvbid0IGNhbGwgYWRkX2xpbmVuby4KLQkoY29mZl9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb247IG1hcCBjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMgb3ZlcgotCXNlY3Rpb25zLgotCShvYmpfY29mZl9saW5lKTogT25seSByZXNldCBsaW5lX2Jhc2UgZm9yIC5iZiBzeW1ib2xzLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcywgY29mZl9mcm9iX2ZpbGUpOgotCURlY2xhcmUuCi0JKG9ial9mcm9iX2ZpbGUpOiBOZXcgbWFjcm8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IFJlbmFtZWQgZnJvbQotCW9ial9mcm9iX2ZvcndhcmRfc3ltYm9sLCBhbmQgcmV3cml0dGVuIGZvciBuZXcgcGFyYW1ldGVyIGxpc3QuCi0KLQlNb24gT2N0ICAzIDIxOjAyOjM4IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChTX0lTX0xPQ0FMKTogZml4IG9ic29sZXRlIGZsYWdzZWVuW10gcmVmZXJlbmNlLgotCi1XZWQgT2N0ICA1IDExOjQ5OjI2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogQWNjZXB0IC5lc2l6ZSBhbmQgLmV0eXBlCi0JYXMgc3lub255bXMgZm9yIC5zaXplIGFuZCAudHlwZS4KLQotV2VkIE9jdCAgNSAwMDowODoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc2VjdGlvbik6IFJlbW92ZSBhc3NlcnQgYWJvdXQKLQlzZWN0aW9uIGFsaWdubWVudC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zZWN0aW9uX2FsaWduKTogVXNlIHNlY3Rpb24gYWxpZ25tZW50LCBub3QKLQl4dmVjIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KLQotRnJpIFNlcCAzMCAxOTowNToyMCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogdm1zY29uZi5zaCAobWFrZS1nYXMuY29tKTogaGFuZGxlIERDTCB2ZXJpZmljYXRpb24gdG8gZW5hYmxlCi0Jc2Vuc2libGUgZmVlZGJhY2sgdG8gdGhlIHVzZXIgd2hpbGUgZ2FzIGlzIGJlaW5nIGJ1aWx0LgotCi1GcmkgU2VwIDMwIDE2OjIzOjMxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUsIGxpc3Rpbmcgb25seSBtYWtlLWdhcy5jb20KLQlmb3Igbm93LgotCShkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0OyBidWlsZHMgRElTVFNUVUZGLgotCShyZWFsY2xlYW4pOiBTZXBhcmF0ZSB0YXJnZXQsIGRlcGVuZCBvbiBjbGVhbiBhbmQgZGlzdGNsZWFuLCB0aGVuCi0JZGVsZXRlIERJU1RTVFVGRi4KLQkqIG1ha2UtZ2FzLmNvbTogRGVsZXRlZC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl92YWxpZGF0ZV9maXgpIFtCRkRfQVNTRU1CTEVSXTogTmV3Ci0JZnVuY3Rpb24uICBDb252ZXJ0cyByZWxvYyBmb3IgImZvby1HT1QiIHRvIEJGRF9SRUxPQ18zODZfR09UT0ZGCi0JcmVsb2MgZm9yICJmb28iLgotCShpMzg2X29wZXJhbmQpOiBEb24ndCBsb29rIHVwIHNlY3Rpb24gc3ltYm9sIGZvcgotCXVuZGVmaW5lZF9zZWN0aW9uLgotCShyZWxvYyk6IEFsd2F5cyBwZXJtaXQgcmV0dXJuIG9mIDgtIGFuZCAxNi1iaXQgcmVsb2NhdGlvbiB0eXBlcy4KLQlBZGQgYSBzcGFjZSBhZnRlciAicGMtcmVsYXRpdmUiIGluIHRoZSBlcnJvciBtZXNzYWdlLgotCSh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKSBbQkZEX0FTU0VNQkxFUl06IFJlamVjdAotCUJGRF9SRUxPQ18zODZfR09UT0ZGIHJlbG9jcy4KLQkoaTM4Nl9vcGVyYW5kKTogRm9yIGFueSBHT1RPRkYgcmVsb2MsIGNvbnZlcnQgaXQgdG8gYSBCRkRfUkVMT0NfMzIKLQl3aXRoIGEgImZvby1HT1QiIHZhbHVlLgotCSogY29uZmlnL3RjLWkzODYuaCAoaTM4Nl92YWxpZGF0ZV9maXgpOiBEZWNsYXJlIGl0LgotCShUQ19WQUxJREFURV9GSVgpOiBOZXcgbWFjcm8gLS0gY2FsbCBpdC4KLQkoTk9QX09QQ09ERSk6IENhc3QgdG8gYGNoYXInIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBhcy5oOiBJZiBfX1NURENfXyBpcyBub3QgZGVmaW5lZCBhbmQgdmFyYXJncy5oIGlzIGF2YWlsYWJsZSwgdXNlCi0JaXQgcmF0aGVyIHRoYW4gc3RkYXJnLmguCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGRlZCBuZXcgYml0ZmllbGQgZnhfcGx0LCBmb3IgZml4dXBzCi0JcmVmZXJyaW5nIHRvIFBMVCBlbnRyaWVzLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IEluaXRpYWxpemUgZnhfcGx0IHRvIHplcm8uCi0JKGFkanVzdF9yZWxvY19zeW1zKTogUmUtZmV0Y2ggYHN5bScgYWZ0ZXIgdG9wIG9mIHJlZHVjdGlvbiBsb29wLgotCURvbid0IGFkanVzdCBmeF9vZmZzZXQgYnkgZnJhZyBhZGRyZXNzLCBzaW5jZSBTX0dFVF9WQUxVRSBub3cKLQlpbmNsdWRlcyB0aGUgZnJhZyBhZGRyZXNzLgotCShmaXh1cF9zZWdtZW50KTogQ2hhbmdlZCBsb2NhbCB2YXIgUENSRUwgdG8gdHlwZSBpbnQsIGFkZGVkIFBMVC4KLQlJZiBQQy1yZWxhdGl2ZSBmaXh1cCByZWZlcnMgdG8gYSBQTFQgZW50cnkgZm9yIGEgc3ltYm9sIGluIHRoZQotCWN1cnJlbnQgc2VjdGlvbiwgZG9uJ3QgcmVkdWNlIGl0LgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6ICBFeGl0IGxvb3AgdGhyb3VnaCBhIGxhYmVsLiAgSWYKLQlERUJVRzUgaXMgZGVmaW5lZCwgcHJpbnQgb3V0IGVhY2ggZml4dXAgYmVmb3JlIGFuZCBhZnRlcgotCXByb2Nlc3NpbmcuCi0JKGZpeHVwX3NlZ21lbnQpOiBJZiBERUJVRzUgaXMgZGVmaW5lZCwgcHJpbnQgb3V0IGVhY2ggZml4dXAgYmVmb3JlCi0JYW5kIGFmdGVyIHByb2Nlc3NpbmcuCi0JKHByaW50X2ZpeHVwKTogQWRkZWQgcHJvdG90eXBlLiAgU2hvdyBhZGRyZXNzIG9uIGZpcnN0IGxpbmUuICBTaG93Ci0JZnhfb2Zmc2V0IGFuZCBmeF9zdWJzeS4gIFshQkZEX0FTU0VNQkxFUl06IE9ubHkgc2hvdyBmeF9yX3R5cGUgaWYKLQlORUVEX0ZYX1JfVFlQRSBpcyBkZWZpbmVkLgotCi0JKiBzeW1ib2xzLmMgKHByaW50X3N5bWJvbF92YWx1ZV8xKTogQ2hlY2sgU19JU19MT0NBTCwgU19JU19FWFRFUk4sCi0JU19JU19ERUJVRywgU19JU19ERUZJTkVEIGFsc28uCi0KLVRodSBTZXAgMjkgMTg6NTc6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlcGVuZCBvbiAuZ2RiaW5pdC4KLQkoLmdkYmluaXQpOiBSZWJ1aWxkIGZyb20gZ2RiaW5pdC5pbiBieSBydW5uaW5nIGNvbmZpZy5zdGF0dXMuCi0KLQkqIGdkYmluaXQuaW46IERlZmluZSBuZXcgZnVuY3Rpb24gInBmIi4gIEZpeCBkb2Mgb24gInBlIiBhbmQgInBzIi4KLQotCSogd3JpdGUuYyAocHJpbnRfZml4dXApOiBQcmludCBzb3VyY2UgbG9jYXRpb24gb24gZmlyc3QgbGluZS4KLQlTaG93IGZ4X3JfdHlwZSBhbmQgZnhfYWRkc3kgZmllbGRzLgotCi1XZWQgU2VwIDI4IDE0OjU2OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGJmZF9nYXMgZm9yIGFsbCBzcGFyYyB0YXJnZXRzIGluIG9uZSBwbGFjZSwKLQlpbnN0ZWFkIG9mIHNlcGFyYXRlbHkgZm9yIGVhY2guICBDb3JyZWN0bHkgaGFuZGxlIHVzZXItc3VwcGxpZWQKLQkiLS1lbmFibGUtYmZkLWdhcyIgb3B0aW9uLgotCi0JKiBnZGJpbml0LmluOiBNb3ZlICJicmVhayBhYm9ydCIgdG8gZW5kLCBpbiBjYXNlIGdkYiBjb21wbGFpbnMuCi0KLQkqIGFzLmggKFBSSU5URl9XSEVSRV9MSUtFLCBQUklOVF9MSUtFKSBbVVNFX1NUREFSRywgIV9fR05VQ19fXToKLQlVc2UgUEFSQU1TIG1hY3JvLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fc3ltYm9sKTogRG9uJ3QgZG8gYW55Ci0JcHJvY2Vzc2luZyBpZiBhZGRfc3ltYm9sIGlzIHVuZGVmaW5lZCBvciBpbiBleHByX3NlY3Rpb24uCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fYWRkKTogRm9yIHN5bWJvbCBwbHVzCi0JY29uc3RhbnQtdmFsdWVkIHN5bWJvbCwgY29udmVydCB0byBPX3N5bWJvbCBhbmQgcmUtcmVkdWNlLgotCShTX0dFVF9WQUxVRSk6IElmIHN5bWJvbCBuZWVkcyByZXNvbHZpbmcsIHJlc29sdmUgaXQuCi0JKGluZGVudF9sZXZlbCk6IE5vIGxvbmdlciBzdGF0aWMuCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogRG9uJ3QgcHJpbnQgZnJhZyBhZGRyZXNzIGlmIGl0IG1hdGNoZXMKLQl6ZXJvX2FkZHJlc3NfZnJhZy4gIERvbid0IHByaW50ICJyZXNvbHZpbmciIGlmIGFscmVhZHkgcmVzb2x2ZWQuCi0JUHJpbnQgc2VnbWVudCBuYW1lLiAgRG9uJ3QgY2FsbCBwcmludF9leHByXzEgb24gYW4gdW5kZWZpbmVkCi0Jc3ltYm9sLgotCShwcmludF9leHByXzEpOiBGaXggd2hpdGVzcGFjZSBiZWZvcmUgcHJpbnRpbmcgWF9hZGRfbnVtYmVyLgotCi0JKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBObyBsb25nZXIgc3RhdGljLiAgVXNlIHN5bWJvbF9jcmVhdGUsCi0Jbm90IHN5bWJvbF9uZXcsIGZvciBzeW1ib2xzIGhvbGRpbmcgZXhwcmVzc2lvbiB2YWx1ZXMuCi0JKiBleHByLmggKG1ha2VfZXhwcl9zeW1ib2wpOiBNb3ZlIGRlY2xhcmF0aW9uIGhlcmUuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IEhhbmRsZSBPX2FkZCBieSBjcmVhdGluZyBhbgotCWV4cHJlc3Npb24tdmFsdWVkIHN5bWJvbCwgYW5kIGNhbGxpbmcgZml4X25ld19leHAgcmVjdXJzaXZlbHkuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogSWYgYSBmaXh1cCdzIHN5bWJvbCB2YWx1ZSBpcyBhIHN1bSBvZiBhbgotCXVuZGVmaW5lZCBzeW1ib2wgYW5kIGEgY29uc3RhbnQsIGZvbGQgdGhlIGNvbnN0YW50IGludG8gdGhlIGZpeHVwLAotCWFuZCByZWZlciB0byB0aGUgdW5kZWZpbmVkIHN5bWJvbCBkaXJlY3RseS4gIFRoZW4gcHJvY2VzcyB0aGUKLQlmaXh1cCBhZ2FpbiBmcm9tIHNjcmF0Y2guCi0JKHdyaXRlX29iamVjdF9maWxlKTogQmVmb3JlIGNhbGxpbmcgYWRqdXN0X3JlbG9jX3N5bXMsIG1ha2UgYSBwYXNzCi0JdGhyb3VnaCB0aGUgc3ltYm9sIGxpc3QgdHJ5aW5nIHRvIHJlc29sdmUgdmFsdWVzLgotCi0JKiB3cml0ZS5jIChwcmludF9maXh1cCk6IE5ldyByb3V0aW5lLCBmb3IgZGVidWdnaW5nLgotCSh3cml0ZV9yZWxvY3MpOiBDYWxsIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICBEZWxldGVkIHZhcmlvdXMKLQloYWNrcyBmb3Igd29ya2luZyBhcm91bmQgcHJvYmxlbXMgd2l0aCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZSB0byAyLjQuOTAuCi0KLVdlZCBTZXAgMjggMTE6NTA6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2FzcC5vKTogRGVwZW5kcyB1cG9uIGNvbmZpZy5oLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkobWRfYXBwbHlfZml4KTogSWYgYW4gdW5jb25kaXRpb25hbCBiIG9yIGJhbCBvdmVyZmxvd3MsIGFuZCB3ZSBhcmUKLQlub3QgYXNzZW1ibGluZyBQSUMgY29kZSwgcmVwbGFjZSBpdCB3aXRoIGEgaiBvciBqYWwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IENvcnJlY3QgYnJhbmNoIG92ZXJmbG93IHRlc3QuCi0JVXNlIGFzX2JhZF93aGVyZSBhbmQgYXNfd2Fybl93aGVyZSByYXRoZXIgdGhhbiBhc19iYWQgYW5kIGFzX3dhcm4uCi0KLU1vbiBTZXAgMjYgMTc6MTU6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBBZGQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB0bwotCWFzX2ZhdGFsIGNhbGxzLiAgSGFuZGxlIGJmZF9yZWxvY19vdmVyZmxvdyBjYXNlIHNwZWNpZmljYWxseSB3aGVuCi0JUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFLgotCi1GcmkgU2VwIDIzIDE2OjExOjI4IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFzLmggKFVTRV9TVERBUkcsIFVTRV9WQVJBUkdTKTogRGVmaW5lIG9uZSBvciBuZWl0aGVyIG9mIHRoZXNlCi0JaGVyZS4gIFVzZSB0aGVtIGZvciBkZWNpZGluZyB3aGljaCBQUklOVEYqTElLRSBtYWNybyBkZWZpbml0aW9ucwotCXRvIHVzZS4KLQkqIG1lc3NhZ2VzLmM6IFVzZSB0aGVtLCBpbnN0ZWFkIG9mIE5PX1NUREFSRywgTk9fVkFSQVJHUy4KLQlbIVVTRV9TVERBUkcgJiYgIVVTRV9WQVJBUkdTXSAodmFfYWxpc3QsIHZhX2RjbCwgLi4uKTogUHJvdmlkZQotCWRlZmF1bHQgZGVmaW5pdGlvbnMgbWF0Y2hpbmcgd2hhdCB3ZSB3ZXJlIGRvaW5nIGJlZm9yZS4KLQkoYXNfdHNrdHNrKTogUmVtb3ZlIHRoZSBub24tc3RkYXJnLCBub24tdmFyYXJncyB2ZXJzaW9uLCBhbmQKLQlhbHdheXMgdXNlIHRoZSB2YXJhcmdzIGZvcm0gaWYgbm90IHVzaW5nIHN0ZGFyZy4gIEl0J3Mgc2FmZSB0bwotCWFsd2F5cyB1c2UgdmZwcmludGYsIGJlY2F1c2UgbGliaWJlcnR5IHdpbGwgcHJvdmlkZSBpdCBpZiB0aGUKLQluYXRpdmUgc3lzdGVtIGRvZXNuJ3QuICBBbHNvLCBhbHdheXMgbWFrZSBmb3JtYXQgYmUgY29uc3QuCi0JKGFzX3dhcm4sIGFzX3dhcm5fd2hlcmUsIGFzX2JhZCwgYXNfYmFkX3doZXJlLCBhc19mYXRhbCk6IERpdHRvLgotCi1GcmkgU2VwIDIzIDE0OjQyOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IEFsd2F5cyB1c2UgYWRkaXUgd2hlbiBhZGRpbmcgYQotCWNvbnN0YW50IHRvICR6ZXJvLS1ubyBuZWVkIHRvIHVzZSBkYWRkaXUuCi0JKG1hY3JvKTogSGFjayB0aGUgLW1pcHMzIG92ZXJmbG93IHRlc3RzIHRvIG5vdCBmYWlsIHdoZW4gb2Zmc2V0VAotCWlzIG9ubHkgMzIgYml0cy4KLQotCSogc3ltYm9scy5oIChjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKTogRGVjbGFyZS4KLQotVGh1IFNlcCAyMiAyMTo1ODoyNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmM6IEJ1Z2ZpeGVzIGJhc2VkIGluIHBhcnQgb24gcGF0Y2hlcyBmcm9tIFBhdWwKLQlLcmFuZW5idXJnLgotCShsaXN0aW5nX25ld2xpbmUpOiBDaGVjayBmaWxlbmFtZSBhcyB3ZWxsIGFzIGxpbmUgbnVtYmVyIHdoZW4KLQlkZWNpZGluZyB3aGV0aGVyIHRvIHJlY29yZCBpdC4KLQkobGlzdF9zeW1ib2xfdGFibGUpIFtTX0lTX1JFR0lTVEVSXTogQ2hlY2sgdGhhdCBTX0lTX1JFR0lTVEVSIGlzCi0JZmFsc2UgKGlmIGRlZmluZWQpIGFzIHdlbGwgYXMgY2hlY2tpbmcgZm9yIHJlZ19zZWN0aW9uLgotCShsaXN0aW5nX2xpc3RpbmcpOiBJdGVyYXRlIGZldGNoaW5nIGxpbmVzIHdoaWxlIGxpbmUgbnVtYmVyIGlzIHRvbwotCWxvdywgYW5kIHdlIGhhdmVuJ3QgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogQ2hhbmdlZCBIQVZFX0RFTEVURSB0byBIQVZFX1JFTU9WRS4KLQotVGh1IFNlcCAyMiAxMzozOToxMCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAeDEuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IGNoZWNrIGlmCi0JY3VycmVudF9zdGFic19maWxlbmFtZSBpcyBOVUxMIGJlZm9yZSBzdHJjbXAuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGZpeCBhIGJ1ZyBpbiBnZW5lcmF0ZV9hc21fbGluZW5vCi0JY2hlY2tpbmcuCi0KLVdlZCBTZXAgMjEgMTg6MTc6MzUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2hvLSouaDogTm93LXVudXNlZCBmaWxlcyBkZWxldGVkLgotCi0JKiBzeW1ib2xzLmMgKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBOZXcgZnVuY3Rpb24uICBDb3BpZXMgQkZECi0Jc3ltYm9sIGZsYWdzIGFuZCBjYWxscyBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUy4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19zeW1ib2wpOiBDYWxsIGl0LCBpZiBYX2FkZF9udW1iZXIgaXMKLQl6ZXJvLiAgRG9uJ3QgY2FsbCBvYmpfZnJvYl9mb3J3YXJkX3N5bWJvbC4KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IENhbGwgY29weV9zeW1ib2xfYXR0cmlidXRlcywgYnV0IG9ubHkgaWYKLQlYX2FkZF9udW1iZXIgaXMgemVyby4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sKTogRGVsZXRlZC4KLQotCSogY29uZmlnL3RjLWk5NjAuYzogTG90cyBvZiB3aGl0ZXNwYWNlLCBjb21tZW50IHJlZm9ybWF0dGluZywKLQl1c2luZyBHTlUgaW5kZW50LgotCShzdHJjaHIpOiBEb24ndCBkZWNsYXJlLgotCVtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgY29tcGlsZSBtZF9jb252ZXJ0X2ZyYWcsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX3JpX3RvX2NoYXJzLAotCW1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLgotCShicnRhYl9lbWl0KTogVXNlIGRhdGFfc2VjdGlvbiwgbm90IFNFR19EQVRBLgotCi0JTW9uIFNlcCAxOSAxNzoxNDo0NCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL3Ztcy1jb25mLmg6IG5ldyBmaWxlLCBtYW51YWxseSBkZXJpdmVkIGZyb20gY29uZi5pbi4KLQkqIGNvbmZpZy1nYXMuY29tOiB1c2UgaXQsIGFuZCBlbGltaW5hdGUgb2Jzb2xldGUgImhvc3QuaCIuCi0KLVdlZCBTZXAgMjEgMTE6MTE6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19jdXJyZW50X2Jsb2NrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHBjX3N0YWJ4KTogU2V0IHN5X3RjLndpdGhpbiBvZiBhIENfU1RTWU0gc3ltYm9sIHRvCi0JcHBjX2N1cnJlbnRfYmxvY2suICBEb24ndCBtb3ZlIGFyb3VuZCBhbnkgc3RhYiBzeW1ib2wsIGp1c3QgdGhvc2UKLQlmb3IgY29tbW9uIHN5bWJvbHMuCi0JKHBwY19icyk6IFNldCBwcGNfY3VycmVudF9ibG9jay4KLQkocHBjX2VzKTogQ2xlYXIgcHBjX2N1cnJlbnRfYmxvY2suCi0JKHBwY19mcm9iX3N5bWJvbCk6IFNldCB0aGUgdmFsdWUgb2YgYSBDX1NUU1lNIHN5bWJvbCB0byB0aGUgb2Zmc2V0Ci0JZnJvbSB0aGUgY3NlY3Qgb2YgdGhlIGVuY2xvc2luZyBibG9jay4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaW5zbnNfc2luY2VfY2FjaGVfYWNjZXNzKTogUmVtb3ZlLgotCShhcHBlbmRfaW5zbik6IFJlbW92ZSBzZXR0aW5nIG9mIGluc25zX3NpbmNlX2NhY2hlX2FjY2VzcywgYW5kCi0Jc3BlY2lhbCA0NjAwIGhhbmRsaW5nOyBpdCB0dXJucyBvdXQgbm90IHRvIGJlIHJlcXVpcmVkLgotCi1UdWUgU2VwIDIwIDE2OjEzOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvcnRvcHRzKTogUmVtb3ZlIEUuCi0JKG1kX2xvbmdvcHRzKTogQWRkIEVCIGFuZCBFTC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC1FQiBhbmQgLUVMIGFzIHNlcGFyYXRlIG9wdGlvbnMsIHJhdGhlcgotCXRoYW4gYXMgYSBzaW5nbGUgLUUgb3B0aW9uIHdpdGggYW4gYXJndW1lbnQuCi0KLU1vbiBTZXAgMTkgMTI6NDI6MDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBSZWplY3QgcmVkdWN0aW9ucwotCWludm9sdmluZyBnbG9iYWwgc3ltYm9scyB0b28uCi0KLU1vbiBTZXAgMTkgMTI6MTI6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYXMuaDogVGVzdCBORUVEX0RFQ0xBUkFUSU9OXyosIG5vdCBORUVEXypfREVDTEFSQVRJT04uCi0KLQkqIGNvbmZpZ3VyZS5pbjogVGVzdCBmb3IgcmVtb3ZlLCBub3QgZGVsZXRlLiAgRml4IGNyb3NzLWFzc2VtYmxlcgotCXRlc3QuCi0JKiBhcy5oOiBUZXN0IEhBVkVfUkVNT1ZFLCBub3QgSEFWRV9ERUxFVEU7IGRlZmluZSB1bmxpbmsgdG8KLQlyZW1vdmUsIG5vdCBkZWxldGUuCi0KLQkqIHJlYWQuYyAocHNldWRvX3NldCwgY2FzZSBPX3N5bWJvbCk6IElmCi0JT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgaXMgZGVmaW5lZCwgaW52b2tlIGl0LgotCVtCRkRfQVNTRU1CTEVSXTogQ29weSBCU0ZfRlVOQ1RJT04gc2V0dGluZyB0b28uCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IERlZmluZS4KLQotCVdlZCBBdWcgMTAgMTk6MTU6MzAgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKERTR19TX0NfVUJJVFUsIERTVF9LX1ZGTEFHU19EU0MsIERTVF9LX1RTX0FUT00sCi0JbWFueSBvdGhlcnMpOiBuZXcgbWFjcm9zOyB2YWx1ZXMgb2J0YWluZWQgZnJvbSAiRFNUUkVDUkRTLlNETCIuCi0JKiBjb25maWcvb2JqLXZtcy5oICh2YXJpb3VzKTogdXNlIHRoZW0uCi0JKFVTRV9CSVRTVFJJTkdfREVTQ1JJUFRPUik6IG5ldyBtYWNybywgZm9yIHNlbGVjdGluZyBiaXRmaWVsZAotCXJlcHJlc2VudGF0aW9uIChvbmx5IGVudW0gYml0ZmllbGRzIGNhbiBhdm9pZCBiZWluZyBiaXRzdHJpbmdzKS4KLQkoYml0ZmllbGRfc3VmZml4LCBzZXR1cF9iYXNpY190eXBlKTogbmV3IHJvdXRpbmVzLgotCShWTVNfdHlwZWRlZl9wYXJzZSk6IHVzZSB0aGVtLiAgTm93IHJlY29nbml6ZSBiaXRmaWVsZHMgb2YgYWxsCi0JaW50ZWdyYWwgdHlwZXMsIG5vdCBqdXN0IHR5cGUgYGludCcuICBDYXZlYXQ6ICB0aGUgcmVwcmVzZW50YXRpb24KLQl1c2VkIGZvciBiaXRmaWVsZHMgc3RpbGwgZG9lcyBub3Qgd29yayBmb3Igb2JqZWN0cyBwbGFjZWQgaW4KLQlyZWdpc3RlcnMsIGFuZCBnY2MncyBvcHRpbWl6ZXIgc29tZXRpbWVzIHB1dHMgc21hbGwgc3RydWN0cyB0aGVyZS4KLQotCVR1ZSBKdW4gMTQgMTc6MzE6NDQgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHJlYWQuYyAoc190ZXh0KSBbI2lmIE9CSl9WTVNdOiBjbGVhciB0aGUgSU5fREVGQVVMVF9TRUNUSU9OCi0JYml0IGZyb20gY29uc3RfZmxhZy4KLQkqIGNvbmZpZy9vYmotdm1zLmggKElOX0RFRkFVTFRfU0VDVElPTik6IGRlZmluZSB0aGlzIG1hY3JvLgotCSh0Y19mcm9iX2xhYmVsKTogZGVmaW5lIHRoaXMgdG8gY2FsbCB2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwsCi0JYW5kIGRlY2xhcmUgdGhlIGxhdHRlci4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZheF9nX2RvdWJsZXMpOiBkZWNsYXJlIHRoaXMgZmlsZS1zY29wZQotCXZhcmlhYmxlLgotCShjb25zdF9mbGFnKTogaW5pdGlhbGl6ZSB0byBJTl9ERUZBVUxUX1NFQ1RJT04gaW5zdGVhZCBvZiAwLgotCSh2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwpOiBuZXcgcm91dGluZSAodGNfZnJvYl9sYWJlbCkuCi0JKFZNU19UQlRfUm91dGluZV9FbmQpOiBkb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIGBnY2NfY29tcGlsZWQuJwotCWFuZCBgZ2NjMl9jb21waWxlZC4nIGxhYmVsczsgdGhleSB3b24ndCByZWFjaCBoZXJlIGFueSBtb3JlLgotCShWTVNfdHlwZWRlZl9wYXJzZSkgW2Nhc2UgJ3InXTogZm9yIHR5cGVzIGBkb3VibGUnIGFuZCBgY29tcGxleAotCWRvdWJsZScsIHVzZSBgdmF4X2dfZG91YmxlcycgZmxhZyB0byBzZWxlY3QgdHlwZSBvZiBkb3VibGUuCi0JKFZNU193cml0ZV9vYmplY3RfZmlsZSkgW3RyYWNlYmFjayBzZXR1cF06IGRvbid0IHBhc3Mgc3ltYm9scwotCXdpdGggdGhlIElOX0RFRkFVTFRfU0VDVElPTiBhdHRyaWJ1dGUgdG8gdGhlIFRCVF9Sb3V0aW5lX0JlZ2luCi0JYW5kIFRCVF9Sb3V0aW5lX0VuZCBmdW5jdGlvbnMuCi0KLQlNb24gSnVuICA2IDIwOjUyOjIwIDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfVEJUX1JvdXRpbmVfRW5kKTogY2FjaGUgdGhlIHJlc3VsdCBvZgotCVNfR0VUX1ZBTFVFKCkgdG8gYXZvaWQgbWFueSByZXBlYXRlZCBmdW5jdGlvbiBjYWxscy4KLQkoVk1TX0NoZWNrX0Zvcl9NYWluKSBbI2lmIEhBQ0tfREVDX0NfU1RBUlRVUF06IGNhcGl0YWxpemUKLQlfQyRNQUlOX0FSR1MgaW4gYWR2YW5jZSwgaW4gY2FzZSAtaDMgKGxlYXZlIHN5bWJvbCBuYW1lIGFzLWlzKQotCWdldHMgcmVxdWVzdGVkLiAgW0FsbCB0aGUgSEFDS19ERUNfQ19TVEFSVFVQIGNvZGUgYXBwZWFycyB0bwotCWJlIG9ic29sZXRlOyBnY2MgZG9lcyBpdCBhdXRvbWF0aWNhbGx5IGZvciB2bXMgdGFyZ2V0LiAgSXQncwotCWFsc28gbWlzbmFtZWQsIGJlY2F1c2UgaXQgaXMgZm9yIHRoZSAiVkFYIEMiIHJ1bi10aW1lIGxpYnJhcnksCi0Jbm90IHRoZSBuZXdlciAiREVDIEMiIG9uZSB3aGljaCBoYXMgbXVjaCBkaWZmZXJlbnQgc3RhcnR1cCBjb2RlLl0KLQl7dmFyaW91c306IHVzZSBgU19TRVRfeHh4KHN5bWJvbCxuZXdfdmFsdWUpJyByYXRoZXIgdGhhbgotCWBTX0dFVF94eHgoc3ltYm9sKSA9IG5ld192YWx1ZScuCi0KLU1vbiBTZXAgMTkgMTI6MDU6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19kb3RfZmlsZV9zeW1ib2wpOiBVc2UgYmZkX2Fic19zZWN0aW9uX3B0ciwKLQlub3QgJmJmZF9hYnNfc2VjdGlvbi4KLQotVGh1IFNlcCAxNSAxODozNjozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoY2xlYW5fdXBfZXhwcmVzc2lvbik6IFVzZSBhZGRyZXNzVCwgbm90IGJmZF92bWEuCi0KLVR1ZSBTZXAgMTMgMjA6MDU6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGV4cHIuYyAoZXhwcik6IERvbid0IHJlZHVjZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUKLQlzYW1lIGZyYWcgaWYgdGhlIHN5bWJvbHMgYXJlIG5vdCBpbiBub3JtYWwgc2VjdGlvbnMuCi0KLQkqIGNvbmZpZy9vYmotc29tLmggKFNfU0VUX09USEVSLCBTX1NFVF9UWVBFKTogRGVsZXRlIGEub3V0IGNydWQuCi0JKFNfU0VUX0RFU0MsIFNfR0VUX09USEVSLCBTX0dFVF9UWVBFLCBTX0dFVF9ERVNDKTogTGlrZXdpc2UuCi0JKG9ial9hdHRhY2hfdW53aW5kX2luZm8pOiBEbyBub3QgZGVmaW5lLiAgTm90IG5lZWRlZCBhbnltb3JlLgotCSogY29uZmlnL3RjLWhwcGEuYzogRGVsZXRlIHdoaXRlc3BhY2UgYXQgRU9MLgotCShzdHJ1Y3QgaHBwYV9maXhfc3RydWN0KTogRGVsZXRlIGZ4X3Vud2luZCBmaWVsZCBhbmQgYWxsIHJlZmVyZW5jZXMuCi0JKGZpeF9uZXdfaHBwYSk6IExhc3QgYXJnIGlzIG5vdyBhIHBvaW50ZXIgdG8gYW4gaW50LiAgRG8gbm90Ci0JY2FsbCBvYmpfYXR0YWNoX3Vud2luZF9pbmZvIGFueW1vcmUuICBGb3IgU09NIFJfRU5UUlkgYW5kIFJfRVhJVAotCWZpeHVwcywgc3RvcmUgMzJiaXRzIG9mIHVud2luZCBpbmZvcm1hdGlvbiBpbiB0aGUgZnhfYWRkbnVtYmVyCi0JZmllbGQgb2YgdGhlIGZpeHVwLgotCShtZF9hc3NlbWJsZSwgcGFfZW50cnksIHByb2Nlc3NfZXhpdCwgcGFfcHJvY2VuZCk6IEZvciBTT00gUl9FTlRSWQotCWFuZCBSX0VYSVQgZml4dXBzLCBwYXNzIGEgTlVMTCBwb2ludGVyIHRvIGZpeF9uZXdfaHBwYSwgYW5kIGEKLQlwb2ludGVyIHRvIDMyIGJpdHMgb2YgdW53aW5kIGluZm8uCi0JKHRjX2dlbl9yZWxvYyk6IEZvciBTT00gUl9FTlRSWSBhbmQgUl9FWElUIGZpeHVwcywgc2V0IHRoZSBzeW1ib2wKLQlwb2ludGVyIHRvIHRoZSBkdW1teSBzeW1ib2w7IHNldCB0aGUgYWRkZW5kIGZpZWxkIHRvIGZ4X2FkZG51bWJlci4KLQkocGFfY29tbSwgcGFfZXF1LCBwYV90eXBlX2FyZ3MsIHBhX2ltcG9ydCk6IFVzZSBiZmRfWFhYX3NlY3Rpb25fcHRyCi0JcmF0aGVyIHRoYW4gJmJmZF9YWFhfc2VjdGlvbi4KLQotVHVlIFNlcCAxMyAyMToxNTozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXhfMSk6IEZvciBHT1RQQyByZWxvY3MsIGRlY3JlbWVudAotCXZhbHVlIGJ5IG9uZTsgZGlzY2FyZCBhZGp1c3RtZW50cyBwcmV2aW91c2x5IGJlaW5nIG1hZGUuICBGcm9tCi0JRXJpYyBZb3VuZ2RhbGUuCi0KLQlWTVMtIGFuZCBWYXgtcmVsYXRlZCBjaGFuZ2VzIGZyb20gUGF0IFJhbmtpbjoKLQkqIE1ha2VmaWxlLmluIChWTVNfT1RIRVJfT0JKUyk6IGFkZCBjb25jYXQsIGdldG9wdCwgYW5kIGdldG9wdDEuCi0JKiB2bXNjb25mLnNoOiBubyBsb25nZXIgaGF2ZSBtYWtlLWdhcy5jb20gZWNobyB0ZXh0IGFib3V0IG5lZWRpbmcKLQl0byBtb2RpZnkgdGhlIGdjYy12bXMgZHJpdmVyIHdoZW4gaW50ZW5kaW5nIHRvIHVzZSB3aXRoIGdjYyAxLnguCi0JKiBhcy5jIChwYXJzZV9vcHRpb25zKTogc3VwcHJlc3MgJ3YnIGZyb20gc3RkX3Nob3J0X29wdGlvbnMgYW5kCi0JZWxpbWluYXRlIFZNUy1zcGVjaWZpYyBjb25kaXRpb25hbCBpbml0aWFsaXphdGlvbjsKLQlbZGVmYXVsdCBjYXNlXTogY2hlY2sgZm9yICctdicgaWYgbWRfcGFyc2Vfb3B0aW9ucyBkb2Vzbid0IHJlY29nbml6ZQotCWFuIG9wdGlvbjsKLQlbZGVmYXVsdCBjYXNlLCAjaWYgVk1TXTogY2hlY2sgZm9yIGZpbGVuYW1lIGFyZ3VtZW50IHdoZW4gJy12JyBzZWVuOwotCVtjYXNlICd2J106IGRlbGV0ZS4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBkb24ndCByZWx5IG9uIGB0aGlzX2FkZF9udW1iZXInCi0JZm9yIE9fYmlnIGxpdGVyYWwgb3BlcmFuZHMgKGRvdWJsZSBmbG9hdHMgYW5kIGxvbmcgbG9uZyBpbnRzKTsKLQlbVk1TLCBtZF9zaG9ydG9wdHNdOiBhZGQgc2Vjb25kIGNvbG9uIGFmdGVyICd2JzsKLQkobWRfcGFyc2Vfb3B0aW9ucykgW1ZNUywgY2FzZSAndiddOiAgY2hlY2sgZm9yIGFyZ3VtZW50LCBzbwotCWNhbGxlciBjYW4gaGFuZGxlIGAtdicgdy9vIGFyZy4KLQotVHVlIFNlcCAxMyAxNjo0NTowOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6ICBJZiBUQ19LRUVQX0ZYX09GRlNFVAotCWlzIGRlZmluZWQsIHB1dCB0aGUgdHhfb2Zmc2V0IGludG8gdGhlIHJfb2Zmc2V0LgotCSogY29uZmlnL3RjLXNoLmMgKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCAjCi0JKHRjX3JlbG9jX21hbmdsZSk6IERlbGV0ZWQuCi0JKiBjb25maWcvdGMtc2guaCAoVENfS0VFUF9GWF9PRkZTRVQpOiBEZWZpbmUuCi0JKFRDX1JFTE9DX01BTkdMRSk6IERlbGV0ZS4KLQotVHVlIFNlcCAxMyAxNjoyMDozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBmbG9udW0ta29uc3QuYzogQ2hhbmdlIHByZXByb2Nlc3NvciB0ZXN0cyBvZiBIT19WTVMgdG8ganVzdCBWTVMuCi0JKiBoZXgtdmFsdWUuYzogRGl0dG8uCi0JKiBjb25maWcvb2JqLXZtcy5jOiBEaXR0by4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogUmVwbGFjZSBhc19iYWQvZXhpdCBzZXF1ZW5jZSB3aXRoCi0JYSBjYWxsIHRvIGFzX2ZhdGFsLgotCSogY29uZmlnL3RjLWk4NjAuYyAoaTg2MF9pcCk6IERpdHRvLgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IERpdHRvLgotCSogYXMuYyAocGFyc2VfYXJncyk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogUmVwbGFjZSBhc193YXJuL2V4aXQgc2VxdWVuY2Ugd2l0aCBhCi0JY2FsbCB0byBhc19mYXRhbC4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBVc2UgRVhJVF9GQUlMVVJFLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlLCBvdXRwdXRfZmlsZV9jbG9zZSwKLQlvdXRwdXRfZmlsZV9jcmVhdGUsIG91dHB1dF9maWxlX2Nsb3NlKTogRGl0dG8uCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IERpdHRvLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uLCBvYmpfc29tX2NvcHlyaWdodCk6IERpdHRvLgotCSogY29uZmlnL29iai1pZWVlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy12YXguYyAobWFpbik6IFVzZSBFWElUX1NVQ0NFU1MuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtYWluKTogRGl0dG8uCi0KLQkqIGhhc2guYyAobWFpbik6IFBhc3MgYSB2YWx1ZSB0byBleGl0KCkuCi0KLQkqIGFzLmggKEVYSVRfU1VDQ0VTUywgRVhJVF9GQUlMVVJFKTogTW92ZWQgaGVyZS4KLQkqIGFzLmM6IC4uLmZyb20gaGVyZS4KLQkocGFyc2VfYXJncyk6IFVzZSB0aGVtIGFsd2F5cy4KLQkobWFpbik6IFVzZSBleGl0IHJhdGhlciB0aGFuIHJldHVybi4KLQotCSogTWFrZWZpbGUuaW4gKCpfRk9SX1RBUkdFVCwgSU5TVEFMTF9YRk9STSwgaW5zdGFsbCwgdW5pbnN0YWxsKToKLQlSZXdyaXRlIGhhbmRsaW5nIG9mIHByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVGVzdCBmb3IgZnVuY3Rpb25zIHVubGluayBhbmQgZGVsZXRlLgotCSogYXMuaDogSWYgdW5saW5rIGlzbid0IGF2YWlsYWJsZSBidXQgZGVsZXRlIGlzLCBkZWZpbmUgdW5saW5rIHRvCi0JYmUgZGVsZXRlLgotCi0JVXBkYXRlIGZvciBhdXRvY29uZiAxLjExODoKLQkqIGdkYmluaXQuaW46IE5ldyBmaWxlLCBjcmVhdGVkIGZyb20gb2xkIC5nZGJpbml0LgotCSogLmdkYmluaXQ6IERlbGV0ZWQuCi0JKiBhY2xvY2FsLm00IChHQVNfR0RCSU5JVCk6IERlbGV0ZWQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBpdC4gIEluc3RlYWQsIGdlbmVyYXRlIC5nZGJpbml0IGZyb20KLQlnZGJpbml0LmluLiAgRG9uJ3Qgc3Vic3RpdHV0ZSBjcHVfdHlwZSwgb2JqX2Zvcm1hdCwgZW11bGF0aW9uLAotCWF0b2YuICBTd2l0Y2hlZCBvcmRlciBvZiBBQ19MSU5LX0ZJTEVTIGFyZ3VtZW50cy4gIFVzZSBBQ19QUkVSRVEKLQl0byBlbnN1cmUgdGhhdCBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZiBhcmVuJ3QgdXNlZC4KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBAY29uZmlndXJlX2lucHV0QCBsaW5lLgotCShjb25maWd1cmUpOiBEZWxldGVkIHJ1bGUuCi0KLVR1ZSBTZXAgMTMgMTI6MDg6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IEFmdGVyIGhhbmRsaW5nIHRoZSBkaWZmZXJlbmNlCi0Jb2YgdHdvIHN5bWJvbHMgZnJvbSB0aGUgc2FtZSBzZWdtZW50LCBzZXQgZnhfc3Vic3kgdG8gTlVMTCwgdG8KLQlzYXRpc2Z5IGV4aXN0aW5nIFRDX0NPVU5UX1JFTE9DIG1hY3Jvcy4KLQotVHVlIFNlcCAxMyAwMTo0NzowOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhY2xvY2FsLm00IChHQVNfR0RCSU5JVCk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGl0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotTW9uIFNlcCAxMiAyMDo1NjozOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIC5nZGJpbml0IChwZSwgcHMpOiBEZWZpbmUgbmV3IGNvbW1hbmRzLgotCSogc3ltYm9scy5jIChpbmRlbnRfbGV2ZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbmRlbnQsIHByaW50X2V4cHJfMSwgcHJpbnRfc3ltYm9sX3ZhbHVlXzEsIHByaW50X3N5bWJvbF92YWx1ZSwKLQlwcmludF9leHByKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IEFkZCBhICJ0aGlzIGZpbGUgZ2VuZXJhdGVkIGJ5IG1ha2UiCi0JbWVzc2FnZSB0byBjb25maWcuaC4KLQotCVBJQyBpbXBsZW1lbnRhdGlvbiBmb3IgaTM4Ni1saW51eCwgYmFzZWQgb24gY29kZSBmcm9tIEVyaWMKLQlZb3VuZ2RhbGUgYW5kIFBhdWwgS3JhbmVuYnVyZywgd2l0aCBzb21lIHdvcmsgb2YgbXkgb3duOgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogVGVzdCBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAgb24gZml4dXAKLQliZWZvcmUgcHJvY2Vzc2luZyBzYW1lLXNlY3Rpb24gcGNyZWwgcmVsb2NhdGlvbnMuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmF1bHQgdG8gMS4KLQotCSogZXhwci5jIChtYWtlX2V4cHJfc3ltYm9sKTogSWYgb3BlcmF0b3IgaXMgT19zeW1ib2wgYW5kCi0JWF9hZGRfbnVtYmVyIGlzIHplcm8sIGp1c3QgcmV0dXJuIHRoZSBzeW1ib2wuICBJZiBvcGVyYXRvciBpcwotCU9fY29uc3RhbnQsIHJlc29sdmUgdGhlIHN5bWJvbCdzIHZhbHVlIGJlZm9yZSByZXR1cm5pbmcuCi0JKG9wZXJhbmQpOiBQZXJtaXQgdXNlIG9mICJbXSIgZm9yIGdyb3VwaW5nLgotCShjbGVhbl91cF9leHByZXNzaW9uKTogRm9yIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlIHNhbWUKLQlmcmFnLCBhZGQgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlaXIgb2Zmc2V0cyBpbnRvIFhfYWRkX251bWJlci4KLQkoZXhwcik6IFJlZHVjZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHNhbWUgZnJhZyB0byB0aGVpcgotCWRpZmZlcmVuY2UuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFRDX1JFTE9DKTogTmV3IG1hY3JvLgotCShzdHJ1Y3QgX2kzODZfaW5zbik6IE5ldyBmaWVsZCBkaXNwX3JlbG9jLgotCShHT1Rfc3ltYm9sKTogTmV3IHZhcmlhYmxlLgotCShvcGVyYW5kX3NwZWNpYWxfY2hhcnMpOiBBZGRlZCBzcXVhcmUtYnJhY2tldHMgYW5kIGF0LXNpZ24uCi0JKHJlbG9jKSBbQkZEX0FTU0VNQkxFUl06IEFkZGVkIG5ldyBhcmd1bWVudCBPVEhFUjsgaWYgaXQgaXMgbm90Ci0JTk9fUkVMT0MsIGp1c3QgcmV0dXJuIGl0LgotCShyZWxvYykgWyEgQkZEX0FTU0VNQkxFUl06IEFkZCB0aGlyZCBhcmd1bWVudCB0byBkdW1teSBtYWNyby4KLQkoQkZEX1JFTE9DXzM4Nl9QTFQzMiwgX0dPVDMyLCBfR09UT0ZGKSBbISBCRkRfQVNTRU1CTEVSXTogTW9yZQotCWR1bW15IG1hY3Jvcy4KLQkodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4gIFJldHVybnMgemVybyBpZiBzeW1ib2wgaW4KLQlmaXh1cCBpcyBub3QgbG9jYWwsIHRvIHByZXZlbnQgcmVsb2NhdGlvbnMgYWdhaW5zdCBleHRlcm5hbHMgZnJvbQotCWJlaW5nIGRyb3BwZWQuCi0JKG1kX2Fzc2VtYmxlKTogSW5pdGlhbGl6ZSBkaXNwX3JlbG9jIGZpZWxkIHRvIE5PX1JFTE9DLiAgUGFzcwotCWRpc3BfcmVsb2MgZmllbGQgdG8gcmVsb2MoKSBmdW5jdGlvbiwgYW5kIHVzZSBUQ19SRUxPQyB0byBnZW5lcmF0ZQotCXZhbHVlIHRvIHBhc3MgdG8gZml4X25ld19leHAuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIDMyLWJpdCByZWxvYyBhZ2FpbnN0IEdPVF9zeW1ib2wgaW50byBhIEdPVFBDCi0JcmVsb2MuCi0JKGkzODZfb3BlcmFuZCk6IEluaXRpYWxpemUgZGlzcF9yZWxvYyBmaWVsZCB0byBOT19SRUxPQy4gIEhhbmRsZQotCUBHT1RPRkYsIEBQTFQsIEBHT1Qgb3BlcmFuZHMuICBGb3IgR09UT0ZGIHJlbG9jYXRpb25zIHdpdGggbG9jYWwKLQlzeW1ib2xzLCBmb3JjZSBnZW5lcmF0aW9uIG9mIHRoZSBzZWN0aW9uIHN5bWJvbC4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBJZiBHT1Rfc3ltYm9sIGV4aXN0cywgZGVjaWRlCi0Jd2UncmUgZ2VuZXJhdGluZyBQSUMgY29kZSwgYW5kIGNvbnZlcnQgcmVsb2NhdGlvbnMgYWdhaW5zdAotCXVuZGVmaW5lZCBzeW1ib2xzIGZyb20gUENSRUwgdG8gUExUMzIuCi0JKG1kX2FwcGx5X2ZpeF8xKSBbT0JKX0VMRl06IEZpeCB1cCB2YWx1ZXMgZm9yIGR5bmFtaWMtbGlua2luZwotCXJlbG9jcy4KLQkobWRfdW5kZWZpbmVkX3N5bWJvbCk6IE5vdGljZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgYW5kIHNldAotCWFuZCByZXR1cm4gR09UX3N5bWJvbCBpZiBpdCBtYXRjaGVzLgotCShGLCBNQVApOiBNb3ZlIG1hY3JvIGRlZmluaXRpb25zIG91dHNpZGUgZnVuY3Rpb24uCi0JKHRjX2dlbl9yZWxvYyk6IE9ubHkgc3dpdGNoIG9uIHNpemUgYW5kIHBjcmVsIGlmIGNvZGUgd2Fzbid0Ci0JYWxyZWFkeSBzdXBwbGllZCBhcyBQTFQzMi4gR09UMzIsIEdPVE9GRiwgb3IgR09UUEMuICBDb252ZXJ0Ci0JQkZEX1JFTE9DXzMyIHVzaW5nIEdPVF9zeW1ib2wgaW50byBHT1RQQy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX1JFTE9DLCB0Y19maXhfYWRqdXN0YWJsZSwKLQlUQ19SRUxPQ19HTE9CQUxfT0ZGU0VUX1RBQkxFLCBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBOZXcKLQltYWNyb3MuCi0JKE5FRURfRlhfUl9UWVBFKTogRGVmaW5lLgotCShMT0NBTF9MQUJFTCk6IEFjY2VwdCAiLlgiIHByZWZpeCB0b28uCi0JKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlZmF1bHQgdG8gIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIuCi0KLU1vbiBTZXAgMTIgMTc6NTE6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3R5cGUpOiBSZXdyaXRlIHRvIGFjY2VwdCBzeW50YXgKLQlyZXBvcnRlZGx5IHRvIGJlIHVzZWQgb24gSXJpeCA2LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgLmdsb2JsIGFuZCAuZ2xvYmFsLgotCShzX21pcHNfZ2xvYmwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uOyBuZWVkZWQgZm9yIElyaXggNSBzdXBwb3J0LgotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IElmIEJTRl9GVU5DVElPTiBpcyBzZXQgZm9yIGFuCi0JZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8gdHlwZSwgc2V0IHRoZSB0eXBlIHRvIHN0X1Byb2MgcmF0aGVyIHRoYW4KLQlzdF9HbG9iYWwuICBEb24ndCBzZXQgdGhlIGluZGV4IG9mIGFuIGV4dGVybmFsIHN0X1Byb2Mgb3IKLQlzdF9TdGF0aWNQcm9jIHN5bWJvbCB1bmxlc3MgaXQgaXMgYWxzbyBhIGxvY2FsIHN5bWJvbC4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIGFzX3doZXJlIGlzCi0JdW5zaWduZWQgaW50ICosIG5vdCBpbnQgKi4KLQotVGh1IFNlcCAgOCAxNzoxODoyNCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggOiBDaGFuZ2UgbmFtZXMgdG8gIE9CSl9HRU5FUkFURV9BU01fTElORU5PLAotCWFuZCBnZW5lcmF0ZV9hc21fbGluZW5vLgotCSogY29uZmlnL29iai1lbGYuaCA6IGRpdHRvLgotCSogcmVhZC5oIDogZGl0dG8uCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGlmIG5vIGZpbGUgd2hlbiBpbnN0IGlzIHJlYWQsIHNldAotCWdlbmVyYXRlX2FzbV9saW5lbm8gdG8gdHJ1ZS4KLQkqIGVjb2ZmLmggOiBjaGFuZ2UgbmFtZSB0byBnZW5lcmF0ZV9hc21fbGluZW5vIGFuZCBhZGQgZnVuY3Rpb24KLQllY29mZl9ub19jdXJyZW50X2ZpbGUuCi0JKiBlY29mZi5jIDogY2hhbmdlIG5hbWUgdG8gZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pIDogbmV3IGZ1bmN0aW9uLCB0byBnZW5lcmF0ZQotCWVjb2ZmIHN0eWxlIGxpbmUgZm9yIGFzbSBmaWxlLgotCi1UaHUgU2VwICA4IDE5OjQzOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbik6IERvIGFuIGZwcmludGYgdG8gc3RkZXJyIHJhdGhlcgotCXRoYW4gYSBwcmludGYuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgYXNfYmFkX3doZXJlIHJhdGhlciB0aGFuIGFzX2JhZC4KLQotV2VkIFNlcCAgNyAxNzoyMToxMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMte2g4MzAwLHNofS5bY2hdICh0Y19jb2ZmX3N5bWJvbF9lbWl0KTogRnVuY3Rpb24gZG9pbmcKLQlub3RoaW5nIGJlY29tZXMgbWFjcm8gZG9pbmcgbm90aGluZy4KLQotV2VkIFNlcCAgNyAxOToxMDowOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBEZXBlbmQgb24gY29uZmlnLnN0YXR1cy4KLQkoY29uZmlnLnN0YXR1cyk6IFJ1biBjb25maWcuc3RhdHVzIGZyb20gLiBpbnN0ZWFkIG9mIHNyY2Rpci4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfZ2VuX3JlbG9jKTogVXNlIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIHRvCi0JZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlIHRoYXQgY291bGRuJ3QgYmUgaGFuZGxlZC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4gIERlbGV0ZWQgYWJvcnQgY2FsbAotCWFmdGVyIGNhbGwgdG8gYXNfZmF0YWwuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWxpbnV4Kik6IERvbid0IHNldCBiZmRfZ2FzLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgTk1fRk9SX1RBUkdFVCwgT0JKRFVNUF9GT1JfVEFSR0VULAotCWluc3RhbGwsIHVuaW5zdGFsbCk6IERvbid0IHVzZSAiYnJva2Vuc2VkIiBoYWNrIGFueSBtb3JlLCB0aGUgbmV3Ci0JYXV0b2NvbmYgY29kZSBzaG91bGQgbmV2ZXIgbGV0IHByb2dyYW1fdHJhbnNmb3JtX25hbWUgYmUgZW1wdHkuCi0KLQlVcGRhdGUgZm9yIGF1dG9jb25mIGJldGEgMS4xMTI6Ci0JKiBhY2xvY2FsLm00IChHQVNfQ0hFQ0tfREVDTF9ORUVERUQsIEdBU19XT1JLSU5HX0FTU0VSVCk6IE5ldwotCW1hY3Jvcy4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIHRoZW0uICBVc2UgQUNfQVJHX1BST0dSQU0gKG5vdyBwcm92aWRlZCBieQotCWF1dG9jb25mKSBpbnN0ZWFkIG9mIG15IGhhY2tlZC11cCBBQ19QUk9HUkFNX1RSQU5TRk9STV9OQU1FLiAgTW92ZQotCXRlc3QgZm9yIENST1NTX0NPTVBJTEUganVzdCBiZWZvcmUgQUNfRlVOQ19BTExPQ0EsIGFuZCBlbWl0IGEKLQltZXNzYWdlIHRvIHRyeSB0byBlYXNlIGNvbmZ1c2lvbiBhYm91dCBhdXRvY29uZidzCi0JImNyb3NzLWNvbXBpbGluZyIgbWVzc2FnZS4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fTUFMTE9DLCBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUsCi0JTkVFRF9ERUNMQVJBVElPTl9FUlJOTyk6IFJlbmFtZWQgZnJvbSBORUVEXypfREVDTEFSQVRJT04uCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlZ2VuZXJhdGVkLgotCi1XZWQgU2VwICA3IDEyOjQ5OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGVjayAke2hvc3R9IGFuZCAke3RhcmdldH0gcmF0aGVyIHRoYW4KLQkke2hvc3RfY2Fub259IGFuZCAke3RhcmdldF9jYW5vbn0uCi0JKiBjb25maWd1cmU6IExpa2V3aXNlLgotCi1UdWUgU2VwICA2IDExOjQyOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19jcHUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbnNuc19zaW5jZV9jYWNoZV9hY2Nlc3MpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IFNldCBtaXBzX2NwdSBhcyB3ZWxsIGFzIG1pcHNfaXNhLgotCShhcHBlbmRfaW5zbik6IElmIG1pcHNfY3B1IGlzIDQ2MDAsIHJlcXVpcmUgZm91ciBub3AgaW5zdHJ1Y3Rpb25zCi0JYmV0d2VlbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBhY2Nlc3NlcyB0aGUgY2FjaGUgYW5kIGNlcnRhaW4gQ0FDSEUKLQlpbnN0cnVjdGlvbnMuICBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHNlZW4gc2luY2UKLQlhbiBpbnN0cnVjdGlvbiB3aGljaCBhY2Nlc3NlcyB0aGUgY2FjaGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBtaXBzX2NwdSBhcyB3ZWxsIGFzIG1pcHNfaXNhLgotCi1Nb24gU2VwICA1IDA3OjA5OjAwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKFZQQVRIKTogRGVmaW5lIHVzaW5nIEBzcmNkaXJALgotCShwcmVmaXgsIHByb2dyYW1fdHJhbnNmb3JtX25hbWUsIGV4ZWNfcHJlZml4KTogVXNlIGF1dG9jb25mIHN0eWxlCi0JQC1zdWJzdGl0dXRpb25zLgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGNvbmZpZy9oby1yaXNjaXguaCwgY29uZmlnL3RjLWFybS5jLCBjb25maWcvdGMtYXJtLmg6IE5ldyBmaWxlcwotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgdGhlIGFybS4KLQotRnJpIFNlcCAgMiAxNjowNTo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGFkZF9maWxlKTogRG9uJ3QgdHJ5IHRvIGdlbmVyYXRlIGxpbmUgbnVtYmVycyBpZiB0aGUKLQlzeW1ib2wgdGFibGUgaGFzIGJlZW4gZnJvemVuLgotCi1UaHUgU2VwICAxIDE5OjQ4OjAxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBVc2UgQUNfREVGVU4sIGFuZCBvbWl0IEFDX1BST1ZJREUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHVzZXItc3BlY2lmaWVkIGJmZC1hc3NlbWJsZXIgb3B0aW9uIHdpdGgKLQlzZXBhcmF0ZSB2YXJpYWJsZSBmcm9tIHByZWZlcnJlZCBjb25maWd1cmF0aW9uLCB1bnRpbCB0aGUgdHdvIGFyZQotCXJlc29sdmVkLiAgSW5kaWNhdGUgYmZkX2dhcz1wcmVmZXJyZWQgZm9yIGxpbnV4IGEub3V0LiAgVXNlCi0JQUNfUFJPR1JBTV9UUkFOU0ZPUk1fTkFNRSwgZm9yIHdoaWNoIGEgcGF0Y2ggaGFzIGJlZW4gc2VudCB0byBkam0uCi0JKiBNYWtlZmlsZS5pbiAodGFyZ2V0X2FsaWFzLCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKTogRGVmaW5lLAotCXVzaW5nIGF1dG9jb25mIEAtc3Vic3RpdHV0aW9ucy4KLQotV2VkIEF1ZyAzMSAxNzo0MzowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhdG9mLWdlbmVyaWMuYzogRGVsZXRlZCBhbGxvY2EgaGFuZGxpbmcgaGVyZS4KLQotCSogTWFrZWZpbGUuaW4gKHByZWZpeCwgZXhlY19wcmVmaXgpOiBVc2UgQC1zdWJ0aXR1dGlvbnMuCi0KLQkqIGFjbG9jYWwubTQgKEFDX09VVFBVVF9MSU5LUyk6IERlbGV0ZWQgcmVkZWZpbml0aW9uLCBzaW5jZQotCWF1dG9jb25mIDEuMTA5IGhhcyB0aGlzIGZpeGVkLgotCSogY29uZmlndXJlLmluOiBEb24ndCBjaGFuZ2UgcXVvdGUgY2hhcmFjdGVycyBhcm91bmQgQUNfTVNHX0VSUk9SCi0JaW52b2NhdGlvbi4gIERvbid0IHVzZSBBQ19IRUFERVJfU1REQywgc2luY2UgaXQgcmVxdWlyZXMgcnVubmluZyBhCi0JcHJvZ3JhbS4gIENhY2hlIE5FRURfKl9ERUNMQVJBVElPTiB2YWx1ZXMuCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlZ2VuZXJhdGVkIHdpdGggYSBtb2RpZmllZCBhdXRvY29uZiAxLjEwOS4KLQotCSogYXMuaCAodm9sYXRpbGUpOiBEb24ndCB0ZXN0IG9yIGRlZmluZSBoZXJlOyBub3QgbmVlZGVkLgotCShhbGxvY2EpOiBSZXBsYWNlIGFsbG9jYS1jb25mLmggaW5jbHVzaW9uIHdpdGggY29kZSByZWNvbW1lbmRlZCBpbgotCWF1dG9jb25mIGRvY3VtZW50YXRpb24uICBJbmNsdWRlIGNvbmZpZy5oIGZpcnN0LgotCi1XZWQgQXVnIDMxIDExOjIwOjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfREVGSU5FRCk6IEFic29sdXRlIHN5bWJvbHMgYXJlIGRlZmluZWQKLQlhbHNvLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogSW5pdGlhbGl6ZSBiZmRfZ2FzIHRvIG5vLgotCi1UdWUgQXVnIDMwIDE5OjMxOjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IEluY2x1ZGUgYWxsb2NhLWNvbmYuaCBmcm9tICJsaWJpYmVydHkiLCBub3QKLQkiLi4vbGliaWJlcnR5Ii4KLQotTW9uIEF1ZyAyOSAxNjoxMTozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4KTogRG9uJ3QgZ2VuZXJhdGUgYSByZWxvYyB3aGVuIGEKLQlzeW1ib2wgaXMgdXNlZCBhcyBhbiBvZmZzZXQgaW50byBhIENTRUNUIHRoYXQgaXMgbm90IGEgVE9DLiAgVGhlc2UKLQl0eXBlcyBvZiBsb2FkcyBhcmUgZ2VuZXJhdGVkIGJ5IGdjYyAtbW1pbmltYWwtdG9jLgotCi1TdW4gQXVnIDI4IDEzOjIyOjUyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoZmxhZ18qKTogQWRkZWQgY29tbWVudHMgZGVzY3JpYmluZyBtZWFuaW5ncyBvZiBzb21lIG9mCi0JdGhlc2UgdmFyaWFibGVzLgotCShzdHJ1Y3QgZnJhZyk6IEFkZCBzb21lIGNvbW1lbnRzIGFib3V0IHRoZSBuczMyay1zcGVjaWZpYyBmaWVsZHMKLQlhbmQgd2h5IHRoZXkncmUgaGVyZS4KLQkoU0laRU9GX1NUUlVDVF9GUkFHKTogQ2FzdCBhZGRyZXNzZXMgdG8gY2hhciosIG5vdCBpbnQuCi0JKGZsYWdfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBTZXQgZmxhZ19wcmludF9zdGF0aXN0aWNzIGluc3RlYWQgb2YKLQlzdGF0aXN0aWNzX2ZsYWcuICBPcHRpb25zIGFycmF5IGlzIG5vdyBjb25zdC4gIEFkZGVkIG5ldyBvcHRpb24KLQkiZHVtcC1jb25maWciOyBpZiBzcGVjaWZpZWQsIHByaW50IFRBUkdFVF9BTElBUywgVEFSR0VUX0NBTk9OSUNBTCwKLQlUQVJHRVRfQ1BVLCBUQVJHRVRfT0JKX0ZPUk1BVCwgYW5kIFRBUkdFVF9GT1JNQVQsIGlmIGRlZmluZWQuCi0JKG1haW4pOiBDaGFuZ2UgdGVzdCB0byBjaGVjayBmbGFnX3ByaW50X3N0YXRpc3RpY3MuCi0JKHN0YXRpc3RpY3NfZmxhZyk6IERlbGV0ZWQuCi0KLQkqIGZyYWdzLmMgKGZyYWdfdmFyaWFudCk6IFJlbW92ZWQgUENSRUxfQURKVVNUIGFuZCBCU1IgYXJndW1lbnRzLgotCUFsd2F5cyBpbml0aWFsaXplIHRoZW0gdG8gemVyby4KLQkqIGZyYWdzLmggKGZyYWdfdmFyaWFudCk6IEZpeGVkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGdldF9jZGlzcCk6IERvbid0IHBhc3MgdGhlIGV4dHJhIHplcm8gYXJncy4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChjb252ZXJ0X2lpZik6IERvbid0IHBhc3MgdGhlIGFyZ3VtZW50czsgY2FjaGUKLQl0aGUgdmFsdWUgb2YgZnJhZ19ub3cgYW5kIGZpbGwgaW4gdGhlIGZpZWxkcyBsYXRlci4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogUmVtb3ZlIG5ldwotCWNvbmZpZ3VyZS1nZW5lcmF0ZWQgZmlsZXMuCi0KLVNhdCBBdWcgMjcgMjA6MjY6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tKQotCi0JQ29udmVyc2lvbiB0byBhdXRvY29uZjoKLQkqIGFjY29uZmlnLmgsIGFjbG9jYWwubTQ6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0dGVuIChleGNlcHQgZm9yIHNvbWUgdGFyZ2V0LXNwZWNpZmljIGNvZGUpCi0JZm9yIGF1dG9jb25mLgotCSogY29uZi5pbiwgY29uZmlndXJlOiBOZXcgZmlsZXMsIGdlbmVyYXRlZCBmcm9tIHRoZSBhYm92ZS4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIG1hZ2ljIHNlcXVlbmNlIGluZGljYXRpbmcgaW5zZXJ0aW9uIG9mCi0JbWFrZWZpbGUgZnJhZ21lbnRzLgotCShWUEFUSCwgc3JjZGlyLCBDQywgTElCUywgT0JKUyBkZXBlbmRlbmNpZXMpOiBVc2UgQC1zdWJzdGl0dXRpb25zCi0JZnJvbSBjb25maWd1cmUuCi0JKExJTktFRF9IRUFERVJTKTogRGVsZXRlZCBhLm91dC5nbnUuaCwgYS5vdXQuaCwgYW5kIGhvc3QuaC4KLQkoY29uZmlnLnN0YXR1cywgY29uZmlndXJlKTogUmV3cml0ZSBydWxlcy4KLQkoY29uZmlnLXN0YW1wKTogRGVwZW5kIG9uIGNvbmYuICBTa2lwIHZhcmlhYmxlcyB0aGF0IGNvbmZpZ3VyZSBpcwotCW5vdyBzdWJzdGl0dXRpbmcgaXRzZWxmLgotCSgqLm8gZGVwZW5kZW5jaWVzKTogRGVsZXRlZCBob3N0LmguCi0JKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogRG9uJ3QgZGVsZXRlIGhvc3QuaC4KLQkqIGFzLmM6IERvbid0IGluY2x1ZGUgc3RkaW8uaCwgc3RyaW5nLmgsIHN5cy90eXBlcy5oLiAgSW5jbHVkZQotCXNpZ25hbC5oIGFmdGVyIGFzLmguCi0JKiBhcy5oOiBJbmNsdWRlIGFsbG9jYS1jb25mLmggZmlyc3QuICBJbmNsdWRlIGN0eXBlLmgsIHN0cmluZy5oLAotCXN0cmluZ3MuaCwgc3RkbGliLmgsIHVuaXN0ZC5oLCBzeXMvdHlwZXMuaCwgZm9wZW4tYmluLmgsCi0JZm9wZW4tc2FtZS5oLCBhcyBzdWdnZXN0ZWQgYnkgYXV0b2NvbmYgdGVzdCByZXN1bHRzLgotCVtCUk9LRU5fQVNTRVJUXTogRG9uJ3QgaW5jbHVkZSBhc3NlcnQuaC4KLQkoc3RyZHVwKTogRGVjbGFyZS4KLQkodm9sYXRpbGUsIGNvbnN0KTogRGVmaW5lIGlmIG5vdCBfX1NURENfXyBhbmQgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkobWFsbG9jLCByZWFsbG9jKSBbTkVFRF9NQUxMT0NfREVDTEFSQVRJT05dOiBEZWNsYXJlLgotCShmcmVlKSBbTkVFRF9GUkVFX0RFQ0xBUkFUSU9OXTogRGVjbGFyZS4KLQkqIGdhc3AuYzogSW5jbHVkZSBjb25maWcuaCwgc3RkbGliLmggKGlmIEhBVkVfU1RETElCX0gpLiAgRG9uJ3QKLQlpbmNsdWRlIGhvc3QuaC4KLQkobWFsbG9jKSBbTkVFRF9NQUxMT0NfREVDTEFSQVRJT05dOiBEZWNsYXJlLgotCSogbWVzc2FnZXMuYzogSW5jbHVkZSBhcy5oIGZpcnN0LiAgSW5jbHVkZSBlcnJuby5oIG9ubHkgaWYKLQlIQVZFX0VSUk5PX0guICBJZiBIQVZFX1ZBUkFSR1NfSCBhbmQgbm90IF9fU1REQ19fLCB1bmRlZmluZQotCUhBVkVfU1REQVJHX0guICBTZXQgTk9fU1REQVJHIGFuZCBOT19WQVJBUkdTIGFzIGFwcHJvcHJpYXRlLgotCSogZG9jL01ha2VmaWxlLmluIChzcmNkaXIsIElOU1RBTEwsIElOU1RBTExfUFJPR1JBTSwKLQlJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYgQC1zdWJzdGl0dXRpb25zLgotCi0JKiBpbnB1dC1maWxlLmM6IERvbid0IGluY2x1ZGUgYXNzZXJ0LmggaGVyZSwgJ2NhdXNlIGFzLmggYWxyZWFkeQotCWluY2x1ZGVzIGl0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogQWRkZWQgdmFyaW91cyBwcm90b3R5cGVzIGZvciBzdGF0aWMKLQlmdW5jdGlvbnMuCi0JKGluX3JhbmdlKTogTmV3IGZ1bmN0aW9uLCB0ZXN0cyB3aGV0aGVyIGEgdmFsdWUgY2FuIGZpdCBpbiBhbgotCU4tYml0IGZpZWxkLgotCShidWlsZF9tZW0sIGJ1aWxkX29wZXJhdGVfbik6IE5ldyBmdW5jdGlvbnMgZm9yIGNvbnN0cnVjdGluZwotCW9wY29kZSB2YWx1ZXMuCi0JKGVtaXRfc2xsX24sIGVtaXRfbGRhaF9udW0sIGVtaXRfYWRkcV9yLCBlbWl0X2xkYV9uKTogTmV3Ci0JZnVuY3Rpb25zIGZvciBlbWl0dGluZyBzaW5nbGUgaW5zdHJ1Y3Rpb25zLCBubyBsb25nZXIgcmVxdWlyaW5nIGEKLQlyZWN1cnNpdmUgY2FsbCB0byBtZF9hc3NlbWJsZS4KLQkoZW1pdF9hZGQ2NCk6IE5ldyBmdW5jdGlvbiBmb3IgZXhwYW5kaW5nIGEgUkVHOj1SRUcrQ09OU1QKLQlvcGVyYXRpb24gaW50byBvbmUgb3IgbW9yZSBpbnN0cnVjdGlvbnMsIHRvIGhhbmRsZSB3aWRlIGNvbnN0YW50cy4KLQkoY2xlYXJfaW5zbik6IE5ldyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBGaWxsIGl0IGluIHdpdGggemVyb3MgYW5kIEJGRF9SRUxPQ19OT05FIHZhbHVlcy4KLQkoYWxwaGFfaXApOiBVc2UgaXQgdG8gaW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZSBpbnNucy4KLQkoYWxwaGFfaXAsIGxhYmVsICJpbW1lZGlhdGUiIGFuZCBjYXNlcyAnUCcsICdHJyk6IFVzZSBlbWl0X2FkZDY0Ci0JZm9yIGNhbGN1bGF0aW9ucy4KLQotRnJpIEF1ZyAyNiAxNDo0NjoxNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBSZXZlcnNlIHN0aWxsLXdyb25nIHRlc3Qgb2YKLQlFTUlUX1NFQ1RJT05fU1lNQk9MUy4KLQotCSogd3JpdGUuYyAoQkZEX0ZBU1RfU0VDVElPTl9GSUxMKTogQWx3YXlzIGRlZmluZS4KLQkod3JpdGVfY29udGVudHMpOiBJZiBmaWxsX3NpemUgaXMgMSwgdXNlIG1lbXNldCBpbnN0ZWFkIG9mIGxvb3BpbmcKLQljYWxsaW5nIG1lbWNweS4KLQotV2VkIEF1ZyAyNCAxMjo0NjowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMKTogRGVmaW5lIGFzIDAsIGZvciBjb21wYXRpYmlsaXR5Ci0Jd2l0aCBuYXRpdmUgTUlQUyBhc3NlbWJsZXIuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1pcml4Kik6IERvbid0IHNldCBlbXVsYXRpb24uCi0JKiBjb25maWcvdGUtaXJpeC5oOiBSZW1vdmUuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N5bWJvbF9uZXdfaG9vayk6IERvbid0IGFkZCBhIG5ldyBmaWxlIGlmIHdlCi0JaGF2ZW4ndCBzZWVuIGFueSBpbnB1dCBmaWxlcyB5ZXQuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYmVnaW4pOiBKdXN0IGNhbGwgc3ltYm9sX2NyZWF0ZSwgcmF0aGVyCi0JdGhhbiBjYWxsaW5nIHN5bWJvbF9uZXcgYW5kIHRoZW4gcmVtb3ZpbmcgdGhlIHN5bWJvbCBmcm9tIHRoZQotCWxpc3QuCi0KLQkqIGFzLmMgKG1haW4pOiBNb3ZlIGEgaW5zaWRlIHRoZSAjaWYgMCBibG9jayB3aGljaCB1c2VzIGl0LgotCSogZWNvZmYuYyAoY3VycmVudF9zdGFic19maWxlbmFtZSk6IE1ha2UgY29uc3QuCi0JKiBmcmFncy5oIChmcmFnX2FsaWduX3BhdHRlcm4pOiBEZWNsYXJlLgotCSogZ2FzcC5jIChuZXdfZmlsZSk6IENhc3QgaXNwIHRvIGxvbmcsIGFuZCB1c2UgJWxkIHRvIHByaW50IGl0LgotCSogY29uZmlnL3RjLWFscGhhLmggKG1kX29wZXJhbmQpOiBBZGQgY2FzdCB0byB2b2lkLgotCShhbHBoYV9kb19hbGlnbik6IERlY2xhcmUgYXJndW1lbnQgdHlwZXMuCi0JKHRjX2dldF9yZWdpc3Rlcik6IERlY2xhcmUuCi0JKGFscGhhX2Zyb2JfZWNvZmZfZGF0YSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtYWxwaGEuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKHNfbWFzayk6IERvbid0IGRlY2xhcmU7IGRvZXMgbm90IGV4aXN0LgotCShsaW5lX2NvbW1lbnRfY2hhcnMpOiBSZW1vdmUgLyogZnJvbSBkZXNjcmlwdGl2ZSBjb21tZW50LgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHJlZy4KLQkodGNfZ2VuX3JlbG9jKTogRG9uJ3QgYm90aGVyIHRvIGNvbXBhcmUgdW5zaWduZWQgdG8gemVyby4KLQkoc19iYXNlKTogQ29ycmVjdCB3YXJuaW5nIHRvIGFjdHVhbGx5IHByaW50IHJlZ2lzdGVyIG51bWJlci4KLQkobWRfYmVnaW4pOiBSZW1vdmUgdW51c2VkIGxvY2FscyByZXR2YWwsIGxvc2UsIGFuZCBpLgotCShhbHBoYV9maXhfYWRqdXN0YWJsZSk6IE1vdmUgZGVmYXVsdCBjYXNlIGluc2lkZSBzd2l0Y2ggdG8gYXZvaWQKLQl3YXJuaW5nLgotCShsb2FkX3N5bWJvbF9hZGRyZXNzKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgcmVsb2NfYWRkciwgcCwgc3ltLAotCWFuZCBhZGRlbmQuCi0JKGVtaXRfYnl0ZV9tYW5pcF9yKTogRGVjbGFyZSB0eXBlcyBmb3IgYWxsIGFyZ3VtZW50cy4KLQkoZW1pdF9leHRyYWN0X3IsIGVtaXRfaW5zZXJ0X3IsIGVtaXRfbWFza19yKTogTGlrZXdpc2UuCi0JKGVtaXRfc2lnbl9leHRlbmQsIGVtaXRfYmlzX3IsIHNfcHJvYyk6IExpa2V3aXNlLgotCShhbHBoYV9pcCk6IFVzZSBzcHJpbnRfdmFsdWUgdG8gcHJpbnQgb2Zmc2V0VCB2YWx1ZS4gIFJlbW92ZQotCXVudXNlZCBsb2NhbCBzaXplLiAgUmVtb3ZlIHVudXNlZCBsYWJlbCBnZXRfbWFjcm8uCi0JKGFscGhhX2RvX2FsaWduKTogTWFrZSBmaWxsIGNvbnN0LgotCShtZF9hcHBseV9maXgpOiBSZW1vdmUgdW51c2VkIGxhYmVsIGNoZWNrX3pvdi4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaTU4NiBhcyBhIHN5bm9ueW0gZm9yIGlbMzRdODYuCi0KLVR1ZSBBdWcgMjMgMTI6MzI6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19saW5lX25ldyk6IENoYW5nZSBsaW5lX251bWJlciBhcmd1bWVudCBmcm9tCi0JdW5zaWduZWQgc2hvcnQgdG8gaW50IHNvIHRoYXQgdGhlIHR5cGUgaW4gdGhlIHByb3RvdHlwZSBtYXRjaGVzCi0JdGhlIHByb21vdGVkIHR5cGUgaW4gdGhlIGRlZmluaXRpb24uCi0JKHN0YWNrX2RlbGV0ZSk6IENvbW1lbnQgb3V0OyBub3QgdXNlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBEZWNsYXJlIGlmIG5vdAotCUJGRF9BU1NFTUJMRVIsIG5vdCBpZiBCRkRfQVNTRU1CTEVSLiAgRGVjbGFyZSBhcmd1bWVudCB0eXBlLgotCSogY29uZmlnL3RjLW02OGsuaCAodGNfY29mZl9zaXplbWFjaGRlcCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBBZGQgaWdub3JlZAotCWFyZ3VtZW50LgotCi1UdWUgQXVnIDE2IDAxOjQ4OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFVuZG8gbGFzdCBjaGFuZ2UuICBTZXQgc3lfZnJhZyBmb3IKLQl0aGUgY29tbW9uIHN5bWJvbCB0byB0aGUgemVybyBhZGRyZXNzIGZyYWcgKHRoZSBjb3JyZWN0IGZpeCkuCi0KLVR1ZSBBdWcgMTYgMDE6NDg6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9jb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogVW5kbyBsYXN0IGNoYW5nZS4gIFNldCBzeV9mcmFnIGZvcgotCXRoZSBjb21tb24gc3ltYm9sIHRvIHRoZSB6ZXJvIGFkZHJlc3MgZnJhZyAodGhlIGNvcnJlY3QgZml4KS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFNldCBzeV9yZXNvbHZlZCBmb3IgdGhlIGNvbW1vbgotCXN5bWJvbC4KLQotRnJpIEF1ZyAxMiAxNzo1MTo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRHJvcCAiZWwiIGZyb20gdGhlIGVuZCBvZgotCVRBUkdFVF9DUFUuICBDaGVjayBmb3IgbWlwczY0b3Jpb24uCi0KLVR1ZSBBdWcgIDkgMTk6NDM6NDUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIHBwYy0qLW5ldHdhcmUuCi0JKiBjb25maWcvdGUtcHBjbncuaDogIE5ldyBmaWxlIHRvIHN1cHBvcnQgUG93ZXItUEMvTmV0d2FyZQotCWNvbmZpZ3VyYXRpb25zLiAgQ3VycmVudGx5LCBpdCBqdXN0IGVuYWJsZXMgdGhlIHVzZSBvZiBiYWNrc2xhc2gKLQllc2NhcGVzIGluIHN0cmluZyBkaXJlY3RpdmVzLgotCi1UdWUgQXVnICA5IDExOjEyOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfc3RhYngpOiBDYWxsIGV4cHJlc3Npb24gZGlyZWN0bHksIHJhdGhlcgotCXRoYW4gdmlhIHBzZXVkb19zZXQuICBJZiBleHByZXNzaW9uIGlzIGEgc3ltYm9sLCBtb3ZlIHN0YWIgc3ltYm9sCi0JdG8ganVzdCBhZnRlciBzeW1ib2wgZnJvbSBleHByZXNzaW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9wcm9jcyk6IERvbid0IGZvcmNlIGFkciBvZiBmaXJzdCBmZHIgdG8gYmUKLQl6ZXJvLiAgVW5kb2VzIGNoYW5nZSBvZiBKdW5lIDQsIDE5OTMuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCAtbWNwdT00NDAwLCA0NjAwLCBhbmQKLQlvcmlvbi4KLQotTW9uIEF1ZyAgOCAxNjoyODowOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBSZW1vdmUgRk9QRU5fV0IgcGF0Y2ggb2YgQXVnIDYuCi0JKiBjb25maWd1cmUuaW46IENvbmZpZ3VyZSBmb3IgaG8tZ28zMiBjb3JyZWN0bHkuCi0JKiBjb25maWcvaG8tZ28zMi5oOiBGaXggY29weXJpZ2h0LgotCi1Nb24gQXVnICA4IDExOjU5OjUxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogRGVsZXRlIHJlZHVuZGFudAotCXVwcGVyLWNhc2UgdmVyc2lvbnMgb2YgdGhlIHBzZXVkby1vcHMuCi0KLU1vbiBBdWcgIDggMTM6NDI6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogSWYgd2UgYXJlIGdvaW5nIHRvIGdlbmVyYXRlIGEKLQlub24gUEMgcmVsYXRpdmUgcmVsb2MsIGRvbid0IHB1dCB0aGUgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZS4KLQotU2F0IEF1ZyAgNiAwMToxNTowMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBJZiBGT1BFTl9XQiBpcyBub3QgZGVmaW5lZCwgZG8gdGhlIHJpZ2h0IHRoaW5nIGluIGEgZ28zMgotCWVudmlyb25tZW50LgotCi1Nb24gSnVsIDExIDExOjM0OjUyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChwaW50KTogTmV3IGZ1bmN0aW9uIGZvciBoYW5kbGluZyB2YXJ5aW5nCi0Jc2l6ZSBvZiBpbnQgcHNldWRvIG9wLgotCSogZG9jL2FzLnRleGluZm86IEZpeCB0eXBvIGRlc2NyaWJpbmcgLmg4MzAwaCBwc2VkdW9wLgotCi1Nb24gQXVnICAxIDAyOjQwOjQzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjcmVhdGVfbmV3X3NwYWNlKTogSW5pdGlhbGl6ZSBzZF9zdWJzcGFjZXMKLQlmaWVsZCBpbiB0aGUgc3BhY2UgY2hhaW4uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20KLQlocHBhX2dlbl9yZWxvY190eXBlLgotCi1UaHUgSnVsIDI4IDE1OjQ1OjM3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IENoZWNrIG1vcmUgY2FyZWZ1bGx5IGZvcgotCWNvbmZsaWN0aW5nIGFyY2hpdGVjdHVyZXMuCi0JKG1kX3BhcnNlX29wdGlvbikgW05PX1Y5XTogQ29tcGxhaW4gaWYgdjkgd2FzIHNlbGVjdGVkLgotCShtZF9zaG93X3VzYWdlKTogRGVyaXZlIGFyY2hpdGVjdHVyZSBsaXN0IGluIHVzYWdlIG1lc3NhZ2UgZnJvbQotCWFyY2hpdGVjdHVyZV9wbmFtZSBhcnJheS4KLQkoY3lwcmVzcyk6IE1hY3JvIGRlbGV0ZWQuCi0JKG9wX2hhc2gpOiBEb24ndCBpbml0aWFsaXplLgotCShzX2NvbW1vbik6IFVzZSBiZmRfdW5kX3NlY3Rpb25fcHRyIGluc3RlYWQgb2YgYmZkX3VuZF9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoQlNSKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19pcCk6IFVzZSBpdCBmb3IgcmlnaHQtc2hpZnQgb3BlcmF0aW9ucyBvZiAzMiBiaXRzIG9yIG1vcmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEltcGxlbWVudCBuZXcgb3BlcmFuZCB0eXBlICd4Jy4KLQotVHVlIEp1bCAyNiAxODoyMToyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogTW92ZWQgY29tbW9uIGluY2x1ZGVzIGFuZCBUQVJHRVRfRk9STUFUCi0JZGVmaW5pdGlvbnMgdG9nZXRoZXIuCi0JKFdPUktJTkdfRE9UX1dPUkQsIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQsCi0JT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIsIEJGRF9IRUFERVJTLCBCRkQpIFshQkZEX0FTU0VNQkxFUl06Ci0JTW92ZWQgdGhlc2UgZGVmaW5pdGlvbnMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBiZWZvcmUgdGhlCi0JaW5jbHVkZXMuCi0JKFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMsIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTKTogQWx3YXlzCi0JZGVmaW5lIHRoZXNlLgotCShTX0dFVF9aRVJPRVMpOiBEZWxldGVkLgotCShTX1NFVF9aRVJPRVMpOiBNb3ZlZCB0byBvYmotY29mZi5jLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfKiBwc3VlZG8tb3AgZm5zKTogRGVsZXRlZAotCWZvcndhcmQgZGVjbGFyYXRpb25zLgotCShvYmpfcHNldWRvX3RhYmxlKTogTW92ZWQgdG8gb25lIHZlcnNpb24gZW5kIG9mIGZpbGUsCi0JY29uZGl0aW9uYWxpemVkIGludGVybmFsbHkuCi0JKHN0YWNrIHR5cGVkZWYsIHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wLAotCXRhZ19oYXNoLCB0YWdfaW5pdCwgdGFnX2luc2VydCwgdGFnX2ZpbmQsIHRhZ19maW5kX29yX21ha2UpOiBNb3ZlZAotCXRvIG9uZSBjb21iaW5lZCB2ZXJzaW9uIGF0IHRvcCBvZiBmaWxlLCB1bmNvbmRpdGlvbmFsLiAgRGVsZXRlZAotCWZvcndhcmQgZGVjbGFyYXRpb25zLgotCShzX2dldF9uYW1lKTogTW92ZWQgb25lIGNvcHkgb2YgZGVjbGFyYXRpb25zIHRvIHN0YXJ0IG9mIGZpbGUuCi0JKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOiBEaXR0by4gIERvbid0IGluaXRpYWxpemUuCi0JKFNfU0VUX1pFUk9FUyk6IE1vdmVkIGhlcmUgZnJvbSBvYmotY29mZi5oLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IElmIFRDX0NPRkZfU0VUX01BQ0hJTkUgaXMgZGVmaW5lZCwgY2FsbCBpdCBvbgotCXRoZSBmaWxlIGhlYWRlcnMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzZWdfaW5mb19vZmZfYnlfNCk6IE5vdyBjb25zdCBhbmQgc3RhdGljLgotCShTRUdfSU5GT19GUk9NX1NFR19OVU1CRVIpOiBVbnVzZWQgbWFjcm8gZGVsZXRlZC4KLQkocHJldmlvdXNfZmlsZV9zeW1ib2wsIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9leHRlcm5QLAotCXN5bWJvbF9leHRlcm5fbGFzdFAsIGxhc3RfZnVuY3Rpb25QKSBbIUJGRF9BU1NFTUJMRVJdOiBEb24ndAotCWJvdGhlciBleHBsaWNpdGx5IGluaXRpYWxpemluZyB0byB6ZXJvIHZhbHVlLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCkgW1RDX0k5NjBdOiBVc2UgU0ZfR0VUX0JBTE5BTUUKLQlhbmQgU0ZfR0VUX0NBTExOQU1FIGluc3RlYWQgb2YgdGhlIFRDX1NfSVNfIHZlcnNpb25zLgotCi0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19DT0ZGX1NFVF9NQUNISU5FKTogTmV3IG1hY3JvLiAgQ2FsbHMKLQl0Y19oZWFkZXJzX2hvb2suCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHRhcmdfaGFzX2ljbGFzcyk6IFVzZSBJX0NYIHwgSV9DWDIgd2hlcmUgSV9DWAotCXdhcyB1c2VkIHByZXZpb3VzbHkuCi0JKHRjX2hlYWRlcnNfaG9vayk6IElmIElfQ1gyIGlzIGZvdW5kLCBzZXQgZmxhZ3MgdG8gRl9JOTYwQ0EuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHBvX2hhc2gpOiBEZWNsYXJhdGlvbiBkZWxldGVkLgotCShuZXh0X29iamVjdF9maWxlX2NoYXJQKTogRGl0dG8uCi0JKHJlZ25hbWVzLCBhcmVncywgY29qKTogTm93IGNvbnN0LgotCShwYXJzZV9tZW1vcCk6IFN0YXRpYyBhcnJheSBkZWZfc2NhbGUgbm93IGNvbnN0LgotCShtZF9iZWdpbik6IENhc3QgYXdheSBjb25zdCB3aGVuIHBhc3NpbmcgaGFzaCByb3V0aW5lcyBhZGRyZXNzZXMKLQlvZiB2YWx1ZXMgaW4gcmVnbmFtZXMgb3IgYXJlZ3MuCi0JKG1kX2xvbmdvcHRzKTogQWRkZWQgImxpbmstcmVsYXgiIGFuZCAibm8tcmVsYXgiIGh5cGhlbmF0ZWQgZm9ybXMuCi0JQ29udGludWUgdG8gYWNjZXB0IG9uZS13b3JkIGZvcm1zLgotCShzdHJ1Y3QgdGFiZW50cnksIGFyY2hfdGFiKTogTW92ZWQgdG8gdG9wIGxldmVsIGZyb20gaW5zaWRlCi0JbWRfcGFyc2Vfb3B0aW9uLiAgTm93IGNvbnN0LgotCShtZF9zaG93X3VzYWdlKTogVXNlIGFyY2hfdGFiIHRvIGdlbmVyYXRlIHVzYWdlIG1lc3NhZ2UuICBQcmludAotCWh5cGhlbmF0ZWQgZm9ybXMgb2YgcmVsYXggb3B0aW9ucy4KLQotCSogY29uZmlnL3RjLWk5NjAuaCAoREVGSU5FX0k5NjBfQU9VVCwgVENfU19JU18qLCBUQ19TXypfU1lTUFJPQywKLQlUQ19TX0ZPUkNFX1RPXyopOiBNb3ZlZCBmcm9tIGhlcmUuLi4KLQkqIGNvbmZpZy90Yy1pOTYwLmM6IC4uLiB0byBoZXJlLiAgQ2hhbmdlZCBERUZJTkVfSTk2MF9BT1VUIHN0dWZmCi0JdG8gdGVzdCBPQkpfQU9VVCBhbmQgT0JKX0JPVVQgZGlyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmggKENUUkwsIENPQlIsIENPSiwgUkVHLCBNRU0qLCBGQlJBLCBDQUxMSiwKLQlNMS1NMywgUkVHX09QQywgUl8qLCBTRlIsIExJVCwgRlAsIE9QLCBSLCBSUywgUkwsIFJTTCwgRiwKLQl7UixGfXssTH17Miw0fSwgTSwgU0ZSX09LLCBMSVRfT0ssIEZQX09LLCBSRUdfQUxJR04sIE1FTU9QLCBJXyopOgotCU1hY3JvcyBkZWxldGVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChBUkNIX0pYKTogRGVmaW5lLgotCShhcmNoX3RhYik6IEluY2x1ZGUgSlguCi0JKHRhcmdfaGFzX3NmciwgdGFyZ19oYXNfaWNsYXNzKTogSGFuZGxlIEpYLgotCSh0Y19oZWFkZXJzX2hvb2spOiBTZXQgZmxhZ3MgdG8gRl9JOTYwSlggZm9yIGk5NjBKWC4KLQotRnJpIEp1bCAxNSAxNTozNjo1MSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogSGFkIGxhc3QgY2hhbmdlIGJhY2t3YXJkcy4KLQotVGh1IEp1bCAxNCAxMzoyMTowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvYXRvZi1uczMyay5jOiBEZWxldGVkLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBVc2UKLQliZmRfaW5kX3NlY3Rpb25fcHRyIGFuZCBiZmRfdW5kX3NlY3Rpb25fcHRyLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENvbXBhcmUgc2VnVCB2YWx1ZXMgZGlyZWN0bHksCi0Jd2l0aG91dCBjYXN0aW5nIHRvIGludCBmaXJzdC4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2JlZ2luKTogUmV0dXJuIHZhbHVlIGZyb20gaGFzaF9pbnNlcnQKLQlzaG91bGQgYmUgcG9pbnRlciB0byBjb25zdC4gIERvbid0IGNhbGwgZXhpdCBleHBsaWNpdGx5IGFmdGVyCi0JY2FsbGluZyBhc19mYXRhbDsgaXQgd29uJ3QgcmV0dXJuLgotCShjb252ZXJ0X2lpZik6IE1ha2UgbG9jYWwgdmFyaWFibGUgaiBiZSBwb2ludGVyIHRvIGJpdF9maXhTLCBzaW5jZQotCXRoYXQncyBob3cgaXQncyB1c2VkLgotCShlbmNvZGVfb3BlcmFuZCwgY2FzZSAnYicpOiBJZ25vcmUgc3ByaW50ZiByZXR1cm4gdmFsdWUuICBEb24ndCB0cnkKLQljb252ZXJ0aW5nIGZyZWVwdHIgdG8gaW50IGFuZCBiYWNrLgotCi0JTWVyZ2VkIGluIE5TMzJLIHN1cHBvcnQgdXBkYXRlIGZyb20gSWFuIERhbGwgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSk6Ci0KLQkqIGNvbmZpZy90ZS1wYzUzMm1hY2guaDogTmV3IGZpbGUuIHBjNTMyLW1hY2ggdGFyZ2V0IGVtdWxhdGlvbi4KLQotCSogY29uZmlnL3RlLW5ldGJzZDUzMi5oOiBOZXcgZmlsZS4gTmV0YnNkNTMyIHRhcmdldCBlbXVsYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgZGVmaW5pdGlvbiBvZiBOT1BfT1BDT0RFLgotCi0JKiBjb25maWcvdGMtbnMzMmsuaDogQWRkIHByb3RvdHlwZSBmb3IgZml4X25ld19uczMya19leHAuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgQkZEX0FTU0VNQkxFUiBzdXBwb3J0LgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAodGNfZ2VuX3JlbG9jKTogTmV3IGZ1bmN0aW9uIGZvciBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZml4X25ld19uczMya19leHApOiBHZXQgcmVsb2MgdHlwZQotCWRpZmZlcmVudGx5IGZvciBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBHZXQgcmVsb2MKLQl0eXBlIGRpZmZlcmVudGx5IGZvciBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfY3JlYXRlX2xvbmdfanVtcCk6IFNpemUgb2Ygb3Bjb2RlIGlzIG9uZQotCW5vdCAyLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfY29udmVydF9mcmFnKTogQ29kZSBmb3IgdGhlIEJGRF9BU1NFTUJMRVIKLQljYXNlLiBBbHNvIHVzZSBzbWFydCBtZF9wY3JlbF9hZGp1c3QgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9hcHBseV9maXgpOiBDb2RlIGZvciB0aGUgQkZEX0FTU0VNQkxFUgotCWNhc2UuIEFsc28gdXNlIHNtYXJ0IG1kX2ZpeF9wY3JlbF9hZGp1c3QgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9maXhfcGNyZWxfYWRqdXN0KTogTmV3IGZ1bmN0aW9uIHdoaWNoIGNhbgotCWZpbmQgb2Zmc2V0IGZyb20gb3Bjb2RlIHRvIG9wZXJhbmQgZXZlbiBpZiBpbiBhbm90aGVyIGZyYWcKLQlhbmQgaW4gdGhlIHByZXNlbmNlIG9mIHJlbGF4aW5nLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfcGNyZWxfYWRqdXN0KTogTmV3IGZ1bmN0aW9uIHdoaWNoIGNhbgotCWZpbmQgb2Zmc2V0IGZyb20gb3Bjb2RlIHRvIG9wZXJhbmQgZXZlbiBpZiBpbiBhbm90aGVyIGZyYWcKLQlhbmQgaW4gdGhlIHByZXNlbmNlIG9mIHJlbGF4aW5nLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfbnVtYmVyX3RvX2Rpc3ApOiBDaGVjayByYW5nZXMgcHJvcGVybHkuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9hdG9mKTogdXNlIGF0b2ZfaWVlZSBpbnN0ZWFkIG9mIHNwZWNpYWwKLQlhdG9mX25zMzJrLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAocmVsb2MpOiBOZXcgKHN0YXRpYykgZnVuY3Rpb24gZm9yCi0JQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnZlcnRfaWlmKTogTW9yZSBjb3JyZWN0IHBjIHJlbGF0aXZlIGNvZGUuCi0JbWRfcmVsYXggbXVzdCBiZSBhYmxlIHRvIGZpbmQgb3Bjb2RlIGFkZHJlc3MgZXZlbiBpZiBpbiBhbm90aGVyIGZyYWcuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBNb3JlIGV4dGVuc2l2ZSBjb21tZW50cy4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGVuY29kZV9vcGVyYW5kKTogU3VwcG9ydCBuZXcgb3BlcmFuZCBjbGFzc2VzIEkKLQlhbmQgWi4gRHJvcCBRLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZml4X25ld19uczMya19leHApOiBuZXcgZnVuY3Rpb24gYW5kCi0JY29ycmVzcG9uZGluZyBwcm90b3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBtYWtlIDMyNTMyIGRlZmF1bHQgbWFjaGluZSBpbnN0ZWFkIG9mIDMyMDMyLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYzogaW5jbHVkZSBvcGNvZGUvbnMzMmsuaCBhZnRlciBhcy5oCi0KLQkqIGFvdXRfZ251Lmg6IHJfZGlzcCBuZWVkcyB0byBiZSAyIGJpdHMgZm9yIFRDX05TMzJLCi0KLQkqIHdyaXRlLmg6IGZ4X2ltX2Rpc3AgbmVlZHMgdG8gYmUgMiBiaXRzIGJpZyBmb3IgVENfTlMzMksKLQotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IFVzZSBUQ19QQ1JFTF9BREpVU1QgbWFjcm8gKGlmIGRlZmluZWQpCi0JaW5zdGVhZCBvZiBhZGRpbmcgcGNyZWxfYWRqdXN0LgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEFkanVzdCB0b19hZGRyIGZvciB0aGUKLQlCUk9LRU5fRE9UX1dPUkQgZmVhdHVyZSBmb3IgdGhlIEJGRF9BU1NFTUJMRVIgY2FzZS4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgVENfQ09OU19GSVhfTkVXIGlmIGl0IGlzIGRlZmluZWQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogQWRkIGNvZGUgKGN1cnJlbnRseSBpZgotCUJGRF9GQVNUX1NFQ1RJT05fRklMTCBpcyBkZWZpbmVkKSB0byBtYWtlIGxhcmdlIGZpbGxzIGEgbG90IGZhc3Rlci4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgbnMzMmsgZnJvbSBzcGVjaWFsIEZQIGxpc3QuIEFsbCB0aGUgbnMzMmsKLQlzZXJpZXMgdXNlIGllZWUgZmxvYXQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG5zMzJrLXBjNTMyLW1hY2ggYW5kIG5zMzJrLXBjNTMyLW5ldGJzZCB0YXJnZXRzCi0KLQkqIGFzLmg6IGluY2x1ZGUgZXhwci5oIGJlZm9yZSB0YXJnLWVudi5oLiBTb21lIHRhcmdldCBkZXBlbmRlbnQgZmlsZQotCXdhbnQgdG8gdXNlIGV4cHIgc3RydWN0dXJlcy4KLQotV2VkIEp1bCAxMyAxNDo0OTowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDaGFuZ2UgcnAgdG8gYmUgYSBjb25zdCBwb2ludGVyLgotCShtZF9wYXJzZV9vcHRpb24pOiBDbGVhciBjcHUgZmllbGQgb2YgY3VycmVudF9hcmNoaXRlY3R1cmUgYmVmb3JlCi0Jc2V0dGluZyBhIG5ldyBjcHUgdHlwZS4gIENsZWFyIG5vXzY4ODgxIGZvciBtNjg4ODEgb3IgbTY4ODgyLgotCUNsZWFyIG5vXzY4ODUxIGZvciBtNjg4NTEuCi0KLVR1ZSBKdWwgMTIgMjE6Mjc6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLXN5c3YuaCAocmVhbGxvYyk6IERlY2xhcmUuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NyZWF0ZSk6IE5ldyBmdW5jdGlvbiwgbW9zdCBvZiB0aGUgZ3V0cyBvZiB0aGUKLQlvbGQgc3ltYm9sX25ldyBmdW5jdGlvbi4KLQkoc3ltYm9sX25ldyk6IE5vdyBqdXN0IGNoZWNrcyBzeW1ib2xfdGFibGVfZnJvemVuLCBjYWxscwotCXN5bWJvbF9jcmVhdGUsIGFuZCBlbnRlcnMgdGhlIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogSWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMgaXMgbm90IHRydWUsCi0JYW5kIHRoZSBzeW1ib2wgdGFibGUgaXMgZnJvemVuLCBjYWxsIHN5bWJvbF9jcmVhdGUgaW5zdGVhZCBvZgotCXN5bWJvbF9uZXcuCi0JKiBzeW1ib2xzLmggKHN5bWJvbF9jcmVhdGUsIHN5bWJvbF90YWJsZV9mcm96ZW4pOiBEZWNsYXJlLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzKTogQWx3YXlzIGEgZnVuY3Rpb24gbm93LgotCSogc3RydWMtc3ltYm9sLmggKHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzKTogRGVsZXRlZCBtYWNybwotCXZlcnNpb24uCi0KLQkqIHN5bWJvbHMuYyAoZGVidWdfdmVyaWZ5X3N5bWNoYWluKTogTmV3IG1hY3JvLCBkZWZpbmVkIHRvIGJlCi0JdmVyaWZ5X3N5bWJvbF9jaGFpbiBvciBhIGNhc3QgdG8gdm9pZCwgZGVwZW5kaW5nIG9uIERFQlVHX1NZTVMuCi0JKG1hbnkgZnVuY3Rpb25zKTogSW52b2tlIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiB1bmNvbmRpdGlvbmFsbHkuCi0KLVR1ZSBKdWwgMTIgMTI6MDY6NDIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQHgxLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaDogY2hhbmdlIGNhbGxpbmcgaW50ZXJmYWNlIG9mCi0JT0JKX0dFTkVSQVRFX0FTTV9MSU5FX1NUQUIuCi0JKiBjb25maWcvb2JqLWVsZi5oOiBkaXR0by4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogZGl0dG8uCi0JKiBlY29mZi5oOiBjaGFuZ2UgY2FsbGluZyBpbnRlcmZhY2Ugb2YKLQllY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiLgotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiByZWNvcmQgb2YgZmlsZW5hbWUgdG8gaGFuZGxlIGNhc2Ugb2YgaW5jbHVkZQotCWZpbGVzLCBhbHNvIGNoYW5nZSBkZWZhdWx0IGJ1aWx0LWluIHR5cGUgZnJvbSBpbnQgdG8gdm9pZCBmb3IKLQlhc20gZmlsZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBoYW5kbGUgY2FzZSBvZiBpbmNsdWRlCi0JZmlsZXMuCi0KLU1vbiBKdWwgMTEgMTc6MjA6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEluIGNhc2UgTV9MQV9BQiwgU1ZSNF9QSUMsIGxhcmdlCi0JY29uc3RhbnQsIGFuZCBjYXNlIGxkZF9zdGQsIHNldCBtaXBzX29wdGltaXplIHRvIDIgdGVtcG9yYXJpbHkgdG8KLQlhdm9pZCBpbnNlcnRpbmcgYW4gdW5leHBlY3RlZCBub3AgaW5zdHJ1Y3Rpb24uCi0KLVNhdCBKdWwgIDkgMDA6MDU6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9saW5lbm8pOiBIYW5kbGUgY291bnQgY29ycmVjdGx5IGZvciBsYXN0Ci0JbGluZSBudW1iZXIuCi0KLUZyaSBKdWwgIDggMTU6MjI6MDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChwcm9jZXNzX3BzZXVkb19vcCk6IFBhc3MgcmlnaHQgYXJncyB0byBkbyBkb19haWYuCi0JKGdldF9hbnlfc3RyaW5nKTogTmV3IGFyZyAncHJldGVuZF9xdW90ZScuCi0JKGdldF9hbmRfcHJvY2VzcywgZG9fZm9ybWFscywgbWFjcm9fZXhwYW5kLCBkb19zZGF0YSwKLQlwcm9jZXNzX3BzZXVkb19vcCk6IFVzZSBuZXcgYXJnLgotCi1GcmkgSnVsICA4IDEyOjIzOjQ0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaDogZGVmaW5lIG1hY3JvIE9CSl9HRU5FUkFURV9BU01fTElORV9TVEFCLgotCSogY29uZmlnL29iai1lbGYuaDogZGl0dG8uCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGdlbmVyYXRlIGxpbmUgc3RhYnMgZm9yIGFzbSBmaWxlLgotCSogcmVhZC5oOiBhZGQgZXh0ZXJuIGdlbmVyYXRlX2FzbV9saW5lX3N0YWIuCi0JKiBlY29mZi5oIDogYWRkIHByb3RvdHlwZSBmb3IgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYigpLgotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBpZiB0aGVyZSdzIG5vIGZpbGVuYW1lIHByb3ZpZGVkLCBzZXQgc3dpdGNoCi0JdG8gZ2VuZXJhdGUgbGluZSBzdGFicyBmb3IgLnMgZmlsZS4KLQkqIGVjb2ZmLmMgKGFkZF9wcm9jZWR1cmUpOiBhZGQgc3RhYnMgc3ltYm9sIGZvciAuZW50IGRpcmVjdGl2ZS4KLQkqIGVjb2ZmLmMgKGdlbmVyYXRlX2Vjb2ZmX3N0YWIpOiBjcmVhdGVzIGFuIGFydGlmaWNpYWwgc3RhYnMuCi0JKiBlY29mZi5jIChnZW5lcmF0ZV9hc21fbGluZV9zdGFiKTogZ2VuZXJhdGUgYSBhcnRpZml0aWFsIGxhYmVsCi0JZm9yIGVhY2ggbGluZSBhbmQgZ2VuZXJhdGUgYSBzdGFibiBmb3IgdGhlIGxpbmUuCi0KLVRodSBKdWwgIDcgMTc6MDQ6MDMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChnZXRfYW55X3N0cmluZyk6IENvcGUgd2l0aCBnZXR0aW5nIGEgc3RyaW5nIHdpdGggYW4KLQlhbHRlcm5hdGUgYmFzZSBzcGVjaWZpZXIuCi0JKGRvX2FpZiwgZG9fYWVsc2UpOiBPbmx5IGVuYWJsZSBvdXRwdXQgaWYgZXhwcmVzc2lvbiBpcyB0cnVlIGFuZCBwcmV2aW91cwotCWxldmVsIHdhcyBvbi4KLQkoY2hhcnR5cGVfaW5pdCk6ICBBZGQgQkFTRUJJVCBjaGFydHlwZS4KLQkocHJvY2Vzc19wc2V1ZG9fb3ApOiAgTm90aWNlIG5lc3RlZWQgQUlGcy4KLQotVGh1IEp1bCAgNyAxMjozMDoyMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBoODMwMC5jIChkb19hX2ZpeF9pbW0pOiBDb2RlIGZvciAyIGJpdCByZWxvYyB0eXBlIHVzaW5nIGluIHRyYXBhCi0JaW5zbi4gIChmaXggcHIgNTE2NSwgNTE3NCkKLQotVGh1IEp1bCAgNyAxMTozMTozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoUl9ETFRfUkVMKTogSWYgaXQgaXNuJ3QgZGVmaW5lZCwgdGhlbiBkZWZpbmUKLQl0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZSB0byBhdm9pZCBsb3Npbmcgb24gb2xkIGhwdXggc3lzdGVtcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IFJlamVjdCByZWR1Y3Rpb25zIGZvcgotCXN5bWJvbHMgaW4gRExUIHJlbGF0aXZlIHJlbG9jcy4KLQkodGNfZ2VuX3JlbG9jKTogWmVybyBvdXQgdGhlIGFkZGVuZCBmaWVsZCBmb3IgRExUIHJlbGF0aXZlIHJlbG9jcy4KLQotV2VkIEp1bCAgNiAwMTowNzo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3RjKTogSWYgbm90IE9CSl9DT0ZGLCBmb3JjZSBUT0MgZW50cnkgdG8KLQlhbGlnbiB0byBhIGZvdXIgYnl0ZSBib3VuZGFyeS4KLQotVHVlIEp1bCAgNSAxNTo0MjowOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogSGFuZGxlIDMyLWJpdCBhZGRlbmRzLgotCShncGRpc3BfaGkxNl9ob3d0byk6IE5vdyBwb2ludHMgdG8gY29uc3QuCi0JKGxvYWRfaW5zbl90YWJsZSwgYWxwaGFfaXApOiBGaXggdXNlcyBvZiBjb25zdC4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBVcGRhdGVzIHRvIENPRkYgZGVzY3JpcHRpb24uICBBZGRlZCAiQGVuZAotCWRlZm1hYyIgYXMgbmVlZGVkLCBhbmQgc29tZSBleHRyYSBoZWFkaW5nIGFuZCAiQGJ5ZSIgc28gaXQnbGwKLQlmb3JtYXQgYXMgYSBzZXBhcmF0ZSBkb2N1bWVudC4KLQotVHVlIEp1bCAgNSAxMzo1NDowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfR0VUX0FMSUdOLCBTX1NFVF9BTElHTik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogU2V0IGFsaWdubWVudCBvZiBjb21tb24KLQlzeW1ib2wuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBJZiBPQkpfRUxGLCBzZXQgYWxpZ25tZW50IG9mCi0JY29tbW9uIHN5bWJvbC4KLQotTW9uIEp1bCAgNCAxODoyOTo0MyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaXNfY29tcGxleCk6IE5ldyBtYWNyby4KLQkoY29uc19maXhfbmV3X2hwcGEpOiAiSGFuZGxlIiBjb21wbGV4IGV4cHJlc3Npb25zLgotCi1GcmkgSnVsICAxIDAwOjQ4OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2V0IHNfYWxpZ24gZmllbGQgZnJvbQotCXNlY3Rpb25fYWxpZ25tZW50IGFycmF5LgotCi1UaHUgSnVuIDMwIDE1OjA1OjI4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIGJmZF9jb21fc2VjdGlvbl9wdHIuCi0JKiBhcy5oIChhYnNvbHV0ZV9zZWN0aW9uLCB1bmRlZmluZWRfc2VjdGlvbik6IFVzZSBuZXcgQkZEIG1hY3JvcwotCWJmZF9hYnNfc2VjdGlvbl9wdHIgYW5kIGJmZF91bmRfc2VjdGlvbl9wdHIuCi0KLVRodSBKdW4gMzAgMTQ6MzY6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEZvciBNX0xJX1NTLCBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdAotCWJhc2VkIG9uIGNvbnRlbnRzIG9mIGltbV9leHByIGFuZCBvZmZzZXRfZXhwciwgcmF0aGVyIHRoYW4KLQltaXBzX3BpYy4gIEZvciBNX0xJX0RELCBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdCBiYXNlZCBvbiBzZWdtZW50Ci0JbmFtZSBvZiBvZmZzZXRfZXhwciwgcmF0aGVyIHRoYW4gbWlwc19waWMuCi0JKG1pcHNfaXApOiBJZiBnX3N3aXRjaF92YWx1ZSA8IDQsIHVzZSBpbW1lZGlhdGUgdmFsdWVzIGZvciAnbCcuCi0JSWYgZ19zd2l0Y2hfdmFsdWUgPCA4LCB1c2UgLnJkYXRhIHJhdGhlciB0aGFuIC5saXQgZm9yICdMJy4KLQotV2VkIEp1biAyOSAxNzozMDo0NiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBCcmVhayBsb25nIHN0cmluZyBpbnRvIHNob3J0ZXIgb25lcy4KLQkocGFyc2VfYXJncyk6IEFkZCAtdiwgcHJpbnRzIHZlcnNpb24gaWQgYW5kIGNvbnRpbnVlcy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3Nob3dfdXNhZ2UpOiBCcmVhayBsb25nIHN0cmluZy4KLQotTW9uIEp1biAyNyAwOTo0NzoxNiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqICBjb25maWcvdGMtaTM4Ni5jIChtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgIi1WIiBhbmQgIi1RIiBpZgotCU9CSl9FTEYgaXMgZGVmaW5lZC4KLQotU3VuIEp1biAyNiAxNjozMDo0OCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKG1haW4pIFtIT1NUX1NQRUNJQUxfSU5JVF06IE5ldyBob29rLCBmb3IgaG9zdC1zcGVjaWZpYwotCWluaXRpYWxpemF0aW9uLgotCi1XZWQgSnVuIDIyIDAwOjI0OjU1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChvYmpfZnJvYl9zeW1ib2wpOiBEZWZpbmUgZm9yIE9CSl9FTEYuCi0JTW9yZSBnYXMvYmZkIGxvc3NhZ2UgZXhwb3NlZCBieSB0aGUgbmV3IGxpbmtlciBjb2RlLgotCi1UdWUgSnVuIDIxIDExOjMyOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKTogQ2xlYXIgc2VnaW5mbyBhZnRlciBhbGxvY2F0aW5nIGl0LgotCShzdWJzZWdfZ2V0KTogUGFzcyBhY3R1YWwgc2l6ZSBvZiBzZWdpbmZvIHRvIG1lbXNldC4KLQotCSogc3Vic2Vncy5jIChhYnNfc2VnX2luZm8sIHVuZF9zZWdfaW5mbyk6IERlZmluZSBpZiBCRkRfQVNTRU1CTEVSLgotCShzdWJzZWdfY2hhbmdlKTogU3RvcmUgc2VnX2luZm8gZm9yIGJmZF9hYnNfc2VjdGlvbl9wdHIgaW4KLQlhYnNfc2VnX2luZm8sIGFuZCBzdG9yZSBzZWdfaW5mbyBmb3IgYmZkX3VuZF9zZWN0aW9uX3B0ciBpbgotCXVuZF9zZWdfaW5mby4KLQkoc3Vic2VnX2dldCk6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3Qgc2V0IG91dHB1dF9zZWN0aW9uIGlmIGl0IGlzCi0JYWxyZWFkeSBzZXQuCi0JKHNlZ19pbmZvKTogRGVmaW5lIGFzIGZ1bmN0aW9uLgotCSogc3Vic2Vncy5oIChzZWdfaW5mbyk6IERlY2xhcmUgYXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gZGVmaW5pbmcKLQlhcyBtYWNyby4KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IENhbGwgc2VnX2luZm8gcmF0aGVyIHRoYW4KLQliZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEuCi0KLU1vbiBKdW4gMjAgMTY6MzA6NTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwcGMtKi1lbGYqKTogTmV3IHRhcmdldCwgbGlrZSAtc3lzdjQqLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiAiMGYiIGlzIGZvbGxvd2VkIGJ5ICdcMCcsIGRvbid0IGRvIGVvbAotCWNoZWNrcy4KLQotTW9uIEp1biAyMCAxNToxNzo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2F1eCk6IENhbGwgc3dhcF90aXJfb3V0IGFuZCBzd2FwX3JuZHhfb3V0Ci0JdmlhIGJhY2tlbmQgcG9pbnRlciwgbm90IGRpcmVjdGx5LgotCi1GcmkgSnVuIDE3IDE4OjA1OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IE1ha2Ugc3VyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLQllbGVtZW50IGluIHRoZSBmb3IgbG9vcC4KLQotRnJpIEp1biAxNyAxMTowMTowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogTWlzYyB0cml2aWFsIGNoYW5nZXMgdG8gbWFrZSBnY2MgLVdhbGwgaGFwcHkuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCi1XZWQgSnVuIDE1IDIwOjQ0OjQ2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBDYXN0IHhtYWxsb2MgcmV0dXJuIHZhbHVlLgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogSWYgJChkZWZzKSBjb250YWlucyBtdWx0aXBsZSB3b3JkcywKLQllbWl0IGEgI2RlZmluZSBsaW5lIGZvciBlYWNoLgotCSogY29uZmlndXJlLmluOiBGb3Igc3BhcmM2NCB0YXJnZXQsIHVzZSBzcGFyYyBjcHUgZmlsZXMgYW5kIGFkZAotCXNwYXJjdjkgdG8gZXh0cmFfZGVmcy4gIE5vIGxvbmdlciB0cmVhdCBzcGFyYzY0LSotYW91dCogc3BlY2lhbGx5LgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWVtYmFyX21hc2tzKTogTm93IHN0YXRpYyBhbmQgY29uc3QuCi0JKG1kX3Nob3dfdXNhZ2UpIFshTk9fVjldOiBBZGQgLUF2OSB0byB1c2FnZSBtZXNzYWdlLgotCShjdXJyZW50X2FyY2hpdGVjdHVyZSkgW3NwYXJjdjldOiBJbml0aWFsaXplIHRvIHY5LgotCShtZF9iZWdpbikgW3NwYXJjdjldOiBEb24ndCBib3RoZXIgY2hhbmdpbmcgaXQgdW5jb25kaXRpb25hbGx5Ci0JaGVyZS4KLQkoc19yZXNlcnZlKTogRG9uJ3QgcGFzcyB1bmV4cGVjdGVkIGFyZ3VtZW50IHRvIGFzX2JhZCB3aXRoCi0JYmFkLXNlZ21lbnQgbWVzc2FnZS4KLQotCSogYXMuaCAoYmZkX2FsbG9jX2J5X3NpemVfdCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlLgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGludF90b19nZW4pOiBDb21tZW50ZWQgb3V0IHVudXNlZCByb3V0aW5lLgotCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogUmVtb3ZlZCBjaGVjayBvZiBvcGVyYW5kIHNlY3Rpb24uCi0KLQlGcmkgSnVuICAzIDE3OjI1OjA4IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChEQkdfU19DX0NPTVBMWDQsIERCR19TX0NfQ09NUExYOCk6IGRlZmluZQotCXRoZXNlIG5ldyBWTVMgc3ltYm9sLXR5cGUgbWFjcm9zIGZvciBgY29tcGxleCBmbG9hdCcgYW5kCi0JYGNvbXBsZXggZG91YmxlJyBzdXBwb3J0LiAgVGhlaXIgdmFsdWVzIGNvbWUgZnJvbSB0aGUgZXhpc3RpbmcKLQlEU0MkS19EVFlQRV9GQyBhbmQgRFNDJEtfRFRZUEVfREMgbWFjcm9zIGluIDxkZXNjcmlwLmg+LgotCShEQkdfU19DX1JFQUw4X0csIERCR19TX0NfQ09NUExYOF9HKTogR19mbG9hdCB2ZXJzaW9ucyBvZgotCVJFQUw4IGFuZCBDT01QTFg4OyBub3QgdXNlZCB5ZXQsIGJlY2F1c2UgZ2NjIG91dHB1dHMgdGhlIHNhbWUKLQkuc3RhYnMgZm9yIGBkb3VibGUnIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgLW1nJyBpcyB1c2VkLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3R5cGVkZWZfcGFyc2UpIFtjYXNlICdyJ106IGFkZCBlbnRyaWVzCi0JZm9yIGdjYzIncyBwcmVkZWZpbmVkIHR5cGVzICJjb21wbGV4IGZsb2F0IiwgImNvbXBsZXggZG91YmxlIiwKLQlhbmQgImNvbXBsZXggbG9uZyBkb3VibGUiIChpZGVudGljYWwgdG8gY29tcGxleCBkb3VibGUpLgotCi1XZWQgSnVuIDE1IDEyOjMyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBVc2UgQ19TVEFUIGZvciB0aGUgLnRleHQKLQlzZWN0aW9uIHN5bWJvbCwgbm90IENfTEFCRUwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBQZXJtaXQgYSBtb2RpZmllciBpbiAnbycgY2FzZSwgYW5kCi0JcGVybWl0IG5vbiBjb25zdGFudCBleHByZXNzaW9ucyBpbiAndScgY2FzZS4gIExldHMgYGBsdWkKLQkkOCwlaGkoZm9vKTsgbHcgJDgsJWxvKGZvbykoJDgpJycgd29yayBjb3JyZWN0bHkuCi0KLU1vbiBKdW4gMTMgMTI6MDg6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQKLQl0byBwdXQgYSBjb21tb24gc3ltYm9sIGluIGEgc2V0LgotCi1TYXQgSnVuIDExIDE2OjQxOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCB3ZWFrIHN5bWJvbHMgYXMgYW4gZXh0ZW5zaW9uIHRvIGEub3V0LgotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogT25seSBwcmVzZXJ2ZSBleHRlcm5hbCBiaXQgZm9yIE9CSl9BT1VUIGFuZAotCU9CSl9CT1VUIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL2FvdXRfZ251LmggKE5fV0VBS1UsIE5fV0VBS0EsIE5fV0VBS1QsIE5fV0VBS0QsIE5fV0VBS0IpOgotCURlZmluZSBhcyBpbiAuLi9pbmNsdWRlL2FvdXQvYW91dDY0LmguCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBJZiBub3QgQkZEX0FTU0VNQkxFUiwKLQlkZWZpbmUgYXMgY2hhci4KLQkoU19HRVRfV0VBSywgU19TRVRfV0VBSyk6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfcHNldWRvX3RhYmxlKTogQWRkICJ3ZWFrIi4KLQkob2JqX2VtaXRfc3ltYm9scyk6IEFkanVzdCB0eXBlIG9mIHdlYWsgc3ltYm9scy4KLQkob2JqX2FvdXRfd2Vhayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLUZyaSBKdW4gMTAgMTM6NDg6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBEb24ndCBzZXQgYW55IGZsYWdzIGJhc2VkIG9uCi0JdGhlIHR5cGUgb2YgYSBzcGVjaWFsIHNlY3Rpb24uCi0KLQkqIGNvbmZpZy9oby1zdW5vcy5oOiBJbmNsdWRlIDxzdGRsaWIuaD4uICBEb24ndCBkZWNsYXJlIG1hbGxvYywKLQlyZWFsbG9jLCBmcmVlLCBvciBhdG9sLgotCi1XZWQgSnVuICA4IDA2OjI4OjM3IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBEZWxldGUgYXMubmV3IGRlcGVuZGVuY3ksIHNvIHRoYXQKLQlyZWdyZXNzaW9uIHRlc3QgZG9lc24ndCB0cmlnZ2VyIGFuIGFzc2VtYmxlciBidWlsZC4KLQotVHVlIEp1biAgNyAxMzozMzoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbiwgcmVhbGNsZWFuKTogTmV3IHRhcmdldHMuCi0JKiBkb2MvTWFrZWZpbGUuaW4sIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLU1vbiBKdW4gIDYgMTM6MTA6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChSREFUQV9TRUNUSU9OX05BTUUpOiBEZWZpbmUuCi0JKG1hY3JvKTogQ29ycmVjdCBNX0xJX1NTIFNWUjRfUElDL0VNQkVEREVEX1BJQyBjYXNlLiAgQWZ0ZXIgTV9MSV9ECi0Jb3IgTV9MX0RPQiBvciBsYWJlbCBkb2IsIGZvcmNlIGEgbmV3IGZyYWcgdG8gYXZvaWQgZ2V0dGluZwotCWNvbmZ1c2VkIGluIHRjX2dlbl9yZWxvYy4KLQkobWlwc19pcCk6IFVzZSBSREFUQV9TRUNUSU9OX05BTUUsIG5vdCAucmRhdGEuCi0JKHNfY2hhbmdlX3NlYyk6IExpa2V3aXNlLgotCi1GcmkgSnVuICAzIDIzOjM1OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgbWVtc2V0IHRvIHplcm8gb3V0IG1lbW9yeSwgcmF0aGVyIHRoYW4KLQlnb2luZyB0aHJvdWdoIG1kX251bWJlcl90b19jaGFycy4gIFRoaXMgcGVybWl0cyBoYW5kbGluZyBzeW1ib2xpYwotCWFyZ3VtZW50cyB3aGVuIHRoZSBzaXplIGlzIGxhcmdlciB0aGFuIHNpemVvZiAodmFsdWVUKSwgaWYKLQlUQ19DT05TX0ZJWF9ORVcgaXMgcHJlcGFyZWQgdG8gaGFuZGxlIHRoZSBjYXNlIChhcyBpdCBpcyBvbiBNSVBTKS4KLQotRnJpIEp1biAgMyAxMjo1MDoxMyAxOTk0ICBEYXZpZCBKLiBNYWNLZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpLCBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvd191c2FnZSksCi0JY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCB1cCBtZXNzYWdlcy4KLQotCSogYXMuaDogUmVwbGFjZSBmbGFnc2VlbiB3aXRoIHNlcGFyYXRlIHZhcmlhYmxlcy4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBTZXQgdGhlbS4gIERvbid0IGFjY2VwdCAtMSBvcHRpb24sIG9yIC12Ci0JZXhwbGljaXRseSAoaXQncyBhIHN5bm9ueW0gZm9yIC0tdmVyc2lvbikuCi0JKiBhcy5jLCBpbnB1dC1zY3J1Yi5jLCBtZXNzYWdlcy5jLCByZWFkLmMsIHN5bWJvbHMuYywgd3JpdGUuYywKLQljb25maWcvb2JqLWFvdXQuYywgY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotYm91dC5jLAotCWNvbmZpZy9vYmotYm91dC5oLCBjb25maWcvb2JqLWNvZmYuYywgY29uZmlnL29iai1jb2ZmLmgsCi0JY29uZmlnL29iai12bXMuYywgY29uZmlnL3RjLWhwcGEuYywgY29uZmlnL3RjLWkzODYuYywKLQljb25maWcvdGMtaTk2MC5jLCBjb25maWcvdGMtbTY4ay5jLCBjb25maWcvdGMtbWlwcy5jLAotCWNvbmZpZy90Yy12YXguYzogVXNlIHRoZSBuZXcgZmxhZyB2YXJpYWJsZXMgaW5zdGVhZCBvZiBmbGFnc2Vlbi4KLQkqIGNvbmZpZy90Yy12YXguYyBbT0JKX1ZNU106IFJlY29nbml6ZSAtKywgLTEsIC12LCBhbmQgZG9jdW1lbnQgaW4KLQl1c2FnZS4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IFJlbW92ZSB0YXJnZXQgc3BlY2lmaWMgbWVzc2FnZXM7Ci0JaW5zdGVhZCwgY2FsbCBtZF9zaG93X3VzYWdlLgotCShwYXJzZV9hcmdzKTogVXNlIGdldG9wdF9sb25nX29ubHkuICBUYWtlIHBvaW50ZXJzIHRvIGFyZ2MgYW5kCi0JYXJndi4KLQkobWFpbik6IFBhc3MgcGFyc2VfYXJncyBwb2ludGVycy4KLQkqIGFzLmg6IFJlbW92ZSAzIHZhcmlhYmxlcyB0aGF0IGFyZSByZWR1bmRhbnQgd2l0aCBmbGFnc2Vlbi4KLQkqIGFzLmMsIG1lc3NhZ2VzLmM6IENoYW5nZSB0aGVpciB1c2VycyB0byB1c2UgZmxhZ3NlZW4uCi0JRGVmaW5lIGdldG9wdCBzdHVmZi4KLQkqIHRjLmg6IFVwZGF0ZSBtZF9wYXJzZV9vcHRpb24gZGVjbC4gIEFkZCBtZF9zaG93X3VzYWdlIGRlY2wuCi0JKiBjb25maWcvdGMtKi5jOiBBZGQgbWRfc2hvcnRvcHRzLCBtZF9sb25nb3B0cywKLQltZF9sb25nb3B0c19zaXplLCBtZF9zaG93X3VzYWdlLiAgQ2hhbmdlIGNhbGxpbmcgY29udmVudGlvbiBmb3IKLQltZF9wYXJzZV9vcHRpb24uICBSZW1vdmUgbWRfcGFyc2VfbG9uZ19vcHRpb24uCi0JKiBjb25maWcvdGMtbnMzMmsuYzogUmVuYW1lIGBzdHJ1Y3Qgb3B0aW9uJyB0byBgc3RydWN0IG5zMzJrX29wdGlvbicuCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBEb24ndCBkZWZpbmUgbWRfcGFyc2Vfb3B0aW9uLgotCi1UaHUgSnVuICAyIDEzOjU0OjQ2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoc2hvd191c2FnZSk6IE5ldyBmdW5jdGlvbi4KLQkocGFyc2VfYXJncyk6IENvZGUgbW92ZWQgZnJvbSBtYWluLgotCVJlY29nbml6ZSAtLWhlbHAgYW5kIC0tdmVyc2lvbi4KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBEZWZpbmUgVENfTlMzMksuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgYWxsIG9mIHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgY29tbWFuZAotCWxpbmUgb3B0aW9ucy4KLQotVGh1IEp1biAgMiAxMjowNzoyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXNwLmMgKGhhc2hfbmV3X3RhYmxlKTogQ2xlYXIgbmV3bHkgYWxsb2NhdGVkIHRhYmxlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChlbnVtIF9yZWdpc3Rlcik6IEFkZCA2ODA2MCBjb250cm9sIHJlZ2lzdGVycwotCUJVU0NSIGFuZCBQQ1IuCi0JKGxhc3RfbW92ZWNfcmVnKTogTmV3IG1hY3JvLgotCShtNjgwMDBfY29udHJvbF9yZWdzLCBtNjgwMTBfY29udHJvbF9yZWdzLCBtNjgwMjBfY29udHJvbF9yZWdzLAotCW02ODA0MF9jb250cm9sX3JlZ3MsIG02ODA2MF9jb250cm9sX3JlZ3MpOiBOZXcgYXJyYXlzLgotCShjb250cm9sX3JlZ3MpOiBOZXcgcG9pbnRlci4KLQkobTY4a19pcCk6IFVzZSBjb250cm9sX3JlZ3MgaW5zdGVhZCBvZiB0ZXN0aW5nIENQVSBldmVyeSB0aW1lLgotCVVzZSBsYXN0X21vdmVjX3JlZyB0b28uICBJbiBlcnJvciBtZXNzYWdlcywgaGFuZGxlIDY4MDYwLCBhbmQKLQlwcmludCA2ODA2MCBmb3IgbWZsb2F0LCB0b28uCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogSGFuZGxlICI2ODA2MCIuICBVc2UgbTY4MDQwdXAgZm9yIG1ha2luZwotCW02ODg1MSBjaG9pY2UuICBTZXQgY29udHJvbF9yZWdzLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgIjY4MDYwIi4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0dGluZyBjcHVfdHlwZSwgcmVjb2duaXplIG02ODA2MCB0b28uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KSBbIUJGRF9BU1NFTUJMRVJdCi0JW0RJRkZfRVhQUl9PS106IERvIGNvbnZlcnNpb24gdG8gcGMtcmVsYXRpdmUgZm9yIGRpZmZlcmVuY2UsIGV2ZW4KLQlpZiBwY3JlbCBpcyBhbHJlYWR5IHNldC4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIHRoaXNfZ2NjX3JlcXVpcmVzX3RoZV9nbnVfYXNzZW1ibGVyIGluIGFsbAotCWxvd2VyLWNhc2UsIGluIGNhc2Ugd2UncmUgaWdub3JpbmcgY2FzZSBvZiBvcGNvZGVzIGluIHRoZSBpbnB1dAotCWZpbGUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvICguc2VjdGlvbik6IERvY3VtZW50IGFzIHVuYXZhaWxhYmxlIGZvciBhLm91dAotCXR5cGUgZm9ybWF0cy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1hY2hpbmUpOiBOZXcgdmFyaWFibGUuCi0JKGxvYWRfaW5zbik6IE5ldyBtYWNyby4KLQkobG9hZF9pbnNuX3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9iZWdpbik6IENhbGwgbG9hZF9pbnNuX3RhYmxlLCBvbmNlIGZvciBiYXNpYyBpbnN0cnVjdGlvbnMgYW5kCi0Jb25jZSBmb3IgYXBwcm9wcmlhdGUgUEFMIGluc3RydWN0aW9uIHRhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgYG1hY2hpbmUnIGJhc2VkIG9uIC1tIyMjIyMgYXJndW1lbnRzLgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oIChhbHBoYV9wYWwyMTA2NF9vcGNvZGVzKTogU3BsaXQgb3V0IGZyb20KLQlhbHBoYV9vcGNvZGVzLgotCShhbHBoYV9wYWwyMTE2NF9vcGNvZGVzKTogTmV3IHRhYmxlLgotCShOVU0yMTA2NE9QQ09ERVMsIE5VTTIxMTY0T1BDT0RFUyk6IE5ldyBtYWNyb3MuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IGkzODYtKi1uZXRic2QwLjgpOiBVc2UgMzg2YnNkIGVtdWxhdGlvbi4KLQotCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8tZ2FzcCk6IFVzZSAkJGRpciB3aGVuIGluc3RhbGxpbmcKLQlmaWxlLgotCi1XZWQgSnVuICAxIDEwOjQ4OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZvcmNlIGZsb2F0aW5nIHBvaW50IHZhbHVlcyB0byBiZQotCWFsaWduZWQgY29ycmVjdGx5LgotCi1GcmkgTWF5IDI3IDEwOjA1OjUzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JTWVyZ2VkIGluIGNoYW5nZXMgZnJvbSBnYXMtMi4zIG5ldCByZWxlYXNlOgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gY3lnbnVzLTIuMy4xLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBSZXBsYWNlZCB1bmNoZWNrZWQgdXNlcyBvZiBtYWxsb2Mgd2l0aAotCXhtYWxsb2MuCi0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBPbmx5IHRlc3QgQkZENjQsIG5vdAotCUJGRF9BU1NFTUJMRVIgdG9vLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCkgW0JGRF9BU1NFTUJMRVJdCi0JW0RJRkZfRVhQUl9PS106IERvbid0IGNoZWNrIHBjcmVsLCBqdXN0IGNvbnZlcnQgaXQuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IFJlbW92ZWQgbG90cyBvZiBleHRyYSBzZW1pY29sb25zIGFmdGVyCi0JY29tcG91bmQgc3RhdGVtZW50cy4KLQkoc3RyY2hyKTogRG9uJ3QgZGVjbGFyZSBoZXJlLgotCi0JKiBjb25maWcvaG8tdmF4LmggKHJlYWxsb2MpOiBEZWNsYXJlLgotCi0JKiBjb25maWcvaG8tdm1zLmggKHN0cmNociwgc3RyZHVwKTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BhcnNlX29wdGlvbikgW09CSl9FTEZdOiBBY2NlcHQgYW5kIGlnbm9yZQotCW9wdGlvbiBgLXEnLgotCi0JV2VkIE1heSAxOCAyMDo1MDozNSAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAoREJHX1NfQ19TUVVBRCwgREJHX1NfQ19VUVVBRCk6IGRlZmluZSB0aGVzZQotCW5ldyBWTVMgc3ltYm9sLXR5cGUgbWFjcm9zOyBzaWduZWQgYW5kIHVuc2lnbmVkIHF1YWR3b3JkIGludGVnZXJzLAotCWZvciBgbG9uZyBsb25nJyBzdXBwb3J0LiAgVGhlaXIgdmFsdWVzIGNvbWUgZnJvbSB0aGUgZXhpc3RpbmcKLQlEU0MkS19EVFlQRV9RVSBhbmQgRFNDJEtfRFRZUEVfUSBtYWNyb3MgaW4gPGRlc2NyaXAuaD4uICBUaGUKLQlWTVMgZGVidWdnZXIgbm93IHJlY29nbml6ZXMgYGxvbmcgbG9uZycgdmFyaWFibGVzIGNvcnJlY3RseS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU190eXBlZGVmX3BhcnNlKSBbY2FzZSAnciddOiBhZGQgZW50cmllcwotCWZvciBnY2MyJ3MgcHJlZGVmaW5lZCB0eXBlcyAibG9uZyBkb3VibGUiIChzYW1lIGFzIGRvdWJsZSwgYXMKLQlwZXIgZ2NjJ3MgY3VycmVudCBzdGF0ZSksICJsb25nIGxvbmcgaW50IiwgImxvbmcgbG9uZyB1bnNpZ25lZAotCWludCIsIGFuZCBmaW5hbCBgb3RoZXJ3aXNlJyBjYXNlICh0byBhdm9pZCB1bmluaXRpYWxpemVkIHR5cGUKLQlhbmQgc2l6ZSBmaWVsZHMpLiAgW2NhdmVhdDogIHByZWRlZmluZWQgdHlwZXMgImNvbXBsZXggaW50IiwKLQkiY29tcGxleCBmbG9hdCIsICJjb21wbGV4IGRvdWJsZSIsIGFuZCAiY29tcGxleCBsb25nIGRvdWJsZSIgYXJlCi0Jc3RpbGwgbWlzc2luZy5dCi0KLQkqIGNvbmZpZy9oby12bXMuaCAoRVhJVF9GQUlMVVJFKTogZGVmaW5lIGFzIDB4MTAwMDAwMDIgaW5zdGVhZAotCW9mIDAsIGJlY2F1c2UgdGhlIGxhdHRlciBpbmRpY2F0ZXMgc3VjY2VzcyByYXRoZXIgdGhhbiBmYWlsdXJlCi0Jd2hlbiBwYXNzZWQgdG8gYGV4aXQnIG9yIHJldHVybiBmcm9tIGBtYWluJyBjb21waWxlZCBieSBnY2MyLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChhcnJheV9zdWZmaXgsIGdlbmVyYXRlX3N1ZmZpeCk6IHJlcGxhY2UgdHdvCi0JaGFyZGNvZGVkIGAweGEzJ3Mgd2l0aCBtYWNybyBEQkdfU19DX0FEVkFOQ0VEX1RZUEUgZnJvbSBvYmotdm1zLmguCi0JKFZNU190eXBlZGVmX3BhcnNlKTogZWxpbWluYXRlIHJlZHVuZGFudCBpZi10aGVuLWVsc2Ugd2hlbgotCWFsbG9jYXRpbmcgbmV3IHN5bWJvbCBlbnRyeSBhbmQgbGlua2luZyBpdCB0byBWTVNfU3ltYm9sX3R5cGVfbGlzdC4KLQotCVR1ZSBNYXkgMTcgMjA6NDc6MzEgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6IGRvbid0IHRyeSB0byBpbnRlcnByZXQKLQl0aGUgY29udGVudHMgb2YgdGhlIEdBU19WRVJTSU9OIHN0cmluZyB3aGVuIGZhbGxpbmcgYmFjayB0byBpdCBmb3IKLQlsYW5ndWFnZSBwcm9jZXNzb3IgaWRlbnRpZmljYXRpb24uCi0KLQkqIG1ha2UtZ2FzLmNvbSwgdm1zY29uZi5zaCAoRU5WSVJPTik6IGZpeCBtaXNzcGVsbGluZyBvZgotCWBwc2VjdF9hdHRyJyBpbiBsaW5rZXIgb3B0aW9ucy4KLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgdG8gbGF0ZXN0IG1ha2VmaWxlLmluCi0JKiBjb25maWcvdGUtZ28zMi5oOiBbbmV3XSBnbzMyJ3MgZW52aXJvbm1lbnQKLQotRnJpIE1heSAyMCAxNzo1OTozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVycyBmb3Igc3Ryc3RyLgotCi1UaHUgTWF5IDE5IDE1OjQwOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEb24ndCBjaGFuZ2UgdGhlIHNpemUgaWYKLQlPQkpfRUxGLgotCi1XZWQgTWF5IDE4IDEzOjA4OjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZWRpcmVjdCBsbiBvdXRwdXQgdG8gL2Rldi9udWxsLiAgSWYgbG4KLQlmYWlscyBvbiBnYXNwLCBpbnN0YWxsIGdhc3AubmV3LCBub3QgZ2FzcC4KLQotV2VkIE1heSAxOCAwOToxNjozNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBVc2UgUl9IUFBBX0FCU19DQUxMLCBub3QgUl9IUFBBIGZvcgotCWFic29sdXRlIGNhbGxzLgotCi1UdWUgTWF5IDE3IDEyOjUwOjQ2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9mcF9jbXBfY29uZCk6IFJlcG9ydCBhbiBlcnJvcgotCW9uIGEgcGFydGlhbCBjb21wbGV0ZXIgbWF0Y2guCi0KLU1vbiBNYXkgMTYgMTI6MDM6NDkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IENoYW5nZSAuaHBwYV91bndpbmQgdG8gLlBBUklTQy51bndpbmQKLQl0aHJvdWdob3V0IGNvZGUuCi0JKGlzX2NvbXBsZXgpOiBEZWxldGUgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydCBmb3IgY29tcGxleCByZWxvY2F0aW9uCi0JdHlwZXMuCi0JKHRjX2dlbl9yZWxvYyk6IERlbGV0ZSBzcGVjaWFsIHVud2luZCBjcnVkIGZvciBFTEYuICBTaW1wbGlmeSBhbmQKLQlyZXdyaXRlIEVMRiBjb2RlIGJhc2VkIG9uIDk0LTAyLTAyIFBBIEVMRiBkcmFmdCBzcGVjLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBVc2Ugc3RhbmRhcmQgUEFSSVNDX0RJUjMyIHJlbG9jcyBmb3IKLQl0aGUgdW53aW5kIGRlc2NyaXB0b3JzLgotCi1GcmkgTWF5ICA2IDE0OjEzOjE1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oOiBOZXcgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIGdvMzIgY3Jvc3NpbmcuCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PWdvMzIpOiBVc2UgbmV3IGZyYWdtZW50LgotCi1GcmkgTWF5ICA2IDE0OjM1OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShtYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogV2hlbiB1c2luZyAtbWFueSwgcGVybWl0IGNvbXBhcmlzb24KLQlpbnN0cnVjdGlvbnMgdG8gYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIHRoZSBvcGNvZGUgdGFibGUuCi0KLVRodSBNYXkgIDUgMTk6MTQ6NDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGUgdG8gMi4yLjkwLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgcGVybWl0IGFkZGl0aW9ucwotCXRvIHRoZSBzeW1ib2wgdGFibGUgaWYgaXQncyBhbHJlYWR5IGJlZW4gc2V0IGluIHRoZSBvdXRwdXQgYmZkLgotCShzeW1ib2xfYmVnaW4pIFshIEVNSVRfU0VDVElPTl9TWU1CT0xTXSBbUkVMT0NfUkVRVUlSRVNfU1lNQk9MXToKLQlEb24ndCB1c2UgYmZkX2Fic19zZWN0aW9uLnN5bWJvbCBmb3IgZ2FzIGFic29sdXRlIHN5bWJvbC4KLQotCSogZG9jL01ha2VmaWxlLmluIChkaXN0Y2xlYW4sIGNsZWFuLWR2aSwgY2xlYW4taW5mbyk6IERlbGV0ZSBnYXNwCi0JZmlsZXMgdG9vLgotCi1UaHUgTWF5ICA1IDE4OjEyOjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbWl0X2RlbGF5cyk6IE1ha2UgY2FsbCB0bwotCW1pcHNfbm9fcHJldl9pbnNuIHVuY29uZGl0aW9uYWwuCi0KLVRodSBNYXkgIDUgMTc6MjU6MzggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmKi4qOiBNZXJnZWQgY29mZmJmZCB2ZXJzaW9ucyBpbnRvIGNvZmYgdmVyc2lvbnMsCi0Jd2l0aCBhIHNpbmdsZSAiI2lmZGVmIEJGRF9BU1NFTUJMRVIiIGNvbnRyb2xsaW5nIG1vc3Qgb2YgaXQgZm9yCi0Jbm93LiAgRGVsZXRlZCBvYmotY29mZmJmZC4qIGZpbGVzLgotCSogY29uZmlndXJlLmluOiBBbHdheXMgdXNlIG9iai1jb2ZmLiogZm9yIENPRkYgdGFyZ2V0cy4KLQotV2VkIE1heSAgNCAxMzozNDoxMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGUtZHB4Mi5oIChUQVJHRVRfRk9STUFULCBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwpOgotCURlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay1idWxsLXN5c3YzKik6IEVuYWJsZS4KLQotCSogY29uZmlnL2NvZmZfZ251Lmg6IERlbGV0ZWQuCi0KLVdlZCBNYXkgIDQgMTE6Mjk6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKTogSWYgbm90IFRFX1NVTjMsIGRlZmluZSBhcwotCSJhLm91dC16ZXJvLmJpZyIuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogTWFrZSBjb21tb24gc3ltYm9sIGFuZCBQQwotCXJlbGF0aXZlIGFkanVzdG1lbnRzIHdoZW4gVEVfTFlOWCBpcyBkZWZpbmVkIGFzIHdlbGwgYXMgd2hlbgotCVRDX0kzODYgaXMgZGVmaW5lZC4KLQotV2VkIE1heSAgNCAwMjoyOToyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoc3Ryc3RyKTogUmVzdG9yZSBkZWNsYXJhdGlvbi4KLQkoc3Vic2VnX2dldCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIG9ial9hZGp1c3Rfc3ltdGFiIGlzIGRlZmluZWQsCi0JaW52b2tlIGl0LiAgVGhlbiBjYWxsIHNldF9zeW10YWIsIGFuZCBmaW5hbGx5IGludm9rZSAqX2Zyb2JfZmlsZQotCWhvb2tzLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfYWRqdXN0X3N5bXRhYik6IFJlbmFtZWQgZnJvbQotCWNvZmZfZnJvYl9maWxlLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfYWRqdXN0X3N5bXRhYik6IENoYW5nZWQgZGVjbGFyYXRpb24KLQlhY2NvcmRpbmdseS4KLQkob2JqX2FkanVzdF9zeW10YWIpOiBNYWNybyBhbHNvIGNoYW5nZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWdudSopOiBOZXcgdGFyZ2V0LCBoYW5kbGVkIGxpa2UgaTM4Ni1tYWNoLgotCi1UdWUgTWF5ICAzIDIxOjA0OjE2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKSBbVENfSTk2MF06IFNlbGVjdCBsaXR0bGUKLQllbmRpYW4gdmVyc2lvbi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKFRBUkdFVF9GT1JNQVQpIFtUQ19JOTYwXTogRGl0dG8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc2VjdGlvbik6IFJvdW5kIHVwIHRoZSBzaXplIG9mCi0JZXZlcnkgc2VjdGlvbiB0byBhIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQsIHNvIHRoYXQgQkZEIGRvZXNuJ3QKLQlzdXJwcmlzZSB1cy4KLQotCUVsaW1pbmF0ZSBtYW55IHNpbXBsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gQ09GRiBiYWNrIGVuZHM6Ci0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBSZW1vdmVkIGFsbCB1c2VzIG9mIERFRlVOIGFuZCBERUZVTl9WT0lELgotCU1hZGUgbWlub3Igc3R5bGlzdGljIGNoYW5nZXMsIGRlbGV0ZWQgc29tZSByZWdpc3RlciBkZWNsYXJhdGlvbnMuCi0JKHN0YWNrX3RvcCk6IERlbGV0ZWQuCi0JKHN5bWJvbF90b19jaGFycyk6IFVzZSBhYnNvbHV0ZV9zZWN0aW9uIGFuZCByZWdfc2VjdGlvbiBpbnN0ZWFkIG9mCi0JdGhlIGNvcnJlc3BvbmRpbmcgU0VHXyogc3ltYm9scy4KLQkob2JqX2NvZmZfZW5kZWYsIHRhZ19maW5kX29yX21ha2UsIGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQkoc3RhY2sgdHlwZWRlZiwgc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3ApOgotCU1vdmVkIHRvIGp1c3QgYWZ0ZXIgcHNldWRvLW9wIHRhYmxlLiAgQWxsIGZ1bmN0aW9ucyBub3cgc3RhdGljLgotCShzdGFja19kZWxldGUpOiBSZW1vdmVkIGRlY2xhcmF0aW9uLgotCSh0YWdfaW5pdCwgdGFnX2luc2VydCwgdGFnX2ZpbmRfb3JfbWFrZSwgdGFnX2ZpbmQpOiBNb3ZlZCB0byBqdXN0Ci0JYWZ0ZXIgc3RhY2sgZnVuY3Rpb25zLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IFJlb3JkZXJlZCBzb21lIGRlY2xhcmF0aW9ucyBhbmQgbWFjcm9zLgotCShzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6IERvbid0IGRlY2xhcmUuCi0JKHN0YWNrIHR5cGVkZWYpOiBEZWxldGVkLgotCShTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTKTogQWx3YXlzIHVuZGVmIHRoZW4gZGVmaW5lOyBkb24ndCB0ZXN0LgotCShTWU1fQVVYRU5UKTogTmV3IG1hY3JvLgotCShTQV9HRVRfKiwgU0FfU0VUXyopOiBEZWZpbmUgaW4gdGVybXMgb2YgU1lNX0FVWEVOVCB3aGVuIGZlYXNpYmxlLgotCShTRl9HRVRfKiwgU0ZfU0VUXyopOiBEZWZpbmUgaW4gdGVybXMgb2YgU0ZfR0VUIHdoZW4gZmVhc2libGUuCi0JKFNBX0dFVF9TWU1fVEFHTkRYLCBTQV9HRVRfU1lNX0VORE5EWCwgU0FfU0VUX1NZTV9UQUdORFgsCi0JU0FfU0VUX1NZTV9FTkRORFgsIG9iamVjdF9oZWFkZXJzIHR5cGVkZWYsIGRhdGFfc2VjdGlvbl9oZWFkZXIsCi0JdGV4dF9zZWN0aW9uX2hlYWRlcik6IERlbGV0ZSBub24tQkZEX0hFQURFUlMgdmVyc2lvbnMsIHNpbmNlIHdlCi0JYWx3YXlzIGRlZmluZSB0aGF0IHN5bWJvbCBub3cuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzdGFja190b3ApOiBEZWxldGVkLgotCShvYmpfY29mZl9lbmRlZiwgb2JqX2NvZmZfZGltLCBvYmpfY29mZl9saW5lLCBvYmpfY29mZl9zaXplLAotCW9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfdGFnLCBvYmpfY29mZl90eXBlLCBvYmpfY29mZl92YWwpOiBDaGFuZ2UKLQlhcmd1bWVudCBuYW1lIGZyb20gImlnbm9yZWQiIHRvICJpZ25vcmUiLgotCShvYmpfY29mZl92YWwpOiBVc2UgZnJhZ19ub3dfZml4LgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBJR05PUkVfREVCVUcgdmVyc2lvbiwgc2luY2UgaXQgZG9lc24ndAotCWdldCB1c2VkLgotCShzdGFjayB0eXBlZGVmLCBzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6Ci0JTW92ZWQgdG8ganVzdCBhZnRlciBwc2V1ZG8tb3AgdGFibGUuICBBbGwgZnVuY3Rpb25zIG5vdyBzdGF0aWMuCi0JKHRhZ19pbml0LCB0YWdfaW5zZXJ0LCB0YWdfZmluZF9vcl9tYWtlLCB0YWdfZmluZCk6IE1vdmVkIHRvIGp1c3QKLQlhZnRlciBzdGFjayBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogUmVvcmRlcmVkIHNvbWUgZGVjbGFyYXRpb25zIGFuZCBtYWNyb3MuCi0JUHJvdGVjdGVkIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQkoc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3ApOiBEb24ndCBkZWNsYXJlLgotCShzdGFjayB0eXBlZGVmKTogRGVsZXRlZC4KLQkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IEFsd2F5cyB1bmRlZiB0aGVuIGRlZmluZTsgZG9uJ3QgdGVzdC4KLQkoc3Rkb3V0cHV0KTogRGVsZXRlZCBkZWNsYXJhdGlvbi4KLQkoVEFSR0VUX0ZPUk1BVCkgW1RDX0kzODZdOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCi1Nb24gTWF5ICAyIDE3OjA5OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IFVzZSBmaXhfdGFpbCBmaWVsZCBldmVuIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IEluaXRpYWxpemUgZml4X3RhaWwgZmllbGQuCi0JKHN1YnNlZ19nZXQpOiBMaWtld2lzZS4KLQkqIHdyaXRlLmMgKGZyYWdzX2NoYWluZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmaXhfbmV3X2ludGVybmFsKTogSWYgZnJhZ3NfY2hhaW5lZCBpcyBzZXQsIHVzZSBmaXhfcm9vdCBhbmQKLQlmaXhfdGFpbCBmcm9tIHNlZ19pbmZvIChub3dfc2VnKSwgcmF0aGVyIHRoYW4gZnJjaGFpbl9ub3cuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBTZXQgZml4X3RhaWwgZmllbGQuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKTogU2V0IGZyYWdzX2NoYWluZWQuCi0KLVRodSBBcHIgMjggMDE6Mzk6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfb3B0aW9uKTogT25seSByZWZlciB0byBnX3N3aXRjaF8qIHZhcmlhYmxlcwotCWlmIEdQT1BUIGlzIGRlZmluZWQuCi0JKHNfYWJpY2FsbHMpOiBEaXR0by4KLQkobWRfYXBwbHlfZml4KTogQ2FzdCBjaGFyKiB0byB1bnNpZ25lZCBjaGFyKiB0byBhdm9pZCBwb2ludGVyCi0JbWlzbWF0Y2guCi0KLVdlZCBBcHIgMjcgMTE6MDY6MzIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ28zMik6IFVzZXMgY29mZiBub3cuCi0JKiBnYXNwLmMgKG1haW4pOiBOb3cgdGFrZXMgLUQgb24gY29tbWFuZCBsaW5lLgotCShzaG93X3VzYWdlKTogRGVzY3JpYmUgbmV3IG9wdGlvbnMuCi0KLVR1ZSBBcHIgMjYgMTc6MTA6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IFByaW50ICJOTyBERUZJTkVEIFNZTUJPTFMiIGFuZAotCSJOTyBVTkRFRklORUQgU1lNQk9MUyIgaWYgdGhlcmUgYXJlbid0IGFueSwgaW5zdGVhZCBvZiBkaXNwbGF5aW5nCi0JdGhlIGhlYWRlciB3aXRoIGFuIGVtcHR5IGxpc3QuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBDaGVjayBDT0ZGX05PTE9BRF9QUk9CTEVNCi0JYWxzbyBiZWZvcmUgc2V0dGluZyBTVFlQX05PTE9BRCBmb3IgLmJzcyBzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpOiBOZXcgdmFyaWFibGUuCi0JSW5pdGlhbGl6ZWQgdG8gdmFsdWUgb2YgUkVHSVNURVJfUFJFRklYX09QVElPTkFMLCBpZiBkZWZpbmVkLCBvcgotCXplcm8uCi0JKG02OGtfcmVnX3BhcnNlKTogSWYgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsIGlzIHNldCwgcGVybWl0Ci0JcmVnaXN0ZXIgcHJlZml4IHRvIGJlIGFic2VudC4KLQkobTY4a19pcF9vcCk6IEFjY2VwdCBgJicgYWxzbyBmb3IgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQkoaW5zZXJ0X3JlZyk6IERvbid0IGJvdGhlciB3aXRoICh0d28hPykgc2FuaXR5IGNoZWNrcyBvZiB0aGUKLQlzeW1ib2wgdGFibGUgd2hlbiBpbnNlcnRpbmcgZWFjaCByZWdpc3Rlci4KLQkobTY4a19wYXJzZV9sb25nX29wdGlvbik6IE5ldyBmdW5jdGlvbi4gIFNldAotCWZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCBpZiAicmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIiBpcyBwYXNzZWQuCi0JKiBjb25maWcvdGMtbTY4ay5oIChSRUdJU1RFUl9QUkVGSVgpOiBBbHdheXMgZGVmaW5lIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYKTogRG9uJ3QgZGVmaW5lLgotCShSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwpOiBJZiBub3QgYWxyZWFkeSBkZWZpbmVkLCBkZWZpbmUgYXMgemVybwotCW9yIG9uZSBkZXBlbmRpbmcgb24gTTY4S0NPRkYuCi0KLQlTb21lIGNoYW5nZXMgdG8gaGVscCBBcG9sbG8gc3VwcG9ydCwgZnJvbSB0cm95QGNibWUudW5zdy5lZHUuYXU6Ci0JKiBjb25maWcvdGMtbTY4ay5jIChEQVRBLCBBRERSLCBTUCwgRlBSRUcsIENPUE5VTSwgQkFELCBCQUMpOgotCURlZmluZSBhcyBtYWNyb3MgaW5zdGVhZCBvZiBlbnVtZXJhdG9ycywgc2luY2UgdGhlIEFwb2xsbyBjb21waWxlcgotCWNhbid0IGhhbmRsZSAiZW51bVZhbDEsIGVudW1WYWwyID0gZW51bVZhbDEiIHdoZW4gZGVmaW5pbmcgYW4gZW51bQotCXR5cGUuCi0JKG1ha2VfcGNyZWxfYWJzb2x1dGUpIFtOT19QQ1JFTF9SRUxPQ1NdOiBOZXcgZnVuY3Rpb24uCi0JKHRjX2NvZmZfZml4MnJ0eXBlKSBbTk9fUENSRUxfUkVMT0NTXTogR2VuZXJhdGUgb25seSBSX1JFTEJZVEUsCi0JUl9ESVIxNiwgYW5kIFJfRElSMzIgcmVsb2NzLgotCSogY29uZmlnL3RjLW02OGsuaCBbVEVfQVBPTExPXSAoQ09GRl9NQUdJQywgQ09GRl9BT1VUSERSX01BR0lDKToKLQlVc2UgQXBvbGxvIHZlcnNpb25zLgotCVtURV9BUE9MTE9dIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUik6IFVuZGVmaW5lLiAgVGhhdCBpcywKLQlkbyBpbmNsdWRlIHRoZSBvcHRpb25hbCBoZWFkZXIgZm9yIEFwb2xsbyB0YXJnZXQuCi0JKENPRkZfTUFHSUMpOiBEb24ndCBkZWZpbmUgYXMgTUM2OE1BR0lDIGlmIGl0J3MgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5oIFtURV9ERUxUQV0gKExFWF9QQ1QpOiBEZWZpbmUgYXMgMSwgc28gdGhhdCBgJScKLQljYW4gYmUgdXNlZCB3aXRoaW4gYSBsYWJlbCBuYW1lLgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IERlY2xhcmUuCi0JKHRjX2luaXRfYWZ0ZXJfYXJncyk6IERlZmluZSBhcyBtNjhrX2luaXRfYWZ0ZXJfYXJncy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogTmV3IGZ1bmN0aW9uLAotCWNvbnRhaW5pbmcgb25lLXNob3QgY29kZSBmcm9tIG1kX2Fzc2VtYmxlLiAgQWRkZWQgd2FybmluZyBmb3IKLQljb21iaW5hdGlvbiBvZiA2ODA0MCBhbmQgNjg4NTEuCi0JKG1kX2Fzc2VtYmxlKTogU3RhcnR1cC10aW1lIGNvZGUgZGVsZXRlZC4KLQotTW9uIEFwciAyNSAxNjoxOToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoY2xlYW4sIGRpc3RjbGVhbik6IFJlbW92ZSBhc2NvbmZpZy50ZXhpLgotCi1TdW4gQXByIDI0IDAwOjEzOjA4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IDEzIGJpdCBpbW1lZGlhdGUgY29uc3RhbnQgKGZvciBicmVhawotCWluc3RydWN0aW9uKSBpcyB1bnNpZ25lZC4KLQotRnJpIEFwciAyMiAxNzo1ODoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogVXNlIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUKLQlhbmQgYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyB0byBzZXQgdGhlIEdQIHZhbHVlIGFuZCB0aGUgcmVnaXN0ZXIKLQltYXNrcywgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIG5vdyBvYnNvbGV0ZSBmYWtlIC5yZWdpbmZvIHNlY3Rpb24uCi0KLUZyaSBBcHIgMjIgMTU6MTc6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IERvbid0IHByaW50IHJlZ2lzdGVyIHN5bWJvbHMgYXMKLQl1bmRlZmluZWQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogRG9uJ3QgbmVlZCB0byBzdHJpcAotCXVuZGVyc2NvcmVzLCBzaW5jZSBzeW1ib2xfbmV3IHdpbGwgYWxyZWFkeSBoYXZlIGRvbmUgaXQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IERpdHRvLgotCi0JKiBhcy5jIChtYWluKTogSWYgdGNfaW5pdF9hZnRlcl9hcmdzIGlzIGRlZmluZWQsIGludm9rZSBpdCBhZnRlcgotCWFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KLQotCVNvbWUgY2hhbmdlcyB0byBoZWxwIEFwb2xsbyBzdXBwb3J0LCBmcm9tIHRyb3lAY2JtZS51bnN3LmVkdS5hdToKLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcykgW1RFX0FQT0xMT106IENyZWF0ZSAud3RleHQKLQlzZWN0aW9uIGluc3RlYWQgb2YgLnRleHQuICBDYWxsIGNyZWF0ZV90YXJnZXRfc2VnbWVudHMuCi0JKiByZWFkLmMgKGRlbWFuZF9jb3B5X3N0cmluZyk6IE5vIGxvbmdlciBzdGF0aWMuCi0KLVRodSBBcHIgMjEgMTU6NTA6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFBlcm1pdCBicmFuY2hlcyB0byBiZSBzd2l0Y2hlZAotCXdpdGggdGhlIHByZWNlZGluZyBpbnN0cnVjdGlvbiBldmVuIGlmIC5zZXQgbm9ib3B0IGhhcyBiZWVuIHNlZW4uCi0JLnNldCBub2JvcHQgYWN0dWFsbHkgY29udHJvbHMgd2hldGhlciB0byBicmluZyB1cCBhbiBpbnN0cnVjdGlvbgotCWZyb20gdGhlIGJyYW5jaCB0YXJnZXQsIHdoaWNoIGdhcyBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydC4KLQotV2VkIEFwciAyMCAxODo0NjoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCwgY29uZmlnL29iai1jb2ZmLmM6IERlbGV0ZWQgYWxsIGNvZGUgdXNlZCBvbmx5Ci0Jd2hlbiBCRkRfQVNTRU1CTEVSIGlzIG5vdCBkZWZpbmVkLCBhbmQgYWxsIGNvbmRpdGlvbmFscyByZWxhdGluZwotCXRvIHN1Y2ggY29kZS4gIE5vIHN1Y2ggdGFyZ2V0cyByZW1haW4uCi0KLQlGaXhlcyBmb3Igc3RhYnMtaW4tY29mZjoKLQkqIGNvbmZpZy9vYmotY29mZi5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkoY29mZl9mcm9iX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uLAotCWNvZmZfZnJvYl9zZWN0aW9uKTogRGVjbGFyZS4KLQkob2JqX2Zyb2Jfc2VjdGlvbik6IE5ldyBtYWNybzsgdXNlcyBjb2ZmX2Zyb2Jfc2VjdGlvbi4KLQkoSU5JVF9TVEFCX1NFQ1RJT04pOiBOZXcgbWFjcm87IHVzZXMgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zZWN0aW9uX2FsaWduKTogQWx3YXlzIHJvdW5kIHVwIHRvCi0JbXVsdGlwbGUgb2YgYWxpZ25tZW50IHBvd2VyIHNwZWNpZmllZCBpbiBiZmQgdGFyZ2V0IHZlY3Rvci4KLQotCSogZ2FzcC5jOiBJbmNsdWRlIGN0eXBlLmguCi0KLU1vbiBBcHIgMTggMjE6MDg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluLCBkb2MvYXMudGV4aW5mbzogUmVuYW1lZCBhc2RvYy1jb25maWcudGV4aSB0bwotCWFzY29uZmlnLnRleGkuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvLWFzLCBpbnN0YWxsLWluZm8tZ2FzcCk6IEdldCBmaWxlCi0JbmFtZXMgZnJvbSBzb3VyY2UgZGlyZWN0b3J5IHdpdGhvdXQgcGF0aG5hbWUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IFdoaWxlIGxvb2tpbmcgZm9yCi0JcmVnaXN0ZXIgbWFzaywgc2tpcCBlbXB0eSBmaWxsIGZyYWdzIGNhdXNlZCBieSBlbmFibGluZyBsaXN0aW5nCi0Jb3V0cHV0LgotCi0JKiBjb25maWcvaG8tc3lzdi5oOiBJbmNsdWRlIHN0cmluZy5oLgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IE5ldyAod2VsbCwgcmVjZW50bHkgYWRkZWQpIGZpbGUuICBKdXN0IGFkZGVkCi0JaW5mbyBvbiBhc193YXJuIGFuZCBmcmllbmRzLgotCi1Nb24gQXByIDE4IDE0OjI4OjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogVXNlIHRoZSBidWlsdC1pbgotCWRlZmF1bHRzIGZvciBkZWZpbmVkLCBwcml2YXRlLCBhbmQgc3BudW0gZmllbGRzIGZvciB0aGUKLQkkVEVYVCQgYW5kICRQUklWQVRFJCBzcGFjZXMuICBEbyBub3QgY2xvYmJlciBzcG51bS4gIERvCi0Jbm90IHJlc2V0IHRoZSBzZWdtZW50IGlmIGp1c3QgdXBkYXRpbmcgYSBzcGFjZS4KLQkocGFfc3BhY2VzX2JlZ2luKTogU2V0IEJGRCBzZWN0aW9uIGZsYWdzIGZvciBhbGwgYnVpbHQtaW4KLQlzdWJzcGFjZXMuCi0KLUZyaSBBcHIgMTUgMTA6NTE6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChmaXJzdF9wcm9jX3B0cik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFkZF9wcm9jZWR1cmUpOiBTZXQgZmlyc3RfcHJvY19wdHIgaWYgaXQgaGFzbid0IGJlZW4gc2V0LgotCShlY29mZl9idWlsZF9saW5lbm8pOiBJZiB0aGUgZmlyc3QgcHJvY2VkdXJlIGRvZXMgbm90IHN0YXJ0IGF0Ci0JYWRkcmVzcyB6ZXJvLCBpbnNlcnQgYSBkdW1teSBsaW5lIHRvIGNvbXBlbnNhdGUuCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBNYWtlIGdhc3AubmV3Ci0JYXMgd2VsbCBhcyBhcy5uZXcuCi0KLVRodSBBcHIgMTQgMTU6MTI6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChvcGVyYW5kKTogVHJ5IHRvIHBhcnNlICIwZiIgYW5kICIwYiIgc2VxdWVuY2VzIGFzCi0JZmxvYXRpbmcgcG9pbnQgYW5kIGJpbmFyeSBudW1iZXJzIHJlc3BlY3RpdmVseTsgaWYgaXQgZG9lc24ndAotCXdvcmssIHRyZWF0IHRoZW0gYXMgbG9jYWwgbGFiZWxzLgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSAkKE9CSlMpIGRlcGVuZCBvbiAkKEFMTF9PQkpfREVQUykuCi0JKiBjb25maWd1cmUuaW46IFNldCBBTExfT0JKX0RFUFMgaW4gb3V0cHV0IE1ha2VmaWxlLgotCi0JQmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSA8QkFJTEVZQGhtaXZheC5odW1nZW4udXBlbm4uZWR1PgotCShDaGFybGVzIEJhaWxleSk6Ci0JKiB2bXNjb25mLnNoOiBJbiBnZW5lcmF0ZWQgZmlsZSwgZ2V0ICIub2JqIiBzdWZmaXggcmlnaHQsIGJ1aWxkCi0Jc291cmNlIGZpbGVzIGZyb20gb3RoZXIgZGlyZWN0b3JpZXMgaW50byBvYmplY3RzIGluIHRoZSBjdXJyZW50Ci0JZGlyZWN0b3J5LCBhbmQgc3BlY2lmeSBQU0VDVCBhdHRyaWJ1dGVzIGV4cGxpY2l0bHkgdG8gbGlua2VyLgotCUFsc28gYWRkZWQgbWlzc2luZyBsYWJlbC4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1tay5jb20pOiBSZWZlcmVuY2UgbmV3IHZhcmlhYmxlCi0JVk1TX09USEVSX09CSlMgZm9yIGxpc3Qgb2Ygbm9uLWxvY2FsIG9iamVjdCBmaWxlcywgaW5zdGVhZCBvZgotCWxpc3RpbmcgdGhlbSBoZXJlLgotCShWTVNfT1RIRVJfT0JKUyk6IE5ldyB2YXJpYWJsZSwgYWRkZWQgbW9yZSBsaWJpYmVydHkgZmlsZXMuCi0JKiBtYWtlLWdhcy5jb206IFJlZ2VuZXJhdGVkLgotCi0JKiBjb25maWcvaG8tdm1zLmggKHVubGluayk6IERlZmluZSBhcyBkZWxldGUuCi0KLQkqIGNvbmZpZy1nYXMuY29tOiBGaXggcXVvdGluZyBvbiBUQVJHRVRfQ0FOT05JQ0FMIGRlZmluaXRpb24uCi0JRGVsZXRlIGZpbGVzIGJlZm9yZSBjcmVhdGluZyB0aGVtLgotCi1UaHUgQXByIDE0IDEzOjM0OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRlLXN0YWdlMSwgZGUtc3RhZ2UyLCBkZS1zdGFnZTMpOiBVc2Ugcm0gLWYuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogUGVybWl0IEJGRF9SRUxPQ19QQ1JFTF9MTzE2IGZvcgotCWNlcnRhaW4gY2FzZXMgb2YgJ2knLCAnaicgYW5kICdvJy4gIENoYW5nZSAndScgdG8gdGFrZSBhbgotCWFyZ3VtZW50LCB0aGUgcmVsb2MgdHlwZS4KLQkobG9hZF9yZWdpc3Rlcik6IFBhc3MgcmVsb2MgdHlwZSB0byBtYWNyb19idWlsZCBmb3IgJ3UnLgotCShtYWNybyk6IExpa2V3aXNlLiAgRm9yIE1fTEFfQUIgcGVybWl0IGEgZGlmZmVyZW5jZSBleHByZXNzaW9uCi0Jd2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlIGJldHdlZW4gYW4gYXJiaXRyYXJ5IHN5bWJvbCBhbmQKLQlhIHN5bWJvbCBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBhbmQKLQlCRkRfUkVMT0NfUENSRUxfTE8xNiB0byBiZSBlbWl0dGVkLgotCShtZF9hcHBseV9maXgpOiBDaGVjayB0aGF0IG1vc3QgcmVsb2NzIGFyZSBub3QgUEMgcmVsYXRpdmUuCi0JSGFuZGxlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MgYW5kIEJGRF9SRUxPQ19QQ1JFTF9MTzE2LgotCSh0Y19nZW5fcmVsb2MpOiBDaGFuZ2UgI2Vycm9yIHRvIGFzX2ZhdGFsLiAgSGFuZGxlCi0JQkZEX1JFTE9DX1BDUkVMX0xPMTYgYW5kIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MuCi0KLVR1ZSBBcHIgMTIgMTg6MjU6MTMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ3NfYmVnaW4pOiBDYWxsIG1lbXNldCB3aXRoIGFyZ3MgaW4gdGhlIGNvcnJlY3QKLQlvcmRlci4KLQkoc3Vic2VnX2dldCk6IENsZWFyIG5ld2x5IGFsbG9jYXRlZCBzZWdpbmZvLCBzZXQgaXRzIHBvaW50ZXIgc2xvdHMKLQl0byBOVUxMIGluc3RlYWQgb2YgMC4KLQotTW9uIEFwciAxMSAwOTowMDo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvY2VuZCk6IEhhbmRsZSBjYXNlIHdoZXJlIGxhYmVsIHdhcwotCWRlZmluZWQgYWZ0ZXIgdGhlIC5wcm9jIGRpcmVjdGl2ZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvY2VuZCk6IEdpdmUgYW4gZXJyb3IgaWYgd2UgZW5jb3VudGVyIGEKLQlwcm9jZW5kIGZvciBhIHByb2NlZHVyZSB3aXRob3V0IGEgbmFtZS4KLQotVGh1IEFwciAgNyAxNDoyODozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogUGFzcyBOVUxMIGZvciBleHByZXNzaW9uIGFyZ3VtZW50IHRvCi0JbWFjcm9fYnVpbGQgZm9yIG5vcmkgY2FzZS4KLQkoU1dJVENIX1RBQkxFKTogRGVmaW5lLgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBhIHJlbG9jYXRpb24gZm9yIGEgc3dpdGNoIHRhYmxlCi0JZW50cnkuCi0JKG1kX2FwcGx5X2ZpeCk6IFdyaXRlIHN3aXRjaCB0YWJsZSBlbnRyeSB2YWx1ZSBpbnRvIGZpbGUuCi0JKHRjX2dlbl9yZWxvYyk6IFVzZSBCRkRfUkVMT0NfR1BSRUwzMiBmb3IgYSBzd2l0Y2ggdGFibGUgZW50cnksCi0JYW5kIHNldCB0aGUgYWRkZW5kIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kCi0JdGhlIHN1YnRyYWhlbmQuCi0KLVRodSBBcHIgIDcgMTA6Mzg6MTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl90Y19zeW1ib2wpOiBEZWxldGUuICBObyBsb25nZXIgdXNlZC4KLQkoZWxmX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zLCBocHBhX3RjX3N5bWJvbCk6IERlbGV0ZSBleHRlcm4gZGVjbHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IERlbGV0ZSBmdW5jdGlvbi4KLQkoaHBwYV90Y19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IERlbGV0ZSBlbGZfdGNfc3ltYm9sIGFuZAotCWVsZl90Y19tYWtlX3NlY3Rpb25zIHN0dWZmLiAgSXQgd2FzIHRoZXJlIHRvIHN1cHBvcnQgUEEgYnJhaW5kYW1hZ2UKLQl3aGljaCBoYXMgYmVlbiBmaXhlZCwgYW5kIGluIHRoZSBjYXNlIG9mIGVsZl90Y19tYWtlX3NlY3Rpb25zIGlzCi0JcmVkdW5kYW50IHdpdGggZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcuCi0KLVdlZCBBcHIgIDYgMjA6NDg6MzAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qZWxmKik6IERvbid0IHJlcXVpcmUgIi1ocC0iIGZvciB0aGUKLQltYW51ZmFjdHVyZXIuCi0KLVR1ZSBBcHIgIDUgMTU6NDg6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRm9yIGNhc2UgJ28nLCB3aGVuIGdlbmVyYXRpbmcKLQllbWJlZGRlZCBQSUMgY29kZSwgYWNjZXB0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxvY2FsIHN5bWJvbHMKLQlhcyBiZWluZyBjb25zdGFudC4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogT25seSBmb3JjZSBhIHJlbG9jIHRvIGJlIGdlbmVyYXRlZCBmb3IgYQotCVBDIHJlbGF0aXZlIGZpeHVwLgotCShtZF9hcHBseV9maXgpOiBGb3IgQkZEX1JFTE9DXzMyIGFuZCBCRkRfUkVMT0NfTE8xNiwgcHV0IHRoZSBmaXh1cAotCXZhbHVlIGludG8gdGhlIGZpbGUgaWYgdGhlIGZpeHVwIHdpbGwgbm90IGdlbmVyYXRlIGEgcmVsb2MuCi0KLVR1ZSBBcHIgIDUgMTE6MTQ6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogSWYgc2VjdGlvbiBwYXNzZWQgaXNuJ3QgYnNzLAotCWRvbid0IHNwZXcgcmVtYWluZGVyIG9mIGlucHV0IGZpbGUgaW4gZXJyb3IgbWVzc2FnZS4KLQkodGNfZ2VuX3JlbG9jKTogSWYgYmZkX3JlbG9jX3R5cGVfbG9va3VwIHJldHVybnMgbnVsbCwgcHJpbnQgZXJyb3IKLQltZXNzYWdlIHdpdGggcmVsb2MgdHlwZSBhbmQgdHJ5IHRvIHByb2Nlc3MgcmVtYWluZGVyIG9mIGZpbGUuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvLWFzLCBpbnN0YWxsLWluZm8tZ2FzcCk6IE5ldwotCXRhcmdldHMsIG5vdyBleHBsaWNpdGx5IGNoZWNraW5nICQoc3JjZGlyKSBmb3IgaW5mbyBmaWxlcy4KLQkoaW5zdGFsbC1pbmZvKTogRGVwZW5kIG9uIGJvdGggb2YgdGhlbTsgZG8gbm90aGluZyBtb3JlLgotCi1Nb24gQXByICA0IDE3OjA2OjA0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCB0aGlua28gaW4gRUxGIHZlcnNpb24uCi0KLU1vbiBBcHIgIDQgMTI6Mzk6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19pbnNlcnRfb3BlcmFuZCk6IENoZWNrIFBQQ19PUEVSQU5EX1NJR05FRAotCWZsYWcgcmF0aGVyIHRoYW4gc2lnbmVkcCBmaWVsZC4gIE9ubHkgcGVybWl0IGV4dGVuZGVkIHJhbmdlIGlmCi0JUFBDX09QRVJBTkRfU0lHTk9QVCBmbGFnIGlzIHNldCBhbmQgYXNzZW1ibGluZyBpbiAzMiBiaXQgbW9kZS4KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIERhdmlkIEVkZWxzb2huIChlZGVsc29obkBucGFjLnN5ci5lZHUpLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19zaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHBjX2FyY2gpOiBDaGVjayBmb3IgUFBDX09QQ09ERV9QUEMgYmVmb3JlIFBQQ19PUENPREVfUE9XRVIuCi0JKG1kX2JlZ2luKTogSWYgYW4gaW5zdHJ1Y3Rpb24gaGFzIGEgc2l6ZSBzcGVjaWZpYyBmbGFnIHNldCwgb25seQotCWFkZCBpdCBpZiB3ZSBhcmUgYXNzZW1ibGluZyB0aGF0IHNpemUuCi0KLVRodSBNYXIgMzEgMTY6NTE6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogQWRkIGEgZ3J1ZXNvbWUgaGFjayB0byBnZXQKLQljcm9zcyBzZWN0aW9uIFBDIHJlbGF0aXZlIHJlbG9jcyByaWdodCBmb3IgQ09GRiBhbmQgRUxGLgotCi1Nb24gTWFyIDI4IDE0OjM4OjIzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogQWx3YXlzIGRlZmluZS4KLQkoT0JKX1BST0NFU1NfU1RBQik6IERvbid0IGRlZmluZS4KLQotTW9uIE1hciAyOCAxMjo0MDoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbHMpOiBEb24ndCBsZXQgQkZEIGNsb2JiZXIKLQl0aGUgdHlwZSBvZiBzeW1ib2wgc2V0IHN5bWJvbHMgd2hpY2ggaGFwcGVuIHRvIGJlIGluIHRoZSBhYnNvbHV0ZQotCW9yIHVuZGVmaW5lZCBzZWN0aW9uLgotCi1Nb24gTWFyIDI4IDEyOjM1OjAwIDE5OTQgIERhdmlkIEVkZWxzb2huICAoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KQotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCAtbXB3cnggKFBPV0VSLzIgYWthCi0JUklPUzIpLCAtbXB3ciAoUE9XRVIgYWthIFJJT1MxKSwgLW1wcGMgKFBvd2VyUEMgYWthIE1QQzYwMy82MDQpLAotCWFuZCAtbWFueSAoYWxsIGFyY2hpdGVjdHVyZXMpLgotCi1TdW4gTWFyIDI3IDE0OjA0OjE5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBTZXQgYWRkZW5kIGZvciByZWxvY2F0aW9uCi0JaW52b2x2aW5nIGEgZnVuY3Rpb24gc3ltYm9sIHdoaWNoIGlzIG5vdCBhIHBsYWJlbCB0byB6ZXJvLgotCShtZF9hcHBseV9maXgpOiBOZXZlciBwYXNzIGEgZnVuY3Rpb24gc3ltYm9sIHRvIGZpZWxkX2FkanVzdC4KLQotRnJpIE1hciAyNSAxNzozNTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IElmIE5fRVhUIGlzIHNldCBmb3IgYW4KLQlOX0lORFIgc3ltYm9sLCBzZXQgQlNGX0VYUE9SVCBhbmQgY2xlYXIgQlNGX0xPQ0FMLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IElmIEVNQkVEREVEX1BJQywgZG9uJ3Qgc3dhcCBhCi0JYnJhbmNoIHdpdGggYW4gaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzICRhdCwgaW4gY2FzZSB0aGUgYnJhbmNoIGlzCi0JbGF0ZXIgZXhwYW5kZWQuCi0JKG1hY3JvKTogSWYgRU1CRURERURfUElDLCBjYXNlIE1fSkFMX0EgbWF5IHVzZSAkYXQuCi0JKG1kX3BjcmVsX2Zyb20pOiBJZiBub3QgT0JKX0FPVVQsIHJldHVybiA0IGZvciBhbiB1bmRlZmluZWQgc3ltYm9sCi0JdG8gbWFrZSBpdCBwY3JlbF9vZmZzZXQuCi0JKHRjX2dlbl9yZWxvYyk6IElmIG5vdCBPQkpfQU9VVCwgc2V0IHRoZSByZWxvYyBhZGRlbmQgdG8KLQlyZWxvYy0+YWRkcmVzczsgYW5vdGhlciBncnVlc29tZSBoYWNrIHRvIGdldCBnYXMgcmVsb2MgaGFuZGxpbmcgdG8KLQlkbyB0aGUgcmlnaHQgdGhpbmcuCi0KLVRodSBNYXIgMjQgMjE6Mjk6MjkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogT25seSBzZXQgR1AgcHJvbG9nIHNpemUgaWYgdXNpbmcKLQlQViByZWdpc3Rlci4KLQkoVDEyKTogTmV3IG1hY3JvLgotCShlbWl0X2luc24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogQ2FsbCBpdC4KLQkoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IEhhbmRsZSBCRkRfUkVMT0NfMjYsIGZvciBjYWxsX3BhbAotCWluc3RydWN0aW9ucy4KLQkobGl0dXNlX3BlbmRpbmcpOiBOZXcgdmFyaWFibGUuICBTZXQgYnkgYW55dGhpbmcgdGhhdCBnZW5lcmF0ZXMgYQotCUxJVEVSQUwgcmVsb2MsIGNsZWFyZWQgYnkgYW55dGhpbmcgdGhhdCBnZW5lcmF0ZXMgYSBMSVRVU0UgcmVsb2MsCi0JdGVzdGVkIGJ5IGNvZGUgdGhhdCBtaWdodCB3YW50IHRvIGVtaXQgYSBMSVRVU0UgcmVsb2MuCi0JKGVtaXRfdW5hbGlnbmVkX2lvKTogTmV3IGZ1bmN0aW9uLiAgQ3VycmVudGx5IGNhbGxzIG1kX2Fzc2VtYmxlLAotCWJ1dCBpdCBzaG91bGQgZXZlbnR1YWxseSBiZSBjb252ZXJ0ZWQgdG8gZ2VuZXJhdGUgdGhlIGluc24gaXRzZWxmCi0JYW5kIGNhbGwgZW1pdF9pbnNuIGRpcmVjdGx5LgotCShlbWl0X2xvYWRfdW5hbCwgZW1pdF9zdG9yZV91bmFsLCBlbWl0X2J5dGVfbWFuaXBfciwKLQllbWl0X2V4dHJhY3RfciwgZW1pdF9pbnNlcnRfciwgZW1pdF9tYXNrX3IsIGVtaXRfc2lnbl9leHRlbmQsCi0JZW1pdF9iaXNfcik6IExpa2V3aXNlLgotCShhbHBoYV9pcCwgY2FzZSAnSScpOiBIYW5kbGUgd2l0aCBCRkRfUkVMT0NfMjMuCi0JKGFscGhhX2lwLCBsYWJlbCBnZXRfbWFjcm8pOiBEb24ndCBlbWl0IHRoZSBmaW5hbCBpbnN0cnVjdGlvbiBpZgotCXRoZSBvcGNvZGUgaXMgemVyby4KLQkoYWxwaGFfaXAsIGNhc2UgJ0InLCBzdWJjYXNlICdkJyk6IE5ldyBjYXNlLCBmb3Igc3Vid29yZCBhbmQKLQl1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBtYWNyb3MuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfMjYuICBHZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIGlmCi0JdGhlIHZhbHVlIGNhbid0IGJlIHJlc29sdmVkLgotCi1XZWQgTWFyIDIzIDE2OjA2OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogRm9yIC1tZW1iZWRkZWQtcGljLCBmb3JjZQotCXRoZSAtRyB2YWx1ZSB0byAweDdmZmZmZmZmLiAgRm9yIFNWUjQgUElDIG9wdGlvbnMsIGRvbid0IGNhbGwKLQliZmRfc2V0X2dwX3NpemUgaGVyZSwgaXQncyBkb25lIGluIG1kX2JlZ2luLiAgRG9uJ3QgcGVybWl0IC1HIHdpdGgKLQktbWVtYmVkZGVkLXBpYy4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXgpOiBTZXQgZml4UC0+ZnhfZG9uZSBhcHByb3ByaWF0ZWx5LgotCShzX2NoYW5nZV9zZWMpOiBGb3IgRU1CRURERURfUElDLCBjaGFuZ2UgLmRhdGEgYW5kIC5yZGF0YSB0bwotCS5zZGF0YS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0JKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IERlY2xhcmUuCi0JKFRDX0hBTkRMRV9GWF9ET05FKTogRGVmaW5lLgotCi1UdWUgTWFyIDIyIDEzOjU4OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoZW51bSBtaXBzX3BpY19sZXZlbCk6IE5ldyBlbnVtLgotCShtaXBzX3BpYyk6IENoYW5nZSBmcm9tIGludCB0byBlbnVtIG1pcHNfcGljX2xldmVsLiAgQ2hhbmdlIGFsbAotCXVzZXMgKDAgYmVjb21lcyBOT19QSUMsIDIgYmVjb21lcyBTVlI0X1BJQykuCi0JKGxvYWRfYWRkcmVzcyk6IEhhbmRsZSBFTUJFRERFRF9QSUMuCi0JKG1hY3JvKTogSGFuZGxlIEVNQkVEREVEX1BJQyBpbiBhbGwgUElDIGNhc2VzLgotCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgLW1lbWJlZGRlZC1waWMgdG8gdXNlIEVNQkVEREVEX1BJQy4gIElmCi0JT0JKX0VMRiwgYWNjZXB0IC1LUElDIGFuZCAtY2FsbF9zaGFyZWQgdG8gdXNlIFNWUjRfUElDIGFuZCBhY2NlcHQKLQktbm9uX3NoYXJlZCB0byB1c2UgTk9fUElDICh0aGlzIGlzIGhvdyB0aGUgSXJpeCA1IGFzc2VtYmxlcgotCXdvcmtzKS4gIERvIG5vdCBwZXJtaXQgLUcgd2l0aCBTVlI0X1BJQy4KLQkoc19hYmljYWxscyk6IFdhcm4gaWYgLUcgd2FzIHVzZWQsIGFuZCBmb3JjZSAtRyAwLgotCSh0Y19nZW5fcmVsb2MpOiBTZXQgcmVsb2MtPmFkZGVuZCB0byAwIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGZvcgotCWFueXRoaW5nIGJ1dCBhLm91dCwgbm90IGp1c3QgZm9yIEVMRi4gIEZvciBFQ09GRiwgZG9uJ3QgZ2VuZXJhdGUgYQotCUJGRF9SRUxPQ18xNl9QQ1JFTF9TMiByZWxvYyB1bmxlc3MgdXNpbmcgRU1CRURERURfUElDLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IERlZmluZSB0byBiZSAxLgotCi1TdW4gTWFyIDIwIDE2OjMxOjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjcmVhdGVfbmV3X3NwYWNlKTogVXNlIGludHMsIG5vdCBjaGFycyBhcwotCXBhcmFtZXRlcnMgdG8gYXZvaWQgbG9zaW5nIHdoZW4gY29tcGlsaW5nIHdpdGggSFAgQ0MuCi0JKGNyZWF0ZV9uZXdfc3Vic3BhY2UsIHVwZGF0ZV9zdWJzcGFjZSwgZml4X25ld19ocHBhKTogTGlrZXdpc2UuCi0KLVN1biBNYXIgMjAgMTQ6NDM6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IElmIGBkZWZzJyBpcyBkZWZpbmVkLCBlbWl0IGEKLQlwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIHRvIGNyZWF0ZSBhIG1hY3JvIG5hbWVkIGJ5IHRoaXMgdmFsdWUgaW50bwotCWNvbmZpZy5uZXc7IGRvbid0IGV4cGxpY2l0bHkgZ28gZm9yIEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBgZGVmcycsIG5vdCBgQkZEREVGJy4gIFNldCBpdCB0bwotCU1BTllfU0VHTUVOVFMgZm9yIGFueSBvYmotY29mZmJmZCB0YXJnZXQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoQkZEX0hFQURFUlMsIEJGRCk6IERlZmluZS4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgQkZELCBNQU5ZX1NFR01FTlRTLAotCW9yIEJGRF9IRUFERVJTLgotCShMT0NBTF9MT0FETElCRVMpOiBEZWxldGVkLgotCSogY29uZmlnL202OGtjb2ZmLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSB0aG9zZSBtYWNyb3MuCi0JKiBjb25maWcvbTg4a2NvZmYubXQgKFRERUZJTkVTKTogRGl0dG8uCi0JKiBjb25maWcvZWJtb24yOWsubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaDgzMDBoZHMubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaWM5NjBjb2ZmLm10OiBEZWxldGVkLgotCSogY29uZmlnL3NwYXJjLm10OiBEZWxldGVkLgotCSogY29uZmlnL2g4MzAwLm10IChMT0NBTF9MT0FETElCRVMsIFRERUZJTkVTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9oODUwMC5tdCAoTE9DQUxfTE9BRExJQkVTLCBUREVGSU5FUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvc2gubXQgKExPQ0FMX0xPQURMSUJFUywgVERFRklORVMpOiBEZWxldGVkLgotCSogY29uZmlnL3o4ay5tdCAoTE9DQUxfTE9BRExJQkVTKTogRGVsZXRlZC4KLQkoVERFRklORVMpOiBEb24ndCBkZWZpbmUgdGhlIGNvZmZiZmQgbWFjcm9zLgotCi0JKiBNYWtlZmlsZS5pbjogSW5zZXJ0IG1ha2VmaWxlIGZyYWdtZW50cyBiZWZvcmUgT0JKUyBkZWZpbml0aW9uLgotCShPQkpTKTogQWRkICQoVEVfT0JKUykuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogU3VwcGx5ICJzZWN0aW9uIgotCXVuY29uZGl0aW9uYWxseS4KLQotCSogd3JpdGUuYyAoc2V0X3N5bXRhYik6IERlZmluZSBvbmx5IGlmIEJGRF9BU1NFTUJMRVIuCi0KLVN1biBNYXIgMjAgMTI6MDY6MDUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChTVEFHRVNUVUZGKTogQWRkIGdhc3AubmV3LgotCi1GcmkgTWFyIDE4IDIwOjA5OjE2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHN5bWJvbF90YWJsZV9mcm96ZW4pOiBOZXcgdmFyaWFibGUsIHRvIGJlIHNldCBhZnRlcgotCWJmZF9zZXRfc3ltdGFiIGlzIGNhbGxlZC4KLQkoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IE5vdGUgd2hldGhlciBhIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sCi0Jb3Igbm90LgotCShhZGp1c3RfcmVsb2Nfc3ltcyk6IEZvciBub3csIGFsd2F5cyBzdXBwbHkgYW4gYWJzb2x1dGUgc3ltYm9sIGZvcgotCWZpeHVwcyB3aXRob3V0IHN5bWJvbHMgYnV0IG5vdCB5ZXQgYGRvbmUnLiAgVXNlIHNlY3Rpb25fc3ltYm9sIHRvCi0JZ2V0IHRoZSBzeW1ib2wsIGluc3RlYWQgb2YgZ29pbmcgZGlyZWN0bHkgZm9yIGFic19zeW1ib2wuCi0JKHdyaXRlX3JlbG9jcykgW0RFQlVHNF06IEFib3J0IGlmIGFueSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgYQotCXJlbG9jIGlzIG5vdCBhIHNlY3Rpb24gc3ltYm9sIGFuZCBpcyBub3QgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQkoc2V0X3N5bXRhYik6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBmcm9tIHdyaXRlX29iamVjdF9maWxlLgotCUNvdW50cyBzeW1ib2wgdGFibGUgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGFuIGVhcmxpZXIgY291bnQuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCBzZXRfc3ltdGFiLCBidXQgZG8gaXQgYWZ0ZXIgcG90ZW50aWFsbHkKLQlpbnZva2luZyB0aGUgKl9mcm9iX2ZpbGUgbWFjcm9zLiAgRG9uJ3QgYm90aGVyIGNvdW50aW5nIHN5bWJvbHMuCi0JQ2FsbCBzeW1ib2xfcmVtb3ZlLCBpbnN0ZWFkIG9mIGV4cGFuZGluZyBpdCBpbiBwbGFjZS4gIE1vdmVkIHRoZQotCWNvbmRpdGlvbmFsaXplZCBgb2JqZWN0X2ZpbGVfc2l6ZScgZGVjbGFyYXRpb24gZG93biB0bwotCWNvbmRpdGlvbmFsaXplZCBibG9jayB3aGVyZSBpdCdzIHVzZWQuICBXaGVuIHVzaW5nIHRoZSBhYnNvbHV0ZQotCXN5bWJvbCBmb3IgYSBmaXh1cCB3aXRob3V0IGEgc3ltYm9sLCBzZXQgc3lfdXNlZF9pbl9yZWxvYy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpIFtCRkRfQVNTRU1CTEVSXTogQ2FsbCBzZWN0aW9uX3N5bWJvbCB0byBnZXQKLQl0aGUgY29ycmVjdCBzeW1ib2wgZm9yIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogVXNlIHN5bWJvbF9uZXcgaW5zdGVhZCBvZgotCXN5bWJvbF9tYWtlLCBzaW5jZSB3ZSBtYXkgd2FudCBpdCB0byBnbyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCi0JTWFrZSB0aGUgbmV3IHN5bWJvbCBoYXZlIGludGVybmFsIGxpbmthZ2UuICBJZgotCW9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyBzYXlzIGl0J3Mgb2theSwgdXNlIHRoZSBCRkQgc2VjdGlvbgotCXN5bWJvbCB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIEdBUyBzeW1ib2wuCi0JKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IERlZmF1bHQgdG8gYWx3YXlzIHJldHVybmluZyAwLgotCSogY29uZmlnL29iai1hb3V0LmggKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYykgW0JGRF9BU1NFTUJMRVJdOgotCU5ldyBtYWNyby4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL3RjLXNwYXJjLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShpbl9zaWduZWRfcmFuZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogVXNlIGl0LgotCShzcGFyY19pcCwgY2FzZSAnaScpOiBVc2UgQkZEX1JFTE9DX1NQQVJDMTMsIG5vdCBfQkFTRTEzLgotCShzcGFyY19pcCwgbGFiZWwgImltbWVkaWF0ZSIpOiBSZWplY3QgY29uc3RhbnRzIGZvciBwY3JlbAotCWluc3RydWN0aW9ucyBvbmx5IGlmIHRoZSByZWxvY2F0aW9uIHR5cGUgaW5kaWNhdGVzIGEgImNhbGwiCi0JaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvZmZzZXQgaXMgd2l0aGluIHJhbmdlIG9mIGEgImptcGwgJWcwIi4gIElmCi0JaXQncyBub3QgaW4gcmFuZ2UsIHVzZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wgcGx1cyBhbiBvZmZzZXQuCi0JKG1kX2FwcGx5X2ZpeCk6IFVzZSBpbl9zaWduZWRfcmFuZ2UuICBDb21iaW5lZCBfU1BBUkMxMyBhbmQKLQlfQkFTRTEzIGNhc2VzLgotCSh0Y19nZW5fcmVsb2MpOiBQZXJtaXQgQkZEX1JFTE9DX1NQQVJDMTMuCi0KLQkqIGNvbmZpZy9pYzk2MGNvZmYubXQgKFRERUZJTkVTKTogRml4ZWQgdHlwbyAoTUFOWV9TRUNUSU9OUywgbm90Ci0JTUFOWV9TRUdNRU5UUykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRWxpbWluYXRlZCBhbGwgdGFyZ2V0cyB1c2luZyBvYmotY29mZiBidXQgbm90Ci0JZGVmaW5pbmcgQkZEX0FTU0VNQkxFUjsgSSB0aGluayBhbGwgc3VjaCB0YXJnZXRzIHRoYXQgYXJlCi0Jc3VwcG9ydGVkIHdpbGwgYmUgbWF0Y2hlZCBieSByZWFsIENQVS1PUyBjb21iaW5hdGlvbnMgZWFybGllciBpbgotCXRoZSBjYXNlIHN0YXRlbWVudC4KLQkodGFyZ2V0cyAqLSotY29mZiosICotc3lzdiosICotKi1zY28qLCAqLSotc3lzdjMyKTogRGVsZXRlZC4gIE1hZGUKLQlzb21lIGNvbW1lbnRzIGFib3V0IHRoZSBkcHgyIGNvbmZpZ3VyYXRpb24sIGJ1dCBsZWZ0IGl0IGRpc2FibGVkLAotCXNpbmNlIGl0IGNvdWxkbid0IGJlIHJlYWNoZWQgYmVmb3JlLgotCSh0YXJnZXQgYTI5ay1hbWQtZWJtb25vbGQpOiBEZWxldGVkLgotCi1UaHUgTWFyIDE3IDEzOjM2OjA5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pbXBvcnQpOiBDb3JyZWN0bHkgaGFuZGxlIGltcG9ydGluZyBvZiBhbgotCWFscmVhZHkgZGVmaW5lZCBzeW1ib2wuCi0KLVdlZCBNYXIgMTYgMTc6MTE6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogT25seSBhY2NlcHQgb3Zlcmx5IGxhcmdlIHZhbHVlcyBmb3IKLQl0aGUgJ2onIG9wZXJhbmQgaWYgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgYWx0ZXJuYXRpdmVzIGZvciB0aGlzCi0JaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChhZGp1c3Rfc3RhYl9zZWN0aW9uKTogSW5pdGlhbGl6ZQotCXN0YWJzdHJzZWcgdG8gU0VHX1VOS05PV04sIG5vdCAtMS4gIEFmdGVyIGxvb3AsIGNoZWNrIHdoZXRoZXIgaXQKLQlpcyBub3QgU0VHX1VOS05PV04gcmF0aGVyIHRoYW4gY2hlY2tpbmcgd2hldGhlciBpdCBpcyA+PSAwLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2FsaWduKTogVGFrZSBuZXcgYXJndW1lbnQsIGxhYmVsLCBhbmQgdXNlCi0JaXQgaW5zdGVhZCBvZiBnbG9iYWwgaW5zbl9sYWJlbC4KLQkoc19hbGlnbiwgc19jb25zLCBzX2Zsb2F0X2NvbnMsIHNfZ3B3b3JkKTogU2F2ZSBpbnNuX2xhYmVsIGJlZm9yZQotCWNhbGwgdG8gbWlwc19lbWl0X2RlbGF5IGFuZCBwYXNzIGl0IHRvIG1pcHNfYWxpZ24uCi0KLVdlZCBNYXIgMTYgMTE6NTQ6MTIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2VxdSk6IEhhbmRsZSBib3RoIC5yZWcgYW5kIC5lcXUgY29ycmVjdGx5LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jYWxsaW5mbyk6IEFjY2VwdCAibWlsbGljb2RlIiBhcyBhbgotCWFyZ3VtZW50IHRvIGEgLmNhbGxpbmZvIGRpcmVjdGl2ZS4gIERvbid0IGxvb3AgZm9yZXZlciBvbiBlcnJvcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2VxdSk6IFVzZSBwYV9wYXJzZV9udW1iZXIgc28gdGhhdCB3ZSBjYW4KLQl1c2UgcHJlLWRlZmluZWQgcmVnaXN0ZXJzIGFzIGFyZ3VtZW50cy4KLQotTW9uIE1hciAxNCAxNDoyOTo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENoZWNrIGJvdGggU19JU19MT0NBTCBhbmQKLQlTX0lTX0VYVEVSTkFMIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBkaXNjYXJkIGEgc3ltYm9sLgotCi0JKiBjb25maWctZ2FzLmNvbTogU2NhbiBNYWtlZmlsZS5pbiwgbm90IHZlcnNpb24uYywgZm9yIGN1cnJlbnQKLQl2ZXJzaW9uIG51bWJlci4gIERlbGV0ZSBhbGwgdmVyc2lvbnMgb2YgdGVtcCBmaWxlcyB3aGVuIGZpbmlzaGVkCi0Jd2l0aCB0aGVtLiAgQ3JlYXRlIGNvbmZpZy5oLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplKTogQ2FjaGUgc3ltYm9sCi0JdmFsdWVzIHRvIHJlZHVjZSBudW1iZXIgb2YgbG9va3VwcyB3aXRoIFNfR0VUX1ZBTFVFLiAgU2tpcCBkZWJ1ZwotCXN5bWJvbHMgdG8gYXZvaWQgImEgcmVhbGx5IG5hc3R5IGJ1ZyIuICAoRnJvbSBIb2xnZXIgVGV1dHNjaCwKLQlob2xnZXJAYm90YnNvLnJoZWluLW1haW4uZGUuKQotCShWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBGb3IgIl9fdnQuKiIgc3ltYm9scywgc2V0IFNfR0VUX09USEVSCi0JZmllbGQuICAoQWxzbyBmcm9tIEhvbGdlciBUZXV0c2NoLikgIFdhdGNoIGZvciBhIHdvdWxkLWJlIHJlZ2lzdGVyCi0JbWFzayB0aGF0IHNwYW5zIGZyYWdzLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfbGluZSk6IFNldCBzeW1ib2wgbG5ubyBmaWVsZCB3aXRoCi0JdGhpc19iYXNlLCBub3QgbGluZV9iYXNlLiAgKFBhdGNoIGZyb20gQW5kcmVhcyBBcmVucywKLQlhcmlAb2JlbGl4LmF2LnJ3dGgtYWFjaGVuLmRlLikKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBSZXRhaW4gc3ltYm9scyB0aGF0Ci0JbG9vayBsb2NhbCBpZiB0aGV5J3JlIGV4cG9ydGVkIG9yIHVuZGVmaW5lZC4gIFVzZWQgdG8gYmUgZG9uZSBmb3IKLQlpOTYwIG9ubHkuCi0KLQkqIHJlYWQuYyAoc19sY29tbSwgc19jb21tKTogUHJpbnQgc3ltYm9sIG5hbWUgYmVpbmcgcmVkZWZpbmVkLgotCUdldCBpdCBmcm9tIHRoZSBsb29rZWQtdXAgc3ltYm9sLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBzdHJpbmcgZnJvbQotCXRoZSBpbnB1dCBzdHJlYW0sIHdoaWNoIGlzIG5vIGxvbmdlciBudWxsLXRlcm1pbmF0ZWQuCi0JKExFWF9QQ1QpOiBOZXcgbWFjcm8sIGRlZmF1bHRzIHRvIDAuCi0JKGxleF90eXBlKTogVXNlIGl0IGZvciBgJScuCi0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIGAtaCMnIG9wdGlvbiBmb3IgVk1TLgotCSh2aXBfb3ApOiBOb3cgc3RhdGljLCBhbmQgcmV0dXJucyB2b2lkLiAgQ2FsbGVycyBjaGFuZ2VkLiAgQWRkZWQKLQlmb3J3YXJkIGRlY2wuCi0JKHZpcCk6IERpdHRvLiAgQ2FsbCBhc19mYXRhbCBkaXJlY3RseSBpZiBhIHByb2dyYW0gYnVnIGlzCi0JZGV0ZWN0ZWQuCi0JKG9wX2hhc2gpOiBMZXQgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBzdWZmaWNlLgotCi0JKiBNYWtlZmlsZS5pbiAobGl0ZXJhbC5vKTogUHJvdmlkZSBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IG5ldyBtYWtlZmlsZSB2YXJpYWJsZSBPUENPREVTX0xJQi4KLQkqIE1ha2VmaWxlLmluIChMSUJTKTogVXNlIGl0LgotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nYXMuY29tLCBzdGFtcC1tay5jb20pOiBOZXcgdGFyZ2V0cy4KLQkqIHZtc2NvbmYuc2g6IE5ldyBmaWxlLgotCSogbWFrZS1nYXMuY29tOiBSZWdlbmVyYXRlZCBmcm9tIG5ldyBzY3JpcHQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbHlueG9zKik6IEhhbmRsZSBhbnkgdmVyc2lvbiBudW1iZXIKLQlzdWZmaXggYWZ0ZXIgImx5bnhvcyIuICBTZXQgZW11bGF0aW9uIHRvIGx5bnguCi0KLU1vbiBNYXIgMTQgMTE6MzA6NDkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCi1GcmkgTWFyIDExIDIyOjI1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wY3JlbF9mcm9tKTogUmV0dXJuIDAgZm9yIHVuZGVmaW5lZCBFTEYKLQlzeW1ib2xzLgotCShwcGNfaXNfdG9jX3N5bSk6IENoYW5nZSAudG9jIHRvIC5nb3QuCi0JKG1kX2FwcGx5X2ZpeCk6IENoYW5nZSBoYW5kbGluZyBvZiBFTEYgcmVsb2NzLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotRnJpIE1hciAxMSAxNzo0MjoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDbG9zZV9WTVNfT2JqZWN0X0ZpbGUpOiBBZGQgY29tbWVudCBwb2ludGluZwotCW91dCBzb21lIGNvZGUgdGhhdCBkb2Vzbid0IGJlbG9uZyBpbiB0aGlzIGZpbGUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmg6IEluY2x1ZGUgYW91dC9zdGFiX2dudS5oLgotCShOX0dTWU0sIC4uLiwgTl9MRU5HKTogRGVsZXRlZC4KLQkoTk9fUkVMT0MpOiBVbmRlZmluZSBiZWZvcmUgZGVmaW5pbmcgYXMgcGFydCBvZiBlbnVtIHJlbG9jX3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGQgY29tbWVudCBxdWVzdGlvbmluZyBuZWVkIGZvciBhbGwgdGhlCi0JY2hhcmFjdGVycyBpbiBGTFRfQ0hBUlMuCi0KLQkqIGFzLmMgKG1haW4pIFtPQkpfVk1TXTogRG9uJ3QgY2FsbCBvdXRwdXRfZmlsZV9jbG9zZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBTZXQgc3RyaWN0IG9yZGVyIGZvcgotCXNlY3Rpb25zIHdpdGggcmVjb2duaXplZCBuYW1lcywgYmVmb3JlIGNvbXB1dGluZyBWTUEgdmFsdWVzLgotCi1GcmkgTWFyIDExIDE3OjU2OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEFjY2VwdCBudW1iZXJzIGJldHdlZW4gMHg4MDAwIGFuZAotCTB4ZmZmZiBmb3IgJ2onIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBNSVBTIGFzc2VtYmxlci4gIFRoZXNlCi0JbnVtYmVycyBhcmUgYWN0dWFsbHkgdHJlYXRlZCBhcyBuZWdhdGl2ZS4KLQotVGh1IE1hciAxMCAxMzozNjoyOSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpOiBMb2NhbCBsYWJlbHMgYXJlIC5MZm9vLgotCi1UdWUgTWFyICA4IDIxOjE3OjEyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBNaW5vciBmb3JtYXR0aW5nL3N0eWxpc3RpYyBjaGFuZ2VzLCBwbHVzOgotCShvYmpfY29mZl9zZWN0aW9uKTogRGVjbGFyZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IE1ha2UgaXQgYXZhaWxhYmxlIG9ubHkgaWYgTUFOWV9TRUNUSU9OUy4KLQkob2JqX3N5bWJvbF90b19jaGFycykgW0NST1NTX0NPTVBJTEVdOiBTb21lIGF0dGVtcHMgdG8gbWFrZSB0aGlzCi0Jd29yay4gIEl0IHN0aWxsIGRvZXNuJ3QuICBJdCBub3cgZmFpbHMgdG8gY29tcGlsZSwgaW5zdGVhZCBvZgotCXNpbGVudGx5IGNvbXBpbGluZyB0byBkbyBub3RoaW5nLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZpbmUgb25seSBpZgotCU1BTllfU0VDVElPTlMuCi0JKE9CSl9QUk9DRVNTX1NUQUIpIFshIE1BTllfU0VDVElPTlNdOiBOZXcgbWFjcm8sIGp1c3QgZW1pdHMKLQl3YXJuaW5nLgotCi0JSGFuZGxlIEFscGhhIGxvYWQtaW1tZWRpYXRlLUZQIHBzZXVkby1pbnN0cnVjdGlvbnM6Ci0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmggKGxkaWYsIGxkaWcsIGxkaXMsIGxkaXQpOiBOZXcgcGF0dGVybnMuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobGl0OF9zZWMsIGxpdDRfc2VjLCBsaXQ4X3N5bSwgbGl0NF9zeW0pOiBOZXcKLQl2YXJpYWJsZXMuCi0JKGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGNyZWF0ZV9saXRhX3NlY3Rpb24pOiBOb3cgYSBtYWNyby4KLQkoZ2V0X2xpdDhfb2Zmc2V0LCBnZXRfbGl0NF9vZmZzZXQpOiBOZXcgZnVuY3Rpb25zLgotCShtYXliZV9zZXRfZ3ApOiBOZXcgZnVuY3Rpb24uCi0JKHNlbGVjdF9ncF92YWx1ZSk6IENhbGwgaXQuCi0JKGxvYWRfZXhwcmVzc2lvbik6IFByZXNlcnZlIGFkZGVuZCBpZiBzeW1ib2wgaXMgYSBzZWN0aW9uIHN5bWJvbC4KLQkoYWxwaGFfaXApOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSBgRicgZm9yIGZsb2F0aW5nLXBvaW50Ci0JY29uc3RhbnRzOyBzdG9yZSB0aGVtIGluIC5saXR7NCw4fSBzZWN0aW9ucy4KLQkoYWxwaGFfaXAsIGNhc2UgJ0cnKTogRW1pdCBMSVRVU0UgcmVsb2NhdGlvbnMgZm9yIHN5bWJvbCBleHBycy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc21hbGxlc3RfaW1tX3R5cGUpOiBOZXZlciByZXR1cm4gSW1tMS4KLQotVHVlIE1hciAgOCAxNDoxODoxNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAod19zdHJpbmdzKTogT25seSBjb3B5IHN0cmluZ3Mgb3V0IGlmCi0JdGhlaXIgc3ltYm9scyBhcmUgZ29pbmcgdG8gYmUgd3JpdHRlbi4KLQotVHVlIE1hciAgOCAxMTo0OToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcik6IERlY2xhcmUgYXJndW1lbnRzIGNvbnN0LgotCSogYXMuaCAoYXNfcGVycm9yKTogQ2hhbmdlIGRlY2xhcmF0aW9uLgotCi1Nb24gTWFyICA3IDE2OjA4OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogV2hlbiBjYWxsaW5nIGZyYWdfZ3JvdywgYWxsb3cKLQlmb3IgdGhlICh1cCB0bykgdHdvIG5vcHMgd2hpY2ggbWF5IGJlIGluc2VydGVkIGJ5IGFwcGVuZF9pbnNuIGlmCi0JbWlwc19vcHRpbWl6ZSBpcyAwLgotCShtYWNybyk6IExpa2V3aXNlLgotCi1UaHUgTWFyICAzIDExOjM3OjU1IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAobWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlcik6Ci0JQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZyBmcm9tIGdjYy4KLQotV2VkIE1hciAgMiAxMDozMTowMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQWRkIGEgZmV3IGNhc3RzIHRvIG1ha2UgSFAgQyBjb21waWxlciBoYXBweS4KLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uLCBvYmpfc29tX2NvcHlyaWdodCk6IEJlCi0JcHJlcGFyZWQKLQl0byBoYW5kbGUgYW4gZXJyb3IgZnJvbSBiZmRfc29tX2F0dGFjaF9hdXhfaGRyLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBXcmFwIEVMRiBzcGVjaWZpYyBkZWNscyBpbnNpZGUgYW4gaWZkZWYuCi0KLU1vbiBGZWIgMjggMTU6MDM6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2F0b2YpOiBPbWl0IHdhcm5pbmcgYWJvdXQgRlAgdmFsdWVzLgotCShsaW5lX2NvbW1lbnRfY2hhcnMpOiBBZGQgISB0byBsaXN0LgotCShtZF9hcHBseV9maXgpOiBEbyBwcm9jZXNzIDMyLSBhbmQgNjQtYml0IHJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfbGNvbW0pOiBQdXQgIiNpZiAwIiBhcm91bmQgdGhlCi0JdW51c2VkIHBhcnRzIChtb3N0IG9mIHRoZSBmdW5jdGlvbikuCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogQ2FzdCBhbGxvY2EgcmVzdWx0LgotCi0JKiBjb25maWd1cmUuaW4gKGk5NjAtKi1jb2ZmLCBpOTYwLSotdnh3b3JrczUuKik6IFVzZSBjb2ZmYmZkLCBhbmQKLQlnYXNfdGFyZ2V0IGljOTYwY29mZi4KLQkqIGNvbmZpZy9pYzk2MGNvZmYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggW1RDX0k5NjBdOiBJbmNsdWRlIGNvZmYvaTk2MC5oLgotCShUQVJHRVRfRk9STUFUKSBbVENfSTk2MF06IFVzZSBjb2ZmLUludGVsLWxpdHRsZS4KLQkqIGNvbmZpZy90ZS1pYzk2MC5oIChDUk9TU19DT01QSUxFKTogRG9uJ3QgdW5kZWYgdGhpcy4gIFdlJ2xsCi0JYWx3YXlzIGJ1aWxkIGxpdHRsZS1lbmRpYW4gb2JqZWN0IGZpbGVzLgotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfcmVsb2Nfc2l6ZSk6IERvbid0IGRlZmluZSBhdCBhbGwgaWYgQkZEIG9yCi0JQkZEX0FTU0VNQkxFUiBpcyBkZWZpbmVkLgotCShtZW1fZm10KTogU2luY2UgQ09GRiBkb2Vzbid0IGhhbmRsZSBjYWxseCByZWxvY2F0aW9ucyB5ZXQsIHRyZWF0Ci0JdGhlbSBsaWtlIG5vcm1hbCAzMi1iaXQgcmVsb2NhdGlvbnMuCi0JKG1kX2FwcGx5X2ZpeCk6IEZvciBjYWxseCByZWxvY2F0aW9ucywgc3RvcmUgemVyby4KLQkodGNfYm91dF9maXhfdG9fY2hhcnMpOiBTdG9yZSBzeW1ib2wgaW5kZXggZm9yIGFsbCBjYWxseAotCXJlbG9jYXRpb25zLCByZWdhcmRsZXNzIG9mIGxpbmstcmVsYXggc2V0dGluZy4KLQkodGNfY29mZl9maXgycnR5cGUsIHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBOZXcgZnVuY3Rpb25zLgotCShpOTYwX2hhbmRsZV9hbGlnbikgWyEgT0JKX0JPVVRdOiBJZiBsaW5rLXJlbGF4IG9wdGlvbiBpcwotCXNlbGVjdGVkLCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCBjbGVhciBpdC4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKEJGRF9BUkNILCBDT0ZGX0ZMQUdTLCBDT0ZGX01BR0lDLAotCVRDX0NPVU5UX1JFTE9DLCBUQ19DT0ZGX0ZJWDJSVFlQRSwgVENfQ09GRl9TSVpFTUFDSERFUCwKLQl0Y19maXhfYWRqdXN0YWJsZSk6IE5ldyBtYWNyb3MuCi0JKHRjX2NvZmZfZml4MnJ0eXBlLCB0Y19jb2ZmX3NpemVtYWNoZGVwKTogRGVjbGFyZS4KLQotRnJpIEZlYiAyNSAyMDo1Njo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19zeW1ib2wpOiBDYWxsIFBBIEVMRiBCRkQgdmVyc2lvbi4KLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKHBhX2J1aWxkX3N5bWV4dG5fc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKGhwcGFfdGNfbWFrZV9zeW1leHRuX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocGFfZXhwb3J0KTogRGVsZXRlIGNhbGwgdG8gcGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChocHBhX3RjX3N5bWJvbCk6IEFkZCBleHRlcm4gZGVjbC4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IERlbGV0ZSBleHRlcm4gZGVjbC4KLQkoaHBwYV90Y19zeW1ib2wpOiBEZWxldGUgZXh0ZXJuIGRlY2wuCi0KLUZyaSBGZWIgMjUgMTM6MTU6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogQ29ycmVjdCB0ZXN0IGZvciB3aGV0aGVyIHRvCi0JZmlsbCBhIHNlY3Rpb24gKGZyb20gTWluaCBUcmFuLUxlIDxUUkFOTEVAaW50ZWxsaWNvcnAuY29tPikuCi0KLVRodSBGZWIgMjQgMTE6MzA6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCByZXF1aXJlIHZlcnNpb24gbnVtYmVyIGZvciBpMzg2LSotbWFjaC4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkZWQgIi50aGlzX0dDQ19yZXF1aXJlc190aGVfR05VX2Fzc2VtYmxlciIsCi0Jd2hpY2ggaXMgaWdub3JlZCBieSBnYXMsIGJ1dCB3aWxsIGNhdXNlIG90aGVyIGFzc2VtYmxlcnMgdG8gY2hva2UuCi0JSW50ZW5kZWQgZm9yIHVzZSBieSBnY2MgcG9ydHMgdGhhdCByZXF1aXJlIGdhcyBpbnN0ZWFkIG9mIG5hdGl2ZQotCWFzc2VtYmxlcnMuCi0KLVRodSBGZWIgMjQgMDc6MTA6MzEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9oby1ocHBhb3NmLmg6IEZpeCBicmFpbm8gaW4gdGVzdCBmb3IgQU5TSS1DLgotCi1XZWQgRmViIDIzIDE2OjUxOjQzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IEdpdmUgdGhlIHVzZXIgYSByZWFzb25hYmxlIGVycm9yCi0JbWVzc2FnZSByYXRoZXIgdGhhbiAiYXNzZXJ0aW9uIGZhaWxlZCIgaWYgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0JZmFpbHMuCi0KLVR1ZSBGZWIgMjIgMTA6MDc6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tbWFjaDMuaDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgMjEgMTE6NDE6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9kZWJ1Zyk6IERvbid0IHNldCBoZHItPm1hZ2ljIGhlcmUuICBJdCBpcwotCW5vdyBzZXQgaW4gYmZkL2Vjb2ZmbGluay5jOmVjb2ZmX3dyaXRlX3N5bWhkci4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHdyaXRlX29iamVjdF9maWxlKTogdXNlIGJmZF9nZXRfZXJyb3IgKCksCi0Jbm90IGJmZF9lcnJvci4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChzX2xjb21tKTogVXNlIGFuIGFsaWdubWVudCBwb3dlciBvZiAzIGZvciA4IGJ5dGUgLmxjb21tCi0JdmFyaWFibGVzLgotCi0JKiBjb25maWcvaG8taHB1eC5oIChCUk9LRU5fQVNTRVJUKTogRGVmaW5lIGlmIG5vdCBfX0dOVUNfXy4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBVc2UgY29ycmVjdCBhcmd1bWVudHMgdG8gbWVtY3B5Ci0JKGJyb2tlbiAxOSBKdWwgMTk5MykuICBGcm9tIGtqZEBwZXNjYWRlcm8uc3RhbmZvcmQuZWR1IChLZW5uZXRoCi0JRHVkYSkuCi0KLVN1biBGZWIgMjAgMTg6MDE6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfY29mZl9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogRm9yICJzZWN0aW9uIiwgdXNlCi0Jb2JqX2NvZmZfc2VjdGlvbi4KLQkob2JqX2NvZmZfc2VjdGlvbik6IFJld3JpdGUuCi0KLUZyaSBGZWIgMTggMTQ6MTY6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbWFjaDMqKTogTmV3IHRhcmdldDsgdXNlcyBCRkQuCi0JKiBjb25maWcvdGUtbWFjaC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWFvdXQuaCAob2JqX2FvdXRfZnJvYl9maWxlKTogRGVjbGFyZSBpdC4KLQkoZnJvYl9maWxlKTogTmV3IG1hY3JvLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4XzEpIFtURV9NYWNoXTogRG9uJ3QgYWRqdXN0Ci0JcGNyZWwzMiByZWxvY2F0aW9ucy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRBUkdFVF9GT1JNQVQpIFtURV9NYWNoXTogVXNlIGEub3V0LW1hY2gzLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFJlbW92ZWQgcmVnaXN0ZXIgZGVjbGFyYXRpb25zLgotCi1UaHUgRmViIDE3IDE2OjI1OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVNvbWUgc3VwcG9ydCBmb3IgUG93ZXJQQyBFTEYuCi0JKiBjb25maWd1cmUuaW46IElmIGNwdSBpcyBwb3dlcnBjKiwgdXNlIHBwYy4KLQkocHBjLSotc3lzdjQqKTogVXNlIG9iamVjdCBmb3JtYXQgZWxmLgotCSogY29uZmlnL3RjLXBwYy5oOiBPbmx5IGRlY2xhcmUgYSBudW1iZXIgb2YgdGhpbmdzIGlmIE9CSl9DT0ZGIGlzCi0JZGVmaW5lZC4KLQkoVEFSR0VUX0FSQ0gpOiBNYWtlIGl0IGNhbGwgcHBjX2FyY2guCi0JKHBwY19hcmNoKTogRGVjbGFyZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IFNldCBiYXNlZCBvbiBPQkpfQ09GRiBvciBPQkpfRUxGLgotCShOT19TVFJJTkdfRVNDQVBFUyk6IERlZmluZS4KLQkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSBmb3IgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1wcGMuYzogT25seSBkZWZpbmUgYSBudW1iZXIgb2YgZnVuY3Rpb25zIG9mIE9CSl9DT0ZGCi0JaXMgZGVmaW5lZC4KLQkobWRfcHNldWRvX3RhYmxlKTogTW9zdCBwc2V1ZG8tb3BzIGFyZSBPQkpfQ09GRiBzcGVjaWZpYy4gIEFkZGVkCi0JT0JKX0NPRkYgc3BlY2lmaWMgImJpIiBhbmQgImVpIi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRml4IGhhbmRsaW5nIG9mIC11LiAgTWFrZSAtbTYwMSBzZXQKLQlQUENfT1BDT0RFXzYwMS4gIElmIE9CSl9FTEYsIGFjY2VwdCAtViBhbmQgLVEuCi0JKHBwY19zZXRfY3B1KTogTmV3IGZ1bmN0aW9uLgotCShwcGNfYXJjaCk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYmVnaW4pOiBDYWxsIHBwY19zZXRfY3B1LgotCShwcGNfaW5zZXJ0X29wZXJhbmQpOiBGb3IgYSBzaWduZWQgb3BlcmFuZCBhY2NlcHQgYW4gdW5zaWduZWQKLQl2YWx1ZSwgZm9yIElCTSBjb21wYXRpYmlsaXR5LgotCShwcGNfYnl0ZSk6IERvbid0IGNhbGwgc3RyaW5nZXIgZm9yIHN0cmluZ3M7IGluc3RlYWQsIHRyZWF0IHR3bwotCWRvdWJsZSBxdW90ZXMgYXMgYSBzaW5nbGUgZG91YmxlIHF1b3RlLgotCShwcGNfY29tbSk6IFNldCBzeV90Yy5vdXRwdXQgZm9yIGEgLmxjb21tIHN5bWJvbC4KLQkocHBjX2JpZWkpOiBOZXcgZnVuY3Rpb24uCi0JKHBwY190Yyk6IElmIG5vdCBPQkpfQ09GRiwgaWdub3JlIGZpcnN0IGFyZ3VtZW50LgotCShwcGNfZml4X2FkanVzdGFibGUpOiBDYWxsIGFzX2JhZF93aGVyZSwgbm90IGFzX2JhZC4KLQkocHBjX2lzX3RvY19zeW0pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IFVzZSBwcGNfaXNfdG9jX3N5bS4gIEhhbmRsZSBCRkRfUkVMT0NfMTYgYW5kCi0JQkZEX1JFTE9DXzguCi0KLVRodSBGZWIgMTcgMDk6Mjk6MzcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc19wZXJyb3IpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9nZXRfZXJyb3IgYW5kCi0JYmZkX3NldF9lcnJvciBhbmQgbmV3IGVycm9yIG5hbWVzLgotCi1UdWUgRmViIDE1IDIwOjIzOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCBpOTYwLXZ4d29ya3MgdmVyc2lvbnMgPiA1LjAgYXMgY29mZi4KLQlEZWZhdWx0IGlzIHN0aWxsIGJvdXQgaWYgbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWQuCi0KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBVc2Ugc3dpdGNoIGFuZCBzdHJjYXNlY21wIGluc3RlYWQKLQlvZiBsYXJnZSBudW1iZXIgb2YgY29tcGFyZXMgd2hlbiBsb29raW5nIGZvciBpbmYvbmFuIHZhbHVlcy4KLQotRnJpIEZlYiAxMSAxMzoxMzoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRG8gdW5hbGlnbmVkIGxvYWRzIGFuZCBzdG9yZXMKLQljb3JyZWN0bHkgd2hlbiBiaWcgZW5kaWFuLCBhbmQgZ2l2ZSBlcnJvcnMgb24gb3ZlcmZsb3cgcmF0aGVyIHRoYW4KLQlnZW5lcmF0aW5nIGluY29ycmVjdCBjb2RlLgotCi1UaHUgRmViIDEwIDExOjI0OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotCSogcmVhZC5jIChkb19hbGlnbik6IERvbid0IGRlZmluZSBsYWJlbCBqdXN0X3JlY29yZF9hbGlnbm1lbnQKLQl1bmxlc3MgaXQgbWlnaHQgYmUgdXNlZC4KLQotCSogYXMuYyAobWFpbik6IElmIG1kX3BhcnNlX2xvbmdfb3B0aW9uIGlzIGRlZmluZWQsIGNhbGwgaXQgd2l0aCBhCi0JbG9uZyBvcHRpb24uCi0JKiBjb25maWcvdGMtbWlwcy5oIChtZF9wYXJzZV9sb25nX29wdGlvbik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfdHJhcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogUmVwb3J0IGFuIGVycm9yIGlmIG1pcHNfdHJhcCBpcyBzZXQgYXQgSVNBIGxldmVsIDEuCi0JKG1hY3JvKTogSWYgbWlwc190cmFwLCB1c2UgdHJhcCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZiBicmVhawotCWluc3RydWN0aW9ucyBmb3Igb3ZlcmZsb3cgYW5kIGRpdmlkZSBieSB6ZXJvIGRldGVjdGlvbi4KLQkobWlwc19wYXJzZV9sb25nX29wdGlvbik6IE5ldyBmdW5jdGlvbi4gIFN1cHBvcnQgLS10cmFwLAotCS0tbm8tYnJlYWssIC0tYnJlYWsgYW5kIC0tbm8tdHJhcC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJ6ZXJvIi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IFJlbW92ZSAiemVybyIuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxMCAwMToyNDoyNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZWplY3QgaW50ZWdlciB2YWx1ZXMgZm9yCi0JcGMtcmVsYXRpdmUgb3BlcmFuZCBmaWVsZHMuICBUaGlzIGZvcmNlcyAiY2FsbCAwIiB0byBiZWNvbWUgImptcGwKLQklZzAsJW83IiB3aXRoIG5vIHJlbG9jYXRpb25zIG5lZWRlZC4KLQotV2VkIEZlYiAgOSAxMzowODozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFzLmggKHhtYWxsb2MsIHhyZWFsbG9jKTogRGVjbGFyZSB1c2luZyBQVFIgcmF0aGVyIHRoYW4gY2hhciAqLgotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IFVzZSBQVFIgcmF0aGVyIHRoYW4gY2hhciAqLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSWYgTk9fU1RSSU5HX0VTQ0FQRVMgaXMgZGVmaW5lZCwKLQlkb24ndCB0cmVhdCBiYWNrc2xhc2ggc3BlY2lhbGx5IGluc2lkZSBzdHJpbmdzLgotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDkgMDk6NDI6NDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBVc2UgbWVtc2V0Ci0JaW5zdGVhZCBvZiBtZW1jcHkgdG8gemVybyB0aGUgaW5pdGlhbCBzdGFiIHN5bWJvbCwgZHVoLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IERpdHRvLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IERpdHRvLgotCi1UdWUgRmViICA4IDE3OjI1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IFVzZSBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ2FsbCBtZW1zZXQgd2l0aCB0aGUgYXJndW1lbnRzIGluCi0JdGhlIHJpZ2h0IG9yZGVyLiAgRXhwbGljaXRseSBjbGVhciBmaXhfcm9vdCBhbmQgZml4X3RhaWwgZmllbGRzLgotCi1UdWUgRmViICA4IDE2OjAwOjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogRm9yIGFic19zeW1ib2wsIHNldCAqcHVudAotCWFuZCBkbyBub3RoaW5nIGVsc2UuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2JlZ2luKTogSW5pdGlhbGl6ZSB2YWx1ZSBvZiBhYnNfc3ltYm9sCi0JcHJvcGVybHkuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogVXNlIGFic19zeW1ib2wgaW5zdGVhZCBvZiBjYWxsaW5nCi0Jc2VjdGlvbl9zeW1ib2wuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKTogRml4ICIvKiIgaW4gY29tbWVudCB0byBzaWxlbmNlCi0JY29tcGxhaW50IGZyb20gImdjYyAtV2FsbCIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQsIGxpa2UgYWxwaGEtKi1vc2YqLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoR1BfQURKVVNUTUVOVCk6IE1vdmUgZGVmaW5pdGlvbiB0byBzdGFydCBvZgotCWZpbGUuCi0JKHRjX2dlbl9yZWxvYyk6IFJlbW92ZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGBjb2RlJywgYW5kIGNvZGUKLQl0aGF0IHRyaWVkIHRvIHVzZSBpdCAoaW5jb3JyZWN0bHkpLiAgRm9yIExJVEVSQUwgcmVsb2MsIHNldCBhZGRlbmQKLQl0byBuZWdhdGl2ZSBvZiBHUCB2YWx1ZS4KLQkobG9hZF9zeW1ib2xfYWRkcmVzcyk6IERvbid0IGFkanVzdCByZXR1cm4gdmFsdWUgYnkgR1BfQURKVVNUTUVOVC4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogUHJpbnQgc29tZSBzZW5zaWJsZSBlcnJvciBtZXNzYWdlIGlmCi0JYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiByZXR1cm5zIGJmZF9yZWxvY19vdmVyZmxvdy4KLQotTW9uIEZlYiAgNyAxNTo0OToyNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qZWxmKik6IE5ldyBjb25maWd1cmF0aW9uIGZvciBQQSBFTEYuCi0JKGhwcGEqLSotb3NmKik6IERlZmF1bHQgb2JqZWN0IGZvcm1hdCBpcyBTT00uCi0KLU1vbiBGZWIgIDcgMTY6MDc6MzUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2F0b2YpOiBXYXJuIHRoYXQgZmxvYXRpbmctcG9pbnQgdmFsdWVzCi0JbWlnaHQgbm90IGFzc2VtYmxlIHByb3Blcmx5LgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldCBhbHBoYS0qLW9zZiopOiBEb24ndCBzZXQgImRldj15ZXMiIGFueQotCW1vcmUuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBQYXJlbnRoZXNpemUgb3BlcmF0aW9ucyBpbgotCXJhbmdlIGNoZWNraW5nLCB0byBhdm9pZCBwcmVjZWRlbmNlIHF1ZXN0aW9ucy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFkZHIzMik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBpdCBmb3IgIi0zMmFkZHIiLgotCShsb2FkX3N5bWJvbF9hZGRyZXNzKTogSWYgYWRkcjMyIGlzIHNldCwgdXNlIGxkbCBpbnN0ZWFkIG9mIGxkcS4KLQotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IENhbGN1bGF0ZSBtYXhpbXVtX3VzZWZ1bF9kaWdpdHMKLQlhbmQgbW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMgaW4gaW50ZWdlciBhcml0aG1ldGljLCB0bwotCWVsaW1pbmF0ZSB0aGUgb25seSBzb3VyY2VzIG9mIGRlcGVuZGVuY2Ugb24gZmxvYXRpbmcgcG9pbnQKLQlzdXBwb3J0LCB3aGljaCBkb2Vzbid0IHdvcmsgeWV0IG9uIHRoZSBBbHBoYS4KLQotTW9uIEZlYiAgNyAwMzo1NjowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKSBbVENfQUxQSEFdOiBTcGVjaWZ5IHZlcnNpb24gc3RhbXAgYXMKLQkweDMwYiBmb3IgQWxwaGEgZm9yIG5vdywgdW50aWwgIi52ZXJzdGFtcCIgaXMgaGFuZGxlZC4KLQotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogVXNlIHNlZ2luZm8tPmZyY2hhaW5QLCB3aGljaAotCWFjdHVhbGx5IHJlZmVycyB0byB0aGUgbGl0ZXJhbCBwb29sIHNlY3Rpb24sIHJhdGhlciB0aGFuCi0JZnJjaGFpbl9ub3csIHdoaWNoIHJlZmVycyB0byB3aGF0ZXZlciBzZWN0aW9uIHRoZSBhc3NlbWJsZXIgd2FzCi0JaW4uCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBPbmx5IGRvIHJhbmdlIGNoZWNraW5nIGlmIHNpemUgb2YgZml4dXAKLQlpcyBzbWFsbGVyIHRoYW4gd29yZCBzaXplLiAgT3RoZXJ3aXNlLCB3ZSBhbHdheXMgd2luZCB1cCB3aXRoCi0JemVyb3MuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zZWN0aW9uX2FsaWduKTogQ2hhbmdlIHNlY29uZCBhcmd1bWVudCBhbmQKLQlyZXR1cm4gdHlwZSB0byB2YWx1ZVQsIHRvIGFncmVlIHdpdGggdGMuaC4KLQkoYWxwaGFfZG9fYWxpZ24pOiBMb2NhbCBzdGF0aWMgYXJyYXkgbm9wX3BhdHRlcm4gaXMgbm93IHVuc2lnbmVkCi0JY2hhciwgdG8gYXZvaWQgb3ZlcmZsb3cgd2FybmluZ3MuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAobWRfc2VjdGlvbl9hbGlnbik6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBFbnN1cmUgdGhhdCBlY29mZl9kYXRhIGZvcgotCW91dHB1dCBiZmQgaXMgbm9uLW51bGwgYmVmb3JlIGluZGlyZWN0aW5nIHRocm91Z2ggaXQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEpOiBSZW5hbWVkIGZyb20KLQlhbHBoYV9mcm9iX2ZpbGUuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAodGNfZnJvYl9maWxlKTogTWFjcm8gZGVsZXRlZC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKSBbVENfQUxQSEFdOiBDYWxsCi0JYWxwaGFfZnJvYl9lY29mZl9kYXRhLCB0aGVuIGZpbGwgaW4gb3B0aW9uYWwtaGVhZGVyIGluZm8gd2l0aCBncAotCXZhbHVlIGFuZCByZWdpc3RlciBtYXNrcy4KLQotU3VuIEZlYiAgNiAxNjoxMzo0NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChoaXV4KTogRml4ZXMgZnJvbSBtLWthc2FockBzcmFtaGMuc3JhLmNvLkpQLgotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogU2FtZSBjaGFuZ2UKLQlhcyBjb2ZmYmZkIGFuZCBlbGYgYmVsb3cuICBaZXJvIHRoZSBpbml0aWFsIHN0YWIgc3ltYm9sIGFmdGVyCi0JYWxsb2NhdGluZyBpdC4KLQotU2F0IEZlYiAgNSAxMjozMDozMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFplcm8gdGhlCi0JaW5pdGlhbCBzdGFiIHN5bWJvbCBhZnRlciBhbGxvY2F0aW5nIGl0LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IERpdHRvLgotCi1TYXQgRmViICA1IDExOjUzOjMxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IGFkZGJbdGZdIHNob3VsZCBvbmx5IGFjY2VwdAotCW5vbi1uZWdhdGVkIGNvbmRpdGlvbiBjb21wbGV0ZXJzLiAgQWRkIHN1cHBvcnQgZm9yIGFkZGIgcHNldWRvLW9wCi0Jd2hpY2ggYWNjZXB0cyBib3RoIG5lZ2F0ZWQgYW5kIG5vbi1uZWdhdGVkIGNvbXBsZXRlcnMuCi0KLVNhdCBGZWIgIDUgMDA6MTU6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwMCopOiBVc2UgY3B1X3R5cGUgcHBjLgotCShwcGMtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIGNvZmYgYW5kIGZvcmNlIGJmZF9nYXMuCi0JKiBjb25maWcvdGMtcHBjLmgsIGNvbmZpZy90Yy1wcGMuYzogTmV3IGZpbGVzIGZvciBQb3dlclBDL1BPV0VSCi0JKFJTLzYwMDApIHN1cHBvcnQuICBBdCB0aGUgbW9tZW50LCBvbmx5IFhDT0ZGIGlzIHN1cHBvcnRlZC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKFNBX1NFVF9TWU1fRU5ETkRYKTogTWFkZSBub24tc3RhdGljLgotCShTX1NFVF9EQVRBX1RZUEUpOiBMaWtld2lzZS4KLQkoY29mZl9sYXN0X2Z1bmN0aW9uKTogUmVuYW1lZCBmcm9tIGxvY2FsIHN0YXRpYyBsYXN0X2Z1bmN0aW9uUCBpbgotCWNvZmZfZnJvYl9zeW1ib2wgYW5kIG1hZGUgZXh0ZXJuYWxseSB2aXNpYmxlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogTmV3IGxvY2FsIHN0YXRpYyBzZXRfZW5kOyB1c2UgaXQgdG8gdHJ5IHRvCi0JYXZvaWQgY2FsbGluZyBTQV9TRVRfU1lNX0VORE5EWCBvbiBhIHN5bWJvbCB0aGF0IHdpbGwgYmUgcHVudGVkLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNfU0VUX0RBVEFfVFlQRSk6IERlY2xhcmUuCi0JKFNBX1NFVF9TWU1fRU5ETkRYKTogRGVjbGFyZS4KLQkoY29mZl9sYXN0X2Z1bmN0aW9uKTogRGVjbGFyZS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSWYgRE9MTEFSX0RPVCBpcyBkZWZpbmVkLCBhY2NlcHQgYCQnIGFzCi0JZXF1aXZhbGVudCB0byBgLicgdG8gbWVhbiB0aGUgY3VycmVudCBsb2NhdGlvbi4KLQotCSogcmVhZC5jIChMRVhfQlIpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCi0JKGxleF90eXBlKTogVXNlIExFWF9CUiBhcyB0aGUgdHlwZSBvZiBgeycsYH0nLGBbJyxgXScuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IElmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBpcwotCWRlZmluZWQsIGNhbGwgaXQgd2l0aCBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lLiAgSWYKLQl0Y19zeW1ib2xfbmV3X2hvb2sgaXMgZGVmaW5lZCwgY2FsbCBpdCBvbiB0aGUgbmV3IHN5bWJvbC4KLQkoc3ltYm9sX2ZpbmRfYmFzZSk6IElmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBpcyBkZWZpbmVkLAotCWNhbGwgaXQgb24gYSBjb3B5IG9mIHRoZSBuYW1lIGFyZ3VtZW50LgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFNpbXBsaWZpZWQgdXNhZ2Ugb2Ygb2JqX2Zyb2Jfc3ltYm9sCi0JYW5kIHRjX2Zyb2Jfc3ltYm9sLiAgQWx3YXlzIGNhbGwgYm90aCBpZiB0aGUgc3ltYm9sIGlzIGdvaW5nIHRvIGJlCi0Jb3V0cHV0LgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogVXNlICVsZCByYXRoZXIgdGhhbiAlZCB3aGVuIHByaW50aW5nCi0JZnJhZ1AtPmZyX3ZhciwgYW5kIGNhc3QgaXQgdG8gbG9uZy4KLQotCUNoYW5nZWQgcmVsb2NzIHRvIGJlIGJhc2VkIG9uIHN1YnNlZ21lbnRzICh3aGVuIEJGRF9BU1NFTUJMRVIpLgotCSogc3Vic2Vncy5oIChzdHJ1Y3QgZnJjaGFpbik6IElmIEJGRF9BU1NFTUJMRVIsIGFkZGVkIG5ldyBmaWVsZHMKLQlmaXhfcm9vdCBhbmQgZml4X3RhaWwuCi0JKHNlZ21lbnRfaW5mb190eXBlKTogSWYgQkZEX0FTU0VNQkxFUiwgZG9uJ3QgZGVmaW5lIGZpeF90YWlsCi0JZmllbGQuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSWYgQkZEX0FTU0VNQkxFUiwgc2V0IGZpeF9yb290UCBhbmQKLQlmaXhfdGFpbFAgYmFzZWQgb24gZnJjaGFpbl9ub3csIG5vdCBzZWdfaW5mbyAobm93X3NlZykuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBDaGFpbiB0aGUgc3Vic2VnbWVudCByZWxvY3MgdG9nZXRoZXIuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBEb24ndCBjbGVhciBmaXhfdGFpbCBmaWVsZC4KLQkoc3Vic2VnX2dldCk6IExpa2V3aXNlLgotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgdmlhCi0JZnJjaGFpbl9ub3csIG5vdCBzZWdpbmZvLgotCi1UaHUgRmViICAzIDIzOjA3OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oIChUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IENoYW5nZWQKLQllY29mZl91bmRlZmluZWQgdG8gZWNvZmZfZXh0ZXJuX3NpemUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZXh0ZXJuKTogU2V0IGVjb2ZmX2V4dGVybl9zaXplIHRvIHRoZQotCWV4dGVybmFsIHN5bWJvbCBzaXplLCByYXRoZXJuIHRoYW4gc2V0dGluZyB0aGUgc3ltYm9sIHZhbHVlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IENoZWNrIGJvdGggZWNvZmZfZXh0ZXJuX3NpemUgYW5kCi0Jc3ltYm9sIHZhbHVlIHRvIHNlZSBpZiBHUCByZWZlcmVuY2luZyBjYW4gYmUgdXNlZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N5bWJvbF9uZXdfaG9vayk6IENsZWFyIGVjb2ZmX2V4dGVybl9zaXplLCBub3QKLQllY29mZl91bmRlZmluZWQuCi0JKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY2hlY2sgZWNvZmZfdW5kZWZpbmVkLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogR2V0IHNpemUgb2YgYW4gdW5kZWZpbmVkIHN5bWJvbCBmcm9tCi0Jc3ltLT5lY29mZl9leHRlcm5fc2l6ZSwgbm90IFNfR0VUX1ZBTFVFIChzeW0pLgotCi1XZWQgRmViICAyIDEzOjU1OjA4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIGJ1ZyBpbiBsb3NpbmcgaHB1eCBzZWQuCi0KLVdlZCBGZWIgIDIgMTE6NDA6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChmaWxlX21pcHNfaXNhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBTZXQgaXQuCi0JKHNfbWlwc3NldCk6IEFkZCBzdXBwb3J0IGZvciAuc2V0IG1pcE4gdG8gc2V0IHRoZSBJU0EgbGV2ZWwuCi0KLQkqIGdhc3AuYyAoa2luZm8pOiBGdWxseSBicmFja2V0IGluaXRpYWxpemVyLgotCi1UdWUgRmViICAxIDE5OjI4OjEyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAobWFsbG9jKTogRG9uJ3QgZGVjbGFyZSwgc2luY2UgaG9zdC5oIG9yIHN5c3RlbSBoZWFkZXIKLQlmaWxlcyBtYXkgZGVjbGFyZSBpdCBkaWZmZXJlbnRseS4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChpbnRfdG9fZ2VuKTogTm93IHN0YXRpYy4KLQotCSogY29uZmlnL2hvLWkzODZhaXguaDogSW5jbHVkZSBzeXMvdHlwZXMuaCBhbmQgc3RkbGliLmgsIG5vdAotCWhvLXN5c3YuaC4gIEJhc2VkIGxvb3NlbHkgb24gYSBwYXRjaCBmcm9tIE1pbmggVHJhbi1MZS4KLQotVHVlIEZlYiAgMSAxMDo1MDoxNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBnYXNwLmM6IEluY2x1ZGUgaG9zdC5oLgotCi1UdWUgRmViICAxIDEyOjEzOjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE1ha2UgYW4gdW5zdXBwb3J0ZWQgaW5zdHJ1Y3Rpb24gYQotCXdhcm5pbmcsIG5vdCBhbiBlcnJvci4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLAotCWRvdF9ic3Nfc3ltYm9sKTogRG9uJ3QgZGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuCi0JKG9ial9zeW1ib2xfdG9fY2hhcnMpOiBiZmRfY29mZl9zd2FwX2F1eF9vdXQgbm93IHRha2VzIG1vcmUKLQlhcmd1bWVudHMuCi0JKGNvZmZfbGluZV9iYXNlKTogUmVuYW1lZCBmcm9tIGxpbmVfYmFzZS4gIENoYW5nZWQgYWxsIHVzZXMuCi0JKGNvZmZfYWRkX2xpbmVzeW0pOiBSZW5hbWVkIGZyb20gYWRkX2xpbmVfc3ltLiAgTWFkZSBub24tc3RhdGljLgotCUNoYW5nZWQgYWxsIHVzZXMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogSWYgVENfUFBDLCBpbmNsdWRlIGNvZmYvcnM2MDAwLmguCi0JKFNfU0VUX1NUT1JBR0VfQ0xBU1MsIFNfR0VUX1NUT1JBR0VfQ0xBU1MpOiBEZWNsYXJlIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoY29mZl9saW5lX2Jhc2UpOiBEZWNsYXJlLgotCShjb2ZmX2FkZF9saW5lc3ltKTogRGVjbGFyZSBpZiBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHN5bWJvbF90b19jaGFycyk6IGJmZF9jb2ZmX3N3YXBfYXV4X291dAotCW5vdyB0YWtlcyBtb3JlIGFyZ3VtZW50cy4KLQotTW9uIEphbiAzMSAxNzo1NToxNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHN0YXRpc3RpY3NfZmxhZyk6IFJlbmFtZWQgZnJvbSBxdWlldF9mbGFnLgotCShtYWluKTogR2V0IHN0YXRpc3RpY3Mgd2l0aCAtLXN0YXRpc3RpY3MgaW5zdGVhZCBvZiAtbm9xdWlldC4KLQotTW9uIEphbiAzMSAwNzoxOTozMCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogU3VwcG9ydCBmb3IgR251IEFTc2VtYmxlciBQcmVwcm9jZXNzb3IuCi0JKiBnYXNwLmM6IE5ldyBmaWxlLgotCSogcmVhZC5jIChzX2xjb21tKTogQWxpZ24gbGNvbW0gZGF0YS4KLQkqIGNvbmZpZy90Yy16OGsuYyAodGNfcmVsb2NfbWFuZ2xlKTogRG9uJ3QgYWxsb3cgc3VidHJhY3Rpb24KLQlmcm9tIGRpZmZlcmVudCBzZWN0aW9ucy4KLQotU3VuIEphbiAzMCAxNDo1ODoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIHRjX2Zyb2JfZmlsZSBpcyBkZWZpbmVkLCBjYWxsIGl0Ci0JanVzdCBiZWZvcmUgY2FsbGluZyBvYmpfZnJvYl9maWxlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2dwX3ZhbHVlKTogUmVuYW1lZCBmcm9tIGdwX3ZhbHVlCi0JKHJlZmVyZW5jZXMgY2hhbmdlZCksIGFuZCBtYWRlIG5vbi1zdGF0aWMuCi0JKGdldEV4cHJlc3Npb24pOiBSZXR1cm4gdm9pZC4KLQkoc2VsZWN0X2dwX3ZhbHVlKTogQWJvcnQgaWYgZ3BfdmFsdWUgaXMgbm9uLXplcm8uICBEZWxldGUgY2FsbCB0bwotCW5vbi1leGlzdGVudCBiZmRfc2V0X2dwX3ZhbHVlLgotCShhbHBoYV92YWxpZGF0ZV9maXgpOiBGdW5jdGlvbiBkZWxldGVkLgotCShhbHBoYV9mcm9iX3N5bWJvbCk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGFscGhhX2xvY2FsX2xhYmVsKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoYWxwaGFfZnJvYl9maWxlKTogUmVuYW1lZCBmcm9tIGFscGhhX2VuZC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChhbHBoYV9mcm9iX3N5bWJvbCwgYWxwaGFfdmFsaWRhdGVfZml4LAotCWFscGhhX2xvY2FsX2xhYmVsLCBhbHBoYV9lbmQpOiBEZWNsYXJhdGlvbnMgZGVsZXRlZC4KLQkoYWxwaGFfZ3BfdmFsdWUsIGFscGhhX2Zyb2JfZmlsZSk6IERlY2xhcmUuCi0JKHRjX2Zyb2Jfc3ltYm9sLCBUQ19WQUxJREFURV9GSVgsIG1kX2VuZCk6IE1hY3JvcyBkZWxldGVkLgotCShMT0NBTF9MQUJFTCk6IE1vdmUgY29kZSBoZXJlIGZyb20gdGMtYWxwaGEuYzphbHBoYV9sb2NhbF9sYWJlbC4KLQkobWRfY29udmVydF9mcmFnKTogU2ltcGxpZmllZCBzbGlnaHRseS4KLQkodGNfZnJvYl9maWxlKTogTmV3IG1hY3JvLgotCi0JKiByZWFkLmMgKGRvX2FsaWduKTogTmV3IGZ1bmN0aW9uLCBtb3N0IG9mIGd1dHMgb2Ygc19hbGlnbl8qCi0JZnVuY3Rpb25zLiAgTG9vayBmb3IgbWRfZG9fYWxpZ24gbWFjcm8sIGdpdmUgaXQgYSBjaGFuY2UgdG8gYnlwYXNzCi0JYWxsIGJ1dCByZWNvcmRpbmcgb2Ygc2VjdGlvbiBhbGlnbm1lbnQuCi0JKHNfYWxpZ25fYnl0ZXMsIHNfYWxpZ25fcHR3byk6IENhbGwgZG9fYWxpZ24uCi0JKHNfbGNvbW0pIFtUQ19BTFBIQV06IEFsaWduIG9iamVjdCB0byBsYXJnZXN0IHBvd2VyIG9mIHR3byB0aGF0Ci0JZGl2aWRlcyBvYmplY3Qgc2l6ZS4KLQotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbl9wYXR0ZXJuKTogTmV3IGZ1bmN0aW9uLgotCShmcmFnX2FsaWduKTogUmV3cml0ZSBmb3IgY2xhcml0eS4KLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBPX2NvbnN0YW50IGV4cHJlc3Npb24uCi0JKHZpcF9iZWdpbik6IFJldHVybnMgcG9pbnRlciB0byBjb25zdCBjaGFyLiAgQ2FzdCBoYXNoX2luc2VydCBhcmcKLQl0byBQVFIgdG8gYXZvaWQgY29tcGlsZXIgY29tcGxhaW50cyBhYm91dCBjb25zdC4KLQkobWRfYmVnaW4pOiBMb2NhbCB2YXJpYWJsZSBlcnJ0eHQgbXVzdCBwb2ludCB0byBjb25zdC4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgaG9zdCB2YXgtKi11bHRyaXgqIGxpa2UgdmF4LSotYnNkKi4gIERvbid0Ci0JYm90aGVyIHdpdGggKi0qLXVsdHJpeCBvciAqLSotc3lzdiosIGV4Y2VwdCAqLSotc3lzdiwgc2luY2Ugb25seQotCXRoZSBsYXN0IGhhcyBhbiBleGlzdGluZyBob3N0IHN1cHBvcnQgZmlsZS4gIERvIGhhbmRsZSB2YXgtYnNkIGFuZAotCXZheC11bHRyaXggdGFyZ2V0cy4KLQotRnJpIEphbiAyOCAxMToyNjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uX2hlYWRlcl9hcHBlbmQpOiBEbyBub3QKLQlkZWNsYXJlIGlmIEJGRF9BU1NFTUJMRVIuCi0JKHN0YWNrX3BvcCk6IENvcnJlY3QgdGVzdCBmb3Igc3RhY2sgdW5kZXJmbG93LgotCShvYmpfY29mZl9lbmRlZiwgb2JqX2NvZmZfZGltLCBvYmpfY29mZl9saW5lLCBvYmpfY29mZl9zaXplLAotCW9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfdGFnLCBvYmpfY29mZl90eXBlLCBvYmpfY29mZl92YWwpOiBEZWNsYXJlCi0JdHlwZSBvZiBpZ25vcmVkIGFyZ3VtZW50IHRvIGF2b2lkIGdjYyB3YXJuaW5nLgotCShhbGlnbik6IFJlbW92ZWQgdW51c2VkIGZ1bmN0aW9uLgotCi1UaHUgSmFuIDI3IDE4OjE0OjE5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jLCBjb25maWcvdGMtYWxwaGEuaCwgY29uZmlnL2FscGhhLW9wY29kZS5oOiBOZXcKLQlmaWxlcywgYmFzZWQgb24gcG9ydCBvZiBnYXMtMS4zOCBjb250cmlidXRlZCBieSBDTVUsIHVzaW5nIGEub3V0Ci0JdmFyaWFudC4gIFVwZGF0ZWQgZm9yIGdhcy0yLnggYW5kIEVDT0ZGLiAgRmxvYXRpbmctcG9pbnQgY29uc3RhbnRzCi0JYXJlIHN0aWxsIGJyb2tlbiwgYm9vdHN0cmFwIHRlc3RpbmcgaW5jb21wbGV0ZS4KLQotCSogbGl0ZXJhbC5jOiBDb21tZW50IGNoYW5nZXMuCi0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19zb3VyY2VfZmlsZSk6IENoZWNrIGZvciBudWxsIGxpc3RpbmdfdGFpbAotCWJlZm9yZSBpbmRpcmVjdGluZyB0aHJvdWdoIGl0LgotCi0JKiBleHByLmggKHN0cnVjdCBleHByZXNzaW9uUyk6IEFkZGVkIHN0cnVjdCB0YWcuCi0KLQkqIGFzLmg6IElmIF9fR05VQ19fIGFuZCBpbmxpbmUgYXJlIGJvdGggdW5kZWZpbmVkLCBkZWZpbmUgaW5saW5lCi0JYXdheS4KLQotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IERvbid0IGFzc3VtZSB0aGF0IGZyX3ZhciBmb3IKLQlyc19hbGlnbiBvciByc19vcmcgZnJhZ3Mgd2lsbCBiZSAxLgotCShyZWxheF9zZWdtZW50KTogRm9yIHJzX2FsaWduLCBpZiBmcl92YXIgaXMgbm90IDEsIGNvbXBsYWluIGlmCi0JcmVxdWlyZWQgcGFkZGluZyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgc2l6ZSBvZiB0aGUgcGFkIHBhdHRlcm4uCi0JKGZpeHVwX3NlZ21lbnQpOiBMZWF2ZSBncC1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhbG9uZS4gIEZvciBwY3JlbAotCXJlbG9jYXRpb25zIHJlZmVycmluZyB0byB0aGUgc2FtZSBzZWdtZW50LCBjbGVhciBmeF9wY3JlbCB3aGVuCi0JY2xlYXJpbmcgZnhfYWRkc3kuCi0JKiBhcy5oOiBBZGp1c3QgY29tbWVudHMgb24gcnNfYWxpZ24uCi0KLQkqIGF0b2YtZ2VuZXJpYy5jOiBTb21lIHJlZm9ybWF0dGluZy4KLQkoYXRvZl9nZW5lcmljKTogQmUgY2FyZWZ1bCB3aGVuIG1peGluZyBzaWduZWQvdW5zaWduZWQgdmFsdWVzIG9mCi0JZGlmZmVyZW50IHNpemVzLgotCi0JKiB3cml0ZS5jLCBjb25maWcvb2JqLXthb3V0LGJvdXQsY29mZip9LmMsIGNvbmZpZy90Yy1zcGFyYy5jOgotCVF1ZXJ5IHRoZSBmeF9kb25lIGZpZWxkIGluc3RlYWQgb2YgZnhfYWRkc3kgdG8gc2VlIGlmIHRoZSBmaXh1cAotCXN0aWxsIG5lZWRzIHRvIGJlIGFwcGxpZWQuICBTZXQgZnhfZG9uZSBhbmQgY2xlYXIgZnhfYWRkc3kgYm90aCwKLQlmb3Igbm93LiAgSWYgVENfSEFORExFU19GWF9ET05FIGlzbid0IGRlZmluZWQsIGFzc3VtZSBtZF9hcHBseV9maXgKLQl3aWxsIG9ubHkgY2xlYXIgZnhfYWRkc3ksIGFuZCBzZXQgZnhfZG9uZSBhY2NvcmRpbmdseSBhZnRlcgotCXJldHVybmluZy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQ19IQU5ETEVTX0ZYX0RPTkUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogU2V0IGZ4X2RvbmUgZm9yIG5vbi1wY3JlbCBmaXgKLQl3aXRoIG5vIGZ4X2FkZHN5LgotCi0JKiBzeW1ib2xzLmMgKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLCBkb3RfYnNzX3N5bWJvbCk6Ci0JRGVsZXRlZC4KLQkoc3ltYm9sX2JlZ2luKTogTW92ZWQgdG8gZW5kIG9mIGZpbGUsIHNvIGZ1bmN0aW9uIGlubGluaW5nIGNhbgotCXdvcmsgYmV0dGVyLgotCShmYl9sYWJlbF9jb3VudCwgZmJfbGFiZWxfbWF4KTogRGVmYXVsdCBDIHN0YXRpYyBpbml0aWFsaXplcnMgYXJlCi0Jc3VmZmljaWVudC4KLQkqIHN5bWJvbHMuaCAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsIGRvdF9ic3Nfc3ltYm9sKToKLQlEZWNsYXJhdGlvbnMgZGVsZXRlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb3RfdGV4dF9zeW1ib2wsIGRvdF9kYXRhX3N5bWJvbCwKLQlkb3RfYnNzX3N5bWJvbCk6IERlZmluZWQgaGVyZSwgc3RhdGljLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyBbQkZEX0FTU0VNQkxFUl06IFVuZGVmIE5PX1JFTE9DIGJlZm9yZQotCWluY2x1ZGluZyBhb3V0L2FvdXQ2NC5oLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIEVNSVRfU0VDVElPTl9TWU1CT0xTIGlzIGZhbHNlLAotCWRvbid0IHdyaXRlIG91dCBhIHNlY3Rpb24gc3ltYm9sIGV2ZW4gaWYgaXQncyB1c2VkIGluIGEKLQlyZWxvY2F0aW9uOyBhc3N1bWUgcmVsb2NhdGlvbnMgd2lsbCBoYW5kbGUgc2VjdGlvbiBudW1iZXJzCi0Jc29tZWhvdy4gIFJlbmFtZSAicHVudF9pdCIgbGFiZWwgdG8gInB1bnRfaXRfaWZfdW51c2VkIiB0byByZWZsZWN0Ci0JaXQncyB0cnVlIHVzZS4KLQkoRU1JVF9TRUNUSU9OX1NZTUJPTFMpOiBEZWZhdWx0IHRvIDEuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogRG9uJ3QgY3JlYXRlIGEgbmV3IHN5bWJvbCBmb3IgYW4gYWJzb2x1dGUKLQlyZWZlcmVuY2U7IGp1c3QgdXNlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4KLQkod3JpdGVfcmVsb2NzKTogTWFrZSBwcmludG91dCBvZiByZWxvYyB2YWx1ZXMgZGVwZW5kZW50IG9uIGZsYWcKLQlERUJVRzMsIG5vdCBERUJVRzIuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoRU1JVF9TRUNUSU9OX1NZTUJPTFMpOiBEZWZpbmUgYXMgMC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoRU1JVF9TRUNUSU9OX1NZTUJPTFMpOiBEaXR0by4KLQotVGh1IEphbiAyNyAxNjo0Mzo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAobGV4X3R5cGUpOiBObyBsb25nZXIgbWFrZSAneycgYSB2YWxpZCBjaGFyYWN0ZXIgZm9yCi0Jc3ltYm9sIG5hbWVzLgotCi0JKiBhcy5jIChtYWluKTogUHJpbnQgbG9uZyB2YWx1ZXMgdXNpbmcgJWxkLgotCi0JKiBtZXNzYWdlcy5jIChhc193YXJuX2ludGVybmFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXNfd2FybiwgMyB2ZXJzaW9ucyk6IFVzZSBhc193YXJuX2ludGVybmFsLgotCShhc193YXJuX3doZXJlLCAzIHZlcnNpb25zKTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoYXNfd2Fybl93aGVyZSk6IERlY2xhcmUuCi0KLVR1ZSBKYW4gMjUgMTg6MzA6MzQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhcy5jIChxdWlldF9mbGFnKTogTmV3IGZsYWcuCi0JKG1haW4pOiBJZiAtbm9xdWlldCBnaXZlbiwgZGlzcGxheSBleGVjdXRpb24gdGltZSBhbmQgbWVtb3J5IHVzZWQuCi0KLVR1ZSBKYW4gMjUgMTU6NTM6MTEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGRvYy97YWxsLnRleGksYXMudGV4aW5mb306IEFkZCBkb2N1bWVudGF0aW9uIGZvciBIUFBBIHBvcnQuCi0KLU1vbiBKYW4gMjQgMTk6MTg6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4gIFB1dCB1bmRlZmluZWQKLQlzeW1ib2xzIG9mIGtub3duIHNpemUgaW4gdGhlIHVuZGVmaW5lZCBzZWN0aW9uLiAgUHV0IHNtYWxsIGNvbW1vbgotCXN5bWJvbHMgaW4gYSAuc2NvbW1vbiBzZWN0aW9uLgotCSogZWNvZmYuaCAoZWNvZmZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfZnJvYl9zeW1ib2wpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3dyaXRlX3N5bWJvbF9wLCBvYmpfZWxmX3dyaXRlX3N5bWJvbCwKLQlvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCB1bnVzZWQgZnVuY3Rpb25zLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb2Jfc3ltYm9sLCBvYmpfd3JpdGVfc3ltYm9sKTogUmVtb3ZlZAotCXVudXNlZCBtYWNyb3MuCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wsIG9ial9lbGZfd3JpdGVfc3ltYm9sKTogUmVtb3ZlZCBkZWNsYXJhdGlvbnMKLQlvZiB1bnVzZWQgZnVuY3Rpb25zLgotCShvYmpfZnJvYl9zeW1ib2wpOiBEZWZpbmUgaWYgRUNPRkZfREVCVUdHSU5HLgotCi0JKiB0Yy1taXBzLmMgKGdfc3dpdGNoX3NlZW4pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgZ19zd2l0Y2hfc2VlbiBmb3IgLUcgb3B0aW9uLgotCShzX29wdGlvbik6IElmIGNyZWF0aW5nIFBJQyBjb2RlLCBmb3JjZSB0aGUgR1Agc2l6ZSB0byBiZSAwLiAgV2FybgotCWlmIC1HIHN3aXRjaCB1c2VkIHdpdGggYSBub24temVybyB2YWx1ZS4KLQotCSogc3ltYm9scy5jIChTX0lTX0NPTU1PTik6IFVzZSBiZmRfaXNfY29tX3NlY3Rpb24gcmF0aGVyIHRoYW4KLQljb21wYXJpbmcgYWdhaW5zdCBiZmRfY29tX3NlY3Rpb24uCi0KLU1vbiBKYW4gMjQgMTQ6MTI6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX2xjb21tKTogVHJlYXQgQWxwaGEgbGlrZSBNSVBTIGluIGhhbmRsaW5nIG9mIC5zYnNzCi0Jc2VjdGlvbi4KLQotVGh1IEphbiAyMCAxMzoxNzo1OCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBGb3IgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZCB3aXRoIHVudXN1YWwgZnAKLQljaGFyIGZyb20gRkxUX0NIQVJTLCBwcmVzZXJ2ZSB0aGUgY2hhcmFjdGVyLiAgUGF0Y2ggZnJvbSBMaXNhCi0JUmVwa2EuCi0KLVdlZCBKYW4gMTkgMjM6MTU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgYWxsIGRhdGEgYWxsb2NhdGlvbgotCXBzZXVkby1vcHM6IC5od29yZCwgLmludCwgLmxvbmcsIC5vY3RhLCAucXVhZCwgLnNob3J0LCAuc2luZ2xlLgotCi1UdWUgSmFuIDE4IDE1OjUxOjU5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9lbmRlZik6IEZvciBDX0VGQ04sIENfQkxPQ0sgYW5kCi0JQ19GQ04gYXNzdW1lIC52YWwgaGFzIGJlZW4gc2V0IHRvIC4KLQotVHVlIEphbiAxOCAxNjoxOTo1OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogRGlzYWJsZSBtdWx0aXBsZSAkQ09ERSQgc3Vic3BhY2UgY29kZS4gIEl0Ci0JY29uZnVzZXMgR0RCIGZvciBzb21lIHVua25vd24gcmVhc29uLgotCSogY29mbmlnL29iai1zb20uYzogTGlrZXdpc2UuCi0KLVR1ZSBKYW4gMTggMTk6MDU6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogSGFuZGxlIGR1cGxpY2F0ZXMgb2YgdmFsdWVzCi0JYWxyZWFkeSB3cml0dGVuIHRvIGxpdGVyYWwgcG9vbC4KLQotVHVlIEphbiAxOCAxNzoyMzo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFRyeSB0byBnZXQgc3ltYm9scwotCXdpdGggZXhwbGljaXRseSBtYXJrZWQgc3RhYnMgdGhyb3VnaCBCRkQ6IGlmIGEgc3ltYm9sIG1hcmtlZAotCU5fVU5ERiB8IE5fRVhUIGlzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBtb3ZlIGl0IHRvIHRoZQotCXVuZGVmaW5lZCBzZWN0aW9uOyBtb3ZlIGEgc3ltYm9sIG1hcmtlZCBOX0lORFIgaW50bwotCWJmZF9pbmRfc2VjdGlvbiBhbmQgc2V0IHRoZSBCU0ZfSU5ESVJFQ1QgZmxhZzsgc2V0IHRoZQotCUJTRl9XQVJOSU5HIGZsYWcgZm9yIGEgc3ltYm9sIG1ha3JlZCBOX1dBUk5JTkcuCi0KLU1vbiBKYW4gMTcgMTU6NDA6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBEZWNsYXJlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogUmV0dXJuIHR5cGUgaXMgdm9pZC4KLQotTW9uIEphbiAxNyAwMDoxODo1NSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBFeHBsaWNpdGx5IGNoZWNrIGZvciBjb21tYSBiZWZvcmUgJ3UnCi0JYW5kICdmJyB0ZW1wbGF0ZSBvcGVyYW5kLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnTicsICdPJywgJ28nLCAnMCcsICcxJywgJ3UnLAotCWFuZCAnMicgaW4gY29wciBhbmQgc2Z1IGluc3RydWN0aW9uIHRlbXBsYXRlcy4KLQotU3VuIEphbiAxNiAxNjo0NDoyMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXMuaCAoc3Vic2VnX2ZvcmNlX25ldyk6IEFkZCBwcm90b3R5cGUuCi0KLVNhdCBKYW4gMTUgMDk6MjA6NTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFsbG93IGxpbmVzIGxpa2UgIiBmb29sYWIgOiIuCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogRml4IGNvbXB1dGF0aW9uIG9mIG1hc2suCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBGaXggbG9vcCB0ZXJtaW5hdGlvbiB0ZXN0LgotCi1UaHUgSmFuIDEzIDE2OjE1OjE1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoY3VycmVudF9maWxlX2lkeCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFkZF9maWxlKTogVXNlIGFuZCBpbmNyZW1lbnQgY3VycmVudF9maWxlX2lkeCBpbnN0ZWFkIG9mIGluZHgKLQlwYXJhbWV0ZXIuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogTWFrZSBhbGwgYml0ZmllbGRzIHVuc2lnbmVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChpOTYwX3ZhbGlkYXRlX2ZpeCk6IEFkZGVkIGFyZ3VtZW50Ci0JYWRkX3N5bWJvbFBQLiAgSW5kaXJlY3QgdGhyb3VnaCBpdCB0byBnZXQgImFkZF9zeW1ib2xQIi4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKGk5NjBfdmFsaWRhdGVfZml4KTogU3VwcGx5IHByb3RvdHlwZS4KLQkoVENfVkFMSURBVEVfRklYKTogUGFzcyBhZGRyZXNzIG9mIGFkZF9zeW1ib2xQLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1uZXRic2QqKTogTmV3IHRhcmdldCwgdXNpbmcgdGUtbmV0YnNkLmguCi0JKGkzODYtKi1uZXRic2QwLjgpOiBOZXcgdGFyZ2V0LCBsaWtlIDM4NmJzZC4KLQotCSogY29uZmlndXJlLmluOiBTZXQgQkZEREVGIGluIE1ha2VmaWxlIHRvICJkZWZpbmUiIG9yICJ1bmRlZiIuCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLmgpOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQlEZWZpbmUgb3IgdW5kZWYgQkZEX0FTU0VNQkxFUiBhcyBzcGVjaWZpZWQgYnkgJChCRkRERUYpLgotCShBTExfQ0ZMQUdTKTogT21pdCAkKEJGRERFRikuCi0JKiBhcy5oOiBJbmNsdWRlIGNvbmZpZy5oLgotCShzdHJ1Y3Qgc3ltYm9sKTogQWRkZWQgZm9yd2FyZCBkZWNsYXJhdGlvbi4KLQkoYWRkX3RvX2xpdGVyYWxfcG9vbCk6IEZpeCBkZWNsYXJhdGlvbi4KLQkqIGFzLmM6IERvbid0IGluY2x1ZGUgY29uZmlnLmguCi0KLQkqIGxpdGVyYWwuYyAoYWRkX3RvX2xpdGVyYWxfcG9vbCk6IFRha2Ugc3ltYm9sIGFuZCBhZGRlbmQgYXMKLQlhcmd1bWVudHMsIGluc3RlYWQgb2YgZXhwcmVzc2lvbiwgZm9yIG5vdy4gIEZpeCBjYWxjdWxhdGlvbiBvZgotCW9mZnNldCB0byByZXR1cm4uCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpIFtORUVEX0xJVEVSQUxfUE9PTF06IEFkZCBmaWVsZAotCWxpdGVyYWxfcG9vbF9zaXplLgotCi1UaHUgSmFuIDEzIDEyOjE0OjIxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2dldCk6IEFjY2VwdCBuZXcgYXJndW1lbnQgImZvcmNlX25ldyIuICBJZgotCXNldCB0aGVuIGEgbmV3IHNlZ21lbnQgaXMgYWx3YXlzIGNyZWF0ZWQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShzdWJzZWdfZm9yY2VfbmV3KTogTmV3IGZ1bmN0aW9uLiAgU2ltaWxhciB0byBzdWJzZWdfbmV3LCBidXQKLQlhbHdheXMgZm9yY2UgYSBuZXcgc2VnbWVudCB0byBiZSBjcmVhdGVkLgotCi0JKiBjb25maWcvb2JqLXNvbS5jIChzb21fZnJvYl9maWxlKTogQ2FsbCBhZGp1c3RfY29kZV9zZWN0aW9ucwotCWZvciBlYWNoIHNlY3Rpb24uCi0JKGFkanVzdF9jb2RlX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLiAgQWRqdXN0cyB0aGUgVk1BIGZvciBhbGwgdGhlCi0JJENPREUkIHN1YnNwYWNlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXNzZW1ibGUpOiBBbHNvIGhhbmRsZSBjcmVhdGluZyBhIGZpeHVwCi0JZm9yIHRoZSB1bndpbmQgZGVzY3JpcHRvcnMgaWYgYSBmdW5jdGlvbidzIGxhYmVsIGZvbGxvd3MgdGhlCi0JLlBST0MgYW5kIC5FTlRSWSBkaXJlY3RpdmVzLgotCShwYV9lbnRyeSk6IERvbid0IHNldCBCU0ZfRlVOQ1RJT04gZm9yIHRoZSBsYWJlbCBzeW1ib2wgaGVyZTsgaXQKLQlpcyBkb25lIGVsc2V3aGVyZS4gIERvbid0IGNyZWF0ZSBhIGZpeHVwIGZvciB0aGUgdW53aW5kCi0JZGVzY3JpcHRvcnMgaWYgdGhlIGZ1bmN0aW9uJ3MgbGFiZWwgaGFzIG5vdCBiZWVuIGRlZmluZWQgeWV0LgotCShwYV9wcm9jKTogRm9yIFNPTSwgcGxhY2UgZWFjaCBwcm9jZWR1cmUgd2l0aGluIGEgbmV3ICRDT0RFJAotCXN1YnNwYWNlLiAgQWRqdXN0IHRoZSBzZWdtZW50IGFuZCBmcmFnIGZvciB0aGUgYXNzb2NpYXRlZAotCWZ1bmN0aW9uIGxhYmVsIGlmIGl0IGV4aXN0cy4KLQotV2VkIEphbiAxMiAyMjowNTozMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfc3RydWN0KTogQWRkIG5ldyAic2VnbWVudCIgZmllbGQuCi0JKGhwcGFfZml4X25ldyk6IEluaXRpYWxpemUgc2VnbWVudCBmaWVsZC4KLQkobWRfYXBwbHlfZml4KTogRG8gbm90aGluZyBmb3IgcGMtcmVsYXRpdmUgZml4dXAgd2hpY2ggaW52b2x2ZXMKLQljcm9zc2luZyBhIHNlZ21lbnQgYm91bmRhcnkuCi0JKHBhX3Byb2NlbmQpOiBVbmRlZmluZSB0aGUgY3VycmVudCBsYWJlbCBhZnRlciBoYW5kbGluZyAuUFJPQwotCWFuZCAuUFJPQ0VORCBkaXJlY3RpdmVzLgotCShkdW1teV9zeW1ib2wpOiBNYWtlIHR5cGUgInN5bWJvbFMgKiIuICBDaGFuZ2UgcmVmZXJlbmNlcyBhcwotCWFwcHJvcHJpYXRlLgotCi1XZWQgSmFuIDEyIDEzOjI5OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYXN0IGFycmF5IGFyZ3VtZW50IHRvIHVuc2lnbmVkCi0JY2hhci4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzeW1zZWdpbmZvLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IGRlZmluZSBwdW50X2l0IGlmIGl0IHdvbid0IGJlIHVzZWQuCi0JKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBkZWZpbmUgc2tpcCBpZiBpdCB3b24ndCBiZSB1c2VkLgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIGFzIG1pcHNfdGFyZ2V0X2Zvcm1hdC4KLQkobWlwc190YXJnZXRfZm9ybWF0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IERlZmluZSB3aXRoIGFwcHJvcHJpYXRlCi0JZGVmYXVsdCBkZWZpbml0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiAtRUwgb3IgLUVCIGlzIHVzZWQsIGNoYW5nZSBieXRlX29yZGVyIGFuZAotCW1pcHNfdGFyZ2V0X2Zvcm1hdCBhcyBhcHByb3ByaWF0ZS4KLQotVHVlIEphbiAxMSAyMTo1MjozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFub3RoZXIgYXR0ZW1wdCB0byBmaXggYnVncwotCWRlYWxpbmcgd2l0aCBsYWJlbHMgd2l0aG91dCBjb2xvbnMgKGZvciBIUFBBIGFuZCBNUkkpLgotCi1UdWUgSmFuIDExIDE3OjAxOjA2IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFRydW5jYXRlIGFyZ3MgdG8gJWhpLyVsbyB0byAzMiBiaXRzLgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBGaXggY29tcHV0YXRpb24gb2YgdG9vX21hbnlfZGlnaXRzLgotCVZhcmlhYmxlIGRpZ2l0XzIgcmVuYW1lZCB0byBzdGFydC4gIEZpeCBjaGVjayBmb3Igd2hldGhlciBudW1iZXIKLQl3aWxsIGZpdCBpbiAzMiBiaXRzLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgdmFsdWVUIGluc3RlYWQgb2YgbG9uZy4KLQotVHVlIEphbiAxMSAxMzowMToyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IElmIFRDX01JUFMsIGluY2x1ZGUgZWxmL21pcHMuaC4KLQkoc3BlY2lhbF9zZWN0aW9ucyk6IERlZmluZS4KLQkob2JqX2VsZl9zcGVjaWFsX3NlY3Rpb24pOiBHZXQgZGVmYXVsdCB0eXBlcyBhbmQgYXR0cmlidXRlcyBmcm9tCi0JbGlzdCBvZiBzcGVjaWFsIHNlY3Rpb25zLgotCSogY29uZmlnL3RjLW1pcHMuYyAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRm9yY2UgLnNkYXRhIGFuZCAuc2JzcwotCXNlY3Rpb25zIHRvIGJlIGNsb3NlIHRvZ2V0aGVyLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3RlZCAkYXQgd2FybmluZ3MgaW4gYSBjb3VwbGUgb2YKLQlzcG90cy4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX3ByZXZfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpc3RpbmcuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKGxpc3RpbmdfcHJldl9saW5lKTogTmV3IGZ1bmN0aW9uLgotCShjYWxjX2hleCk6IFJlc2V0IGJ5dGVfaW5fZnJhZyB0byB6ZXJvIGZvciBlYWNoIG5ldyBmcmFnLgotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBDYWxsIGxpc3RpbmdfcHJldl9saW5lIGFmdGVyCi0JZW1pdHRpbmcgbm9wIGluc3RydWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChsaXN0aW5nLm8pOiBEZXBlbmRzIHVwb24gc3Vic2Vncy5oLgotCi1Nb24gSmFuIDEwIDA5OjUyOjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFB1dCBjaGVjayBmb3IgbWlzc2luZyBsYWJlbCBvbiAuUFJPQwotCWhlcmUuICBIYW5kbGUgY2FzZSB3aGVyZSBsYWJlbCBtYXkgYmUgZGVmaW5lZCBhZnRlciB0aGUgLlBST0MuCi0JKHBhX3Byb2MpOiBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhlIHByb2NlZHVyZSdzIGxhYmVsIGlzbid0Ci0JZGVmaW5lZCBiZWZvcmUgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotU3VuIEphbiAgOSAwNDo0MzozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RlLW5ldGJzZC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRBUkdFVF9GT1JNQVQpIFtURV9OZXRCU0RdOiBVc2UgYmZkIHRhcmdldAotCWEub3V0LW5ldGJzZC0zODYgZm9yIHRoaXMgY29uZmlndXJhdGlvbi4KLQotRnJpIEphbiAgNyAxNzozODoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBEb24ndCBjbG9iYmVyIHRoZSBFQ09GRiBzeW1ib2wgaW5mb3JtYXRpb24KLQl3aXRoIHRoZSBhc3NvY2lhdGVkIHN0YWJzIGluZm9ybWF0aW9uLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogTmV2ZXIgc2V0IHRoZSB0eXBlIG9mIHN0YWJzIHN5bWJvbHMgdG8KLQlzdF9HbG9iYWwuICBEb24ndCB1cGRhdGUgdGhlIHN5bWJvbCBpbmRleCBvciBpZmQgaWYgdGhlIGdhcyBzeW1ib2wKLQlpcyBub3QgdGhlIHNhbWUgYXMgdGhlIEVDT0ZGIHN5bWJvbCAod2hpY2ggaXMgbm93IHRoZSBjYXNlIGZvcgotCXN0YWJzIHN5bWJvbHMpLgotCi1GcmkgSmFuICA3IDExOjE0OjA3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBBZGQgYSBMT1NJTkdfQ09NUElMRVIgaWZkZWYgdGhhdAotCXNwbGl0cyB0aGUgZnVuY3Rpb24uCi0JKG1hY3JvMik6IE5ldyBmdW5jdGlvbiwgaWYgTE9TSU5HX0NPTVBJTEVSIGRlZmluZWQuCi0KLUZyaSBKYW4gIDcgMDk6Mzg6MjUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6ICBEb24ndCBldmVyIGZpbGwgcGFzdCB0aGUKLQllbmQgb2YgYSBzZWN0aW9uLiAod3JpdGVfb2JqZWN0X2ZpbGUpOiBUZW1wb3JhcnkgZml4IC0gc2V0dXAKLQlzdGRvdXRwdXQuCi0KLVRodSBKYW4gIDYgMTg6MDU6MjEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCBoYW5kbGluZyBvZiBhZGRlbmRzIGluCi0Jbm9uLXBjcmVsX29mZnNldCByZWxvY2F0aW9ucy4KLQotVGh1IEphbiAgNiAwMTowNjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBXYXJuIGFib3V0IHVzaW5nICQxIGFzIHdlbGwgYXMgJGF0Ci0Jd2l0aG91dCAuc2V0IG5vYXQuCi0KLVdlZCBKYW4gIDUgMTQ6MjI6MjIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGl0ZXJhbC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMsIE9CSlMpOiBMaXN0IGl0LgotCi0JKiBhcy5oIChERUJVRyk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGV4cHJlc3Npb25TLCBzdHJ1Y3QgZml4KTogRGVjbGFyZSBpbiBjYXNlIHRoZXkncmUgdXNlZCBpbgotCXByb3RvdHlwZXMuCi0JKGFkZF90b19saXRlcmFsX3Bvb2wpIFtCRkRfQVNTRU1CTEVSXTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoVEFSR0VUX0ZPUk1BVCkgW09CSl9BT1VUXTogRml4IGZvciBuZXcgbmFtZXMKLQlpbiBiZmQuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2dldCk6IE5ldyBmdW5jdGlvbi4gIENyZWF0ZXMgc2VnbWVudCBpZgotCW5lZWRlZCwgcmV0dXJucyBwb2ludGVyLCBidXQgZG9lc24ndCBjaGFuZ2UgY3VycmVudCBzZWdtZW50LgotCShzdWJzZWdfbmV3KTogVXNlIGl0LgotCi1UdWUgSmFuICA0IDE1OjEyOjQzIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogQWRkICQoc3JjZGlyKS8uLiB0byBwbGFjZXMgdG8gc2VhcmNoLgotCSogY29uZmlnL29iai1lY29mZi5jOiBJbmNsdWRlIGZpbGVzIGFzICJiZmQvIiBpbnN0ZWFkIG9mICIuLi9iZmQvIi4KLQkqIGFwcC5jLCBmbG9udW0uaCwgaGV4LXZhbHVlLmMgKGNvbnN0KTogQ2hhbmdlICNpZiB0byBiZSBtb3JlCi0JcG9ydGFibGUuCi0KLVR1ZSBKYW4gIDQgMjI6MTE6MzQgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tdnN0YS5oLCBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBWU1RhCi0JbWljcm8ta2VybmVsLgotCi1UaHUgRGVjIDMwIDE1OjI3OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBub3cgdGFrZXMgYW4KLQlhZGRpdGlvbmFsIGFyZ3VtZW50LCB0byByZXR1cm4gYW4gZXJyb3Igc3RyaW5nICh3aGljaCB3ZSBpZ25vcmUpLgotCi1XZWQgRGVjIDI5IDE0OjM3OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBGaWVsZCB0Y19maXhfZGF0YSBzaG91bGQgYmUgdHlwZSBQVFIsIG5vdAotCXZvaWQqLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1BTlNJIGNvbXBpbGVycy4gIEFkZGVkCi0Jc2luZ2xlLWJpdCBmaWVsZCAiZnhfZG9uZSIuCi0KLVN1biBEZWMgMjYgMTQ6MzE6NDcgMTk5MyAgVG9yYmpvcm4gR3Jhbmx1bmQgICh0ZWdlQGFkZGVyLmN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQ29udmVydCB0byBsb3dlciBjYXNlLgotCURlbGV0ZSBzcHVyaW91cyByZWdpc3RlciBuYW1lcyAiJXI0TCIsIGV0Yy4KLQkoc2VsZWN0b3JfdGFibGUpOiBTb3J0IGFuZCBjb252ZXJ0IHRvIGxvd2VyIGNhc2UuCi0JKGNvbnNfZml4X25ld19ocHBhKTogYHJlbG9jX3R5cGUnID0+IGByZWxfdHlwZScuCi0JKHBhX2lwKTogQWx3YXlzIHVzZSBzdHJjbXAgZm9yIG5vbi10ZXh0IGFuZCBzdHJjYXNlY21wIGZvciB0ZXh0LgotCShyZWdfbmFtZV9zZWFyY2gpOiBSZXdyaXRlIHRvIGNhbGwgc3RyY2FzZWNtcCBvbmx5IG9uY2UgcGVyCi0JaXRlcmF0aW9uLgotCShwYV9jaGtfZmllbGRfc2VsZWN0b3IpOiBSZXdyaXRlIHRvIHVzZSBiaW5hcnkgc2VhcmNoLgotCShwYV9wYXJzZV9uZWdfYWRkX2NtcGx0cik6IFVzZSBzdHJjYXNlY21wIGZvciBjb21wbGV0ZXIgY29tcGFyaXNvbnMuCi0JKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiAkVEVYVCQgYW5kICRQUklWQVRFJCBhcmUgc3ltYm9sczsgdXNlIGNhc2UKLQlzZW5zaXRpdmUgY29tcGFyaXNvbnMuCi0JKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBDYW5vbmljYWxpemUgc3RybmNhc2VjbXAgYXJnIHRvIGxvd2VyIGNhc2UuCi0JKHBhX3NwYWNlKTogIiR0ZXh0JCIgPT4gIiRURVhUJCI7ICIkcHJpdmF0ZSQiID0+ICIkUFJJVkFURSQiLiAgVXNlCi0JY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBmb3IgYWxsIHN5bWJvbGljIG5hbWVzLgotCShwYV9zdWJzcGFjZSk6IENhbm9uaWNhbGl6ZSBzdHJuY2FzZWNtcCBhcmcgdG8gbG93ZXIgY2FzZS4KLQkocGFfc3Vic3BhY2Vfc3RhcnQpOiBVc2UgY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBmb3Igc3ltYm9saWMgbmFtZXMuCi0KLU1vbiBEZWMgMjAgMTA6Mzc6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpIFtSRUxPQ19SRVFVSVJFU19TWU1CT0xdOiBJZiBubwotCXN5bWJvbCBpcyBwcmVzZW50IChpLmUuLCByZWxvY2F0aW9uIGFnYWluc3QgYWJzb2x1dGUpLCBjcmVhdGUgYQotCXBob255IGxvY2FsIHN5bWJvbCwgYW5kIHVzZSBpdCBpbiB0aGUgcmVsb2MuCi0JKGZpeHVwX3NlZ21lbnQpOiBXaGVuIGFkanVzdGluZyBhIHJlbG9jIHdpdGggYW4gYWJzb2x1dGUgc3ltYm9sLAotCWhhdmUgVENfRk9SQ0VfUkVMT0NBVElPTiBjb250cm9sIGNsZWFyaW5nIGFkZF9zeW1ib2xQIHRvby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChSRUxPQ19SRVFVSVJFU19TWU1CT0wpOiBEZWZpbmUsIGZvciBPQkpfQ09GRi4KLQotCSogc3ltYm9scy5jIChTX0lTX0VYVEVSTkFMLCBTX0lTX0xPQ0FMKTogRG9uJ3QgdXNlIGJvdGggQlNGX0VYUE9SVAotCWFuZCBCU0ZfR0xPQkFMLCBzaW5jZSB0aGV5J3JlIHRoZSBzYW1lLgotCi0JKiBhcy5jIChtYWluKTogT25seSBpbnZva2UgbWRfZW5kIGlmIGl0J3MgZGVmaW5lZCBhcyBhIG1hY3JvLgotCSogdGMuaCAobWRfZW5kKTogRG9uJ3QgZGVjbGFyZSBpdC4KLQkqIGNvbmZpZy90Yy0qLltjaF0gKG1kX2VuZCk6IERlbGV0ZWQsIGluIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgZG8KLQlhbnl0aGluZy4KLQkqIGNvbmZpZy90Yy12YXguYyAodmlwX2VuZCk6IERlbGV0ZWQgbnVsbCBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX21pcHNfZW5kKTogUmVuYW1lZCBmcm9tIG1kX2VuZC4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1kX21pcHNfZW5kKTogRGVjbGFyZS4KLQkobWRfZW5kKTogTmV3IG1hY3JvLCBjYWxscyBtZF9taXBzX2VuZC4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCBjbG9zZSBvdXRwdXQgZmlsZS4KLQkqIGFzLmMgKG1haW4pOiBDbG9zZSBvdXRwdXQgZmlsZSAoaWYgbmVlZGVkKSBhZnRlciBjYWxsaW5nCi0JbGlzdGluZ19wcmludCwgd2hpY2ggc2hvdWxkIGJlIGFmdGVyIGNhbGxpbmcgd3JpdGVfb2JqZWN0X2ZpbGUsCi0Jd2hpY2ggc2V0cyB0aGUgZnJhZyBhZGRyZXNzZXMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kaW0sIG9ial9jb2ZmX2VuZGVmLCBvYmpfY29mZl9saW5lLAotCW9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfc2l6ZSwgb2JqX2NvZmZfdGFnLCBvYmpfY29mZl90eXBlLAotCW9ial9jb2ZmX3ZhbCk6IEFkZCB1bnVzZWQgaW50IGFyZ3VtZW50IHRvIHNhdGlzZnkgcHJvdG90eXBlczsgZ29lcwotCXdpdGggSWFuJ3MgMTAgU2VwIGNoYW5nZXMuCi0JKFNfR0VUX0RBVEFfVFlQRSwgU19TRVRfREFUQV9UWVBFLCBTX0dFVF9TVE9SQUdFX0NMQVNTLAotCVNfU0VUX1NUT1JBR0VfQ0xBU1MpOiBOb3cgZnVuY3Rpb24gaW5zdGVhZCBvZiBtYWNyb3MuCi0JKG9ial9lbWl0X2xpbmVubykgW0JGRF9BU1NFTUJMRVJdOiBEZWxldGVkLgotCSh0YWdfaW5zZXJ0KTogTG9jYWwgdmFyIEVSUk9SX1NUUklORyBpcyBjb25zdC4gIFVzZSAiY29uc3QiIG5vdAotCSJDT05TVCIgZm9yIGFyZ3VtZW50IE5BTUUuICBGaXhlZCBwcm90b3R5cGUuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIGV4cGxpY2l0ICIjaWYgMSIgZGlyZWN0aXZlLiAgSWYKLQlTX0lTX0VYVEVSTkFMLCBzZXQgc3RvcmFnZSBjbGFzcyB0byBDX0VYVC4KLQkoc19nZXRfbmFtZSk6IFVzZSAiY29uc3QiIG5vdCAiQ09OU1QiLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNfR0VUX0RBVEFfVFlQRSwgU19TRVRfREFUQV9UWVBFLAotCVNfR0VUX1NUT1JBR0VfQ0xBU1MsIFNfU0VUX1NUT1JBR0VfQ0xBU1MpOiBEZWxldGVkLgotCShvYmpfZW1pdF9saW5lbm8pOiBEZWNsYXJlIG9ubHkgZm9yIG5vbi1CRkRfQVNTRU1CTEVSLiAgRm9yCi0JQkZEX0FTU0VNQkxFUiwgZGVmaW5lIGFzIG1hY3JvIHRoYXQgYWJvcnRzLgotCShvYmpfZXh0cmFfc3R1ZmYsIHRjX2hlYWRlcnNfaG9vayk6IERlY2xhcmUgb25seSBmb3IKLQlub24tQkZEX0FTU0VNQkxFUi4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IEZpeCBwcm90b3R5cGUuCi0KLVN1biBEZWMgMTkgMDA6Mzc6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogVGVzdCBvZiBwY3JlbF9vZmZzZXQgaGFkIHNlbnNlCi0JcmV2ZXJzZWQuCi0KLVRodSBEZWMgMTYgMjE6MTM6MTEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSAiZHVtbXlfbGFiZWwiLgotCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogRm9yIHJlbG9jYXRpb25zIHdoaWNoIGhhdmUgbm8gc3ltYm9sLAotCXNldCBzeW1fcHRyX3B0ciB0byBkdW1teV9sYWJlbC4gIEF2b2lkcyBsb3NzYWdlIGluIGdlbmVyaWMgQkZEIGNvZGUuCi0KLVRodSBEZWMgMTYgMTY6MDc6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChsZXhfdHlwZSk6IE5vIGxvbmdlciBtYWtlICdbJyBhIHZhbGlkIGNoYXJhY3RlciBmb3IKLQlzeW1ib2wgbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy12YXguYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBMb2NhbCB2YXJpYWJsZQotCU5CWVRFU19SX0xFTkdUSCBub3cgY29uc3QuCi0KLQkqIGNvbmZpZy9vYmotKi5jLCBjb25maWcvdGMtKi5jOiBPbWl0IHN1cGVyZmx1b3VzICJyZXR1cm4iCi0Jc3RhdGVtZW50cyBhdCBlbmRzIG9mIGZ1bmN0aW9ucy4gIERvbid0IGNoZWNrIGZvciBudWxsIHJldHVybiBmcm9tCi0JaGFzaF9uZXcsIHNpbmNlIGl0IHdvbid0IHJldHVybiBhdCBhbGwgaWYgdGhlcmUncyBubyBtZW1vcnkKLQlhdmFpbGFibGUuICBBbHNvLCBjaGVjayBmb3IgbnVsbCByZXR1cm4gZnJvbSBoYXNoX2luc2VydCwgcmF0aGVyCi0JdGhhbiB6ZXJvLWxlbmd0aCBzdHJpbmcsIGFzIHN1Y2Nlc3MgaW5kaWNhdG9yLgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogc3Vic2Vncy5oIChzZWN0aW9uX3N5bWJvbCk6IERlY2xhcmUuCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFVzZSBpdC4KLQotV2VkIERlYyAxNSAxNTozOTo1MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCk6IE5ldyB2YXJpYWJsZS4KLQkoQ0hFQ0tGTEFHUyk6IFBhc3MgaXQgZG93bi4KLQotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2ZyYW1lKTogUGVybWl0IGV4dHJhIHRyYWlsaW5nIG9wZXJhbmRzOwotCXVudXNlZCBmb3Igbm93LCBidXQgc3VwcGxpZWQgYnkgQWxwaGEgT1NGMSBjb21waWxlci4KLQotCSogYXMuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0JKGludF90b19nZW4pOiBEb24ndCBkZWNsYXJlLgotCi0JKiBjb25maWcvYXRvZi12YXguYyAoYXRvZl92YXgpOiBOVUxMIGlzIG5vdCBhIHZhbGlkIGNoYXJhY3RlcgotCWNvbnN0YW50LgotCi1UdWUgRGVjIDE0IDIxOjM4OjI1IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotb3NmKik6IERvIG5vdCBjb25zaWRlciB0aGlzIGEgZGV2ZWxvcG1lbnRhbAotCWNvbmZpZ3VyYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBjYXNlcyB3aGVyZSBubwotCXJlbG9jYXRpb24gd2lsbCBiZSBlbWl0dGVkIGZvciAzMmJpdCBmb3JtYXRzLgotCi1Nb24gRGVjIDEzIDIzOjMzOjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEbyBub3QgY2FsbCBocHBhX2ZpZWxkX2FkanVzdAotCWZvciBhbnkgb2YgdGhlICdUJyBmaWVsZCBzZWxlY3RvcnMuCi0KLVNhdCBEZWMgMTEgMTE6MjM6MTIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChidWlsZF9ieXRlcyk6IEdldCByZWxvYyB0eXBlIHJpZ2h0IGZvciBhCi0JJXBhZ2Ugb3BlcmF0aW9uLiAobWRfYXNzZW1ibGUpOiBEb24ndCBtb2RpZnkgaW5wdXRfbGluZV9wb2ludGVyLgotCShtZGNvZmZfc2l6ZW1hY2hkZXApOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoVENfQ09GRl9TSVpFTUFDSERFUCk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy16OGsuYyAoZ2V0X29wZXJhbmQpOiBEZWxldGUgYm9ndXMgY2hlY2suCi0KLVdlZCBEZWMgIDggMTY6MzE6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChudW1iZXJfdG9fY2hhcnNfKik6IERlbGV0ZSBib2d1cyByYW5nZSBjaGVjay4KLQotCSogb3V0cHV0LWZpbGUuYyAoVEFSR0VUX0FSQ0gpOiBObyBkZWZhdWx0LgotCi1UdWUgRGVjICA3IDE2OjAyOjUzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBUcnVuY2F0ZSBkaXNwcyBiZWZvcmUgY2FsbGluZwotCW1kX251bWJlcl90b19jaGFycy4gIChtZF9hc3NlbWJsZSk6IERvbid0IG1vZGlmeQotCWlucHV0X2xpbmVfcG9pbnRlci4KLQotTW9uIERlYyAgNiAxMTo0OTowMyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCB1cGRhdGUgaW5wdXRfbGluZV9wb2ludGVyLgotCi1Nb24gRGVjICA2IDExOjIwOjAyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5bY2hdIChvYmpfcmVhZF9iZWdpbl9ob29rKTogUmVtb3ZlIGxhc3QgY2hhbmdlLgotCUJyZWFrcyB3aXRoIHRoZSBIUCBjb21waWxlcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHN0cnVjdCBjYWxsX2luZm8pOiBSZW1vdmUgZmllbGRzIHdoaWNoIHdlcmUKLQlzZXQgYnV0IG5ldmVyIHVzZWQuICBSZW1vdmUgYWxsIGNvZGUgd2hpY2ggc2V0cyB0aG9zZSBmaWVsZHMuCi0JKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogTGlrZXdpc2UuCi0JKHBhX2Rlc2MpOiBEZWxldGUgdXNlbGVzcyBmdW5jdGlvbi4gIERlbGV0ZSBhbGwgcmVmZXJlbmNlcy4KLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTm8gbmVlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZm9yCi0JdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4KLQotU3VuIERlYyAgNSAxNzowNToyOSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uKTogUGFzcyB2ZXJzaW9uIHN0cmluZyB0bwotCVNPTSBCRkQgYmFja2VuZC4KLQkob2JqX3NvbV9jb3B5cmlnaHQpOiBOZXcgZnVuY3Rpb24uICBNdWNoIGxpa2Ugb2JqX3NvbV92ZXJzaW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChvYmpfY29weXJpZ2h0KTogRGVmaW5lIGFzIGFwcHJvcHJpYXRlIGZvcgotCVNPTSBhbmQgRUxGLgotCShwYV9jb3B5cmlnaHQpOiBKdXN0IGEgc3R1YiBub3cuCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9yZWFkX2JlZ2luX2hvb2spOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1zb20uaCAob2JqX3JlYWRfYmVnaW5faG9vayk6IFByb3ZpZGUgZHVtbXkgZGVmaW5pdGlvbi4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEZWxldGUuICBTT00gaXNuJ3QgbWFraW5nIHVzZSBvZiB0aGVtLgotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIHJlbG9jYXRpb24KLQlleHBhbnNpb24gZHVlIHRvIHJvdW5kaW5nIG1vZGUgc2VsZWN0b3JzLiAgSGFuZGxlIFJfW1JEU05dX01PREUKLQlyZWxvY2F0aW9ucyBmb3Igc2VsZWN0aW5nIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGV2YWx1YXRlX2Fic29sdXRlKTogU3VwcG9ydCBlX3Jyc2VsIGFuZAotCWVfcmxzZWwgZmllbGQgc2VsZWN0b3JzLgotCi1GcmkgRGVjICAzIDE4OjMzOjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaDogSWYgRUNPRkZfREVCVUdHSU5HLCB1bmRlZgotCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMgYW5kIElOSVRfU1RBQl9TRUNUSU9OLCBhbmQgZGVmaW5lCi0JT0JKX1BST0NFU1NfU1RBQiB0byBjYWxsIGVjb2ZmX3N0YWIuCi0JKiBjb25maWcvb2JqLWVsZi5jOiBEb24ndCBjb21waWxlIG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gaWYKLQlJTklUX1NUQUJfU0VDVElPTiBpcyBub3QgZGVmaW5lZC4KLQotRnJpIERlYyAgMyAxMDo1Njo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRGVsZXRlIG9sZCB3cmFwcGVyIGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXhfMSk6IFJlbmFtZSB0byBtZF9hcHBseV9maXguICBGaXggYXJndW1lbnQgZGVjbHMuCi0JRml4IGNvbW1lbnRzIGluIHZhcmlvdXMgcGxhY2VzLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCUF2b2lkIGRlcmVmZXJlbmNpbmcgYSBOVUxMIGZ4X2FkZHN5LgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBBdm9pZCBkZXJlZmVyZW5jaW5nIGEgTlVMTCBmeF9hZGRzeS4KLQotCUZyaSBEZWMgIDMgMDk6NDc6MzAgMTk5MyAgUGV0ZSBIb29nZW5ib29tICAoaG9vZ2VuQGNzLnV0YWguZWR1KQotCi0JKiB0Yy1ocHBhLmM6ICh0Y19nZW5fcmVsb2MpOiBBZGRlbmQgZm9yIGEgcGxhYmVsIHJlbG9jYXRpb24gc2hvdWxkCi0JYmUgZWl0aGVyIDAgb3IgMiAobm8gc3RhdGljIGxpbmsgb3Igc3RhdGljIGxpbmsgcmVxdWlyZWQpLiAgQWx3YXlzCi0JYXNzdW1lIG5vIHN0YXRpYyBsaW5rLgotCi1UaHUgRGVjICAyIDExOjUyOjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogTWFrZSBhZGp1c3RtZW50IHRvIGFkZGVuZCBiZQotCWRlcGVuZGVudCBvbiBob3d0byBmaWVsZHMsIG5vdCBvbiBmb3JtYXQgZmxhdm91ci4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBOZXcgZmllbGRzIHN5X29iaiBhbmQgc3lfdGMsCi0JZGVmaW5lZCBhcyB0eXBlcyBPQkpfU1lNRklFTERfVFlQRSBhbmQgVENfU1lNRklFTERfVFlQRSwgaWYgdGhvc2UKLQltYWNyb3MgYXJlIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVENfU1lNRklFTERfVFlQRSwgT0JKX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUuCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTLCBJOTYwX1NZTV9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKHN5X3RjLCBzeV9vYmopOiBEZWZpbmUgc28gdGhhdCB0aGUgZmllbGRzIGxvb2sgbGlrZSB0aGV5IHVzZWQgdG8sCi0JdW50aWwgYWxsIHJlZmVyZW5jZXMgZ2V0IGNoYW5nZWQuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBMb3RzIG9mIHZhcmlhYmxlcyBubyBsb25nZXIgcmVnaXN0ZXIuCi0JUmVvcmRlcmVkIHNvbWUgY29kZSBmb3IgZWFzaWVyIHJlYWRpbmcuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGltKTogZGltX2luZGV4IG5vIGxvbmdlciByZWdpc3Rlci4KLQlEZWxldGVkIHN1cGVyZmx1b3VzIHJldHVybiBzdGF0ZW1lbnQuCi0JKG9ial9jb2ZmX2xpbmUsIG9ial9jb2ZmX3NpemUsIG9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfdHlwZSwKLQlvYmpfY29mZl92YWwsIHRhZ19pbml0LCB0YWdfaW5zZXJ0KTogRGVsZXRlZCBzdXBlcmZsdW91cyByZXR1cm4KLQlzdGF0ZW1lbnQuCi0JKGFsaWduLCBvYmpfY29mZl9zZWN0aW9uKTogRGVsZXRlZCBkZWJ1Z2dpbmcgcHJpbnRmcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRGlzY2FyZCBzb21lIHJlZ2lzdGVyIGRlY2xzLgotCVVzZSBhc3NpZ25tZW50IHJhdGhlciB0aGFuIG1lbWNweSB0byBjb3B5IHRlbXBsYXRlLgotCShvcF9oYXNoLCByZWdfaGFzaCwgcHJlZml4X2hhc2gpOiBEZWZhdWx0IEMgaW5pdGlhbGl6YXRpb24gb2YKLQlzdGF0aWNzIGlzIHN1ZmZpY2llbnQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAocHJpbnRfaW5zbik6IEFycmF5IFJlbG9jIGlzIG5vdyBjb25zdCwgYW5kCi0JcG9pbnRzIHRvIGNvbnN0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVEFSR0VUX0ZPUk1BVCk6IE9ubHkgdXNlIGNvZmYtc3BhcmMtbHlueCBpZgotCVRFX0xZTlg7IHVzZSBjb2ZmLXNwYXJjIG90aGVyd2lzZS4KLQlbVVNFX05BVElWRV9IRUFERVJTXTogRGVsZXRlIHRoaXMgY29kZTsgaXQgaXNuJ3QgdXNlZC4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENhbGwgVENfVkFMSURBVEVfRklYLCBpZiBkZWZpbmVkLAotCWJlZm9yZSBwcm9jZXNzaW5nIGEgZml4dXAuICBDYWxsIFRDX0FESlVTVF9SRUxPQ19DT1VOVCBqdXN0IGJlZm9yZQotCXJldHVybmluZy4gIFJlbW92ZSBzb21lIGk5NjAtY29mZi1zcGVjaWZpYyBjb2RlLgotCShUQ19BREpVU1RfUkVMT0NfQ09VTlQpOiBEZWZhdWx0IHRvIGRvaW5nIG5vdGhpbmcuCi0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19BREpVU1RfUkVMT0NfQ09VTlQpIFtPQkpfQ09GRl06IERlZmluZS4KLQkoaTk2MF92YWxpZGF0ZV9maXgpOiBEZWNsYXJlLgotCShUQ19WQUxJREFURV9GSVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTk2MC5jIChpOTYwX3ZhbGlkYXRlX2ZpeCk6IE5ldyBmdW5jdGlvbi4KLQotCSogd3JpdGUuYyAobnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbik6IE5ldyBmdW5jdGlvbi4gIFdyaXRlIG91dAotCWJ5dGVzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIsIGRvaW5nIHNpemUgYW5kIHJhbmdlIGNoZWNraW5nLgotCShudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuKTogTmV3IGZ1bmN0aW9uLCBzaW1pbGFyLgotCSogd3JpdGUuaDogRGVjbGFyZSB0aGVtLgotCSogY29uZmlnL3RjLSouYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogVXNlIHRoZW0uCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2FwcGx5X2ZpeCk6IERpdHRvLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4KTogRGl0dG8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBSZWFycmFuZ2VkIGNvZGUgZm9yIGhhbmRsaW5nIGxpbmUgbnVtYmVyCi0JZGF0YS4KLQkobGluZV9mc3ltKTogUmVuYW1lZCBmcm9tIGZ1bmN0aW9uX2xpbmVvZmYgaW4gQkZEX0FTU0VNQkxFUiBjYXNlLAotCXNpbmNlIHRoZSB1c2FnZSBpcyBkaWZmZXJlbnQgZnJvbSBub24tQkZEX0FTU0VNQkxFUiBjYXNlLgotCShpbl9mdW5jdGlvbiwgY2xlYXJfZnVuY3Rpb24sIHNldF9mdW5jdGlvbik6IE5ldyBtYWNyb3MsIHRvCi0JY29tYmluZSBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkIGluIGRpZmZlcm5ldCB3YXlzIGluCi0JQkZEX0FTU0VNQkxFUiBhbmQgbm9uLS4uLiBjb2RlLiAgVXNlZCBpbiBvdGhlciBmdW5jdGlvbnMgdGhhdCB1c2VkCi0JdG8gY2hlY2sgZnVuY3Rpb25fbGluZW9mZiAmYy4KLQkob2JqX2VtaXRfbGluZW5vKTogU3BsaXQgaW50byB0d28gY29waWVzLCBvbmUgZm9yIEJGRF9BU1NFTUJMRVIsCi0Jb25lIGZvciBub3QuICBOb24tQkZEX0FTU0VNQkxFUiB2ZXJzaW9uIG5vdyBoYXMgdGVtcG9yYXJ5IHZhcmlhYmxlCi0JdG8gY29udGFpbiBjaGFyKiBwb2ludGVyIHBvaW50ZWQgdG8gYnkgY2hhcioqIGFyZ3VtZW50LiAgQWx3YXlzCi0JZm9sbG93IENST1NTX0NPTVBJTEUgY29kZTsgZWFzaWVyIHRvIHJlYWQgdGhhdCB3YXkuCi0JKG9ial9jb2ZmX2xuKTogRG9uJ3QgY2FsbCBhZGRfbGluZW5vIG9yIGNfbGluZV9uZXcgaWYgYXBwbGluZSBpcwotCXNldC4KLQkob2JqX2NvZmZfZW5kZWYpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IKLQkiLmJmIiwgaXQncyBiZWVuIGRvbmUgZWxzZXdoZXJlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogSWYgaWxuZSBudW1iZXIgZGF0YSBpcyBwZW5kaW5nLCBjYWxsCi0JYWRkX2xpbmVzeW0gdG8gZmx1c2ggaXQuCi0JKGNvZmZfZnJvYl9maWxlKTogRG9uJ3QgZG8gdGhhdCBoZXJlLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfZnJvYl9maWxlKTogRGVjbGFyZS4KLQkob2JqX2Zyb2JfZmlsZSk6IERlZmluZSwgdG8gY2FsbCBpdC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4OiBEZWZpbmUgdGhlbSBhcyBtYWNyb3MgY2FsbGluZwotCWFzX2ZhdGFsLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IERvbid0IGRlZmluZSB0aGVtIGFzIGZ1bmN0aW9ucy4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgdGFyZ2V0IGFscGhhLSotb3NmKi4gIChObyBjcHUgZmlsZXMgeWV0LikKLQotV2VkIERlYyAgMSAyMzozNzoxNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUgKGNsZWFuKTogRGVwZW5kIG9uIGNsZWFuLWhlcmUuCi0KLVdlZCBEZWMgIDEgMTE6MzU6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLWdvMzIuaDogSW5jbHVkZSBmb3Blbi1iaW4uaC4KLQkqIGFzLmg6IElmIEZPUEVOX1dCIGlzbid0IGRlZmluZWQsIGluY2x1ZGUgZm9wZW4tc2FtZS5oLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogVXNlIEZPUEVOX1dCIGluc3RlYWQgb2YgInciLgotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX29wZW4pOiBVc2UgRk9QRU5fUlQgaW5zdGVhZCBvZiAiciIuCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mbyk6IFVzZSBGT1BFTl9SQiBpbnN0ZWFkIG9mICJyYiIuCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IFVzZSBGT1BFTl9SVCBpbnN0ZWFkIG9mICJyIi4KLQotCSogc3RhYnMuYzogSW5jbHVkZSBvYnN0YWNrLmguCi0KLQkqIHRjLmggKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEb24ndCBkZWNsYXJlIGlmIGl0J3MgYWxyZWFkeQotCWRlZmluZWQgYXMgYSBtYWNyby4KLQkobWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRGl0dG8uCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcikgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX2Vycm1zZyBpbnN0ZWFkCi0Jb2Ygc3RyZXJyb3IuICBDbGVhciBiZmRfZXJyb3IuCi0KLQkqIGNvbmZpZy90ZS1seW54LmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZSwgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCi1XZWQgRGVjICAxIDEwOjQxOjU2IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkocGFfcHJvY2Vzc19leGl0LCBwYV9wcm9jZW5kKTogQ2FsbCBpdCBmb3IgRUxGIG9iamVjdHMuCi0KLVdlZCBEZWMgIDEgMTI6MTA6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFN1YnRyYWN0IDggZnJvbSBvZmZzZXQgaW4gbm9uIFBJQyBsLmQKLQljYXNlLiAgU2VlIGNvbW1lbnQuICBGcm9tIHdpbHNvbkBjeWdudXMuY29tOiBmb3IgTV9MX0RBQiwgc2V0Ci0JY29wcm9jIGJlZm9yZSBkb2luZyBnb3RvIGxkLgotCi1UdWUgTm92IDMwIDEzOjQwOjMwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB3cml0ZS5jIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogUHJvdmlkZSBhIGRlZmF1bHQgZGVmaW5pdGlvbi4KLQkoZml4dXBfc2VnbWVudCk6IEFsbG93IHRoZSB0YXJnZXQgbWFjaGluZSB0byBzcGVjaWZ5IHRoYXQgYQotCXJlbG9jYXRpb24gbXVzdCBiZSBnZW5lcmF0ZWQgZm9yIGEgcGFydGljdWxhciBmaXh1cC4gIFJlbW92ZQotCSNpZm5kZWYgVENfSFBQQSBoYWNrLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXhfMSk6IE5ldmVyIGNoYW5nZSBmeF9hZGRzeSB0bwotCWJlIE5VTEwuICBPbmx5IGZpeHVwX3NlZ21lbnQgaXMgc3VwcG9zZWQgdG8gZG8gdGhhdC4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgTm92IDMwIDExOjIxOjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0YWJzLm8pOiBBZGRlZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRG9uJ3QgY2FsbCBiZmRfc2V0X3N5bXRhYi4KLQotU3VuIE5vdiAyOCAxMjoxMTo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IE91dHB1dCBhIFRBQiBiZWZvcmUgYW55Ci0JLmFwcCogZGlyZWN0aXZlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBNYWtlIHN1cmUgYSBzdWJfc3ltYm9sCi0JZXhpc3RzIGJlZm9yZSB0cnlpbmcgdG8gcGVlayBhdCBpdHMgbmFtZS4KLQkocGFfc3BhY2UpOiBEbyBub3QgY2FsbCBwYV9hbGlnbl9zdWJzZWcuICBTZWUgaHBwYS91bnNvcnRlZC9hbGlnbjMucwotCWZvciB0ZXN0Y2FzZS4KLQkocGFfYWxpZ25fc3Vic2VnKTogRGVsZXRlIHVudXNlZC91bndhbnRlZCBmdW5jdGlvbi4KLQotU2F0IE5vdiAyNyAyMjo0OTowNyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBGaXggdGVzdCBmb3Igd2hlbiB0byBzdGljayBhIGNvbG9uCi0Jb24gdGhlIGVuZCBvZiBhIGxhYmVsLiAgTWFrZSBjb2RlIGNvbmRpdGlvbmFsIG9uIGVpdGhlciBNUkkgb3IKLQlMQUJFTFNfV0lUSE9VVF9DT0xPTlMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBhIGxpbmUgYmVnaW5zIHdpdGggd2hpdGVzcGFjZSwgbGVhdmUKLQl0aGUgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGFsb25lLiAgRWF0IGFsbCBvdGhlcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKExBQkVMU19XSVRIT1VUX0NPTE9OUyk6IERlZmluZS4KLQotV2VkIE5vdiAyNCAwMToyMjo1NCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvY2VuZCk6IERvIG5vdCBjYWxsIHByb2Nlc3NfZXhpdC4KLQkoZXhpdF9wcm9jZXNzaW5nX2NvbXBsZXRlKTogRGVsZXRlIHVud2FudGVkIHZhcmlhYmxlIGFuZCBhbGwKLQlyZWZlcmVuY2VzLgotCi1XZWQgTm92IDI0IDAyOjMxOjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0dXBfZXh0KTogUmVuYW1lZCBmcm9tIGVjb2ZmX2J1aWxkX2V4dC4KLQlDaGFuZ2VkIHRvIG5vdCBhY3R1YWxseSBidWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLCBhcwotCXRoYXQgaXMgbm93IGRvbmUgYnkgdGhlIEVDT0ZGIGJhY2sgZW5kLgotCShlY29mZl9idWlsZF9kZWJ1Zyk6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiBlY29mZi5oIChvYmpfZWNvZmZfc2V0X2V4dCk6IERlY2xhcmUuICAgb2JqLWZvcm1hdC5jIGZ1bmN0aW9uCi0JY2FsbGVkIGJ5IGVjb2ZmX3NldHVwX2V4dC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogSWYgZGVidWdfaW5mbyBjb3VudCBpcyAwLAotCXNldCBjb3JyZXNwb25kaW5nIHBvaW50ZXIgdG8gTlVMTC4gIERvbid0IHNldCByYXdfc2l6ZSBhbmQKLQlyYXdfc3ltZW50cy4KLQkob2JqX2Vjb2ZmX3NldF9zeW1faW5kZXgpOiBSZW1vdmVkLgotCShvYmpfZWNvZmZfc2V0X2V4dCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX3NldF9zeW1faW5kZXgpOiBEb24ndCBkZWZpbmUuCi0JKG9ial9lY29mZl9zZXRfc3ltX2luZGV4KTogRG9uJ3QgZGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lY29mZl9zZXRfZXh0LCBlbGZfZ2V0X2V4dHIsCi0JZWxmX3NldF9pbmRleCk6IE5ldyBmdW5jdGlvbnMgdXNlZCBmb3IgRUNPRkZfREVCVUdHSU5HLgotCShlbGZfZnJvYl9maWxlKTogUmV3b3JrZWQgRUNPRkYgZGVidWcgZ2VuZXJhdGlvbiB0byB1c2UKLQluZXcgZnVuY3Rpb25zIGluIGJmZC9lY29mZmxpbmsuYy4KLQotU3VuIE5vdiAyMSAyMzo1NDo1MiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcyk6IE9ubHkgY3JlYXRlIHRoZSB1bndpbmQKLQlzdWJzcGFjZSBmb3IgRUxGLiAgSW4gdGhlIFNPTSB3b3JsZCwgdGhlIGxpbmtlciBpcyByZXNwb25zaWJsZQotCWZvciBjcmVhdGluZyB0aGUgdW53aW5kIHN1YnNwYWNlcy4KLQotRnJpIE5vdiAxOSAxNjoyNTowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBVc2UgUEFSQU1TIHJhdGhlciB0aGFuIEVYRlVOLgotCSh5YW5rX3N5bWJvbHMpOiBEb24ndCBjYWxsIFNfU0VUX0VYVEVSTkFMIGlmIHRoZSBzdG9yYWdlIGNsYXNzIGlzCi0JYWxyZWFkeSBzZXQuICBGaXhlcyAuZGVmIHZhcjsgLnZhbCBleHRlcm5hbF92YXI7IC5zY2wgMzsgLmVuZGVmLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9uKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlIHJldHVybiB0eXBlLiAgUmVtb3ZlCi0JdW51c2VkIHZhcmlhYmxlcy4KLQotCSogY29uZmlnL3RjLWkzODYuaDogRGVjbGFyZSB0Y19jb2ZmX2ZpeDJydHlwZSBhbmQKLQl0Y19jb2ZmX3NpemVtYWNoZGVwLgotCi1GcmkgTm92IDE5IDA0OjMzOjU5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXNhYmxlIG9ial9jaGVja19maWxlX3N5bWJvbHMKLQlob29rOyBvbmx5IGJhY2sgZW5kIHVzaW5nIGl0IHdhc24ndCB1c2luZyBpdCBjb3JyZWN0bHkuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQWx3YXlzIGNhbGwgb2JqX2Zyb2Jfc3ltYm9sIGFuZAotCXRjX2Zyb2Jfc3ltYm9sOyBhbHdheXMgcmV0YWluIHN5bWJvbCBpZiBpdCdzIHVzZWQgYnkgYSByZWxvY2F0aW9uLAotCXJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGVzZSByb3V0aW5lcyBpbmRpY2F0ZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogUmVuYW1lZCBmcm9tCi0JY29mZl9jaGVja19maWxlX3N5bWJvbHMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2NoZWNrX2ZpbGVfc3ltYm9scyk6IERlbGV0ZWQuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlLgotCShvYmpfZnJvYl9zeW1ib2wpOiBDYWxsIGl0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbiwgb2JqX2VtaXRfc3RyaW5ncywKLQlvYmpfcHJlX3dyaXRlX2hvb2spOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKGNfc2VjdGlvbl9oZWFkZXIpOiBEaXR0by4gIERlbGV0ZSBzdXBlcmZsdW91cyByZXR1cm4gYXQgZW5kIG9mCi0JZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIFtUQ19TUEFSQ106IEluY2x1ZGUgY29mZi9zcGFyYy5oLCBhbmQgc3BlY2lmeQotCWNvZmYtc3BhcmMtbHlueC4KLQkoU0FfR0VUX1NZTV9UQUdORFgpOiBVc2UgQkZEX0hFQURFUlMgdmVyc2lvbiBmb3IgQkZEX0FTU0VNQkxFUgotCXRvby4KLQkoY19zZWN0aW9uX2hlYWRlcik6IFJld3JpdGUgcHJvdG90eXBlIHNvIHRoYXQgaXQgY29udGFpbnMgbm8KLQlwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZXMuICBEb24ndCBkZWNsYXJlIGl0IGF0IGFsbCBpZgotCUJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbHlueG9zKTogTmV3IHRhcmdldCwgdXNpbmcgY29mZiBhbmQKLQlCRkRfQVNTRU1CTEVSLgotCi0JKiBzdGFicy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMsIE9CSlMpOiBMaXN0IGl0LgotCSogcmVhZC5jIChTVEFCX1NFQ1RJT05fTkFNRSwgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FLAotCWdldF9zdGFiX3N0cmluZ19vZmZzZXQsIHNfc3RhYl9nZW5lcmljLCBzX3N0YWIsIHNfeHN0YWIsIHNfZGVzYyk6Ci0JTW92ZWQgdG8gbmV3IGZpbGUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgY29mZiBmaWxlcyBsaWtlIGVsZgotCWZpbGVzLgotCi1XZWQgTm92IDE3IDE3OjIzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotaXJpeDUqKTogTmV3IHRhcmdldC4gIFVzZSBlbGYgYW5kIG1pcHMtYmlnLgotCSogY29uZmlnL29iai1lbGYuYzogSWYgRUNPRkZfREVCVUdHSU5HLCBpbmNsdWRlIGVjb2ZmLmguCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGRlZmluZSBFQ09GRgotCXBzZXVkby1vcHMuCi0JKG9ial9yZWFkX2JlZ2luX2hvb2spOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGNhbGwKLQllY29mZl9yZWFkX2JlZ2luX2hvb2suCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGNhbGwKLQllY29mZl9zeW1ib2xfbmV3X2hvb2suCi0JKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBDYXN0IGFsbG9jYSByZXN1bHQuCi0JKGVsZl9mcm9iX2ZpbGUpOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGZpbmlzaCB1cCBFQ09GRiBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbiBhbmQgd3JpdGUgaXQgb3V0IGludG8gLm1kZWJ1ZyBzZWN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTKTogTmV3IG1hY3JvLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IFVzZSBFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMuCi0JKEVDT0ZGX0RFQlVHR0lORyk6IERlZmluZSBpZiBUQ19NSVBTLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IElmIEVDT0ZGX0RFQlVHR0lORywgb3ZlcnJpZGUgdG8gYWRkCi0JZmllbGRzIHJlcXVpcmVkIGJ5IEVDT0ZGLgotCSogY29uZmlnL3RjLW1pcHMuYzogQ2hlY2sgRUNPRkZfREVCVUdHSU5HIHJhdGhlciB0aGFuCi0JT0JKX0VDT0ZGIGluIG1hbnkgY2FzZXMuCi0JKG1pcHNfYW55X25vcmVvcmRlcik6IE5ldyB2YXJpYWJsZS4KLQkobWlwc19jcHJlc3RvcmVfb2Zmc2V0KTogSW5pdGlhbGl6ZSB0byAtMS4KLQkobWlwc19mcmFtZV9yZWcpOiBOZXcgdmFyaWFibGUuCi0JKFJFTEFYX0VOQ09ERSwgUkVMQVhfT0xELCBSRUxBWF9ORVcsIFJFTEFYX1JFTE9DMSwKLQlSRUxBWF9SRUxPQzIsIFJFTEFYX1JFTE9DMywgUkVMQVhfV0FSTik6IE5ldyBtYWNyb3MuCi0JKG1kX3BzZXVkb190YWJsZSk6IEhhbmRsZSAiZ3B3b3JkIiBhbmQgImNwYWRkIi4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIG9rIHRvIGZhbHNlLiAgSWYgT0JKX0VMRiwgc2V0IGFsaWdubWVudAotCW9mIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0byA0LiAgU2V0IGFsaWdubWVudCBvZgotCS5yZWdpbmZvIHNlY3Rpb24gdG8gMi4gIElmIEVDT0ZGX0RFQlVHR0lORywgY3JlYXRlIC5tZGVidWcKLQlzZWN0aW9uLgotCShBTElHTl9FUlIsIEFMSUdOX0VSUjIpOiBSZW1vdmVkIHVudXNlZCBhbmQgdXNlbGVzcyBhbGlnbm1lbnQKLQljaGVjay4KLQkoYXBwZW5kX2luc24sIG1hY3JvX2J1aWxkLCBtYWNyb19idWlsZF9sdWkpOiBUYWtlIHBsYWNlCi0JYXJndW1lbnQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShhcHBlbmRfaW5zbik6IElmIGFwcGVuZGluZyBhIG5vcCwgZG9uJ3QgZW1pdCBvbmUuCi0JKG1hY3JvX2J1aWxkKTogQ2hhbmdlZCBhc3NlcnRpb24gZm9yICdpJywgJ2onLCAnbycgY2FzZS4KLQkoZ3BfcmVmZXJlbmNlKTogUmVtb3ZlZC4KLQkobG9hZF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgotCShtYWNybyk6IElmIG1pcHNfbm9yZW9yZGVyIGlzIHVzZWQsIHNldCBtaXBzX2FueV9ub3Jlb3JkZXIuCi0JRXh0ZW5zaXZlIGNoYW5nZXMgdG8gaGFuZGxlIEdQIGFuZCBQSUMgc3ltYm9scyBkaWZmZXJlbnRseS4KLQlCdWlsZCBib3RoIHBvc3NpYmxlIGNvZGUgY2hvaWNlcyB1c2luZyBhIHZhcmlhbnQgZnJhZywgYW5kCi0JbWFrZSBhIGZpbmFsIGRlY2lzaW9uIGF0IHRoZSBlbmQgb2YgYXNzZW1ibHkgd2hlbiBhbGwKLQlpbmZvcm1hdGlvbiBpcyBrbm93bi4gIEFkZGVkIFBJQyBzdXBwb3J0IGZvciBhbGwgc3ltYm9sCi0JcmVmZXJlbmNlcy4KLQkobWlwc19pcCk6IERvbid0IHBlcm1pdCBhbnl0aGluZyBidXQgYSBudW1iZXIgYWZ0ZXIgJCBmb3IgYQotCWNvcHJvY2Vzc29yIHJlZ2lzdGVyLiAgRG9uJ3QgdXNlIC5saXQ0IG9yIC5saXQ4IHNlY3Rpb25zIHdoZW4KLQlnZW5lcmF0aW5nIFBJQyBjb2RlLiAgSWYgT0JKX0VMRiwgc2V0IGFsaWdubWVudCBvZiAubGl0NCBvcgotCS5saXQ4IHNlY3Rpb24gdG8gNC4KLQkobWRfYXBwbHlfZml4KTogQWNjZXB0IGFuZCBpZ25vcmUgR09UMTYgYW5kIEdQUkVMMzIgcmVsb2NzLgotCShzX2NoYW5nZV9zZWMpOiBTZXQgYWxpZ25tZW50IG9mIEVMRiAucm9kYXRhIG9yIC5zZGF0YSBzZWN0aW9uCi0JdG8gNC4KLQkoc19taXBzc2V0KTogSWYgLnNldCBub3Jlb3JkZXIsIHNldCBtaXBzX2FueV9ub3Jlb3JkZXIuCi0JKHNfY3Bsb2FkKTogSWdub3JlIC5jcGxvYWQgaWYgbm90IGdlbmVyYXRpbmcgUElDIGNvZGUuICBXYXJuCi0JaWYgLmNwbG9hZCBpcyBub3QgaW4gbm9yZW9yZGVyIHNlY3Rpb24uCi0JKHNfY3ByZXN0b3JlKTogSWdub3JlIC5jcHJlc3RvcmUgaWYgbm90IGdlbmVyYXRpbmcgUElDIGNvZGUuCi0JKHNfZ3B3b3JkLCBzX2NwYWRkKTogTmV3IGZ1bmN0aW9ucy4KLQkodGNfZ2V0X3JlZ2lzdGVyKTogQWRkZWQgZnJhbWUgYXJndW1lbnQ7IGlmIHRydWUsIHNldAotCW1pcHNfZnJhbWVfcmVnIHRvIHJldHVybiB2YWx1ZS4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRG9uJ3QgZXJyb3Igb3V0LCBidXQgaW5zdGVhZAotCWRldGVybWluZSBob3cgbXVjaCBhIGZyYWcgc2hvdWxkIGdyb3cuCi0JKHRjX2dlbl9yZWxvYyk6IFJldHVybiBtdWx0aXBsZSByZWxvY3MgaWYgYXBwcm9wcmlhdGUsIGFzCi0JZGV0ZXJtaW5lZCBieSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheC4KLQkobWRfY29udmVydF9mcmFnKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogU2V0IEVMRiBoZWFkZXIgZmxhZ3MgYmFzZWQgb24KLQltaXBzX2FueV9ub3Jlb3JkZXIgYW5kIG1pcHNfcGljLgotCSogY29uZmlnL3RjLW1pcHMuaCAoUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFKTogRGVmaW5lLgotCShNQVhfUkVMT0NfRVhQQU5TSU9OKTogRGVmaW5lIHRvIGJlIDMuCi0JKG1kX3JlbGF4X2ZyYWcpOiBEZWZpbmUgdG8gYmUgMC4KLQkobWRfY29udmVydF9mcmFnKTogRG9uJ3QgZGVmaW5lLgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBDaGFuZ2VkIGRlY2xhcmF0aW9uLgotCi0JKiBlY29mZi5oLCBlY29mZi5jOiBOZXcgZmlsZXMgcHVsbGVkIG91dCBvZiBjb25maWcvb2JqLWVjb2ZmLmMgdG8KLQlzdXBwb3J0IGdlbmVyYXRpbmcgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBNSVBTIEVMRgotCXRhcmdldHMuICBDb21waWxlZCBvbmx5IGlmIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLiAgQ2hhbmdlZAotCWhhbmRsaW5nIG9mIGV4dGVybmFsIHN5bWJvbHM6IGl0IG5vdyBhbHdheXMgZ2VuZXJhdGVzIGV4YWN0bHkKLQl0aG9zZSBleHRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzeW1ib2wgbGlzdC4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMpOiBBZGRlZCBlY29mZi5jLgotCShSRUFMX0hFQURFUlMpOiBBZGRlZCBlY29mZi5oLgotCShPQkpTKTogQWRkZWQgZWNvZmYuby4KLQkoZWNvZmYubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IEFsbW9zdCBlbnRpcmVseSBtb3ZlZCBpbnRvIGVjb2ZmLmMuCi0JUmVtYWluaW5nIGNvZGUgbW9zdGx5IGp1c3QgY2FsbHMgZWNvZmYuYyBjb2RlLgotCSogY29uZmlnL29iai1lY29mZi5oOiBEZWZpbmUgRUNPRkZfREVCVUdHSU5HLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IE1ha2UgZWNvZmZfc3ltYm9sIGEgcG9pbnRlciB0byBhCi0Jc3RydWN0IGxvY2Fsc3ltLgotCShvYmpfcmVhZF9iZWdpbl9ob29rLCBvYmpfc3ltYm9sX25ld19ob29rKTogRGVmaW5lIHRvIGNhbGwKLQlmdW5jdGlvbnMgaW4gZWNvZmYuYy4KLQkoZWNvZmZfc3RhYik6IERvbid0IGRlY2xhcmUgKG5vdyBkZWNsYXJlZCBpbiBlY29mZi5oKS4KLQkob2JqX3NldF9zeW1faW5kZXgpOiBEZWZpbmUuCi0JKG9ial9lY29mZl9zZXRfc3ltX2luZGV4KTogRGVjbGFyZS4KLQotCSogZnJhZ3MuaCAoZnJhZ19ncm93KTogRGVjbGFyZS4KLQkqIGZyYWdzLmMgKGZyYWdfZ3Jvdyk6IE1hZGUgbm9uLXN0YXRpYy4KLQotCSogd3JpdGUuYyAoaXNfZG5yYW5nZSk6IERvIG5vdCBkZWZpbmUgaWYgbWRfcmVsYXhfZnJhZyBpcyBkZWZpbmVkLgotCShyZWxheF9zZWdtZW50KTogSWYgbWRfcmVsYXhfZnJhZyBpcyBkZWZpbmVkLCB1c2UgaXQgdG8gaGFuZGxlIGEKLQlmcmFnIG9mIHR5cGUgcnNfbWFjaGluZV9kZXBlbmRlbnQgcmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoCi0JbWRfcmVsYXhfdGFibGUuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgd2UgZmluZCBhIGJhZCBwc2V1ZG8tb3AsCi0JZG8gYSBjb250aW51ZSB0byBnbyBvbiB0byB0aGUgbmV4dCBsaW5lIHJhdGhlciB0aGFuIGEgYnJlYWsuCi0JUmVtb3ZlZCBkdXBsaWNhdGUgYmFkIHBzZXVkby1vcCBjb2RlIHdoaWNoIHdhcyBuZXZlciBleGVjdXRlZC4KLQotCSogcmVhZC5jIChzX2xjb21tKTogRG8gbm90IHJlcXVpcmUgYSBjb21tYSBhZnRlciB0aGUgbmFtZS4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IENoYW5nZWQgaGFkb25lIGZpZWxkIHRvIGJpdGZpZWxkLgotCUFkZGVkIGJzcyBiaXRmaWVsZC4KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IFNldCBic3MgZmxhZyBmb3IgYnNzX3NlY3Rpb24uCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBTZXQgYnNzIGZsYWcgZm9yIC5zYnNzIHNlY3Rpb24gaWYgdXNlZC4KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IERvbid0IHNldCBTRUNfSEFTX0NPTlRFTlRTIGZvciBhCi0JYnNzIHNlY3Rpb24uICBTZXQgU0VDX1JFTE9DIGlmIHRoZXJlIGFyZSBhbnkgcmVsb2NhdGlvbnMsIGV2ZW4gZm9yCi0JYSB6ZXJvIHNpemUgc2VjdGlvbi4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSW4gUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFIGNhc2UsIGJhc2UKLQlkYXRhIG9mZnNldCBvbiByZWxvY1swXS0+YWRkcmVzcyByYXRoZXIgdGhhbiByZWxvY1tqXS0+YWRkcmVzcywgc28KLQl0aGF0IG11bHRpcGxlIHJlbG9jcyBjYW4gYWZmZWN0IGRpZmZlcmVudCBtZW1vcnkgbG9jYXRpb25zLgotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlciwgcmVsYXhfYW5kX3NpemVfc2VnLAotCWFkanVzdF9yZWxvY19zeW1zLCB3cml0ZV9yZWxvY3MpOiBNYWtlIHRoaXJkIGFyZ3VtZW50IFBUUiwgbm90Ci0JY2hhciAqLCB0byBtYXRjaCBkZWZpbml0aW9uIG9mIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IERvbid0IGludGVycHJldCBhIGNvbW1lbnQgY2hhcmFjdGVyCi0JYXMgc3RhcnRpbmcgYSBDUFAgbGluZSBkaXJlY3RpdmUgdW5sZXNzIGl0IGlzIGEgJyMnIGFuZCBpcyB0aGUKLQl2ZXJ5IGZpcnN0IGNoYXJhY3RlcnMgb24gdGhlIGxpbmUgKGkuZS4sIGRvIG5vdCBwZXJtaXQgbGVhZGluZwotCXdoaXRlc3BhY2UpLgotCi0JKiBtZXNzYWdlcy5jIChpZGVudGlmeSk6IE1ha2UgZmlsZSBhcmd1bWVudCBub24tY29uc3QsIHRvIG1hdGNoCi0JY2FsbGVycy4KLQotVHVlIE5vdiAxNiAyMDozODoyMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBGaXggdGhpbmtvIGluIDIxYml0IHJhbmdlIGNoZWNrLgotCi1TYXQgTm92IDEzIDE4OjIyOjQ4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBDb3BlIHdpdGggSU1NMTYgdHlwZSB0b28uCi0JKiBjb25maWcvdGMtejhrLmMgKGJ1aWxkX2J5dGVzLCBtZF9hcHBseV9maXgpOiBVbmRlcnN0YW5kIG5ESVNQNwotCXJlbG9jcy4KLQotRnJpIE5vdiAxMiAxNjo1MTo0NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuW2NoXTogRml4IGFzc29ydGVkIHRyaXZpYWwgaW5kZW50aW9uIHByb2JsZW1zLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uKTogQWRkIG1pc3NpbmcgJzsnLgotCShzb21fZnJvYl9maWxlKTogRGVsZXRlIHdoaXRlc3BhY2UgYXQgRU9MLgotCi1GcmkgTm92IDEyIDE1OjI2OjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgZm9sbG93aW5nIDIuMiByZWxlYXNlLgotCi1GcmkgTm92IDEyIDE0OjUyOjE3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9zdHJ1Y3QpOiBVc2UgYSByZWFsIHR5cGUgZm9yIHRoZQotCWZpZWxkIHNlbGVjdG9yLCByYXRoZXIgdGhhbiBhbiBpbnQuICBBbGwgdXNlcyBvZiBmaWVsZCBzZWxlY3RvcnMKLQlmaXhlZC4KLQkodGNfZ2VuX3JlbG9jKTogRm9yIFNPTSBQTEFCRUxzLCBhbHdheXMgc2V0IGFkZGVuZCB0byB6ZXJvIGZvciBub3cuCi0JKG1kX2FwcGx5X2ZpeF8xKTogRG8gbm90IGNhbGwgaHBwYV9maWVsZF9hZGp1c3QgZm9yIGFueSBQTEFCRUwKLQlmaWVsZC4KLQotCVRodSBOb3YgMTEgMTU6NDk6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3R5cGVfYXJncyk6IEZvciAuaW1wb3J0IHN0YXRlbWVudHMsCi0Jc2lsZW50bHkgaWdub3JlIGF0dGVtcHQgdG8gY2hhbmdlIHRoZSBzeW1ib2wgdHlwZSBmb3IgYSBmdW5jdGlvbgotCWZyb20gU1RfRU5UUlkgdG8gU1RfQ09ERSBvbiAuaW1wb3J0LgotCi1XZWQgTm92IDEwIDE2OjE5OjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuaCAoZml4Uyk6IFJlbmFtZSBmeF9jYWxsaiBmaWVsZCB0byBmeF90Y2JpdC4KLQkqIHdyaXRlLmMsIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmZiZmQuYywKLQljb25maWcvdGMtaTk2MC5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBOb3YgIDkgMDA6NDk6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgY29uZmlnLXN0YW1wIGFuZCBjb25maWcuaAotCi0JKiBjb25maWcvdGMtaHBwYS5jIChldmFsdWF0ZV9hYnNvbHV0ZSk6IEF2b2lkIHJlbHlpbmcgb24KLQlBTlNJLUMgZmVhdHVyZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3R5cGVfYXJncyk6IFJlbmFtZWQgZnJvbSBwYV9leHBvcnRfYXJncy4KLQlBY2NlcHQgbmV3IGFyZ3VtZW50ICJpc19leHBvcnQiLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4gIFdoZW4KLQlwcm9jZXNzaW5nIGEgLmV4cG9ydCBkaXJlY3RpdmUgZm9yIGEgZnVuY3Rpb24sIGRvIG5vdCBhbGxvdwotCXRoZSB1c2VyIHRvIHNldCB0aGUgdHlwZSB0byAiQ09ERSIsIGluc3RlYWQgd2FybiBhbmQgc2V0IHRoZQotCXR5cGUgdG8gIkVOVFJZIi4KLQotTW9uIE5vdiAgOCAxMjowNTowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsIHByaW50SW5zbik6IEhhbmRsZSAnaycgKGZyb20gVGVkCi0JTGVtb24gPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4pLgotCShtaXBzX2lwKTogUGVybWl0IG9kZCBudW1iZXJlZCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaWYgLW1pcHMzLgotCShtYWNybyk6IFVzZSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMIHJlbG9jYXRpb24gZm9yIE1fTElfU1MuCi0KLU1vbiBOb3YgIDggMDc6NDU6MDEgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgaDgzMDBoLCB3ZSBoYXZlIG11bHRpbGliIG5vdy4KLQotTW9uIE5vdiAgOCAwNjowOToxOCAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFN1cHBvcnQgZ2VuZXJpYyBuZXR3YXJlIGFzIGJlaW5nIEVMRiBmb3JtYXQuCi0JCQlSZWNvZ25pc2UgdW5peHdhcmUgaWYgdGhlIHVzZXIgc3VwcGxpZXMgaXQuCi0KLVN1biBOb3YgIDcgMDE6MDI6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIEZpcnN0IGN1dCBhdCBjbGVhbmluZyB1cCBQQSBpbnN0cnVjdGlvbiBwYXJzaW5nLgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBBY2NlcHQgcG9pbnRlciB0bwotCWluc24gc3RydWN0dXJlIGFzIGFuIGFyZ3VtZW50LCBhbmQgYSBwb2ludGVyIHRvIGEgc3RyaW5nLiAgQWxsCi0JY2FsbGVycyBjaGFuZ2VkLiAgQWx3YXlzIHJlYWQgYW55IGZpZWxkIHNlbGVjdG9yIGhlcmUuICBDYWxsCi0JZXZhbHVhdGUgYWJzb2x1dGUgdG8gZ2V0IGEgcmV0dXJuIHZhbHVlLgotCShldmFsdWF0ZV9hYnNvbHV0ZSk6IEFkZGVwdCBwb2ludGVyIHRvIGluc24gc3RydWN0dXJlIGFzIGl0cwotCWFyZ3VtZW50LiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSk6IE5ldyBtYWNybyBmb3IgaW5zZXJ0aW5nIGEgYml0ZmllbGQKLQlpbnRvIGFuIGluc3RydWN0aW9uIGFuZCBjb250aW51aW5nIHRoZSBtYWluIHBhX2lwIGxvb3AuCi0JKENIRUNLX0ZJRUxEKTogTmV3IG1hY3JvIGZvciBzaW1wbGUgcmFuZ2UgY2hlY2tpbmcgb2YgZmllbGRzLgotCShwYV9pcCk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGVzLiAgVXNlIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUKLQlhbmQgQ0hFQ0tfRklFTEQuICBBbGwgaW1tZWRpYXRlIGZpZWxkcyBub3cgcGFzcyB0aHJvdWdoCi0JcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gd2hpY2ggd2lsbCBhbHNvIGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuCi0JRGVsZXRlIGRlYWQgY29kZS4gIFNpbXBsaWZ5LgotCShtZF9hcHBseV9maXhfMSk6IFVzZSBDSEVDS19GSUVMRCB0byB2ZXJpZnkgYW55IGZpeGVzIHRoYXQgYXJlCi0JYXBwbGllZCBhcmUgaW4gcmFuZ2UuICBVc2UgYmZkX3B1dF8zMiByYXRoZXIgdGhhbiBpbnNlcnRpbmcgZWFjaAotCWJ5dGUgb2YgdGhlIGZpeGVkIGluc3RydXRpb24gaW50byB0aGUgYnVmZmVyIG91cnNlbHZlcy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERlbGV0ZSB7U0VHLEdMT0JBTH1fRElGRl9BTExPV0VEIGNvZGUsCi0JaXQgd2FzIFBBIHNwZWNpZmljIGFuZCBpcyBubyBsb25nZXIgbmVlZGVkIChpdCdzIG5vdyBoYW5kbGVkCi0Jd2l0aGluIHRoZSBQQSBiYWNrZW5kKS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFNFR19ESUZGX0FMTE9XRUQpOiBEZWxldGUgZGVmaW5pdGlvbi4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IElmIHRoZSBzdWJ0cmFjdCBzeW1ib2wgZm9yCi0JYSBmaXh1cCBpcyAkZ2xvYmFsJCBjaGFuZ2UgaXQgdG8gTlVMTCBhcyAkZ2xvYmFsJCBpcyByZWFsbHkgb25seQotCW5lZWRlZCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgdGhlIGJhc2UgdHlwZSBvZiByZWxvY2F0aW9uIHRvIHVzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoY3JlYXRlX25ld19zdWJzcGFjZSk6IEluaXRpYWxpemUgc3Vic3BhY2VfZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGEtaXAsIGNhc2UgJ3onKTogTWFrZSBmaWVsZCBzZWxlY3RvcnMgd29yawotCWZvciAneicgb3BlcmFuZHMgKHRhcmdldCBvZiBibGUgYnJhbmNoKS4KLQotU2F0IE5vdiAgNiAyMjo0MTo1NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogKHVwZGF0ZV9zdWJzcGFjZSk6IEZpeCB0eXBlIGFuZCBuYW1lIG9mIGxhc3QKLQlwYXJhbWV0ZXIuICBBbGwgY2FsbGVycyBmaXhlZC4KLQkobWRfYmVnaW4sIHBhX2Noa19maWVsZF9zZWxlY3RvciwgcGFfZW50cnkpOiBMaW50LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjb25zX2ZpeF9uZXdfaHBwYSk6IFJlc2V0IGZpZWxkIHNlbGVjdG9yCi0JdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBpdCdzIGJlZW4gdXNlZC4KLQotRnJpIE5vdiAgNSAxMjowODoyMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IENoYW5nZQotCXNwYWNlL3N1YnNwYWNlIHNvcnQga2V5cyBmb3IgdGhlIHN0YWIgc2VjdGlvbnMgc28gYXMgdG8gYXZvaWQKLQlidWdzIGluIHRoZSBocCBsaW5rZXIgYW5kIHB4ZGIuCi0KLVRodSBOb3YgIDQgMTc6MDA6MDUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKTogVXBkYXRlIHBvaW50ZXIgdG8gbGFzdAotCWZyYWcgZm9yIGEgc2VnbWVudCBpbiB0aGUgc2VnaW5mbyBzdHJ1Y3R1cmUuCi0KLVRodSBOb3YgMDQgMDk6MDk6MzUgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogIE1ha2VmaWxlLmluOiBDaGFuZ2VkIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCi0KLVdlZCBOb3YgIDMgMTI6MTY6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBIYW5kbGUgY29udmVyc2lvbiBvZiBzdWJ0cmFjdGlvbiB0bwotCXBjLXJlbGF0aXZlIGFkZHJlc3NpbmcgZXZlbiBpZiBwYy1yZWxhdGl2ZSBmbGFnIGlzIGFscmVhZHkgc2V0LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwX29wKTogVXNlIHN0cmNociwgbm90IGluZGV4LiAgRG9uJ3QKLQlkZWNsYXJlIGVpdGhlci4KLQotCSogZG9jL01ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgaW50ZXJtZWRpYXRlIGZpbGVzIGZyb20gZHZpCi0JYnVpbGQsIGJ1dCBub3QgdGhlIGR2aSBvciBpbmZvIGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKGNsZWFuLWhlcmUpOiBOZXcgdGFyZ2V0OyBjbGVhbnMgdXAgY3VycmVudAotCWRpcmVjdG9yeSBvbmx5LgotCShkaXN0Y2xlYW4pOiBVc2UgaXQgaW5zdGVhZCBvZiBjbGVhbi4KLQotCSogcmVhZC5jIChzX3hzdGFiKTogRG9uJ3QgdXNlIGFsbG9jYS4KLQotCSogbWVzc2FnZXMuYyAoaWRlbnRpZnkpOiBOZXcgcm91dGluZTsgcHJpbnQgbWVzc2FnZSBpZGVudGlmeWluZwotCWZvbGxvd2luZyBtZXNzYWdlcyBhcyBjb21pbmcgZnJvbSBhc3NlbWJsZXIuCi0JKGFzX3Nob3dfd2hlcmUsIGFzX2JhZF9pbnRlcm5hbCwgYXNfYmFkX3doZXJlKTogQ2FsbCBpdC4KLQkoYXNfZmF0YWwpOiBEb24ndCBuZWVkIHRvIGlkZW50aWZ5IHByb2dyYW0gYW55IG1vcmUuCi0KLVR1ZSBOb3YgIDIgMTg6MDQ6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHJlbG9jIHN3aXRjaC4KLQotCSogcmVhZC5jIChzX2xjb21tKTogUHV0IHNtYWxsIG9iamVjdHMgaW4gLnNic3MgZm9yIE1JUFMgRUxGIGFzCi0Jd2VsbCBhcyBNSVBTIEVDT0ZGLgotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBhbGlnbmVkLgotCi1UdWUgTm92ICAyIDE1OjA3OjA3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB0Yy1ocHBhLmM6IEFkZCAlZHAgYW5kICVycCBhcyBzeW5vbnltcyBmb3IgJXIyNyBhbmQgJXIyIGluIHRoZQotCXByZWRlZmluZWQgcmVnaXN0ZXIgdGFibGUuCi0JKHBhX3BhcnNlX251bWJlcik6IEhhbmRsZSAlcnAgaW4gY29tbW9uIHJlZ2lzdGVyIHNob3J0Y3V0IGNvZGUuCi0JQ29uc2lzdGVudGx5IHNldCByZXR1cm4gdmFsdWUgdG8gLTEgZm9yIGFuIGVycm9yLiAgQ2xlYW4gdXAgZXJyb3IKLQltZXNzYWdlcyBhbmQgb25seSBwcmludCB0aGVtIHdoZW4gInByaW50X2Vycm9ycyIgaXMgdHJ1ZS4gIEhhbmRsZQotCWVtcHR5IHN0cmluZyBjYXNlIGxpa2UgdGhlIEhQIGFzc2VtYmxlciAtLSBhc3N1bWUgYSB2YWx1ZSBvZgotCXplcm8uCi0KLQkqIGNvbmZpZy9oby1ocHV4Lmg6IERvIG5vdCBpbmNsdWRlIGhvLXN5c3YuaC4gIEluc3RlYWQgaW5jbHVkZQotCXN0YW5kYXJkIGhwdXggaW5jbHVkZSBmaWxlcyB0byBwaWNrIHVwIHZhcmlvdXMgZnVuY3Rpb24gZGVjbHMuCi0KLQkqIGNvbmZpZy9oby1ocHBhb3NmLmg6IERlbGV0ZSBfSU8qIG1hY3Jvcy4gIFRoZXkgYXJlIGRlZmluZWQgaW4KLQlzdGRpby5oLiAgRGVsZXRlIGJvZ3VzIGRlY2xhcmF0aW9uIG9mIGZyZWUuICBHZXQgcGF0aCB0bwotCWFsbG9jYS1jb25mLmggcmlnaHQuCi0KLVR1ZSBOb3YgIDIgMTM6NTc6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEZpeCBjaGVja3MgZm9yIGNoYXJhY3RlcnMgZm9sbG93aW5nICIwYiIgb3IKLQkiMGYiLgotCi1Nb24gTm92ICAxIDIxOjM3OjA0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfYXR0YWNoX3Vud2luZF9pbmZvKTogRGVmaW5lIGFzIGEgaG9vawotCXNvIEdBUyBjYW4gYXR0YWNoIHVud2luZCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uIHRvIGEgQkZEIHN5bWJvbC4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IElmIG5lY2Vzc2FyeSBhdHRhY2ggdW53aW5kCi0JZGVzY3JpcHRvciBpbmZvcm1hdGlvbiB0byB0aGUgQkZEIHN5bWJvbC4KLQkobWRfYXBwbHlfZml4KTogUl9IUFBBX0VOVFJZIGFuZCBSX0hQUEFfRVhJVCBjYW4gbmV2ZXIgYmUgImFwcGxpZWQiLAotCXRoZXkgYXJlIHNpbXBseSBtYXJrZXJzLiAgTWFrZSBSX0hQUEFfVU5XSU5EXyogaGFuZGxpbmcgT0JKX0VMRgotCWRlcGVuZGVudC4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogV2hvbGUgZnVuY3Rpb24gaXMgT0JKX0VMRiBkZXBlbmRlbnQuCi0JKHBhX2VudHJ5KTogQnVpbGQgYSBSX0hQUEFfRU5UUlkgcmVsb2NhdGlvbiB3aGVuIGNvbmZpZ3VyZWQgZm9yIFNPTS4KLQkocGFfZXhpdCk6IExpa2V3aXNlLCBidXQgYnVpbHQgYSBSX0hQUEFfRVhJVCByZWxvY2F0aW9uLiAgRG8gbm90Ci0JYnVpbGQgImVuZC1vZi1mdW5jdGlvbiIgc3ltYm9scyBmb3IgU09NLCB0aGV5IGFyZSBub3QgbmVlZGVkLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwcm9jZXNzX2V4aXQpOiBDcmVhdGUgdGVtcG9yYXJ5IHN5bWJvbHMgd2l0aAotCWNvcnJlY3QgcHJlZml4ZXMgc28gdGhleSBjYW4gYmUgZWxpbWluYXRlZCBsYXRlci4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoY2FsbF9pbmZvIHN0cnVjdCk6IERlbGV0ZSB1bnVzZWQgImZyYW1lIiBmaWVsZC4KLQkocGFfY2FsbGluZm8pOiBJbnNlcnQgZnJhbWVzaXplIGludG8gdGhlIHVud2luZCBpbmZvcm1hdGlvbiBhcwotCXNvb24gYXMgaXQncyBhdmFpbGFibGUuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IERvIG5vdCBpbnNlcnQgZnJhbWVzaXplIGludG8gdGhlIHVud2luZAotCWluZm9ybWF0aW9uIGhlcmUuCi0KLQkqIEFkZCBzdXBwb3J0IGZvciBtYXJrZXIgdHlwZSByZWxvY2F0aW9ucy4gIFRoZXNlIG1hcmsgYXJlYXMKLQlvZiBpbnRlcmVzdCB0byB0aGUgbGlua2VyLiAgRU5UUlkvRVhJVCByZWxvY2F0aW9ucyBmb3IgU09NIGFyZQotCWFuIGV4YW1wbGUgb2YgbWFya2VyIHJlbG9jYXRpb25zLgotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSW5zdGVhZCBvZiBhc3N1bWluZyBzaXplIG9mIGEgcmVsb2NhdGlvbgotCWlzIDQgYnl0ZXMsIHBpY2sgdXAgdGhlIHNpemUgZnJvbSByZWxvY2F0aW9uIGl0c2VsZi4KLQkoZml4dXBfc2VnbWVudCk6IERvIG5vdCBjb21wbGFpbiB0aGF0IGEgdmFsdWUgaXMgdG9vIHNtYWxsIGZvcgotCW1hcmtlciByZWxvY2F0aW9ucy4KLQotCSogc3RydWMtc3ltYm9sLmg6IEFkZCBuZXcgInN5X3VzZWQiIGZpZWxkIHRvIHRoZSBzeW1ib2wgc3RydWN0dXJlLgotCSogZXhwci5jIChvcGVyYW5kKTogU2V0IHN5X3VzZWQgZm9yIGFueSBzeW1ib2wgdXNlZCBhcyBhbiBvcGVyYW5kLgotCShleHByKTogTGlrZXdpc2UgZm9yIGFueSBzeW1ib2wgdXNlZCBpbiBhbiBleHByZXNzaW9uLgotCSogY29uZmlnL3RjLWhwcGEuaCAodGNfZnJvYl9zeW1ib2wpOiBEZWZpbmUuICBQdW50IGltcG9ydGVkCi0Jc3ltYm9scyB3aGljaCBhcmUgbmV2ZXIgdXNlZCBhbmQgYWJzb2x1dGUgc3ltYm9scyB3aGljaCBsb2NhbCBzY29wZS4KLQotCSogY29uZmlnL29iai1zb20uaCAob2JqX2Zyb2JfZmlsZSk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24pOiBTZXQgYWxpZ25tZW50Ci0Jb2Ygc3RhYiBzZWN0aW9ucy4gIE1ha2Ugc3BhY2UgZm9yIHRoZSBzcGVjaWFsIHN0YWIgZW50cnkuCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogQWRqdXN0IHRoZSBzcGVjaWFsIGVudHJ5IGluIHRoZQotCXN0YWJzIHNlY3Rpb24uCi0JKHNvbV9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb24uICBTaW1wbHkgY2FsbHMgYWRqdXN0X3N0YWJfc2VjdGlvbnMKLQlmb3IgZWFjaCBzZWN0aW9uLgotCi1Nb24gTm92ICAxIDE3OjU0OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoUElDX0NBTExfUkVHLCBTUCwgRlApOiBEZWZpbmUuCi0JKG1pcHNfcGljLCBtaXBzX2NwcmVzdG9yZV9vZmZzZXQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWRfcHNldWRvX3RhYmxlKTogSGFuZGxlIC5hYmljYWxscywgLmNwbG9hZCwgYW5kIC5jcHJlc3RvcmUuCi0JSWdub3JlIC5iZ25iIGFuZCAuZW5kYi4KLQkoZ3BfcmVmZXJlbmNlKTogX2dwX2Rpc3AgaXMgbmV2ZXIgYWRkcmVzc2VkIG9mZiBHUC4KLQkobWFjcm9fYnVpbGQpOiBJZ25vcmUgbWFjcm9zIHdoaWxlIHNlYXJjaGluZyBmb3IgaW5zbi4gIEZvciBjYXNlcwotCWksIGosIGFuZCBvLCBhY2NlcHQgdGhlIHJlbG9jIHR5cGUgYXMgYW4gYXJndW1lbnQgcmF0aGVyIHRoYW4KLQlhc3N1bWluZyBCRkRfUkVMT0NfTE8xNi4gIERvbid0IHRyeSB0byBjb252ZXJ0IEJGRF9SRUxPQ19MTzE2IHRvCi0JQkZEX1JFTE9DX01JUFNfR1BSRUwuICBBZGRlZCBuZXcgY2FzZSBhLgotCShzZXRfYXQsIGxvYWRfcmVnaXN0ZXIsIG1hY3JvKTogQ2hhbmdlZCBjYWxscyB0byBtYWNyb19idWlsZCB0bwotCXBhc3MgbmV3IGFyZ3VtZW50IGZvciBpLCBqIGFuZCBvIGNhc2VzLgotCShtYWNybyk6IEhhbmRsZSBNX0pBTF8xLCBNX0pBTF8yIGFuZCBNX0pBTF9BLiAgVGhlc2UgcmVxdWlyZQotCXNwZWNpYWwgaGFuZGxpbmcgd2hlbiBnZW5lcmF0aW5nIFNWUjQgUElDIGNvZGUuCi0JKG1pcHNfaXAsIHRjX2dldF9yZWdpc3Rlciwgc19mcmFtZSk6IFVzZSBtYWNyb3MgRlAsIFNQLCBHUCBhbmQgQVQKLQlyYXRoZXIgdGhhbiBoYXJkIGNvZGVkIGNvbnN0YW50cy4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwgYW5kCi0JQkZEX1JFTE9DX01JUFNfQ0FMTDE2LgotCShzX29wdGlvbik6IFNldCBtaXBzX3BpYyBiYXNlZCBvbiAub3B0aW9uIHBpY04uCi0JKHNfYWJpY2FsbHMpOiBOZXcgZnVuY3Rpb247IHNldCBtaXBzX3BpYyB0byAyLgotCShzX2NwbG9hZCk6IE5ldyBmdW5jdGlvbjsgaGFuZGxlIC5jcGxvYWQuCi0JKHNfY3ByZXN0b3JlKTogTmV3IGZ1bmN0aW9uOyBoYW5kbGUgLmNwcmVzdG9yZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIC5iZ25iLAotCS5lbmRiIGFuZCAudmVyc3RhbXAsIHNldHRpbmcgdGhlbSB0byBzX2lnbm9yZS4KLQotU3VuIE9jdCAzMSAwMDozNjo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbik6IEFkZCBuZXcgc3NkX2RlZmluZWQKLQlmaWVsZC4gIERlZmluZSBTVUJTUEFDRV9ERUZJTkVEIGFjY2Vzc29yIG1hY3JvLgotCShwYV9zdWJzcGFjZSk6IEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgc3Vic3BhY2UgYXR0cmlidXRlcyBmb3IKLQlidWlsdC1pbiBzdWJzcGFjZXMuICBTZXQgc3NkX2RlZmluZWQgYXQgdGhlIGVuZCBvZiBmY24gLS0gdGhhdAotCXdheSB0aGUgYXR0cmlidXRlcyBjYW4gb25seSBiZSBjaGFuZ2VkIG9uY2UuICBQYXNzIG5ld2x5IGFsbG9jYXRlZAotCW5hbWUgdG8gaXNfZGVmaW5lZF9zdWJzcGFjZSwgbm90IGEgcG9pbnRlciB0byB0aGUgaW5wdXQgbGluZS4KLQlGaXggdHlwbyBpbiBzcGFjZS9zdWJzcGFjZSByZXdvcmsuCi0JKGlzX2RlZmluZWRfc3Vic3BhY2UpOiBEZWxldGUgdW51c2VkIDJuZCBhcmcuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pbXBvcnQpOiBJZiBjdXJyZW50bHkgaW4gdGhlIHRleHQgc2VnbWVudAotCWFuZCBhIHN5bWJvbCBpcyBpbXBvcnRlZCB3aXRob3V0IHR5cGUgaW5mb3JtYXRpb24sIHNldCBCU0ZfRlVOQ1RJT04KLQlmb3IgdGhlIHN5bWJvbC4KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IENvcnJlY3QgdGVzdCB0byBkZXRlcm1pbmUgaWYKLQl0aGUgc2VjdGlvbidzIHNpemUgd2FzIHJvdW5kZWQgdXAuCi0KLQkqIGNvbmZpZy9vYmotc29tLmggKG9ial9zZXRfc3ltYm9sX3R5cGUpOiBEZWZpbmUgYSBob29rIHNvIEdBUwotCWNhbiBwcm9wZXJseSBzZXQgYWxsIHRoZSBTT00gc3ltYm9sIHR5cGVzLgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3ltYm9sX3R5cGUpOiBOZXcgZW51bSB0byByZXByZXNlbnQgdGhlCi0Jc3ltYm9sIHR5cGVzIHdoaWNoIGNhbiBiZSBzZXQgZnJvbSBhbiBJTVBPUlQvRVhQT1JUIHN0YXRlbWVudC4KLQkocGFfZXhwb3J0X2FyZ3MpOiBTZXQgdGhlIHBhX3N5bWJvbF90eXBlIHR5cGUgYmFzZWQgb24gYXJndW1lbnRzLgotCUlmIGRlZmluZWQsIGNhbGwgb2JqX3NldF9zeW1ib2xfdHlwZSB0byBwYXNzIHRoaXMgaW5mb3JtYXRpb24gb24KLQl0byB0aGUgQkZEIGJhY2tlbmQuCi0KLQkqIHJlYWQuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFNldCBTRUNfREVCVUdHSU5HIGZvciBhbnkKLQlzdGFiIHNlY3Rpb24gd2UgbWFrZS4KLQkoc19zdGFiX2dlbmVyaWMpOiBMaWtld2lzZS4KLQotU2F0IE9jdCAzMCAxNDoyNjoyMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogQWxsb3cgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIG9mIHRoZSBmYWtlIGxhYmVsLgotCSogd3JpdGUuaCAoTE9DQUxfTEFCRUwpOiBEZWxldGUgRE9UX0xBQkVMX1BSRUZJWCBjb2RlLiAgSW5zdGVhZAotCWFzc3VtZSBiYWNrZW5kcyB3aWxsIGRlZmluZSBMT0NBTF9MQUJFTCBpZiBhbnl0aGluZyBvdGhlciB0aGFuCi0JJ0wnIGlzIHVzZWQgdG8gZGVub3RlIGEgbG9jYWwgbGFiZWwuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IE5ldyBtYWNyby4gIERlZmluZXMgdGhlIGRlZmF1bHQgbmFtZSB1c2VkIGZvcgotCXRoZSAiZmFrZSIgbGFiZWwuCi0JKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBEZWxldGUgRE9UX0xBQkVMX1BSRUZJWCBjb2RlCi0JYW5kIGluc3RlYWQgc2ltcGx5IHVzZSB0aGUgc3RyaW5nIGRlZmluZWQgYnkgRkFLRV9MQUJFTF9OQU1FLgotCShvcGVyYW5kKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHNfc3RhYl9nZW5lcmljKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaHBwYS5oIChGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgYXMgTCQwXDAwMSBzbyBpdCdzCi0Ja25vd24gdG8gYmUgYSBsb2NhbCBsYWJlbC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKERPVF9MQUJFTF9QUkVGSVgpOiBEZWxldGUuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTY4ay5oIChET1RfTEFCRUxfUFJFRklYKTogRGVsZXRlLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oIChET1RfTEFCRUxfUFJFRklYKTogRGVsZXRlLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lLgotCi0JUmV3b3JrIHNwYWNlL3N1YnNwYWNlIGhhbmRsaW5nIGluIFBBIGNvZGUgdG8gZnVsbHkgc3VwcG9ydAotCVNPTSBzcGFjZXMvc3Vic3BhY2VzLgotCSogY29uZmlnL3RjLWhwcGEuYyAoVVNFX0FMSUFTRVMpOiBOZXcgb2JqZWN0LWZvcm1hdCBkZXBlbmRlbnQgZGVmaW5lCi0JdG8gY29udHJvbCB0aGUgdXNlIG9mIHNwYWNlL3N1YnNwYWNlIG5hbWUgYWxpYXNlcy4KLQkodXBkYXRlX3N1YnNwYWNlKTogQWNjZXB0IHNwYWNlIGNoYWluIGVudHJ5IGZvciBjb250YWluaW5nIHNwYWNlCi0JYXMgYSBuZXcgcGFyYW1ldGVyLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkocGFfZ2V0X2xhYmVsKTogVXNlIGN1cnJlbnRfc3BhY2UgcmF0aGVyIHRoYW4gcGFfc2VnbWVudF90b19zcGFjZS4KLQkocGFfZGVmaW5lX2xhYmVsKTogTGlrZXdpc2UuCi0JKHBhX3VuZGVmaW5lX2xhYmVsKTogTGlrZXdpc2UuCi0JKG1kX2JlZ2luKTogQ2hhbmdlIGludG8gdGhlIChwb3NzaWJseSBtb2RpZmllZCkgdGV4dF9zZWN0aW9uLgotCShwYV9wYXJzZV9zcGFjZV9zdG10KTogQ3JlYXRlIGEgbmV3IHNlZ21lbnQvc3BhY2UgaWYgY3JlYXRlX2ZsYWcKLQlpcyB0cnVlLCBhbmQgdGhlIHNwYWNlIG5hbWUgaXMgbm90IG9uZSBvZiB0aGUgdHdvIHByZWRlZmluZWQgc3BhY2VzLgotCShwYV9zdWJzcGFjZSk6IFVzZSBjdXJyZW50X3NwYWNlIHJhdGhlciB0aGFuIGEgbG9va3VwIHZpYQotCXBhX3NlZ21lbnRfdG9fc3BhY2UuICBSZXNldCBCRkQgc2VjdGlvbiBmbGFncyBhcyByZXF1aXJlZCBieQotCXRoZSAuc3Vic3BhY2UgZGlyZWN0aXZlLiAgTGlrZXdpc2UgZm9yIHRoZSBzZWN0aW9uIGFsaWdubWVudC4KLQlQYXNzIHRoZSBjdXJyZW50IHNwYWNlIHRvIHVwZGF0ZV9zdWJzcGFjZSBhbmQgY3JlYXRlX25ld19zdWJzcGFjZS4KLQkocGFfc3BhY2VzX2JlZ2luKTogT25seSB1c2Ugc3BhY2Uvc3Vic3BhY2UgYWxpYXNlcyBpZiBVU0VfQUxJQVNFUwotCWlzIHRydWUuICBXaGVuIG5vdCB1c2luZyBhbGlhc2VzLCBjcmVhdGUgYSBCRkQgc2VjdGlvbiBmb3IgZWFjaAotCXN1YnNwYWNlIGVuY291bnRlcmVkLiAgV2hlbiBub3QgdXNpbmcgYWxpYXNlcyByZXBsYWNlIHRoZSBkZWZhdWx0Ci0JdGV4dCwgZGF0YSwgYW5kIGJzcyBzZWdtZW50cyB3aXRoIG5ldyBvbmVzLgotCShjcmVhdGVfbmV3X3N1YnNwYWNlKTogV2hlbiBub3QgdXNpbmcgYWxpYXNlcyBlYWNoIHN1YnNwYWNlIGhhcyBhCi0Jc2VjdGlvbi9zZWdtZW50IGFuZCBzdWJzZWdtZW50cyBhcmUgbm90IG5lZWRlZCwgc28gc2V0IHRoZSBzdWJzZWdtZW50Ci0JdG8gemVyby4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IElmIG5lZWRlZCwgY2FsbAotCW9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIHRvIHBhc3Mgc3BhY2UgYXR0cmlidXRlcyB0byB0aGUKLQlCRkQgYmFja2VuZC4KLQkoY3JlYXRlX25ld19zcGFjZSk6IExpa2V3aXNlLgotCShjcmVhdGVfbmV3X3N1YnNwYWNlKTogTGlrZXdpc2UgZm9yIHN1YnNwYWNlIGF0dHJpYnV0ZXMgdXNpbmcKLQlvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcy4KLQkodXBkYXRlX3N1YnNwYWNlKTogTGlrZXdpc2UgZm9yIHN1YnNwYWNlIGF0dHJpYnV0ZXMgdXNpbmcKLQlvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IEdldCBzZWdtZW50IGFuZCBzb3J0IGtleQotCWZvciAkVEVYVCQgYW5kICRQUklWQVRFJCBmcm9tIHRoZSBkZWZhdWx0IHNwYWNlIHN0cnVjdHVyZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZXhwb3J0X2FyZ3MpOiBBbHdheXMgc2V0IEJTRl9GVU5DVElPTgotCWFzIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogUHJlbGltaW5hcnkgc3RhYiBhdCBoYW5kbGluZwotCVNPTSByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IERlbGV0ZSBpbmNvcnJlY3QgY2hlY2sgZm9yIHN5bWJvbAotCXJlZGVmaW5pdGlvbi4KLQotCSogY29uZmlnL29iai1zb20uW2NoXTogTmV3IGZpbGVzIGZvciBTT00gc3VwcG9ydC4gIE5vdGUgU09NCi0Jc3VwcG9ydCBpcyBub3QgeWV0IGNvbXBsZXRlIGluIEdBUyBvciBCRkQuCi0KLQkqIGNvbmZpZy9oby1ocHBhYnNkLmg6ICBEZWxldGUgSU8qIG1hY3JvcywgdGhleSBhcmUgZGVmaW5lZCBpbgotCXN0ZGlvLmguICBEZWxldGUgZGVjbGFyYXRpb24gb2YgZnJlZS4gIEluY2x1ZGUgc3RkbGliLmgsIHVuaXN0ZC5oLAotCWFuZCBzdHJpbmcuaC4KLQotRnJpIE9jdCAyOSAxMzoyNjoxMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogQWxsb3cgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlIHNlY3Rpb24gbmFtZXMgdXNlZCBmb3IgZW1iZWRkZWQKLQlzdGFicyBzdXBwb3J0LiAgTmVlZGVkIGZvciBTT00uCi0JKiByZWFkLmMgKFNUQUJfU0VDVElPTl9OQU1FKTogRGVmYXVsdCB0aGUgbmFtZSBvZiB0aGUgc3RhYiBzZWN0aW9uCi0JdG8gIi5zdGFiIi4KLQkoU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FKTogTGlrZXdpc2UgZm9yIHRoZSBzdGFiIHN0cmluZ3Mgc2VjdGlvbi4KLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IElzIG5vdyBwYXNzZWQgdGhlIGZ1bGwgbmFtZSBmb3IgdGhlCi0Jc3RhYiBzdHJpbmcgc2VjdGlvbiByYXRoZXIgdGhhbiBhIG5hbWUgcHJlZml4LiAgQWxsIHJlZmVyZW5jZXMKLQljaGFuZ2VkLgotCShzX3N0YWJfZ2VuZXJpYyk6IE5ldyBhcmd1bWVudCBmb3IgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24gbmFtZS4KLQlhbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgotCShzX3hzdGFiKTogQXBwZW5kICJzdHIiIHRvIHRoZSBzdGFiIHNlY3Rpb24gbmFtZSB0byBnZXQgdGhlCi0Jc3RhYiBzdHJpbmcgc2VjdGlvbiBuYW1lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogQXBwZW5kICJzdHIiCi0JdG8gc3RhYiBzZWN0aW9uIG5hbWUgdG8gZ2V0IHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uIG5hbWUuICBQYXNzCi0JdGhlIGZ1bGwgbmFtZSBvZiB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbiB0byBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9iZWdpbik6IERpc2FibGUgIi1SIiBvcHRpb24gdG8gZm9sZAotCXRleHRhbmQgZGF0YSBzZWdtZW50cy4gIFdhcm4gdXNlciAiLVIiIGlzIHVuc3VwcG9ydGVkIG9uIHRoZQotCVBBLgotCi1UaHUgT2N0IDI4IDEyOjM2OjEzIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBEZWZhdWx0IGFsaWdubWVudCBpcyA4IGZvcgotCS5hbGlnbiBhbmQgLkFMSUdOIGRpcmVjdGl2ZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3NwYWNlKTogRG8gbm90IHJlcG9ydCBhbiBlcnJvciBmb3IgYSAuc3BhY2UKLQlkaXJlY3RpdmUgd2hpY2ggZG9lcyBub3QgZGVmaW5lIGEgIndlbGwta25vd24iIHNwYWNlIGFuZCBkb2VzCi0Jbm90IGluY2x1ZGUgYSBzcGFjZSBudW1iZXIgYXMgYW4gYXJndW1lbnQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMpOiBDb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHRoZQotCSJkZWZpbmVkIiwgImxvYWRhYmxlIiwgImNvZGVfb25seSIgYW5kICJzcGFjZV9pbmRleCIgZmllbGRzLgotCShwYV9kZWZfc3BhY2VzKTogQ29ycmVjdCBpbml0aWFsaXphdGlvbiBvZiB0aGUgInNwbnVtIiwgImRlZmluZWQiLAotCWFuZCAicHJpdmF0ZSIgZmllbGRzLgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkIG5ldyB0Y19maXhfZGF0YSBmaWVsZCBmb3IgdGhlIHZhcmlvdXMKLQliYWNrZW5kcyB0byBhdHRhY2ggbWFjaGluZSBkZXBlbmRlbnQgZml4dXAgaW5mb3JtYXRpb24gdG8uCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBuZXcgdGNfZml4X2RhdGEgZmllbGQuCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9zdHJ1Y3QpOiBEZWxldGUgdW5uZWNlc3NhcnkgZml4X2ZpeFAgYW5kCi0JZnhfbmV4dCBmaWVsZHMuCi0JKGhwcGFfZmluZF9ocHBhX2ZpeCk6IERlbGV0ZSB1bm5lY2Vzc2FyeSBmdW5jdGlvbi4gIEZpeCBhbGwKLQljYWxsZXJzIHRvIGdldCBIUFBBIGZpeHVwIGluZm9ybWF0aW9uIGZyb20gdGhlIHRjX2ZpeF9kYXRhIGZpZWxkCi0JaW4gdGhlIEdBUyBmaXh1cC4KLQkoaHBwYV9maXhfcm9vdCk6IERlbGV0ZSB1bm5lY2Vzc2FyeSB2YXJpYWJsZS4KLQkoZml4X25ld19ocHBhKTogQXR0YWNoIEhQUEEgZml4dXAgZGF0YSB0byB0aGUgR0FTIGZpeHVwLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zZXRfc3RhcnRfc3ltYm9sKTsgRGVsZXRlIHVud2FudGVkCi0JZnVuY3Rpb24uICBGaXggYWxsIGNhbGxlcnMuCi0JKHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBEZWxldGUgdW51c2VkIHNzZF9zdGFydF9zeW0gZmllbGQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCi0JaWYgYSBwYXJ0aWN1bGFyIGZpeHVwIGlzIGFkanVzdGFibGUuCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19maXhfYWRqdXN0YWJsZSk6IENhbGwgaHBwYV9maXhfYWRqdXN0YWJsZSB0bwotCXBlcmZvcm0gdGhlIHJlYWwgd29yay4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFKTogTW92ZSBkZWZpbml0aW9uIG91dAotCW9mIE9CSl9YWFggY29uZGl0aW9uYWxzLgotCShNQVhfUkVMT0NfRVhQQU5TSU9OKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGxvZzIpOiBSZW5hbWVkIGZyb20gaXNfcG93ZXJfb2ZfMi4gIEZpeCBhbGwKLQljYWxsZXJzLiBOb3cgcmV0dXJucyBsb2cyIChOKSBmb3IgcG9zaXRpdmUgTiB3aGljaCBhcmUgYW4gZXhhY3QKLQlwb3dlciBvZiB0d28gb3IgLTEgZm9yIGFuIGVycm9yLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jYWxsaW5mbyk6IFJhbmdlIGNoZWNrIHZhbHVlcyBwcm92aWRlZCBmb3IKLQlFTlRSWV9HUiwgRU5UUllfRlIgYW5kIEVOVFJZX1NSLiAgUHJvcGVybHkgYWRqdXN0IHZhdWVzIGJlZm9yZQotCWluc2VydGluZyB0aGVtIGludG8gdGhlIHVud2luZCB0YWJsZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoTkVFRFNfRklYVVApOiBEZWxldGUgZGVmaW5pdGlvbiBhbmQgYWxsIHJlZmVyZW5jZXMuCi0JKGhwcGFfZ2VuX3JlbG9jX3R5cGUpOiBOZXcgb2JqZWN0IGZvcm1hdCBkZXBlbmRlbnQgbWFjcm8uCi0JKHBhX2lwKTogRGVsZXRlIHRvbnMgb2YgY29kZSB3aGljaCB3YXMgZWl0aGVyIE9CSl9TT00gb3IgT0JKX0VMRgotCWNvbmRpdGlvbmFsLiAgVGhlIGNvZGUgY2FuIChhbmQgd2lsbCkgYmUgc2hhcmVkIGJldHdlZW4gU09NICYgRUxGCi0JZm9ybWF0cyBpbiB0aGUgbmVhciBmdXR1cmUuCi0JKGNvbnNfZml4X25ld19ocHBhLCBtZF9hcHBseV9maXhfMSk6IExpa2V3aXNlLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UsIHByb2Nlc3NfZXhpdCwgcGFfZXhpdCk6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBVc2UgaHBwYV9nZW5fcmVsb2MgcmF0aGVyIHRoYW4gYW4gb2JqZWN0IGZvcm1hdAotCXNwZWNpZmljIGNhbGwuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBTZXQgdGhlIHNlZ21lbnQgZm9yIGEgY29tbW9uIHN5bWJvbAotCXRvIGJmZF91bmRfc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl92ZXJzaW9uKTogQWRkIGV4dGVybiBwcm90b3R5cGUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYS0qLWJzZCopOiBOZXcgY29uZmlndXJhdGlvbi4KLQlCRkQgaXMgYWx3YXlzIHVzZWQgZm9yIEdBUyBnZW5lcmF0aW5nIFNPTSBvYmplY3RzLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNldCBzeV91c2VkX2luX3JlbG9jIGlmIGFuCi0JYWRqdXN0bWVudCBpcyByZWplY3RlZCBieSB0aGUgdGFyZ2V0IG1hY2hpbmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2JpZ19jb25zKTogRGVsZXRlIGZ1bmN0aW9uIGFuZCBpdHMKLQlkZWNsYXJhdGlvbi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQgdG8gdXNlIHBhX2NvbnMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBGaXggaW5kZW50aW9uIGFuZCBvcGVuL2Nsb3NlIGJyYWNlCi0JcHJvYmxlbS4KLQotCUZyb20gUGV0ZSBIb29nZW5ib29tOgotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXRvZik6IFJldHVybiBhIE5VTEwgb24gc3VjY2VzcyByYXRoZXIgdGhhbgotCWFuIGVtcHR5IHN0cmluZy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IEFkdmFuY2UKLQlpbnB1dF9saW5lX3BvaXRuZXIgd2hlbiBhbiBpbnZhbGlkIGFyZ3VtZW50IGlzIGVuY291bnRlcmVkLgotCi1UaHUgT2N0IDI4IDEzOjA5OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYmVnaW4pOiBXaGVuIG9wY29kZXMgYXJlIG1hc2hlZCB0b2dldGhlciBpbgotCXRoZSB0YWJsZSwgcmVxdWlyZSB0aGF0IHRoZSBvbmUgd2l0aG91dCBiaXQgMHgxMDAwMDAwIHNldCBjb21lCi0JZmlyc3QuICBSZXF1aXJlIGZ1cnRoZXIgdGhhdCBpdCBiZSBjYXNlICdiJyBvciAnUCcuICBUaGUgYTI5awotCW9wY29kZSB0YWJsZSBhbHJlYWR5IG1lZXRzIHRoZXNlIGNvbnN0cmFpbnRzLgotCShtYWNoaW5lX2lwKTogV2hlbiBoYW5kbGluZyBjYXNlICdpJyBvciAnQScsIG1ha2Ugc3VyZSB0aGF0IHRoZQotCWFwcHJvcHJpYXRlIG9wY29kZSByZWFsbHkgZXhpc3RzIGJ5IGxvb2tpbmcgYXQgdGhlIG5leHQgZW50cnkgaW4KLQl0aGUgb3Bjb2RlIHRhYmxlLgotCi1XZWQgT2N0IDI3IDExOjQ4OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEFkanVzdCBvZmZzZXRzIGZvciBQQyByZWxhdGl2ZQotCWZpeHVwcy4gIEFkZCA2IGZvciBsb25nIDcuMyBjYXNlLCAyIGZvciBzaG9ydCA3LjIgY2FzZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfZWNvZmZfZW50KTogSWdub3JlIGFuIG9wdGlvbmFsIG51bWJlcgotCWFmdGVyIGEgLmVudCBkaXJlY3RpdmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBIYW5kbGUgJz4nIGNhc2UgKHNoaWZ0IGFtb3VudAotCWJldHdlZW4gMzIgYW5kIDYzIGZvciBkb3VibGUgc2hpZnQgaW5zdHJ1Y3Rpb24pLiAgRG8gJiAweDFmIHJhdGhlcgotCXRoYW4gJSAzMi4KLQkocHJpbnRJbnNuKTogSGFuZGxlICc+Jy4KLQotVHVlIE9jdCAyNiAxNjo1ODozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jICh0Y19hb3V0X2ZpeF90b19jaGFycyk6IE91dHB1dCB0aGUgc3ltYm9sCi0JbnVtYmVyIGluIHRoZSByaWdodCBwbGFjZS4gIFVudGVzdGVkLiAgUHJvYmFibHkgZG9lcyBub3Qgd29yayBmb3IKLQljcm9zcyBhc3NlbWJseS4gIEZyb20gY2FnbmV5QGNzLmFkZWxhaWRlLmVkdS5hdSAoQW5kcmV3IENhZ25leSkuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogRXJyb3IgaWYgYSBzaG9ydCBicmFuY2ggdXNlcwotCWFuIGlsbGVnYWwgb2Zmc2V0IG9mIDAgb3IgLTEuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBBbGlnbiAuc3RhYgotCXNlY3Rpb24gdG8gYSBsb25nd29yZCBib3VuZGFyeS4KLQotVHVlIE9jdCAyNiAxMDoyNDozMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENIRUNLRkxBR1MpOiBQYXNzIGRvd24gUlVOVEVTVEZMQUdTLgotCi0JRnJvbSBKZWZmIExhdzoKLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEVMRjMyX0hQUEFfUl9BRERFTkQgLT4KLQlIUFBBX1JfQURERU5ELgotCi1Nb24gT2N0IDI1IDE0OjA2OjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRml4IHVwIG1lbWJhciBhcmd1bWVudCBoYW5kbGluZy4KLQotTW9uIE9jdCAyNSAxMToxNzo1OCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc2guYyAoYnVpbGRfTWJ5dGVzKTogV3JpdGUgdGhlIHJlbG9jcyB0byB0aGUgY29ycmVjdAotCWFkZHJlc3MuIChtZF9hc3NlbWJsZSk6IE1ha2UgZXJyb3IgaGFuZGxpbmcgYSBiaXQgbW9yZSBncmFjZWZ1bC4KLQkobWRfYXBwbHlfZml4KTogIERvbid0IHdhcm4gb24gbm9uIGFsaWduZWQgZGlzcGxhY2VtZW50LgotCi0JKiBjb25maWcvdGMtejhrLmMgKGdldF9zcGVjaWZpYywgYnVpbHRfYnl0ZXMpOiAgVW5kZXJzdGFuZCBhbGwgdGhlCi0JYXNwZWN0cyBvZiBsZGEuCi0KLU1vbiBPY3QgMjUgMTA6MjA6MzEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogVXNlICIkPCoiIHNvIFZQQVRIIHdpbGwgZmluZAotCWFzLmluZm8qIGV2ZW4gaWYgdGhleSdyZSBpbiAkKHNyY2RpcikgKGUuZy4sIGZvciBGU0YKLQlkaXN0cmlidXRpb25zKS4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogRm9yIHJlbG9jcyB0aGF0IGFyZSBwY19yZWxhdGl2ZSBhbmQKLQlwY3JlbF9vZmZzZXQgYW5kIG5vdCBwYXJ0aWFsX2lucGxhY2UsIGFkanVzdCByZWxvYy0+YWRkZW5kIHRvCi0JY29tcGVuc2F0ZSBmb3IgYSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGJ1Zy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmg6IFJlbW92ZWQgcmVtYWluaW5nIG5vbi1CRkRfQVNTRU1CTEVSIGNvZGUuCi0JKiBjb25maWcvdGMtc3BhcmMuYzogRGl0dG8uCi0JKHRjX2dlbl9yZWxvYyk6IEluY2x1ZGUgZnhfb2Zmc2V0IGZvciBwY3JlbCBmaXh1cHMuCi0KLVN1biBPY3QgMjQgMTY6NDk6MDAgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkB4MS5jeWdudXMuY29tKQotCi0JKiB0Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBkd29yZCBwc2V1ZG8gb3AuCi0KLUZyaSBPY3QgMjIgMjA6NDA6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jOiByZXBsYWNlZCBhbGwgdmFyaWFibGVzIGNhbGxlZCBGb3JtYXQgd2l0aCAnZm9ybWF0JywKLQkgIGZvciBjb25zaXN0ZW5jeSB0aHJvdWdob3V0Ci0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIG1pcHMqLSBpbnN0ZWFkIG9mIG1pcHMsIG1pcHMqZWwgZm9yIGxpdHRsZQotCWVuZGlhbiBjb25maWd1cmF0aW9ucwotCi1GcmkgT2N0IDIyIDE0OjQ1OjQ5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW5wdXQtc2NydWIuYyAocGh5c2ljYWxfaW5wdXRfZmlsZSwgbG9naWNhbF9pbnB1dF9maWxlLAotCXBoeXNpY2FsX2lucHV0X2xpbmUsIGxvZ2ljYWxfaW5wdXRfbGluZSk6IE1hZGUgc3RhdGljLgotCShhc193aGVyZSk6IFJldHVybiBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGRvbid0IHByaW50Ci0JdGhlbSBvdXQuCi0JKiBtZXNzYWdlcy5jIChhc19zaG93X3doZXJlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4gIE90aGVyCi0JZnVuY3Rpb25zIHVzZSBpdCBpbnN0ZWFkIG9mIGFzX3doZXJlLgotCShhc19iYWRfaW50ZXJuYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhc19iYWQpOiBVc2UgYXNfYmFkX2ludGVybmFsLgotCShhc19iYWRfd2hlcmUpOiBOZXcgZnVuY3Rpb24sIGxpa2UgYXNfYmFkIGJ1dCB0YWtpbmcgYSBmaWxlIG5hbWUKLQlhbmQgbGluZSBudW1iZXIuCi0JKiBhcy5oIChhc19iYWRfd2hlcmUpOiBEZWNsYXJlLgotCShhc193aGVyZSk6IENoYW5nZSBwcm90b3R5cGUgZm9yIG5ldyBhcmd1bWVudHMuCi0JKiB3cml0ZS5oIChmaXhTKTogQWRkZWQgZmllbGRzIGZ4X2ZpbGUgYW5kIGZ4X2xpbmUuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogU2F2ZSBmaWxlIGFuZCBsaW5lIG51bWJlciBpbiBmaXguCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgYXNfYmFkX3doZXJlLCBub3QgYXNfYmFkLgotCSogaW5wdXQtZmlsZS5jIChmX2luLCBmaWxlX25hbWUpOiBNYWRlIHN0YXRpYy4KLQkqIGNvbmQuYyAoc3RydWN0IGZpbGVfbGluZSk6IEp1c3QgdXNlIGZpbGUgYW5kIGxpbmUgZmllbGRzLgotCShzX2Vsc2UpOiBVc2UgYXNfd2hlcmUgYW5kIGFzX2JhZF93aGVyZSwgbm90IGdldF9maWxlX2xpbmUgYW5kCi0Jc2V0X2ZpbGVfbGluZS4KLQkoZ2V0X2ZpbGVfbGluZSwgc2V0X2ZpbGVfbGluZSk6IFJlbW92ZWQuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IFVzZSBhc193aGVyZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSBhc193aGVyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoYWRkX2ZpbGUpOiBVc2UgYXNfd2hlcmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogVXNlIGFzX3doZXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBVc2UgYXNfYmFkX3doZXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAodGNfZ2VuX3JlbG9jKTogVXNlIGFzX2JhZF93aGVyZSwgbm90IGFzc2VydC4KLQotVGh1IE9jdCAyMSAxMjo1MjowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuaDogRG9uJ3QgZGVmaW5lIFJFR0lTVEVSX1BSRUZJWCBvcgotCU9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCBpZiBlaXRoZXIgaXMgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRGVsZXRlIHNvbWUgY29kZSBpbiAiI2lmIDAiLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBiZmRfZ2FzIGZvciBhbGwgc3BhcmMgdGFyZ2V0cy4gIEFkZGVkIGZhY2lsaXR5Ci0JZm9yIGtlZXBpbmcgb3IgcmVqZWN0aW5nIGNvbmZpZ3VyYXRpb25zIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50OwotCWRlZmF1bHQgaXMgdG8gYXNzdW1lIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIGFuZCByZWplY3QgY29uZmlncwotCXN0aWxsIGJlaW5nIHdvcmtlZCBvbi4gIE1hcmsgRWxmIGNvbmZpZ3VyYXRpb25zIChleGNlcHQgc3BhcmMgYW5kCi0JaTM4NikgYXMgZGV2ZWxvcG1lbnRhbC4gIERlbGV0ZWQgY2FzZXMgbWF0Y2hpbmcgc29tZSBnZW5lcmljIG5hbWVzCi0JaW4gZmF2b3Igb2YgbW9yZSBzcGVjaWZpYyBuYW1lcy4gIChFLmcuLCB3aGVuIHdlIGdldCBBbHBoYQotCXN1cHBvcnQsIHdlJ2xsIHN0aWxsIG9ubHkgc3VwcG9ydCBWTVMgZm9yIFZheC4pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9lbmQpOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfZW5kKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoQkZEX1JFTE9DXyopOiBEZWxldGUgbWFjcm9zIHRoYXQgdXNlZCB0byBoZWxwIGtlZXAgdGhlIG5vbi1iZmQKLQl2ZXJzaW9uIGNvbXBpbGluZy4gIEFsbCBzcGFyYyB0YXJnZXRzIHdpbGwgdXNlIGJmZCBub3cuCi0JKiB0Yy5oIChtZF9lbmQpOiBEb24ndCBkZWNsYXJlIGlmIGl0J3MgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlciBIb29nZW5ib29tOgotCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBMaW1pdCBvY3RhbCBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvCi0JdGhyZWUgZGlnaXRzLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBNYWpvciBjbGVhbnVwLiAgVXNlIEdOVS1zdHlsZSBjb21tZW50cy4gIFdhcm4KLQlhZ2FpbnN0IHBsYWNpbmcgYWRkaXRpb25hbCBvYmplY3QtZmlsZSBkZXBlbmRlbnQgY29kZSBoZXJlLiAgV2FybgotCWFnYWluc3QgY29udGFtaW5hdGluZyBhbGwgb2YgR0FTIHdpdGggdGhlIGludGVybmFscyBvZiB0Yy1ocHBhLmMKLQl0aHJvdWdoIGluY2x1c2lvbiBvZiB0Yy1ocHBhLmguICBEZWxldGUgYWxsIGZvcndhcmQgZGVjbGFyYXRpb25zCi0JZm9yIGZ1bmN0aW9ucyBvbmx5IHVzZWQgd2l0aGluIHRjLWhwcGEuYywgbGlrZXdpc2UgZm9yIHN0cnVjdHVyZXMsCi0JdmFyaWFibGVzLCBhbmQgI2RlZmluZXMuICBUcnkgdG8gZ3JvdXAgT0JKX0VMRiBhbmQgT0JKX1NPTQotCWNvbmRpdGlvbmFsIGNvZGUgaW4gYSBmZXcgc21hbGwgcGxhY2VzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBNYWpvciBjbGVhbnVwLiAgVXNlIEdOVS1zdHlsZSBjb21tZW50cy4gIEdyb3VwCi0Jc3RydWN0dXJlcywgZ2xvYmFsIHZhcmlhYmxlcywgZm9yd2FyZCBkZWNsYXJhdGlvbnMgdG9nZXRoZXIuCi0JUmVkdWNlIChvciBpbiBzb21lIGNhc2VzIGVsaW1pbmF0ZSkgT0JKX0VMRiBhbmQgT0JKX1NPTQotCWNvbmRpdGlvbmFsIGNvZGUgLS0gdHJ5IHRvIGdyb3VwIGNvbmRpdGlvbmFsIGNvZGUgdG9nZXRoZXIKLQlpbnRvIGEgZmV3IHBsYWNlcy4gICBNYWtlIGFsbCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyB3aGljaAotCWFyZSBvbmx5IHVzZWQgd2l0aGluIHRjLWhwcGEuYyBzdGF0aWMuICBQQVJBTWl6ZSBhbGwgZnVuY3Rpb25zLgotCUFkZCBjb21tZW50cyB0byBmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkIGZ1bmN0aW9ucywgdmFyaWFibGVzLAotCSNkZWZpbmVzLCBldGMuICBEZWxldGUgdW51c2VkIG1lbWJlcnMgd2l0aGluIHN0cnVjdHVyZXMuICBEZWxldGUKLQlsZGlsO2JsZSBoYWNrcyAtLSBpdCBpcyBiZWxpZXZlZCB0aGV5IHdlcmUgaW5zdGFsbGVkIHRvIHdvcmsKLQlhcm91bmQgb2xkIGdhcyBidWdzLiAgIEF2b2lkIHVzaW5nIG1peGVkIGNhc2UgZm9yIGxvY2FsCi0JZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGFuZCBzdHJ1Y3R1cmVzLiAgRml4IGZvcm1hdHRpbmcgcHJvYmxlbXMKLQlub3QgZm91bmQgYnkgR05VLWluZGVudC4gIEFkZCBGSVhNRSBub3RpY2VzIGZvciB0aGluZ3Mgd2hpY2gKLQlzaG91bGQgYmUgd29ya2VkIG9uIHRoZSBuZWFyIGZ1dHVyZS4gIERlbGV0ZSBsb3RzIG9mIG9sZAotCXVzZWxlc3MgKDEuMzYgUEEtU09NKSBjb2RlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiAoZml4X25ld19ocHBhKTogSW5pdGlhbGl6ZSB0aGUgZnhfcl90eXBlCi0JZmllbGQgb2YgdGhlIGZpeFMgc3RydWN0dXJlLiAgTmVlZGVkIHRvIGJ1aWxkIHVud2luZAotCWRlc2NyaXB0b3JzIGNvcnJlY3RseS4KLQotCSogd3JpdGUuYzogKGZpeHVwX3NlZ21lbnQpOiBBbGxvdyBleHByZXNzaW9ucyBzdWNoIGFzCi0Jc3ltMS1zeW0yK2NvbnN0IGFzIGxvbmcgYXMgc3ltMiBpcyAkZ2xvYmFsJC4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBQcm92aWRlIGEgaG9vayBzbyB0aGF0IGEgdGFyZ2V0Ci0JY3B1IGNvbmZpZ3VyYXRpb24gY2FuIHJlamVjdCBjZXJ0YWluIHJlbG9jYXRpb24gcmVkdWN0aW9ucy4KLQkqIHRjLWhwcGEuaCAodGNfZml4X2FkanVzdGFibGUpOiBOZXcgbWFjcm8uICBPbmx5IGFjY2VwdCByZWxvY2F0aW9ucwotCXdoaWNoIGRvIG5vdCBpbnZvbHZlIGZ1bmN0aW9uIHN5bWJvbHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFJlaW5kZW50IHdpdGggR05VLWluZGVudC4gIERlbGV0ZSByZWZlcmVuY2VzCi0JdG8gT0JKX09TRlJPU0UuICBGaXggdHlwb3MgKE9CSl9TT01FIC0+IE9CSl9TT00pLiAgRGVsZXRlIHVudXNlZAotCVNUQUJfRklYVVAgbWFjcm8uCi0JKiBjb25maWcvdGMtaHBwYS5jOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4XzEpOiBVc2UgZWxmX3N5bWJvbF90eXBlLCBpbnN0ZWFkCi0Jb2YgZWxmMzJfc3ltYm9sX3R5cGUuCi0JKHBhX2V4cG9ydF9hcmdzKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkocGFfZGVzYyk6IERvIG5vdCBjYWxsIG9ial9lbGZfZGVzYy4gIChJcyBwYV9kZXNjIGV2ZW4gbmVlZGVkCi0JYW55bW9yZT8pCi0JKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IERvIG5vdCBkZWNsYXJlIGVsZl9nZXRfc3ltdGFiX21hcCBhbnkKLQlvcmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IChtZF9zZWN0aW9uX2FsaWduKTogQWxpZ24gYWxsIHNlY3Rpb25zIHRvCi0JYSBtdWx0aXBsZSBvZiB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgcmF0aGVyIHRoYW4gYWx3YXlzIGEKLQltdWx0aXBsZSBvZiA4LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX3N5bWJvbCk6IElmIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uCi0JYml0cyBhcmUgemVybyAoZWcgdGhleSBzcGVjaWZ5IG5vIHJlbG9jYXRpb25zKSwgdGhlbiBkbyBub3QgZXZlbgotCWJvdGhlciBhZGRpbmcgdGhlaXIgZW50cmllcyB0byB0aGVzeW1leHRuIHNlY3Rpb24uCi0KLVRodSBPY3QgMjEgMTU6NDQ6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgLXNwYXJjCi0Jb3B0aW9uLCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBTdW5PUyBtYWtlIGRlZmF1bHQgLnMubyBydWxlLgotCi1XZWQgT2N0IDIwIDEyOjI2OjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXAsIGxhYmVsICJpbW1lZGlhdGUiKTogQ29udmVydCByZWxvY3MKLQlvcGVyYXRpbmcgb24gdXBwZXIgMzIgYml0cyBvZiBpbW1lZGlhdGUgY29uc3RhbnRzIHRvIGxvd2VyLWhhbGYKLQlyZWxvY3Mgd2l0aCBhZGp1c3RlZCBjb25zdGFudHMuCi0KLVR1ZSBPY3QgMTkgMTg6MTM6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5oIChBT1VUX01BQ0hUWVBFKTogRGVmaW5lIHRvIGJlIGV4dGVybmFsIHZhcmlhYmxlCi0JbTY4a19hb3V0X21hY2h0eXBlLgotCSogY29uZmlnL3RjLW02OGsuYyAob21hZ2ljKTogUmVtb3ZlIG9ic29sZXRlIGFuZCB1bnVzZWQgdmFyaWFibGUuCi0JKG02OGtfYW91dF9tYWNodHlwZSk6IE5ldyB2YXJpYWJsZSwgaWYgT0JKX0FPVVQuCi0JKG1kX2Fzc2VtYmxlKTogSW5pdGlhbGl6ZSBtNjhrX2FvdXRfbWFjaHR5cGUgYmFzZWQgb24KLQljdXJyZW50X2FyY2hpdGVjdHVyZSwgaWYgT0JKX0FPVVQuCi0JKG1kX3BhcnNlX29wdGlvbik6IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2UgdG8gb21hZ2ljLgotCi1UaHUgT2N0IDE0IDE2OjUxOjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogSWdub3JlIC5saXZlcmVnIHBzZXVkby1vcC4KLQkoc19vcHRpb24pOiBJZ25vcmUgLm9wdGlvbiBPKiBhbmQgLm9wdGlvbiBwaWMqLgotCShzX2VudCk6IFNraXAgd2hpdGVzcGFjZSBiZXR3ZWVuIHN5bWJvbCBhbmQgb3B0aW9uYWwgZGlnaXQuCi0JKG15X2dldFNtYWxsRXhwcmVzc2lvbik6IEhhbmRsZSAoJHh4KSBjb3JyZWN0bHk6IGFzc3VtZSAwKCR4eCkuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBbHdheXMgYWNjZXB0ICd4JyBhbmQgJ1gnIGFzIGVzY2FwZQotCWNoYXJhY3RlcnMgaW4gc3RhdGUgNi4KLQkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IEFjY2VwdCBcWGgqIGFuZCBceGgqIHdoZXJlIGgqIGFyZQotCWhleGlkZWNpbWFsIGRpZ2l0cy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4XzEpOiBNYWtlIGNyb3NzIHNlZ21lbnQgY2FsbHMgd29yawotCWZvciBFTEYgYnkgaGFja2luZyBhcm91bmQgYml6YXJyZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGJlaGF2aW91cgotCXRoYXQgSSBkb24ndCBkYXJlIGNoYW5nZS4KLQotVGh1IE9jdCAxNCAxMTozMzoyNSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogY29uZmlnL3RjLWkzODYuYzogKG1kX2JlZ2luKTogRG8gbm90IHplcm8gc3RhdGljIGFycmF5cy4gIERvbid0Ci0JY2FsbCBzdHJjaHIgZm9yIGVhY2ggY2hhcmFjdGVyIHRvIHNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgY2hhciwKLQlpbnN0ZWFkIGFkZCBhIHNlY29uZCBsb29wIG92ZXIgc3BlY2lhbF9jaGFycy4gIFNldCBhbGlnbm1lbnQKLQlvZiB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdG8gNC4KLQkocGksIHRlLCBwdCwgcGUsIHBzKTogQWRkIGRlY2xhcmF0aW9ucyBzbyB0aGF0IERFQlVHMzg2IGNhbiBiZQotCXVzZWQgYWdhaW4uCi0JKHJlbG9jKTogRG9uJ3QgcmV0dXJuIDggYW5kIDE2IGJpdCBub24tUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgb24KLQlFTEYsIHNpbmNlIHRoZSBFTEYgb2JqZWN0IGZvcm1hdCBkb2VzIG5vdCBoYXZlIHRoZXNlIHR5cGUgb2YKLQlyZWxvY2F0aW9ucy4gIENoYW5nZSB0aGUgYWJvcnQgaW50byBhcyBhc19iYWQgYW5kIHJldHVybgotCUJGRF9SRUxPQ19OT05FIHRvIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MuCi0JKG1kX2Fzc2VtYmxlKTogS2VlcCB0cmFjayBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2l6ZS4gIEFsbG93IHdoaXRlCi0Jc3BhY2UgYmV0d2VlbiB0aGUgJCBhbmQgdGhlIGNvbnN0YW50IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKLQlnYXNlcyBhbmQgb3RoZXIgYXNzZW1ibGVycy4KLQkoaTM4Nl9vcGVyYW5kKTogU2tpcCBzcGFjZXMgYmV0d2VlbiAkIGFuZCBleHByZXNzaW9uLgotCSh0Y19nZW5fcmVsb2MpOiBEb24ndCBhbGxvdyBhbnl0aGluZyBidXQgMzIgYml0IHJlbG9jYXRpb25zIG9uCi0JRUxGLiAgQ29udmVydCBhYm9ydCBpbnRvIGFuIGFzX2JhZCBhbmQgYXNzZXJ0IGludG8gYXNfZmF0YWwuCi0KLVdlZCBPY3QgMTMgMTY6NTA6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZml4dXBfc2VnbWVudCkgW0RJRkZfRVhQUl9PS106IElmCi0Jc3ViX3N5bWJvbFAgaXMgaW4gdGhlIGN1cnJlbnQgc2VnbWVudCwgY29udmVydCB0byBhIFBDLXJlbGF0aXZlCi0JZml4dXAgYW5kIGRpc2NhcmQgdGhlIHN5bWJvbC4KLQotV2VkIE9jdCAxMyAxNDowMDowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IEhhbmRsZSBzdF9FbmQgc3ltYm9sCi0JZm9yIHN0X1N0YXRpY1Byb2MganVzdCBsaWtlIHN0X1Byb2MuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyk6IE1vdmVkICNlbmRpZiBmb3IgT0JKX0JPVVQKLQlzbyB0aGF0IE9CSl9CT1VUIGRvZXNuJ3QgZm9yZ2V0IHRvIGFkanVzdCBhbGwgdGhlIGZyYWdtZW50cyBpbiB0aGUKLQkuYnNzIHNlY3Rpb24uCi0KLVR1ZSBPY3QgMTIgMTc6MjY6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJZiBPQkpfRUxGLCBpbmNsdWRlIGVsZi9taXBzLmguCi0JKG1pcHNfcmVnbWFza19mcmFnKTogTmV3IHN0YXRpYyB2YXJpYWJsZSwgaWYgT0JKX0VMRi4KLQkobWRfYmVnaW4pOiBJZiBPQkpfRUxGLCBjcmVhdGUgLnJlZ2luZm8gc2VjdGlvbiBhbmQgc2V0Ci0JbWlwc19yZWdtYXNrX2ZyYWcgdG8gYSBmcmFnLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLCBpZiBPQkpfRUxGLiAgU2V0Ci0JbWlwc19yZWdtYXNrX2ZyYWcgdG8gcmVnaXN0ZXIgbWFzayBpbmZvcm1hdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nKTogTmV3IG1hY3JvLCBkZWZpbmVkCi0JaWYgT0JKX0VMRi4KLQotVHVlIE9jdCAxMiAwMzozMzoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogVXNlIG15bmFtZSB3aGVuIHByaW50aW5nIG1lc3NhZ2VzLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9iZWdpbik6IFVzZSBudWxsIHBvaW50ZXIsIG5vdCBlbXB0eSBzdHJpbmcsCi0JYXMgaW5pdGlhbCAicmV0dXJuIiB2YWx1ZSBpbiBjYXNlIGhhc2hpbmcgaXNuJ3QgbmVlZGVkLgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9hdG9mKTogUmV0dXJuIG51bGwsIG5vdCBlbXB0eSBzdHJpbmcsIG9uCi0Jc3VjY2Vzcy4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9hdG9mKSwgY29uZmlnL3RjLWg4NTAwLmMgKG1kX2F0b2YpLAotCWNvbmZpZy90Yy1ocHBhLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtaTg2MC5jIChtZF9hdG9mKSwKLQljb25maWcvdGMtaTk2MC5jIChtZF9hdG9mKSwgY29uZmlnL3RjLW04OGsuYyAobWRfYXRvZiksCi0JY29uZmlnL3RjLW5zMzJrLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtc2guYyAobWRfYXRvZik6IERpdHRvLgotCi1Nb24gT2N0IDExIDE2OjQ2OjMxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQlmaXggZm9yIHByIDM1NzEKLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBTcGVjaWFsIGFjdGlvbiBpZiA4IGJpdAotCWFkZHJlc3Mgc2Vlbi4gKGNoZWNrX29wZXJhbmQpOiBEb24ndCBjb21wbGFpbiBpZiB0cnVuY2F0aW5nIHRvcAotCWJpdHMgb2YgYW4gOCBiaXQgYWRkcmVzcy4gIChidWlsZF9ieXRlcyk6IEFsbG93IGFuIGltbWVkaWF0ZSBhbmQKLQlhbiBhYnNvbHV0ZSBpbiB0aGUgc2FtZSBpbnNuLgotCi1Nb24gT2N0IDExIDE3OjE4OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBEb24ndCBjcmFzaCBpZiBzZWdpbmZvIGlzIE5VTEwuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogV3JpdGUgb3V0IHJlZ2lzdGVyIG1hc2tzCi0JYnkgbW9kaWZ5aW5nIC5yZWdpbmZvIHNlY3Rpb24sIG5vdCBieSBkaXJlY3RseSBtb2RpZnlpbmcgQkZECi0JYmFja2VuZCBkYXRhLgotCi1Nb24gT2N0IDExIDE0OjExOjMyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLXN1bm9zLmg6IHJlbW92ZSBleHRlcm4gdGltZSBkZWNsYXJhdGlvbgotCi1Nb24gT2N0IDExIDE2OjE0OjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwpOiBEbyBtZW50aW9uIHRoYXQgaXQncyB0aGUgYXNzZW1ibGVyIHRoYXQKLQlnb3QgdGhlIGZhdGFsIGVycm9yLgotCi1GcmkgT2N0ICA4IDE0OjA5OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19ncHJtYXNrLCBtaXBzX2Nwcm1hc2spOiBOZXcgdmFyaWFibGVzIHRvCi0JaG9sZCByZWdpc3RlciBtYXNrcy4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIHRoZW0gdG8gemVyby4KLQkoYXBwZW5kX2luc24pOiBVcGRhdGUgbWlwc19ncHJtYXNrIGFuZCBtaXBzX2Nwcm1hc2suICBBbHNvIGFkZAotCXJlZ2lzdGVyIHZhcmlhYmxlcyBwaW5mbyBhbmQgcHJldl9waW5mby4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1pcHNfZ3BybWFzaywgbWlwc19jcHJtYXNrKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogSWYgVENfTUlQUywgc2V0IGdwcm1hc2sKLQlhbmQgY3BybWFzayBmcm9tIG1pcHNfZ3BybWFzayBhbmQgbWlwc19jcHJtYXNrLgotCi0JKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgVEFSR0VUX0ZPUk1BVCBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLW1pcHMuYyAoR1BPUFQpOiBEZWZpbmUgaWYgT0JKX0VDT0ZGIG9yIE9CSl9FTEYuCi0JKHZhcmlvdXMpOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gR1AgcmVmZXJlbmNlcyB0byBhcHBseSBpZgotCUdQT1BULCBub3QgaWYgT0JKX0VDT0ZGLgotCShzX2NoYW5nZV9zZWMpOiBSZWFycmFuZ2Ugc29tZXdoYXQuICBJZiBPQkpfRUxGLCB1c2UgLnJvZGF0YQotCWluc3RlYWQgb2YgLnJkYXRhLiAgSWYgT0JKX0VMRiwgc2V0IHNlY3Rpb24gZmxhZ3MgZm9yIC5yb2RhdGEgYW5kCi0JLnNkYXRhIHNlY3Rpb25zLgotCShzX2ZyYW1lLCBzX2xvYywgc19tYXNrKTogQ29tbWVudCBvdXQgZW50aXJlIGZ1bmN0aW9ucywgcmF0aGVyCi0JdGhhbiBqdXN0IGJvZHkuICBUaGV5J3JlIG5vdCB1c2VkIGFueWhvdy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGNwdV90eXBlIHRvIG1pcHMgZm9yIG1pcHMqLiAgQWNjZXB0Ci0JbWlwcy0qLWVsZmwqIGFuZCBtaXBzLSotZWxmKi4KLQotVGh1IE9jdCAgNyAxODozNjoyOSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBBbGxvdyB0aGUgYWxpZ25tZW50IGZpZWxkIHRvCi0Jbm90IGJlIHNwZWNpZmllZC4KLQotV2VkIE9jdCAgNiAxMzowMTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGNvbnNfZml4X25ld19taXBzKTogTmV3IGZ1bmN0aW9uLiAgVHVybgotCUJGRF9SRUxPQ182NCBpbnRvIEJGRF9SRUxPQ18zMi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRDX0NPTlNfRklYX05FVyk6IERlZmluZS4KLQkoY29uc19maXhfbmV3X21pcHMpOiBEZWNsYXJlLgotCi0JQ2hhbmdlcyB0byBsZXQgY29ucyBoYW5kbGUgYmlnbnVtcyBsaWtlIGdlbmVyYWwgZXhwcmVzc2lvbnMuCi0JKiBleHByLmggKGV4cHJlc3Npb25TKTogTmV3IGZpZWxkIFhfdW5zaWduZWQuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJbml0aWFsaXplIFhfdW5zaWduZWQgdG8gMS4gIFNldCBpdCB0byAwIGZvcgotCXVuYXJ5IG1pbnVzIGNhc2UuCi0JKGV4cHIpIEZpeCB0eXBvIHJlc3VsdFAgdG8gcmlnaHQgaWYgbWlzc2luZyBvcGVyYW5kLiAgU2V0Ci0JWF91bnNpZ25lZCB0byAxIHdoZW4gYnVpbGRpbmcgbmV3IGV4cHJlc3Npb24uCi0JKiByZWFkLmMgKHBvdGFibGUpOiBNYWtlICJvY3RhIiBhbmQgInF1YWQiIGNhbGwgY29ucywgbm90Ci0JYmlnX2NvbnMuCi0JKGNvbnMpOiBIYW5kbGUgYmlnbnVtcy4gIElmIGdpdmVuIGFuIE9fY29uc3RhbnQgKHNtYWxsIGludGVnZXIpIHRvCi0JZmlsbCBhIGJpZyBzcGFjZSwgdHVybiBpdCBpbnRvIGEgYmlnbnVtLgotCShwYXJzZV9iaXRmaWVsZF9jb25zKTogU2V0IFhfdW5zaWduZWQgZmllbGQuCi0JKGJpZ251bV9sb3csIGJpZ251bV9saW1pdCwgYmlnbnVtX2hpZ2gsIGdyb3dfYmlnbnVtLCBiaWdfY29ucyk6Ci0JUmVtb3ZlZC4KLQkqIHJlYWQuaCAoYmlnX2NvbnMpOiBSZW1vdmUgcHJvdG90eXBlLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IGdpdmUgYSB3YXJuaW5nIGlmIGEKLQlzeW1ib2wgaW4gZXhwcl9zZWN0aW9uIGNhbiBub3QgYmUgcmVzb2x2ZWQuCi0JKFNfU0VUX1ZBTFVFKTogQ2xlYXIgWF91bnNpZ25lZC4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgZmFpbGVkIG9uIGEKLQlzeW1ib2wgd2UgYXJlIHdyaXRpbmcgb3V0LCBnaXZlIGEgd2FybmluZy4KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChwYXJzZV9yZWdsaXN0KTogU2V0IFhfdW5zaWduZWQuCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBDaGFuZ2UgIm9jdGEiIGFuZCAicXVhZCIgdG8KLQljYWxsIHBhX2NvbnMsIG5vdCBwYV9iaWdfY29ucy4KLQkocGFfYmlnX2NvbnMpOiBSZW1vdmUuCi0JKiBjb25maWcvdGMtaHBwYS5oIChwYV9iaWdfY29ucyk6IFJlbW92ZSBkZWNsYXJhdGlvbi4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSAicXVhZCIgdG8gY2FsbCBjb25zLAotCW5vdCBiaWdfY29ucy4KLQotVHVlIE9jdCAgNSAxMDo1MzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChDb3B5aW5nKTogbmV3IG5vZGUsIHRvIGhhbmRsZSB0aGUgcmVjZW50IGNoYW5nZXMKLQlpbiB0aGUgdGV4aW5mby9ncGwudGV4aW5mbyBmaWxlCi0KLU1vbiBPY3QgIDQgMTc6MTA6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGJpZ19jb25zKTogSGFuZGxlICIwIiBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogU2V0IHRhcmdldF9iaWdfZW5kaWFuIGNvcnJlY3RseS4KLQotTW9uIE9jdCAgNCAxNTozNzo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBNb2RlIDcuMyBvcGVyYW5kIHVzaW5nIFBDIHNob3VsZAotCWhhdmUgcGMtcmVsYXRpdmUgZml4dXAuCi0JKG1kX3BhcnNlX29wdGlvbik6IE1vdmUgIi1rIiBjYXNlIGRvd24gbmVhciAiLXBpYyIgY2FzZS4KLQotCSogY29uZmlndXJlLmluOiBBbHBoYWJldGl6ZSBsaXN0IG9mIGNwdSB0eXBlIGFsdGVybmF0aXZlcy4gIEVuYWJsZQotCU9TIHZhbHVlcyBvZiAibGludXgqZWxmKiIgYW5kICJsaW51eCpjb2ZmKiIgdG8gc2VsZWN0IHRob3NlCi0JZm9ybWF0cywgd2l0aCBsaW51eCBlbXVsYXRpb24uICBEb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIHVwcGVyLQotCW9yIG1peGVkLWNhc2UgdmVyc2lvbnMgb2YgIm9zZSIuCi0KLVRodSBTZXAgMzAgMTE6MDU6MzUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3o4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBhZGQgInVuc2VnIi4KLQotV2VkIFNlcCAyOSAxNjoxNToxMSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tODhrLW9wY29kZS5oIChtODhrX29wY29kZXMpOiBjb3JyZWN0IGEgZmV3IG1pc3Rha2VzCi0JICBmb3VuZCB3aGlsZSBleHRlbmRpbmcgdGhlIGRpc3Nhc3NlbWJsZXIuCi0KLVR1ZSBTZXAgMjggMTI6MDI6MDQgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFNwbGl0IGkzODYgTHlueE9TIG91dCBmcm9tIG90aGVyIGNvZmYgdGFyZ2V0cywKLQlhZGQgYSBzcGVjaWZpYyBMeW54IGVtdWxhdGlvbi4KLQlBZGQgbTY4ayBMeW54T1MgdGFyZ2V0LgotCSogY29uZmlnL3RjLWkzODYuYzogRGVmaW5lIHNwZWNpZmljIEx5bnggdGFyZ2V0IGZvcm1hdC4KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IERlZmluZSBzcGVjaWZpYyBMeW54IHRhcmdldCBmb3JtYXQuCi0JKiBjb25maWcvdGUtbHlueC5oOiBOZXcgZmlsZS4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IERvbid0IHNldCBUQVJHRVRfRk9STUFUIHRvIGJlCi0JImNvZmYte2kzODYsbTY4a30iIGlmIFRBUkdFVF9GT1JNQVQgYWxyZWFkeSBkZWZpbmVkLgotCShJTklUX1NUQUJfU0VDVElPTik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBJbmNsdWRlIDx0aW1lLmg+LgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IExvb2sgZm9yIC5zdGFiIHNlY3Rpb25zIGFuZCBjYWxsCi0JYWRqdXN0X3N0YWJfc2VjdGlvbi4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwgZmlsbHMgaW4gdGhlIGZpcnN0IHN5bWJvbAotCW9mIGEgc3RhYiBzZWN0aW9uIHdpdGggbnVtYmVyIG9mIHN5bWJvbHMgYW5kIHN0cmluZyB0YWJsZSBzaXplLgotCShvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwgY3JlYXRlcyB0aGUgaW5pdGlhbAotCXN5bWJvbCBmb3IgYSBzdGFiIHNlY3Rpb24uCi0KLU1vbiBTZXAgMjcgMTU6MjE6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvYXRvZi12YXguYyAobWRfYXRvZik6IFJldHVybiBudWxsIG9uIHN1Y2Nlc3MgaW5zdGVhZCBvZgotCWVtcHR5IHN0cmluZy4KLQkqIGNvbmZpZy9hdG9mLXRhaG9lLmMgKG1kX2F0b2YpOiBEaXR0by4KLQkqIHJlYWQuYyAoZmxvYXRfY29ucyk6IEV4cGVjdCBhIG51bGwgcG9pbnRlciBmb3Igc3VjY2Vzcywgbm90IGFuCi0JZW1wdHkgc3RyaW5nLgotCi0JKiBoYXNoLmMgKGhhc2hfaW5zZXJ0LCBoYXNoX2phbSwgaGFzaF9ncm93KTogUmV0dXJuIG51bGwgcG9pbnRlcgotCW9uIHN1Y2Nlc3MsIGluc3RlYWQgb2YgZW1wdHkgc3RyaW5nLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQotCSogY29uZmlnL3RjLXZheC5jOiBVc2UgUEFSQU1TIGluIGRlY2xhcmF0aW9ucy4KLQkodmlwX29wKTogVXNlIE5VTEwgaW5zdGVhZCBvZiBlbXB0eSBzdHJpbmcgZm9yIHN1Y2Nlc3MgaW4gZXJyb3IKLQlhbmQgd2FybmluZyBmaWVsZHMuCi0KLVN1biBTZXAgMjYgMjM6NDU6MjkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKGV4cHIpIFtESUZGX0VYUFJfT0tdOiBQZXJtaXQgc3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMKLQlpbiBkaWZmZXJlbnQgZGVmaW5lZCBzZWdtZW50cy4KLQotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IExvY2FsaXplICJhaW0iIHZhcmlhYmxlLiAgSWYKLQlESUZGX0VYUFJfT0ssIGRvbid0IGltcG9zZSBjaGVja3Mgb24gc3ltYm9sIHNlZ21lbnQgdHlwZXMuCi0JKGZpeHVwX3NlZ21lbnQpIFtESUZGX0VYUFJfT0tdOiBJZiBzdWJfc3ltYm9sUCBpcyBpbiB0aGUgY3VycmVudAotCXNlZ21lbnQsIGNvbnZlcnQgdG8gYSBQQy1yZWxhdGl2ZSBmaXh1cCBhbmQgZGlzY2FyZCB0aGUgc3ltYm9sLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChmbGFnX3dhbnRfcGljKTogTmV3IHZhcmlhYmxlLCBtb3N0bHkgaWdub3JlZC4KLQkobWRfcGFyc2Vfb3B0aW9uKSBbVEVfU1VOM106IFNldCBpdCBmb3IgIi1rIi4KLQkobTY4a19pcCk6IEdlbmVyYXRlIHByb3BlciBmaXh1cCBmb3IgbW9kZSA3LjMuCi0JKiBjb25maWcvdGMtbTY4ay5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUuCi0KLVNhdCBTZXAgMjUgMDU6MDg6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19pbmNhbnQsIGdldG9uZSwgZ2V0dHdvKTogTW92ZWQKLQllYXJsaWVyIGluIHRoZSBmaWxlLgotCShpbnNvcCwgYWRkX2V4cCk6IE5vdyBkZWZpbmVkIGFzIGZ1bmN0aW9ucywgZm9yIHJlYWRhYmlsaXR5LgotCShpbnNvcCk6IE5vdyB0YWtlcyB0d28gYXJndW1lbnRzOyBjYWxsZXJzIGNoYW5nZWQuCi0KLUZyaSBTZXAgMjQgMTI6Mzc6NTkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTg4ay5jIChnZXRfbzYpOiBuZXcgZnVuY3Rpb24uCi0JICAoZ2V0X2JmLCBnZXRfY21wLCBnZXRfY25kLCBnZXRfY3IsIGdldF9mY3IsIGdldF9pbW0xNiwgZ2V0X3JlZywKLQkgIGdldF92ZWM5LCBnZXR2YWwsIGdldF9wY3IsIGNhbGNvcCwgbWF0Y2hfbmFtZSk6IG1ha2Ugc3RhdGljIGFuZAotCSAgcHJvdG90eXBlLgotCSAgKHNfZmlsZSk6IHJlbW92ZSBleHRyYW5lb3VzIGZvcndhcmQgZGVjbC4KLQkgIChtZF9iZWdpbik6IGFkZCBjb25zdCB0byByZXR2YWwgZGVjbC4KLQkgIChjYWxjb3ApOiBjb3BlIHdpdGggaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYXJndW1lbnRzLiAgSGFuZGxlICdvJwotCSAgdHlwZSBhcmd1bWVudCwgdGhlIG82IGZpZWxkIG9mIHRoZSBwcm90IGluc24uCi0JICAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiByZXR1cm4gYSBkdW1teSB2YWx1ZS4KLQotCSogY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IGNvbW1lbnQgY2hhbmdlOyBvNiBmaWVsZCBpcwotCSAgaW4gYml0cyAxMCB0aHJvdWdoIDcuICBmbHQuW2R4c11zIHJlcXVpcmVzIGFuIHIgcmVnaXN0ZXIgaW4gdGhlCi0JICBzZWNvbmQgYXJndW1lbnQuICBOZXcgaW5zdHJ1Y3Rpb24gbGRhLnguICBOZXcgaW5zdHJ1Y3Rpb24gbXVscwotCSAgKGFsaWFzIGZvciBtdWwpLgotCi1GcmkgU2VwIDI0IDEzOjQzOjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlY3Vyc2UgbGlrZSBjbGVhbi4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBTZXQgQkZEIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotCWJhc2VkIG9uIE1JUFMgSVNBIGxldmVsLgotCi1UaHUgU2VwIDIzIDE3OjU4OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAobWFpbik6ICJleGhhdXN0ZWQiLCBub3QgImV4aHVhc3RlZCIuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogQWRkIHN5X3VzZWRfaW5fcmVsb2MgZmllbGQuCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNldCBzeV91c2VkX2luX3JlbG9jLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IE5ldmVyIHN0cmlwIHN5bWJvbHMgd2l0aCBzeV91c2VkX2luX3JlbG9jCi0Jc2V0LgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBSZXdyb3RlIHRvIGhhbmRsZSBib3RoCi0JU29sYXJpcyBhbmQgU1ZSNCBzdHlsZSAuc2VjdGlvbiBwc2V1ZG8tb3BzLgotCShvYmpfZWxmX2lkZW50KTogU2V0IFNFQ19SRUFET05MWSBmb3IgLmNvbW1lbnQgc2VjdGlvbi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJZiB0aGlzIGlzIEVMRiwgYW5kIHdlJ3JlCi0JZ2VuZXJhdGluZyBhIHJlbG9jLCBkb24ndCBhcHBseSBhIGZpeC4KLQotVGh1IFNlcCAyMyAxMzoxNjo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChyZWxheF9hbGlnbik6IE5vdyBzdGF0aWMuCi0KLU1vbiBTZXAgMjAgMTk6MjM6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBNYWtlIG5vbi1zdGF0aWMuICBNYWtlCi0JYXJndW1lbnRzIGNvbnN0LiAgRG9uJ3QgYWxpZ24gc3RyaW5ncyB0byA0IGJ5dGUgYm91bmRhcmllcy4KLQkqIHJlYWQuaDogRGVjbGFyZSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogU2V0IFNFQ19BTExPQyBhcyB3ZWxsIGFzCi0JU0VDX0xPQUQgZm9yIHByb2diaXRzIHNlY3Rpb24uCi0JKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogY29uZmlnL29iai1lbGYuaCAoSU5JVF9TVEFCX1NFQ1RJT04pOiBDYWxsCi0Jb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbi4KLQkoT0JKX1BST0NFU1NfU1RBQik6IFJlbW92ZWQgZGVmaW5pdGlvbi4KLQotRnJpIFNlcCAxNyAxODoxMjozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfR0VUX1NJWkUpOiBEZWZpbmUuCi0JKG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobGluZV9jb21tZW50X2NoYXJzKTogSW5pdGlhbGl6ZSBpbiBhbGwgY2FzZXMuCi0KLVRodSBTZXAgMTYgMTQ6MjM6MDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0Yy5oOiBEZWNsYXJlIHRjX2dlbl9yZWxvYyBkaWZmZXJlbnRseSBkZXBlbmRpbmcgdXBvbgotCVJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IE9ubHkgc2V0IGZsYWdzIHdoZW4gZmlyc3QKLQljcmVhdGluZyB0aGUgc2VjdGlvbi4KLQotV2VkIFNlcCAxNSAxMjoxNTo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBhIHRyYXAgaW5zdHJ1Y3Rpb24KLQl3aXRoIGEgYnJhbmNoLgotCi1UdWUgU2VwIDE0IDEzOjMxOjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9kYXRhLCBvYmpfZWxmX3RleHQpOiBOZXcgZnVuY3Rpb25zOwotCXNldCBwcmV2aW91c19zZWN0aW9uIGFuZCBwcmV2aW91c19zdWJzZWN0aW9uIGFuZCB0aGVuIGNhbGwgc19kYXRhCi0JYW5kIHNfdGV4dCwgcmVzcGVjdGl2ZWx5LgotCShvYmpfcHNldWRvX3RhYmxlKTogQWRkIGRhdGEgYW5kIHRleHQuCi0JKG9ial9lbGZfc2VjdGlvbik6IEFkZCBTRUNfTE9BRCB0byBkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mCi0JZmxhZ3MuICBUcmVhdCAucm9kYXRhMSBsaWtlIC5yb2RhdGEuICBTZXQgU0VDX0xPQUQgYXMgd2VsbCBhcwotCVNFQ19BTExPQyBmb3IgImFsbG9jIiBzdHJpbmcuICBEb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZpbmQgdGhlCi0Jc2VjdGlvbjsganVzdCB1c2Ugc3Vic2VnX25ldy4KLQotCSogcmVhZC5jIChjaGFuZ2VfdG9fc2VjdGlvbik6IFJlbW92ZWQuICBUaGlzIGlzIG5vdyBkb25lIGJ5Ci0Jc3Vic2VnX25ldy4KLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFJlYXJyYW5nZWQgc29tZXdoYXQuICBDcmVhdGUgdGhlIHNlY3Rpb24KLQl1c2luZyBzdWJzZWdfbmV3LiAgU3RvcmUgdGhlIHN0cmluZyBpbmRleCBpbiBzZWdfaW5mbywgcmF0aGVyIHRoYW4KLQlpbiBhIHN0YXRpYyB2YXJpYWJsZS4gIEZvcmNlIHRoZSBmaXJzdCBzdHJpbmcgdG8gYmUgZW1wdHkuICBVc2UKLQlmcmFnX21vcmUgcmF0aGVyIHRoYW4gRlJBR19BUFBFTkRfMV9DSEFSLgotCShzX3N0YWJfZ2VuZXJpYyk6IFJld3JvdGUuCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWRkZWQgc3RhYnUgdW5pb24uCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBJbml0aWFsaXplIHN0YWJfc3RyaW5nX3NpemUgdG8gMC4KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBEb24ndCBpbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KLQkob2JqX2FvdXRfc3RhYiwgb2JqX2FvdXRfZGVzYyk6IFJlbW92ZWQuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRlc2MgYW5kIHN0YWJYIGVudHJpZXMuCi0JKiBjb25maWcvb2JqLWJvdXQuYzogU2FtZSBjaGFuZ2VzIGFzIGNvbmZpZy9vYmotYW91dC5jLgotCSogY29uZmlnL29iai1ib3V0LmggKFNfU0VUX1RZUEUpOiBEZWZpbmUuCi0JKHRjX2JvdXRfZml4X3RvX2NoYXJzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zdGFiKTogUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZGVzYyBhbmQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGN1cnJlbnRfc3RhYl9zeW1ib2wpOiBSZW1vdmVkLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKG9ial9zeW1ib2xfdHlwZSk6IFJlbW92ZWQgbl9zdHJ4LCBuX3R5cGUsCi0Jbl9vdGhlciwgbl9kZXNjIGFuZCBuX3ZhbHVlIGZpZWxkcy4KLQkoU197UyxHfUVUX3tPRkZTRVQsT1RIRVIsVFlQRSxERVNDfSk6IFJlbW92ZWQuCi0JKE1BS0VfU1RBQl9TWU1CT0wpOiBSZW1vdmVkLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfZWNvZmZfc3RhYik6IFJlbmFtZWQgdG8gZWNvZmZfc3RhYi4KLQlDaGFuZ2VkIGFyZ3VtZW50cyBhbmQgcmVtb3ZlZCBwYXJzaW5nIGNvZGUuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIHN0YWJYIGVudHJpZXMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKGVjb2ZmX3N0YWIpOiBEZWNsYXJlLgotCShPQkpfUFJPQ0VTU19TVEFCKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuYzogRG9uJ3QgaW5jbHVkZSBhb3V0L3N0YWJfZ251LmguCi0JKG9ial9lbGZfc3RhYiwgb2JqX2VsZl94c3RhYiwgb2JqX2VsZl9kZXNjLAotCWVsZl9zdGFiX3N5bWJvbF9zdHJpbmcsIGVsZl9zdGFiX3N5bWJvbCwgb2JqX2VsZl9zdGFiX2dlbmVyaWMpOgotCVJlbW92ZWQuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRlc2MsIHN0YWJYIGFuZCB4c3RhYnMgZW50cmllcy4KLQkob2JqX2VsZl92ZXJzaW9uKTogVXNlIHN1YnNlZ19uZXcsIG5vdCBiZmRfbWFrZV9zZWN0aW9uLiAgRG9uJ3QKLQlzZXQgU0VDX0xPQUQgZm9yIC5ub3RlIHNlY3Rpb24uCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogR2V0IGZyYWcgcG9pbnRlciBmcm9tIHNlZ19pbmZvLCByYXRoZXIKLQl0aGFuIGxvb2tpbmcgdGhyb3VnaCBmcmFncy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfe1MsR31FVF97T1RIRVIsVFlQRSxERVNDfSk6IFJlbW92ZWQuCi0JKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMsIElOSVRfU1RBQl9TRUNUSU9OLCBPQkpfUFJPQ0VTU19TVEFCKToKLQlEZWZpbmUuCi0JKiBjb25maWcvb2JqLXZtcy5jIChvYmpfYW91dF9zdGFiKTogUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotdm1zLmggKFNfU0VUX1RZUEUpOiBEZWZpbmUuCi0KLQkqIGFzLmg6IERlY2xhcmUgbGlzdGluZy4KLQkqIHJlYWQuYzogRG9uJ3QgZGVjbGFyZSBsaXN0aW5nLgotCShlbWl0X2V4cHIpOiBDYXN0IGZpeF9uZXdfZXhwIGFyZ3VtZW50LgotCShwYXJzZV9iaXRmaWVsZF9jb25zKTogQ29ycmVjdCBwcmludGYgZm9ybWF0LgotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkqIHdyaXRlLmg6IERlY2xhcmUgdGV4dF9sYXN0X2ZyYWcgYW5kIGRhdGFfbGFzdF9mcmFnLgotCSogY29uZmlnL29iai1ib3V0LmMgKG9ial9ib3V0X2xpbmUpOiBBZGRlZCBkdW1teSBhcmd1bWVudC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBBZGQgc29tZSBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk5NjAuYzogTGlrZXdpc2UuICBBbHNvIGZ1bGx5IGJyYWNrZXQgc3RydWN0dXJlCi0JaW5pdGlhbGl6YXRpb25zLCBmaXggcHJpbnRmIGZvcm1hdHMsIGFuZCByZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotTW9uIFNlcCAxMyAxNjo0ODozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19kZXNjKTogT25seSBjb21waWxlIGFuZCB1c2UgaWYgU19TRVRfREVTQyBpcyBkZWZpbmVkLgotCSogc3RydWMtc3ltYm9sLmg6IERlY2xhcmUgdmVyaWZ5X3N5bWJvbF9jaGFpbiBhbmQKLQl2ZXJpZnlfc3ltYm9sX2NoYWluXzIgZXZlbiBpZiBub3QgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUy4KLQkqIHN5bWJvbHMuYyAodmVyaWZ5X3N5bWJvbF9jaGFpbik6IFJlbW92ZWQgdXNlbGVzcyBleHByZXNzaW9uLgotCSogd3JpdGUuYyAoaGVhZGVycywgdGhlX29iamVjdF9maWxlKTogT25seSB1c2UgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUiBhbmQgbm90IEJGRC4KLQkoZml4dXBfc2VnbWVudCwgY3ZzX2ZyYWdfdG9fZmlsbCk6IE9ubHkgdXNlIGlmIEJGRF9BU1NFTUJMRVIgb3IKLQlub3QgQkZELgotCShtZXJnZV9kYXRhX2ludG9fdGV4dCk6IE9ubHkgdXNlIGlmIEJGRF9BU1NFTUJMRVIgb3IgKG5vdCBCRkQgYW5kCi0Jbm90IE9CSl9BT1VUKS4KLQkqIHdyaXRlLmg6IERlY2xhcmUgcmVsYXhfc2VnbWVudC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChzdGFja19wb3AsIHN0YWNrX3B1c2gsIHN0YWNrX2luaXQpOiBNYWRlCi0Jc3RhdGljLgotCShzdGFja190b3ApOiBDb21tZW50ZWQgb3V0LCBzaW5jZSBpdCdzIG5vdCB1c2VkLgotCUZpeGVkIHVwIHBzZXVkby1vcCBmdW5jdGlvbnMgdG8gdGFrZSBhbiBpZ25vcmVkIGludCBhcmd1bWVudC4KLQkoc2l6ZV9zZWN0aW9uKTogQWRkZWQgZGVmYXVsdCBCQURfQ0FTRSB0byBzd2l0Y2guCi0JQ2hhbmdlZCBiemVybyBjYWxscyB0byBtZW1zZXQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoU19JU19MT0NBTCk6IENhbGwgc3RyY2hyIG9uIFNfR0VUX05BTUUKLQkocyksIG5vdCBvbiBzIGl0c2VsZi4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKHNfdXNlKTogVGFrZSBpZ25vcmVkIGludCBhcmd1bWVudC4gIE9ubHkKLQlkZWZpbmUgaWYgT0JKX0NPRkYgaXMgbm90IGRlZmluZWQuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiAoZml0c19pbl9zaWduZWRfYnl0ZSwgc21hbGxlc3RfaW1tX3R5cGUpOiBNYWtlCi0JYXJndW1lbnQgc2lnbmVkIGFnYWluLgotCSogY29uZmlnL3RjLW02OGsuYyAoc19ic3MsIHNfZXZlbiwgc19wcm9jKTogVGFrZSBpZ25vcmVkIGludAotCWFyZ3VtZW50LgotCShtNjhrX2lwKTogRnVsbHkgYnJhY2tldCBpbml0aWFsaXphdGlvbiBvZiBhcmNocy4KLQlDb3JyZWN0IHNldmVyYWwgZm9ybWF0cyBmb3IgX19MSU5FX18gdG8gYmUgJWQgcmF0aGVyIHRoYW4gJXMuCi0JKGluaXRfdGFibGUpOiBGdWxseSBicmFja2V0IGluaXRpYWxpemF0aW9uLgotCUNhc3QgdmFsdWVzIGxhcmdlciB0aGFuIDB4N2YgYXNzaWduZWQgdG8gZnJfb3Bjb2RlIHRvIGNoYXIuCi0KLQkqIHN1YnNlZ3MuYzogUmVuYW1lZCBub24tQkZEX0FTU0VNQkxFUiBzdWJzZWdfbmV3IHRvIHN1YnNlZ19zZXQuCi0JV3JvdGUgbm9uLUJGRF9BU1NFTUJMRVIgc3Vic2VnX25ldy4gIE5vdyBzdWJzZWdfbmV3IGFsd2F5cyB0YWtlcyBhCi0Jc2VjdGlvbiBuYW1lLCBhbmQgc3Vic2VnX3NldCBhbHdheXMgdGFrZXMgYSBzZWdULiAgQ2hhbmdlZCBhbGwKLQljYWxsZXJzIGFzIGFwcHJvcHJpYXRlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgIChjaGFuZ2VfdG9fc2VjdGlvbik6IFJlbmFtZWQgdG8KLQlvYmpfY29mZl9hZGRfc2VnbWVudC4gIENvcnJlY3RlZC4gIE1hZGUgY2FsbGVycyB1c2Ugc3Vic2VnX25ldy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChvYmpfc2VnbWVudF9uYW1lLCBvYmpfYWRkX3NlZ21lbnQpOgotCURlZmluZS4KLQotTW9uIFNlcCAxMyAxMzoxNTowMyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpOiBSZW1vdmUgdGVzdCBmb3IgbmFtZVswXSA9PSAnTCcuCi0KLUZyaSBTZXAgMTAgMTE6MjI6MDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5oIChTX1NFVF9TSVpFKTogQWN0dWFsbHkgc2V0IHRoZSBzaXplLgotCi0JR2NjIGxpbnQuCi0JKiBBZGRlZCBhIG51bWJlciBvZiBjYXN0cyB0byBmdW5jdGlvbiBjYWxscy4KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbiksIGFzLmMgKG1haW4pLCBleHByLmMgKGludGVnZXJfY29uc3RhbnQsCi0Jb3BlcmFuZCwgZXhwciksIHJlYWQuYyAocmVhZF9iZWdpbiwgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZLAotCXJlYWRfYV9zb3VyY2VfZmlsZSwgc19hbGlnbl9ieXRlcywgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSwKLQlpZ25vcmVfcmVzdF9vZl9saW5lLCBiaWdfY29ucywgaXNfaXRfZW5kX29mX3N0YXRlbWVudCwgc19pZ25vcmUpLAotCXJlYWQuaCAoaXNfbmFtZV9iZWdpbm5lciwgaXNfcGFydF9vZl9uYW1lKSwgY29uZmlnL29iai1lbGYuYwotCShvYmpfZWxmX3NlY3Rpb24pLCBjb25maWcvdGMtaTM4Ni5jIChwYXJzZV9yZWdpc3RlciksCi0JY29uZmlnL3RjLXNwYXJjLmMgKGlzb2N0YWwsIHNfcHJvYyk6IENhc3QgY2hhcgotCWFycmF5IGluZGljZXMgdG8gdW5zaWduZWQgY2hhci4KLQkqIGFwcC5jIChwcm9jZXNzX2VzY2FwZSk6IE1ha2Ugc3RhdGljLiAgQWRkIHByb3RvdHlwZS4gIENoYW5nZQotCWFyZ3VtZW50IGZyb20gY2hhciB0byBpbnQuCi0JKiBhcy5jOiBJbmNsdWRlIG91dHB1dC1maWxlLmggZm9yIHByb3RvdHlwZXMuICBDb21tZW50IG91dCB1bnVzZWQKLQlmdW5jdGlvbiBnb3Rfc2lnLgotCSogTWFrZWZpbGUuaW4gKGFzLm8pOiBEZXBlbmQgb24gb3V0cHV0LWZpbGUuaC4KLQkqIGFzLmggKEJBRF9DQVNFKTogQ2FzdCB2YWwgYXJndW1lbnQgdG8gbG9uZywgYW5kIHVzZSAlbGQuCi0JKHBzZXVkb190eXBlUyk6IEFkZCBwcm90b3R5cGUgdG8gcG9jX2hhbmRsZXIgZmllbGQuCi0JKHByaW50X3ZlcnNpb25faWQpOiBBZGQgcHJvdG90eXBlLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IENoYW5nZSBzaXplIGFyZ3VtZW50cyB0byB1bnNpZ25lZCBsb25nLgotCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBBZGQgcHJvdG90eXBlcyBmb3IgZnVuY3Rpb24gYXJndW1lbnRzLgotCShoYWRfZXJyb3JzLCBoYWRfd2FybmluZ3MsIHNjcnViX2Zyb21fZmlsZSk6IFJlbW92ZSBkdXBsaWNhdGUKLQlkZWNsYXJhdGlvbnMuCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogTWFrZSBzaXplIHZhcmlhYmxlcyB1bnNpZ25lZC4KLQkqIGNvbmQuYyAoaWdub3JlX2lucHV0KTogUmVtb3ZlZCB1bnVzZWQgbG9jYWwgdmFyaWFibGUgcHRyLgotCSogZXhwci5jIChmbG9hdGluZ19jb25zdGFudCwgaW50ZWdlcl9jb25zdGFudCk6IE1ha2Ugc3RhdGljLiAgQWRkCi0JcHJvdG90eXBlcy4KLQkqIGZsb251bS1jb3B5LmMgKGZsb251bV9jb3B5KTogTWFrZSBzaXplIHZhcmlhYmxlcyB1bnNpZ25lZC4KLQkqIGZyYWdzLmg6IEFkZCBwcm90b3R5cGUgZm9yIGZyYWdfaW5pdC4KLQkqIGhhc2guaCwgaGFzaC5jOiBDaGFuZ2UgaGFzaCB2YWx1ZXMgZnJvbSBjaGFyICogdG8gUFRSLCBtYWtlIGhhc2gKLQlzdHJpbmdzIGNvbnN0LCBtYWtlIHJldHVybmVkIGVycm9yIHN0cmluZ3MgY29uc3QgY2hhciAqLiAgQWRkZWQKLQlwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMuCi0JKiBpbnB1dC1maWxlLmgsIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSk6IFJldHVybgotCXVuc2lnbmVkIGludC4KLQkqIGlucHV0LXNjcnViLmMgKGJ1ZmZlcl9sZW5ndGgpOiBNYWtlIHVuc2lnbmVkLgotCShpbnB1dF9zY3J1Yl9wdXNoLCBpbnB1dF9zY3J1Yl9wb3ApOiBNYWtlIHN0YXRpYy4KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBDYXN0IHNwcmludGYgYXJndW1lbnQgdG8gdW5zaWduZWQKLQlsb25nIGFuZCB1c2UgJWx4LiAgUHJpbnQgbmFtZSBvZiBzZWdtZW50IHJhdGhlciB0aGFuIGFkZHJlc3Mgb2YKLQlzdHJ1Y3R1cmUuCi0JKGxpc3RpbmdfbGlzdCwgbGlzdGluZ190aXRsZSk6IENoYW5nZSBhcmd1bWVudCB0byBpbnQuCi0JKGxpc3RpbmdfZWplY3QsIGxpc3RpbmdfZmxhZ3MsIGxpc3RpbmdfcHNpemUpOiBBZGQgaW50IGFyZ3VtZW50LgotCSogbGlzdGluZy5oOiBDb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uIGNoYW5nZXMuCi0JKiBvYmouaCAob2JqX2VtaXRfc3ltYm9scyk6IFJlbmFtZSBwcm90b3R5cGUgYXJndW1lbnQgdG8gYXZvaWQKLQlzaGFkb3dpbmcuCi0JKiByZWFkLmg6IENoYW5nZSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiBwcm90b3R5cGUgdG8gcmV0dXJuCi0Jb2Zmc2V0VC4gIEFkZCBwcm90b3R5cGUgZm9yIG5leHRfY2hhcl9vZl9zdHJpbmcuICBWYXJpb3VzCi0JcHJvdG90eXBlIGNoYW5nZXMuCi0JKiByZWFkLmM6IFJlbW92ZSBwcm90b3R5cGUgZm9yIG5leHRfY2hhcl9vZl9zdHJpbmcuCi0JKHBvYmVnaW4pOiBNYWtlIGVycnR4dCBjb25zdC4gIE1ha2UgbmV3X2xlbmd0aCwgdG1wX2xlbiBhbmQgbnVtCi0JdW5zaWduZWQuCi0JKHNfYWJvcnQsIHNfYWxpZ25fcHR3bywgc19jb21tLCBzX2RhdGEsIHNfYXBwX2xpbmUsIHNfZmlsbCwKLQlzX2dsb2JsLCBzX2xzeW0sIHNfb3JnLCBzX3NldCwgc190ZXh0LCBzX2Rlc2MpOiBBZGQgaW50IGFyZ3VtZW50LgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoc19jb21tKTogQ2hhbmdlIHRlbXAgZnJvbSB2YWx1ZVQgdG8gb2Zmc2V0VC4gIENhc3QgdG8gbG9uZyB3aGVuCi0JcHJpbnRpbmcgYW5kIHVzZSAlbGQgKG9ubHkgZm9yIGVycm9yIG1lc3NhZ2VzIGFueWhvdykuCi0JKHNfbG9uZywgc19pbnQpOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9ucy4KLQkoY29ucyk6IENoYW5nZSBhcmd1bWVudCB0byBpbnQuCi0JKGVtaXRfZXhwcik6IFVzZSAlbHggd2hlbiBwcmludGluZyBsb25ncy4KLQkoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBSZXR1cm4gb2Zmc2V0VCwgbm90IGxvbmcuCi0JKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBDb21tZW50IG91dCB1bmxlc3MKLQlTRVBBUkFURV9TVEFCX1NFQ1RJT05TLgotCShzX3N0YWJfZ2VuZXJpYyk6IFJlbW92ZSB1bnVzZWQgb2Zmc2V0LiAgRGVmaW5lIHNlZ19pc19uZXcgb25seQotCWlmIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMuICBVc2UgdG9QIG9ubHkgaW4gbG9jYWwgYmxvY2suCi0JKiBzdHJ1Yy1zeW1ib2wuaCAodmVyaWZ5X3N5bWJvbF9jaGFpbl8yKTogQWRkIHByb3RvdHlwZS4KLQkqIHN5bWJvbHMuYzogUmVtb3ZlIG5lc3RlZCBjb21tZW50LgotCShzeW1ib2xfbmV3KTogUmVuYW1lIHZhbHVlIHRvIHZhbHUuCi0JKGNvbG9uKTogVXNlICVsZCBhbmQgY2FzdCB0byBsb25nIGluIGVycm9yIG1lc3NhZ2UuCi0JKiBzeW1ib2xzLmg6IFJlbW92ZSBkdXBsaWNhdGUgdmVyaWZ5X3N5bWJvbF9jaGFpbiBkZWNsYXJhdGlvbi4KLQkqIHRjLmg6IFJlbW92ZSB1bnVzZWQgbWRfZW1pdF9yZWxvY2F0aW9ucyBkZWNsYXJhdGlvbi4KLQkodGNfZ2VuX3JlbG9jKTogQWRkIGRlY2xhcmF0aW9uLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IENoYW5nZSBmaXJzdCBhcmd1bWVudCBuYW1lIGRlcGVuZGluZwotCW9uIEJGRF9BU1NFTUJMRVIuCi0JKHdyaXRlX3JlbG9jcyk6IFJlbW92ZSB1bnVzZWQgb2Zmc2V0LCBmcmFncy4gIFJlbW92ZSB0Y19nZW5fcmVsb2MKLQlkZWNsYXJhdGlvbnMuICBNYWtlIG4gdW5zaWduZWQuCi0JKHdyaXRlX2NvbnRlbnRzKTogUmVtb3ZlIHVudXNlZCBpLCBuLCByZWxvY3MsIGZpeHAuICBSZW5hbWUgZnJhZ3MKLQl0byBmIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEZWZpbmUgZnJhZ1Agb25seSBpZiBub3QgQkZEX0FTU0VNQkxFUiBvciBub3QKLQlXT1JLSU5HX0RPVF9XT1JELiAgUmVtb3ZlIHVudXNlZCBrZWVwLiAgT25seSBkZWNsYXJlIHB1bnQgYW5kCi0JcHVudF9pdCBpZiB0aGV5IHdpbGwgYmUgdXNlZC4gIE1ha2UgaSBhbmQgbiB1bnNpZ25lZC4KLQkoZml4dXBfc2VnbWVudCk6IENhc3QgdG8gbG9uZyBhbmQgdXNlICVsZCBpbiBlcnJvciBtZXNzYWdlLgotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IE1ha2Ugc2l6ZSBhcmd1bWVudCB1bnNpZ25lZC4KLQkqIGNvbmZpZy9vYmotYW91dC5oOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQuICBBZGQgcHJvdG90eXBlIGZvcgotCW9ial9hb3V0X2Zyb2Jfc3ltYm9sLgotCShvYmpfYW91dF9saW5lLCBvYmpfYW91dF9kZXNjKTogQWRkIGludCBhcmd1bWVudC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogQ2hhbmdlZCBidWlsZCByb3V0aW5lcyB0byB1c2UgYW4gdW5zaWduZWQKLQlvZmZzZXQuCi0JKGFkZF9zdHJpbmcpOiBNYWtlIGxlbiB1bnNpZ25lZCBsb25nLgotCShvYmpfZWNvZmZfc3RhYik6IFVzZSAlbHUgaW4gZXJyb3IgbWVzc2FnZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogQ29tbWVudCBvdXQgdW51c2VkIGxhYmVsCi0JYWxsb2NhdGVfYnNzLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogUmV0dXJuIDAgKGN1cnJlbnRseSBicm9rZW4pLgotCShvYmpfZWxmX2Rlc2MsIG9ial9lbGZfdmVyc2lvbiwgb2JqX2VsZl9zaXplLCBvYmpfZWxmX3R5cGUsCi0Jb2JqX2VsZl9pZGVudCwgb2JqX2VsZl93ZWFrLCBvYmpfZWxmX2xvY2FsLCBvYmpfZWxmX2NvbW1vbiwKLQlvYmpfZWxmX2xpbmUsIG9ial9lbGZfcHJldmlvdXMpOiBBZGQgaW50IGFyZ3VtZW50LgotCShvYmpfZWxmX3dyaXRlX3N5bWJvbF9wKTogTWFrZSBzdGF0aWMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3dyaXRlX3N5bWJvbCk6IEFkZCBwcm90b3R5cGUuCi0JKiBjb25maWcvdGMtaHBwYS5oOiBSZW1vdmUgZGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbgotCXJlYWQuaC4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKEVOQ09ERV9SRUxBWF9TVEFURSk6IENhc3QgdG8gcmVsYXhfc3Vic3RhdGVULgotCShzX2Jzcyk6IEFkZCBpbnQgYXJndW1lbnQuCi0JKGZpdHNfaW5fc2lnbmVkX2J5dGUsIHNtYWxsZXN0X2ltbV90eXBlKTogTWFrZSBhcmd1bWVudCB1bnNpZ25lZC4KLQkoZHVtbXkpOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFJlbmFtZSBsb2NhbCBvIHRvIG9wIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkodGNfZ2VuX3JlbG9jKTogUmVuYW1lIGxvY2FsIHJlbG9jIHRvIHJlbCB0byBhdm9pZCBzaGFkb3dpbmcuCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2RhdGExLCBzX2RhdGEyKTogQWRkIGludCBhcmd1bWVudC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsIG1kX2FwcGx5X2ZpeCk6IENhc3QgdG8gbG9uZyBhbmQgdXNlCi0JJWxkIGluIGVycm9yIG1lc3NhZ2VzLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IFJlbW92ZSBkdXBsaWNhdGUgZGVjbGFyYXRpb25zLgotCShnZXRFeHByZXNzaW9uKTogUmV3cml0ZSBjb25kaXRpb24gdG8gYXZvaWQgZW1wdHkgY29uZGl0aW9uYWwKLQlib2R5LgotCShzX3JlZywgc19wcm9jLCBzX3Jlc2VydmUsIHNfY29tbW9uLCBzX3NlZywgc194d29yZCk6IEFkZCBpbnQKLQlhcmd1bWVudC4KLQotVGh1IFNlcCAgOSAxNzoxMDowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXc6Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2Fzc2VtYmxlKTogRml4IHR5cG8uCi0JKHBhX2lwKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGxhYmVscy4gIERvIG5vdCBjaGVjayBmb3IKLQl1bnNpZ25lZCB2YWx1ZXMgYmVpbmcgPCAwLCBpdCBjYW4ndCBoYXBwZW4uCi0JKGlzX3NhbWVfZnJhZyk6IFJldHVybiBhIHZhbHVlIGluIHJlY3Vyc2l2ZSBjYWxsIGNhc2UuCi0JKHBhX2NhbGxpbmZvKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGxhYmVscy4KLQkocGFfY29tbSk6IExpa2V3aXNlLgotCShwYV9jb3B5cmlnaHQpOiBMaWtld2lzZS4KLQkocGFfZXhwb3J0KTogTGlrZXdpc2UuCi0JKHBhX2ltcG9ydCk6IExpa2V3aXNlLgotCShwYV9wYXJhbSk6IExpa2V3aXNlLgotCShwYV9zcGFjZSk6IExpa2V3aXNlLgotCShwYV9zdWJzcGFjZSk6IExpa2V3aXNlLgotCi1UaHUgU2VwICA5IDE1OjA1OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LCBzX3N0YWJfZ2VuZXJpYyk6IElmCi0JQkZEX0FTU0VNQkxFUiwgY2FsbCBzdWJzZWdfc2V0IHJhdGhlciB0aGFuIHN1YnNlZ19uZXcuCi0KLVdlZCBTZXAgIDggMTU6MDk6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgU0VDX0xPQUQgd2hlbiB1c2luZwotCWRlZmF1bHQgZmxhZyB2YWx1ZXMuCi0KLVR1ZSBTZXAgIDcgMTA6MjI6NTIgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiByZWFkLmM6IChjaGFuZ2VfdG9fc2VjdGlvbik6IERvbid0IGluY2x1ZGUgYm9keSBpZiBub3QgTUFOWV9TRUNUSU9OUy4KLQotCSogcmVhZC5jOiAoc19zdGFiLCBzX3hzdGFiLCBzX2Rlc2MpOiBOZXcgZnVuY3Rpb25zIHRvIHBhcnNlCi0JdmFyaW91cyBzdGFiLXJlbGF0ZWQgZGlyZWN0aXZlcy4KLQkqIHJlYWQuaDogKHNfc3RhYiwgc194c3RhYiwgc19kZXNjKTogTmV3IGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiB3cml0ZS5jOiAobWVyZ2VfZGF0YV9pbnRvX3RleHQpOiBGaXggaWZkZWYgdGFuZ2xlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGN1cnJlbnRfc3RhYl9zeW1ib2wpOiBGYWtlIHN5bWJvbAotCWZvciBzdGFiIHJlYWRlciB0byB1c2UuCi0JKiBjb25maWcvb2JqLWNvZmZiZmRoLmggKG9ial9zeW1ib2xfdHlwZSk6IEFkZGVkIGZpZWxkcyBmb3IKLQlzdGFiIHJlYWRlciwgbWFjcm9zIHRvIGFjY2Vzcy4KLQotRnJpIFNlcCAgMyAxNjo0NDowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9zeW1ib2wpOiBObyBsb25nZXIgc3BlY2lhbC1jYXNlZCBvbgotCXNwYXJjdjksIHNpbmNlIGVsZl9zeW1ib2xfdHlwZSBpcyBub3cgaW5kZXBlbmRlbnQgb2Ygc2l6ZS4KLQotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3N5bWJvbCk6IEZpeGVkIG5hbWUgb2YgZWxmX3N5bWJvbF90eXBlLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChzdHJ1Y3QgZGVmYXVsdF9zdWJzcGFjZV9kaWN0LCBzdHJ1Y3QKLQlkZWZhdWx0X3NwYWNlX2RpY3QpOiBGaWVsZCAic29ydCIgaXMgbm93IHVuc2lnbmVkIGNoYXIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMsIHBhX2RlZl9zcGFjZXMpOiBBbGlnbgotCWNvbHVtbnMgZm9yIGVhc2llciByZWFkaW5nLgotCShiY21wLCBpbmRleCk6IERlbGV0ZWQgVVNHLXNwZWNpZmljIGRlZmluaXRpb25zLiAgU2hvdWxkIGJlIGRlYWx0Ci0Jd2l0aCBpbiBoby0qLmgsIG9yIGluIGxpYmliZXJ0eS4gIENoYW5nZWQgbWVudGlvbiBvZiBpbmRleCB0bwotCXN0cmNoci4KLQkobGFiZWxfc3ltYm9sUCwgbGFiZWxfc3ltYm9sX2RlZmluZWQsIGNhbGxpbmZvX2ZvdW5kLAotCXdpdGhpbl9lbnRyeV9leGl0LCBleGl0X3Byb2Nlc3NpbmdfY29tcGxldGUsIHdpdGhpbl9wcm9jZWR1cmUsCi0JcGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3NwYWNlcywgcGFfcHNldWRvX29wX21vdmVzX3BjLAotCWxhYmVsX3N5bWJvbHNfcm9vdFAsIHBhX2dldF9sYWJlbCwgcGFfbGFiZWxfaXNfZGVmaW5lZCwKLQlwYV91bmRlZmluZV9sYWJlbCk6IE5vdyBzdGF0aWMuCi0JKG1vdmVycyk6IE5vdyBjb25zdCwgaW4gYWRkaXRpb24gdG8gcG9pbnRpbmcgdG8gY29uc3QgZGF0YS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGxhYmVsX3N5bWJvbFNfcm9vdFAsIHBhX2dldF9sYWJlbCwKLQlwYV9sYWJlbF9pc19kZWZpbmVkLCBwYV91bmRlZmluZV9sYWJlbCwgcGFfcHNldWRvX29wX21vdmVzX3BjKToKLQlEZWxldGUgZGVjbGFyYXRpb25zLgotCi0JTWVyZ2VkIG1vcmUgY2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlIEhvb2dlbmJvb206Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMsIHBhX2RlZl9zdWJzcGFjZXMpOiBSZW1vdmUKLQllbnRyaWVzIGZvciAuc3RhYiBhbmQgLnN0YWJzdHIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IChlbGZfc3RhYl9zeW1ib2xfc3RyaW5nKTogIFNldCB0aGUKLQlTRUNfTE9BRCBhdHRyaWJ1dGUgZm9yIHRoZSAuc3RhYnN0ciBzZWN0aW9uLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6ICBTZXQgdGhlIFNFQ19MT0FEIGF0dHJpYnV0ZSBmb3IgdGhlCi0JLnN0YWIgc2VjdGlvbi4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiAgQ2hhbmdlICcjaWYgMScgdG8gJyNpZiAwJy4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiAgSW5jb3JyZWN0IGJ5dGUgY291bnQgb24gY2FsbCB0bwotCW1kX251bWJlcl90b19jaGFycyBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19zeW1ib2wpOiBTdGF0aWMgZnVuY3Rpb25zIG5lZWQKLQlhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgdG9vLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdHJpbmdlcik6IENvcnJlY3RseSBoYW5kbGUgZXNjYXBpbmcKLQljaGFyYWN0ZXJzIHdoaWNoIHNob3VsZCBhcHBlYXIgdW5hbHRlcmVkIGluIHRoZSBvdXRwdXQgc3RyaW5nIChmb3IKLQlleGFtcGxlIGFuIGVzY2FwZWQgZG91YmxlLXF1b3RlKS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIpOiBBbHdheXMKLQlpbml0aWFsaXplIG5hbWUuCi0JKHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyKTogTGlrZXdpc2UuCi0JKHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0JKHBhX3BhcnNlX25lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhKTogUmVtb3ZlIHByb3RvdHlwZQotCWZvciBub3cuCi0JKGNvbnNfZml4X25ld19ocHBhKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBGaXggdHlwZSBvZiB2YWxwIHRvIG1hdGNoCi0JcHJvdG90eXBlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBJbmNsdWRlIGxpYmhwcGEuaC4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogRGVsZXRlIGV4dGVybiBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zCi0JZm91bmQgaW4gbGliaHBwYS5oLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zcGFjZSk6IFJld29yayB0byBhdm9pZCB1bndhbnRlZCAjaWZkZWYKLQlPQkpfRUxGIGNvbmRpdGlvbmFscy4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKExPQ0FMX0xBQkVMKTogQ29ycmVjdGx5IGlkZW50aWZ5IGxvY2FsIGxhYmVscwotCW9uIHRoZSBQQS4KLQotVGh1IFNlcCAgMiAxMDo0Mzo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogQWNjZXB0ICd6JywgYW5kIGlnbm9yZSBpdC4KLQkobWFjcm8pOiBVc2UgInoscyx0IiBmb3IgZGl2IGluc3RydWN0aW9ucyB0byBtYXRjaCBjb3JyZXNwb25kaW5nCi0JY2hhbmdlIGluIG9wY29kZSB0YWJsZS4KLQkobWlwc19pcCk6IEFkZGVkICd6Jy0tbXVzdCBiZSB6ZXJvIHJlZ2lzdGVyLgotCi1XZWQgU2VwICAxIDE1OjU2OjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKSBbUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFXTogRGVjbGFyZQotCXRjX2dlbl9yZWxvYyBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICJjYXNlIiBpbnN0ZWFkIG9mICJpZiIgd2hlbiBwb3NzaWJsZS4gIFJld3JvdGUKLQlNYWtlZmlsZSBlZGl0aW5nIHRvIHJlZHVjZSB3b3JrIGRvbmUuICBUcmVhdCAiaHBwYSoiIGFzICJocHBhIi4KLQotV2VkIFNlcCAgMSAxMjoxOTowNyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9zZWN0aW9uKTogYWRkICdkJyBhcyBhbiBhbGlhcyBmb3IKLQkgIHNlY3Rpb24gdHlwZSBvZiBkYXRhLiAgJ2QnIHNlZW1zIHRvIGJlIHVzZWQgZm9yIG04OGsuCi0KLVdlZCBBdWcgMjUgMjI6MzM6MjIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2FsaWduLCBzX3N0cmluZ2VyLCBzX2NvbnMsIHNfZmxvYXRfY29ucywKLQlzX21pcHNfc3BhY2UpOiBTZXQgaW5zbl9sYWJlbCB0byBOVUxMIHRvIGF2b2lkIGNoYW5naW5nIGl0IGF0IHRoZQotCW5leHQgLmFsaWduIHN0YXRlbWVudC4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGphbCB3aXRoIGluc3RydWN0aW9uIHRoYXQgc2V0cyB0aGUKLQlyZWdpc3RlciB0aGF0IGphbCBzZXRzLgotCi1XZWQgQXVnIDI1IDE2OjE1OjU3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTg4MTEwLgotCi1XZWQgQXVnIDI1IDEzOjM3OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gUGV0ZSBIb29nZW5ib29tIGFuZCBKZWZmIExhdyBhdCBVdGFoOgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogU0VDX0FMTE9DIHNob3VsZAotCW5vdCBiZSBvbiBmb3IgLmhwcGFfdW53aW5kLgotCShtZF9wc2V1ZG9fdGFibGUpOiAuUEFSQU0gYW5kIC5wYXJhbSBhcmUgdmFsaWQgcHNldWRvLW9wcyBmb3IgR0FTLgotCShwYV9wYXJhbSk6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUgLlBBUkFNIGRpcmVjdGl2ZXMuCi0JKHBhX2lwKTogUGFzcyAiaXNicmFuY2giIGFyZ3VtZW50IGRvd24gdG8gcGFfcGFyc2VfKl9jb21wbHRyCi0JZnVuY3Rpb25zLiAgSGFuZGxlICd8JyBmb3IgbW92YjsgYWxsb3cgbW92YixuLgotCShwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IERlbGV0ZSBvbGQgdXNlbGVzcwotCXZlcnNpb24uICBIYW5kbGUgY2FzZXMgd2hlcmUgbm8gY29tcGxldGVyIGV4aXN0cyBmb3IKLQljb21iLG4gb3IgYWRkYixuLgotCShwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0cik6IEhhbmRsZSBjYXNlcyB3aGVyZSBubwotCWNvbXBsZXRlciBleGlzdHMgZm9yIGNvbWIsbiBvciBhZGRiLG4uICBNYWtlIGxvZ2ljCi0JbWlycm9yIHRoYXQgb2YgcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIuCi0JKHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0JKHBhX3BhcnNlX25lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0JKiB0Yy1ocHBhLmggKHBhX3BhcmFtKTogRGVjbGFyZS4KLQotVHVlIEF1ZyAyNCAxNTo0MTozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfbWFrZV9zeW1leHRuX3NlY3Rpb24pOiBOb3cgc3RhdGljLgotCUFkZGVkIGZvcndhcmQgZGVjbGFyYXRpb24uCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIFBldGUgSG9vZ2VuYm9vbSBhbmQgSmVmZiBMYXcgYXQgVXRhaDoKLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IEFyZ3VtZW50cyB3ZXJlIGluY29ycmVjdCBvbgotCWNhbGwgdG8gZWxmX3RjX21ha2Vfc2VjdGlvbnMuCi0JKG9ial9lbGZfdmVyc2lvbik6IEEgLm5vdGUgc2VjdGlvbiBzaG91bGRuJ3QgaGF2ZSB0aGUgU0VDX0FMTE9DCi0JYXR0cmlidXRlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBBZGQgc29tZSBwcm9jZXNzaW5nIHRvCi0JaGFuZGxlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2J1aWxkX3N5bWV4dG5fc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSBhIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4KLQkocGFfZXhwb3J0X2FyZ3MpOiBNYWtlIGNhbGwgdG8gcGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uLgotCShocHBhX3RjX3N5bWJvbCwgaHBwYV90Y19tYWtlX3NlY3Rpb25zLAotCWhwcGFfdGNfbWFrZV9zeW1leHRuX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb25zLgotCSogY29uZmlnL3RjLWhwcGEuaDogVXBkYXRlIGVsZl90Y19zeW1ib2wgYW5kIGVsZl90Y19tYWtlX3NlY3Rpb25zCi0JbWFjcm9zLgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFBsYWNlIGNoZWNrIGZvciBUQ19DT05TX0ZJWF9ORVcgaW4gdGhlCi0JQkZEX0FTU0VNQkxFUiBicmFuY2ggYXMgd2VsbC4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogSWYgRUxGIGlzIHRoZSB0YXJnZXQgb2JqZWN0IGZvcm1hdCwgZGVmaW5lCi0Jc29tZSBFTEYtIGFuZCBocHBhLXNwZWNpZmljIHR5cGVzIGFuZCBjb25zdGFudHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGdldEV4cHJlc3Npb24pOiBGaXggYSB0eXBvLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFVzZSBUQ19FUVVBTF9JTl9JTlNOIHRvIGRldGVybWluZQotCWlmIGEgYD0nIGlzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24uCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEhhbmRsZSBjYXNlIHdoZXJlIGVuZC1vZi1saW5lIG1hcmtlcnMgYXJlCi0JYWxzbyB1c2VkIHdpdGhpbiBpbnN0cnVjdGlvbnMuCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19FUVVBTF9JTl9JTlNOLCBUQ19FT0xfSU5fSU5TTik6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4XzEpOiBLZWVwIHJlbG9jYXRpb25zIGZvcgotCW91dC1vZi1yYW5nZSBicmFuY2hlcy8nY2FsbHMgdXNpbmcgImJsIiBvciBjYWxscyB3aGljaCBtYXkgbmVlZAotCWFyZ3VtZW50IHJlbG9jYXRpb24gc3R1YnMuICBEbyBub3QgbmVlZC9rZWVwIHJlbG9jYXRpb25zIGZvcgotCWNvbmRpdGlvbmFsIGJyYW5jaGVzLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRml4IGNhbGN1bGF0aW9uIG9mIGZ1bmN0aW9uIHNpemUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdmVyc2lvbik6IE1hcmsgLm5vdGUgc2VjdGlvbiBhcwotCVJFQURPTkxZLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSk6IFBhc3MgZXhwLCBub3QgdGhlCi0JYWRkcmVzcyBvZiBleHAsIHRvIGV4cHJlc3Npb24uCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFR1cm4gU0VDX0hBU19DT05URU5UUyBmbGFnIG9uLgotCShtZF9hcHBseV9maXhfMSk6IERlbGV0ZSB1bndhbnRlZCBjb21tZW50cy4KLQkocHJvY2Vzc19leGl0KTogU3ltYm9scyBtYXJraW5nIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBhcmUgYWx3YXlzCi0JQlNGX0xPQ0FMLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBJbmNsdWRlIGVsZjMyLWhwcGEuaCBmcm9tIEJGRCB0cmVlLgotCShwYV9zcGFjZSk6IERlY2xhcmUgYW5kIGluaXRpYWxpemUgZ2RiX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBDaGFuZ2UKLQllbGZfdGNfZmluYWxfcHJvY2Vzc2luZ19ob29rIHRvIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBGaXggYXJndW1lbnQgbGlzdCB0byBtYXRjaAotCWFyZ3VtZW50IHR5cGUgZGVjbGFyYXRpb25zLgotCShnZXRFeHByZXNzaW9uKTogRml4IHR5cG8uCi0JKHBhX2V4cG9ydF9hcmdzKTogQ2hhbmdlIGVsZl9zeW1ib2xfdHlwZSB0byBlbGYzMl9zeW1ib2xfdHlwZS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IExpa2V3aXNlLiAgTmFtZSBjaGFuZ2VkIGZyb20KLQllbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nX2hvb2suCi0JKHN0YXJ0X3N5bWJvbF9yb290LCBzdGFydF9zeW1ib2xfbGFzdCk6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTik6IEZpeCB0eXBvLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBSZXBsYWNlICJzeW1ib2xTIiB3aXRoICJzdHJ1Y3Qgc3ltYm9sIiB0bwotCWF2b2lkIGNoYW5naW5nIGluY2x1ZGUgb3JkZXJpbmcuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd5Jyk6IEhhbmRsZSBqdXN0IGxpa2UgJ3QnLgotCi1Nb24gQXVnIDIzIDEyOjQ3OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc2V0X2F0KTogQWRkZWQgdW5zaWduZWRwIGFyZ3VtZW50LiAgVXNlCi0JbG9hZF9yZWdpc3Rlci4KLQkoc2V0X2F0X3Vuc2lnbmVkKTogUmVtb3ZlZDsgY2hhbmdlZCBjYWxsZXJzIHRvIHVzZSBzZXRfYXQuCi0JKGxvYWRfcmVnaXN0ZXIpOiBSZW1vdmVkIHVudXNlZCBpcCBhcmd1bWVudC4gIENoYW5nZWQgY2FsbGVycy4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGJyYW5jaCBhbmQgYnJhbmNoIGxpa2VseS4KLQkobWFjcm9fYnVpbGQpOiBIYW5kbGUgJ3UnLgotCShsb2FkX3JlZ2lzdGVyKTogSGFuZGxlIDY0IGJpdCBjb25zdGFudHMuCi0JKG1hY3JvKTogQWRkZWQgTV9EQUJTLCByZW1vdmVkIE1fQUJTVS4gIE51bWVyb3VzIGNoYW5nZXMgdG8KLQlzdXBwb3J0IDY0IGJpdCBjb25zdGFudHMuCi0JKG1pcHNfaXApOiBVc2UgaGV4IGNvbnN0YW50cyBpbiByYW5nZSBjaGVja3MgZm9yIGNsYXJpdHkuCi0JKG1kX251bWJlcl90b19jaGFycyk6IFN1cHBvcnQgOCBieXRlIHZhbHVlcy4KLQotRnJpIEF1ZyAyMCAxNjo1MDo1OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tODhrLmg6IHVwZGF0ZWQgY29weXJpZ2h0cy4KLQkgIChUQ19DT05TX1JFTE9DKTogZGVjbGFyZSB0byBiZSBSRUxPQ18zMi4KLQotRnJpIEF1ZyAyMCAxMToxNjo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXNhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIG1pcHNfaXNhIGJhc2VkIG9uIFRBUkdFVF9DUFUuICBEb24ndCBzYW5pdHkKLQljaGVjayBtYWNyb3MuICBTZXQgdGV4dCBhbGlnbm1lbnQgYW5kIEdQIHNpemUgaGVyZS4KLQkobWRfYXNzZW1ibGUpOiBEb24ndCBzZXQgdGV4dCBhbGlnbm1lbnQgYW5kIEdQIHNpemUgaGVyZS4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBpbnNlcnQgTk9QcyBmb3IgbG9hZCBkZWxheXMgaWYgbWlwc19pc2EgPj0gMi4KLQlVc2UgdGhlIHJpZ2h0IG1hc2sgYW5kIHNoaWZ0IGZvciBXUklURV9GUFJfVCBhbmQgV1JJVEVfRlBSX1MuICBBZGQKLQlhIE5PUCBhZnRlciBhIGJyYW5jaCBsaWtlbHkuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBEb24ndCBpbnNlcnQgTk9QUyBmb3IgbG9hZCBkZWxheXMgaWYgbWlwc19pc2EKLQk+PSAyLgotCShtYWNybyk6IFN1cHBvcnQgcjYwMDAgYW5kIHI0MDAwIG1hY3Jvcy4KLQkobWlwc19pcCk6IENoZWNrIGluc24gSVNBIGxldmVsIGFnYWluc3QgbWlwc19pc2EgYmVmb3JlIHVzaW5nIGl0LgotCUFkZGVkICd4JyBjYXNlIGZvciBpZ25vcmVkIHJlZ2lzdGVyLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLW1pcHNOIGFuZCAtbWNwdT1YWC4KLQotRnJpIEF1ZyAyMCAwMToyNjo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSkgW09CSl9FTEZdOiBIYW5kbGUgIi56ZXJvIi4KLQotVGh1IEF1ZyAxOSAxMjoxNToxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2xvY2FsKTogRnVuY3Rpb24gbW92ZWQgYW5kIHJlbmFtZWQuLi4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfbG9jYWwpOiAuLi50byBoZXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSksIGNvbmZpZy9vYmotZWxmLmMKLQkob2JqX3BzZXVkb190YWJsZSk6IE1vdmUgaGFuZGxpbmcgb2YgIi5sb2NhbCIuCi0KLQkqIHRjLmggKG1kX3BhcnNlX29wdGlvbik6IERvbid0IGRlY2xhcmUgaWYgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChOT19SRUxPQykgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUgYXMKLQlCRkRfUkVMT0NfTk9ORS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTmV3IG1hY3JvLCBjb252ZXJ0ZWQgZnJvbSBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BhcnNlX29wdGlvbik6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGNvbW1lbnRfY2hhcnMpIFtPQkpfRUxGXTogSW5jbHVkZSAiLyIuCi0JKGxpbmVfY29tbWVudF9jaGFycykgW09CSl9FTEYgfHwgVEVfSTM4NkFJWF06IERvbid0IGluY2x1ZGUgIi8iLgotCShtZF9hc3NlbWJsZSk6IENhc3QgMHhlOSB0byBjaGFyIGV4cGxpY2l0bHksIHRvIGF2b2lkIGNvbXBpbGVyCi0Jd2FybmluZy4KLQkobWRfYXNzZW1ibGUsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wKToKLQlDYWxsIHJlbG9jIGZvciBmaXhfbmV3IHR5cGUsIG9yIHVzZSBjb3JyZWN0IGVudW1lcmF0b3IsIGluc3RlYWQgb2YKLQlhbHdheXMgdXNpbmcgTk9fUkVMT0MuCi0JKGkzODZfb3BlcmFuZCk6IENoYW5nZSAiaWZuZGVmIEkzODZDT0ZGIiB0byAiaWZkZWYgT0JKX0FPVVQiIGZvcgotCXRlc3RzIGZvciB2YWxpZCBzZWN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogQ29tcGVuc2F0ZSBmb3IgZnJhZyBzdGFydAotCWFkZHJlc3MuCi0JKG1kX2FwcGx5X2ZpeF8xKSBbQkZEX0FTU0VNQkxFUl06IEZvciBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi0Jc3ltYm9sLCBjb21wZW5zYXRlIGZvciBsb2NhdGlvbiBvZiByZWxvYy4KLQkocmVsb2MsIEJGRF9SRUxPQ18zMiwgQkZEX1JFTE9DXzMyX1BDUkVMKSBbIUJGRF9BU1NFTUJMRVJdOiBEZWZpbmUKLQl0byByZXR1cm4gemVyby4KLQotV2VkIEF1ZyAxOCAxNjo1MToyOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IFVuZGVmIE5PX1JFTE9DIGJlZm9yZSBpbmNsdWRpbmcgYW91dC9hb3V0NjQuaC4KLQkob2JqX2VsZl93ZWFrKTogTmV3IGZ1bmN0aW9uLgotCShvYmpfcHNldWRvX3RhYmxlKTogSGFuZGxlICIud2VhayIuCi0JKG9ial9lbGZfc2VjdGlvbik6IElmIHNlY3Rpb24gZGlyZWN0aXZlIGluY2x1ZGVzIGEgc3RyaW5nLCBpZ25vcmUKLQlpdCBmb3Igbm93LiAgQWNjZXB0ICJwcm9nYml0cyIgZmxhZy4KLQkob2JqX2VsZl90eXBlKTogQWNjZXB0IGBAJyBiZWZvcmUgZmxhZyBuYW1lLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpIFtCRkRfQVNTRU1CTEVSXTogR2V0IHJpZCBvZiBgaWYoMSknCi0JY29uZGl0aW9uLgotCShmaXh1cF9zZWdtZW50KSBbQkZEX0FTU0VNQkxFUl06IFVzZSBiZmRfaXNfY29tX3NlY3Rpb24sIHJhdGhlcgotCXRoYW4gY2hlY2tpbmcgZm9yIGJmZF9jb21fc2VjdGlvbiBkaXJlY3RseS4KLQkoZml4dXBfc2VnbWVudCk6IFNpbXBsaWZ5IHJhbmdlIGNoZWNrLgotCShmaXh1cF9zZWdtZW50KSBbT0JKX0NPRkYgJiYgVENfSTk2MF06IFNpbXBsaWZ5IGNwcCBjb25kaXRpb24KLQl0ZXN0LgotCi0JKiBzeW1ib2xzLmggKFNfU0VUX1dFQUspOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChTX1NFVF9XRUFLKTogTmV3IGZ1bmN0aW9uLgotCShTX1NFVF9FWFRFUk5BTCwgU19DTEVBUl9FWFRFUk5BTCk6IERvbid0IGJvdGhlciB3aXRoIEJTRl9FWFBPUlQsCi0JaXQncyBub3QgYSBzZXBhcmF0ZSBmbGFnIGFueSBtb3JlLiAgQ2xlYXIgQlNGX1dFQUsuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFRyZWF0ICJzdHJpbmciIGxpa2UgImFzY2l6Ii4KLQotV2VkIEF1ZyAxOCAxNTozMDoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBicmFuY2ggaW5zdHJ1Y3Rpb25zCi0JaWYgLnNldCBub2JvcHQgb3IgLnNldCB2b2xhdGlsZS4KLQkoZ3BfcmVmZXJlbmNlKTogLmxpdDggYW5kIC5saXQ0IGFyZSBhY2Nlc3NlZCB2aWEgdGhlIEdQIHJlZ2lzdGVyLgotCShtYWNybyk6IEFkZGVkIGNhc2VzIE1fTElfUywgTV9MSV9TUy4gIEZpeGVkIE1fTElfRCBhbmQgTV9MSV9ERC4KLQkobWlwc19pcCk6IEFkZGVkIGNhc2VzICdGJywgJ0wnLCAnZicsICdsJyBmb3IgZmxvYXRpbmcgcG9pbnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IFJlbmFtZWQgc29tZSB2YXJpYWJsZXMgdG8gYXZvaWQgc2hhZG93Ci0Jd2FybmluZ3MuCi0KLU1vbiBBdWcgMTYgMTQ6MTY6MDIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19DT01NT04pOiBhZGQgbWlzc2luZyBiYWNrc2xhc2gKLQotCSogY29uZmlndXJlLmluICh6OGstKi17Y29mZixzaW19KTogdXNlIGNvZmZiZmQgZm9yIHRoaXMgdGFyZ2V0Ci0KLVRodSBBdWcgMTIgMTE6NDc6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogU3VnZ2VzdGVkIGJ5Ci0JZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKTogRG9uJ3QgYWNjZXB0IHN5bWJvbGljCi0JbmFtZXMgZm9yICdFJyBhbmQgJ0cnIGFyZ3VtZW50IHR5cGVzIChjb3Byb2Nlc3NvciByZWdpc3RlcnMpIGFuZAotCWRvbid0IHdhcm4gaWYgJDEgaXMgdXNlZCBvbiB0aGUgY29wcm9jZXNzb3IuCi0JKG1hY3JvKTogSGFuZGxlIE1fe0wsU31XQ3swLDIsM31fQUIgY29ycmVjdGx5LgotCi1Nb24gQXVnICA5IDEyOjA5OjE0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogVXNlIEJGRF9SRUxPQ18xNiBmb3IgMi1ieXRlIHZhbHVlcy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIHRjX2dlbl9yZWxvYyk6IEhhbmRsZQotCUJGRF9SRUxPQ18xNi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCi1Nb24gQXVnICA5IDEzOjM2OjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAobWVyZ2VfZGF0YV9pbnRvX3RleHQpOiBEZWZpbmUgb25seSBpZiBCRkRfQVNTRU1CTEVSIGlzCi0JZGVmaW5lZCBvciBCRkQgaXMgbm90LgotCShyZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMpOiBEZWNsYXJlIGxvY2FsIHZhcmlhYmxlIGZyYWdQLgotCi1GcmkgQXVnICA2IDE1OjIyOjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgY2FzZSBCRkRfUkVMT0NfMzIpOiBGaWxsIGluCi0JYnl0ZXMgd2l0aCByZWFsIHZhbHVlcywgbm90IHplcm9zLgotCi1GcmkgQXVnICA2IDEwOjU3OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotcmlzY29zKiwgbWlwcy0qLXN5c3YqKTogTmV3ICh1bnRlc3RlZCkKLQl0YXJnZXRzLCB1c2luZyBlY29mZiBhbmQgbWlwcy1iaWcuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQKLQlKb2huc29uKTogQWRkZWQgY2FzZSBmb3IgJ0MnIGZvciBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiBjb2Rlcy4KLQotVGh1IEF1ZyAgNSAxMzowODo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIGNhc2UgQkZEX1JFTE9DXzY0KTogRmlsbCBpbgotCWJ5dGVzIHdpdGggcmVhbCB2YWx1ZXMsIG5vdCB6ZXJvcy4KLQkobWRfcHNldWRvX3RhYmxlKTogQ2FsbCBjb25zIGZvciAudWF4d29yZC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX3BzZXVkb190YWJsZSk6IEhhbmRsZSAiLjhieXRlIi4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgQkZEX1JFTE9DXzY0IGZvciA4LWJ5dGUgZXhwcmVzc2lvbnMuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVGVzdCBERUJVR19TWU1TIGluc3RlYWQgb2YgREVCVUcKLQlmb3IgdmVyaWZ5aW5nIHN5bWJvbCBjaGFpbi4KLQkobWVyZ2VfZGF0YV9pbnRvX3RleHQsIHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyk6IE5ldwotCWZ1bmN0aW9ucywgc3BsaXQgb3V0IGZyb20gd3JpdGVfb2JqZWN0X2ZpbGUuCi0KLVR1ZSBBdWcgIDMgMTU6NDM6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N0YWJfZ2VuZXJpYywgaW4gZGlzYWJsZWQgY29kZSk6IElmCi0JZGVidWcgc2VjdGlvbiBpcyBuZXcsIGFsbG9jYXRlIGFuIGV4dHJhIDEyIGJ5dGVzIGF0IGl0cyBzdGFydC4gIElmCi0JIi5zdGFicyIgdHlwZSBpcyBOX1NPLCBmaWxsIGluIGZpbGVuYW1lIHN5bWJvbCBmaWVsZCBvZiB0aGF0IGZpcnN0Ci0JZW50cnkuICBSZXR1cm4gZWFybHkgaWYgImdvb2YiLCB0byBzaW1wbGlmeSBsYXRlciBjb2RlIHNsaWdodGx5LgotCShhZGp1c3Rfc3RhYl9zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2Zyb2JfZmlsZSk6IEFwcGx5IGFkanVzdF9zdGFiX3NlY3Rpb25zIHRvIGVhY2ggc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uLCBvYmpfZWxmX3ByZXZpb3VzKTogTm8gbG9uZ2VyCi0Jc3RhdGljLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl9zZWN0aW9uLCBvYmpfZWxmX3ByZXZpb3VzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIHRoZW0gZm9yICJwdXNoc2VjdGlvbiIKLQlhbmQgInBvcHNlY3Rpb24iLCBhbmQgY2FsbCBjb25zIGZvciAidWF3b3JkIiBhbmQgInVhaGFsZiIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdmVyc2lvbik6IFVzZSBFbmdsaXNoIGluIGVycm9yCi0JbWVzc2FnZXMuCi0KLVR1ZSBBdWcgIDMgMTE6Mjk6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IFVwZGF0ZWQgZm9yIEJGRCBFQ09GRiBjaGFuZ2VzLiAgTm93IGdldHMgdGhlCi0Jc3dhcHBpbmcgcm91dGluZXMgYW5kIGV4dGVybmFsIHN0cnVjdHVyZSBzaXplcyB2aWEgdGhlCi0JZWNvZmZfYmFja2VuZCBpbmZvcm1hdGlvbi4gIE5vIGxvbmdlciBpbmNsdWRlcyBjb2ZmL21pcHMuaC4KLQotTW9uIEF1ZyAgMiAxNzozNTo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZ2V0X3RhZyk6IFNhdmUgdGFnIG5hbWUgaW4gcGVybWFuZW50IG1lbW9yeQotCWFuZCBpbiBoYXNoX3B0ci0+c3RyaW5nLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogUmVzZXQgc3RhdGUgdG8gMCBhZnRlciAuYXBwbGluZSBpZgotCWZpbGUgbmFtZSBpcyBub3Qgc2Vlbi4KLQotTW9uIEF1ZyAgMiAxMTo1MTo0MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIGNhc2UgQkZEX1JFTE9DXzY0KTogTmV3IGNhc2UsCi0JcGFyYWxsZWwgdG8gQkZEX1JFTE9DXzMyLgotCSh0Y19nZW5fcmVsb2MpOiBBY2NlcHQgQkZEX1JFTE9DXzY0LgotCi1UaHUgSnVsIDI5IDIyOjIxOjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYzogRG9uJ3QgdXNlIHNob3J0IGludCBpbiBhIHByb3RvdHlwZS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogTWFrZSByZXR1cm4gdmFsdWUgc2ltcGx5IGRlcGVuZCBvbiBjb250ZW50cyBvZgotCXJldHVybmVkIGV4cHJlc3Npb24uCi0KLVRodSBKdWwgMjkgMTg6Mzg6MzcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHNwYXJjKi1hb3V0IGFuZCBzcGFyYyotdnh3b3JrcyBhcmUgQkZEIGFzc2VtYmxlcnMKLQotVGh1IEp1bCAyOSAxODozODozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1zdW5vcy5oOiByZW1vdmUgc29tZSBvbGQgZnVuY3Rpb24gZGVjbHMgdGhhdCBjb25mbGljdAotCXcvIEFOU0ksIGFuZCB3aGljaCB3ZXJlbid0IG5lZWRlZCBhbnl3YXkKLQotV2VkIEp1bCAyOCAxNjozNDo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9iX3N5bWJvbCk6IFJlbmFtZWQgZnJvbSB0Y19mcm9iX3N5bWJvbCwKLQlhbmQgZGlzYWJsZWQgc2luY2UgaXQgYnJlYWtzIElhbidzIG5ldyBzeW1ib2wtdmFsdWUgY29kZS4KLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogQWNjZXB0IG1vcmUgZGlnaXRzIGlmIEJGRDY0LgotCi1XZWQgSnVsIDI4IDExOjMwOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IElmIHdlIGhhdmUgYSBub3JtYWwgY29uc3RhbnQgd2hlbiB3ZQotCWV4cGVjdCBhIGJpZ251bSwgdHVybiBpdCBpbnRvIGEgYmlnbnVtLiAgT3V0cHV0IGV4dHJhIHplcm9lcwotCWJlZm9yZSBhIHNob3J0IGJpZ251bSwgcmF0aGVyIHRoYW4gYWZ0ZXIuCi0KLVR1ZSBKdWwgMjcgMTU6NTQ6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBDb25kaXRpb25hbGl6ZSB2ZXJpZnlfc3ltYm9sX2NoYWluIGNhbGwKLQlvbiBERUJVR19TWU1TLCBub3QgREVCVUcuCi0JKHN5bWJvbF9yZW1vdmUpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2luc2VydCk6IExpa2V3aXNlLgotCi1UdWUgSnVsIDI3IDA4OjQ1OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19vcHRpbWl6ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFwcGVuZF9pbnNuKTogSWYgbWlwc19vcHRpbWl6ZSA9PSAwLCBhbHdheXMgaW5zZXJ0IE5PUAotCWluc3RydWN0aW9ucy4gIElmIG1pcHNfb3B0aW1pemUgPCAyLCBkb24ndCBzd2FwIGJyYW5jaGVzLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiAtT3ggb3IgLWd4LCBzZXQgbWlwc19vcHRpbWl6ZSBhY2NvcmRpbmdseS4KLQotTW9uIEp1bCAyNiAxODowMjo0MyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IGlmIHRlc3RzdWl0ZSBkb2VzIG5vdCBleGlzdCwgdGhlbiBza2lwIGl0LgotCi1GcmkgSnVsIDIzIDE0OjEzOjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAocHJldl9pbnNuX3VucmVvcmRlcmVkLAotCXByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBicmFuY2ggaW5zdHJ1Y3Rpb24gaWYKLQlwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCAoc2VlIGNvbW1lbnQpLgotCShtaXBzX25vX3ByZXZfaW5zbik6IENsZWFyIHRoZSB1bnJlb3JkZXJlZCB2YXJpYWJsZXMuCi0JKHNfbWlwc3NldCk6IFdoZW4gdHVybmluZyBvbiByZW9yZGVyaW5nLCBzZXQgdGhlIHVucmVvcmRlcmVkCi0JdmFyaWFibGVzLgotCi1GcmkgSnVsIDIzIDEzOjA5OjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogU2VjdGlvbnMgIi5pbml0IiBhbmQgIi5maW5pIgotCWFyZSBhbHNvIG1hZ2ljLCBhbmQgaGF2ZSBzcGVjaWFsIGRlZmF1bHQgZmxhZyBzZXR0aW5ncy4KLQkob2JqX2VsZl9mcm9iX3N5bWJvbCk6IFNpbmNlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIGZ1bmN0aW9uCi0JaXNuJ3QgdXNlZCwgZG9uJ3QgYm90aGVyIGNhbGxpbmcgb2JqX2VsZl93cml0ZV9zeW1ib2xfcCwgc2luY2UgaXQKLQlkb2Vzbid0IGFjY29tcGxpc2ggYW55dGhpbmcgZWxzZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBSb3VuZCB1cCBzZWN0aW9uIHNpemUgb25seQotCWZvciBhLm91dCBmb3JtYXQuCi0KLQkqIHN5bWJvbHMuYzogRG9uJ3QgZGVmaW5lIERFQlVHIGJ5IGRlZmF1bHQuCi0KLVRodSBKdWwgMjIgMTI6MDk6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IEhhbmRsZSBhIE9fdW1pbnVzIGV4cHJlc3Npb24uCi0KLQkqIGV4cHIuYyAoZXhwcik6IERvbid0IGxldCBhYnNvbHV0ZV9zZWN0aW9uIG92ZXJyaWRlCi0JdW5kZWZpbmVkX3NlY3Rpb24gZm9yIHRoZSByZXR1cm4gdmFsdWUuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSW4gTk9fUFNFVURPX0RPVCBjYXNlLCBpZiB3ZSBmaW5kIGEKLQlwc2V1ZG8tb3Agd2l0aCBhIHBvY19oYW5kbGVyIGZpZWxkIG9mIE5VTEwsIGlnbm9yZSBpdCBhbmQgdHJlYXQgaXQKLQlhcyBhbiBpbnN0cnVjdGlvbiBpbnN0ZWFkLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJzZXQiIHdpdGggYSBOVUxMCi0JcG9jX2hhbmRsZXIgZmllbGQuCi0KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChtZF9iZWdpbik6IFVzZSBhIGxvY2FsIHZhcmlhYmxlIHdoZW4KLQlpbml0aWFsaXppbmcgbWRfcmVsYXhfdGFibGUgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgbW9kaWZ5aW5nIGEKLQlzdXBwb3NlZGx5IGNvbnN0IGRhdGEgc3RydWN0dXJlLgotCi1UaHUgSnVsIDIyIDEwOjU4OjUxIDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmM6IE9ubHkgaW5jbHVkZSBhb3V0L2FvdXQ2NC5oIGlmIEJGRF9BU1NFTUJMRVIKLQlpcyBkZWZpbmVkLgotCi1XZWQgSnVsIDIxIDE3OjMyOjAyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHtob3N0fSk6ICBNYXAgKi0qLXN5c3Y0KiB0byBnYXNfaG9zdD1zeXN2LgotCSogY29uZmlndXJlLmluIChjYXNlICR7Z2VuZXJpY190YXJnZXR9KTogIEFkZCBpWzM0XTg2LSotc3lzdjQqCi0JY2FzZSB0byBzZXQgb2JqX2Zvcm1hdD1lbGYuICBNdXN0IGdvIGJlZm9yZSBpMzg2LSotc3lzdiogY2FzZSB0aGF0Ci0Jc2V0cyBvYmpfZm9ybWF0PWNvZmZic2QuICBBZGQgKi0qLXN5c3Y0KiB0byAqLSotZWxmIGFuZAotCSotKi1zb2xhcmlzIGNhc2UsIGFuZCBtb3ZlIHRvIGJlZm9yZSAqLXN5c3YqIGNhc2UgdGhhdCB3YW50cyB0bwotCXNldCBvYmpfZm9ybWF0IHRvIGNvZmYuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBDaGFuZ2UgYWxsICdleHAuWF9vcCcgdG8KLQknZXhwLT5YX29wJy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeCk6ICBGaXggdmFscCB0byBiZSAndmFsdWVUIConIGZvcgotCUJGRF9BU1NFTUJMRVIgY2FzZS4KLQotV2VkIEp1bCAyMSAxMjo0Nzo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBJbmNsdWRlIGFvdXQvYW91dDY0LmguCi0JKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogU2V0IEJTRl9ERUJVR0dJTkcgZm9yIGEgY29uc3RydWN0b3IKLQlzeW1ib2wsIHNvIHRoYXQgQkZEIGRvZXNuJ3QgdGFtcGVyIHdpdGggdGhlIHR5cGUuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgTk9fUFNFVURPX0RPVCBpcyBkZWZpbmVkLCBsb29rCi0JdXAgb3Bjb2RlcyBhcyBwc2V1ZG8tb3BzIGV2ZW4gaWYgdGhleSBkb24ndCBzdGFydCB3aXRoICcuJy4KLQkqIGNvbmZpZy90Yy1tODhrLmggKE5PX1BTRVVET19ET1QpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZWQgc3BlY2lhbCBwc2V1ZG8tb3AKLQloYW5kbGluZy4KLQkobWRfYXBwbHlfZml4KTogU2V0IGZ4X29mZnNldCB0byB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgcmVsb2MuCi0JT3V0cHV0IHRoZSBsb3cgMTYgYml0cyBmb3IgUkVMT0NfSEkxNiwgbm90IHRoZSBoaWdoIDE2IGJpdHMuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IElmIFRDX004OEssIHNldCB0aGUKLQlyX29mZnNldCBmaWVsZCBvZiB0aGUgcmVsb2MgdG8gdGhlIGZpeHVwIG9mZnNldC4KLQkoZml4dXBfc2VnbWVudHMpOiBJZiBUQ19NODhLLCBkb24ndCB3YXJuIGFib3V0IGZpeHVwIG92ZXJmbG93cy4KLQkqIGRvYy9hcy50ZXhpbmZvOiBNaW5vciB1cGRhdGVzLgotCi1UdWUgSnVsIDIwIDE5OjI4OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gcGVybWl0IHN5bWJvbHMgdG8gY29udGFpbiBhbnkgZXhwcmVzc2lvbgotCXR5cGUgYW5kIHRvIGRlbGF5IHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiB1bnRpbCB0aGUKLQl2YWx1ZSBpcyBhY3R1YWxseSBuZWVkZWQuICBUaGlzIHBlcm1pdHMgc2V0dGluZyBzeW1ib2xzIHRvIHZhbHVlcwotCWNhbGN1bGF0ZWQgYmFzZWQgb24gb2JqZWN0IGNvZGUgc2l6ZS4gIEV4cHJlc3Npb25zIHdlcmUgY2hhbmdlZCB0bwotCW5vIGxvbmdlciBiZSBpbiBhIHNlY3Rpb24sIHRvIHN0b3AgdGhlIG92ZXJsb2FkaW5nIG9mIHNlZ21lbnQgYW5kCi0JZXhwcmVzc2lvbiB0eXBlIHRoYXQgcHJldmlvdXNseSBvY2N1cnJlZC4KLQotCSogYXMuYyAoYmlnX3NlY3Rpb24sIHBhc3MxX3NlY3Rpb24sIGRpZmZfc2VjdGlvbiwgYWJzZW50X3NlY3Rpb24pOgotCVJlbW92ZWQuCi0JKGV4cHJfc2VjdGlvbik6IEFkZGVkICh1c2VkIGZvciBkdW1teSBzeW1ib2xzIHdoaWNoIGhvbGQKLQlpbnRlcm1lZGlhdGUgZXhwcmVzc2lvbiB2YWx1ZXMpLgotCShwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDcmVhdGUgZXhwcl9zZWN0aW9uLCBkbyBub3QgY3JlYXRlIHRoZQotCXNlY3Rpb25zIG5vdyByZW1vdmVkLgotCSogYXMuaCAoc2VnVCk6IFJlbW92ZWQgU0VHX0FCU0VOVCwgU0VHX1BBU1MxLCBTRUdfQklHLCBhbmQKLQlTRUdfRElGRkVSRU5DRS4gIEFkZGVkIFNFR19FWFBSLgotCShTRUdfTk9STUFMKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogc3Vic2Vncy5jIChzZWdfbmFtZSwgc3Vic2Vnc19iZWdpbik6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpdHRvLgotCSogY29uZmlnL29iai1hb3V0LmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotYm91dC5jIChzZWdfTl9UWVBFKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQotCSogZXhwci5oIChvcGVyYXRvclQpOiBNb3ZlZCBpbiBmcm9tIGV4cHIuYywgYWRkZWQgc29tZSB2YWx1ZXMuCi0JKGV4cHJlc3Npb25TKTogQWRkZWQgWF9vcCBmaWVsZCwgcmVtb3ZlZCBYX3NlZyBmaWVsZDsgcmVuYW1lZAotCVhfc3VidHJhY3Rfc3ltYm9sIHRvIFhfb3Bfc3ltYm9sLgotCSogZXhwci5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byBhc3NpZ24gZXhwcmVzc2lvbiB0eXBlcyByYXRoZXIgdGhhbgotCXNlY3Rpb25zIGFuZCB0byBzaW1wbGlmeSB0aGUgcGFyc2luZy4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmaXhfbmV3KTogUmVtb3ZlZCBzdWJfc3ltYm9sIGFyZ3VtZW50LgotCShmaXhfbmV3X2V4cCk6IE5ldyBmdW5jdGlvbiwgdGFrZXMgZXhwcmVzc2lvbiBhcmd1bWVudC4KLQkqIHdyaXRlLmg6IFByb3RvdHlwZSBjaGFuZ2VzIGZvciBmaXhfbmV3IGFuZCBmaXhfbmV3X2V4cC4KLQkqIGNvbmQuYyAoc19pZik6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiByZWFkLmMgKHNfbHN5bSwgcHNldWRvX3NldCwgZW1pdF9leHByLCBwYXJzZV9iaXRmaWVsZF9jb25zLAotCXBhcnNlX3JlcGVhdF9jb25zLCBnZXRfc2VnbWVudGVkX2V4cHJlc3Npb24sCi0JZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IERpdHRvLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSwgU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKToKLQlEaXR0by4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGVmLCBvYmpfY29mZl92YWwpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9kZWYsIG9ial9jb2ZmX3ZhbCwKLQlvYmpfY29mZl9lbmRlZiwgeWFua19zeW1ib2xzKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N0YWJfZ2VuZXJpYywgb2JqX2VsZl9zaXplKTogRGl0dG8uCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9hc3NlbWJsZSwgcGFyc2Vfb3BlcmFuZCwgbWFjaGluZV9pcCwKLQlwcmludF9pbnNuLCBtZF9vcGVyYW5kKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaDgzMDAuYyAocGFyc2VfZXhwLCBjb2xvbm1vZDI0LCBjaGVja19vcGVyYW5kLAotCWRvX2FfZml4X2ltbSwgYnVpbGRfYnl0ZXMpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChwYXJzZV9leHAsIHNraXBfY29sb250aGluZywgcGFyc2VfcmVnbGlzdCwKLQlnZXRfc3BlY2lmaWMsIGNoZWNrLCBpbnNlcnQsIG1kX2NvbnZlcnRfZnJhZyk6IERpdHRvLgotCSogY29uZmlnL3RjLWhwcGEuYyAodGhlX2luc24sIGZpeF9uZXdfaHBwYSwgY29uc19maXhfbmV3X2hwcGEsCi0JbWRfYXNzZW1ibGUsIHBhX2lwLCBnZXRFeHByZXNzaW9uLCBnZXRBYnNvbHV0ZUV4cHJlc3Npb24sCi0JZXZhbHVhdGVBYnNvbHV0ZSwgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlLCBwYV9lbnRyeSwKLQlwcm9jZXNzX2V4aXQpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFNUQUJfRklYVVAsIGlzX0RQX3JlbGF0aXZlLCBpc19QQ19yZWxhdGl2ZSwKLQlpc19jb21wbGV4KTogRGl0dG8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwZSwgbWRfYXNzZW1ibGUsIGkzODZfb3BlcmFuZCwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfY3JlYXRlX2xvbmdfanVtcCk6IERpdHRvLgotCSogY29uZmlnL3RjLWk4NjAuYyAobWRfYXNzZW1ibGUsIGdldEV4cHJlc3Npb24sIHByaW50X2luc24pOgotCURpdHRvLgotCSogY29uZmlnL3RjLWk5NjAuYyAocGFyc2VfZXhwciwgc3Vicywgc2VncywgbWRfY29udmVydF9mcmFnLAotCWdldF9jZGlzcCwgbWVtX2ZtdCwgcGFyc2VfbGRjb25zdCwgcmVsYXhfY29iciwgc19zeXNwcm9jLAotCWk5NjBfaGFuZGxlX2FsaWduKTogRGl0dG8uCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19leHAsIHN0cnVjdCBtNjhrX2l0LCBzZWcsIG9wLAotCXN1YnMsIGFkZF9maXgsIGlzdmFyLCBtNjhrX2lwLCBtZF9hc3NlbWJsZSwgbWRfY29udmVydF9mcmFnXzEsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXAsIGdldF9udW0pOgotCURpdHRvLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfYXNzZW1ibGUsIGdldF9pbW0xNiwgZ2V0X3BjciwKLQltZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCk6IERpdHRvLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXNzZW1ibGUsIGFwcGVuZF9pbnNuLCBncF9yZWZlcmVuY2UsCi0JbWFjcm9fYnVpbGQsIG1hY3JvLCBteV9nZXRFeHByZXNzaW9uKTogRGl0dG8uICBBbHNvIHJlbW92ZWQKLQlnZXRfb3B0aW9uYWxfYWJzb2x1dGVfZXhwcmVzc2lvbjsganVzdCB1c2UgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24KLQlpbnN0ZWFkLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKGdldF9hZGRyX21vZGUsIGV2YWx1YXRlX2V4cHIsIGNvbnZlcnRfaWlmLAotCWZpeF9uZXdfbnMzMmssIGZpeF9uZXdfbnMzMmtfZXhwLCBjb25zX2ZpeF9uZXdfbnMzMmspOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChmaXhfbmV3X25zMzJrIHByb3RvdHlwZSk6IERpdHRvLgotCSogY29uZmlnL3RjLXNoLmMgKHBhcnNlX2V4cCwgY2hlY2ssIGluc2VydCwgbWRfY29udmVydF9mcmFnKToKLQlEaXR0by4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hc3NlbWJsZSwgc3BhcmNfaXAsIGdldEV4cHJlc3Npb24sCi0JcHJpbnRfaW5zbik6IERpdHRvLgotCSogY29uZmlnL3RjLXRhaG9lLmMgKHN0cnVjdCB0b3AsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LAotCXRpcF9vcCwgbWRfYXNzZW1ibGUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy12YXguYyAoc2VnX29mX29wZXJhbmQsIG1kX2Fzc2VtYmxlLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKiBjb25maWcvdGMtejhrLmMgKHBhcnNlX2V4cCwgY2hlY2tfb3BlcmFuZCwgbmV3Zml4KTogRGl0dG8uCi0KLVR1ZSBKdWwgMjAgMTI6MTc6MTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGkzODYtbHlueCBpcyB0aGUgc2FtZSBhcyBpMzg2LWNvZmYKLQotTW9uIEp1bCAxOSAxNToyMToyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfcHJldmlvdXMpOiBOZXcgZnVuY3Rpb24uCi0JKHByZXZpb3VzX3NlY3Rpb24sIHByZXZpb3VzX3N1YnNlY3Rpb24pOiBOZXcgdmFycy4KLQkob2JqX2VsZl9zZWN0aW9uKTogU2F2ZSBjdXJyZW50IHBsYWNlIGluIGNhc2UgRFdBUkYgY29kZSB3YW50cyB1cwotCXRvIHBvcCBiYWNrIHRvIGl0LiAgSGFuZGxlIHVucXVvdGVkIHNlY3Rpb24gbmFtZSBhcyB3ZWxsIGFzIHF1b3RlZAotCXNlY3Rpb24gbmFtZS4gIERvbid0IGNyYXNoIG9uIGludmFsaWQgc3RyaW5ncy4KLQkob2JqX3BzZXVkb190YWJsZSk6IEhhbmRsZSBuZXcgcHNldWRvcyAicHJldmlvdXMiLCAiMmJ5dGUiLCBhbmQKLQkiNGJ5dGUiLgotCi0JKiBjb25maWcvb2JqLWVsZi5oOiBEb24ndCBpbmNsdWRlIHN0cnVjLXN5bWJvbC5oLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogRGVjbGFyZSBhcmcgYXMgc3RydWN0IHN5bWJvbCAqLgotCi0JKiB0Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCkgW09CSl9FTEZdOiBMb2NhbCBsYWJlbHMgY2FuIHN0YXJ0IHdpdGgKLQkiTCIgb3IgIl8uTF8iLgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG9mZiBmcm9tCi0Jd3JpdGVfY29udGVudHMuICBVc2UgbWVtc2V0IGluc3RlYWQgb2YgYnplcm8uCi0JKHdyaXRlX29iamVjdF9maWxlKTogQXBwbHkgd3JpdGVfcmVsb2NzIHRvIGVhY2ggc2VjdGlvbiBiZWZvcmUKLQlhcHBseWluZyB3cml0ZV9jb250ZW50cy4KLQotCSogcmVhZC5jIChyZWFkX2JlZ2luKTogQ2FsbCBvYnN0YWNrX2JlZ2luIHdpdGggdmFsdWVzIGNsb3NlciB0byAxSwotCW11bHRpcGxlcy4KLQkocmVhZF9hX3NvdXJjZV9maWxlLCBiaWdfY29ucywgZmxvYXRfY29ucyk6IFVzZSBtZW1jcHkgaW5zdGVhZCBvZgotCWJjb3B5LgotCi1Nb24gSnVsIDE5IDE0OjMwOjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcF9vcCk6IERvbid0IGRlY3JlbWVudCBzdHJlbmQgd2hlbgotCWNhbGN1bGF0aW5nIG9wUC0+aXNpejsgdGhpcyBwZXJtaXRzIHRoZSBleHByZXNzaW9uIHNpemUgdG8gYmUKLQlkZXRlcm1pbmVkIGFzIHdlbGwsIGxhdGVyIG9uLgotCi0JKiBleHByLmMgKGNsZWFuX3VwX2V4cHJlc3Npb24pOiBEb24ndCBjYW5jZWwgdGhlIHN1YnRyYWN0aW9uIG9mCi0JdW5kZWZpbmVkIHN5bWJvbHMuCi0KLQkqIHJlYWQuYyAoc19kYXRhKSwgY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2RhdGEpOiBJZiAtUiwKLQlzd2l0Y2ggdG8gdGV4dCBzZWN0aW9uIHJhdGhlciB0aGFuIGRhdGEgc2VjdGlvbi4KLQotTW9uIEp1bCAxOSAxMjozNTozOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2UgQUlORFgpOiBBZGQgNiB0byBvcGVyYW5kCi0JZXhwcmVzc2lvbiAodG8gdGFrZSB0aGUgcGMtcmVsIGluc3RydWN0aW9uIGl0c2VsZiBpbnRvIGFjY291bnQpCi0JYmVmb3JlIHVzaW5nIHRoZSBleHByZXNzaW9uLCBpbnN0ZWFkIG9mIGFmdGVyLgotCi1GcmkgSnVsIDE2IDA4OjU2OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChmbG9hdF9jb25zKTogU2ltcGxpZmllZCBwYXJzaW5nIGxvZ2ljLiAgSWYKLQlSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBpcyBkZWZpbmVkLCBhY2NlcHQgYSByZXBlYXQgY291bnQuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBSYXRoZXIgdGhhbiBhIHNwZWNpYWwgY2FzZSBmb3IgVENfSFBQQSwKLQl1c2UgbmV3IG1hY3JvIHRjX2Zyb2JfbGFiZWwuCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBNYW55IGNoYW5nZXMgdG8gc3VwcG9ydCBzaW1wbGUgYXNzZW1ibGVyCi0Jb3B0aW1pemF0aW9uLgotCShpbnNuX2xhYmVsLCBwcmV2X2luc24sIHByZXZfcHJldl9pbnNuLCBkdW1teV9vcGNvZGUsCi0JcHJldl9pbnNuX3ZhbGlkLCBwcmV2X2luc25fZnJhZywgcHJldl9pbnNuX3doZXJlLAotCXByZXZfaW5zbl9maXhwLCBwcmV2X2luc25faXNfZGVsYXlfc2xvdCk6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZXMuCi0JKGluc25fdXNlc19yZWcsIG1pcHNfbm9fcHJldl9pbnNuLCBtaXBzX2VtaXRfZGVsYXlzLAotCW1pcHNfYWxpZ24sIHNfc3RyaW5nZXIsIHNfbWlwc19zcGFjZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShtaXBzX2RlZmluZV9sYWJlbCk6IE5ldyBnbG9iYWwgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEZvciAiYXNjaWkiLCAiYXNjaXoiLCAiYXNjaWl6IiwgY2FsbAotCXNfc3RyaW5nZXIuICBDaGFuZ2VkIGFyZ3VtZW50IHRvIGZsb2F0X2NvbnMgZnJvbSAwIG9yIDEgdG8gJ2YnCi0Jb3IgJ2QnLiAgRm9yICJzcGFjZSIgY2FsbCBzX21pcHNfc3BhY2UuCi0JKG1kX2JlZ2luKTogQ2FsbCBtaXBzX25vX3ByZXZfaW5zbi4KLQkoYXBwZW5kX2luc24pOiBPbmx5IGluc2VydCBuZWNlc3NhcnkgTk9QIGluc3RydWN0aW9ucy4KLQkobWFjcm8pOiBDYWxsIG1pcHNfZW1pdF9kZWxheXMgYmVmb3JlIHNldHRpbmcgbWlwc19ub3Jlb3JkZXIuCi0JSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgbWlwc19ub3Jlb3JkZXIgcmF0aGVyIHRoYW4gdXNpbmcKLQlzYXZlX3Jlb3JkZXJfY29uZGl0aW9uLiAgRG9uJ3QgYm90aGVyIHRvIHVzZSBub3Jlb3JkZXIgaW4KLQlNX0xfRE9CIGFuZCBNX0xfREFCLCBzaW5jZSBhcHBlbmRfaW5zbiB3aWxsIG5vdCBpbnNlcnQgYSBOT1AuCi0JKG1kX2F0b2YpOiBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjb3JyZWN0bHkgZm9yIGJvdGgKLQliaWcgYW5kIGxpdHRsZSBlbmRpYW4gdGFyZ2V0cy4KLQkoc19hbGlnbiwgc19jb25zKTogQ2FsbCBtaXBzX2FsaWduIHJhdGhlciB0aGFuIGZyYWdfYWxpZ24uCi0JKHNfY2hhbmdlX3NlZywgc19jb25zKTogQ2FsbCBtaXBzX2VtaXRfZGVsYXlzLgotCShzX2Zsb2F0X2NvbnMpOiBMZXQgZmxvYXRfY29ucyBkbyB0aGUgd29yay4KLQkoc19taXBzc2V0KTogQ2FsbCBtaXBzX2VtaXRfZGVsYXlzIHdoZW4gc2V0dGluZyBub3Jlb3JkZXIuCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2xhYmVsKTogRGVmaW5lIHRvIGJlCi0JbWlwc19kZWZpbmVfbGFiZWwuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scywgZWNvZmZfYnVpbGRfcHJvY3MsCi0JZWNvZmZfZnJvYl9maWxlcyk6IENvbnNpc3RlbnRseSB1c2UgU19HRVRfVkFMVUUgcmF0aGVyIHRoYW4KLQliZmRfYXN5bWJvbF92YWx1ZS4gIFdhcm4gaWYgdGFraW5nIGRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbgotCWRpZmZlcmVudCBzZWdtZW50cy4KLQotVGh1IEp1bCAxNSAxMTo1MTowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRGlzY2FyZCBhbGwgb3BlbiBzY29wZXMsCi0Jd2l0aCBhIHdhcm5pbmcuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogSWYgVENfTTg4SywgZG9uJ3QgYWRqdXN0Ci0JYnkgbWRfcGNyZWxfZnJvbSBpZiB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0IGEgc3ltYm9sICh3ZSBzdGlsbAotCW5lZWQgbWRfcGNyZWxfZnJvbSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIHdpdGhpbiB0aGUgc2FtZQotCWZpbGUpLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcGNyZWxfZnJvbSk6IENvcnJlY3RlZCByZXR1cm4gdmFsdWUuCi0JKG9tYWdpYyk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlLgotCi0JKiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBtODhrLWNvZmYuCi0JKiBjb25maWd1cmUuaW4gKG04OGstKi1jb2ZmKik6IE5ldyB0YXJnZXQuICBVc2UgY29mZmJmZCBhbmQKLQltODhrY29mZi4KLQkqIGNvbmZpZy9tODhrY29mZi5tdDogTmV3IGZpbGUuCi0JKiByZWFkLmMgKGxleF90eXBlKTogTmV3IG1hY3JvIExFWF9BVCB0byBzZXQgbGV4IHR5cGUgb2YgJ0AnLgotCShwc2V1ZG9fc2V0KTogSGFuZGxlIGRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbiBkaWZmZXJlbnQgZnJhZ21lbnRzCi0JYnkgc2F2aW5nIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiBhcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBSZXNvbHZlIGRpZmZlcmVuY2UKLQlleHByZXNzaW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfcHNldWRvX3RhYmxlKTogSWYgVENfTTg4SywgYWNjZXB0Ci0JInNkZWYiIGFzIGEgc3lub255bSBmb3IgImRlZiIuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogSWYgVENfTTg4SywgaW5jbHVkZSBjb2ZmL204OGsuaCBhbmQgc2V0Ci0JVEFSR0VUX0ZPUk1BVC4KLQkoU19JU19MT0NBTCk6IEFueSBzeW1ib2wgd2hpY2ggaW5jbHVkZXMgXDAwMSBpbiB0aGUgbmFtZSBpcyBsb2NhbC4KLQkqIGNvbmZpZy90Yy1tODhrLmMsIGNvbmZpZy90Yy1tODhrLmg6IE51bWVyb3VzIGNoYW5nZXMgdG8gYnJpbmcKLQltODhrIHBvcnQgdXAgdG8gZGF0ZSwgYW5kIHRvIGFkZCBDT0ZGIHN1cHBvcnQuCi0KLVdlZCBKdWwgMTQgMTU6MDk6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBSZW1vdmVkIHN5X2ZvcndhcmQgYW5kIHJlcGxhY2VkIGl0IHdpdGggYW4gdW5kZWZpbmVkIGV4cHJlc3Npb24KLQlhcyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCk6IFJlbW92ZWQgc3lfZm9yd2FyZCBmaWVsZC4gIEFkZGVkCi0Jc3lfcmVzb2x2ZWQgYW5kIHN5X3Jlc29sdmluZyBzaW5nbGUgYml0IGZpZWxkcy4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IERvbid0IGluaXRpYWxpemUgc3lfZm9yd2FyZCBmaWVsZC4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBOZXcgZnVuY3Rpb24gdG8gYWRqdXN0IHN5bWJvbCB2YWx1ZSBieQotCWZyYWdtZW50IGFkZHJlc3MsIHVzaW5nIHJlY3Vyc2lvbiB0byByZXNvbHZlIGZvcndhcmQgc3ltYm9scy4KLQkqIHN5bWJvbHMuaDogQWRkZWQgcHJvdG90eXBlIGZvciBuZXcgZnVuY3Rpb24uCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBTZXQgc3ltYm9sUC0+c3lfdmFsdWUgdG8gYW4gdW5kZWZpbmVkCi0JZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBzZXR0aW5nIHN5bWJvbFAtPnN5X2ZvcndhcmQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSByZXNvbHZlX3N5bWJvbF92YWx1ZSBvbgotCXN5bWJvbHMsIGtlZXBpbmcgdGhlIGNvbW1vbiBjYXNlICh0aGUgb2xkIGJlaGF2aW91cikgaW5saW5lLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCBzeV9mb3J3YXJkCi0JaGFuZGxpbmcgKHN1YnN1bWVkIGJ5IHdyaXRlLmMgY2hhbmdlKS4KLQkqIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfdmFsKTogU2V0Ci0Jc3lfdmFsdWUgcmF0aGVyIHRoYW4gc3lfZm9yd2FyZC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9lbmRlZiwgeWFua19zeW1ib2xzKTogQ2hlY2sKLQlleHByZXNzaW9uIHNlZ21lbnQgcmF0aGVyIHRoYW4gc3lfZm9yd2FyZC4KLQkoeWFua19zeW1ib2xzKTogVXNlIHJlc29sdmVfc3ltYm9sX3ZhbHVlLgotCShjcmF3bF9zeW1ib2xzKTogUmVtb3ZlZCBleHRyYSBwYXNzIG92ZXIgc3ltYm9scy4KLQkqIGNvbmZpZy9vYmotYW91dC5jLCBjb25maWcvb2JqLWJvdXQuYywgY29uZmlnL29iai1jb2ZmLmMsCi0JY29uZmlnL29iai12bXMuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFJlbW92ZWQgZXh0cmEgcGFzcyBvdmVyCi0Jc3ltYm9scyB3aGljaCBoYW5kbGVkIHN5X2ZvcndhcmQ7IHVzZSByZXNvbHZlX3N5bWJvbF92YWx1ZQotCWluc3RlYWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCwgY29uZmlnL29iai1jb2ZmYmZkLmggKG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sKToKLQlEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6IENoZWNrIGV4cHJlc3Npb24KLQlzZWdtZW50IHJhdGhlciB0aGFuIHN5X2ZvcndhcmQuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfQ2hlY2tfRm9yX01haW4pOiBEb24ndCBpbml0aWFsaXplCi0Jc3lfZm9yd2FyZDsgZG8gaW5pdGlhbGl6ZSBzeV9yZXNvbHZlZCBhbmQgc3lfcmVzb2x2aW5nLgotCSogY29uZmlnL3RjLWhwcGEuaCAoU1RBQl9GSVhVUCk6IFVzZSBzeV92YWx1ZSwgbm90IHN5X2ZvcndhcmQuCi0KLQkqIENoYW5nZXMgdG8ga2VlcCBhIGZ1bGwgZXhwcmVzc2lvbiBhcyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIG5vdAotCWp1c3QgYSBsb25nd29yZDoKLQkqIHN0cnVjLXN5bWJvbC5oOiBOZXcgZmllbGQgc3lfdmFsdWUuCi0JKiBhcy5oOiBJbmNsdWRlIGV4cHIuaCBiZWZvcmUgc3RydWMtc3ltYm9sLmguCi0JKiBleHByLmg6IFVzZSBzdHJ1Y3Qgc3ltYm9sIHJhdGhlciB0aGFuIHN5bWJvbFMuCi0JKiBzeW1ib2xzLmMgKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IFJld3JvdGUgdG8gcmV0cmlldmUgdmFsdWUKLQlvZiBzeV92YWx1ZSBmaWVsZDsgY29tcGlsZSB1bmNvbmRpdGlvbmFsbHksIG5vdCBqdXN0IGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkqIHN5bWJvbHMuaDogQ29tcGlsZSBTX3tTR31FVF9WQUxVRSBwcm90b3R5cGVzIHVuY29uZGl0aW9uYWxseS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2V0IEJGRCBzeW1ib2wgdmFsdWUgdG8gZ2FzIHN5bWJvbAotCXZhbHVlLgotCSogY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotYm91dC5oLCBjb25maWcvb2JqLWNvZmYuaCwKLQljb25maWcvb2JqLWNvZmZiZmQuaCwgY29uZmlnL29iai1nZW5lcmljLmgsIGNvbmZpZy9vYmotdm1zLmgKLQkoU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogUmVtb3ZlZCBtYWNybyBkZWZpbml0aW9ucy4KLQkqIGNvbmZpZy9vYmotaWVlZS5jIChTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOiBSZW1vdmVkLgotCSogY29uZmlnL29iai1jb2ZmLmgsIG9iai1jb2ZmYmZkLmg6IFJld3JvdGUgc2V2ZXJhbCBtYWNyb3MgdG8gdXNlCi0JU19HRVRfVkFMVUUgcmF0aGVyIHRoYW4gb3N0X2VudHJ5Lm5fdmFsdWUuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX3N5bWJvbF90b19jaGFycyksIGNvbmZpZy9vYmotYm91dC5jCi0JKG9ial9zeW1ib2xfdG9fY2hhcnMpLCBjb25maWcvb2JqLWNvZmYuYyAob2JqX3N5bWJvbF90b19jaGFycyksCi0JY29uZmlnL29iai1jb2ZmYmZkLmMgKHN5bWJvbF90b19jaGFycyk6IEdldCB2YWx1ZSB0byB3cml0ZSBvdXQKLQl1c2luZyBTX0dFVF9WQUxVRS0tZG9uJ3QgYXNzdW1lIGl0IGlzIGFscmVhZHkgc2V0LgotCSogY29uZmlnL29iai1pZWVlLmMgKGRvX3N5bWJvbHMpOiBTZXQgQkZEIHN5bWJvbCB2YWx1ZSB0byBnYXMKLQlzeW1ib2wgdmFsdWUuCi0JKiBjb25maWcvb2JqLXZtcy5jICh2YXJpb3VzKTogRG9uJ3QgYXNzaWduIGRpcmVjdGx5IHRvCi0JU19HRVRfVkFMVUU7IHVzZSBTX1NFVF9WQUxVRSBpbnN0ZWFkLgotCi1XZWQgSnVsIDE0IDA5OjM1OjIzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBzcGFyYzY0LSotYW91dCogdXNlIGJmZCBnYXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGg4MzAwaC4KLQotVHVlIEp1bCAxMyAxMjowOTo0NCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDg1MDAuYyAobGluZV9jb21tZW50X2NoYXJzKTogQWRkIGhhc2guCi0JKHBhcnNlX2V4cCwgc2tpcF9jb2xvbnRoaW5nLCBidWlsZF9ieXRlcyk6IEFkZCBzdXBwb3J0IGZvcgotCVJfSDg1MDBfSElHSDE2IHJlbG9jYXRpb24gdHlwZS4KLQotTW9uIEp1bCAxMiAxMToxNTozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgYEAnIHRvIGludHJvZHVjZSBhbgotCWF0dHJpYnV0ZSBuYW1lLiAgSGFuZGxlIGBleGVjaW5zdHInIGF0dHJpYnV0ZS4KLQotTW9uIEp1bCAxMiAwNzoyMjoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB3YXJuIG9uICdpJyBvciAnaicgbWlzbWF0Y2ggaWYKLQl0aGVyZSBpcyBhbm90aGVyIGFsdGVybmF0aXZlIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBKdWwgIDkgMTc6MzE6MzQgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm86IHVwZGF0ZXMgZm9yIEg4LzMwMEgKLQotVGh1IEp1bCAgOCAxNDo0MTo0MyAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwKLQltZF9udW1iZXJfdG9fY2hhcnMsIG1kX3NlY3Rpb25fYWxpZ24pOiBBZGp1c3RlZCB0byB1c2UgdmFsdWVULAotCWFkZHJlc3NULCB0byBtYXRjaCB0Yy5oLgotCi1UaHUgSnVsICA4IDE0OjE1OjA1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogUmV2YW1wIHRvIGhhbmRsZSBib3RoIHN5bnRheGVzLAotCWluZGVwZW5kZW50IG9mIGZvcm1hdC4KLQotVGh1IEp1bCAgOCAwNzoyNToyNSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoVENfQ09OU19SRUxPQyk6IFVzZSBSX1JFTExPTkcgaWYgaDgvMzAwaC4KLQotV2VkIEp1bCAgNyAxODoxMTowNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIENST1NTPS1EQ1JPU1NfQ09NUElMRSBpZiBpdCBpcyBhIGNyb3NzCi0JYnVpbGQ7IGFsc28gcmVjb2duaXplIGg4MzAwLSotY29mZgotCi1XZWQgSnVsICA3IDEwOjIxOjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc3ltYm9scy5jIChmYl9sYWJlbF9pbnN0YW5jZSwgZmJfbGFiZWxfaW5zdGFuY2VfaW5jKTogRG9uJ3QgZHVtcAotCWNvcmUganVzdCBiZWNhdXNlIHNvbWVib2R5IHVzZXMgYSBsYWJlbCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4KLQotCSogY29uZmlnL21pcHMtb3Bjb2RlLmg6IE1vdmVkIHRvIG9wY29kZS9taXBzLmguCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIG9wY29kZS9taXBzLmggcmF0aGVyIHRoYW4KLQltaXBzLW9wY29kZS5oLgotCShhcHBlbmRfaW5zbik6IEFuIGV4dHJhIE5PUCBpcyBvbmx5IG5lZWRlZCBhZnRlciBpbnN0cnVjdGlvbnMKLQl3aGljaCBzZXQgSEkgb3IgTE8sIG5vdCBhZnRlciBpbnN0cnVjdGlvbnMgd2hpY2ggcmVhZCBpdC4KLQkobWFjcm9fYnVpbGQsIG1pcHNfaXApOiBTdXBwb3J0IG5ldyAnRScsICdHJyBhbmQgJ0InIGFyZ3VtZW50cy4KLQkobWFjcm8pOiBjZmMxIGFuZCBjdGMxIG5vdyB0YWtlICJ0LEciIHJhdGhlciB0aGFuICJ0LGQiLgotCSogY29uZmlnL3RjLW1pcHMuaCAoc3RydWN0IG1pcHNfb3Bjb2RlKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL21pcHMtYmlnLm10LCBjb25maWcvbWlwcy1saXQubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOgotCVNldCB0byAkKHNyY2RpcikvLi4vaW5jbHVkZS9vcGNvZGUvbWlwcy5oLgotCi0JR2V0IHRoZSBNSVBTIGFzc2VtYmxlciB1cCB0byBzcGVlZCB3aXRoIG90aGVyIGdhcyBjaGFuZ2VzOgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX3NldF92bWEsIGVjb2ZmX2Zyb2Jfc3ltYm9sKToKLQlSZW1vdmVkOyBkb24ndCBjaGFuZ2UgdGhlIHN5bWJvbCB2YWx1ZS4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scywgZWNvZmZfYnVpbGRfcHJvY3MsIGVjb2ZmX2Zyb2JfZmlsZSk6IFVzZQotCWJmZF9hc3ltYm9sX3ZhbHVlIHJhdGhlciB0aGFuIFNfR0VUX1ZBTFVFIHRvIGluY2x1ZGUgc2VjdGlvbgotCXZtYSBpbiBzeW1ib2wgdmFsdWUuCi0JKGVjb2ZmX2Zyb2JfZmlsZSk6IElnbm9yZSBCU0ZfU0VDVElPTl9TWU0gc3ltYm9scywgc2luY2UgRUNPRkYKLQlkb2Vzbid0IG91dHB1dCB0aGVtLiAgU2V0IHRoZSB2bWEgb2Ygc2VjdGlvbnMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmg6IERvbid0IGRlZmluZSBvYmpfZnJvYl9zeW1ib2wuCi0JKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBBZGp1c3RtZW50IGJ5IHNlY3Rpb24gdm1hIGlzIG5vCi0JbG9uZ2VyIG5lY2Vzc2FyeS4KLQkodmFyaW91cyk6IHVzZSB2YWx1ZVQgcmF0aGVyIHRoYW4gbG9uZy4KLQotV2VkIEp1bCAgNyAwODozMzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChFTlY2NCk6IERlZmluZSBmb3IgdjkuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3h3b3JkKTogRm9yIG51bWJlcnMsIGNhbGwgYmlnX2NvbnMuCi0JKHNwYXJjX2lwLCBtZF9hcHBseV9maXgsIHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBzb21lIHNwYXJjNjQKLQlyZWxvY2F0aW9uIHR5cGVzLgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBIYW5kbGUgOC1ieXRlIHZhbHVlLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfc3ltYm9sKTogRm9yIHY5LCB1c2UgNjQtYml0IHN5bWJvbCB0eXBlLgotCi0JKiBhcy5oICh2YWx1ZVQpOiBUeXBlZGVmIG1vdmVkIGhlcmUuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAodmFsdWVUKTogLi4uZnJvbSBoZXJlLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBMb2NhbHMgZnJvbV9hZGRyLCB0b19hZGRyLAotCXRhYmxlX2FkZHIgYXJlIG5vdyBhZGRyZXNzVC4gIFN1cHBseSBwcm90b3R5cGUgZm9yIGJmZF9hbGxvYyBmb3IKLQlub3cuCi0JKGZpeHVwX3NlZ21lbnQpOiBMb2NhbCBhZGRfbnVtYmVyIGlzIG5vdyB2YWx1ZVQuICBDb3JyZWN0IHNvbWUKLQlyYW5nZS1jaGVja2luZyBidWdzLgotCShyZWxheF9hbGlnbik6IFR5cGUgYGludCcgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIHRoZSBleHBvbmVudC4KLQkoZml4X25ldyk6IEFyZ3VtZW50IG9mZnNldCBpcyB0eXBlIG9mZnNldFQuICBMb2NhbHMgc2l6ZSBhbmQKLQluZXdzaXplIGFyZSB0eXBlIHZhbHVlVC4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBGaWVsZHMgZnhfb2Zmc2V0IGFuZCBmeF9hZGRudW1iZXIgYXJlIG5vdwotCXR5cGUgdmFsdWVULgotCShmaXhfbmV3KTogRml4IHByb3RvdHlwZS4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IFN5bWJvbCB2YWx1ZSBpcyB0eXBlIHZhbHVlVC4KLQkoU19TRVRfVkFMVUUsIFNfR0VUX1ZBTFVFKTogTGlrZXdpc2UuCi0JKFNfSVNfKik6IFNwZWNpZnkgaW50IHJldHVybiB0eXBlIGV4cGxpY2l0bHkuCi0JKiBzeW1ib2xzLmggKHN5bWJvbF9uZXcsIFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IEZpeGVkCi0JcHJvdG90eXBlcy4KLQkqIHJlYWQuYyAoc19jb21tKTogVmFsdWVzIHJlYWQgYXJlIHR5cGUgdmFsdWVULgotCSogZXhwci5oIChleHByZXNzaW9uUyk6IEZpZWxkIFhfYWRkX251bWJlciBpcyBhbiBvZmZzZXRULgotCSogdGMuaCAobWRfY3JlYXRlX2xvbmdfanVtcCwgbWRfY3JlYXRlX3Nob3J0X2p1bXAsCi0JbWRfc2VjdGlvbl9hbGlnbik6IEFkZHJlc3NlcyBhcmUgbm93IHR5cGUgYWRkcmVzc1QuCi0JKG1kX251bWJlcl90b19jaGFycywgbWRfYXBwbHlfZml4KTogUGFzcyB2YWx1ZSBhcyB2YWx1ZVQuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwKLQltZF9udW1iZXJfdG9fY2hhcnMsIG1kX3NlY3Rpb25fYWxpZ24pOiBBZGp1c3RlZC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEluaXRpYWxpemUgYGxlbicgdmFyaWFibGUgdG8gbWFrZQotCWdjYyBzaHV0IHVwLgotCShtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwgbWRfbnVtYmVyX3RvX2NoYXJzLAotCW1kX3NlY3Rpb25fYWxpZ24pOiBBZGp1c3RlZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IFBlcm1pdCB1c2UgZm9yIG90aGVyIHRoYW4gYS5vdXQKLQlmb3JtYXQuCi0JKHNfY29tbW9uKTogSGFuZGxlIFNvbGFyaXMtMiB2ZXJzaW9uLgotCi0JKiBjb25maWcvaG8tZ2VuZXJpYy5oIChmcmVlKTogUmV0dXJucyB2b2lkIGlmIF9fU1REQ19fLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX2Zyb2Jfc3ltYm9sLCBlbGZfZnJvYl9maWxlLAotCWVsZl9maWxlX3N5bWJvbCk6IERlY2xhcmUuCi0KLQkqIGV4cHIuYyAoZmxvYXRpbmdfY29uc3RhbnQsIGludGVnZXJfY29uc3RhbnQpOiBOb3cgcmV0dXJuIHZvaWQuCi0KLVRodSBKdWwgIDEgMTI6MTM6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1hdGNoIG9uIHNwYXJjKi1mdWppdHN1LW5vbmUgcmF0aGVyIHRoYW4KLQlzcGFyY2xpdGUqLWZ1aml0c3Utbm9uZS4KLQotV2VkIEp1biAzMCAxMToxMjowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoY29ucyk6IENvbmRpdGlvbmFsaXplIHBhcnNpbmcgb2YgZXhwcmVzc2lvbi4gIE1vdmUKLQlwdXR0aW5nIHZhbHVlIGludG8gb2JqZWN0IGZpbGUgaW50byBzZXBhcmF0ZSBmdW5jdGlvbi4gIFNlcGFyYXRlCi0Jb3V0IE1SSSBhbmQgV0FOVF9CSVRGSUVMRFMgY2FzZXMgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMuCi0JKGVtaXRfZXhwcik6IE5ldyBmdW5jdGlvbiB0byB3cml0ZSBkYXRhIGludG8gb2JqZWN0IGZpbGUuCi0JQ29uZGl0aW9uYWxpemUgb24gVENfQ09OU19GSVhfTkVXIGFuZCBUQ19DT05TX1JFTE9DIHJhdGhlciB0aGFuIG9uCi0JcHJvY2Vzc29yIHR5cGVzLgotCShwYXJzZV9iaXRmaWVsZF9jb25zKTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIGJpdGZpZWxkIGV4cHJlc3Npb25zCi0JYXMgdXNlZCBieSBpOTYwIGFzc2VtYmxlcnMuICBPbmx5IGNvbXBpbGVkIGlmCi0JQklURklFTERfQ09OU19FWFBSRVNTSU9OUyBpcyBkZWZpbmVkLgotCShwYXJzZV9tcmlfY29ucyk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSBNUkkgc3R5bGUgc3RyaW5ncy4gIE9ubHkKLQljb21waWxlZCBpZiBNUkkgaXMgZGVmaW5lZC4KLQkocGFyc2VfcmVwZWF0X2NvbnMpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgcmVwZWF0IGNvdW50cy4gIE9ubHkKLQljb21waWxlZCBpZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBpcyBkZWZpbmVkLgotCSogcmVhZC5oIChlbWl0X2V4cHIpOiBBZGRlZCBkZWNsYXJhdGlvbiBvZiBuZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtYTI5ay5oIChUQ19DT05TX1JFTE9DKTogRGVmaW5lIHRvIGJlIFJFTE9DXzMyLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFRDX0NPTlNfUkVMT0MpOiBEZWZpbmUgdG8gYmUgUl9SRUxXT1JELgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEpOiBOZXcgZnVuY3Rpb24gdG8KLQlwYXJzZSBhIEhQUEEgZXhwcmVzc2lvbiwgcmF0aGVyIHRoYW4gc3BlY2lhbCBjYXNlIGluIGNvbnMKLQlmdW5jdGlvbi4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBOZXcgZnVuY3Rpb24gdG8gZW1pdCBhbiBIUFBBIGZpeHVwLCByYXRoZXIKLQl0aGFuIHNwZWNpYWwgY2FzZSBpbiBlbWl0X2V4cHIgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04sIFRDX0NPTlNfRklYX05FVyk6Ci0JRGVmaW5lIHRvIHVzZSBuZXcgZnVuY3Rpb25zIGZyb20gdGMtaHBwYS5jLgotCSogY29uZmlnL3RjLWk5NjAuaCAoQklURklFTERfQ09OU19FWFBSRVNTSU9OUyk6IERlZmluZS4KLQkoV0FOVF9CSVRGSUVMRFMpOiBSZW1vdmVkOyBub3cgb2Jzb2xldGUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChjb25zX2ZpeF9uZXdfbnMzMmspOiBOZXcgZnVuY3Rpb24gdG8gZW1pdCBhbgotCU5TMzJLIGZpeHVwLCByYXRoZXIgdGhhbiBzcGVjaWFsIGNhc2UgaW4gZW1pdF9leHByIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0NPTlNfRklYX05FVyk6IERlZmluZSB0byBiZQotCWNvbnNfZml4X25ld19uczMyay4gIEFsc28gdXNlIFBBUkFNUyByYXRoZXIgdGhhbiBjaGVja2luZwotCV9fU1REQ19fLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX0NPTlNfUkVMT0MpOiBEZWZpbmUgdG8gUkVMT0NfMzIuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZywgYWRqdXN0X3JlbG9jX3N5bXMsIHdyaXRlX2NvbnRlbnRzKToKLQlEb24ndCBjb3JlIGR1bXAgaWYgZ2FzIGhhcyBubyBpbmZvcm1hdGlvbiBhYm91dCBhIHNlY3Rpb24uCi0KLVdlZCBKdW4gMzAgMDY6MjE6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBJZiBzcGFyY3Y5IGlzIGRlZmluZWQsIHJlc2V0Ci0JY3VycmVudF9hcmNoaXRlY3R1cmUgdG8gdjkgYXV0b21hdGljYWxseS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBVc2UgZWxmNjQtc3BhcmMgZm9yIHY5LgotCi0JKiBjb25maWcvdGMtc3BhcmM2NC5oLCBjb25maWcvdGMtc3BhcmM2NC5jOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFVzZSBzcGFyYzY0IGNwdSBmaWxlcyBmb3IgdjksIGFuZCBkZWZhdWx0IHRvIGVsZgotCWZvcm1hdC4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQWx3YXlzIGZ1bGx5IHByb2Nlc3MgYSBzZWN0aW9uLgotCVNlY3Rpb24gc2l6ZSBpcyBsYXN0IGZyYWcncyAodm0pYWRkcmVzcyBwbHVzIGl0cyBzaXplLiAgSWYgbm8KLQlyZWxvY2F0aW9ucyBhcmUgcHJlc2VudCwgZm9yY2UgU0VDX1JFTE9DIGZsYWcgY2xlYXIuCi0JKGR1bXBfc2VjdGlvbl9yZWxvY3MpOiBOZXcgZGVidWdnaW5nIHJvdXRpbmUuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogTmV3IHJvdXRpbmUsIGJyb2tlbiBvdXQgZnJvbSB3cml0ZV9jb250ZW50cy4KLQlEb24ndCBhZGp1c3QgcmVsb2NzIHRoYXQgYXJlIGFscmVhZHkgcmVsYXRpdmUgdG8gc2VjdGlvbiBzeW1ib2wuCi0JTG9vayBmb3Igb2JqX2ZpeF9hZGp1c3RhYmxlIG1hY3JvIHRvIGtub3cgd2hhdCBlbHNlIHRvIHNraXAsCi0JaW5zdGVhZCBvZiBvYmpfd3JpdGVfc3ltYm9sLiAgTG9vayBmb3Igc2VjdGlvbiBzeW1ib2wgc3RvcmVkIGluCi0Jc2VjdGlvbiBpbmZvcm1hdGlvbi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBNYXAgYWRqdXN0X3JlbG9jX3N5bXMgb3ZlciBhbGwgc2VjdGlvbnMuCi0JKHdyaXRlX2NvbnRlbnRzKTogQ2xlYXIgU0VDX1JFTE9DIGZsYWcgaWYgbm8gcmVsb2NhdGlvbnMgYXJlCi0JZm91bmQuCi0KLQkqIGFzLmggKF9fUFRSX1RPX0lOVCwgX19JTlRfVE9fUFRSKTogTmV3IHZlcnNpb25zIGZvciBTYWJlciwgdG8KLQlrZWVwIGl0IHF1aWV0LgotCi0JKiB3cml0ZS5jIChyZW1vdmVfc3Vic2Vncyk6IERvbid0IGRlZmluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQotRnJpIEp1biAyNSAxNDo0Mjo1MyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwsIGR2aSwgaW5mbywgaW5zdGFsbC1pbmZvLCBjbGVhbi1pbmZvKTogZG8gbm90Ci0JICBlY2hvIHJlY3Vyc2lvbiBsaW5lcy4KLQkgIChpbnN0YWxsLWluZm8sIGNsZWFuLWluZm8pOiBjb2xsYXBzZSBpbnRvIHRoZSBkdmkgYW5kIGluZm8gcnVsZS4KLQotRnJpIEp1biAyNSAxMDo0NzoyNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZW1vdmUgc3VwcG9ydCBmb3IgJWQvJXEgZnAgcmVncy4KLQlBbGwgZnAgcmVncyBhcmUgbm93IHNwZWNpZmllZCBhcyAlZi4KLQkocHJpdl9yZWdfdGFibGUpOiBmcHEgLT4gZnEuCi0KLUZyaSBKdW4gMjUgMDM6NDM6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGFzLmggKHN0cnN0cik6IERpc2FibGUgZGVjbGFyYXRpb24gZm9yIG5vdy4KLQkoZnByaW50X3ZhbHVlLCBzcHJpbnRfdmFsdWUpOiBEZWNsYXJlLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXdfcmVzdCk6IFVzZSBtZW1zZXQgdG8gY2xlYXIgbmV3IGZyYWcuCi0JKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogSW5pdGlhbGl6ZSBhbGwgc2VnaW5mbyBmaWVsZHMuCi0KLQkqIGV4cHIuYyAoZXhwcl9wYXJ0KTogTWFkZSBzYW5pdHkgY2hlY2tzIGEub3V0LXNwZWNpZmljLgotCShleHByKTogRGlzYWJsZWQgc2FuaXR5IGNoZWNrcy4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSkgW0JGRF9BU1NFTUJMRVJdOiBBZGQgZmllbGQgZm9yCi0Jc2VjdGlvbiBzeW1ib2wuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBJbml0aWFsaXplIHNlY3Rpb24gc3ltYm9sIHBvaW50ZXIKLQl3aGVuIHNldHRpbmcgdXAgYSBuZXcgc2VjdGlvbi4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KSBbQkZEX0FTU0VNQkxFUl06IFBvaW50IEJGRCBzeW1ib2wncyB1ZGF0YQotCWZpZWxkIGJhY2sgYXQgZ2FzIHN5bWJvbCBzdHJ1Y3R1cmUuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDYXN0IG9ic3RhY2tfbmV4dF9mcmVlIHZhbHVlIHRvIGNoYXIqIGJlZm9yZQotCWRvaW5nIGFyaXRobWV0aWMgb24gaXQuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXdfcmVzdCk6IExpa2V3aXNlLgotCSogYXMuaCAoZnJhZ19ub3dfZml4KTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9maWxlX3N5bWJvbCk6IFVzZSBzdWJzZWdfbmV3IGluc3RlYWQgb2YKLQljYWxsaW5nIGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSBkaXJlY3RseSwgYW5kIGNhbGwgc3Vic2VnX3NldAotCWluc3RlYWQgb2Ygc3Vic2VnX2NoYW5nZS4gIE5vdyByZXR1cm5zIHZvaWQuCi0JKG9ial9lbGZfd3JpdGVfc3ltYm9sKTogT25seSBjaGVjayBsb2NhbCBzeW1ib2xzIGZvciBub3cuCi0JKGVsZl9zdGFiX3N5bWJvbCk6IE5vdyBzdGF0aWMgYW5kIHZvaWQsIGFuZCBkaXNhYmxlZCB1bnRpbCBpdAotCXdvcmtzIGNvbXBsZXRlbHkuCi0JKG9ial9lbGZfc2l6ZSk6IEZvciBleHByZXNzaW9uIHZhbHVlcywgZmFpbCBzaWxlbnRseSBmb3Igbm93LgotCShvYmpfc3ltYm9sX25ld19ob29rKTogRG8gbm90aGluZy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMgotCXJlbG9jYXRpb24uCi0JKHNfbG9jYWwpIFtPQkpfRUxGXTogTmV3IGZ1bmN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpIFtPQkpfRUxGXTogQ2FsbCBpdCBmb3IgImxvY2FsIi4KLQkoc19jb21tb24pOiBSZWFycmFuZ2UgdG8gaGFuZGxlIFNvbGFyaXMgLmNvbW1vbiBwc2V1ZG8sIHdoaWNoIG1heQotCXNvbWV0aW1lcyB1c2UgYnNzIHNwYWNlIGluc3RlYWQgb2YgY29tbW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBBZGQgbmV3IGBsb2NhbCcgZmllbGQuCi0KLVRodSBKdW4gMjQgMTY6MzM6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHNldCBob3N0IGNvbmZpZyB0byBocHV4IGZvciBocHBhKi1ocC1ocHV4Ci0KLVRodSBKdW4gMjQgMTM6MzU6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChhcHBfcG9wLCBhcHBfcHVzaCk6IEZpeCBidWcgcmVwb3J0ZWQgYnkgQ2hyaXMgQXJ0aHVyLgotCi1UdWUgSnVuIDIyIDAxOjA0OjIzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBEb24ndCBzcGVjaWFsLWNhc2UgYS5vdXQgLVIgZmxhZyBoZXJlLgotCSogY29uZmlnL29iai1hb3V0LmMgKHNfc2VjdCk6IERvIGl0IGhlcmUuCi0KLQkqIGFzLmggKEJBRF9DQVNFKTogRG9uJ3QgbWFrZSBzb21lIGxhbWUgY29tcGlsZXJzIHRoaW5rIHdlIHdhbnQKLQlzdWJzdGl0dXRpb24gaW5zaWRlIHN0cmluZ3MuCi0KLQkqIGFzLmMgKHByaW50X3ZlcnNpb25faWQpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG9mZiBmcm9tIG1haW4uCi0JKG1haW4pOiBDYWxsIGl0LgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BhcnNlX29wdGlvbikgW09CSl9FTEZdOiBQcmludCB2ZXJzaW9uIGlkCi0JZm9yIC1WLiAgSWdub3JlIC1RIGFuZCAtcyBvcHRpb25zIGZvciBub3cuCi0KLU1vbiBKdW4gMjEgMTc6Mzc6NTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFrZSBpbnN0YWxsYXRpb24gJiBidWlsZHMgd29yayBhZ2FpbiBmb3IgY3Jvc3NlcwotCi1TdW4gSnVuIDIwIDE4OjE4OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogUmV3cml0ZSB0byBwcmludCB3aWRlICg+MzIgYml0cykKLQlzeW1ib2wgdmFsdWVzIGNvcnJlY3RseS4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEZWxldGVkIHVudXNlZCB2YXJpYWJsZXMuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2Ugc3ByaW50X3ZhbHVlLgotCi0JKiBtZXNzYWdlcy5jIChzcHJpbnRfdmFsdWUsIGZwcmludF92YWx1ZSk6IE5ldyByb3V0aW5lcy4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3N0YWJfc3ltYm9sKTogTm93IHJldHVybnMgdm9pZC4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiBGaXggdHlwbyBpbiBsb2dpYy4KLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogTG9vayBpbiAuLi9iZmQgZm9yIGJmZC5oLgotCi0JKiBhcy5oIChhZGRyZXNzVCwgb2Zmc2V0VCk6IE5ldyB0eXBlcywgdXNpbmcgQkZEIHR5cGVzIGlmCi0JYXZhaWxhYmxlLgotCShyZWxheF9hZGRyZXNzVCwgc3RydWN0IGZyYWcpOiBVc2UgdGhlbS4KLQkqIHN0cnVjLXN5bWJvbC5oICh2YWx1ZVQsIHN0cnVjdCBicm9rZW5fd29yZCk6IExpa2V3aXNlLgotCi0JKiBhcy5oIChzdWJzZWdfbmV3KSBbQkZEX0FTU0VNQkxFUl06IE5hbWUgYXJndW1lbnQgaXMgY29uc3QuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogTmFtZSBhcmd1bWVudCBpcyBjb25zdC4KLQotVGh1IEp1biAxNyAxNjo1Mzo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2Fub25pY2FsaXplIGluc3RhbGwuc2g7IGZvciB1c2Ugd2l0aGluCi0JdGhpcyBkaXJlY3RvcnkgKGFuZCBzdWJkaXJzKQotCi1TdW4gSnVuIDIwIDAyOjM0OjA0IDE5OTMgIEFzaGxleSBTYXVsc2J1cnkgKGFuc0BzaWNzLnNlKQotCi0JKiBtODhrLW9wY29kZS5oIDogZml4ZWQgdGlueSB0aW55IG1pc3Rha2UgLSB4Y3Igd2FzIGluY29ycmVjdGx5Ci0Jc3BlY2lmaWVkLCBzaG91bGQgaGF2ZSBib3RoIFMxIGFuZCBTMiBmaWVsZHMgaWRlbnRpY2FsCi0JSWYgb25seSBmaW5kaW5nIHRoZSBwcm9ibGVtIHdhcyBhcyBmYXN0IGFzIGZpeGluZyB0aGUgYnVnICEhISEKLQotVHVlIEp1biAxNSAxNjowMTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogRG8gd3JpdGUgb3V0IG5vbi1sb2FkYWJsZSBzZWN0aW9ucy4KLQlEZWJ1ZyBzZWN0aW9ucyBjYW4gZmFsbCBpbiB0aGlzIGNhdGVnb3J5LgotCi0JKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBDYWxsIGVsZl9maWxlX3N5bWJvbCBmb3IgRUxGIGZpbGVzLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2ZpbGVfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc3RhYl9zeW1ib2xfc3RyaW5nKTogUmVuYW1lZCBmcm9tIHBhXy4uLiwKLQlhZGRlZCBhcmd1bWVudCB0byBzcGVjaWZ5IHNlY3Rpb24gYmFzZSBuYW1lLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6IFJlbmFtZWQgZnJvbSAuLi5fc3RhYi4gIE5ldyBhcmd1bWVudAotCXNwZWNpZmllcyBzZWN0aW9uIGJhc2UgbmFtZS4KLQkob2JqX2VsZl9zdGFiKTogTmV3IGZ1bmN0aW9uLCBjYWxscyBvYmpfZWxmX3N0YWJfZ2VuZXJpYyB3aXRoCi0JIi5zdGFiIiBhcyBzZWN0aW9uIGJhc2UgbmFtZS4KLQkob2JqX2VsZl94c3RhYik6IE5ldyBmdW5jdGlvbiwgY2FsbHMgb2JqX2VsZl9zdGFiX2dlbmVyaWMuCi0JKG9ial9lbGZfdHlwZSk6IEhhbmRsZSAib2JqZWN0Ii4gIFVzZSBiaXR3aXNlLW9yIHRvIG1lcmdlIGluCi0Jc3ltYm9sIGZsYWdzIHJhdGhlciB0aGFuIHNpbXBseSByZXBsYWNpbmcsIHNvIGdsb2JhbC9sb2NhbCBmbGFncwotCWFyZSBwcmVzZXJ2ZWQuCi0JKG9ial9lbGZfaWRlbnQpOiBSZXdyaXRlLgotCi1UdWUgSnVuIDE1IDE3OjAzOjI1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBwYXJlbnRkaXIgc3VwcG9ydDsgdXNlIElOU1RBTExfWEZPUk0KLQotV2VkIEp1biAgOSAxMToyNjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IC5hbGlnbiB1c2VzIGEgcG93ZXIgb2YgdHdvCi0JZm9yIGFueSBhLm91dCB0YXJnZXQsIG5vdCBqdXN0IExpbnV4IGFuZCAzODZCU0QuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChET1RfTEFCRUxfUFJFRklYKTogRG8gbm90IGRlZmluZSBmb3IgYW55IGEub3V0Ci0JdGFyZ2V0LgotCi1Nb24gSnVuICA3IDEzOjMzOjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW04OGsuYzogRG9uJ3QgaW5jbHVkZSBmbG9udW0uaCwgbWQuaCwgbTg4ay5oLiAgVGhleQotCWRvbid0IGV4aXN0IG9yIGR1cGxpY2F0ZSBvdGhlciBpbmNsdXNpb25zLgotCi0JKiBjb25maWcvdGMtdmF4LmggKE5PX1JFTE9DKTogRGVmaW5lLgotCi1Nb24gSnVuICA3IDA5OjU1OjAzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEZpeCBwYXJzaW5nIG9mIGFzaSBudW1iZXIuCi0JRml4IGVycm9yIG1lc3NhZ2UuCi0KLVNhdCBKdW4gIDUgMTk6MzI6NTIgMTk5MyAgVG9yYmpvcm4gR3Jhbmx1bmQgICh0ZWdlQG5hZGEua3RoLnNlKQotCi0JKiBnYXMvY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IEFkZCA4ODExMCBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvY29uZmlnL3RjLW04OGsuYyAoZ2V0X3JlZyk6IE5ldyBhcmcgcmVnX3ByZWZpeC4gIENvbXBhcmUgZmlyc3QKLQljaGFyIHRvIHJlZ19wcmVmaXggaW5zdGVhZCBvZiB0byAncicuCi0JKGNhbGNvcCk6IENoYW5nZSBjYWxscyB0byBnZXRfcmVnLgotCShjYWxjb3ApOiBIYW5kbGUgbmV3IGNhc2UgJ3gnIHRvIHNldCByZWdfcHJlZml4LgotCShjYWxjb3ApOiBTZXQgcmVnX3ByZWZpeCB0byAncicgYWZ0ZXIgZWFjaCBjYWxsIHRvIGdldF9yZWcuCi0JKGNtcHNsb3QpOiBBZGQgODgxMTAgY29uZGl0aW9ucy4KLQotCSogZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oOiBTd2FwIGNhc2VzIGZvciAicm90IiBmb3IgY29uc2lzdGVuY3kuCi0KLQkqIGdhcy9jb25maWcvdGMtbTg4ay5jIChnZXRfYmYpOiBBbHdheXMgcmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIKLQliZWZvcmUgcmV0dXJuaW5nLgotCi0JKiBnYXMvY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IE1ha2UgZXF1YWwgbW5lbW9uaWNzCi0JYWRqYWNlbnQ7IG1vdi5zIGFuZCBtb3YuZCBzd2FwcGVkLgotCShtODhrX29wY29kZXMpOiBGaXggdHlwbyBgcjInIC0+IGAyJy4KLQotRnJpIEp1biAgNCAxNTo1OTozMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaDgzMDAuYzogU3VwcG9ydCBmb3IgSDgvMzAwLUggb3Bjb2Rlcy4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHdfc3RyaW5ncyk6IFN0cmluZyB0YWJsZSBsZW5ndGggaXMgNAotCWJ5dGVzLCBubyBtYXR0ZXIgd2hhdCB0aGUgaG9zdCBpbnQgc2l6ZSBpcy4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLW9zZiopOiBOZXcuCi0KLUZyaSBKdW4gIDQgMDc6NTE6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lY29mZmwqKTogTmV3IHRhcmdldDsgdXNlIGVjb2ZmIGFuZAotCW1pcHMtbGl0LgotCShtaXBzLSotZWNvZmYqKTogQWRkZWQgdHJhaWxpbmcgJyonLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3Byb2NzKTogRm9yY2UgdGhlIGFkciBvZiB0aGUKLQlmaXJzdCBGRFIgaW4gYSBmaWxlIHRvIGJlIHplcm8uCi0KLVRodSBKdW4gIDMgMTQ6MDk6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEp1bXAgdG8gMi4xLjQuCi0KLQkqIGNvbmZpZy9oby1ocHBhYnNkLmg6IE5ldyBmaWxlLCBmcm9tIFBldGVyIEhvb2dlbmJvb20uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2Fzc2VtYmxlKTogQ2FsbCBiZmRfc2V0X2dwX3NpemUgb25seSBmb3IKLQlFQ09GRiBmb3JtYXQuCi0KLVR1ZSBKdW4gIDEgMTU6MjE6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hc3NlbWJsZSk6IFRoZSA2ODA0MCBjcHUgZG9lc24ndCB3YW50IGEKLQlzZXBhcmF0ZSAnODUxIG1tdS4KLQotCSogY29uZmlnL29iai1lbGYuYywgY29uZmlnL29iai1lbGYuaDogVXBkYXRlIGZvciBuZXcgdHlwZSwgbWFjcm8sCi0JYW5kIHJvdXRpbmUgbmFtZXMuICBBc3N1bWluZyAzMiBiaXRzIGZvciBub3cuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBMb29rIGZvciBtYWNybwotCWVsZl90Y19maW5hbF9wcm9jZXNzaW5nX2hvb2ssIGluc3RlYWQgb2YgYXNzdW1pbmcgYSBmdW5jdGlvbgotCWFsd2F5cyBleGlzdHMuCi0JKiBjb25maWcvdGMtaHBwYS5jIChlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nX2hvb2spOiBSZW5hbWVkIGZyb20KLQl0Y19maW5hbF9wcm9jZXNzaW5nX2hvb2suCi0JKiBjb25maWcvdGMtaHBwYS5oIChlbGZfdGNfZmluYWxfcHJvY2Vzc2luZ19ob29rKTogVXNlIGl0LgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChlbGZfdGNfc3ltYm9sLCBlbGZfdGNfbWFrZV9zZWN0aW9ucyk6IE1hY3JvcwotCW1vdmVkIGhlcmUgZnJvbSBvYmotZWxmLmguCi0JKiBjb25maWcvb2JqLWVsZi5oOiBEb24ndCBpbmNsdWRlIENQVS1zcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0KLVN1biBNYXkgMzAgMTY6NDk6MzcgMTk5MyAgUGV0ZXIgSG9vZ2VuYm9vbSAgKGhvb2dlbkBmYXN0LmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyYXRpb25zIHNob3VsZCBtYXRjaCBvbiAnaHBwYSonIG5vdCAnaHBwYScuCi0KLQkqIHJlYWQuYzogQWRkIHN1cHBvcnQgZm9yIEhQUEEgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4IChkZW5vdGVkCi0Jd2l0aCAnI2lmZGVmIFRDX0hQUEEnKS4KLQotCSogc3ltYm9scy5jOiBBZGQgc3VwcG9ydCBmb3IgSFBQQSBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXggKGRlbm90ZWQKLQl3aXRoICcjaWZkZWYgVENfSFBQQScpLgotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6ICBBZGQgc3VwcG9ydCBmb3IgSFBQQS1zdHlsZQotCXJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvb2JqLWVsZi5jOiBTdGFiIHN5bWJvbHMgd2VyZW4ndCB3cml0dGVuIHByb3Blcmx5LgotCShvYmpfZWxmX3ZlcnNpb24pOgotCShvYmpfZWxmX2Rlc2MpOgotCShvYmpfZWxmX3dyaXRlX3N5bWJvbCk6Ci0JKG9ial9lbGZfd3JpdGVfc3ltYm9sX3ApOgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKToKLQkoZWxmX3N0YWJfc3ltYm9sKToKLQkoZWxmX2Zyb2JfZmlsZSk6Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFN1cHBvcnQgZm9yIEhQUEEgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucy4KLQlSZW1vdmUgc29tZSB1bnVzZWQgY29kZS4gIFN1cHBvcnQgZm9yIEhQUEEgYXNzZW1ibHkgbGFuZ3VhZ2UKLQlzeW50YXguCi0KLQkqIGFwcC5jOgotCi0JKiBzeW1ib2xzLmM6Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmg6Ci0JKG9ial93cml0ZV9zeW1ib2wpOgotCShvYmpfZnJvYl9maWxlKToKLQkoZWxmX3RjX3N5bWJvbCk6Ci0JKGVsZl90Y19tYWtlX3NlY3Rpb25zKToKLQotCSogY29uZmlnL3RjLWhwcGEuaDoKLQotU3VuIE1heSAzMCAyMTo0NDo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcmVhZF9iZWdpbl9ob29rLCBhZGRfZmlsZSk6IEFzc3VtZQotCWhhc2hfbmV3IHdpbGwgaGF2ZSBzdWNjZWVkZWQgaWYgaXQgcmV0dXJucy4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2JlZ2luKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogTm93IG5ieXRlc19yX2xlbmd0aCBpcwotCWNvbnN0LgotCShtb2RlX2Zyb21fZGlzcF9zaXplLCBvcGNvZGVfc3VmZmljX3RvX3R5cGUpOiBOb3cgaW5saW5lIHVuZGVyCi0JZ2NjLgotCShmaXRzX2luX3tzaWduZWQsdW5zaWduZWR9X3tieXRlLHdvcmR9KTogTGlrZXdpc2UuCi0KLQkqIGV4cHIuYzogRGVsZXRlIHJlZ2lzdGVyIGRlY2xhcmF0aW9uczsgZ2NjIGlnbm9yZXMgdGhlbSBhbnl3YXlzLgotCi1GcmkgTWF5IDI4IDE5OjAzOjMyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaGFzaC5jIChoYXNoX25ldyk6IFVzZSB4bWFsbG9jLCBzaW5jZSBtYW55IGNhbGxlcnMgZG9uJ3QgY2hlY2sKLQlmb3IgZmFpbHVyZS4KLQotVGh1IE1heSAyNyAxMzowMjoxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGZyYWdzLmMgKHplcm9fYWRkcmVzc19mcmFnLCBic3NfYWRkcmVzc19mcmFnKTogVGhlc2UgYXJlCi0JZXh0ZXJuYWwuCi0KLQkqIHRjLmggKG1kX3JlbG9jX3NpemUpOiBUaGlzIGlzIGNvbnN0LgotCSogY29uZmlnL3RjLXthMjlrLGg4MzAwLGg4NTAwLGkzODYsaTg2MCxpOTYwLG02OGssbnMzMmssejhrfS5jCi0JKG1kX3JlbG9jX3NpemUpOiBOb3cgY29uc3QuCi0KLQkqIGNvbmZpZy9hb3V0X2dudS5oIChlbnVtIG1hY2hpbmVfdHlwZSwgZW51bSByZWxvY190eXBlKTogRGVsZXRlCi0JdHJhaWxpbmcgY29tbWFzLgotCSogYXMuaCAoZW51bSBfc2VnVCk6IERpdHRvLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoTl9UWVBFX3NlZyk6IFRoaXMgc2hvdWxkIGJlIGNvbnN0LgotCi1UaHUgTWF5IDI3IDExOjQzOjU5IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGFkZF9maWxlKTogQ2FzdCBmaWxlX25hbWUgdG8gY2hhciAqIGluCi0JbGlzdGluZ19zb3VyY2VfZmlsZSBjYWxsLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc3RhYl9zeW1ib2xfc3RyaW5nKTogQ2FzdCBmaXJzdCBhcmd1bWVudAotCW9mIHN1YnNlZ19uZXcgY2FsbCB0byBlbGltaW5hdGUgY29uc3QgYXR0cmlidXRlLgotCShvYmpfZWxmX3N0YWIpOiBEaXR0by4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IENhc3QgZmlyc3QgYXJndW1lbnQgb2YgYnplcm8gY2FsbCB0byBjaGFyICouCi0KLQkqIHJlYWQuYyAoc19hbGlnbl9ieXRlcyk6IFByb3Blcmx5IHJlY29yZCBhbGlnbm1lbnQuCi0KLQkqIGV4cHIuYyAoX18pOiBVbmRlZmluZSBfXyBtYWNybyBiZWZvcmUgdXNlLCBzaW5jZSBPU0YvMSB1c2VzIGl0Ci0JZm9yIHRoZSBwcm90b3R5cGUvbm8gcHJvdG90eXBlIG1hY3JvLgotCi0JKiBhcy5jIChnb3Rfc2lnKTogRG9uJ3QgZG8gcmV0dXJuICgoU0lHVFkpIDApLCBTSUdUWSBtaWdodCB3ZWxsIGJlCi0Jdm9pZC4KLQotCSogYXMuaCAocmVsYXhfc3RhdGVUIGVudW0pOiBEZWxldGUgdHJhaWxpbmcgY29tbWEuCi0KLVRodSBNYXkgMjcgMTE6MDc6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBMZXQgbGluZV9jb21tZW50X2NoYXJzIG92ZXJyaWRlCi0JY29tbWVudF9jaGFycy4KLQkoZG9fc2NydWJfbmV4dF9jaGFyKTogSWYgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIGlzIG5vdCBhdCB0aGUKLQlzdGFydCBvZiBhIGxpbmUsIHRyZWF0IGl0IGFzIGEgY29tbWVudCBjaGFyYWN0ZXIgaWYgaXQgaXMgb25lLgotCUZvciBhIENQUCBsaW5lIGNvbW1lbnQgdXNlIHBzZXVkby1vcCAuYXBwbGluZSByYXRoZXIgdGhhbiAubGluZS4KLQkqIGlucHV0LXNjcnViLmMgKGxvZ2ljYWxfaW5wdXRfbGluZSk6IE1ha2UgaW50IHJhdGhlciB0aGFuCi0JdW5zaWduZWQuCi0JKGlucHV0X3NjcnViX3B1c2gsIGlucHV0X3NjcnViX2JlZ2luKTogSW5pdGlhbGl6ZQotCWxvZ2ljYWxfaW5wdXRfbGluZSB0byAtMSByYXRoZXIgdGhhbiAwLgotCShidW1wX2xpbmVfY291bnRlcnMpOiBJbmNyZW1lbnQgbG9naWNhbF9pbnB1dF9saW5lLgotCShuZXdfbG9naWNhbF9saW5lKTogSWYgbGluZV9udW1iZXIgaXMgLTIsIGRlY3JlbWVudAotCWxvZ2ljYWxfaW5wdXRfbGluZS4KLQkoYXNfd2hlcmUpOiBVc2UgbG9naWNhbF9pbnB1dF9saW5lIGV2ZW4gaWYgaXQgaXMgMC4KLQkqIHJlYWQuaCAoc19hcHBfZmlsZSBwcm90b3R5cGUpOiBOb3cgdGFrZXMgYW4gaW50IGFyZ3VtZW50LgotCSogcmVhZC5jIChwb3RhYmxlKTogTWFrZSAuYXBwZmlsZSBjYWxsIHNfYXBwX2ZpbGUgd2l0aCAxLiAgTmV3Ci0JLmFwcGxpbmUgcHNldWRvLW9wIGNhbGxzIHNfYXBwX2xpbmUuCi0JKHNfYXBwX2ZpbGUpOiBJZiAuYXBwZmlsZSwgY2FsbCBuZXdfbG9naWNhbF9saW5lIHdpdGggLTIgdG8KLQlhY2NvdW50IGZvciBuZXdsaW5lIGluc2VydGVkIGJ5IGRvX3NjcnViX25leHRfY2hhci4gIElmIGxpc3RpbmcsCi0JY2FsbCBsaXN0aW5nX3NvdXJjZV9maWxlLgotCShzX2FwcF9saW5lKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSBmYWtlIHBzZXVkby1vcCAuYXBwbGluZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogTWFrZSAuYXBwbGluZSBjYWxsCi0Jb2JqX2NvZmZfbG4uCi0JKG9ial9jb2ZmX2xuKTogQWRkZWQgYXJndW1lbnQgdG8gaW5kaWNhdGUgd2hldGhlciAuYXBwbGluZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfcHNldWRvX3RhYmxlKTogTWFrZSAuYXBwbGluZSBjYWxsCi0Jb2JqX2NvZmZfbG4uCi0JKG9ial9jb2ZmX2xuKTogQWRkZWQgYXJndW1lbnQgdG8gaW5kaWNhdGUgd2hldGhlciAuYXBwbGluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZmlsZSk6IFBhc3MgYXJndW1lbnQgdG8gc19hcHBfZmlsZS4KLQotVHVlIE1heSAyNSAxMTo1OTowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0dFVF9WQUxVRSk6IFJlbW92ZWQgdW5uZWNlc3NhcnkgY2FzdC4KLQotVGh1IE1heSAyMCAxOToxNDoyNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogU3RyYWlnaHRlbiBvdXQgY2hlY2sgZm9yCi0JaW52YWxpZCB2YWx1ZXMuCi0KLVdlZCBNYXkgMTkgMDc6MzM6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg1MDAwLmMgKGJ1aWxkX2J5dGVzKTogVW5kZXJzdGFuZCBAcmQgbW9kZSBhbmQgYnVpbGQKLQlyZWxvY2F0aW9ucyBjb3JyZWN0bHkuCi0KLU1vbiBNYXkgMTcgMTU6MDY6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogTGVhdmUgb3V0IFRFWEkyRFZJIGZvciBub3csIGJlY2F1c2UKLQlpdCdzIHdyb25nLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IEFwcGx5IHJhbmdlIGNoZWNrcyBhbmQgd2FybgotCWlmIHZhbHVlIGlzIG91dCBvZiByYW5nZS4KLQotCVBhdGNoIGZyb20gTWluaCBUcmFuLUxlOgotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRm9yIGluL291dCBwb3J0IHJlZ2lzdGVyIHVzZWQKLQlhcyBiYXNlIHJlZywgaW5jbHVkZSBJbk91dFBvcnRSZWcgaW4gb3BlcmFuZCB0eXBlLgotCShNQVRDSCk6IEFjY2VwdCBvdmVybGFwIHZhbHVlIG9mIEluT3V0UG9ydFJlZy4KLQotTW9uIE1heSAxNyAwOToyOTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoYWRkX2ZpbGUsIG9ial9lY29mZl9sb2MsIG9ial9lY29mZl9zdGFiKToKLQlBZGQgY2FsbHMgdG8gbGlzdGluZyByb3V0aW5lcyB0byBwcm9kdWNlIGNvbWJpbmVkIHNvdXJjZS9hc3NlbWJsZXIKLQlsaXN0aW5ncy4KLQkob2JqX2Vjb2ZmX3N0YWIpOiBDcmVhdGUgYSBmaWxlIHBvaW50ZXIgaWYgbm9uZSB1c2VkIHlldC4KLQkoZWNvZmZfZnJvYl9maWxlKTogU2V0IHN5bWNvdW50IHRvIGNvcnJlY3QgdmFsdWUuCi0KLUZyaSBNYXkgMTQgMDY6NTM6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byB2ZXJzaW9uIDIuMSwgaW4gcHJlcGFyYXRpb24gZm9yCi0JcmVsZWFzZS4KLQotCSogY29uZmlnL29iai1hb3V0LmggKEhfR0VUX0hFQURFUl9TSVpFLCBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSk6Ci0JRGVmaW5lIGluIHRlcm1zIG9mIGNvbnN0YW50cywgbm90IEMgc3RydWN0dXJlIHNpemVzLgotCi0JKiBjb25maWcvdGMtcnM2MDAwLmMsIGNvbmZpZy90Yy1yczYwMDAuaDogRGVsZXRlIGVtcHR5IGZpbGVzLgotCi1UaHUgTWF5IDEzIDE3OjAxOjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9oZWFkZXJfYXBwZW5kKTogRG9uJ3QgZGVmaW5lIGlmIGl0J3MKLQlkZWZpbmVkIGFzIGEgbWFjcm8uCi0JKiBjb25maWcvb2JqLWhwMzAwLmggKG9ial9oZWFkZXJfYXBwZW5kKTogRGVmaW5lIGl0IGFzIGEgbWFjcm8uCi0JKiBjb25maWcvb2JqLWhwMzAwLmMgKGhwMzAwX2hlYWRlcl9hcHBlbmQpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCBib3RoZXIgY2xlYW5pbmcgdXAgZG9jIGZpbGVzOwotCXRoZXkgYXJlbid0IGdvaW5nIHRvIGJlIGluIHRoaXMgZGlyZWN0b3J5LgotCi1UaHUgTWF5IDEzIDA3OjUxOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSGFuZGxlIGFic29sdXRlCi0Jc3ltYm9scy4KLQotCSogdGMuaCAoVENfQ09GRl9TSVpFTUFDSERFUCk6IERvbid0IGRlZmluZSBoZXJlLgotCSogY29uZmlnL3RjLXNoLmggKFRDX0NPRkZfU0laRU1BQ0hERVApOiBEZWZpbmUgaGVyZSBpbnN0ZWFkLgotCi1Nb24gTWF5IDEwIDA2OjAxOjEyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfU3ltYm9sX3R5cGVfbGlzdCk6IERvbid0IGJvdGhlciB3aXRoCi0JaW5pdGlhbGl6YXRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0cyk6IFRyZWF0IG02OCotKi1zeXN2KiBsaWtlIG02OGstKi1jb2ZmLgotCi1XZWQgTWF5ICA1IDE0OjAwOjQ5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBDb3JyZWN0IGZsb2F0aW5nIHBvaW50IGRvdWJsZSB3b3JkCi0JbG9hZHMgYW5kIHN0b3JlcyBmb3IgYmlnIGVuZGlhbiB0YXJnZXQuCi0KLVdlZCBNYXkgIDUgMDg6Mzk6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFJlcGxhY2UgU0VHXyogd2l0aCAqX3NlY3Rpb24sIGZpeCB1cCBzdWJzZWdfKgotCWNhbGxzLiAgRGVsZXRlZCBzb21lIHVudXNlZCBjb2RlLgotCSogY29uZmlnL29iai1jb2ZmLmM6IExpa2V3aXNlLgotCi0JRUxGIHN1cHBvcnQsIG1vc3RseSBjb250cmlidXRlZCBieSBVdGFoOgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uLCBvYmpfZWxmX3N0YWIsIG9ial9lbGZfbGluZSwKLQlvYmpfZWxmX3R5cGUpOiBSZXdyaXRlLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sLCBlbGZfc3RhYl9zeW1ib2xfc3RyaW5nLCBlbGZfc3RhYl9zeW1ib2wsCi0Jb2JqX2VsZl9kZXNjLCBvYmpfZWxmX3ZlcnNpb24sIG9ial9zeW1ib2xfbmV3X2hvb2ssIG9ial9lbGZfc2l6ZSk6Ci0JTmV3IGZ1bmN0aW9ucy4KLQkob2JqX2VsZl9pZGVudCk6IER1bW15LgotCSogY29uZmlnL29iai1lbGYuaCAoRkFMU0UsIFRSVUUsIFNfKiwgdGNfZnJvYl9zeW1ib2wsCi0JVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBOZXcgbWFjcm9zLgotCShnZGJfc2VjdGlvbik6IE5ldyB2YXJpYWJsZSBkZWNsLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hdG9mKTogUmV0dXJuIHplcm8sIG5vdCBlbXB0eSBzdHJpbmcsIG9uCi0Jc3VjY2Vzcy4KLQotCUJGRF9BU1NFTUJMRVIgY29uZGl0aW9uYWwgY2hhbmdlczoKLQkqIGNvbmZpZy9vYmotY29mZi5jIChsaW5lbm9fcm9vdFAsIHNlZ19OX1RZUEUsICpfc2VjdGlvbl9oZWFkZXIpOgotCURvbid0IGRlZmluZSB0aGVzZS4KLQkoU0FfU0VUX1NZTV9FTkRORFgsIFNBX1NFVF9TWU1fVEFHTkRYKTogTmV3IGZ1bmN0aW9ucy4KLQkoZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uKTogRGl0dG8uCi0JKG9ial9jb2ZmX2VuZGVmKTogQ2FsbCBmZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24uCi0JKHN0cnVjdCBsaW5lX25vKTogTmV3IHR5cGUuCi0JKGNfc3ltYm9sX21lcmdlKTogTmV3IHdheSBmb3IgY29weWluZyBhdXggZmllbGRzLgotCShjX2RvdF9maWxlX3N5bWJvbCk6IFB1dCBzeW1ib2wgaW4gYWJzb2x1dGUgc2VjdGlvbiwgYW5kIHNldCBmbGFnCi0JQlNGX0RFQlVHR0lORy4KLQkoZnVuY3Rpb25fbGluZW9mZik6IE5ldyBzeW1ib2wuCi0JKGZ1bmN0aW9uX2xpbmVvZmYsIHRleHRfbGluZW5vX251bWJlciwgb3VyX2xpbmVub19udW1iZXIsCi0JbGluZW5vX2xhc3RQKTogRG9uJ3QgZGVmaW5lLgotCShjX2xpbmVfbmV3KTogRG9uJ3QgZGVmaW5lLgotCShvYmpfZW1pdF9saW5lbm8sIG9ial9jb2ZmX2VuZGVmKTogVXNlIGFib3J0IGNhbGxzIGFzLCB1aCwKLQlwbGFjZWhvbGRlcnMsIHVudGlsCi0JbGluZS1udW1iZXIgcmVjb3JkaW5nIGdldHMgaW1wbGVtZW50ZWQuCi0JKG9ial9uZXdfc3ltYm9sX2hvb2spOiBOZXcgY29kZSBmb3IgaGFuZGxpbmcgYXV4IGZpZWxkcy4KLQkoYWRkX2xpbmVubywgYWRkX2xpbmVzeW0pOiBOZXcgZnVuY3Rpb25zLgotCShvYmpfY29mZl9sbik6IENhbGwgYWRkX2xpbmVubywgbm90IGNfbGluZV9uZXcuCi0JKG9ial9jb2ZmX2VuZGVmKTogTmV3IGNvZGUgZm9yIGhhbmRsaW5nIHN5bWJvbCBuYW1lcy4gIE5ldyBsaW5lbm8KLQljb2RlLiAgTG9vayBmb3Igc2VjdGlvbiBuYW1lICIqREVCVUcqIiBmb3IgZGVidWdnaW5nIHNlY3Rpb24uCi0JKGFsaWduLCBjb2ZmX2NoZWNrX2ZpbGVfc3ltYm9scywgb2JqX2NvZmZfc2VjdGlvbiwKLQljb2ZmX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogUmVvcmRlcmVkIHNvbWUgaW5jbHVkZXMuCi0JKEJZVEVfT1JERVJJTkcsIEZJTEVfSEVBREVSX01BR0lDLCBzZWdfTl9UWVBFLCBOX1RZUEVfc2VnLAotCURFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSwgQU9VVEhEUiwgQU9VVEhEUlNJWkUpOiBEb24ndAotCWRlZmluZSB0aGVzZS4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMsIEk5NjBfU1lNX0ZJRUxEUyk6IE5ldyBtYWNyb3MuCi0JKFNZTV9BVVhFTlQpOiBOZXcgbWFjcm8gKGZvciBub24tQkZEX0FTU0VNQkxFUiB0b28pIGZvciBhY2Nlc3NpbmcKLQlhdXggZW50cmllcy4gIE1vc3QgU0FfKiBtYWNyb3Mgbm93IHVzZSBpdCB1bmNvbmRpdGlvbmFsbHkuCi0JKFNfKik6IFVzZSBgYnN5bScgZmllbGQsIGFuZCBhY2Nlc3MgQkZEIHByaXZhdGUgZGF0YS4KLQkoU0ZfKik6IFVzZSBgc3lfZmxhZ3MnIHN5bWJvbCBmaWVsZCBmb3IgbW9zdCBvZiB0aGVzZS4KLQkoSF8qLCBvYmplY3RfaGVhZGVycywgbGluZW5vLCBsaW5lbm9fKlAsIE9CSl9FTUlUX0xJTkVOTyk6IERvbid0Ci0JZGVmaW5lLgotCSgqX3NlY3Rpb25faGVhZGVyKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfY29udmVydF9mcmFnLCBtZF9hcHBseV9maXgpOiBDaGFuZ2VkCi0JaW50ZXJmYWNlLgotCSh0Y19nZW5fcmVsb2MpIFtJMzg2Q09GRl06IE5ldyBmdW5jdGlvbi4KLQkodGNfYW91dF9maXhfdG9fY2hhcnMsIHRjX2NvZmZfZml4MnJ0eXBlKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0FSQ0gsIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogTmV3Ci0JbWFjcm9zLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc3RhY2tfaW5pdCk6IERvbid0IGRvIGFzc2lnbm1lbnRzIGluc2lkZQotCWNvbmRpdGlvbnMuCi0JKG9ial9jb2ZmX2RlZik6IFNpbXBsaWZpZWQgaGFuZGxpbmcgb2Ygc3ltYm9sIG5hbWUgYSBiaXQuCi0JKHRhZ19pbnNlcnQpOiBOYW1lIGFyZ3VtZW50IGlzIG5vdyBwb2ludGVyIHRvIENPTlNULgotCShvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogQ29tbWVudGVkIG91dC4KLQotCSogY29uZmlnL29iai1jb2ZmLmg6IFVzZSBQQVJBTVMgbWFjcm8gaW4gcHJvdG90eXBlcy4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKSBbQkZEX0FTU0VNQkxFUl06IERvbid0IGluZGlyZWN0Ci0JdGhyb3VnaCBmcmNoYWluUCBwb2ludGVyIGlmIGl0IGlzIG51bGwuCi0KLQkqIGNvbmZpZ3VyZS5pbjogV2FybiBpZiBCRkQgbW9kZSBpcyBleHBsaWNpdGx5IHR1cm5lZCBvZmYgYnV0IGlzCi0JcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHRhcmdldC4KLQkobWlwcyBlY29mZiB0YXJnZXRzKTogRG9uJ3QgbmVlZCB0byBzZXQgYmZkX2dhcyBoZXJlOyBpdCBnZXRzCi0JdGFrZW4gY2FyZSBvZiBsYXRlci4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGNyYXdsX3N5bWJvbHMpOiBEb24ndCBjbGVhciBzeV9mb3J3YXJkCi0JZmllbGQuCi0JKHlhbmtfc3ltYm9scyk6IE1lcmdlIHN5bWJvbHMgb25seSBpZiBzeV9mb3J3YXJkIGlzIG51bGwuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKEFPVVRfTUFDSFRZUEUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeQotCWRlZmluZWQuCi0KLQkqIHRjLmggKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBTZWN0aW9uIGFyZyBpcyBub3QKLQlwb2ludGVyLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnKSBbQkZEX0FTU0VNQkxFUl06IERpdHRvLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpIFtPQkpfRUxGXTogQW55dGhpbmcgc3RhcnRpbmcKLQl3aXRoICIuIiBpcyBhIGxvY2FsIGxhYmVsLgotCi0JKiBjb25maWcvdGUtaHBwYS5oLCBjb25maWcvdGMtaHBwYS5oLCBjb25maWcvdGMtaHBwYS5jOiBOZXcgY29uZmlnCi0JZmlsZXMuCi0KLQkqIGNvbmZpZy90ZS1saW51eC5oLCBjb25maWcvdGUtMzg2YnNkLmg6IE5ldyBjb25maWcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1saW51eCwgaTM4Ni0qLWJzZCk6IFVzZSB0aGVtLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0ZPUk1BVCk6IFNlbGVjdCBmb3JtYXQgYmFzZWQgb24gdGFyZ2V0Ci0JZW52aXJvbm1lbnQuCi0JKERPVF9MQUJFTF9QUkVGSVgpOiBEb24ndCBkZWZpbmUgZm9yIDM4NmJzZCBvciBMaW51eC4KLQotV2VkIE1heSAgNSAxMzoxNDowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoaW5pdF9maWxlKTogU2V0IGZNZXJnZSB0byAwIHNpbmNlIGRieCBzZWVtcwotCXRvIHdhbnQgaXQgdGhhdCB3YXkuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBUdXJuIGxvY2FsIHN0X1Byb2Mgc3ltYm9scyBpbnRvCi0Jc3RfU3RhdGljUHJvYyBzeW1ib2xzLiAgU2V0IGluZGV4IGZpZWxkIG9mIGV4dGVybmFsIHN0X1Byb2MgYW5kCi0Jc3Rfc3RhdGljUHJvYyBzeW1ib2xzIGNvcnJlY3RseS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKE5PX0xJU1RJTkcpOiBEb24ndCBkZWZpbmUuICBQZW9wbGUgbWlnaHQgd2FudAotCWxpc3RpbmdzLgotCi1UdWUgTWF5ICA0IDIxOjIyOjU0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1ocDMwMC5oLCBjb25maWcvb2JqLWhwMzAwLmMsIGNvbmZpZy90ZS1ocDMwMC5oOiBOZXcKLQlmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWhwdXgpOiBVc2UgdGhlbS4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9wcmVfd3JpdGVfaG9vayk6IFVzZSBBT1VUX1ZFUlNJT04gaWYKLQlkZWZpbmVkLCBvdGhlcndpc2UgemVyby4KLQotCSogY29uZmlnL2FvdXRfZ251LmggKE9NQUdJQyk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLU1vbiBNYXkgIDMgMTU6NTk6MzIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFsbG93IGFueSBhYnMgZXhwcmVzc2lvbiBhcyBhbgotCWFkZHJlc3Mgc3BhY2UgbnVtYmVyLgotCi1XZWQgQXByIDI4IDE5OjExOjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoVEFSR0VUX0RFRkFVTFQpOiBEb24ndCBkZWZhdWx0IHRoaXMgYXQgYWxsLgotCi0JKiBjb25maWcvdGMtYTI5ay5jOiBJbmNsdWRlIGN0eXBlLmguCi0JKGRlZmluZV9zb21lX3JlZ3MpOiBBZGRlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXJzIGZvciAyOTA1MC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoY29tbWVudF9jaGFycykgW1RFX0kzODZBSVhdOiBJbmNsdWRlICIvIi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCBTVFlQX1JFRyBoZXJlLgotCShjaGFuZ2VfdG9fc2VjdGlvbik6IFNldCBpdCBoZXJlIGluc3RlYWQuCi0KLVdlZCBBcHIgMjggMTM6NDA6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogTWFrZSB1cCBhIC5maWxlIGlmIG9uZQotCWhhc24ndCBiZWVuIHNlZW4geWV0LgotCShhZGRfZWNvZmZfc3ltYm9sKTogRG9uJ3QgcmVmZXIgdG8gY3VyX2ZpbGVfcHRyIGlmIGl0IGlzIE5VTEwuCi0KLU1vbiBBcHIgMjYgMTg6Mjk6MDUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jaCwgY29uZmlnL3RjLXNoLmg6IE5ldyBmaWxlcyBzdXBwb3J0aW5nIEhpdGFjaGkKLQlTSC4KLQotTW9uIEFwciAyNiAxMjoyODoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEZpeCB1bmFyeSBwbHVzIG9wZXJhdG9yIChwcmV2aW91c2x5IHdhcyB0aGUKLQlzYW1lIGFzICd+JyBvcGVyYXRvciEpLgotCi1XZWQgQXByIDIxIDAwOjIwOjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IERlZmluZSBldmVuIGlmIEJGRCBpcyBkZWZpbmVkLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvIGRlZmluZSBpZiBCRkRfQVNTRU1CTEVSLiAgSW52b2tlCi0Jb2JqX2NoZWNrX2ZpbGVfc3ltYm9scyBpZiBkZWZpbmVkLiAgQ2FsbCB2ZXJpZnlfc3ltYm9sX2NoYWluXzIKLQlpbnN0ZWFkIG9mIG9wZW4tY29kaW5nIGl0LiAgRml4IHNvbWUgYnVncyBpbiBwYXRjaGluZyB1cCBzeW1ib2wKLQljaGFpbi4KLQkocmVsYXhfc2VnbWVudCk6IE1ha2Ugc29tZSBjb2RlIHdlICJvdWdodCB0byBiZSBhYmxlIHRvIiB1c2UgZm9yCi0JYWxsIHRhcmdldHMgbm8gbG9uZ2VyIGNvbmRpdGlvbmFsaXplZCBvbiBuczMyayB0YXJnZXQ7IGluc3RlYWQsIGRvCi0JaXQgYWx3YXlzLCBhbmQgaWYgdGhlIGFwcHJvcHJpYXRlIGNvbmRpdGlvbnMgZmFpbCwgYWJvcnQuCi0KLQkqIHN5bWJvbHMuYyAoREVCVUcpOiBFbmFibGVkLgotCShzeW1ib2xfbmV3KTogTWFrZSBzdXJlIGJmZF9tYWtlX2VtcHR5X3N5bWJvbCB3b3Jrcy4KLQkodmVyaWZ5X3N5bWJvbF9jaGFpbl8yKTogTmV3IGZ1bmN0aW9uOyB0YWtlcyBvbmUgc3ltYm9sIGFzCi0JYXJndW1lbnQsIGFueXdoZXJlIGluIHRoZSBjaGFpbi4KLQkoZG9sbGFyX2xhYmVsKik6IFVzZSBkZWZhdWx0IGluaXRpYWxpemVycy4KLQotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogQ2FsbCBtZF9iZWdpbiBoZXJlLi4uCi0JKG1haW4pOiAuLi5hbmQgbm90IGhlcmUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBVc2UgYS5vdXQtc3Vub3MtYmlnIGZvciBhLm91dC4KLQkodGNfZnJvYl9zeW1ib2wpOiBOZXcgbWFjcm86IEdldCByaWQgb2Ygc3ltYm9scyBpbiByZWdfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLW02OGsuYyAob21hZ2ljKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCShhZGRfZml4LCBhZGRfZnJhZyk6IE5vdyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBtYWNyb3MuCi0JKG02OGtfcmVnX3BhcnNlLCBtNjhrX2lwLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgZ2V0X251bSwKLQlzX2RhdGExLCBzX2RhdGEyLCBzX2Jzcyk6IFVzZSBuZXcgKl9zZWN0aW9uIG5hbWVzLCBmb3IKLQljb21wYXRpYmlsaXR5IHdpdGggQkZEX0FTU0VNQkxFUiBtb2RlOyByZXdyaXRlIHN3aXRjaCBzdGF0ZW1lbnRzCi0JdG8gaGFuZGxlIG5vbi1pbnRlZ3JhbCBzZWdULgotCSh0Y19jb2ZmX2ZpeDJydHlwZSwgdGNfYW91dF9maXhfdG9fY2hhcnMsCi0JdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCSh0Y19nZW5fcmVsb2MpOiBOZXcgcm91dGluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQkobWRfYXBwbHlfZml4LCBtZF9hcHBseV9maXhfMik6IFJlbmFtZWQgb2xkIG1kX2FwcGx5X2ZpeCB0bwotCW1kX2FwcGx5X2ZpeF8yOyBuZXcgbWRfYXBwbHlfZml4IGRlZmluaXRpb24gdmFyaWVzIGludGVyZmFjZQotCWRlcGVuZGluZyBvbiBCRkRfQVNTRU1CTEVSLgotCShtZF9jb252ZXJ0X2ZyYWcsIG1kX2NvbnZlcnRfZnJhZ18xKTogTGlrZXdpc2UuICBVc2UgbmV3ICpfc2VjdGlvbgotCW5hbWVzLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBJbmNsdWRlIGNvbmZpZy5oLgotCSh2ZXJzaW9uX3N0cmluZyk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogVXNlIEdBU19WRVJTSU9OIGluc3RlYWQuCi0JKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZik6IE5ldyBmdW5jdGlvbiwgdGFrZW4gZnJvbSBWTVMgY29kZSBpbgotCXN5bWJvbHMuYy4KLQkoX2RvcHJudCk6IERlbGV0ZWQuCi0JKFZNU19TdG9yZV9TdHJ1Y3QsIFZNU19EZWZfU3RydWN0LCBWTVNfU2V0X1N0cnVjdCwKLQlWTVNfVEJUX0Jsb2NrX0VuZCwgZ2V0X1ZNU190aW1lX29uX3VuaXgsIGdlbmVyYXRlX3N1ZmZpeCwKLQlWTVNfUHNlY3RfU3BlYyk6IEZpeGVkIHRvIGNvbXBpbGUgdW5kZXIgdHJhZGl0aW9uYWwgQy4KLQkqIGNvbmZpZy9vYmotdm1zLmg6IFVzZSBQQVJBTVMgbWFjcm8uCi0JKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZik6IERlY2xhcmUuCi0JKFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTik6IE5ldyBtYWNyby4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBSZW1vdmUgc29tZSBWTVMtc3BlY2lmaWMgY29kZSwgbG9vayBmb3IKLQlSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04gbWFjcm8gaW5zdGVhZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IERvbid0IHRyeSBleHBhbmRpbmcgREJjYwotCWluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLWkzODYuYzogUmVvcmRlcmVkIHNvbWUgZnVuY3Rpb25zIHNvIGlubGluaW5nIG1pZ2h0Ci0Jd29yay4gIFVzZSBQQVJBTVMgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCShyZWxvYyk6IE5ldyByb3V0aW5lLgotCShtZF9hc3NlbWJsZSk6IFJlYXJyYW5nZSBzd2l0Y2ggc3RhdGVtZW50cyB0byB3b3JrIHdpdGgKLQlub24taW50ZWdyYWwgc2VnVC4KLQotCSogc3RydWMtc3ltYm9sLmggW0JGRF9BU1NFTUJMRVJdOiBVbmRlZmluZQotCVNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgYmVmb3JlIGRlZmluaW5nIGl0LgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXdfcmVzdCk6IE5vdyBzdGF0aWMuCi0KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IEJldHRlciBlcnJvciBtZXNzYWdlIGZvciBkaWZmZXJlbmNlIG9mCi0Jc3ltYm9scyBpbiBkaWZmZXJlbnQgZnJhZ3MuCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFBhc3MgZG93biBzb21lIG5ldyB2YXJpYWJsZXMsIGluZGljYXRpbmcKLQlwYXRobmFtZSBvciBwcm9ncmFtIG5hbWUgZm9yIGNjLCBubSwgb2JqZHVtcC4KLQotCSogYXMuaCAoT1VUUFVUX0ZMQVZPUik6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBVc2UgT1VUUFVUX0ZMQVZPUi4KLQotCSogY29uZmlndXJlLmluOiBJbml0aWFsaXplIGJmZF9nYXMgcHJvcGVybHkuICBXYXJuIHRoYXQgRUxGCi0Jc3VwcG9ydCBpcyBpbmNvbXBsZXRlLgotCi1UaHUgQXByIDE1IDIyOjM5OjA1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChmbG9hdF9jb25zKTogQWNjZXB0IG51bGwgcG9pbnRlciByZXR1cm4gZnJvbSBtZF9hdG9mLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXRvZik6IFJldHVybiBudWxsIGZvciBzdWNjZXNzLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2F0b2YpOiBEaXR0by4KLQotVGh1IEFwciAxNSAxNjowNDozOSAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMudGV4aW5mbzogZm9ybWF0dGluZyBhbmQgY29tbWVudCBjbGVhbnVwczsgc2hvdyBTUEFSQwotCWFsdGVybmF0aXZlIG9wdGlvbnMgaW4gc2FtZSBzdHlsZSBhcyBvdGhlciBtYWNoaW5lczsgc2ltcGxpZnkgc29tZQotCWNvbmRpdGlvbmFsIHVzZTsgaW5jbHVkZSBHUEwgYXMgc2VwYXJhdGUgZmlsZSAoZnJvbSB0ZXhpbmZvIGRpcikKLQotCSogZG9jL01ha2VmaWxlLmluOiAoYXMuaW5mbykgaW5jbHVkZSBkaXJlY3RvcnkgY29udGFpbmluZyBHUEwgaW4KLQltYWtlaW5mbyBzZWFyY2ggcGF0aAotCi0JKiBkb2MvaDgudGV4aTogbmV3IGZpbGU7IGNvbmRpdGlvbmFsIHNldHRpbmdzIGZvciBHQVMgbWFudWFsCi0Jb24gSGl0YWNoaSBjaGlwcwotCi1UdWUgQXByIDEzIDE1OjMxOjQwIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBtZW50aW9uIFNQQVJDIGFyY2hpdGVjdHVyZSBvcHRpb25zLgotCi1GcmkgQXByICA5IDE3OjQzOjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlYXJyYW5nZWQgd2hpdGVzcGFjZSBpbiBwZXItaG9zdC9wZXItdGFyZ2V0Ci0Jc2VjdGlvbnMuICBBZGRlZCBob29rcyBmb3IgZHJvcHBpbmcgaW4gSFBQQSBzdXBwb3J0IChub3QgaW5jbHVkZWQKLQl5ZXQpLiAgU2VwYXJhdGUgb3V0IG92ZXJyaWRlcyBvZiB2YXJpYWJsZXMgYmFzZWQgb24gdGFyZ2V0IGZvcm1hdAotCWFuZCBiZmQtZ2FzIHNlbGVjdGlvbiBmcm9tIGFjdHVhbCB0YXJnZXQtc3BlY2lmaWMgY29tbWFuZHMuICBBZGQKLQllcnJvciBtZXNzYWdlIGZvciByZWNvZ25pemVkIGJ1dCB1bnN1cHBvcnRlZCBmb3JtYXQgbmFtZS4KLQotRnJpIEFwciAgOSAwOTowNTo0NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoZWNvZmZfYnVpbGRfbGluZW5vKTogTWFrZSBpbGluZU1heCBpbgotCXN5bWJvbGljIGhlYWRlciBtYXRjaCBjbGluZSBpbiBGRFI7IHRoZSBuYXRpdmUgbGlua2VyIHNlZW1zIHRvCi0Jd2FudCB0aGF0LgotCi1UaHUgQXByICA4IDE1OjUxOjI4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluOiBhcy50ZXhpbmZvIGlzIGluICQoc3JjZGlyKS4gIFVzZQotCSQoc3JjZGlyKS9hcy50ZXhpbmZvIGV4cGxpY2l0bHkgaW4gc2V2ZXJhbCBwbGFjZXMKLQotVGh1IEFwciAgOCAxNToxNTowMiAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHVwZGF0ZSBkdmksIGNsZWFuIHRhcmdldHMgZm9yIG5ldyBzb3VyY2UKLQkJCSAgIGZpbGUgc3RydWN0dXJlCi0KLVRodSBBcHIgIDggMTI6NTI6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tZGVjc3RhdG4uaDogRGVmaW5lIEJST0tFTl9BU1NFUlQgaWYgbm90IF9fR05VQ19fLAotCXJhdGhlciB0aGFuIHVuZGVmaW5pbmcga25vdy4KLQkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggdWx0cml4Kiwgbm90IGp1c3QgdWx0cml4LgotCi1XZWQgQXByICA3IDIwOjE4OjEwIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBjb252ZXJ0ZWQgY29uZGl0aW9uYWwgbWFya3VwIHRvIHVzZSBuZXcKLQlUZXhpbmZvIGZhY2lsaXRpZXMsIGF2b2lkaW5nIG00LgotCi0JKiBkb2MvYXMtYWxsLnRleGluZm8sIGFsbC5tNCwgcHJldGV4Lm00OiBkZWxldGVkLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHJlY2FzdCBkb2MgY29uZmlndXJhdGlvbiB0byB1c2UgYSBsaW5rIHRvIGFuCi0JaW5jbHVkZWQgdGV4aW5mbyBmaWxlLgotCi0JKiBkb2MvYWxsLnRleGk6IHNldHRpbmdzIGZvciBnZW5lcmljIGZvcm0gb2YgZG9jdW1lbnRhdGlvbi4KLQotVHVlIEFwciAgNiAxMTo1NjoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoY29ucyk6IFplcm8gb3V0IGZyYWcgd2hlbiBjcmVhdGluZyByZWxvYy4KLQotTW9uIEFwciAgNSAwOTo0MTo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGdwX3JlZmVyZW5jZSk6IENlcnRhaW4gbWFnaWMgc3ltYm9scyBjYW4gbmV2ZXIKLQliZSByZWZlcmVuY2VkIG9mZiB0aGUgR1AgcmVnaXN0ZXIuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBIYW5kbGUgc3RhdGVzIDkgYW5kIDEwIGNvcnJlY3RseQotCXdoZW4gZGVhbGluZyB3aXRoIGNoYXJhY3RlcnMgb2YgdHlwZSBMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVCwKLQlMRVhfSVNfU1RSSU5HUVVPVEUsIGFuZCBMRVhfSVNfT05FQ0hBUl9RVU9URS4KLQotCSogY29uZmlnL3RlLWlyaXguaDogTmV3IGZpbGU7IGlyaXggbmVlZHMgYSBkaWZmZXJlbnQgTE9DQUxfTEFCRUwKLQlkZWZpbml0aW9uIGZyb20gb3RoZXIgTUlQUyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChtaXBzLSotaXJpeCk6IFVzZSBlbXVsYXRpb24gaXJpeC4KLQotU3VuIEFwciAgNCAxNToyMTowOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4NTAwLmM6IEdldCByZWxheCBzaXplIG9mIGJyYW5jaCBpbnN0cnVjdGlvbnMgcmlnaHQsCi0JKGdldF9vcGVyYW5kKTogUGFyc2UgQHNwKyBjb3JyZWN0bHkuCi0KLUZyaSBBcHIgIDIgMTU6NTk6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKSBbQkZEX0FTU0VNQkxFUl06IERvbid0IGluY2x1ZGUKLQlDT0ZGIHNlY3Rpb24gaGVhZGVyIGZpZWxkLgotCi0JKiBjb25maWd1cmUuaW46IFByaW50IGVycm9yIG1lc3NhZ2UgaWYgaG9zdCBvciB0YXJnZXQgaXMgbm90Ci0Jc3VwcG9ydGVkLgotCi0JKiBjb25maWd1cmUuaW46IElmIHdpdGgtYmZkLWFzc2VtYmxlciwgdXNlIG9iai1jb2ZmIGluc3RlYWQgb2YKLQlvYmotY29mZmJmZC4KLQotCSogY29uZmlnL2hvLWdlbmVyaWMuaDogSW5jbHVkZSBzdHJpbmcuaC4KLQotRnJpIEFwciAgMiAwODo1NDo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMKTogVHJlYXQgYW55IGxhYmVsIHN0YXJ0aW5nIHdpdGgKLQknJCcgYXMgbG9jYWwsIGZvciBhbnkgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IE9wdGltaXphdGlvbnMgdG8gYnJhbmNoaW5nIGNvZGUgYW5kIGEKLQljb3VwbGUgb2YgYnVnIGZpeGVzIGZyb20gcmFscGhjQHB5cnBzNS5lbmcucHlyYW1pZC5jb20gKFJhbHBoCi0JQ2FtcGJlbGwpLgotCi0JKiBjb25maWcvaG8taXJpeC5oOiBOZXcgZmlsZTsgaWYgbm90IGdjYywgZGVmaW5lIEJST0tFTl9BU1NFUlQuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXgqKTogU2V0IGdhc19ob3N0IHRvIGlyaXguCi0KLVdlZCBNYXIgMzEgMTc6NTM6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBTZXQgb3V0cHV0X3NlY3Rpb24gb2YgbmV3IHNlY3Rpb24uCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtbHlfcGFzcyk6IERvbid0IHNldCBvdXRwdXRfc2VjdGlvbiBoZXJlLgotCSogZXhwci5jIChleHByX3BhcnQsIGV4cHIpOiBUdXJuIG9mZiBzZWN0aW9uIGFzc2VydGlvbnMgZm9yIEVDT0ZGLAotCXNpbmNlIGl0IGhhcyBhZGRpdGlvbmFsIHNlY3Rpb25zLgotCSogcmVhZC5jIChzX2xjb21tKTogRm9yIE1JUFMgRUNPRkYsIHB1dCBzbWFsbCBvYmplY3RzIGluIC5zYnNzLAotCW5vdCBic3Nfc2VjdGlvbi4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBBZGRlZAotCWVjb2ZmX3VuZGVmaW5lZCBmaWVsZC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IEluaXRpYWxpemUKLQllY29mZl91bmRlZmluZWQgZmllbGQuCi0JKGFkZF9maWxlKTogSWYgdXNpbmcgc3RhYnMsIGp1c3Qgb3V0cHV0IGEgc3RhYnMgc3ltYm9sIHJhdGhlciB0aGFuCi0JY3JlYXRpbmcgYSBuZXcgZmRyLgotCShvYmpfZWNvZmZfYmVnaW4sIG9ial9lY29mZl9iZW5kKTogSWdub3JlIGxpbmUgbnVtYmVyIGJ5IHJlYWRpbmcKLQlpdCB3aXRoIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uLCByYXRoZXIgdGhhbiBza2lwcGluZyBpdCBieSBoYW5kLgotCShvYmpfZWNvZmZfbG9jKTogSWYgdXNpbmcgc3RhYnMsIGp1c3Qgb3V0cHV0IGEgc3RhYnMgc3ltYm9sIHJhdGhlcgotCXRoYW4gRUNPRkYgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCi0JKG9ial9lY29mZl9zdGFiKTogQWNjZXB0IG5vbi16ZXJvIHZhbHVlcyBmb3Igc3RhYnMgbGluZSBudW1iZXIuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBTZXQgaWZpbGVzeW0gY29ycmVjdGx5LiAgU2V0IHN0b3JhZ2UgY2xhc3MKLQl0byBzbWFsbCwgdW5kZWZpbmVkIGFuZC9vciByZWFkb25seSBzZWN0aW9ucyBpZiBhcHByb3ByaWF0ZS4KLQlEb24ndCBvdXRwdXQgc3ltYm9sIG5hbWVzIGNvbnRhaW5pbmcgXDAwMSBjaGFyYWN0ZXJzLgotCShlY29mZl9mcm9iX2ZpbGUpOiBNYWtlIHN1cmUgYXQgbGVhc3Qgb25lIGZkciBpcyBvdXRwdXQuCi0JKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgVENfTUlQUy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGdfc3dpdGNoX3ZhbHVlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYXNzZW1ibGUpOiBTZXQgZ3Agc2l6ZSBvZiBvdXRwdXQgQkZELgotCShncF9yZWZlcmVuY2UpOiBOZXcgZnVuY3Rpb247IHJldHVybnMgMSBpZiBleHByZXNzaW9uIGNhbiBiZQotCWFjY2Vzc3NlZCB2aWEgZ3AuICBBbHdheXMgcmV0dXJucyAwIGlmIG5vdCB1c2luZyBFQ09GRi4KLQkobWFjcm9fYnVpbGQpOiBDb252ZXJ0IEJGRF9SRUxPQ19MTzE2IHRvIEJGRF9SRUxPQ19NSVBTX0dQUkVMIGlmCi0JcG9zc2libGUuCi0JKG1hY3JvKTogR2VuZXJhdGUgc2VxdWVuY2VzIHVzaW5nIGdwIGlmIHBvc3NpYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZ25vcmUgLUVMIGFuZCAtRUIuICBQYXJzZSAtRy4KLQkobWRfYXBwbHlfZml4KTogQWRkZWQgQkZEX1JFTE9DX01JUFNfR1BSRUwgdG8gaWdub3JlZCBjYXNlLgotCShzX2NoYW5nZV9zZWMpOiBIYW5kbGUgLnJkYXRhIGFuZCAuc2RhdGEgZm9yIEVDT0ZGLgotCShzX2V4dGVybik6IE1hcmsgc3ltYm9sIGFzIGV4dGVybmFsLiAgU2V0IGVjb2ZmX3VuZGVmaW5lZCBmaWVsZC4KLQotVHVlIE1hciAzMCAxMDoxMTo0MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IERvbid0IGNhbGwgYXNfcGVycm9yIGZvcgotCWZpbGVuYW1lIHJlamVjdGVkIGJ5IGFwcGxpY2F0aW9uLgotCi0JKiBhcy5jIChtYWluKSBbQkZEX0FTU0VNQkxFUl06IElmIGVycm9ycyBvY2N1ciwgY2xvc2UgYW5kIHVubGluawotCXRoZSBvdXRwdXQgZmlsZS4KLQotCSogZG9jL2FzLnRleGluZm86IERvbid0IHVzZSBAdmFsdWUgaW4gbm9kZSBuYW1lcyBmb3IgdGhlIG1vbWVudDsKLQlyZWZlcmVuY2VzIGRvbid0IGFwcGVhciB0byB3b3JrIHJpZ2h0LgotCi0JKiBhcy5oIChjb25zdCwgdm9sYXRpbGUpOiBQdXQgdGhlc2UgZGVmaW5pdGlvbnMgYmFjaywgYW5kIHVzZQotCXRoZW0uCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBGaXJzdCBwYXNzIGF0IHVzaW5nIG5ldyB0ZXhpbmZvIGZlYXR1cmVzIC0tCi0JdmFyaWFibGVzLCBjb25kaXRpb25hbCB0ZXN0cy4gIEZhciBmcm9tIGNvbXBsZXRlLgotCi1Nb24gTWFyIDI5IDE2OjA1OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiBUZW1wb3JhcnkgaGFjayB0byBoYW5kbGUgc29tZSA2NC1iaXQgY29uc3RhbnRzLiAgVGhpcwotCXNob3VsZCBiZSByZWRvbmUgbGF0ZXIuCi0JKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZS4KLQkoYmlnX2NvbnMpOiBJZiBpdCdzIHNldCwgcmV2ZXJzZSBvcmRlciBvZiBieXRlcyBiZWluZyBjb3BpZWQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBTZXQgdGFyZ2V0X2JpZ19lbmRpYW4uCi0KLQkqIHJlYWQuYyAoc19pZ25vcmUpOiBEZWxldGUgZGVjbGFyYXRpb24gb2YgaXNfZW5kX29mX2xpbmUuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jICh5YW5rX3N5bWJvbHMpOiBCdWlsZCBsaXN0IG9mIGZpbGUgc3ltYm9sCi0JZm9yd2FyZCBwb2ludGVycyBwcm9wZXJseS4KLQotTW9uIE1hciAyOSAxMzo0NzozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBGaXggYnVnIHdoZXJlIG5yZWxvY3MKLQl3YXNuJ3QgYmVpbmcgc3RvcmVkIGludG8gc2NuaGRyLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IEFkZCBwcm90b3R5cGUgb2Ygc19nZXRfc2VnbWVudC4KLQkqIHJlYWQuYyAoVENfU1RBUlRfTEFCRUwpOiBEZWZhdWx0IGRlZmluaXRpb24uCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFVzZSBUQ19TVEFSVF9MQUJFTCBtYWNybyB0byB3b3JrIG91dAotCWlmIGEgbGFiZWwgaGFzIGJlZW4gc2Vlbi4KLQotTW9uIE1hciAyOSAxMjo1Njo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRERFRiBhbmQgQkZETElCIGF0IHRoZSB0b3Agb2YgTWFrZWZpbGUsIG5vdAotCXRoZSBib3R0b20gKG1ha2UgZXhwYW5kcyB2YXJpYWJsZXMgaW4gZGVwZW5kZW5jaWVzIHdoZW4gdGhlCi0JZGVwZW5kZW5jaWVzIGFyZSByZWFkLCBub3Qgd2hlbiB0aGV5IGFyZSB1c2VkKS4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCBOT0xPQUQgYml0IGZvcgotCWEyOWsgLmJzcyBzZWN0aW9uOyB0aGUgbW9uZGZlIHByb2dyYW0gZG9lc24ndCBsaWtlIGl0LgotCi1TdW4gTWFyIDI4IDA4OjEyOjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBVc2UgUEFSQU1TIG1hY3JvLCBhbmQgdXNlIENPTlNUIGluc3RlYWQgb2YKLQljb25zdC4KLQkoY3VycmVudF9hcmNoaXRlY3R1cmUpOiBEb24ndCBuZWVkIGluaXRpYWxpemVyLgotCi1GcmkgTWFyIDI2IDA4OjEyOjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZG9jL25vbmUubTQ6IERlZmluZSBaODAwMC4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoYXMtKi50ZXhpbmZvKTogUmVmZXIgdG8gJChzcmNkaXIpLiAgUmVtb3ZlIHRoZQotCXRleGluZm8gZmlsZSBiZWZvcmUgcmVjcmVhdGluZyBpdC4KLQkoVEVYSTJEVkkpOiBOZWVkIHRvIHNldCBURVhJTlBVVFMgaWYgIm1ha2UgYXMuZHZpIiBpcyB0byB3b3JrIGluCi0JdGhpcyBkaXJlY3RvcnkuCi0JKHNyY2Rpcik6IERlbGV0ZSBzZWNvbmQsIGJvZ3VzIGRlZmluaXRpb24uCi0JKGFzLmluZm8pOiBMb29rIGZvciBhcy0qLnRleGluZm8gaW4gY3VycmVudCBkaXJlY3RvcnkgcmF0aGVyIHRoYW4KLQlpbiAkKHNyY2RpcikuCi0JKGFzLmR2aSk6IERpdHRvLgotCShkdmkpOiBOZXcgcnVsZS4KLQkqIGRvYy9jb25maWd1cmUuaW46IENyZWF0ZSBsaW5rcyB0byBhbGwgYXMtKi50ZXhpbmZvIGZpbGVzIGluIHRoZQotCXNvdXJjZSBkaXJlY3RvcnksIGlmIHRoYXQncyBub3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCi0JKiBjb25maWd1cmUuaW4gKHBlci1ob3N0KTogIEFjY2VwdCBNSVBTIGhvc3Qgd2l0aCBCU0QgdmVyc2lvbgotCW51bWJlci4KLQkocGVyLXRhcmdldCk6IENsYXNzaWZ5IGk0ODYgYXMgaTM4Ni4gIFVzZSBnZW5lcmljIGNwdV90eXBlIGluc3RlYWQKLQlvZiB0YXJnZXRfY3B1IGluIHNlbGVjdGluZyBmb3JtYXQgZXRjLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogVXNlIC5hcHBmaWxlLCBub3QgLmFwcC1maWxlLgotCSogcmVhZC5jIChwb3RhYmxlKTogQ2hhbmdlIC5hcHAtZmlsZSB0byAuYXBwZmlsZS4KLQotCSogY29uZmlnL2hvLWRlY3N0YXRuLmg6IFJlbmFtZWQgZnJvbSBoby1kZWNzdGF0aW9uLmguCi0JKiBjb25maWd1cmUuaW46IEFkanVzdGVkLgotCi0JKiBjb25maWcvb2JqLWJmZC1zdW5vcy4qOiBVbnVzZWQ7IGRlbGV0ZWQuCi0KLQkqIE1ha2VmaWxlLmluICh2ZXJzaW9uLmMsIHZlcnMtc3RhbXApOiBEZWxldGVkLgotCShjb25maWcuaCk6IERlZmluZSBHQVNfVkVSU0lPTi4KLQkqIGFzLmMgKHZlcnNpb25fc3RyaW5nKTogRGVsZXRlZCBkZWNsYXJhdGlvbi4KLQkobWFpbik6IExvb2sgZm9yIEdBU19WRVJTSU9OIGluc3RlYWQuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBVcGRhdGVkIGRlc2NyaXB0aW9uIG9mIC1hKiAobGlzdGluZykgb3B0aW9ucywKLQlhbmQgZGVzY3JpYmUgaG93IHRvIHBhc3MgdGhlbSB0aHJvdWdoIGZyb20gZ2NjLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IERvbid0IGFsbG9jYXRlIHN0b3JhZ2Ugb3IKLQlwcm9jZXNzIHJlbG9jcyBpZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jcyB0byBwcm9jZXNzLiAgQXZvaWRzCi0JbWFsbG9jL2ZyZWUgYnVnIG9uIFNDTyB0b28uCi0KLQkqIGFzLmg6IE1vdmUgbG9jYWwgaW5jbHVkZSBmaWxlcyBiZWxvdyBzeXN0ZW0gaW5jbHVkZSBmaWxlcywgdG8KLQlhdm9pZCBzb21lIHJlZGVmaW5pdGlvbiBjb21wbGFpbnRzIG9uIHNvbWUgc3lzdGVtcy4KLQkoY29uc3QsIHZvbGF0aWxlKTogRG9uJ3QgbmVlZCB0aGVzZSBjb25kaXRpb25hbGx5IGRlZmluZWQgaWYgd2UKLQl1c2UgQ09OU1QgYW5kIFZPTEFUSUxFIGZyb20gYW5zaWRlY2wuaC4KLQkoc2VnX25hbWUpOiBVc2UgQ09OU1QsIG5vdCBjb25zdC4KLQotRnJpIE1hciAyNiAxMDoyMjowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlaW5kZW50ZWQgdG8gR05VIHN0YW5kYXJkcy4KLQotVGh1IE1hciAyNSAwODo1OToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogUmVtb3ZlIGEyOWsgc3BlY2lhbCBjYXNlLgotCShmaXh1cF9zZWdtZW50KTogQWRkIGEyOWsgc3BlY2lhbCBjYXNlOyB0aGUgbGlua2VyIGlzIG5vdCBwcmVwYXJlZAotCXRvIHNlZSBhIHNlZ21lbnQgb2Zmc2V0IGhlcmUuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBZGRlZCBuZXcgc3RhdGUsIDEwLCBtb2RpZnlpbmcgc3RhdGUKLQk5IHRvIG9ubHkga2VlcCBhIHNwYWNlIGluIGJldHdlZW4gaWRlbnRpZmllciBjaGFyYWN0ZXJzLgotCi1XZWQgTWFyIDI0IDAyOjE2OjIyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGR2aSB0YXJnZXQ7IGFzLSQoY29uZmlnKS50ZXhpbmZvIG1pZ2h0IGxpdmUgaW4KLQlzcmNkaXIsIG1pZ2h0IGJlIGluIG9iamRpci4KLQotCSogZG9jL01ha2VmaWxlLmluOiBkdmkgZGVwZW5kcyBvbiBhcy5kdmkKLQotTW9uIE1hciAyMiAyMzo1OToxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1Nb24gTWFyIDIyIDE2OjI1OjU3IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWRkIHN1cHBvcnQgZm9yIG1lbWJhciBtYXNrIG5hbWVzLgotCUFkZCBtaXNzaW5nIGNvbG9ucyBpbiBwcmVmZXRjaCBlcnJvciBtZXNzYWdlcy4gIEFkZCBzdXBwb3J0IGZvcgotCUFTSSBuYW1lcy4KLQotTW9uIE1hciAyMiAxMDoxOTowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogVXNlICRBVCBmb3IgYW55IGZsb2F0aW5nIHBvaW50IGxvYWQuCi0KLVNhdCBNYXIgMjAgMTI6NTA6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHVydGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEZvciBvcGVyYW5kIHR5cGUgJ00nLCByZWplY3QKLQliaWdudW1zLCBidXQgZG9uJ3QgZW1pdCBlcnJvciBtZXNzYWdlLgotCi1GcmkgTWFyIDE5IDIxOjAyOjE5IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRhcmctY3B1Lm8pOiBEZXBlbmQgb24gY29uZmlnLmguCi0KLVdlZCBNYXIgMTcgMTY6NDQ6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQWRkZWQgbmV3IHN0YXRlLCA5LCB0byBhdm9pZAotCWRyb3BwaW5nIGEgc3BhY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFuIGlkZW50aWZpZXIuCi0JKiBleHByLmMsIHdyaXRlLmM6IFJld3JvdGUgYXNzZXJ0IGV4cHJlc3Npb25zIHRvIG5vdCB1c2UgbXVsdGlwbGUKLQlsaW5lczsgSSBkb24ndCB0aGluayB0aGF0IGNhbiBiZSBkb25lIHBvcnRhYmx5LgotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBVc2UgJEFUIGlmIHRhcmdldCByZWdpc3RlciBpcyB6ZXJvIGluCi0JbG9hZCBpbnN0cnVjdGlvbiwgd2hpY2ggaXQgY2FuIGJlIGZvciBhIGZsb2F0aW5nIHBvaW50IGxvYWQuCi0KLU1vbiBNYXIgMTUgMTI6MTc6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IENvbXB1dGUgdGhlIHJlbG9jcyBiZWZvcmUgd3JpdGluZyBvdXQKLQl0aGUgc2VjdGlvbiBjb250ZW50cy4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCwgY29uZmlnL29iai1lY29mZi5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGdldAotCXN5bWJvbCB0YWJsZSBhbmQgdmFsdWVzIHJpZ2h0LgotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBJZiBPQkpfRUNPRkYsIGFueSBsYWJlbCBzdGFydGluZwotCXdpdGggJEwgaXMgbG9jYWwuCi0JKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBJZiBPQkpfRUNPRkYsIGFkanVzdCB0aGUgYWRkZW5kCi0JYnkgdGhlIHNlY3Rpb24gdm1hLgotCi0JKiBjb25maWcvejhrLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogVGhlIHJlbGV2YW50IGZpbGUgaXMKLQl6OGstb3BjLmgsIG5vdCB6OGsuaC4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2VuZGVmKTogQ29ycmVjdCB0ZXN0IGZvciAuYmYKLQlzeW1ib2wuCi0KLUZyaSBNYXIgMTIgMTg6MzM6MzYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBzcGFyYy1zdW4tc29sYXJpczIqIGluc3RlYWQgb2YgLXNvbGFyaXMyCi0KLUZyaSBNYXIgMTIgMTI6MDA6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBleHByLmMsIHdyaXRlLmM6IFVsdHJpeCBuYXRpdmUgNC4yIGNjIHJlcXVpcmVzIGFzc2VydCBjb25kaXRpb24KLQl0byBiZSBvbiBhIHNpbmdsZSBsaW5lLgotCi1UaHUgTWFyIDExIDE3OjU2OjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5oKTogQ3JlYXRlIGZpbGUsIHdyaXRpbmcgb3V0IGRlZmluaXRpb25zIG9mCi0JdGFyZ2V0IGNwdSwgYWxpYXMsIGFuZCBjYW5vbmljYWwgbmFtZS4KLQkoQUxMX0NGTEFHUyk6IE5vIGxvbmdlciBkZWZpbmUgVEFSR0VUX0NQVS4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogUHJpbnQgYSBtZXNzYWdlLCBpbnN0ZWFkIG9mIHF1aXR0aW5nCi0Jc2lsZW50bHkuCi0KLQkqIGFzLmMgKG1haW4pOiBEb24ndCBjYXRjaCBhbnkgc2lnbmFscywgZm9yIG5vdy4KLQotCSogdmVyc2lvbi5jOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW46IEdlbmVyYXRlIGl0LCBwdXR0aW5nIGluIG9ubHkgdGhlIHZlcnNpb24gbnVtYmVyCi0JaXRzZWxmLgotCShWRVJTSU9OKTogTmV3IHZhcmlhYmxlLgotCSogYXMuYzogSW5jbHVkZSBjb25maWcuaC4KLQkobWFpbik6IFJlZm9ybWF0dGVkIHZlcnNpb24gc3RyaW5nLiAgSW5jbHVkZSB0YXJnZXQgYWxpYXMuICBEb24ndAotCXByaW50IGlmIG5vdCByZXF1ZXN0ZWQgKGkuZS4sIHVua25vd24gLXYgYXJndW1lbnQpLgotCi0JKiBhcy5jIChzdHJhbGxvYyk6IERlbGV0ZWQuCi0JKG1haW4pOiBDYWxsIHN0cmR1cCBpbnN0ZWFkLgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBhbGwgNjgzMDAgc2VyaWVzIGNoaXBzLgotCSogY29uZmlnL3RjLW02OGsuYzogSW5jbHVkZSBjb25maWcuaC4KLQkobWRfYXNzZW1ibGUpOiBBc3N1bWUgVEFSR0VUX0NQVSBpcyBkZWZpbmVkLiAgQWNjZXB0IHNvbWUgNjgzMDAKLQlzZXJpZXMgY3B1cyBhcyBkZWZhdWx0cy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IHNvbWUgbTY4MzAwIHNlcmllcyBDUFVzIGFzIGRlZmF1bHRzLgotCi1XZWQgTWFyIDEwIDE3OjQxOjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoRVhJVF9TVUNDRVNTLCBFWElUX0ZBSUxVUkUpOiBEZWZpbmUgdG8gbm9ybWFsIHZhbHVlcyBpZgotCW5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKG1haW4sIGdvdF9zaWcpOiBVc2UgdGhlbS4KLQkqIGNvbmZpZy9oby12bXMuaCAoRVhJVF9TVUNDRVNTLCBFWElUX0ZBSUxVUkUpOiBSZXZlcnNlIGRlZmF1bHQKLQl2YWx1ZXMuCi0KLVR1ZSBNYXIgIDkgMDc6NDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMsIGNvbmZpZy9vYmotZWNvZmYuaDogUHJlbGltaW5hcnkgRUNPRkYKLQlzdXBwb3J0LgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIGJhc2VkIG9uIE9CSl9BT1VUIHZzLgotCU9CSl9FQ09GRiBhcyB3ZWxsIGFzIFRBUkdFVF9CWVRFU18qX0VORElBTi4KLQkoc3RydWN0IGxvYywgc3RydWN0IHByb2MsIHN0cnVjdCBmaWxlKTogTW92ZWQgdG8gdGMtbWlwcy5jIHdpdGhpbgotCSNpZm5kZWYgT0JKX0VDT0ZGIGJsb2NrLCBzaW5jZSBFQ09GRiB1c2VzIGRpZmZlcmVudCB2ZXJzaW9ucy4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlYXJyYW5nZWQgZm9yIEVDT0ZGIHN1cHBvcnQuICBBZGRlZAotCXByb3RvdHlwZXMgZm9yIGFsbCBzdGF0aWMgZnVuY3Rpb25zLiAgTW92ZWQgZXhpc3RpbmcgbWluaW1hbAotCWRlYnVnZ2luZyBmb3JtYXQgc3VwcG9ydCBpbmZvICNpZm5kZWYgT0JKX0VDT0ZGIGJsb2Nrcy4KLQkobWFjcm9fYnVpbGRfbHVpKTogRWxpbWluYXRlZCBzaWduX2V4dGVuZCBhcmd1bWVudCwgYmVjYXVzZSBFQ09GRgotCWRvZXMgbm90IHN1cHBvcnQgYSBub24gc2lnbiBleHRlbmRlZCBoaWdoIDE2IGJpdHMgcmVsb2MuICBBZGp1c3RlZAotCWFsbCBjYWxsZXJzIGFjY29yZGluZ2x5LgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBSZW5hbWVkIGZyb20gZ2V0X3JlZ2lzdGVyLCBhbmQgbWFkZSBub24tc3RhdGljLgotCi0JKiBjb25maWcvbWlwcy1iaWcubXQsIGNvbmZpZy9taXBzLWxpdC5tdDogTmV3IGZpbGVzLiAgRGVmaW5lCi0JVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gYW5kIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOLAotCXJlc3BlY3RpdmVseS4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWJzZCopOiBVc2UgZ2FzX3RhcmdldCBtaXBzLWxpdC4KLQkobWlwcy0qLXVsdHJpeCosIG1pcHMtKi1pcml4KiwgbWlwcy0qLWVjb2ZmKTogTmV3IHRhcmdldHMsIHVzaW5nCi0Jb2JqX2Zvcm1hdCBlY29mZiBhbmQgZ2FzX3RhcmdldCBtaXBzLWxpdCBvciBtaXBzLWJpZy4KLQotVHVlIE1hciAgOSAwNzo0MzowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogdmVyc2lvbi5jOiBCdW1wIHRvIHZlcnNpb24gMi4wLjEuCi0KLVR1ZSBNYXIgIDkgMDc6NDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlcik6IENoZWNrIHRoYXQgc2VnX2luZm8gKHNlY3Rpb24pCi0JaXMgbm90IE5VTEwuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCBvYmpfZnJvYl9maWxlIGFmdGVyIHNldHRpbmcgdGhlIHN5bWJvbHMsCi0Jbm90IGJlZm9yZS4KLQotVHVlIE1hciAgOSAwMDowMDowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogVmVyc2lvbiAyLjAgcmVsZWFzZWQuCi0KLU1vbiBNYXIgIDggMTQ6NTc6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19DT1VOVF9SRUxPQyk6IExvb2sgZm9yIGZ4X2FkZHN5IG9ubHkuCi0KLUZyaSBNYXIgIDUgMDk6MDU6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkLmg6IERlZmluZSBzdHJpbmdlciBoZXJlLgotCXJlYWQuYywgY29uZmlnL29iai1pZWVlLmMsIGNvbmZpZy9vYmotdGNtODhrLmM6IE5vdCBhbnkgb2YgdGhlc2UKLQlwbGFjZXMuCi0KLVRodSBNYXIgIDQgMTE6NTI6MjMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19zcGFjZSk6IE11bHRpcGx5IHJlcGVhdCBjb3VudCBieSBtdWx0LCBub3QgZmlsbC4KLQotVGh1IE1hciAgNCAwNToyMDo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiBJbmNsdWRlIGN0eXBlLmguCi0KLVdlZCBNYXIgIDMgMTA6NDE6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JUGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlOgotCSogbWFrZS1nYXMuY29tOiBGaW5kIG9ic3RhY2sub2JqIGlmIGl0J3Mgbm90IGluIHRoZSBjdXJyZW50Ci0JZGlyZWN0b3J5LgotCSogcmVhZC5jIChzX2lnbm9yZSk6IERvbid0IGRlY2xhcmUgaXNfZW5kX29mX2xpbmUuICBJdCdzCi0JcmVkdW5kYW50LCBhbmQgdHJpZ2dlcnMgYSBWTVMgZ2NjIGNvbXBpbGVyIGJ1Zy4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBNYWNybyBTVUJfU0VHTUVOVF9BTElHTiBub3cgdGFrZXMKLQljdXJyZW50IHNlZ21lbnQgYXMgYW4gYXJndW1lbnQuICAoSWdub3JlZCBpbiBhbGwgY2FzZXMgYnV0IFZNUy4pCi0JQWxsIGNhbGxlcnMgYW5kIGRlZmluaXRpb25zIGNoYW5nZWQuCi0KLVR1ZSBNYXIgIDIgMTE6NTY6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmM6IENsZWFuZWQgdXAgYSBiaXQsIGFkZGVkIHByb3RvdHlwZXMsIG1hZGUgTk9fTElTVElORwotCWNhc2UgY29tcGlsZSBhZ2Fpbi4KLQotVHVlIE1hciAgMiAwODo1MzozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAoaXNieXRlKTogQWNjZXB0IGFsbCB2YWx1ZXMgZnJvbSAtMjU1IHRvICsyNTUsCi0Jc28gIn4weDgwIiB3b24ndCBiZSByZWplY3RlZC4KLQotCSogY29uZmlnL29iai1lbGYuYzogTm8gbG9uZ2VyIGluY2x1ZGUgZWxmL3JlbG9jLmguCi0JKG9ial9lbGZfc2VjdGlvbik6IFNldCBTRUNfUkVBRE9OTFkgYW5kIFNFQ19DT0RFIGZvciB0ZXh0IHNlY3Rpb24uCi0JKG9ial9lbGZfc3RhYiwgb2JqX2VsZl9kZXNjKTogRGVsZXRlZCBkby1ub3RoaW5nIGFuZCBjb21tZW50ZWQtb3V0Ci0Jcm91dGluZXMuCi0JKG9ial9lbGZfeHN0YWIpOiBOZXcgcm91dGluZS4KLQkob2JqX2VsZl9zZXRfc2l6ZSk6IENhbGwgYXNfd2Fybiwgbm90IGZwcmludGYuICBQYXNzIGRlc2lyZWQKLQlhcmd1bWVudCB0byBzX2lnbm9yZS4gIFB1dCAiI2lmIDAiIGFyb3VuZCB1bnVzZWQgY29kZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IFVzZSBzX2lnbm9yZSBpbnN0ZWFkIG9mIGRvLW5vdGhpbmcgcm91dGluZXMuCi0JQ2FsbCBlbGZfeHN0YWJzIGZvciAuc3RhYnMgYW5kIC54c3RhYnMgb3BlcmF0b3JzLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCkgW09CSl9FTEZdOiBOb3cgImVsZjMyLXNwYXJjIi4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogU2V0IFNFQ19SRUxPQyBvbmx5IGlmIGZpeHVwcyBhcmUKLQlwcmVzZW50LgotCi0JKiBjb25maWd1cmUuaW46IG1pcHMtYnNkIGNvbmZpZ3VyYXRpb24gd2FzIG1pc3NpbmcgZm9ybWF0IHNwZWMuCi0JU2hvdWxkIHVzZSBhb3V0LgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBEZXBlbmRzIG9uIGNvbmZpZ3VyZS5pbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBjaGVjayBmb3IgYWxpZ25tZW50IG9mCi0JZnJhZyBpbiBtZW1vcnk7IGFsaWdubWVudCBvZiBpbnN0cnVjdGlvbnMgaW4gc2VjdGlvbiBpcyBhIHNlcGFyYXRlCi0JbWF0dGVyLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZF9sdWkpOiBGaXggc29tZSBhc3N1bXB0aW9ucyBvZiBBTlNJCi0JQyBhdmFpbGFiaWxpdHkuCi0KLQkqIGxpc3RpbmcuaDogQWx3YXlzIHByb3ZpZGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBub3QgbWFjcm9zLCBzbwotCXBjYyB3b24ndCBsb3NlLgotCi1UdWUgTWFyICAyIDAwOjUwOjQzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBDT05UUklCVVRPUlM6ICBVcGRhdGUgR2lsbW9yZSBlbnRyeS4KLQotTW9uIE1hciAgMSAxMjowMzoxNiAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6ICBDb3JyZWN0bHkgYXNzZW1ibGUgcHJlZmV0Y2gKLQlpbnN0cnVjdGlvbnMuICBBY2NlcHQgaW50ZWdlciBwcmVmZXRjaCBmdW5jdGlvbiBudW1iZXJzLgotCi1XZWQgRmViIDI0IDE0OjU4OjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfeHdvcmQpOiBOb3cgY2FsbCBiaWdfY29ucywgc28gbGFyZ2UKLQljb25zdGFudHMgYXJlIGFjY2VwdGVkLCBidXQgc3ltYm9saWMgdmFsdWVzIGFyZSBub3QuICBHQ0Mgd2lsbCBub3QKLQlnZW5lcmF0ZSB0aGUgbGF0dGVyIGN1cnJlbnRseS4KLQotCSogZnJhZ3MuYyAoZnJhZ19pbml0KTogTmV3IGZ1bmN0aW9uLgotCSh6ZXJvX2FkZHJlc3NfZnJhZywgYnNzX2FkZHJlc3NfZnJhZyk6IE5vdyBpbml0aWFsaXplZCBhdCBydW4KLQl0aW1lLgotCSogYXMuYyAobWFpbik6IENhbGwgZnJhZ19pbml0LgotCi1XZWQgRmViIDI0IDEwOjMyOjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEluIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQgY2FzZToKLQlEb24ndCB1bmdldCBjaDIgaWYgd2UgZGlkbid0IGdldCBpdC4KLQotV2VkIEZlYiAyNCAwNDoxNDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluIChURVhJRElSKTogVXBkYXRlZCBmb3IgbmV3IGxheW91dC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogQWRkIHN1cHBvcnQgZm9yIEVMRiB2ZXJzaW9uLgotCSh0Y19nZW5fcmVsb2MpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9BUkNILCBUQVJHRVRfRk9STUFUKSBbQkZEX0FTU0VNQkxFUl06Ci0JTmV3IG1hY3Jvcy4KLQkobWRfY29udmVydF9mcmFnKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRm9yIFBDLXJlbGF0aXZlIGFkZHJlc3Npbmcgb2YgYQotCXN5bWJvbCwgZml4IHRoZSBvZmZzZXQgc28gIisyIiBpc24ndCByZXF1aXJlZC4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobGluZV9jb21tZW50X2NoYXJzLCBsaW5lX3NlcGFyYXRvcl9jaGFycyk6Ci0JRGVmaW5lIGFzIGNvbW1vbi9ic3MuCi0JKG9wX2hhc2gsIHJlZ19oYXNoLCBhcmVnX2hhc2gsIGljbGFzc2VzX3NlZW4sIGJyX2NudCk6IERlZmF1bHQgQwotCWluaXRpYWxpemVycyBhcmUgc3VmZmljaWVudC4KLQotCSogY29uZmlnL29iai1hb3V0LmggW0JGRF9BU1NFTUJMRVJdOiBJbmNsdWRlIGxpYmFvdXQuaCBmcm9tIGJmZC4KLQkoVEFSR0VUX0ZPUk1BVCkgW0JGRF9BU1NFTUJMRVJdOiBEZWZhdWx0IHRvICJhLm91dCIuCi0JKFNfU0VUXyosIFNfR0VUXyosIG9ial9mcm9iX3N5bWJvbCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgbWFjcm9zLgotCShTX1NFVF9UWVBFKSBbIUJGRF9BU1NFTUJMRVJdOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvb2JqLWFvdXQuYzogVXNlIFBBUkFNUyBtYWNybyBmb3IgZGVjbGFyYXRpb25zLiAgUmVtb3ZlCi0JIklHTk9SRV9ERUJVRyIgY29uZGl0aW9uYWwsIHNpbmNlIGJvdGggYnJhbmNoZXMgYXJlIGlkZW50aWNhbC4KLQlVc2UgU19TRVRfVFlQRSwgU19HRVRfVFlQRSwgYW5kIFNfR0VUX0RFU0MgaW5zdGVhZCBvZiBkaXJlY3RseQotCXJlZmVyZW5jaW5nIHN5bWJvbCBzdHJ1Y3R1cmUgbWVtYmVycy4KLQkob2JqX2FvdXRfZnJvYl9zeW1ib2wpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IFJlb3JkZXJlZCBhIGNvdXBsZSBvZiBmaWVsZHMgZm9yIGJldHRlcgotCXBhY2tpbmcuCi0KLQkqIHdyaXRlLmMgKHJlY29yZF9hbGlnbm1lbnQpIFtCRkRfQVNTRU1CTEVSXTogUmVjb3JkIGl0IGluIHRoZQotCXNlY3Rpb24gaW5mby4KLQkod3JpdGVfY29udGVudHMpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCSh3cml0ZV9vYmplY3RfZmlsZSkgW0JGRF9BU1NFTUJMRVJdOiBBbHdheXMgaGFuZGxlIC1SIGhlcmUuICBDYWxsCi0JZml4X25ldyB3aXRoIEJGRF9SRUxPQ19OT05FIGluc3RlYWQgb2YgMCBvciBOT19SRUxPQy4gIENhbGwKLQlvYmpfZnJvYl9maWxlLCBvYmpfZnJvYl9zeW1ib2wsIHRjX2Zyb2Jfc3ltYm9sIGlmIGRlZmluZWQuCi0JKGZpeHVwX3NlZ21lbnQpOiBNYWtlIHN1cmUgY29tbW9uLXNlY3Rpb24gc3ltYm9scyBnZXQgdHJlYXRlZCB0aGUKLQlzYW1lIGFzIHVuZGVmaW5lZCBzeW1ib2xzLgotCShmaXhfbmV3KSBbQkZEX0FTU0VNQkxFUl06IEFyZ3VtZW50IHJfdHlwZSBpcyBvZiB0eXBlCi0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLiAgVXNlIHNlZ19maXhfe3Jvb3QsdGFpbH1QIGRlcml2ZWQgZnJvbQotCXNlY3Rpb24gaW5mby4KLQkqIHdyaXRlLmggKGZpeF9uZXcpOiBVcGRhdGUgcHJvdG90eXBlLgotCi0JKiB0Yy5oIChtZF9vcGVyYW5kLCBtZF9jb252ZXJ0X2ZyYWcsIHRjX2hlYWRlcnNfaG9vaywKLQltZF9zZWN0aW9uX2FsaWduLCBtZF91bmRlZmluZWRfc3ltYm9sKTogRG9uJ3QgcHJvdmlkZSBwcm90b3R5cGVzCi0JaWYgdGhlc2UgYXJlIGRlZmluZWQgYXMgbWFjcm9zLgotCShtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogQkZEIHZlcnNpb24gbmVlZHMgYmZkIGFuZAotCXNlY3Rpb24gcGFzc2VkLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBBcmd1bWVudCBOQU1FIGlzIG5vdyBwb2ludGVyIHRvIGNvbnN0LgotCVNpbXBsaWZpZWQgU1RSSVBfVU5ERVJTQ09SRSBjb2RlLiAgUmVtb3ZlIGFzc3VtcHRpb25zIGFib3V0IG51bGwKLQlwb2ludGVycyBpbiBmcmVzaGx5IGFsbG9jYXRlZCBzdG9yYWdlLiAgW0JGRF9BU1NFTUJMRVJdOiBHZXQgbmV3Ci0JQkZEIHN5bWJvbC4KLQkoY29sb24pOiBEaXNwbGF5IG90aGVyL2Rlc2MgZmllbGRzIG9mIHJlZGVmaW5lZCBzeW1ib2wgb25seSBpZgotCVNfR0VUX09USEVSIGFuZCBTX0dFVF9ERVNDIGFyZSBkZWZpbmVkLgotCShzeW1ib2xfbWFrZSk6IEFyZ3VtZW50IE5BTUUgaXMgbm93IHBvaW50ZXIgdG8gY29uc3QuCi0JKHN5bWJvbF9maW5kLCBzeW1ib2xfZmluZF9iYXNlKTogTGlrZXdpc2UuCi0JKFNfSVNfKiwgU19HRVRfKiwgU19TRVRfKikgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb25zLgotCSogc3ltYm9scy5oOiBGaXggcHJvdG90eXBlcyBmb3IgbmV3IGNvbnN0IGFyZ3VtZW50cy4gIEFkZAotCXByb3RvdHlwZXMgZm9yIEJGRF9BU1NFTUJMRVIgU18qIGZ1bmN0aW9ucy4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKSBbQkZEX0FTU0VNQkxFUl06IEJGRCB2ZXJzaW9uIG9mIGNvZGUKLQlmb3IgY2hhbmdpbmcgdG8gYW4gZXhpc3Rpbmcgc2VjdGlvbi4KLQkoc3Vic2VnX25ld19yZXN0KSBbQkZEX0FTU0VNQkxFUl06IFNwbGl0IG9mZiBmcm9tIHN1YnNlZ19uZXcsCi0JY2FsbGVkIGJ5IHN1YnNlZ19uZXcgYW5kIHN1YnNlZ19zZXQuCi0JKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogUmV3cml0dGVuIHRvIGNoYW5nZSB0byBuZXcgc2VjdGlvbiwKLQlnaXZlbiBzZWN0aW9uIG5hbWUgYW5kIHN1YnNlZyBudW1iZXIuCi0JKHN1YnNlZ19zZXQpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uOyBjaGFuZ2UgdG8gYSBwb3NzaWJseQotCW5ldyBzZWN0aW9uL3N1YnNlY3Rpb24uCi0KLQkqIHJlYWQuYzogRG9uJ3QgaW5jbHVkZSBjdHlwZS5oLgotCShjb25zKSBbQkZEX0FTU0VNQkxFUl06IEZvciB1bmRlZmluZWQgc3ltYm9scywgdXNlIEJGRF9SRUxPQ18zMgotCWZvciBub3c7IHNob3VsZCBiZSBtYWNoaW5lLWRlcGVuZGVudC4KLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgKi0qLWVsZiBhbmQgKi0qLXNvbGFyaXMqIGFzIEVMRiBmb3JtYXQKLQl0YXJnZXRzLCBmb3JjaW5nIEJGRCB1c2UuCi0KLVdlZCBGZWIgMTcgMTg6NTk6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYzogVXNlIFBBUkFNUyBtYWNybyBmb3Igc3RhdGljIGZ1bmN0aW9uCi0JZGVjbGFyYXRpb25zLiAgVXNlIEJGRF9SRUxPQ18gbWFjcm9zIGV2ZXJ5d2hlcmUsIHdpdGgKLQljb21wYXRpYmlsaXR5IG1hY3JvcyBkZWNsYXJlZCBmb3Igbm9uLUJGRCBtb2RlLgotCShzdHJ1Y3Qgc3BhcmNfaXQpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotCWluc3RlYWQgb2YgZW51bSByZWxvY190eXBlLgotCShlbWl0X3NwYXJjX3JlbG9jKTogQ29tbWVudGVkLW91dCBmdW5jdGlvbiBkZWxldGVkLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEZWxldGVkLgotCSh0Y19hb3V0X3ByZV93cml0ZV9ob29rKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCShtZF9hcHBseV9maXgpOiBDaGFuZ2VkIGNhbGxpbmcgc2VxdWVuY2UgKGNvbmRpdGlvbmFsbHkpIGZvciBCRkQKLQl2ZXJzaW9uLgotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2NvbnZlcnRfZnJhZyk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X3N0YWIpOiBSZWZlciB0byB1bmRlZmluZWRfc2VjdGlvbiwKLQlub3QgU0VHX1VOS05PV04uICBVc2UgU19TRVRfVFlQRSwgU19HRVRfVFlQRSwgU19HRVRfREVTQyBpbnN0ZWFkCi0Jb2YgcmVmZXJlbmNpbmcgZmllbGRzIGRpcmVjdGx5LgotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogTmV3IGZ1bmN0aW9uOyBleHRyYWN0ZWQgZnJvbQotCXdyaXRlX29iamVjdF9maWxlLgotCSh3cml0ZV9vYmplY3RfZmlsZSkgWyEgQkZEX0FTU0VNQkxFUl06IENhbGwgaXQuCi0JKHJlbGF4X2FuZF9zaXplX3NlZykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb247IHJlbGF4IHNlY3Rpb24KLQlhbmQgc2V0IGl0cyBzaXplIGFuZCBmbGFncy4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpIFtCRkRfQVNTRU1CTEVSXTogUmVwbGFjZSBzb21lCi0JZmllbGRzIHdpdGggQkZEIGVxdWl2YWxlbnRzLiAgVHVybiBvbiBiYWNrLXBvaW50ZXJzLCBhbmQgYWRkCi0JdGFyZ2V0LXNwZWNpZmljIGZpZWxkcyBhdCBlbmQuCi0KLVRodSBGZWIgMTEgMDk6MjA6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IHZhZGRyIGhlcmUuCi0JKHdyaXRlX29iamVjdF9maWxlKTogU2V0IGl0IGhlcmUgaW5zdGVhZCwgc28gdGhhdCBmaXh1cF9zZWdtZW50Ci0JY2FuIHNlZSB0aGUgY29ycmVjdCB2YWx1ZS4KLQotTW9uIEZlYiAgOCAxMzo1NjoxNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hlY2sgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MgYW5kCi0JYmFpbCBvdXQgYmVmb3JlIHByb2Nlc3NpbmcgY29udGVudHMuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBOZXcgZnVuY3Rpb24sIGRvZXMgbW9zdCBvZiB0aGUgd29yawotCW9mIHJlbW92ZV9zdWJzZWdzLgotCShjaGFpbl9mcmNoYWluc190b2dldGhlcikgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCi0JKHJlbW92ZV9zdWJzZWdzKSBbISBCRkRdOiBDYWxsIGl0LgotCSh3cml0ZV9vYmplY3RfZmlsZSkgW0JGRF9BU1NFTUJMRVJdOiBDb252ZXJ0ZWQgdG8gdXNlIEJGRAotCXN0cnVjdHVyZXMgYW5kIHJvdXRpbmVzLgotCi0JKiBjb25maWcvb2JqLWVsZi4qOiBOZXcgZmlsZXMuCi0KLQkqIGNvbmZpZy9taXBzLm10LCBjb25maWcvcnM2MDAwLm10OiBEZWxldGVkLgotCi0JKiBjb25maWcvaDgzMDAubXQ6IERvbid0IHNwZWNpZnkgY29tcGlsZXIgaGVyZS4KLQotCSogY29uZmlnL3o4ay5tdDogVGhlIHo4ayBjb2RlIGRlcGVuZHMgb24gdGhlIHo4ayBvcGNvZGUgdGFibGUsCi0Jbm90IHRoZSBoODMwMCBvbmUuCi0JKiBjb25maWcvdGMtejhrLmg6IENvbW1lbnQgZml4LgotCi0JKiB3cml0ZS5jOiBSZW9yZGVyZWQgc29tZSBmdW5jdGlvbnMgZm9yIGJldHRlciBpbmxpbmluZy4KLQkoZml4dXBfc2VnbWVudCk6IExpbmtyZWxheCBjb2RlIGlzIG5vIGxvbmdlciBjb25kaXRpb25hbCBvbgotCVRDX0k5NjAuCi0KLVRodSBGZWIgIDQgMTI6NDU6MTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97aDg1MDAubXQsIHRjLWg4NTAwLmMsIHRjLWg4NTAwLmgsIG9iai1jb2ZmYmZkLmMsCi0Jb2JqLWNvZmZiZmQuaH06IHN1cHBvcnQgZm9yIHRoZSBIOC81MDAKLQotV2VkIEZlYiAgMyAxOToyODoxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKFNVQl9TRUdNRU5UX0FMSUdOKTogRGVmaW5lIFZNUyB2ZXJzaW9uIGhlcmUuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IE5vdCBoZXJlLgotCShmaXhfbmV3KTogSW5pdGlhbGl6ZSBmeF9hZGRudW1iZXIuCi0KLQkqIGxpc3RpbmcuYzogRG9uJ3QgaW5jbHVkZSB0YXJnZXQtY3B1LmggZXhwbGljaXRseSwgc2luY2UgYXMuaAotCWluY2x1ZGVzIGl0LgotCi1UaHUgSmFuIDI4IDAwOjM1OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5oIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZGVjbGFyZSBuZXh0X29iamVjdF9maWxlX2NoYXJQLAotCSpfZml4X3Jvb3QsICpfZml4X3RhaWwsIHNlZ19maXhfcm9vdFAsIHNlZ19maXhfdGFpbFAuCi0JKHN0cnVjdCBmaXgpOiBSZW9yZGVyZWQgZmllbGRzIGZvciBjb21wYWN0bmVzcyBhbmQgZWZmaWNpZW5jeS4KLQlDb252ZXJ0ZWQgc29tZSBsb2dpY2FsIGZpZWxkcyB0byAxLWJpdCBmaWVsZHMuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oOiBVc2UgUEFSQU1TLgotCVtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZGVmaW5lL2RlY2xhcmUgQU9VVF9NQUNIVFlQRSwgc2VnX05fVFlQRSwKLQlOX1RZUEVfc2VnLCBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUuCi0KLQkqIHJlYWQuYzogRG9uJ3QgaW5jbHVkZSBsaXN0aW5nLmg7IGFzLmggaW5jbHVkZXMgaXQuICBSZW1vdmVkCi0JRE9OVERFRiBjb2RlLgotCVtCRkRfQVNTRU1CTEVSXTogSW5jbHVkZSBzdWJzZWdzLmguCi0JKG9sZF9idWZmZXIsIG5ld19icm9rZW5fd29yZHMpOiBEZWZhdWx0IGluaXRpYWxpemF0aW9uIGlzCi0Jc3VmZmljaWVudC4KLQotCSogb3V0cHV0LWZpbGUuYyBbQkZEX0FTU0VNQkxFUl06IEluY2x1ZGUgYmZkLmgsIGRlZmF1bHQgVEFSR0VUX01BQ0gKLQl0byAwLCBkZWZpbmUgc3Rkb3V0cHV0LgotCShvdXRwdXRfZmlsZV9jcmVhdGUpIFtCRkRfQVNTRU1CTEVSXTogQ2FsbCBiZmRfcGVycm9yIG9uIGZhaWx1cmUuCi0JQ2FsbCBiZmRfc2V0X2FyY2hfbWFjaC4KLQkob3V0cHV0X2ZpbGVfY2xvc2UpIFtCRkRfQVNTRU1CTEVSXTogQ2FsbCBiZmRfY2xvc2UsIG5vdAotCWJmZF9jbG9zZV9hbGxfZG9uZS4gIENhbGwgYmZkX3BlcnJvciBvbiBmYWlsdXJlLgotCShvdXRwdXRfZmlsZV9hcHBlbmQpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb25maWcvbTY4a2NvZmYubXQgKExPQ0FMX0xPQURMSUJFUyk6IERlbGV0ZSBkZWZpbml0aW9uLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWx3YXlzIGRlZmluZS4gIE9taXQgZmllbGQgc2NuaGRyCi0JaWYgbm90IE1BTllfU0VHTUVOVFMuICBEZWZpbmUgbmV3IGZpZWxkIGJmZF9zZWN0aW9uIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoc2VnX2luZm8pOiBOZXcgbWFjcm8uCi0KLQkqIGV4cHIuYywgaW5wdXQtc2NydWIuYzogVXNlIFBBUkFNUyBtYWNyby4gIERlbGV0ZWQgdW51c2VkCi0JdmFyaWFibGVzLCBhbmQgc29tZSBpcnJlbGV2YW50IGNvbW1lbnRzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEluY2x1ZGUgJChCRkRERUYpLgotCShMSUJTKTogSW5jbHVkZSAkKEJGRExJQikuICBEb24ndCBib3RoZXIgd2l0aCAkKENMSUIpLgotCSogY29uZmlndXJlLmluOiAgUGVybWl0IC0td2l0aC1iZmQtYXNzZW1ibGVyIG5vdywgd2l0aCBhIHdhcm5pbmcuCi0JVmFyaWFibGUgbmVlZF9iZmQgaXMgbm93IGEgYm9vbGVhbiwgYXMgaXMgbmV3IHZhcmlhYmxlIGJmZF9nYXMuCi0JU2V0IEJGRERFRiBhbmQgQkZETElCIGluIE1ha2VmaWxlIHdoZW4gYXBwcm9wcmlhdGUuCi0KLQkqIGFzLmM6IFJlbW92ZWQgIiNpZmRlZiBET05UREVGIiBhbmQgIiNpZmRlZiBjb21tZW50IiBjb2RlLgotCShtYWluKTogUmVmZXIgdG8gZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0IGluc3RlYWQgb2YKLQlmbGFnc2VlblsnWiddLgotCi0JKiBhcy5jIChtYWluKSBbQkZEX0FTU0VNQkxFUl06IE9wZW4gb3V0cHV0IGJmZC4KLQkoKl9zZWN0aW9uKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZSB0aGVtLgotCShwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpIFtCRkRfQVNTRU1CTEVSXTogSW5pdGlhbGl6ZSB0aGVtLCBhbmQKLQlzZXQgc2VjdGlvbiBmbGFncyB3aGVuIGFwcHJvcHJpYXRlLgotCSogYXMuaCAoU0VHX05PUk1BTCkgW0JGRF9BU1NFTUJMRVJdOiBSZXF1aXJlIHRoYXQgdGhlIHNwZWNpZmllZAotCXNlY3Rpb24gaXMgbm90IGFic29sdXRlLCB1bmRlZmluZWQsIG9yIGFuIGFzc2VtYmxlciBpbnRlcm5hbCBvbmUuCi0JKGFic29sdXRlX3NlY3Rpb24sIHVuZGVmaW5lZF9zZWN0aW9uKTogQWx3YXlzIGRlZmluZS4KLQkqIGV4cHIuYywgcmVhZC5jLCBzeW1ib2xzLmM6IFJlZmVyIHRvICpfc2VjdGlvbiwgbm90IFNFR18qOyBicmVhawotCXN3aXRjaCBzdGF0ZW1lbnRzIGludG8gaWYtZWxzZSB0cmVlcy4KLQkqIHN5bWJvbHMuYyBbTUFOWV9TRUdNRU5UU106IERlbGV0ZWQgcmVkdW5kYW50IGRlZmluaXRpb25zIG9mCi0JU0VHX0JTUyBhbmQgU0VHX0RBVEEuCi0KLQkqIGFzLmggKGZyYWdfbm93X2ZpeCk6IE5ldyBtYWNyby4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBVc2UgaXQuCi0KLVdlZCBKYW4gMjcgMjE6NDM6NTMgUFNUIDE5OTMgIFJhbHBoIENhbXBiZWxsICAocmFscGhjQHB5cmFtaWQuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWcvdGMtbWlwcy5oOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWcvaG8tbWlwc2JzZC5oOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWcvbWlwcy1vcGNvZGUuaDogIEFkZGVkIG1pcHMgc3VwcG9ydCBmb3IgbWlwcy1kZWMtYnNkLgotCSogY29uZmlndXJlLmluOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBhdG9mLWdlbmVyaWMuYzogIERlZmluZSBUUlVFIGFuZCBGQUxTRSBpZiBub3QgZGVmaW5lZC4KLQotVGh1IEphbiAyMSAxMjo0ODoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHZlcnNpb24uYzogQnVtcGVkIHZlcnNpb24gbnVtYmVyIHRvIDEuOTMuMDUuCi0KLVdlZCBKYW4gMjAgMTc6MTE6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBEb24ndCB1c2UgI2VsaWYuCi0JKG9ial9lbWl0X2xpbmVubyk6IERvbid0IG5lZWQgcmV0dXJuIGF0IGVuZCBvZiB2b2lkIGZ1bmN0aW9uLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IFJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KLQkodGNfYW91dF9maXhfdG9fY2hhcnMpOiBBcnJheSBuYnl0ZXNfcl9sZW5ndGggaXMgbm93IGNvbnN0LgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQ19DT1VOVF9SRUxPQyk6IERvbid0IGVtaXQgcmVsb2MgaWYgb25seQotCW9mZnNldCBmaWVsZCBpcyBzZXQuCi0KLUZyaSBKYW4gIDggMDU6NDQ6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBGb3IgJXVoaSBhbmQgJXVsbywgaWYgbm90Ci0JRU5WNjQsIGVtaXQgbm8gcmVsb2MuCi0JKG1kX3BzZXVkb190YWJsZSk6IEZvciAiLnh3b3JkIiwgY2FsbCBzX3h3b3JkLgotCShzX3h3b3JkKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZCwgd2Fybl9vbl9idW1wLAotCW1kX3JlbGF4X3RhYmxlKTogVXNlIGRlZmF1bHQgemVybyBpbml0aWFsaXphdGlvbi4KLQkoc19yZXNlcnZlKTogU2luY2UgU0VHX0UyIGlzIGVxdWl2YWxlbnQgdG8gU0VHX0JTUywganVzdCB1c2UgdGhlCi0JbGF0dGVyLCBpbnN0ZWFkIG9mIHNlbGVjdGluZyB3aXRoIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMuCi0KLVRodSBKYW4gIDcgMDg6NTg6MjEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbmlzZSBhbGwgc3BhcmNsaXRlIHZhcmlhbnRzCi0KLVRodSBKYW4gIDcgMDU6MjU6MjUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfZGF0YSkgWyFCRkRfQVNTRU1CTEVSXTogRml4IHR5cG8gaW4gNCBKYW4gY2hhbmdlIC0tCi0JYWNjaWRlbnRhbGx5IGNoYW5nZWQgdG8gdXNlIHN1YnNlZ19jaGFuZ2Ugd2hlcmUgaXQgc2hvdWxkIGhhdmUKLQliZWVuIHN1YnNlZ19uZXcuCi0KLVR1ZSBKYW4gIDUgMDg6NDI6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBjb21tYSBvciBuZXdsaW5lIGlzIGEKLQlsb2dpY2FsIGVuZC1vZi1saW5lIGNoYXJhY3RlciwgdXNlIHRoZSBuZXdsaW5lIGNhc2UuCi0JRnJvbSBFcmljIFlvdW5nZGFsZToKLQkob3BlcmFuZCk6IFNldCBYX2FkZF9udW1iZXIgZmllbGQgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0JKG9wZXJhbmQpOiBUcmVhdCB6ZXJvIGJ5dGUgYXMgZW5kLW9mLW9wZXJhbmQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAocGVyLXRhcmdldCk6IExvb2sgZm9yIHdpdGhfYmZkX2Fzc2VtYmxlciBvcHRpb24uCi0JRm9yIG5vdywgb25seSBhY2NlcHQgIm5vIiwgdW50aWwgdGhlIG1lcmdlIGlzIGRvbmUuCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIEVyaWMgWW91bmdkYWxlICh5b3VuZ2RhbGVAdjY1NTBjLm5ybC5uYXZ5Lm1pbCk6Ci0JKiBhcy5jLCBmbG9udW0ta29uc3QuYywgaGV4LXZhbHVlLmMsIGlucHV0LWZpbGUuYywgdmVyc2lvbi5jLAotCSAgY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotdm1zLmM6IFZNUyAtPiBIT19WTVMuCi0JKiByZWFkLmM6IEZpbmlzaCBjb252ZXJzaW9uIHRvIFNfKiBtYWNyb3MgaW4gdGhlIFZNUyBvbmx5Ci0JICBwYXJ0cyBvZiB0aGUgcHJvZ3JhbS4gQWRkICJjb25zdCIgbW9kaWZpZXIgdG8gaGV4X3ZhbHVlLgotCSogYXMuYywgcmVhZC5jLCBzeW1ib2xzLmMsIHdyaXRlLmM6IENoYW5nZSAiaWZkZWYgVk1TIiB0bwotCSAgImlmZGVmIE9CSl9WTVMiLgotCSogZXhwci5jOiBBZGQgImNvbnN0IiBtb2RpZmllciB0byBoZXhfdmFsdWUuCi0JKiBzeW1ib2xzLmM6IEZpbmlzaCBjb252ZXJzaW9uIHRvIFNfKiBtYWNyb3MgaW4gdGhlIFZNUyBvbmx5Ci0JICBwYXJ0cyBvZiB0aGUgcHJvZ3JhbS4gIEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvCi0JICBtZF9bbG9uZyxzaG9ydF1fanVtcF9zaXplLiBSZW1vdmUgZGVjbGFyYXRpb24gb2YgY29uc3RfZmxhZwotCSAgKHdoaWNoIHdpbGwgYmUgZGVjbGFyZWQgaW4gb2JqLXZtcy5oKS4KLQkqIHdyaXRlLmM6IEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvIG1kX1tsb25nLHNob3J0XV9qdW1wX3NpemUuCi0JICBGaXggYXJndW1lbnRzIHRvIFZNU193cml0ZV9vYmplY3RfZmlsZS4KLQkqIGNvbmZpZy1nYXMuY29tOiBOZXcgZmlsZS4gIFNjcmlwdCBmb3IgVk1TIHN5c3RlbXMgdG8gc2V0IHVwIHRoZQotCSAgY29uZmlndXJhdGlvbiB0byBidWlsZCBnYXMgZm9yIFZNUywgYW5kIGNyZWF0ZSBjb25maWcuc3RhdHVzLgotCSogbWFrZS1nYXMuY29tOiBSZWRvbmUgdG8gd29yayB3aXRoIG5ldyBzY2hlbWUuCi0JKiBvYmotdm1zLmM6IFBhdGNoIHRvIGZpeCBidWcgd2hlcmUgd2Ugd2VyZSBub3QgY29ycmVjdGx5IHBhcnNpbmcgdGhlCi0JICBzdGFicyBkaXJlY3RpdmVzLgotCSogb2JqLXZtcy5jOiAgRGVmaW5lIG1hY3JvcyBDT1BZX0xPTkcgYW5kIENPUFlfU0hPUlQgd2hpY2gKLQkgIHdpbGwgc3dhcCBieXRlcyBpZiBuZWVkZWQgb24gYSBiaWcgZW5kaWFuIHN5c3RlbS4gIFVzZSB0aHJvdWdob3V0Ci0JICBhcyBuZWVkZWQuCi0JKiBvYmotdm1zLmMgKG9ial9hb3V0X3N0YWIpOiAgQWRkIGNvZGUgdG8gZ2VuZXJhdGUgbGlzdGluZyBmaWxlLgotCSogb2JqLXZtcy5jIChWTVNfdHlwZWRlZl9wYXJzZSk6IEFkZCBhbGlhcyB0byBjb3JyZWN0bHkgaGFuZGxlIGNlcnRhaW4KLQkgIHR5cGVzIG9mIG1hbGZvcm1lZCBzdGFicy4gIENoYW5nZSBwYXJzaW5nIGFsZ29yaXRobSBzbyB0aGF0IHdlIGFyZQotCSAgbW9yZSBjZXJ0YWluIG9mIGhhdmluZyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgbmVlZCBvbiBoYW5kLgotCSogb2JqLXZtcy5jIChmaW5hbF9mb3J3YXJkX3JlZmVyZW5jZSk6ICBOZXcgZnVuY3Rpb24sIHVzZWQgdG8gaGVscAotCSAgcmVzb2x2ZSB0aGUgZGF0YSB0eXBlcyBvZiBhcyBtYW55IHN0cnVjdCBlbGVtZW50cyBhcyBwb3NzaWJsZQotCSAgd2hlbiBzb21lIHBhcnQgb2YgdGhlIHN0cnVjdCBpcyBub3QgZnVsbHkgZGVmaW5lZCBieSB0aGUgY29tcGlsZXIuCi0JKiBvYmotdm1zLmMgKFZNU19MU1lNX1BhcnNlKTogIENvcnJlY3RseSBoYW5kbGUgY2FzZSBvZiBjb250aW51YXRpb24KLQkgIHN0YWJzIGRpcmVjdGl2ZXMuCi0JKiBvYmotdm1zLmMgKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IERlZmluZSBhbGwgdnRhYmxlIHBzZWN0cwotCSAgYXMgc3ltYm9scyBhcyB3ZWxsIGluIHRoZSBvYmplY3QgZmlsZS4gIExvb2sgZm9yIGV4dGVybmFsIGZ1bmN0aW9ucwotCSAgdGhhdCBzdGFydCB3aXRoICJfX3Z0LiIsIGFuZCB0dXJuIHRoZW0gaW50byB2YXJpYWJsZXMsIHNpbmNlIHRoZQotCSAgZysrIGNvbXBpbGVyIGlzIGluY2FwYWJsZSBvZiBkb2luZyB0aGlzLgotCSogdGMtdmF4LmM6IEFkZCAnMScgb3B0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgR0NDCi0JICB2ZXJzaW9ucy4KLQkqIGJpZ251bS1jb3B5LmMgKGJpZ251bV9jb3B5KTogRml4IGJ1ZyB3aGVyZSB3ZSBwYWQgd2l0aCB6ZXJvZXMuCi0JKiBpbnB1dC1zY3J1Yi5jIChhc193aGVyZSk6IEZpeCBidWcgd2hlcmUgYXMgd291bGQgY3Jhc2ggaWYgd2UgZGlkIG5vdAotCSAgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgeWV0LgotCSogY29uZmlnL2hvLXZtcy5oOiBkZWZpbmUgSE9fVk1TLCBub3QgSE9fVkFYLgotCi1Nb24gSmFuICA0IDA1OjE3OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfZGF0YSk6IEFsd2F5cyB1c2UgImRhdGFfc2VjdGlvbiIsIHNpbmNlIGl0J2xsIG1hcCB0bwotCVNFR19EQVRBIG9yIFNFR19FMSBpZiBuZWVkZWQuCi0JKHNfbGNvbW0pOiBMaWtld2lzZSB3aXRoIGJzc19zZWN0aW9uLgotCShzX2ZpbGwpOiBVc2UgbWVtc2V0LCBub3QgYnplcm8uCi0KLVRodSBEZWMgMzEgMDQ6Mjk6MjcgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYzogRGVsZXRlZCBzb21lIGNvZGUgdW5kZXIgIiNpZmRlZiBET05UREVGIiB0aGF0IHdhcyBmb3IKLQloYW5kbGluZyBHREIgc3ltYm9sIHRhYmxlIGRhdGEuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChzZWdtZW50X25hbWUpOiBEZWxldGUgZGVmaW5pdGlvbi4KLQkoc2VnX25hbWUpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoc2VnbWVudF9uYW1lLCBzZWdfbmFtZSk6IERpdHRvLgotCSogY29uZmlnL29iai12bXMuaCAoc2VnbWVudF9uYW1lLCBzZWdfbmFtZSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmLmggKHNlZ21lbnRfbmFtZSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKHNlZ21lbnRfbmFtZSk6IERpdHRvLgotCi0JKiBDaGFuZ2VzIGZvciBCRkRfQVNTRU1CTEVSOgotCSogb2JqLmggKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBEZWNsYXJlIG9ubHkgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUi4KLQkob2JqX2hlYWRlcl9hcHBlbmQsIG9ial9wcmVfd3JpdGVfaG9vayk6IERpdHRvLgotCSogYXMuaCAoc3Rkb3V0cHV0KTogTmV3IHZhciwgZGVmaW5lZCBvbmx5IGlmIEJGRF9BU1NFTUJMRVIuCi0JKHNlZ1QpIFtCRkRfQVNTRU1CTEVSXTogTmV3IHR5cGVkZWYgZm9yICJhc2VjdGlvbiAqIi4KLQkoc2VnbWVudF9uYW1lKSBJZiBCRkRfQVNTRU1CTEVSLCBsb29rIHVwIEJGRCBzZWN0aW9uIG5hbWU7Ci0Jb3RoZXJ3aXNlLCB1c2Ugc2VnX25hbWUgYXJyYXkuCi0JKHNlZ19uYW1lKTogRGVjbGFyZSBvbmx5IGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCShzZWN0aW9uX2FsaWdubWVudCk6IERlY2xhcmUgb25seSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkoYmlnX3NlY3Rpb24sIHJlZ19zZWN0aW9uLCBwYXNzMV9zZWN0aW9uLCBkaWZmX3NlY3Rpb24sCi0JYWJzZW50X3NlY3Rpb24sIHRleHRfc2VjdGlvbiwgZGF0YV9zZWN0aW9uLCBic3Nfc2VjdGlvbik6IElmCi0JQkZEX0FTU0VNQkxFUiwgZGVjbGFyZSBhcyB2YXJpYWJsZXM7IG90aGVyd2lzZSwgZGVjbGFyZSBhcyBtYWNyb3MsCi0JbWFwcGluZyB0byBzZWdUIGVudW0gdmFsdWVzLgotCSh0Y19hb3V0X2ZpeF90b19jaGFycywgbmV4dF9vYmplY3RfZmlsZV9jaGFyUCk6IEZvcmNlIHBhcnNlIGVycm9ycwotCWlmIHRoZXNlIGFyZSB1c2VkIG9yIGRlZmluZWQsIGlmIEJGRF9BU1NFTUJMRVIuCi0JKHN1YnNlZ19zZXQsIHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogRnVuY3Rpb25hbGl0eSBvZiBvbGQKLQlzdWJzZWdfbmV3IHNwbGl0IGludG8gdHdvIGZ1bmN0aW9ucy4KLQkoU0VHX05PUk1BTCk6IEZvciBCRkRfQVNTRU1CTEVSLCBhbHdheXMgcmV0dXJuIHRydWUsIGZvciBub3cuCi0KLQkqIGFzLmggKHZvbGF0aWxlKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQkoaGFkX2Vycm9ycywgaGFkX3dhcm5pbmdzKTogUHJvdmlkZSBwcm90b3R5cGVzIGZvciBBTlNJIEMgZXZlbiBpZgotCU5PX1NUREFSRy4KLQkoYXNfYmFkLCBhc19mYXRhbCwgYXNfdHNrdHNrLCBhc193YXJuKTogRm9yIEdOVSBDIHZlcnNpb24gMiwKLQlkZWNsYXJlIHdpdGggZm9ybWF0IGF0dHJpYnV0ZSBmb3IgLVdmb3JtYXQgY2hlY2tpbmcuCi0KLVdlZCBEZWMgMzAgMTA6MTg6NTcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYywgY29uZmlnL3RjLSouYzogRG9uJ3QgaW5jbHVkZSByZWFkLmgsIHNpbmNlIGl0IGlzIGFscmVhZHkKLQlpbmNsdWRlZCBieSBhcy5oLgotCi0JKiBUaGVzZSBhcmUgYmFzZWQgb24gcGF0Y2hlcyBmcm9tIE1pbmggVHJhbi1sZQotCTxtdHJhbmxlQHBhcmlzLmludGVsbGljb3JwLmNvbT4uCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtaWJtLWFpeCopOiBBY2NlcHQgaTQ4NiBmb3IgaG9zdC4gIFVzZQotCW9ial9mb3JtYXQgY29mZmJmZCBhbmQgZ2FzX3RhcmdldCBpMzg2Y29mZiBmb3IgdGFyZ2V0LgotCShpWzM0XTg2LSotaXNjKik6IE5ldyBob3N0ICh1c2VzIHN5c3YpLgotCSogY29uZmlnL2kzODZhaXgubXQ6IFJlbW92ZWQgKG5vIGxvbmdlciB1c2VkKS4KLQkqIGNvbmZpZy9taC1pMzg2YWl4IChSQU5MSUIpOiBVc2UgdHJ1ZSByYXRoZXIgdGhhbiAvYmluL3RydWUuCi0JKE1JTlVTX0cpOiBSZW1vdmVkLgotCShMREZMQUdTKTogQWRkZWQsIGRlZmluZWQgYXMgLXNobGliLgotCSogY29uZmlnL3RlLWkzODZhaXguaCAoUkVWRVJTRV9TT1JUX1JFTE9DUyk6IFVuZGVmaW5lLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oIChMT0NBTF9MQUJFTCk6IERvbid0IGRlZmluZS4KLQkoRE9UX0xBQkVMX1BSRUZJWCk6IERlZmluZS4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIERPVF9MQUJFTF9QUkVGSVgsIHVzZSAuTDBcMDAxIGFzIGEgbGFiZWwKLQluYW1lIHJhdGhlciB0aGFuIEwwXDAwMS4KLQkqIHJlYWQuYyAoc19sY29tbSk6IE1ha2UgYSBmcmFnIGluIFNFR19CU1MgcmF0aGVyIHRoYW4gdXNpbmcKLQlsb2NhbF9ic3NfY291bnRlci4KLQkqIHN5bWJvbHMuYywgc3ltYm9scy5oIChsb2NhbF9ic3NfY291bnRlcik6IFJlbW92ZWQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGJzcyBubyBsb25nZXIgdXNlcwotCWxvY2FsX2Jzc19jb3VudGVyLiAgUGFzcyBjb3JyZWN0IGRhdGEgYW5kIGJzcyBzaXplIHRvCi0JVk1TX3dyaXRlX29iamVjdF9maWxlLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3dyaXRlX29iamVjdF9maWxlKTogQWNjZXB0IGJzcyBzaXplIGFzCi0JYXJndW1lbnQsIHJhdGhlciB0aGFuIHVzaW5nIGxvY2FsX2Jzc19jb3VudGVyLgotCSogY29uZmlnL3RjLW04OGsuYyAoc19ic3MpOiBEb24ndCB1c2UgbG9jYWxfYnNzX2NvdW50ZXIuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogRG9uJ3QgdXNlIGxvY2FsX2Jzc19jb3VudGVyLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGhhZF9saW5lbm8sIGhhZF9yZWxvYyk6IFJlbW92ZWQuCi0JKHNpemVfc2VjdGlvbik6IFJlc3RvcmVkIHNhbml0eSBjaGVjay4KLQkoZG9fcmVsb2NzX2Zvcik6IEJhc2Ugc2VjdGlvbiBhZGRyZXNzIG9uIHNfcGFkZHIgcmF0aGVyIHRoYW4KLQljb21wdXRpbmcgaXQuICBBZGp1c3QgYTI5ayBSX0lISUhBTEYgc3BlY2lhbCBjYXNlIHRvIGFjY291bnQgZm9yCi0Jc2VjdGlvbiBwYWRkciAodXNlZCB0byByZXF1aXJlIHBhZGRyIHRvIGJlIHplcm8pLiAgSWYgdGhlcmUgYXJlIG5vCi0JcmVjbG9zLCBzZXQgc19yZWxwdHIgdG8gMC4gIFNldCByZWxvY2F0aW9uIHNpemUgaW4gb2JqZWN0X2hlYWRlcnMuCi0JKGZpbGxfc2VjdGlvbik6IEFsd2F5cyBzZXQgc192YWRkciBoZXJlLCByZW1vdmluZwotCVpFUk9fQkFTRURfU0VHTUVOVFMgY2FzZS4gIEZvcmNlIHNfc2NucHRyIGZvciBic3MgdG8gMC4gIERvbid0IHNldAotCU5PTE9BRCBmb3IgaTM4NiAuYnNzLCBiZWNhdXNlIGl0IGNvbmZ1c2VzIHRoZSBTVlIzIG5hdGl2ZSBsaW5rZXIuCi0JU2V0IFNUWVBfSU5GTyBmb3IgLmNvbW1lbnQuCi0JKGNvZmZfaGVhZGVyX2FwcGVuZCk6IFVzZSBvYmplY3QgaGVhZGVycyBhbmQgSF97U0VULEdFVH1fKiBtYWNyb3MuCi0JTWFrZSBhb3V0aGRyIHdyaXRpbmcgZGVwZW5kIG9uIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSLgotCShjcmF3bF9zeW1ib2xzKTogSGFuZGxlIDggY2hhcmFjdGVyIHNlY3Rpb24gbmFtZSBjb3JyZWN0bHkuICBVc2UKLQlIX3tTRVQsR0VUfV8qIG1hY3Jvcy4KLQkoZG9fbGluZW5vc19mb3IpOiBTZXQgbGluZW5vIHNpemUgaW4gb2JqZWN0X2hlYWRlcnMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogVXNlIEhfe1NFVCxHRVR9XyogbWFjcm9zLiAgRG9uJ3QgYm90aGVyIHRvCi0Jc2V0IHNfdmFkZHIgaGVyZS4gIElmIHN0cmluZ19ieXRlX2NvdW50IHJlbWFpbnMgNCwgc2V0IGl0IGJhY2sgdG8KLQkwLCBhbmQgb25seSB3cml0ZSBzdHJpbmdzIG91dCBpZiB0aGVyZSBhcmUgc29tZS4gIENhbGwKLQlmaWxsX3NlY3Rpb24gYmVmb3JlIGRvX3JlbG9jc19mb3IgYW5kIGRvX2xpbmVub3NfZm9yLgotCShvYmpfY29mZl9zZWN0aW9uKTogSGFuZGxlIG9wdGlvbmFsIHF1b3RlZCBzZWNvbmQgYXJndW1lbnQgZ2l2aW5nCi0Jc2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MuCi0JKG9ial9jb2ZmX2Jzcyk6IEFkZGVkIHRvIGhhbmRsZSAuYnNzLgotCShvYmpfY29mZl9pZGVudCk6IEFkZGVkIHRvIGhhbmRsZSAuaWRlbnQgKHB1dHMgc3RyaW5nIGluIC5jb21tZW50Ci0Jc2VjdGlvbikuCi0JKG9ial9jb2ZmX2xjb21tKTogUHV0IGNvbW1vbiBzeW1ib2xzIGluIC5ic3MsIG5vdCAuZGF0YS4KLQkoZml4dXBfbWRlcHMpOiBDaGFuZ2UgdG8gc2VnbWVudC4gIENhbGwgZnJhZ193YW5lIGFmdGVyCi0JbWRfY29udmVydF9mcmFnLgotCShmaXh1cF9zZWdtZW50KTogRXhwbGljaXRseSBjaGVjayBTX0lTX0NPTU1PTiBiZWZvcmUgbWFraW5nIDM4NgotCWFkanVzdG1lbnQgKGFscmVhZHkgaGFwcGVuZWQgb25seSBmb3IgY29tbW9uIHN5bWJvbHMsIGJ1dCB0aGlzIGlzCi0JY2xlYXJlcikuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzX2Jzcyk6IERvbid0IHVzZSBpZiBJMzg2Q09GRi4KLQkobWRfcHNldWRvX3RhYmxlKTogSWdub3JlIC5vcHRpbSBhbmQgLm5vb3B0LgotCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWkzODYuaCAoUkVWRVJTRV9TT1JUX1JFTE9DUyk6IFVuZGVmLCBmb3IgU1ZSMwotCWNvbXBhdGliaWxpdHkuCi0JKExPQ0FMX0xBQkVMKTogUmVtb3ZlZCBkZWZpbml0aW9uLgotCShET1RfTEFCRUxfUFJFRklYKTogRGVmaW5lZC4KLQotTW9uIERlYyAyOCAxMDozMjowNSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGFwcF9wdXNoKTogVXNlIG1lbWNweSwgbm90IGJjb3B5LgotCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBGb3IgXCIsIHJldHVybiAiIG5vdCAnLgotCShzeW1ib2xfY2hhcnMpOiBOb3cgY29uc3QuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIG5vdCBMT0NBTF9MQUJFTFNfRkIsIGRvbid0IGxvb2sgZm9yICIwZiIKLQlhbmQgIjBiIi4gIElmIExPQ0FMX0xBQkVMU19ET0xMQVIsIGNoZWNrIGZvciAiMCQiLgotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogRG9uJ3QgdXNlICNlbGlmLgotCi0JKiBjb25maWcvaG8tc3Vub3MuaDogRG9uJ3QgaW5jbHVkZSBzeXMvc3RkdHlwZXMuaDsgNC4wLjMgZG9lc24ndAotCWhhdmUgaXQuICAoUmVwb3J0ZWQgYnkgTm9haCBGcmllZG1hbiwgZnJpZWRtYW5AZ251LmFpLm1pdC5lZHUuKQotCi1XZWQgRGVjIDE2IDEyOjEyOjMzIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYywgb2JqLWllZWUuYzogZG9uJ3QgZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOIGlmIGl0IGlzCi0JYWxyZWFkeSBkZWZpbmVkLgotCi1UdWUgRGVjIDE1IDEyOjQwOjExIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBhbGxvdyBzaW5nbGUgcXVvdGUgc3RyaW5ncyBpZiBzbwotCWNvbmZpZ3VyZWQuCi0KLQkqIGNvbmZpZy8qejhrKjogY2hlY2twb2ludAotCi1TdW4gRGVjIDEzIDAwOjA0OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBhdm9pZCBjYWxsaW5nIHhtYWxsb2MgKDApLgotCi1TYXQgRGVjIDEyIDE1OjI2OjM0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jOiBDYWxsIHhtYWxsb2MsIG5vdCBtYWxsb2M7IGRvbid0IGRlY2xhcmUgbWFsbG9jLgotCi0JKiBDaGFuZ2VzIHRvIHN1cHBvcnQgU0NPIDMuMnY0OgotCSogcmVhZC5jIChzX2FsaWduX2J5dGVzLCBzX2FsaWduX3B0d28pOiBJZiBub3QgU0VHX0RBVEEgb3IKLQlTRUdfQlNTLCBmaWxsIHdpdGggTk9QX09QQ09ERS4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdDogQWRkIG9wY29kZS9pMzg2LmggdG8gVEFSR19DUFVfREVQRU5ERU5UUy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogSW5jcmVtZW50IGFkZHIgZXZlbiBpZiBub3QKLQl1c2luZyBaRVJPX0JBU0VEX1NFR01FTlRTLgotCShmaWxsX3NlY3Rpb24pOiBJZiBaRVJPX0JBU0VEX1NFR01FTlRTLCBzZXQgc2VnbWVudCBhZGRyZXNzZXMsIGJ1dAotCW5ldmVyIHNldCBzZWdtZW50IGFkZHJlc3MgZm9yIFNFR19FMiAoLmJzcykgYW5kIGRvbid0IHdyaXRlIG91dAotCVNFR19FMiBjb250ZW50cy4gIFNldCAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgdG8gU1RZUF9URVhULgotCShvYmpfY29mZl9lbmRlZik6IERvbid0IG1lcmdlIGxhYmVscyBvciBzeW1ib2xzIGF3YWl0aW5nIGZvcndhcmQKLQlkZWZpbml0aW9ucywgYW5kIGRvbid0IG1lcmdlIHRhZ3Mgd2l0aCBub24tdGFncy4gIENoZWNrIGZvciAuYmYKLQlyYXRoZXIgdGhhbiBqdXN0IGNoZWNraW5nIHdoZXRoZXIgdGhlIHNlY29uZCBjaGFyYWN0ZXIgaXMgYiBhbmQKLQl0aGUgdGhpcmQgY2hhcmFjdGVyIGlzIGYuCi0JKG9ial9jb2ZmX3ZhbCk6IGdjYyBjYW4gZ2VuZXJhdGUgdmFsdWVzIHdoaWNoIHdlIGRvbid0IGhhbmRsZQotCWNvcnJlY3RseTsgZGlzY2FyZCBpbmZvcm1hdGlvbiBmb3Igbm93LCBzaW5jZSBpdCBvbmx5IGFmZmVjdHMgdGhlCi0JZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSh0YWdfZmluZF9vcl9uYW1lKTogRG9uJ3QgaW5zZXJ0IHRhZ3MgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQkoeWFua19zeW1ib2xzKTogRG9uJ3QgbWVyZ2UgbGFiZWxzLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IGRlZmluZSBTVUJfU0VHTUVOVF9BTElHTiBpZiBpdCBpcwotCWFscmVhZHkgZGVmaW5lZC4gIEZpbGwgc3Vic2VnbWVudHMgd2l0aCBOT1BfT1BDT0RFLCBub3QgMC4gIERvbid0Ci0Jc2V0IHNlZ21lbnQgYWRkcmVzcyBpZiBaRVJPX0JBU0VEX1NFR01FTlRTLgotCShvYmpfY29mZl9zZWN0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgYSB0cmFpbGluZyBxdW90ZWQgc3RyaW5nLCBhcwotCXVzZWQgaW4gQVQmVCBpMzg2IHN5bnRheC4KLQkoZml4dXBfc2VnbWVudCk6IFRha2Ugc2VnbWVudCBhcyBhcmd1bWVudC4gIE9uIHRoZSBpMzg2LCBhZGp1c3QgUEMKLQlyZWxhdGl2ZSBhZGRlbmRzIGJ5IHRoZSBzZWdtZW50IHZhZGRyLgotCSogdGMtaTM4Ni5oOiBEZWZpbmUgU1VCX1NFR01FTlRfQUxJR04uCi0JKiB0Yy1hMjlrLmg6IERlZmluZSBaRVJPX0JBU0VEX1NFR01FTlRTLgotCSogdGMtaTM4Ni5jOiAoaTM4Nl9vcGVyYW5kKTogSWYgSTM4NkNPRkYsIGFjY2VwdCBhbnkgc2VnbWVudCB0eXBlLgotCi1UdWUgRGVjICA4IDAwOjA2OjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IEluY2x1ZGUgbGliY29mZi5oLgotCi0JKiB2ZXJzaW9uLmM6IE5vdyB2ZXJzaW9uIDEuOTMuCi0KLU1vbiBEZWMgIDcgMDA6Mzk6MDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IEZvciAzODZic2QgYW5kIGxpbnV4LCBkbwotCXBvd2VyLW9mLXR3byBhbGlnbm1lbnQgZm9yIC5hbGlnbi4KLQotCSogYXMuaDogSWYgQlJPS0VOX0FTU0VSVCwganVzdCByZWRlZmluZSBgYXNzZXJ0JyB0byBiZSB0cml2aWFsLAotCWFuZCBsZWF2ZSBldmVyeXRoaW5nIGVsc2UgYWxvbmUuCi0KLUZyaSBEZWMgIDQgMTY6NTg6NDIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXMubmV3KTogRG9uJ3QgYm90aGVyIHNhdmluZyBhcy5vbGQuCi0KLQkqIHdyaXRlLmM6IENvbmRpdGlvbmFsaXplIG9uIE9CSl9WTVMsIG5vdCBWTVMuCi0JKG1hZ2ljX251bWJlcl9mb3Jfb2JqZWN0X2ZpbGUpOiBEb24ndCBkZWZpbmUgaWYgT0JKX1ZNUy4KLQotCSogY29uZmlnL29iai12bXMuYzogQ2hhbmdlcyBmb3IgdHJhZGl0aW9uYWwgQy4KLQotVGh1IERlYyAgMyAwMToyNDowNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLWdlbmVyaWMuaCAobWFsbG9jLCByZWFsbG9jKTogRGVjbGFyZS4KLQotCSogTG90cyBvZiBjb21tZW50L3doaXRlc3BhY2UgY2hhbmdlcy4KLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IFNvbWUgZmllbGRzIHJlb3JkZXJlZCwgbmFycm93ZWQuCi0KLQkqIHJlYWQuYyAoTUFTS19DSEFSKTogRGVmaW5lIHVzaW5nIEMgdHlwZXMsIG5vdCBtYWdpYyBudW1iZXIuCi0KLQkqIGFzLmMsIGlucHV0LWZpbGUuYzogRGVsZXRlZCBzb21lIHVudXNlZCBjb2RlLgotCi0JKiBhcHAuYywgYXMuaDogRG9jIGZpeC4KLQotCSogZmxvbnVtLWtvbnN0LmMsIGZsb251bS1tdWx0LmM6IEluY2x1ZGUgYW5zaWRlY2wuaC4KLQotCSogYXMuaCAoeG1hbGxvYyk6IEFyZ3VtZW50IGlzIGxvbmcuCi0KLQkqIHhtYWxsb2MuYyAoZXJyb3IpOiBSZW1vdmUgZGVjbGFyYXRpb247IGFzLmggdGFrZXMgY2FyZSBvZiBpdC4KLQotCSogZG9jL2FzLnRleGluZm86IFJlZ3JvdXBlZCBkb2N1bWVudGF0aW9uIG9mIHNvbWUgY29tbWFuZC1saW5lCi0Jb3B0aW9ucy4gIFVwZGF0ZWQgb3B0aW9ucyBkb2N1bWVudGF0aW9uIGZvciBtNjhrLiAgU29tZSBtaW5vcgotCXdvcmRpbmcvcHVuY3R1YXRpb24gY2hhbmdlcy4KLQotTW9uIE5vdiAzMCAxMTo0MjoxMSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IHRhcmdldCBPUyAidm1zIi4KLQotCSogc3ltYm9scy5jOiAgTWVyZ2VkIEFOU0kgYW5kIG5vbi1BTlNJIGZ1bmN0aW9uIGRlY2xzLCB1c2luZwotCVBBUkFNUyBtYWNyby4KLQotCSogeG1hbGxvYy5jOiBKdXN0IGluY2x1ZGUgYXMuaCwgZG9uJ3QgYm90aGVyIHRyeWluZyB0byBmaWd1cmUgb3V0Ci0Jb3RoZXIgaGVhZGVyIGZpbGVzLgotCi0JKiBzdHJzdHIuYywgc3RyZXJyb3IuYzogRGVsZXRlZC4KLQkqIE1ha2VmaWxlLmluOiBEZWxldGVkIHJlZmVyZW5jZXMuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBEb24ndCBpbmNsdWRlIGhlYWRlciBmaWxlIGZvciBzdHJpbmcKLQlkZWNsYXJhdGlvbnM7IGxlYXZlIHRoYXQgdG8gaG8tKi5oLgotCi1GcmkgTm92IDI3IDA0OjExOjM2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybiBhdCBjYW1icmlkZ2UtbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9jb2ZmX2dudS5oIFtUQ19JODYwXTogR3Vlc3NlcyBmb3IgcmVsb2MgdHlwZSB2YWx1ZXMsCi0JaW1wb3J0ZWQgZnJvbSBGU0Ygc291cmNlcy4KLQotCSogbWVzc2FnZXMuYyAoc3RyZXJyb3IpOiBEZWNsYXJlIHVuY29uZGl0aW9uYWxseS4KLQotCSogYXMuaDogRGVsZXRlIGFsbG9jYSBhbmQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAobWFzayk6IE5vdyBjb25zdC4KLQotCSogb2JzdGFjay5jLCBvYnN0YWNrLmg6IERlbGV0ZWQuCi0KLQkqIGFzLmggKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KTogTmV3IGZsYWcuCi0JKiBhcy5jIChtYWluKTogU2V0IGl0IGZvciAtUi4KLQotCSogYXMuaCAoZmxhZ19zdXBwcmVzc193YXJuaW5ncyk6IE5ldyBmbGFnLgotCSogYXMuYyAobWFpbik6IFNldCBpdCBmb3IgLVcuCi0JKiBtZXNzYWdlcy5jIChhc193YXJuKTogQ2hlY2sgaXQgaW5zdGVhZCBvZiBmbGFnc2VlblsnVyddLgotCi0JKiBhcy5oIChmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQpOiBOZXcgZmxhZy4KLQkqIGFzLmMgKG1haW4pOiBTZXQgaXQgZm9yIC1aLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaDogRGVmaW5lIE5FRURfRlhfUl9UWVBFLgotCSogY29uZmlnL3RjLWEyOWsuaDogRGl0dG8uCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogRG9uJ3QgY29uZGl0aW9uYWxpemUgZnhfcl90eXBlIGZpZWxkIG9uIFRDCi0JbWFjcm9zLgotCi0JKiBhcy5oOiBNZXJnZWQgQU5TSSBhbmQgbm9uLUFOU0kgZnVuY3Rpb24gZGVjbHMsIHVzaW5nIFBBUkFNUwotCW1hY3JvLgotCSogYmlnbnVtLmgsIGV4cHIuaCwgZmxvbnVtLmgsIGZyYWdzLmgsIGlucHV0LWZpbGUuaCwgbGlzdGluZy5oLAotCW9iai5oLCBvdXRwdXQtZmlsZS5oLCByZWFkLmgsIHN0cnVjLXN5bWJvbC5oLCBzeW1ib2xzLmgsIHRjLmgsCi0Jd3JpdGUuaDogTGlrZXdpc2UuCi0JKiByZWFkLmM6IExpa2V3aXNlLgotCi0JKiB4bWFsbG9jLmM6IENvbmRpdGlvbmFsaXplIG9uIEhBVkVfTUFMTE9DX0gsIG5vdCBVU0cuICBGb2xkIGluCi0JeHJlYWxsb2MgZnJvbSB4cmVhbGxvYy5jLgotCSogeHJlYWxsb2MuYzogRGVsZXRlZC4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMsIE9CSlMpOiBBZGp1c3RlZC4KLQotCSogY29uZmlndXJlLmluOiBGb3IgaG9zdCBDUFUgYTI5aywgcnM2MDAwLCB2YXgsIGNvbnNpZGVyIHVzaW5nIGJzZAotCW9yIHZtcyBoby0gZmlsZXMuCi0KLQkqIGNvbmZpZy9oby1zeXN2LmggKHNldGJ1ZmZlciwgSE9fVVNHKTogRGVsZXRlZC4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChhdG9mX2llZWUpOiBFeHBvbmVudCBmaWVsZCBpc24ndCBhIHBvaW50ZXI7Ci0JZG9uJ3QgaW5pdGlhbGl6ZSBpdCB3aXRoIE5VTEwuCi0KLQkqIGNvbmZpZy9oby12YXguaCAoTV9WQVgpOiBEZWxldGVkOyB3YXMgdW51c2VkLgotCi0JKiBSRUFETUUtdm1zLCBjb25maWcvaG8tdm1zLmgsIGNvbmZpZy9vYmotdm1zLmMsIGNvbmZpZy9vYmotdm1zLmg6Ci0JTmV3IGZpbGVzIGltcG9ydGVkIGZyb20gRlNGIHZlcnNpb24sIGNvbnRyaWJ1dGVkIGJ5IEVyaWMgWW91bmdkYWxlLgotCSogUkVBRE1FLXZtcy1kYmcsIGNvbmZpZy92bXM6IERlbGV0ZWQuCi0KLQkqIENoYW5nZUxvZywgY29uZmlnL0NoYW5nZUxvZzogTWVyZ2VkLgotCi0JKiBjb25maWcvKnRhaG9lKiwgY29uZmlndXJlLmluOiBUYWhvZSBzdXBwb3J0IGJyb3VnaHQgaW4gZnJvbSBGU0YKLQl2ZXJzaW9uLgotCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IEVsaW1pbmF0ZSBjYWxsIHRvIHNldHZidWYuCi0JW1VTR10gKHNldGJ1ZmZlcik6IERlbGV0ZWQgbWFjcm8uCi0KLU1vbiBOb3YgMjMgMTE6MDA6MTYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFsbCBmaWxlczogV2hpdGVzcGFjZSBjaGFuZ2VzIGZvciBHTlUgaW5kZW50YXRpb24gc3R5bGUsIGRvbmUgYnkKLQlHTlUgYGluZGVudCcuICBTb21lIGNsZWFudXAgc3RpbGwgbmVlZGVkLCBlc3BlY2lhbGx5IG9mIGNvbW1lbnRzLgotCi0JKiBjb25maWd1cmUuaW46IE5vIHRlLTM4NmJzZC5oIGZpbGUgZXhpc3RzOyBkb24ndCB0cnkgdG8gdXNlIGl0LgotCi0JKiBvYmotY29mZi5jIChvYmpfY29mZl9lbmRlZik6IFVzZSBhc193YXJuLCBub3QgZnByaW50Zi4KLQotCSogdGMtbTY4ay5jIChtZF9hc3NlbWJsZSk6IERvbid0IGNvbXBsYWluIGFib3V0IDY4MDAwIHdpdGggNjg4ODE7Ci0JY291bGQgYmUgZG9pbmcgZW11bGF0aW9uLgotCi1UaHUgTm92IDE5IDExOjQ3OjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JejgwMDAgZG9jdW1lbnRhdGlvbgotCSogZG9jL01ha2VmaWxlLmluLCBkb2MvYWxsLm00LCBkb2MvYXMtYWxsLnRleGluZm8sIGRvYy9hcy50ZXhpbmZvOgotCWFsbCBtb2RpZmllZC4KLQotVHVlIE5vdiAxMCAwOTo0OToyNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcy5vLCBvYmotZm9ybWF0Lm8pOiBhZGRlZCBkZXBlbmRlbmN5IG9uIHN1YnNlZ3MuaC4KLQotCSogc3Vic2Vncy5oOiBhZGQgZXh0ZXJuIHRvIHNlZ21lbnRfaW5mbyBkZWNsYXJhdGlvbi4KLQotCSogcmVhZC5oOiBhZGRlZCBleHRlcm4gZGVjbGFyYXRpb25zIGZvciBjb21tZW50X2NoYXJzLAotCWxpbmVfY29tbWVudF9jaGFycywgYW5kIGxpbmVfc2VwYXJhdG9yX2NoYXJzLgotCXJlYWQuYywgYXBwLmM6IHJlbW92ZWQgZGVmaW5pdGlvbnMgb2YgY29tbWVudF9jaGFycywKLQlsaW5lX2NvbW1lbnRfY2hhcnMsIGFuZCBsaW5lX3NlcGFyYXRvcl9jaGFycy4KLQotCSogdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IElmIFJFR0lTVEVSX1BSRUZJWCBpc24ndCBkZWZpbmVkLAotCXN0aWxsIGFjY2VwdCAoYnV0IGRvbid0IHJlcXVpcmUpIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCBiZWZvcmUKLQl0aGUgcmVnaXN0ZXIgbmFtZS4KLQkoaW5zZXJ0X3JlZyk6IHB1dCBSRUdJU1RFUl9QUkVGSVggYmVmb3JlIHJlZ2lzdGVyIG5hbWVzIGJlZm9yZQotCXB1dHRpbmcgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCSogdGMtbTY4ay5oIChPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgpOiBEZWZpbmUgdG8gYmUgIiUiLCBpZiBub3QKLQlNNjhLQ09GRi4KLQotCSogb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogc2V0IFNUWVBfTk9MT0FEIGJpdCBmb3IgLmJzcwotCXNlY3Rpb24uCi0KLQkqIGF0b2YtaWVlZS5jLCBhdG9mLW5zMzJrLmMsIHRjLSouYzogbWFkZSBFWFBfQ0hBUlMsIEZMVF9DSEFSUywKLQljb21tZW50X2NoYXJzLCBsaW5lX2NvbW1lbnRfY2hhcnMgYW5kIGxpbmVfc2VwZXJhdG9yX2NoYXJzCi0JY29uc2lzdGVudGx5IGNvbnN0LCBhbmQgYWx3YXlzIGluaXRpYWxpemVkIHRoZW0uICBJbmNsdWRlZCByZWFkLmguCi0KLVRodSBOb3YgIDUgMTc6NTU6NDEgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiB0Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFkZCBjb2RlIHRvIGZsYWcgZXJyb3IgaWYgYW4gYWJzb2x1dGUKLQljb25zdGFudCB3aWxsIG5vdCBmaXQgaW4gYW4gaW1tZWRpYXRlIGZpZWxkLgotCShtZF9hcHBseV9maXgsIFJFTE9DX0JBU0UxMyBjYXNlKTogQ2hlY2sgZm9yIHJlbG9jYXRpb24gb3ZlcmZsb3cuCi0KLVdlZCBOb3YgIDQgMDc6NTA6NDYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmLmMgKGNhbGxqX3RhYmxlKTogRGVsZXRlIGdsb2JhbCB2YXJpYWJsZS4KLQkob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBEZWZpbmUgaXQgbG9jYWxseSBoZXJlLCBhbmQgb25seSBpZgotCVRDX0k5NjAgaXMgZGVmaW5lZC4KLQotCSogdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IFVuZGVyc2NvcmUgaXMgcGFydCBvZiBhIHN5bWJvbCBuYW1lLgotCShtNjhrX2lwKTogRG9uJ3Qgd2FybiBhYm91dCBiaWdudW0gdXNlZCBhcyBmbG9hdCBiaXQtcGF0dGVybi4KLQotCSogb2JqLWNvZmYuYzogUmVwbGFjZWQgQU5TSSBhbmQgbm9uLUFOU0kgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0Jd2l0aCBhIHNpbmdsZSBzZXQgdXNpbmcgUEFSQU1TIG1hY3JvLgotCi0JKiB0Yy1pOTYwLmMgKHRjX2JvdXRfZml4X3RvX2NoYXJzKTogQml0LWZpZWxkIGZpeHVwcyB3YW50IGEgbGVuZ3RoCi0Jb2YgMi4KLQotCSogdGMtaTk2MC5jOiBNaXNzZWQgYSBjb3VwbGUgb2YgMC0+Tk9fUkVMT0MgY29udmVyc2lvbnMuCi0KLQkqIHRjLWk5NjAuaCAoTl9CQUxOQU1FLCBOX0NBTExOQU1FKTogRGVmaW5lIGFzIGNoYXItdHlwZSB2YWx1ZXMsCi0Jc28gd2lkZW5pbmcgd29ya3MgY29uc2lzdGVudGx5LgotCi1XZWQgT2N0IDI4IDA4OjUyOjM0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiB2ZXJzaW9uLmM6IFB1dCBjb25kaXRpb25hbCAiY29uc3QiIGJlZm9yZSB2ZXJzaW9uX3N0cmluZywgbm90Ci0JYmVmb3JlIGR1bW15IGZ1bmN0aW9uIGZvciBWTVMuICBOb3cgdmVyc2lvbiAxLjkxLjAzLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogTmVlZCBkb3VibGUtXCBiZWZvcmUgYDAwMCcgdG8gc2hvdwotCXByaW50ZWQgcmVwIG9mIG51bGwgY2hhcmFjdGVyLgotCi1GcmkgT2N0IDIzIDE0OjQwOjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBjaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfY2xvc2VfYWxsX2RvbmUuCi0KLVR1ZSBPY3QgMjAgMTI6MTg6MDggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBTdXBwb3J0IGZvciBpMzg2LXN5c3YuCi0Jb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvciwgd3JpdGVfb2JqZWN0X2ZpbGUpOiBzZXQgc2VnbWVudAotCWFkZHJlc3NlcyB0byByZWFzb25hYmxlIHNpemVzLiAgTmV3IGRlZmluZSBaRVJPX0JBU0VEX1NFR01FTlRTIGNhbgotCWJlIHVzZWQgdG8gc2V0IHRoZW0gYWxsIHRvIHplcm8gYXMgd2FzIGRvbmUgYmVmb3JlLgotCShmaWxsX3NlY3Rpb24pOiBzZWdtZW50IGFkZHJlc3NlcyBub3cgc2V0IGluIHdyaXRlX29iamVjdF9maWxlLgotCShmaWxsX3NlY3Rpb24pOiBEb24ndCBzZXQgU1RZUF9OT0xPQUQgZm9yIC5ic3Mgc2VjdGlvbi4KLQkoZml4dXBfc2VnbWVudCk6IDM4NiB1c2VzIHN0cmFuZ2UgY29tbW9uIHN5bWJvbCBmb3JtYXQuCi0JdGMtaTM4Ni5jICh0Y19jb2ZmX2ZpeDJydHlwZSk6IHVzZSBSX0RJUjMyLCBub3QgUl9SRUxMT05HLCBmb3IKLQljb21wYXRpYmlsaXR5IHdpdGggU1ZSMy4yIGxpbmtlci4KLQkqIGNvbmZpZ3VyZS5pbjogaTM4Ni1zeXN2IGFuZCBpMzg2LXNjbyB1c2UgY29mZmJmZC4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IGRpc2NhcmQgd2hpdGVzcGFjZSBhZnRlciBhIGxhYmVsLgotCi1TYXQgT2N0IDEwIDEyOjMzOjQ1IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gU3VuT1MgNCBhbmQgU29sYXJpczIgZm9yIFN1bjQKLQlob3N0cywgdXNlIHRoZSBzeXN2IGNvbmZpZ3VyYXRpb24gZm9yIHNvbGFyaXMyCi0KLU1vbiBPY3QgIDUgMDk6Mjg6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkgZml4IGk5NjArbm9uLWJmZCBjb2ZmIGJpdCByb3QuCi0JKiBvYmotY29mZi5jIChjX2RvdF9maWxlX3N5bWJvbCwgb2JqX2NvZmZfbG4sIG9ial9jb2ZmX2xpbmUpOgotCXN1cHBvcnQgZm9yIEMgc291cmNlIGxpc3RpbmdzLiAob2JqX2NvZmZfZW5kZWYpOiBsb29rIGluIHRoZSByaWdodAotCXBhcnQgb2YgdGhlIHN5bWJvbCBmb3IgdGhlIHN5bWJvbCBuYW1lCi0KLQkqIHRjLW02OGsuYyAoZ2V0X251bSk6IG1ha2UgaXQgd29yayBmb3IgYWxsIHNlZ21lbnRzLCBub3QganVzdCB0aGUKLQlmaXJzdCB0aHJlZS4KLQotTW9uIE9jdCAgNSAwMzozMDozNiAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGkzODYtKi1ic2QgZW11bGF0aW9uLgotCi1UaHUgT2N0ICAxIDIzOjA1OjEyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgdGhlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGZvciBob3N0IGFuZCB0YXJnZXQKLQotVHVlIFNlcCAyOSAxMjoyMjo1MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBkb24ndCBmaXh1cCBmb3IgdGhlIHo4awotCSogdGMtejhrLmM6IGxvdHMgb2YgYnVnIGZpeGVzCi0KLVR1ZSBTZXAgMjkgMTA6NTE6NTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0Yy1pOTYwLmgsIHRjLWk5NjAuYzogYXZvaWQgdGhlIEFOU0kgcHJlcHJvY2Vzc29yIGFkZGl0aW9uCi0JI2VsaWYsIHNpbmNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgb2xkIGNvbXBpbGVycy4KLQloby1yczYwMDAuaCwgdGMtbTY4ay5jOiB0aGUgbmF0aXZlIFJTLzYwMDAgY29tcGlsZXIgbWlzY29tcGlsZXMgYQotCWNvdXBsZSBvZiBleHByZXNzaW9ucyBpbiB0Yy1tNjhrLmMuCi0KLU1vbiBTZXAgMjggMjE6MTg6MjQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGNvbnMpOiBJZiBOT19SRUxPQyBpcyBkZWZpbmVkLCB1c2UgaXQuCi0KLQkqIHRjLWk5NjAuYyAoZ2V0X2NkaXNwKTogVXNlIE5PX1JFTE9DLCBub3QgMCwgaW4gY2FsbCB0byBmaXhfbmV3LgotCi1GcmkgU2VwIDI1IDE4OjE4OjUyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5oOiBpZiBNNjhLQ09GRiwgZGVmaW5lIERPVF9MQUJFTF9QUkVGSVggKHRvIHJlcXVpcmUKLQlsb2NhbCBsYWJlbHMgdG8gc3RhcnQgd2l0aCBhIC4pIGFuZCBzZXQgUkVHSVNURVJfUFJFRklYIHRvICUuCi0JdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IGFjY2VwdCBSRUdJU1RFUl9QUkVGSVggaWYgZGVmaW5lZC4KLQotRnJpIFNlcCAyNSAxNzo1Mzo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYzogIENvbW1lbnQgY2hhbmdlcy4KLQotRnJpIFNlcCAyNSAxNDoxMjo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3lyaWF0aC5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBUZXN0IGlmIF9fU1REQ19fIGlzIGRlZmluZWQgb25seSwgZG9uJ3QgdGVzdCBpdHMgdmFsdWUuCi0JKiBtZXNzYWdlcy5jOiBJZiBfX1NURENfXyBpcyBub3QgZGVmaW5lZCwgZGVmaW5lIE5PX1NUREFSRy4KLQotVGh1IFNlcCAyNCAxMjo0MjozMiAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChkZWJ1Z2dpbmdfcHNldWRvKTogQWRkIHN0YWJzIGFuZCBzdGFibiBhcyB0aGluZ3MgdG8KLQlpZ25vcmUuCi0KLVR1ZSBTZXAgMjIgMTM6MDI6MDcgMTk5MiAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IsZmlsbF9zZWN0aW9uKTogbm93IGFsbG9jYXRlIGFsbAotCXNlY3Rpb25zIHN0YXJ0aW5nIGZyb20gemVybywgcmF0aGVyIHRoYW4gbWFraW5nIHRoZW0gY29uc2VjdXRpdmUuCi0JVGhpcyBtYWtlcyBzdWJzZXF1ZW50IHJlbG9jIGNhbGN1bGF0aW9ucyBlYXNpZXIsIGVzcCBpZiB0aGUgb2JqZWN0Ci0JZm9ybWF0IGRvZXNuJ3QgdW5kZXJzdGFuZCBhZGRlbmRzLiAob2JqX2NvZmZfbGNvbW0pOiAobWF5YmUgdGVtcG9yYXJpbHkpCi0JYWxsb2NhdGUgbGNvbW0gaW4gLmRhdGEgcmF0aGVyIHRoYW4gaW4gLmJzcy4gIEl0IHNlZW1zIHRoYXQgc29tZQotCXRvb2xzIGNhbid0IGNvcGUgd2l0aCBhIG5vbi16ZXJvIHNpemVkIGJzcyBiZWZvcmUgbGlua2FnZS4KLQotVHVlIFNlcCAyMiAxNToxMDo1MSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuYzogUmVwbGFjZSAiZW51bSBtNjhrX2FyY2hpdGVjdHVyZSIgd2l0aCAiaW50IgotCXRocm91Z2hvdXQuICBUaGF0IGVudW0gbm8gbG9uZ2VyIG1lYW5zIHdoYXQgd2UgdGhvdWdodCBpdCBtZWFudC4KLQotCSogdGMtbTY4ay5jIChtZF9hc3NlbWJsZSwgbWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldwotCSItbW5vLTY4OFs1OF0xIiBvcHRpb25zLgotCi0JKiB0Yy1tNjhrLmM6IEFkZGVkIENQVTMyIHN1cHBvcnQuCi0KLUZyaSBTZXAgMTggMDg6MDI6MTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuYyAobTY4a19pcCk6IEFuKGRpc3ApIGlzIG5vdCBwYyByZWxhdGl2ZS4KLQotVHVlIFNlcCAxNSAxNzoyNTowNSAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcy5uZXcpOiBSZW1vdmUgZGVwZW5kZW5jZSBvbiBMT0NBTF9MT0FETElCRVMuCi0JQ2hhbmdlIExJQkRFUFMgZGVwZW5kZW5jZSB0byBMSUJTLgotCi1UdWUgU2VwIDE1IDE1OjMyOjAyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpZiAkKHRvb2xkaXIpIGV4aXN0cywgaW5zdGFsbCBhcyBpbgotCSQodG9vbGRpcikvYmluLgotCi1TdW4gU2VwIDEzIDIwOjMwOjEwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQWRkZWQgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRCBkZWZpbmUgdG8gZ2l2ZSBhbiBlcnJvciBpZiBhbnkKLQkud29yZCBpcyA8IC0zMjc2OCBvciA+IDMyNzY3LiAgVGhlIC1KIGZsYWcgY2F1c2VzIHRoZSBlcnJvciB0byBiZQotCWlnbm9yZWQuICBUaGlzIGlzIHRvIGNhdGNoIG92ZXItc2l6ZWQgc3dpdGNoZXMgZ2VuZXJhdGVkIGJ5IGdjYyBvbgotCXN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgYnJva2VuIC53b3JkIGhhY2suCi0JYXMuYyAobWFpbik6IHBlcm1pdCAtSiBpZiBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgotCXdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBjaGVjayBmb3Igc2lnbmVkIC53b3JkIG92ZXJmbG93IGlmCi0JV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IGZpeGVkIG1pc3NpbmcgcGFyZW5zIGluIGV4cHJlc3Npb24KLQljaGVja2luZyBmb3IgYnl0ZSBvciB3b3JkIG92ZXJmbG93LgotCi0JKiBvYmotY29mZmJmZC5oOiBkZWZpbmUgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KLQlvYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogY2hlY2sgZm9yIHNpZ25lZCAud29yZCBvdmVyZmxvdyBpZgotCVdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQuCi0KLQkqIG9iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBmaXhlZCBtaXNzaW5nIHBhcmVucyBpbgotCWV4cHJlc3Npb24gY2hlY2tpbmcgZm9yIGJ5dGUgb3Igd29yZCBvdmVyZmxvdy4KLQotRnJpIFNlcCAxMSAxMDoyMTowNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCVN1cHBvcnQgZm9yIGkzODYgY29mZgotCSogb2JqLWNvZmZiZmQuaCA6IGFkZGVkIHN0dWZmCi0JKiB0Yy1pMzg2LmMgKHRjX2NvZmZfZml4MnJ0eXBlKTogbmV3IGZ1bmN0aW9uCi0JKiB0Yy1pMzg2LmggOiBuZXcgY29mZiBkZWZpbmVzCi0KLVRodSBTZXAgMTAgMDk6MjM6MTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9wdXNoKTogY2FsbCBpbnB1dF9maWxlX2JlZ2luLCBub3QKLQlpbnB1dF9zY3J1Yl9iZWdpbi4KLQltZXNzYWdlcy5jIChhc19wZXJyb3IpOiBwcmludCAiOiAiIGJldHdlZW4gdGhlIHBhc3NlZCBpbiBlcnJvciBhbmQKLQl0aGUgc3RyZXJyb3IsIGxpa2UgcGVycm9yIGRvZXMuCi0KLVdlZCBTZXAgIDkgMTE6MDY6MjUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIGdhc190YXJnZXQgaW5zdGVhZCBvZiBtb2RpZnlpbmcgdGFyZ2V0X2NwdS4KLQlGcm9tIFN0ZXZlIENoYW1iZXJsYWluOgotCU1ha2VmaWxlLmluOiBIYW5kbGUgbTY4Ki0qLWNvZmYqLgotCXJlYWQuYywgcmVhZC5oOiBhZGQgbXVsdCBhcmd1bWVudCB0byBzX3NwYWNlCi0KLQkqIHRjLW02OGsuYyAobTY4a19pcCwgbTY4a19pcF9vcCwgZ2V0X251bSwgdHJ5X21vdG9faW5kZXgpOiBtZXJnZQotCSBNb3Rvcm9sYSBhbmQgTUlUIHN5bnRheDsgZ2FzIGNhbiBub3cgYXNzZW1ibGUgZWl0aGVyIHR5cGUgb2YKLQkgZmlsZS4KLQl0Yy1tNjhrbW90ZS5jLCB0Yy1tNjhrbW90ZS5oOiByZW1vdmVkIG5vdyBzdXBlcmZsdW91cyBmaWxlcy4KLQlGcm9tIFN0ZXZlIENoYW1iZXJsYWluOgotCW02OGtjb2ZmLm10OiBmb3IgbTY4ayBDT0ZGLgotCW9iai1jb2ZmYmZkLmM6IChmaXh1cF9tZGVwcykgYWRkZWQKLQkgKHNpemVfc2VjdGlvbikgcmVtb3ZlZCBiYWQgc2FuaXR5IGNoZWNrCi0JIChmaWxsX3NlY3Rpb24pIGFkZGVkIHJzX21hY2hpbmVfZGVwZW5kZW50IGNhc2UKLQkgKHdyaXRlX29iamVjdF9maWxlKSBjYWxsIGZpeHVwX21kZXBzCi0JIChmaXh1cF9zZWdtZW50KSBzZXQgZnhfc3Vic3kgdG8gMC4KLQlvYmotY29mZmJmZC5oOiBkZWZpbmUgV09SS0lOR19ET1RfV09SRCAodG9vIGhhcmQgdG8gc3VwcG9ydCkgYW5kCi0JIGhhbmRsZSBtNjhrLgotCXRjLW02OGsuYywgY29uZmlnL3RjLW02OGsuaDogYWRkZWQgbTY4ayBDT0ZGIHN1cHBvcnQgYW5kIE1vdG9yYWxhCi0JIHBzZXVkbyBvcHMuCi0KLVR1ZSBTZXAgIDggMTc6MTA6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTElCUyk6IEluY2x1ZGUgb3Bjb2RlIGxpYnJhcnkuCi0KLUZyaSBTZXAgIDQgMTg6MjA6NTYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGdldF9udW0sIGNhc2UgU0VHX0JJRyk6IElmIG9ubHkgc21hbGwgaW50ZWdlcnMKLQlpbmNsdWRpbmcgemVybyBhcmUgYWNjZXB0ZWQsIHBhc3MgKzAuMC4KLQotU3VuIEF1ZyAzMCAyMToyNDo0NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYXAgImFzIiB0aHJvdWdoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgd2hlbgotCWluc3RhbGxpbmcuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogbWFwICJhcyIgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHdoZW4KLQlpbnN0YWxsaW5nLgotCi1TYXQgQXVnIDI5IDEyOjExOjEyIDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFzLm5ldyk6IERlcGVuZCBvbiBMT0NBTF9MT0FETElCRVMuCi0KLUZyaSBBdWcgMjggMTY6MjU6MjIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBvYmotYm91dC5oLCBvYmotYm91dC5jIChvYmpfaGVhZGVyX2FwcGVuZCwgb2JqX3N5bWJvbF90b19jaGFycyksCi0JdGMtaTk2MC5jIChtZF9yaV90b19jaGFycyk6IEFsd2F5cyBvdXRwdXQgYm91dCBvYmplY3QgZmlsZSBpbgotCWxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciAodXNlZCB0byB1c2UgZW5kaWFubmVzcyBvZiBob3N0KS4KLQotVHVlIEF1ZyAyNSAxNTo1MDo0OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluaXRfdGFibGUpOiBOb3cgY29uc3QuICBBbHdheXMgaW5jbHVkZSA2ODg1MQotCWRhdGEsIHNvIHRoYXQgImJjIiBpcyBhdmFpbGFibGUgdG8gNjgwNDAgY2FjaGUgaW5zdHJ1Y3Rpb25zLgotCUFkZGVkICJ0dDAiLCAidHQxIiwgYW5kIDY4ZWMwMzAgdmFyaWFudHMuCi0JKG1kX2Fzc2VtYmxlKTogQ29tcGxhaW4gaWYgNjgwMDAgKG9ubHkpIGFuZCA2ODg4MSBhcmUgc3BlY2lmaWVkLgotCShlbnVtIF9yZWdpc3Rlcik6IEFkZGVkIFRUMCwgVFQxLgotCShtNjhrX2lwLCBjYXNlcyAnMycgYW5kICd0Jyk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlIGNvZGVzLiAgUGFzcwotCWxpbmUgbnVtYmVyIGNvcnJlY3RseSBpbiAiaW50ZXJuYWwgZXJyb3IiIG1lc3NhZ2VzLiAgRG9uJ3QgcHJpbnQKLQlhcmNoaXRlY3R1cmUtbWlzbWF0Y2ggbWVzc2FnZSBmb3Igb3BlcmFuZCBlcnJvcnMuCi0KLQlGcm9tIENvbGluIFNtaXRoIChjb2xpbkB3cnMuY29tKToKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2UgJ18nKTogVXNlIGFkZHdvcmQgdHdpY2UgcmF0aGVyCi0JdGhhbiBpbnN0YWxsX29wZXJhbmQuCi0KLVR1ZSBBdWcgMjUgMTU6MTM6NDggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYyAoYnVmZmVyX2xpbmUpOiByZXdpbmQgdG8gdGhlIHN0YXJ0IG9mIGluY2x1ZGUKLQlmaWxlcywgdGhleSBtaWdodCBiZSBpbmNsdWRlZCB0d2ljZS4KLQotCSogejhrLmMsIHo4ay5oLCB6OGsubXQ6IHo4MDAwIHN1cHBvcnQgc3R1ZmYKLQotTW9uIEF1ZyAyNCAxMjo0NTo0MyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmVkIFRBUkdFVF9DUFUgZm9yIEMgY29kZSBzbyB0aGF0IGl0IGNhbiBjaG9vc2UKLQlvbmUgZWxlbWVudCBvZiBhIGZhbWlseS4KLQotCSogdGMtbTY4ay5jOiB1c2UgVEFSR0VUX0NQVSB0byBjaG9vc2UgZGVmYXVsdCBjcHUgdHlwZS4KLQotCSogdGUtZ2VuZXJpYy5oOiBkZWZhdWx0IHRvIExPQ0FMX0xBQkVMU19ET0xMQVIgYW5kIExPQ0FMX0xBQkVMU19GQgotCXNvIHRoYXQgd2UgY2FuIGFzc2VtYmxlIGhhbmQtd3JpdHRlbiBsaWJnY2MgY29kZS4KLQotRnJpIEF1ZyAyMSAxNDozODo0NCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3dhcm4pOiBVc2UgZnB1dHMsIG5vdCBmcHJpbnRmLCB3aXRoIGEgYnVmZmVyIHRoYXQKLQloYXMgYWxyZWFkeSBiZWVuIGZvcm1hdHRlZCAoYnV0IG1heSBzdGlsbCBjb250YWluICUtY2hhcmFjdGVycykuCi0JKGFzX2JhZCk6IExpa2V3aXNlLgotCi1XZWQgQXVnIDE5IDExOjIwOjU5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jLCB0Yy1tNjhrbW90ZS5jOiB0aGUgY2FzMiBpbnN0cnVjdGlvbiBpcyBzdXBwb3NlZCB0byBiZQotCXdyaXR0ZW4gd2l0aCBpbmRpcmVjdGlvbiBvbiB0aGUgbGFzdCB0d28gb3BlcmFuZHMsIHdoaWNoIGNhbiBiZQotCWVpdGhlciBkYXRhIG9yIGFkZHJlc3MgcmVnaXN0ZXJzLiAgQWRkZWQgYSBuZXcgb3BlcmFuZCB0eXBlICdyJwotCXdoaWNoIGFjY2VwdHMgZWl0aGVyIHJlZ2lzdGVyIHR5cGUuICBBZGRlZCAnKCcgdG8gbm90ZW5kIHN0dWZmIGluCi0JdGMtbTY4a21vdGUuYyB0byBhY2NlcHQgKGEwKTooYTIpIGluIGNhczIgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBBdWcgMTkgMDk6MjU6MDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFzLmggKGVudW0gX3JlbGF4X3N0YXRlKTogU3RhcnQgb2ZmIGF0IG9uZSwgbm90IHplcm8sIHRvIGJldHRlcgotCWNhdGNoIHVuaW5pdGlhbGl6ZWQtdmFyaWFibGUgZXJyb3JzLgotCShsaW5rcmVsYXgpOiBEZWNsYXJlIG5ldyB2YXJpYWJsZS4KLQotCSogbWVzc2FnZXMuYyAod2FybmluZ19jb3VudCwgZXJyb3JfY291bnQpOiBEZWZhdWx0IGluaXRpYWxpemVyIGlzCi0Jc3VmZmljaWVudC4KLQotCSogd3JpdGUuYzogTWVyZ2VkIHNvbWUgZGVjbGFyYXRpb25zLCB1c2luZyBQQVJNUyBtYWNyby4KLQkodGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290LCBic3NfZnJhZ19yb290LCB0ZXh0X2xhc3RfZnJhZywKLQlkYXRhX2xhc3RfZnJhZyk6IE5vIGxvbmdlciBzdGF0aWMuCi0JKHdyaXRlX29iamVjdF9maWxlLCBjYXNlIHJzX2FsaWduIG9yIHJzX29yZyk6IElmIEhBTkRMRV9BTElHTiBpcwotCWRlZmluZWQsIGNhbGwgaXQuICBDaGFuZ2Ugc2VnbWVudHMgYmVmb3JlIGNhbGxpbmcgZml4dXBfc2VnbWVudC4KLQkocmVsYXhfYWxpZ24pOiBJZiBsaW5rcmVsYXgsIHByb3ZpZGUgZXh0cmEgcGFkZGluZy4KLQotCSogb2JqLWJvdXQuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBFbWl0IGFsaWdubWVudCByZWxvY3MgZGVzcGl0ZQotCXRoZWlyIG5vdCBoYXZpbmcgc3ltYm9scyBhc3NvY2lhdGVkLgotCi0JKiB0Yy1pOTYwLmMgKG5vcmVsYXgsIGluc3RydW1lbnRfYnJhbmNoZXMpOiBEZWZhdWx0IGluaXRpYWxpemVyIGlzCi0Jc3VmZmljaWVudC4KLQkobGlua3JlbGF4KTogRGVsZXRlIHZhcmlhYmxlIGRlZmluaXRpb24uCi0JKG1lbV9mbXQpOiBDYWxsIGZpeF9uZXcgd2l0aCBOT19SRUxPQy4KLQkodGNfYm91dF9maXhfdG9fY2hhcnMpOiBIYW5kbGUgYWxpZ25tZW50IHJlbG9jcy4KLQkoaTk2MF9oYW5kbGVfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKiB0Yy1pOTYwLmggKGxpbmtyZWxheCk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkoSEFORExFX0FMSUdOKTogTmV3IG1hY3JvOyBjYWxscyBpOTYwX2hhbmRsZV9hbGlnbi4KLQkoTkVFRF9GWF9SX1RZUEUsIE5PX1JFTE9DKTogTmV3IG1hY3Jvcy4KLQotVHVlIEF1ZyAxOCAxNDo1OToyMSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NwYXJjLm10OiBOZXcgZmlsZS4gIEdyYWIgc3BhcmMgb3Bjb2RlIHRhYmxlIGZyb20gYmZkCi0JbGlicmFyeS4KLQotVHVlIEF1ZyAxOCAxNDoxNjozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4gIFJlbW92ZWQKLQlNSU5VU19HLCBzZXQgQ0ZMQUdTIHRvIGRlZmF1bHQgdG8gLWcsIGFkZGVkIEZMQUdTX1RPX1BBU1MsIHBhc3NlZAotCUZMQUdTX1RPX1BBU1MgdG8gcmVjdXJzaXZlIG1ha2VzLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotCi1Nb24gQXVnIDE3IDE1OjA5OjU2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9wb3AsIGlucHV0X3NjcnViX3B1c2gpOiBtZW1jcHkgd2FzCi0JYmVpbmcgdXNlZCB3aXRoIGFyZ3Mgc3dhcHBlZCwgY2F1c2luZyBvY2Nhc2lvbmFsIGxvc3NhZ2Ugd2hlbgotCXJlZmlsbGluZyBidWZmZXJzIGFmdGVyIGFuIGluY2x1ZGUgZmlsZS4KLQotTW9uIEF1ZyAxNyAxMzoxODo1MSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfdHNrdHNrKTogVXNlIGNvcnJlY3QgQU5TSSBmb3JtIGZvciBzdGRhcmcKLQl2ZXJzaW9uLiAgRGlzY2FyZCBib2d1cyBET05UREVGIHZlcnNpb24uCi0JKGFzX3dhcm4sIGFzX2JhZCwgYXNfZmF0YWwpOiBMaWtld2lzZS4KLQotRnJpIEF1ZyAxNCAxODozMToxNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IElmIGluc3RydWN0aW9uIGlzIGludmFsaWQgZm9yIHRoZQotCXNlbGVjdGVkIGFyY2hpdGVjdHVyZSwgcHJpbnQgYSBtZXNzYWdlIHNheWluZyBzbyBhbmQgbGlzdGluZyB3aGF0Ci0JcHJvY2Vzc29ycyBzdXBwb3J0IGl0LCByYXRoZXIgdGhhbiBzYXlpbmcgIm9wZXJhbmRzIG1pc21hdGNoIi4KLQotVGh1IEF1ZyAxMyAxMzo1MzoxOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYXMuaCBbQlJPS0VOX0FTU0VSVF06IElmIGRlZmluZWQsIHR1cm4gb2ZmIGFsbCBhc3NlcnRpb24gY2hlY2tzLgotCi0JKiBjb25maWcvaG8tcnM2MDAwLmggKE1fUlM2MDAwKTogRG9uJ3QgZGVmaW5lIGl0LgotCShmcmVlKTogRGVjbGFyZSBpdC4KLQkoQlJPS0VOX0FTU0VSVCk6IERlZmluZSBpdCBpZiBub3QgX19TVERDX18uCi0KLVR1ZSBBdWcgMTEgMTI6NTg6MTQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLm10OiBOZXcgZmlsZS4KLQotTW9uIEF1ZyAxMCAxNDozNzowOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jOiAiLmFsaWduIE4iIG1lYW5zIGFsaWduIHRvIE4tYnl0ZSBib3VuZGFyeSAqb25seSoKLQlpZiBUTl9TVU4zOyBvdGhlcndpc2UgYWxpZ24gdG8gMioqTi1ieXRlIGJvdW5hcnkuCi0KLVRodSBBdWcgIDYgMTI6MTA6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19maWxsKTogbWFrZSB0aGUgLmZpbGwgc2l6ZSBjbGFtcGVkIGVycm9yIGEgd2FybiBhbmQKLQlmaXggYnVnIHdoZXJlIDAncyB3ZXJlIGFsd2F5cyBwbGFjZWQuCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jOiBpZiBhIDo4IGlzIHNlZW4gYWZ0ZXIgYW4gb3BlcmFuZCwgZmlsbCB0b3AKLQl0d28gYnl0ZXMgb2YgYW55IGNvbnN0YW50IHdpdGggMHhmZjoKLQotV2VkIEF1ZyAgNSAxMjowMjo0MCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogZml4IHRoZSAuYWxpZ24gdGhpbmcKLQl0aGUgcmlnaHQgd2F5OyBmb3IganVzdCB0aGUgNjhrLiBTdW4gMyAuYWxpZ24gaXMgbmJ5dGVzLCBub3QgcHR3by4KLQotV2VkIEF1ZyAgNSAwMTo1NDozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jICh0cnlfaW5kZXgpOiAgRXJyb3IgaWYgaW5kZXggc2NhbGluZyBzcGVjaWZpZWQgYW5kCi0JYXNzZW1ibGluZyBmb3IgYW4gb2xkZXIgQ1BVIHRoYW4gYSA2ODAyMC4KLQotU2F0IEF1ZyAgMSAxOToxMDoxMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogSWYgcGMtcmVsYXRpdmUsIHRha2UKLQlmeF9vZmZzZXQgaW50byBhY2NvdW50LgotCi1GcmkgSnVsIDMxIDIxOjUzOjI4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMgaG9zdCk6IEFjY2VwdCAidWx0cml4IiB3aXRoIHZlcnNpb24gbnVtYmVyLgotCi0JKiBleHByLmMgKGZsb2F0aW5nX2NvbnN0YW50KTogU2VwYXJhdGUgIj0tIiB0byBhdm9pZCBjb25mdXNpbmcKLQlhbmNpZW50IG9yIGJyb2tlbiBjb21waWxlcnMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBNaXNtYXRjaCBlcnJvciBjb3VsZCBhbHNvIGluZGljYXRlCi0JcHJvY2Vzc29yL29wY29kZSBtaXNtYXRjaCwgc28gcmV3b3JkIHRoZSBlcnJvciBtZXNzYWdlLgotCShtZF9hc3NlbWJsZSk6IElmIG5vIENQVSBoYXMgYmVlbiBzZXQgKGV2ZW4gaWYgRlBVL1BNTVUKLQljaGFyYWN0ZXJpc3RpY3MgaGF2ZSBiZWVuKSwgZGVmYXVsdCB0byA2ODAyMC4gIERvbid0IG5lZWQgZXh0cmEKLQlxdW90ZXMgYXJvdW5kIGVycm9yIHN0cmluZy4KLQotRnJpIEp1bCAzMSAxMjoyNjozNCAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFJldmVydCBzYWMncyBpbmNvcnJlY3QgY2hhbmdlIG1hZGUgSnVsIDEzLgotCUFsaWduIHJlYWxseSBpcyBzdXBwb3NlZCB0byBiZSBwdHdvIG5vdCBuYnl0ZXMuCi0KLU1vbiBKdWwgMjAgMDI6NTE6NTkgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogX0RvXyBpbmNsdWRlIGxpYmliZXJ0eS4gIChmcm9tIHNlZikKLQotRnJpIEp1bCAxNyAxNToxNToyOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogSGFuZGxlICIwZiIgYW5kICIwYiIgbGFiZWwgcmVmZXJlbmNlcwotCXByb3Blcmx5LgotCi1UaHUgSnVsIDE2IDA4OjIwOjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogaWYgcmVsYXhpbmcsIGRvbid0IGRvIGFueXRoaW5nLgotCSogY29uZmlnL29iai1ib3V0LltjaF0gOiBtYWludGFpbiB0aGUgYV9yZWxheGFibGUgZmlsZSBoZWFkZXIgaW5mbwotCSogY29uZmlnL3RjLWk5NjAuYzogbmV3IG9wdGlvbiAtbGlua3JlbGF4Ci0KLU1vbiBKdWwgMTMgMTQ6MTE6MzYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoZXhwcik6IGFsbG93IFNFR19CU1MgaW4gZXhwcmVzc2lvbnMKLQkqIHJlYWQuYyAocG90YWJsZSk6IGFsaWduIHNob3VsZCBiZSBuYnl0ZXMsIG5vdCBwdHdvIQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBleHRyYSBnbHVlIGZvciBuZXcgYnNzIGF0dHJpYnV0ZXMKLQkocmVsYXhfc2VnbWVudCk6IFNFR19CU1MgaXMgb2sgbm93Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwX29wKTogY2FuIG5vdyBwYXJzZSBtb3JlIEAoIG1vZGVzCi0KLU1vbiBKdWwgIDYgMTc6MDk6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogbWFyayAubGl0IHNlY3Rpb25zIGFzIFNUWVBfTElUCi0KLU1vbiBKdW4gIDEgMTY6MjA6MjIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtNjgweDAgYXMgaGF2aW5nIHN1bjMgZW11bGF0aW9uIG1vZGUgZm9yCi0Jdnh3b3JrcyBlbnZpcm9ubWVudC4KLQotCi1UdWUgSnVuIDMwIDIwOjI1OjU0IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBwcm9ncmFtX3N1ZmZpeCAocGFyYWxsZWwgdG8gcHJvZ3JhbV9wcmVmaXgpCi0KLVdlZCBKdW4gMjQgMTA6NTc6NTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChwcm9jZXNzX2VzY2FwZSk6IG5ldyBmdW5jdGlvbiB0byBoYW5kbGUgZXNjYXBlcyB0aGUgcmlnaHQKLQl3YXksIChkb19zY3J1Yl9uZXh0X2NoYXIpOiB1c2UgbmV3IGZ1bmN0aW9uCi0JKiBjb25kLmMgKHNfaWZkZWYpOiBkbyBpZmRlZi9pZm5kZWYgcmlnaHQKLQkqIHJlYWQuYyAoc19maWxsKTogbWFrZSB0aGUgLCBleHByZXNzaW9ucyBvcHRpb25hbCBsaWtlIHRoZSBkb2MKLQlzYXlzCi0JKiBjb25maWcvdGMtaDgzMDAuW2NoXTogYmV0dGVyIHdhcm5pbmdzCi0KLVR1ZSBKdW4gIDkgMDc6NTQ6NTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19iZWdpbik6IGNyZWF0ZSBic3MwX2ZyY2hhaW5QIGluIHRoZSBzYW1lIHdhcwotCWFzIGRhdGEwX2ZyY2hhaW5QCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogdmFyaW91cyBjaGFuZ2VzIHRvIGhhbmRsZSBkYXRhIGluCi0JdGhlIEJTUyBzZWdtZW50IGluIG11Y2ggdGhlIHNhbWUgd2FzIGFzIHN0dWZmIGluIHRoZSBEQVRBIHNlZ21lbnQuCi0KLQkqIHRjLW02OGsuYyAobTY4a2lwKTogRml4IHR5cG8gc28gdGhhdCBvbmx5IGFyY2gncyA+PTY4MDIwIGRvCi0JcGNyZWwgZGF0YSBzdHVmZi4gKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogd2hlbiByZWxheGluZyBhCi0JNjgwMTAgYnh4IGludG8gYSBicmErNiBqbXB4eCwgcHV0IHRoZSBieXRlcyBvZiB0aGUgam1wIG9wY29kZSBpbnRvCi0JdGhlIHJpZ2h0IHBsYWNlLiAoc19ic3MpOiBEb24ndCBwdXQgLmJzcyBzdHVmZiBpbnRvIFNFR19EQVRBLCBwdXQKLQlpdCBpbnRvIFNFR19CU1MKLQotVGh1IEp1biAgNCAxMTo1OToxMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jKGV4cHIpOiBhbGxvdyBTRUdfUkVHSVNURVIgaW4gZXhwcmVzc2lvbnMuCi0JKiByZWFkLmMocHNldWRvX3NldCk6IHJlZ2lzdGVyIGV4cHJlc3Npb25zIGNhbiBiZSB0aGUgc291cmNlIG9mIGEKLQlzZXQuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBOb3cgLVIgZm9yY2VzIGFsbCBjaGFuZ2VzIHRvIFNFR19EQVRBIHRvCi0JZ290byBTRUdfVEVYVCAoaWYgYS5vdXQpCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIGEub3V0IGRvbid0IHVzZSB0aGUgb2xkIHdheSBmb3IKLQktUi4KLQkqIGNvbmZpZy9vYmotYS5vdXQgKHNfc2VjdCk6IGNvbXBsYWluIGlmIHRoZSB1c2VyIHRyaWVzIHRvIHVzZSBhCi0Jc3Vic2VnbWVudCB3aXRoIGEgdmFsdWUgd2hpY2ggbWlnaHQgaW50ZXJmZXJlIHdpdGggb3V0IC1SIGhhY2tlcnkuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IGxvb2t1cCBuYW1lcyBpbiBzeW1ib2wgdGFibGUKLQlyYXRoZXIgdGhhbiB1c2UgdWdseSBpZiB0cmVlLiAoaW5pdF9yZWd0YWJsZSk6IGluc2VydCByZWdpc3RlcgotCW5hbWVzIGludG8gc3ltYm9sIHRhYmxlLgotCi1UdWUgSnVuICAyIDE2OjQ3OjA5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBrZWVwIHRoZSBmaXhfdGFpbCBjbGVhbiwgd2hpY2gKLQlmaXhlcyBhIGJ1ZyBpbiAtUiB3aGVyZSByZWxvY2F0aW9ucyB3ZXJlIGJlaW5nIGxvc3QuCi0KLU1vbiBKdW4gIDEgMTY6MjA6MjIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtNjgweDAgYXMgaGF2aW5nIHN1bjMgZW11bGF0aW9uIG1vZGUgZm9yCi0Jdnh3b3JrcyBlbnZpcm9ubWVudC4KLQotU3VuIE1heSAzMSAwNTozMzowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtNjgweDAgYXMgYW4gbTY4awotCi1UaHUgTWF5IDI4IDExOjIyOjAyIDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgc3BhcmNsaXRlIGFzIGEgc3BhcmMgdmFyaWFudC4KLQotCSogdGMtc3BhcmMuYzogVXNlIG5ldyBBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1AgbWFjcm8uICBNZW50aW9uIG5ldwotCS1Bc3BhcmNsaXRlIGZsYWcuCi0KLVR1ZSBNYXkgMjYgMTY6NDc6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IGxpbnQKLQkqIGxpc3RpbmcuYywgZXhwci5jOiBwYXRjaGVzIGZyb20gQW5kcmV3IFNtaXRoCi0KLVRodSBNYXkgMTQgMTc6MjI6NDggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHVzZSBtNCByYXRoZXIgdGhhbiBnbTQuCi0KLU1vbiBNYXkgIDQgMTg6NTY6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmYmZkLmM6IHVzZSBpcyBhIHN5bm9ueW0gZm9yIHNlY3Rpb24sIChkb19yZWxvY3NfZm9yKToKLQljYWxjIHRoZSBiYXNlIG9mIHJlbG9jcyBjb3JyZWN0bHkuCi0JKiB0Yy1hMjlrLmMgKHBhcnNlX29wZXJhbmQpOiBhbGxvdyBleHByZXNzaW9ucyB0byBiZSBpbiBhbnkgc2VjdGlvbi4KLQotTW9uIEFwciAyNyAxMzoxMzozMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogYXMuYywgd3JpdGUuYzogdXNlIC1LIHJhdGhlciB0aGFuIC1rIGZvciB0aGUgYnJva2VuIHdvcmQgd2FybmluZwotCSAgb3B0aW9uLgotCi1UdWUgQXByIDIxIDEzOjM1OjMwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZG8gbm90IHByaW50IHJlY3Vyc2lvbiBsaW5lcy4KLQotV2VkIEFwciAxNSAyMToxOTozMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB0aGUgdG9vbGRpciBjb3B5IG9mIGdhcyBnb2VzIGRpcmVjdGx5IGluIHRvb2xkaXIuCi0KLVR1ZSBBcHIgMTQgMTQ6NTA6MjIgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRm9yIGIub3V0IGZvcm1hdCwgcm91bmQgdXAgc2VjdGlvbgotCXN0YXJ0IGFkZHJlc3NlcyB0byBtYXRjaCByZXF1aXJlZCBhbGlnbm1lbnQuCi0KLVRodSBBcHIgIDkgMDU6NDU6MjkgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogSW5zdGFsbCBpbnRvICQodG9vbGRpcikvYmluLCBzaW5jZSB0aGF0J3MKLQl3aGVyZSBnY2MgbG9va3MgZm9yIGl0LgotCi1UdWUgQXByICA3IDE1OjEyOjE1IDE5OTIgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZWQgc29tZSBsaW5lcyB0byBiZSBsZXNzIGNvbmZ1c2luZyBmb3Igc29tZQotCW1ha2VzLgotCi0JKiBpbnB1dC1maWxlLmM6ICBDb25kaXRpb25hbGl6ZSBvbiBfSU9GQkYsIG5vdCBWTVMuCi0KLQkqIHJlYWQuYywgd3JpdGUuYzogIENoYW5nZSBhIHNlcmllcyBvZiBpZmRlZi9lbGlmIHRvCi0JaWZkZWYvZWxzZS9pZmRlZiBldGMuCi0KLUZyaSBNYXIgMjcgMTI6MjE6MTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIHN5bWJvbHMuYyAoZmJfbGFiZWxfaW5pdCk6IGZpeCBzaXplb2YgdG8gbWVtc2V0LgotCi1GcmkgTWFyIDEzIDE1OjQ1OjQ0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCB0aGUgbWFuIHBhZ2UuCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIGRvd24gTUFLRUlORk8gZXhwbGljaXRseSBvbiBpbmZvLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHVzZSAkKE1BS0VJTkZPKSBub3QgbWFrZWluZm8uCi0KLUZyaSBNYXIgMTMgMDg6MDM6MDMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZsb251bS1jb25zdC5jOiByZW5hbWVkIGZsb251bS1rb25zdC5jIHRvIHN0b3AgZG9zIG5hbWUKLQljb25mbGljdC4KLQotVGh1IE1hciAxMiAwNDo0MjozOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5oLCB0ZS1zdW4zLmg6IG1vdmVkIExPQ0FMX0xBQkVMU19GQiBkZWZpbml0aW9uIGZyb20KLQkgIHRjLW02OGsuaCB0byB0ZS1zdW4zLmguCi0KLVdlZCBNYXIgMTEgMjM6MzI6NDIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdnh3b3JrczY4IGdldHMgdGUtc3VuMy5oLgotCi0JKiBleHByLmM6IHJlbW92ZSBsaW1pdGF0aW9uIHRoYXQgbG9jYWxfbGFiZWxzX2RvbGxhciBvcgotCSAgbG9jYWxfbGFiZWxzX2ZiIG11c3QgYmUgPCAxMC4KLQotCSogc3ltYm9scy5jOiByZW1vdmUgbG9jYWxfbGFiZWxzX2RvbGxhciwgcmVwbGFjZSB3aXRoIGEgZnVuY3Rpb24KLQkgIGludGVyZmFjZSBmb3IgYSBzcGFyc2UgYXJyYXkuICBBbGwgdXNlcnMgYWRqdXN0ZWQuCi0KLQkqIHRlLXN1bjMuaDogYWRkIExPQ0FMX0xBQkVMU19ET0xMQVIuCi0KLVNhdCBNYXIgIDcgMDA6MDY6MjUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGNvbW1lbnRlZCBvdXQgbGluZSBmb3IgYnVpbGRpbmcgYXMtYWxsLnRleGluZm8uCi0JICBUaGlzIGlzIHRlbXBvcmFyeS4KLQotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy1hbGwudGV4aW5mbzogYWRkZWQgbWVudSBpdGVtIGhvb2tzLgotCi1GcmkgTWFyICA2IDIxOjU3OjE4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1UdWUgTWFyICAzIDE1OjQ1OjU2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LgotCi1TdW4gTWFyICAxIDA0OjQzOjE5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUue2MsaH0gKGZpeF9uZXcpOiBNYWtlIHRoZXNlIGRlY2xhcmF0aW9ucyBjb25zaXN0ZW50LgotCi1TYXQgRmViIDI5IDEzOjU5OjEwIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0cmVycm9yLm8pOiBBZGQgcnVsZSBzbyB0aGF0IGJyb2tlbiBTdW4gbWFrZSBjYW4KLQl3b3JrIGluIHN1YmRpcnMuCi0KLVdlZCBGZWIgMjYgMTk6MjY6MjggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYywgb2JqLWNvZmZiZmQuYyA6IGZpeCBoODMwMCBzcGVjaWZpYyBiaXQgcm90Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IGlmIGNhbid0IHdvcmsgb3V0IHdoYXQgc29ydCBvZiBvcGVyYW5kIGl0IGlzLAotCXRoZW4gbG9vayB0aHJvdWdoIEZMVF9DSEFSUyBmb3IgYSBoaW50LgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotCSogZG9jL01ha2VmaWxlLmluLCBkb2MvY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotVHVlIEZlYiAyNSAxNDoxNzoxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jOiBJZiBhbiBleHByZXNzaW9uIGlzIHNpbmdsZSBjb21tYSwgdGhlbiByZXR1cm4gd2l0aAotCVNFR19BQlNFTlQgcmF0aGVyIHRoYW4gYW4gZXJyb3IgLSBzaW5jZSB0aGUgc3BhcmMgZnJvbnQgZW5kIGRvZXMKLQlyZWFsbHkgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0aGluZ3MgbGlrZSBmYmdlLGEKLQotCSogYXMuaDogaW5jbHVkZSBiZmQuaCBpZiB1c2luZyBtYW55IHNlY3Rpb25zCi0JKiBleHByLmM6IExPQ0FMX0xBQkVMU19GQiBoYWQgYmVlbiBjaGFuZ2VkIHRvIGxvd2VyIGNhc2UgLSBzbwotCWxvY2FsIGxhYmVscyBkaWRuJ3Qgd29yay4KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBkb24ndCBjb3JlIGR1bXAgd2hlbiB0aGVyZSdzIG5vCi0Jc3ltYm9sIHRoZXJlLgotCSogd3JpdGUuYywgd3JpdGUuaDogY2FsbCBmaXhfbmV3IHdpdGggdGhlIHJpZ2h0IG51bWJlciBvZiBhcmdzIG9uCi0JdGhlIEg4LgotCSogY29uZmlnL3RjLWg4MzAwLltjaF0gOiBmaXggYnVncyByZXBvcnRlZCBieSBITVNJLCBhbmQgbWFrZQotCWVycm9ycyBuaWNlcwotCi1TYXQgRmViIDIyIDEyOjI2OjI4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcHAuYzogTVJJIGNvbXBhdGliaWxpdHkgLSBhbGxvdyBzaW5nbGUgcXVvdGUgdG8gc3RhcnQgYSBzdHJpbmcuCi0JKiBhcy5jOiBmaXggdHlwbyByZWNlbnRseSBpbnRyb2R1Y2VkLgotCSogYXMuaCA6IERvbid0IGluY2x1ZGUgYW91dC9yZWxvYy5oIC0gaXQncyBub3QgcmlnaHQgZm9yIENPRkYhCi0JKiBleHByLmM6IE11Y2ggcmV3cml0aW5nLCB0byBhY2NvbW9kYXRlIE1SSSBzeW50YXggZm9yCi0JZXhwcmVzc2lvbnMuIEFsc28gZWFzaWVyIHRvIHJlYWQgbm93LgotCSogbGlzdGluZy5jOiBQdXQgYmFjayBkZWZ1bnMKLQkqIHJlYWQuYzogbW9kaWZpZWQgdG8gYWNjZXB0IE1SSSBzeW50YXgsIHB1dCBiYWNrIGxpc3RpbmcgcHNldWRvCi0Jb3BzIHNvIHRoYXQgYW4gYXNzZW1ibGVyIGJ1aWx0IHdpdGggTk9fTElTVElORyBpZ25vcmVzIGxpc3Qgb3BzCi0JcmF0aGVyIHRoYW4gcHVrZXMuCi0JKiB3cml0ZS5jLCB3cml0ZS5oOiBmaXhzIC0gb25seSBrZWVwIGEgcmVsb2MgdHlwZSBpbiBhIGZpeCBpZiB0aGUgdGFyZ2V0Ci0JbWFjaGluZSBpcyBhIFNQQVJDIG9yIGEgMjlLLgotCSogY29uZmlnL29iai1hb3V0LmM6IGFkZGVkIHNfc2VjdCBwc2V1ZG8gb3AKLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBsaW50cywgc2V0IHRoZSBmaWxlaGRyIGZsYWdzIHJpZ2h0IGFuZAotCWZpbGwgaW4gdGhlIHRpbWVzdGFtcC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oOiBTaW5jZSB3ZSBkb24ndCBpbmNsdWRlIGFvdXQvcmVsb2MuaAotCWFueW1vcmUsIGRlZmluZSBhbGwgdGhlIHJlbG9jcyB3aGljaCB0aGUgdGMtPHg+IGJpdCB3aWxsIHVzZSBzbyB3ZQotCWNhbiB0cmFuc2xhdGUgZnJvbSB0aGVtIHRvIHRoZSBjb2ZmIHR5cGVzLgotCSogY29uZmlnL3RjLWEyOWsuYzogcmVsb2NfdHlwZSBpc24ndCBhbmUgZW51bSBhbnkgbW9yZQotCSogY29uZmlnL3RjLW02OGsuYzogQWRkZWQgTk9fUkVMT0MgZGVmaW5pdGlvbi4KLQotRnJpIEZlYiAyMSAwNjoyMTowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwdXQgaGVhZGVyIGZpbGVzIGJlZm9yZSBDIHNvdXJjZSBmb3IgVEFHUzsgcmVtb3ZlCi0JICByZWZlcmVuY2VzIHRvIG5vbi1leGlzdGVudCBzeXNjYWxscy5oLgotCi0JKiByZWFkLmMsIHdyaXRlLmMgc3Vic2Vncy5jOiBiYWNrIG91dCB0aGUgLmJzcyBjaGFuZ2VzLgotCi0JKiBvYmotYW91dC5jOiBkbyBub3QgaW5jbHVkZSBzdGFiLmdudS5oIGlmIE5PX0xJU1RJTkcuCi0KLQkqIHRjLWk4NjAuYywgYS5vdXQuZ251Lmg6IG1vdmUgaTg2MCByZWxvY3MgdG8gYSBwcm9wZXIgcGxhY2UuCi0KLQkqIGEub3V0Lmg6IHJlbW92ZWQuCi0KLUZyaSBGZWIgMjEgMDE6MDg6NDggMTk5MiAgTWluaCBUcmFuLUxlIChUUkFOTEVASU5URUxMSUNPUlAuQ09NKQotCi0JKiBzeW1ib2xzLmMgKGxvY2FsX2xhYmVsX25hbWUpOiBzeW1ib2xzIG5vdyBzdGFydCB3aXRoIF5BLgotCi0JKiByZWFkLmMsIHN1YnNlZ3MuYywgd3JpdGUuYyBvYmotY29mZi5jOiBhZGRlZCBoYW5kbGluZyBvZgotCSAgYC5ic3NgIHBzZXVkbyBvcCBmb3IgdW5pdGlhbGl6ZWQgZGF0YS4gVGhlIG5ldyBnY2MgKDEuMzcuOXgpCi0JICBnZW5lcmF0ZSB0aGVzZSBzZWN0aW9ucy4gIC5hbGlnbjogd2lsbCB1c2UgTk9QX09QQ09ERSBvciAwCi0JICBmb3IgcGFkZGluZy4gVGhpcyBpcyBqdXN0IGZvciBiZWluZyBuaWNlIHRvIHRoZQotCSAgZGlzYXNzZW1ibGVyLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBjaGFuZ2VkIHRvIGdlbmVyYXRlIGxvY2FsIGxhYmVsICJcMDAxTDAiCi0JICBzdGFydGluZyB3aXRoIGEgXkEgc28gdGhhdCBpdCBpcyByZWNvZ25pemVkIGFzIGEgbG9jYWwgbGFiZWwuCi0KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IHplcm8gYnNzX2ZpeF9yb290LCB0b28uCi0KLQkqIHRjLWkzODYuYzogdGMtaTM4Ni5jOiBhZGRlZCBoYW5kbGluZyBvZiB0aGUgZm9sbG93aW5nIG9wY29kZXM6Ci0JICBpL28gb3Bjb2RlcyAtIGluYiwgaW53LCBvdXRiIGFuZCBvdXR3LiAgc3RyaW5nIG1hbmlwdWxhdGlvbiB3aXRoCi0JICBhdHQgc3ludGF4IC0gc2NtcCwgc2xvZCwgc21vdiwgc3NjYSwgc3N0by4KLQotCSogb2JqLWNvZmYuYzogKGZvciBhaXgzODYpIE1vdmVkIHRoZSBzeW1ib2xzIC50ZXh0LCAuZGF0YSBhbmQgLmJzcwotCSAgdG8ganVzdCBhZnRlciAuZmlsZSAuCi0KLQkgIEluIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4oKSB3aGVyZSBpdCB0cmllcyB0byBwdXQgdGhlIGV4dGVybmFsCi0JICBzeW1ib2xzIGFwYXJ0LCB3aXRoIHRoZSBjb25kaXRpb246Ci0JICAgICghU19JU19ERUZJTkVEKHN5bWJvbFApICYmCi0JICAgICAhU19JU19ERUJVRyhzeW1ib2xQKSAmJgotCSAgICAgIVNGX0dFVF9TVEFUSUNTKHN5bWJvbFApKQotCSAgaXQgd2FzIG1vdmluZyB0b28gbWFueSBzeW1ib2xzIG91dC4gU28gSSBzd2l0Y2ggaXQgYmFjayB0byB0aGUKLQkgIGNvbmRpdGlvbjoKLQkgICAgKFNfR0VUX1NUT1JBR0VfQ0xBU1Moc3ltYm9sUCkgPT0gQ19FWFQgJiYgIVNGX0dFVF9GVU5DVElPTihzeW1ib2xQKSkKLQotCSAgSW4gb2JqX2VtaXRfcmVsb2NhdGlvbnMoKSBhZGRlZCB0aGUgY29uZGl0aW9uYWwgb24gS0VFUF9SRUxPQ19JTkZPCi0JICBzbyB0aGF0IHdlIGRvbid0IHVzZSB0aGUgRl9SRUxGTEcgd2hpY2ggbWFrZSB0aGUgbGlua2VyIGNvbXBsYWluCi0JICB0aGF0IHNvbWVib2R5IGhhcyBzdHJpcHBlZCB0aGUgcmVsb2NhdGlvbiBpbmZvLgotCi0JICBBbHNvLCB0aGUgQUlYIGxkIHByb2dyYW0gcmVxdWlyZSB0aGF0IHRoZSByZWxvY2F0aW9uIHRhYmxlCi0JICBpcyBzb3J0ZWQgYnkgcl92YWRkciBsaWtlIHRoZSBzdGFuZGFyZCBBVFQgYXNzZW1ibGVyIGRvZXMuCi0KLQkgIFtoZSBhbHNvIGNoYW5nZWQgdGhlIHNpemVvZihzdHJ1Y3QgLi4uKSdzIGludG8gdGhlIGNvZmYKLQkgIHN0eWxlIEZPT1NaIG1hY3Jvcy4gIEknbSBub3Qgc3VyZSB0aGlzIGlzIHJpZ2h0LCBidXQgSSBjYW4ndAotCSAgcmVtZW1iZXIgd2h5LiAgeG94b3JpY2guXQotCi1GcmkgRmViIDIxIDAxOjA4OjQ4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBkb2M6IHVzZSB0aGUgZG9jLiAgQnVpbGQgaXQsIGluc3RhbGwKLQkgIGl0LCBjbGVhbiBpdCwgZXRjLgotCi1UdWUgRmViIDE4IDAyOjIxOjI1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkLmM6IHdoaXRlIHNwYWNlIGFuZCBjb21tZW50cyBvbmx5LgotCi0JKiBjb25maWd1cmUuaW46IHVzZSB0aGUgbmV3IGF0b2YtbnMzMi5jIGZvciBuczMyay4KLQotCSogd3JpdGUuYzogY29tbWVudCBjaGFuZ2Ugb25seS4KLQotCSogdGMtbTg4ay5baGNdOiBwdWxsZWQgaW4gZnJvbSBoYWNrJ3MgdW5maW5pc2hlZCB3b3JrLiAgVGhlc2UKLQkgIGFyZW4ndCB5ZXQgaW50ZWdyYXRlZC4KLQotCSogdGMtaTg2MC5baGNdOiBibGV3IG9mZiB0aGUgZHVzdC4gIFNvbWV0aGluZyBtdXN0IHN0aWxsIGJlIGRvbmUKLQkgIGFib3V0IGNvbmZsaWN0aW5nIHJlbG9jYXRpb24gdHlwZXMuCi0KLQkqIHRjLW5zMzJrLmM6IFJlcGxhY2VkIHByZXZpb3VzIHRjX2FvdXRfZml4X3RvX2NoYXJzIHN0dWIgd2l0aCB0aGUKLQkgIHJlYWwgdGhpbmcuCi0KLQkqIHRjLWk5NjAuYywgdGMtc3BhcmMuYzogd2hpdGUgc3BhY2UgYW5kIGNvbW1lbnRzIG9ubHkuCi0KLQkqIHRjLWEyOWsuaDogZGVsZXRlIGR1cGxpY2F0ZSBtYWNybyBkZWZpbml0aW9uLgotCi0JKiBuZXcgZmlsZSBhdG9mLW5zMzJrLmMgY29waWVkIGZyb20gaGFjaydzIGxhc3QgdW5yZWxlYXNlZCBnYXMuCi0KLU1vbiBGZWIgMTcgMDc6NTE6MDYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBhY3R1YWxseSBtYWtlIHRjX2FvdXRfZml4X3RvX2NoYXJzIHdvcmsKLQkgIHJhdGhlciB0aGFuIGFib3J0LgotCi0JKiBuZWFybHkgZXZlcnl0aGluZy4gIGZsdXNoIENoYW5nZUxvZywgcGFja2FnZSBhcyBnYXMtMS45Mi4xLgotCSAgQ2hhbmdlTG9nJ3MgcHJpb3IgdG8gdGhpcyBhcmUgc2tldGNoeSBhdCBiZXN0LiAgSSBoYXZlIGxvZ3MuCi0JICBUaGV5IGp1c3QgYXJlbid0IENoYW5nZUxvZ3MuCmRpZmYgLS1naXQgYS9nYXMvQ2hhbmdlTG9nLTk2OTcgYi9nYXMvQ2hhbmdlTG9nLTk2OTcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMmFmODIuLjAwMDAwMDAKLS0tIGEvZ2FzL0NoYW5nZUxvZy05Njk3CisrKyAvZGV2L251bGwKQEAgLTEsNTk2MCArMCwwIEBACi1XZWQgRGVjIDMxIDEyOjI5OjQ3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBDb3JyZWN0IGJyYW5jaCByYW5nZXMuCi0KLU1vbiBEZWMgMjIgMTM6MDY6MDUgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGkzODYqLWdvMzItcnRlbXMqKTogRml4IHRvIGJlIHRoZSBzYW1lIGFzCi0JaVszNDU2XTg2LWdvMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBEZWMgMjIgMTI6NTQ6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFRoZSA0NjUwIGRvZXNuJ3QgcGVybWl0IE1fTERDMV9BQiwKLQlNX1NEQzFfQUIsIE1fTF9ET0IsIE1fTF9EQUIsIE1fU19EQUIsIG9yIE1fU19ET0IuCi0JKG1pcHNfaXApOiBBbHdheXMgY2hlY2sgZm9yIEZQX0QsIG5vdCBqdXN0IGZvciBpbnN0cnVjdGlvbnMgdGhhdAotCWFyZSBub3QgcGFydCBvZiB0aGUgcmVndWxhciBJU0EuCi0KLVRodSBEZWMgMTggMTY6NDk6MjggMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoYnVpbGRfaW5zbik6IE1ha2UgYG51bWJlcicgYSBsb25nIGZvciA2NC1iaXQgaG9zdHMuCi0KLVRodSBEZWMgMTggMTY6NDI6NTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGNwdV90eXBlcyk6IDIxMTY0cGMvcGNhNTYgZG9lcyBub3QgaGF2ZSBDSVguCi0KLVdlZCBEZWMgMTcgMjE6MjM6MDcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQgMzJiaXQgYmlnbnVtKTogTWFzayBvZmYgYml0cyBvdXRzaWRlCi0JdGhlIHJhbmdlIHdlIGNhcmUgYWJvdXQuCi0KLVdlZCBEZWMgMTcgMTU6Mjk6MDMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3Nob3J0b3B0cyk6IEFkZCAnbicgYW5kICdOJyBvcHRpb25zLgotCShleGVjX3R5cGVfZW51bSk6IEVudW1lcmF0aW9uIGdpdmluZyBhbGwgb2YgdGhlIGV4ZWMgdHlwZXMuCi0JKHdhcm5fbm9wcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUgdG8gZ2l2ZSBub3Agd2FybmluZyBsZXZlbC4KLQkoe2N1cixwcmV2fV9tdWwzMl9wKTogTmV3IHN0YXRpYyB2YXJpYWJsZSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIKLQl0aGUgY3VycmVudC9wcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIDMyLWJpdCBtdWx0aXBseS4KLQkoT3B0aW1pemluZyk6IE1ha2Ugc3RhdGljLgotCShOT1B7MixfTEVGVCxfUklHSFR9KTogTWFjcm9zIGZvciB3b3JkIG9mIG5vcHMgYW5kIGxlZnQvcmlnaHQKLQlub3BzLgotCShkMzB2X2luc2VydF9vcGVyYW5kKTogRGVsZXRlIGRlY2xhcmF0aW9uIG9mIHVudXNlZCBmdW5jdGlvbi4KLQkod3JpdGVfMl9zaG9ydCk6IE1ha2UgZXhlY190eXBlIGFyZ3VtZW50IGVudW0sIG5vdCBpbnQuCi0JKHBhcmFsbGVsX29rKTogRGl0dG8uCi0JKGNoZWNrX3JhbmdlKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZShzKS4KLQkoYnVpbGRfaW5zbik6IERpdHRvLgotCShmaW5kX2Zvcm1hdCk6IERpdHRvLgotCShtZF9hcHBseV9maXgzKTogRGl0dG8uCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCAtbiBhbmQgLU4uCi0JKG1kX3BhcnNlX29wdGlvbik6IFBhcnNlIC1uIGFuZCAtTi4KLQkod3JpdGVfMV9zaG9ydCk6IElmIC1uLCB3YXJuIGFib3V0IGFkZGluZyBhIG5vcC4gIFVzZQotCU5PUF97TEVGVCxSSUdIVH0uCi0JKHdyaXRlXzJfc2hvcnQpOiBVc2UgZW51bWVyYXRpb24gdmFsdWVzIGluc3RlYWQgb2YgaGFyZCBjb2RlZAotCWludGVnZXJzLiAgUmVzZXQgZXhlY190eXBlIGZvciBkZWZhdWx0IG9wZXJhdGlvbnMuICBGb3IgZXhwbGljaXQKLQlwYXJhbGxlbCBvcGVyYXRpb25zLCBjYWxsIHBhcmFsbGVsX29rIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzCi0Jb2suICBJZiB3cml0aW5nIG91dCBhIHBhcmFsbGVsIG9wZXJhdGlvbiwgYW5kIHRoZSBwcmV2aW91cwotCWluc3RydWN0aW9uIHdhcyBhIDMyLWJpdCBtdWx0aXBseSwgaW5kaWNhdGUgY3VycmVudCBpbnN0cnVjdGlvbgotCWlzLgotCShwYXJhbGxlbF9vayk6IEFsbG93IGFkZC90eCAuLi4gdG8gYmUgZG9uZSBpbiBwYXJhbGxlbCB3aXRoCi0JYW5vdGhlciBhZGQvdHggLi4uIGFzc3VtaW5nIHRoZSBncHIgcmVnaXN0ZXJzIGRvbid0IG92ZXJsYXAuCi0JKG1kX2Fzc2VtYmxlKTogVXNlIGV4ZWMgdHlwZSBlbnVtZXJhdGlvbiB2YWx1ZXMsIG5vdCBoYXJkIGNvZGVkCi0JaW50cy4gIENoZWNrIGZvciBsb2FkcyBvciAxNi1iaXQgbXVsdGlwbGllcyBmb2xsb3dpbmcgaW4gdGhlIG5leHQKLQljeWNsZSBhZnRlciBhIDMyLWJpdCBtdWx0aXBseS4gIEFkZCBub3BzIGlmIHRoYXQgaXMgdGhlIGNhc2UuCi0JKGRvX2Fzc2VtYmxlKTogQ29weSBwcmV2X211bDMyX3AgdG8gY3VyX211bDMyX3AsIGFuZCBzZXQKLQljdXJfbXVsMzJfcCBpZiBjdXJyZW50IGluc3RydWN0aW9uIGlzIGEgMzItYml0IG11bHRpcGx5LgotCShmaW5kX2Zvcm1hdCk6IENoYW5nZSBzcGFjaW5nIGFuZCBsYXlvdXQuCi0KLVR1ZSBEZWMgMTYgMTY6NTU6NDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jICh0aWM4MF9yZWxheCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2xvbmdvcHRzKTogQWRkIG5ldyBPUFRJT05fUkVMQVggYW5kIE9QVElPTl9OT19SRUxBWCBvcHRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3IHJlbGF4IG9wdGlvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCBuZXcgcmVsYXggb3B0aW9ucy4KLQkoZmluZF9vcGNvZGUpOiBEb24ndCB1c2Ugc2hvcnQgZm9ybXMgb2YgUEMgcmVsYXRpdmUgYnJhbmNoZXMgaWYKLQl0aWM4MF9yZWxheCBpcyBzZXQuCi0KLVR1ZSBEZWMgMTYgMTU6MjY6MDMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogUmVtb3ZlIG5vbi1yZWdpc3RlciBiaXRzIGZyb20KLQl1c2VkL3NldCBmbGFnIGZpZWxkcy4gIE1ha2UgZmxhZyB2YXJzIHVuc2lnbmVkIGxvbmcuICBVc2UKLQlGTEFHX0F7MCwxfSBmb3IgYWNjdW11bGF0b3JzLiAgQWxsb3cgYW55IDIgaW5zbnMgdG8gYmUgZG9uZSBpbgotCXBhcmFsbGVsIGlmIHRoZXkgdXNlIHRoZSBzYW1lIGNvbmRpdGlvbmFsIGZsYWcgd2l0aCByZXZlcnNlZAotCW1lYW5pbmcuICBBbGxvdyAyIGFkZC9zdWIgaW5zbnMgdGhhdCBzZXQgdGhlIGNhcnJ5IG9yIG92ZXJmbG93Ci0JZmxhZ3MgYnV0IGRvIG5vdCBxdWVyeSB0aGVtIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwuICBEb24ndCBhbGxvdyAyCi0Jd29yZCBzdG9yZSBvcGVyYXRpb25zIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwgd2l0aCBBRERwcHAgb3IKLQlTVUJwcHAuICBEb24ndCBhbGxvdyBsb2FkcyB0byBiZSBkb25lIGluIHBhcmFsbGVsIHdpdGggMTYgYml0Ci0JbXVsdGlwbGllcy4KLQotVHVlIERlYyAxNiAwOToyMDo0MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IFByZXZlbnQgdXNlIG9mIGludGVyd29ya2luZyBzdXBwb3J0IGZvcgotCW5vbi1DT0ZGIHRhcmdldHMuCi0KLU1vbiBEZWMgMTUgMTU6MjA6MzIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FsbC50ZXhpOiBBZGQgTTMyUiBjcHUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBvZiBtMzJyIHByb2Nlc3Nvci4KLQotCSogZG9jL2MtbTMyci50ZXhpOiBOZXcgZmlsZSwgZG9jdW1lbnRpbmcgbTMyciBzcGVjaWZpYyBmZWF0dXJlcy4gIAotCi0KLU1vbiBEZWMgMTUgMTA6MzI6MjggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogQ29ycmVjdGx5IGluc2VydCAnUCcgb3BlcmFuZHMgaW50bwotCXRoZSBpbnN0cnVjdGlvbi4KLQotRnJpIERlYyAxMiAxMTo0NDoyMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBIYW5kbGUgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZQotCWxvbmcgKDMyIGJpdCkgUEMgcmVsYXRpdmUgb2Zmc2V0cy4gIEZpeCBwbGFjZXMgdGhhdCBwcmV2aW91c2x5Ci0JbWlzdXNlZCBSX01QUENSIGZvciAxNSBiaXQgb2Zmc2V0cyB0byB1c2UgdGhlIG5ldyBSX01QUENSMTVXIHR5cGUuCi0JKG1kX2FwcGx5X2ZpeCk6IEFkZCBjYXNlIHRvIGhhbmRsZSBsb25nIFBDIHJlbGF0aXZlIG9mZnNldHMuCi0KLUZyaSBEZWMgMTIgMTA6MzU6MDEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBPcHRpb25zKTogRG9jdW1lbnQgc3VwcG9ydCBmb3IgbmV3IEFSTQotCXByb2Nlc3NvciBuYW1lcy4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgbmV3IEFSTQotCXByb2Nlc3NvciBuYW1lcy4KLQotVGh1IERlYyAxMSAxNzo0Njo1MCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRG9uJ3Qgb3ZlcndyaXRlIG9wY29kZSB0YWJsZSBkYXRhLgotCShpbnNvcCwgbTY4a19pcCk6IE1ha2UgYG9wY29kZScgY29uc3Qgc28gaXQgZG9lc24ndCBoYXBwZW4gYWdhaW4uCi0KLUZyaSBEZWMgIDUgMTE6MjM6NTkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBGaXggQkZEX1JFTE9DXzMyIGFnYWluc3QgYQotCXN5bWJvbCArIG9mZnNldC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBVc2UKLQlTSFRfVjg1MF97U3xUfFp9Q09NTU9OIHRvIG1hcmsgc3BlY2lhbCBjb21tb24gc2VjdGlvbnMuCi0KLVR1ZSBEZWMgIDIgMTc6MDU6MTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogQnJvdWdodCB1cCB0byBkYXRlIHdpdGggdGhlIGJyYW5jaC4KLQotTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChTV0lUQ0hfVEFCTEVfQ09OUyk6IEhhbmRsZSAoZml4KS0+Znhfc2l6ZSA9PSAxLgotCShTV0lUQ0hfVEFCTEUpOiBIYW5kbGUgQkZEX1JFTE9DXzguCi0JKG1kX2FwcGx5X2ZpeCk6ICNpZm5kZWYgQkZEX0FTU0VNQkxFUiBjb2RlOiBIYW5kbGUgZml4UC0+Znhfc2l6ZSA9PSAxLgotCShjb2ZmX3JlbG9jX21hcCk6IEFkZCBCRkRfUkVMT0NfOF9QQ1JFTCBlbnRyeS4KLQkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBTV0lUQ0hfVEFCTEUgY2FzZTogSGFuZGxlIEJGRF9SRUxPQ184LgotCi1TYXQgTm92IDIyIDE2OjE5OjIyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWFscGhhLmMgKHJhbmdlX3NpZ25lZF8xNiwgcmFuZ2Vfc2lnbmVkXzMyKTogV29yayBhcm91bmQgYW4KLQlhcHBhcmVudCBidWcgaW4gZ2NjJ3MgbG9uZyBsb25nIHN1cHBvcnQgY3Jvc3NpbmcgZnJvbSB4ODYuCi0KLVNhdCBOb3YgMjIgMTQ6MjY6MDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jOiBCcm91Z2h0IHVwIHRvIGRhdGUgd2l0aCBsYXRlc3QgY2hhbmdlcyBvbiBhcm0KLQlicmFuY2guIAotCi1TYXQgTm92IDIyIDE1OjUwOjA5IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWctZ2FzLmNvbTogR2V0IHZlcnNpb24gaW5mbyBmcm9tIGNvbmZpZ3VyZS5pbi4KLQotCSogbWFrZWZpbGUudm1zOiBpbmNsdWRlIGRlcGVuZC5vYmogaW4gT0JKUy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfc2VjdGlvbik6IFJlbW92ZSAiLmxjb21tIiBoYW5kbGluZy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2Jhc2VyZWdfY2xvYmJlcmVkKTogUmVtb3ZlIHZhcmlhYmxlIGFuZAotCWFsbCBjb3JyZXNwb25kaW5nIGNvZGUuCi0KLVRodSBOb3YgMjAgMTU6MDY6MDggMTk5NyAgUmljaGFyZCBFYXJuc2hhdyA8cmVhcm5zaGFAYXJtLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChUQVJHRVRfRk9STUFUIGZvciBnZW5lcmljIGEub3V0IHRhcmdldHMpOiBBbGxvdwotCXJ1bi10aW1lIGVuZGlhbiBzZWxlY3Rpb24uCi0KLVdlZCBOb3YgMTkgMTc6NDQ6NDIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHRjLXNoLmMgKHBhcnNlX3JlZyk6IFByb3Blcmx5IHF1b3RlIGZvciBmdjQuCi0KLVdlZCBOb3YgMTkgMjM6NDY6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogQWRkIG1pc3NpbmcgYnJlYWtzIGluIGNhc2Ugb24KLQlzeW1ib2wgdmFsdWUgb3BlcmF0b3IuCi0KLVR1ZSBOb3YgMTggMTg6NDU6MTQgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2ssIGZpbmRfb3Bjb2RlKTogCi0JU3BsaXQgT1BFUkFORF9GTEFHIGludG8gT1BFUkFORF9GRkxBRyBhbmQgT1BFUkFORF9DRkxBRy4KLQotU3VuIE5vdiAxNiAxMDowNTowNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDYXN0IHNlY29uZCBhcmcgb2YKLQltZF9hcHBseV9maXgzIGNhbGwgdG8gdHlwZSAidmFsdWVUICoiLgotCi1UaHUgTm92IDEzIDEzOjUzOjEwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogTWFrZSBGcmVlQlNEIGFuIGFvdXQgLyBpMzg2YnNkCi0gCXZhcmlhbnQuCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCQotVGh1IE5vdiAxMyAxMTowNzoxNCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBVc2UgdGhlIG1lbWJlcnNoaXAgZmllbGQKLQlmb3IgSU5TTl9NQUNSTydzLgotCShtaXBzX2lwKTogU2FtZS4KLQotVGh1IE5vdiAxMyAwMjowNDo1NSAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEZvciBPUENPREVfRkFLRSwgYWRkIGNoZWNrIGZvcgotCWZpcnN0IGFyZ3VtZW50IGlmIGl0J3Mgc3VwcG9zZWQgdG8gYmUgYSByZWdpc3Rlci4KLQotVHVlIE5vdiAxMSAxOToyNTowNSAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiAgSWYgZDEwdiwgcmUtaW5zZXJ0IGEgc3BhY2UgYmVmb3JlCi0JYSAnIycgd2hlbiBpbiBzdGF0ZSAxMC4KLQotVHVlIE5vdiAxMSAxMzozMzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jOiBJbmNsdWRlICJzdWJzZWdzLmgiLgotCSh0Y19yZWxvY19tYW5nbGUpOiBIYW5kbGUgcmVmZXJlbmNlcyB0byBzeW1ib2xzIHdoaWNoIGFyZSBub3QKLQliZWluZyBvdXRwdXQsIHNvIHRoYXQgcmVmZXJlbmNlcyB0byBgLicgd29yay4KLQotTW9uIE5vdiAxMCAxMzo0MzozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDYWxsIGFkZF9maXggd2hlbiBuZWVkZWQgZm9yICdfJwotCWNhc2UuCi0KLQkqIG1hY3JvLmMgKHN1Yl9hY3R1YWwpOiBJZiB3ZSBkb24ndCBmaW5kIGEgcGFyYW1ldGVyIGZvciBhbiAmLAotCWp1c3Qgc3Vic3RpdHV0ZSAmLgotCi1GcmkgTm92ICA3IDIxOjI5OjMyIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogSW4gZGVmYXVsdCBjYXNlLCBjYWxsIGFzX2JhZAotCWluc3RlYWQgb2YgZnByaW50ZiwgdG8gZ2V0ICJhc3NlbWJsZXIgbWVzc2FnZXM6IiBtZXNzYWdlIG91dHB1dAotCWJlZm9yZSBpbnN0ZWFkIG9mIGFmdGVyLgotCi1GcmkgTm92ICA3IDEwOjM2OjIyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmg6IEhhbmRsZSBtdWx0aXBsZSBpbmNsdXNpb24uCi0KLVdlZCBOb3YgIDUgMTA6NTE6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBJYW4uRGFsbEBkc3RvLmRlZmVuY2UuZ292LmF1LgotCSogYXMuaCAoc3RydWN0IGZyYWcsIGZyYWcgc3VwcG9ydCk6IE1vdmVkIGZyb20gaGVyZS4KLQkqIGZyYWdzLmg6IFRvIGhlcmUuCi0JKHN0cnVjdCBmcmFnLCBtZW1iZXIgdGNfZnJhZ19kYXRhKTogTmV3IG1lbWJlciBpZiBUQ19GUkFHX1RZUEUKLQlpcyBkZWZpbmVkLgotCShzdHJ1Y3QgZnJhZywgbWVtYmVyIGZyX2NnZW4pOiBSZW5hbWVkIGZyb20gZnJfdGFyZy5jZ2VuLgotCSogY2dlbi5jIChjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFVwZGF0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXBkYXRlLgotCSogY29uZmlnL3RjLW0zMnIuaCAoVENfRlJBR19JTklUKTogUmVuYW1lZCBmcm9tIG1kX2luaXRfZnJhZy4KLQkobWRfY29udmVydF9mcmFnKTogRGl0dG8uCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoVENfRlJBR19UWVBFKTogRGVmaW5lLgotCShmcmFnX29wY29kZV9mcmFnLGZyYWdfb3Bjb2RlX29mZnNldCxmcmFnX2Jzcik6IFVwZGF0ZS4KLQkoVENfRlJBR19JTklUKTogVXBkYXRlLgotCi1UdWUgTm92ICA0IDE2OjM1OjU3IDE5OTcgIElhbiBEYWxsICA8SWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdT4KLQotCSogd3JpdGUuYyAocHJpbnRfZml4dXApOiBVc2UgVENfRklYX0RBVEFfUFJJTlQgKGlmIGRlZmluZWQpIHRvCi0JcHJpbnQgb3V0IE1EIGZpZWxkcyBvZiBmaXguCi0JKiBmcmFncy5jIChmcmFnX3ZhciwgZnJhZ192YXJpYW50KTogVXNlIFRDX0ZSQUdfSU5JVCBtYWNybyAoaWYKLSAJZGVmaW5lZCkgdG8gaW5pdGlhbGl6ZSBNRCBmaWVsZHMgaW4gZnJhZy4KLQkqIGFzLmggKHN0cnVjdCBmcmFnLCBuczMyayBzdXBwb3J0KTogUmVuYW1lIG5zMzJrIHRvIGZyX25zMzJrLgotCURlbGV0ZSBwY3JlbF9hZGp1c3QuICBBZGQgZnJfb3Bjb2RlX2ZyYWdQLCBmcl9vcGNvZGVfb2Zmc2V0LgotCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBjb21tZW50cy4gUmVtb3ZlIG9ic29sZXRlCi0gCUJGRF9GQVNUX1NFQ1RJT05fRklMTCBkZWZpbml0aW9uLCBjaGFuZ2UgcHJvdG90eXBlcyBmb3IKLSAJZml4X25ld19uczMyayBhbmQgZml4X25ld19uczMya19leHAgdG8gYWRkIG5ldyBhcmd1bWVudHMKLSAJb3Bjb2RlX2ZyYWcgYW5kIG9wY29kZV9vZmZzZXQgYW5kIHJlbW92ZSBwY3JlbF9hZGp1c3QuCi0JKFRDX0ZJWF9UWVBFKTogYWRkIG9wY29kZV9mcmFnUCBhbmQgb3Bjb2RlX29mZnNldCBmaWVsZHMuCi0JKFRDX0ZJWF9EQVRBX1BSSU5UKTogbmV3IG1hY3JvIHRvIHByaW50IG91dCBUQ19GSVhfVFlQRS4KLQkoVENfRlJBR19JTklUKTogbmV3IG1hY3JvIHRvIGluaXRpYWxpemUgbWFjaGluZSBkZXBlbmRlbnQgZmllbGQgaW4KLSAJZnJhZ3MuCi0JKGZyYWdfb3Bjb2RlX2ZyYWcsIGZyYWdfb3Bjb2RlX29mZnNldCwgZnJhZ19ic3IpOiBtYWNyb3MgdG8gYWNjZXNzCi0gCU1EIGZpZWxkcyBpbiBmcmFnIHN0cnVjdHVyZS4KLQkoZml4X2ltX2Rpc3AsIGZpeF9iaXRfZml4UCwgZml4X29wY29kZV9mcmFnLCBmaXhfb3Bjb2RlX29mZnNldCwKLSAJZml4X2Jzcik6IG1hY3JvcyB0byBhY2Nlc3MgTUQgZmllbGRzIGluIGZpeCBzdHJ1Y3R1cmUuCi0JKiBjb25maWcvdGMtbnMzMmsuYzogQXZvaWQgb3Zlcmxlbmd0aCBsaW5lcy4gQWxpZ24gY29tbWVudHMuICBEb24ndAotIAl1c2Ugc3RydWN0IG9wY29kZV9sb2NhdGlvbiBhcyB0aGVzZSBmaWVsZHMgYXJlIG5vdyBpbiB0aGUgZnJhZwotCXN0cnVjdHVyZS4KLQkoY29udmVydF9paWYpOiBDYWxsIGZyYWdfbW9yZSBhcyBpdCBpcyBuZWVkZWQgaW5zdGVhZAotIAlvZiB0cnlpbmcgdG8gYWxsb2NhdGUgZm9yIHRoZSB3aG9sZSBpbnNuLiBBdm9pZCBjYWxsIG9mIGZyYWdfbW9yZQotIAl3aXRoIG5lZ2F0aXZlIGFyZ3VtZW50LgotCShtZF9wY3JlbF9hZGp1c3QsIG1kX2ZpeF9wY3JlbF9hZGp1c3QsIG1kX2FwcGx5X2ZpeCwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfcGNyZWxfZnJvbSwKLQl0Y19hb3V0X2ZpeF90b19jaGFycyk6IHVzZSBhY2Nlc3NvciBtYWNyb3MgdG8gZ2V0IG1kIGZpZWxkcyBpbiBmaXgKLSAJYW5kIGZyYWcgc3RydWN0dXJlcy4KLQkoZml4X25ld19uczMyaywgZml4X25ld19uczMya19leHApOiBhZGQgbmV3IGFyZ3VtZW50cyBvcGNvZGVfZnJhZyBhbmQKLQlvcGNvZGVfb2Zmc2V0IGFuZCByZW1vdmUgcGNyZWxfYWRqdXN0LgotCShjb252ZXJ0X2lpZiwgY29uc19maXhfbmV3X25zMzJrKTogY2FsbCBmaXhfbmV3X25zMzJrLAotIAlmaXhfbmV3X25zMzJrX2V4cCB3aXRoIGNoYW5nZWQgYXJndW1lbnRzLgotCi1Nb24gTm92ICAzIDEzOjMwOjE3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiB0Yy1taXBzLmMgKG1kX2JlZ2luKTogUmVvcmdhbml6ZSBzZXR0aW5nIG9mIGRlZmF1bHQgdmFsdWVzIHNvCi0JdGhhdCBtaXBzX2NwdSBkZXBlbmRzIG9uIFRBUkdFVF9DUFUsIGFuZCBtaXBzX29wdHMuaXNhIGRlcGVuZHMgb24KLQltaXBzX2NwdS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVtb3ZlIGFsbCBjb2RlIHRoYXQgc2V0cyBkZWZhdWx0czsgbWRfYmVnaW4KLQloYW5kbGVzIGFsbCBvZiB0aGlzIG5vdy4KLQotU3VuIE5vdiAgMiAxNDo0NjowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChTVEFHRVNUVUZGKTogQ2hhbmdlIGJpbl9QUk9HUkFNUyB0bwotCW5vaW5zdF9QUk9HUkFNUy4KLQkoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzIGluIHRoZQotCVRPQyBzZWN0aW9uIHRvIGJlIGFnYWluc3QgdGhlIGNzZWN0LgotCi1GcmkgT2N0IDMxIDE4OjE5OjU1IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jICh2YWxpZGF0ZV9taXBzX2luc24pOiBOZXcgZnVuY3Rpb24sIGNoZWNrcwotCW1hdGNoIHZlcnN1cyBtYXNrIGJpdHMsIGFuZCBhbHNvIHZlcmlmaWVzIHRoYXQgYWxsIGJpdHMgdG8gYmUKLQlvdXRwdXQgYXJlIGFjdHVhbGx5IHNwZWNpZmllZCBzb21ld2hlcmUuCi0JKG1kX2JlZ2luKTogQ2FsbCBpdCBmb3IgMzItYml0IGluc3RydWN0aW9ucywgaW5zdGVhZCBvZiBkb2luZwotCW1hdGNoL21hc2sgY2hlY2sgaGVyZS4gIEluIGNhc2Ugb2YgZmFpbHVyZSwgcHJpbnQgYSBtZXNzYWdlLCBidXQKLQljaGVjayB0aGUgcmVzdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGJlZm9yZSBleGl0aW5nLgotCi1UaHUgT2N0IDMwIDEzOjQ2OjIwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEZpeCB0aHVtYiBBRFIgcHNldWRvIG9wLiAgUGF0Y2gKLQlmcm9tIFRvbnkgVGhvbXBzb24gYXQgQVJNOiBhdGhvbXBzb0Bhcm0uY29tCi0KLVRodSBPY3QgMzAgMTE6MTE6MjYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBBbGxvdyBvZGQgcmVnaXN0ZXJzIGZvciBsZDJ3IGFuZAotCWZyaWVuZHMuCi0KLUZyaSBPY3QgMjQgMTU6NTY6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogV2hlbiBoYW5kbGluZyBAbCwgYWx3YXlzIHNpZ24KLQlleHRlbmQgaWYgdGhlIG9wZXJhbmQgZXhwZWN0cyBhIHNpZ25lZCB2YWx1ZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUxTX0RPTExBUik6IERvbid0IGRlZmluZTsgdXNlCi0JZGVmYXVsdCB3aGljaCBpcyB0byBwZXJtaXQgZG9sbGFyIGxhYmVscy4KLQotRnJpIE9jdCAyNCAxMToxOToyMiAxOTk3ICBKYWt1YiBKZWxpbmVrICA8ampAc3Vuc2l0ZS5tZmYuY3VuaS5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX21lbW9yeV9tb2RlbCk6IE5ldyB2YXJpYWJsZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgLVRTTy8tUFNPLy1STU8gb3B0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9ucyk6IEhhbmRsZSB0aGVtLgotCShzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IEZvciA2NCBFTEYsIHNldCByZXF1aXJlZAotCW1lbW9yeSBvcmRlcmluZyBpbiBlX2ZsYWdzLiBEZWZhdWx0IHRvIFJNTyBhbmQgbGV0IHRoZSB1c2VyCi0Jb3ZlcnJpZGUgaXQgdGhyb3VnaCBjb21tYW5kIGxpbmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyk6IEFkZC4KLQotV2VkIE9jdCAyMiAxNzo0MjoxMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodjlhX2Fzcl90YWJsZSk6IE5ldyB2YXJpYWJsZS4KLQkoc3BhcmNfaXApOiBIYW5kbGUgdjlhIGFzcidzLgotCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1Pi4KLQotV2VkIE9jdCAyMiAxNzoyMjo1OSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaGFuZGxlX2FsaWduKTogSGFuZGxlIHJzX2FsaWduX2NvZGUuCi0JUGF0Y2ggZnJvbSBKYWt1YiBKZWxpbmVrIDxqakBzdW5zaXRlLm1mZi5jdW5pLmN6Pi4KLQotV2VkIE9jdCAyMiAxMjo1MToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9zbWFsbCk6IE5ldyB2YXJpYWJsZS4KLQkoT1BUSU9OX1NNQUxMKTogRGVmaW5lLgotCShtZF9sb25nb3B0cyk6IEFkZCAic21hbGwiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgT1BUSU9OX1NNQUxMLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtc21hbGwuCi0JKiBjb25maWcvdGMtc2guaCAoc2hfc21hbGwpOiBEZWNsYXJlLgotCShTVUJfU0VHTUVOVF9BTElHTik6IEhhbmRsZSBzaF9zbWFsbC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKTogQ2hlY2sgc2hfc21hbGwgaW4gVENfU0gKLQljYXNlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgY29uc3RhbnQgaW4gTV9MSV9ECi0JY2FzZSBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLVR1ZSBPY3QgMjEgMTA6MjA6MTEgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeDMsIGNhc2VzIC4uLl9INDQsIC4uLl9ISVgyMik6IExlYXZlCi0Jb3ZlcmZsb3cgc2lnbmFsbGluZyB0byBsaW5rZXIuCi0KLU1vbiBPY3QgMjAgMTQ6NTQ6MDYgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRml4IGZvciBkZWMgYy4KLQotCSogY29uZmlnLWdhcy5jb206IEdpdmUgZXhwbGFuYXRpb24gZm9yIGRlYyBjIHNldHVwIGluIGVycm9yCi0JbWVzc2FnZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IE1ha2UgLmNvbW0gc3ltYm9scyBzZXBhcmF0ZQotCXNlY3Rpb25zIG9uIG9wZW52bXMvYWxwaGEuCi0KLQkqIGNvbmZpZy9vYmotZXZheC5jOiBzdXBwb3J0IC53ZWFrIHBzZXVkby1vcAotCi1Nb24gT2N0IDIwIDEwOjEzOjMyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChkZWZhdWx0X2FyY2hfc2l6ZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHN0cnVjdCBzcGFyY19hcmNoKTogUmVuYW1lIGFyY2hfc2l6ZSB0byBkZWZhdWx0X2FyY2hfc2l6ZS4KLQlOZXcgbWVtYmVyIHVzZXJfb3B0aW9uX3AuCi0JKHNwYXJjX2FyY2hfdGFibGUpOiBBbHdheXMgaW5jbHVkZSB2OSwgdjlhLiAgTmV3IGVudHJ5IHY5LTY0LgotCShpbml0X2RlZmF1bHRfYXJjaCk6IENoZWNrIHdoZXRoZXIgZGVmYXVsdCBhcmNoIGlzIHZhbGlkLgotCVNldCBkZWZhdWx0X2FyY2hfc2l6ZSBpbiBhZGRpdGlvbiB0byBzcGFyY19hcmNoX3NpemUuCi0JKE9QVElPTl8zMixPUFRJT05fNjQpOiBEZWZpbmUuCi0JKG1kX2xvbmdvcHRzKTogTmV3IGVudHJpZXMgZm9yIC0zMiwgLTY0LgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgdGhlbS4KLQkobWRfc2hvd191c2FnZSk6IFByaW50IHRoZW0uICBFbnN1cmUgaW5pdF9kZWZhdWx0X2FyY2ggY2FsbGVkLgotCSogY29uZmlndXJlLmluIChzcGFyYzY0KTogU2V0IGFyY2ggdG8gdjktNjQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1TdW4gT2N0IDE5IDEzOjUwOjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoc3Vic2Vnc19maW5pc2gpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQl3cml0ZV9vYmplY3RfZmlsZS4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBTb21lIGNvZGUgbW92ZXMgaW50byBzdWJzZWdzX2ZpbmlzaC4KLQkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogRGVjbGFyZS4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHN1YnNlZ3NfZmluaXNoLgotCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IENoZWNrIGZvciBlcnJvciByZXR1cm4gZnJvbQotCWRlbWFuZF9jb3B5X3N0cmluZy4KLQotVHVlIE9jdCAxNCAyMDo1MDo1OCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGdldF9saW5lX3NiKTogQWNjZXB0IGFueSBlb2wgbWFya2VyIHdoaWxlIHNjYW5uaW5nIG1hY3Jvcy4KLQotVHVlIE9jdCAxNCAxOToxMjo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2FwcGx5X2ZpeCk6IE5vdGljZSBmeF9wY3JlbCBhbmQgc3Vic3RpdHV0ZQotCXRoZSBjb3JyZWN0IHJlbG9jYXRpb24gd2hlbiBpdCBleGlzdHMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCi0JKiBjb25maWcvdGMtdjg1MC5oOiBMaWtld2lzZS4KLQotRnJpIE9jdCAxMCAxNjowOTozNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogQWxsb3cgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gaXNzdWUKLSAJd2hlbiBzZWNvbmQgaW5zdHJ1Y3Rpb24gaXMgd3JpdGluZyB0byBmaXJzdCBpbnN0cnVjdGlvbnMgaW5wdXRzLgotCQotTW9uIE9jdCAxMyAxNToyNzoxNyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChQQUdFX1NJWkUpOiBEb3VibGUgdG8gOGsgYXMgYSBoYWNrIHRvIGFsbG93IHNvbWUgQysrCi0JdGVtcGxhdGVkIHByb2dyYW1zIHRvIGJ1aWxkIHdpdGggLWcuCi0KLUZyaSBPY3QgMTAgMTc6NDg6MjkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcmVsYXhfdGFibGUpOiBBZGQgc3VwcG9ydCBmb3IgcmVsYXhpbmcKLQl1bmNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgVGhpcyBwYXRjaCBpcyBjb3VydGVzeSBvZiBKaW0gV2lsc29uLiAKLQkobWRfY29udmVydF9mcmFnKTogRml4IHJlbGF4aW5nIG9mIGJyYW5jaGVzLiAgVGhpcyBwYXRjaCBpcwotCWNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uCi0JKG1kX2Fzc2VtYmxlKTogQ3JlYXRlIGRpZmZlcmVudCBmaXh1cHMgZm9yIGNvbmRpdGlvbmFsIGFuZAotCXVuY29uZGl0aW9uYWwgYnJhbmNoZXMuICBUaGlzIHBhdGNoIGlzIGNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRXN0aW1hdGUgc2l6ZSBvZiB2YXJpYWJsZSBwYXJ0IG9mCi0JZml4dXAgYmFzZWQgb24gd2hldGhlciBpdCBpcyBmb3IgYSBjb25kaXRpb25hbCBvciBhbiB1bmNvbmRpdGlvbmFsCi0JYnJhbmNoLiAgVGhpcyBwYXRjaCBpcyBjb3VydGVzeSBvZiBKaW0gV2lsc29uLgotCSh2ODUwX3NkYXRhLCB2ODUwX3RkYXRhLCB2ODUwX3pkYXRhLCB2ODUwX3Nic3MsIHY4NTBfdGJzcywKLQl2ODUwX3pic3MsIHY4NTBfcm9zZGF0YSwgdjg1MF9yb3pkYXRhLCB2ODUwX2Jzcyk6IEFkZCBjYWxsIHRvCi0Jb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCkuIAotCSh2ODUwX2NvbW0pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBuZXcgcHNldWRvIG9wcyAuemNvbW0sIC5zY29tbSBhbmQgLnRjb21tLgotCShtZF9iZWdpbik6IEFkZCBic3MgZmxhZyB0byBzZWdfaW5mbyBvZiBic3Mgc2VjdGlvbnMuCi0KLQlBZGQgc3VwcG9ydCBmb3IgLnNjb21tb24sIC50Y29tbW9uIGFuZCAuemNvbW1vbiBzZWN0aW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBBZGQgLnNjb21tb24sCi0JLnpjb21tb24sIC50YnNzLCAuY2FsbF90YWJsZV9kYXRhIGFuZCAuY2FsbF90YWJsZV90ZXh0LgotCi1GcmkgT2N0IDEwIDE1OjAxOjE0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMpOiBTZXQgREVGQVVMVF9BUkNIIGZyb20gY29ycmVjdCB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1GcmkgT2N0IDEwIDExOjIyOjQ1IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXhlcyB0byBtYWtlIHN1cmUgdGhlIEFUX1dPUkQKLQlleHByZXNzaW9uIGlzIG5vdCBjb25mdXNlZCB3aXRoIC0xLgotCi1GcmkgT2N0IDEwIDExOjU0OjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBGbGFnIFNQIGFzIG1vZGlmaWVkIGZvciBALXNwCi0gCW9wZXJhbmQgLSBPUEVSQU5EX0FUTUlOVVMuCi0KLUZyaSBPY3QgMTAgMDA6NDc6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogTm90ZSB0aGF0IGF1dG8gaW5jcmVtZW50IGFuZAotCWRlY3JlbWVudCBtb2RpZnkgdGhlIGluZGV4IHJlZ2lzdGVyLgotCi1UaHUgT2N0ICA5IDE1OjE3OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUm9iaW4gS2lya2hhbSA8Um9iaW4uS2lya2hhbUBtbGIuZG10LmNzaXJvLmF1PjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGFyY2hzKTogQWRkIDY4MzA2LCA2ODMwNywgNjgzMjIsIDY4MzU2LCA2ODMzNCwKLQk2ODMzNiwgNjgzNDEsIDY4MzQ5LgotCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLU9wdHMpOiBBZGQgLW02OGVjMDAwIC1tNjhoYzAwMCAtbTY4aGMwMDEKLQktbTY4MzA2LCAtbTY4MzA3LCAtbTY4MzIyLCAtbTY4MzU2LCAtbTY4ZWMwMjAsIC1tNjhlYzAzMCwKLQktbTY4ZWMwNDAsIC1tNjhlYzA2MCwgLW02ODMzMCwgLW02ODMzNCwgLW02ODMzNiwgLW02ODM0MSwKLQktbTY4MzQ5LgotCi0JKiBkb2MvTWFrZWZpbGUuYW0gKENQVV9ET0NTKTogRGVmaW5lLgotCShhcy5pbmZvKTogRGVwZW5kIHVwb24gJChDUFVfRE9DUykuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIEFNX1BST0dfSU5TVEFMTDsgaXQncyBjYWxsZWQgYnkKLQlBTV9JTklUX0FVVE9NQUtFLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgT2N0ICA5IDAxOjQ0OjM2IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHRjLWQxMHYuaCAoVENfU1RBUlRfTEFCRUwpOiBEb24ndCBkZWZpbmUuCi0JKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0KLVRodSBPY3QgIDkgMDA6MDc6MjMgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IEZpeCBidWcgdGhhdCB3b3VsZG4ndCBhbGxvdwotCXRvIHBhaXIgYSBicmFuY2ggYW5kIGxpbmsgd2l0aCBhbnl0aGluZyBidXQgYW4gZXhlIGluc3RydWN0aW9uLgotCi1XZWQgT2N0ICA4IDE2OjI4OjUzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBEaXNhYmxlIHRoZSBzeW0rY29uc3QgLmdvdAotCW9wdGltaXphdGlvbiB0byByZWR1Y2UgdGhlIGFsaWdubWVudCBzdXJwcmlzZXMgZm9yIGdjYy4KLQotV2VkIE9jdCAgOCAxNjoxMToxNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVENfU1BBUkMpOiBEb24ndCBkZWZpbmUgVEFSR0VUX0ZPUk1BVC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY190YXJnZXRfZm9ybWF0KTogSGFuZGxlIGNvZmYgaGVyZS4KLQkoc3BhcmNfaXApOiBBZGQgJWhpeCwlbG94LgotCShtZF9hcHBseV9maXgzKTogQ2FsbCBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCi0JQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19TUEFSQ197SElYMjIsTE9YMTB9LgotCSh0Y19nZW5fcmVsb2MpOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1NQQVJDX3tISVgyMixMT1gxMH0uCi0KLVdlZCBPY3QgIDggMTI6MzM6MzIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgYWxwaGEtKi0qIHRvIGFscGhhKi0qLSo7IGNvbmZpZy5ndWVzcyBub3cKLQlyZWNvZ25pemVzIGFscGhhZXY1IGV0Yy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIE9jdCAgOCAwMDowNDowNSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBSZXBsYWNlIHRoZSBUQVJHRVRfQ1BVIHZhbHVlCi0Jb2YgbWlwc3IzOTAwIHdpdGggbWlwc3R4MzkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCBwcmludCB0aGUgJ29wY29kZSByZXF1aXJlcyAKLQktbWlwc1hYIG1lc3NhZ2UnIGlmIHRoZSBpbnNuIGlzbid0IGFuIElTQSBpbnNuLgotCi1UdWUgT2N0ICA3IDEyOjQ4OjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUIHN1cHBvcnQpOiBNb3ZlZCB0byB0Yy1zcGFyYy5jLgotCVJlZGVmaW5lIFRBUkdFVF9GT1JNQVQgdG8gY2FsbCBzcGFyY190YXJnZXRfZm9ybWF0LgotCSogY29uZmlnL3RjLXNwYXJjLmMgKGluX3Vuc2lnbmVkX3JhbmdlKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19hcmNoX3NpemUpOiBNYWtlIHN0YXRpYy4KLQkoc3BhcmNfdGFyZ2V0X2Zvcm1hdCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBEZWxldGUgdmFyaWFibGUgaW1tZWRpYXRlX21heC4gIFJld3JpdGUgJWhpL2V0YyByZWxvYwotCWhhbmRsaW5nLiAgQWRkIHN1cHBvcnQgZm9yICVoaCwlaG0sJWxtLCVoNDQsJW00NCwlbDQ0LgotCShvdXRwdXRfaW5zbik6IFNldCBgZnhfbm9fb3ZlcmZsb3cnLgotCShtZF9hcHBseV9maXgzKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ197NyxINDQsTTQ0LEw0NH0uCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1Nb24gT2N0ICA2IDE0OjA0OjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfc2VjdGlvbik6IFJlbW92ZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogRW5oYW5jZSBlcnJvciBtZXNzYWdlLgotCi1GcmkgT2N0ICAzIDE1OjQwOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVW5kZWYgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgYmVmb3JlCi0JaW5jbHVkaW5nIG9iai1lbGYuaCBpbiBPQkpfTUFZQkVfRUxGIGNhc2UuCi0JKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IFJldHVybiBOVUxMIGFmdGVyIGFib3J0IHRvIGF2b2lkIHdhcm5pbmcuCi0KLQkqIGVjb2ZmLmMgKGdlbmVyYXRlX2Vjb2ZmX3N0YWIpOiBSZW1vdmUgdW51c2VkIHN0YXRpYyBmdW5jdGlvbi4KLQotCSogZXhwci5jIChvcGVyYXRvcik6IEFjY2VwdCA9PS4gIEZyb20gQW5kZXJzIEJsb21kZWxsCi0JPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4uCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoZ2VuX3RvX3dvcmRzKTogV2hlbiBnZW5lcmF0aW5nIGEgZGVub3JtYWwKLQludW1iZXIsIGhhbmRsZSBhbiBvdmVyZmxvdyBpbnRvIHRoZSBzbWFsbGVzdCBub3JtYWxpemVkIG51bWJlci4KLQotTW9uIFNlcCAyOSAxNToyNDo1MiAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGFzLmgsIGlucHV0LXNjcnViLmMgKG5ld19sb2dpY2FsX2xpbmUpOiBOZXcgcmV0dXJuIHZhbHVlLgotCSogcmVhZC5jIChzX2FwcF9maWxlKTogRG9uJ3Qgbm90ZSB0aGUgc2FtZSBmaWxlIHNldmVyYWwgdGltZXMKLQlpbiBhIHJvdy4KLQotVGh1IFNlcCAyNSAxMzowODowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZW1vdmUgYCBvcGVyYW5kIHNwZWNpZmllci4KLQotV2VkIFNlcCAyNCAxNjo1NDo0MCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoc2gqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBzaC0qLWVsZiouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgMjQgMTE6MzA6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSGFuZGxlIHEgYW5kIHYgb3BlcmFuZCBzcGVjaWZpZXJzLgotCi0JKiBkb2MvYy1pMzg2LnRleGkgKGkzODYtRmxvYXQpOiBSZW1vdmUgaW5jb3JyZWN0IGFzc2VydGlvbiB0aGF0Ci0JZm4qIGluc3RydWN0aW9ucyBkbyBub3QgaW5zZXJ0IGltcGxpY2l0IGZ3YWl0LiAgVGhpcyB3YXMgY2hhbmdlZAotCUphbiAyOSwgMTk5Ni4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAoeXlsZXgpOiBQZXJtaXQgYW4gZXhwcmVzc2lvbiB0byBiZSB1c2VkIGZvcgotCXRoZSBzY2FsZSBmYWN0b3IuCi0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9hc19uZXdfU09VUkNFUyk6IFNldCB0byBjb25maWcvbTY4ay1wYXJzZS55LAotCW5vdCBtNjhrLXBhcnNlLnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwIDIzIDE3OjQ4OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogQ2xlYXIgbXJpX3N0YXRlIGF0IGVuZCBvZiAubXJpCi0JcHNldWRvLW9wLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChoaWxvX2ludGVybG9ja3MpOiBDaGFuZ2UgZnJvbSBhIHN0YXRpYwotCXZhcmlhYmxlIHRvIGEgbWFjcm8sIHNvIHRoYXQgaXQgdmFyaWVzIHdpdGggdGhlIHZhcmlhYmxlcyB1cG9uCi0Jd2hpY2ggaXQgZGVwZW5kcy4KLQkoZ3ByX2ludGVybG9ja3MsIGNvcF9pbnRlcmxvY2tzKTogTGlrZXdpc2UuCi0JKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSB0aGVtLgotCi1GcmkgU2VwIDE5IDE3OjA4OjQxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBVc2Ugc3RyY2FzZWNvbXAgaW5zdGVhZAotCW9mIHN0cmNtcCB3aGVyZSBhcHByb3ByaWF0ZS4KLQotVGh1IFNlcCAxOCAxNDoxMTo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvcGUgd2l0aCBhIHplcm8gZGF0YSBhcmVhCi0JcmVsb2NhdGlvbiB3aXRoIGEgY29uc3RhbnQgb2Zmc2V0LgotCShtZF9hc3NlbWJsZSk6IFByb2R1Y2UgZXJyb3IgbWVzc2FnZSB3aGVuIHNwZWNpYWwgZGF0YSBhcmVhCi0JcmVsb2NhdGlvbnMgYXJlIHVzZWQgb24gaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZW0uCi0JKG1kX2Fzc2VtYmxlKTogUmVzZXQgcHJvY2Vzc29yIG1hc2sgaWYgZGVmaW5lZCBieSBjb21tYW5kIGxpbmUKLQlzd2l0Y2guIAotCi1UaHUgU2VwIDE4IDExOjI0OjAxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBSZW9yZ2FuaXplIGZpbGUuCi0JKHBhcnNlX2tleXdvcmRfYXJnKTogQWxsb3cgbnVtYmVycyBpbiByZWcgbmFtZXMuCi0JKFNQRUNJQUxfQ0FTRV9OT05FKTogTmV3IG1hY3JvLgotCShtZF9hc3NlbWJsZSk6IFVzZSBpdC4KLQkobG9va3VwX2FyY2gsaW5pdF9kZWZhdWx0X2FyY2gpOiBOZXcgZnVuY3Rpb25zLgotCShkZWZhdWx0X2FyY2gsZGVmYXVsdF9pbml0X3Asc3BhcmNfYXJjaF90YWJsZSk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShzcGFyY19hcmNoX3NpemUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtYXhfYXJjaGl0ZWN0dXJlKTogSW5pdGlhbGl6ZSBpbiBpbml0X2RlZmF1bHRfYXJjaC4KLQkobWRfcGFyc2Vfb3B0aW9ucyk6IENhbGwgaW5pdF9kZWZhdWx0X2FyY2ggaWYgbmVjZXNzYXJ5LgotCVJld3JpdGUgLXhhcmNoLy1BIHByb2Nlc3NpbmcuCi0JKG1kX3Nob3dfdXNhZ2UpOiBQcmludCAtQSB2YWx1ZXMgZnJvbSBzcGFyY19hcmNoX3RhYmxlLgotCShtZF9iZWdpbik6IENhbGwgaW5pdF9kZWZhdWx0X2FyY2ggaWYgbmVjZXNzYXJ5LgotCShzcGFyY19tZF9lbmQpOiBIYW5kbGUgYm90aCAzMiBhbmQgNjQgYml0IGVudmlyb25tZW50cy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKTogTGlrZXdpc2UuCi0JKiBhY2NvbmZpZy5oIChTUEFSQ19WOSxTUEFSQ19BUkNINjQpOiBEZWxldGUuCi0JKERFRkFVTFRfQVJDSCk6IEFkZC4KLQkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMpOiBEZWZhdWx0IERFRkFVTFRfQVJDSCBiYXNlZCBvbiB0YXJnZXQgY3B1LgotCShTUEFSQ19WOSxTUEFSQ19BUkNINjQpOiBEZWxldGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWcvdm1zLWNvbmYuaCAoU1BBUkNfVjksU1BBUkNfQVJDSDY0KTogRGVsZXRlLgotCi1XZWQgU2VwIDE3IDE2OjU0OjIwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogUmVjb2RlZCB0byB1c2UgQ0hFQ0tfICgpCi0JbWFjcm8uIAotCShoYW5kbGVfdGRhb2ZmLCBoYW5kbGVfemRhb2ZmLCBoYW5kbGVfc2Rhb2ZmKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0ZWQgdHlwby4KLQkqIGNvbmZpZy90Yy12ODUwLmMgQWRkIG5ldyBzZWN0aW9uczogY2FsbF90YWJsZV9kYXRhIGFuZAotCWNhbGxfdGFibGVfdGV4dC4KLQkodjg1MF9yZWxvY19wcmVmaXgpOiBBZGQgc3VwcG9ydCBmb3IgY3RvZmYoKSByZWxvY2F0aW9uIHByZWZpeC4gCi0JKGhhbmRsZV9jdG9mZik6IE5ldyBGdW5jdGlvbi4KLQotCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBEb2N1bWVudCBjYWxsIHRhYmxlIHJlbG9jYXRpb25zLgotCi1UdWUgU2VwIDE2IDE0OjE4OjIyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogQWRkIHN1cHBvcnQgZm9yIGEgMTYgYml0Ci0JZGlzcGxhY2VtZW50IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi0KLU1vbiBTZXAgMTUgMjE6Mjg6MDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBNYWtlIGRlY2xhcmF0aW9uIG1hdGNoCi0JZGVmaW5pdGlvbi4KLQotTW9uIFNlcCAxNSAxODozMzowNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChwcm9jZXNzb3JfbWFzayk6IE5ldyB2YXJpYWJsZS4KLQkoc2V0X21hY2hpbmUsIG1kX3BhcnNlX29wdGlvbik6IFNldCBwcm9jZXNzb3JfbWFzay4KLQkobWRfYXNzZW1ibGUpOiBDaGVjayB0aGF0IGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSB0byB0YXJnZXQKLQlwcm9jZXNzb3IuIAotCi0JKiBjb25maWcvdGMtdjg1MC5oIChUQVJHRVRfUFJPQ0VTU09SKTogTmV3IGNvbnN0YW50LgotCi1Nb24gU2VwIDE1IDExOjI4OjA0IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gd29yayBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogRm9yIG12ZnN5cyBhbmQgbXZ0c3lzLAotCUNSIGlzIDAgZm9yIFBTV0wgYW5kIFBTV0guCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogRG9uJ3QgYWNjZXB0Ci0JaWxsZWdhbCBjb25kaXRpb24gY29kZXMgZm9yIGNtcHUgaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfRDMwVl85X1BDUkVMCi0JdXNlZCBpbiBkKmkgaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChjaGVja19zaXplKTogTmV3IGZ1bmN0aW9uLiAgQ2hlY2sKLQlyZWxvY2F0aW9ucyBmb3Igb3ZlcmZsb3dzLgotCShtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBGaXggcmVsb2NhdGlvbnMgYmV0d2VlbiBzZWN0aW9ucy4KLQkobWRfYXBwbHlfZml4Myk6IFVzZSBuZXcgcmVsb2NhdGlvbiB0eXBlcyBmb3IgMTUgYW5kIDIxCi0JYml0IHJlbG9jYXRpb25zIGluIHRoZSByaWdodCBjb250YWluZXIuIE5lZWRlZCBiZWNhdXNlCi0JdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBlaWdodC1ieXRlIGFsaWduZWQKLQlidXQgdGhlIHJlbG9jYXRpb25zIG11c3QgYmUuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGVjayBmb3Igb3ZlcmZsb3cuCi0JKGZpbmRfZm9ybWF0KTogSWYgIi5zIiBvciAiLmwiIGFyZSB1c2VkLCBkb24ndCB0cnkKLQl0byBjb21wdXRlIGJyYW5jaCBzaXplcy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBDaGVjayBmb3IgIi5zIiBvcgotCSIubCIgZXh0ZW5zaW9ucyB0byBvcGNvZGUgbmFtZXMuCi0JKGZpbmRfZm9ybWF0KTogR2VuZXJhdGUgdGhlIGNvcnJlY3QgaW5zdHJ1Y3Rpb25zIHdoZW4KLQkiLnMiIG9yICIubCIgYXJlIHVzZWQuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBDaGVjayBmb3Igb2RkIHJlZ2lzdGVycwotCW9uIGluc3RydWN0aW9ucyB0aGF0IHJlcXVpcmUgZXZlbiByZWdpc3RlcnMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmggKG1kX3N0YXJ0X2xpbmVfaG9vayk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3N0YXJ0X2xpbmVfaG9vayk6IE5ldyBob29rLgotCUNoZWNrcyB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBmb3IgYSAiLiIuICBJZiBpdAotCWZpbmRzIG9uZSwgYXNzdW1lIGEgcHNldWRvLW9wIGFuZCBmbHVzaCBhbnkgdW53cml0dGVuCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogRml4IHByb2JsZW0KLQl3aXRoIGRldGVybWluaW5nIHdoZW4gZml4dXBzIHdlcmUgZG9uZS4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEZpeCBidWcgd2hlcmUgdGhlIG51bWVyaWMKLQlwYXJ0IG9mIGEgc3ltYm9sIChmb3IgZXhhbXBsZSwgImZvbys4Iikgd2FzIGJlaW5nIHdyaXR0ZW4KLQlpbnRvIHRoZSBpbnN0cnVjdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQ2hhbmdlIC53b3JkIHRvIGJlIDMyIGJpdHMgYW5kIGFkZAotCS5od29yZCBhcyAxNiBiaXRzLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IENoZWNrIHRvIHNlZSBpZiBmaXJzdAotCWluc3RydWN0aW9uIGlzIGEganVtcC4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBNYWpvciBjb2RlIHJlb3JnYW5pemF0aW9uLgotCi1XZWQgU2VwIDEwIDEwOjA3OjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdGVkIHNwZWxsaW5nIG1pc3Rha2UuCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgdjg1MCBlbXVsYXRpb24uCi0KLVR1ZSBTZXAgIDkgMTc6MTQ6MzMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENQVV9UWVBFUyk6IEFkZCBhcmMuCi0JKFRBUkdFVF9DUFVfQ0ZJTEVTKTogQWRkIHRjLWFyYy5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCB0Yy1hcmMuaC4KLQkoZGVwZW5kZW5jaWVzKTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYXJjLSotZWxmKi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcvdGMtYXJjLltjaF06IE5ldyBmaWxlcy4KLQotVHVlIFNlcCAgOSAxMDoxOTozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IERvY3VtZW50IGhpMCgpIHJlbG9jIHByZWZpeC4KLQlDb3JyZWN0IGRlc2NyaXB0aW9uIG9mIGhpKCkgcmVsb2MgcHJlZml4LgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IERvY3VtZW50IG5ldyByZWxvYyBwcmVmaXguCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IEFkZCBoaWxvKCkgcmVsb2MgcHJlZml4LgotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DXzMyLgotCi0JKiBkb2MvYy12ODUwLnRleGk6IERvY3VtZW50IG5ldyBwc2V1ZG8gb3BzIGFuZCBjb21tYW5kIGxpbmUKLQlvcHRpb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChzZXRfbWFjaGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKC52ODUwKTogTmV3IHBzZXVkbyBvcC4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKC52ODUwZSk6IE5ldyBwc2V1ZG8gb3AuCi0JKiBjb25maWcvdGMtdjg1MC5jICgudjg1MGVhKTogTmV3IHBzZXVkbyBvcC4KLQkKLQotTW9uIFNlcCAgOCAyMzowODowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IC1hbGggYW5kIC1hbGQgZm9yIERXQVJGIDE6Ci0JKiBsaXN0aW5nLmMgKHN0cnVjdCBsaXN0X2luZm9fc3RydWN0KTogQWRkIGRlYnVnZ2luZyBmaWVsZC4KLQkobGlzdGluZ19uZXdsaW5lKTogSW5pdGlhbGl6ZSB0aGUgZGVidWdnaW5nIGZpZWxkLiAgSWYgRUxGLCBpZiB0aGUKLQlzZWN0aW9uIHN0YXJ0cyB3aXRoIC5kZWJ1ZyBvciAubGluZSwgc2V0IHRoZSBkZWJ1Z2dpbmcgZmllbGQgaW4KLQl0aGUgbGlzdGluZyBzdHJ1Y3R1cmUuCi0JKGRlYnVnZ2luZ19wc2V1ZG8pOiBBZGQgbGlzdCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBJZgotCXRoZSBkZWJ1Z2dpbmcgZmllbGQgaXMgc2V0LCBjb25zaWRlciBpdCB0byBiZSBhIGRlYnVnZ2luZyBwc2V1ZG8uCi0JSWYgRUxGLCBza2lwIGJsYW5rIGxpbmVzIGJldHdlZW4gZGVidWdnaW5nIGxpbmVzLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBJZiBFTEYsIGxvb2sgZm9yIGxpbmUgbnVtYmVycy4KLQkoc3RyaW5nZXIpOiBJZiBFTEYsIGxvb2sgZm9yIGZpbGUgbmFtZXMuCi0KLU1vbiBTZXAgIDggMTI6MzM6NDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9pbnNlcnRfb3BlcmFuZCk6IE9ubHkgdGVzdCBmb3Igb3ZlcmZsb3cKLQlpZiB0aGVyZSBpcyBubyBpbnNlcnQgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKFRBUkdFVF9NQUNISU5FKTogTmV3IGNvbnN0YW50LgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2luc2VydF9vcGVyYW5kKTogQWRkCi0JLW13YXJuX3Vuc2lnbmVkX292ZXJmbG93LiAKLQkobWRfYmVnaW4pOiBTZXQgQkZEIG1hY2hpbmUgbnVtYmVyIGJhc2VkIG9uIG1hY2hpbmUgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCAtbXY4NTAsIC1tdjg1MGUgYW5kIC1tdjg1MGVhIG9wdGlvbnMuCi0KLU1vbiBTZXAgIDggMTE6MjA6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oOiBEb24ndCBkZWNsYXJlIGFsbG9jYSBpZiBpdCBpcyBhIG1hY3JvLgotCSogbWFjcm8uYzogTGlrZXdpc2UuCi0KLVN1biBTZXAgIDcgMDA6MzA6MTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9wYXJzZV9vcHRpb24pOiBNb3ZlIG1bXSBvdXQgdG8gdG9wIGxldmVsIGFuZAotICAgICAgICByZW5hbWUgdG8gY3B1X3R5cGVzW10uCi0gICAgICAgIChzX2FscGhhX2FyY2gpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImFyY2giLgotCi0gICAgICAgICogY29uZmlnL3RjLWFscGhhLmMgKG1kX2JlZ2luKTogTWVyZ2UgdGhlIHR3byBsb29wcyB0aHJvdWdoIHRoZQotICAgICAgICBvcGNvZGUgdGFibGUuCi0gICAgICAgIChzX2FscGhhX3Byb2MpOiBBZGQgaW5pdGlhbCBTS0lQX1dISVRFU1BBQ0UuCi0gICAgICAgIChzX2FscGhhX3NldCk6IExpa2V3aXNlLiAgVXNlIGdldF9zeW1ib2xfZW5kIGluc3RlYWQgbG9jYWwgd2hpbGUgbG9vcC4KLQotU2F0IFNlcCAgNiAxOTozODoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChzX2xjb21tX2J5dGVzKTogQWRkIHByb3RvdHlwZSAoZm9yIHJlYWwgdGhpcyB0aW1lKS4KLQotVGh1IFNlcCAgNCAxMjoxMDowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IE9ubHkgc2V0IEJTRl9PQkpFQ1QgZm9yCi0Jc3ltYm9scyBvbiBJcml4LgotCi1XZWQgU2VwICAzIDExOjIxOjMzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTC4KLQotVHVlIFNlcCAgMiAxODozMjozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgYXJleAotCXJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogU2ltaWxhcmx5LgotCi1UdWUgU2VwICAyIDE1OjU4OjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLXY4NTAudGV4aTogRXhwbGFuYXRpb25zIG9mIG9mZnNldHMgaW4gU0RBL1pEQSBhcmVhcwotCWNvcnJlY2V0ZC4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEFkZCBzdXBwb3J0IGZvciBTREEvVERBL1pEQSBzZWN0aW9ucy4KLQkodjg1MF9yZWxvY19wcmVmaXgpOiBEdXBsaWNhdGUgY29kZSBlbGltaW5hdGVkLiAgQWRkIGNvZGUgdG8KLQlyZWNvZ25pc2Ugc3BlY2lhbCBpbnN0cnVjdGlvbnMuCi0JKG1kX2Fzc2VtYmxlKTogQ2FsY3VsYXRpb24gb2YgdGhlIHNpemUgb2YgYSBmaXh1cHMgY29ycmVjdGVkLgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IEFkZCBTREEvVERBL1pEQQotCXNlY3Rpb25zLiAJCi0KLVR1ZSBTZXAgIDIgMTU6NDA6NTYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFVzZSBvcGNvZGUtPm5hbWUgaW5zdGVhZCBvZgotIAlvcGNvZGUtPm9wY29kZSBhcyB0aGUgc2VudGluYWwuIFplcm8gaXMgYSB2YWxpZCBvcGNvZGUuCi0KLVR1ZSBBdWcgMjYgMTY6NTE6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoTWFjaGluZSBEZXBlbmRlbmNpZXMpOiBBZGQgdjg1MCB0byBtZW51LgotCSogZG9jL2Mtdjg1MC50ZXhpOiBDaGFuZ2Ugbm9kZSBuYW1lIHRvIG1hdGNoIG90aGVyIGNoYXB0ZXIgbm9kZXMuCi0KLVR1ZSBBdWcgMjYgMDk6NDY6MjIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBDb3JyZWN0IG5hbWUgZm9yIHRpbnkgZGF0YSBhcmVhCi0JcG9pbnRlci4gCi0KLVR1ZSBBdWcgMjYgMTI6MjM6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBJZiBCRkQ2NCwgZG9uJ3QgbWFrZSBhIGJpZ251bSBpZiB0aGUKLQludW1iZXIgd2lsbCBmaXQgaW4gNjQgYml0cy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IENoZWNrIGV4cGxpY2l0bHkgZm9yIE9fYmlnLAotCXJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLQkqIGFzLmg6IERvbid0IGRlZmluZSBhbGxvY2EgaWYgX19HTlVDX18uICBKdXN0IGRlY2xhcmUgaXQuCi0JKiBtYWNyby5jOiBDb3B5IGFsbG9jYSBoYW5kbGluZyBmcm9tIGFzLmguCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IENvcnJlY3QgMTYgYml0IG5vb3BzLiAgRnJvbQotCUdhYnJpZWwgUGF1YmVydCA8cGF1YmVydEBpcmFtLmVzPi4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBJbiBKdW1wQnl0ZSBjYXNlLCB3aGVuIGxvb2tpbmcKLQlmb3IgYSBXT1JEX1BSRUZJWF9PUENPREUsIGNoYW5nZSBpdCB0byBBRERSX1BSRUZJWF9PUENPREUgaWYgdGhpcwotCWlzIGpjeHogb3IgYSBsb29wIGluc3RydWN0aW9uLgotCi1Nb24gQXVnIDI1IDE2OjA0OjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCAnaHAnIGFzIGFsaWFzIGZvcgotCXIyLgotCShtZF9iZWdpbik6IFNldCB1cCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgdHlwZS4KLQotTW9uIEF1ZyAyNSAxNDoyNTo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBTdG9yZSB0aGUgdmFsdWUgYmFjayBpbnRvIHRoZQotCXN5bWJvbCBleHByZXNzaW9uLCB0byBoYW5kbGUgYWRkIG9yIHN1YnRyYWN0IHNpbXBsaWZpY2F0aW9uCi0JY29ycmVjdGx5LiAgSGFuZGxlIE9fc3ltYm9sX3J2YS4gIEFkZCBkZWZhdWx0IGNhc2UuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2NoYW5nZV9jc2VjdCk6IFRlbXBvcmFyaWx5IGxvd2VyIHRoZQotCWNodW5rc2l6ZSB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IHN1YnNlY3Rpb24uCi0JKiBhcy5jIChjaHVua3NpemUpOiBJbml0aWFsaXplIHRvIHplcm8uCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENoYW5nZSA1MDAwIHRvIGNodW5rc2l6ZSB3aGVuCi0JY2FsbGluZyBvYnN0YWNrX2JlZ2luLgotCi1Nb24gQXVnIDI1IDExOjIxOjQ4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogUmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIgdXBvbgotCWV4aXQuIAotCQotCSogY29uZmlnL3RjLXY4NTAuYyAocGFyc2VfcmVnaXN0ZXJfbGlzdCk6IFN1cHBvcnQgY29uc3RhbnQKLQlleHByZXNzaW9ucyBhcyByZWdpc3RlciBsaXN0cy4KLQotTW9uIEF1ZyAyNSAxMDoxOTozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy12ODUwLnRleGk6IENoYW5nZSB0aGUgbWFqb3Igbm9kZSB0byB2ODUwIE1hY2hpbmUKLQlEZXBlbmRlbmNpZXMuIAotCi1GcmkgQXVnIDIyIDExOjE2OjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgaW5jbHVzaW9uIG9mIGMtdjg1MC50ZXhpCi0KLQkqIGRvYy9jLXY4NTAudGV4aTogTmV3IGZpbGUuCi0KLQkqIHJlYWQuYyAoaXNfZW5kX29mX2xpbmUpOiBNYWtlIE5VTCBjaGFyYWN0ZXIgYmUgY29uc2lkZXJlZCB0byBiZQotCWEgbGluZSB0ZXJtaW5hdG9yLgotCi1GcmkgQXVnIDIyIDEwOjQ1OjMzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHBhcnNlX3JlZ2lzdGVyX2xpc3QpOiBBZGQgc3VwcG9ydCBmb3IgY3VybHkKLQlicmFjZSBzeW50YXguCi0JKGNjX25hbWVzKTogQWRkICJlIiBhbmQgIm5lIiBjb25kaXRpb25zLgotCi1UaHUgQXVnIDIxIDExOjAwOjM2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IFN1cHBvcnQgYSBkb3VibGUgZGFzaCBhcyBzdGFydGluZyBhCi0JY29tbWVudCB0aGF0IGV4dGVuZHMgdG8gZW5kIG9mIGxpbmUuCi0KLVRodSBBdWcgMjEgMTA6NTQ6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9zZWN0aW9uLCB2ODUwX2Jzcywgdjg1MF9vZmZzZXQpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKG1kX3BzZXVkb190YWJsZSk6IE5ldyBwc2V1ZG8gb3BzOiAuYnNzLCAub2Zmc2V0LCAuc2VjdGlvbgotCi1UaHUgQXVnIDIxIDAwOjU5OjUzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXBkYXRlIHJlY29yZGVkCi0JaW5zbiB3aGVuIGNoYW5naW5nIHRvIGEgZGlmZmVyZW50IGluc3RydWN0aW9uLgotCi1XZWQgQXVnIDIwIDAwOjQ1OjIwIDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogdGMtc2guYyAocGFyc2VfcmVnLCBnZXRfc3BlY2lmaWMsIGJ1aWxkX015dGVzKTogQWRkIFNINAotCWZsb2F0aW5nIHBvaW50IGV4dGVuc2lvbnMuCi0JKHBhcnNlX3JlZyk6IHBhcnNlIHNnciBhbmQgZGJyLgotCi1UdWUgQXVnIDE5IDE3OjA3OjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHN5c3RlbV9yZWdpc3Rlcl9uYW1lKTogU3VwcG9ydCBudW1iZXJzIGZvcgotCXN5c3RlbSByZWdpc3RlciBJRHMuCi0KLVR1ZSBBdWcgMTkgMDg6NTk6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19sY29tbV9pbnRlcm5hbCk6IFJlbmFtZWQgZnJvbSBzX2xjb21tLCBhZGRlZCBhcmcgdG8KLQlmbGFnIHdoZW4gYWxpZ25tZW50IGlzIGluIGJ5dGVzIGluc3RlYWQgb2YgcG93ZXIgb2YgMiwgYW5kIGNvZGUgdG8KLQl1c2UgdGhhdCBmbGFnIHRvIGNvbnZlcnQgYWxpZ25tZW50IHRvIGJ5dGVzLgotCShzX2xjb21tLCBzX2xjb21tX2J5dGVzKTogIE5ldyBoZWxwZXJzIHRoYXQgY2FsbCBzX2xjb21tX2ludGVybmFsLgotCSogcmVhZC5oIChzX2xjb21tX2J5dGVzKTogQWRkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIEFMSUdOTUVOVF9JTl9TX0ZMQUdTIGlzCi0JZGVmaW5lZCwgd3JpdGUgYWxpZ25tZW50IHRvIGFsaWdubWVudCBiaXRzIGluIHNlY3Rpb24gaGVhZGVyIHNfZmxhZ3MKLQlyYXRoZXIgdGhhbiB0aGUgc19hbGlnbiBmaWVsZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChBTElHTk1FTlRfSU5fU19GTEFHUyk6IERlZmluZSBmb3IgVENfVElDODAuCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfcHNldWRvX3RhYmxlKTogVXNlIHNfbGNvbW1fYnl0ZXMgZm9yIGJzcwotCXBzZXVkbywgaW5zdGVhZCBvZiBzX2xjb21tIHdoaWNoIHdhbnRzIGEgcG93ZXIgb2YgdHdvIGZvciBhbGlnbm1lbnQuCi0KLU1vbiBBdWcgMTggMjA6NDI6MjMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAoY2hlY2tfbWFjcm8pOiB1c2UgYWxsb2NhIGluc3RlYWQgb2YgeG1hbGxvYyB0byBwbHVnIGxlYWsuCi0KLU1vbiBBdWcgMTggMjA6MzM6MDYgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IEFkZCAtYW0uCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiKTogRG9uJ3QgYWRkIGxlYWRpbmcgXG4KLQlpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBvbmUuCi0JKiBsaXN0aW5nLmMgKHN0cnVjdCBsaXN0X2luZm9fc3RydWN0KTogQWRkIGxpbmVfY29udGVudHMuCi0JKGxpc3RpbmdfbmV3bGluZSk6IFB1dCB1bnVzZWQgYXJndW1lbnQgdG8gd29yazogaWYgbm9uLW51bGwsIHNhdmUgaXQuLi4KLQkobGlzdGluZ19saXN0aW5nKTogLi4uIGFuZCByZWd1cmdpdGF0ZSBkdXJpbmcgbGlzdGluZyBpbnN0ZWFkIG9mIGxpbmUKLQlmcm9tIGZpbGUuCi0JKiBsaXN0aW5nLmggKExJU1RJTkdfTUFDRVhQKTogTmV3IGRlZmluZS4KLQkoTElTVElOR19ORVdMSU5FKTogQXJndW1lbnQgaXMgTlVMTC4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgZXhwYW5kaW5nIG1hY3JvcywgYnJlYWsgdXAgaW5wdXQKLQlsaW5lcyBhbmQgcGFzcyB0aGVtIHRvIGxpc3RpbmdfbmV3bGluZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAtYWMgYW5kIC1hbS4KLQotCSogY29uZC5jIChzX2lmYyk6IEFkZCBtaXNzaW5nIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuCi0KLU1vbiBBdWcgMTggMTE6MjY6MzYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXBwbHlfZml4Myk6IEFkZCBzdXBwb3J0IGZvciBuZXcgMTYgYml0IFBDCi0JcmVsYXRpdmUgcmVsb2MuCi0KLU1vbiBBdWcgMTggMTE6MjQ6MjEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogUmVtb3ZlIHN1cHBvcnRfdjg1MGUgZmxhZyBhbmQgY29tbWFuZCBsaW5lCi0Jb3B0aW9uLiAKLQkKLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQKLQotCSogY29uZmlndXJlIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldAotCi1Nb24gQXVnIDE4IDExOjI0OjIxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBzdXBwb3J0X3Y4NTBlYSBmbGFnIGFuZCBjb21tYW5kIGxpbmUKLQlvcHRpb24uIAotCQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQKLQotCSogY29uZmlndXJlIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQKLQotRnJpIEF1ZyAxNSAxNDowMDoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogRG9uJ3QgY2QgaW50byB0ZXN0c3VpdGUgdW50aWwgYWZ0ZXIKLQlzZXR0aW5nIEVYUEVDVCBhbmQgVENMX0xJQlJBUlkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYXMuaCAoZW51bSBkZWJ1Z19pbmZvX3R5cGUpOiBEZWZpbmUuCi0JKGRlYnVnX3R5cGUpOiBEZWNsYXJlLgotCSogYXMuYyAoZGVidWdfdHlwZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHNob3dfdXNhZ2UpOiBBZGQgLS1nc3RhYnMuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1nc3RhYnMuCi0JKiByZWFkLmMgKGdlbmVyYXRlX2FzbV9saW5lbm8pOiBSZW1vdmUuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE91dHB1dCBzdGFicyBkZWJ1Z2dpbmcgaWYgYXBwcm9wcmlhdGUuCi0JQ2hhbmdlIGNoZWNrcyBvZiBnZW5lcmF0ZV9hc21fbGluZW5vIHRvIGNoZWNrIGRlYnVnX3R5cGUuICBPbmx5Ci0JZ2VuZXJhdGUgRUNPRkYgZGVidWdnaW5nIGlmIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLgotCSogcmVhZC5oIChnZW5lcmF0ZV9hc21fbGluZW5vKTogRG9uJ3QgZGVjbGFyZS4KLQkoc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IERlY2xhcmUuCi0JKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogTmV3IGZ1bmN0aW9uLgotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBVc2UgZGVidWdfdHlwZSwgbm90IGdlbmVyYXRlX2FzbV9saW5lbm8uCi0JRG9uJ3QgdHVybiBvZmYgZGVidWdnaW5nLgotCShhZGRfZmlsZSk6IFJlbW92ZSBvbGQgI2lmIDAgY29kZS4KLQkoZWNvZmZfbmV3X2ZpbGUpOiBTZXQgZGVidWdfdHlwZSwgbm90IGdlbmVyYXRlX2FzbV9saW5lbm8uCi0JKGVjb2ZmX2RpcmVjdGl2ZV9lbmQpOiBEb24ndCBnZW5lcmF0ZSBzdGFicyBsaW5lIHN5bWJvbHMuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBEb24ndCBjaGVjayBzdGFic19zZWVuLiAgRG9uJ3Qgc2V0Ci0JZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQkobGluZV9sYWJlbF9jbnQpOiBSZW1vdmUuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBSZW1vdmUuCi0JKiBlY29mZi5oIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYXMuMTogRG9jdW1lbnQgLS1nc3RhYnMuCi0KLVdlZCBBdWcgMTMgMTg6NTg6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUsIG1kX3Nob3dfdXNhZ2UsIG1kX3BhcnNlX29wdGlvbik6Ci0JQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSBpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlLCBtZF9zaG93X3VzYWdlLCBtZF9wYXJzZV9vcHRpb24pOgotCUFkZCBzdXBwb3J0IGZvciB2ODUwZSBpbnN0cnVjdGlvbnMuCi0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEZpeCBlcnJvciByZWNvdmVyeSB0byByZWxvYWQKLQl0ZXh0IG9mIGVudGlyZSBvcGNvZGUuIAotCi1UdWUgQXVnIDEyIDEwOjI3OjM0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRG9jdW1lbnQgcnNfbGViMTI4LgotCi1UdWUgQXVnIDEyIDEyOjE3OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgU0laRV9CWVRFCi0JaW4gQUJTTCBjYXNlLCByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgotCi1Nb24gQXVnIDExIDIxOjQ4OjAwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGVudW0gX3JlbGF4X3N0YXRlKTogQWRkIHJzX2xlYjEyOC4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBzbGViMTI4IGFuZCB1bGViMTI4LgotCShzaXplb2ZfKmxlYjEyOCwgb3V0cHV0XypsZWIxMjgsIGVtaXRfbGViMTI4X2V4cHIsIHNfbGViMTI4KTogTmV3Ci0JZnVuY3Rpb25zLgotCSogcmVhZC5oOiBVcGRhdGUgcHJvdG90eXBlcy4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBTdHJlYW1saW5lIHF1aXRlIGEgYml0LiAgUmV0dXJuCi0JdGhlIHN5bWJvbCB2YWx1ZSwgYWRkIGEgc2Vjb25kIEZJTkFMSVpFIGFyZ3VtZW50IHRoYXQgcHJldmVudHMgCi0JY2hhbmdlcyBmcm9tIGJlaW5nIGNvbWl0dGVkLiAgVXBkYXRlIGFsbCBjYWxsZXJzLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCwgcmVsYXhfc2VnbWVudCk6IEhhbmRsZSByc19sZWIxMjguCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgdGhlIG5ldyBwc2V1ZG9zLgotCi1TdW4gQXVnIDEwIDE0OjUxOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBBZGQgc2l0ZS5iYWssIHNpdGUuZXhwLCBzdGFnZSwKLQlzdGFnZTEsIGFuZCBzdGFnZTIuCi0JKERJU1RDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogZG9jL01ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDYgMDA6MzA6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiBpZiBlbmRpYW4gaXMgc2V0LgotCURvbid0IHNldCB0YXJnIG9yIGdhc190YXJnZXQuICBEZWZpbmUgU0NPX0VMRiBhbmQKLQlUQVJHRVRfU09MQVJJU19DT01NRU5UIHdoZW4gYXBwcm9wcmlhdGUuICBEb24ndCBzdWJzdGl0dXRlIGZvcgotCXRhcmdldF9mcmFnLgotCSogTWFrZWZpbGUuYW06IFJlbW92ZSBAdGFyZ2V0X2ZyYWdALgotCShJTkNMVURFUyk6IFJlbW92ZSAkKElOVEVSTkFMX0NGTEFHUyksICQoQ1JPU1MpLCAkKEhERUZJTkVTKSwgYW5kCi0JJChUREVGSU5FUykuCi0JKGRlcC1hbSk6IE1hcmsgYXMgcGhvbnkuCi0JKiBhY2NvbmZpZy5oOiBBZGQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQsCi0JYW5kIFNDT19FTEYuCi0JKiBjb25maWcvYXJtLWJpZy5tdCwgY29uZmlnL2FybS1saXQubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9taXBzLWJpZy5tdCwgY29uZmlnL21pcHMtbGl0Lm10OiBSZW1vdmUuCi0JKiBjb25maWcvcHBjLWJpZy5tdCwgY29uZmlnL3BwYy1saXQubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9wcGMtc29sLm10OiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NmNvZmYubXQsIGNvbmZpZy9tNjhrY29mZi5tdDogUmVtb3ZlLgotCSogY29uZmlnL204OGtjb2ZmLm10OiBSZW1vdmUuCi0JKiBjb25maWcvc2NvNS5tdDogUmVtb3ZlLgotCSogY29uZmlndXJlLCBjb25maWcuaW4sIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbSAoJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgpOiBOZXcgdGFyZ2V0LCB0bwotCWZ1cnRoZXIgdHJ5IHRvIGNpcmN1bXZlbnQgdGhlIC55LmggcnVsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgQXVnICA1IDEyOjMyOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLCBmcm9tIG9sZCBhY2xvY2FsLm00LgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX0lOSVRfQVVUT01BS0UgYW5kIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZQotCXNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZQotCUFDX0NPTkZJR19IRUFERVIgd2l0aCBBTV9DT05GSUdfSEVBREVSLiAgQ2FsbCBBQ19QUk9HX1lBQ0MsCi0JQUNfUFJPR19MRVgsIGFuZCBBQ19ERUNMX1lZVEVYVC4gIENhbGwgQU1fTUFJTlRBSU5FUl9NT0RFLAotCUFNX0NZR1dJTjMyLCBhbmQgQU1fRVhFRVhULiAgRG9uJ3QgY2FsbCBDWV9DWUdXSU4zMiBvciBDWV9FWEVFWFQuCi0JKiBjb25maWcuaW46IE5ldyBmaWxlLCBjcmVhdGVkIGJ5IGF1dG9oZWFkZXIuCi0JKiBjb25mLmluOiBSZW1vdmUuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UsIFZFUlNJT04sIGFuZCBVU0lOR19DR0VOLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBhcy5jIChwcmludF92ZXJzaW9uX2lkKTogQ2hhbmdlIEdBU19WRVJTSU9OIHRvIFZFUlNJT04uCi0JKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotdm1zLmM6IChXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiBMaWtld2lzZS4KLQkqIGRvYy9NYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBkb2MvTWFrZWZpbGUuaW4uCi0JKiBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmQuYyAoc19lbHNlKTogSWYgbm90IGxpc3RpbmcgZmFsc2UgY29uZGl0aW9uYWxzLCB0dXJuIGxpc3RpbmcKLQlvZmYgaW4gdGhlIGZhbHNlIGJyYW5jaCBvZiB0aGUgZWxzZS4KLQotTW9uIEF1ZyAgNCAxMToyODozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRml4IGhhbmRsaW5nIG9mIGEgZG91YmxlIGxvYWQgZnJvbSBhCi0Jc3ltYm9sIHBsdXMgYW4gb2Zmc2V0LgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogU2V0IGZNZXJnZSB0byAwIGZvciBhbiBGRFIgd2hpY2gKLQloYXMgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBzeW1ib2wuCi0KLVN1biBBdWcgIDMgMjM6MjM6NTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV91Y29ucyk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKG1kX3BzZXVkb190YWJsZSk6IEFkZCB1bmFsaWduZWQgZGF0YSBwc2V1ZG9zIGZvciBEV0FSRi4KLQotVGh1IEp1bCAzMSAxNToxMzo0MyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSWdub3JlIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50Ci0JbGluZSBpZiB3ZSBlbmNvdW50ZXIgYW4gZXJyb3IuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogU2lnbiBleHRlbmQgY29uc3RhbnRzIHZhbHVlCi0JZm9yIGhpIGFuZCBoaTAgZXhwcmVzc2lvbnMuCi0JKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBFbmFibGUgcmFuZ2UgY2hlY2tpbmcgZm9yIGdlbmVyaWMgMTZiaXQKLQlvcGVyYW5kcy4KLQotVHVlIEp1bCAyOSAxNDoyMDo0MyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogVHVybiBvbiBmeF9ub19vdmVyZmxvdyBmb3IKLQlMTzE2LCBISTE2IGFuZCBISTE2X1MgcmVsb2NzLgotCi1Nb24gSnVsIDI4IDE4OjQxOjQxIDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFVzZSBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNybyB0byBsb29rIGZvcgotICAgICAgICB3aW4zMiBkZXBlbmRlbmNpZXMuCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0gICAgICAgICogTWFrZWZpbGUuaW46IEFkZCAkKEVYRUVYVCkgdG8gYWxsIGV4ZWN1dGFibGVzLgotCi1GcmkgSnVsIDI1IDEwOjU0OjQzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBJbXByb3ZlIHdhcm5pbmdzIGZvciBvdXQgb2YgcmFuZ2UKLQl1bmNvbmRpdGlvbmFsIGJyYW5jaGVzLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IGFueXRoaW5nIHdpdGggYSBSUiUgb3IgTFIlCi0JZmllbGQgc2VsZWN0b3IuCi0KLVRodSBKdWwgMjQgMTU6MjE6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBDYXN0IHNwYXJjX29wY29kZXMgdG8gUFRSIGZvciBoYXNoX2luc2VydC4KLQotVGh1IEp1bCAyNCAxNzo1MToyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKGRlZmluZV9tYWNybyk6IE1ha2Ugc3VyZSB0aGUgaW5kZXggaXMgaW4gcmFuZ2UgYmVmb3JlCi0JY2hlY2tpbmcgZm9yICcoJy4KLQotVGh1IEp1bCAyNCAxMjoxMzoxOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBSZW1vdmUgImV4dGVuZGVkIiBhbmQgcmVwbGFjZSB3aXRoCi0gCSJmeCIgYW5kICJmeGZyYWciLiAgQWRkICJmZnJhZyIuICBDaGFuZ2UgY29kZSB0byBpbml0aWFsaXplIGFuZCB1c2UKLQl0aGUgcmlnaHQgZi9mZnJhZyBhbmQgZngvZnhmcmFnIHBhaXJzIHNpbmNlIGluc3RydWN0aW9uIG1heSBiZSBzcGxpdAotIAlhY3Jvc3MgZnJhZ3MuCi0KLVR1ZSBKdWwgMjIgMTg6Mzg6NTYgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBjb25maWcvdGUtZ28zMi5oIChVU0VfQUxJR05fUFRXTyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IElmIFVTRV9BTElHTl9QVFdPIGlzCi0JZGVmaW5lZCwgdXNlIHNfYWxpZ25fcHR3byBmb3IgLmFsaWduLgotCSogY29uZmlndXJlLmluIChpMzg2LSotbXNkb3NkamdwcCopOiBOZXcgdGFyZ2V0LgotCShpMzg2LSotZ28zMiopOiBTZXQgZW0gdG8gZ28zMiBhbmQgdGFyZyB0byBjb2ZmZ28zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEp1bCAyMiAxMjo0MTo0MCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobGFzdF9vcGNvZGUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtZF9hc3NlbWJsZSk6IERvbid0IGlzc3VlICJGUCBicmFuY2ggaW4gZGVsYXkgc2xvdCIgd2FybmluZyBpZgotCXRoZSBkZWxheSBzbG90IGhhcyBiZWVuIGFubnVsbGVkLgotCi1UdWUgSnVsIDIyIDEzOjI1OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBDaGVjayBmb3IgUEMgcmVsYXRpdmUgcmVsb2MKLQljb2RlIGlmIEJGRF9BU1NFTUJMRVIuCi0KLU1vbiBKdWwgMjEgMDg6NTc6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChzeXN0ZW1fcmVnaXN0ZXJzKTogRml4IG9yZGVyaW5nIG9mIHJlZ2lzdGVycy4KLQotVHVlIEp1bCAxNSAxNjoyOTo1NCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBJbml0aWFsaXplIGV4dGVuZGVkIHdvcmQgdG8gemVybwotCXdoZW4gaXQgd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIgYnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQotTW9uIEp1bCAxNCAyMzoxMDo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogUmVzdG9yZSBjaGVjayBvZiBmbXQgYXJndW1lbnQuCi0JKG1pcHNfaXApOiBGaXggSVNBIGNoZWNrcy4KLQotTW9uIEp1bCAxNCAxOTozMDo1NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBGaXggZW5kaWFubmVzcyBwcm9ibGVtIHdpdGgKLQlPX2JpZyBvcGVyYW5kcy4KLQotU3VuIEp1bCAxMyAyMDo0Mzo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGNoZWNrX2Fic29sdXRlX2V4cHIpOiBDaGFuZ2Ugd2FybmluZyB0bwotCWVycm9yLgotCi1GcmkgSnVsIDExIDEwOjE4OjQ3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBSZWZpbmUgY29kZSB0byBjaGVjayBpZiBhbgotCWluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSBvbiBhIHBhcnRpY3VsYXIgY3B1IHZhcmlhbnQuCi0JKG1pcHNfaXApOiBMaWtld2lzZS4KLQotTW9uIEp1bCAgNyAyMjo1MzowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBDaGFuZ2UgaWZuZGVmCi0JT0JKX0FPVVQgdG8gaWZkZWYgT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4Myk6IFdoZW4gbWFuZ2xpbmcgMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jIGZvcgotCUJGRF9BU1NFTUJMRVIsIGhhbmRsZSBvbmUgRUxGIGNhc2UgZm9yIENPRkYgYXMgd2VsbCwgYW5kIGFkZCBhIFBFCi0JY2FzZS4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2Ugc3BlY2lhbCBjYXNlIGZvciBpMzg2LWNvZmYgdG8KLSAJbm90IGFwcGx5IGZvciBpMzg2LXBlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IE9ubHkgY291bnQgZml4dXBzCi0Jd2hpY2ggd2VyZSBub3QgZG9uZS4KLQkoY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogUmVuYW1lIGZyb20gY29mZl9mcm9iX2ZpbGUuCi0JKGNvZmZfZm9ybWF0X29wcyk6IEluaXRpYWxpemUgZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBmaWVsZCByYXRoZXIKLQl0aGFuIGZyb2JfZmlsZSBmaWVsZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX2Zyb2JfZmlsZSk6IERvbid0IGRlY2xhcmUuCi0JKGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERlY2xhcmUuCi0JKG9ial9mcm9iX2ZpbGUpOiBEb24ndCBkZWZpbmUuCi0JKG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBTZXQgYmZkX2dhcyB0byB5ZXMgZm9yIGkzODYtKi1jeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEp1bCAgMiAxMjowNTowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTmV2ZXIgc3VidHJhY3Qgc2VjdGlvbgotCWFkZHJlc3MgZnJvbSBQQyByZWxhdGl2ZSByZWxvYyB3aGljaCB3aWxsIGJlIGZ1bGx5IHJlc29sdmVkLgotCi1UdWUgSnVsICAxIDE1OjIzOjA3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAocGFnZV90eXBlKTogUmVuYW1lZCBmcm9tIHBhZ2VfdCB0byBhdm9pZCBjb25mbGljdAotCXdpdGggaHB1eDEwIGhlYWRlciBmaWxlcy4KLQotTW9uIEp1biAzMCAxMjoyNzoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEphc29uIE1lcnJpbGwgPGphc29uQGN5Z251cy5jb20+OgotCSogcmVhZC5jIChkb19hbGlnbik6IElmIEJGRF9BU1NFTUJMRVIsIG9ubHkgdXNlIE5PUF9PUENPREUgaWYKLQlTRUNfQ09ERSBpcyBzZXQuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9tYXliZV90ZXh0KTogRGVmaW5lLgotCShtZF9kb19hbGlnbik6IFVzZSBtZF9tYXliZV90ZXh0LgotCi1GcmkgSnVuIDI3IDE5OjE1OjI3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogT25seSBjaGVjayBmb3IgR09UIHR5cGUKLQlyZWxvY2F0aW9ucywgZG9uJ3QgY2hlY2sgZm9yIHN5bWJvbCBiZWluZyBleHRlcm5hbCwgd2VhaywgZXRjLgotCi1Nb24gSnVuIDE2IDE5OjEyOjUxIDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBsZXQgdGhlIGFzc2VtYmxlcgotCWNhbGN1bGF0ZSByZWxvY2F0aW9ucyB0byBhbnkgZXh0ZXJuYWwgc3ltYm9sLCBiZWNhdXNlIHdlIG1pZ2h0IGJlCi0JbGlua2luZyBhIHNoYXJlZCBvYmplY3QgYW5kIHRoZSBzeW1ib2wgbWlnaHQgYmUgb3ZlcnJpZGVuIG9yIG1vdmVkCi0JKGZvciBpbnN0YW5jZSwgbW92ZWQgaW50byBhIHN0YXRpYyBleGVjdXRhYmxlJ3MgLmJzcyBzZWN0aW9uKS4KLQkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVsZXRlLiBUaGlzIGlzIGFuIGkzODYgd2llcmRuZXNzLgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogR09ULWJhc2VkIHJlbG9jYXRpb25zIGNhbid0Ci0JYmUgY2FsY3VsYXRlZCBieSB0aGUgYXNzZW1ibGVyLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgQHBsdCBvciBAbG9jYWwgYnJhbmNoCi0Jd2hvc2UgZGVzdGluYXRpb24gbGllcyBpbiB0aGUgc2FtZSBmaWxlLCBieSBpZ25vcmluZyB0aGUgQHBsdCBvcgotCUBsb2NhbCBhbmQgYWltaW5nIHRoZSBicmFuY2ggYXQgaXRzIGRlc3RpbmF0aW9uLgotCi1Nb24gSnVuIDE2IDEzOjU5OjE4IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIHN5bWJvbHMuYyAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IENvcHkgQlNGX09CSkVDVCBmbGFnLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBDb3B5IHNpemUKLQlleHByZXNzaW9uLgotCi0JKiBjb25maWcvb2JqLW11bHRpLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogRGVmaW5lIGluc3RlYWQKLQlvZiBvYmpfY29weV9zeW1ib2xfYXR0cmlidXRlcy4KLQotTW9uIEp1biAxNiAxMjo0NTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2luc2VydF9vcGVyYW5kKTogSW4gMzIgYml0IG1vZGUsIHdpdGggYQotCXNpZ25lZCBvcGVyYW5kLCBzaWduIGV4dGVuZCBhIDMyIGJpdCB2YWx1ZSB0byB0aGUgaG9zdCBzaXplLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZMQUdTKTogU3Vic2l0dXRlIGZyb20gY29uZmlndXJlIHNjcmlwdC4gIEZyb20KLQlKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBVc2UgYWxsb2NhIHJhdGhlciB0aGFuIGEgZml4ZWQKLQlidWZmZXIgc2l6ZSB0byBtYWtlIGEgY29weSBvZiB0aGUgc3ltYm9sLgotCi0JKiBNYWtlZmlsZS5pbiAoT0JKUyk6IFB1dCBAZXh0cmFfb2JqZWN0c0Agb24gdGhlIHNhbWUgbGluZSBhcwotCW1hY3JvLm8uCi0KLVRodSBKdW4gMTIgMTI6MTY6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEluIG5vbiBCRkRfQVNTRU1CTEVSIGNvZGUsIGFzIHdlCi0Jc3RlcCB0aHJvdWdoIHRoZSBmcmFncyBjYWxsaW5nIGN2dF9mcmFnX3RvX2ZpbGwsIHN3aXRjaCB0bwotCVNFR19EQVRBIHdoZW4gd2UgcmVhY2ggZGF0YV9mcmFnX3Jvb3QuCi0KLVR1ZSBKdW4gMTAgMTc6MDg6MzQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEFsbG93IGFuIGVtcHR5IHJlZ2lzdGVyCi0JbGlzdCBmb3IgaW5zdHJ1Y3Rpb25zIHdoaWNoIHVzZSByZWdpc3RlciBsaXN0cy4KLQotVHVlIEp1biAxMCAxMToxODowOSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBNYWtlIHRlbXAgdW5zaWduZWQgbG9uZy4KLQotCSogY29uZmlnL3RjLWFybS5jIChhcm1fYWRqdXN0X3N5bXRhYik6IE9ubHkgc2V0IHN0b3JhZ2UgY2xhc3NlcyBpZgotCU9CSl9DT0ZGLgotCi0JKiBjb25maWcvdGMtYXJtLmM6IEFkZCBwcm90b3R5cGVzIGZvciBtYW55IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHN0cnVjdCBhc21fb3Bjb2RlICk6IEFkZCBwcm90b3R5cGVzIGZvciBwYXJtcyBmaWVsZC4KLQkoc3RydWN0IHRodW1iX29wY29kZSApOiBMaWtld2lzZS4KLQkoZnBfb3AyKTogUmVtb3ZlIHVudXNlZCBmbGFncyBwYXJhbWV0ZXIuCi0JKG91dHB1dF9pbnN0KTogTWFrZSBzdGF0aWMuCi0JKGFybV9hZnRlcl9wYXNzX2hvb2spOiBSZW1vdmUgdW51c2VkIGlnbm9yZSBwYXJhbWV0ZXIuCi0JKiBjb25maWcvdGMtYXJtLmggKGFybV9hZnRlcl9wYXNzX2hvb2spOiBEZWNsYXJlLgotCShhcm1fc3RhcnRfbGluZV9ob29rKTogRGVjbGFyZS4KLQkoYXJtX2Zyb2JfbGFiZWwpOiBEZWNsYXJlLgotCi1Nb24gSnVuICA5IDEyOjU1OjQ1IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGRlcGVuZC5jICh3cmFwX291dHB1dCk6IG5ldyBwcm90b3R5cGUuCi0KLU1vbiBKdW4gIDkgMTI6NTI6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogQ2hlY2sgZm9yIG92ZXJmbG93LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zZWN0aW9uX2FsaWduKTogSWYgYS5vdXQgYW5kIEJGRCwgZm9yY2UKLQlzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4KLQotRnJpIEp1biAgNiAxNzoxNTo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5oIChtZF9jb25zX2FsaWduKTogRGVmaW5lLgotCShzaF9jb25zX2FsaWduKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgLnVhd29yZCBhbmQgLnVhbG9uZy4KLQkoc2hfbm9fYWxpZ25fY29ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfdWFjb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2hfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkoc2hfaGFuZGxlX2FsaWduKTogV2FybiBhYm91dCBtaXNhbGlnbmVkIGRhdGEuCi0JKiBkb2MvYy1zaC50ZXhpOiBEb2N1bWVudCAudWF3b3JkIGFuZCAudWFsb25nLgotCi1UaHUgSnVuICA1IDE1OjM4OjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kKTogSW4gTVJJIG1vZGUsIHRyZWF0IHNpbmdsZSBxdW90ZSBhcyBhCi0Jc2VwYXJhdG9yIGNoYXJhY3RlciB3aGVuIGNoZWNraW5nIGZvciBhIHBvc2l0aW9uYWwgYXJndW1lbnQuCi0KLVR1ZSBKdW4gIDMgMTY6MTU6MTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20KLQlhcm1ULTk3MDMyOC1icmFuY2guCi0KLQkqIGNvbmZpZy90Yy1hcm0uaDogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGFybVQtOTcwMzI4LWJyYW5jaC4KLQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIFRodW1iIGFyY2hpdGVjdHVyZSBzdXBwb3J0IGZyb20KLQlhcm1ULTk3MDMtMjgtYnJhbmNoLgotCi1Nb24gSnVuICAyIDE2OjI1OjA3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hbGwudGV4aTogQWRkIGVuYWJsaW5nIG9mIEFSTSBkb2N1bWVudGF0aW9uLgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIEFSTSBkb2N1bWVudGF0aW9uIGZyb20gYXJtVC05NzAzMjgtYnJhbmNoLgotCi1Nb24gSnVuICAyIDExOjU1OjEyIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBZGRlZCByMzkwMCBzdXBwb3J0LgotCi1UaHUgTWF5IDI5IDEyOjU4OjI2IDE5OTcgIEJlbiBQZmFmZiAgPHBmYWZmYmVuQHBpbG90Lm1zdS5lZHU+Ci0KLQkqIGFzLmM6IChwYXJzZV9hcmdzKSBgLXQnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudC4KLQotV2VkIE1heSAyOCAxNTo0NTowNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2JlZ2luKTogQ2hhbmdlIGNhbGwgdG8KLQljb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MoKSB0byBhIGNhbGwgdG8KLQliZmRfc2V0X3ByaXZhdGVfZmxhZ3MoKS4gCi0KLVdlZCBNYXkgMjggMTY6MTc6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2dlbl9yZWxvYyk6IERvbid0IHRyeSB0byBjb252ZXJ0IHRoZSB0eXBlCi0gCW9mIGEgQkZEX1JFTE9DX1JWQSByZWxvYy4KLQotV2VkIE1heSAyOCAxMDo0ODoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2ZpeF9hZGp1c3RhYmxlKTogUmVqZWN0IGFic29sdXRlIGNhbGxzL2p1bXBzLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBhIHJlbG9jYXRpb24gZm9yIGFuIGFic29sdXRlCi0JY2FsbC9qdW1wLgotCi1Nb24gTWF5IDI2IDEzOjI0OjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IERvbid0IHVzZSBAdmFsdWUgaW4gc2VjdGlvbiBuYW1lcyBvciBpbmRleAotCWVudHJpZXM7IGl0IGNvbmZ1c2VzIHRleGluZm8udGV4LgotCi1GcmkgTWF5IDIzIDAwOjA5OjM1IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IFVwZGF0ZWQgZm9yIC1NRCBvcHRpb24uCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkZWQgZGVwZW5kLmMuCi0JKE9CSlMpOiBBZGRlZCBkZXBlbmQuby4KLQkqIGFzLmggKHN0YXJ0X2RlcGVuZGVuY2llcywgcmVnaXN0ZXJfZGVwZW5kZW5jeSwKLQlwcmludF9kZXBlbmRlbmNpZXMpOiBOZXcgZGVjbGFyYXRpb25zLgotCSogZGVwZW5kLmM6IE5ldyBmaWxlLgotCSogYXMuYyAocGFyc2VfYXJncyk6IEFkZGVkIC1NRCBvcHRpb24uCi0JKG1haW4pOiBDYWxsIHByaW50X2RlcGVuZGVuY2llcy4KLQkoc2hvd191c2FnZSk6IEFkZGVkIGhlbHAgZm9yIC1NRC4KLQkqIHJlYWQuYyAoc19hcHBfZmlsZSk6IENhbGwgcmVnaXN0ZXJfZGVwZW5kZW5jeS4KLQkoc19pbmNsdWRlKTogQ2FsbCByZWdpc3Rlcl9kZXBlbmRlbmN5IHdoZW4gZmlsZSBpcyBmb3VuZC4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCByZWdpc3Rlcl9kZXBlbmRlbmN5LgotCi1XZWQgTWF5IDIxIDE3OjM5OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHN5bWJvbF90b19jaGFycyk6IElmIFRFX1BFLCBkb24ndCBhZGQgdGhlCi0Jc2VjdGlvbiBhZGRyZXNzIHRvIHRoZSBzeW1ib2wgdmFsdWUuCi0KLVR1ZSBNYXkgMjAgMTE6MjM6MzEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkLG1pcHNfaXApOiBNb3ZlIHRoZSBJTlNOX0lTQSBmaWVsZAotCWludG8gdGhlIG5ldyBtZW1iZXJzaGlwIGZpZWxkLgotCi1UaHUgTWF5IDE1IDEwOjAwOjUzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBJZiBubyBjcHUgdHlwZSBpcyBzcGVjaWZpZWQgb24gdGhlCi0JY29tbWFuZCBsaW5lIHRoZW4gdGhlIEFSTTcgaXMgbm93IGNob3NlbiBieSBkZWZhdWx0IHdoZW4gc2V0dGluZwotCXRoZSBCRkQgbWFjaGluZSBhbmQgYXJjaGl0ZWN0dXJlLgotCi1XZWQgTWF5IDE0IDA5OjU0OjUzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZ2xvYmFsIHZhcmlhYmxlcyk6IEFkZGVkICd1c2VzX2FwY3NfMjYnIGZsYWcgdG8KLQlob2xkIEFQQ1Mgc2VsZWN0aW9uLgotICAJKG1kX2JlZ2luKTogQWRkZWQgY29kZSB0byBnZW5lcmF0ZSBmbGFncyB0byBiZSBzZXQgaW50byB0aGUgQ09GRgotCWhlYWRlciBhbmQgdGhlIGNhbGxzIHRvIHRoZSBCRkQgZnVuY3Rpb25zIHRvIGRvIHRoaXMuCi0gIAkobWRfcGFyc2Vfb3B0aW9uLCBtZF9zaG93X3VzYWdlKTogQWRkZWQgbmV3IGNvbW1hbmQgbGluZQotCW9wdGlvbnMgLW1hcGNzLTMyLCAtbWFwY3MtMjYsIC1tYXJtdjIsIC1tYXJtdjJhLCAtbWFybXYzLAotCS1tYXJtdjNtLCAtbWFybXY0LCAtbWFybXY0dC4gCi0KLQkqIHRjLWFybS5oIChMT0NBTF9MQUJFTCk6IFJlbW92ZWQgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBtYWNybwotCWFzIGl0IGlzIG5ldmVyIHVzZWQuCi0KLVR1ZSBNYXkgMTMgMjI6MjY6MTQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBQcmVmaXggdGVtcG9yYXJ5Ci0JbGFiZWwgbmFtZSB3aXRoICIuIi4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCi1UdWUgTWF5IDEzIDE0OjQ0OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc2V0X2F0KTogQ2hlY2sgZm9yIGJpZ251bS4KLQkoY2hlY2tfYWJzb2x1dGVfZXhwciwgbWFjcm8sIG1pcHMxNl9tYWNybyk6IExpa2V3aXNlLgotCi1UdWUgTWF5IDEzIDEwOjQ1OjU2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfYXBwbHlfZml4KTogQ2hlY2sgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMKLQlmb3Igb3ZlcmZsb3cvdW5kZXJmbG93LCBvbmx5IGluc2VydCBsb3dlciAxNSBiaXRzIGludG8gaW5zdHJ1Y3Rpb24uCi0KLU1vbiBNYXkgMTIgMTM6MzM6MDggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAocGkpOiBDaGVjayBmb3IgUmVnTU1YLgotCi1UaHUgTWF5ICA4IDExOjEwOjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChleHByKTogV2hlbiBzdWJ0cmFjdGluZyB2YWx1ZXMgaW4gdGhlIHNhbWUgZnJhZywKLQlzdWJ0cmFjdCBYX2FkZF9udW1iZXIgcmF0aGVyIHRoYW4gYWRkaW5nIGl0LgotCi1XZWQgTWF5ICA3IDE1OjM5OjQ4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogSnVzdCBwYXNzIE5VTEwgdG8KLSAJbWRfZG9fYWxpZ24sIG5vdCB0aGUgYWRkcmVzcyBvZiBhIGNoYXIgaG9sZGluZyBOT1BfT1BDT0RFLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEhhbmRsZSBjb25zdGFudHMgZm9yIE1fTElfRCBhbmQKLQlNX0xJX0RELgotCShtaXBzX2lwKTogRm9yICdGJywgJ0wnLCAnZicsIGFuZCAnbCcsIGdlbmVyYXRlIGEgY29uc3RhbnQgcmF0aGVyCi0JdGhhbiBhbiBhZGRyZXNzIGlmIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSBsb29rcyBzdWZmaWNpZW50bHkKLQlzaW1wbGUuCi0KLVR1ZSBNYXkgIDYgMTI6MTg6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9zZWN0aW9uX2FsaWduKTogSWYgYS5vdXQgYW5kIEJGRCwgZm9yY2UKLQlzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4KLQotTW9uIE1heSAgNSAxNzoxNjo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmQuYzogSW5jbHVkZSAibWFjcm8uaCIuCi0JKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSk6IEFkZCBtYWNyb19uZXN0IGZpZWxkLgotCShpbml0aWFsaXplX2NmcmFtZSk6IEluaXRpYWxpemUgbWFjcm9fbmVzdC4KLQkoY29uZF9maW5pc2hfY2hlY2spOiBBZGQgbmVzdCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvbmRfZXhpdF9tYWNybyk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKGNvbmRfZmluaXNoX2NoZWNrKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShjb25kX2V4aXRfbWFjcm8pOiBEZWNsYXJlLgotCSogaW5wdXQtc2NydWIuYyAobWFjcm9fbmVzdCk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBDYWxsIGNvbmRfZmluaXNoX2NoZWNrLgotCSogbWFjcm8uaCAobWFjcm9fbmVzdCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHNfbWV4aXQpOiBDYWxsIGNvbmRfZXhpdF9tYWNyby4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoUmVnTU1YKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAocGkpOiBDaGVjayBmb3IgYWxsIHJlZ2lzdGVyIHR5cGVzLgotCSh0eXBlX25hbWVzKTogQWRkIFJlZ01NWC4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgUmVnTU1YLgotCi1XZWQgQXByIDMwIDEyOjQ3OjAwIDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc2VjdGlvbl9zeW1ib2wpOiBDbGVhciB0aGUgTE9DQUwgYml0ICNpZmRlZgotCVRFX0RFTFRBLgotCi1UdWUgQXByIDI5IDIwOjIzOjEwIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IEFkZCBuZXcgcGFyYW1ldGVyCi0JYmVmb3JlX3JlbGF4aW5nLiAgVXNlIGl0IHdoZW4gdGVzdGluZyBlY29mZl9leHRlcm5fc2l6ZS4KLQkobG9hZF9hZGRyZXNzLCBtYWNybywgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBGaXggYWxsCi0JY2FsbGVycy4KLQotVHVlIEFwciAyOSAxOTo1NDozNiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCAic3Vic2VjdGlvbiIuCi0gCShvYmpfZWxmX3N1YnNlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1UdWUgQXByIDI5IDE5OjUyOjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfaGVhZGVyX2FwcGVuZCk6IERvbid0IHJlc2V0IHN0cmluZ19zaXplCi0JZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuCi0KLUZyaSBBcHIgMjUgMTQ6MTc6NDYgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEFkZCBpdGJsLXBhcnNlLmguCi0KLUZyaSBBcHIgMjUgMTI6MDM6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKFBvcnRpbmcgR0FTKTogQ29ycmVjdCBkb2N1bWVudGF0aW9uIGZvcgotCWN1cnJlbnQgY29uZmlndXJlIGhhbmRsaW5nIG9mIHRhcmctY3B1LmgsIGV0LiBhbC4KLQkoQ1BVIGJhY2tlbmQpOiBEb2N1bWVudCBsaXN0aW5nIG1hY3Jvcy4KLQotCSogbGlzdGluZy5jIChkYXRhX2J1ZmZlcik6IFNldCBzaXplIGJhc2VkIG9uIG90aGVyIGxpc3RpbmcgbWFjcm9zLAotCXJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyAxMDAuCi0JKGRhdGFfYnVmZmVyX3NpemUpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShjYWxjX2hleCk6IE1ha2UgZGF0YV9idWZmZXJfc2l6ZSBhIGxvY2FsIHZhcmlhYmxlLiAgRG9uJ3QgbGVhdmUKLQlhbnkgc2xvcCB3aGVuIGZpbGxpbmcgZGF0YV9idWZmZXIuCi0KLU1vbiBBcHIgMjEgMTU6MzM6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC5zZXQgYXV0b2V4dGVuZC4KLQotU2F0IEFwciAxOSAyMzowOToyNSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQHBldHJhLmFwcGxpLnNlPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1vcGVuYnNkKiwgbTY4ay0qLW9wZW5ic2QqLAotCW1pcHMtZGVjLW9wZW5ic2QqLCBwcGMtKi0qYnNkKiwgbnMzMmstcGM1MzItb3BlbmJzZCosCi0Jc3BhcmMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgQXByIDE5IDIyOjUyOjAzIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogSWYgVENfTUlQUywgc2V0IEJTRl9PQkpFQ1QKLQlmb3IgYWxsIHVuZGVmaW5lZCBzeW1ib2xzLgotCi1GcmkgQXByIDE4IDEzOjM3OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBIYW5kbGUgemVybyBsZW5ndGggY3NlY3RzCi0JY29ycmVjdGx5LgotCi1GcmkgQXByIDE4IDExOjUxOjM1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXByIDE3IDEzOjU5OjQ3IDE5OTcgIFBlciBGb2dlbHN0cm9tICA8cGVmb0BvcGVuYnNkLm9yZz4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXByIDE2IDEyOjMxOjI0IDE5OTcgIE1hcnRpbiBIdW50IDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogRml4IHBhcmFsbGVsIGNoZWNraW5nCi0JZm9yIGluc3RydWN0aW9ucyB1c2luZyBjb25kaXRpb25hbCBleGVjdXRpb24uCi0KLVR1ZSBBcHIgMTUgMTg6MTE6NDQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGluc25fdXNlc19yZWcpOiBDb3JyZWN0IHRlc3QgZm9yIGZwciBwYWlycy4KLQotVHVlIEFwciAxNSAxMzowNDo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzcmNyb290KTogUmVtb3ZlLgotIAkoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShhbGwsIGR2aSk6IERvbid0IHNldCBzcmNyb290LgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gYXMubmV3LCBnYXNwLm5ldywgYW5kIGluc3RhbGxkaXJzLiAgVXNlCi0JJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKLQkkKElOU1RBTExfWEZPUk0pIGFuZCAkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCSogZG9jL01ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KLQkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLQlkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcgJChJTlNUQUxMX1hGT1JNKSBhbmQKLQkkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsLWluZm8tYXMpOiBSdW4gbWtpbnN0YWxsZGlycy4KLQkoaW5zdGFsbC1pbmZvLWdhc3ApOiBMaWtld2lzZS4KLQotTW9uIEFwciAxNCAxMTo1OTowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IENoZWNrIGZvciBkaXZpc2lvbiBieSB6ZXJvLgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogTWFrZWZpbGUuaW46IEFsd2F5cyB1c2UgJChTSEVMTCkgd2hlbiBydW5uaW5nIG1vdmUtaWYtY2hhbmdlLgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEFwciAxMCAxNDo0MDowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fcGFyc2Vfb3BlcmFuZCk6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9wYXJzZV9vcGVyYW5kLgotCU5ldyBhcmd1bWVudCBgd2FudCcuICBVcGRhdGUgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHZhbHVlcy4KLQlJbml0aWFsaXplIGlmIENHRU5fUEFSU0VfT1BFUkFORF9JTklULgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYmVnaW4pOiBTZXQgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuLgotCShtZF9hc3NlbWJsZSk6IENhbGwgY2dlbl9hc21faW5pdF9wYXJzZS4KLQlVcGRhdGUgY2FsbCB0byBtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbiwgY2FsbCBhc19iYWQgaWYgYXNzZW1ibHkgZmFpbGVkLgotCi1XZWQgQXByICA5IDExOjQ5OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEhhbmRsZSAjai4KLQotVHVlIEFwciAgOCAxNjozNzo1NyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IENyZWF0ZSBmaXh1cCBhdCB0aGUKLQlyaWdodCBhZGRyZXNzIGZvciBjYWxsIGxhYmVsOjMyLHJlZ3MsaW1tLgotCi1Nb24gQXByICA3IDE0OjU4OjIyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2Vfc3RhcnQpOiBJZiBPQkpfRUxGLCB0aGVuIGFsd2F5cyByZXR1cm4KLQl6ZXJvLgotCSogY29uZmlnL3RjLWhwcGEuaCAodGNfZnJvYl9zeW1ib2wpOiBEb24ndCByZXNldCB0aGUgdmFsdWUgb2YgdGhlCi0Jc3ltYm9sIGZvciBPQkpfRUxGIGFueW1vcmUuCi0KLU1vbiBBcHIgIDcgMTA6NTQ6NTkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUgZGVwZW5kZW5jaWVzLgotIAkoVEFSR19DUFUpOiBOZXcgdmFyaWFibGUuCi0JKGNnZW4ubyk6IERlcGVuZCBvbiBjZ2VuLmgsICQoVEFSR19DUFUpLW9wYy5oLgotCSguZGVwMSk6IERlbGV0ZSBjcmVhdGluZyBvZiBjZ2VuLW9wYy5oLgotCSgudGNkZXApOiBQdXQgcHJvcGVyIGNvbnRlbnRzIGluIGNnZW4tb3BjLmguCi0JKiBjb25maWd1cmUuaW4gKG0zMnIpOiBEZWxldGUgc2V0dGluZyBvZiBleHRyYV9maWxlcywgZXh0cmFfbGlua3MuCi0JKEFDX09VVFBVVCk6IENyZWF0ZSBjZ2VuLW9wYy5oLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotU2F0IEFwciAgNSAxMzoxOToxMiAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgdG8gYnVpbGQgZ2FzcC5leGUuCi0KLUZyaSBBcHIgIDQgMTY6MTA6MDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAocmVsYXhfZnJhZyk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkqIHdyaXRlLmggKHJlbGF4X2ZyYWcpOiBBZGQgcHJvdG90eXBlIGZvci4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKG1kX2RvX2FsaWduKTogTmV3IGFyZyBgbWF4Jy4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQlVcGRhdGUgY2FsbHMgdG8gZnJhZ19hbGlnbiwgZnJhZ19hbGlnbl9wYXR0ZXJuLgotCShmaWxsX2luc24pOiBVcGRhdGUgY2FsbCB0byBtMzJyX2RvX2FsaWduLgotCShtMzJyX3Njb21tKTogVXBkYXRlIGNhbGwgdG8gZnJhZ19hbGlnbi4KLQotCSogY29uZmlnL3RjLW0zMnIuW2NoXTogTmV3IGZpbGVzLgotCSogY2dlbi5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDUFVfVFlQRVMpOiBBZGQgbTMyci4KLQkoVEFSR0VUX0NQVV9DRklMRVMpOiBBZGQgdGMtbTMyci5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCB0Yy1tMzJyLmguCi0JKERJU1RDTEVBTl9IRVJFKTogQWRkIGNnZW4tb3BjLmguCi0JKC5kZXAxLC50Y2RlcCk6IENyZWF0ZSBlbXB0eSBjZ2VuLW9wYy5oLgotCShjZ2VuLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCShkZXBlbmRlbmNpZXMpOiBSZWdlbmVyYXRlLgotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBOZXcgbWVtYmVyIGZyX3RhcmcuCi0JKGZyX3BjcmVsX2FkanVzdCxmcl9ic3IpOiBNb3ZlIGludG8gdW5pb24gZnJfdGFyZy5uczMyay4KLQkqIGNvbmYuaW4gKFVTSU5HX0NHRU4pOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUuaW4gKG0zMnItKi0qKTogQWRkIGVudHJ5IGZvci4KLQlBZGQgY2dlbi5vIHRvIGV4dHJhX29iamVjdHMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBmcmFncy5jIChmcmFnX3Zhcik6IGZyX3BjcmVsX2FkanVzdCByZW5hbWVkIHRvCi0JZnJfdGFyZy5uczMyay5wY3JlbF9hZGp1c3QuICBmcl9ic3IgcmVuYW1lZCB0byBmcl90YXJnLm5zMzJrLmJzci4KLQkoZnJhZ192YXJpYW50KTogTGlrZXdpc2UuCi0JKiB3cml0ZS5jIChyZWxheF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoKik6IExpa2V3aXNlLgotCi1GcmkgQXByICA0IDEzOjI2OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfRU9MX0lOX0lOU04pOiBDaGVjayBleHBsaWNpdGx5IGZvciAnIScsCi0JcmF0aGVyIHRoYW4gZm9yIGFueSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IElmIGhwcGFfcmVuX3JlbG9jX3R5cGUgZmFpbHMsCi0JY2FsbCBhYm9ydCAoaS5lLiwgYXNfYWJvcnQpIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBQcm90ZWN0IHVzZXMgb2YgU1RPX01JUFMxNiB3aXRoIGFuIGlmZGVmIG9mCi0JT0JKX0VMRiwgcmF0aGVyIHRoYW4gb2YgU19HRVRfT1RIRVIuCi0KLQkqIE1ha2VmaWxlLmluIChESVNUQ0xFQU5fSEVSRSk6IEFkZCBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuCi0KLVRodSBBcHIgIDMgMTM6MTY6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byAyLjguMS4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1XZWQgQXByICAyIDEyOjI0OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfbWFjcm8pOiBIYW5kbGUgTV9ETVVMIGFuZCBNX01VTC4KLQotVHVlIEFwciAgMSAxODoyOTo0NyAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRG9uJ3Qgc2V0IGludGVybG9ja3MgZm9yIDQxMDAuCi0KLVR1ZSBBcHIgIDEgMTY6MjQ6MjggMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy1nYXMuY29tOiBVcGRhdGUgdG8gaGFuZGxlIGJvdGggdmF4IGFuZCBhbHBoYS4KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIHRvIHVzZSBjb25maWctZ2FzLgotCSogY29uZi1hLWdhcy5jb206IFJlbW92ZSBmaWxlLgotCi1UdWUgQXByICAxIDE2OjA4OjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSB1bm5lY2Vzc2FyeSBpdGJsLXBhcnNlLmgsIGlidGwtcGFyc2UuYywgYW5kCi0JaXRibC1sZXguYyBkZXBlbmRlbmNpZXMuICBSZW1vdmUgcnVsZXMgZm9yIGl0YmwtbGV4Lm8sCi0JaXRibC1wYXJzZS5vLCBhbmQgaXRibC1vcHMubzsganVzdCB1c2UgdGhlIG5vcm1hbCAuYy5vIHJ1bGUuCi0KLVR1ZSBBcHIgIDEgMTE6MjU6NTYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChsaW5lX2NvbW1lbnRfY2hhcik6IE1ha2UgJyMnIHN0YXJ0IGNvbW1lbnRzCi0JYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAuUyBmaWxlcyB3aGVyZQotCWNwcCBsZWF2ZXMgdGhlIGZpbGVuYW1lIHRyYW5zaXRpb25zIGJlZ2lubmluZyB3aXRoICcjJy4KLQotVHVlIEFwciAgMSAwMDowNzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IE9ubHkgY29tcGlsZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgYW5kCi0JdGNfY29mZl9zaXplbWFjaGRlcCBpZiBPQkpfQ09GRi4KLQotTW9uIE1hciAzMSAyMzo1Mzo0NCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHJlZ2lzdGVyX25hbWUpOiBEZWNsYXJlLgotCi1Nb24gTWFyIDMxIDE2OjMxOjA0IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluIChocHBhKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMxIDE0OjE1OjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19wc2V1ZG9fdGFibGUpOiBBZGQgInN0YWJuIi4KLQkobWlwczE2X21hcmtfbGFiZWxzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXBwZW5kX2luc24pOiBDYWxsIG1pcHMxNl9tYXJrX2xhYmVscy4KLQkobWlwc19lbWl0X2RlbGF5cyk6IExpa2V3aXNlLgotCShzX2luc24pOiBMaWtld2lzZS4gIERvbid0IGNhbGwgbWlwc19jbGVhcl9pbnNuX2xhYmVscy4KLQkoc19taXBzX3N0YWIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBFTEYgZm9yIG1pcHMtKi1nbnUqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMxIDE0OjAxOjQwIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBTZXQgdG8gImNvZmYtbTY4ay1zeXN2IiBpZgotCVRFX0RFTFRBLgotCi1GcmkgTWFyIDI4IDE4OjAzOjE5IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3IgY29tbW9uYmZkbGliLiAgSWYgaXQgaXMgc2V0LAotCXNldCBPUENPREVTX0xJQiB0byBlbXB0eS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyOCAxNToyNToyNCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjLSotbGludXgqYW91dCosIHNwYXJjLSotbGludXgqKTogTmV3Ci0JdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyOCAxMzowODozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGl0YmwtcGFyc2UueSAoeXllcnJvcik6IE1ha2Ugc3RhdGljLiAgRGVjbGFyZS4KLQotCUZyb20gUmFsZiBCYWVjaGxlIDxyYWxmQGdudS5haS5taXQuZWR1PjoKLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVtdWxhdGlvbnMgZm9yIG1pcHMtKi1saW51eCotKi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc3RydWN0IG1pcHNfc2V0X29wdGlvbnMpOiBEZWZpbmUuCi0JKG1pcHNfb3B0cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHNfaXNhKTogUmVtb3ZlLiAgTm93IGEgZmllbGQgaW4gbWlwc19vcHRzLiAgQ2hhbmdlIGFsbAotCXJlZmVyZW5jZXMuCi0JKG1pcHMxNiwgbWlwczE2X2F1dG9leHRlbmQsIG1pcHNfd2Fybl9hYm91dF9tYWNyb3MpOiBMaWtld2lzZS4KLQkobWlwc19ub3Jlb3JkZXIsIG1pcHNfbm9tb3ZlLCBtaXBzX25vYXQsIG1pcHNfbm9ib3B0KTogTGlrZXdpc2UuCi0JKHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayk6IERlZmluZS4KLQkobWlwc19vcHRzX3N0YWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19taXBzc2V0KTogQWRkIHN1cHBvcnQgZm9yIC5zZXQgcHVzaCBhbmQgLnNldCBwb3AuCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC5zZXQgcHVzaCBhbmQgLnNldCBwb3AuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IERlY2xhcmUgaXQuCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2NoYW5nZV9zZWMpOiBDYWxsIGl0IGlmIE9CSl9FTEYuCi0KLVRodSBNYXIgMjcgMTI6MjM6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogVXBkYXRlIGNvcHlyaWdodCBkYXRlIGluIHZlcnNpb24gbWVzc2FnZS4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuLWhlcmUpOiBSZW1vdmUgZGVwZW5kZW5jeSBmaWxlcy4KLQotCSogcmVhZC5jIChzX2NvbW0pOiBDaGVjayBTX0lTX0NPTU1PTiBhcyB3ZWxsIGFzIFNfSVNfREVGSU5FRC4KLQkoc19tcmlfY29tbW9uKTogQ2hlY2sgU19JU19DT01NT04gdW5jb25kaXRpb25hbGx5LgotCSogc3ltYm9scy5jIChjb2xvbik6IENoZWNrIFNfSVNfQ09NTU9OIGFzIHdlbGwgYXMgU19JU19ERUZJTkVELgotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogTGlrZXdpc2UuCi0JKHBwY19wZV9jb21tKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IExpa2V3aXNlLiAgU2V0IHNlZ21lbnQgb2YKLQljb21tb24gc3ltYm9sIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBMaWtld2lzZS4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjcgMDA6Mjk6NDYgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBHZXQgdGhlIHJlbG9jcyByaWdodC4KLQotV2VkIE1hciAyNiAxMzozNToxNSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IE9ubHkgZGVmaW5lIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQotV2VkIE1hciAyNiAxMTozMjo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogSGFuZGxlIHZlcnkgbG9uZyBpbnB1dAotCWxpbmVzIGNvcnJlY3RseS4KLQotCSogbGlzdGluZy5jIChwcmludF9saW5lcyk6IEFkZCBsaW5lbm8gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKGxpc3RpbmdfbGlzdGluZyk6IE9ubHkgY2FsbCBjYWxjX2hleCBmb3IgdGhlIHJpZ2h0IGxpbmUuCi0JKGxpc3RpbmdfbGlzdCk6IFNldCB0aGUgbmV3IGVkaWN0IGJhc2VkIG9uIHRoZSBjdXJyZW50IGVkaWN0LCBpbgotCW9yZGVyIHRvIGhhbmRsZSBsaXN0aW5nIGNvbW1hbmRzIGluIG1hY3JvcyBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGluc25fdXNlc19yZWcpOiBNYXAgcmVnaXN0ZXIgbnVtYmVycyBpbiBtaXBzMTYKLQlpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmQuYyAoY29uZF9maW5pc2hfY2hlY2spOiBOZXcgZnVuY3Rpb24uCi0JKiBhcy5oIChjb25kX2ZpbmlzaF9jaGVjayk6IERlY2xhcmUuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBjb25kX2ZpbmlzaF9jaGVjay4KLQotVHVlIE1hciAyNSAxNDo0NTo1NCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBJZiB0d28gaW5zdHJ1Y3Rpb25zCi0JYXJlIHN1cHBvc2VkIHRvIGJlIGFzc2VtYmxlZCBpbiBwYXJhbGxlbCBhbmQgdGhlIGZpcnN0IG9uZSBpcwotCWxvbmcsIHByaW50IGFuIGVycm9yIGFuZCBzdG9wLgotCShtZF9hcHBseV9maXgzKTogRG9uJ3QgY2FsY3VsYXRlIGFic29sdXRlIHJlbG9jcy4gIEp1c3Qgd3JpdGUKLQl0aGVtIG91dC4KLQotTW9uIE1hciAyNCAxMjoxMToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGljbHJLbHVkZ2UpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBpY2xyS2x1ZGdlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAodGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWZpbmUgaWYKLQlPQkpfRUNPRkYuCi0JKGFscGhhX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVjbGFyZSBpZiBPQkpfRUNPRkYuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZGVidWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgYWxwaGFfZGVidWcgaWYgLWcgaXMgc2Vlbi4KLSAJKGFscGhhX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogTmV3IGZ1bmN0aW9uIGlmIE9CSl9FQ09GRi4KLQotU3VuIE1hciAyMyAxODowMzozMSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEVuYWJsZSByYW5nZS1jaGVja2luZyBjb2RlLgotCShwb3N0Zml4KTogU3RvcCBhdCBzcGFjZSBvciBjb21tYS4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZS4KLQotU2F0IE1hciAyMiAxMzo0NDoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBhdXRvbWF0aWMgZGVwZW5kZW5jeSBidWlsZGluZy4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi1GcmkgTWFyIDIxIDE1OjQyOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1pZWVlLmMgKHNlZ21lbnRfbmFtZSk6IERvbid0IGRlZmluZSBmdW5jdGlvbiBpZiB0aGlzCi0JaXMgYSBtYWNyby4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWg4MzAwLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLXc2NS5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy16OGsuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDYWxsIG9ial9mcm9iX2xhYmVsIGlmIGl0IGlzIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLXZtcy5oIChvYmpfZnJvYl9sYWJlbCk6IFJlbmFtZSBmcm9tIHRjX2Zyb2JfbGFiZWwuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IGZpbGVzIGFuZCBsaW5rcy4gIERvbid0IGNhbGwKLQlBQ19MSU5LX0ZJTEVTLiAgU3Vic3RpdHV0ZSB0ZV9maWxlLiAgQ3JlYXRlIHRhcmctY3B1LmgsCi0Jb2JqLWZvcm1hdC5oLCB0YXJnLWVudi5oLCBhbmQgaXRibC1jcHUuaCBpbiBBQ19PVVRQVVQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfQyk6IE5ldyB2YXJpYWJsZS4KLQkoVEFSR19DUFVfTywgVEFSR19DUFVfSCk6IE5ldyB2YXJpYWJsZXMuCi0JKE9CSl9GT1JNQVRfQywgT0JKX0ZPUk1BVF9PLCBPQkpfRk9STUFUX0gpOiBOZXcgdmFyaWFibGVzLgotCShUQVJHX0VOVl9ILCBBVE9GX1RBUkdfQywgQVRPRl9UQVJHX08pOiBOZXcgdmFyaWFibGVzLgotCShTT1VSQ0VTKTogUmVuYW1lIGZyb20gUkVBTF9TT1VSQ0VTLiAgRGVsZXRlIG9sZCBkZWZpbml0aW9uLgotCShMSU5LRURfU09VUkNFUyk6IFJlbW92ZS4KLQkoSEVBREVSUyk6IFJlbmFtZSBmcm9tIFJFQUxfSEVBREVSUy4gIERlbGV0ZSBvbGQgZGVmaW5pdGlvbi4KLQkoTElOS0VEX0hFQURFUlMpOiBSZW1vdmUuCi0JKE9CSlMpOiBVc2UgJChUQVJHX0NQVV9PKSwgZXRjLiwgcmF0aGVyIHRoYW4gdGFyZy1jcHUubywgZXRjLgotCSgkKE9CSlMpKTogRGVwZW5kIHVwb24gJChUQVJHX0VOVl9IKSwgZXRjLiwgcmF0aGVyIHRoYW4KLQl0YXJnLWNwdS5oLCBldGMuCi0JKCQoVEFSR19DUFVfTyksICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSk6IE5ldyB0YXJnZXRzLgotCSh0YXJnLWNwdS5vLCBvYmotZm9ybWF0Lm8sIGF0b2YtdGFyZy5vKTogUmVtb3ZlIHRhcmdldHMuCi0JKGl0YmwtY3B1LmgpOiBSZW1vdmUgdGFyZ2V0LgotCShESVNUQ0xFQU5fSEVSRSk6IFJlbW92ZSB0YXJnLWNwdS5jLCBvYmotZm9ybWF0LmMsIGF0b2YtdGFyZy5jLAotCWF0b2YtdGFyZy5oLgotCi1UaHUgTWFyIDIwIDE5OjE4OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKFN5bWJvbCBOYW1lcyk6IERvbid0IHVzZSBvYnNvbGV0ZSBAY3RybCBtYWNyby4KLQotVGh1IE1hciAyMCAxNjo0OToxNCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobXJpX2NoaXApOiBSZXBsYWNlIGNhbGxzIHRvIGdldF9zeW1ib2xfZW5kIGJ5Ci0Jb3BlbiBjb2RlZCBsb29wIHRoYXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgbmFtZSB0byBzdGFydCB3aXRoIGEKLQluYW1lIGJlZ2lubmVyLgotCi1UaHUgTWFyIDIwIDEzOjQyOjAxIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBmcmFncy5jIChmcmFnX3Zhcik6IENoYW5nZSBvZmZzZXQgcGFyYW1ldGVyIHRvIG9mZnNldFQuCi0JKGZyYWdfdmFyaWFudCk6IExpa2V3aXNlLgotCSogZnJhZ3MuaCAoZnJhZ192YXJpYW50LCBmcmFnX3Zhcik6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19pdCk6IENoYW5nZSBmb2ZmIGZpZWxkIHRvCi0Jb2Zmc2V0VC4KLQkoYWRkX2ZyYWcpOiBDaGFuZ2Ugb2ZmIHBhcmFtZXRlciB0byBvZmZzZXRULgotCSogU2V2ZXJhbCBmaWxlczogQWRkIGNhc3RzIHRvIGNhbGxzIHRvIGZyYWdfdmFyLgotCi0JKiBNYWtlZmlsZS5pbiAobTY4ay1wYXJzZS5jKTogRGVwZW5kIHVwb24gaXRibC1wYXJzZS5jLCB0bwotCXNlcmlhbGl6ZSBhIHBhcmFsbGVsIG1ha2UuCi0JKGl0YmwtcGFyc2UuaCk6IFNwbGl0IHRhcmdldCBvdXQgZnJvbSBpdGJsLXBhcnNlLmMuCi0KLVRodSBNYXIgMjAgMTI6NDg6NDUgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAobW90b3JvbGFfb3BlcmFuZCk6IEFsbG93ICh6ZGlyZWcsRVhQUikuCi0KLQkqIGNvbmZpZy90ZS1kZWx0YS5oIChDT0ZGX0NPTU1PTl9BRERFTkQpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IENoZWNrIENPRkZfQ09NTU9OX0FEREVORCB3aGVuCi0Jc3RvcmluZyB0aGUgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sLgotCi1XZWQgTWFyIDE5IDExOjM3OjU3IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChnbHVlX3N5bWJvbHMpOiBVbnVzZWQgdmFyaWFibGUgc3ltYm9sUAotCXJlbW92ZWQuCi0JKGNyYXdsX3N5bWJvbHMpOiBEbyBub3QgbW9kaWZ5IHN5bWJvbF9yb290UCBhbmQgc3ltYm9sX2xhc3RQIGhlcmU7Ci0JdGhhdCBpcyBkb25lIGJ5IHN5bWJvbF9yZW1vdmUgYW5kIHN5bWJvbF9pbnNlcnQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0xPQ0FMKTogUmV0dXJuIDAgZm9yIGEgZGVidWdnaW5nCi0Jc3ltYm9sLgotCi1XZWQgTWFyIDE5IDExOjA2OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IEluIDMyIGJpdCBtb2RlLCB3aGVuIG5vdAotCWRlYWxpbmcgd2l0aCBhIDY0IGJpdCBudW1iZXIsIHBlcm1pdCB0aGUgdXBwZXIgMzIgYml0cyB0byBiZSBzZXQKLQlldmVuIGlmIGJpdCAzMSBpcyBub3Qgc2V0LgotCi1UdWUgTWFyIDE4IDIzOjMwOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJlcXVpdiIuCi0JKHNfc2V0KTogSGFuZGxlIC5lcXVpdiBiYXNlZCBvbiBhcmd1bWVudC4KLQkqIGRvYy9hcy50ZXhpbmZvIChFcXVpdik6IE5ldyBub2RlIHRvIGRvY3VtZW50IC5lcXVpdi4KLQkoRXJyKTogTmV3IG5vZGUgdG8gZG9jdW1lbnQgLmVyci4KLQotVHVlIE1hciAxOCAxNTo1MDoxMyAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogTWFueSBmaWxlczogQWRkIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiBhcy5jIChzaG93X3VzYWdlLCBwYXJzZV9hcmdzKTogTWFrZSBzdGF0aWMuCi0JKiBmcmFncy5oIChmcmFnX2FsbG9jKTogRGVjbGFyZS4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogRG9uJ3QgZGVjbGFyZSBmcmFnX2FsbG9jLgotCSogc3ltYm9scy5jIChkb2xsYXJfbGFiZWxfaW5zdGFuY2UpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gbG9uZy4KLQkqIHN5bWJvbHMuaCAocHJpbnRfc3ltYm9sX3ZhbHVlKTogRGVjbGFyZS4KLQkocHJpbnRfZXhwciwgcHJpbnRfZXhwcl8xLCBwcmludF9zeW1ib2xfdmFsdWVfMSk6IERlY2xhcmUuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IERvbid0IGRlY2xhcmUgbWFrZV9leHByX3N5bWJvbC4KLQkocmVtb3ZlX3N1YnNlZ3MsIHJlbGF4X2ZyYWcpOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChhdG9mX3ZheF9zaXplb2YpOiBDaGFuZ2UgbGV0dGVyIHRvIGludC4KLQkod2hhdF9raW5kX29mX2Zsb2F0KTogTGlrZXdpc2UuCi0JKGF0b2ZfdmF4KTogTWFrZSBzdGF0aWMuICBDaGFuZ2Ugd2hhdF9raW5kIHRvIGludC4KLQkobWRfYXRvZik6IENoYW5nZSB3aGF0X3N0YXRlbWVudF90eXBlIHRvIGludC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX2Vjb2ZmX3NldF9leHQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKHZheF9tZF9hdG9mKTogRGVjbGFyZS4KLQkobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlIGFuZCB2YXhfbWRfYXRvZi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNldF8xNmJpdF9jb2RlX2ZsYWcpOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAoYWRkX2ZpeCk6IENoYW5nZSB3aWR0aCB0byBpbnQuCi0JKGluc2VydF9yZWcpOiBDaGFuZ2UgcmVnbmFtZSB0byBjb25zdC4KLQkobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlLgotCShkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChjbXBfcmVnX2VudHJ5KTogQ2hhbmdlIGFyZ3MgdG8gY29uc3QgUFRSLgotCShwYXJzZV9rZXl3b3JkX2FyZyk6IENoYW5nZSBsb29rdXBfZm4gdG8gdGFrZSBjb25zdCBhcmcuCi0JKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oOiBBZGQgaWZkZWYgZm9yIG11bHRpcGxlIGluY2x1c2lvbi4KLQkodGNfYW91dF9wcmVfd3JpdGVfaG9vayk6IERvbid0IGRlY2xhcmUuCi0KLU1vbiBNYXIgMTcgMTE6MjE6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oIChiZmRfYWxsb2NfYnlfc2l6ZV90KTogRG9uJ3QgZGVjbGFyZS4KLQkqIE1hbnkgZmlsZXM6IFVzZSB4bWFsbG9jIHJhdGhlciB0aGFuIGJmZF9hbGxvY19ieV9zaXplX3QuCi0KLVN1biBNYXIgMTYgMTM6NDk6MjEgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBEb24ndCBjYWxsIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbi4KLQkoc3ltYm9sX2FwcGVuZCk6IFNldCBzeV9uZXh0IGFuZCBzeV9wcmV2aW91cyB3aGVuIGFkZGluZyBhIHNpbmdsZQotCXN5bWJvbCB0byBhbiBlbXB0eSBsaXN0LiAgQ2FsbCBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4uCi0JKHZlcmlmeV9zeW1ib2xfY2hhaW4pOiBVc2UgYXNzZXJ0LCBub3Qga25vdy4KLQotU2F0IE1hciAxNSAyMDoyNzoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTkVXUzogTm90ZSBCZU9TIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IChwcGMtKi1iZW9zKTogTmV3IHRhcmdldCwgdXNlIGNvZmYgYXMgb2JqZWN0IGZvcm1hdC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCQotU2F0IE1hciAxNSAxOToxNDowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZSBmb3Igb3V0Ci0Jb2YgcmFuZ2UgYnJhbmNoLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY2llcyBvbiBvYnN0YWNrLmggd2hlcmUgbmVlZGVkLgotCi1GcmkgTWFyIDE0IDE1OjMzOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBIYW5kbGUgdGhlCi0JY2FzZSBvZiBhIHN5bWJvbCBlcXVhdGVkIHRvIGFub3RoZXIgc3ltYm9sIHdoZW4gdXNpbmcgU1ZSNF9QSUMuCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9ERVBfc3BhcmMpOiBBZGQgb3Bjb2RlL3NwYXJjLmguCi0KLVRodSBNYXIgMTMgMTE6MjA6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhbGwgTElTVElOR19ORVdMSU5FIGJlZm9yZQotCUhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSB3aGVuIGhhbmRsaW5nIGFuIE1SSSBsaW5lIGxhYmVsLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2RhdGEpOiBDYWxsIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0JYW5kIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKG9ial9lbGZfdGV4dCwgb2JqX2VsZl9wcmV2aW91cyk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDEyIDExOjQwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1tdWx0aS5oIChzdHJ1Y3QgZWxmX29ial9zeSk6IERlZmluZSBpZgotCU9CSl9NQVlCRV9FTEYuCi0JKE9CSl9TWU1GSUVMRF9UWVBFKTogRGVmaW5lIGFzIHN0cnVjdCBlbGZfb2JqX3N5IGlmCi0JT0JKX01BWUJFX0VMRi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogRG9uJ3QgZGVmaW5lIGlmCi0JT0JKX1NZTUZJRUxEX1RZUEUgaXMgZGVmaW5lZC4KLQotCSogZG9jL2FzLnRleGluZm8gKGJzcyk6IEltcHJvdmUgZGVzY3JpcHRpb24gb2YgLmJzcyBzZWN0aW9uLiAgSW4KLQlFTEYgb3IgQ09GRiwgeW91IGFyZSBwZXJtaXR0ZWQgdG8gc3dpdGNoIGludG8gdGhlIHNlY3Rpb24uCi0JKENvbW0pOiBSZXdyaXRlIGRlc2NyaXB0aW9uIG9mIGNvbW1vbiBzeW1ib2xzLgotCShMY29tbSk6IE1lbnRpb24gdGhhdCBzb21lIHRhcmdldHMgcGVybWl0IGEgdGhpcmQgYXJndW1lbnQuCi0KLVR1ZSBNYXIgMTEgMDE6MTM6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfbGNvbW0pOiBEb24ndCBjYWxsIFNfQ0xFQVJfRVhURVJOQUwuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDaGFuZ2UgdHlwZSBvZiBsb2NhbCB0byBpbnQuICBGcm9tIEFsYW4gTW9kcmEKLQk8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+LgotCi0JKiBjb25maWcvdGMtbTg4ay5jIChtODhrX2RvX2FsaWduKTogRG9uJ3QgdXNlIGEgc3BlY2lhbCBub3AKLQlhbGlnbm1lbnQgaWYgYSB6ZXJvIGZpbGwgcGF0dGVybiB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChlcXVhbHMpOiBBbHdheXMgcGVybWl0IHJlZ2lzdGVyIG5hbWVzIHRvIGJlIHJlZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19maXhfYWRqdXN0YWJsZSk6IFBlcm1pdCBhIHJlbG9jIGFnYWluc3QgYQotCW1pcHMxNiBzeW1ib2wgdG8gYmUgYWRqdXN0ZWQgaWYgYSBzeW1ib2wgaXMgYmVpbmcgc3VidHJhY3RlZCBmcm9tCi0JaXQuCi0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N5bXZlcik6IENoZWNrIGZvciBkdXBsaWNhdGUgb3IKLQlpbGxlZ2FsIHN5bWJvbCB2ZXJzaW9uIG5hbWVzLgotCShlbGZfZnJvYl9zeW1ib2wpOiBDaGVjayBmb3IgZXh0ZXJuYWwgZGVmYXVsdCB2ZXJzaW9ucy4KLQotU3VuIE1hciAgOSAyMzo0OToxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBjb25maWcvb2JqLWVsZi5oIChzdHJ1Y3QgZWxmX29ial9zeSk6IERlZmluZS4KLQkoT0JKX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUgdG8gZWxmX29ial9zeSBzdHJ1Y3QuICBDaGFuZ2UgYWxsCi0JdXNlcnMuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N5bXZlcik6IEp1c3QgcmVjb3JkIHRoZSBuYW1lLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogSW5pdGlhbGl6ZWQgdmVyc2lvbmVkX25hbWUgZmllbGQuCi0JKGVsZl9mcm9iX3N5bWJvbCk6IElmIHRoZXJlIGlzIGEgdmVyc2lvbmVkX25hbWUsIGVpdGhlciByZW5hbWUgdGhlCi0Jc3ltYm9sLCBvciBhZGQgYW4gYWxpYXMgd2l0aCB0aGF0IG5hbWUuCi0KLVRodSBNYXIgIDYgMTM6NTU6MzIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9yZWxheF90YWJsZSk6IERlZmluZS4KLQkobWRfY29udmVydF9mcmFnKTogSW1wbGVtZW50LgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSByZWxheGFibGUgb3BlcmFuZHMvaW5zdHJ1Y3Rpb25zIGNvcnJlY3RseS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBJbXBsZW1lbnQuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IEZpeCB0eXBvcy4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCB1c2UgYW55IE1OMTAzMDAgc3BlY2lmaWMKLQlyZWxvY3MgYW55bW9yZS4gIFR3ZWFrIGZ4X29mZnNldCBmb3IgcGMtcmVsYXRpdmUgcmVsb2NzLgotCi1XZWQgTWFyICA1IDE1OjQ2OjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZC5jIChzX2lmYyk6IENhbGwgbXJpX2NvbW1lbnRfZmllbGQgYW5kIG1yaV9jb21tZW50X2VuZCB3aGVuCi0JaW4gTVJJIG1vZGUuCi0KLVR1ZSBNYXIgIDQgMTk6MzQ6MjEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNlY3QiIGFuZCAic2VjdGlvbiIKLQlwc2V1ZG8tb3BzLgotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX2JlZ2luKTogRGVjbGFyZSBleHRlcm5hbCB2YXJpYWJsZQotCWNvZmZfZmxhZ3MgYW5kIGluc2VydCBhbiBGX0FSMzJXUiBiaXQgaW50byBpdC4KLQotVHVlIE1hciAgNCAxMDowMTowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZXF1YWxzKTogQWRkIHJlYXNzaWduIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIHJlYWQuaCAoZXF1YWxzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1TYXQgTWFyICAxIDAxOjA0OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBEb24ndCBhc3N1bWUgdGhhdCB3ZQotCWNhbiByZWx5IG9uIHRoZSBmcmFnIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmcmFnIGlzCi0JZWFybGllciBvciBsYXRlci4KLQotRnJpIEZlYiAyOCAxNDo0MDowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmggKExPQ0FMX0xBQkVMKTogT25seSBkZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKFNfTE9DQUxfTkFNRSk6IExpa2V3aXNlLgotCShGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCSogc3ltYm9scy5jIChjb2xvbik6IENhbGwgYmZkX2lzX2xvY2FsX2xhYmVsLCBub3QgTE9DQUxfTEFCRUwsIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoU19JU19MT0NBTCk6IENhbGwgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUsIG5vdCBMT0NBTF9MQUJFTC4KLQkqIGNvbmZpZy90Yy0qLmg6IE9ubHkgZGVmaW5lIExPQ0FMX0xBQkVMIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCURvbid0IGRlZmluZSBGQUtFX0xBQkVMX05BTUUuCi0JKiBjb25maWcvdGUtaWM5NjAuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlZmluZS4KLQkobWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2xvY2FsX2xhYmVsKTogUmVtb3ZlLgotCi0JKiBjb25maWcvdGUtc2NvMzg2Lmg6IFJlbW92ZTsgbm90IHVzZWQuCi0KLVRodSBGZWIgMjcgMTU6Mzk6MTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MCAobWRfcHNldWRvX3RhYmxlKTogQWRkIGFsaWduIHBzZXVkbyBvcCB0byBkbwotCWJ5dGUgYWxpZ25tZW50IHJhdGhlciB0aGFuIHBvd2VyLW9mLXR3byBhbGlnbm1lbnQgdGhhdCBpcyB0aGUKLQlHQVMgZGVmYXVsdC4KLQotVGh1IEZlYiAyNyAxMzoyOTowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIGEgcmVsb2Mgd2lkdGggb2YgJ1cnLgotCi0JKiBnYXNwLmMgKGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSk6IENvcnJlY3QgbWlzc3BlbGxpbmcgaW4gZXJyb3IKLQltZXNzYWdlLCBhbmQgYWRkIG5ld2xpbmUuCi0JKHByb2Nlc3NfZmlsZSk6IERvbid0IHByb2Nlc3MgYXNzaWdubWVudHMgaW4gdGhlIGxhYmVsIGlmIHRoaXMgaXMKLQlhIGVxdSBvciBhc3NpZ24gcHNldWRvLW9wLgotCShwcm9jZXNzX3BzZXVkb19vcCk6IFN3YXAgZmlyc3QgYXJndW1lbnQgdG8gZG9fYXNzaWduIGZvciBLX0FTU0lHTgotCWFuZCBLX0VRVSwgdG8gbWF0Y2ggZG9jdW1lbnRhdGlvbi4KLQotVGh1IEZlYiAyNyAxMjowMDowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBBZGQgJ3InIHNlY3Rpb24gYXR0cmlidXRlCi0JdG8gZGVub3RlIHJlYWQtb25seSBkYXRhIHNlY3Rpb25zLgotCi1UaHUgRmViIDI3IDAwOjI2OjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBTZXQgQlNGX09CSkVDVCBpbiBmbGFncy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IExpa2V3aXNlLCBpZiBCRkRfQVNTRU1CTEVSLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBTaW1wbGlmeSAwYiBoYW5kbGluZy4gIERvbid0IHRyZWF0IDBiIGFzIGEKLQliaW5hcnkgbnVtYmVyIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnKycgb3IgJy0nLgotCi1XZWQgRmViIDI2IDIwOjQ3OjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoRkxUX0NIQVJTKTogQ2hhbmdlIGZyb20gImREIiB0byAiZkYiLgotCShmaW5kX29wY29kZSk6IE1hdGNoIG9wZXJhbmRzIHRoYXQgY2FuIGJlIGZsb2F0cy4KLQkoYnVpbGRfaW5zbik6IEhhbmRsZSBPX2JpZyAoZmxvYXQpIGV4cHJlc3Npb25zIGFuZCBidWlsZAotCWNvcnJlY3Qgb3Bjb2RlLgotCi1XZWQgRmViIDI2IDE4OjE5OjAwIDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQsIGFsc28gbWFrZSBlbXB0eQotCWVtdWxhdGlvbiBsaXN0IGZvciB0aGlzIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlLgotCSogdGMtbWlwcy5jIChFQ09GRl9MSVRUTEVfRk9STUFUKTogRGVmaW5lLgotCShtaXBzX3RhcmdldF9mb3JtYXQpOiBVc2UuCi0JKiB0ZS1sbmV3cy5oOiBOZXcgZmlsZS4KLQotV2VkIEZlYiAyNiAxNTozMzo0NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGZpbmRfb3Bjb2RlLCBidWlsZF9pbnNuKTogQ2hhbmdlcyB0byBtYXRjaAotCW9wZXJhbmRzIHdpdGggOm0gb3IgOnMgbW9kaWZpZXJzIGFuZCBnZW5lcmF0ZSB0aGUgcmlnaHQgb3Bjb2RlcwotCWZvciB0aGVtLgotCi1XZWQgRmViIDI2IDExOjU2OjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmgpOiBVc2UgJChCSVNPTikgYW5kCi0JJChCSVNPTkZMQUdTKSwgbm90ICQoWUFDQykgYW5kICQoWUFDQ0ZMQUdTKS4KLQotVHVlIEZlYiAyNSAyMjowMjoyMyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbnN0cmluZyk6IFVzZWxlc3MgbG9jYWwgZGVjbGFyYXRpb24gb2YKLQljcmFja19vcGVyYW5kIHJlbW92ZWQuCi0JKiBleHByLmggKGV4cHJlc3Npb25TKTogQ2hhbmdlZCB0eXBlIG9mIFhfb3AgZmllbGQgdG8gb3BlcmF0b3JUIGlmCi0JX19HTlVDX18uCi0KLVR1ZSBGZWIgMjUgMTM6MTc6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGkzODZjb2ZmIGFuZCBpMzg2ZWxmIHRvIGVtdWxhdGlvbiBsaXN0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogYXMuYyAoaTM4NmNvZmYsIGkzODZlbGYpOiBEZWNsYXJlLgotCSogb2JqLmggKGNvZmZfZm9ybWF0X29wcyk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoT0JKX0hFQURFUik6IERlZmluZS4KLQkoY29mZl9vYmpfc3ltYm9sX25ld19ob29rKTogUmVuYW1lIGZyb20gb2JqX3N5bWJvbF9uZXdfaG9vay4KLQkoY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rKTogUmVuYW1lIGZyb20gb2JqX3JlYWRfYmVnaW5faG9vay4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFkZCAidmVyc2lvbiIuCi0JKGNvZmZfcG9wX2luc2VydCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShub19mdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9mb3JtYXRfb3BzKTogTmV3IHZhcmlhYmxlLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayk6IERlY2xhcmUuCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWZpbmUuCi0JKGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayk6IERlY2xhcmUuCi0JKG9ial9yZWFkX2JlZ2luX2hvb2spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2X3RhcmdldF9mb3JtYXQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWkzODYuYzogQ2hlY2sgT0JKX01BWUJFX0VMRiBhcyB3ZWxsIGFzIE9CSl9FTEY7IGNoZWNrCi0JT1VUUFVUX0ZMQVZPUiB3aGVuIGFwcHJvcHJpYXRlLgotCShpMzg2X3RhcmdldF9mb3JtYXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5pbiAob2JqLWNvZmYubyk6IE5ldyB0YXJnZXQuCi0JKGUtaTM4NmNvZmYubywgZS1pMzg2ZWxmLm8pOiBOZXcgdGFyZ2V0cy4KLQotCUZyb20gU3RlcGhlbiBXaWxsaWFtcyA8c3RldmVAaWNhcnVzLmljYXJ1cy5jb20+OgotCSogY29uZmlnL3RjLWk5NjAuaCAoVENfU1lNRklFTERfVFlQRSk6IERlZmluZSBpZiBPQkpfQ09GRi4KLQkoX3RjX2dldF9iYWxfb2ZfY2FsbCk6IERvbid0IGRlY2xhcmUuCi0JKHRjX2dldF9iYWxfb2ZfY2FsbCk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIGRvbid0IGRlZmluZSBhcyBtYWNyby4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHRjX3NldF9iYWxfb2ZfY2FsbCk6IElmIE9CSl9DT0ZGLCBzdG9yZSBiYWxQCi0JaW4gc3lfdGMgZmllbGQsIG5vdCB4X2JhbG50cnkgZmllbGQuCi0JKHRjX2dldF9iYWxfb2ZfY2FsbCk6IFJlbmFtZSBmcm9tIF90Y19nZXRfYmFsX29mX2NhbGwuICBDaGFuZ2UKLQlyZXR1cm4gdHlwZSB0byBzeW1ib2xTICouICBJZiBPQkpfQ09GRiwgcmV0cmlldmUgdmFsdWUgZnJvbSBzeV90YwotCWZpZWxkLCBub3QgeF9iYWxudHJ5IGZpZWxkLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBQZXJtaXQgYSAubm90ZSBzZWN0aW9uIHRvCi0JaGF2ZSB0aGUgU0hGX0FMTE9DIGF0dHJpYnV0ZS4KLQotCSogTWFrZWZpbGUuaW4gKCQoT0JKUykpOiBEb24ndCBkZXBlbmQgdXBvbiAkKElUX0hEUlMpLgotCShUQVJHX0NQVV9ERVBfbWlwcyk6IERlcGVuZCB1cG9uICQoc3JjZGlyKS9pdGJsLW9wcy5oLgotCShpdGJsLWxleC5vKTogRGVwZW5kIHVwb24gaXRibC1wYXJzZS5oLgotCi0JKiBpdGJsLXBhcnNlLnkgKHl5ZXJyb3IpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gaW50LiAgQ2hhbmdlIHRvCi0JdXNlIG9sZCBzdHlsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KLQotCSogTWFrZWZpbGUuaW4gKGl0YmwtbGV4Lm8pOiBSZW1vdmUgLVdhbGwuCi0JKGl0YmwtcGFyc2Uubyk6IExpa2V3aXNlLgotCi0JKiBjb25kLmMgKHNfaWZkZWYpOiBJZiB3ZSBzaG91bGQgb21pdCBjb25kaXRpb25hbHMgZnJvbSBsaXN0aW5ncywKLQljYWxsIGxpc3RpbmdfbGlzdC4KLQkoc19pZiwgc19pZmMsIHNfZW5kaWYsIHNfZWxzZSwgc19pZmVxcyk6IExpa2V3aXNlLgotCSogbGlzdGluZy5jIChsaXN0X2luZm9fc3RydWN0KTogQWRkIEVESUNUX05PTElTVF9ORVhULgotCShsaXN0aW5nX2xpc3RpbmcpOiBIYW5kbGUgRURJQ1RfTk9MSVNUX05FWFQuCi0JKGxpc3RpbmdfbGlzdCk6IEFuIGFyZ3VtZW50IG9mIDIgbWVhbnMgRURJQ1RfTk9MSVNUX05FWFQuCi0JKiBsaXN0aW5nLmggKExJU1RJTkdfTk9DT05EKTogRGVmaW5lLgotCShMSVNUSU5HX1NLSVBfQ09ORCk6IERlZmluZS4KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIGMgYXMgYSBzdWJvcHRpb24gb2YgLWEuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgYyBhcyBhIHN1Ym9wdGlvbiBvZiAtYS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAtYWxjLgotCi1Nb24gRmViIDI0IDIzOjM0OjE0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIFJfQUJTIHR5cGUgZml4dXBzLgotCi1Nb24gRmViIDI0IDE4OjI3OjQzIDE5OTcgIEVyaWMgWW91bmdkYWxlICA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAuc3ltdmVyLgotCi1Nb24gRmViIDI0IDE1OjE5OjU3IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBDaGFuZ2UgcHJlX2RlZmluZWRfcmVnaXN0ZXJzIHRvIAotCWQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgYW5kIHJlZ19uYW1lX2NudCB0byBkMTB2X3JlZ19uYW1lX2NudC4KLQotTW9uIEZlYiAyNCAxMDo0MDo0NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQgc2VjdGlvbi4KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgZW50cnkgZm9yIGJzcywgd2hpY2ggdGFrZXMKLSAJYW4gYWRkaXRpb25hbCBhbGlnbm1lbnQgYXJndW1lbnQuCi0JKGZpbmRfb3Bjb2RlKTogQWxsb3cgT19zeW1ib2wgcmVsb2NzIGZvciBhbnkgMzIgYml0IGZpZWxkLCBub3QganVzdAotIAliYXNlIHJlbGF0aXZlIG9uZXMuCi0JKGJ1aWxkX2luc24pOiBIYW5kbGUgT19zeW1ib2wgcmVsb2NzIGZvciBhbnkgMzIgYml0IGZpZWxkLCBub3QganVzdAotIAliYXNlIHJlbGF0aXZlIG9uZXMuCi0KLU1vbiBGZWIgMjQgMDI6MjM6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIGRlcGVuZGFuY2llcyBvbiBpdGJsLWNwdS5oLgotCSogYXMuYzogRGVmaW5lIHN0dWJzIGZvciBpdGJsX3BhcnNlIGFuZCBpdGJsX2luaXQgaWYgSEFWRV9JVEJMX0NQVSAKLQlpcyBub3QgZGVmaW5lZC4KLQotTW9uIEZlYiAyNCAwMjowMzowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0Ymwtb3BzLmg6IEluY2x1ZGUgYXMuaC4KLQotTW9uIEZlYiAyNCAwMTowNDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGFzLmM6IFJlbW92ZSAtdCBvcHRpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogTW92ZSBpdGJsLWNwdS5oIHRvIG1pcHMgc3BlY2lmaWMgY29uZmlndXJlLgotCSogaXRibC1vcHMuaDogSW5jbHVkZSBpdGJsLWNwdS5oIG9ubHkgaWYgSEFWRV9JVEJMX0NQVSBpcyBkZWZpbmVkLgotCSogY29uZmlnL3RjLW1pcHMuaDogRGVmaW5lIEhBVkVfSVRCTF9DUFUuCi0KLVN1biBGZWIgMjMgMTg6MDE6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBpdGJsLW9wcy5jOiBEb24ndCBkZWZpbmUgREVCVUcuCi0KLVN1biBGZWIgMjMgMTc6NDk6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGl0YmwtdGVzdC5jIHRvIHJlZmxlY3QgaXRzIG5ldyBsb2NhdGlvbi4KLQotU3VuIEZlYiAyMyAxNTo1MDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0Ymwtb3BzLmM6IEFkZCB0ZXN0IGZvciBpdGJsX2hhdmVfZW50cmllcy4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlbW92ZSB0ZXN0IGZvciBpdGJsX2hhdmVfZW50cmllcy4KLQkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MgdG8gbWlwc19pbml0X2FmdGVyX2FyZ3MuCi0KLVN1biBGZWIgMjMgMTg6MTM6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogUmVtb3ZlIGl0YmwtcGFyc2UueSwgaXRibC1sZXgubCwgYW5kCi0JaXRibC1vcHMuYy4gIEFkZCBpdGJsLXBhcnNlLmMgYW5kIGl0YmwtbGV4LmMuCi0JKExFWCwgTEVYRkxBR1MpOiBEZWZpbmUuCi0JKiBpdGJsLW9wcy5jIChhcHBlbmRfaW5zbnNfYXNfbWFjcm9zKTogUmVtb3ZlIGJvZ3VzIEFTU0VSVC4KLQotU2F0IEZlYiAyMiAyMToyNTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0YmwtcGFyc2UueTogRml4IGluZGVudGF0aW9uIG1pc3Rha2VzIGZyb20gaW5kZW50IHByb2dyYW0uCi0JKiBpdGJsLWxleC5sOiBGaXggaW5kZW50YXRpb24gbWlzdGFrZXMgZnJvbSBpbmRlbnQgcHJvZ3JhbS4KLQkqIGl0Ymwtb3BzLmg6IEFkZCBpbmNsdWRlIGZvciBhbnNpZGVjbC5oLgotCUFkZCBQQVJBTVMgYXJvdW5kIGZ1bmN0aW9uIGFyZ3VtZW50cy4KLQlBZGQgZGVjbGFyYXRpb24gZm9yIGl0YmxfaGF2ZV9lbnRyaWVzLgotCSogaXRibC1vcHMuYzogQWRkIFBBUkFNUyBhcm91bmQgZnVuY3Rpb24gYXJndW1lbnRzLgotCSogTWFrZWZpbGUuaW46IEFkZCBpdGJsIGJ1aWxkIHJ1bGVzLgotCUFkZCBkZXBlbmRhbmNpZXMgZm9yIGl0YmwgZmlsZXMgdG8gbWlwcyB0YXJnZXQuCi0JKiBhcy5jOiBBZGQgaXRibCBzdXBwb3J0LgotCUFkZCBuZXcgb3B0aW9uICItLWluc3R0YmwiIGZvciBkeW5hbWljYWxseSBleHRlbmRpbmcgaW5zdHJ1Y3Rpb24gc2V0LgotCSogYXMuaDogRGVjbGFyZSBpbnN0dGJsX2ZpbGVfbmFtZTsKLQl0aGUgbmFtZSBvZiBmaWxlIGRlZmluaW5nIGV4dGVuc2lvbnMgdG8gdGhlIGJhc2ljIGluc3RydWN0aW9uIHNldCAKLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBBZGQgaXRibC1wYXJzZS5vLCBpdGJsLWxleC5vLCBhbmQgCi0JaXRibC1vcHMubyB0byBleHRyYV9vYmplY3RzIGZvciBtaXBzIGNvbmZpZ3VyYXRpb24uCi0JQWRkIGluY2x1ZGUgZmlsZSBsaW5rIGZyb20gaXRibC1jcHUuaCB0byAKLQljb25maWcvaXRibC0ke3RhcmdldF9jcHVfdHlwZX0uaC4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEFsbG93IGNvcHogaW5zdHJ1Y3Rpb25zLgotCUFkZCBub3RlcyBmb3IgZnV0dXJlIGFkZGl0aW9ucyB0byB0aGUgaXRibCBzdXBwb3J0LgotCUFkZCBkZWJ1ZyBtYWNyb3MuCi0JKG1hY3JvKTogQ2FsbCBpdGJsX2Fzc2VtYmxlIHRvIGFzc2VtYmxlIGl0YmwgaW5zdHJ1Y3Rpb25zLgotCVNlZSBpZiBhbiB1bmtub3duIHJlZ2lzdGVyIGlzIHNwZWNpZmllZCBpbiBhbiBpdGJsIGVudHJ5LgotCi1TYXQgRmViIDIyIDIwOjUzOjAxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IEZpeCB0eXBvIGluIG1kX3NlY3Rpb25fYWxpZ24KLQlkZXNjcmlwdGlvbi4KLQkqIGNvbmZpZy90Yy10aWM4MC5oIChORUVEX0ZYX1JfVFlQRSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChmaW5kX29wY29kZSk6IEFkZCBjb2RlIHRvIHN1cHBvcnQgT19zeW1ib2wKLQlvcGVyYW5kcy4KLQkoYnVpbGRfaW5zbik6IEdyYWIgYSBmcmFnIGVhcmx5IHNvIHdlIGNhbiB1c2UgdGhlIGFkZHJlc3MgaW4KLSAJZml4dXBzLiAgVGFrZSBvbmUncyBjb21wbGVtZW50IG9mIEJJVE5VTSB2YWx1ZXMgYmVmb3JlIGluc2VydGlvbgotIAlpbiBvcGNvZGUuICBBZGQgY29kZSB0byBzdXBwb3J0IE9fc3ltYm9sIG9wZXJhbmRzLgotCShtZF9hcHBseV9maXgpOiBSZXBsYWNlIHVuaW1wbGVtZW50ZWQgd2FybmluZyB3aXRoIGltcGxlbWVudGF0aW9uLgotCShtZF9wY3JlbF9mcm9tKTogRGl0dG8uCi0JKHRjX2NvZmZfZml4MnJ0eXBlKTogRGl0dG8uCi0KLUZyaSBGZWIgMjEgMTQ6MzQ6MzEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogTmV3IGZ1bmN0aW9uLiAKLQkqIGNvbmZpZy90Yy1kMzB2Lmg6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTi4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IFJldHVybiAwIGlmCi0gICAgICAgIHJlbG9jYXRpb24gaXMgaW4gZGlmZmVyZW50IHNlY3Rpb24uCi0KLUZyaSBGZWIgMjEgMTA6MDg6MjUgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiB0Yy1taXBzLmMgKG1pcHNfaXApOiBJZiBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCBFTEYgc3lzdGVtLAotCWRvbid0IHNldCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgdG8gMioqNC4KLQotRnJpIEZlYiAyMSAxMTo1NTowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCAnKicuCi0KLQkqIGFwcC5jIChMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzJORCk6IERvbid0IGRlZmluZS4KLQkoZG9fc2NydWJfYmVnaW4pOiBEb24ndCBzZXQgbGV4WycqJ10uCi0JKGRvX3NjcnViX2NoYXJzKTogV2hlbiBoYW5kbGluZyBMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVCwgZG9uJ3QKLSAJY2hlY2sgZm9yIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMk5ELiAgSW5zdGVhZCwganVzdCBjaGVjayBmb3IKLQlhIGxpdGVyYWwgJyonLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbT1zdnI0IGZvciBtNjhrLSotc3lzdjQqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLXN2cjQuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2NvbW1lbnRfY2hhcnMpOiBPbmx5IGluY2x1ZGUgYCMnIGlmCi0JVEVfU1ZSNCBvciBURV9ERUxUQS4KLQotVGh1IEZlYiAyMCAyMjoyNDozOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IENyZWF0ZSBhIGZpeHVwIGZvciB0aGUKLQlzaG9ydCBjb25kaXRpb25hbCBicmFuY2ggYXJvdW5kIGEgbG9uZyB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KLQotVGh1IEZlYiAyMCAxMzo1NjowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9sbiBbYm90aCB2ZXJzaW9uc10pOiBDYWxsCi0JbmV3X2xvZ2ljYWxfbGluZS4KLQotCSogY29uZmlnL3RjLWFybS5jIChmaXhfbmV3X2FybSk6IFVzZSBtYWtlX2V4cHJfc3ltYm9sIHRvIGhhbmRsZSBhCi0JY29tcGxleCBleHByZXNzaW9uLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSWYgYm90aCBsZWZ0IGFuZCByaWdodAotCW9wZXJhbmRzIGFyZSB1bmRlZmluZWQsIHdhcm4gYWJvdXQgYm90aCBvZiB0aGVtLgotCi1XZWQgRmViIDE5IDAwOjUzOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCAic3ltdmVyIi4KLQkob2JqX2VsZl9zeW12ZXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBDb3B5IHRoZSBzdF9vdGhlcgotCWZpZWxkLgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogTWFrZSB0eXBlIGFuZCBwcmludGYgZm9ybWF0IGFncmVlLgotCi0JKiByZWFkLmMgKGdldF9saW5lX3NiKTogRG9uJ3QgZW5kIHRoZSBsaW5lIG9uIGEgc2VtaWNvbG9uIGluc2lkZSBhCi0Jc3RyaW5nLgotCi1UdWUgRmViIDE4IDE4OjQyOjUxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jLCBjb25maWcvdGMtZDMwdi5oOiBOZXcgZmlsZXMuCi0KLSAJKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JCi0JKiBjb25maWd1cmUuaW46IEFkZCBjYXNlIGZvciBkMzB2LgotCi1TdW4gRmViIDE2IDE3OjQ3OjI5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAobWRfb3BlcmFuZCk6IERlZmluZSB3aXRoIGEgbnVsbCBleHBhbnNpb24sCi0JbGlrZSBhbGwgdGhlIG90aGVyIHRhcmdldHMuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogQWRkIG1pc3Npbmcgd29yZCBpbiAKLQltZF9mbHVzaF9wZW5kaW5nX291dHB1dCBkZXNjcmlwdGlvbi4gIEZpeCB0eXBvIGluIG1kX2NvbnZlcnRfZnJhZwotCWRlc2NyaXB0aW9uLgotCSogY29uZmlnL3RjLXRpYzgwOiBNaW5vciBjb21tZW50IGFkZGl0aW9ucy9jaGFuZ2VzLgotCQotRnJpIEZlYiAxNCAxODowOTo1OSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChMT0NBTF9MQUJFTCk6IE1hY3JvIHJlZGVmaW5lZCBpZiBURV9ERUxUQS4KLQkodGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKTogTWFjcm8gZGVmaW5lZCBpZiBURV9ERUxUQS4KLSAJKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGVmKTogVXNlCi0JdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIGlmIGRlZmluZWQuCi0JKG9ial9jb2ZmX3RhZywgb2JqX2NvZmZfdmFsKTogTGlrZXdpc2UuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBSZWplY3QgJ34nIGFzIG9wZXJhdG9yIGlmIGlzX25hbWVfYmVnaW5uZXIuCi0KLUZyaSBGZWIgMTQgMTc6MjQ6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gbm90ZXMgZnJvbSBQZXRlciBFcmlrc3NvbiA8cGV0ZXJAaWZtLmxpdS5zZT4uICBUaGUgdGFyZ2V0Ci0JZG9lcyBub3QgYWN0dWFsbHkgd29yaywgdGhvdWdoOgotCSogY29uZmlndXJlLmluIChpMzg2LXNlcXVlbnQtYnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGMtZHluaXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBEZWZpbmUgVEFSR0VUX0ZPUk1BVCBpZiBURV9EWU5JWC4KLQotCSogcmVhZC5jIChkb19hbGlnbik6IEFkZCBtYXggcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCVJlbW92ZSB1c2VsZXNzIHN0YXRpYyB2YXJpYWJsZXMuCi0JKHNfYWxpZ24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLiAgRG8gY29tbW9uIHBvcnRpb24gb2YKLQlzX2FsaWduX2J5dGVzIGFuZCBzX2FsaWduX3B0d28uCi0JKHNfYWxpZ25fYnl0ZXMsIHNfYWxpZ25fcHR3byk6IEp1c3QgY2FsbCBzX2FsaWduLgotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IEFkZCBtYXggcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShmcmFnX2FsaWduX3BhdHRlcm4pOiBMaWtld2lzZS4KLQkqIGZyYWdzLmggKGZyYWdfYWxpZ24sIGZyYWdfYWxpZ25fcGF0dGVybik6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogTGltaXQgYWxpZ25tZW50IGNoYW5nZSB0byBmcl9zdWJ0eXBlLgotCUZpeCBzb21lIHR5cGVzIHRvIGJlIGFkZHJlc3NULgotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1pZWVlLmMgKHNpemVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWQxMHYuaCAobWRfZG9fYWxpZ24pOiBBZGQgbWF4IHBhcmFtZXRlci4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGFzLmg6IEltcHJvdmUgY29tbWVudHMgb24gcnNfYWxpZ24gYW5kIHJzX2FsaWduX2NvZGUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgbmV3IGFsaWdubWVudCBhcmd1bWVudHMuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKEZyYWdzKTogRG9jdW1lbnQgdXNlIG9mIGZyX3N1YnR5cGUgZmllbGQgZm9yCi0JcnNfYWxpZ24gYW5kIHJzX2FsaWduX2NvZGUuCi0KLUZyaSBGZWIgMTQgMTU6NTY6MDYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IENoYW5nZWQgb3Bjb2RlIHBhcnNpbmcuCi0KLVRodSBGZWIgMTMgMjA6MDI6MTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy97dGMtYWxwaGEuaCwgdGMtZDEwdi5oLCB0Yy1nZW5lcmljLmgsIHRjLWk5NjAuaCwKLQl0Yy1tbjEwMjAwLmgsIHRjLW1uMTAzMDAuaCwgdGMtc2guaCwgdGMtdmF4LmgsIHRjLXc2NS5ofToKLQlBZGQgZGVmYXVsdCBkZWZpbml0aW9uIG9mIHplcm8gZm9yIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCSogY29uZmlnL3t0Yy1hcm0uaCwgdGMtaHBwYS5oLCB0Yy1pMzg2LmgsIHRjLW1pcHMuaCwgdGMtbnMzMmsuaCwKLSAJdGMtcHBjLmgsIHRjLXNwYXJjLmh9OiBNb3ZlIGRlZmluaXRpb24gb2YgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLQl0byBhIGxvY2F0aW9uIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGluY2x1ZGUgZmlsZXMuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSZW1vdmUgbWlzbGVhZGluZyBjb21tZW50LgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IEFkZCBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbgotCW1kX3VuZGVmaW5lZF9zeW1ib2wuCi0JKiBjb25maWcvdGMtdGljODAuYzogQWRkIGNvZGUgdG8gaW5zZXJ0IHByZWRlZmluZWQgc3ltYm9scyBpbnRvIHRoZQotCXN5bWJvbCB0YWJsZSBzbyB0aGV5IGNhbiBiZSBwYXJzZWQgYnkgdGhlIHN0YW5kYXJkIGV4cHJlc3Npb24gcGFyc2VyLgotCVJlbW92ZSBjdXN0b20gY29kZSB0aGF0IHVzZSB0byBwYXJzZSB0aGVtLgotCSogY29uZmlnL3RjLXRpYzgwLmg6IE1vdmUgZGVmaW5pdGlvbiBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotCXRvIGEgbG9jYXRpb24gY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB0YXJnZXQgaW5jbHVkZSBmaWxlcy4KLQkKLVRodSBGZWIgMTMgMjE6NDQ6MTggMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGFzLmg6IEdOVSBjIHByb3ZpZGVzIHVubGluaygpIGZ1bmN0aW9uLgotCi0JVW5pZnkgc2VjdGlvbiBoYW5kbGluZyBvbiBvcGVuVk1TL0FscGhhOgotCSogY29uZmlnL3RjLWFscGhhLmMoc19hbHBoYV9saW5rKTogUmVtb3ZlLgotCShzX2FscGhhX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JUmVtb3ZlIGNhc2UtaGFja2luZyBvZiBzeW1ib2xzCi0JQWRkIC5jb2RlX2FkZHJlc3MgcHNldWRvLW9wLgotCShCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIpOiBOZXcgcmVsb2NhdGlvbi4KLQkoc19hbHBoYV9jb2RlX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCi0JKGFscGhhX2N0b3JzX3NlY3Rpb24sIGFscGhhX2R0b3JzX3NlY3Rpb24pOiBOZXcgc2VjdGlvbnMgZm9yIEMrKwotCXN0YXRpYyBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuCi0JQWRkIGRlYnVnIGNvZGUgZm9yIGNyYXNoIGRlYnVncywgdG8gYmUgcmVtb3ZlZCB3aGVuIHRyYWNlYmFjayBjb2RlCi0JaXMgYWRkZWQgdG8gb2JqZWN0IGNvZGUuCi0JKHNfYWxwaGFfbmFtZSk6IE5ldyBmdW5jdGlvbiBmb3IgLm5hbWUgcHNldWRvLW9wLgotCShhbHBoYV9wcmludF90b2tlbik6IE5ldyBmdW5jdGlvbiB0byBwcmludCB0b2tlbiBleHByZXNzaW9ucyB3aXRoCi0JYWxwaGEgc3BlY2lmaWMgZXh0ZW5zaW9ucy4KLQotCSogbWFrZWZpbGUudm1zOiBBbGxvdyBjb21waWxhdGlvbiB3aXRoIGN1cnJlbnQgZ2NjIHNuYXBzaG90LgotCi1UaHUgRmViIDEzIDE2OjI5OjA0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKFRFWEkyRFZJKTogU2V0IHRvIGp1c3QgbmFtZSBvZiBwcm9ncmFtLgotCShEVklQUyk6IFNldCB0byBkdmlwcy4KLQkocHMsIGFzLnBzLCBnYXNwLnBzKTogTmV3IHRhcmdldHMuCi0JKGludGVybmFscy5pbmZvLCBnYXNwLmR2aSwgaW50ZXJuYWxzLmR2aSk6IFNldCBib3RoIFRFWElOUFVUUwotIAlhbmQgTUFLRUlORk8gZW52IHZhcmlhYmxlcy4KLQkoaW50ZXJuYWxzLnBzKTogVXNlIERWSVBTIG1hY3JvLgotCShjbGVhbik6IFJlbW92ZSBjb3JlIGFuZCBiYWNrdXAgZmlsZXMuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgZnJvbSBidWlsZGluZyBpbnRlcm5hbHMuCi0JKGNsZWFuLWR2aSk6IERpdHRvLgotCSogZG9jL2ludGVybmFscy50ZXhpIChGcmFncyk6IEZpeCB0eXBvLgotCShHQVMgcHJvY2Vzc2luZyk6IERpdHRvLgotCShDUFUgYmFja2VuZCk6IERpdHRvLgotCSogZWNvZmYuYyAoaW5pdF9maWxlKTogVXNlIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHZhbHVlIGRpcmVjdGx5LgotCSogbXB3LWNvbmZpZy5pbjogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGFzIDEuCi0JKiByZWFkLmM6IFJlbW92ZSB1Z2x5IGhhY2sgdGhhdCBkZWFsdCB3aXRoIGNvbmZpZyBmaWxlcyBub3QKLQljb3JyZWN0bHkgZGVmaW5pbmcgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0JKHRhcmdldF9iaWdfZW5kaWFuKTogVXNlIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGRpcmVjdGx5LgotCSogY29uZmlnL2FybS1iaWcubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAxLgotCSogY29uZmlnL2FybS1saXQubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAwLgotCSogY29uZmlnL21pcHMtYmlnLm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMS4KLQkqIGNvbmZpZy9taXBzLWxpdC5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDAuCi0JKiBjb25maWcvcHBjLWxpdC5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDEuCi0JKiBjb25maWcvcHBjLXNvbC5tdDogUmVwbGFjZSBUQVJHRVRfQllURVNfTElUVExFX0VORElBTgotCXdpdGggVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gZGVmaW5lZCB0byAwLgotCSogY29uZmlnL3RjLWFybS5oOiBSZW1vdmUgdXNlIG9mIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOCi0JYW5kIHNpbXBsaWZ5LiAgVGVzdCB2YWx1ZSBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTiwgbm90IGp1c3QKLQl3aGV0aGVyIGl0IGlzIGRlZmluZWQgb3Igbm90LgotCSogY29uZmlnL3RjLW1pcHMuaDogUmVtb3ZlIHVzZSBvZiBUQVJHRVRfQllURVNfTElUVExFX0VORElBTi4KLQkqIGNvbmZpZy90Yy1wcGMuaDogUmVtb3ZlIHVzZSBvZiBUQVJHRVRfQllURVNfTElUVExFX0VORElBTgotCWFuZCBzaW1wbGlmeS4gVGVzdCB2YWx1ZSBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTiwgbm90IGp1c3QKLQl3aGV0aGVyIGl0IGlzIGRlZmluZWQgb3Igbm90LgotCSogY29uZmlnL3RpYzgwLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgdG8gY29mZi10aWM4MC4KLQkoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUgdG8gMC4KLQotVGh1IEZlYiAxMyAxNDo0MDoxNiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBDb3JyZWN0IHRleHQgaW4gYXNfZmF0YWwgZXJyb3IgbWVzc2FnZSwKLQliZmRfcGVyZm9ybV9yZWxvY2F0aW9uIC0+IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uCi0KLVRodSBGZWIgMTMgMTQ6NDg6MDMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoTEVYX1RJTERFKTogRGVmaW5lIGlmIFRFX0RFTFRBLgotCSogcmVhZC5jIChMRVhfVElMREUpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGxleF90eXBlKTogVXNlIExFWF9USUxERS4KLQkqIGV4cHIuYyAoZ2V0X3N5bWJvbF9lbmQpOiBDaGVjayBmaXJzdCBjaGFyIHdpdGggaXNfbmFtZV9iZWdpbm5lciwKLQlub3QgaXNfcGFydF9vZl9uYW1lLgotCi1UaHUgRmViIDEzIDExOjQwOjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgbWlzc2luZyBiYWNrc2xhc2ggYXQgZW5kCi0Jb2YgY29udGludWVkIGxpbmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogQ29ycmVjdCBiYXNlIGFkZHJlc3MKLQlmb3IgYW4gZXh0ZW5kZWQgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChwcmV2X25vcF9mcmFnKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHJldl9ub3BfZnJhZ19ob2xkcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcmV2X25vcF9mcmFnX3NpbmNlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXBwZW5kX2luc24pOiBJZiB3ZSBhcmVuJ3QgcmVvcmRlcmluZywgYW5kIHByZXZfbm9wX2ZyYWcgaXMgbm90Ci0JTlVMTCwgYW5kIHdlIGRvbid0IG5lZWQgYW55IG5vcHMsIHRoZW4gZGVjcmVhc2UgdGhlIHNpemUgb2YKLQlwcmV2X25vcF9mcmFnLiAgRG9uJ3QgaW5zZXJ0IG5vcHMgYmVjYXVzZSBvZiBpbnN0cnVjdGlvbnMgaW4KLQlub3Jlb3JkZXIgc2VjdGlvbnMuICBSZW1lbWJlciB3aGV0aGVyIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbnMKLQl3aGVyZSBpbiBub3Jlb3JkZXIgc2VjdGlvbnMgZXZlbiB3aGVuIG5vdCByZW9yZGVyaW5nLgotCShtaXBzX25vX3ByZXZfaW5zbik6IEFkZCBwcmVzZXJ2ZXIgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBSZWZlciBwcmV2X25vcF9mcmFnIHZhcmlhYmxlcyB3aGVuIGFwcHJvcHJpYXRlLgotCShtaXBzX2VtaXRfZGVsYXlzKTogU2V0IHVwIHByZXZfbm9wX2ZyYWcuCi0JKHNfbWlwc3NldCk6IENsZWFyIHByZXZfbm9wX2ZyYWcgaWYgcmVvcmRlcmluZy4KLQotV2VkIEZlYiAxMiAxNDozNjoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogUmVtb3ZlIHVzZWxlc3MgY29kZSB3aGljaAotCWhhbmRsZWQgc3dhcHBpbmcgYSBtaXBzMTYganVtcCB3aXRoIGEgbWlwczE2IGluc3RydWN0aW9uIHdpdGggYQotCXJlbG9jLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBXaGVuIGRlYnVnZ2luZywgc2V0Ci0JbWlwc19vcHRpbWl6ZSB0byAxLCBub3QgMC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogSGFuZGxlIGFuIGV4dGVuZCBvcGVyYW5kLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChteV9nZXRFeHByZXNzaW9uKTogSW4gbWlwczE2IG1vZGUsIGlmIGl0IGxvb2tzCi0JbGlrZSB0aGUgZXhwcmVzc2lvbiB3YXMgYmFzZWQgb24gYC4nLCBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZQotCXN5bWJvbC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQgdG8gcHV0IGFuCi0gCWV4dGVuZGVkIGluc3RydWN0aW9uIGluIGEgZGVsYXkgc2xvdCB3aGVuIG5vdCByZW9yZGVyaW5nLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBXYXJuIGlmIGFuIGV4dGVuZGVkIGluc3RydWN0aW9uIGFwcGVhcnMgaW4gYQotCWRlbGF5IHNsb3QuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogQWRkICJpbnNuIi4KLQkoc19pbnNuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLmluc24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQWRkIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyB0byB0aGUKLQlzeW1ib2wgdGFibGUuCi0JKG1pcHMxNl9pcCk6IEZpcnN0IHBhcnNlIHRoZSBleHByZXNzaW9uLCBhbmQgdGhlbiBzZWUgd2hldGhlciBpdAotCWNhbWUgdXAgd2l0aCBhIHJlZ2lzdGVyLCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZmlyc3Qgc2VlIHdoZXRoZXIKLQl3ZSBhcmUgbG9va2luZyBhdCBhIHJlZ2lzdGVyLgotCi1UdWUgRmViIDExIDE1OjEzOjM5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYzogTnVtZXJvdXMgY2hhbmdlcyBhbmQgYWRkaXRpb25zIHRvIGZsZXNoCi0Jb3V0IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcHJldmlvdXNseSBqdXN0IHN0dWJzLCBhbmQgZml4IHNvbWUKLQlwcm9ibGVtcyBmb3VuZCB1c2luZyB0aGUgbmV3IFRJYzgwIHRlc3RzdWl0ZSBjYXNlcy4KLQotVHVlIEZlYiAxMSAxNTo1MjoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEhhbmRsZSAlZ3ByZWwgbW9kaWZpZXIuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IE91dHB1dCBqdW1wIGluc3RydWN0aW9uIGFzIGEKLQlwYWlyIG9mIDIgYnl0ZSBpbnN0cnVjdGlvbnMsIHJhdGhlciB0aGFuIGFzIGEgc2luZ2xlIDQgYnl0ZQotCWluc3RydWN0aW9uLgotCi1Nb24gRmViIDEwIDIyOjA2OjAwIDE5OTcgIERhd24gUGVyY2hpayAgKGRhd25AY3lnbnVzLmNvbSkKLQotCSogaXRibC1vcHMuYywgaXRibC1sZXgubCwgaXRibC1wYXJzZS55LCBpdGJsLW9wcy5oLAotCWNvbmZpZy9pdGJsLW1pcHMuaDogQWRkIGNvcHlyaWdodCBtZXNzYWdlIGFuZCBmaXggaW5kZW50YXRpb24uCi0KLU1vbiBGZWIgMTAgMTg6MDk6MDAgMTk5NyAgRGF3biBQZXJjaGlrICAoZGF3bkBjeWdudXMuY29tKQotCi0JKiBpdGJsLW9wcy5jOiBOZXcgZmlsZS4gIEFkZCBzdXBwb3J0IGZvciBkeW5hbWljYWxseSByZWFkIAotCWluc3RydWN0aW9uIHJlZ2lzdGVycywgb3Bjb2RlcyBhbmQgZm9ybWF0cy4gIEJ1aWxkIGludGVybmFsIHRhYmxlIAotCWZvciBuZXcgaW5zdHJ1Y3Rpb25zIGFuZCBwcm92aWRlIGNhbGxiYWNrcyBmb3IgYXNzZW1ibGVyIGFuZCAKLQlkaXNhc3NlbWJsZXIuCi0JKiBpdGJsLWxleC5sLCBpdGJsLXBhcnNlLnk6IExleCBhbmQgeWFjYyBwYXJzZXJzIGZvciBpbnN0cnVjdGlvbiAKLQlzcGVjIHRhYmxlLgotCSogaXRibC1vcHMuaDogTmV3IGZpbGUuICBIZWFkZXIgZmlsZSBmb3IgaXRibCBzdXBwb3J0LgotCSogY29uZmlnL2l0YmwtbWlwcy5oOiBOZXcgZmlsZS4gIE1pcHMgc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yCi0JaXRibCBzdXBwb3J0LgotCi1GcmkgRmViICA3IDA5OjUyOjM0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBJZiBhIGNvbnN0YW50IG9wZXJhbmQgd29uJ3QKLQlmaXQgaW50byB0aGUgY29uc3RhbnQgZmllbGQgb2YgYSByZWxheGFibGUgb3BlcmFuZCwgdGhlbiBpdCBkb2VzCi0Jbm90IG1hdGNoLgotCi1UaHUgRmViICA2IDIwOjA4OjEyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBUcmVhdAotCWEganNyIHRhcmdldCBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIGp1c3QgbGlrZSBhIGpzciB0bwotCWFuIHVuZGVmaW5lZCB0YXJnZXQuCi0KLVRodSBGZWIgIDYgMTY6NTI6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jYXRpb25zCi0JYWdhaW5zdCBhbnkgbWlwczE2IHN5bWJvbHMsIG5vdCBqdXN0IGV4dGVybmFsbHkgdmlzaWJsZSBvbmVzLgotCShtZF9hcHBseV9maXgpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotV2VkIEZlYiAgNSAxMToxMTowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEFjY2VwdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaW4KLQl0aGUgb3BlcmFuZCBvZiB0aGUgZXhpdCBpbnN0cnVjdGlvbi4KLQotVHVlIEZlYiAgNCAxNDoxMjozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJZiB3ZSBsZWF2ZSBhbiBlcXVhdGVkIHN5bWJvbAotCWFzIE9fc3ltYm9sLCBjb3B5IG92ZXIgdGhlIHNlZ21lbnQuCi0KLU1vbiBGZWIgIDMgMTI6MzU6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBJZiB3ZSBhcmVuJ3QgYWRqdXN0aW5nIHRoaXMKLQlmaXh1cCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbCwgYWRqdXN0IHRoZSB2YWx1ZQotCWFjY29yZGluZ2x5LgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogRG9uJ3QgY2hhbmdlIFhfYWRkX251bWJlciBmb3IKLQlhbiBlcXVhdGVkIHN5bWJvbC4KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEF2b2lkIGxvb3Bpbmcgb24gZXF1YXRlZCBzeW1ib2xzLgotCUFkanVzdCBmeF9vZmZzZXQgYnkgWF9hZGRfbnVtYmVyIGZvciBlYWNoIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogQXZvaWQgbG9vcGluZyBvbiBlcXVhdGVkCi0Jc3ltYm9scy4KLQkoZml4dXBfc2VnbWVudCk6IEFkZCBhIGxvb3AgdG8gdHJhY2sgZG93biBlcXVhdGVkIHN5bWJvbHMgYW5kCi0JYWRqdXN0IGZ4X29mZnNldCBhcHByb3ByaWF0ZWx5LgotCi1GcmkgSmFuIDMxIDE1OjIxOjAyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBBZGQgZW50cmllcyB0byBhbGxvdwotCWptcCAtPiBicmEgcmVsYXhpbmcuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEhhbmRsZSBqbXAtPmJyYSByZWxheGluZy4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgam1wLT5icmEgcmVsYXhpbmcuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0KLUZyaSBKYW4gMzEgMTM6MTU6MDUgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBBZGQgY29tbWVudHMgZXhwbGFpbmluZyB0aGUKLQlub3AgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgSmFuIDMxIDEwOjQ2OjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGVuZm9yY2VfYWxpZ25lZF9kYXRhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3BhcmNfY29uc19hbGlnbik6IERvbid0IGRvIGFueXRoaW5nIHVubGVzcyBlbmZvcmNlX2FsaWduZWRfZGF0YQotCWlzIHNldC4KLQkobWRfbG9uZ29wdHMpOiBBZGQgImVuZm9yY2UtYWxpZ25lZC1kYXRhIi4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLS1lbmZvcmNlLWFsaWduZWQtZGF0YS4KLQkqIGRvYy9jLXNwYXJjLnRleGkgKFNwYXJjLUFsaWduZWQtRGF0YSk6IE5ldyBub2RlOyBkb2N1bWVudAotCWVuZm9yY2UtYWxpZ25lZC1kYXRhLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IElmIE9CSl9YQ09GRiwgYWRkICJsb25nIiwKLSAJIndvcmQiLCBhbmQgInNob3J0Ii4KLQkocHBjX3hjb2ZmX2NvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogR2l2ZSBhbiBlcnJvciBpZiBhIC5zcGFjZSBzeW1ib2wgaXMKLQljb21tb24gb3IgdW5kZWZpbmVkLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IERvbid0IGhhbmRsZSBtcmlfcGVuZGluZ19hbGlnbiBpZgotCXRoZSBoYW5kbGVyIGlzIHNfZ2xvYmwgb3Igc19pZ25vcmUuCi0KLVRodSBKYW4gMzAgMTE6NDY6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAibnVtb3BzIi4KLQkqIGNvbmZpZy90Yy10aWM4MC5jOiBNYW55IGFkZGl0aW9ucyB0byBwcmV2aW91cyBwbGFjZWhvbGRlciBmaWxlLgotCSogY29uZmlnL3RjLXRpYzgwLmg6IERpdHRvLgotCi1UaHUgSmFuIDMwIDEyOjI4OjE4IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9hbGlnbl9jb2RlKTogSW1wcm92ZSB0aGUgbm9wIHBhdHRlcm5zLgotCi1UaHUgSmFuIDMwIDEyOjA4OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogQ2FsbCBtaXBzX2ZpeF9hZGp1c3RhYmxlLgotCShtaXBzX2ZpeF9hZGp1c3RhYmxlKTogRGVjbGFyZS4KLQotCUlkZWFzIGZyb20gU3Jpbml2YXMgQWRkYWdhcmxhIDxzcmluaXZhc0BjZG90ZC5lcm5ldC5pbj46Ci0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEFmdGVyIGRvaW5nIGFuIG1yaV9wZW5kaW5nX2FsaWduLAotCWFkanVzdCB0aGUgbGluZV9sYWJlbCBpZiB0aGVyZSBpcyBvbmUuCi0JKHNfc3BhY2UpOiBTZXQgbXJpX3BlbmRpbmdfYWxpZ24gaWYgYW4gb2RkIG51bWJlciBvZiBieXRlcyB3ZXJlCi0Jb3V0cHV0LgotCi1XZWQgSmFuIDI5IDE1OjMxOjEyIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5oIChtZF9kb19hbGlnbik6IEFkZCB0aGlzIGhvb2sgdG8gY2FsbAotCWQxMHZfY2xlYW51cCgpIHdoZW4gYSAiLmFsaWduIiBpcyBkZXRlY3RlZC4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBDb3JyZWN0bHkgY2FsY3VsYXRlCi0JYnJhbmNoIGRpc3BsYWNlbWVudCB3aGVuIC5hbGlnbnMgYXJlIHByZXNlbnQuCi0KLVdlZCBKYW4gMjkgMDk6NDI6MTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IERlZmluZS4KLQkobWRfY29udmVydF9mcmFnKTogSW1wbGVtZW50LgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSByZWxheGFibGUgb3BlcmFuZHMvaW5zdHJ1Y3Rpb25zIGNvcnJlY3RseS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBJbXBsZW1lbnQuCi0JKiBjb25maWcvdGMtbW4xMDIwMC5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRGVmaW5lLgotCi1UdWUgSmFuIDI4IDE1OjI3OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBHaXZlIGFuIGVycm9yIGZvciBqdW1wcyB0byBhCi0JbWlzYWxpZ25lZCBhZGRyZXNzLgotCShtZF9hcHBseV9maXgpOiBNYWtlIGEgYnJhbmNoIHRvIGFuIG9kZCBhZGRyZXNzIGFuIGVycm9yIHJhdGhlcgotCXRoYW4gYSB3YXJuaW5nLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9jb252ZXJ0X2ZyYWcpOiBJZiB0aGUgdXNlciBleHBsaWNpdGx5Ci0JcmVxdWVzdGVkIGFuIGV4dGVuZGVkIG9wY29kZSwgcGFzcyB3YXJuIGFzIHRydWUgdG8gbWlwczE2X2ltbWVkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBIYW5kbGUgYSBtaXNzaW5nIGV4cHJlc3Npb24gbGlrZQotCWFuIGV4cGxpY2l0IDAsIHNvIHRoYXQgZXhwbGljaXRseSBleHRlbmRlZCBpbnN0cnVjdGlvbnMgd29yawotCWNvcnJlY3RseS4KLQotTW9uIEphbiAyNyAxNzo0MToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBEb24ndCBnZW5lcmF0ZSBhIGxvY2FsIEVDT0ZGCi0Jc3ltYm9sIGZvciBhIGNvbW1vbiBzeW1ib2wuCi0KLVdlZCBKYW4gMjIgMTA6Mzk6MzkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCVBhdGNoIHByZXN1bWVkIHRvIGhhdmUgYmVlbiBjaGVja2VkIGluIGF3aGlsZSBhZ28gYnV0IHdhc24ndC4KLQlNb24gTm92IDI1IDEwOjQ1OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCSogd3JpdGUuYzogRGVsZXRlICJpZm5kZWYgbWRfcmVsYXhfZnJhZyIgYXJvdW5kIGlzX2RucmFuZ2UuCi0JKHJlbGF4X3NlZ21lbnQsIGNhc2UgcnNfb3JnKTogTW92ZSBjb2RlIGluc2lkZSBicmFjZXMuICBNb3ZlIGxvY2FscwotCXRhcmdldCxhZnRlciBpbnNpZGUgdG9vLgotCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50KTogR3V0cyBtb3ZlZCB0byAuLi4KLQkocmVsYXhfZnJhZyk6IE5ldyBmdW5jdGlvbi4KLQlDYWxsIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiBpZiBkZWZpbmVkLgotCi1Nb24gSmFuIDIwIDEwOjU2OjQ3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUmVqZWN0IHBjLXJlbGF0aXZlIGFkZHJlc3NlcyBmb3IgdGhlCi0gCSdwJyBvcGVyYW5kIHNwZWNpZmllci4KLQotTW9uIEphbiAyMCAxMDozOTozNiAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoSEFWRV9MT05HX0JSQU5DSCk6IE5ldyBtYWNybywgcmV0dXJucyB0cnVlIGZvcgotIAltNjhrIGZhbWlseSBjcHVzIHdoaWNoIHN1cHBvcnQgbG9uZyBicmFuY2ggYWRkcmVzc2luZyBtb2Rlcy4KLQkobTY4a19pcCwgbWRfY29udmVydF9mcmFnXzEsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LAotIAltZF9jcmVhdGVfbG9uZ19qdW1wKTogVXNlIGl0LgotCi1Nb24gSmFuIDIwIDEyOjQyOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEb24ndCBzZXQgU0VDX0FMTE9DIG9yIFNFQ19MT0FEIGZvcgotCXRoZSAucmVnaW5mbyBvciAuTUlQUy5vcHRpb25zIHNlY3Rpb24gaWYgY29uZmlndXJlZCBmb3IgYW4KLQllbWJlZGRlZCB0YXJnZXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRG9uJ3Qgc2V0IGludGVybG9ja3MgZm9yCi0JbWlwc180NjUwLgotCi1XZWQgSmFuIDE1IDEzOjUxOjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBNYWtlIHN1cmUgdGhlIHN5bWJvbCBlbmRzIHdpdGgKLQl3aGl0ZXNwYWNlIGJlZm9yZSBjaGVja2luZyB3aGV0aGVyIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnPScuCi0KLVR1ZSBKYW4gMTQgMTU6MDc6MjcgMTk5NyAgUm9iZXJ0IExpcGUgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNjb19pZCk6IE1vdmVkIGZyb20gaGVyZS4uLgotCSogY29uZmlnL29iai1lbGYuYyAoc2NvX2lkKTogLi4udG8gaGVyZS4gIEFkZGluZyB0aGUgaWRlbnRpZmllcgotCXJlYWxseSBpcyBhbiBTQ08gRUxGIHNwZWNpZmljIHRoaW5nLCBub3QganVzdCBhIFNDTyB4ODYgc3BlY2lmaWMKLQl0aGluZy4KLQotTW9uIEphbiAxMyAyMjo0MzowMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGljODAtKi0qKTogRG9uJ3QgcmVxdWlyZSAnY29mZicuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBKYW4gIDkgMDk6MDg6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IENoZWNrIGZvciBvdmVyZmxvdyBvZiBhIG5lZ2F0aXZlIHZhbHVlCi0JY29ycmVjdGx5LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IGxhYmVsX2xpbmUpOiBEZWZpbmUuCi0JKGxhYmVscywgY3VycmVudF9sYWJlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtZF9hc3NlbWJsZSk6IE1hcmsgY3VycmVudF9sYWJlbCBhcyB0ZXh0LCBhbmQgY2xlYXIgaXQuCi0JKG02OGtfZnJvYl9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkobTY4a19mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBmdW5jdGlvbi4KLQkobTY4a19mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVmaW5lLgotCSh0Y19mcm9iX3N5bWJvbCk6IERvbid0IHdhcm4sIGp1c3QgY2FsbCBtNjhrX2Zyb2Jfc3ltYm9sLgotCSh0Y19mcm9iX2NvZmZfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogV2hlbiBkZWZpbmluZyBhIG1hY3JvIGluIE1SSSBtb2RlLAotCWRvbid0IGFkZCB0aGUgc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuCi0KLVR1ZSBKYW4gIDcgMTE6MjE6NDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jICh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgc3ltMS1zeW0yIGZpeHVwcwotCWhlcmUgc2luY2UgZml4dXBfc2VnbWVudCBkb2Vzbid0IChsaW5rcmVsYXggaXMgc2V0KS4KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1Nb24gSmFuICA2IDE1OjE5OjMyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBUd2VhayBmeF9vZmZzZXQgZm9yIHBjLXJlbGF0aXZlCi0JcmVsb2NzLgotCi1GcmkgSmFuICAzIDE2OjQ3OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCk6IFR3ZWFrIGZ4X3JfZmllbGQncyB0eXBlCi0JdG8gYXZvaWQgd2FybmluZ3Mgd2l0aCB0aGUgbmF0aXZlIEhQIGNvbXBpbGVyLgotCShmaXhfbmV3X2hwcGEpOiBTaW1pbGFybHkgZm9yIHRoZSByX3R5cGUgYXJndW1lbnQuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSwgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24pOiBFbmNsb3NlCi0JaW4gYW4gI2lmIE9CSl9FTEYgdG8ga2VlcCBnY2MgLVdhbGwgcXVpZXQuCi0JKG1kX2FwcGx5X2ZpeCk6IEFsd2F5cyBpbml0aWFsaXplICJyZXN1bHQiLgotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IEdlbmVyYXRlIHJlbG9jYXRpb25zLgotCi1GcmkgSmFuICAzIDE4OjE3OjIzIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2V2ZW4pOiBBZGp1c3QgdGhlIGFsaWdubWVudCBvZiB0aGUgY3VycmVudAotCXNlY3Rpb24uCi0KLUZyaSBKYW4gIDMgMTc6MTA6MzMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9maWxlX3N5bWJvbCk6IFdoZW4gdXNpbmcgRUNPRkYgZGVidWdnaW5nLAotCXBhc3Mgb24gdGhlIG5ldyBmaWxlIGhvb2suCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9maXhfYWRqdXN0YWJsZSk6IE5vdCBxdWl0ZSB0aGUgc2FtZSBhcwotCSFhbHBoYV9mb3JjZV9yZWxvY2F0aW9uLCBhcyBsb2NhbCBMSVRFUkFMcyBjYW4gYmUgYWRqdXN0ZWQgdG8gYmUKLQlyZWxhdGl2ZSB0byB0aGUgc2VjdGlvbi4KLQotRnJpIEphbiAgMyAxMjowOToyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh5YW5rX3N5bWJvbHMpOiBJZiB0Y19mcm9iX2NvZmZfc3ltYm9sIGlzCi0JZGVmaW5lZCwgY2FsbCBpdC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKHRjX2Zyb2Jfc3ltYm9sKTogQ2hlY2sgd2hldGhlciB0ZXh0IGxhYmVsIGlzCi0JYWxpZ25lZCB0byBvZGQgYm91bmRhcnkuCi0JKHRjX2Zyb2JfY29mZl9zeW1ib2wpOiBEZWZpbmUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChTZXQpOiBDaGFuZ2UgcGFyZW50aGVzaXplZCBAeHJlZiB0byBAcHhyZWYuCi0KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogSW4gTVJJIG1vZGUsIGp1c3QgY29weSBhIHNpbmdsZSAmLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQ2FsbCBmcmFnX2dyb3cgYmVmb3JlIGFkZGluZyBhCi0JUENJTkRFWCBmcmFnLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWNjZXB0ICdCJyBhcyBhIHNpemUgZm9yIGFuCi0JaW1tZWRpYXRlIHZhbHVlLgotCShtZF9hc3NlbWJsZSk6IElmIHRoZSBzaXplIGlzICdCJywgc2V0IGZ4X3NpZ25lZC4KLQkobWRfYXBwbHlfZml4XzIpOiBVc2UgZnhfc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkIGZ4X3NpZ25lZCBmaWVsZC4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJbml0aWFsaXplIGZ4X25vX292ZXJmbG93IGFuZAotCWZ4X3NpZ25lZCBmaWVsZHMuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgZnhfc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGVjayBmeF9ub19vdmVyZmxvdyBhbmQKLQlmeF9zaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCi0KLVRodSBKYW4gIDIgMTM6Mzc6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBOT1RFUywgTk9URVMuY29uZmlnOiBSZW1vdmVkLiAgVGhlc2UgYXJlIHJhcmVseSwgaWYgZXZlciwKLQl1cGRhdGVkLCBhbmQgYWxsIHRoZSB1c2VmdWwgaW5mb3JtYXRpb24gaXMgaW4gZG9jL2ludGVybmFscy50ZXhpLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDaGVjayBmb3IgY29uZGl0aW9uYWwgb3BlcmF0b3JzCi0JYmVmb3JlIGRvaW5nIGFuIE1SSSBwZW5kaW5nIGFsaWdubWVudC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG02OGtfY29uZGl0aW9uYWxfcHNldWRvb3ApOiBEZWNsYXJlLgotCSh0Y19jb25kaXRpb25hbF9wc2V1ZG9wKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19jb25kaXRpb25hbF9wc2V1ZG9wKTogTmV3IGZ1bmN0aW9uLgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IERlc2NyaWJlCi0JdGNfY29uZGl0aW9uYWxfcHNldWRvb3AuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX3JlbDMyX2Zyb21fY21kbGluZSk6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBDaGVjayBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSBiZWZvcmUgc2V0dGluZwotCW02OGtfcmVsMzIuCi0JKG02OGtfbXJpX21vZGVfY2hhbmdlKTogTGlrZXdpc2UuCi0JKG1kX2xvbmdvcHRzKTogQWRkIC0tZGlzcC1zaXplLWRlZmF1bHQtMTYgYW5kCi0JLS1kaXNwLXNpemUtZGVmYXVsdC0zMi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1PcHRzKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQpOiBOZXcgc3RhdGljCi0JdmFyaWFibGUuCi0JKG02OGtfaXApOiBVc2UgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0IHRvIHNldCB0aGUgc2l6ZSBvZiBhIGJhc2UKLQlyZWdpc3RlciB3aG9zZSBzaXplIHdhcyBub3QgZ2l2ZW4uCi0JKG1kX2xvbmdvcHRzKTogQWRkIC0tYmFzZS1zaXplLWRlZmF1bHQtMTYgYW5kCi0JLS1iYXNlLXNpemUtZGVmYXVsdC0zMi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1PcHRzKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLQkqIGRvYy9jLW1pcHMudGV4aTogTWVudGlvbiBJU0EgbGV2ZWwgNCwgYW5kIHRoZSAtbWlwczE2IG9wdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbWlwcy0qLWxpbnV4KiB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZXdyaXRlIDY0IGJpdCBoYW5kbGluZyB0bwotCXdvcmsgaWYgdmFsdWVUIGlzIG9ubHkgMzIgYml0cy4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVGhyb3VnaG91dCwgY2hlY2sgdGFyZ2V0X2JpZ19lbmRpYW4gcmF0aGVyCi0gCXRoYW4gYnl0ZV9vcmRlci4KLSAJKGJ5dGVfb3JkZXIpOiBSZW1vdmUuCi0JKG1pcHNfaW5pdF9hZnRlcl9hcmdzKTogUmVtb3ZlLgotCSogY29uZmlnL3RjLW1pcHMuaCAoTElUVExFX0VORElBTiwgQklHX0VORElBTik6IERvbid0IGRlZmluZS4KLQkobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBEb24ndCBkZWNsYXJlLgotCSh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lIGlmCi0JT0JKX01BWUJFX0VMRi4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDMxIDE1OjEyOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBJZiB0aGlzIGlzIHNzdC57aCx3fSBvcgotCXNsZC57aCx3fSBhbmQgdGhlIG9wZXJhbmQgaXMgcmVsb2NhdGFibGUsIGFkanVzdCB0aGUgYWRlbmQgYnkKLQlzaGlmdGluZyBpdCByaWdodCBvbmUgYml0LgotCi1UdWUgRGVjIDMxIDEyOjU2OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDaGVjayBtcmlfcGVuZGluZ19hbGlnbiBhZnRlcgotCWNoZWNraW5nIGZvciBhIG1hY3JvLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlCi0JPHJmZ0Btb25rZXlzLmNvbT4uCi0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzKTogUmVuYW1lIGZyb20gbWRfYXBwbHlfZml4LCBhbmQKLSAJYWRkIHNlZ21lbnQgYXJndW1lbnQuICBJZiBPQkpfRUxGLCB0cmVhdCBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0gCXN5bWJvbCBpbiBhIGxpbmtvbmNlIHNlY3Rpb24gbGlrZSBhIHJlbG9jYXRpb24gYWdhaW5zdCBhbiBleHRlcm5hbAotIAlzeW1ib2wuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotTW9uIERlYyAzMCAxMTozNTo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9tYWNybyk6IEFkZCBjYXNlIGZvciBNX0FCUy4KLQotRnJpIERlYyAyNyAyMjo1MTo1MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTk9URVMuY29uZmlnIChJbXBsZW1lbnRhdGlvbik6IGFzLmggI2RlZmluZSdzICJHQVMiIG5vdCAiZ2FzIiwKLQlpbmNsdWRlcyBjb25maWcuaCBpbnN0ZWFkIG9mIGhvc3QuaCwgdGMuaCBpbnN0ZWFkIG9mIHRwLmgsIGFuZAotCXRhcmctZW52LmggaW5zdGVhZCBvZiB0YXJnZXQtZW52aXJvbm1lbnQuaC4KLQlBbHNvLCBvYmotZm9ybWF0LmggaW5jbHVkZXMgdGFyZy1jcHUuaCBpbnN0ZWFkIG9mCi0gCXRhcmdldC1wcm9jZXNzb3IuaC4KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSk6IEFkZCB0aWM4MC0qLWNvZmYgZW50cnkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZi4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmL3RpYzgwLmgpOiBJbmNsdWRlIGlmIFRDX1RJQzgwIGRlZmluZWQuCi0JKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgdG8gImNvZmYtdGljODAiLgotCSogY29uZmlnL3RjLXRpYzgwLmM6IE5ldyBmaWxlIGZvciBUSWM4MCBzdXBwb3J0LgotCSogY29uZmlnL3RjLXRpYzgwLmg6IE5ldyBmaWxlIGZvciBUSWM4MCBzdXBwb3J0LgotCQotRnJpIERlYyAyNyAxMTo0MjoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChNKTogTWVudGlvbiBleHBsaWNpdGx5IHRoYXQgLU0gY2hhbmdlcyBtYWNybwotCWhhbmRsaW5nLgotCi1UaHUgRGVjIDE5IDEyOjA2OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBJZiB0aGUgZml4dXAgc3ltYm9sIGhhcyBiZWVuCi0JZXF1YXRlZCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLCBjb252ZXJ0IHRoZSBmaXh1cCB0byBiZWluZyBhZ2FpbnN0Ci0JdGhlIHRhcmdldCBzeW1ib2wuICBSZW1vdmUgb2Jzb2xldGUgY29kZSBoYW5kbGluZyBhIHNwZWNpYWwgY2FzZQotCWZvciBpMzg2IFBJQy4KLQotV2VkIERlYyAxOCAyMjo1NDozOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXNlIE5ld0ZvbGRlclJlY3Vyc2l2ZSBmb3IgaW5zdGFsbGF0aW9uLgotCi1XZWQgRGVjIDE4IDE2OjAwOjQyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChkb19hc3NlbWJsZSk6IENvcnJlY3QgcHJldmlvdXMgYnVnIGZpeC4KLQotV2VkIERlYyAxOCAxNToyNzo0MCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBGaXggYnVnIHdoaWNoIGNhdXNlZAotCXNlY29uZCBpbnN0cnVjdGlvbiBpbiBhIGxpbmUgdG8gYmUgY2FzZSBzZW5zaXRpemUuCi0KLVdlZCBEZWMgMTggMTA6MDg6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtbjEwMjAwX2luc2VydF9vcGVyYW5kKTogRG9uJ3QKLQlyYW5nZSBjaGVjayBvcGVyYW5kcyB3aXRoIE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLIHNldC4KLQkoY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDE3IDEwOjU5OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVW5kbyBwYXJ0IG9mIGxhc3QgRnJpZGF5J3MgYWxpZ25tZW50IGNoYW5nZXMuCi0gCShtZF9iZWdpbik6IEFsd2F5cyBhbGlnbiB0aGUgdGV4dCBzZWN0aW9uIHRvIGEgZm91ciBieXRlCi0JYm91bmRhcnkuCi0JKGFwcGVuZF9pbnNuKTogUmVtb3ZlIGNhbGwgdG8gcmVjb3JkX2FsaWduLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChpbnNuX2xhYmVsKTogUmVtb3ZlLgotCShzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0KTogRGVmaW5lLgotCShpbnNuX2xhYmVscywgZnJlZV9pbnNuX2xhYmVscyk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtaXBzX2NsZWFyX2luc25fbGFiZWxzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXBwZW5kX2luc24pOiBNYXJrIGFsbCBtaXBzMTYgdGV4dCBsYWJlbHMsIGFuZCBtYWtlIHRoZW0gb2RkLgotCUhhbmRsZSBhbGwgbGFiZWxzIGFmdGVyIGVtaXR0aW5nIGEgbm9wLCBub3QganVzdCBvbmUuICBDYWxsCi0JbWlwc19jbGVhcl9pbnNuX2xhYmVscyByYXRoZXIgdGhhbiBqdXN0IGNsZWFyaW5nIGluc25fbGFiZWwuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBBZGQgaW5zbnMgcGFyYW1ldGVyLCBhbmQgdXNlIGl0IHRvIGRlY2lkZQotCXdoZXRoZXIgdG8gbWFyayBtaXBzMTYgbGFiZWxzLiAgSGFuZGxlIGFsbCBsYWJlbHMsIG5vdCBqdXN0IG9uZS4KLQlGb3JjZSBtaXBzMTYgbGFiZWxzIHRvIGJlIG9kZC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWlwczE2X2ltbWVkKTogRG9uJ3QgY2hlY2sgZm9yIGFuIG9kZCBicmFuY2ggdGFyZ2V0LgotCShtZF9hcHBseV9maXgpOiBEb24ndCBjaGVjayBtaXBzMTYgbW9kZSBmb3IgYSBicmFuY2ggcmVsb2MuCi0JKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogSWdub3JlIHRoZSBsb3cgYml0IGluIGEgYnJhbmNoIHRhcmdldC4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKG1pcHNfbm9fcHJldl9pbnNuKTogQ2FsbCBtaXBzX2NsZWFyX2luc25fbGFiZWxzIHJhdGhlciB0aGFuIGp1c3QKLQljbGVhcmluZyBpbnNuX2xhYmVsLgotCShtaXBzX2FsaWduLCBtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0LCBzX2NvbnMpOiBMaWtld2lzZS4KLQkoc19mbG9hdF9jb25zLCBzX2dwd29yZCk6IExpa2V3aXNlLgotCShzX2FsaWduKTogVXNlIGluc25fbGFiZWxzIHJhdGhlciB0aGFuIGluc25fbGFiZWwuCi0JKHNfY29ucywgc19mbG9hdF9jb25zLCBzX2dwd29yZCk6IExpa2V3aXNlLgotCShtaXBzX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZGVmaW5lX2xhYmVsKTogUmV3cml0ZSB0byBhZGQgdG8gaW5zbl9sYWJlbHMgbGlzdC4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSWYgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBjb21lcwotCW91dCBvZGQsIGluY3JlbWVudCBpdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBPbmx5IHVwZGF0ZSBwcmV2X2luc24gd2hlbiBub3QKLQlyZW9yZGVyaW5nIGlmIHBsYWNlIGlzIE5VTEwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IENoZWNrIGZvciBhIG1pc3NpbmcgZXhwcmVzc2lvbgotCXdoZW4gdXNpbmcgdGhlIHJlZ2lzdGVyIGluZGlyZWN0IGFkZHJlc3NpbmcgbW9kZS4KLQotTW9uIERlYyAxNiAxMDowODo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQpOiBEb24ndAotCWNoZWNrIDI0Yml0IG9wZXJhbmRzIGZvciBvdmVyZmxvdy4KLQkoY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1Nb24gRGVjIDE2IDExOjUwOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKFNlY3Rpb24pOiBEb2N1bWVudCBob3cgdG8gdXNlIHRoZSAuc2VjdGlvbgotCXBzZXVkby1vcCBmb3IgQ09GRiBhbmQgRUxGLgotCi1TdW4gRGVjIDE1IDE1OjI2OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBGaXggbGlua29uY2UgY2hlY2sgZm9yIEVMRi4KLQotU2F0IERlYyAxNCAyMjozNzoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHByZXZfaW5zbl9yZWxvY190eXBlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoUkVMQVhfTUlQUzE2X0VOQ09ERSk6IEFkZCBkc2xvdCBhbmQgamFsX2RzbG90IGFyZ3VtZW50cywgYW5kCi0Jc3RvcmUgdGhlbS4gIEFkanVzdCBvdGhlciBSRUxBWF9NSVBTMTYgbWFjcm9zLgotCShSRUxBWF9NSVBTMTZfRFNMT1QpOiBEZWZpbmUuCi0JKFJFTEFYX01JUFMxNl9KQUxfRFNMT1QpOiBEZWZpbmUuCi0JKGFwcGVuZF9pbnNuKTogUGFzcyBuZXcgYXJndW1lbnRzIHRvIFJFTEFYX01JUFMxNl9FTkNPREUuICBDb3JyZWN0Ci0JaGFuZGxpbmcgb2Ygd2hldGhlciBwcmV2aW91cyBpbnN0cnVjdGlvbiBoYXMgYSBmaXh1cC4gIFNldAotCXByZXZfaW5zbl9yZWxvY190eXBlLgotCShtaXBzX25vX3ByZXZfaW5zbik6IENsZWFyIHByZXZfaW5zbl9yZWxvY190eXBlLgotCShtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IFVzZSB0aGUgcmlnaHQgYmFzZSBhZGRyZXNzIGZvciBhIFBDCi0JcmVsYXRpdmUgYWRkIG9yIGxvYWQuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLiAgSWYgYSBQQyByZWxhdGl2ZSBhZGQgb3IgbG9hZCBpcwotCXVzZWQsIHJlY29yZCB0aGUgYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbi4KLQotRnJpIERlYyAxMyAxMzowMDozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogRG9uJ3QgcmVkdWNlIGEgcmVsb2MgYWdhaW5zdCBhCi0JbGlua29uY2Ugc2VjdGlvbiBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9tYWNybyk6IFJlbW92ZSBub3AgaW5zdHJ1Y3Rpb25zIGFmdGVyCi0JYnJhbmNoIGluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCBFTEYKLQlzeXN0ZW0sIGRvbid0IHNldCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgdG8gMioqNC4KLQkoc19jaGFuZ2Vfc2VjKTogTGlrZXdpc2UuCi0JKGFwcGVuZF9pbnNuKTogQ2FsbCByZWNvcmRfYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbi4KLQkobWRfc2VjdGlvbl9hbGlnbik6IERvbid0IGFsaWduIHRoZSBzZWN0aW9uIHNpemUgZm9yIGFuIGVtYmVkZGVkCi0JRUxGIHN5c3RlbS4KLQotVGh1IERlYyAxMiAxNjo0MDo0NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogTWFrZSBzdXJlIHRoYXQgc3ltYm9scyBhcmUKLQlyZXNvbHZlZDsgZXhwcmVzc2lvbiBzeW1ib2xzIG1heSBoYXZlIGJlZW4gc2tpcHBlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0KLVRodSBEZWMgMTIgMTU6MTg6MjEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogTW92ZSBAcGx0IHRvCi0JQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCByZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogU3VwcG9ydCBCRkRfUkVMT0NfMjRfUExUX1BDUkVMLgotCi1UdWUgRGVjIDEwIDEzOjUxOjU1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogUmVtb3ZlIGNvZGUgdGhhdCBjYWxsZWQKLQlwYXJhbGxlbF9vaygpIHdoZW4gdGhlIHByb2dyYW1tZXIgc3BlY2lmaWVkIHBhcmFsbGVsIGluc3RydWN0aW9ucy4KLQotVHVlIERlYyAxMCAxMjoyMzoxOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogVXBkYXRlIHRvIGhhbmRsZSBlbmRpYW5uZXNzCi0JaXNzdWVzIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBPcGNvZGUgMHgwIGlzIHZhbGlkIQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotVHVlIERlYyAxMCAxMTozNzoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tCi0JaW4gYSBmcmFnIGFmdGVyIGEgbWlwczE2IGluc3RydWN0aW9uIHRvIHN3aXRjaCBpdCB3aXRoIGEganVtcAotCWluc3RydWN0aW9uLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IEdpdmUgYW4gZXJyb3IgZm9yIGFuCi0JYXR0ZW1wdCB0byB1c2UgYSBub24gYWJzb2x1dGUgc3ltYm9sIGluIGFuIGV4dGVuZGluZyBmcmFnLgotCi1Nb24gRGVjICA5IDE2OjQ4OjIwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYzogRmxlc2ggb3V0IGFzc2VtYmxlciBzdXBwb3J0IGZvciBNTjEwMjAwLgotCSogY29uZmlnL3RjLW1uMTAyMDAuaDogTGlrZXdpc2UuCi0KLU1vbiBEZWMgIDkgMTc6MDk6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBBdCB0aGUgZW5kIG9mIGEgQyBjb21tZW50LCBwYXNzIHNwYWNlIHRvCi0JVU5HRVQgcmF0aGVyIHRoYW4gUFVULiAgU2V0IG9sZF9zdGF0ZSBiZWZvcmUgc2V0dGluZyBzdGF0ZSB0byAtMi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBBdm9pZCBhbiBpbmZpbml0ZSBsb29wCi0Jd2hlbiBleHRlbmRpbmcgYmVjYXVzZSB0aGUgdmFsdWUgaXMgZXhhY3RseSBtYXh0aW55ICsgMS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoUkVMQVhfTUlQUzE2X0VOQ09ERSk6IEFkZCBzbWFsbCBhbmQgZXh0Ci0JYXJndW1lbnRzLCBhbmQgc3RvcmUgdGhlbS4gIEFkanVzdCBvdGhlciBSRUxBWF9NSVBTMTYgbWFjcm9zLgotCShSRUxBWF9NSVBTMTZfVVNFUl9TTUFMTCk6IERlZmluZS4KLQkoUkVMQVhfTUlQUzE2X1VTRVJfRVhUKTogRGVmaW5lLgotCShtaXBzMTZfc21hbGwsIG1pcHMxNl9leHQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoYXBwZW5kX2luc24pOiBQYXNzIG1pcHMxNl9zbWFsbCBhbmQgbWlwczE2X2V4dCB0bwotCVJFTEFYX01JUFMxNl9FTkNPREUuCi0JKG1pcHMxNl9pcCk6IFNldCBtaXBzMTZfc21hbGwgYW5kIG1pcHMxNl9leHQuCi0JKG1pcHMxNl9pbW1lZCk6IERvbid0IGNoZWNrIG1pcHMxNl9hdXRvZXh0ZW5kLgotCShtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IENoZWNrIFVTRVJfU01BTEwgYW5kIFVTRVJfRVhULgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBQcmludCBhbiBlcnJvciBmb3IgYW4gb3V0IG9mIHJhbmdlCi0JZml4dXAsIHJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLQkqIGFzLmMgKG1haW4pOiBVbmxpbmsgdGhlIG91dHB1dCBmaWxlIGlmIHRoZXJlIGFyZSBlcnJvcnMgd2hpbGUKLQlnZW5lcmF0aW5nIHRoZSBmaXh1cHMuCi0KLUZyaSBEZWMgIDYgMTg6NDg6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IERvbid0IGNhbGwKLQlTX0dFVF9WQUxVRS4KLQkobWRfY29udmVydF9mcmFnKTogQ2FsbCByZXNvbHZlX3N5bWJvbF92YWx1ZSBiZWZvcmUgY2FsbGluZwotCVNfR0VUX1ZBTFVFLCBhbmQgZG9uJ3QgYWRkIGluIHRoZSBmcmFnIGFkZHJlc3MuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pbW1lZCk6IEFkZCBmaWxlIGFuZCBsaW5lIHBhcmFtZXRlcnMsCi0JYW5kIHVzZSB0aGVtIHdoZW4gcmVwb3J0aW5nIGVycm9ycy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotRnJpIERlYyAgNiAxNTozNjozMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmM6IEZpeCB2YXJpb3VzIGdjYyAtV2FsbCB3YXJuaW5ncy4KLQlSZW1vdmUgJyQnIHByZWZpeGluZyBmb3IgcmVnaXN0ZXJzLgotCi1GcmkgRGVjICA2IDAwOjU1OjQ4IDE5OTYgIE1hcnRpbiAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBDaGVjayB0byBzZWUgaWYgcHJldl9zZWcKLQlpcyBpbml0aWFsaXplZCBiZWZvcmUgdXNpbmcgaXQuCi0JKGQxMHZfY2xlYW51cCk6IE5vIGxvbmdlciB1c2VzIGl0cyBhcmd1bWVudCwgc28gbWFrZSBpdCB2b2lkLgotCi0JKiBjb25maWcvdGMtZDEwdi5oIChkMTB2X2NsZWFudXApOiBDaGFuZ2UgcHJvdG90eXBlLgotCQotVGh1IERlYyAgNSAxMTowMzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBkaXNjYXJkIHRoZSBzeW1ib2wgZm9yIGEgUEMKLQlyZWxhdGl2ZSBmaXh1cCB0byBhbiBhYnNvbHV0ZSBzeW1ib2wuCi0KLVdlZCBEZWMgIDQgMTU6NDI6NDEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlLCBkMTB2X2NsZWFudXApOiBGaXggYnVnCi0Jd2l0aCBtdWx0aXBsZSBzZWN0aW9ucy4KLQotV2VkIERlYyAgNCAxMzowMDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2xvbmdvcHRzKTogUmVuYW1lIG1pcHMtMTYgdG8gbWlwczE2LCBhbmQKLQluby1taXBzLTE2IHRvIG5vLW1pcHMxNi4KLQkoc19taXBzc2V0KTogQWNjZXB0IC5zZXQgbWlwczE2IGFuZCAuc2V0IG5vbWlwczE2LgotCi1XZWQgRGVjICA0IDEwOjM1OjMzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IFRha2UgZXhwcmVzc2lvblMgcG9pbnRlcgotCWFyZ3VtZW50LCBhbmQgY2hlY2sgZm9yICsvLSBjb25zdGFudCBmb2xsb3dpbmcgdGhlIHN1ZmZpeCwgZm9sZGluZwotCWl0IGludG8gdGhlIGV4cHJlc3Npb24uCi0JKHBwY19lbGZfY29ucyk6IENoYW5nZSBwcGNfZWxmX3N1ZmZpeCBjYWxscy4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQkoc2hsaWIpOiBSZXBsYWNlIGJvb2xlYW4gbXJlbG9jYXRhYmxlIHdpdGggZW51bWVyYXRpb24gc2hsaWIuCi0JKG1kX3BhcnNlX29wdGlvbik6IERpc2NyaW1pbmF0ZSBiZXR3ZWVuIFBJQyBzdHlsZSBzaGFyZWQgbGlicmFyaWVzCi0JYW5kIC1tcmVsb2NhdGFibGUuCi0JKHBwY19lbGZfdmFsaWRhdGVfZml4KTogRG9uJ3QgcmVwb3J0IHdhcm5pbmdzIGZvciBQSUMgc3R5bGUgc2hhcmVkCi0JbGlicmFyaWVzLgotCi1UdWUgRGVjICAzIDIzOjE4OjI5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oICh7dGMscHBjfV9jb21tZW50X2NoYXJzKTogRGVmaW5lLCBzbyB0aGF0IHdlIGNhbgotCWNoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXJzLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKGNvbW1lbnRfY2hhcnMpOiBEZWxldGUgaW4gZmF2b3Igb2YKLQl0Y19jb21tZW50X2NoYXJzLgotCShwcGNfe2VhYmksc29sYXJpc31fY29tbWVudF9jaGFycyk6IEVhYmkgYW5kIFNvbGFyaXMgdmVyc2lvbnMgb2YKLQljb21tZW50IGNoYXJzLgotCShwcGNfY29tbWVudF9jaGFycyk6IFNlbGVjdCBhcHByb3ByaWF0ZSBjb21tZW50IGNoYXJzIGJ5IGRlZmF1bHQuCi0JKG1zb2xhcmlzKTogTmV3IGZsYWcgZm9yIC1teyxuby19c29sYXJpcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1LIHBpYy4gIEFkZCBzdXBwb3J0IGZvcgotCS1teyxuby19c29sYXJpcy4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZS4KLQkobWRfYmVnaW4pOiBEbyBub3Qgc2V0IEVMRiBmbGFncyBpZiBTb2xhcmlzLgotCShwcGNfZWxmX3N1ZmZpeCk6IEBsb2NhbCBzZXRzIFJfUFBDX0xPQ0FMMjRQQyByZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX0xPQ0FMMjRQQy4KLQotTW9uIERlYyAgMiAxMzo0ODo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKG1haW4pOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dC4KLQotU3VuIERlYyAgMSAyMTo0NjowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHRjX2dlbl9yZWxvYyk6IEdldCB0aGUgYWRkZW5kIGZyb20KLQlmeF9vZmZzZXQsIG5vdCBmeF9hZGRudW1iZXIuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgZG8gYW55Ci0JcmVsb2MgYWRqdXN0bWVudHMuCi0KLVNhdCBOb3YgMzAgMTc6MzQ6NDggMTk5NiAgRWxpb3QgRHJlc3NlbGhhdXMgIDxlbGlvdEB3YWxseS5lZGMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBDb3JyZWN0IG1pc3NwZWxsaW5nOiBiYWxlbmNlZCB0byBiYWxhbmNlZC4KLQotV2VkIE5vdiAyNyAxMzoyNTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBDaGVjayBmb3IgYW4gYWxpZ25tZW50IG9mCi0JNCwgbm90IGFuIGFsaWdubWVudCBvZiAxNi4gIENvcnJlY3RzIEF1Z3VzdCA3IHBhdGNoLgotCi1UdWUgTm92IDI2IDEwOjMzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogRG9uJ3QgZ2l2ZSBhbiBlcnJvciBpZiBubwotCWFsaWdubWVudCBpcyBzcGVjaWZpZWQuCi0KLQlBZGQgc3VwcG9ydCBmb3IgbWlwczE2ICgxNiBiaXQgTUlQUyBpbXBsZW1lbnRhdGlvbik6Ci0JKiBjb25maWcvdGMtbWlwcy5jOiBFeHRlbnNpdmUgYWRkaXRpb25zIGZvciBtaXBzMTYgc3VwcG9ydCwgbm90Ci0JbGlzdGVkIGhlcmUuCi0JKFJFTEFYX09MRCwgUkVMQVhfTkVXKTogVXNlIG9ubHkgNyBiaXRzIGVhY2guCi0JKGluc25fdXNlc19yZWcpOiBDaGFuZ2UgbGFzdCBwYXJhbWV0ZXIgdG8gYW4gZW51bS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMU19ET0xMQVIpOiBEZWZpbmUgYXMgMC4KLQkobWRfcmVsYXhfZnJhZyk6IERlZmluZSBhcyBtaXBzX3JlbGF4X2ZyYWcuCi0JKG1pcHNfcmVsYXhfZnJhZyk6IERlY2xhcmUuCi0JKHN0cnVjdCBtaXBzX2NsX2luc24pOiBBZGQgdXNlX2V4dGVuZCBhbmQgZXh0ZW5kIGZpZWxkcy4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChTX0dFVF9PVEhFUik6IERlZmluZS4KLQkoU19TRVRfT1RIRVIpOiBEZWZpbmUuCi0KLU1vbiBOb3YgMjUgMTg6MDI6MjkgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSW1wbGVtZW50IGNhc2VzIGZvciBuZXcgPCwgPiwgbSwgbiwKLSAJbyBhbmQgcCBvcGVyYW5kIHNwZWNpZmllcnMuCi0KLU1vbiBOb3YgMjUgMTA6NDU6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmM6IERlbGV0ZSAiaWZuZGVmIG1kX3JlbGF4X2ZyYWciIGFyb3VuZCBpc19kbnJhbmdlLgotCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX29yZyk6IE1vdmUgY29kZSBpbnNpZGUgYnJhY2VzLiAgTW92ZSBsb2NhbHMKLQl0YXJnZXQsYWZ0ZXIgaW5zaWRlIHRvby4KLQkocmVsYXhfc2VnbWVudCwgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudCk6IEd1dHMgbW92ZWQgdG8gLi4uCi0JKHJlbGF4X2ZyYWcpOiBOZXcgZnVuY3Rpb24uCi0JQ2FsbCBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gaWYgZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG1kX3ByZXBhcmVfcmVsYXhfc2Nhbik6IFJlbmFtZWQgZnJvbQotCU02OEtfQUlNX0tMVURHRS4KLQotTW9uIE5vdiAyNSAwODo0OTozNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKGFkZHJlc3NfcmVnaXN0ZXJzKTogVXNlICckJyBhcyByZWdpc3RlcgotCXByZWZpeCBpbnN0ZWFkIG9mICclJy4KLQkoZGF0YV9yZWdpc3RlcnMsIG90aGVyX3JlZ2lzdGVycywgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAoYWRkcmVzc19yZWdpc3RlcnMpOiBVc2UgJyUnIHByZWZpeCBmb3IgcmVncy4KLQkoZGF0YV9yZWdpc3RlcnMsIG90aGVyX3JlZ2lzdGVycywgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0bHkgZGV0ZXJtaW5lIHRoZQotCWNvcnJlY3QgbG9jYXRpb24gYW5kIHR5cGUgZm9yIGVhY2ggcmVsb2NhdGlvbi4KLQkobWRfcGNyZWxfZnJvbSk6IFNpbXBsaWZ5LgotCi1GcmkgTm92IDIyIDE1OjQyOjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEltcHJvdmUgd2FybmluZyB3aGVuIGJyYW5jaCBpcwotCWNvbnZlcnRlZCBpbnRvIGJyYW5jaCBhcm91bmQgYnJhbmNoLgotCi1UaHUgTm92IDIxIDExOjU2OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuaCAoRElGRl9FWFBSX09LKTogRG9uJ3QgZGVmaW5lIHRoaXMuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jcyBhZ2FpbnN0IHdlYWsgc3ltYm9scyBvciAKLQlwYy1yZWxhdGl2ZSByZWxvY3MuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9iZWdpbik6IFNldCBsaW5rcmVsYXguCi0JKG1kX2Fzc2VtYmxlKTogQ3JlYXRlIGZpeHVwcyBhcyBuZWVkZWQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBHdXQuICBJdCBzaG91bGRuJ3QgZXZlciBnZXQgY2FsbGVkIGFueW1vcmUuCi0KLVR1ZSBOb3YgMTkgMTc6NDg6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IFdoZW4gYXV0b21hdGljYWxseSBjb252ZXJ0aW5nCi0Jc2VyaWFsIG9wcyB0byBwYXJhbGxlbCwgZG8gbm90IGNvbnNpZGVyIGEgYnJhbmNoIGFzIHRoZSBmaXJzdAotCWluc3RydWN0aW9uLgotCi1UdWUgTm92IDE5IDEzOjM1OjIyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNULgotCi1Nb24gTm92IDE4IDE1OjI2OjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IFByb3ZpZGUgcHJvdG90eXBlCi0JdmlhIFBBUkFNUy4KLQkoY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1Nb24gTm92IDE4IDE1OjIyOjI4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBCcmFuY2ggYW5kIGxpbmsgaW5zdHJ1Y3Rpb25zCi0JbW9kaWZ5IHIxMy4KLQkod3JpdGVfMl9zaG9ydCk6IENhbGwgcGFyYWxsZWxfb2sgdG8gY2hlY2sgd2hldGhlciB0d28gc2hvcnQKLQlpbnN0cnVjdGlvbnMgdGhlIHVzZXIgcmVxdWVzdGVkIGV4ZWN1dGUgaW4gcGFyYWxsZWwsIGNhbiBiZQotCWV4ZWN1dGVkIHRoYXQgd2F5LgotCi1UaHUgTm92IDE0IDExOjE3OjQ5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogRml4IGJ1ZyB0aGF0IHdvdWxkbid0Ci0JYWxsb3cgYSBicmFuY2ggYW5kIGxpbmsgaW4gcGFyYWxsZWwgd2l0aCBhbiBleGUgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBOb3YgIDggMTM6NTU6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWQxMHYudGV4aTogQWRkIGluZm8gb24gQHdvcmQgbW9kaWZpZXIuCi0KLVdlZCBOb3YgIDYgMTM6NDY6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IE1OMTAzMDBfT1BFUkFORF9TUExJVAotCW9wZXJhbmRzIGFyZSBhc3N1bWVkIHRvIGJlIDMyYml0cy4gIFVzZSAiYml0cyIgZmllbGQgdG8gaG9sZCB0aGUKLQludW1iZXIgb2YgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQuCi0JKG1uMTAzMDBfY2hlY2tfb3BlcmFuZCk6IE1OMTAzMDBfT1BFUkFORF9TUExJVCBvcGVyYW5kcyBhcmUgYXNzdW1lZAotCXRvIGJlIDMyYml0cy4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IFNoaWZ0IGxvdyBwYXJ0Ci0Jb2YgYSBNTjEwMzAwX09QRVJBTkRfU1BMSVQgb3BlcmFuZCBieSBvcGVyYW5kLT5zaGlmdC4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEhhbmRsZQotCU1OMTAzMDBfT1BFUkFORF9TUExJVC4KLQotVHVlIE5vdiAgNSAxMzozMDo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogSW5zZXJ0IG9wZXJhbmRzIGludG8KLQl0aGUgZXh0ZW5zaW9uIHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGlmIG5lY2Vzc2FyeS4KLQkobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEFjY2VwdCBwb2ludGVyIHRvIGV4dGVuc2lvbiB3b3JkCi0JYXJndW1lbnQuICBNYWtlIGluc24gYSBwb2ludGVyIGFyZ3VtZW50IHRvby4gIFJldHVybiB0eXBlCi0JaXMgbm93IHZvaWQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi1Nb24gTm92ICA0IDEyOjUzOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEhhbmRsZQotCXJlcGVhdGVkIHJlZ2lzdGVyIG9wZXJhbmRzLgotCi1GcmkgTm92ICAxIDEwOjQyOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZGVkIHNlY3Rpb24gb24gcmVwb3J0aW5nIGJ1Z3MuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBDaGFuZ2UgdXNlcyBvZiB2b2lkICogdG8gUFRSLiAgQ2hhbmdlIHRoZQotCWFscGhhX21hY3JvIGVtaXQgZmllbGQgdG8gZXhwZWN0IGEgY29uc3QgYXJndW1lbnQsIGFuZCBjaGFuZ2UgdGhlCi0JYXJnIGZpZWxkIHRvIGJlIGNvbnN0LiAgRml4IHNvbWUgc3BhY2luZyB0byBmb2xsb3cgdGhlIEdOVQotCXN0YW5kYXJkLgotCi1GcmkgTm92ICAxIDEwOjMyOjAzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIGtub3dsZWRnZSBvZiAyMTE2NHBjCi0JKHBjYTU2KSBhbmQgMjEyNjQgKGV2NikgY3B1cy4KLQkobWRfYXBwbHlfZml4KTogUHJpdmF0ZSByZWxvY2F0aW9uIHR5cGVzIGFyZSBub3cgbmVnYXRpdmUuCi0JKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKGVtaXRfaW5zbik6IExpa2V3aXNlLgotCShlbWl0X2xkWHUpOiBEbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiB0aGUgaGFyZHdhcmUgY2FuIGRvIGJ5dGUgaW5zbnMuCi0JKGVtaXRfc3RYKTogTGlrZXdpc2UuCi0JKGVtaXRfc2V4dFgpOiBMaWtld2lzZS4KLQotVGh1IE9jdCAzMSAxNjozMzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogQ2FsbCByZXNvbHZlX3N5bWJvbF92YWx1ZSBvbgotCWEgc3ltYm9sIGZvdW5kIGluIGEgcmVsb2MuCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIGlmCi0JYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLVdlZCBPY3QgMzAgMjA6MTU6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IFJld3JpdGUsIGFuZCBhZGQgYSBsb3Qgb2YgZG9jdW1lbnRhdGlvbi4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW50ZXJuYWxzLmluZm8pOiBOZXcgdGFyZ2V0LgotCi1XZWQgT2N0IDMwIDE0OjU1OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzCi0JYWdhaW5zdCB3ZWFrIHN5bWJvbHMuCi0KLVR1ZSBPY3QgMjkgMTI6Mjg6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IERvbid0IGxvc2UgZm9yIHJlbGF4YWJsZQotCWFkZHJlc3NlcyBsaWtlIC4rNi4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfY29udmVydF9mcmFnKTogTWFrZSBzdXJlIHdlIGluc2VydCB0aGUKLQlmaXh1cCBhdCB0aGUgcmlnaHQgYWRkcmVzcyB3aXRoaW4gdGhlIGZyYWcuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IERvbid0IHNldCBmcmFnUC0+ZnJfZml4Ci0JdG8gYW4gYWJzb2x1dGUgdmFsdWUsIGluc3RlYWQgaW5jcmVtZW50IGl0IGFzIG5lZWRlZC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEZpeCBzb21lIGluZGVudGlvbiBwcm9ibGVtcy4KLQkobWRfcmVsYXhfdGFibGUpOiBEZWZpbmUgZm9yIEQ5LT5EOTkgYnJhbmNoIGRpc3BsYWNlbWVudAotCXJlbGF4aW5nLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEbyBzb21ldGhpbmcgdXNlZnVsIGluc3RlYWQgb2YgYWJvcnRpbmcuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0JKG1kX2Fzc2VtYmxlKTogTm90ZSBpZiB0aGUgbWF0Y2hpbmcgaW5zdHJ1Y3Rpb24gaGFzIGEgcmVsYXhhYmxlCi0Jb3BlcmFuZC4gIElmIGl0IGRvZXMsIGFsbG9jYXRlIGZyYWcgd2l0aCBmcmFnX3ZhciBhbmQgZG9uJ3QKLQlkbyBhbnkgZml4dXBzLgotCi1Nb24gT2N0IDI4IDEwOjQ4OjQwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5oIChtZF9jbGVhbnVwKTogTmV3IGZ1bmN0aW9uLiAgVGhpcyBpcyBuZWVkZWQgdG8KLQl3cml0ZSBvdXQgYW55IGJ1ZmZlcmVkIGluc3RydWN0aW9ucyB3aGVuIGEgIi5lbmQiIGlzIGZvdW5kLgotCi1Nb24gT2N0IDI4IDEwOjQzOjQ1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE5ldyBob29rIG1kX2NsZWFudXAoKS4KLQotRnJpIE9jdCAyNSAwMDowMTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogVXNlIG1ha2VfZXhwcl9zeW1ib2wgdG8gYnVpbGQgYW4KLQlleHByZXNzaW9uIHN5bWJvbCBmb3IgYSBjb21wbGV4IGZpeHVwLgotCi1UaHUgT2N0IDI0IDE0OjMxOjA0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBTZXZlcmFsIGRpc2d1c3RpbmcKLQloYWNrcyB0byBpbXByb3ZlIHBhcnNpbmcgb2YgY29tcGxleCBoaSwgbG8sIHpkYSwgZXRjCi0JZXhwcmVzc2lvbnMuCi0JKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZGVtYW5kIGFuZCBlYXQgYSB0cmFpbGluZyAnKScgYWZ0ZXIgZmluZGluZwotCWEgdjg1MCByZWxvY2F0aW9uIHByZWZpeC4gIFNpZ24gZXh0ZW5kIHRoZSBjb25zdGFudCBpbiBhCi0JQkZEX1JFTE9DX0xPMTYgZXhwcmVzc2lvbi4gIERvIGVhdCBhIHRyYWlsaW5nICcpJyBhZnRlciBhIGNvbXBsZXRlCi0Jb3BlcmFuZC4KLQkocGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTApOiBEb24ndCBlYXQgYSB0cmFpbGluZyAnKScgYWZ0ZXIKLQlmaW5kaW5nIGEgdjg1MCByZWxvY2F0aW9uIHByZWZpeC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKTogRGVmaW5lLgotCShUQ19DT05TX0ZJWF9ORVcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwKTogTmV3IGZ1bmN0aW9uLgotCShjb25zX2ZpeF9uZXdfdjg1MCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtdjg1MC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBUREEgcmVsb2NzLgotCi1XZWQgT2N0IDIzIDE4OjIwOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogR2l2ZSBhIGJldHRlciB3YXJuaW5nIG1lc3NhZ2UKLQlmb3IgYW4gdW5rbm93biByZWxvY2F0aW9uIHR5cGUuCi0KLVdlZCBPY3QgMjMgMTY6MjE6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgLndvcmQ7IGFsbG9jYXRlcwotCTQgYnl0ZXMgb2Ygc3BhY2UuCi0KLVR1ZSBPY3QgMjIgMjI6MDE6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBUREFPRkYgcmVsb2NzCi0JZGlmZmVyZW50bHkgZm9yIG1vdmVhICYgc3N0L3NsZCBpbnNucy4KLQotVHVlIE9jdCAyMiAxNzowOTozMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogRG9uJ3QgYWxsb3cgaWxsZWdhbCBjb21iaW5hdGlvbnMKLQlvZiBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBPY3QgMjIgMTE6Mjg6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpOiBBZGQgZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBmaWVsZC4KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAob2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zvcm1hdF9vcHMpOiBJbml0aWFsaXplIG5ldwotCWZyb2JfZmlsZV9hZnRlcl9yZWxvY3MgZmllbGQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZm9ybWF0X29wcyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYzogVW5kZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgYmVmb3JlCi0JaW5jbHVkaW5nIG9iai1lbGYuaC4KLQotTW9uIE9jdCAyMSAxMTozODozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGNvbnNfZml4X25ld19taXBzKTogT25seSB0cmVhdCA4IGJ5dGUgcmVsb2MKLQlzcGVjaWFsbHkgaWYgbm90IEVMRi4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ182NC4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ182NC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IERvbid0IGluY3JlbWVudCB2YWx1ZSBmb3IgYSBQQwotIAlyZWxhdGl2ZSByZWxvYyB3aGVuIEJGRF9BU1NFTUJMRVIgYW5kIE9CSl9BT1VUIChtb3JlIHVnbHkgZ2FzCi0gCXJlbG9jIGhhY2tpbmcpLgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19ERUZJTkUpOiBub24gQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOgotCURvbid0IGNoZWNrIFNfR0VUX09USEVSLgotCi1GcmkgT2N0IDE4IDE0OjA2OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEFjY2VwdCBhbiBvZGQgZmxvYXRpbmcgcG9pbnQKLQlyZWdpc3RlciB3aXRoIGwucyBvciBzLnMuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfcHNldWRvX3RhYmxlKTogVXNlIG9ial9hb3V0X3R5cGUgZm9yCi0JLnR5cGUgcHNldWRvLW9wLgotCShvYmpfYW91dF90eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotVGh1IE9jdCAxNyAxNzo1NToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKE9CSlMpKTogRGVwZW5kIHVwb24gbGliaWJlcnR5LmguCi0KLVdlZCBPY3QgMTYgMTE6Mjg6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IFJlY29nbml6ZSB6ZGFvZmYsIHRkYW9mZgotCWFuZCBzZGFvZmYgZXhwcmVzc2lvbnMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIHRvIGFkZGVuZCBpZgotCVRDX1Y4NTAgYW5kIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtdjg1MC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBhbnkKLQlwYy1yZWxhdGl2ZSBmaXh1cHMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BjcmVsX2Zyb20pOiBVbmRvIHllc3RlcmRheSdzIGNoYW5nZXMuCi0JKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMTUgMjM6MTk6MDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wY3JlbF9mcm9tKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogRGVmaW5lLgotCi1Nb24gT2N0IDE0IDEzOjU5OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IEFkZCBjYXN0IHRvIG9mZnNldFQgd2hlbiB1c2luZwotCWEgY29uc3RhbnQgd2l0aCAmfi4KLQotTW9uIE9jdCAxNCAxMToyNDoyOCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IE1vdmUgRUNPRkYgZGVidWcgcHJvY2Vzc2luZyB0byAuLi4KLQkoZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiAuLi4gaGVyZS4gIE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9tX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogTmV3IG1hY3JvLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsICpmcm9iX2FmdGVyX3JlbG9jcyBhZnRlciB0aGUKLQljYWxsIHRvIHdyaXRlX3JlbG9jcy4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IFVzZSBuZXcgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMIHJlbG9jLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogRG9uJ3QgU0VUX1ZBTFVFIG9uIHRoZSBzZWN0aW9uCi0Jc3ltYm9sLCBhcyB0aGlzIG1lc3NlcyB1cCBsaW5raW5nLiAgSW5zdGVhZCwgZXhwYW5kIHRoZSByZWN1cnNpdmUgY2FsbAotCWlubGluZSBhbmQgY2hhbmdlIHVwIHRoZSBhcHByb3ByaWF0ZSBiaXRzIHRvIGdldCB0aGUgMHg4MDAwIG9mZnNldAotCWluIHRoZSByZWxvYyBhZGRlbmQuCi0KLVRodSBPY3QgMTAgMTc6MzA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpOiBQZXJtaXQgdGhlIGRpZmZlcmVuY2Ugb2YKLQl0d28gc3ltYm9scyBpbiB0aGUgc2FtZSBzZWdtZW50IHRvIGJlIGFkanVzdGVkLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGdldCBjb25mdXNlZCBieSBDUFUtVkVORE9SLWxpbnV4LWdudS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE9jdCAxMCAxNzoyMjoxOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2luc2VydF9vcGVyYW5kKTogQ2hhbmdlIG1vc3Qgd2FybmluZ3MgaW50bwotCWVycm9ycy4KLQkocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBEaXR0by4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQkocHBjX3RjKTogRGl0dG8uCi0JKHBwY19wZV9zZWN0aW9uKTogRGl0dG8uCi0JKHBwY19mcm9iX3N5bWJvbCk6IERpdHRvLgotCi1UaHUgT2N0IDEwIDEyOjA1OjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBQYXNzIGFuIGV4dHJhIHNoaWZ0IGNvdW50Ci0JdG8gbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCBiYXNlZCBvbiB0aGUgb3Bjb2RlIGZvcm1hdC4KLQkobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEFjY2VwdCBhbmQgdXNlIGV4dHJhIHNoaWZ0IGNvdW50Ci0JcGFyYW1ldGVyLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFVzZSBGTVRfKiBtYWNyb3MgZm9yCi0JZm9ybWF0cyByYXRoZXIgdGhhbiBoYXJkLWNvZGVkIGNvbnN0YW50cy4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBGb3JtYXQgRDUgaW5zdHJ1Y3Rpb25zCi0JYXJlIDcgYnl0ZXMgbG9uZy4gIFdyaXRlIG91dCBpbnN0cnVjdGlvbnMgaW4gYmlnLWVuZGlhbiBmb3JtYXQuCi0KLVR1ZSBPY3QgIDggMTQ6NTY6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFR3ZWFrIGZ1cnRoZXIgc28KLQl0aGF0IGFsbCBpbnN0cnVjdGlvbnMgYXJlIHBhcnNlZCBjb3JyZWN0bHkuCi0KLVR1ZSBPY3QgIDggMTM6MDI6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IERvbid0IGRlY2xhcmUuCi0JKiBhcy5jOiBEb24ndCBpbmNsdWRlIGxpYmliZXJ0eS5oLgotCSogZXhwci5jLCByZWFkLmMsIHN0YWJzLmMsIGNvbmZpZy9vYmotY29mZi5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IExpa2V3aXNlLgotCSogbWVzc2FnZXMuYzogTGlrZXdpc2UuCi0JKHhzdHJlcnJvcik6IERvbid0IGRlY2xhcmUuCi0JKiB4bWFsbG9jLmM6IFJlbW92ZS4KLQotTW9uIE9jdCAgNyAxNjo1MzoyMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgUmVtb3ZlLgotCShzeXN0ZW1fcmVnaXN0ZXJzLCBjY19uYW1lcyk6IExpa2V3aXNlLgotCShhZGRyZXNzX3JlZ2lzdGVycywgZGF0YV9yZWdpc3RlcnMsIG90aGVyX3JlZ2lzdGVycyk6IE5ldyByZWdpc3RlcgotCWFycmF5cy4KLQkocmVnaXN0ZXJfbmFtZSwgc3lzdGVtX3JlZ2lzdGVyX25hbWUsIGNjX25hbWUpOiBSZW1vdmUuCi0JKG1uMTAzMDBfcmVsb2NfcHJlZml4KTogTGlrZXdpc2UuCi0JKGRhdGFfcmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoYWRkcmVzc19yZWdpc3Rlcl9uYW1lLCBvdGhlcl9yZWdpc3Rlcl9uYW1lKTogTGlrZXdpc2UuCi0JKG1kX2Fzc2VtYmxlKTogUm91Z2ggY3V0IGF0IHBhcnNpbmcgb3BlcmFuZHMuICBSZW1vdmUgbG90cyBvZgotCXVud2FudGVkIGNvZGUuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEaXNhYmxlIGZvciBub3cuCi0KLU1vbiBPY3QgIDcgMTE6Mzg6MzQgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNlbGVjdF9jb250cm9sX3JlZ3MpOiBOZXcgZnVuY3Rpb24sIGV4dHJhY3RlZAotCW91dCBvZiBtNjhrX2luaXRfYWZ0ZXJfYXJncy4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgaXQuCi0JKG1yaV9jaGlwKTogVXNlIGl0IGhlcmUgYXMgd2VsbCB0byB1cGRhdGUgc2V0IG9mIGFsbG93ZWQgY29udHJvbAotCXJlZ3MgZm9yIG1vdmVjLgotCi1Nb24gT2N0ICA3IDExOjI0OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2JlZ2luKTogTmV3IGZ1bmN0aW9uLgotCShvYmpfZWxmX3NlY3Rpb24pOiBBZGQgdGhlIHNlY3Rpb24gc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfYmVnaW4pOiBEZWZpbmUuCi0JKGVsZl9iZWdpbik6IERlY2xhcmUuCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDYWxsIG9ial9iZWdpbiBpZiBpdCBpcwotCWRlZmluZWQuCi0KLUZyaSBPY3QgIDQgMTg6Mzc6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFN1YnRyYWN0IHRoZSBzZWN0aW9uIGFkZHJlc3MKLQlmcm9tIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgVENfTTY4Sy4KLQotVGh1IE9jdCAgMyAxNToxNTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBNYWtlIC51YWhhbGYsIC51YXdvcmQsIGFuZAotCS51YXh3b3JkIGF2YWlsYWJsZSBldmVuIGlmIG5vdCBPQkpfRUxGLgotCShtZF9hdG9mKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSB3b3JkUC4KLQotVGh1IE9jdCAgMyAwMDoxNjo1MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEweDAwLmMsIGNvbmZpZy90Yy1tbjEweDAwLmg6IE5ldyBmaWxlcwotCWZvciBNYXRzdXNoaXRhIE1OMTB4MDAgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG1uMTB4MDAtKi0qCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVdlZCBPY3QgIDIgMTU6NTQ6MDMgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG9iai1ldmF4Lmg6IG1vdmUgb3BlbnZtcyBkZWZpbml0aW9ucyBmcm9tIGhlcmUgdG8gdGMtYWxwaGEuYy4KLQkqIHRjLWFscGhhLmM6IGFkZCBzdXBwb3J0IGZvciB2bXNfY2FzZV9oYWNrIGxpa2UgaW4gdmF4L3Ztcy4KLQkobG9hZF9leHByZXNzaW9uKTogdHJhY2sgY2xvYmJlcmluZyBvZiBiYXNlIHJlZyBiZWZvcmUgam1wL2pzci4KLQkoc19hbHBoYV9maWxlKTogcGFzcyBjYXNlX2hhY2sgZmxhZ3MgYW5kIHNvdXJjZSBmaWxlbmFtZSB2aWEKLQlzeW1ib2wgdGFibGUgdG8gYmZkLgotCSogdGMtYWxwaGEuaCAoVENfQ09OU19GSVhfTkVXKTogZGVmaW5lCi0KLVR1ZSBPY3QgIDEgMTY6MTY6MDEgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgbWlwcy0qLWVsZiouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBPY3QgIDEgMTI6Mzc6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbWFjcm8pOiBXYXJuIGlmIGEgbWFjcm8gaGFzIHRoZSBzYW1lIG5hbWUgYXMgYQotCXBzZXVkby1vcC4KLQkoc19zcGFjZSk6IEluIG02OGsgTVJJIG1vZGUsIGFsaWduIHRvIGEgd29yZCBib3VuZGFyeS4KLQkqIG1hY3JvLmMgKGRlZmluZV9tYWNybyk6IEFkZCBuYW1lcCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkqIG1hY3JvLmggKGRlZmluZV9tYWNybyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkocGFyc2VfYXJncyk6IENoYW5nZSB2ZXJzaW9uIHByaW50aW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VCi0Jc3RhbmRhcmRzLgotCSogZ2FzcC5jIChzaG93X3VzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogQ2hhbmdlIHZlcnNpb24gcHJpbnRpbmcgdG8gbWF0Y2ggY3VycmVudCBHTlUgc3RhbmRhcmRzLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogQ29ycmVjdCBhY2Nlc3MgY29udHJvbCB1bml0Ci0JcmVnaXN0ZXIgbnVtYmVycy4gIEZyb20gS2VuIFJvc2UgPHJvc2VAbmV0Y29tLmNvbT4uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGQgc29tZSBzdGF0aWMgZnVuY3Rpb24gcHJvdG90eXBlcy4KLSAJKGFscGhhX21hY3Jvcyk6IE1vdmUgdG8gdG9wIG9mIGZpbGUuICBNYWtlIHN0YXRpYy4KLQkoYWxwaGFfbnVtX21hY3Jvcyk6IE1vdmUgdG8gdG9wIG9mIGZpbGUuCi0KLVR1ZSBPY3QgIDEgMDk6MzY6MTkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdGMtdjg1MC5oOiAgRGVmaW5lIExPQ0FMX0xBQkVMIHRvIHJlY29nbmlzZSBfLkxfKiBzeW1ib2xzCi0JZ2VuZXJhdGVkIGJ5IERXQVJGLgotCi1TYXQgU2VwIDI4IDAzOjM4OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IFJlbW92ZSBib2d1cyBjb2RlIGluIEJGRDY0IGNhc2UsCi0JYW5kIGp1c3QgY2FsbCBzcHJpbnRmX3ZtYS4KLQotVGh1IFNlcCAyNiAxNjowNDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoZXhwcik6IENoYW5nZSA+Pj0gdG8gPj4gKGZpeCB0eXBvKS4gIChGcm9tIG1laXNzbmVyKS4KLQotVHVlIFNlcCAyNCAxOTowNTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZmxvYXRfY29ucyk6IENhbGwgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgaWYgaXQgaXMKLQlkZWZpbmVkLgotCi1UdWUgU2VwIDI0IDEyOjIyOjE4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9vcGVyYW5kKTogQ3JlYXRlZC4gIEFsbG93cyBvcGVyYW5kcyB0byAKLQlzdGFydCB3aXRoICcjJy4KLQkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX29wZXJhbmQpOiBVbmRlZmluZWQuCi0KLU1vbiBTZXAgMjMgMTI6MTM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChhZGRfZml4KTogVHJlYXQgYSB3aWR0aCBvZiAnMycgbGlrZSAnQicuCi0JKG1kX2Fzc2VtYmxlKTogQSBmaXh1cCB3aWR0aCBvZiAnMycgbWVhbnMgYSAxIGJ5dGUgcmVsb2MuCi0KLVRodSBTZXAgMTkgMTI6MjE6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkanVzdCBQQyByZWxhdGl2ZQotCXJlbG9jIGZvciB0aGUgaTk2MCBmb3IgYSByZWxvYyBpbiB0aGUgc2FtZSBzZWN0aW9uLiAgVGhpcyB1bmRvZXMKLQlvbmUgb2YgdGhlIHR3byBjaGFuZ2VzIG1hZGUgQXVnIDE5LgotCi1XZWQgU2VwIDE4IDEyOjExOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogQm90aCB2ZXJzaW9uczogTW92ZSBDX1NUQVQKLQlzeW1ib2xzIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi1Nb24gU2VwIDE2IDExOjQxOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChleHByKTogQWx3YXlzIHVzZSB1bnNpZ25lZCByaWdodCBzaGlmdHMgZm9yID4+LgotCi1UaHUgU2VwIDEyIDEwOjI1OjQ1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogVXBkYXRlIHR3byB0aHVtYiBpbnN0cnVjdGlvbgotIAlzbG90cyB3aGVuIHByb2Nlc3NpbmcgQkwgZml4dXBzLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG91dHB1dF9pbnN0KTogRW5zdXJlIFRodW1iIEJMIGZpeHVwIGlzIG1hcmtlZAotIAlvbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBTZXAgMTEgMDA6MDk6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogQ3JlYXRlIGFuIGV4cHJlc3Npb24gc3ltYm9sIGZvciBhIGNvbXBsZXgKLQlzdGFicyBleHByZXNzaW9uLCByYXRoZXIgdGhhbiBnaXZpbmcgYW4gZXJyb3IuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX25ld19maWxlKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgYXJlIHN0aWxsIGluCi0JdGhlIHNhbWUgZmlsZS4KLQotVHVlIFNlcCAxMCAxMTo0NTozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRmlsbCBpbiB0aGUgdmFsdWUgZm9yIGEgY29uc3RhbnQKLQlqdW1wLCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIHJlbG9jLgotCi1Nb24gU2VwICA5IDEwOjU3OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGFuIGluc3RydWN0aW9uIHdoaWNoCi0Jc2V0cyBhIGNvbmRpdGlvbiBjb2RlIHdpdGggYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcyBhIGNvbmRpdGlvbgotCWNvZGUuCi0JKG1pcHNfaXApOiBJbiBjYXNlcyAnTicgYW5kICdNJywgbG9vayBmb3IgJGZjY04gcmF0aGVyIHRoYW4gYW4KLQlpbW1lZGlhdGUgdmFsdWUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogUmVjb2duaXplIHI1MDAwIGZvciBjcHUuCi0JKG1pcHNfaXApOiBHaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgaWYgdGhlIElTQSBsZXZlbCBpcyB3cm9uZy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1tY3B1PVt2XVtyXTUwMDAuCi0KLVNhdCBTZXAgIDcgMTM6MjU6NTUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChDT1VOVF9UT1BfWkVST0VTKTogQWRkZWQgbWFjcm8gdG8gY291bnQKLSAJbGVhZGluZyB6ZXJvZXMuCi0JKGxvYWRfcmVnaXN0ZXIpOiBFbnN1cmUgaGkzMiBiaXRzIGFyZSBub3QgbG9zdCBkdXJpbmcgbG8zMmJpdAotIAlwcm9jZXNzaW5nLiBGaXggc2hpZnQgb2Zmc2V0IHRoYXQgd2FzIG92ZXJmbG93aW5nIGludG8gdGhlIG5leHQKLSAJaW5zdHJ1Y3Rpb24gZmllbGQuIEFkZCBjb2RlIHRvIGdlbmVyYXRlIHNob3J0ZXIgc2VxdWVuY2VzIGZvcgotIAljb25zdGFudHMgd2l0aCBhIHNpbmdsZSBjb250aWd1b3VzIHNlcWV1ZW5jZSBvZiBvbmVzLgotCi1GcmkgU2VwICA2IDE3OjA3OjEyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChkMTB2X2RvdF93b3JkKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQKLQkiQHdvcmQiIHdpdGggdGhlIHdvcmQgcHNldWRvLW9wLgotCShtZF9hcHBseV9maXgzKTogQ2xlYW51cCBhbmQgY2hhbmdlcyB0byBzdXBwb3J0IGNvcnJlY3Qgc2l6ZXMKLQlmb3IgMTYgYW5kIDE4LWJpdCByZWxvY3MuCi0KLUZyaSBTZXAgIDYgMTY6MDA6MjkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYy0qLWFvdXQpOiBTZXQgYGVtJy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcvdGUtc3BhcmNhb3V0Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCUlmZGVmIFRFX1NQQVJDT1VUIGRlZmluZSBUQVJHRVRfRk9STUFUIGFuZCBTUEFSQ19CSUVORElBTi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChJTlNOX0JJR19FTkRJQU4pOiBOZXcgbWFjcm8uCi0JKFNQRUNJQUxfQ0FTRV97U0VUU1csU0VUWH0pOiBEZWZpbmUuCi0JKHtOT1AsT1IsRk1PVlMsU0VUSEksU0xMWCxTUkF9X0lOU04pOiBEZWZpbmUuCi0JKG1kX2JlZ2luKTogRGVsZXRlIHNldHRpbmcgb2YgYHRhcmdldF9iaWdfZW5kaWFuJy4KLQkob3V0cHV0X2luc24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogUmV3cml0ZS4gIEFkZCBgc2V0eCcgc3VwcG9ydC4KLQkoc3BhcmNfaXApOiBIYW5kbGUgYDAnIG9wZXJhbmQgY2hhci4gIFJlY29nbml6ZSBzZXR1dywgc2V0c3csIHNldHgKLQlzcGVjaWFsIGNhc2VzLgotCShtZF9hdG9mKTogQWRkIGxpdHRsZSBlbmRpYW4gc3VwcG9ydC4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogTGlrZXdpc2UuCi0JKG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCShtZF9sb25nb3B0cyk6IFJlY29nbml6ZSAtRUwsLUVCIGlmZGVmIFNQQVJDX0JJRU5ESUFOLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkobWRfc2hvd191c2FnZSk6IFByaW50IC1FTCwgLUVCIGlmZGVmIFNQQVJDX0JJRU5ESUFOLgotCi1UaHUgU2VwICA1IDEzOjQwOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfbmV3X2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5oIChlY29mZl9uZXdfZmlsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9hcHBfZmlsZSk6IERlZmluZS4KLQotVGh1IFNlcCAgNSAxMzozOToyNSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IEJpYXMgdGhlIC5saXQ4IHNlY3Rpb24KLQlzeW1ib2wgYnkgMzJrIHNvIHRoYXQgb3VyIDE2LWJpdCBzaWduZWQgb2Zmc2V0IGNhbiBhZGRyZXNzIHRoZQotCWVudGlyZSBjaHVuay4gIFJlcG9ydGVkIGJ5IDxtYXR0QGxrZy5kZWMuY29tPi4KLQotV2VkIFNlcCAgNCAxMDoyMzoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRtcC4KLQotV2VkIFNlcCAgNCAxMToyNDoyOSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZW1vdmUgdW5uZWNlc3NhcnkgY29kZSB0aGF0Ci0gCXdhcyBjYXVzaW5nIHRoZSBoaWdoIDMyYml0cyBvZiA2NGJpdCBjb25zdGFudHMgdG8gYmUgbG9zdC4KLQkKLVR1ZSBTZXAgIDMgMTM6NTI6NTYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEFkZGVkIGNoYW5nZXMgdG8gc3VwcG9ydCBmdW5jdGlvbgotCXBvaW50ZXJzIGFuZCAiQHdvcmQiIHN5bnRheC4KLQotVHVlIFNlcCAgMyAxMTo1NzoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBjb21tZW50ZWQgb3V0IGFuZCAjaWYgMCdkIGNvZGUuCi0JKHY4NTBfcmVsb2NfcHJlZml4KTogUHJvdmlkZSBwcm90b3R5cGUuCi0JKHBvc3RmaXgsIGdldF9yZWxvYywgYnVpbGRfaW5zbik6IFJlbW92ZSBwcm90b3R5cGVzIGZvciBub25leGlzdGFudAotCWZ1bmN0aW9ucy4KLQkobWRfYmVnaW4sIG1kX2Fzc2VtYmxlLCBtZF9hcHBseV9maXgzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKG1kX2Fzc2VtYmxlKTogQWRkIGRlZmF1bHQgdG8gY2FzZSBzdGF0ZW1lbnQuCi0KLVNhdCBBdWcgMzEgMTY6MDM6MDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvbXB1dGUgc2l6ZSBvZiB0aGUgaW5zdHJjdGlvbgotCWZyb20gdGhlIG9wY29kZS4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXBwbHlfZml4Myk6IERvIHNpbXBsZSBieXRlLCBzaG9ydCBhbmQKLQl3b3JkIGZpeHVwcyB0b28uCi0KLUZyaSBBdWcgMzAgMjM6NTA6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hcHBseV9maXgzKTogVXNlIGxpdHRsZSBlbmRpYW4gZ2V0L3B1dAotCXJvdXRpbmVzIHRvIGZldGNoL3N0b3JlIHRoZSB1cGRhdGVkIGluc3RydWN0aW9uIGZyb20vdG8gbWVtb3J5LgotCSh2ODUwX2luc2VydF9vcGVyYW5kKTogSWYgdGhlIG9wZXJhbmQgaGFzIGEgc3BlY2lhbGl6ZWQgaW5zZXJ0Ci0Jcm91dGluZSwgY2FsbCBpdC4KLQotRnJpIEF1ZyAzMCAxODozNToyNiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAocmVnX25hbWVfc2VhcmNoKTogQWxpZ24gY2FsbGluZyBjb252ZW50aW9uIHRvCi0gCWJlIGxpa2UgaWRlbnRpY2FsIGZ1bmN0aW9uIGZvdW5kIGluIHRjLXBwYy5jLgotCShnZXRfcmVsb2MpOiBSZW1vdmVkLgotCSh2ODUwX3JlbG9jX3ByZWZpeCk6IE5ldyBmdW5jdGlvbiwgcGFyc2UgbG8oKSwgaGkoKSBhbmQgaGkwKCkuCi0JKG1kX2Fzc2VtYmxlKTogZW1pdCBmaXh1cHMuCi0JKG1kX3BjcmVsX2Zyb20pOiByZW5hbWVkIGZyb20gbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBlbWl0IHByb3BlcgotIAlkaXNwbGFjZW1lbnQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBoYW5kbGUgZml4dXBzL3JlbG9jcy4KLQkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IFJlbW92ZWQgZGVmaW5pdGlvbi4KLQkKLUZyaSBBdWcgMzAgMTg6MTI6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIFNIIEVMRiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluIChzaC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL3RjLXNoLmggKFRBUkdFVF9BUkNIKTogRGVmaW5lLgotCShXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotIAkoVENfQ09GRl9GSVgyUlRZUEUpOiBPbmx5IGRlZmluZSBpZiBPQkpfQ09GRi4KLQkoQkZEX0FSQ0gsIENPRkZfTUFHSUMsIFRDX0NPVU5UX1JFTE9DKTogTGlrZXdpc2UuCi0JKFRDX1JFTE9DX01BTkdMRSwgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogTGlrZXdpc2UuCi0JKERPX05PVF9TVFJJUCwgTkVFRF9GWF9SX1RZUEUsIFRDX0tFRVBfRlhfT0ZGU0VUKTogTGlrZXdpc2UuCi0JKFRDX0NPRkZfU0laRU1BQ0hERVAsIHRjX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgotCShTVUJfU0VHTUVOVF9BTElHTik6IExpa2V3aXNlLgotCShSRUxPQ18zMik6IERvbid0IGRlZmluZS4KLQkodGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWZpbmUgaWYgQkZEX0FTU0VNQkxFUi4KLQkodGFyZ2V0X2JpZ19lbmRpYW4pOiBEZWNsYXJlIGlmIE9CSl9FTEYuCi0JKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1zaC5jOiBVc2UgQkZEIHJlbG9jIGNvZGVzIGluc3RlYWQgb2YgU0ggQ09GRiByZWxvYwotCW51bWJlcnMgdGhyb3VnaG91dC4KLQkodGNfY3Jhd2xfc3ltYm9sX2NoYWluKTogT25seSBkZWZpbmUgaWYgT0JKX0NPRkYuCi0JKHRjX2hlYWRlcnNfaG9vaywgdGNfY29mZl9zaXplbWFjaGRlcCk6IExpa2V3aXNlLgotCShzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzKTogRGVmaW5lLgotCShzaF9jb3VudF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jc2hfZnJvYl9maWxlLiAgQWRkIEJGRF9BU1NFTUJMRVIgY29kZS4KLQkoc2hfZnJvYl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHNoX2Zyb2JfZmlsZSk6IENhbGwgc2hfZnJvYl9zZWN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBJZiBCRkRfQVNTRU1CTEVSLCBjaGFuZ2UgdHlwZSBvZiBoZWFkZXJzLCBhbmQKLQljYWxsIHNlY3Rpb25fc3ltYm9sIHJhdGhlciB0aGFuIHNlZ19pbmZvIChzZWcpLT5kb3QuCi0JKG1kX3NlY3Rpb25fYWxpZ24pOiBBZGQgT0JKX0VMRiB2ZXJzaW9uLgotCShTV0lUQ0hfVEFCTEVfQ09OUyk6IERlZmluZS4KLQkoU1dJVENIX1RBQkxFKTogVXNlIFNXSVRDSF9UQUJMRV9DT05TLgotCShtZF9hcHBseV9maXgpOiBDaGFuZ2UgcGFyYW1ldGVyIHR5cGVzIGlmIEJGRF9BU1NFTUJMRVIuICBPbmx5Ci0JaGFuZGxlIGZ4X3JfdHlwZSA9PSAwIGlmIG5vdCBCRkRfQVNTRU1CTEVSLiAgUmV0dXJuIDAgaWYKLQlCRkRfQVNTRU1CTEVSLgotCShzdHJ1Y3QgcmVsb2NfbWFwKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCShjb2ZmX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IFVzZSBjb2ZmX3JlbG9jX21hcCB0byBjb252ZXJ0IGZ4X3JfdHlwZS4KLQkodGNfZ2VuX3JlbG9jKTogTmV3IGZ1bmN0aW9uIGlmIEJGRF9BU1NFTUJMRVIuCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJZmRlZiBvdXQgZnhfd2hlcmUgdGVzdCB3aGljaCB0cmlnZ2VycwotCWluYXBwcm9wcmlhdGVseSBmb3IgU0ggRUxGLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgYW5kCi0Jb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IGlmIHRoZXkgYXJlIGRlZmluZWQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIEJGRF9SRUxPQ18xNiwgbm90Ci0JQkZEX1JFTE9DX05PTkUsIHdoZW4gY2FsbGluZyBmaXhfbmV3X2V4cCBmb3IgYSBicm9rZW4gd29yZC4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBGaXggY29udmVyc2lvbiBvZiBieXRlIGNvdW50IHRvIEJGRCByZWxvYwotCWNvZGUuCi0KLUZyaSBBdWcgMzAgMTQ6NDc6MzggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogRml4IHByb2JsZW0gd2l0aCBjYWxjdWxhdGluZyAKLQlicmFuY2ggc2l6ZXMgaW4gYWNyb3NzIHNlY3Rpb25zLgotCi1GcmkgQXVnIDMwIDAwOjQ0OjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLTg1MC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBoaSgpIGNvcnJlY3RseS4gIEhhbmRsZQotCWhpMCgpIHRvby4KLQotV2VkIEF1ZyAyOCAyMzoxMTowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2JlZ2luKTogRGVhbCB3aXRoIGVuZCBvZiBvcGNvZGUKLQl0YWJsZSBtYXJrZXIuCi0KLVdlZCBBdWcgMjggMTk6MjA6MDQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogRml4IGEgYnVnIHdoaWNoIGNvdWxkIGdlbmVyYXRlCi0JdGhlIHdyb25nIG9wY29kZSBmb3IgY2FzZXMgbGlrZSBzdDJ3IHdoZXJlIHRoZXJlIGFyZSBtYW55IGZvcm1zCi0Jb2YgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBBdWcgMjcgMTM6NTM6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBtZF9wYXJzZV9uYW1lIGlzIGRlZmluZWQsIGNhbGwgaXQgYmVmb3JlCi0JY2FsbGluZyBzeW1ib2xfZmluZF9vcl9tYWtlLgotCSogY29uZmlnL3RjLXBwYy5oIChtZF9wYXJzZV9uYW1lKTogRGVmaW5lLgotCShwcGNfcGFyc2VfbmFtZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtcHBjLmMgKHJlZ19uYW1lX3NlYXJjaCk6IEFkZCByZWdzIGFuZCByZWdjb3VudAotCXBhcmFtZXRlcnMuCi0JKHJlZ2lzdGVyX25hbWUpOiBVcGRhdGUgY2FsbCB0byByZWdfbmFtZV9zZWFyY2guCi0JKGNyX29wZXJhbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjcl9uYW1lcyk6IE5ldyBzdGF0aWMgY29uc3QgYXJyYXkuCi0JKHBwY19wYXJzZV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IElmIFBQQ19PUEVSQU5EX0NSIGlzIHNldCBpbiB0aGUgb3BlcmFuZCBmbGFncywgc2V0Ci0JY3Jfb3BlcmFuZCBiZWZvcmUgY2FsbGluZyBleHByZXNzaW9uLgotCi1UdWUgQXVnIDI3IDA5OjA1OjUwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogQWRkIG5ldyBhcmd1bWVudCB0bwotCWhwcGFfZ2VuX3JlbG9jX3R5cGUgY2FsbC4KLQotTW9uIEF1ZyAyNiAxODoyNDo1MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4ZWQgIi53b3JkIi4gIEZpeGVkIHByb2JsZW0gd2l0aCByYW5nZSBjaGVja2luZwotCW9uIGFkZHJlc3Nlcy4gIEltcHJvdmVkIGVycm9yIG1lc3NhZ2VzLgotCSogZG9jL2MtZDEwdi50ZXhpOiBBZGRlZCBkb2NzIGZvciByZWdpc3RlciBwYWlycy4KLQotTW9uIEF1ZyAyNiAxMzozOToyNyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBGaXggYnVnIGluIHBhcmFsbGVsIAotCWNoZWNraW5nIGNvZGUuCi0KLU1vbiBBdWcgMjYgMTQ6Mzg6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChpbml0X2ZpbGUpOiBJbml0aWFsaXplIGZNZXJnZSB0byAxLgotCShhZGRfZmlsZSk6IFJlc3RvcmUgb2xkIGZpbGUgbWVyZ2luZyBjb2RlLCBidXQgb25seSBtZXJnZSBmaWxlcyBpZgotCWZNZXJnZSBpcyBzZXQuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9sb2MpOiBDbGVhciBmTWVyZ2UgZmllbGQgb2YgY3VycmVudCBmaWxlLgotCShlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogTGlrZXdpc2UuCi0KLUZyaSBBdWcgMjMgMTE6NDA6NDcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWQxMHYudGV4aTogRml4IHR5cG8uIAotCi1GcmkgQXVnIDIzIDEwOjQxOjMyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0IGJpdCBtYXNraW5nIGZvcgotCWhpIGFuZCBsbyBleHByZXNzaW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBSb3VnaCBjdXQgYXQgZGVtYW5kaW5nCi0JImVwIiBvciAicjMwIiBpbiBzc3QgYW5kIHNsZCBpbnN0cnVjdGlvbnMuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBhYm9ydC4gIEp1c3Qgd2FybiB0aGF0IHdlIGRvbid0Ci0JaGF2ZSByZWxvY3MgeWV0LgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChDQ19OQU1FX0NOVCk6IERlZmluZS4KLQkoY2NfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgVjg1MF9PUEVSQU5EX0NDIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBmb3JnZXQgdG8gaW5pdGlhbGl6ZQotCSJpbnNuIiEKLQotCSogY29uZmlnL3RjLXY4NTAuYyAocmVnX25hbWVfc2VhcmNoKTogR2VuZXJhbGl6ZSB0byBzZWFyY2gKLQlhbnkgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUuCi0JKHJlZ2lzdGVyX25hbWUpOiBQYXNzIGFwcHJvcHJpYXRlIHRhYmxlIGFuZCBzaXplIHRvIHJlZ19uYW1lX3NlYXJjaC4KLQkoc3lzdGVtX3JlZ2lzdGVyX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKFNZU1JFR19OQU1FX0NOVCk6IERlZmluZS4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgb3BlcmFuZHMgd2hpY2ggYXJlIHN5c3RlbSByZWdpc3RlcnMuCi0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IElmIHdlIGZpbmQgYSByZWdpc3RlciwgYnV0IHRoZQotCW9wY29kZSBkb2Vzbid0IHdhbnQgYSByZWdpc3RlciwgdGhlbiB3ZSBkb24ndCBoYXZlIGEgbWF0Y2guCi0JKG1kX2Fzc2VtYmxlKTogR2V0IHNpemUgb2YgdGhlIGluc3RydWN0aW9uIGZyb20gdGhlIG9wY29kZSB0YWJsZS4KLQotVGh1IEF1ZyAyMiAxMDoyMDozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuCi0JKGFzLm5ldyk6IFVzZSAkKEhMREVOVikuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZik6IEF2b2lkIGEgZGl2aXNpb24gYnkgemVybyBlcnJvcgotCWlmIGFuIGFycmF5IGRpbWVuc2lvbiBpcyBub3Qga25vd24uCi0KLVRodSBBdWcgMjIgMTA6NTA6MDAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeCBhIHJlbG9jIGJ1ZyBjYXVzZWQgYnkgbXkgbGFzdCBjaGFuZ2UuIAotCSogZG9jL2MtZDEwdi50ZXhpOiBDbGVhbnVwLgotCQotVHVlIEF1ZyAyMCAxNToxNToxNiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtdjg1MC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZSAodjg1MC0qLWVsZik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKHY4NTAtKi1lbGYpOiBOZXcgdGFyZ2V0LgotCQotV2VkIEF1ZyAyMSAxNTo1MDo1NCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtZDEwdi50ZXhpOiBOZXcgZmlsZS4KLQkqIGRvYy9hbGwudGV4aTogQWRkZWQgRDEwViBzdHVmZi4KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGRlZCBEMTBWIHN0dWZmLgotCi1UdWUgQXVnIDIwIDE0OjEwOjAyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBbGwgcmVmZXJlbmNlcyB0byBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkCi0gCW5vdyB1c2UgdGhlIG9wdGltYWwgaW5zdHJ1Y3Rpb24uICAuZmxvYXQgYW5kIC5kb3VibGUgbm93IHdvcmsuIAotCi1Nb24gQXVnIDE5IDE0OjQxOjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBBZGp1c3QgUEMgcmVsYXRpdmUgcmVsb2MgYnkKLQlzZWN0aW9uIGFkZHJlc3MgZm9yIHRoZSBpOTYwIGFzIGlzIGRvbmUgZm9yIHRoZSBpMzg2LgotCi1UaHUgQXVnIDE1IDE2OjM3OjU5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIHdpbGRjYXJkcyBmb3IgY29uZmlnIG1hdGNoaW5nLCBhZGQgbWlwcy0qLSoKLQljYXNlLCBmb3J3YXJkLWluY2x1ZGUgYmZkL2VsZi1iZmQuaC4KLQotVGh1IEF1ZyAxNSAxMzoyNDozMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIG9wY29kZQotICAgICAgICB0YWJsZSB0byBoZWxwIGRldGVybWluaW5lIHdoaWNoIGluc3RydWN0aW9ucyBjYW4gYmUgZG9uZQotICAgICAgICBpbiBwYXJhbGxlbC4gCi0KLVRodSBBdWcgMTUgMTc6MDE6MzEgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IE1ham9yIGNoYW5nZXMgdG8gYWRkIFRodW1iIHN1cHBvcnQsIHdpdGggbG90cwotIAlvZiBjaGFuZ2UgaW5wdXQgZnJvbSA8cmVhcm5zaGFAYXJtbHRkLmNvLnVrPi4KLQlSZXZlcnRlZCB0byBJTlNOX1NJWkUgbWFjcm8sIHJhdGhlciB0aGFuIGluc25fc2l6ZSB2YXJpYWJsZS4KLQkoaW5zbnMpOiBBZGRlZCBBUk0gImJ4IiBpbnN0cnVjdGlvbiBzdXBwb3J0LgotCSh0aW5zbnMpOiBBZGRlZCBUaHVtYiBpbnN0cnVjdGlvbiBkZWZpbml0aW9uIHN0cnVjdHVyZS4KLQkoYXJtX3RvcHNfaHNoKTogQWRkZWQgaGFzaCBzdHJ1Y3R1cmUgZm9yIFRodW1iIG9wY29kZXMuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZGVkICIuYXJtIiwgIi50aHVtYiIgYW5kICIuY29kZSIgcHNldWRvLW9wcy4KLQkob3Bjb2RlX3NlbGVjdCxzX2FybSxzX3RodW1iLHNfY29kZSk6IEFkZGVkLgotCShkZWNvZGVfc2hpZnQpOiBBbGxvdyB1cHBlci1jYXNlIFJSWC4KLQkoZG9fbGRzdCk6IFNpbXBsZXIgaGFsZndvcmQgc3VwcG9ydC4KLQkoZG9fbGRtc3RtKTogSW1wcm92ZWQuCi0JKHJlZ19saXN0LCBkb19ieCwgdGh1bWJfcmVnLCB0aHVtYl9hZGRfc3ViLCB0aHVtYl9zaGlmdCwKLSAJdGh1bWJfbW92X2NvbXBhcmUsIHRodW1iX2xvYWRfc3RvcmUsIGRvX3RfYXJpdCwgZG9fdF9hZGQsCi0gCWRvX3RfYXNyLCBkb190X2JyYW5jaCwgZG9fdF9ieCwgZG9fdF9jb21wYXJlLCBkb190X2xkbXN0bSwKLSAJZG9fdF9sZHJiLCBkb190X2xkcmgsIGRvX3RfbGRzLCBkb190X2xzbCwgZG9fdF9sc3IsIGRvX3RfbW92LAotIAlkb190X3B1c2hfcG9wLCBkb190X3N0ciwgZG9fdF9zdHJiLCBkb190X3N0cmgsIGRvX3Rfc3ViLCBkb190X3N3aSwKLSAJZG9fdF9hZHIpOiBBZGRlZC4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfQVJNX1RIVU1CXyogcmVsb2NhdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbXRodW1iLgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlZCB0byByZWZsZWN0IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLgotCShhcm1fZGF0YV9pbl9jb2RlLCBhcm1fY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKTogQWRkZWQuCi0JKiBjb25maWcvdGMtYXJtLmg6IFByb3ZpZGUgVENfRklYX1RZUEUgdG8gYWxsb3cgcHJpdmF0ZSBBUk0KLSAJZnJhZ21lbnQgaW5mb3JtYXRpb24gdG8gYmUgaGVsZC4KLQotVGh1IEF1ZyAxNSAxNjoxMjowMCAxOTk2ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIHRjLWFybS5jIChtZF9hcHBseV9maXgzKTogQWxzbyBzZXQgZml4UC0+ZnhfZG9uZSBpZiBmeF9hZGRzeSBpcyAKLQlub24tbnVsbCwgYnV0IGlzIGEgY29uc3RhbnQuCi0JKGZpeF9uZXdfYXJtKTogQ2FsbCBtYWtlX2V4cHJfc3ltYm9sIHRvIG1ha2UgdGhlIGV4cHJlc3Npb24gc3ltYm9sCi0Jc28gdGhhdCBlcnJvciByZXBvcnRpbmcgd2lsbCB3b3JrIGNvcnJlY3RseS4KLQotV2VkIEF1ZyAxNCAxMDozNzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzCi0JYWdhaW5zdCB3ZWFrIHN5bWJvbHMuCi0KLVR1ZSBBdWcgMTMgMTc6Mzk6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKFRDX0ZPUkNFX1JFTE9DVElPTik6IERlZmluZSBpZiBPQkpfWENPRkYuCi0JKHBwY19mb3JjZV9yZWxvY2F0aW9uKTogRGVjbGFyZSBpZiBPQkpfWENPRkYuCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uIGlmCi0JT0JKX1hDT0ZGLgotCi1Nb24gQXVnIDEyIDE2OjQ5OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoQllURV9PUkRFUik6IERvbid0IGRlZmluZS4gIE5vIGxvbmdlciB1c2VkLgotCi1GcmkgQXVnICA5IDE3OjQ4OjI4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXggcHJvYmxlbSB3aXRoIHJlbG9jcy4gCi0KLUZyaSBBdWcgIDkgMTQ6MTY6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBJZiBub3QgQkZEX0FTU0VNQkxFUiwgYWx3YXlzIGFsaWduCi0Jd2l0aCBub3BzIGlmIG5vdCBpbiBkYXRhX3NlY3Rpb24gb3IgYnNzX3NlY3Rpb24uCi0KLVRodSBBdWcgIDggMTI6MzI6NTYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQlBZGQgc3VwcG9ydCBmb3Igb3BlblZNUy9BbHBoYS4KLQkqIGFzLmggKFBSSU5URl9MSUtFKTogRG9uJ3QgZGVmaW5lIGlmIFZNUywgZm9yIG5vdy4KLQkqIGNvbmZpZy9vYmotZXZheC5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotZXZheC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGQgc3VwcG9ydCBmb3IgRVZBWCBmb3JtYXQgaWYgT0JKX0VWQVggaXMKLQlkZWZpbmVkLgotCSogY29uZmlnL3RjLWFscGhhLmg6IEFkZCBzdXBwb3J0IGZvciBFVkFYIGZvcm1hdCBpZiBPQkpfRVZBWCBpcwotCWRlZmluZWQuICBBZGQgY2FzZSBmb3IgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIuCi0JKiBjb25maWcvdm1zLWEtY29uZi5oOiBOZXcgZmlsZS4KLQkqIGNvbmYtYS1nYXMuY29tOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHRhcmdldCBhbHBoYS0qLSp2bXMqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbWFrZWZpbGUudm1zOiBOZXcgZmlsZS4KLQkqIHJlYWQuYyAoc19sY29tbSk6IEFsaWduIGJzc19zZWcgb24gOCBieXRlIGJvdW5kYXJ5IGlmIE9CSl9FVkFYLgotCURvbid0IGNhbGwgZmZzIG9uIG9wZW5WTVMvQWxwaGEuCi0KLVdlZCBBdWcgIDcgMTQ6MTk6MDMgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIEdBU19DSEVDS19ERUNMX05FRURFRCBpbmNsdWRlIDxzdHJpbmcuaD4gb3IKLQk8c3RyaW5ncy5oPiBpZiB0aGV5IGV4aXN0LiAgQ2FsbCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQgb24gc3Ryc3RyCi0JYW5kIHNicmsuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KLQkoTkVFRF9ERUNMQVJBVElPTl9TQlJLKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWJ1aWxkLgotCSogYXMuaDogT25seSBpbmNsdWRlIDxzdHJpbmdzLmg+IGlmIEhBVkVfU1RSSU5HU19ILgotCShzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgotCSogYXMuYzogSWYgSEFWRV9TQlJLIGFuZCBORUVEX0RFQ0xBUkFUSU9OX1NCUkssIGRlY2xhcmUgc2Jyay4KLQotV2VkIEF1ZyAgNyAxMTo1MDoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24KLQlieSBhIGNvbnN0YW50IGJlZm9yZSBlbnRlcmluZyB0aGUgbWFpbiBzd2l0Y2guICBSZWplY3QgYXR0ZW1wdHMgdG8KLQlhcHBseSBhbiBhcml0aG1ldGljIGZ1bmN0aW9uIHRvIG5vbi1hYnNvbHV0ZSBzeW1ib2xzLCBleGNlcHQgZm9yCi0JdGhlIHNwZWNpYWwgY2FzZSBvZiBzdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scyBpbiB0aGUgc2FtZQotCXNlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEbyBhbGlnbiBpZiBPQkpfRUxGLCBidXQKLQlub3QgdG8gbW9yZSB0aGFuIGEgMTYgYnl0ZSBib3VuZGFyeS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfZ2VuX3JlbG9jKTogQWNjZXB0IGFsbCByZWxvY3M7IHJlbW92ZQotCSNpZm5kZWYgT0JKX0VMRiBsaW5lcy4gIEZyb20gRXJpYyBWYWxldHRlIDx2YWxldHRlQGNyZi5jYW5vbi5mcj4uCi0JKHRjX2dlbl9yZWxvYyk6IElmIG91dCBvZiBtZW1vcnkgY2FsbCBhc19mYXRhbCByYXRoZXIgdGhhbgotCWFzc2VydC4gIElmIG5vIGhvd3RvIGZvdW5kLCBjYWxsIGFzX2JhZF93aGVyZSByYXRoZXIgdGhhbgotCWFzX2ZhdGFsLiAgQ2hhbmdlIHRoZSBlcnJvciBtZXNzYWdlIHNsaWdodGx5LiAgU2V0IGhvd3RvIHRvIGEKLQlub24tTlVMTCB2YWx1ZSBpbiBvcmRlciB0byBrZWVwIGdvaW5nLgotCi1UdWUgQXVnICA2IDEyOjU4OjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBZGRlZCBjb2RlIHRvIHN1cHBvcnQgMzItYml0IGZpeHVwcyBmb3Igc3RhYnMuCi0KLVR1ZSBBdWcgIDYgMTE6MTU6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X3NwZWNpZmljKTogTmV3IG9wZXJhbmQgInNpemUiIGRlcml2ZWQKLQlmcm9tICIuYiIsICIudyIgYW5kICIubCIgZXh0ZW5zaW9ucy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuICBJZgotCXRoZSBiYXNlIGluc3RydWN0aW9uIGhhcyBubyBvcGVyYW5kcywgdGhlbiB1c2UgdGhlIHNpemUgdG8KLQlkZXRlcm1pbmUgd2hpY2ggc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gdG8gdXNlLgotCi1Nb24gQXVnICA1IDE0OjIxOjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobWVtX2ZtdCk6IENhbGwgcGFyc2VfZXhwciBiZWZvcmUgZW1pdC4KLQotRnJpIEF1ZyAgMiAxMToyMzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEb24ndCBjaGFuZ2UgYWRkciBpZgotCU9CSl9FTEYuCi0KLVRodSBBdWcgIDEgMjM6NTE6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlcy4KLQkKLVdlZCBKdWwgMzEgMTQ6NDY6MTEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IERpc2FibGUgcmFuZ2UgY2hlY2tpbmcgb24gMTYtYml0IHZhbHVlcy4KLQotV2VkIEp1bCAzMSAxNjoyNzoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBTZXQgb2tfYXJjaCBmb3IgZXZlcnkgaW5zdHJ1Y3Rpb24sCi0Jbm90IGp1c3QgdGhlIG9uZXMgdGhhdCBkb24ndCBtYXRjaC4KLQotV2VkIEp1bCAzMSAxMTo0NToxNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4ZWQgYnVncyBpbiBzaG9ydCByZWxvY3MgYW5kIHJhbmdlIGNoZWNraW5nLgotCi1XZWQgSnVsIDMxIDE1OjQxOjQyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFybS5jOiBDaGFuZ2VkIElOU05fU0laRSB0byB2YXJpYWJsZSBpbnNuX3NpemUsIGFzCi0gCXByZS1jdXJzb3IgdG8gYWRkaW5nIFRodW1iIHN1cHBvcnQuIEFsc28gYWRkZWQgY3B1X3ZhcmlhbnQgZmxhZwotIAlpbmZvcm1hdGlvbiB0byBlYWNoIG9mIHRoZSBhc21fZmxnIHN0cnVjdHVyZXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IFVwZGF0ZWQgQVJNNyBwYXJzaW5nIHRvIGFsbG93ICd0JyBmb3IKLSAJdGh1bWIvaGFsZndvcmQgc3VwcG9ydCwgYXN3ZWxsIGFzICdtJyBmb3IgbG9uZyBtdWx0aXBseS4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZWQgaGVscCBtZXNzYWdlLgotCShtZF9hc3NlbWJsZSk6IENoZWNrIHRoYXQgaW5zdHJ1Y3Rpb24gZmxhZ3MgYXJlIGFwcGxpY2F0ZWQgdG8gdGhlCi0gCWN1cnJlbnQgY3B1IHZhcmlhbnQuCi0JKG1kX2FwcGx5X2ZpeDMsIHRjX2dlbl9yZWxvYyk6IEFkZCBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04IGFuZAotIAlCRkRfUkVMT0NfQVJNX0hXTElURVJBTCByZWxvY2F0aW9uIHN1cHBvcnQgZm9yIG5ldyBoYWxmd29yZCBhbmQKLSAJc2lnbmV4dGVuc2lvbiBpbnN0cnVjdGlvbnMuCi0JKGRvX2xkc3QpOiBHZW5lcmF0ZSBoYWxmd29yZCBhbmQgc2lnbmV4dGVuc2lvbiB2YXJpYW50cyBpZgotIAltbmVtb25pYyBmbGFncyBtYXRjaC4KLQkobGRzdF9leHRlbmQpOiBEbyBub3QgYWxsb3cgc2hpZnRzIGluIHRoZSBvZmZzZXQgZmllbGQgb2YgaGFsZndvcmQKLSAJb3Igc2lnbmV4dGVuc2lvbiBpbnN0cnVjdGlvbnMuCi0JKHZhbGlkYXRlX29mZnNldF9pbW0pOiBQcm92aWRlIGNoZWNrIG9uIGhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5zaW9uCi0gCWltbWVkaWF0ZSByYW5nZS4KLQkoYWRkX3RvX2xpdF9wb29sKTogTWVyZ2UgaWRlbnRpY2FsIGxpdGVyYWwgcG9vbCB2YWx1ZXMuCi0KLVR1ZSBKdWwgMzAgMTQ6Mjg6MjMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzZWxlY3Rvcl90YWJsZSk6IEFkZCAnRScgc2VsZWN0b3IuCi0JKGNvbnNfZml4X25ld19ocHBhKTogRG9uJ3QgY29rZSBvbiBlX2VzZWwuCi0JKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgUl9DT01QMiB3aGVuIHVzZWQKLQl0byBoZWxwIGdlbmVyYXRlIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZXMuCi0JKG1kX2FwcGx5X2ZpeCk6IERvbid0IHRyeSB0byBhcHBseSBmaXh1cHMgd2l0aCBhbiBlX2VzZWwKLQlzZWxlY3Rvci4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IEZpeHVwcyB3aXRoIGVfZXNlbCBzZWxlY3RvcnMKLQlhcmUgbm90IGFkanVzdGFibGUuCi0KLVR1ZSBKdWwgMzAgMTU6NTE6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIDJieXRlLCA0Ynl0ZSwgYW5kIDhieXRlCi0JcHNldWRvLW9wcy4KLQotRnJpIEp1bCAyNiAxMTo0MzowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWRkZWQgbG90cyBvZiBlcnJvciBjaGVja2luZy4gIEFkZGVkIGhhY2tzCi0JdG8gc3VwcG9ydCBhY2N1bXVsYXRvciBzaGlmdHMuCi0JCi1GcmkgSnVsIDI2IDExOjU2OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX1NFVF9FWFRFUk5BTCk6IExldCAud2VhayBvdmVycmlkZS4KLQkoU19DTEVBUl9FWFRFUk5BTCk6IExpa2V3aXNlLgotCShTX1NFVF9XRUFLKTogUmVtb3ZlIGVycm9yOyBqdXN0IGxldCAud2VhayBvdmVycmlkZS4KLQotVGh1IEp1bCAyNSAxNToyMjo1MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBOb3cgaGFuZGxlcyBtdWx0aWxpbmUKLQlpbnN0cnVjdGlvbnMuCi0KLVRodSBKdWwgMjUgMTI6MDM6MzMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeCBwYWNrYWdpbmcgYnVnLiBBZGRlZCByYW5nZSBjaGVja2luZy4KLQlBZGRlZCBrbHVkZ2UgZm9yIGRpdnMgaW5zdHJ1Y3Rpb24uICBGaXhlZCBtaW5vciBwcm9ibGVtIHdpdGgKLQltdWx0aXBsZSB0ZXh0IHNlY3Rpb25zLgotCSogY29uZmlnL3RjLWQxMHYuaCAoZDEwdl9jbGVhbnVwKTogQ2hhbmdlIHByb3RvdHlwZS4gCi0JCi1UdWUgSnVsIDIzIDEwOjQ5OjM2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hcHBseV9maXgzKTogRml4IGFsbCBpbnN0cnVjdGlvbgotCWFkZHJlc3NlcyB0byBiZSByaWdodC1zaGlmdGVkIGJ5IDIuCi0KLU1vbiBKdWwgMjIgMTE6MzI6MzYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IE1hbnkgY2hhbmdlcyB0byBnZXQgcmVsb2NzIHdvcmtpbmcuCi0gCShyZWdpc3Rlcl9uYW1lKTogTm8gbG9uZ2VyIGNyZWF0ZXMgYSBzeW1ib2wgZm9yIHJlZ2lzdGVyIG5hbWVzLgotIAkocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogbW92ZWQgdG8gb3Bjb2Rlcy9kMTB2LW9wYy5jLgotCShkMTB2X2luc2VydF9vcGVyYW5kKTogTm93IHdvcmtzIGNvcnJlY3RseSBmb3IgZWl0aGVyIGNvbnRhaW5lci4KLQkqIGNvbmZpZy90Yy1kMTB2LmggKGQxMHZfY2xlYW51cCk6IERlY2xhcmUuIAotCQotTW9uIEp1bCAyMiAxNDowMTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MgYW5kCi0JQkZEX1JFTE9DX1BDUkVMX0xPMTYgYXJlIGV4cGVjdGVkIHRvIGJlIFBDIHJlbGF0aXZlLgotCi1Nb24gSnVsIDIyIDEyOjQ2OjU1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiB0Yy1hbHBoYS5jOiBQYXRjaGVzIHRvIHRyYWNrIGN1cnJlbnQgbWluaW11bSBhbGlnbm1lbnQgdG8gcmVkdWNlCi0JdGhlIG51bWJlciBvZiBmcmFnbWVudHMgY3JlYXRlZCB3aXRoIGZyYWdfYWxpZ24uCi0JKGFscGhhX2N1cnJlbnRfYWxpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX2FscGhhX3RleHQpOiBSZXNldCBhbGlnbm1lbnQgdG8gMC4KLQkoc19hbHBoYV9kYXRhLCBzX2FscGhhX3JkYXRhLCBzX2FscGhhX3NkYXRhKTogTGlrZXdpc2UuCi0JKHNfYWxwaGFfc3RyaW5nZXIsIHNfYWxwaGFfc3BhY2UpOiBOZXcgZnVuY3Rpb25zLgotCShzX2FscGhhX2NvbnMsIGFscGhhX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogUmVtb3ZlIGZ1bmN0aW9ucy4KLQkoYWxwaGFfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbiB0byByZXBsYWNlIGJvdGggb2YgdGhlbS4KLQkoZW1pdF9pbnNuKTogT25seSBhbGlnbiBpZiBhbHBoYV9jdXJyZW50X2FsaWduIGlzIGxlc3MgdGhhbiAyOwotCXJlc2V0IGFscGhhX2N1cnJlbnRfYWxpZ24gdG8gMi4KLQkoc19hbHBoYV9ncHJlbDMyKTogTGlrZXdpc2UuCi0JKHNfYWxwaGFfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4gIEJhc2ljYWxseSBkdXBsaWNhdGUgdGhlIG90aGVyCi0JYWxwaGEgc2VjdGlvbiBjaGFuZ2UgaG9va3MuICBPbmx5IGRlZmluZSBmb3IgRUxGLgotCShzX2FscGhhX2Zsb2F0X2NvbnMpOiBTaW1wbGlmeSBhbGlnbm1lbnQgaGFuZGxpbmcuCi0JKG1kX3BzZXVkb190YWJsZSk6IE9ubHkgZGVmaW5lICJyZGF0YSIgYW5kICJzZGF0YSIgaWYgT0JKX0VDT0ZGLgotCUlmIE9CSl9FTEYsIGRlZmluZSAic2VjdGlvbiIsICJzZWN0aW9uLnMiLCAic2VjdCIsIGFuZCAic2VjdC5zIi4KLQlEb24ndCBkZWZpbmUgdGhlIHNfYWxwaGFfY29ucyBwc2V1ZG8tb3BzLiAgRG8gZGVmaW5lCi0Jc19hbHBoYV9zdHJpbmdlciBhbmQgc19hbHBoYV9zcGFjZSBwc2V1ZG8tb3BzLgotCShhbHBoYV9hbGlnbik6IFNraXAgaWYgbGVzcyB0aGFuIGN1cnJlbnQgZGVmYXVsdCBhbGlnbm1lbnQuICBTZXQKLQlkZWZhdWx0IGFsaWdubWVudC4KLQkqIHRjLWFscGhhLmggKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogUmVtb3ZlLgotCShtZF9jb25zX2FsaWduKTogQWRkLgotCi0JKiB0Yy1hbHBoYS5jOiBBZGQgb29kbGVzIG9mIGZ1bmN0aW9uIGRlc2NyaXB0aW9uIGNvbW1lbnRzLgotCShtZF9iaWdudW1fdG9fY2hhcnMpOiBSZW1vdmU7IHRoZXJlIGFyZSBubyBjYWxsZXJzLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBzb21lIG1vcmUgdmFyaWFudHMuCi0KLVRodSBKdWwgMTggMTU6NTQ6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBBbmRyZXcgR2llcnRoIDxBTkRSRVdHQG1pY3JvbGlzZS5jby51az46Ci0JKiBjb25maWd1cmUuaW4gKHNwYXJjLSotc3lzdjQqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSB1YWhhbGYsIHVhd29yZCwgYW5kCi0JdWF4d29yZCB0byB1c2Ugc191YWNvbnMuCi0JKHNwYXJjX25vX2FsaWduX2NvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX3VhY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNwYXJjX2NvbnNfYWxpZ24pOiBJZiBzcGFyY19ub19hbGlnbl9jb25zIGlzIHNldCwganVzdCBjbGVhciBpdAotCWFuZCByZXR1cm4uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IFJlbW92ZSB1bnVzZWQgbGFiZWwgYWxsb2NhdGVfYnNzLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtaXBzLSotaXJpeDYqIHRhcmdldC4gIEhhbmRsZSBJcml4IDYgbGlrZSBJcml4Ci0JNSB3aXRoIHJlZ2FyZCB0byBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogVXNlIHRoZSBjb3JyZWN0IGxlbmd0aCB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgdGhlIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBlcnJvciBtZXNzYWdlLgotCi1UaHUgSnVsIDE4IDEyOjU3OjEwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IEFsbG93IGQxMHYtKi0qLCBkb24ndCByZXF1aXJlIGQxMHYtKi1lbGYqLgotCi1XZWQgSnVsIDE3IDE0OjI1OjEzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1kMTB2Lmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlIChkMTB2LSotZWxmKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qLWVsZik6IE5ldyB0YXJnZXQuCi0JCi1GcmkgSnVsIDEyIDIwOjU0OjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBSZWNvZ25pemUgLUsgUElDLgotCi1XZWQgSnVsIDEwIDEyOjM5OjA4IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfYWxpZ24pOiBDaGFuZ2UgZmlsbCBwYXJhbWV0ZXIKLQl0byBhIHBvaW50ZXIuICBUYWtlIE5VTEwgYXMgMCBvciBub3AgZGVwZW5kaW5nIG9uIHNlY3Rpb24uICBDaGFuZ2UKLQlhbGwgY2FsbGVycy4KLQkoc19hbHBoYV9hbGlnbik6IFJlbmFtZSBsb2NhbCB2YXJpYWJsZXMuCi0KLQkqIGRvYy9hcy50ZXhpbmZvICguYWxpZ24pOiBEb2N1bWVudCBhY3Rpb24gb2Ygb21pdHRlZAotCWZpbGwgcGFyYW1ldGVyLgotCi1XZWQgSnVsIDEwIDAwOjIzOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogR2l2ZSBhIHVzZWZ1bCBlcnJvciBtZXNzYWdlCi0Jd2hlbiBhbiB1bnN1cHBvcnRlZCBQQyByZWxhdGl2ZSByZWxvYyBpcyBzZWVuLCByYXRoZXIgdGhhbiBjYWxsaW5nCi0JYWJvcnQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IFJlbW92ZSBub3RfY3BwX2xpbmUgbG9jYWwgdmFyaWFibGUuCi0JSW5zdGVhZCwgY2hlY2sgc3RhdGUgd2hlbiAnIycgY29tbWVudCBpcyBzZWVuLgotCi1Nb24gSnVsICA4IDE0OjExOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19yZWdtYXNrX2ZyYWcpOiBPbmx5IGRlZmluZSBpZiBPQkpfRUxGIG9yCi0gCU9CSl9NQVlCRV9FTEYuCi0JKHRjX2dlbl9yZWxvYyk6IElmIGZpeHVwIHdhcyBjaGFuZ2VkIHRvIGJlIFBDIHJlbGF0aXZlLCBjaGFuZ2UKLSAJcmVsb2MgdHlwZSBhY2NvcmRpbmdseS4gIFVzZSBuYW1lIG9mIHJlbG9jIGluIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGFzLmg6IERvbid0IGRlZmluZSBjb25zdCBvciB2b2xhdGlsZS4KLQkqIGZsb251bS5oOiBEb24ndCBkZWZpbmUgY29uc3QuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2dlbl9yZWxvYyk6IENoYW5nZSB0aGUgY29kZSBhcHByb3ByaWF0ZWx5Ci0JaWYgZnhfcGNyZWwgaXMgc2V0LiAgQ29ycmVjdCBzZXR0aW5nIHRoZSBhZGRlbmQgY2FzZSBpbiB0aGUKLQlPQkpfRUxGIGNhc2UgKGZyb20gQW5kcmVhcyBTY2h3YWIKLQk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPikuCi0JKG1kX3Nob3dfdXNhZ2UpOiBDb3JyZWN0IC1tZmM1MjAwIHRvIC1tNTIwMC4KLQotRnJpIEp1bCAgNSAxMDozMjo1OCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW02OGsudGV4aTogRG9jdW1lbnQgLW01MjAwIGZsYWcuCi0JKiBkb2MvYXMudGV4aW5mbzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBUaGUgY29sZGZpcmUgZG9lcyBub3Qgc3VwcG9ydCA4eAotIAlzY2FsZSBmYWN0b3IuCi0KLUZyaSBKdWwgIDUgMTE6MDc6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX0VYVEVSTkFMKTogQ2hhbmdlIGFzX3dhcm4gdG8gYXNfYmFkLgotCShTX0NMRUFSX0VYVEVSTkFMLCBTX1NFVF9XRUFLKTogTGlrZXdpc2UuCi0KLVRodSBKdWwgIDQgMTE6NTk6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byBjeWdudXMtMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotVGh1IEp1bCAgNCAxMDoxMTozMyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBPbmx5IHBlcmZvcm0gcmFuZ2UgY2hlY2sgd2hlbgotIAlkZWFsaW5nIHdpdGggT19jb25zdGFudCBleHByZXNzaW9ucy4KLQotV2VkIEp1bCAgMyAxNTowMjoyMSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstcGFyc2UuaCAobTY4a19yZWdpc3Rlcik6IEFkZCBuZXcgY29sZGZpbGUgY29udHJvbAotCXJlZ2lzdGVycy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWNmNTIwMF9jb250cm9sX3JlZ3MpOiBOZXcgdmFyaWFibGUsIAotCWFycmF5IG9mIGNvbnRyb2wgcmVnaXN0ZXJzIGZvciB0aGUgY29sZGZpcmUuCi0JKGNwdV9vZl9hcmNoKTogQWRkZWQgbWNmNTIwMC4KLQkoYXJjaHMpOiBBZGRlZCBtY2Y1MjAwLgotCShpbml0X3RhYmxlKTogQWRkIG5ldyBjb250cm9sIHJlZ2lzdGVycy4KLQkobTY4a19pcCk6IEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBjb250cm9sIHJlZ2lzdGVycy4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfc2hvd191c2FnZSk6IEFkZCAtbTUyMDAgdG8gdXNhZ2UgdGV4dC4KLQotV2VkIEp1bCAgMyAxNjowNTo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQpOiBSZW1vdmUgZGVjbGFyYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gb2YgfHwKLQl3aXRoaW4gJiYuCi0JKG1kX2Fzc2VtYmxlKTogRml4IGhhbmRsaW5nIG9mIEBsIHdpdGggYW4gdW5zaWduZWQgY29uc3RhbnQuICBBZGQKLQlkZWZhdWx0IGNhc2UgdG8gcmVsb2Mgc3dpdGNoLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChBT1VUX01BQ0hUWVBFKTogRGVmaW5lIGFzIDAgaWYgVEVfMzg2QlNELgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFRvbSBRdWlnZ2xlIDxxdWlnZ2xlQHNnaS5jb20+OgotCSogZWNvZmYuYyAobGFzdF9saW5lbm8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhZGRfcHJvY2VkdXJlKTogU2V0IGxhc3RfbGluZW5vLgotCShlY29mZl9kaXJlY3RpdmVfbG9jKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBMaWtld2lzZS4KLQkoZWNvZmZfZml4X2xvYyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmggKGVjb2ZmX2ZpeF9sb2MpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBXaGVuIGluc2VydGluZyBub3BzLCBhbmQgdXNpbmcKLQlFQ09GRiBkZWJ1Z2dpbmcsIGNhbGwgZWNvZmZfZml4X2xvYy4KLQotVHVlIEp1bCAgMiAyMzowMjoxMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IElmIGFuIG9wZXJhbmQgdHlwZSBpcyAKLQltYXJrZWQgYXMgU1JDX0lOX0RTVCByZXRyaWV2ZSBpdCBmcm9tIHRoZSAiZGVzdGluYXRpb24iIG9wLgotCi1TYXQgSnVuIDI5IDEzOjM4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhcm0tKi1yaXNjaXgqKTogU2V0IGVtdWxhdGlvbiB0byByaXNjaXguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtcmlzY2l4Lmg6IE5ldyBmaWxlIHRvIGRlZmluZSBURV9SSVNDSVguCi0KLQkqIGNvbmZpZy90Yy1zaC5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZS4KLQotRnJpIEp1biAyOCAxNToxNDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogSnVzdCBydW4gY29uZmlnLnN0YXR1cyBhcyBvdGhlcgotCXRvb2xzIGRvLgotCi1GcmkgSnVuIDI4IDExOjA5OjM4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiAoVEFSR0VUX09TKTogQWRkIGRlZmluaXRpb24gdG8gY29uZi4KLQotVGh1IEp1biAyNyAyMDozOTo0MCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogUGFyZW50aGVzaXplCi0JY29wX2ludGVybG9ja3MgZXhwcmVzc2lvbnMuCi0KLVRodSBKdW4gMjcgMTI6MTg6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcHJpbnQpOiBDbG9zZSB0aGUgbGlzdGluZyBmaWxlIGlmIGl0IGlzIG5vdAotCXN0ZG91dC4gIENsb3NlIHRoZSBvdGhlciBmaWxlcyBvcGVuZWQgZm9yIHRoZSBsaXN0aW5nLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfY29uc19hbGlnbik6IERlZmluZS4KLQkoc3BhcmNfY29uc19hbGlnbik6IERlY2xhcmUuCi0JKEhBTkRMRV9BTElHTik6IERlZmluZS4KLQkoc3BhcmNfaGFuZGxlX2FsaWduKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19jb25zX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19oYW5kbGVfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogQ2FsbCBtZF9jb25zX2FsaWduIGlmIGl0IGlzIGRlZmluZWQuCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogQWRkIGZyX2ZpbGUgYW5kIGZyX2xpbmUgZmllbGRzLgotCSogZnJhZ3MuYyAoZnJhZ19uZXcpOiBTZXQgZnJfZmlsZSBhbmQgZnJfbGluZS4KLQkoZnJhZ192YXIpOiBMaWtld2lzZS4KLQkoZnJhZ192YXJpYW50KTogTGlrZXdpc2UuCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogUmVtb3ZlIHVudXNlZCBhbGlnbl9tYXNrIGFuZCBhbGlnbl9vZmZzZXQKLQlmaWVsZHMuCi0KLQkqIGxpc3RpbmcuYyAoY2FsY19oZXgpOiBPZmZzZXQgYnkgZnJfZml4IHdoZW4gZXhhbWluaW5nIGZyX3Zhci4KLQlGcm9tIDx1ZGRlYm9yZ0BjYXJtZW4uc2U+LgotCi1XZWQgSnVuIDI2IDEzOjIxOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotb3NmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEFkZCA2OGVjMDYwIGFzIGEgc3lub255bSBmb3IgNjgwNjAuCi0KLVdlZCBKdW4gMjYgMTY6MjM6MDggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBZGRlZCBjb3BfaW50ZXJsb2NrcywgdG8gYXZvaWQgTk9QIGluc2VydGlvbgotIAliZXR3ZWVuIGNvLXByb2Nlc3NvciBjb21wYXJpc29ucyBhbmQgYnJhbmNoZXMgZm9yIHRoZSBWUjQzMDAuCi0KLU1vbiBKdW4gMjQgMTg6MDI6NTAgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0JSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwKLQlpbmNsdWRlZGlyKTogVXNlIGF1dG9jb25mIHNldCB2YWx1ZXMuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0KLU1vbiBKdW4gMjQgMTE6NTg6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfZWplY3QpOiBEb24ndCBkbyBhbnl0aGluZyBpZiBsaXN0aW5nIGlzIDAuCi0JKGxpc3RpbmdfbGlzdCk6IExpa2V3aXNlLgotCShsaXN0aW5nX3NvdXJjZV9saW5lKTogTGlrZXdpc2UuCi0JKGxpc3RpbmdfdGl0bGUpOiBEb24ndCBzYXZlIHRpdGxlIGlmIGxpc3RpbmcgaXMgMC4KLQkobGlzdGluZ19zb3VyY2VfZmlsZSk6IENoZWNrIGxpc3RpbmcgcmF0aGVyIHRoYW4gbGlzdGluZ190YWlsLgotCi0JKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKLQl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgSnVuIDIxIDE4OjIyOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEluIGNhc2UgJ2knLydqJywgZG9uJ3QgcmVxdWlyZSBhbgotCWFic29sdXRlIGV4cHJlc3Npb24gaWYgYSByZWxvY2F0aW9uIHR5cGUgd2FzIHNwZWNpZmllZC4KLQotRnJpIEp1biAyMSAxNzo0MDoxNiAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBtZXJsaW4uZ2NzLnJlZHN0b25lLmFybXkubWlsPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciAqLSotcnRlbXMqIGNvbmZpZ3VyYXRpb25zLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgSnVuIDIxIDE2OjAxOjE4IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBhbHBoYS0qLWxpbnV4ZWNvZmYqIHRhcmdldC4gIFVzZSBlbGYgZm9yCi0JYWxwaGEtKi1saW51eCogdGFyZ2V0LiAgRm9yY2UgYmZkX2dhcyBmb3IgYWxwaGEtKi4gIFJlcXVpcmUKLQlvcGNvZGVzIGxpYnJhcnkgZm9yIGFscGhhLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBTdWJzdGFudGlhbCByZXdyaXRlIHRvIGFkZCBFTEYgc3VwcG9ydCBhbmQKLQl1c2UgbmV3IG9wY29kZSB0YWJsZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChtZF91bmRlZmluZWRfc3ltYm9sKTogRG9uJ3QgZGVmaW5lLgotCShMT0NBTF9MQUJFTCk6IERlZmluZSBkaWZmZXJlbnRseSBpZiBPQkpfRUxGLgotCShGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogUmVtb3ZlLgotCSogY29uZmlnL29iai1lbGYuaDogSWYgVENfQUxQSEEsIGRlZmluZSBFQ09GRl9ERUJVR0dJTkcuCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfREVQX2FscGhhKTogRGVwZW5kIHVwb24KLQlpbmNsdWRlL29wY29kZS9hbHBoYS5oIHJhdGhlciB0aGFuIGNvbmZpZy9hbHBoYS1vcGNvZGUuaC4KLQotVGh1IEp1biAyMCAxOToxMDoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IEdpdmUgYW4gZXJyb3IgaWYgdGhlCi0JcmVsb2NhdGlvbiBzeW1ib2wgd2FzIG5vdCByZXNvbHZlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogTGlrZXdpc2UuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVmZXRjaCB0aGUgc3ltYm9sIHNlY3Rpb24gYWZ0ZXIKLQljYWxsaW5nIFNfR0VUX1ZBTFVFLCBzaW5jZSBpdCBtYXkgaGF2ZSBjaGFuZ2VkLgotCi0JKiBleHByLmMgKHN0cnVjdCBleHByX3N5bWJvbF9saW5lKTogRGVmaW5lLgotCShleHByX3N5bWJvbF9saW5lcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1ha2VfZXhwcl9zeW1ib2wpOiBBZGQgZW50cnkgdG8gZXhwcl9zeW1ib2xfbGluZXMuCi0JKGV4cHJfc3ltYm9sX3doZXJlKTogTmV3IGZ1bmN0aW9uLgotCSogZXhwci5oOiBVc2UgZXh0ZXJuIG9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQkoZXhwcl9zeW1ib2xfd2hlcmUpOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFRyeSB0byB1c2UgZXhwcl9zeW1ib2xfd2hlcmUKLQlyYXRoZXIgdGhhbiBwcmludGluZyB0aGUgbWVhbmluZ2xlc3MgbmFtZSBvZiBhbiBleHByZXNzaW9uCi0Jc3ltYm9sLgotCi1UaHUgSnVuIDIwIDE1OjU3OjQxIDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9udW1iZXJfdG9fY2hhcnMpOiBEZWxldGVkLgotCSogY29uZmlnL3RjLWkzODYuaCAobWRfbnVtYmVyX3RvX2NoYXJzKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYnVpbGRfb3BlcmF0ZV9uLCBidWlsZF9tZW0pOiBNb3ZlZCBlYXJsaWVyIGluCi0JdGhlIGZpbGUuCi0JKGxvYWRfc3ltYm9sX2FkZHJlc3MsIGxvYWRfZXhwcmVzc2lvbik6IFVzZSBidWlsZF9tZW0uCi0JKGJ1aWxkX29wZXJhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGVtaXRfYWRkcV9yKTogVXNlIGl0LgotCi0JV2VkIE1hciAxMyAyMjoxNDoxNCAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogc3ltYm9scy5jIChjb2xvbik6ICAjaWYgVk1TLCB1c2UgU19TRVRfT1RIRVIgdG8gc3RvcmUgYGNvbnN0X2ZsYWcnLgotCi0JVHVlIE1hciAgNSAxNDozMTo0NSAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL3RjLXZheC5oIChOT1BfT1BDT0RFKTogRGVmaW5lLgotCi0JU3VuIEZlYiAgNCAyMTowMTowMyAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuaCAoU19JU19DT01NT04pOiBEZWZpbmUuCi0JKFNfSVNfTE9DQUwpOiBDaGVjayBmb3IgXDAwMiBhcyB3ZWxsIGFzIFwwMDEuCi0JKExPTkdXT1JEX0FMSUdOTUVOVCk6IE5ldyBtYWNyby4KLQkoU1VCX1NFR01FTlRfQUxJR04pOiBVc2UgaXQuCi0KLQlGcmkgSmFuIDI2IDE3OjQ0OjA5IDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogUmVjb25jaWxlIHdpdGggY29uZi5pbi4KLQotV2VkIEp1biAxOSAxMTozMTo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGlzX2RucmFuZ2UpOiBPbmx5IGRlZmluZSBpZiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIGlzCi0JZGVmaW5lZC4KLQotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IHRoYXQgYW55IG51bWJlciBvZiBoZXggZGlnaXRzIGNhbgotCWZvbGxvdyBceC4KLQotCSogYXMuYyAoc3RydWN0IGRlZnN5bV9saXN0KTogRGVmaW5lLgotCShkZWZzeW1zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocGFyc2VfYXJncyk6IEp1c3QgcHV0IC0tZGVmc3ltIGFyZ3VtZW50cyBvbiBkZWZzeW1zIGxpc3QsIHJhdGhlcgotCXRoYW4gZGVmaW5pbmcgdGhlbS4KLQkobWFpbik6IERlZmluZSBkZWZzeW1zIGFmdGVyIG91dHB1dCBmaWxlIGlzIGNyZWF0ZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgUFJFIGFuZCBQT1NUIGluZGV4aW5nIG1vZGUgb24KLQljcHUzMi4gIEZyb20gRXJpYyBOb3J1bSA8RXJpYy5Ob3J1bUB1c2Fzay5jYT4uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBJbiBjYXNlcyAnSScsICdpJywgYW5kICdqJywgc2V0Ci0JaW5zbl9lcnJvciByYXRoZXIgdGhhbiBjYWxsaW5nIGNoZWNrX2Fic29sdXRlX2V4cHIuCi0KLQkqIGFzLmMgKGVtdWxhdGlvbl9uYW1lKTogUmVtb3ZlIHVudXNlZCBzdGF0aWMgdmFyaWFibGUuCi0JKGRlZmF1bHRfZW11bF9iZmRfbmFtZSk6IEFkZCByZXR1cm4gTlVMTCB0byBhdm9pZCB3YXJuaW5nLgotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIG5hbWUgYW5kCi0JbmFtZV9lbmQuCi0JKiBmcmFncy5jIChmcmFnX25ldyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgdG1wLgotCSogaGFzaC5jIChoYXNoX2dyb3cpOiBQYXJlbnRoZXNpemUgKyB3aXRoaW4gPDwuCi0JKGhhc2hfcHJpbnRfc3RhdGlzdGljcyk6IFVzZSAlbHUsIG5vdCAlZCwgdG8gcHJpbnQgdW5zaWduZWQKLQlsb25nIHZhcmlhYmxlcy4KLQkqIG1lc3NhZ2VzLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoZnByaW50X3ZhbHVlKTogQWRkIGNhc3QgdG8gYXZvaWQgcHJpbnRmIHdhcm5pbmcuCi0JKHNwcmludF92YWx1ZSk6IExpa2V3aXNlLgotCSogcmVhZC5jOiBJbmNsdWRlICJlY29mZi5oIi4KLQkoZW1pdF9leHByKTogQWRkIGNhc3RzIHRvIGF2b2lkIHByaW50ZiB3YXJuaW5ncy4KLQkqIHJlYWQuaDogVXNlIGV4dGVybiBmb3IgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCShwb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkqIHN0YWJzLmM6IEluY2x1ZGUgImVjb2ZmLmgiLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyB0bXAsCi0JZm9ybWVyX2xhc3RfZnJhZ1AsIGFuZCBuZXdfZnJhZ1AuCi0JKiBzdWJzZWdzLmggKHN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKiBzeW1ib2xzLmMgKGRlYnVnX3ZlcmlmeV9zeW1jaGFpbik6IENoYW5nZSBtYWNybyB0byBkaXNjYXJkCi0JYXJndW1lbnRzLgotCSogd3JpdGUuYyAoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IExpa2V3aXNlLgotCSogd3JpdGUuaDogVXNlIGV4dGVybiBmb3IgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCSh3cml0ZV9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9lLW1pcHNlY29mZi5jIChtaXBzZWNvZmZfYmZkX25hbWUpOiBSZXR1cm4gTlVMTCB0byBhdm9pZAotCXdhcm5pbmcuCi0JKiBjb25maWcvZS1taXBzZWxmLmMgKG1pcHNlbGZfYmZkX25hbWUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9lY29mZl9zZXRfZXh0KTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IElmIE9CSl9FTEYsIGFsd2F5cwotCWVtaXQgcmVsb2NhdGlvbnMgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAodGNfZ2VuX3JlbG9jKTogT3V0cHV0IGEgc2Vuc2libGUgZXJyb3IKLSAJbWVzc2FnZSBpZiBiZmRfcmVsb2NfdHlwZV9sb29rdXAgZmFpbHMsIHJhdGhlciB0aGFuIGNhbGxpbmcKLSAJYXNzZXJ0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IEFkZAotCUJGRF9SRUxPQ18xMl9QQ1JFTCB0byBzd2l0Y2guCi0KLVR1ZSBKdW4gMTggMjA6Mjk6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoTE9DQUxfTEFCRUwsRkFLRV9MQUJFTF9OQU1FKTogVXNlIGRlZmF1bHRzIGZvcgotCVRFX1BFIChMZm9vLCBub3QgLkxmb28pLgotCi1UdWUgSnVuIDE4IDE3OjEzOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2ZpbGwpOiBEb24ndCB3YXJuIGFib3V0IGEgemVybyByZXBlYXQgY291bnQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB3YXJuIGFib3V0IHVzaW5nIEFUIGFzIGEKLQljb3Byb2Nlc3NvciByZWdpc3Rlci4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBXaGVuIGNoZWNraW5nIHRoZSBzaXplIG9mIGEKLQlyZWdpc3RlciB0byBzZXQgdGhlIHNpemUgb2YgYW4gaW5zdHJ1Y3Rpb24sIGRvIGEgYml0d2lzZSBhbmQgd2l0aAotCVJlZzggYW5kIFJlZzE2IHJhdGhlciB0aGFuIHJlcXVpcmluZyB0aGUgdHlwZSB0byBiZSBleGFjdGx5IFJlZzgKLQlvciBSZWcxNi4KLQotVHVlIEp1biAxOCAxMzoxOTo1MSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHBhcnNlX3JlZyk6IFR3ZWFrIGVycm9yIG1lc3NhZ2VzLgotCShidWlsZF9ieXRlcyk6IExpa2V3aXNlLgotCShza2lwX2NvbG9udGhpbmcpOiBIYW5kbGUgOjMyIHN1ZmZpeC4KLQkoZ2V0X3NwZWNpZmljKTogUHJvbW90ZSBMXzI0IHRvIExfMzIgaWYgaXQgbWFrZXMgYSBtYXRjaC4KLQlEb24ndCBhbHdheXMgcHJvbW90ZSBMXzggdG8gTF8xNi4KLQkoZG9fYV9maXhfaW1tKTogQ2xlYW4gdXAgTF8zMiBhbmQgTF8yNCBoYW5kbGluZy4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKFNtb2RlKTogTmV3IHZhcmlhYmxlLgotCShoODMwMGhtb2RlKTogVHVybiBvZmYgSG1vZGUuCi0JKGg4MzAwc21vZGUpOiBOZXcgZnVuY3Rpb24uICBUdXJuIG9uIFNtb2RlIGFuZCBIbW9kZS4KLQkobWRfcHNldWRvX3RhYmxlKTogTmV3ICIuaDgzMDBzIiBwc2V1ZG8tb3AuCi0JKHBhcnNlX3JlZyk6IEhhbmRsZSAiZXhyIiByZWdpc3Rlci4KLQkoZ2V0X29wZXJhbmQpOiBIYW5kbGUgYml6YXJyZSBzeW50YXggZm9yICJzdG0ubCIgYW5kICJsZG0ubCIuCi0JSGFuZGxlICJtYWNoIiBhbmQgIm1hY2hsIiBvcGVyYW5kcyBmb3IgbGRtYWMuCi0JKGdldF9zcGVjaWZpYyk6IEhhbmRsZSAic3RtLmwiIGFuZCAibGRtLmwiLgotCShidWlsZF9ieXRlcyk6IEhhbmRsZSAic3RtLmwiIGFuZCAibGRtLmwiOyBoYW5kbGUgTUFDUkVHIG9wZXJhbmRzLgotCSogY29uZmlnL3RjLWg4MzAwLmggKENPRkZfTUFHSUMpOiBIYW5kbGUgSDgvUyBtYWdpYyBudW1iZXIuCi0JKFNtb2RlKTogRGVjbGFyZS4KLQotTW9uIEp1biAxNyAxNTo1MDo1MyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBSZW9yZGVyIGNoYXB0ZXIgb2YgbWFjaGluZSBkZXBlbmRlbnQgb3B0aW9ucyBzbwotIAl0aGF0IGl0IGlzIHNvcnRlZCBieSBjaGlwIG5hbWUuICAKLQotCSogZG9jL2FzLnRleGluZm86IFVzZSBjb25zaXN0YW50IHNwZWxsaW5nIG9mIFZheC4KLQkqIGRvYy9jLXZheC50ZXhpOiBMaWtld2lzZS4KLQotTW9uIEp1biAxNyAxMToyNjo1NiAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIuYmVnaW5fdHJ5IiBhbmQgIi5lbmRfdHJ5IgotCXBzZXVkbyBvcHMuCi0JKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgUl9CRUdJTl9UUlkgYW5kIFJfRU5EX1RSWS4KLQkobWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0JKHBhX3RyeSk6IE5ldyBmdW5jdGlvbi4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NzIGZvciBCRUdJTl9UUlkgYW5kIEVORF9UUlkuCi0KLVN1biBKdW4gMTYgMjI6NTc6NDcgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiLmxldmVsIiBwc2V1ZG8gb3AuCi0JKHBhX2xldmVsKTogTmV3IGZ1bmN0aW9uLgotCi1GcmkgSnVuIDE0IDIwOjA2OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiBsaXN0aW5nIGlzIDAuCi0KLVRodSBKdW4gMTMgMTc6NTA6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogSWYgc3ltYm9sX3RhYmxlX2Zyb3plbiBpcyBzZXQsIGNhbGwKLQlzeW1ib2xfY3JlYXRlLCBub3Qgc3ltYm9sX25ldy4KLQotV2VkIEp1biAxMiAxNDoxMDo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogRG9uJ3Qgc2V0IHN5X3VzZWRfaW5fcmVsb2MgZm9yIGFuCi0JYWJzb2x1dGUgc3ltYm9sIHVubGVzcyBUQ19GT1JDRV9SRUxPQ0FUSU9OIHJldHVybnMgdHJ1ZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHByZXZpb3VzX2ZpbGVfc3ltYm9sKTogUmVtb3ZlIEJGRF9BU1NFTUJMRVIKLQl2ZXJzaW9uLgotCShjX2RvdF9maWxlX3N5bWJvbCk6IEJGRF9BU1NFTUJMRVIgdmVyc2lvbjogRG9uJ3Qgc2V0IHRoZSB2YWx1ZSBvZgotCXRoZSBzeW1ib2wgdG8gYSBwb2ludGVyLiAgRG9uJ3Qgc2V0IHByZXZpb3VzX2ZpbGVfc3ltYm9sLgotCVNpbXBsaWZ5IHN5bWJvbCBsaXN0IHJlYXJyYW5nZW1lbnQuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBEb24ndCBkbyBhbnl0aGluZyB3aXRoIENfRklMRSBzeW1ib2xzLgotCShjb2ZmX2FkanVzdF9zeW10YWIpOiBEb24ndCBjaGVjayBwcmV2aW91c19maWxlX3N5bWJvbC4KLQotTW9uIEp1biAxMCAxNDo1MjoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9sY29tbSk6IE5ldyBmdW5jdGlvbiBmb3IgLmxjb21tCi0JZGlyZWN0aXZlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgcHBjX2VsZl9sY29tbS4KLQotTW9uIEp1biAxMCAxMTo0NTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBBY2NlcHQgQUJTTCBmb3IgJ08nLCBzbyB0aGF0IGBiZmV4dHUKLQlkMHsyNDoxfSxkMCcgd29ya3Mgd2l0aG91dCBhbiBpbW1lZGlhdGUgcHJlZml4IG9uIHRoZSBiaXQgbnVtYmVycy4KLQkobWRfYmVnaW4pOiBBZGQgZGlnaXRzIHRvIGFsdF9ub3RlbmRfdGFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IE1ha2UgcyBhIGNvbnN0IHBvaW50ZXIuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImVtcHR5Ii4KLQkoc19lbXB0eSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzdHJ1Y3QgZmlsZW5hbWVfbGlzdCk6IE9ubHkgZGVmaW5lIGlmIG5vdAotCUJGRF9BU1NFTUJMRVIuCi0JKGZpbGVuYW1lX2xpc3RfaGVhZCwgZmlsZW5hbWVfbGlzdF90YWlsKTogTGlrZXdpc2UuCi0JKGNfc2VjdGlvbl9zeW1ib2wpOiBSZW1vdmUgdW51c2VkIEJGRF9BU1NFTUJMRVIgdmVyc2lvbi4KLQkob2JqX2NvZmZfZW5kZWYsIEJGRF9BU1NFTUJMRVIgdmVyc2lvbik6IERvbid0IHNldCB0aGUgZGVidWdnaW5nCi0JZmxhZyBmb3IgQ19NT1MsIENfTU9FLCBDX01PVSwgb3IgQ19FT1Mgc3ltYm9scywgc2luY2UgdGhleSBzaG91bGQKLQloYXZlIGEgc2VjdGlvbiBvZiBOX0FCUyByYXRoZXIgdGhhbiBOX0RFQlVHLiAgSWYgd2UgZG8gYSBtZXJnZSwKLQlyZW1vdmUgdGhlIG5ldyBzeW1ib2wgZnJvbSB0aGUgbGlzdC4KLSAJKG9ial9jb2ZmX2VuZGVmLCBib3RoIHZlcnNpb25zKTogQ2FsbCB0YWdfaW5zZXJ0IGV2ZW4gaWYgdGhlcmUgaXMKLQlhbiBvbGQgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSwgaWYgdGhlIG9sZCBzeW1ib2wgZG9lcyBub3QKLQloYXBwZW4gdG8gYmUgYSB0YWcuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBDaGVjayBTRl9HRVRfVEFHLCBDX0VPRiwgYW5kIENfRklMRSBvdXRzaWRlIG9mCi0JdGhlIFNGX0dFVF9ERUJVRyBjb25kaXRpb24uICBEb24ndCBjYWxsIFNBX1NFVF9TWU1fRU5ETkRYIHdpdGggYQotCXN5bWJvbCB0aGF0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QuCi0JKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IEFsd2F5cyBjYWxsIHNlY3Rpb25fc3ltYm9sIGZvciAudGV4dCwKLQkuZGF0YSwgYW5kIC5ic3MuCi0JKGNvZmZfZnJvYl9zZWN0aW9uKTogTGlrZXdpc2UuICBBbHNvLCByZW1vdmUgdW51c2VkIHZhcmlhYmxlCi0Jc3RybmFtZS4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnZlcnRfaWlmKTogQ2FsbCBmcmFnX2dyb3cgcmF0aGVyIHRoYW4KLQltYW5pcHVsYXRpbmcgZnJhZ3MgZGlyZWN0bHkuCi0JKG1kX251bWJlcl90b19maWVsZCk6IEFkanVzdCBtZW1fcHRyIGNvcnJlY3RseSBpZiBFTkRJQU4gaXMKLQlkZWZpbmVkLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJZiAnLycgaXMgTElORV9DT01NRU5UX1NUQVJULCBjaGVjawotIAl3aGV0aGVyIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnKicgYmVmb3JlIGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlCi0JYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4gIFBlcm1pdCBMSU5FX0NPTU1FTlRfU1RBUlQgdG8gc3RhcnQgYQotCWNvbW1lbnQgaW4gc3RhdGUgMSAoc2VlbiBzb21lIHdoaXRlc3BhY2UpIGFzIHdlbGwsIHRvIG1hdGNoIHRoZQotCWRvY3VtZW50YXRpb24uCi0KLQkqIGdhc3AuYyAoZG9fYWxpZ24pOiBQZXJtaXQgYSBmaWxsIHZhbHVlIGZvciAuYWxpZ24uCi0KLVdlZCBKdW4gIDUgMTc6MDk6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBXYXJuIGlmIGEgbmV3bGluZSBpcyBzZWVuIGluIHRoZQotCW1pZGRsZSBvZiBhIHN0cmluZy4gIENhbGwgYnVtcF9saW5lX2NvdW50ZXJzIHdoZW4gYXBwcm9wcmlhdGUuCi0KLVdlZCBKdW4gIDUgMTc6MDg6MzYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBVc2UgTE9DQUxfTEFCRUwuCi0KLVR1ZSBKdW4gIDQgMTA6NTU6MTYgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgY2hlY2sgdG8gc2VlIGlmIHRvb2xkaXIgZXhpc3RzLgotCU1ha2UgJCh0b29sZGlyKSBhbmQgJCh0b29sZGlyKS9iaW4uCi0KLVR1ZSBKdW4gIDQgMTA6MTQ6NTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvcHBjLXNvbC5tdCAoVERFRklORVMpOiBEb24ndCB0dXJuIG9uIC1tcmVnbmFtZXMgYnkKLQlkZWZhdWx0LgotCi1Nb24gSnVuICAzIDExOjM0OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IGNhbGwgYXNfd2FybiBpZiB3ZSBhcmUgc2V0dGluZwotCWluc25fZXJyb3IuICBEb24ndCBwdXQgdGhlIHN0cmluZyAiRVJST1IiIGluIGluc25fZXJyb3IuICBTZXQKLQlpbnNuX2Vycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgYXNfd2FybiBmb3IgYW4gdW5zdXBwb3J0ZWQgb3Bjb2RlLgotCi1TYXQgSnVuICAxIDIxOjUxOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQ2hlY2sgZm9yIGEgNjQgYml0IGZvcm1hdAotCWJlZm9yZSBwZXJtaXR0aW5nIC02NC4KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IFJlbW92ZSBkdXBsaWNhdGUKLQliZmRfcGVycm9yLgotCi1GcmkgTWF5IDMxIDAxOjA4OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiAtNjQsIGNyZWF0ZSBhIC5NSVBTLm9wdGlvbnMKLQlzZWN0aW9uIHJhdGhlciB0aGFuIGEgLnJlZ2luZm8gc2VjdGlvbi4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IElmIC02NCwgd3JpdGUgb3V0IDY0IGJpdCBSZWdJbmZvCi0JaW5mb3JtYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBJZiBtaXBzX2lzYSA8IDMsIHBlcm1pdCBhIDMyCi0JYml0IHZhbHVlIHdpdGggdGhlIGhpZ2ggYml0IHNldC4KLQotVGh1IE1heSAzMCAxOTowMDoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19sY29tbSk6IFNldCBzZWN0aW9uIGZsYWdzIGZvciAuc2JzcyBzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzY0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc190YXJnZXRfZm9ybWF0KTogSWYgbWlwc182NCwgcmV0dXJuIGVsZjY0IHRhcmdldHMgcmF0aGVyIHRoYW4KLQllbGYzMiBvbmVzLgotCShtZF9sb25nb3B0cyk6IEFkZCAiMzIiIGFuZCAiNjQiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLTMyIGFuZCAtNjQuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC0zMiBhbmQgLTY0LgotCShjb25zX2ZpeF9uZXdfbWlwcyk6IElmIG1pcHNfNjQsIGRvbid0IGNvbnZlcnQgYW4gOCBieXRlIHJlbG9jIHRvCi0JYSA0IGJ5dGUgb25lLgotCi1UaHUgTWF5IDMwIDEwOjM2OjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChjb21tZW50X2NoYXJzKTogTWFrZSAnIScgYSBjb21tZW50IGNoYXJhY3RlcgotCWZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogVW5kZXIgUG93ZXJQQyBTb2xhcmlzLCBjb252ZXJ0IGEKLQkuc3RhYmQgd2l0aCA0IGFyZ3VtZW50cyBpbnRvIGEgLnN0YWJuLgotCi1XZWQgTWF5IDI5IDE2OjQzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBXaGVuIHBhc3NpbmcgWF9hZGRfbnVtYmVyIHRvCi0JbWFjcm9fYnVpbGQsIGNhc3QgaXQgdG8gaW50IGZpcnN0LgotCi1UdWUgTWF5IDI4IDEzOjI5OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXo4ay5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgZnhfcl90eXBlIG9mIDAsIGFzCi0JY3JlYXRlZCBieSBlbWl0X2V4cHIuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NyZWF0ZSk6IElmIGJmZF9tYWtlX2VtcHR5X3N5bWJvbCBmYWlscywgY2FsbAotCWFzX3BlcnJvciByYXRoZXIgdGhhbiBhc3NlcnQuCi0KLUZyaSBNYXkgMjQgMTg6MjQ6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogTWFyayBzZWN0aW9ucyBjcmVhdGVkIHRvIGhvbGQKLQlmbG9hdGluZyBwb2ludCBpbmZvcm1hdGlvbiBhcyByZWFkIG9ubHkuCi0KLUZyaSBNYXkgMjQgMTI6MDc6NTQgMTk5NiAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NldF9jcHUpOiBDaGFuZ2UgZGVmYXVsdHMgdG8gbWF0Y2ggQUlYLgotCi1UaHUgTWF5IDIzIDE3OjM0OjI0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIC5za2lwIGFzIGEgc3lub255bSBmb3IgLnNwYWNlLgotCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IEZvciBQb3dlclBDIEVMRiwgYWxsb3cgLnN0YWJkIHRvIHRha2UKLQk0IGFyZ3VtZW50cywgcHJvdmlkaW5nIHRoZSA0dGggYXJndW1lbnQgaXMgMCwgdG8gYWxsb3cKLQljb21wYXRpYmlsaXR5IHdpdGggdGhlIFNvbGFyaXMgYXNzZW1ibGVyLgotCi1UaHUgTWF5IDE2IDE1OjUxOjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmggKHN0cnVjdCBzaF9zZWdtZW50X2luZm9fdHlwZSk6IERlZmluZS4KLQkoVENfU0VHTUVOVF9JTkZPX1RZUEUpOiBEZWZpbmUuCi0JKHNoX2Zyb2JfbGFiZWwpOiBEZWNsYXJlLgotCSh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCShzaF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlY2xhcmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKG1kX2Fzc2VtYmxlKTogSWYgcmVsYXhpbmcsIGVtaXQgYSBSX1NIX0NPREUKLSAJcmVsb2MgYmVmb3JlIHRoZSBpbnN0cnVjdGlvbiBpZiBuZWNlc3NhcnkuCi0JKHNoX2Zyb2JfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0JKHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IGZ1bmN0aW9uLgotCShzaF9jb2ZmX2Zyb2JfZmlsZSk6IElnbm9yZSBBTElHTiwgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcwotCXdoZW4gbG9va2luZyBmb3IgdGhlIHJlbG9jIGZvciB0aGUgdGFyZ2V0IG9mIC51c2VzLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBGaXggcHJpbnRmIGZvcm1hdCAoJTB4bHggdG8gMHglbHgpLgotCShzaF9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcyB0byBiZQotCWVtaXR0ZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IElnbm9yZSBDT0RFLCBEQVRBLCBhbmQgTEFCRUwgcmVsb2NzLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IEZvcmNlIENPREUsIERBVEEsIGFuZCBMQUJFTCByZWxvY3MgdG8gdXNlCi0JdGhlIGFic29sdXRlIHN5bWJvbC4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IEFkZCB0Y19zZWdtZW50X2luZm9fZGF0YSBmaWVsZCBpZgotCVRDX1NFR01FTlRfSU5GT19UWVBFIGlzIGRlZmluZWQuCi0KLVdlZCBNYXkgMTUgMTI6MjM6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3VyZSB0aGUgb3Bjb2RlIHN1ZmZpeAotCW1hdGNoZXMgdGhlIHJlZ2lzdGVyIHNpemUuCi0KLVdlZCBNYXkgMTUgMDg6MzM6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY291bnRfZW50cmllc19pbl9jaGFpbik6IElnbm9yZSBGaXh1cHMgd2l0aAotCWZ4X2RvbmUgc2V0LiAKLQkoZG9fcmVsb2NzX2Zvcik6IExpa2V3aXNlLgotCShmaXh1cF9zZWdtZW50KTogRG9uJ3QganVzdCBxdWl0IGlmIGxpbmtyZWxheCBpcyBzZXQuICBUcnkgdG8KLQlhcHBseSBub24gcGMtcmVsYXRpdmUgc3ltMS1zeW0yIGZpeHVwcywgZXZlbiBpZiBsaW5rcmVsYXggaXMKLQlub256ZXJvLgotCi1GcmkgTWF5IDEwIDE0OjE2OjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFsbG93IEdPVCBhbmQgc2VjdGlvbgotCXJlbGF0aXZlIHJlbG9jYXRpb25zIHdpdGggLW1yZWxvY2F0YWJsZS4gIEFsc28gYWxsb3cgdW5maXhlZAotCXJlbG9jcyBpbiAuZXhfc2hhcmVkLgotCi1UdWUgTWF5ICA3IDExOjI0OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHlhbmtfc3ltYm9scyk6IENoZWNrIHRoYXQgRk5BTUVfT0ZGU0VUIGlzCi0Jbm9uLXplcm8gYmVmb3JlIGFzc3VtaW5nIHRoaXMgaXMgYSBsb25nIGZpbGUgbmFtZS4KLQkod19zdHJpbmdzKTogTGlrZXdpc2UuCi0JKGNfZG90X2ZpbGVfc3ltYm9sKTogU2V0IEZOQU1FX09GRlNFVCB0byAxIGZvciBhIGxvbmcgZmlsZSBuYW1lLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod19zdHJpbmdzKTogTW92ZSBkZWNsYXJhdGlvbiBvZiBpIGluc2lkZQotCSNpZmRlZiBibG9jayB3aGljaCB1c2VzIGl0LgotCi1UdWUgTWF5ICA3IDAwOjQ5OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGRvX2FfZml4X2ltbSk6IFJlbmFtZSBsYXN0IGFyZ3VtZW50IHRvCi0JInJlbGF4bW9kZSIuICBPdXRwdXQgcmVsb2NzIHdoaWNoIGlkZW50aWZ5IHZhcmlvdXMgcmVsYXhpbmcKLQlwb3NzaWJpbGl0aWVzIGZvciBtb3YuW2J3bF0gaW5zdHJ1Y3Rpb25zLgotCShidWlsZF9ieXRlcyk6IFBhc3MgaW4gYSByZWxheGluZyBtb2RlIHRvIGRvX2FfZml4X2ltbS4KLQotTW9uIE1heSAgNiAxNToyNjoyOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKFRDX0hBTkRMRVNfRlhfRE9ORSk6IERlZmluZS4KLQkoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAobXlfZ2V0X2V4cHJlc3Npb24pOiBPbmx5IHdhdGNoIGZvciBiYWQgc2VnbWVudHMKLQlpZiBPQkpfQU9VVC4KLQkobWRfYXBwbHlfZml4Myk6IFJlbmFtZWQgZnJvbSBtZF9hcHBseV9maXguCi0JSWYgcGNyZWwgcmVsb2MgYW5kIHN5bWJvbCBpcyBpbiBkaWZmZXJlbnQgc2VjdGlvbiwgdW5kbyBlZmZlY3RzCi0Jb2YgbWRfcGNyZWxfZnJvbS4KLQotU2F0IE1heSAgNCAxMjo0OTozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QKLQlhbnkgcmVsb2Mgd2l0aCBhbiBMUiUgb3IgUlIlIGZpZWxkIHNlbGVjdG9yIGZvciBTT00uCi0KLVNhdCBNYXkgIDQgMTE6MjY6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHN1YnNlZ3MuaCB0byBhcHByb3ByaWF0ZSBUQVJHX0NQVV9ERVBfKgotIAl2YXJpYWJsZXMuCi0KLUZyaSBNYXkgIDMgMTc6NTg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IERvbid0IG1lcmdlIGEgc3ltYm9sIHdpdGgKLQlTRl9HRVRfU1RBVElDUyBzZXQuCi0JKHlhbmtfc3ltYm9scyk6IExpa2V3aXNlLgotCi1XZWQgTWF5ICAxIDEzOjM4OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IElmIE1BTllfU0VHTUVOVFMgYW5kIG5vdAotCUJGRF9BU1NFTUJMRVIsIGFkZCBuYW1lIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoY29mZl9oZWFkZXJfYXBwZW5kKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkoY3Jhd2xfc3ltYm9scyk6IEp1c3QgdXNlIHRoZSBuYW1lIGZpZWxkIGZvciB0aGUgc3ltYm9sIG5hbWUsCi0Jd2l0aG91dCB3b3JyeWluZyBhYm91dCBudWxsIGJ5dGUgdGVybWluYXRpb24uCi0JKHdfc3RyaW5ncyk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogTGlrZXdpc2UuICBBbHNvLCB1c2UgdGhlIG5hbWUgZmllbGQsIHJhdGhlcgotCXRoYW4gc2NuaGRyLnNfbmFtZS4KLQkob2JqX2NvZmZfYWRkX3NlZ21lbnQpOiBQZXJtaXQgbG9uZyBzZWN0aW9uIG5hbWVzLgotCShvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSB0aGUgbmFtZSBmaWVsZCwgcmF0aGVyIHRoYW4KLQlzY25oZHIuc19uYW1lLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGUtcGUuaCAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGJydGFiX2VtaXQpOiBEb24ndCBzZXQgZnhfaW1fZGlzcCBmaWVsZC4KLQkobWVtX2ZtdCk6IExpa2V3aXNlLgotCShtZF9hcHBseV9maXgpOiBEb24ndCBjaGVjayBmeF9pbV9kaXNwIGZpZWxkLgotCi1UaHUgQXByIDI1IDExOjM5OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgKiBhZnRlciBzcGFyYyotKi12eHdvcmtzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJZiB0Y19jb21tZW50X2NoYXJzIGlzIG5vdCBkZWZpbmVkLAotCWRlZmluZSBpdCB0byBjb21tZW50X2NoYXJzLiAgVXNlIHRjX2NvbW1lbnRfY2hhcnMgcmF0aGVyIHRoYW4KLQljb21tZW50X2NoYXJzLgotCShkb19zY3J1Yl9jaGFycyk6IFVzZSB0Y19jb21tZW50X2NoYXJzIHJhdGhlciB0aGFuIGNvbW1lbnRfY2hhcnMuCi0JKiBjb25maWcvdGMtbTY4ay5oICh0Y19jb21tZW50X2NoYXJzKTogRGVmaW5lLgotCShtNjhrX2NvbW1lbnRfY2hhcnMpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19jb21tZW50X2NoYXJzKTogUmVuYW1lIGZyb20KLQljb21tZW50X2NoYXJzLiAgQ2hhbmdlIGludG8gYSBwb2ludGVyIHJhdGhlciB0aGFuIGFuIGFycmF5LgotCShtZF9sb25nb3B0cyk6IEFkZCAiYml0d2lzZS1vciIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBPUFRJT05fQklUV0lTRV9PUi4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLS1iaXR3aXNlLW9yLgotCSogZG9jL2MtbTY4ay50ZXhpOiBEb2N1bWVudCAtLWJpdHdpc2Utb3IuCi0KLVdlZCBBcHIgMjQgMTE6Mjg6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUHJldmVudCBhdHRlbXB0cyB0byB1c2UgbG9uZyBvZmZzZXRzCi0gCWluIDY4MDAwIG1vZGUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOgotCWNhbGwgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4gIE5vbiBCRkRfQVNTRU1CTEVSIHZlcnNpb246Ci0JY29ycmVjdCBoYW5kbGluZyBvZiBpbnB1dCBsaW5lIHBvaW50ZXIsIGFuZCBjYWxsCi0JZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4KLQotTW9uIEFwciAyMiAxODowMjozNyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChpbl9iaXRmaWVsZF9yYW5nZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogTmV3IGNhc2VzIFgsWS4gIFVzZSBTUEFSQ19PUENPREVfQVJDSF9WOV9QLgotCShtZF9hcHBseV9maXgsIGNhc2VzIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwKLQlCRkRfUkVMT0NfU1BBUkNfe1dESVNQMTYsV0RJU1AxOX0pOiBGaXggdW5kZWZpbmVkIGNvZGUuCi0JKG1kX2FwcGx5X2ZpeCk6IE5ldyBjYXNlcyBCRkRfUkVMT0NfU1BBUkNfWzU2XS4KLQkodGNfZ2VuX3JlbG9jKTogTmV3IGNhc2VzIEJGRF9SRUxPQ19TUEFSQ19bNTZdLgotCi1UaHUgQXByIDE4IDE4OjU4OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IEJGRF9BU1NFTUJMRVI6Ci0gCShjb2ZmX2xhc3RfYmYpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogU2V0IGVuZG5keCBvZiBhIC5iZiBzeW1ib2wuCi0JTm9uIEJGRF9BU1NFTUJMRVI6Ci0JKG9ial9jb2ZmX2VuZGVmKTogQ2FsbCBTRl9TRVRfUFJPQ0VTUyBvbiBhIC5iZiBzeW1ib2wuCi0JKGxhc3RfYmZQKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoeWFua19zeW1ib2xzKTogU2V0IGVuZG5keCBvZiBhIC5iZiBzeW1ib2wuCi0KLVRodSBBcHIgMTggMTE6NTM6NTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciBTb2xhcmlzJ3MgLWxlCi0JYW5kIC1zIG9wdGlvbnMuICBBZGQgLWJlIGZvciBnb29kIG1lYXN1cmUuCi0KLVdlZCBBcHIgMTcgMTI6MzE6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfc3BhY2UpOiBTdXBwb3J0IG5vbi1jb25zdGFudCBmaWxsIHZhbHVlLiAgSGFuZGxlIGZpbGwKLQl2YWx1ZSBjb3JyZWN0bHkgZm9yIGEgc2l6ZSBvdGhlciB0aGFuIDEuCi0KLVR1ZSBBcHIgMTYgMTU6MTc6NDAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChteV9nZXRfZmxvYXRfZXhwcmVzc2lvbik6IFVwZGF0ZSBjYWxsIHRvCi0JZ2VuX3RvX3dvcmRzLCBYX1BSRUNJU0lPTiBjaGFuZ2VkIGZyb20gNiB0byA1LgotCi1UdWUgQXByIDE2IDEwOjI1OjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChyZWdpc3Rlcl9uYW1lLHJlZ19uYW1lX3NlYXJjaCk6IE1vdmUgcmVnaXN0ZXIKLQluYW1lIGxvb2t1cCBmcm9tIFBFIHNwZWNpZmljIGNvZGUgdG8gYWxsIHRhcmdldHMuICBBZGQgc3VwcG9ydCBmb3IKLQktbXJlZ25hbWVzLy1tbm8tcmVnbmFtZXMgdG8gY29udHJvbCB3aGV0aGVyIHJlZ2lzdGVyIG5hbWVzIGFyZQotCWV4cGFuZGVkIG9yIG5vdC4KLQkobWRfYXNzZW1ibGUpOiBDYWxsIHJlZ2lzdGVyX25hbWUgZm9yIGFsbCBwbGF0Zm9ybXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbXJlZ25hbWVzLy1tbm8tcmVnbmFtZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlKi0qLXNvbGFyaXMpOiBBZGQgc3VwcG9ydC4KLQkocG93ZXJwYyotKi1saW51eCk6IERpdHRvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWcvcHBjLXNvbC5tdDogTmV3IGNvbmZpZyBmaWxlIGZvciBQb3dlclBDIFNvbGFyaXMuCi0KLU1vbiBBcHIgMTUgMTI6MjY6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2Zyb2JfZmlsZSk6IFBlcm1pdCBtdWx0aXBsZSAlaGkgcmVsb2NzIHRvCi0JYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlICVsbyByZWxvYy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogQ2FzdCBYX2FkZF9udW1iZXIgdG8gdmFsdWVUCi0JYmVmb3JlIGNvbXBhcmluZyBhZ2FpbnN0IE1BWF9HUFJFTF9PRkZTRVQsIHNvIHRoYXQgbmVnYXRpdmUKLQludW1iZXJzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQkobWFjcm8pOiBMaWtld2lzZS4KLQotVGh1IEFwciAxMSAxMjozOTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsYXN0X2luc24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSk6IFdhcm4gYWJvdXQgcHV0dGluZyBmbG9hdGluZyBwb2ludCBicmFuY2hlcyBpbiBhCi0JZGVsYXkgc2xvdC4gIElmIGFyY2hpdGVjdHVyZSBpcyBsZXNzIHRoYW4gdjksIGluc2VydCBOT1AKLQlpbnN0cnVjdGlvbnMgYmV0d2VlbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgYW5kIGZsb2F0aW5nCi0JcG9pbnQgYnJhbmNoZXMuICAoVGhlIFN1bk9TIGFzc2VtYmxlciBkb2VzIGJvdGggdGhlc2Ugb3BlcmF0aW9ucy4pCi0JU2F2ZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvcGNvZGUuCi0JKHNwYXJjX2lwKTogQWRkIHBpbnNuIHBhcmFtZXRlci4gIENoYW5nZSBjYWxsZXIuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQ29ycmVjdCBjaGVjawotCWZvciBieXRlIGp1bXAgdG8gbmV4dCBpbnN0cnVjdGlvbiB0byBza2lwIGVtcHR5IGZyYWdzLgotCi1XZWQgQXByIDEwIDE2OjQ4OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogSWYgd2UgYXJlIGdvaW5nIHRvIGNhbGwgZW1pdF9hZGQ2NAotCWZvciBhZGRxIHdpdGggYSAxNiBiaXQgc2lnbmVkIHZhbHVlLCBqdXN0IGVtaXQgYSBsZGEgaW5zdHJ1Y3Rpb24KLQlpbnN0ZWFkLgotCi1XZWQgQXByIDEwIDE0OjM0OjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGRvX2FfZml4X2ltbSk6IERvbid0IGN1dCBvZmYgaGlnaCBiaXRzCi0Jb2YgYSAzMmJpdCBvcGVyYW5kLgotCi1Nb24gQXByICA4IDE0OjQyOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDUgMTc6MDE6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X3NwZWNpZmljKTogUmVtb3ZlIHNvbWUgI2lmIDAgY29kZS4KLQkoYnVpbGRfYnl0ZXMpOiBSZW1vdmUgYWxsIEFCU01PViByZWxhdGVkIGNvZGU7IGl0J3MgdW5uZWNlc3NhcnkuCi0KLUZyaSBBcHIgIDUgMTU6MTM6MTAgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYzogRml4IGhhbmRsaW5nIG9mIGRlbm9ybWFsaXplZCBleHRlbmRlZAotCXByZWNpc2lvbiBudW1iZXJzIGFuZCBvdmVyZmxvdy91bmRlcmZsb3cgZGV0ZWN0aW9uLgotCShNQVhfUFJFQ0lTSU9OLCBYX1BSRUNJU0lPTiwgUF9QUkVDSVNJT04pOiBDaGFuZ2VkIGZyb20gNiB0byA1LCB0bwotCW5vdCBpbmNsdWRlIHRoZSAxNiBiaXQgZ2FwIGluIHRoZSBtNjhrIGV4dGVuZGVkIHByZWNpc2lvbiBmb3JtYXQuCi0KLUZyaSBBcHIgIDUgMTQ6Mjk6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBpMzg2LSotZnJlZWJzZGVsZiogdGFyZ2V0OyBmcm9tIEpvaG4gUG9sc3RyYQotCTxqZHBAcG9sc3RyYS5jb20+LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByICA1IDE4OjM5OjI4IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQWxsb3cgbm9uLXplcm8gb2Zmc2V0cyBmcm9tIC5zZGF0YSBzeW1ib2xzIHRvCi0gCWJlIGFjY2Vzc2VkIHVzaW5nIHRoZSAkZ3AgcmVnaXN0ZXIuCi0JKiBjb25maWcvdGMtbWlwcy5oIChNQVhfR1BSRUxfT0ZGU0VUKTogQWRkZWQuCi0KLVdlZCBBcHIgIDMgMTA6NTY6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX21kX2VuZCk6IFNldCBiZmQgbWFjaGluZSBudW1iZXIgdG8KLQliZmRfbWFjaF9zcGFyY19zcGFyY2xldCBpZiBjdXJyZW50X2FyY2hpdGVjdHVyZSBpcyBzcGFyY2xldC4KLQotTW9uIEFwciAgMSAxNjo1NTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBCdW1wIGxpbmUgY291bnRlcnMgYmFzZWQgb24KLQlpbnB1dF9saW5lX3BvaW50ZXJbLTFdLCBub3QgKmlucHV0X2xpbmVfcG9pbnRlci4gIERvbid0IGJvdGhlciB0bwotCWNhbGwgTElTVElOR19ORVdMSU5FLgotCShzX21hY3JvKTogRG9uJ3QgY2FsbCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLgotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogV2hlbiBoYW5kbGluZyBDIHN0eWxlIGNvbW1lbnRzLCB1bmdldAotCWNoMiByYXRoZXIgdGhhbiBjaC4KLQotRnJpIE1hciAyOSAxNjoxNTowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoZW51bSBsaW5rb25jZV90eXBlKTogRGVmaW5lLgotCShzX2xpbmtvbmNlKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAibGlua29uY2UiLgotCShzX2xpbmtvbmNlKTogTmV3IGZ1bmN0aW9uLgotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IEFkZCBsaW5rb25jZSBmaWVsZCB0bwotCU1BTllfU0VHTUVOVFMgJiYgISBCRkRfQVNTRU1CTEVSIHNlY3Rpb24uCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2hhbmRsZV9saW5rX29uY2UpOiBEZWZpbmUgaWYgVEVfUEUuCi0JKG9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UpOiBEZWNsYXJlIGlmIFRFX1BFLgotCSogY29uZmlnL29iai1jb2ZmLmM6IElmIFRFX1BFIGFuZCBub3QgQkZEX0FTU0VNQkxFUiwgI2luY2x1ZGUKLQkiY29mZi9wZS5oIi4KLQkob2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSk6IE5ldyBmdW5jdGlvbiwgZGVmaW5lZCBpZiBURV9QRS4KLQkoY19zZWN0aW9uX3N5bWJvbCk6IElmIFRFX1BFLCBzZXQgdGhlIHhfY29tZGF0IGZpZWxkIGluIHRoZSBhdXgKLQllbnRyeSBiYXNlZCBvbiB0aGUgbGlua29uY2UgZmllbGQgaW4gc2VnbWVudF9pbmZvLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC5saW5rb25jZS4KLQotRnJpIE1hciAyOSAxMTozMToyNyAxOTk2ICBKLlQuIENvbmtsaW4gIChqdGNAbGlzYS5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMuMTogQ2hhbmdlZCB0byBiZSByZWNvZ25pemVkIGJ5IGNhdG1hbiAtdyBvbiBTb2xhcmlzLgotCi1UaHUgTWFyIDI4IDE1OjI3OjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBDYWxsIHRoZSBsaXN0aW5nIGZ1bmN0aW9ucyBiZWZvcmUKLQlkb2luZyB0aGUgcmVzdCBvZiB0aGUgcHJvY2Vzc2luZywgd2hpY2ggbWF5IGludm9sdmUgZnJlZWluZyB0aGUKLQlzdHJpbmcuICBQYXNzIHN0cmluZywgbm90IHN0cmluZyArIHN0cm9mZiwgdG8gT0JKX1BST0NFU1NfU1RBQiBpbgotCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMgY2FzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogUmVtb3ZlIG5lc3RlZCBjb21tZW50LgotCSh0Y19nZW5fcmVsb2MpOiBNb3ZlIGxhYmVsIGRvbmUgaW5zaWRlIHRoZSBpZmRlZiBpbiB3aGljaCBpdCBpcwotCXVzZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IFBhc3MgcG9pbnRlcnMgdG8gY29ycmVjdCB0eXBlcyB0byBsaWJocHBhLmgKLQlmdW5jdGlvbnMuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfZmlsZSk6IERlZmluZS4KLQkobWlwc19mcm9iX2ZpbGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAoc3RydWN0IG1pcHNfaGlfZml4dXApOiBEZWZpbmUuCi0JKG1pcHNfaGlfZml4dXBfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGltbV91bm1hdGNoZWRfaGkpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSk6IENsZWFyIGltbV9yZWxvYywgaW1tX3VubWF0Y2hlZF9oaSwgYW5kCi0Jb2Zmc2V0X3JlbG9jLiAgUGFzcyBpbW1fdW5tYXRjaGVkX2hpIHRvIGFwcGVuZF9pbnNuLgotCShhcHBlbmRfaW5zbik6IEFkZCB1bm1hdGNoZWRfaGkgcGFyYW1ldGVyLiAgSWYgaXQgaXMgc2V0LCBhZGQgdGhlCi0JbmV3IGZpeHVwIHRvIG1pcHNfaGlfZml4dXBfbGlzdC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWlwc19pcCk6IFNldCBpbW1fdW5tYXRjaGVkX2hpIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgTWFyIDI4IDExOjQ3OjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMtKi1zb2xhcmlzMiopOiBSZW5hbWVkIGZyb20gc3BhcmMqLSotc29sYXJpczIqLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVHVlIE1hciAyNiAxODoxOToxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lLgotCi1GcmkgTWFyIDIyIDExOjEzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoc3RyZHVwKTogRG9uJ3QgZGVjbGFyZS4KLQkqIHN0YWJzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmgKLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFVzZSB4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQkoc19zdGFiX2dlbmVyaWMpOiBMaWtld2lzZS4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAoc19tcmlfc2VjdCk6IExpa2V3aXNlLgotCi0JKiBnYXNwLmMgKGNoYW5nZV9iYXNlKTogUmVjb2duaXplIFwoLi4uKSBjb25zdHJ1Y3QgZG9jdW1lbnRlZCB0bwotCXBhc3MgdGhyb3VnaCBlbmNsb3NlZCBjaGFyYWN0ZXJzIGxpdGVyYWxseSB0aHJvdWdoIHRvIHRoZSBvdXRwdXQuCi0JKHByb2Nlc3NfYXNzaWducyk6IExpa2V3aXNlLiAgQWxzbywgYmUgbW9yZSBjYXJlZnVsIHRvIGF2b2lkCi0JbG9va2luZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLQotVGh1IE1hciAyMSAxMzoxODo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BhcnNlX29wdGlvbik6IElmIE9CSl9FTEYsIGlnbm9yZSAtayBmb3IKLQlGcmVlQlNEIGNvbXBhdGliaWxpdHkuICBGcm9tIEpvaG4gUG9sc3RyYSA8amRwQHBvbHN0cmEuY29tPi4KLQotV2VkIE1hciAyMCAxODoxMzozMiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZG9jL2FzLnRleGluZm8sIGRvYy9jLWk5NjAudGV4aTogRml4IHR5cG9zLgotCi1XZWQgTWFyIDIwIDE3OjA1OjE2IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogQWRkZWQgY3Z0c3QgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBNYXIgMTggMTM6MTI6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogRG9uJ3QgdHJ5IHRvIG1ha2UgYSBzeW1ib2wgb3V0IG9mIHRoZSBzdGFiCi0Jc3RyaW5nLiAgRXh0cmFjdCB0aGUgYWRkZW5kIGZyb20gdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uLgotCi1GcmkgTWFyIDE1IDE3OjEwOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSWYgd2hpdGVzcGFjZSBpcyBzZWVuIGluIHN0YXRlIDExLCBhbmQKLQlMQUJFTFNfV0lUSE9VVF9DT0xPTlMgaXMgbm90IGRlZmluZWQsIGFuZCB3ZSBhcmUgbm90IGluIG02OGsgTVJJCi0JbW9kZSwgY2hhbmdlIHRoZSBzdGF0ZSB0byAzIHJhdGhlciB0aGFuIDEuCi0KLVRodSBNYXIgMTQgMTg6MTg6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoQ19SRUdJU1RFUl9TRUNUSU9OKTogQ2hhbmdlIGZyb20gMjAgdG8gNTAsIHRvCi0JY29ycmVzcG9uZCB0byAxMSBNYXJjaCBjaGFuZ2UuCi0KLVRodSBNYXIgMTQgMTU6Mjc6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoYnVpbGRfYnl0ZXMsIE1FTUlORCBjYXNlKTogR2VuZXJhdGUKLQlhbiBSX01FTV9JTkRJUkVDVCByZWxvYyByYXRoZXIgdGhhbiBSX1JFTEJZVEUuCi0KLVR1ZSBNYXIgMTIgMTI6MjE6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLU1vbiBNYXIgMTEgMTg6NTc6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGdlbl90b193b3Jkcyk6IEltcHJvdmUgaGFuZGxpbmcgb2YKLQlYX1BSRUNJU0lPTiBudW1iZXJzLiAgQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEFuZHJlYXMgU2Nod2FiCi0JPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4uCi0KLU1vbiBNYXIgMTEgMDk6NTk6NTMgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoU0VHX05PUk1BTCwgU0VHX0xJU1QpOiBCdW1wIHNlZ21lbnQgbGltaXQgZnJvbSAxMCB0byA0MC4KLQkoU0VHX0xBU1QpOiBOZXcuCi0JKiBzdWJzZWdzLmMgKE1BTllfU0VHTUVOVFMpOiBJbmNyZWFzZSBzZWdtZW50IGxpbWl0LgotCSogb2JqLWNvZmYuYyAoc2VnX05fVFlQRSwgc2VnX2luZm9fb2ZmX2J5XzQpOiBMaWtld2lzZS4KLQkoZG9fcmVsb2NzX2Zvciwgd19zeW1ib2xzLCBvYmpfY29mZl9hZGRfc2VnbWVudCwgZG9fbGluZW5vc19mb3IsCi0JY3Jhd2xfc3ltYm9scywgY29mZl9oZWFkZXJfYXBwZW5kKTogTG9vcCB0byBTRUdfTEFTVCByYXRoZXIgdGhhbgotCVNFR19FOS4KLQkKLVRodSBNYXIgIDcgMTU6MTc6MzkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEhhbmRsZSBvcGVyYW5kIGNoYXIgJ08nIChuZWcgcmVnKS4KLQotVGh1IE1hciAgNyAwOToxOToxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKFNVQlNFR19NSUxMSSk6IERlZmluZS4KLQkocGFfZGVmX3N1YnNwYWNlcyk6IEFkZCAkTUlMTElDT0RFJC4KLQkocGFfc3BhY2VzX2JlZ2luKTogU2V0IHNlY3Rpb24gZmxhZ3MgZm9yICRNSUxMSUNPREUkLgotCi1XZWQgTWFyICA2IDE0OjExOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogT25seSBTRUNfTE9BRCBpZiB0aGUgdHlwZSBpcwotCW5vdCBTSFRfTk9CSVRTLiAgRG9uJ3QgdGFtcGVyIHdpdGggZmxhZ3MgYmFzZWQgb24gdHlwZSBpZiBhCi0Jc3BlY2lhbCBzZWN0aW9uIHdhcyBmb3VuZCAocmV2ZXJ0IEZlYiAyOSBjaGFuZ2UpLgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBPbmx5IGFsaWduIHVzaW5nIHRoZSBub3AgcGF0dGVybgotCWlmIGFsaWduaW5nIHRvIGEgbG9uZ3dvcmQgYm91bmRhcnkgb3IgZ3JlYXRlci4KLQotVHVlIE1hciAgNSAxNToxMDo0MyAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IFBhc3MgMSBub3QgMiB0byBmcmFnX2FsaWduLgotCi1Nb24gTWFyICA0IDIwOjUwOjU3IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWN5Z3dpbjMyKTogRG9uJ3QgdXNlIGJmZF9nYXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTWFyICA0IDEwOjEzOjA2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQWRkIGRlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIFJfTjBTRUwgYW5kCi0JUl9OMVNFTCBzaW5jZSB0aGV5J3JlIG5vdCBkZWZpbmVkIGZvciBvbGQgdmVyc2lvbnMgb2YgaHB1eC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogRml4IHR5cG8gaW4gUl9DT01QMiBjb2RlLgotCVNldCAic3ltX3B0cl9wdHIiIGFuZCAiYWRkZW5kIiBmaWVsZHMgdG8gZHVtbXkgdmFsdWVzIGZvcgotCVJfTjBTRUwgYW5kIFJfTjFTRUwuCi0KLUZyaSBNYXIgIDEgMTA6MjA6NTIgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGZsb251bS1rb25zdC5jOiBBZGQgdHdvIG1vcmUgY29uc3RhbnRzIGZvciAxZSstMjA0OCBhbmQKLQkxZSstNDA5NiwgYW5kIGNvcnJlY3QgdGhlIG90aGVyIGNvbnN0YW50cy4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBPX2xvZ2ljYWxfbm90LgotCi1UaHUgRmViIDI5IDEzOjU4OjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgcHJlZGVmaW5lZCBzZWN0aW9uCi0JdHlwZXMgdG8gc2V0IHRoZSBub2JpdHMgdHlwZS4gIEF2b2lkIGEgc2hhZG93ZWQgZGVjbGFyYXRpb24uCi0KLVdlZCBGZWIgMjggMTU6Mzg6NTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogRm9yIFNPTSwgZG9uJ3QKLQlyZWR1Y2UgcmVsb2NzIHVzaW5nIGVfbmxyc2VsIGZpZWxkIHNlbGVjdG9ycy4KLQotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBEb24ndCB1c2UgI2VsaWYuICBTb21lIGNvbXBpbGVycwotCWRvbid0IGhhbmRsZSBpdC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc2VsZWN0b3JfdGFibGUpOiBBZGQgIm4iLCAibmwiLCBhbmQgIm5sciIgdG8KLQl0aGUgc2VsZWN0b3IgdGFibGUuCi0JKHBhX2Noa19maWVsZF9zZWxlY3Rvcik6IEhhbmRsZSBuZXcgZmllbGQgc2VsZWN0b3JzIGZvciBTT00uCi0KLVR1ZSBGZWIgMjcgMTQ6NDI6MjcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWxpbnV4KmFvdXQqLCBtNjhrLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtbGludXguaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCkgW1RFX0xJTlVYXTogRGVmaW5lIHRvCi0JImEub3V0LW02OGstbGludXgiLgotCSogY29uZmlnL3RjLW02OGsuYyAoY29tbWVudF9jaGFycyk6IERvbid0IGluY2x1ZGUgJyMnIGlmIFRFX0xJTlVYCi0JaXMgZGVmaW5lZC4KLQotTW9uIEZlYiAyNiAxODo1ODo1OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIHRvIGhhbmRsZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCi1Nb24gRmViIDI2IDEwOjM0OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBQcmludCBhbGwgYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQKLQl0aGUgaW5zbiBvbiBtaXNtYXRjaC4KLQotRnJpIEZlYiAyMyAyMTo0NDozOSAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBhMjktY29mZi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEZlYiAyMiAxNjozOTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9jb2ZmX2Zyb2JfZmlsZSk6IERvbid0IGNvbnNpZGVyIHRoZSBhZGRyZXNzCi0Jb2YgdGhlIHNlY3Rpb24gd2hlbiBsb29raW5nIGZvciB0aGUgUl9TSF9VU0VTIGZpeHVwLCBiZWNhdXNlIHRoZQotCWZyYWcgYWRkcmVzc2VzIGhhdmUgbm90IHlldCBiZWVuIGFkanVzdGVkLgotCi0JKiBnZGJpbml0LmluOiBTZXQgYSBicmVha3BvaW50IG9uIGFzX3dhcm5fd2hlcmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQWRkIG1pc3NpbmcgYXJndW1lbnRzIHRvIG1hY3JvX2J1aWxkCi0Jb21pdHRlZCBpbiBsYXN0IGNoYW5nZS4gIEZyb20gSmltIFdpbHNvbiA8d2lsc29uQGN5Z251cy5jb20+LgotCi1XZWQgRmViIDIxIDE3OjAwOjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHRjX3JlbG9jX21hbmdsZSk6IENoYW5nZSByZWxvYyBiYXNlZCBvbiBzaXplCi0JaWYgaXQgaXMgVENfQ09OU19SRUxPQy4gIFNldCBhIHNpemUgb2YgNCB0byBSX1JFTExPTkcuCi0KLVdlZCBGZWIgMjEgMDk6MjU6MzkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlY29nbml6ZSAlYXNyMCBmb3IgdjguCi0KLVR1ZSBGZWIgMjAgMjE6NDg6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChwYXJzZV9rZXl3b3JkX2FyZyk6IEFjY2VwdCBsZWFkaW5nICclJy4KLQkoc3BhcmNfaXApOiBBY2NlcHQgJWFzclsxLi4zMV0gZm9yIHY4IGFuZCAlYXNyWyUxNi4uMzFdIGZvciB2OS4KLQlSZWNvZ25pemUgW3VVXSBmb3JtYXQgYXJncyBhcyBzcGFyY2xldCBjcHJlZ3MuCi0KLVR1ZSBGZWIgMjAgMjI6MjU6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfaGFuZGxlX2FsaWduKTogRG9uJ3QgZW1pdCBSX1NIX0FMSUdOIHJlbG9jcwotCWluIGJzc19zZWN0aW9uLgotCi1Nb24gRmViIDE5IDE0OjE2OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IENoZWNrIFNfSVNfV0VBSyBhcwotCXdlbGwgYXMgU19JU19FWFRFUk5BTC4KLQkodGNfZml4X2FkanVzdGFibGUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJbiBPQkpfRUxGIGNhc2UsIGNoZWNrIGZvcgotCVNfSVNfV0VBSyBhcyB3ZWxsIGFzIFNfSVNfRVhURVJOQUwgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIHJldHVybgotCWVhcmx5LgotCSh0Y19nZW5fcmVsb2MpOiBDaGVjayBTX0lTX1dFQUsgYXMgd2VsIGFzIFNfSVNfRVhURVJOQUwgd2hlbgotCWRlY2lkaW5nIHdoZXRoZXIgdG8gY29udmVydCBCRkRfUkVMT0NfMzJfUENSRUxfUzIgaWYgUElDLgotCi1Nb24gRmViIDE5IDAyOjE1OjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWF4X2FyY2hpdGVjdHVyZSk6IENoYW5nZSB0byBzcGFyY2xpdGUgZm9yCi0JMzIgYml0IGFyY2guCi0JKGRlZmF1bHRfY29tcGF0aWJsZSk6IERlbGV0ZS4KLQkoc3BhcmNfZmZzKTogTmV3IGZ1bmN0aW9uLgotCShtZF9iZWdpbik6IE9ubHkgY2FsbCBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCBvbmNlLgotCShzcGFyY19pcCk6IFJld3JpdGUgYXJjaGl0ZWN0dXJlIG1hdGNoIGFuZCBidW1wIGxvZ2ljLgotCi1TdW4gRmViIDE4IDE1OjAzOjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLSAJdHJ5aW5nIHRvIHVzZSAtcnBhdGguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBGZWIgMTYgMTY6NTM6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0ZfQURKX0xOTk9QVFIpOiBEZWZpbmUgKG5vbiBCRkRfQVNTRU1CTEVSKS4KLQkoU0ZfR0VUX0FESl9MTk5PUFRSKTogRGVmaW5lIChub24gQkZEX0FTU0VNQkxFUikuCi0JKFNGX1NFVF9BREpfTE5OT1BUUik6IERlZmluZSAobm9uIEJGRF9BU1NFTUJMRVIpLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogU2V0IEFESl9MTk5PUFRSIHdoZW4gTE5OT1BUUgotCWlzIHNldC4KLQkod19zeW1ib2xzKTogSWYgQURKX0xOTk9QVFIgaXMgc2V0LCBhZGQgdGhlIHNlY3Rpb24gbG5ub3B0ciBmaWVsZAotCXRvIHRoZSBzeW1ib2wgbG5ub3B0ciBmaWVsZCwgdG8gZ2V0IHRoZSBjb3JyZWN0IGZpbGUgb2Zmc2V0LgotCi1UaHUgRmViIDE1IDE0OjQ4OjM4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogT24gdGhlIFBvd2VyUEMsIGZvcmNlIGFsbAotCXN5bWJvbHMgdGhhdCBhcmUgbm90IGZ1bmN0aW9uLCBmaWxlLCBvciBzZWN0aW9uIHN5bWJvbHMgdG8gYmUKLQlvYmplY3QgdHlwZXMuCi0KLVRodSBGZWIgMTUgMTE6MjA6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBhbmQgc3Vic3RpdHV0ZSBSUEFUSF9FTlZWQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShjaGVjayk6IFVzZSAkKFJQQVRIX0VOVlZBUikgcmF0aGVyIHRoYW4gTERfTElCUkFSWV9QQVRILgotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBpNjg2LiAgRnJvbSBILkouIEx1IDxoamxAem9vbS5jb20+OiBpMzg2Ci0JZG9lc24ndCBuZWVkIG9wY29kZXMuICBJZiBjb25maWd1cmluZyBzaGFyZWQsIG9wY29kZXMgbmVlZHMgYmZkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgRmViIDE0IDE2OjMzOjEyIDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIHJlYWQuYyAoc19tcmlfc2VjdCk6IERvbid0IHJldHVybiAnXDAnIGluIHR5cGUuICBTZXQgYWxsCi0JYXBwcm9wcmlhdGUgZmxhZ3MgaW4gQkZEIHNlY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLXBzb3MqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90ZS1wc29zLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLW02OGsuYyAoY29tbWVudF9jaGFycyk6IERvbid0IGluY2x1ZGUgJyMnIGlmIFRFX1BTT1MKLQlpcyBkZWZpbmVkLgotCi1XZWQgRmViIDE0IDEzOjQzOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluOiBSZW1vdmUgZHVwbGljYXRlIHNldHRpbmcgb2YgY3B1X3R5cGUuICBDaGVjawotCXdoZXRoZXIgb3Bjb2RlcyBsaWJyYXJ5IGlzIHJlcXVpcmVkIGZvciBvbiBhbGwgdGFyZ2V0cywgbm90IGp1c3QKLQlwcmltYXJ5IG9uZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19iaWdfZ290KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19leHRlcm4pOiBEb24ndCBkZWNsYXJlLgotCShyZWdfbmVlZHNfZGVsYXkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYWNyb19idWlsZCk6IFBlcm1pdCBHT1QvQ0FMTF9ISS9MTyByZWxvY3MuCi0JKG1hY3JvX2J1aWxkX2x1aSk6IElmIHBsYWNlIGlzIG5vdCBOVUxMLCB1c2UgdGhlIG51bWJlciBpbiB0aGUKLQlleHByZXNzaW9uLgotCShsb2FkX2FkZHJlc3MpOiBIYW5kbGUgbWlwc19iaWdfZ290IGNhc2UuCi0JKG1hY3JvKTogSGFuZGxlIG1pcHNfYmlnX2dvdCBmb3IgTV9MQV9BQiwgTV9KQUxfQSwgYW5kIGxvYWQgYW5kCi0Jc3RvcmUgbWFjcm9zLgotCShPUFRJT05fWEdPVCk6IERlZmluZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgInhnb3QiIGlmIE9CSl9FTEYuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAteGdvdC4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLXhnb3QuCi0JKG1kX2FwcGx5X2ZpeCk6IFBlcm1pdCBHT1QvQ0FMTF9ISS9MTyByZWxvY3MuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBHT1QvQ0FMTF9ISS9MTyByZWxvY3MuCi0KLVdlZCBGZWIgMTQgMTE6MjI6MjcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApIFtvcGVyYW5kIGtpbmQgJyMnXTogV2hlbiBmaXhpbmcKLQl0aGUgYnl0ZSByZWxvY2F0aW9uLCBwb2ludCBpdCB0byB0aGUgbG93IGJ5dGUgb2YgdGhlIHdvcmQuCi0KLVR1ZSBGZWIgMTMgMTU6MzE6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTIgMTU6NTM6NDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGFueSBzcGFyYyogY3B1LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotTW9uIEZlYiAxMiAxNTo0MToyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAibXJpIiBhbmQgIi5tcmkiLgotCShzX21yaSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAoc19tcmkpOiBEZWNsYXJlLgotCSogYXBwLmMgKHNjcnViX202OGtfbXJpKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobXJpX3BzZXVkbyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGRvX3NjcnViX2JlZ2luKTogQWRkIG02OGtfbXJpIHBhcmFtZXRlci4gIFVzZSBpdCByYXRoZXIgdGhhbgotCWZsYWdfbTY4a19tcmkuICBJbml0aWFsaXplIHNjcnViX202OGtfbXJpLgotCShtcmlfc3RhdGUsIG1yaV9sYXN0X2NoKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBhcHBfc2F2ZSk6IEFkZCBzY3J1Yl9tNjhrX21yaSwgbXJpX3N0YXRlLCBhbmQgbXJpX2xhc3RfY2gKLQlmaWVsZHMuCi0JKGFwcF9wdXNoKTogU2F2ZSBuZXcgZmllbGRzLgotCShhcHBfcG9wKTogUmVzdG9yZSBuZXcgZmllbGRzLgotCShkb19zY3J1Yl9jaGFycyk6IENoZWNrIHNjcnViX202OGtfbXJpIHJhdGhlciB0aGFuIGZsYWdfbXJpX21yaS4KLQlJZiBUQ19NNjhLLCB1c2UgYSB0cml2aWFsIHN0YXRlIG1hY2hpbmUgdG8gbG9vayBmb3Igb2NjdXJyZW5jZXMgb2YKLQl0aGUgLm1yaSBwc2V1ZG8tb3AsIGFuZCBjaGFuZ2UgdGhlIG1vZGUgYXBwcm9wcmlhdGVseS4KLQkqIGFzLmggKGRvX3NjcnViX2JlZ2luKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX2JlZ2luKTogUGFzcyBmbGFnX202OGtfbXJpIHRvCi0JZG9fc2NydWJfYmVnaW4uCi0JKiBjb25maWcvdGMtbTY4ay5jIChyZWdfcHJlZml4X29wdGlvbmFsX3NlZW4pOiBOZXcgc3RhdGljCi0JdmFyaWFibGUuCi0JKG02OGtfbXJpX21vZGVfY2hhbmdlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgcmVnX3ByZWZpeF9vcHRpb25hbF9zZWVuLgotCSogY29uZmlnL3RjLW02OGsuaCAobTY4a19tcmlfbW9kZV9jaGFuZ2UpOiBEZWNsYXJlLgotCShNUklfTU9ERV9DSEFOR0UpOiBEZWZpbmUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLm1yaSBwc2V1ZG8tb3AuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEluIE1SSSBtb2RlLCBkb24ndCB0cmVhdCAnIycgYXMgYQotCWNvbW1lbnQgY2hhcmFjdGVyLgotCi1Nb24gRmViIDEyIDE1OjE2OjI5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JU3VwcG9ydCBmb3IgT0JKX0VMRiBvbiBtNjhrLCBtb3N0bHkgaW5zaWRlICNpZmRlZiBPQkpfRUxGOgotCSogY29uZmlnL202OGstcGFyc2UuaCAoZW51bSBwaWNfcmVsb2NhdGlvbik6IERlZmluZS4KLQkoc3RydWN0IG02OGtfZXhwKTogQWRkIHBpY19yZWxvYyBmaWVsZC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZS4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUgdG8gY2FsbCB0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlLgotCShOT19SRUxPQyk6IERlZmluZSB0byBCRkRfUkVMT0NfTk9ORSBpZiBCRkRfQVNTRU1CTEVSLCB0byB6ZXJvCi0Jb3RoZXJ3aXNlLgotCSogY29uZmlnL3RjLW02OGsuYzogRGVsZXRlIGRlZmluaXRpb24gb2YgTk9fUkVMT0MuCi0gCShzdHJ1Y3QgbTY4a19pdCk6IEFkZCBwaWNfcmVsb2MgZmllbGQuCi0JKGFkZF9maXgpOiBDb3B5IG92ZXIgcGljX3JlbG9jIGZpZWxkLgotCShtZF9wc2V1ZG9fdGFibGUpOiBJbnRlcnByZXQgLmFsaWduIHBhcmFtZXRlciBhcyBieXRlIGNvdW50LgotCShtb3RlX3BzZXVkb190YWJsZSk6IExpa2V3aXNlLgotCSh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfcmVsb2NfY29kZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBVc2UgaXQgYXMgbGFzdCBhcmd1bWVudCB0byBmaXhfbmV3X2V4cC4KLQkobWRfYXBwbHlfZml4XzIpOiBGb3IgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgZG9uJ3QgcHV0IHRoZQotCWFkZGVuZCBpbnRvIHRoZSBkYXRhLgotCSh0Y19nZW5fcmVsb2MpOiBEaWZmZXJlbnQgYWRkZW5kIGNvbXB1dGF0aW9uIGZvciBPQkpfRUxGLgotCShtNjhrX2lwKTogRG9uJ3QgcmVsYXggYW4gb3BlcmFuZCB0aGF0IHJlcXVpcmVzIHBpYyByZWxvY2F0aW9uLgotCShtZF9iZWdpbik6IEFsaWduIC50ZXh0LCAuZGF0YSBhbmQgLmJzcyBvbiA0IGJ5dGUgYm91bmRhcnkgYnkKLQlkZWZhdWx0LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkZCBzeW1ib2wgdmFsdWUgdG8gYWRkZW5kIGlmCi0gCVRDX002OEsgYW5kIE9CSl9FTEYuCi0JKiBjb25maWcvbTY4ay1wYXJzZS55ICh5eWxleCk6IEhhbmRsZSBAUExUUEMsIGV0Yy4KLQkobW90b3JvbGFfb3BlcmFuZCk6IEFkZCBydWxlIGZvciBgKHphcGMsIEVYUFIpJy4KLQotTW9uIEZlYiAxMiAxMDowNzozMyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCk6IEZpeGVkIHNvIHRoYXQgd2hpdGVzcGFjZQotCSpyZWFsbHkqIGlzIHBlcm1pc3NpYmxlIGJlZm9yZSB0aGUgY29tbWEuCi0KLU1vbiBGZWIgMTIgMDA6MTI6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBBbGlnbiB0byBhIDIgYnl0ZSBib3VuZGFyeSBiZWZvcmUKLQlpbnNlcnRpbmcgbm9wIGluc3RydWN0aW9ucy4KLQotRnJpIEZlYiAgOSAxMDo1NDoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90ZS1hdXguaDogQ2hhbmdlIGluY2x1ZGUgb2YgYXV4LmggdG8gYXV4LWNvZmYuaC4KLQotVGh1IEZlYiAgOCAyMDowMjo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IENvcnJlY3Qgc3RvcmFnZQotCWNsYXNzIHNldHRpbmcgZm9yIGEgQ0FMTE5BTUUgc3ltYm9sIGluIENPRkYuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFBhc3MgbmVnYXRpdmUgbnVtYmVycyBmb3IgbmV3IC5iYWxpZ25bd2xdIGFuZAotCS5wMmFsaWduW3dsXSBwc2V1ZG8tb3BzLgotCShzX2FsaWduX2J5dGVzKTogVHJlYXQgYSBuZWdhdGl2ZSBhcmd1bWVudCBhcyBzcGVjaWZ5aW5nIHRoZSBmaWxsCi0JbGVuZ3RoLgotCShzX2FsaWduX3B0d28pOiBMaWtld2lzZS4KLQotV2VkIEZlYiAgNyAxNDoxMjowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBiYWxpZ253LCBiYWxpZ25sLCBwMmFsaWdudywgYW5kIHAyYWxpZ25sLgotCShkb19hbGlnbik6IFRha2UgbmV3IGxlbiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBQYXNzIGl0Ci0JdG8gbWRfZG9fYWxpZ24uCi0JKHNfYWxpZ25fYnl0ZXMpOiBBcmcgbm93IGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxsIHBhdHRlcm4uCi0JKHNfYWxpZ25fcHR3byk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogUGFzcyBsZW5ndGggdG8KLQltZF9kb19hbGlnbi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX2RvX2FsaWduKTogVGFrZSBuZXcgbGVuIHBhcmFtZXRlci4KLQkqIGNvbmZpZy90Yy1tODhrLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtODhrX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBwc2V1ZG8tb3BzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfbWRlcHMpOiBEaXZpZGUgb2Zmc2V0IGJ5IGZyX3ZhciwgYXMgaXMKLQlkb25lIGluIGN2dF9mcmFnX3RvX2ZpbGwuCi0KLQkqIGNvbmZpZy90Yy1zaC5oIChzaF9kb19hbGlnbik6IERlY2xhcmUuCi0JKG1kX2RvX2FsaWduKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9saW5lbm8pOiBEb24ndCB0cnkgdG8gc3RvcmUgdGhlIGFkZHJlc3MKLQlkaWZmZXJlbmNlIGlmIHRoZSBuZXh0IGFkZHJlc3MgaXMgYmVmb3JlIHRoZSBjdXJyZW50IG9uZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IG02OGtfY3B1KTogQWRkIGFsaWFzIGZpZWxkLgotCShhcmNocyk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCShtNjhrX2lwKTogRG9uJ3QgbGlzdCBhbGlhcyBuYW1lcyB3aGVuIGxpc3RpbmcgQ1BVcyB3aGljaCBzdXBwb3J0Ci0JYW4gaW5zdHJ1Y3Rpb24uCi0KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHBhcnNlX2FyZ3MgYmVmb3JlIHJlYWRfYmVnaW4uCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJZiBmbGFnX202OGtfbXJpLCBkb24ndCBwdXQgYSBkb3QgaW4KLQlmcm9udCBvZiBnZW5lcmF0ZWQgcHNldWRvLW9wcy4KLQkqIHJlYWQuYyAocG90YWJsZSk6IElnbm9yZSAibmFtZSIuCi0JKHNfYXBwX2ZpbGUpOiBQZXJtaXQgYSBzaW5nbGUgcXVvdGUgYWZ0ZXIgdGhlIHN0cmluZywgc2luY2Ugb25lCi0JbWF5IGFwcGVhciBpbiBtNjhrIE1SSSBtb2RlLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAtLWVuYWJsZS1zaGFyZWQuICBJZiBsaW5raW5nIGFnYWluc3QKLQlzaGFyZWQgQkZEIGFuZCBvcGNvZGVzLCBmaXggbGlicmFyeSBuYW1lIG9uIFN1bk9TLCBhbmQgdHJ5IHRvIHNldAotCS1ycGF0aCByZWFzb25hYmx5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRmViICA2IDE1OjE2OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZmxhZ19tNjhrX21yaSk6IERlY2xhcmUuCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogSWYgVENfTTY4Sywgc2V0IGZsYWdfbTY4a19tcmkgZm9yIC1NLgotCSogTWFueSBmaWxlczogRm9yIE1SSSBzeW50YXggdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgbTY4ayBNUkkKLQlhc3NlbWJsZXIsIGNoZWNrIGZsYWdfbTY4a19tcmkgcmF0aGVyIHRoYW4gZmxhZ19tcmkgb3IKLQlNUklfTU9ERV9ORUVEU19QU0VVRE9fRE9ULgotCi1Nb24gRmViICA1IDE2OjI5OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAoQVJDSF9IWCk6IERlZmluZS4KLQkoYXJjaF90YWIpOiBBZGQgSFguCi0JKHRhcmdfaGFzX3Nmcik6IEhhbmRsZSBBUkNIX0hYLgotCSh0YXJnX2hhc19pY2xhc3MpOiBIYW5kbGUgQVJDSF9IWC4KLQkodGNfY29mZl9maXgycnR5cGUpOiBBZGQgcmV0dXJuIDAgdG8gYXZvaWQgd2FybmluZy4KLQkodGNfaGVhZGVyc19ob29rKTogSWYgdGhlIGFyY2hpdGVjdHVyZSB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHksCi0JdXNlIGl0IHdoZW4gc2V0dGluZyB0aGUgZmxhZ3MuICBTZXQgdGhlIGV4dGVybiB2YXJpYWJsZSBjb2ZmX2ZsYWdzCi0JcmF0aGVyIHRoYW4gaGVhZGVycy0+ZmlsZWhkci5mX2ZsYWdzLCBzaW5jZSB0aGUgbGF0dGVyIGlzIHNldAotCXVuY29uZGl0aW9uYWxseSBpbiBvYmotY29mZi5jLgotCShpOTYwX2hhbmRsZV9hbGlnbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgZml4cC4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGJmZCBhbmQgb3Bjb2RlcyBhcyBzaGFyZWQgbGlicmFyaWVzLCBiYXNlZCBvbgotCXBhdGNoZXMgZnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW46IFNldCBPUENPREVTIGFuZCBCRkQgdG8gc2VhcmNoIGRpcmVjdG9yaWVzLgotCVN1YnN0aXR1dGUgT1BDT0RFU19ERVAgYW5kIEJGRERFUC4gIE9uIFN1bk9TLCBzZXQgSExERkxBR1MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoTERGTEFHUywgSExERkxBR1MpOiBOZXcgdmFyaWFibGVzLgotCShMSUJERVBTKTogTmV3IHZhcmlhYmxlLgotCShhcy5uZXcwOiBEZXBlbmQgdXBvbiAkKExJQkRFUFMpIHJhdGhlciB0aGFuICQoTElCUykuICBVc2UKLQkkKEhMREZMQUdTKSBpbiBsaW5rLgotCShjaGVjayk6IFNldCBMRF9MSUJSQVJZX1BBVEggaW4gdGhlIGVudmlyb25tZW50LgotCi1GcmkgRmViICAyIDE3OjQxOjUzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBNYWtlIC5zZGF0YTIsIC5zYnNzMiwKLQkuUFBDLkVNQi5zZGF0YTAsIGFuZCAuUFBDLkVNQi5zYnNzMCBzZWN0aW9ucyBhbGwgZGVmYXVsdCB0bwotCXJlYWQtb25seSwgbm90IHJlYWQvd3JpdGUuCi0KLUZyaSBGZWIgIDIgMTQ6MDk6MjUgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9YRk9STSk6IFJlbW92ZSAtZS4KLQotRnJpIEZlYiAgMiAxMjozMjoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IFVzZSBTX0lTX0RFRklORUQgYW5kIFNfSVNfQ09NTU9OIHJhdGhlcgotCXRoYW4gY29tcGFyaW5nIFNfR0VUX1NFR01FTlQgdG8gdW5kZWZpbmVkX3NlY3Rpb24uCi0JKHdyaXRlX29iamVjdF9maWxlKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbgotCXVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFVzZSBTX0lTX0RFRklORUQgYW5kCi0JU19JU19DT01NT04gcmF0aGVyIHRoYW4gY29tcGFyaW5nIFNfR0VUX1NFR01FTlQgdG8KLQl1bmRlZmluZWRfc2VjdGlvbi4KLQkoU19HRVRfVkFMVUUpOiBMaWtld2lzZS4gIEF2b2lkIHJlY3Vyc2lvbiBwcm9ibGVtcyBpZiBTX0lTX0RFRklORUQKLQlvciBTX0lTX0NPTU1PTiBjYWxsIFNfR0VUX1ZBTFVFLgotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfQ09NTU9OKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9lbWl0X3JlbG9jYXRpb25zKTogSWYgYSByZWxvYyBpcyBlcXVhdGVkCi0JdG8gYW4gdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wsIGNvbnZlcnQgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QKLQl0aGUgdGFyZ2V0IHN5bWJvbC4KLQkob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gYW4KLQl1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0lTX0NPTU1PTik6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotYm91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IElmIGEgcmVsb2MgaXMgZXF1YXRlZAotCXRvIGFuIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLCBjb252ZXJ0IHRoZSByZWxvYyB0byBiZSBhZ2FpbnN0Ci0JdGhlIHRhcmdldCBzeW1ib2wuCi0JKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIGFuCi0JdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IFVzZSBTX0lTX0RFRklORUQgYW5kCi0JU19JU19DT01NT04gcmF0aGVyIHRoYW4gY29tcGFyaW5nIFNfR0VUX1NFR01FTlQgdG8KLQl1bmRlZmluZWRfc2VjdGlvbi4KLQkoeWFua19zeW1ib2xzKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbiB1bmRlZmluZWQgb3IKLQljb21tb24gc3ltYm9sLgotCi1UaHUgRmViICAxIDE1OjM0OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfTE9DQUwpOiBDaGVjayBmb3IgXDAwMiBhcyB3ZWxsIGFzIFwwMDEuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgotCi0JKiBjb25maWd1cmUuaW46IE1ha2Ugc3VyZSB3ZSBvbmx5IGFkZCBtNjhrLXBhcnNlLm8gdG8KLQkke2V4dHJhX29iamVjdHN9IG9uY2UsIG5vIG1hdHRlciBob3cgbWFueSBtNjhrIHRhcmdldHMgaGF2ZSBiZWVuCi0JZW5hYmxlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEphbiAzMSAxODozMTo0NiAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1jeWd3aW4zMiwgcHBjLSotY3lnd2luMzIpOiBOZXcuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMzEgMTQ6MDM6MTcgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiZXh0ZW5kIiBhbmQgImxkb3VibGUiLgotCSogZG9jL2MtbTY4ay50ZXhpOiBEb2N1bWVudCAuZXh0ZW5kIGFuZCAubGRvdWJsZS4KLQotCSogY29uZmlndXJlLmluIChtNjgqLWFwcGxlLWF1eCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL3RlLWF1eC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb21wYXJlX2V4dGVybmFsX3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24KLQlpZiBURV9BVVguCi0JKGRvX3JlbG9jc19mb3IpOiBTb3J0IHJlbG9jcyBpZiBURV9BVVguCi0JKGZpeHVwX3NlZ21lbnQpOiBJZiBURV9BVVgsIHN0b3JlIGNvbW1vbiBzeW1ib2wgdmFsdWUgaW4gc2VnbWVudC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgaWYgVEVfQVVYLgotCi1XZWQgSmFuIDMxIDEyOjI0OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfTE9DQUwpOiBDaGVjayBmb3IgXDAwMiBhcyB3ZWxsIGFzIFwwMDEuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfbWlwc19nbG9ibCk6IFNldCBCU0ZfT0JKRUNUIGlmIGl0IGlzIG5vdAotCUJTRl9GVU5DVElPTi4KLQkoc19jcGxvYWQpOiBTZXQgQlNGX09CSkVDVCBmb3IgX2dwX2Rpc3Agc3ltYm9sLgotCSogcmVhZC5jIChzX2xjb21tKTogSWYgU19TRVRfU0laRSBpcyBkZWZpbmVkLCBzZXQgdGhlIHNpemUgb2YgdGhlCi0Jc3ltYm9sLgotCSogZWNvZmYuYyAoYWRkX3Byb2NlZHVyZSk6IFNldCB0aGUgQlNGX0ZVTkNUSU9OIGZsYWcuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBJZiBTX1NFVF9TSVpFIGlzIGRlZmluZWQsIHNldCB0aGUgc2l6ZSBvZgotCWFuIHVuZGVmaW5lZCBzeW1ib2wgYW5kIHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gc3ltYm9sLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogSWYgVENfTUlQUywgc2V0IEJTRl9PQkpFQ1QKLQlmb3IgYWxsIGNvbW1vbiBzeW1ib2xzLgotCi1UdWUgSmFuIDMwIDEyOjM1OjI0IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChwYXJzZV9tZW1vcCk6IEluIE1SSSBtb2RlLCBkb24ndCB1c2UgaW1wbGljaXQKLQlzY2FsaW5nIG9mIGluZGV4LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBBY2NlcHQgMHggaGV4IGNvbnN0YW50cyBpbiBNUkkgbW9kZSBpZiBub3Qgb24KLQltNjhrLgotCi1Nb24gSmFuIDI5IDEyOjIxOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl90eXBlKTogU2V0IEJTRl9PQkpFQ1QgZmxhZyBmb3IgYSB0eXBlCi0Jb2Ygb2JqZWN0LiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi0JKiBlY29mZi5jIChsb2NhbHN5bV90KTogQWRkIGFkZGVuZCBmaWVsZC4KLQkoYWRkX2Vjb2ZmX3N5bWJvbCk6IEFkZCBhZGRlbmQgYXJndW1lbnQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvZmZfc3ltX3ZhbHVlKTogTWFrZSBzdGF0aWMuCi0JKGNvZmZfc3ltX2FkZGVuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9kZWYpOiBJbml0aWFsaXplIGNvZmZfc3ltX2FkZGVuZC4KLQkoZWNvZmZfZGlyZWN0aXZlX3ZhbCk6IEFjY2VwdCBzeW1ib2wgKyBjb25zdGFudC4KLQkoZWNvZmZfZGlyZWN0aXZlX2VuZGVmKTogUGFzcyBjb2ZmX3N5bV9hZGRlbmQgdG8gYWRkX2Vjb2ZmX3N5bWJvbC4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IEluY2x1ZGUgdGhlIGFkZGVuZCBpbiB0aGUgc3ltYm9sIHZhbHVlLgotCi1GcmkgSmFuIDI2IDE5OjI4OjUyIDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogSWdub3JlIG92ZXJmbG93IG9uIAotCUJGRF9SRUxPQ18xNl9HT1RPRkYgYW5kIEJGRF9SRUxPQ19QUENfVE9DMTYuCi0KLUZyaSBKYW4gMjYgMTY6MTQ6MTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBTREEyMSByZWxvY2F0aW9ucyBhcmUgbm93IDQKLQlieXRlcyBpbiBzaXplLCBzbyBvZmZzZXQgYXBwcm9wcmlhdGVseSBpbiBiaWcgZW5kaWFuIG1vZGUgd2hlbgotCXdyaXRpbmcgdGhlIGJvdHRvbSAyIGJ5dGVzLgotCi1UaHUgSmFuIDI1IDIwOjI2OjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoZGVmYXVsdF9jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIGl0LiAgUmV3cml0ZSB3YXJuX29uX2J1bXAgaGFuZGxpbmcuCi0JKHNwYXJjX2lwKTogSWYgbm8gYXJjaGl0ZWN0dXJlIG9yIC1idW1wIHNwZWNpZmllZCwgZG9uJ3QgbWFyayBhcwotCW1pc21hdGNoZWQgdGhvc2UgaW4gZGVmYXVsdF9jb21wYXRpYmxlLgotCi1UaHUgSmFuIDI1IDEyOjIxOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNDTyBFTEYgc3VwcG9ydCBmcm9tIFJvYmVydCBMaXBlIDxyb2JlcnRsQGFybmV0LmNvbT46Ci0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1zY28qZWxmKik6IFVzZSBmbXQgZWxmLCB0YXJnIHNjbzUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvc2NvNS5tdDogTmV3IGZpbGU7IHNldCBUREVGSU5FUyB0byAtRFNDT19FTEYuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzY29faWQpOiBOZXcgZnVuY3Rpb24sIGlmIFNDT19FTEYuCi0JKiBjb25maWcvdGMtaTM4Ni5oICh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEZWZpbmUgaWYgU0NPX0VMRi4KLQkoc2NvX2lkKTogRGVjbGFyZSBpZiBTQ09fRUxGLgotCi1UaHUgSmFuIDI1IDAzOjEwOjUzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoaW5pdGlhbF9hcmNoaXRlY3R1cmUsY2FuX2J1bXBfdjlfcCk6IERlbGV0ZWQuCi0JKHttYXgsd2Fybl9hZnRlcn1fYXJjaGl0ZWN0dXJlKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKG1kX2JlZ2luKTogUmVwbGFjZSBOVU1PUENPREVTIHdpdGggc3BhcmNfbnVtX29wY29kZXMuCi0JSWYgYm90aCBhcmNoaXRlY3R1cmUgYW5kIC1idW1wIHJlcXVlc3RlZCwgc2V0IG1heF9hcmNoaXRlY3R1cmUgdG8gbWF4LgotCShzcGFyY19tZF9lbmQpOiBTaW1wbGlmeS4KLQkoc3BhcmNfaXApOiBSZXBsYWNlIHJlZmVyZW5jZXMgdG8gY2FuX2J1bXBfdjlfcCB3aXRoIG1heF9hcmNoaXRlY3R1cmUuCi0JUmV3cml0ZSBjb2RlIHRvIGJ1bXAgYXJjaGl0ZWN0dXJlIGFuZCBjaGVjayBmb3IgY29uZmxpY3RzLgotCShtZF9sb25nb3B0cyk6IFJlY29nbml6ZSAteGFyY2g9e3Y4cGx1cyx2OHBsdXNhfSBmb3IgY29tcGF0aWJpbGl0eQotCXdpdGggU29sYXJpcyBhc3NlbWJsZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLiAgQ2FsbCBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2guCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUuCi0KLVdlZCBKYW4gMjQgMjI6MTE6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogRml4IHJlZmVyZW5jZSB0byAkJHtzcmNkaXJ9LgotCi1Nb24gSmFuIDIyIDA5OjIxOjM2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IFVzZSAjaWZkZWYgU1BBUkNfQVJDSDY0IGluc3RlYWQgb2YKLQkjaWZkZWYgc3BhcmN2OSB3aGVuIGNob29zaW5nIHZhbHVlLgotCShFTlY2NCk6IERlbGV0ZS4KLQkobWRfZW5kKTogRGVmaW5lLgotCShzcGFyY19tZF9lbmQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKFNQQVJDX1Y5KTogUmVuYW1lZCBmcm9tIHNwYXJjdjkuCi0JKGluaXRpYWxfYXJjaGl0ZWN0dXJlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoY2FuX2J1bXBfdjlfcCk6IExpa2V3aXNlLgotCShOT19WOSk6IERlbGV0ZSBhbGwgb2NjdXJyZW5jZXMuCi0JKHNwYXJjX21kX2VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBOZXcgbG9jYWwgdjlfYXJnX3AuICBSZXdvcmsgZnAgcmVnIG51bWJlciB0ZXN0LgotCURvbid0IGJ1bXAgYXJjaGl0ZWN0dXJlIHRvIHY5IHVubGVzcyBjYW5fYnVtcF92OV9wIHNldC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogLUE8YXJjaD4gcGFzc2VkLCBzZXQgY2FuX2J1bXBfdjlfcCBhY2NvcmRpbmdseS4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmM2NCB0YXJnZXQgY3B1KTogRG9uJ3Qgc2V0IG9ial9mb3JtYXQgaGVyZS4KLQkoU1BBUkNfVjkpOiBSZW5hbWVkIGZyb20gc3BhcmN2OS4KLQkoc3BhcmM2NC0qLWVsZiopOiBEZWZpbmUgU1BBUkNfQVJDSDY0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGFjY29uZmlnLmggKFNQQVJDX1Y5KTogUmVuYW1lZCBmcm9tIHNwYXJjdjkuCi0JKFNQQVJDX0FSQ0g2NCk6IEFkZC4KLQkqIGNvbmYuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlnL3Ztc2NvbmYuaDogVXBkYXRlLgotCi1Nb24gSmFuIDIyIDE3OjI0OjQ3IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IE9wdGltaXNlICJkbGkiIGxvYWRzLgotCShtZF9zaG93X3VzYWdlKTogYWRkICItbWNwdT12cjQxMDAiIHRvIGhlbHAgdGV4dC4KLQotTW9uIEphbiAyMiAxMTo1MzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJZiBhIHN5bWJvbCBpcyBlcXVhdGVkIHRvIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCwgcHJlc2VydmUgdGhlIFhfb3Agb2YgT19zeW1ib2wuCi0JKFNfR0VUX1ZBTFVFKTogRml4IGNoZWNrIHRvIHBlcm1pdCB0aGlzIGNhc2UuCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJZiBhIHJlbG9jIGlzIGFnYWluc3QgYW4gdW5kZWZpbmVkCi0Jc3ltYm9sIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wsIGNoYW5nZSB0aGUgcmVsb2MgdG8gYmUgYWdhaW5zdAotCXRoZSBsYXR0ZXIgc3ltYm9sLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfY3NlY3QpOiBBbiB1bm5hbWVkIGNzZWN0IGlzIHN0b3JhZ2UgY2xhc3MKLQlYTUNfUFIuCi0KLU1vbiBKYW4gMjIgMTA6NTk6NDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGYvcHBjLmgpOiBJbmNsdWRlIGVsZi9wcGMuaCBpZiB0YXJnZXQKLQljb21wdXRlciBpcyBQb3dlclBDLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgbW9yZSBlbWJlZGRlZCByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL3RjLXBwYy5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IEFkZCBzZWN0aW9ucwotCW1lbnRpb25lZCBpbiB0aGUgZWFiaS4KLQotVGh1IEphbiAxOCAxNzo1ODoxOSAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfcmVsZGF0YSk6IENoYW5nZWQgYWxpZ25lbWVudCBvbiByZWxkYXRhX3NlY3Rpb24KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3BkYXRhKTogQ2hhbmdlZCB0aGUgYWxpZ25tZW50IG9uIHBkYXRhX3NlY3Rpb24KLQotTW9uIEphbiAxNSAxNzo0Mzo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWFwcGluZyk6IEFkZCBtb3JlIHJlbG9jYXRpb24gc3VmZml4ZXMuCi0KLVN1biBKYW4gMTQgMjE6Mjk6MzYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgLmdjY19leGNlcHRfdGFibGUKLQlhcyBhIHNlY3Rpb24gaXQgaXMgb2sgdG8gaGF2ZSB1bmFkb3JuZWQgLW1yZWxvY2F0YWJsZSBwb2ludGVycyBpbi4KLQotU2F0IEphbiAxMyAxMTowOTowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NlY3Rpb24qKTogV3JhcCB0aGVzZSBmdW5jdGlvbnMgaW5zaWRlCi0JI2lmZGVmIE9CSl9FTEYuCi0KLUZyaSBKYW4gMTIgMTU6MzI6MDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBZGQgaG9va3Mgc28gbWFjaGluZQotCWRlcGVuZGVudCBzZWN0aW9uIGF0dHJpYnV0ZXMgY2FuIGJlIGhhbmRsZWQuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaDogKG1kX2VsZl9zZWN0aW9uX3tsZXR0ZXIsdHlwZSx3b3JkLGZsYWdzfSk6IE5ldwotCW1hY3JvcyB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkZSBzZWN0aW9uIGZsYWcgYW5kIG9yZGVyZWQgc2VjdGlvbgotCXR5cGUuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zZWN0aW9uX3tsZXR0ZXIsdHlwZSx3b3JkLGZsYWdzfSk6IE5ldwotCWZ1bmN0aW9ucyB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkZSBzZWN0aW9uIGZsYWcgYW5kIG9yZGVyZWQKLQlzZWN0aW9uIHR5cGUuCi0KLUZyaSBKYW4gMTIgMTI6MDQ6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogRG9uJ3QgdHJ5IHRvIGxvb2sgdXAgdGhlIHNlY3Rpb24KLQlzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaGF2ZSBhIHN5bWJvbAotCXdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIHNlY3Rpb24sIGJ1dCBubyBjb25uZWN0aW9uIHRvIGl0LgotCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogT25seSBjYWxsIG1yaV9jb21tZW50X2VuZCBmcm9tIGZsYWdfbXJpLgotCUZyb20gSmFtZXMgQ2FybHNvbiA8Y2FybHNvbkB4eWxvZ2ljcy5jb20+LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBTa2lwIHdoaXRlc3BhY2UgYWZ0ZXIgYSBjbG9zZSBwYXJlbnRoZXNpcy4KLQlGcm9tIEphbWVzIENhcmxzb24gPGNhcmxzb25AeHlsb2dpY3MuY29tPi4KLQotVHVlIEphbiAgMiAxMjo0MzoyMyAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBDYWxsIGFzX2JhZF93aGVyZSBpbnN0ZWFkIG9mCi0JYXNfd2Fybl93aGVyZSBmb3IgcmVsb2NhdGlvbiBvdmVyZmxvdy4KLQkocGFyc2VfcmVnKTogQWNjZXB0IHJlZ2lzdGVyIG5hbWUgb25seSBpZiBuZXh0IGNoYXJhY3RlciBpcwotCW5vdCBhbHBoYW51bWVyaWMuCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTI5NQpkaWZmIC0tZ2l0IGEvZ2FzL01ha2VmaWxlLmFtIGIvZ2FzL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NjZjIxLi4wMDAwMDAwCi0tLSBhL2dhcy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDE3MzkgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi0jIyBXb3JrIGFyb3VuZCBhcHBhcmVudCBhdXRvbWFrZSBidWcuCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBkb2MgcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi1ZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXSA7IHRoZW4gZWNobyAuLi9iaXNvbi9iaXNvbiAteSAtTC4uL2Jpc29uL2Jpc29uIDsgZWxzZSBlY2hvIGJpc29uIC15IDsgZmlgCi1MRVggPSBgaWYgWyAtZiAuLi9mbGV4L2ZsZXggXSA7IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXggOyAgZWxzZSBlY2hvIGZsZXggOyBmaWAKLQotTUtERVAgPSAkJHtzcmNkaXJ9Ly4uL21rZGVwCi0KLVRBUkdfQ1BVID0gQHRhcmdldF9jcHVfdHlwZUAKLVRBUkdfQ1BVX0MgPSAkKHNyY2RpcikvY29uZmlnL3RjLUB0YXJnZXRfY3B1X3R5cGVALmMKLVRBUkdfQ1BVX08gPSB0Yy1AdGFyZ2V0X2NwdV90eXBlQC5vCi1UQVJHX0NQVV9IID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5oCi1PQkpfRk9STUFUX0MgPSAkKHNyY2RpcikvY29uZmlnL29iai1Ab2JqX2Zvcm1hdEAuYwotT0JKX0ZPUk1BVF9PID0gb2JqLUBvYmpfZm9ybWF0QC5vCi1PQkpfRk9STUFUX0ggPSAkKHNyY2RpcikvY29uZmlnL29iai1Ab2JqX2Zvcm1hdEAuaAotVEFSR19FTlZfSCA9ICQoc3JjZGlyKS9jb25maWcvdGUtQHRlX2ZpbGVALmgKLUFUT0ZfVEFSR19DID0gJChzcmNkaXIpL2NvbmZpZy9hdG9mLUBhdG9mQC5jCi1BVE9GX1RBUkdfTyA9IGF0b2YtQGF0b2ZALm8KLQotIyB1c2UgQHRhcmdldF9jcHVfdHlwZUAgZm9yIHJlZmVyaW5nIHRvIGNvbmZpZ3VyZWQgdGFyZ2V0IG5hbWUKLUlUX0hEUlM9aXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAotSVRfU1JDUz1pdGJsLXBhcnNlLmMgaXRibC1sZXguYyAkKHNyY2RpcikvaXRibC1vcHMuYwotSVRfREVQUz0kKHNyY2RpcikvaXRibC1wYXJzZS55ICQoc3JjZGlyKS9pdGJsLWxleC5sICQoc3JjZGlyKS9jb25maWcvaXRibC1AdGFyZ2V0X2NwdV90eXBlQC5oCi1JVF9PQkpTPWl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KLQotIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQotQ1BVX1RZUEVTID0gXAotCWEyOWsgXAotCWFscGhhIFwKLQlhcmMgXAotCWFybSBcCi0JZDEwdiBcCi0JZDMwdiBcCi0JZnIzMCBcCi0JaDgzMDAgXAotCWg4NTAwIFwKLQlocHBhIFwKLQlpMzcwIFwKLQlpMzg2IFwKLQlpODYwIFwKLQlpOTYwIFwKLQltMzJyIFwKLQltNjhrIFwKLQltODhrIFwKLQltY29yZSBcCi0JbWlwcyBcCi0JbW4xMDIwMCBcCi0JbW4xMDMwMCBcCi0JbnMzMmsgXAotCXBqIFwKLQlwcGMgXAotCXNoIFwKLQlzcGFyYyBcCi0JdGFob2UgXAotCXRpYzMwIFwKLQl0aWM4MCBcCi0JdmF4IFwKLQl3NjUgXAotCXY4NTAgXAotCXo4awotCi0jIE9iamVjdCBmb3JtYXQgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLSMgV2UgZGVsaWJlcmF0ZWx5IG9taXQgc29tLCBzaW5jZSBpdCBkb2VzIG5vdCB3b3JrIGFzIGEgY3Jvc3MgYXNzZW1ibGVyLgotCi1PQkpfRk9STUFUUyA9IFwKLQlhb3V0IFwKLQlib3V0IFwKLQljb2ZmIFwKLQllY29mZiBcCi0JZWxmIFwKLQlldmF4IFwKLQlocDMwMCBcCi0JaWVlZSBcCi0Jdm1zCi0KLSMgVGhpcyBpcyBhbiBzaCBjYXNlIHdoaWNoIHNldHMgdmFsaWQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIENQVQotIyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBjIGFuZCB0aGUgT1MgdHlwZSBpbiB0aGUgc2hlbGwgdmFyaWFibGUgbwotIyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBoZWxwcyBjdXRzIGRvd24gb24gdGhlIGFtb3VudCBvZiBkZXBlbmRlbmN5Ci0jIGluZm9ybWF0aW9uLgotCi1DUFVfT0JKX1ZBTElEID0gXAotCXZhbGlkPSA7IFwKLQljYXNlICQkbyBpbiBcCi0JYW91dCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgYTI5ayB8IGFybSB8IGkzODYgfCBpODYwIHwgbTY4ayB8IG1pcHMgfCBuczMyayB8IHNwYXJjIHwgdGFob2UgfCB0aWMzMCB8IHZheCkgXAotCSAgICB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JYm91dCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgaTk2MCkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWNvZmYpIHZhbGlkPXllcyA7OyBcCi0JZWNvZmYpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIG1pcHMgfCBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWVsZikgdmFsaWQ9eWVzIDs7IFwKLQlldmF4KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWhwMzAwKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBtNjhrKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0Jdm1zKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICB2YXgpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQllc2FjOwotCi0jIFRoaXMgaXMgbGlrZSBDUFVfT0JKX1ZBTElELCBmb3IgdGhlIG9iaj1tdWx0aSBjYXNlLgotCi1DUFVfTVVMVElfVkFMSUQgPSBcCi0JdmFsaWQ9IDsgXAotCWNhc2UgJCRjIGluIFwKLQlpMzg2IHwgbWlwcykgdmFsaWQ9eWVzIDs7IFwKLQllc2FjOwotCi0jIFJlZ3VsYXIgc291cmNlIGZpbGVzLgotCi1HQVNfQ0ZJTEVTID0gXAotCWFwcC5jIFwKLQlhcy5jIFwKLQlhdG9mLWdlbmVyaWMuYyBcCi0JYmlnbnVtLWNvcHkuYyBcCi0JY29uZC5jIFwKLQlkZXBlbmQuYyBcCi0JZHdhcmYyZGJnLmMgXAotCWVjb2ZmLmMgXAotCWVob3B0LmMgXAotCWV4cHIuYyBcCi0JZmxvbnVtLWNvcHkuYyBcCi0JZmxvbnVtLWtvbnN0LmMgXAotCWZsb251bS1tdWx0LmMgXAotCWZyYWdzLmMgXAotCWhhc2guYyBcCi0JaW5wdXQtZmlsZS5jIFwKLQlpbnB1dC1zY3J1Yi5jIFwKLQlsaXN0aW5nLmMgXAotCWxpdGVyYWwuYyBcCi0JbWFjcm8uYyBcCi0JbWVzc2FnZXMuYyBcCi0Jb3V0cHV0LWZpbGUuYyBcCi0JcmVhZC5jIFwKLQlzYi5jIFwKLQlzdGFicy5jIFwKLQlzdWJzZWdzLmMgXAotCXN5bWJvbHMuYyBcCi0Jd3JpdGUuYwotCi1DRklMRVMgPSAkKEdBU19DRklMRVMpIGdhc3AuYyBpdGJsLW9wcy5jCi0KLUhGSUxFUyA9IFwKLQlhcy5oIFwKLQlhc2ludGwuaCBcCi0JYmlnbnVtLmggXAotCWJpdF9maXguaCBcCi0JY2dlbi5oIFwKLQlkd2FyZjJkYmcuaCBcCi0JZWNvZmYuaCBcCi0JZW11bC10YXJnZXQuaCBcCi0JZW11bC5oIFwKLQlleHByLmggXAotCWZsb251bS5oIFwKLQlmcmFncy5oIFwKLQloYXNoLmggXAotCWlucHV0LWZpbGUuaCBcCi0JaXRibC1vcHMuaCBcCi0JbGlzdGluZy5oIFwKLQltYWNyby5oIFwKLQlvYmouaCBcCi0Jb3V0cHV0LWZpbGUuaCBcCi0JcmVhZC5oIFwKLQlzYi5oIFwKLQlzdHJ1Yy1zeW1ib2wuaCBcCi0Jc3Vic2Vncy5oIFwKLQlzeW1ib2xzLmggXAotCXRjLmggXAotCXdyaXRlLmgKLQotIyBDUFUgZmlsZXMgaW4gY29uZmlnLgotCi1UQVJHRVRfQ1BVX0NGSUxFUyA9IFwKLQljb25maWcvdGMtYTI5ay5jIFwKLQljb25maWcvdGMtYWxwaGEuYyBcCi0JY29uZmlnL3RjLWFyYy5jIFwKLQljb25maWcvdGMtYXJtLmMgXAotCWNvbmZpZy90Yy1kMTB2LmMgXAotCWNvbmZpZy90Yy1kMzB2LmMgXAotCWNvbmZpZy90Yy1mcjMwLmMgXAotCWNvbmZpZy90Yy1oODMwMC5jIFwKLQljb25maWcvdGMtaDg1MDAuYyBcCi0JY29uZmlnL3RjLWhwcGEuYyBcCi0JY29uZmlnL3RjLWkzNzAuYyBcCi0JY29uZmlnL3RjLWkzODYuYyBcCi0JY29uZmlnL3RjLWk4NjAuYyBcCi0JY29uZmlnL3RjLWk5NjAuYyBcCi0JY29uZmlnL3RjLW0zMnIuYyBcCi0JY29uZmlnL3RjLW02OGsuYyBcCi0JY29uZmlnL3RjLW04OGsuYyBcCi0JY29uZmlnL3RjLW1jb3JlLmMgXAotCWNvbmZpZy90Yy1taXBzLmMgXAotCWNvbmZpZy90Yy1tbjEwMjAwLmMgXAotCWNvbmZpZy90Yy1tbjEwMzAwLmMgXAotCWNvbmZpZy90Yy1uczMyay5jIFwKLQljb25maWcvdGMtcGouYyBcCi0JY29uZmlnL3RjLXBwYy5jIFwKLQljb25maWcvdGMtc2guYyBcCi0JY29uZmlnL3RjLXNwYXJjLmMgXAotCWNvbmZpZy90Yy10YWhvZS5jIFwKLQljb25maWcvdGMtdGljMzAuYyBcCi0JY29uZmlnL3RjLXRpYzgwLmMgXAotCWNvbmZpZy90Yy12YXguYyBcCi0JY29uZmlnL3RjLXc2NS5jIFwKLQljb25maWcvdGMtdjg1MC5jIFwKLQljb25maWcvdGMtejhrLmMKLQotVEFSR0VUX0NQVV9IRklMRVMgPSBcCi0JY29uZmlnL3RjLWEyOWsuaCBcCi0JY29uZmlnL3RjLWFscGhhLmggXAotCWNvbmZpZy90Yy1hcmMuaCBcCi0JY29uZmlnL3RjLWFybS5oIFwKLQljb25maWcvdGMtZDEwdi5oIFwKLQljb25maWcvdGMtZDMwdi5oIFwKLQljb25maWcvdGMtZnIzMC5oIFwKLQljb25maWcvdGMtaDgzMDAuaCBcCi0JY29uZmlnL3RjLWg4NTAwLmggXAotCWNvbmZpZy90Yy1ocHBhLmggXAotCWNvbmZpZy90Yy1pMzcwLmggXAotCWNvbmZpZy90Yy1pMzg2LmggXAotCWNvbmZpZy90Yy1pODYwLmggXAotCWNvbmZpZy90Yy1pOTYwLmggXAotCWNvbmZpZy90Yy1tMzJyLmggXAotCWNvbmZpZy90Yy1tNjhrLmggXAotCWNvbmZpZy90Yy1tODhrLmggXAotCWNvbmZpZy90Yy1tY29yZS5oIFwKLQljb25maWcvdGMtbWlwcy5oIFwKLQljb25maWcvdGMtbW4xMDIwMC5oIFwKLQljb25maWcvdGMtbW4xMDMwMC5oIFwKLQljb25maWcvdGMtbnMzMmsuaCBcCi0JY29uZmlnL3RjLXBqLmggXAotCWNvbmZpZy90Yy1wcGMuaCBcCi0JY29uZmlnL3RjLXNoLmggXAotCWNvbmZpZy90Yy1zcGFyYy5oIFwKLQljb25maWcvdGMtdGFob2UuaCBcCi0JY29uZmlnL3RjLXRpYzMwLmggXAotCWNvbmZpZy90Yy10aWM4MC5oIFwKLQljb25maWcvdGMtdmF4LmggXAotCWNvbmZpZy90Yy13NjUuaCBcCi0JY29uZmlnL3RjLXY4NTAuaCBcCi0JY29uZmlnL3RjLXo4ay5oCi0KLSMgT0JKIGZpbGVzIGluIGNvbmZpZwotCi1PQkpfRk9STUFUX0NGSUxFUyA9IFwKLQljb25maWcvb2JqLWFvdXQuYyBcCi0JY29uZmlnL29iai1ib3V0LmMgXAotCWNvbmZpZy9vYmotY29mZi5jIFwKLQljb25maWcvb2JqLWVjb2ZmLmMgXAotCWNvbmZpZy9vYmotZWxmLmMgXAotCWNvbmZpZy9vYmotZXZheC5jIFwKLQljb25maWcvb2JqLWhwMzAwLmMgXAotCWNvbmZpZy9vYmotaWVlZS5jIFwKLQljb25maWcvb2JqLXNvbS5jIFwKLQljb25maWcvb2JqLXZtcy5jCi0KLU9CSl9GT1JNQVRfSEZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5oIFwKLQljb25maWcvb2JqLWJvdXQuaCBcCi0JY29uZmlnL29iai1jb2ZmLmggXAotCWNvbmZpZy9vYmotZWNvZmYuaCBcCi0JY29uZmlnL29iai1lbGYuaCBcCi0JY29uZmlnL29iai1ldmF4LmggXAotCWNvbmZpZy9vYmotaHAzMDAuaCBcCi0JY29uZmlnL29iai1pZWVlLmggXAotCWNvbmZpZy9vYmotc29tLmggXAotCWNvbmZpZy9vYmotdm1zLmgKLQotIyBFbXVsYXRpb24gaGVhZGVyIGZpbGVzIGluIGNvbmZpZwotCi1UQVJHX0VOVl9IRklMRVMgPSBcCi0JY29uZmlnL3RlLTM4NmJzZC5oIFwKLQljb25maWcvdGUtYXV4LmggXAotCWNvbmZpZy90ZS1kZWx0YS5oIFwKLQljb25maWcvdGUtZGVsdDg4LmggXAotCWNvbmZpZy90ZS1kcHgyLmggXAotCWNvbmZpZy90ZS1keW5peC5oIFwKLQljb25maWcvdGUtZXBvYy1wZS5oIFwKLQljb25maWcvdGUtZ2VuZXJpYy5oIFwKLQljb25maWcvdGUtZ28zMi5oIFwKLQljb25maWcvdGUtaHAzMDAuaCBcCi0JY29uZmlnL3RlLWhwcGEuaCBcCi0JY29uZmlnL3RlLWkzODZhaXguaCBcCi0JY29uZmlnL3RlLWljOTYwLmggXAotCWNvbmZpZy90ZS1saW51eC5oIFwKLQljb25maWcvdGUtbG5ld3MuaCBcCi0JY29uZmlnL3RlLWx5bnguaCBcCi0JY29uZmlnL3RlLW1hY2guaCBcCi0JY29uZmlnL3RlLW1hY29zLmggXAotCWNvbmZpZy90ZS1tdWx0aS5oIFwKLQljb25maWcvdGUtbmJzZC5oIFwKLQljb25maWcvdGUtbmJzZDUzMi5oIFwKLQljb25maWcvdGUtcGM1MzJtYWNoLmggXAotCWNvbmZpZy90ZS1wZS5oIFwKLQljb25maWcvdGUtcHBjbncuaCBcCi0JY29uZmlnL3RlLXBzb3MuaCBcCi0JY29uZmlnL3RlLXJpc2NpeC5oIFwKLQljb25maWcvdGUtc3BhcmNhb3V0LmggXAotCWNvbmZpZy90ZS1zdW4zLmggXAotCWNvbmZpZy90ZS1zdnI0LmggXAotCWNvbmZpZy90ZS1zeXN2MzIuaAotCi0jIE11bHRpIGZpbGVzIGluIGNvbmZpZwotCi1NVUxUSV9DRklMRVMgPSBcCi0JY29uZmlnL2UtaTM4NmFvdXQuYyBcCi0JY29uZmlnL2UtaTM4NmNvZmYuYyBcCi0JY29uZmlnL2UtaTM4NmVsZi5jIFwKLQljb25maWcvZS1taXBzZWNvZmYuYyBcCi0JY29uZmlnL2UtbWlwc2VsZi5jCi0KLUNPTkZJR19PQkpTID0gXAotCSQoVEFSR19DUFVfTykgXAotCSQoT0JKX0ZPUk1BVF9PKSBcCi0JJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykKLQotR0VORVJJQ19PQkpTID0gXAotCWFwcC5vIFwKLQlhcy5vIFwKLQlhdG9mLWdlbmVyaWMubyBcCi0JYmlnbnVtLWNvcHkubyBcCi0JY29uZC5vIFwKLQlkZXBlbmQubyBcCi0JZHdhcmYyZGJnLm8gXAotCWVob3B0Lm8gXAotCWV4cHIubyBcCi0JZmxvbnVtLWtvbnN0Lm8gXAotCWZsb251bS1jb3B5Lm8gXAotCWZsb251bS1tdWx0Lm8gXAotCWZyYWdzLm8gXAotCWhhc2gubyBcCi0JaW5wdXQtZmlsZS5vIFwKLQlpbnB1dC1zY3J1Yi5vIFwKLQlsaXRlcmFsLm8gXAotCW1lc3NhZ2VzLm8gXAotCW91dHB1dC1maWxlLm8gXAotCXJlYWQubyBcCi0Jc3Vic2Vncy5vIFwKLQlzeW1ib2xzLm8gXAotCXdyaXRlLm8gXAotCWxpc3RpbmcubyBcCi0JZWNvZmYubyBcCi0Jc3RhYnMubyBcCi0Jc2IubyBcCi0JbWFjcm8ubwotCi1PQkpTID0gJChDT05GSUdfT0JKUykgJChHRU5FUklDX09CSlMpCi0KLVBPVEZJTEVTID0gJChNVUxUSV9DRklMRVMpICQoVEFSR0VUX0VOVl9IRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpIFwKLQkkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCi0JJChIRklMRVMpICQoQ0ZJTEVTKSAkKEdBU19DRklMRVMpCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1ub2luc3RfUFJPR1JBTVMgPSBhcy1uZXcgZ2FzcC1uZXcKLW5vaW5zdF9TQ1JJUFRTID0gJChHREJJTklUKQotRVhUUkFfU0NSSVBUUyA9IC5nZGJpbml0Ci0KLSQoc3JjZGlyKS9tYWtlLWdhcy5jb206IHN0YW1wLW1rLmNvbQotc3RhbXAtbWsuY29tOiB2bXNjb25mLnNoIE1ha2VmaWxlCi0Jc2ggJChzcmNkaXIpL3Ztc2NvbmYuc2ggJChHRU5FUklDX09CSlMpID4gbmV3LW1ha2UuY29tCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIG5ldy1tYWtlLmNvbSAkKHNyY2RpcikvbWFrZS1nYXMuY29tCi0JdG91Y2ggc3RhbXAtbWsuY29tCi0KLUVYVFJBX0RJU1QgPSBtYWtlLWdhcy5jb20KLQotRElTVFNUVUZGID0gbWFrZS1nYXMuY29tIG02OGstcGFyc2UuYyBpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oIGl0YmwtbGV4LmMKLWRpc3RzdHVmZjogJChESVNUU1RVRkYpIGluZm8KLQotRElTVENMRUFORklMRVMgPSB0YXJnLWNwdS5oIG9iai1mb3JtYXQuaCB0YXJnLWVudi5oIGl0YmwtY3B1LmggY2dlbi1kZXNjLmgKLQotIyBOb3cgZmlndXJlIG91dCBmcm9tIHRob3NlIHZhcmlhYmxlcyBob3cgdG8gY29tcGlsZSBhbmQgbGluay4KLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUiA9ICQoQkFTRURJUikvaW5jbHVkZQotCi0jIFRoaXMgaXMgdGhlIHZhcmlhYmxlIGFjdHVhbGx5IHVzZWQgd2hlbiB3ZSBjb21waWxlLgotIyBTcGVjaWZ5IHRoZSBkaXJlY3RvcmllcyB0byBiZSBzZWFyY2hlZCBmb3IgaGVhZGVyIGZpbGVzLgotIyBCb3RoIC4gYW5kIHNyY2RpciBhcmUgdXNlZCwgaW4gdGhhdCBvcmRlciwKLSMgc28gdGhhdCB0bS5oIGFuZCBjb25maWcuaCB3aWxsIGJlIGZvdW5kIGluIHRoZSBjb21waWxhdGlvbgotIyBzdWJkaXJlY3RvcnkgcmF0aGVyIHRoYW4gaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChzcmNkaXIpL2NvbmZpZyAtSSQoSU5DRElSKSAtSSQoc3JjZGlyKS8uLiAtSSQoQkZERElSKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLSMgVGhpcyBzaG91bGQgYmUgcGFyYWxsZWwgdG8gSU5DTFVERVMsIGJ1dCBzaG91bGQgcmVwbGFjZSAkKHNyY2RpcikKLSMgd2l0aCAkJHtzcmNkaXJ9LCBhbmQgc2hvdWxkIHdvcmsgaW4gYSBzdWJkaXJlY3RvcnkuICBUaGlzIGlzIHVzZWQKLSMgd2hlbiBidWlsZGluZyBkZXBlbmRlbmNpZXMsIGJlY2F1c2UgdGhlIGRlcGVuZGVuY3kgYnVpbGRpbmcgaXMgZG9uZQotIyBpbiBhIHN1YmRpcmVjdG9yeS4KLURFUF9JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgLUkkJHtzcmNkaXJ9L2NvbmZpZyAtSSQke3NyY2Rpcn0vLi4vaW5jbHVkZSAtSSQke3NyY2Rpcn0vLi4gLUkkJHtzcmNkaXJ9Ly4uL2JmZCAtSSQke3NyY2Rpcn0vLi4vaW50bCAtSS4uLy4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi0jIEhvdyB0byBsaW5rIHdpdGggYm90aCBvdXIgc3BlY2lhbCBsaWJyYXJ5IGZhY2lsaXRpZXMKLSMgYW5kIHRoZSBzeXN0ZW0ncyBpbnN0YWxsZWQgbGlicmFyaWVzLgotCi1HQVNMSUJTID0gQE9QQ09ERVNfTElCQCBAQkZETElCQCAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotIyBGaWxlcyB0byBiZSBjb3BpZWQgYXdheSBhZnRlciBlYWNoIHN0YWdlIGluIGJ1aWxkaW5nLgotU1RBR0VTVFVGRiA9ICoubyAkKG5vaW5zdF9QUk9HUkFNUykKLQotJChPQkpTKTogQEFMTF9PQkpfREVQU0AKLQotYXNfbmV3X1NPVVJDRVMgPSAkKEdBU19DRklMRVMpCi1hc19uZXdfTERBREQgPSAkKFRBUkdfQ1BVX08pICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSBcCi0JJChleHRyYV9vYmplY3RzKSAkKEdBU0xJQlMpICQoSU5UTExJQlMpCi1hc19uZXdfREVQRU5ERU5DSUVTID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExERVBTKQotCi0jIFN0dWZmIHRoYXQgZXZlcnkgb2JqZWN0IGZpbGUgZGVwZW5kcyB1cG9uLiAgSWYgYW55dGhpbmcgaXMgcmVtb3ZlZAotIyBmcm9tIHRoaXMgbGlzdCwgcmVtb3ZlIGl0IGZyb20gZGVwLWluLnNlZCBhcyB3ZWxsLgotJChPQkpTKTogY29uZmlnLmggYXMuaCAkKFRBUkdfRU5WX0gpICQoT0JKX0ZPUk1BVF9IKSAkKFRBUkdfQ1BVX0gpIGZsb251bS5oIFwKLQlleHByLmggd3JpdGUuaCBmcmFncy5oIGhhc2guaCByZWFkLmggc3ltYm9scy5oIHRjLmggXAotCW9iai5oIGxpc3RpbmcuaCBiaWdudW0uaCBiaXRfZml4LmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGFzaW50bC5oCi0KLWdhc3BfbmV3X1NPVVJDRVMgPSBnYXNwLmMgbWFjcm8uYyBzYi5jIGhhc2guYwotZ2FzcF9uZXdfTERBREQgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKLWdhc3BfbmV3X0RFUEVOREVOQ0lFUyA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExERVBTKQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAotICAgICAgICAgIGVjaG8gJCR7cm9vdG1lfS8uLi9leHBlY3QvZXhwZWN0IDsgXAotICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotUlVOVEVTVCA9IGBpZiBbIC1mICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKLQkJZWNobyAkJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IGVsc2UgZWNobyBydW50ZXN0OyBcCi0JICAgZmlgCi1SVU5URVNURkxBR1M9Ci0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0JaWYgWyAtZCB0ZXN0c3VpdGUgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxzZSBcCi0JICBta2RpciB0ZXN0c3VpdGU7IFwKLQlmaQotCXJtIC1mIHRlc3RzdWl0ZS9zaXRlLmV4cAotCWNwIHNpdGUuZXhwIHRlc3RzdWl0ZS9zaXRlLmV4cAotCXJvb3RtZT1gcHdkYDsgZXhwb3J0IHJvb3RtZTsgXAotCXNyY2Rpcj1gY2QgJHtzcmNkaXJ9OyBwd2RgIDsgZXhwb3J0IHNyY2RpciA7IFwKLQlFWFBFQ1Q9JHtFWFBFQ1R9IDsgZXhwb3J0IEVYUEVDVCA7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQljZCB0ZXN0c3VpdGU7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFRoZSBpbXBsaWNpdCAuYy5vIHJ1bGUgZG9lc24ndCB3b3JrIGZvciB0aGVzZSwgcGVyaGFwcyBiZWNhdXNlIG9mCi0jIHRoZSB2YXJpYWJsZXMsIG9yIHBlcmhhcHMgYmVjYXVzZSB0aGUgc291cmNlcyBhcmUgbm90IG9uIHZwYXRoLgotJChUQVJHX0NQVV9PKTogJChUQVJHX0NQVV9DKSAkKFRBUkdfQ1BVX0RFUF9AdGFyZ2V0X2NwdV90eXBlQCkKLQkkKENPTVBJTEUpIC1jICQoVEFSR19DUFVfQykKLSQoQVRPRl9UQVJHX08pOiAkKEFUT0ZfVEFSR19DKQotCSQoQ09NUElMRSkgLWMgJChBVE9GX1RBUkdfQykKLQotIyBlY29mZi5jIG9ubHkgaGFzIGZ1bGwgZGVwZW5kZW5jaWVzIHdoZW4gRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQsCi0jIHNvIHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeSBzdHVmZiBkb2Vzbid0IHdvcmsuCi1lY29mZi5vIDogZWNvZmYuYyBlY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggXAotCSQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0JJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaAotCi0jIFdlIG5lZWQgYWxsIHRoZXNlIGV4cGxpY2l0IHJ1bGVzIGZvciB0aGUgbXVsdGkgc3R1ZmYuICBCZWNhdXNlIG9mCi0jIHRoZXNlIHJ1bGVzLCB3ZSBkb24ndCBuZWVkIG9uZSBmb3IgT0JKX0ZPUk1BVF9PLgotCi1vYmotYW91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMKLW9iai1ib3V0Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuYwotb2JqLWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmMKLW9iai1lY29mZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotb2JqLWVsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCi1vYmotZXZheC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmMKLW9iai1ocDMwMC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotb2JqLWllZWUubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaWVlZS5jCi1vYmotbXVsdGkubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLW9iai1zb20ubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYwotb2JqLXZtcy5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCi0KLWUtbWlwc2VsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotZS1taXBzZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jCi1lLWkzODZhb3V0Lm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2YW91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmFvdXQuYwotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0KLSMgVGhlIG02OGsgb3BlcmFuZCBwYXJzZXIuCi0KLUVYVFJBX2FzX25ld19TT1VSQ0VTID0gY29uZmlnL202OGstcGFyc2UueQotCi0jIElmIG02OGstcGFyc2UueSBpcyBpbiBhIGRpZmZlcmVudCBkaXJlY3RvcnksIHRoZW4geWx3cmFwIHdpbGwgdXNlIGFuCi0jIGFic29sdXRlIHBhdGggd2hlbiBpdCBpbnZva2VzIHlhY2MsIHdoaWNoIHdpbGwgY2F1c2UgeWFjYyB0byBwdXQgdGhlCi0jIGFic29sdXRlIHBhdGggaW50byB0aGUgZ2VuZXJhdGVkIGZpbGUuICBUaGF0J3MgYSBwYWluIHdoZW4gaXQgY29tZXMKLSMgdG8gZ2VuZXJhdGluZyBzbmFwc2hvdHMsIGJlY2F1c2UgaXQgaW50cm9kdWNlcyBzcHVyaW91cyBkaWZmcy4KLSMgU2luY2Ugd2hlbiB3ZSBtYWtlIHRoZSBzbmFwc2hvdHMgJChzcmNkaXIpID0gIi4iLCB3ZSBjaGVjayBmb3IgdGhhdAotIyBjYXNlIGFuZCBoYW5kbGUgaXQgZGlmZmVyZW50bHkuICBUaGlzIG1lYW5zIHRoYXQgYW55Ym9keSB3aG8KLSMgY29uZmlndXJlcyB3aXRoICQoc3JjZGlyKSA9ICIuIiB3aWxsIGhhdmUgdG8gc2V0IHRoZWlyIHBhdGggaW4gdGhlCi0jIGRlYnVnZ2VyIGlmIHRoZXkgd2FudCB0byBkZWJ1ZyBtNjhrLXBhcnNlLnkuICBUaGlzIGlzIGJhZCwgYnV0IG9uCi0jIHRoZSBvdGhlciBoYW5kIGl0J3MgZ29vZCB0aGF0IHBlb3BsZSB3aG8gdXNlIHRoZSBwcmVidWlsdAotIyBtNjhrLXBhcnNlLmMgZG9uJ3QgZ2V0IGEgc3B1cmlvdXMgYWJzb2x1dGUgcGF0aC4KLW02OGstcGFyc2UuYzogJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLnkKLQlmPSQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55OyBcCi0JaWYgWyAkJGYgPSAiLi9jb25maWcvbTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKLQkgIGxuIC1zIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgbG4gY29uZmlnL202OGstcGFyc2UueSAuID4gL2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IFwKLQkgICBjcCBjb25maWcvbTY4ay1wYXJzZS55IC4gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgXAotCSAgZj1tNjhrLXBhcnNlLnk7IFwKLQllbHNlIHRydWU7IGZpOyBcCi0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkJGYgeS50YWIuYyBtNjhrLXBhcnNlLmMgLS07IFwKLQlpZiBbICQkZiA9ICJtNjhrLXBhcnNlLnkiIF07IHRoZW4gXAotCSAgcm0gLWYgbTY4ay1wYXJzZS55OyBcCi0JZWxzZSB0cnVlOyBmaQotbTY4ay1wYXJzZS5vOiBtNjhrLXBhcnNlLmMgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLQotIyBEb24ndCBsZXQgdGhlIC55LmggcnVsZSBjbG9iYmVyIG02OGstcGFyc2UuaC4KLW02OGstcGFyc2UuaDogOyBAdHJ1ZQotJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmg6IDsgQHRydWUKLQotIyBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUgc3BlY2lmaWNhdGlvbiBsZXhpY2FsIGFuYWx5emVyIGFuZCBwYXJzZXIuCi0KLWl0YmwtbGV4LmM6ICQoc3JjZGlyKS9pdGJsLWxleC5sCi1pdGJsLWxleC5vOiBpdGJsLWxleC5jIGl0YmwtcGFyc2UuaAotCi1pdGJsLXBhcnNlLm86IGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmggJChzcmNkaXIpL2l0Ymwtb3BzLmgKLQotaXRibC1vcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0KLWl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmg6ICQoc3JjZGlyKS9pdGJsLXBhcnNlLnkKLQkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQoc3JjZGlyKS9pdGJsLXBhcnNlLnkgeS50YWIuYyBpdGJsLXBhcnNlLmMgeS50YWIuaCBpdGJsLXBhcnNlLmggLS0gLWQKLQotIyBzdGFuZC1hbG9uZSBpdGJsIGFzc2VtYmxlciAmIGRpc2Fzc2VtYmxlcgotCi1FWFRSQV9QUk9HUkFNUyA9IGl0YmwtdGVzdAotaXRibF90ZXN0X1NPVVJDRVMgPSBpdGJsLXBhcnNlLnkgaXRibC1sZXgubAotaXRibF90ZXN0X0xEQUREID0gaXRibC10b3BzLm8gaXRibC10ZXN0Lm8gJChHQVNMSUJTKSBATEVYTElCQAotCi1pdGJsLXRvcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0JJChDT01QSUxFKSAtbyBpdGJsLXRvcHMubyAtRFNUQU5EX0FMT05FIC1jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi0KLWl0YmwtdGVzdC5vOiAkKHNyY2RpcikvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMgJChzcmNkaXIpL2l0Ymwtb3BzLmgKLQkkKENPTVBJTEUpIC1jIC1EU1RBTkRfQUxPTkUgJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCi0KLSMgQ0dFTiBpbnRlcmZhY2UuCi0KLUNHRU5fQ1BVX1BSRUZJWCA9IEBjZ2VuX2NwdV9wcmVmaXhACi0KLWNnZW4ubzogY2dlbi5jIGNnZW4uaCBjZ2VuLWRlc2MuaCBzdWJzZWdzLmggXAotCSQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1kZXNjLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1vcGMuaAotCi0jIFJlbWFrZSB0aGUgaW5mbyBmaWxlcy4KLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgY29yZSBzdGFtcC1tay5jb20gXAotCXRlc3RzdWl0ZS8qLm8gdGVzdHN1aXRlLyoub3V0IHRlc3RzdWl0ZS9nYXMubG9nIHRlc3RzdWl0ZS9nYXMuc3VtIFwKLQl0ZXN0c3VpdGUvc2l0ZS5leHAgc2l0ZS5iYWsgc2l0ZS5leHAgc3RhZ2Ugc3RhZ2UxIHN0YWdlMgotCi1DTEVBTkZJTEVTID0gZGVwLnNlZCBERVBUQyBERVBPQkogREVQMiBERVAxIERFUEEgREVQIERFUERJUgotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKLS5QSE9OWTogaW5zdGFsbC1leGVjLWJpbmRpciBpbnN0YWxsLWV4ZWMtdG9vbGRpcgotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6IGluc3RhbGwtZXhlYy1iaW5kaXIgQGluc3RhbGxfdG9vbGRpckAKLQotaW5zdGFsbC1leGVjLWJpbmRpcjogJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKGJpbmRpcikKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotaW5zdGFsbC1leGVjLXRvb2xkaXI6IGluc3RhbGwtZXhlYy1iaW5kaXIgJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgotCW49YGVjaG8gYXMgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBhcy1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQllbHNlIFwKLQkgIHRydWUgOyBcCi0JZmkKLQotIyBUaGVzZSBleGlzdCBmb3IgbWFpbnRlbmFuY2UgcHVycG9zZXMuCi0KLS5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcDIgYm9vdHN0cmFwMyBzdGFnZTEgc3RhZ2UyIHN0YWdlMyBjb21wYXJpc29uCi0KLWJvb3RzdHJhcDogYXMtbmV3Ci0JJChNQUtFKSBzdGFnZTEKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIHN0YWdlMgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi1ib290c3RyYXAyOgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDM6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLSMgQ29weSB0aGUgb2JqZWN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIHN0YWdlIGludG8gYSBzdWJkaXJlY3RvcnkuCi1zdGFnZTE6Ci0JLW1rZGlyIHN0YWdlMQotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMQotCWlmIFsgLWYgc3RhZ2UxL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMS9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UxIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCi0KLXN0YWdlMjoKLQktbWtkaXIgc3RhZ2UyCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UyCi0JaWYgWyAtZiBzdGFnZTIvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UyL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTIgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UzOgotCS1ta2RpciBzdGFnZTMKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTMKLQlpZiBbIC1mIHN0YWdlMy9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTMvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMyA7IGxuIC1zIGFzLW5ldyBhcyQoRVhFRVhUKSkgOyBmaQotCi1hZ2FpbnN0PXN0YWdlMgotCi0jIFRoaXMgcnVsZSBpcyBkZXJpdmVkIGZyb20gY29ycmVzcG9uZGluZyBjb2RlIGluIHRoZSBNYWtlZmlsZS5pbiBmb3IgZ2NjLgotIyBUaGUgInRhaWwgKzE2YyIgaXMgdG8gYnlwYXNzIGhlYWRlcnMgd2hpY2ggbWF5IGluY2x1ZGUgdGltZXN0YW1wcyBvcgotIyB0ZW1wb3JhcnkgYXNzZW1ibHkgZmlsZSBuYW1lcy4KLWNvbXBhcmlzb246Ci0JeD0wIDsgXAotCWZvciBmaWxlIGluICoubyA7IGRvIFwKLQkgIHRhaWwgKzE2YyAuLyQkZmlsZSA+IHRtcC1mb28xOyBcCi0JICBpZiB0YWlsICsxNmMgJHthZ2FpbnN0fS8kJGZpbGUgPiB0bXAtZm9vMiAyPi9kZXYvbnVsbCA7IHRoZW4gXAotCSAgICBpZiBjbXAgdG1wLWZvbzEgdG1wLWZvbzIgOyB0aGVuIFwKLQkgICAgICB0cnVlIDsgXAotCSAgICBlbHNlIFwKLQkgICAgICBlY2hvICQkZmlsZSBkaWZmZXJzIDsgXAotCSAgICAgIHg9MSA7IFwKLQkgICAgZmkgOyBcCi0JICBlbHNlIHRydWU7IGZpIDsgXAotCWRvbmUgOyBcCi0JZXhpdCAkJHgKLQktcm0gLWYgdG1wLWZvbyoKLQotLlBIT05ZOiBkZS1zdGFnZTEgZGUtc3RhZ2UyIGRlLXN0YWdlMwotCi1kZS1zdGFnZTE6Ci0JLSAoY2Qgc3RhZ2UxIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UxCi0KLWRlLXN0YWdlMjoKLQktIChjZCBzdGFnZTIgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTIKLQotZGUtc3RhZ2UzOgotCS0gKGNkIHN0YWdlMyA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMwotCi0jIEF1dG9tYXRpYyBkZXBlbmRlbmN5IGNvbXB1dGF0aW9uLiAgVGhpcyBpcyBhIHJlYWwgcGFpbiwgYmVjYXVzZSB0aGUKLSMgZGVwZW5kZW5jaWVzIGNoYW5nZSBiYXNlZCBvbiB0YXJnZXRfY3B1X3R5cGUgYW5kIG9ial9mb3JtYXQuICBXZQotIyBjdXJyZW50bHkgaWdub3JlIGFueSBkZXBlbmRlbmNpZXMgY2F1c2VkIGJ5IGVtdWxhdGlvbiBmaWxlcy4KLQotREVQX0ZJTEVfREVQUyA9ICAkKENGSUxFUykgJChIRklMRVMpICQoVEFSR0VUX0NQVV9DRklMRVMpIFwKLQkkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQotCi1ERVA6IGRlcC5zZWQgJChERVBfRklMRV9ERVBTKSBERVBUQyBERVBPQkogREVQMgotCXJtIC1mIERFUDEKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgc3JjZGlyPSQke3NyY2Rpcn0gVlBBVEg9JCR7c3JjZGlyfSBERVAxCi0Jcm0gLXJmIERFUERJUgotCXNlZCAtZiBkZXAuc2VkIDwgREVQMSA+IERFUEEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUFRDID4+IERFUEEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUE9CSiA+PiBERVBBCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVAyID4+IERFUEEKLQllY2hvICckJChPQkpTKTogJCQoREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiBERVBBCi0JZWNobyAnJCQoVEFSR19DUFVfTyk6ICQkKERFUFRDX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiBERVBBCi0JZWNobyAnJCQoT0JKX0ZPUk1BVF9PKTogJCQoREVQT0JKX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiBERVBBCi0JZWNobyAnIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZJyA+PiBERVBBCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIERFUEEgREVQCi0KLSMgVGhpcyBydWxlIG5lZWRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLURFUDE6ICQoQ0ZJTEVTKSAkKE1VTFRJX0NGSUxFUykKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZWNobyAnJyA+IHRhcmctY3B1Lmg7IFwKLQllY2hvICcnID4gb2JqLWZvcm1hdC5oOyBcCi0JZWNobyAnJyA+IHRhcmctZW52Lmg7IFwKLQllY2hvICcnID4gaXRibC1jcHUuaDsgXAotCWVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSAkPwotCXNlZCAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgPCBERVBESVIvREVQID4gREVQMQotCXJtIC1mIERFUERJUi9ERVAKLQotIyBXb3JrIG91dCB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMgZm9yIHRoZSB0Yy0qLmMgZmlsZXMuCi1ERVBUQzogJChUQVJHRVRfQ1BVX0NGSUxFUykKLQlybSAtZiBERVBUQ0EKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIkJHtjfSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvdGMtJCR7Y30uYyBkdW1teS5jOyBcCi0JICAgICAgZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVA7IFwKLQkgICAgICAkKE1LREVQKSAtZiBERVAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgZHVtbXkuYzsgXAotCSAgICAgIHNlZCAtZSAicy9kdW1teS5vOiBkdW1teS5jL0RFUFRDXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQVENBOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ0RFUFRDX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcJyA+PiBERVBUQ0EKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IERFUFRDQQotCWVjaG8gJyAgJCQoSU5DRElSKS9vcGNvZGUvaHBwYS5oICQkKEJGRERJUikvc29tLmgnID4+IERFUFRDQQotIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBUQ18nIiQke2N9IidfbXVsdGkgPSBcJyA+PiBERVBUQ0E7IFwKLQkgICAgZWNobyAnJCQoREVQVENfJyIkJHtjfSInX2NvZmYpIFwnID4+IERFUFRDQTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKERFUFRDXyciJCR7Y30iJ19lY29mZikgXCcgPj4gREVQVENBOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQVENfJyIkJHtjfSInX2VsZiknID4+IERFUFRDQTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQltdiAtZiBERVBUQ0EgREVQVEMKLQotIyBXb3JrIG91dCB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBvYmotKi5jIGZpbGVzLgotREVQT0JKOiAkKE9CSl9GT1JNQVRfQ0ZJTEVTKQotCXJtIC1mIERFUE9CSkEKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL29iai0kJHtvfS5jIGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSAgICAgICQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQT0JKXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQT0JKQTsgXAotCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdERVBPQkpfaHBwYV9zb20gPSAkJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmggc3Vic2Vncy5oIFwnID4+IERFUE9CSkEKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IERFUE9CSkEKLQllY2hvICcgICQkKEJGRERJUikvc29tLmggICQkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwnID4+IERFUE9CSkEKLQllY2hvICcgICQkKElOQ0RJUikvYW91dC9zdGFiLmRlZicgPj4gREVQT0JKQQotIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBPQkpfJyIkJHtjfSInX211bHRpID0gXCcgPj4gREVQT0JKQTsgXAotCSAgICBlY2hvICckJChERVBPQkpfJyIkJHtjfSInX2NvZmYpIFwnID4+IERFUE9CSkE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChERVBPQkpfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVBPQkpBOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQT0JKXyciJCR7Y30iJ19lbGYpJyA+PiBERVBPQkpBOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIERFUE9CSkEgREVQT0JKCi0KLSMgV29yayBvdXQgdGhlIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBDUFUvT0JKIGNvbWJpbmF0aW9uLgotIyBOb3RlIHRoYXQgU09NIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlIGl0IG9ubHkgd29ya3MgbmF0aXZlLgotREVQMjogJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKLQlybSAtZiBERVAyYQotCWlmIFsgLWQgREVQRElSIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciBERVBESVI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCBERVBESVI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSAgICAgICQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQMmE7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdERVBfaHBwYV9zb20gPSAkJChCRkRESVIpL3NvbS5oJyA+PiBERVAyYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IERFUDJhOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfY29mZikgXCcgPj4gREVQMmE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWxmKScgPj4gREVQMmE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgREVQMmEgREVQMgotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQgXAotCQktZSAicyFASU5DRElSQCEkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUhIiBcCi0JCS1lICJzIUBCRkRESVJAISQke3NyY2Rpcn0vLi4vYmZkISIgXAotCQktZSAicyFAU1JDRElSQCEkJHtzcmNkaXJ9ISIKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hcHAubzogYXBwLmMKLWFzLm86IGFzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaCBcCi0gIHNiLmggbWFjcm8uaAotYXRvZi1nZW5lcmljLm86IGF0b2YtZ2VuZXJpYy5jCi1iaWdudW0tY29weS5vOiBiaWdudW0tY29weS5jCi1jb25kLm86IGNvbmQuYyBtYWNyby5oIHNiLmggJChJTkNESVIpL29ic3RhY2suaAotZGVwZW5kLm86IGRlcGVuZC5jCi1kd2FyZjJkYmcubzogZHdhcmYyZGJnLmMgZHdhcmYyZGJnLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5vOiBlY29mZi5jIGVjb2ZmLmgKLWVob3B0Lm86IGVob3B0LmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZXhwci5vOiBleHByLmMgJChJTkNESVIpL29ic3RhY2suaAotZmxvbnVtLWNvcHkubzogZmxvbnVtLWNvcHkuYwotZmxvbnVtLWtvbnN0Lm86IGZsb251bS1rb25zdC5jCi1mbG9udW0tbXVsdC5vOiBmbG9udW0tbXVsdC5jCi1mcmFncy5vOiBmcmFncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1oYXNoLm86IGhhc2guYyAkKElOQ0RJUikvb2JzdGFjay5oCi1pbnB1dC1maWxlLm86IGlucHV0LWZpbGUuYyBpbnB1dC1maWxlLmgKLWlucHV0LXNjcnViLm86IGlucHV0LXNjcnViLmMgaW5wdXQtZmlsZS5oIHNiLmgKLWxpc3RpbmcubzogbGlzdGluZy5jIGlucHV0LWZpbGUuaCBzdWJzZWdzLmgKLWxpdGVyYWwubzogbGl0ZXJhbC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1tYWNyby5vOiBtYWNyby5jIHNiLmggbWFjcm8uaAotbWVzc2FnZXMubzogbWVzc2FnZXMuYwotb3V0cHV0LWZpbGUubzogb3V0cHV0LWZpbGUuYyBvdXRwdXQtZmlsZS5oCi1yZWFkLm86IHJlYWQuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBzYi5oIG1hY3JvLmggXAotICBlY29mZi5oCi1zYi5vOiBzYi5jIHNiLmgKLXN0YWJzLm86IHN0YWJzLmMgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggZWNvZmYuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN1YnNlZ3Mubzogc3Vic2Vncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1zeW1ib2xzLm86IHN5bWJvbHMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBcCi0gIHN0cnVjLXN5bWJvbC5oCi13cml0ZS5vOiB3cml0ZS5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmgKLWdhc3AubzogZ2FzcC5jIHNiLmggbWFjcm8uaAotaXRibC1vcHMubzogaXRibC1vcHMuYyBpdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotZS1pMzg2YW91dC5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmFvdXQuYyBlbXVsLmggXAotICBlbXVsLXRhcmdldC5oCi1lLWkzODZjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi1lLW1pcHNlY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMgZW11bC5oIFwKLSAgZW11bC10YXJnZXQuaAotZS1taXBzZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMgZW11bC5oIGVtdWwtdGFyZ2V0LmgKLQotREVQVENfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi1ERVBUQ19hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotREVQVENfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotREVQVENfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1ERVBUQ19hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1ERVBUQ19hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLURFUFRDX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLURFUFRDX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggXAotICAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUFRDX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQVENfYXJtX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAotREVQVENfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUFRDX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBUQ19kMTB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oIFwKLSAgJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBUQ19kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggJChJTkNESVIpL2VsZi9wcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUFRDX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLURFUFRDX2QzMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaAotREVQVENfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLW9wYy5oIFwKLSAgY2dlbi5oCi1ERVBUQ19mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotREVQVENfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCi1ERVBUQ19oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKLURFUFRDX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi1ERVBUQ19oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9oODUwMC1vcGMuaAotREVQVENfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoQkZERElSKS9saWJiZmQuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1ERVBUQ19ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliYmZkLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLURFUFRDX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCi1ERVBUQ19pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotREVQVENfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCi1ERVBUQ19pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9pODYwLmgKLURFUFRDX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pODYwLmgKLURFUFRDX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggJChJTkNESVIpL29wY29kZS9pODYwLmgKLURFUFRDX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pOTYwLmgKLURFUFRDX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pOTYwLmgKLURFUFRDX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi1ERVBUQ19tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9zeW1jYXQuaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLWRlc2MuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItb3BjLmggXAotICBjZ2VuLmgKLURFUFRDX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKLSAgY2dlbi5oCi1ERVBUQ19tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotREVQVENfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggXAotICAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotREVQVENfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oIFwKLSAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQVENfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggXAotICAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotREVQVENfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpL2NvbmZpZy9tODhrLW9wY29kZS5oCi1ERVBUQ19tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpL2NvbmZpZy9tODhrLW9wY29kZS5oCi1ERVBUQ19tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaAotREVQVENfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvbWNvcmUtb3BjLmggXAotICAkKElOQ0RJUikvZWxmL21jb3JlLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQVENfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9taXBzLmggaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaAotREVQVENfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi1ERVBUQ19taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIFwKLSAgaXRibC1vcHMuaAotREVQVENfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi1ERVBUQ19tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1ERVBUQ19tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLURFUFRDX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLURFUFRDX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotREVQVENfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQVENfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBUQ19uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQVENfcGpfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvcGouaAotREVQVENfcGpfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oICQoSU5DRElSKS9vcGNvZGUvcGouaAotREVQVENfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaAotREVQVENfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oICQoSU5DRElSKS9lbGYvcHBjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBUQ19zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotREVQVENfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvc2gtb3BjLmgKLURFUFRDX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi1ERVBUQ19zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLURFUFRDX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3NwYXJjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBUQ190YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS90YWhvZS5oCi1ERVBUQ190YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLURFUFRDX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS90YWhvZS5oCi1ERVBUQ190aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLURFUFRDX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotREVQVENfdGljMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotREVQVENfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi1ERVBUQ190aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi1ERVBUQ192YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotREVQVENfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotREVQVENfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi1ERVBUQ192YXhfdm1zID0gJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi1ERVBUQ193NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy93NjUtb3BjLmgKLURFUFRDX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi1ERVBUQ192ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCi1ERVBUQ192ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKLURFUFRDX3o4a19jb2ZmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQVENfejhrX2VsZiA9ICQoc3JjZGlyKS8uLi9vcGNvZGVzL3o4ay1vcGMuaCAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCBcCi0gICQoQkZERElSKS9lbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oCi1ERVBUQ19ocHBhX3NvbSA9ICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaCBcCi0gICQoQkZERElSKS9zb20uaAotREVQVENfaTM4Nl9tdWx0aSA9ICQoREVQVENfaTM4Nl9jb2ZmKSAkKERFUFRDX2kzODZfZWxmKQotREVQVENfbWlwc19tdWx0aSA9ICQoREVQVENfbWlwc19jb2ZmKSAkKERFUFRDX21pcHNfZWNvZmYpIFwKLSAgJChERVBUQ19taXBzX2VsZikKLURFUE9CSl9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKEJGRERJUikvbGliZWNvZmYuaAotREVQT0JKX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotREVQT0JKX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2QxMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9mcjMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9ocHBhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKLSAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9tNjhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggXAotICAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLURFUE9CSl9taXBzX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9wal9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9wal9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl90aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfejhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl96OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChCRkRESVIpL3NvbS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotREVQT0JKX2kzODZfbXVsdGkgPSAkKERFUE9CSl9pMzg2X2NvZmYpICQoREVQT0JKX2kzODZfZWxmKQotREVQT0JKX21pcHNfbXVsdGkgPSAkKERFUE9CSl9taXBzX2NvZmYpICQoREVQT0JKX21pcHNfZWNvZmYpIFwKLSAgJChERVBPQkpfbWlwc19lbGYpCi1ERVBfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oCi1ERVBfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLURFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLURFUF9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotREVQX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oCi1ERVBfYXJtX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmgKLURFUF9kMTB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2QxMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmgKLURFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2QzMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmgKLURFUF9mcjMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmgKLURFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaAotREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oCi1ERVBfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUF9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmgKLURFUF9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmgKLURFUF9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmgKLURFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmgKLURFUF9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmgKLURFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmgKLURFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmgKLURFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaAotREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLURFUF9taXBzX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oCi1ERVBfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oCi1ERVBfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oCi1ERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oCi1ERVBfcGpfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3BqX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaAotREVQX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmgKLURFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaAotREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmgKLURFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmgKLURFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGljMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oCi1ERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmgKLURFUF92YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmgKLURFUF92YXhfdm1zID0gJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLURFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oCi1ERVBfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oCi1ERVBfejhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF96OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaAotREVQX2hwcGFfc29tID0gJChCRkRESVIpL3NvbS5oCi1ERVBfaTM4Nl9tdWx0aSA9ICQoREVQX2kzODZfY29mZikgJChERVBfaTM4Nl9lbGYpCi1ERVBfbWlwc19tdWx0aSA9ICQoREVQX21pcHNfY29mZikgJChERVBfbWlwc19lY29mZikgXAotICAkKERFUF9taXBzX2VsZikKLSQoT0JKUyk6ICQoREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoVEFSR19DUFVfTyk6ICQoREVQVENfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotJChPQkpfRk9STUFUX08pOiAkKERFUE9CSl9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL2dhcy9NYWtlZmlsZS5pbiBiL2dhcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYjU1MS4uMDAwMDAwMAotLS0gYS9nYXMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTM4ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFMTF9PQkpfREVQUyA9IEBBTExfT0JKX0RFUFNACi1BUyA9IEBBU0AKLUJGRExJQiA9IEBCRkRMSUJACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUdEQklOSVQgPSBAR0RCSU5JVEAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotT1BDT0RFU19MSUIgPSBAT1BDT0RFU19MSUJACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWF0b2YgPSBAYXRvZkAKLWNnZW5fY3B1X3ByZWZpeCA9IEBjZ2VuX2NwdV9wcmVmaXhACi1leHRyYV9vYmplY3RzID0gQGV4dHJhX29iamVjdHNACi1pbnN0YWxsX3Rvb2xkaXIgPSBAaW5zdGFsbF90b29sZGlyQAotbCA9IEBsQAotb2JqX2Zvcm1hdCA9IEBvYmpfZm9ybWF0QAotdGFyZ2V0X2NwdV90eXBlID0gQHRhcmdldF9jcHVfdHlwZUAKLXRlX2ZpbGUgPSBAdGVfZmlsZUAKLQotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gZG9jIHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwuLi9iaXNvbi9iaXNvbiA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgIGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLU1LREVQID0gJCR7c3JjZGlyfS8uLi9ta2RlcAotCi1UQVJHX0NQVSA9IEB0YXJnZXRfY3B1X3R5cGVACi1UQVJHX0NQVV9DID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5jCi1UQVJHX0NQVV9PID0gdGMtQHRhcmdldF9jcHVfdHlwZUAubwotVEFSR19DUFVfSCA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuaAotT0JKX0ZPUk1BVF9DID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmMKLU9CSl9GT1JNQVRfTyA9IG9iai1Ab2JqX2Zvcm1hdEAubwotT0JKX0ZPUk1BVF9IID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmgKLVRBUkdfRU5WX0ggPSAkKHNyY2RpcikvY29uZmlnL3RlLUB0ZV9maWxlQC5oCi1BVE9GX1RBUkdfQyA9ICQoc3JjZGlyKS9jb25maWcvYXRvZi1AYXRvZkAuYwotQVRPRl9UQVJHX08gPSBhdG9mLUBhdG9mQC5vCi0KLSMgdXNlIEB0YXJnZXRfY3B1X3R5cGVAIGZvciByZWZlcmluZyB0byBjb25maWd1cmVkIHRhcmdldCBuYW1lCi1JVF9IRFJTID0gaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAotSVRfU1JDUyA9IGl0YmwtcGFyc2UuYyBpdGJsLWxleC5jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi1JVF9ERVBTID0gJChzcmNkaXIpL2l0YmwtcGFyc2UueSAkKHNyY2RpcikvaXRibC1sZXgubCAkKHNyY2RpcikvY29uZmlnL2l0YmwtQHRhcmdldF9jcHVfdHlwZUAuaAotSVRfT0JKUyA9IGl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KLQotIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQotQ1BVX1RZUEVTID0gXAotCWEyOWsgXAotCWFscGhhIFwKLQlhcmMgXAotCWFybSBcCi0JZDEwdiBcCi0JZDMwdiBcCi0JZnIzMCBcCi0JaDgzMDAgXAotCWg4NTAwIFwKLQlocHBhIFwKLQlpMzcwIFwKLQlpMzg2IFwKLQlpODYwIFwKLQlpOTYwIFwKLQltMzJyIFwKLQltNjhrIFwKLQltODhrIFwKLQltY29yZSBcCi0JbWlwcyBcCi0JbW4xMDIwMCBcCi0JbW4xMDMwMCBcCi0JbnMzMmsgXAotCXBqIFwKLQlwcGMgXAotCXNoIFwKLQlzcGFyYyBcCi0JdGFob2UgXAotCXRpYzMwIFwKLQl0aWM4MCBcCi0JdmF4IFwKLQl3NjUgXAotCXY4NTAgXAotCXo4awotCi0KLSMgT2JqZWN0IGZvcm1hdCB0eXBlcy4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLgotIyBXZSBkZWxpYmVyYXRlbHkgb21pdCBzb20sIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgYXMgYSBjcm9zcyBhc3NlbWJsZXIuCi0KLU9CSl9GT1JNQVRTID0gXAotCWFvdXQgXAotCWJvdXQgXAotCWNvZmYgXAotCWVjb2ZmIFwKLQllbGYgXAotCWV2YXggXAotCWhwMzAwIFwKLQlpZWVlIFwKLQl2bXMKLQotCi0jIFRoaXMgaXMgYW4gc2ggY2FzZSB3aGljaCBzZXRzIHZhbGlkIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBDUFUKLSMgdHlwZSBpbiB0aGUgc2hlbGwgdmFyaWFibGUgYyBhbmQgdGhlIE9TIHR5cGUgaW4gdGhlIHNoZWxsIHZhcmlhYmxlIG8KLSMgYXJlIHN1cHBvcnRlZC4gIFRoaXMgaGVscHMgY3V0cyBkb3duIG9uIHRoZSBhbW91bnQgb2YgZGVwZW5kZW5jeQotIyBpbmZvcm1hdGlvbi4KLQotQ1BVX09CSl9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJG8gaW4gXAotCWFvdXQpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGEyOWsgfCBhcm0gfCBpMzg2IHwgaTg2MCB8IG02OGsgfCBtaXBzIHwgbnMzMmsgfCBzcGFyYyB8IHRhaG9lIHwgdGljMzAgfCB2YXgpIFwKLQkgICAgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWJvdXQpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGk5NjApIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQljb2ZmKSB2YWxpZD15ZXMgOzsgXAotCWVjb2ZmKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBtaXBzIHwgYWxwaGEpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQllbGYpIHZhbGlkPXllcyA7OyBcCi0JZXZheCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgYWxwaGEpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQlocDMwMCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgbTY4aykgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCXZtcykgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgdmF4KSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JZXNhYzsKLQotCi0jIFRoaXMgaXMgbGlrZSBDUFVfT0JKX1ZBTElELCBmb3IgdGhlIG9iaj1tdWx0aSBjYXNlLgotCi1DUFVfTVVMVElfVkFMSUQgPSBcCi0JdmFsaWQ9IDsgXAotCWNhc2UgJCRjIGluIFwKLQlpMzg2IHwgbWlwcykgdmFsaWQ9eWVzIDs7IFwKLQllc2FjOwotCi0KLSMgUmVndWxhciBzb3VyY2UgZmlsZXMuCi0KLUdBU19DRklMRVMgPSBcCi0JYXBwLmMgXAotCWFzLmMgXAotCWF0b2YtZ2VuZXJpYy5jIFwKLQliaWdudW0tY29weS5jIFwKLQljb25kLmMgXAotCWRlcGVuZC5jIFwKLQlkd2FyZjJkYmcuYyBcCi0JZWNvZmYuYyBcCi0JZWhvcHQuYyBcCi0JZXhwci5jIFwKLQlmbG9udW0tY29weS5jIFwKLQlmbG9udW0ta29uc3QuYyBcCi0JZmxvbnVtLW11bHQuYyBcCi0JZnJhZ3MuYyBcCi0JaGFzaC5jIFwKLQlpbnB1dC1maWxlLmMgXAotCWlucHV0LXNjcnViLmMgXAotCWxpc3RpbmcuYyBcCi0JbGl0ZXJhbC5jIFwKLQltYWNyby5jIFwKLQltZXNzYWdlcy5jIFwKLQlvdXRwdXQtZmlsZS5jIFwKLQlyZWFkLmMgXAotCXNiLmMgXAotCXN0YWJzLmMgXAotCXN1YnNlZ3MuYyBcCi0Jc3ltYm9scy5jIFwKLQl3cml0ZS5jCi0KLQotQ0ZJTEVTID0gJChHQVNfQ0ZJTEVTKSBnYXNwLmMgaXRibC1vcHMuYwotCi1IRklMRVMgPSBcCi0JYXMuaCBcCi0JYXNpbnRsLmggXAotCWJpZ251bS5oIFwKLQliaXRfZml4LmggXAotCWNnZW4uaCBcCi0JZHdhcmYyZGJnLmggXAotCWVjb2ZmLmggXAotCWVtdWwtdGFyZ2V0LmggXAotCWVtdWwuaCBcCi0JZXhwci5oIFwKLQlmbG9udW0uaCBcCi0JZnJhZ3MuaCBcCi0JaGFzaC5oIFwKLQlpbnB1dC1maWxlLmggXAotCWl0Ymwtb3BzLmggXAotCWxpc3RpbmcuaCBcCi0JbWFjcm8uaCBcCi0Jb2JqLmggXAotCW91dHB1dC1maWxlLmggXAotCXJlYWQuaCBcCi0Jc2IuaCBcCi0Jc3RydWMtc3ltYm9sLmggXAotCXN1YnNlZ3MuaCBcCi0Jc3ltYm9scy5oIFwKLQl0Yy5oIFwKLQl3cml0ZS5oCi0KLQotIyBDUFUgZmlsZXMgaW4gY29uZmlnLgotCi1UQVJHRVRfQ1BVX0NGSUxFUyA9IFwKLQljb25maWcvdGMtYTI5ay5jIFwKLQljb25maWcvdGMtYWxwaGEuYyBcCi0JY29uZmlnL3RjLWFyYy5jIFwKLQljb25maWcvdGMtYXJtLmMgXAotCWNvbmZpZy90Yy1kMTB2LmMgXAotCWNvbmZpZy90Yy1kMzB2LmMgXAotCWNvbmZpZy90Yy1mcjMwLmMgXAotCWNvbmZpZy90Yy1oODMwMC5jIFwKLQljb25maWcvdGMtaDg1MDAuYyBcCi0JY29uZmlnL3RjLWhwcGEuYyBcCi0JY29uZmlnL3RjLWkzNzAuYyBcCi0JY29uZmlnL3RjLWkzODYuYyBcCi0JY29uZmlnL3RjLWk4NjAuYyBcCi0JY29uZmlnL3RjLWk5NjAuYyBcCi0JY29uZmlnL3RjLW0zMnIuYyBcCi0JY29uZmlnL3RjLW02OGsuYyBcCi0JY29uZmlnL3RjLW04OGsuYyBcCi0JY29uZmlnL3RjLW1jb3JlLmMgXAotCWNvbmZpZy90Yy1taXBzLmMgXAotCWNvbmZpZy90Yy1tbjEwMjAwLmMgXAotCWNvbmZpZy90Yy1tbjEwMzAwLmMgXAotCWNvbmZpZy90Yy1uczMyay5jIFwKLQljb25maWcvdGMtcGouYyBcCi0JY29uZmlnL3RjLXBwYy5jIFwKLQljb25maWcvdGMtc2guYyBcCi0JY29uZmlnL3RjLXNwYXJjLmMgXAotCWNvbmZpZy90Yy10YWhvZS5jIFwKLQljb25maWcvdGMtdGljMzAuYyBcCi0JY29uZmlnL3RjLXRpYzgwLmMgXAotCWNvbmZpZy90Yy12YXguYyBcCi0JY29uZmlnL3RjLXc2NS5jIFwKLQljb25maWcvdGMtdjg1MC5jIFwKLQljb25maWcvdGMtejhrLmMKLQotCi1UQVJHRVRfQ1BVX0hGSUxFUyA9IFwKLQljb25maWcvdGMtYTI5ay5oIFwKLQljb25maWcvdGMtYWxwaGEuaCBcCi0JY29uZmlnL3RjLWFyYy5oIFwKLQljb25maWcvdGMtYXJtLmggXAotCWNvbmZpZy90Yy1kMTB2LmggXAotCWNvbmZpZy90Yy1kMzB2LmggXAotCWNvbmZpZy90Yy1mcjMwLmggXAotCWNvbmZpZy90Yy1oODMwMC5oIFwKLQljb25maWcvdGMtaDg1MDAuaCBcCi0JY29uZmlnL3RjLWhwcGEuaCBcCi0JY29uZmlnL3RjLWkzNzAuaCBcCi0JY29uZmlnL3RjLWkzODYuaCBcCi0JY29uZmlnL3RjLWk4NjAuaCBcCi0JY29uZmlnL3RjLWk5NjAuaCBcCi0JY29uZmlnL3RjLW0zMnIuaCBcCi0JY29uZmlnL3RjLW02OGsuaCBcCi0JY29uZmlnL3RjLW04OGsuaCBcCi0JY29uZmlnL3RjLW1jb3JlLmggXAotCWNvbmZpZy90Yy1taXBzLmggXAotCWNvbmZpZy90Yy1tbjEwMjAwLmggXAotCWNvbmZpZy90Yy1tbjEwMzAwLmggXAotCWNvbmZpZy90Yy1uczMyay5oIFwKLQljb25maWcvdGMtcGouaCBcCi0JY29uZmlnL3RjLXBwYy5oIFwKLQljb25maWcvdGMtc2guaCBcCi0JY29uZmlnL3RjLXNwYXJjLmggXAotCWNvbmZpZy90Yy10YWhvZS5oIFwKLQljb25maWcvdGMtdGljMzAuaCBcCi0JY29uZmlnL3RjLXRpYzgwLmggXAotCWNvbmZpZy90Yy12YXguaCBcCi0JY29uZmlnL3RjLXc2NS5oIFwKLQljb25maWcvdGMtdjg1MC5oIFwKLQljb25maWcvdGMtejhrLmgKLQotCi0jIE9CSiBmaWxlcyBpbiBjb25maWcKLQotT0JKX0ZPUk1BVF9DRklMRVMgPSBcCi0JY29uZmlnL29iai1hb3V0LmMgXAotCWNvbmZpZy9vYmotYm91dC5jIFwKLQljb25maWcvb2JqLWNvZmYuYyBcCi0JY29uZmlnL29iai1lY29mZi5jIFwKLQljb25maWcvb2JqLWVsZi5jIFwKLQljb25maWcvb2JqLWV2YXguYyBcCi0JY29uZmlnL29iai1ocDMwMC5jIFwKLQljb25maWcvb2JqLWllZWUuYyBcCi0JY29uZmlnL29iai1zb20uYyBcCi0JY29uZmlnL29iai12bXMuYwotCi0KLU9CSl9GT1JNQVRfSEZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5oIFwKLQljb25maWcvb2JqLWJvdXQuaCBcCi0JY29uZmlnL29iai1jb2ZmLmggXAotCWNvbmZpZy9vYmotZWNvZmYuaCBcCi0JY29uZmlnL29iai1lbGYuaCBcCi0JY29uZmlnL29iai1ldmF4LmggXAotCWNvbmZpZy9vYmotaHAzMDAuaCBcCi0JY29uZmlnL29iai1pZWVlLmggXAotCWNvbmZpZy9vYmotc29tLmggXAotCWNvbmZpZy9vYmotdm1zLmgKLQotCi0jIEVtdWxhdGlvbiBoZWFkZXIgZmlsZXMgaW4gY29uZmlnCi0KLVRBUkdfRU5WX0hGSUxFUyA9IFwKLQljb25maWcvdGUtMzg2YnNkLmggXAotCWNvbmZpZy90ZS1hdXguaCBcCi0JY29uZmlnL3RlLWRlbHRhLmggXAotCWNvbmZpZy90ZS1kZWx0ODguaCBcCi0JY29uZmlnL3RlLWRweDIuaCBcCi0JY29uZmlnL3RlLWR5bml4LmggXAotCWNvbmZpZy90ZS1lcG9jLXBlLmggXAotCWNvbmZpZy90ZS1nZW5lcmljLmggXAotCWNvbmZpZy90ZS1nbzMyLmggXAotCWNvbmZpZy90ZS1ocDMwMC5oIFwKLQljb25maWcvdGUtaHBwYS5oIFwKLQljb25maWcvdGUtaTM4NmFpeC5oIFwKLQljb25maWcvdGUtaWM5NjAuaCBcCi0JY29uZmlnL3RlLWxpbnV4LmggXAotCWNvbmZpZy90ZS1sbmV3cy5oIFwKLQljb25maWcvdGUtbHlueC5oIFwKLQljb25maWcvdGUtbWFjaC5oIFwKLQljb25maWcvdGUtbWFjb3MuaCBcCi0JY29uZmlnL3RlLW11bHRpLmggXAotCWNvbmZpZy90ZS1uYnNkLmggXAotCWNvbmZpZy90ZS1uYnNkNTMyLmggXAotCWNvbmZpZy90ZS1wYzUzMm1hY2guaCBcCi0JY29uZmlnL3RlLXBlLmggXAotCWNvbmZpZy90ZS1wcGNudy5oIFwKLQljb25maWcvdGUtcHNvcy5oIFwKLQljb25maWcvdGUtcmlzY2l4LmggXAotCWNvbmZpZy90ZS1zcGFyY2FvdXQuaCBcCi0JY29uZmlnL3RlLXN1bjMuaCBcCi0JY29uZmlnL3RlLXN2cjQuaCBcCi0JY29uZmlnL3RlLXN5c3YzMi5oCi0KLQotIyBNdWx0aSBmaWxlcyBpbiBjb25maWcKLQotTVVMVElfQ0ZJTEVTID0gXAotCWNvbmZpZy9lLWkzODZhb3V0LmMgXAotCWNvbmZpZy9lLWkzODZjb2ZmLmMgXAotCWNvbmZpZy9lLWkzODZlbGYuYyBcCi0JY29uZmlnL2UtbWlwc2Vjb2ZmLmMgXAotCWNvbmZpZy9lLW1pcHNlbGYuYwotCi0KLUNPTkZJR19PQkpTID0gXAotCSQoVEFSR19DUFVfTykgXAotCSQoT0JKX0ZPUk1BVF9PKSBcCi0JJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykKLQotCi1HRU5FUklDX09CSlMgPSBcCi0JYXBwLm8gXAotCWFzLm8gXAotCWF0b2YtZ2VuZXJpYy5vIFwKLQliaWdudW0tY29weS5vIFwKLQljb25kLm8gXAotCWRlcGVuZC5vIFwKLQlkd2FyZjJkYmcubyBcCi0JZWhvcHQubyBcCi0JZXhwci5vIFwKLQlmbG9udW0ta29uc3QubyBcCi0JZmxvbnVtLWNvcHkubyBcCi0JZmxvbnVtLW11bHQubyBcCi0JZnJhZ3MubyBcCi0JaGFzaC5vIFwKLQlpbnB1dC1maWxlLm8gXAotCWlucHV0LXNjcnViLm8gXAotCWxpdGVyYWwubyBcCi0JbWVzc2FnZXMubyBcCi0Jb3V0cHV0LWZpbGUubyBcCi0JcmVhZC5vIFwKLQlzdWJzZWdzLm8gXAotCXN5bWJvbHMubyBcCi0Jd3JpdGUubyBcCi0JbGlzdGluZy5vIFwKLQllY29mZi5vIFwKLQlzdGFicy5vIFwKLQlzYi5vIFwKLQltYWNyby5vCi0KLQotT0JKUyA9ICQoQ09ORklHX09CSlMpICQoR0VORVJJQ19PQkpTKQotCi1QT1RGSUxFUyA9ICQoTVVMVElfQ0ZJTEVTKSAkKFRBUkdFVF9FTlZfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKSBcCi0JJChPQkpfRk9STUFUX0NGSUxFUykgJChUQVJHRVRfQ1BVX0hGSUxFUykgJChUQVJHRVRfQ1BVX0NGSUxFUykgXAotCSQoSEZJTEVTKSAkKENGSUxFUykgJChHQVNfQ0ZJTEVTKQotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGFzLW5ldyBnYXNwLW5ldwotbm9pbnN0X1NDUklQVFMgPSAkKEdEQklOSVQpCi1FWFRSQV9TQ1JJUFRTID0gLmdkYmluaXQKLQotRVhUUkFfRElTVCA9IG1ha2UtZ2FzLmNvbQotCi1ESVNUU1RVRkYgPSBtYWtlLWdhcy5jb20gbTY4ay1wYXJzZS5jIGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmggaXRibC1sZXguYwotCi1ESVNUQ0xFQU5GSUxFUyA9IHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIHRhcmctZW52LmggaXRibC1jcHUuaCBjZ2VuLWRlc2MuaAotCi0jIE5vdyBmaWd1cmUgb3V0IGZyb20gdGhvc2UgdmFyaWFibGVzIGhvdyB0byBjb21waWxlIGFuZCBsaW5rLgotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLSMgVGhpcyBpcyB0aGUgdmFyaWFibGUgYWN0dWFsbHkgdXNlZCB3aGVuIHdlIGNvbXBpbGUuCi0jIFNwZWNpZnkgdGhlIGRpcmVjdG9yaWVzIHRvIGJlIHNlYXJjaGVkIGZvciBoZWFkZXIgZmlsZXMuCi0jIEJvdGggLiBhbmQgc3JjZGlyIGFyZSB1c2VkLCBpbiB0aGF0IG9yZGVyLAotIyBzbyB0aGF0IHRtLmggYW5kIGNvbmZpZy5oIHdpbGwgYmUgZm91bmQgaW4gdGhlIGNvbXBpbGF0aW9uCi0jIHN1YmRpcmVjdG9yeSByYXRoZXIgdGhhbiBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKHNyY2RpcikvY29uZmlnIC1JJChJTkNESVIpIC1JJChzcmNkaXIpLy4uIC1JJChCRkRESVIpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBUaGlzIHNob3VsZCBiZSBwYXJhbGxlbCB0byBJTkNMVURFUywgYnV0IHNob3VsZCByZXBsYWNlICQoc3JjZGlyKQotIyB3aXRoICQke3NyY2Rpcn0sIGFuZCBzaG91bGQgd29yayBpbiBhIHN1YmRpcmVjdG9yeS4gIFRoaXMgaXMgdXNlZAotIyB3aGVuIGJ1aWxkaW5nIGRlcGVuZGVuY2llcywgYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBidWlsZGluZyBpcyBkb25lCi0jIGluIGEgc3ViZGlyZWN0b3J5LgotREVQX0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAtSSQke3NyY2Rpcn0vY29uZmlnIC1JJCR7c3JjZGlyfS8uLi9pbmNsdWRlIC1JJCR7c3JjZGlyfS8uLiAtSSQke3NyY2Rpcn0vLi4vYmZkIC1JJCR7c3JjZGlyfS8uLi9pbnRsIC1JLi4vLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLSMgSG93IHRvIGxpbmsgd2l0aCBib3RoIG91ciBzcGVjaWFsIGxpYnJhcnkgZmFjaWxpdGllcwotIyBhbmQgdGhlIHN5c3RlbSdzIGluc3RhbGxlZCBsaWJyYXJpZXMuCi0KLUdBU0xJQlMgPSBAT1BDT0RFU19MSUJAIEBCRkRMSUJAIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi0jIEZpbGVzIHRvIGJlIGNvcGllZCBhd2F5IGFmdGVyIGVhY2ggc3RhZ2UgaW4gYnVpbGRpbmcuCi1TVEFHRVNUVUZGID0gKi5vICQobm9pbnN0X1BST0dSQU1TKQotCi1hc19uZXdfU09VUkNFUyA9ICQoR0FTX0NGSUxFUykKLWFzX25ld19MREFERCA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMTElCUykKLQotYXNfbmV3X0RFUEVOREVOQ0lFUyA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMREVQUykKLQotCi1nYXNwX25ld19TT1VSQ0VTID0gZ2FzcC5jIG1hY3JvLmMgc2IuYyBoYXNoLmMKLWdhc3BfbmV3X0xEQUREID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCi1nYXNwX25ld19ERVBFTkRFTkNJRVMgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKLQotRVhQRUNUID0gYGlmIFsgLWYgJCR7cm9vdG1lfS8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKLSAgICAgICAgICBlY2hvICQke3Jvb3RtZX0vLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLQotUlVOVEVTVCA9IGBpZiBbIC1mICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKLQkJZWNobyAkJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IGVsc2UgZWNobyBydW50ZXN0OyBcCi0JICAgZmlgCi0KLVJVTlRFU1RGTEFHUyA9IAotCi0jIFRoZSBtNjhrIG9wZXJhbmQgcGFyc2VyLgotCi1FWFRSQV9hc19uZXdfU09VUkNFUyA9IGNvbmZpZy9tNjhrLXBhcnNlLnkKLQotIyBzdGFuZC1hbG9uZSBpdGJsIGFzc2VtYmxlciAmIGRpc2Fzc2VtYmxlcgotCi1FWFRSQV9QUk9HUkFNUyA9IGl0YmwtdGVzdAotaXRibF90ZXN0X1NPVVJDRVMgPSBpdGJsLXBhcnNlLnkgaXRibC1sZXgubAotaXRibF90ZXN0X0xEQUREID0gaXRibC10b3BzLm8gaXRibC10ZXN0Lm8gJChHQVNMSUJTKSBATEVYTElCQAotCi0jIENHRU4gaW50ZXJmYWNlLgotCi1DR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAotCi0jIFJlbWFrZSB0aGUgaW5mbyBmaWxlcy4KLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgY29yZSBzdGFtcC1tay5jb20gXAotCXRlc3RzdWl0ZS8qLm8gdGVzdHN1aXRlLyoub3V0IHRlc3RzdWl0ZS9nYXMubG9nIHRlc3RzdWl0ZS9nYXMuc3VtIFwKLQl0ZXN0c3VpdGUvc2l0ZS5leHAgc2l0ZS5iYWsgc2l0ZS5leHAgc3RhZ2Ugc3RhZ2UxIHN0YWdlMgotCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIERFUFRDIERFUE9CSiBERVAyIERFUDEgREVQQSBERVAgREVQRElSCi0KLWFnYWluc3QgPSBzdGFnZTIKLQotIyBBdXRvbWF0aWMgZGVwZW5kZW5jeSBjb21wdXRhdGlvbi4gIFRoaXMgaXMgYSByZWFsIHBhaW4sIGJlY2F1c2UgdGhlCi0jIGRlcGVuZGVuY2llcyBjaGFuZ2UgYmFzZWQgb24gdGFyZ2V0X2NwdV90eXBlIGFuZCBvYmpfZm9ybWF0LiAgV2UKLSMgY3VycmVudGx5IGlnbm9yZSBhbnkgZGVwZW5kZW5jaWVzIGNhdXNlZCBieSBlbXVsYXRpb24gZmlsZXMuCi0KLURFUF9GSUxFX0RFUFMgPSAkKENGSUxFUykgJChIRklMRVMpICQoVEFSR0VUX0NQVV9DRklMRVMpIFwKLQkkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQotCi0KLURFUFRDX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotCi1ERVBUQ19hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotCi1ERVBUQ19hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi0KLURFUFRDX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1ERVBUQ19hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi0KLURFUFRDX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1ERVBUQ19hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi0KLURFUFRDX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggXAotICAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oICQoSU5DRElSKS9lbGYvYXJjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLURFUFRDX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQVENfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQVENfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1ERVBUQ19kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggJChJTkNESVIpL2VsZi9wcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfZDMwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaAotCi1ERVBUQ19kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLQotREVQVENfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLW9wYy5oIFwKLSAgY2dlbi5oCi0KLURFUFRDX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLW9wYy5oIFwKLSAgY2dlbi5oCi0KLURFUFRDX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaAotCi1ERVBUQ19oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKLQotREVQVENfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvaDg1MDAtb3BjLmgKLQotREVQVENfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvaDg1MDAtb3BjLmgKLQotREVQVENfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoQkZERElSKS9saWJiZmQuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi0KLURFUFRDX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJiZmQuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotCi1ERVBUQ19pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotCi1ERVBUQ19pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotCi1ERVBUQ19pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotREVQVENfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi0KLURFUFRDX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pODYwLmgKLQotREVQVENfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAotCi1ERVBUQ19pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLURFUFRDX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pOTYwLmgKLQotREVQVENfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pOTYwLmgKLQotREVQVENfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKLSAgY2dlbi5oCi0KLURFUFRDX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKLSAgY2dlbi5oCi0KLURFUFRDX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLURFUFRDX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLQotREVQVENfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oIFwKLSAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1ERVBUQ19tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLURFUFRDX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotCi1ERVBUQ19tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpL2NvbmZpZy9tODhrLW9wY29kZS5oCi0KLURFUFRDX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oCi0KLURFUFRDX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9taXBzLmggaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCi1ERVBUQ19taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIFwKLSAgaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQVENfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmgKLQotREVQVENfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0KLURFUFRDX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLQotREVQVENfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi0KLURFUFRDX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLQotREVQVENfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi0KLURFUFRDX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQVENfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUFRDX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUFRDX3BqX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3BqLmgKLQotREVQVENfcGpfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oICQoSU5DRElSKS9vcGNvZGUvcGouaAotCi1ERVBUQ19wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCi0KLURFUFRDX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaCAkKElOQ0RJUikvZWxmL3BwYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1ERVBUQ19zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotCi1ERVBUQ19zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotCi1ERVBUQ19zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotCi1ERVBUQ19zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLQotREVQVENfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9lbGYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotCi1ERVBUQ190YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLQotREVQVENfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLQotREVQVENfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi0KLURFUFRDX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotCi1ERVBUQ190aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi0KLURFUFRDX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotCi1ERVBUQ190aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi0KLURFUFRDX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLURFUFRDX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotREVQVENfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLURFUFRDX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotREVQVENfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi0KLURFUFRDX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi0KLURFUFRDX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKLQotREVQVENfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCi0KLURFUFRDX3o4a19jb2ZmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBUQ196OGtfZWxmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oIFwKLSAgJChCRkRESVIpL2VsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLQotREVQVENfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmggXAotICAkKEJGRERJUikvc29tLmgKLQotREVQVENfaTM4Nl9tdWx0aSA9ICQoREVQVENfaTM4Nl9jb2ZmKSAkKERFUFRDX2kzODZfZWxmKQotREVQVENfbWlwc19tdWx0aSA9ICQoREVQVENfbWlwc19jb2ZmKSAkKERFUFRDX21pcHNfZWNvZmYpIFwKLSAgJChERVBUQ19taXBzX2VsZikKLQotREVQT0JKX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLQotREVQT0JKX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1ERVBPQkpfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLQotREVQT0JKX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9wal9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3BqX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl92YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChCRkRESVIpL3NvbS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotCi1ERVBPQkpfaTM4Nl9tdWx0aSA9ICQoREVQT0JKX2kzODZfY29mZikgJChERVBPQkpfaTM4Nl9lbGYpCi1ERVBPQkpfbWlwc19tdWx0aSA9ICQoREVQT0JKX21pcHNfY29mZikgJChERVBPQkpfbWlwc19lY29mZikgXAotICAkKERFUE9CSl9taXBzX2VsZikKLQotREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmgKLQotREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotCi1ERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLURFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oCi0KLURFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmgKLQotREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oCi0KLURFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaAotCi1ERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmgKLQotREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmgKLQotREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmgKLQotREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmgKLQotREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmgKLQotREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCi0KLURFUF9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaAotCi1ERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaAotCi1ERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaAotCi1ERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaAotCi1ERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmgKLQotREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oCi0KLURFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaAotCi1ERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaAotCi1ERVBfcGpfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfcGpfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oCi0KLURFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmgKLQotREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmgKLQotREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oCi0KLURFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oCi0KLURFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaAotCi1ERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaAotCi1ERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaAotCi1ERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi0KLURFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmgKLQotREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oCi0KLURFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLQotREVQX2hwcGFfc29tID0gJChCRkRESVIpL3NvbS5oCi1ERVBfaTM4Nl9tdWx0aSA9ICQoREVQX2kzODZfY29mZikgJChERVBfaTM4Nl9lbGYpCi1ERVBfbWlwc19tdWx0aSA9ICQoREVQX21pcHNfY29mZikgJChERVBfbWlwc19lY29mZikgXAotICAkKERFUF9taXBzX2VsZikKLQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAgJHtHREJJTklUfQotbm9pbnN0X1BST0dSQU1TID0gIGFzLW5ldyQoRVhFRVhUKSBnYXNwLW5ldyQoRVhFRVhUKQotUFJPR1JBTVMgPSAgJChub2luc3RfUFJPR1JBTVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLWl0YmxfdGVzdF9PQkpFQ1RTID0gIGl0YmwtcGFyc2UubyBpdGJsLWxleC5vCi1pdGJsX3Rlc3RfREVQRU5ERU5DSUVTID0gIGl0YmwtdG9wcy5vIGl0YmwtdGVzdC5vIFwKLS4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotaXRibF90ZXN0X0xERkxBR1MgPSAKLWFzX25ld19PQkpFQ1RTID0gIGFwcC5vIGFzLm8gYXRvZi1nZW5lcmljLm8gYmlnbnVtLWNvcHkubyBjb25kLm8gXAotZGVwZW5kLm8gZHdhcmYyZGJnLm8gZWNvZmYubyBlaG9wdC5vIGV4cHIubyBmbG9udW0tY29weS5vIFwKLWZsb251bS1rb25zdC5vIGZsb251bS1tdWx0Lm8gZnJhZ3MubyBoYXNoLm8gaW5wdXQtZmlsZS5vIGlucHV0LXNjcnViLm8gXAotbGlzdGluZy5vIGxpdGVyYWwubyBtYWNyby5vIG1lc3NhZ2VzLm8gb3V0cHV0LWZpbGUubyByZWFkLm8gc2IubyBcCi1zdGFicy5vIHN1YnNlZ3MubyBzeW1ib2xzLm8gd3JpdGUubwotYXNfbmV3X0xERkxBR1MgPSAKLWdhc3BfbmV3X09CSkVDVFMgPSAgZ2FzcC5vIG1hY3JvLm8gc2IubyBoYXNoLm8KLWdhc3BfbmV3X0xERkxBR1MgPSAKLVNDUklQVFMgPSAgJChub2luc3RfU0NSSVBUUykKLQotTEVYX09VVFBVVF9ST09UID0gQExFWF9PVVRQVVRfUk9PVEAKLUxFWExJQiA9IEBMRVhMSUJACi1ZTFdSQVAgPSAkKHRvcF9zcmNkaXIpLy4uL3lsd3JhcAotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENPUFlJTkcgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIFwKLU1ha2VmaWxlLmluIE5FV1MgYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZy9tNjhrLXBhcnNlLmMgXAotY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBnZGJpbml0LmluIGl0YmwtbGV4LmMgaXRibC1wYXJzZS5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGl0YmxfdGVzdF9TT1VSQ0VTKSAkKGFzX25ld19TT1VSQ0VTKSAkKEVYVFJBX2FzX25ld19TT1VSQ0VTKSAkKGdhc3BfbmV3X1NPVVJDRVMpCi1PQkpFQ1RTID0gJChpdGJsX3Rlc3RfT0JKRUNUUykgJChhc19uZXdfT0JKRUNUUykgJChnYXNwX25ld19PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubCAubG8gLm8gLnMgLnkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0ke0dEQklOSVR9OiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyBnZGJpbml0LmluCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmIENPTkZJR19GSUxFUz0kQDpnZGJpbml0LmluIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLWl0YmwtdGVzdCQoRVhFRVhUKTogJChpdGJsX3Rlc3RfT0JKRUNUUykgJChpdGJsX3Rlc3RfREVQRU5ERU5DSUVTKQotCUBybSAtZiBpdGJsLXRlc3QkKEVYRUVYVCkKLQkkKExJTkspICQoaXRibF90ZXN0X0xERkxBR1MpICQoaXRibF90ZXN0X09CSkVDVFMpICQoaXRibF90ZXN0X0xEQUREKSAkKExJQlMpCi0KLWFzLW5ldyQoRVhFRVhUKTogJChhc19uZXdfT0JKRUNUUykgJChhc19uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBhcy1uZXckKEVYRUVYVCkKLQkkKExJTkspICQoYXNfbmV3X0xERkxBR1MpICQoYXNfbmV3X09CSkVDVFMpICQoYXNfbmV3X0xEQUREKSAkKExJQlMpCi0KLWdhc3AtbmV3JChFWEVFWFQpOiAkKGdhc3BfbmV3X09CSkVDVFMpICQoZ2FzcF9uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBnYXNwLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChnYXNwX25ld19MREZMQUdTKSAkKGdhc3BfbmV3X09CSkVDVFMpICQoZ2FzcF9uZXdfTERBREQpICQoTElCUykKLS5sLmM6Ci0JJChMRVgpICQoQU1fTEZMQUdTKSAkKExGTEFHUykgJDwgJiYgbXYgJChMRVhfT1VUUFVUX1JPT1QpLmMgJEAKLS55LmM6Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkPCB5LnRhYi5jICQqLmMgeS50YWIuaCAkKi5oIC0tICQoQU1fWUZMQUdTKSAkKFlGTEFHUykKLWNvbmZpZy9tNjhrLXBhcnNlLmg6IGNvbmZpZy9tNjhrLXBhcnNlLmMKLWl0YmwtcGFyc2UuaDogaXRibC1wYXJzZS5jCi0KLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1ERUpBVE9PTCA9ICQoUEFDS0FHRSkKLQotUlVOVEVTVERFRkFVTFRGTEFHUyA9IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHNyY2Rpcgotc2l0ZS5leHA6IE1ha2VmaWxlCi0JQGVjaG8gJ01ha2luZyBhIG5ldyBzaXRlLmV4cCBmaWxlLi4uJwotCUB0ZXN0ICEgLWYgc2l0ZS5iYWsgfHwgcm0gLWYgc2l0ZS5iYWsKLQlAZWNobyAnIyMgdGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBtYWtlICMjJyA+ICRALXQKLQlAZWNobyAnIyBEbyBub3QgZWRpdCBoZXJlLiAgSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlc2UgdmFsdWVzJyA+PiAkQC10Ci0JQGVjaG8gJyMgZWRpdCB0aGUgbGFzdCBzZWN0aW9uJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0b29sICQoREVKQVRPT0wpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBzcmNkaXIgJChzcmNkaXIpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBvYmpkaXInIGBwd2RgID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfYWxpYXMgJChob3N0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF90cmlwbGV0ICQoaG9zdF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X2FsaWFzICQodGFyZ2V0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X3RyaXBsZXQgJCh0YXJnZXRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX2FsaWFzICQoYnVpbGRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF90cmlwbGV0ICQoYnVpbGRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gTm90IEVkaXQgIyMnID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IHNlZCAnMSwvXiMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlLiojIy8gZCcgc2l0ZS5leHAgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgbXYgc2l0ZS5leHAgc2l0ZS5iYWsKLQlAbXYgJEAtdCBzaXRlLmV4cAotaW5mby1hbToKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06Ci1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLURFSkFHTlUKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1leGVjLWxvY2FsCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoU0NSSVBUUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0JLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIml0YmwtbGV4bGNvbmZpZy9tNjhrLXBhcnNlaGNvbmZpZy9tNjhrLXBhcnNlY2l0YmwtcGFyc2VoaXRibC1wYXJzZWMiIHx8IHJtIC1mIGl0YmwtbGV4bCBjb25maWcvbTY4ay1wYXJzZWggY29uZmlnL202OGstcGFyc2VjIGl0YmwtcGFyc2VoIGl0YmwtcGFyc2VjCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLXRhZ3MgbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdFBST0dSQU1TIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuLWdlbmVyaWMgXAotCQljbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBcCi0JCW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1jbGVhbi1ub2luc3RQUk9HUkFNUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBcCi1kdmktcmVjdXJzaXZlIG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBcCi1pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0kKHNyY2RpcikvbWFrZS1nYXMuY29tOiBzdGFtcC1tay5jb20KLXN0YW1wLW1rLmNvbTogdm1zY29uZi5zaCBNYWtlZmlsZQotCXNoICQoc3JjZGlyKS92bXNjb25mLnNoICQoR0VORVJJQ19PQkpTKSA+IG5ldy1tYWtlLmNvbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBuZXctbWFrZS5jb20gJChzcmNkaXIpL21ha2UtZ2FzLmNvbQotCXRvdWNoIHN0YW1wLW1rLmNvbQotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi0kKE9CSlMpOiBAQUxMX09CSl9ERVBTQAotCi0jIFN0dWZmIHRoYXQgZXZlcnkgb2JqZWN0IGZpbGUgZGVwZW5kcyB1cG9uLiAgSWYgYW55dGhpbmcgaXMgcmVtb3ZlZAotIyBmcm9tIHRoaXMgbGlzdCwgcmVtb3ZlIGl0IGZyb20gZGVwLWluLnNlZCBhcyB3ZWxsLgotJChPQkpTKTogY29uZmlnLmggYXMuaCAkKFRBUkdfRU5WX0gpICQoT0JKX0ZPUk1BVF9IKSAkKFRBUkdfQ1BVX0gpIGZsb251bS5oIFwKLQlleHByLmggd3JpdGUuaCBmcmFncy5oIGhhc2guaCByZWFkLmggc3ltYm9scy5oIHRjLmggXAotCW9iai5oIGxpc3RpbmcuaCBiaWdudW0uaCBiaXRfZml4LmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGFzaW50bC5oCi0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0JaWYgWyAtZCB0ZXN0c3VpdGUgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxzZSBcCi0JICBta2RpciB0ZXN0c3VpdGU7IFwKLQlmaQotCXJtIC1mIHRlc3RzdWl0ZS9zaXRlLmV4cAotCWNwIHNpdGUuZXhwIHRlc3RzdWl0ZS9zaXRlLmV4cAotCXJvb3RtZT1gcHdkYDsgZXhwb3J0IHJvb3RtZTsgXAotCXNyY2Rpcj1gY2QgJHtzcmNkaXJ9OyBwd2RgIDsgZXhwb3J0IHNyY2RpciA7IFwKLQlFWFBFQ1Q9JHtFWFBFQ1R9IDsgZXhwb3J0IEVYUEVDVCA7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQljZCB0ZXN0c3VpdGU7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFRoZSBpbXBsaWNpdCAuYy5vIHJ1bGUgZG9lc24ndCB3b3JrIGZvciB0aGVzZSwgcGVyaGFwcyBiZWNhdXNlIG9mCi0jIHRoZSB2YXJpYWJsZXMsIG9yIHBlcmhhcHMgYmVjYXVzZSB0aGUgc291cmNlcyBhcmUgbm90IG9uIHZwYXRoLgotJChUQVJHX0NQVV9PKTogJChUQVJHX0NQVV9DKSAkKFRBUkdfQ1BVX0RFUF9AdGFyZ2V0X2NwdV90eXBlQCkKLQkkKENPTVBJTEUpIC1jICQoVEFSR19DUFVfQykKLSQoQVRPRl9UQVJHX08pOiAkKEFUT0ZfVEFSR19DKQotCSQoQ09NUElMRSkgLWMgJChBVE9GX1RBUkdfQykKLQotIyBlY29mZi5jIG9ubHkgaGFzIGZ1bGwgZGVwZW5kZW5jaWVzIHdoZW4gRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQsCi0jIHNvIHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeSBzdHVmZiBkb2Vzbid0IHdvcmsuCi1lY29mZi5vIDogZWNvZmYuYyBlY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggXAotCSQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0JJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaAotCi0jIFdlIG5lZWQgYWxsIHRoZXNlIGV4cGxpY2l0IHJ1bGVzIGZvciB0aGUgbXVsdGkgc3R1ZmYuICBCZWNhdXNlIG9mCi0jIHRoZXNlIHJ1bGVzLCB3ZSBkb24ndCBuZWVkIG9uZSBmb3IgT0JKX0ZPUk1BVF9PLgotCi1vYmotYW91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMKLW9iai1ib3V0Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuYwotb2JqLWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmMKLW9iai1lY29mZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotb2JqLWVsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCi1vYmotZXZheC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmMKLW9iai1ocDMwMC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotb2JqLWllZWUubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaWVlZS5jCi1vYmotbXVsdGkubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLW9iai1zb20ubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYwotb2JqLXZtcy5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCi0KLWUtbWlwc2VsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotZS1taXBzZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jCi1lLWkzODZhb3V0Lm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2YW91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmFvdXQuYwotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0KLSMgSWYgbTY4ay1wYXJzZS55IGlzIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSwgdGhlbiB5bHdyYXAgd2lsbCB1c2UgYW4KLSMgYWJzb2x1dGUgcGF0aCB3aGVuIGl0IGludm9rZXMgeWFjYywgd2hpY2ggd2lsbCBjYXVzZSB5YWNjIHRvIHB1dCB0aGUKLSMgYWJzb2x1dGUgcGF0aCBpbnRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gIFRoYXQncyBhIHBhaW4gd2hlbiBpdCBjb21lcwotIyB0byBnZW5lcmF0aW5nIHNuYXBzaG90cywgYmVjYXVzZSBpdCBpbnRyb2R1Y2VzIHNwdXJpb3VzIGRpZmZzLgotIyBTaW5jZSB3aGVuIHdlIG1ha2UgdGhlIHNuYXBzaG90cyAkKHNyY2RpcikgPSAiLiIsIHdlIGNoZWNrIGZvciB0aGF0Ci0jIGNhc2UgYW5kIGhhbmRsZSBpdCBkaWZmZXJlbnRseS4gIFRoaXMgbWVhbnMgdGhhdCBhbnlib2R5IHdobwotIyBjb25maWd1cmVzIHdpdGggJChzcmNkaXIpID0gIi4iIHdpbGwgaGF2ZSB0byBzZXQgdGhlaXIgcGF0aCBpbiB0aGUKLSMgZGVidWdnZXIgaWYgdGhleSB3YW50IHRvIGRlYnVnIG02OGstcGFyc2UueS4gIFRoaXMgaXMgYmFkLCBidXQgb24KLSMgdGhlIG90aGVyIGhhbmQgaXQncyBnb29kIHRoYXQgcGVvcGxlIHdobyB1c2UgdGhlIHByZWJ1aWx0Ci0jIG02OGstcGFyc2UuYyBkb24ndCBnZXQgYSBzcHVyaW91cyBhYnNvbHV0ZSBwYXRoLgotbTY4ay1wYXJzZS5jOiAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueQotCWY9JChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLnk7IFwKLQlpZiBbICQkZiA9ICIuL2NvbmZpZy9tNjhrLXBhcnNlLnkiIF07IHRoZW4gXAotCSAgbG4gLXMgY29uZmlnL202OGstcGFyc2UueSAuID4gL2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IFwKLQkgICBsbiBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAotCSAgIGNwIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyBcCi0JICBmPW02OGstcGFyc2UueTsgXAotCWVsc2UgdHJ1ZTsgZmk7IFwKLQkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQkZiB5LnRhYi5jIG02OGstcGFyc2UuYyAtLTsgXAotCWlmIFsgJCRmID0gIm02OGstcGFyc2UueSIgXTsgdGhlbiBcCi0JICBybSAtZiBtNjhrLXBhcnNlLnk7IFwKLQllbHNlIHRydWU7IGZpCi1tNjhrLXBhcnNlLm86IG02OGstcGFyc2UuYyAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi0jIERvbid0IGxldCB0aGUgLnkuaCBydWxlIGNsb2JiZXIgbTY4ay1wYXJzZS5oLgotbTY4ay1wYXJzZS5oOiA7IEB0cnVlCi0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaDogOyBAdHJ1ZQotCi0jIFRoZSBpbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIGxleGljYWwgYW5hbHl6ZXIgYW5kIHBhcnNlci4KLQotaXRibC1sZXguYzogJChzcmNkaXIpL2l0YmwtbGV4LmwKLWl0YmwtbGV4Lm86IGl0YmwtbGV4LmMgaXRibC1wYXJzZS5oCi0KLWl0YmwtcGFyc2UubzogaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCAkKHNyY2RpcikvaXRibC1vcHMuaAotCi1pdGJsLW9wcy5vOiAkKHNyY2RpcikvaXRibC1vcHMuYyAkKHNyY2RpcikvaXRibC1vcHMuaCBpdGJsLXBhcnNlLmgKLQotaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaDogJChzcmNkaXIpL2l0YmwtcGFyc2UueQotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJChzcmNkaXIpL2l0YmwtcGFyc2UueSB5LnRhYi5jIGl0YmwtcGFyc2UuYyB5LnRhYi5oIGl0YmwtcGFyc2UuaCAtLSAtZAotCi1pdGJsLXRvcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0JJChDT01QSUxFKSAtbyBpdGJsLXRvcHMubyAtRFNUQU5EX0FMT05FIC1jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi0KLWl0YmwtdGVzdC5vOiAkKHNyY2RpcikvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMgJChzcmNkaXIpL2l0Ymwtb3BzLmgKLQkkKENPTVBJTEUpIC1jIC1EU1RBTkRfQUxPTkUgJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCi0KLWNnZW4ubzogY2dlbi5jIGNnZW4uaCBjZ2VuLWRlc2MuaCBzdWJzZWdzLmggXAotCSQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1kZXNjLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1vcGMuaAotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKLS5QSE9OWTogaW5zdGFsbC1leGVjLWJpbmRpciBpbnN0YWxsLWV4ZWMtdG9vbGRpcgotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6IGluc3RhbGwtZXhlYy1iaW5kaXIgQGluc3RhbGxfdG9vbGRpckAKLQotaW5zdGFsbC1leGVjLWJpbmRpcjogJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKGJpbmRpcikKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotaW5zdGFsbC1leGVjLXRvb2xkaXI6IGluc3RhbGwtZXhlYy1iaW5kaXIgJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgotCW49YGVjaG8gYXMgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBhcy1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQllbHNlIFwKLQkgIHRydWUgOyBcCi0JZmkKLQotIyBUaGVzZSBleGlzdCBmb3IgbWFpbnRlbmFuY2UgcHVycG9zZXMuCi0KLS5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcDIgYm9vdHN0cmFwMyBzdGFnZTEgc3RhZ2UyIHN0YWdlMyBjb21wYXJpc29uCi0KLWJvb3RzdHJhcDogYXMtbmV3Ci0JJChNQUtFKSBzdGFnZTEKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIHN0YWdlMgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi1ib290c3RyYXAyOgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDM6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLSMgQ29weSB0aGUgb2JqZWN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIHN0YWdlIGludG8gYSBzdWJkaXJlY3RvcnkuCi1zdGFnZTE6Ci0JLW1rZGlyIHN0YWdlMQotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMQotCWlmIFsgLWYgc3RhZ2UxL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMS9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UxIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCi0KLXN0YWdlMjoKLQktbWtkaXIgc3RhZ2UyCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UyCi0JaWYgWyAtZiBzdGFnZTIvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UyL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTIgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UzOgotCS1ta2RpciBzdGFnZTMKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTMKLQlpZiBbIC1mIHN0YWdlMy9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTMvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMyA7IGxuIC1zIGFzLW5ldyBhcyQoRVhFRVhUKSkgOyBmaQotCi0jIFRoaXMgcnVsZSBpcyBkZXJpdmVkIGZyb20gY29ycmVzcG9uZGluZyBjb2RlIGluIHRoZSBNYWtlZmlsZS5pbiBmb3IgZ2NjLgotIyBUaGUgInRhaWwgKzE2YyIgaXMgdG8gYnlwYXNzIGhlYWRlcnMgd2hpY2ggbWF5IGluY2x1ZGUgdGltZXN0YW1wcyBvcgotIyB0ZW1wb3JhcnkgYXNzZW1ibHkgZmlsZSBuYW1lcy4KLWNvbXBhcmlzb246Ci0JeD0wIDsgXAotCWZvciBmaWxlIGluICoubyA7IGRvIFwKLQkgIHRhaWwgKzE2YyAuLyQkZmlsZSA+IHRtcC1mb28xOyBcCi0JICBpZiB0YWlsICsxNmMgJHthZ2FpbnN0fS8kJGZpbGUgPiB0bXAtZm9vMiAyPi9kZXYvbnVsbCA7IHRoZW4gXAotCSAgICBpZiBjbXAgdG1wLWZvbzEgdG1wLWZvbzIgOyB0aGVuIFwKLQkgICAgICB0cnVlIDsgXAotCSAgICBlbHNlIFwKLQkgICAgICBlY2hvICQkZmlsZSBkaWZmZXJzIDsgXAotCSAgICAgIHg9MSA7IFwKLQkgICAgZmkgOyBcCi0JICBlbHNlIHRydWU7IGZpIDsgXAotCWRvbmUgOyBcCi0JZXhpdCAkJHgKLQktcm0gLWYgdG1wLWZvbyoKLQotLlBIT05ZOiBkZS1zdGFnZTEgZGUtc3RhZ2UyIGRlLXN0YWdlMwotCi1kZS1zdGFnZTE6Ci0JLSAoY2Qgc3RhZ2UxIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UxCi0KLWRlLXN0YWdlMjoKLQktIChjZCBzdGFnZTIgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTIKLQotZGUtc3RhZ2UzOgotCS0gKGNkIHN0YWdlMyA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMwotCi1ERVA6IGRlcC5zZWQgJChERVBfRklMRV9ERVBTKSBERVBUQyBERVBPQkogREVQMgotCXJtIC1mIERFUDEKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgc3JjZGlyPSQke3NyY2Rpcn0gVlBBVEg9JCR7c3JjZGlyfSBERVAxCi0Jcm0gLXJmIERFUERJUgotCXNlZCAtZiBkZXAuc2VkIDwgREVQMSA+IERFUEEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUFRDID4+IERFUEEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUE9CSiA+PiBERVBBCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVAyID4+IERFUEEKLQllY2hvICckJChPQkpTKTogJCQoREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiBERVBBCi0JZWNobyAnJCQoVEFSR19DUFVfTyk6ICQkKERFUFRDX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiBERVBBCi0JZWNobyAnJCQoT0JKX0ZPUk1BVF9PKTogJCQoREVQT0JKX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiBERVBBCi0JZWNobyAnIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZJyA+PiBERVBBCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIERFUEEgREVQCi0KLSMgVGhpcyBydWxlIG5lZWRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLURFUDE6ICQoQ0ZJTEVTKSAkKE1VTFRJX0NGSUxFUykKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZWNobyAnJyA+IHRhcmctY3B1Lmg7IFwKLQllY2hvICcnID4gb2JqLWZvcm1hdC5oOyBcCi0JZWNobyAnJyA+IHRhcmctZW52Lmg7IFwKLQllY2hvICcnID4gaXRibC1jcHUuaDsgXAotCWVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSAkPwotCXNlZCAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgPCBERVBESVIvREVQID4gREVQMQotCXJtIC1mIERFUERJUi9ERVAKLQotIyBXb3JrIG91dCB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMgZm9yIHRoZSB0Yy0qLmMgZmlsZXMuCi1ERVBUQzogJChUQVJHRVRfQ1BVX0NGSUxFUykKLQlybSAtZiBERVBUQ0EKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIkJHtjfSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvdGMtJCR7Y30uYyBkdW1teS5jOyBcCi0JICAgICAgZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVA7IFwKLQkgICAgICAkKE1LREVQKSAtZiBERVAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgZHVtbXkuYzsgXAotCSAgICAgIHNlZCAtZSAicy9kdW1teS5vOiBkdW1teS5jL0RFUFRDXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQVENBOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ0RFUFRDX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcJyA+PiBERVBUQ0EKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IERFUFRDQQotCWVjaG8gJyAgJCQoSU5DRElSKS9vcGNvZGUvaHBwYS5oICQkKEJGRERJUikvc29tLmgnID4+IERFUFRDQQotIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBUQ18nIiQke2N9IidfbXVsdGkgPSBcJyA+PiBERVBUQ0E7IFwKLQkgICAgZWNobyAnJCQoREVQVENfJyIkJHtjfSInX2NvZmYpIFwnID4+IERFUFRDQTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKERFUFRDXyciJCR7Y30iJ19lY29mZikgXCcgPj4gREVQVENBOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQVENfJyIkJHtjfSInX2VsZiknID4+IERFUFRDQTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQltdiAtZiBERVBUQ0EgREVQVEMKLQotIyBXb3JrIG91dCB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBvYmotKi5jIGZpbGVzLgotREVQT0JKOiAkKE9CSl9GT1JNQVRfQ0ZJTEVTKQotCXJtIC1mIERFUE9CSkEKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL29iai0kJHtvfS5jIGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSAgICAgICQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQT0JKXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQT0JKQTsgXAotCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdERVBPQkpfaHBwYV9zb20gPSAkJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmggc3Vic2Vncy5oIFwnID4+IERFUE9CSkEKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IERFUE9CSkEKLQllY2hvICcgICQkKEJGRERJUikvc29tLmggICQkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwnID4+IERFUE9CSkEKLQllY2hvICcgICQkKElOQ0RJUikvYW91dC9zdGFiLmRlZicgPj4gREVQT0JKQQotIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBPQkpfJyIkJHtjfSInX211bHRpID0gXCcgPj4gREVQT0JKQTsgXAotCSAgICBlY2hvICckJChERVBPQkpfJyIkJHtjfSInX2NvZmYpIFwnID4+IERFUE9CSkE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChERVBPQkpfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVBPQkpBOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQT0JKXyciJCR7Y30iJ19lbGYpJyA+PiBERVBPQkpBOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIERFUE9CSkEgREVQT0JKCi0KLSMgV29yayBvdXQgdGhlIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBDUFUvT0JKIGNvbWJpbmF0aW9uLgotIyBOb3RlIHRoYXQgU09NIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlIGl0IG9ubHkgd29ya3MgbmF0aXZlLgotREVQMjogJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKLQlybSAtZiBERVAyYQotCWlmIFsgLWQgREVQRElSIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciBERVBESVI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCBERVBESVI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSAgICAgICQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQMmE7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdERVBfaHBwYV9zb20gPSAkJChCRkRESVIpL3NvbS5oJyA+PiBERVAyYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IERFUDJhOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfY29mZikgXCcgPj4gREVQMmE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWxmKScgPj4gREVQMmE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgREVQMmEgREVQMgotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQgXAotCQktZSAicyFASU5DRElSQCEkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUhIiBcCi0JCS1lICJzIUBCRkRESVJAISQke3NyY2Rpcn0vLi4vYmZkISIgXAotCQktZSAicyFAU1JDRElSQCEkJHtzcmNkaXJ9ISIKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hcHAubzogYXBwLmMKLWFzLm86IGFzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaCBcCi0gIHNiLmggbWFjcm8uaAotYXRvZi1nZW5lcmljLm86IGF0b2YtZ2VuZXJpYy5jCi1iaWdudW0tY29weS5vOiBiaWdudW0tY29weS5jCi1jb25kLm86IGNvbmQuYyBtYWNyby5oIHNiLmggJChJTkNESVIpL29ic3RhY2suaAotZGVwZW5kLm86IGRlcGVuZC5jCi1kd2FyZjJkYmcubzogZHdhcmYyZGJnLmMgZHdhcmYyZGJnLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5vOiBlY29mZi5jIGVjb2ZmLmgKLWVob3B0Lm86IGVob3B0LmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZXhwci5vOiBleHByLmMgJChJTkNESVIpL29ic3RhY2suaAotZmxvbnVtLWNvcHkubzogZmxvbnVtLWNvcHkuYwotZmxvbnVtLWtvbnN0Lm86IGZsb251bS1rb25zdC5jCi1mbG9udW0tbXVsdC5vOiBmbG9udW0tbXVsdC5jCi1mcmFncy5vOiBmcmFncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1oYXNoLm86IGhhc2guYyAkKElOQ0RJUikvb2JzdGFjay5oCi1pbnB1dC1maWxlLm86IGlucHV0LWZpbGUuYyBpbnB1dC1maWxlLmgKLWlucHV0LXNjcnViLm86IGlucHV0LXNjcnViLmMgaW5wdXQtZmlsZS5oIHNiLmgKLWxpc3RpbmcubzogbGlzdGluZy5jIGlucHV0LWZpbGUuaCBzdWJzZWdzLmgKLWxpdGVyYWwubzogbGl0ZXJhbC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1tYWNyby5vOiBtYWNyby5jIHNiLmggbWFjcm8uaAotbWVzc2FnZXMubzogbWVzc2FnZXMuYwotb3V0cHV0LWZpbGUubzogb3V0cHV0LWZpbGUuYyBvdXRwdXQtZmlsZS5oCi1yZWFkLm86IHJlYWQuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBzYi5oIG1hY3JvLmggXAotICBlY29mZi5oCi1zYi5vOiBzYi5jIHNiLmgKLXN0YWJzLm86IHN0YWJzLmMgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggZWNvZmYuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN1YnNlZ3Mubzogc3Vic2Vncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1zeW1ib2xzLm86IHN5bWJvbHMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBcCi0gIHN0cnVjLXN5bWJvbC5oCi13cml0ZS5vOiB3cml0ZS5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmgKLWdhc3AubzogZ2FzcC5jIHNiLmggbWFjcm8uaAotaXRibC1vcHMubzogaXRibC1vcHMuYyBpdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotZS1pMzg2YW91dC5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmFvdXQuYyBlbXVsLmggXAotICBlbXVsLXRhcmdldC5oCi1lLWkzODZjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi1lLW1pcHNlY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMgZW11bC5oIFwKLSAgZW11bC10YXJnZXQuaAotZS1taXBzZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMgZW11bC5oIGVtdWwtdGFyZ2V0LmgKLSQoT0JKUyk6ICQoREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoVEFSR19DUFVfTyk6ICQoREVQVENfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotJChPQkpfRk9STUFUX08pOiAkKERFUE9CSl9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ2FzL05FV1MgYi9nYXMvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmNTU0Yy4uMDAwMDAwMAotLS0gYS9nYXMvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0tKi0gdGV4dCAtKi0KLQotQ2hhbmdlcyBpbiAyLjEwOgotCi1TdXBwb3J0IGZvciBBVE1FTCBBVlIuCi0KLVN1cHBvcnQgZm9yIElCTSAzNzAgRUxGLiAgU29tZXdoYXQgZXhwZXJpbWVudGFsLgotCi1TdXBwb3J0IGZvciBudW1iZXJzIHdpdGggc3VmZml4ZXMuCi0KLUFkZGVkIHN1cHBvcnQgZm9yIGJyZWFraW5nIHRvIHRoZSBlbmQgb2YgcmVwZWF0IGxvb3BzLgotCi1BZGRlZCBzdXBwb3J0IGZvciBwYXJhbGxlbCBpbnN0cnVjdGlvbiBzeW50YXggKERPVUJMRUJBUl9QQVJBTExFTCkuCi0KLU5ldyAuZWxzZWlmIHBzZXVkby1vcCBhZGRlZC4KLQotTmV3IC0tZmF0YWwtd2FybmluZ3Mgb3B0aW9uLgotCi1waWNvSmF2YSBhcmNoaXRlY3R1cmUgc3VwcG9ydCBhZGRlZC4KLQotTW90b3JvbGEgTUNvcmUgMjEwIHByb2Nlc3NvciBzdXBwb3J0IGFkZGVkLgotCi1BIG5ldyBwc2V1ZG8tb3AgLmludGVsX3N5bnRheCBoYXMgYmVlbiBpbXBsZW1lbnRlZCB0byBhbGxvdyBnYXMgdG8gcGFyc2UgaTM4NgotYXNzZW1ibHkgcHJvZ3JhbXMgd2l0aCBpbnRlbCBzeW50YXguCi0KLU5ldyBwc2V1ZG8tb3BzIC5mdW5jLC5lbmRmdW5jIHRvIGFpZCBpbiBkZWJ1Z2dpbmcgdXNlci13cml0dGVuIGFzc2VtYmxlciBjb2RlLgotCi1BZGRlZCAtZ2R3YXJmMiBvcHRpb24gdG8gZ2VuZXJhdGUgRFdBUkYgMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLUZ1bGwgMTYtYml0IG1vZGUgc3VwcG9ydCBmb3IgaTM4Ni4KLQotR3JlYXRseSBpbXByb3ZlZCBpbnN0cnVjdGlvbiBvcGVyYW5kIGNoZWNraW5nIGZvciBpMzg2LiAgVGhpcyBjaGFuZ2Ugd2lsbAotcHJvZHVjZSBlcnJvcnMgb3Igd2FybmluZ3Mgb24gaW5jb3JyZWN0IGFzc2VtYmx5IGNvZGUgdGhhdCBwcmV2aW91cyB2ZXJzaW9ucyBvZgotZ2FzIGFjY2VwdGVkLiAgSWYgeW91IGdldCB1bmV4cGVjdGVkIG1lc3NhZ2VzIGZyb20gY29kZSB0aGF0IHdvcmtlZCB3aXRoIG9sZGVyCi12ZXJzaW9ucyBvZiBnYXMsIHBsZWFzZSBkb3VibGUgY2hlY2sgdGhlIGNvZGUgYmVmb3JlIHJlcG9ydGluZyBhIGJ1Zy4KLQotV2VhayBzeW1ib2wgc3VwcG9ydCBhZGRlZCBmb3IgQ09GRiB0YXJnZXRzLgotCi1NaXRzdWJpc2hpIEQzMFYgc3VwcG9ydCBhZGRlZC4KLQotVGV4YXMgSW5zdHJ1bWVudHMgYzgwICh0bXMzMjBjODApIHN1cHBvcnQgYWRkZWQuCi0KLWk5NjAgRUxGIHN1cHBvcnQgYWRkZWQuCi0KLUNoYW5nZXMgaW4gMi45OgotCi1UZXhhcyBJbnN0cnVtZW50cyBjMzAgKHRtczMyMGMzMCkgc3VwcG9ydCBhZGRlZC4KLQotVGhlIGFzc2VtYmxlciBub3cgb3B0aW1pemVzIHRoZSBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5IGVnY3MKLWFuZCBnY2MgMi44LiAgVGhlIG5ldyAtLXRyYWRpdGlvbmFsLWZvcm1hdCBvcHRpb24gZGlzYWJsZXMgdGhpcyBvcHRpbWl6YXRpb24uCi0KLUFkZGVkIC0tZ3N0YWJzIG9wdGlvbiB0byBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLVRoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBtIChlLmcuLCAtYWxtKSB0byBleHBhbmQgbWFjcm9zIGluIGEKLWxpc3RpbmcuCi0KLUFkZGVkIC1NRCBvcHRpb24gdG8gcHJpbnQgZGVwZW5kZW5jaWVzLgotCi1DaGFuZ2VzIGluIDIuODoKLQotQmVPUyBzdXBwb3J0IGFkZGVkLgotCi1NSVBTMTYgc3VwcG9ydCBhZGRlZC4KLQotTW90b3JvbGEgQ29sZEZpcmUgNTIwMCBzdXBwb3J0IGFkZGVkIChjb25maWd1cmUgZm9yIG02OGsgYW5kIHVzZSAtbTUyMDApLgotCi1BbHBoYS9WTVMgc3VwcG9ydCBhZGRlZC4KLQotbTY4ayBvcHRpb25zIC0tYmFzZS1zaXplLWRlZmF1bHQtMTYsIC0tYmFzZS1zaXplLWRlZmF1bHQtMzIsCi0tLWRpc3Atc2l6ZS1kZWZhdWx0LTE2LCBhbmQgLS1kaXNwLXNpemUtZGVmYXVsdC0zMiBhZGRlZC4KLQotVGhlIGFsaWdubWVudCBkaXJlY3RpdmVzIG5vdyB0YWtlIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUKLW1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcKLW1vcmUgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLCB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4KLQotVGhlIEVMRiBhc3NlbWJsZXIgaGFzIGEgbmV3IHBzZXVkby1vcCwgLnN5bXZlciwgdXNlZCBmb3Igc3ltYm9sIHZlcnNpb25pbmcuCi0KLVRoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBjIChlLmcuLCAtYWxjKSwgdG8gc2tpcCBmYWxzZSBjb25kaXRpb25hbHMKLWluIGxpc3RpbmdzLgotCi1BZGRlZCBuZXcgcHNldWRvLW9wLCAuZXF1aXY7IGl0J3MgbGlrZSAuZXF1LCBleGNlcHQgdGhhdCBpdCBpcyBhbiBlcnJvciBpZiB0aGUKLXN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLUNoYW5nZXMgaW4gMi43OgotCi1UaGUgUG93ZXJQQyBhc3NlbWJsZXIgbm93IGFsbG93cyB0aGUgdXNlIG9mIHN5bWJvbGljIHJlZ2lzdGVyIG5hbWVzIChyMCwgZXRjLikKLWlmIC1tcmVnbmFtZXMgaXMgdXNlZC4gIFN5bWJvbGljIG5hbWVzIHByZWNlZGVkIGJ5IGEgJyUnICglcjAsIGV0Yy4pIGNhbiBiZQotdXNlZCBhbnkgdGltZS4gIFBvd2VyUEMgODYwIG1vdmUgdG8vZnJvbSBTUFIgaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbiBhZGRlZC4KLQotQWxwaGEgTGludXggKEVMRikgc3VwcG9ydCBhZGRlZC4KLQotUG93ZXJQQyBFTEYgc3VwcG9ydCBhZGRlZC4KLQotbTY4ayBMaW51eCAoRUxGKSBzdXBwb3J0IGFkZGVkLgotCi1pOTYwIEh4L0p4IHN1cHBvcnQgYWRkZWQuCi0KLWkzODYvUG93ZXJQQyBnbnUtd2luMzIgc3VwcG9ydCBhZGRlZC4KLQotU0NPIEVMRiBzdXBwb3J0IGFkZGVkLiAgRm9yIE9wZW5TZXJ2ZXIgNSB0YXJnZXRzIChpMzg2LXVua25vd24tc2NvMy4ydjUpIHRoZQotZGVmYXVsdCBpcyB0byBidWlsZCBDT0ZGLW9ubHkgc3VwcG9ydC4gIFRvIGdldCBhIHNldCBvZiB0b29scyB0aGF0IGdlbmVyYXRlIEVMRgotKHRoZXknbGwgdW5kZXJzdGFuZCBib3RoIENPRkYgYW5kIEVMRiksIHlvdSBtdXN0IGNvbmZpZ3VyZSB3aXRoCi10YXJnZXQ9aTM4Ni11bmtub3duLXNjbzMuMnY1ZWxmLgotCi1tODhrLW1vdG9yb2xhLXN5c3YzKiBzdXBwb3J0IGFkZGVkLgotCi1DaGFuZ2VzIGluIDIuNjoKLQotR2FzIG5vdyBkaXJlY3RseSBzdXBwb3J0cyBtYWNyb3MsIHdpdGhvdXQgcmVxdWlyaW5nIEdBU1AuCi0KLUdhcyBub3cgaGFzIGFuIE1SSSBhc3NlbWJsZXIgY29tcGF0aWJpbGl0eSBtb2RlLiAgVXNlIC1NIG9yIC0tbXJpIHRvIHNlbGVjdCBNUkkKLW1vZGUuICBUaGUgcHNldWRvLW9wIGBgLm1yaSAxJycgd2lsbCBzd2l0Y2ggaW50byB0aGUgTVJJIG1vZGUgdW50aWwgdGhlIGBgLm1yaQotMCcnIGlzIHNlZW47IHRoaXMgY2FuIGJlIGNvbnZlbmllbnQgZm9yIGlubGluZSBhc3NlbWJsZXIgY29kZS4KLQotQWRkZWQgLS1kZWZzeW0gU1lNPVZBTFVFIG9wdGlvbi4KLQotQWRkZWQgLW1pcHM0IHN1cHBvcnQgdG8gTUlQUyBhc3NlbWJsZXIuCi0KLUFkZGVkIFBJQyBzdXBwb3J0IHRvIFNvbGFyaXMgYW5kIFNQQVJDIFN1bk9TIDQgYXNzZW1ibGVyLgotCi1DaGFuZ2VzIGluIDIuNDoKLQotQ29udmVydGVkIHRoaXMgZGlyZWN0b3J5IHRvIHVzZSBhbiBhdXRvY29uZi1nZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdC4KLQotQVJNIHN1cHBvcnQsIGZyb20gUmljaGFyZCBFYXJuc2hhdy4KLQotVXBkYXRlZCBWTVMgc3VwcG9ydCwgZnJvbSBQYXQgUmFua2luLCBpbmNsdWRpbmcgY29uc2lkZXJhYmx5IGltcHJvdmVkIGRlYnVnZ2luZwotc3VwcG9ydC4KLQotU3VwcG9ydCBmb3IgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzIGluIHRoZSA2ODA2MC4KLQotSGFuZGxlcyAoaWdub3JlcykgYSBuZXcgZGlyZWN0aXZlICIudGhpc19HQ0NfcmVxdWlyZXNfdGhlX0dOVV9hc3NlbWJsZXIiLCB0bwotcHJvdmlkZSBmb3IgcG9zc2libGUgZnV0dXJlIGdjYyBjaGFuZ2VzLCBmb3IgdGFyZ2V0cyB3aGVyZSBnYXMgcHJvdmlkZXMgc29tZQotZmVhdHVyZXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbmF0aXZlIGFzc2VtYmxlci4gIElmIHRoZSBuYXRpdmUgYXNzZW1ibGVyIGlzCi11c2VkLCBpdCBzaG91bGQgYmVjb21lIG9idmlvdXMgcHJldHR5IHF1aWNrbHkgd2hhdCB0aGUgcHJvYmxlbSBpcy4KLQotVXNhZ2UgbWVzc2FnZSBpcyBhdmFpbGFibGUgd2l0aCAiLS1oZWxwIi4KLQotVGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yIChnYXNwKSBpcyBpbmNsdWRlZC4gIChBY3R1YWxseSwgaXQgd2FzIGluIDIuMwotYWxzbywgYnV0IGRpZG4ndCBnZXQgaW50byB0aGUgTkVXUyBmaWxlLikKLQotV2VhayBzeW1ib2wgc3VwcG9ydCBmb3IgYS5vdXQuCi0KLUEgYnVnIGluIHRoZSBsaXN0aW5nIGNvZGUgd2hpY2ggY291bGQgY2F1c2UgYW4gaW5maW5pdGUgbG9vcCBoYXMgYmVlbiBmaXhlZC4KLUJ1Z3MgaW4gbGlzdGluZ3Mgd2hlbiBnZW5lcmF0aW5nIGEgQ09GRiBvYmplY3QgZmlsZSBoYXZlIGFsc28gYmVlbiBmaXhlZC4KLQotSW5pdGlhbCBpMzg2LXN2cjQgUElDIGltcGxlbWVudGF0aW9uIGZyb20gRXJpYyBZb3VuZ2RhbGUsIGJhc2VkIG9uIGNvZGUgYnkgUGF1bAotS3JhbmVuYnVyZy4KLQotSW1wcm92ZWQgQWxwaGEgc3VwcG9ydC4gIEltbWVkaWF0ZSBjb25zdGFudHMgY2FuIGhhdmUgYSBtdWNoIGxhcmdlciByYW5nZSBub3cuCi1TdXBwb3J0IGZvciB0aGUgMjExNjQgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgRGlnaXRhbC4KLQotVXBkYXRlZCBuczMyayAocGM1MzItbWFjaCwgbmV0YnNkNTMyKSBzdXBwb3J0IGZyb20gSWFuIERhbGwuCi0KLUNoYW5nZXMgaW4gMi4zOgotCi1NYWNoIGkzODYgc3VwcG9ydCwgYnkgRGF2aWQgTWFja2VuemllIGFuZCBLZW4gUmFlYnVybi4KLQotUlMvNjAwMCBhbmQgUG93ZXJQQyBzdXBwb3J0IGJ5IElhbiBUYXlsb3IuCi0KLVZNUyBjb21tYW5kIHNjcmlwdHMgKG1ha2UtZ2FzLmNvbSwgY29uZmlnLWdhcy5jb20pIGhhdmUgYmVlbiB3b3JrZWQgb24gYSBiaXQsCi1iYXNlZCBvbiBtYWlsIHJlY2VpdmVkIGZyb20gdmFyaW91cyBwZW9wbGUuICBUaGUgYC1oIycgb3B0aW9uIHNob3VsZCB3b3JrIGFnYWluCi10b28uCi0KLUhQLVBBIHdvcmssIGJ5IEplZmYgTGF3LiAgTm90ZSwgZm9yIHRoZSBQQSwgZ2FzLTIuMyBoYXMgYmVlbiBkZXNpZ25lZCB0byB3b3JrCi13aXRoIGdkYi00LjEyIGFuZCBnY2MtMi42LiAgQXMgZ2NjLTIuNiBoYXMgbm90IGJlZW4gcmVsZWFzZWQgeWV0LCBhIHNwZWNpYWwKLXZlcnNpb24gb2YgZ2NjLTIuNS44IGhhcyBiZWVuIHBhdGNoZWQgdG8gd29yayB3aXRoIGdhcy0yLjMuICBZb3UgY2FuIHJldHJpZXZlCi10aGlzIHNwZWNpYWwgdmVyc2lvbiBvZiBnY2MtMi41LjggdmlhIGFub255bW91cyBmdHAgZnJvbSBqYWd1YXIuY3MudXRhaC5lZHUKLWluIHRoZSAiZGlzdCIgZGlyZWN0b3J5LgotCi1WYXggc3VwcG9ydCBpbiBnYXMgZml4ZWQgZm9yIEJTRCwgc28gaXQgYnVpbGRzIGFuZCBzZWVtcyB0byBydW4gYSBjb3VwbGUgc2ltcGxlCi10ZXN0cyBva2F5LiAgSSBoYXZlbid0IHB1dCBpdCB0aHJvdWdoIGV4dGVuc2l2ZSB0ZXN0aW5nLiAgKEdOVSBtYWtlIGlzCi1jdXJyZW50bHkgcmVxdWlyZWQgZm9yIEJTRCA0LjMgYnVpbGRzLikKLQotU3VwcG9ydCBmb3IgdGhlIERFQyBBbHBoYSwgcnVubmluZyBPU0YvMSAoRUNPRkYgZm9ybWF0KS4gIFRoZSBnYXMgc3VwcG9ydCBpcwotYmFzZWQgb24gY29kZSBkb25hdGVkIGJ5IENNVSwgd2hpY2ggdXNlZCBhbiBhLm91dC1iYXNlZCBmb3JtYXQuICBJJ20gYWZyYWlkIHRoZQotYWxwaGEtYS5vdXQgc3VwcG9ydCBpcyBwcmV0dHkgYmFkbHkgbWFuZ2xlZCwgYW5kIG11Y2ggb2YgaXQgcmVtb3ZlZDsgbWFraW5nIGl0Ci13b3JrIHdpbGwgcmVxdWlyZSByZXdyaXRpbmcgaXQgYXMgQkZEIHN1cHBvcnQgZm9yIHRoZSBmb3JtYXQgYW55d2F5cy4KLQotSXJpeCA1IHN1cHBvcnQuCi0KLVRoZSB0ZXN0IHN1aXRlcyBoYXZlIGJlZW4gZml4ZWQgdXAgYSBiaXQsIHNvIHRoYXQgdGhleSBzaG91bGQgd29yayB3aXRoIGEKLWNvdXBsZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgZXhwZWN0IGFuZCBkZWphZ251LgotCi1TeW1ib2xzJyB2YWx1ZXMgYXJlIG5vdyBoYW5kbGVkIGludGVybmFsbHkgYXMgZXhwcmVzc2lvbnMsIHBlcm1pdHRpbmcgbW9yZQotZmxleGliaWxpdHkgaW4gZXZhbHVhdGluZyB0aGVtIGluIHNvbWUgY2FzZXMuICBTb21lIGRldGFpbHMgb2YgcmVsb2NhdGlvbgotaGFuZGxpbmcgaGF2ZSBhbHNvIGNoYW5nZWQsIGFuZCBzaW1wbGUgY29uc3RhbnQgcG9vbCBtYW5hZ2VtZW50IGhhcyBiZWVuIGFkZGVkLAotdG8gbWFrZSB0aGUgQWxwaGEgcG9ydCBlYXNpZXIuCi0KLU5ldyBvcHRpb24gIi0tc3RhdGlzdGljcyIgZm9yIHByaW50aW5nIG91dCBwcm9ncmFtIHJ1biB0aW1lcy4gIFRoaXMgaXMgaW50ZW5kZWQKLXRvIGJlIHVzZWQgd2l0aCB0aGUgZ2NjICItUSIgb3B0aW9uLCB3aGljaCBwcmludHMgb3V0IHRpbWVzIHNwZW50IGluIHZhcmlvdXMKLXBoYXNlcyBvZiBjb21waWxhdGlvbi4gIChZb3Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBvZiB0aGVtIHByaW50ZWQgb3V0IHdpdGgKLSJnY2MgLVEgLVdhLC0tc3RhdGlzdGljcyIsIEkgdGhpbmsuKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMi4yOgotCi1SUy82MDAwIEFJWCBhbmQgTUlQUyBTR0kgSXJpeCA1IHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuCi0KLUNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHN0aWxsIGluIGRldmVsb3BtZW50IChhbmQgdGhlcmVmb3JlIGFyZSBjb252ZW5pZW50IHRvCi1oYXZlIGxpc3RlZCBpbiBjb25maWd1cmUuaW4pIHN0aWxsIGdldCByZWplY3RlZCB3aXRob3V0IGEgbWlub3IgY2hhbmdlIHRvCi1nYXMvTWFrZWZpbGUuaW4sIHNvIHBlb3BsZSBub3QgZG9pbmcgZGV2ZWxvcG1lbnQgd29yayBzaG91bGRuJ3QgZ2V0IHRoZQotaW1wcmVzc2lvbiB0aGF0IHN1cHBvcnQgZm9yIHN1Y2ggY29uZmlndXJhdGlvbnMgaXMgYWN0dWFsbHkgYmVsaWV2ZWQgdG8gYmUKLXJlbGlhYmxlLgotCi1UaGUgcHJvZ3JhbSBuYW1lICh1c3VhbGx5ICJhcyIpIGlzIHByaW50ZWQgd2hlbiBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgaXMKLWRpc3BsYXllZC4gIFRoaXMgc2hvdWxkIHByZXZlbnQgc29tZSBjb25mdXNpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiBvY2Nhc2lvbmFsCi1tZXNzYWdlcyBhYm91dCAiaW50ZXJuYWwgZXJyb3JzIi4KLQotRUxGIHN1cHBvcnQgaXMgZmFsbGluZyBpbnRvIHBsYWNlLiAgU3VwcG9ydCBmb3IgdGhlIDM4NiBzaG91bGQgYmUgd29ya2luZy4KLVN1cHBvcnQgZm9yIFNQQVJDIFNvbGFyaXMgaXMgaW4uICBIUFBBIHN1cHBvcnQgZnJvbSBVdGFoIGlzIGJlaW5nIGludGVncmF0ZWQuCi0KLVN5bWJvbCB2YWx1ZXMgYXJlIG1haW50YWluZWQgYXMgZXhwcmVzc2lvbnMgaW5zdGVhZCBvZiBiZWluZyBpbW1lZGlhdGVseSBib2lsZWQKLWRvd24gdG8gYWRkLXN5bWJvbCwgc3ViLXN5bWJvbCwgYW5kIGNvbnN0YW50LiAgVGhpcyBwZXJtaXRzIHNsaWdodGx5IG1vcmUKLWNvbXBsZXggY2FsY3VsYXRpb25zIGludm9sdmluZyBzeW1ib2xzIHdob3NlIHZhbHVlcyBhcmUgbm90IGFscmVhZGV5IGtub3duLgotCi1EQlgtc3R5bGUgZGVidWdnaW5nIGluZm8gKCJzdGFicyIpIGlzIG5vdyBzdXBwb3J0ZWQgZm9yIENPRkYgZm9ybWF0cy4KLUlmIGFueSBzdGFicyBkaXJlY3RpdmVzIGFyZSBzZWVuIGluIHRoZSBzb3VyY2UsIEdBUyB3aWxsIGNyZWF0ZSB0d28gbmV3Ci1zZWN0aW9uczogYSAiLnN0YWIiIGFuZCBhICIuc3RhYnN0ciIgc2VjdGlvbi4gIFRoZSBmb3JtYXQgb2YgdGhlIC5zdGFiCi1zZWN0aW9uIGlzIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIGEub3V0IHN5bWJvbCBmb3JtYXQsIGFuZCAuc3RhYnN0ciBpcwotaXRzIHN0cmluZyB0YWJsZS4gIEZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgeW91IG11c3QgaGF2ZSBjb25maWd1cmVkIEdDQwotdG8gZ2VuZXJhdGUgc3RhYnMgKGJ5IGRlZmluaW5nIERCWF9ERUJVR0dJTkdfSU5GTyksIGFuZCBtdXN0IGhhdmUgYSBHREIKLXRoYXQgY2FuIHVzZSB0aGUgc3RhYiBzZWN0aW9ucyAoNC4xMSBvciBsYXRlcikuCi0KLUx5bnhPUywgb24gaTM4NiBhbmQgbTY4ayBwbGF0Zm9ybXMsIGlzIG5vdyBzdXBwb3J0ZWQuICBTUEFSQyBMeW54T1MKLXN1cHBvcnQgaXMgaW4gcHJvZ3Jlc3MuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAyLjE6Ci0KLVNldmVyYWwgc21hbGwgZml4ZXMgZm9yIGkzODYtYWl4IChQUy8yKSBzdXBwb3J0IGZyb20gTWluaCBUcmFuLUxlIGhhdmUgYmVlbgotaW5jb3Jwb3JhdGVkLCBidXQgbm90IHdlbGwgdGVzdGVkIHlldC4KLQotQWx0ZXJlZCB0aGUgb3Bjb2RlIHRhYmxlIHNwbGl0IGZvciBtNjhrOyBpdCBzaG91bGQgcmVxdWlyZSBsZXNzIFZNIHRvIGNvbXBpbGUKLXdpdGggZ2NjIG5vdy4KLQotU29tZSBtaW5vciBhZGp1c3RtZW50cyB0byBhZGQgKENvbnZlcmdlbnQgVGVjaG5vbG9naWVzJykgTWluaWZyYW1lIHN1cHBvcnQsCi1zdWdnZXN0ZWQgYnkgUm9uYWxkIENvbGUuCi0KLUhQUEEgc3VwcG9ydCAocnVubmluZyBPU0Ygb25seSwgbm90IEhQVVgpIGhhcyBiZWVuIGNvbnRyaWJ1dGVkIGJ5IFV0YWguICBUaGlzCi1pbmNsdWRlcyBpbXByb3ZlZCBFTEYgc3VwcG9ydCwgd2hpY2ggSSd2ZSBzdGFydGVkIGFkYXB0aW5nIGZvciBTUEFSQyBTb2xhcmlzCi0yLnguICBJbnRlZ3JhdGlvbiBpc24ndCBjb21wbGV0ZWx5LCBzbyBpdCBwcm9iYWJseSB3b24ndCB3b3JrLgotCi1IUDkwMDAvMzAwIHN1cHBvcnQsIGRvbmF0ZWQgYnkgSFAsIGhhcyBiZWVuIG1lcmdlZCBpbi4KLQotSWFuIFRheWxvciBoYXMgZmluaXNoZWQgdGhlIE1JUFMgRUNPRkYgKFVsdHJpeCwgSXJpeCkgc3VwcG9ydC4KLQotQmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAoZS5nLiwgaHBwYS1ocHV4KS4KLQotVGVzdCBzdWl0ZSBmcmFtZXdvcmsgaXMgc3RhcnRpbmcgdG8gYmVjb21lIHJlYXNvbmFibGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAyLjA6Ci0KLU1vc3RseSBidWcgZml4ZXMuCi0KLVNvbWUgbW9yZSBtZXJnaW5nIG9mIEJGRCBhbmQgRUxGIGNvZGUsIGJ1dCBFTEYgc3RpbGwgZG9lc24ndCB3b3JrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMS45NDoKLQotQkZEIG1lcmdlIGlzIHBhcnRseSBkb25lLiAgQWR2ZW50dXJvdXMgc291bHMgbWF5IHRyeSBnaXZpbmcgY29uZmlndXJlIHRoZQotIi0td2l0aC1iZmQtYXNzZW1ibGVyIiBvcHRpb24uICBDdXJyZW50bHksIEVMRiBmb3JtYXQgcmVxdWlyZXMgaXQsIGEub3V0IGZvcm1hdAotYWNjZXB0cyBpdDsgU1BBUkMgQ1BVIGFjY2VwdHMgaXQuICBJdCdzIHRoZSBkZWZhdWx0IG9ubHkgZm9yIE9TICJlbGYiIG9yCi0ic29sYXJpcyIuICAoRUxGIGlzbid0IHJlYWxseSBzdXBwb3J0ZWQgeWV0LiAgSXQgbmVlZHMgd29yay4gIEkndmUgZ290IHNvbWUKLWNvZGUgZnJvbSBVdGFoIGZvciBIUC1QQSBFTEYsIGFuZCBmcm9tIERHIGZvciBtODhrIEVMRiwgYnV0IHRoZXkncmUgbm90IGZ1bGx5Ci1tZXJnZWQgeWV0LikKLQotVGhlIDY4SyBvcGNvZGUgdGFibGUgaGFzIGJlZW4gc3BsaXQgaW4gaGFsZi4gIEl0IHNob3VsZCBub3cgY29tcGlsZSB1bmRlciBnY2MKLXdpdGhvdXQgY29uc3VtaW5nIHJpZGljdWxvdXMgYW1vdW50cyBvZiBtZW1vcnkuCi0KLUEgY291cGxlIGRhdGEgc3RydWN0dXJlcyBoYXZlIGJlZW4gcmVkdWNlZCBpbiBzaXplLiAgVGhpcyBzaG91bGQgcmVzdWx0IGluCi1zYXZpbmcgYSBsaXR0bGUgYml0IG9mIHNwYWNlIGF0IHJ1bnRpbWUuCi0KLVN1cHBvcnQgZm9yIE1JUFMsIGZyb20gT1NGIGFuZCBSYWxwaCBDYW1wYmVsbCwgaGFzIGJlZW4gbWVyZ2VkIGluLiAgVGhlIE9TRgotY29kZSBwcm92aWRlZCBST1NFIGZvcm1hdCBzdXBwb3J0LCB3aGljaCBJIGhhdmVuJ3QgbWVyZ2VkIGluIHlldC4gIChJIGNhbiBtYWtlCi1pdCBhdmFpbGFibGUsIGlmIGFueW9uZSB3YW50cyB0byB0cnkgaXQgb3V0LikgIFJhbHBoJ3MgY29kZSwgZm9yIEJTRCA0LjQsCi1zdXBwb3J0cyBhLm91dCBmb3JtYXQuICBXZSBkb24ndCBoYXZlIEVDT0ZGIHN1cHBvcnQgaW4ganVzdCB5ZXQ7IGl0J3MgY29taW5nLgotCi1TdXBwb3J0IGZvciB0aGUgSGl0YWNoaSBIOC81MDAgaGFzIGJlZW4gYWRkZWQuCi0KLVZNUyBob3N0IGFuZCB0YXJnZXQgc3VwcG9ydCBzaG91bGQgYmUgd29ya2luZyBub3csIHRoYW5rcyBjaGllZmx5IHRvIEVyaWMKLVlvdW5nZGFsZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DaGFuZ2VzIGluIDEuOTMuMDE6Ci0KLUZvciBtNjhrLCBzdXBwb3J0IGZvciBtb3JlIHByb2Nlc3NvcnMgaGFzIGJlZW4gYWRkZWQ6IDY4MDQwLCBDUFUzMiwgNjg4NTEuCi0KLUZvciBpMzg2LCAuYWxpZ24gaXMgbm93IHBvd2VyLW9mLXR3bzsgd2FzIG51bWJlci1vZi1ieXRlcy4KLQotRm9yIG02OGssICIlIiBpcyBub3cgYWNjZXB0ZWQgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzLiAgRm9yIENPRkYgZm9ybWF0LCB3aGljaAotZG9lc24ndCB1c2UgdW5kZXJzY29yZSBwcmVmaXhlcyBmb3IgQyBsYWJlbHMsIGl0IGlzIHJlcXVpcmVkLCBzbyB2YXJpYWJsZSAiYTAiCi1jYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSByZWdpc3Rlci4KLQotTGFzdCBwdWJsaWMgcmVsZWFzZSB3YXMgMS4zOC4gIExvdHMgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHNpbmNlIHRoZW4sIGxvdHMKLW9mIG5ldyBDUFVzIGFuZCBmb3JtYXRzLCBsb3RzIG9mIGJ1Z3MgZml4ZWQuCi0KLQwKLUxvY2FsIHZhcmlhYmxlczoKLWZpbGwtY29sdW1uOiA3OQotRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL1JFQURNRSBiL2dhcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzI3ZGIuLjAwMDAwMDAKLS0tIGEvZ2FzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0JCVJFQURNRSBmb3IgR0FTCi0KLUEgbnVtYmVyIG9mIHRoaW5ncyBoYXZlIGNoYW5nZWQgc2luY2UgdmVyc2lvbiAxIGFuZCB0aGUgd29uZGVyZnVsIHdvcmxkIG9mIGdhcwotbG9va3MgdmVyeSBkaWZmZXJlbnQuICBUaGVyZSdzIHN0aWxsIGEgbG90IG9mIGlycmVsZXZhbnQgZ2FyYmFnZSBseWluZyBhcm91bmQKLXRoYXQgd2lsbCBiZSBjbGVhbmVkIHVwIGluIHRpbWUuICBEb2N1bWVudGF0aW9uIGlzIHNjYXJjZSwgYXMgYXJlIGxvZ3Mgb2YgdGhlCi1jaGFuZ2VzIG1hZGUgc2luY2UgdGhlIGxhc3QgZ2FzIHJlbGVhc2UuICBNeSBhcG9sb2dpZXMsIGFuZCBJJ2xsIHRyeSB0byBnZXQKLXNvbWV0aGluZyB1c2VmdWwuCi0KLVVucGFja2luZyBhbmQgSW5zdGFsbGF0aW9uIC0gU3VtbWFyeQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSAuLi9iaW51dGlscy9SRUFETUUuCi0KLVRvIGJ1aWxkIGp1c3QgdGhlIGFzc2VtYmxlciwgbWFrZSB0aGUgdGFyZ2V0IGFsbC1nYXMuCi0KLURvY3VtZW50YXRpb24KLT09PT09PT09PT09PT0KLQotVGhlIEdBUyByZWxlYXNlIGluY2x1ZGVzIHRleGluZm8gc291cmNlIGZvciBpdHMgbWFudWFsLCB3aGljaCBjYW4gYmUgcHJvY2Vzc2VkCi1pbnRvIGBpbmZvJyBvciBgZHZpJyBmb3Jtcy4KLQotVGhlIERWSSBmb3JtIGlzIHN1aXRhYmxlIGZvciBwcmludGluZyBvciBkaXNwbGF5aW5nOyB0aGUgY29tbWFuZHMgZm9yIGRvaW5nCi10aGlzIHZhcnkgZnJvbSBzeXN0ZW0gdG8gc3lzdGVtLiAgT24gbWFueSBzeXN0ZW1zLCBgbHByIC1kJyB3aWxsIHByaW50IGEgRFZJCi1maWxlLiAgT24gb3RoZXJzLCB5b3UgbWF5IG5lZWQgdG8gcnVuIGEgcHJvZ3JhbSBzdWNoIGFzIGBkdmlwcycgdG8gY29udmVydCB0aGUKLURWSSBmaWxlIGludG8gYSBmb3JtIHlvdXIgc3lzdGVtIGNhbiBwcmludC4KLQotSWYgeW91IHdpc2ggdG8gYnVpbGQgdGhlIERWSSBmaWxlLCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgVGVYIGluc3RhbGxlZCBvbiB5b3VyCi1zeXN0ZW0uICBZb3UgY2FuIHJlYnVpbGQgaXQgYnkgdHlwaW5nOgotCi0JY2QgZ2FzL2RvYwotCW1ha2UgYXMuZHZpCi0KLVRoZSBJbmZvIGZvcm0gaXMgdmlld2FibGUgd2l0aCB0aGUgR05VIEVtYWNzIGBpbmZvJyBzdWJzeXN0ZW0sIG9yIHRoZQotc3RhbmRhbG9uZSBgaW5mbycgcHJvZ3JhbSwgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIEdOVSBUZXhpbmZvIGRpc3RyaWJ1dGlvbi4KLVRvIGJ1aWxkIHRoZSBpbmZvIGZpbGVzLCB5b3Ugd2lsbCBuZWVkIHRoZSBgbWFrZWluZm8nIHByb2dyYW0uICBUeXBlOgotCi0JY2QgZ2FzL2RvYwotCW1ha2UgaW5mbwotCi1TcGVjaWZ5aW5nIG5hbWVzIGZvciBob3N0cyBhbmQgdGFyZ2V0cwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgVGhlIHNwZWNpZmljYXRpb25zIHVzZWQgZm9yIGhvc3RzIGFuZCB0YXJnZXRzIGluIHRoZSBgY29uZmlndXJlJwotc2NyaXB0IGFyZSBiYXNlZCBvbiBhIHRocmVlLXBhcnQgbmFtaW5nIHNjaGVtZSwgYnV0IHNvbWUgc2hvcnQKLXByZWRlZmluZWQgYWxpYXNlcyBhcmUgYWxzbyBzdXBwb3J0ZWQuICBUaGUgZnVsbCBuYW1pbmcgc2NoZW1lIGVuY29kZXMKLXRocmVlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZm9sbG93aW5nIHBhdHRlcm46Ci0KLSAgICAgQVJDSElURUNUVVJFLVZFTkRPUi1PUwotCi0gICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzIGBzdW40JyBhcyBhIEhPU1QgYXJndW1lbnQgb3IgaW4gYQotYC0tdGFyZ2V0PVRBUkdFVCcgb3B0aW9uLiAgVGhlIGVxdWl2YWxlbnQgZnVsbCBuYW1lIGlzCi1gc3BhcmMtc3VuLXN1bm9zNCcuCi0KLSAgIFRoZSBgY29uZmlndXJlJyBzY3JpcHQgYWNjb21wYW55aW5nIEdBUyBkb2VzIG5vdCBwcm92aWRlIGFueSBxdWVyeQotZmFjaWxpdHkgdG8gbGlzdCBhbGwgc3VwcG9ydGVkIGhvc3QgYW5kIHRhcmdldCBuYW1lcyBvciBhbGlhc2VzLiAKLWBjb25maWd1cmUnIGNhbGxzIHRoZSBCb3VybmUgc2hlbGwgc2NyaXB0IGBjb25maWcuc3ViJyB0byBtYXAKLWFiYnJldmlhdGlvbnMgdG8gZnVsbCBuYW1lczsgeW91IGNhbiByZWFkIHRoZSBzY3JpcHQsIGlmIHlvdSB3aXNoLCBvcgoteW91IGNhbiB1c2UgaXQgdG8gdGVzdCB5b3VyIGd1ZXNzZXMgb24gYWJicmV2aWF0aW9ucy0tZm9yIGV4YW1wbGU6Ci0KLSAgICAgJSBzaCBjb25maWcuc3ViIHN1bjQKLSAgICAgc3BhcmMtc3VuLXN1bm9zNDExCi0gICAgICUgc2ggY29uZmlnLnN1YiBzdW4zCi0gICAgIG02OGstc3VuLXN1bm9zNDExCi0gICAgICUgc2ggY29uZmlnLnN1YiBkZWNzdGF0aW9uCi0gICAgIG1pcHMtZGVjLXVsdHJpeDQyCi0gICAgICUgc2ggY29uZmlnLnN1YiBocDMwMGJzZAotICAgICBtNjhrLWhwLWJzZAotICAgICAlIHNoIGNvbmZpZy5zdWIgaTM4NnYKLSAgICAgaTM4Ni11bmtub3duLXN5c3YKLSAgICAgJSBzaCBjb25maWcuc3ViIGk3ODZ2Ci0gICAgIEludmFsaWQgY29uZmlndXJhdGlvbiBgaTc4NnYnOiBtYWNoaW5lIGBpNzg2dicgbm90IHJlY29nbml6ZWQKLQotCi1gY29uZmlndXJlJyBvcHRpb25zCi09PT09PT09PT09PT09PT09PT09Ci0KLSAgIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGFuZCBhcmd1bWVudHMgdGhhdCBhcmUKLW1vc3Qgb2Z0ZW4gdXNlZnVsIGZvciBidWlsZGluZyBHQVMuICBgY29uZmlndXJlJyBhbHNvIGhhcyBzZXZlcmFsIG90aGVyCi1vcHRpb25zIG5vdCBsaXN0ZWQgaGVyZS4KLQotICAgICBjb25maWd1cmUgWy0taGVscF0KLSAgICAgICAgICAgICAgIFstLXByZWZpeD1ESVJdCi0gICAgICAgICAgICAgICBbLS1zcmNkaXI9UEFUSF0KLSAgICAgICAgICAgICAgIFstLWhvc3Q9SE9TVF0KLSAgICAgICAgICAgICAgIFstLXRhcmdldD1UQVJHRVRdCi0gICAgICAgICAgICAgICBbLS13aXRoLU9QVElPTl0KLSAgICAgICAgICAgICAgIFstLWVuYWJsZS1PUFRJT05dCi0KLVlvdSBtYXkgaW50cm9kdWNlIG9wdGlvbnMgd2l0aCBhIHNpbmdsZSBgLScgcmF0aGVyIHRoYW4gYC0tJyBpZiB5b3UKLXByZWZlcjsgYnV0IHlvdSBtYXkgYWJicmV2aWF0ZSBvcHRpb24gbmFtZXMgaWYgeW91IHVzZSBgLS0nLgotCi1gLS1oZWxwJwotICAgICBQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gYGNvbmZpZ3VyZScsIGFuZCBleGl0LgotCi1gLXByZWZpeD1ESVInCi0gICAgIENvbmZpZ3VyZSB0aGUgc291cmNlIHRvIGluc3RhbGwgcHJvZ3JhbXMgYW5kIGZpbGVzIHVuZGVyIGRpcmVjdG9yeQotICAgICBgRElSJy4KLQotYC0tc3JjZGlyPVBBVEgnCi0gICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKLSAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgotCi1gLS1ob3N0PUhPU1QnCi0gICAgIENvbmZpZ3VyZSBHQVMgdG8gcnVuIG9uIHRoZSBzcGVjaWZpZWQgSE9TVC4gIE5vcm1hbGx5IHRoZQotICAgICBjb25maWd1cmUgc2NyaXB0IGNhbiBmaWd1cmUgdGhpcyBvdXQgYXV0b21hdGljYWxseS4KLQotICAgICBUaGVyZSBpcyBubyBjb252ZW5pZW50IHdheSB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZQotICAgICBob3N0cy4KLQotYC0tdGFyZ2V0PVRBUkdFVCcKLSAgICAgQ29uZmlndXJlIEdBUyBmb3IgY3Jvc3MtYXNzZW1ibGluZyBwcm9ncmFtcyBmb3IgdGhlIHNwZWNpZmllZAotICAgICBUQVJHRVQuICBXaXRob3V0IHRoaXMgb3B0aW9uLCBHQVMgaXMgY29uZmlndXJlZCB0byBhc3NlbWJsZSAubyBmaWxlcwotICAgICB0aGF0IHJ1biBvbiB0aGUgc2FtZSBtYWNoaW5lIChIT1NUKSBhcyBHQVMgaXRzZWxmLgotCi0gICAgIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlCi0gICAgIHRhcmdldHMuCi0KLWAtLWVuYWJsZS1PUFRJT04nCi0gICAgIFRoZXNlIGZsYWdzIHRlbGwgdGhlIHByb2dyYW0gb3IgbGlicmFyeSBiZWluZyBjb25maWd1cmVkIHRvIAotICAgICBjb25maWd1cmUgaXRzZWxmIGRpZmZlcmVudGx5IGZyb20gdGhlIGRlZmF1bHQgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICAgaG9zdC90YXJnZXQgY29tYmluYXRpb24uICBTZWUgYmVsb3cgZm9yIGEgbGlzdCBvZiBgLS1lbmFibGUnCi0gICAgIG9wdGlvbnMgcmVjb2duaXplZCBpbiB0aGUgZ2FzIGRpc3RyaWJ1dGlvbi4KLQotYGNvbmZpZ3VyZScgYWNjZXB0cyBvdGhlciBvcHRpb25zLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNvbmZpZ3VyaW5nCi1vdGhlciBHTlUgdG9vbHMgcmVjdXJzaXZlbHk7IGJ1dCB0aGVzZSBhcmUgdGhlIG9ubHkgb3B0aW9ucyB0aGF0IGFmZmVjdAotR0FTIG9yIGl0cyBzdXBwb3J0aW5nIGxpYnJhcmllcy4KLQotVGhlIGAtLWVuYWJsZScgb3B0aW9ucyByZWNvZ25pemVkIGJ5IHNvZnR3YXJlIGluIHRoZSBnYXMgZGlzdHJpYnV0aW9uIGFyZToKLQotYC0tZW5hYmxlLXRhcmdldHM9Li4uJwotICAgICBUaGlzIGNhdXNlcyBvbmUgb3IgbW9yZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbnMgdG8gYmUgYWRkZWQgdG8gdGhvc2UgZm9yCi0gICAgIHdoaWNoIEJGRCBzdXBwb3J0IGlzIGNvbXBpbGVkLiAgQ3VycmVudGx5IGdhcyBjYW5ub3QgdXNlIGFueSBmb3JtYXQgb3RoZXIKLSAgICAgdGhhbiBpdHMgY29tcGlsZWQtaW4gZGVmYXVsdCwgc28gdGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsLgotCi1gLS1lbmFibGUtYmZkLWFzc2VtYmxlcicKLSAgICAgVGhpcyBjYXVzZXMgdGhlIGFzc2VtYmxlciB0byB1c2UgdGhlIG5ldyBjb2RlIGJlaW5nIG1lcmdlZCBpbnRvIGl0IHRvIHVzZQotICAgICBCRkQgZGF0YSBzdHJ1Y3R1cmVzIGludGVybmFsbHksIGFuZCB1c2UgQkZEIGZvciB3cml0aW5nIG9iamVjdCBmaWxlcy4KLSAgICAgRm9yIG1vc3QgdGFyZ2V0cywgdGhpcyBpc24ndCBzdXBwb3J0ZWQgeWV0LiAgRm9yIG1vc3QgdGFyZ2V0cyB3aGVyZSBpdCBoYXMKLSAgICAgYmVlbiBkb25lLCBpdCdzIGFscmVhZHkgdGhlIGRlZmF1bHQuICBTbyBnZW5lcmFsbHkgeW91IHdvbid0IG5lZWQgdG8gdXNlCi0gICAgIHRoaXMgb3B0aW9uLgotCi1TdXBwb3J0ZWQgcGxhdGZvcm1zCi09PT09PT09PT09PT09PT09PT09Ci0KLUF0IHRoaXMgcG9pbnQgSSBiZWxpZXZlIGdhcyB0byBiZSBhbnNpIG9ubHkgY29kZSBmb3IgbW9zdCB0YXJnZXQgY3B1J3MuICBUaGF0Ci1pcywgdGhlcmUgc2hvdWxkIGJlIHJlbGF0aXZlbHkgZmV3LCBpZiBhbnkgaG9zdCBzeXN0ZW0gZGVwZW5kZW5jaWVzLiAgU28KLXBvcnRpbmcgKGFzIGEgY3Jvc3MtYXNzZW1ibGVyKSB0byBob3N0cyBub3QgeWV0IHN1cHBvcnRlZCBzaG91bGQgYmUgZmFpcmx5Ci1lYXN5LiAgUG9ydGluZyB0byBhIG5ldyB0YXJnZXQgc2hvdWxkbid0IGJlIHRvbyB0b3VnaCBpZiBpdCdzIGEgdmFyaWFudCBvZiBvbmUKLWFscmVhZHkgc3VwcG9ydGVkLgotCi1OYXRpdmUgYXNzZW1ibGluZyBzaG91bGQgd29yayBvbjoKLQotCXN1bjMKLQlzdW40Ci0JMzg2YnNkCi0JYnNkLzM4NgotCWRlbHRhIChtNjhrLXN5c3YgZnJvbSBNb3Rvcm9sYSkKLQlkZWx0YTg4IChtODhrLXN5c3YgZnJvbSBNb3Rvcm9sYSkKLQlHTlUvbGludXgKLQltNjhrIGhwdXggOC4wIChocHV4IDcuMCBtYXkgYmUgYSBwcm9ibGVtKQotCXZheCBic2QsIHVsdHJpeCwgdm1zCi0JaHA5MDAwczMwMAotCWRlY3N0YXRpb24KLQlpcml4IDQKLQlpcml4IDUKLQltaW5pZnJhbWUgKG02OGstc3lzdiBmcm9tIENvbnZlcmdlbnQgVGVjaG5vbG9naWVzKQotCWkzODYtYWl4IChwcy8yKQotCWhwcGEgKGhwdXggNC4zYnNkLCBvc2YxKQotCUFJWAotCXVuaXh3YXJlCi0Jc2NvIDMuMnY0LjIKLQlzY28gb3BlbnNlcnZlciA1LjAgKGEuay5hLiAzLjJ2NS4wICkKLQlzcGFyYyBzb2xhcmlzCi0JbnMzMmsgKG5ldGJzZCwgbGl0ZXMpCi0KLUkgYmVsaWV2ZSB0aGF0IGdhcyBhcyBhIGNyb3NzLWFzc2VtYmxlciBjYW4gY3VycmVudGx5IGJlIHRhcmdldHRlZCBmb3IKLW1vc3Qgb2YgdGhlIGFib3ZlIGhvc3RzLCBwbHVzCi0KLQlkZWNzdGF0aW9uLWJzZCAoYS5vdXQgZm9ybWF0LCB0byBiZSB1c2VkIGluIEJTRCA0LjQpCi0JZWJtb24yOWsKLQlnbzMyIChET1Mgb24gaTM4Niwgd2l0aCBESkdQUCAtLSBvbGQgYS5vdXQgdmVyc2lvbikKLQloOC8zMDAsIGg4LzUwMCAoSGl0YWNoaSkKLQlpMzg2LWFpeCAocHMvMikKLQlpOTYwLWNvZmYKLQltaXBzIGVjb2ZmIChkZWNzdGF0aW9uLXVsdHJpeCwgaXJpcywgbWlwcyBtYWdudW0sIG1pcHMtaWR0LWVjb2ZmKQotCU1pdHN1YmlzaGkgZDEwdiBhbmQgZDMwdgotCW5pbmR5OTYwCi0JcG93ZXJwYyBFQUJJCi0JU0ggKEhpdGFjaGkpCi0Jc2NvMzg2Ci0JVEkgdGljMzAgYW5kIHRpYzgwCi0JdmF4IGJzZCBvciB1bHRyaXg/Ci0Jdm1zCi0Jdnh3b3JrczY4awotCXZ4d29ya3M5NjAKLQl6ODAwMCAoWmlsb2cpCi0KLU1JUFMgRUNPRkYgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZCwgYnV0IEdBUyB3aWxsIG5vdCBydW4gYSBDLXN0eWxlCi1wcmVwcm9jZXNzb3IuICBJZiB5b3Ugd2FudCB0aGF0LCByZW5hbWUgeW91ciBmaWxlIHRvIGhhdmUgYSAiLlMiIHN1ZmZpeCwgYW5kCi1ydW4gZ2NjIG9uIGl0LiAgT3IgcnVuICJnY2MgLXhhc3NlbWJsZXItd2l0aC1jcHAgZm9vLnMiLgotCi1TdXBwb3J0IGZvciBFTEYgc2hvdWxkIHdvcmsgbm93IGZvciBzcGFyYywgaHBwYSwgaTM4NiwgYWxwaGEsIG02OGssCi1NSVBTLCBwb3dlcnBjLgotCi1TdXBwb3J0IGZvciBzZXF1ZW50IChuczMyayksIHRhaG9lLCBpODYwLCBtODhrIG1heSBiZSBzdWZmZXJpbmcgZnJvbSBiaXRyb3QuCi0KLUlmIHlvdSB0cnkgb3V0IGdhcyBvbiBzb21lIGhvc3Qgb3IgdGFyZ2V0IG5vdCBsaXN0ZWQgYWJvdmUsIHBsZWFzZSBsZXQgbWUga25vdwotdGhlIHJlc3VsdHMsIHNvIEkgY2FuIHVwZGF0ZSB0aGUgbGlzdC4KLQotQ29tcGlsZXIgU3VwcG9ydCBIYWNrcwotPT09PT09PT09PT09PT09PT09PT09PQotCi1PbiBhIGZldyB0YXJnZXRzLCB0aGUgYXNzZW1ibGVyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHN1cHBvcnQgYSBmZWF0dXJlCi10aGF0IGlzIHBvdGVudGlhbGx5IHVzZWZ1bCB3aGVuIGFzc2VtYmxpbmcgY29tcGlsZXIgb3V0cHV0LCBidXQgd2hpY2gKLW1heSBjb25mdXNlIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1tZXJzLiAgSWYgYXNzZW1ibGVyIGVuY291bnRlcnMgYQotLndvcmQgcHNldWRvLW9wIG9mIHRoZSBmb3JtIHN5bWJvbDEtc3ltYm9sMiAodGhlIGRpZmZlcmVuY2Ugb2YgdHdvCi1zeW1ib2xzKSwgYW5kIHRoZSBkaWZmZXJlbmNlIG9mIHRob3NlIHR3byBzeW1ib2xzIHdpbGwgbm90IGZpdCBpbiAxNgotYml0cywgdGhlIGFzc2VtYmxlciB3aWxsIGNyZWF0ZSBhIGJyYW5jaCBhcm91bmQgYSBsb25nIGp1bXAgdG8KLXN5bWJvbDEsIGFuZCBpbnNlcnQgdGhpcyBpbnRvIHRoZSBvdXRwdXQgZGlyZWN0bHkgYmVmb3JlIHRoZSBuZXh0Ci1sYWJlbDogVGhlIC53b3JkIHdpbGwgKGluc3RlYWQgb2YgY29udGFpbmluZyBnYXJiYWdlLCBvciBnaXZpbmcgYW4KLWVycm9yIG1lc3NhZ2UpIGNvbnRhaW4gKHRoZSBhZGRyZXNzIG9mIHRoZSBsb25nIGp1bXApLXN5bWJvbDIuICBUaGlzCi1hbGxvd3MgdGhlIGFzc2VtYmxlciB0byBhc3NlbWJsZSBqdW1wIHRhYmxlcyB0aGF0IGp1bXAgdG8gbG9jYXRpb25zCi12ZXJ5IGZhciBhd2F5IGludG8gY29kZSB0aGF0IHdvcmtzIHByb3Blcmx5LiAgSWYgdGhlIG5leHQgbGFiZWwgaXMKLW1vcmUgdGhhbiAzMksgYXdheSBmcm9tIHRoZSAud29yZCwgeW91IGxvc2UgKHNpbGVudGx5KTsgUk1TIGNsYWltcwotdGhpcyB3aWxsIG5ldmVyIGhhcHBlbi4gIElmIHRoZSAtSyBvcHRpb24gaXMgZ2l2ZW4sIHlvdSB3aWxsIGdldCBhCi13YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGlzIGhhcHBlbnMuCi0KLQotUkVQT1JUSU5HIEJVR1MgSU4gR0FTCi09PT09PT09PT09PT09PT09PT09PT0KLQotQnVncyBpbiBnYXMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZy4gIFRoZXkgbWF5IGJlCi1jcm9zcy1wb3N0ZWQgdG8gYnVnLWdjYyBpZiB0aGV5IGFmZmVjdCB0aGUgdXNlIG9mIGdhcyB3aXRoIGdjYy4gIFRoZXkKLXNob3VsZCBub3QgYmUgcmVwb3J0ZWQganVzdCB0byBidWctZ2NjLCBzaW5jZSBJIGRvbid0IHJlYWQgdGhhdCBsaXN0LAotYW5kIHRoZXJlZm9yZSB3b3VsZG4ndCBzZWUgdGhlbS4KLQotSWYgeW91IHJlcG9ydCBhIGJ1ZyBpbiBHQVMsIHBsZWFzZSByZW1lbWJlciB0byBpbmNsdWRlOgotCi1BIGRlc2NyaXB0aW9uIG9mIGV4YWN0bHkgd2hhdCB3ZW50IHdyb25nLCBhbmQgZXhhY3RseSB3aGF0IHNob3VsZCBoYXZlCi1oYXBwZW5lZCBpbnN0ZWFkLgotCi1UaGUgdHlwZSBvZiBtYWNoaW5lIChWQVgsIDY4MDIwLCBldGMpIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChCU0QsIFN1bk9TLCBEWU5JWCwKLVZNUywgZXRjKSBHQVMgd2FzIHJ1bm5pbmcgb24uCi0KLVRoZSBjb25maWd1cmF0aW9uIG5hbWUocykgZ2l2ZW4gdG8gdGhlICJjb25maWd1cmUiIHNjcmlwdC4gIFRoZQotImNvbmZpZy5zdGF0dXMiIGZpbGUgc2hvdWxkIGhhdmUgdGhpcyBpbmZvcm1hdGlvbi4KLQotVGhlIG9wdGlvbnMgZ2l2ZW4gdG8gR0FTIGF0IHJ1biB0aW1lLgotCi1UaGUgYWN0dWFsIGlucHV0IGZpbGUgdGhhdCBjYXVzZWQgdGhlIHByb2JsZW0uCi0KLUl0IGlzIHNpbGx5IHRvIHJlcG9ydCBhIGJ1ZyBpbiBHQVMgd2l0aG91dCBpbmNsdWRpbmcgYW4gaW5wdXQgZmlsZSBmb3IgR0FTLgotRG9uJ3QgYXNrIHVzIHRvIGdlbmVyYXRlIHRoZSBmaWxlIGp1c3QgYmVjYXVzZSB5b3UgbWFkZSBpdCBmcm9tIGZpbGVzIHlvdQotdGhpbmsgd2UgaGF2ZSBhY2Nlc3MgdG8uCi0KLTEuIFlvdSBtaWdodCBiZSBtaXN0YWtlbi4KLTIuIEl0IG1pZ2h0IHRha2UgdXMgYSBsb3Qgb2YgdGltZSB0byBpbnN0YWxsIHRoaW5ncyB0byByZWdlbmVyYXRlIHRoYXQgZmlsZS4KLTMuIFdlIG1pZ2h0IGdldCBhIGRpZmZlcmVudCBmaWxlIGZyb20gdGhlIG9uZSB5b3UgZ290LCBhbmQgbWlnaHQgbm90IHNlZSBhbnkKLSAgIGJ1Zy4KLQotVG8gc2F2ZSB1cyB0aGVzZSBkZWxheXMgYW5kIHVuY2VydGFpbnRpZXMsIGFsd2F5cyBzZW5kIHRoZSBpbnB1dCBmaWxlIGZvciB0aGUKLXByb2dyYW0gdGhhdCBmYWlsZWQuICBBIHNtYWxsZXIgdGVzdCBjYXNlIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBwcm9ibGVtIGlzIG9mCi1jb3Vyc2UgcHJlZmVyYWJsZSwgYnV0IGJlIHN1cmUgaXQgaXMgYSBjb21wbGV0ZSBpbnB1dCBmaWxlLCBhbmQgdGhhdCBpdCByZWFsbHkKLWRvZXMgZGVtb25zdHJhdGUgdGhlIHByb2JsZW07IGJ1dCBpZiBwYXJpbmcgaXQgZG93biB3b3VsZCBjYXVzZSBsYXJnZSBkZWxheXMKLWluIGZpbGluZyB0aGUgYnVnIHJlcG9ydCwgZG9uJ3QgYm90aGVyLgotCi1JZiB0aGUgaW5wdXQgZmlsZSBpcyB2ZXJ5IGxhcmdlLCBhbmQgeW91IGFyZSBvbiB0aGUgaW50ZXJuZXQsIHlvdSBtYXkgd2FudCB0bwotbWFrZSBpdCBhdmFsaWFibGUgZm9yIGFub255bW91cyBGVFAgaW5zdGVhZCBvZiBtYWlsaW5nIGl0LiAgSWYgeW91IGRvLCBpbmNsdWRlCi1pbnN0cnVjdGlvbnMgZm9yIEZUUCdpbmcgaXQgaW4geW91ciBidWcgcmVwb3J0LgotCi1JZiB5b3UgZXhwZWN0IHRvIGJlIGNvbnRyaWJ1dGluZyBhIGxhcmdlIG51bWJlciBvZiB0ZXN0IGNhc2VzLCBpdCB3b3VsZCBiZQotaGVscGZ1bCBpZiB5b3Ugd291bGQgbG9vayBhdCB0aGUgdGVzdCBzdWl0ZSBpbmNsdWRlZCBpbiB0aGUgcmVsZWFzZSAoYmFzZWQgb24KLXRoZSBEZWphIEdudSB0ZXN0aW5nIGZyYW1ld29yaywgYXZhaWxhYmxlIGZyb20gdGhlIHVzdWFsIGZ0cCBzaXRlcykgYW5kIHdyaXRlCi10ZXN0IGNhc2VzIHRvIGZpdCBpbnRvIHRoYXQgZnJhbWV3b3JrLiAgVGhpcyBpcyBjZXJ0YWlubHkgbm90IHJlcXVpcmVkLgpkaWZmIC0tZ2l0IGEvZ2FzL1JFQURNRS12bXMgYi9nYXMvUkVBRE1FLXZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2YzYwMy4uMDAwMDAwMAotLS0gYS9nYXMvUkVBRE1FLXZtcworKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0JVGhpcyBkb2N1bWVudCBleHBsYWlucyBhIGNvdXBsZSBvZiB0aGluZ3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gVk1TLgotVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gImNoYXB0ZXJzIiwgdGhlIGZpcnN0IGRlYWxzIHdpdGggY3Jvc3MtYXNzZW1ibHkgCi1pc3N1ZXMsIGFuZCB0aGUgc2Vjb25kIGRlYWxzIHdpdGggdGhlIFZNUyBkZWJ1Z2dlciBhbmQgR05VLUNDLgotCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKiogTm90ZXMgZm9yIENyb3NzIEFzc2VtYmx5IHdpdGggVk1TICoqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUlmIHlvdSB3aXNoIHRvIGJ1aWxkIGdhcyBvbiBhIG5vbi1WTVMgc3lzdGVtIHRvIGNyb3NzLWFzc2VtYmxlLCAKLXlvdSBzaG91bGQgdXNlOgotCi1jb25maWd1cmUgJHtob3N0dHlwZX0gLXRhcmdldD12bXMKLQotYW5kIHRoZW4gZm9sbG93IHRoZSB1c3VhbCBwcm9jZWR1cmUuICBUaGUgb2JqZWN0IGZpbGVzIGdlbmVyYXRlZCBvbgotVW5peCB3aWxsIGJlIGNvcnJlY3QgZnJvbSBhIGJpbmFyeSBwb2ludCBvZiB2aWV3LCBidXQgdGhlIHJlYWwgdHJpY2sgaXMKLWdldHRpbmcgdGhlbSB0byB0aGUgVk1TIG1hY2hpbmUuICBUaGUgZm9ybWF0IG9mIHRoZSBvYmplY3QgZmlsZSBpcwotYSB2YXJpYWJsZS1sZW5ndGggcmVjb3JkLCBidXQgZWFjaCByZWNvcmQgY29udGFpbnMgYmluYXJ5IGRhdGEuICBnYXMKLXdyaXRlcyB0aGUgcmVjb3JkcyBpbiB0aGUgc2FtZSBmb3JtYXQgdGhhdCBWTVMgd291bGQgZXhwZWN0LAotbmFtZWx5IGEgdHdvLWJ5dGUgY291bnQgZm9sbG93ZWQgYnkgdGhhdCBudW1iZXIgb2YgYnl0ZXMuCi0KLQlJZiB5b3UgdHJ5IHRvIGNvcHkgdGhlIGZpbGUgdG8gYSBWTVMgc3lzdGVtIHVzaW5nIGZ0cCwgdGhlIGZ0cAotcHJvdG9jb2wgd2lsbCBzY3JldyB1cCB0aGUgZmlsZSBieSBsb29raW5nIGZvciBudWxscyAocmVjb3JkIHRlcm1pbmF0b3IgZm9yCi11bml4KSBhbmQgaXQgd2lsbCBpbnNlcnQgaXQncyBvd24gcmVjb3JkIHRlcm1pbmF0b3JzIGF0IHRoYXQgcG9pbnQuICBUaGlzCi13aWxsIG9idmlvdXNseSBjb3JydXB0IHRoZSBmaWxlLiAKLQotCUlmIHlvdSB0cnkgdG8gdHJhbnNmZXIgdGhlIGZpbGUgd2l0aCBmdHAgaW4gYmluYXJ5IG1vZGUsIHRoZQotZmlsZSBpdHNlbGYgd2lsbCBub3QgYmUgY29ycnVwdCwgYnV0IFZNUyB3aWxsIHRoaW5rIHRoYXQgdGhlIGZpbGUgY29udGFpbnMKLWZpeGVkLWxlbmd0aCByZWNvcmRzIG9mIDUxMiBieXRlcy4gIFlvdSBjYW4gdXNlIHRoZSBwdWJsaWMtZG9tYWluIEZJTEUgCi11dGlsaXR5IHRvIGNoYW5nZSB0aGlzIHdpdGggYSBjb21tYW5kIGxpa2U6Ci0KLSRGSUxFIGZvby5vL3R5cGU9dmFyaWFibGUKLQotSWYgeW91IGRvIG5vdCBoYXZlIHRoaXMgdXRpbGl0eSBhdmFpbGFibGUsIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjYW4gYmUgCi11c2VkIHRvIHBlcmZvcm0gdGhpcyB0YXNrOgotCi0JI2luY2x1ZGUgPGZhYi5oPgotCQotCSNkZWZpbmUgUk1FJENfU0VUUkZNIDEKLQkgCi0Jc3RydWN0IEZBQiAqIGZhYjsKLQkKLQltYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKXsKLQkJaW50IGksIHN0YXR1czsKLQkJZmFiID0gKHN0cnVjdCBGQUIqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBGQUIpKTsKLQkJKmZhYiA9IGNjJHJtc19mYWI7CS8qIGluaXRpYWxpemUgRkFCKi8KLQkJZmFiLT5mYWIkYl9mYWMgPSBGQUIkTV9QVVQ7Ci0JCWZhYi0+ZmFiJGxfZm9wIHw9IEZBQiRNX0VTQzsKLQkJZmFiLT5mYWIkbF9jdHggPSBSTUUkQ19TRVRSRk07Ci0JCWZhYi0+ZmFiJHdfaWZpID0gMDsKLQkJZm9yKGk9MTtpPGFyZ2M7aSsrKXsKLQkJICBwcmludGYoIlNldHRpbmcgJXMgdG8gdmFyaWFibGUgbGVuZ3RoIHJlY29yZHMuXG4iLGFyZ3ZbaV0pOwotCQkgIGZhYi0+ZmFiJGxfZm5hID0gYXJndltpXTsKLQkgICAgICAgCSAgZmFiLT5mYWIkYl9mbnMgPSBzdHJsZW4oYXJndltpXSk7Ci0JCSAgc3RhdHVzID0gc3lzJG9wZW4oZmFiLDAsMCk7Ci0JCSAgaWYoKHN0YXR1cyAmIDcpICE9IDEpIGxpYiRzaWduYWwoc3RhdHVzKTsKLQkJICBmYWItPmZhYiRiX3JmbSA9IEZBQiRDX1ZBUjsKLQkJICBzdGF0dXMgPSBzeXMkbW9kaWZ5KGZhYiwwLDApOwotCQkgIGlmKChzdGF0dXMgJiA3KSAhPSAxKSBsaWIkc2lnbmFsKHN0YXR1cyk7Ci0JCSAgc3RhdHVzID0gc3lzJGNsb3NlKGZhYiwwLDApOwotCQkgIGlmKChzdGF0dXMgJiA3KSAhPSAxKSBsaWIkc2lnbmFsKHN0YXR1cyk7Ci0JCX07Ci0JfQotCi0JSWYgeW91IGhhdmUgTkZTIHJ1bm5pbmcgb24gdGhlIFZNUyBzeXN0ZW0sIHdoYXQgeW91IG5lZWQgdG8gZG8KLWRlcGVuZHMgdXBvbiB3aGljaCBORlMgc29mdHdhcmUgeW91IGFyZSBydW5uaW5nIG9uIHRoZSBWTVMgc3lzdGVtLiAgVGhlcmUKLWFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgVENQL0lQIHBhY2thZ2VzIGZvciBWTVMgYXZhaWxhYmxlLCBhbmQgb25seSB2ZXJ5Ci1saW1pdGVkIHRlc3RpbmcgaGFzIGJlZW4gcGVyZm9ybWVkLiAgIEluIHRoZSB0ZXN0cyB0aGF0IGhhcyBiZWVuIGRvbmUgc28KLWZhciwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHdpbGwgYWx3YXlzIGJlIGNvcnJlY3Qgd2hlbiB0cmFuc2ZlcnJpbmcgdGhlCi1maWxlIHZpYSBORlMsIGJ1dCB0aGUgcmVjb3JkIGF0dHJpYnV0ZXMgbWF5IG9yIG1heSBub3QgYmUgY29ycmVjdC4gCi0KLQlPbmUgcHJvcHJpZXRhcnkgVENQL0lQL05GUyBwYWNrYWdlIGZvciBWTVMgaXMga25vd24gdG8gCi1hdXRvbWF0aWNhbGx5IGZpeCB0aGUgcmVjb3JkIGF0dHJpYnV0ZXMgb2YgdGhlIG9iamVjdCBmaWxlIGlmIHlvdSBORlMgbW91bnQKLWEgdW5peCBkaXNrIGZyb20gdGhlIFZNUyBzeXN0ZW0sIGFuZCBpZiB0aGUgZmlsZSBoYXMgYSAiLm9iaiIgZXh0ZW5zaW9uIG9uCi10aGUgdW5peCBzeXN0ZW0uICBPdGhlciBUQ1AvSVAgcGFja2FnZXMgbWlnaHQgZG8gdGhpcyBmb3IgeW91IGFzIHdlbGwsIGJ1dAotdGhleSBoYXZlIG5vdCBiZWVuIGNoZWNrZWQuCi0KLU5vIG1hdHRlciB3aGF0IG1ldGhvZCB5b3UgdXNlIHRvIGdldCB0aGUgZmlsZSB0byB0aGUgVk1TIHN5c3RlbSwgaXQgaXMKLWFsd2F5cyBhIGdvb2QgaWRlYSB0byBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyB0aGUgY29ycmVjdCB0eXBlIGJ5Ci1kb2luZyBhICIkZGlyL2Z1bGwiIG9uIHRoZSBvYmplY3QgZmlsZS4gVGhlIGRlc2lyZWQgcmVjb3JkIGF0dHJpYnV0ZXMgd2lsbAotYmUgIk5vbmUiLiAgVW5kZXNpcmFibGUgcmVjb3JkIGF0dHJpYnV0ZXMgd2lsbCBiZSAiU3RyZWFtLUxGIiBvciBhbnl0aGluZwotZWxzZS4gCi0KLU9uY2UgeW91IGdldCB0aGUgZmlsZXMgb24gdGhlIFZNUyBzeXN0ZW0sIHlvdSBjYW4gY2hlY2sgdGhlaXIgaW50ZWdyaXR5IAotd2l0aCB0aGUgIiRhbmFsL29iaiIgY29tbWFuZC4gIChOYXR1cmFsbHkgYXQgc29tZSBwb2ludCB5b3Ugc2hvdWxkIHJlbmFtZQotdGhlIC5vIGZpbGVzIHRvIC5vYmopLiAgQXMgZmFyIGFzIHRoZSBkZWJ1Z2dlciBpcyBjb25jZXJuZWQsIHRoZSByZWNvcmRzIAotd2lsbCBiZSBjb3JyZWN0LCBidXQgdGhlIGRlYnVnZ2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZCB0aGUgc291cmNlIGZpbGVzLAotc2luY2UgaXQgb25seSBoYXMgdGhlIGZpbGUgbmFtZSwgYW5kIG5vdCB0aGUgZnVsbCBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KLVlvdSBtdXN0IGdpdmUgdGhlIGRlYnVnZ2VyIHNvbWUgaGVscCBieSB0ZWxsaW5nIGl0IHdoaWNoIGRpcmVjdG9yaWVzIHRvIAotc2VhcmNoIGZvciB0aGUgaW5kaXZpZHVhbCBmaWxlcyAtIG9uY2UgeW91IGhhdmUgZG9uZSB0aGlzIHlvdSBzaG91bGQgYmUgCi1hYmxlIHRvIHByb2NlZWQgbm9ybWFsbHkuCi0KLQlJdCBpcyBhIGdvb2QgaWRlYSB0byB1c2UgbmFtZXMgZm9yIHlvdXIgZmlsZXMgd2hpY2ggd2lsbCBiZSB2YWxpZAotdW5kZXIgVk1TLCBzaW5jZSBvdGhlcndpc2UgeW91IHdpbGwgaGF2ZSBubyB3YXkgb2YgZ2V0dGluZyB0aGUgZGVidWdnZXIgdG8KLWZpbmQgdGhlIHNvdXJjZSBmaWxlIHdoZW4gZGV1Z2dpbmcuCi0KLVRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgb2JqZWN0IGZpbGUgbm9ybWFsbHkgY29udGlucyBzcGVjaWZpYwotaW5mb3JtYXRpb24gdGhhdCB0aGUgZGVidWdnZXIgY2FuIHVzZSB0byBwb3NpdGl2ZWx5IGlkZW50aWZ5IGEgZmlsZSwgYW5kIGlmCi15b3UgYXJlIGFzc2VtYmxpbmcgb24gYSB1bml4IHN5c3RlbSB0aGlzIGluZm9ybWF0aW9uIHNpbXBseSBkb2VzIG5vdCBleGlzdAotaW4gYSBtZWFuaW5nZnVsIHdheS4gIFlvdSBtdXN0IGhlbHAgdGhlIGRlYnVnZ2VyIGJ5IHVzaW5nIHRoZSAiU0VUIEZJTEU9IgotY29tbWFuZCB0byB0ZWxsIHRoZSBkZWJ1Z2dlciB3aGVyZSB0byBsb29rIGZvciBzb3VyY2UgZmlsZXMuIFRoZSBkZWJ1Z2dlcgotcmVjb3JkcyB3aWxsIGJlIGNvcnJlY3QsIGV4Y2VwdCB0aGF0IHRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBiZSBpbml0aWFsbHkKLWFibGUgdG8gZmluZCB0aGUgc291cmNlIGZpbGVzLiAgWW91IGNhbiB1c2UgdGhlICJTRVQgRklMRSIgY29tbWFuZCB0byB0ZWxsCi10aGUgZGVidWdnZXIgd2hlcmUgdG8gbG9vayBmb3IgdGhlIHNvdXJjZSBmaWxlcy4gCi0KLUkgaGF2ZSBvbmx5IHRlc3RlZCB0aGlzIHdpdGggYSBTVnI0IGk0ODYgbWFjaGluZSwgYW5kIGV2ZXJ5dGhpbmcgc2VlbXMgdG8KLXdvcmsgT0ssIHdpdGggdGhlIGxpbWl0ZWQgdGVzdGluZyB0aGF0IEkgaGF2ZSBkb25lLiAgT3RoZXIgbWFjaGluZXMgbWF5Ci1vciBtYXkgbm90IHdvcmsuICBZb3Ugc2hvdWxkIHJlYWQgdGhlIGNoYXB0ZXJzIG9uIGNyb3NzLWNvbXBpbGVycyBpbiB0aGUgZ2NjCi1tYW51YWwgYmVmb3JlIGZvb2xpbmcgd2l0aCB0aGlzLiAgU2luY2UgZ2FzIGRvZXMgbm90IG5lZWQgdG8gZG8gYW55IGZsb2F0aW5nCi1wb2ludCBhcml0aG1ldGljLCB0aGUgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIHRoYXQgYXJlIGdlbmVyYXRlZCBoZXJlIHNob3VsZAotYmUgY29ycmVjdCAtIHRoZSBvbmx5IGNvbmNlcm4gaXMgd2l0aCBjb25zdGFudCBmb2xkaW5nIGluIHRoZSBtYWluIGNvbXBpbGVyLgotVGhlIHJhbmdlIGFuZCBwcmVjaXNpb24gb2YgZmxvYXRzIGFuZCBkb3VibGVzIGFyZSBzaW1pbGFyIG9uIHRoZSA0ODYgKHdpdGggCi1hIGJ1aWx0aW4gODAzODcpIGFuZCB0aGUgVkFYLCBhbHRob3VnaCB0aGVyZSBpcyBhIGZhY3RvciBvZiAyIHRvIDQKLWRpZmZlcmVuY2UgaW4gdGhlIHJhbmdlLiAgVGhlIGRvdWJsZSwgYXMgaW1wbGVtZW50ZWQgb24gdGhlIDQ4NiwgaXMgcXVpdGUKLXNpbWlsYXIgdG8gdGhlIEdfRkxPQVQgb24gdGhlIFZBWC4gCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKiogTm90ZXMgZm9yIHVzaW5nIEdOVSBDQyB3aXRoIHRoZSBWTVMgZGVidWdnZXIqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCi0JMSkgWW91IHNob3VsZCBiZSBhd2FyZSB0aGF0IEdOVS1DLCBhcyB3aXRoIGFueSBvdGhlciBkZWNlbnQgY29tcGlsZXIsCi13aWxsIGRvIHRoaW5ncyB3aGVuIG9wdGltaXphdGlvbiBpcyB0dXJuZWQgb24gdGhhdCB5b3UgbWF5IG5vdCBleHBlY3QuIAotU29tZXRpbWVzIGludGVybWVkaWF0ZSByZXN1bHRzIGFyZSBub3Qgd3JpdHRlbiB0byB2YXJpYWJsZXMsIGlmIHRoZXkgYXJlIG9ubHkKLXVzZWQgaW4gb25lIHBsYWNlLCBhbmQgc29tZXRpbWVzIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBhdCBhbGwgd2lsbCBub3QgYmUKLXdyaXR0ZW4gdG8gdGhlIHN5bWJvbCB0YWJsZS4gIEFsc28sIHBhcmFtZXRlcnMgdG8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgb2Z0ZW4KLWluYWNjZXNzaWJsZS4gWW91IGNhbiBzZWUgdGhlIGFzc2VtYmx5IGNvZGUgZXF1aXZhbGVudCBieSB1c2luZyBLUDcgaW4gdGhlCi1kZWJ1Z2dlciwgYW5kIGZyb20gdGhpcyB5b3UgY2FuIHRlbGwgaWYgaW4gZmFjdCBhIHZhcmlhYmxlIHNob3VsZCBoYXZlIHRoZQotdmFsdWUgdGhhdCB5b3UgZXhwZWN0LiAgWW91IGNhbiBmaW5kIG91dCBpZiBhIHZhcmlhYmxlIGxpdmVzIHdpdGhpbmcgYSByZWdpc3RlcgotYnkgZG9pbmcgYSAnc2hvdyBzeW1ib2wvYWRkcicuCi0KLQkyKSBPdmVybHkgY29tcGxleCBkYXRhIHR5cGVzLCBzdWNoIGFzOgotCi1pbnQgKCooKigqKCooKigqIHNhcnI2KVsxXSlbMV0pWzJdKVszXSlbNF0pWzVdOwotCi13aWxsIG5vdCBiZSBkZWJ1Z2dlZCBwcm9wZXJseSwgc2luY2UgdGhlIGRlYnVnZ2luZyByZWNvcmQgb3ZlcmZsb3dzIGFuIGludGVybmFsCi1kZWJ1Z2dlciBidWZmZXIuICBnY2MtYXMgd2lsbCBjb252ZXJ0IHRoZXNlIHRvICp2b2lkIGFzIGZhciBhcyB0aGUgZGVidWdnZXIKLXN5bWJvbCB0YWJsZSBpcyBjb25jZXJuZWQsIHdoaWNoIHdpbGwgYXZvaWQgYW55IHByb2JsZW1zLCBhbmQgdGhlIGFzc2VtYmxlcgotd2lsbCBnaXZlIHlvdSBhIG1lc3NhZ2UgaW5mb3JtaW5nIHlvdSB0aGF0IHRoaXMgaGFzIGhhcHBlbmVkLgotCi0JMykgWW91IG11c3QsIG9mIGNvdXJzZSwgY29tcGlsZSBhbmQgbGluayB3aXRoIC9kZWJ1Zy4gIElmIHlvdSBsaW5rCi13aXRob3V0IGRlYnVnLCB5b3Ugc3RpbGwgZ2V0IHRyYWNlYmFjayB0YWJsZSBpbiB0aGUgZXhlY3V0YWJsZSwgYnV0IHRoZXJlIGlzIG5vCi1zeW1ib2wgdGFibGUgZm9yIHZhcmlhYmxlcy4KLQotCTQpIEluY2x1ZGVkIGluIHRoZSBwYXRjaGVzIHRvIFZNUy5DIGFyZSBmaXhlcyB0byB0d28gYnVncyB0aGF0IGFyZQotdW5yZWxhdGVkIHRvIHRoZSBjaGFuZ2VzIHRoYXQgSSBoYXZlIG1hZGUuICBPbmUgb2YgdGhlc2UgbWFkZSBpdCBpbXBvc3NpYmxlIHRvCi1kZWJ1ZyBzbWFsbCBwcm9ncmFtcyBzb21ldGltZXMsIGFuZCB0aGUgb3RoZXIgY2F1c2VkIHRoZSBkZWJ1Z2dlciB0byBiZWNvbWUKLWNvbmZ1c2VkIGFib3V0IHdoaWNoIHJvdXRpbmUgaXQgd2FzIGluLCBhbmQgZ2l2ZSB0aGlzIGluY29ycmVjdCBpbmZvIGluCi10cmFjZWJhY2tzLgotCi0JNSkgSWYgeW91IGFyZSB1c2luZyB0aGUgR05VLUMrKyBjb21waWxlciwgeW91IHNob3VsZCBtb2RpZnkgdGhlCi1jb21waWxlciBkcml2ZXIgZmlsZSBHTlVfQ0M6WzAwMDAwMF1HQ0MuQ09NIChvciBHWFguQ09NKS4gIElmIHlvdSBoYXZlIGEKLXNlcGVyYXRlIEdYWC5DT00sIHRoZW4geW91IG5lZWQgdG8gY2hhbmdlIG9uZSBsaW5lIGluIEdYWC5DT00gdG86Ci0kIGlmIGYkbG9jYXRlKCJEIixwMikgLm5lLiBQMl9MZW5ndGggdGhlbiBEZWJ1ZyA9ICIgIiItRzAiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGljZSB6ZXJvLS0tPiAgXgotSWYgeW91IGFyZSB1c2luZyBhIEdDQy5DT00gdGhhdCBkb2VzIGJvdGggQyBhbmQgQysrLCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0bwotR0NDLkNPTToKLQotJCEKLSQhIFVzZSBvbGQgc3R5bGUgZGVidWdnaW5nIHJlY29yZHMgZm9yIFZNUwotJCEKLSQgaWYgKERlYnVnLm5lcy4iIiApLmFuZC4gUGx1cyB0aGVuIERlYnVnID0gIiAiIi1HMCIiIgotCi1hZnRlciB0aGUgdmFyaWFibGVzIFBsdXMgYW5kIERlYnVnIGFyZSBzZXQuICBUaGUgcmVhc29uIGZvciB0aGlzLCBpcyB0aGF0IEMrKwotY29tcGlsZXIgYnkgZGVmYXVsdCBnZW5lcmF0ZXMgZGVidWdnaW5nIHJlY29yZHMgdGhhdCBhcmUgbW9yZSBjb21wbGV4LAotd2l0aCBtYW55IG5ldyBzeW50YWN0aWNhbCBlbGVtZW50cyB0aGF0IGFsbG93IGZvciB0aGUgbmV3IGZlYXR1cmVzIG9mIHRoZQotbGFuZ3VhZ2UuICBUaGUgLUcwIHN3aXRjaCB0ZWxscyB0aGUgQysrIGNvbXBpbGVyIHRvIHVzZSB0aGUgb2xkIHN0eWxlIGRlYnVnZ2luZwotcmVjb3Jkcy4gIFVudGlsIHRoZSBkZWJ1Z2dlciB1bmRlcnN0YW5kcyBDKysgdGhlcmUgaXMgbm90IGFueSBwb2ludCB0byB0cnkgYW5kCi11c2UgdGhlIGV4cGFuZGVkIHN5bnRheC4KLQotCTYpIFdoZW4geW91IGhhdmUgbmVzdGVkIHNjb3BlcywgaS5lLjoKLW1haW4oKXsKLQlpbnQgaTsKLQl7aW50IGk7Ci0JCXtpbnQgaTsKLX07fTt9Ci1hbmQgeW91IHNheSAiRVhBTSBpIiB0aGUgZGVidWdnZXIgbmVlZHMgdG8gZmlndXJlIG91dCB3aGljaCB2YXJpYWJsZSB5b3UKLWFjdHVhbGx5IHdhbnQgdG8gcmVmZXJlbmNlLiAgSSBoYXZlIGFycmFuZ2VkIHRoaW5ncyB0byBkZWZpbmUgYSBibG9jayB0byB0aGUKLWRlYnVnZ2VyIHdoZW4geW91IHVzZSBicmFja2V0cyB0byBlbnRlciBhIG5ldyBzY29wZSwgc28gaW4gdGhlIGV4YW1wbGUgYWJvdmUsCi10aGUgdmFyaWFibGVzIHdvdWxkIGJlIGRlc2NyaWJlZCBhczoKLVRFU1RcbWFpblxpCi1URVNUXG1haW5cJDBcaQotVEVTVFxtYWluXCQwXCQwXGkKLUF0IGVhY2ggbGV2ZWwsIHRoZSBibG9jayBuYW1lIGlzIGEgbnVtYmVyIHdpdGggYSBkb2xsYXIgc2lnbiBwcmVmaXgsIHRoZQotbnVtYmVycyBzdGFydCB3aXRoIDAgYW5kIGNvdW50IHVwd2FyZC4gIFdoZW4geW91IHNheSBFWEFNIGksIHRoZSBkZWJ1Z2dlciBsb29rcwotYXQgdGhlIGN1cnJlbnQgUEMsIGFuZCBkZWNpZGVzIHdoaWNoIGJsb2NrIGl0IGlzIGN1cnJlbnRseSBpbi4gIEl0IHdvcmtzIGZyb20KLXRoZSBpbm5lcm1vc3QgbGV2ZWwgb3V0d2FyZCB1bnRpbCBpdCBmaW5kcyBhIGJsb2NrIHRoYXQgaGFzIHRoZSB2YXJpYWJsZSAiaSIKLWRlZmluZWQuICBZb3UgY2FuIGFsd2F5cyBzcGVjaWZ5IHRoZSBzY29wZSBleHBsaWNpdGx5LgotCi0JNykgIFdpdGggQysrLCB0aGVyZSBjYW4gYmUgYSBsb3Qgb2YgaW5saW5lIGZ1bmN0aW9ucywgYW5kIGl0IHdvdWxkIGJlCi1yYXRoZXIgcmVzdHJpY3RpdmUgdG8gZm9yY2UgdGhlIHVzZXIgdG8gZGVidWcgdGhlIHByb2dyYW0gYnkgY29udmVydGluZyBhbGwgb2YKLXRoZSBpbmxpbmUgZnVuY3Rpb25zIHRvIG5vcm1hbCBmdW5jdGlvbnMuICBXaGF0IEkgaGF2ZSBkb25lIGlzIHRvIGVzc2VudGlhbGx5Ci0iYWRkIiAod2l0aCB0aGUgZGVidWdnZXIpIHNvdXJjZSBsaW5lcyBmcm9tIHRoZSBpbmNsdWRlIGZpbGVzIHRoYXQgY29udGFpbiB0aGUKLWlubGluZSBmdW5jdGlvbnMuICBUaHVzIHdoZW4geW91IHN0ZXAgaW50byBhbiBpbmxpbmUgZnVuY3Rpb24gaXQgYXBwZWFycyBhcyBpZgoteW91IGhhdmUgY2FsbGVkIHRoZSBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gZXhhbWluZSB2YXJpYWJsZXMgYW5kIHNvIGZvcnRoLiAKLVRoZXJlIGFyZSBzZXZlcmFsICp2ZXJ5KiBpbXBvcnRhbnQgZGlmZmVyZW5jZXMsIGhvd2V2ZXIuICBGaXJzdCBvZiBhbGwsIHNpbmNlCi10aGVyZSBpcyBubyBmdW5jdGlvbiBjYWxsIGludm9sdmVkLCB5b3UgY2Fubm90IHN0ZXAgb3ZlciB0aGUgaW5saW5lIGZ1bmN0aW9uCi1jYWxsIC0geW91IGFsd2F5cyBzdGVwIGludG8gaXQuIFNlY29uZGx5LCBzaW5jZSB0aGUgc2FtZSBzb3VyY2UgbGluZXMgYXJlIHVzZWQKLWluIG1hbnkgbG9jYXRpb25zLCB0aGVyZSBpcyBhIHNlcGVyYXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBmb3IgKmVhY2gqIHVzYWdlLiAKLVdpdGhvdXQgdGhpcywgYnJlYWtwb2ludHMgZG8gbm90IHdvcmssIHNpbmNlIHdlIG11c3QgaGF2ZSBhIDEtdG8tMSBtYXBwaW5nCi1iZXR3ZWVuIHNvdXJjZSBsaW5lcyBhbmQgUEMuCi0JU2luY2UgeW91IGNhbm5vdCBzdGVwIG92ZXIgaW5saW5lIGZ1bmN0aW9uIGNhbGxzLCBpdCBjYW4gYmUgYSByZWFsIHBhaW4KLWlmIHlvdSBhcmUgbm90IHJlYWxseSBpbnRlcmVzdGVkIGluIHdoYXQgaXMgZ29pbmcgb24gZm9yIHRoYXQgZnVuY3Rpb24gY2FsbC4KLVdoYXQgSSBoYXZlIGRvbmUgaXMgdG8gdXNlIHRoZSAiLUQiIHN3aXRjaCBmb3IgdGhlIGFzc2VtYmxlciB0byB0b2dnbGUgdGhlCi1mb2xsb3dpbmcgYmVoYXZpb3IuICBXaXRoIHRoZSAiLUQiIHN3aXRjaCwgYWxsIGlubGluZSBmdW5jdGlvbnMgYXJlIGluY2x1ZGVkIGluCi10aGUgb2JqZWN0IGZpbGUsIGFuZCB5b3UgY2FuIGRlYnVnIGV2ZXJ5dGhpbmcuICBXaXRob3V0IHRoZSAiLUQiIHN3aXRjaAotKGRlZmF1bHQgY2FzZSB3aXRoIFZNUyBpbXBsZW1lbnRhdGlvbiksIGlubGluZSBmdW5jdGlvbnMgYXJlIGluY2x1ZGVkICpvbmx5KiBpZgotdGhleSBkaWQgbm90IGNvbWUgZnJvbSBzeXN0ZW0gaGVhZGVyIGZpbGVzIChpLmUuIGZyb20gR05VX0NDX0lOQ0xVREU6IG9yCi1HTlVfR1hYX0lOQ0xVREU6KS4gIFRodXMsIHdpdGhvdXQgdGhlIHN3aXRjaCB0aGUgdXNlciBvbmx5IGRlYnVncyBoaXMvaGVyIG93bgotaW5saW5lIGZ1bmN0aW9ucywgYW5kIG5vdCB0aGUgc3lzdGVtIG9uZXMuIChUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSBkbwotYSBsb3Qgb2Ygc3RyZWFtIEkvTyBpbiBDKyspLiAgVGhpcyBwcm9iYWJseSB3aWxsIG5vdCBwcm92aWRlIGVub3VnaCBncmFudWxhcml0eQotZm9yIG1hbnkgdXNlcnMsIGJ1dCBmb3Igbm93IHRoaXMgaXMgc3RpbGwgc29tZXdoYXQgZXhwZXJpbWVudGFsLCBhbmQgSSB3b3VsZAotbGlrZSB0byByZWZsZWN0IHVwb24gaXQgYW5kIGdldCBzb21lIGZlZWRiYWNrIGJlZm9yZSBJIGdvIGFueSBmdXJ0aGVyLiAKLVBvc3NpYmxlIHNvbHV0aW9ucyBpbmNsdWRlIGFuIGludGVyYWN0aXZlIHByb21wdGluZywgYSBsb2dpY2FsIG5hbWUsIG9yIGEgbmV3Ci1jb21tYW5kIGxpbmUgb3B0aW9uIGluIGdjYy5jICh3aGljaCBpcyB0aGVuIHBhc3NlZCB0aHJvdWdoIHNvbWVob3cgdG8gdGhlIGd1dHMKLW9mIHRoZSBhc3NlbWJsZXIpLgotCVRoZSBpbmxpbmUgZnVuY3Rpb25zIGZyb20gaGVhZGVyIGZpbGVzIGFwcGVhciBhZnRlciB0aGUgc291cmNlIGNvZGUKLWZvciB0aGUgc291cmNlIGZpbGUuICBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGl0c2VsZiBpcwotbnVtYmVyZWQgd2l0aCB0aGUgc2FtZSBsaW5lIG51bWJlcnMgdGhhdCB5b3UgZ2V0IHdpdGggYW4gZWRpdG9yLiAgSW4gYWRkaXRpb24sCi10aGUgZW50aXJlIGhlYWRlciBmaWxlIGlzIG5vdCBpbmNsdWRlZCwgc2luY2UgdGhlIGFzc2VtYmxlciBtYWtlcyBhIGxpc3Qgb2YKLXRoZSBtaW4gYW5kIG1heCBzb3VyY2UgbGluZXMgdGhhdCBhcmUgdXNlZCwgYW5kIG9ubHkgaW5jbHVkZXMgdGhvc2UgbGluZXMgZnJvbQotdGhlIGZpcnN0IHRvIHRoZSBsYXN0IGFjdHVhbGx5IHVzZWQuIChJdCBpcyBlYXN5IHRvIGNoYW5nZSBpdCB0byBpbmNsdWRlIHRoZQotd2hvbGUgZmlsZSkuCi0KLQk4KSBXaGVuIHlvdSBhcmUgZGVidWdnaW5nIEMrKyBvYmplY3RzLCB0aGUgb2JqZWN0ICJ0aGlzIiBpcyByZWZlcmVkIHRvCi1hcyAiJHRoaXMiLiAgQWN0dWFsbHksIHRoZSBjb21waWxlciB3cml0ZXMgaXQgYXMgIi50aGlzIiwgYnV0IHRoZSBwZXJpb2QgaXMKLW5vdCBnb29kIGZvciB0aGUgZGVidWdnZXIsIHNvIEkgaGF2ZSBhIHJvdXRpbmUgdG8gY29udmVydCBpdCB0byBhICQuICAoSXQKLWFjdHVhbGx5IGNvbnZlcnRzIGFsbCBwZXJpb2RzIHRvICQsIGJ1dCBvbmx5IGZvciB2YXJpYWJsZXMsIHNpbmNlIHRoaXMgd2FzCi1pbnRlbmRlZCB0byBhbGxvdyB1cyB0byBhY2Nlc3MgInRoaXMiLgotCi0JOSkgSWYgeW91IHVzZSB0aGUgYXNtKCIuLi4iKSBrZXl3b3JkIGZvciBnbG9iYWwgc3ltYm9scywgeW91IHdpbGwgbm90Ci1iZSBhYmxlIHRvIHNlZSB0aGF0IHN5bWJvbCB3aXRoIHRoZSBkZWJ1Z2dlci4gIFRoZSByZWFzb24gaXMgdGhhdCB0aGVyZSBhcmUgdHdvCi1yZWNvcmRzIGZvciB0aGUgc3ltYm9sIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIG9mIHRoZSBhc3NlbWJsZXIuICBPbmUKLWNvbnRhaW5zIHRoZSBpbmZvIHN1Y2ggYXMgcHNlY3QgbnVtYmVyIGFuZCBvZmZzZXQsIGFuZCB0aGUgb3RoZXIgb25lIGNvbnRhaW5zCi10aGUgaW5mb3JtYXRpb24gaGF2aW5nIHRvIGRvIHdpdGggdGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFyaWFibGUuICBJbiBvcmRlciB0bwotZGVidWcgYXMgc3ltYm9sLCB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIGNvb3JlbGF0ZSB0aGVzZSByZWNvcmRzLCBhbmQgdGhlIG9ubHkKLXdheSB0byBkbyB0aGlzIGlzIGJ5IG5hbWUuICBUaGUgcmVjb3JkIHdpdGggdGhlIHN0b3JhZ2UgYXR0cmlidXRlcyB3aWxsIHRha2UKLXRoZSBuYW1lIHVzZWQgaW4gdGhlIGFzbSBkaXJlY3RpdmUsIGFuZCB0aGUgcmVjb3JkIHRoYXQgc3BlY2lmaWVzIHRoZSBkYXRhIHR5cGUKLWhhcyB0aGUgYWN0dWFsIHZhcmlhYmxlIG5hbWUsIGFuZCB0aHVzIHdoZW4geW91IHVzZSB0aGUgYXNtIGRpcmVjdGl2ZSB0byBjaGFuZ2UKLWEgdmFyaWFibGUgbmFtZSwgdGhlIHN5bWJvbCBiZWNvbWVzIGludmlzaWJsZS4KLQotCTEwKSBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIgKCBHTlUtQyAxLjM3LjkyIGFuZCBlYXJsaWVyKSBwbGFjZQotZ2xvYmFsIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdC4gIFRoaXMgaXMgdW5mb3J0dW5hdGUsIHNpbmNlIHRvIHRoZSBsaW5rZXIKLXRoaXMgYXBwZWFycyB0byBiZSBhbiBlbnRyeSBwb2ludC4gIEkgc2VudCBhIHBhdGNoIHRvIHRoZSBjb21waWxlciB0byBSTVMsCi13aGljaCB3aWxsIGdlbmVyYXRlIGEgLmNvbnN0IHNlY3Rpb24gZm9yIHRoZXNlIHZhcmlhYmxlcywgYW5kIHBhdGNoZWQgdGhlCi1hc3NlbWJsZXIgdG8gcHV0IHRoZXNlIHZhcmlhYmxlcyBpbnRvIGEgcHNlY3QganVzdCBsaWtlIHRoYXQgZm9yIG5vcm1hbAotdmFyaWFibGVzLCBleGNlcHQgdGhhdCB0aGV5IGFyZSBtYXJrZWQgTk9XUlQuICBzdGF0aWMgY29uc3RhbnRzIGFyZSBzdGlsbAotcGxhY2VkIGluIHRoZSB0ZXh0IHBzZWN0LCBzaW5jZSB0aGVyZSBpcyBubyBuZWVkIGZvciBhbnkgZXh0ZXJuYWwgYWNjZXNzLgpkaWZmIC0tZ2l0IGEvZ2FzL2FjaW5jbHVkZS5tNCBiL2dhcy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTJjMTYuLjAwMDAwMDAKLS0tIGEvZ2FzL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLWRubCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQobmFtZSwgdHlwZWRlZm5hbWUsIHR5cGVkZWYsIGhlYWRlcnMpCi1BQ19ERUZVTihHQVNfQ0hFQ0tfREVDTF9ORUVERUQsWwotQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yICQxKQotQUNfQ0FDSEVfVkFMKGdhc19jdl9kZWNsX25lZWRlZF8kMSwKLUFDX1RSWV9MSU5LKFskNF0sCi1bCi10eXBlZGVmICQzOwotJDIgeDsKLXggPSAoJDIpICQxOwotXSwgZ2FzX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKSlkbmwKLUFDX01TR19SRVNVTFQoJGdhc19jdl9kZWNsX25lZWRlZF8kMSkKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgotIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi1kbmwKLWRubCBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAotZG5sIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi1kbmwgd29ya2luZyBwcm9wZXJseSEKLWRubCBHQVNfV09SS0lOR19BU1NFUlQKLUFDX0RFRlVOKEdBU19XT1JLSU5HX0FTU0VSVCwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3b3JraW5nIGFzc2VydCBtYWNyb10pCi1BQ19DQUNIRV9WQUwoZ2FzX2N2X2Fzc2VydF9vaywKLUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD5dLCBbCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotXSwgZ2FzX2N2X2Fzc2VydF9vaz15ZXMsIGdhc19jdl9hc3NlcnRfb2s9bm8pKWRubAotQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2Fzc2VydF9vaykKLXRlc3QgJGdhc19jdl9hc3NlcnRfb2sgPSB5ZXMgfHwgQUNfREVGSU5FKEJST0tFTl9BU1NFUlQsIDEsIFthc3NlcnQgYnJva2VuP10pCi1dKWRubAotZG5sCi1kbmwgU2luY2UgbWFueSBCb3VybmUgc2hlbGwgaW1wbGVtZW50YXRpb25zIGxhY2sgc3Vicm91dGluZXMsIHVzZSB0aGlzCi1kbmwgaGFjayB0byBzaW1wbGlmeSB0aGUgY29kZSBpbiBjb25maWd1cmUuaW4uCi1kbmwgR0FTX1VOSVEobGlzdHZhcikKLUFDX0RFRlVOKEdBU19VTklRLAotW19nYXNfdW5pcV9saXN0PSJbJF0kMSIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1kbmwgUHJvdGVjdCBhZ2FpbnN0IGVtcHR5IGlucHV0IGxpc3QuCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15IFskXV9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSBbJF1fZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiBbJF1fZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgWyRdX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IlskXV9nYXNfdW5pcV9uZXdsaXN0IFskXV9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLSQxPVskXV9nYXNfdW5pcV9uZXdsaXN0Ci1dKWRubApkaWZmIC0tZ2l0IGEvZ2FzL2FjbG9jYWwubTQgYi9nYXMvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0Y2E4NC4uMDAwMDAwMAotLS0gYS9nYXMvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDk4MCArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotZG5sIEdBU19DSEVDS19ERUNMX05FRURFRChuYW1lLCB0eXBlZGVmbmFtZSwgdHlwZWRlZiwgaGVhZGVycykKLUFDX0RFRlVOKEdBU19DSEVDS19ERUNMX05FRURFRCxbCi1BQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgJDEpCi1BQ19DQUNIRV9WQUwoZ2FzX2N2X2RlY2xfbmVlZGVkXyQxLAotQUNfVFJZX0xJTksoWyQ0XSwKLVsKLXR5cGVkZWYgJDM7Ci0kMiB4OwoteCA9ICgkMikgJDE7Ci1dLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9bm8sIGdhc19jdl9kZWNsX25lZWRlZF8kMT15ZXMpKWRubAotQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2RlY2xfbmVlZGVkXyQxKQotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkXyQxID0geWVzOyB0aGVuCi0gQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICBbRGVmaW5lIGlmICQxIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLl0pCi1maQotXSlkbmwKLWRubAotZG5sIFNvbWUgbm9uLUFOU0kgcHJlcHJvY2Vzc29ycyBib3RjaCByZXF1b3RpbmcgaW5zaWRlIHN0cmluZ3MuICBUaGF0J3MgYmFkCi1kbmwgZW5vdWdoLCBidXQgb24gc29tZSBvZiB0aG9zZSBzeXN0ZW1zLCB0aGUgYXNzZXJ0IG1hY3JvIHJlbGllcyBvbiByZXF1b3RpbmcKLWRubCB3b3JraW5nIHByb3Blcmx5IQotZG5sIEdBU19XT1JLSU5HX0FTU0VSVAotQUNfREVGVU4oR0FTX1dPUktJTkdfQVNTRVJULAotW0FDX01TR19DSEVDS0lORyhbZm9yIHdvcmtpbmcgYXNzZXJ0IG1hY3JvXSkKLUFDX0NBQ0hFX1ZBTChnYXNfY3ZfYXNzZXJ0X29rLAotQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPl0sIFsKLS8qIGNoZWNrIGZvciByZXF1b3RpbmcgcHJvYmxlbXMgKi8KLXN0YXRpYyBpbnQgYSwgYiwgYywgZDsKLXN0YXRpYyBjaGFyICpzOwotYXNzZXJ0ICghc3RyY21wKHMsICJmb28gYmFyIGJheiBxdXV4IikpOwotLyogY2hlY2sgZm9yIG5ld2xpbmUgaGFuZGxpbmcgKi8KLWFzc2VydCAoYSA9PSBiCi0gICAgICAgIHx8IGMgPT0gZCk7Ci1dLCBnYXNfY3ZfYXNzZXJ0X29rPXllcywgZ2FzX2N2X2Fzc2VydF9vaz1ubykpZG5sCi1BQ19NU0dfUkVTVUxUKCRnYXNfY3ZfYXNzZXJ0X29rKQotdGVzdCAkZ2FzX2N2X2Fzc2VydF9vayA9IHllcyB8fCBBQ19ERUZJTkUoQlJPS0VOX0FTU0VSVCwgMSwgW2Fzc2VydCBicm9rZW4/XSkKLV0pZG5sCi1kbmwKLWRubCBTaW5jZSBtYW55IEJvdXJuZSBzaGVsbCBpbXBsZW1lbnRhdGlvbnMgbGFjayBzdWJyb3V0aW5lcywgdXNlIHRoaXMKLWRubCBoYWNrIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIGluIGNvbmZpZ3VyZS5pbi4KLWRubCBHQVNfVU5JUShsaXN0dmFyKQotQUNfREVGVU4oR0FTX1VOSVEsCi1bX2dhc191bmlxX2xpc3Q9IlskXSQxIgotX2dhc191bmlxX25ld2xpc3Q9IiIKLWRubCBQcm90ZWN0IGFnYWluc3QgZW1wdHkgaW5wdXQgbGlzdC4KLWZvciBfZ2FzX3VuaXFfaSBpbiBfZ2FzX3VuaXFfZHVtbXkgWyRdX2dhc191bmlxX2xpc3QgOyBkbwotICBjYXNlIFskXV9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiIFskXV9nYXNfdW5pcV9uZXdsaXN0ICIgaW4KLSAgICAgICAqIiBbJF1fZ2FzX3VuaXFfaSAiKikgOzsKLSAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iWyRdX2dhc191bmlxX25ld2xpc3QgWyRdX2dhc191bmlxX2kiIDs7Ci0gICAgIGVzYWMgOzsKLSAgZXNhYwotZG9uZQotJDE9WyRdX2dhc191bmlxX25ld2xpc3QKLV0pZG5sCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgNDAgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBMREZMQUdTPSIkTERGTEFHUyIgTElCUz0iJExJQlMiIFwKLUxOX1M9IiRMTl9TIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBPQkpEVU1QPSIkT0JKRFVNUCIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRsdF90YXJnZXQgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotY2FzZSAiJHRhcmdldCIgaW4KLU5PTkUpIGx0X3RhcmdldD0iJGhvc3QiIDs7Ci0qKSBsdF90YXJnZXQ9IiR0YXJnZXQiIDs7Ci1lc2FjCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX0RMT1BFTl0sCi1bbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIl0pCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtd2luMzItZGxsIl0pCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLSAgWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siID0geG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotdGVzdCB4IiRzaWxlbnQiID0geHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqKQotICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCi0gIDs7Ci1dKQotZXNhYwotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGVuYWJsZSBjaGVja3MgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSldKQotCi0jIEFDX0xJQlRPT0xfV0lOMzJfRExMIC0gZGVjbGFyZSBwYWNrYWdlIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpbjMyIGRsbCdzCi1BQ19ERUZVTihBQ19MSUJUT09MX1dJTjMyX0RMTCwgW0FDX0JFRk9SRShbJDBdLCBbQUNfTElCVE9PTF9TRVRVUF0pXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELCBbZG5sCi1kZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLCBbZG5sCi1kZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsIFtkbmwKLWRlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubSB8fCB0ZXN0IC1mICRhY19kaXIvbm0kYWNfZXhlZXh0IDsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotTElCTT0KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotYmVvcyogfCAqLSotY3lnd2luKikKLSAgIyBUaGVzZSBzeXN0ZW0gZG9uJ3QgaGF2ZSBsaWJtCi0gIDs7Ci0qLW5jci1zeXN2NC4zKikKLSAgQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCwgTElCTT0iLWxtdyIpCi0gIEFDX0NIRUNLX0xJQihtLCBtYWluLCBMSUJNPSIkTElCTSAtbG0iKQotICA7OwotKikKLSAgQUNfQ0hFQ0tfTElCKG0sIG1haW4sIExJQk09Ii1sbSIpCi0gIDs7Ci1lc2FjCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLSAgSU5DTFRETD1pZmVsc2UoJCMsMSwtSSQxLFsnLUkke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLAotICBbdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4eWVzICYmIGVuYWJsZV9sdGRsX2luc3RhbGw9bm9dLAotICBbaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHhubzsgdGhlbgotICAgICBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkKLSAgIGVsc2UKLSAgICAgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgIGZpCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4InllcyI7IHRoZW4KLSAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIKLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICAgIElOQ0xUREw9aWZlbHNlKCQjLDEsLUkkMSxbJy1JJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkKLSAgZWxzZQotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsPW5vIgotICAgIExJQkxUREw9Ii1sbHRkbCIKLSAgICBJTkNMVERMPQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotCi1kbmwgVGhpcyBpcyBqdXN0IHRvIHNpbGVuY2UgYWNsb2NhbCBhYm91dCB0aGUgbWFjcm8gbm90IGJlaW5nIHVzZWQKLWlmZWxzZShbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotCi1kbmwgQU1fUFJPR19MRVgKLWRubCBMb29rIGZvciBmbGV4LCBsZXggb3IgbWlzc2luZywgdGhlbiBydW4gQUNfUFJPR19MRVggYW5kIEFDX0RFQ0xfWVlURVhUCi1BQ19ERUZVTihBTV9QUk9HX0xFWCwKLVttaXNzaW5nX2Rpcj1pZmVsc2UoWyQxXSwsYGNkICRhY19hdXhfZGlyICYmIHB3ZGAsJDEpCi1BQ19DSEVDS19QUk9HUyhMRVgsIGZsZXggbGV4LCAiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIpCi1BQ19QUk9HX0xFWAotQUNfREVDTF9ZWVRFWFRdKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKLQkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKLQkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKE1BSU5UKWRubAotXQotKQotCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotCi1BQ19ERUZVTihBTV9DT05ESVRJT05BTCwKLVtBQ19TVUJTVCgkMV9UUlVFKQotQUNfU1VCU1QoJDFfRkFMU0UpCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maV0pCi0KZGlmZiAtLWdpdCBhL2dhcy9hcHAuYyBiL2dhcy9hcHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxM2U3NC4uMDAwMDAwMAotLS0gYS9nYXMvYXBwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA3ICswLDAgQEAKLS8qIFRoaXMgaXMgdGhlIEFzc2VtYmxlciBQcmUtUHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTW9kaWZpZWQgYnkgQWxsZW4gV2lyZnMtQnJvY2ssIEluc3RhbnRpYXRpb25zIEluYyAyLzkwICovCi0vKiBBcHAsIHRoZSBhc3NlbWJsZXIgcHJlLXByb2Nlc3Nvci4gIFRoaXMgcHJlLXByb2Nlc3NvciBzdHJpcHMgb3V0IGV4Y2VzcwotICAgc3BhY2VzLCB0dXJucyBzaW5nbGUtcXVvdGVkIGNoYXJhY3RlcnMgaW50byBhIGRlY2ltYWwgY29uc3RhbnQsIGFuZCB0dXJucwotICAgIyA8bnVtYmVyPiA8ZmlsZW5hbWU+IDxnYXJiYWdlPiBpbnRvIGEgLmxpbmUgPG51bWJlcj5cbi5maWxlIDxmaWxlbmFtZT4KLSAgIHBhaXIuICBUaGlzIG5lZWRzIGJldHRlciBlcnJvci1oYW5kbGluZy4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCQkJLyogRm9yIEJBRF9DQVNFKCkgb25seSAqLwotCi0jaWYgKF9fU1REQ19fICE9IDEpCi0jaWZuZGVmIGNvbnN0Ci0jZGVmaW5lIGNvbnN0ICAvKiBlbXB0eSAqLwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRDX002OEsKLS8qIFdoZXRoZXIgd2UgYXJlIHNjcnViYmluZyBpbiBtNjhrIE1SSSBtb2RlLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotICAgZmxhZ19tNjhrX21yaSwgYmVjYXVzZSB0aGUgdHdvIGZsYWdzIHdpbGwgYmUgYWZmZWN0ZWQgYnkgdGhlIC5tcmkKLSAgIHBzZXVkby1vcCBhdCBkaWZmZXJlbnQgdGltZXMuICAqLwotc3RhdGljIGludCBzY3J1Yl9tNjhrX21yaTsKLSNlbHNlCi0jZGVmaW5lIHNjcnViX202OGtfbXJpIDAKLSNlbmRpZgotCi0vKiBUaGUgcHNldWRvLW9wIHdoaWNoIHN3aXRjaGVzIGluIGFuZCBvdXQgb2YgTVJJIG1vZGUuICBTZWUgdGhlCi0gICBjb21tZW50IGluIGRvX3NjcnViX2NoYXJzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIG1yaV9wc2V1ZG9bXSA9ICIubXJpIDAiOwotCi0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0vKiBUaGUgcHNldWRvLW9wIGZvciB3aGljaCB3ZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSBgQCcgY2hhcmFjdGVycy4gCi0gICBTZWUgdGhlIGNvbW1lbnQgaW4gZG9fc2NydWJfY2hhcnMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgICBzeW12ZXJfcHNldWRvW10gPSAiLnN5bXZlciI7Ci1zdGF0aWMgY29uc3QgY2hhciAqIHN5bXZlcl9zdGF0ZTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciBsZXhbMjU2XTsKLXN0YXRpYyBjb25zdCBjaGFyIHN5bWJvbF9jaGFyc1tdID0KLSIkLl9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSI7Ci0KLSNkZWZpbmUgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQJCTEKLSNkZWZpbmUgTEVYX0lTX1dISVRFU1BBQ0UJCTIKLSNkZWZpbmUgTEVYX0lTX0xJTkVfU0VQQVJBVE9SCQkzCi0jZGVmaW5lIExFWF9JU19DT01NRU5UX1NUQVJUCQk0Ci0jZGVmaW5lIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQJNQotI2RlZmluZQlMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVAk2Ci0jZGVmaW5lCUxFWF9JU19TVFJJTkdRVU9URQkJOAotI2RlZmluZQlMRVhfSVNfQ09MT04JCQk5Ci0jZGVmaW5lCUxFWF9JU19ORVdMSU5FCQkJMTAKLSNkZWZpbmUJTEVYX0lTX09ORUNIQVJfUVVPVEUJCTExCi0jaWZkZWYgVENfVjg1MAotI2RlZmluZSBMRVhfSVNfRE9VQkxFREFTSF8xU1QJCTEyCi0jZW5kaWYKLSNpZmRlZiBUQ19NMzJSCi0jZGVmaW5lIERPVUJMRUJBUl9QQVJBTExFTAotI2VuZGlmCi0jaWZkZWYgRE9VQkxFQkFSX1BBUkFMTEVMCi0jZGVmaW5lIExFWF9JU19ET1VCTEVCQVJfMVNUCQkxMwotI2VuZGlmCi0jZGVmaW5lIElTX1NZTUJPTF9DT01QT05FTlQoYykJCShsZXhbY10gPT0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQpCi0jZGVmaW5lIElTX1dISVRFU1BBQ0UoYykJCShsZXhbY10gPT0gTEVYX0lTX1dISVRFU1BBQ0UpCi0jZGVmaW5lIElTX0xJTkVfU0VQQVJBVE9SKGMpCQkobGV4W2NdID09IExFWF9JU19MSU5FX1NFUEFSQVRPUikKLSNkZWZpbmUgSVNfQ09NTUVOVChjKQkJCShsZXhbY10gPT0gTEVYX0lTX0NPTU1FTlRfU1RBUlQpCi0jZGVmaW5lIElTX0xJTkVfQ09NTUVOVChjKQkJKGxleFtjXSA9PSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUKQotI2RlZmluZQlJU19ORVdMSU5FKGMpCQkJKGxleFtjXSA9PSBMRVhfSVNfTkVXTElORSkKLQotc3RhdGljIGludCBwcm9jZXNzX2VzY2FwZSBQQVJBTVMgKChpbnQpKTsKLQotLyogRklYTUUtc29vbjogVGhlIGVudGlyZSBsZXhlci9wYXJzZXIgdGhpbmd5IHNob3VsZCBiZQotICAgYnVpbHQgc3RhdGljYWxseSBhdCBjb21waWxlIHRpbWUgcmF0aGVyIHRoYW4gZHluYW1pY2FsbHkKLSAgIGVhY2ggYW5kIGV2ZXJ5IHRpbWUgdGhlIGFzc2VtYmxlciBpcyBydW4uICB4b3hvcmljaC4gKi8KLQotdm9pZCAKLWRvX3NjcnViX2JlZ2luIChtNjhrX21yaSkKLSAgICAgaW50IG02OGtfbXJpIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGludCBjOwotCi0gIGxleFsnICddID0gTEVYX0lTX1dISVRFU1BBQ0U7Ci0gIGxleFsnXHQnXSA9IExFWF9JU19XSElURVNQQUNFOwotICBsZXhbJ1xyJ10gPSBMRVhfSVNfV0hJVEVTUEFDRTsKLSAgbGV4WydcbiddID0gTEVYX0lTX05FV0xJTkU7Ci0gIGxleFsnOyddID0gTEVYX0lTX0xJTkVfU0VQQVJBVE9SOwotICBsZXhbJzonXSA9IExFWF9JU19DT0xPTjsKLQotI2lmZGVmIFRDX002OEsKLSAgc2NydWJfbTY4a19tcmkgPSBtNjhrX21yaTsKLQotICBpZiAoISBtNjhrX21yaSkKLSNlbmRpZgotICAgIHsKLSAgICAgIGxleFsnIiddID0gTEVYX0lTX1NUUklOR1FVT1RFOwotCi0jaWYgISBkZWZpbmVkIChUQ19IUFBBKSAmJiAhIGRlZmluZWQgKFRDX0kzNzApCi0gICAgICAvKiBJMzcwIHVzZXMgc2luZ2xlLXF1b3RlcyB0byBkZWxpbWl0IGludGVnZXIsIGZsb2F0IGNvbnN0YW50cyAqLwotICAgICAgbGV4WydcJyddID0gTEVYX0lTX09ORUNIQVJfUVVPVEU7Ci0jZW5kaWYKLQotI2lmZGVmIFNJTkdMRV9RVU9URV9TVFJJTkdTCi0gICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogTm90ZTogaWYgYW55IG90aGVyIGNoYXJhY3RlciBjYW4gYmUgTEVYX0lTX1NUUklOR1FVT1RFLCB0aGUgbG9vcAotICAgICBpbiBzdGF0ZSA1IG9mIGRvX3NjcnViX2NoYXJzIG11c3QgYmUgY2hhbmdlZC4gICovCi0KLSAgLyogTm90ZSB0aGF0IHRoZXNlIG92ZXJyaWRlIHRoZSBwcmV2aW91cyBkZWZhdWx0cywgZS5nLiBpZiAnOycgaXMgYQotICAgICBjb21tZW50IGNoYXIsIHRoZW4gaXQgaXNuJ3QgYSBsaW5lIHNlcGFyYXRvci4gICovCi0gIGZvciAocCA9IHN5bWJvbF9jaGFyczsgKnA7ICsrcCkKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotICAgIH0JCQkJLyogZGVjbGFyZSBzeW1ib2wgY2hhcmFjdGVycyAqLwotCi0gIGZvciAoYyA9IDEyODsgYyA8IDI1NjsgKytjKQotICAgIGxleFtjXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotCi0jaWZkZWYgdGNfc3ltYm9sX2NoYXJzCi0gIC8qIFRoaXMgbWFjcm8gcGVybWl0cyB0aGUgcHJvY2Vzc29yIHRvIHNwZWNpZnkgYWxsIGNoYXJhY3RlcnMgd2hpY2gKLSAgICAgbWF5IGFwcGVhcnMgaW4gYW4gb3BlcmFuZC4gIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzY3J1YmJlciBmcm9tCi0gICAgIGRpc2NhcmRpbmcgbWVhbmluZ2Z1bCB3aGl0ZXNwYWNlIGluIGNlcnRhaW4gY2FzZXMuICBUaGUgaTM4NgotICAgICBiYWNrZW5kIHVzZXMgdGhpcyB0byBzdXBwb3J0IHByZWZpeGVzLCB3aGljaCBjYW4gY29uZnVzZSB0aGUKLSAgICAgc2NydWJiZXIgYXMgdG8gd2hldGhlciBpdCBpcyBwYXJzaW5nIG9wZXJhbmRzIG9yIG9wY29kZXMuICAqLwotICBmb3IgKHAgPSB0Y19zeW1ib2xfY2hhcnM7ICpwOyArK3ApCi0gICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVDsKLSNlbmRpZgotCi0gIC8qIFRoZSBtNjhrIGJhY2tlbmQgd2FudHMgdG8gYmUgYWJsZSB0byBjaGFuZ2UgY29tbWVudF9jaGFycy4gICovCi0jaWZuZGVmIHRjX2NvbW1lbnRfY2hhcnMKLSNkZWZpbmUgdGNfY29tbWVudF9jaGFycyBjb21tZW50X2NoYXJzCi0jZW5kaWYKLSAgZm9yIChwID0gdGNfY29tbWVudF9jaGFyczsgKnA7IHArKykKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19DT01NRU5UX1NUQVJUOwotICAgIH0JCQkJLyogZGVjbGFyZSBjb21tZW50IGNoYXJzICovCi0KLSAgZm9yIChwID0gbGluZV9jb21tZW50X2NoYXJzOyAqcDsgcCsrKQotICAgIHsKLSAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKLSAgICB9CQkJCS8qIGRlY2xhcmUgbGluZSBjb21tZW50IGNoYXJzICovCi0KLSAgZm9yIChwID0gbGluZV9zZXBhcmF0b3JfY2hhcnM7ICpwOyBwKyspCi0gICAgewotICAgICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfTElORV9TRVBBUkFUT1I7Ci0gICAgfQkJCQkvKiBkZWNsYXJlIGxpbmUgc2VwYXJhdG9ycyAqLwotCi0gIC8qIE9ubHkgYWxsb3cgc2xhc2gtc3RhciBjb21tZW50cyBpZiBzbGFzaCBpcyBub3QgaW4gdXNlLgotICAgICBGSVhNRTogVGhpcyBpc24ndCByaWdodC4gIFdlIHNob3VsZCBhbHdheXMgcGVybWl0IHRoZW0uICAqLwotICBpZiAobGV4WycvJ10gPT0gMCkKLSAgICB7Ci0gICAgICBsZXhbJy8nXSA9IExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNUOwotICAgIH0KLQotI2lmZGVmIFRDX002OEsKLSAgaWYgKG02OGtfbXJpKQotICAgIHsKLSAgICAgIGxleFsnXCcnXSA9IExFWF9JU19TVFJJTkdRVU9URTsKLSAgICAgIGxleFsnOyddID0gTEVYX0lTX0NPTU1FTlRfU1RBUlQ7Ci0gICAgICBsZXhbJyonXSA9IExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQ7Ci0gICAgICAvKiBUaGUgTVJJIGRvY3VtZW50YXRpb24gc2F5cyAnIScgaXMgTEVYX0lTX0NPTU1FTlRfU1RBUlQsIGJ1dAotICAgICAgICAgdGhlbiBpdCBjYW4ndCBiZSB1c2VkIGluIGFuIGV4cHJlc3Npb24uICAqLwotICAgICAgbGV4WychJ10gPSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgVENfVjg1MAotICBsZXhbJy0nXSA9IExFWF9JU19ET1VCTEVEQVNIXzFTVDsKLSNlbmRpZgotI2lmZGVmIERPVUJMRUJBUl9QQVJBTExFTAotICBsZXhbJ3wnXSA9IExFWF9JU19ET1VCTEVCQVJfMVNUOwotI2VuZGlmCi0jaWZkZWYgVENfRDMwVgotICAvKiBtdXN0IGRvIHRoaXMgaXMgd2Ugd2FudCBWTElXIGluc3RydWN0aW9uIHdpdGggIi0+IiBvciAiPC0iICovCi0gIGxleFsnLSddID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7Ci0jZW5kaWYKLX0JCQkJLyogZG9fc2NydWJfYmVnaW4oKSAqLwotCi0vKiBTYXZlZCBzdGF0ZSBvZiB0aGUgc2NydWJiZXIgKi8KLXN0YXRpYyBpbnQgc3RhdGU7Ci1zdGF0aWMgaW50IG9sZF9zdGF0ZTsKLXN0YXRpYyBjaGFyICpvdXRfc3RyaW5nOwotc3RhdGljIGNoYXIgb3V0X2J1ZlsyMF07Ci1zdGF0aWMgaW50IGFkZF9uZXdsaW5lczsKLXN0YXRpYyBjaGFyICpzYXZlZF9pbnB1dDsKLXN0YXRpYyBpbnQgc2F2ZWRfaW5wdXRfbGVuOwotc3RhdGljIGNoYXIgaW5wdXRfYnVmZmVyWzMyICogMTAyNF07Ci1zdGF0aWMgY29uc3QgY2hhciAqbXJpX3N0YXRlOwotc3RhdGljIGNoYXIgbXJpX2xhc3RfY2g7Ci0KLS8qIERhdGEgc3RydWN0dXJlIGZvciBzYXZpbmcgdGhlIHN0YXRlIG9mIGFwcCBhY3Jvc3MgI2luY2x1ZGUncy4gIE5vdGUgdGhhdAotICAgYXBwIGlzIGNhbGxlZCBhc3luY2hyb25vdXNseSB0byB0aGUgcGFyc2luZyBvZiB0aGUgLmluY2x1ZGUncywgc28gb3VyCi0gICBzdGF0ZSBhdCB0aGUgdGltZSAuaW5jbHVkZSBpcyBpbnRlcnByZXRlZCBpcyBjb21wbGV0ZWx5IHVucmVsYXRlZC4KLSAgIFRoYXQncyB3aHkgd2UgaGF2ZSB0byBzYXZlIGl0IGFsbC4gICovCi0KLXN0cnVjdCBhcHBfc2F2ZQotICB7Ci0gICAgaW50ICAgICAgICAgIHN0YXRlOwotICAgIGludCAgICAgICAgICBvbGRfc3RhdGU7Ci0gICAgY2hhciAqICAgICAgIG91dF9zdHJpbmc7Ci0gICAgY2hhciAgICAgICAgIG91dF9idWZbc2l6ZW9mIChvdXRfYnVmKV07Ci0gICAgaW50ICAgICAgICAgIGFkZF9uZXdsaW5lczsKLSAgICBjaGFyICogICAgICAgc2F2ZWRfaW5wdXQ7Ci0gICAgaW50ICAgICAgICAgIHNhdmVkX2lucHV0X2xlbjsKLSNpZmRlZiBUQ19NNjhLCi0gICAgaW50ICAgICAgICAgIHNjcnViX202OGtfbXJpOwotI2VuZGlmCi0gICAgY29uc3QgY2hhciAqIG1yaV9zdGF0ZTsKLSAgICBjaGFyICAgICAgICAgbXJpX2xhc3RfY2g7Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0gICAgY29uc3QgY2hhciAqIHN5bXZlcl9zdGF0ZTsKLSNlbmRpZgotICB9OwotCi1jaGFyICoKLWFwcF9wdXNoICgpCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBhcHBfc2F2ZSAqc2F2ZWQ7Ci0KLSAgc2F2ZWQgPSAoc3RydWN0IGFwcF9zYXZlICopIHhtYWxsb2MgKHNpemVvZiAoKnNhdmVkKSk7Ci0gIHNhdmVkLT5zdGF0ZSA9IHN0YXRlOwotICBzYXZlZC0+b2xkX3N0YXRlID0gb2xkX3N0YXRlOwotICBzYXZlZC0+b3V0X3N0cmluZyA9IG91dF9zdHJpbmc7Ci0gIG1lbWNweSAoc2F2ZWQtPm91dF9idWYsIG91dF9idWYsIHNpemVvZiAob3V0X2J1ZikpOwotICBzYXZlZC0+YWRkX25ld2xpbmVzID0gYWRkX25ld2xpbmVzOwotICBpZiAoc2F2ZWRfaW5wdXQgPT0gTlVMTCkKLSAgICBzYXZlZC0+c2F2ZWRfaW5wdXQgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgc2F2ZWQtPnNhdmVkX2lucHV0ID0geG1hbGxvYyAoc2F2ZWRfaW5wdXRfbGVuKTsKLSAgICAgIG1lbWNweSAoc2F2ZWQtPnNhdmVkX2lucHV0LCBzYXZlZF9pbnB1dCwgc2F2ZWRfaW5wdXRfbGVuKTsKLSAgICAgIHNhdmVkLT5zYXZlZF9pbnB1dF9sZW4gPSBzYXZlZF9pbnB1dF9sZW47Ci0gICAgfQotI2lmZGVmIFRDX002OEsKLSAgc2F2ZWQtPnNjcnViX202OGtfbXJpID0gc2NydWJfbTY4a19tcmk7Ci0jZW5kaWYKLSAgc2F2ZWQtPm1yaV9zdGF0ZSA9IG1yaV9zdGF0ZTsKLSAgc2F2ZWQtPm1yaV9sYXN0X2NoID0gbXJpX2xhc3RfY2g7Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0gIHNhdmVkLT5zeW12ZXJfc3RhdGUgPSBzeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLQotICAvKiBkb19zY3J1Yl9iZWdpbigpIGlzIG5vdCB1c2VmdWwsIGp1c3Qgd2FzdGVzIHRpbWUuICovCi0KLSAgc3RhdGUgPSAwOwotICBzYXZlZF9pbnB1dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIChjaGFyICopIHNhdmVkOwotfQotCi12b2lkIAotYXBwX3BvcCAoYXJnKQotICAgICBjaGFyICphcmc7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBhcHBfc2F2ZSAqc2F2ZWQgPSAoc3RydWN0IGFwcF9zYXZlICopIGFyZzsKLQotICAvKiBUaGVyZSBpcyBubyBkb19zY3J1Yl9lbmQgKCkuICovCi0gIHN0YXRlID0gc2F2ZWQtPnN0YXRlOwotICBvbGRfc3RhdGUgPSBzYXZlZC0+b2xkX3N0YXRlOwotICBvdXRfc3RyaW5nID0gc2F2ZWQtPm91dF9zdHJpbmc7Ci0gIG1lbWNweSAob3V0X2J1Ziwgc2F2ZWQtPm91dF9idWYsIHNpemVvZiAob3V0X2J1ZikpOwotICBhZGRfbmV3bGluZXMgPSBzYXZlZC0+YWRkX25ld2xpbmVzOwotICBpZiAoc2F2ZWQtPnNhdmVkX2lucHV0ID09IE5VTEwpCi0gICAgc2F2ZWRfaW5wdXQgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgYXNzZXJ0IChzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuIDw9IChpbnQpIChzaXplb2YgaW5wdXRfYnVmZmVyKSk7Ci0gICAgICBtZW1jcHkgKGlucHV0X2J1ZmZlciwgc2F2ZWQtPnNhdmVkX2lucHV0LCBzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuKTsKLSAgICAgIHNhdmVkX2lucHV0ID0gaW5wdXRfYnVmZmVyOwotICAgICAgc2F2ZWRfaW5wdXRfbGVuID0gc2F2ZWQtPnNhdmVkX2lucHV0X2xlbjsKLSAgICAgIGZyZWUgKHNhdmVkLT5zYXZlZF9pbnB1dCk7Ci0gICAgfQotI2lmZGVmIFRDX002OEsKLSAgc2NydWJfbTY4a19tcmkgPSBzYXZlZC0+c2NydWJfbTY4a19tcmk7Ci0jZW5kaWYKLSAgbXJpX3N0YXRlID0gc2F2ZWQtPm1yaV9zdGF0ZTsKLSAgbXJpX2xhc3RfY2ggPSBzYXZlZC0+bXJpX2xhc3RfY2g7Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0gIHN5bXZlcl9zdGF0ZSA9IHNhdmVkLT5zeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLQotICBmcmVlIChhcmcpOwotfQkJCQkvKiBhcHBfcG9wKCkgKi8KLQotLyogQEAgVGhpcyBhc3N1bWVzIHRoYXQgXG4gJmMgYXJlIHRoZSBzYW1lIG9uIGhvc3QgYW5kIHRhcmdldC4gIFRoaXMgaXMgbm90Ci0gICBuZWNlc3NhcmlseSB0cnVlLiAgKi8KLXN0YXRpYyBpbnQgCi1wcm9jZXNzX2VzY2FwZSAoY2gpCi0gICAgIGludCBjaDsKLXsKLSAgc3dpdGNoIChjaCkKLSAgICB7Ci0gICAgY2FzZSAnYic6Ci0gICAgICByZXR1cm4gJ1xiJzsKLSAgICBjYXNlICdmJzoKLSAgICAgIHJldHVybiAnXGYnOwotICAgIGNhc2UgJ24nOgotICAgICAgcmV0dXJuICdcbic7Ci0gICAgY2FzZSAncic6Ci0gICAgICByZXR1cm4gJ1xyJzsKLSAgICBjYXNlICd0JzoKLSAgICAgIHJldHVybiAnXHQnOwotICAgIGNhc2UgJ1wnJzoKLSAgICAgIHJldHVybiAnXCcnOwotICAgIGNhc2UgJyInOgotICAgICAgcmV0dXJuICdcIic7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBjaDsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgaW5wdXQgY2hhcmFjdGVycy4gIFRoZSBHRVQKLSAgIHBhcmFtZXRlciBpcyB1c2VkIHRvIHJldHJpZXZlIG1vcmUgaW5wdXQgY2hhcmFjdGVycy4gIEdFVCBzaG91bGQKLSAgIHNldCBpdHMgcGFyYW1ldGVyIHRvIHBvaW50IHRvIGEgYnVmZmVyLCBhbmQgcmV0dXJuIHRoZSBsZW5ndGggb2YKLSAgIHRoZSBidWZmZXI7IGl0IHNob3VsZCByZXR1cm4gMCBhdCBlbmQgb2YgZmlsZS4gIFRoZSBzY3J1YmJlZCBvdXRwdXQKLSAgIGNoYXJhY3RlcnMgYXJlIHB1dCBpbnRvIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQgVE9TVEFSVDsgdGhlIFRPU1RBUlQKLSAgIGJ1ZmZlciBpcyBUT0xFTiBieXRlcyBpbiBsZW5ndGguICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyCi0gICBvZiBzY3J1YmJlZCBjaGFyYWN0ZXJzIHB1dCBpbnRvIFRPU1RBUlQuICBUaGlzIHdpbGwgYmUgVE9MRU4gdW5sZXNzCi0gICBlbmQgb2YgZmlsZSB3YXMgc2Vlbi4gIFRoaXMgZnVuY3Rpb24gaXMgYXJyYW5nZWQgYXMgYSBzdGF0ZQotICAgbWFjaGluZSwgYW5kIHNhdmVzIGl0cyBzdGF0ZSBzbyB0aGF0IGl0IG1heSByZXR1cm4gYXQgYW55IHBvaW50LgotICAgVGhpcyBpcyB0aGUgd2F5IHRoZSBvbGQgY29kZSB1c2VkIHRvIHdvcmsuICAqLwotCi1pbnQKLWRvX3NjcnViX2NoYXJzIChnZXQsIHRvc3RhcnQsIHRvbGVuKQotICAgICBpbnQgKCpnZXQpIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0gICAgIGNoYXIgKnRvc3RhcnQ7Ci0gICAgIGludCB0b2xlbjsKLXsKLSAgY2hhciAqdG8gPSB0b3N0YXJ0OwotICBjaGFyICp0b2VuZCA9IHRvc3RhcnQgKyB0b2xlbjsKLSAgY2hhciAqZnJvbTsKLSAgY2hhciAqZnJvbWVuZDsKLSAgaW50IGZyb21sZW47Ci0gIHJlZ2lzdGVyIGludCBjaCwgY2gyID0gMDsKLQotICAvKlN0YXRlIDA6IGJlZ2lubmluZyBvZiBub3JtYWwgbGluZQotCSAgMTogQWZ0ZXIgZmlyc3Qgd2hpdGVzcGFjZSBvbiBsaW5lIChmbHVzaCBtb3JlIHdoaXRlKQotCSAgMjogQWZ0ZXIgZmlyc3Qgbm9uLXdoaXRlIChvcGNvZGUpIG9uIGxpbmUgKGtlZXAgMXdoaXRlKQotCSAgMzogYWZ0ZXIgc2Vjb25kIHdoaXRlIG9uIGxpbmUgKGludG8gb3BlcmFuZHMpIChmbHVzaCB3aGl0ZSkKLQkgIDQ6IGFmdGVyIHB1dHRpbmcgb3V0IGEgLmxpbmUsIHB1dCBvdXQgZGlnaXRzCi0JICA1OiBwYXJzaW5nIGEgc3RyaW5nLCB0aGVuIGdvIHRvIG9sZC1zdGF0ZQotCSAgNjogcHV0dGluZyBvdXQgXCBlc2NhcGUgaW4gYSAiZCBzdHJpbmcuCi0JICA3OiBBZnRlciBwdXR0aW5nIG91dCBhIC5hcHBmaWxlLCBwdXQgb3V0IHN0cmluZy4KLQkgIDg6IEFmdGVyIHB1dHRpbmcgb3V0IGEgLmFwcGZpbGUgc3RyaW5nLCBmbHVzaCB1bnRpbCBuZXdsaW5lLgotCSAgOTogQWZ0ZXIgc2VlaW5nIHN5bWJvbCBjaGFyIGluIHN0YXRlIDMgKGtlZXAgMXdoaXRlIGFmdGVyIHN5bWNoYXIpCi0JIDEwOiBBZnRlciBzZWVpbmcgd2hpdGVzcGFjZSBpbiBzdGF0ZSA5IChrZWVwIHdoaXRlIGJlZm9yZSBzeW1jaGFyKQotCSAxMTogQWZ0ZXIgc2VlaW5nIGEgc3ltYm9sIGNoYXJhY3RlciBpbiBzdGF0ZSAwIChlZyBhIGxhYmVsIGRlZmluaXRpb24pCi0JIC0xOiBvdXRwdXQgc3RyaW5nIGluIG91dF9zdHJpbmcgYW5kIGdvIHRvIHRoZSBzdGF0ZSBpbiBvbGRfc3RhdGUKLQkgLTI6IGZsdXNoIHRleHQgdW50aWwgYSAnKicgJy8nIGlzIHNlZW4sIHRoZW4gZ28gdG8gc3RhdGUgb2xkX3N0YXRlCi0jaWZkZWYgVENfVjg1MAotICAgICAgICAgMTI6IEFmdGVyIHNlZWluZyBhIGRhc2gsIGxvb2tpbmcgZm9yIGEgc2Vjb25kIGRhc2ggYXMgYSBzdGFydCBvZiBjb21tZW50LgotI2VuZGlmCi0jaWZkZWYgRE9VQkxFQkFSX1BBUkFMTEVMCi0JIDEzOiBBZnRlciBzZWVpbmcgYSB2ZXJ0aWNhbCBiYXIsIGxvb2tpbmcgZm9yIGEgc2Vjb25kIHZlcnRpY2FsIGJhciBhcyBhIHBhcmFsbGVsIGV4cHJlc3Npb24gc2VwZXJhdG9yLgotI2VuZGlmCi0JICAqLwotCi0gIC8qIEkgYWRkZWQgc3RhdGVzIDkgYW5kIDEwIGJlY2F1c2UgdGhlIE1JUFMgRUNPRkYgYXNzZW1ibGVyIHVzZXMKLSAgICAgY29uc3RydWN0cyBsaWtlIGBgLmxvYyAxIDIwJycuICBUaGlzIHdhcyB0dXJuaW5nIGludG8gYGAubG9jCi0gICAgIDEyMCcnLiAgU3RhdGVzIDkgYW5kIDEwIGVuc3VyZSB0aGF0IGEgc3BhY2UgaXMgbmV2ZXIgZHJvcHBlZCBpbgotICAgICBiZXR3ZWVuIGNoYXJhY3RlcnMgd2hpY2ggY291bGQgYXBwZWFyIGluIGEgaWRlbnRpZmllci4gIElhbgotICAgICBUYXlsb3IsIGlhbkBjeWdudXMuY29tLgotCi0gICAgIEkgYWRkZWQgc3RhdGUgMTEgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiTGZvbyBhZGQgJXIyNSwlcjI2LCVyMjciIHdvcmtzCi0gICAgIGNvcnJlY3RseSBvbiB0aGUgUEEgKGFuZCBhbnkgb3RoZXIgdGFyZ2V0IHdoZXJlIGNvbG9ucyBhcmUgb3B0aW9uYWwpLgotICAgICBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1LgotCi0gICAgIEkgYWRkZWQgc3RhdGUgMTMgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiY21wIHIxLCByMiB8fCB0cmFwICMxIiBkb2VzIG5vdAotICAgICBnZXQgc3F1YXNoZWQgaW50byAiY21wIHIxLHIyfHx0cmFwIzEiLCB3aXRoIHRoZSBhbGwgaW1wb3J0YW50IHNwYWNlCi0gICAgIGJldHdlZW4gdGhlICd0cmFwJyBhbmQgdGhlICcjMScgYmVpbmcgZWxpbWluYXRlZC4gIG5pY2tjQGN5Z251cy5jb20gICovCi0KLSAgLyogVGhpcyBtYWNybyBnZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4gICovCi0KLSNkZWZpbmUgR0VUKCkJCQkJCQkJXAotICAoZnJvbSA8IGZyb21lbmQJCQkJCQlcCi0gICA/ICogKHVuc2lnbmVkIGNoYXIgKikgKGZyb20rKykJCQkJXAotICAgOiAoc2F2ZWRfaW5wdXQgPSBOVUxMLAkJCQkJXAotICAgICAgZnJvbWxlbiA9ICgqZ2V0KSAoaW5wdXRfYnVmZmVyLCBzaXplb2YgaW5wdXRfYnVmZmVyKSwJXAotICAgICAgZnJvbSA9IGlucHV0X2J1ZmZlciwJCQkJCVwKLSAgICAgIGZyb21lbmQgPSBmcm9tICsgZnJvbWxlbiwJCQkJCVwKLSAgICAgIChmcm9tbGVuID09IDAJCQkJCQlcCi0gICAgICAgPyBFT0YJCQkJCQkJXAotICAgICAgIDogKiAodW5zaWduZWQgY2hhciAqKSAoZnJvbSsrKSkpKQotCi0gIC8qIFRoaXMgbWFjcm8gcHVzaGVzIGEgY2hhcmFjdGVyIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbS4gICovCi0KLSNkZWZpbmUgVU5HRVQodWNoKSAoKi0tZnJvbSA9ICh1Y2gpKQotCi0gIC8qIFRoaXMgbWFjcm8gcHV0cyBhIGNoYXJhY3RlciBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLiAgSWYgdGhpcwotICAgICBjaGFyYWN0ZXIgZmlsbHMgdGhlIG91dHB1dCBidWZmZXIsIHRoaXMgbWFjcm8ganVtcHMgdG8gdGhlIGxhYmVsCi0gICAgIFRPRlVMTC4gIFdlIHVzZSB0aGlzIHJhdGhlciB1Z2x5IGFwcHJvYWNoIGJlY2F1c2Ugd2UgbmVlZCB0bwotICAgICBoYW5kbGUgdHdvIGRpZmZlcmVudCB0ZXJtaW5hdGlvbiBjb25kaXRpb25zOiBFT0Ygb24gdGhlIGlucHV0Ci0gICAgIHN0cmVhbSwgYW5kIGEgZnVsbCBvdXRwdXQgYnVmZmVyLiAgSXQgd291bGQgYmUgc2ltcGxlciBpZiB3ZQotICAgICBhbHdheXMgcmVhZCBpbiB0aGUgZW50aXJlIGlucHV0IHN0cmVhbSBiZWZvcmUgcHJvY2Vzc2luZyBpdCwgYnV0Ci0gICAgIEkgZG9uJ3Qgd2FudCB0byBtYWtlIHN1Y2ggYSBzaWduaWZpY2FudCBjaGFuZ2UgdG8gdGhlIGFzc2VtYmxlcidzCi0gICAgIG1lbW9yeSB1c2FnZS4gICovCi0KLSNkZWZpbmUgUFVUKHBjaCkJCQlcCi0gIGRvCQkJCQlcCi0gICAgewkJCQkJXAotICAgICAgKnRvKysgPSAocGNoKTsJCQlcCi0gICAgICBpZiAodG8gPj0gdG9lbmQpCQkJXAotICAgICAgICBnb3RvIHRvZnVsbDsJCQlcCi0gICAgfQkJCQkJXAotICB3aGlsZSAoMCkKLQotICBpZiAoc2F2ZWRfaW5wdXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcm9tID0gc2F2ZWRfaW5wdXQ7Ci0gICAgICBmcm9tZW5kID0gZnJvbSArIHNhdmVkX2lucHV0X2xlbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcm9tbGVuID0gKCpnZXQpIChpbnB1dF9idWZmZXIsIHNpemVvZiBpbnB1dF9idWZmZXIpOwotICAgICAgaWYgKGZyb21sZW4gPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGZyb20gPSBpbnB1dF9idWZmZXI7Ci0gICAgICBmcm9tZW5kID0gZnJvbSArIGZyb21sZW47Ci0gICAgfQotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIFRoZSBjYXNlcyBpbiB0aGlzIHN3aXRjaCBlbmQgd2l0aCBjb250aW51ZSwgaW4gb3JkZXIgdG8KLSAgICAgICAgIGJyYW5jaCBiYWNrIHRvIHRoZSB0b3Agb2YgdGhpcyB3aGlsZSBsb29wIGFuZCBnZW5lcmF0ZSB0aGUKLSAgICAgICAgIG5leHQgb3V0cHV0IGNoYXJhY3RlciBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUuICAqLwotICAgICAgc3dpdGNoIChzdGF0ZSkKLQl7Ci0JY2FzZSAtMToKLQkgIGNoID0gKm91dF9zdHJpbmcrKzsKLQkgIGlmICgqb3V0X3N0cmluZyA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgb2xkX3N0YXRlID0gMzsKLQkgICAgfQotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgLTI6Ci0JICBmb3IgKDs7KQotCSAgICB7Ci0JICAgICAgZG8KLQkJewotCQkgIGNoID0gR0VUICgpOwotCi0JCSAgaWYgKGNoID09IEVPRikKLQkJICAgIHsKLQkJICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIpKTsKLQkJICAgICAgZ290byBmcm9tZW9mOwotCQkgICAgfQotCi0JCSAgaWYgKGNoID09ICdcbicpCi0JCSAgICBQVVQgKCdcbicpOwotCQl9Ci0JICAgICAgd2hpbGUgKGNoICE9ICcqJyk7Ci0KLQkgICAgICB3aGlsZSAoKGNoID0gR0VUICgpKSA9PSAnKicpCi0JCTsKLQotCSAgICAgIGlmIChjaCA9PSBFT0YpCi0JCXsKLQkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50IikpOwotCQkgIGdvdG8gZnJvbWVvZjsKLQkJfQotCi0JICAgICAgaWYgKGNoID09ICcvJykKLQkJYnJlYWs7Ci0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICB9Ci0KLQkgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgVU5HRVQgKCcgJyk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgNDoKLQkgIGNoID0gR0VUICgpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCSAgZWxzZSBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKLQkgICAgUFVUIChjaCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSkKLQkJY2ggPSBHRVQgKCk7Ci0JICAgICAgaWYgKGNoID09ICciJykKLQkJewotCQkgIFVOR0VUIChjaCk7Ci0JCSAgaWYgKHNjcnViX202OGtfbXJpKQotCQkgICAgb3V0X3N0cmluZyA9ICJcblx0YXBwZmlsZSAiOwotCQkgIGVsc2UKLQkJICAgIG91dF9zdHJpbmcgPSAiXG5cdC5hcHBmaWxlICI7Ci0JCSAgb2xkX3N0YXRlID0gNzsKLQkJICBzdGF0ZSA9IC0xOwotCQkgIFBVVCAoKm91dF9zdHJpbmcrKyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB3aGlsZSAoY2ggIT0gRU9GICYmIGNoICE9ICdcbicpCi0JCSAgICBjaCA9IEdFVCAoKTsKLQkJICBzdGF0ZSA9IDA7Ci0JCSAgUFVUIChjaCk7Ci0JCX0KLQkgICAgfQotCSAgY29udGludWU7Ci0KLQljYXNlIDU6Ci0JICAvKiBXZSBhcmUgZ29pbmcgdG8gY29weSBldmVyeXRoaW5nIHVwIHRvIGEgcXVvdGUgY2hhcmFjdGVyLAotICAgICAgICAgICAgIHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYSBiYWNrc2xhc2guICBXZSB0cnkgdG8KLSAgICAgICAgICAgICBvcHRpbWl6ZSB0aGUgY29weWluZyBpbiB0aGUgc2ltcGxlIGNhc2Ugd2l0aG91dCB1c2luZyB0aGUKLSAgICAgICAgICAgICBHRVQgYW5kIFBVVCBtYWNyb3MuICAqLwotCSAgewotCSAgICBjaGFyICpzOwotCSAgICBpbnQgbGVuOwotCi0JICAgIGZvciAocyA9IGZyb207IHMgPCBmcm9tZW5kOyBzKyspCi0JICAgICAgewotCQljaCA9ICpzOwotCQkvKiBUaGlzIGNvbmRpdGlvbiBtdXN0IGJlIGNoYW5nZWQgaWYgdGhlIHR5cGUgb2YgYW55Ci0gICAgICAgICAgICAgICAgICAgb3RoZXIgY2hhcmFjdGVyIGNhbiBiZSBMRVhfSVNfU1RSSU5HUVVPVEUuICAqLwotCQlpZiAoY2ggPT0gJ1xcJwotCQkgICAgfHwgY2ggPT0gJyInCi0JCSAgICB8fCBjaCA9PSAnXCcnCi0JCSAgICB8fCBjaCA9PSAnXG4nKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgbGVuID0gcyAtIGZyb207Ci0JICAgIGlmIChsZW4gPiB0b2VuZCAtIHRvKQotCSAgICAgIGxlbiA9IHRvZW5kIC0gdG87Ci0JICAgIGlmIChsZW4gPiAwKQotCSAgICAgIHsKLQkJbWVtY3B5ICh0bywgZnJvbSwgbGVuKTsKLQkJdG8gKz0gbGVuOwotCQlmcm9tICs9IGxlbjsKLQkgICAgICB9Ci0JICB9Ci0KLQkgIGNoID0gR0VUICgpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIHN0cmluZzogaW5zZXJ0ZWQgJ1wiJyIpKTsKLQkgICAgICBzdGF0ZSA9IG9sZF9zdGF0ZTsKLQkgICAgICBVTkdFVCAoJ1xuJyk7Ci0JICAgICAgUFVUICgnIicpOwotCSAgICB9Ci0JICBlbHNlIGlmIChsZXhbY2hdID09IExFWF9JU19TVFJJTkdRVU9URSkKLQkgICAgewotCSAgICAgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0jaWZuZGVmIE5PX1NUUklOR19FU0NBUEVTCi0JICBlbHNlIGlmIChjaCA9PSAnXFwnKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSA2OwotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0jZW5kaWYKLQkgIGVsc2UgaWYgKHNjcnViX202OGtfbXJpICYmIGNoID09ICdcbicpCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IHF1aWV0bHkgdGVybWluYXRlIHRoZSBzdHJpbmcuICBUaGlzIHBlcm1pdHMgbGluZXMgbGlrZQotCQkgICBibmUJbGFiZWwJbG9vcCBpZiB3ZSBoYXZlbid0IHJlYWNoIGVuZCB5ZXQKLQkJICovCi0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBQVVQgKCdcJycpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotCSAgY29udGludWU7Ci0KLQljYXNlIDY6Ci0JICBzdGF0ZSA9IDU7Ci0JICBjaCA9IEdFVCAoKTsKLQkgIHN3aXRjaCAoY2gpCi0JICAgIHsKLQkgICAgICAvKiBIYW5kbGUgc3RyaW5ncyBicm9rZW4gYWNyb3NzIGxpbmVzLCBieSB0dXJuaW5nICdcbicgaW50bwotCQkgJ1xcJyBhbmQgJ24nLiAgKi8KLQkgICAgY2FzZSAnXG4nOgotCSAgICAgIFVOR0VUICgnbicpOwotCSAgICAgIGFkZF9uZXdsaW5lcysrOwotCSAgICAgIFBVVCAoJ1xcJyk7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnIic6Ci0JICAgIGNhc2UgJ1xcJzoKLQkgICAgY2FzZSAnYic6Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICduJzoKLQkgICAgY2FzZSAncic6Ci0JICAgIGNhc2UgJ3QnOgotCSAgICBjYXNlICd2JzoKLQkgICAgY2FzZSAneCc6Ci0JICAgIGNhc2UgJ1gnOgotCSAgICBjYXNlICcwJzoKLQkgICAgY2FzZSAnMSc6Ci0JICAgIGNhc2UgJzInOgotCSAgICBjYXNlICczJzoKLQkgICAgY2FzZSAnNCc6Ci0JICAgIGNhc2UgJzUnOgotCSAgICBjYXNlICc2JzoKLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgYnJlYWs7Ci0jaWYgZGVmaW5lZChJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUykgfCBkZWZpbmVkKE9OTFlfU1RBTkRBUkRfRVNDQVBFUykKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc193YXJuIChfKCJVbmtub3duIGVzY2FwZSAnXFwlYycgaW4gc3RyaW5nOiBJZ25vcmVkIiksIGNoKTsKLQkgICAgICBicmVhazsKLSNlbHNlICAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBBY2NlcHQgXHggYXMgeCBmb3IgYW55IHggKi8KLQkgICAgICBicmVhazsKLSNlbmRpZiAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQotCSAgICBjYXNlIEVPRjoKLQkgICAgICBhc193YXJuIChfKCJFbmQgb2YgZmlsZSBpbiBzdHJpbmc6ICdcIicgaW5zZXJ0ZWQiKSk7Ci0JICAgICAgUFVUICgnIicpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBQVVQgKGNoKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSA3OgotCSAgY2ggPSBHRVQgKCk7Ci0JICBzdGF0ZSA9IDU7Ci0JICBvbGRfc3RhdGUgPSA4OwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgODoKLQkgIGRvCi0JICAgIGNoID0gR0VUICgpOwotCSAgd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQkgIHN0YXRlID0gMDsKLQkgIFBVVCAoY2gpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPSywgd2UgYXJlIHNvbWV3aGVyZSBpbiBzdGF0ZXMgMCB0aHJvdWdoIDQgb3IgOSB0aHJvdWdoIDExICovCi0KLSAgICAgIC8qIGZsdXNoY2hhcjogKi8KLSAgICAgIGNoID0gR0VUICgpOwotCi0gICAgcmVjeWNsZToKLQotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICAgICAgLyogV2UgbmVlZCB0byB3YXRjaCBvdXQgZm9yIC5zeW12ZXIgZGlyZWN0aXZlcy4gIFNlZSB0aGUgY29tbWVudCBsYXRlcgotCSBpbiB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChzeW12ZXJfc3RhdGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkgJiYgY2ggPT0gc3ltdmVyX3BzZXVkb1swXSkKLQkgICAgc3ltdmVyX3N0YXRlID0gc3ltdmVyX3BzZXVkbyArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGFkdmFuY2UgdG8gdGhlIG5leHQgc3RhdGUgaWYgd2UgZmluZCB0aGUgcmlnaHQKLQkgICAgIGNoYXJhY3Rlci4gICovCi0JICBpZiAoY2ggIT0gJ1wwJyAmJiAoKnN5bXZlcl9zdGF0ZSA9PSBjaCkpCi0JICAgICsrc3ltdmVyX3N0YXRlOwotCSAgZWxzZSBpZiAoKnN5bXZlcl9zdGF0ZSAhPSAnXDAnKQotCSAgICAvKiBXZSBkaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgY2hhcmFjdGVyLCBvciB3ZSBkaWRuJ3QKLQkgICAgICAgZ2V0IGEgdmFsaWQgdGVybWluYXRpbmcgY2hhcmFjdGVyIGFmdGVyIHNlZWluZyB0aGUKLQkgICAgICAgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuICAqLwotCSAgICBzeW12ZXJfc3RhdGUgPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgcmVhZCB0aGUgZW50aXJlIHBzZXVkby1vcC4gIElmIHRoaXMgaXMgdGhlIGVuZAotCQkgb2YgdGhlIGxpbmUsIGdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gICovCi0JICAgICAgaWYgKElTX05FV0xJTkUgKGNoKSkKLQkJc3ltdmVyX3N0YXRlID0gTlVMTDsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBUQ19BUk0gJiYgT0JKX0VMRiAqLwotCi0jaWZkZWYgVENfTTY4SwotICAgICAgLyogV2Ugd2FudCB0byBoYXZlIHBzZXVkby1vcHMgd2hpY2ggY29udHJvbCB3aGV0aGVyIHdlIGFyZSBpbgotICAgICAgICAgTVJJIG1vZGUgb3Igbm90LiAgVW5mb3J0dW5hdGVseSwgc2luY2UgbTY4ayBNUkkgbW9kZSBhZmZlY3RzCi0gICAgICAgICB0aGUgc2NydWJiZXIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIGEgc3BlY2lhbCBwdXJwb3NlCi0gICAgICAgICByZWNvZ25pemVyIGhlcmUuICAqLwotICAgICAgaWYgKG1yaV9zdGF0ZSA9PSBOVUxMKQotCXsKLQkgIGlmICgoc3RhdGUgPT0gMCB8fCBzdGF0ZSA9PSAxKQotCSAgICAgICYmIGNoID09IG1yaV9wc2V1ZG9bMF0pCi0JICAgIG1yaV9zdGF0ZSA9IG1yaV9wc2V1ZG8gKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhZHZhbmNlIHRvIHRoZSBuZXh0IHN0YXRlIGlmIHdlIGZpbmQgdGhlIHJpZ2h0Ci0JICAgICBjaGFyYWN0ZXIsIG9yIGlmIHdlIG5lZWQgYSBzcGFjZSBjaGFyYWN0ZXIgYW5kIHdlIGdldCBhbnkKLQkgICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVyLCBvciBpZiB3ZSBuZWVkIGEgJzAnIGFuZCB3ZSBnZXQgYQotCSAgICAgJzEnICh0aGlzIGlzIHNvIHRoYXQgd2Ugb25seSBuZWVkIG9uZSBzdGF0ZSB0byBoYW5kbGUKLQkgICAgIGBgLm1yaSAwJycgYW5kIGBgLm1yaSAxJycpLiAgKi8KLQkgIGlmIChjaCAhPSAnXDAnCi0JICAgICAgJiYgKCptcmlfc3RhdGUgPT0gY2gKLQkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnICcKLQkJICAgICAgJiYgbGV4W2NoXSA9PSBMRVhfSVNfV0hJVEVTUEFDRSkKLQkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnMCcKLQkJICAgICAgJiYgY2ggPT0gJzEnKSkpCi0JICAgIHsKLQkgICAgICBtcmlfbGFzdF9jaCA9IGNoOwotCSAgICAgICsrbXJpX3N0YXRlOwotCSAgICB9Ci0JICBlbHNlIGlmICgqbXJpX3N0YXRlICE9ICdcMCcKLQkJICAgfHwgKGxleFtjaF0gIT0gTEVYX0lTX1dISVRFU1BBQ0UKLQkJICAgICAgICYmIGxleFtjaF0gIT0gTEVYX0lTX05FV0xJTkUpKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIGNoYXJhY3Rlciwgb3Igd2UgZGlkbid0Ci0JCSBnZXQgYSB2YWxpZCB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYWZ0ZXIgc2VlaW5nIHRoZQotCQkgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZQotCQkgYmVnaW5uaW5nLiAgKi8KLQkgICAgICBtcmlfc3RhdGUgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSByZWFkIHRoZSBlbnRpcmUgcHNldWRvLW9wLiAgbWlwc19sYXN0X2NoIGlzCi0gICAgICAgICAgICAgICAgIGVpdGhlciAnMCcgb3IgJzEnIGluZGljYXRpbmcgd2hldGhlciB0byBlbnRlciBvcgotICAgICAgICAgICAgICAgICBsZWF2ZSBNUkkgbW9kZS4gICovCi0JICAgICAgZG9fc2NydWJfYmVnaW4gKG1yaV9sYXN0X2NoID09ICcxJyk7Ci0JICAgICAgbXJpX3N0YXRlID0gTlVMTDsKLQotCSAgICAgIC8qIFdlIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBjaGFyYWN0ZXIgYXMgdXN1YWwuICBUaGUKLSAgICAgICAgICAgICAgICAgbWFpbiBnYXMgcmVhZGVyIG11c3QgYWxzbyBoYW5kbGUgdGhlIC5tcmkgcHNldWRvLW9wCi0gICAgICAgICAgICAgICAgIHRvIGNvbnRyb2wgZXhwcmVzc2lvbiBwYXJzaW5nIGFuZCB0aGUgbGlrZS4gICovCi0JICAgIH0KLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGNoID09IEVPRikKLQl7Ci0JICBpZiAoc3RhdGUgIT0gMCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIG5vdCBhdCBlbmQgb2YgYSBsaW5lOyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgICAgIHN0YXRlID0gMDsKLQkgICAgICBQVVQgKCdcbicpOwotCSAgICB9Ci0JICBnb3RvIGZyb21lb2Y7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGxleFtjaF0pCi0JewotCWNhc2UgTEVYX0lTX1dISVRFU1BBQ0U6Ci0JICBkbwotCSAgICB7Ci0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgIH0KLQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgSVNfV0hJVEVTUEFDRSAoY2gpKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQotCSAgaWYgKHN0YXRlID09IDApCi0JICAgIHsKLQkgICAgICAvKiBQcmVzZXJ2ZSBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhdCB0aGUKLQkJIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotCSAgICAgIHN0YXRlID0gMTsKLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0jaWZkZWYgS0VFUF9XSElURV9BUk9VTkRfQ09MT04KLSAgICAgICAgICBpZiAobGV4W2NoXSA9PSBMRVhfSVNfQ09MT04pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIG9ubHkga2VlcCB0aGlzIHdoaXRlIGlmIHRoZXJlJ3Mgbm8gd2hpdGUgKmFmdGVyKiB0aGUgY29sb24gKi8KLSAgICAgICAgICAgICAgY2gyID0gR0VUICgpOwotICAgICAgICAgICAgICBVTkdFVCAoY2gyKTsKLSAgICAgICAgICAgICAgaWYgKCFJU19XSElURVNQQUNFIChjaDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHN0YXRlID0gOTsKLSAgICAgICAgICAgICAgICAgIFVOR0VUIChjaCk7Ci0gICAgICAgICAgICAgICAgICBQVVQgKCcgJyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQkgIGlmIChJU19DT01NRU5UIChjaCkKLQkgICAgICB8fCBjaCA9PSAnLycKLQkgICAgICB8fCBJU19MSU5FX1NFUEFSQVRPUiAoY2gpKQotCSAgICB7Ci0JICAgICAgaWYgKHNjcnViX202OGtfbXJpKQotCQl7Ci0JCSAgLyogSW4gTVJJIG1vZGUsIHdlIGtlZXAgdGhlc2Ugc3BhY2VzLiAgKi8KLQkJICBVTkdFVCAoY2gpOwotCQkgIFBVVCAoJyAnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGdvdG8gcmVjeWNsZTsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSdyZSBpbiBzdGF0ZSAyIG9yIDExLCB3ZSd2ZSBzZWVuIGEgbm9uLXdoaXRlCi0JICAgICBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZS4gIElmIHRoZSBuZXh0IGNoYXJhY3RlcgotCSAgICAgaXMgJzonLCB0aGlzIGlzIHdoaXRlc3BhY2UgYWZ0ZXIgYSBsYWJlbCBuYW1lIHdoaWNoIHdlCi0JICAgICBub3JtYWxseSBtdXN0IGlnbm9yZS4gIEluIE1SSSBtb2RlLCB0aG91Z2gsIHNwYWNlcyBhcmUKLQkgICAgIG5vdCBwZXJtaXR0ZWQgYmV0d2VlbiB0aGUgbGFiZWwgYW5kIHRoZSBjb2xvbi4gICovCi0JICBpZiAoKHN0YXRlID09IDIgfHwgc3RhdGUgPT0gMTEpCi0JICAgICAgJiYgbGV4W2NoXSA9PSBMRVhfSVNfQ09MT04KLQkgICAgICAmJiAhIHNjcnViX202OGtfbXJpKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSAxOwotCSAgICAgIFBVVCAoY2gpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoc3RhdGUpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIHN0YXRlKys7Ci0JICAgICAgZ290byByZWN5Y2xlOwkvKiBQdW50ZWQgbGVhZGluZyBzcCAqLwotCSAgICBjYXNlIDE6Ci0JICAgICAgLyogV2UgY2FuIGFycml2ZSBoZXJlIGlmIHdlIGxlYXZlIGEgbGVhZGluZyB3aGl0ZXNwYWNlCi0JCSBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotCSAgICAgIGdvdG8gcmVjeWNsZTsKLQkgICAgY2FzZSAyOgotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgICBpZiAodG8gKyAxIDwgdG9lbmQpCi0JCXsKLQkJICAvKiBPcHRpbWl6ZSBjb21tb24gY2FzZSBieSBza2lwcGluZyBVTkdFVC9HRVQuICAqLwotCQkgIFBVVCAoJyAnKTsJLyogU3AgYWZ0ZXIgb3BjbyAqLwotCQkgIGdvdG8gcmVjeWNsZTsKLQkJfQotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgUFVUICgnICcpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDM6Ci0JICAgICAgaWYgKHNjcnViX202OGtfbXJpKQotCQl7Ci0JCSAgLyogSW4gTVJJIG1vZGUsIHdlIGtlZXAgdGhlc2Ugc3BhY2VzLiAgKi8KLQkJICBVTkdFVCAoY2gpOwotCQkgIFBVVCAoJyAnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGdvdG8gcmVjeWNsZTsJLyogU3AgaW4gb3BlcmFuZHMgKi8KLQkgICAgY2FzZSA5OgotCSAgICBjYXNlIDEwOgotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJewotCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCi0JCSAgc3RhdGUgPSAzOwotCQkgIFVOR0VUIChjaCk7Ci0JCSAgUFVUICgnICcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgc3RhdGUgPSAxMDsJLyogU3AgYWZ0ZXIgc3ltYm9sIGNoYXIgKi8KLQkgICAgICBnb3RvIHJlY3ljbGU7Ci0JICAgIGNhc2UgMTE6Ci0JICAgICAgaWYgKExBQkVMU19XSVRIT1VUX0NPTE9OUyB8fCBmbGFnX202OGtfbXJpKQotCQlzdGF0ZSA9IDE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2Uga25vdyB0aGF0IGNoIGlzIG5vdCAnOicsIHNpbmNlIHdlIHRlc3RlZCB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlIGFib3ZlLiAgVGhlcmVmb3JlIHRoaXMgaXMgbm90IGEgbGFiZWwsIHNvIGl0Ci0gICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRoZSBvcGNvZGUsIGFuZCB3ZSd2ZSBqdXN0IHNlZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlIGFmdGVyIGl0LiAgKi8KLQkJICBzdGF0ZSA9IDM7Ci0JCX0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsJLyogU3AgYWZ0ZXIgbGFiZWwgZGVmaW5pdGlvbi4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgQkFEX0NBU0UgKHN0YXRlKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNUOgotCSAgY2gyID0gR0VUICgpOwotCSAgaWYgKGNoMiA9PSAnKicpCi0JICAgIHsKLQkgICAgICBmb3IgKDs7KQotCQl7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgY2gyID0gR0VUICgpOwotCQkgICAgICBpZiAoY2gyICE9IEVPRiAmJiBJU19ORVdMSU5FIChjaDIpKQotCQkJYWRkX25ld2xpbmVzKys7Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKGNoMiAhPSBFT0YgJiYgY2gyICE9ICcqJyk7Ci0KLQkJICB3aGlsZSAoY2gyID09ICcqJykKLQkJICAgIGNoMiA9IEdFVCAoKTsKLQotCQkgIGlmIChjaDIgPT0gRU9GIHx8IGNoMiA9PSAnLycpCi0JCSAgICBicmVhazsKLQotCQkgIC8qIFRoaXMgVU5HRVQgd2lsbCBlbnN1cmUgdGhhdCB3ZSBjb3VudCBuZXdsaW5lcwotICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5LiAgKi8KLQkJICBVTkdFVCAoY2gyKTsKLQkJfQotCi0JICAgICAgaWYgKGNoMiA9PSBFT0YpCi0JCWFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IikpOwotCi0JICAgICAgY2ggPSAnICc7Ci0JICAgICAgZ290byByZWN5Y2xlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoY2gyICE9IEVPRikKLQkJVU5HRVQgKGNoMik7Ci0JICAgICAgaWYgKHN0YXRlID09IDkgfHwgc3RhdGUgPT0gMTApCi0JCXN0YXRlID0gMzsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19TVFJJTkdRVU9URToKLQkgIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIC8qIFByZXNlcnZlIHRoZSB3aGl0ZXNwYWNlIGluIGZvbyAiYmFyIiAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQotCSAgICAgIC8qIFBVVCBkaWRuJ3QganVtcCBvdXQuICBXZSBjb3VsZCBqdXN0IGJyZWFrLCBidXQgd2UKLSAgICAgICAgICAgICAgICAga25vdyB3aGF0IHdpbGwgaGFwcGVuLCBzbyBvcHRpbWl6ZSBhIGJpdC4gICovCi0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgICAgb2xkX3N0YXRlID0gMzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhdGUgPT0gOSkKLQkgICAgb2xkX3N0YXRlID0gMzsKLQkgIGVsc2UKLQkgICAgb2xkX3N0YXRlID0gc3RhdGU7Ci0JICBzdGF0ZSA9IDU7Ci0JICBQVVQgKGNoKTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIElFRUVfU1RZTEUKLQljYXNlIExFWF9JU19PTkVDSEFSX1FVT1RFOgotCSAgaWYgKHN0YXRlID09IDEwKQotCSAgICB7Ci0JICAgICAgLyogUHJlc2VydmUgdGhlIHdoaXRlc3BhY2UgaW4gZm9vICdiJyAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgY2ggPSBHRVQgKCk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgYWZ0ZXIgYSBvbmUtY2hhcmFjdGVyIHF1b3RlOyBcXDAgaW5zZXJ0ZWQiKSk7Ci0JICAgICAgY2ggPSAwOwotCSAgICB9Ci0JICBpZiAoY2ggPT0gJ1xcJykKLQkgICAgewotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICAgIGlmIChjaCA9PSBFT0YpCi0JCXsKLQkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBlc2NhcGUgY2hhcmFjdGVyIikpOwotCQkgIGNoID0gJ1xcJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJY2ggPSBwcm9jZXNzX2VzY2FwZSAoY2gpOwotCSAgICB9Ci0JICBzcHJpbnRmIChvdXRfYnVmLCAiJWQiLCAoaW50KSAodW5zaWduZWQgY2hhcikgY2gpOwotCi0JICAvKiBOb25lIG9mIHRoZXNlICd4IGNvbnN0YW50cyBmb3IgdXMuICBXZSB3YW50ICd4Jy4gICovCi0JICBpZiAoKGNoID0gR0VUICgpKSAhPSAnXCcnKQotCSAgICB7Ci0jaWZkZWYgUkVRVUlSRV9DSEFSX0NMT1NFX1FVT1RFCi0JICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBjbG9zZSBxdW90ZTogKGFzc3VtZWQpIikpOwotI2Vsc2UKLQkgICAgICBpZiAoY2ggIT0gRU9GKQotCQlVTkdFVCAoY2gpOwotI2VuZGlmCi0JICAgIH0KLQkgIGlmIChzdHJsZW4gKG91dF9idWYpID09IDEpCi0JICAgIHsKLQkgICAgICBQVVQgKG91dF9idWZbMF0pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoc3RhdGUgPT0gOSkKLQkgICAgb2xkX3N0YXRlID0gMzsKLQkgIGVsc2UKLQkgICAgb2xkX3N0YXRlID0gc3RhdGU7Ci0JICBzdGF0ZSA9IC0xOwotCSAgb3V0X3N0cmluZyA9IG91dF9idWY7Ci0JICBQVVQgKCpvdXRfc3RyaW5nKyspOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgTEVYX0lTX0NPTE9OOgotI2lmZGVmIEtFRVBfV0hJVEVfQVJPVU5EX0NPTE9OCi0gICAgICAgICAgc3RhdGUgPSA5OwotI2Vsc2UKLQkgIGlmIChzdGF0ZSA9PSA5IHx8IHN0YXRlID09IDEwKQotCSAgICBzdGF0ZSA9IDM7Ci0JICBlbHNlIGlmIChzdGF0ZSAhPSAzKQotCSAgICBzdGF0ZSA9IDE7Ci0jZW5kaWYKLQkgIFBVVCAoY2gpOwotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19ORVdMSU5FOgotCSAgLyogUm9sbCBvdXQgYSBidW5jaCBvZiBuZXdsaW5lcyBmcm9tIGluc2lkZSBjb21tZW50cywgZXRjLiAgKi8KLQkgIGlmIChhZGRfbmV3bGluZXMpCi0JICAgIHsKLQkgICAgICAtLWFkZF9uZXdsaW5lczsKLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICB9Ci0JICAvKiBmYWxsIHRocnUgaW50by4uLiAqLwotCi0JY2FzZSBMRVhfSVNfTElORV9TRVBBUkFUT1I6Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKGNoKTsKLQkgIGJyZWFrOwotCi0jaWZkZWYgVENfVjg1MAotCWNhc2UgTEVYX0lTX0RPVUJMRURBU0hfMVNUOgotCSAgY2gyID0gR0VUKCk7Ci0JICBpZiAoY2gyICE9ICctJykKLQkgICAgewotCSAgICAgIFVOR0VUIChjaDIpOwotCSAgICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAgIH0KLQkgIC8qIHJlYWQgYW5kIHNraXAgdG8gZW5kIG9mIGxpbmUgKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICBjaCA9IEdFVCAoKTsKLQkgICAgfQotCSAgd2hpbGUgKGNoICE9IEVPRiAmJiBjaCAhPSAnXG4nKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgICB9Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKCdcbicpOwotCSAgYnJlYWs7Ci0jZW5kaWYJICAgIAotI2lmZGVmIERPVUJMRUJBUl9QQVJBTExFTAotCWNhc2UgTEVYX0lTX0RPVUJMRUJBUl8xU1Q6Ci0JICBjaDIgPSBHRVQoKTsKLQkgIGlmIChjaDIgIT0gJ3wnKQotCSAgICB7Ci0JICAgICAgVU5HRVQgKGNoMik7Ci0JICAgICAgZ290byBkZV9mYXVsdDsKLQkgICAgfQotCSAgLyogUmVzZXQgYmFjayB0byBzdGF0ZSAxIGFuZCBwcmV0ZW5kIHRoYXQgd2UgYXJlIHBhcnNpbmcgYSBsaW5lIGZyb20KLQkgICAgIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0IHdoaXRlIHNwYWNlLiAgKi8KLQkgIHN0YXRlID0gMTsKLQkgIFBVVCAoJ3wnKTsKLQkgIFBVVCAoJ3wnKTsKLQkgIGJyZWFrOwotI2VuZGlmCSAgICAKLQljYXNlIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQ6Ci0JICAvKiBGSVhNRS1zb21lZGF5OiBUaGUgdHdvIGNoYXJhY3RlciBjb21tZW50IHN0dWZmIHdhcyBiYWRseQotCSAgICAgdGhvdWdodCBvdXQuICBPbiBpMzg2LCB3ZSB3YW50ICcvJyBhcyBsaW5lIGNvbW1lbnQgc3RhcnQKLQkgICAgIEFORCB3ZSB3YW50IEMgc3R5bGUgY29tbWVudHMuICBoZW5jZSB0aGlzIGhhY2suICBUaGUKLQkgICAgIHdob2xlIGxleGljYWwgcHJvY2VzcyBzaG91bGQgYmUgcmV3b3JrZWQuICB4b3hvcmljaC4gICovCi0JICBpZiAoY2ggPT0gJy8nKQotCSAgICB7Ci0JICAgICAgY2gyID0gR0VUICgpOwotCSAgICAgIGlmIChjaDIgPT0gJyonKQotCQl7Ci0JCSAgb2xkX3N0YXRlID0gMzsKLQkJICBzdGF0ZSA9IC0yOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgVU5HRVQgKGNoMik7Ci0JCX0KLQkgICAgfSAvKiBiYWQgaGFjayAqLwotCi0JICBpZiAoc3RhdGUgPT0gMCB8fCBzdGF0ZSA9PSAxKQkvKiBPbmx5IGNvbW1lbnQgYXQgc3RhcnQgb2YgbGluZS4gICovCi0JICAgIHsKLQkgICAgICBpbnQgc3RhcnRjaDsKLQotCSAgICAgIHN0YXJ0Y2ggPSBjaDsKLQotCSAgICAgIGRvCi0JCXsKLQkJICBjaCA9IEdFVCAoKTsKLQkJfQotCSAgICAgIHdoaWxlIChjaCAhPSBFT0YgJiYgSVNfV0hJVEVTUEFDRSAoY2gpKTsKLQkgICAgICBpZiAoY2ggPT0gRU9GKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudDsgbmV3bGluZSBpbnNlcnRlZCIpKTsKLQkJICBQVVQgKCdcbicpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknIHx8IHN0YXRlICE9IDAgfHwgc3RhcnRjaCAhPSAnIycpCi0JCXsKLQkJICAvKiBOb3QgYSBjcHAgbGluZS4gICovCi0JCSAgd2hpbGUgKGNoICE9IEVPRiAmJiAhSVNfTkVXTElORSAoY2gpKQotCQkgICAgY2ggPSBHRVQgKCk7Ci0JCSAgaWYgKGNoID09IEVPRikKLQkJICAgIGFzX3dhcm4gKF8oIkVPRiBpbiBDb21tZW50OiBOZXdsaW5lIGluc2VydGVkIikpOwotCQkgIHN0YXRlID0gMDsKLQkJICBQVVQgKCdcbicpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogTG9rcyBsaWtlIGAjIDEyMyAiZmlsZW5hbWUiJyBmcm9tIGNwcC4gICovCi0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBvbGRfc3RhdGUgPSA0OwotCSAgICAgIHN0YXRlID0gLTE7Ci0JICAgICAgaWYgKHNjcnViX202OGtfbXJpKQotCQlvdXRfc3RyaW5nID0gIlx0YXBwbGluZSAiOwotCSAgICAgIGVsc2UKLQkJb3V0X3N0cmluZyA9ICJcdC5hcHBsaW5lICI7Ci0JICAgICAgUFVUICgqb3V0X3N0cmluZysrKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0jaWZkZWYgVENfRDEwVgotCSAgLyogQWxsIGluc25zIGVuZCBpbiBhIGNoYXIgZm9yIHdoaWNoIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UIGlzIHRydWUuCi0JICAgICBUcmFwIGlzIHRoZSBvbmx5IHNob3J0IGluc24gdGhhdCBoYXMgYSBmaXJzdCBvcGVyYW5kIHRoYXQgaXMKLQkgICAgIG5laXRoZXIgcmVnaXN0ZXIgbm9yIGxhYmVsLgotCSAgICAgV2UgbXVzdCBwcmV2ZW50IGV4ZWYwZiB8fHRyYXAgIzEgdG8gZGVnZW5lcmF0ZSB0byBleGVmMGYgfHx0cmFwIzEgLgotCSAgICAgV2UgY2FuJ3QgbWFrZSAnIycgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5Ci0JICAgICBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJULiAgSG93ZXZlciwgaXQgaXMgdGhlIG9ubHkgY2hhcmFjdGVyIGluCi0JICAgICBsaW5lX2NvbW1lbnRfY2hhcnMgZm9yIGQxMHYsIGhlbmNlIHdlIGNhbiByZWNvZ25pemUgaXQgYXMgc3VjaC4gICovCi0JICAvKiBBbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB3b3VsZCBiZSB0byByZXNldCB0aGUgc3RhdGUgdG8gMSB3aGVuCi0JICAgICB3ZSBzZWUgJ3x8JywgJzwnLSBvciAnLT4nLCBidXQgdGhhdCBzZWVtcyB0byBiZSBvdmVya2lsbC4gICovCi0JICBpZiAoc3RhdGUgPT0gMTApIFBVVCAoJyAnKTsKLSNlbmRpZgotCSAgLyogV2UgaGF2ZSBhIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgd2hpY2ggaXMgbm90IGF0IHRoZQotCSAgICAgc3RhcnQgb2YgYSBsaW5lLiAgSWYgdGhpcyBpcyBhbHNvIGEgbm9ybWFsIGNvbW1lbnQKLQkgICAgIGNoYXJhY3RlciwgZmFsbCB0aHJvdWdoLiAgT3RoZXJ3aXNlIHRyZWF0IGl0IGFzIGEgZGVmYXVsdAotCSAgICAgY2hhcmFjdGVyLiAgKi8KLQkgIGlmIChzdHJjaHIgKHRjX2NvbW1lbnRfY2hhcnMsIGNoKSA9PSBOVUxMCi0JICAgICAgJiYgKCEgc2NydWJfbTY4a19tcmkKLQkJICB8fCAoY2ggIT0gJyEnICYmIGNoICE9ICcqJykpKQotCSAgICBnb3RvIGRlX2ZhdWx0OwotCSAgaWYgKHNjcnViX202OGtfbXJpCi0JICAgICAgJiYgKGNoID09ICchJyB8fCBjaCA9PSAnKicgfHwgY2ggPT0gJyMnKQotCSAgICAgICYmIHN0YXRlICE9IDEKLQkgICAgICAmJiBzdGF0ZSAhPSAxMCkKLQkgICAgZ290byBkZV9mYXVsdDsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBMRVhfSVNfQ09NTUVOVF9TVEFSVDoKLSNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKLQkgIC8qIE9uIHRoZSBBUk0sIGBAJyBpcyB0aGUgY29tbWVudCBjaGFyYWN0ZXIuCi0JICAgICBVbmZvcnR1bmF0ZWx5IHRoaXMgaXMgYWxzbyBhIHNwZWNpYWwgY2hhcmFjdGVyIGluIEVMRiAuc3ltdmVyCi0JICAgICBkaXJlY3RpdmVzIChhbmQgLnR5cGUsIHRob3VnaCB3ZSBkZWFsIHdpdGggdGhvc2UgYW5vdGhlciB3YXkpLiAgU28KLQkgICAgIHdlIGNoZWNrIGlmIHRoaXMgbGluZSBpcyBzdWNoIGEgZGlyZWN0aXZlLCBhbmQgdHJlYXQgdGhlIGNoYXJhY3RlcgotCSAgICAgYXMgZGVmYXVsdCBpZiBzby4gIFRoaXMgaXMgYSBoYWNrLiAgKi8KLQkgIGlmICgoc3ltdmVyX3N0YXRlICE9IE5VTEwpICYmICgqc3ltdmVyX3N0YXRlID09IDApKQotCSAgICBnb3RvIGRlX2ZhdWx0OwotI2VuZGlmCi0JICBkbwotCSAgICB7Ci0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgIH0KLQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgIUlTX05FV0xJTkUgKGNoKSk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgc3RhdGUgPSAwOwotCSAgUFVUICgnXG4nKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVDoKLQkgIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgY2hhcmFjdGVyIGZvbGxvd2luZyBhbm90aGVyIHN5bWJvbAotCQkgY2hhcmFjdGVyLCB3aXRoIHdoaXRlc3BhY2UgaW4gYmV0d2Vlbi4gIFdlIHNraXBwZWQKLQkJIHRoZSB3aGl0ZXNwYWNlIGVhcmxpZXIsIHNvIG91dHB1dCBpdCBub3cuICAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3RhdGUgPT0gMykKLQkgICAgc3RhdGUgPSA5OwotCi0JICAvKiBUaGlzIGlzIGEgY29tbW9uIGNhc2UuICBRdWlja2x5IGNvcHkgQ0ggYW5kIGFsbCB0aGUKLSAgICAgICAgICAgICBmb2xsb3dpbmcgc3ltYm9sIGNvbXBvbmVudCBvciBub3JtYWwgY2hhcmFjdGVycy4gICovCi0JICBpZiAodG8gKyAxIDwgdG9lbmQKLQkgICAgICAmJiBtcmlfc3RhdGUgPT0gTlVMTAotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotCSAgICAgICYmIHN5bXZlcl9zdGF0ZSA9PSBOVUxMCi0jZW5kaWYKLQkgICAgICApCi0JICAgIHsKLQkgICAgICBjaGFyICpzOwotCSAgICAgIGludCBsZW47Ci0KLQkgICAgICBmb3IgKHMgPSBmcm9tOyBzIDwgZnJvbWVuZDsgcysrKQotCQl7Ci0JCSAgaW50IHR5cGU7Ci0KLQkJICBjaDIgPSAqICh1bnNpZ25lZCBjaGFyICopIHM7Ci0JCSAgdHlwZSA9IGxleFtjaDJdOwotCQkgIGlmICh0eXBlICE9IDAKLQkJICAgICAgJiYgdHlwZSAhPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCkKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgICAgaWYgKHMgPiBmcm9tKQotCQl7Ci0JCSAgLyogSGFuZGxlIHRoZSBsYXN0IGNoYXJhY3RlciBub3JtYWxseSwgZm9yCi0gICAgICAgICAgICAgICAgICAgICBzaW1wbGljaXR5LiAgKi8KLQkJICAtLXM7Ci0JCX0KLQkgICAgICBsZW4gPSBzIC0gZnJvbTsKLQkgICAgICBpZiAobGVuID4gKHRvZW5kIC0gdG8pIC0gMSkKLQkJbGVuID0gKHRvZW5kIC0gdG8pIC0gMTsKLQkgICAgICBpZiAobGVuID4gMCkKLQkJewotCQkgIFBVVCAoY2gpOwotCQkgIGlmIChsZW4gPiA4KQotCQkgICAgewotCQkgICAgICBtZW1jcHkgKHRvLCBmcm9tLCBsZW4pOwotCQkgICAgICB0byArPSBsZW47Ci0JCSAgICAgIGZyb20gKz0gbGVuOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgc3dpdGNoIChsZW4pCi0JCQl7Ci0JCQljYXNlIDg6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgNzogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSA2OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDU6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgNDogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSAzOiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDI6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgMTogKnRvKysgPSAqZnJvbSsrOwotCQkJfQotCQkgICAgfSAKLQkJICBjaCA9IEdFVCAoKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JZGVmYXVsdDoKLQlkZV9mYXVsdDoKLQkgIC8qIFNvbWUgcmVsYXRpdmVseSBgbm9ybWFsJyBjaGFyYWN0ZXIuICAqLwotCSAgaWYgKHN0YXRlID09IDApCi0JICAgIHsKLQkgICAgICBzdGF0ZSA9IDExOwkvKiBOb3cgc2VlaW5nIGxhYmVsIGRlZmluaXRpb24gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhdGUgPT0gMSkKLQkgICAgewotCSAgICAgIHN0YXRlID0gMjsJLyogRGl0dG8gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhdGUgPT0gOSkKLQkgICAgewotCSAgICAgIGlmIChsZXhbY2hdICE9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UKQotCQlzdGF0ZSA9IDM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0YXRlID09IDEwKQotCSAgICB7Ci0JICAgICAgaWYgKGNoID09ICdcXCcpCi0JCXsKLQkJICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBiYWNrc2xhc2g6IGEgYmFja3NsYXNoIG1heQotCQkgICAgIGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBmb3JtYWwgcGFyYW1ldGVyIChvZiBhCi0JCSAgICAgbWFjcm8pIGZvbGxvd2luZyBhbm90aGVyIHN5bWJvbCBjaGFyYWN0ZXIsIHdpdGgKLQkJICAgICB3aGl0ZXNwYWNlIGluIGJldHdlZW4uICBJZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZQotCQkgICAgIG91dHB1dCBhIHNwYWNlIGJlZm9yZSB0aGUgcGFyYW1ldGVyLiAgU3RyaWN0bHkKLQkJICAgICBzcGVha2luZywgY29ycmVjdCBoYW5kbGluZyBkZXBlbmRzIHVwb24gd2hhdCB0aGUKLQkJICAgICBtYWNybyBwYXJhbWV0ZXIgZXhwYW5kcyBpbnRvOyBpZiB0aGUgcGFyYW1ldGVyCi0JCSAgICAgZXhwYW5kcyBpbnRvIHNvbWV0aGluZyB3aGljaCBkb2VzIG5vdCBzdGFydCB3aXRoCi0JCSAgICAgYW4gb3BlcmFuZCBjaGFyYWN0ZXIsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBrZWVwCi0JCSAgICAgdGhlIHNwYWNlLiAgV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8KLQkJICAgICBtYWtlIHRoZSByaWdodCBjaG9pY2UsIHNvIGhlcmUgd2UgYXJlIG1ha2luZyB0aGUKLQkJICAgICBjaG9pY2Ugd2hpY2ggaXMgbW9yZSBsaWtlbHkgdG8gYmUgY29ycmVjdC4gICovCi0JCSAgUFVUICgnICcpOwotCQl9Ci0KLQkgICAgICBzdGF0ZSA9IDM7Ci0JICAgIH0KLQkgIFBVVCAoY2gpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKk5PVFJFQUNIRUQqLwotCi0gZnJvbWVvZjoKLSAgLyogV2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGlucHV0LiAgKi8KLSAgcmV0dXJuIHRvIC0gdG9zdGFydDsKLQotIHRvZnVsbDoKLSAgLyogVGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbC4gIFNhdmUgYW55IGlucHV0IHdlIGhhdmUgbm90IHlldAotICAgICBwcm9jZXNzZWQuICAqLwotICBpZiAoZnJvbWVuZCA+IGZyb20pCi0gICAgewotICAgICAgc2F2ZWRfaW5wdXQgPSBmcm9tOwotICAgICAgc2F2ZWRfaW5wdXRfbGVuID0gZnJvbWVuZCAtIGZyb207Ci0gICAgfQotICBlbHNlCi0gICAgc2F2ZWRfaW5wdXQgPSBOVUxMOwotCi0gIHJldHVybiB0byAtIHRvc3RhcnQ7Ci19Ci0KLS8qIGVuZCBvZiBhcHAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2FzLmMgYi9nYXMvYXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3ZjRiZS4uMDAwMDAwMAotLS0gYS9nYXMvYXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwODMgKzAsMCBAQAotLyogYXMuYyAtIEdBUyBtYWluIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0gKiBNYWluIHByb2dyYW0gZm9yIEFTOyBhIDMyLWJpdCBhc3NlbWJsZXIgb2YgR05VLgotICogVW5kZXJzdGFuZHMgY29tbWFuZCBhcmd1bWVudHMuCi0gKiBIYXMgYSBmZXcgcm91dGluZXMgdGhhdCBkb24ndCBmaXQgaW4gb3RoZXIgbW9kdWxlcyBiZWNhdXNlIHRoZXkKLSAqIGFyZSBzaGFyZWQuCi0gKgotICoKLSAqCQkJYnVncwotICoKLSAqIDogaW5pdGlhbGlzZXJzCi0gKglTaW5jZSBuby1vbmUgZWxzZSBzYXlzIHRoZXkgd2lsbCBzdXBwb3J0IHRoZW0gaW4gZnV0dXJlOiBJCi0gKiBkb24ndCBzdXBwb3J0IHRoZW0gbm93LgotICoKLSAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2RlZmluZSBDT01NT04KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm91dHB1dC1maWxlLmgiCi0jaW5jbHVkZSAic2IuaCIKLSNpbmNsdWRlICJtYWNyby5oIgotCi0jaWZkZWYgSEFWRV9JVEJMX0NQVQotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0jZWxzZQotI2RlZmluZSBpdGJsX3BhcnNlKGl0YmxfZmlsZSkgMQotI2RlZmluZSBpdGJsX2luaXQoKQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NCUksKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLWV4dGVybiBQVFIgc2JyayAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHNob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCBwYXJzZV9hcmdzIFBBUkFNUyAoKGludCAqLCBjaGFyICoqKikpOwotc3RhdGljIHZvaWQgZHVtcF9zdGF0aXN0aWNzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyBQQVJBTVMgKChpbnQgYXJnYywgY2hhciAqKmFyZ3YpKTsKLXN0YXRpYyBpbnQgbWFjcm9fZXhwciBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLQotaW50IGxpc3Rpbmc7CQkJLyogdHJ1ZSBpZiBhIGxpc3RpbmcgaXMgd2FudGVkICovCi0KLXN0YXRpYyBjaGFyICpsaXN0aW5nX2ZpbGVuYW1lID0gTlVMTDsJLyogTmFtZSBvZiBsaXN0aW5nIGZpbGUuICAqLwotCi0vKiBUeXBlIG9mIGRlYnVnZ2luZyB0byBnZW5lcmF0ZS4gICovCi0KLWVudW0gZGVidWdfaW5mb190eXBlIGRlYnVnX3R5cGUgPSBERUJVR19OT05FOwotCi0vKiBNYXhpbXVtIGxldmVsIG9mIG1hY3JvIG5lc3RpbmcuICAqLwotCi1pbnQgbWF4X21hY3JvX25lc3QgPSAxMDA7Ci0KLWNoYXIgKm15bmFtZTsJCQkvKiBhcmd2WzBdICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc2VnVCByZWdfc2VjdGlvbiwgZXhwcl9zZWN0aW9uOwotc2VnVCB0ZXh0X3NlY3Rpb24sIGRhdGFfc2VjdGlvbiwgYnNzX3NlY3Rpb247Ci0jZW5kaWYKLQotLyogVGhlIGRlZmF1bHQgb2JzdGFjayBjaHVuayBzaXplLiAgSWYgd2Ugc2V0IHRoaXMgdG8gemVybywgdGhlCi0gICBvYnN0YWNrIGNvZGUgd2lsbCB1c2Ugd2hhdGV2ZXIgd2lsbCBmaXQgaW4gYSA0MDk2IGJ5dGUgYmxvY2suICAqLwotaW50IGNodW5rc2l6ZSA9IDA7Ci0KLS8qIFRvIG1vbml0b3IgbWVtb3J5IGFsbG9jYXRpb24gbW9yZSBlZmZlY3RpdmVseSwgbWFrZSB0aGlzIG5vbi16ZXJvLgotICAgVGhlbiB0aGUgY2h1bmsgc2l6ZXMgZm9yIGdhcyBhbmQgYmZkIHdpbGwgYmUgcmVkdWNlZC4gICovCi1pbnQgZGVidWdfbWVtb3J5ID0gMDsKLQotLyogV2UgYnVpbGQgYSBsaXN0IG9mIGRlZnN5bXMgYXMgd2UgcmVhZCB0aGUgb3B0aW9ucywgYW5kIHRoZW4gZGVmaW5lCi0gICB0aGVtIGFmdGVyIHdlIGhhdmUgaW5pdGlhbGl6ZWQgZXZlcnl0aGluZy4gICovCi0KLXN0cnVjdCBkZWZzeW1fbGlzdAotewotICBzdHJ1Y3QgZGVmc3ltX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKm5hbWU7Ci0gIHZhbHVlVCB2YWx1ZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVmc3ltX2xpc3QgKmRlZnN5bXM7Ci0KLS8qIEtlZXAgYSByZWNvcmQgb2YgdGhlIGl0YmwgZmlsZXMgd2UgcmVhZCBpbi4gKi8KLQotc3RydWN0IGl0YmxfZmlsZV9saXN0Ci17Ci0gIHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqbmV4dDsKLSAgY2hhciAqbmFtZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9maWxlX2xpc3QgKml0YmxfZmlsZXM7Ci0MCi0jaWZkZWYgVVNFX0VNVUxBVElPTlMKLSNkZWZpbmUgRU1VTEFUSU9OX0VOVklST04gIkFTX0VNVUxBVElPTiIKLQotZXh0ZXJuIHN0cnVjdCBlbXVsYXRpb24gbWlwc2JlbGYsIG1pcHNsZWxmLCBtaXBzZWxmOwotZXh0ZXJuIHN0cnVjdCBlbXVsYXRpb24gbWlwc2JlY29mZiwgbWlwc2xlY29mZiwgbWlwc2Vjb2ZmOwotZXh0ZXJuIHN0cnVjdCBlbXVsYXRpb24gaTM4NmNvZmYsIGkzODZlbGYsIGkzODZhb3V0OwotCi1zdGF0aWMgc3RydWN0IGVtdWxhdGlvbiAqY29uc3QgZW11bGF0aW9uc1tdID0geyBFTVVMQVRJT05TIH07Ci1zdGF0aWMgY29uc3QgaW50IG5fZW11bGF0aW9ucyA9IHNpemVvZiAoZW11bGF0aW9ucykgLyBzaXplb2YgKGVtdWxhdGlvbnNbMF0pOwotCi1zdGF0aWMgdm9pZCBzZWxlY3RfZW11bGF0aW9uX21vZGUgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zZWxlY3RfZW11bGF0aW9uX21vZGUgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKnAsICplbSA9IDA7Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICBpZiAoIXN0cm5jbXAgKCItLWVtIiwgYXJndltpXSwgNCkpCi0gICAgICBicmVhazsKLQotICBpZiAoaSA9PSBhcmdjKQotICAgIGdvdG8gZG9fZGVmYXVsdDsKLQotICBwID0gc3RyY2hyIChhcmd2W2ldLCAnPScpOwotICBpZiAocCkKLSAgICBwKys7Ci0gIGVsc2UKLSAgICBwID0gYXJndltpKzFdOwotCi0gIGlmICghcCB8fCAhKnApCi0gICAgYXNfZmF0YWwgKF8oIm1pc3NpbmcgZW11bGF0aW9uIG1vZGUgbmFtZSIpKTsKLSAgZW0gPSBwOwotCi0gZG9fZGVmYXVsdDoKLSAgaWYgKGVtID09IDApCi0gICAgZW0gPSBnZXRlbnYgKEVNVUxBVElPTl9FTlZJUk9OKTsKLSAgaWYgKGVtID09IDApCi0gICAgZW0gPSBERUZBVUxUX0VNVUxBVElPTjsKLQotICBpZiAoZW0pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IG5fZW11bGF0aW9uczsgaSsrKQotCWlmICghc3RyY21wIChlbXVsYXRpb25zW2ldLT5uYW1lLCBlbSkpCi0JICBicmVhazsKLSAgICAgIGlmIChpID09IG5fZW11bGF0aW9ucykKLQlhc19mYXRhbCAoXygidW5yZWNvZ25pemVkIGVtdWxhdGlvbiBuYW1lIGAlcyciKSwgZW0pOwotICAgICAgdGhpc19lbXVsYXRpb24gPSBlbXVsYXRpb25zW2ldOwotICAgIH0KLSAgZWxzZQotICAgIHRoaXNfZW11bGF0aW9uID0gZW11bGF0aW9uc1swXTsKLQotICB0aGlzX2VtdWxhdGlvbi0+aW5pdCAoKTsKLX0KLQotY29uc3QgY2hhciAqCi1kZWZhdWx0X2VtdWxfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1jb21tb25fZW11bF9pbml0ICgpCi17Ci0gIHRoaXNfZm9ybWF0ID0gdGhpc19lbXVsYXRpb24tPmZvcm1hdDsKLQotICBpZiAodGhpc19lbXVsYXRpb24tPmxlYWRpbmdfdW5kZXJzY29yZSA9PSAyKQotICAgIHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUgPSB0aGlzX2Zvcm1hdC0+ZGZsX2xlYWRpbmdfdW5kZXJzY29yZTsKLQotICBpZiAodGhpc19lbXVsYXRpb24tPmRlZmF1bHRfZW5kaWFuICE9IDIpCi0gICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSB0aGlzX2VtdWxhdGlvbi0+ZGVmYXVsdF9lbmRpYW47Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5mYWtlX2xhYmVsX25hbWUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAodGhpc19lbXVsYXRpb24tPmxlYWRpbmdfdW5kZXJzY29yZSkKLQl0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID0gIkwwXDAwMSI7Ci0gICAgICBlbHNlCi0JLyogV2hhdCBvdGhlciBwYXJhbWV0ZXJzIHNob3VsZCB3ZSB0ZXN0PyAgKi8KLQl0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID0gIi5MMFwwMDEiOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkCi1wcmludF92ZXJzaW9uX2lkICgpCi17Ci0gIHN0YXRpYyBpbnQgcHJpbnRlZDsKLSAgaWYgKHByaW50ZWQpCi0gICAgcmV0dXJuOwotICBwcmludGVkID0gMTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSB1c2luZyBCRkQgdmVyc2lvbiAlcyIpLAotCSAgIFZFUlNJT04sIFRBUkdFVF9BTElBUywgQkZEX1ZFUlNJT04pOwotI2Vsc2UKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSIpLCBWRVJTSU9OLCBUQVJHRVRfQUxJQVMpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJVc2FnZTogJXMgW29wdGlvbi4uLl0gW2FzbWZpbGUuLi5dXG4iKSwgbXluYW1lKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLU9wdGlvbnM6XG5cCi0gIC1hW3N1Yi1vcHRpb24uLi5dCSAgdHVybiBvbiBsaXN0aW5nc1xuXAotICAgICAgICAgICAgICAgICAgICAgIAkgIFN1Yi1vcHRpb25zIFtkZWZhdWx0IGhsc106XG5cCi0gICAgICAgICAgICAgICAgICAgICAgCSAgYyAgICAgIG9taXQgZmFsc2UgY29uZGl0aW9uYWxzXG5cCi0gICAgICAgICAgICAgICAgICAgICAgCSAgZCAgICAgIG9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXNcblwKLSAgICAgICAgICAgICAgICAgICAgICAJICBoICAgICAgaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZVxuXAotICAgICAgICAgICAgICAgICAgICAgIAkgIGwgICAgICBpbmNsdWRlIGFzc2VtYmx5XG5cCi0gICAgICAgICAgICAgICAgICAgICAgCSAgbSAgICAgIGluY2x1ZGUgbWFjcm8gZXhwYW5zaW9uc1xuXAotICAgICAgICAgICAgICAgICAgICAgIAkgIG4gICAgICBvbWl0IGZvcm1zIHByb2Nlc3NpbmdcblwKLSAgICAgICAgICAgICAgICAgICAgICAJICBzICAgICAgaW5jbHVkZSBzeW1ib2xzXG5cCi0gICAgICAgICAgICAgICAgICAgICAgCSAgTCAgICAgIGluY2x1ZGUgbGluZSBkZWJ1ZyBzdGF0aXN0aWNzIChpZiBhcHBsaWNhYmxlKVxuXAotICAgICAgICAgICAgICAgICAgICAgIAkgID1GSUxFICBsaXN0IHRvIEZJTEUgKG11c3QgYmUgbGFzdCBzdWItb3B0aW9uKVxuIikpOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtRCAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlIGFzc2VtYmxlciBkZWJ1Z2dpbmcgbWVzc2FnZXNcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC0tZGVmc3ltIFNZTT1WQUwgICAgICAgIGRlZmluZSBzeW1ib2wgU1lNIHRvIGdpdmVuIHZhbHVlXG4iKSk7Ci0jaWZkZWYgVVNFX0VNVUxBVElPTlMKLSAgewotICAgIGludCBpOwotICAgIGNoYXIgKmRlZl9lbTsKLQotICAgIGZwcmludGYgKHN0cmVhbSwgIlwKLSAgLS1lbT1bIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5fZW11bGF0aW9ucy0xOyBpKyspCi0gICAgICBmcHJpbnRmIChzdHJlYW0sICIlcyB8ICIsIGVtdWxhdGlvbnNbaV0tPm5hbWUpOwotICAgIGZwcmludGYgKHN0cmVhbSwgIiVzXVxuIiwgZW11bGF0aW9uc1tpXS0+bmFtZSk7Ci0KLSAgICBkZWZfZW0gPSBnZXRlbnYgKEVNVUxBVElPTl9FTlZJUk9OKTsKLSAgICBpZiAoIWRlZl9lbSkgCi0gICAgICBkZWZfZW0gPSBERUZBVUxUX0VNVUxBVElPTjsKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW11bGF0ZSBvdXRwdXQgKGRlZmF1bHQgJXMpXG4iKSwgZGVmX2VtKTsKLSAgfQotI2VuZGlmCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtZiAgICAgICAgICAgICAgICAgICAgICBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZ1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLS1nc3RhYnMgICAgICAgICAgICAgICAgZ2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLWdkd2FyZjIgICAgICAgICAgICAgICBnZW5lcmF0ZSBEV0FSRjIgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLWhlbHAgICAgICAgICAgICAgICAgICBzaG93IHRoaXMgbWVzc2FnZSBhbmQgZXhpdFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLUkgRElSICAgICAgICAgICAgICAgICAgYWRkIERJUiB0byBzZWFyY2ggbGlzdCBmb3IgLmluY2x1ZGUgZGlyZWN0aXZlc1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLUogICAgICAgICAgICAgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3dcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1LICAgICAgICAgICAgICAgICAgICAgIHdhcm4gd2hlbiBkaWZmZXJlbmNlcyBhbHRlcmVkIGZvciBsb25nIGRpc3BsYWNlbWVudHNcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1MLC0ta2VlcC1sb2NhbHMgICAgICAgIGtlZXAgbG9jYWwgc3ltYm9scyAoZS5nLiBzdGFydGluZyB3aXRoIGBMJylcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1NLC0tbXJpICAgICAgICAgICAgICAgIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC0tTUQgRklMRSAgICAgICAgICAgICAgIHdyaXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaW4gRklMRSAoZGVmYXVsdCBub25lKVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLW5vY3BwICAgICAgICAgICAgICAgICAgaWdub3JlZFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLW8gT0JKRklMRSAgICAgICAgICAgICAgbmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IE9CSkZJTEUgKGRlZmF1bHQgYS5vdXQpXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtUiAgICAgICAgICAgICAgICAgICAgICBmb2xkIGRhdGEgc2VjdGlvbiBpbnRvIHRleHQgc2VjdGlvblxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLS1zdGF0aXN0aWNzICAgICAgICAgICAgcHJpbnQgdmFyaW91cyBtZWFzdXJlZCBzdGF0aXN0aWNzIGZyb20gZXhlY3V0aW9uXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLXN0cmlwLWxvY2FsLWFic29sdXRlICBzdHJpcCBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLXRyYWRpdGlvbmFsLWZvcm1hdCAgICBVc2Ugc2FtZSBmb3JtYXQgYXMgbmF0aXZlIGFzc2VtYmxlciB3aGVuIHBvc3NpYmxlXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1XICAtLW5vLXdhcm4gICAgICAgICAgIHN1cHByZXNzIHdhcm5pbmdzXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLXdhcm4gICAgICAgICAgICAgICAgICBkb24ndCBzdXBwcmVzcyB3YXJuaW5nc1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLS1mYXRhbC13YXJuaW5ncyAgICAgICAgdHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLWl0YmwgSU5TVFRCTCAgICAgICAgICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nIHRoZSBzcGVjaWZpY2F0aW9ucyBkZWZpbmVkIGluIGZpbGUgSU5TVFRCTFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLXcgICAgICAgICAgICAgICAgICAgICAgaWdub3JlZFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVggICAgICAgICAgICAgICAgICAgICAgaWdub3JlZFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVogICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnNcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC0tbGlzdGluZy1saHMtd2lkdGggICAgIHNldCB0aGUgd2lkdGggaW4gd29yZHMgb2YgdGhlIG91dHB1dCBkYXRhIGNvbHVtbiBvZlxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdGluZ1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLS1saXN0aW5nLWxocy13aWR0aDIgICAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgY29udGludWF0aW9uIGxpbmVzXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW47IGlnbm9yZWQgaWYgc21hbGxlciB0aGFuXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgbGluZVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLS1saXN0aW5nLXJocy13aWR0aCAgICAgc2V0IHRoZSBtYXggd2lkdGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbGluZXMgZnJvbVxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc291cmNlIGZpbGVcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC0tbGlzdGluZy1jb250LWxpbmVzICAgIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29udGludWF0aW9uIGxpbmVzIHVzZWRcblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW4gb2YgdGhlIGxpc3RpbmdcbiIpKTsKLQotICBtZF9zaG93X3VzYWdlIChzdHJlYW0pOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXG5SZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLX0KLQotLyoKLSAqIFNpbmNlIGl0IGlzIGVhc3kgdG8gZG8gaGVyZSB3ZSBpbnRlcnByZXQgdGhlIHNwZWNpYWwgYXJnICItIgotICogdG8gbWVhbiAidXNlIHN0ZGluIiBhbmQgd2Ugc2V0IHRoYXQgYXJndltdIHBvaW50aW5nIHRvICIiLgotICogQWZ0ZXIgd2UgaGF2ZSBtdW5nZWQgYXJndltdLCB0aGUgb25seSB0aGluZ3MgbGVmdCBhcmUgc291cmNlIGZpbGUKLSAqIG5hbWUocykgYW5kICIiKHMpIGRlbm90aW5nIHN0ZGluLiBUaGVzZSBmaWxlIG5hbWVzIGFyZSB1c2VkCi0gKiAocGVyaGFwcyBtb3JlIHRoYW4gb25jZSkgbGF0ZXIuCi0gKgotICogY2hlY2sgZm9yIG5ldyBtYWNoaW5lLWRlcCBjbWRsaW5lIG9wdGlvbnMgaW4KLSAqIG1kX3BhcnNlX29wdGlvbiBkZWZpbml0aW9ucyBpbiBjb25maWcvdGMtKi5jCi0gKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MgKHBhcmdjLCBwYXJndikKLSAgICAgaW50ICpwYXJnYzsKLSAgICAgY2hhciAqKipwYXJndjsKLXsKLSAgaW50IG9sZF9hcmdjLCBuZXdfYXJnYzsKLSAgY2hhciAqKm9sZF9hcmd2LCAqKm5ld19hcmd2OwotCi0gIC8qIFN0YXJ0aW5nIHRoZSBzaG9ydCBvcHRpb24gc3RyaW5nIHdpdGggJy0nIGlzIGZvciBwcm9ncmFtcyB0aGF0Ci0gICAgIGV4cGVjdCBvcHRpb25zIGFuZCBvdGhlciBBUkdWLWVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgdGhhdCBjYXJlIGFib3V0Ci0gICAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAotICAgICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLiAgKi8KLQotICBjaGFyICpzaG9ydG9wdHM7Ci0gIGV4dGVybiBDT05TVCBjaGFyICptZF9zaG9ydG9wdHM7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIHN0ZF9zaG9ydG9wdHNbXSA9Ci0gICAgewotICAgICAgJy0nLCAnSicsCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICAgIC8qIC1LIGlzIG5vdCBtZWFuaW5nZnVsIGlmIC53b3JkIGlzIG5vdCBiZWluZyBoYWNrZWQuICAqLwotICAgICAgJ0snLAotI2VuZGlmCi0gICAgICAnTCcsICdNJywgJ1InLCAnVycsICdaJywgJ2YnLCAnYScsICc6JywgJzonLCAnRCcsICdJJywgJzonLCAnbycsICc6JywKLSNpZm5kZWYgVk1TCi0gICAgICAvKiAtdiB0YWtlcyBhbiBhcmd1bWVudCBvbiBWTVMsIHNvIHdlIGRvbid0IG1ha2UgaXQgYSBnZW5lcmljCi0gICAgICAgICBvcHRpb24uICAqLwotICAgICAgJ3YnLAotI2VuZGlmCi0gICAgICAndycsICdYJywKLSAgICAgIC8qIE5ldyBvcHRpb24gZm9yIGV4dGVuZGluZyBpbnN0cnVjdGlvbiBzZXQgKHNlZSBhbHNvIC0taXRibCBiZWxvdykgKi8KLSAgICAgICd0JywgJzonLAotICAgICAgJ1wwJwotICAgIH07Ci0gIHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzOwotICBleHRlcm4gc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdOwotICBleHRlcm4gc2l6ZV90IG1kX2xvbmdvcHRzX3NpemU7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIHN0ZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fSEVMUCAoT1BUSU9OX1NURF9CQVNFKQotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVMUH0sCi0gICAgeyJrZWVwLWxvY2FscyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTCd9LAotICAgIHsibXJpIiwgbm9fYXJndW1lbnQsIE5VTEwsICdNJ30sCi0jZGVmaW5lIE9QVElPTl9OT0NQUCAoT1BUSU9OX1NURF9CQVNFICsgMSkKLSAgICB7Im5vY3BwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0NQUH0sCi0jZGVmaW5lIE9QVElPTl9TVEFUSVNUSUNTIChPUFRJT05fU1REX0JBU0UgKyAyKQotICAgIHsic3RhdGlzdGljcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBVElTVElDU30sCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OIChPUFRJT05fU1REX0JBU0UgKyAzKQotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSU0lPTn0sCi0jZGVmaW5lIE9QVElPTl9EVU1QQ09ORklHIChPUFRJT05fU1REX0JBU0UgKyA0KQotICAgIHsiZHVtcC1jb25maWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RVTVBDT05GSUd9LAotI2RlZmluZSBPUFRJT05fVkVSQk9TRSAoT1BUSU9OX1NURF9CQVNFICsgNSkKLSAgICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAotI2RlZmluZSBPUFRJT05fRU1VTEFUSU9OIChPUFRJT05fU1REX0JBU0UgKyA2KQotICAgIHsiZW11bGF0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTVVMQVRJT059LAotI2RlZmluZSBPUFRJT05fREVGU1lNIChPUFRJT05fU1REX0JBU0UgKyA3KQotICAgIHsiZGVmc3ltIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERUZTWU19LAotI2RlZmluZSBPUFRJT05fSU5TVFRCTCAoT1BUSU9OX1NURF9CQVNFICsgOCkKLSAgICAvKiBOZXcgb3B0aW9uIGZvciBleHRlbmRpbmcgaW5zdHJ1Y3Rpb24gc2V0IChzZWUgYWxzbyAtdCBhYm92ZSkuCi0gICAgICAgVGhlICItdCBmaWxlIiBvciAiLS1pdGJsIGZpbGUiIG9wdGlvbiBleHRlbmRzIHRoZSBiYXNpYyBzZXQgb2YKLSAgICAgICB2YWxpZCBpbnN0cnVjdGlvbnMgYnkgcmVhZGluZyAiZmlsZSIsIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgYQotICAgICAgIGxpc3Qgb2YgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIFRoZSBhZGRpdGlvbmFsIG9wY29kZXMgYW5kIHRoZWlyCi0gICAgICAgZm9ybWF0cyBhcmUgYWRkZWQgdG8gdGhlIGJ1aWx0LWluIHNldCBvZiBpbnN0cnVjdGlvbnMsIGFuZAotICAgICAgIG1uZW1vbmljcyBmb3IgbmV3IHJlZ2lzdGVycyBtYXkgYWxzbyBiZSBkZWZpbmVkLiAgKi8KLSAgICB7Iml0YmwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lOU1RUQkx9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDkpCi0gICAgeyJsaXN0aW5nLWxocy13aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElTVElOR19MSFNfV0lEVEh9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyIChPUFRJT05fU1REX0JBU0UgKyAxMCkKLSAgICB7Imxpc3RpbmctbGhzLXdpZHRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSDJ9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDExKQotICAgIHsibGlzdGluZy1yaHMtd2lkdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfUkhTX1dJRFRIfSwKLSNkZWZpbmUgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUyAoT1BUSU9OX1NURF9CQVNFICsgMTIpCi0gICAgeyJsaXN0aW5nLWNvbnQtbGluZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FU30sCi0jZGVmaW5lIE9QVElPTl9ERVBGSUxFIChPUFRJT05fU1REX0JBU0UgKyAxMykKLSAgICB7Ik1EIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERVBGSUxFfSwKLSNkZWZpbmUgT1BUSU9OX0dTVEFCUyAoT1BUSU9OX1NURF9CQVNFICsgMTQpCi0gICAgeyJnc3RhYnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dTVEFCU30sCi0jZGVmaW5lIE9QVElPTl9TVFJJUF9MT0NBTF9BQlNPTFVURSAoT1BUSU9OX1NURF9CQVNFICsgMTUpCi0gICAgeyJzdHJpcC1sb2NhbC1hYnNvbHV0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RSSVBfTE9DQUxfQUJTT0xVVEV9LAotI2RlZmluZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUIChPUFRJT05fU1REX0JBU0UgKyAxNikKLSAgICB7InRyYWRpdGlvbmFsLWZvcm1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUfSwKLSNkZWZpbmUgT1BUSU9OX0dEV0FSRjIgKE9QVElPTl9TVERfQkFTRSArIDE3KQotICAgIHsiZ2R3YXJmMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fR0RXQVJGMn0sCi0gICAgeyJuby13YXJuIiwgbm9fYXJndW1lbnQsIE5VTEwsICdXJ30sCi0jZGVmaW5lIE9QVElPTl9XQVJOIChPUFRJT05fU1REX0JBU0UgKyAxOCkKLSAgICB7Indhcm4iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk59LAotI2RlZmluZSBPUFRJT05fV0FSTl9GQVRBTCAoT1BUSU9OX1NURF9CQVNFICsgMTkpCi0gICAgeyJmYXRhbC13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9GQVRBTH0KLSAgfTsKLQotICAvKiBDb25zdHJ1Y3QgdGhlIG9wdGlvbiBsaXN0cyBmcm9tIHRoZSBzdGFuZGFyZCBsaXN0IGFuZCB0aGUKLSAgICAgdGFyZ2V0IGRlcGVuZGVudCBsaXN0LiAgKi8KLSAgc2hvcnRvcHRzID0gY29uY2F0IChzdGRfc2hvcnRvcHRzLCBtZF9zaG9ydG9wdHMsIChjaGFyICopIE5VTEwpOwotICBsb25nb3B0cyA9IChzdHJ1Y3Qgb3B0aW9uICopIHhtYWxsb2MgKHNpemVvZiAoc3RkX2xvbmdvcHRzKSArIG1kX2xvbmdvcHRzX3NpemUpOwotICBtZW1jcHkgKGxvbmdvcHRzLCBzdGRfbG9uZ29wdHMsIHNpemVvZiAoc3RkX2xvbmdvcHRzKSk7Ci0gIG1lbWNweSAoKGNoYXIgKikgbG9uZ29wdHMgKyBzaXplb2YgKHN0ZF9sb25nb3B0cyksCi0JICBtZF9sb25nb3B0cywgbWRfbG9uZ29wdHNfc2l6ZSk7Ci0KLSAgLyogTWFrZSBhIGxvY2FsIGNvcHkgb2YgdGhlIG9sZCBhcmd2LiAgKi8KLSAgb2xkX2FyZ2MgPSAqcGFyZ2M7Ci0gIG9sZF9hcmd2ID0gKnBhcmd2OwotCi0gIC8qIEluaXRpYWxpemUgYSBuZXcgYXJndiB0aGF0IGNvbnRhaW5zIG5vIG9wdGlvbnMuICAqLwotICBuZXdfYXJndiA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiAob2xkX2FyZ2MgKyAxKSk7Ci0gIG5ld19hcmd2WzBdID0gb2xkX2FyZ3ZbMF07Ci0gIG5ld19hcmdjID0gMTsKLSAgbmV3X2FyZ3ZbbmV3X2FyZ2NdID0gTlVMTDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBnZXRvcHRfbG9uZ19vbmx5IGlzIGxpa2UgZ2V0b3B0X2xvbmcsIGJ1dCAnLScgYXMgd2VsbCBhcyAnLS0nIGNhbgotCSBpbmRpY2F0ZSBhIGxvbmcgb3B0aW9uLiAgKi8KLSAgICAgIGludCBsb25naW5kOwotICAgICAgaW50IG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChvbGRfYXJnYywgb2xkX2FyZ3YsIHNob3J0b3B0cywgbG9uZ29wdHMsCi0JCQkJICAgJmxvbmdpbmQpOwotCi0gICAgICBpZiAob3B0YyA9PSAtMSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChvcHRjKQotCXsKLQlkZWZhdWx0OgotCSAgLyogbWRfcGFyc2Vfb3B0aW9uIHNob3VsZCByZXR1cm4gMSBpZiBpdCByZWNvZ25pemVzIG9wdGMsCi0JICAgICAwIGlmIG5vdC4gICovCi0JICBpZiAobWRfcGFyc2Vfb3B0aW9uIChvcHRjLCBvcHRhcmcpICE9IDApCi0JICAgIGJyZWFrOwotCSAgLyogYC12JyBpc24ndCBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhbCBzaG9ydF9vcHRzIGxpc3QsIHNvIGNoZWNrIGZvcgotCSAgICAgaXQgZXhwbGljaXR5IGhlcmUgYmVmb3JlIGRlY2lkaW5nIHdlJ3ZlIGdvdHRlbiBhIGJhZCBhcmd1bWVudC4gICovCi0JICBpZiAob3B0YyA9PSAndicpCi0JICAgIHsKLSNpZmRlZiBWTVMKLQkgICAgICAvKiBUZWxsaW5nIGdldG9wdCB0byB0cmVhdCAtdidzIHZhbHVlIGFzIG9wdGlvbmFsIGNhbiByZXN1bHQKLQkJIGluIGl0IHBpY2tpbmcgdXAgYSBmb2xsb3dpbmcgZmlsZW5hbWUgYXJndW1lbnQgaGVyZS4gIFRoZQotCQkgVk1TIGNvZGUgaW4gbWRfcGFyc2Vfb3B0aW9uIGNhbiByZXR1cm4gMCBpbiB0aGF0IGNhc2UsCi0JCSBidXQgaXQgaGFzIG5vIHdheSBvZiBwdXNoaW5nIHRoZSBmaWxlbmFtZSBhcmd1bWVudCBiYWNrLiAgKi8KLQkgICAgICBpZiAob3B0YXJnICYmICpvcHRhcmcpCi0JCW5ld19hcmd2W25ld19hcmdjKytdID0gb3B0YXJnLCAgbmV3X2FyZ3ZbbmV3X2FyZ2NdID0gTlVMTDsKLQkgICAgICBlbHNlCi0jZWxzZQotCSAgICAgIGNhc2UgJ3YnOgotI2VuZGlmCi0JICAgICAgY2FzZSBPUFRJT05fVkVSQk9TRToKLQkJcHJpbnRfdmVyc2lvbl9pZCAoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLypGQUxMVEhSVSovCi0KLQljYXNlICc/JzoKLQkgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0KLQljYXNlIDE6CQkJLyogRmlsZSBuYW1lLiAgKi8KLQkgIGlmICghc3RyY21wIChvcHRhcmcsICItIikpCi0JICAgIG9wdGFyZyA9ICIiOwotCSAgbmV3X2FyZ3ZbbmV3X2FyZ2MrK10gPSBvcHRhcmc7Ci0JICBuZXdfYXJndltuZXdfYXJnY10gPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9IRUxQOgotCSAgc2hvd191c2FnZSAoc3Rkb3V0KTsKLQkgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci0KLQljYXNlIE9QVElPTl9OT0NQUDoKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fU1RBVElTVElDUzoKLQkgIGZsYWdfcHJpbnRfc3RhdGlzdGljcyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1NUUklQX0xPQ0FMX0FCU09MVVRFOgotCSAgZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVDoKLQkgIGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0ID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBhc3NlbWJsZXIgJXNcbiIpLCBWRVJTSU9OKTsKLQkgIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0JICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKLQkgIHByaW50ZiAoXygiVGhpcyBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQgZm9yIGEgdGFyZ2V0IG9mIGAlcycuXG4iKSwKLQkJICBUQVJHRVRfQUxJQVMpOwotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX0VNVUxBVElPTjoKLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotCSAgaWYgKHN0cmNtcCAob3B0YXJnLCB0aGlzX2VtdWxhdGlvbi0+bmFtZSkpCi0JICAgIGFzX2ZhdGFsIChfKCJtdWx0aXBsZSBlbXVsYXRpb24gbmFtZXMgc3BlY2lmaWVkIikpOwotI2Vsc2UKLQkgIGFzX2ZhdGFsIChfKCJlbXVsYXRpb25zIG5vdCBoYW5kbGVkIGluIHRoaXMgY29uZmlndXJhdGlvbiIpKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9EVU1QQ09ORklHOgotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJhbGlhcyA9ICVzXG4iKSwgVEFSR0VUX0FMSUFTKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiY2Fub25pY2FsID0gJXNcbiIpLCBUQVJHRVRfQ0FOT05JQ0FMKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiY3B1LXR5cGUgPSAlc1xuIiksIFRBUkdFVF9DUFUpOwotI2lmZGVmIFRBUkdFVF9PQkpfRk9STUFUCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oImZvcm1hdCA9ICVzXG4iKSwgVEFSR0VUX09CSl9GT1JNQVQpOwotI2VuZGlmCi0jaWZkZWYgVEFSR0VUX0ZPUk1BVAotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJiZmQtdGFyZ2V0ID0gJXNcbiIpLCBUQVJHRVRfRk9STUFUKTsKLSNlbmRpZgotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX0RFRlNZTToKLQkgIHsKLQkgICAgY2hhciAqczsKLQkgICAgbG9uZyBpOwotCSAgICBzdHJ1Y3QgZGVmc3ltX2xpc3QgKm47Ci0KLQkgICAgZm9yIChzID0gb3B0YXJnOyAqcyAhPSAnXDAnICYmICpzICE9ICc9JzsgcysrKQotCSAgICAgIDsKLQkgICAgaWYgKCpzID09ICdcMCcpCi0JICAgICAgYXNfZmF0YWwgKF8oImJhZCBkZWZzeW07IGZvcm1hdCBpcyAtLWRlZnN5bSBuYW1lPXZhbHVlIikpOwotCSAgICAqcysrID0gJ1wwJzsKLQkgICAgaSA9IHN0cnRvbCAocywgKGNoYXIgKiopIE5VTEwsIDApOwotCSAgICBuID0gKHN0cnVjdCBkZWZzeW1fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gZGVmc3ltczsKLQkgICAgbi0+bmFtZSA9IG9wdGFyZzsKLQkgICAgbi0+dmFsdWUgPSBpOwotCSAgICBkZWZzeW1zID0gbjsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSU5TVFRCTDoKLQljYXNlICd0JzoKLQkgIHsKLQkgICAgLyogb3B0YXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluc3RydWN0aW9uIAotCSAgICAgICBmb3JtYXRzLCBvcGNvZGVzLCByZWdpc3RlciBuYW1lcywgZXRjLiAqLwotCSAgICBzdHJ1Y3QgaXRibF9maWxlX2xpc3QgKm47Ci0KLQkgICAgaWYgKG9wdGFyZyA9PSBOVUxMKQotCSAgICAgIHsKLQkJYXNfd2FybiAoIF8oIk5vIGZpbGUgbmFtZSBmb2xsb3dpbmcgLXQgb3B0aW9uXG4iKSApOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIAotCSAgICBuID0gKHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gaXRibF9maWxlczsKLQkgICAgbi0+bmFtZSA9IG9wdGFyZzsKLQkgICAgaXRibF9maWxlcyA9IG47Ci0KLQkgICAgLyogUGFyc2UgdGhlIGZpbGUgYW5kIGFkZCB0aGUgbmV3IGluc3RydWN0aW9ucyB0byBvdXIgaW50ZXJuYWwKLQkgICAgICAgdGFibGUuICBJZiBtdWx0aXBsZSBpbnN0cnVjdGlvbiB0YWJsZXMgYXJlIHNwZWNpZmllZCwgdGhlIAotCSAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgdGFibGUgZ2V0cyBhcHBlbmRlZCBvbnRvIHRoZSBleGlzdGluZyAKLQkgICAgICAgaW50ZXJuYWwgdGFibGUuICovCi0JICAgIGl0YmxfZmlsZXMtPm5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgICBpZiAoaXRibF9wYXJzZSAoaXRibF9maWxlcy0+bmFtZSkgIT0gMCkKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0ZGVyciwgXygiRmFpbGVkIHRvIHJlYWQgaW5zdHJ1Y3Rpb24gdGFibGUgJXNcbiIpLCAKLQkJCSBpdGJsX2ZpbGVzLT5uYW1lKTsKLQkJZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0RFUEZJTEU6Ci0JICBzdGFydF9kZXBlbmRlbmNpZXMgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0dTVEFCUzoKLQkgIGRlYnVnX3R5cGUgPSBERUJVR19TVEFCUzsKLQkgIGJyZWFrOwotIAotCWNhc2UgT1BUSU9OX0dEV0FSRjI6Ci0JICBkZWJ1Z190eXBlID0gREVCVUdfRFdBUkYyOwotCSAgYnJlYWs7Ci0KLQljYXNlICdKJzoKLQkgIGZsYWdfc2lnbmVkX292ZXJmbG93X29rID0gMTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLQljYXNlICdLJzoKLQkgIGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQgPSAxOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgJ0wnOgotCSAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0xJU1RJTkdfTEhTX1dJRFRIOgotCSAgbGlzdGluZ19saHNfd2lkdGggPSBhdG9pKG9wdGFyZyk7Ci0JICBpZiAobGlzdGluZ19saHNfd2lkdGhfc2Vjb25kIDwgbGlzdGluZ19saHNfd2lkdGgpCi0JICAgIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IGxpc3RpbmdfbGhzX3dpZHRoOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyOgotCSAgewotCSAgICBpbnQgdG1wID0gYXRvaShvcHRhcmcpOwotCSAgICBpZiAodG1wID4gbGlzdGluZ19saHNfd2lkdGgpCi0JICAgICAgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kID0gdG1wOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEg6Ci0JICBsaXN0aW5nX3Joc193aWR0aCA9IGF0b2kob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUzoKLQkgIGxpc3RpbmdfbGhzX2NvbnRfbGluZXMgPSBhdG9pKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ00nOgotCSAgZmxhZ19tcmkgPSAxOwotI2lmZGVmIFRDX002OEsKLQkgIGZsYWdfbTY4a19tcmkgPSAxOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgJ1InOgotCSAgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdXJzoKLQkgIGZsYWdfbm9fd2FybmluZ3MgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9XQVJOOgotCSAgZmxhZ19ub193YXJuaW5ncyA9IDA7Ci0JICBmbGFnX2ZhdGFsX3dhcm5pbmdzID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fV0FSTl9GQVRBTDoKLQkgIGZsYWdfbm9fd2FybmluZ3MgPSAwOwotCSAgZmxhZ19mYXRhbF93YXJuaW5ncyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ1onOgotCSAgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0ID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYSc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKCpvcHRhcmcpCi0JCXsKLQkJICBzd2l0Y2ggKCpvcHRhcmcpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdjJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX05PQ09ORDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX05PREVCVUc7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnaCc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19ITEw7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbCc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19MSVNUSU5HOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ20nOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTUFDRVhQOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ24nOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTk9GT1JNOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfU1lNQk9MUzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICc9JzoKLQkJICAgICAgbGlzdGluZ19maWxlbmFtZSA9IHhzdHJkdXAgKG9wdGFyZyArIDEpOwotCQkgICAgICBvcHRhcmcgKz0gc3RybGVuIChsaXN0aW5nX2ZpbGVuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBhc19mYXRhbCAoXygiaW52YWxpZCBsaXN0aW5nIG9wdGlvbiBgJWMnIiksICpvcHRhcmcpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBvcHRhcmcrKzsKLQkJfQotCSAgICB9Ci0JICBpZiAoIWxpc3RpbmcpCi0JICAgIGxpc3RpbmcgPSBMSVNUSU5HX0RFRkFVTFQ7Ci0JICBicmVhazsKLQotCWNhc2UgJ0QnOgotCSAgLyogREVCVUcgaXMgaW1wbGVtZW50ZWQ6IGl0IGRlYnVncyBkaWZmZXJlbnQgKi8KLQkgIC8qIHRoaW5ncyBmcm9tIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuICovCi0JICBmbGFnX2RlYnVnID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZic6Ci0JICBmbGFnX25vX2NvbW1lbnRzID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnSSc6Ci0JICB7CQkJLyogSW5jbHVkZSBmaWxlIGRpcmVjdG9yeSAqLwotCSAgICBjaGFyICp0ZW1wID0geHN0cmR1cCAob3B0YXJnKTsKLQkgICAgYWRkX2luY2x1ZGVfZGlyICh0ZW1wKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlICdvJzoKLQkgIG91dF9maWxlX25hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICd3JzoKLQkgIGJyZWFrOwotCi0JY2FzZSAnWCc6Ci0JICAvKiAtWCBtZWFucyB0cmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMgKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAoc2hvcnRvcHRzKTsKLSAgZnJlZSAobG9uZ29wdHMpOwotCi0gICpwYXJnYyA9IG5ld19hcmdjOwotICAqcGFyZ3YgPSBuZXdfYXJndjsKLX0KLQotc3RhdGljIGxvbmcgc3RhcnRfdGltZTsKLQotaW50IAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgbWFjcm9fYWx0ZXJuYXRlOwotICBpbnQgbWFjcm9fc3RyaXBfYXQ7Ci0gIGludCBrZWVwX2l0OwotCi0gIHN0YXJ0X3RpbWUgPSBnZXRfcnVuX3RpbWUgKCk7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBpZiAoZGVidWdfbWVtb3J5KQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBleHRlcm4gbG9uZyBfYmZkX2NodW5rc2l6ZTsKLSAgICAgIF9iZmRfY2h1bmtzaXplID0gNjQ7Ci0jZW5kaWYKLSAgICAgIGNodW5rc2l6ZSA9IDY0OwotICAgIH0KLQotI2lmZGVmIEhPU1RfU1BFQ0lBTF9JTklUCi0gIEhPU1RfU1BFQ0lBTF9JTklUIChhcmdjLCBhcmd2KTsKLSNlbmRpZgotCi0gIG15bmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAobXluYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAobXluYW1lLCAwKTsKLQotI2lmbmRlZiBPQkpfREVGQVVMVF9PVVRQVVRfRklMRV9OQU1FCi0jZGVmaW5lIE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUUgImEub3V0IgotI2VuZGlmCi0KLSAgb3V0X2ZpbGVfbmFtZSA9IE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUU7Ci0KLSAgaGV4X2luaXQgKCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfaW5pdCAoKTsKLSAgYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUgKG15bmFtZSk7Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9FTVVMQVRJT05TCi0gIHNlbGVjdF9lbXVsYXRpb25fbW9kZSAoYXJnYywgYXJndik7Ci0jZW5kaWYKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHN5bWJvbF9iZWdpbiAoKTsKLSAgZnJhZ19pbml0ICgpOwotICBzdWJzZWdzX2JlZ2luICgpOwotICBwYXJzZV9hcmdzICgmYXJnYywgJmFyZ3YpOyAKLSAgcmVhZF9iZWdpbiAoKTsKLSAgaW5wdXRfc2NydWJfYmVnaW4gKCk7Ci0gIGV4cHJfYmVnaW4gKCk7Ci0KLSAgaWYgKGZsYWdfcHJpbnRfc3RhdGlzdGljcykKLSAgICB4YXRleGl0IChkdW1wX3N0YXRpc3RpY3MpOwotCi0gIG1hY3JvX2FsdGVybmF0ZSA9IDA7Ci0gIG1hY3JvX3N0cmlwX2F0ID0gMDsKLSNpZmRlZiBUQ19JOTYwCi0gIG1hY3JvX3N0cmlwX2F0ID0gZmxhZ19tcmk7Ci0jZW5kaWYKLSNpZmRlZiBUQ19BMjlLCi0gIC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEFNRCAyOUsgZmFtaWx5IG1hY3JvIGFzc2VtYmxlcgotICAgICBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgbWFjcm9fYWx0ZXJuYXRlID0gMTsKLSAgbWFjcm9fc3RyaXBfYXQgPSAxOwotI2VuZGlmCi0KLSAgbWFjcm9faW5pdCAobWFjcm9fYWx0ZXJuYXRlLCBmbGFnX21yaSwgbWFjcm9fc3RyaXBfYXQsIG1hY3JvX2V4cHIpOwotCi0gIFBST0dSRVNTICgxKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgb3V0cHV0X2ZpbGVfY3JlYXRlIChvdXRfZmlsZV9uYW1lKTsKLSAgYXNzZXJ0IChzdGRvdXRwdXQgIT0gMCk7Ci0jZW5kaWYKLQotI2lmZGVmIHRjX2luaXRfYWZ0ZXJfYXJncwotICB0Y19pbml0X2FmdGVyX2FyZ3MgKCk7Ci0jZW5kaWYKLQotICBpdGJsX2luaXQgKCk7Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBmdWxseSBpbml0aWFsaXplZCwgYW5kIGhhdmUgY3JlYXRlZCB0aGUgb3V0cHV0Ci0gICAgIGZpbGUsIGRlZmluZSBhbnkgc3ltYm9scyByZXF1ZXN0ZWQgYnkgLS1kZWZzeW0gY29tbWFuZCBsaW5lCi0gICAgIGFyZ3VtZW50cy4gICovCi0gIHdoaWxlIChkZWZzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltOwotICAgICAgc3RydWN0IGRlZnN5bV9saXN0ICpuZXh0OwotCi0gICAgICBzeW0gPSBzeW1ib2xfbmV3IChkZWZzeW1zLT5uYW1lLCBhYnNvbHV0ZV9zZWN0aW9uLCBkZWZzeW1zLT52YWx1ZSwKLQkJCSZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW0pOwotICAgICAgbmV4dCA9IGRlZnN5bXMtPm5leHQ7Ci0gICAgICBmcmVlIChkZWZzeW1zKTsKLSAgICAgIGRlZnN5bXMgPSBuZXh0OwotICAgIH0KLQotICBQUk9HUkVTUyAoMSk7Ci0KLSAgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzIChhcmdjLCBhcmd2KTsJLyogQXNzZW1ibGUgaXQuICovCi0KLSAgY29uZF9maW5pc2hfY2hlY2sgKC0xKTsKLQotI2lmZGVmIG1kX2VuZAotICBtZF9lbmQgKCk7Ci0jZW5kaWYKLQotICBpZiAoc2Vlbl9hdF9sZWFzdF8xX2ZpbGUgKCkKLSAgICAgICYmIChmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQgfHwgaGFkX2Vycm9ycyAoKSA9PSAwKSkKLSAgICBrZWVwX2l0ID0gMTsKLSAgZWxzZQotICAgIGtlZXBfaXQgPSAwOwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkKLSAgLyogVGhpcyB1c2VkIHRvIGJlIGRvbmUgYXQgdGhlIHN0YXJ0IG9mIHdyaXRlX29iamVjdF9maWxlIGluCi0gICAgIHdyaXRlLmMsIGJ1dCB0aGF0IGNhdXNlZCBwcm9ibGVtcyB3aGVuIGRvaW5nIGxpc3RpbmdzIHdoZW4KLSAgICAga2VlcF9pdCB3YXMgemVyby4gIFRoaXMgY291bGQgcHJvYmFibHkgYmUgbW92ZWQgYWJvdmUgbWRfZW5kLCBidXQKLSAgICAgSSBkaWRuJ3Qgd2FudCB0byByaXNrIHRoZSBjaGFuZ2UuICAqLwotICBzdWJzZWdzX2ZpbmlzaCAoKTsKLSNlbmRpZgotCi0gIGlmIChrZWVwX2l0KQotICAgIHdyaXRlX29iamVjdF9maWxlICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgbGlzdGluZ19wcmludCAobGlzdGluZ19maWxlbmFtZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBPQkpfVk1TIC8qIGRvZXMgaXRzIG93biBmaWxlIGhhbmRsaW5nICovCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKGtlZXBfaXQpCi0jZW5kaWYKLSAgICBvdXRwdXRfZmlsZV9jbG9zZSAob3V0X2ZpbGVfbmFtZSk7Ci0jZW5kaWYKLQotICBpZiAoZmxhZ19mYXRhbF93YXJuaW5ncyAmJiBoYWRfd2FybmluZ3MoKSA+IDAgJiYgaGFkX2Vycm9ycyAoKSA9PSAwKQotICAgIGFzX2JhZCAoXygiJWQgd2FybmluZ3MsIHRyZWF0aW5nIHdhcm5pbmdzIGFzIGVycm9ycyIpLCBoYWRfd2FybmluZ3MoKSk7Ci0KLSAgaWYgKGhhZF9lcnJvcnMgKCkgPiAwICYmICEgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0KQotICAgIGtlZXBfaXQgPSAwOwotCi0gIGlmICgha2VlcF9pdCkKLSAgICB1bmxpbmsgKG91dF9maWxlX25hbWUpOwotCi0gIGlucHV0X3NjcnViX2VuZCAoKTsKLQotICBFTkRfUFJPR1JFU1MgKG15bmFtZSk7Ci0KLSAgLyogVXNlIHhleGl0IGluc3RlYWQgb2YgcmV0dXJuLCBiZWNhdXNlIHVuZGVyIFZNUyBlbnZpcm9ubWVudHMgdGhleQotICAgICBtYXkgbm90IHBsYWNlIHRoZSBzYW1lIGludGVycHJldGF0aW9uIG9uIHRoZSB2YWx1ZSBnaXZlbi4gICovCi0gIGlmIChoYWRfZXJyb3JzICgpID4gMCkKLSAgICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQotICAvKiBPbmx5IGdlbmVyYXRlIGRlcGVuZGVuY3kgZmlsZSBpZiBhc3NlbWJsZXIgd2FzIHN1Y2Nlc3NmdWwuICAqLwotICBwcmludF9kZXBlbmRlbmNpZXMgKCk7Ci0KLSAgeGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3N0YXRpc3RpY3MgKCkKLXsKLSNpZmRlZiBIQVZFX1NCUksKLSAgY2hhciAqbGltID0gKGNoYXIgKikgc2JyayAoMCk7Ci0jZW5kaWYKLSAgbG9uZyBydW5fdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHN0YXJ0X3RpbWU7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdG90YWwgdGltZSBpbiBhc3NlbWJseTogJWxkLiUwNmxkXG4iKSwKLQkgICBteW5hbWUsIHJ1bl90aW1lIC8gMTAwMDAwMCwgcnVuX3RpbWUgJSAxMDAwMDAwKTsKLSNpZmRlZiBIQVZFX1NCUksKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksCi0JICAgbXluYW1lLCAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKSk7Ci0jZW5kaWYKLQotICBzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0gIHdyaXRlX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0gIHN5bWJvbF9wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOwotICByZWFkX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0KLSNpZmRlZiB0Y19wcmludF9zdGF0aXN0aWNzCi0gIHRjX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfcHJpbnRfc3RhdGlzdGljcwotICBvYmpfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKLSNlbmRpZgotfQotDAotCi0vKgkJCXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcygpCi0gKgotICogSGVyZSB0byBhdHRlbXB0IDEgcGFzcyBvdmVyIGVhY2ggaW5wdXQgZmlsZS4KLSAqIFdlIHNjYW4gYXJndlsqXSBsb29raW5nIGZvciBmaWxlbmFtZXMgb3IgZXhhY3RseSAiIiB3aGljaCBpcwotICogc2hvcnRoYW5kIGZvciBzdGRpbi4gQW55IGFyZ3YgdGhhdCBpcyBOVUxMIGlzIG5vdCBhIGZpbGUtbmFtZS4KLSAqIFdlIHNldCBuZWVkX3Bhc3NfMiBUUlVFIGlmLCBhZnRlciB0aGlzLCB3ZSBzdGlsbCBoYXZlIHVucmVzb2x2ZWQKLSAqIGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtICh1bmtub3duIHZhbHVlKSstKHVua25vd24gdmFsdWUpLgotICoKLSAqIE5vdGUgdGhlIHVuKnggc2VtYW50aWNzOiB0aGVyZSBpcyBvbmx5IDEgbG9naWNhbCBpbnB1dCBmaWxlLCBidXQgaXQKLSAqIG1heSBiZSBhIGNhdGVuYXRpb24gb2YgbWFueSAncGh5c2ljYWwnIGlucHV0IGZpbGVzLgotICovCi1zdGF0aWMgdm9pZCAKLXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgc2F3X2FfZmlsZSA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmbGFnd29yZCBhcHBsaWNhYmxlOwotI2VuZGlmCi0KLSAgbmVlZF9wYXNzXzIgPSAwOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgICAgc2VnbWVudF9pbmZvW2ldLmZpeF9yb290ID0gMDsKLSAgfQotICAvKiBDcmVhdGUgdGhlIHRocmVlIGZpeGVkIG9uZXMgKi8KLSAgewotICAgIHNlZ1Qgc2VnOwotCi0jaWZkZWYgVEVfQVBPTExPCi0gICAgc2VnID0gc3Vic2VnX25ldyAoIi53dGV4dCIsIDApOwotI2Vsc2UKLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLnRleHQiLCAwKTsKLSNlbmRpZgotICAgIGFzc2VydCAoc2VnID09IFNFR19FMCk7Ci0gICAgc2VnID0gc3Vic2VnX25ldyAoIi5kYXRhIiwgMCk7Ci0gICAgYXNzZXJ0IChzZWcgPT0gU0VHX0UxKTsKLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLmJzcyIsIDApOwotICAgIGFzc2VydCAoc2VnID09IFNFR19FMik7Ci0jaWZkZWYgVEVfQVBPTExPCi0gICAgY3JlYXRlX3RhcmdldF9zZWdtZW50cyAoKTsKLSNlbmRpZgotICB9Ci0KLSNlbHNlIC8qIG5vdCBNQU5ZX1NFR01FTlRTICovCi0gIHRleHRfZml4X3Jvb3QgPSBOVUxMOwotICBkYXRhX2ZpeF9yb290ID0gTlVMTDsKLSAgYnNzX2ZpeF9yb290ID0gTlVMTDsKLSNlbmRpZiAvKiBub3QgTUFOWV9TRUdNRU5UUyAqLwotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotICAvKiBDcmVhdGUgdGhlIHN0YW5kYXJkIHNlY3Rpb25zLCBhbmQgdGhvc2UgdGhlIGFzc2VtYmxlciB1c2VzCi0gICAgIGludGVybmFsbHkuICAqLwotICB0ZXh0X3NlY3Rpb24gPSBzdWJzZWdfbmV3IChURVhUX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKERBVEFfU0VDVElPTl9OQU1FLCAwKTsKLSAgYnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3IChCU1NfU0VDVElPTl9OQU1FLCAwKTsKLSAgLyogQEAgRklYTUUgLS0gd2UncmUgc2V0dGluZyB0aGUgUkVMT0MgZmxhZyBzbyB0aGF0IHNlY3Rpb25zIGFyZSBhc3N1bWVkCi0gICAgIHRvIGhhdmUgcmVsb2NzLCBvdGhlcndpc2Ugd2UgZG9uJ3QgZmluZCBvdXQgaW4gdGltZS4gKi8KLSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZKSk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19EQVRBKSk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSAmIFNFQ19BTExPQyk7Ci0gIHNlZ19pbmZvIChic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0gIHN1YnNlZ19uZXcgKEJGRF9BQlNfU0VDVElPTl9OQU1FLCAwKTsKLSAgc3Vic2VnX25ldyAoQkZEX1VORF9TRUNUSU9OX05BTUUsIDApOwotICByZWdfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIqR0FTIGByZWcnIHNlY3Rpb24qIiwgMCk7Ci0gIGV4cHJfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIqR0FTIGBleHByJyBzZWN0aW9uKiIsIDApOwotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci0KLSAgLyogVGhpcyBtYXkgYWRkIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCB3aGljaCByZXF1aXJlcyBoYXZpbmcgYW4gb3BlbiBCRkQsCi0gICAgIGFuZCBzZWN0aW9ucyBhbHJlYWR5IGNyZWF0ZWQsIGluIEJGRF9BU1NFTUJMRVIgbW9kZS4gICovCi0gIG1kX2JlZ2luICgpOwotCi0jaWZkZWYgb2JqX2JlZ2luCi0gIG9ial9iZWdpbiAoKTsKLSNlbmRpZgotCi0gIGFyZ3YrKzsJCQkvKiBza2lwIGFyZ3ZbMF0gKi8KLSAgYXJnYy0tOwkJCS8qIHNraXAgYXJndlswXSAqLwotICB3aGlsZSAoYXJnYy0tKQotICAgIHsKLSAgICAgIGlmICgqYXJndikKLQl7CQkJLyogSXMgaXQgYSBmaWxlLW5hbWUgYXJndW1lbnQ/ICovCi0JICBQUk9HUkVTUyAoMSk7Ci0JICBzYXdfYV9maWxlKys7Ci0JICAvKiBhcmd2LT4iIiBpZiBzdGRpbiBkZXNpcmVkLCBlbHNlLT5maWxlbmFtZSAqLwotCSAgcmVhZF9hX3NvdXJjZV9maWxlICgqYXJndik7Ci0JfQotICAgICAgYXJndisrOwkJCS8qIGNvbXBsZXRlZCB0aGF0IGFyZ3YgKi8KLSAgICB9Ci0gIGlmICghc2F3X2FfZmlsZSkKLSAgICByZWFkX2Ffc291cmNlX2ZpbGUgKCIiKTsKLX0JCQkJLyogcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKCkgKi8KLQotLyogVGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBtYWNybyBjb2RlIGFuZCBnYXMgZXhwcmVzc2lvbiBoYW5kbGluZy4gICovCi0KLXN0YXRpYyBpbnQKLW1hY3JvX2V4cHIgKGVtc2csIGlkeCwgaW4sIHZhbCkKLSAgICAgY29uc3QgY2hhciAqZW1zZzsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgKnZhbDsKLXsKLSAgY2hhciAqaG9sZDsKLSAgZXhwcmVzc2lvblMgZXg7Ci0KLSAgc2JfdGVybWluYXRlIChpbik7Ci0KLSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaW4tPnB0ciArIGlkeDsKLSAgZXhwcmVzc2lvbiAoJmV4KTsKLSAgaWR4ID0gaW5wdXRfbGluZV9wb2ludGVyIC0gaW4tPnB0cjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotICBpZiAoZXguWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIGFzX2JhZCAoIiVzIiwgZW1zZyk7Ci0KLSAgKnZhbCA9IChpbnQpIGV4LlhfYWRkX251bWJlcjsKLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBlbmQgb2YgYXMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2FzLmggYi9nYXMvYXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0NjU4YS4uMDAwMDAwMAotLS0gYS9nYXMvYXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3NiArMCwwIEBACi0vKiBhcy5oIC0gZ2xvYmFsIGhlYWRlciBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVMKLSNkZWZpbmUgR0FTIDEKLS8qCi0gKiBJIHRoaW5rIHRoaXMgc3R1ZmYgaXMgbGFyZ2VseSBvdXQgb2YgZGF0ZS4gIHhveG9yaWNoLgotICoKLSAqIENBUElUQUxJU0VEIG5hbWVzIGFyZSAjZGVmaW5lZC4KLSAqICJsb3dlcmNhc2VIIiBpcyAjZGVmaW5lZCBpZiAibG93ZXJjYXNlLmgiIGhhcyBiZWVuICNpbmNsdWRlLWQuCi0gKiAibG93ZXJjYXNlVCIgaXMgYSB0eXBlZGVmIG9mICJsb3dlcmNhc2UiIG9iamVjdHMuCi0gKiAibG93ZXJjYXNlUCIgaXMgdHlwZSAicG9pbnRlciB0byBvYmplY3Qgb2YgdHlwZSAnbG93ZXJjYXNlJyIuCi0gKiAibG93ZXJjYXNlUyIgaXMgdHlwZWRlZiBzdHJ1Y3QgLi4uIGxvd2VyY2FzZVMuCi0gKgotICogI2RlZmluZSBERUJVRyB0byBlbmFibGUgYWxsIHRoZSAia25vdyIgYXNzZXJ0aW9uIHRlc3RzLgotICogI2RlZmluZSBTVVNQRUNUIHdoZW4gZGVidWdnaW5nIGhhc2ggY29kZS4KLSAqICNkZWZpbmUgQ09NTU9OIGFzICJleHRlcm4iIGZvciBhbGwgbW9kdWxlcyBleGNlcHQgb25lLCB3aGVyZSB5b3UgI2RlZmluZQotICoJQ09NTU9OIGFzICIiLgotICogSWYgVEVTVCBpcyAjZGVmaW5lZCwgdGhlbiB3ZSBhcmUgdGVzdGluZyBhIG1vZHVsZTogI2RlZmluZSBDT01NT04gYXMgIiIuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBjb2RlIHJlY29tbWVuZGVkIGluIHRoZSBhdXRvY29uZiBkb2N1bWVudGF0aW9uLCBhbG1vc3QKLSAgIHZlcmJhdGltLiAgSWYgaXQgZG9lc24ndCB3b3JrIGZvciB5b3UsIGxldCBtZSBrbm93LCBhbmQgbm90aWZ5Ci0gICBkam1AZ251LmFpLm1pdC5lZHUgYXMgd2VsbC4gICovCi0vKiBBZGRlZCAjdW5kZWYgZm9yIERKIERlbG9yaWUuICBUaGUgcmlnaHQgZml4IGlzIHRvIGVuc3VyZSB0aGF0IGFzLmgKLSAgIGlzIGluY2x1ZGVkIGZpcnN0LCBiZWZvcmUgZXZlbiBhbnkgc3lzdGVtIGhlYWRlciBmaWxlcywgaW4gYWxsIGZpbGVzCi0gICB0aGF0IHVzZSBpdC4gIEtSIDE5OTQuMTEuMDMgKi8KLS8qIEFkZGVkIHZvaWQqIHZlcnNpb24gZm9yIFNUREMgY2FzZS4gIFRoaXMgaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoCi0gICB0aGUgZGVjbGFyYXRpb24gaW4gYmlzb24uc2ltcGxlLCB1c2VkIGZvciBtNjhrIG9wZXJhbmQgcGFyc2luZy4KLSAgIC0tS1IgMTk5NS4wOC4wOCAqLwotLyogRm9yY2Ugdm9pZCogZGVjbCBmb3IgaHB1eC4gIFRoaXMgaXMgd2hhdCBCaXNvbiB1c2VzLiAgLS1LUiAxOTk1LjA4LjE2ICovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgaWZuZGVmIGFsbG9jYQotIyAgaWZkZWYgX19TVERDX18KLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICBlbHNlCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotIyAgICBpZiAhZGVmaW5lZCAoX19TVERDX18pICYmICFkZWZpbmVkIChfX2hwdXgpCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgICBlbHNlCi1leHRlcm4gdm9pZCAqYWxsb2NhICgpOwotIyAgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICAgZW5kaWYgLyogYWxsb2NhICovCi0jICBlbmRpZiAvKiBfQUlYICovCi0jIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLSNlbmRpZgotCi0vKiBOb3csIHRlbmQgdG8gdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24uICAqLwotCi0vKiBTeXN0ZW0gaW5jbHVkZSBmaWxlcyBmaXJzdC4uLiAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0vKiBmb3Igc2l6ZV90LCBwaWRfdCAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLS8qIFRoZSBmaXJzdCBnZXRvcHQgdmFsdWUgZm9yIG1hY2hpbmUtaW5kZXBlbmRlbnQgbG9uZyBvcHRpb25zLgotICAgMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotI2RlZmluZSBPUFRJT05fU1REX0JBU0UgMTUwCi0vKiBUaGUgZmlyc3QgZ2V0b3B0IHZhbHVlIGZvciBtYWNoaW5lLWRlcGVuZGVudCBsb25nIG9wdGlvbnMuCi0gICAxNzAgZ2l2ZXMgdGhlIHN0YW5kYXJkIG9wdGlvbnMgcm9vbSB0byBncm93LiAgKi8KLSNkZWZpbmUgT1BUSU9OX01EX0JBU0UgMTcwCi0KLSNpZmRlZiBERUJVRwotI3VuZGVmIE5ERUJVRwotI2VuZGlmCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSB8fCBfX0dOVUNfTUlOT1JfXyA8PSA1Ci0jZGVmaW5lIF9fUFJFVFRZX0ZVTkNUSU9OX18gICgoY2hhciopMCkKLSNlbmRpZgotI2lmIDAKLQotLyogSGFuZGxlIGxvc3NhZ2Ugd2l0aCBhc3NlcnQuaC4gICovCi0jaWZuZGVmIEJST0tFTl9BU1NFUlQKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbHNlIC8qIEJST0tFTl9BU1NFUlQgKi8KLSNpZm5kZWYgTkRFQlVHCi0jZGVmaW5lIGFzc2VydChwKSAoKHApID8gMCA6IChhc19hc3NlcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXyksIDApKQotI2Vsc2UKLSNkZWZpbmUgYXNzZXJ0KHApICgocCksIDApCi0jZW5kaWYKLSNlbmRpZiAvKiBCUk9LRU5fQVNTRVJUICovCi0KLSNlbHNlCi0KLSNkZWZpbmUgYXNzZXJ0KFApICgoUCkgPyAwIDogKGFzX2Fzc2VydCAoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKSwgMCkpCi0jdW5kZWYgYWJvcnQKLSNkZWZpbmUgYWJvcnQoKQkJYXNfYWJvcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXykKLQotI2VuZGlmCi0KLQotLyogTm93IEdOVSBoZWFkZXIgZmlsZXMuLi4gKi8KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpbmNsdWRlIDxiZmQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotCi0vKiBEZWZpbmUgdGhlIHN0YW5kYXJkIHByb2dyZXNzIG1hY3Jvcy4gICovCi0jaW5jbHVkZSA8cHJvZ3Jlc3MuaD4KLQotLyogVGhpcyBkb2Vzbid0IGdldCB0YWtlbiBjYXJlIG9mIGFueXdoZXJlLiAgKi8KLSNpZm5kZWYgX19NV0VSS1NfXyAgLyogTWV0cm93ZXJrcyBDIGNob2tlcyBvbiB0aGUgImRlZmluZWQgKGlubGluZSkiICovCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSAmJiAhZGVmaW5lZCAoaW5saW5lKQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotI2VuZGlmIC8qICFfX01XRVJLU19fICovCi0KLS8qIE90aGVyIHN0dWZmIGZyb20gY29uZmlnLmguICAqLwotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi1leHRlcm4gY2hhciAqc3Ryc3RyICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLWV4dGVybiBQVFIgbWFsbG9jICgpOwotZXh0ZXJuIFBUUiByZWFsbG9jICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBWTVMuICAqLwotI2lmICEgZGVmaW5lZCAoSEFWRV9VTkxJTkspICYmIGRlZmluZWQgKEhBVkVfUkVNT1ZFKQotI2RlZmluZSB1bmxpbmsgcmVtb3ZlCi0jZW5kaWYKLQotLyogSGFjayB0byBtYWtlICJnY2MgLVdhbGwiIG5vdCBjb21wbGFpbiBhYm91dCBvYnN0YWNrIG1hY3Jvcy4gICovCi0jaWYgIWRlZmluZWQgKG1lbWNweSkgJiYgIWRlZmluZWQgKGJjb3B5KQotI2RlZmluZSBiY29weShzcmMsZGVzdCxzaXplKQltZW1jcHkoZGVzdCxzcmMsc2l6ZSkKLSNlbmRpZgotCi0vKiBNYWtlIFNhYmVyIGhhcHBpZXIgb24gb2JzdGFjay5oLiAgKi8KLSNpZmRlZiBTQUJFUgotI3VuZGVmICBfX1BUUl9UT19JTlQKLSNkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoaW50KShQKSkKLSN1bmRlZiAgX19JTlRfVE9fUFRSCi0jZGVmaW5lIF9fSU5UX1RPX1BUUihQKSAoKGNoYXIgKikoUCkpCi0jZW5kaWYKLQotI2lmbmRlZiBfX0xJTkVfXwotI2RlZmluZSBfX0xJTkVfXyAidW5rbm93biIKLSNlbmRpZiAvKiBfX0xJTkVfXyAqLwotCi0jaWZuZGVmIF9fRklMRV9fCi0jZGVmaW5lIF9fRklMRV9fICJ1bmtub3duIgotI2VuZGlmIC8qIF9fRklMRV9fICovCi0KLSNpZm5kZWYgRk9QRU5fV0IKLSNpZmRlZiBHTzMyCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRVhJVF9TVUNDRVNTCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAwCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAxCi0jZW5kaWYKLQotI2RlZmluZSBvYnN0YWNrX2NodW5rX2FsbG9jIHhtYWxsb2MKLSNkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIHhmcmVlCi0KLSNkZWZpbmUgeGZyZWUgZnJlZQotCi0jaW5jbHVkZSAiYXNpbnRsLmgiCi0KLSNkZWZpbmUgQkFEX0NBU0UodmFsKSBcCi17IFwKLSAgICAgIGFzX2ZhdGFsKF8oIkNhc2UgdmFsdWUgJWxkIHVuZXhwZWN0ZWQgYXQgbGluZSAlZCBvZiBmaWxlIFwiJXNcIlxuIiksIFwKLQkgICAgICAgKGxvbmcpIHZhbCwgX19MSU5FX18sIF9fRklMRV9fKTsgXAotCSAgIH0KLQwKLSNpbmNsdWRlICJmbG9udW0uaCIKLQotLyogVGhlc2UgYXJlIGFzc2VtYmxlci13aWRlIGNvbmNlcHRzICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gYmZkICpzdGRvdXRwdXQ7Ci10eXBlZGVmIGJmZF92bWEgYWRkcmVzc1Q7Ci10eXBlZGVmIGJmZF9zaWduZWRfdm1hIG9mZnNldFQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGFkZHJlc3NUOwotdHlwZWRlZiBsb25nIG9mZnNldFQ7Ci0jZW5kaWYKLQotLyogVHlwZSBvZiBzeW1ib2wgdmFsdWUsIGV0Yy4gIEZvciB1c2UgaW4gcHJvdG90eXBlcy4gICovCi10eXBlZGVmIGFkZHJlc3NUIHZhbHVlVDsKLQotI2lmbmRlZiBDT01NT04KLSNpZmRlZiBURVNUCi0jZGVmaW5lIENPTU1PTgkJCS8qIGRlY2xhcmUgb3VyIENPTU1PTnMgc3RvcmFnZSBoZXJlLiAqLwotI2Vsc2UKLSNkZWZpbmUgQ09NTU9OIGV4dGVybgkJLyogb3VyIGNvbW1vbnMgbGl2ZSBlbHN3aGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLS8qIENPTU1PTiBub3cgZGVmaW5lZCAqLwotCi0jaWZkZWYgREVCVUcKLSNpZm5kZWYga25vdwotI2RlZmluZSBrbm93KHApIGFzc2VydChwKQkvKiBWZXJpZnkgb3VyIGFzc3VtcHRpb25zISAqLwotI2VuZGlmIC8qIG5vdCB5ZXQgZGVmaW5lZCAqLwotI2Vsc2UKLSNkZWZpbmUga25vdyhwKQkJCS8qIGtub3coKSBjaGVja3MgYXJlIG5vLW9wLmVkICovCi0jZW5kaWYKLQwKLS8qIGlucHV0X3NjcnViLmMgKi8KLQotLyoKLSAqIFN1cHBsaWVzIHNhbml0aXNlZCBidWZmZXJzIHRvIHJlYWQuYy4KLSAqIEFsc28gdW5kZXJzdGFuZHMgcHJpbnRpbmcgbGluZS1udW1iZXIgcGFydCBvZiBlcnJvciBtZXNzYWdlcy4KLSAqLwotDAotCi0vKiBzdWJzZWdzLmMgICAgIFN1Yi1zZWdtZW50cy4gQWxzbywgc2VnbWVudCg9ZXhwcmVzc2lvbiB0eXBlKXMuKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0jaW5jbHVkZSAiYmZkLmgiCi0jZGVmaW5lIE5fU0VHTUVOVFMgNDAKLSNkZWZpbmUgU0VHX05PUk1BTCh4KSAoKHgpID49IFNFR19FMCAmJiAoeCkgPD0gU0VHX0UzOSkKLSNkZWZpbmUgU0VHX0xJU1QgU0VHX0UwLFNFR19FMSxTRUdfRTIsU0VHX0UzLFNFR19FNCxTRUdfRTUsU0VHX0U2LFNFR19FNyxTRUdfRTgsU0VHX0U5LFwKLQkJIFNFR19FMTAsU0VHX0UxMSxTRUdfRTEyLFNFR19FMTMsU0VHX0UxNCxTRUdfRTE1LFNFR19FMTYsU0VHX0UxNyxTRUdfRTE4LFNFR19FMTksXAotCQkgU0VHX0UyMCxTRUdfRTIxLFNFR19FMjIsU0VHX0UyMyxTRUdfRTI0LFNFR19FMjUsU0VHX0UyNixTRUdfRTI3LFNFR19FMjgsU0VHX0UyOSxcCi0JCSBTRUdfRTMwLFNFR19FMzEsU0VHX0UzMixTRUdfRTMzLFNFR19FMzQsU0VHX0UzNSxTRUdfRTM2LFNFR19FMzcsU0VHX0UzOCxTRUdfRTM5Ci0jZGVmaW5lIFNFR19URVhUIFNFR19FMAotI2RlZmluZSBTRUdfREFUQSBTRUdfRTEKLSNkZWZpbmUgU0VHX0JTUyBTRUdfRTIKLSNkZWZpbmUgU0VHX0xBU1QgU0VHX0UzOQotI2Vsc2UKLSNkZWZpbmUgTl9TRUdNRU5UUyAzCi0jZGVmaW5lIFNFR19OT1JNQUwoeCkgKCh4KSA9PSBTRUdfVEVYVCB8fCAoeCkgPT0gU0VHX0RBVEEgfHwgKHgpID09IFNFR19CU1MpCi0jZGVmaW5lIFNFR19MSVNUIFNFR19URVhULFNFR19EQVRBLFNFR19CU1MKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gX3NlZ1QKLSAgewotICAgIFNFR19BQlNPTFVURSA9IDAsCi0gICAgU0VHX0xJU1QsCi0gICAgU0VHX1VOS05PV04sCi0gICAgU0VHX0dPT0YsCQkJLyogT25seSBoYXBwZW5zIGlmIEFTIGhhcyBhIGxvZ2ljIGVycm9yLiAqLwotICAgIC8qIEludmVudGVkIHNvIHdlIGRvbid0IGNyYXNoIHByaW50aW5nICovCi0gICAgLyogZXJyb3IgbWVzc2FnZSBpbnZvbHZpbmcgd2VpcmQgc2VnbWVudC4gKi8KLSAgICBTRUdfRVhQUiwJCQkvKiBJbnRlcm1lZGlhdGUgZXhwcmVzc2lvbiB2YWx1ZXMuICovCi0gICAgU0VHX0RFQlVHLAkJCS8qIERlYnVnIHNlZ21lbnQgKi8KLSAgICBTRUdfTlRWLAkJCS8qIFRyYW5zZmVydCB2ZWN0b3IgcHJlbG9hZCBzZWdtZW50ICovCi0gICAgU0VHX1BUViwJCQkvKiBUcmFuc2ZlcnQgdmVjdG9yIHBvc3Rsb2FkIHNlZ21lbnQgKi8KLSAgICBTRUdfUkVHSVNURVIJCS8qIE15dGhpY2FsOiBhIHJlZ2lzdGVyLXZhbHVlZCBleHByZXNzaW9uICovCi0gIH0gc2VnVDsKLQotI2RlZmluZSBTRUdfTUFYSU1VTV9PUkRJTkFMIChTRUdfUkVHSVNURVIpCi0jZWxzZQotdHlwZWRlZiBhc2VjdGlvbiAqc2VnVDsKLSNkZWZpbmUgU0VHX05PUk1BTChTRUcpCQkoKFNFRykgIT0gYWJzb2x1dGVfc2VjdGlvbglcCi0JCQkJICYmIChTRUcpICE9IHVuZGVmaW5lZF9zZWN0aW9uCVwKLQkJCQkgJiYgKFNFRykgIT0gcmVnX3NlY3Rpb24JXAotCQkJCSAmJiAoU0VHKSAhPSBleHByX3NlY3Rpb24pCi0jZW5kaWYKLXR5cGVkZWYgaW50IHN1YnNlZ1Q7Ci0KLS8qIFdoYXQgc3Vic2VnIHdlIGFyZSBhY2NyZXRpbmcgbm93PyAqLwotQ09NTU9OIHN1YnNlZ1Qgbm93X3N1YnNlZzsKLQotLyogU2VnbWVudCBvdXIgaW5zdHJ1Y3Rpb25zIGVtaXQgdG8uICovCi1DT01NT04gc2VnVCBub3dfc2VnOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBzZWdtZW50X25hbWUoU0VHKQliZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBTRUcpCi0jZWxzZQotZXh0ZXJuIGNoYXIgY29uc3QgKmNvbnN0IHNlZ19uYW1lW107Ci0jZGVmaW5lIHNlZ21lbnRfbmFtZShTRUcpCXNlZ19uYW1lWyhpbnQpIChTRUcpXQotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGludCBzZWN0aW9uX2FsaWdubWVudFtdOwotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gc2VnVCByZWdfc2VjdGlvbiwgZXhwcl9zZWN0aW9uOwotLyogU2hvdWxkbid0IHRoZXNlIGJlIGVsaW1pbmF0ZWQgc29tZWRheT8gICovCi1leHRlcm4gc2VnVCB0ZXh0X3NlY3Rpb24sIGRhdGFfc2VjdGlvbiwgYnNzX3NlY3Rpb247Ci0jZGVmaW5lIGFic29sdXRlX3NlY3Rpb24JYmZkX2Fic19zZWN0aW9uX3B0cgotI2RlZmluZSB1bmRlZmluZWRfc2VjdGlvbgliZmRfdW5kX3NlY3Rpb25fcHRyCi0jZWxzZQotI2RlZmluZSByZWdfc2VjdGlvbgkJU0VHX1JFR0lTVEVSCi0jZGVmaW5lIGV4cHJfc2VjdGlvbgkJU0VHX0VYUFIKLSNkZWZpbmUgdGV4dF9zZWN0aW9uCQlTRUdfVEVYVAotI2RlZmluZSBkYXRhX3NlY3Rpb24JCVNFR19EQVRBCi0jZGVmaW5lIGJzc19zZWN0aW9uCQlTRUdfQlNTCi0jZGVmaW5lIGFic29sdXRlX3NlY3Rpb24JU0VHX0FCU09MVVRFCi0jZGVmaW5lIHVuZGVmaW5lZF9zZWN0aW9uCVNFR19VTktOT1dOCi0jZW5kaWYKLQotLyogcmVsYXgoKSAqLwotCi1lbnVtIF9yZWxheF9zdGF0ZQotICB7Ci0gICAgLyogVmFyaWFibGUgY2hhcnMgdG8gYmUgcmVwZWF0ZWQgZnJfb2Zmc2V0IHRpbWVzLgotICAgICAgIEZyX3N5bWJvbCB1bnVzZWQuIFVzZWQgd2l0aCBmcl9vZmZzZXQgPT0gMCBmb3IgYQotICAgICAgIGNvbnN0YW50IGxlbmd0aCBmcmFnLiAqLwotICAgIHJzX2ZpbGwgPSAxLAotCi0gICAgLyogQWxpZ24uICBUaGUgZnJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBwb3dlciBvZiAyIHRvIHdoaWNoIHRvCi0gICAgICAgYWxpZ24uICBUaGUgZnJfdmFyIGZpZWxkIGhvbGRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUKLSAgICAgICBmaWxsIHBhdHRlcm4uICBUaGUgZnJfc3VidHlwZSBmaWVsZCBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSAgICAgICBieXRlcyB0byBza2lwIHdoZW4gYWxpZ25pbmcsIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0gICAgcnNfYWxpZ24sCi0KLSAgICAvKiBBbGlnbiBjb2RlLiAgVGhlIGZyX29mZnNldCBmaWVsZCBob2xkcyB0aGUgcG93ZXIgb2YgMiB0byB3aGljaAotICAgICAgIHRvIGFsaWduLiAgVGhpcyB0eXBlIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IG1hY2hpbmUgc3BlY2lmaWMKLSAgICAgICBjb2RlLCB3aGljaCBpcyBub3JtYWxseSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIGZpbGwKLSAgICAgICBwYXR0ZXJuLiAgVGhlIGZyX3N1YnR5cGUgZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gICAgICAgYnl0ZXMgdG8gc2tpcCB3aGVuIGFsaWduaW5nLCBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotICAgIHJzX2FsaWduX2NvZGUsCi0KLSAgICAvKiBPcmc6IEZyX29mZnNldCwgZnJfc3ltYm9sOiBhZGRyZXNzLiAxIHZhcmlhYmxlIGNoYXI6IGZpbGwKLSAgICAgICBjaGFyYWN0ZXIuICovCi0gICAgcnNfb3JnLAotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICAvKiBKRjogZ3VucG9pbnQgKi8KLSAgICByc19icm9rZW5fd29yZCwKLSNlbmRpZgotCi0gICAgLyogbWFjaGluZS1zcGVjaWZpYyByZWxheGFibGUgKG9yIHNpbWlsYXJseSBhbHRlcmFibGUpIGluc3RydWN0aW9uICovCi0gICAgcnNfbWFjaGluZV9kZXBlbmRlbnQsCi0KLSAgICAvKiAuc3BhY2UgZGlyZWN0aXZlIHdpdGggZXhwcmVzc2lvbiBvcGVyYW5kIHRoYXQgbmVlZHMgdG8gYmUgY29tcHV0ZWQKLSAgICAgICBsYXRlci4gIFNpbWlsYXIgdG8gcnNfb3JnLCBidXQgZGlmZmVyZW50LgotICAgICAgIGZyX3N5bWJvbDogb3BlcmFuZAotICAgICAgIDEgdmFyaWFibGUgY2hhcjogZmlsbCBjaGFyYWN0ZXIgICovCi0gICAgcnNfc3BhY2UsCi0KLSAgICAvKiBBIERXQVJGIGxlYjEyOCB2YWx1ZTsgb25seSBFTEYgdXNlcyB0aGlzLiAgVGhlIHN1YnR5cGUgaXMgMCBmb3IKLSAgICAgICB1bnNpZ25lZCwgMSBmb3Igc2lnbmVkLiAgKi8KLSAgICByc19sZWIxMjgsCi0KLSAgICAvKiBFeGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gd2hpY2ggd2UgbWF5IGJlIGFibGUgdG8gb3B0aW1pemUuICAqLwotICAgIHJzX2NmYQotICB9OwotCi10eXBlZGVmIGVudW0gX3JlbGF4X3N0YXRlIHJlbGF4X3N0YXRlVDsKLQotLyogVGhpcyB0eXBlIGlzIHVzZWQgaW4gcHJvdG90eXBlcywgc28gaXQgY2FuJ3QgYmUgYSB0eXBlIHRoYXQgd2lsbCBiZQotICAgd2lkZW5lZCBmb3IgYXJndW1lbnQgcGFzc2luZy4gICovCi10eXBlZGVmIHVuc2lnbmVkIGludCByZWxheF9zdWJzdGF0ZVQ7Ci0KLS8qIEVub3VnaCBiaXRzIGZvciBhZGRyZXNzLCBidXQgc3RpbGwgYW4gaW50ZWdlciB0eXBlLgotICAgQ291bGQgYmUgYSBwcm9ibGVtLCBjcm9zcy1hc3NlbWJsaW5nIGZvciA2NC1iaXQgbWFjaGluZXMuICAqLwotdHlwZWRlZiBhZGRyZXNzVCByZWxheF9hZGRyZXNzVDsKLQwKLS8qIG1haW4gcHJvZ3JhbSAiYXMuYyIgKGNvbW1hbmQgYXJndW1lbnRzIGV0YykgKi8KLQotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19ub19jb21tZW50czsgLyogLWYgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfZGVidWc7IC8qIC1EICovCi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX3NpZ25lZF9vdmVyZmxvd19vazsgLyogLUogKi8KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ193YXJuX2Rpc3BsYWNlbWVudDsgLyogLUsgKi8KLSNlbmRpZgotCi0vKiBUcnVlIGlmIGxvY2FsIHN5bWJvbHMgc2hvdWxkIGJlIHJldGFpbmVkLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ19rZWVwX2xvY2FsczsgLyogLUwgKi8KLQotLyogVHJ1ZSBpZiB3ZSBhcmUgYXNzZW1ibGluZyBpbiBNUkkgbW9kZS4gICovCi1DT01NT04gaW50IGZsYWdfbXJpOwotCi0vKiBTaG91bGQgdGhlIGRhdGEgc2VjdGlvbiBiZSBtYWRlIHJlYWQtb25seSBhbmQgYXBwZW5kZWQgdG8gdGhlIHRleHQKLSAgIHNlY3Rpb24/ICAqLwotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQ7IC8qIC1SICovCi0KLS8qIFRydWUgaWYgd2FybmluZ3Mgc2hvdWxkIGJlIGluaGliaXRlZC4gICovCi1DT01NT04gaW50IGZsYWdfbm9fd2FybmluZ3M7IC8qIC1XICovCi0KLS8qIFRydWUgaWYgd2FybmluZ3MgY291bnQgYXMgZXJyb3JzLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ19mYXRhbF93YXJuaW5nczsgLyogLS1mYXRhbC13YXJuaW5ncyAqLwotCi0vKiBUcnVlIGlmIHdlIHNob3VsZCBhdHRlbXB0IHRvIGdlbmVyYXRlIG91dHB1dCBldmVuIGlmIG5vbi1mYXRhbCBlcnJvcnMKLSAgIGFyZSBkZXRlY3RlZC4gICovCi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQ7IC8qIC1aICovCi0KLS8qIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgYXNzZW1ibGVyIHNob3VsZCBvdXRwdXQgdGltZSBhbmQgc3BhY2UgdXNhZ2UuICovCi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX3ByaW50X3N0YXRpc3RpY3M7Ci0KLS8qIFRydWUgaWYgbG9jYWwgYWJzb2x1dGUgc3ltYm9scyBhcmUgdG8gYmUgc3RyaXBwZWQuICAqLwotQ09NTU9OIGludCBmbGFnX3N0cmlwX2xvY2FsX2Fic29sdXRlOwotCi0vKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBhIHRyYWRpdGlvbmFsIGZvcm1hdCBvYmplY3QgZmlsZS4gICovCi1DT01NT04gaW50IGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0OwotCi0vKiBuYW1lIG9mIGVtaXR0ZWQgb2JqZWN0IGZpbGUgKi8KLUNPTU1PTiBjaGFyICpvdXRfZmlsZV9uYW1lOwotCi0vKiBuYW1lIG9mIGZpbGUgZGVmaW5pbmcgZXh0ZW5zaW9ucyB0byB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gc2V0ICovCi1DT01NT04gY2hhciAqaW5zdHRibF9maWxlX25hbWU7Ci0KLS8qIFRSVUUgaWYgd2UgbmVlZCBhIHNlY29uZCBwYXNzLiAqLwotQ09NTU9OIGludCBuZWVkX3Bhc3NfMjsKLQotLyogVFJVRSBpZiB3ZSBzaG91bGQgZG8gbm8gcmVsYXhpbmcsIGFuZAotICAgbGVhdmUgbG90cyBvZiBwYWRkaW5nLiAgKi8KLUNPTU1PTiBpbnQgbGlua3JlbGF4OwotCi0vKiBUUlVFIGlmIHdlIHNob3VsZCBwcm9kdWNlIGEgbGlzdGluZy4gICovCi1leHRlcm4gaW50IGxpc3Rpbmc7Ci0KLS8qIFR5cGUgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdlIHNob3VsZCBnZW5lcmF0ZS4gIFdlIGN1cnJlbnRseQotICAgc3VwcG9ydCBzdGFicywgRUNPRkYsIGFuZCBEV0FSRjIuICAqLwotCi1lbnVtIGRlYnVnX2luZm9fdHlwZQotICB7Ci0gICAgREVCVUdfVU5TUEVDSUZJRUQsCi0gICAgREVCVUdfTk9ORSwKLSAgICBERUJVR19TVEFCUywKLSAgICBERUJVR19FQ09GRiwKLSAgICBERUJVR19EV0FSRiwKLSAgICBERUJVR19EV0FSRjIKLSAgfTsKLQotZXh0ZXJuIGVudW0gZGVidWdfaW5mb190eXBlIGRlYnVnX3R5cGU7Ci0MCi0vKiBNYXhpbXVtIGxldmVsIG9mIG1hY3JvIG5lc3RpbmcuICAqLwotZXh0ZXJuIGludCBtYXhfbWFjcm9fbmVzdDsKLQotLyogT2JzdGFjayBjaHVuayBzaXplLiAgS2VlcCBsYXJnZSBmb3IgZWZmaWNpZW50IHNwYWNlIHVzZSwgbWFrZSBzbWFsbCB0bwotICAgaW5jcmVhc2UgbWFsbG9jIGNhbGxzIGZvciBtb25pdG9yaW5nIG1lbW9yeSBhbGxvY2F0aW9uLiAgKi8KLWV4dGVybiBpbnQgY2h1bmtzaXplOwotCi1zdHJ1Y3QgX3BzZXVkb190eXBlCi0gIHsKLSAgICAvKiBhc3NlbWJsZXIgbW5lbW9uaWMsIGxvd2VyIGNhc2UsIG5vICcuJyAqLwotICAgIGNvbnN0IGNoYXIgKnBvY19uYW1lOwotICAgIC8qIERvIHRoZSB3b3JrICovCi0gICAgdm9pZCAoKnBvY19oYW5kbGVyKSBQQVJBTVMgKChpbnQpKTsKLSAgICAvKiBWYWx1ZSB0byBwYXNzIHRvIGhhbmRsZXIgKi8KLSAgICBpbnQgcG9jX3ZhbDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX3BzZXVkb190eXBlIHBzZXVkb190eXBlUzsKLQotLyogUHJlZmVyIHZhcmFyZ3MgZm9yIG5vbi1BTlNJIGNvbXBpbGVyLCBzaW5jZSBzb21lIHdpbGwgYmFyZiBpZiB0aGUKLSAgIGVsbGlwc2lzIGRlZmluaXRpb24gaXMgdXNlZCB3aXRoIGEgbm8tYXJndW1lbnRzIGRlY2xhcmF0aW9uLiAgKi8KLSNpZiBkZWZpbmVkIChIQVZFX1ZBUkFSR1NfSCkgJiYgIWRlZmluZWQgKF9fU1REQ19fKQotI3VuZGVmIEhBVkVfU1REQVJHX0gKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9TVERBUkdfSCkKLSNkZWZpbmUgVVNFX1NUREFSRwotI2VuZGlmCi0jaWYgIWRlZmluZWQgKFVTRV9TVERBUkcpICYmIGRlZmluZWQgKEhBVkVfVkFSQVJHU19IKQotI2RlZmluZSBVU0VfVkFSQVJHUwotI2VuZGlmCi0KLSNpZmRlZiBVU0VfU1REQVJHCi0jaWYgKF9fR05VQ19fID49IDIpICYmICFkZWZpbmVkKFZNUykKLS8qIGZvciB1c2Ugd2l0aCAtV2Zvcm1hdCAqLwotCi0jaWYgX19HTlVDX01JTk9SX18gPCA2Ci0vKiBTdXBwb3J0IGZvciBkb3VibGUgdW5kZXJzY29yZXMgaW4gYXR0cmlidXRlIG5hbWVzIHdhcyBhZGRlZCBpbiBnY2MKLSAgIDIuNiwgc28gYXZvaWQgdGhlbSBpZiB3ZSBhcmUgdXNpbmcgYW4gZWFybGllciB2ZXJzaW9uLiAgKi8KLSNkZWZpbmUgX19wcmludGZfXyBwcmludGYKLSNkZWZpbmUgX19mb3JtYXRfXyBmb3JtYXQKLSNlbmRpZgotCi0jZGVmaW5lIFBSSU5URl9MSUtFKEZDTikgXAotICB2b2lkIEZDTiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIFwKLSAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMSwgMikpKQotI2RlZmluZSBQUklOVEZfV0hFUkVfTElLRShGQ04pIFwKLSAgdm9pZCBGQ04gKGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgXAotICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpCi0KLSNlbHNlIC8qIF9fR05VQ19fIDwgMiB8fCBkZWZpbmVkKFZNUykgKi8KLQotI2RlZmluZSBQUklOVEZfTElLRShGQ04pCXZvaWQgRkNOIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSkKLSNkZWZpbmUgUFJJTlRGX1dIRVJFX0xJS0UoRkNOKQl2b2lkIEZDTiBQQVJBTVMgKChjaGFyICpmaWxlLCBcCi0JCQkJCQkgIHVuc2lnbmVkIGludCBsaW5lLCBcCi0JCQkJCSAgCSAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKQotCi0jZW5kaWYgLyogX19HTlVDX18gPCAyIHx8IGRlZmluZWQoVk1TKSAqLwotCi0jZWxzZSAvKiAhIFVTRV9TVERBUkcgKi8KLQotI2RlZmluZSBQUklOVEZfTElLRShGQ04pCXZvaWQgRkNOICgpCi0jZGVmaW5lIFBSSU5URl9XSEVSRV9MSUtFKEZDTikJdm9pZCBGQ04gKCkKLQotI2VuZGlmIC8qICEgVVNFX1NUREFSRyAqLwotCi1QUklOVEZfTElLRSAoYXNfYmFkKTsKLVBSSU5URl9MSUtFIChhc19mYXRhbCk7Ci1QUklOVEZfTElLRSAoYXNfdHNrdHNrKTsKLVBSSU5URl9MSUtFIChhc193YXJuKTsKLVBSSU5URl9XSEVSRV9MSUtFIChhc19iYWRfd2hlcmUpOwotUFJJTlRGX1dIRVJFX0xJS0UgKGFzX3dhcm5fd2hlcmUpOwotCi12b2lkIGFzX2Fzc2VydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSk7Ci12b2lkIGFzX2Fib3J0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLQotdm9pZCBmcHJpbnRfdmFsdWUgUEFSQU1TICgoRklMRSAqZmlsZSwgYWRkcmVzc1QgdmFsdWUpKTsKLXZvaWQgc3ByaW50X3ZhbHVlIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgYWRkcmVzc1QgdmFsdWUpKTsKLQotaW50IGhhZF9lcnJvcnMgUEFSQU1TICgodm9pZCkpOwotaW50IGhhZF93YXJuaW5ncyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQgcHJpbnRfdmVyc2lvbl9pZCBQQVJBTVMgKCh2b2lkKSk7Ci1jaGFyICphcHBfcHVzaCBQQVJBTVMgKCh2b2lkKSk7Ci1jaGFyICphdG9mX2llZWUgUEFSQU1TICgoY2hhciAqc3RyLCBpbnQgd2hhdF9raW5kLCBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7Ci1jaGFyICppbnB1dF9zY3J1Yl9pbmNsdWRlX2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUsIGNoYXIgKnBvc2l0aW9uKSk7Ci1leHRlcm4gdm9pZCBpbnB1dF9zY3J1Yl9pbnNlcnRfbGluZSBQQVJBTVMoKGNvbnN0IGNoYXIgKmxpbmUpKTsKLWV4dGVybiB2b2lkIGlucHV0X3NjcnViX2luc2VydF9maWxlIFBBUkFNUygoY2hhciAqcGF0aCkpOwotY2hhciAqaW5wdXRfc2NydWJfbmV3X2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLWNoYXIgKmlucHV0X3NjcnViX25leHRfYnVmZmVyIFBBUkFNUyAoKGNoYXIgKipidWZwKSk7Ci1pbnQgZG9fc2NydWJfY2hhcnMgUEFSQU1TICgoaW50ICgqZ2V0KSAoY2hhciAqLCBpbnQpLCBjaGFyICp0bywgaW50IHRvbGVuKSk7Ci1pbnQgZ2VuX3RvX3dvcmRzIFBBUkFNUyAoKExJVFRMRU5VTV9UWVBFICogd29yZHMsIGludCBwcmVjaXNpb24sCi0JCQkgIGxvbmcgZXhwb25lbnRfYml0cykpOwotaW50IGhhZF9lcnIgUEFSQU1TICgodm9pZCkpOwotaW50IGlnbm9yZV9pbnB1dCBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGNvbmRfZmluaXNoX2NoZWNrIFBBUkFNUyAoKGludCkpOwotdm9pZCBjb25kX2V4aXRfbWFjcm8gUEFSQU1TICgoaW50KSk7Ci1pbnQgc2Vlbl9hdF9sZWFzdF8xX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotdm9pZCBhcHBfcG9wIFBBUkFNUyAoKGNoYXIgKmFyZykpOwotdm9pZCBhc19ob3dtdWNoIFBBUkFNUyAoKEZJTEUgKiBzdHJlYW0pKTsKLXZvaWQgYXNfcGVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmdyaXBlLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotdm9pZCBhc193aGVyZSBQQVJBTVMgKChjaGFyICoqbmFtZXAsIHVuc2lnbmVkIGludCAqbGluZXApKTsKLXZvaWQgYnVtcF9saW5lX2NvdW50ZXJzIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgZG9fc2NydWJfYmVnaW4gUEFSQU1TICgoaW50KSk7Ci12b2lkIGlucHV0X3NjcnViX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfc2NydWJfY2xvc2UgUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9zY3J1Yl9lbmQgUEFSQU1TICgodm9pZCkpOwotaW50IG5ld19sb2dpY2FsX2xpbmUgUEFSQU1TICgoY2hhciAqZm5hbWUsIGludCBsaW5lX251bWJlcikpOwotdm9pZCBzdWJzZWdzX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgc3Vic2VnX2NoYW5nZSBQQVJBTVMgKChzZWdUIHNlZywgaW50IHN1YnNlZykpOwotc2VnVCBzdWJzZWdfbmV3IFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIHN1YnNlZ1Qgc3Vic2VnKSk7Ci1zZWdUIHN1YnNlZ19mb3JjZV9uZXcgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgc3Vic2VnVCBzdWJzZWcpKTsKLXZvaWQgc3Vic2VnX3NldCBQQVJBTVMgKChzZWdUIHNlZywgc3Vic2VnVCBzdWJzZWcpKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zZWdUIHN1YnNlZ19nZXQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLSNlbmRpZgotaW50IHN1YnNlZ190ZXh0X3AgUEFSQU1TICgoc2VnVCkpOwotCi12b2lkIHN0YXJ0X2RlcGVuZGVuY2llcyBQQVJBTVMgKChjaGFyICopKTsKLXZvaWQgcmVnaXN0ZXJfZGVwZW5kZW5jeSBQQVJBTVMgKChjaGFyICopKTsKLXZvaWQgcHJpbnRfZGVwZW5kZW5jaWVzIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RydWN0IGV4cHJlc3Npb25TOwotc3RydWN0IGZpeDsKLXR5cGVkZWYgc3RydWN0IHN5bWJvbCBzeW1ib2xTOwotc3RydWN0IHJlbGF4X3R5cGU7Ci10eXBlZGVmIHN0cnVjdCBmcmFnIGZyYWdTOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotLyogbGl0ZXJhbC5jICovCi12YWx1ZVQgYWRkX3RvX2xpdGVyYWxfcG9vbCBQQVJBTVMgKChzeW1ib2xTICosIHZhbHVlVCwgc2VnVCwgaW50KSk7Ci0jZW5kaWYKLQotaW50IGNoZWNrX2VoX2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBleHByZXNzaW9uUyAqLCB1bnNpZ25lZCBpbnQgKikpOwotaW50IGVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFBBUkFNUyAoKGZyYWdTICopKTsKLWludCBlaF9mcmFtZV9yZWxheF9mcmFnIFBBUkFNUyAoKGZyYWdTICopKTsKLXZvaWQgZWhfZnJhbWVfY29udmVydF9mcmFnIFBBUkFNUyAoKGZyYWdTICopKTsKLQotI2luY2x1ZGUgImV4cHIuaCIJCS8qIEJlZm9yZSB0YXJnLSouaCAqLwotCi0vKiB0aGlzIG9uZSBzdGFydHMgdGhlIGNoYWluIG9mIHRhcmdldCBkZXBlbmRhbnQgaGVhZGVycyAqLwotI2luY2x1ZGUgInRhcmctZW52LmgiCi0KLSNpbmNsdWRlICJ3cml0ZS5oIgotI2luY2x1ZGUgImZyYWdzLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgInJlYWQuaCIKLSNpbmNsdWRlICJzeW1ib2xzLmgiCi0KLSNpbmNsdWRlICJ0Yy5oIgotI2luY2x1ZGUgIm9iai5oIgotCi0jaWZkZWYgVVNFX0VNVUxBVElPTlMKLSNpbmNsdWRlICJlbXVsLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJsaXN0aW5nLmgiCi0KLSNpZmRlZiBUQ19NNjhLCi0vKiBUcnVlIGlmIHdlIGFyZSBhc3NlbWJsaW5nIGluIG02OGsgTVJJIG1vZGUuICAqLwotQ09NTU9OIGludCBmbGFnX202OGtfbXJpOwotI2Vsc2UKLSNkZWZpbmUgZmxhZ19tNjhrX21yaSAwCi0jZW5kaWYKLQotI2lmbmRlZiBOVU1CRVJTX1dJVEhfU1VGRklYCi0jZGVmaW5lIE5VTUJFUlNfV0lUSF9TVUZGSVggMAotI2VuZGlmCi0KLSNpZm5kZWYgTE9DQUxfTEFCRUxTX0RPTExBUgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDAKLSNlbmRpZgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19GQgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMAotI2VuZGlmCi0KLSNpZm5kZWYgTEFCRUxTX1dJVEhPVVRfQ09MT05TCi0jZGVmaW5lIExBQkVMU19XSVRIT1VUX0NPTE9OUyAwCi0jZW5kaWYKLQotI2lmbmRlZiBOT19QU0VVRE9fRE9UCi0jZGVmaW5lIE5PX1BTRVVET19ET1QgMAotI2VuZGlmCi0KLSNpZm5kZWYgVEVYVF9TRUNUSU9OX05BTUUKLSNkZWZpbmUgVEVYVF9TRUNUSU9OX05BTUUJIi50ZXh0IgotI2RlZmluZSBEQVRBX1NFQ1RJT05fTkFNRQkiLmRhdGEiCi0jZGVmaW5lIEJTU19TRUNUSU9OX05BTUUJIi5ic3MiCi0jZW5kaWYKLQotI2lmbmRlZiBPQ1RFVFNfUEVSX0JZVEVfUE9XRVIKLSNkZWZpbmUgT0NURVRTX1BFUl9CWVRFX1BPV0VSIDAKLSNlbmRpZgotI2lmbmRlZiBPQ1RFVFNfUEVSX0JZVEUKLSNkZWZpbmUgT0NURVRTX1BFUl9CWVRFICgxPDxPQ1RFVFNfUEVSX0JZVEVfUE9XRVIpCi0jZW5kaWYKLSNpZiBPQ1RFVFNfUEVSX0JZVEUgIT0gKDE8PE9DVEVUU19QRVJfQllURV9QT1dFUikKLSAjZXJyb3IgIk9jdGV0cyBwZXIgYnl0ZSBjb25mbGljdHMgd2l0aCBpdHMgcG93ZXItb2YtdHdvIGRlZmluaXRpb24hIgotI2VuZGlmCi0KLSNlbmRpZiAvKiBHQVMgKi8KLQotLyogZW5kIG9mIGFzLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9hc2ludGwuaCBiL2dhcy9hc2ludGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczM2M4NS4uMDAwMDAwMAotLS0gYS9nYXMvYXNpbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBhc2ludGwuaCAtIGdhcy1zcGVjaWZpYyBoZWFkZXIgZm9yIGdldHRleHQgY29kZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZkZWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvYXRvZi1nZW5lcmljLmMgYi9nYXMvYXRvZi1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjlmMjEuLjAwMDAwMDAKLS0tIGEvZ2FzL2F0b2YtZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qIGF0b2ZfZ2VuZXJpYy5jIC0gdHVybiBhIHN0cmluZyBvZiBkaWdpdHMgaW50byBhIEZsb251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICgwKQotI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgKDEpCi0jZW5kaWYKLQotI2lmZGVmIFRSQUNFCi1zdGF0aWMgdm9pZCBmbG9udW1fcHJpbnQgUEFSQU1TICgoY29uc3QgRkxPTlVNX1RZUEUgKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1QKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglHaXZlbiBhIHN0cmluZyBvZiBkZWNpbWFsIGRpZ2l0cyAsIHdpdGggb3B0aW9uYWwgZGVjaW1hbAkqCi0gKgltYXJrIGFuZCBvcHRpb25hbCBkZWNpbWFsIGV4cG9uZW50IChwbGFjZSB2YWx1ZSkgb2YgdGhlCQkqCi0gKglsb3dlc3Rfb3JkZXIgZGVjaW1hbCBkaWdpdDogcHJvZHVjZSBhIGZsb2F0aW5nIHBvaW50CQkqCi0gKgludW1iZXIuIFRoZSBudW1iZXIgaXMgJ2dlbmVyaWMnIGZsb2F0aW5nIHBvaW50OiBvdXIJCSoKLSAqCWNhbGxlciB3aWxsIGVuY29kZSBpdCBmb3IgYSBzcGVjaWZpYyBtYWNoaW5lIGFyY2hpdGVjdHVyZS4JKgotICoJCQkJCQkJCQkqCi0gKglBc3N1bXB0aW9ucwkJCQkJCQkqCi0gKgkJdXNlcyBiYXNlIChyYWRpeCkgMgkJCQkJKgotICoJCXRoaXMgbWFjaGluZSB1c2VzIDIncyBjb21wbGVtZW50IGJpbmFyeSBpbnRlZ2VycwkqCi0gKgkJdGFyZ2V0IGZsb251bXMgdXNlICIgICAgICAiICAgICAgICAgIiAgICAgICAiCQkqCi0gKgkJdGFyZ2V0IGZsb251bXMgZXhwb25lbnRzIGZpdCBpbiBhIGxvbmcJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0KLSAgU3ludGF4OgotCi0gIDxmbG9udW0+IDo6PSA8b3B0aW9uYWwtc2lnbj4gPGRlY2ltYWwtbnVtYmVyPiA8b3B0aW9uYWwtZXhwb25lbnQ+Ci0gIDxvcHRpb25hbC1zaWduPiA6Oj0gJysnIHwgJy0nIHwge2VtcHR5fQotICA8ZGVjaW1hbC1udW1iZXI+IDo6PSA8aW50ZWdlcj4KLSAgfCA8aW50ZWdlcj4gPHJhZGl4LWNoYXJhY3Rlcj4KLSAgfCA8aW50ZWdlcj4gPHJhZGl4LWNoYXJhY3Rlcj4gPGludGVnZXI+Ci0gIHwgPHJhZGl4LWNoYXJhY3Rlcj4gPGludGVnZXI+Ci0KLSAgPG9wdGlvbmFsLWV4cG9uZW50PiA6Oj0ge2VtcHR5fQotICB8IDxleHBvbmVudC1jaGFyYWN0ZXI+IDxvcHRpb25hbC1zaWduPiA8aW50ZWdlcj4KLQotICA8aW50ZWdlcj4gOjo9IDxkaWdpdD4gfCA8ZGlnaXQ+IDxpbnRlZ2VyPgotICA8ZGlnaXQ+IDo6PSAnMCcgfCAnMScgfCAnMicgfCAnMycgfCAnNCcgfCAnNScgfCAnNicgfCAnNycgfCAnOCcgfCAnOScKLSAgPGV4cG9uZW50LWNoYXJhY3Rlcj4gOjo9IHtvbmUgY2hhcmFjdGVyIGZyb20gInN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzIn0KLSAgPHJhZGl4LWNoYXJhY3Rlcj4gOjo9IHtvbmUgY2hhcmFjdGVyIGZyb20gInN0cmluZ19vZl9kZWNpbWFsX21hcmtzIn0KLQotICAqLwotCi1pbnQKLWF0b2ZfZ2VuZXJpYyAoYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciwKLQkgICAgICBzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrcywKLQkgICAgICBzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywKLQkgICAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKQotICAgICAvKiByZXR1cm4gcG9pbnRlciB0byBqdXN0IEFGVEVSIG51bWJlciB3ZSByZWFkLiAqLwotICAgICBjaGFyICoqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlcjsKLSAgICAgLyogQXQgbW9zdCBvbmUgcGVyIG51bWJlci4gKi8KLSAgICAgY29uc3QgY2hhciAqc3RyaW5nX29mX2RlY2ltYWxfbWFya3M7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzOwotICAgICBGTE9OVU1fVFlQRSAqYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsJCS8qIDAgbWVhbnMgT0suICovCi0gIGNoYXIgKmZpcnN0X2RpZ2l0OwotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbDsKLSAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbDsKLSAgbG9uZyBkZWNpbWFsX2V4cG9uZW50OwotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGU7Ci0gIGNoYXIgZGlnaXRzX3NpZ25fY2hhcjsKLQotICAvKgotICAgKiBTY2FuIHRoZSBpbnB1dCBzdHJpbmcsIGFic3RyYWN0aW5nICgxKWRpZ2l0cyAoMilkZWNpbWFsIG1hcmsgKDMpIGV4cG9uZW50LgotICAgKiBJdCB3b3VsZCBiZSBzaW1wbGVyIHRvIG1vZGlmeSB0aGUgc3RyaW5nLCBidXQgd2UgZG9uJ3Q7IGp1c3QgdG8gYmUgbmljZQotICAgKiB0byBjYWxsZXIuCi0gICAqIFdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBkaWdpdHMgd2UgaGF2ZSwgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlIGZvcgotICAgKiB0aGUgZGlnaXRzJyB2YWx1ZS4KLSAgICovCi0KLSAgY2hhciAqcDsKLSAgY2hhciBjOwotICBpbnQgc2Vlbl9zaWduaWZpY2FudF9kaWdpdDsKLQotI2lmZGVmIEFTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UCi0gIGFzc2VydCAoc3RyaW5nX29mX2RlY2ltYWxfbWFya3NbMF0gPT0gJy4nCi0JICAmJiBzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrc1sxXSA9PSAwKTsKLSNkZWZpbmUgSVNfREVDSU1BTF9NQVJLKGMpCSgoYykgPT0gJy4nKQotI2Vsc2UKLSNkZWZpbmUgSVNfREVDSU1BTF9NQVJLKGMpCSgwICE9IHN0cmNociAoc3RyaW5nX29mX2RlY2ltYWxfbWFya3MsIChjKSkpCi0jZW5kaWYKLQotICBmaXJzdF9kaWdpdCA9ICphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyOwotICBjID0gKmZpcnN0X2RpZ2l0OwotCi0gIGlmIChjID09ICctJyB8fCBjID09ICcrJykKLSAgICB7Ci0gICAgICBkaWdpdHNfc2lnbl9jaGFyID0gYzsKLSAgICAgIGZpcnN0X2RpZ2l0Kys7Ci0gICAgfQotICBlbHNlCi0gICAgZGlnaXRzX3NpZ25fY2hhciA9ICcrJzsKLQotICBzd2l0Y2ggKGZpcnN0X2RpZ2l0WzBdKQotICAgIHsKLSAgICBjYXNlICduJzoKLSAgICBjYXNlICdOJzoKLSAgICAgIGlmICghc3RybmNhc2VjbXAgKCJuYW4iLCBmaXJzdF9kaWdpdCwgMykpCi0JewotCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9IDA7Ci0JICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5leHBvbmVudCA9IDA7Ci0JICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sZWFkZXIgPQotCSAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sb3c7Ci0JICAqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciA9IGZpcnN0X2RpZ2l0ICsgMzsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaSc6Ci0gICAgY2FzZSAnSSc6Ci0gICAgICBpZiAoIXN0cm5jYXNlY21wICgiaW5mIiwgZmlyc3RfZGlnaXQsIDMpKQotCXsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPQotCSAgICBkaWdpdHNfc2lnbl9jaGFyID09ICcrJyA/ICdQJyA6ICdOJzsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmV4cG9uZW50ID0gMDsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxlYWRlciA9Ci0JICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdzsKLQotCSAgZmlyc3RfZGlnaXQgKz0gMzsKLQkgIGlmICghc3RybmNhc2VjbXAgKCJpbml0eSIsIGZpcnN0X2RpZ2l0LCA1KSkKLQkgICAgZmlyc3RfZGlnaXQgKz0gNTsKLQotCSAgKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXIgPSBmaXJzdF9kaWdpdDsKLQotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwgPSAwOwotICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwgPSAwOwotICBkZWNpbWFsX2V4cG9uZW50ID0gMDsKLSAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IDA7Ci0gIGZvciAocCA9IGZpcnN0X2RpZ2l0OwotICAgICAgICgoKGMgPSAqcCkgIT0gJ1wwJykKLQkmJiAoIWMgfHwgIUlTX0RFQ0lNQUxfTUFSSyAoYykpCi0JJiYgKCFjIHx8ICFzdHJjaHIgKHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLCBjKSkpOwotICAgICAgIHArKykKLSAgICB7Ci0gICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCXsKLQkgIGlmIChzZWVuX3NpZ25pZmljYW50X2RpZ2l0IHx8IGMgPiAnMCcpCi0JICAgIHsKLQkgICAgICArK251bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWw7Ci0JICAgICAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpcnN0X2RpZ2l0Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYnJlYWs7CQkvKiBwIC0+IGNoYXIgYWZ0ZXIgcHJlLWRlY2ltYWwgZGlnaXRzLiAqLwotCX0KLSAgICB9CQkJCS8qIEZvciBlYWNoIGRpZ2l0IGJlZm9yZSBkZWNpbWFsIG1hcmsuICovCi0KLSNpZm5kZWYgT0xEX0ZMT0FUX1JFQURTCi0gIC8qIElnbm9yZSB0cmFpbGluZyAwJ3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuICBUaGUgb3JpZ2luYWwgY29kZSBoZXJlCi0gICAqIChpZmRlZidkIG91dCkgZG9lcyBub3QgZG8gdGhpcywgYW5kIG51bWJlcnMgbGlrZQotICAgKgk0LjI5NDk2NzI5NjAwMDAwMDAwMDAwZSswOQkoMioqMzEpCi0gICAqIGNvbWUgb3V0IGluZXhhY3QgZm9yIHNvbWUgcmVhc29uIHJlbGF0ZWQgdG8gbGVuZ3RoIG9mIHRoZSBkaWdpdAotICAgKiBzdHJpbmcuCi0gICAqLwotICBpZiAoYyAmJiBJU19ERUNJTUFMX01BUksgKGMpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB6ZXJvcyA9IDA7CS8qIExlbmd0aCBvZiBjdXJyZW50IHN0cmluZyBvZiB6ZXJvcyAqLwotCi0gICAgICBmb3IgKHArKzsgKGMgPSAqcCkgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpOyBwKyspCi0JewotCSAgaWYgKGMgPT0gJzAnKQotCSAgICB7Ci0JICAgICAgemVyb3MrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsICs9IDEgKyB6ZXJvczsKLQkgICAgICB6ZXJvcyA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2Vsc2UKLSAgaWYgKGMgJiYgSVNfREVDSU1BTF9NQVJLIChjKSkKLSAgICB7Ci0gICAgICBmb3IgKHArKzsKLQkgICAoKChjID0gKnApICE9ICdcMCcpCi0JICAgICYmICghYyB8fCAhc3RyY2hyIChzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywgYykpKTsKLQkgICBwKyspCi0JewotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbWF5IGJlIHJldHJhY3RlZCBiZWxvdy4gKi8KLQkgICAgICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwrKzsKLQotCSAgICAgIGlmICggLyogc2Vlbl9zaWduaWZpY2FudF9kaWdpdCB8fCAqLyBjID4gJzAnKQotCQl7Ci0JCSAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IFRSVUU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCFzZWVuX3NpZ25pZmljYW50X2RpZ2l0KQotCQl7Ci0JCSAgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQkJCS8qIEZvciBlYWNoIGRpZ2l0IGFmdGVyIGRlY2ltYWwgbWFyay4gKi8KLSAgICB9Ci0KLSAgd2hpbGUgKG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbAotCSAmJiBmaXJzdF9kaWdpdFtudW1iZXJfb2ZfZGlnaXRzX2JlZm9yZV9kZWNpbWFsCi0JCQkrIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbF0gPT0gJzAnKQotICAgIC0tbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsOwotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKGMgPT0gJ18nKQotCWMgPSAqKytwOwotICAgIH0KLSAgaWYgKGMgJiYgc3RyY2hyIChzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywgYykpCi0gICAgewotICAgICAgY2hhciBkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyOwotCi0gICAgICBjID0gKisrcDsKLSAgICAgIGlmIChmbGFnX202OGtfbXJpKQotCXsKLQkgIHdoaWxlIChjID09ICdfJykKLQkgICAgYyA9ICorK3A7Ci0JfQotICAgICAgaWYgKGMgJiYgc3RyY2hyICgiKy0iLCBjKSkKLQl7Ci0JICBkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyID0gYzsKLQkgIGMgPSAqKytwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyID0gJysnOwotCX0KLQotICAgICAgZm9yICg7IChjKTsgYyA9ICorK3ApCi0JewotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgewotCSAgICAgIGRlY2ltYWxfZXhwb25lbnQgPSBkZWNpbWFsX2V4cG9uZW50ICogMTAgKyBjIC0gJzAnOwotCSAgICAgIC8qCi0JICAgICAgICogQlVHISBJZiB3ZSBvdmVyZmxvdyBoZXJlLCB3ZSBsb3NlIQotCSAgICAgICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGRpZ2l0c19leHBvbmVudF9zaWduX2NoYXIgPT0gJy0nKQotCXsKLQkgIGRlY2ltYWxfZXhwb25lbnQgPSAtZGVjaW1hbF9leHBvbmVudDsKLQl9Ci0gICAgfQotCi0gICphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyID0gcDsKLQotCi0KLSAgbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGUgPQotICAgIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwgKyBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWw7Ci0gIHJldHVybl92YWx1ZSA9IDA7Ci0gIGlmIChudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZSA9PSAwKQotICAgIHsKLSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmV4cG9uZW50ID0gMDsJLyogTm90IHN0cmljdGx5IG5lY2Vzc2FyeSAqLwotICAgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bGVhZGVyCi0JPSAtMSArIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdzsKLSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPSBkaWdpdHNfc2lnbl9jaGFyOwotICAgICAgLyogV2UgaGF2ZSBqdXN0IGNvbmNvY3RlZCAoKy8tKTAuMEUwICovCi0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgY291bnQ7CQkvKiBOdW1iZXIgb2YgdXNlZnVsIGRpZ2l0cyBsZWZ0IHRvIHNjYW4uICovCi0KLSAgICAgIExJVFRMRU5VTV9UWVBFICpkaWdpdHNfYmluYXJ5X2xvdzsKLSAgICAgIHVuc2lnbmVkIGludCBwcmVjaXNpb247Ci0gICAgICB1bnNpZ25lZCBpbnQgbWF4aW11bV91c2VmdWxfZGlnaXRzOwotICAgICAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlOwotICAgICAgdW5zaWduZWQgaW50IG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzOwotICAgICAgdW5zaWduZWQgaW50IG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzOwotICAgICAgdW5zaWduZWQgaW50IHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXM7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnM7Ci0gICAgICBGTE9OVU1fVFlQRSBwb3dlcl9vZl8xMF9mbG9udW07Ci0gICAgICBGTE9OVU1fVFlQRSBkaWdpdHNfZmxvbnVtOwotCi0gICAgICBwcmVjaXNpb24gPSAoYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+aGlnaAotCQkgICAtIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdwotCQkgICArIDEpOwkvKiBOdW1iZXIgb2YgZGVzdGluYXRpb24gbGl0dGxlbnVtcy4gKi8KLQotICAgICAgLyogSW5jbHVkZXMgZ3VhcmQgYml0cyAodHdvIGxpdHRsZW51bXMgd29ydGgpICovCi0jaWYgMCAvKiBUaGUgaW50ZWdlciB2ZXJzaW9uIGJlbG93IGlzIHZlcnkgY2xvc2UsIGFuZCBpdCBkb2Vzbid0Ci0JIHJlcXVpcmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCAod2hpY2ggaXMgY3VycmVudGx5IGJ1Z2d5IG9uCi0JIHRoZSBBbHBoYSkuICAqLwotICAgICAgbWF4aW11bV91c2VmdWxfZGlnaXRzID0gKCgoZG91YmxlKSAocHJlY2lzaW9uIC0gMikpCi0JCQkgICAgICAgKiAoKGRvdWJsZSkgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykpCi0JCQkgICAgICAgLyAoTE9HX1RPX0JBU0VfMl9PRl8xMCkpCi0JKyAyOwkJCS8qIDIgOjogZ3VhcmQgZGlnaXRzLiAqLwotI2Vsc2UKLSAgICAgIG1heGltdW1fdXNlZnVsX2RpZ2l0cyA9ICgoKHByZWNpc2lvbiAtIDIpKQotCQkJICAgICAgICogKCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKSkKLQkJCSAgICAgICAqIDEwMDAwMDAgLyAzMzIxOTI4KQotCSsgMjsJCQkvKiAyIDo6IGd1YXJkIGRpZ2l0cy4gKi8KLSNlbmRpZgotCi0gICAgICBpZiAobnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGUgPiBtYXhpbXVtX3VzZWZ1bF9kaWdpdHMpCi0JewotCSAgbnVtYmVyX29mX2RpZ2l0c190b191c2UgPSBtYXhpbXVtX3VzZWZ1bF9kaWdpdHM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlID0gbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGU7Ci0JfQotCi0gICAgICAvKiBDYXN0IHRoZXNlIHRvIFNJR05FRCBMT05HIGZpcnN0LCBvdGhlcndpc2UsIG9uIHN5c3RlbXMgd2l0aAotCSBMT05HIHdpZGVyIHRoYW4gSU5UIChzdWNoIGFzIEFscGhhIE9TRi8xKSwgdW5zaWduZWRuZXNzIG1heQotCSBjYXVzZSB1bmV4cGVjdGVkIHJlc3VsdHMuICAqLwotICAgICAgZGVjaW1hbF9leHBvbmVudCArPSAoKGxvbmcpIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwKLQkJCSAgIC0gKGxvbmcpIG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlKTsKLQotI2lmIDAKLSAgICAgIG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzCi0JPSAoKCgoZG91YmxlKSBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZSkgKiBMT0dfVE9fQkFTRV8yX09GXzEwKSArIDEpOwotI2Vsc2UKLSAgICAgIG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzCi0JPSAobnVtYmVyX29mX2RpZ2l0c190b191c2UgKiAzMzIxOTI4IC8gMTAwMDAwMCArIDEpOwotI2VuZGlmCi0KLSAgICAgIG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzCi0JPSAobW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMKLQkgICAvIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkrIDI7Ci0KLSAgICAgIC8qIENvbXB1dGUgKGRpZ2l0cykgcGFydC4gSW4gIjEyLjM0RTU2IiB0aGlzIGlzIHRoZSAiMTIzNCIgcGFydC4KLQkgQXJpdGhtZXRpYyBpcyBleGFjdCBoZXJlLiBJZiBubyBkaWdpdHMgYXJlIHN1cHBsaWVkIHRoZW4gdGhpcwotCSBwYXJ0IGlzIGEgMCB2YWx1ZWQgYmluYXJ5IGludGVnZXIuICBBbGxvY2F0ZSByb29tIHRvIGJ1aWxkIHVwCi0JIHRoZSBiaW5hcnkgbnVtYmVyIGFzIGxpdHRsZW51bXMuICBXZSB3YW50IHRoaXMgbWVtb3J5IHRvCi0JIGRpc2FwcGVhciB3aGVuIHdlIGxlYXZlIHRoaXMgZnVuY3Rpb24uICBBc3N1bWUgbm8gYWxpZ25tZW50Ci0JIHByb2JsZW1zID0+IChyb29tIGZvciBuIG9iamVjdHMpID09IG4gKiAocm9vbSBmb3IgMQotCSBvYmplY3QpLiAgKi8KLQotICAgICAgc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcyA9IG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzOwotICAgICAgc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnMgPSBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zCi0JKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICAgICAgZGlnaXRzX2JpbmFyeV9sb3cgPSAoTElUVExFTlVNX1RZUEUgKikKLQlhbGxvY2EgKHNpemVfb2ZfZGlnaXRzX2luX2NoYXJzKTsKLQotICAgICAgbWVtc2V0ICgoY2hhciAqKSBkaWdpdHNfYmluYXJ5X2xvdywgJ1wwJywgc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnMpOwotCi0gICAgICAvKiBEaWdpdHNfYmluYXJ5X2xvd1tdIGlzIGFsbG9jYXRlZCBhbmQgemVyb2VkLiAqLwotCi0gICAgICAvKgotICAgICAgICogUGFyc2UgdGhlIGRlY2ltYWwgZGlnaXRzIGFzIGlmICogZGlnaXRzX2xvdyB3YXMgaW4gdGhlIHVuaXRzIHBvc2l0aW9uLgotICAgICAgICogRW1pdCBhIGJpbmFyeSBudW1iZXIgaW50byBkaWdpdHNfYmluYXJ5X2xvd1tdLgotICAgICAgICoKLSAgICAgICAqIFVzZSBhIGxhcmdlLXByZWNpc2lvbiB2ZXJzaW9uIG9mOgotICAgICAgICogKCgoMXN0LWRpZ2l0KSAqIDEwICsgMm5kLWRpZ2l0KSAqIDEwICsgM3JkLWRpZ2l0IC4uLikgKiAxMCArIGxhc3QtZGlnaXQKLSAgICAgICAqLwotCi0gICAgICBmb3IgKHAgPSBmaXJzdF9kaWdpdCwgY291bnQgPSBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZTsgY291bnQ7IHArKywgLS1jb3VudCkKLQl7Ci0JICBjID0gKnA7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBNdWx0aXBseSBieSAxMC4gQXNzdW1lIGNhbiBuZXZlciBvdmVyZmxvdy4KLQkgICAgICAgKiBBZGQgdGhpcyBkaWdpdCB0byBkaWdpdHNfYmluYXJ5X2xvd1tdLgotCSAgICAgICAqLwotCi0JICAgICAgbG9uZyBjYXJyeTsKLQkgICAgICBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0JICAgICAgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9saW1pdDsKLQotCSAgICAgIGxpdHRsZW51bV9saW1pdCA9IGRpZ2l0c19iaW5hcnlfbG93Ci0JCSsgbW9yZV90aGFuX2Vub3VnaF9saXR0bGVudW1zX2Zvcl9kaWdpdHMKLQkJLSAxOwotCi0JICAgICAgY2FycnkgPSBjIC0gJzAnOwkvKiBjaGFyIC0+IGJpbmFyeSAqLwotCi0JICAgICAgZm9yIChsaXR0bGVudW1fcG9pbnRlciA9IGRpZ2l0c19iaW5hcnlfbG93OwotCQkgICBsaXR0bGVudW1fcG9pbnRlciA8PSBsaXR0bGVudW1fbGltaXQ7Ci0JCSAgIGxpdHRsZW51bV9wb2ludGVyKyspCi0JCXsKLQkJICBsb25nIHdvcms7Ci0KLQkJICB3b3JrID0gY2FycnkgKyAxMCAqIChsb25nKSAoKmxpdHRsZW51bV9wb2ludGVyKTsKLQkJICAqbGl0dGxlbnVtX3BvaW50ZXIgPSB3b3JrICYgTElUVExFTlVNX01BU0s7Ci0JCSAgY2FycnkgPSB3b3JrID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJfQotCi0JICAgICAgaWYgKGNhcnJ5ICE9IDApCi0JCXsKLQkJICAvKgotCQkgICAqIFdlIGhhdmUgYSBHUk9TUyBpbnRlcm5hbCBlcnJvci4KLQkJICAgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCi0JCSAgICovCi0JCSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICsrY291bnQ7CQkvKiAnLicgZG9lc24ndCBhbHRlciBkaWdpdHMgdXNlZCBjb3VudC4gKi8KLQkgICAgfQotCX0KLQotCi0gICAgICAvKgotICAgICAgICogRGlnaXRzX2JpbmFyeV9sb3dbXSBwcm9wZXJseSBlbmNvZGVzIHRoZSB2YWx1ZSBvZiB0aGUgZGlnaXRzLgotICAgICAgICogRm9yZ2V0IGFib3V0IGFueSBoaWdoLW9yZGVyIGxpdHRsZW51bXMgdGhhdCBhcmUgMC4KLSAgICAgICAqLwotICAgICAgd2hpbGUgKGRpZ2l0c19iaW5hcnlfbG93W3NpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMgLSAxXSA9PSAwCi0JICAgICAmJiBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zID49IDIpCi0Jc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcy0tOwotCi0gICAgICBkaWdpdHNfZmxvbnVtLmxvdyA9IGRpZ2l0c19iaW5hcnlfbG93OwotICAgICAgZGlnaXRzX2Zsb251bS5oaWdoID0gZGlnaXRzX2JpbmFyeV9sb3cgKyBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zIC0gMTsKLSAgICAgIGRpZ2l0c19mbG9udW0ubGVhZGVyID0gZGlnaXRzX2Zsb251bS5oaWdoOwotICAgICAgZGlnaXRzX2Zsb251bS5leHBvbmVudCA9IDA7Ci0gICAgICAvKgotICAgICAgICogVGhlIHZhbHVlIG9mIGRpZ2l0c19mbG9udW0gLiBzaWduIHNob3VsZCBub3QgYmUgaW1wb3J0YW50LgotICAgICAgICogV2UgaGF2ZSBhbHJlYWR5IGRlY2lkZWQgdGhlIG91dHB1dCdzIHNpZ24uCi0gICAgICAgKiBXZSB0cnVzdCB0aGF0IHRoZSBzaWduIHdvbid0IGluZmx1ZW5jZSB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIG51bWJlciEKLSAgICAgICAqIFNvIHdlIGdpdmUgaXQgYSB2YWx1ZSBmb3IgdGhlc2UgcmVhc29uczoKLSAgICAgICAqICgxKSBjb3VydGVzeSB0byBodW1hbnMgcmVhZGluZy9kZWJ1Z2dpbmcKLSAgICAgICAqICAgICB0aGVzZSBudW1iZXJzIHNvIHRoZXkgZG9uJ3QgZ2V0IGV4Y2l0ZWQgYWJvdXQgc3RyYW5nZSB2YWx1ZXMKLSAgICAgICAqICgyKSBpbiBmdXR1cmUgdGhlcmUgbWF5IGJlIG1vcmUgbWVhbmluZyBhdHRhY2hlZCB0byBzaWduLAotICAgICAgICogICAgIGFuZCB3aGF0IHdhcwotICAgICAgICogICAgIGhhcm1sZXNzIG5vaXNlIG1heSBiZWNvbWUgZGlzcnVwdGl2ZSwgaWxsLWNvbmRpdGlvbmVkIChvciB3b3JzZSkKLSAgICAgICAqICAgICBpbnB1dC4KLSAgICAgICAqLwotICAgICAgZGlnaXRzX2Zsb251bS5zaWduID0gJysnOwotCi0gICAgICB7Ci0JLyoKLQkgKiBDb21wdXRlIHRoZSBtYW50c3NhICgmIGV4cG9uZW50KSBvZiB0aGUgcG93ZXIgb2YgMTAuCi0JICogSWYgc3VjZXNzZnVsLCB0aGVuIG11bHRpcGx5IHRoZSBwb3dlciBvZiAxMCBieSB0aGUgZGlnaXRzCi0JICogZ2l2aW5nIHJldHVybl9iaW5hcnlfbWFudGlzc2EgYW5kIHJldHVybl9iaW5hcnlfZXhwb25lbnQuCi0JICovCi0KLQlMSVRUTEVOVU1fVFlQRSAqcG93ZXJfYmluYXJ5X2xvdzsKLQlpbnQgZGVjaW1hbF9leHBvbmVudF9pc19uZWdhdGl2ZTsKLQkvKiBUaGlzIHJlZmVycyB0byB0aGUgIi01NiIgaW4gIjEyLjM0RS01NiIuICovCi0JLyogRkFMU0U6IGRlY2ltYWxfZXhwb25lbnQgaXMgcG9zaXRpdmUgKG9yIDApICovCi0JLyogVFJVRTogIGRlY2ltYWxfZXhwb25lbnQgaXMgbmVnYXRpdmUgKi8KLQlGTE9OVU1fVFlQRSB0ZW1wb3JhcnlfZmxvbnVtOwotCUxJVFRMRU5VTV9UWVBFICp0ZW1wb3JhcnlfYmluYXJ5X2xvdzsKLQl1bnNpZ25lZCBpbnQgc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zOwotCXVuc2lnbmVkIGludCBzaXplX29mX3Bvd2VyX2luX2NoYXJzOwotCi0Jc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zID0gcHJlY2lzaW9uOwotCS8qIFByZWNpc2lvbiBoYXMgYSBidWlsdC1pbiBmdWRnZSBmYWN0b3Igc28gd2UgZ2V0IGEgZmV3IGd1YXJkIGJpdHMuICovCi0KLQlkZWNpbWFsX2V4cG9uZW50X2lzX25lZ2F0aXZlID0gZGVjaW1hbF9leHBvbmVudCA8IDA7Ci0JaWYgKGRlY2ltYWxfZXhwb25lbnRfaXNfbmVnYXRpdmUpCi0JICB7Ci0JICAgIGRlY2ltYWxfZXhwb25lbnQgPSAtZGVjaW1hbF9leHBvbmVudDsKLQkgIH0KLQotCS8qIEZyb20gbm93IG9uOiB0aGUgZGVjaW1hbCBleHBvbmVudCBpcyA+IDAuIEl0cyBzaWduIGlzIHNlcGFyYXRlLiAqLwotCi0Jc2l6ZV9vZl9wb3dlcl9pbl9jaGFycyA9IHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcwotCSAgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSArIDI7Ci0KLQlwb3dlcl9iaW5hcnlfbG93ID0gKExJVFRMRU5VTV9UWVBFICopIGFsbG9jYSAoc2l6ZV9vZl9wb3dlcl9pbl9jaGFycyk7Ci0JdGVtcG9yYXJ5X2JpbmFyeV9sb3cgPSAoTElUVExFTlVNX1RZUEUgKikgYWxsb2NhIChzaXplX29mX3Bvd2VyX2luX2NoYXJzKTsKLQltZW1zZXQgKChjaGFyICopIHBvd2VyX2JpbmFyeV9sb3csICdcMCcsIHNpemVfb2ZfcG93ZXJfaW5fY2hhcnMpOwotCSpwb3dlcl9iaW5hcnlfbG93ID0gMTsKLQlwb3dlcl9vZl8xMF9mbG9udW0uZXhwb25lbnQgPSAwOwotCXBvd2VyX29mXzEwX2Zsb251bS5sb3cgPSBwb3dlcl9iaW5hcnlfbG93OwotCXBvd2VyX29mXzEwX2Zsb251bS5sZWFkZXIgPSBwb3dlcl9iaW5hcnlfbG93OwotCXBvd2VyX29mXzEwX2Zsb251bS5oaWdoID0gcG93ZXJfYmluYXJ5X2xvdyArIHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcyAtIDE7Ci0JcG93ZXJfb2ZfMTBfZmxvbnVtLnNpZ24gPSAnKyc7Ci0JdGVtcG9yYXJ5X2Zsb251bS5sb3cgPSB0ZW1wb3JhcnlfYmluYXJ5X2xvdzsKLQl0ZW1wb3JhcnlfZmxvbnVtLmhpZ2ggPSB0ZW1wb3JhcnlfYmluYXJ5X2xvdyArIHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcyAtIDE7Ci0JLyoKLQkgKiAocG93ZXIpID09IDEuCi0JICogU3BhY2UgZm9yIHRlbXBvcmFyeV9mbG9udW0gYWxsb2NhdGVkLgotCSAqLwotCi0JLyoKLQkgKiAuLi4KLQkgKgotCSAqIFdISUxFCW1vcmUgYml0cwotCSAqIERPCWZpbmQgbmV4dCBiaXQgKHdpdGggcGxhY2UgdmFsdWUpCi0JICoJbXVsdGlwbHkgaW50byBwb3dlciBtYW50aXNzYQotCSAqIE9ECi0JICovCi0JewotCSAgaW50IHBsYWNlX251bWJlcl9saW1pdDsKLQkgIC8qIEFueSAxMF4oMl5uKSB3aG9zZSAibiIgZXhjZWVkcyB0aGlzICovCi0JICAvKiB2YWx1ZSB3aWxsIGZhbGwgb2ZmIHRoZSBlbmQgb2YgKi8KLQkgIC8qIGZsb251bV9YWFhYX3Bvd2Vyc19vZl90ZW5bXS4gKi8KLQkgIGludCBwbGFjZV9udW1iZXI7Ci0JICBjb25zdCBGTE9OVU1fVFlQRSAqbXVsdGlwbGljYW5kOwkvKiAtPiAxMF4oMl5uKSAqLwotCi0JICBwbGFjZV9udW1iZXJfbGltaXQgPSB0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuOwotCi0JICBtdWx0aXBsaWNhbmQgPSAoZGVjaW1hbF9leHBvbmVudF9pc19uZWdhdGl2ZQotCQkJICA/IGZsb251bV9uZWdhdGl2ZV9wb3dlcnNfb2ZfdGVuCi0JCQkgIDogZmxvbnVtX3Bvc2l0aXZlX3Bvd2Vyc19vZl90ZW4pOwotCi0JICBmb3IgKHBsYWNlX251bWJlciA9IDE7LyogUGxhY2UgdmFsdWUgb2YgdGhpcyBiaXQgb2YgZXhwb25lbnQuICovCi0JICAgICAgIGRlY2ltYWxfZXhwb25lbnQ7LyogUXVpdCB3aGVuIG5vIG1vcmUgMSBiaXRzIGluIGV4cG9uZW50LiAqLwotCSAgICAgICBkZWNpbWFsX2V4cG9uZW50ID4+PSAxLCBwbGFjZV9udW1iZXIrKykKLQkgICAgewotCSAgICAgIGlmIChkZWNpbWFsX2V4cG9uZW50ICYgMSkKLQkJewotCQkgIGlmIChwbGFjZV9udW1iZXIgPiBwbGFjZV9udW1iZXJfbGltaXQpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBkZWNpbWFsIGV4cG9uZW50IGhhcyBhIG1hZ25pdHVkZSBzbyBncmVhdAotCQkJIHRoYXQgb3VyIHRhYmxlcyBjYW4ndCBoZWxwIHVzIGZyYWdtZW50IGl0LgotCQkJIEFsdGhvdWdoIHRoaXMgcm91dGluZSBpcyBpbiBlcnJvciBiZWNhdXNlIGl0Ci0JCQkgY2FuJ3QgaW1hZ2luZSBhIG51bWJlciB0aGF0IGJpZywgc2lnbmFsIGFuCi0JCQkgZXJyb3IgYXMgaWYgaXQgaXMgdGhlIHVzZXIncyBmYXVsdCBmb3IKLQkJCSBwcmVzZW50aW5nIHN1Y2ggYSBiaWcgbnVtYmVyLiAgKi8KLQkJICAgICAgcmV0dXJuX3ZhbHVlID0gRVJST1JfRVhQT05FTlRfT1ZFUkZMT1c7Ci0JCSAgICAgIC8qIHF1aXQgb3V0IG9mIGxvb3AgZ3JhY2VmdWxseSAqLwotCQkgICAgICBkZWNpbWFsX2V4cG9uZW50ID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0jaWZkZWYgVFJBQ0UKLQkJICAgICAgcHJpbnRmICgiYmVmb3JlIG11bHRpcGx5LCBwbGFjZV9udW1iZXIgPSAlZC4sIHBvd2VyX29mXzEwX2Zsb251bTpcbiIsCi0JCQkgICAgICBwbGFjZV9udW1iZXIpOwotCi0JCSAgICAgIGZsb251bV9wcmludCAoJnBvd2VyX29mXzEwX2Zsb251bSk7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotI2lmZGVmIFRSQUNFCi0JCSAgICAgIHByaW50ZiAoIm11bHRpcGxpZXI6XG4iKTsKLQkJICAgICAgZmxvbnVtX3ByaW50IChtdWx0aXBsaWNhbmQgKyBwbGFjZV9udW1iZXIpOwotCQkgICAgICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0jZW5kaWYKLQkJICAgICAgZmxvbnVtX211bHRpcCAobXVsdGlwbGljYW5kICsgcGxhY2VfbnVtYmVyLAotCQkJCSAgICAgJnBvd2VyX29mXzEwX2Zsb251bSwgJnRlbXBvcmFyeV9mbG9udW0pOwotI2lmZGVmIFRSQUNFCi0JCSAgICAgIHByaW50ZiAoImFmdGVyIG11bHRpcGx5OlxuIik7Ci0JCSAgICAgIGZsb251bV9wcmludCAoJnRlbXBvcmFyeV9mbG9udW0pOwotCQkgICAgICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0jZW5kaWYKLQkJICAgICAgZmxvbnVtX2NvcHkgKCZ0ZW1wb3JhcnlfZmxvbnVtLCAmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLSNpZmRlZiBUUkFDRQotCQkgICAgICBwcmludGYgKCJhZnRlciBjb3B5OlxuIik7Ci0JCSAgICAgIGZsb251bV9wcmludCAoJnBvd2VyX29mXzEwX2Zsb251bSk7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCQkgICAgfSAvKiBJZiB0aGlzIGJpdCBvZiBkZWNpbWFsX2V4cG9uZW50IHdhcyBjb21wdXRhYmxlLiovCi0JCX0gLyogSWYgdGhpcyBiaXQgb2YgZGVjaW1hbF9leHBvbmVudCB3YXMgc2V0LiAqLwotCSAgICB9IC8qIEZvciBlYWNoIGJpdCBvZiBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgZXhwb25lbnQgKi8KLSNpZmRlZiBUUkFDRQotCSAgcHJpbnRmICgiYWZ0ZXIgY29tcHV0aW5nIHBvd2VyX29mXzEwX2Zsb251bTpcbiIpOwotCSAgZmxvbnVtX3ByaW50ICgmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLQkgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCX0KLQotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICogcG93ZXJfb2ZfMTBfZmxvbnVtIGlzIHBvd2VyIG9mIHRlbiBpbiBiaW5hcnkgKG1hbnRpc3NhKSAsIChleHBvbmVudCkuCi0gICAgICAgKiBJdCBtYXkgYmUgdGhlIG51bWJlciAxLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IE5FRUQgdG8gbXVsdGlwbHkuCi0gICAgICAgKgotICAgICAgICogTXVsdGlwbHkgKGRlY2ltYWwgZGlnaXRzKSBieSBwb3dlcl9vZl8xMF9mbG9udW0uCi0gICAgICAgKi8KLQotICAgICAgZmxvbnVtX211bHRpcCAoJnBvd2VyX29mXzEwX2Zsb251bSwgJmRpZ2l0c19mbG9udW0sIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpOwotICAgICAgLyogQXNzZXJ0IHNpZ24gb2YgdGhlIG51bWJlciB3ZSBtYWRlIGlzICcrJy4gKi8KLSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPSBkaWdpdHNfc2lnbl9jaGFyOwotCi0gICAgfQotICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotfQotCi0jaWZkZWYgVFJBQ0UKLXN0YXRpYyB2b2lkCi1mbG9udW1fcHJpbnQgKGYpCi0gICAgIGNvbnN0IEZMT05VTV9UWVBFICpmOwotewotICBMSVRUTEVOVU1fVFlQRSAqbHA7Ci0gIGNoYXIgbGl0dGxlbnVtX2Zvcm1hdFsxMF07Ci0gIHNwcmludGYgKGxpdHRsZW51bV9mb3JtYXQsICIgJSUwJWR4Iiwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiAyKTsKLSNkZWZpbmUgcHJpbnRfbGl0dGxlbnVtKExQKQkocHJpbnRmIChsaXR0bGVudW1fZm9ybWF0LCBMUCkpCi0gIHByaW50ZiAoImZsb251bSBAJXAgJWMgZSVsZCIsIGYsIGYtPnNpZ24sIGYtPmV4cG9uZW50KTsKLSAgaWYgKGYtPmxvdyA8IGYtPmhpZ2gpCi0gICAgZm9yIChscCA9IGYtPmhpZ2g7IGxwID49IGYtPmxvdzsgbHAtLSkKLSAgICAgIHByaW50X2xpdHRsZW51bSAoKmxwKTsKLSAgZWxzZQotICAgIGZvciAobHAgPSBmLT5sb3c7IGxwIDw9IGYtPmhpZ2g7IGxwKyspCi0gICAgICBwcmludF9saXR0bGVudW0gKCpscCk7Ci0gIHByaW50ZiAoIlxuIik7Ci0gIGZmbHVzaCAoc3Rkb3V0KTsKLX0KLSNlbmRpZgotCi0vKiBlbmQgb2YgYXRvZl9nZW5lcmljLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9iaWdudW0tY29weS5jIGIvZ2FzL2JpZ251bS1jb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmZjYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL2JpZ251bS1jb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBiaWdudW1fY29weS5jIC0gY29weSBhIGJpZ251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qCi0gKgkJCWJpZ251bV9jb3B5ICgpCi0gKgotICogQ29weSBhIGJpZ251bSBmcm9tIGluIHRvIG91dC4KLSAqIElmIHRoZSBvdXRwdXQgaXMgc2hvcnRlciB0aGFuIHRoZSBpbnB1dCwgY29weSBsb3dlci1vcmRlciBsaXR0bGVudW1zLgotICogUmV0dXJuIDAgb3IgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBsaXR0bGVudW1zIGRyb3BwZWQuCi0gKiBBc3N1bWVzIGxpdHRsZW51bSBhcnJheXMgYXJlIGRlbnNlbHkgcGFja2VkOiBubyB1bnVzZWQgY2hhcnMgYmV0d2VlbgotICogdGhlIGxpdHRsZW51bXMuIFVzZXMgbWVtY3B5KCkgdG8gbW92ZSBsaXR0bGVudW1zLCBhbmQgd2FudHMgdG8KLSAqIGtub3cgbGVuZ3RoIChpbiBjaGFycykgb2YgdGhlIGlucHV0IGJpZ251bS4KLSAqLwotCi0vKiB2b2lkICovCi1pbnQKLWJpZ251bV9jb3B5IChpbiwgaW5fbGVuZ3RoLCBvdXQsIG91dF9sZW5ndGgpCi0gICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICppbjsKLSAgICAgcmVnaXN0ZXIgaW50IGluX2xlbmd0aDsJLyogaW4gc2l6ZW9mKGxpdHRsZW51bSlzICovCi0gICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpvdXQ7Ci0gICAgIHJlZ2lzdGVyIGludCBvdXRfbGVuZ3RoOwkvKiBpbiBzaXplb2YobGl0dGxlbnVtKXMgKi8KLXsKLSAgaW50IHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZDsKLQotICBpZiAob3V0X2xlbmd0aCA8IGluX2xlbmd0aCkKLSAgICB7Ci0gICAgICBMSVRUTEVOVU1fVFlQRSAqcDsJLyogLT4gbW9zdCBzaWduaWZpY2FudCAobm9uLXplcm8pIGlucHV0Ci0JCQkJICAgICAgbGl0dGxlbnVtLiAqLwotCi0gICAgICBtZW1jcHkgKCh2b2lkICopIG91dCwgKHZvaWQgKikgaW4sCi0JICAgICAgKHVuc2lnbmVkIGludCkgb3V0X2xlbmd0aCA8PCBMSVRUTEVOVU1fU0hJRlQpOwotICAgICAgZm9yIChwID0gaW4gKyBpbl9sZW5ndGggLSAxOyBwID49IGluOyAtLXApCi0JewotCSAgaWYgKCpwKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPSBwIC0gaW4gLSBpbl9sZW5ndGggKyAxOwotCi0gICAgICBpZiAoc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkIDwgMCkKLQl7Ci0JICBzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZW1jcHkgKChjaGFyICopIG91dCwgKGNoYXIgKikgaW4sCi0JICAgICAgKHVuc2lnbmVkIGludCkgaW5fbGVuZ3RoIDw8IExJVFRMRU5VTV9TSElGVCk7Ci0KLSAgICAgIGlmIChvdXRfbGVuZ3RoID4gaW5fbGVuZ3RoKQotCXsKLQkgIG1lbXNldCAoKGNoYXIgKikgKG91dCArIGluX2xlbmd0aCksCi0JCSAgJ1wwJywKLQkJICAodW5zaWduZWQgaW50KSAob3V0X2xlbmd0aCAtIGluX2xlbmd0aCkgPDwgTElUVExFTlVNX1NISUZUKTsKLQl9Ci0KLSAgICAgIHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiAoc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkKTsKLX0JCQkJLyogYmlnbnVtX2NvcHkoKSAqLwotCi0vKiBlbmQgb2YgYmlnbnVtLWNvcHkuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2JpZ251bS5oIGIvZ2FzL2JpZ251bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2IyZjE2Li4wMDAwMDAwCi0tLSBhL2dhcy9iaWdudW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIGJpZ251bS5oLWFyYml0cmFyeSBwcmVjaXNpb24gaW50ZWdlcnMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCUFyYml0cmFyeS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLgkJCQkqCi0gKglGb3Igc3BlZWQsIHdlIHdvcmsgaW4gZ3JvdXBzIG9mIGJpdHMsIGV2ZW4gdGhvdWdoIHRoaXMJCSoKLSAqCWNvbXBsaWNhdGVzIGFsZ29yaXRobXMuCQkJCQkJKgotICoJRWFjaCBncm91cCBvZiBiaXRzIGlzIGNhbGxlZCBhICdsaXR0bGVudW0nLgkJCSoKLSAqCUEgYnVuY2ggb2YgbGl0dGxlbnVtcyByZXByZXNlbnRpbmcgYSAocG9zc2libHkgbGFyZ2UpCQkqCi0gKglpbnRlZ2VyIGlzIGNhbGxlZCBhICdiaWdudW0nLgkJCQkJKgotICoJQmlnbnVtcyBhcmUgPj0gMC4JCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUJTElUVExFTlVNX05VTUJFUl9PRl9CSVRTCSgxNikKLSNkZWZpbmUJTElUVExFTlVNX1JBRElYCQkJKDEgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotI2RlZmluZQlMSVRUTEVOVU1fTUFTSwkJCSgweEZGRkYpCi0jZGVmaW5lIExJVFRMRU5VTV9TSElGVAkJCSgxKQotI2RlZmluZSBDSEFSU19QRVJfTElUVExFTlVNCQkoMSA8PCBMSVRUTEVOVU1fU0hJRlQpCi0jaWZuZGVmIEJJVFNfUEVSX0NIQVIKLSNkZWZpbmUgQklUU19QRVJfQ0hBUgkJCSg4KQotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgTElUVExFTlVNX1RZUEU7Ci0KLS8qIEpGIHRydW5jYXRlZCB0aGlzIHRvIGdldCBhcm91bmQgYSBwcm9ibGVtIHdpdGggR0NDICovCi0jZGVmaW5lCUxPR19UT19CQVNFXzJfT0ZfMTAgKDMuMzIxOTI4MDk0ODg3MzYyMzQ3ODcwMzE5NDI5NDg5MzkwMTc1ODY1MSkKLS8qIFdBUk5JTkc6IEkgaGF2ZW4ndCBjaGVja2VkIHRoYXQgdGhlIHRyYWlsaW5nIGRpZ2l0cyBhcmUgY29ycmVjdCEgKi8KLQotLyogbGVuZ3RocyBhcmUgaW4gc2l6ZW9mKGxpdHRsZW51bSlzICovCi0KLWludCBiaWdudW1fY29weSBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqIGluLCBpbnQgaW5fbGVuZ3RoLAotCQkJIExJVFRMRU5VTV9UWVBFICogb3V0LCBpbnQgb3V0X2xlbmd0aCkpOwotCi0vKiBlbmQgb2YgYmlnbnVtLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9iaXRfZml4LmggYi9nYXMvYml0X2ZpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTcyOWE3Li4wMDAwMDAwCi0tLSBhL2dhcy9iaXRfZml4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiB3cml0ZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgYml0X2ZpeCB3YXMgaW1wbGVtZW50ZWQgdG8gc3VwcG9ydCBtYWNoaW5lcyB0aGF0IG5lZWQgdmFyaWFibGVzCi0gICB0byBiZSBpbnNlcnRlZCBpbiBiaXRmaWVsZHMgb3RoZXIgdGhhbiAxLCAyIGFuZCA0IGJ5dGVzLgotICAgRnVydGhlcm1vcmUgaXQgZ2l2ZXMgdXMgYSBwb3NzaWJpbGxpdHkgdG8gbWFzayBpbiBiaXRzIGluIHRoZSBzeW1ib2wKLSAgIHdoZW4gaXQncyBmaXhlZCBpbiB0aGUgb2JqZWN0Y29kZSBhbmQgY2hlY2sgdGhlIHN5bWJvbHMgbGltaXRzLgotCi0gICBUaGUgb3ItbWFzayBpcyB1c2VkIHRvIHNldCB0aGUgaHVmZm1hbiBiaXRzIGluIGRpc3BsYWNlbWVudHMgZm9yIHRoZQotICAgbnMzMmsgcG9ydC4KLSAgIFRoZSBhY2JpLCBhZGRxaSwgbW92cWksIGNtcHFpIGluc3RydWN0aW9uIHJlcXVpcmVzIGFuIGFzc2VtYmxlciB0aGF0Ci0gICBjYW4gaGFuZGxlIGJpdGZpZWxkcy4gSWUgaGFuZGxlIGFuIGV4cHJlc3Npb24sIGV2YWx1YXRlIGl0IGFuZCBpbnNlcnQKLSAgIHRoZSByZXN1bHQgaW4gYW4gc29tZSBiaXRmaWVsZC4gKCBleDogNSBiaXRzIGluIGEgc2hvcnQgZmllbGQgb2YgYSBvcGNvZGUpCi0gICAqLwotCi0jaWZuZGVmIF9fYml0X2ZpeF9oX18KLSNkZWZpbmUgX19iaXRfZml4X2hfXwotCi1zdHJ1Y3QgYml0X2ZpeAotICB7Ci0gICAgaW50IGZ4X2JpdF9zaXplOwkJLyogTGVuZ3RoIG9mIGJpdGZpZWxkICovCi0gICAgaW50IGZ4X2JpdF9vZmZzZXQ7CQkvKiBCaXQgb2Zmc2V0IHRvIGJpdGZpZWxkICovCi0gICAgbG9uZyBmeF9iaXRfYmFzZTsJCS8qIFdoZXJlIGRvIHdlIGFwcGx5IHRoZSBiaXRmaXguCi0JCQkJICAgICAgSWYgdGhpcyBpcyB6ZXJvLCBkZWZhdWx0IGlzIGFzc3VtZWQuICovCi0gICAgbG9uZyBmeF9iaXRfYmFzZV9hZGo7CS8qIEFkanVzdG1lbnQgb2YgYmFzZSAqLwotICAgIGxvbmcgZnhfYml0X21heDsJCS8qIFNpZ25leHRlbmRlZCBtYXggZm9yIGJpdGZpZWxkICovCi0gICAgbG9uZyBmeF9iaXRfbWluOwkJLyogU2lnbmV4dGVuZGVkIG1pbiBmb3IgYml0ZmllbGQgKi8KLSAgICBsb25nIGZ4X2JpdF9hZGQ7CQkvKiBPciBtYXNrLCB1c2VkIGZvciBodWZmbWFuIHByZWZpeCAqLwotICB9OwotdHlwZWRlZiBzdHJ1Y3QgYml0X2ZpeCBiaXRfZml4UzsKLQotI2VuZGlmIC8qIF9fYml0X2ZpeF9oX18gKi8KLQotLyogZW5kIG9mIGJpdF9maXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NnZW4uYyBiL2dhcy9jZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWUxYjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vKiBHQVMgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJjZ2VuLWRlc2MuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJjZ2VuLmgiCi0KLS8qIE9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLCBtdXN0IGJlIHNldCBieSBtZF9iZWdpbi4gICovCi0KLUNHRU5fQ1BVX0RFU0MgZ2FzX2NnZW5fY3B1X2Rlc2M7Ci0KLS8qIENhbGxiYWNrIHRvIGluc2VydCBhIHJlZ2lzdGVyIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLSAgIEEgdGFyZ2V0IG1heSBjaG9vc2UgdG8gbGV0IEdBUyBwYXJzZSB0aGUgcmVnaXN0ZXJzLgotICAgPz8/IE5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLXZvaWQKLWNnZW5fYXNtX3JlY29yZF9yZWdpc3RlciAobmFtZSwgbnVtYmVyKQotICAgICBjaGFyICogbmFtZTsKLSAgICAgaW50IG51bWJlcjsKLXsKLSAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaGVyZSBpbnN0ZWFkIG9mIHN5bWJvbF9uZXcgc28gd2UgZG9uJ3QgdHJ5IHRvCi0gICAgIG91dHB1dCByZWdpc3RlcnMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuICAqLwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChuYW1lLCByZWdfc2VjdGlvbiwKLQkJCQkgICAgICBudW1iZXIsICYgemVyb19hZGRyZXNzX2ZyYWcpKTsKLX0KLQotLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcwotICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCi0gICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuCi0KLSAgIFRoaXMgaXMgdXNlZCBieSBjcHUncyB3aXRoIHNpbXBsZSBvcGVyYW5kcy4gIEl0IGtlZXBzIGtub3dsZWRnZSBvZiB3aGF0Ci0gICBhbiBgZXhwcmVzc2lvblMnIGlzIGFuZCB3aGF0IGEgYGZpeHVwJyBpcyBvdXQgb2YgQ0dFTiB3aGljaCBmb3IgdGhlIHRpbWUKLSAgIGJlaW5nIGlzIHByZWZlcmFibGUuCi0KLSAgIE9QSU5ERVggaXMgdGhlIGluZGV4IGluIHRoZSBvcGVyYW5kIHRhYmxlLgotICAgT1BJTkZPIGlzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGNob29zZXMgdG8gaGVscCBpbiByZWxvYyBkZXRlcm1pbmF0aW9uLiAgKi8KLQotc3RydWN0IGZpeHVwCi17Ci0gIGludCBvcGluZGV4OwotICBpbnQgb3BpbmZvOwotICBleHByZXNzaW9uUyBleHA7Ci19OwotCi1zdGF0aWMgc3RydWN0IGZpeHVwIGZpeHVwcyBbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci1zdGF0aWMgaW50IG51bV9maXh1cHM7Ci0KLS8qIFByZXBhcmUgdG8gcGFyc2UgYW4gaW5zdHJ1Y3Rpb24uCi0gICA/Pz8gTWF5IHdpc2ggdG8gbWFrZSB0aGlzIHN0YXRpYyBhbmQgZGVsZXRlIGNhbGxzIGluIG1kX2Fzc2VtYmxlLiAgKi8KLQotdm9pZAotZ2FzX2NnZW5faW5pdF9wYXJzZSAoKQotewotICBudW1fZml4dXBzID0gMDsKLX0KLQotLyogUXVldWUgYSBmaXh1cC4gICovCi0KLXN0YXRpYyB2b2lkCi1xdWV1ZV9maXh1cCAob3BpbmRleCwgb3BpbmZvLCBleHBQKQotICAgICBpbnQgICAgICAgICAgIG9waW5kZXg7Ci0gICAgIGV4cHJlc3Npb25TICogZXhwUDsKLXsKLSAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotICBpZiAobnVtX2ZpeHVwcyA+PSBHQVNfQ0dFTl9NQVhfRklYVVBTKQotICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0gIGZpeHVwc1tudW1fZml4dXBzXS5leHAgICAgID0gKiBleHBQOwotICBmaXh1cHNbbnVtX2ZpeHVwc10ub3BpbmRleCA9IG9waW5kZXg7Ci0gIGZpeHVwc1tudW1fZml4dXBzXS5vcGluZm8gID0gb3BpbmZvOwotICArKyBudW1fZml4dXBzOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhbGxvdyBhIGJhY2t1cCBvZiB0aGUgZml4dXAgY2hhaW4gdG8gYmUgbWFkZSwKLSAgIGFuZCB0byBoYXZlIHRoaXMgYmFja3VwIGJlIHN3YXBwZWQgd2l0aCB0aGUgY3VycmVudCBjaGFpbi4gIFRoaXMgYWxsb3dzCi0gICBjZXJ0YWluIHBvcnRzLCBlZyB0aGUgbTMyciwgdG8gc3dhcCB0d28gaW5zdHJ1Y3Rpb25zIGFuZCBzd2FwIHRoZWlyIGZpeHVwcwotICAgYXQgdGhlIHNhbWUgdGltZS4gICovCi0vKiA/Pz8gSSB0aGluayB3aXRoIGNnZW5fYXNtX2ZpbmlzaF9pbnNuIChvciBzb21ldGhpbmcgZWxzZSkgdGhlcmUgaXMgbm8KLSAgIG1vcmUgbmVlZCBmb3IgdGhpcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZml4dXAgc2F2ZWRfZml4dXBzIFtHQVNfQ0dFTl9NQVhfRklYVVBTXTsKLXN0YXRpYyBpbnQgc2F2ZWRfbnVtX2ZpeHVwczsKLQotdm9pZAotZ2FzX2NnZW5fc2F2ZV9maXh1cHMgKCkKLXsKLSAgc2F2ZWRfbnVtX2ZpeHVwcyA9IG51bV9maXh1cHM7Ci0gIAotICBtZW1jcHkgKHNhdmVkX2ZpeHVwcywgZml4dXBzLCBzaXplb2YgKGZpeHVwc1swXSkgKiBudW1fZml4dXBzKTsKLQotICBudW1fZml4dXBzID0gMDsKLX0KLQotdm9pZAotZ2FzX2NnZW5fcmVzdG9yZV9maXh1cHMgKCkKLXsKLSAgbnVtX2ZpeHVwcyA9IHNhdmVkX251bV9maXh1cHM7Ci0gIAotICBtZW1jcHkgKGZpeHVwcywgc2F2ZWRfZml4dXBzLCBzaXplb2YgKGZpeHVwc1swXSkgKiBudW1fZml4dXBzKTsKLQotICBzYXZlZF9udW1fZml4dXBzID0gMDsKLX0KLQotdm9pZAotZ2FzX2NnZW5fc3dhcF9maXh1cHMgKCkKLXsKLSAgaW50IHRtcDsKLSAgc3RydWN0IGZpeHVwIHRtcF9maXh1cDsKLQotICBpZiAobnVtX2ZpeHVwcyA9PSAwKQotICAgIHsKLSAgICAgIGdhc19jZ2VuX3Jlc3RvcmVfZml4dXBzICgpOwotICAgIH0KLSAgZWxzZSBpZiAoc2F2ZWRfbnVtX2ZpeHVwcyA9PSAwKQotICAgIHsKLSAgICAgIGdhc19jZ2VuX3NhdmVfZml4dXBzICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9IHNhdmVkX251bV9maXh1cHM7Ci0gICAgICBzYXZlZF9udW1fZml4dXBzID0gbnVtX2ZpeHVwczsKLSAgICAgIG51bV9maXh1cHMgPSB0bXA7Ci0gICAgICAKLSAgICAgIGZvciAodG1wID0gR0FTX0NHRU5fTUFYX0ZJWFVQUzsgdG1wLS07KQotCXsKLQkgIHRtcF9maXh1cCAgICAgICAgICA9IHNhdmVkX2ZpeHVwcyBbdG1wXTsKLQkgIHNhdmVkX2ZpeHVwcyBbdG1wXSA9IGZpeHVwcyBbdG1wXTsKLQkgIGZpeHVwcyBbdG1wXSAgICAgICA9IHRtcF9maXh1cDsKLQl9Ci0gICAgfQotfQotCi0vKiBEZWZhdWx0IHJvdXRpbmUgdG8gcmVjb3JkIGEgZml4dXAuCi0gICBUaGlzIGlzIGEgY292ZXIgZnVuY3Rpb24gdG8gZml4X25ldy4KLSAgIEl0IGV4aXN0cyBiZWNhdXNlIHdlIHJlY29yZCBJTlNOIHdpdGggdGhlIGZpeHVwLgotCi0gICBGUkFHIGFuZCBXSEVSRSBhcmUgdGhlaXIgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdG8gZml4X25ld19leHAuCi0gICBMRU5HVEggaXMgaW4gYml0cy4KLSAgIE9QSU5GTyBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBjaG9vc2VzIHRvIGhlbHAgaW4gcmVsb2MgZGV0ZXJtaW5hdGlvbi4KLQotICAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGZvcgotICAgb3BlcmFuZHMgcmVzaWRpbmcgaW4gdGhlIGluc24sIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotICAgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkgaGFuZGxlIGZpeHVwcyBmb3IgYW55Ci0gICBvcGVyYW5kIHR5cGUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4gbWRfYXBwbHlfZml4LiAgKi8KLQotZml4UyAqCi1nYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWcsIHdoZXJlLCBpbnNuLCBsZW5ndGgsIG9wZXJhbmQsIG9waW5mbywgc3ltYm9sLCBvZmZzZXQpCi0gICAgIGZyYWdTICogICAgICAgICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIHdoZXJlOwotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIG9waW5mbzsKLSAgICAgc3ltYm9sUyAqICAgICAgICAgICAgc3ltYm9sOwotICAgICBvZmZzZXRUICAgICAgICAgICAgICBvZmZzZXQ7Ci17Ci0gIGZpeFMgKiBmaXhQOwotCi0gIC8qIEl0IG1heSBzZWVtIHN0cmFuZ2UgdG8gdXNlIG9wZXJhbmQtPmF0dHJzIGFuZCBub3QgaW5zbi0+YXR0cnMgaGVyZSwKLSAgICAgYnV0IGl0IGlzIHRoZSBvcGVyYW5kIHRoYXQgaGFzIGEgcGMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0KLSAgZml4UCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBsZW5ndGggLyA4LCBzeW1ib2wsIG9mZnNldCwKLQkJICBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSAob3BlcmFuZCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLAotCQkgIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpCi0JCSAgICAoKGludCkgQkZEX1JFTE9DX1VOVVNFRAotCQkgICAgICsgKGludCkgb3BlcmFuZC0+dHlwZSkpOwotICBmaXhQLT5meF9jZ2VuLmluc24gPSBpbnNuOwotICBmaXhQLT5meF9jZ2VuLm9waW5mbyA9IG9waW5mbzsKLQotICByZXR1cm4gZml4UDsKLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGdpdmVuIGFuIGV4cHJlc3Npb24uCi0gICBUaGlzIGlzIGEgY292ZXIgZnVuY3Rpb24gdG8gZml4X25ld19leHAuCi0gICBJdCBleGlzdHMgYmVjYXVzZSB3ZSByZWNvcmQgSU5TTiB3aXRoIHRoZSBmaXh1cC4KLQotICAgRlJBRyBhbmQgV0hFUkUgYXJlIHRoZWlyIHJlc3BlY3RpdmUgYXJndW1lbnRzIHRvIGZpeF9uZXdfZXhwLgotICAgTEVOR1RIIGlzIGluIGJpdHMuCi0gICBPUElORk8gaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIgY2hvb3NlcyB0byBoZWxwIGluIHJlbG9jIGRldGVybWluYXRpb24uCi0KLSAgIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmb3IKLSAgIG9wZXJhbmRzIHJlc2lkaW5nIGluIHRoZSBpbnNuLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKLSAgIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5IGhhbmRsZSBmaXh1cHMgZm9yIGFueQotICAgb3BlcmFuZCB0eXBlLiAgV2UgcGljayBhIEJGRCByZWxvYyB0eXBlIGluIG1kX2FwcGx5X2ZpeC4gICovCi0KLWZpeFMgKgotZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCAoZnJhZywgd2hlcmUsIGluc24sIGxlbmd0aCwgb3BlcmFuZCwgb3BpbmZvLCBleHApCi0gICAgIGZyYWdTICogICAgICAgICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIHdoZXJlOwotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIG9waW5mbzsKLSAgICAgZXhwcmVzc2lvblMgKiAgICAgICAgZXhwOwotewotICBmaXhTICogZml4UDsKLQotICAvKiBJdCBtYXkgc2VlbSBzdHJhbmdlIHRvIHVzZSBvcGVyYW5kLT5hdHRycyBhbmQgbm90IGluc24tPmF0dHJzIGhlcmUsCi0gICAgIGJ1dCBpdCBpcyB0aGUgb3BlcmFuZCB0aGF0IGhhcyBhIHBjIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotCi0gIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIGxlbmd0aCAvIDgsIGV4cCwKLQkJICAgICAgQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKG9wZXJhbmQsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwKLQkJICAgICAgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkKLQkJICAgICAgICAoKGludCkgQkZEX1JFTE9DX1VOVVNFRAotCQkJICsgKGludCkgb3BlcmFuZC0+dHlwZSkpOwotICBmaXhQLT5meF9jZ2VuLmluc24gPSBpbnNuOwotICBmaXhQLT5meF9jZ2VuLm9waW5mbyA9IG9waW5mbzsKLQotICByZXR1cm4gZml4UDsKLX0KLQotLyogVXNlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBuZXh0IHR3byBwcm9jZWR1cmVzLiAgKi8KLXN0YXRpYyBqbXBfYnVmIGV4cHJfam1wX2J1ZjsKLQotLyogQ2FsbGJhY2sgZm9yIGNnZW4gaW50ZXJmYWNlLiAgUGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgKlNUUlAuCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBmb3Igc3VjY2VzcyAoaW4gd2hpY2ggY2FzZQotICAgKlNUUlAgaXMgYWR2YW5jZWQgcGFzdCB0aGUgcGFyc2VkIHRleHQpLgotICAgV0FOVCBpcyBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgdGhlIGNhbGxlciBpcyBsb29raW5nIGZvci4KLSAgIElmIFdBTlQgPT0gQ0dFTl9BU01fUEFSU0VfSU5JVCB0aGUgY2FsbGVyIGlzIGJlZ2lubmluZyB0byB0cnkgdG8gbWF0Y2gKLSAgIGEgdGFibGUgZW50cnkgd2l0aCB0aGUgaW5zbiwgcmVzZXQgdGhlIHF1ZXVlZCBmaXh1cHMgY291bnRlci4KLSAgIEFuIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCBpcyBzdG9yZWQgaW4gUkVTVUxUUC4KLSAgIE9QSU5ERVggaXMgdGhlIG9wZXJhbmQncyB0YWJsZSBlbnRyeSBpbmRleC4KLSAgIE9QSU5GTyBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBjaG9vc2VzIHRvIGhlbHAgaW4gcmVsb2MgZGV0ZXJtaW5hdGlvbi4KLSAgIFRoZSByZXN1bHRpbmcgdmFsdWUgaXMgc3RvcmVkIGluIFZBTFVFUC4gICovCi0KLWNvbnN0IGNoYXIgKgotZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIHdhbnQsIHN0clAsIG9waW5kZXgsIG9waW5mbywgcmVzdWx0UCwgdmFsdWVQKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlIHdhbnQ7Ci0gICAgIGNvbnN0IGNoYXIgKiogc3RyUDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGludCBvcGluZm87Ci0gICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqIHJlc3VsdFA7Ci0gICAgIGJmZF92bWEgKiB2YWx1ZVA7Ci17Ci0jaWZkZWYgX19TVERDX18KLSAgLyogVGhlc2UgYXJlIHZvbGF0aWxlIHRvIHN1cnZpdmUgdGhlIHNldGptcC4gICovCi0gIGNoYXIgKiB2b2xhdGlsZSBob2xkOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiB2b2xhdGlsZSByZXN1bHRQXzE7Ci0jZWxzZQotICBzdGF0aWMgY2hhciAqIGhvbGQ7Ci0gIHN0YXRpYyBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiByZXN1bHRQXzE7Ci0jZW5kaWYKLSAgY29uc3QgY2hhciAqIGVycm1zZyA9IE5VTEw7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBpZiAod2FudCA9PSBDR0VOX1BBUlNFX09QRVJBTkRfSU5JVCkKLSAgICB7Ci0gICAgICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJlc3VsdFBfMSA9IHJlc3VsdFA7Ci0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IChjaGFyICopICogc3RyUDsKLQotICAvKiBXZSByZWx5IG9uIG1kX29wZXJhbmQgdG8gbG9uZ2ptcCBiYWNrIHRvIHVzLgotICAgICBUaGlzIGlzIGRvbmUgdmlhIGdhc19jZ2VuX21kX29wZXJhbmQuICAqLwotICBpZiAoc2V0am1wIChleHByX2ptcF9idWYpICE9IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKGNoYXIgKikgaG9sZDsKLSAgICAgICogcmVzdWx0UF8xID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUjsKLSAgICAgIHJldHVybiAiaWxsZWdhbCBvcGVyYW5kIjsKLSAgICB9Ci0KLSAgZXhwcmVzc2lvbiAoJiBleHApOwotCi0gICogc3RyUCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotICAvKiBGSVhNRTogTmVlZCB0byBjaGVjayBgd2FudCcuICAqLwotCi0gIHN3aXRjaCAoZXhwLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsIDoKLSAgICAgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOwotICAgICAgKiByZXN1bHRQID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19hYnNlbnQgOgotICAgICAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7Ci0gICAgICAqIHJlc3VsdFAgPSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX0VSUk9SOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2NvbnN0YW50IDoKLSAgICAgICogdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3JlZ2lzdGVyIDoKLSAgICAgICogdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUkVHSVNURVI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIHF1ZXVlX2ZpeHVwIChvcGluZGV4LCBvcGluZm8sICYgZXhwKTsKLSAgICAgICogdmFsdWVQID0gMDsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUVVFVUVEOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIG1kX29wZXJhbmQgaGFuZGxlciB0byBjYXRjaCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbnMgYW5kIGhhbHQgdGhlCi0gICBwYXJzaW5nIHByb2Nlc3Mgc28gdGhlIG5leHQgZW50cnkgY2FuIGJlIHRyaWVkLgotCi0gICA/Pz8gVGhpcyBjb3VsZCBiZSBkb25lIGRpZmZlcmVudGx5IGJ5IGFkZGluZyBjb2RlIHRvIGBleHByZXNzaW9uJy4gICovCi0KLXZvaWQKLWdhc19jZ2VuX21kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBsb25nam1wIChleHByX2ptcF9idWYsIDEpOwotfQotCi0vKiBGaW5pc2ggYXNzZW1ibGluZyBpbnN0cnVjdGlvbiBJTlNOLgotICAgQlVGIGNvbnRhaW5zIHdoYXQgd2UndmUgYnVpbHQgdXAgc28gZmFyLgotICAgTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0gICBSRUxBWF9QIGlzIG5vbi16ZXJvIGlmIHJlbGF4YWJsZSBpbnNucyBzaG91bGQgYmUgZW1pdHRlZCBhcyBzdWNoLgotICAgT3RoZXJ3aXNlIHRoZXkncmUgZW1pdHRlZCBpbiBub24tcmVsYXhhYmxlIGZvcm1zLgotICAgVGhlICJyZXN1bHQiIGlzIHN0b3JlZCBpbiBSRVNVTFQgaWYgbm9uLU5VTEwuICAqLwotCi12b2lkCi1nYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbiwgYnVmLCBsZW5ndGgsIHJlbGF4X3AsIHJlc3VsdCkKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWY7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gICAgIGludCByZWxheF9wOwotICAgICBmaW5pc2hlZF9pbnNuUyAqIHJlc3VsdDsKLXsKLSAgaW50IGk7Ci0gIGludCByZWxheF9vcGVyYW5kOwotICBjaGFyICogZjsKLSAgdW5zaWduZWQgaW50IGJ5dGVfbGVuID0gbGVuZ3RoIC8gODsKLQotICAvKiA/Pz8gVGFyZ2V0IGZvbyBpc3N1ZXMgdmFyaW91cyB3YXJuaW5ncyBoZXJlLCBzbyBvbmUgbWlnaHQgd2FudCB0byBwcm92aWRlCi0gICAgIGEgaG9vayBoZXJlLiAgSG93ZXZlciwgb3VyIGNhbGxlciBpcyBkZWZpbmVkIGluIHRjLWZvby5jIHNvIHRoZXJlCi0gICAgIHNob3VsZG4ndCBiZSBhIG5lZWQgZm9yIGEgaG9vay4gICovCi0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgSXQgaXMgaW1wb3J0YW50IHRvIGZldGNoIGVub3VnaCBzcGFjZSBpbiBvbmUgY2FsbCB0byBgZnJhZ19tb3JlJy4KLSAgICAgV2UgdXNlIChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpIHRvIGNvbXB1dGUgd2hlcmUgd2UgYXJlIGFuZCB3ZQotICAgICBkb24ndCB3YW50IGZyYWdfbm93IHRvIGNoYW5nZSBiZXR3ZWVuIGNhbGxzLgotCi0gICAgIFJlbGF4YWJsZSBpbnN0cnVjdGlvbnM6IFdlIG5lZWQgdG8gZW5zdXJlIHdlIGFsbG9jYXRlIGVub3VnaAotICAgICBzcGFjZSBmb3IgdGhlIGxhcmdlc3QgaW5zbi4gICovCi0KLSAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpKQotICAgIGFib3J0ICgpOyAvKiBUaGVzZSBjdXJyZW50bHkgc2hvdWxkbid0IGdldCBoZXJlLiAgKi8KLQotICAvKiBJcyB0aGVyZSBhIHJlbGF4YWJsZSBpbnNuIHdpdGggdGhlIHJlbGF4YWJsZSBvcGVyYW5kIG5lZWRpbmcgYSBmaXh1cD8gICovCi0KLSAgcmVsYXhfb3BlcmFuZCA9IC0xOwotICBpZiAocmVsYXhfcCAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkpCi0gICAgewotICAgICAgLyogU2NhbiB0aGUgZml4dXBzIGZvciB0aGUgb3BlcmFuZCBhZmZlY3RlZCBieSByZWxheGluZwotCSAoaS5lLiB0aGUgYnJhbmNoIGFkZHJlc3MpLiAgKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9maXh1cHM7ICsrIGkpCi0JewotCSAgaWYgKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFIChjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGZpeHVwc1tpXS5vcGluZGV4KSwKLQkJCQkgICAgICAgQ0dFTl9PUEVSQU5EX1JFTEFYKSkKLQkgICAgewotCSAgICAgIHJlbGF4X29wZXJhbmQgPSBpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocmVsYXhfb3BlcmFuZCAhPSAtMSkKLSAgICB7Ci0gICAgICBpbnQgbWF4X2xlbjsKLSAgICAgIGZyYWdTICogb2xkX2ZyYWc7Ci0KLSNpZmRlZiBUQ19DR0VOX01BWF9SRUxBWAotICAgICAgbWF4X2xlbiA9IFRDX0NHRU5fTUFYX1JFTEFYIChpbnNuLCBieXRlX2xlbik7Ci0jZWxzZQotICAgICAgbWF4X2xlbiA9IENHRU5fTUFYX0lOU05fU0laRTsKLSNlbmRpZgotICAgICAgLyogRW5zdXJlIHZhcmlhYmxlIHBhcnQgYW5kIGZpeGVkIHBhcnQgYXJlIGluIHNhbWUgZnJhZ21lbnQuICAqLwotICAgICAgLyogRklYTUU6IEhhdmluZyB0byBkbyB0aGlzIHNlZW1zIGxpa2UgYSBoYWNrLiAgKi8KLSAgICAgIGZyYWdfZ3JvdyAobWF4X2xlbik7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZml4ZWQgcGFydC4gICovCi0gICAgICBmID0gZnJhZ19tb3JlIChieXRlX2xlbik7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIHJlbGF4YWJsZSBmcmFnbWVudCBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgICBvbGRfZnJhZyA9IGZyYWdfbm93OwotCi0gICAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCW1heF9sZW4gLSBieXRlX2xlbiAvKiBtYXggY2hhcnMgKi8sCi0JCTAgLyogdmFyaWFibGUgcGFydCBhbHJlYWR5IGFsbG9jYXRlZCAqLywKLQkJLyogRklYTUU6IFdoZW4gd2UgbWFjaGluZSBnZW5lcmF0ZSB0aGUgcmVsYXggdGFibGUsCi0JCSAgIG1hY2hpbmUgZ2VuZXJhdGUgYSBtYWNybyB0byBjb21wdXRlIHN1YnR5cGUuICAqLwotCQkxIC8qIHN1YnR5cGUgKi8sCi0JCWZpeHVwc1tyZWxheF9vcGVyYW5kXS5leHAuWF9hZGRfc3ltYm9sLAotCQlmaXh1cHNbcmVsYXhfb3BlcmFuZF0uZXhwLlhfYWRkX251bWJlciwKLQkJZik7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgb3BlcmFuZCBudW1iZXIgd2l0aCB0aGUgZnJhZ21lbnQgc28gbWRfY29udmVydF9mcmFnCi0JIGNhbiB1c2UgZ2FzX2NnZW5fbWRfcmVjb3JkX2ZpeHVwIHRvIHJlY29yZCB0aGUgYXBwcm9wcmlhdGUgcmVsb2MuICAqLwotICAgICAgb2xkX2ZyYWctPmZyX2NnZW4uaW5zbiAgICA9IGluc247Ci0gICAgICBvbGRfZnJhZy0+ZnJfY2dlbi5vcGluZGV4ID0gZml4dXBzW3JlbGF4X29wZXJhbmRdLm9waW5kZXg7Ci0gICAgICBvbGRfZnJhZy0+ZnJfY2dlbi5vcGluZm8gID0gZml4dXBzW3JlbGF4X29wZXJhbmRdLm9waW5mbzsKLSAgICAgIGlmIChyZXN1bHQpCi0JcmVzdWx0LT5mcmFnID0gb2xkX2ZyYWc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZiA9IGZyYWdfbW9yZSAoYnl0ZV9sZW4pOwotICAgICAgaWYgKHJlc3VsdCkKLQlyZXN1bHQtPmZyYWcgPSBmcmFnX25vdzsKLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgcmVjb3JkaW5nIGluc25zIGFzIG51bWJlcnMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9mIGJ5dGVzKSwKLSAgICAgdGFyZ2V0IGJ5dGUgb3JkZXIgaGFuZGxpbmcgaXMgZGVmZXJyZWQgdW50aWwgbm93LiAgKi8KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLSAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGYsIGxlbmd0aCwgKmJ1Zik7Ci0jZWxzZQotICBtZW1jcHkgKGYsIGJ1ZiwgYnl0ZV9sZW4pOwotI2VuZGlmCi0KLSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ZpeHVwczsgKytpKQotICAgIHsKLSAgICAgIGZpeFMgKmZpeFA7Ci0gICAgICBjb25zdCBDR0VOX09QRVJBTkQgKm9wZXJhbmQgPQotCWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChnYXNfY2dlbl9jcHVfZGVzYywgZml4dXBzW2ldLm9waW5kZXgpOwotCi0gICAgICAvKiBEb24ndCBjcmVhdGUgZml4dXBzIGZvciB0aGVzZS4gIFRoYXQncyBkb25lIGR1cmluZyByZWxheGF0aW9uLgotCSBXZSBkb24ndCBuZWVkIHRvIHRlc3QgZm9yIENHRU5fSU5TTl9SRUxBWCBhcyB0aGV5IGNhbid0IGdldCBoZXJlCi0JIChzZWUgYWJvdmUpLiAgKi8KLSAgICAgIGlmIChyZWxheF9wCi0JICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkKLQkgICYmIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFIChvcGVyYW5kLCBDR0VOX09QRVJBTkRfUkVMQVgpKQotCWNvbnRpbnVlOwotCi0jaWZuZGVmIG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAotI2RlZmluZSBtZF9jZ2VuX3JlY29yZF9maXh1cF9leHAgZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAotI2VuZGlmCi0KLQlmaXhQID0gbWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCQkgaW5zbiwgbGVuZ3RoLCBvcGVyYW5kLAotCQkJCQkgZml4dXBzW2ldLm9waW5mbywKLQkJCQkJICYgZml4dXBzW2ldLmV4cCk7Ci0JaWYgKHJlc3VsdCkKLQkgIHJlc3VsdC0+Zml4dXBzW2ldID0gZml4UDsKLSAgICB9Ci0KLSAgaWYgKHJlc3VsdCkKLSAgICB7Ci0gICAgICByZXN1bHQtPm51bV9maXh1cHMgPSBudW1fZml4dXBzOwotICAgICAgcmVzdWx0LT5hZGRyID0gZjsKLSAgICB9Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBjb2RlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIGZpeHVwcyB3ZSBnZW5lcmF0ZWQgYnkgdGhlIGNhbGwgdG8gZml4X25ld19leHAsIGFib3ZlLiAgSW4gdGhlIGNhbGwKLSAgIGFib3ZlIHdlIHVzZWQgYSByZWxvYyBjb2RlIHdoaWNoIHdhcyB0aGUgbGFyZ2VzdCBsZWdhbCByZWxvYyBjb2RlCi0gICBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgSGVyZSB3ZSB1bmRvIHRoYXQgdG8gcmVjb3ZlciB0aGUgb3BlcmFuZAotICAgaW5kZXguICBBdCB0aGlzIHBvaW50IGFsbCBzeW1ib2wgdmFsdWVzIHNob3VsZCBiZSBmdWxseSByZXNvbHZlZCwKLSAgIGFuZCB3ZSBhdHRlbXB0IHRvIGNvbXBsZXRlbHkgcmVzb2x2ZSB0aGUgcmVsb2MuICBJZiB3ZSBjYW4gbm90IGRvCi0gICB0aGF0LCB3ZSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcmVsb2MgY29kZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIGZpeHVwLiAgKi8KLQotLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzb21lIG9mIHRoZSBmaXh1cHMgYW5kIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLSAgIGhhbmRsZXMgdGhlIHJlc3QuICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChvciBzb21lIG90aGVyIGJmZCBmdW5jdGlvbikKLSAgIHNob3VsZCBoYW5kbGUgdGhlbSBhbGwuICAqLwotCi1pbnQKLWdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHVlUCwgc2VnKQotICAgICBmaXhTICogICBmaXhQOwotICAgICB2YWx1ZVQgKiB2YWx1ZVA7Ci0gICAgIHNlZ1QgICAgIHNlZzsKLXsKLSAgY2hhciAqIHdoZXJlID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICB2YWx1ZVQgdmFsdWU7Ci0gIC8qIGNhbm9uaWNhbCBuYW1lLCBzaW5jZSB1c2VkIGEgbG90ICovCi0gIENHRU5fQ1BVX0RFU0MgY2QgPSBnYXNfY2dlbl9jcHVfZGVzYzsKLSAgCi0gIC8qIEZJWE1FIEZJWE1FIEZJWE1FOiBUaGUgdmFsdWUgd2UgYXJlIHBhc3NlZCBpbiAqdmFsdWVwIGluY2x1ZGVzCi0gICAgIHRoZSBzeW1ib2wgdmFsdWVzLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEJGRF9BU1NFTUJMRVIsIGlmIHdlIGFyZQotICAgICBkb2luZyB0aGlzIHJlbG9jYXRpb24gdGhlIGNvZGUgaW4gd3JpdGUuYyBpcyBnb2luZyB0byBjYWxsCi0gICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24sIHdoaWNoIGlzIGFsc28gZ29pbmcgdG8gdXNlIHRoZSBzeW1ib2wKLSAgICAgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIHJlbG9jIGlzIGZ1bGx5IHJlc29sdmVkIHdlIHdhbnQgdG8KLSAgICAgdXNlICp2YWx1ZXAgc2luY2UgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBpcyBub3QgYmVpbmcgdXNlZC4KLSAgICAgSG93ZXZlciwgaWYgdGhlIHJlbG9jIGlzIG5vdCBmdWxseSByZXNvbHZlZCB3ZSBkbyBub3Qgd2FudCB0byB1c2UKLSAgICAgKnZhbHVlcCwgYW5kIG11c3QgdXNlIGZ4X29mZnNldCBpbnN0ZWFkLiAgSG93ZXZlciwgaWYgdGhlIHJlbG9jCi0gICAgIGlzIFBDIHJlbGF0aXZlLCB3ZSBkbyB3YW50IHRvIHVzZSAqdmFsdWVwIHNpbmNlIGl0IGluY2x1ZGVzIHRoZQotICAgICByZXN1bHQgb2YgbWRfcGNyZWxfZnJvbS4gIFRoaXMgaXMgY29uZnVzaW5nLiAgKi8KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICogdmFsdWVQOwotICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICogdmFsdWVQOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4UC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLSAJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICgoaW50KSBmaXhQLT5meF9yX3R5cGUgPj0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICBpbnQgb3BpbmRleCA9IChpbnQpIGZpeFAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgICBjb25zdCBDR0VOX09QRVJBTkQgKm9wZXJhbmQgPSBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoY2QsIG9waW5kZXgpOwotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7Ci0gICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzID0gYWxsb2NhIChDR0VOX0NQVV9TSVpFT0ZfRklFTERTIChjZCkpOwotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gZml4UC0+ZnhfY2dlbi5pbnNuOwotCi0gICAgICAvKiBJZiB0aGUgcmVsb2MgaGFzIGJlZW4gZnVsbHkgcmVzb2x2ZWQgZmluaXNoIHRoZSBvcGVyYW5kIGhlcmUuICAqLwotICAgICAgLyogRklYTUU6IFRoaXMgZHVwbGljYXRlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGNvZGUgaW4gQkZELiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lCi0JICAvKiBGSVhNRTogSWYgcGFydGlhbF9pbnBsYWNlIGlzbid0IHNldCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdvbid0Ci0JICAgICBmaW5pc2ggdGhlIGpvYi4gIFRlc3RpbmcgZm9yIHBjcmVsIGlzIGEgdGVtcG9yYXJ5IGhhY2suICAqLwotCSAgfHwgZml4UC0+ZnhfcGNyZWwpCi0JewotCSAgQ0dFTl9DUFVfU0VUX0ZJRUxEU19CSVRTSVpFIChjZCkgKGZpZWxkcywgQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pKTsKLQkgIENHRU5fQ1BVX1NFVF9WTUFfT1BFUkFORCAoY2QpIChjZCwgb3BpbmRleCwgZmllbGRzLCAoYmZkX3ZtYSkgdmFsdWUpOwotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0JICB7Ci0JICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZSA9Ci0JICAgICAgY2dlbl9nZXRfaW5zbl92YWx1ZSAoY2QsIHdoZXJlLCBDR0VOX0lOU05fQklUU0laRSAoaW5zbikpOwotCi0JICAgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotCSAgICBlcnJtc2cgPSBDR0VOX0NQVV9JTlNFUlRfT1BFUkFORCAoY2QpIChjZCwgb3BpbmRleCwgZmllbGRzLAotCQkJCQkJICAgJmluc25fdmFsdWUsIChiZmRfdm1hKSAwKTsKLQkgICAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIHdoZXJlLCBDR0VOX0lOU05fQklUU0laRSAoaW5zbiksCi0JCQkJIGluc25fdmFsdWUpOwotCSAgfQotI2Vsc2UKLQkgICAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JICAgIGVycm1zZyA9IENHRU5fQ1BVX0lOU0VSVF9PUEVSQU5EIChjZCkgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHdoZXJlLAotCQkJCQkJICAgKGJmZF92bWEpIDApOwotI2VuZGlmCi0JICBpZiAoZXJybXNnKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsICIlcyIsIGVycm1zZyk7Ci0JfQotCi0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKLQlyZXR1cm4gMTsKLQotICAgICAgLyogVGhlIG9wZXJhbmQgaXNuJ3QgZnVsbHkgcmVzb2x2ZWQuICBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUKLQkgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24gYW5kIGxlYXZlIGl0IHRvCi0JIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHdvcmsgd2hlbgotCSBwYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UuICAqLwotCi0gICAgICByZWxvY190eXBlID0gbWRfY2dlbl9sb29rdXBfcmVsb2MgKGluc24sIG9wZXJhbmQsIGZpeFApOwotICAgICAgaWYgKHJlbG9jX3R5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0JewotCSAgZml4UC0+Znhfcl90eXBlID0gcmVsb2NfdHlwZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKLQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+ZnhfZG9uZSkKLSAgICB7Ci0gICAgICAvKiBXZSdyZSBmaW5pc2hlZCB3aXRoIHRoaXMgZml4dXAuICBJbnN0YWxsIGl0IGJlY2F1c2UKLQkgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3b24ndCBiZSBjYWxsZWQgdG8gZG8gaXQuICAqLwotICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCB2YWx1ZSwgMSk7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIHZhbHVlLCAyKTsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzMyOgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgdmFsdWUsIDQpOwotCSAgYnJlYWs7Ci0JLyogRklYTUU6IGxhdGVyIGFkZCBzdXBwb3J0IGZvciA2NCBiaXRzLiAgKi8KLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGluc3RhbGwgZml4IGZvciByZWxvYyB0eXBlICVkIChgJXMnKSIpLAotCQkJZml4UC0+Znhfcl90eXBlLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBmaW5pc2ggdGhpbmdzIHVwLiAgKi8KLSAgICB9Ci0KLSAgLyogVHVjayBgdmFsdWUnIGF3YXkgZm9yIHVzZSBieSB0Y19nZW5fcmVsb2MuCi0gICAgIFNlZSB0aGUgY29tbWVudCBkZXNjcmliaW5nIGZ4X2FkZG51bWJlciBpbiB3cml0ZS5oLgotICAgICBUaGlzIGZpZWxkIGlzIG1pc25hbWVkIChvciBtaXN1c2VkIDotKS4gICovCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQgZm9ybWF0LgotCi0gICBGSVhNRTogVG8gd2hhdCBleHRlbnQgY2FuIHdlIGdldCBhbGwgcmVsZXZhbnQgdGFyZ2V0cyB0byB1c2UgdGhpcz8gICovCi0KLWFyZWxlbnQgKgotZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIGZpeFMgKiAgICAgZml4UDsKLXsKLSAgYXJlbGVudCAqIHJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIiksCi0JCSAgICBmaXhQLT5meF9yX3R5cGUsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhQLT5meF9yX3R5cGUpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhc3NlcnQgKCFmaXhQLT5meF9wY3JlbCA9PSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpOwotCi0gIC8qIFVzZSBmeF9vZmZzZXQgZm9yIHRoZXNlIGNhc2VzICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCkKLSAgICByZWxvYy0+YWRkZW5kICA9IGZpeFAtPmZ4X29mZnNldDsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJlbG9jLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICByZXR1cm4gcmVsb2M7Ci19CmRpZmYgLS1naXQgYS9nYXMvY2dlbi5oIGIvZ2FzL2NnZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjMTczMi4uMDAwMDAwMAotLS0gYS9nYXMvY2dlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogR0FTIGNnZW4gc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVNfQ0dFTl9ICi0jZGVmaW5lIEdBU19DR0VOX0gKLQotLyogT3Bjb2RlIHRhYmxlIGhhbmRsZS4gICovCi1leHRlcm4gQ0dFTl9DUFVfREVTQyBnYXNfY2dlbl9jcHVfZGVzYzsKLQotLyogTWF4aW11bSBudW1iZXIgb2YgZml4dXBzIGluIGFuIGluc24uCi0gICBJZiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhpcywgYWxsb3cgdGFyZ2V0IHRvIG92ZXJyaWRlIGFuZCBkbyBzbyB0aGVyZS4gICovCi0jZGVmaW5lIEdBU19DR0VOX01BWF9GSVhVUFMgMwotCi0vKiBTdHJ1Y3QgZGVmaW5pbmcgcmVzdWx0IG9mIGdhc19jZ2VuX2ZpbmlzaF9pbnNuLiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogZnJhZyBjb250YWluaW5nIHRoZSBpbnNuICovCi0gIGZyYWdTICogZnJhZzsKLSAgLyogQWRkcmVzcyBvZiBpbnNuIGluIGZyYWcuICAqLwotICBjaGFyICogYWRkcjsKLSAgLyogTnVtYmVyIG9mIGZpeHVwcyB0aGlzIGluc24gaGFzLiAgKi8KLSAgaW50IG51bV9maXh1cHM7Ci0gIC8qIEFycmF5IG9mIGZpeHVwcy4gICovCi0gIGZpeFMgKiBmaXh1cHNbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci19IGZpbmlzaGVkX2luc25TOwotCi0vKiBDYWxsYmFjayBmb3Igb3BlcmFuZCBwYXJzaW5nLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgZm9yIHN1Y2Nlc3MuCi0gICBUaGUgcGFyc2VkIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgYmZkX3ZtYSAqLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICogZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlLAotCSAgICAgIGNvbnN0IGNoYXIgKiosIGludCwgaW50LCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwKLQkgICAgICBiZmRfdm1hICopKTsKLQotLyogQ2FsbCB0aGlzIGZyb20gbWRfYXNzZW1ibGUgdG8gaW5pdGlhbGl6ZSB0aGUgYXNzZW1ibGVyIGNhbGxiYWNrLiAgKi8KLWV4dGVybiB2b2lkIGdhc19jZ2VuX2luaXRfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBnYXNfY2dlbl9zYXZlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBnYXNfY2dlbl9yZXN0b3JlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBnYXNfY2dlbl9zd2FwX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci0gICAgIAotLyogQWRkIGEgcmVnaXN0ZXIgdG8gdGhlIGFzc2VtYmxlcidzIGhhc2ggdGFibGUuCi0gICBUaGlzIG1ha2VzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCi0gICA/Pz8gVGhpcyBpc24ndCBjdXJyZW50bHkgdXNlZCwgYnV0IGl0IGNvdWxkIGJlIGluIHRoZSBmdXR1cmUuICAqLwotZXh0ZXJuIHZvaWQgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLS8qIEFmdGVyIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKSBpcyBkb25lLCB0aGlzIGlzIGNhbGxlZCB0bwotICAgb3V0cHV0IHRoZSBpbnNuIGFuZCByZWNvcmQgYW55IGZpeHVwcy4gICovCi1leHRlcm4gdm9pZCBnYXNfY2dlbl9maW5pc2hfaW5zbiBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKiwKLQkJCQkJICBDR0VOX0lOU05fQllURVNfUFRSLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgaW50LCBmaW5pc2hlZF9pbnNuUyAqKSk7Ci0KLS8qIFJlY29yZCBhIGZpeHVwLiAgKi8KLWV4dGVybiBmaXhTICogZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCSAgICAgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkgICAgIHN5bWJvbFMgKiwgb2Zmc2V0VCkpOwotZXh0ZXJuIGZpeFMgKiBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCQkgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkJIGV4cHJlc3Npb25TICopKTsKLQotLyogbWRfYXBwbHlfZml4MyBoYW5kbGVyICovCi1leHRlcm4gaW50IGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgUEFSQU1TICgoZml4UyAqLCB2YWx1ZVQgKiwgc2VnVCkpOwotCi0vKiB0Y19nZW5fcmVsb2MgaGFuZGxlciAqLwotZXh0ZXJuIGFyZWxlbnQgKmdhc19jZ2VuX3RjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLQotLyogVGFyZ2V0IHN1cHBsaWVkIHJvdXRpbmUgdG8gbG9va3VwIGEgcmVsb2MuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotbWRfY2dlbl9sb29rdXBfcmVsb2MgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IENHRU5fT1BFUkFORCAqLAotCQkJICAgICAgZml4UyAqKSk7Ci0KLS8qIE9wdGlvbmFsIHRhcmdldCBzdXBwbGllZCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGZvciBhbiBleHByZXNzaW9uLiAgKi8KLWV4dGVybiBmaXhTICoKLW1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGNvbnN0IENHRU5fSU5TTiAqLCBpbnQsCi0JCQkJICBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCSAgZXhwcmVzc2lvblMgKikpOwotCi0jZW5kaWYgLyogR0FTX0NHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmQuYyBiL2dhcy9jb25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNWNhNTEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKiBjb25kLmMgLSBjb25kaXRpb25hbCBhc3NlbWJseSBwc2V1ZG8tb3BzLCBhbmQgLmluY2x1ZGUKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAibWFjcm8uaCIKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogVGhpcyBpcyBhbGxvY2F0ZWQgdG8gZ3JvdyBhbmQgc2hyaW5rIGFzIC5pZmRlZi8uZW5kaWYgcGFpcnMgYXJlIHNjYW5uZWQuICovCi1zdHJ1Y3Qgb2JzdGFjayBjb25kX29ic3RhY2s7Ci0KLXN0cnVjdCBmaWxlX2xpbmUKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci19OwotCi0vKiBXZSBwdXNoIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGZvciBlYWNoIC5pZiwgYW5kIHBvcCBpdCBhdCB0aGUKLSAgIC5lbmRpZi4gICovCi0KLXN0cnVjdCBjb25kaXRpb25hbF9mcmFtZQotewotICAvKiBUaGUgc291cmNlIGZpbGUgJiBsaW5lIG51bWJlciBvZiB0aGUgImlmIi4gICovCi0gIHN0cnVjdCBmaWxlX2xpbmUgaWZfZmlsZV9saW5lOwotICAvKiBUaGUgc291cmNlIGZpbGUgJiBsaW5lIG9mIHRoZSAiZWxzZSIuICAqLwotICBzdHJ1Y3QgZmlsZV9saW5lIGVsc2VfZmlsZV9saW5lOwotICAvKiBUaGUgcHJldmlvdXMgY29uZGl0aW9uYWwuICAqLwotICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKnByZXZpb3VzX2NmcmFtZTsKLSAgLyogSGF2ZSB3ZSBzZWVuIGFuIGVsc2UgeWV0PyAgKi8KLSAgaW50IGVsc2Vfc2VlbjsKLSAgLyogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIGlucHV0LiAgKi8KLSAgaW50IGlnbm9yaW5nOwotICAvKiBXaGV0aGVyIGEgY29uZGl0aW9uYWwgYXQgYSBoaWdoZXIgbGV2ZWwgaXMgaWdub3JpbmcgaW5wdXQuICAqLwotICBpbnQgZGVhZF90cmVlOwotICAvKiBNYWNybyBuZXN0aW5nIGxldmVsIGF0IHdoaWNoIHRoaXMgY29uZGl0aW9uYWwgd2FzIGNyZWF0ZWQuICAqLwotICBpbnQgbWFjcm9fbmVzdDsKLX07Ci0KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVfY2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqY2ZyYW1lKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X21yaV9zdHJpbmcgUEFSQU1TICgoaW50LCBpbnQgKikpOwotCi1zdGF0aWMgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpjdXJyZW50X2NmcmFtZSA9IE5VTEw7Ci0KLXZvaWQgCi1zX2lmZGVmIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7CQkvKiBwb2ludHMgdG8gbmFtZSBvZiBzeW1ib2wgKi8KLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsJLyogUG9pbnRzIHRvIHN5bWJvbCAqLwotICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgY2ZyYW1lOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qIExlYWRpbmcgd2hpdGVzcGFjZSBpcyBwYXJ0IG9mIG9wZXJhbmQuICovCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKCFpc19uYW1lX2JlZ2lubmVyICgqbmFtZSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGlkZW50aWZpZXIgZm9yIFwiLmlmZGVmXCIiKSk7Ci0gICAgICBvYnN0YWNrXzFncm93ICgmY29uZF9vYnN0YWNrLCAwKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBjOwotCi0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKLSAgICAgIGNmcmFtZS5pZ25vcmluZyA9IGNmcmFtZS5kZWFkX3RyZWUgfHwgISgoc3ltYm9sUCAhPSAwKSBeIGFyZyk7Ci0gICAgICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCi0JCQlvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsCi0JCQkJICAgICAgc2l6ZW9mIChjZnJhbWUpKSk7Ci0KLSAgICAgIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQotCSAgJiYgY2ZyYW1lLmlnbm9yaW5nCi0JICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCi0JICAgICAgfHwgISBjZnJhbWUucHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCi0JbGlzdGluZ19saXN0ICgyKTsKLQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9CQkJCS8qIGlmIGEgdmFsaWQgaWRlbnRpZnllciBuYW1lICovCi19CQkJCS8qIHNfaWZkZWYoKSAqLwotCi12b2lkIAotc19pZiAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBleHByZXNzaW9uUyBvcGVyYW5kOwotICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgY2ZyYW1lOwotICBpbnQgdDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7CQkvKiBMZWFkaW5nIHdoaXRlc3BhY2UgaXMgcGFydCBvZiBvcGVyYW5kLiAqLwotCi0gIGlmIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMICYmIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZykKLSAgICB7Ci0gICAgICBvcGVyYW5kLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXhwcmVzc2lvbiAoJm9wZXJhbmQpOwotICAgICAgaWYgKG9wZXJhbmQuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygibm9uLWNvbnN0YW50IGV4cHJlc3Npb24gaW4gXCIuaWZcIiBzdGF0ZW1lbnQiKSk7Ci0gICAgfQotCi0gIHN3aXRjaCAoKG9wZXJhdG9yVCkgYXJnKQotICAgIHsKLSAgICBjYXNlIE9fZXE6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA9PSAwOyBicmVhazsKLSAgICBjYXNlIE9fbmU6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciAhPSAwOyBicmVhazsKLSAgICBjYXNlIE9fbHQ6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA8IDA7IGJyZWFrOwotICAgIGNhc2UgT19sZTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyIDw9IDA7IGJyZWFrOwotICAgIGNhc2UgT19nZTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyID49IDA7IGJyZWFrOwotICAgIGNhc2UgT19ndDogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyID4gMDsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJZiB0aGUgYWJvdmUgZXJyb3IgaXMgc2lnbmFsZWQsIHRoaXMgd2lsbCBkaXNwYXRjaAotICAgICB1c2luZyBhbiB1bmRlZmluZWQgcmVzdWx0LiAgTm8gYmlnIGRlYWwuICAqLwotICBpbml0aWFsaXplX2NmcmFtZSAoJmNmcmFtZSk7Ci0gIGNmcmFtZS5pZ25vcmluZyA9IGNmcmFtZS5kZWFkX3RyZWUgfHwgISB0OwotICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCi0JCSAgICBvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsIHNpemVvZiAoY2ZyYW1lKSkpOwotCi0gIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQotICAgICAgJiYgY2ZyYW1lLmlnbm9yaW5nCi0gICAgICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCi0JICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLSAgICBsaXN0aW5nX2xpc3QgKDIpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2lmKCkgKi8KLQotLyogR2V0IGEgc3RyaW5nIGZvciB0aGUgTVJJIElGQyBvciBJRk5DIHBzZXVkby1vcHMuICAqLwotCi1zdGF0aWMgY2hhciAqCi1nZXRfbXJpX3N0cmluZyAodGVybWluYXRvciwgbGVuKQotICAgICBpbnQgdGVybWluYXRvcjsKLSAgICAgaW50ICpsZW47Ci17Ci0gIGNoYXIgKnJldDsKLSAgY2hhciAqczsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIHMgPSByZXQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCi0gICAgewotICAgICAgKytzOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgKnMrKyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGlmIChzWy0xXSA9PSAnXCcnKQotCSAgICB7Ci0JICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wnJykKLQkJYnJlYWs7Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQl9Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gdGVybWluYXRvcgotCSAgICAgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKHMgPiByZXQgJiYgKHNbLTFdID09ICcgJyB8fCBzWy0xXSA9PSAnXHQnKSkKLQktLXM7Ci0gICAgfQotCi0gICpsZW4gPSBzIC0gcmV0OwotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgTVJJIElGQyBhbmQgSUZOQyBwc2V1ZG8tb3BzLiAgKi8KLQotdm9pZAotc19pZmMgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0gIGNoYXIgKnMxLCAqczI7Ci0gIGludCBsZW4xLCBsZW4yOwotICBpbnQgcmVzOwotICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgY2ZyYW1lOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgczEgPSBnZXRfbXJpX3N0cmluZyAoJywnLCAmbGVuMSk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGFzX2JhZCAoXygiYmFkIGZvcm1hdCBmb3IgaWZjIG9yIGlmbmMiKSk7Ci0gIGVsc2UKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBzMiA9IGdldF9tcmlfc3RyaW5nICgnOycsICZsZW4yKTsKLQotICByZXMgPSBsZW4xID09IGxlbjIgJiYgc3RybmNtcCAoczEsIHMyLCBsZW4xKSA9PSAwOwotCi0gIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKLSAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhIChyZXMgXiBhcmcpOwotICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCi0JCSAgICBvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsIHNpemVvZiAoY2ZyYW1lKSkpOwotCi0gIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQotICAgICAgJiYgY2ZyYW1lLmlnbm9yaW5nCi0gICAgICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCi0JICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLSAgICBsaXN0aW5nX2xpc3QgKDIpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkIAotc19lbHNlaWYgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgZXhwcmVzc2lvblMgb3BlcmFuZDsKLSAgaW50IHQ7Ci0KLSAgaWYgKGN1cnJlbnRfY2ZyYW1lID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJcIi5lbHNlaWZcIiB3aXRob3V0IG1hdGNoaW5nIFwiLmlmXCIgLSBpZ25vcmVkIikpOwotCi0gICAgfQotICBlbHNlIGlmIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9zZWVuKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiXCIuZWxzZWlmXCIgYWZ0ZXIgXCIuZWxzZVwiIC0gaWdub3JlZCIpKTsKLSAgICAgIGFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmZpbGUsCi0JCSAgICBjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUubGluZSwKLQkJICAgIF8oImhlcmUgaXMgdGhlIHByZXZpb3VzIFwiZWxzZVwiIikpOwotICAgICAgYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmZpbGUsCi0JCSAgICBjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImlmXCIiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2hlcmUgKCZjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUuZmlsZSwKLQkJJmN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5saW5lKTsKLQotICAgICAgaWYgKCFjdXJyZW50X2NmcmFtZS0+ZGVhZF90cmVlKQotCXsKLQkgIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZyA9ICFjdXJyZW50X2NmcmFtZS0+aWdub3Jpbmc7Ci0JICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkpCi0JICAgIHsKLQkgICAgICBpZiAoISBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpCi0JCWxpc3RpbmdfbGlzdCAoMSk7Ci0JICAgICAgZWxzZQotCQlsaXN0aW5nX2xpc3QgKDIpOwotCSAgICB9Ci0JfQkJCS8qIGlmIG5vdCBhIGRlYWQgdHJlZSAqLwotICAgIH0JCQkJLyogaWYgZXJyb3IgZWxzZSBkbyBpdCAqLwotCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogTGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KLQotICBpZiAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpCi0gICAgewotICAgICAgb3BlcmFuZC5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4cHJlc3Npb24gKCZvcGVyYW5kKTsKLSAgICAgIGlmIChvcGVyYW5kLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIm5vbi1jb25zdGFudCBleHByZXNzaW9uIGluIFwiLmVsc2VpZlwiIHN0YXRlbWVudCIpKTsKLSAgICB9Ci0gIAotICBzd2l0Y2ggKChvcGVyYXRvclQpIGFyZykKLSAgICB7Ci0gICAgY2FzZSBPX2VxOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX25lOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgIT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2x0OiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPCAwOyBicmVhazsKLSAgICBjYXNlIE9fbGU6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA8PSAwOyBicmVhazsKLSAgICBjYXNlIE9fZ2U6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA+PSAwOyBicmVhazsKLSAgICBjYXNlIE9fZ3Q6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA+IDA7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nID0gY3VycmVudF9jZnJhbWUtPmRlYWRfdHJlZSB8fCAhIHQ7Ci0KLSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0gICAgICAmJiBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcKLSAgICAgICYmIChjdXJyZW50X2NmcmFtZS0+cHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgIHx8ICEgY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotICAgIGxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZCAKLXNfZW5kaWYgKGFyZykKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmhvbGQ7Ci0KLSAgaWYgKGN1cnJlbnRfY2ZyYW1lID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJcIi5lbmRpZlwiIHdpdGhvdXQgXCIuaWZcIiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKLQkgICYmIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZwotCSAgJiYgKGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAotCSAgICAgIHx8ICEgY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotCWxpc3RpbmdfbGlzdCAoMSk7Ci0KLSAgICAgIGhvbGQgPSBjdXJyZW50X2NmcmFtZTsKLSAgICAgIGN1cnJlbnRfY2ZyYW1lID0gY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZTsKLSAgICAgIG9ic3RhY2tfZnJlZSAoJmNvbmRfb2JzdGFjaywgaG9sZCk7Ci0gICAgfQkJCQkvKiBpZiBvbmUgcG9wIHRvbyBtYW55ICovCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19lbmRpZigpICovCi0KLXZvaWQgCi1zX2Vsc2UgKGFyZykKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoY3VycmVudF9jZnJhbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5lbHNlIHdpdGhvdXQgbWF0Y2hpbmcgLmlmIC0gaWdub3JlZCIpKTsKLQotICAgIH0KLSAgZWxzZSBpZiAoY3VycmVudF9jZnJhbWUtPmVsc2Vfc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImR1cGxpY2F0ZSBcImVsc2VcIiAtIGlnbm9yZWQiKSk7Ci0gICAgICBhc19iYWRfd2hlcmUgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5maWxlLAotCQkgICAgY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImVsc2VcIiIpKTsKLSAgICAgIGFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5maWxlLAotCQkgICAgY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5saW5lLAotCQkgICAgXygiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJpZlwiIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3doZXJlICgmY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmZpbGUsCi0JCSZjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUubGluZSk7Ci0KLSAgICAgIGlmICghY3VycmVudF9jZnJhbWUtPmRlYWRfdHJlZSkKLQl7Ci0JICBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcgPSAhY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nOwotCSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKQotCQlsaXN0aW5nX2xpc3QgKDEpOwotCSAgICAgIGVsc2UKLQkJbGlzdGluZ19saXN0ICgyKTsKLQkgICAgfQotCX0JCQkvKiBpZiBub3QgYSBkZWFkIHRyZWUgKi8KLQotICAgICAgY3VycmVudF9jZnJhbWUtPmVsc2Vfc2VlbiA9IDE7Ci0gICAgfQkJCQkvKiBpZiBlcnJvciBlbHNlIGRvIGl0ICovCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19lbHNlKCkgKi8KLQotdm9pZCAKLXNfaWZlcXMgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgY2hhciAqczEsICpzMjsKLSAgaW50IGxlbjEsIGxlbjI7Ci0gIGludCByZXM7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgczEgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbjEpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLmlmZXFzIHN5bnRheCBlcnJvciIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHMyID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4yKTsKLQotICByZXMgPSBsZW4xID09IGxlbjIgJiYgc3RybmNtcCAoczEsIHMyLCBsZW4xKSA9PSAwOwotCi0gIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKLSAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhIChyZXMgXiBhcmcpOwotICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCi0JCSAgICBvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsIHNpemVvZiAoY2ZyYW1lKSkpOwotCi0gIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQotICAgICAgJiYgY2ZyYW1lLmlnbm9yaW5nCi0gICAgICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCi0JICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLSAgICBsaXN0aW5nX2xpc3QgKDIpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfaWZlcXMoKSAqLwotCi1pbnQgCi1pZ25vcmVfaW5wdXQgKCkKLXsKLSAgY2hhciAqczsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChOT19QU0VVRE9fRE9UIHx8IGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgaWYgKHNbLTFdICE9ICcuJykKLQktLXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNbLTFdICE9ICcuJykKLQlyZXR1cm4gKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwpICYmIChjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpOwotICAgIH0KLQotICAvKiBXZSBjYW5ub3QgaWdub3JlIGNlcnRhaW4gcHNldWRvIG9wcy4gICovCi0gIGlmICgoKHNbMF0gPT0gJ2knCi0JfHwgc1swXSA9PSAnSScpCi0gICAgICAgJiYgKCFzdHJuY2FzZWNtcCAocywgImlmIiwgMikKLQkgICB8fCAhc3RybmNhc2VjbXAgKHMsICJpZmRlZiIsIDUpCi0JICAgfHwgIXN0cm5jYXNlY21wIChzLCAiaWZuZGVmIiwgNikpKQotICAgICAgfHwgKChzWzBdID09ICdlJwotCSAgIHx8IHNbMF0gPT0gJ0UnKQotCSAgJiYgKCFzdHJuY2FzZWNtcCAocywgImVsc2UiLCA0KQotCSAgICAgIHx8ICFzdHJuY2FzZWNtcCAocywgImVuZGlmIiwgNSkKLQkgICAgICB8fCAhc3RybmNhc2VjbXAgKHMsICJlbmRjIiwgNCkpKSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwpICYmIChjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpOwotfQkJCQkvKiBpZ25vcmVfaW5wdXQoKSAqLwotCi1zdGF0aWMgdm9pZCAKLWluaXRpYWxpemVfY2ZyYW1lIChjZnJhbWUpCi0gICAgIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqY2ZyYW1lOwotewotICBtZW1zZXQgKGNmcmFtZSwgMCwgc2l6ZW9mICgqY2ZyYW1lKSk7Ci0gIGFzX3doZXJlICgmY2ZyYW1lLT5pZl9maWxlX2xpbmUuZmlsZSwKLQkgICAgJmNmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUpOwotICBjZnJhbWUtPnByZXZpb3VzX2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lOwotICBjZnJhbWUtPmRlYWRfdHJlZSA9IGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nOwotICBjZnJhbWUtPm1hY3JvX25lc3QgPSBtYWNyb19uZXN0OwotfQotCi0vKiBHaXZlIGFuIGVycm9yIGlmIGEgY29uZGl0aW9uYWwgaXMgdW50ZXJtaW5hdGVkIGluc2lkZSBhIG1hY3JvIG9yCi0gICB0aGUgYXNzZW1ibHkgYXMgYSB3aG9sZS4gIElmIE5FU1QgaXMgbm9uIG5lZ2F0aXZlLCB3ZSBhcmUgYmVpbmcKLSAgIGNhbGxlZCBiZWNhdXNlIG9mIHRoZSBlbmQgb2YgYSBtYWNybyBleHBhbnNpb24uICBJZiBORVNUIGlzCi0gICBuZWdhdGl2ZSwgd2UgYXJlIGJlaW5nIGNhbGxlZCBhdCB0aGUgb2YgdGhlIGlucHV0IGZpbGVzLiAgKi8KLQotdm9pZAotY29uZF9maW5pc2hfY2hlY2sgKG5lc3QpCi0gICAgIGludCBuZXN0OwotewotICBpZiAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+bWFjcm9fbmVzdCA+PSBuZXN0KQotICAgIHsKLSAgICAgIGlmIChuZXN0ID49IDApCi0JYXNfYmFkIChfKCJlbmQgb2YgbWFjcm8gaW5zaWRlIGNvbmRpdGlvbmFsIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiZW5kIG9mIGZpbGUgaW5zaWRlIGNvbmRpdGlvbmFsIikpOwotICAgICAgYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmZpbGUsCi0JCSAgICBjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBzdGFydCBvZiB0aGUgdW50ZXJtaW5hdGVkIGNvbmRpdGlvbmFsIikpOwotICAgICAgaWYgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX3NlZW4pCi0JYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUuZmlsZSwKLQkJICAgICAgY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUsCi0JCSAgICAgIF8oImhlcmUgaXMgdGhlIFwiZWxzZVwiIG9mIHRoZSB1bnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwiKSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIGV4aXQgb3V0IG9mIGEgbWFjcm8uICBXZSBhc3N1bWUKLSAgIHRoYXQgYW55IGNvbmRpdGlvbmFscyB3aGljaCBiZWdhbiB3aXRoaW4gdGhlIG1hY3JvIGFyZSBjb3JyZWN0bHkKLSAgIG5lc3RlZCwgYW5kIGp1c3QgcG9wIHRoZW0gb2ZmIHRoZSBzdGFjay4gICovCi0KLXZvaWQKLWNvbmRfZXhpdF9tYWNybyAobmVzdCkKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIHdoaWxlIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMICYmIGN1cnJlbnRfY2ZyYW1lLT5tYWNyb19uZXN0ID49IG5lc3QpCi0gICAgewotICAgICAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpob2xkOwotCi0gICAgICBob2xkID0gY3VycmVudF9jZnJhbWU7Ci0gICAgICBjdXJyZW50X2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWU7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKCZjb25kX29ic3RhY2ssIGhvbGQpOwotICAgIH0KLX0KLQotLyogZW5kIG9mIGNvbmQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy1nYXMuY29tIGIvZ2FzL2NvbmZpZy1nYXMuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUyNDhhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWctZ2FzLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0kIWNvbmZpZy1nYXMuY29tCi0kISBUaGlzIGZpbGUgc2V0cyB0aGluZ3MgdXAgdG8gYnVpbGQgZ2FzIG9uIGEgVk1TIHN5c3RlbSB0byBnZW5lcmF0ZSBvYmplY3QKLSQhIGZpbGVzIGZvciBhIFZNUyBzeXN0ZW0uICBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZQotJCEgZG8gbm90IGhhdmUgL2Jpbi9zaCB0byBleGVjdXRlIGl0LgotJCEKLSQhCi0kIGdhc19ob3N0PSJ2bXMiCi0kIGFyY2hfaW5keCA9IDEgKyAoKGYkZ2V0c3lpKCJDUFUiKS5nZS4xMjgpLmFuZC4xKQkhIHZheD09MSwgYWxwaGE9PTIKLSQgYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIGlmIGFyY2guZXFzLiJWQVgiCi0kIHRoZW4KLSQgIGNwdV90eXBlPSJ2YXgiCi0kICBvYmpfZm9ybWF0PSJ2bXMiCi0kICBhdG9mPSJ2YXgiCi0kIGVsc2UKLSQgIGNwdV90eXBlPSJhbHBoYSIKLSQgIG9ial9mb3JtYXQ9ImV2YXgiCi0kICBhdG9mPSJpZWVlIgotJCBlbmRpZgotJCBlbXVsYXRpb249ImdlbmVyaWMiCi0kIQotJAlERUxFVEUJPSAiZGVsZXRlL25vQ29uZmlybSIKLSQJRUNITwk9ICJ3cml0ZSBzeXMkb3V0cHV0IgotJCEKLSQhIFRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbgotJCBjYWxsIG1ha2UgInRhcmctY3B1LmgiICJbLmNvbmZpZ110Yy0nJ2NwdV90eXBlJy5oIgotJCBjYWxsIG1ha2UgInRhcmctZW52LmgiICJbLmNvbmZpZ110ZS0nJ2VtdWxhdGlvbicuaCIKLSQhCi0kISBDb2RlIHRvIGhhbmRsZSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgotJCBjYWxsIG1ha2UgIm9iai1mb3JtYXQuaCIgIlsuY29uZmlnXW9iai0nJ29ial9mb3JtYXQnLmgiCi0kIQotJCEgKG5vdCBjdXJyZW50bHkgdXNlZCBmb3IgdmF4IG9yIGFscGhhKQotJCBjYWxsIG1ha2UgIml0YmwtY3B1LmgiICJbLmNvbmZpZ11pdGJsLScnY3B1X3R5cGUnLmgiCi0kIQotJCEKLSQhIENyZWF0ZSB0aGUgZmlsZSB2ZXJzaW9uLm9wdCwgd2hpY2ggaGVscHMgaWRlbnRpZnkgdGhlIGV4ZWN1dGFibGUuCi0kIQotJGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kc2VhcmNoIENPTkZJR1VSRS5JTiAiQU1fSU5JVF9BVVRPTUFLRSIvRXhhY3QvT3V0cHV0PWNvbmZpZy1nYXMtdG1wLnRtcAotJG9wZW4gaWZpbGUkIGNvbmZpZy1nYXMtdG1wLnRtcAotJHJlYWQgaWZpbGUkIGxpbmUKLSRjbG9zZSBpZmlsZSQKLSRERUxFVEUgY29uZmlnLWdhcy10bXAudG1wOyoKLSQhIERpc2NhcmQgIkFNX0lOSVRfQVVUT01BS0UoZ2FzLCAiIGFuZCAiKSIgcGFydHMuCi0kaWprPWYkbG9jYXRlKCIsIixsaW5lKSsyCi0kbGluZT1mJGV4dHJhY3QoaWprLGYkbGVuZ3RoKGxpbmUpLWlqayxsaW5lKQotJGlqaz1mJGxvY2F0ZSgiKSIsbGluZSkKLSRsaW5lPWYkZXh0cmFjdCgwLGlqayxsaW5lKQotJCEKLSQgaWYgZiRzZWFyY2goInZlcnNpb24ub3B0IikubmVzLiIiIHRoZW4gREVMRVRFIHZlcnNpb24ub3B0OyoKLSRjb3B5IF9OTDogdmVyc2lvbi5vcHQKLSRvcGVuL0FwcGVuZCBpZmlsZSQgdmVyc2lvbi5vcHQKLSR3cml0ZSBpZmlsZSQgImlkZW50aWZpY2F0aW9uPSIrIiIiIitsaW5lKyIiIiIKLSRjbG9zZSBpZmlsZSQKLSQhCi0kISBOb3cgd3JpdGUgY29uZmlnLmguCi0kIQotJCBpZiBmJHNlYXJjaCgiY29uZmlnLmgiKS5uZXMuIiIgdGhlbiBERUxFVEUgY29uZmlnLmg7KgotJGNvcHkgX05MOiBjb25maWcuaAotJG9wZW4vQXBwZW5kIGlmaWxlJCBjb25maWcuaAotJHdyaXRlIGlmaWxlJCAiLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLWdhcy5jb20uICovCi0kd3JpdGUgaWZpbGUkICIjaWZuZGVmIFZFUlNJT04iCi0kd3JpdGUgaWZpbGUkICIjZGVmaW5lIFZFUlNJT04gICAgICAiIiIsbGluZSwiIiIiCi0kd3JpdGUgaWZpbGUkICIjZW5kaWYiCi0kd3JpdGUgaWZpbGUkICIvKi0tKi8iCi0kaWYgYXJjaCAuZXFzLiAiVkFYIgotJHRoZW4KLSRhcHBlbmQgWy5jb25maWdddm1zLWNvbmYuaCBpZmlsZSQ6Ci0kZWxzZQotJCBhcHBlbmQgWy5jb25maWdddm1zLWEtY29uZi5oIGlmaWxlJDoKLSRlbmRpZgotJGNsb3NlIGlmaWxlJAotJEVDSE8gIkNyZWF0ZWQgY29uZmlnLmguIgotJCEKLSQhIENoZWNrIGZvciwgYW5kIHBvc3NpYmx5IG1ha2UsIGhlYWRlciBmaWxlIDx1bmlzdGQuaD4uCi0kIQotJCBpZiBmJHNlYXJjaCgidG1wLWNoay1oLioiKS5uZXMuIiIgdGhlbiAgREVMRVRFIHRtcC1jaGstaC4qOyoKLSQhY2FuJ3QgdXNlIHNpbXBsZSBgI2luY2x1ZGUgSERSJyB3aXRoIGBnY2MgL0RlZmluZT0iSERSPTxmb28uaD4iJwotJCFiZWNhdXNlIHRoZSAyLjYuWzAtM10gcHJlcHJvY2Vzc29yIGhhbmRsZXMgaXQgd3JvbmcgKFZNUy1zcGVjaWZpYyBnY2MgYnVnKQotJCBjcmVhdGUgdG1wLWNoay1oLmMKLWludCB0bXBfY2hrX2g7CS8qIGd1YXJhbnRlZSBub24tZW1wdHkgb3V0cHV0ICovCi0jaWZkZWYgSEFWRV9TVERJT19ICi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JWElPX0gKLSNpbmNsdWRlIDx1bml4aW8uaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JWExJQl9ICi0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2VuZGlmCi0kIG9uIHdhcm5pbmcgdGhlbiAgY29udGludWUKLSQgQ0hFQ0sgPSAiY2FsbCB0bXBfY2hrX2giCi0kIENIRUNLICJIQVZFX1NURElPX0giCi0kIGlmIC5ub3QuJHN0YXR1cwotJCB0aGVuCXR5cGUgc3lzJGlucHV0OgotCi0/IGNvdWxkIG5vdCBjb21waWxlIDxzdGRpby5oPi4KLQotICBJZiB5b3UncmUgY29tcGlsaW5nIHdpdGggREVDIEMgb3IgVkFYIEMsIGNyZWF0ZSBjb25maWcuc3RhdHVzIGFzIGFuCi0gIGVtcHR5IGZpbGUgYW5kIHN0YXJ0IGdudSBtYWtlIGFnYWluLgotCi0gIElmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBHTlUgQywgdGhlcmUgaXMgc29tZSBzZXR1cCBwcm9ibGVtIGFuZAotICBnYXMgY29uZmlndXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KLQotJAlERUxFVEUgdG1wLWNoay1oLmM7KgotJAlleGl0ICV4MDAyQwotJCBlbmRpZgotJCEKLSQgQ0hFQ0sgIkhBVkVfVU5JU1REX0giCi0kIGlmIC5ub3QuJHN0YXR1cwotJCB0aGVuCi0kICBpZiBmJHRybmxubSgiSEZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGhmaWxlJAotJCAgQ0hFQ0sgIkhBVkVfVU5JWElPX0giCi0kICBnb3RfdW5peGlvID0gKCRzdGF0dXMgLmFuZC4gMSkKLSQgIENIRUNLICJIQVZFX1VOSVhMSUJfSCIKLSQgIGdvdF91bml4bGliID0gKCRzdGF0dXMgLmFuZC4gMSkKLSQgIGNyZWF0ZSBbXXVuaXN0ZC5oCSF3aXRoIHJ1ZGltZW50YXJ5IGNvbnRlbnRzCi0vKiA8dW5pc3RkLmg+IHN1YnN0aXR1dGUgZm9yIGJ1aWxkaW5nIGdhcyAqLwotI2lmbmRlZiBVTklTVERfSAotI2RlZmluZSBVTklTVERfSAotCi0kICBvcGVuL0FwcGVuZCBoZmlsZSQgW111bmlzdGQuaAotJCAgaWYgZ290X3VuaXhpbwotJCAgdGhlbiAgd3JpdGUgaGZpbGUkICIjaW5jbHVkZSA8dW5peGlvLmg+IgotJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgotLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGlvLmg+ICovCi1leHRlcm4gaW50IGNyZWF0KCksIG9wZW4oKSwgY2xvc2UoKSwgcmVhZCgpLCB3cml0ZSgpOwotZXh0ZXJuIGludCBhY2Nlc3MoKSwgZHVwKCksIGR1cDIoKSwgZnN0YXQoKSwgc3RhdCgpOwotZXh0ZXJuIGxvbmcgbHNlZWsoKTsKLSQgIGVuZGlmCi0kICB3cml0ZSBoZmlsZSQgIiIKLSQgIGlmIGdvdF91bml4bGliCi0kICB0aGVuICB3cml0ZSBoZmlsZSQgIiNpbmNsdWRlIDx1bml4bGliLmg+IgotJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgotLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGxpYi5oPiAqLwotZXh0ZXJuIGNoYXIgKnNicmsoKSwgKmdldGN3ZCgpLCAqY3VzZXJpZCgpOwotZXh0ZXJuIGludCBicmsoKSwgY2hkaXIoKSwgY2htb2QoKSwgY2hvd24oKSwgbWtkaXIoKTsKLWV4dGVybiB1bnNpZ25lZCBnZXR1aWQoKSwgdW1hc2soKTsKLSQgIGVuZGlmCi0kICBhcHBlbmQgc3lzJGlucHV0OiBoZmlsZSQ6Ci0KLSNlbmRpZiAvKlVOSVNURF9IKi8KLSQgIGNsb3NlIGhmaWxlJAotJCAgRUNITyAiQ3JlYXRlZCAiIltddW5pc3RkLmgiIi4iCi0kIGVuZGlmICFnY2MgJyNpbmNsdWRlIDx1bmlzdGQuaD4nIGZhaWxlZAotJCBERUxFVEUgdG1wLWNoay1oLmM7KgotJAotJHRtcF9jaGtfaDogc3Vicm91dGluZQotJCAgc2V0IG5vT24KLSQgIGhuYW1lID0gZiRlZGl0KCI8IiArIChwMSAtICJIQVZFXyIgLSAiX0giKSArICIuaD4iLCJMT1dFUkNBU0UiKQotJCAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnaG5hbWUnLiIKLSQgIGlmIGYkc2VhcmNoKCJ0bXAtY2hrLWgub2JqIikubmVzLiIiIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKLSQgIGRlZmluZS9ub0xvZyBzeXMkZXJyb3IgX05MOgkhY2FuJ3QgdXNlIC9Vc2VyX01vZGUgaGVyZSBkdWUgdG8gZ2NjCi0kICBkZWZpbmUvbm9Mb2cgc3lzJG91dHB1dCBfTkw6CSEgZHJpdmVyJ3MgdXNlIG9mIG11bHRpcGxlIGltYWdlIGFjdGl2YXRpb24KLSQgIGdjYyAvSW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pIC9EZWZpbmU9KCInJ3AxJyIpIHRtcC1jaGstaC5jCi0kIWNhbid0IGp1c3QgY2hlY2sgJHN0YXR1czsgZ2NjIDIuNi5bMC0zXSBwcmVwcm9jZXNzb3IgZG9lc24ndCBzZXQgaXQgY29ycmVjdGx5Ci0kICBvayA9ICgoJHN0YXR1cy5hbmQuMSkuYW5kLihmJHNlYXJjaCgidG1wLWNoay1oLm9iaiIpLm5lcy4iIikpIC5vci4gJXgxMDAwMDAwMAotJCAgZGVhc3NpZ24gc3lzJGVycm9yCSFyZXN0b3JlLCBtb3JlIG9yIGxlc3MKLSQgIGRlYXNzaWduIHN5cyRvdXRwdXQKLSQgIGlmIG9rIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKLSQgIGV4aXQgb2sKLSQgZW5kc3Vicm91dGluZSAhdG1wX2Noa19oCi0kCi0kIQotJCEgRG9uZQotJCEKLSQgaWYgZiRzZWFyY2goImNvbmZpZy5zdGF0dXMiKSAubmVzLiAiIiB0aGVuIERFTEVURSBjb25maWcuc3RhdHVzOyoKLSQgb3Blbi93cml0ZSBjZmlsZSBbXWNvbmZpZy5zdGF0dXMKLSQgd3JpdGUgY2ZpbGUgIkxpbmtzIGFyZSBub3cgc2V0IHVwIGZvciB1c2Ugd2l0aCBhICIrYXJjaCsiIHJ1bm5pbmcgVk1TLiIKLSQgY2xvc2UgY2ZpbGUKLSQgdHlwZSBbXWNvbmZpZy5zdGF0dXMKLSRleGl0Ci0kIQotJCEKLSRtYWtlOiBzdWJyb3V0aW5lCi0kICBpZiBmJHNlYXJjaChwMSkubmVzLiIiIHRoZW4gREVMRVRFICdwMSc7KgotJCAgY3JlYXRlICdwMScKLSQgIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kICBvcGVuL0FwcGVuZCBpZmlsZSQgJ3AxJwotJCAgd3JpdGUgaWZpbGUkICIjaW5jbHVkZSAiIicnZiRzdHJpbmcocDIgLSAiWy5jb25maWddIiknIiIiCi0kICBjbG9zZSBpZmlsZSQKLSQgIEVDSE8gIkNyZWF0ZWQgJydwMScgZm9yICcncDInLiIKLSRlbmRzdWJyb3V0aW5lICFtYWtlCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnLmluIGIvZ2FzL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmMmFkYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SRU1PVkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NCUksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VOTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9FUlJOT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiBkZWZhdWx0aW5nIHRvIEVMRiBvbiBTQ08gNS4gKi8KLSN1bmRlZiBTQ09fRUxGCi0KLS8qIFVzZSBFTEYgc3RhYnMgZm9yIE1JUFMsIG5vdCBFQ09GRiBzdGFicyAqLwotI3VuZGVmIE1JUFNfU1RBQlNfRUxGCi0KLS8qIERlZmluZSBpZiBkZWZhdWx0IHRhcmdldCBpcyBQb3dlclBDIFNvbGFyaXMuICovCi0jdW5kZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotCi0vKiBEZWZpbmUgYXMgMSBpZiBiaWcgZW5kaWFuLiAqLwotI3VuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0KLS8qIERlZmF1bHQgYXJjaGl0ZWN0dXJlLiAqLwotI3VuZGVmIERFRkFVTFRfQVJDSAotCi0vKiBVc2luZyBjZ2VuIGNvZGU/ICovCi0jdW5kZWYgVVNJTkdfQ0dFTgotCi0vKiBVc2luZyBpMzg2IENPRkY/ICovCi0jdW5kZWYgSTM4NkNPRkYKLQotLyogVXNpbmcgbTY4ayBDT0ZGPyAqLwotI3VuZGVmIE02OEtDT0ZGCi0KLS8qIFVzaW5nIG04OGsgQ09GRj8gKi8KLSN1bmRlZiBNODhLQ09GRgotCi0vKiBhLm91dCBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9BT1VUCi0KLS8qIGIub3V0IHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0JPVVQKLQotLyogQ09GRiBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9DT0ZGCi0KLS8qIEVDT0ZGIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0VDT0ZGCi0KLS8qIEVMRiBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9FTEYKLQotLyogZ2VuZXJpYyBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9HRU5FUklDCi0KLS8qIEhQMzAwIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0hQMzAwCi0KLS8qIElFRUUgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfSUVFRQotCi0vKiBTT00gc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfU09NCi0KLS8qIFZNUyBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9WTVMKLQotLyogVXNlIGVtdWxhdGlvbiBzdXBwb3J0PyAqLwotI3VuZGVmIFVTRV9FTVVMQVRJT05TCi0KLS8qIFN1cHBvcnRlZCBlbXVsYXRpb25zLiAqLwotI3VuZGVmIEVNVUxBVElPTlMKLQotLyogRGVmYXVsdCBlbXVsYXRpb24uICovCi0jdW5kZWYgREVGQVVMVF9FTVVMQVRJT04KLQotLyogb2xkIENPRkYgc3VwcG9ydD8gKi8KLSN1bmRlZiBNQU5ZX1NFR01FTlRTCi0KLS8qIFVzZSBCRkQgaW50ZXJmYWNlPyAqLwotI3VuZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogVGFyZ2V0IGFsaWFzLiAqLwotI3VuZGVmIFRBUkdFVF9BTElBUwotCi0vKiBDYW5vbmljYWwgdGFyZ2V0LiAqLwotI3VuZGVmIFRBUkdFVF9DQU5PTklDQUwKLQotLyogVGFyZ2V0IENQVS4gKi8KLSN1bmRlZiBUQVJHRVRfQ1BVCi0KLS8qIFRhcmdldCB2ZW5kb3IuICovCi0jdW5kZWYgVEFSR0VUX1ZFTkRPUgotCi0vKiBUYXJnZXQgT1MuICovCi0jdW5kZWYgVEFSR0VUX09TCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBDb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVyPyAqLwotI3VuZGVmIENST1NTX0NPTVBJTEUKLQotLyogYXNzZXJ0IGJyb2tlbj8gKi8KLSN1bmRlZiBCUk9LRU5fQVNTRVJUCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIG1hbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBEZWZpbmUgaWYgZnJlZSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogRGVmaW5lIGlmIHNicmsgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0KLS8qIERlZmluZSBpZiBlbnZpcm9uIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotCi0vKiBEZWZpbmUgaWYgZXJybm8gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2FvdXRfZ251LmggYi9nYXMvY29uZmlnL2FvdXRfZ251LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGY5Y2IuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hb3V0X2dudS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBhb3V0X2dudS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX19BX09VVF9HTlVfSF9fCi0jZGVmaW5lIF9fQV9PVVRfR05VX0hfXwotCi0vKiBUaGVyZSBhcmUgdHdvIG1haW4gZmxhdm91cnMgb2YgYS5vdXQsIG9uZSB3aGljaCB1c2VzIHRoZSBzdGFuZGFyZAotICAgcmVsb2NhdGlvbnMsIGFuZCBvbmUgd2hpY2ggdXNlcyBleHRlbmRlZCByZWxvY2F0aW9ucy4KLQotICAgVG9kYXksIHRoZSBleHRlbmRlZCByZWxvYyB1c2VzIGFyZQotICAgVENfU1BBUkMsIFRDX0EyOUsKLQotICAgZWFjaCBtdXN0IGRlZmluZSB0aGUgZW51bSByZWxvY190eXBlCi0KLSovCi0KLSNkZWZpbmUgVVNFX0VYVEVOREVEX1JFTE9DIChkZWZpbmVkKFRDX1NQQVJDKSB8fCBkZWZpbmVkKFRDX0EyOUspKQotCi0jaWYgZGVmaW5lZChUQ19TUEFSQykgfHwgZGVmaW5lZChUQ19BMjlLKQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSRUxPQ184LCBSRUxPQ18xNiwgUkVMT0NfMzIsLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gICAgUkVMT0NfRElTUDgsIFJFTE9DX0RJU1AxNiwgUkVMT0NfRElTUDMyLAkvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gICAgUkVMT0NfV0RJU1AzMCwgUkVMT0NfV0RJU1AyMiwKLSAgICBSRUxPQ19ISTIyLCBSRUxPQ18yMiwKLSAgICBSRUxPQ18xMywgUkVMT0NfTE8xMCwKLSAgICBSRUxPQ19TRkFfQkFTRSwgUkVMT0NfU0ZBX09GRjEzLAotICAgIFJFTE9DX0JBU0UxMCwgUkVMT0NfQkFTRTEzLCBSRUxPQ19CQVNFMjIsCS8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KLSAgICBSRUxPQ19QQzEwLCBSRUxPQ19QQzIyLAkvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gICAgUkVMT0NfSk1QX1RCTCwJCS8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gICAgUkVMT0NfU0VHT0ZGMTYsCQkvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICAgIFJFTE9DX0dMT0JfREFULCBSRUxPQ19KTVBfU0xPVCwgUkVMT0NfUkVMQVRJVkUsCi0gICAgUkVMT0NfMTAsIFJFTE9DXzExLAotICAgIFJFTE9DX1dESVNQMl8xNCwKLSAgICBSRUxPQ19XRElTUDE5LAotICAgIFJFTE9DX0hISTIyLAotICAgIFJFTE9DX0hMTzEwLAotCi0gICAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgICBSRUxPQ19KVU1QVEFSRywgUkVMT0NfQ09OU1QsIFJFTE9DX0NPTlNUSCwKLQotICAgIFJFTE9DX1dESVNQMTQsIFJFTE9DX1dESVNQMjEsCi0KLSAgICBOT19SRUxPQwotICB9OwotCi0jZW5kaWYgLyogVENfU1BBUkMgb3IgVENfQTI5SyAqLwotCi0KLSNkZWZpbmUgX19HTlVfRVhFQ19NQUNST1NfXwotCi0jaWZuZGVmIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiBhIFVuaXggVjcsIEJlcmtlbGV5LCBTdW5PUywgVmF4IFVsdHJpeAotICAgInN0cnVjdCBleGVjIi4gIERvbid0IGFzc3VtZSB0aGF0IG9uIHRoaXMgbWFjaGluZSwgdGhlICJzdHJ1Y3QgZXhlYyIKLSAgIHdpbGwgbGF5IG91dCB0aGUgc2FtZSBzaXplcyBvciBhbGlnbm1lbnRzLiAgKi8KLQotc3RydWN0IGV4ZWNfYnl0ZXMKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgYV9pbmZvWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV90ZXh0WzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9kYXRhWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9ic3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX3N5bXNbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2VudHJ5WzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV90cnNpemVbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2Ryc2l6ZVs0XTsKLSAgfTsKLQotLyogSG93IGJpZyB0aGUgInN0cnVjdCBleGVjIiBpcyBvbiBkaXNrICovCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoOCAqIDQpCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBpbiBtZW1vcnkgb2YgYSAic3RydWN0IGV4ZWMiIHdoaWxlIHdlIHByb2Nlc3MgaXQuICAqLwotCi1zdHJ1Y3QgZXhlYwotewotICB1bnNpZ25lZCBsb25nIGFfaW5mbzsJCS8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MgKi8KLSAgdW5zaWduZWQgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZW50cnk7CQkvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9kcnNpemU7CQkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotfTsKLQotI2VuZGlmIC8qIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXyAqLwotCi0vKiB0aGVzZSBnbyBpbiB0aGUgTl9NQUNIVFlQRSBmaWVsZCAqLwotLyogVGhlc2Ugc3ltYm9scyBjb3VsZCBiZSBkZWZpbmVkIGJ5IGNvZGUgZnJvbSBTdW5zLi4ucHVudCAnZW0gKi8KLSN1bmRlZiBNX1VOS05PV04KLSN1bmRlZiBNXzY4MDEwCi0jdW5kZWYgTV82ODAyMAotI3VuZGVmIE1fU1BBUkMKLWVudW0gbWFjaGluZV90eXBlCi0gIHsKLSAgICBNX1VOS05PV04gPSAwLAotICAgIE1fNjgwMTAgPSAxLAotICAgIE1fNjgwMjAgPSAyLAotICAgIE1fU1BBUkMgPSAzLAotICAgIC8qIHNraXAgYSBidW5jaCBzbyB3ZSBkb24ndCBydW4gaW50byBhbnkgb2Ygc3VuJ3MgbnVtYmVycyAqLwotICAgIE1fMzg2ID0gMTAwLAotICAgIE1fMjlLID0gMTAxLAotICAgIE1fUlM2MDAwID0gMTAyLAkJLyogSUJNIFJTLzYwMDAgKi8KLSAgICAvKiBIUC9CU0QgZm9ybWF0cyAqLwotICAgIE1fSFAyMDAgPSAyMDAsCQkvKiBocDIwMCAoNjgwMTApIEJTRCBiaW5hcnkgKi8KLSAgICBNX0hQMzAwID0gMzAwLAkJLyogaHAzMDAgKDY4MDIwKzY4ODgxKSBCU0QgYmluYXJ5ICovCi0gICAgTV9IUFVYMjMgPSAweDAyMEMJCS8qIGhwMjAwLzMwMCBIUFVYIGJpbmFyeSAqLwotICB9OwotCi0jZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgKChlbnVtIG1hY2hpbmVfdHlwZSkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHhmZikpCi0jZGVmaW5lIE5fRkxBR1MoZXhlYykgKCgoZXhlYykuYV9pbmZvID4+IDI0KSAmIDB4ZmYpCi0jZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotICAgICB8ICgoKGludCkodHlwZSkgJiAweGZmKSA8PCAxNikgXAotICAgICB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpIFwKLSAgICAoKGV4ZWMpLmFfaW5mbyA9ICgoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZjAwMDApIHwgKChtYWdpYykgJiAweGZmZmYpKSkKLQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAotICAgICgoZXhlYykuYV9pbmZvID0gXAotICAgICAoKGV4ZWMpLmFfaW5mbyYweGZmMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHhmZikgPDwgMTYpKQotCi0jZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSBcCi0gICAgICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotCi0vKiBDb2RlIGluZGljYXRpbmcgb2JqZWN0IGZpbGUgb3IgaW1wdXJlIGV4ZWN1dGFibGUuICAqLwotI2lmbmRlZiBPTUFHSUMKLSNkZWZpbmUgT01BR0lDIDA0MDcKLSNlbmRpZgotLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAwNDEwCi0vKiBDb2RlIGluZGljYXRpbmcgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBaTUFHSUMgMDQxMwotCi0vKiBWaXJ0dWFsIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGZyb20gdGhlIGEub3V0IGZpbGUuICBGb3IgT01BR0lDLAotICAgKGFsbW9zdCBhbHdheXMgInVubGlua2VkIC5vJ3MiIHRoZXNlIGRheXMpLCBzaG91bGQgYmUgemVyby4KLSAgIEZvciBsaW5rZWQgZmlsZXMsIHNob3VsZCByZWZsZWN0IHJlYWxpdHkgaWYgd2Uga25vdyBpdC4gICovCi0KLSNpZm5kZWYgTl9UWFRBRERSCi0jZGVmaW5lIE5fVFhUQUREUih4KQkoTl9NQUdJQyh4KT09T01BR0lDPyAwIDogVEVYVF9TVEFSVF9BRERSKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9CQURNQUcKLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSAgICYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0JCQkgICAmJiBOX01BR0lDKHgpICE9IFpNQUdJQykKLSNlbmRpZgotCi0vKiBCeSBkZWZhdWx0LCBzZWdtZW50IHNpemUgaXMgY29uc3RhbnQuICBCdXQgb24gc29tZSBtYWNoaW5lcywgaXQgY2FuCi0gICBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBhLm91dCBoZWFkZXIgKGUuZy4gbWFjaGluZSB0eXBlKS4gICovCi0jaWZuZGVmCU5fU0VHU0laRQotI2RlZmluZQlOX1NFR1NJWkUoeCkJU0VHTUVOVF9TSVpFCi0jZW5kaWYKLQotLyogVGhpcyBjb21wbGV4aXR5IGlzIGZvciBlbmNhcHN1bGF0ZWQgQ09GRiBzdXBwb3J0ICovCi0jaWZuZGVmIF9OX0hEUk9GRgotI2RlZmluZSBfTl9IRFJPRkYoeCkJKE5fU0VHU0laRSh4KSAtIHNpemVvZiAoc3RydWN0IGV4ZWMpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9UWFRPRkYKLSNkZWZpbmUgTl9UWFRPRkYoeCkJKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8JXAotCQkJIF9OX0hEUk9GRigoeCkpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYykgOglcCi0JCQkgc2l6ZW9mIChzdHJ1Y3QgZXhlYykpCi0jZW5kaWYKLQotCi0jaWZuZGVmIE5fREFUT0ZGCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0ICkKLSNlbmRpZgotCi0jaWZuZGVmIE5fVFJFTE9GRgotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9EUkVMT0ZGCi0jZGVmaW5lIE5fRFJFTE9GRih4KQkoIE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NZTU9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NUUk9GRgotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZW5kaWYKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jaWZuZGVmIE5fVFhUQUREUgotI2RlZmluZQlOX1RYVEFERFIoeCkJMAotI2VuZGlmCi0KLSNpZm5kZWYgTl9EQVRBRERSCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0KSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0LTEpICYgfihOX1NFR1NJWkUoeCktMSkpKSkKLSNlbmRpZgotCi0vKiBBZGRyZXNzIG9mIGJzcyBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotI2RlZmluZSBOX0JTU0FERFIoeCkgKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCi0MCi1zdHJ1Y3Qgbmxpc3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqbl9uYW1lOwotCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCWxvbmcgbl9zdHJ4OwotICAgICAgfQotICAgIG5fdW47Ci0gICAgdW5zaWduZWQgY2hhciBuX3R5cGU7Ci0gICAgY2hhciBuX290aGVyOwotICAgIHNob3J0IG5fZGVzYzsKLSAgICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci0gIH07Ci0KLSNkZWZpbmUgTl9VTkRGIDAKLSNkZWZpbmUgTl9BQlMgMgotI2RlZmluZSBOX1RFWFQgNAotI2RlZmluZSBOX0RBVEEgNgotI2RlZmluZSBOX0JTUyA4Ci0jZGVmaW5lCU5fQ09NTQkweDEyCQkvKiBjb21tb24gKHZpc2libGUgaW4gc2hhcmVkIGxpYiBjb21tb25zKSAqLwotI2RlZmluZSBOX0ZOIDB4MUYJCS8qIEZpbGUgbmFtZSBvZiBhIC5vIGZpbGUgKi8KLQotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgdXNlZnVsbHkgYmUgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgMQotI2RlZmluZSBOX1RZUEUgMDM2Ci0jZGVmaW5lIE5fU1RBQiAwMzQwCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHlwZSBpbmRpY2F0ZXMgdGhlIGRlZmluaXRpb24gb2YgYSBzeW1ib2wgYXMgYmVpbmcKLSAgIGFuIGluZGlyZWN0IHJlZmVyZW5jZSB0byBhbm90aGVyIHN5bWJvbC4gIFRoZSBvdGhlciBzeW1ib2wKLSAgIGFwcGVhcnMgYXMgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSwgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgc3ltYm9sLgotCi0gICBJbmRpcmVjdGlvbiBpcyBhc3ltbWV0cmljYWwuICBUaGUgb3RoZXIgc3ltYm9sJ3MgdmFsdWUgd2lsbCBiZSB1c2VkCi0gICB0byBzYXRpc2Z5IHJlcXVlc3RzIGZvciB0aGUgaW5kaXJlY3Qgc3ltYm9sLCBidXQgbm90IHZpY2UgdmVyc2EuCi0gICBJZiB0aGUgb3RoZXIgc3ltYm9sIGRvZXMgbm90IGhhdmUgYSBkZWZpbml0aW9uLCBsaWJyYXJpZXMgd2lsbAotICAgYmUgc2VhcmNoZWQgdG8gZmluZCBhIGRlZmluaXRpb24uICAqLwotCi0jZGVmaW5lIE5fSU5EUiAweGEKLQotLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KLSAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgotICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAotICAgZWxlbWVudCdzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KLSAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCi0KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKLSAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KLSAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCi0gICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLQotLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLwotI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLQotLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCi0jZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KLQotLyogV2FybmluZyBzeW1ib2wuIFRoZSB0ZXh0IGdpdmVzIGEgd2FybmluZyBtZXNzYWdlLCB0aGUgbmV4dCBzeW1ib2wKLSAgIGluIHRoZSB0YWJsZSB3aWxsIGJlIHVuZGVmaW5lZC4gV2hlbiB0aGUgc3ltYm9sIGlzIHJlZmVyZW5jZWQsIHRoZQotICAgbWVzc2FnZSBpcyBwcmludGVkLiAgKi8KLQotI2RlZmluZQlOX1dBUk5JTkcgMHgxZQotCi0vKiBXZWFrIHN5bWJvbHMuICBUaGVzZSBhcmUgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBhLm91dCBmb3JtYXQuICBUaGUKLSAgIHNlbWFudGljcyBhcmUgdGhvc2Ugb2YgRUxGIHdlYWsgc3ltYm9scy4gIFdlYWsgc3ltYm9scyBhcmUgYWx3YXlzCi0gICBleHRlcm5hbGx5IHZpc2libGUuICBUaGUgTl9XRUFLPyB2YWx1ZXMgYXJlIHNxdWVlemVkIGludG8gdGhlCi0gICBhdmFpbGFibGUgc2xvdHMuICBUaGUgdmFsdWUgb2YgYSBOX1dFQUtVIHN5bWJvbCBpcyAwLiAgVGhlIHZhbHVlcwotICAgb2YgdGhlIG90aGVyIHR5cGVzIGFyZSB0aGUgZGVmaW5pdGlvbnMuICAqLwotI2RlZmluZSBOX1dFQUtVCTB4MGQJCS8qIFdlYWsgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0EgMHgwZQkJLyogV2VhayBhYnNvbHV0ZSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtUIDB4MGYJCS8qIFdlYWsgdGV4dCBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtEIDB4MTAJCS8qIFdlYWsgZGF0YSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtCIDB4MTEJCS8qIFdlYWsgYnNzIHN5bWJvbC4gICovCi0MCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGVudW0gYW5kIHN0cnVjdCB3ZXJlIGJvcnJvd2VkIGZyb20gU3VuT1MncwotICAgL3Vzci9pbmNsdWRlL3N1bjQvYS5vdXQuaCAgYW5kIGV4dGVuZGVkIHRvIGhhbmRsZQotICAgb3RoZXIgbWFjaGluZXMuICBJdCBpcyBjdXJyZW50bHkgdXNlZCBvbiBTUEFSQyBhbmQgQU1EIDI5MDAwLgotCi0gICByZWxvY19leHRfYnl0ZXMgaXMgaG93IGl0IGxvb2tzIG9uIGRpc2suICByZWxvY19pbmZvX2V4dGVuZGVkIGlzCi0gICBob3cgd2UgbWlnaHQgcHJvY2VzcyBpdCBvbiBhIG5hdGl2ZSBob3N0LiAgKi8KLSNpZiBVU0VfRVhURU5ERURfUkVMT0MKLQotc3RydWN0IHJlbG9jX2V4dF9ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciByX2luZGV4WzNdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzFdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9hZGRlbmRbNF07Ci0gIH07Ci0KLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCTB4ODAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcJCTB4MUYKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcJMAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRQkweEY4Ci0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFCTMKLQotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkxMgkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgcmVsb2NfaW5mb19leHRlbmRlZAotewotICB1bnNpZ25lZCBsb25nIHJfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg6MjQ7Ci0jIGRlZmluZQlyX3N5bWJvbG51bSAgcl9pbmRleAotICB1bnNpZ25lZCByX2V4dGVybjoxOwotICB1bnNpZ25lZDoyOwotICAvKiAgUlMvNjAwMCBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGVudW0gYml0ZmllbGQKLQkgICAgZW51bSByZWxvY190eXBlIHJfdHlwZTo1OyAqLwotICBlbnVtIHJlbG9jX3R5cGUgcl90eXBlOwotICBsb25nIGludCByX2FkZGVuZDsKLX07Ci0KLSNlbHNlCi0KLS8qIFRoZSBzdGFuZGFyZCwgb2xkLWZhc2hpb25lZCwgQmVya2VsZXkgY29tcGF0aWJsZSByZWxvY2F0aW9uIHN0cnVjdCAqLwotCi0KLQotI2lmZGVmIFRDX0k4NjAKLS8qIE5PVEU6IHRocmVlIGJpdHMgbWF4LCBzZWUgc3RydWN0IHJlbG9jX2luZm9faTg2MC5yX3R5cGUgKi8KLWVudW0gaTg2MF9yZWxvY190eXBlCi0gIHsKLSAgICBOT19SRUxPQyA9IDAsIEJSQUREUiwgTE9XMCwgTE9XMSwgTE9XMiwgTE9XMywgTE9XNCwgU1BMSVQwLCBTUExJVDEsIFNQTElUMiwgUkVMT0NfMzIsCi0gIH07Ci0KLXR5cGVkZWYgZW51bSBpODYwX3JlbG9jX3R5cGUgcmVsb2NfdHlwZTsKLQotLyogTk9URTogdHdvIGJpdHMgbWF4LCBzZWUgcmVsb2NfaW5mb19pODYwLnJfdHlwZSAqLwotZW51bSBoaWdobG93X3R5cGUKLSAgewotICAgIE5PX1NQRUMgPSAwLCBQQUlSLCBISUdILCBISUdIQURKLAotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbmZvX2k4NjAKLXsKLSAgdW5zaWduZWQgbG9uZyByX2FkZHJlc3M7Ci0gIC8qCi0JICogVXNpbmcgYml0IGZpZWxkcyBoZXJlIGlzIGEgYmFkIGlkZWEgYmVjYXVzZSB0aGUgb3JkZXIgaXMgbm90IHBvcnRhYmxlLiA6LSgKLQkgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogY29tYmluaW5nIHRoZSB0d28gZmllbGQgc2ltcGxpZmllcyB0aGUgYXJndW1lbnQgcGFzc2luZyBpbiAibmV3X2ZpeCgpIiAqLwotICAvKiBhbmQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBleGlzdGluZyBTcGFyYyAjaWZkZWYncyAqLwotICAvKiByX3R5cGU6ICBoaWdobG93X3R5cGUgLSBiaXRzIDUsNDsgcmVsb2NfdHlwZSAtIGJpdHMgMy0wICovCi0gIHVuc2lnbmVkIGludCByX3R5cGU6NjsKLSAgbG9uZyByX2FkZGVuZDsKLX07Ci0KLSNlbmRpZiAvKiBUQ19JODYwICovCi0KLQotc3RydWN0IHJlbG9jX3N0ZF9ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciByX2luZGV4WzNdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzFdOwotICB9OwotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkweDYwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcJNQkvKiBUbyBzaGlmdCB0byB1bml0cyBwbGFjZSAqLwotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFCTB4MDYKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkweDEwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCTB4MDgKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkweDA0Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRQkweDA0Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCTB4MDIKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCTB4MDIKLQotI2RlZmluZQlSRUxPQ19TVERfU0laRQk4CS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLSNlbmRpZiAvKiBVU0VfRVhURU5ERURfUkVMT0MgKi8KLQotI2lmbmRlZiBDVVNUT01fUkVMT0NfRk9STUFUCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCi17Ci0gIC8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLwotICBpbnQgcl9hZGRyZXNzOwotICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0Ci0JICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCi0JICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotCSAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCi0gIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOwotICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgotCSAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCi0JICAgaW4gZmlsZSdzIHRoZSBzeW1ib2wgdGFibGUuCi0JICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLQkgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKLQkgICAodGhlIE5fRVhUIGJpdCBtYXkgYmUgc2V0IGFsc28sIGJ1dCBzaWduaWZpZXMgbm90aGluZykuICAqLwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogVGhlIG5leHQgdGhyZWUgYml0cyBhcmUgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBzZWVtIHRvCi0JICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSNpZmRlZiBUQ19OUzMySwotICB1bnNpZ25lZCBpbnQgcl9ic3I6MTsKLSAgdW5zaWduZWQgaW50IHJfZGlzcDoyOwotI2Vsc2UKLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0jZW5kaWYgLyogVENfTlMzMksgKi8KLSAgLyogdW51c2VkICovCi0gIHVuc2lnbmVkIGludCByX3BhZDoxOwkJLyogUGFkZGluZyAtLSBzZXQgdG8gemVybyAqLwotfTsKLQotI2VuZGlmIC8qIENVU1RPTV9SRUxPQ19GT1JNQVQgKi8KLQotI2VuZGlmIC8qIF9fQV9PVVRfR05VX0hfXyAqLwotCi0vKiBlbmQgb2YgYW91dF9nbnUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLWllZWUuYyBiL2dhcy9jb25maWcvYXRvZi1pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZGExYmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hdG9mLWllZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDcxNSArMCwwIEBACi0vKiBhdG9mX2llZWUuYyAtIHR1cm4gYSBGbG9udW0gaW50byBhbiBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0vKiBGbG9udW1zIHJldHVybmVkIGhlcmUuICAqLwotZXh0ZXJuIEZMT05VTV9UWVBFIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotCi1zdGF0aWMgaW50IG5leHRfYml0cyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHVuZ2V0X2JpdHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyIFBBUkFNUyAoKExJVFRMRU5VTV9UWVBFICopKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgRVhQX0NIQVJTW107Ci0vKiBQcmVjaXNpb24gaW4gTGl0dGxlTnVtcy4gKi8KLS8qIERvbid0IGNvdW50IHRoZSBnYXAgaW4gdGhlIG02OGsgZXh0ZW5kZWQgcHJlY2lzaW9uIGZvcm1hdC4gICovCi0jZGVmaW5lIE1BWF9QUkVDSVNJT04gKDUpCi0jZGVmaW5lIEZfUFJFQ0lTSU9OICgyKQotI2RlZmluZSBEX1BSRUNJU0lPTiAoNCkKLSNkZWZpbmUgWF9QUkVDSVNJT04gKDUpCi0jZGVmaW5lIFBfUFJFQ0lTSU9OICg1KQotCi0vKiBMZW5ndGggaW4gTGl0dGxlTnVtcyBvZiBndWFyZCBiaXRzLiAqLwotI2RlZmluZSBHVUFSRCAoMikKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWFza1tdID0KLXsKLSAgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAwMSwKLSAgMHgwMDAwMDAwMywKLSAgMHgwMDAwMDAwNywKLSAgMHgwMDAwMDAwZiwKLSAgMHgwMDAwMDAxZiwKLSAgMHgwMDAwMDAzZiwKLSAgMHgwMDAwMDA3ZiwKLSAgMHgwMDAwMDBmZiwKLSAgMHgwMDAwMDFmZiwKLSAgMHgwMDAwMDNmZiwKLSAgMHgwMDAwMDdmZiwKLSAgMHgwMDAwMGZmZiwKLSAgMHgwMDAwMWZmZiwKLSAgMHgwMDAwM2ZmZiwKLSAgMHgwMDAwN2ZmZiwKLSAgMHgwMDAwZmZmZiwKLSAgMHgwMDAxZmZmZiwKLSAgMHgwMDAzZmZmZiwKLSAgMHgwMDA3ZmZmZiwKLSAgMHgwMDBmZmZmZiwKLSAgMHgwMDFmZmZmZiwKLSAgMHgwMDNmZmZmZiwKLSAgMHgwMDdmZmZmZiwKLSAgMHgwMGZmZmZmZiwKLSAgMHgwMWZmZmZmZiwKLSAgMHgwM2ZmZmZmZiwKLSAgMHgwN2ZmZmZmZiwKLSAgMHgwZmZmZmZmZiwKLSAgMHgxZmZmZmZmZiwKLSAgMHgzZmZmZmZmZiwKLSAgMHg3ZmZmZmZmZiwKLSAgMHhmZmZmZmZmZiwKLX07Ci0MCi0KLXN0YXRpYyBpbnQgYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLXN0YXRpYyBpbnQgbGl0dGxlbnVtc19sZWZ0Owotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLQotc3RhdGljIGludAotbmV4dF9iaXRzIChudW1iZXJfb2ZfYml0cykKLSAgICAgaW50IG51bWJlcl9vZl9iaXRzOwotewotICBpbnQgcmV0dXJuX3ZhbHVlOwotCi0gIGlmICghbGl0dGxlbnVtc19sZWZ0KQotICAgIHJldHVybiAoMCk7Ci0gIGlmIChudW1iZXJfb2ZfYml0cyA+PSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKQotICAgIHsKLSAgICAgIHJldHVybl92YWx1ZSA9IG1hc2tbYml0c19sZWZ0X2luX2xpdHRsZW51bV0gJiAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0gICAgICBudW1iZXJfb2ZfYml0cyAtPSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOwotICAgICAgcmV0dXJuX3ZhbHVlIDw8PSBudW1iZXJfb2ZfYml0czsKLQotICAgICAgaWYgKC0tbGl0dGxlbnVtc19sZWZ0KQotCXsKLQkgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBudW1iZXJfb2ZfYml0czsKLQkgIC0tbGl0dGxlbnVtX3BvaW50ZXI7Ci0JICByZXR1cm5fdmFsdWUgfD0gKCpsaXR0bGVudW1fcG9pbnRlciA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKSAmIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtIC09IG51bWJlcl9vZl9iaXRzOwotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tudW1iZXJfb2ZfYml0c10gJiAoKmxpdHRsZW51bV9wb2ludGVyID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pOwotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotCi0vKiBOdW0gaGFkIGJldHRlciBiZSBsZXNzIHRoYW4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTICovCi1zdGF0aWMgdm9pZAotdW5nZXRfYml0cyAobnVtKQotICAgICBpbnQgbnVtOwotewotICBpZiAoIWxpdHRsZW51bXNfbGVmdCkKLSAgICB7Ci0gICAgICArK2xpdHRsZW51bV9wb2ludGVyOwotICAgICAgKytsaXR0bGVudW1zX2xlZnQ7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gbnVtOwotICAgIH0KLSAgZWxzZSBpZiAoYml0c19sZWZ0X2luX2xpdHRsZW51bSArIG51bSA+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLSAgICB7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gbnVtIC0gKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIGJpdHNfbGVmdF9pbl9saXR0bGVudW0pOwotICAgICAgKytsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgICsrbGl0dGxlbnVtc19sZWZ0OwotICAgIH0KLSAgZWxzZQotICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gKz0gbnVtOwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsKLXsKLSAgYXNfYmFkIChfKCJjYW5ub3QgY3JlYXRlIGZsb2F0aW5nLXBvaW50IG51bWJlciIpKTsKLSAgd29yZHNbMF0gPSAoTElUVExFTlVNX1RZUEUpICgodW5zaWduZWQpIC0xKSA+PiAxOyAvKiBaZXJvIHRoZSBsZWZ0bW9zdCBiaXQgKi8KLSAgd29yZHNbMV0gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotICB3b3Jkc1syXSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci0gIHdvcmRzWzNdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLSAgd29yZHNbNF0gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotICB3b3Jkc1s1XSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci19Ci0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyCSoKLSAqCXRvIGZpZ3VyZSBvdXQgYW55IGFsaWdubWVudCBwcm9ibGVtcyBhbmQgdG8gY29uc3BpcmUgZm9yIHRoZQkqCi0gKglieXRlcy93b3JkIHRvIGJlIGVtaXR0ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyLiBCaWdlbmRpYW5zIGJld2FyZSEJKgotICoJCQkJCQkJCQkqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBOb3RlIHRoYXQgYXRvZi1pZWVlIGFsd2F5cyBoYXMgWCBhbmQgUCBwcmVjaXNpb25zIGVuYWJsZWQuICBpdCBpcyB1cAotICAgdG8gbWRfYXRvZiB0byBmaWx0ZXIgdGhlbSBvdXQgaWYgdGhlIHRhcmdldCBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQKLSAgIHRoZW0uICAqLwotCi0vKiBSZXR1cm5zIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotY2hhciAqCi1hdG9mX2llZWUgKHN0ciwgd2hhdF9raW5kLCB3b3JkcykKLSAgICAgY2hhciAqc3RyOwkJCS8qIFRleHQgdG8gY29udmVydCB0byBiaW5hcnkuICovCi0gICAgIGludCB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gIFRoZSAxc3QgTUFYX1BSRUNJU0lPTiBhcmUKLSAgICAgemVyb2VkLCB0aGUgbGFzdCBjb250YWluIGZsb251bSBiaXRzLiAqLwotICBzdGF0aWMgTElUVExFTlVNX1RZUEUgYml0c1tNQVhfUFJFQ0lTSU9OICsgTUFYX1BSRUNJU0lPTiArIEdVQVJEXTsKLSAgY2hhciAqcmV0dXJuX3ZhbHVlOwotICAvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmb3JtYXQuICovCi0gIGludCBwcmVjaXNpb247Ci0gIGxvbmcgZXhwb25lbnRfYml0czsKLSAgRkxPTlVNX1RZUEUgc2F2ZV9nZW5fZmxvbnVtOwotCi0gIC8qIFdlIGhhdmUgdG8gc2F2ZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgYmVjYXVzZSBpdAotICAgICBjb250YWlucyBzdG9yYWdlIGFsbG9jYXRpb24gYWJvdXQgdGhlIGFycmF5IG9mIExJVFRMRU5VTXMgd2hlcmUKLSAgICAgdGhlIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gIFdlIHdpbGwgYWxsb2NhdGUgb3VyIG93biBhcnJheSBvZgotICAgICBsaXR0bGVudW1zIGJlbG93LCBidXQgaGF2ZSB0byByZXN0b3JlIHRoZSBnbG9iYWwgb25lIG9uIGV4aXQuICAqLwotICBzYXZlX2dlbl9mbG9udW0gPSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLQotICByZXR1cm5fdmFsdWUgPSBzdHI7Ci0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyA9IGJpdHMgKyBNQVhfUFJFQ0lTSU9OOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5oaWdoID0gTlVMTDsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyID0gTlVMTDsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuZXhwb25lbnQgPSAwOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID0gJ1wwJzsKLQotICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgbmVjZXNzYXJ5OiB0aGUgaGlnaGVzdCBmbG9udW0gbWF5Ci0gICAgIGhhdmUgMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCi0KLSAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOwotCi0gIHN3aXRjaCAod2hhdF9raW5kKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWNpc2lvbiA9IEZfUFJFQ0lTSU9OOwotICAgICAgZXhwb25lbnRfYml0cyA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlY2lzaW9uID0gRF9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgIGNhc2UgJ2UnOgotICAgIGNhc2UgJ0UnOgotICAgICAgcHJlY2lzaW9uID0gWF9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gMTU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotCi0gICAgICBwcmVjaXNpb24gPSBQX1BSRUNJU0lPTjsKLSAgICAgIGV4cG9uZW50X2JpdHMgPSAtMTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgfQotCi0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmhpZ2gKLSAgICA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKLQotICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsIEVYUF9DSEFSUywKLQkJICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcikpCi0gICAgewotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICB9Ci0gIGdlbl90b193b3JkcyAod29yZHMsIHByZWNpc2lvbiwgZXhwb25lbnRfYml0cyk7Ci0KLSAgLyogUmVzdG9yZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIncyBzdG9yYWdlIGFsbG9jIChhbmQKLSAgICAgZXZlcnl0aGluZyBlbHNlKS4gICovCi0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gc2F2ZV9nZW5fZmxvbnVtOwotCi0gIHJldHVybiByZXR1cm5fdmFsdWU7Ci19Ci0KLS8qIFR1cm4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgaW50byBhIHJlYWwgZmxvYXQvZG91YmxlL2V4dGVuZGVkLiAgKi8KLWludAotZ2VuX3RvX3dvcmRzICh3b3JkcywgcHJlY2lzaW9uLCBleHBvbmVudF9iaXRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci0gICAgIGludCBwcmVjaXNpb247Ci0gICAgIGxvbmcgZXhwb25lbnRfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZSA9IDA7Ci0KLSAgbG9uZyBleHBvbmVudF8xOwotICBsb25nIGV4cG9uZW50XzI7Ci0gIGxvbmcgZXhwb25lbnRfMzsKLSAgbG9uZyBleHBvbmVudF80OwotICBpbnQgZXhwb25lbnRfc2tpcHBhZ2U7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmQxOwotICBMSVRUTEVOVU1fVFlQRSAqbHA7Ci0gIExJVFRMRU5VTV9UWVBFICp3b3Jkc19lbmQ7Ci0KLSAgd29yZHNfZW5kID0gd29yZHMgKyBwcmVjaXNpb247Ci0jaWZkZWYgVENfTTY4SwotICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQotICAgIC8qIE9uIHRoZSBtNjhrIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0IGhhcyBhIGdhcCBvZiAxNiBiaXRzCi0gICAgICAgYmV0d2VlbiB0aGUgZXhwb25lbnQgYW5kIHRoZSBtYW50aXNzYS4gICovCi0gICAgd29yZHNfZW5kKys7Ci0jZW5kaWYKLQotICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93ID4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyKQotICAgIHsKLSAgICAgIC8qIDAuMGUwIHNlZW4uICovCi0gICAgICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCi0Jd29yZHNbMF0gPSAweDAwMDA7Ci0gICAgICBlbHNlCi0Jd29yZHNbMF0gPSAweDgwMDA7Ci0gICAgICBtZW1zZXQgKCZ3b3Jkc1sxXSwgJ1wwJywKLQkgICAgICAod29yZHNfZW5kIC0gd29yZHMgLSAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLSAgICB9Ci0KLSAgLyogTmFOOiAgRG8gdGhlIHJpZ2h0IHRoaW5nICovCi0gIGlmIChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09IDApCi0gICAgewotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMHhmZmZmOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQl7Ci0jaWZkZWYgVENfTTY4SwotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzNdID0gMHhmZmZmOwotCSAgd29yZHNbNF0gPSAweGZmZmY7Ci0JICB3b3Jkc1s1XSA9IDB4ZmZmZjsKLSNlbHNlIC8qICEgVENfTTY4SyAqLwotI2lmZGVmIFRDX0kzODYKLQkgIHdvcmRzWzBdID0gMHhmZmZmOwotCSAgd29yZHNbMV0gPSAweGMwMDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX0kzODYgKi8KLQkgIGFib3J0ICgpOwotI2VuZGlmIC8qICEgVENfSTM4NiAqLwotI2VuZGlmIC8qICEgVENfTTY4SyAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMHhmZmZmOwotCSAgd29yZHNbMl0gPSAweGZmZmY7Ci0JICB3b3Jkc1szXSA9IDB4ZmZmZjsKLQl9Ci0gICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnUCcpCi0gICAgewotICAgICAgLyogK0lORjogIERvIHRoZSByaWdodCB0aGluZyAqLwotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2Y4MDsKLQkgIHdvcmRzWzFdID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0JewotI2lmZGVmIFRDX002OEsKLQkgIHdvcmRzWzBdID0gMHg3ZmZmOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotCSAgd29yZHNbNV0gPSAwOwotI2Vsc2UgLyogISBUQ19NNjhLICovCi0jaWZkZWYgVENfSTM4NgotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDB4ODAwMDsKLQkgIHdvcmRzWzJdID0gMDsKLQkgIHdvcmRzWzNdID0gMDsKLQkgIHdvcmRzWzRdID0gMDsKLSNlbHNlIC8qICEgVENfSTM4NiAqLwotCSAgYWJvcnQgKCk7Ci0jZW5kaWYgLyogISBUQ19JMzg2ICovCi0jZW5kaWYgLyogISBUQ19NNjhLICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmRzWzBdID0gMHg3ZmYwOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCX0KLSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gJ04nKQotICAgIHsKLSAgICAgIC8qIE5lZ2F0aXZlIElORiAqLwotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4ZmY4MDsKLQkgIHdvcmRzWzFdID0gMHgwOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQl7Ci0jaWZkZWYgVENfTTY4SwotCSAgd29yZHNbMF0gPSAweGZmZmY7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0JICB3b3Jkc1s1XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX002OEsgKi8KLSNpZmRlZiBUQ19JMzg2Ci0JICB3b3Jkc1swXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzFdID0gMHg4MDAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotI2Vsc2UgLyogISBUQ19JMzg2ICovCi0JICBhYm9ydCAoKTsKLSNlbmRpZiAvKiAhIFRDX0kzODYgKi8KLSNlbmRpZiAvKiAhIFRDX002OEsgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yZHNbMF0gPSAweGZmZjA7Ci0JICB3b3Jkc1sxXSA9IDB4MDsKLQkgIHdvcmRzWzJdID0gMHgwOwotCSAgd29yZHNbM10gPSAweDA7Ci0JfQotICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotICAgIH0KLSAgLyoKLSAgICogVGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgd2Ugc3VwcG9ydCBoYXZlOgotICAgKiBCaXQgMTUgaXMgc2lnbiBiaXQuCi0gICAqIEJpdHMgMTQ6biBhcmUgZXhjZXNzLXdoYXRldmVyIGV4cG9uZW50LgotICAgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0gICAqIEJpdHMgMTU6MCBvZiB0aGUgbmV4dCB3b3JkKHMpIGFyZSB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJpdHMuCi0gICAqCi0gICAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgotICAgKiBtYW50aXNzYS4KLSAgICovCi0gIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0gIGxpdHRsZW51bV9wb2ludGVyID0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyOwotICBsaXR0bGVudW1zX2xlZnQgPSAoMQotCQkgICAgICsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCi0JCSAgICAgLSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3cpOwotICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCi0gIGZvciAoZXhwb25lbnRfc2tpcHBhZ2UgPSAwOyAhbmV4dF9iaXRzICgxKTsgKytleHBvbmVudF9za2lwcGFnZSk7OwotICBleHBvbmVudF8xID0gKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50Ci0JCSsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCi0JCSsgMQotCQktIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyk7Ci0gIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbgotICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXIuICovCi0gIGV4cG9uZW50XzIgPSBleHBvbmVudF8xICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotICAvKiBSYWRpeCAyLiAqLwotICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotICAvKiBGb3JnZXQgbGVhZGluZyB6ZXJvcywgZm9yZ2V0IDFzdCBiaXQuICovCi0gIGV4cG9uZW50XzQgPSBleHBvbmVudF8zICsgKCgxIDw8IChleHBvbmVudF9iaXRzIC0gMSkpIC0gMik7Ci0gIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotICBscCA9IHdvcmRzOwotCi0gIC8qIFdvcmQgMS4gU2lnbiwgZXhwb25lbnQgYW5kIHBlcmhhcHMgaGlnaCBiaXRzLiAqLwotICB3b3JkMSA9ICgoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCi0JICAgPyAwCi0JICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKLQotICAvKiBBc3N1bWUgMidzIGNvbXBsZW1lbnQgaW50ZWdlcnMuICovCi0gIGlmIChleHBvbmVudF80IDw9IDApCi0gICAgewotICAgICAgaW50IHByZWNfYml0czsKLSAgICAgIGludCBudW1fYml0czsKLQotICAgICAgdW5nZXRfYml0cyAoMSk7Ci0gICAgICBudW1fYml0cyA9IC1leHBvbmVudF80OwotICAgICAgcHJlY19iaXRzID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTICogcHJlY2lzaW9uIC0gKGV4cG9uZW50X2JpdHMgKyAxICsgbnVtX2JpdHMpOwotI2lmZGVmIFRDX0kzODYKLSAgICAgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04gJiYgZXhwb25lbnRfYml0cyA9PSAxNSkKLQl7Ci0JICAvKiBPbiB0aGUgaTM4NiBhIGRlbm9ybWFsaXplZCBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQgaXMKLQkgICAgIHNoaWZ0ZWQgZG93biBieSBvbmUsIGVmZmVjdGl2ZWx5IGRlY3JlYXNpbmcgdGhlIGV4cG9uZW50Ci0JICAgICBiaWFzIGJ5IG9uZS4gICovCi0JICBwcmVjX2JpdHMgLT0gMTsKLQkgIG51bV9iaXRzICs9IDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmIChudW1fYml0cyA+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBleHBvbmVudF9iaXRzKQotCXsKLQkgIC8qIEJpZ2dlciB0aGFuIG9uZSBsaXR0bGVudW0gKi8KLQkgIG51bV9iaXRzIC09IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIGV4cG9uZW50X2JpdHM7Ci0JICAqbHArKyA9IHdvcmQxOwotCSAgaWYgKG51bV9iaXRzICsgZXhwb25lbnRfYml0cyArIDEgPiBwcmVjaXNpb24gKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgIHsKLQkgICAgICAvKiBFeHBvbmVudCBvdmVyZmxvdyAqLwotCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkgICAgICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci0JICAgIH0KLSNpZmRlZiBUQ19NNjhLCi0JICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JICAgICpscCsrID0gMDsKLSNlbmRpZgotCSAgd2hpbGUgKG51bV9iaXRzID49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgewotCSAgICAgIG51bV9iaXRzIC09IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICAgICAqbHArKyA9IDA7Ci0JICAgIH0KLQkgIGlmIChudW1fYml0cykKLQkgICAgKmxwKysgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIChudW1fYml0cykpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JICAgIHsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotI2lmZGVmIFRDX002OEsKLQkgICAgICAqbHArKyA9IDA7Ci0jZW5kaWYKLQkgICAgICAqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtX2JpdHMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3b3JkMSB8PSBuZXh0X2JpdHMgKChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIChleHBvbmVudF9iaXRzICsgbnVtX2JpdHMpKTsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKGxwIDwgd29yZHNfZW5kKQotCSpscCsrID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCi0gICAgICAvKiBSb3VuZCB0aGUgbWFudGlzc2EgdXAsIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIG51bWJlciAqLwotICAgICAgaWYgKG5leHRfYml0cyAoMSkpCi0JewotCSAgLS1scDsKLQkgIGlmIChwcmVjX2JpdHMgPj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICB7Ci0JICAgICAgaW50IG4gPSAwOwotCSAgICAgIGludCB0bXBfYml0czsKLQotCSAgICAgIG4gPSAwOwotCSAgICAgIHRtcF9iaXRzID0gcHJlY19iaXRzOwotCSAgICAgIHdoaWxlICh0bXBfYml0cyA+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkJewotCQkgIGlmIChscFtuXSAhPSAoTElUVExFTlVNX1RZUEUpIC0gMSkKLQkJICAgIGJyZWFrOwotCQkgIC0tbjsKLQkJICB0bXBfYml0cyAtPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JCX0KLQkgICAgICBpZiAodG1wX2JpdHMgPiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMKLQkJICB8fCAobHBbbl0gJiBtYXNrW3RtcF9iaXRzXSkgIT0gbWFza1t0bXBfYml0c10KLQkJICB8fCAocHJlY19iaXRzICE9IChwcmVjaXNpb24gKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMKLQkJCQkgICAgLSBleHBvbmVudF9iaXRzIC0gMSkKLSNpZmRlZiBUQ19JMzg2Ci0JCSAgICAgIC8qIEFuIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdCB3aXRoIG9ubHkgdGhlIGludGVnZXIKLQkJCSBiaXQgc2V0IHdvdWxkIGJlIGludmFsaWQuICBUaGF0IG11c3QgYmUgY29udmVydGVkCi0JCQkgdG8gdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLiAgKi8KLQkJICAgICAgJiYgIShwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04KLQkJCSAgICYmIHByZWNfYml0cyA9PSAocHJlY2lzaW9uICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTCi0JCQkJCSAgICAtIGV4cG9uZW50X2JpdHMgLSAyKSkKLSNlbmRpZgotCQkgICAgICApKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotCQkgIGZvciAoY2FycnkgPSAxOyBjYXJyeSAmJiAobHAgPj0gd29yZHMpOyBscC0tKQotCQkgICAgewotCQkgICAgICBjYXJyeSA9ICpscCArIGNhcnJ5OwotCQkgICAgICAqbHAgPSBjYXJyeTsKLQkJICAgICAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYW4gb3ZlcmZsb3cgb2YgdGhlIGRlbm9ybWFsIG51bWJlcnMuICBXZQotICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBmb3JnZXQgd2hhdCB3ZSBoYXZlIHByb2R1Y2VkLCBhbmQgaW5zdGVhZAotICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLiAgKi8KLQkJICBscCA9IHdvcmRzOwotCQkgIHdvcmQxID0gKChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09ICcrJykKLQkJCSAgID8gMAotCQkJICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKLQkJICB3b3JkMSB8PSAoMQotCQkJICAgIDw8ICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkKLQkJCQktIGV4cG9uZW50X2JpdHMpKTsKLQkJICAqbHArKyA9IHdvcmQxOwotI2lmZGVmIFRDX0kzODYKLQkJICAvKiBTZXQgdGhlIGludGVnZXIgYml0IGluIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0LgotCQkgICAgIFRoaXMgY2Fubm90IGhhcHBlbiBvbiB0aGUgbTY4ayB3aGVyZSB0aGUgbWFudGlzc2EKLQkJICAgICBqdXN0IG92ZXJmbG93cyBpbnRvIHRoZSBpbnRlZ2VyIGJpdCBhYm92ZS4gICovCi0JCSAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQkJICAgICpscCsrID0gMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSk7Ci0jZW5kaWYKLQkJICB3aGlsZSAobHAgPCB3b3Jkc19lbmQpCi0JCSAgICAqbHArKyA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICAqbHAgKz0gMTsKLQl9Ci0KLSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQgbG9uZykgZXhwb25lbnRfNCA+PSBtYXNrW2V4cG9uZW50X2JpdHNdKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBFeHBvbmVudCBvdmVyZmxvdy4gTG9zZSBpbW1lZGlhdGVseS4KLSAgICAgICAqLwotCi0gICAgICAvKgotICAgICAgICogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQotICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0gICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotICAgICAgICovCi0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdvcmQxIHw9IChleHBvbmVudF80IDw8ICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkgLSBleHBvbmVudF9iaXRzKSkKLQl8IG5leHRfYml0cyAoKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpIC0gZXhwb25lbnRfYml0cyk7Ci0gICAgfQotCi0gICpscCsrID0gd29yZDE7Ci0KLSAgLyogWF9QUkVDSVNJT04gaXMgc3BlY2lhbDogb24gdGhlIDY4aywgaXQgaGFzIDE2IGJpdHMgb2YgemVybyBpbiB0aGUKLSAgICAgbWlkZGxlLiAgRWl0aGVyIHdheSwgaXQgaXMgdGhlbiBmb2xsb3dlZCBieSBhIDEgYml0LiAqLwotICBpZiAoZXhwb25lbnRfYml0cyA9PSAxNSAmJiBwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0gICAgewotI2lmZGVmIFRDX002OEsKLSAgICAgICpscCsrID0gMDsKLSNlbmRpZgotICAgICAgKmxwKysgPSAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkKLQkgICAgICAgfCBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKTsKLSAgICB9Ci0KLSAgLyogVGhlIHJlc3Qgb2YgdGhlIHdvcmRzIGFyZSBqdXN0IG1hbnRpc3NhIGJpdHMuICovCi0gIHdoaWxlIChscCA8IHdvcmRzX2VuZCkKLSAgICAqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKLQotICBpZiAobmV4dF9iaXRzICgxKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotICAgICAgLyoKLSAgICAgICAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KLSAgICAgICAqIFRoZSBjdW5uaW5nIGRlc2lnbiBvZiB0aGVzZSBoaWRkZW4tMSBmbG9hdHMgcGVybWl0cwotICAgICAgICogdXMgdG8gbGV0IHRoZSBtYW50aXNzYSBvdmVyZmxvdyBpbnRvIHRoZSBleHBvbmVudCwgYW5kCi0gICAgICAgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQotICAgICAgICogaGlnaGVzdC1vcmRlciBiaXQgb2YgdGhlIGxvd2VzdC1vcmRlciB3b3JkIGZsaXBzLgotICAgICAgICogSXMgdGhhdCBjbGVhcj8KLSAgICAgICAqLwotCi0gICAgICAvKiAjaWYgKHNpemVvZihjYXJyeSkpIDwgKChzaXplb2YoYml0c1swXSkgKiBCSVRTX1BFUl9DSEFSKSArIDIpCi0JIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JIFdlIG5lZWQgdGhhdCBleHRyYSBiaXQgdG8gaG9sZCBhIGNhcnJ5IGR1cmluZyBhIExJVFRMRU5VTSBjYXJyeQotCSBwcm9wYWdhdGlvbi4gQW5vdGhlciBleHRyYSBiaXQgKGtlcHQgMCkgd2lsbCBhc3N1cmUgdXMgdGhhdCB3ZQotCSBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JIHBlcm1pdHMgdXMgdG8gcHJvcGFnYXRlIHRoZSBjYXJyeSB3aXRob3V0IGFueSBtYXNraW5nIG9mIGJpdHMuCi0JICNlbmRpZiAqLwotICAgICAgZm9yIChjYXJyeSA9IDEsIGxwLS07IGNhcnJ5ICYmIChscCA+PSB3b3Jkcyk7IGxwLS0pCi0JewotCSAgY2FycnkgPSAqbHAgKyBjYXJyeTsKLQkgICpscCA9IGNhcnJ5OwotCSAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQl9Ci0gICAgICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JewotCSAgLyogRXh0ZW5kZWQgcHJlY2lzaW9uIG51bWJlcnMgaGF2ZSBhbiBleHBsaWNpdCBpbnRlZ2VyIGJpdAotCSAgICAgdGhhdCB3ZSBtYXkgaGF2ZSB0byByZXN0b3JlLiAgKi8KLQkgIGlmIChscCA9PSB3b3JkcykKLQkgICAgewotI2lmZGVmIFRDX002OEsKLQkgICAgICAvKiBPbiB0aGUgbTY4ayB0aGVyZSBpcyBhIGdhcCBvZiAxNiBiaXRzLiAgV2UgbXVzdAotCQkgZXhwbGljaXRseSBwcm9wYWdhdGUgdGhlIGNhcnJ5IGludG8gdGhlIGV4cG9uZW50LiAqLwotCSAgICAgIHdvcmRzWzBdICs9IHdvcmRzWzFdOwotCSAgICAgIHdvcmRzWzFdID0gMDsKLQkgICAgICBscCsrOwotI2VuZGlmCi0JICAgICAgLyogUHV0IGJhY2sgdGhlIGludGVnZXIgYml0LiAgKi8gCi0JICAgICAgbHBbMV0gfD0gMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSk7Ci0JICAgIH0KLSAJfQotICAgICAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCXsKLQkgIC8qIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkgICAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgotCSAgICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KLQkgICAqLwotCSAgKndvcmRzICY9IH4oMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpOwotCSAgLyogbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOyAqLwotCSAgLyogcmV0dXJuIHJldHVybl92YWx1ZTsgKi8KLQl9Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLSNpZiAwIC8qIHVudXNlZCAqLwotLyogVGhpcyByb3V0aW5lIGlzIGEgcmVhbCBrbHVkZ2UuICBTb21lb25lIHJlYWxseSBzaG91bGQgZG8gaXQgYmV0dGVyLAotICAgYnV0IEknbSB0b28gbGF6eSwgYW5kIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIHN0dWZmIGFsbCB0b28gd2VsbAotICAgYW55d2F5LiAoSkYpICAqLwotc3RhdGljIHZvaWQKLWludF90b19nZW4gKHgpCi0gICAgIGxvbmcgeDsKLXsKLSAgY2hhciBidWZbMjBdOwotICBjaGFyICpidWZwOwotCi0gIHNwcmludGYgKGJ1ZiwgIiVsZCIsIHgpOwotICBidWZwID0gJmJ1ZlswXTsKLSAgaWYgKGF0b2ZfZ2VuZXJpYyAoJmJ1ZnAsICIuIiwgRVhQX0NIQVJTLCAmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpKQotICAgIGFzX2JhZCAoXygiRXJyb3IgY29udmVydGluZyBudW1iZXIgdG8gZmxvYXRpbmcgcG9pbnQgKEV4cG9uZW50IG92ZXJmbG93PykiKSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFRFU1QKLWNoYXIgKgotcHJpbnRfZ2VuIChnZW4pCi0gICAgIEZMT05VTV9UWVBFICpnZW47Ci17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGFyclsxMF07Ci0gIGRvdWJsZSBkdjsKLSAgZmxvYXQgZnY7Ci0gIHN0YXRpYyBjaGFyIHNidWZbNDBdOwotCi0gIGlmIChnZW4pCi0gICAgewotICAgICAgZiA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotICAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgPSAqZ2VuOwotICAgIH0KLSAgZ2VuX3RvX3dvcmRzICgmYXJyWzBdLCA0LCAxMSk7Ci0gIG1lbWNweSAoJmR2LCAmYXJyWzBdLCBzaXplb2YgKGRvdWJsZSkpOwotICBzcHJpbnRmIChzYnVmLCAiJXggJXggJXggJXggJS4xNEcgICAiLCBhcnJbMF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10sIGR2KTsKLSAgZ2VuX3RvX3dvcmRzICgmYXJyWzBdLCAyLCA4KTsKLSAgbWVtY3B5ICgmZnYsICZhcnJbMF0sIHNpemVvZiAoZmxvYXQpKTsKLSAgc3ByaW50ZiAoc2J1ZiArIHN0cmxlbiAoc2J1ZiksICIleCAleCAlLjEyZ1xuIiwgYXJyWzBdLCBhcnJbMV0sIGZ2KTsKLQotICBpZiAoZ2VuKQotICAgIHsKLSAgICAgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gZjsKLSAgICB9Ci0KLSAgcmV0dXJuIChzYnVmKTsKLX0KLQotI2VuZGlmCi0KLS8qIGVuZCBvZiBhdG9mLWllZWUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLXRhaG9lLmMgYi9nYXMvY29uZmlnL2F0b2YtdGFob2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwNDg1Yy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2F0b2YtdGFob2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0KLS8qIGF0b2ZfdGFob2UuYyAtIHR1cm4gYSBzdHJpbmcgaW50byBhIFRhaG9lIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgKi8KLQotLyogVGhpcyBpcyByZWFsbHkgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgYXRvZl92YXguYy4gSSBnbG9tbWVkIGl0IHdob2xlc2FsZQotICAgYW5kIHRoZW4gc2hhdmVkIGl0IGRvd24uIEkgZG9uJ3QgZXZlbiBrbm93IGhvdyBpdCB3b3Jrcy4gKERvbid0IHlvdSBmaW5kCi0gICBteSBob25lc3R5IHJlZnJlc2hpbmc/ICBib3dlbkBjcy5CdWZmYWxvLkVEVSAoRGV2b24gRSBCb3dlbikKLQotICAgSSBkb24ndCBhbGxvdyB1cHBlcmNhc2UgbGV0dGVycyBpbiB0aGUgcHJlY2lzaW9uIGRlc2NycGl0b3JzLiBJZSAnZicgYW5kCi0gICAnZCcgYXJlIGFsbG93ZWQgYnV0ICdGJyBhbmQgJ0QnIGFyZW4ndCAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogUHJlY2lzaW9uIGluIExpdHRsZU51bXMuICovCi0jZGVmaW5lIE1BWF9QUkVDSVNJT04gKDQpCi0jZGVmaW5lIERfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBGX1BSRUNJU0lPTiAoMikKLQotLyogUHJlY2lzaW9uIGluIGNoYXJzLiAqLwotI2RlZmluZSBEX1BSRUNJU0lPTl9DSEFSUyAoOCkKLSNkZWZpbmUgRl9QUkVDSVNJT05fQ0hBUlMgKDQpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1zdGF0aWMgY29uc3QgbG9uZyBpbnQgbWFza1tdID0KLXsKLSAgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAwMSwKLSAgMHgwMDAwMDAwMywKLSAgMHgwMDAwMDAwNywKLSAgMHgwMDAwMDAwZiwKLSAgMHgwMDAwMDAxZiwKLSAgMHgwMDAwMDAzZiwKLSAgMHgwMDAwMDA3ZiwKLSAgMHgwMDAwMDBmZiwKLSAgMHgwMDAwMDFmZiwKLSAgMHgwMDAwMDNmZiwKLSAgMHgwMDAwMDdmZiwKLSAgMHgwMDAwMGZmZiwKLSAgMHgwMDAwMWZmZiwKLSAgMHgwMDAwM2ZmZiwKLSAgMHgwMDAwN2ZmZiwKLSAgMHgwMDAwZmZmZiwKLSAgMHgwMDAxZmZmZiwKLSAgMHgwMDAzZmZmZiwKLSAgMHgwMDA3ZmZmZiwKLSAgMHgwMDBmZmZmZiwKLSAgMHgwMDFmZmZmZiwKLSAgMHgwMDNmZmZmZiwKLSAgMHgwMDdmZmZmZiwKLSAgMHgwMGZmZmZmZiwKLSAgMHgwMWZmZmZmZiwKLSAgMHgwM2ZmZmZmZiwKLSAgMHgwN2ZmZmZmZiwKLSAgMHgwZmZmZmZmZiwKLSAgMHgxZmZmZmZmZiwKLSAgMHgzZmZmZmZmZiwKLSAgMHg3ZmZmZmZmZiwKLSAgMHhmZmZmZmZmZgotfTsKLQwKLQotLyogU2hhcmVkIGJldHdlZW4gZmxvbnVtX2dlbjJ0YWhvZSBhbmQgbmV4dF9iaXRzICovCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fZW5kOwotCi0jaWYgX19TVERDX18gPT0gMQotCi1pbnQgZmxvbnVtX2dlbjJ0YWhvZSAoaW50IGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwgTElUVExFTlVNX1RZUEUgKiB3b3Jkcyk7Ci0KLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotCi1pbnQgZmxvbnVtX2dlbjJ0YWhvZSAoKTsKLQotI2VuZGlmIC8qIG5vdCBfX1NURENfXyAqLwotCi0KLXN0YXRpYyBpbnQKLW5leHRfYml0cyAobnVtYmVyX29mX2JpdHMpCi0gICAgIGludCBudW1iZXJfb2ZfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsKLQotICBpZiAobGl0dGxlbnVtX3BvaW50ZXIgPCBsaXR0bGVudW1fZW5kKQotICAgIHJldHVybiAwOwotICBpZiAobnVtYmVyX29mX2JpdHMgPj0gYml0c19sZWZ0X2luX2xpdHRsZW51bSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW2JpdHNfbGVmdF9pbl9saXR0bGVudW1dICYgKmxpdHRsZW51bV9wb2ludGVyOwotICAgICAgbnVtYmVyX29mX2JpdHMgLT0gYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLSAgICAgIHJldHVybl92YWx1ZSA8PD0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBsaXR0bGVudW1fcG9pbnRlci0tOwotICAgICAgaWYgKGxpdHRsZW51bV9wb2ludGVyID49IGxpdHRsZW51bV9lbmQpCi0JcmV0dXJuX3ZhbHVlIHw9ICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiAoYml0c19sZWZ0X2luX2xpdHRsZW51bSkpICYKLQkgIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmCi0JKCgqbGl0dGxlbnVtX3BvaW50ZXIpID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pOwotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsKLXsKLSAgKndvcmRzID0gMHg4MDAwOwkJLyogRmxvYXRpbmcgUmVzZXJ2ZWQgT3BlcmFuZCBDb2RlICovCi19Ci0MCi1zdGF0aWMgaW50CQkJLyogMCBtZWFucyBsZXR0ZXIgaXMgT0suICovCi13aGF0X2tpbmRfb2ZfZmxvYXQgKGxldHRlciwgcHJlY2lzaW9uUCwgZXhwb25lbnRfYml0c1ApCi0gICAgIGNoYXIgbGV0dGVyOwkJLyogSW46IGxvd2VyY2FzZSBwbGVhc2UuIFdoYXQga2luZCBvZiBmbG9hdD8gKi8KLSAgICAgaW50ICpwcmVjaXNpb25QOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZmxvYXQuICovCi0gICAgIGxvbmcgaW50ICpleHBvbmVudF9iaXRzUDsJLyogTnVtYmVyIG9mIGV4cG9uZW50IGJpdHMuICovCi17Ci0gIGludCByZXR2YWw7CQkJLyogMDogT0suICovCi0KLSAgcmV0dmFsID0gMDsKLSAgc3dpdGNoIChsZXR0ZXIpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgKnByZWNpc2lvblAgPSBGX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgKnByZWNpc2lvblAgPSBEX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR2YWwgPSA2OTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChyZXR2YWwpOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKgkJCQkJCQkJCSoKLSoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLCBiZWNhdXNlIHRoYXQgaXMJKgotKgl3aGF0IHRoZSBWQVggdGhpbmtzIGluLiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZpZ3VyZQkqCi0qCW91dCBhbnkgYWxpZ25tZW50IHByb2JsZW1zIGFuZCB0byBjb25zcGlyZSBmb3IgdGhlIGJ5dGVzL3dvcmQJKgotKgl0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCQkqCi0qCQkJCQkJCQkJKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotYXRvZl90YWhvZSAoc3RyLCB3aGF0X2tpbmQsIHdvcmRzKQotICAgICBjaGFyICpzdHI7CQkJLyogVGV4dCB0byBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KLSAgICAgY2hhciB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gKi8KLSAgLyogVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZSB6ZXJvZWQsICovCi0gIC8qIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCi0gIGNoYXIgKnJldHVybl92YWx1ZTsKLSAgaW50IHByZWNpc2lvbjsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KLSAgbG9uZyBpbnQgZXhwb25lbnRfYml0czsKLQotICByZXR1cm5fdmFsdWUgPSBzdHI7Ci0gIGYubG93ID0gYml0cyArIE1BWF9QUkVDSVNJT047Ci0gIGYuaGlnaCA9IE5VTEw7Ci0gIGYubGVhZGVyID0gTlVMTDsKLSAgZi5leHBvbmVudCA9IE5VTEw7Ci0gIGYuc2lnbiA9ICdcMCc7Ci0KLSAgaWYgKHdoYXRfa2luZF9vZl9mbG9hdCAod2hhdF9raW5kLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cykpCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogV2UgbG9zdC4gKi8KLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICB9Ci0gIGlmIChyZXR1cm5fdmFsdWUpCi0gICAgewotICAgICAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOwotCi0gICAgICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgKi8KLSAgICAgIC8qIG5lY2Vzc2FyeTogdGhlIGhpZ2hlc3QgZmxvbnVtIG1heSBoYXZlICovCi0gICAgICAvKiAxNSBsZWFkaW5nIDAgYml0cywgc28gY291bGQgYmUgdXNlbGVzcy4gKi8KLSAgICAgIGYuaGlnaCA9IGYubG93ICsgcHJlY2lzaW9uIC0gMSArIEdVQVJEOwotCi0gICAgICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsICJlRSIsICZmKSkKLQl7Ci0JICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiB3ZSBsb3N0ICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChmbG9udW1fZ2VuMnRhaG9lICh3aGF0X2tpbmQsICZmLCB3b3JkcykpCi0JICAgIHsKLQkgICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotDAotLyoKLSAqIEluOiBhIGZsb251bSwgYSBUYWhvZSBmbG9hdGluZyBwb2ludCBmb3JtYXQuCi0gKiBPdXQ6IGEgVGFob2UgZmxvYXRpbmctcG9pbnQgYml0IHBhdHRlcm4uCi0gKi8KLQotaW50CQkJCS8qIDA6IE9LLiAqLwotZmxvbnVtX2dlbjJ0YWhvZSAoZm9ybWF0X2xldHRlciwgZiwgd29yZHMpCi0gICAgIGNoYXIgZm9ybWF0X2xldHRlcjsJLyogT25lIG9mICdkJyAnZicuICovCi0gICAgIEZMT05VTV9UWVBFICpmOwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIERlbGl2ZXIgYW5zd2VyIGhlcmUuICovCi17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgaW50IHByZWNpc2lvbjsKLSAgbG9uZyBpbnQgZXhwb25lbnRfYml0czsKLSAgaW50IHJldHVybl92YWx1ZTsJCS8qIDAgPT0gT0suICovCi0KLSAgcmV0dXJuX3ZhbHVlID0gd2hhdF9raW5kX29mX2Zsb2F0IChmb3JtYXRfbGV0dGVyLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cyk7Ci0gIGlmIChyZXR1cm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGYtPmxvdyA+IGYtPmxlYWRlcikKLQl7Ci0JICAvKiAwLjBlMCBzZWVuLiAqLwotCSAgbWVtc2V0ICh3b3JkcywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBwcmVjaXNpb24pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGludCBleHBvbmVudF8xOwotCSAgbG9uZyBpbnQgZXhwb25lbnRfMjsKLQkgIGxvbmcgaW50IGV4cG9uZW50XzM7Ci0JICBsb25nIGludCBleHBvbmVudF80OwotCSAgaW50IGV4cG9uZW50X3NraXBwYWdlOwotCSAgTElUVExFTlVNX1RZUEUgd29yZDE7Ci0KLQkgIC8qIEpGOiBEZWFsIHdpdGggbmV3IE5hbiwgK0luZiBhbmQgLUluZiBjb2RlcyAqLwotCSAgaWYgKGYtPnNpZ24gIT0gJy0nICYmIGYtPnNpZ24gIT0gJysnKQotCSAgICB7Ci0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBBbGwgdGFob2UgZmxvYXRpbmdfcG9pbnQgZm9ybWF0cyBoYXZlOgotCSAgICogQml0IDE1IGlzIHNpZ24gYml0LgotCSAgICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCi0JICAgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0JICAgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZCBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgotCSAgICogQW5kIHNvIG9uIGZvciBlYWNoIG90aGVyIHdvcmQuCi0JICAgKgotCSAgICogU28gd2UgbmVlZDogbnVtYmVyIG9mIGJpdHMgb2YgZXhwb25lbnQsIG51bWJlciBvZiBiaXRzIG9mCi0JICAgKiBtYW50aXNzYS4KLQkgICAqLwotCi0JICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgbGl0dGxlbnVtX3BvaW50ZXIgPSBmLT5sZWFkZXI7Ci0JICBsaXR0bGVudW1fZW5kID0gZi0+bG93OwotCSAgLyogU2VlayAoYW5kIGZvcmdldCkgMXN0IHNpZ25pZmljYW50IGJpdCAqLwotCSAgZm9yIChleHBvbmVudF9za2lwcGFnZSA9IDA7Ci0JICAgICAgICFuZXh0X2JpdHMgKDEpOwotCSAgICAgICBleHBvbmVudF9za2lwcGFnZSsrKQotCSAgICB7Ci0JICAgIH0KLQkgIGV4cG9uZW50XzEgPSBmLT5leHBvbmVudCArIGYtPmxlYWRlciArIDEgLSBmLT5sb3c7Ci0JICAvKiBSYWRpeCBMSVRUTEVOVU1fUkFESVgsIHBvaW50IGp1c3QgaGlnaGVyIHRoYW4gZiAtPiBsZWFkZXIuICovCi0JICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIC8qIFJhZGl4IDIuICovCi0JICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotCSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLwotCSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKTsKLQkgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotCSAgaWYgKGV4cG9uZW50XzQgJiB+bWFza1tleHBvbmVudF9iaXRzXSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCi0JICAgICAgICovCi0KLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0KLQkgICAgICAvKgotCSAgICAgICAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkgICAgICAgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkgICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCSAgICAgICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBscCA9IHdvcmRzOwotCi0JICAgICAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCi0JICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLwotCSAgICAgIHdvcmQxID0gKChleHBvbmVudF80ICYgbWFza1tleHBvbmVudF9iaXRzXSkgPDwgKDE1IC0gZXhwb25lbnRfYml0cykpCi0JCXwgKChmLT5zaWduID09ICcrJykgPyAwIDogMHg4MDAwKQotCQl8IG5leHRfYml0cyAoMTUgLSBleHBvbmVudF9iaXRzKTsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotCi0JICAgICAgLyogVGhlIHJlc3Qgb2YgdGhlIHdvcmRzIGFyZSBqdXN0IG1hbnRpc3NhIGJpdHMuICovCi0JICAgICAgZm9yICg7IGxwIDwgd29yZHMgKyBwcmVjaXNpb247IGxwKyspCi0JCXsKLQkJICAqbHAgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyk7Ci0JCX0KLQotCSAgICAgIGlmIChuZXh0X2JpdHMgKDEpKQotCQl7Ci0JCSAgLyoKLQkJICAgKiBTaW5jZSB0aGUgTkVYVCBiaXQgaXMgYSAxLCByb3VuZCBVUCB0aGUgbWFudGlzc2EuCi0JCSAgICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCi0JCSAgICogdXMgdG8gbGV0IHRoZSBtYW50aXNzYSBvdmVyZmxvdyBpbnRvIHRoZSBleHBvbmVudCwgYW5kCi0JCSAgICogaXQgJ2RvZXMgdGhlIHJpZ2h0IHRoaW5nJy4gSG93ZXZlciwgd2UgbG9zZSBpZiB0aGUKLQkJICAgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCi0JCSAgICogSXMgdGhhdCBjbGVhcj8KLQkJICAgKi8KLQotCQkgIHVuc2lnbmVkIGxvbmcgaW50IGNhcnJ5OwotCi0JCSAgLyoKLQkJICAgICNpZiAoc2l6ZW9mKGNhcnJ5KSkgPCAoKHNpemVvZihiaXRzWzBdKSAqIEJJVFNfUEVSX0NIQVIpICsgMikKLQkJICAgIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JCSAgICBXZSBuZWVkIHRoYXQgZXh0cmEgYml0IHRvIGhvbGQgYSBjYXJyeSBkdXJpbmcgYSBMSVRUTEVOVU0gY2FycnkKLQkJICAgIHByb3BhZ2F0aW9uLiBBbm90aGVyIGV4dHJhIGJpdCAoa2VwdCAwKSB3aWxsIGFzc3VyZSB1cyB0aGF0IHdlCi0JCSAgICBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JCSAgICBwZXJtaXRzIHVzIHRvIHByb3BhZ2F0ZSB0aGUgY2Fycnkgd2l0aG91dCBhbnkgbWFza2luZyBvZiBiaXRzLgotCQkgICAgI2VuZGlmCi0JCSAgICAqLwotCQkgIGZvciAoY2FycnkgPSAxLCBscC0tOwotCQkgICAgICAgY2FycnkgJiYgKGxwID49IHdvcmRzKTsKLQkJICAgICAgIGxwLS0pCi0JCSAgICB7Ci0JCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JCSAgICAgICpscCA9IGNhcnJ5OwotCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgfQotCi0JCSAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCQkgICAgewotCQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkJICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0JCSAgICAgICAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JCSAgICAgICAqLwotCQkgICAgfQotCQl9CQkvKiBpZiAod2UgbmVlZGVkIHRvIHJvdW5kIHVwKSAqLwotCSAgICB9CQkJLyogaWYgKGV4cG9uZW50IG92ZXJmbG93KSAqLwotCX0JCQkvKiBpZiAoMC4wZTApICovCi0gICAgfQkJCQkvKiBpZiAoZmxvYXRfdHlwZSB3YXMgT0spICovCi0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQwKLS8qCi0gKgkJbWRfYXRvZigpCi0gKgotICogSW46CWlucHV0X2xpbmVfcG9pbnRlciAtPiB0aGUgMXN0IGNoYXJhY3RlciBvZiBhIGZsb2F0aW5nLXBvaW50Ci0gKgkJbnVtYmVyLgotICoJMSBsZXR0ZXIgZGVub3RpbmcgdGhlIHR5cGUgb2Ygc3RhdGVtZW50IHRoYXQgd2FudHMgYQotICoJCWJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmV0dXJuZWQuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIGJ1aWxkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKgkJQXNzdW1lZCB0byBiZSAnYmlnIGVub3VnaCcuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIHJldHVybiBzaXplIG9mIGxpdGVyYWwgKGluIGNoYXJzKS4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlciAtPiBvZiBuZXh0IGNoYXIgYWZ0ZXIgZmxvYXRpbmcgbnVtYmVyLgotICoJRXJyb3IgbWVzc2FnZSwgb3IgMC4KLSAqCUZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKglOdW1iZXIgb2YgY2hhcnMgd2UgdXNlZCBmb3IgdGhlIGxpdGVyYWwuCi0gKi8KLQotY2hhciAqCi1tZF9hdG9mICh3aGF0X3N0YXRlbWVudF90eXBlLCBsaXRlcmFsUCwgc2l6ZVApCi0gICAgIGNoYXIgd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgY2hhciAqbGl0ZXJhbFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9QUkVDSVNJT05dOwotICByZWdpc3RlciBjaGFyIGtpbmRfb2ZfZmxvYXQ7Ci0gIHJlZ2lzdGVyIGludCBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLQotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgkJCS8qIC5mZmxvYXQgKi8KLSAgICBjYXNlICdkJzoJCQkvKiAuZGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfTsKLQotICBpZiAoa2luZF9vZl9mbG9hdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGltaXQ7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGF0b2ZfdGFob2UgKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCQkgICAgICAga2luZF9vZl9mbG9hdCwKLQkJCQkgICAgICAgd29yZHMpOwotICAgICAgLyoKLSAgICAgICAqIFRoZSBhdG9mX3RhaG9lKCkgYnVpbGRzIHVwIDE2LWJpdCBudW1iZXJzLgotICAgICAgICogU2luY2UgdGhlIGFzc2VtYmxlciBtYXkgbm90IGJlIHJ1bm5pbmcgb24KLSAgICAgICAqIGEgZGlmZmVyZW50LWVuZGlhbiBtYWNoaW5lLCBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQKLSAgICAgICAqIGNvbnZlcnRpbmcgd29yZHMgdG8gY2hhcnMuCi0gICAgICAgKi8KLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IChraW5kX29mX2Zsb2F0ID09ICdmJyA/IEZfUFJFQ0lTSU9OX0NIQVJTIDoKLQkJCSAoa2luZF9vZl9mbG9hdCA9PSAnZCcgPyBEX1BSRUNJU0lPTl9DSEFSUyA6IDApKTsKLSAgICAgIGtub3cgKG51bWJlcl9vZl9jaGFycyA8PSBNQVhfUFJFQ0lTSU9OICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGltaXQgPSB3b3JkcyArIChudW1iZXJfb2ZfY2hhcnMgLyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBmb3IgKGxpdHRsZW51bV9wb2ludGVyID0gd29yZHM7Ci0JICAgbGl0dGxlbnVtX3BvaW50ZXIgPCBsaW1pdDsKLQkgICBsaXR0bGVudW1fcG9pbnRlcisrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsICpsaXR0bGVudW1fcG9pbnRlciwKLQkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdGVyYWxQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnVtYmVyX29mX2NoYXJzID0gMDsKLSAgICB9OwotCi0gICpzaXplUCA9IG51bWJlcl9vZl9jaGFyczsKLSAgcmV0dXJuIGtpbmRfb2ZfZmxvYXQgPyAwIDogXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci19Ci0KLS8qIGF0b2ZfdGFob2UuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLXZheC5jIGIvZ2FzL2NvbmZpZy9hdG9mLXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmZmMDc4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvYXRvZi12YXguYworKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKiBhdG9mX3ZheC5jIC0gdHVybiBhIEZsb251bSBpbnRvIGEgVkFYIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi1zdGF0aWMgaW50IGF0b2ZfdmF4X3NpemVvZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgbmV4dF9iaXRzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqKSk7Ci1zdGF0aWMgaW50IHdoYXRfa2luZF9vZl9mbG9hdCBQQVJBTVMgKChpbnQsIGludCAqLCBsb25nICopKTsKLXN0YXRpYyBjaGFyICphdG9mX3ZheCBQQVJBTVMgKChjaGFyICosIGludCwgTElUVExFTlVNX1RZUEUgKikpOwotCi0vKiBQcmVjaXNpb24gaW4gTGl0dGxlTnVtcy4gKi8KLSNkZWZpbmUgTUFYX1BSRUNJU0lPTiAoOCkKLSNkZWZpbmUgSF9QUkVDSVNJT04gKDgpCi0jZGVmaW5lIEdfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBEX1BSRUNJU0lPTiAoNCkKLSNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1pbnQgZmxvbnVtX2dlbjJ2YXggUEFSQU1TICgoaW50IGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwKLQkJCSAgICBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7Ci0KLS8qIE51bWJlciBvZiBjaGFycyBpbiBmbG9udW0gdHlwZSAnbGV0dGVyJy4gKi8KLXN0YXRpYyBpbnQKLWF0b2ZfdmF4X3NpemVvZiAobGV0dGVyKQotICAgICBpbnQgbGV0dGVyOwotewotICBpbnQgcmV0dXJuX3ZhbHVlOwotCi0gIC8qCi0gICAqIFBlcm1pdHRpbmcgdXBwZXJjYXNlIGxldHRlcnMgaXMgcHJvYmFibHkgYSBiYWQgaWRlYS4KLSAgICogUGxlYXNlIHVzZSBvbmx5IGxvd2VyLWNhc2VkIGxldHRlcnMgaW4gY2FzZSB0aGUgdXBwZXItY2FzZWQKLSAgICogb25lcyBiZWNvbWUgdW5zdXBwb3J0ZWQhCi0gICAqLwotICBzd2l0Y2ggKGxldHRlcikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICByZXR1cm5fdmFsdWUgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdnJzoKLSAgICBjYXNlICdHJzoKLSAgICAgIHJldHVybl92YWx1ZSA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgIGNhc2UgJ0gnOgotICAgICAgcmV0dXJuX3ZhbHVlID0gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm5fdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGF0b2ZfdmF4X3NpemVvZiAqLwotCi1zdGF0aWMgY29uc3QgbG9uZyBtYXNrW10gPQotewotICAweDAwMDAwMDAwLAotICAweDAwMDAwMDAxLAotICAweDAwMDAwMDAzLAotICAweDAwMDAwMDA3LAotICAweDAwMDAwMDBmLAotICAweDAwMDAwMDFmLAotICAweDAwMDAwMDNmLAotICAweDAwMDAwMDdmLAotICAweDAwMDAwMGZmLAotICAweDAwMDAwMWZmLAotICAweDAwMDAwM2ZmLAotICAweDAwMDAwN2ZmLAotICAweDAwMDAwZmZmLAotICAweDAwMDAxZmZmLAotICAweDAwMDAzZmZmLAotICAweDAwMDA3ZmZmLAotICAweDAwMDBmZmZmLAotICAweDAwMDFmZmZmLAotICAweDAwMDNmZmZmLAotICAweDAwMDdmZmZmLAotICAweDAwMGZmZmZmLAotICAweDAwMWZmZmZmLAotICAweDAwM2ZmZmZmLAotICAweDAwN2ZmZmZmLAotICAweDAwZmZmZmZmLAotICAweDAxZmZmZmZmLAotICAweDAzZmZmZmZmLAotICAweDA3ZmZmZmZmLAotICAweDBmZmZmZmZmLAotICAweDFmZmZmZmZmLAotICAweDNmZmZmZmZmLAotICAweDdmZmZmZmZmLAotICAweGZmZmZmZmZmCi19OwotDAotCi0vKiBTaGFyZWQgYmV0d2VlbiBmbG9udW1fZ2VuMnZheCBhbmQgbmV4dF9iaXRzICovCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fZW5kOwotCi1zdGF0aWMgaW50Ci1uZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQotICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Ci17Ci0gIGludCByZXR1cm5fdmFsdWU7Ci0KLSAgaWYgKGxpdHRsZW51bV9wb2ludGVyIDwgbGl0dGxlbnVtX2VuZCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci0gICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOwotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOwotICAgICAgbGl0dGxlbnVtX3BvaW50ZXItLTsKLSAgICAgIGlmIChsaXR0bGVudW1fcG9pbnRlciA+PSBsaXR0bGVudW1fZW5kKQotCXJldHVybl92YWx1ZSB8PSAoKCpsaXR0bGVudW1fcG9pbnRlcikgPj4gKGJpdHNfbGVmdF9pbl9saXR0bGVudW0pKSAmIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci17Ci0gICp3b3JkcyA9IDB4ODAwMDsJCS8qIEZsb2F0aW5nIFJlc2VydmVkIE9wZXJhbmQgQ29kZSAqLwotfQotDAotc3RhdGljIGludAkJCS8qIDAgbWVhbnMgbGV0dGVyIGlzIE9LLiAqLwotd2hhdF9raW5kX29mX2Zsb2F0IChsZXR0ZXIsIHByZWNpc2lvblAsIGV4cG9uZW50X2JpdHNQKQotICAgICBpbnQgbGV0dGVyOwkJLyogSW46IGxvd2VyY2FzZSBwbGVhc2UuIFdoYXQga2luZCBvZiBmbG9hdD8gKi8KLSAgICAgaW50ICpwcmVjaXNpb25QOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZmxvYXQuICovCi0gICAgIGxvbmcgKmV4cG9uZW50X2JpdHNQOwkvKiBOdW1iZXIgb2YgZXhwb25lbnQgYml0cy4gKi8KLXsKLSAgaW50IHJldHZhbDsJCQkvKiAwOiBPSy4gKi8KLQotICByZXR2YWwgPSAwOwotICBzd2l0Y2ggKGxldHRlcikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEZfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IERfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEdfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgICAgKnByZWNpc2lvblAgPSBIX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDE1OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dmFsID0gNjk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLCBiZWNhdXNlIHRoYXQgaXMJKgotICoJd2hhdCB0aGUgVkFYIHRoaW5rcyBpbi4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmaWd1cmUJKgotICoJb3V0IGFueSBhbGlnbm1lbnQgcHJvYmxlbXMgYW5kIHRvIGNvbnNwaXJlIGZvciB0aGUgYnl0ZXMvd29yZAkqCi0gKgl0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjaGFyICoJCQkJLyogUmV0dXJuIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotYXRvZl92YXggKHN0ciwgd2hhdF9raW5kLCB3b3JkcykKLSAgICAgY2hhciAqc3RyOwkJCS8qIFRleHQgdG8gY29udmVydCB0byBiaW5hcnkuICovCi0gICAgIGludCB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gKi8KLSAgLyogVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZSB6ZXJvZWQsICovCi0gIC8qIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCi0gIGNoYXIgKnJldHVybl92YWx1ZTsKLSAgaW50IHByZWNpc2lvbjsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KLSAgbG9uZyBleHBvbmVudF9iaXRzOwotCi0gIHJldHVybl92YWx1ZSA9IHN0cjsKLSAgZi5sb3cgPSBiaXRzICsgTUFYX1BSRUNJU0lPTjsKLSAgZi5oaWdoID0gTlVMTDsKLSAgZi5sZWFkZXIgPSBOVUxMOwotICBmLmV4cG9uZW50ID0gMDsKLSAgZi5zaWduID0gJ1wwJzsKLQotICBpZiAod2hhdF9raW5kX29mX2Zsb2F0ICh3aGF0X2tpbmQsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiBXZSBsb3N0LiAqLwotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLQotICBpZiAocmV0dXJuX3ZhbHVlKQotICAgIHsKLSAgICAgIG1lbXNldCAoYml0cywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBNQVhfUFJFQ0lTSU9OKTsKLQotICAgICAgLyogVXNlIG1vcmUgTGl0dGxlTnVtcyB0aGFuIHNlZW1zICovCi0gICAgICAvKiBuZWNlc3Nhcnk6IHRoZSBoaWdoZXN0IGZsb251bSBtYXkgaGF2ZSAqLwotICAgICAgLyogMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCi0gICAgICBmLmhpZ2ggPSBmLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKLQotICAgICAgaWYgKGF0b2ZfZ2VuZXJpYyAoJnJldHVybl92YWx1ZSwgIi4iLCAiZUUiLCAmZikpCi0JewotCSAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogd2UgbG9zdCAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZmxvbnVtX2dlbjJ2YXggKHdoYXRfa2luZCwgJmYsIHdvcmRzKSkKLQkgICAgewotCSAgICAgIHJldHVybl92YWx1ZSA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGF0b2ZfdmF4KCkgKi8KLQwKLS8qCi0gKiBJbjogYSBmbG9udW0sIGEgdmF4IGZsb2F0aW5nIHBvaW50IGZvcm1hdC4KLSAqIE91dDogYSB2YXggZmxvYXRpbmctcG9pbnQgYml0IHBhdHRlcm4uCi0gKi8KLQotaW50CQkJCS8qIDA6IE9LLiAqLwotZmxvbnVtX2dlbjJ2YXggKGZvcm1hdF9sZXR0ZXIsIGYsIHdvcmRzKQotICAgICBpbnQgZm9ybWF0X2xldHRlcjsJCS8qIE9uZSBvZiAnZCcgJ2YnICdnJyAnaCcuICovCi0gICAgIEZMT05VTV9UWVBFICpmOwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIERlbGl2ZXIgYW5zd2VyIGhlcmUuICovCi17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgaW50IHByZWNpc2lvbjsKLSAgbG9uZyBleHBvbmVudF9iaXRzOwotICBpbnQgcmV0dXJuX3ZhbHVlOwkJLyogMCA9PSBPSy4gKi8KLQotICByZXR1cm5fdmFsdWUgPSB3aGF0X2tpbmRfb2ZfZmxvYXQgKGZvcm1hdF9sZXR0ZXIsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKTsKLQotICBpZiAocmV0dXJuX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmLT5sb3cgPiBmLT5sZWFkZXIpCi0JewotCSAgLyogMC4wZTAgc2Vlbi4gKi8KLQkgIG1lbXNldCAod29yZHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogcHJlY2lzaW9uKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBleHBvbmVudF8xOwotCSAgbG9uZyBleHBvbmVudF8yOwotCSAgbG9uZyBleHBvbmVudF8zOwotCSAgbG9uZyBleHBvbmVudF80OwotCSAgaW50IGV4cG9uZW50X3NraXBwYWdlOwotCSAgTElUVExFTlVNX1RZUEUgd29yZDE7Ci0KLQkgIC8qIEpGOiBEZWFsIHdpdGggbmV3IE5hbiwgK0luZiBhbmQgLUluZiBjb2RlcyAqLwotCSAgaWYgKGYtPnNpZ24gIT0gJy0nICYmIGYtPnNpZ24gIT0gJysnKQotCSAgICB7Ci0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0JICAgIH0KLQkgIC8qCi0JCQkgKiBBbGwgdmF4ZW4gZmxvYXRpbmdfcG9pbnQgZm9ybWF0cyAoc28gZmFyKSBoYXZlOgotCQkJICogQml0IDE1IGlzIHNpZ24gYml0LgotCQkJICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCi0JCQkgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0JCQkgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZCBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgotCQkJICogQW5kIHNvIG9uIGZvciBlYWNoIG90aGVyIHdvcmQuCi0JCQkgKgotCQkJICogQWxsIHRoaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGEgS0YxMT8/IChXaGljaCBpcyBzdGlsbCBmYXN0ZXIKLQkJCSAqIHRoYW4gbG90cyBvZiB2YXhlbiBJIGNhbiB0aGluayBvZiwgYnV0IGl0IGFsc28gaGFzIGhpZ2hlcgotCQkJICogbWFpbnRlbmFuY2UgY29zdHMgLi4uIHNpZ2gpLgotCQkJICoKLQkJCSAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgotCQkJICogbWFudGlzc2EuCi0JCQkgKi8KLQotI2lmZGVmIE5FVkVSCQkJLyoqKioqKiogVGhpcyB6ZXJvaW5nIHNlZW1zIHJlZHVuZGFudCAtIERlYW4gM21heTg2ICoqKioqKioqKiovCi0JICAvKgotCQkJICogTm8gbWF0dGVyIGhvdyBmZXcgYml0cyB3ZSBnb3QgYmFjayBmcm9tIHRoZSBhdG9mKCkKLQkJCSAqIHJvdXRpbmUsIGFkZCBlbm91Z2ggemVybyBsaXR0bGVudW1zIHNvIHRoZSByZXN0IG9mIHRoZQotCQkJICogY29kZSB3b24ndCBydW4gb3V0IG9mICJzaWduaWZpY2FudCIgYml0cyBpbiB0aGUgbWFudGlzc2EuCi0JCQkgKi8KLQkgIHsKLQkgICAgTElUVExFTlVNX1RZUEUgKmx0cDsKLQkgICAgZm9yIChsdHAgPSBmLT5sZWFkZXIgKyAxOwotCQkgbHRwIDw9IGYtPmxvdyArIHByZWNpc2lvbjsKLQkJIGx0cCsrKQotCSAgICAgIHsKLQkJKmx0cCA9IDA7Ci0JICAgICAgfQotCSAgfQotI2VuZGlmCi0KLQkgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICBsaXR0bGVudW1fcG9pbnRlciA9IGYtPmxlYWRlcjsKLQkgIGxpdHRsZW51bV9lbmQgPSBmLT5sb3c7Ci0JICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCi0JICBmb3IgKGV4cG9uZW50X3NraXBwYWdlID0gMDsKLQkgICAgICAgIW5leHRfYml0cyAoMSk7Ci0JICAgICAgIGV4cG9uZW50X3NraXBwYWdlKyspOzsKLQotCSAgZXhwb25lbnRfMSA9IGYtPmV4cG9uZW50ICsgZi0+bGVhZGVyICsgMSAtIGYtPmxvdzsKLQkgIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbiBmLT5sZWFkZXIuICovCi0JICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIC8qIFJhZGl4IDIuICovCi0JICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotCSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLwotCSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKTsKLQkgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotCSAgaWYgKGV4cG9uZW50XzQgJiB+bWFza1tleHBvbmVudF9iaXRzXSkKLQkgICAgewotCSAgICAgIC8qCi0JCQkJICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCi0JCQkJICovCi0KLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0KLQkgICAgICAvKgotCQkJCSAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkJCQkgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCQkJCSAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBscCA9IHdvcmRzOwotCi0JICAgICAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCi0JICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLwotCSAgICAgIHdvcmQxID0gKCgoZXhwb25lbnRfNCAmIG1hc2tbZXhwb25lbnRfYml0c10pIDw8ICgxNSAtIGV4cG9uZW50X2JpdHMpKQotCQkgICAgICAgfCAoKGYtPnNpZ24gPT0gJysnKSA/IDAgOiAweDgwMDApCi0JCSAgICAgICB8IG5leHRfYml0cyAoMTUgLSBleHBvbmVudF9iaXRzKSk7Ci0JICAgICAgKmxwKysgPSB3b3JkMTsKLQotCSAgICAgIC8qIFRoZSByZXN0IG9mIHRoZSB3b3JkcyBhcmUganVzdCBtYW50aXNzYSBiaXRzLiAqLwotCSAgICAgIGZvciAoOyBscCA8IHdvcmRzICsgcHJlY2lzaW9uOyBscCsrKQotCQl7Ci0JCSAgKmxwID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCQl9Ci0KLQkgICAgICBpZiAobmV4dF9iaXRzICgxKSkKLQkJewotCQkgIC8qCi0JCQkJCSAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KLQkJCQkJICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCi0JCQkJCSAqIHVzIHRvIGxldCB0aGUgbWFudGlzc2Egb3ZlcmZsb3cgaW50byB0aGUgZXhwb25lbnQsIGFuZAotCQkJCQkgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQotCQkJCQkgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCi0JCQkJCSAqIElzIHRoYXQgY2xlYXI/Ci0JCQkJCSAqLwotCi0JCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotCQkgIC8qCi0JCQkJCSAgI2lmIChzaXplb2YoY2FycnkpKSA8ICgoc2l6ZW9mKGJpdHNbMF0pICogQklUU19QRVJfQ0hBUikgKyAyKQotCQkJCQkgIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JCQkJCSAgV2UgbmVlZCB0aGF0IGV4dHJhIGJpdCB0byBob2xkIGEgY2FycnkgZHVyaW5nIGEgTElUVExFTlVNIGNhcnJ5Ci0JCQkJCSAgcHJvcGFnYXRpb24uIEFub3RoZXIgZXh0cmEgYml0IChrZXB0IDApIHdpbGwgYXNzdXJlIHVzIHRoYXQgd2UKLQkJCQkJICBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JCQkJCSAgcGVybWl0cyB1cyB0byBwcm9wYWdhdGUgdGhlIGNhcnJ5IHdpdGhvdXQgYW55IG1hc2tpbmcgb2YgYml0cy4KLQkJCQkJICAjZW5kaWYKLQkJCQkJICAqLwotCQkgIGZvciAoY2FycnkgPSAxLCBscC0tOwotCQkgICAgICAgY2FycnkgJiYgKGxwID49IHdvcmRzKTsKLQkJICAgICAgIGxwLS0pCi0JCSAgICB7Ci0JCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JCSAgICAgICpscCA9IGNhcnJ5OwotCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgfQotCi0JCSAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCQkgICAgewotCQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JCSAgICAgIC8qCi0JCQkJCQkgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCi0JCQkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkJCQkJCSAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JCQkJCQkgKi8KLQkJICAgIH0KLQkJfQkJLyogaWYgKHdlIG5lZWRlZCB0byByb3VuZCB1cCkgKi8KLQkgICAgfQkJCS8qIGlmIChleHBvbmVudCBvdmVyZmxvdykgKi8KLQl9CQkJLyogaWYgKDAuMGUwKSAqLwotICAgIH0JCQkJLyogaWYgKGZsb2F0X3R5cGUgd2FzIE9LKSAqLwotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGZsb251bV9nZW4ydmF4KCkgKi8KLQotCi0vKiBKRiB0aGlzIHVzZWQgdG8gYmUgaW4gdmF4LmMgYnV0IHRoaXMgbG9va3MgbGlrZSBhIGJldHRlciBwbGFjZSBmb3IgaXQgKi8KLQotLyoKLSAqCQltZF9hdG9mKCkKLSAqCi0gKiBJbjoJaW5wdXRfbGluZV9wb2ludGVyLT50aGUgMXN0IGNoYXJhY3RlciBvZiBhIGZsb2F0aW5nLXBvaW50Ci0gKgkJbnVtYmVyLgotICoJMSBsZXR0ZXIgZGVub3RpbmcgdGhlIHR5cGUgb2Ygc3RhdGVtZW50IHRoYXQgd2FudHMgYQotICoJCWJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmV0dXJuZWQuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIGJ1aWxkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKgkJQXNzdW1lZCB0byBiZSAnYmlnIGVub3VnaCcuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIHJldHVybiBzaXplIG9mIGxpdGVyYWwgKGluIGNoYXJzKS4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlci0+b2YgbmV4dCBjaGFyIGFmdGVyIGZsb2F0aW5nIG51bWJlci4KLSAqCUVycm9yIG1lc3NhZ2UsIG9yIDAuCi0gKglGbG9hdGluZyBwb2ludCBsaXRlcmFsLgotICoJTnVtYmVyIG9mIGNoYXJzIHdlIHVzZWQgZm9yIHRoZSBsaXRlcmFsLgotICovCi0KLSNkZWZpbmUgTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAoOCkJLyogRm9yIC5oZmxvYXRzLiAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHdoYXRfc3RhdGVtZW50X3R5cGUsIGxpdGVyYWxQLCBzaXplUCkKLSAgICAgaW50IHdoYXRfc3RhdGVtZW50X3R5cGU7Ci0gICAgIGNoYXIgKmxpdGVyYWxQOwotICAgICBpbnQgKnNpemVQOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhJTVVNX05VTUJFUl9PRl9MSVRUTEVOVU1TXTsKLSAgcmVnaXN0ZXIgY2hhciBraW5kX29mX2Zsb2F0OwotICByZWdpc3RlciBpbnQgbnVtYmVyX29mX2NoYXJzOwotICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtUDsKLQotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ0YnOgkJCS8qIC5mbG9hdCAqLwotICAgIGNhc2UgJ2YnOgkJCS8qIC5mZmxvYXQgKi8KLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAnZic7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgkJCS8qIC5kb3VibGUgKi8KLSAgICBjYXNlICdkJzoJCQkvKiAuZGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2QnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoJCQkvKiAuZ2Zsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2cnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoJCQkvKiAuaGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2gnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAga2luZF9vZl9mbG9hdCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9OwotCi0gIGlmIChraW5kX29mX2Zsb2F0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaW1pdDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYXRvZl92YXggKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCQkgICAgIGtpbmRfb2ZfZmxvYXQsCi0JCQkJICAgICB3b3Jkcyk7Ci0gICAgICAvKgotICAgICAgICogVGhlIGF0b2ZfdmF4KCkgYnVpbGRzIHVwIDE2LWJpdCBudW1iZXJzLgotICAgICAgICogU2luY2UgdGhlIGFzc2VtYmxlciBtYXkgbm90IGJlIHJ1bm5pbmcgb24KLSAgICAgICAqIGEgbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQKLSAgICAgICAqIGNvbnZlcnRpbmcgd29yZHMgdG8gY2hhcnMuCi0gICAgICAgKi8KLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IGF0b2ZfdmF4X3NpemVvZiAoa2luZF9vZl9mbG9hdCk7Ci0gICAgICBrbm93IChudW1iZXJfb2ZfY2hhcnMgPD0gTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpbWl0ID0gd29yZHMgKyAobnVtYmVyX29mX2NoYXJzIC8gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgZm9yIChsaXR0bGVudW1QID0gd29yZHM7IGxpdHRsZW51bVAgPCBsaW1pdDsgbGl0dGxlbnVtUCsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsICpsaXR0bGVudW1QLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRlcmFsUCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IDA7Ci0gICAgfTsKLQotICAqc2l6ZVAgPSBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJldHVybiBraW5kX29mX2Zsb2F0ID8gTlVMTCA6IF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotfQotCi0vKiBlbmQgb2YgYXRvZi12YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLWkzODZhb3V0LmMgYi9nYXMvY29uZmlnL2UtaTM4NmFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmZGY2OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtaTM4NmFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImVtdWwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaTM4NmFvdXRfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJaTM4NmFvdXRfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmFvdXRfZm9ybWF0X29wcwotCi0jZGVmaW5lIGVtdWxfbmFtZQkiaTM4NmFvdXQiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgaTM4NmFvdXQKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1pMzg2Y29mZi5jIGIvZ2FzL2NvbmZpZy9lLWkzODZjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWQ3MjguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9lLWkzODZjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWkzODZjb2ZmX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBlbXVsX2JmZF9uYW1lCWkzODZjb2ZmX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfZm9ybWF0CSZjb2ZmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJImkzODZjb2ZmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIGkzODZjb2ZmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMAotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2UtaTM4NmVsZi5jIGIvZ2FzL2NvbmZpZy9lLWkzODZlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2NzAxZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtaTM4NmVsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiZW11bC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pMzg2ZWxmX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBlbXVsX2JmZF9uYW1lCWkzODZlbGZfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmVsZl9mb3JtYXRfb3BzCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJpMzg2ZWxmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIGkzODZlbGYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1taXBzZWNvZmYuYyBiL2dhcy9jb25maWcvZS1taXBzZWNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyZjcxYi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICptaXBzZWNvZmZfYmZkX25hbWUgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1taXBzZWNvZmZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJbWlwc2Vjb2ZmX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfZm9ybWF0CSZlY29mZl9mb3JtYXRfb3BzCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzYmVjb2ZmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNiZWNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAxCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKLQotI3VuZGVmICBlbXVsX25hbWUKLSN1bmRlZiAgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmICBlbXVsX2RlZmF1bHRfZW5kaWFuCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzbGVjb2ZmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNsZWNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKLQotI3VuZGVmIGVtdWxfbmFtZQotI3VuZGVmIGVtdWxfc3RydWN0X25hbWUKLSN1bmRlZiBlbXVsX2RlZmF1bHRfZW5kaWFuCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzZWNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2Vjb2ZmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMgotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2UtbWlwc2VsZi5jIGIvZ2FzL2NvbmZpZy9lLW1pcHNlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhNzJmNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtbWlwc2VsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiZW11bC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqbWlwc2VsZl9iZmRfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1pcHNlbGZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJbWlwc2VsZl9iZmRfbmFtZQotI2RlZmluZSBlbXVsX2Zvcm1hdAkmZWxmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNiZWxmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNiZWxmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMQotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCi0KLSN1bmRlZiAgZW11bF9uYW1lCi0jdW5kZWYgIGVtdWxfc3RydWN0X25hbWUKLSN1bmRlZiAgZW11bF9kZWZhdWx0X2VuZGlhbgotCi0jZGVmaW5lIGVtdWxfbmFtZQkibWlwc2xlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2xlbGYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKLQotI3VuZGVmIGVtdWxfbmFtZQotI3VuZGVmIGVtdWxfc3RydWN0X25hbWUKLSN1bmRlZiBlbXVsX2RlZmF1bHRfZW5kaWFuCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzZWxmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNlbGYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAyCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvaXRibC1taXBzLmggYi9nYXMvY29uZmlnL2l0YmwtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ4MmJkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvaXRibC1taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0KLS8qIGl0YmwtbWlwcy5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIERlZmluZXMgZm9yIE1pcHMgaXRibCBjb3Agc3VwcG9ydCAqLwotCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLQotLyogVmFsdWVzIGZvciBwcm9jZXNzb3JzIHdpbGwgYmUgZnJvbSAwIHRvIE5VTUJFUl9PRl9QUk9DRVNTT1JTLTEgKi8KLSNkZWZpbmUgTlVNQkVSX09GX1BST0NFU1NPUlMgNAotI2RlZmluZSBNQVhfQklUUE9TIDMxCi0KLS8qIE1pcHMgc3BlY2lmaWNzICovCi0jZGVmaW5lIE1JUFNfT1BDT0RFX0NPUDAgKDB4MjEpCS8qIENPUHorQ08sIGJpdHMgMzEtMjU6IDAxMDB6ejEgKi8KLSNkZWZpbmUgTUlQU19FTkNPREVfQ09QX05VTSh6KSAoKE1JUFNfT1BDT0RFX0NPUDB8ejw8MSk8PDI1KQotI2RlZmluZSBNSVBTX0lTX0NPUF9JTlNOKGluc24pICgoTUlQU19PUENPREVfQ09QMCYoaW5zbj4+MjUpKSBcCi0JPT0gTUlQU19PUENPREVfQ09QMCkKLSNkZWZpbmUgTUlQU19ERUNPREVfQ09QX05VTShpbnNuKSAoKH5NSVBTX09QQ09ERV9DT1AwJihpbnNuPj4yNSkpPj4xKQotI2RlZmluZSBNSVBTX0RFQ09ERV9DT1BfQ09GVU4oaW5zbikgKCh+TUlQU19FTkNPREVfQ09QX05VTSgzKSkmKGluc24pKQotCi0vKiBkZWZpbml0aW9ucyByZXF1aXJlZCBieSBnZW5lcmljIGNvZGUgKi8KLSNkZWZpbmUgSVRCTF9JU19JTlNOKGluc24pIE1JUFNfSVNfQ09QX0lOU04oaW5zbikKLSNkZWZpbmUgSVRCTF9ERUNPREVfUE5VTShpbnNuKSBNSVBTX0RFQ09ERV9DT1BfTlVNKGluc24pCi0jZGVmaW5lIElUQkxfRU5DT0RFX1BOVU0ocG51bSkgTUlQU19FTkNPREVfQ09QX05VTShwbnVtKQotCi0jZGVmaW5lIElUQkxfT1BDT0RFX1NUUlVDVCBtaXBzX29wY29kZQotI2RlZmluZSBJVEJMX09QQ09ERVMgbWlwc19vcGNvZGVzCi0jZGVmaW5lIElUQkxfTlVNX09QQ09ERVMgTlVNT1BDT0RFUwotI2RlZmluZSBJVEJMX05VTV9NQUNST1MgTV9OVU1fTUFDUk9TCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL202OGstcGFyc2UuaCBiL2dhcy9jb25maWcvbTY4ay1wYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI1ZjYwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvbTY4ay1wYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qIG02OGstcGFyc2UuaCAtLSBoZWFkZXIgZmlsZSBmb3IgbTY4ayBhc3NlbWJsZXIKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTTY4S19QQVJTRV9ICi0jZGVmaW5lIE02OEtfUEFSU0VfSAotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhpbmdzIHdoaWNoIGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUKLSAgIG9wZXJhbmQgcGFyc2VyIGluIG02OGsueSBhbmQgdGhlIG02OGsgYXNzZW1ibGVyIHByb3BlciBpbgotICAgdGMtbTY4ay5jLiAgKi8KLQotLyogVGhlIHZhcmlvdXMgbTY4ayByZWdpc3RlcnMuICAqLwotCi0vKiBEQVRBIGFuZCBBRERSIGhhdmUgdG8gYmUgY29udGlndW91cywgc28gdGhhdCByZWctREFUQSBnaXZlcwotICAgMC03PT1kYXRhIHJlZywgOC0xNT09YWRkciByZWcgZm9yIG9wZXJhbmRzIHRoYXQgdGFrZSBib3RoIHR5cGVzLgotCi0gICBXZSBkb24ndCB1c2UgZm9ybXMgbGlrZSAiQUREUjAgPSBBRERSIiBoZXJlIGJlY2F1c2UgdGhpcyBmaWxlIGlzCi0gICBsaWtlbHkgdG8gYmUgdXNlZCBvbiBhbiBBcG9sbG8sIGFuZCB0aGUgYnJva2VuIEFwb2xsbyBjb21waWxlcgotICAgZ2l2ZXMgYW4gYHVuZGVmaW5lZCB2YXJpYWJsZScgZXJyb3IgaWYgd2UgZG8gdGhhdCwgYWNjb3JkaW5nIHRvCi0gICB0cm95QGNibWUudW5zdy5lZHUuYXUuICAqLwotCi0jZGVmaW5lIERBVEEgREFUQTAKLSNkZWZpbmUgQUREUiBBRERSMAotI2RlZmluZSBTUCBBRERSNwotI2RlZmluZSBCQUQgQkFEMAotI2RlZmluZSBCQUMgQkFDMAotCi1lbnVtIG02OGtfcmVnaXN0ZXIKLXsKLSAgREFUQTAgPSAxLAkJCS8qICAgMS0gOCA9PSBkYXRhIHJlZ2lzdGVycyAwLTcgKi8KLSAgREFUQTEsCi0gIERBVEEyLAotICBEQVRBMywKLSAgREFUQTQsCi0gIERBVEE1LAotICBEQVRBNiwKLSAgREFUQTcsCi0KLSAgQUREUjAsCi0gIEFERFIxLAotICBBRERSMiwKLSAgQUREUjMsCi0gIEFERFI0LAotICBBRERSNSwKLSAgQUREUjYsCi0gIEFERFI3LAotCi0gIEZQMCwJCQkJLyogRWlnaHQgRlAgcmVnaXN0ZXJzICovCi0gIEZQMSwKLSAgRlAyLAotICBGUDMsCi0gIEZQNCwKLSAgRlA1LAotICBGUDYsCi0gIEZQNywKLQotICBDT1AwLAkJCQkvKiBDby1wcm9jZXNzb3IgIzAtIzcgKi8KLSAgQ09QMSwKLSAgQ09QMiwKLSAgQ09QMywKLSAgQ09QNCwKLSAgQ09QNSwKLSAgQ09QNiwKLSAgQ09QNywKLQotICBQQywJCQkJLyogUHJvZ3JhbSBjb3VudGVyICovCi0gIFpQQywJCQkJLyogSGFjayBmb3IgUHJvZ3JhbSBzcGFjZSwgYnV0IDAgYWRkcmVzc2luZyAqLwotICBTUiwJCQkJLyogU3RhdHVzIFJlZyAqLwotICBDQ1IsCQkJCS8qIENvbmRpdGlvbiBjb2RlIFJlZyAqLwotICBBQ0MsCQkJCS8qIEFjY3VtdWxhdG9yIFJlZyAqLwotICBNQUNTUiwJCQkvKiBNQUMgU3RhdHVzIFJlZyAqLwotICBNQVNLLAkJCQkvKiBNb2R1bHVzIFJlZyAqLwotCi0gIC8qIFRoZXNlIGhhdmUgdG8gYmUgZ3JvdXBlZCB0b2dldGhlciBmb3IgdGhlIG1vdmVjIGluc3RydWN0aW9uIHRvIHdvcmsuICovCi0gIFVTUCwJCQkJLyogIFVzZXIgU3RhY2sgUG9pbnRlciAqLwotICBJU1AsCQkJCS8qICBJbnRlcnJ1cHQgc3RhY2sgcG9pbnRlciAqLwotICBTRkMsCi0gIERGQywKLSAgQ0FDUiwKLSAgVkJSLAotICBDQUFSLAotICBNU1AsCi0gIElUVDAsCi0gIElUVDEsCi0gIERUVDAsCi0gIERUVDEsCi0gIE1NVVNSLAotICBUQywKLSAgU1JQLAotICBVUlAsCi0gIEJVU0NSLAkJCS8qIDY4MDYwIGFkZGVkIHRoZXNlICovCi0gIFBDUiwKLSAgUk9NQkFSLAkJCS8qIG1jZjUyMDAgYWRkZWQgdGhlc2UgKi8KLSAgUkFNQkFSMCwKLSAgUkFNQkFSMSwKLSAgTUJBUiwKLSNkZWZpbmUgbGFzdF9tb3ZlY19yZWcgTUJBUgotICAvKiBlbmQgb2YgbW92ZWMgb3JkZXJpbmcgY29uc3RyYWludHMgKi8KLQotICBGUEksCi0gIEZQUywKLSAgRlBDLAotCi0gIERSUCwJCQkJLyogNjg4NTEgb3IgNjgwMzAgTU1VIHJlZ3MgKi8KLSAgQ1JQLAotICBDQUwsCi0gIFZBTCwKLSAgU0NDLAotICBBQywKLSAgQkFEMCwKLSAgQkFEMSwKLSAgQkFEMiwKLSAgQkFEMywKLSAgQkFENCwKLSAgQkFENSwKLSAgQkFENiwKLSAgQkFENywKLSAgQkFDMCwKLSAgQkFDMSwKLSAgQkFDMiwKLSAgQkFDMywKLSAgQkFDNCwKLSAgQkFDNSwKLSAgQkFDNiwKLSAgQkFDNywKLSAgUFNSLAkJCQkvKiBha2EgTU1VU1Igb24gNjgwMzAgKGJ1dCBub3QgTU1VU1Igb24gNjgwNDApCi0JCQkJICAgYW5kIEFDVVNSIG9uIDY4ZWMwMzAgKi8KLSAgUENTUiwKLQotICBJQywJCQkJLyogaW5zdHJ1Y3Rpb24gY2FjaGUgdG9rZW4gKi8KLSAgREMsCQkJCS8qIGRhdGEgY2FjaGUgdG9rZW4gKi8KLSAgTkMsCQkJCS8qIG5vIGNhY2hlIHRva2VuICovCi0gIEJDLAkJCQkvKiBib3RoIGNhY2hlcyB0b2tlbiAqLwotCi0gIFRUMCwJCQkJLyogNjgwMzAgYWNjZXNzIGNvbnRyb2wgdW5pdCByZWdzICovCi0gIFRUMSwKLQotICBaREFUQTAsCQkJLyogc3VwcHJlc3NlZCBkYXRhIHJlZ2lzdGVycy4gICovCi0gIFpEQVRBMSwKLSAgWkRBVEEyLAotICBaREFUQTMsCi0gIFpEQVRBNCwKLSAgWkRBVEE1LAotICBaREFUQTYsCi0gIFpEQVRBNywKLQotICBaQUREUjAsCQkJLyogc3VwcHJlc3NlZCBhZGRyZXNzIHJlZ2lzdGVycy4gICovCi0gIFpBRERSMSwKLSAgWkFERFIyLAotICBaQUREUjMsCi0gIFpBRERSNCwKLSAgWkFERFI1LAotICBaQUREUjYsCi0gIFpBRERSNywKLQotICAvKiBVcHBlciBhbmQgbG93ZXIgaGFsZiBvZiBkYXRhIGFuZCBhZGRyZXNzIHJlZ2lzdGVycy4gIE9yZGVyICptdXN0KgotICAgICBiZSBEQVRBeEwsIEFERFJ4TCwgREFUQXhVLCBBRERSeFUuICovCi0gIERBVEEwTCwJCQkvKiBsb3dlciBoYWxmIG9mIGRhdGEgcmVnaXN0ZXJzICovCi0gIERBVEExTCwKLSAgREFUQTJMLAotICBEQVRBM0wsCi0gIERBVEE0TCwKLSAgREFUQTVMLAotICBEQVRBNkwsCi0gIERBVEE3TCwKLQotICBBRERSMEwsCQkJLyogbG93ZXIgaGFsZiBvZiBhZGRyZXNzIHJlZ2lzdGVycyAqLwotICBBRERSMUwsCi0gIEFERFIyTCwKLSAgQUREUjNMLAotICBBRERSNEwsCi0gIEFERFI1TCwKLSAgQUREUjZMLAotICBBRERSN0wsCi0KLSAgREFUQTBVLAkJCS8qIHVwcGVyIGhhbGYgb2YgZGF0YSByZWdpc3RlcnMgKi8KLSAgREFUQTFVLAotICBEQVRBMlUsCi0gIERBVEEzVSwKLSAgREFUQTRVLAotICBEQVRBNVUsCi0gIERBVEE2VSwKLSAgREFUQTdVLAotCi0gIEFERFIwVSwJCQkvKiB1cHBlciBoYWxmIG9mIGFkZHJlc3MgcmVnaXN0ZXJzICovCi0gIEFERFIxVSwKLSAgQUREUjJVLAotICBBRERSM1UsCi0gIEFERFI0VSwKLSAgQUREUjVVLAotICBBRERSNlUsCi0gIEFERFI3VSwKLX07Ci0KLS8qIFNpemUgaW5mb3JtYXRpb24uICAqLwotCi1lbnVtIG02OGtfc2l6ZQotewotICAvKiBVbnNwZWNpZmllZC4gICovCi0gIFNJWkVfVU5TUEVDLAotCi0gIC8qIEJ5dGUuICAqLwotICBTSVpFX0JZVEUsCi0KLSAgLyogV29yZCAoMiBieXRlcykuICAqLwotICBTSVpFX1dPUkQsCi0KLSAgLyogTG9uZ3dvcmQgKDQgYnl0ZXMpLiAgKi8KLSAgU0laRV9MT05HCi19OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbmRleCByZWdpc3Rlci4gICovCi0KLXN0cnVjdCBtNjhrX2luZGV4cmVnCi17Ci0gIC8qIFRoZSBpbmRleCByZWdpc3RlciBpdHNlbGYuICAqLwotICBlbnVtIG02OGtfcmVnaXN0ZXIgcmVnOwotCi0gIC8qIFRoZSBzaXplIHRvIHVzZS4gICovCi0gIGVudW0gbTY4a19zaXplIHNpemU7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIHNjYWxlIGJ5LiAgKi8KLSAgaW50IHNjYWxlOwotfTsKLQotI2lmZGVmIE9CSl9FTEYKLS8qIFRoZSB0eXBlIG9mIGEgUElDIGV4cHJlc3Npb24uICAqLwotCi1lbnVtIHBpY19yZWxvY2F0aW9uCi17Ci0gIHBpY19ub25lLAkJCS8qIG5vdCBwaWMgKi8KLSAgcGljX3BsdF9wY3JlbCwJCS8qIEBQTFRQQyAqLwotICBwaWNfZ290X3BjcmVsLAkJLyogQEdPVFBDICovCi0gIHBpY19wbHRfb2ZmLAkJCS8qIEBQTFQgKi8KLSAgcGljX2dvdF9vZmYJCQkvKiBAR09UICovCi19OwotI2VuZGlmCi0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGFuIGV4cHJlc3Npb24uICAqLwotCi1zdHJ1Y3QgbTY4a19leHAKLXsKLSAgLyogVGhlIHNpemUgdG8gdXNlLiAgKi8KLSAgZW51bSBtNjhrX3NpemUgc2l6ZTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogVGhlIHR5cGUgb2YgcGljIHJlbG9jYXRpb24gaWYgYW55LiAgKi8KLSAgZW51bSBwaWNfcmVsb2NhdGlvbiBwaWNfcmVsb2M7Ci0jZW5kaWYKLQotICAvKiBUaGUgZXhwcmVzc2lvbiBpdHNlbGYuICAqLwotICBleHByZXNzaW9uUyBleHA7Ci19OwotCi0vKiBUaGUgb3BlcmFuZCBtb2Rlcy4gICovCi0KLWVudW0gbTY4a19vcGVyYW5kX3R5cGUKLXsKLSAgSU1NRUQgPSAxLAotICBBQlNMLAotICBEUkVHLAotICBBUkVHLAotICBGUFJFRywKLSAgQ09OVFJPTCwKLSAgQUlORFIsCi0gIEFJTkMsCi0gIEFERUMsCi0gIERJU1AsCi0gIEJBU0UsCi0gIFBPU1QsCi0gIFBSRSwKLSAgUkVHTFNUCi19OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIHBhcnNlZCBvcGVyYW5kLiAgKi8KLQotc3RydWN0IG02OGtfb3AKLXsKLSAgLyogVGhlIHR5cGUgb2Ygb3BlcmFuZC4gICovCi0gIGVudW0gbTY4a19vcGVyYW5kX3R5cGUgbW9kZTsKLQotICAvKiBUaGUgbWFpbiByZWdpc3Rlci4gICovCi0gIGVudW0gbTY4a19yZWdpc3RlciByZWc7Ci0KLSAgLyogVGhlIHJlZ2lzdGVyIG1hc2sgZm9yIG1vZGUgUkVHTFNULiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIEFuIGVycm9yIG1lc3NhZ2UuICAqLwotICBjb25zdCBjaGFyICplcnJvcjsKLQotICAvKiBUaGUgaW5kZXggcmVnaXN0ZXIuICAqLwotICBzdHJ1Y3QgbTY4a19pbmRleHJlZyBpbmRleDsKLQotICAvKiBUaGUgZGlzcGxhY2VtZW50LiAgKi8KLSAgc3RydWN0IG02OGtfZXhwIGRpc3A7Ci0KLSAgLyogVGhlIG91dGVyIGRpc3BsYWNlbWVudC4gICovCi0gIHN0cnVjdCBtNjhrX2V4cCBvZGlzcDsKLX07Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKE02OEtfUEFSU0VfSCkgKi8KLQotLyogVGhlIHBhcnNpbmcgZnVuY3Rpb24uICAqLwotCi1leHRlcm4gaW50IG02OGtfaXBfb3AgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbTY4a19vcCAqKSk7Ci0KLS8qIFdoZXRoZXIgcmVnaXN0ZXIgcHJlZml4ZXMgYXJlIG9wdGlvbmFsLiAgKi8KLWV4dGVybiBpbnQgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9tNjhrLXBhcnNlLnkgYi9nYXMvY29uZmlnL202OGstcGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhNGU0Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL202OGstcGFyc2UueQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjEgKzAsMCBAQAotLyogbTY4ay55IC0tIGJpc29uIGdyYW1tYXIgZm9yIG02OGsgb3BlcmFuZCBwYXJzaW5nCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiBhbmQgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGEgYmlzb24gZ3JhbW1hciB0byBwYXJzZSBtNjhrIG9wZXJhbmRzLiAgVGhlIG02OGsKLSAgIGhhcyBhIGNvbXBsaWNhdGVkIG9wZXJhbmQgc3ludGF4LCBhbmQgZ2FzIHN1cHBvcnRzIHR3byBtYWluCi0gICB2YXJpYXRpb25zIG9mIGl0LiAgVXNpbmcgYSBncmFtbWFyIGlzIHByb2JhYmx5IG92ZXJraWxsLCBidXQgYXQKLSAgIGxlYXN0IGl0IG1ha2VzIGNsZWFyIGV4YWN0bHkgd2hhdCB3ZSBkbyBzdXBwb3J0LiAgKi8KLQotJXsKLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAidGMtbTY4ay5oIgotI2luY2x1ZGUgIm02OGstcGFyc2UuaCIKLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsCi0gICBldGMpLCBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcyBJZiBvdGhlciBwYXJzZXIKLSAgIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlIGFkZGl0aW9uYWwgZ2xvYmFsIG5hbWVzIHRoYXQKLSAgIGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIgZ2VuZXJhdG9ycyBuZWVkIHRvIGJlCi0gICBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCi0KLSNkZWZpbmUJeXltYXhkZXB0aCBtNjhrX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJbTY4a19wYXJzZQotI2RlZmluZQl5eWxleAltNjhrX2xleAotI2RlZmluZQl5eWVycm9yCW02OGtfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCW02OGtfbHZhbAotI2RlZmluZQl5eWNoYXIJbTY4a19jaGFyCi0jZGVmaW5lCXl5ZGVidWcJbTY4a19kZWJ1ZwotI2RlZmluZQl5eXBhY3QJbTY4a19wYWN0CQotI2RlZmluZQl5eXIxCW02OGtfcjEJCQkKLSNkZWZpbmUJeXlyMgltNjhrX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCW02OGtfZGVmCQkKLSNkZWZpbmUJeXljaGsJbTY4a19jaGsJCQotI2RlZmluZQl5eXBnbwltNjhrX3BnbwkJCi0jZGVmaW5lCXl5YWN0CW02OGtfYWN0CQkKLSNkZWZpbmUJeXlleGNhCW02OGtfZXhjYQotI2RlZmluZSB5eWVycmZsYWcgbTY4a19lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJbTY4a19uZXJycwotI2RlZmluZQl5eXBzCW02OGtfcHMKLSNkZWZpbmUJeXlwdgltNjhrX3B2Ci0jZGVmaW5lCXl5cwltNjhrX3MKLSNkZWZpbmUJeXlfeXlzCW02OGtfeXlzCi0jZGVmaW5lCXl5c3RhdGUJbTY4a19zdGF0ZQotI2RlZmluZQl5eXRtcAltNjhrX3RtcAotI2RlZmluZQl5eXYJbTY4a192Ci0jZGVmaW5lCXl5X3l5dgltNjhrX3l5dgotI2RlZmluZQl5eXZhbAltNjhrX3ZhbAotI2RlZmluZQl5eWxsb2MJbTY4a19sbG9jCi0jZGVmaW5lIHl5cmVkcwltNjhrX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwltNjhrX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5bGhzCW02OGtfeXlsaHMKLSNkZWZpbmUgeXlsZW4JbTY4a195eWxlbgotI2RlZmluZSB5eWRlZnJlZCBtNjhrX3l5ZGVmcmVkCi0jZGVmaW5lIHl5ZGdvdG8JbTY4a195eWRnb3RvCi0jZGVmaW5lIHl5c2luZGV4IG02OGtfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggbTY4a195eXJpbmRleAotI2RlZmluZSB5eWdpbmRleCBtNjhrX3l5Z2luZGV4Ci0jZGVmaW5lIHl5dGFibGUJIG02OGtfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBtNjhrX3l5Y2hlY2sKLQotI2lmbmRlZiBZWURFQlVHCi0jZGVmaW5lIFlZREVCVUcgMQotI2VuZGlmCi0KLS8qIEludGVybmFsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4a19yZWdfcGFyc2UgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGUgcGFyc2VyIHNldHMgZmllbGRzIHBvaW50ZWQgdG8gYnkgdGhpcyBnbG9iYWwgdmFyaWFibGUuICAqLwotc3RhdGljIHN0cnVjdCBtNjhrX29wICpvcDsKLQotJX0KLQotJXVuaW9uCi17Ci0gIHN0cnVjdCBtNjhrX2luZGV4cmVnIGluZGV4cmVnOwotICBlbnVtIG02OGtfcmVnaXN0ZXIgcmVnOwotICBzdHJ1Y3QgbTY4a19leHAgZXhwOwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0gIGludCBvbmVyZWc7Ci19Ci0KLSV0b2tlbiA8cmVnPiBEUiBBUiBGUFIgRlBDUiBMUEMgWkFSIFpEUiBMWlBDIENSRUcKLSV0b2tlbiA8aW5kZXhyZWc+IElOREVYUkVHCi0ldG9rZW4gPGV4cD4gRVhQUgotCi0ldHlwZSA8aW5kZXhyZWc+IHppcmVnIHpkaXJlZwotJXR5cGUgPHJlZz4gemFkciB6ZHIgYXBjIHphcGMgenBjIG9wdHphcGMgb3B0Y3phcGMKLSV0eXBlIDxleHA+IG9wdGNleHByIG9wdGV4cHJjCi0ldHlwZSA8bWFzaz4gcmVnbGlzdCBpcmVnbGlzdCByZWdsaXN0cGFpcgotJXR5cGUgPG9uZXJlZz4gcmVnbGlzdHJlZwotCi0lJQotCi0vKiBBbiBvcGVyYW5kLiAgKi8KLQotb3BlcmFuZDoKLQkgIGdlbmVyaWNfb3BlcmFuZAotCXwgbW90b3JvbGFfb3BlcmFuZAotCXwgbWl0X29wZXJhbmQKLQk7Ci0KLS8qIEEgZ2VuZXJpYyBvcGVyYW5kLiAgKi8KLQotZ2VuZXJpY19vcGVyYW5kOgotCSAgRFIKLQkJewotCQkgIG9wLT5tb2RlID0gRFJFRzsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IEFSCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFSRUc7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBGUFIKLQkJewotCQkgIG9wLT5tb2RlID0gRlBSRUc7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBGUENSCi0JCXsKLQkJICBvcC0+bW9kZSA9IENPTlRST0w7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBDUkVHCi0JCXsKLQkJICBvcC0+bW9kZSA9IENPTlRST0w7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBFWFBSCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFCU0w7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJfQotCXwgJyMnIEVYUFIKLQkJewotCQkgIG9wLT5tb2RlID0gSU1NRUQ7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJfQotCXwgJyYnIEVYUFIKLQkJewotCQkgIG9wLT5tb2RlID0gSU1NRUQ7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJfQotCXwgcmVnbGlzdAotCQl7Ci0JCSAgb3AtPm1vZGUgPSBSRUdMU1Q7Ci0JCSAgb3AtPm1hc2sgPSAkMTsKLQkJfQotCTsKLQotLyogQW4gb3BlcmFuZCBpbiBNb3Rvcm9sYSBzeW50YXguICBUaGlzIGluY2x1ZGVzIE1SSSBzeW50YXggYXMgd2VsbCwKLSAgIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGRpZmZlcmVudCBpbiB0aGF0IGl0IHBlcm1pdHMgY29tbXV0YXRpdml0eQotICAgb2YgaW5kZXggYW5kIGJhc2UgcmVnaXN0ZXJzLCBhbmQgcGVybWl0cyBhbiBvZmZzZXQgZXhwcmVzc2lvbiB0bwotICAgYXBwZWFyIGluc2lkZSBvciBvdXRzaWRlIG9mIHRoZSBwYXJlbnRoZXNlcy4gICovCi0KLW1vdG9yb2xhX29wZXJhbmQ6Ci0JICAnKCcgQVIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFJTkRSOwotCQkgIG9wLT5yZWcgPSAkMjsKLQkJfQotCXwgJygnIEFSICcpJyAnKycKLQkJewotCQkgIG9wLT5tb2RlID0gQUlOQzsKLQkJICBvcC0+cmVnID0gJDI7Ci0JCX0KLQl8ICctJyAnKCcgQVIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFERUM7Ci0JCSAgb3AtPnJlZyA9ICQzOwotCQl9Ci0JfCAnKCcgRVhQUiAnLCcgemFwYyAnKScKLQkJewotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQyOwotCQkgIGlmICgoJDQgPj0gWkFERFIwICYmICQ0IDw9IFpBRERSNykKLQkJICAgICAgfHwgJDQgPT0gWlBDKQotCQkgICAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIGVsc2UKLQkJICAgIG9wLT5tb2RlID0gRElTUDsKLQkJfQotCXwgJygnIHphcGMgJywnIEVYUFIgJyknCi0JCXsKLQkJICBvcC0+cmVnID0gJDI7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBpZiAoKCQyID49IFpBRERSMCAmJiAkMiA8PSBaQUREUjcpCi0JCSAgICAgIHx8ICQyID09IFpQQykKLQkJICAgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBlbHNlCi0JCSAgICBvcC0+bW9kZSA9IERJU1A7Ci0JCX0KLQl8IEVYUFIgJygnIHphcGMgJyknCi0JCXsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJICBpZiAoKCQzID49IFpBRERSMCAmJiAkMyA8PSBaQUREUjcpCi0JCSAgICAgIHx8ICQzID09IFpQQykKLQkJICAgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBlbHNlCi0JCSAgICBvcC0+bW9kZSA9IERJU1A7Ci0JCX0KLQl8ICcoJyBMUEMgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IERJU1A7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQl9Ci0JfCAnKCcgWkFSICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMjsKLQkJfQotCXwgJygnIExaUEMgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQl9Ci0JfCAnKCcgRVhQUiAnLCcgemFwYyAnLCcgemlyZWcgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQ0OwotCQkgIG9wLT5kaXNwID0gJDI7Ci0JCSAgb3AtPmluZGV4ID0gJDY7Ci0JCX0KLQl8ICcoJyBFWFBSICcsJyB6YXBjICcsJyB6cGMgJyknCi0JCXsKLQkJICBpZiAoJDQgPT0gUEMgfHwgJDQgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDY7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJICBvcC0+aW5kZXgucmVnID0gJDQ7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQl9Ci0JfCAnKCcgRVhQUiAnLCcgemRpcmVnIG9wdGN6YXBjICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+ZGlzcCA9ICQyOwotCQkgIG9wLT5pbmRleCA9ICQ0OwotCQl9Ci0JfCAnKCcgemRpcmVnICcsJyBFWFBSICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5kaXNwID0gJDQ7Ci0JCSAgb3AtPmluZGV4ID0gJDI7Ci0JCX0KLQl8IEVYUFIgJygnIHphcGMgJywnIHppcmVnICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMzsKLQkJICBvcC0+ZGlzcCA9ICQxOwotCQkgIG9wLT5pbmRleCA9ICQ1OwotCQl9Ci0JfCAnKCcgemFwYyAnLCcgemlyZWcgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQkgIG9wLT5pbmRleCA9ICQ0OwotCQl9Ci0JfCBFWFBSICcoJyB6YXBjICcsJyB6cGMgJyknCi0JCXsKLQkJICBpZiAoJDMgPT0gUEMgfHwgJDMgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDU7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJICBvcC0+aW5kZXgucmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQl9Ci0JfCAnKCcgemFwYyAnLCcgenBjICcpJwotCQl7Ci0JCSAgaWYgKCQyID09IFBDIHx8ICQyID09IFpQQykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQ0OwotCQkgIG9wLT5pbmRleC5yZWcgPSAkMjsKLQkJICBvcC0+aW5kZXguc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQkgIG9wLT5pbmRleC5zY2FsZSA9IDE7Ci0JCX0KLQl8IEVYUFIgJygnIHpkaXJlZyBvcHRjemFwYyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDQ7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJICBvcC0+aW5kZXggPSAkMzsKLQkJfQotCXwgJygnIHpkaXJlZyBvcHRjemFwYyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4ID0gJDI7Ci0JCX0KLQl8ICcoJyAnWycgRVhQUiBvcHRjemFwYyAnXScgJywnIHppcmVnIG9wdGNleHByICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQT1NUOwotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5pbmRleCA9ICQ3OwotCQkgIG9wLT5vZGlzcCA9ICQ4OwotCQl9Ci0JfCAnKCcgJ1snIEVYUFIgb3B0Y3phcGMgJ10nIG9wdGNleHByICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQT1NUOwotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5vZGlzcCA9ICQ2OwotCQl9Ci0JfCAnKCcgJ1snIHphcGMgJ10nICcsJyB6aXJlZyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4ID0gJDY7Ci0JCSAgb3AtPm9kaXNwID0gJDc7Ci0JCX0KLQl8ICcoJyAnWycgemFwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBPU1Q7Ci0JCSAgb3AtPnJlZyA9ICQzOwotCQkgIG9wLT5vZGlzcCA9ICQ1OwotCQl9Ci0JfCAnKCcgJ1snIEVYUFIgJywnIHphcGMgJywnIHppcmVnICddJyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5pbmRleCA9ICQ3OwotCQkgIG9wLT5vZGlzcCA9ICQ5OwotCQl9Ci0JfCAnKCcgJ1snIHphcGMgJywnIHppcmVnICddJyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkMzsKLQkJICBvcC0+aW5kZXggPSAkNTsKLQkJICBvcC0+b2Rpc3AgPSAkNzsKLQkJfQotCXwgJygnICdbJyBFWFBSICcsJyB6YXBjICcsJyB6cGMgJ10nIG9wdGNleHByICcpJwotCQl7Ci0JCSAgaWYgKCQ1ID09IFBDIHx8ICQ1ID09IFpQQykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IFBSRTsKLQkJICBvcC0+cmVnID0gJDc7Ci0JCSAgb3AtPmRpc3AgPSAkMzsKLQkJICBvcC0+aW5kZXgucmVnID0gJDU7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQkgIG9wLT5vZGlzcCA9ICQ5OwotCQl9Ci0JfCAnKCcgJ1snIHphcGMgJywnIHpwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBpZiAoJDMgPT0gUEMgfHwgJDMgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+aW5kZXgucmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQkgIG9wLT5vZGlzcCA9ICQ3OwotCQl9Ci0JfCAnKCcgJ1snIG9wdGV4cHJjIHpkaXJlZyBvcHRjemFwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBSRTsKLQkJICBvcC0+cmVnID0gJDU7Ci0JCSAgb3AtPmRpc3AgPSAkMzsKLQkJICBvcC0+aW5kZXggPSAkNDsKLQkJICBvcC0+b2Rpc3AgPSAkNzsKLQkJfQotCTsKLQotLyogQW4gb3BlcmFuZCBpbiBNSVQgc3ludGF4LiAgKi8KLQotbWl0X29wZXJhbmQ6Ci0JICBvcHR6YXBjICdAJwotCQl7Ci0JCSAgLyogV2UgdXNlIG9wdHphcGMgdG8gYXZvaWQgYSBzaGlmdC9yZWR1Y2UgY29uZmxpY3QuICAqLwotCQkgIGlmICgkMSA8IEFERFIwIHx8ICQxID4gQUREUjcpCi0JCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7Ci0JCSAgb3AtPm1vZGUgPSBBSU5EUjsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IG9wdHphcGMgJ0AnICcrJwotCQl7Ci0JCSAgLyogV2UgdXNlIG9wdHphcGMgdG8gYXZvaWQgYSBzaGlmdC9yZWR1Y2UgY29uZmxpY3QuICAqLwotCQkgIGlmICgkMSA8IEFERFIwIHx8ICQxID4gQUREUjcpCi0JCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7Ci0JCSAgb3AtPm1vZGUgPSBBSU5DOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJfQotCXwgb3B0emFwYyAnQCcgJy0nCi0JCXsKLQkJICAvKiBXZSB1c2Ugb3B0emFwYyB0byBhdm9pZCBhIHNoaWZ0L3JlZHVjZSBjb25mbGljdC4gICovCi0JCSAgaWYgKCQxIDwgQUREUjAgfHwgJDEgPiBBRERSNykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IEFERUM7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnKCcgRVhQUiAnKScKLQkJewotCQkgIG9wLT5yZWcgPSAkMTsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIGlmICgoJDEgPj0gWkFERFIwICYmICQxIDw9IFpBRERSNykKLQkJICAgICAgfHwgJDEgPT0gWlBDKQotCQkgICAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIGVsc2UKLQkJICAgIG9wLT5tb2RlID0gRElTUDsKLQkJfQotCXwgb3B0emFwYyAnQCcgJygnIG9wdGV4cHJjIHppcmVnICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIG9wLT5pbmRleCA9ICQ1OwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnKCcgRVhQUiAnKScgJ0AnICcoJyBvcHRleHByYyB6aXJlZyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+aW5kZXggPSAkOTsKLQkJICBvcC0+b2Rpc3AgPSAkODsKLQkJfQotCXwgb3B0emFwYyAnQCcgJygnIEVYUFIgJyknICdAJyAnKCcgRVhQUiAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+b2Rpc3AgPSAkODsKLQkJfQotCXwgb3B0emFwYyAnQCcgJygnIG9wdGV4cHJjIHppcmVnICcpJyAnQCcgJygnIEVYUFIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBSRTsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+aW5kZXggPSAkNTsKLQkJICBvcC0+b2Rpc3AgPSAkOTsKLQkJfQotCTsKLQotLyogQW4gaW5kZXggcmVnaXN0ZXIsIHBvc3NpYmx5IHN1cHByZXNzZWQsIHdoaWNoIG5lZWQgbm90IGhhdmUgYSBzaXplCi0gICBvciBzY2FsZS4gICovCi0KLXppcmVnOgotCSAgSU5ERVhSRUcKLQl8IHphZHIKLQkJewotCQkgICQkLnJlZyA9ICQxOwotCQkgICQkLnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICAkJC5zY2FsZSA9IDE7Ci0JCX0KLQk7Ci0KLS8qIEEgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIGFuIGluZGV4IHJlZ2lzdGVyLCBidXQgd2hpY2ggbWF5IG5vdCBiZSBhbgotICAgYWRkcmVzcyByZWdpc3Rlci4gIFRoaXMgbm9udGVybWluYWwgaXMgdXNlZCB0byBhdm9pZCBhbWJpZ3VpdHkgd2hlbgotICAgdHJ5aW5nIHRvIHBhcnNlIHNvbWV0aGluZyBsaWtlICgwLGQ1LGE2KSBhcyBjb21wYXJlZCB0byAoMCxhNixkNSkuICAqLwotCi16ZGlyZWc6Ci0JICBJTkRFWFJFRwotCXwgemRyCi0JCXsKLQkJICAkJC5yZWcgPSAkMTsKLQkJICAkJC5zaXplID0gU0laRV9VTlNQRUM7Ci0JCSAgJCQuc2NhbGUgPSAxOwotCQl9Ci0JOwotCi0vKiBBbiBhZGRyZXNzIG9yIGRhdGEgcmVnaXN0ZXIsIG9yIGEgc3VwcHJlc3NlZCBhZGRyZXNzIG9yIGRhdGEKLSAgIHJlZ2lzdGVyLiAgKi8KLQotemFkcjoKLQkgIHpkcgotCXwgQVIKLQl8IFpBUgotCTsKLQotLyogQSBkYXRhIHJlZ2lzdGVyIHdoaWNoIG1heSBiZSBzdXBwcmVzc2VkLiAgKi8KLQotemRyOgotCSAgRFIKLQl8IFpEUgotCTsKLQotLyogRWl0aGVyIGFuIGFkZHJlc3MgcmVnaXN0ZXIgb3IgdGhlIFBDLiAgKi8KLQotYXBjOgotCSAgQVIKLQl8IExQQwotCTsKLQotLyogRWl0aGVyIGFuIGFkZHJlc3MgcmVnaXN0ZXIsIG9yIHRoZSBQQywgb3IgYSBzdXBwcmVzc2VkIGFkZHJlc3MKLSAgIHJlZ2lzdGVyLCBvciBhIHN1cHByZXNzZWQgUEMuICAqLwotCi16YXBjOgotCSAgYXBjCi0JfCBMWlBDCi0JfCBaQVIKLQk7Ci0KLS8qIEFuIG9wdGlvbmFsIHphcGMuICAqLwotCi1vcHR6YXBjOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gWkFERFIwOwotCQl9Ci0JfCB6YXBjCi0JOwotCi0vKiBUaGUgUEMsIG9wdGlvbmFsbHkgc3VwcHJlc3NlZC4gICovCi0KLXpwYzoKLQkgIExQQwotCXwgTFpQQwotCTsKLQotLyogJywnIHphcGMgd2hlbiBpdCBtYXkgYmUgb21pdHRlZC4gICovCi0KLW9wdGN6YXBjOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gWkFERFIwOwotCQl9Ci0JfCAnLCcgemFwYwotCQl7Ci0JCSAgJCQgPSAkMjsKLQkJfQotCTsKLQotLyogJywnIEVYUFIgd2hlbiBpdCBtYXkgYmUgb21pdHRlZC4gICovCi0KLW9wdGNleHByOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkLmV4cC5YX29wID0gT19hYnNlbnQ7Ci0JCSAgJCQuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQl9Ci0JfCAnLCcgRVhQUgotCQl7Ci0JCSAgJCQgPSAkMjsKLQkJfQotCTsKLQotLyogRVhQUiAnLCcgd2hlbiBpdCBtYXkgYmUgb21pdHRlZC4gICovCi0KLW9wdGV4cHJjOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkLmV4cC5YX29wID0gT19hYnNlbnQ7Ci0JCSAgJCQuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQl9Ci0JfCBFWFBSICcsJwotCQl7Ci0JCSAgJCQgPSAkMTsKLQkJfQotCTsKLQotLyogQSByZWdpc3RlciBsaXN0IGZvciB0aGUgbW92ZW0gaW5zdHJ1Y3Rpb24uICAqLwotCi1yZWdsaXN0OgotCSAgcmVnbGlzdHBhaXIKLQl8IHJlZ2xpc3RwYWlyICcvJyBpcmVnbGlzdAotCQl7Ci0JCSAgJCQgPSAkMSB8ICQzOwotCQl9Ci0JfCByZWdsaXN0cmVnICcvJyBpcmVnbGlzdAotCQl7Ci0JCSAgJCQgPSAoMSA8PCAkMSkgfCAkMzsKLQkJfQotCTsKLQotLyogV2UgdXNlIGlyZWdsaXN0IHdoZW4gd2Uga25vdyB3ZSBhcmUgbG9va2luZyBhdCBhIHJlZ2xpc3QsIGFuZCB3ZQotICAgY2FuIHNhZmVseSByZWR1Y2UgYSBzaW1wbGUgcmVnaXN0ZXIgdG8gcmVnbGlzdHJlZy4gIElmIHdlIHBlcm1pdHRlZAotICAgcmVnbGlzdCB0byByZWR1Y2UgdG8gcmVnbGlzdHJlZywgaXQgd291bGQgYmUgYW1iaWd1b3VzIHdoZXRoZXIgYQotICAgcGxhaW4gcmVnaXN0ZXIgd2VyZSBhIERSRUcvQVJFRy9GUFJFRyBvciBhIFJFR0xTVC4gICovCi0KLWlyZWdsaXN0OgotCSAgcmVnbGlzdHJlZwotCQl7Ci0JCSAgJCQgPSAxIDw8ICQxOwotCQl9Ci0JfCByZWdsaXN0cGFpcgotCXwgcmVnbGlzdHBhaXIgJy8nIGlyZWdsaXN0Ci0JCXsKLQkJICAkJCA9ICQxIHwgJDM7Ci0JCX0KLQl8IHJlZ2xpc3RyZWcgJy8nIGlyZWdsaXN0Ci0JCXsKLQkJICAkJCA9ICgxIDw8ICQxKSB8ICQzOwotCQl9Ci0JOwotCi1yZWdsaXN0cGFpcjoKLQkgIHJlZ2xpc3RyZWcgJy0nIHJlZ2xpc3RyZWcKLQkJewotCQkgIGlmICgkMSA8PSAkMykKLQkJICAgICQkID0gKDEgPDwgKCQzICsgMSkpIC0gMSAtICgoMSA8PCAkMSkgLSAxKTsKLQkJICBlbHNlCi0JCSAgICAkJCA9ICgxIDw8ICgkMSArIDEpKSAtIDEgLSAoKDEgPDwgJDMpIC0gMSk7Ci0JCX0KLQk7Ci0KLXJlZ2xpc3RyZWc6Ci0JICBEUgotCQl7Ci0JCSAgJCQgPSAkMSAtIERBVEEwOwotCQl9Ci0JfCBBUgotCQl7Ci0JCSAgJCQgPSAkMSAtIEFERFIwICsgODsKLQkJfQotCXwgRlBSCi0JCXsKLQkJICAkJCA9ICQxIC0gRlAwICsgMTY7Ci0JCX0KLQl8IEZQQ1IKLQkJewotCQkgIGlmICgkMSA9PSBGUEkpCi0JCSAgICAkJCA9IDI0OwotCQkgIGVsc2UgaWYgKCQxID09IEZQUykKLQkJICAgICQkID0gMjU7Ci0JCSAgZWxzZQotCQkgICAgJCQgPSAyNjsKLQkJfQotCTsKLQotJSUKLQotLyogVGhlIHN0cmluZyB0byBwYXJzZSBpcyBzdG9yZWQgaGVyZSwgYW5kIG1vZGlmaWVkIGJ5IHl5bGV4LiAgKi8KLQotc3RhdGljIGNoYXIgKnN0cjsKLQotLyogVGhlIG9yaWdpbmFsIHN0cmluZyBwb2ludGVyLiAgKi8KLQotc3RhdGljIGNoYXIgKnN0cm9yaWc7Ci0KLS8qIElmICpDQ1AgY291bGQgYmUgYSByZWdpc3RlciwgcmV0dXJuIHRoZSByZWdpc3RlciBudW1iZXIgYW5kIGFkdmFuY2UKLSAgICpDQ1AuICBPdGhlcndpc2UgZG9uJ3QgY2hhbmdlICpDQ1AsIGFuZCByZXR1cm4gMC4gICovCi0KLXN0YXRpYyBlbnVtIG02OGtfcmVnaXN0ZXIKLW02OGtfcmVnX3BhcnNlIChjY3ApCi0gICAgIHJlZ2lzdGVyIGNoYXIgKipjY3A7Ci17Ci0gIGNoYXIgKnN0YXJ0ID0gKmNjcDsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzeW1ib2xTICpzeW1ib2xwOwotCi0gIGlmIChmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpCi0gICAgewotICAgICAgaWYgKCpzdGFydCA9PSBSRUdJU1RFUl9QUkVGSVgpCi0Jc3RhcnQrKzsKLSAgICAgIHAgPSBzdGFydDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKnN0YXJ0ICE9IFJFR0lTVEVSX1BSRUZJWCkKLQlyZXR1cm4gMDsKLSAgICAgIHAgPSBzdGFydCArIDE7Ci0gICAgfQotCi0gIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKCpwKSkKLSAgICByZXR1cm4gMDsKLQotICBwKys7Ci0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCpwKSAmJiAqcCAhPSAnLicgJiYgKnAgIT0gJzonICYmICpwICE9ICcqJykKLSAgICBwKys7Ci0KLSAgYyA9ICpwOwotICAqcCA9IDA7Ci0gIHN5bWJvbHAgPSBzeW1ib2xfZmluZCAoc3RhcnQpOwotICAqcCA9IGM7Ci0KLSAgaWYgKHN5bWJvbHAgIT0gTlVMTCAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xwKSA9PSByZWdfc2VjdGlvbikKLSAgICB7Ci0gICAgICAqY2NwID0gcDsKLSAgICAgIHJldHVybiBTX0dFVF9WQUxVRSAoc3ltYm9scCk7Ci0gICAgfQotCi0gIC8qIEluIE1SSSBtb2RlLCBzb21ldGhpbmcgbGlrZSBmb28uYmFyIGNhbiBiZSBlcXVhdGVkIHRvIGEgcmVnaXN0ZXIKLSAgICAgbmFtZS4gICovCi0gIHdoaWxlIChmbGFnX21yaSAmJiBjID09ICcuJykKLSAgICB7Ci0gICAgICArK3A7Ci0gICAgICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lICgqcCkgJiYgKnAgIT0gJy4nICYmICpwICE9ICc6JyAmJiAqcCAhPSAnKicpCi0JcCsrOwotICAgICAgYyA9ICpwOwotICAgICAgKnAgPSAnXDAnOwotICAgICAgc3ltYm9scCA9IHN5bWJvbF9maW5kIChzdGFydCk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoc3ltYm9scCAhPSBOVUxMICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbHApID09IHJlZ19zZWN0aW9uKQotCXsKLQkgICpjY3AgPSBwOwotCSAgcmV0dXJuIFNfR0VUX1ZBTFVFIChzeW1ib2xwKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgbGV4ZXIuICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICBlbnVtIG02OGtfcmVnaXN0ZXIgcmVnOwotICBjaGFyICpzOwotICBpbnQgcGFyZW5zOwotICBpbnQgYyA9IDA7Ci0gIGludCB0YWlsID0gMDsKLSAgY2hhciAqaG9sZDsKLQotICBpZiAoKnN0ciA9PSAnICcpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgPT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLQotICAvKiBWYXJpb3VzIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUganVzdCByZXR1cm5lZCBkaXJlY3RseS4gICovCi0gIHN3aXRjaCAoKnN0cikKLSAgICB7Ci0gICAgY2FzZSAnQCc6Ci0gICAgICAvKiBJbiBNUkkgbW9kZSwgdGhpcyBjYW4gYmUgdGhlIHN0YXJ0IG9mIGFuIG9jdGFsIG51bWJlci4gICovCi0gICAgICBpZiAoZmxhZ19tcmkpCi0JewotCSAgaWYgKGlzZGlnaXQgKHN0clsxXSkKLQkgICAgICB8fCAoKHN0clsxXSA9PSAnKycgfHwgc3RyWzFdID09ICctJykKLQkJICAmJiBpc2RpZ2l0IChzdHJbMl0pKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICcjJzoKLSAgICBjYXNlICcmJzoKLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICcpJzoKLSAgICBjYXNlICcvJzoKLSAgICBjYXNlICdbJzoKLSAgICBjYXNlICddJzoKLSAgICAgIHJldHVybiAqc3RyKys7Ci0gICAgY2FzZSAnKyc6Ci0gICAgICAvKiBJdCBzbyBoYXBwZW5zIHRoYXQgYSAnKycgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQgb2YgYW4KLSAgICAgICAgIG9wZXJhbmQuICBJZiBpdCBhcHBlYXJzIGFueXdoZXJlIGVsc2UsIGl0IG11c3QgYmUgYSB1bmFyeQotICAgICAgICAgcGx1cyBvbiBhbiBleHByZXNzaW9uLiAgKi8KLSAgICAgIGlmIChzdHJbMV0gPT0gJ1wwJykKLQlyZXR1cm4gKnN0cisrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnLSc6Ci0gICAgICAvKiBBICctJyBjYW4gb25seSBhcHBlYXIgaW4gLShhciksIHJuLXJuLCBvciBhckAtLiAgSWYgaXQKLSAgICAgICAgIGFwcGVhcnMgYW55d2hlcmUgZWxzZSwgaXQgbXVzdCBiZSBhIHVuYXJ5IG1pbnVzIG9uIGFuCi0gICAgICAgICBleHByZXNzaW9uLiAgKi8KLSAgICAgIGlmIChzdHJbMV0gPT0gJ1wwJykKLQlyZXR1cm4gKnN0cisrOwotICAgICAgcyA9IHN0ciArIDE7Ci0gICAgICBpZiAoKnMgPT0gJygnKQotCSsrczsKLSAgICAgIGlmIChtNjhrX3JlZ19wYXJzZSAoJnMpICE9IDApCi0JcmV0dXJuICpzdHIrKzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJygnOgotICAgICAgLyogQSAnKCcgY2FuIG9ubHkgYXBwZWFyIGluIGAocmVnKScsIGAoZXhwciwuLi4nLCBgKFsnLCBgQCgnLCBvcgotICAgICAgICAgYCkoJy4gIElmIGl0IGFwcGVhcnMgYW55d2hlcmUgZWxzZSwgaXQgbXVzdCBiZSBzdGFydGluZyBhbgotICAgICAgICAgZXhwcmVzc2lvbi4gICovCi0gICAgICBpZiAoc3RyWzFdID09ICdbJwotCSAgfHwgKHN0ciA+IHN0cm9yaWcKLQkgICAgICAmJiAoc3RyWy0xXSA9PSAnQCcKLQkJICB8fCBzdHJbLTFdID09ICcpJykpKQotCXJldHVybiAqc3RyKys7Ci0gICAgICBzID0gc3RyICsgMTsKLSAgICAgIGlmIChtNjhrX3JlZ19wYXJzZSAoJnMpICE9IDApCi0JcmV0dXJuICpzdHIrKzsKLSAgICAgIC8qIENoZWNrIGZvciB0aGUgY2FzZSBvZiAnKGV4cHIsLi4uJyBieSBzY2FubmluZyBhaGVhZC4gIElmIHdlCi0gICAgICAgICBmaW5kIGEgY29tbWEgb3V0c2lkZSBvZiBiYWxhbmNlZCBwYXJlbnRoZXNlcywgd2UgcmV0dXJuICcoJy4KLSAgICAgICAgIElmIHdlIGZpbmQgYW4gdW5iYWxhbmNlZCByaWdodCBwYXJlbnRoZXNpcywgdGhlbiBwcmVzdW1hYmx5Ci0gICAgICAgICB0aGUgJygnIHJlYWxseSBzdGFydHMgYW4gZXhwcmVzc2lvbi4gICovCi0gICAgICBwYXJlbnMgPSAwOwotICAgICAgZm9yIChzID0gc3RyICsgMTsgKnMgIT0gJ1wwJzsgcysrKQotCXsKLQkgIGlmICgqcyA9PSAnKCcpCi0JICAgICsrcGFyZW5zOwotCSAgZWxzZSBpZiAoKnMgPT0gJyknKQotCSAgICB7Ci0JICAgICAgaWYgKHBhcmVucyA9PSAwKQotCQlicmVhazsKLQkgICAgICAtLXBhcmVuczsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnMgPT0gJywnICYmIHBhcmVucyA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogQSBjb21tYSBjYW4gbm90IG5vcm1hbGx5IGFwcGVhciBpbiBhbiBleHByZXNzaW9uLCBzbwotCQkgdGhpcyBpcyBhIGNhc2Ugb2YgJyhleHByLC4uLicuICAqLwotCSAgICAgIHJldHVybiAqc3RyKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBpdCdzIGEgcmVnaXN0ZXIuICAqLwotCi0gIHJlZyA9IG02OGtfcmVnX3BhcnNlICgmc3RyKTsKLSAgaWYgKHJlZyAhPSAwKQotICAgIHsKLSAgICAgIGludCByZXQ7Ci0KLSAgICAgIHl5bHZhbC5yZWcgPSByZWc7Ci0KLSAgICAgIGlmIChyZWcgPj0gREFUQTAgJiYgcmVnIDw9IERBVEE3KQotCXJldCA9IERSOwotICAgICAgZWxzZSBpZiAocmVnID49IEFERFIwICYmIHJlZyA8PSBBRERSNykKLQlyZXQgPSBBUjsKLSAgICAgIGVsc2UgaWYgKHJlZyA+PSBGUDAgJiYgcmVnIDw9IEZQNykKLQlyZXR1cm4gRlBSOwotICAgICAgZWxzZSBpZiAocmVnID09IEZQSQotCSAgICAgICB8fCByZWcgPT0gRlBTCi0JICAgICAgIHx8IHJlZyA9PSBGUEMpCi0JcmV0dXJuIEZQQ1I7Ci0gICAgICBlbHNlIGlmIChyZWcgPT0gUEMpCi0JcmV0dXJuIExQQzsKLSAgICAgIGVsc2UgaWYgKHJlZyA+PSBaREFUQTAgJiYgcmVnIDw9IFpEQVRBNykKLQlyZXQgPSBaRFI7Ci0gICAgICBlbHNlIGlmIChyZWcgPj0gWkFERFIwICYmIHJlZyA8PSBaQUREUjcpCi0JcmV0ID0gWkFSOwotICAgICAgZWxzZSBpZiAocmVnID09IFpQQykKLQlyZXR1cm4gTFpQQzsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQ1JFRzsKLQotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGhhdmUgYSBkYXRhIG9yIGFkZHJlc3MgcmVnaXN0ZXIuICBXZQotCSBtdXN0IGNoZWNrIGZvciBhIHNpemUgb3Igc2NhbGU7IGlmIHdlIGZpbmQgb25lLCB3ZSBtdXN0Ci0JIHJldHVybiBJTkRFWFJFRy4gICovCi0KLSAgICAgIHMgPSBzdHI7Ci0KLSAgICAgIGlmICgqcyAhPSAnLicgJiYgKnMgIT0gJzonICYmICpzICE9ICcqJykKLQlyZXR1cm4gcmV0OwotCi0gICAgICB5eWx2YWwuaW5kZXhyZWcucmVnID0gcmVnOwotCi0gICAgICBpZiAoKnMgIT0gJy4nICYmICpzICE9ICc6JykKLQl5eWx2YWwuaW5kZXhyZWcuc2l6ZSA9IFNJWkVfVU5TUEVDOwotICAgICAgZWxzZQotCXsKLQkgICsrczsKLQkgIHN3aXRjaCAoKnMpCi0JICAgIHsKLQkgICAgY2FzZSAndyc6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIHl5bHZhbC5pbmRleHJlZy5zaXplID0gU0laRV9XT1JEOwotCSAgICAgICsrczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbCc6Ci0JICAgIGNhc2UgJ0wnOgotCSAgICAgIHl5bHZhbC5pbmRleHJlZy5zaXplID0gU0laRV9MT05HOwotCSAgICAgICsrczsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICB5eWVycm9yIChfKCJpbGxlZ2FsIHNpemUgc3BlY2lmaWNhdGlvbiIpKTsKLQkgICAgICB5eWx2YWwuaW5kZXhyZWcuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICB5eWx2YWwuaW5kZXhyZWcuc2NhbGUgPSAxOwotCi0gICAgICBpZiAoKnMgPT0gJyonIHx8ICpzID09ICc6JykKLQl7Ci0JICBleHByZXNzaW9uUyBzY2FsZTsKLQotCSAgKytzOwotCi0JICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQkgIGV4cHJlc3Npb24gKCZzY2FsZSk7Ci0JICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotCSAgaWYgKHNjYWxlLlhfb3AgIT0gT19jb25zdGFudCkKLQkgICAgeXllcnJvciAoXygic2NhbGUgc3BlY2lmaWNhdGlvbiBtdXN0IHJlc29sdmUgdG8gYSBudW1iZXIiKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHNjYWxlLlhfYWRkX251bWJlcikKLQkJewotCQljYXNlIDE6Ci0JCWNhc2UgMjoKLQkJY2FzZSA0OgotCQljYXNlIDg6Ci0JCSAgeXlsdmFsLmluZGV4cmVnLnNjYWxlID0gc2NhbGUuWF9hZGRfbnVtYmVyOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIHl5ZXJyb3IgKF8oImludmFsaWQgc2NhbGUgdmFsdWUiKSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgc3RyID0gczsKLQotICAgICAgcmV0dXJuIElOREVYUkVHOwotICAgIH0KLQotICAvKiBJdCBtdXN0IGJlIGFuIGV4cHJlc3Npb24uICBCZWZvcmUgd2UgY2FsbCBleHByZXNzaW9uLCB3ZSBuZWVkIHRvCi0gICAgIGxvb2sgYWhlYWQgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc2l6ZSBzcGVjaWZpY2F0aW9uLiAgV2UgbXVzdCBkbwotICAgICB0aGF0IGZpcnN0LCBiZWNhdXNlIG90aGVyd2lzZSBmb28ubCB3aWxsIGJlIHRyZWF0ZWQgYXMgdGhlIHN5bWJvbAotICAgICBmb28ubCwgcmF0aGVyIHRoYW4gYXMgdGhlIHN5bWJvbCBmb28gd2l0aCBhIGxvbmcgc2l6ZQotICAgICBzcGVjaWZpY2F0aW9uLiAgVGhlIGdyYW1tYXIgcmVxdWlyZXMgdGhhdCBhbGwgZXhwcmVzc2lvbnMgZW5kIGF0Ci0gICAgIHRoZSBlbmQgb2YgdGhlIG9wZXJhbmQsIG9yIHdpdGggJywnLCAnKCcsICddJywgJyknLiAgKi8KLQotICBwYXJlbnMgPSAwOwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCc7IHMrKykKLSAgICB7Ci0gICAgICBpZiAoKnMgPT0gJygnKQotCXsKLQkgIGlmIChwYXJlbnMgPT0gMAotCSAgICAgICYmIHMgPiBzdHIKLQkgICAgICAmJiAoc1stMV0gPT0gJyknIHx8IGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzWy0xXSkpKQotCSAgICBicmVhazsKLQkgICsrcGFyZW5zOwotCX0KLSAgICAgIGVsc2UgaWYgKCpzID09ICcpJykKLQl7Ci0JICBpZiAocGFyZW5zID09IDApCi0JICAgIGJyZWFrOwotCSAgLS1wYXJlbnM7Ci0JfQotICAgICAgZWxzZSBpZiAocGFyZW5zID09IDAKLQkgICAgICAgJiYgKCpzID09ICcsJyB8fCAqcyA9PSAnXScpKQotCWJyZWFrOwotICAgIH0KLQotICB5eWx2YWwuZXhwLnNpemUgPSBTSVpFX1VOU1BFQzsKLSAgaWYgKHMgPD0gc3RyICsgMgotICAgICAgfHwgKHNbLTJdICE9ICcuJyAmJiBzWy0yXSAhPSAnOicpKQotICAgIHRhaWwgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChzWy0xXSkKLQl7Ci0JY2FzZSAncyc6Ci0JY2FzZSAnUyc6Ci0JY2FzZSAnYic6Ci0JY2FzZSAnQic6Ci0JICB5eWx2YWwuZXhwLnNpemUgPSBTSVpFX0JZVEU7Ci0JICBicmVhazsKLQljYXNlICd3JzoKLQljYXNlICdXJzoKLQkgIHl5bHZhbC5leHAuc2l6ZSA9IFNJWkVfV09SRDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCWNhc2UgJ0wnOgotCSAgeXlsdmFsLmV4cC5zaXplID0gU0laRV9MT05HOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICh5eWx2YWwuZXhwLnNpemUgIT0gU0laRV9VTlNQRUMpCi0JdGFpbCA9IDI7Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VMRgotICB7Ci0gICAgLyogTG9vayBmb3IgQFBMVFBDLCBldGMuICAqLwotICAgIGNoYXIgKmNwOwotCi0gICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfbm9uZTsKLSAgICBjcCA9IHMgLSB0YWlsOwotICAgIGlmIChjcCAtIDYgPiBzdHIgJiYgY3BbLTZdID09ICdAJykKLSAgICAgIHsKLQlpZiAoc3RybmNtcCAoY3AgLSA2LCAiQFBMVFBDIiwgNikgPT0gMCkKLQkgIHsKLQkgICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfcGx0X3BjcmVsOwotCSAgICB0YWlsICs9IDY7Ci0JICB9Ci0JZWxzZSBpZiAoc3RybmNtcCAoY3AgLSA2LCAiQEdPVFBDIiwgNikgPT0gMCkKLQkgIHsKLQkgICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfZ290X3BjcmVsOwotCSAgICB0YWlsICs9IDY7Ci0JICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoY3AgLSA0ID4gc3RyICYmIGNwWy00XSA9PSAnQCcpCi0gICAgICB7Ci0JaWYgKHN0cm5jbXAgKGNwIC0gNCwgIkBQTFQiLCA0KSA9PSAwKQotCSAgewotCSAgICB5eWx2YWwuZXhwLnBpY19yZWxvYyA9IHBpY19wbHRfb2ZmOwotCSAgICB0YWlsICs9IDQ7Ci0JICB9Ci0JZWxzZSBpZiAoc3RybmNtcCAoY3AgLSA0LCAiQEdPVCIsIDQpID09IDApCi0JICB7Ci0JICAgIHl5bHZhbC5leHAucGljX3JlbG9jID0gcGljX2dvdF9vZmY7Ci0JICAgIHRhaWwgKz0gNDsKLQkgIH0KLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgaWYgKHRhaWwgIT0gMCkKLSAgICB7Ci0gICAgICBjID0gc1stdGFpbF07Ci0gICAgICBzWy10YWlsXSA9IDA7Ci0gICAgfQotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgZXhwcmVzc2lvbiAoJnl5bHZhbC5leHAuZXhwKTsKLSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0gIGlmICh0YWlsICE9IDApCi0gICAgewotICAgICAgc1stdGFpbF0gPSBjOwotICAgICAgc3RyID0gczsKLSAgICB9Ci0KLSAgcmV0dXJuIEVYUFI7Ci19Ci0KLS8qIFBhcnNlIGFuIG02OGsgb3BlcmFuZC4gIFRoaXMgaXMgdGhlIG9ubHkgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkCi0gICBmcm9tIG91dHNpZGUgdGhpcyBmaWxlLiAgKi8KLQotaW50Ci1tNjhrX2lwX29wIChzLCBvcGFyZykKLSAgICAgY2hhciAqczsKLSAgICAgc3RydWN0IG02OGtfb3AgKm9wYXJnOwotewotICBtZW1zZXQgKG9wYXJnLCAwLCBzaXplb2YgKm9wYXJnKTsKLSAgb3BhcmctPmVycm9yID0gTlVMTDsKLSAgb3BhcmctPmluZGV4LnJlZyA9IFpEQVRBMDsKLSAgb3BhcmctPmluZGV4LnNjYWxlID0gMTsKLSAgb3BhcmctPmRpc3AuZXhwLlhfb3AgPSBPX2Fic2VudDsKLSAgb3BhcmctPm9kaXNwLmV4cC5YX29wID0gT19hYnNlbnQ7Ci0KLSAgc3RyID0gc3Ryb3JpZyA9IHM7Ci0gIG9wID0gb3Bhcmc7Ci0KLSAgcmV0dXJuIHl5cGFyc2UgKCk7Ci19Ci0KLS8qIFRoZSBlcnJvciBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXl5ZXJyb3IgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIG9wLT5lcnJvciA9IHM7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL204OGstb3Bjb2RlLmggYi9nYXMvY29uZmlnL204OGstb3Bjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDY0YmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qIG04OGstb3Bjb2RlLmggLS0gSW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMAotICAgQ29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbyBVbml2ZXJzaXR5Ci0gICBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKgotICBDaGFyYWN0ZXIgY29kZXMgZm9yIG9wX3NwZWMgZmllbGQgYmVsb3cuCi0gIFJlc2VydmVkIGZvciBzZWxmLW1hdGNoaW5nOiBbIF0gLAotCi0gIGQgPSBHUkYgRGVzdGluYXRpb24gcmVnaXN0ZXIgKDIxOjUpCi0gIHggPSBYUkYgcmVnaXN0ZXIgcHJlZml4LiAgTWFrZXMgbmV4dCBkLCAxLCBvciAyLCBtYXRjaCBhbiBleHRlbmRlZCByZWdpc3Rlci4KLSAgMSA9IFNvdXJjZSByZWdpc3RlciAxICgxNjo1KQotICAyID0gU291cmNlIHJlZ2lzdGVyIDIgKDA6NSkKLSAgMyA9IEJvdGggc291cmNlIHJlZ2lzdGVycyAoc2FtZSB2YWx1ZSkgKDA6NSBhbmQgMTY6NSkKLSAgSSA9IElNTTE2ICgwOjE2KQotICBiID0gYml0IGZpZWxkIHNwZWMuICgwOjEwKQotICBwID0gMTYgYml0IHBjIGRpc3BsLiAoMDoxNikKLSAgUCA9IDI2IGJpdCBwYyBkaXNwbC4gKDA6MjYpCi0gIEIgPSBiYjAvYmIxIGNvbmRpdGlvbiAoMjE6NSkKLSAgTSA9IGJjbmQgY29uZGl0aW9uICgyMTo1KQotICBmID0gZmNyICg1OjYpCi0gIGMgPSBjciAoNTo2KQotICBWID0gVkVDOSAoMDo5KQotICBvID0gTzYgZmllbGQgb2YgInByb3QiIGluc24gKDEwOjcpCi0gID8gPSBHaXZlIHdhcm5pbmcgZm9yIHRoaXMgaW5zbi9vcGVyYW5kIGNvbWJpbmF0aW9uCi0gKi8KLQotLyogaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KLQotc3RydWN0IG04OGtfb3Bjb2RlCi17Ci0gIHVuc2lnbmVkIGludCBvcGNvZGU7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKm9wX3NwZWM7Ci19OwotCi0vKiBhbmQgaW50cm9kdWNpbmcuLi4gdGhlIE1vdG9yb2xhIDg4MTAwIGFuZCA4ODExMCBpbnN0cnVjdGlvbiBzZXRzLi4uICovCi0KLS8qIEJ5IGRlZmF1bHQsIGluY2x1ZGUgdGhlIDg4MTEwIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIE1DODgxMTAKLQotI2lmIGRlZmluZWQgKE1DODgxMTApCi0jZGVmaW5lIF9NQzg4MTAwKE9QQ09ERSxNTkVNLE9QX1NQRUMpCi0jZGVmaW5lIF9NQzg4MTEwKE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKLSNlbHNlCi0jZGVmaW5lIF9NQzg4MTAwKE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKLSNkZWZpbmUgX01DODgxMTAoT1BDT0RFLE1ORU0sT1BfU1BFQykKLSNlbmRpZgotCi0jZGVmaW5lIF9NQzg4eHh4KE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKLQotLyogRXF1YWwgbW5lbW9uaWNzIG11c3QgYmUgYWRqYWNlbnQuCi0gICBNb3JlIHNwZWNpZmljIG9wZXJhbmQgc3BlY2lmaWNhdGlvbiBtdXN0IGdvIGJlZm9yZSBtb3JlIGdlbmVyYWwuCi0gICBGb3IgZXhhbXBsZSwgImQsMSwyIiBtdXN0IGdvIGJlZm9yZSAiZCwxLEkiIGFzIGEgcmVnaXN0ZXIgZm9yIHMyCi0gICB3b3VsZCBvdGhlcndpc2UgYmUgY29uc2lkZXJlZCBhIHZhcmlhYmxlIG5hbWUuICAqLwotCi1zdGF0aWMgc3RydWN0IG04OGtfb3Bjb2RlIG04OGtfb3Bjb2Rlc1tdID0KLXsKLSAgLyoJICAgT3Bjb2RlCU1uZW1vbmljCU9wc3BlYyAqLwotCi0gIF9NQzg4eHh4ICgweGY0MDA3MDAwLCAiYWRkIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDcwMDAwMDAwLCAiYWRkIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA3MjAwLCAiYWRkLmNpIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDczMDAsICJhZGQuY2lvIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDcxMDAsICJhZGQuY28iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImFkZHUiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NjAwMDAwMDAsICJhZGR1IiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MjAwLCAiYWRkdS5jaSIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MzAwLCAiYWRkdS5jaW8iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNjEwMCwgImFkZHUuY28iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNDAwMCwgImFuZCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg0MDAwMDAwMCwgImFuZCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNDQwMCwgImFuZC5jIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4NDQwMDAwMDAsICJhbmQudSIsCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGQwMDAwMDAwLCAiYmIwIiwJCSJCLDEscCIpCi0gIF9NQzg4eHh4ICgweGQ0MDAwMDAwLCAiYmIwLm4iLAkiQiwxLHAiKQotICBfTUM4OHh4eCAoMHhkODAwMDAwMCwgImJiMSIsCQkiQiwxLHAiKQotICBfTUM4OHh4eCAoMHhkYzAwMDAwMCwgImJiMS5uIiwJIkIsMSxwIikKLSAgX01DODh4eHggKDB4ZTgwMDAwMDAsICJiY25kIiwJCSJNLDEscCIpCi0gIF9NQzg4eHh4ICgweGVjMDAwMDAwLCAiYmNuZC5uIiwJIk0sMSxwIikKLSAgX01DODh4eHggKDB4YzAwMDAwMDAsICJiciIsCQkiUCIpCi0gIF9NQzg4eHh4ICgweGM0MDAwMDAwLCAiYnIubiIsCQkiUCIpCi0gIF9NQzg4eHh4ICgweGM4MDAwMDAwLCAiYnNyIiwJCSJQIikKLSAgX01DODh4eHggKDB4Y2MwMDAwMDAsICJic3IubiIsCSJQIikKLSAgX01DODh4eHggKDB4ZjQwMDgwMDAsICJjbHIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjAwMDgwMDAsICJjbHIiLAkJImQsMSxiIikKLSAgX01DODh4eHggKDB4ZjQwMDdjMDAsICJjbXAiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4N2MwMDAwMDAsICJjbXAiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDc4MDAsICJkaXYiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NzgwMDAwMDAsICJkaXYiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDc4MDAsICJkaXZzIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDc4MDAwMDAwLCAiZGl2cyIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmNDAwNjkwMCwgImRpdnUuZCIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2ODAwLCAiZGl2dSIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2ODAwMDAwMCwgImRpdnUiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDkwMDAsICJleHQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjAwMDkwMDAsICJleHQiLAkJImQsMSxiIikKLSAgX01DODh4eHggKDB4ZjQwMDk4MDAsICJleHR1IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDA5ODAwLCAiZXh0dSIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHg4NDAwMjgwMCwgImZhZGQuc3NzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGE4MDAsICJmYWRkLnNzcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyODgwLCAiZmFkZC5zc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTgyMCwgImZhZGQuc3NkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGE4NDAsICJmYWRkLnNzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyYTAwLCAiZmFkZC5zZHMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTg4MCwgImZhZGQuc2RzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDJhODAsICJmYWRkLnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBhOGEwLCAiZmFkZC5zZGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYThjMCwgImZhZGQuc2R4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGE5MDAsICJmYWRkLnN4cyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhOTIwLCAiZmFkZC5zeGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTk0MCwgImZhZGQuc3h4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDI4MjAsICJmYWRkLmRzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYTAwLCAiZmFkZC5kc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMjhhMCwgImZhZGQuZHNkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhMjAsICJmYWRkLmRzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYTQwLCAiZmFkZC5kc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMmEyMCwgImZhZGQuZGRzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhODAsICJmYWRkLmRkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyYWEwLCAiZmFkZC5kZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWFhMCwgImZhZGQuZGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhYzAsICJmYWRkLmRkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYjAwLCAiZmFkZC5keHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWIyMCwgImZhZGQuZHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFiNDAsICJmYWRkLmR4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYzAwLCAiZmFkZC54c3MiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWMyMCwgImZhZGQueHNkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFjNDAsICJmYWRkLnhzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYzgwLCAiZmFkZC54ZHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWNhMCwgImZhZGQueGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFjYzAsICJmYWRkLnhkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhZDAwLCAiZmFkZC54eHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWQyMCwgImZhZGQueHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFkNDAsICJmYWRkLnh4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzYTgwLCAiZmNtcC5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmE4MCwgImZjbXAuc2RkIiwJImQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwM2EwMCwgImZjbXAuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGJhMDAsICJmY21wLnNkcyIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGJiMDAsICJmY21wLnNkeCIsCSJkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDM4ODAsICJmY21wLnNzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiODgwLCAiZmNtcC5zc2QiLAkiZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzODAwLCAiZmNtcC5zc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjgwMCwgImZjbXAuc3NzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjkwMCwgImZjbXAuc3N4IiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmM4MCwgImZjbXAuc3hkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmMwMCwgImZjbXAuc3hzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmQwMCwgImZjbXAuc3h4IiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwM2FhMCwgImZjbXB1LnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYWEwLCAiZmNtcHUuc2RkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwM2EyMCwgImZjbXB1LnNkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYTIwLCAiZmNtcHUuc2RzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmIyMCwgImZjbXB1LnNkeCIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDM4YTAsICJmY21wdS5zc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjhhMCwgImZjbXB1LnNzZCIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDM4MjAsICJmY21wdS5zc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjgyMCwgImZjbXB1LnNzcyIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI5MjAsICJmY21wdS5zc3giLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiY2EwLCAiZmNtcHUuc3hkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmMyMCwgImZjbXB1LnN4cyIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGJkMjAsICJmY21wdS5zeHgiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDAwODgwLCAiZmN2dC5kcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODg4MCwgImZjdnQuZHMiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODhjMCwgImZjdnQuZHgiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwMDgyMCwgImZjdnQuc2QiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMDg4MjAsICJmY3Z0LnNkIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg4NDAsICJmY3Z0LnN4IiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg5MjAsICJmY3Z0LnhkIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg5MDAsICJmY3Z0LnhzIiwJInhkLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcwMDAsICJmZGl2LnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMDAwLCAiZmRpdi5zc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzA4MCwgImZkaXYuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwMjAsICJmZGl2LnNzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMDQwLCAiZmRpdi5zc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzIwMCwgImZkaXYuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwODAsICJmZGl2LnNkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA3MjgwLCAiZmRpdi5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjBhMCwgImZkaXYuc2RkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwYzAsICJmZGl2LnNkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMTAwLCAiZmRpdi5zeHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjEyMCwgImZkaXYuc3hkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYxNDAsICJmZGl2LnN4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA3MDIwLCAiZmRpdi5kc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjIwMCwgImZkaXYuZHNzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcwYTAsICJmZGl2LmRzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMjIwLCAiZmRpdi5kc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjI0MCwgImZkaXYuZHN4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcyMjAsICJmZGl2LmRkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMjgwLCAiZmRpdi5kZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzJhMCwgImZkaXYuZGRkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYyYTAsICJmZGl2LmRkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMmMwLCAiZmRpdi5kZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjMwMCwgImZkaXYuZHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYzMjAsICJmZGl2LmR4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMzQwLCAiZmRpdi5keHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjQwMCwgImZkaXYueHNzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY0MjAsICJmZGl2LnhzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNDQwLCAiZmRpdi54c3giLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjQ4MCwgImZkaXYueGRzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY0YTAsICJmZGl2LnhkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNGMwLCAiZmRpdi54ZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjUwMCwgImZkaXYueHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY1MjAsICJmZGl2Lnh4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNTQwLCAiZmRpdi54eHgiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHhmNDAwZWMwMCwgImZmMCIsCQkiZCwyIikKLSAgX01DODh4eHggKDB4ZjQwMGU4MDAsICJmZjEiLAkJImQsMiIpCi0gIF9NQzg4eHh4ICgweDgwMDA0ODAwLCAiZmxkY3IiLAkiZCxmIikKLSAgX01DODh4eHggKDB4ODQwMDIwMjAsICJmbHQuZHMiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMDIyMjAsICJmbHQuZHMiLAkieGQsMiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyMDAwLCAiZmx0LnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDAyMjAwLCAiZmx0LnNzIiwJInhkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwMjI0MCwgImZsdC54cyIsCSJ4ZCwyIikKLSAgX01DODh4eHggKDB4ODQwMDAwMDAsICJmbXVsLnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MDAwLCAiZm11bC5zc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDA4MCwgImZtdWwuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwMjAsICJmbXVsLnNzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MDQwLCAiZm11bC5zc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDIwMCwgImZtdWwuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwODAsICJmbXVsLnNkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAwMjgwLCAiZm11bC5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODBhMCwgImZtdWwuc2RkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwYzAsICJmbXVsLnNkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MTAwLCAiZm11bC5zeHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODEyMCwgImZtdWwuc3hkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgxNDAsICJmbXVsLnN4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAwMDIwLCAiZm11bC5kc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODIwMCwgImZtdWwuZHNzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDAwYTAsICJmbXVsLmRzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MjIwLCAiZm11bC5kc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODI0MCwgImZtdWwuZHN4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDAyMjAsICJmbXVsLmRkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MjgwLCAiZm11bC5kZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDJhMCwgImZtdWwuZGRkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgyYTAsICJmbXVsLmRkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MmMwLCAiZm11bC5kZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODMwMCwgImZtdWwuZHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgzMjAsICJmbXVsLmR4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MzQwLCAiZm11bC5keHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODQwMCwgImZtdWwueHNzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg0MjAsICJmbXVsLnhzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NDQwLCAiZm11bC54c3giLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODQ4MCwgImZtdWwueGRzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg0YTAsICJmbXVsLnhkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NGMwLCAiZm11bC54ZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODUwMCwgImZtdWwueHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg1MjAsICJmbXVsLnh4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NTQwLCAiZm11bC54eHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNzhhMCwgImZzcXJ0LmRkIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmOGEwLCAiZnNxcnQuZGQiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNzg4MCwgImZzcXJ0LmRzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmODgwLCAiZnNxcnQuZHMiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjhjMCwgImZzcXJ0LmR4IiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDc4MjAsICJmc3FydC5zZCIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjgyMCwgImZzcXJ0LnNkIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDc4MDAsICJmc3FydC5zcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjgwMCwgImZzcXJ0LnNzIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY4NDAsICJmc3FydC5zeCIsCSJ4ZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmOTIwLCAiZnNxcnQueGQiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjkwMCwgImZzcXJ0LnhzIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY5NDAsICJmc3FydC54eCIsCSJ4ZCx4MiIpCi0gIF9NQzg4eHh4ICgweDgwMDA4ODAwLCAiZnN0Y3IiLAkiMyxmIikKLSAgX01DODh4eHggKDB4ODQwMDMwMDAsICJmc3ViLnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMDAwLCAiZnN1Yi5zc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzA4MCwgImZzdWIuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwMjAsICJmc3ViLnNzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMDQwLCAiZnN1Yi5zc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzIwMCwgImZzdWIuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwODAsICJmc3ViLnNkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzMjgwLCAiZnN1Yi5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjBhMCwgImZzdWIuc2RkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwYzAsICJmc3ViLnNkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMTAwLCAiZnN1Yi5zeHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjEyMCwgImZzdWIuc3hkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIxNDAsICJmc3ViLnN4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzMDIwLCAiZnN1Yi5kc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjIwMCwgImZzdWIuZHNzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDMwYTAsICJmc3ViLmRzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMjIwLCAiZnN1Yi5kc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjI0MCwgImZzdWIuZHN4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDMyMjAsICJmc3ViLmRkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMjgwLCAiZnN1Yi5kZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzJhMCwgImZzdWIuZGRkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIyYTAsICJmc3ViLmRkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMmMwLCAiZnN1Yi5kZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjMwMCwgImZzdWIuZHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIzMjAsICJmc3ViLmR4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMzQwLCAiZnN1Yi5keHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjQwMCwgImZzdWIueHNzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI0MjAsICJmc3ViLnhzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNDQwLCAiZnN1Yi54c3giLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjQ4MCwgImZzdWIueGRzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI0YTAsICJmc3ViLnhkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNGMwLCAiZnN1Yi54ZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjUwMCwgImZzdWIueHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI1MjAsICJmc3ViLnh4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNTQwLCAiZnN1Yi54eHgiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4MDAwYzgwMCwgImZ4Y3IiLAkJImQsMyxmIikKLSAgX01DODh4eHggKDB4ODQwMGZjMDEsICJpbGxvcDEiLAkiIikKLSAgX01DODh4eHggKDB4ODQwMGZjMDIsICJpbGxvcDIiLAkiIikKLSAgX01DODh4eHggKDB4ODQwMGZjMDMsICJpbGxvcDMiLAkiIikKLSAgX01DODh4eHggKDB4ODQwMDQ4ODAsICJpbnQuc2QiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMGM4ODAsICJpbnQuc2QiLAkiZCx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA0ODAwLCAiaW50LnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBjODAwLCAiaW50LnNzIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzkwMCwgImludC5zeCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ZjQwMGMwMDAsICJqbXAiLAkJIjIiKQotICBfTUM4OHh4eCAoMHhmNDAwYzQwMCwgImptcC5uIiwJIjIiKQotICBfTUM4OHh4eCAoMHhmNDAwYzgwMCwgImpzciIsCQkiMiIpCi0gIF9NQzg4eHh4ICgweGY0MDBjYzAwLCAianNyLm4iLAkiMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxNDAwLCAibGQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDE2MDAsICJsZCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4MTQwMDAwMDAsICJsZCIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmMDAwMTYwMCwgImxkIiwJCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDE0MDAsICJsZCIsCQkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4MDQwMDAwMDAsICJsZCIsCQkieGQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDFlMDAsICJsZC5iIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMWMwMCwgImxkLmIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MWMwMDAwMDAsICJsZC5iIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxZDAwLCAibGQuYi51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMWYwMCwgImxkLmIudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwZTAwLCAibGQuYnUiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDBjMDAsICJsZC5idSIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDBjMDAwMDAwLCAibGQuYnUiLAkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMGQwMCwgImxkLmJ1LnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAwZjAwLCAibGQuYnUudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxMjAwLCAibGQuZCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDEwMDAsICJsZC5kIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDEwMDAwMDAwLCAibGQuZCIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmMDAwMTIwMCwgImxkLmQiLAkJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMTAwMCwgImxkLmQiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDAwMDAwMDAwLCAibGQuZCIsCQkieGQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDExMDAsICJsZC5kLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxMzAwLCAibGQuZC51c3IiLAkiZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDExMDAsICJsZC5kLnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMTMwMCwgImxkLmQudXNyIiwJInhkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMWEwMCwgImxkLmgiLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxODAwLCAibGQuaCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHgxODAwMDAwMCwgImxkLmgiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDE5MDAsICJsZC5oLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxYjAwLCAibGQuaC51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDBhMDAsICJsZC5odSIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMDgwMCwgImxkLmh1IiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4MDgwMDAwMDAsICJsZC5odSIsCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwOTAwLCAibGQuaHUudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDBiMDAsICJsZC5odS51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDE1MDAsICJsZC51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMTcwMCwgImxkLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMTUwMCwgImxkLnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMTcwMCwgImxkLnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDFhMDAsICJsZC54IiwJCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDE4MDAsICJsZC54IiwJCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHgzYzAwMDAwMCwgImxkLngiLAkJInhkLDEsSSIpCi0gIF9NQzg4MTEwICgweGYwMDAxOTAwLCAibGQueC51c3IiLAkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjAwMDFiMDAsICJsZC54LnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDM2MDAsICJsZGEiLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MDAwLCAibGRhIiwJCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYSIsCQkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuYiIsCSI/ZCwxWzJdIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuYiIsCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYS5iIiwJIj9kLDEsSSIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4eHh4ICgweGY0MDAzMjAwLCAibGRhLmQiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuZCIsCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYS5kIiwJIj9kLDEsSSIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4MTEwICgweGY0MDAzZTAwLCAibGRhLngiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDNhMDAsICJsZGEuaCIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImxkYS5oIiwJIj9kLDEsMiIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4eHh4ICgweDYwMDAwMDAwLCAibGRhLmgiLAkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ODAwMDQwMDAsICJsZGNyIiwJCSJkLGMiKQotICBfTUM4OHh4eCAoMHhmNDAwYTAwMCwgIm1hayIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmMDAwYTAwMCwgIm1hayIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHg0ODAwMDAwMCwgIm1hc2siLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4NGMwMDAwMDAsICJtYXNrLnUiLAkiZCwxLEkiKQotICBfTUM4ODExMCAoMHg4NDAwYzAwMCwgIm1vdi5zIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNDIwMCwgIm1vdi5zIiwJInhkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzA4MCwgIm1vdi5kIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNDI4MCwgIm1vdi5kIiwJInhkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzMwMCwgIm1vdiIsCQkieGQseDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNmMwMCwgIm11bCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2YzAwMDAwMCwgIm11bCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNmUwMCwgIm11bHMiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NmMwMDAwMDAsICJtdWxzIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2YzAwLCAibXVsdSIsCQkiZCwxLDIiKQkvKiBzeW5vbnltIGZvciBtdWwgKi8KLSAgX01DODh4eHggKDB4NmMwMDAwMDAsICJtdWx1IiwJCSJkLDEsSSIpCS8qIHN5bm9ueW0gZm9yIG11bCAqLwotICBfTUM4ODExMCAoMHhmNDAwNmQwMCwgIm11bHUuZCIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDg0MDA1MDgwLCAibmludC5zZCIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZDA4MCwgIm5pbnQuc2QiLAkiZCx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA1MDAwLCAibmludC5zcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZDAwMCwgIm5pbnQuc3MiLAkiZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBkMTAwLCAibmludC5zeCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ZjQwMDU4MDAsICJvciIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg1ODAwMDAwMCwgIm9yIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA1YzAwLCAib3IuYyIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg1YzAwMDAwMCwgIm9yLnUiLAkJImQsMSxJIikKLSAgX01DODgxMTAgKDB4ODgwMDIwMjAsICJwYWRkLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjA0MCwgInBhZGQuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMDYwLCAicGFkZCIsCQkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjBhMCwgInBhZGRzLnUuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMGMwLCAicGFkZHMudS5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIwZTAsICJwYWRkcy51IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxMjAsICJwYWRkcy51cy5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxNDAsICJwYWRkcy51cy5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxNjAsICJwYWRkcy51cyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMWEwLCAicGFkZHMucy5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxYzAsICJwYWRkcy5zLmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjFlMCwgInBhZGRzLnMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzg2MCwgInBjbXAiLAkJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDAwMDAsICJwbXVsIiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2NDIwLCAicHBhY2suMzIuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2MjQwLCAicHBhY2suMTYuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2NDQwLCAicHBhY2suMzIuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2MTYwLCAicHBhY2suOCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2MjYwLCAicHBhY2suMTYiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwNjQ2MCwgInBwYWNrLjMyIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDc4MDAsICJwcm90IiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA3MDAwLCAicHJvdCIsCQkiZCwxLG8iKQotICBfTUM4ODExMCAoMHg4ODAwMzAyMCwgInBzdWIuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMDQwLCAicHN1Yi5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMwNjAsICJwc3ViIiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMGEwLCAicHN1YnMudS5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMwYzAsICJwc3Vicy51LmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzBlMCwgInBzdWJzLnUiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzEyMCwgInBzdWJzLnVzLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzE0MCwgInBzdWJzLnVzLmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzE2MCwgInBzdWJzLnVzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMxYTAsICJwc3Vicy5zLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzFjMCwgInBzdWJzLnMuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMWUwLCAicHN1YnMucyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2ODAwLCAicHVucGsubiIsCSJkLDEiKQotICBfTUM4ODExMCAoMHg4ODAwNjgyMCwgInB1bnBrLmIiLAkiZCwxIikKLSAgX01DODgxMTAgKDB4ODgwMDY4NDAsICJwdW5way5oIiwJImQsMSIpCi0gIF9NQzg4eHh4ICgweGY0MDBhODAwLCAicm90IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDBhODAwLCAicm90IiwJCSJkLDEsYiIpCi0gIF9NQzg4eHh4ICgweGY0MDBmYzAwLCAicnRlIiwJCSIiKQotICBfTUM4OHh4eCAoMHhmNDAwODgwMCwgInNldCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmMDAwODgwMCwgInNldCIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHhmNDAwMjYwMCwgInN0IiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMjQwMCwgInN0IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDI0MDAwMDAwLCAic3QiLAkJImQsMSxJIikKLSAgX01DODgxMTAgKDB4ZjAwMDI2MDAsICJzdCIsCQkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyNDAwLCAic3QiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDM0MDAwMDAwLCAic3QiLAkJInhkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyZTAwLCAic3QuYiIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDJjMDAsICJzdC5iIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDJjMDAwMDAwLCAic3QuYiIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMmQwMCwgInN0LmIudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDJmMDAsICJzdC5iLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMmQ4MCwgInN0LmIudXNyLnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDJmODAsICJzdC5iLnVzci53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMmM4MCwgInN0LmIud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMmU4MCwgInN0LmIud3QiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDIyMDAsICJzdC5kIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMjAwMCwgInN0LmQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MjAwMDAwMDAsICJzdC5kIiwJCSJkLDEsSSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMjAwLCAic3QuZCIsCQkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMDAwLCAic3QuZCIsCQkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4MzAwMDAwMDAsICJzdC5kIiwJCSJ4ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMjEwMCwgInN0LmQudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDIzMDAsICJzdC5kLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjEwMCwgInN0LmQudXNyIiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyMzAwLCAic3QuZC51c3IiLAkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGY0MDAyMTgwLCAic3QuZC51c3Iud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMjM4MCwgInN0LmQudXNyLnd0IiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMTgwLCAic3QuZC51c3Iud3QiLAkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjAwMDIzODAsICJzdC5kLnVzci53dCIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDIwODAsICJzdC5kLnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDIyODAsICJzdC5kLnd0IiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMDgwLCAic3QuZC53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjI4MCwgInN0LmQud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyYTAwLCAic3QuaCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDI4MDAsICJzdC5oIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDI4MDAwMDAwLCAic3QuaCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMjkwMCwgInN0LmgudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDJiMDAsICJzdC5oLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMjk4MCwgInN0LmgudXNyLnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDJiODAsICJzdC5oLnVzci53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMjg4MCwgInN0Lmgud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMmE4MCwgInN0Lmgud3QiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDI1MDAsICJzdC51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMjcwMCwgInN0LnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjUwMCwgInN0LnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjcwMCwgInN0LnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDI1ODAsICJzdC51c3Iud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMjc4MCwgInN0LnVzci53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjU4MCwgInN0LnVzci53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjc4MCwgInN0LnVzci53dCIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDI0ODAsICJzdC53dCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweGY0MDAyNjgwLCAic3Qud3QiLAkiZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDI0ODAsICJzdC53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjY4MCwgInN0Lnd0IiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMmEwMCwgInN0LngiLAkJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjgwMCwgInN0LngiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDM4MDAwMDAwLCAic3QueCIsCQkieGQsMSxJIikKLSAgX01DODgxMTAgKDB4ZjAwMDI5MDAsICJzdC54LnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMmIwMCwgInN0LngudXNyIiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjk4MCwgInN0LngudXNyLnd0IiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyYjgwLCAic3QueC51c3Iud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyODgwLCAic3QueC53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMmE4MCwgInN0Lngud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweDgwMDA4MDAwLCAic3RjciIsCQkiMyxjIikKLSAgX01DODh4eHggKDB4ZjQwMDc0MDAsICJzdWIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NzQwMDAwMDAsICJzdWIiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDc2MDAsICJzdWIuY2kiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNzcwMCwgInN1Yi5jaW8iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNzUwMCwgInN1Yi5jbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2NDAwLCAic3VidSIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2NDAwMDAwMCwgInN1YnUiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDY2MDAsICJzdWJ1LmNpIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDY3MDAsICJzdWJ1LmNpbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2NTAwLCAic3VidS5jbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDBkMDAwLCAidGIwIiwJCSJCLDEsViIpCi0gIF9NQzg4eHh4ICgweGYwMDBkODAwLCAidGIxIiwJCSJCLDEsViIpCi0gIF9NQzg4eHh4ICgweGY0MDBmODAwLCAidGJuZCIsCQkiMSwyIikKLSAgX01DODh4eHggKDB4ZjgwMDAwMDAsICJ0Ym5kIiwJCSIxLEkiKQotICBfTUM4OHh4eCAoMHhmMDAwZTgwMCwgInRjbmQiLAkJIk0sMSxWIikKLSAgX01DODh4eHggKDB4ODQwMDU4ODAsICJ0cm5jLnNkIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBkODgwLCAidHJuYy5zZCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDU4MDAsICJ0cm5jLnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBkODAwLCAidHJuYy5zcyIsCSJkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGQ5MDAsICJ0cm5jLnN4IiwJImQseDIiKQotICBfTUM4OHh4eCAoMHg4MDAwYzAwMCwgInhjciIsCQkiZCwzLGMiKQotICBfTUM4OHh4eCAoMHhmNDAwMDYwMCwgInhtZW0iLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwNDAwLCAieG1lbSIsCQkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwNDAwMDAwMCwgInhtZW0iLAkJIj9kLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwMjAwLCAieG1lbS5idSIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMDAwMCwgInhtZW0uYnUiLAkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwMDAwMDAwMCwgInhtZW0uYnUiLAkiP2QsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDAzMDAsICJ4bWVtLmJ1LnVzciIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMDEwMCwgInhtZW0uYnUudXNyIiwJImQsMSwyIikKLSAgX01DODgxMDAgKDB4MDAwMDAxMDAsICJ4bWVtLmJ1LnVzciIsCSI/ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMDcwMCwgInhtZW0udXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwNTAwLCAieG1lbS51c3IiLAkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwNDAwMDEwMCwgInhtZW0udXNyIiwJIj9kLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA1MDAwLCAieG9yIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDUwMDAwMDAwLCAieG9yIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA1NDAwLCAieG9yLmMiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg1NDAwMDAwMCwgInhvci51IiwJImQsMSxJIikKLSAgX01DODh4eHggKDB4MDAwMDAwMDAsICIiLAkJMCkKLX07Ci0KLSNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBtODhrX29wY29kZXMpLyhzaXplb2YgbTg4a19vcGNvZGVzWzBdKSkKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWFvdXQuYyBiL2dhcy9jb25maWcvb2JqLWFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiYmU5Mi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1hb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTIgKzAsMCBAQAotLyogYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1hb3V0LmgiCi0KLSNpbmNsdWRlICJhcy5oIgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSN1bmRlZiBOT19SRUxPQwotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotLyogaW46IHNlZ1QgICBvdXQ6IE5fVFlQRSBiaXRzICovCi1jb25zdCBzaG9ydCBzZWdfTl9UWVBFW10gPQotewotICBOX0FCUywKLSAgTl9URVhULAotICBOX0RBVEEsCi0gIE5fQlNTLAotICBOX1VOREYsCQkJLyogdW5rbm93biAqLwotICBOX1VOREYsCQkJLyogZXJyb3IgKi8KLSAgTl9VTkRGLAkJCS8qIGV4cHJlc3Npb24gKi8KLSAgTl9VTkRGLAkJCS8qIGRlYnVnICovCi0gIE5fVU5ERiwJCQkvKiBudHYgKi8KLSAgTl9VTkRGLAkJCS8qIHB0diAqLwotICBOX1JFR0lTVEVSLAkJCS8qIHJlZ2lzdGVyICovCi19OwotCi1jb25zdCBzZWdUIE5fVFlQRV9zZWdbTl9UWVBFICsgMl0gPQotewkJCQkvKiBOX1RZUEUgPT0gMHgxRSA9IDMyLTIgKi8KLSAgU0VHX1VOS05PV04sCQkJLyogTl9VTkRGID09IDAgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19BQlNPTFVURSwJCQkvKiBOX0FCUyA9PSAyICovCi0gIFNFR19HT09GLAotICBTRUdfVEVYVCwJCQkvKiBOX1RFWFQgPT0gNCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0RBVEEsCQkJLyogTl9EQVRBID09IDYgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19CU1MsCQkJLyogTl9CU1MgPT0gOCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfUkVHSVNURVIsCQkJLyogZHVtbXkgTl9SRUdJU1RFUiBmb3IgcmVncyA9IDMwICovCi0gIFNFR19HT09GLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBvYmpfYW91dF9saW5lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2FvdXRfd2VhayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9hb3V0X3R5cGUgUEFSQU1TICgoaW50KSk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBhb3V0X3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJsaW5lIiwgb2JqX2FvdXRfbGluZSwgMH0sCS8qIHNvdXJjZSBjb2RlIGxpbmUgbnVtYmVyICovCi0gIHsibG4iLCBvYmpfYW91dF9saW5lLCAwfSwJLyogY29mZiBsaW5lIG51bWJlciB0aGF0IHdlIHVzZSBhbnl3YXkgKi8KLQotICB7IndlYWsiLCBvYmpfYW91dF93ZWFrLCAwfSwJLyogbWFyayBzeW1ib2wgYXMgd2Vhay4gICovCi0KLSAgeyJ0eXBlIiwgb2JqX2FvdXRfdHlwZSwgMH0sCi0KLSAgLyogY29mZiBkZWJ1ZyBwc2V1ZG9zIChpZ25vcmVkKSAqLwotICB7ImRlZiIsIHNfaWdub3JlLCAwfSwKLSAgeyJkaW0iLCBzX2lnbm9yZSwgMH0sCi0gIHsiZW5kZWYiLCBzX2lnbm9yZSwgMH0sCi0gIHsiaWRlbnQiLCBzX2lnbm9yZSwgMH0sCi0gIHsibGluZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJsbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJzY2wiLCBzX2lnbm9yZSwgMH0sCi0gIHsic2l6ZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ0YWciLCBzX2lnbm9yZSwgMH0sCi0gIHsidmFsIiwgc19pZ25vcmUsIDB9LAotICB7InZlcnNpb24iLCBzX2lnbm9yZSwgMH0sCi0KLSAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwJLyogRm9yIHN1bjM4NmkgY2MgKD8pICovCi0KLSAgLyogb3RoZXIgc3R1ZmYgKi8KLSAgeyJBQk9SVCIsIHNfYWJvcnQsIDB9LAotCi0gIHtOVUxMLCBOVUxMLCAwfQkJLyogZW5kIHNlbnRpbmVsICovCi19OwkJCQkvKiBhb3V0X3BzZXVkb190YWJsZSAqLwotCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXZvaWQKLW9ial9hb3V0X2Zyb2Jfc3ltYm9sIChzeW0sIHB1bnQpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50ICpwdW50OwotewotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgaW50IGRlc2MsIHR5cGUsIG90aGVyOwotCi0gIGZsYWdzID0gc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzOwotICBkZXNjID0gYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+ZGVzYzsKLSAgdHlwZSA9IGFvdXRfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPnR5cGU7Ci0gIG90aGVyID0gYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+b3RoZXI7Ci0gIHNlYyA9IFNfR0VUX1NFR01FTlQgKHN5bSk7Ci0KLSAgLyogT25seSBmcm9iIHNpbXBsZSBzeW1ib2xzIHRoaXMgd2F5IHJpZ2h0IG5vdy4gICovCi0gIGlmICghICh0eXBlICYgfiAoTl9UWVBFIHwgTl9FWFQpKSkKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9PSAoTl9VTkRGIHwgTl9FWFQpCi0JICAmJiBzZWMgPT0gJmJmZF9hYnNfc2VjdGlvbikKLQl7Ci0JICBzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltLCBzZWMpOwotCX0KLQotICAgICAgaWYgKCh0eXBlICYgTl9UWVBFKSAhPSBOX0lORFIKLQkgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEEKLQkgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVFQKLQkgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEQKLQkgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEIKLQkgICYmIHR5cGUgIT0gTl9XQVJOSU5HCi0JICAmJiAoc2VjID09ICZiZmRfYWJzX3NlY3Rpb24KLQkgICAgICB8fCBzZWMgPT0gJmJmZF91bmRfc2VjdGlvbikpCi0JcmV0dXJuOwotICAgICAgaWYgKGZsYWdzICYgQlNGX0VYUE9SVCkKLQl0eXBlIHw9IE5fRVhUOwotCi0gICAgICBzd2l0Y2ggKHR5cGUgJiBOX1RZUEUpCi0JewotCWNhc2UgTl9TRVRBOgotCWNhc2UgTl9TRVRUOgotCWNhc2UgTl9TRVREOgotCWNhc2UgTl9TRVRCOgotCSAgLyogU2V0IHRoZSBkZWJ1Z2dpbmcgZmxhZyBmb3IgY29uc3RydWN0b3Igc3ltYm9scyBzbyB0aGF0Ci0JICAgICBCRkQgbGVhdmVzIHRoZW0gYWxvbmUuICAqLwotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLQkgIC8qIFlvdSBjYW4ndCBwdXQgYSBjb21tb24gc3ltYm9sIGluIGEgc2V0LiAgVGhlIHdheSBhIHNldAotCSAgICAgZWxlbWVudCB3b3JrcyBpcyB0aGF0IHRoZSBzeW1ib2wgaGFzIGEgZGVmaW5pdGlvbiBhbmQgYQotCSAgICAgbmFtZSwgYW5kIHRoZSBsaW5rZXIgYWRkcyB0aGUgZGVmaW5pdGlvbiB0byB0aGUgc2V0IG9mCi0JICAgICB0aGF0IG5hbWUuICBUaGF0IGRvZXMgbm90IHdvcmsgZm9yIGEgY29tbW9uIHN5bWJvbCwKLQkgICAgIGJlY2F1c2UgdGhlIGxpbmtlciBjYW4ndCB0ZWxsIHdoaWNoIGNvbW1vbiBzeW1ib2wgdGhlCi0JICAgICB1c2VyIG1lYW5zLiAgRklYTUU6IFVzaW5nIGFzX2JhZCBoZXJlIG1heSBiZQotCSAgICAgaW5hcHByb3ByaWF0ZSwgc2luY2UgdGhlIHVzZXIgbWF5IHdhbnQgdG8gZm9yY2UgYQotCSAgICAgcGFydGljdWxhciB0eXBlIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBzZW1hbnRpY3Mgb2Ygc2V0czsKLQkgICAgIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBjZXJ0YWlubHkgZG9uJ3Qgd2FudCBhbnlib2R5IHRvIGJlCi0JICAgICBtaXNsZWFkIGludG8gdGhpbmtpbmcgdGhhdCB0aGVpciBjb2RlIHdpbGwgd29yay4gICovCi0JICBpZiAoU19JU19DT01NT04gKHN5bSkpCi0JICAgIGFzX2JhZCAoXygiQXR0ZW1wdCB0byBwdXQgYSBjb21tb24gc3ltYm9sIGludG8gc2V0ICVzIiksCi0JCSAgICBTX0dFVF9OQU1FIChzeW0pKTsKLQkgIC8qIFNpbWlsYXJseSwgeW91IGNhbid0IHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGluIGEgc2V0LiAgKi8KLQkgIGVsc2UgaWYgKCEgU19JU19ERUZJTkVEIChzeW0pKQotCSAgICBhc19iYWQgKF8oIkF0dGVtcHQgdG8gcHV0IGFuIHVuZGVmaW5lZCBzeW1ib2wgaW50byBzZXQgJXMiKSwKLQkJICAgIFNfR0VUX05BTUUgKHN5bSkpOwotCi0JICBicmVhazsKLQljYXNlIE5fSU5EUjoKLQkgIC8qIFB1dCBpbmRpcmVjdCBzeW1ib2xzIGluIHRoZSBpbmRpcmVjdCBzZWN0aW9uLiAgKi8KLQkgIFNfU0VUX1NFR01FTlQgKHN5bSwgYmZkX2luZF9zZWN0aW9uX3B0cik7Ci0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0lORElSRUNUOwotCSAgaWYgKHR5cGUgJiBOX0VYVCkKLQkgICAgewotCSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfRVhQT1JUOwotCSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyAmPX4gQlNGX0xPQ0FMOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE5fV0FSTklORzoKLQkgIC8qIE1hcmsgd2FybmluZyBzeW1ib2xzLiAgKi8KLQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfV0FSTklORzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgICB9Ci0KLSAgYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+dHlwZSA9IHR5cGU7Ci0KLSAgLyogRG91YmxlIGNoZWNrIHdlYWsgc3ltYm9scy4gICovCi0gIGlmIChTX0lTX1dFQUsgKHN5bSkpCi0gICAgewotICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW0pKQotCWFzX2JhZCAoXygiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIpLAotCQlTX0dFVF9OQU1FIChzeW0pKTsKLSAgICB9Ci19Ci0KLXZvaWQKLW9ial9hb3V0X2Zyb2JfZmlsZSAoKQotewotICAvKiBSZWxvY2F0aW9uIHByb2Nlc3NpbmcgbWF5IHJlcXVpcmUga25vd2luZyB0aGUgVk1BcyBvZiB0aGUgc2VjdGlvbnMuCi0gICAgIFNpbmNlIHdyaXRpbmcgdG8gYSBzZWN0aW9uIHdpbGwgY2F1c2UgdGhlIEJGRCBiYWNrIGVuZCB0byBjb21wdXRlIHRoZQotICAgICBWTUFzLCBmYWtlIGl0IG91dCBoZXJlLi4uLiAgKi8KLSAgYmZkX2J5dGUgYiA9IDA7Ci0gIGJvb2xlYW4geCA9IHRydWU7Ci0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHRleHRfc2VjdGlvbikgIT0gMCkKLSAgICB7Ci0gICAgICB4ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChzdGRvdXRwdXQsIHRleHRfc2VjdGlvbiwgJmIsIChmaWxlX3B0cikgMCwKLQkJCQkgICAgKGJmZF9zaXplX3R5cGUpIDEpOwotICAgIH0KLSAgZWxzZSBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24pICE9IDApCi0gICAgewotICAgICAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24sICZiLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgIChiZmRfc2l6ZV90eXBlKSAxKTsKLSAgICB9Ci0gIGFzc2VydCAoeCA9PSB0cnVlKTsKLX0KLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIFJlbG9jYXRpb24uICovCi0KLS8qCi0gKgkJZW1pdF9yZWxvY2F0aW9ucygpCi0gKgotICogQ3Jhd2wgYWxvbmcgYSBmaXhTIGNoYWluLiBFbWl0IHRoZSBzZWdtZW50J3MgcmVsb2NhdGlvbnMuCi0gKi8KLXZvaWQKLW9ial9lbWl0X3JlbG9jYXRpb25zICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgZml4UyAqZml4UDsJCS8qIEZpeHVwIGNoYWluIGZvciB0aGlzIHNlZ21lbnQuICovCi0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgaWYgKGZpeFAtPmZ4X2RvbmUgPT0gMCkKLSAgICAgIHsKLQlzeW1ib2xTICpzeW07Ci0KLQlzeW0gPSBmaXhQLT5meF9hZGRzeTsKLQl3aGlsZSAoc3ltLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCi0JICBzeW0gPSBzeW0tPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQlmaXhQLT5meF9hZGRzeSA9IHN5bTsKLQotCWlmICghIHN5bS0+c3lfcmVzb2x2ZWQgJiYgISBTX0lTX0RFRklORUQgKHN5bSkpCi0JICB7Ci0JICAgIGNoYXIgKmZpbGU7Ci0JICAgIHVuc2lnbmVkIGludCBsaW5lOwotCi0JICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltLCAmZmlsZSwgJmxpbmUpKQotCSAgICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygidW5yZXNvbHZlZCByZWxvY2F0aW9uIikpOwotCSAgICBlbHNlCi0JICAgICAgYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbjogc3ltYm9sIGAlcycgbm90IGluIHN5bWJvbCB0YWJsZSIpLAotCQkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLQkgIH0KLQotCXRjX2FvdXRfZml4X3RvX2NoYXJzICgqd2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKTsKLQkqd2hlcmUgKz0gbWRfcmVsb2Nfc2l6ZTsKLSAgICAgIH0KLX0KLQotI2lmbmRlZiBvYmpfaGVhZGVyX2FwcGVuZAotLyogQW91dCBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KLXZvaWQKLW9ial9oZWFkZXJfYXBwZW5kICh3aGVyZSwgaGVhZGVycykKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgdGNfaGVhZGVyc19ob29rIChoZWFkZXJzKTsKLQotI2lmZGVmIENST1NTX0NPTVBJTEUKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2luZm8sIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfaW5mbykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9pbmZvKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RleHQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90ZXh0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhdGEsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYXRhKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Jzcywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9ic3MpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3N5bXMsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9zeW1zKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKTsKLQotI2Vsc2UgLyogQ1JPU1NfQ09NUElMRSAqLwotCi0gIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZoZWFkZXJzLT5oZWFkZXIsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyKSk7Ci0jZW5kaWYgLyogQ1JPU1NfQ09NUElMRSAqLwotCi19Ci0jZW5kaWYgLyogISBkZWZpbmVkIChvYmpfaGVhZGVyX2FwcGVuZCkgKi8KLQotdm9pZAotb2JqX3N5bWJvbF90b19jaGFycyAod2hlcmUsIHN5bWJvbFApCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpLCBTX0dFVF9PRkZTRVQgKHN5bWJvbFApLCBzaXplb2YgKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX0RFU0MgKHN5bWJvbFApKSwgU19HRVRfREVTQyAoc3ltYm9sUCksIHNpemVvZiAoU19HRVRfREVTQyAoc3ltYm9sUCkpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSwgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplb2YgKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSk7Ci0KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbCwgc2l6ZW9mIChvYmpfc3ltYm9sX3R5cGUpKTsKLX0KLQotdm9pZAotb2JqX2VtaXRfc3ltYm9scyAod2hlcmUsIHN5bWJvbF9yb290UCkKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uICAqLwotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogVXNlZCB0byBzYXZlIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWUuIEl0IGlzIHVzZWQgdG8gcG9pbnQKLQkgdG8gdGhlIHN0cmluZyBpbiBtZW1vcnkgYnV0IG11c3QgYmUgYSBmaWxlIG9mZnNldC4gKi8KLSAgICAgIHJlZ2lzdGVyIGNoYXIgKnRlbXA7Ci0KLSAgICAgIHRlbXAgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLSAgICAgIFNfU0VUX09GRlNFVCAoc3ltYm9sUCwgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQpOwotCi0gICAgICAvKiBBbnkgc3ltYm9sIHN0aWxsIHVuZGVmaW5lZCBhbmQgaXMgbm90IGEgZGJnIHN5bWJvbCBpcyBtYWRlIE5fRVhULiAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQlTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgdHlwZSBvZiBhIHdlYWsgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChTX0dFVF9XRUFLIChzeW1ib2xQKSkKLQl7Ci0JICBzd2l0Y2ggKFNfR0VUX1RZUEUgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgIGNhc2UgTl9VTkRGOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtVKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9BQlM6CSBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtBKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9URVhUOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtUKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9EQVRBOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtEKTsgYnJlYWs7Ci0JICAgIGNhc2UgTl9CU1M6ICBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtCKTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6IGFzX2JhZCAoXygiJXM6IGJhZCB0eXBlIGZvciB3ZWFrIHN5bWJvbCIpLCB0ZW1wKTsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG9ial9zeW1ib2xfdG9fY2hhcnMgKHdoZXJlLCBzeW1ib2xQKTsKLSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsIHRlbXApOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2FvdXRfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBBc3N1bWUgZGVsaW1pdGVyIGlzIHBhcnQgb2YgZXhwcmVzc2lvbi4KLSAgICAgQlNENC4yIGFzIGZhaWxzIHdpdGggZGVsaWdodGZ1bCBidWcsIHNvIHdlCi0gICAgIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCi0gIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBvYmpfYW91dF9saW5lKCkgKi8KLQotLyogSGFuZGxlIC53ZWFrLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2FvdXRfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIC50eXBlLiAgT24ge05ldCxPcGVufUJTRCwgdGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgbl9vdGhlciBmaWVsZCwKLSAgIHdoaWNoIGlzIHRoZW4gYXBwYXJlbnRseSB1c2VkIHdoZW4gZG9pbmcgZHluYW1pYyBsaW5raW5nLiAgT2xkZXIKLSAgIHZlcnNpb25zIG9nYXMgaWdub3JlZCB0aGUgLnR5cGUgcHNldWRvLW9wLCBzbyB3ZSBhbHNvIGlnbm9yZSBpdCBpZgotICAgd2UgY2FuJ3QgcGFyc2UgaXQuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2FvdXRfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgaWYgKHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdAJykKLQkgICAgewotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvYmplY3QiLCA2KSA9PSAwKQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkJYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+b3RoZXIgPSAxOwotI2Vsc2UKLQkJU19TRVRfT1RIRVIgKHN5bSwgMSk7Ci0jZW5kaWYKLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJmdW5jdGlvbiIsIDgpID09IDApCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQlhb3V0X3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5vdGhlciA9IDI7Ci0jZWxzZQotCQlTX1NFVF9PVEhFUiAoc3ltLCAyKTsKLSNlbmRpZgotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZ25vcmUgZXZlcnl0aGluZyBlbHNlIG9uIHRoZSBsaW5lLiAgKi8KLSAgc19pZ25vcmUgKDApOwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN5bWJvbFMgKipzeW1ib2xQUDsKLSAgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotCi0gIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycyk7Ci0KLSAgc3ltYm9sUFAgPSAmc3ltYm9sX3Jvb3RQOwkvKi0+bGFzdCBzeW1ib2wgY2hhaW4gbGluay4gKi8KLSAgd2hpbGUgKChzeW1ib2xQID0gKnN5bWJvbFBQKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xQLT5zeV9tcmlfY29tbW9uKQotCXsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSkKLQkgICAgYXNfYmFkIChfKCIlczogZ2xvYmFsIHN5bWJvbHMgbm90IHN1cHBvcnRlZCBpbiBjb21tb24gc2VjdGlvbnMiKSwKLQkJICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ICYmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkpCi0JewotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX1RFWFQpOwotCX0JCQkvKiBpZiBwdXNpbmcgZGF0YSBpbnRvIHRleHQgKi8KLQotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gICAgICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLQkgc3ltYm9scy4gICovCi0gICAgICBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpKQotCXsKLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogT0ssIGhlcmUgaXMgaG93IHdlIGRlY2lkZSB3aGljaCBzeW1ib2xzIGdvIG91dCBpbnRvIHRoZSBicmF2ZQotCSBuZXcgc3ltdGFiLiAgU3ltYm9scyB0aGF0IGRvIGFyZToKLQotCSAqIHN5bWJvbHMgd2l0aCBubyBuYW1lIChzdGFiZCdzPykKLQkgKiBzeW1ib2xzIHdpdGggZGVidWcgaW5mbyBpbiB0aGVpciBOX1RZUEUKLQotCSBTeW1ib2xzIHRoYXQgZG9uJ3QgYXJlOgotCSAqIHN5bWJvbHMgdGhhdCBhcmUgcmVnaXN0ZXJzCi0JICogc3ltYm9scyB3aXRoIFwxIGFzIHRoZWlyIDNyZCBjaGFyYWN0ZXIgKG51bWVyaWMgbGFiZWxzKQotCSAqICJsb2NhbCBsYWJlbHMiIGFzIGRlZmluZWQgYnkgU19MT0NBTF9OQU1FKG5hbWUpIGlmIHRoZSAtTAotCSBzd2l0Y2ggd2FzIHBhc3NlZCB0byBnYXMuCi0KLQkgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG91dHB1dC4gIFdlIGNvbXBsYWluIGlmIGEgZGVsZXRlZAotCSBzeW1ib2wgd2FzIG1hcmtlZCBleHRlcm5hbC4gKi8KLQotCi0gICAgICBpZiAoIVNfSVNfUkVHSVNURVIgKHN5bWJvbFApCi0JICAmJiAoIVNfR0VUX05BTUUgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19ERUJVRyAoc3ltYm9sUCkKLQkgICAgICB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKQotCSAgICAgIHx8IFNfSVNfRVhURVJOQUwgKHN5bWJvbFApCi0JICAgICAgfHwgKFNfR0VUX05BTUUgKHN5bWJvbFApWzBdICE9ICdcMDAxJwotCQkgICYmIChmbGFnX2tlZXBfbG9jYWxzIHx8ICFTX0xPQ0FMX05BTUUgKHN5bWJvbFApKSkpKQotCXsKLQkgIHN5bWJvbFAtPnN5X251bWJlciA9IHN5bWJvbF9udW1iZXIrKzsKLQotCSAgLyogVGhlICsgMSBhZnRlciBzdHJsZW4gYWNjb3VudCBmb3IgdGhlIFwwIGF0IHRoZQotCQkJICAgZW5kIG9mIGVhY2ggc3RyaW5nICovCi0JICBpZiAoIVNfSVNfU1RBQkQgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgLyogT3JkaW5hcnkgY2FzZS4gKi8KLQkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OwotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMTsKLQkgICAgfQotCSAgZWxzZQkJCS8qIC5TdGFiZCBjYXNlLiAqLwotCSAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7Ci0JICBzeW1ib2xQUCA9ICZzeW1ib2xQLT5zeV9uZXh0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JICAgIC8qIFRoaXMgd2FybmluZyBzaG91bGQgbmV2ZXIgZ2V0IHRyaWdnZXJlZCBhbnkgbW9yZS4KLQkgICAgICAgV2VsbCwgbWF5YmUgaWYgeW91J3JlIGRvaW5nIHR3aXN0ZWQgdGhpbmdzIHdpdGgKLQkgICAgICAgcmVnaXN0ZXIgbmFtZXMuLi4gICovCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkLiIpLCBkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAoU19HRVRfTkFNRSAoc3ltYm9sUCkpKTsKLQkgICAgfQkJCS8qIG9vcHMuICovCi0KLQkgIC8qIFVuaG9vayBpdCBmcm9tIHRoZSBjaGFpbiAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggc3ltYm9sICovCi0KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGhlYWRlcnMsIHN5bWJvbF9udW1iZXIpOwotfQotCi0vKgotICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KLSAqLwotCi12b2lkCi1vYmpfZW1pdF9zdHJpbmdzICh3aGVyZSkKLSAgICAgY2hhciAqKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0jaWZkZWYgQ1JPU1NfQ09NUElMRQotICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIHN0cmluZ19ieXRlX2NvdW50LCBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKLSNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN0cmluZ19ieXRlX2NvdW50LCAodW5zaWduZWQgbG9uZykgc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpOwotI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX05BTUUgKHN5bWJvbFApKQotCWFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkodW5zaWduZWQgbG9uZykgKHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMSkpOwotICAgIH0JCQkJLyogd2FsayBzeW1ib2wgY2hhaW4gKi8KLX0KLQotI2lmbmRlZiBBT1VUX1ZFUlNJT04KLSNkZWZpbmUgQU9VVF9WRVJTSU9OIDAKLSNlbmRpZgotCi12b2lkCi1vYmpfcHJlX3dyaXRlX2hvb2sgKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBIX1NFVF9EWU5BTUlDIChoZWFkZXJzLCAwKTsKLSAgSF9TRVRfVkVSU0lPTiAoaGVhZGVycywgQU9VVF9WRVJTSU9OKTsKLSAgSF9TRVRfTUFDSFRZUEUgKGhlYWRlcnMsIEFPVVRfTUFDSFRZUEUpOwotICB0Y19hb3V0X3ByZV93cml0ZV9ob29rIChoZWFkZXJzKTsKLX0KLQotdm9pZAotREVGVU5fVk9JRCAoc19zZWN0KQotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZV9lbmQ7Ci0gIGNoYXIgYzsKLQotICB1bnNpZ25lZCBpbnQgbGVuOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBjaGFyICpzYXZlOwotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzZWN0aW9uX25hbWVfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGxlbiA9IHNlY3Rpb25fbmFtZV9lbmQgLSBzZWN0aW9uX25hbWU7Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGMgPT0gJywnKQotICAgIHsKLSAgICAgIGV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICAgICAgZXhwID0gMDsKLSAgICB9Ci0gIGlmIChleHAgPj0gMTAwMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giKSk7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICB7Ci0gICAgICBzdWJzZWdfc2V0IChTRUdfVEVYVCwgKHN1YnNlZ1QpIGV4cCk7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0Jc3Vic2VnX3NldCAoU0VHX1RFWFQsIChzdWJzZWdUKSBleHAgKyAxMDAwKTsKLSAgICAgIGVsc2UKLQlzdWJzZWdfc2V0IChTRUdfREFUQSwgKHN1YnNlZ1QpIGV4cCk7Ci0gICAgfQotCi0gICpzZWN0aW9uX25hbWVfZW5kID0gYzsKLX0KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBTdXBwb3J0IGZvciBhbiBBT1VUIGVtdWxhdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkIGFvdXRfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IG9ial9hb3V0X3NfZ2V0X290aGVyIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIGludCBvYmpfYW91dF9zX2dldF9kZXNjIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi1zdGF0aWMgdm9pZAotYW91dF9wb3BfaW5zZXJ0ICgpCi17Ci0gIHBvcF9pbnNlcnQgKGFvdXRfcHNldWRvX3RhYmxlKTsKLX0KLQotc3RhdGljIGludAotb2JqX2FvdXRfc19nZXRfb3RoZXIgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICByZXR1cm4gYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+b3RoZXI7Ci19Ci0KLXN0YXRpYyBpbnQKLW9ial9hb3V0X3NfZ2V0X2Rlc2MgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICByZXR1cm4gYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+ZGVzYzsKLX0KLQotCi1jb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBhb3V0X2Zvcm1hdF9vcHMgPQotewotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgMSwJLyogZGZsX2xlYWRpbmdfdW5kZXJzY29yZSAqLwotICAwLAkvKiBlbWl0X3NlY3Rpb25fc3ltYm9scyAqLwotICBvYmpfYW91dF9mcm9iX3N5bWJvbCwKLSAgb2JqX2FvdXRfZnJvYl9maWxlLAotICAwLAkvKiBmcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICovCi0gIDAsCS8qIHNfZ2V0X3NpemUgKi8KLSAgMCwJLyogc19zZXRfc2l6ZSAqLwotICAwLAkvKiBzX2dldF9hbGlnbiAqLwotICAwLAkvKiBzX3NldF9hbGlnbiAqLwotICBvYmpfYW91dF9zX2dldF9vdGhlciwKLSAgb2JqX2FvdXRfc19nZXRfZGVzYywKLSAgMCwJLyogY29weV9zeW1ib2xfYXR0cmlidXRlcyAqLwotICAwLAkvKiBnZW5lcmF0ZV9hc21fbGluZW5vICovCi0gIDAsCS8qIHByb2Nlc3Nfc3RhYiAqLwotICAwLAkvKiBzZWNfc3ltX29rX2Zvcl9yZWxvYyAqLwotICBhb3V0X3BvcF9pbnNlcnQsCi0gIDAsCS8qIGVjb2ZmX3NldF9leHQgKi8KLSAgMCwJLyogcmVhZF9iZWdpbl9ob29rICovCi0gIDAgCS8qIHN5bWJvbF9uZXdfaG9vayAqLwotfTsKLSNlbmRpZiBCRkRfQVNTRU1CTEVSCi0KLS8qIGVuZCBvZiBvYmotYW91dC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1hb3V0LmggYi9nYXMvY29uZmlnL29iai1hb3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwODMwMmEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotYW91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qIG9iai1hb3V0LmgsIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCBmb3IgZ2FzLCB0aGUgYXNzZW1ibGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKiBUYWcgdG8gdmFsaWRhdGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgT0JKX0FPVVQgMQotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotI2luY2x1ZGUgImJmZC9saWJhb3V0LmgiCi0KLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBWTVMKLSNpbmNsdWRlICJhb3V0X2dudS5oIgkJLyogTmVlZGVkIHRvIGRlZmluZSBzdHJ1Y3Qgbmxpc3QuIFNpZ2guICovCi0jZWxzZQotI2luY2x1ZGUgImFfb3V0LmgiCi0jZW5kaWYKLQotI2lmbmRlZiBBT1VUX01BQ0hUWVBFCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMAotI2VuZGlmIC8qIEFPVVRfTUFDSFRZUEUgKi8KLQotZXh0ZXJuIGNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXTsKLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsKLQotI2lmbmRlZiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCShPTUFHSUMpCi0jZW5kaWYgLyogREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICovCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotZXh0ZXJuIGNvbnN0IHBzZXVkb190eXBlUyBhb3V0X3BzZXVkb190YWJsZVtdOwotCi0jaWZuZGVmIG9ial9wb3BfaW5zZXJ0Ci0jZGVmaW5lIG9ial9wb3BfaW5zZXJ0KCkgcG9wX2luc2VydCAoYW91dF9wc2V1ZG9fdGFibGUpCi0jZW5kaWYKLQotLyogU1lNQk9MIFRBQkxFICovCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgZGF0YSB0eXBlICovCi0KLXR5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsJLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCi0KLS8qIFN5bWJvbCB0YWJsZSBtYWNyb3MgYW5kIGNvbnN0YW50cyAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0jZGVmaW5lIFNfU0VUX09USEVSKFMsVikgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPm90aGVyID0gKFYpKQotI2RlZmluZSBTX1NFVF9UWVBFKFMsVCkgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPnR5cGUgPSAoVCkpCi0jZGVmaW5lIFNfU0VUX0RFU0MoUyxEKQlcCi0gIChhb3V0X3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+ZGVzYyA9IChEKSkKLSNkZWZpbmUgU19HRVRfT1RIRVIoUykgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPm90aGVyKQotI2RlZmluZSBTX0dFVF9UWVBFKFMpIFwKLSAgKGFvdXRfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT50eXBlKQotI2RlZmluZSBTX0dFVF9ERVNDKFMpIFwKLSAgKGFvdXRfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5kZXNjKQotCi1hc2VjdGlvbiAqdGV4dF9zZWN0aW9uLCAqZGF0YV9zZWN0aW9uLCAqYnNzX3NlY3Rpb247Ci0KLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKFMsUFVOVCkJb2JqX2FvdXRfZnJvYl9zeW1ib2wgKFMsICZQVU5UKQotI2RlZmluZSBvYmpfZnJvYl9maWxlKCkJCW9ial9hb3V0X2Zyb2JfZmlsZSAoKQotZXh0ZXJuIHZvaWQgb2JqX2FvdXRfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgb2JqX2FvdXRfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MoU0VDKQkoMSkKLQotI2Vsc2UKLQotLyogV2UgdXNlIHRoZSBzeV9vYmogZmllbGQgdG8gcmVjb3JkIHdoZXRoZXIgYSBzeW1ib2wgaXMgd2Vhay4gICovCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIGNoYXIKLQotLyoKLSAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KLSAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKLQotLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgaXMgaW4gTl97VEVYVCxEQVRBLEJTUyxBQlN9IG9yIE5fRVhUICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKSBcCi0gIChTX0dFVF9UWVBFIChzKSAhPSBOX1VOREYgfHwgU19HRVRfREVTQyAocykgIT0gMCkKLQotI2RlZmluZSBTX0lTX0NPTU1PTihzKSBcCi0gIChTX0dFVF9UWVBFIChzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCi0KLSNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCi0KLS8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLwotI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLwotI2RlZmluZSBTX0lTX0xPQ0FMKHMpIAkJCQkJXAotICAoKFNfR0VUX05BTUUgKHMpIAkJCQkJXAotICAgICYmICFTX0lTX0RFQlVHIChzKSAJCQkJCVwKLSAgICAmJiAoc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDEnKSAhPSBOVUxMCQlcCi0gICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAyJykgIT0gTlVMTAlcCi0gICAgICAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkJXAotICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUJCQlcCi0gICAgICAgJiYgISBTX0lTX0VYVEVSTkFMKHMpCQkJCVwKLSAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChzKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlY2F1c2Ugb2YgYSAuc3RhYmQgZGlyZWN0aXZlICovCi0jZGVmaW5lIFNfSVNfU1RBQkQocykJCShTX0dFVF9OQU1FKHMpID09IChjaGFyICopMCkKLQotLyogQWNjZXNzb3JzICovCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fbmFtZSkKLS8qIFRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU19HRVRfT0ZGU0VUKHMpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cngpCi0vKiBUaGUgdHlwZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX1RZUEUocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1RZUEUpCi0vKiBUaGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgc2VnbWVudCAqLwotI2RlZmluZSBTX0dFVF9TRUdNRU5UKHMpCShOX1RZUEVfc2VnW1NfR0VUX1RZUEUocyldKQotLyogVGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9PVEhFUihzKQkJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIpCi0vKiBUaGUgbl9kZXNjIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19HRVRfREVTQyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYykKLS8qIFdoZXRoZXIgdGhlIHN5bWJvbCBpcyB3ZWFrLiAgKi8KLSNkZWZpbmUgU19HRVRfV0VBSyhzKQkJKChzKS0+c3lfb2JqKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLwotLyogc2V0IHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQotLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lID0gKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cnggPSAodikpCi0vKiBTZXQgdGhlIG5fdHlwZSBmaWVsZCAqLwotI2RlZmluZSBTX1NFVF9UWVBFKHMsdCkJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodCkpCi0vKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQotLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCi0vKiBNYXJrIHRoZSBzeW1ib2wgYXMgd2Vhay4gIFRoaXMgY2F1c2VzIG5fdHlwZSB0byBiZSBhZGp1c3RlZCB3aGVuCi0gICB0aGUgc3ltYm9sIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLSNkZWZpbmUgU19TRVRfV0VBSyhzKQkJKChzKS0+c3lfb2JqID0gMSkKLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0jZGVmaW5lIEhfR0VUX0ZJTEVfU0laRShoKQkoSF9HRVRfSEVBREVSX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX1RFWFRfU0laRShoKSBcCi0JCQkJICsgSF9HRVRfREFUQV9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKSBcCi0JCQkJICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9TVFJJTkdfU0laRShoKSkKLQotI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKEVYRUNfQllURVNfU0laRSkKLSNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV90ZXh0KQotI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2RhdGEpCi0jZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9ic3MpCi0jZGVmaW5lIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX3Ryc2l6ZSkKLSNkZWZpbmUgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfZHJzaXplKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKQkoKGgpLT5oZWFkZXIuYV9zeW1zKQotI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKQkJKChoKS0+aGVhZGVyLmFfZW50cnkpCi0jZGVmaW5lIEhfR0VUX1NUUklOR19TSVpFKGgpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLSNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkJCSgwKQotCi0jZGVmaW5lIEhfR0VUX0RZTkFNSUMoaCkJCSgoaCktPmhlYWRlci5hX2luZm8gPj4gMzEpCi0jZGVmaW5lIEhfR0VUX1ZFUlNJT04oaCkJCSgoKGgpLT5oZWFkZXIuYV9pbmZvID4+IDI0KSAmIDB4N2YpCi0jZGVmaW5lIEhfR0VUX01BQ0hUWVBFKGgpCQkoKChoKS0+aGVhZGVyLmFfaW5mbyA+PiAxNikgJiAweGZmKQotI2RlZmluZSBIX0dFVF9NQUdJQ19OVU1CRVIoaCkJCSgoaCktPmhlYWRlci5hX2luZm8gJiAweGZmZmYpCi0KLSNkZWZpbmUgSF9TRVRfRFlOQU1JQyhoLHYpCQkoKGgpLT5oZWFkZXIuYV9pbmZvID0gKCgodikgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUNIVFlQRShoKSA8PCAxNikgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUdJQ19OVU1CRVIoaCkpKSkKLQotI2RlZmluZSBIX1NFVF9WRVJTSU9OKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoKHYpIDw8IDI0KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BQ0hUWVBFKGgpIDw8IDE2KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BR0lDX05VTUJFUihoKSkpKQotCi0jZGVmaW5lIEhfU0VUX01BQ0hUWVBFKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8ICgodikgPDwgMTYpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfTUFHSUNfTlVNQkVSKGgpKSkpCi0KLSNkZWZpbmUgSF9TRVRfTUFHSUNfTlVNQkVSKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUNIVFlQRShoKSA8PCAxNikgXAotCQkJCQkJCSAgICAgICB8ICgodikpKSkKLQotI2RlZmluZSBIX1NFVF9URVhUX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfdGV4dCA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX1RFWFQsICh2KSkpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9kYXRhID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfREFUQSwgKHYpKSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfQlNTLCAodikpKQotCi0jZGVmaW5lIEhfU0VUX1JFTE9DQVRJT05fU0laRShoLHQsZCkJKEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKChoKSwodCkpLFwKLQkJCQkJIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKChoKSwoZCkpKQotCi0jZGVmaW5lIEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfdHJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoLHYpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogMTIpCi0KLSNkZWZpbmUgSF9TRVRfRU5UUllfUE9JTlQoaCx2KQkJKChoKS0+aGVhZGVyLmFfZW50cnkgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NUUklOR19TSVpFKGgsdikJCSgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCi0gICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KLSAgfQotCi1vYmplY3RfaGVhZGVyczsKLQotLyogbGluZSBudW1iZXJpbmcgc3R1ZmYuICovCi0jZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLCBiLCBjKQl7O30KLQotc3RydWN0IGZpeDsKLXZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsIHN0cnVjdCBmaXggKmZpeFAsIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzcykpOwotCi0jZW5kaWYKLQotI2RlZmluZSBvYmpfcmVhZF9iZWdpbl9ob29rKCkJezt9Ci0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykJezt9Ci0KLSNkZWZpbmUgRU1JVF9TRUNUSU9OX1NZTUJPTFMJCTAKLQotI2RlZmluZSBBT1VUX1NUQUJTCi0KLS8qIGVuZCBvZiBvYmotYW91dC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ib3V0LmMgYi9nYXMvY29uZmlnL29iai1ib3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzk3MTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotYm91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qIGIub3V0IG9iamVjdCBmaWxlIGZvcm1hdAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi1jb25zdCBzaG9ydAkJCS8qIGluOiBzZWdUICAgb3V0OiBOX1RZUEUgYml0cyAqLwotICBzZWdfTl9UWVBFW10gPQotewotICBOX0FCUywKLSAgTl9URVhULAotICBOX0RBVEEsCi0gIE5fQlNTLAotICBOX1VOREYsCQkJLyogdW5rbm93biAqLwotICBOX1VOREYsCQkJLyogZXJyb3IgKi8KLSAgTl9VTkRGLAkJCS8qIGV4cHJlc3Npb24gKi8KLSAgTl9VTkRGLAkJCS8qIGRlYnVnICovCi0gIE5fVU5ERiwJCQkvKiBudHYgKi8KLSAgTl9VTkRGLAkJCS8qIHB0diAqLwotICBOX1JFR0lTVEVSLAkJCS8qIHJlZ2lzdGVyICovCi19OwotCi1jb25zdCBzZWdUIE5fVFlQRV9zZWdbTl9UWVBFICsgMl0gPQotewkJCQkvKiBOX1RZUEUgPT0gMHgxRSA9IDMyLTIgKi8KLSAgU0VHX1VOS05PV04sCQkJLyogTl9VTkRGID09IDAgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19BQlNPTFVURSwJCQkvKiBOX0FCUyA9PSAyICovCi0gIFNFR19HT09GLAotICBTRUdfVEVYVCwJCQkvKiBOX1RFWFQgPT0gNCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0RBVEEsCQkJLyogTl9EQVRBID09IDYgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19CU1MsCQkJLyogTl9CU1MgPT0gOCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfUkVHSVNURVIsCQkJLyogZHVtbXkgTl9SRUdJU1RFUiBmb3IgcmVncyA9IDMwICovCi0gIFNFR19HT09GLAotfTsKLQotc3RhdGljIHZvaWQgb2JqX2JvdXRfbGluZSBQQVJBTVMgKChpbnQpKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsibGluZSIsIG9ial9ib3V0X2xpbmUsIDB9LAkvKiBzb3VyY2UgY29kZSBsaW5lIG51bWJlciAqLwotCi0vKiBjb2ZmIGRlYnVnZ2luZyBkaXJlY3RpdmVzLiAgQ3VycmVudGx5IGlnbm9yZWQgc2lsZW50bHkgKi8KLSAgeyJkZWYiLCBzX2lnbm9yZSwgMH0sCi0gIHsiZGltIiwgc19pZ25vcmUsIDB9LAotICB7ImVuZGVmIiwgc19pZ25vcmUsIDB9LAotICB7ImxuIiwgc19pZ25vcmUsIDB9LAotICB7InNjbCIsIHNfaWdub3JlLCAwfSwKLSAgeyJzaXplIiwgc19pZ25vcmUsIDB9LAotICB7InRhZyIsIHNfaWdub3JlLCAwfSwKLSAgeyJ0eXBlIiwgc19pZ25vcmUsIDB9LAotICB7InZhbCIsIHNfaWdub3JlLCAwfSwKLQotLyogb3RoZXIgc3R1ZmYgd2UgZG9uJ3QgaGFuZGxlICovCi0gIHsiQUJPUlQiLCBzX2lnbm9yZSwgMH0sCi0gIHsiaWRlbnQiLCBzX2lnbm9yZSwgMH0sCi0KLSAge05VTEx9CQkJLyogZW5kIHNlbnRpbmVsICovCi19OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCi0KLS8qIFJlbG9jYXRpb24uICovCi0KLS8qCi0gKgkJZW1pdF9yZWxvY2F0aW9ucygpCi0gKgotICogQ3Jhd2wgYWxvbmcgYSBmaXhTIGNoYWluLiBFbWl0IHRoZSBzZWdtZW50J3MgcmVsb2NhdGlvbnMuCi0gKi8KLXZvaWQKLW9ial9lbWl0X3JlbG9jYXRpb25zICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgZml4UyAqZml4UDsJCS8qIEZpeHVwIGNoYWluIGZvciB0aGlzIHNlZ21lbnQuICovCi0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgPT0gMAotCSAgfHwgZml4UC0+Znhfcl90eXBlICE9IE5PX1JFTE9DKQotCXsKLQkgIHN5bWJvbFMgKnN5bTsKLQotCSAgc3ltID0gZml4UC0+ZnhfYWRkc3k7Ci0JICB3aGlsZSAoc3ltLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JCSAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCSAgICBzeW0gPSBzeW0tPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQkgIGZpeFAtPmZ4X2FkZHN5ID0gc3ltOwotCi0JICB0Y19ib3V0X2ZpeF90b19jaGFycyAoKndoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSk7Ci0JICAqd2hlcmUgKz0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLQl9CQkJLyogaWYgdGhlcmUncyBhIHN5bWJvbCAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggZml4dXAgKi8KLQotfQkJCQkvKiBlbWl0X3JlbG9jYXRpb25zKCkgKi8KLQotLyogQW91dCBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KLQotLyogQ29udmVydCBhIGx2YWx1ZSB0byBtYWNoaW5lIGRlcGVuZGVudCBkYXRhICovCi12b2lkCi1vYmpfaGVhZGVyX2FwcGVuZCAod2hlcmUsIGhlYWRlcnMpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIC8qIEFsd2F5cyBsZWF2ZSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KLQotICBoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24gPSBzZWN0aW9uX2FsaWdubWVudFtTRUdfVEVYVF07Ci0KLSAgaWYgKGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbiA8IDIpCi0gICAgewotICAgICAgaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduID0gMjsKLSAgICB9CQkJCS8qIGZvcmNlIHRvIGF0IGxlYXN0IDIgKi8KLQotICBoZWFkZXJzLT5oZWFkZXIuYV9kYWxpZ24gPSBzZWN0aW9uX2FsaWdubWVudFtTRUdfREFUQV07Ci0gIGhlYWRlcnMtPmhlYWRlci5hX2JhbGlnbiA9IHNlY3Rpb25fYWxpZ25tZW50W1NFR19CU1NdOwotCi0gIGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkID0gMDsKLSAgaGVhZGVycy0+aGVhZGVyLmFfZGxvYWQgPSBtZF9zZWN0aW9uX2FsaWduIChTRUdfREFUQSwgSF9HRVRfVEVYVF9TSVpFIChoZWFkZXJzKSk7Ci0KLSAgaGVhZGVycy0+aGVhZGVyLmFfcmVsYXhhYmxlID0gbGlua3JlbGF4OwotCi0jaWZkZWYgQ1JPU1NfQ09NUElMRQotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfbWFnaWMsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfbWFnaWMpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfbWFnaWMpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfdGV4dCwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90ZXh0KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3RleHQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZGF0YSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYXRhKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2RhdGEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfYnNzLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2JzcykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9ic3MpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfc3ltcywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9zeW1zKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3N5bXMpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZW50cnksIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZW50cnkpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZW50cnkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfdGxvYWQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGxvYWQpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGxvYWQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZGxvYWQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGxvYWQpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGxvYWQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbikpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24pOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfZGFsaWduLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2RhbGlnbikpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYWxpZ24pOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfYmFsaWduLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2JhbGlnbikpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9iYWxpZ24pOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLmFfcmVsYXhhYmxlLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3JlbGF4YWJsZSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9yZWxheGFibGUpOwotI2Vsc2UgLyogISBDUk9TU19DT01QSUxFICovCi0gIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZoZWFkZXJzLT5oZWFkZXIsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyKSk7Ci0jZW5kaWYgLyogISBDUk9TU19DT01QSUxFICovCi19CQkJCS8qIGFfaGVhZGVyX2FwcGVuZCgpICovCi0KLXZvaWQKLW9ial9zeW1ib2xfdG9fY2hhcnMgKHdoZXJlLCBzeW1ib2xQKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihTX0dFVF9PRkZTRVQgKHN5bWJvbFApKSwgU19HRVRfT0ZGU0VUIChzeW1ib2xQKSwgc2l6ZW9mIChTX0dFVF9PRkZTRVQgKHN5bWJvbFApKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihTX0dFVF9ERVNDIChzeW1ib2xQKSksIFNfR0VUX0RFU0MgKHN5bWJvbFApLCBzaXplb2YgKFNfR0VUX0RFU0MgKHN5bWJvbFApKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlLCBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemVvZiAoc3ltYm9sUC0+c3lfc3ltYm9sLm5fdmFsdWUpKTsKLQotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmc3ltYm9sUC0+c3lfc3ltYm9sLCBzaXplb2YgKG9ial9zeW1ib2xfdHlwZSkpOwotfQkJCQkvKiBvYmpfc3ltYm9sX3RvX2NoYXJzKCkgKi8KLQotdm9pZAotb2JqX2VtaXRfc3ltYm9scyAod2hlcmUsIHN5bWJvbF9yb290UCkKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyoKLQkgKiBFbWl0IGFsbCBzeW1ib2xzIGxlZnQgaW4gdGhlIHN5bWJvbCBjaGFpbi4KLQkgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIFVzZWQgdG8gc2F2ZSB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lLiBJdCBpcyB1c2VkIHRvIHBvaW50Ci0JCSAgIHRvIHRoZSBzdHJpbmcgaW4gbWVtb3J5IGJ1dCBtdXN0IGJlIGEgZmlsZSBvZmZzZXQuICovCi0gICAgICBjaGFyICp0ZW1wOwotCi0gICAgICB0ZW1wID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9PRkZTRVQgKHN5bWJvbFAsIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0KTsKLQotICAgICAgLyogQW55IHN5bWJvbCBzdGlsbCB1bmRlZmluZWQgYW5kIGlzIG5vdCBhIGRiZyBzeW1ib2wgaXMgbWFkZSBOX0VYVC4gKi8KLSAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkgJiYgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCi0gICAgICBvYmpfc3ltYm9sX3RvX2NoYXJzICh3aGVyZSwgc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9OQU1FIChzeW1ib2xQLCB0ZW1wKTsKLSAgICB9Ci19CQkJCS8qIGVtaXRfc3ltYm9scygpICovCi0KLXZvaWQKLW9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIFNfU0VUX09USEVSIChzeW1ib2xQLCAwKTsKLSAgU19TRVRfREVTQyAoc3ltYm9sUCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfYm91dF9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIEFzc3VtZSBkZWxpbWl0ZXIgaXMgcGFydCBvZiBleHByZXNzaW9uLiAqLwotICAvKiBCU0Q0LjIgYXMgZmFpbHMgd2l0aCBkZWxpZ2h0ZnVsIGJ1Zywgc28gd2UgKi8KLSAgLyogYXJlIG5vdCBiZWluZyBpbmNvbXBhdGlibGUgaGVyZS4gKi8KLSAgbmV3X2xvZ2ljYWxfbGluZSAoKGNoYXIgKikgTlVMTCwgKGludCkgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIG9ial9ib3V0X2xpbmUoKSAqLwotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci19Ci0KLXZvaWQKLW9ial9jcmF3bF9zeW1ib2xfY2hhaW4gKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBzeW1ib2xTICoqc3ltYm9sUFA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLQotICB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gKGhlYWRlcnMpOwotCi0gIHN5bWJvbFBQID0gJnN5bWJvbF9yb290UDsJLyotPmxhc3Qgc3ltYm9sIGNoYWluIGxpbmsuICovCi0gIHdoaWxlICgoc3ltYm9sUCA9ICpzeW1ib2xQUCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgJiYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKSkKLQl7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfVEVYVCk7Ci0JfQkJCS8qIGlmIHB1c2luZyBkYXRhIGludG8gdGV4dCAqLwotCi0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLSAgICAgIC8qIFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gdW5kZWZpbmVkIG9yIGNvbW1vbgotCSBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkpCi0JewotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPSywgaGVyZSBpcyBob3cgd2UgZGVjaWRlIHdoaWNoIHN5bWJvbHMgZ28gb3V0IGludG8gdGhlCi0JIGJyYXZlIG5ldyBzeW10YWIuICBTeW1ib2xzIHRoYXQgZG8gYXJlOgotCQkKLQkgKiBzeW1ib2xzIHdpdGggbm8gbmFtZSAoc3RhYmQncz8pCi0JICogc3ltYm9scyB3aXRoIGRlYnVnIGluZm8gaW4gdGhlaXIgTl9UWVBFCi0JCQotCSBTeW1ib2xzIHRoYXQgZG9uJ3QgYXJlOgotCSAqIHN5bWJvbHMgdGhhdCBhcmUgcmVnaXN0ZXJzCi0JICogc3ltYm9scyB3aXRoIFwxIGFzIHRoZWlyIDNyZCBjaGFyYWN0ZXIgKG51bWVyaWMgbGFiZWxzKQotCSAqICJsb2NhbCBsYWJlbHMiIGFzIGRlZmluZWQgYnkgU19MT0NBTF9OQU1FKG5hbWUpCi0JIGlmIHRoZSAtTCBzd2l0Y2ggd2FzIHBhc3NlZCB0byBnYXMuCi0JCQotCSBBbGwgb3RoZXIgc3ltYm9scyBhcmUgb3V0cHV0LiAgV2UgY29tcGxhaW4gaWYgYSBkZWxldGVkCi0JIHN5bWJvbCB3YXMgbWFya2VkIGV4dGVybmFsLiAqLwotCi0KLSAgICAgIGlmICgxCi0JICAmJiAhU19JU19SRUdJU1RFUiAoc3ltYm9sUCkKLQkgICYmICghU19HRVRfTkFNRSAoc3ltYm9sUCkKLQkgICAgICB8fCBTX0lTX0RFQlVHIChzeW1ib2xQKQotI2lmZGVmIFRDX0k5NjAKLSAgICAgIC8qIEZJWE1FLVNPT04gdGhpcyBpZmRlZiBzZWVtcyBoaWdobHkgZHViaW91cyB0byBtZS4gIHhveG9yaWNoLiAqLwotCSAgICAgIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0JICAgICAgfHwgKFNfR0VUX05BTUUgKHN5bWJvbFApWzBdICE9ICdcMDAxJyAmJiAoZmxhZ19rZWVwX2xvY2FscyB8fCAhU19MT0NBTF9OQU1FIChzeW1ib2xQKSkpKSkKLQl7Ci0JICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyKys7Ci0KLQkgIC8qIFRoZSArIDEgYWZ0ZXIgc3RybGVuIGFjY291bnQgZm9yIHRoZSBcMCBhdCB0aGUKLQkJCSAgIGVuZCBvZiBlYWNoIHN0cmluZyAqLwotCSAgaWYgKCFTX0lTX1NUQUJEIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIC8qIE9yZGluYXJ5IGNhc2UuICovCi0JICAgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSBzdHJpbmdfYnl0ZV9jb3VudDsKLQkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBzdHJsZW4gKFNfR0VUX05BTUUgKHN5bWJvbFApKSArIDE7Ci0JICAgIH0KLQkgIGVsc2UJCQkvKiAuU3RhYmQgY2FzZS4gKi8KLQkgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCSAgc3ltYm9sUFAgPSAmKHN5bWJvbF9uZXh0IChzeW1ib2xQKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgICB9CQkJLyogb29wcy4gKi8KLQotCSAgLyogVW5ob29rIGl0IGZyb20gdGhlIGNoYWluICovCi0JICAqc3ltYm9sUFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCk7Ci0JfQkJCS8qIGlmIHRoaXMgc3ltYm9sIHNob3VsZCBiZSBpbiB0aGUgb3V0cHV0ICovCi0gICAgfQkJCQkvKiBmb3IgZWFjaCBzeW1ib2wgKi8KLQotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaGVhZGVycywgc3ltYm9sX251bWJlcik7Ci19Ci0KLS8qCi0gKiBGaW5kIHN0cmluZ3MgYnkgY3Jhd2xpbmcgYWxvbmcgc3ltYm9sIHRhYmxlIGNoYWluLgotICovCi0KLXZvaWQKLW9ial9lbWl0X3N0cmluZ3MgKHdoZXJlKQotICAgICBjaGFyICoqd2hlcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSNpZmRlZiBDUk9TU19DT01QSUxFCi0gIC8qIEdvdHRhIGRvIG1kXyBieXRlLW9yZGVyaW5nIHN0dWZmIGZvciBzdHJpbmdfYnl0ZV9jb3VudCBmaXJzdCAtIEtXSyAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgc3RyaW5nX2J5dGVfY291bnQsIHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpOwotI2Vsc2UgLyogQ1JPU1NfQ09NUElMRSAqLwotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmc3RyaW5nX2J5dGVfY291bnQsICh1bnNpZ25lZCBsb25nKSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0jZW5kaWYgLyogQ1JPU1NfQ09NUElMRSAqLwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpCi0JYXBwZW5kICh3aGVyZSwgU19HRVRfTkFNRSAoc3ltYm9sUCksICh1bnNpZ25lZCBsb25nKSAoc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxKSk7Ci0gICAgfQkJCQkvKiB3YWxrIHN5bWJvbCBjaGFpbiAqLwotfQotCi0vKiBlbmQgb2Ygb2JqLWJvdXQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYm91dC5oIGIvZ2FzL2NvbmZpZy9vYmotYm91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUzOWEwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWJvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKiBiLm91dCBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCi0gICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIENhbWJyaWRnZSwgTUEKLSAgIDAyMTM5LCBVU0EuICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mICdhLm91dC5oJy4gIEl0IGlzIHRvIGJlIHVzZWQgaW4gYWxsIEdOVQotICogdG9vbHMgbW9kaWZpZWQgdG8gc3VwcG9ydCB0aGUgaTgwOTYwIGIub3V0IGZvcm1hdCAob3IgdG9vbHMgdGhhdCBvcGVyYXRlIG9uCi0gKiBvYmplY3QgZmlsZXMgY3JlYXRlZCBieSBzdWNoIHRvb2xzKS4KLSAqCi0gKiBBbGwgaTgwOTYwIGRldmVsb3BtZW50IGlzIGRvbmUgaW4gYSBDUk9TUy1ERVZFTE9QTUVOVCBlbnZpcm9ubWVudC4gIEkuZS4sCi0gKiBvYmplY3QgY29kZSBpcyBnZW5lcmF0ZWQgb24sIGFuZCBleGVjdXRlZCB1bmRlciB0aGUgZGlyZWN0aW9uIG9mIGEgc3ltYm9saWMKLSAqIGRlYnVnZ2VyIHJ1bm5pbmcgb24sIGEgaG9zdCBzeXN0ZW0uICBXZSBkbyBub3Qgd2FudCB0byBiZSBzdWJqZWN0IHRvIHRoZQotICogdmFnYXJpZXMgb2Ygd2hpY2ggaG9zdCBpdCBpcyBvciB3aGV0aGVyIGl0IHN1cHBvcnRzIENPRkYgb3IgYS5vdXQgZm9ybWF0LCBvcgotICogYW55dGhpbmcgZWxzZS4gIFdlIERPIHdhbnQgdG86Ci0gKgotICoJbyBhbHdheXMgZ2VuZXJhdGUgdGhlIHNhbWUgZm9ybWF0IG9iamVjdCBmaWxlcywgcmVnYXJkbGVzcyBvZiBob3N0LgotICoKLSAqCW8gaGF2ZSBhbiAnYS5vdXQnIGhlYWRlciB0aGF0IHdlIGNhbiBtb2RpZnkgZm9yIG91ciBvd24gcHVycG9zZXMKLSAqCSAgKHRoZSA4MDk2MCBpcyB0eXBpY2FsbHkgYW4gZW1iZWRkZWQgcHJvY2Vzc29yIGFuZCBtYXkgcmVxdWlyZQotICoJICBlbmhhbmNlZCBsaW5rZXIgc3VwcG9ydCB0aGF0IHRoZSBub3JtYWwgYS5vdXQuaCBoZWFkZXIgY2FuJ3QKLSAqCSAgYWNjb21tb2RhdGUpLgotICoKLSAqIEFzIGZvciBieXRlLW9yZGVyaW5nLCB0aGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgotICoKLSAqCW8gVGV4dCBhbmQgZGF0YSB0aGF0IGlzIGFjdHVhbGx5IGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCBpcyBhbHdheXMKLSAqCSAgaW4gaTgwOTYwIChsaXR0bGUtZW5kaWFuKSBvcmRlci4KLSAqCi0gKglvIEFsbCBvdGhlciBudW1iZXJzIChpbiB0aGUgaGVhZGVyLCBzeW1ib2xzLCByZWxvY2F0aW9uIGRpcmVjdGl2ZXMpCi0gKgkgIGFyZSBpbiBob3N0IGJ5dGUtb3JkZXI6ICBvYmplY3QgZmlsZXMgQ0FOTk9UIGJlIGxpZnRlZCBmcm9tIGEKLSAqCSAgbGl0dGxlLWVuZCBob3N0IGFuZCB1c2VkIG9uIGEgYmlnLWVuZGlhbiAob3IgdmljZSB2ZXJzYSkgd2l0aG91dAotICoJICBtb2RpZmljYXRpb24uCi0gKiA9PT4gVEhJUyBJUyBOTyBMT05HRVIgVFJVRSBVU0lORyBCRkQuICBXRSBDQU4gR0VORVJBVEUgQU5ZIEJZVEUgT1JERVIKLSAqICAgICBGT1IgVEhFIEhFQURFUiwgQU5EIFJFQUQgQU5ZIEJZVEUgT1JERVIuICBQUkVGRVJFTkNFIFdPVUxEIEJFIFRPCi0gKiAgICAgVVNFIExJVFRMRS1FTkRJQU4gQllURSBPUkRFUiBUSFJPVUdIT1VULCBSRUdBUkRMRVNTIE9GIEhPU1QuICA8PT0KLSAqCi0gKglvIFRoZSBkb3dubG9hZGVyICgnY29tbTk2MCcpIHRha2VzIGNhcmUgdG8gZ2VuZXJhdGUgYSBwc2V1ZG8taGVhZGVyCi0gKgkgIHdpdGggY29ycmVjdCAoaTgwOTYwKSBieXRlLW9yZGVyaW5nIGJlZm9yZSBzaGlwcGluZyB0ZXh0IGFuZCBkYXRhCi0gKgkgIG9mZiB0byB0aGUgTklORFkgbW9uaXRvciBpbiB0aGUgdGFyZ2V0IHN5c3RlbXMuICBTeW1ib2xzIGFuZAotICoJICByZWxvY2F0aW9uIGluZm8gYXJlIG5ldmVyIHNlbnQgdG8gdGhlIHRhcmdldC4KLSAqLwotCi0KLSNkZWZpbmUgT0JKX0JPVVQgMQotCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNkZWZpbmUgT0JKX0RFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRQkiYi5vdXQiCi0KLWV4dGVybiBjb25zdCBzaG9ydCBzZWdfTl9UWVBFW107Ci1leHRlcm4gY29uc3Qgc2VnVCBOX1RZUEVfc2VnW107Ci0KLSNkZWZpbmUgQk1BR0lDCTA0MTUKLS8qIFdlIGRvbid0IGFjY2VwdCB0aGUgZm9sbG93aW5nIChzZWUgTl9CQURNQUcgbWFjcm8pLgotICogVGhleSdyZSBqdXN0IGhlcmUgc28gR05VIGNvZGUgd2lsbCBjb21waWxlLgotICovCi0jZGVmaW5lCU9NQUdJQwkwNDA3CQkvKiBvbGQgaW1wdXJlIGZvcm1hdCAqLwotI2RlZmluZQlOTUFHSUMJMDQxMAkJLyogcmVhZC1vbmx5IHRleHQgKi8KLSNkZWZpbmUJWk1BR0lDCTA0MTMJCS8qIGRlbWFuZCBsb2FkIGZvcm1hdCAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUJKEJNQUdJQykKLSNlbmRpZiAvKiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKi8KLQotLyogRklMRSBIRUFERVIKLSAqCUFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICoJQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotICoJCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0gKgkJYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLgotICovCi1zdHJ1Y3QgZXhlYwotICB7Ci0gICAgLyogU3RhbmRhcmQgc3R1ZmYgKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfbWFnaWM7CS8qIElkZW50aWZpZXMgdGhpcyBhcyBhIGIub3V0IGZpbGUJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfdGV4dDsJLyogTGVuZ3RoIG9mIHRleHQJCQkqLwotICAgIHVuc2lnbmVkIGxvbmcgYV9kYXRhOwkvKiBMZW5ndGggb2YgZGF0YQkJCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX2JzczsJLyogTGVuZ3RoIG9mIHJ1bnRpbWUgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfc3ltczsJLyogTGVuZ3RoIG9mIHN5bWJvbCB0YWJsZQkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIFJ1bnRpbWUgc3RhcnQgYWRkcmVzcwkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfdHJzaXplOwkvKiBMZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwkvKiBMZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8JKi8KLQotICAgIC8qIEFkZGVkIGZvciBpOTYwICovCi0gICAgdW5zaWduZWQgbG9uZyBhX3Rsb2FkOwkvKiBUZXh0IHJ1bnRpbWUgbG9hZCBhZGRyZXNzCQkqLwotICAgIHVuc2lnbmVkIGxvbmcgYV9kbG9hZDsJLyogRGF0YSBydW50aW1lIGxvYWQgYWRkcmVzcwkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfdGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50CQkqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9kYWxpZ247CS8qIEFsaWdubWVudCBvZiBkYXRhIHNlZ21lbnQJCSovCi0gICAgdW5zaWduZWQgY2hhciBhX2JhbGlnbjsJLyogQWxpZ25tZW50IG9mIGJzcyBzZWdtZW50CQkqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9yZWxheGFibGU7CS8qIENvbnRhaW5zIGVub3VnaCBpbmZvIHRvIHJlbGF4ICAgICAqLwotICB9OwotCi0jZGVmaW5lIE5fQkFETUFHKHgpCSgoKHgpLmFfbWFnaWMpIT1CTUFHSUMpCi0jZGVmaW5lIE5fVFhUT0ZGKHgpCSggc2l6ZW9mKHN0cnVjdCBleGVjKSApCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0ICkKLSNkZWZpbmUgTl9UUk9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCi0jZGVmaW5lIE5fRFJPRkYoeCkJKCBOX1RST0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RST0ZGKHgpICsgKHgpLmFfZHJzaXplICkKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotCi0vKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gKi8KLXN0cnVjdCBubGlzdAotICB7Ci0gICAgdW5pb24KLSAgICAgIHsKLQljaGFyICpuX25hbWU7Ci0Jc3RydWN0IG5saXN0ICpuX25leHQ7Ci0JbG9uZyBuX3N0cng7CQkvKiBJbmRleCBpbnRvIHN0cmluZyB0YWJsZQkqLwotICAgICAgfQotICAgIG5fdW47Ci0gICAgdW5zaWduZWQgY2hhciBuX3R5cGU7CS8qIFNlZSBiZWxvdwkJCQkqLwotICAgIGNoYXIgbl9vdGhlcjsJCS8qIFVzZWQgaW4gaTgwOTYwIHN1cHBvcnQgLS0gc2VlIGJlbG93CSovCi0gICAgc2hvcnQgbl9kZXNjOwotICAgIHVuc2lnbmVkIGxvbmcgbl92YWx1ZTsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgbmxpc3Qgb2JqX3N5bWJvbF90eXBlOwotCi0vKiBMZWdhbCB2YWx1ZXMgb2Ygbl90eXBlCi0gKi8KLSNkZWZpbmUgTl9VTkRGCTAJCS8qIFVuZGVmaW5lZCBzeW1ib2wJKi8KLSNkZWZpbmUgTl9BQlMJMgkJLyogQWJzb2x1dGUgc3ltYm9sCSovCi0jZGVmaW5lIE5fVEVYVAk0CQkvKiBUZXh0IHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9EQVRBCTYJCS8qIERhdGEgc3ltYm9sCQkqLwotI2RlZmluZSBOX0JTUwk4CQkvKiBCU1Mgc3ltYm9sCQkqLwotI2RlZmluZSBOX0ZOCTMxCQkvKiBGaWxlbmFtZSBzeW1ib2wJKi8KLQotI2RlZmluZSBOX0VYVAkxCQkvKiBFeHRlcm5hbCBzeW1ib2wgKE9SJ2QgaW4gd2l0aCBvbmUgb2YgYWJvdmUpCSovCi0jZGVmaW5lIE5fVFlQRQkwMzYJCS8qIE1hc2sgZm9yIGFsbCB0aGUgdHlwZSBiaXRzCQkJKi8KLSNkZWZpbmUgTl9TVEFCCTAzNDAJCS8qIE1hc2sgZm9yIGFsbCBiaXRzIHVzZWQgZm9yIFNEQiBlbnRyaWVzIAkqLwotCi0jaWZuZGVmIENVU1RPTV9SRUxPQ19GT1JNQVQKLXN0cnVjdCByZWxvY2F0aW9uX2luZm8KLSAgewotICAgIGludCByX2FkZHJlc3M7CQkvKiBGaWxlIGFkZHJlc3Mgb2YgaXRlbSB0byBiZSByZWxvY2F0ZWQJKi8KLSAgICB1bnNpZ25lZAotICAgICAgcl9pbmRleDoyNCwJCS8qIEluZGV4IG9mIHN5bWJvbCBvbiB3aGljaCByZWxvY2F0aW9uIGlzIGJhc2VkKi8KLSAgICAgIHJfcGNyZWw6MSwJCS8qIDEgPT4gcmVsb2NhdGUgUEMtcmVsYXRpdmU7IGVsc2UgYWJzb2x1dGUKLQkJICoJT24gaTk2MCwgcGMtcmVsYXRpdmUgaW1wbGllcyAyNC1iaXQKLQkJICoJYWRkcmVzcywgYWJzb2x1dGUgaW1wbGllcyAzMi1iaXQuCi0JCSAqLwotICAgICAgcl9sZW5ndGg6MiwJCS8qIE51bWJlciBvZiBieXRlcyB0byByZWxvY2F0ZToKLQkJICoJMCA9PiAxIGJ5dGUKLQkJICoJMSA9PiAyIGJ5dGVzCi0JCSAqCTIgPT4gNCBieXRlcyAtLSBvbmx5IHZhbHVlIHVzZWQgZm9yIGk5NjAKLQkJICovCi0gICAgICByX2V4dGVybjoxLCByX2JzcjoxLAkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0gICAgICByX2Rpc3A6MSwJCQkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCi0gICAgICByX2NhbGxqOjEsCQkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLwotICAgICAgbnV0aGluOjE7CQkJLyogVW51c2VkCQkJCSovCi0gIH07Ci0KLSNlbmRpZiAvKiBDVVNUT01fUkVMT0NfRk9STUFUICovCi0KLS8qCi0gKiAgTWFjcm9zIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqICBUaGlzIHN5bnRheGljIGluZGlyZWN0aW9uIGFsbG93cyBpbmRlcGVuZGVuY2UgcmVnYXJkaW5nIGEub3V0IG9yIGNvZmYuCi0gKiAgVGhlIGFyZ3VtZW50IChzKSBvZiBhbGwgdGhlc2UgbWFjcm9zIGlzIGEgcG9pbnRlciB0byBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqLwotCi0vKiBQcmVkaWNhdGVzICovCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19JU19FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0KLS8qIFRydWUgaWYgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQsIGllIGlzIGluIE5fe1RFWFQsREFUQSxCU1MsQUJTfSBvciBOX0VYVCAqLwotI2RlZmluZSBTX0lTX0RFRklORUQocykJCSgoU19HRVRfVFlQRShzKSAhPSBOX1VOREYpIHx8IChTX0dFVF9ERVNDKHMpICE9IDApKQotCi0jZGVmaW5lIFNfSVNfQ09NTU9OKHMpIFwKLSAgKFNfR0VUX1RZUEUgKHMpID09IE5fVU5ERiAmJiBTX0dFVF9WQUxVRSAocykgIT0gMCkKLQotI2RlZmluZSBTX0lTX1JFR0lTVEVSKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPT0gTl9SRUdJU1RFUikKLQotLyogVHJ1ZSBpZiBhIGRlYnVnIHNwZWNpYWwgc3ltYm9sIGVudHJ5ICovCi0jZGVmaW5lIFNfSVNfREVCVUcocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1NUQUIpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIGxvY2FsIHN5bWJvbCBuYW1lICovCi0jZGVmaW5lIFNfSVNfTE9DQUwocykgCQkJCQlcCi0gICgoU19HRVRfTkFNRSAocykgCQkJCQlcCi0gICAgJiYgIVNfSVNfREVCVUcgKHMpIAkJCQkJXAotICAgICYmIChzdHJjaHIgKFNfR0VUX05BTUUgKHMpLCAnXDAwMScpICE9IE5VTEwJCVwKLSAgICAgICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDInKSAhPSBOVUxMCVwKLSAgICAgICAgfHwgKFNfTE9DQUxfTkFNRShzKSAmJiAhZmxhZ19rZWVwX2xvY2FscykpKQlcCi0gICB8fCAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZQkJCVwKLSAgICAgICAmJiAhU19JU19FWFRFUk5BTChzKQkJCQlcCi0gICAgICAgJiYgU19HRVRfU0VHTUVOVChzKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlY2F1c2Ugb2YgYSAuc3RhYmQgZGlyZWN0aXZlICovCi0jZGVmaW5lIFNfSVNfU1RBQkQocykJCShTX0dFVF9OQU1FKHMpID09IE5VTEwpCi0KLS8qIEFjY2Vzc29ycyAqLwotLyogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9OQU1FKHMpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX25hbWUpCi0vKiBUaGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfR0VUX09GRlNFVChzKQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9zdHJ4KQotLyogVGhlIHR5cGUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9UWVBFKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9UWVBFKQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19HRVRfU0VHTUVOVChzKQkoTl9UWVBFX3NlZ1tTX0dFVF9UWVBFKHMpXSkKLS8qIFRoZSBuX290aGVyIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19HRVRfT1RIRVIocykJCSgocyktPnN5X3N5bWJvbC5uX290aGVyKQotLyogVGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX0RFU0MocykJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MpCi0KLS8qIE1vZGlmaWVycyAqLwotLyogQXNzdW1lIHRoYXQgYSBzeW1ib2wgY2Fubm90IGJlIHNpbXVsdGFuZW91c2x5IGluIG1vcmUgdGhhbiBvbiBzZWdtZW50ICovCi0vKiBzZXQgc2VnbWVudCAqLwotI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsc2VnKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX1RZUEUsKHMpLT5zeV9zeW1ib2wubl90eXBlfD1TRUdNRU5UX1RPX1NZTUJPTF9UWVBFKHNlZykpCi0vKiBUaGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfU0VUX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgfD0gTl9FWFQpCi0vKiBUaGUgc3ltYm9sIGlzIG5vdCBleHRlcm5hbCAqLwotI2RlZmluZSBTX0NMRUFSX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJj0gfk5fRVhUKQotLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX25hbWUgPSAodikpCi0vKiBTZXQgdGhlIG9mZnNldCBpbiB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfU0VUX09GRlNFVChzLHYpCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fc3RyeCA9ICh2KSkKLS8qIFNldCB0aGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX09USEVSKHMsdikJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIgPSAodikpCi0vKiBTZXQgdGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX0RFU0Mocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYyA9ICh2KSkKLS8qIFNldCB0aGUgbl90eXBlIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX1RZUEUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9ICh2KSkKLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0jZGVmaW5lIEhfR0VUX0ZJTEVfU0laRShoKQkoc2l6ZW9mKHN0cnVjdCBleGVjKSArIFwKLQkJCQkgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpICsgXAotCQkJCSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKSArIFwKLQkJCQkgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkgKyBcCi0JCQkJIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpICsgXAotCQkJCSAoaCktPnN0cmluZ190YWJsZV9zaXplKQotCi0jZGVmaW5lIEhfR0VUX0hFQURFUl9TSVpFKGgpCQkoc2l6ZW9mKHN0cnVjdCBleGVjKSkKLSNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV90ZXh0KQotI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2RhdGEpCi0jZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9ic3MpCi0jZGVmaW5lIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX3Ryc2l6ZSkKLSNkZWZpbmUgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfZHJzaXplKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKQkoKGgpLT5oZWFkZXIuYV9zeW1zKQotI2RlZmluZSBIX0dFVF9NQUdJQ19OVU1CRVIoaCkJCSgoaCktPmhlYWRlci5hX2luZm8pCi0jZGVmaW5lIEhfR0VUX0VOVFJZX1BPSU5UKGgpCQkoKGgpLT5oZWFkZXIuYV9lbnRyeSkKLSNkZWZpbmUgSF9HRVRfU1RSSU5HX1NJWkUoaCkJCSgoaCktPnN0cmluZ190YWJsZV9zaXplKQotI2RlZmluZSBIX0dFVF9MSU5FTk9fU0laRShoKQkJKDApCi0KLSNpZmRlZiBFWEVDX01BQ0hJTkVfVFlQRQotI2RlZmluZSBIX0dFVF9NQUNISU5FX1RZUEUoaCkJCSgoaCktPmhlYWRlci5hX21hY2h0eXBlKQotI2VuZGlmIC8qIEVYRUNfTUFDSElORV9UWVBFICovCi0jaWZkZWYgRVhFQ19WRVJTSU9OCi0jZGVmaW5lIEhfR0VUX1ZFUlNJT04oaCkJCSgoaCktPmhlYWRlci5hX3ZlcnNpb24pCi0jZW5kaWYgLyogRVhFQ19WRVJTSU9OICovCi0KLSNkZWZpbmUgSF9TRVRfVEVYVF9TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX3RleHQgPSAodikpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9kYXRhID0gKHYpKQotI2RlZmluZSBIX1NFVF9CU1NfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9ic3MgPSAodikpCi0KLSNkZWZpbmUgSF9TRVRfUkVMT0NBVElPTl9TSVpFKGgsdCxkKQkoSF9TRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoKGgpLCh0KSksXAotCQkJCQkgSF9TRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoKGgpLChkKSkpCi0KLSNkZWZpbmUgSF9TRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV90cnNpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfZHJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRShoLHYpCSgoaCktPmhlYWRlci5hX3N5bXMgPSAodikgKiBcCi0JCQkJCSBzaXplb2Yoc3RydWN0IG5saXN0KSkKLQotI2RlZmluZSBIX1NFVF9NQUdJQ19OVU1CRVIoaCx2KQkJKChoKS0+aGVhZGVyLmFfbWFnaWMgPSAodikpCi0KLSNkZWZpbmUgSF9TRVRfRU5UUllfUE9JTlQoaCx2KQkJKChoKS0+aGVhZGVyLmFfZW50cnkgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NUUklOR19TSVpFKGgsdikJCSgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQotI2lmZGVmIEVYRUNfTUFDSElORV9UWVBFCi0jZGVmaW5lIEhfU0VUX01BQ0hJTkVfVFlQRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9tYWNodHlwZSA9ICh2KSkKLSNlbmRpZiAvKiBFWEVDX01BQ0hJTkVfVFlQRSAqLwotI2lmZGVmIEVYRUNfVkVSU0lPTgotI2RlZmluZSBIX1NFVF9WRVJTSU9OKGgsdikJCSgoaCktPmhlYWRlci5hX3ZlcnNpb24gPSAodikpCi0jZW5kaWYgLyogRVhFQ19WRVJTSU9OICovCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgZXhlYyBoZWFkZXI7CQkvKiBhLm91dCBoZWFkZXIgKi8KLSAgICBsb25nIHN0cmluZ190YWJsZV9zaXplOwkvKiBuYW1lcyArICdcMCcgKyBzaXplb2YoaW50KSAqLwotICB9Ci0KLW9iamVjdF9oZWFkZXJzOwotCi0vKiB1bnVzZWQgaG9va3MuICovCi0jZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLCBiLCBjKQl7O30KLSNkZWZpbmUgb2JqX3ByZV93cml0ZV9ob29rKGEpCQl7O30KLQotI2lmIF9fU1REQ19fCi1zdHJ1Y3QgZml4OwotI2VuZGlmCi1leHRlcm4gdm9pZCB0Y19hb3V0X2ZpeF90b19jaGFycyBQQVJBTVMgKChjaGFyICp3aGVyZSwKLQkJCQkJICBzdHJ1Y3QgZml4ICpmaXhQLAotCQkJCQkgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzcykpOwotZXh0ZXJuIHZvaWQgdGNfYm91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsCi0JCQkJCSAgc3RydWN0IGZpeCAqZml4UCwKLQkJCQkJICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3MpKTsKLQotI2RlZmluZSBBT1VUX1NUQUJTCi0KLS8qIGVuZCBvZiBvYmotYm91dC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1jb2ZmLmMgYi9nYXMvY29uZmlnL29iai1jb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NTA4NjguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYxNiArMCwwIEBACi0vKiBjb2ZmIG9iamVjdCBmaWxlIGZvcm1hdAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPQkpfSEVBREVSICJvYmotY29mZi5oIgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0vKiBJIHRoaW5rIHRoaXMgaXMgcHJvYmFibHkgYWx3YXlzIGNvcnJlY3QuICAqLwotI2lmbmRlZiBLRUVQX1JFTE9DX0lORk8KLSNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgb2JqX2NvZmZfYnNzIFBBUkFNUyAoKGludCkpOwotY29uc3QgY2hhciAqc19nZXRfbmFtZSBQQVJBTVMgKChzeW1ib2xTICogcykpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfbG4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9kZWYgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9lbmRlZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2RpbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2xpbmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9zaXplIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfc2NsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfdGFnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfdmFsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfdHlwZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2lkZW50IFBBUkFNUyAoKGludCkpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2xvYyBQQVJBTVMoKGludCkpOwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdXNlZCB0byBob2xkIHRoZSBzeW1ib2wgYnVpbHQgYnkgYSBzZXF1ZW5jZSBvZiBwc2V1ZG8tb3BzCi0gICBmcm9tIC5kZWYgYW5kIC5lbmRlZi4gICovCi1zdGF0aWMgc3ltYm9sUyAqZGVmX3N5bWJvbF9pbl9wcm9ncmVzczsKLQwKLS8qIHN0YWNrIHN0dWZmICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBjaHVua19zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgZWxlbWVudF9zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICBjaGFyICpkYXRhOwotICAgIHVuc2lnbmVkIGxvbmcgcG9pbnRlcjsKLSAgfQotc3RhY2s7Ci0KLXN0YXRpYyBzdGFjayAqCi1zdGFja19pbml0IChjaHVua19zaXplLCBlbGVtZW50X3NpemUpCi0gICAgIHVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbGVtZW50X3NpemU7Ci17Ci0gIHN0YWNrICpzdDsKLQotICBzdCA9IChzdGFjayAqKSBtYWxsb2MgKHNpemVvZiAoc3RhY2spKTsKLSAgaWYgKCFzdCkKLSAgICByZXR1cm4gMDsKLSAgc3QtPmRhdGEgPSBtYWxsb2MgKGNodW5rX3NpemUpOwotICBpZiAoIXN0LT5kYXRhKQotICAgIHsKLSAgICAgIGZyZWUgKHN0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgc3QtPnBvaW50ZXIgPSAwOwotICBzdC0+c2l6ZSA9IGNodW5rX3NpemU7Ci0gIHN0LT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKLSAgc3QtPmVsZW1lbnRfc2l6ZSA9IGVsZW1lbnRfc2l6ZTsKLSAgcmV0dXJuIHN0OwotfQotCi0jaWYgMAotLyogTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLXN0YXRpYyB2b2lkCi1zdGFja19kZWxldGUgKHN0KQotICAgICBzdGFjayAqc3Q7Ci17Ci0gIGZyZWUgKHN0LT5kYXRhKTsKLSAgZnJlZSAoc3QpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICoKLXN0YWNrX3B1c2ggKHN0LCBlbGVtZW50KQotICAgICBzdGFjayAqc3Q7Ci0gICAgIGNoYXIgKmVsZW1lbnQ7Ci17Ci0gIGlmIChzdC0+cG9pbnRlciArIHN0LT5lbGVtZW50X3NpemUgPj0gc3QtPnNpemUpCi0gICAgewotICAgICAgc3QtPnNpemUgKz0gc3QtPmNodW5rX3NpemU7Ci0gICAgICBpZiAoKHN0LT5kYXRhID0geHJlYWxsb2MgKHN0LT5kYXRhLCBzdC0+c2l6ZSkpID09IChjaGFyICopIDApCi0JcmV0dXJuIChjaGFyICopIDA7Ci0gICAgfQotICBtZW1jcHkgKHN0LT5kYXRhICsgc3QtPnBvaW50ZXIsIGVsZW1lbnQsIHN0LT5lbGVtZW50X3NpemUpOwotICBzdC0+cG9pbnRlciArPSBzdC0+ZWxlbWVudF9zaXplOwotICByZXR1cm4gc3QtPmRhdGEgKyBzdC0+cG9pbnRlcjsKLX0KLQotc3RhdGljIGNoYXIgKgotc3RhY2tfcG9wIChzdCkKLSAgICAgc3RhY2sgKnN0OwotewotICBpZiAoc3QtPnBvaW50ZXIgPCBzdC0+ZWxlbWVudF9zaXplKQotICAgIHsKLSAgICAgIHN0LT5wb2ludGVyID0gMDsKLSAgICAgIHJldHVybiAoY2hhciAqKSAwOwotICAgIH0KLSAgc3QtPnBvaW50ZXIgLT0gc3QtPmVsZW1lbnRfc2l6ZTsKLSAgcmV0dXJuIHN0LT5kYXRhICsgc3QtPnBvaW50ZXI7Ci19Ci0MCi0vKgotICogTWFpbnRhaW4gYSBsaXN0IG9mIHRoZSB0YWduYW1lcyBvZiB0aGUgc3RydWN0cmVzLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWdfaGFzaDsKLQotc3RhdGljIHZvaWQKLXRhZ19pbml0ICgpCi17Ci0gIHRhZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10YWdfaW5zZXJ0IChuYW1lLCBzeW1ib2xQKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBjb25zdCBjaGFyICplcnJvcl9zdHJpbmc7Ci0KLSAgaWYgKChlcnJvcl9zdHJpbmcgPSBoYXNoX2phbSAodGFnX2hhc2gsIG5hbWUsIChjaGFyICopIHN5bWJvbFApKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cnVjdHVyZSB0YWJsZSBmYWlsZWQ6ICVzIiksCi0JCW5hbWUsIGVycm9yX3N0cmluZyk7Ci0gICAgfQotfQotCi1zdGF0aWMgc3ltYm9sUyAqCi10YWdfZmluZCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmICgqbmFtZSA9PSAnXycpCi0gICAgbmFtZSsrOwotI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLSAgcmV0dXJuIChzeW1ib2xTICopIGhhc2hfZmluZCAodGFnX2hhc2gsIG5hbWUpOwotfQotCi1zdGF0aWMgc3ltYm9sUyAqCi10YWdfZmluZF9vcl9tYWtlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGlmICgoc3ltYm9sUCA9IHRhZ19maW5kIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkgICAgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICAgICAgdGFnX2luc2VydCAoU19HRVRfTkFNRSAoc3ltYm9sUCksIHN5bWJvbFApOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotI2VuZGlmCi0gICAgfQkJCQkvKiBub3QgZm91bmQgKi8KLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQotLyogV2UgYWNjZXB0IHRoZSAuYnNzIGRpcmVjdGl2ZSB0byBzZXQgdGhlIHNlY3Rpb24gZm9yIGJhY2t3YXJkCi0gICBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBnYXMuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfYnNzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLSAgICBzdWJzZWdfbmV3ICgiLmJzcyIsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZWxzZQotICAgIHNfbGNvbW0gKDApOwotfQotCi0vKiBIYW5kbGUgLndlYWsuICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl93ZWFrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0jaWZkZWYgQkZEX0FTU0VNTEVSCi0gICAgICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLSNlbmRpZgotCi0jaWZkZWYgVEVfUEUKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTlRfV0VBSyk7Ci0jZWxzZQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19XRUFLRVhUKTsKLSNlbmRpZgotCi0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXN0YXRpYyB2b2lkIFNBX1NFVF9TWU1fVEFHTkRYIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci0KLSNkZWZpbmUgR0VUX0ZJTEVOQU1FX1NUUklORyhYKSBcCi0oKGNoYXIqKSgmKChYKS0+c3lfc3ltYm9sLm9zdF9hdXhlbnQtPnhfZmlsZS54X24ueF9vZmZzZXQpKVsxXSkKLQotLyogQEAgSWNrLiAgKi8KLXN0YXRpYyBzZWdUCi1mZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24gKCkKLXsKLSAgc3RhdGljIHNlZ1QgZGVidWdfc2VjdGlvbjsKLSAgaWYgKCFkZWJ1Z19zZWN0aW9uKQotICAgIHsKLSAgICAgIENPTlNUIGFzeW1ib2wgKnM7Ci0gICAgICBzID0gYmZkX21ha2VfZGVidWdfc3ltYm9sIChzdGRvdXRwdXQsIChjaGFyICopIDAsIDApOwotICAgICAgYXNzZXJ0IChzICE9IDApOwotICAgICAgZGVidWdfc2VjdGlvbiA9IHMtPnNlY3Rpb247Ci0gICAgfQotICByZXR1cm4gZGVidWdfc2VjdGlvbjsKLX0KLQotdm9pZAotU0FfU0VUX1NZTV9FTkRORFggKHN5bSwgdmFsKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHN5bWJvbFMgKnZhbDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50cnksICpwOwotCi0gIGVudHJ5ID0gJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlWzFdOwotICBwID0gY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHZhbCkpLT5uYXRpdmU7Ci0gIGVudHJ5LT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wID0gcDsKLSAgZW50cnktPmZpeF9lbmQgPSAxOwotfQotCi1zdGF0aWMgdm9pZAotU0FfU0VUX1NZTV9UQUdORFggKHN5bSwgdmFsKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHN5bWJvbFMgKnZhbDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50cnksICpwOwotCi0gIGVudHJ5ID0gJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlWzFdOwotICBwID0gY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHZhbCkpLT5uYXRpdmU7Ci0gIGVudHJ5LT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wID0gcDsKLSAgZW50cnktPmZpeF90YWcgPSAxOwotfQotCi1zdGF0aWMgaW50Ci1TX0dFVF9EQVRBX1RZUEUgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICByZXR1cm4gY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmUtPnUuc3ltZW50Lm5fdHlwZTsKLX0KLQotaW50Ci1TX1NFVF9EQVRBX1RZUEUgKHN5bSwgdmFsKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGludCB2YWw7Ci17Ci0gIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSB2YWw7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLWludAotU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3M7Ci19Ci0KLWludAotU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50IHZhbDsKLXsKLSAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gdmFsOwotICByZXR1cm4gdmFsOwotfQotCi0vKiBNZXJnZSBhIGRlYnVnIHN5bWJvbCBjb250YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uIGludG8gYSBub3JtYWwgc3ltYm9sLiAqLwotCi12b2lkCi1jX3N5bWJvbF9tZXJnZSAoZGVidWcsIG5vcm1hbCkKLSAgICAgc3ltYm9sUyAqZGVidWc7Ci0gICAgIHN5bWJvbFMgKm5vcm1hbDsKLXsKLSAgU19TRVRfREFUQV9UWVBFIChub3JtYWwsIFNfR0VUX0RBVEFfVFlQRSAoZGVidWcpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAobm9ybWFsLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWJ1ZykpOwotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwpKQotICAgIHsKLSAgICAgIC8qIHRha2UgdGhlIG1vc3Qgd2UgaGF2ZSAqLwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAobm9ybWFsLCBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykpOwotICAgIH0KLQotICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpID4gMCkKLSAgICB7Ci0gICAgICAvKiBNb3ZlIGFsbCB0aGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIG1lbWNweSAoU1lNX0FVWElORk8gKG5vcm1hbCksIFNZTV9BVVhJTkZPIChkZWJ1ZyksCi0JICAgICAgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKQotCSAgICAgICAqIHNpemVvZiAoKlNZTV9BVVhJTkZPIChkZWJ1ZykpKSk7Ci0gICAgfQotCi0gIC8qIE1vdmUgdGhlIGRlYnVnIGZsYWdzLiAqLwotICBTRl9TRVRfREVCVUdfRklFTEQgKG5vcm1hbCwgU0ZfR0VUX0RFQlVHX0ZJRUxEIChkZWJ1ZykpOwotfQotCi12b2lkCi1jX2RvdF9maWxlX3N5bWJvbCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qIEJGRCBjb252ZXJ0cyBmaWxlbmFtZSB0byBhIC5maWxlIHN5bWJvbCB3aXRoIGFuIGF1eCBlbnRyeS4gIEl0Ci0gICAgIGFsc28gaGFuZGxlcyBjaGFpbmluZy4gICovCi0gIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChmaWxlbmFtZSwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0ZJTEUpOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKLQotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0gICAgaWYgKGxpc3RpbmcpCi0gICAgICB7Ci0JbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZW5hbWUpOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3ltYm9sIGlzIGZpcnN0IG9uIHRoZSBzeW1ib2wgY2hhaW4gKi8KLSAgaWYgKHN5bWJvbF9yb290UCAhPSBzeW1ib2xQKQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2luc2VydCAoc3ltYm9sUCwgc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICB9CQkJCS8qIGlmIG5vdCBmaXJzdCBvbiB0aGUgbGlzdCAqLwotfQotCi0vKiBMaW5lIG51bWJlciBoYW5kbGluZyAqLwotCi1zdHJ1Y3QgbGluZV9ubyB7Ci0gIHN0cnVjdCBsaW5lX25vICpuZXh0OwotICBmcmFnUyAqZnJhZzsKLSAgYWxlbnQgbDsKLX07Ci0KLWludCBjb2ZmX2xpbmVfYmFzZTsKLQotLyogU3ltYm9sIG9mIGxhc3QgZnVuY3Rpb24sIHdoaWNoIHdlIHNob3VsZCBoYW5nIGxpbmUjcyBvZmYgb2YuICAqLwotc3RhdGljIHN5bWJvbFMgKmxpbmVfZnN5bTsKLQotI2RlZmluZSBpbl9mdW5jdGlvbigpCQkobGluZV9mc3ltICE9IDApCi0jZGVmaW5lIGNsZWFyX2Z1bmN0aW9uKCkJKGxpbmVfZnN5bSA9IDApCi0jZGVmaW5lIHNldF9mdW5jdGlvbihGKQkJKGxpbmVfZnN5bSA9IChGKSwgY29mZl9hZGRfbGluZXN5bSAoRikpCi0KLQwKLXZvaWQKLWNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgbG9uZyAgIHN6ID0gKE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTICsgMSkgKiBzaXplb2YgKGNvbWJpbmVkX2VudHJ5X3R5cGUpOwotICBjaGFyICogcyAgPSAoY2hhciAqKSB4bWFsbG9jIChzeik7Ci0gIAotICBtZW1zZXQgKHMsIDAsIHN6KTsKLSAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApKS0+bmF0aXZlID0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgczsKLQotICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFRfTlVMTCk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIDApOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAwKTsKLQotICBpZiAoU19JU19TVFJJTkcgKHN5bWJvbFApKQotICAgIFNGX1NFVF9TVFJJTkcgKHN5bWJvbFApOwotICAKLSAgaWYgKFNfSVNfTE9DQUwgKHN5bWJvbFApKQotICAgIFNGX1NFVF9MT0NBTCAoc3ltYm9sUCk7Ci19Ci0KLQwKLS8qCi0gKiBIYW5kbGUgLmxuIGRpcmVjdGl2ZXMuCi0gKi8KLQotc3RhdGljIHN5bWJvbFMgKmN1cnJlbnRfbGluZW5vX3N5bTsKLXN0YXRpYyBzdHJ1Y3QgbGluZV9ubyAqbGluZV9ub3M7Ci0vKiBAQCBCbGluZGx5IGFzc3VtZSBhbGwgLmxuIGRpcmVjdGl2ZXMgd2lsbCBiZSBpbiB0aGUgLnRleHQgc2VjdGlvbi4uLiAgKi8KLWludCBjb2ZmX25fbGluZV9ub3M7Ci0KLXN0YXRpYyB2b2lkCi1hZGRfbGluZW5vIChmcmFnLCBvZmZzZXQsIG51bSkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBudW07Ci17Ci0gIHN0cnVjdCBsaW5lX25vICpuZXdfbGluZSA9Ci0gICAgKHN0cnVjdCBsaW5lX25vICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxpbmVfbm8pKTsKLSAgaWYgKCFjdXJyZW50X2xpbmVub19zeW0pCi0gICAgewotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBpZiAobnVtIDw9IDApIAotICAgIHsKLSAgICAgIC8qIFplcm8gaXMgdXNlZCBhcyBhbiBlbmQgbWFya2VyIGluIHRoZSBmaWxlLiAgKi8KLSAgICAgIGFzX3dhcm4gKF8oIkxpbmUgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzXG4iKSk7Ci0gICAgICBudW0gPSAxOwotICAgIH0KLSAgbmV3X2xpbmUtPm5leHQgPSBsaW5lX25vczsKLSAgbmV3X2xpbmUtPmZyYWcgPSBmcmFnOwotICBuZXdfbGluZS0+bC5saW5lX251bWJlciA9IG51bTsKLSAgbmV3X2xpbmUtPmwudS5vZmZzZXQgPSBvZmZzZXQ7Ci0gIGxpbmVfbm9zID0gbmV3X2xpbmU7Ci0gIGNvZmZfbl9saW5lX25vcysrOwotfQotCi12b2lkCi1jb2ZmX2FkZF9saW5lc3ltIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKGxpbmVfbm9zKQotICAgIHsKLSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChjdXJyZW50X2xpbmVub19zeW0pKS0+bGluZW5vID0KLQkoYWxlbnQgKikgbGluZV9ub3M7Ci0gICAgICBjb2ZmX25fbGluZV9ub3MrKzsKLSAgICAgIGxpbmVfbm9zID0gMDsKLSAgICB9Ci0gIGN1cnJlbnRfbGluZW5vX3N5bSA9IHN5bTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xuIChhcHBsaW5lKQotICAgICBpbnQgYXBwbGluZTsKLXsKLSAgaW50IGw7Ci0KLSAgaWYgKCEgYXBwbGluZSAmJiBkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxuIHBzZXVkby1vcCBpbnNpZGUgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoIWFwcGxpbmUpCi0gICAgewotICAgICAgYWRkX2xpbmVubyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgbCk7Ci0gICAgfQotCi0gIGlmIChhcHBsaW5lKQotICAgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIGwgLSAxKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0KLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlpZiAoISBhcHBsaW5lKQotCSAgbCArPSBjb2ZmX2xpbmVfYmFzZSAtIDE7Ci0JbGlzdGluZ19zb3VyY2VfbGluZSAobCk7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIC5sb2MgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgLmxuOyBwYXJzZSBpdCBmb3IgYXNzZW1ibGVyCi0gICBjb21wYXRpYmlsaXR5LiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBsaW5lbm87Ci0KLSAgLyogRklYTUU6IFdoeSBkbyB3ZSBuZWVkIHRoaXMgY2hlY2s/ICBXZSBuZWVkIGl0IGZvciBFQ09GRiwgYnV0IHdoeQotICAgICBkbyB3ZSBuZWVkIGl0IGZvciBDT0ZGPyAgKi8KLSAgaWYgKG5vd19zZWcgIT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sb2Mgb3V0c2lkZSBvZiAudGV4dCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxvYyBwc2V1ZG8tb3AgaW5zaWRlIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGxpbmVubyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLQotICAgIGlmIChsaXN0aW5nKQotICAgICAgewotICAgICAgICBsaW5lbm8gKz0gY29mZl9saW5lX2Jhc2UgLSAxOwotCWxpc3Rpbmdfc291cmNlX2xpbmUgKGxpbmVubyk7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgYWRkX2xpbmVubyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgbGluZW5vKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuaWRlbnQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2lkZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0gIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0jaWZkZWYgVEVfUEUKLSAgewotICAgIHNlZ1Qgc2VjOwotCi0gICAgLyogV2UgY291bGQgcHV0IGl0IGluIC5jb21tZW50LCBidXQgdGhhdCBjcmVhdGVzIGFuIGV4dHJhIHNlY3Rpb24KLSAgICAgICB0aGF0IHNob3VsZG4ndCBiZSBsb2FkZWQgaW50byBtZW1vcnksIHdoaWNoIHJlcXVpcmVzIGxpbmtlcgotICAgICAgIGNoYW5nZXMuLi4gIEZvciBub3csIHVudGlsIHByb3ZlbiBvdGhlcndpc2UsIHVzZSAucmRhdGEuICAqLwotICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIucmRhdGEkenp6IiwgMCk7Ci0gICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywKLQkJCSAgICgoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSkKLQkJCSAgICAmIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCkpKTsKLSAgfQotI2Vsc2UKLSAgc3Vic2VnX25ldyAoIi5jb21tZW50IiwgMCk7Ci0jZW5kaWYKLQotICBzdHJpbmdlciAoMSk7Ci0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci19Ci0KLS8qCi0gKgkJCWRlZigpCi0gKgotICogSGFuZGxlIC5kZWYgZGlyZWN0aXZlcy4KLSAqCi0gKiBPbmUgbWlnaHQgYXNrIDogd2h5IGNhbid0IHdlIHN5bWJvbF9uZXcgaWYgdGhlIHN5bWJvbCBkb2VzIG5vdAotICogYWxyZWFkeSBleGlzdCBhbmQgZmlsbCBpdCB3aXRoIGRlYnVnIGluZm9ybWF0aW9uLiAgQmVjYXVzZSBvZgotICogdGhlIENfRUZDTiBzcGVjaWFsIHN5bWJvbC4gSXQgd291bGQgY2xvYmJlciB0aGUgdmFsdWUgb2YgdGhlCi0gKiBmdW5jdGlvbiBzeW1ib2wgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gbm90aWNlIHRoYXQgaXQgaXMKLSAqIGEgQ19FRkNOLiBBbmQgYSBzZWNvbmQgcmVhc29uIGlzIHRoYXQgdGhlIGNvZGUgaXMgbW9yZSBjbGVhciB0aGlzCi0gKiB3YXkuIChhdCBsZWFzdCBJIHRoaW5rIGl0IGlzIDotKS4KLSAqCi0gKi8KLQotI2RlZmluZSBTS0lQX1NFTUlfQ09MT04oKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICc7JykKLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFUygpCXdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJyB8fCBcCi0JCQkJICAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykgXAotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZGVmICh3aGF0KQotICAgICBpbnQgd2hhdCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyIG5hbWVfZW5kOwkJLyogQ2hhciBhZnRlciB0aGUgZW5kIG9mIG5hbWUgKi8KLSAgY2hhciAqc3ltYm9sX25hbWU7CQkvKiBOYW1lIG9mIHRoZSBkZWJ1ZyBzeW1ib2wgKi8KLSAgY2hhciAqc3ltYm9sX25hbWVfY29weTsJLyogVGVtcG9yYXJ5IGNvcHkgb2YgdGhlIG5hbWUgKi8KLSAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2xlbmd0aDsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU0tJUF9XSElURVNQQUNFUyAoKTsKLQotICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmIChzeW1ib2xfbmFtZVswXSA9PSAnXycgJiYgc3ltYm9sX25hbWVbMV0gIT0gMCkKLSAgICBzeW1ib2xfbmFtZSsrOwotI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLQotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xfbmFtZV9sZW5ndGggPSBzdHJsZW4gKHN5bWJvbF9uYW1lKTsKLSAgc3ltYm9sX25hbWVfY29weSA9IHhtYWxsb2MgKHN5bWJvbF9uYW1lX2xlbmd0aCArIDEpOwotICBzdHJjcHkgKHN5bWJvbF9uYW1lX2NvcHksIHN5bWJvbF9uYW1lKTsKLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgc3ltYm9sX25hbWVfY29weSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWVfY29weSk7Ci0jZW5kaWYKLQotICAvKiBJbml0aWFsaXplIHRoZSBuZXcgc3ltYm9sICovCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBzeW1ib2xfbWFrZSAoc3ltYm9sX25hbWVfY29weSk7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDApOwotCi0gIGlmIChTX0lTX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgU0ZfU0VUX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXVuc2lnbmVkIGludCBkaW1faW5kZXg7Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9lbmRlZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogRElNIEJVRyBGSVggc2FjQGN5Z251cy5jb20gKi8KLSAgZGltX2luZGV4ID0gMDsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBudW1iZXIgYWNjb3JkaW5nIHRvIHN0b3JhZ2UgY2xhc3MuICovCi0gIHN3aXRjaCAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICAgIFNGX1NFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRklMRToKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uICgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VGQ046Ci0gICAgICBTRl9TRVRfTE9DQUwgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBEbyBub3QgZW1pdCB0aGlzIHN5bWJvbC4gKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0JMT0NLOgotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBXaWxsIG5lZWQgcHJvY2Vzc2luZyBiZWZvcmUgd3JpdGluZyAqLwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRkNOOgotICAgICAgewotCUNPTlNUIGNoYXIgKm5hbWU7Ci0JU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGV4dF9zZWN0aW9uKTsKLQotCW5hbWUgPSBTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQlpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAnZicgJiYgbmFtZVszXSA9PSAnXDAnKQotICAJICB7Ci0JICAgIHN3aXRjaCAobmFtZVsxXSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAnYic6ICAKLQkJLyogLmJmICovCi0JCWlmICghIGluX2Z1bmN0aW9uICgpKQotCQkgIGFzX3dhcm4gKF8oImAlcycgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uIiksIG5hbWUpOwotCQkvKiBXaWxsIG5lZWQgcmVsb2NhdGluZy4gICovCi0JCVNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQkJY2xlYXJfZnVuY3Rpb24gKCk7Ci0JCWJyZWFrOwotI2lmZGVmIFRFX1BFCi0JICAgICAgY2FzZSAnZSc6ICAKLQkJLyogLmVmICovCi0JCS8qIFRoZSBNUyBjb21waWxlcnMgb3V0cHV0IHRoZSBhY3R1YWwgZW5kbGluZSwgbm90IHRoZQotCQkgICBmdW5jdGlvbi1yZWxhdGl2ZSBvbmUuLi4gd2Ugd2FudCB0byBtYXRjaCB3aXRob3V0Ci0JCSAgIGNoYW5naW5nIHRoZSBhc3NlbWJsZXIgaW5wdXQuICAqLwotCQlTQV9TRVRfU1lNX0xOTk8gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIAotCQkJCSAoU0FfR0VUX1NZTV9MTk5PIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCQkJCSAgKyBjb2ZmX2xpbmVfYmFzZSkpOwotCQlicmVhazsKLSNlbmRpZgotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgQ19BVVRPQVJHCi0gICAgY2FzZSBDX0FVVE9BUkc6Ci0jZW5kaWYgLyogQ19BVVRPQVJHICovCi0gICAgY2FzZSBDX0FVVE86Ci0gICAgY2FzZSBDX1JFRzoKLSAgICBjYXNlIENfQVJHOgotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgIGNhc2UgQ19GSUVMRDoKLSAgICAgIFNGX1NFVF9ERUJVRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX01PUzoKLSAgICBjYXNlIENfTU9FOgotICAgIGNhc2UgQ19NT1U6Ci0gICAgY2FzZSBDX0VPUzoKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfRVhUOgotICAgIGNhc2UgQ19XRUFLRVhUOgotI2lmZGVmIFRFX1BFCi0gICAgY2FzZSBDX05UX1dFQUs6Ci0jZW5kaWYKLSAgICBjYXNlIENfU1RBVDoKLSAgICBjYXNlIENfTEFCRUw6Ci0gICAgICAvKiBWYWxpZCBidXQgc2V0IHNvbWV3aGVyZSBlbHNlIChzX2NvbW0sIHNfbGNvbW0sIGNvbG9uKSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgIGNhc2UgQ19VU1RBVElDOgotICAgIGNhc2UgQ19FWFRERUY6Ci0gICAgY2FzZSBDX1VMQUJFTDoKLSAgICAgIGFzX3dhcm4gKF8oInVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyAlZCIpLAotCSAgICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSk7Ci0gICAgICBicmVhazsKLSAgICB9CQkJCS8qIHN3aXRjaCBvbiBzdG9yYWdlIGNsYXNzICovCi0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBidWlsdCBhIGRlYnVnIHN5bWJvbCwgdHJ5IHRvIGZpbmQgaWYgd2Ugc2hvdWxkCi0gICAgIG1lcmdlIHdpdGggYW4gZXhpc3Rpbmcgc3ltYm9sIG9yIG5vdC4gIElmIGEgc3ltYm9sIGlzIENfRUZDTiBvcgotICAgICBhYnNvbHV0ZV9zZWN0aW9uIG9yIHVudGFnZ2VkIFNFR19ERUJVRyBpdCBuZXZlciBtZXJnZXMuICBXZSBhbHNvCi0gICAgIGRvbid0IG1lcmdlIGxhYmVscywgd2hpY2ggYXJlIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSwgbm9yCi0gICAgIHN5bWJvbHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4gZGVmaW5lZCBzaW5jZSB0aGV5IGFyZSB0eXBpY2FsbHkKLSAgICAgdW5pcXVlLCBub3IgZG8gd2UgbWVyZ2UgdGFncyB3aXRoIG5vbi10YWdzLiAgKi8KLQotICAvKiBUd28gY2FzZXMgZm9yIGZ1bmN0aW9ucy4gIEVpdGhlciBkZWJ1ZyBmb2xsb3dlZCBieSBkZWZpbml0aW9uIG9yCi0gICAgIGRlZmluaXRpb24gZm9sbG93ZWQgYnkgZGVidWcuICBGb3IgZGVmaW5pdGlvbiBmaXJzdCwgd2Ugd2lsbAotICAgICBtZXJnZSB0aGUgZGVidWcgc3ltYm9sIGludG8gdGhlIGRlZmluaXRpb24uICBGb3IgZGVidWcgZmlyc3QsIHRoZQotICAgICBsaW5lbm8gZW50cnkgTVVTVCBwb2ludCB0byB0aGUgZGVmaW5pdGlvbiBmdW5jdGlvbiBvciBlbHNlIGl0Ci0gICAgIHdpbGwgcG9pbnQgb2ZmIGludG8gc3BhY2Ugd2hlbiBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKCkgbWVyZ2VzCi0gICAgIHRoZSBkZWJ1ZyBzeW1ib2wgaW50byB0aGUgcmVhbCBzeW1ib2wuICBUaGVyZWZvciwgbGV0J3MgcHJlc3VtZQotICAgICB0aGUgZGVidWcgc3ltYm9sIGlzIGEgcmVhbCBmdW5jdGlvbiByZWZlcmVuY2UuICovCi0KLSAgLyogRklYTUUtU09PTiBJZiBmb3Igc29tZSByZWFzb24gdGhlIGRlZmluaXRpb24gbGFiZWwvc3ltYm9sIGlzCi0gICAgIG5ldmVyIHNlZW4sIHRoaXMgd2lsbCBwcm9iYWJseSBsZWF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sIGF0IGxpbmsKLSAgICAgdGltZS4gKi8KLQotICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19FRkNOCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX0xBQkVMCi0gICAgICB8fCAoIXN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwKLQkJCQkJIFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSwKLQkJICAgIipERUJVRyoiKQotCSAgJiYgIVNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgICAgfHwgU19HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgfHwgISBzeW1ib2xfY29uc3RhbnRfcCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLSAgICAgIHx8IChzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPX05PVF9TVFJJUCkpID09IE5VTEwKLSAgICAgIHx8IFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpICE9IFNGX0dFVF9UQUcgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIElmIGl0IGFscmVhZHkgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QsIGRvIG5vdGhpbmcgKi8KLSAgICAgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IHN5bWJvbF9sYXN0UCkKLSAgICAgICAgewotCSAgc3ltYm9sX3JlbW92ZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICBzeW1ib2xfYXBwZW5kIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsCi0JCQkgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN5bWJvbCBhbHJlYWR5IGV4aXN0cywgbWVyZ2UgdGhlIG5ld2x5IGNyZWF0ZWQgc3ltYm9sCi0JIGludG8gdGhlIG9sZCBvbmUuICBUaGlzIGlzIG5vdCBtYW5kYXRvcnkuIFRoZSBsaW5rZXIgY2FuCi0JIGhhbmRsZSBkdXBsaWNhdGUgc3ltYm9scyBjb3JyZWN0bHkuIEJ1dCBJIGd1ZXNzIHRoYXQgaXQgc2F2ZQotCSBhICpsb3QqIG9mIHNwYWNlIGlmIHRoZSBhc3NlbWJseSBmaWxlIGRlZmluZXMgYSBsb3Qgb2YKLQkgc3ltYm9scy4gW2xvaWNdICovCi0KLSAgICAgIC8qIFRoZSBkZWJ1ZyBlbnRyeSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgaXMgbWVyZ2VkIGludG8gdGhlCi0JIHByZXZpb3VzIGRlZmluaXRpb24uICovCi0KLSAgICAgIGNfc3ltYm9sX21lcmdlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xQKTsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gICAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gc3ltYm9sUDsKLQotICAgICAgaWYgKFNGX0dFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkgIHx8IFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpCi0JICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX1NUQVQpCi0JewotCSAgLyogRm9yIGZ1bmN0aW9ucywgYW5kIHRhZ3MsIGFuZCBzdGF0aWMgc3ltYm9scywgdGhlIHN5bWJvbAotCSAgICAgKm11c3QqIGJlIHdoZXJlIHRoZSBkZWJ1ZyBzeW1ib2wgYXBwZWFycy4gIE1vdmUgdGhlCi0JICAgICBleGlzdGluZyBzeW1ib2wgdG8gdGhlIGN1cnJlbnQgcGxhY2UuICovCi0JICAvKiBJZiBpdCBhbHJlYWR5IGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LCBkbyBub3RoaW5nICovCi0JICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBzeW1ib2xfbGFzdFApCi0JICAgIHsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfYXBwZW5kIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgICAgc3ltYm9sUyAqb2xkdGFnOwotCi0gICAgICBvbGR0YWcgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwKLQkJCQkgRE9fTk9UX1NUUklQKTsKLSAgICAgIGlmIChvbGR0YWcgPT0gTlVMTCB8fCAhIFNGX0dFVF9UQUcgKG9sZHRhZykpCi0JdGFnX2luc2VydCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCi0JCSAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICB9Ci0KLSAgaWYgKFNGX0dFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgICAga25vdyAoc2l6ZW9mIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA8PSBzaXplb2YgKGxvbmcpKTsKLSAgICAgIHNldF9mdW5jdGlvbiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLSAgICAgIGlmIChzeW1ib2xQID09IE5VTEwpCi0JewotCSAgLyogVGhhdCBpcywgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoZQotCSAgICAgZnVuY3Rpb24uLi4gKi8KLQkgIHN5bWJvbF90YWJsZV9pbnNlcnQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCX0gLyogZGVmaW5pdGlvbiBmb2xsb3dzIGRlYnVnICovCi0gICAgfSAvKiBDcmVhdGUgdGhlIGxpbmUgbnVtYmVyIGVudHJ5IHBvaW50aW5nIHRvIHRoZSBmdW5jdGlvbiBiZWluZyBkZWZpbmVkICovCi0KLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IE5VTEw7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9kaW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgZGltX2luZGV4OwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0KLSAgZm9yIChkaW1faW5kZXggPSAwOyBkaW1faW5kZXggPCBESU1OVU07IGRpbV9pbmRleCsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0gICAgICBTQV9TRVRfU1lNX0RJTUVOIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBkaW1faW5kZXgsCi0JCQlnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JY2FzZSAnLCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX3dhcm4gKF8oImJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSBpZ25vcmVkIikpOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQljYXNlICdcbic6Ci0JY2FzZSAnOyc6Ci0JICBkaW1faW5kZXggPSBESU1OVU07Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IHRoaXNfYmFzZTsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFByb2JhYmx5IHN0YWJzLXN0eWxlIGxpbmU/ICAqLwotICAgICAgb2JqX2NvZmZfbG4gKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0aGlzX2Jhc2UgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKCFzdHJjbXAgKCIuYmYiLCBTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkpCi0gICAgY29mZl9saW5lX2Jhc2UgPSB0aGlzX2Jhc2U7Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGhpc19iYXNlKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKHN0cmNtcCAoIi5iZiIsIFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSA9PSAwKQotICAgIHsKLSAgICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLQotICAgICAgaWYgKGxpc3RpbmcpCi0JbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgdGhpc19iYXNlKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3NpemUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX1NJWkUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3NjbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnNjbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl90YWcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpzeW1ib2xfbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi50YWcgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWUpOwotI2VuZGlmCi0KLSAgLyogQXNzdW1lIHRoYXQgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSAudGFnIGlzIGFsd2F5cyBkZWZpbmVkLgotICAgICBUaGlzIHdhcyBhIGJhZCBhc3N1bXB0aW9uLiAgSSd2ZSBhZGRlZCBmaW5kX29yX21ha2UuIHhveG9yaWNoLiAqLwotICBTQV9TRVRfU1lNX1RBR05EWCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywKLQkJICAgICB0YWdfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSkpOwotICBpZiAoU0FfR0VUX1NZTV9UQUdORFggKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IDBMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInRhZyBub3QgZm91bmQgZm9yIC50YWcgJXMiKSwgc3ltYm9sX25hbWUpOwotICAgIH0JCQkJLyogbm90IGRlZmluZWQgKi8KLQotICBTRl9TRVRfVEFHR0VEIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl90eXBlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoSVNGQ04gKFNfR0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpICYmCi0gICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBDX1RQREVGKQotICAgIHsKLSAgICAgIFNGX1NFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQkJCQkvKiBpcyBhIGZ1bmN0aW9uICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3ZhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgY2hhciAqc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjaGFyIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKLSNlbmRpZgotICAgICAgaWYgKCFzdHJjbXAgKHN5bWJvbF9uYW1lLCAiLiIpKQotCXsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZnJhZ19ub3cpOwotCSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAvKiBJZiB0aGUgLnZhbCBpcyAhPSBmcm9tIHRoZSAuZGVmIChlLmcuIHN0YXRpY3MpICovCi0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgc3ltYm9sX25hbWUpKQotCXsKLQkgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cC5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSk7Ci0JICBleHAuWF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0JICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZleHApOwotCi0JICAvKiBJZiB0aGUgc2VnbWVudCBpcyB1bmRlZmluZWQgd2hlbiB0aGUgZm9yd2FyZCByZWZlcmVuY2UgaXMKLQkgICAgIHJlc29sdmVkLCB0aGVuIGNvcHkgdGhlIHNlZ21lbnQgaWQgZnJvbSB0aGUgZm9yd2FyZAotCSAgICAgc3ltYm9sLiAgKi8KLQkgIFNGX1NFVF9HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLQkgIC8qIEZJWE1FOiBnY2MgY2FuIGdlbmVyYXRlIGFkZHJlc3MgZXhwcmVzc2lvbnMgaGVyZSBpbgotCSAgICAgdW51c3VhbCBjYXNlcyAoc2VhcmNoIGZvciAib2JzY3VyZSIgaW4gc2Rib3V0LmMpLiAgV2UKLQkgICAgIGp1c3QgaWdub3JlIHRoZSBvZmZzZXQgaGVyZSwgdGh1cyBnZW5lcmF0aW5nIGluY29ycmVjdAotCSAgICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2UgaWdub3JlIHRoZSByZXN0IG9mIHRoZSBsaW5lCi0JICAgICBqdXN0IGJlbG93LiAgKi8KLQl9Ci0gICAgICAvKiBPdGhlcndpc2UsIGl0IGlzIHRoZSBuYW1lIG9mIGEgbm9uIGRlYnVnIHN5bWJvbCBhbmQgaXRzIHZhbHVlCi0gICAgICAgICB3aWxsIGJlIGNhbGN1bGF0ZWQgbGF0ZXIuICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgICB9CQkJCS8qIGlmIHN5bWJvbCBiYXNlZCAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLWNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotICAvKiBUaGVzZSBoYWQgYmV0dGVyIGJlIHRoZSBzYW1lLiAgVXN1YWxseSAxOCBieXRlcy4gKi8KLSNpZm5kZWYgQkZEX0hFQURFUlMKLSAga25vdyAoc2l6ZW9mIChTWU1FTlQpID09IHNpemVvZiAoQVVYRU5UKSk7Ci0gIGtub3cgKFNZTUVTWiA9PSBBVVhFU1opOwotI2VuZGlmCi0gIHRhZ19pbml0ICgpOwotfQotCi0KLXN5bWJvbFMgKmNvZmZfbGFzdF9mdW5jdGlvbjsKLXN0YXRpYyBzeW1ib2xTICpjb2ZmX2xhc3RfYmY7Ci0KLXZvaWQKLWNvZmZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnQpCi0gICAgIHN5bWJvbFMgKnN5bXA7Ci0gICAgIGludCAqcHVudDsKLXsKLSAgc3RhdGljIHN5bWJvbFMgKmxhc3RfdGFnUDsKLSAgc3RhdGljIHN0YWNrICpibG9ja19zdGFjazsKLSAgc3RhdGljIHN5bWJvbFMgKnNldF9lbmQ7Ci0gIHN5bWJvbFMgKm5leHRfc2V0X2VuZCA9IE5VTEw7Ci0KLSAgaWYgKHN5bXAgPT0gJmFic19zeW1ib2wpCi0gICAgewotICAgICAgKnB1bnQgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY3VycmVudF9saW5lbm9fc3ltKQotICAgIGNvZmZfYWRkX2xpbmVzeW0gKChzeW1ib2xTICopIDApOwotCi0gIGlmICghYmxvY2tfc3RhY2spCi0gICAgYmxvY2tfc3RhY2sgPSBzdGFja19pbml0ICg1MTIsIHNpemVvZiAoc3ltYm9sUyopKTsKLQotICBpZiAoU19JU19XRUFLIChzeW1wKSkKLSAgICB7Ci0jaWZkZWYgVEVfUEUKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfTlRfV0VBSyk7Ci0jZWxzZQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19XRUFLRVhUKTsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltcCkKLSAgICAgICYmICFTX0lTX1dFQUsgKHN5bXApCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSAhPSBDX1NUQVQpCi0gICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19FWFQpOwotCi0gIGlmICghU0ZfR0VUX0RFQlVHIChzeW1wKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpyZWFsOwotICAgICAgaWYgKCFTRl9HRVRfTE9DQUwgKHN5bXApCi0JICAmJiAhU0ZfR0VUX1NUQVRJQ1MgKHN5bXApCi0JICAmJiAocmVhbCA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKHN5bXApLCBET19OT1RfU1RSSVApKQotCSAgJiYgcmVhbCAhPSBzeW1wKQotCXsKLQkgIGNfc3ltYm9sX21lcmdlIChzeW1wLCByZWFsKTsKLQkgICpwdW50ID0gMTsKLQl9Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltcCkgJiYgIVNGX0dFVF9MT0NBTCAoc3ltcCkpCi0JewotCSAgYXNzZXJ0IChTX0dFVF9WQUxVRSAoc3ltcCkgPT0gMCk7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltcCk7Ci0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19OVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1wKSA9PSB0ZXh0X3NlY3Rpb24KLQkgICAgICAmJiBzeW1wICE9IHNlZ19pbmZvICh0ZXh0X3NlY3Rpb24pLT5zeW0pCi0JICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfTEFCRUwpOwotCSAgZWxzZQotCSAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX1NUQVQpOwotCX0KLSAgICAgIGlmIChTRl9HRVRfUFJPQ0VTUyAoc3ltcCkpCi0JewotCSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfQkxPQ0spCi0JICAgIHsKLQkgICAgICBpZiAoIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ltcCksICIuYmIiKSkKLQkJc3RhY2tfcHVzaCAoYmxvY2tfc3RhY2ssIChjaGFyICopICZzeW1wKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW1ib2xTICpiZWdpbjsKLQkJICBiZWdpbiA9ICooc3ltYm9sUyAqKikgc3RhY2tfcG9wIChibG9ja19zdGFjayk7Ci0JCSAgaWYgKGJlZ2luID09IDApCi0JCSAgICBhc193YXJuIChfKCJtaXNtYXRjaGVkIC5lYiIpKTsKLQkJICBlbHNlCi0JCSAgICBuZXh0X3NldF9lbmQgPSBiZWdpbjsKLQkJfQotCSAgICB9Ci0JICBpZiAoY29mZl9sYXN0X2Z1bmN0aW9uID09IDAgJiYgU0ZfR0VUX0ZVTkNUSU9OIChzeW1wKSkKLQkgICAgewotCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4cDsKLQkgICAgICBjb2ZmX2xhc3RfZnVuY3Rpb24gPSBzeW1wOwotCSAgICAgIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1wKSA8IDEpCi0JCVNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bXAsIDEpOwotCSAgICAgIGF1eHAgPSBTWU1fQVVYRU5UIChzeW1wKTsKLQkgICAgICBtZW1zZXQgKGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4sIDAsCi0JCSAgICAgIHNpemVvZiAoYXV4cC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbikpOwotCSAgICB9Ci0JICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19FRkNOKQotCSAgICB7Ci0JICAgICAgaWYgKGNvZmZfbGFzdF9mdW5jdGlvbiA9PSAwKQotCQlhc19mYXRhbCAoXygiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiKSk7Ci0JICAgICAgU0FfU0VUX1NZTV9GU0laRSAoY29mZl9sYXN0X2Z1bmN0aW9uLAotCQkJCShsb25nKSAoU19HRVRfVkFMVUUgKHN5bXApCi0JCQkJCS0gU19HRVRfVkFMVUUgKGNvZmZfbGFzdF9mdW5jdGlvbikpKTsKLQkgICAgICBuZXh0X3NldF9lbmQgPSBjb2ZmX2xhc3RfZnVuY3Rpb247Ci0JICAgICAgY29mZl9sYXN0X2Z1bmN0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1wKSkKLQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX0VYVCk7Ci0gICAgICBlbHNlIGlmIChTRl9HRVRfTE9DQUwgKHN5bXApKQotCSpwdW50ID0gMTsKLQotICAgICAgaWYgKFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpCi0Jc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLSAgICAgIC8qIG1vcmUgLi4uICovCi0gICAgfQotCi0gIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLwotICBpZiAoU19JU19XRUFLIChzeW1wKSAmJiBTX0lTX0NPTU1PTiAoc3ltcCkpCi0gICAgYXNfYmFkIChfKCJTeW1ib2wgYCVzJyBjYW4gbm90IGJlIGJvdGggd2VhayBhbmQgY29tbW9uIiksCi0JICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQotICBpZiAoU0ZfR0VUX1RBRyAoc3ltcCkpCi0gICAgbGFzdF90YWdQID0gc3ltcDsKLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19FT1MpCi0gICAgbmV4dF9zZXRfZW5kID0gbGFzdF90YWdQOwotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gIC8qIFRoaXMgaXMgcHJldHR5IGhvcnJpYmxlLCBidXQgd2UgaGF2ZSB0byBzZXQgKnB1bnQgY29ycmVjdGx5IGluCi0gICAgIG9yZGVyIHRvIGNhbGwgU0FfU0VUX1NZTV9FTkRORFggY29ycmVjdGx5LiAgKi8KLSAgaWYgKCEgc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCAoc3ltcCkKLSAgICAgICYmICgoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAotCSAgfHwgKCEgU19JU19FWFRFUk5BTCAoc3ltcCkKLQkgICAgICAmJiAhIHN5bWJvbF9nZXRfdGMgKHN5bXApLT5vdXRwdXQKLQkgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSAhPSBDX0ZJTEUpKSkKLSAgICAqcHVudCA9IDE7Ci0jZW5kaWYKLQotICBpZiAoc2V0X2VuZCAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAhICpwdW50Ci0gICAgICAmJiAoKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgIT0gMAotCSAgfHwgKFNfSVNfREVGSU5FRCAoc3ltcCkKLQkgICAgICAmJiAhIFNfSVNfQ09NTU9OIChzeW1wKQotCSAgICAgICYmICghIFNfSVNfRVhURVJOQUwgKHN5bXApIHx8IFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpKSkpCi0gICAgewotICAgICAgU0FfU0VUX1NZTV9FTkRORFggKHNldF9lbmQsIHN5bXApOwotICAgICAgc2V0X2VuZCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChuZXh0X3NldF9lbmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc2V0X2VuZCAhPSBOVUxMKQotCWFzX3dhcm4gKCJXYXJuaW5nOiBpbnRlcm5hbCBlcnJvcjogZm9yZ2V0dGluZyB0byBzZXQgZW5kbmR4IG9mICVzIiwKLQkJIFNfR0VUX05BTUUgKHNldF9lbmQpKTsKLSAgICAgIHNldF9lbmQgPSBuZXh0X3NldF9lbmQ7Ci0gICAgfQotCi0gIGlmICghICpwdW50Ci0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSA9PSBDX0ZDTgotICAgICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChzeW1wKSwgIi5iZiIpID09IDApCi0gICAgewotICAgICAgaWYgKGNvZmZfbGFzdF9iZiAhPSBOVUxMKQotCVNBX1NFVF9TWU1fRU5ETkRYIChjb2ZmX2xhc3RfYmYsIHN5bXApOwotICAgICAgY29mZl9sYXN0X2JmID0gc3ltcDsKLSAgICB9Ci0KLSAgaWYgKGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKSktPmxpbmVubykKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHN0cnVjdCBsaW5lX25vICpscHRyOwotICAgICAgYWxlbnQgKmw7Ci0KLSAgICAgIGxwdHIgPSAoc3RydWN0IGxpbmVfbm8gKikgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApKS0+bGluZW5vOwotICAgICAgZm9yIChpID0gMDsgbHB0cjsgbHB0ciA9IGxwdHItPm5leHQpCi0JaSsrOwotICAgICAgbHB0ciA9IChzdHJ1Y3QgbGluZV9ubyAqKSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCkpLT5saW5lbm87Ci0KLSAgICAgIC8qIFdlIG5lZWQgaSBlbnRyaWVzIGZvciBsaW5lIG51bWJlcnMsIHBsdXMgMSBmb3IgdGhlIGZpcnN0Ci0JIGVudHJ5IHdoaWNoIEJGRCB3aWxsIG92ZXJyaWRlLCBwbHVzIDEgZm9yIHRoZSBsYXN0IHplcm8KLQkgZW50cnkgKGEgbWFya2VyIGZvciBCRkQpLiAgKi8KLSAgICAgIGwgPSAoYWxlbnQgKikgeG1hbGxvYyAoKGkgKyAyKSAqIHNpemVvZiAoYWxlbnQpKTsKLSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKSktPmxpbmVubyA9IGw7Ci0gICAgICBsW2kgKyAxXS5saW5lX251bWJlciA9IDA7Ci0gICAgICBsW2kgKyAxXS51LnN5bSA9IE5VTEw7Ci0gICAgICBmb3IgKDsgaSA+IDA7IGktLSkKLQl7Ci0JICBpZiAobHB0ci0+ZnJhZykKLQkgICAgbHB0ci0+bC51Lm9mZnNldCArPSBscHRyLT5mcmFnLT5mcl9hZGRyZXNzIC8gT0NURVRTX1BFUl9CWVRFOwotCSAgbFtpXSA9IGxwdHItPmw7Ci0JICBscHRyID0gbHB0ci0+bmV4dDsKLQl9Ci0gICAgfQotfQotCi12b2lkCi1jb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMgKGFiZmQsIHNlYywgeCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bWJvbFMgKnNlY3N5bTsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaW50IG5sbm5vLCBucmVsb2NzID0gMDsKLQotICAvKiBSUy82MDAwIGdhcyBjcmVhdGVzIGEgLmRlYnVnIHNlY3Rpb24gbWFudWFsbHkgaW4gcHBjX2Zyb2JfZmlsZSBpbgotICAgICB0Yy1wcGMuYy4gIERvIG5vdCBnZXQgY29uZnVzZWQgYnkgaXQuICAqLwotICBpZiAoc2VnaW5mbyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBpZiAoIXN0cmNtcCAoc2VjLT5uYW1lLCAiLnRleHQiKSkKLSAgICBubG5ubyA9IGNvZmZfbl9saW5lX25vczsKLSAgZWxzZQotICAgIG5sbm5vID0gMDsKLSAgewotICAgIC8qIEBAIEhvcGUgdGhhdCBub25lIG9mIHRoZSBmaXh1cHMgZXhwYW5kIHRvIG1vcmUgdGhhbiBvbmUgcmVsb2MKLSAgICAgICBlbnRyeS4uLiAgKi8KLSAgICBmaXhTICpmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7Ci0gICAgd2hpbGUgKGZpeHApCi0gICAgICB7Ci0JaWYgKCEgZml4cC0+ZnhfZG9uZSkKLQkgIG5yZWxvY3MrKzsKLQlmaXhwID0gZml4cC0+ZnhfbmV4dDsKLSAgICAgIH0KLSAgfQotICBpZiAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpID09IDAKLSAgICAgICYmIG5yZWxvY3MgPT0gMAotICAgICAgJiYgbmxubm8gPT0gMAotICAgICAgJiYgc2VjICE9IHRleHRfc2VjdGlvbgotICAgICAgJiYgc2VjICE9IGRhdGFfc2VjdGlvbgotICAgICAgJiYgc2VjICE9IGJzc19zZWN0aW9uKQotICAgIHJldHVybjsKLSAgc2Vjc3ltID0gc2VjdGlvbl9zeW1ib2wgKHNlYyk7Ci0gIC8qIFRoaXMgaXMgYW4gZXN0aW1hdGU7IHdlJ2xsIHBsdWcgaW4gdGhlIHJlYWwgdmFsdWUgdXNpbmcKLSAgICAgU0VUX1NFQ1RJT05fUkVMT0NTIGxhdGVyICovCi0gIFNBX1NFVF9TQ05fTlJFTE9DIChzZWNzeW0sIG5yZWxvY3MpOwotICBTQV9TRVRfU0NOX05MSU5OTyAoc2Vjc3ltLCBubG5ubyk7Ci19Ci0KLXZvaWQKLWNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKQotewotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zLCAoY2hhciopIDApOwotfQotCi0vKgotICogaW1wbGVtZW50IHRoZSAuc2VjdGlvbiBwc2V1ZG8gb3A6Ci0gKgkuc2VjdGlvbiBuYW1lIHssICJmbGFncyJ9Ci0gKiAgICAgICAgICAgICAgICBeICAgICAgICAgXgotICogICAgICAgICAgICAgICAgfCAgICAgICAgICstLS0gb3B0aW9uYWwgZmxhZ3M6ICdiJyBmb3IgYnNzCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGZvciBpbmZvCi0gKiAgICAgICAgICAgICAgICArLS0gc2VjdGlvbiBuYW1lICAgICAgICAgICAgICAgJ2wnIGZvciBsaWIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicgZm9yIG5vbG9hZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJyBmb3Igb3ZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JyBmb3IgZGF0YQotICoJCQkJCQkgJ2QnIChhcHBhcmVudGx5IG04OGsgZm9yIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnIGZvciB0ZXh0Ci0gKgkJCQkJCSAncicgZm9yIHJlYWQtb25seSBkYXRhCi0gKgkJCQkJCSAncycgZm9yIHNoYXJlZCBkYXRhIChQRSkKLSAqIEJ1dCBpZiB0aGUgYXJndW1lbnQgaXMgbm90IGEgcXVvdGVkIHN0cmluZywgdHJlYXQgaXQgYXMgYQotICogc3Vic2VnbWVudCBudW1iZXIuCi0gKi8KLQotdm9pZAotb2JqX2NvZmZfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFN0cmlwIG91dCB0aGUgc2VjdGlvbiBuYW1lICovCi0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgY2hhciB0eXBlOwotCi0gICAgICBzX21yaV9zZWN0ICgmdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzZWN0aW9uX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzZWN0aW9uX25hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBleHAgPSAwOwotICBmbGFncyA9IFNFQ19MT0FEOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQlleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJwotCQkgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JCXsKLQkJY2FzZSAnYic6IGZsYWdzIHw9IFNFQ19BTExPQzsgZmxhZ3MgJj1+IFNFQ19MT0FEOyBicmVhazsKLQkJY2FzZSAnbic6IGZsYWdzICY9fiBTRUNfTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ2QnOiBmbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEOyAvKiBmYWxsIHRocm91Z2ggKi8KLQkJY2FzZSAndyc6IGZsYWdzICY9fiBTRUNfUkVBRE9OTFk7IGJyZWFrOwotCQljYXNlICd4JzogZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ3InOiBmbGFncyB8PSBTRUNfUkVBRE9OTFk7IGJyZWFrOwotCQljYXNlICdzJzogZmxhZ3MgfD0gU0VDX1NIQVJFRDsgYnJlYWs7Ci0KLQkJY2FzZSAnaSc6IC8qIFNUWVBfSU5GTyAqLwotCQljYXNlICdsJzogLyogU1RZUF9MSUIgKi8KLQkJY2FzZSAnbyc6IC8qIFNUWVBfT1ZFUiAqLwotCQkgIGFzX3dhcm4gKF8oInVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAgICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfd2FybihfKCJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgfQotCi0gIHNlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIChzdWJzZWdUKSBleHApOwotCi0gIGlmIChmbGFncyAhPSBTRUNfTk9fRkxBR1MpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb2xkZmxhZ3M7Ci0KLSAgICAgIG9sZGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYyk7Ci0gICAgICBvbGRmbGFncyAmPSBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUzsKLSAgICAgIGZsYWdzIHw9IG9sZGZsYWdzOwotCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncykpCi0JYXNfd2FybiAoXygiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIlc1wiOiAlcyIpLAotCQkgYmZkX3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBzZWMpLAotCQkgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1jb2ZmX2FkanVzdF9zeW10YWIgKCkKLXsKLSAgaWYgKHN5bWJvbF9yb290UCA9PSBOVUxMCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xfcm9vdFApICE9IENfRklMRSkKLSAgICBjX2RvdF9maWxlX3N5bWJvbCAoImZha2UiKTsKLX0KLQotdm9pZAotY29mZl9mcm9iX3NlY3Rpb24gKHNlYykKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIHNlZ1Qgc3Ryc2VjOwotICBjaGFyICpwOwotICBmcmFnUyAqZnJhZ3A7Ci0gIGJmZF92bWEgc2l6ZSwgbl9lbnRyaWVzLCBtYXNrOwotICBiZmRfdm1hIGFsaWduX3Bvd2VyID0gKGJmZF92bWEpc2VjLT5hbGlnbm1lbnRfcG93ZXIgKyBPQ1RFVFNfUEVSX0JZVEVfUE9XRVI7Ci0KLSAgLyogVGhlIENPRkYgYmFjayBlbmQgaW4gQkZEIHJlcXVpcmVzIHRoYXQgYWxsIHNlY3Rpb24gc2l6ZXMgYmUKLSAgICAgcm91bmRlZCB1cCB0byBtdWx0aXBsZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBhbGlnbm1lbnRzLAotICAgICBzdXBwb3NlZGx5IGJlY2F1c2Ugc3RhbmRhcmQgQ09GRiBoYXMgbm8gb3RoZXIgd2F5IG9mIGVuY29kaW5nIGFsaWdubWVudAotICAgICBmb3Igc2VjdGlvbnMuICBJZiB5b3VyIENPRkYgZmxhdm9yIGhhcyBhIGRpZmZlcmVudCB3YXkgb2YgZW5jb2RpbmcKLSAgICAgc2VjdGlvbiBhbGlnbm1lbnQsIHRoZW4gc2tpcCB0aGlzIHN0ZXAsIGFzIFRJQ09GRiBkb2VzLiAqLwotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpOwotICBtYXNrID0gKChiZmRfdm1hKSAxIDw8IGFsaWduX3Bvd2VyKSAtIDE7Ci0jaWYgIWRlZmluZWQoVElDT0ZGKQotICBpZiAoc2l6ZSAmIG1hc2spCi0gICAgewotICAgICAgc2l6ZSA9IChzaXplICsgbWFzaykgJiB+bWFzazsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYywgc2l6ZSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogSWYgdGhlIHNlY3Rpb24gc2l6ZSBpcyBub24temVybywgdGhlIHNlY3Rpb24gc3ltYm9sIG5lZWRzIGFuIGF1eAotICAgICBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQsIGluZGljYXRpbmcgdGhlIHNpemUuICBXZSBkb24ndCBrbm93Ci0gICAgIGFsbCB0aGUgdmFsdWVzIHlldDsgY29mZl9mcm9iX3N5bWJvbCB3aWxsIGZpbGwgdGhlbSBpbiBsYXRlci4gICovCi0jaWZuZGVmIFRJQ09GRgotICBpZiAoc2l6ZSAhPSAwCi0gICAgICB8fCBzZWMgPT0gdGV4dF9zZWN0aW9uCi0gICAgICB8fCBzZWMgPT0gZGF0YV9zZWN0aW9uCi0gICAgICB8fCBzZWMgPT0gYnNzX3NlY3Rpb24pCi0jZW5kaWYKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzZWNzeW0gPSBzZWN0aW9uX3N5bWJvbCAoc2VjKTsKLQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc2Vjc3ltLCBDX1NUQVQpOwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc2Vjc3ltLCAxKTsKLSAgICAgIFNGX1NFVF9TVEFUSUNTIChzZWNzeW0pOwotICAgICAgU0FfU0VUX1NDTl9TQ05MRU4gKHNlY3N5bSwgc2l6ZSk7Ci0gICAgfQotCi0gIC8qIEBAIHRoZXNlIHNob3VsZCBiZSBpbiBhICJzdGFicy5oIiBmaWxlLCBvciBtYXliZSBhcy5oICovCi0jaWZuZGVmIFNUQUJfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU0VDVElPTl9OQU1FICIuc3RhYiIKLSNlbmRpZgotI2lmbmRlZiBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUKLSNkZWZpbmUgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FICIuc3RhYnN0ciIKLSNlbmRpZgotICBpZiAoc3RyY21wIChTVEFCX1NUUklOR19TRUNUSU9OX05BTUUsIHNlYy0+bmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnNlYyA9IHNlYzsKLSAgc2VjID0gc3Vic2VnX2dldCAoU1RBQl9TRUNUSU9OX05BTUUsIDApOwotICAvKiBzaXplIGlzIGFscmVhZHkgcm91bmRlZCB1cCwgc2luY2Ugb3RoZXIgc2VjdGlvbiB3aWxsIGJlIGxpc3RlZCBmaXJzdCAqLwotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzdHJzZWMpOwotCi0gIG5fZW50cmllcyA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSAvIDEyIC0gMTsKLQotICAvKiBGaW5kIGZpcnN0IG5vbi1lbXB0eSBmcmFnLiAgSXQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaC4gICovCi0gIGZyYWdwID0gc2VnX2luZm8gKHNlYyktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gIHdoaWxlIChmcmFncCAmJiBmcmFncC0+ZnJfZml4ID09IDApCi0gICAgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dDsKLSAgYXNzZXJ0IChmcmFncCAhPSAwICYmIGZyYWdwLT5mcl9maXggPj0gMTIpOwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZXMuICAqLwotICBwID0gZnJhZ3AtPmZyX2xpdGVyYWw7Ci0gIGJmZF9oX3B1dF8xNiAoc3Rkb3V0cHV0LCBuX2VudHJpZXMsIChiZmRfYnl0ZSAqKSBwICsgNik7Ci0gIGJmZF9oX3B1dF8zMiAoc3Rkb3V0cHV0LCBzaXplLCAoYmZkX2J5dGUgKikgcCArIDgpOwotfQotCi12b2lkCi1vYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3RhYnN0cl9uYW1lOwotICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoaXMgZmlyc3Qgc3ltYm9sLiAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIC8qIFplcm8gaXQgb3V0LiAqLwotICBtZW1zZXQgKHAsIDAsIDEyKTsKLSAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICBzdGFic3RyX25hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VnLT5uYW1lKSArIDQpOwotICBzdHJjcHkgKHN0YWJzdHJfbmFtZSwgc2VnLT5uYW1lKTsKLSAgc3RyY2F0IChzdGFic3RyX25hbWUsICJzdHIiKTsKLSAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoZmlsZSwgc3RhYnN0cl9uYW1lKTsKLSAga25vdyAoc3Ryb2ZmID09IDEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHN0cm9mZiwgNCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotLyogZm9yIGRlYnVnZ2luZyAqLwotY29uc3QgY2hhciAqCi1zX2dldF9uYW1lIChzKQotICAgICBzeW1ib2xTICpzOwotewotICByZXR1cm4gKChzID09IE5VTEwpID8gIihOVUxMKSIgOiBTX0dFVF9OQU1FIChzKSk7Ci19Ci0KLXZvaWQKLXN5bWJvbF9kdW1wICgpCi17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIHByaW50ZihfKCIweCVseDogXCIlc1wiIHR5cGUgPSAlbGQsIGNsYXNzID0gJWQsIHNlZ21lbnQgPSAlZFxuIiksCi0JICAgICAodW5zaWduZWQgbG9uZykgc3ltYm9sUCwKLQkgICAgIFNfR0VUX05BTUUoc3ltYm9sUCksCi0JICAgICAobG9uZykgU19HRVRfREFUQV9UWVBFKHN5bWJvbFApLAotCSAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyhzeW1ib2xQKSwKLQkgICAgIChpbnQpIFNfR0VUX1NFR01FTlQoc3ltYm9sUCkpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIERFQlVHICovCi0KLSNlbHNlIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLSNpbmNsdWRlICJmcmFncy5oIgotLyogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBpbmNsdWRlIGludGVybmFsIGJmZCB0aGluZ3MuICovCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jaWZkZWYgVEVfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotLyogVGhlIE5PUF9PUENPREUgaXMgZm9yIHRoZSBhbGlnbm1lbnQgZmlsbCB2YWx1ZS4gIEZpbGwgd2l0aCBub3Agc28KLSAgIHRoYXQgd2UgY2FuIHN0aWNrIHNlY3Rpb25zIHRvZ2V0aGVyIHdpdGhvdXQgY2F1c2luZyB0cm91YmxlLiAgKi8KLSNpZm5kZWYgTk9QX09QQ09ERQotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDAKLSNlbmRpZgotCi0vKiBUaGUgemVyb2VzIGlmIHN5bWJvbCBuYW1lIGlzIGxvbmdlciB0aGFuIDggY2hhcnMgKi8KLSNkZWZpbmUgU19TRVRfWkVST0VTKHMsdikJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl96ZXJvZXMgPSAodikpCi0KLSNkZWZpbmUgTUlOKGEsYikgKChhKSA8IChiKT8gKGEpIDogKGIpKQotCi0vKiBUaGlzIHZlY3RvciBpcyB1c2VkIHRvIHR1cm4gYSBnYXMgaW50ZXJuYWwgc2VnbWVudCBudW1iZXIgaW50byBhCi0gICBzZWN0aW9uIG51bWJlciBzdWl0YWJsZSBmb3IgaW5zZXJ0aW9uIGludG8gYSBjb2ZmIHN5bWJvbCB0YWJsZS4KLSAgIFRoaXMgbXVzdCBjb3JyZXNwb25kIHRvIHNlZ19pbmZvX29mZl9ieV80LiAgKi8KLQotY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdID0KLXsJCQkJLyogaW46IHNlZ1QgICBvdXQ6IE5fVFlQRSBiaXRzICovCi0gIENfQUJTX1NFQ1RJT04sCi0gIDEsICAgIDIsICAzLCAgIDQsICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLAotICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwKLSAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsCi0gIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLAotICBDX1VOREVGX1NFQ1RJT04sCQkvKiBTRUdfVU5LTk9XTiAqLwotICBDX1VOREVGX1NFQ1RJT04sCQkvKiBTRUdfR09PRiAqLwotICBDX1VOREVGX1NFQ1RJT04sCQkvKiBTRUdfRVhQUiAqLwotICBDX0RFQlVHX1NFQ1RJT04sCQkvKiBTRUdfREVCVUcgKi8KLSAgQ19OVFZfU0VDVElPTiwJCS8qIFNFR19OVFYgKi8KLSAgQ19QVFZfU0VDVElPTiwJCS8qIFNFR19QVFYgKi8KLSAgQ19SRUdJU1RFUl9TRUNUSU9OLAkJLyogU0VHX1JFR0lTVEVSICovCi19OwotCi1pbnQgZnVuY3Rpb25fbGluZW9mZiA9IC0xOwkvKiBPZmZzZXQgaW4gbGluZSNzIHdoZXJlIHRoZSBsYXN0IGZ1bmN0aW9uCi0JCQkJICAgc3RhcnRlZCAodGhlIG9kZCBlbnRyeSBmb3IgbGluZSAjMCkgKi8KLQotLyogc3RydWN0dXJlIHVzZWQgdG8ga2VlcCB0aGUgZmlsZW5hbWVzIHdoaWNoCi0gICBhcmUgdG9vIGxvbmcgYXJvdW5kIHNvIHRoYXQgd2UgY2FuIHN0aWNrIHRoZW0KLSAgIGludG8gdGhlIHN0cmluZyB0YWJsZSAqLwotc3RydWN0IGZpbGVuYW1lX2xpc3QgCi17Ci0gIGNoYXIgKmZpbGVuYW1lOwotICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqbmV4dDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9oZWFkOwotc3RhdGljIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmaWxlbmFtZV9saXN0X3RhaWw7Ci0KLXN0YXRpYyBzeW1ib2xTICpsYXN0X2xpbmVfc3ltYm9sOwotCi0vKiBBZGQgNCB0byB0aGUgcmVhbCB2YWx1ZSB0byBnZXQgdGhlIGluZGV4IGFuZCBjb21wZW5zYXRlIHRoZQotICAgbmVnYXRpdmVzLiBUaGlzIHZlY3RvciBpcyB1c2VkIGJ5IFNfR0VUX1NFR01FTlQgdG8gdHVybiBhIGNvZmYKLSAgIHNlY3Rpb24gbnVtYmVyIGludG8gYSBzZWdtZW50IG51bWJlcgotKi8KLXN0YXRpYyBzeW1ib2xTICpwcmV2aW91c19maWxlX3N5bWJvbDsKLXZvaWQgY19zeW1ib2xfbWVyZ2UgKCk7Ci1zdGF0aWMgaW50IGxpbmVfYmFzZTsKLQotc3ltYm9sUyAqY19zZWN0aW9uX3N5bWJvbCAoKTsKLWJmZCAqYWJmZDsKLQotc3RhdGljIHZvaWQgZml4dXBfc2VnbWVudCBQQVJBTVMgKChzZWdtZW50X2luZm9fdHlwZSAqc2VnUCwKLQkJCQkgICBzZWdUIHRoaXNfc2VnbWVudF90eXBlKSk7Ci0KLQotc3RhdGljIHZvaWQgZml4dXBfbWRlcHMgUEFSQU1TICgoZnJhZ1MgKiwKLQkJCQkgb2JqZWN0X2hlYWRlcnMgKiwKLQkJCQkgc2VnVCkpOwotCi0KLXN0YXRpYyB2b2lkIGZpbGxfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiBhYmZkLAotCQkJCSAgb2JqZWN0X2hlYWRlcnMgKiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgKikpOwotCi0KLXN0YXRpYyBpbnQgY19saW5lX25ldyBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sLCBsb25nIHBhZGRyLAotCQkJICAgICAgIGludCBsaW5lX251bWJlciwKLQkJCSAgICAgICBmcmFnUyAqIGZyYWcpKTsKLQotCi1zdGF0aWMgdm9pZCB3X3N5bWJvbHMgUEFSQU1TICgoYmZkICogYWJmZCwgY2hhciAqd2hlcmUsCi0JCQkgICAgICAgc3ltYm9sUyAqIHN5bWJvbF9yb290UCkpOwotCi1zdGF0aWMgdm9pZCBhZGp1c3Rfc3RhYl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VnVCBzZWcpKTsKLQotc3RhdGljIHZvaWQgb2JqX2NvZmZfbGNvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl90ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfZGF0YSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgb2JqX2NvZmZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotLyogV2hlbiBub3QgdXNpbmcgQkZEX0FTU0VNQkxFUiwgd2UgcGVybWl0IHVwIHRvIDQwIHNlY3Rpb25zLgotCi0gICBUaGlzIGFycmF5IG1hcHMgYSBDT0ZGIHNlY3Rpb24gbnVtYmVyIGludG8gYSBnYXMgc2VjdGlvbiBudW1iZXIuCi0gICBCZWNhdXNlIENPRkYgdXNlcyBuZWdhdGl2ZSBzZWN0aW9uIG51bWJlcnMsIHlvdSBtdXN0IGFkZCA0IHRvIHRoZQotICAgQ09GRiBzZWN0aW9uIG51bWJlciB3aGVuIGluZGV4aW5nIGludG8gdGhpcyBhcnJheTsgdGhpcyBpcyBkb25lIHZpYQotICAgdGhlIFNFR19JTkZPX0ZST01fU0VDVElPTl9OVU1CRVIgbWFjcm8uICBUaGlzIG11c3QgY29ycmVzcG9uZCB0bwotICAgc2VnX05fVFlQRS4gICovCi0KLXN0YXRpYyBjb25zdCBzZWdUIHNlZ19pbmZvX29mZl9ieV80W10gPQotewotIFNFR19QVFYsCi0gU0VHX05UViwKLSBTRUdfREVCVUcsCi0gU0VHX0FCU09MVVRFLAotIFNFR19VTktOT1dOLAotIFNFR19FMCwgIFNFR19FMSwgIFNFR19FMiwgIFNFR19FMywgIFNFR19FNCwKLSBTRUdfRTUsICBTRUdfRTYsICBTRUdfRTcsICBTRUdfRTgsICBTRUdfRTksCi0gU0VHX0UxMCwgU0VHX0UxMSwgU0VHX0UxMiwgU0VHX0UxMywgU0VHX0UxNCwKLSBTRUdfRTE1LCBTRUdfRTE2LCBTRUdfRTE3LCBTRUdfRTE4LCBTRUdfRTE5LAotIFNFR19FMjAsIFNFR19FMjEsIFNFR19FMjIsIFNFR19FMjMsIFNFR19FMjQsCi0gU0VHX0UyNSwgU0VHX0UyNiwgU0VHX0UyNywgU0VHX0UyOCwgU0VHX0UyOSwKLSBTRUdfRTMwLCBTRUdfRTMxLCBTRUdfRTMyLCBTRUdfRTMzLCBTRUdfRTM0LAotIFNFR19FMzUsIFNFR19FMzYsIFNFR19FMzcsIFNFR19FMzgsIFNFR19FMzksCi0gKHNlZ1QpIDQwLAotIChzZWdUKSA0MSwKLSAoc2VnVCkgNDIsCi0gKHNlZ1QpIDQzLAotIChzZWdUKSA0NCwKLSAoc2VnVCkgNDUsCi0gKHNlZ1QpIDAsCi0gKHNlZ1QpIDAsCi0gKHNlZ1QpIDAsCi0gU0VHX1JFR0lTVEVSCi19OwotCi0jZGVmaW5lIFNFR19JTkZPX0ZST01fU0VDVElPTl9OVU1CRVIoeCkgKHNlZ19pbmZvX29mZl9ieV80Wyh4KSs0XSkKLQotc3RhdGljIHJlbGF4X2FkZHJlc3NUCi1yZWxheF9hbGlnbiAoYWRkcmVzcywgYWxpZ25tZW50KQotICAgICByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwotICAgICBsb25nIGFsaWdubWVudDsKLXsKLSAgcmVsYXhfYWRkcmVzc1QgbWFzazsKLSAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7Ci0KLSAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOwotICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOwotICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Ci19Ci0KLQotc2VnVAotc19nZXRfc2VnbWVudCAoeCkKLSAgICAgc3ltYm9sUyAqIHg7Ci17Ci0gIHJldHVybiBTRUdfSU5GT19GUk9NX1NFQ1RJT05fTlVNQkVSICh4LT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0pOwotfQotCi0vKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGZyYWcgY2hhaW4gYW5kIGZpbGwgaW4gdGhlIHNlY3Rpb24gaGVhZGVyCi0gICB0byBjb250YWluIGFsbCBvZiBpdCwgYWxzbyBmaWxsIGluIHRoZSBhZGRyIG9mIHRoZSBzZWN0aW9ucyAqLwotc3RhdGljIHVuc2lnbmVkIGludAotc2l6ZV9zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgaWR4OwotewotCi0gIHVuc2lnbmVkIGludCBzaXplID0gMDsKLSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baWR4XS5mcmNoYWluUC0+ZnJjaF9yb290OwotICB3aGlsZSAoZnJhZykKLSAgICB7Ci0gICAgICBzaXplID0gZnJhZy0+ZnJfYWRkcmVzczsKLSAgICAgIGlmIChmcmFnLT5mcl9hZGRyZXNzICE9IHNpemUpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJPdXQgb2Ygc3RlcFxuIikpOwotCSAgc2l6ZSA9IGZyYWctPmZyX2FkZHJlc3M7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JewotI2lmZGVmIFRDX0NPRkZfU0laRU1BQ0hERVAKLQljYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCSAgc2l6ZSArPSBUQ19DT0ZGX1NJWkVNQUNIREVQIChmcmFnKTsKLQkgIGJyZWFrOwotI2VuZGlmCi0JY2FzZSByc19zcGFjZToKLQkgIGFzc2VydCAoZnJhZy0+ZnJfc3ltYm9sID09IDApOwotCWNhc2UgcnNfZmlsbDoKLQljYXNlIHJzX29yZzoKLQkgIHNpemUgKz0gZnJhZy0+ZnJfZml4OwotCSAgc2l6ZSArPSBmcmFnLT5mcl9vZmZzZXQgKiBmcmFnLT5mcl92YXI7Ci0JICBicmVhazsKLQljYXNlIHJzX2FsaWduOgotCWNhc2UgcnNfYWxpZ25fY29kZToKLQkgIHsKLQkgICAgYWRkcmVzc1Qgb2ZmOwotCi0JICAgIHNpemUgKz0gZnJhZy0+ZnJfZml4OwotCSAgICBvZmYgPSByZWxheF9hbGlnbiAoc2l6ZSwgZnJhZy0+ZnJfb2Zmc2V0KTsKLQkgICAgaWYgKGZyYWctPmZyX3N1YnR5cGUgIT0gMCAmJiBvZmYgPiBmcmFnLT5mcl9zdWJ0eXBlKQotCSAgICAgIG9mZiA9IDA7Ci0JICAgIHNpemUgKz0gb2ZmOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIEJBRF9DQVNFIChmcmFnLT5mcl90eXBlKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotICAgIH0KLSAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfc2l6ZSA9IHNpemU7Ci0gIHJldHVybiBzaXplOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvdW50X2VudHJpZXNfaW5fY2hhaW4gKGlkeCkKLSAgICAgdW5zaWduZWQgaW50IGlkeDsKLXsKLSAgdW5zaWduZWQgaW50IG5yZWxvY3M7Ci0gIGZpeFMgKmZpeHVwX3B0cjsKLQotICAvKiBDb3VudCB0aGUgcmVsb2NhdGlvbnMgKi8KLSAgZml4dXBfcHRyID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7Ci0gIG5yZWxvY3MgPSAwOwotICB3aGlsZSAoZml4dXBfcHRyICE9IChmaXhTICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGZpeHVwX3B0ci0+ZnhfZG9uZSA9PSAwICYmIFRDX0NPVU5UX1JFTE9DIChmaXh1cF9wdHIpKQotCXsKLSNpZmRlZiBUQ19BMjlLCi0JICBpZiAoZml4dXBfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfQ09OU1RIKQotCSAgICBucmVsb2NzICs9IDI7Ci0JICBlbHNlCi0JICAgIG5yZWxvY3MrKzsKLSNlbHNlCi0JICBucmVsb2NzKys7Ci0jZW5kaWYKLQl9Ci0KLSAgICAgIGZpeHVwX3B0ciA9IGZpeHVwX3B0ci0+ZnhfbmV4dDsKLSAgICB9Ci0gIHJldHVybiBucmVsb2NzOwotfQotCi0jaWZkZWYgVEVfQVVYCi0KLXN0YXRpYyBpbnQgY29tcGFyZV9leHRlcm5hbF9yZWxvY3MgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotLyogQVVYJ3MgbGQgZXhwZWN0cyByZWxvY2F0aW9ucyB0byBiZSBzb3J0ZWQgKi8KLXN0YXRpYyBpbnQKLWNvbXBhcmVfZXh0ZXJuYWxfcmVsb2NzICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqYSA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgeDsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpiID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSB5OwotICBiZmRfdm1hIGFhZHIgPSBiZmRfZ2V0YjMyIChhLT5yX3ZhZGRyKTsKLSAgYmZkX3ZtYSBiYWRyID0gYmZkX2dldGIzMiAoYi0+cl92YWRkcik7Ci0gIHJldHVybiAoYWFkciA8IGJhZHIgPyAtMSA6IGJhZHIgPCBhYWRyID8gMSA6IDApOwotfQotCi0jZW5kaWYKLQotLyogb3V0cHV0IGFsbCB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbiAqLwotdm9pZAotZG9fcmVsb2NzX2ZvciAoYWJmZCwgaCwgZmlsZV9jdXJzb3IpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIG9iamVjdF9oZWFkZXJzICogaDsKLSAgICAgdW5zaWduZWQgbG9uZyAqZmlsZV9jdXJzb3I7Ci17Ci0gIHVuc2lnbmVkIGludCBucmVsb2NzOwotICB1bnNpZ25lZCBpbnQgaWR4OwotICB1bnNpZ25lZCBsb25nIHJlbG9jX3N0YXJ0ID0gKmZpbGVfY3Vyc29yOwotCi0gIGZvciAoaWR4ID0gU0VHX0UwOyBpZHggPCBTRUdfTEFTVDsgaWR4KyspCi0gICAgewotICAgICAgaWYgKHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX25hbWVbMF0pCi0JewotCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcHRyOwotCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRlcm5hbF9yZWxvY192ZWM7Ci0JICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLQkgIHVuc2lnbmVkIGludCBiYXNlID0gc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfcGFkZHI7Ci0JICBmaXhTICpmaXhfcHRyID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7Ci0JICBucmVsb2NzID0gY291bnRfZW50cmllc19pbl9jaGFpbiAoaWR4KTsKLQotCSAgaWYgKG5yZWxvY3MpCi0JICAgIC8qIEJ5cGFzcyB0aGlzIHN0dWZmIGlmIG5vIHJlbG9jcy4gIFRoaXMgYWxzbyBpbmNpZGVudGFsbHkKLQkgICAgICAgYXZvaWRzIGEgU0NPIGJ1Zywgd2hlcmUgZnJlZShtYWxsb2MoMCkpIHRlbmRzIHRvIGNyYXNoLiAgKi8KLQkgICAgewotCSAgICAgIGV4dGVybmFsX3JlbG9jX3NpemUgPSBucmVsb2NzICogUkVMU1o7Ci0JICAgICAgZXh0ZXJuYWxfcmVsb2NfdmVjID0KLQkJKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBtYWxsb2MgKGV4dGVybmFsX3JlbG9jX3NpemUpOwotCi0JICAgICAgZXh0X3B0ciA9IGV4dGVybmFsX3JlbG9jX3ZlYzsKLQotCSAgICAgIC8qIEZpbGwgaW4gdGhlIGludGVybmFsIGNvZmYgc3R5bGUgcmVsb2Mgc3RydWN0IGZyb20gdGhlCi0JCSBpbnRlcm5hbCBmaXggbGlzdC4gICovCi0JICAgICAgd2hpbGUgKGZpeF9wdHIpCi0JCXsKLQkJICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW50cjsKLQotCQkgIC8qIE9ubHkgb3V0cHV0IHNvbWUgb2YgdGhlIHJlbG9jYXRpb25zICovCi0JCSAgaWYgKGZpeF9wdHItPmZ4X2RvbmUgPT0gMCAmJiBUQ19DT1VOVF9SRUxPQyAoZml4X3B0cikpCi0JCSAgICB7Ci0jaWZkZWYgVENfUkVMT0NfTUFOR0xFCi0JCSAgICAgIFRDX1JFTE9DX01BTkdMRSAoJnNlZ21lbnRfaW5mb1tpZHhdLCBmaXhfcHRyLCAmaW50ciwKLQkJCQkgICAgICAgYmFzZSk7Ci0KLSNlbHNlCi0JCSAgICAgIHN5bWJvbFMgKmRvdDsKLQkJICAgICAgc3ltYm9sUyAqc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0JCSAgICAgIGludHIucl90eXBlID0gVENfQ09GRl9GSVgyUlRZUEUgKGZpeF9wdHIpOwotCQkgICAgICBpbnRyLnJfdmFkZHIgPQotCQkJYmFzZSArIGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZTsKLQotI2lmZGVmIFRDX0tFRVBfRlhfT0ZGU0VUCi0JCSAgICAgIGludHIucl9vZmZzZXQgPSBmaXhfcHRyLT5meF9vZmZzZXQ7Ci0jZWxzZQotCQkgICAgICBpbnRyLnJfb2Zmc2V0ID0gMDsKLSNlbmRpZgotCi0JCSAgICAgIHdoaWxlIChzeW1ib2xfcHRyLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JCQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sX3B0cikKLQkJCQkgfHwgU19JU19DT01NT04gKHN5bWJvbF9wdHIpKSkKLQkJCXsKLQkJCSAgc3ltYm9sUyAqbjsKLQotCQkJICAvKiBXZSBtdXN0IGF2b2lkIGxvb3BpbmcsIGFzIHRoYXQgY2FuIG9jY3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBiYWRseSB3cml0dGVuIHByb2dyYW0uICAqLwotCQkJICBuID0gc3ltYm9sX3B0ci0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotCQkJICBpZiAobiA9PSBzeW1ib2xfcHRyKQotCQkJICAgIGJyZWFrOwotCQkJICBzeW1ib2xfcHRyID0gbjsKLQkJCX0KLQotCQkgICAgICAvKiBUdXJuIHRoZSBzZWdtZW50IG9mIHRoZSBzeW1ib2wgaW50byBhbiBvZmZzZXQuICAqLwotCQkgICAgICBpZiAoc3ltYm9sX3B0cikKLQkJCXsKLQkJCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbF9wdHIsIDEpOwotCQkJICBpZiAoISBzeW1ib2xfcHRyLT5zeV9yZXNvbHZlZCkKLQkJCSAgICB7Ci0JCQkgICAgICBjaGFyICpmaWxlOwotCQkJICAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLQkJCSAgICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltYm9sX3B0ciwgJmZpbGUsICZsaW5lKSkKLQkJCQlhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsCi0JCQkJCSAgICAgIF8oInVucmVzb2x2ZWQgcmVsb2NhdGlvbiIpKTsKLQkJCSAgICAgIGVsc2UKLQkJCQlhc19iYWQgKF8oImJhZCByZWxvY2F0aW9uOiBzeW1ib2wgYCVzJyBub3QgaW4gc3ltYm9sIHRhYmxlIiksCi0JCQkJCVNfR0VUX05BTUUgKHN5bWJvbF9wdHIpKTsKLQkJCSAgICB9Ci0JCQkgIGRvdCA9IHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKV0uZG90OwotCQkJICBpZiAoZG90KQotCQkJICAgIHsKLQkJCSAgICAgIGludHIucl9zeW1uZHggPSBkb3QtPnN5X251bWJlcjsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpbnRyLnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotCQkJICAgIH0KLQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGludHIucl9zeW1uZHggPSAtMTsKLQkJCX0KLSNlbmRpZgotCi0JCSAgICAgICh2b2lkKSBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmludHIsIGV4dF9wdHIpOwotCQkgICAgICBleHRfcHRyKys7Ci0KLSNpZiBkZWZpbmVkKFRDX0EyOUspCi0KLQkJICAgICAgLyogVGhlIDI5ayBoYXMgYSBzcGVjaWFsIGtsdWRnZSBmb3IgdGhlIGhpZ2ggMTYgYml0Ci0JCQkgcmVsb2MuICBUd28gcmVsb2NhdGlvbnMgYXJlIGVtaXRlZCwgUl9JSElIQUxGLAotCQkJIGFuZCBSX0lIQ09OU1QuIFRoZSBzZWNvbmQgb25lIGRvZXNuJ3QgY29udGFpbiBhCi0JCQkgc3ltYm9sLCBidXQgdXNlcyB0aGUgdmFsdWUgZm9yIG9mZnNldC4gICovCi0KLQkJICAgICAgaWYgKGludHIucl90eXBlID09IFJfSUhJSEFMRikKLQkJCXsKLQkJCSAgLyogbm93IGVtaXQgdGhlIHNlY29uZCBiaXQgKi8KLQkJCSAgaW50ci5yX3R5cGUgPSBSX0lIQ09OU1Q7Ci0JCQkgIGludHIucl9zeW1uZHggPSBmaXhfcHRyLT5meF9hZGRudW1iZXI7Ci0JCQkgICh2b2lkKSBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmludHIsIGV4dF9wdHIpOwotCQkJICBleHRfcHRyKys7Ci0JCQl9Ci0jZW5kaWYKLQkJICAgIH0KLQotCQkgIGZpeF9wdHIgPSBmaXhfcHRyLT5meF9uZXh0OwotCQl9Ci0KLSNpZmRlZiBURV9BVVgKLQkgICAgICAvKiBTb3J0IHRoZSByZWxvYyB0YWJsZSAqLwotCSAgICAgIHFzb3J0ICgoUFRSKSBleHRlcm5hbF9yZWxvY192ZWMsIG5yZWxvY3MsCi0JCSAgICAgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MpLCBjb21wYXJlX2V4dGVybmFsX3JlbG9jcyk7Ci0jZW5kaWYKLQotCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgcmVsb2MgdGFibGUgKi8KLQkgICAgICBiZmRfd3JpdGUgKChQVFIpIGV4dGVybmFsX3JlbG9jX3ZlYywgMSwgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwKLQkJCSBhYmZkKTsKLQkgICAgICBmcmVlIChleHRlcm5hbF9yZWxvY192ZWMpOwotCi0JICAgICAgLyogRmlsbCBpbiBzZWN0aW9uIGhlYWRlciBpbmZvLiAgKi8KLQkgICAgICBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19yZWxwdHIgPSAqZmlsZV9jdXJzb3I7Ci0JICAgICAgKmZpbGVfY3Vyc29yICs9IGV4dGVybmFsX3JlbG9jX3NpemU7Ci0JICAgICAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfbnJlbG9jID0gbnJlbG9jczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm8gcmVsb2NzICovCi0JICAgICAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfcmVscHRyID0gMDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIFNldCByZWxvY2F0aW9uX3NpemUgZmllbGQgaW4gZmlsZSBoZWFkZXJzICovCi0gIEhfU0VUX1JFTE9DQVRJT05fU0laRSAoaCwgKmZpbGVfY3Vyc29yIC0gcmVsb2Nfc3RhcnQsIDApOwotfQotCi0KLS8qIHJ1biB0aHJvdWdoIGEgZnJhZyBjaGFpbiBhbmQgd3JpdGUgb3V0IHRoZSBkYXRhIHRvIGdvIHdpdGggaXQsIGZpbGwKLSAgIGluIHRoZSBzY25oZHJzIHdpdGggdGhlIGluZm8gb24gdGhlIGZpbGUgcG9zdGlvbnMKLSovCi1zdGF0aWMgdm9pZAotZmlsbF9zZWN0aW9uIChhYmZkLCBoLCBmaWxlX2N1cnNvcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgbG9uZyAqZmlsZV9jdXJzb3I7Ci17Ci0KLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBwYWRkciA9IDA7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnMgPSAmKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIpOwotCi0gICAgICBQUk9HUkVTUyAoMSk7Ci0KLSAgICAgIGlmIChzLT5zX25hbWVbMF0pCi0JewotCSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgIGNoYXIgKmJ1ZmZlcjsKLQotCSAgaWYgKHMtPnNfc2l6ZSA9PSAwKQotCSAgICBzLT5zX3NjbnB0ciA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBidWZmZXIgPSB4bWFsbG9jIChzLT5zX3NpemUpOwotCSAgICAgIHMtPnNfc2NucHRyID0gKmZpbGVfY3Vyc29yOwotCSAgICB9Ci0JICBrbm93IChzLT5zX3BhZGRyID09IHBhZGRyKTsKLQotCSAgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLnRleHQiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmRhdGEiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfREFUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmJzcyIpID09IDApCi0JICAgIHsKLQkgICAgICBzLT5zX3NjbnB0ciA9IDA7Ci0JICAgICAgcy0+c19mbGFncyB8PSBTVFlQX0JTUzsKLQotCSAgICAgIC8qIEBAIFNob3VsZCBtYWtlIHRoZSBpMzg2IGFuZCBhMjlrIGNvZmYgdGFyZ2V0cyBkZWZpbmUKLQkJIENPRkZfTk9MT0FEX1BST0JMRU0sIGFuZCBoYXZlIG9ubHkgb25lIHRlc3QgaGVyZS4gICovCi0jaWZuZGVmIFRDX0kzODYKLSNpZm5kZWYgVENfQTI5SwotI2lmbmRlZiBDT0ZGX05PTE9BRF9QUk9CTEVNCi0JICAgICAgLyogQXBwYXJlbnRseSB0aGUgU1ZSMyBsaW5rZXIgKGFuZCBleGVjIHN5c2NhbGwpIGFuZCBVREkKLQkJIG1vbmRmZSBwcm9ncmVtIGFyZSBjb25mdXNlZCBieSBub2xvYWQgc2VjdGlvbnMuICAqLwotCSAgICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmxpdCIpID09IDApCi0JICAgIHMtPnNfZmxhZ3MgPSBTVFlQX0xJVCB8IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmluaXQiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmZpbmkiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cm5jbXAgKHMtPnNfbmFtZSwgIi5jb21tZW50IiwgOCkgPT0gMCkKLQkgICAgcy0+c19mbGFncyB8PSBTVFlQX0lORk87Ci0KLQkgIHdoaWxlIChmcmFnKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGZpbGxfc2l6ZTsKLQkgICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JCXsKLQkJY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkJICBpZiAoZnJhZy0+ZnJfZml4KQotCQkgICAgewotCQkgICAgICBtZW1jcHkgKGJ1ZmZlciArIGZyYWctPmZyX2FkZHJlc3MsCi0JCQkgICAgICBmcmFnLT5mcl9saXRlcmFsLAotCQkJICAgICAgKHVuc2lnbmVkIGludCkgZnJhZy0+ZnJfZml4KTsKLQkJICAgICAgb2Zmc2V0ICs9IGZyYWctPmZyX2ZpeDsKLQkJICAgIH0KLQotCQkgIGJyZWFrOwotCQljYXNlIHJzX3NwYWNlOgotCQkgIGFzc2VydCAoZnJhZy0+ZnJfc3ltYm9sID09IDApOwotCQljYXNlIHJzX2ZpbGw6Ci0JCWNhc2UgcnNfYWxpZ246Ci0JCWNhc2UgcnNfYWxpZ25fY29kZToKLQkJY2FzZSByc19vcmc6Ci0JCSAgaWYgKGZyYWctPmZyX2ZpeCkKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzLAotCQkJICAgICAgZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICh1bnNpZ25lZCBpbnQpIGZyYWctPmZyX2ZpeCk7Ci0JCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7Ci0JCSAgICB9Ci0KLQkJICBmaWxsX3NpemUgPSBmcmFnLT5mcl92YXI7Ci0JCSAgaWYgKGZpbGxfc2l6ZSAmJiBmcmFnLT5mcl9vZmZzZXQgPiAwKQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBvZmYgPSBmcmFnLT5mcl9maXg7Ci0JCSAgICAgIGZvciAoY291bnQgPSBmcmFnLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCQkJewotCQkJICBpZiAoZmlsbF9zaXplICsgZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiA8PSBzLT5zX3NpemUpCi0JCQkgICAgewotCQkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzICsgb2ZmLAotCQkJCSAgICAgIGZyYWctPmZyX2xpdGVyYWwgKyBmcmFnLT5mcl9maXgsCi0JCQkJICAgICAgZmlsbF9zaXplKTsKLQkJCSAgICAgIG9mZiArPSBmaWxsX3NpemU7Ci0JCQkgICAgICBvZmZzZXQgKz0gZmlsbF9zaXplOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSByc19icm9rZW5fd29yZDoKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotCSAgICB9Ci0KLQkgIGlmIChzLT5zX3NpemUgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzLT5zX3NjbnB0ciAhPSAwKQotCQl7Ci0JCSAgYmZkX3dyaXRlIChidWZmZXIsIHMtPnNfc2l6ZSwgMSwgYWJmZCk7Ci0JCSAgKmZpbGVfY3Vyc29yICs9IHMtPnNfc2l6ZTsKLQkJfQotCSAgICAgIGZyZWUgKGJ1ZmZlcik7Ci0JICAgIH0KLQkgIHBhZGRyICs9IHMtPnNfc2l6ZTsKLQl9Ci0gICAgfQotfQotCi0vKiBDb2ZmIGZpbGUgZ2VuZXJhdGlvbiAmIHV0aWxpdGllcyAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9oZWFkZXJfYXBwZW5kIChhYmZkLCBoKQotICAgICBiZmQgKiBhYmZkOwotICAgICBvYmplY3RfaGVhZGVycyAqIGg7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBjaGFyIGJ1ZmZlclsxMDAwXTsKLSAgY2hhciBidWZmZXJvWzEwMDBdOwotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIHVuc2lnbmVkIGxvbmcgc3RyaW5nX3NpemUgPSA0OwotI2VuZGlmCi0KLSAgYmZkX3NlZWsgKGFiZmQsIDAsIDApOwotCi0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0gIEhfU0VUX01BR0lDX05VTUJFUiAoaCwgQ09GRl9NQUdJQyk7Ci0gIEhfU0VUX1ZFUlNJT05fU1RBTVAgKGgsIDApOwotICBIX1NFVF9FTlRSWV9QT0lOVCAoaCwgMCk7Ci0gIEhfU0VUX1RFWFRfU1RBUlQgKGgsIHNlZ21lbnRfaW5mb1tTRUdfRTBdLmZyY2hhaW5QLT5mcmNoX3Jvb3QtPmZyX2FkZHJlc3MpOwotICBIX1NFVF9EQVRBX1NUQVJUIChoLCBzZWdtZW50X2luZm9bU0VHX0UxXS5mcmNoYWluUC0+ZnJjaF9yb290LT5mcl9hZGRyZXNzKTsKLSAgSF9TRVRfU0laRU9GX09QVElPTkFMX0hFQURFUiAoaCwgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dChhYmZkLCAmaC0+YW91dGhkciwKLQkJCQkJCQkgICAgIGJ1ZmZlcm8pKTsKLSNlbHNlIC8qIGRlZmluZWQgKE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSKSAqLwotICBIX1NFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSIChoLCAwKTsKLSNlbmRpZiAvKiBkZWZpbmVkIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUikgKi8KLQotICBpID0gYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgJmgtPmZpbGVoZHIsIGJ1ZmZlcik7Ci0KLSAgYmZkX3dyaXRlIChidWZmZXIsIGksIDEsIGFiZmQpOwotICBiZmRfd3JpdGUgKGJ1ZmZlcm8sIEhfR0VUX1NJWkVPRl9PUFRJT05BTF9IRUFERVIgKGgpLCAxLCBhYmZkKTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0JICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZQotICAgICAgICAgICAgIG11c3QgY29vcmRpbmF0ZSB3aXRoIHRoYXQgaW4gd3JpdGVfb2JqZWN0X2ZpbGUgYW5kCi0gICAgICAgICAgICAgd19zdHJpbmdzLiAgKi8KLQkgIGlmIChzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSA+IFNDTk5NTEVOKQotCSAgICB7Ci0JICAgICAgbWVtc2V0IChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZSwgMCwgU0NOTk1MRU4pOwotCSAgICAgIHNwcmludGYgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lLCAiLyVsdSIsIHN0cmluZ19zaXplKTsKLQkgICAgICBzdHJpbmdfc2l6ZSArPSBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSArIDE7Ci0JICAgIH0KLSNlbmRpZgotCi0JICBzaXplID0gYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLAotCQkJCQkgICAmKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIpLAotCQkJCQkgICBidWZmZXIpOwotCSAgaWYgKHNpemUgPT0gMCkKLQkgICAgYXNfYmFkIChfKCJiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQgZmFpbGVkIikpOwotCSAgYmZkX3dyaXRlIChidWZmZXIsIHNpemUsIDEsIGFiZmQpOwotCX0KLSAgICB9Ci19Ci0KLQotY2hhciAqCi1zeW1ib2xfdG9fY2hhcnMgKGFiZmQsIHdoZXJlLCBzeW1ib2xQKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3ltYm9sUyAqIHN5bWJvbFA7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1hdXggPSBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbnVtYXV4OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdmFsdWVUIHZhbDsKLQotICAvKiBUdXJuIGFueSBzeW1ib2xzIHdpdGggcmVnaXN0ZXIgYXR0cmlidXRlcyBpbnRvIGFicyBzeW1ib2xzICovCi0gIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSByZWdfc2VjdGlvbikKLSAgICB7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICB9Ci0gIC8qIEF0IHRoZSBzYW1lIHRpbWUsIHJlbG9jYXRlIGFsbCBzeW1ib2xzIHRvIHRoZWlyIG91dHB1dCB2YWx1ZSAqLwotCi0jaWZuZGVmIFRFX1BFCi0gIHZhbCA9IChzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sUCldLnNjbmhkci5zX3BhZGRyCi0JICsgU19HRVRfVkFMVUUgKHN5bWJvbFApKTsKLSNlbHNlCi0gIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLSNlbmRpZgotCi0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCB2YWwpOwotCi0gIHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl92YWx1ZSA9IHZhbDsKLQotICB3aGVyZSArPSBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsICZzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5LAotCQkJCSAgd2hlcmUpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1hdXg7IGkrKykKLSAgICB7Ci0gICAgICB3aGVyZSArPSBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKGFiZmQsCi0JCQkJICAgICAgJnN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50W2ldLAotCQkJCSAgICAgIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCksCi0JCQkJICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCksCi0JCQkJICAgICAgaSwgbnVtYXV4LCB3aGVyZSk7Ci0gICAgfQotICByZXR1cm4gd2hlcmU7Ci0KLX0KLQotdm9pZAotY29mZl9vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBjaGFyIHVuZGVyc2NvcmUgPSAwOwkJLyogU3ltYm9sIGhhcyBsZWFkaW5nIF8gKi8KLQotICAvKiBFZmZlY3RpdmUgc3ltYm9sICovCi0gIC8qIFN0b3JlIHRoZSBwb2ludGVyIGluIHRoZSBvZmZzZXQuICovCi0gIFNfU0VUX1pFUk9FUyAoc3ltYm9sUCwgMEwpOwotICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFRfTlVMTCk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIDApOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAwKTsKLSAgLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLwotICBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2ZsYWdzID0gMDsKLSAgLyogQXV4aWxpYXJ5IGVudHJpZXMgKi8KLSAgbWVtc2V0ICgoY2hhciAqKSAmc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0sIDAsIEFVWEVTWik7Ci0KLSAgaWYgKFNfSVNfU1RSSU5HIChzeW1ib2xQKSkKLSAgICBTRl9TRVRfU1RSSU5HIChzeW1ib2xQKTsKLSAgaWYgKCF1bmRlcnNjb3JlICYmIFNfSVNfTE9DQUwgKHN5bWJvbFApKQotICAgIFNGX1NFVF9MT0NBTCAoc3ltYm9sUCk7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgLmxuIGRpcmVjdGl2ZXMuCi0gKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xuIChhcHBsaW5lKQotICAgICBpbnQgYXBwbGluZTsKLXsKLSAgaW50IGw7Ci0KLSAgaWYgKCEgYXBwbGluZSAmJiBkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxuIHBzZXVkby1vcCBpbnNpZGUgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIHdyb25nIGNvbnRleHQgKi8KLQotICBsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGNfbGluZV9uZXcgKDAsIGZyYWdfbm93X2ZpeCAoKSwgbCwgZnJhZ19ub3cpOwotCi0gIGlmIChhcHBsaW5lKQotICAgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIGwgLSAxKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0KLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlpZiAoISBhcHBsaW5lKQotCSAgbCArPSBsaW5lX2Jhc2UgLSAxOwotCWxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGwpOwotICAgICAgfQotCi0gIH0KLSNlbmRpZgotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKgotICoJCQlkZWYoKQotICoKLSAqIEhhbmRsZSAuZGVmIGRpcmVjdGl2ZXMuCi0gKgotICogT25lIG1pZ2h0IGFzayA6IHdoeSBjYW4ndCB3ZSBzeW1ib2xfbmV3IGlmIHRoZSBzeW1ib2wgZG9lcyBub3QKLSAqIGFscmVhZHkgZXhpc3QgYW5kIGZpbGwgaXQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbi4gIEJlY2F1c2Ugb2YKLSAqIHRoZSBDX0VGQ04gc3BlY2lhbCBzeW1ib2wuIEl0IHdvdWxkIGNsb2JiZXIgdGhlIHZhbHVlIG9mIHRoZQotICogZnVuY3Rpb24gc3ltYm9sIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIG5vdGljZSB0aGF0IGl0IGlzCi0gKiBhIENfRUZDTi4gQW5kIGEgc2Vjb25kIHJlYXNvbiBpcyB0aGF0IHRoZSBjb2RlIGlzIG1vcmUgY2xlYXIgdGhpcwotICogd2F5LiAoYXQgbGVhc3QgSSB0aGluayBpdCBpcyA6LSkuCi0gKgotICovCi0KLSNkZWZpbmUgU0tJUF9TRU1JX0NPTE9OKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnOycpCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRVMoKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcgfHwgXAotCQkJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RlZiAod2hhdCkKLSAgICAgaW50IHdoYXQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciBuYW1lX2VuZDsJCS8qIENoYXIgYWZ0ZXIgdGhlIGVuZCBvZiBuYW1lICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lOwkJLyogTmFtZSBvZiB0aGUgZGVidWcgc3ltYm9sICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lX2NvcHk7CS8qIFRlbXBvcmFyeSBjb3B5IG9mIHRoZSBuYW1lICovCi0gIHVuc2lnbmVkIGludCBzeW1ib2xfbmFtZV9sZW5ndGg7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0KLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IChzeW1ib2xTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mICgqZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOwotICBtZW1zZXQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDAsIHNpemVvZiAoKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKTsKLQotICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9sX25hbWVfbGVuZ3RoID0gc3RybGVuIChzeW1ib2xfbmFtZSk7Ci0gIHN5bWJvbF9uYW1lX2NvcHkgPSB4bWFsbG9jIChzeW1ib2xfbmFtZV9sZW5ndGggKyAxKTsKLSAgc3RyY3B5IChzeW1ib2xfbmFtZV9jb3B5LCBzeW1ib2xfbmFtZSk7Ci0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lX2NvcHkgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lX2NvcHkpOwotI2VuZGlmCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbmV3IHN5bWJvbCAqLwotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgU19TRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgKCpzeW1ib2xfbmFtZV9jb3B5ID09ICdfJwotCQkJCSAgICAgICA/IHN5bWJvbF9uYW1lX2NvcHkgKyAxCi0JCQkJICAgICAgIDogc3ltYm9sX25hbWVfY29weSkpOwotI2Vsc2UgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICBTX1NFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbmFtZV9jb3B5KTsKLSNlbmRpZiAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi0gIC8qIGZyZWUoc3ltYm9sX25hbWVfY29weSk7ICovCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X25hbWVfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpIH4wOwotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9udW1iZXIgPSB+MDsKLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDApOwotCi0gIGlmIChTX0lTX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgU0ZfU0VUX1NUUklORyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXVuc2lnbmVkIGludCBkaW1faW5kZXg7Ci0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2VuZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUCA9IDA7Ci0gIC8qIERJTSBCVUcgRklYIHNhY0BjeWdudXMuY29tICovCi0gIGRpbV9pbmRleCA9IDA7Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZGVmIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICAvKiBTZXQgdGhlIHNlY3Rpb24gbnVtYmVyIGFjY29yZGluZyB0byBzdG9yYWdlIGNsYXNzLiAqLwotICBzd2l0Y2ggKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIHsKLSAgICBjYXNlIENfU1RSVEFHOgotICAgIGNhc2UgQ19FTlRBRzoKLSAgICBjYXNlIENfVU5UQUc6Ci0gICAgICBTRl9TRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0ZJTEU6Ci0gICAgY2FzZSBDX1RQREVGOgotICAgICAgU0ZfU0VUX0RFQlVHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIFNFR19ERUJVRyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19FRkNOOgotICAgICAgU0ZfU0VUX0xPQ0FMIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsJLyogRG8gbm90IGVtaXQgdGhpcyBzeW1ib2wuICovCi0gICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgQ19CTE9DSzoKLSAgICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsJLyogV2lsbCBuZWVkIHByb2Nlc3NpbmcgYmVmb3JlIHdyaXRpbmcgKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0ZDTjoKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIFNFR19FMCk7Ci0KLSAgICAgIGlmIChzdHJjbXAgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLCAiLmJmIikgPT0gMCkKLQl7CQkJLyogLmJmICovCi0JICBpZiAoZnVuY3Rpb25fbGluZW9mZiA8IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oImAuYmYnIHN5bWJvbCB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIikpOwotCSAgICB9CQkJLyogbWlzc2luZyBmdW5jdGlvbiBzeW1ib2wgKi8KLQkgIFNBX0dFVF9TWU1fTE5OT1BUUiAobGFzdF9saW5lX3N5bWJvbCkgPSBmdW5jdGlvbl9saW5lb2ZmOwotCi0JICBTRl9TRVRfUFJPQ0VTUyAobGFzdF9saW5lX3N5bWJvbCk7Ci0JICBTRl9TRVRfQURKX0xOTk9QVFIgKGxhc3RfbGluZV9zeW1ib2wpOwotCSAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCSAgZnVuY3Rpb25fbGluZW9mZiA9IC0xOwotCX0KLSAgICAgIC8qIFZhbHVlIGlzIGFsd2F5cyBzZXQgdG8gLiAqLwotICAgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9IGZyYWdfbm93OwotICAgICAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgICBicmVhazsKLQotI2lmZGVmIENfQVVUT0FSRwotICAgIGNhc2UgQ19BVVRPQVJHOgotI2VuZGlmIC8qIENfQVVUT0FSRyAqLwotICAgIGNhc2UgQ19BVVRPOgotICAgIGNhc2UgQ19SRUc6Ci0gICAgY2FzZSBDX01PUzoKLSAgICBjYXNlIENfTU9FOgotICAgIGNhc2UgQ19NT1U6Ci0gICAgY2FzZSBDX0FSRzoKLSAgICBjYXNlIENfUkVHUEFSTToKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgY2FzZSBDX0VPUzoKLSAgICAgIFNGX1NFVF9ERUJVRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBURV9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgY2FzZSBDX1NUQVQ6Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgLyogVmFsaWQgYnV0IHNldCBzb21ld2hlcmUgZWxzZSAoc19jb21tLCBzX2xjb21tLCBjb2xvbikgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1VTVEFUSUM6Ci0gICAgY2FzZSBDX0VYVERFRjoKLSAgICBjYXNlIENfVUxBQkVMOgotICAgICAgYXNfd2FybiAoXygidW5leHBlY3RlZCBzdG9yYWdlIGNsYXNzICVkIiksIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKTsKLSAgICAgIGJyZWFrOwotICAgIH0JCQkJLyogc3dpdGNoIG9uIHN0b3JhZ2UgY2xhc3MgKi8KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGJ1aWx0IGEgZGVidWcgc3ltYm9sLCB0cnkgdG8gZmluZCBpZiB3ZSBzaG91bGQKLSAgICAgbWVyZ2Ugd2l0aCBhbiBleGlzdGluZyBzeW1ib2wgb3Igbm90LiAgSWYgYSBzeW1ib2wgaXMgQ19FRkNOIG9yCi0gICAgIGFic29sdXRlX3NlY3Rpb24gb3IgdW50YWdnZWQgU0VHX0RFQlVHIGl0IG5ldmVyIG1lcmdlcy4gIFdlIGFsc28KLSAgICAgZG9uJ3QgbWVyZ2UgbGFiZWxzLCB3aGljaCBhcmUgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlLCBub3IKLSAgICAgc3ltYm9scyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbiBkZWZpbmVkIHNpbmNlIHRoZXkgYXJlIHR5cGljYWxseQotICAgICB1bmlxdWUsIG5vciBkbyB3ZSBtZXJnZSB0YWdzIHdpdGggbm9uLXRhZ3MuICAqLwotCi0gIC8qIFR3byBjYXNlcyBmb3IgZnVuY3Rpb25zLiAgRWl0aGVyIGRlYnVnIGZvbGxvd2VkIGJ5IGRlZmluaXRpb24gb3IKLSAgICAgZGVmaW5pdGlvbiBmb2xsb3dlZCBieSBkZWJ1Zy4gIEZvciBkZWZpbml0aW9uIGZpcnN0LCB3ZSB3aWxsCi0gICAgIG1lcmdlIHRoZSBkZWJ1ZyBzeW1ib2wgaW50byB0aGUgZGVmaW5pdGlvbi4gIEZvciBkZWJ1ZyBmaXJzdCwgdGhlCi0gICAgIGxpbmVubyBlbnRyeSBNVVNUIHBvaW50IHRvIHRoZSBkZWZpbml0aW9uIGZ1bmN0aW9uIG9yIGVsc2UgaXQKLSAgICAgd2lsbCBwb2ludCBvZmYgaW50byBzcGFjZSB3aGVuIGNyYXdsX3N5bWJvbHMoKSBtZXJnZXMgdGhlIGRlYnVnCi0gICAgIHN5bWJvbCBpbnRvIHRoZSByZWFsIHN5bWJvbC4gIFRoZXJlZm9yLCBsZXQncyBwcmVzdW1lIHRoZSBkZWJ1ZwotICAgICBzeW1ib2wgaXMgYSByZWFsIGZ1bmN0aW9uIHJlZmVyZW5jZS4gKi8KLQotICAvKiBGSVhNRS1TT09OIElmIGZvciBzb21lIHJlYXNvbiB0aGUgZGVmaW5pdGlvbiBsYWJlbC9zeW1ib2wgaXMKLSAgICAgbmV2ZXIgc2VlbiwgdGhpcyB3aWxsIHByb2JhYmx5IGxlYXZlIGFuIHVuZGVmaW5lZCBzeW1ib2wgYXQgbGluawotICAgICB0aW1lLiAqLwotCi0gIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX0VGQ04KLSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfTEFCRUwKLSAgICAgIHx8IChTX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBTRUdfREVCVUcKLQkgICYmICFTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IGFic29sdXRlX3NlY3Rpb24KLSAgICAgIHx8IGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgKHN5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgRE9fTk9UX1NUUklQKSkgPT0gTlVMTAotICAgICAgfHwgKFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpICE9IFNGX0dFVF9UQUcgKHN5bWJvbFApKSkKLSAgICB7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsCi0JCSAgICAgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBzeW1ib2wgYWxyZWFkeSBleGlzdHMsIG1lcmdlIHRoZSBuZXdseSBjcmVhdGVkIHN5bWJvbAotCSBpbnRvIHRoZSBvbGQgb25lLiAgVGhpcyBpcyBub3QgbWFuZGF0b3J5LiBUaGUgbGlua2VyIGNhbgotCSBoYW5kbGUgZHVwbGljYXRlIHN5bWJvbHMgY29ycmVjdGx5LiBCdXQgSSBndWVzcyB0aGF0IGl0IHNhdmUKLQkgYSAqbG90KiBvZiBzcGFjZSBpZiB0aGUgYXNzZW1ibHkgZmlsZSBkZWZpbmVzIGEgbG90IG9mCi0JIHN5bWJvbHMuIFtsb2ljXSAqLwotCi0gICAgICAvKiBUaGUgZGVidWcgZW50cnkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIGlzIG1lcmdlZCBpbnRvIHRoZQotCSBwcmV2aW91cyBkZWZpbml0aW9uLiAgKi8KLQotICAgICAgY19zeW1ib2xfbWVyZ2UgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbFApOwotICAgICAgLyogRklYTUUtU09PTiBTaG91bGQgKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgYmUgZnJlZSdkPyB4b3hvcmljaC4gKi8KLSAgICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBzeW1ib2xQOwotCi0gICAgICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCSAgfHwgU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfU1RBVCkKLQl7Ci0JICAvKiBGb3IgZnVuY3Rpb25zLCBhbmQgdGFncywgYW5kIHN0YXRpYyBzeW1ib2xzLCB0aGUgc3ltYm9sCi0JICAgICAqbXVzdCogYmUgd2hlcmUgdGhlIGRlYnVnIHN5bWJvbCBhcHBlYXJzLiAgTW92ZSB0aGUKLQkgICAgIGV4aXN0aW5nIHN5bWJvbCB0byB0aGUgY3VycmVudCBwbGFjZS4gKi8KLQkgIC8qIElmIGl0IGFscmVhZHkgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QsIGRvIG5vdGhpbmcgKi8KLQkgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IHN5bWJvbF9sYXN0UCkKLQkgICAgewotCSAgICAgIHN5bWJvbF9yZW1vdmUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZzeW1ib2xfcm9vdFAsCi0JCQkgICAgICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwKLQkJCSAgICAgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgIH0JCQkvKiBpZiBub3QgYWxyZWFkeSBpbiBwbGFjZSAqLwotCX0JCQkvKiBpZiBmdW5jdGlvbiAqLwotICAgIH0JCQkJLyogbm9ybWFsIG9yIG1lcmdhYmxlICovCi0KLSAgaWYgKFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKm9sZHRhZzsKLQotICAgICAgb2xkdGFnID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCi0JCQkJIERPX05PVF9TVFJJUCk7Ci0gICAgICBpZiAob2xkdGFnID09IE5VTEwgfHwgISBTRl9HRVRfVEFHIChvbGR0YWcpKQotCXRhZ19pbnNlcnQgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAotCQkgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQotCi0gIGlmIChTRl9HRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIHsKLSAgICAgIGtub3cgKHNpemVvZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPD0gc2l6ZW9mIChsb25nKSk7Ci0gICAgICBmdW5jdGlvbl9saW5lb2ZmCi0JPSBjX2xpbmVfbmV3IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gICAgICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLSAgICAgIGlmIChzeW1ib2xQID09IE5VTEwpCi0JewotCSAgLyogVGhhdCBpcywgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoZQotCSAgICAgZnVuY3Rpb24uLi4gKi8KLQkgIHN5bWJvbF90YWJsZV9pbnNlcnQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCX0JCQkvKiBkZWZpbml0aW9uIGZvbGxvd3MgZGVidWcgKi8KLSAgICB9CQkJCS8qIENyZWF0ZSB0aGUgbGluZSBudW1iZXIgZW50cnkgcG9pbnRpbmcgdG8gdGhlIGZ1bmN0aW9uIGJlaW5nIGRlZmluZWQgKi8KLQotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gTlVMTDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RpbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBkaW1faW5kZXg7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGltIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLQotICBmb3IgKGRpbV9pbmRleCA9IDA7IGRpbV9pbmRleCA8IERJTU5VTTsgZGltX2luZGV4KyspCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFUyAoKTsKLSAgICAgIFNBX1NFVF9TWU1fRElNRU4gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGRpbV9pbmRleCwKLQkJCWdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQljYXNlICcsJzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfd2FybiAoXygiYmFkbHkgZm9ybWVkIC5kaW0gZGlyZWN0aXZlIGlnbm9yZWQiKSk7Ci0JICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCWNhc2UgJ1xuJzoKLQljYXNlICc7JzoKLQkgIGRpbV9pbmRleCA9IERJTU5VTTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xpbmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgdGhpc19iYXNlOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgb2JqX2NvZmZfbG4gKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gIHRoaXNfYmFzZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIC8qIE9ubHkgLmJmIHN5bWJvbHMgaW5kaWNhdGUgdGhlIHVzZSBvZiBhIG5ldyBiYXNlIGxpbmUgbnVtYmVyOyB0aGUKLSAgICAgbGluZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCAuZWYsIC5iYiwgLmViIGFyZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgc3RhcnQgb2YgdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24uICAqLwotICBpZiAoIXN0cmNtcCAoIi5iZiIsIG5hbWUpKQotICAgIHsKLSNpZiAwIC8qIFhYWCBDYW4gd2UgZXZlciBoYXZlIGxpbmUgbnVtYmVycyBnb2luZyBiYWNrd2FyZHM/ICAqLwotICAgICAgaWYgKHRoaXNfYmFzZSA+IGxpbmVfYmFzZSkKLSNlbmRpZgotCXsKLQkgIGxpbmVfYmFzZSA9IHRoaXNfYmFzZTsKLQl9Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgewotCWV4dGVybiBpbnQgbGlzdGluZzsKLQlpZiAobGlzdGluZykKLQkgIHsKLQkgICAgbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgbGluZV9iYXNlKTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgU0FfU0VUX1NZTV9MTk5PIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCB0aGlzX2Jhc2UpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9zaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc2l6ZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgU0FfU0VUX1NZTV9TSVpFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9zY2wgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqc3ltYm9sX25hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLQotICAvKiBBc3N1bWUgdGhhdCB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IC50YWcgaXMgYWx3YXlzIGRlZmluZWQuCi0gICAgIFRoaXMgd2FzIGEgYmFkIGFzc3VtcHRpb24uICBJJ3ZlIGFkZGVkIGZpbmRfb3JfbWFrZS4geG94b3JpY2guICovCi0gIFNBX1NFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLAotCQkgICAgIChsb25nKSB0YWdfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSkpOwotICBpZiAoU0FfR0VUX1NZTV9UQUdORFggKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IDBMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInRhZyBub3QgZm91bmQgZm9yIC50YWcgJXMiKSwgc3ltYm9sX25hbWUpOwotICAgIH0JCQkJLyogbm90IGRlZmluZWQgKi8KLQotICBTRl9TRVRfVEFHR0VEIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl90eXBlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoSVNGQ04gKFNfR0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpICYmCi0gICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBDX1RQREVGKQotICAgIHsKLSAgICAgIFNGX1NFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQkJCQkvKiBpcyBhIGZ1bmN0aW9uICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3ZhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgY2hhciAqc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjaGFyIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKLSNlbmRpZgotCi0gICAgICBpZiAoIXN0cmNtcCAoc3ltYm9sX25hbWUsICIuIikpCi0JewotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAvKiBJZiB0aGUgLnZhbCBpcyAhPSBmcm9tIHRoZSAuZGVmIChlLmcuIHN0YXRpY3MpICovCi0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgc3ltYm9sX25hbWUpKQotCXsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3AgPSBPX3N5bWJvbDsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCA9Ci0JICAgIHN5bWJvbF9maW5kX29yX21ha2UgKHN5bWJvbF9uYW1lKTsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IDA7Ci0KLQkgIC8qIElmIHRoZSBzZWdtZW50IGlzIHVuZGVmaW5lZCB3aGVuIHRoZSBmb3J3YXJkIHJlZmVyZW5jZSBpcwotCSAgICAgcmVzb2x2ZWQsIHRoZW4gY29weSB0aGUgc2VnbWVudCBpZCBmcm9tIHRoZSBmb3J3YXJkCi0JICAgICBzeW1ib2wuICAqLwotCSAgU0ZfU0VUX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotCSAgLyogRklYTUU6IGdjYyBjYW4gZ2VuZXJhdGUgYWRkcmVzcyBleHByZXNzaW9ucyBoZXJlIGluCi0JICAgICB1bnVzdWFsIGNhc2VzIChzZWFyY2ggZm9yICJvYnNjdXJlIiBpbiBzZGJvdXQuYykuICBXZQotCSAgICAganVzdCBpZ25vcmUgdGhlIG9mZnNldCBoZXJlLCB0aHVzIGdlbmVyYXRpbmcgaW5jb3JyZWN0Ci0JICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXZSBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUKLQkgICAgIGp1c3QgYmVsb3cuICAqLwotCX0KLSAgICAgIC8qIE90aGVyd2lzZSwgaXQgaXMgdGhlIG5hbWUgb2YgYSBub24gZGVidWcgc3ltYm9sIGFuZAotCSBpdHMgdmFsdWUgd2lsbCBiZSBjYWxjdWxhdGVkIGxhdGVyLiAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gICAgICAvKiBGSVhNRTogdGhpcyBpcyB0byBhdm9pZCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZQotCSBGSVhNRSBjYXNlIG1lbnRpb25lZCBqdXN0IGFib3ZlLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywKLQkJICAgKHZhbHVlVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAgIH0JCQkJLyogaWYgc3ltYm9sIGJhc2VkICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2lmZGVmIFRFX1BFCi0KLS8qIEhhbmRsZSB0aGUgLmxpbmtvbmNlIHBzZXVkby1vcC4gIFRoaXMgaXMgcGFyc2VkIGJ5IHNfbGlua29uY2UgaW4KLSAgIHJlYWQuYywgd2hpY2ggdGhlbiBjYWxscyB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYyByb3V0aW5lLiAgKi8KLQotdm9pZAotb2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSAodHlwZSkKLSAgICAgZW51bSBsaW5rb25jZV90eXBlIHR5cGU7Ci17Ci0gIHNlZ19pbmZvIChub3dfc2VnKS0+c2NuaGRyLnNfZmxhZ3MgfD0gSU1BR0VfU0NOX0xOS19DT01EQVQ7Ci0KLSAgLyogV2Ugc3RvcmUgdGhlIHR5cGUgaW4gdGhlIHNlZ19pbmZvIHN0cnVjdHVyZSwgYW5kIHVzZSBpdCB0byBzZXQgdXAKLSAgICAgdGhlIGF1eGlsaWFyeSBlbnRyeSBmb3IgdGhlIHNlY3Rpb24gc3ltYm9sIGluIGNfc2VjdGlvbl9zeW1ib2wuICAqLwotICBzZWdfaW5mbyAobm93X3NlZyktPmxpbmtvbmNlID0gdHlwZTsKLX0KLQotI2VuZGlmIC8qIFRFX1BFICovCi0KLXZvaWQKLWNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotICAvKiBUaGVzZSBoYWQgYmV0dGVyIGJlIHRoZSBzYW1lLiAgVXN1YWxseSAxOCBieXRlcy4gKi8KLSNpZm5kZWYgQkZEX0hFQURFUlMKLSAga25vdyAoc2l6ZW9mIChTWU1FTlQpID09IHNpemVvZiAoQVVYRU5UKSk7Ci0gIGtub3cgKFNZTUVTWiA9PSBBVVhFU1opOwotI2VuZGlmCi0gIHRhZ19pbml0ICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGFuZCBwdXRzIGFsbCB0aGUKLSAgIGV4dGVybmFscyBvbnRvIGFub3RoZXIgY2hhaW4gKi8KLQotLyogVGhlIGNoYWluIG9mIGdsb2JhbHMuICAqLwotc3ltYm9sUyAqc3ltYm9sX2dsb2JhbFA7Ci1zeW1ib2xTICpzeW1ib2xfZ2xvYmFsX2xhc3RQOwotCi0vKiBUaGUgY2hhaW4gb2YgZXh0ZXJuYWxzICovCi1zeW1ib2xTICpzeW1ib2xfZXh0ZXJuUDsKLXN5bWJvbFMgKnN5bWJvbF9leHRlcm5fbGFzdFA7Ci0KLXN0YWNrICpibG9ja19zdGFjazsKLXN5bWJvbFMgKmxhc3RfZnVuY3Rpb25QOwotc3RhdGljIHN5bWJvbFMgKmxhc3RfYmZQOwotc3ltYm9sUyAqbGFzdF90YWdQOwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci15YW5rX3N5bWJvbHMgKCkKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotICB1bnNpZ25lZCBpbnQgbGFzdF9maWxlX3N5bW5vID0gMDsKLQotICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9oZWFkOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLSAgICAgICBzeW1ib2xQOwotICAgICAgIHN5bWJvbFAgPSBzeW1ib2xQID8gc3ltYm9sX25leHQgKHN5bWJvbFApIDogc3ltYm9sX3Jvb3RQKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xQLT5zeV9tcmlfY29tbW9uKQotCXsKLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVAotI2lmZGVmIFRFX1BFCi0JICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLCi0jZW5kaWYKLQkgICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX1dFQUtFWFQpCi0JICAgIGFzX2JhZCAoXygiJXM6IGdsb2JhbCBzeW1ib2xzIG5vdCBzdXBwb3J0ZWQgaW4gY29tbW9uIHNlY3Rpb25zIiksCi0JCSAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCFTRl9HRVRfREVCVUcgKHN5bWJvbFApKQotCXsKLQkgIC8qIERlYnVnIHN5bWJvbHMgZG8gbm90IG5lZWQgYWxsIHRoaXMgcnViYmlzaCAqLwotCSAgc3ltYm9sUyAqcmVhbF9zeW1ib2xQOwotCi0JICAvKiBMKiBhbmQgQ19FRkNOIHN5bWJvbHMgbmV2ZXIgbWVyZ2UuICovCi0JICBpZiAoIVNGX0dFVF9MT0NBTCAoc3ltYm9sUCkKLQkgICAgICAmJiAhU0ZfR0VUX1NUQVRJQ1MgKHN5bWJvbFApCi0JICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgIT0gQ19MQUJFTAotCSAgICAgICYmIHN5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICYmIChyZWFsX3N5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChzeW1ib2xQKSwgRE9fTk9UX1NUUklQKSkKLQkgICAgICAmJiByZWFsX3N5bWJvbFAgIT0gc3ltYm9sUCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FLVNPT046IHdoZXJlIGRvIGR1cHMgY29tZSBmcm9tPwotCQkgTWF5YmUgdGFnIHJlZmVyZW5jZXMgYmVmb3JlIGRlZmluaXRpb25zPyB4b3hvcmljaC4gKi8KLQkgICAgICAvKiBNb3ZlIHRoZSBkZWJ1ZyBkYXRhIGZyb20gdGhlIGRlYnVnIHN5bWJvbCB0byB0aGUKLQkJIHJlYWwgc3ltYm9sLiBEbyBOT1QgZG8gdGhlIG9wb3NpdGUgKGkuZS4gbW92ZSBmcm9tCi0JCSByZWFsIHN5bWJvbCB0byBkZWJ1ZyBzeW1ib2wgYW5kIHJlbW92ZSByZWFsIHN5bWJvbCBmcm9tIHRoZQotCQkgbGlzdC4pIEJlY2F1c2Ugc29tZSBwb2ludGVycyByZWZlciB0byB0aGUgcmVhbCBzeW1ib2wKLQkJIHdoZXJlYXMgbm8gcG9pbnRlcnMgcmVmZXIgdG8gdGhlIGRlYnVnIHN5bWJvbC4gKi8KLQkgICAgICBjX3N5bWJvbF9tZXJnZSAoc3ltYm9sUCwgcmVhbF9zeW1ib2xQKTsKLQkgICAgICAvKiBSZXBsYWNlIHRoZSBjdXJyZW50IHN5bWJvbCBieSB0aGUgcmVhbCBvbmUgKi8KLQkgICAgICAvKiBUaGUgc3ltYm9scyB3aWxsIG5ldmVyIGJlIHRoZSBsYXN0IG9yIHRoZSBmaXJzdAotCQkgYmVjYXVzZSA6IDFzdCBzeW1ib2wgaXMgLmZpbGUgYW5kIDMgbGFzdCBzeW1ib2xzIGFyZQotCQkgLnRleHQsIC5kYXRhLCAuYnNzICovCi0JICAgICAgc3ltYm9sX3JlbW92ZSAocmVhbF9zeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfaW5zZXJ0IChyZWFsX3N5bWJvbFAsIHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbFAgPSByZWFsX3N5bWJvbFA7Ci0JICAgIH0JCQkvKiBpZiBub3QgbG9jYWwgYnV0IGR1cCdkICovCi0KLQkgIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCAmJiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0UxKSkKLQkgICAgewotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIFNFR19FMCk7Ci0JICAgIH0JCQkvKiBwdXNoIGRhdGEgaW50byB0ZXh0ICovCi0KLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xQLCAxKTsKLQotCSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhU0ZfR0VUX0xPQ0FMIChzeW1ib2xQKSkKLQkJewotCQkgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19FMCkKLQkJewotCQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTEFCRUwpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19TVEFUKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIE1haW5seSB0byBzcGVlZCB1cCBpZiBub3QgLWcgKi8KLQkgIGlmIChTRl9HRVRfUFJPQ0VTUyAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICAvKiBIYW5kbGUgdGhlIG5lc3RlZCBibG9ja3MgYXV4aWxpYXJ5IGluZm8uICovCi0JICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfQkxPQ0spCi0JCXsKLQkJICBpZiAoIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ltYm9sUCksICIuYmIiKSkKLQkJICAgIHN0YWNrX3B1c2ggKGJsb2NrX3N0YWNrLCAoY2hhciAqKSAmc3ltYm9sUCk7Ci0JCSAgZWxzZQotCQkgICAgewkJLyogLmViICovCi0JCSAgICAgIHJlZ2lzdGVyIHN5bWJvbFMgKmJlZ2luX3N5bWJvbFA7Ci0JCSAgICAgIGJlZ2luX3N5bWJvbFAgPSAqKHN5bWJvbFMgKiopIHN0YWNrX3BvcCAoYmxvY2tfc3RhY2spOwotCQkgICAgICBpZiAoYmVnaW5fc3ltYm9sUCA9PSAoc3ltYm9sUyAqKSAwKQotCQkJYXNfd2FybiAoXygibWlzbWF0Y2hlZCAuZWIiKSk7Ci0JCSAgICAgIGVsc2UKLQkJCVNBX1NFVF9TWU1fRU5ETkRYIChiZWdpbl9zeW1ib2xQLCBzeW1ib2xfbnVtYmVyICsgMik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAvKiBJZiB3ZSBhcmUgYWJsZSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBhIGZ1bmN0aW9uLCBhbmQgd2UKLQkgICAgICAgYXJlIG91dCBvZiBhIGZ1bmN0aW9uIChsYXN0X2Z1bmN0aW9uUCA9PSAwKSB0aGVuLCB0aGUKLQkgICAgICAgZnVuY3Rpb24gc3ltYm9sIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGF1eGlsaWFyeQotCSAgICAgICBlbnRyeS4gKi8KLQkgICAgICBpZiAobGFzdF9mdW5jdGlvblAgPT0gKHN5bWJvbFMgKikgMCAmJgotCQkgIFNGX0dFVF9GVU5DVElPTiAoc3ltYm9sUCkpCi0JCXsKLQkJICBsYXN0X2Z1bmN0aW9uUCA9IHN5bWJvbFA7Ci0KLQkJICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCkgPCAxKQotCQkgICAgewotCQkgICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKLQkJICAgIH0JCS8qIG1ha2UgaXQgYXQgbGVhc3QgMSAqLwotCi0JCSAgLyogQ2xvYmJlciBwb3NzaWJsZSBzdGFsZSAuZGltIGluZm9ybWF0aW9uLiAqLwotI2lmIDAKLQkJICAvKiBJZmZlZCBvdXQgYnkgc3RldmUgLSB0aGlzIGZyaWVzIHRoZSBsbm5vcHRyIGluZm8gdG9vICovCi0JCSAgYnplcm8gKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4sCi0JCQkgc2l6ZW9mIChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXS54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuKSk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0ZDTikKLQkJewotCQkgIGlmIChzdHJjbXAgKFNfR0VUX05BTUUgKHN5bWJvbFApLCAiLmJmIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGxhc3RfYmZQICE9IE5VTEwpCi0JCQlTQV9TRVRfU1lNX0VORE5EWCAobGFzdF9iZlAsIHN5bWJvbF9udW1iZXIpOwotCQkgICAgICBsYXN0X2JmUCA9IHN5bWJvbFA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VGQ04pCi0JCXsKLQkJICAvKiBJIGRvbid0IGV2ZW4ga25vdyBpZiB0aGlzIGlzIG5lZWRlZCBmb3Igc2RiLiBCdXQKLQkJICAgICB0aGUgc3RhbmRhcmQgYXNzZW1ibGVyIGdlbmVyYXRlcyBpdCwgc28uLi4gICovCi0JCSAgaWYgKGxhc3RfZnVuY3Rpb25QID09IChzeW1ib2xTICopIDApCi0JCSAgICBhc19mYXRhbCAoXygiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiKSk7Ci0JCSAgU0FfU0VUX1NZTV9GU0laRSAobGFzdF9mdW5jdGlvblAsCi0JCQkJICAgIChsb25nKSAoU19HRVRfVkFMVUUgKHN5bWJvbFApIC0KLQkJCQkJICAgIFNfR0VUX1ZBTFVFIChsYXN0X2Z1bmN0aW9uUCkpKTsKLQkJICBTQV9TRVRfU1lNX0VORE5EWCAobGFzdF9mdW5jdGlvblAsIHN5bWJvbF9udW1iZXIpOwotCQkgbGFzdF9mdW5jdGlvblAgPSAoc3ltYm9sUyAqKSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChTRl9HRVRfVEFHIChzeW1ib2xQKSkKLQl7Ci0JICAvKiBGaXJzdCBkZXNjcmlwdG9yIG9mIGEgc3RydWN0dXJlIG11c3QgcG9pbnQgdG8KLQkgICAgICAgdGhlIGZpcnN0IHNsb3QgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBkZXNjcmlwdGlvbi4gKi8KLQkgIGxhc3RfdGFnUCA9IHN5bWJvbFA7Ci0KLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VPUykKLQl7Ci0JICAvKiArMiB0YWtlIGluIGFjY291bnQgdGhlIGN1cnJlbnQgc3ltYm9sICovCi0JICBTQV9TRVRfU1lNX0VORE5EWCAobGFzdF90YWdQLCBzeW1ib2xfbnVtYmVyICsgMik7Ci0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GSUxFKQotCXsKLQkgIC8qIElmIHRoZSBmaWxlbmFtZSB3YXMgdG9vIGxvbmcgdG8gZml0IGluIHRoZQotCSAgICAgYXV4ZW50LCBwdXQgaXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotCSAgaWYgKFNBX0dFVF9GSUxFX0ZOQU1FX1pFUk9TIChzeW1ib2xQKSA9PSAwCi0JICAgICAgJiYgU0FfR0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQKSAhPSAwKQotCSAgICB7Ci0JICAgICAgU0FfU0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQLCBzdHJpbmdfYnl0ZV9jb3VudCk7Ci0JICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChmaWxlbmFtZV9saXN0X3NjYW4tPmZpbGVuYW1lKSArIDE7Ci0JICAgICAgZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9zY2FuLT5uZXh0OwotCSAgICB9Ci0JICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIGxhc3RfZmlsZV9zeW1ubyk7Ci0JICAgICAgbGFzdF9maWxlX3N5bW5vID0gc3ltYm9sX251bWJlcjsKLQkgICAgfQkJCS8qIG5vIG9uZSBwb2ludHMgYXQgdGhlIGZpcnN0IC5maWxlIHN5bWJvbCAqLwotCX0JCQkvKiBpZiBkZWJ1ZyBvciB0YWcgb3IgZW9zIG9yIGZpbGUgKi8KLQotI2lmZGVmIHRjX2Zyb2JfY29mZl9zeW1ib2wKLSAgICAgIHRjX2Zyb2JfY29mZl9zeW1ib2wgKHN5bWJvbFApOwotI2VuZGlmCi0KLSAgICAgIC8qIFdlIG11c3QgcHV0IHRoZSBleHRlcm5hbCBzeW1ib2xzIGFwYXJ0LiBUaGUgbG9hZGVyCi0JIGRvZXMgbm90IGJvbWIgaWYgd2UgZG8gbm90LiBCdXQgdGhlIHJlZmVyZW5jZXMgaW4KLQkgdGhlIGVuZG5keCBmaWVsZCBmb3IgYSAuYmIgc3ltYm9sIGFyZSBub3QgY29ycmVjdGVkCi0JIGlmIGFuIGV4dGVybmFsIHN5bWJvbCBpcyByZW1vdmVkIGJldHdlZW4gLmJiIGFuZCAuYmUuCi0JIEkuZSBpbiB0aGUgZm9sbG93aW5nIGNhc2UgOgotCSBbMjBdIC5iYiBlbmRuZHggPSAyMgotCSBbMjFdIGZvbyBleHRlcm5hbAotCSBbMjJdIC5iZQotCSBsZCB3aWxsIG1vdmUgdGhlIHN5bWJvbCAyMSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGJ1dAotCSBlbmRuZHggd2lsbCBzdGlsbCBiZSAyMiBpbnN0ZWFkIG9mIDIxLiAqLwotCi0KLSAgICAgIGlmIChTRl9HRVRfTE9DQUwgKHN5bWJvbFApKQotCXsKLQkgIC8qIHJlbW92ZSBDX0VGQ04gYW5kIExPQ0FMIChMLi4uKSBzeW1ib2xzICovCi0JICAvKiBuZXh0IHBvaW50ZXIgcmVtYWlucyB2YWxpZCAqLwotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLQl9Ci0gICAgICBlbHNlIGlmIChzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgU19JU19DT01NT04gKHN5bWJvbFApKSkKLQl7Ci0JICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLQkgICAgIHN5bWJvbHMuICAqLwotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JfQotICAgICAgZWxzZSBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLQkgICAgICAgJiYgIVNfSVNfREVCVUcgKHN5bWJvbFApCi0JICAgICAgICYmICFTRl9HRVRfU1RBVElDUyAoc3ltYm9sUCkKLQkgICAgICAgJiYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUCi0jaWZkZWYgVEVfUEUKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLCi0jZW5kaWYKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19XRUFLRVhUKSkKLQl7Ci0JICAvKiBpZiBleHRlcm5hbCwgUmVtb3ZlIGZyb20gdGhlIGxpc3QgKi8KLQkgIHN5bWJvbFMgKmhvbGQgPSBzeW1ib2xfcHJldmlvdXMgKHN5bWJvbFApOwotCi0JICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKTsKLQkgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9leHRlcm5fbGFzdFAsICZzeW1ib2xfZXh0ZXJuUCwgJnN5bWJvbF9leHRlcm5fbGFzdFApOwotCSAgc3ltYm9sUCA9IGhvbGQ7Ci0JfQotICAgICAgZWxzZSBpZiAoISBTX0lTX0RFQlVHIChzeW1ib2xQKQotCSAgICAgICAmJiAhIFNGX0dFVF9TVEFUSUNTIChzeW1ib2xQKQotCSAgICAgICAmJiAhIFNGX0dFVF9GVU5DVElPTiAoc3ltYm9sUCkKLQkgICAgICAgJiYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUCi0jaWZkZWYgVEVfUEUKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLCi0jZW5kaWYKLQkJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVF9XRUFLKSkKLQl7Ci0JICBzeW1ib2xTICpob2xkID0gc3ltYm9sX3ByZXZpb3VzIChzeW1ib2xQKTsKLQotCSAgLyogVGhlIE8nUmVpbGx5IENPRkYgYm9vayBzYXlzIHRoYXQgZGVmaW5lZCBnbG9iYWwgc3ltYm9scwotICAgICAgICAgICAgIGNvbWUgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLCBqdXN0IGJlZm9yZQotICAgICAgICAgICAgIHVuZGVmaW5lZCBnbG9iYWwgc3ltYm9scy4gICovCi0KLQkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMgKHN5bWJvbFApOwotCSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2dsb2JhbF9sYXN0UCwgJnN5bWJvbF9nbG9iYWxQLAotCQkJICZzeW1ib2xfZ2xvYmFsX2xhc3RQKTsKLQkgIHN5bWJvbFAgPSBob2xkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU0ZfR0VUX1NUUklORyAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OwotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCSAgICB9CQkJLyogZml4ICJsb25nIiBuYW1lcyAqLwotCi0JICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyOwotCSAgc3ltYm9sX251bWJlciArPSAxICsgU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCk7Ci0JfQkJCS8qIGlmIGxvY2FsIHN5bWJvbCAqLwotICAgIH0JCQkJLyogdHJhdmVyc2UgdGhlIHN5bWJvbCBsaXN0ICovCi0gIHJldHVybiBzeW1ib2xfbnVtYmVyOwotCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotZ2x1ZV9zeW1ib2xzIChoZWFkLCB0YWlsKQotICAgICBzeW1ib2xTICoqaGVhZDsKLSAgICAgc3ltYm9sUyAqKnRhaWw7Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLQotICB3aGlsZSAoKmhlYWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICp0bXAgPSAqaGVhZDsKLQotICAgICAgLyogYXBwZW5kICovCi0gICAgICBzeW1ib2xfcmVtb3ZlICh0bXAsIGhlYWQsIHRhaWwpOwotICAgICAgc3ltYm9sX2FwcGVuZCAodG1wLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gICAgICAvKiBhbmQgcHJvY2VzcyAqLwotICAgICAgaWYgKFNGX0dFVF9TVFJJTkcgKHRtcCkpCi0JewotCSAgdG1wLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OwotCSAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FICh0bXApKSArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRtcC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCX0JCQkvKiBmaXggImxvbmciIG5hbWVzICovCi0KLSAgICAgIHRtcC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcjsKLSAgICAgIHN5bWJvbF9udW1iZXIgKz0gMSArIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHRtcCk7Ci0gICAgfQkJCQkvKiBhcHBlbmQgdGhlIGVudGlyZSBleHRlcm4gY2hhaW4gKi8KLQotICByZXR1cm4gc3ltYm9sX251bWJlcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotdGllX3RhZ3MgKCkKLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyOwotCi0gICAgICBpZiAoU0ZfR0VUX1RBR0dFRCAoc3ltYm9sUCkpCi0JewotCSAgU0FfU0VUX1NZTV9UQUdORFgKLQkgICAgKHN5bWJvbFAsCi0JICAgICAoKHN5bWJvbFMgKikgU0FfR0VUX1NZTV9UQUdORFggKHN5bWJvbFApKS0+c3lfbnVtYmVyKTsKLQl9Ci0KLSAgICAgIHN5bWJvbF9udW1iZXIgKz0gMSArIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFApOwotICAgIH0KLQotICByZXR1cm4gc3ltYm9sX251bWJlcjsKLX0KLQotc3RhdGljIHZvaWQKLWNyYXdsX3N5bWJvbHMgKGgsIGFiZmQpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoOwotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhY2sgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBtYXRjaGluZyAuYmIgLmJlICovCi0KLSAgYmxvY2tfc3RhY2sgPSBzdGFja19pbml0ICg1MTIsIHNpemVvZiAoc3ltYm9sUyAqKSk7Ci0KLSAgLyogVGhlIHN5bWJvbCBsaXN0IHNob3VsZCBiZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHNlcXVlbmNlCi0gICAqIG9yZGVyIDoKLSAgICogLiAuZmlsZSBzeW1ib2wKLSAgICogLiBkZWJ1ZyBlbnRyaWVzIGZvciBmdW5jdGlvbnMKLSAgICogLiBmYWtlIHN5bWJvbHMgZm9yIHRoZSBzZWN0aW9ucywgaW5jbHVkaW5nIC50ZXh0IC5kYXRhIGFuZCAuYnNzCi0gICAqIC4gZGVmaW5lZCBzeW1ib2xzCi0gICAqIC4gdW5kZWZpbmVkIHN5bWJvbHMKLSAgICogQnV0IHRoaXMgaXMgbm90IG1hbmRhdG9yeS4gVGhlIG9ubHkgaW1wb3J0YW50IHBvaW50IGlzIHRvIHB1dCB0aGUKLSAgICogdW5kZWZpbmVkIHN5bWJvbHMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICovCi0KLSAgLyogSXMgdGhlcmUgYSAuZmlsZSBzeW1ib2wgPyBJZiBub3QgaW5zZXJ0IG9uZSBhdCB0aGUgYmVnaW5uaW5nLiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQID09IE5VTEwKLSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbF9yb290UCkgIT0gQ19GSUxFKQotICAgIHsKLSAgICAgIGNfZG90X2ZpbGVfc3ltYm9sICgiZmFrZSIpOwotICAgIH0KLQotICAvKgotICAgKiBCdWlsZCB1cCBzdGF0aWMgc3ltYm9scyBmb3IgdGhlIHNlY3Rpb25zLCB0aGV5IGFyZSBmaWxsZWQgaW4gbGF0ZXIKLSAgICovCi0KLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5kb3QgPSBjX3NlY3Rpb25fc3ltYm9sIChzZWdtZW50X2luZm9baV0ubmFtZSwKLQkJCQkJICAgICAgaSAtIFNFR19FMCArIDEpOwotCi0gIC8qIFRha2UgYWxsIHRoZSBleHRlcm5hbHMgb3V0IGFuZCBwdXQgdGhlbSBpbnRvIGFub3RoZXIgY2hhaW4gKi8KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGgsIHlhbmtfc3ltYm9scyAoKSk7Ci0gIC8qIFRha2UgdGhlIGV4dGVybmFscyBhbmQgZ2x1ZSB0aGVtIG9udG8gdGhlIGVuZC4qLwotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaCwKLQkJCSAgIChIX0dFVF9TWU1CT0xfQ09VTlQgKGgpCi0JCQkgICAgKyBnbHVlX3N5bWJvbHMgKCZzeW1ib2xfZ2xvYmFsUCwKLQkJCQkJICAgICZzeW1ib2xfZ2xvYmFsX2xhc3RQKQotCQkJICAgICsgZ2x1ZV9zeW1ib2xzICgmc3ltYm9sX2V4dGVyblAsCi0JCQkJCSAgICAmc3ltYm9sX2V4dGVybl9sYXN0UCkpKTsKLQotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaCwgdGllX3RhZ3MgKCkpOwotICBrbm93IChzeW1ib2xfZ2xvYmFsUCA9PSBOVUxMKTsKLSAga25vdyAoc3ltYm9sX2dsb2JhbF9sYXN0UCA9PSBOVUxMKTsKLSAga25vdyAoc3ltYm9sX2V4dGVyblAgPT0gTlVMTCk7Ci0gIGtub3cgKHN5bWJvbF9leHRlcm5fbGFzdFAgPT0gTlVMTCk7Ci19Ci0KLS8qCi0gKiBGaW5kIHN0cmluZ3MgYnkgY3Jhd2xpbmcgYWxvbmcgc3ltYm9sIHRhYmxlIGNoYWluLgotICovCi0KLXZvaWQKLXdfc3RyaW5ncyAod2hlcmUpCi0gICAgIGNoYXIgKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9oZWFkOwotCi0gIC8qIEdvdHRhIGRvIG1kXyBieXRlLW9yZGVyaW5nIHN0dWZmIGZvciBzdHJpbmdfYnl0ZV9jb3VudCBmaXJzdCAtIEtXSyAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCAodmFsdWVUKSBzdHJpbmdfYnl0ZV9jb3VudCwgNCk7Ci0gIHdoZXJlICs9IDQ7Ci0KLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZSBtdXN0Ci0gICAgIGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIGNvZmZfaGVhZGVyX2FwcGVuZCBhbmQgd3JpdGVfb2JqZWN0X2ZpbGUuICAqLwotICB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgICAgewotCWlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXQotCSAgICAmJiBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSA+IFNDTk5NTEVOKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotCSAgICBzaXplID0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgKyAxOwotCSAgICBtZW1jcHkgKHdoZXJlLCBzZWdtZW50X2luZm9baV0ubmFtZSwgc2l6ZSk7Ci0JICAgIHdoZXJlICs9IHNpemU7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSNlbmRpZiAvKiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyAqLwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLSAgICAgICBzeW1ib2xQOwotICAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HIChzeW1ib2xQKSkKLQl7Ci0JICBzaXplID0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOwotCSAgbWVtY3B5ICh3aGVyZSwgU19HRVRfTkFNRSAoc3ltYm9sUCksIHNpemUpOwotCSAgd2hlcmUgKz0gc2l6ZTsKLQl9Ci0gICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GSUxFCi0JICAmJiBTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyAoc3ltYm9sUCkgPT0gMAotCSAgJiYgU0FfR0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQKSAhPSAwKQotCXsKLQkgIHNpemUgPSBzdHJsZW4gKGZpbGVuYW1lX2xpc3Rfc2Nhbi0+ZmlsZW5hbWUpICsgMTsKLQkgIG1lbWNweSAod2hlcmUsIGZpbGVuYW1lX2xpc3Rfc2Nhbi0+ZmlsZW5hbWUsIHNpemUpOwotCSAgZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9zY2FuIC0+bmV4dDsKLQkgIHdoZXJlICs9IHNpemU7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRvX2xpbmVub3NfZm9yIChhYmZkLCBoLCBmaWxlX2N1cnNvcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOwotICAgICB1bnNpZ25lZCBsb25nICpmaWxlX2N1cnNvcjsKLXsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgdW5zaWduZWQgbG9uZyBzdGFydCA9ICpmaWxlX2N1cnNvcjsKLQotICBmb3IgKGlkeCA9IFNFR19FMDsgaWR4IDwgU0VHX0xBU1Q7IGlkeCsrKQotICAgIHsKLSAgICAgIHNlZ21lbnRfaW5mb190eXBlICpzID0gc2VnbWVudF9pbmZvICsgaWR4OwotCi0KLSAgICAgIGlmIChzLT5zY25oZHIuc19ubG5ubyAhPSAwKQotCXsKLQkgIHN0cnVjdCBsaW5lbm9fbGlzdCAqbGluZV9wdHI7Ci0KLQkgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmJ1ZmZlciA9Ci0JICAoc3RydWN0IGV4dGVybmFsX2xpbmVubyAqKSB4bWFsbG9jIChzLT5zY25oZHIuc19ubG5ubyAqIExJTkVTWik7Ci0KLQkgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmRzdCA9IGJ1ZmZlcjsKLQotCSAgLyogUnVuIHRocm91Z2ggdGhlIHRhYmxlIHdlJ3ZlIGJ1aWx0IGFuZCB0dXJuIGl0IGludG8gaXRzIGV4dGVybmFsCi0JIGZvcm0sIHRha2UgdGhpcyBjaGFuY2UgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgKi8KLQotCSAgZm9yIChsaW5lX3B0ciA9IHMtPmxpbmVub19saXN0X2hlYWQ7Ci0JICAgICAgIGxpbmVfcHRyICE9IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTDsKLQkgICAgICAgbGluZV9wdHIgPSBsaW5lX3B0ci0+bmV4dCkKLQkgICAgewotCi0JICAgICAgaWYgKGxpbmVfcHRyLT5saW5lLmxfbG5ubyA9PSAwKQotCQl7Ci0JCSAgLyogVHVybiBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgaW50byB0aGUgc3ltYm9scycgaW5kZXggKi8KLQkJICBsaW5lX3B0ci0+bGluZS5sX2FkZHIubF9zeW1uZHggPQotCQkgICAgKChzeW1ib2xTICopIGxpbmVfcHRyLT5saW5lLmxfYWRkci5sX3N5bW5keCktPnN5X251bWJlcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGxpbmVfcHRyLT5saW5lLmxfYWRkci5sX3BhZGRyICs9ICgoc3RydWN0IGZyYWcgKikgKGxpbmVfcHRyLT5mcmFnKSktPmZyX2FkZHJlc3M7Ci0JCX0KLQotCi0JICAgICAgKHZvaWQpIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJihsaW5lX3B0ci0+bGluZSksIGRzdCk7Ci0JICAgICAgZHN0Kys7Ci0KLQkgICAgfQotCi0JICBzLT5zY25oZHIuc19sbm5vcHRyID0gKmZpbGVfY3Vyc29yOwotCi0JICBiZmRfd3JpdGUgKGJ1ZmZlciwgMSwgcy0+c2NuaGRyLnNfbmxubm8gKiBMSU5FU1osIGFiZmQpOwotCSAgZnJlZSAoYnVmZmVyKTsKLQotCSAgKmZpbGVfY3Vyc29yICs9IHMtPnNjbmhkci5zX25sbm5vICogTElORVNaOwotCX0KLSAgICB9Ci0gIEhfU0VUX0xJTkVOT19TSVpFIChoLCAqZmlsZV9jdXJzb3IgLSBzdGFydCk7Ci19Ci0KLQotLyogTm93IHdlIHJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIGZyYWcgY2hhaW5zIGluIGEgc2VnbWVudCBhbmQKLSAgIG1ha2UgYWxsIHRoZSBzdWJzZWdtZW50IGZyYWdzIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZQotICAgbGlzdCwgYXMgaWYgdGhlIHNlZyAwIHdhcyBleHRyYSBsb25nICovCi0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfc3Vic2VncyAoKQotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGZyY2hhaW5TICpoZWFkID0gc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QOwotICAgICAgZnJhZ1MgZHVtbXk7Ci0gICAgICBmcmFnUyAqcHJldl9mcmFnID0gJmR1bW15OwotCi0gICAgICB3aGlsZSAoaGVhZCAmJiBoZWFkLT5mcmNoX3NlZyA9PSBpKQotCXsKLQkgIHByZXZfZnJhZy0+ZnJfbmV4dCA9IGhlYWQtPmZyY2hfcm9vdDsKLQkgIHByZXZfZnJhZyA9IGhlYWQtPmZyY2hfbGFzdDsKLQkgIGhlYWQgPSBoZWFkLT5mcmNoX25leHQ7Ci0JfQotICAgICAgcHJldl9mcmFnLT5mcl9uZXh0ID0gMDsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLWludCBjb2ZmX2ZsYWdzOwotZXh0ZXJuIHZvaWQKLXdyaXRlX29iamVjdF9maWxlICgpCi17Ci0gIGludCBpOwotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpbl9wdHI7Ci0KLSAgb2JqZWN0X2hlYWRlcnMgaGVhZGVyczsKLSAgdW5zaWduZWQgbG9uZyBmaWxlX2N1cnNvcjsKLSAgYmZkICphYmZkOwotICB1bnNpZ25lZCBpbnQgYWRkcjsKLSAgYWJmZCA9IGJmZF9vcGVudyAob3V0X2ZpbGVfbmFtZSwgVEFSR0VUX0ZPUk1BVCk7Ci0KLQotICBpZiAoYWJmZCA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBvdXRfZmlsZV9uYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBCRkRfQVJDSCwgbWFjaGluZSk7Ci0KLSAgc3RyaW5nX2J5dGVfY291bnQgPSA0OwotCi0gIGZvciAoZnJjaGFpbl9wdHIgPSBmcmNoYWluX3Jvb3Q7Ci0gICAgICAgZnJjaGFpbl9wdHIgIT0gKHN0cnVjdCBmcmNoYWluICopIE5VTEw7Ci0gICAgICAgZnJjaGFpbl9wdHIgPSBmcmNoYWluX3B0ci0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ViLXNlZ21lbnRzIGFuZCBhbGlnbiB0aGVtIHVwLiAgQWxzbwotCSBjbG9zZSBhbnkgb3BlbiBmcmFncy4gIFdlIHRhY2sgYSAuZmlsbCBvbnRvIHRoZSBlbmQgb2YgdGhlCi0JIGZyYWcgY2hhaW4gc28gdGhhdCBhbnkgLmFsaWduJ3Mgc2l6ZSBjYW4gYmUgd29ya2VkIGJ5IGxvb2tpbmcKLQkgYXQgdGhlIG5leHQgZnJhZy4gICovCi0KLSAgICAgIHN1YnNlZ19zZXQgKGZyY2hhaW5fcHRyLT5mcmNoX3NlZywgZnJjaGFpbl9wdHItPmZyY2hfc3Vic2VnKTsKLQotI2lmbmRlZiBTVUJfU0VHTUVOVF9BTElHTgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDEKLSNlbmRpZgotI2lmZGVmIG1kX2RvX2FsaWduCi0gICAgICBtZF9kb19hbGlnbiAoU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLCAoY2hhciAqKSBOVUxMLCAwLCAwLAotCQkgICBhbGlnbm1lbnRfZG9uZSk7Ci0jZW5kaWYKLSAgICAgIGZyYWdfYWxpZ24gKFNVQl9TRUdNRU5UX0FMSUdOIChub3dfc2VnKSwKLQkJICBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSA/IE5PUF9PUENPREUgOiAwLAotCQkgIDApOwotI2lmZGVmIG1kX2RvX2FsaWduCi0gICAgYWxpZ25tZW50X2RvbmU6Ci0jZW5kaWYKLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19ub3ctPmZyX2ZpeCA9IDA7Ci0gICAgICBrbm93IChmcmFnX25vdy0+ZnJfbmV4dCA9PSBOVUxMKTsKLSAgICB9Ci0KLQotICByZW1vdmVfc3Vic2VncyAoKTsKLQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgcmVsYXhfc2VnbWVudCAoc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3QsIGkpOwotICAgIH0KLQotICBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzLCAwKTsKLQotICAvKiBGaW5kIG91dCBob3cgYmlnIHRoZSBzZWN0aW9ucyBhcmUsIGFuZCBzZXQgdGhlIGFkZHJlc3Nlcy4gICovCi0gIGFkZHIgPSAwOwotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGxvbmcgc2l6ZTsKLQotICAgICAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX3BhZGRyID0gYWRkcjsKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc192YWRkciA9IGFkZHI7Ci0KLSAgICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzLAotCQkJCSAgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzKSArIDEpOwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQkgIC8qIFN1cHBvcnQgbG9uZyBzZWN0aW9uIG5hbWVzIGFzIGZvdW5kIGluIFBFLiAgVGhpcyBjb2RlCi0JICAgICBtdXN0IGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIGNvZmZfaGVhZGVyX2FwcGVuZCBhbmQKLQkgICAgIHdfc3RyaW5ncy4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSk7Ci0JICAgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBsZW4gKyAxOwotCSAgfQotI2VuZGlmIC8qIENPRkZfTE9OR19TRUNUSU9OX05BTUVTICovCi0JfQotCi0gICAgICBzaXplID0gc2l6ZV9zZWN0aW9uIChhYmZkLCAodW5zaWduZWQgaW50KSBpKTsKLSAgICAgIGFkZHIgKz0gc2l6ZTsKLQotICAgICAgLyogSSB0aGluayB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgaXMgb25seSB1c2VkIG9uIHRoZSBpOTYwOyB0aGUKLQkgaTk2MCBuZWVkcyBpdCwgYW5kIGl0IHNob3VsZCBkbyBubyBoYXJtIG9uIG90aGVyIHRhcmdldHMuICAqLwotI2lmZGVmIEFMSUdOTUVOVF9JTl9TX0ZMQUdTCi0gICAgICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfZmxhZ3MgfD0gKHNlY3Rpb25fYWxpZ25tZW50W2ldICYgMHhGKSA8PCA4OwotI2Vsc2UKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19hbGlnbiA9IDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbaV07Ci0jZW5kaWYKLQotICAgICAgaWYgKGkgPT0gU0VHX0UwKQotCUhfU0VUX1RFWFRfU0laRSAoJmhlYWRlcnMsIHNpemUpOwotICAgICAgZWxzZSBpZiAoaSA9PSBTRUdfRTEpCi0JSF9TRVRfREFUQV9TSVpFICgmaGVhZGVycywgc2l6ZSk7Ci0gICAgICBlbHNlIGlmIChpID09IFNFR19FMikKLQlIX1NFVF9CU1NfU0laRSAoJmhlYWRlcnMsIHNpemUpOwotICAgIH0KLQotICAvKiBUdXJuIHRoZSBnYXMgbmF0aXZlIHN5bWJvbCB0YWJsZSBzaGFwZSBpbnRvIGEgY29mZiBzeW1ib2wgdGFibGUgKi8KLSAgY3Jhd2xfc3ltYm9scyAoJmhlYWRlcnMsIGFiZmQpOwotCi0gIGlmIChzdHJpbmdfYnl0ZV9jb3VudCA9PSA0KQotICAgIHN0cmluZ19ieXRlX2NvdW50ID0gMDsKLQotICBIX1NFVF9TVFJJTkdfU0laRSAoJmhlYWRlcnMsIHN0cmluZ19ieXRlX2NvdW50KTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZQotICB0Y19mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGZpeHVwX21kZXBzIChzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdCwgJmhlYWRlcnMsIGkpOwotICAgICAgZml4dXBfc2VnbWVudCAoJnNlZ21lbnRfaW5mb1tpXSwgaSk7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yICIuc3RhYiIgc2VnbWVudHMgYW5kIGZpbGwgaW4gdGhlaXIgaW5pdGlhbCBzeW1ib2xzCi0gICAgIGNvcnJlY3RseS4gKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBuYW1lID0gc2VnbWVudF9pbmZvW2ldLm5hbWU7Ci0KLSAgICAgIGlmIChuYW1lICE9IE5VTEwKLQkgICYmIHN0cm5jbXAgKCIuc3RhYiIsIG5hbWUsIDUpID09IDAKLQkgICYmIHN0cm5jbXAgKCIuc3RhYnN0ciIsIG5hbWUsIDgpICE9IDApCi0JYWRqdXN0X3N0YWJfc2VjdGlvbiAoYWJmZCwgaSk7Ci0gICAgfQotCi0gIGZpbGVfY3Vyc29yID0gSF9HRVRfVEVYVF9GSUxFX09GRlNFVCAoJmhlYWRlcnMpOwotCi0gIGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGZpbGVfY3Vyc29yLCAwKTsKLQotICAvKiBQbGFudCB0aGUgZGF0YSAqLwotCi0gIGZpbGxfc2VjdGlvbiAoYWJmZCwgJmhlYWRlcnMsICZmaWxlX2N1cnNvcik7Ci0KLSAgZG9fcmVsb2NzX2ZvciAoYWJmZCwgJmhlYWRlcnMsICZmaWxlX2N1cnNvcik7Ci0KLSAgZG9fbGluZW5vc19mb3IgKGFiZmQsICZoZWFkZXJzLCAmZmlsZV9jdXJzb3IpOwotCi0gIEhfU0VUX0ZJTEVfTUFHSUNfTlVNQkVSICgmaGVhZGVycywgQ09GRl9NQUdJQyk7Ci0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QCi0gIEhfU0VUX1RJTUVfU1RBTVAgKCZoZWFkZXJzLCAobG9uZyl0aW1lKCh0aW1lX3QgKikwKSk7Ci0jZWxzZQotICBIX1NFVF9USU1FX1NUQU1QICgmaGVhZGVycywgMCk7Ci0jZW5kaWYKLSNpZmRlZiBUQ19DT0ZGX1NFVF9NQUNISU5FCi0gIFRDX0NPRkZfU0VUX01BQ0hJTkUgKCZoZWFkZXJzKTsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfRkxBR1MKLSNkZWZpbmUgQ09GRl9GTEFHUyAwCi0jZW5kaWYKLQotI2lmZGVmIEtFRVBfUkVMT0NfSU5GTwotICBIX1NFVF9GTEFHUyAoJmhlYWRlcnMsICgoSF9HRVRfTElORU5PX1NJWkUoJmhlYWRlcnMpID8gMCA6IEZfTE5OTykgfAotCQkJICBDT0ZGX0ZMQUdTIHwgY29mZl9mbGFncykpOwotI2Vsc2UKLSAgSF9TRVRfRkxBR1MgKCZoZWFkZXJzLCAoKEhfR0VUX0xJTkVOT19TSVpFKCZoZWFkZXJzKSAgICAgPyAwIDogRl9MTk5PKSAgIHwKLQkJCSAgKEhfR0VUX1JFTE9DQVRJT05fU0laRSgmaGVhZGVycykgPyAwIDogRl9SRUxGTEcpIHwKLQkJCSAgQ09GRl9GTEFHUyB8IGNvZmZfZmxhZ3MpKTsKLSNlbmRpZgotCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc3ltdGFibGVfc2l6ZSA9IEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFICgmaGVhZGVycyk7Ci0gICAgY2hhciAqYnVmZmVyMSA9IHhtYWxsb2MgKHN5bXRhYmxlX3NpemUgKyBzdHJpbmdfYnl0ZV9jb3VudCArIDEpOwotCi0gICAgSF9TRVRfU1lNQk9MX1RBQkxFX1BPSU5URVIgKCZoZWFkZXJzLCBiZmRfdGVsbCAoYWJmZCkpOwotICAgIHdfc3ltYm9scyAoYWJmZCwgYnVmZmVyMSwgc3ltYm9sX3Jvb3RQKTsKLSAgICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPiAwKQotICAgICAgd19zdHJpbmdzIChidWZmZXIxICsgc3ltdGFibGVfc2l6ZSk7Ci0gICAgYmZkX3dyaXRlIChidWZmZXIxLCAxLCBzeW10YWJsZV9zaXplICsgc3RyaW5nX2J5dGVfY291bnQsIGFiZmQpOwotICAgIGZyZWUgKGJ1ZmZlcjEpOwotICB9Ci0KLSAgY29mZl9oZWFkZXJfYXBwZW5kIChhYmZkLCAmaGVhZGVycyk7Ci0jaWYgMAotICAvKiBSZWNlbnQgY2hhbmdlcyB0byB3cml0ZSBuZWVkIHRoaXMsIGJ1dCB3aGVyZSBpdCBzaG91bGQKLSAgICAgZ28gaXMgdXAgdG8gS2VuLi4gKi8KLSAgaWYgKGJmZF9jbG9zZV9hbGxfZG9uZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgYXNfZmF0YWwgKF8oIkNhbid0IGNsb3NlICVzOiAlcyIpLCBvdXRfZmlsZV9uYW1lLAotCSAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSNlbHNlCi0gIHsKLSAgICBleHRlcm4gYmZkICpzdGRvdXRwdXQ7Ci0gICAgc3Rkb3V0cHV0ID0gYWJmZDsKLSAgfQotI2VuZGlmCi0KLX0KLQotLyogQWRkIGEgbmV3IHNlZ21lbnQuICBUaGlzIGlzIGNhbGxlZCBmcm9tIHN1YnNlZ19uZXcgdmlhIHRoZQotICAgb2JqX25ld19zZWdtZW50IG1hY3JvLiAgKi8KLQotc2VnVAotb2JqX2NvZmZfYWRkX3NlZ21lbnQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jaWZuZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIGNoYXIgYnVmW1NDTk5NTEVOICsgMV07Ci0KLSAgc3RybmNweSAoYnVmLCBuYW1lLCBTQ05OTUxFTik7Ci0gIGJ1ZltTQ05OTUxFTl0gPSAnXDAnOwotICBuYW1lID0gYnVmOwotI2VuZGlmCi0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1QgJiYgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF07IGkrKykKLSAgICBpZiAoc3RyY21wIChuYW1lLCBzZWdtZW50X2luZm9baV0ubmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiAoc2VnVCkgaTsKLQotICBpZiAoaSA9PSBTRUdfTEFTVCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlRvbyBtYW55IG5ldyBzZWN0aW9uczsgY2FuJ3QgYWRkIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgIHJldHVybiBub3dfc2VnOwotICAgIH0KLQotICAvKiBBZGQgYSBuZXcgc2VjdGlvbi4gICovCi0gIHN0cm5jcHkgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lLCBuYW1lLAotCSAgIHNpemVvZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWUpKTsKLSAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX2ZsYWdzID0gU1RZUF9SRUc7Ci0gIHNlZ21lbnRfaW5mb1tpXS5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgcmV0dXJuIChzZWdUKSBpOwotfQotCi0vKgotICogaW1wbGVtZW50IHRoZSAuc2VjdGlvbiBwc2V1ZG8gb3A6Ci0gKgkuc2VjdGlvbiBuYW1lIHssICJmbGFncyJ9Ci0gKiAgICAgICAgICAgICAgICBeICAgICAgICAgXgotICogICAgICAgICAgICAgICAgfCAgICAgICAgICstLS0gb3B0aW9uYWwgZmxhZ3M6ICdiJyBmb3IgYnNzCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGZvciBpbmZvCi0gKiAgICAgICAgICAgICAgICArLS0gc2VjdGlvbiBuYW1lICAgICAgICAgICAgICAgJ2wnIGZvciBsaWIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicgZm9yIG5vbG9hZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJyBmb3Igb3ZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JyBmb3IgZGF0YQotICoJCQkJCQkgJ2QnIChhcHBhcmVudGx5IG04OGsgZm9yIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnIGZvciB0ZXh0Ci0gKgkJCQkJCSAncicgZm9yIHJlYWQtb25seSBkYXRhCi0gKiBCdXQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHF1b3RlZCBzdHJpbmcsIHRyZWF0IGl0IGFzIGEKLSAqIHN1YnNlZ21lbnQgbnVtYmVyLgotICovCi0KLXZvaWQKLW9ial9jb2ZmX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWUsICpuYW1lOwotICBjaGFyIGM7Ci0gIHVuc2lnbmVkIGludCBleHA7Ci0gIGxvbmcgZmxhZ3M7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGNoYXIgdHlwZTsKLQotICAgICAgc19tcmlfc2VjdCAoJnR5cGUpOwotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKHR5cGUgPT0gJ0MnKQotCWZsYWdzID0gU1RZUF9URVhUOwotICAgICAgZWxzZSBpZiAodHlwZSA9PSAnRCcpCi0JZmxhZ3MgPSBTVFlQX0RBVEE7Ci0gICAgICBzZWdtZW50X2luZm9bbm93X3NlZ10uc2NuaGRyLnNfZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2VjdGlvbl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHNlY3Rpb25fbmFtZSArIDEpOwotICBzdHJjcHkgKG5hbWUsIHNlY3Rpb25fbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgZXhwID0gMDsKLSAgZmxhZ3MgPSAwOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKLQkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCQl7Ci0JCWNhc2UgJ2InOiBmbGFncyB8PSBTVFlQX0JTUzsgICAgYnJlYWs7Ci0JCWNhc2UgJ2knOiBmbGFncyB8PSBTVFlQX0lORk87ICAgYnJlYWs7Ci0JCWNhc2UgJ2wnOiBmbGFncyB8PSBTVFlQX0xJQjsgICAgYnJlYWs7Ci0JCWNhc2UgJ24nOiBmbGFncyB8PSBTVFlQX05PTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ28nOiBmbGFncyB8PSBTVFlQX09WRVI7ICAgYnJlYWs7Ci0JCWNhc2UgJ2QnOgotCQljYXNlICd3JzogZmxhZ3MgfD0gU1RZUF9EQVRBOyAgIGJyZWFrOwotCQljYXNlICd4JzogZmxhZ3MgfD0gU1RZUF9URVhUOyAgIGJyZWFrOwotCQljYXNlICdyJzogZmxhZ3MgfD0gU1RZUF9MSVQ7CWJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFzX3dhcm4oXygidW5rbm93biBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIiksCi0JCQkgICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICciJykKLQkgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotICBzdWJzZWdfbmV3IChuYW1lLCAoc3Vic2VnVCkgZXhwKTsKLQotICBzZWdtZW50X2luZm9bbm93X3NlZ10uc2NuaGRyLnNfZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGV4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN1YnNlZ19uZXcgKCIudGV4dCIsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICBzdWJzZWdfbmV3ICgiLnRleHQiLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSArIDEwMDApOwotICBlbHNlCi0gICAgc3Vic2VnX25ldyAoIi5kYXRhIiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfaWRlbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsJCS8qIHNhdmUgY3VycmVudCBzZWcJKi8KLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19uZXcgKCIuY29tbWVudCIsIDApOwkJLyogLmNvbW1lbnQgc2VnCQkqLwotICBzdHJpbmdlciAoMSk7CQkJCS8qIHJlYWQgc3RyaW5nCQkqLwotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwkvKiByZXN0b3JlIGN1cnJlbnQgc2VnCSovCi19Ci0KLXZvaWQKLWNfc3ltYm9sX21lcmdlIChkZWJ1Zywgbm9ybWFsKQotICAgICBzeW1ib2xTICpkZWJ1ZzsKLSAgICAgc3ltYm9sUyAqbm9ybWFsOwotewotICBTX1NFVF9EQVRBX1RZUEUgKG5vcm1hbCwgU19HRVRfREFUQV9UWVBFIChkZWJ1ZykpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChub3JtYWwsIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlYnVnKSk7Ci0KLSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCkpCi0gICAgewotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAobm9ybWFsLCBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykpOwotICAgIH0JCQkJLyogdGFrZSB0aGUgbW9zdCB3ZSBoYXZlICovCi0KLSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IDApCi0gICAgewotICAgICAgbWVtY3B5ICgoY2hhciAqKSAmbm9ybWFsLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXSwKLQkgICAgICAoY2hhciAqKSAmZGVidWctPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLAotCSAgICAgICh1bnNpZ25lZCBpbnQpIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgKiBBVVhFU1opKTsKLSAgICB9CQkJCS8qIE1vdmUgYWxsIHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gKi8KLQotICAvKiBNb3ZlIHRoZSBkZWJ1ZyBmbGFncy4gKi8KLSAgU0ZfU0VUX0RFQlVHX0ZJRUxEIChub3JtYWwsIFNGX0dFVF9ERUJVR19GSUVMRCAoZGVidWcpKTsKLX0JCQkJLyogY19zeW1ib2xfbWVyZ2UoKSAqLwotCi1zdGF0aWMgaW50Ci1jX2xpbmVfbmV3IChzeW1ib2wsIHBhZGRyLCBsaW5lX251bWJlciwgZnJhZykKLSAgICAgc3ltYm9sUyAqIHN5bWJvbDsKLSAgICAgbG9uZyBwYWRkcjsKLSAgICAgaW50IGxpbmVfbnVtYmVyOwotICAgICBmcmFnUyAqIGZyYWc7Ci17Ci0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbmV3X2xpbmUgPQotICAoc3RydWN0IGxpbmVub19saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxpbmVub19saXN0KSk7Ci0KLSAgc2VnbWVudF9pbmZvX3R5cGUgKnMgPSBzZWdtZW50X2luZm8gKyBub3dfc2VnOwotICBuZXdfbGluZS0+bGluZS5sX2xubm8gPSBsaW5lX251bWJlcjsKLQotICBpZiAobGluZV9udW1iZXIgPT0gMCkKLSAgICB7Ci0gICAgICBsYXN0X2xpbmVfc3ltYm9sID0gc3ltYm9sOwotICAgICAgbmV3X2xpbmUtPmxpbmUubF9hZGRyLmxfc3ltbmR4ID0gKGxvbmcpIHN5bWJvbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXdfbGluZS0+bGluZS5sX2FkZHIubF9wYWRkciA9IHBhZGRyOwotICAgIH0KLQotICBuZXdfbGluZS0+ZnJhZyA9IChjaGFyICopIGZyYWc7Ci0gIG5ld19saW5lLT5uZXh0ID0gKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSBOVUxMOwotCi0KLSAgaWYgKHMtPmxpbmVub19saXN0X2hlYWQgPT0gKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHMtPmxpbmVub19saXN0X2hlYWQgPSBuZXdfbGluZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzLT5saW5lbm9fbGlzdF90YWlsLT5uZXh0ID0gbmV3X2xpbmU7Ci0gICAgfQotICBzLT5saW5lbm9fbGlzdF90YWlsID0gbmV3X2xpbmU7Ci0gIHJldHVybiBMSU5FU1ogKiBzLT5zY25oZHIuc19ubG5ubysrOwotfQotCi12b2lkCi1jX2RvdF9maWxlX3N5bWJvbCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfbmV3ICgiLmZpbGUiLAotCQkJU0VHX0RFQlVHLAotCQkJMCwKLQkJCSZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19GSUxFKTsKLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMSk7Ci0KLSAgaWYgKHN0cmxlbiAoZmlsZW5hbWUpID4gRklMTk1MRU4pCi0gICAgewotICAgICAgLyogRmlsZW5hbWUgaXMgdG9vIGxvbmcgdG8gZml0IGludG8gYW4gYXV4ZW50LAotCSB3ZSBzdGljayBpdCBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaW5zdGVhZC4gIFdlIGtlZXAKLQkgYSBsaW5rZWQgbGlzdCBvZiB0aGUgZmlsZW5hbWVzIHdlIGZpbmQgc28gd2UgY2FuIGVtaXQKLQkgdGhlbSBsYXRlci4qLwotICAgICAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmYgPSAoKHN0cnVjdCBmaWxlbmFtZV9saXN0ICopCi0JCQkJIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVuYW1lX2xpc3QpKSk7Ci0KLSAgICAgIGYtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgICBmLT5uZXh0ID0gMDsKLQotICAgICAgU0FfU0VUX0ZJTEVfRk5BTUVfWkVST1MgKHN5bWJvbFAsIDApOwotICAgICAgU0FfU0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQLCAxKTsKLQotICAgICAgaWYgKGZpbGVuYW1lX2xpc3RfdGFpbCkgCi0JZmlsZW5hbWVfbGlzdF90YWlsLT5uZXh0ID0gZjsKLSAgICAgIGVsc2UKLQlmaWxlbmFtZV9saXN0X2hlYWQgPSBmOwotICAgICAgZmlsZW5hbWVfbGlzdF90YWlsID0gZjsgICAgICAKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgU0FfU0VUX0ZJTEVfRk5BTUUgKHN5bWJvbFAsIGZpbGVuYW1lKTsKLSAgICB9Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlsaXN0aW5nX3NvdXJjZV9maWxlIChmaWxlbmFtZSk7Ci0gICAgICB9Ci0KLSAgfQotCi0jZW5kaWYKLSAgU0ZfU0VUX0RFQlVHIChzeW1ib2xQKTsKLSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHByZXZpb3VzX2ZpbGVfc3ltYm9sKTsKLQotICBwcmV2aW91c19maWxlX3N5bWJvbCA9IHN5bWJvbFA7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bWJvbCBpcyBmaXJzdCBvbiB0aGUgc3ltYm9sIGNoYWluICovCi0gIGlmIChzeW1ib2xfcm9vdFAgIT0gc3ltYm9sUCkKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9pbnNlcnQgKHN5bWJvbFAsIHN5bWJvbF9yb290UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQotfQkJCQkvKiBjX2RvdF9maWxlX3N5bWJvbCgpICovCi0KLS8qCi0gKiBCdWlsZCBhICdzZWN0aW9uIHN0YXRpYycgc3ltYm9sLgotICovCi0KLXN5bWJvbFMgKgotY19zZWN0aW9uX3N5bWJvbCAobmFtZSwgaWR4KQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgaWR4OwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChuYW1lLCBET19OT1RfU1RSSVApOwotICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCBpZHgsIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBNbW1tLiAgSSBqdXN0IGxvdmUgdmlvbGF0aW5nIGludGVyZmFjZXMuICBNYWtlcyBtZSBmZWVsLi4uZGlydHkuICAqLwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgaWR4KTsKLSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgfQotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU1RBVCk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOwotCi0gIFNGX1NFVF9TVEFUSUNTIChzeW1ib2xQKTsKLQotI2lmZGVmIFRFX0RFTFRBCi0gIC8qIG1hbmZyZWRAcy1kaXJla3RuZXQuZGU6IHNlY3Rpb24gc3ltYm9scyAqbXVzdCogaGF2ZSB0aGUgTE9DQUwgYml0IGNsZWFyZWQsCi0gICAgIHdoaWNoIGlzIHNldCBieSB0aGUgbmV3IGRlZmluaXRpb24gb2YgTE9DQUxfTEFCRUwgaW4gdGMtbTY4ay5oLiAgKi8KLSAgU0ZfQ0xFQVJfTE9DQUwgKHN5bWJvbFApOwotI2VuZGlmCi0jaWZkZWYgVEVfUEUKLSAgLyogSWYgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3Agd2FzIHVzZWQgZm9yIHRoaXMgc2VjdGlvbiwgd2UgbXVzdAotICAgICBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGF1eGlsaWFyeSBlbnRyeSBmb3IgdGhlIHNlY3Rpb24KLSAgICAgc3ltYm9sLiAgKi8KLSAgaWYgKHNlZ21lbnRfaW5mb1tpZHhdLmxpbmtvbmNlICE9IExJTktPTkNFX1VOU0VUKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICBzd2l0Y2ggKHNlZ21lbnRfaW5mb1tpZHhdLmxpbmtvbmNlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBMSU5LT05DRV9ESVNDQVJEOgotCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZOwotCSAgYnJlYWs7Ci0JY2FzZSBMSU5LT05DRV9PTkVfT05MWToKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzsKLQkgIGJyZWFrOwotCWNhc2UgTElOS09OQ0VfU0FNRV9TSVpFOgotCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfU0FNRV9TSVpFOwotCSAgYnJlYWs7Ci0JY2FzZSBMSU5LT05DRV9TQU1FX0NPTlRFTlRTOgotCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0g7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIFNZTV9BVVhFTlQgKHN5bWJvbFApLT54X3Njbi54X2NvbWRhdCA9IHR5cGU7Ci0gICAgfQotI2VuZGlmIC8qIFRFX1BFICovCi0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19CQkJCS8qIGNfc2VjdGlvbl9zeW1ib2woKSAqLwotCi1zdGF0aWMgdm9pZAotd19zeW1ib2xzIChhYmZkLCB3aGVyZSwgc3ltYm9sX3Jvb3RQKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3ltYm9sUyAqIHN5bWJvbF9yb290UDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogRmlyc3QgZmlsbCBpbiB0aG9zZSB2YWx1ZXMgd2UgaGF2ZSBvbmx5IGp1c3Qgd29ya2VkIG91dCAqLwotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzZWdtZW50X2luZm9baV0uZG90OwotICAgICAgaWYgKHN5bWJvbFApCi0JewotCSAgU0FfU0VUX1NDTl9TQ05MRU4gKHN5bWJvbFAsIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19zaXplKTsKLQkgIFNBX1NFVF9TQ05fTlJFTE9DIChzeW1ib2xQLCBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbnJlbG9jKTsKLQkgIFNBX1NFVF9TQ05fTkxJTk5PIChzeW1ib2xQLCBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmxubm8pOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICAgKiBFbWl0IGFsbCBzeW1ib2xzIGxlZnQgaW4gdGhlIHN5bWJvbCBjaGFpbi4KLSAgICAgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIFVzZWQgdG8gc2F2ZSB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lLiBJdCBpcyB1c2VkIHRvIHBvaW50Ci0JICAgICAgIHRvIHRoZSBzdHJpbmcgaW4gbWVtb3J5IGJ1dCBtdXN0IGJlIGEgZmlsZSBvZmZzZXQuICovCi0gICAgICByZWdpc3RlciBjaGFyICp0ZW1wOwotCi0gICAgICAvKiBXZSBjYW4ndCBmaXggdGhlIGxubm9wdHIgZmllbGQgaW4geWFua19zeW1ib2xzIHdpdGggdGhlIG90aGVyCi0gICAgICAgICBhZGp1c3RtZW50cywgYmVjYXVzZSB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgd2Uga25vdyB3aGVyZSB0aGV5Ci0gICAgICAgICBnbyBpbiB0aGUgZmlsZS4gICovCi0gICAgICBpZiAoU0ZfR0VUX0FESl9MTk5PUFRSIChzeW1ib2xQKSkKLQl7Ci0JICBTQV9HRVRfU1lNX0xOTk9QVFIgKHN5bWJvbFApICs9Ci0JICAgIHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xQKV0uc2NuaGRyLnNfbG5ub3B0cjsKLQl9Ci0KLSAgICAgIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoc3ltYm9sUCk7Ci0KLSAgICAgIHRlbXAgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HIChzeW1ib2xQKSkKLQl7Ci0JICBTX1NFVF9PRkZTRVQgKHN5bWJvbFAsIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0KTsKLQkgIFNfU0VUX1pFUk9FUyAoc3ltYm9sUCwgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbXNldCAoc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX25hbWUsIDAsIFNZTU5NTEVOKTsKLQkgIHN0cm5jcHkgKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl9uYW1lLCB0ZW1wLCBTWU1OTUxFTik7Ci0JfQotICAgICAgd2hlcmUgPSBzeW1ib2xfdG9fY2hhcnMgKGFiZmQsIHdoZXJlLCBzeW1ib2xQKTsKLSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsIHRlbXApOwotICAgIH0KLQotfQkJCQkvKiB3X3N5bWJvbHMoKSAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfbGNvbW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzX2xjb21tKDApOwotICByZXR1cm47Ci0jaWYgMAotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGludCB0ZW1wOwotICBjaGFyICpwOwotCi0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oImxjb21tIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAwOwotCi0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlKG5hbWUpOwotCi0gIGlmIChTX0dFVF9TRUdNRU5UKHN5bWJvbFApID09IFNFR19VTktOT1dOICYmCi0gICAgICBTX0dFVF9WQUxVRShzeW1ib2xQKSA9PSAwKQotICAgIHsKLSAgICAgIGlmICghIG5lZWRfcGFzc18yKQotCXsKLQkgIGNoYXIgKnA7Ci0JICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsgCS8qIHNhdmUgY3VycmVudCBzZWcgICAgICovCi0JICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotCSAgc3Vic2VnX3NldCAoU0VHX0UyLCAxKTsKLQkgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLQkgIHAgPSBmcmFnX3Zhcihyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpMCwgc3ltYm9sUCwKLQkJICAgICAgIChvZmZzZXRUKSB0ZW1wLCAoY2hhciAqKSAwKTsKLQkgICpwID0gMDsKLQkgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7IC8qIHJlc3RvcmUgY3VycmVudCBzZWcgKi8KLQkgIFNfU0VUX1NFR01FTlQoc3ltYm9sUCwgU0VHX0UyKTsKLQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1Moc3ltYm9sUCwgQ19TVEFUKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQiKSwgbmFtZSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1maXh1cF9tZGVwcyAoZnJhZ3MsIGgsIHRoaXNfc2VnbWVudCkKLSAgICAgZnJhZ1MgKiBmcmFnczsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOwotICAgICBzZWdUIHRoaXNfc2VnbWVudDsKLXsKLSAgc3Vic2VnX2NoYW5nZSAodGhpc19zZWdtZW50LCAwKTsKLSAgd2hpbGUgKGZyYWdzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZnJhZ3MtPmZyX3R5cGUpCi0JewotCWNhc2UgcnNfYWxpZ246Ci0JY2FzZSByc19hbGlnbl9jb2RlOgotCWNhc2UgcnNfb3JnOgotI2lmZGVmIEhBTkRMRV9BTElHTgotCSAgSEFORExFX0FMSUdOIChmcmFncyk7Ci0jZW5kaWYKLQkgIGZyYWdzLT5mcl90eXBlID0gcnNfZmlsbDsKLQkgIGZyYWdzLT5mcl9vZmZzZXQgPQotCSAgICAoKGZyYWdzLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ3MtPmZyX2FkZHJlc3MgLSBmcmFncy0+ZnJfZml4KQotCSAgICAgLyBmcmFncy0+ZnJfdmFyKTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBtZF9jb252ZXJ0X2ZyYWcgKGgsIHRoaXNfc2VnbWVudCwgZnJhZ3MpOwotCSAgZnJhZ193YW5lIChmcmFncyk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgOwotCX0KLSAgICAgIGZyYWdzID0gZnJhZ3MtPmZyX25leHQ7Ci0gICAgfQotfQotCi0jaWYgMQotCi0jaWZuZGVmIFRDX0ZPUkNFX1JFTE9DQVRJT04KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIDAKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotZml4dXBfc2VnbWVudCAoc2VnUCwgdGhpc19zZWdtZW50X3R5cGUpCi0gICAgIHNlZ21lbnRfaW5mb190eXBlICogc2VnUDsKLSAgICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZTsKLXsKLSAgcmVnaXN0ZXIgZml4UyAqIGZpeFA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKmFkZF9zeW1ib2xQOwotICByZWdpc3RlciBzeW1ib2xTICpzdWJfc3ltYm9sUDsKLSAgbG9uZyBhZGRfbnVtYmVyOwotICByZWdpc3RlciBpbnQgc2l6ZTsKLSAgcmVnaXN0ZXIgY2hhciAqcGxhY2U7Ci0gIHJlZ2lzdGVyIGxvbmcgd2hlcmU7Ci0gIHJlZ2lzdGVyIGNoYXIgcGNyZWw7Ci0gIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgcmVnaXN0ZXIgc2VnVCBhZGRfc3ltYm9sX3NlZ21lbnQgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCi0gIGZvciAoZml4UCA9IHNlZ1AtPmZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBmcmFnUCA9IGZpeFAtPmZ4X2ZyYWc7Ci0gICAgICBrbm93IChmcmFnUCk7Ci0gICAgICB3aGVyZSA9IGZpeFAtPmZ4X3doZXJlOwotICAgICAgcGxhY2UgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOwotICAgICAgc2l6ZSA9IGZpeFAtPmZ4X3NpemU7Ci0gICAgICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5OwotICAgICAgc3ViX3N5bWJvbFAgPSBmaXhQLT5meF9zdWJzeTsKLSAgICAgIGFkZF9udW1iZXIgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBwY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOwotCi0gICAgICAvKiBXZSB3YW50IGZ1bmN0aW9uLXJlbGF0aXZlIHN0YWJzIHRvIHdvcmsgb24gc3lzdGVtcyB3aGljaAotCSBtYXkgdXNlIGEgcmVsYXhpbmcgbGlua2VyOyB0aHVzIHdlIG11c3QgaGFuZGxlIHRoZSBzeW0xLXN5bTIKLQkgZml4dXBzIGZ1bmN0aW9uLXJlbGF0aXZlIHN0YWJzIGdlbmVyYXRlcy4KLQotCSBPZiBjb3Vyc2UsIGlmIHlvdSBhY3R1YWxseSBlbmFibGUgcmVsYXhpbmcgaW4gdGhlIGxpbmtlciwgdGhlCi0JIGxpbmUgYW5kIGJsb2NrIHNjb3BpbmcgaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gYmUgaW5jb3JyZWN0Ci0JIGluIHNvbWUgY2FzZXMuICBUaGUgb25seSB3YXkgdG8gcmVhbGx5IGZpeCB0aGlzIGlzIHRvIHN1cHBvcnQKLQkgYSByZWxvYyBpbnZvbHZpbmcgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGxpbmtyZWxheAotCSAgJiYgKCFzdWJfc3ltYm9sUCB8fCBwY3JlbCkpCi0JY29udGludWU7Ci0KLSNpZmRlZiBUQ19JOTYwCi0gICAgICBpZiAoZml4UC0+ZnhfdGNiaXQgJiYgU0ZfR0VUX0NBTExOQU1FIChhZGRfc3ltYm9sUCkpCi0JewotCSAgLyogUmVsb2NhdGlvbiBzaG91bGQgYmUgZG9uZSB2aWEgdGhlIGFzc29jaWF0ZWQgJ2JhbCcgZW50cnkKLQkgICAgIHBvaW50IHN5bWJvbC4gKi8KLQotCSAgaWYgKCFTRl9HRVRfQkFMTkFNRSAodGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgIF8oIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIpLAotCQkJICAgIFNfR0VUX05BTUUgKGFkZF9zeW1ib2xQKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFAgPSB0Y19nZXRfYmFsX29mX2NhbGwgKGFkZF9zeW1ib2xQKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2xzIGhhdmUgYmVlbiByZXNvbHZlZDsgdGhpcyBtYXkgbm90IGhhdmUKLSAgICAgICAgIGhhcHBlbmVkIGlmIHRoZXNlIGFyZSBleHByZXNzaW9uIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwgJiYgISBhZGRfc3ltYm9sUC0+c3lfcmVzb2x2ZWQpCi0JcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGFkZF9zeW1ib2xQLCAxKTsKLQotICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwpCi0JewotCSAgLyogSWYgdGhpcyBmaXh1cCBpcyBhZ2FpbnN0IGEgc3ltYm9sIHdoaWNoIGhhcyBiZWVuIGVxdWF0ZWQKLQkgICAgIHRvIGFub3RoZXIgc3ltYm9sLCBjb252ZXJ0IGl0IHRvIHRoZSBvdGhlciBzeW1ib2wuICAqLwotCSAgaWYgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChhZGRfc3ltYm9sUCkKLQkJICB8fCBTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKSkKLQkgICAgewotCSAgICAgIHdoaWxlIChhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoYWRkX3N5bWJvbFApCi0JCQkgfHwgU19JU19DT01NT04gKGFkZF9zeW1ib2xQKSkpCi0JCXsKLQkJICBzeW1ib2xTICpuOwotCi0JCSAgLyogV2UgbXVzdCBhdm9pZCBsb29waW5nLCBhcyB0aGF0IGNhbiBvY2N1ciB3aXRoIGEKLQkJICAgICBiYWRseSB3cml0dGVuIHByb2dyYW0uICAqLwotCQkgIG4gPSBhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotCQkgIGlmIChuID09IGFkZF9zeW1ib2xQKQotCQkgICAgYnJlYWs7Ci0JCSAgYWRkX251bWJlciArPSBhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotCQkgIGFkZF9zeW1ib2xQID0gbjsKLQkJfQotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFA7Ci0JICAgICAgZml4UC0+Znhfb2Zmc2V0ID0gYWRkX251bWJlcjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHN1Yl9zeW1ib2xQICE9IE5VTEwgJiYgISBzdWJfc3ltYm9sUC0+c3lfcmVzb2x2ZWQpCi0JcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN1Yl9zeW1ib2xQLCAxKTsKLQotICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwKLQkgICYmIGFkZF9zeW1ib2xQLT5zeV9tcmlfY29tbW9uKQotCXsKLQkgIGtub3cgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sKTsKLQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgIGZpeFAtPmZ4X29mZnNldCA9IGFkZF9udW1iZXI7Ci0JICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQl9Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCkKLQl7Ci0JICBhZGRfc3ltYm9sX3NlZ21lbnQgPSBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCk7Ci0JfQkJCS8qIGlmIHRoZXJlIGlzIGFuIGFkZGVuZCAqLwotCi0gICAgICBpZiAoc3ViX3N5bWJvbFApCi0JewotCSAgaWYgKGFkZF9zeW1ib2xQID09IE5VTEwgfHwgYWRkX3N5bWJvbF9zZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCkKLQkJewotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkJICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBJdCdzIGp1c3QgLXN5bS4gICovCi0JICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCQl7Ci0JCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLQkJICBmaXhQLT5meF9kb25lID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotI2lmbmRlZiBUQ19NNjhLCi0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oIk5lZ2F0aXZlIG9mIG5vbi1hYnNvbHV0ZSBzeW1ib2wgJXMiKSwKLQkJCQlTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCkpOwotI2VuZGlmCi0JCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCQl9CQkvKiBub3QgYWJzb2x1dGUgKi8KLQotCSAgICAgIC8qIGlmIHN1Yl9zeW1ib2wgaXMgaW4gdGhlIHNhbWUgc2VnbWVudCB0aGF0IGFkZF9zeW1ib2wKLQkJIGFuZCBhZGRfc3ltYm9sIGlzIGVpdGhlciBpbiBEQVRBLCBURVhULCBCU1Mgb3IgQUJTT0xVVEUgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFkZF9zeW1ib2xfc2VnbWVudAotCQkgICAmJiBTRUdfTk9STUFMIChhZGRfc3ltYm9sX3NlZ21lbnQpKQotCSAgICB7Ci0JICAgICAgLyogRGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMgZnJvbSBzYW1lIHNlZ21lbnQuICBDYW4ndAotCQkgbWFrZSBkaWZmZXJlbmNlIG9mIDIgdW5kZWZpbmVkczogJ3ZhbHVlJyBtZWFucwotCQkgc29tZXRoaW5nIGRpZmZlcmVudCBmb3IgTl9VTkRGLiAqLwotI2lmZGVmIFRDX0k5NjAKLQkgICAgICAvKiBNYWtlcyBubyBzZW5zZSB0byB1c2UgdGhlIGRpZmZlcmVuY2Ugb2YgMiBhcmJpdHJhcnkgc3ltYm9scwotCSAgICAgICAgIGFzIHRoZSB0YXJnZXQgb2YgYSBjYWxsIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZml4UC0+ZnhfdGNiaXQpCi0JCXsKLQkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJXygiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMiKSk7Ci0JCX0KLSNlbmRpZiAvKiBUQ19JOTYwICovCi0JICAgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApIC0KLQkJU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkgICAgICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0KLQkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQotCQl7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gTlVMTDsKLQkJICBmaXhQLT5meF9kb25lID0gMTsKLSNpZmRlZiBUQ19NNjhLIC8qIGlzIHRoaXMgcmlnaHQ/ICovCi0JCSAgcGNyZWwgPSAwOwotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMDsKLSNlbmRpZgotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIERpZmZlcmVudCBzZWdtZW50cyBpbiBzdWJ0cmFjdGlvbi4gKi8KLQkgICAgICBrbm93ICghKFNfSVNfRVhURVJOQUwgKHN1Yl9zeW1ib2xQKSAmJiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKSk7Ci0KLQkgICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLQkJewotCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkJfQotI2lmZGVmIERJRkZfRVhQUl9PSwotCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSB0aGlzX3NlZ21lbnRfdHlwZQotI2lmIDAgLyogT2theSBmb3IgNjhrLCBhdCBsZWFzdC4uLiAqLwotCQkgICAgICAgJiYgIXBjcmVsCi0jZW5kaWYKLQkJICAgICAgICkKLQkJewotCQkgIC8qIE1ha2UgaXQgcGMtcmVsYXRpdmUuICAqLwotCQkgIGFkZF9udW1iZXIgKz0gKG1kX3BjcmVsX2Zyb20gKGZpeFApCi0JCQkJIC0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKSk7Ci0JCSAgcGNyZWwgPSAxOwotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMTsKLQkJICBzdWJfc3ltYm9sUCA9IDA7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSAwOwotCQl9Ci0jZW5kaWYKLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJXygiQ2FuJ3QgZW1pdCByZWxvYyB7LSAlcy1zZWcgc3ltYm9sIFwiJXNcIn0gQCBmaWxlIGFkZHJlc3MgJWxkLiIpLAotCQkJCXNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApKSwKLQkJCQlTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCksCi0JCQkJKGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7Ci0JCX0JCS8qIGlmIGFic29sdXRlICovCi0JICAgIH0KLQl9CQkJLyogaWYgc3ViX3N5bWJvbFAgKi8KLQotICAgICAgaWYgKGFkZF9zeW1ib2xQKQotCXsKLQkgIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gdGhpc19zZWdtZW50X3R5cGUgJiYgcGNyZWwpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIFRoaXMgZml4dXAgd2FzIG1hZGUgd2hlbiB0aGUgc3ltYm9sJ3Mgc2VnbWVudCB3YXMKLQkgICAgICAgKiBTRUdfVU5LTk9XTiwgYnV0IGl0IGlzIG5vdyBpbiB0aGUgbG9jYWwgc2VnbWVudC4KLQkgICAgICAgKiBTbyB3ZSBrbm93IGhvdyB0byBkbyB0aGUgYWRkcmVzcyB3aXRob3V0IHJlbG9jYXRpb24uCi0JICAgICAgICovCi0jaWZkZWYgVENfSTk2MAotCSAgICAgIC8qIHJlbG9jX2NhbGxqKCkgbWF5IHJlcGxhY2UgYSAnY2FsbCcgd2l0aCBhICdjYWxscycgb3IgYSAnYmFsJywKLQkgICAgICAgKiBpbiB3aGljaCBjYXNlcyBpdCBtb2RpZmllcyAqZml4UCBhcyBhcHByb3ByaWF0ZS4gIEluIHRoZSBjYXNlCi0JICAgICAgICogb2YgYSAnY2FsbHMnLCBubyBmdXJ0aGVyIHdvcmsgaXMgcmVxdWlyZWQsIGFuZCAqZml4UCBoYXMgYmVlbgotCSAgICAgICAqIHNldCB1cCB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBjb2RlIGJlbG93IGEgbm8tb3AuCi0JICAgICAgICovCi0JICAgICAgcmVsb2NfY2FsbGogKGZpeFApOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgICAgICBhZGRfbnVtYmVyIC09IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotCi0JICAgICAgLyogV2UgdXNlZCB0byBkbwotCQkgICBhZGRfbnVtYmVyIC09IHNlZ1AtPnNjbmhkci5zX3ZhZGRyOwotCQkgaWYgZGVmaW5lZCAoVENfSTM4NikgfHwgZGVmaW5lZCAoVEVfTFlOWCkuICBJIG5vdwotCQkgdGhpbmsgdGhhdCB3YXMgYW4gZXJyb3IgcHJvcGFnYXRlZCBmcm9tIHRoZSBjYXNlIHdoZW4KLQkJIHdlIGFyZSBnb2luZyB0byBlbWl0IHRoZSByZWxvY2F0aW9uLiAgSWYgd2UgYXJlIG5vdAotCQkgZ29pbmcgdG8gZW1pdCB0aGUgcmVsb2NhdGlvbiwgdGhlbiB3ZSBqdXN0IHdhbnQgdG8KLQkJIHNldCBhZGRfbnVtYmVyIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbHMuCi0JCSBUaGlzIGlzIGEgY2FzZSB0aGF0IHdvdWxkIG9ubHkgYXJpc2Ugd2hlbiB0aGVyZSBpcyBhCi0JCSBQQyByZWxhdGl2ZSByZWZlcmVuY2UgZnJvbSBhIHNlY3Rpb24gb3RoZXIgdGhhbiAudGV4dAotCQkgdG8gYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgc2FtZSBzZWN0aW9uLCBhbmQgdGhlCi0JCSByZWZlcmVuY2UgaXMgbm90IHJlbGF4ZWQuICBTaW5jZSBqdW1wIGluc3RydWN0aW9ucyBvbgotCQkgdGhlIGkzODYgYXJlIHJlbGF4ZWQsIHRoaXMgY291bGQgb25seSBhcmlzZSB3aXRoIGEKLQkJIGNhbGwgaW5zdHJ1Y3Rpb24uICAqLwotCi0JICAgICAgcGNyZWwgPSAwOwkvKiBMaWUuIERvbid0IHdhbnQgZnVydGhlciBwY3JlbCBwcm9jZXNzaW5nLiAqLwotCSAgICAgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCXsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChhZGRfc3ltYm9sX3NlZ21lbnQpCi0JCXsKLQkJY2FzZSBhYnNvbHV0ZV9zZWN0aW9uOgotI2lmZGVmIFRDX0k5NjAKLQkJICByZWxvY19jYWxsaiAoZml4UCk7CS8qIFNlZSBjb21tZW50IGFib3V0IHJlbG9jX2NhbGxqKCkgYWJvdmUqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JCSAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCi0JCSAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJICAgIHsKLQkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgICAgICBmaXhQLT5meF9kb25lID0gMTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQotCi0jaWYgZGVmaW5lZChUQ19BMjlLKSB8fCAoZGVmaW5lZChURV9QRSkgJiYgZGVmaW5lZChUQ19JMzg2KSkgfHwgZGVmaW5lZChUQ19NODhLKQotCQkgIC8qIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBoYW5kbGVkIGluIHRoZSBsaW5rZXIsIGJ1dAotCQkgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yYmlkcy4gICovCi0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotI2Vsc2UKLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCkgKwotCQkgICAgc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2xQKV0uc2NuaGRyLnNfcGFkZHI7Ci0jZW5kaWYKLQkJICBicmVhazsKLQotCQljYXNlIFNFR19VTktOT1dOOgotI2lmZGVmIFRDX0k5NjAKLQkJICBpZiAoKGludCkgZml4UC0+ZnhfYml0X2ZpeFAgPT0gMTMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYQotCQkgICAgICAgKiAxMy1iaXQgZGlzcGxhY2VtZW50IGFuZCBhcmUgb25seSB0byBiZSB1c2VkCi0JCSAgICAgICAqIGZvciBsb2NhbCBicmFuY2hlczogZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUKLQkJICAgICAgICogcmVsb2NhdGlvbi4KLQkJICAgICAgICovCi0JCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQkgICAgXygiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiKSk7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQkJLyogQ09CUiAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLSNpZiAoKGRlZmluZWQgKFRDX0kzODYpIHx8IGRlZmluZWQgKFRFX0xZTlgpIHx8IGRlZmluZWQgKFRFX0FVWCkpICYmICFkZWZpbmVkKFRFX1BFKSkgfHwgZGVmaW5lZCAoQ09GRl9DT01NT05fQURERU5EKQotCQkgIC8qIDM4NiBDT0ZGIHVzZXMgYSBwZWN1bGlhciBmb3JtYXQgaW4gd2hpY2ggdGhlCi0JCSAgICAgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sIGlzIHN0b3JlZCBpbiB0aGUgLnRleHQKLQkJICAgICBzZWdtZW50IChJJ3ZlIGNoZWNrZWQgdGhpcyBvbiBTVlIzLjIgYW5kIFNDTwotCQkgICAgIDMuMi4yKSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uICAqLwotCQkgIC8qIFRoaXMgaXMgYWxzbyB0cnVlIGZvciA2OGsgQ09GRiBvbiBzeXN2IG1hY2hpbmVzCi0JCSAgICAgKENoZWNrZWQgb24gTW90b3JvbGEgc3lzdjY4IFIzVjYgYW5kIFIzVjcuMSwgYW5kIGFsc28gb24KLQkJICAgICBVTklYIFN5c3RlbSBWL002ODAwMCwgUmVsZWFzZSAxLjAgZnJvbSBBVFQvQmVsbCBMYWJzKQotCQkgICAgIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uICovCi0JCSAgaWYgKFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sUCkpCi0JCSAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0jZW5kaWYKLQkJICBicmVhazsKLQotCi0JCX0JCS8qIHN3aXRjaCBvbiBzeW1ib2wgc2VnICovCi0JICAgIH0JCQkvKiBpZiBub3QgaW4gbG9jYWwgc2VnICovCi0JfQkJCS8qIGlmIHRoZXJlIHdhcyBhICsgc3ltYm9sICovCi0KLSAgICAgIGlmIChwY3JlbCkKLQl7Ci0jaWYgIWRlZmluZWQoVENfTTg4SykgJiYgIShkZWZpbmVkKFRFX1BFKSAmJiBkZWZpbmVkKFRDX0kzODYpKSAmJiAhZGVmaW5lZChUQ19BMjlLKQotCSAgLyogVGhpcyBhZGp1c3RtZW50IGlzIG5vdCBjb3JyZWN0IG9uIHRoZSBtODhrLCBmb3Igd2hpY2ggdGhlCi0JICAgICBsaW5rZXIgZG9lcyBhbGwgdGhlIGNvbXB1dGF0aW9uLiAgKi8KLQkgIGFkZF9udW1iZXIgLT0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0jZW5kaWYKLQkgIGlmIChhZGRfc3ltYm9sUCA9PSAwKQotCSAgICB7Ci0JICAgICAgZml4UC0+ZnhfYWRkc3kgPSAmYWJzX3N5bWJvbDsKLQkgICAgfQkJCS8qIGlmIHRoZXJlJ3MgYW4gYWRkX3N5bWJvbCAqLwotI2lmIGRlZmluZWQgKFRDX0kzODYpIHx8IGRlZmluZWQgKFRFX0xZTlgpIHx8IGRlZmluZWQgKFRDX0k5NjApIHx8IGRlZmluZWQgKFRDX002OEspCi0JICAvKiBPbiB0aGUgMzg2IHdlIG11c3QgYWRqdXN0IGJ5IHRoZSBzZWdtZW50IHZhZGRyIGFzIHdlbGwuCi0JICAgICBJYW4gVGF5bG9yLgotCi0JICAgICBJIGNoYW5nZWQgdGhlIGk5NjAgdG8gd29yayB0aGlzIHdheSBhcyB3ZWxsLiAgVGhpcyBpcwotCSAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IEdOVSBsaW5rZXIgYmVoYXZpb3VyLiAgSSBkbwotCSAgICAgbm90IGtub3cgd2hhdCBvdGhlciBpOTYwIENPRkYgYXNzZW1ibGVycyBkby4gIFRoaXMgaXMgbm90Ci0JICAgICBhIGNvbW1vbiBjYXNlOiBub3JtYWxseSwgb25seSBhc3NlbWJsZXIgY29kZSB3aWxsIGNvbnRhaW4KLQkgICAgIGEgUEMgcmVsYXRpdmUgcmVsb2MsIGFuZCBvbmx5IGJyYW5jaGVzIHdoaWNoIGRvIG5vdAotCSAgICAgb3JpZ2luYXRlIGluIHRoZSAudGV4dCBzZWN0aW9uIHdpbGwgaGF2ZSBhIG5vbi16ZXJvCi0JICAgICBhZGRyZXNzLgotCi0JICAgICBJIGNoYW5nZWQgdGhlIG02OGsgdG8gd29yayB0aGlzIHdheSBhcyB3ZWxsLiAgVGhpcyB3aWxsCi0JICAgICBicmVhayBleGlzdGluZyBQQyByZWxhdGl2ZSByZWxvY3MgZnJvbSBzZWN0aW9ucyB3aGljaCBkbwotCSAgICAgbm90IHN0YXJ0IGF0IGFkZHJlc3MgMCwgYnV0IGl0IHdpbGwgbWFrZSBsZCAtciB3b3JrLgotCSAgICAgSWFuIFRheWxvciwgNCBPY3QgOTYuICAqLwotCi0JICBhZGRfbnVtYmVyIC09IHNlZ1AtPnNjbmhkci5zX3ZhZGRyOwotI2VuZGlmCi0JfQkJCS8qIGlmIHBjcmVsICovCi0KLSNpZmRlZiBNRF9BUFBMWV9GSVgzCi0gICAgICBtZF9hcHBseV9maXgzIChmaXhQLCAodmFsdWVUICopICZhZGRfbnVtYmVyLCB0aGlzX3NlZ21lbnRfdHlwZSk7Ci0jZWxzZQotICAgICAgbWRfYXBwbHlfZml4IChmaXhQLCBhZGRfbnVtYmVyKTsKLSNlbmRpZgotCi0gICAgICBpZiAoIWZpeFAtPmZ4X2JpdF9maXhQICYmICEgZml4UC0+Znhfbm9fb3ZlcmZsb3cpCi0JewotI2lmbmRlZiBUQ19NODhLCi0JICAvKiBUaGUgbTg4ayB1c2VzIHRoZSBvZmZzZXQgZmllbGQgb2YgdGhlIHJlbG9jIHRvIGdldCBhcm91bmQKLQkgICAgIHRoaXMgcHJvYmxlbS4gICovCi0JICBpZiAoKHNpemUgPT0gMQotCSAgICAgICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRikKLQkJICAgfHwgKGZpeFAtPmZ4X3NpZ25lZCAmJiAoYWRkX251bWJlciAmIDB4ODApKSkKLQkgICAgICAgJiYgKChhZGRfbnVtYmVyICYgfjB4RkYpICE9ICgtMSAmIH4weEZGKQotCQkgICB8fCAoYWRkX251bWJlciAmIDB4ODApID09IDApKQotCSAgICAgIHx8IChzaXplID09IDIKLQkJICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRkZGKQotCQkgICAgICB8fCAoZml4UC0+Znhfc2lnbmVkICYmIChhZGRfbnVtYmVyICYgMHg4MDAwKSkpCi0JCSAgJiYgKChhZGRfbnVtYmVyICYgfjB4RkZGRikgIT0gKC0xICYgfjB4RkZGRikKLQkJICAgICAgfHwgKGFkZF9udW1iZXIgJiAweDgwMDApID09IDApKSkKLQkgICAgewotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICBfKCJWYWx1ZSBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAweCVseCIpLAotCQkJICAgIChsb25nKSBhZGRfbnVtYmVyLCBzaXplLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSkpOwotCSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0JICAvKiBXYXJuIGlmIGEgLndvcmQgdmFsdWUgaXMgdG9vIGxhcmdlIHdoZW4gdHJlYXRlZCBhcyBhCi0JICAgICBzaWduZWQgbnVtYmVyLiAgV2UgYWxyZWFkeSBrbm93IGl0IGlzIG5vdCB0b28gbmVnYXRpdmUuCi0JICAgICBUaGlzIGlzIHRvIGNhdGNoIG92ZXItbGFyZ2Ugc3dpdGNoZXMgZ2VuZXJhdGVkIGJ5IGdjYyBvbgotCSAgICAgdGhlIDY4ay4gICovCi0JICBpZiAoIWZsYWdfc2lnbmVkX292ZXJmbG93X29rCi0JICAgICAgJiYgc2l6ZSA9PSAyCi0JICAgICAgJiYgYWRkX251bWJlciA+IDB4N2ZmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJTaWduZWQgLndvcmQgb3ZlcmZsb3c7IHN3aXRjaCBtYXkgYmUgdG9vIGxhcmdlOyAlbGQgYXQgMHglbHgiKSwKLQkJCSAgKGxvbmcpIGFkZF9udW1iZXIsCi0JCQkgICh1bnNpZ25lZCBsb25nKSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSkpOwotI2VuZGlmCi0JfQkJCS8qIG5vdCBhIGJpdCBmaXggKi8KLSAgICB9CQkJCS8qIEZvciBlYWNoIGZpeFMgaW4gdGhpcyBzZWdtZW50LiAqLwotfQkJCQkvKiBmaXh1cF9zZWdtZW50KCkgKi8KLQotI2VuZGlmCi0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIC5zdGFiIHNlY3Rpb24gaXMgc3BlY2lhbC4gICovCi0KLXZvaWQKLW9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICpmaWxlOwotICBjaGFyICpwOwotICBjaGFyICpzdGFic3RyX25hbWU7Ci0gIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0KLSAgLyogTWFrZSBzcGFjZSBmb3IgdGhpcyBmaXJzdCBzeW1ib2wuICovCi0gIHAgPSBmcmFnX21vcmUgKDEyKTsKLSAgLyogWmVybyBpdCBvdXQuICovCi0gIG1lbXNldCAocCwgMCwgMTIpOwotICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gIHN0YWJzdHJfbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWdtZW50X2luZm9bc2VnXS5uYW1lKSArIDQpOwotICBzdHJjcHkgKHN0YWJzdHJfbmFtZSwgc2VnbWVudF9pbmZvW3NlZ10ubmFtZSk7Ci0gIHN0cmNhdCAoc3RhYnN0cl9uYW1lLCAic3RyIik7Ci0gIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsIHN0YWJzdHJfbmFtZSk7Ci0gIGtub3cgKHN0cm9mZiA9PSAxKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOwotfQotCi0vKiBGaWxsIGluIHRoZSBjb3VudHMgaW4gdGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWIgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3RhYl9zZWN0aW9uKGFiZmQsIHNlZykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWdUIHNlZzsKLXsKLSAgc2VnVCBzdGFic3Ryc2VnID0gU0VHX1VOS05PV047Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWUsICpuYW1lMjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqcCA9IE5VTEw7Ci0gIGludCBpLCBzdHJzeiA9IDAsIG5zeW1zOwotICBmcmFnUyAqZnJhZyA9IHNlZ21lbnRfaW5mb1tzZWddLmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0KLSAgLyogTG9vayBmb3IgdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICovCi0KLSAgc2VjbmFtZSA9IHNlZ21lbnRfaW5mb1tzZWddLm5hbWU7Ci0gIG5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VjbmFtZSkgKyA0KTsKLSAgc3RyY3B5IChuYW1lLCBzZWNuYW1lKTsKLSAgc3RyY2F0IChuYW1lLCAic3RyIik7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBuYW1lMiA9IHNlZ21lbnRfaW5mb1tpXS5uYW1lOwotICAgICAgaWYgKG5hbWUyICE9IE5VTEwgJiYgc3RybmNtcChuYW1lMiwgbmFtZSwgOCkgPT0gMCkKLQl7Ci0JICBzdGFic3Ryc2VnID0gaTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZm91bmQgdGhlIHNlY3Rpb24sIGdldCBpdHMgc2l6ZS4gKi8KLSAgaWYgKHN0YWJzdHJzZWcgIT0gU0VHX1VOS05PV04pCi0gICAgc3Ryc3ogPSBzaXplX3NlY3Rpb24gKGFiZmQsIHN0YWJzdHJzZWcpOwotCi0gIG5zeW1zID0gc2l6ZV9zZWN0aW9uIChhYmZkLCBzZWcpIC8gMTIgLSAxOwotCi0gIC8qIExvb2sgZm9yIHRoZSBmaXJzdCBmcmFnIG9mIHN1ZmZpY2llbnQgc2l6ZSBmb3IgdGhlIGluaXRpYWwgc3RhYgotICAgICBzeW1ib2wsIGFuZCBjb2xsZWN0IGEgcG9pbnRlciB0byBpdC4gKi8KLSAgd2hpbGUgKGZyYWcgJiYgZnJhZy0+ZnJfZml4IDwgMTIpCi0gICAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0gIGFzc2VydCAoZnJhZyAhPSAwKTsKLSAgcCA9IGZyYWctPmZyX2xpdGVyYWw7Ci0gIGFzc2VydCAocCAhPSAwKTsKLQotICAvKiBXcml0ZSBpbiB0aGUgbnVtYmVyIG9mIHN0YWIgc3ltYm9scyBhbmQgdGhlIHNpemUgb2YgdGhlIHN0cmluZwotICAgICB0YWJsZS4gKi8KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCAoYmZkX3ZtYSkgbnN5bXMsIChiZmRfYnl0ZSAqKSBwICsgNik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHN0cnN6LCAoYmZkX2J5dGUgKikgcCArIDgpOwotfQotCi0jZW5kaWYgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIGNvZmZfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRlZiIsIG9ial9jb2ZmX2RlZiwgMH0sCi0gIHsiZGltIiwgb2JqX2NvZmZfZGltLCAwfSwKLSAgeyJlbmRlZiIsIG9ial9jb2ZmX2VuZGVmLCAwfSwKLSAgeyJsaW5lIiwgb2JqX2NvZmZfbGluZSwgMH0sCi0gIHsibG4iLCBvYmpfY29mZl9sbiwgMH0sCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7ImxvYyIsIG9ial9jb2ZmX2xvYywgMH0sCi0jZW5kaWYKLSAgeyJhcHBsaW5lIiwgb2JqX2NvZmZfbG4sIDF9LAotICB7InNjbCIsIG9ial9jb2ZmX3NjbCwgMH0sCi0gIHsic2l6ZSIsIG9ial9jb2ZmX3NpemUsIDB9LAotICB7InRhZyIsIG9ial9jb2ZmX3RhZywgMH0sCi0gIHsidHlwZSIsIG9ial9jb2ZmX3R5cGUsIDB9LAotICB7InZhbCIsIG9ial9jb2ZmX3ZhbCwgMH0sCi0gIHsic2VjdGlvbiIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InNlY3QiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgLyogRklYTUU6IFdlIGlnbm9yZSB0aGUgTVJJIHNob3J0IGF0dHJpYnV0ZS4gICovCi0gIHsic2VjdGlvbi5zIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdC5zIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIC8qIFdlIGFjY2VwdCB0aGUgLmJzcyBkaXJlY3RpdmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAotICAgICBlYXJsaWVyIHZlcnNpb25zIG9mIGdhcy4gICovCi0gIHsiYnNzIiwgb2JqX2NvZmZfYnNzLCAwfSwKLSAgeyJ3ZWFrIiwgb2JqX2NvZmZfd2VhaywgMH0sCi0gIHsiaWRlbnQiLCBvYmpfY29mZl9pZGVudCwgMH0sCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgeyJ1c2UiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJ0ZXh0Iiwgb2JqX2NvZmZfdGV4dCwgMH0sCi0gIHsiZGF0YSIsIG9ial9jb2ZmX2RhdGEsIDB9LAotICB7Imxjb21tIiwgb2JqX2NvZmZfbGNvbW0sIDB9LAotI2Vsc2UKLSAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwJLyogRm9yIHN1bjM4NmkgY2MgKD8pICovCi0jZW5kaWYKLSAgeyJ2ZXJzaW9uIiwgc19pZ25vcmUsIDB9LAotICB7IkFCT1JUIiwgc19hYm9ydCwgMH0sCi0jaWZkZWYgVENfTTg4SwotICAvKiBUaGUgbTg4ayB1c2VzIHNkZWYgaW5zdGVhZCBvZiBkZWYuICAqLwotICB7InNkZWYiLCBvYmpfY29mZl9kZWYsIDB9LAotI2VuZGlmCi0gIHtOVUxMLCBOVUxMLCAwfQkJLyogZW5kIHNlbnRpbmVsICovCi19OwkJCQkvKiBjb2ZmX3BzZXVkb190YWJsZSAqLwotDAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogU3VwcG9ydCBmb3IgYSBDT0ZGIGVtdWxhdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkIGNvZmZfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAoY29mZl9wc2V1ZG9fdGFibGUpOwotfQotCi1jb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBjb2ZmX2Zvcm1hdF9vcHMgPQotewotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgMCwJLyogZGZsX2xlYWRpbmdfdW5kZXJzY29yZSAqLwotICAxLAkvKiBlbWl0X3NlY3Rpb25fc3ltYm9scyAqLwotICBjb2ZmX2Zyb2Jfc3ltYm9sLAotICAwLAkvKiBmcm9iX2ZpbGUgKi8KLSAgY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzLAotICAwLAkvKiBzX2dldF9zaXplICovCi0gIDAsCS8qIHNfc2V0X3NpemUgKi8KLSAgMCwJLyogc19nZXRfYWxpZ24gKi8KLSAgMCwJLyogc19zZXRfYWxpZ24gKi8KLSAgMCwJLyogc19nZXRfb3RoZXIgKi8KLSAgMCwJLyogc19nZXRfZGVzYyAqLwotICAwLAkvKiBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzICovCi0gIDAsCS8qIGdlbmVyYXRlX2FzbV9saW5lbm8gKi8KLSAgMCwJLyogcHJvY2Vzc19zdGFiICovCi0gIDAsCS8qIHNlY19zeW1fb2tfZm9yX3JlbG9jICovCi0gIGNvZmZfcG9wX2luc2VydCwKLSAgMCwJLyogZWNvZmZfc2V0X2V4dCAqLwotICBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2ssCi0gIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vawotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1jb2ZmLmggYi9nYXMvY29uZmlnL29iai1jb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGFlMzYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsODczICswLDAgQEAKLS8qIGNvZmYgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgT0JKX0ZPUk1BVF9ICi0jZGVmaW5lIE9CSl9GT1JNQVRfSAotCi0jZGVmaW5lIE9CSl9DT0ZGIDEKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotI2RlZmluZSBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0jZGVmaW5lIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZGVmaW5lIEJGRF9IRUFERVJTCi0jZGVmaW5lIEJGRAotCi0jZW5kaWYKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotLyogVGhpcyBpbnRlcm5hbF9saW5lbm8gY3JhcCBpcyB0byBzdG9wIG5hbWVzcGFjZSBwb2xsdXRpb24gZnJvbSB0aGUKLSAgIGJmZCBpbnRlcm5hbCBjb2ZmIGhlYWRlcmZpbGUuICovCi0jZGVmaW5lIGludGVybmFsX2xpbmVubyBiZmRfaW50ZXJuYWxfbGluZW5vCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI3VuZGVmIGludGVybmFsX2xpbmVubwotCi0vKiBDUFUtc3BlY2lmaWMgc2V0dXA6ICAqLwotCi0jaWZkZWYgVENfQVJNCi0jaW5jbHVkZSAiY29mZi9hcm0uaCIKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWFybSIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19QUEMKLSNpZmRlZiBURV9QRQotI2luY2x1ZGUgImNvZmYvcG93ZXJwYy5oIgotI2Vsc2UKLSNpbmNsdWRlICJjb2ZmL3JzNjAwMC5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRDX1NQQVJDCi0jaW5jbHVkZSAiY29mZi9zcGFyYy5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19JMzg2Ci0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0KLSNpZmRlZiBURV9QRQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJwZS1pMzg2IgotI2VuZGlmCi0KLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWkzODYiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVENfTTY4SwotI2luY2x1ZGUgImNvZmYvbTY4ay5oIgotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTY4ayIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19BMjlLCi0jaW5jbHVkZSAiY29mZi9hMjlrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtYTI5ay1iaWciCi0jZW5kaWYKLQotI2lmZGVmIFRDX0k5NjAKLSNpbmNsdWRlICJjb2ZmL2k5NjAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1JbnRlbC1saXR0bGUiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1o4SwotI2luY2x1ZGUgImNvZmYvejhrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtejhrIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19IODMwMAotI2luY2x1ZGUgImNvZmYvaDgzMDAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1oODMwMCIKLSNlbmRpZgotCi0jaWZkZWYgVENfSDg1MDAKLSNpbmNsdWRlICJjb2ZmL2g4NTAwLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtaDg1MDAiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1NICi0KLSNpZmRlZiBURV9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNlbmRpZgotCi0jaW5jbHVkZSAiY29mZi9zaC5oIgotCi0jaWZkZWYgVEVfUEUKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAicGUtc2hsIgotI2Vsc2UKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJCQkJXAotICAoc2hsCQkJCQkJCVwKLSAgID8gKHNoX3NtYWxsID8gImNvZmYtc2hsLXNtYWxsIiA6ICJjb2ZmLXNobCIpCQlcCi0gICA6IChzaF9zbWFsbCA/ICJjb2ZmLXNoLXNtYWxsIiA6ICJjb2ZmLXNoIikpCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVENfTUlQUwotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJjb2ZmL21pcHNwZS5oIgotI3VuZGVmICBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgInBlLW1pcHMiCi0jZW5kaWYKLQotI2lmZGVmIFRDX004OEsKLSNpbmNsdWRlICJjb2ZmL204OGsuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1tODhrYmNzIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19XNjUKLSNpbmNsdWRlICJjb2ZmL3c2NS5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLXc2NSIKLSNlbmRpZgotCi0jaWZkZWYgVENfVElDMzAKLSNpbmNsdWRlICJjb2ZmL3RpYzMwLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtdGljMzAiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1RJQzgwCi0jaW5jbHVkZSAiY29mZi90aWM4MC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLXRpYzgwIgotI2RlZmluZSBBTElHTk1FTlRfSU5fU19GTEFHUyAxCi0jZW5kaWYKLQotI2lmZGVmIFRDX01DT1JFCi0jaW5jbHVkZSAiY29mZi9tY29yZS5oIgotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgInBlLW1jb3JlIgotI2VuZGlmCi0jZW5kaWYKLQotLyogVGFyZ2V0cyBtYXkgYWxzbyBzZXQgdGhpcy4gIEFsc28sIGlmIEJGRF9BU1NFTUJMRVIgaXMgZGVmaW5lZCwgdGhpcwotICAgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBkZWZpbmVkLiAgKi8KLSN1bmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0jZGVmaW5lIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgMQotCi0jaWZuZGVmIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTCi0jZGVmaW5lIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTIDEKLSNlbmRpZiAvKiBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUyAqLwotCi1leHRlcm4gdm9pZCBjb2ZmX29ial9zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2sgY29mZl9vYmpfc3ltYm9sX25ld19ob29rCi0KLWV4dGVybiB2b2lkIGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG9ial9yZWFkX2JlZ2luX2hvb2sgY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIFRoaXMgZmlsZSByZWFsbHkgY29udGFpbnMgdHdvIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgQ09GRiBiYWNrIGVuZC4KLSAgIFRoZXkgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1lcmdlZCwgYnV0IHRoaXMgaXMgb25seSBhCi0gICBwcmVsaW1pbmFyeSwgbWVjaGFuaWNhbCBtZXJnaW5nLiAgTWFueSBkZWZpbml0aW9ucyB0aGF0IGFyZQotICAgaWRlbnRpY2FsIGJldHdlZW4gdGhlIHR3byBhcmUgc3RpbGwgZm91bmQgaW4gYm90aCB2ZXJzaW9ucy4KLQotICAgVGhlIGZpcnN0IHZlcnNpb24sIHdpdGggQkZEX0FTU0VNQkxFUiBkZWZpbmVkLCB1c2VzIGhpZ2gtbGV2ZWwgQkZECi0gICBpbnRlcmZhY2VzIGFuZCBkYXRhIHN0cnVjdHVyZXMuICBUaGUgc2Vjb25kIHZlcnNpb24sIHdpdGgKLSAgIEJGRF9BU1NFTUJMRVIgbm90IGRlZmluZWQsIGFsc28gdXNlcyBCRkQsIGJ1dCBtb3N0bHkgZm9yIHN3YXBwaW5nCi0gICBkYXRhIHN0cnVjdHVyZXMgYW5kIGZvciBkb2luZyB0aGUgYWN0dWFsIEkvTy4gIFRoZSBsYXR0ZXIgZGVmaW5lcwotICAgdGhlIHByZXByb2Nlc3NvciBzeW1ib2xzIEJGRCBhbmQgQkZEX0hFQURFUlMuICBUcnkgbm90IHRvIGxldCB0aGlzCi0gICBjb25mdXNlIHlvdS4KLQotICAgVGhlc2UgdHdvIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBtZXJnZWQsIGFuZCBldmVudHVhbGx5IHRoZQotICAgQkZEX0FTU0VNQkxFUiB2ZXJzaW9uIHNob3VsZCB0YWtlIG92ZXIgY29tcGxldGVseS4gIFJlbGVhc2UgdGltaW5nCi0gICBpc3N1ZXMgYW5kIG5hbWVzcGFjZSBwcm9ibGVtcyBjb252aW5jZWQgbWUgdG8gbWVyZ2UgdGhlIHR3bwotICAgdG9nZXRoZXIgaW4gdGhpcyBmYXNoaW9uLCBhIGxpdHRsZSBzb29uZXIgdGhhbiBJIHdvdWxkIGhhdmUgbGlrZWQuCi0gICBUaGUgcmVhbCBtZXJnZSBzaG91bGQgYmUgbXVjaCBiZXR0ZXIgZG9uZSBieSB0aGUgdGltZSB0aGUgbmV4dAotICAgcmVsZWFzZSBjb21lcyBvdXQuCi0KLSAgIEZvciBub3csIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBmaWxlIGlzOgotCTxjb21tb24+Ci0JI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQk8b25lIHZlcnNpb24+Ci0JI2Vsc2UKLQk8b3RoZXIgdmVyc2lvbj4KLQkjZW5kaWYKLQk8Y29tbW9uPgotICAgVW5mb3J0dW5hdGVseSwgdGhlIGNvbW1vbiBwb3J0aW9ucyBhcmUgdmVyeSBzbWFsbCBhdCB0aGUgbW9tZW50LAotICAgYW5kIG1hbnkgZGVjbGFyYXRpb25zIG9yIGRlZmluaXRpb25zIGFyZSBkdXBsaWNhdGVkLiAgVGhlIHN0cnVjdHVyZQotICAgb2Ygb2JqLWNvZmYuYyBpcyBzaW1pbGFyLgotCi0gICBTZWUgZG9jL2ludGVybmFscy50ZXhpIGZvciBhIGJyaWVmIGRpc2N1c3Npb24gb2YgdGhlIGhpc3RvcnksIGlmCi0gICB5b3UgY2FyZS4KLQotICAgS2VuIFJhZWJ1cm4sIDUgTWF5IDE5OTQKLQotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotI2luY2x1ZGUgImJmZC9saWJjb2ZmLmgiCi0KLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotCi0vKiBTWU1CT0wgVEFCTEUgKi8KLQotLyogQWx0ZXIgdGhlIGZpZWxkIG5hbWVzLCBmb3Igbm93LCB1bnRpbCB3ZSd2ZSBmaXhlZCB1cCB0aGUgb3RoZXIKLSAgIHJlZmVyZW5jZXMgdG8gdXNlIHRoZSBuZXcgbmFtZS4gICovCi0jaWZkZWYgVENfSTk2MAotI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFCXN5bWJvbFMgKgotI2RlZmluZSBzeV90YwkJCWJhbAotI2VuZGlmCi0KLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUJdW5zaWduZWQgbG9uZwotI2RlZmluZSBzeV9vYmoJCQlzeV9mbGFncwotCi0jZGVmaW5lIFNZTV9BVVhFTlQoUykgXAotICAoJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPm5hdGl2ZVsxXS51LmF1eGVudCkKLSNkZWZpbmUgU1lNX0FVWElORk8oUykgXAotICAoJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPm5hdGl2ZVsxXSkKLQotI2RlZmluZSBET19OT1RfU1RSSVAJMAotCi1leHRlcm4gdm9pZCBvYmpfY29mZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotCi0vKiBUaGUgbnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzICovCi0jZGVmaW5lIFNfR0VUX05VTUJFUl9BVVhJTElBUlkocykgXAotICAoY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHMpKS0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCkKLS8qIFRoZSBudW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLSNkZWZpbmUgU19TRVRfTlVNQkVSX0FVWElMSUFSWShzLHYpCShTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzKSA9ICh2KSkKLQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGluIHRoZSBzdHJpbmcgdGFibGUsIGkuZS4gaXRzIGxlbmd0aCBpcyA+IDguICovCi0jZGVmaW5lIFNfSVNfU1RSSU5HKHMpCQkoc3RybGVuKFNfR0VUX05BTUUocykpID4gOCA/IDEgOiAwKQotCi1leHRlcm4gaW50IFNfU0VUX0RBVEFfVFlQRSBQQVJBTVMgKChzeW1ib2xTICosIGludCkpOwotZXh0ZXJuIGludCBTX1NFVF9TVE9SQUdFX0NMQVNTIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci1leHRlcm4gaW50IFNfR0VUX1NUT1JBR0VfQ0xBU1MgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTQV9TRVRfU1lNX0VORE5EWCBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotCi0vKiBBdXhpbGlhcnkgZW50cnkgbWFjcm9zLiBTQV8gc3RhbmRzIGZvciBzeW1ib2wgYXV4aWxpYXJ5ICovCi0vKiBPbWl0IHRoZSB0diByZWxhdGVkIGZpZWxkcyAqLwotLyogQWNjZXNzb3JzICovCi0KLSNkZWZpbmUgU0FfR0VUX1NZTV9UQUdORFgocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X3RhZ25keC5sKQotI2RlZmluZSBTQV9HRVRfU1lNX0xOTk8ocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNkZWZpbmUgU0FfR0VUX1NZTV9TSVpFKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZGVmaW5lIFNBX0dFVF9TWU1fRlNJWkUocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZSkKLSNkZWZpbmUgU0FfR0VUX1NZTV9MTk5PUFRSKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2RlZmluZSBTQV9HRVRfU1lNX0VORE5EWChzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2RlZmluZSBTQV9HRVRfU1lNX0RJTUVOKHMsaSkJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV0pCi0jZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FKHMpCShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUpCi0jZGVmaW5lIFNBX0dFVF9TQ05fU0NOTEVOKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW4pCi0jZGVmaW5lIFNBX0dFVF9TQ05fTlJFTE9DKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2MpCi0jZGVmaW5lIFNBX0dFVF9TQ05fTkxJTk5PKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm8pCi0KLSNkZWZpbmUgU0FfU0VUX1NZTV9MTk5PKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubz0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fU0laRShzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0ZTSVpFKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZT0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fTE5OT1BUUihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9ESU1FTihzLGksdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV09KHYpKQotI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRShzLHYpCXN0cm5jcHkoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X2ZuYW1lLCh2KSxGSUxOTUxFTikKLSNkZWZpbmUgU0FfU0VUX1NDTl9TQ05MRU4ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfc2NubGVuPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NDTl9OUkVMT0Mocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbnJlbG9jPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NDTl9OTElOTk8ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbmxpbm5vPSh2KSkKLQotLyoKLSAqIEludGVybmFsIHVzZSBvbmx5IGRlZmluaXRpb25zLiBTRl8gc3RhbmRzIGZvciBzeW1ib2wgZmxhZ3MuCi0gKgotICogVGhlc2UgdmFsdWVzIGNhbiBiZSBhc3NpZ25lZCB0byBzeV9zeW1ib2wub3N0X2ZsYWdzIGZpZWxkIG9mIGEgc3ltYm9sUy4KLSAqCi0gKiBZb3UnbGwgYnJlYWsgaTk2MCBpZiB5b3Ugc2hpZnQgdGhlIFNZU1BST0MgYml0cyBhbnl3aGVyZSBlbHNlLiAgZm9yCi0gKiBtb3JlIG9uIHRoZSBiYWxuYW1lL2NhbGxuYW1lIGhhY2ssIHNlZSB0Yy1pOTYwLmguICBiLm91dCBpcyBkb25lCi0gKiBkaWZmZXJlbnRseS4KLSAqLwotCi0jZGVmaW5lIFNGX0k5NjBfTUFTSwkoMHgwMDAwMDFmZikJLyogQml0cyAwLTggYXJlIHVzZWQgYnkgdGhlIGk5NjAgcG9ydC4gKi8KLSNkZWZpbmUgU0ZfU1lTUFJPQwkoMHgwMDAwMDAzZikJLyogYml0cyAwLTUgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIHN5c3Byb2MgbnVtYmVyICovCi0jZGVmaW5lIFNGX0lTX1NZU1BST0MJKDB4MDAwMDAwNDApCS8qIGJpdCA2IG1hcmtzIHN5bWJvbHMgdGhhdCBhcmUgc3lzcHJvY3MgKi8KLSNkZWZpbmUgU0ZfQkFMTkFNRQkoMHgwMDAwMDA4MCkJLyogYml0IDcgbWFya3MgQkFMTkFNRSBzeW1ib2xzICovCi0jZGVmaW5lIFNGX0NBTExOQU1FCSgweDAwMDAwMTAwKQkvKiBiaXQgOCBtYXJrcyBDQUxMTkFNRSBzeW1ib2xzICovCi0KLSNkZWZpbmUgU0ZfTk9STUFMX01BU0sJKDB4MDAwMGZmZmYpCS8qIGJpdHMgMTItMTUgYXJlIGdlbmVyYWwgcHVycG9zZS4gKi8KLQotI2RlZmluZSBTRl9TVEFUSUNTCSgweDAwMDAxMDAwKQkvKiBNYXJrIHRoZSAudGV4dCAmIGFsbCBzeW1ib2xzICovCi0jZGVmaW5lIFNGX0RFRklORUQJKDB4MDAwMDIwMDApCS8qIFN5bWJvbCBpcyBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTRl9TVFJJTkcJKDB4MDAwMDQwMDApCS8qIFN5bWJvbCBuYW1lIGxlbmd0aCA+IDggKi8KLSNkZWZpbmUgU0ZfTE9DQUwJKDB4MDAwMDgwMDApCS8qIFN5bWJvbCBtdXN0IG5vdCBiZSBlbWl0dGVkICovCi0KLSNkZWZpbmUgU0ZfREVCVUdfTUFTSwkoMHhmZmZmMDAwMCkJLyogYml0cyAxNi0zMSBhcmUgZGVidWcgaW5mbyAqLwotCi0jZGVmaW5lIFNGX0ZVTkNUSU9OCSgweDAwMDEwMDAwKQkvKiBUaGUgc3ltYm9sIGlzIGEgZnVuY3Rpb24gKi8KLSNkZWZpbmUgU0ZfUFJPQ0VTUwkoMHgwMDAyMDAwMCkJLyogUHJvY2VzcyBzeW1ib2wgYmVmb3JlIHdyaXRlICovCi0jZGVmaW5lIFNGX1RBR0dFRAkoMHgwMDA0MDAwMCkJLyogSXMgYXNzb2NpYXRlZCB3aXRoIGEgdGFnICovCi0jZGVmaW5lIFNGX1RBRwkJKDB4MDAwODAwMDApCS8qIElzIGEgdGFnICovCi0jZGVmaW5lIFNGX0RFQlVHCSgweDAwMTAwMDAwKQkvKiBJcyBpbiBkZWJ1ZyBvciBhYnMgc2VjdGlvbiAqLwotI2RlZmluZSBTRl9HRVRfU0VHTUVOVAkoMHgwMDIwMDAwMCkJLyogR2V0IHRoZSBzZWN0aW9uIG9mIHRoZSBmb3J3YXJkIHN5bWJvbC4gKi8KLS8qIEFsbCBvdGhlciBiaXRzIGFyZSB1bnVzZWQuICovCi0KLS8qIEFjY2Vzc29ycyAqLwotI2RlZmluZSBTRl9HRVQocykJCSgqc3ltYm9sX2dldF9vYmogKHMpKQotI2RlZmluZSBTRl9HRVRfREVCVUcocykJCShzeW1ib2xfZ2V0X2JmZHN5bSAocyktPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLSNkZWZpbmUgU0ZfU0VUX0RFQlVHKHMpCQkoc3ltYm9sX2dldF9iZmRzeW0gKHMpLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HKQotI2RlZmluZSBTRl9HRVRfTk9STUFMX0ZJRUxEKHMpCShTRl9HRVQgKHMpICYgU0ZfTk9STUFMX01BU0spCi0jZGVmaW5lIFNGX0dFVF9ERUJVR19GSUVMRChzKQkoU0ZfR0VUIChzKSAmIFNGX0RFQlVHX01BU0spCi0jZGVmaW5lIFNGX0dFVF9GSUxFKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0ZJTEUpCi0jZGVmaW5lIFNGX0dFVF9TVEFUSUNTKHMpCShTRl9HRVQgKHMpICYgU0ZfU1RBVElDUykKLSNkZWZpbmUgU0ZfR0VUX0RFRklORUQocykJKFNGX0dFVCAocykgJiBTRl9ERUZJTkVEKQotI2RlZmluZSBTRl9HRVRfU1RSSU5HKHMpCShTRl9HRVQgKHMpICYgU0ZfU1RSSU5HKQotI2RlZmluZSBTRl9HRVRfTE9DQUwocykJCShTRl9HRVQgKHMpICYgU0ZfTE9DQUwpCi0jZGVmaW5lIFNGX0dFVF9GVU5DVElPTihzKSAgICAgIChTRl9HRVQgKHMpICYgU0ZfRlVOQ1RJT04pCi0jZGVmaW5lIFNGX0dFVF9QUk9DRVNTKHMpCShTRl9HRVQgKHMpICYgU0ZfUFJPQ0VTUykKLSNkZWZpbmUgU0ZfR0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSAmIFNGX1RBR0dFRCkKLSNkZWZpbmUgU0ZfR0VUX1RBRyhzKQkJKFNGX0dFVCAocykgJiBTRl9UQUcpCi0jZGVmaW5lIFNGX0dFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSAmIFNGX0dFVF9TRUdNRU5UKQotI2RlZmluZSBTRl9HRVRfSTk2MChzKQkJKFNGX0dFVCAocykgJiBTRl9JOTYwX01BU0spCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSAmIFNGX0JBTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfQ0FMTE5BTUUocykJKFNGX0dFVCAocykgJiBTRl9DQUxMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9JU19TWVNQUk9DKHMpCShTRl9HRVQgKHMpICYgU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9TWVNQUk9DKHMpCShTRl9HRVQgKHMpICYgU0ZfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0KLS8qIE1vZGlmaWVycyAqLwotI2RlZmluZSBTRl9TRVQocyx2KQkJKFNGX0dFVCAocykgPSAodikpCi0jZGVmaW5lIFNGX1NFVF9OT1JNQUxfRklFTEQocyx2KShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9OT1JNQUxfTUFTSykpCi0jZGVmaW5lIFNGX1NFVF9ERUJVR19GSUVMRChzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9ERUJVR19NQVNLKSkKLSNkZWZpbmUgU0ZfU0VUX0ZJTEUocykJCShTRl9HRVQgKHMpIHw9IFNGX0ZJTEUpCi0jZGVmaW5lIFNGX1NFVF9TVEFUSUNTKHMpCShTRl9HRVQgKHMpIHw9IFNGX1NUQVRJQ1MpCi0jZGVmaW5lIFNGX1NFVF9ERUZJTkVEKHMpCShTRl9HRVQgKHMpIHw9IFNGX0RFRklORUQpCi0jZGVmaW5lIFNGX1NFVF9TVFJJTkcocykJKFNGX0dFVCAocykgfD0gU0ZfU1RSSU5HKQotI2RlZmluZSBTRl9TRVRfTE9DQUwocykJCShTRl9HRVQgKHMpIHw9IFNGX0xPQ0FMKQotI2RlZmluZSBTRl9DTEVBUl9MT0NBTChzKQkoU0ZfR0VUIChzKSAmPSB+U0ZfTE9DQUwpCi0jZGVmaW5lIFNGX1NFVF9GVU5DVElPTihzKSAgICAgIChTRl9HRVQgKHMpIHw9IFNGX0ZVTkNUSU9OKQotI2RlZmluZSBTRl9TRVRfUFJPQ0VTUyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9QUk9DRVNTKQotI2RlZmluZSBTRl9TRVRfVEFHR0VEKHMpCShTRl9HRVQgKHMpIHw9IFNGX1RBR0dFRCkKLSNkZWZpbmUgU0ZfU0VUX1RBRyhzKQkJKFNGX0dFVCAocykgfD0gU0ZfVEFHKQotI2RlZmluZSBTRl9TRVRfR0VUX1NFR01FTlQocykJKFNGX0dFVCAocykgfD0gU0ZfR0VUX1NFR01FTlQpCi0jZGVmaW5lIFNGX1NFVF9JOTYwKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0k5NjBfTUFTSykpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSB8PSBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpIHw9IFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgfD0gU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9TWVNQUk9DKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX1NZU1BST0MpKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLQotLyogLS0tLS0tLS0tLS0tLS0gIExpbmUgbnVtYmVyIGhhbmRsaW5nIC0tLS0tLS0gKi8KLWV4dGVybiBpbnQgdGV4dF9saW5lbm9fbnVtYmVyOwotZXh0ZXJuIGludCBjb2ZmX2xpbmVfYmFzZTsKLWV4dGVybiBpbnQgY29mZl9uX2xpbmVfbm9zOwotCi0jZGVmaW5lIG9ial9lbWl0X2xpbmVubyhXSEVSRSxMSU5FLEZJTEVfU1RBUlQpCWFib3J0ICgpCi1leHRlcm4gdm9pZCBjb2ZmX2FkZF9saW5lc3ltIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0KLXZvaWQgY19kb3RfZmlsZV9zeW1ib2wgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLSNkZWZpbmUgb2JqX2FwcF9maWxlIGNfZG90X2ZpbGVfc3ltYm9sCi0KLWV4dGVybiB2b2lkIGNvZmZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9hZGp1c3Rfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGNvZmZfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKLWV4dGVybiB2b2lkIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woUyxQKSAJY29mZl9mcm9iX3N5bWJvbChTLCZQKQotI2lmbmRlZiBvYmpfYWRqdXN0X3N5bXRhYgotI2RlZmluZSBvYmpfYWRqdXN0X3N5bXRhYigpCWNvZmZfYWRqdXN0X3N5bXRhYigpCi0jZW5kaWYKLSNkZWZpbmUgb2JqX2Zyb2Jfc2VjdGlvbihTKQljb2ZmX2Zyb2Jfc2VjdGlvbiAoUykKLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MoKSBjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLQotZXh0ZXJuIHN5bWJvbFMgKmNvZmZfbGFzdF9mdW5jdGlvbjsKLQotLyogRm9yd2FyZCB0aGUgc2VnbWVudCBvZiBhIGZvcndhcmRlZCBzeW1ib2wsIGhhbmRsZSBhc3NpZ25tZW50cyB0aGF0Ci0gICBqdXN0IGNvcHkgc3ltYm9sIHZhbHVlcywgZXRjLiAgKi8KLSNpZm5kZWYgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKLSNpZm5kZWYgVEVfSTM4NkFJWAotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhkZXN0LHNyYykgXAotICAoU0ZfR0VUX0dFVF9TRUdNRU5UIChkZXN0KSBcCi0gICA/IChTX1NFVF9TRUdNRU5UIChkZXN0LCBTX0dFVF9TRUdNRU5UIChzcmMpKSwgMCkgXAotICAgOiAwKQotI2Vsc2UKLSNkZWZpbmUgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMoZGVzdCxzcmMpIFwKLSAgKFNGX0dFVF9HRVRfU0VHTUVOVCAoZGVzdCkgJiYgU19HRVRfU0VHTUVOVCAoZGVzdCkgPT0gU0VHX1VOS05PV04gXAotICAgPyAoU19TRVRfU0VHTUVOVCAoZGVzdCwgU19HRVRfU0VHTUVOVCAoc3JjKSksIDApIFwKLSAgIDogMCkKLSNlbmRpZgotI2VuZGlmCi0KLS8qIHNhbml0eSBjaGVjayAqLwotCi0jaWZkZWYgVENfSTk2MAotI2lmbmRlZiBDX0xFQUZTVEFUCi1oZXkgISBXaGVyZSBpcyB0aGUgQ19MRUFGU1RBVCBkZWZpbml0aW9uID8gaTk2MCAtIGNvZmYgc3VwcG9ydCBpcyBkZXBlbmRpbmcgb24gaXQuCi0jZW5kaWYgLyogbm8gQ19MRUFGU1RBVCAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotI2Vsc2UgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIFRDX0EyOUsKLS8qIEFsbG93IHRyYW5zbGF0ZSBmcm9tIGFvdXQgcmVsb2NzIHRvIGNvZmYgcmVsb2NzICovCi0jZGVmaW5lIE5PX1JFTE9DIDIwCi0jZGVmaW5lIFJFTE9DXzMyIDEKLSNkZWZpbmUgUkVMT0NfOCAyCi0jZGVmaW5lIFJFTE9DX0NPTlNUIDMKLSNkZWZpbmUgUkVMT0NfQ09OU1RIIDQKLSNkZWZpbmUgUkVMT0NfSlVNUFRBUkcgNQotI2RlZmluZSBSRUxPQ19CQVNFMjIgNgotI2RlZmluZSBSRUxPQ19ISTIyIDcKLSNkZWZpbmUgUkVMT0NfTE8xMCA4Ci0jZGVmaW5lIFJFTE9DX0JBU0UxMyA5Ci0jZGVmaW5lIFJFTE9DX1dESVNQMjIgMTAKLSNkZWZpbmUgUkVMT0NfV0RJU1AzMCAxMQotI2VuZGlmCi0KLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsKLQotLyogTWFnaWMgbnVtYmVyIG9mIHBhZ2VkIGV4ZWN1dGFibGUuICovCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQkweDgzMDAKLQotCi0vKiBTWU1CT0wgVEFCTEUgKi8KLQotLyogU3ltYm9sIHRhYmxlIGVudHJ5IGRhdGEgdHlwZSAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBCYXNpYyBzeW1ib2wgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBvc3RfZW50cnk7Ci0gIC8qIEF1eGlsaWFyeSBlbnRyeS4gKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IG9zdF9hdXhlbnRbT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVNdOwotICAvKiBvYmpfY29mZiBpbnRlcm5hbCB1c2Ugb25seSBmbGFncyAqLwotICB1bnNpZ25lZCBpbnQgb3N0X2ZsYWdzOwotfSBvYmpfc3ltYm9sX3R5cGU7Ci0KLSNpZm5kZWYgRE9fTk9UX1NUUklQCi0jZGVmaW5lIERPX05PVF9TVFJJUAkwCi0jZW5kaWYKLS8qIFN5bWJvbCB0YWJsZSBtYWNyb3MgYW5kIGNvbnN0YW50cyAqLwotCi0vKiBQb3NzaWJsZSBhbmQgdXNlZnVsbCBzZWN0aW9uIG51bWJlciBpbiBzeW1ib2wgdGFibGUKLSAqIFRoZSB2YWx1ZXMgb2YgVEVYVCwgREFUQSBhbmQgQlNTIG1heSBub3QgYmUgcG9ydGFibGUuCi0gKi8KLQotI2RlZmluZSBDX0FCU19TRUNUSU9OCQlOX0FCUwotI2RlZmluZSBDX1VOREVGX1NFQ1RJT04JCU5fVU5ERUYKLSNkZWZpbmUgQ19ERUJVR19TRUNUSU9OCQlOX0RFQlVHCi0jZGVmaW5lIENfTlRWX1NFQ1RJT04JCU5fVFYKLSNkZWZpbmUgQ19QVFZfU0VDVElPTgkJUF9UVgotI2RlZmluZSBDX1JFR0lTVEVSX1NFQ1RJT04JNTAKLQotLyoKLSAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KLSAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFByZWRpY2F0ZXMgKi8KLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpICAgICAgICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19VTkRFRl9TRUNUSU9OKQotLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgOgotICAgc2VjdGlvbiA+IDAgKERBVEEsIFRFWFQgb3IgQlNTKQotICAgc2VjdGlvbiA9PSAwIGFuZCB2YWx1ZSA+IDAgKGV4dGVybmFsIGJzcyBzeW1ib2wpICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKSBcCi0gICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA+IENfVU5ERUZfU0VDVElPTiBcCi0gICB8fCAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19VTkRFRl9TRUNUSU9OIFwKLSAgICAgICAmJiBTX0dFVF9WQUxVRSAocykgPiAwKSBcCi0gICB8fCAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19BQlNfU0VDVElPTikpCi0vKiBUcnVlIGlmIGEgZGVidWcgc3BlY2lhbCBzeW1ib2wgZW50cnkgKi8KLSNkZWZpbmUgU19JU19ERUJVRyhzKQkJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfREVCVUdfU0VDVElPTikKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbG9jYWwgc3ltYm9sIG5hbWUgKi8KLS8qIEEgc3ltYm9sIG5hbWUgd2hvc2UgbmFtZSBpbmNsdWRlcyBeQSBpcyBhIGdhcyBpbnRlcm5hbCBwc2V1ZG8gc3ltYm9sICovCi0jZGVmaW5lIFNfSVNfTE9DQUwocykgXAotICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19SRUdJU1RFUl9TRUNUSU9OIFwKLSAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgISBmbGFnX2tlZXBfbG9jYWxzICYmICEgU19JU19ERUJVRyAocykpIFwKLSAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAxJykgIT0gTlVMTCBcCi0gICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKHMpLCAnXDAwMicpICE9IE5VTEwgXAotICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUgXAotICAgICAgICYmICFTX0lTX0VYVEVSTkFMKHMpIFwKLSAgICAgICAmJiAocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSBDX0FCU19TRUNUSU9OKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gMCBcCi0JCQkJICYmIFNfR0VUX1ZBTFVFIChzKSA9PSAwKQotLyoKLSAqIFRydWUgaWYgYSBzeW1ib2wgY2FuIGJlIG11bHRpcGx5IGRlZmluZWQgKGJzcyBzeW1ib2xzIGhhdmUgdGhpcyBkZWYKLSAqIHRob3VnaCBpdCBpcyBiYWQgcHJhY3RpY2UpCi0gKi8KLSNkZWZpbmUgU19JU19DT01NT04ocykJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSAwIFwKLQkJCQkgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCi0vKiBUcnVlIGlmIGEgc3ltYm9sIG5hbWUgaXMgaW4gdGhlIHN0cmluZyB0YWJsZSwgaS5lLiBpdHMgbGVuZ3RoIGlzID4gOC4gKi8KLSNkZWZpbmUgU19JU19TVFJJTkcocykJCShzdHJsZW4oU19HRVRfTkFNRShzKSkgPiA4ID8gMSA6IDApCi0KLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCBhcyB3ZWFrLiAgKi8KLSNpZmRlZiBURV9QRQotI2RlZmluZSBTX0lTX1dFQUsocykgXAotICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzID09IENfTlRfV0VBSyBcCi0gICB8fCAocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQotI2Vsc2UKLSNkZWZpbmUgU19JU19XRUFLKHMpIFwKLSAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQpCi0jZW5kaWYKLQotLyogQWNjZXNzb3JzICovCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgoY2hhciopKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0KQotLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX0dFVF9PRkZTRVQocykgICAgICAgICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0KQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19HRVRfU0VHTUVOVChzKSAgIHNfZ2V0X3NlZ21lbnQocykKLS8qIFRoZSBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgU19HRVRfREFUQV9UWVBFKHMpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl90eXBlKQotLyogVGhlIHN0b3JhZ2UgY2xhc3MgKi8KLSNkZWZpbmUgU19HRVRfU1RPUkFHRV9DTEFTUyhzKQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzKQotLyogVGhlIG51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcyAqLwotI2RlZmluZSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZKHMpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9udW1hdXgpCi0KLS8qIE1vZGlmaWVycyAqLwotLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0ID0gKHYpKQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9IFNFR01FTlRfVE9fU1lNQk9MX1RZUEUodikpCi0vKiBUaGUgZGF0YSB0eXBlICovCi0jZGVmaW5lIFNfU0VUX0RBVEFfVFlQRShzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl90eXBlID0gKHYpKQotLyogVGhlIHN0b3JhZ2UgY2xhc3MgKi8KLSNkZWZpbmUgU19TRVRfU1RPUkFHRV9DTEFTUyhzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MgPSAodikpCi0vKiBUaGUgbnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzICovCi0jZGVmaW5lIFNfU0VUX05VTUJFUl9BVVhJTElBUlkocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbnVtYXV4ID0gKHYpKQotCi0vKiBBZGRpdGlvbmFsIG1vZGlmaWVycyAqLwotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAoZG9lcyBub3QgbWVhbiB1bmRlZmluZWQpICovCi0jZGVmaW5lIFNfU0VUX0VYVEVSTkFMKHMpICAgICAgIHsgU19TRVRfU1RPUkFHRV9DTEFTUyhzLCBDX0VYVCkgOyBTRl9DTEVBUl9MT0NBTChzKTsgfQotCi0vKiBBdXhpbGlhcnkgZW50cnkgbWFjcm9zLiBTQV8gc3RhbmRzIGZvciBzeW1ib2wgYXV4aWxpYXJ5ICovCi0vKiBPbWl0IHRoZSB0diByZWxhdGVkIGZpZWxkcyAqLwotLyogQWNjZXNzb3JzICovCi0jZGVmaW5lIFNZTV9BVVhFTlQoUykJKCYoUyktPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdKQotCi0jZGVmaW5lIFNBX0dFVF9TWU1fVEFHTkRYKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF90YWduZHgubCkKLSNkZWZpbmUgU0FfR0VUX1NZTV9MTk5PKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFNBX0dFVF9TWU1fU0laRShzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBTQV9HRVRfU1lNX0ZTSVpFKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfZnNpemUpCi0jZGVmaW5lIFNBX0dFVF9TWU1fTE5OT1BUUihzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgU0FfR0VUX1NZTV9FTkRORFgocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sKQotI2RlZmluZSBTQV9HRVRfU1lNX0RJTUVOKHMsaSkJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV0pCi0jZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FKHMpCShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUpCi0jZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FX09GRlNFVChzKSAgKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9uLnhfb2Zmc2V0KQotI2RlZmluZSBTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyhzKSAgIChTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfbi54X3plcm9lcykKLSNkZWZpbmUgU0FfR0VUX1NDTl9TQ05MRU4ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgU0FfR0VUX1NDTl9OUkVMT0MocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25yZWxvYykKLSNkZWZpbmUgU0FfR0VUX1NDTl9OTElOTk8ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25saW5ubykKLQotLyogTW9kaWZpZXJzICovCi0jZGVmaW5lIFNBX1NFVF9TWU1fVEFHTkRYKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X3RhZ25keC5sPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9MTk5PKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubz0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fU0laRShzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0ZTSVpFKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZT0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fTE5OT1BUUihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9FTkRORFgocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0RJTUVOKHMsaSx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bKGkpXT0odikpCi0jZGVmaW5lIFNBX1NFVF9GSUxFX0ZOQU1FKHMsdikJc3RybmNweShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUsKHYpLEZJTE5NTEVOKQotI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRV9PRkZTRVQocyx2KSAoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X24ueF9vZmZzZXQ9KHYpKQotI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRV9aRVJPUyhzLHYpICAoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X24ueF96ZXJvZXM9KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX1NDTkxFTihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW49KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05SRUxPQyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2M9KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05MSU5OTyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm89KHYpKQotCi0vKgotICogSW50ZXJuYWwgdXNlIG9ubHkgZGVmaW5pdGlvbnMuIFNGXyBzdGFuZHMgZm9yIHN5bWJvbCBmbGFncy4KLSAqCi0gKiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIHRvIHN5X3N5bWJvbC5vc3RfZmxhZ3MgZmllbGQgb2YgYSBzeW1ib2xTLgotICoKLSAqIFlvdSdsbCBicmVhayBpOTYwIGlmIHlvdSBzaGlmdCB0aGUgU1lTUFJPQyBiaXRzIGFueXdoZXJlIGVsc2UuICBmb3IKLSAqIG1vcmUgb24gdGhlIGJhbG5hbWUvY2FsbG5hbWUgaGFjaywgc2VlIHRjLWk5NjAuaC4gIGIub3V0IGlzIGRvbmUKLSAqIGRpZmZlcmVudGx5LgotICovCi0KLSNkZWZpbmUgU0ZfSTk2MF9NQVNLCSgweDAwMDAwMWZmKQkvKiBCaXRzIDAtOCBhcmUgdXNlZCBieSB0aGUgaTk2MCBwb3J0LiAqLwotI2RlZmluZSBTRl9TWVNQUk9DCSgweDAwMDAwMDNmKQkvKiBiaXRzIDAtNSBhcmUgdXNlZCB0byBzdG9yZSB0aGUgc3lzcHJvYyBudW1iZXIgKi8KLSNkZWZpbmUgU0ZfSVNfU1lTUFJPQwkoMHgwMDAwMDA0MCkJLyogYml0IDYgbWFya3Mgc3ltYm9scyB0aGF0IGFyZSBzeXNwcm9jcyAqLwotI2RlZmluZSBTRl9CQUxOQU1FCSgweDAwMDAwMDgwKQkvKiBiaXQgNyBtYXJrcyBCQUxOQU1FIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfQ0FMTE5BTUUJKDB4MDAwMDAxMDApCS8qIGJpdCA4IG1hcmtzIENBTExOQU1FIHN5bWJvbHMgKi8KLQotI2RlZmluZSBTRl9OT1JNQUxfTUFTSwkoMHgwMDAwZmZmZikJLyogYml0cyAxMi0xNSBhcmUgZ2VuZXJhbCBwdXJwb3NlLiAqLwotCi0jZGVmaW5lIFNGX1NUQVRJQ1MJKDB4MDAwMDEwMDApCS8qIE1hcmsgdGhlIC50ZXh0ICYgYWxsIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfREVGSU5FRAkoMHgwMDAwMjAwMCkJLyogU3ltYm9sIGlzIGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNGX1NUUklORwkoMHgwMDAwNDAwMCkJLyogU3ltYm9sIG5hbWUgbGVuZ3RoID4gOCAqLwotI2RlZmluZSBTRl9MT0NBTAkoMHgwMDAwODAwMCkJLyogU3ltYm9sIG11c3Qgbm90IGJlIGVtaXR0ZWQgKi8KLQotI2RlZmluZSBTRl9ERUJVR19NQVNLCSgweGZmZmYwMDAwKQkvKiBiaXRzIDE2LTMxIGFyZSBkZWJ1ZyBpbmZvICovCi0KLSNkZWZpbmUgU0ZfRlVOQ1RJT04JKDB4MDAwMTAwMDApCS8qIFRoZSBzeW1ib2wgaXMgYSBmdW5jdGlvbiAqLwotI2RlZmluZSBTRl9QUk9DRVNTCSgweDAwMDIwMDAwKQkvKiBQcm9jZXNzIHN5bWJvbCBiZWZvcmUgd3JpdGUgKi8KLSNkZWZpbmUgU0ZfVEFHR0VECSgweDAwMDQwMDAwKQkvKiBJcyBhc3NvY2lhdGVkIHdpdGggYSB0YWcgKi8KLSNkZWZpbmUgU0ZfVEFHCQkoMHgwMDA4MDAwMCkJLyogSXMgYSB0YWcgKi8KLSNkZWZpbmUgU0ZfREVCVUcJKDB4MDAxMDAwMDApCS8qIElzIGluIGRlYnVnIG9yIGFicyBzZWN0aW9uICovCi0jZGVmaW5lIFNGX0dFVF9TRUdNRU5UCSgweDAwMjAwMDAwKQkvKiBHZXQgdGhlIHNlY3Rpb24gb2YgdGhlIGZvcndhcmQgc3ltYm9sLiAqLwotI2RlZmluZSBTRl9BREpfTE5OT1BUUgkoMHgwMDQwMDAwMCkJLyogSGFzIGEgbG5ub3B0ciAqLwotLyogQWxsIG90aGVyIGJpdHMgYXJlIHVudXNlZC4gKi8KLQotLyogQWNjZXNzb3JzICovCi0jZGVmaW5lIFNGX0dFVChzKQkJKChzKS0+c3lfc3ltYm9sLm9zdF9mbGFncykKLSNkZWZpbmUgU0ZfR0VUX05PUk1BTF9GSUVMRChzKQkoU0ZfR0VUIChzKSAmIFNGX05PUk1BTF9NQVNLKQotI2RlZmluZSBTRl9HRVRfREVCVUdfRklFTEQocykJKFNGX0dFVCAocykgJiBTRl9ERUJVR19NQVNLKQotI2RlZmluZSBTRl9HRVRfRklMRShzKQkJKFNGX0dFVCAocykgJiBTRl9GSUxFKQotI2RlZmluZSBTRl9HRVRfU1RBVElDUyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NUQVRJQ1MpCi0jZGVmaW5lIFNGX0dFVF9ERUZJTkVEKHMpCShTRl9HRVQgKHMpICYgU0ZfREVGSU5FRCkKLSNkZWZpbmUgU0ZfR0VUX1NUUklORyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NUUklORykKLSNkZWZpbmUgU0ZfR0VUX0xPQ0FMKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0xPQ0FMKQotI2RlZmluZSBTRl9HRVRfRlVOQ1RJT04ocykgICAgICAoU0ZfR0VUIChzKSAmIFNGX0ZVTkNUSU9OKQotI2RlZmluZSBTRl9HRVRfUFJPQ0VTUyhzKQkoU0ZfR0VUIChzKSAmIFNGX1BST0NFU1MpCi0jZGVmaW5lIFNGX0dFVF9ERUJVRyhzKQkJKFNGX0dFVCAocykgJiBTRl9ERUJVRykKLSNkZWZpbmUgU0ZfR0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSAmIFNGX1RBR0dFRCkKLSNkZWZpbmUgU0ZfR0VUX1RBRyhzKQkJKFNGX0dFVCAocykgJiBTRl9UQUcpCi0jZGVmaW5lIFNGX0dFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSAmIFNGX0dFVF9TRUdNRU5UKQotI2RlZmluZSBTRl9HRVRfQURKX0xOTk9QVFIocykJKFNGX0dFVCAocykgJiBTRl9BREpfTE5OT1BUUikKLSNkZWZpbmUgU0ZfR0VUX0k5NjAocykJCShTRl9HRVQgKHMpICYgU0ZfSTk2MF9NQVNLKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0JBTE5BTUUocykJKFNGX0dFVCAocykgJiBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpICYgU0ZfQ0FMTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfSVNfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSAmIFNGX0lTX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotCi0vKiBNb2RpZmllcnMgKi8KLSNkZWZpbmUgU0ZfU0VUKHMsdikJCShTRl9HRVQgKHMpID0gKHYpKQotI2RlZmluZSBTRl9TRVRfTk9STUFMX0ZJRUxEKHMsdikoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfTk9STUFMX01BU0spKQotI2RlZmluZSBTRl9TRVRfREVCVUdfRklFTEQocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfREVCVUdfTUFTSykpCi0jZGVmaW5lIFNGX1NFVF9GSUxFKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9GSUxFKQotI2RlZmluZSBTRl9TRVRfU1RBVElDUyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9TVEFUSUNTKQotI2RlZmluZSBTRl9TRVRfREVGSU5FRChzKQkoU0ZfR0VUIChzKSB8PSBTRl9ERUZJTkVEKQotI2RlZmluZSBTRl9TRVRfU1RSSU5HKHMpCShTRl9HRVQgKHMpIHw9IFNGX1NUUklORykKLSNkZWZpbmUgU0ZfU0VUX0xPQ0FMKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9MT0NBTCkKLSNkZWZpbmUgU0ZfQ0xFQVJfTE9DQUwocykJKFNGX0dFVCAocykgJj0gflNGX0xPQ0FMKQotI2RlZmluZSBTRl9TRVRfRlVOQ1RJT04ocykgICAgICAoU0ZfR0VUIChzKSB8PSBTRl9GVU5DVElPTikKLSNkZWZpbmUgU0ZfU0VUX1BST0NFU1MocykJKFNGX0dFVCAocykgfD0gU0ZfUFJPQ0VTUykKLSNkZWZpbmUgU0ZfU0VUX0RFQlVHKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9ERUJVRykKLSNkZWZpbmUgU0ZfU0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSB8PSBTRl9UQUdHRUQpCi0jZGVmaW5lIFNGX1NFVF9UQUcocykJCShTRl9HRVQgKHMpIHw9IFNGX1RBRykKLSNkZWZpbmUgU0ZfU0VUX0dFVF9TRUdNRU5UKHMpCShTRl9HRVQgKHMpIHw9IFNGX0dFVF9TRUdNRU5UKQotI2RlZmluZSBTRl9TRVRfQURKX0xOTk9QVFIocykJKFNGX0dFVCAocykgfD0gU0ZfQURKX0xOTk9QVFIpCi0jZGVmaW5lIFNGX1NFVF9JOTYwKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0k5NjBfTUFTSykpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSB8PSBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpIHw9IFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgfD0gU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9TWVNQUk9DKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX1NZU1BST0MpKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0vKgotICogRmlsZSBwb3NpdGlvbiBjYWxjdWxhdG9ycy4gQmV3YXJlIHRvIHVzZSB0aGVtIHdoZW4gYWxsIHRoZQotICogYXBwcm9wcmlhdGUgZmllbGRzIGFyZSBzZXQgaW4gdGhlIGhlYWRlci4KLSAqLwotCi0jaWZkZWYgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKLSNkZWZpbmUgT0JKX0NPRkZfQU9VVEhEUlNaICgwKQotI2Vsc2UKLSNkZWZpbmUgT0JKX0NPRkZfQU9VVEhEUlNaIChBT1VUSERSU1opCi0jZW5kaWYgLyogT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIgKi8KLQotI2RlZmluZSBIX0dFVF9GSUxFX1NJWkUoaCkgXAotICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCi0JICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaICsgXAotCSAgIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKLQkgICBIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoaCkgKyBIX0dFVF9MSU5FTk9fU0laRShoKSArIFwKLQkgICBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKSArIFwKLQkgICAoaCktPnN0cmluZ190YWJsZV9zaXplKQotI2RlZmluZSBIX0dFVF9URVhUX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWikKLSNkZWZpbmUgSF9HRVRfREFUQV9GSUxFX09GRlNFVChoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCi0JICAgSF9HRVRfVEVYVF9TSVpFKGgpKQotI2RlZmluZSBIX0dFVF9CU1NfRklMRV9PRkZTRVQoaCkgMAotI2RlZmluZSBIX0dFVF9SRUxPQ0FUSU9OX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKLQkgICBIX0dFVF9URVhUX1NJWkUoaCkgKyBIX0dFVF9EQVRBX1NJWkUoaCkpCi0jZGVmaW5lIEhfR0VUX0xJTkVOT19GSUxFX09GRlNFVChoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCi0JICAgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpICsgXAotCSAgIEhfR0VUX1JFTE9DQVRJT05fU0laRShoKSkKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKLQkgICBIX0dFVF9URVhUX1NJWkUoaCkgKyBIX0dFVF9EQVRBX1NJWkUoaCkgKyBcCi0JICAgSF9HRVRfUkVMT0NBVElPTl9TSVpFKGgpICsgSF9HRVRfTElORU5PX1NJWkUoaCkpCi0KLS8qIEFjY2Vzc29ycyAqLwotLyogYW91dGhkciAqLwotI2RlZmluZSBIX0dFVF9NQUdJQ19OVU1CRVIoaCkgICAgICAgICAgICgoaCktPmFvdXRoZHIubWFnaWMpCi0jZGVmaW5lIEhfR0VUX1ZFUlNJT05fU1RBTVAoaCkJCSgoaCktPmFvdXRoZHIudnN0YW1wKQotI2RlZmluZSBIX0dFVF9URVhUX1NJWkUoaCkgICAgICAgICAgICAgICgoaCktPmFvdXRoZHIudHNpemUpCi0jZGVmaW5lIEhfR0VUX0RBVEFfU0laRShoKSAgICAgICAgICAgICAgKChoKS0+YW91dGhkci5kc2l6ZSkKLSNkZWZpbmUgSF9HRVRfQlNTX1NJWkUoaCkgICAgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmJzaXplKQotI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKSAgICAgICAgICAgICgoaCktPmFvdXRoZHIuZW50cnkpCi0jZGVmaW5lIEhfR0VUX1RFWFRfU1RBUlQoaCkJCSgoaCktPmFvdXRoZHIudGV4dF9zdGFydCkKLSNkZWZpbmUgSF9HRVRfREFUQV9TVEFSVChoKQkJKChoKS0+YW91dGhkci5kYXRhX3N0YXJ0KQotLyogZmlsZWhkciAqLwotI2RlZmluZSBIX0dFVF9GSUxFX01BR0lDX05VTUJFUihoKQkoKGgpLT5maWxlaGRyLmZfbWFnaWMpCi0jZGVmaW5lIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKQkoKGgpLT5maWxlaGRyLmZfbnNjbnMpCi0jZGVmaW5lIEhfR0VUX1RJTUVfU1RBTVAoaCkJCSgoaCktPmZpbGVoZHIuZl90aW1kYXQpCi0jZGVmaW5lIEhfR0VUX1NZTUJPTF9UQUJMRV9QT0lOVEVSKGgpCSgoaCktPmZpbGVoZHIuZl9zeW1wdHIpCi0jZGVmaW5lIEhfR0VUX1NZTUJPTF9DT1VOVChoKQkJKChoKS0+ZmlsZWhkci5mX25zeW1zKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKQkoSF9HRVRfU1lNQk9MX0NPVU5UKGgpICogU1lNRVNaKQotI2RlZmluZSBIX0dFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSKGgpCSgoaCktPmZpbGVoZHIuZl9vcHRoZHIpCi0jZGVmaW5lIEhfR0VUX0ZMQUdTKGgpCQkJKChoKS0+ZmlsZWhkci5mX2ZsYWdzKQotLyogRXh0cmEgZmllbGRzIHRvIGFjaGlldmUgYnNkIGEub3V0IGNvbXBhdGliaWxpdHkgYW5kIGZvciBjb252ZW5pZW5jZSAqLwotI2RlZmluZSBIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoaCkgICAJKChoKS0+cmVsb2NhdGlvbl9zaXplKQotI2RlZmluZSBIX0dFVF9TVFJJTkdfU0laRShoKSAgICAgICAgICAgICgoaCktPnN0cmluZ190YWJsZV9zaXplKQotI2RlZmluZSBIX0dFVF9MSU5FTk9fU0laRShoKSAgICAgICAgICAgICgoaCktPmxpbmVub19zaXplKQotCi0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZGVmaW5lIEhfR0VUX0hFQURFUl9TSVpFKGgpCQkoc2l6ZW9mKEZJTEhEUikgXAotCQkJCQkgKyBzaXplb2YoQU9VVEhEUilcCi0JCQkJCSArIChIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1opKQotI2Vsc2UgLyogT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIgKi8KLSNkZWZpbmUgSF9HRVRfSEVBREVSX1NJWkUoaCkJCShzaXplb2YoRklMSERSKSBcCi0JCQkJCSArIChIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1opKQotI2VuZGlmIC8qIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSICovCi0KLSNkZWZpbmUgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkJKHRleHRfc2VjdGlvbl9oZWFkZXIuc19ucmVsb2MgKiBSRUxTWikKLSNkZWZpbmUgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkJKGRhdGFfc2VjdGlvbl9oZWFkZXIuc19ucmVsb2MgKiBSRUxTWikKLQotLyogTW9kaWZpZXJzICovCi0vKiBhb3V0aGRyICovCi0jZGVmaW5lIEhfU0VUX01BR0lDX05VTUJFUihoLHYpICAgICAgICAgKChoKS0+YW91dGhkci5tYWdpYyA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfVkVSU0lPTl9TVEFNUChoLHYpCSgoaCktPmFvdXRoZHIudnN0YW1wID0gKHYpKQotI2RlZmluZSBIX1NFVF9URVhUX1NJWkUoaCx2KSAgICAgICAgICAgICgoaCktPmFvdXRoZHIudHNpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpICAgICAgICAgICAgKChoKS0+YW91dGhkci5kc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KSAgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9FTlRSWV9QT0lOVChoLHYpICAgICAgICAgICgoaCktPmFvdXRoZHIuZW50cnkgPSAodikpCi0jZGVmaW5lIEhfU0VUX1RFWFRfU1RBUlQoaCx2KQkJKChoKS0+YW91dGhkci50ZXh0X3N0YXJ0ID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NUQVJUKGgsdikJCSgoaCktPmFvdXRoZHIuZGF0YV9zdGFydCA9ICh2KSkKLS8qIGZpbGVoZHIgKi8KLSNkZWZpbmUgSF9TRVRfRklMRV9NQUdJQ19OVU1CRVIoaCx2KQkoKGgpLT5maWxlaGRyLmZfbWFnaWMgPSAodikpCi0jZGVmaW5lIEhfU0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoLHYpCSgoaCktPmZpbGVoZHIuZl9uc2NucyA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfVElNRV9TVEFNUChoLHYpCQkoKGgpLT5maWxlaGRyLmZfdGltZGF0ID0gKHYpKQotI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfUE9JTlRFUihoLHYpCSgoaCktPmZpbGVoZHIuZl9zeW1wdHIgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgsdikgICAgKChoKS0+ZmlsZWhkci5mX25zeW1zID0gKHYpKQotI2RlZmluZSBIX1NFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSKGgsdikgKChoKS0+ZmlsZWhkci5mX29wdGhkciA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfRkxBR1MoaCx2KQkJKChoKS0+ZmlsZWhkci5mX2ZsYWdzID0gKHYpKQotLyogRXh0cmEgZmllbGRzIHRvIGFjaGlldmUgYnNkIGEub3V0IGNvbXBhdGliaWxpdHkgYW5kIGZvciBjb252aW5pZW5jZSAqLwotI2RlZmluZSBIX1NFVF9SRUxPQ0FUSU9OX1NJWkUoaCx0LGQpIAkoKGgpLT5yZWxvY2F0aW9uX3NpemUgPSAodCkrKGQpKQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpICAgICAgICAgICgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9MSU5FTk9fU0laRShoLHYpICAgICAgICAgICgoaCktPmxpbmVub19zaXplID0gKHYpKQotCi0vKiBTZWdtZW50IGZsaXBwaW5nICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGFvdXRoZHI7CS8qIGEub3V0IGhlYWRlciAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBmaWxlaGRyOwkvKiBGaWxlIGhlYWRlciwgbm90IG1hY2hpbmUgZGVwLiAqLwotICBsb25nIHN0cmluZ190YWJsZV9zaXplOwkvKiBuYW1lcyArICdcMCcgKyBzaXplb2YoaW50KSAqLwotICBsb25nIHJlbG9jYXRpb25fc2l6ZTsJLyogQ3VtdWxhdGVkIHNpemUgb2YgcmVsb2NhdGlvbgotCQkJICAgaW5mb3JtYXRpb24gZm9yIGFsbCBzZWN0aW9ucyBpbgotCQkJICAgYnl0ZXMuICovCi0gIGxvbmcgbGluZW5vX3NpemU7CQkvKiBTaXplIG9mIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbgotCQkJCSAgIHRhYmxlIGluIGJ5dGVzICovCi19IG9iamVjdF9oZWFkZXJzOwotCi0KLQotc3RydWN0IGxpbmVub19saXN0Ci17Ci0gIHN0cnVjdCBiZmRfaW50ZXJuYWxfbGluZW5vIGxpbmU7Ci0gIGNoYXIgKmZyYWc7CQkJLyogRnJhZyB0byB3aGljaCB0aGUgbGluZSBudW1iZXIgaXMgcmVsYXRlZCAqLwotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKm5leHQ7CS8qIEZvcndhcmQgY2hhaW4gcG9pbnRlciAqLwotfTsKLQotCi0KLQotI2RlZmluZSBvYmpfc2VnbWVudF9uYW1lKGkpIChzZWdtZW50X2luZm9bKGludCkgKGkpXS5zY25oZHIuc19uYW1lKQotCi0jZGVmaW5lIG9ial9hZGRfc2VnbWVudChzKSBvYmpfY29mZl9hZGRfc2VnbWVudCAocykKLQotZXh0ZXJuIHNlZ1Qgb2JqX2NvZmZfYWRkX3NlZ21lbnQgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLWV4dGVybiB2b2lkIGNfZG90X2ZpbGVfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0jZGVmaW5lIG9ial9hcHBfZmlsZSBjX2RvdF9maWxlX3N5bWJvbAotZXh0ZXJuIHZvaWQgb2JqX2V4dHJhX3N0dWZmIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotCi1leHRlcm4gc2VnVCBzX2dldF9zZWdtZW50IFBBUkFNUyAoKHN5bWJvbFMgKnB0cikpOwotCi1leHRlcm4gdm9pZCBjX3NlY3Rpb25faGVhZGVyIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKiBoZWFkZXIsCi0JCQkJICAgICAgY2hhciAqbmFtZSwKLQkJCQkgICAgICBsb25nIGNvcmVfYWRkcmVzcywKLQkJCQkgICAgICBsb25nIHNpemUsCi0JCQkJICAgICAgbG9uZyBkYXRhX3B0ciwKLQkJCQkgICAgICBsb25nIHJlbG9jX3B0ciwKLQkJCQkgICAgICBsb25nIGxpbmVub19wdHIsCi0JCQkJICAgICAgbG9uZyByZWxvY19udW1iZXIsCi0JCQkJICAgICAgbG9uZyBsaW5lbm9fbnVtYmVyLAotCQkJCSAgICAgIGxvbmcgYWxpZ25tZW50KSk7Ci0KLSNpZm5kZWYgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rCi12b2lkIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNlbmRpZgotCi0vKiBzYW5pdHkgY2hlY2sgKi8KLQotI2lmZGVmIFRDX0k5NjAKLSNpZm5kZWYgQ19MRUFGU1RBVAotaGV5ICEgV2hlcmUgaXMgdGhlIENfTEVBRlNUQVQgZGVmaW5pdGlvbiA/IGk5NjAgLSBjb2ZmIHN1cHBvcnQgaXMgZGVwZW5kaW5nIG9uIGl0LgotI2VuZGlmIC8qIG5vIENfTEVBRlNUQVQgKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi1leHRlcm4gc3RydWN0IGludGVybmFsX3NjbmhkciBkYXRhX3NlY3Rpb25faGVhZGVyOwotZXh0ZXJuIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgdGV4dF9zZWN0aW9uX2hlYWRlcjsKLQotLyogRm9yd2FyZCB0aGUgc2VnbWVudCBvZiBhIGZvcndhcmRlZCBzeW1ib2wuICAqLwotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhkZXN0LHNyYykgXAotICAoU0ZfR0VUX0dFVF9TRUdNRU5UIChkZXN0KSBcCi0gICA/IChTX1NFVF9TRUdNRU5UIChkZXN0LCBTX0dFVF9TRUdNRU5UIChzcmMpKSwgMCkgXAotICAgOiAwKQotCi0jaWZkZWYgVEVfUEUKLSNkZWZpbmUgb2JqX2hhbmRsZV9saW5rX29uY2UodCkgb2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSAodCkKLWV4dGVybiB2b2lkIG9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UgKCk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLWV4dGVybiBjb25zdCBwc2V1ZG9fdHlwZVMgY29mZl9wc2V1ZG9fdGFibGVbXTsKLQotI2lmbmRlZiBvYmpfcG9wX2luc2VydAotI2RlZmluZSBvYmpfcG9wX2luc2VydCgpIHBvcF9pbnNlcnQgKGNvZmZfcHNldWRvX3RhYmxlKQotI2VuZGlmCi0KLS8qIEluIENPRkYsIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgdXNpbmcgLmRlZi8udmFsIFNZTS8uZW5kZWYsIGl0J3MgT0sKLSAgIHRvIHJlZGVmaW5lIHRoZSBzeW1ib2wgbGF0ZXIgb24uICBUaGlzIGNhbiBoYXBwZW4gaWYgQyBzeW1ib2xzIHVzZQotICAgYSBwcmVmaXgsIGFuZCBhIHN5bWJvbCBpcyBkZWZpbmVkIGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUgcHJlZml4LAotICAgYXMgaW4gc3RhcnQvX3N0YXJ0L19fc3RhcnQgaW4gZ2NjL2xpYmdjYzEtdGVzdC5jLiAgKi8KLSNkZWZpbmUgUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OKHN5bSkJCVwKLShTRl9HRVRfR0VUX1NFR01FTlQgKHN5bSkJCQkJXAotID8gKHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93LAkJCQlcCi0gICAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKSwJCQlcCi0gICAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKSwJCQlcCi0gICAgMCkJCQkJCQkJXAotIDogMCkKLQotLyogU3RhYnMgaW4gYSBjb2ZmIGZpbGUgZ28gaW50byB0aGVpciBvd24gc2VjdGlvbi4gICovCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgMQotCi0vKiBXZSBuZWVkIDEyIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiB0byBob2xkIHNvbWUgaW5pdGlhbAotICAgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0KLS8qIFN0b3JlIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgaW4gdGhlIHNlY3Rpb24gYXV4IGVudHJ5LiAgKi8KLSNkZWZpbmUgU0VUX1NFQ1RJT05fUkVMT0NTKHNlYywgcmVsb2NzLCBuKSBcCi0gIFNBX1NFVF9TQ05fTlJFTE9DIChzZWN0aW9uX3N5bWJvbCAoc2VjKSwgbikKLQotI2VuZGlmIC8qIE9CSl9GT1JNQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuYyBiL2dhcy9jb25maWcvb2JqLWVjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2N2RjNTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKiBFQ09GRiBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBUaGlzIGZpbGUgd2FzIHB1dCB0b2dldGhlciBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPQkpfSEVBREVSICJvYmotZWNvZmYuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJiZmQvbGliY29mZi5oIgotI2luY2x1ZGUgImJmZC9saWJlY29mZi5oIgotCi0vKiBBbG1vc3QgYWxsIG9mIHRoZSBFQ09GRiBzdXBwb3J0IGlzIGFjdHVhbGx5IGluIGVjb2ZmLmMgaW4gdGhlIG1haW4KLSAgIGdhcyBkaXJlY3RvcnkuICBUaGlzIGZpbGUgbW9zdGx5IGp1c3QgYXJyYW5nZXMgdG8gY2FsbCB0aGF0IG9uZSBhdAotICAgdGhlIHJpZ2h0IHRpbWVzLiAgKi8KLQotc3RhdGljIGludCBlY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWNvZmZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgcHNldWRvLW9wcyB3ZSBzdXBwb3J0IGluIHRoaXMgZmlsZS4gIE9ubHkgdGhvc2UKLSAgIHJlbGF0aW5nIHRvIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhcmUgc3VwcG9ydGVkIGhlcmUuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sKLSAgIHNob3VsZCBiZSBkZWZpbmVkIGhlcmUsIGJ1dCBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkOiAuYWVudCwKLSAgIC5iZ25iLCAuZW5kYiwgLnZlcnN0YW1wLCAudnJlZy4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKLSAgIE1JUFMgQ1BVIHNwZWNpZmljLCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgYnkgdGMtbWlwcy5jOiAuYWxpYXMsCi0gICAuZXh0ZXJuLCAuZ2FsaXZlLCAuZ2phbGRlZiwgLmdqcmxpdmUsIC5saXZlcmVnLCAubm9hbGlhcywgLm9wdGlvbiwKLSAgIC5yZGF0YSwgLnNkYXRhLCAuc2V0LgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rIGFyZQotICAgbm90IE1JUFMgQ1BVIHNwZWNpZmljLCBidXQgYXJlIGFsc28gbm90IEVDT0ZGIHNwZWNpZmljLiAgSSBoYXZlCi0gICBvbmx5IGxpc3RlZCB0aGUgb25lcyB3aGljaCBhcmUgbm90IGFscmVhZHkgaW4gcmVhZC5jLiAgSXQncyBub3QKLSAgIGNvbXBsZXRlbHkgY2xlYXIgd2hlcmUgdGhlc2Ugc2hvdWxkIGJlIGRlZmluZWQsIGJ1dCB0Yy1taXBzLmMgaXMKLSAgIHByb2JhYmx5IHRoZSBtb3N0IHJlYXNvbmFibGUgcGxhY2U6IC5hc2NpaXosIC5hc20wLCAuZW5kciwgLmVyciwKLSAgIC5oYWxmLCAubGFiLCAucmVwZWF0LCAuc3RydWN0LCAud2Vha2V4dC4gICovCi0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICAvKiBDT0ZGIHN0eWxlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gLmxuIGlzIG5vdCB1c2VkOyAubG9jIGlzIHVzZWQKLSAgICAgaW5zdGVhZC4gICovCi0gIHsgImRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9kZWYsCTAgfSwKLSAgeyAiZGltIiwJZWNvZmZfZGlyZWN0aXZlX2RpbSwJMCB9LAotICB7ICJlbmRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwJMCB9LAotICB7ICJmaWxlIiwJZWNvZmZfZGlyZWN0aXZlX2ZpbGUsCTAgfSwKLSAgeyAic2NsIiwJZWNvZmZfZGlyZWN0aXZlX3NjbCwJMCB9LAotICB7ICJzaXplIiwJZWNvZmZfZGlyZWN0aXZlX3NpemUsCTAgfSwKLSAgeyAiZXNpemUiLAllY29mZl9kaXJlY3RpdmVfc2l6ZSwJMCB9LAotICB7ICJ0YWciLAllY29mZl9kaXJlY3RpdmVfdGFnLAkwIH0sCi0gIHsgInR5cGUiLAllY29mZl9kaXJlY3RpdmVfdHlwZSwJMCB9LAotICB7ICJldHlwZSIsCWVjb2ZmX2RpcmVjdGl2ZV90eXBlLAkwIH0sCi0gIHsgInZhbCIsCWVjb2ZmX2RpcmVjdGl2ZV92YWwsCTAgfSwKLQotICAvKiBFQ09GRiBzcGVjaWZpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICB7ICJiZWdpbiIsCWVjb2ZmX2RpcmVjdGl2ZV9iZWdpbiwJMCB9LAotICB7ICJiZW5kIiwJZWNvZmZfZGlyZWN0aXZlX2JlbmQsCTAgfSwKLSAgeyAiZW5kIiwJZWNvZmZfZGlyZWN0aXZlX2VuZCwJMCB9LAotICB7ICJlbnQiLAllY29mZl9kaXJlY3RpdmVfZW50LAkwIH0sCi0gIHsgImZtYXNrIiwJZWNvZmZfZGlyZWN0aXZlX2ZtYXNrLAkwIH0sCi0gIHsgImZyYW1lIiwJZWNvZmZfZGlyZWN0aXZlX2ZyYW1lLAkwIH0sCi0gIHsgImxvYyIsCWVjb2ZmX2RpcmVjdGl2ZV9sb2MsCTAgfSwKLSAgeyAibWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9tYXNrLAkwIH0sCi0KLSAgLyogT3RoZXIgRUNPRkYgZGlyZWN0aXZlcy4gICovCi0gIHsgImV4dGVybiIsCWVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4sCTAgfSwKLQotI2lmbmRlZiBUQ19NSVBTCi0gIC8qIEZvciBUQ19NSVBTLCB0Yy1taXBzLmMgYWRkcyB0aGlzLiAqLwotICB7ICJ3ZWFrZXh0IiwJZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQsIDAgfSwKLSNlbmRpZgotCi0gIC8qIFRoZXNlIGFyZSB1c2VkIG9uIElyaXguICBJIGRvbid0IGtub3cgaG93IHRvIGltcGxlbWVudCB0aGVtLiAgKi8KLSAgeyAiYmduYiIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJlbmRiIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgInZlcnN0YW1wIiwJc19pZ25vcmUsCQkwIH0sCi0KLSAgLyogU2VudGluZWwuICAqLwotICB7IE5VTEwgfQotfTsKLQotLyogU3dhcCBvdXQgdGhlIHN5bWJvbHMgYW5kIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgQkZELiAgKi8KLQotdm9pZAotZWNvZmZfZnJvYl9maWxlICgpCi17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcAotICAgID0gJmVjb2ZmX2JhY2tlbmQgKHN0ZG91dHB1dCktPmRlYnVnX3N3YXA7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgSERSUiAqaGRyOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnNldDsKLQotICAvKiBTZXQgdGhlIHNlY3Rpb24gVk1BIHZhbHVlcy4gIFdlIGZvcmNlIHRoZSAuc2RhdGEgYW5kIC5zYnNzCi0gICAgIHNlY3Rpb25zIHRvIHRoZSBlbmQgdG8gZW5zdXJlIHRoYXQgdGhlaXIgVk1BIGFkZHJlc3NlcyBhcmUgY2xvc2UKLSAgICAgdG9nZXRoZXIgc28gdGhhdCB0aGUgR1AgcmVnaXN0ZXIgY2FuIGFkZHJlc3MgYm90aCBvZiB0aGVtLiAgV2UKLSAgICAgcHV0IHRoZSAuYnNzIHNlY3Rpb24gYWZ0ZXIgdGhlIC5zYnNzIHNlY3Rpb24uCi0KLSAgICAgQWxzbywgZm9yIHRoZSBBbHBoYSwgd2UgbXVzdCBzb3J0IHRoZSBzZWN0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkKLSAgICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgZmlsZSBpbiB0aGUgY29ycmVjdCBvcmRlci4gIChBY3R1YWxseSwgbWF5YmUKLSAgICAgdGhpcyBpcyBhIGpvYiBmb3IgQkZELiAgQnV0IHRoZSBWTUFzIGNvbXB1dGVkIHdvdWxkIGJlIG91dCBvZgotICAgICB3aGFjayBpZiB3ZSBjb21wdXRlZCB0aGVtIGdpdmVuIG91ciBpbml0aWFsLCByYW5kb20gb3JkZXJpbmcuCi0gICAgIEl0J3MgcG9zc2libGUgdGhhdCB0aGF0IHdvdWxkbid0IGJyZWFrIHRoaW5nczsgSSBjb3VsZCBkbyBzb21lCi0gICAgIGV4cGVyaW1lbnRpbmcgc29tZXRpbWUgYW5kIGZpbmQgb3V0LgotCi0gICAgIFRoaXMgb3V0cHV0IG9yZGVyaW5nIG9mIHNlY3Rpb25zIGlzIG1hZ2ljLCBvbiB0aGUgQWxwaGEsIGF0Ci0gICAgIGxlYXN0LiAgVGhlIC5saXRhIHNlY3Rpb24gbXVzdCBjb21lIGJlZm9yZSAubGl0OCBhbmQgLmxpdDQsCi0gICAgIG90aGVyd2lzZSB0aGUgT1NGLzEgbGlua2VyIG1heSBzaWxlbnRseSB0cmFzaCB0aGUgLmxpdHs0LDh9Ci0gICAgIHNlY3Rpb24gY29udGVudHMuICBBbHNvLCAudGV4dCBtdXN0IHByZWNlZWQgLnJkYXRhLiAgVGhlc2UgZGlmZmVyCi0gICAgIGZyb20gdGhlIG9yZGVyIGRlc2NyaWJlZCBpbiBzb21lIHBhcnRzIG9mIHRoZSBERUMgT1NGLzEgQXNzZW1ibHkKLSAgICAgTGFuZ3VhZ2UgUHJvZ3JhbW1lcidzIEd1aWRlLCBidXQgdGhhdCBvcmRlciBkb2Vzbid0IHNlZW0gdG8gd29yawotICAgICB3aXRoIHRoZWlyIGxpbmtlci4KLQotICAgICBJIGRvbid0IGtub3cgaWYgc2VjdGlvbiBvcmRlcmluZyBvbiB0aGUgTUlQUyBpcyBpbXBvcnRhbnQuICAqLwotCi0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1tdID0gewotICAgIC8qIHRleHQgc2VnbWVudCAqLwotICAgICIudGV4dCIsICIucmRhdGEiLCAiLmluaXQiLCAiLmZpbmkiLAotICAgIC8qIGRhdGEgc2VnbWVudCAqLwotICAgICIuZGF0YSIsICIubGl0YSIsICIubGl0OCIsICIubGl0NCIsICIuc2RhdGEiLCAiLmdvdCIsCi0gICAgLyogYnNzIHNlZ21lbnQgKi8KLSAgICAiLnNic3MiLCAiLmJzcyIsCi0gIH07Ci0jZGVmaW5lIG5fbmFtZXMgKHNpemVvZiAobmFtZXMpIC8gc2l6ZW9mIChuYW1lc1swXSkpCi0KLSAgYWRkciA9IDA7Ci0gIHsKLSAgICAvKiBTZWN0aW9ucyB0aGF0IG1hdGNoIG5hbWVzLCBvcmRlciB0byBiZSBzdHJhaWdodGVuZWQgb3V0IGxhdGVyLiAgKi8KLSAgICBhc2VjdGlvbiAqc2Vjc1tuX25hbWVzXTsKLSAgICAvKiBMaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyB3aXRoIG5vbi1tYXRjaGluZyBuYW1lcy4gIFJhbmRvbSBvcmRlcmluZy4gICovCi0gICAgYXNlY3Rpb24gKm90aGVyX3NlY3Rpb25zID0gMDsKLSAgICAvKiBQb2ludGVyIHRvIG5leHQgc2VjdGlvbiwgc2luY2Ugd2UncmUgZGVzdHJveWluZyB0aGUgb3JpZ2luYWwKLSAgICAgICBvcmRlcmluZy4gICovCi0gICAgYXNlY3Rpb24gKm5leHQ7Ci0KLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuX25hbWVzOyBpKyspCi0gICAgICBzZWNzW2ldID0gMDsKLSAgICBmb3IgKHNlYyA9IHN0ZG91dHB1dC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gbmV4dCkKLSAgICAgIHsKLQluZXh0ID0gc2VjLT5uZXh0OwotCWZvciAoaSA9IDA7IGkgPCBuX25hbWVzOyBpKyspCi0JICBpZiAoIXN0cmNtcCAoc2VjLT5uYW1lLCBuYW1lc1tpXSkpCi0JICAgIHsKLQkgICAgICBzZWNzW2ldID0gc2VjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JaWYgKGkgPT0gbl9uYW1lcykKLQkgIHsKLQkgICAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBzZWMsIGFkZHIpOwotCSAgICBhZGRyICs9IGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgc2VjKTsKLQkgICAgc2VjLT5uZXh0ID0gb3RoZXJfc2VjdGlvbnM7Ci0JICAgIG90aGVyX3NlY3Rpb25zID0gc2VjOwotCSAgfQotICAgICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBuX25hbWVzOyBpKyspCi0gICAgICBpZiAoc2Vjc1tpXSkKLQl7Ci0JICBzZWMgPSBzZWNzW2ldOwotCSAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBzZWMsIGFkZHIpOwotCSAgYWRkciArPSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYyk7Ci0JfQotICAgIGZvciAoaSA9IG5fbmFtZXMgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIGlmIChzZWNzW2ldKQotCXsKLQkgIHNlYyA9IHNlY3NbaV07Ci0JICBzZWMtPm5leHQgPSBvdGhlcl9zZWN0aW9uczsKLQkgIG90aGVyX3NlY3Rpb25zID0gc2VjOwotCX0KLSAgICBzdGRvdXRwdXQtPnNlY3Rpb25zID0gb3RoZXJfc2VjdGlvbnM7Ci0gIH0KLQotICAvKiBCdWlsZCB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgYXNzZXJ0IChlY29mZl9kYXRhIChzdGRvdXRwdXQpICE9IDApOwotICBoZHIgPSAmZWNvZmZfZGF0YSAoc3Rkb3V0cHV0KS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0gIGVjb2ZmX2J1aWxkX2RlYnVnIChoZHIsICZidWYsIGRlYnVnX3N3YXApOwotCi0gIC8qIEZpbmlzaCB1cCB0aGUgZWNvZmZfdGRhdGEgc3RydWN0dXJlLiAgKi8KLSAgc2V0ID0gYnVmOwotI2RlZmluZSBTRVQocHRyLCBjb3VudCwgdHlwZSwgc2l6ZSkgXAotICBpZiAoaGRyLT5jb3VudCA9PSAwKSBcCi0gICAgZWNvZmZfZGF0YSAoc3Rkb3V0cHV0KS0+ZGVidWdfaW5mby5wdHIgPSAodHlwZSkgTlVMTDsgXAotICBlbHNlIFwKLSAgICB7IFwKLSAgICAgIGVjb2ZmX2RhdGEgKHN0ZG91dHB1dCktPmRlYnVnX2luZm8ucHRyID0gKHR5cGUpIHNldDsgXAotICAgICAgc2V0ICs9IGhkci0+Y291bnQgKiBzaXplOyBcCi0gICAgfQotCi0gIFNFVCAobGluZSwgY2JMaW5lLCB1bnNpZ25lZCBjaGFyICosIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotICBTRVQgKGV4dGVybmFsX2RuciwgaWRuTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX2Rucl9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9wZHIsIGlwZE1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfc3ltLCBpc3ltTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9vcHQsIGlvcHRNYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUpOwotICBTRVQgKGV4dGVybmFsX2F1eCwgaWF1eE1heCwgdW5pb24gYXV4X2V4dCAqLCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgU0VUIChzcywgaXNzTWF4LCBjaGFyICosIHNpemVvZiAoY2hhcikpOwotICBTRVQgKHNzZXh0LCBpc3NFeHRNYXgsIGNoYXIgKiwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoZXh0ZXJuYWxfcmZkLCBjcmZkLCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX3JmZF9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9mZHIsIGlmZE1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfZXh0LCBpZXh0TWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLQotI3VuZGVmIFNFVAotCi0gIC8qIEZpbGwgaW4gdGhlIHJlZ2lzdGVyIG1hc2tzLiAgKi8KLSAgewotICAgIHVuc2lnbmVkIGxvbmcgZ3BybWFzayA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBmcHJtYXNrID0gMDsKLSAgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrID0gTlVMTDsKLQotI2lmZGVmIFRDX01JUFMKLSAgICAvKiBGaWxsIGluIHRoZSBNSVBTIHJlZ2lzdGVyIG1hc2tzLiAgSXQncyBwcm9iYWJseSBub3Qgd29ydGgKLSAgICAgICBzZXR0aW5nIHVwIGEgZ2VuZXJpYyBpbnRlcmZhY2UgZm9yIHRoaXMuICAqLwotICAgIGdwcm1hc2sgPSBtaXBzX2dwcm1hc2s7Ci0gICAgY3BybWFzayA9IG1pcHNfY3BybWFzazsKLSNlbmRpZgotCi0jaWZkZWYgVENfQUxQSEEKLSAgICBhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEgKCk7Ci0KLSAgICBpZiAoISBiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlIChzdGRvdXRwdXQsIGFscGhhX2dwX3ZhbHVlKSkKLSAgICAgIGFzX2ZhdGFsIChfKCJDYW4ndCBzZXQgR1AgdmFsdWUiKSk7Ci0KLSAgICBncHJtYXNrID0gYWxwaGFfZ3BybWFzazsKLSAgICBmcHJtYXNrID0gYWxwaGFfZnBybWFzazsKLSNlbmRpZgotCi0gICAgaWYgKCEgYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyAoc3Rkb3V0cHV0LCBncHJtYXNrLCBmcHJtYXNrLCBjcHJtYXNrKSkKLSAgICAgIGFzX2ZhdGFsIChfKCJDYW4ndCBzZXQgcmVnaXN0ZXIgbWFza3MiKSk7Ci0gIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIEVDT0ZGIGNvZGUgdG8gc2V0IHRoZSBleHRlcm5hbCBpbmZvcm1hdGlvbgotICAgZm9yIGEgc3ltYm9sLiAgV2UganVzdCBwYXNzIGl0IG9uIHRvIEJGRCwgd2hpY2ggZXhwZWN0cyB0aGUgc3dhcHBlZAotICAgaW5mb3JtYXRpb24gdG8gYmUgc3RvcmVkIGluIHRoZSBuYXRpdmUgZmllbGQgb2YgdGhlIHN5bWJvbC4gICovCi0KLXZvaWQKLW9ial9lY29mZl9zZXRfZXh0IChzeW0sIGV4dCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBFWFRSICpleHQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcAotICAgID0gJmVjb2ZmX2JhY2tlbmQgKHN0ZG91dHB1dCktPmRlYnVnX3N3YXA7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICplc3ltOwotCi0gIGtub3cgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKQotCT09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cik7Ci0gIGVzeW0gPSBlY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpOwotICBlc3ltLT5sb2NhbCA9IGZhbHNlOwotICBlc3ltLT5uYXRpdmUgPSB4bWFsbG9jIChkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7Ci0gICgqZGVidWdfc3dhcC0+c3dhcF9leHRfb3V0KSAoc3Rkb3V0cHV0LCBleHQsIGVzeW0tPm5hdGl2ZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sIChzeW0sIHB1bnRwKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGludCAqcHVudHA7Ci17Ci0gIGVjb2ZmX2Zyb2Jfc3ltYm9sIChzeW0pOwotfQotCi1zdGF0aWMgdm9pZAotZWNvZmZfcG9wX2luc2VydCAoKQotewotICBwb3BfaW5zZXJ0IChvYmpfcHNldWRvX3RhYmxlKTsKLX0KLQotY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWNvZmZfZm9ybWF0X29wcyA9Ci17Ci0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgMCwJLyogZGZsX2xlYWRpbmdfdW5kZXJzY29yZSAqLwotICAxLAkvKiBlbWl0X3NlY3Rpb25fc3ltYm9scyAqLwotICBvYmpfZWNvZmZfZnJvYl9zeW1ib2wsCi0gIGVjb2ZmX2Zyb2JfZmlsZSwKLSAgMCwJLyogZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAqLwotICAwLAkvKiBzX2dldF9zaXplICovCi0gIDAsCS8qIHNfc2V0X3NpemUgKi8KLSAgMCwJLyogc19nZXRfYWxpZ24gKi8KLSAgMCwJLyogc19zZXRfYWxpZ24gKi8KLSAgMCwJLyogc19nZXRfb3RoZXIgKi8KLSAgMCwJLyogc19nZXRfZGVzYyAqLwotICAwLAkvKiBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzICovCi0gIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8sCi0gIGVjb2ZmX3N0YWIsCi0gIGVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jLAotICBlY29mZl9wb3BfaW5zZXJ0LAotICBlY29mZl9zZXRfZXh0LAotICBlY29mZl9yZWFkX2JlZ2luX2hvb2ssCi0gIGVjb2ZmX3N5bWJvbF9uZXdfaG9vaywKLX07CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1lY29mZi5oIGIvZ2FzL2NvbmZpZy9vYmotZWNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjYTI1NC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1lY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogRUNPRkYgb2JqZWN0IGZpbGUgZm9ybWF0IGhlYWRlciBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPQkpfRUNPRkYgMQotCi0vKiBVc2UgdGhlIGdlbmVyaWMgRUNPRkYgZGVidWdnaW5nIGNvZGUuICAqLwotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMQotCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotLyogRm9yIGVhY2ggZ2FzIHN5bWJvbCB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIGZpbGUgaXQgY2FtZSBmcm9tLCBvZgotICAgd2hldGhlciB3ZSBoYXZlIGdlbmVyYXRlZCBhbiBFQ09GRiBzeW1ib2wgZm9yIGl0LCBhbmQgd2hldGhlciB0aGUKLSAgIHN5bWJvbHMgaXMgdW5kZWZpbmVkICh0aGlzIGxhc3QgaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGEgLmV4dGVybgotICAgc3ltYm9scyBmcm9tIGEgLmNvbW0gc3ltYm9sKS4gICovCi0KLXN0cnVjdCBlY29mZl9zeV9vYmoKLXsKLSAgc3RydWN0IGVmZHIgKmVjb2ZmX2ZpbGU7Ci0gIHN0cnVjdCBsb2NhbHN5bSAqZWNvZmZfc3ltYm9sOwotICB2YWx1ZVQgZWNvZmZfZXh0ZXJuX3NpemU7Ci19OwotCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHN0cnVjdCBlY29mZl9zeV9vYmoKLQotLyogTW9kaWZ5IHRoZSBFQ09GRiBzeW1ib2wuICAqLwotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woc3ltcCwgcHVudCkgZWNvZmZfZnJvYl9zeW1ib2wgKHN5bXApCi0KLS8qIFRoaXMgaXMgdXNlZCB0byB3cml0ZSB0aGUgc3ltYm9saWMgZGF0YSBpbiB0aGUgZm9ybWF0IHRoYXQgQkZECi0gICBleHBlY3RzIGl0LiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG9ial9mcm9iX2ZpbGUoKSBlY29mZl9mcm9iX2ZpbGUgKCkKLQotLyogV2UgdXNlIHRoZSBFQ09GRiBmdW5jdGlvbnMgYXMgb3VyIGhvb2tzLiAgKi8KLSNkZWZpbmUgb2JqX3JlYWRfYmVnaW5faG9vayBlY29mZl9yZWFkX2JlZ2luX2hvb2sKLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayBlY29mZl9zeW1ib2xfbmV3X2hvb2sKLQotLyogUmVjb3JkIGZpbGUgc3dpdGNoZXMgaW4gdGhlIEVDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0jZGVmaW5lIG9ial9hcHBfZmlsZShuYW1lKSBlY29mZl9uZXdfZmlsZSAobmFtZSkKLQotLyogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCB3YW50IHRvIGRvIGFueSBzdGFicyBwcm9jZXNzaW5nIGluIHJlYWQuYy4gICovCi0jZGVmaW5lIE9CSl9QUk9DRVNTX1NUQUIoc2VnLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKSBcCi0gIGVjb2ZmX3N0YWIgKChzZWcpLCAod2hhdCksIChzdHJpbmcpLCAodHlwZSksIChvdGhlciksIChkZXNjKSkKLQotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUwkJMAotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MoU0VDKQkxCi0KLSNkZWZpbmUgb2JqX2Vjb2ZmX3NldF9leHQgZWNvZmZfc2V0X2V4dAotZXh0ZXJuIHZvaWQgb2JqX2Vjb2ZmX3NldF9leHQgUEFSQU1TICgoc3ltYm9sUyAqLCBFWFRSICopKTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVsZi5jIGIvZ2FzL2NvbmZpZy9vYmotZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZmQwZmEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIyICswLDAgQEAKLS8qIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWVsZi5oIgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotI2lmbmRlZiBFQ09GRl9ERUJVR0dJTkcKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDAKLSNlbHNlCi0jZGVmaW5lIE5FRURfRUNPRkZfREVCVUcKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotI2luY2x1ZGUgImVjb2ZmLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRDX0FMUEhBCi0jaW5jbHVkZSAiZWxmL2FscGhhLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRDX01JUFMKLSNpbmNsdWRlICJlbGYvbWlwcy5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19QUEMKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRDX0kzNzAKLSNpbmNsdWRlICJlbGYvaTM3MC5oIgotI2VuZGlmCi0KLXN0YXRpYyBiZmRfdm1hIGVsZl9zX2dldF9zaXplIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgZWxmX3Nfc2V0X3NpemUgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBlbGZfc19nZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc19zZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdm9pZCBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcyBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotc3RhdGljIGludCBlbGZfc2VjX3N5bV9va19mb3JfcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X3N0YWJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotc3RhdGljIGJvb2xlYW4gZWxmX2dldF9leHRyIFBBUkFNUyAoKGFzeW1ib2wgKiwgRVhUUiAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIG9ial9lbGZfbGluZSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgb2JqX2VsZl92ZXJzaW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9zaXplIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl90eXBlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9pZGVudCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfd2VhayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfbG9jYWwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3Zpc2liaWxpdHkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3N5bXZlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfdnRhYmxlX2luaGVyaXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3Z0YWJsZV9lbnRyeSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfc3Vic2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfcG9wc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBlbGZfcHNldWRvX3RhYmxlW10gPQotewotICB7ImNvbW0iLCBvYmpfZWxmX2NvbW1vbiwgMH0sCi0gIHsiY29tbW9uIiwgb2JqX2VsZl9jb21tb24sIDF9LAotICB7ImlkZW50Iiwgb2JqX2VsZl9pZGVudCwgMH0sCi0gIHsibG9jYWwiLCBvYmpfZWxmX2xvY2FsLCAwfSwKLSAgeyJwcmV2aW91cyIsIG9ial9lbGZfcHJldmlvdXMsIDB9LAotICB7InNlY3Rpb24iLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAotICB7InNlY3Rpb24ucyIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdCIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdC5zIiwgb2JqX2VsZl9zZWN0aW9uLCAwfSwKLSAgeyJwdXNoc2VjdGlvbiIsIG9ial9lbGZfc2VjdGlvbiwgMX0sCi0gIHsicG9wc2VjdGlvbiIsIG9ial9lbGZfcG9wc2VjdGlvbiwgMH0sCi0gIHsic2l6ZSIsIG9ial9lbGZfc2l6ZSwgMH0sCi0gIHsidHlwZSIsIG9ial9lbGZfdHlwZSwgMH0sCi0gIHsidmVyc2lvbiIsIG9ial9lbGZfdmVyc2lvbiwgMH0sCi0gIHsid2VhayIsIG9ial9lbGZfd2VhaywgMH0sCi0KLSAgLyogVGhlc2UgZGVmaW5lIHN5bWJvbCB2aXNpYmlsaXR5LiAqLwotICB7ImludGVybmFsIiwgb2JqX2VsZl92aXNpYmlsaXR5LCBTVFZfSU5URVJOQUx9LAotICB7ImhpZGRlbiIsIG9ial9lbGZfdmlzaWJpbGl0eSwgU1RWX0hJRERFTn0sCi0gIHsicHJvdGVjdGVkIiwgb2JqX2VsZl92aXNpYmlsaXR5LCBTVFZfUFJPVEVDVEVEfSwKLQotICAvKiBUaGVzZSBhcmUgdXNlZCBmb3Igc3RhYnMtaW4tZWxmIGNvbmZpZ3VyYXRpb25zLiAgKi8KLSAgeyJsaW5lIiwgb2JqX2VsZl9saW5lLCAwfSwKLQotICAvKiBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbiB0byBoYW5kbGUgc3ltYm9sIHZlcnNpb25zLiAgKi8KLSAgeyJzeW12ZXIiLCBvYmpfZWxmX3N5bXZlciwgMH0sCi0KLSAgLyogQSBHTlUgZXh0ZW5zaW9uIHRvIGNoYW5nZSBzdWJzZWN0aW9uIG9ubHkuICAqLwotICB7InN1YnNlY3Rpb24iLCBvYmpfZWxmX3N1YnNlY3Rpb24sIDB9LAotCi0gIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBhaWQgaW4gZ2FyYmFnZSBjb2xsZWN0aW5nIEMrKyB2dGFibGVzLiAgKi8KLSAgeyJ2dGFibGVfaW5oZXJpdCIsIG9ial9lbGZfdnRhYmxlX2luaGVyaXQsIDB9LAotICB7InZ0YWJsZV9lbnRyeSIsIG9ial9lbGZfdnRhYmxlX2VudHJ5LCAwfSwKLQotICAvKiBUaGVzZSBhcmUgdXNlZCBmb3IgZHdhcmYuICovCi0gIHsiMmJ5dGUiLCBjb25zLCAyfSwKLSAgeyI0Ynl0ZSIsIGNvbnMsIDR9LAotICB7IjhieXRlIiwgY29ucywgOH0sCi0KLSAgLyogV2UgbmVlZCB0byB0cmFwIHRoZSBzZWN0aW9uIGNoYW5naW5nIGNhbGxzIHRvIGhhbmRsZSAucHJldmlvdXMuICAqLwotICB7ImRhdGEiLCBvYmpfZWxmX2RhdGEsIDB9LAotICB7InRleHQiLCBvYmpfZWxmX3RleHQsIDB9LAotCi0gIC8qIEVuZCBzZW50aW5lbC4gICovCi0gIHtOVUxMLCBOVUxMLCAwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBwc2V1ZG9fdHlwZVMgZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlW10gPQotewotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgLyogQ09GRiBzdHlsZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIEVDT0ZGLiAubG4gaXMgbm90IHVzZWQ7IC5sb2MKLSAgICAgaXMgdXNlZCBpbnN0ZWFkLiAgKi8KLSAgeyAiZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2RlZiwJMCB9LAotICB7ICJkaW0iLAllY29mZl9kaXJlY3RpdmVfZGltLAkwIH0sCi0gIHsgImVuZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2VuZGVmLAkwIH0sCi0gIHsgImZpbGUiLAllY29mZl9kaXJlY3RpdmVfZmlsZSwJMCB9LAotICB7ICJzY2wiLAllY29mZl9kaXJlY3RpdmVfc2NsLAkwIH0sCi0gIHsgInRhZyIsCWVjb2ZmX2RpcmVjdGl2ZV90YWcsCTAgfSwKLSAgeyAidmFsIiwJZWNvZmZfZGlyZWN0aXZlX3ZhbCwJMCB9LAotCi0gIC8qIENPRkYgZGVidWdnaW5nIHJlcXVpcmVzIHBzZXVkby1vcHMgLnNpemUgYW5kIC50eXBlLCBidXQgRUxGCi0gICAgIGFscmVhZHkgaGFzIG1lYW5pbmdzIGZvciB0aG9zZS4gIFdlIHVzZSAuZXNpemUgYW5kIC5ldHlwZQotICAgICBpbnN0ZWFkLiAgVGhlc2UgYXJlIG9ubHkgZ2VuZXJhdGVkIGJ5IGdjYyBhbnlob3cuICAqLwotICB7ICJlc2l6ZSIsCWVjb2ZmX2RpcmVjdGl2ZV9zaXplLAkwIH0sCi0gIHsgImV0eXBlIiwJZWNvZmZfZGlyZWN0aXZlX3R5cGUsCTAgfSwKLQotICAvKiBFQ09GRiBzcGVjaWZpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICB7ICJiZWdpbiIsCWVjb2ZmX2RpcmVjdGl2ZV9iZWdpbiwJMCB9LAotICB7ICJiZW5kIiwJZWNvZmZfZGlyZWN0aXZlX2JlbmQsCTAgfSwKLSAgeyAiZW5kIiwJZWNvZmZfZGlyZWN0aXZlX2VuZCwJMCB9LAotICB7ICJlbnQiLAllY29mZl9kaXJlY3RpdmVfZW50LAkwIH0sCi0gIHsgImZtYXNrIiwJZWNvZmZfZGlyZWN0aXZlX2ZtYXNrLAkwIH0sCi0gIHsgImZyYW1lIiwJZWNvZmZfZGlyZWN0aXZlX2ZyYW1lLAkwIH0sCi0gIHsgImxvYyIsCWVjb2ZmX2RpcmVjdGl2ZV9sb2MsCTAgfSwKLSAgeyAibWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9tYXNrLAkwIH0sCi0KLSAgLyogT3RoZXIgRUNPRkYgZGlyZWN0aXZlcy4gICovCi0gIHsgImV4dGVybiIsCWVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4sCTAgfSwKLQotICAvKiBUaGVzZSBhcmUgdXNlZCBvbiBJcml4LiAgSSBkb24ndCBrbm93IGhvdyB0byBpbXBsZW1lbnQgdGhlbS4gICovCi0gIHsgImFsaWFzIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgImJnbmIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAiZW5kYiIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJsYWIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAibm9hbGlhcyIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJ2ZXJzdGFtcCIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJ2cmVnIiwJc19pZ25vcmUsCQkwIH0sCi0jZW5kaWYKLQotICB7TlVMTCwgTlVMTCwgMH0JCQkvKiBlbmQgc2VudGluZWwgKi8KLX07Ci0KLSN1bmRlZiBOT19SRUxPQwotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBzdGFydHMuICAqLwotCi12b2lkCi1lbGZfYmVnaW4gKCkKLXsKLSAgLyogQWRkIHN5bWJvbHMgZm9yIHRoZSBrbm93biBzZWN0aW9ucyB0byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCQkJCVRFWFRfU0VDVElPTl9OQU1FKSkpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwKLQkJCQkJCQkJREFUQV9TRUNUSU9OX05BTUUpKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHNlY3Rpb25fc3ltYm9sIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LAotCQkJCQkJCQlCU1NfU0VDVElPTl9OQU1FKSkpOwotfQotCi12b2lkCi1lbGZfcG9wX2luc2VydCAoKQotewotICBwb3BfaW5zZXJ0IChlbGZfcHNldWRvX3RhYmxlKTsKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBwb3BfaW5zZXJ0IChlY29mZl9kZWJ1Z19wc2V1ZG9fdGFibGUpOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotZWxmX3NfZ2V0X3NpemUgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICByZXR1cm4gU19HRVRfU0laRSAoc3ltKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9zX3NldF9zaXplIChzeW0sIHN6KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGJmZF92bWEgc3o7Ci17Ci0gIFNfU0VUX1NJWkUgKHN5bSwgc3opOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotZWxmX3NfZ2V0X2FsaWduIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgcmV0dXJuIFNfR0VUX0FMSUdOIChzeW0pOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX3Nfc2V0X2FsaWduIChzeW0sIGFsaWduKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGJmZF92bWEgYWxpZ247Ci17Ci0gIFNfU0VUX0FMSUdOIChzeW0sIGFsaWduKTsKLX0KLQotaW50Ci1lbGZfc19nZXRfb3RoZXIgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICByZXR1cm4gZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgKGRlc3QsIHNyYykKLSAgICAgc3ltYm9sUyAqZGVzdCwgKnNyYzsKLXsKLSAgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgKGRlc3QsIHNyYyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWVsZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyAoc2VjKQotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpOwotfQotCi12b2lkCi1lbGZfZmlsZV9zeW1ib2wgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbmV3IChzLCBhYnNvbHV0ZV9zZWN0aW9uLCAodmFsdWVUKSAwLCAoc3RydWN0IGZyYWcgKikgMCk7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0ZJTEU7Ci0KLSAgaWYgKHN5bWJvbF9yb290UCAhPSBzeW0pCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9pbnNlcnQgKHN5bSwgc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSNpZmRlZiBERUJVRwotICAgICAgdmVyaWZ5X3N5bWJvbF9jaGFpbiAoc3ltYm9sX3Jvb3RQLCBzeW1ib2xfbGFzdFApOwotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBlY29mZl9uZXdfZmlsZSAocyk7Ci0jZW5kaWYKLX0KLQotdm9pZAotb2JqX2VsZl9jb21tb24gKGlzX2NvbW1vbikKLSAgICAgaW50IGlzX2NvbW1vbjsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBpbnQgdGVtcCwgc2l6ZTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgaW50IGhhdmVfYWxpZ247Ci0KLSAgaWYgKGZsYWdfbXJpICYmIGlzX2NvbW1vbikKLSAgICB7Ci0gICAgICBzX21yaV9jb21tb24gKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHNpemUgPSB0ZW1wOwotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSBzaXplKQotCXsKLQkgIGFzX3dhcm4gKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVkLiIpLAotCQkgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZSk7Ci0JfQotICAgIH0KLSAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgaGF2ZV9hbGlnbiA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYXZlX2FsaWduID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgaWYgKCEgaGF2ZV9hbGlnbiB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLSAgICB7Ci0gICAgICBpZiAoISBoYXZlX2FsaWduKQotCXRlbXAgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGlmICh0ZW1wIDwgMCkKLQkgICAgewotCSAgICAgIHRlbXAgPSAwOwotCSAgICAgIGFzX3dhcm4gKF8oIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIpKTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsKQotCXsKLQkgIHNlZ1Qgb2xkX3NlYzsKLQkgIGludCBvbGRfc3Vic2VjOwotCSAgY2hhciAqcGZyYWc7Ci0JICBpbnQgYWxpZ247Ci0KLQkvKiBhbGxvY2F0ZV9ic3M6ICovCi0JICBvbGRfc2VjID0gbm93X3NlZzsKLQkgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotCSAgaWYgKHRlbXApCi0JICAgIHsKLQkgICAgICAvKiBjb252ZXJ0IHRvIGEgcG93ZXIgb2YgMiBhbGlnbm1lbnQgKi8KLQkgICAgICBmb3IgKGFsaWduID0gMDsgKHRlbXAgJiAxKSA9PSAwOyB0ZW1wID4+PSAxLCArK2FsaWduKTsKLQkgICAgICBpZiAodGVtcCAhPSAxKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBhbGlnbiA9IDA7Ci0JICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0JICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwKLQkJCSAgICAob2Zmc2V0VCkgc2l6ZSwgKGNoYXIgKikgMCk7Ci0JICAqcGZyYWcgPSAwOwotCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JYWxsb2NhdGVfY29tbW9uOgotCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOwotCSAgU19TRVRfQUxJR04gKHN5bWJvbFAsIHRlbXApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2NvbV9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSB1c2UgdGhlIGRvdCwgc29tZSBkb24ndC4gIENhbiB3ZSBnZXQgc29tZSBjb25zaXN0ZW5jeT8/ICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJic3NcIiIsIDQpCi0JICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJkYXRhXCIiLCA1KSkKLQl7Ci0JICB3aGlsZSAoKi0taW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQkgICAgOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICBnb3RvIGJhZF9jb21tb25fc2VnbWVudDsKLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICciJykKLQk7Ci0gICAgICBnb3RvIGFsbG9jYXRlX2NvbW1vbjsKLSAgICB9Ci0KLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLQotICB7Ci0gIGJhZF9jb21tb25fc2VnbWVudDoKLSAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQotICAgICAgcCsrOwotICAgIGMgPSAqcDsKLSAgICAqcCA9ICdcMCc7Ci0gICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICpwID0gYzsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2xvY2FsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwgPSAxOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgU19TRVRfV0VBSyAoc3ltYm9sUCk7Ci0gICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsID0gMTsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3Zpc2liaWxpdHkgKHZpc2liaWxpdHkpCi0gICAgIGludCB2aXNpYmlsaXR5OwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgYXN5bWJvbCAqYmZkc3ltOwotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBiZmRzeW0gPSBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCk7Ci0gICAgICBlbGZzeW0gPSBlbGZfc3ltYm9sX2Zyb20gKGJmZF9hc3ltYm9sX2JmZCAoYmZkc3ltKSwgYmZkc3ltKTsKLQotICAgICAgYXNzZXJ0IChlbGZzeW0pOwotCi0gICAgICBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIgPSB2aXNpYmlsaXR5OwotCi0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotCi0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotCi1zdGF0aWMgc2VnVCBwcmV2aW91c19zZWN0aW9uOwotc3RhdGljIGludCBwcmV2aW91c19zdWJzZWN0aW9uOwotCi1zdHJ1Y3Qgc2VjdGlvbl9zdGFjawotewotICBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqbmV4dDsKLSAgc2VnVCBzZWcsIHByZXZfc2VnOwotICBpbnQgc3Vic2VnLCBwcmV2X3N1YnNlZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqc2VjdGlvbl9zdGFjazsKLQotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgY29kZSBzdXBwb3J0cyB0d28gZGlmZmVyZW50Ci0gICBzeW50YXhlcy4KLQotICAgVGhlIGZpcnN0IGlzIGZvdW5kIG9uIFNvbGFyaXMsIGFuZCBsb29rcyBsaWtlCi0gICAgICAgLnNlY3Rpb24gIi5zZWMxIiwjYWxsb2MsI2V4ZWNpbnN0ciwjd3JpdGUKLSAgIEhlcmUgdGhlIG5hbWVzIGFmdGVyICcjJyBhcmUgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZQotICAgc2VjdGlvbi4gIEknbSBub3Qgc3VyZSBob3cgaXQgZGV0ZXJtaW5lcyB0aGUgU0hUXyogdHlwZSAoQkZECi0gICBkb2Vzbid0IHJlYWxseSBnaXZlIHVzIGNvbnRyb2wgb3ZlciB0aGUgdHlwZSwgYW55aG93KS4KLQotICAgVGhlIHNlY29uZCBmb3JtYXQgaXMgZm91bmQgb24gVW5peFdhcmUsIGFuZCBwcm9iYWJseSBtb3N0IFNWUjQKLSAgIG1hY2hpbmVzLCBhbmQgbG9va3MgbGlrZQotICAgICAgIC5zZWN0aW9uIC5zZWMxLCJhIixAcHJvZ2JpdHMKLSAgIFRoZSBxdW90ZWQgc3RyaW5nIG1heSBjb250YWluIGFueSBjb21iaW5hdGlvbiBvZiBhLCB3LCB4LCBhbmQKLSAgIHJlcHJlc2VudHMgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZSBzZWN0aW9uLiAgVGhlIHN0cmluZwotICAgYmVnaW5uaW5nIHdpdGggJ0AnIGNhbiBiZSBwcm9nYml0cyBvciBub2JpdHMuICBUaGVyZSBzaG91bGQgYmUKLSAgIG90aGVyIHBvc3NpYmlsaXRpZXMsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGV5IGFyZS4gIEluIGFueSBjYXNlLAotICAgQkZEIGRvZXNuJ3QgcmVhbGx5IGxldCB1cyBzZXQgdGhlIHNlY3Rpb24gdHlwZS4gICovCi0KLS8qIENlcnRhaW4gbmFtZWQgc2VjdGlvbnMgaGF2ZSBwYXJ0aWN1bGFyIGRlZmluZWQgdHlwZXMsIGxpc3RlZCBvbiBwLgotICAgNC0xOSBvZiB0aGUgQUJJLiAgKi8KLXN0cnVjdCBzcGVjaWFsX3NlY3Rpb24KLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IHR5cGU7Ci0gIGludCBhdHRyaWJ1dGVzOwotfTsKLQotc3RhdGljIHN0cnVjdCBzcGVjaWFsX3NlY3Rpb24gY29uc3Qgc3BlY2lhbF9zZWN0aW9uc1tdID0KLXsKLSAgeyAiLmJzcyIsCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmNvbW1lbnQiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmRhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmRhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUJCX0sCi0gIHsgIi5kZWJ1ZyIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuZmluaSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIuaW5pdCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIubGluZSIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIubm90ZSIsCVNIVF9OT1RFLAkwCQkJCX0sCi0gIHsgIi5yb2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5yb2RhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MJCQl9LAotICB7ICIudGV4dCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotCi0jaWZkZWYgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSAgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSNlbmRpZgotCi0jaWYgMAotICAvKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gbmFtZXMgYXJlIHNwZWNpYWwsIGJ1dCB0aGV5IGNhbiBub3QKLSAgICAgcmVhc29uYWJseSBhcHBlYXIgaW4gYXNzZW1ibGVyIGNvZGUuICBTb21lIG9mIHRoZSBhdHRyaWJ1dGVzIGFyZQotICAgICBwcm9jZXNzb3IgZGVwZW5kZW50LiAgKi8KLSAgeyAiLmR5bmFtaWMiLAlTSFRfRFlOQU1JQywJU0hGX0FMTE9DIC8qICsgU0hGX1dSSVRFICovIAl9LAotICB7ICIuZHluc3RyIiwJU0hUX1NUUlRBQiwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmR5bnN5bSIsCVNIVF9EWU5TWU0sCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5nb3QiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmhhc2giLAlTSFRfSEFTSCwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmludGVycCIsCVNIVF9QUk9HQklUUywJLyogU0hGX0FMTE9DICovCQkJfSwKLSAgeyAiLnBsdCIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuc2hzdHJ0YWIiLFNIVF9TVFJUQUIsCTAJCQkJfSwKLSAgeyAiLnN0cnRhYiIsCVNIVF9TVFJUQUIsCS8qIFNIRl9BTExPQyAqLwkJCX0sCi0gIHsgIi5zeW10YWIiLAlTSFRfU1lNVEFCLAkvKiBTSEZfQUxMT0MgKi8JCQl9LAotI2VuZGlmCi0KLSAgeyBOVUxMLAkwLAkJMAkJCQl9Ci19OwotCi12b2lkCi1vYmpfZWxmX2NoYW5nZV9zZWN0aW9uIChuYW1lLCB0eXBlLCBhdHRyLCBwdXNoKQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgdHlwZSwgYXR0ciwgcHVzaDsKLXsKLSAgaW50IG5ld19zZWM7Ci0gIHNlZ1Qgc2VjOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAvKiBTd2l0Y2ggdG8gdGhlIHNlY3Rpb24sIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChwdXNoKQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX3N0YWNrICplbHQ7Ci0gICAgICBlbHQgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX3N0YWNrKSk7Ci0gICAgICBlbHQtPm5leHQgPSBzZWN0aW9uX3N0YWNrOwotICAgICAgZWx0LT5zZWcgPSBub3dfc2VnOwotICAgICAgZWx0LT5wcmV2X3NlZyA9IHByZXZpb3VzX3NlY3Rpb247Ci0gICAgICBlbHQtPnN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBlbHQtPnByZXZfc3Vic2VnID0gcHJldmlvdXNfc3Vic2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fc3RhY2sgPSBlbHQ7Ci0gICAgfQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgbmV3X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsIG5hbWUpID09IE5VTEw7Ci0gIHNlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotCi0gIGlmIChuZXdfc2VjKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgc3ltYm9sUyAqc2Vjc3ltOwotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBzZWN0aW9ucy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotICAgICAgICBpZiAoc3RyY21wIChuYW1lLCBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUpID09IDApCi0gICAgICAgICAgewotCSAgICBpZiAodHlwZSA9PSBTSFRfTlVMTCkKLQkgICAgICB0eXBlID0gc3BlY2lhbF9zZWN0aW9uc1tpXS50eXBlOwotCSAgICBlbHNlIGlmICh0eXBlICE9IHNwZWNpYWxfc2VjdGlvbnNbaV0udHlwZSkKLQkgICAgICBhc193YXJuIChfKCJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIHR5cGUgZm9yICVzIiksIG5hbWUpOwotCi0JICAgIGlmICgoYXR0ciAmfiBzcGVjaWFsX3NlY3Rpb25zW2ldLmF0dHJpYnV0ZXMpICE9IDApCi0JICAgICAgewotCSAgICAgICAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCB3ZSBwZXJtaXQgYSAubm90ZSBzZWN0aW9uIHRvIGJlCi0JCSAgIGFsbG9jYXRhYmxlLiAgSWYgdGhlIGxpbmtlciBzZWVzIGFuIGFsbG9jYXRlYWJsZSAubm90ZQotCQkgICBzZWN0aW9uLCBpdCB3aWxsIGNyZWF0ZSBhIFBUX05PVEUgc2VnbWVudCBpbiB0aGUgb3V0cHV0Ci0JCSAgIGZpbGUuICAqLwotCQlpZiAoc3RyY21wIChuYW1lLCAiLm5vdGUiKSAhPSAwCi0JCSAgICB8fCBhdHRyICE9IFNIRl9BTExPQykKLQkJICBhc193YXJuIChfKCJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIGF0dHJpYnV0ZXMgZm9yICVzIiksCi0JCQkgICBuYW1lKTsKLQkgICAgICB9Ci0JICAgIGF0dHIgfD0gc3BlY2lhbF9zZWN0aW9uc1tpXS5hdHRyaWJ1dGVzOwotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgLyogQ29udmVydCBFTEYgdHlwZSBhbmQgZmxhZ3MgdG8gQkZEIGZsYWdzLiAgKi8KLSAgICAgIGZsYWdzID0gKFNFQ19SRUxPQwotCSAgICAgICB8ICgoYXR0ciAmIFNIRl9XUklURSkgPyAwIDogU0VDX1JFQURPTkxZKQotCSAgICAgICB8ICgoYXR0ciAmIFNIRl9BTExPQykgPyBTRUNfQUxMT0MgOiAwKQotCSAgICAgICB8ICgoKGF0dHIgJiBTSEZfQUxMT0MpICYmIHR5cGUgIT0gU0hUX05PQklUUykgPyBTRUNfTE9BRCA6IDApCi0JICAgICAgIHwgKChhdHRyICYgU0hGX0VYRUNJTlNUUikgPyBTRUNfQ09ERSA6IDApKTsKLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9mbGFncwotICAgICAgZmxhZ3MgPSBtZF9lbGZfc2VjdGlvbl9mbGFncyAoZmxhZ3MsIGF0dHIsIHR5cGUpOwotI2VuZGlmCi0KLSAgICAgIC8qIFByZXZlbnQgU0VDX0hBU19DT05URU5UUyBmcm9tIGJlaW5nIGluYWR2ZXJ0ZW50bHkgc2V0LiAgKi8KLSAgICAgIGlmICh0eXBlID09IFNIVF9OT0JJVFMpCi0gICAgICAgIHNlZ19pbmZvIChzZWMpLT5ic3MgPSAxOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7Ci0KLSAgICAgIC8qIEFkZCBhIHN5bWJvbCBmb3IgdGhpcyBzZWN0aW9uIHRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgc2Vjc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAgICAgaWYgKHNlY3N5bSAhPSBOVUxMKQotCXN5bWJvbF9zZXRfYmZkc3ltIChzZWNzeW0sIHNlYy0+c3ltYm9sKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKHNlYykpOwotICAgIH0KLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gICAgICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1pbnQKLW9ial9lbGZfcGFyc2Vfc2VjdGlvbl9sZXR0ZXJzIChzdHIsIGxlbikKLSAgICAgY2hhciAqc3RyOwotICAgICBzaXplX3QgbGVuOwotewotICBpbnQgYXR0ciA9IDA7Ci0KLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc3dpdGNoICgqc3RyKQotCXsKLQljYXNlICdhJzoKLQkgIGF0dHIgfD0gU0hGX0FMTE9DOwotCSAgYnJlYWs7Ci0JY2FzZSAndyc6Ci0JICBhdHRyIHw9IFNIRl9XUklURTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgYXR0ciB8PSBTSEZfRVhFQ0lOU1RSOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHsKLQkgICAgY2hhciAqYmFkX21zZyA9IF8oIlVucmVjb2duaXplZCAuc2VjdGlvbiBhdHRyaWJ1dGU6IHdhbnQgYSx3LHgiKTsKLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIKLQkgICAgaW50IG1kX2F0dHIgPSBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIgKCpzdHIsICZiYWRfbXNnKTsKLQkgICAgaWYgKG1kX2F0dHIgPj0gMCkKLQkgICAgICBhdHRyIHw9IG1kX2F0dHI7Ci0JICAgIGVsc2UKLSNlbmRpZgotCSAgICAgIHsKLQkJYXNfd2FybiAoIiVzIiwgYmFkX21zZyk7Ci0JCWF0dHIgPSAtMTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBzdHIrKywgbGVuLS07Ci0gICAgfQotCi0gIHJldHVybiBhdHRyOwotfQotCi1pbnQKLW9ial9lbGZfc2VjdGlvbl93b3JkIChzdHIsIGxlbikKLSAgICAgY2hhciAqc3RyOwotICAgICBzaXplX3QgbGVuOwotewotICBpZiAobGVuID09IDUgJiYgc3RybmNtcCAoc3RyLCAid3JpdGUiLCA1KSA9PSAwKQotICAgIHJldHVybiBTSEZfV1JJVEU7Ci0gIGlmIChsZW4gPT0gNSAmJiBzdHJuY21wIChzdHIsICJhbGxvYyIsIDUpID09IDApCi0gICAgcmV0dXJuIFNIRl9BTExPQzsKLSAgaWYgKGxlbiA9PSA5ICYmIHN0cm5jbXAgKHN0ciwgImV4ZWNpbnN0ciIsIDkpID09IDApCi0gICAgcmV0dXJuIFNIRl9FWEVDSU5TVFI7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl93b3JkCi0gIHsKLSAgICBpbnQgbWRfYXR0ciA9IG1kX2VsZl9zZWN0aW9uX3dvcmQgKHN0ciwgbGVuKTsKLSAgICBpZiAobWRfYXR0ciA+PSAwKQotICAgICAgcmV0dXJuIG1kX2F0dHI7Ci0gIH0KLSNlbmRpZgotCi0gIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBzZWN0aW9uIGF0dHJpYnV0ZSIpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotb2JqX2VsZl9zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIGlmIChsZW4gPT0gOCAmJiBzdHJuY21wIChzdHIsICJwcm9nYml0cyIsIDgpID09IDApCi0gICAgcmV0dXJuIFNIVF9QUk9HQklUUzsKLSAgaWYgKGxlbiA9PSA2ICYmIHN0cm5jbXAgKHN0ciwgIm5vYml0cyIsIDYpID09IDApCi0gICAgcmV0dXJuIFNIVF9OT0JJVFM7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl90eXBlCi0gIHsKLSAgICBpbnQgbWRfdHlwZSA9IG1kX2VsZl9zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKTsKLSAgICBpZiAobWRfdHlwZSA+PSAwKQotICAgICAgcmV0dXJuIG1kX3R5cGU7Ci0gIH0KLSNlbmRpZgotCi0gIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiKSk7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1vYmpfZWxmX3NlY3Rpb24gKHB1c2gpCi0gICAgIGludCBwdXNoOwotewotICBjaGFyICpuYW1lLCAqYmVnLCAqZW5kOwotICBpbnQgdHlwZSwgYXR0ciwgZHVtbXk7Ci0KLSNpZm5kZWYgVENfSTM3MAotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgY2hhciBtcmlfdHlwZTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgICAgIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICAgICAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgICAgIHNfbXJpX3NlY3QgKCZtcmlfdHlwZSk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICAgICAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFRDX0kzNzApICovCi0KLSAgLyogR2V0IG5hbWUgb2Ygc2VjdGlvbi4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotICAgIHsKLSAgICAgIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmR1bW15KTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JewotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKDAgPT0gc3RyY2hyICgiXG5cdCw7ICIsICplbmQpKQotCWVuZCsrOwotICAgICAgaWYgKGVuZCA9PSBpbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCSAgYXNfd2FybiAoXygiTWlzc2luZyBzZWN0aW9uIG5hbWUiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbmFtZSA9IHhtYWxsb2MgKGVuZCAtIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICAgbWVtY3B5IChuYW1lLCBpbnB1dF9saW5lX3BvaW50ZXIsIGVuZCAtIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBuYW1lW2VuZCAtIGlucHV0X2xpbmVfcG9pbnRlcl0gPSAnXDAnOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gZW5kOwotICAgIH0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIHR5cGUgPSBTSFRfTlVMTDsKLSAgYXR0ciA9IDA7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIC8qIFNraXAgdGhlIGNvbW1hLiAgKi8KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JewotCSAgYmVnID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZkdW1teSk7Ci0JICBpZiAoYmVnID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYXR0ciB8PSBvYmpfZWxmX3BhcnNlX3NlY3Rpb25fbGV0dGVycyAoYmVnLCBzdHJsZW4gKGJlZykpOwotCi0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JICAgIHsKLQkgICAgICBjaGFyIGM7Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlmIChjID09ICciJykKLQkJewotCQkgIGJlZyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmZHVtbXkpOwotCQkgIGlmIChiZWcgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIHR5cGUgPSBvYmpfZWxmX3NlY3Rpb25fdHlwZSAoYmVnLCBzdHJsZW4gKGJlZykpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoYyA9PSAnQCcgfHwgYyA9PSAnJScpCi0JCXsKLQkJICBiZWcgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgdHlwZSA9IG9ial9lbGZfc2VjdGlvbl90eXBlIChiZWcsIGlucHV0X2xpbmVfcG9pbnRlciAtIGJlZyk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgY2hhciBjOwotCi0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcjJykKLQkJewotCQkgIGFzX3dhcm4gKF8oIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmUgLSBjaGFyYWN0ZXIgZm9sbG93aW5nIG5hbWUgaXMgbm90ICcjJyIpKTsKLQkJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJlZyA9ICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotCSAgICAgIGF0dHIgfD0gb2JqX2VsZl9zZWN0aW9uX3dvcmQgKGJlZywgaW5wdXRfbGluZV9wb2ludGVyIC0gYmVnKTsKLQotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgfQotCSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIG9ial9lbGZfY2hhbmdlX3NlY3Rpb24gKG5hbWUsIHR5cGUsIGF0dHIsIHB1c2gpOwotfQotCi0vKiBDaGFuZ2UgdG8gdGhlIC5kYXRhIHNlY3Rpb24uICAqLwotCi12b2lkCi1vYmpfZWxmX2RhdGEgKGkpCi0gICAgIGludCBpOwotewotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgcHJldmlvdXNfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotICBzX2RhdGEgKGkpOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLX0KLQotLyogQ2hhbmdlIHRvIHRoZSAudGV4dCBzZWN0aW9uLiAgKi8KLQotdm9pZAotb2JqX2VsZl90ZXh0IChpKQotICAgICBpbnQgaTsKLXsKLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLSAgc190ZXh0IChpKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3N1YnNlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgcHJldmlvdXNfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX3NldCAobm93X3NlZywgKHN1YnNlZ1QpIHRlbXApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLX0KLQotLyogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIHByb2Nlc3NvciBiYWNrZW5kcyBpZiB0aGV5IGNoYW5nZQotICAgc2VjdGlvbnMuICAqLwotCi12b2lkCi1vYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCkKLXsKLSAgcHJldmlvdXNfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotfQotCi12b2lkCi1vYmpfZWxmX3ByZXZpb3VzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc2VnVCBuZXdfc2VjdGlvbjsKLSAgaW50IG5ld19zdWJzZWN0aW9uOwotCi0gIGlmIChwcmV2aW91c19zZWN0aW9uID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIucHJldmlvdXMgd2l0aG91dCBjb3JyZXNwb25kaW5nIC5zZWN0aW9uOyBpZ25vcmVkIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgbmV3X3NlY3Rpb24gPSBwcmV2aW91c19zZWN0aW9uOwotICBuZXdfc3Vic2VjdGlvbiA9IHByZXZpb3VzX3N1YnNlY3Rpb247Ci0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLSAgc3Vic2VnX3NldCAobmV3X3NlY3Rpb24sIG5ld19zdWJzZWN0aW9uKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3BvcHNlY3Rpb24gKHh4eCkKLSAgICAgaW50IHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqdG9wID0gc2VjdGlvbl9zdGFjazsKLQotICBpZiAodG9wID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIucG9wc2VjdGlvbiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgLnB1c2hzZWN0aW9uOyBpZ25vcmVkIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgc2VjdGlvbl9zdGFjayA9IHRvcC0+bmV4dDsKLSAgcHJldmlvdXNfc2VjdGlvbiA9IHRvcC0+cHJldl9zZWc7Ci0gIHByZXZpb3VzX3N1YnNlY3Rpb24gPSB0b3AtPnByZXZfc3Vic2VnOwotICBzdWJzZWdfc2V0ICh0b3AtPnNlZywgdG9wLT5zdWJzZWcpOwotICBmcmVlICh0b3ApOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEFzc3VtZSBkZWxpbWl0ZXIgaXMgcGFydCBvZiBleHByZXNzaW9uLiAgQlNENC4yIGFzIGZhaWxzIHdpdGgKLSAgICAgZGVsaWdodGZ1bCBidWcsIHNvIHdlIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCi0gIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIC5zeW12ZXIgcHNldWRvLW9wLCB3aGljaCBpcyB1c2VkIHRvIHNwZWNpZnkgYQotICAgc3ltYm9sIHZlcnNpb24uICBUaGUgc3ludGF4IGlzIGBgLnN5bXZlciBOQU1FLFNZTVZFUk5BTUUnJy4KLSAgIFNZTVZFUk5BTUUgbWF5IGNvbnRhaW4gRUxGX1ZFUl9DSFIgKCdAJykgY2hhcmFjdGVycy4gIFRoaXMKLSAgIHBzZXVkby1vcCBjYXVzZXMgdGhlIGFzc2VtYmxlciB0byBlbWl0IGEgc3ltYm9sIG5hbWVkIFNZTVZFUk5BTUUKLSAgIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHN5bWJvbCBOQU1FLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfc3ltdmVyIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+dmVyc2lvbmVkX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm11bHRpcGxlIC5zeW12ZXIgZGlyZWN0aXZlcyBmb3Igc3ltYm9sIGAlcyciKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAuc3ltdmVyIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChjICE9IEVMRl9WRVJfQ0hSKQotCWJyZWFrOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKLSAgICB9Ci0KLSAgc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKHN0cmNociAoc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lLCBFTEZfVkVSX0NIUikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmVyc2lvbiBuYW1lIGluIGAlcycgZm9yIHN5bWJvbCBgJXMnIiksCi0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lLCBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgLnZ0YWJsZV9pbmhlcml0IHBzZXVkby1vcCwgd2hpY2ggaXMgdXNlZCB0byBpbmRpY2F0ZQotICAgdG8gdGhlIGxpbmtlciB0aGUgaGllcmFyY2h5IGluIHdoaWNoIGEgcGFydGljdWxhciB0YWJsZSByZXNpZGVzLiAgVGhlCi0gICBzeW50YXggaXMgIi52dGFibGVfaW5oZXJpdCBDSElMRE5BTUUsIFBBUkVOVE5BTUUiLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdnRhYmxlX2luaGVyaXQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpjbmFtZSwgKnBuYW1lOwotICBzeW1ib2xTICpjc3ltLCAqcHN5bTsKLSAgY2hhciBjLCBiYWQgPSAwOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBjc3ltID0gc3ltYm9sX2ZpbmQgKGNuYW1lKTsKLQotICAvKiBHQ0ZJWE1FOiBzaG91bGQgY2hlY2sgdGhhdCB3ZSBkb24ndCBoYXZlIHR3byAudnRhYmxlX2luaGVyaXRzIGZvcgotICAgICB0aGUgc2FtZSBjaGlsZCBzeW1ib2wuICBBbHNvLCB3ZSBjYW4gY3VycmVudGx5IG9ubHkgZG8gdGhpcyBpZiB0aGUKLSAgICAgY2hpbGQgc3ltYm9sIGlzIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBwbGFjZWQgaW4gYSBmcmFnbWVudC4gICovCi0KLSAgaWYgKGNzeW0gPT0gTlVMTCB8fCBzeW1ib2xfZ2V0X2ZyYWcgKGNzeW0pID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkICgiZXhwZWN0ZWQgYCVzJyB0byBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yIC52dGFibGVfaW5oZXJpdCIsCi0JICAgICAgY25hbWUpOwotICAgICAgYmFkID0gMTsKLSAgICB9Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkICgiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAudnRhYmxlX2luaGVyaXQiKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnCi0gICAgICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcMCcKLQkgIHx8IGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMV0pKSkKLSAgICB7Ci0gICAgICBwc3ltID0gc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBwc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAocG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGJhZCkKLSAgICByZXR1cm47Ci0KLSAgYXNzZXJ0IChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGNzeW0pLT5YX29wID09IE9fY29uc3RhbnQpOwotICBmaXhfbmV3IChzeW1ib2xfZ2V0X2ZyYWcgKGNzeW0pLAotCSAgIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoY3N5bSktPlhfYWRkX251bWJlciwgMCwgcHN5bSwgMCwgMCwKLQkgICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQpOwotfQotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIC52dGFibGVfZW50cnkgcHNldWRvLW9wLCB3aGljaCBpcyB1c2VkIHRvIGluZGljYXRlCi0gICB0byB0aGUgbGlua2VyIHRoYXQgYSB2dGFibGUgc2xvdCB3YXMgdXNlZC4gIFRoZSBzeW50YXggaXMKLSAgICIudnRhYmxlX2VudHJ5IHRhYmxlbmFtZSwgb2Zmc2V0Ii4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3Z0YWJsZV9lbnRyeSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgb2Zmc2V0VCBvZmZzZXQ7Ci0gIGNoYXIgYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkICgiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAudnRhYmxlX2VudHJ5Iik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIG9mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGZpeF9uZXcgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDAsIHN5bSwgb2Zmc2V0LCAwLAotCSAgIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLWVsZl9vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX3JlYWRfYmVnaW5faG9vayAoKTsKLSNlbmRpZgotfQotCi12b2lkCi1lbGZfb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgc3RydWN0IGVsZl9vYmpfc3kgKnN5X29iajsKLQotICBzeV9vYmogPSBzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCk7Ci0gIHN5X29iai0+c2l6ZSA9IE5VTEw7Ci0gIHN5X29iai0+dmVyc2lvbmVkX25hbWUgPSBOVUxMOwotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0jZW5kaWYKLX0KLQotdm9pZAotb2JqX2VsZl92ZXJzaW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIGNoYXIgY2g7Ci0gIGNoYXIgKnA7Ci0gIGFzZWN0aW9uICpzZWcgPSBub3dfc2VnOwotICBzdWJzZWdUIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIEVsZl9JbnRlcm5hbF9Ob3RlIGlfbm90ZTsKLSAgRWxmX0V4dGVybmFsX05vdGUgZV9ub3RlOwotICBhc2VjdGlvbiAqbm90ZV9zZWNwID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGludCBpLCBsZW47Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCInKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwkvKiAtPiAxc3QgY2hhciBvZiBzdHJpbmcuICovCi0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLSAgICAgICooaW5wdXRfbGluZV9wb2ludGVyIC0gMSkgPSAnXDAnOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIC8qIGNyZWF0ZSB0aGUgLm5vdGUgc2VjdGlvbiAqLwotCi0gICAgICBub3RlX3NlY3AgPSBzdWJzZWdfbmV3ICgiLm5vdGUiLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LAotCQkJICAgICBub3RlX3NlY3AsCi0JCQkgICAgIFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkpOwotCi0gICAgICAvKiBwcm9jZXNzIHRoZSB2ZXJzaW9uIHN0cmluZyAqLwotCi0gICAgICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotCi0gICAgICBpX25vdGUubmFtZXN6ID0gKChsZW4gKyAxKSArIDMpICYgfjM7IC8qIHJvdW5kIHRoaXMgdG8gd29yZCBib3VuZGFyeSAqLwotICAgICAgaV9ub3RlLmRlc2NzeiA9IDA7CS8qIG5vIGRlc2NyaXB0aW9uICovCi0gICAgICBpX25vdGUudHlwZSA9IE5UX1ZFUlNJT047Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS5uYW1lc3opKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLm5hbWVzeiwgNCk7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS5kZXNjc3opKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLmRlc2NzeiwgNCk7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS50eXBlKSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS50eXBlLCA0KTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCXsKLQkgIGNoID0gKihuYW1lICsgaSk7Ci0JICB7Ci0JICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoY2gpOwotCSAgfQotCX0KLSAgICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICpwID0gMDsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBgJXMnIGluIC5zaXplIGRpcmVjdGl2ZSIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZXhwcmVzc2lvbiBpbiAuc2l6ZSBkaXJlY3RpdmUiKSk7Ci0gICAgICBleHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gICpwID0gMDsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0gICAgU19TRVRfU0laRSAoc3ltLCBleHAuWF9hZGRfbnVtYmVyKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplID0KLQkoZXhwcmVzc2lvblMgKikgeG1hbGxvYyAoc2l6ZW9mIChleHByZXNzaW9uUykpOwotICAgICAgKnN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplID0gZXhwOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBFTEYgLnR5cGUgcHNldWRvLW9wLiAgVGhpcyBzZXRzIHRoZSB0eXBlIG9mIGEgc3ltYm9sLgotICAgVGhlcmUgYXJlIGZvdXIgc3ludGF4ZXM6Ci0KLSAgIFRoZSBmaXJzdCAodXNlZCBvbiBTb2xhcmlzKSBpcwotICAgICAgIC50eXBlIFNZTSwjZnVuY3Rpb24KLSAgIFRoZSBzZWNvbmQgKHVzZWQgb24gVW5peFdhcmUpIGlzCi0gICAgICAgLnR5cGUgU1lNLEBmdW5jdGlvbgotICAgVGhlIHRoaXJkIChyZXBvcnRlZGx5IHRvIGJlIHVzZWQgb24gSXJpeCA2LjApIGlzCi0gICAgICAgLnR5cGUgU1lNIFNUVF9GVU5DCi0gICBUaGUgZm91cnRoICh1c2VkIG9uIE5ldEJTRC9Bcm0gYW5kIExpbnV4L0FSTSkgaXMKLSAgICAgICAudHlwZSBTWU0sJWZ1bmN0aW9uCi0gICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl90eXBlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBpbnQgdHlwZTsKLSAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICggICAqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJwotICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcKLSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyUnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHR5cGVuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgdHlwZSA9IDA7Ci0gIGlmIChzdHJjbXAgKHR5cGVuYW1lLCAiZnVuY3Rpb24iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHR5cGVuYW1lLCAiU1RUX0ZVTkMiKSA9PSAwKQotICAgIHR5cGUgPSBCU0ZfRlVOQ1RJT047Ci0gIGVsc2UgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJvYmplY3QiKSA9PSAwCi0JICAgfHwgc3RyY21wICh0eXBlbmFtZSwgIlNUVF9PQkpFQ1QiKSA9PSAwKQotICAgIHR5cGUgPSBCU0ZfT0JKRUNUOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCJpZ25vcmluZyB1bnJlY29nbml6ZWQgc3ltYm9sIHR5cGUgXCIlc1wiIiksIHR5cGVuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gdHlwZTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9pZGVudCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0YXRpYyBzZWdUIGNvbW1lbnRfc2VjdGlvbjsKLSAgc2VnVCBvbGRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBvbGRfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGlmICghY29tbWVudF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjb21tZW50X3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLmNvbW1lbnQiLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBjb21tZW50X3NlY3Rpb24sCi0JCQkgICAgIFNFQ19SRUFET05MWSB8IFNFQ19IQVNfQ09OVEVOVFMpOwotICAgICAgcCA9IGZyYWdfbW9yZSAoMSk7Ci0gICAgICAqcCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgc3Vic2VnX3NldCAoY29tbWVudF9zZWN0aW9uLCAwKTsKLSAgc3RyaW5nZXIgKDEpOwotICBzdWJzZWdfc2V0IChvbGRfc2VjdGlvbiwgb2xkX3N1YnNlY3Rpb24pOwotfQotCi0jaWZkZWYgSU5JVF9TVEFCX1NFQ1RJT04KLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWJzIHNlY3Rpb24gaXMgc3BlY2lhbC4gICovCi0KLXZvaWQKLW9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnN0YWJzdHJfbmFtZTsKLSAgdW5zaWduZWQgaW50IHN0cm9mZjsKLQotICAvKiBGb3JjZSB0aGUgc2VjdGlvbiB0byBhbGlnbiB0byBhIGxvbmd3b3JkIGJvdW5kYXJ5LiAgV2l0aG91dCB0aGlzLAotICAgICBVbml4V2FyZSBhciBjcmFzaGVzLiAgKi8KLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcsIDIpOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoaXMgZmlyc3Qgc3ltYm9sLiAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIC8qIFplcm8gaXQgb3V0LiAqLwotICBtZW1zZXQgKHAsIDAsIDEyKTsKLSAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICBzdGFic3RyX25hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VnbWVudF9uYW1lIChzZWcpKSArIDQpOwotICBzdHJjcHkgKHN0YWJzdHJfbmFtZSwgc2VnbWVudF9uYW1lIChzZWcpKTsKLSAgc3RyY2F0IChzdGFic3RyX25hbWUsICJzdHIiKTsKLSAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoZmlsZSwgc3RhYnN0cl9uYW1lKTsKLSAga25vdyAoc3Ryb2ZmID09IDEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHN0cm9mZiwgNCk7Ci0gIHNlZ19pbmZvIChzZWcpLT5zdGFidS5wID0gcDsKLX0KLQotI2VuZGlmCi0KLS8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYnMgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3RhYl9zZWN0aW9ucyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBhc2VjdGlvbiAqc3Ryc2VjOwotICBjaGFyICpwOwotICBpbnQgc3Ryc3osIG5zeW1zOwotCi0gIGlmIChzdHJuY21wICgiLnN0YWIiLCBzZWMtPm5hbWUsIDUpKQotICAgIHJldHVybjsKLSAgaWYgKCFzdHJjbXAgKCJzdHIiLCBzZWMtPm5hbWUgKyBzdHJsZW4gKHNlYy0+bmFtZSkgLSAzKSkKLSAgICByZXR1cm47Ci0KLSAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWMtPm5hbWUpICsgNCk7Ci0gIHN0cmNweSAobmFtZSwgc2VjLT5uYW1lKTsKLSAgc3RyY2F0IChuYW1lLCAic3RyIik7Ci0gIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLSAgaWYgKHN0cnNlYykKLSAgICBzdHJzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0cnNlYyk7Ci0gIGVsc2UKLSAgICBzdHJzeiA9IDA7Ci0gIG5zeW1zID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSAvIDEyIC0gMTsKLQotICBwID0gc2VnX2luZm8gKHNlYyktPnN0YWJ1LnA7Ci0gIGFzc2VydCAocCAhPSAwKTsKLQotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBuc3ltcywgKGJmZF9ieXRlICopIHAgKyA2KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3Ryc3osIChiZmRfYnl0ZSAqKSBwICsgOCk7Ci19Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFQ09GRiBjb2RlLiAgSXQgaXMgc3VwcG9zZWQgdG8KLSAgIHJlY29yZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlIGJhY2tlbmQgY2FuCi0gICB3cml0ZSBpdCBvdXQgY29ycmVjdGx5LiAgVGhlIEVMRiBiYWNrZW5kIGRvZXNuJ3QgYWN0dWFsbHkgaGFuZGxlCi0gICB0aGlzIGF0IHRoZSBtb21lbnQsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4gIFdlIHNhdmUgdGhlIGluZm9ybWF0aW9uCi0gICBpbiB0aGUgc3ltYm9sLiAgKi8KLQotdm9pZAotZWxmX2Vjb2ZmX3NldF9leHQgKHN5bSwgZXh0KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHN0cnVjdCBlY29mZl9leHRyICpleHQ7Ci17Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT51ZGF0YS5wID0gKFBUUikgZXh0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaXMKLSAgIHN1cHBvc2VkIHRvICpFWFQgdG8gdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiwgYW5kIHJldHVybgotICAgd2hldGhlciB0aGUgc3ltYm9sIHNob3VsZCBiZSB1c2VkIGF0IGFsbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2V0X2V4dHIgKHN5bSwgZXh0KQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIEVYVFIgKmV4dDsKLXsKLSAgaWYgKHN5bS0+dWRhdGEucCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKmV4dCA9ICooRVhUUiAqKSBzeW0tPnVkYXRhLnA7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaGFzCi0gICBub3RoaW5nIHRvIGRvIGZvciBFTEYuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1lbGZfc2V0X2luZGV4IChzeW0sIGluZHgpCi0gICAgIGFzeW1ib2wgKnN5bSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfc2l6ZV90eXBlIGluZHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLX0KLQotI2VuZGlmIC8qIE5FRURfRUNPRkZfREVCVUcgKi8KLQotdm9pZAotZWxmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50cCkKLSAgICAgc3ltYm9sUyAqc3ltcDsKLSAgICAgaW50ICpwdW50cDsKLXsKLSAgc3RydWN0IGVsZl9vYmpfc3kgKnN5X29iajsKLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBlY29mZl9mcm9iX3N5bWJvbCAoc3ltcCk7Ci0jZW5kaWYKLQotICBzeV9vYmogPSBzeW1ib2xfZ2V0X29iaiAoc3ltcCk7Ci0KLSAgaWYgKHN5X29iai0+c2l6ZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3lfb2JqLT5zaXplLT5YX29wKQotCXsKLQljYXNlIE9fc3VidHJhY3Q6Ci0JICBTX1NFVF9TSVpFIChzeW1wLAotCQkgICAgICAoU19HRVRfVkFMVUUgKHN5X29iai0+c2l6ZS0+WF9hZGRfc3ltYm9sKQotCQkgICAgICAgKyBzeV9vYmotPnNpemUtPlhfYWRkX251bWJlcgotCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoc3lfb2JqLT5zaXplLT5YX29wX3N5bWJvbCkpKTsKLQkgIGJyZWFrOwotCWNhc2UgT19jb25zdGFudDoKLQkgIFNfU0VUX1NJWkUgKHN5bXAsCi0JCSAgICAgIChTX0dFVF9WQUxVRSAoc3lfb2JqLT5zaXplLT5YX2FkZF9zeW1ib2wpCi0JCSAgICAgICArIHN5X29iai0+c2l6ZS0+WF9hZGRfbnVtYmVyKSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfYmFkIChfKCIuc2l6ZSBleHByZXNzaW9uIHRvbyBjb21wbGljYXRlZCB0byBmaXggdXAiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmcmVlIChzeV9vYmotPnNpemUpOwotICAgICAgc3lfb2JqLT5zaXplID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHN5X29iai0+dmVyc2lvbmVkX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgZ2l2ZW4gYSBuZXcgbmFtZSB3aXRoIHRoZSAuc3ltdmVyIGRpcmVjdGl2ZS4KLQotICAgICAgICAgSWYgdGhpcyBpcyBhbiBleHRlcm5hbCByZWZlcmVuY2UsIGp1c3QgcmVuYW1lIHRoZSBzeW1ib2wgdG8KLSAgICAgICAgIGluY2x1ZGUgdGhlIHZlcnNpb24gc3RyaW5nLiAgVGhpcyB3aWxsIG1ha2UgdGhlIHJlbG9jcyBiZQotICAgICAgICAgYWdhaW5zdCB0aGUgY29ycmVjdCB2ZXJzaW9uZWQgc3ltYm9sLgotCi0JIElmIHRoaXMgaXMgYSBkZWZpbml0aW9uLCBhZGQgYW4gYWxpYXMuICBGSVhNRTogVXNpbmcgYW4gYWxpYXMKLQkgd2lsbCBwZXJtaXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byByZWZlciB0byB0aGUgcmlnaHQKLQkgc3ltYm9sLiAgSG93ZXZlciwgaXQncyBub3QgY2xlYXIgd2hldGhlciBpdCBpcyB0aGUgYmVzdAotCSBhcHByb2FjaC4gICovCi0KLSAgICAgIGlmICghIFNfSVNfREVGSU5FRCAoc3ltcCkpCi0JewotCSAgY2hhciAqcDsKLQotCSAgLyogVmVyaWZ5IHRoYXQgdGhlIG5hbWUgaXNuJ3QgdXNpbmcgdGhlIEBAIHN5bnRheC0tdGhpcyBpcwotICAgICAgICAgICAgIHJlc2VydmVkIGZvciBkZWZpbml0aW9ucyBvZiB0aGUgZGVmYXVsdCB2ZXJzaW9uIHRvIGxpbmsKLSAgICAgICAgICAgICBhZ2FpbnN0LiAgKi8KLQkgIHAgPSBzdHJjaHIgKHN5X29iai0+dmVyc2lvbmVkX25hbWUsIEVMRl9WRVJfQ0hSKTsKLQkgIGtub3cgKHAgIT0gTlVMTCk7Ci0JICBpZiAocFsxXSA9PSBFTEZfVkVSX0NIUikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBhdHRlbXB0IHRvIGRlY2xhcmUgZXh0ZXJuYWwgdmVyc2lvbiBuYW1lIGFzIGRlZmF1bHQgaW4gc3ltYm9sIGAlcyciKSwKLQkJICAgICAgc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSk7Ci0JICAgICAgKnB1bnRwID0gdHJ1ZTsKLQkgICAgfQotCSAgU19TRVRfTkFNRSAoc3ltcCwgc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKnN5bXAyOwotCi0JICAvKiBGSVhNRTogQ3JlYXRpbmcgYSBuZXcgc3ltYm9sIGhlcmUgaXMgcmlza3kuICBXZSdyZSBpbiB0aGUKLSAgICAgICAgICAgICBmaW5hbCBsb29wIG92ZXIgdGhlIHN5bWJvbCB0YWJsZS4gIFdlIGNhbiBnZXQgYXdheSB3aXRoCi0gICAgICAgICAgICAgaXQgb25seSBiZWNhdXNlIHRoZSBzeW1ib2wgZ29lcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LAotICAgICAgICAgICAgIHdoZXJlIHRoZSBsb29wIHdpbGwgc3RpbGwgc2VlIGl0LiAgSXQgd291bGQgcHJvYmFibHkgYmUKLSAgICAgICAgICAgICBiZXR0ZXIgdG8gZG8gdGhpcyBpbiBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QuICovCi0KLQkgIHN5bXAyID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSk7Ci0KLQkgIC8qIE5vdyB3ZSBhY3QgYXMgdGhvdWdoIHdlIHNhdyBzeW1wMiA9IHN5bS4gICovCi0KLQkgIFNfU0VUX1NFR01FTlQgKHN5bXAyLCBTX0dFVF9TRUdNRU5UIChzeW1wKSk7Ci0KLQkgIC8qIFN1YnRyYWN0aW5nIG91dCB0aGUgZnJhZyBhZGRyZXNzIGhlcmUgaXMgYSBoYWNrIGJlY2F1c2UKLSAgICAgICAgICAgICB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZmluYWwgbG9vcC4gICovCi0JICBTX1NFVF9WQUxVRSAoc3ltcDIsCi0JCSAgICAgICAoU19HRVRfVkFMVUUgKHN5bXApCi0JCQktIHN5bWJvbF9nZXRfZnJhZyAoc3ltcCktPmZyX2FkZHJlc3MpKTsKLQotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1wMiwgc3ltYm9sX2dldF9mcmFnIChzeW1wKSk7Ci0KLQkgIC8qIFRoaXMgd2lsbCBjb3B5IG92ZXIgdGhlIHNpemUgaW5mb3JtYXRpb24uICAqLwotCSAgY29weV9zeW1ib2xfYXR0cmlidXRlcyAoc3ltcDIsIHN5bXApOwotCi0JICBpZiAoU19JU19XRUFLIChzeW1wKSkKLQkgICAgU19TRVRfV0VBSyAoc3ltcDIpOwotCi0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltcCkpCi0JICAgIFNfU0VUX0VYVEVSTkFMIChzeW1wMik7Ci0JfQotICAgIH0KLQotICAvKiBEb3VibGUgY2hlY2sgd2VhayBzeW1ib2xzLiAgKi8KLSAgaWYgKFNfSVNfV0VBSyAoc3ltcCkpCi0gICAgewotICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW1wKSkKLQlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKLQkJU19HRVRfTkFNRSAoc3ltcCkpOwotICAgIH0KLQotI2lmZGVmIFRDX01JUFMKLSAgLyogVGhlIElyaXggNSBhbmQgNiBhc3NlbWJsZXJzIHNldCB0aGUgdHlwZSBvZiBhbnkgY29tbW9uIHN5bWJvbCBhbmQKLSAgICAgYW55IHVuZGVmaW5lZCBub24tZnVuY3Rpb24gc3ltYm9sIHRvIFNUVF9PQkpFQ1QuICBXZSB0cnkgdG8gYmUKLSAgICAgY29tcGF0aWJsZSwgc2luY2UgbmV3ZXIgSXJpeCA1IGFuZCA2IGxpbmtlcnMgY2FyZS4gIEhvd2V2ZXIsIHdlCi0gICAgIG9ubHkgc2V0IHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIFNUVF9PQkpFQ1QgaWYgd2UgYXJlIG9uIElyaXgsCi0gICAgIGJlY2F1c2UgdGhhdCBpcyB0aGUgb25seSB0aW1lIGdjYyB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKLSAgICAgLmdsb2JhbCBkaXJlY3RpdmVzIHRvIG1hcmsgZnVuY3Rpb25zLiAgKi8KLQotICBpZiAoU19JU19DT01NT04gKHN5bXApKQotICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQotICBpZiAoc3Ryc3RyIChUQVJHRVRfT1MsICJpcml4IikgIT0gTlVMTAotICAgICAgJiYgISBTX0lTX0RFRklORUQgKHN5bXApCi0gICAgICAmJiAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMCkKLSAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0jZW5kaWYKLQotI2lmIDAgLyogVENfUFBDICovCi0gIC8qIElmIFRDX1BQQyBpcyBkZWZpbmVkLCB3ZSB1c2VkIHRvIGZvcmNlIHRoZSB0eXBlIG9mIGEgc3ltYm9sIHRvIGJlCi0gICAgIEJTRl9PQkpFQ1QgaWYgaXQgd2FzIG90aGVyd2lzZSB1bnNldC4gIFRoaXMgd2FzIHJlcXVpcmVkIGJ5IHNvbWUKLSAgICAgdmVyc2lvbiBvZiBWeFdvcmtzLiAgVGhvbWFzIGRlIExlbGxpcyA8dGRlbEB3aW5kcml2ZXIuY29tPiBzYXlzCi0gICAgIHRoYXQgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkLCBzbyBpdCBpcyBub3cgY29tbWVudGVkIG91dC4gICovCi0gIGlmICgoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncwotICAgICAgICYgKEJTRl9GVU5DVElPTiB8IEJTRl9GSUxFIHwgQlNGX1NFQ1RJT05fU1lNKSkgPT0gMAotICAgICAgJiYgU19JU19ERUZJTkVEIChzeW1wKSkKLSAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0jZW5kaWYKLX0KLQotdm9pZAotZWxmX2Zyb2JfZmlsZSAoKQotewotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgYWRqdXN0X3N0YWJfc2VjdGlvbnMsIChQVFIpIDApOwotCi0jaWZkZWYgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcKLSAgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcgKCk7Ci0jZW5kaWYKLX0KLQotLyogSXQgaXMgcmVxdWlyZWQgdGhhdCB3ZSBsZXQgd3JpdGVfcmVsb2NzIGhhdmUgdGhlIG9wcG9ydHVuaXR5IHRvCi0gICBvcHRpbWl6ZSBhd2F5IGZpeHVwcyBiZWZvcmUgb3V0cHV0IGhhcyBiZWd1biwgc2luY2UgaXQgaXMgcG9zc2libGUKLSAgIHRvIGVsaW1pbmF0ZSBhbGwgZml4dXBzIGZvciBhIHNlY3Rpb24gYW5kIHRodXMgd2UgbmV2ZXIgc2hvdWxkCi0gICBoYXZlIGdlbmVyYXRlZCB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KLQotdm9pZAotZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLXsKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgLyogR2VuZXJhdGUgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmRlYnVnX3N3YXA7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1ZzsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGRlYnVnX3N3YXAKLQk9IGdldF9lbGZfYmFja2VuZF9kYXRhIChzdGRvdXRwdXQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotICAgICAga25vdyAoZGVidWdfc3dhcCAhPSAoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKikgTlVMTCk7Ci0gICAgICBlY29mZl9idWlsZF9kZWJ1ZyAoJmRlYnVnLnN5bWJvbGljX2hlYWRlciwgJmJ1ZiwgZGVidWdfc3dhcCk7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgcG9pbnRlcnMgaW4gZGVidWcuICAqLwotI2RlZmluZSBTRVQocHRyLCBvZmZzZXQsIHR5cGUpIFwKLSAgICBkZWJ1Zy5wdHIgPSAodHlwZSkgKGJ1ZiArIGRlYnVnLnN5bWJvbGljX2hlYWRlci5vZmZzZXQpCi0KLSAgICAgIFNFVCAobGluZSwgY2JMaW5lT2Zmc2V0LCB1bnNpZ25lZCBjaGFyICopOwotICAgICAgU0VUIChleHRlcm5hbF9kbnIsIGNiRG5PZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX3BkciwgY2JQZE9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfb3B0LCBjYk9wdE9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgdW5pb24gYXV4X2V4dCAqKTsKLSAgICAgIFNFVCAoc3MsIGNiU3NPZmZzZXQsIGNoYXIgKik7Ci0gICAgICBTRVQgKGV4dGVybmFsX2ZkciwgY2JGZE9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgUFRSKTsKLSAgICAgIC8qIHNzZXh0IGFuZCBleHRlcm5hbF9leHQgYXJlIHNldCB1cCBqdXN0IGJlbG93LiAgKi8KLQotI3VuZGVmIFNFVAotCi0gICAgICAvKiBTZXQgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMuICAqLwotICAgICAgZGVidWcuc3NleHQgPSBkZWJ1Zy5zc2V4dF9lbmQgPSBOVUxMOwotICAgICAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBpZiAoISBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChzdGRvdXRwdXQsICZkZWJ1ZywgZGVidWdfc3dhcCwgdHJ1ZSwKLQkJCQkgICAgICAgZWxmX2dldF9leHRyLCBlbGZfc2V0X2luZGV4KSkKLQlhc19mYXRhbCAoXygiRmFpbGVkIHRvIHNldCB1cCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb246ICVzIiksCi0JCSAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LCAiLm1kZWJ1ZyIpOwotICAgICAgYXNzZXJ0IChzZWMgIT0gTlVMTCk7Ci0KLSAgICAgIGtub3cgKHN0ZG91dHB1dC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSk7Ci0KLSAgICAgIC8qIFdlIHNldCB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgY2FsbCBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLQkgdG8gZm9yY2UgdGhlIEVMRiBiYWNrZW5kIHRvIGFsbG9jYXRlIGEgZmlsZSBwb3NpdGlvbiwgYW5kIHRoZW4KLQkgd3JpdGUgb3V0IHRoZSBkYXRhLiAgRklYTUU6IElzIHRoaXMgcmVhbGx5IHRoZSBiZXN0IHdheSB0byBkbwotCSB0aGlzPyAgKi8KLSAgICAgIHNlYy0+X3Jhd19zaXplID0gYmZkX2Vjb2ZmX2RlYnVnX3NpemUgKHN0ZG91dHB1dCwgJmRlYnVnLCBkZWJ1Z19zd2FwKTsKLQotICAgICAgLyogUGFzcyBCVUYgdG8gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGJlY2F1c2UgdGhpcyB3aWxsCi0gICAgICAgICBldmVudHVhbGx5IGJlY29tZSBhIGNhbGwgdG8gZndyaXRlLCBhbmQgSVNPIEMgcHJvaGliaXRzCi0gICAgICAgICBwYXNzaW5nIGEgTlVMTCBwb2ludGVyIHRvIGEgc3RkaW8gZnVuY3Rpb24gZXZlbiBpZiB0aGUKLSAgICAgICAgIHBvaW50ZXIgd2lsbCBub3QgYmUgdXNlZC4gICovCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLCAoUFRSKSBidWYsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSkgMCkpCi0JYXNfZmF0YWwgKF8oIkNhbid0IHN0YXJ0IHdyaXRpbmcgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIpLAotCQkgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQotICAgICAga25vdyAoc3Rkb3V0cHV0LT5vdXRwdXRfaGFzX2JlZ3VuID09IHRydWUpOwotICAgICAga25vdyAoc2VjLT5maWxlcG9zICE9IDApOwotCi0gICAgICBpZiAoISBiZmRfZWNvZmZfd3JpdGVfZGVidWcgKHN0ZG91dHB1dCwgJmRlYnVnLCBkZWJ1Z19zd2FwLAotCQkJCSAgIHNlYy0+ZmlsZXBvcykpCi0JYXNfZmF0YWwgKF8oIkNvdWxkIG5vdCB3cml0ZSAubWRlYnVnIHNlY3Rpb246ICVzIiksCi0JCSAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIH0KLSNlbmRpZiAvKiBORUVEX0VDT0ZGX0RFQlVHICovCi19Ci0KLSNpZmRlZiBTQ09fRUxGCi0KLS8qIEhlYXZpbHkgcGxhZ2FyaXplZCBmcm9tIG9ial9lbGZfdmVyc2lvbi4gIFRoZSBpZGVhIGlzIHRvIGVtaXQgdGhlCi0gICBTQ08gc3BlY2lmaWMgaWRlbnRpZmllciBpbiB0aGUgLm5vdGVzIHNlY3Rpb24gdG8gc2F0aXNmeSB0aGUgU0NPCi0gICBsaW5rZXIuCi0KLSAgIFRoaXMgbG9va3MgbW9yZSBjb21wbGljYXRlZCB0aGFuIGl0IHJlYWxseSBpcy4gIEFzIG9wcG9zZWQgdG8gdGhlCi0gICAib2J2aW91cyIgc29sdXRpb24sIHRoaXMgc2hvdWxkIGhhbmRsZSB0aGUgY3Jvc3MgZGV2IGNhc2VzCi0gICBjb3JyZWN0bHkuICAoaS5lLCBob3N0aW5nIG9uIGEgNjQgYml0IGJpZyBlbmRpYW4gcHJvY2Vzc29yLCBidXQKLSAgIGdlbmVyYXRpbmcgU0NPIEVsZiBjb2RlKSBFZmZpY2llbmN5IGlzbid0IGEgY29uY2VybiwgYXMgdGhlcmUKLSAgIHNob3VsZCBiZSBleGFjdGx5IG9uZSBvZiB0aGVzZSBzZWN0aW9ucyBwZXIgb2JqZWN0IG1vZHVsZS4KLQotICAgU0NPIE9wZW5TZXJ2ZXIgNSBpZGVudGlmaWVzIGl0J3MgRUxGIG1vZHVsZXMgd2l0aCBhIHN0YW5kYXJkIEVMRgotICAgLm5vdGUgc2VjdGlvbi4KLQotICAgaW50XzMyIG5hbWVzeiAgPSA0IDsgIE5hbWUgc2l6ZQotICAgaW50XzMyIGRlc2NzeiAgPSAxMiA7IERlc2NyaXB0aXZlIGluZm9ybWF0aW9uCi0gICBpbnRfMzIgdHlwZSAgICA9IDEgOwotICAgY2hhciAgIG5hbWVbNF0gPSAiU0NPIiA7IE9yaWdpbmF0b3IgbmFtZSBBTFdBWVMgU0NPICsgTlVMTAotICAgaW50XzMyIHZlcnNpb24gPSAobWFqb3IgdmVyICMgPDwgMTYpICB8IHZlcnNpb24gb2YgdG9vbHMgOwotICAgaW50XzMyIHNvdXJjZSAgPSAodG9vbF9pZCA8PCAxNiApIHwgMSA7Ci0gICBpbnRfMzIgaW5mbyAgICA9IDAgOyAgICBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBTQ08gdG9vbHMsIGJ1dCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgdGhlIHNvdXJjZQotCQkJICAgZW52aXJvbm1lbnQgdG8gc2V0IHRoZW0uICBTQ08gbGQgY3VycmVudGx5Ci0JCQkgICBpZ25vcmVzIHRoZW0sIGFuZCByZWNvbW1lbmRzIHdlIHNldCB0aGVtCi0JCQkgICB0byB6ZXJvLiAgKi8KLQotI2RlZmluZSBTQ09fTUFKT1JfVkVSU0lPTiAweDEKLSNkZWZpbmUgU0NPX01JTk9SX1ZFUlNJT04gMHgxCi0KLXZvaWQKLXNjb19pZCAoKQotewotCi0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBjOwotICBjaGFyIGNoOwotICBjaGFyICpwOwotICBhc2VjdGlvbiAqc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBzdWJzZWcgPSBub3dfc3Vic2VnOwotICBFbGZfSW50ZXJuYWxfTm90ZSBpX25vdGU7Ci0gIEVsZl9FeHRlcm5hbF9Ob3RlIGVfbm90ZTsKLSAgYXNlY3Rpb24gKm5vdGVfc2VjcCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBpbnQgaSwgbGVuOwotCi0gIC8qIGNyZWF0ZSB0aGUgLm5vdGUgc2VjdGlvbiAqLwotCi0gIG5vdGVfc2VjcCA9IHN1YnNlZ19uZXcgKCIubm90ZSIsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCSBub3RlX3NlY3AsCi0JCQkgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSk7Ci0KLSAgLyogcHJvY2VzcyB0aGUgdmVyc2lvbiBzdHJpbmcgKi8KLQotICBpX25vdGUubmFtZXN6ID0gNDsKLSAgaV9ub3RlLmRlc2NzeiA9IDEyOwkJLyogMTIgZGVzY3JpcHRpdmUgYnl0ZXMgKi8KLSAgaV9ub3RlLnR5cGUgPSBOVF9WRVJTSU9OOwkvKiBDb250YWlucyBhIHZlcnNpb24gc3RyaW5nICovCi0KLSAgcCA9IGZyYWdfbW9yZSAoc2l6ZW9mIChpX25vdGUubmFtZXN6KSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLm5hbWVzeiwgNCk7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoc2l6ZW9mIChpX25vdGUuZGVzY3N6KSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLmRlc2NzeiwgNCk7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoc2l6ZW9mIChpX25vdGUudHlwZSkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS50eXBlLCA0KTsKLQotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgc3RyY3B5IChwLCAiU0NPIik7Ci0KLSAgLyogTm90ZTogdGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEVMRiB3ZSdyZSByZXByZXNlbnRpbmcgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgKFNDT19NQUpPUl9WRVJTSU9OIDw8IDE2KSB8IChTQ09fTUlOT1JfVkVSU0lPTiksIDQpOwotCi0gIC8qIEhlcmUsIHdlIHBpY2sgYSBtYWdpYyBudW1iZXIgZm9yIG91cnNlbHZlcyAoeWVzLCBJICJyZWdpc3RlcmVkIgotICAgICBpdCB3aXRoIFNDTy4gIFRoZSBib3R0b20gYml0IHNob3dzIHRoYXQgd2UgYXJlIGNvbXBhdCB3aXRoIHRoZQotICAgICBTQ08gQUJJLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgMHg0YzUyMDAwMCB8IDB4MDAwMSwgNCk7Ci0KLSAgLyogSWYgd2Uga25ldyAob3IgY2FyZWQpIHdoYXQgdGhlIHNvdXJjZSBsYW5ndWFnZSBvcHRpb25zIHdlcmUsIHdlJ2QKLSAgICAgZmlsbCB0aGVtIGluIGhlcmUuICBTQ08gaGFzIGdpdmVuIHVzIHBlcm1pc3Npb24gdG8gaWdub3JlIHRoZXNlCi0gICAgIGFuZCBqdXN0IHNldCB0aGVtIHRvIHplcm8uICAqLwotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAweDAwMDAsIDQpOwotCi0gIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gIC8qIFdlIHByb2JhYmx5IGNhbid0IHJlc3RvcmUgdGhlIGN1cnJlbnQgc2VnbWVudCwgZm9yIHRoZXJlIGxpa2VseQotICAgICBpc24ndCBvbmUgeWV0Li4uICAqLwotICBpZiAoc2VnICYmIHN1YnNlZykKLSAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0KLX0KLQotI2VuZGlmIC8qIFNDT19FTEYgKi8KLQotY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWxmX2Zvcm1hdF9vcHMgPQotewotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotICAwLAkvKiBkZmxfbGVhZGluZ191bmRlcnNjb3JlICovCi0gIDEsCS8qIGVtaXRfc2VjdGlvbl9zeW1ib2xzICovCi0gIGVsZl9mcm9iX3N5bWJvbCwKLSAgZWxmX2Zyb2JfZmlsZSwKLSAgZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MsCi0gIGVsZl9zX2dldF9zaXplLCBlbGZfc19zZXRfc2l6ZSwKLSAgZWxmX3NfZ2V0X2FsaWduLCBlbGZfc19zZXRfYWxpZ24sCi0gIGVsZl9zX2dldF9vdGhlciwKLSAgMCwJLyogc19nZXRfZGVzYyAqLwotICBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcywKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8sCi0gIGVjb2ZmX3N0YWIsCi0jZWxzZQotICAwLAkvKiBnZW5lcmF0ZV9hc21fbGluZW5vICovCi0gIDAsCS8qIHByb2Nlc3Nfc3RhYiAqLwotI2VuZGlmCi0gIGVsZl9zZWNfc3ltX29rX2Zvcl9yZWxvYywKLSAgZWxmX3BvcF9pbnNlcnQsCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBlbGZfZWNvZmZfc2V0X2V4dCwKLSNlbHNlCi0gIDAsCS8qIGVjb2ZmX3NldF9leHQgKi8KLSNlbmRpZgotICBlbGZfb2JqX3JlYWRfYmVnaW5faG9vaywKLSAgZWxmX29ial9zeW1ib2xfbmV3X2hvb2ssCi19OwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWxmLmggYi9nYXMvY29uZmlnL29iai1lbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyYzVmZC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1lbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKiBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogSFAgUEEtUklTQyBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlCi0gICBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLiAgKi8KLQotI2lmbmRlZiBfT0JKX0VMRl9ICi0jZGVmaW5lIF9PQkpfRUxGX0gKLQotI2RlZmluZSBPQkpfRUxGIDEKLQotI2lmbmRlZiBPVVRQVVRfRkxBVk9SCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9lbGZfZmxhdm91cgotI2VuZGlmCi0KLSNpbmNsdWRlIDxiZmQuaD4KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQJCS8qIGZvciBub3cgKi8KLSNpbmNsdWRlICJiZmQvZWxmLWJmZC5oIgotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmZGVmIFRDX0FMUEhBCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyBhbHBoYV9mbGFnX21kZWJ1ZwotZXh0ZXJuIGludCBhbHBoYV9mbGFnX21kZWJ1ZzsKLSNlbmRpZgotCi0vKiBGb3Igbm93LCBhbHdheXMgc2V0IEVDT0ZGX0RFQlVHR0lORyBmb3IgYSBNSVBTIHRhcmdldC4gICovCi0jaWZkZWYgVENfTUlQUwotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAwCi0jZWxzZQotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMQotI2VuZGlmIC8qIE1JUFNfU1RBQlNfRUxGICovCi0jZW5kaWYgLyogVENfTUlQUyAqLwotCi0jaWZkZWYgT0JKX01BWUJFX0VDT0ZGCi0jaWZuZGVmIEVDT0ZGX0RFQlVHR0lORwotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMQotI2VuZGlmCi0jZW5kaWYKLQotLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHN5bWJvbC4gICovCi1zdHJ1Y3QgZWxmX29ial9zeQotewotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgaGFzIGJlZW4gbWFya2VkIGFzIGxvY2FsLiAgKi8KLSAgaW50IGxvY2FsOwotCi0gIC8qIFVzZSB0aGlzIHRvIGtlZXAgdHJhY2sgb2YgLnNpemUgZXhwcmVzc2lvbnMgdGhhdCBpbnZvbHZlCi0gICAgIGRpZmZlcmVuY2VzIHRoYXQgd2UgY2FuJ3QgY29tcHV0ZSB5ZXQuICAqLwotICBleHByZXNzaW9uUyAqc2l6ZTsKLQotICAvKiBUaGUgbmFtZSBzcGVjaWZpZWQgYnkgdGhlIC5zeW12ZXIgZGlyZWN0aXZlLiAgKi8KLSAgY2hhciAqdmVyc2lvbmVkX25hbWU7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB3ZSBuZWVkIHNvbWUKLSAgICAgYWRkaXRpb25hbCBmaWVsZHMgZm9yIGVhY2ggc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVmZHIgKmVjb2ZmX2ZpbGU7Ci0gIHN0cnVjdCBsb2NhbHN5bSAqZWNvZmZfc3ltYm9sOwotICB2YWx1ZVQgZWNvZmZfZXh0ZXJuX3NpemU7Ci0jZW5kaWYKLX07Ci0KLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgc3RydWN0IGVsZl9vYmpfc3kKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgICFGQUxTRQotI2VuZGlmCi0KLSNkZWZpbmUgb2JqX2JlZ2luKCkgZWxmX2JlZ2luICgpCi1leHRlcm4gdm9pZCBlbGZfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotCi0vKiBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gYWRkcmVzcyBzaXplISAqLwotI2RlZmluZSBlbGZfc3ltYm9sKGFzeW1ib2wpICgoZWxmX3N5bWJvbF90eXBlICopKCYoYXN5bWJvbCktPnRoZV9iZmQpKQotCi0jaWZuZGVmIFNfR0VUX1NJWkUKLSNkZWZpbmUgU19HRVRfU0laRShTKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUpCi0jZW5kaWYKLSNpZm5kZWYgU19TRVRfU0laRQotI2RlZmluZSBTX1NFVF9TSVpFKFMsVikgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplID0gKFYpKQotI2VuZGlmCi0KLSNpZm5kZWYgU19HRVRfQUxJR04KLSNkZWZpbmUgU19HRVRfQUxJR04oUykgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZSkKLSNlbmRpZgotI2lmbmRlZiBTX1NFVF9BTElHTgotI2RlZmluZSBTX1NFVF9BTElHTihTLFYpIFwKLSAgKGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWUgPSAoVikpCi0jZW5kaWYKLQotaW50IGVsZl9zX2dldF9vdGhlciBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNpZm5kZWYgU19HRVRfT1RIRVIKLSNkZWZpbmUgU19HRVRfT1RIRVIoUykJKGVsZl9zX2dldF9vdGhlciAoUykpCi0jZW5kaWYKLSNpZm5kZWYgU19TRVRfT1RIRVIKLSNkZWZpbmUgU19TRVRfT1RIRVIoUyxWKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyID0gKFYpKQotI2VuZGlmCi0KLWV4dGVybiBhc2VjdGlvbiAqZ2RiX3NlY3Rpb247Ci0KLSNpZm5kZWYgb2JqX2Zyb2JfZmlsZQotI2RlZmluZSBvYmpfZnJvYl9maWxlICBlbGZfZnJvYl9maWxlCi0jZW5kaWYKLWV4dGVybiB2b2lkIGVsZl9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0jaWZuZGVmIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICBlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotI2VuZGlmCi1leHRlcm4gdm9pZCBlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgb2JqX2FwcF9maWxlIGVsZl9maWxlX3N5bWJvbAotZXh0ZXJuIHZvaWQgZWxmX2ZpbGVfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKikpOwotCi1leHRlcm4gdm9pZCBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBvYmpfZWxmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX3ByZXZpb3VzIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgb2JqX2VsZl92ZXJzaW9uIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgb2JqX2VsZl9jb21tb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX2RhdGEgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX3RleHQgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEJGRCB3YW50cyB0byB3cml0ZSB0aGUgdWRhdGEgZmllbGQsIHdoaWNoIGlzIGEgbm8tbm8gZm9yIHRoZQotICAgZ2xvYmFsbHkgZGVmaW5lZCBzZWN0aW9ucy4gICovCi0jaWZuZGVmIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MoU0VDKQkoKFNFQyktPm93bmVyICE9IDApCi0jZW5kaWYKLQotdm9pZCBlbGZfb2JqX3JlYWRfYmVnaW5faG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZuZGVmIG9ial9yZWFkX2JlZ2luX2hvb2sKLSNkZWZpbmUgb2JqX3JlYWRfYmVnaW5faG9vawllbGZfb2JqX3JlYWRfYmVnaW5faG9vawotI2VuZGlmCi0KLXZvaWQgZWxmX29ial9zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0jaWZuZGVmIG9ial9zeW1ib2xfbmV3X2hvb2sKLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vawllbGZfb2JqX3N5bWJvbF9uZXdfaG9vawotI2VuZGlmCi0KLS8qIFdoZW4gc2V0dGluZyBvbmUgc3ltYm9sIGVxdWFsIHRvIGFub3RoZXIsIGJ5IGRlZmF1bHQgd2UgcHJvYmFibHkKLSAgIHdhbnQgdGhlbSB0byBoYXZlIHRoZSBzYW1lICJzaXplIiwgd2hhdGV2ZXIgaXQgbWVhbnMgaW4gdGhlIGN1cnJlbnQKLSAgIGNvbnRleHQuICAqLwotI2lmbmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhERVNULFNSQykJCQlcCi1kbwkJCQkJCQkJXAotICB7CQkJCQkJCQlcCi0gICAgc3RydWN0IGVsZl9vYmpfc3kgKnNyY2VsZiA9IHN5bWJvbF9nZXRfb2JqIChTUkMpOwkJXAotICAgIHN0cnVjdCBlbGZfb2JqX3N5ICpkZXN0ZWxmID0gc3ltYm9sX2dldF9vYmogKERFU1QpOwkJXAotICAgIGlmIChzcmNlbGYtPnNpemUpCQkJCQkJXAotICAgICAgewkJCQkJCQkJXAotCWlmIChkZXN0ZWxmLT5zaXplID09IE5VTEwpCQkJCVwKLQkgIGRlc3RlbGYtPnNpemUgPQkJCQkJXAotCSAgICAoZXhwcmVzc2lvblMgKikgeG1hbGxvYyAoc2l6ZW9mIChleHByZXNzaW9uUykpOwlcCi0JKmRlc3RlbGYtPnNpemUgPSAqc3JjZWxmLT5zaXplOwkJCQlcCi0gICAgICB9CQkJCQkJCQlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQlcCi0JaWYgKGRlc3RlbGYtPnNpemUgIT0gTlVMTCkJCQkJXAotCSAgZnJlZSAoZGVzdGVsZi0+c2l6ZSk7CQkJCQlcCi0JZGVzdGVsZi0+c2l6ZSA9IE5VTEw7CQkJCQlcCi0gICAgICB9CQkJCQkJCQlcCi0gICAgU19TRVRfU0laRSAoKERFU1QpLCBTX0dFVF9TSVpFIChTUkMpKTsJCQlcCi0gICAgU19TRVRfT1RIRVIgKChERVNUKSwgU19HRVRfT1RIRVIgKFNSQykpOwkJCVwKLSAgfQkJCQkJCQkJXAotd2hpbGUgKDApCi0jZW5kaWYKLQotLyogU3RhYnMgZ28gaW4gYSBzZXBhcmF0ZSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAxCi0KLS8qIFdlIG5lZWQgMTIgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIHRvIGhvbGQgc29tZSBpbml0aWFsCi0gICBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gdm9pZCBvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKLSNkZWZpbmUgSU5JVF9TVEFCX1NFQ1RJT04oc2VnKSBvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLS8qIFdlIHNtdWdnbGUgc3RhYnMgaW4gRUNPRkYgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSBzZWN0aW9uLgotICAgVGhlIElyaXggbGlua2VyIGNhbiBub3QgaGFuZGxlIGEgc2VwYXJhdGUgc3RhYnMgc2VjdGlvbi4gICovCi0KLSN1bmRlZiAgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TICghRUNPRkZfREVCVUdHSU5HKQotCi0jdW5kZWYgIElOSVRfU1RBQl9TRUNUSU9OCi0jZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgXAotICAoKHZvaWQpKEVDT0ZGX0RFQlVHR0lORyA/IDAgOiAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKSwgMCkpKQotCi0jdW5kZWYgT0JKX1BST0NFU1NfU1RBQgotI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKHNlZywgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykJCVwKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykJCQkJCQkJXAotICAgIGVjb2ZmX3N0YWIgKChzZWcpLCAod2hhdCksIChzdHJpbmcpLCAodHlwZSksIChvdGhlciksIChkZXNjKSkKLSNlbmRpZiAvKiBFQ09GRl9ERUJVR0dJTkcgKi8KLQotZXh0ZXJuIHZvaWQgZWxmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50ICopKTsKLSNpZm5kZWYgb2JqX2Zyb2Jfc3ltYm9sCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChzeW1wLCBwdW50KSBlbGZfZnJvYl9zeW1ib2wgKHN5bXAsICZwdW50KQotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGVsZl9wb3BfaW5zZXJ0IFBBUkFNUyAoKHZvaWQpKTsKLSNpZm5kZWYgb2JqX3BvcF9pbnNlcnQKLSNkZWZpbmUgb2JqX3BvcF9pbnNlcnQoKQllbGZfcG9wX2luc2VydCgpCi0jZW5kaWYKLQotI2lmbmRlZiBPQkpfTUFZQkVfRUxGCi0jZGVmaW5lIG9ial9lY29mZl9zZXRfZXh0IGVsZl9lY29mZl9zZXRfZXh0Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgZWNvZmZfZXh0cjsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgZWxmX2Vjb2ZmX3NldF9leHQgUEFSQU1TICgoc3ltYm9sUyAqLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqKSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9PQkpfRUxGX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWV2YXguYyBiL2dhcy9jb25maWcvb2JqLWV2YXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxOGM4My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ldmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKiBvYmotZXZheC5jIC0gRVZBWCAob3BlblZNUy9BbHBoYSkgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgS2xhdXMgS+RtcGYgKGtrYWVtcGZAcHJvZ2lzLmRlKSBvZgotICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlcgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCi0gICBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1ldmF4LmgiCi0KLSNpbmNsdWRlICJhcy5oIgotCi1zdGF0aWMgdm9pZCBzX2V2YXhfd2VhayBQQVJBTVMgKChpbnQpKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgIndlYWsiLCBzX2V2YXhfd2VhaywgMH0sCi0gIHswLCAwLCAwfSwKLX07CQkJCS8qIG9ial9wc2V1ZG9fdGFibGUgKi8KLQotdm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rICgpIHt9Ci0KLS8qIEhhbmRsZSB0aGUgd2VhayBzcGVjaWZpYyBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19ldmF4X3dlYWsgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiBvYmotZXZheC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ldmF4LmggYi9nYXMvY29uZmlnL29iai1ldmF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWIxZmUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZXZheC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1ldmF4LmgKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkgb2YKLSAgICAgcHJvR0lTIFNvZnR3YXJlLCBBYWNoZW4sIEdlcm1hbnkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgb2JqLWV2YXguaCBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKLSAqIG9iamVjdCBmb3JtYXQgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotICovCi0KLS8qIGRlZmluZSBhbiBvYmogc3BlY2lmaWMgbWFjcm8gb2ZmIHdoaWNoIHRhcmdldCBjcHUgYmFjayBlbmRzIG1heSBrZXkuICovCi0jZGVmaW5lIE9CSl9FVkFYIDEKLQotLyogaW5jbHVkZSB3aGF0ZXZlciB0YXJnZXQgY3B1IGlzIGFwcHJvcHJpYXRlLiAqLwotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKLSNlbmRpZgotCi0vKgotICogU1lNQk9MUwotICovCi0KLS8qCi0gKiBJZiB5b3VyIG9iamVjdCBmb3JtYXQgbmVlZHMgdG8gcmVvcmRlciBzeW1ib2xzLCBkZWZpbmUgdGhpcy4gIFdoZW4KLSAqIGRlZmluZWQsIHN5bWJvbHMgYXJlIGtlcHQgb24gYSBkb3VibHkgbGlua2VkIGxpc3QgYW5kIGZ1bmN0aW9ucyBhcmUKLSAqIG1hZGUgYXZhaWxhYmxlIGZvciBwdXNoLCBpbnNlcnQsIGFwcGVuZCwgYW5kIGRlbGV0ZS4gIElmIG5vdCBkZWZpbmVkLAotICogc3ltYm9scyBhcmUga2VwdCBvbiBhIHNpbmdseSBsaW5rZWQgbGlzdCwgb25seSB0aGUgYXBwZW5kIGFuZCBjbGVhcgotICogZmFjaWxpdGllcyBhcmUgYXZhaWxhYmxlLCBhbmQgdGhleSBhcmUgbWFjcm9zLgotICovCi0KLS8qICNkZWZpbmUgU1lNQk9MU19ORUVEX1BBQ0tQT0lOVEVSUyAqLwotCi0vKiAgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB2b2lkICpub3RoaW5nOwotICB9Ci1vYmpfc3ltYm9sX3R5cGU7CQkvKiBzaG91bGQgYmUgdGhlIGZvcm1hdCdzIHN5bWJvbCBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiB2b2lkICpvYmplY3RfaGVhZGVyczsKLQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKDApCS8qIHlvdXIgbWFnaWMgbnVtYmVyICovCi0KLSNkZWZpbmUgT0JKX0VNSVRfTElORU5PKGEsYixjKQkvKiBtdXN0IGJlICpzb21ldGhpbmcqLiAgVGhpcyBuby1vcCdzIGl0IG91dC4gKi8KLQotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpICAgICAgICB7O30KLQotI2RlZmluZSBTX1NFVF9PVEhFUihTLFYpCi0jZGVmaW5lIFNfU0VUX1RZUEUoUyxUKQotI2RlZmluZSBTX1NFVF9ERVNDKFMsRCkKLSNkZWZpbmUgU19HRVRfT1RIRVIoUykJMAotI2RlZmluZSBTX0dFVF9UWVBFKFMpCTAKLSNkZWZpbmUgU19HRVRfREVTQyhTKQkwCi0KLSNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9TVEFDSyA5Ci0jZGVmaW5lIFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVIgMTAKLSNkZWZpbmUgUERTQ19TX0tfS0lORF9OVUxMIDgKLQotI2RlZmluZSBQRFNDX1NfS19NSU5fU1RBQ0tfU0laRSAzMgotI2RlZmluZSBQRFNDX1NfS19NSU5fUkVHSVNURVJfU0laRSAyNAotI2RlZmluZSBQRFNDX1NfS19OVUxMX1NJWkUgMTYKLQotI2RlZmluZSBQRFNDX1NfTV9CQVNFX1JFR19JU19GUCAweDgwCS8qIGxvdyBieXRlICovCi0jZGVmaW5lIFBEU0NfU19NX05BVElWRSAweDEwCQkvKiBoaWdoIGJ5dGUgKi8KLSNkZWZpbmUgUERTQ19TX01fTk9fSkFDS0VUIDB4MjAJCS8qIGhpZ2ggYnl0ZSAqLwotCi0jZGVmaW5lIExLUF9TX0tfU0laRSAxNgotCi0jZGVmaW5lIFRDX0lNUExJQ0lUX0xDT01NX0FMSUdOTUVOVChTSVpFLCBQMlZBUikgKFAyVkFSKSA9IDMKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIG9iai1ldmF4LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuYyBiL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmYzNkMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1nZW5lcmljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWdlbmVyaWMuYyBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKLSAgIG9iamVjdCBmb3JtYXQgc3BlY2lmaWMgc291cmNlIGZpbGVzLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiBvYmotZ2VuZXJpYy5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1nZW5lcmljLmggYi9nYXMvY29uZmlnL29iai1nZW5lcmljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMThlNDMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1nZW5lcmljLmgKLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgb2JqLWdlbmVyaWMuaCBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKLSAqIG9iamVjdCBmb3JtYXQgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotICovCi0KLS8qIGRlZmluZSBhbiBvYmogc3BlY2lmaWMgbWFjcm8gb2ZmIHdoaWNoIHRhcmdldCBjcHUgYmFjayBlbmRzIG1heSBrZXkuICovCi0jZGVmaW5lIE9CSl9HRU5FUklDIDEKLQotLyogaW5jbHVkZSB3aGF0ZXZlciB0YXJnZXQgY3B1IGlzIGFwcHJvcHJpYXRlLiAqLwotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLS8qCi0gKiBTWU1CT0xTCi0gKi8KLQotLyoKLSAqIElmIHlvdXIgb2JqZWN0IGZvcm1hdCBuZWVkcyB0byByZW9yZGVyIHN5bWJvbHMsIGRlZmluZSB0aGlzLiAgV2hlbgotICogZGVmaW5lZCwgc3ltYm9scyBhcmUga2VwdCBvbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBhbmQgZnVuY3Rpb25zIGFyZQotICogbWFkZSBhdmFpbGFibGUgZm9yIHB1c2gsIGluc2VydCwgYXBwZW5kLCBhbmQgZGVsZXRlLiAgSWYgbm90IGRlZmluZWQsCi0gKiBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgc2luZ2x5IGxpbmtlZCBsaXN0LCBvbmx5IHRoZSBhcHBlbmQgYW5kIGNsZWFyCi0gKiBmYWNpbGl0aWVzIGFyZSBhdmFpbGFibGUsIGFuZCB0aGV5IGFyZSBtYWNyb3MuCi0gKi8KLQotLyogI2RlZmluZSBTWU1CT0xTX05FRURfUEFDS1BPSU5URVJTICovCi0KLS8qICAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHZvaWQgKm5vdGhpbmc7Ci0gIH0KLQotb2JqX3N5bWJvbF90eXBlOwkJLyogc2hvdWxkIGJlIHRoZSBmb3JtYXQncyBzeW1ib2wgc3RydWN0dXJlICovCi0KLXR5cGVkZWYgdm9pZCAqb2JqZWN0X2hlYWRlcnM7Ci0KLS8qIHN5bWJvbHMgaGF2ZSBuYW1lcyAqLwotI2RlZmluZSBTX0dFVF9OQU1FKHMpCQkoImZvbyIpCS8qIGdldCB0aGUgbmFtZSBvZiBhIHN5bWJvbFAgKi8KLSNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQk7Ci0vKiBzeW1ib2xzIGhhdmUgc2VnbWVudHMgKi8KLSNkZWZpbmUgU19HRVRfU0VHTUVOVChzKQkoU0VHX1VOS05PV04pCi0jZGVmaW5lIFNfU0VUX1NFR01FTlQocyx2KQk7Ci0vKiBzeW1ib2xzIG1heSBiZSBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpCSgwKQotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQk7Ci0KLS8qIHN5bWJvbHMgbWF5IG9yIG1heSBub3QgYmUgZGVmaW5lZCAqLwotI2RlZmluZSBTX0lTX0RFRklORUQocykJCSgwKQotCi0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICgwKQkvKiB5b3VyIG1hZ2ljIG51bWJlciAqLwotCi0jZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLGIsYykJLyogbXVzdCBiZSAqc29tZXRoaW5nKi4gIFRoaXMgbm8tb3AncyBpdCBvdXQuICovCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiBvYmotZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ocDMwMC5jIGIvZ2FzL2NvbmZpZy9vYmotaHAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5Y2M1My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ocDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1ocDMwMC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImNvbmZpZy9vYmotYW91dC5jIgotCi0vKiBBb3V0IGZpbGUgZ2VuZXJhdGlvbiAmIHV0aWxpdGllcyAqLwotdm9pZAotaHAzMDBfaGVhZGVyX2FwcGVuZCAod2hlcmUsIGhlYWRlcnMpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHRjX2hlYWRlcnNfaG9vayAoaGVhZGVycyk7Ci0KLSNkZWZpbmUgRE8oRklFTEQpCVwKLSAgeyBcCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5GSUVMRCwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuRklFTEQpKTsgXAotICAgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5GSUVMRCk7IFwKLSAgfQotCi0gIERPIChhX2luZm8pOwotICBETyAoYV9zcGFyZTEpOwotICBETyAoYV9zcGFyZTIpOwotICBETyAoYV90ZXh0KTsgICAgICAKLSAgRE8gKGFfZGF0YSk7ICAgICAKLSAgRE8gKGFfYnNzKTsgICAgIAotICBETyAoYV90cnNpemUpOyAKLSAgRE8gKGFfZHJzaXplKTsKLSAgRE8gKGFfc3BhcmUzKTsKLSAgRE8gKGFfc3BhcmU0KTsKLSAgRE8gKGFfc3BhcmU1KTsKLSAgRE8gKGFfZW50cnkpOyAKLSAgRE8gKGFfc3BhcmU2KTsKLSAgRE8gKGFfc3BhcmU3KTsKLSAgRE8gKGFfc3ltcyk7ICAKLSAgRE8gKGFfc3BhcmU4KTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWhwMzAwLmggYi9nYXMvY29uZmlnL29iai1ocDMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQwMDZiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWhwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWhwMzAwLmgKLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXwotCi1zdHJ1Y3QgZXhlY19ieXRlcwotewotICB1bnNpZ25lZCBjaGFyIGFfaW5mb1s0XTsgICAvKiBhX21hY2h0eXBlL2FfbWFnaWMgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlMVs0XTsKLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlMls0XTsKLSAgdW5zaWduZWQgY2hhciBhX3RleHRbNF07ICAgLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV9kYXRhWzRdOyAgIC8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfYnNzWzRdOyAgICAvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV90cnNpemVbNF07IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV9kcnNpemVbNF07IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTNbNF07IC8qIEhQID0gcGFzY2FsIGludGVyZmFjZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTRbNF07IC8qIEhQID0gc3ltYm9sIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlNVs0XTsgLyogSFAgPSBkZWJ1ZyBuYW1lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBhX2VudHJ5WzRdOyAgLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU2WzRdOyAvKiBIUCA9IHNvdXJjZSBsaW5lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlN1s0XTsgLyogSFAgPSB2YWx1ZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zeW1zWzRdOyAgIC8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU4WzRdOwotfTsKLQotLyogSG93IGJpZyB0aGUgInN0cnVjdCBleGVjIiBpcyBvbiBkaXNrICovCi0jZGVmaW5lIEVYRUNfQllURVNfU0laRSAoMTYgKiA0KQotCi1zdHJ1Y3QgZXhlYwotewotICB1bnNpZ25lZCBsb25nIGFfaW5mbzsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMTsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMjsKLSAgdW5zaWduZWQgbG9uZyBhX3RleHQ7ICAgICAgCi0gIHVuc2lnbmVkIGxvbmcgYV9kYXRhOyAgICAgCi0gIHVuc2lnbmVkIGxvbmcgYV9ic3M7ICAgICAKLSAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsgCi0gIHVuc2lnbmVkIGxvbmcgYV9kcnNpemU7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTM7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTQ7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTU7Ci0gIHVuc2lnbmVkIGxvbmcgYV9lbnRyeTsgCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTY7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTc7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zeW1zOyAgCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTg7Ci19OwotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQkoT01BR0lDKQotI2RlZmluZSBBT1VUX1ZFUlNJT04JMHgwMgotI2RlZmluZSBBT1VUX01BQ0hUWVBFCTB4MGMKLSNkZWZpbmUgT01BR0lDCQkweDEwNgotICAgIAotI2RlZmluZSBvYmpfaGVhZGVyX2FwcGVuZAlocDMwMF9oZWFkZXJfYXBwZW5kCi0jaW5jbHVkZSAiY29uZmlnL29iai1hb3V0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1pZWVlLmMgYi9nYXMvY29uZmlnL29iai1pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTA3OTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotaWVlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI3ICswLDAgQEAKLS8qIG9iai1mb3JtYXQgZm9yIGllZWUtNjk1IHJlY29yZHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLQotLyoKLSAgY3JlYXRlZCBieQotCi0gIHN0ZXZlIGNoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLSAgKi8KLQotLyoKLSAgdGhpcyB3aWxsIGhvcGVmdWxseSBiZWNvbWUgdGhlIHBvcnQgdGhyb3VnaCB3aGljaCBiZmQgYW5kIGdhcyB0YWxrLAotICBmb3IgdGhlIG1vbWVudCwgb25seSBpZWVlIGlzIGtub3duIHRvIHdvcmsgd2VsbC4KLSAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm91dHB1dC1maWxlLmgiCi0jaW5jbHVkZSAiZnJhZ3MuaCIKLQotYmZkICphYmZkOwotCi0vKiBIb3cgbWFueSBhZGRyZXNzZXMgZG9lcyB0aGUgLmFsaWduIHRha2U/ICovCi1zdGF0aWMgcmVsYXhfYWRkcmVzc1QKLXJlbGF4X2FsaWduIChhZGRyZXNzLCBhbGlnbm1lbnQpCi0gICAgIHJlZ2lzdGVyIHJlbGF4X2FkZHJlc3NUIGFkZHJlc3M7CS8qIEFkZHJlc3Mgbm93LiAqLwotICAgICByZWdpc3RlciBsb25nIGFsaWdubWVudDsJLyogQWxpZ25tZW50IChiaW5hcnkpLiAqLwotewotICByZWxheF9hZGRyZXNzVCBtYXNrOwotICByZWxheF9hZGRyZXNzVCBuZXdfYWRkcmVzczsKLQotICBtYXNrID0gfigofjApIDw8IGFsaWdubWVudCk7Ci0gIG5ld19hZGRyZXNzID0gKGFkZHJlc3MgKyBtYXNrKSAmICh+bWFzayk7Ci0gIHJldHVybiAobmV3X2FkZHJlc3MgLSBhZGRyZXNzKTsKLX0JCQkJLyogcmVsYXhfYWxpZ24oKSAqLwotCi0vKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGZyYWcgY2hhaW4gYW5kIGNyZWF0ZSBhIGJmZCBzZWN0aW9uCi0gICB0byBjb250YWluIGFsbCBvZiBpdCAqLwotc3RhdGljIHZvaWQKLURFRlVOIChzaXplX3NlY3Rpb24sIChhYmZkLCBpZHgpLAotICAgICAgIGJmZCAqIGFiZmQgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgdW5zaWduZWQgaW50IHNpemUgPSAwOwotICBmcmFnUyAqZnJhZyA9IHNlZ21lbnRfaW5mb1tpZHhdLmZyYWdfcm9vdDsKLSAgd2hpbGUgKGZyYWcpCi0gICAgewotICAgICAgaWYgKGZyYWctPmZyX2FkZHJlc3MgIT0gc2l6ZSkKLQl7Ci0JICBwcmludGYgKF8oIk91dCBvZiBzdGVwXG4iKSk7Ci0JICBzaXplID0gZnJhZy0+ZnJfYWRkcmVzczsKLQl9Ci0gICAgICBzaXplICs9IGZyYWctPmZyX2ZpeDsKLSAgICAgIHN3aXRjaCAoZnJhZy0+ZnJfdHlwZSkKLQl7Ci0JY2FzZSByc19maWxsOgotCWNhc2UgcnNfb3JnOgotCSAgc2l6ZSArPSBmcmFnLT5mcl9vZmZzZXQgKiBmcmFnLT5mcl92YXI7Ci0JICBicmVhazsKLQljYXNlIHJzX2FsaWduOgotCWNhc2UgcnNfYWxpZ25fY29kZToKLQkgIHsKLQkgICAgYWRkcmVzc1Qgb2ZmOwotCi0JICAgIG9mZiA9IHJlbGF4X2FsaWduIChzaXplLCBmcmFnLT5mcl9vZmZzZXQpOwotCSAgICBpZiAoZnJhZy0+ZnJfc3VidHlwZSAhPSAwICYmIG9mZiA+IGZyYWctPmZyX3N1YnR5cGUpCi0JICAgICAgb2ZmID0gMDsKLQkgICAgc2l6ZSArPSBvZmY7Ci0JICB9Ci0JfQotICAgICAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0gICAgfQotICBpZiAoc2l6ZSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lID0gc2VnbWVudF9pbmZvW2lkeF0ubmFtZTsKLSAgICAgIGlmIChuYW1lID09IChjaGFyICopIE5VTEwpCi0JewotCSAgbmFtZSA9ICIuZGF0YSI7Ci0JfQotICAgICAgc2VnbWVudF9pbmZvW2lkeF0udXNlcl9zdHVmZiA9IChjaGFyICopIChzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKSk7Ci0gICAgICAvKiBNYWtlIGl0IG91dHB1dCB0aHJvdWdoIGl0c2VsZiAqLwotICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNlYzsKLSAgICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMsIHNpemUpOwotICAgIH0KLX0KLQotLyogcnVuIHRocm91Z2ggYSBmcmFnIGNoYWluIGFuZCB3cml0ZSBvdXQgdGhlIGRhdGEgdG8gZ28gd2l0aCBpdCAqLwotc3RhdGljIHZvaWQKLURFRlVOIChmaWxsX3NlY3Rpb24sIChhYmZkLCBpZHgpLAotICAgICAgIGJmZCAqIGFiZmQgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IHNlZ21lbnRfaW5mb1tpZHhdLnVzZXJfc3R1ZmY7Ci0gIGlmIChzZWMpCi0gICAgewotICAgICAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baWR4XS5mcmFnX3Jvb3Q7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgIHdoaWxlIChmcmFnKQotCXsKLQkgIHVuc2lnbmVkIGludCBmaWxsX3NpemU7Ci0JICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSByc19maWxsOgotCSAgICBjYXNlIHJzX2FsaWduOgotCSAgICBjYXNlIHJzX29yZzoKLQkgICAgICBpZiAoZnJhZy0+ZnJfZml4KQotCQl7Ci0JCSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAotCQkJCQkgICAgc2VjLAotCQkJCQkgICAgZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCQkJICAgIGZyYWctPmZyX2FkZHJlc3MsCi0JCQkJCSAgICBmcmFnLT5mcl9maXgpOwotCQl9Ci0JICAgICAgb2Zmc2V0ICs9IGZyYWctPmZyX2ZpeDsKLQkgICAgICBmaWxsX3NpemUgPSBmcmFnLT5mcl92YXI7Ci0JICAgICAgaWYgKGZpbGxfc2l6ZSkKLQkJewotCQkgIHVuc2lnbmVkIGludCBvZmYgPSBmcmFnLT5mcl9maXg7Ci0JCSAgZm9yIChjb3VudCA9IGZyYWctPmZyX29mZnNldDsgY291bnQ7IGNvdW50LS0pCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLAotCQkJCQkJZnJhZy0+ZnJfbGl0ZXJhbCArCi0JCQkJCQlmcmFnLT5mcl9maXgsCi0JCQkJCQlmcmFnLT5mcl9hZGRyZXNzICsgb2ZmLAotCQkJCQkJZmlsbF9zaXplKTsKLQkJICAgICAgb2ZmICs9IGZpbGxfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBmcmFnID0gZnJhZy0+ZnJfbmV4dDsKLQl9Ci0gICAgfQotfQotCi0vKiBDb3VudCB0aGUgcmVsb2NhdGlvbnMgaW4gYSBjaGFpbiAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1ERUZVTiAoY291bnRfZW50cmllc19pbl9jaGFpbiwgKGlkeCksCi0gICAgICAgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgdW5zaWduZWQgaW50IG5yZWxvY3M7Ci0gIGZpeFMgKmZpeHVwX3B0cjsKLQotICAvKiBDb3VudCB0aGUgcmVsb2NhdGlvbnMgKi8KLSAgZml4dXBfcHRyID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7Ci0gIG5yZWxvY3MgPSAwOwotICB3aGlsZSAoZml4dXBfcHRyICE9IChmaXhTICopIE5VTEwpCi0gICAgewotICAgICAgZml4dXBfcHRyID0gZml4dXBfcHRyLT5meF9uZXh0OwotICAgICAgbnJlbG9jcysrOwotICAgIH0KLSAgcmV0dXJuIG5yZWxvY3M7Ci19Ci0KLS8qIG91dHB1dCBhbGwgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24gKi8KLXZvaWQKLURFRlVOIChkb19yZWxvY3NfZm9yLCAoaWR4KSwKLSAgICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICB1bnNpZ25lZCBpbnQgbnJlbG9jczsKLSAgYXJlbGVudCAqKnJlbG9jX3B0cl92ZWN0b3I7Ci0gIGFyZWxlbnQgKnJlbG9jX3ZlY3RvcjsKLSAgYXN5bWJvbCAqKnB0cnM7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gKGFzZWN0aW9uICopIChzZWdtZW50X2luZm9baWR4XS51c2VyX3N0dWZmKTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZpeFMgKmZyb207Ci0gIGlmIChzZWN0aW9uKQotICAgIHsKLSAgICAgIG5yZWxvY3MgPSBjb3VudF9lbnRyaWVzX2luX2NoYWluIChpZHgpOwotCi0gICAgICByZWxvY19wdHJfdmVjdG9yID0gKGFyZWxlbnQgKiopIG1hbGxvYyAoKG5yZWxvY3MgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICAgICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKSBtYWxsb2MgKG5yZWxvY3MgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgICAgIHB0cnMgPSAoYXN5bWJvbCAqKikgbWFsbG9jIChucmVsb2NzICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIGZyb20gPSBzZWdtZW50X2luZm9baWR4XS5maXhfcm9vdDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBucmVsb2NzOyBpKyspCi0JewotCSAgYXJlbGVudCAqdG8gPSByZWxvY192ZWN0b3IgKyBpOwotCSAgYXN5bWJvbCAqczsKLQkgIHJlbG9jX3B0cl92ZWN0b3JbaV0gPSB0bzsKLQkgIHRvLT5ob3d0byA9IChyZWxvY19ob3d0b190eXBlICopIChmcm9tLT5meF9yX3R5cGUpOwotCi0jaWYgMAkgIC8qIFdlIGNhbid0IHJlcHJlc2VudCBjb21wbGljYXRlZCB0aGluZ3MgaW4gYSByZWxvYyB5ZXQgKi8KLQkgIGlmIChmcm9tLT5meF9hZGRzeSA9PSAwIHx8IGZyb20tPmZ4X3N1YnN5ICE9IDApIGFib3J0KCk7Ci0jZW5kaWYKLQotCSAgcyA9ICYoZnJvbS0+ZnhfYWRkc3ktPnN5X3N5bWJvbC5zeSk7Ci0JICB0by0+YWRkcmVzcyA9ICgoY2hhciAqKSAoZnJvbS0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArCi0JCQkJICAgZnJvbS0+Znhfd2hlcmUpKQotCSAgICAtICgoY2hhciAqKSAoJihmcm9tLT5meF9mcmFnLT5mcl9saXRlcmFsKSkpOwotCSAgdG8tPmFkZGVuZCA9IGZyb20tPmZ4X29mZnNldDsKLQkgIC8qIElmIHdlIGtub3cgdGhlIHN5bWJvbCB3aGljaCB3ZSB3YW50IHRvIHJlbG9jYXRlIHRvLCB0dXJuCi0JICAgICB0aGlzIHJlbG9hY3Rpb24gaW50byBhIHNlY3Rpb24gcmVsYXRpdmUuCi0KLQkgICAgIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBwY3JlbGF0aXZlLCBhbmQgd2Uga25vdyB0aGUKLQkgICAgIGRlc3RpbmF0aW9uLCB3ZSBzdGlsbCB3YW50IHRvIGtlZXAgdGhlIHJlbG9jYXRpb24gLSBzaW5jZQotCSAgICAgdGhlIGxpbmtlciBtaWdodCByZWxheCBzb21lIG9mIHRoZSBieXRlcywgYnV0IGl0IHN0b3BzCi0JICAgICBiZWluZyBwYyByZWxhdGl2ZSBhbmQgdHVybnMgaW50byBhbiBhYnNvbHV0ZSByZWxvY2F0aW9uLiAqLwotCSAgaWYgKHMpCi0JICAgIHsKLQkgICAgICBpZiAoKHMtPmZsYWdzICYgQlNGX1VOREVGSU5FRCkgPT0gMCkKLQkJewotCQkgIHRvLT5zZWN0aW9uID0gcy0+c2VjdGlvbjsKLQotCQkgIC8qIFdlIGNhbiByZWZlciBkaXJlY3RseSB0byB0aGUgdmFsdWUgZmllbGQgaGVyZSwKLQkJICAgICByYXRoZXIgdGhhbiB1c2luZyBTX0dFVF9WQUxVRSwgYmVjYXVzZSB0aGlzIGlzCi0JCSAgICAgb25seSBjYWxsZWQgYWZ0ZXIgZG9fc3ltYm9scywgd2hpY2ggc2V0cyB1cCB0aGUKLQkJICAgICB2YWx1ZSBmaWVsZC4gICovCi0JCSAgdG8tPmFkZGVuZCArPSBzLT52YWx1ZTsKLQotCQkgIHRvLT5zeW1fcHRyX3B0ciA9IDA7Ci0JCSAgaWYgKHRvLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgcGNyZWwgcmVsb2NhdGlvbiwgdGhlIGFkZGVuZCBzaG91bGQgYmUgYWRqdXN0ZWQgKi8KLQkJICAgICAgdG8tPmFkZGVuZCAtPSB0by0+YWRkcmVzcyArIDE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0by0+c2VjdGlvbiA9IDA7Ci0JCSAgKnB0cnMgPSAmKGZyb20tPmZ4X2FkZHN5LT5zeV9zeW1ib2wuc3kpOwotCQkgIHRvLT5zeW1fcHRyX3B0ciA9IHB0cnM7Ci0KLQkJICBpZiAodG8tPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBwY3JlbCByZWxvY2F0aW9uLCB0aGUgYWRkZW5kIHNob3VsZCBiZSBhZGp1c3RlZCAqLwotCQkgICAgICB0by0+YWRkZW5kIC09IHRvLT5hZGRyZXNzIC0gMTsKLQkJICAgIH0KLQkJfQotCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHRvLT5zZWN0aW9uID0gMDsKLQkgICAgfQotCi0JICBwdHJzKys7Ci0JICBmcm9tID0gZnJvbS0+ZnhfbmV4dDsKLQl9Ci0KLSAgICAgIC8qIGF0dGF0Y2ggdG8gdGhlIHNlY3Rpb24gKi8KLSAgICAgIHNlY3Rpb24tPm9yZWxvY2F0aW9uID0gcmVsb2NfcHRyX3ZlY3RvcjsKLSAgICAgIHNlY3Rpb24tPnJlbG9jX2NvdW50ID0gbnJlbG9jczsKLSAgICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19MT0FEOwotICAgIH0KLX0KLQotLyogZG8gdGhlIHN5bWJvbHMuLiAqLwotc3RhdGljIHZvaWQKLURFRlVOIChkb19zeW1ib2xzLCAoYWJmZCksCi0gICAgICAgYmZkICogYWJmZCkKLXsKLSAgZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9yb290UDsKLSAgc3ltYm9sUyAqcHRyOwotICBhc3ltYm9sICoqc3ltYm9sX3B0cl92ZWM7Ci0gIGFzeW1ib2wgKnN5bWJvbF92ZWM7Ci0gIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLQotCi0gIGZvciAocHRyID0gc3ltYm9sX3Jvb3RQOwotICAgICAgIHB0ciAhPSAoc3ltYm9sUyAqKSBOVUxMOwotICAgICAgIHB0ciA9IHB0ci0+c3lfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoU0VHX05PUk1BTCAocHRyLT5zeV9zeW1ib2wuc2VnKSkKLQl7Ci0JICBwdHItPnN5X3N5bWJvbC5zeS5zZWN0aW9uID0KLQkgICAgKGFzZWN0aW9uICopIChzZWdtZW50X2luZm9bcHRyLT5zeV9zeW1ib2wuc2VnXS51c2VyX3N0dWZmKTsKLQkgIFNfU0VUX1ZBTFVFIChwdHIsIFNfR0VUX1ZBTFVFIChwdHIpICsgcHRyLT5zeV9mcmFnLT5mcl9hZGRyZXNzKTsKLQkgIGlmIChwdHItPnN5X3N5bWJvbC5zeS5mbGFncyA9PSAwKQotCSAgICB7Ci0JICAgICAgcHRyLT5zeV9zeW1ib2wuc3kuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChwdHItPnN5X3N5bWJvbC5zZWcpCi0JICAgIHsKLQkgICAgY2FzZSBTRUdfQUJTT0xVVEU6Ci0JICAgICAgcHRyLT5zeV9zeW1ib2wuc3kuZmxhZ3MgfD0gQlNGX0FCU09MVVRFOwotCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LnNlY3Rpb24gPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNFR19VTktOT1dOOgotCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzID0gQlNGX1VOREVGSU5FRDsKLQkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5zZWN0aW9uID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCX0KLSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LnZhbHVlID0gU19HRVRfVkFMVUUgKHB0cik7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgc3ltYm9sX3B0cl92ZWMgPSAoYXN5bWJvbCAqKikgbWFsbG9jICgoY291bnQgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0KLSAgaW5kZXggPSAwOwotICBmb3IgKHB0ciA9IHN5bWJvbF9yb290UDsKLSAgICAgICBwdHIgIT0gKHN5bWJvbFMgKikgTlVMTDsKLSAgICAgICBwdHIgPSBwdHItPnN5X25leHQpCi0gICAgewotICAgICAgc3ltYm9sX3B0cl92ZWNbaW5kZXhdID0gJihwdHItPnN5X3N5bWJvbC5zeSk7Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgc3ltYm9sX3B0cl92ZWNbaW5kZXhdID0gMDsKLSAgYWJmZC0+b3V0c3ltYm9scyA9IHN5bWJvbF9wdHJfdmVjOwotICBhYmZkLT5zeW1jb3VudCA9IGNvdW50OwotfQotCi0vKiBUaGUgZ2VuZXJpYyBhcy0+YmZkIGNvbnZlcnRlci4gT3RoZXIgYmFja2VuZHMgbWF5IGhhdmUgc3BlY2lhbCBjYXNlCi0gICBjb2RlICovCi0KLXZvaWQKLURFRlVOX1ZPSUQgKGJmZF9hc193cml0ZV9ob29rKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIHNpemVfc2VjdGlvbiAoYWJmZCwgaSk7Ci0gICAgfQotCi0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICBmaWxsX3NlY3Rpb24gKGFiZmQsIGkpOwotCi0gIGRvX3N5bWJvbHMgKGFiZmQpOwotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgZG9fcmVsb2NzX2ZvciAoaSk7Ci0KLX0KLQotU19TRVRfU0VHTUVOVCAoeCwgeSkKLSAgICAgc3ltYm9sUyAqeDsKLSAgICAgaW50IHk7Ci17Ci0gIHgtPnN5X3N5bWJvbC5zZWcgPSB5OwotfQotCi1TX0lTX0RFRklORUQgKHgpCi0gICAgIHN5bWJvbFMgKng7Ci17Ci0gIGlmIChTRUdfTk9STUFMICh4LT5zeV9zeW1ib2wuc2VnKSkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIHN3aXRjaCAoeC0+c3lfc3ltYm9sLnNlZykKLSAgICB7Ci0gICAgY2FzZSBTRUdfVU5LTk9XTjoKLSAgICAgIHJldHVybiAwOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLVNfSVNfRVhURVJOQUwgKHgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1TX0dFVF9ERVNDICh4KQotewotICBhYm9ydCAoKTsKLX0KLQotU19HRVRfU0VHTUVOVCAoeCkKLSAgICAgc3ltYm9sUyAqeDsKLXsKLSAgcmV0dXJuIHgtPnN5X3N5bWJvbC5zZWc7Ci19Ci0KLVNfU0VUX0VYVEVSTkFMICh4KQotICAgICBzeW1ib2xTICp4OwotewotICB4LT5zeV9zeW1ib2wuc3kuZmxhZ3MgfD0gQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQ7Ci19Ci0KLVNfU0VUX05BTUUgKHgsIHkpCi0gICAgIHN5bWJvbFMgKng7Ci0gICAgIGNoYXIgKnk7Ci17Ci0gIHgtPnN5X3N5bWJvbC5zeS5uYW1lID0geTsKLX0KLQotU19HRVRfT1RIRVIgKHgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1TX0lTX0RFQlVHICh4KQotewotICBhYm9ydCAoKTsKLX0KLQotI2lmbmRlZiBzZWdtZW50X25hbWUKLWNoYXIgKgotc2VnbWVudF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotfQotI2VuZGlmCi0KLXZvaWQKLW9ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9pZWVlX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXh0ZXJuIGNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZXh0ZXJuIGNoYXIgaXNfZW5kX29mX2xpbmVbXTsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqcyA9IHA7Ci0gIGludCBpOwotICAvKiBMb29rIHVwIHRoZSBuYW1lLCBpZiBpdCBkb2Vzbid0IGV4aXN0LCBtYWtlIGl0ICovCi0gIHdoaWxlICgqcCAmJiAqcCAhPSAnICcgJiYgKnAgIT0gJywnICYmICFpc19lbmRfb2ZfbGluZVsqcF0pCi0gICAgewotICAgICAgcCsrOwotICAgIH0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2VnbWVudF9pbmZvW2ldLmhhZG9uZSkKLQl7Ci0JICBpZiAoc3RybmNtcCAoc2VnbWVudF9pbmZvW2ldLm5hbWUsIHMsIHAgLSBzKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZ290byBvazsKLQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWJyZWFrOwotICAgIH0KLSAgaWYgKGkgPT0gU0VHX1VOS05PV04pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ0b28gbWFueSBzZWN0aW9ucyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2VnbWVudF9pbmZvW2ldLmhhZG9uZSA9IDE7Ci0gIHNlZ21lbnRfaW5mb1tpXS5uYW1lID0gbWFsbG9jIChwIC0gcyArIDEpOwotICBtZW1jcHkgKHNlZ21lbnRfaW5mb1tpXS5uYW1lLCBzLCBwIC0gcyk7Ci0gIHNlZ21lbnRfaW5mb1tpXS5uYW1lW3AgLSBzXSA9IDA7Ci1vazoKLSAgc3Vic2VnX3NldCAoaSwgMCk7Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKnBdKQotICAgIHArKzsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLQotfQotCi0KLXZvaWQgY29ucyAoKTsKLXZvaWQgc19pZ25vcmUgKCk7Ci0KLQotdm9pZCBzX2dsb2JsICgpOwotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsic2VjdGlvbiIsIG9ial9pZWVlX3NlY3Rpb24sIDB9LAotICB7ImRhdGEuYiIsIGNvbnMsIDF9LAotICB7ImRhdGEudyIsIGNvbnMsIDJ9LAotICB7ImRhdGEubCIsIGNvbnMsIDR9LAotICB7ImV4cG9ydCIsIHNfZ2xvYmwsIDB9LAotICB7Im9wdGlvbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbmQiLCBzX2lnbm9yZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InNkYXRhIiwgc3RyaW5nZXIsIDB9LAotICAwLAotCi19OwotCi0KLQotdm9pZAotb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgc3ltYm9sUC0+c3lfc3ltYm9sLnN5LnRoZV9iZmQgPSBhYmZkOwotfQotCi0KLQotCi0KLSNpZiAxCi1leHRlcm4gdm9pZAotREVGVU5fVk9JRCAod3JpdGVfb2JqZWN0X2ZpbGUpCi17Ci0gIGludCBpOwotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpbl9wdHI7Ci0gIHN0cnVjdCBmcmFnICpmcmFnX3B0cjsKLQotICBhYmZkID0gYmZkX29wZW53IChvdXRfZmlsZV9uYW1lLCAiaWVlZSIpOwotCi0gIGlmIChhYmZkID09IDApCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIiksIG91dF9maWxlX25hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2g4MzAwLCAwKTsKLSAgc3Vic2VnX3NldCAoMSwgMCk7Ci0gIHN1YnNlZ19zZXQgKDIsIDApOwotICBzdWJzZWdfc2V0ICgzLCAwKTsKLSAgZm9yIChmcmNoYWluX3B0ciA9IGZyY2hhaW5fcm9vdDsKLSAgICAgICBmcmNoYWluX3B0ciAhPSAoc3RydWN0IGZyY2hhaW4gKikgTlVMTDsKLSAgICAgICBmcmNoYWluX3B0ciA9IGZyY2hhaW5fcHRyLT5mcmNoX25leHQpCi0gICAgewotICAgICAgLyogUnVuIHRocm91Z2ggYWxsIHRoZSBzdWItc2VnbWVudHMgYW5kIGFsaWduIHRoZW0gdXAuIEFsc28gY2xvc2UgYW55Ci0JIG9wZW4gZnJhZ3MuIFdlIHRhY2sgYSAuZmlsbCBvbnRvIHRoZSBlbmQgb2YgdGhlIGZyYWcgY2hhaW4gc28KLQkgdGhhdCBhbnkgLmFsaWduJ3Mgc2l6ZSBjYW4gYmUgd29ya2VkIGJ5IGxvb2tpbmcgYXQgdGhlIG5leHQKLQkgZnJhZy4gICovCi0KLSAgICAgIHN1YnNlZ19zZXQgKGZyY2hhaW5fcHRyLT5mcmNoX3NlZywgZnJjaGFpbl9wdHItPmZyY2hfc3Vic2VnKTsKLSNpZm5kZWYgU1VCX1NFR01FTlRfQUxJR04KLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAyCi0jZW5kaWYKLSAgICAgIGZyYWdfYWxpZ24gKFNVQl9TRUdNRU5UX0FMSUdOIChub3dfc2VnKSwgMCwgMCk7Ci0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbm93LT5mcl9maXggPSAwOwotICAgICAga25vdyAoZnJhZ19ub3ctPmZyX25leHQgPT0gTlVMTCk7Ci0gICAgfQotCi0gIC8qIE5vdyBidWlsZCBvbmUgYmlnIGZyYWcgY2hhaW4gZm9yIGVhY2ggc2VnbWVudCwgbGlua2VkIHRocm91Z2gKLQkgICBmcl9uZXh0LiAqLwotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLQotICAgICAgZnJhZ1MgKipwcmV2X2ZyYWdfcHRyX3B0cjsKLSAgICAgIHN0cnVjdCBmcmNoYWluICpuZXh0X2ZyY2hhaW5fcHRyOwotCi0gICAgICAvKglzdHJ1Y3QgZnJhZyAqKmhlYWRfcHRyID0gc2VnbWVudF9pbmZvW2ldLmZyYWdfcm9vdDsqLwotCi0gICAgICBzZWdtZW50X2luZm9baV0uZnJhZ19yb290ID0gc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0jaWYgMAotICAgICAgLyogSW0gbm90IHN1cmUgd2hhdCB0aGlzIGlzIGZvciAqLwotICAgICAgZm9yIChmcmNoYWluX3B0ciA9IHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUC0+ZnJjaF9yb290OwotCSAgIGZyY2hhaW5fcHRyICE9IChzdHJ1Y3QgZnJjaGFpbiAqKSBOVUxMOwotCSAgIGZyY2hhaW5fcHRyID0gZnJjaGFpbl9wdHItPmZyY2hfbmV4dCkKLQl7Ci0JICAqaGVhZF9wdHIgPSBmcmNoYWluX3B0cjsKLQkgIGhlYWRfcHRyID0gJmZyY2hhaW5fcHRyLT5uZXh0OwotCX0KLQotCi0jZW5kaWYKLSAgICB9Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICByZWxheF9zZWdtZW50IChzZWdtZW50X2luZm9baV0uZnJhZ19yb290LCBpKTsKLSAgICB9Ci0KLSAgLyogTm93IHRoZSBhZGRyZXNzZXMgb2YgdGhlIGZyYWdzIGFyZSBjb3JyZWN0IHdpdGhpbiB0aGUgc2VnbWVudCAqLwotCi0gIGJmZF9hc193cml0ZV9ob29rICgpOwotICBiZmRfY2xvc2UgKGFiZmQpOwotfQotCi0jZW5kaWYKLQotSF9TRVRfVEVYVF9TSVpFIChhLCBiKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9HRVRfVEVYVF9TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX1NFVF9CU1NfU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9TRVRfU1RSSU5HX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfU0VUX1JFTE9DQVRJT05fU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9TRVRfTUFHSUNfTlVNQkVSICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX0dFVF9GSUxFX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBlbmQgb2Ygb2JqLWllZWUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotaWVlZS5oIGIvZ2FzL2NvbmZpZy9vYmotaWVlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBmMTI2Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWllZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotaWVlZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQkZEIDEKLQotI2luY2x1ZGUgPGJmZC5oPgotCi10eXBlZGVmIHN0cnVjdAotewotICBhc3ltYm9sIHN5OwotICBpbnQgc2VnOwotfQotCi1vYmpfc3ltYm9sX3R5cGU7Ci0KLSNkZWZpbmUgU19HRVRfTkFNRShzKSAoKChzKS0+c3lfc3ltYm9sLnN5Lm5hbWUpKQotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgaW50IHg7Ci0gIH0KLQotb2JqZWN0X2hlYWRlcnM7Ci0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFIDEKLQotCi1pbnQgbGluZW5vX3Jvb3RQOwotCi0KLSNkZWZpbmUgSUVFRV9TVFlMRQotCi0vKiBlbmQgb2Ygb2JqLWllZWUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuYyBiL2dhcy9jb25maWcvb2JqLW11bHRpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMTUwOTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogZm9vICovCi0KLSNpbmNsdWRlICJhcy5oIgotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1tdWx0aS5oIGIvZ2FzL2NvbmZpZy9vYmotbXVsdGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiN2ViMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1tdWx0aS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIE11bHRpcGxlIG9iamVjdCBmb3JtYXQgZW11bGF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgOTcsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfT0JKX01VTFRJX0gKLSNkZWZpbmUgX09CSl9NVUxUSV9ICi0KLSNpZmRlZiBPQkpfSEVBREVSCi0jaW5jbHVkZSBPQkpfSEVBREVSCi0jZWxzZQotCi0jaW5jbHVkZSAiZW11bC5oIgotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUgkJCQkJXAotCSh0aGlzX2Zvcm1hdC0+Zmxhdm9yKQotCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChTLFApCQkJCVwKLQkoKnRoaXNfZm9ybWF0LT5mcm9iX3N5bWJvbCkgKFMsICYoUCkpCi0KLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZSgpCQkJCQlcCi0JKHRoaXNfZm9ybWF0LT5mcm9iX2ZpbGUJCQkJXAotCSA/ICgqdGhpc19mb3JtYXQtPmZyb2JfZmlsZSkgKCkJCQlcCi0JIDogKHZvaWQpIDApCi0KLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MoKQkJCVwKLQkodGhpc19mb3JtYXQtPmZyb2JfZmlsZV9hZnRlcl9yZWxvY3MJCVwKLQkgPyAoKnRoaXNfZm9ybWF0LT5mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKSAoKQlcCi0JIDogKHZvaWQpIDApCi0KLSNkZWZpbmUgb2JqX2Vjb2ZmX3NldF9leHQJCQkJXAotCSgqdGhpc19mb3JtYXQtPmVjb2ZmX3NldF9leHQpCi0KLSNkZWZpbmUgb2JqX3BvcF9pbnNlcnQJCQkJCVwKLQkoKnRoaXNfZm9ybWF0LT5wb3BfaW5zZXJ0KQotCi0jZGVmaW5lIG9ial9yZWFkX2JlZ2luX2hvb2soKQkJCQlcCi0JKHRoaXNfZm9ybWF0LT5yZWFkX2JlZ2luX2hvb2sJCQlcCi0JID8gKCp0aGlzX2Zvcm1hdC0+cmVhZF9iZWdpbl9ob29rKSAoKQkJXAotCSA6ICh2b2lkKSAwKQotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2soUykJCQkJXAotCSh0aGlzX2Zvcm1hdC0+c3ltYm9sX25ld19ob29rCQkJXAotCSA/ICgqdGhpc19mb3JtYXQtPnN5bWJvbF9uZXdfaG9vaykgKFMpCQlcCi0JIDogKHZvaWQpIDApCi0KLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKEEpCQkJXAotCSh0aGlzX2Zvcm1hdC0+c2VjX3N5bV9va19mb3JfcmVsb2MJCVwKLQkgPyAoKnRoaXNfZm9ybWF0LT5zZWNfc3ltX29rX2Zvcl9yZWxvYykgKEEpCVwKLQkgOiAwKQotCi0jZGVmaW5lIFNfR0VUX1NJWkUJCQkJCVwKLQkoKnRoaXNfZm9ybWF0LT5zX2dldF9zaXplKQotCi0jZGVmaW5lIFNfU0VUX1NJWkUJCQkJCVwKLQkoKnRoaXNfZm9ybWF0LT5zX3NldF9zaXplKQotCi0jZGVmaW5lIFNfR0VUX0FMSUdOCQkJCQlcCi0JKCp0aGlzX2Zvcm1hdC0+c19nZXRfYWxpZ24pCi0KLSNkZWZpbmUgU19TRVRfQUxJR04JCQkJCVwKLQkoKnRoaXNfZm9ybWF0LT5zX3NldF9hbGlnbikKLQotI2RlZmluZSBTX0dFVF9PVEhFUgkJCQkJXAotCSgqdGhpc19mb3JtYXQtPnNfZ2V0X290aGVyKQotCi0jZGVmaW5lIFNfR0VUX0RFU0MJCQkJCVwKLQkoKnRoaXNfZm9ybWF0LT5zX2dldF9kZXNjKQotCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKGQscykJCQlcCi0JKHRoaXNfZm9ybWF0LT5jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzCQlcCi0JID8gKCp0aGlzX2Zvcm1hdC0+Y29weV9zeW1ib2xfYXR0cmlidXRlcykgKGQsIHMpIFwKLQkgOiAodm9pZCkgMCkKLQotI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKFNFRyxXLFMsVCxPLEQpCQkJXAotCSh0aGlzX2Zvcm1hdC0+cHJvY2Vzc19zdGFiCQkJXAotCSA/ICgqdGhpc19mb3JtYXQtPnByb2Nlc3Nfc3RhYikgKFNFRyxXLFMsVCxPLEQpCVwKLQkgOiAodm9pZCkgMCkKLQotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLS8qIFdlIG5lZWQgT0JKX1NZTUZJRUxEX1RZUEUgc28gdGhhdCBzeW1ib2xfZ2V0X29iaiBpcyBkZWZpbmVkIGluIHN5bWJvbC5jCi0gICBXZSBhbHNvIG5lZWQgdmFyaW91cyBTVEFCIGRlZmluZXMgZm9yIHN0YWIuYyAgKi8KLSNpbmNsdWRlICJvYmotZWxmLmgiCi0jZW5kaWYKLQotI2VuZGlmIC8qICFPQkpfSEVBREVSICovCi0jZW5kaWYgLyogX09CSl9NVUxUSV9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1zb20uYyBiL2dhcy9jb25maWcvb2JqLXNvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWQ0YWRhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLXNvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4KLQotICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi1zdGF0aWMgdm9pZCBvYmpfc29tX3dlYWsgUEFSQU1TICgoaW50KSk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7IndlYWsiLCBvYmpfc29tX3dlYWssIDB9Ci19OwotCi1zdGF0aWMgaW50IHZlcnNpb25fc2VlbiA9IDA7Ci1zdGF0aWMgaW50IGNvcHlyaWdodF9zZWVuID0gMDsKLXN0YXRpYyBpbnQgY29tcGlsZXJfc2VlbiA9IDA7Ci0KLS8qIFVudXNlZCBieSBTT00uICAqLwotdm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rICgpIHt9Ci0KLS8qIEhhbmRsZSBhIC5jb21waWxlciBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byBjcmVhdGUgdGhlCi0gICBjb21waWxhdGlvbiB1bml0IGF1eGlsaWFyeSBoZWFkZXIgZm9yIE1QRSBzdWNoIHRoYXQgdGhlIGxpbmtlZGl0b3IKLSAgIGNhbiBoYW5kbGUgU09NIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlcy4gVGhlIGZvcm1hdCBvZiB0aGUgcXVvdGVkCi0gICBzdHJpbmcgaXMgInNvdXJjZWZpbGUgbGFuZ3VhZ2UgdmVyc2lvbiIgYW5kIGlzIGRlbGltaXRlZCBieSBibGFua3MuKi8KLQotdm9pZAotb2JqX3NvbV9jb21waWxlciAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpidWY7Ci0gIGNoYXIgYzsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKmxhbmd1YWdlX25hbWU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnZlcnNpb25faWQ7Ci0KLSAgaWYgKGNvbXBpbGVyX3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkICgiT25seSBvbmUgLmNvbXBpbGVyIHBzZXVkby1vcCBwZXIgZmlsZSEiKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJykKLSAgICB7Ci0gICAgICBidWYgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlIChpc19hX2NoYXIgKG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMDAwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBQYXJzZSB0aGUgcXVvdGVkIHN0cmluZyBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuICBTa2lwIHRoZQotICAgICBxdW90ZS4gICovCi0gIGZpbGVuYW1lID0gYnVmICsgMTsKLSAgcCA9IGZpbGVuYW1lOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykKLSAgICBwKys7Ci0gIGlmICgqcCA9PSAnXDAwMCcpCi0gICAgewotICAgICAgYXNfYmFkICgiLmNvbXBpbGVyIGRpcmVjdGl2ZSBtaXNzaW5nIGxhbmd1YWdlIGFuZCB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICBsYW5ndWFnZV9uYW1lCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykgcCsrOwotICBpZiAoKnAgPT0gJ1wwMDAnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIi5jb21waWxlciBkaXJlY3RpdmUgbWlzc2luZyB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICB2ZXJzaW9uX2lkCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJ1wwMDAnKSBwKys7Ci0gIC8qIFJlbW92ZSB0aGUgdHJhaWxpbmcgcXVvdGUuICAqLwotICAqKC0tcCkgPSAnXDAwMCc7Ci0KLSAgY29tcGlsZXJfc2VlbiA9IDE7Ci0gIGlmICghIGJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXQgKHN0ZG91dHB1dCwgZmlsZW5hbWUsIGxhbmd1YWdlX25hbWUsCi0JCQkJCSAiR05VIFRvb2xzIiwgdmVyc2lvbl9pZCkpCi0gICAgewotICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBhc19mYXRhbCAoIkZBVEFMOiBBdHRhY2hpbmcgY29tcGlsZXIgaGVhZGVyICVzIiwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnZlcnNpb24gZGlyZWN0aXZlLiAgKi8KLQotdm9pZAotb2JqX3NvbV92ZXJzaW9uICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKnZlcnNpb24sIGM7Ci0KLSAgaWYgKHZlcnNpb25fc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgdmVyc2lvbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKGlzX2FfY2hhciAobmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwMDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZlcnNpb25fc2VlbiA9IDE7Ci0gIGlmIChiZmRfc29tX2F0dGFjaF9hdXhfaGRyIChzdGRvdXRwdXQsIFZFUlNJT05fQVVYX0lELCB2ZXJzaW9uKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmNvcHlyaWdodCBkaXJlY3RpdmUuICAgVGhpcyBwcm9iYWJseSBpc24ndCBjb21wbGV0ZSwgYnV0Ci0gICBpdCdzIG9mIGR1YmlvdXMgdmFsdWUgYW55d2F5IGFuZCAoSU1ITykgbm90IHdvcnRoIHRoZSB0aW1lIHRvIGZpbmlzaC4KLSAgIElmIHlvdSBjYXJlIGFib3V0IGNvcHlyaWdodCBzdHJpbmdzIHRoYXQgbXVjaCwgeW91IGZpeCBpdC4gICovCi0KLXZvaWQKLW9ial9zb21fY29weXJpZ2h0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKmNvcHlyaWdodCwgYzsKLQotICBpZiAoY29weXJpZ2h0X3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJPbmx5IG9uZSAuY29weXJpZ2h0IHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgY29weXJpZ2h0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAwMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29weXJpZ2h0X3NlZW4gPSAxOwotICBpZiAoYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoc3Rkb3V0cHV0LCBDT1BZUklHSFRfQVVYX0lELCBjb3B5cmlnaHQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQXR0YWNoaW5nIGNvcHlyaWdodCBoZWFkZXIgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFBlcmZvcm0gYW55IGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeSBmb3Igc3RhYnMgc3VwcG9ydC4KLQotICAgRm9yIFNPTSB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc3BhY2Ugd2hpY2ggd2lsbCBjb250YWluIHRoZQotICAgdHdvIHN0YWJzIHN1YnNwYWNlcy4gIEFkZGl0aW9uYWxseSB3ZSBuZWVkIHRvIHNldCB1cCB0aGUKLSAgIHNwYWNlL3N1YnNwYWNlIHJlbGF0aW9uc2hpcHMgYW5kIHNldCBzcGFjZS9zdWJzcGFjZSBhdHRyaWJ1dGVzCi0gICB3aGljaCBCRkQgZG9lcyBub3QgdW5kZXJzdGFuZC4gICovCi0KLXZvaWQKLW9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgc2VnVCBzcGFjZTsKLSAgc3Vic2VnVCBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBjaGFyICpwLCAqZmlsZTsKLSAgdW5zaWduZWQgaW50IHN0cm9mZjsKLQotICAvKiBNYWtlIHRoZSBzcGFjZSB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIGRlYnVnIHN1YnNwYWNlcy4gICovCi0gIHNwYWNlID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsICIkR0RCX0RFQlVHJCIpOwotCi0gIC8qIFNldCBTT00gc3BlY2lmaWMgYXR0cmlidXRlcyBmb3IgdGhlIHNwYWNlLiAgSW4gcGFydGljdWxhciB3ZSBzZXQKLSAgICAgdGhlIHNwYWNlICJkZWZpbmVkIiwgInByaXZhdGUiLCAic29ydF9rZXkiLCBhbmQgInNwbnVtIiB2YWx1ZXMuIAotCi0gICAgIER1ZSB0byBhIGJ1ZyBpbiBweGRiIChjYWxsZWQgYnkgaHB1eCBsaW5rZXIpLCB0aGUgc29ydCBrZXlzCi0gICAgIG9mIHRoZSB2YXJpb3VzIHN0YWJzIHNwYWNlcy9zdWJzcGFjZXMgbmVlZCB0byBiZSAic21hbGwiLiAgV2UKLSAgICAgcmVzZXJ2ZSByYW5nZSA3Mi83MyB3aGljaCBhcHBlYXIgdG8gd29yayB3ZWxsLiAgKi8KLSAgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNwYWNlLCAxLCAxLCA3MiwgMik7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc3BhY2UsIDIpOwotCi0gIC8qIFNldCB0aGUgY29udGFpbmluZyBzcGFjZSBmb3IgYm90aCBzdGFiIHNlY3Rpb25zIHRvIGJlICRHREJfREVCVUckCi0gICAgIChqdXN0IGNyZWF0ZWQgYWJvdmUpLiAgQWxzbyBzZXQgc29tZSBhdHRyaWJ1dGVzIHdoaWNoIEJGRCBkb2VzCi0gICAgIG5vdCB1bmRlcnN0YW5kLiAgSW4gcGFydGljdWxhciwgYWNjZXNzIGJpdHMsIHNvcnQga2V5cywgYW5kIGxvYWQKLSAgICAgcXVhZHJhbnQuICAqLwotICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBzcGFjZSwgMHgxZiwgNzMsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgMik7Ci0KLSAgLyogTWFrZSBzb21lIHNwYWNlIGZvciB0aGUgZmlyc3Qgc3BlY2lhbCBzdGFiIGVudHJ5IGFuZCB6ZXJvIHRoZSBtZW1vcnkuCi0gICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsZW5ndGggb2YgdGhpcyBmaWxlJ3MKLSAgICAgc3RhYiBzdHJpbmcgYW5kIHRoZSBsaWtlLiAgVXNpbmcgaXQgYXZvaWRzIHRoZSBuZWVkIHRvIAotICAgICByZWxvY2F0ZSB0aGUgc3RhYiBzdHJpbmdzLgotCi0gICAgIFRoZSAkR0RCX1NUUklOR1MkIHNwYWNlIHdpbGwgYmUgY3JlYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mCi0gICAgIHRoZSBjYWxsIHRvIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuICAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIG1lbXNldCAocCwgMCwgMTIpOwotICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsICIkR0RCX1NUUklOR1MkIik7Ci0gIGtub3cgKHN0cm9mZiA9PSAxKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOwotICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUucCA9IHA7Ci0KLSAgLyogU2V0IHRoZSBjb250YWluaW5nIHNwYWNlIGZvciBib3RoIHN0YWIgc2VjdGlvbnMgdG8gYmUgJEdEQl9ERUJVRyQKLSAgICAgKGp1c3QgY3JlYXRlZCBhYm92ZSkuICBBbHNvIHNldCBzb21lIGF0dHJpYnV0ZXMgd2hpY2ggQkZEIGRvZXMKLSAgICAgbm90IHVuZGVyc3RhbmQuICBJbiBwYXJ0aWN1bGFyLCBhY2Nlc3MgYml0cywgc29ydCBrZXlzLCBhbmQgbG9hZAotICAgICBxdWFkcmFudC4gICovCi0gIHNlZyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsICIkR0RCX1NUUklOR1MkIik7Ci0gIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIHNwYWNlLCAweDFmLCA3MiwgMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKLQotICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYnMgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3RhYl9zZWN0aW9ucyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eDsKLXsKLSAgYXNlY3Rpb24gKnN0cnNlYzsKLSAgY2hhciAqcDsKLSAgaW50IHN0cnN6LCBuc3ltczsKLQotICBpZiAoc3RyY21wICgiJEdEQl9TWU1CT0xTJCIsIHNlYy0+bmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiJEdEQl9TVFJJTkdTJCIpOwotICBpZiAoc3Ryc2VjKQotICAgIHN0cnN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKLSAgZWxzZQotICAgIHN0cnN6ID0gMDsKLSAgbnN5bXMgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpIC8gMTIgLSAxOwotCi0gIHAgPSBzZWdfaW5mbyAoc2VjKS0+c3RhYnUucDsKLSAgYXNzZXJ0IChwICE9IDApOwotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIG5zeW1zLCAoYmZkX2J5dGUgKikgcCArIDYpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJzeiwgKGJmZF9ieXRlICopIHAgKyA4KTsKLX0KLQotLyogQ2FsbGVkIGxhdGUgaW4gdGhlIGFzc3NlbWJseSBwaGFzZSB0byBhZGp1c3QgdGhlIHNwZWNpYWwKLSAgIHN0YWIgZW50cnkgYW5kIHRvIHNldCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3IgZWFjaCBjb2RlIHN1YnNwYWNlLiAgKi8KLQotdm9pZAotc29tX2Zyb2JfZmlsZSAoKQotewotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgYWRqdXN0X3N0YWJfc2VjdGlvbnMsIChQVFIpIDApOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX3NvbV93ZWFrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgU19TRVRfV0VBSyAoc3ltYm9sUCk7Ci0jaWYgMAotICAgICAgc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCA9IDE7Ci0jZW5kaWYKLSAgICAgIGlmIChjID09ICcsJykKLSAgICAgICAgewotICAgICAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotICAgICAgICAgICAgYyA9ICdcbic7Ci0gICAgICAgIH0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLXNvbS5oIGIvZ2FzL2NvbmZpZy9vYmotc29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDg3YjEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotc29tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBTT00gb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuCi0KLSAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jaWZuZGVmIF9PQkpfU09NX0gKLSNkZWZpbmUgX09CSl9TT01fSAotCi0jZGVmaW5lIE9CSl9TT00gMQotCi0jaW5jbHVkZSA8YmZkLmg+Ci0jaW5jbHVkZSAiYmZkL3NvbS5oIgotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgMAotI2RlZmluZSBUUlVFICFGQUxTRQotI2VuZGlmCi0KLS8qIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBhZGRyZXNzIHNpemUhICAqLwotI2RlZmluZSBzb21fc3ltYm9sKGFzeW1ib2wpICgoc29tX3N5bWJvbF90eXBlICopKCYoYXN5bWJvbCktPnRoZV9iZmQpKQotCi1leHRlcm4gdm9pZCBzb21fZmlsZV9zeW1ib2wgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBvYmpfc29tX3ZlcnNpb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKLWV4dGVybiB2b2lkIG9ial9zb21fY29weXJpZ2h0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgb2JqX3NvbV9jb21waWxlciBQQVJBTVMgKChpbnQpKTsKLQotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpIHs7fQotCi0vKiBTT00gaGFzIHNldmVyYWwgYXR0cmlidXRlcyBmb3Igc3BhY2VzL3N1YnNwYWNlcyB3aGljaCBjYW4gbm90Ci0gICBiZSBlYXNpbHkgZXhwcmVzc2VkIGluIEJGRC4gIFdlIHVzZSB0aGVzZSBtYWNyb3MgdG8gdHJpZ2dlciBjYWxscwotICAgaW50byB0aGUgU09NIEJGRCBiYWNrZW5kIHRvIHNldCB0aGVzZSBhdHRyaWJ1dGVzLiAgKi8KLSNkZWZpbmUgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgIGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcwotI2RlZmluZSBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyBiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMKLQotLyogTGlrZXdpc2UgZm9yIHN5bWJvbCB0eXBlcy4gICovCi0jZGVmaW5lIG9ial9zZXRfc3ltYm9sX3R5cGUgYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUKLQotLyogU3RhYnMgZ28gaW4gYSBzZXBhcmF0ZSBzZWN0aW9ucy4gIEdEQiBleHBlY3RzIHRvIGZpbmQgdGhlbSBpbiBzZWN0aW9ucwotICAgd2l0aCB0aGUgbmFtZXMgJEdEQl9TWU1CT0xTJCBhbmQgJEdEQl9TVFJJTkdTJCByYXRoZXIgdGhhbiAuc3RhYiBhbmQKLSAgIC5zdGFic3RyLiAgKi8KLSNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAxCi0jZGVmaW5lIFNUQUJfU0VDVElPTl9OQU1FICIkR0RCX1NZTUJPTFMkIgotI2RlZmluZSBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUgIiRHREJfU1RSSU5HUyQiCi0KLS8qIFdlIHVzZSBJTklUX1NUQUJfU0VDVElPTiB0byByZWNvcmQgdGhlIHNwYWNlL3N1YnNwYWNlIHJlbGF0aW9uc2hpcHMKLSAgIGZvciB0aGUgdmFyaW91cyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLQotLyogV2UnbGwgYmUgdXBkYXRpbmcgdGhlIG1hZ2ljIDFzdCBzdGFiIGVudHJ5IG9uY2UgdGhlIGVudGlyZSBhc3NlbWJseQotICAgZmFpbCBoYXMgYmVlbiBwcm9jZXNzZWQuICAqLwotI2RlZmluZSBvYmpfZnJvYl9maWxlKCkgc29tX2Zyb2JfZmlsZSgpCi0KLSNlbmRpZiAvKiBfT0JKX1NPTV9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai12bXMuYyBiL2dhcy9jb25maWcvb2JqLXZtcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjA4ZjhlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLXZtcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU0OSArMCwwIEBACi0vKiB2bXMuYyAtLSBXcml0ZSBvdXQgYSBWQVgvVk1TIG9iamVjdCBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg4LCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBEYXZpZCBMLiBLYXNodGFuICovCi0vKiBNb2RpZmllZCBieSBFcmljIFlvdW5nZGFsZSB0byB3cml0ZSBWTVMgZGVidWcgcmVjb3JkcyBmb3IgcHJvZ3JhbQotICAgdmFyaWFibGVzICovCi0KLS8qIFdhbnQgYWxsIG9mIG9iai12bXMuaCAoYXMgb2JqLWZvcm1hdC5oLCB2aWEgdGFyZy1lbnYuaCwgdmlhIGFzLmgpLiAgKi8KLSNkZWZpbmUgV0FOVF9WTVNfT0JKX0RFRlMKLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogV2hhdCB3ZSBkbyBpZiB0aGVyZSBpcyBhIGdvb2YuICovCi0jZGVmaW5lIGVycm9yIGFzX2ZhdGFsCi0KLSNpZmRlZiBWTVMJCQkvKiBUaGVzZSBhcmUgb2Ygbm8gdXNlIGlmIHdlIGFyZSBjcm9zcyBhc3NlbWJsaW5nLiAqLwotI2luY2x1ZGUgPGZhYi5oPgkJLyogRGVmaW5lIEZpbGUgQWNjZXNzIEJsb2NrCSAgKi8KLSNpbmNsdWRlIDxuYW0uaD4JCS8qIERlZmluZSBOQU0gQmxvY2sJCSAgKi8KLSNpbmNsdWRlIDx4YWIuaD4JCS8qIERlZmluZSBYQUIgLSBhbGwgZGlmZmVyZW50IHR5cGVzKi8KLWV4dGVybiBpbnQgc3lzJG9wZW4oKSwgc3lzJGNsb3NlKCksIHN5cyRhc2N0aW0oKTsKLSNlbmRpZgotCi0vKgotICoJVmVyc2lvbiBzdHJpbmcgb2YgdGhlIGNvbXBpbGVyIHRoYXQgcHJvZHVjZWQgdGhlIGNvZGUgd2UgYXJlCi0gKglhc3NlbWJsaW5nLiAgKEFuZCB0aGlzIGFzc2VtYmxlciwgaWYgd2UgZG8gbm90IGhhdmUgY29tcGlsZXIgaW5mby4pCi0gKi8KLWNoYXIgKmNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nOwotCi1leHRlcm4gaW50IGZsYWdfaGFzaF9sb25nX25hbWVzOwkvKiAtKyAqLwotZXh0ZXJuIGludCBmbGFnX29uZTsJCQkvKiAtMTsgY29tcGF0aWJpbGl0eSB3aXRoIGdjYyAxLnggKi8KLWV4dGVybiBpbnQgZmxhZ19zaG93X2FmdGVyX3RydW5jOwkvKiAtSCAqLwotZXh0ZXJuIGludCBmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZTsJLyogLWggTlVNICovCi0KLS8qIEZsYWcgdGhhdCBkZXRlcm1pbmVzIGhvdyB3ZSBtYXAgbmFtZXMuICBUaGlzIHRha2VzIHNldmVyYWwgdmFsdWVzLCBhbmQKLSAqIGlzIHNldCB3aXRoIHRoZSAtaCBzd2l0Y2guICBBIHZhbHVlIG9mIHplcm8gaW1wbGllcyBuYW1lcyBzaG91bGQgYmUKLSAqIHVwcGVyIGNhc2UsIGFuZCB0aGUgcHJlc2VuY2Ugb2YgdGhlIC1oIHN3aXRjaCBpbmhpYml0cyB0aGUgY2FzZSBoYWNrLgotICogTm8gLWggc3dpdGNoIGF0IGFsbCBzZXRzIHZtc19uYW1lX21hcHBpbmcgdG8gMCwgYW5kIGFsbG93cyBjYXNlIGhhY2tpbmcuCi0gKiBBIHZhbHVlIG9mIDIgKHNldCB3aXRoIC1oMikgaW1wbGllcyBuYW1lcyBzaG91bGQgYmUKLSAqIGFsbCBsb3dlciBjYXNlLCB3aXRoIG5vIGNhc2UgaGFjay4gIEEgdmFsdWUgb2YgMyAoc2V0IHdpdGggLWgzKSBpbXBsaWVzCi0gKiB0aGF0IGNhc2Ugc2hvdWxkIGJlIHByZXNlcnZlZC4gICovCi0KLS8qIElmIHRoZSAtKyBzd2l0Y2ggaXMgZ2l2ZW4sIHRoZW4gdGhlIGhhc2ggaXMgYXBwZW5kZWQgdG8gYW55IG5hbWUgdGhhdCBpcwotICogbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVycywgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiB0aGUgLWggc3dpdGNoLgotICovCi0KLWNoYXIgdm1zX25hbWVfbWFwcGluZyA9IDA7Ci0KLXN0YXRpYyBzeW1ib2xTICpFbnRyeV9Qb2ludF9TeW1ib2wgPSAwOwkvKiBQb2ludGVyIHRvICJfbWFpbiIgKi8KLQotLyoKLSAqCVdlIGF1Z21lbnQgdGhlICJnYXMiIHN5bWJvbCBzdHJ1Y3R1cmUgd2l0aCB0aGlzCi0gKi8KLXN0cnVjdCBWTVNfU3ltYm9sCi17Ci0gIHN0cnVjdCBWTVNfU3ltYm9sICpOZXh0OwotICBzeW1ib2xTICpTeW1ib2w7Ci0gIGludCBTaXplOwotICBpbnQgUHNlY3RfSW5kZXg7Ci0gIGludCBQc2VjdF9PZmZzZXQ7Ci19OwotCi1zdHJ1Y3QgVk1TX1N5bWJvbCAqVk1TX1N5bWJvbHMgPSAwOwotc3RydWN0IFZNU19TeW1ib2wgKkN0b3JzX1N5bWJvbHMgPSAwOwotc3RydWN0IFZNU19TeW1ib2wgKkR0b3JzX1N5bWJvbHMgPSAwOwotCi0vKiBXZSBuZWVkIHRoaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgdmFyaW91cyBpbnB1dCBmaWxlcywgc28gdGhhdCB3ZSBjYW4KLSAqIGdpdmUgdGhlIGRlYnVnZ2VyIHRoZSBjb3JyZWN0IHNvdXJjZSBsaW5lLgotICovCi0KLXN0cnVjdCBpbnB1dF9maWxlCi17Ci0gIHN0cnVjdCBpbnB1dF9maWxlICpuZXh0OwotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqc2FtZV9maWxlX2ZwbnQ7Ci0gIGludCBmaWxlX251bWJlcjsKLSAgaW50IG1heF9saW5lOwotICBpbnQgbWluX2xpbmU7Ci0gIGludCBvZmZzZXQ7Ci0gIGNoYXIgZmxhZzsKLSAgY2hhciAqbmFtZTsKLSAgc3ltYm9sUyAqc3BudDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfZmlsZSAqZmlsZV9yb290ID0gKHN0cnVjdCBpbnB1dF9maWxlICopIE5VTEw7Ci0KLQotLyoKLSAqIFN0eWxlcyBvZiBQU0VDVFMgKHByb2dyYW0gc2VjdGlvbnMpIHRoYXQgd2UgZ2VuZXJhdGU7IGp1c3Qgc2hvcnRoYW5kCi0gKiB0byBhdm9pZCBsaXN0cyBvZiBzZWN0aW9uIGF0dHJpYnV0ZXMuICBVc2VkIGJ5IFZNU19Qc2VjdF9TcGVjKCkuCi0gKi8KLWVudW0gcHNfdHlwZQotewotICBwc19URVhULCBwc19EQVRBLCBwc19DT01NT04sIHBzX0NPTlNULCBwc19DVE9SUywgcHNfRFRPUlMKLX07Ci0KLS8qCi0gKiBUaGlzIGVudW0gaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHZhcmlhYmxlcyB0aGF0Ci0gKiBtYXkgYmUgcHJlc2VudC4KLSAqLwotCi1lbnVtIGFkdmFuY2VkX3R5cGUKLXsKLSAgQkFTSUMsIFBPSU5URVIsIEFSUkFZLCBFTlVNLCBTVFJVQ1QsIFVOSU9OLCBGVU5DVElPTiwgVk9JRCwgQUxJQVMsIFVOS05PV04KLX07Ci0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RhYnMgZGlyZWN0aXZlcywgYW5kIHRoZQotICogaW5mb3JtYXRpb24gaXMgZmlsbGVkIGluIGJ5IFZNU190eXBlZGVmX3BhcnNlLiAgRXZlcnl0aGluZyB0aGF0IGlzIG5lZWRlZAotICogdG8gZ2VuZXJhdGUgdGhlIGRlYnVnZ2luZyByZWNvcmQgZm9yIGEgZ2l2ZW4gc3ltYm9sIGlzIHByZXNlbnQgaGVyZS4KLSAqIFRoaXMgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5LCB1c2luZyBuZXN0ZWQgc3RydWN0L3VuaW9ucywgYnV0IGZvciBub3cKLSAqIEkgYW0gaGFwcHkgdGhhdCBpdCB3b3Jrcy4KLSAqLwotc3RydWN0IFZNU19EQkdfU3ltYm9sCi17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqbmV4dDsKLSAgLyogZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIGlzICovCi0gIGVudW0gYWR2YW5jZWRfdHlwZSBhZHZhbmNlZDsKLSAgLyogdGhpcyByZWNvcmQgaXMgZm9yIHRoaXMgdHlwZSAqLwotICBpbnQgZGJ4X3R5cGU7Ci0gIC8qIEZvciBhZHZhbmNlZCB0eXBlcyB0aGlzIGlzIHRoZSB0eXBlIHJlZmVycmVkIHRvLiAgSS5lLiwgdGhlIHR5cGUKLSAgICAgYSBwb2ludGVyIHBvaW50cyB0bywgb3IgdGhlIHR5cGUgb2Ygb2JqZWN0IHRoYXQgbWFrZXMgdXAgYW4KLSAgICAgYXJyYXkuICAqLwotICBpbnQgdHlwZTI7Ci0gIC8qIFVzZSB0aGlzIHR5cGUgd2hlbiBnZW5lcmF0aW5nIGEgdmFyaWFibGUgZGVmICovCi0gIGludCBWTVNfdHlwZTsKLSAgLyogdXNlZCBmb3IgYXJyYXlzIC0gdGhpcyB3aWxsIGJlIHByZXNlbnQgZm9yIGFsbCAqLwotICBpbnQgaW5kZXhfbWluOwotICAvKiBlbnRyaWVzLCBidXQgd2lsbCBiZSBtZWFuaW5nbGVzcyBmb3Igbm9uLWFycmF5cyAqLwotICBpbnQgaW5kZXhfbWF4OwotICAvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBkYXRhIHR5cGUuICBGb3IgYW4gYXJyYXksIHRoaXMgaXMgdGhlIHNpemUKLSAgICAgb2Ygb25lIGVsZW1lbnQgaW4gdGhlIGFycmF5ICovCi0gIGludCBkYXRhX3NpemU7Ci0gIC8qIE51bWJlciBvZiB0aGUgc3RydWN0dXJlL3VuaW9uL2VudW0gLSB1c2VkIGZvciByZWYgKi8KLSAgaW50IHN0cnVjX251bWI7Ci19OwotCi0jZGVmaW5lIFNZTVRZUExTVF9TSVpFICgxPDw0KQkvKiAxNjsgbXVzdCBiZSBwb3dlciBvZiB0d28gKi8KLSNkZWZpbmUgU1lNVFlQX0hBU0goeCkgKCh1bnNpZ25lZCkoeCkgJiAoU1lNVFlQTFNUX1NJWkUtMSkpCi1zdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKlZNU19TeW1ib2xfdHlwZV9saXN0W1NZTVRZUExTVF9TSVpFXTsKLQotLyoKLSAqIFdlIG5lZWQgdGhpcyBzdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiBmb3J3YXJkIHJlZmVyZW5jZXMgdG8KLSAqIHN0cnVjdC91bmlvbi9lbnVtIHRoYXQgaGF2ZSBub3QgYmVlbiBkZWZpbmVkIHlldC4gIFdoZW4gdGhleSBhcmUgdWx0aW1hdGVseQotICogZGVmaW5lZCwgdGhlbiB3ZSBjYW4gZ28gYmFjayBhbmQgZ2VuZXJhdGUgdGhlIFRJUiBjb21tYW5kcyB0byBtYWtlIGEgYmFjawotICogcmVmZXJlbmNlLgotICovCi0KLXN0cnVjdCBmb3J3YXJkX3JlZgotewotICBzdHJ1Y3QgZm9yd2FyZF9yZWYgKm5leHQ7Ci0gIGludCBkYnhfdHlwZTsKLSAgaW50IHN0cnVjX251bWI7Ci0gIGNoYXIgcmVzb2x2ZWQ7Ci19OwotCi1zdHJ1Y3QgZm9yd2FyZF9yZWYgKmZfcmVmX3Jvb3QgPSAoc3RydWN0IGZvcndhcmRfcmVmICopIE5VTEw7Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBjb21wYXJlIHRoZSBuYW1lcyBvZiBjZXJ0YWluIHR5cGVzIHRvIHZhcmlvdXMKLSAqIGZpeGVkIHR5cGVzIHRoYXQgYXJlIGtub3duIGJ5IHRoZSBkZWJ1Z2dlci4KLSAqLwotI2RlZmluZSB0eXBlX2NoZWNrKFgpICAhc3RyY21wIChzeW1ib2xfbmFtZSwgWCkKLQotLyoKLSAqIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgd2UgYXJlCi0gKiB3b3JraW5nIG9uIHdoaWxlIHdlIGFyZSBwYXJzaW5nIHRoZSBzdGFicyBkaXJlY3RpdmVzLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqc3ltYm9sX25hbWU7Ci0KLS8qIFdlIHVzZSB0aGlzIGNvdW50ZXIgdG8gYXNzaWduIG51bWJlcnMgdG8gYWxsIG9mIHRoZSBzdHJ1Y3R1cmVzLCB1bmlvbnMKLSAqIGFuZCBlbnVtcyB0aGF0IHdlIGRlZmluZS4gIFdoZW4gd2UgYWN0dWFsbHkgZGVjbGFyZSBhIHZhcmlhYmxlIHRvIHRoZQotICogZGVidWdnZXIsIHdlIGNhbiBzaW1wbHkgZG8gaXQgYnkgbnVtYmVyLCByYXRoZXIgdGhhbiBkZXNjcmliaW5nIHRoZQotICogd2hvbGUgdGhpbmcgZWFjaCB0aW1lLgotICovCi0KLXN0YXRpYyBzdHJ1Y3R1cmVfY291bnQgPSAwOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgbWFraW5nIHRoZSBsYXN0IGF0dGVtcHQgdG8KLSAgIHBhcnNlIHRoZSBzdGFicywgYW5kIHRoYXQgd2Ugc2hvdWxkIGRlZmluZSBhcyBtdWNoIGFzIHdlIGNhbiwgYW5kIGlnbm9yZQotICAgdGhlIHJlc3QgKi8KLQotc3RhdGljIGludCBmaW5hbF9wYXNzOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzdHJ1Y3R1cmUgbnVtYmVyCi0gKiBmb3IgYSBnaXZlbiB2YXJpYWJsZS4gIElmIHRoaXMgaXMgPCAwLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHN0cnVjdHVyZQotICogaGFzIG5vdCB5ZXQgYmVlbiBkZWZpbmVkIHRvIHRoZSBkZWJ1Z2dlci4gIFRoaXMgaXMgc3RpbGwgY29vbCwgc2luY2UKLSAqIHRoZSBWTVMgb2JqZWN0IGxhbmd1YWdlIGhhcyB3YXlzIG9mIGZpeGluZyB0aGluZ3MgdXAgYWZ0ZXIgdGhlIGZhY3QsCi0gKiBzbyB3ZSBqdXN0IG1ha2UgYSBub3RlIG9mIHRoaXMsIGFuZCBnZW5lcmF0ZSBmaXh1cHMgYXQgdGhlIGVuZC4KLSAqLwotc3RhdGljIGludCBzdHJ1Y3RfbnVtYmVyOwotCi0vKiBUaGlzIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBEX2Zsb2F0IGFuZCBHX2Zsb2F0IGZvciB0ZWxsaW5nCi0gICB0aGUgZGVidWdnZXIgYWJvdXQgZG91Ymxlcy4gIGdjYyBvdXRwdXRzIHRoZSBzYW1lIC5zdGFicyByZWdhcmRsZXNzCi0gICBvZiB3aGV0aGVyIC1tZyBpcyB1c2VkIHRvIHNlbGVjdCBhbHRlcm5hdGUgZG91Ymxlcy4gICovCi0KLXN0YXRpYyBpbnQgdmF4X2dfZG91YmxlcyA9IDA7Ci0KLS8qIExvY2FsIHN5bWJvbCByZWZlcmVuY2VzICh1c2VkIHRvIGhhbmRsZSBOX0FCUyBzeW1ib2xzOyBnY2MgZG9lcyBub3QKLSAgIGdlbmVyYXRlIHRob3NlLCBidXQgdGhleSdyZSBwb3NzaWJsZSB3aXRoIGhhbmQtY29kZWQgYXNzZW1ibGVyIGlucHV0KQotICAgYXJlIGFsd2F5cyBtYWRlIHJlbGF0aXZlIHRvIHNvbWUgcGFydGljdWxhciBlbnZpcm9ubWVudC4gIElmIHRoZSBjdXJyZW50Ci0gICBpbnB1dCBoYXMgYW55IHN1Y2ggc3ltYm9scywgdGhlbiB3ZSBleHBlY3QgdGhpcyB0byBnZXQgaW5jcmVtZW50ZWQKLSAgIGV4YWN0bHkgb25jZSBhbmQgZW5kIHVwIGhhdmluZyBhbGwgb2YgdGhlbSBiZSBpbiBlbnZpcm9ubWVudCAjMC4gICovCi0KLXN0YXRpYyBpbnQgQ3VycmVudF9FbnZpcm9ubWVudCA9IC0xOwotCi0vKiBFdmVyeSBvYmplY3QgZmlsZSBtdXN0IHNwZWNpZnkgYW4gbW9kdWxlIG5hbWUsIHdoaWNoIGlzIGFsc28gdXNlZCBieQotICAgdHJhY2ViYWNrIHJlY29yZHMuICBTZXQgaW4gV3JpdGVfVk1TX01IRF9SZWNvcmRzKCkuICAqLwotCi1zdGF0aWMgY2hhciBNb2R1bGVfTmFtZVsyNTUrMV07Ci0KLS8qCi0gKiBWYXJpYWJsZSBkZXNjcmlwdG9ycyBhcmUgdXNlZCB0ZWxsIHRoZSBkZWJ1Z2dlciB0aGUgZGF0YSB0eXBlcyBvZiBjZXJ0YWluCi0gKiBtb3JlIGNvbXBsaWNhdGVkIHZhcmlhYmxlcyAoYmFzaWNhbGx5IGFueXRoaW5nIGludm9sdmluZyBhIHN0cnVjdHVyZSwKLSAqIHVuaW9uLCBlbnVtLCBhcnJheSBvciBwb2ludGVyKS4gIFNvbWUgbm9uLXBvaW50ZXIgdmFyaWFibGVzIG9mIHRoZQotICogYmFzaWMgdHlwZXMgdGhhdCB0aGUgZGVidWdnZXIga25vd3MgYWJvdXQgZG8gbm90IHJlcXVpcmUgYSB2YXJpYWJsZQotICogZGVzY3JpcHRvci4KLSAqCi0gKiBTaW5jZSBpdCBpcyBpbXBvc3NpYmxlIHRvIGhhdmUgYSB2YXJpYWJsZSBkZXNjcmlwdG9yIGxvbmdlciB0aGFuIDEyOAotICogYnl0ZXMgYnkgdmlydHVlIG9mIHRoZSB3YXkgdGhhdCB0aGUgVk1TIG9iamVjdCBsYW5ndWFnZSBpcyBzZXQgdXAsCi0gKiBpdCBtYWtlcyBub3Qgc2Vuc2UgdG8gbWFrZSB0aGUgYXJyYXlzIGFueSBsb25nZXIgdGhhbiB0aGlzLCBvciB3b3JyeWluZwotICogYWJvdXQgZHluYW1pYyBzaXppbmcgb2YgdGhlIGFycmF5LgotICoKLSAqIFRoZXNlIGFyZSB0aGUgYXJyYXlzIGFuZCBjb3VudGVycyB0aGF0IHdlIHVzZSB0byBidWlsZCBhIHZhcmlhYmxlCi0gKiBkZXNjcmlwdG9yLgotICovCi0KLSNkZWZpbmUgTUFYX0RFQlVHX1JFQ09SRCAxMjgKLXN0YXRpYyBjaGFyIExvY2FsW01BWF9ERUJVR19SRUNPUkRdOwkvKiBidWZmZXIgZm9yIHZhcmlhYmxlIGRlc2NyaXB0b3IgKi8KLXN0YXRpYyBjaGFyIEFzdWZmaXhbTUFYX0RFQlVHX1JFQ09SRF07CS8qIGJ1ZmZlciBmb3IgYXJyYXkgZGVzY3JpcHRvciAqLwotc3RhdGljIGludCBMcG50OwkJLyogaW5kZXggaW50byBMb2NhbCAqLwotc3RhdGljIGludCBBcG9pbnQ7CQkvKiBpbmRleCBpbnRvIEFzdWZmaXggKi8KLXN0YXRpYyBjaGFyIG92ZXJmbG93OwkJLyogZmxhZyB0byBpbmRpY2F0ZSB3ZSBoYXZlIHdyaXR0ZW4gdG9vIG11Y2gqLwotc3RhdGljIGludCB0b3RhbF9sZW47CQkvKiB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbGVuZ3RoIG9mIHZhcmlhYmxlCi0JCQkJZGVzY3JpcHRvciBwbHVzIGFycmF5IGRlc2NyaXB0b3IgLSB1c2VkIGZvciBsZW4gYnl0ZSovCi0KLS8qIEZsYWcgaWYgd2UgaGF2ZSB0b2xkIHVzZXIgYWJvdXQgZmluZGluZyBnbG9iYWwgY29uc3RhbnRzIGluIHRoZSB0ZXh0Ci0gICBzZWN0aW9uLiAqLwotc3RhdGljIGludCBnYXZlX2NvbXBpbGVyX21lc3NhZ2UgPSAwOwotCi0KLS8qCi0gKglHbG9iYWwgZGF0YSAoT2JqZWN0IHJlY29yZHMgbGltaXRlZCB0byA1MTIgYnl0ZXMgYnkgVkFYLTExICJDIiBydW50aW1lKQotICovCi1zdGF0aWMgaW50IFZNU19PYmplY3RfRmlsZV9GRDsJLyogRmlsZSBEZXNjcmlwdG9yIGZvciBvYmplY3QgZmlsZSAqLwotc3RhdGljIGNoYXIgT2JqZWN0X1JlY29yZF9CdWZmZXJbNTEyXTsJLyogQnVmZmVyIGZvciBvYmplY3QgZmlsZSByZWNvcmRzICAqLwotc3RhdGljIGludCBPYmplY3RfUmVjb3JkX09mZnNldDsvKiBPZmZzZXQgdG8gZW5kIG9mIGRhdGEJICAgKi8KLXN0YXRpYyBpbnQgQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGU7CS8qIFR5cGUgb2YgcmVjb3JkIGluIGFib3ZlCSAgICovCi0KLS8qCi0gKglNYWNyb3MgZm9yIG1vdmluZyBkYXRhIGFyb3VuZC4gIE11c3Qgd29yayBvbiBiaWctZW5kaWFuIHN5c3RlbXMuCi0gKi8KLSNpZmRlZiBWTVMgIC8qIFRoZXNlIGFyZSBtb3JlIGVmZmljaWVudCBmb3IgVk1TLT5WTVMgc3lzdGVtcyAqLwotI2RlZmluZSBDT1BZX0xPTkcoZGVzdCx2YWwpCSggKihsb25nICopKGRlc3QpID0gKHZhbCkgKQotI2RlZmluZSBDT1BZX1NIT1JUKGRlc3QsdmFsKQkoICooc2hvcnQgKikoZGVzdCkgPSAodmFsKSApCi0jZWxzZQotI2RlZmluZSBDT1BZX0xPTkcoZGVzdCx2YWwpCW1kX251bWJlcl90b19jaGFycyAoKGRlc3QpLCAodmFsKSwgNCkKLSNkZWZpbmUgQ09QWV9TSE9SVChkZXN0LHZhbCkJbWRfbnVtYmVyX3RvX2NoYXJzICgoZGVzdCksICh2YWwpLCAyKQotI2VuZGlmCi0vKgotICoJTWFjcm9zIGZvciBwbGFjaW5nIGRhdGEgaW50byB0aGUgb2JqZWN0IHJlY29yZCBidWZmZXIuCi0gKi8KLSNkZWZpbmUgUFVUX0xPTkcodmFsKSBcCi0JKCBDT1BZX0xPTkcgKCZPYmplY3RfUmVjb3JkX0J1ZmZlcltPYmplY3RfUmVjb3JkX09mZnNldF0sICh2YWwpKSwgXAotCSAgT2JqZWN0X1JlY29yZF9PZmZzZXQgKz0gNCApCi0KLSNkZWZpbmUgUFVUX1NIT1JUKHZhbCkgXAotCSggQ09QWV9TSE9SVCAoJk9iamVjdF9SZWNvcmRfQnVmZmVyW09iamVjdF9SZWNvcmRfT2Zmc2V0XSwgKHZhbCkpLCBcCi0JICBPYmplY3RfUmVjb3JkX09mZnNldCArPSAyICkKLQotI2RlZmluZSBQVVRfQ0hBUih2YWwpICggT2JqZWN0X1JlY29yZF9CdWZmZXJbT2JqZWN0X1JlY29yZF9PZmZzZXQrK10gPSAodmFsKSApCi0KLSNkZWZpbmUgUFVUX0NPVU5URURfU1RSSU5HKGNwKSBkbyB7IFwKLQkJCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSAoY3ApOyBcCi0JCQlQVVRfQ0hBUiAoKGNoYXIpIHN0cmxlbiAocCkpOyBcCi0JCQl3aGlsZSAoKnApIFBVVF9DSEFSICgqcCsrKTsgfSB3aGlsZSAoMCkKLQotLyoKLSAqCU1hY3JvIGZvciBkZXRlcm1pbmluZyBpZiBhIE5hbWUgaGFzIHBzZWN0IGF0dHJpYnV0ZXMgYXR0YWNoZWQKLSAqCXRvIGl0LgotICovCi0jZGVmaW5lIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HCQkiJCRQc2VjdEF0dHJpYnV0ZXNfIgotI2RlZmluZSBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEgJMTgKLQotI2RlZmluZSBIQVNfUFNFQ1RfQVRUUklCVVRFUyhOYW1lKSBcCi0JCShzdHJuY21wICgoKk5hbWUgPT0gJ18nID8gTmFtZSArIDEgOiBOYW1lKSwgXAotCQkJICBQU0VDVF9BVFRSSUJVVEVTX1NUUklORywgXAotCQkJICBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEgpID09IDApCi0MCi0KLSAvKiBpbjogc2VnVCAgIG91dDogTl9UWVBFIGJpdHMgKi8KLWNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXSA9Ci17Ci0gIE5fQUJTLAotICBOX1RFWFQsCi0gIE5fREFUQSwKLSAgTl9CU1MsCi0gIE5fVU5ERiwJCQkvKiB1bmtub3duICovCi0gIE5fVU5ERiwJCQkvKiBlcnJvciAqLwotICBOX1VOREYsCQkJLyogZXhwcmVzc2lvbiAqLwotICBOX1VOREYsCQkJLyogZGVidWcgKi8KLSAgTl9VTkRGLAkJCS8qIG50diAqLwotICBOX1VOREYsCQkJLyogcHR2ICovCi0gIE5fUkVHSVNURVIsCQkJLyogcmVnaXN0ZXIgKi8KLX07Ci0KLWNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tOX1RZUEUgKyAyXSA9Ci17CQkJCS8qIE5fVFlQRSA9PSAweDFFID0gMzItMiAqLwotICBTRUdfVU5LTk9XTiwJCQkvKiBOX1VOREYgPT0gMCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0FCU09MVVRFLAkJCS8qIE5fQUJTID09IDIgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19URVhULAkJCS8qIE5fVEVYVCA9PSA0ICovCi0gIFNFR19HT09GLAotICBTRUdfREFUQSwJCQkvKiBOX0RBVEEgPT0gNiAqLwotICBTRUdfR09PRiwKLSAgU0VHX0JTUywJCQkvKiBOX0JTUyA9PSA4ICovCi0gIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19SRUdJU1RFUiwJCQkvKiBkdW1teSBOX1JFR0lTVEVSIGZvciByZWdzID0gMzAgKi8KLSAgU0VHX0dPT0YsCi19OwotDAotCi0vKiBMb2NhbCBzdXBwb3J0IHJvdXRpbmVzIHdoaWNoIHJldHVybiBhIHZhbHVlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpbnB1dF9maWxlICpmaW5kX2ZpbGUgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgc3RydWN0IFZNU19EQkdfU3ltYm9sICpmaW5kX3N5bWJvbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBzeW1ib2xTICpEZWZpbmVfUm91dGluZSBQQVJBTVMgKChzeW1ib2xTICosaW50LHN5bWJvbFMgKixpbnQpKTsKLQotc3RhdGljIGNoYXIgKmN2dF9pbnRlZ2VyIFBBUkFNUyAoKGNoYXIgKixpbnQgKikpOwotc3RhdGljIGNoYXIgKmZpeF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGNoYXIgKmdldF9zdHJ1Y3RfbmFtZSBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIG9mZnNldFQgVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSBQQVJBTVMgKChzeW1ib2xTICosdW5zaWduZWQpKTsKLQotc3RhdGljIGludCBWTVNfVEJUX1NvdXJjZV9GaWxlIFBBUkFNUyAoKGNoYXIgKixpbnQpKTsKLXN0YXRpYyBpbnQgZ2VuMSBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKixpbnQpKTsKLXN0YXRpYyBpbnQgZm9yd2FyZF9yZWZlcmVuY2UgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IGZpbmFsX2ZvcndhcmRfcmVmZXJlbmNlIFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqKSk7Ci1zdGF0aWMgaW50IFZNU190eXBlZGVmX3BhcnNlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCBoYXNoX3N0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgVk1TX1BzZWN0X1NwZWMgUEFSQU1TICgoY29uc3QgY2hhciAqLGludCxlbnVtIHBzX3R5cGUsCi0JCQkJICAgc3RydWN0IFZNU19TeW1ib2wgKikpOwotCi0vKiBMb2NhbCBzdXBwb3J0IHJvdXRpbmVzIHdoaWNoIGRvbid0IGRpcmVjdGx5IHJldHVybiBhbnkgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZCBzX2NvbnN0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBDbG9zZV9WTVNfT2JqZWN0X0ZpbGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgdm1zX3Rpcl9zdGFja19wc2VjdCBQQVJBTVMgKChpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIFBBUkFNUyAoKGNvbnN0IGNoYXIgKixpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU2V0X0RhdGEgUEFSQU1TICgoaW50LGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfU3RydWN0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgVk1TX0RlZl9TdHJ1Y3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU2V0X1N0cnVjdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfTW9kdWxlX0JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfTW9kdWxlX0VuZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBWTVNfVEJUX1JvdXRpbmVfQmVnaW4gUEFSQU1TICgoc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Sb3V0aW5lX0VuZCBQQVJBTVMgKChpbnQsc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfVEJUX0Jsb2NrX0JlZ2luIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQsY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfVEJUX0Jsb2NrX0VuZCBQQVJBTVMgKCh2YWx1ZVQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiBQQVJBTVMgKChpbnQsaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfU291cmNlX0xpbmVzIFBBUkFNUyAoKGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBmcHVzaCBQQVJBTVMgKChpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBycHVzaCBQQVJBTVMgKChpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBhcnJheV9zdWZmaXggUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICopKTsKLXN0YXRpYyB2b2lkIG5ld19mb3J3YXJkX3JlZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKixpbnQpKTsKLXN0YXRpYyB2b2lkIGJpdGZpZWxkX3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKixpbnQpKTsKLXN0YXRpYyB2b2lkIHNldHVwX2Jhc2ljX3R5cGUgUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICopKTsKLXN0YXRpYyB2b2lkIFZNU19EQkdfcmVjb3JkIFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCxpbnQsY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfbG9jYWxfc3RhYl9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIFZNU19zdGFiX3BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQsaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19HU1lNX1BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19MQ1NZTV9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU1RTWU1fUGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX1JTWU1fUGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLHN5bWJvbFMgKixpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19MU1lNX1BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIERlZmluZV9Mb2NhbF9TeW1ib2xzIFBBUkFNUyAoKHN5bWJvbFMgKixzeW1ib2xTICosc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgV3JpdGVfVk1TX01IRF9SZWNvcmRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIFdyaXRlX1ZNU19FT01fUmVjb3JkIFBBUkFNUyAoKGludCx2YWx1ZVQpKTsKLXN0YXRpYyB2b2lkIFZNU19DYXNlX0hhY2tfU3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKixjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcyBQQVJBTVMgKChjb25zdCBjaGFyICosaW50ICopKTsKLXN0YXRpYyB2b2lkIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgUEFSQU1TICgoY29uc3QgY2hhciAqLGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfTG9jYWxfRW52aXJvbm1lbnRfU2V0dXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfRW1pdF9HbG9iYWx2YWx1ZXMgUEFSQU1TICgodW5zaWduZWQsdW5zaWduZWQsY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfUHJvY2VkdXJlX0VudHJ5X1B0IFBBUkFNUyAoKGNoYXIgKixpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX1NldF9Qc2VjdCBQQVJBTVMgKChpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX1N0b3JlX1JlcGVhdGVkX0RhdGEgUEFSQU1TICgoaW50LGNoYXIgKixpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCwKLQkJCQkJCSAgICBpbnQsaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19GaXhfSW5kaXJlY3RfUmVmZXJlbmNlIFBBUkFNUyAoKGludCxpbnQsZnJhZ1MgKixmcmFnUyAqKSk7Ci0KLS8qIFN1cHBvcnQgY29kZSB3aGljaCB1c2VkIHRvIGJlIGlubGluZSB3aXRoaW4gdm1zX3dyaXRlX29iamVjdF9maWxlLiAgKi8KLXN0YXRpYyB2b2lkIHZtc19maXh1cF90ZXh0X3NlY3Rpb24gUEFSQU1TICgodW5zaWduZWQsc3RydWN0IGZyYWcgKixzdHJ1Y3QgZnJhZyAqKSk7Ci1zdGF0aWMgdm9pZCBzeW50aGVzaXplX2RhdGFfc2VnbWVudCBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCxzdHJ1Y3QgZnJhZyAqKSk7Ci1zdGF0aWMgdm9pZCB2bXNfZml4dXBfZGF0YV9zZWN0aW9uIFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgbG9jYWxfc3ltYm9sc19EU1QgUEFSQU1TICgoc3ltYm9sUyAqLHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgdm1zX2J1aWxkX0RTVCBQQVJBTVMgKCh1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgdm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IFZNU19TeW1ib2wgKiwgaW50KSk7Ci0MCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSBkZWZpbmVzIHRoZSBzcGVjaWFsIHR5cGVzIG9mIHBzZXVkby1vcHMgdGhhdCB3ZQotICAgdXNlIHdpdGggVk1TLiAgKi8KLQotdW5zaWduZWQgY2hhciBjb25zdF9mbGFnID0gSU5fREVGQVVMVF9TRUNUSU9OOwotCi1zdGF0aWMgdm9pZAotc19jb25zdCAoYXJnKQotICAgICBpbnQgYXJnOwkvKiAzcmQgZmllbGQgZnJvbSBvYmpfcHNldWRvX3RhYmxlW107IG5vdCBuZWVkZWQgaGVyZSAqLwotewotICAvKiBTaW5jZSB3ZSBkb24ndCBuZWVkIGBhcmcnLCB1c2UgaXQgYXMgb3VyIHNjcmF0Y2ggdmFyaWFibGUgc28gdGhhdAotICAgICB3ZSB3b24ndCBnZXQgYW55ICJub3QgdXNlZCIgd2FybmluZ3MgYWJvdXQgaXQuICAqLwotICBhcmcgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIChzdWJzZWdUKSBhcmcpOwotICBjb25zdF9mbGFnID0gMTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiY29uc3QiLCBzX2NvbnN0LCAwfSwKLSAgezAsIDAsIDB9LAotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotCi0KLS8qIFJvdXRpbmUgdG8gcGVyZm9ybSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oKS4gICovCi0KLWludAotdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgLyoKLSAgICoJSWYgdGhlIG5ldyBzeW1ib2wgaXMgLmNvbW0gQU5EIGl0IGhhcyBhIHNpemUgb2YgemVybywKLSAgICoJd2UgaWdub3JlIGl0IChpLmUuIHRoZSBvbGQgc3ltYm9sIG92ZXJyaWRlcyBpdCkKLSAgICovCi0gIGlmIChTRUdNRU5UX1RPX1NZTUJPTF9UWVBFICgoaW50KSBub3dfc2VnKSA9PSAoTl9VTkRGIHwgTl9FWFQpCi0gICAgICAmJiBmcmFnX25vd19maXggKCkgPT0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJjb21waWxlciBlbWl0dGVkIHplcm8tc2l6ZSBjb21tb24gc3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksCi0JICAgICAgIFNfR0VUX05BTUUgKHN5bSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAvKgotICAgKglJZiB0aGUgb2xkIHN5bWJvbCBpcyAuY29tbSBhbmQgaXQgaGFzIGEgc2l6ZSBvZiB6ZXJvLAotICAgKgl3ZSBvdmVycmlkZSBpdCB3aXRoIHRoZSBuZXcgc3ltYm9sIHZhbHVlLgotICAgKi8KLSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bSkgJiYgU19JU19ERUZJTkVEIChzeW0pICYmIFNfR0VUX1ZBTFVFIChzeW0pID09IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiY29tcGlsZXIgcmVkZWZpbmVkIHplcm8tc2l6ZSBjb21tb24gc3ltYm9sIGAlcyciKSwKLQkgICAgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgICBzeW0tPnN5X2ZyYWcgID0gZnJhZ19ub3c7Ci0gICAgICBTX1NFVF9PVEhFUiAoc3ltLCBjb25zdF9mbGFnKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgICAvKiBLZWVwIE5fRVhUIGJpdC4gICovCi0gICAgICBzeW0tPnN5X3N5bWJvbC5uX3R5cGUgfD0gU0VHTUVOVF9UT19TWU1CT0xfVFlQRSAoKGludCkgbm93X3NlZyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogYHRjX2Zyb2JfbGFiZWwnIGhhbmRsZXIgZm9yIGNvbG9uKHN5bWJvbHMuYyksIHVzZWQgdG8gZXhhbWluZSB0aGUKLSAgIGR1bW15IGxhYmVsKHMpIGdjYyBpbnNlcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBmaWxlIGl0IGdlbmVyYXRlcy4KLSAgIGdjYyAxLnggcHV0ICJnY2NfY29tcGlsZWQuIjsgZ2NjIDIueCAoYXMgb2YgMi43KSBwdXRzICJnY2MyX2NvbXBpbGVkLiIKLSAgIGFuZCAiX19nbnVfbGFuZ3VhZ2VfPG5hbWU+IiBhbmQgcG9zc2libHkgIl9fdmF4Xzx0eXBlPl9kb3VibGVzIi4gICovCi0KLXZvaWQKLXZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCAoc3ltYm9sUCkKLXN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIC8qIFNwZWNpYWwgbGFiZWxzIG9ubHkgb2NjdXIgcHJpb3IgdG8gZXhwbGljaXQgc2VjdGlvbiBkaXJlY3RpdmVzLiAgKi8KLSAgaWYgKChjb25zdF9mbGFnICYgSU5fREVGQVVMVF9TRUNUSU9OKSAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bV9uYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0KLSAgICAgIGlmICgqc3ltX25hbWUgPT0gJ18nKQotCSsrc3ltX25hbWU7Ci0KLSAgICAgIGlmICghc3RyY21wIChzeW1fbmFtZSwgIl9fdmF4X2dfZG91YmxlcyIpKQotCXZheF9nX2RvdWJsZXMgPSAxOwotI2lmIDAJLyogbm90IG5lY2Vzc2FyeSAqLwotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoc3ltX25hbWUsICJfX3ZheF9kX2RvdWJsZXMiKSkKLQl2YXhfZ19kb3VibGVzID0gMDsKLSNlbmRpZgotI2lmIDAJLyogdGhlc2UgYXJlIHBvdGVudGlhbCBhbHRlcm5hdGl2ZXMgdG8gdGMtdmF4LmMncyBtZF9wYXJzZV9vcHRpb25zKCkgKi8KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHN5bV9uYW1lLCAiZ2NjX2NvbXBpbGVkLiIpKQotCWZsYWdfb25lID0gMTsKLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHN5bV9uYW1lLCAiX19nbnVfbGFuZ3VhZ2VfY3BsdXNwbHVzIikpCi0JZmxhZ19oYXNoX2xvbmdfbmFtZXMgPSAxOwotI2VuZGlmCi0gICAgfQotICByZXR1cm47Ci19Ci0KLQotdm9pZAotb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotICByZXR1cm47Ci19Ci0KLQotdm9pZAotb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN5bWJvbFMgKipzeW1ib2xQUDsKLSAgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotCi0gIHN5bWJvbFBQID0gJnN5bWJvbF9yb290UDsJLyogLT4gbGFzdCBzeW1ib2wgY2hhaW4gbGluay4gKi8KLSAgd2hpbGUgKChzeW1ib2xQID0gKnN5bWJvbFBQKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xQLCAxKTsKLQotICAgICAvKiBPSywgaGVyZSBpcyBob3cgd2UgZGVjaWRlIHdoaWNoIHN5bWJvbHMgZ28gb3V0IGludG8gdGhlCi0JYnJhdmUgbmV3IHN5bXRhYi4gIFN5bWJvbHMgdGhhdCBkbyBhcmU6Ci0KLQkqIHN5bWJvbHMgd2l0aCBubyBuYW1lIChzdGFiZCdzPykKLQkqIHN5bWJvbHMgd2l0aCBkZWJ1ZyBpbmZvIGluIHRoZWlyIE5fVFlQRQotCSogc3ltYm9scyB3aXRoIFwxIGFzIHRoZWlyIDNyZCBjaGFyYWN0ZXIgKG51bWVyaWMgbGFiZWxzKQotCSogImxvY2FsIGxhYmVscyIgbmVlZGVkIGZvciBQSUMgZml4dXBzCi0KLQlTeW1ib2xzIHRoYXQgZG9uJ3QgYXJlOgotCSogc3ltYm9scyB0aGF0IGFyZSByZWdpc3RlcnMKLQotCUFsbCBvdGhlciBzeW1ib2xzIGFyZSBvdXRwdXQuICBXZSBjb21wbGFpbiBpZiBhIGRlbGV0ZWQKLQlzeW1ib2wgd2FzIG1hcmtlZCBleHRlcm5hbC4gICovCi0KLSAgICAgIGlmICghU19JU19SRUdJU1RFUiAoc3ltYm9sUCkpCi0JewotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcisrOwotCSAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCSAgc3ltYm9sUFAgPSAmKHN5bWJvbF9uZXh0IChzeW1ib2xQKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgICB9CQkJLyogb29wcy4gKi8KLQotCSAgLyogVW5ob29rIGl0IGZyb20gdGhlIGNoYWluLiAgKi8KLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQl9CQkJLyogaWYgdGhpcyBzeW1ib2wgc2hvdWxkIGJlIGluIHRoZSBvdXRwdXQgKi8KLQotICAgIH0JCQkvKiBmb3IgZWFjaCBzeW1ib2wgKi8KLQotICBIX1NFVF9TVFJJTkdfU0laRSAoaGVhZGVycywgc3RyaW5nX2J5dGVfY291bnQpOwotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaGVhZGVycywgc3ltYm9sX251bWJlcik7Ci19CQkJCS8qIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4oKSAqLwotDAotCi0gLyoqKioqKiBWTVMgT0JKRUNUIEZJTEUgSEFDS0lORyBST1VUSU5FUyAqKioqKioqLwotCi0KLS8qIENyZWF0ZSB0aGUgVk1TIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLUNyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUgKCkKLXsKLSNpZglkZWZpbmVkKGV1bmljZSkgfHwgIWRlZmluZWQoVk1TKQotICBWTVNfT2JqZWN0X0ZpbGVfRkQgPSBjcmVhdCAob3V0X2ZpbGVfbmFtZSwgMDc3NywgInZhciIpOwotI2Vsc2UJLyogZXVuaWNlICovCi0gIFZNU19PYmplY3RfRmlsZV9GRCA9IGNyZWF0IChvdXRfZmlsZV9uYW1lLCAwLCAicmZtPXZhciIsCi0JCQkgICAgICAiY3R4PWJpbiIsICJtYmM9MTYiLCAiZGVxPTY0IiwgImZvcD10ZWYiLAotCQkJICAgICAgInNocj1uaWwiKTsKLSNlbmRpZgkvKiBldW5pY2UgKi8KLSAgLyogRGVhbCB3aXRoIGVycm9ycy4gICovCi0gIGlmIChWTVNfT2JqZWN0X0ZpbGVfRkQgPCAwKQotICAgIGFzX2ZhdGFsIChfKCJDb3VsZG4ndCBjcmVhdGUgVk1TIG9iamVjdCBmaWxlIFwiJXNcIiIpLCBvdXRfZmlsZV9uYW1lKTsKLSAgLyogSW5pdGlhbGl6ZSBvYmplY3QgZmlsZSBoYWNraW5nIHZhcmlhYmxlcy4gICovCi0gIE9iamVjdF9SZWNvcmRfT2Zmc2V0ID0gMDsKLSAgQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGUgPSAtMTsKLX0KLQotCi0vKiBGbHVzaCB0aGUgb2JqZWN0IHJlY29yZCBidWZmZXIgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLUZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKQotewotICAvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSNpZm5kZWYgVk1TCQkJLyogRm9yIGNyb3NzLWFzc2VtYmx5IHB1cnBvc2VzLiAqLwotICB7Ci0gICAgY2hhciBSZWNMZW5bMl07Ci0KLSAgICAvKiAiVmFyaWFibGUtbGVuZ3RoIHJlY29yZCIgZmlsZXMgaGF2ZSBhIHR3byBieXRlIGxlbmd0aCBmaWVsZAotICAgICAgIHByZXBlbmRlZCB0byBlYWNoIHJlY29yZC4gIEl0J3Mgbm9ybWFsbHkgb3V0LW9mLWJhbmQsIGFuZCBuYXRpdmUKLSAgICAgICBWTVMgb3V0cHV0IHdpbGwgaW5zZXJ0IGl0IGF1dG9tYXRpY2FsbHkgZm9yIHRoaXMgdHlwZSBvZiBmaWxlLgotICAgICAgIFdoZW4gY3Jvc3MtYXNzZW1ibGluZywgd2UgbXVzdCB3cml0ZSBpdCBleHBsaWNpdGx5LiAgKi8KLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKFJlY0xlbiwgT2JqZWN0X1JlY29yZF9PZmZzZXQsIDIpOwotICAgIGlmICh3cml0ZSAoVk1TX09iamVjdF9GaWxlX0ZELCBSZWNMZW4sIDIpICE9IDIpCi0gICAgICBlcnJvciAoXygiSS9PIGVycm9yIHdyaXRpbmcgVk1TIG9iamVjdCBmaWxlIChsZW5ndGggcHJlZml4KSIpKTsKLSAgICAvKiBXZSBhbHNvIG5lZWQgdG8gZm9yY2UgdGhlIGFjdHVhbCByZWNvcmQgdG8gYmUgYW4gZXZlbiBudW1iZXIgb2YKLSAgICAgICBieXRlcy4gIEZvciBuYXRpdmUgb3V0cHV0LCB0aGF0J3MgYXV0b21hdGljOyB3aGVuIGNyb3NzLWFzc2VtYmxpbmcsCi0gICAgICAgcGFkIHdpdGggYSBOVUwgYnl0ZSBpZiBsZW5ndGggaXMgb2RkLiAgRG8gc28gX2FmdGVyXyB3cml0aW5nIHRoZQotICAgICAgIHByZS1wYWRkZWQgbGVuZ3RoLiAgU2luY2Ugb3VyIGJ1ZmZlciBpcyBkZWZpbmVkIHdpdGggZXZlbiBzaXplLAotICAgICAgIGFuIG9kZCBvZmZzZXQgaW1wbGllcyB0aGF0IGl0IGhhcyBzb21lIHJvb20gbGVmdC4gICovCi0gICAgaWYgKChPYmplY3RfUmVjb3JkX09mZnNldCAmIDEpICE9IDApCi0gICAgICBPYmplY3RfUmVjb3JkX0J1ZmZlcltPYmplY3RfUmVjb3JkX09mZnNldCsrXSA9ICdcMCc7Ci0gIH0KLSNlbmRpZiAvKiBub3QgVk1TICovCi0KLSAgLyogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIGZpbGUuICAqLwotICBpZiAod3JpdGUgKFZNU19PYmplY3RfRmlsZV9GRCwgT2JqZWN0X1JlY29yZF9CdWZmZXIsIE9iamVjdF9SZWNvcmRfT2Zmc2V0KQotICAgICAgIT0gT2JqZWN0X1JlY29yZF9PZmZzZXQpCi0gICAgZXJyb3IgKF8oIkkvTyBlcnJvciB3cml0aW5nIFZNUyBvYmplY3QgZmlsZSIpKTsKLQotICAvKiBUaGUgYnVmZmVyIGlzIG5vdyBlbXB0eS4gICovCi0gIE9iamVjdF9SZWNvcmRfT2Zmc2V0ID0gMDsKLX0KLQotCi0vKiBEZWNsYXJlIGEgcGFydGljdWxhciB0eXBlIG9mIG9iamVjdCBmaWxlIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1TZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoVHlwZSkKLSAgICAgaW50IFR5cGU7Ci17Ci0gIC8qIElmIHRoZSB0eXBlIG1hdGNoZXMsIHdlIGFyZSBkb25lLiAgKi8KLSAgaWYgKFR5cGUgPT0gQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGUpCi0gICAgcmV0dXJuOwotICAvKiBPdGhlcndpc2U6IGZsdXNoIHRoZSBidWZmZXIuICAqLwotICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci0gIC8qIFJlbWVtYmVyIHRoZSBuZXcgdHlwZS4gICovCi0gIEN1cnJlbnRfT2JqZWN0X1JlY29yZF9UeXBlID0gVHlwZTsKLX0KLQotCi0vKiBDbG9zZSB0aGUgVk1TIE9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLUNsb3NlX1ZNU19PYmplY3RfRmlsZSAoKQotewotICAvKiBGbHVzaCAoc2hvdWxkIG5ldmVyIGJlIG5lY2Vzc2FyeSkgYW5kIHJlc2V0IHNhdmVkIHJlY29yZC10eXBlIGNvbnRleHQuICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoLTEpOwotCi0jaWZuZGVmIFZNUwkJCS8qIEZvciBjcm9zcy1hc3NlbWJseSBwdXJwb3Nlcy4gKi8KLSAgewotICAgIGNoYXIgUmVjTGVuWzJdOwotICAgIGludCBtaW51c19vbmUgPSAtMTsKLQotICAgIC8qIFdyaXRlIGEgMiBieXRlIHJlY29yZC1sZW5ndGggZmllbGQgb2YgLTEgaW50byB0aGUgZmlsZSwgd2hpY2gKLSAgICAgICBtZWFucyBlbmQtb2YtYmxvY2sgd2hlbiByZWFkLCBoZW5jZSBlbmQtb2YtZmlsZSB3aGVuIG9jY3VycmluZwotICAgICAgIGluIHRoZSBmaWxlJ3MgbGFzdCBibG9jay4gIEl0IGlzIG9ubHkgbmVlZGVkIGZvciB2YXJpYWJsZS1sZW5ndGgKLSAgICAgICByZWNvcmQgZmlsZXMgdHJhbnNmZXJyZWQgdG8gVk1TIGFzIGZpeGVkLWxlbmd0aCByZWNvcmQgZmlsZXMKLSAgICAgICAodHlwaWNhbCBmb3IgYmluYXJ5IEZUUDsgTkZTIHNob3VsZG4ndCBuZWVkIGl0LCBidXQgaXQgd29uJ3QgaHVydCkuICAqLwotICAgIG1kX251bWJlcl90b19jaGFycyAoUmVjTGVuLCBtaW51c19vbmUsIDIpOwotICAgIHdyaXRlIChWTVNfT2JqZWN0X0ZpbGVfRkQsIFJlY0xlbiwgMik7Ci0gIH0KLSNlbHNlCi0gICAgLyogV2hlbiB3cml0dGVuIG9uIGEgVk1TIHN5c3RlbSwgdGhlIGZpbGUgaGVhZGVyIChjZiBpbm9kZSkgd2lsbCByZWNvcmQKLSAgICAgICB0aGUgYWN0dWFsIGVuZC1vZi1maWxlIHBvc2l0aW9uIGFuZCBubyBpbmxpbmUgbWFya2VyIGlzIG5lZWRlZC4gICovCi0jZW5kaWYKLQotICBjbG9zZSAoVk1TX09iamVjdF9GaWxlX0ZEKTsKLX0KLQwKLQotIC8qKioqKiogVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiByb3V0aW5lcyAqKioqKiovCi0KLQotLyogU3RhY2sgUHNlY3QgYmFzZSBmb2xsb3dlZCBieSBzaWduZWQsIHZhcnlpbmctc2l6ZWQgb2Zmc2V0LgotICAgQ29tbW9uIHRvIHNldmVyYWwgb2JqZWN0IHJlY29yZHMuICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgRm9yY2UpCi0gICAgIGludCBQc2VjdF9JbmRleDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IEZvcmNlOwotewotICBpbnQgcHNlY3Rfd2lkdGgsIG9mZnNldF93aWR0aDsKLQotICBwc2VjdF93aWR0aCA9ICgodW5zaWduZWQpIFBzZWN0X0luZGV4ID4gMjU1KSA/IDIgOiAxOwotICBvZmZzZXRfd2lkdGggPSAoRm9yY2UgfHwgT2Zmc2V0ID4gMzI3NjcgfHwgT2Zmc2V0IDwgLTMyNzY4KSA/IDQKLQkJIDogKE9mZnNldCA+IDEyNyB8fCBPZmZzZXQgPCAtMTI4KSA/IDIgOiAxOwotI2RlZmluZSBTdGFfUChwLG8pICgoKG8pPDwxKSB8ICgocCktMSkpCi0gIC8qIGJ5dGUgb3Igd29yZCBwc2VjdDsgYnl0ZSwgd29yZCwgb3IgbG9uZ3dvcmQgb2Zmc2V0ICovCi0gIHN3aXRjaCAoU3RhX1AocHNlY3Rfd2lkdGgsb2Zmc2V0X3dpZHRoKSkKLSAgICB7Ci0gICAgICBjYXNlIFN0YV9QKDEsMSk6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9QQik7Ci0JCQlQVVRfQ0hBUiAoKGNoYXIpKHVuc2lnbmVkIGNoYXIpIFBzZWN0X0luZGV4KTsKLQkJCVBVVF9DSEFSICgoY2hhcikgT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgxLDIpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfUFcpOwotCQkJUFVUX0NIQVIgKChjaGFyKSh1bnNpZ25lZCBjaGFyKSBQc2VjdF9JbmRleCk7Ci0JCQlQVVRfU0hPUlQgKE9mZnNldCk7Ci0JCQlicmVhazsKLSAgICAgIGNhc2UgU3RhX1AoMSw0KToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1BMKTsKLQkJCVBVVF9DSEFSICgoY2hhcikodW5zaWduZWQgY2hhcikgUHNlY3RfSW5kZXgpOwotCQkJUFVUX0xPTkcgKE9mZnNldCk7Ci0JCQlicmVhazsKLSAgICAgIGNhc2UgU3RhX1AoMiwxKToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1dQQik7Ci0JCQlQVVRfU0hPUlQgKFBzZWN0X0luZGV4KTsKLQkJCVBVVF9DSEFSICgoY2hhcikgT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgyLDIpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfV1BXKTsKLQkJCVBVVF9TSE9SVCAoUHNlY3RfSW5kZXgpOwotCQkJUFVUX1NIT1JUIChPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgICBjYXNlIFN0YV9QKDIsNCk6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9XUEwpOwotCQkJUFVUX1NIT1JUIChQc2VjdF9JbmRleCk7Ci0JCQlQVVRfTE9ORyAoT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgIH0KLSN1bmRlZiBTdGFfUAotfQotCi0KLS8qIFN0b3JlIGltbWVkaWF0ZSBkYXRhIGluIGN1cnJlbnQgUHNlY3QuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChQb2ludGVyLCBTaXplLCBSZWNvcmRfVHlwZSkKLSAgICAgY29uc3QgY2hhciAqUG9pbnRlcjsKLSAgICAgaW50IFNpemU7Ci0gICAgIGludCBSZWNvcmRfVHlwZTsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKFJlY29yZF9UeXBlKTsKLSAgLyogV2UgY2FuIG9ubHkgc3RvcmUgYXMgbW9zdCAxMjggYnl0ZXMgYXQgYSB0aW1lIGR1ZSB0byB0aGUgd2F5IHRoYXQKLSAgICAgVElSIGNvbW1hbmRzIGFyZSBlbmNvZGVkLiAgKi8KLSAgd2hpbGUgKFNpemUgPiAwKQotICAgIHsKLSAgICAgIGkgPSAoU2l6ZSA+IDEyOCkgPyAxMjggOiBTaXplOwotICAgICAgU2l6ZSAtPSBpOwotICAgICAgLyogSWYgd2UgY2Fubm90IGFjY29tbW9kYXRlIHRoaXMgcmVjb3JkLCBmbHVzaCB0aGUgYnVmZmVyLiAgKi8KLSAgICAgIGlmICgoT2JqZWN0X1JlY29yZF9PZmZzZXQgKyBpICsgMSkgPj0gc2l6ZW9mIE9iamVjdF9SZWNvcmRfQnVmZmVyKQotCUZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLSAgICAgIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgcmVjb3JkIHR5cGUuICAqLwotICAgICAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0JUFVUX0NIQVIgKFJlY29yZF9UeXBlKTsKLSAgICAgIC8qIFN0b3JlIHRoZSBjb3VudC4gIFRoZSBTdG9yZSBJbW1lZGlhdGUgVElSIGNvbW1hbmQgaXMgaW1wbGllZCBieQotICAgICAgICAgYSBuZWdhdGl2ZSBjb21tYW5kIGJ5dGUsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbW1lZGlhdGUgZGF0YQotICAgICAgICAgaXMgYWJzKGNvbW1hbmRfYnl0ZSkuICBTbywgd2Ugd3JpdGUgdGhlIG5lZ2F0ZWQgbGVuZ3RoIHZhbHVlLiAgKi8KLSAgICAgIFBVVF9DSEFSICgoY2hhcikgKC1pICYgMHhmZikpOwotICAgICAgLyogTm93IHN0b3JlIHRoZSBkYXRhLiAgKi8KLSAgICAgIHdoaWxlICgtLWkgPj0gMCkKLQlQVVRfQ0hBUiAoKlBvaW50ZXIrKyk7Ci0gICAgfQotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLQotLyogTWFrZSBhIGRhdGEgcmVmZXJlbmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19TZXRfRGF0YSAoUHNlY3RfSW5kZXgsIE9mZnNldCwgUmVjb3JkX1R5cGUsIEZvcmNlKQotICAgICBpbnQgUHNlY3RfSW5kZXg7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGludCBSZWNvcmRfVHlwZTsKLSAgICAgaW50IEZvcmNlOwotewotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSByZWNvcmQgdHlwZS4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qIFN0YWNrIHRoZSBQc2VjdCBiYXNlIHdpdGggaXRzIG9mZnNldC4gICovCi0gIHZtc190aXJfc3RhY2tfcHNlY3QgKFBzZWN0X0luZGV4LCBPZmZzZXQsIEZvcmNlKTsKLSAgLyogU2V0IHJlbG9jYXRpb24gYmFzZS4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotCi0KLS8qIE1ha2UgYSBkZWJ1Z2dlciByZWZlcmVuY2UgdG8gYSBzdHJ1Y3QsIHVuaW9uIG9yIGVudW0uICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1N0b3JlX1N0cnVjdCAoU3RydWN0X0luZGV4KQotICAgICBpbnQgU3RydWN0X0luZGV4OwotewotICAvKiBXZSBhcmUgd3JpdGluZyBhIGRlYnVnIHJlY29yZC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0RCRyk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1VXKTsKLSAgUFVUX1NIT1JUIChTdHJ1Y3RfSW5kZXgpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfU1RLREwpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVE9fTCk7Ci0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQotCi0vKiBNYWtlIGEgZGVidWdnZXIgcmVmZXJlbmNlIHRvIHBhcnRpYWxseSBkZWZpbmUgYSBzdHJ1Y3QsIHVuaW9uIG9yIGVudW0uICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX0RlZl9TdHJ1Y3QgKFN0cnVjdF9JbmRleCkKLSAgICAgaW50IFN0cnVjdF9JbmRleDsKLXsKLSAgLyogV2UgYXJlIHdyaXRpbmcgYSBkZWJ1ZyByZWNvcmQuICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19EQkcpOwotICAvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSByZWNvcmQgdHlwZS4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChPQkpfU19DX0RCRyk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX1NUQV9VVyk7Ci0gIFBVVF9TSE9SVCAoU3RydWN0X0luZGV4KTsKLSAgUFVUX0NIQVIgKFRJUl9TX0NfQ1RMX0RGTE9DKTsKLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotCi1zdGF0aWMgdm9pZAotVk1TX1NldF9TdHJ1Y3QgKFN0cnVjdF9JbmRleCkKLSAgICAgaW50IFN0cnVjdF9JbmRleDsKLXsJCQkJLyogc2VlIHByZXZpb3VzIGZ1bmN0aW9ucyBmb3IgY29tbWVudHMgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfREJHKTsKLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1VXKTsKLSAgUFVUX1NIT1JUIChTdHJ1Y3RfSW5kZXgpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfU1RMT0MpOwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0gLyoqKioqKiBUcmFjZWJhY2sgSW5mb3JtYXRpb24gcm91dGluZXMgKioqKioqLwotCi0KLS8qIFdyaXRlIHRoZSBUcmFjZWJhY2sgTW9kdWxlIEJlZ2luIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX01vZHVsZV9CZWdpbiAoKQotewotICByZWdpc3RlciBjaGFyICpjcCwgKmNwMTsKLSAgaW50IFNpemU7Ci0gIGNoYXIgTG9jYWxbMjU2XTsKLQotICAvKiBBcnJhbmdlIHRvIHN0b3JlIHRoZSBkYXRhIGxvY2FsbHkgKGxlYXZlIHJvb20gZm9yIHNpemUgYnl0ZSkuICAqLwotICBjcCA9ICZMb2NhbFsxXTsKLSAgLyogQmVnaW4gbW9kdWxlLiAgKi8KLSAgKmNwKysgPSBEU1RfU19DX01PREJFRzsKLSAgKmNwKysgPSAwOwkJLyogZmxhZ3M7IG5vdCB1c2VkICovCi0gIC8qCi0gICAqCUxhbmd1YWdlIHR5cGUgPT0gIkMiCi0gICAqCi0gICAqIChGSVhNRTogIHRoaXMgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBpbnB1dC4uLikKLSAgICovCi0gIENPUFlfTE9ORyAoY3AsIERTVF9TX0NfQyk7Ci0gIGNwICs9IDQ7Ci0gIC8qIFN0b3JlIHRoZSBtb2R1bGUgbmFtZS4gICovCi0gICpjcCsrID0gKGNoYXIpIHN0cmxlbiAoTW9kdWxlX05hbWUpOwotICBjcDEgPSBNb2R1bGVfTmFtZTsKLSAgd2hpbGUgKCpjcDEpCi0gICAgKmNwKysgPSAqY3AxKys7Ci0gIC8qIE5vdyB3ZSBjYW4gc3RvcmUgdGhlIHJlY29yZCBzaXplLiAgKi8KLSAgU2l6ZSA9IChjcCAtIExvY2FsKTsKLSAgTG9jYWxbMF0gPSBTaXplIC0gMTsKLSAgLyogUHV0IGl0IGludG8gdGhlIG9iamVjdCByZWNvcmQuICAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBTaXplLCBPQkpfU19DX1RCVCk7Ci19Ci0KLQotLyogV3JpdGUgdGhlIFRyYWNlYmFjayBNb2R1bGUgRW5kIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX01vZHVsZV9FbmQgKCkKLXsKLSAgY2hhciBMb2NhbFsyXTsKLQotICAvKiBFbmQgbW9kdWxlLiAgKi8KLSAgTG9jYWxbMF0gPSAxOwotICBMb2NhbFsxXSA9IERTVF9TX0NfTU9ERU5EOwotICAvKiBQdXQgaXQgaW50byB0aGUgb2JqZWN0IHJlY29yZC4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDIsIE9CSl9TX0NfVEJUKTsKLX0KLQotCi0vKiBXcml0ZSBhIFRyYWNlYmFjayBSb3V0aW5lIEJlZ2luIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX1JvdXRpbmVfQmVnaW4gKHN5bWJvbFAsIFBzZWN0KQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotICAgICBpbnQgUHNlY3Q7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwLCAqY3AxOwotICBjaGFyICpOYW1lOwotICBpbnQgT2Zmc2V0OwotICBpbnQgU2l6ZTsKLSAgY2hhciBMb2NhbFs1MTJdOwotCi0gIC8qIFN0cmlwIHRoZSBsZWFkaW5nICJfIiBmcm9tIHRoZSBuYW1lLiAgKi8KLSAgTmFtZSA9IFNfR0VUX05BTUUgKHN5bWJvbFApOwotICBpZiAoKk5hbWUgPT0gJ18nKQotICAgIE5hbWUrKzsKLSAgLyogR2V0IHRoZSB0ZXh0IHBzZWN0IG9mZnNldC4gICovCi0gIE9mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLSAgLyogU2V0IHRoZSByZWNvcmQgc2l6ZS4gICovCi0gIFNpemUgPSAxICsgMSArIDQgKyAxICsgc3RybGVuIChOYW1lKTsKLSAgTG9jYWxbMF0gPSBTaXplOwotICAvKiBEU1QgdHlwZSAicm91dGluZSBiZWdpbiIuICAqLwotICBMb2NhbFsxXSA9IERTVF9TX0NfUlROQkVHOwotICAvKiBVc2VzIENhbGxTL0NhbGxHLiAgKi8KLSAgTG9jYWxbMl0gPSAwOwotICAvKiBTdG9yZSB0aGUgZGF0YSBzbyBmYXIuICAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCAzLCBPQkpfU19DX1RCVCk7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgZ2VuZXJhdGluZyBhIE9CSl9TX0NfVEJUIHJlY29yZC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChPQkpfU19DX1RCVCk7Ci0gIC8qIFN0YWNrIHRoZSBhZGRyZXNzLiAgKi8KLSAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3QsIE9mZnNldCwgMCk7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHJlZmVyZW5jZS4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgLyogU3RvcmUgdGhlIGNvdW50ZWQgc3RyaW5nIGFzIGRhdGEuICAqLwotICBjcCA9IExvY2FsOwotICBjcDEgPSBOYW1lOwotICBTaXplID0gc3RybGVuIChjcDEpICsgMTsKLSAgKmNwKysgPSBTaXplIC0gMTsKLSAgd2hpbGUgKCpjcDEpCi0gICAgKmNwKysgPSAqY3AxKys7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIFNpemUsIE9CSl9TX0NfVEJUKTsKLX0KLQotCi0vKiBXcml0ZSBhIFRyYWNlYmFjayBSb3V0aW5lIEVuZCByZWNvcmQuCi0KLSAgIFdlICptdXN0KiBzZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSB0byBmaW5kIHRoZSBuZXh0IHJvdXRpbmUsIHNpbmNlIHRoZQotICAgYXNzZW1iZXIgaGFzIGEgd2F5IG9mIHJlYXNzZW1ibGluZyB0aGUgc3ltYm9sIHRhYmxlIE9VVCBPRiBPUkRFUiBUaHVzCi0gICB0aGUgbmV4dCByb3V0aW5lIGluIHRoZSBzeW1ib2wgbGlzdCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIG5leHQgb25lIGluCi0gICBtZW1vcnkuICBGb3IgZGVidWdnaW5nIHRvIHdvcmsgY29ycmVjdGx5IHdlIG11c3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUKLSAgIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9Sb3V0aW5lX0VuZCAoTWF4X1NpemUsIHNwKQotICAgICBpbnQgTWF4X1NpemU7Ci0gICAgIHN5bWJvbFMgKnNwOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgU2l6ZSA9IDB4N2ZmZmZmZmY7Ci0gIGNoYXIgTG9jYWxbMTZdOwotICB2YWx1ZVQgc3ltX3ZhbHVlLCBzcF92YWx1ZSA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkgJiYgU19HRVRfVFlQRSAoc3ltYm9sUCkgPT0gTl9URVhUKQotCXsKLQkgIGlmICgqU19HRVRfTkFNRSAoc3ltYm9sUCkgPT0gJ0wnKQotCSAgICBjb250aW51ZTsKLQkgIHN5bV92YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgIGlmIChzeW1fdmFsdWUgPiBzcF92YWx1ZSAmJiBzeW1fdmFsdWUgPCBTaXplKQotCSAgICBTaXplID0gc3ltX3ZhbHVlOwotCi0JICAvKgotCSAgICogRHVtbXkgbGFiZWxzIGxpa2UgImdjY19jb21waWxlZC4iIHNob3VsZCBubyBsb25nZXIgcmVhY2ggaGVyZS4KLQkgICAqLwotI2lmIDAKLQkgIGVsc2UKLQkgIC8qIGNoZWNrIGlmIGdjY19jb21waWxlZC4gaGFzIHNpemUgb2YgemVybyAqLwotCSAgaWYgKHN5bV92YWx1ZSA9PSBzcF92YWx1ZSAmJgotCSAgICAgIHNwICE9IHN5bWJvbFAgJiYKLQkgICAgICAoIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ApLCAiZ2NjX2NvbXBpbGVkLiIpIHx8Ci0JICAgICAgICFzdHJjbXAgKFNfR0VUX05BTUUgKHNwKSwgImdjYzJfY29tcGlsZWQuIikpKQotCSAgICBTaXplID0gc3ltX3ZhbHVlOwotI2VuZGlmCi0JfQotICAgIH0KLSAgaWYgKFNpemUgPT0gMHg3ZmZmZmZmZikKLSAgICBTaXplID0gTWF4X1NpemU7Ci0gIFNpemUgLT0gc3BfdmFsdWU7CQkvKiBhbmQgZ2V0IHRoZSBzaXplIG9mIHRoZSByb3V0aW5lICovCi0gIC8qIFJlY29yZCBTaXplLiAgKi8KLSAgTG9jYWxbMF0gPSA2OwotICAvKiBEU1QgdHlwZSBpcyAicm91dGluZSBlbmQiLiAgKi8KLSAgTG9jYWxbMV0gPSBEU1RfU19DX1JUTkVORDsKLSAgTG9jYWxbMl0gPSAwOwkJLyogdW51c2VkICovCi0gIC8qIFNpemUgb2Ygcm91dGluZS4gICovCi0gIENPUFlfTE9ORyAoJkxvY2FsWzNdLCBTaXplKTsKLSAgLyogU3RvcmUgdGhlIHJlY29yZC4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDcsIE9CSl9TX0NfVEJUKTsKLX0KLQotCi0vKiBXcml0ZSBhIFRyYWNlYmFjayBCbG9jayBCZWdpbiByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9CbG9ja19CZWdpbiAoc3ltYm9sUCwgUHNlY3QsIE5hbWUpCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIGludCBQc2VjdDsKLSAgICAgY2hhciAqTmFtZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqY3AsICpjcDE7Ci0gIGludCBPZmZzZXQ7Ci0gIGludCBTaXplOwotICBjaGFyIExvY2FsWzUxMl07Ci0KLSAgLyogU2V0IHRoZSByZWNvcmQgc2l6ZS4gICovCi0gIFNpemUgPSAxICsgMSArIDQgKyAxICsgc3RybGVuIChOYW1lKTsKLSAgTG9jYWxbMF0gPSBTaXplOwotICAvKiBEU1QgdHlwZSBpcyAiYmVnaW4gYmxvY2siOyB3ZSBzaW11bGF0ZSB3aXRoIGEgcGhvbnkgcm91dGluZS4gICovCi0gIExvY2FsWzFdID0gRFNUX1NfQ19CTEtCRUc7Ci0gIC8qIFVzZXMgQ2FsbFMvQ2FsbEcuICAqLwotICBMb2NhbFsyXSA9IDA7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHNvIGZhci4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDMsIE9CSl9TX0NfREJHKTsKLSAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgZGVidWcgcmVjb3JkLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKLSAgLyogTm93IGdldCB0aGUgc3ltYm9sIGFkZHJlc3MuICAqLwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfV1BMKTsKLSAgUFVUX1NIT1JUIChQc2VjdCk7Ci0gIC8qIEdldCB0aGUgdGV4dCBwc2VjdCBvZmZzZXQuICAqLwotICBPZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0gIFBVVF9MT05HIChPZmZzZXQpOwotICAvKiBTdG9yZSB0aGUgZGF0YSByZWZlcmVuY2UuICAqLwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVE9fUElEUik7Ci0gIC8qIFN0b3JlIHRoZSBjb3VudGVkIHN0cmluZyBhcyBkYXRhLiAgKi8KLSAgY3AgPSBMb2NhbDsKLSAgY3AxID0gTmFtZTsKLSAgU2l6ZSA9IHN0cmxlbiAoY3AxKSArIDE7Ci0gICpjcCsrID0gU2l6ZSAtIDE7Ci0gIHdoaWxlICgqY3AxKQotICAgICpjcCsrID0gKmNwMSsrOwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBTaXplLCBPQkpfU19DX0RCRyk7Ci19Ci0KLQotLyogV3JpdGUgYSBUcmFjZWJhY2sgQmxvY2sgRW5kIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX0Jsb2NrX0VuZCAoU2l6ZSkKLSAgICAgdmFsdWVUIFNpemU7Ci17Ci0gIGNoYXIgTG9jYWxbMTZdOwotCi0gIExvY2FsWzBdID0gNjsJCS8qIHJlY29yZCBsZW5ndGggKi8KLSAgLyogRFNUIHR5cGUgaXMgImJsb2NrIGVuZCI7IHNpbXVsYXRlIHdpdGggYSBwaG9ueSBlbmQgcm91dGluZS4gICovCi0gIExvY2FsWzFdID0gRFNUX1NfQ19CTEtFTkQ7Ci0gIExvY2FsWzJdID0gMDsJCS8qIHVudXNlZCwgbXVzdCBiZSB6ZXJvICovCi0gIENPUFlfTE9ORyAoJkxvY2FsWzNdLCBTaXplKTsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgNywgT0JKX1NfQ19EQkcpOwotfQotDAotCi0vKiBXcml0ZSBhIExpbmUgbnVtYmVyIDwtPiBQcm9ncmFtIENvdW50ZXIgY29ycmVsYXRpb24gcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiAoTGluZV9OdW1iZXIsIE9mZnNldCwgUHNlY3QsIERvX0RlbHRhKQotICAgICBpbnQgTGluZV9OdW1iZXI7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGludCBQc2VjdDsKLSAgICAgaW50IERvX0RlbHRhOwotewotICByZWdpc3RlciBjaGFyICpjcDsKLSAgY2hhciBMb2NhbFs2NF07Ci0KLSAgaWYgKERvX0RlbHRhID09IDApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqICBJZiBub3QgZGVsdGEsIHNldCBvdXIgUEMvTGluZSBudW1iZXIgY29ycmVsYXRpb24uCi0gICAgICAgKi8KLSAgICAgIGNwID0gJkxvY2FsWzFdOwkvKiBQdXQgc2l6ZSBpbiBMb2NhbFswXSBsYXRlci4gICovCi0gICAgICAvKiBEU1QgdHlwZSBpcyAiTGluZSBOdW1iZXIvUEMgY29ycmVsYXRpb24iLiAgKi8KLSAgICAgICpjcCsrID0gRFNUX1NfQ19MSU5FX05VTTsKLSAgICAgIC8qIFNldCBMaW5lIG51bWJlci4gICovCi0gICAgICBpZiAoTGluZV9OdW1iZXIgLSAxIDw9IDI1NSkKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfU0VUX0xJTlVNX0I7Ci0JICAqY3ArKyA9IChjaGFyKSAoTGluZV9OdW1iZXIgLSAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChMaW5lX051bWJlciAtIDEgPD0gNjU1MzUpCi0JewotCSAgKmNwKysgPSBEU1RfU19DX1NFVF9MSU5FX05VTTsKLQkgIENPUFlfU0hPUlQgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmNwKysgPSBEU1RfU19DX1NFVF9MSU5VTV9MOwotCSAgQ09QWV9MT05HIChjcCwgTGluZV9OdW1iZXIgLSAxKSwgIGNwICs9IDQ7Ci0JfQotICAgICAgLyogU2V0IFBDLiAgKi8KLSAgICAgICpjcCsrID0gRFNUX1NfQ19TRVRfQUJTX1BDOwotICAgICAgLyogU3RvcmUgc2l6ZSBub3cgdGhhdCB3ZSBrbm93IGl0LCB0aGVuIG91dHB1dCB0aGUgZGF0YS4gICovCi0gICAgICBMb2NhbFswXSA9IGNwIC0gJkxvY2FsWzFdOwotCS8qIEFjY291bnQgZm9yIHRoZSBzcGFjZSB0aGF0IFRJUl9TX0NfU1RPX1BJRFIgd2lsbCB1c2UgZm9yIHRoZSBQQy4gICovCi0JTG9jYWxbMF0gKz0gNDsJCS8qIHNpemUgaW5jbHVkZXMgbGVuZ3RoIG9mIGFub3RoZXIgbG9uZ3dvcmQgKi8KLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGNwIC0gTG9jYWwsIE9CSl9TX0NfVEJUKTsKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgZ2VuZXJhdGluZyBhIE9CSl9TX0NfVEJUIHJlY29yZC4gICovCi0gICAgICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLQlQVVRfQ0hBUiAoT0JKX1NfQ19UQlQpOwotICAgICAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3QsIE9mZnNldCwgMCk7Ci0gICAgICBQVVRfQ0hBUiAoVElSX1NfQ19TVE9fUElEUik7Ci0gICAgICAvKiBEbyBhIFBDIG9mZnNldCBvZiAwIHRvIHJlZ2lzdGVyIHRoZSBsaW5lIG51bWJlci4gICovCi0gICAgICBMb2NhbFswXSA9IDI7Ci0gICAgICBMb2NhbFsxXSA9IERTVF9TX0NfTElORV9OVU07Ci0gICAgICBMb2NhbFsyXSA9IDA7CQkvKiBJbmNyZW1lbnQgUEMgYnkgMCBhbmQgcmVnaXN0ZXIgbGluZSAjICovCi0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCAzLCBPQkpfU19DX1RCVCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKERvX0RlbHRhIDwgMCkKLQl7Ci0JICAvKgotCSAgICogIFdoZW4gZGVsdGEgaXMgbmVnYXRpdmUsIHRlcm1pbmF0ZSB0aGUgbGluZSBudW1iZXJzLgotCSAgICovCi0JICBMb2NhbFswXSA9IDEgKyAxICsgNDsKLQkgIExvY2FsWzFdID0gRFNUX1NfQ19MSU5FX05VTTsKLQkgIExvY2FsWzJdID0gRFNUX1NfQ19URVJNX0w7Ci0JICBDT1BZX0xPTkcgKCZMb2NhbFszXSwgT2Zmc2V0KTsKLQkgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDcsIE9CSl9TX0NfVEJUKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAvKgotICAgICAgICogIERvIGEgUEMvTGluZSBkZWx0YS4KLSAgICAgICAqLwotICAgICAgY3AgPSAmTG9jYWxbMV07Ci0gICAgICAqY3ArKyA9IERTVF9TX0NfTElORV9OVU07Ci0gICAgICBpZiAoTGluZV9OdW1iZXIgPiAxKQotCXsKLQkgIC8qIFdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBsaW5lIG51bWJlci4gICovCi0JICBpZiAoTGluZV9OdW1iZXIgLSAxIDw9IDI1NSkKLQkgICAgewotCSAgICAgICpjcCsrID0gRFNUX1NfQ19JTkNSX0xJTlVNOwotCSAgICAgICpjcCsrID0gTGluZV9OdW1iZXIgLSAxOwotCSAgICB9Ci0JICBlbHNlIGlmIChMaW5lX051bWJlciAtIDEgPD0gNjU1MzUpCi0JICAgIHsKLQkgICAgICAqY3ArKyA9IERTVF9TX0NfSU5DUl9MSU5VTV9XOwotCSAgICAgIENPUFlfU0hPUlQgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKmNwKysgPSBEU1RfU19DX0lOQ1JfTElOVU1fTDsKLQkgICAgICBDT1BZX0xPTkcgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gNDsKLQkgICAgfQotCX0KLSAgICAgIC8qCi0gICAgICAgKglJbmNyZW1lbnQgdGhlIFBDCi0gICAgICAgKi8KLSAgICAgIGlmIChPZmZzZXQgPD0gMTI4KQotCXsKLQkgIC8qIFNtYWxsIG9mZnNldHMgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgbnVtYmVycywgcmF0aGVyIHRoYW4gdGhlCi0JICAgICB1c3VhbCBub24tbmVnYXRpdmUgdHlwZSBjb2RlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGF0YSBmaWVsZC4gICovCi0JICAqY3ArKyA9IChjaGFyKSAtT2Zmc2V0OwotCX0KLSAgICAgIGVsc2UgaWYgKE9mZnNldCA8PSA2NTUzNSkKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfREVMVEFfUENfVzsKLQkgIENPUFlfU0hPUlQgKGNwLCBPZmZzZXQpLCAgY3AgKz0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmNwKysgPSBEU1RfU19DX0RFTFRBX1BDX0w7Ci0JICBDT1BZX0xPTkcgKGNwLCBPZmZzZXQpLCAgY3AgKz0gNDsKLQl9Ci0gICAgICAvKiBTZXQgc2l6ZSBub3cgdGhhdCBiZSBrbm93IGl0LCB0aGVuIG91dHB1dCB0aGUgZGF0YS4gICovCi0gICAgICBMb2NhbFswXSA9IGNwIC0gJkxvY2FsWzFdOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotICAgIH0KLX0KLQwKLQotLyogRGVzY3JpYmUgYSBzb3VyY2UgZmlsZSB0byB0aGUgZGVidWdnZXIuICAqLwotCi1zdGF0aWMgaW50Ci1WTVNfVEJUX1NvdXJjZV9GaWxlIChGaWxlbmFtZSwgSURfTnVtYmVyKQotICAgICBjaGFyICpGaWxlbmFtZTsKLSAgICAgaW50IElEX051bWJlcjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqY3A7Ci0gIGludCBsZW4sIHJmbywgZmZiLCBlYms7Ci0gIGNoYXIgY2R0WzhdOwotICBjaGFyIExvY2FsWzUxMl07Ci0jaWZkZWYgVk1TCQkJLyogVXNlZCBmb3IgbmF0aXZlIGFzc2VtYmx5ICovCi0gIHVuc2lnbmVkIFN0YXR1czsKLSAgc3RydWN0IEZBQiBmYWI7CQkJLyogUk1TIGZpbGUgYWNjZXNzIGJsb2NrICovCi0gIHN0cnVjdCBOQU0gbmFtOwkJCS8qIGZpbGUgbmFtZSBpbmZvcm1hdGlvbiAqLwotICBzdHJ1Y3QgWEFCREFUIHhhYmRhdDsJCQkvKiBkYXRlK3RpbWUgZmllbGRzICovCi0gIHN0cnVjdCBYQUJGSEMgeGFiZmhjOwkJCS8qIGZpbGUgaGVhZGVyIGNoYXJhY3RlcmlzdGljcyAqLwotICBjaGFyIHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyWzI1NSArIDFdOwotCi0gIC8qCi0gICAqCVNldCB1cCBSTVMgc3RydWN0dXJlczoKLSAgICovCi0gIC8qIEZBQiAtLSBmaWxlIGFjY2VzcyBibG9jayAqLwotICBtZW1zZXQgKChjaGFyICopICZmYWIsIDAsIHNpemVvZiBmYWIpOwotICBmYWIuZmFiJGJfYmlkID0gRkFCJENfQklEOwotICBmYWIuZmFiJGJfYmxuID0gKHVuc2lnbmVkIGNoYXIpIHNpemVvZiBmYWI7Ci0gIGZhYi5mYWIkbF9mbmEgPSBGaWxlbmFtZTsKLSAgZmFiLmZhYiRiX2ZucyA9ICh1bnNpZ25lZCBjaGFyKSBzdHJsZW4gKEZpbGVuYW1lKTsKLSAgZmFiLmZhYiRsX25hbSA9IChjaGFyICopICZuYW07Ci0gIGZhYi5mYWIkbF94YWIgPSAoY2hhciAqKSAmeGFiZGF0OwotICAvKiBOQU0gLS0gZmlsZSBuYW1lIGJsb2NrICovCi0gIG1lbXNldCAoKGNoYXIgKikgJm5hbSwgMCwgc2l6ZW9mIG5hbSk7Ci0gIG5hbS5uYW0kYl9iaWQgPSBOQU0kQ19CSUQ7Ci0gIG5hbS5uYW0kYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIG5hbTsKLSAgbmFtLm5hbSRsX3JzYSA9IHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyOwotICBuYW0ubmFtJGJfcnNzID0gKHVuc2lnbmVkIGNoYXIpIChzaXplb2YgcmVzdWx0YW50X3N0cmluZ19idWZmZXIgLSAxKTsKLSAgLyogWEFCcyAtLSBleHRlbmRlZCBhdHRyaWJ1dGVzIGJsb2NrcyAqLwotICBtZW1zZXQgKChjaGFyICopICZ4YWJkYXQsIDAsIHNpemVvZiB4YWJkYXQpOwotICB4YWJkYXQueGFiJGJfY29kID0gWEFCJENfREFUOwotICB4YWJkYXQueGFiJGJfYmxuID0gKHVuc2lnbmVkIGNoYXIpIHNpemVvZiB4YWJkYXQ7Ci0gIHhhYmRhdC54YWIkbF9ueHQgPSAoY2hhciAqKSAmeGFiZmhjOwotICBtZW1zZXQgKChjaGFyICopICZ4YWJmaGMsIDAsIHNpemVvZiB4YWJmaGMpOwotICB4YWJmaGMueGFiJGJfY29kID0gWEFCJENfRkhDOwotICB4YWJmaGMueGFiJGJfYmxuID0gKHVuc2lnbmVkIGNoYXIpIHNpemVvZiB4YWJmaGM7Ci0gIHhhYmZoYy54YWIkbF9ueHQgPSAwOwotICAvKgotICAgKglHZXQgdGhlIGZpbGUgaW5mb3JtYXRpb24KLSAgICovCi0gIFN0YXR1cyA9IHN5cyRvcGVuICgmZmFiKTsKLSAgaWYgKCEoU3RhdHVzICYgMSkpCi0gICAgewotICAgICAgYXNfdHNrdHNrIChfKCJDb3VsZG4ndCBmaW5kIHNvdXJjZSBmaWxlIFwiJXNcIiwgc3RhdHVzPSUlWCV4IiksCi0JCSBGaWxlbmFtZSwgU3RhdHVzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgc3lzJGNsb3NlICgmZmFiKTsKLSAgLyogTm93IGV4dHJhY3QgZmllbGRzIG9mIGludGVyZXN0LiAgKi8KLSAgbWVtY3B5IChjZHQsIChjaGFyICopICZ4YWJkYXQueGFiJHFfY2R0LCA4KTsJLyogY3JlYXRpb24gZGF0ZSAqLwotICBlYmsgPSB4YWJmaGMueGFiJGxfZWJrOwkJLyogZW5kLW9mLWZpbGUgYmxvY2sgKi8KLSAgZmZiID0geGFiZmhjLnhhYiR3X2ZmYjsJCS8qIGZpcnN0IGZyZWUgYnl0ZSBvZiBsYXN0IGJsb2NrICovCi0gIHJmbyA9IHhhYmZoYy54YWIkYl9yZm87CQkvKiByZWNvcmQgZm9ybWF0ICovCi0gIGxlbiA9IG5hbS5uYW0kYl9yc2w7CQkJLyogbGVuZ3RoIG9mIEZpbGVuYW1lICovCi0gIHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyW2xlbl0gPSAnXDAnOwotICBGaWxlbmFtZSA9IHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyOwkvKiBmdWxsIGZpbGVuYW1lICovCi0jZWxzZQkJCQkvKiBDcm9zcy1hc3NlbWJseSAqLwotICAvKiBbUGVyaGFwcyB3ZSBvdWdodCB0byB1c2UgYWN0dWFsIHZhbHVlcyBkZXJpdmVkIGZyb20gc3RhdCgpIGhlcmU/XSAgKi8KLSAgbWVtc2V0IChjZHQsIDAsIDgpOwkJCS8qIG51bGwgVk1TIHF1YWR3b3JkIGJpbmFyeSB0aW1lICovCi0gIGViayA9IGZmYiA9IHJmbyA9IDA7Ci0gIGxlbiA9IHN0cmxlbiAoRmlsZW5hbWUpOwotICBpZiAobGVuID4gMjU1KQkvKiBhIHNpbmdsZSBieXRlIGlzIHVzZWQgYXMgY291bnQgcHJlZml4ICovCi0gICAgewotICAgICAgRmlsZW5hbWUgKz0gKGxlbiAtIDI1NSk7CQkvKiB0YWlsIGVuZCBpcyBtb3JlIHNpZ25pZmljYW50ICovCi0gICAgICBsZW4gPSAyNTU7Ci0gICAgfQotI2VuZGlmIC8qIFZNUyAqLwotCi0gIGNwID0gJkxvY2FsWzFdOwkJCS8qIGZpbGwgaW4gcmVjb3JkIGxlbmd0aCBsYXRlciAqLwotICAqY3ArKyA9IERTVF9TX0NfU09VUkNFOwkJLyogRFNUIHR5cGUgaXMgInNvdXJjZSBmaWxlIiAqLwotICAqY3ArKyA9IERTVF9TX0NfU1JDX0ZPUk1GRUVEOwkJLyogZm9ybWZlZWRzIGNvdW50IGFzIHNvdXJjZSByZWNvcmRzICovCi0gICpjcCsrID0gRFNUX1NfQ19TUkNfREVDTEZJTEU7CQkvKiBkZWNsYXJlIHNvdXJjZSBmaWxlICovCi0gIGtub3cgKGNwID09ICZMb2NhbFs0XSk7Ci0gICpjcCsrID0gMDsJCQkJLyogZmlsbCBpbiB0aGlzIGxlbmd0aCBiZWxvdyAqLwotICAqY3ArKyA9IDA7CQkJCS8qIGZsYWdzOyBtdXN0IGJlIHplcm8gKi8KLSAgQ09QWV9TSE9SVCAoY3AsIElEX051bWJlciksICBjcCArPSAyOwkvKiBmaWxlIElEIG51bWJlciAqLwotICBtZW1jcHkgKGNwLCBjZHQsIDgpLCAgY3AgKz0gODsJLyogY3JlYXRpb24gZGF0ZSt0aW1lICovCi0gIENPUFlfTE9ORyAoY3AsIGViayksICBjcCArPSA0OwkvKiBlbmQtb2YtZmlsZSBibG9jayAqLwotICBDT1BZX1NIT1JUIChjcCwgZmZiKSwgIGNwICs9IDI7CS8qIGZpcnN0IGZyZWUgYnl0ZSBvZiBsYXN0IGJsb2NrICovCi0gICpjcCsrID0gKGNoYXIpIHJmbzsJCQkvKiBSTVMgcmVjb3JkIGZvcm1hdCAqLwotICAvKiBGaWxlbmFtZS4gICovCi0gICpjcCsrID0gKGNoYXIpIGxlbjsKLSAgd2hpbGUgKC0tbGVuID49IDApCi0gICAgKmNwKysgPSAqRmlsZW5hbWUrKzsKLSAgLyogTGlicmFyeSBtb2R1bGUgbmFtZSAobm9uZSkuICAqLwotICAqY3ArKyA9IDA7Ci0gIC8qIE5vdyB0aGF0IHNpemUgaXMga25vd24sIGZpbGwgaXQgaW4gYW5kIHdyaXRlIG91dCB0aGUgcmVjb3JkLiAgKi8KLSAgTG9jYWxbNF0gPSBjcCAtICZMb2NhbFs1XTsJCS8qIHNvdXJjZSBmaWxlIGRlY2xhcmF0aW9uIHNpemUgKi8gCi0gIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07CQkvKiBUQlQgcmVjb3JkIHNpemUgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotICByZXR1cm4gMTsKLX0KLQotCi0vKiBUcmFjZWJhY2sgaW5mb3JtYXRpb24gaXMgZGVzY3JpYmVkIGluIHRlcm1zIG9mIGxpbmVzIGZyb20gY29tcGlsZXIKLSAgIGxpc3RpbmcgZmlsZXMsIG5vdCBsaW5lcyBmcm9tIHNvdXJjZSBmaWxlcy4gIFdlIG5lZWQgdG8gc2V0IHVwIHRoZQotICAgY29ycmVsYXRpb24gYmV0d2VlbiBsaXN0aW5nIGxpbmUgbnVtYmVycyBhbmQgc291cmNlIGxpbmUgbnVtYmVycy4KLSAgIFNpbmNlIGdjYydzIC5zdGFibiBkaXJlY3RpdmVzIHJlZmVyIHRvIHRoZSBzb3VyY2UgbGluZXMsIHdlIGp1c3QKLSAgIG5lZWQgdG8gZGVzY3JpYmUgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfU291cmNlX0xpbmVzIChJRF9OdW1iZXIsIFN0YXJ0aW5nX0xpbmVfTnVtYmVyLCBOdW1iZXJfT2ZfTGluZXMpCi0gICAgIGludCBJRF9OdW1iZXI7Ci0gICAgIGludCBTdGFydGluZ19MaW5lX051bWJlcjsKLSAgICAgaW50IE51bWJlcl9PZl9MaW5lczsKLXsKLSAgY2hhciAqY3A7Ci0gIGludCBjaHVua19saW1pdDsKLSAgY2hhciBMb2NhbFsxMjhdOwkvKiByb29tIGVub3VnaCB0byBkZXNjcmliZSAxMzEwNzAwIGxpbmVzLi4uICovCi0KLSAgY3AgPSAmTG9jYWxbMV07CS8qIFB1dCBzaXplIGluIExvY2FsWzBdIGxhdGVyLiAgKi8KLSAgKmNwKysgPSBEU1RfU19DX1NPVVJDRTsJCS8qIERTVCB0eXBlIGlzICJzb3VyY2UgZmlsZSIuICAqLwotICAqY3ArKyA9IERTVF9TX0NfU1JDX1NFVEZJTEU7CQkvKiBTZXQgU291cmNlIEZpbGUuICAqLwotICBDT1BZX1NIT1JUIChjcCwgSURfTnVtYmVyKSwgIGNwICs9IDI7CS8qIEZpbGUgSUQgTnVtYmVyLiAgKi8KLSAgLyogU2V0IHJlY29yZCBudW1iZXIgYW5kIGRlZmluZSBsaW5lcy4gIFNpbmNlIG5vIGxvbmd3b3JkIGZvcm0gb2YKLSAgICAgU1JDX0RFRkxJTkVTIGlzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGNvcGUgd2l0aCBhbnkgaHVnZQotICAgICBmaWxlcyBhIGNodW5rIGF0IGEgdGltZS4gIEl0IGRvZXNuJ3QgbWF0dGVyIGZvciB0cmFjZWJhY2tzLCBzaW5jZQotICAgICB1bnNwZWNpZmllZCBsaW5lcyBhcmUgbWFwcGVkIG9uZS10by1vbmUgYW5kIHdvcmsgb3V0IHJpZ2h0LCBidXQgaXQKLSAgICAgZG9lcyBtYXR0ZXIgd2l0aGluIHRoZSBkZWJ1Z2dlci4gIFdpdGhvdXQgdGhpcyBleHBsaWNpdCBtYXBwaW5nLAotICAgICBpdCB3aWxsIGNvbXBsYWluIGFib3V0IGxpbmVzIG5vdCBleGlzdGluZyBpbiB0aGUgbW9kdWxlLiAgKi8KLSAgY2h1bmtfbGltaXQgPSAoc2l6ZW9mIExvY2FsIC0gNSkgLyA2OwotICBpZiAoTnVtYmVyX09mX0xpbmVzID4gNjU1MzUgKiBjaHVua19saW1pdCkJLyogYXZvaWQgYnVmZmVyIG92ZXJmbG93ICovCi0gICAgTnVtYmVyX09mX0xpbmVzID0gNjU1MzUgKiBjaHVua19saW1pdDsKLSAgd2hpbGUgKE51bWJlcl9PZl9MaW5lcyA+IDY1NTM1KQotICAgIHsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19TUkNfU0VUUkVDX0w7Ci0gICAgICBDT1BZX0xPTkcgKGNwLCBTdGFydGluZ19MaW5lX051bWJlciksICBjcCArPSA0OwotICAgICAgKmNwKysgPSBEU1RfU19DX1NSQ19ERUZMSU5FU19XOwotICAgICAgQ09QWV9TSE9SVCAoY3AsIDY1NTM1KSwgIGNwICs9IDI7Ci0gICAgICBTdGFydGluZ19MaW5lX051bWJlciArPSA2NTUzNTsKLSAgICAgIE51bWJlcl9PZl9MaW5lcyAtPSA2NTUzNTsKLSAgICB9Ci0gIC8qIFNldCByZWNvcmQgbnVtYmVyIGFuZCBkZWZpbmUgbGluZXMsIG5vcm1hbCBjYXNlLiAgKi8KLSAgaWYgKFN0YXJ0aW5nX0xpbmVfTnVtYmVyIDw9IDY1NTM1KQotICAgIHsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19TUkNfU0VUUkVDX1c7Ci0gICAgICBDT1BZX1NIT1JUIChjcCwgU3RhcnRpbmdfTGluZV9OdW1iZXIpLCAgY3AgKz0gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqY3ArKyA9IERTVF9TX0NfU1JDX1NFVFJFQ19MOwotICAgICAgQ09QWV9MT05HIChjcCwgU3RhcnRpbmdfTGluZV9OdW1iZXIpLCAgY3AgKz0gNDsKLSAgICB9Ci0gICpjcCsrID0gRFNUX1NfQ19TUkNfREVGTElORVNfVzsKLSAgQ09QWV9TSE9SVCAoY3AsIE51bWJlcl9PZl9MaW5lcyksICBjcCArPSAyOwotICAvKiBTZXQgc2l6ZSBub3cgdGhhdCBiZSBrbm93IGl0LCB0aGVuIG91dHB1dCB0aGUgZGF0YS4gICovCi0gIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGNwIC0gTG9jYWwsIE9CSl9TX0NfVEJUKTsKLX0KLQwKLQotIC8qKioqKiogRGVidWdnZXIgSW5mb3JtYXRpb24gc3VwcG9ydCByb3V0aW5lcyAqKioqKiovCi0KLQotLyogVGhpcyByb3V0aW5lIGxvY2F0ZXMgYSBmaWxlIGluIHRoZSBsaXN0IG9mIGZpbGVzLiAgSWYgYW4gZW50cnkgZG9lcwotICAgbm90IGV4aXN0LCBvbmUgaXMgY3JlYXRlZC4gIEZvciBpbmNsdWRlIGZpbGVzLCBhIG5ldyBlbnRyeSBpcyBhbHdheXMKLSAgIGNyZWF0ZWQgc3VjaCB0aGF0IGlubGluZSBmdW5jdGlvbnMgY2FuIGJlIHByb3Blcmx5IGRlYnVnZ2VkLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpbnB1dF9maWxlICoKLWZpbmRfZmlsZSAoc3ApCi0gICAgIHN5bWJvbFMgKnNwOwotewotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqc2FtZV9maWxlID0gMDsKLSAgc3RydWN0IGlucHV0X2ZpbGUgKmZwbnQsICpsYXN0ID0gMDsKLSAgY2hhciAqc3BfbmFtZTsKLQotICBmb3IgKGZwbnQgPSBmaWxlX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmcG50LT5zcG50ID09IHNwKQotCXJldHVybiBmcG50OwotICAgICAgbGFzdCA9IGZwbnQ7Ci0gICAgfQotICBzcF9uYW1lID0gU19HRVRfTkFNRSAoc3ApOwotICBmb3IgKGZwbnQgPSBmaWxlX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHNwX25hbWUsIGZwbnQtPm5hbWUpID09IDApCi0JewotCSAgaWYgKGZwbnQtPmZsYWcgPT0gMSkKLQkgICAgcmV0dXJuIGZwbnQ7Ci0JICBzYW1lX2ZpbGUgPSBmcG50OwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZnBudCA9IChzdHJ1Y3QgaW5wdXRfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBpbnB1dF9maWxlKSk7Ci0gIGlmICghZmlsZV9yb290KQotICAgIGZpbGVfcm9vdCA9IGZwbnQ7Ci0gIGVsc2UKLSAgICBsYXN0LT5uZXh0ID0gZnBudDsKLSAgZnBudC0+bmV4dCA9IDA7Ci0gIGZwbnQtPm5hbWUgPSBzcF9uYW1lOwotICBmcG50LT5taW5fbGluZSA9IDB4N2ZmZmZmZmY7Ci0gIGZwbnQtPm1heF9saW5lID0gMDsKLSAgZnBudC0+b2Zmc2V0ID0gMDsKLSAgZnBudC0+ZmxhZyA9IDA7Ci0gIGZwbnQtPmZpbGVfbnVtYmVyID0gMDsKLSAgZnBudC0+c3BudCA9IHNwOwotICBmcG50LT5zYW1lX2ZpbGVfZnBudCA9IHNhbWVfZmlsZTsKLSAgcmV0dXJuIGZwbnQ7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGNvbnZlcnRzIGEgbnVtYmVyIHN0cmluZyBpbnRvIGFuIGludGVnZXIsIGFuZCBzdG9wcyB3aGVuCi0gICBpdCBzZWVzIGFuIGludmFsaWQgY2hhcmFjdGVyLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIGNoYXJhY3RlciBqdXN0IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHJlYWQuICBObyBlcnJvciBpcyBnZW5lcmF0ZWQuICAqLwotCi1zdGF0aWMgY2hhciAqCi1jdnRfaW50ZWdlciAoc3RyLCBydG4pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgaW50ICpydG47Ci17Ci0gIGludCBpdmFsID0gMCwgc2duID0gMTsKLQotICBpZiAoKnN0ciA9PSAnLScpCi0gICAgc2duID0gLTEsICArK3N0cjsKLSAgd2hpbGUgKCpzdHIgPj0gJzAnICYmICpzdHIgPD0gJzknKQotICAgIGl2YWwgPSAxMCAqIGl2YWwgKyAqc3RyKysgLSAnMCc7Ci0gICpydG4gPSBzZ24gKiBpdmFsOwotICByZXR1cm4gc3RyOwotfQotDAotCi0vKgotICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIGFyZSB1c2VkIHRvIGdlbmVyYXRlIG9iamVjdAotICogcmVjb3JkcyB0aGF0IHdpbGwgZGVzY3JpYmUgcHJvZ3JhbSB2YXJpYWJsZXMgdG8gdGhlIFZNUyBkZWJ1Z2dlci4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbWFueSBvZiB0aGUgcm91dGluZXMgbmVlZGVkIHRvIG91dHB1dCBkZWJ1Z2dpbmcgaW5mbwotICogaW50byB0aGUgb2JqZWN0IGZpbGUgdGhhdCB0aGUgVk1TIGRlYnVnZ2VyIG5lZWRzIHRvIHVuZGVyc3RhbmQgc3ltYm9scy4KLSAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgdmVyeSBsYXRlIGluIHRoZSBhc3NlbWJseSBwcm9jZXNzLCBhbmQgdGh1cwotICogd2UgY2FuIGJlIGZhaXJseSBsYXggYWJvdXQgY2hhbmdpbmcgdGhpbmdzLCBzaW5jZSB0aGUgR1NEIGFuZCB0aGUgVElSCi0gKiBzZWN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBvdXRwdXQuCi0gKi8KLQotCi0vKiBUaGlzIHJvdXRpbmUgZml4ZXMgdGhlIG5hbWVzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBDKyssICIudGhpcyIgaXMgYSBnb29kCi0gICBleGFtcGxlLiAgVGhlIHBlcmlvZCBkb2VzIG5vdCB3b3JrIGZvciB0aGUgZGVidWdnZXIsIHNpbmNlIGl0IGxvb2tzIGxpa2UKLSAgIHRoZSBzeW50YXggZm9yIGEgc3RydWN0dXJlIGVsZW1lbnQsIGFuZCB0aHVzIGl0IGdldHMgbWlnaHRpbHkgY29uZnVzZWQuCi0KLSAgIFdlIGFsc28gdXNlIHRoaXMgdG8gc3RyaXAgdGhlIFBzZWN0QXR0cmlidXRlIGhhY2sgZnJvbSB0aGUgbmFtZSBiZWZvcmUgd2UKLSAgIHdyaXRlIGEgZGVidWdnZXIgcmVjb3JkLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZml4X25hbWUgKHBudCkKLSAgICAgY2hhciAqcG50OwotewotICBjaGFyICpwbnQxOwotCi0gIC8qIEtpbGwgYW55IGxlYWRpbmcgIl8iLiAgKi8KLSAgaWYgKCpwbnQgPT0gJ18nKQotICAgIHBudCsrOwotCi0gIC8qIElzIHRoZXJlIGEgUHNlY3QgQXR0cmlidXRlIHRvIHNraXA/PyAgKi8KLSAgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChwbnQpKQotICAgIHsKLSAgICAgIC8qIFllczogU2tpcCBpdC4gICovCi0gICAgICBwbnQgKz0gUFNFQ1RfQVRUUklCVVRFU19TVFJJTkdfTEVOR1RIOwotICAgICAgd2hpbGUgKCpwbnQpCi0JewotCSAgaWYgKChwbnRbMF0gPT0gJyQnKSAmJiAocG50WzFdID09ICckJykpCi0JICAgIHsKLQkgICAgICBwbnQgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgcG50Kys7Ci0JfQotICAgIH0KLQotICAvKiBIZXJlIHdlIGZpeCB0aGUgLnRoaXMgLT4gJHRoaXMgY29udmVyc2lvbi4gICovCi0gIGZvciAocG50MSA9IHBudDsgKnBudDEgIT0gMDsgcG50MSsrKQotICAgIGlmICgqcG50MSA9PSAnLicpCi0gICAgICAqcG50MSA9ICckJzsKLQotICByZXR1cm4gcG50OwotfQotCi0KLS8qIFdoZW4gZGVmaW5pbmcgYSBzdHJ1Y3R1cmUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZmluZCB0aGUgbmFtZSBvZgotICAgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUuICBJdCBpcyBhc3N1bWVkIHRoYXQgc3RyIHBvaW50cyB0byB0aGUgZXF1YWwgc2lnbgotICAgaW4gdGhlIGRlZmluaXRpb24sIGFuZCBpdCBtb3ZlcyBiYWNrd2FyZCB1bnRpbCBpdCBmaW5kcyB0aGUgc3RhcnQgb2YgdGhlCi0gICBuYW1lLiAgSWYgaXQgZmluZHMgYSAwLCB0aGVuIGl0IGtub3dzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgZGVmIGlzIGluIHRoZQotICAgb3V0ZXJtb3N0IGxldmVsLCBhbmQgdGh1cyBzeW1ib2xfbmFtZSBwb2ludHMgdG8gdGhlIHN5bWJvbCBuYW1lLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X3N0cnVjdF9uYW1lIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqcG50OwotICBwbnQgPSBzdHI7Ci0gIHdoaWxlICgoKnBudCAhPSAnOicpICYmICgqcG50ICE9ICdcMCcpKQotICAgIHBudC0tOwotICBpZiAoKnBudCA9PSAnXDAnKQotICAgIHJldHVybiAoY2hhciAqKSBzeW1ib2xfbmFtZTsKLSAgKnBudC0tID0gJ1wwJzsKLSAgd2hpbGUgKCgqcG50ICE9ICc7JykgJiYgKCpwbnQgIT0gJz0nKSkKLSAgICBwbnQtLTsKLSAgaWYgKCpwbnQgPT0gJzsnKQotICAgIHJldHVybiBwbnQgKyAxOwotICB3aGlsZSAoKCpwbnQgPCAnMCcpIHx8ICgqcG50ID4gJzknKSkKLSAgICBwbnQrKzsKLSAgd2hpbGUgKCgqcG50ID49ICcwJykgJiYgKCpwbnQgPD0gJzknKSkKLSAgICBwbnQrKzsKLSAgcmV0dXJuIHBudDsKLX0KLQotCi0vKiBTZWFyY2ggc3ltYm9sIGxpc3QgZm9yIHR5cGUgbnVtYmVyIGRieF90eXBlLgotICAgUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgc3RydWN0IFZNU19EQkdfU3ltYm9sICoKLWZpbmRfc3ltYm9sIChkYnhfdHlwZSkKLSAgICAgaW50IGRieF90eXBlOwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0KLSAgc3BudCA9IFZNU19TeW1ib2xfdHlwZV9saXN0W1NZTVRZUF9IQVNIIChkYnhfdHlwZSldOwotICB3aGlsZSAoc3BudCkKLSAgICB7Ci0gICAgICBpZiAoc3BudC0+ZGJ4X3R5cGUgPT0gZGJ4X3R5cGUpCi0JYnJlYWs7Ci0gICAgICBzcG50ID0gc3BudC0+bmV4dDsKLSAgICB9Ci0gIGlmICghc3BudCB8fCBzcG50LT5hZHZhbmNlZCAhPSBBTElBUykKLSAgICByZXR1cm4gc3BudDsKLSAgcmV0dXJuIGZpbmRfc3ltYm9sIChzcG50LT50eXBlMik7Ci19Ci0KLQotI2lmIDAJCS8qIG9ic29sZXRlICovCi0vKiB0aGlzIHJvdXRpbmUgcHV0cyBpbmZvIGludG8gZWl0aGVyIExvY2FsIG9yIEFzdWZmaXgsIGRlcGVuZGluZyBvbiB0aGUgc2lnbgotICogb2Ygc2l6ZS4gIFRoZSByZWFzb24gaXMgdGhhdCBpdCBpcyBlYXNpZXIgdG8gYnVpbGQgdGhlIHZhcmlhYmxlIGRlc2NyaXB0b3IKLSAqIGJhY2t3YXJkcywgd2hpbGUgdGhlIGFycmF5IGRlc2NyaXB0b3IgaXMgYmVzdCBidWlsdCBmb3J3YXJkcy4gIEluIHRoZSBlbmQKLSAqIHRoZXkgZ2V0IHB1dCB0b2dldGhlciwgaWYgdGhlcmUgaXMgbm90IGEgc3RydWN0L3VuaW9uL2VudW0gYWxvbmcgdGhlIHdheQotICovCi1zdGF0aWMgdm9pZAotcHVzaCAodmFsdWUsIHNpemUxKQotICAgICBpbnQgdmFsdWUsIHNpemUxOwotewotICBpZiAoc2l6ZTEgPCAwKQotICAgIHsKLSAgICAgIHNpemUxID0gLXNpemUxOwotICAgICAgaWYgKExwbnQgPCBzaXplMSkKLQl7Ci0JICBvdmVyZmxvdyA9IDE7Ci0JICBMcG50ID0gMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBMcG50IC09IHNpemUxOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgmTG9jYWxbTHBudCArIDFdLCB2YWx1ZSwgc2l6ZTEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChBcG9pbnQgKyBzaXplMSA+PSBNQVhfREVCVUdfUkVDT1JEKQotCXsKLQkgIG92ZXJmbG93ID0gMTsKLQkgIEFwb2ludCA9IE1BWF9ERUJVR19SRUNPUkQgLSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoJkFzdWZmaXhbQXBvaW50XSwgdmFsdWUsIHNpemUxKTsKLSAgICAgIEFwb2ludCArPSBzaXplMTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZAotZnB1c2ggKHZhbHVlLCBzaXplKQotICAgICBpbnQgdmFsdWUsIHNpemU7Ci17Ci0gIGlmIChBcG9pbnQgKyBzaXplID49IE1BWF9ERUJVR19SRUNPUkQpCi0gICAgewotICAgICAgb3ZlcmZsb3cgPSAxOwotICAgICAgQXBvaW50ID0gTUFYX0RFQlVHX1JFQ09SRCAtIDE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc2l6ZSA9PSAxKQotICAgIEFzdWZmaXhbQXBvaW50KytdID0gKGNoYXIpIHZhbHVlOwotICBlbHNlCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgmQXN1ZmZpeFtBcG9pbnRdLCB2YWx1ZSwgc2l6ZSk7Ci0gICAgICBBcG9pbnQgKz0gc2l6ZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1ycHVzaCAodmFsdWUsIHNpemUpCi0gICAgIGludCB2YWx1ZSwgc2l6ZTsKLXsKLSAgaWYgKExwbnQgPCBzaXplKQotICAgIHsKLSAgICAgIG92ZXJmbG93ID0gMTsKLSAgICAgIExwbnQgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHNpemUgPT0gMSkKLSAgICAgIExvY2FsW0xwbnQtLV0gPSAoY2hhcikgdmFsdWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBMcG50IC09IHNpemU7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCZMb2NhbFtMcG50ICsgMV0sIHZhbHVlLCBzaXplKTsKLSAgICB9Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyB0aGUgYXJyYXkgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBhcnJheS4gICovCi0KLXN0YXRpYyB2b2lkCi1hcnJheV9zdWZmaXggKHNwbnQyKQotICAgICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQyOwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDE7Ci0gIGludCByYW5rOwotICBpbnQgdG90YWxfc2l6ZTsKLQotICByYW5rID0gMDsKLSAgc3BudCA9IHNwbnQyOwotICB3aGlsZSAoc3BudC0+YWR2YW5jZWQgIT0gQVJSQVkpCi0gICAgewotICAgICAgc3BudCA9IGZpbmRfc3ltYm9sIChzcG50LT50eXBlMik7Ci0gICAgICBpZiAoIXNwbnQpCi0JcmV0dXJuOwotICAgIH0KLSAgc3BudDEgPSBzcG50OwotICB0b3RhbF9zaXplID0gMTsKLSAgd2hpbGUgKHNwbnQxLT5hZHZhbmNlZCA9PSBBUlJBWSkKLSAgICB7Ci0gICAgICByYW5rKys7Ci0gICAgICB0b3RhbF9zaXplICo9IChzcG50MS0+aW5kZXhfbWF4IC0gc3BudDEtPmluZGV4X21pbiArIDEpOwotICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudDEtPnR5cGUyKTsKLSAgICB9Ci0gIHRvdGFsX3NpemUgPSB0b3RhbF9zaXplICogc3BudDEtPmRhdGFfc2l6ZTsKLSAgZnB1c2ggKHNwbnQxLT5kYXRhX3NpemUsIDIpOwkvKiBlbGVtZW50IHNpemUgKi8KLSAgaWYgKHNwbnQxLT5WTVNfdHlwZSA9PSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUpCi0gICAgZnB1c2ggKDAsIDEpOwotICBlbHNlCi0gICAgZnB1c2ggKHNwbnQxLT5WTVNfdHlwZSwgMSk7CS8qIGVsZW1lbnQgdHlwZSAqLwotICBmcHVzaCAoRFNDX0tfQ0xBU1NfQSwgMSk7CS8qIGRlc2NyaXB0b3IgY2xhc3MgKi8KLSAgZnB1c2ggKDAsIDQpOwkJCS8qIGJhc2UgYWRkcmVzcyAqLwotICBmcHVzaCAoMCwgMSk7CQkJLyogc2NhbGUgZmFjdG9yIC0tIG5vdCBhcHBsaWNhYmxlICovCi0gIGZwdXNoICgwLCAxKTsJCQkvKiBkaWdpdCBjb3VudCAtLSBub3QgYXBwbGljYWJsZSAqLwotICBmcHVzaCAoMHhjMCwgMSk7CQkvKiBmbGFnczogbXVsdGlwbGllciBibG9jayAmIGJvdW5kcyBwcmVzZW50ICovCi0gIGZwdXNoIChyYW5rLCAxKTsJCS8qIG51bWJlciBvZiBkaW1lbnNpb25zICovCi0gIGZwdXNoICh0b3RhbF9zaXplLCA0KTsKLSAgZnB1c2ggKDAsIDQpOwkJCS8qIHBvaW50ZXIgdG8gZWxlbWVudCBbMF1bMF0uLi5bMF0gKi8KLSAgc3BudDEgPSBzcG50OwotICB3aGlsZSAoc3BudDEtPmFkdmFuY2VkID09IEFSUkFZKQotICAgIHsKLSAgICAgIGZwdXNoIChzcG50MS0+aW5kZXhfbWF4IC0gc3BudDEtPmluZGV4X21pbiArIDEsIDQpOwotICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudDEtPnR5cGUyKTsKLSAgICB9Ci0gIHNwbnQxID0gc3BudDsKLSAgd2hpbGUgKHNwbnQxLT5hZHZhbmNlZCA9PSBBUlJBWSkKLSAgICB7Ci0gICAgICBmcHVzaCAoc3BudDEtPmluZGV4X21pbiwgNCk7Ci0gICAgICBmcHVzaCAoc3BudDEtPmluZGV4X21heCwgNCk7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotICAgIH0KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIHRoZSBzdGFydCBvZiBhIHZhcmlhYmxlIGRlc2NyaXB0b3IgYmFzZWQgdXBvbgotICAgYSBzdHJ1Y3QvdW5pb24vZW51bSB0aGF0IGhhcyB5ZXQgdG8gYmUgZGVmaW5lZC4gIFdlIGRlZmluZSB0aGlzIHNwb3QgYXMKLSAgIGEgbmV3IGxvY2F0aW9uLCBhbmQgc2F2ZSBmb3VyIGJ5dGVzIGZvciB0aGUgYWRkcmVzcy4gIFdoZW4gdGhlIHN0cnVjdCBpcwotICAgZmluYWxseSBkZWZpbmVkLCB0aGVuIHdlIGNhbiBnbyBiYWNrIGFuZCBwbHVnIGluIHRoZSBjb3JyZWN0IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgdm9pZAotbmV3X2ZvcndhcmRfcmVmIChkYnhfdHlwZSkKLSAgICAgaW50IGRieF90eXBlOwotewotICBzdHJ1Y3QgZm9yd2FyZF9yZWYgKmZwbnQ7Ci0gIGZwbnQgPSAoc3RydWN0IGZvcndhcmRfcmVmICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZvcndhcmRfcmVmKSk7Ci0gIGZwbnQtPm5leHQgPSBmX3JlZl9yb290OwotICBmX3JlZl9yb290ID0gZnBudDsKLSAgZnBudC0+ZGJ4X3R5cGUgPSBkYnhfdHlwZTsKLSAgZnBudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICBmcG50LT5yZXNvbHZlZCA9ICdOJzsKLSAgcnB1c2ggKERTVF9LX1RTX0lORCwgMSk7CS8qIGluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICB0b3RhbF9sZW4gPSA1OwotICBycHVzaCAodG90YWxfbGVuLCAyKTsKLSAgc3RydWN0X251bWJlciA9IC1mcG50LT5zdHJ1Y19udW1iOwotfQotCi0KLS8qIFRoaXMgcm91dGluZSBnZW5lcmF0ZXMgdGhlIHZhcmlhYmxlIGRlc2NyaXB0b3IgdXNlZCB0byBkZXNjcmliZSBub24tYmFzaWMKLSAgIHZhcmlhYmxlcy4gIEl0IGNhbGxzIGl0c2VsZiByZWN1cnNpdmVseSB1bnRpbCBpdCBnZXRzIHRvIHRoZSBib3R0b20gb2YgaXQKLSAgIGFsbCwgYW5kIHRoZW4gYnVpbGRzIHRoZSBkZXNjcmlwdG9yIGJhY2t3YXJkcy4gIEl0IGlzIGVhc2llc3QgdG8gZG8gaXQKLSAgIHRoaXMgd2F5IHNpbmNlIHdlIG11c3QgcGVyaW9kaWNhbGx5IHdyaXRlIGxlbmd0aCBieXRlcywgYW5kIGl0IGlzIGVhc2llc3QKLSAgIGlmIHdlIGtub3cgdGhlIHZhbHVlIHdoZW4gaXQgaXMgdGltZSB0byB3cml0ZSBpdC4gICovCi0KLXN0YXRpYyBpbnQKLWdlbjEgKHNwbnQsIGFycmF5X3N1ZmZpeF9sZW4pCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgICAgaW50IGFycmF5X3N1ZmZpeF9sZW47Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDE7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAoc3BudC0+YWR2YW5jZWQpCi0gICAgewotICAgIGNhc2UgVk9JRDoKLSAgICAgIHJwdXNoIChEQkdfU19DX1ZPSUQsIDEpOwotICAgICAgdG90YWxfbGVuICs9IDE7Ci0gICAgICBycHVzaCAodG90YWxfbGVuLCAyKTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgQkFTSUM6Ci0gICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGlmIChhcnJheV9zdWZmaXhfbGVuID09IDApCi0JewotCSAgcnB1c2ggKHNwbnQtPlZNU190eXBlLCAxKTsKLQkgIHJwdXNoIChEQkdfU19DX0JBU0lDLCAxKTsKLQkgIHRvdGFsX2xlbiA9IDI7Ci0JICBycHVzaCAodG90YWxfbGVuLCAyKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIHJwdXNoICgwLCA0KTsKLSAgICAgIHJwdXNoIChEU1RfS19WRkxBR1NfRFNDLCAxKTsKLSAgICAgIHJwdXNoIChEU1RfS19UU19EU0MsIDEpOwkvKiBkZXNjcmlwdG9yIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICAgICAgdG90YWxfbGVuID0gLTI7Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIFNUUlVDVDoKLSAgICBjYXNlIFVOSU9OOgotICAgIGNhc2UgRU5VTToKLSAgICAgIHN0cnVjdF9udW1iZXIgPSBzcG50LT5zdHJ1Y19udW1iOwotICAgICAgaWYgKHN0cnVjdF9udW1iZXIgPCAwKQotCXsKLQkgIG5ld19mb3J3YXJkX3JlZiAoc3BudC0+ZGJ4X3R5cGUpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgcnB1c2ggKERCR19TX0NfU1RSVUNULCAxKTsKLSAgICAgIHRvdGFsX2xlbiA9IDU7Ci0gICAgICBycHVzaCAodG90YWxfbGVuLCAyKTsKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgUE9JTlRFUjoKLSAgICAgIHNwbnQxID0gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLSAgICAgIGkgPSAxOwotICAgICAgaWYgKCFzcG50MSkKLQluZXdfZm9yd2FyZF9yZWYgKHNwbnQtPnR5cGUyKTsKLSAgICAgIGVsc2UKLQlpID0gZ2VuMSAoc3BudDEsIDApOwotICAgICAgaWYgKGkpCi0JewkvKiAoKnZvaWQpIGlzIGEgc3BlY2lhbCBjYXNlLCBkbyBub3QgcHV0IHBvaW50ZXIgc3VmZml4ICovCi0JICBycHVzaCAoREJHX1NfQ19QT0lOVEVSLCAxKTsKLQkgIHRvdGFsX2xlbiArPSAzOwotCSAgcnB1c2ggKHRvdGFsX2xlbiwgMik7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBBUlJBWToKLSAgICAgIHNwbnQxID0gc3BudDsKLSAgICAgIHdoaWxlIChzcG50MS0+YWR2YW5jZWQgPT0gQVJSQVkpCi0JewotCSAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudDEtPnR5cGUyKTsKLQkgIGlmICghc3BudDEpCi0JICAgIHsKLQkgICAgICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIGZvcndhcmQgcmVmZXJlbmNlIGVycm9yLCBkYnggdHlwZSAlZCIpLAotCQkJIHNwbnQtPnR5cGUyKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLS8qIEl0IGlzIHRvbyBsYXRlIHRvIGdlbmVyYXRlIGZvcndhcmQgcmVmZXJlbmNlcywgc28gdGhlIHVzZXIgZ2V0cyBhIG1lc3NhZ2UuCi0gKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBvbiBhIGNvbXBpbGVyIGVycm9yICovCi0gICAgICAodm9pZCkgZ2VuMSAoc3BudDEsIDEpOwotICAgICAgaSA9IEFwb2ludDsKLSAgICAgIGFycmF5X3N1ZmZpeCAoc3BudCk7Ci0gICAgICBhcnJheV9zdWZmaXhfbGVuID0gQXBvaW50IC0gaTsKLSAgICAgIHN3aXRjaCAoc3BudDEtPmFkdmFuY2VkKQotCXsKLQljYXNlIEJBU0lDOgotCWNhc2UgRlVOQ1RJT046Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcnB1c2ggKDAsIDIpOwotCSAgdG90YWxfbGVuICs9IDI7Ci0JICBycHVzaCAodG90YWxfbGVuLCAyKTsKLQkgIHJwdXNoIChEU1RfS19WRkxBR1NfRFNDLCAxKTsKLQkgIHJwdXNoICgxLCAxKTsJCS8qIGZsYWdzOiBlbGVtZW50IHZhbHVlIHNwZWMgaW5jbHVkZWQgKi8KLQkgIHJwdXNoICgxLCAxKTsJCS8qIG9uZSBkaW1lbnNpb24gKi8KLQkgIHJwdXNoIChEQkdfU19DX0NPTVBMRVhfQVJSQVksIDEpOwotCX0KLSAgICAgIHRvdGFsX2xlbiArPSBhcnJheV9zdWZmaXhfbGVuICsgODsKLSAgICAgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoJLyogbGludCBzdXBwcmVzc2lvbiAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGlzIGdlbmVyYXRlcyBhIHN1ZmZpeCBmb3IgYSB2YXJpYWJsZS4gIElmIGl0IGlzIG5vdCBhIGRlZmluZWQgdHlwZSB5ZXQsCi0gICB0aGVuIGRieF90eXBlIGNvbnRhaW5zIHRoZSB0eXBlIHdlIGFyZSBleHBlY3Rpbmcgc28gd2UgY2FuIGdlbmVyYXRlIGEKLSAgIGZvcndhcmQgcmVmZXJlbmNlLiAgVGhpcyBjYWxscyBnZW4xIHRvIGJ1aWxkIG1vc3Qgb2YgdGhlIGRlc2NyaXB0b3IsIGFuZAotICAgdGhlbiBpdCBwdXRzIHRoZSBpY2luZyBvbiBhdCB0aGUgZW5kLiAgSXQgdGhlbiBkdW1wcyB3aGF0ZXZlciBpcyBuZWVkZWQKLSAgIHRvIGdldCBhIGNvbXBsZXRlIGRlc2NyaXB0b3IgKGkuZS4gc3RydWN0IHJlZmVyZW5jZSwgYXJyYXkgc3VmZml4KS4gICovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9zdWZmaXggKHNwbnQsIGRieF90eXBlKQotICAgICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gICAgIGludCBkYnhfdHlwZTsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgcHZvaWRbNl0gPSB7Ci0JCTUsCQkvKiByZWNvcmQubGVuZ3RoID09IDUgKi8KLQkJRFNUX0tfVFlQU1BFQywJLyogcmVjb3JkLnR5cGUgPT0gMSAodHlwZSBzcGVjaWZpY2F0aW9uKSAqLwotCQkwLAkJLyogbmFtZS5sZW5ndGggPT0gMCwgbm8gbmFtZSBmb2xsb3dzICovCi0JCTEsIDAsCQkvKiB0eXBlLmxlbmd0aCA9PSAxIHsyIGJ5dGVzLCBsaXR0bGUgZW5kaWFufSAqLwotCQlEQkdfU19DX1ZPSUQJLyogdHlwZS50eXBlID09IDUgKHBvaW50ZXIgdG8gdW5zcGVjaWZpZWQpICovCi0gIH07Ci0gIGludCBpOwotCi0gIEFwb2ludCA9IDA7Ci0gIExwbnQgPSBNQVhfREVCVUdfUkVDT1JEIC0gMTsKLSAgdG90YWxfbGVuID0gMDsKLSAgc3RydWN0X251bWJlciA9IDA7Ci0gIG92ZXJmbG93ID0gMDsKLSAgaWYgKCFzcG50KQotICAgIG5ld19mb3J3YXJkX3JlZiAoZGJ4X3R5cGUpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNwbnQtPlZNU190eXBlICE9IERCR19TX0NfQURWQU5DRURfVFlQRSkKLQlyZXR1cm47CQkvKiBubyBzdWZmaXggbmVlZGVkICovCi0gICAgICBnZW4xIChzcG50LCAwKTsKLSAgICB9Ci0gIHJwdXNoICgwLCAxKTsJCS8qIG5vIG5hbWUgKGxlbj09MCkgKi8KLSAgcnB1c2ggKERTVF9LX1RZUFNQRUMsIDEpOwotICB0b3RhbF9sZW4gKz0gNDsKLSAgcnB1c2ggKHRvdGFsX2xlbiwgMSk7Ci0gIC8qIElmIHRoZSB2YXJpYWJsZSBkZXNjcmlwdG9yIG92ZXJmbG93cyB0aGUgcmVjb3JkLCBvdXRwdXQgYSBkZXNjcmlwdG9yCi0gICAgIGZvciBhIHBvaW50ZXIgdG8gdm9pZC4gICovCi0gIGlmICgodG90YWxfbGVuID49IE1BWF9ERUJVR19SRUNPUkQpIHx8IG92ZXJmbG93KQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlZhcmlhYmxlIGRlc2NyaXB0b3IgJWQgdG9vIGNvbXBsaWNhdGVkLiAgRGVmaW5lZCBhcyBgdm9pZCAqJy4iKSwKLQkJc3BudC0+ZGJ4X3R5cGUpOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChwdm9pZCwgNiwgT0JKX1NfQ19EQkcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaSA9IDA7Ci0gIHdoaWxlIChMcG50IDwgTUFYX0RFQlVHX1JFQ09SRCAtIDEpCi0gICAgTG9jYWxbaSsrXSA9IExvY2FsWysrTHBudF07Ci0gIExwbnQgPSBpOwotICAvKiB3ZSB1c2UgdGhpcyBmb3IgcmVmZXJlbmNlIHRvIHN0cnVjdHVyZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCAqLwotICBpZiAoc3RydWN0X251bWJlciA+IDApCi0gICAgewotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICAgICAgTHBudCA9IDA7Ci0gICAgICBWTVNfU3RvcmVfU3RydWN0IChzdHJ1Y3RfbnVtYmVyKTsKLSAgICB9Ci0gIC8qIFdlIHVzZSB0aGlzIGZvciBhIGZvcndhcmQgcmVmZXJlbmNlIHRvIGEgc3RydWN0dXJlIHRoYXQgaGFzIHlldCB0bwotICAgICBiZSBkZWZpbmVkLiAgV2Ugc3RvcmUgZm91ciBieXRlcyBvZiB6ZXJvIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGFjdHVhbAotICAgICBhZGRyZXNzIG9uY2UgaXQgaXMga25vd24uICAqLwotICBpZiAoc3RydWN0X251bWJlciA8IDApCi0gICAgewotICAgICAgc3RydWN0X251bWJlciA9IC1zdHJ1Y3RfbnVtYmVyOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICAgICAgTHBudCA9IDA7Ci0gICAgICBWTVNfRGVmX1N0cnVjdCAoc3RydWN0X251bWJlcik7Ci0gICAgICBDT1BZX0xPTkcgKCZMb2NhbFtMcG50XSwgMEwpOwotICAgICAgTHBudCArPSA0OwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICAgICAgTHBudCA9IDA7Ci0gICAgfQotICBpID0gMDsKLSAgd2hpbGUgKGkgPCBBcG9pbnQpCi0gICAgTG9jYWxbTHBudCsrXSA9IEFzdWZmaXhbaSsrXTsKLSAgaWYgKExwbnQgIT0gMCkKLSAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gIExwbnQgPSAwOwotfQotCi0KLQkvKiAibm92ZWwgbGVuZ3RoIiB0eXBlIGRvZXNuJ3Qgd29yayBmb3Igc2ltcGxlIGF0b21pYyB0eXBlcyAqLwotI2RlZmluZSBVU0VfQklUU1RSSU5HX0RFU0NSSVBUT1IodCkgKCh0KS0+YWR2YW5jZWQgPT0gQkFTSUMpCi0jdW5kZWYgU0VUVVBfQkFTSUNfVFlQRVMKLQotLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyBhIHR5cGUgZGVzY3JpcHRpb24gZm9yIGEgYml0ZmllbGQuICAqLwotCi1zdGF0aWMgdm9pZAotYml0ZmllbGRfc3VmZml4IChzcG50LCB3aWR0aCkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICAgICBpbnQgd2lkdGg7Ci17Ci0gIExvY2FsW0xwbnQrK10gPSAxMzsJCQkvKiByZWMubGVuPT0xMyAqLwotICBMb2NhbFtMcG50KytdID0gRFNUX0tfVFlQU1BFQzsJLyogYSB0eXBlIHNwZWNpZmljYXRpb24gcmVjb3JkICovCi0gIExvY2FsW0xwbnQrK10gPSAwOwkJCS8qIG5vdCBuYW1lZCAqLwotICBDT1BZX1NIT1JUICgmTG9jYWxbTHBudF0sIDkpOwkJLyogdHlwLmxlbj09OSAqLwotICBMcG50ICs9IDI7Ci0gIExvY2FsW0xwbnQrK10gPSBEU1RfS19UU19OT1ZfTEVORzsJLyogVGhpcyB0eXBlIGlzIGEgIm5vdmVsIGxlbmd0aCIKLQkJCQkJICAgaW5jYXJuYXRpb24gb2Ygc29tZSBvdGhlciB0eXBlLiAgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbTHBudF0sIHdpZHRoKTsJLyogc2l6ZSBpbiBiaXRzID09IG5vdmVsIGxlbmd0aCAqLwotICBMcG50ICs9IDQ7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIExwbnQsIE9CSl9TX0NfREJHKTsKLSAgTHBudCA9IDA7Ci0gIC8qIGFzc2VydCggc3BudC0+c3RydWNfbnVtYiA+IDAgKTsgKi8KLSAgVk1TX1N0b3JlX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7CS8qIG91dHB1dCA0IG1vcmUgYnl0ZXMgKi8KLX0KLQotCi0vKiBGb3JtYWxseSBkZWZpbmUgYSBidWlsdGluIHR5cGUsIHNvIHRoYXQgaXQgY2FuIHNlcnZlIGFzIHRoZSB0YXJnZXQgb2YKLSAgIGFuIGluZGlyZWN0IHJlZmVyZW5jZS4gIEl0IG1ha2VzIGJpdGZpZWxkX3N1ZmZpeCgpIGVhc2llciBieSBhdm9pZGluZwotICAgdGhlIG5lZWQgdG8gdXNlIGEgZm9yd2FyZCByZWZlcmVuY2UgZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKLSAgIHR5cGUgdXNlZCBpbiBhIGJpdGZpZWxkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldHVwX2Jhc2ljX3R5cGUgKHNwbnQpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLXsKLSNpZmRlZiBTRVRVUF9CQVNJQ19UWVBFUwotICAvKiBUaGlzIHdvdWxkIGJlIHZlcnkgdXNlZnVsIGlmICJub3ZlbCBsZW5ndGgiIGZpZWxkcyBhY3R1YWxseSB3b3JrZWQKLSAgICAgd2l0aCBiYXNpYyB0eXBlcyBsaWtlIHRoZXkgZG8gd2l0aCBlbnVtZXJhdGVkIHR5cGVzLiAgSG93ZXZlciwKLSAgICAgdGhleSBkbyBub3QsIHNvIHRoaXMgaXNuJ3Qgd29ydGggZG9pbmcganVzdCBzbyB0aGF0IHlvdSBjYW4gdXNlCi0gICAgIEVYQU1JTkUvVFlQRT0oX19sb25nX2xvbmdfaW50KSBpbnN0ZWFkIG9mIEVYQU1JTkUvUVVBRC4gICovCi0gIGNoYXIgKnA7Ci0jaWZuZGVmIFNFVFVQX1NZTk9OWU1fVFlQRVMKLSAgLyogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgY29tcGF0aWJsZSB0aGluZ3MgbGlrZSBgaW50JyBhbmQgYGxvbmcgaW50JwotICAgICBvdWdodCB0byBoYXZlIGRpc3RpbmN0IHR5cGUgcmVjb3JkcyByYXRoZXIgdGhhbiBzaGFyaW5nIG9uZS4gICovCi0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDI7Ci0KLSAgLyogZmlyc3QgY2hlY2sgd2hldGhlciB0aGlzIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBzZWVuIGJ5IGFub3RoZXIgbmFtZSAqLwotICBmb3IgKHNwbnQyID0gVk1TX1N5bWJvbF90eXBlX2xpc3RbU1lNVFlQX0hBU0ggKHNwbnQtPlZNU190eXBlKV07Ci0gICAgICAgc3BudDI7Ci0gICAgICAgc3BudDIgPSBzcG50Mi0+bmV4dCkKLSAgICBpZiAoc3BudDIgIT0gc3BudCAmJiBzcG50Mi0+Vk1TX3R5cGUgPT0gc3BudC0+Vk1TX3R5cGUpCi0gICAgICB7Ci0Jc3BudC0+c3RydWNfbnVtYiA9IHNwbnQyLT5zdHJ1Y19udW1iOwotCXJldHVybjsKLSAgICAgIH0KLSNlbmRpZgotCi0gIC8qIGBzdHJ1Y3R1cmUgbnVtYmVyJyBkb2Vzbid0IHJlYWxseSBtZWFuIGBzdHJ1Y3R1cmUnOyBpdCBtZWFucyBhbiBpbmRleAotICAgICBpbnRvIGEgbGlua2VyIG1haW50YWluZWQgc2V0IG9mIHNhdmVkIGxvY2F0aW9ucyB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZAotICAgICBhZ2FpbiBsYXRlci4gICovCi0gIHNwbnQtPnN0cnVjX251bWIgPSArK3N0cnVjdHVyZV9jb3VudDsKLSAgVk1TX0RlZl9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOwkvKiByZW1lbWJlciB3aGVyZSB0aGlzIHR5cGUgbGl2ZXMgKi8KLSAgLyogZGVmaW5lIHRoZSBzaW1wbGUgc2NhbGFyIHR5cGUgKi8KLSAgTG9jYWxbTHBudCsrXSA9IDYgKyBzdHJsZW4gKHN5bWJvbF9uYW1lKSArIDI7CS8qIHJlYy5sZW4gKi8KLSAgTG9jYWxbTHBudCsrXSA9IERTVF9LX1RZUFNQRUM7CS8qIHJlYy50eXA9PXR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICBMb2NhbFtMcG50KytdID0gc3RybGVuIChzeW1ib2xfbmFtZSkgKyAyOwotICBMb2NhbFtMcG50KytdID0gJ18nOwkJCS8qIHByZWZpeCBuYW1lIHdpdGggIl9fIiAqLwotICBMb2NhbFtMcG50KytdID0gJ18nOwotICBmb3IgKHAgPSBzeW1ib2xfbmFtZTsgKnA7IHArKykKLSAgICBMb2NhbFtMcG50KytdID0gKnAgPT0gJyAnID8gJ18nIDogKnA7Ci0gIENPUFlfU0hPUlQgKCZMb2NhbFtMcG50XSwgMik7CQkvKiB0eXAubGVuPT0yICovCi0gIExwbnQgKz0gMjsKLSAgTG9jYWxbTHBudCsrXSA9IERTVF9LX1RTX0FUT007CS8qIHR5cC5raW5kIGlzIHNpbXBsZSB0eXBlICovCi0gIExvY2FsW0xwbnQrK10gPSBzcG50LT5WTVNfdHlwZTsJLyogdHlwLnR5cGUgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICBMcG50ID0gMDsKLSNlbmRpZgkvKiBTRVRVUF9CQVNJQ19UWVBFUyAqLwotICByZXR1cm47Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyBhIHN5bWJvbCBkZWZpbml0aW9uIGZvciBhIEMgc3ltYm9sIGZvciB0aGUgZGVidWdnZXIuCi0gICBJdCB0YWtlcyBhIHBzZWN0IGFuZCBvZmZzZXQgZm9yIGdsb2JhbCBzeW1ib2xzOyBpZiBwc2VjdCA8IDAsIHRoZW4gdGhpcyBpcwotICAgYSBsb2NhbCB2YXJpYWJsZSBhbmQgdGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byBGUC4gIEluIHRoaXMgY2FzZSBpdCBjYW4KLSAgIGJlIGVpdGhlciBhIHZhcmlhYmxlIChPZmZzZXQgPCAwKSBvciBhIHBhcmFtZXRlciAoT2Zmc2V0ID4gMCkuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX0RCR19yZWNvcmQgKHNwbnQsIFBzZWN0LCBPZmZzZXQsIE5hbWUpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgICAgaW50IFBzZWN0OwotICAgICBpbnQgT2Zmc2V0OwotICAgICBjaGFyICpOYW1lOwotewotICBjaGFyICpOYW1lX3BudDsKLSAgaW50IGxlbjsKLSAgaW50IGkgPSAwOwotCi0gIC8qIGlmIHRoZXJlIGFyZSBiYWQgY2hhcmFjdGVycyBpbiBuYW1lLCBjb252ZXJ0IHRoZW0gKi8KLSAgTmFtZV9wbnQgPSBmaXhfbmFtZSAoTmFtZSk7Ci0KLSAgbGVuID0gc3RybGVuIChOYW1lX3BudCk7Ci0gIGlmIChQc2VjdCA8IDApCi0gICAgewkJCQkvKiB0aGlzIGlzIGEgbG9jYWwgdmFyaWFibGUsIHJlZmVyZW5jZWQgdG8gU1AgKi8KLSAgICAgIExvY2FsW2krK10gPSA3ICsgbGVuOwotICAgICAgTG9jYWxbaSsrXSA9IHNwbnQtPlZNU190eXBlOwotICAgICAgTG9jYWxbaSsrXSA9IChPZmZzZXQgPiAwKSA/IERCR19DX0ZVTkNUSU9OX1BBUkFNIDogREJHX0NfTE9DQUxfU1lNOwotICAgICAgQ09QWV9MT05HICgmTG9jYWxbaV0sIE9mZnNldCk7Ci0gICAgICBpICs9IDQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0gICAgICBMb2NhbFtpKytdID0gc3BudC0+Vk1TX3R5cGU7Ci0gICAgICBMb2NhbFtpKytdID0gRFNUX0tfVkFMS0lORF9BRERSOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICBWTVNfU2V0X0RhdGEgKFBzZWN0LCBPZmZzZXQsIE9CSl9TX0NfREJHLCAwKTsKLSAgICB9Ci0gIExvY2FsW2krK10gPSBsZW47Ci0gIHdoaWxlICgqTmFtZV9wbnQgIT0gJ1wwJykKLSAgICBMb2NhbFtpKytdID0gKk5hbWVfcG50Kys7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgaWYgKHNwbnQtPlZNU190eXBlID09IERCR19TX0NfQURWQU5DRURfVFlQRSkKLSAgICBnZW5lcmF0ZV9zdWZmaXggKHNwbnQsIDApOwotfQotCi0KLS8qIFRoaXMgcm91dGluZSBwYXJzZXMgdGhlIHN0YWJzIGVudHJpZXMgaW4gb3JkZXIgdG8gbWFrZSB0aGUgZGVmaW5pdGlvbgotICAgZm9yIHRoZSBkZWJ1Z2dlciBvZiBsb2NhbCBzeW1ib2xzIGFuZCBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19sb2NhbF9zdGFiX1BhcnNlIChzcCkKLSAgICAgc3ltYm9sUyAqc3A7Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgY2hhciAqcG50OwotICBjaGFyICpwbnQxOwotICBjaGFyICpzdHI7Ci0gIGludCBkYnhfdHlwZTsKLQotICBkYnhfdHlwZSA9IDA7Ci0gIHN0ciA9IFNfR0VUX05BTUUgKHNwKTsKLSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc6Jyk7Ci0gIGlmICghcG50KQotICAgIHJldHVybjsJCQkvKiBubyBjb2xvbiBwcmVzZW50ICovCi0gIHBudDEgPSBwbnQrKzsJCQkvKiBzYXZlIHRoaXMgZm9yIGxhdGVyLCBhbmQgc2tpcCBjb2xvbiAqLwotICBpZiAoKnBudCA9PSAnYycpCi0gICAgcmV0dXJuOwkJCS8qIGlnbm9yZSBzdGF0aWMgY29uc3RhbnRzICovCi0KLS8qIHRoZXJlIGlzIG9uZSBsaXR0bGUgY2F0Y2ggdGhhdCB3ZSBtdXN0IGJlIGF3YXJlIG9mLiAgU29tZXRpbWVzIGZ1bmN0aW9uCi0gKiBwYXJhbWV0ZXJzIGFyZSBvcHRpbWl6ZWQgaW50byByZWdpc3RlcnMsIGFuZCB0aGUgY29tcGlsZXIsIGluIGl0cyBpbmZpaXRlCi0gKiB3aXNkb20gb3V0cHV0cyBzdGFicyByZWNvcmRzIGZvciAqYm90aCouICBJbiBnZW5lcmFsIHdlIHdhbnQgdG8gdXNlIHRoZQotICogcmVnaXN0ZXIgaWYgaXQgaXMgcHJlc2VudCwgc28gd2UgbXVzdCBzZWFyY2ggdGhlIHJlc3Qgb2YgdGhlIHN5bWJvbHMgZm9yCi0gKiB0aGlzIGZ1bmN0aW9uIHRvIHNlZSBpZiB0aGlzIHBhcmFtZXRlciBpcyBhc3NpZ25lZCB0byBhIHJlZ2lzdGVyLgotICovCi0gIHsKLSAgICBzeW1ib2xTICpzcDE7Ci0gICAgY2hhciAqc3RyMTsKLSAgICBjaGFyICpwbnQyOwotCi0gICAgaWYgKCpwbnQgPT0gJ3AnKQotICAgICAgewotCWZvciAoc3AxID0gc3ltYm9sX25leHQgKHNwKTsgc3AxOyBzcDEgPSBzeW1ib2xfbmV4dCAoc3AxKSkKLQkgIHsKLQkgICAgaWYgKCFTX0lTX0RFQlVHIChzcDEpKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHNwMSkgPT0gTl9GVU4pCi0JICAgICAgewotCQlwbnQyID0gKGNoYXIgKikgc3RyY2hyIChTX0dFVF9OQU1FIChzcDEpLCAnOicpICsgMTsKLQkJaWYgKCpwbnQyID09ICdGJyB8fCAqcG50MiA9PSAnZicpCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHNwMSkgIT0gTl9SU1lNKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICBzdHIxID0gU19HRVRfTkFNRSAoc3AxKTsJLyogYW5kIGdldCB0aGUgbmFtZSAqLwotCSAgICBwbnQyID0gc3RyOwotCSAgICB3aGlsZSAoKnBudDIgIT0gJzonKQotCSAgICAgIHsKLQkJaWYgKCpwbnQyICE9ICpzdHIxKQotCQkgIGJyZWFrOwotCQlwbnQyKys7Ci0JCXN0cjErKzsKLQkgICAgICB9Ci0JICAgIGlmICgqc3RyMSA9PSAnOicgJiYgKnBudDIgPT0gJzonKQotCSAgICAgIHJldHVybjsJLyogdGhleSBhcmUgdGhlIHNhbWUhICBsZXRzIHNraXAgdGhpcyBvbmUgKi8KLQkgIH0JCQkvKiBmb3IgKi8KLQlwbnQrKzsJCQkvKiBza2lwIHAgaW4gY2FzZSBubyByZWdpc3RlciAqLwotICAgICAgfQkJCS8qIGlmICovCi0gIH0JCQkJLyogcCBibG9jayAqLwotCi0gIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQsICZkYnhfdHlwZSk7Ci0gIHNwbnQgPSBmaW5kX3N5bWJvbCAoZGJ4X3R5cGUpOwotICBpZiAoIXNwbnQpCi0gICAgcmV0dXJuOwkJCS8qRHVubm8gd2hhdCB0aGlzIGlzKi8KLSAgKnBudDEgPSAnXDAnOwotICBWTVNfREJHX3JlY29yZCAoc3BudCwgLTEsIFNfR0VUX1ZBTFVFIChzcCksIHN0cik7Ci0gICpwbnQxID0gJzonOwkJCS8qIGFuZCByZXN0b3JlIHRoZSBzdHJpbmcgKi8KLSAgcmV0dXJuOwotfQotCi0KLS8qIFRoaXMgcm91dGluZSBwYXJzZXMgYSBzdGFicyBlbnRyeSB0byBmaW5kIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZAotICAgdG8gZGVmaW5lIGEgdmFyaWFibGUuICBJdCBpcyB1c2VkIGZvciBnbG9iYWwgYW5kIHN0YXRpYyB2YXJpYWJsZXMuCi0gICBCYXNpY2FsbHkgd2UgbmVlZCB0byBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuICBXaXRoIG9sZGVyCi0gICB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIsIGNvbnN0IHN5bWJvbHMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHksIGluCi0gICB0aGF0IGlmIHRoZXkgYXJlIGdsb2JhbCB0aGV5IGFyZSB3cml0dGVuIGludG8gdGhlIHRleHQgcHNlY3QuICBUaGUKLSAgIGdsb2JhbCBzeW1ib2wgZW50cnkgZm9yIHN1Y2ggYSBjb25zdCBpcyBhY3R1YWxseSB3cml0dGVuIGFzIGEgcHJvZ3JhbQotICAgZW50cnkgcG9pbnQgKFl1ayEhKSwgc28gaWYgd2UgY2Fubm90IGZpbmQgYSBzeW1ib2wgaW4gdGhlIGxpc3Qgb2YKLSAgIHBzZWN0cywgd2UgbXVzdCBzZWFyY2ggdGhlIGVudHJ5IHBvaW50cyBhcyB3ZWxsLiAgc3RhdGljIGNvbnN0cyBhcmUKLSAgIGV2ZW4gaGFyZGVyLCBzaW5jZSB0aGV5IGFyZSBuZXZlciBhc3NpZ25lZCBhIG1lbW9yeSBhZGRyZXNzLiAgVGhlCi0gICBjb21waWxlciBwYXNzZXMgYSBzdGFiIHRvIHRlbGwgdXMgdGhlIHZhbHVlLCBidXQgSSBhbSBub3Qgc3VyZSB3aGF0Ci0gICB0byBkbyB3aXRoIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19zdGFiX3BhcnNlIChzcCwgZXhwZWN0ZWRfdHlwZSwgdHlwZTEsIHR5cGUyLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzcDsKLSAgICAgaW50IGV4cGVjdGVkX3R5cGU7CS8qIGNoYXIgKi8KLSAgICAgaW50IHR5cGUxLCB0eXBlMiwgVGV4dF9Qc2VjdDsKLXsKLSAgY2hhciAqcG50OwotICBjaGFyICpwbnQxOwotICBjaGFyICpzdHI7Ci0gIHN5bWJvbFMgKnNwMTsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICBzdHJ1Y3QgVk1TX1N5bWJvbCAqdnNwOwotICBpbnQgZGJ4X3R5cGU7Ci0KLSAgZGJ4X3R5cGUgPSAwOwotICBzdHIgPSBTX0dFVF9OQU1FIChzcCk7Ci0gIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOicpOwotICBpZiAoIXBudCkKLSAgICByZXR1cm47CQkJLyogbm8gY29sb24gcHJlc2VudCAqLwotICBwbnQxID0gcG50OwkJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIqLwotICBwbnQrKzsKLSAgaWYgKCpwbnQgPT0gZXhwZWN0ZWRfdHlwZSkKLSAgICB7Ci0gICAgICBwbnQgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmRieF90eXBlKTsKLSAgICAgIHNwbnQgPSBmaW5kX3N5bWJvbCAoZGJ4X3R5cGUpOwotICAgICAgaWYgKCFzcG50KQotCXJldHVybjsJCS8qRHVubm8gd2hhdCB0aGlzIGlzKi8KLSAgICAgIC8qCi0gICAgICAgKiBOb3cgd2UgbmVlZCB0byBzZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSB0byBmaW5kIHRoZSBwc2VjdCBhbmQKLSAgICAgICAqIG9mZnNldCBmb3IgdGhpcyB2YXJpYWJsZS4KLSAgICAgICAqLwotICAgICAgKnBudDEgPSAnXDAnOwotICAgICAgdnNwID0gVk1TX1N5bWJvbHM7Ci0gICAgICB3aGlsZSAodnNwKQotCXsKLQkgIHBudCA9IFNfR0VUX05BTUUgKHZzcC0+U3ltYm9sKTsKLQkgIGlmIChwbnQgJiYgKnBudCsrID09ICdfJwotCSAgICAgIC8qIG1ha2Ugc3VyZSBuYW1lIGlzIHRoZSBzYW1lIGFuZCBzeW1ib2wgdHlwZSBtYXRjaGVzICovCi0JICAgICAgJiYgc3RyY21wIChwbnQsIHN0cikgPT0gMAotCSAgICAgICYmIChTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpID09IHR5cGUxCi0JCSAgfHwgU19HRVRfUkFXX1RZUEUgKHZzcC0+U3ltYm9sKSA9PSB0eXBlMikpCi0JICAgIGJyZWFrOwotCSAgdnNwID0gdnNwLT5OZXh0OwotCX0KLSAgICAgIGlmICh2c3ApCi0JewotCSAgVk1TX0RCR19yZWNvcmQgKHNwbnQsIHZzcC0+UHNlY3RfSW5kZXgsIHZzcC0+UHNlY3RfT2Zmc2V0LCBzdHIpOwotCSAgKnBudDEgPSAnOic7CQkvKiBhbmQgcmVzdG9yZSB0aGUgc3RyaW5nICovCi0JICByZXR1cm47Ci0JfQotICAgICAgLyogVGhlIHN5bWJvbCB3YXMgbm90IGluIHRoZSBzeW1ib2wgbGlzdCwgYnV0IGl0IG1heSBiZSBhbgotICAgICAgICAgImVudHJ5IHBvaW50IiBpZiBpdCB3YXMgYSBjb25zdGFudC4gICovCi0gICAgICBmb3IgKHNwMSA9IHN5bWJvbF9yb290UDsgc3AxOyBzcDEgPSBzeW1ib2xfbmV4dCAoc3AxKSkKLQl7Ci0JICAvKgotCSAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0JICAgKi8KLQkgIGlmIChTX0lTX0RFQlVHIChzcDEpIHx8IChTX0dFVF9UWVBFIChzcDEpICE9IE5fVEVYVCkpCi0JICAgIGNvbnRpbnVlOwotCSAgcG50ID0gU19HRVRfTkFNRSAoc3AxKTsKLQkgIGlmICgqcG50ID09ICdfJykKLQkgICAgcG50Kys7Ci0JICBpZiAoc3RyY21wIChwbnQsIHN0cikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghZ2F2ZV9jb21waWxlcl9tZXNzYWdlICYmIGV4cGVjdGVkX3R5cGUgPT0gJ0cnKQotCQl7Ci0JCSAgY2hhciAqbG9uZ19jb25zdF9tc2cgPSBfKCJcCi0qKipXYXJuaW5nIC0gdGhlIGFzc2VtYmx5IGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBoYXMgcGxhY2VkIFxuXAotIGdsb2JhbCBjb25zdGFudChzKSBpbiB0aGUgdGV4dCBwc2VjdC4gIFRoZXNlIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB0byBcblwKLSBvdGhlciBtb2R1bGVzLCBzaW5jZSB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdCB3YXkgdG8gaGFuZGxlIHRoaXMuIFlvdSBcblwKLSBoYXZlIHR3byBvcHRpb25zOiAxKSBnZXQgYSBwYXRjaGVkIGNvbXBpbGVyIHRoYXQgZG9lcyBub3QgcHV0IGdsb2JhbCBcblwKLSBjb25zdGFudHMgaW4gdGhlIHRleHQgcHNlY3QsIG9yIDIpIHJlbW92ZSB0aGUgJ2NvbnN0JyBrZXl3b3JkIGZyb20gXG5cCi0gZGVmaW5pdGlvbnMgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbiB5b3VyIHNvdXJjZSBtb2R1bGUocykuICBEb24ndCBzYXkgXG5cCi0gSSBkaWRuJ3Qgd2FybiB5b3UhIFxuIik7Ci0KLQkJICBhc190c2t0c2sgKGxvbmdfY29uc3RfbXNnKTsKLQkJICBnYXZlX2NvbXBpbGVyX21lc3NhZ2UgPSAxOwotCQl9Ci0JICAgICAgVk1TX0RCR19yZWNvcmQgKHNwbnQsCi0JCQkgICAgICBUZXh0X1BzZWN0LAotCQkJICAgICAgU19HRVRfVkFMVUUgKHNwMSksCi0JCQkgICAgICBzdHIpOwotCSAgICAgICpwbnQxID0gJzonOwotCSAgICAgIC8qIGZvb2wgYXNzZW1ibGVyIHRvIG5vdCBvdXRwdXQgdGhpcyBhcyBhIHJvdXRpbmUgaW4gdGhlIFRCVCAqLwotCSAgICAgIHBudDEgPSBTX0dFVF9OQU1FIChzcDEpOwotCSAgICAgICpwbnQxID0gJ0wnOwotCSAgICAgIFNfU0VUX05BTUUgKHNwMSwgcG50MSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLSAgKnBudDEgPSAnOic7CQkJLyogYW5kIHJlc3RvcmUgdGhlIHN0cmluZyAqLwotICByZXR1cm47Ci19Ci0KLQotLyogU2ltcGxlciBpbnRlcmZhY2VzIGludG8gVk1TX3N0YWJfcGFyc2UoKS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfR1NZTV9QYXJzZSAoc3AsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgVGV4dF9Qc2VjdDsKLXsJCQkJLyogR2xvYmFsIHZhcmlhYmxlcyAqLwotICBWTVNfc3RhYl9wYXJzZSAoc3AsICdHJywgKE5fVU5ERiB8IE5fRVhUKSwgKE5fREFUQSB8IE5fRVhUKSwgVGV4dF9Qc2VjdCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1WTVNfTENTWU1fUGFyc2UgKHNwLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzcDsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17CQkJCS8qIFN0YXRpYyBzeW1ib2xzIC0gdW5pbml0aWFsaXplZCAqLwotICBWTVNfc3RhYl9wYXJzZSAoc3AsICdTJywgTl9CU1MsIC0xLCBUZXh0X1BzZWN0KTsKLX0KLQotc3RhdGljIHZvaWQKLVZNU19TVFNZTV9QYXJzZSAoc3AsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgVGV4dF9Qc2VjdDsKLXsJCQkJLyogU3RhdGljIHN5bWJvbHMgLSBpbml0aWFsaXplZCAqLwotICBWTVNfc3RhYl9wYXJzZSAoc3AsICdTJywgTl9EQVRBLCAtMSwgVGV4dF9Qc2VjdCk7Ci19Ci0KLQotLyogRm9yIHJlZ2lzdGVyIHN5bWJvbHMsIHdlIG11c3QgZmlndXJlIG91dCB3aGF0IHJhbmdlIG9mIGFkZHJlc3NlcwotICAgd2l0aGluIHRoZSBwc2VjdCBhcmUgdmFsaWQuICBXZSB3aWxsIHVzZSB0aGUgYnJhY2tldHMgaW4gdGhlIHN0YWIKLSAgIGRpcmVjdGl2ZXMgdG8gZ2l2ZSB1cyBndWlkYW5jZSBhcyB0byB0aGUgUEMgcmFuZ2UgdGhhdCB0aGlzIHZhcmlhYmxlCi0gICBpcyBpbiBzY29wZS4gIEkgYW0gc3RpbGwgbm90IGNvbXBsZXRlbHkgY29tZm9ydGFibGUgd2l0aCB0aGlzIGJ1dAotICAgYXMgSSBsZWFybiBtb3JlLCBJIHNlZW0gdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB3aGF0IGlzIGdvaW5nIG9uLgotICAgQ2F2ZWF0IEVtcHRvci4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfUlNZTV9QYXJzZSAoc3AsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqc3AsICpDdXJyZW50X1JvdXRpbmU7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIGNoYXIgKnBudDsKLSAgY2hhciAqcG50MTsKLSAgY2hhciAqc3RyOwotICBpbnQgZGJ4X3R5cGU7Ci0gIGludCBsZW47Ci0gIGludCBpID0gMDsKLSAgaW50IGJjbnQgPSAwOwotICBpbnQgTWluX09mZnNldCA9IC0xOwkJLyogbWluIFBDIG9mIHZhbGlkaXR5ICovCi0gIGludCBNYXhfT2Zmc2V0ID0gMDsJCS8qIG1heCBQQyBvZiB2YWxpZGl0eSAqLwotCi0gIGZvciAoc3ltYm9sUCA9IHNwOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUKLSAgICAgICAqLwotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ltYm9sUCkpCi0JewotCWNhc2UgTl9MQlJBQzoKLQkgIGlmIChiY250KysgPT0gMCkKLQkgICAgTWluX09mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9SQlJBQzoKLQkgIGlmICgtLWJjbnQgPT0gMCkKLQkgICAgTWF4X09mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAtIDE7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoKE1pbl9PZmZzZXQgIT0gLTEpICYmIChiY250ID09IDApKQotCWJyZWFrOwotICAgICAgaWYgKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSA9PSBOX0ZVTikKLQl7Ci0JICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHN5bWJvbFApLCAnOicpICsgMTsKLQkgIGlmICgqcG50ID09ICdGJyB8fCAqcG50ID09ICdmJykgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBDaGVjayB0byBzZWUgdGhhdCB0aGUgYWRkcmVzc2VzIHdlcmUgZGVmaW5lZC4gIElmIG5vdCwgdGhlbiB0aGVyZQotICAgICB3ZXJlIG5vIGJyYWNrZXRzIGluIHRoZSBmdW5jdGlvbiwgYW5kIHdlIG11c3QgdHJ5IHRvIHNlYXJjaCBmb3IKLSAgICAgdGhlIG5leHQgZnVuY3Rpb24uICBTaW5jZSBmdW5jdGlvbnMgY2FuIGJlIGluIGFueSBvcmRlciwgd2Ugc2hvdWxkCi0gICAgIHNlYXJjaCBhbGwgb2YgdGhlIHN5bWJvbCBsaXN0IHRvIGZpbmQgdGhlIGNvcnJlY3QgZW5kaW5nIGFkZHJlc3MuICAqLwotICBpZiAoTWluX09mZnNldCA9PSAtMSkKLSAgICB7Ci0gICAgICBpbnQgTWF4X1NvdXJjZV9PZmZzZXQ7Ci0gICAgICBpbnQgVGhpc19PZmZzZXQ7Ci0KLSAgICAgIE1pbl9PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ApOwotICAgICAgTWF4X1NvdXJjZV9PZmZzZXQgPSBNaW5fT2Zmc2V0OwkvKiBqdXN0IGluIGNhc2Ugbm8gTl9TTElORXMgZm91bmQgKi8KLSAgICAgIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLQlzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSkKLQkgIHsKLQkgIGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0JICAgIFRoaXNfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgICBpZiAoVGhpc19PZmZzZXQgPiBNaW5fT2Zmc2V0ICYmIFRoaXNfT2Zmc2V0IDwgTWF4X09mZnNldCkKLQkgICAgICBNYXhfT2Zmc2V0ID0gVGhpc19PZmZzZXQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NMSU5FOgotCSAgICBUaGlzX09mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgaWYgKFRoaXNfT2Zmc2V0ID4gTWF4X1NvdXJjZV9PZmZzZXQpCi0JICAgICAgTWF4X1NvdXJjZV9PZmZzZXQgPSBUaGlzX09mZnNldDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IHJvdXRpbmUsIHRoZW4gd2UgdXNlIHRoZSBQQyBvZiB0aGUgbGFzdCBzb3VyY2UKLSAgICAgICAgIGxpbmUgYXMgYSBtYXJrZXIgb2YgdGhlIG1heCBQQyBmb3Igd2hpY2ggdGhpcyByZWcgaXMgdmFsaWQuICAqLwotICAgICAgaWYgKE1heF9PZmZzZXQgPT0gMHg3ZmZmZmZmZikKLQlNYXhfT2Zmc2V0ID0gTWF4X1NvdXJjZV9PZmZzZXQ7Ci0gICAgfQotCi0gIGRieF90eXBlID0gMDsKLSAgc3RyID0gU19HRVRfTkFNRSAoc3ApOwotICBpZiAoKHBudCA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOicpKSA9PSAwKQotICAgIHJldHVybjsJCQkvKiBubyBjb2xvbiBwcmVzZW50ICovCi0gIHBudDEgPSBwbnQ7CQkJLyogc2F2ZSB0aGlzIGZvciBsYXRlciovCi0gIHBudCsrOwotICBpZiAoKnBudCAhPSAncicpCi0gICAgcmV0dXJuOwotICBwbnQgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmRieF90eXBlKTsKLSAgc3BudCA9IGZpbmRfc3ltYm9sIChkYnhfdHlwZSk7Ci0gIGlmICghc3BudCkKLSAgICByZXR1cm47CQkJLypEdW5ubyB3aGF0IHRoaXMgaXMgeWV0Ki8KLSAgKnBudDEgPSAnXDAnOwotICBwbnQgPSBmaXhfbmFtZSAoU19HRVRfTkFNRSAoc3ApKTsJLyogaWYgdGhlcmUgYXJlIGJhZCBjaGFyYWN0ZXJzIGluIG5hbWUsIGNvbnZlcnQgdGhlbSAqLwotICBsZW4gPSBzdHJsZW4gKHBudCk7Ci0gIExvY2FsW2krK10gPSAyNSArIGxlbjsKLSAgTG9jYWxbaSsrXSA9IHNwbnQtPlZNU190eXBlOwotICBMb2NhbFtpKytdID0gRFNUX0tfVkZMQUdTX1RWUzsJLyogdHJhaWxpbmcgdmFsdWUgc3BlY2lmaWVkICovCi0gIENPUFlfTE9ORyAoJkxvY2FsW2ldLCAxICsgbGVuKTsJLyogcmVsYXRpdmUgb2Zmc2V0LCBiZXlvbmQgbmFtZSAqLwotICBpICs9IDQ7Ci0gIExvY2FsW2krK10gPSBsZW47CQkJLyogbmFtZSBsZW5ndGggKGFzY2ljIHByZWZpeCkgKi8KLSAgd2hpbGUgKCpwbnQgIT0gJ1wwJykKLSAgICBMb2NhbFtpKytdID0gKnBudCsrOwotICBMb2NhbFtpKytdID0gRFNUX0tfVlNfRk9MTE9XUzsJLyogdmFsdWUgc3BlY2lmaWNhdGlvbiBmb2xsb3dzICovCi0gIENPUFlfU0hPUlQgKCZMb2NhbFtpXSwgMTUpOwkJLyogbGVuZ3RoIG9mIHJlc3Qgb2YgcmVjb3JkICovCi0gIGkgKz0gMjsKLSAgTG9jYWxbaSsrXSA9IERTVF9LX1ZTX0FMTE9DX1NQTElUOwkvKiBzcGxpdCBsaWZldGltZSAqLwotICBMb2NhbFtpKytdID0gMTsJCQkvKiBvbmUgYmluZGluZyBmb2xsb3dzICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgaSA9IDA7Ci0gIFZNU19TZXRfRGF0YSAoVGV4dF9Qc2VjdCwgTWluX09mZnNldCwgT0JKX1NfQ19EQkcsIDEpOwotICBWTVNfU2V0X0RhdGEgKFRleHRfUHNlY3QsIE1heF9PZmZzZXQsIE9CSl9TX0NfREJHLCAxKTsKLSAgTG9jYWxbaSsrXSA9IERTVF9LX1ZBTEtJTkRfUkVHOwkJLyogbmVzdGVkIHZhbHVlIHNwZWMgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbaV0sIFNfR0VUX1ZBTFVFIChzcCkpOwotICBpICs9IDQ7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgKnBudDEgPSAnOic7Ci0gIGlmIChzcG50LT5WTVNfdHlwZSA9PSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUpCi0gICAgZ2VuZXJhdGVfc3VmZml4IChzcG50LCAwKTsKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGV4YW1pbmVzIGEgc3RydWN0dXJlIGRlZmluaXRpb24sIGNoZWNraW5nIGFsbCBvZiB0aGUgZWxlbWVudHMKLSAgIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiB0aGVtIGFyZSBmdWxseSBkZWZpbmVkLiAgVGhlIG9ubHkgdGhpbmcgdGhhdCB3ZQotICAga2ljayBvdXQgYXJlIGFycmF5cyBvZiB1bmRlZmluZWQgc3RydWN0cywgc2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGJpZwotICAgdGhleSBhcmUuICBBbGwgb3RoZXJzIHdlIGNhbiBoYW5kbGUgd2l0aCBhIG5vcm1hbCBmb3J3YXJkIHJlZmVyZW5jZS4gICovCi0KLXN0YXRpYyBpbnQKLWZvcndhcmRfcmVmZXJlbmNlIChwbnQpCi0gICAgIGNoYXIgKnBudDsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50LCAqc3BudDE7Ci0gIGludCBpOwotCi0gIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7Ci0gIGlmICgqcG50ID09ICc7JykKLSAgICByZXR1cm4gMDsJCQkvKiBubyBmb3J3YXJkIHJlZmVyZW5jZXMgKi8KLSAgZG8KLSAgICB7Ci0gICAgICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHBudCwgJzonKTsKLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7Ci0gICAgICBzcG50ID0gZmluZF9zeW1ib2wgKGkpOwotICAgICAgd2hpbGUgKHNwbnQgJiYgKHNwbnQtPmFkdmFuY2VkID09IFBPSU5URVIgfHwgc3BudC0+YWR2YW5jZWQgPT0gQVJSQVkpKQotCXsKLQkgIHNwbnQxID0gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLQkgIGlmIChzcG50LT5hZHZhbmNlZCA9PSBBUlJBWSAmJiAhc3BudDEpCi0JICAgIHJldHVybiAxOwotCSAgc3BudCA9IHNwbnQxOwotCX0KLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7Ci0gICAgICBwbnQgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmkpOwotICAgIH0gd2hpbGUgKCorK3BudCAhPSAnOycpOwotICByZXR1cm4gMDsJCQkvKiBubyBmb3J3YXJkIHJlZmVuY2VzIGZvdW5kICovCi19Ci0KLQotLyogVXNlZCB0byBjaGVjayBhIHNpbmdsZSBlbGVtZW50IG9mIGEgc3RydWN0dXJlIG9uIHRoZSBmaW5hbCBwYXNzLiAgKi8KLQotc3RhdGljIGludAotZmluYWxfZm9yd2FyZF9yZWZlcmVuY2UgKHNwbnQpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MTsKLQotICB3aGlsZSAoc3BudCAmJiAoc3BudC0+YWR2YW5jZWQgPT0gUE9JTlRFUiB8fCBzcG50LT5hZHZhbmNlZCA9PSBBUlJBWSkpCi0gICAgewotICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudC0+dHlwZTIpOwotICAgICAgaWYgKHNwbnQtPmFkdmFuY2VkID09IEFSUkFZICYmICFzcG50MSkKLQlyZXR1cm4gMTsKLSAgICAgIHNwbnQgPSBzcG50MTsKLSAgICB9Ci0gIHJldHVybiAwOwkvKiBubyBmb3J3YXJkIHJlZmVuY2VzIGZvdW5kICovCi19Ci0KLQotLyogVGhpcyByb3V0aW5lIHBhcnNlcyB0aGUgc3RhYnMgZGlyZWN0aXZlcyB0byBmaW5kIGFueSBkZWZpbml0aW9ucyBvZiBkYngKLSAgIHR5cGUgbnVtYmVycy4gIEl0IG1ha2VzIGEgbm90ZSBvZiBhbGwgb2YgdGhlbSwgY3JlYXRpbmcgYSBzdHJ1Y3R1cmUKLSAgIGVsZW1lbnQgb2YgVk1TX0RCR19TeW1ib2wgdGhhdCBkZXNjcmliZXMgaXQuICBUaGlzIGFsc28gZ2VuZXJhdGVzIHRoZQotICAgaW5mbyBmb3IgdGhlIGRlYnVnZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3QvdW5pb24vZW51bSwgc28gdGhhdAotICAgZnVydGhlciByZWZlcmVuY2VzIHRvIHRoZXNlIGRhdGEgdHlwZXMgd2lsbCBiZSBieSBudW1iZXIKLQotICAgV2UgaGF2ZSB0byBwcm9jZXNzIHBvaW50ZXJzIHJpZ2h0IGF3YXksIHNpbmNlIHRoZXJlIGNhbiBiZSByZWZlcmVuY2VzCi0gICB0byB0aGVtIGxhdGVyIGluIHRoZSBzYW1lIHN0YWJzIGRpcmVjdGl2ZS4gIFdlIGNhbm5vdCBoYXZlIGZvcndhcmQKLSAgIHJlZmVyZW5jZXMgdG8gcG9pbnRlcnMsIChidXQgd2UgY2FuIGhhdmUgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byBhCi0gICBwb2ludGVyIHRvIGEgc3RydWN0dXJlL2VudW0vdW5pb24pIGFuZCB0aGlzIGlzIHdoeSB3ZSBwcm9jZXNzIHRoZW0KLSAgIGltbWVkaWF0ZWx5LiAgQWZ0ZXIgd2UgcHJvY2VzcyB0aGUgcG9pbnRlciwgdGhlbiB3ZSBzZWFyY2ggZm9yIGRlZnMKLSAgIHRoYXQgYXJlIG5lc3RlZCBldmVuIGRlZXBlci4KLQotICAgOC8xNS85MjogV2UgaGF2ZSB0byBwcm9jZXNzIGFycmF5cyByaWdodCBhd2F5IHRvbywgYmVjYXVzZSB0aGVyZSBjYW4KLSAgIGJlIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gaWRlbnRpY2FsIGFycmF5IHR5cGVzIGluIG9uZSBzdHJ1Y3R1cmUKLSAgIGRlZmluaXRpb24sIGFuZCBvbmx5IHRoZSBmaXJzdCBvbmUgaGFzIHRoZSBkZWZpbml0aW9uLiAgKi8KLQotc3RhdGljIGludAotVk1TX3R5cGVkZWZfcGFyc2UgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNvbnN0IGNoYXIgKnBudDI7Ci0gIGludCBpOwotICBpbnQgZHR5cGU7Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqZnBudDsKLSAgaW50IGkxLCBpMiwgaTMsIGxlbjsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQxOwotCi0gIC8qIGNoZWNrIGZvciBhbnkgbmVzdGVkIGRlZidzICovCi0gIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyICsgMSwgJz0nKTsKLSAgaWYgKHBudCAmJiBzdHJbMV0gIT0gJyonICYmIChzdHJbMV0gIT0gJ2EnIHx8IHN0clsyXSAhPSAncicpCi0gICAgICAmJiBWTVNfdHlwZWRlZl9wYXJzZSAocG50KSA9PSAxKQotICAgIHJldHVybiAxOwotICAvKiBub3cgZmluZCBkYnhfdHlwZSBvZiBlbnRyeSAqLwotICBwbnQgPSBzdHIgLSAxOwotICBpZiAoKnBudCA9PSAnYycpCi0gICAgewkJCQkvKiBjaGVjayBmb3Igc3RhdGljIGNvbnN0YW50cyAqLwotICAgICAgKnN0ciA9ICdcMCc7CQkvKiBmb3Igbm93IHdlIGlnbm9yZSB0aGVtICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHdoaWxlICgoKnBudCA8PSAnOScpICYmICgqcG50ID49ICcwJykpCi0gICAgcG50LS07Ci0gIHBudCsrOwkJCS8qIGFuZCBnZXQgYmFjayB0byB0aGUgbnVtYmVyICovCi0gIGN2dF9pbnRlZ2VyIChwbnQsICZpMSk7Ci0gIHNwbnQgPSBmaW5kX3N5bWJvbCAoaTEpOwotICAvKiBmaXJzdCBzZWUgaWYgdGhpcyBoYXMgYmVlbiBkZWZpbmVkIGFscmVhZHksIGR1ZSB0byBmb3J3YXJkIHJlZmVyZW5jZSAqLwotICBpZiAoIXNwbnQpCi0gICAgewotICAgICAgaTIgPSBTWU1UWVBfSEFTSCAoaTEpOwotICAgICAgc3BudCA9IChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wpKTsKLSAgICAgIHNwbnQtPm5leHQgPSBWTVNfU3ltYm9sX3R5cGVfbGlzdFtpMl07Ci0gICAgICBWTVNfU3ltYm9sX3R5cGVfbGlzdFtpMl0gPSBzcG50OwotICAgICAgc3BudC0+ZGJ4X3R5cGUgPSBpMTsJLyogYW5kIHNhdmUgdGhlIHR5cGUgKi8KLSAgICAgIHNwbnQtPnR5cGUyID0gc3BudC0+Vk1TX3R5cGUgPSBzcG50LT5kYXRhX3NpemUgPSAwOwotICAgICAgc3BudC0+aW5kZXhfbWluID0gc3BudC0+aW5kZXhfbWF4ID0gc3BudC0+c3RydWNfbnVtYiA9IDA7Ci0gICAgfQotICAvKgotICAgKiBGb3Igc3RydWN0cyBhbmQgdW5pb25zLCBkbyBhIHBhcnRpYWwgcGFyc2UsIG90aGVyd2lzZSB3ZSBzb21ldGltZXMgZ2V0Ci0gICAqIGNpcmN1bGFyIGRlZmluaXRpb25zIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVzb2x2ZS4gIFdlIHJlYWQgZW5vdWdoCi0gICAqIGluZm8gc28gdGhhdCBhbnkgcmVmZXJlbmNlIHRvIHRoaXMgdHlwZSBoYXMgZW5vdWdoIGluZm8gdG8gYmUgcmVzb2x2ZWQuCi0gICAqLwotICBwbnQgPSBzdHIgKyAxOwkJLyogcG9pbnQgdG8gY2hhcmFjdGVyIHBhc3QgZXF1YWwgc2lnbiAqLwotICBpZiAoKnBudCA+PSAnMCcgJiYgKnBudCA8PSAnOScpCi0gICAgewotICAgICAgaWYgKHR5cGVfY2hlY2sgKCJ2b2lkIikpCi0JewkJCS8qIHRoaXMgaXMgdGhlIHZvaWQgc3ltYm9sICovCi0JICAqc3RyID0gJ1wwJzsKLQkgIHNwbnQtPmFkdmFuY2VkID0gVk9JRDsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmICh0eXBlX2NoZWNrICgidW5rbm93biB0eXBlIikpCi0JewotCSAgKnN0ciA9ICdcMCc7Ci0JICBzcG50LT5hZHZhbmNlZCA9IFVOS05PV047Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudCwgJmkxKTsKLSAgICAgIGlmIChpMSAhPSBzcG50LT5kYnhfdHlwZSkKLQl7Ci0JICBzcG50LT5hZHZhbmNlZCA9IEFMSUFTOwotCSAgc3BudC0+dHlwZTIgPSBpMTsKLQkgIHN0cmNweSAoc3RyLCBwbnQxKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnaW5lciBvdXRwdXQ6ICVkIGlzIGFuIHVua25vd24gdW50eXBlZCB2YXJpYWJsZS4iKSwKLQkJIHNwbnQtPmRieF90eXBlKTsKLSAgICAgIHJldHVybiAxOwkJCS8qIGRvIG5vdCBrbm93IHdoYXQgdGhpcyBpcyAqLwotICAgIH0KLQotICBwbnQgPSBzdHIgKyAxOwkJLyogcG9pbnQgdG8gY2hhcmFjdGVyIHBhc3QgZXF1YWwgc2lnbiAqLwotICBzd2l0Y2ggKCpwbnQpCi0gICAgewotICAgIGNhc2UgJ3InOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBCQVNJQzsKLSAgICAgIGlmICh0eXBlX2NoZWNrICgiaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NMSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgibG9uZyBpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfU0xJTlQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJ1bnNpZ25lZCBpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfVUxJTlQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIHVuc2lnbmVkIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VTElOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInNob3J0IGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TU0lOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInNob3J0IHVuc2lnbmVkIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VU0lOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImNoYXIiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfU0NIQVI7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJzaWduZWQgY2hhciIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TQ0hBUjsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInVuc2lnbmVkIGNoYXIiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfVUNIQVI7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJmbG9hdCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19SRUFMNDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImRvdWJsZSIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gdmF4X2dfZG91YmxlcyA/IERCR19TX0NfUkVBTDhfRyA6IERCR19TX0NfUkVBTDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGRvdWJsZSIpKQotCXsKLQkgIC8qIHNhbWUgYXMgZG91YmxlLCBhdCBsZWFzdCBmb3Igbm93ICovCi0JICBzcG50LT5WTVNfdHlwZSA9IHZheF9nX2RvdWJsZXMgPyBEQkdfU19DX1JFQUw4X0cgOiBEQkdfU19DX1JFQUw4OwotCSAgc3BudC0+ZGF0YV9zaXplID0gODsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgibG9uZyBsb25nIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TUVVBRDsJLyogc2lnbmVkIHF1YWR3b3JkICovCi0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGxvbmcgdW5zaWduZWQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1VRVUFEOwkvKiB1bnNpZ25lZCBxdWFkd29yZCAqLwotCSAgc3BudC0+ZGF0YV9zaXplID0gODsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY29tcGxleCBmbG9hdCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19DT01QTFg0OwotCSAgc3BudC0+ZGF0YV9zaXplID0gMiAqIDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImNvbXBsZXggZG91YmxlIikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSB2YXhfZ19kb3VibGVzID8gREJHX1NfQ19DT01QTFg4X0cgOiBEQkdfU19DX0NPTVBMWDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAyICogODsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY29tcGxleCBsb25nIGRvdWJsZSIpKQotCXsKLQkgIC8qIHNhbWUgYXMgY29tcGxleCBkb3VibGUsIGF0IGxlYXN0IGZvciBub3cgKi8KLQkgIHNwbnQtPlZNU190eXBlID0gdmF4X2dfZG91YmxlcyA/IERCR19TX0NfQ09NUExYOF9HIDogREJHX1NfQ19DT01QTFg4OwotCSAgc3BudC0+ZGF0YV9zaXplID0gMiAqIDg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCVtwcl0KLQkgICAqIFNob3VsZG4ndCBnZXQgaGVyZSwgYnV0IGlmIHdlIGRvLCBzb21ldGhpbmcKLQkgICAqIG1vcmUgc3Vic3RhbnRpYWwgb3VnaHQgdG8gYmUgZG9uZS4uLgotCSAgICovCi0JICBzcG50LT5WTVNfdHlwZSA9IDA7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAwOwotCX0KLSAgICAgIGlmIChzcG50LT5WTVNfdHlwZSAhPSAwKQotCXNldHVwX2Jhc2ljX3R5cGUgKHNwbnQpOwotICAgICAgcG50MSA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOycpICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ3UnOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSAoKnBudCA9PSAncycpID8gU1RSVUNUIDogVU5JT047Ci0gICAgICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfQURWQU5DRURfVFlQRTsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPmRhdGFfc2l6ZSk7Ci0gICAgICBpZiAoIWZpbmFsX3Bhc3MgJiYgZm9yd2FyZF9yZWZlcmVuY2UgKHBudCkpCi0JewotCSAgc3BudC0+c3RydWNfbnVtYiA9IC0xOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgc3BudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICAgICAgcG50MS0tOwotICAgICAgcG50ID0gZ2V0X3N0cnVjdF9uYW1lIChzdHIpOwotICAgICAgVk1TX0RlZl9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOwotICAgICAgaSA9IDA7Ci0gICAgICBmb3IgKGZwbnQgPSBmX3JlZl9yb290OyBmcG50OyBmcG50ID0gZnBudC0+bmV4dCkKLQlpZiAoZnBudC0+ZGJ4X3R5cGUgPT0gc3BudC0+ZGJ4X3R5cGUpCi0JICB7Ci0JICAgIGZwbnQtPnJlc29sdmVkID0gJ1knOwotCSAgICBWTVNfU2V0X1N0cnVjdCAoZnBudC0+c3RydWNfbnVtYik7Ci0JICAgIFZNU19TdG9yZV9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOwotCSAgICBpKys7Ci0JICB9Ci0gICAgICBpZiAoaSA+IDApCi0JVk1TX1NldF9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOwotICAgICAgaSA9IDA7Ci0gICAgICBMb2NhbFtpKytdID0gMTEgKyBzdHJsZW4gKHBudCk7Ci0gICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfU1RBUlQ7Ci0gICAgICBMb2NhbFtpKytdID0gRFNUX0tfVkZMQUdTX05PVkFMOwkvKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvbmx5ICovCi0gICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgMEwpOwkvKiBoZW5jZSB2YWx1ZSBpcyB1bnVzZWQgKi8KLSAgICAgIGkgKz0gNDsKLSAgICAgIExvY2FsW2krK10gPSBzdHJsZW4gKHBudCk7Ci0gICAgICBwbnQyID0gcG50OwotICAgICAgd2hpbGUgKCpwbnQyICE9ICdcMCcpCi0JTG9jYWxbaSsrXSA9ICpwbnQyKys7Ci0gICAgICBpMiA9IHNwbnQtPmRhdGFfc2l6ZSAqIDg7CS8qIG51bWJlciBvZiBiaXRzICovCi0gICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgaTIpOwotICAgICAgaSArPSA0OwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICBpZiAocG50ICE9IHN5bWJvbF9uYW1lKQotCXsKLQkgIHBudCArPSBzdHJsZW4gKHBudCk7Ci0JICAqcG50ID0gJzonOwotCX0JCQkvKiByZXBsYWNlIGNvbG9uIGZvciBsYXRlciAqLwotICAgICAgd2hpbGUgKCorK3BudDEgIT0gJzsnKQotCXsKLQkgIHBudCA9IChjaGFyICopIHN0cmNociAocG50MSwgJzonKTsKLQkgICpwbnQgPSAnXDAnOwotCSAgcG50MiA9IHBudDE7Ci0JICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZkdHlwZSk7Ci0JICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEgKyAxLCAmaTIpOwotCSAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQxICsgMSwgJmkzKTsKLQkgIHNwbnQxID0gZmluZF9zeW1ib2wgKGR0eXBlKTsKLQkgIGxlbiA9IHN0cmxlbiAocG50Mik7Ci0JICBpZiAoc3BudDEgJiYgKHNwbnQxLT5hZHZhbmNlZCA9PSBCQVNJQyB8fCBzcG50MS0+YWR2YW5jZWQgPT0gRU5VTSkKLQkgICAgICAmJiAoKGkzICE9IHNwbnQxLT5kYXRhX3NpemUgKiA4KSB8fCAoaTIgJSA4ICE9IDApKSkKLQkgICAgewkJCS8qIGJpdGZpZWxkICovCi0JICAgICAgaWYgKFVTRV9CSVRTVFJJTkdfREVTQ1JJUFRPUiAoc3BudDEpKQotCQl7Ci0JCSAgLyogVGhpcyB1c2VzIGEgdHlwZSBkZXNjcmlwdG9yLCB3aGljaCBkb2Vzbid0IHdvcmsgaWYKLQkJICAgICB0aGUgZW5jbG9zaW5nIHN0cnVjdHVyZSBoYXMgYmVlbiBwbGFjZWQgaW4gYSByZWdpc3Rlci4KLQkJICAgICBBbHNvLCBlbnVtIGJpdGZpZWxkcyBkZWdlbmVyYXRlIHRvIHNpbXBsZSBpbnRlZ2Vycy4gICovCi0JCSAgaW50IHVuc2lnbmVkX3R5cGUgPSAoc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVUxJTlQKLQkJCQkgICAgfHwgc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVVNJTlQKLQkJCQkgICAgfHwgc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVUNIQVIKLQkJCQkgICAgfHwgc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVVFVQUQKLQkJCQkgICAgfHwgc3BudDEtPmFkdmFuY2VkID09IEVOVU0pOyAvKiAoYXBwcm94aW1hdGUpICovCi0JCSAgQXBvaW50ID0gMDsKLQkJICBmcHVzaCAoMTkgKyBsZW4sIDEpOwotCQkgIGZwdXNoICh1bnNpZ25lZF90eXBlID8gREJHX1NfQ19VQklUVSA6IERCR19TX0NfU0JJVFUsIDEpOwotCQkgIGZwdXNoIChEU1RfS19WRkxBR1NfRFNDLCAxKTsJLyogc3BlY2lmaWVkIGJ5IGRlc2NyaXB0b3IgKi8KLQkJICBmcHVzaCAoMSArIGxlbiwgNCk7CS8qIHJlbGF0aXZlIG9mZnNldCB0byBkZXNjcmlwdG9yICovCi0JCSAgZnB1c2ggKGxlbiwgMSk7CQkvKiBsZW5ndGggYnl0ZSAoYXNjaWMgcHJlZml4KSAqLwotCQkgIHdoaWxlICgqcG50MiAhPSAnXDAnKQkvKiBuYW1lIGJ5dGVzICovCi0JCSAgICBmcHVzaCAoKnBudDIrKywgMSk7Ci0JCSAgZnB1c2ggKGkzLCAyKTsJLyogZHNjIGxlbmd0aCA9PSBzaXplIG9mIGJpdGZpZWxkICovCi0JCQkJCS8qIGRzYyB0eXBlID09IHVuP3NpZ25lZCBiaXRmaWVsZCAqLwotCQkgIGZwdXNoICh1bnNpZ25lZF90eXBlID8gREJHX1NfQ19VQklUVSA6IERCR19TX0NfU0JJVFUsIDEpOwotCQkgIGZwdXNoIChEU0NfS19DTEFTU19VQlMsIDEpOwkvKiBkc2MgY2xhc3MgPT0gdW5hbGlnbmVkIGJpdHN0cmluZyAqLwotCQkgIGZwdXNoICgweDAwLCA0KTsJCS8qIGRzYyBwb2ludGVyID09IHplcm9lcyAqLwotCQkgIGZwdXNoIChpMiwgNCk7CS8qIHN0YXJ0IHBvc2l0aW9uICovCi0JCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChBc3VmZml4LCBBcG9pbnQsIE9CSl9TX0NfREJHKTsKLQkJICBBcG9pbnQgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVXNlIGEgIm5vdmVsIGxlbmd0aCIgdHlwZSBzcGVjaWZpY2F0aW9uLCB3aGljaCB3b3JrcwotCQkgICAgIHJpZ2h0IGZvciByZWdpc3RlciBzdHJ1Y3R1cmVzIGFuZCBmb3IgZW51bSBiaXRmaWVsZHMKLQkJICAgICBidXQgcmVzdWx0cyBpbiBsYXJnZXIgb2JqZWN0IG1vZHVsZXMuICAqLwotCQkgIExvY2FsW2krK10gPSA3ICsgbGVuOwotCQkgIExvY2FsW2krK10gPSBEQkdfU19DX0FEVkFOQ0VEX1RZUEU7CS8qIHR5cGUgc3BlYyBmb2xsb3dzICovCi0JCSAgTG9jYWxbaSsrXSA9IERCR19TX0NfU1RSVUNUX0lURU07CS8qIHZhbHVlIGlzIGEgYml0IG9mZnNldCAqLwotCQkgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMik7CQkvKiBiaXQgb2Zmc2V0ICovCi0JCSAgaSArPSA0OwotCQkgIExvY2FsW2krK10gPSBzdHJsZW4gKHBudDIpOwotCQkgIHdoaWxlICgqcG50MiAhPSAnXDAnKQotCQkgICAgTG9jYWxbaSsrXSA9ICpwbnQyKys7Ci0JCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotCQkgIGkgPSAwOwotCQkgIGJpdGZpZWxkX3N1ZmZpeCAoc3BudDEsIGkzKTsKLQkgICAgIH0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7CQkJLyogbm90IGEgYml0ZmllbGQgKi8KLQkgICAgICAvKiBjaGVjayBpZiB0aGlzIGlzIGEgZm9yd2FyZCByZWZlcmVuY2UgKi8KLQkgICAgICBpZiAoZmluYWxfcGFzcyAmJiBmaW5hbF9mb3J3YXJkX3JlZmVyZW5jZSAoc3BudDEpKQotCQl7Ci0JCSAgYXNfdHNrdHNrIChfKCJkZWJ1Z2dlciBvdXRwdXQ6IHN0cnVjdHVyZSBlbGVtZW50IGAlcycgaGFzIHVuZGVmaW5lZCB0eXBlIiksCi0JCQkgICBwbnQyKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIExvY2FsW2krK10gPSA3ICsgbGVuOwotCSAgICAgIExvY2FsW2krK10gPSBzcG50MSA/IHNwbnQxLT5WTVNfdHlwZSA6IERCR19TX0NfQURWQU5DRURfVFlQRTsKLQkgICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfSVRFTTsKLQkgICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgaTIpOwkJLyogYml0IG9mZnNldCAqLwotCSAgICAgIGkgKz0gNDsKLQkgICAgICBMb2NhbFtpKytdID0gc3RybGVuIChwbnQyKTsKLQkgICAgICB3aGlsZSAoKnBudDIgIT0gJ1wwJykKLQkJTG9jYWxbaSsrXSA9ICpwbnQyKys7Ci0JICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotCSAgICAgIGkgPSAwOwotCSAgICAgIGlmICghc3BudDEpCi0JCWdlbmVyYXRlX3N1ZmZpeCAoc3BudDEsIGR0eXBlKTsKLQkgICAgICBlbHNlIGlmIChzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19BRFZBTkNFRF9UWVBFKQotCQlnZW5lcmF0ZV9zdWZmaXggKHNwbnQxLCAwKTsKLQkgICAgfQotCX0KLSAgICAgIHBudDErKzsKLSAgICAgIExvY2FsW2krK10gPSAweDAxOwkvKiBsZW5ndGggYnl0ZSAqLwotICAgICAgTG9jYWxbaSsrXSA9IERCR19TX0NfU1RSVUNUX0VORDsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgICAgIGkgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZSc6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IEVOVU07Ci0gICAgICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfQURWQU5DRURfVFlQRTsKLSAgICAgIHNwbnQtPnN0cnVjX251bWIgPSArK3N0cnVjdHVyZV9jb3VudDsKLSAgICAgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0gICAgICBWTVNfRGVmX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIGZvciAoZnBudCA9IGZfcmVmX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQotCWlmIChmcG50LT5kYnhfdHlwZSA9PSBzcG50LT5kYnhfdHlwZSkKLQkgIHsKLQkgICAgZnBudC0+cmVzb2x2ZWQgPSAnWSc7Ci0JICAgIFZNU19TZXRfU3RydWN0IChmcG50LT5zdHJ1Y19udW1iKTsKLQkgICAgVk1TX1N0b3JlX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0JICAgIGkrKzsKLQkgIH0KLSAgICAgIGlmIChpID4gMCkKLQlWTVNfU2V0X1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIGxlbiA9IHN0cmxlbiAoc3ltYm9sX25hbWUpOwotICAgICAgTG9jYWxbaSsrXSA9IDMgKyBsZW47Ci0gICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19FTlVNX1NUQVJUOwotICAgICAgTG9jYWxbaSsrXSA9IDQgKiA4OwkJLyogZW51bSB2YWx1ZXMgYXJlIDMyIGJpdHMgKi8KLSAgICAgIExvY2FsW2krK10gPSBsZW47Ci0gICAgICBwbnQyID0gc3ltYm9sX25hbWU7Ci0gICAgICB3aGlsZSAoKnBudDIgIT0gJ1wwJykKLQlMb2NhbFtpKytdID0gKnBudDIrKzsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgICAgIGkgPSAwOwotICAgICAgd2hpbGUgKCorK3BudCAhPSAnOycpCi0JewotCSAgcG50MSA9IChjaGFyICopIHN0cmNociAocG50LCAnOicpOwotCSAgKnBudDErKyA9ICdcMCc7Ci0JICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEsICZpMSk7Ci0JICBsZW4gPSBzdHJsZW4gKHBudCk7Ci0JICBMb2NhbFtpKytdID0gNyArIGxlbjsKLQkgIExvY2FsW2krK10gPSBEQkdfU19DX0VOVU1fSVRFTTsKLQkgIExvY2FsW2krK10gPSBEU1RfS19WQUxLSU5EX0xJVEVSQUw7Ci0JICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgaTEpOwotCSAgaSArPSA0OwotCSAgTG9jYWxbaSsrXSA9IGxlbjsKLQkgIHBudDIgPSBwbnQ7Ci0JICB3aGlsZSAoKnBudCAhPSAnXDAnKQotCSAgICBMb2NhbFtpKytdID0gKnBudCsrOwotCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotCSAgaSA9IDA7Ci0JICBwbnQgPSBwbnQxOwkJLyogU2tpcCBmaW5hbCBzZW1pY29sb24gKi8KLQl9Ci0gICAgICBMb2NhbFtpKytdID0gMHgwMTsJLyogbGVuIGJ5dGUgKi8KLSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX0VOVU1fRU5EOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICBwbnQxID0gcG50ICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2EnOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBBUlJBWTsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChwbnQsICc7Jyk7Ci0gICAgICBpZiAoIXBudCkKLQlyZXR1cm4gMTsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPmluZGV4X21pbik7Ci0gICAgICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEgKyAxLCAmc3BudC0+aW5kZXhfbWF4KTsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSArIDEsICZzcG50LT50eXBlMik7Ci0gICAgICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHN0ciArIDEsICc9Jyk7Ci0gICAgICBpZiAocG50ICYmIFZNU190eXBlZGVmX3BhcnNlIChwbnQpID09IDEpCi0JcmV0dXJuIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gRlVOQ1RJT047Ci0gICAgICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfRlVOQ1RJT05fQUREUjsKLSAgICAgIC8qIHRoaXMgbWFzcXVlcmFkZXMgYXMgYSBiYXNpYyB0eXBlKi8KLSAgICAgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0gICAgICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZzcG50LT50eXBlMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcqJzoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gUE9JTlRFUjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgc3BudC0+ZGF0YV9zaXplID0gNDsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPnR5cGUyKTsKLSAgICAgIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyICsgMSwgJz0nKTsKLSAgICAgIGlmIChwbnQgJiYgVk1TX3R5cGVkZWZfcGFyc2UgKHBudCkgPT0gMSkKLQlyZXR1cm4gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IFVOS05PV047Ci0gICAgICBzcG50LT5WTVNfdHlwZSA9IDA7Ci0gICAgICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB0eXBlIG9mIHZhcmlhYmxlLiIpLAotCQkgc3BudC0+ZGJ4X3R5cGUpOwotICAgICAgcmV0dXJuIDE7CQkJLyogdW5hYmxlIHRvIGRlY2lwaGVyICovCi0gICAgfQotICAvKiBUaGlzIHJlbW92ZXMgdGhlIGV2aWRlbmNlIG9mIHRoZSBkZWZpbml0aW9uIHNvIHRoYXQgdGhlIG91dGVyIGxldmVscwotICAgICBvZiBwYXJzaW5nIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0LiAgKi8KLSAgcG50ID0gc3RyOwotICB3aGlsZSAoKnBudDEgIT0gJ1wwJykKLSAgICAqcG50KysgPSAqcG50MSsrOwotICAqcG50ID0gJ1wwJzsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhpcyBpcyB0aGUgcm9vdCByb3V0aW5lIHRoYXQgcGFyc2VzIHRoZSBzdGFicyBlbnRyaWVzIGZvciBkZWZpbml0aW9ucy4KLSAgIGl0IGNhbGxzIFZNU190eXBlZGVmX3BhcnNlLCB3aGljaCBjYW4gaW4gdHVybiBjYWxsIGl0c2VsZi4gIFdlIG5lZWQgdG8KLSAgIGJlIGNhcmVmdWwsIHNpbmNlIHNvbWV0aW1lcyB0aGVyZSBhcmUgZm9yd2FyZCByZWZlcmVuY2VzIHRvIG90aGVyIHN5bWJvbAotICAgdHlwZXMsIGFuZCB0aGVzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdW50aWwgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlIHBhcnNlLgotCi0gICBBbHNvIGNoZWNrIGFuZCBzZWUgaWYgd2UgYXJlIHVzaW5nIGNvbnRpbnVhdGlvbiBzdGFicywgaWYgd2UgYXJlLCB0aGVuCi0gICBwYXN0ZSB0b2dldGhlciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBzdGFiIGJlZm9yZSB3ZSBwYXNzIGl0IHRvCi0gICBWTVNfdHlwZWRlZl9wYXJzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfTFNZTV9QYXJzZSAoKQotewotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNoYXIgKnBudDI7Ci0gIGNoYXIgKnN0cjsKLSAgY2hhciAqcGFyc2VfYnVmZmVyID0gMDsKLSAgY2hhciBmaXhpdFsxMF07Ci0gIGludCBpbmNvbXBsZXRlLCBwYXNzLCBpbmNvbTE7Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqZnBudDsKLSAgc3ltYm9sUyAqc3A7Ci0KLSAgcGFzcyA9IDA7Ci0gIGZpbmFsX3Bhc3MgPSAwOwotICBpbmNvbXBsZXRlID0gMDsKLSAgZG8KLSAgICB7Ci0gICAgICBpbmNvbTEgPSBpbmNvbXBsZXRlOwotICAgICAgaW5jb21wbGV0ZSA9IDA7Ci0gICAgICBmb3IgKHNwID0gc3ltYm9sX3Jvb3RQOyBzcDsgc3AgPSBzeW1ib2xfbmV4dCAoc3ApKQotCXsKLQkgIC8qCi0JICAgKglEZWFsIHdpdGggU1RBQiBzeW1ib2xzCi0JICAgKi8KLQkgIGlmIChTX0lTX0RFQlVHIChzcCkpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqCURpc3BhdGNoIG9uIFNUQUIgdHlwZQotCSAgICAgICAqLwotCSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHNwKSkKLQkJewotCQljYXNlIE5fR1NZTToKLQkJY2FzZSBOX0xDU1lNOgotCQljYXNlIE5fU1RTWU06Ci0JCWNhc2UgTl9QU1lNOgotCQljYXNlIE5fUlNZTToKLQkJY2FzZSBOX0xTWU06Ci0JCWNhc2UgTl9GVU46CS8qc29tZXRpbWVzIHRoZXNlIGNvbnRhaW4gdHlwZWRlZnMqLwotCQkgIHN0ciA9IFNfR0VUX05BTUUgKHNwKTsKLQkJICBzeW1ib2xfbmFtZSA9IHN0cjsKLQkJICBwbnQgPSBzdHIgKyBzdHJsZW4gKHN0cikgLSAxOwotCQkgIGlmICgqcG50ID09ICc/JykgIC8qIENvbnRpbnVhdGlvbiBzdGFiLiAgKi8KLQkJICAgIHsKLQkJICAgICAgc3ltYm9sUyAqc3BuZXh0OwotCQkgICAgICBpbnQgdGxlbiA9IDA7Ci0KLQkJICAgICAgc3BuZXh0ID0gc3A7Ci0JCSAgICAgIGRvIHsKLQkJCXRsZW4gKz0gc3RybGVuIChzdHIpIC0gMTsKLQkJCXNwbmV4dCA9IHN5bWJvbF9uZXh0IChzcG5leHQpOwotCQkJc3RyID0gU19HRVRfTkFNRSAoc3BuZXh0KTsKLQkJCXBudCA9IHN0ciArIHN0cmxlbiAoc3RyKSAtIDE7Ci0JCSAgICAgIH0gd2hpbGUgKCpwbnQgPT0gJz8nKTsKLQkJICAgICAgdGxlbiArPSBzdHJsZW4gKHN0cik7Ci0JCSAgICAgIHBhcnNlX2J1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKHRsZW4gKyAxKTsKLQkJICAgICAgc3RyY3B5IChwYXJzZV9idWZmZXIsIFNfR0VUX05BTUUgKHNwKSk7Ci0JCSAgICAgIHBudDIgPSBwYXJzZV9idWZmZXIgKyBzdHJsZW4gKHBhcnNlX2J1ZmZlcikgLSAxOwotCQkgICAgICAqcG50MiA9ICdcMCc7Ci0JCSAgICAgIHNwbmV4dCA9IHNwOwotCQkgICAgICBkbyB7Ci0JCQlzcG5leHQgPSBzeW1ib2xfbmV4dCAoc3BuZXh0KTsKLQkJCXN0ciA9IFNfR0VUX05BTUUgKHNwbmV4dCk7Ci0JCQlzdHJjYXQgKHBudDIsIHN0cik7Ci0JCQlwbnQyICs9ICBzdHJsZW4gKHN0cikgLSAxOwotCQkJKnN0ciA9ICdcMCc7ICAvKiBFcmFzZSB0aGlzIHN0cmluZyAgKi8KLQkJICAgICAvKiBTX1NFVF9OQU1FIChzcG5leHQsIHN0cik7ICovCi0JCQlpZiAoKnBudDIgIT0gJz8nKSBicmVhazsKLQkJCSpwbnQyID0gJ1wwJzsKLQkJICAgICAgfSB3aGlsZSAoMSk7Ci0JCSAgICAgIHN0ciA9IHBhcnNlX2J1ZmZlcjsKLQkJICAgICAgc3ltYm9sX25hbWUgPSBzdHI7Ci0JCSAgICB9Ci0JCSAgaWYgKChwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHN0ciwgJzonKSkgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgKnBudCA9ICdcMCc7Ci0JCSAgICAgIHBudDEgPSBwbnQgKyAxOwotCQkgICAgICBpZiAoKHBudDIgPSAoY2hhciAqKSBzdHJjaHIgKHBudDEsICc9JykpICE9IDApCi0JCQlpbmNvbXBsZXRlICs9IFZNU190eXBlZGVmX3BhcnNlIChwbnQyKTsKLQkJICAgICAgaWYgKHBhcnNlX2J1ZmZlcikKLQkJCXsKLQkJCSAgLyogIEF0IHRoaXMgcG9pbnQgdGhlIHBhcnNlIGJ1ZmZlciBzaG91bGQganVzdAotCQkJICAgICAgY29udGFpbiBuYW1lOm5uLiAgSWYgaXQgZG9lcyBub3QsIHRoZW4gd2UKLQkJCSAgICAgIGFyZSBpbiByZWFsIHRyb3VibGUuICBBbnl3YXksIHRoaXMgaXMgYWx3YXlzCi0JCQkgICAgICBzaG9ydGVyIHRoYW4gdGhlIG9yaWdpbmFsIGxpbmUuICAqLwotCQkJICBwbnQyID0gU19HRVRfTkFNRSAoc3ApOwotCQkJICBzdHJjcHkgKHBudDIsIHBhcnNlX2J1ZmZlcik7Ci0JCSAgICAgICAvKiBTX1NFVF9OQU1FIChzcCwgcG50Mik7ICovCi0JCQkgIGZyZWUgKHBhcnNlX2J1ZmZlciksICBwYXJzZV9idWZmZXIgPSAwOwotCQkJfQotCQkgICAgICAqcG50ID0gJzonOwkvKiBwdXQgYmFjayBjb2xvbiB0byByZXN0b3JlIGRieF90eXBlICovCi0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0JCS8qc3dpdGNoKi8KLQkgICAgfQkJCS8qIGlmICovCi0JfQkJCS8qZm9yKi8KLSAgICAgIHBhc3MrKzsKLSAgICAgIC8qCi0gICAgICAgKiBNYWtlIG9uZSBsYXN0IHBhc3MsIGlmIG5lZWRlZCwgYW5kIGRlZmluZSB3aGF0ZXZlciB3ZSBjYW4KLSAgICAgICAqIHRoYXQgaXMgbGVmdC4KLSAgICAgICAqLwotICAgICAgaWYgKGZpbmFsX3Bhc3MgPT0gMCAmJiBpbmNvbXBsZXRlID09IGluY29tMSkKLQl7Ci0JICBmaW5hbF9wYXNzID0gMTsKLQkgIGluY29tMSsrOwkvKiBGb3JjZSBvbmUgbGFzdCBwYXNzIHRocm91Z2ggKi8KLQl9Ci0gIH0gd2hpbGUgKGluY29tcGxldGUgIT0gMCAmJiBpbmNvbXBsZXRlICE9IGluY29tMSk7Ci0gIC8qIHJlcGVhdCB1bnRpbCBhbGwgcmVmcyByZXNvbHZlZCBpZiBwb3NzaWJsZSAqLwotLyoJaWYgKHBhc3MgPiAxKSBwcmludGYgKCIgUmVxdWlyZWQgJWQgcGFzc2VzXG4iLCBwYXNzKTsgKi8KLSAgaWYgKGluY29tcGxldGUgIT0gMCkKLSAgICB7Ci0gICAgICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIG91dHB1dDogVW5hYmxlIHRvIHJlc29sdmUgJWQgY2lyY3VsYXIgcmVmZXJlbmNlcy4iKSwKLQkJIGluY29tcGxldGUpOwotICAgIH0KLSAgZnBudCA9IGZfcmVmX3Jvb3Q7Ci0gIHN5bWJvbF9uYW1lID0gIlwwIjsKLSAgd2hpbGUgKGZwbnQpCi0gICAgewotICAgICAgaWYgKGZwbnQtPnJlc29sdmVkICE9ICdZJykKLQl7Ci0JICBpZiAoZmluZF9zeW1ib2wgKGZwbnQtPmRieF90eXBlKSkKLQkgICAgewotCSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgZm9yd2FyZCByZWZlcmVuY2UgZXJyb3IsIGRieCB0eXBlICVkIiksCi0JCQkgZnBudC0+ZGJ4X3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBmaXhpdFswXSA9IDA7Ci0JICBzcHJpbnRmICgmZml4aXRbMV0sICIlZD1zNDsiLCBmcG50LT5kYnhfdHlwZSk7Ci0JICBwbnQyID0gKGNoYXIgKikgc3RyY2hyICgmZml4aXRbMV0sICc9Jyk7Ci0JICBWTVNfdHlwZWRlZl9wYXJzZSAocG50Mik7Ci0JfQotICAgICAgZnBudCA9IGZwbnQtPm5leHQ7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1EZWZpbmVfTG9jYWxfU3ltYm9scyAoczBQLCBzMlAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqczBQLCAqczJQOwotICAgICBzeW1ib2xTICpDdXJyZW50X1JvdXRpbmU7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewotICBzeW1ib2xTICpzMVA7CQkvKiBlYWNoIHN5bWJvbCBmcm9tIHMwUCAuLiBzMlAgKGV4Y2x1c2l2ZSkgKi8KLQotICBmb3IgKHMxUCA9IHN5bWJvbF9uZXh0IChzMFApOyBzMVAgIT0gczJQOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKLSAgICB7Ci0gICAgICBpZiAoIXMxUCkKLQlicmVhazsJCS8qIGFuZCByZXR1cm4gKi8KLSAgICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoczFQKSA9PSBOX0ZVTikKLQl7Ci0JICBjaGFyICpwbnQgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHMxUCksICc6JykgKyAxOwotCSAgaWYgKCpwbnQgPT0gJ0YnIHx8ICpwbnQgPT0gJ2YnKSBicmVhazsKLQl9Ci0gICAgICBpZiAoIVNfSVNfREVCVUcgKHMxUCkpCi0JY29udGludWU7Ci0gICAgICAvKgotICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHMxUCkpCi0JewotCWRlZmF1bHQ6Ci0JICBjb250aW51ZTsJCS8qIG5vdCBsZWZ0IG9yIHJpZ2h0IGJyYWNlICovCi0KLQljYXNlIE5fTFNZTToKLQljYXNlIE5fUFNZTToKLQkgIFZNU19sb2NhbF9zdGFiX1BhcnNlIChzMVApOwotCSAgYnJlYWs7Ci0KLQljYXNlIE5fUlNZTToKLQkgIFZNU19SU1lNX1BhcnNlIChzMVAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICBicmVhazsKLQl9CQkJLypzd2l0Y2gqLwotICAgIH0JCQkJLyogZm9yICovCi19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBjcmF3bHMgdGhlIHN5bWJvbCBjaGFpbiBzZWFyY2hpbmcgZm9yIGxvY2FsIHN5bWJvbHMgdGhhdAotICAgbmVlZCB0byBiZSBkZXNjcmliZWQgdG8gdGhlIGRlYnVnZ2VyLiAgV2hlbiB3ZSBlbnRlciBhIG5ldyBzY29wZSB3aXRoCi0gICBhICJ7IiwgaXQgY3JlYXRlcyBhIG5ldyAiYmxvY2siLCB3aGljaCBoZWxwcyB0aGUgZGVidWdnZXIga2VlcCB0cmFjawotICAgb2Ygd2hpY2ggc2NvcGUgd2UgYXJlIGN1cnJlbnRseSBpbi4gICovCi0KLXN0YXRpYyBzeW1ib2xTICoKLURlZmluZV9Sb3V0aW5lIChzMFAsIExldmVsLCBDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnMwUDsKLSAgICAgaW50IExldmVsOwotICAgICBzeW1ib2xTICpDdXJyZW50X1JvdXRpbmU7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewotICBzeW1ib2xTICpzMVA7Ci0gIHZhbHVlVCBPZmZzZXQ7Ci0gIGludCByY291bnQgPSAwOwotCi0gIGZvciAoczFQID0gc3ltYm9sX25leHQgKHMwUCk7IHMxUCAhPSAwOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHMxUCkgPT0gTl9GVU4pCi0JewotCSAgY2hhciAqcG50ID0gKGNoYXIgKikgc3RyY2hyIChTX0dFVF9OQU1FIChzMVApLCAnOicpICsgMTsKLQkgIGlmICgqcG50ID09ICdGJyB8fCAqcG50ID09ICdmJykgYnJlYWs7Ci0JfQotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzMVApKQotCWNvbnRpbnVlOwotICAgICAgLyoKLSAgICAgICAqCURpc3BhdGNoIG9uIFNUQUIgdHlwZQotICAgICAgICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzMVApKQotCXsKLQlkZWZhdWx0OgotCSAgY29udGludWU7CQkvKiBub3QgbGVmdCBvciByaWdodCBicmFjZSAqLwotCi0JY2FzZSBOX0xCUkFDOgotCSAgaWYgKExldmVsICE9IDApCi0JICAgIHsKLQkgICAgICBjaGFyIHN0clsxMF07Ci0JICAgICAgc3ByaW50ZiAoc3RyLCAiJCVkIiwgcmNvdW50KyspOwotCSAgICAgIFZNU19UQlRfQmxvY2tfQmVnaW4gKHMxUCwgVGV4dF9Qc2VjdCwgc3RyKTsKLQkgICAgfQotCSAgT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHMxUCk7CS8qIHNpZGUtZWZmZWN0OiBmdWxseSByZXNvbHZlIHN5bWJvbCAqLwotCSAgRGVmaW5lX0xvY2FsX1N5bWJvbHMgKHMwUCwgczFQLCBDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpOwotCSAgczFQID0gRGVmaW5lX1JvdXRpbmUgKHMxUCwgTGV2ZWwgKyAxLCBDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpOwotCSAgaWYgKExldmVsICE9IDApCi0JICAgIFZNU19UQlRfQmxvY2tfRW5kIChTX0dFVF9WQUxVRSAoczFQKSAtIE9mZnNldCk7Ci0JICBzMFAgPSBzMVA7Ci0JICBicmVhazsKLQotCWNhc2UgTl9SQlJBQzoKLQkgIHJldHVybiBzMVA7Ci0JfQkJCS8qc3dpdGNoKi8KLSAgICB9CQkJCS8qIGZvciAqLwotCi0gIC8qIFdlIGVuZCB1cCBoZXJlIGlmIHRoZXJlIHdlcmUgbm8gYnJhY2tldHMgaW4gdGhpcyBmdW5jdGlvbi4KLSAgICAgRGVmaW5lIGV2ZXJ5dGhpbmcuICAqLwotICBEZWZpbmVfTG9jYWxfU3ltYm9scyAoczBQLCAoc3ltYm9sUyAqKTAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0gIHJldHVybiBzMVA7Ci19Ci0MCi0KLSNpZm5kZWYgVk1TCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotc3RhdGljIHZvaWQgZ2V0X1ZNU190aW1lX29uX3VuaXggUEFSQU1TICgoY2hhciAqKSk7Ci0KLS8qIE1hbnVmYWN0dXJlIGEgVk1TLWxpa2UgdGltZSBzdHJpbmcgb24gYSBVbml4IGJhc2VkIHN5c3RlbS4gICovCi1zdGF0aWMgdm9pZAotZ2V0X1ZNU190aW1lX29uX3VuaXggKE5vdykKLSAgICAgY2hhciAqTm93OwotewotICBjaGFyICpwbnQ7Ci0gIHRpbWVfdCB0aW1lYjsKLQotICB0aW1lICgmdGltZWIpOwotICBwbnQgPSBjdGltZSAoJnRpbWViKTsKLSAgcG50WzNdID0gMDsKLSAgcG50WzddID0gMDsKLSAgcG50WzEwXSA9IDA7Ci0gIHBudFsxNl0gPSAwOwotICBwbnRbMjRdID0gMDsKLSAgc3ByaW50ZiAoTm93LCAiJTJzLSUzcy0lcyAlcyIsIHBudCArIDgsIHBudCArIDQsIHBudCArIDIwLCBwbnQgKyAxMSk7Ci19Ci0jZW5kaWYgLyogbm90IFZNUyAqLwotCi0KLS8qIFdyaXRlIHRoZSBNSEQgKE1vZHVsZSBIZWFkZXIpIHJlY29yZHMuICAqLwotCi1zdGF0aWMgdm9pZAotV3JpdGVfVk1TX01IRF9SZWNvcmRzICgpCi17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmNwOwotICByZWdpc3RlciBjaGFyICpjcDE7Ci0gIHJlZ2lzdGVyIGludCBpOwotI2lmZGVmIFZNUwotICBzdHJ1Y3QgeyB1bnNpZ25lZCBzaG9ydCBsZW4sIG1iejsgY2hhciAqcHRyOyB9IERlc2NyaXB0b3I7Ci0jZW5kaWYKLSAgY2hhciBOb3dbMTcrMV07Ci0KLSAgLyogV2UgYXJlIHdyaXRpbmcgYSBtb2R1bGUgaGVhZGVyIHJlY29yZC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0hEUik7Ci0gIC8qCi0gICAqCSoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgkqTUFJTiBNT0RVTEUgSEVBREVSIFJFQ09SRCoKLSAgICoJKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqLwotICAvKiBTdG9yZSByZWNvcmQgdHlwZSBhbmQgaGVhZGVyIHR5cGUuICAqLwotICBQVVRfQ0hBUiAoT0JKX1NfQ19IRFIpOwotICBQVVRfQ0hBUiAoTUhEX1NfQ19NSEQpOwotICAvKiBTdHJ1Y3R1cmUgbGV2ZWwgaXMgMC4gICovCi0gIFBVVF9DSEFSIChPQkpfU19DX1NUUkxWTCk7Ci0gIC8qIE1heGltdW0gcmVjb3JkIHNpemUgaXMgc2l6ZSBvZiB0aGUgb2JqZWN0IHJlY29yZCBidWZmZXIuICAqLwotICBQVVRfU0hPUlQgKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpKTsKLQotCS8qCi0JICoJRklYTUU6ICBtb2R1bGUgbmFtZSBhbmQgdmVyc2lvbiBzaG91bGQgYmUgdXNlcgotCSAqCQlzcGVjaWZpYWJsZSB2aWEgYC5pZGVudCcgYW5kL29yIGAjcHJhZ21hIGlkZW50Jy4KLQkgKi8KLQotICAvKiBHZXQgbW9kdWxlIG5hbWUgKHRoZSBGSUxFTkFNRSBwYXJ0IG9mIHRoZSBvYmplY3QgZmlsZSkuICAqLwotICBjcCA9IG91dF9maWxlX25hbWU7Ci0gIGNwMSA9IE1vZHVsZV9OYW1lOwotICB3aGlsZSAoKmNwKQotICAgIHsKLSAgICAgIGlmICgqY3AgPT0gJ10nIHx8ICpjcCA9PSAnPicgfHwgKmNwID09ICc6JyB8fCAqY3AgPT0gJy8nKQotCXsKLQkgIGNwMSA9IE1vZHVsZV9OYW1lOwotCSAgY3ArKzsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgICpjcDErKyA9IGlzbG93ZXIgKCpjcCkgPyB0b3VwcGVyICgqY3ArKykgOiAqY3ArKzsKLSAgICB9Ci0gICpjcDEgPSAnXDAnOwotCi0gIC8qIExpbWl0IGl0IHRvIDMxIGNoYXJhY3RlcnMgYW5kIHN0b3JlIGluIHRoZSBvYmplY3QgcmVjb3JkLiAgKi8KLSAgd2hpbGUgKC0tY3AxID49IE1vZHVsZV9OYW1lKQotICAgIGlmICgqY3AxID09ICcuJykKLSAgICAgICpjcDEgPSAnXDAnOwotICBpZiAoc3RybGVuIChNb2R1bGVfTmFtZSkgPiAzMSkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JYXNfdHNrdHNrIChfKCJNb2R1bGUgbmFtZSB0cnVuY2F0ZWQ6ICVzXG4iKSwgTW9kdWxlX05hbWUpOwotICAgICAgTW9kdWxlX05hbWVbMzFdID0gJ1wwJzsKLSAgICB9Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTW9kdWxlX05hbWUpOwotICAvKiBNb2R1bGUgVmVyc2lvbiBpcyAiVjEuMCIuICAqLwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKCJWMS4wIik7Ci0gIC8qIENyZWF0aW9uIHRpbWUgaXMgIm5vdyIgKDE3IGNoYXJzIG9mIHRpbWUgc3RyaW5nKTogImRkLU1NTS15eXl5IGhoOm1tIi4gICovCi0jaWZuZGVmIFZNUwotICBnZXRfVk1TX3RpbWVfb25fdW5peCAoTm93KTsKLSNlbHNlIC8qIFZNUyAqLwotICBEZXNjcmlwdG9yLmxlbiA9IHNpemVvZiBOb3cgLSAxOwotICBEZXNjcmlwdG9yLm1ieiA9IDA7CQkvKiB0eXBlICYgY2xhc3MgdW5zcGVjaWZpZWQgKi8KLSAgRGVzY3JpcHRvci5wdHIgPSBOb3c7Ci0gICh2b2lkKSBzeXMkYXNjdGltICgodW5zaWduZWQgc2hvcnQgKikwLCAmRGVzY3JpcHRvciwgKGxvbmcgKikwLCAwKTsKLSNlbmRpZiAvKiBWTVMgKi8KLSAgZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCi0gICAgUFVUX0NIQVIgKE5vd1tpXSk7Ci0gIC8qIFBhdGNoIHRpbWUgaXMgIm5ldmVyIiAoMTcgemVyb3MpLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCi0gICAgUFVUX0NIQVIgKDApOwotICAvKiBGb3JjZSB0aGlzIHRvIGJlIGEgc2VwYXJhdGUgb3V0cHV0IHJlY29yZC4gICovCi0gIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLQotICAvKgotICAgKgkqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCSpMQU5HVUFHRSBQUk9DRVNTT1IgTkFNRSoKLSAgICoJKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKi8KLSAgLyogU3RvcmUgcmVjb3JkIHR5cGUgYW5kIGhlYWRlciB0eXBlLiAgKi8KLSAgUFVUX0NIQVIgKE9CSl9TX0NfSERSKTsKLSAgUFVUX0NIQVIgKE1IRF9TX0NfTE5NKTsKLSAgLyoKLSAgICogU3RvcmUgbGFuZ3VhZ2UgcHJvY2Vzc29yIG5hbWUgYW5kIHZlcnNpb24gKG5vdCBhIGNvdW50ZWQgc3RyaW5nISkuCi0gICAqCi0gICAqIFRoaXMgaXMgbm9ybWFsbHkgc3VwcGxpZWQgYnkgdGhlIGdjYyBkcml2ZXIgZm9yIHRoZSBjb21tYW5kIGxpbmUKLSAgICogd2hpY2ggaW52b2tlcyBnYXMuICBJZiBhYnNlbnQsIHdlIGZhbGwgYmFjayB0byBnYXMncyB2ZXJzaW9uLgotICAgKi8KLSAgY3AgPSBjb21waWxlcl92ZXJzaW9uX3N0cmluZzsKLSAgaWYgKGNwID09IDApCi0gICAgewotICAgICAgY3AgPSAiR05VIEFTICBWIjsKLSAgICAgIHdoaWxlICgqY3ApCi0JUFVUX0NIQVIgKCpjcCsrKTsKLSAgICAgIGNwID0gVkVSU0lPTjsKLSAgICB9Ci0gIHdoaWxlICgqY3AgPj0gJyAnKQotICAgIFBVVF9DSEFSICgqY3ArKyk7Ci0gIC8qIEZvcmNlIHRoaXMgdG8gYmUgYSBzZXBhcmF0ZSBvdXRwdXQgcmVjb3JkLiAgKi8KLSAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotCi0KLS8qIFdyaXRlIHRoZSBFT00gKEVuZCBPZiBNb2R1bGUpIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1Xcml0ZV9WTVNfRU9NX1JlY29yZCAoUHNlY3QsIE9mZnNldCkKLSAgICAgaW50IFBzZWN0OwotICAgICB2YWx1ZVQgT2Zmc2V0OwotewotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhbiBlbmQtb2YtbW9kdWxlIHJlY29yZAotICAgKgkodGhpcyBhc3N1bWVzIHRoYXQgdGhlIGVudHJ5IHBvaW50IHdpbGwgYWx3YXlzIGJlIGluIGEgcHNlY3QKLSAgICoJIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGJ5dGUsIHdoaWNoIGlzIHRoZSBjYXNlIGZvciBjb2RlIGluCi0gICAqCSBUZXh0X1BzZWN0PT0wKQotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfRU9NKTsKLSAgUFVUX0NIQVIgKE9CSl9TX0NfRU9NKTsJLyogUmVjb3JkIHR5cGUuICAqLwotICBQVVRfQ0hBUiAoMCk7CQkJLyogRXJyb3Igc2V2ZXJpdHkgbGV2ZWwgKHdlIGlnbm9yZSBpdCkuICovCi0gIC8qCi0gICAqCVN0b3JlIHRoZSBlbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzCi0gICAqLwotICBpZiAoUHNlY3QgPj0gMCkKLSAgICB7Ci0gICAgICBQVVRfQ0hBUiAoUHNlY3QpOwotICAgICAgUFVUX0xPTkcgKE9mZnNldCk7Ci0gICAgfQotICAvKiBGbHVzaCB0aGUgcmVjb3JkOyB0aGlzIHdpbGwgYmUgb3VyIGZpbmFsIG91dHB1dC4gICovCi0gIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyogdGhpcyBoYXNoIHJvdXRpbmUgYm9ycm93ZWQgZnJvbSBHTlUtRU1BQ1MsIGFuZCBzdHJlbmd0aGVuZWQgc2xpZ2h0bHkgIEVSWSovCi0KLXN0YXRpYyBpbnQKLWhhc2hfc3RyaW5nIChwdHIpCi0gICAgIGNvbnN0IGNoYXIgKnB0cjsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gcCArIHN0cmxlbiAocHRyKTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOwotICByZWdpc3RlciBpbnQgaGFzaCA9IDA7Ci0KLSAgd2hpbGUgKHAgIT0gZW5kKQotICAgIHsKLSAgICAgIGMgPSAqcCsrOwotICAgICAgaGFzaCA9ICgoaGFzaCA8PCAzKSArIChoYXNoIDw8IDE1KSArIChoYXNoID4+IDI4KSArIGMpOwotICAgIH0KLSAgcmV0dXJuIGhhc2g7Ci19Ci0KLS8qCi0gKglHZW5lcmF0ZSBhIENhc2UtSGFja2VkIFZNUyBzeW1ib2wgbmFtZSAobGltaXRlZCB0byAzMSBjaGFycykKLSAqLwotc3RhdGljIHZvaWQKLVZNU19DYXNlX0hhY2tfU3ltYm9sIChJbiwgT3V0KQotICAgICByZWdpc3RlciBjb25zdCBjaGFyICpJbjsKLSAgICAgcmVnaXN0ZXIgY2hhciAqT3V0OwotewotICBsb25nIGludCBpbml0OwotICBsb25nIGludCByZXN1bHQ7Ci0gIGNoYXIgKnBudCA9IDA7Ci0gIGNoYXIgKm5ld19uYW1lOwotICBjb25zdCBjaGFyICpvbGRfbmFtZTsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGludCBkZXN0cnVjdG9yID0gMDsJCS8qaGFjayB0byBhbGxvdyBmb3IgY2FzZSBzZW5zIGluIGEgZGVzdHJ1Y3RvciovCi0gIGludCB0cnVuY2F0ZSA9IDA7Ci0gIGludCBDYXNlX0hhY2tfQml0cyA9IDA7Ci0gIGludCBTYXdfRG9sbGFyID0gMDsKLSAgc3RhdGljIGNoYXIgSGV4X1RhYmxlWzE2XSA9Ci0gIHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRid9OwotCi0gIC8qCi0gICAqCUtpbGwgYW55IGxlYWRpbmcgIl8iCi0gICAqLwotICBpZiAoKEluWzBdID09ICdfJykgJiYgKChJblsxXSA+ICc5JykgfHwgKEluWzFdIDwgJzAnKSkpCi0gICAgSW4rKzsKLQotICBuZXdfbmFtZSA9IE91dDsJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIqLwotCi0jaWYgYmFyZm9vCQkJLyogRGVhZCBjb2RlICovCi0gIGlmICgoSW5bMF0gPT0gJ18nKSAmJiAoSW5bMV0gPT0gJyQnKSAmJiAoSW5bMl0gPT0gJ18nKSkKLSAgICBkZXN0cnVjdG9yID0gMTsKLSNlbmRpZgotCi0gIC8qIFdlIG1heSBuZWVkIHRvIHRydW5jYXRlIHRoZSBzeW1ib2wsIHNhdmUgdGhlIGhhc2ggZm9yIGxhdGVyKi8KLSAgcmVzdWx0ID0gKHN0cmxlbiAoSW4pID4gMjMpID8gaGFzaF9zdHJpbmcgKEluKSA6IDA7Ci0gIC8qCi0gICAqCUlzIHRoZXJlIGEgUHNlY3QgQXR0cmlidXRlIHRvIHNraXA/PwotICAgKi8KLSAgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChJbikpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVllczogU2tpcCBpdAotICAgICAgICovCi0gICAgICBJbiArPSBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEg7Ci0gICAgICB3aGlsZSAoKkluKQotCXsKLQkgIGlmICgoSW5bMF0gPT0gJyQnKSAmJiAoSW5bMV0gPT0gJyQnKSkKLQkgICAgewotCSAgICAgIEluICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIEluKys7Ci0JfQotICAgIH0KLQotICBvbGRfbmFtZSA9IEluOwotLyoJaWYgKHN0cmxlbiAoSW4pID4gMzEgJiYgZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JICBhc190c2t0c2sgKCJTeW1ib2wgbmFtZSB0cnVuY2F0ZWQ6ICVzXG4iLCBJbik7ICovCi0gIC8qCi0gICAqCURvIHRoZSBjYXNlIGNvbnZlcnNpb24KLSAgICovCi0gIGkgPSAyMzsJCQkvKiBNYXhpbXVtIG9mIDIzIGNoYXJzICovCi0gIHdoaWxlICgqSW4gJiYgKC0taSA+PSAwKSkKLSAgICB7Ci0gICAgICBDYXNlX0hhY2tfQml0cyA8PD0gMTsKLSAgICAgIGlmICgqSW4gPT0gJyQnKQotCVNhd19Eb2xsYXIgPSAxOwotICAgICAgaWYgKChkZXN0cnVjdG9yID09IDEpICYmIChpID09IDIxKSkKLQlTYXdfRG9sbGFyID0gMDsKLSAgICAgIHN3aXRjaCAodm1zX25hbWVfbWFwcGluZykKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGlzdXBwZXIgKCpJbikpIHsKLQkgICAgKk91dCsrID0gKkluKys7Ci0JICAgIENhc2VfSGFja19CaXRzIHw9IDE7Ci0JICB9IGVsc2UgewotCSAgICAqT3V0KysgPSBpc2xvd2VyICgqSW4pID8gdG91cHBlciAoKkluKyspIDogKkluKys7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDM6ICpPdXQrKyA9ICpJbisrOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgaWYgKGlzbG93ZXIgKCpJbikpIHsKLQkgICAgKk91dCsrID0gKkluKys7Ci0JICB9IGVsc2UgewotCSAgICAqT3V0KysgPSBpc3VwcGVyICgqSW4pID8gdG9sb3dlciAoKkluKyspIDogKkluKys7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAvKgotICAgKglJZiB3ZSBzYXcgYSBkb2xsYXIgc2lnbiwgd2UgZG9uJ3QgZG8gY2FzZSBoYWNraW5nCi0gICAqLwotICBpZiAoZmxhZ19ub19oYXNoX21peGVkX2Nhc2UgfHwgU2F3X0RvbGxhcikKLSAgICBDYXNlX0hhY2tfQml0cyA9IDA7Ci0KLSAgLyoKLSAgICoJSWYgd2UgaGF2ZSBtb3JlIHRoYW4gMjMgY2hhcmFjdGVycyBhbmQgZXZlcnl0aGluZyBpcyBsb3dlcmNhc2UKLSAgICoJd2UgY2FuIGluc2VydCB0aGUgZnVsbCAzMSBjaGFyYWN0ZXJzCi0gICAqLwotICBpZiAoKkluKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglXZSAgaGF2ZSBtb3JlIHRoYW4gMjMgY2hhcmFjdGVycwotICAgICAgICogSWYgd2UgbXVzdCBhZGQgdGhlIGNhc2UgaGFjaywgdGhlbiB3ZSBoYXZlIHRydW5jYXRlZCB0aGUgc3RyCi0gICAgICAgKi8KLSAgICAgIHBudCA9IE91dDsKLSAgICAgIHRydW5jYXRlID0gMTsKLSAgICAgIGlmIChDYXNlX0hhY2tfQml0cyA9PSAwKQotCXsKLQkgIC8qCi0JICAgKglBbmQgc28gZmFyIHRoZXkgYXJlIGFsbCBsb3dlciBjYXNlOgotCSAgICoJCUNoZWNrIHVwIHRvIDggbW9yZSBjaGFyYWN0ZXJzCi0JICAgKgkJYW5kIGVuc3VyZSB0aGF0IHRoZXkgYXJlIGxvd2VyY2FzZQotCSAgICovCi0JICBmb3IgKGkgPSAwOyAoSW5baV0gIT0gMCkgJiYgKGkgPCA4KTsgaSsrKQotCSAgICBpZiAoaXN1cHBlciAoSW5baV0pICYmICFTYXdfRG9sbGFyICYmICFmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZSkKLQkgICAgICBicmVhazsKLQotCSAgaWYgKEluW2ldID09IDApCi0JICAgIHRydW5jYXRlID0gMDsKLQotCSAgaWYgKChpID09IDgpIHx8IChJbltpXSA9PSAwKSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICoJVGhleSBhcmU6ICBDb3B5IHVwIHRvIDMxIGNoYXJhY3RlcnMKLQkgICAgICAgKgkJCXRvIHRoZSBvdXRwdXQgc3RyaW5nCi0JICAgICAgICovCi0JICAgICAgaSA9IDg7Ci0JICAgICAgd2hpbGUgKCgtLWkgPj0gMCkgJiYgKCpJbikpCi0JCXN3aXRjaCAodm1zX25hbWVfbWFwcGluZyl7Ci0JCWNhc2UgMDogKk91dCsrID0gaXNsb3dlciAoKkluKSA/IHRvdXBwZXIgKCpJbisrKSA6ICpJbisrOwotCQkgIGJyZWFrOwotCQljYXNlIDM6ICpPdXQrKyA9ICpJbisrOwotCQkgIGJyZWFrOwotCQljYXNlIDI6ICpPdXQrKyA9IGlzdXBwZXIgKCpJbikgPyB0b2xvd2VyICgqSW4rKykgOiAqSW4rKzsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgLyoKLSAgICoJSWYgdGhlcmUgd2VyZSBhbnkgdXBwZXJjYXNlIGNoYXJhY3RlcnMgaW4gdGhlIG5hbWUgd2UKLSAgICoJdGFrZSBvbiB0aGUgY2FzZSBoYWNraW5nIHN0cmluZwotICAgKi8KLQotICAvKiBPbGQgYmVoYXZpb3IgZm9yIHJlZ3VsYXIgR05VLUMgY29tcGlsZXIgKi8KLSAgaWYgKCFmbGFnX2hhc2hfbG9uZ19uYW1lcykKLSAgICB0cnVuY2F0ZSA9IDA7Ci0gIGlmICgoQ2FzZV9IYWNrX0JpdHMgIT0gMCkgfHwgKHRydW5jYXRlID09IDEpKQotICAgIHsKLSAgICAgIGlmICh0cnVuY2F0ZSA9PSAwKQotCXsKLQkgICpPdXQrKyA9ICdfJzsKLQkgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JICAgIHsKLQkgICAgICAqT3V0KysgPSBIZXhfVGFibGVbQ2FzZV9IYWNrX0JpdHMgJiAweGZdOwotCSAgICAgIENhc2VfSGFja19CaXRzID4+PSA0OwotCSAgICB9Ci0JICAqT3V0KysgPSAnWCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIE91dCA9IHBudDsJCS8qQ3V0IGJhY2sgdG8gMjMgY2hhcmFjdGVycyBtYXhpbXVtICovCi0JICAqT3V0KysgPSAnXyc7Ci0JICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotCSAgICB7Ci0JICAgICAgaW5pdCA9IHJlc3VsdCAmIDB4MDFmOwotCSAgICAgICpPdXQrKyA9IChpbml0IDwgMTApID8gKCcwJyArIGluaXQpIDogKCdBJyArIGluaXQgLSAxMCk7Ci0JICAgICAgcmVzdWx0ID0gcmVzdWx0ID4+IDU7Ci0JICAgIH0KLQl9Ci0gICAgfQkJCQkvKkNhc2UgSGFjayAqLwotICAvKgotICAgKglEb25lCi0gICAqLwotICAqT3V0ID0gMDsKLSAgaWYgKHRydW5jYXRlID09IDEgJiYgZmxhZ19oYXNoX2xvbmdfbmFtZXMgJiYgZmxhZ19zaG93X2FmdGVyX3RydW5jKQotICAgIGFzX3Rza3RzayAoXygiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iKSwgb2xkX25hbWUsIG5ld19uYW1lKTsKLX0KLQwKLQotLyoKLSAqCVNjYW4gYSBzeW1ib2wgbmFtZSBmb3IgYSBwc2VjdCBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbgotICovCi0jZGVmaW5lIEdMT0JBTFNZTUJPTF9CSVQJMHgxMDAwMAotI2RlZmluZSBHTE9CQUxWQUxVRV9CSVQJCTB4MjAwMDAKLQotCi1zdGF0aWMgdm9pZAotVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzIChOYW1lLCBBdHRyaWJ1dGVfUG9pbnRlcikKLSAgICAgY29uc3QgY2hhciAqTmFtZTsKLSAgICAgaW50ICpBdHRyaWJ1dGVfUG9pbnRlcjsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmNwOwotICBpbnQgTmVnYXRlOwotICBzdGF0aWMgY29uc3Qgc3RydWN0Ci0gIHsKLSAgICBjb25zdCBjaGFyICpOYW1lOwotICAgIGludCBWYWx1ZTsKLSAgfSBBdHRyaWJ1dGVzW10gPQotICB7Ci0gICAgeyJQSUMiLCBHUFNfU19NX1BJQ30sCi0gICAgeyJMSUIiLCBHUFNfU19NX0xJQn0sCi0gICAgeyJPVlIiLCBHUFNfU19NX09WUn0sCi0gICAgeyJSRUwiLCBHUFNfU19NX1JFTH0sCi0gICAgeyJHQkwiLCBHUFNfU19NX0dCTH0sCi0gICAgeyJTSFIiLCBHUFNfU19NX1NIUn0sCi0gICAgeyJFWEUiLCBHUFNfU19NX0VYRX0sCi0gICAgeyJSRCIsIEdQU19TX01fUkR9LAotICAgIHsiV1JUIiwgR1BTX1NfTV9XUlR9LAotICAgIHsiVkVDIiwgR1BTX1NfTV9WRUN9LAotICAgIHsiR0xPQkFMU1lNQk9MIiwgR0xPQkFMU1lNQk9MX0JJVH0sCi0gICAgeyJHTE9CQUxWQUxVRSIsIEdMT0JBTFZBTFVFX0JJVH0sCi0gICAgezAsIDB9Ci0gIH07Ci0KLSAgLyoKLSAgICoJS2lsbCBsZWFkaW5nICJfIgotICAgKi8KLSAgaWYgKCpOYW1lID09ICdfJykKLSAgICBOYW1lKys7Ci0gIC8qCi0gICAqCUNoZWNrIGZvciBhIFBTRUNUIGF0dHJpYnV0ZSBsaXN0Ci0gICAqLwotICBpZiAoIUhBU19QU0VDVF9BVFRSSUJVVEVTIChOYW1lKSkKLSAgICByZXR1cm47CQkJLyogSWYgbm90LCByZXR1cm4gKi8KLSAgLyoKLSAgICoJU2tpcCB0aGUgYXR0cmlidXRlIGxpc3QgaW5kaWNhdG9yCi0gICAqLwotICBOYW1lICs9IFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSDsKLSAgLyoKLSAgICoJUHJvY2VzcyB0aGUgYXR0cmlidXRlcyAoIl8iIHNlcGFyYXRlZCwgIiQiIHRlcm1pbmF0ZWQpCi0gICAqLwotICB3aGlsZSAoKk5hbWUgIT0gJyQnKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglBc3N1bWUgbm90IG5lZ2F0aW5nCi0gICAgICAgKi8KLSAgICAgIE5lZ2F0ZSA9IDA7Ci0gICAgICAvKgotICAgICAgICoJQ2hlY2sgZm9yICJOTyIKLSAgICAgICAqLwotICAgICAgaWYgKChOYW1lWzBdID09ICdOJykgJiYgKE5hbWVbMV0gPT0gJ08nKSkKLQl7Ci0JICAvKgotCSAgICoJV2UgYXJlIG5lZ2F0aW5nIChhbmQgc2tpcCB0aGUgTk8pCi0JICAgKi8KLQkgIE5lZ2F0ZSA9IDE7Ci0JICBOYW1lICs9IDI7Ci0JfQotICAgICAgLyoKLSAgICAgICAqCUZpbmQgdGhlIHRva2VuIGRlbGltaXRlcgotICAgICAgICovCi0gICAgICBjcCA9IE5hbWU7Ci0gICAgICB3aGlsZSAoKmNwICYmICgqY3AgIT0gJ18nKSAmJiAoKmNwICE9ICckJykpCi0JY3ArKzsKLSAgICAgIC8qCi0gICAgICAgKglMb29rIGZvciB0aGUgdG9rZW4gaW4gdGhlIGF0dHJpYnV0ZSBsaXN0Ci0gICAgICAgKi8KLSAgICAgIGZvciAoaSA9IDA7IEF0dHJpYnV0ZXNbaV0uTmFtZTsgaSsrKQotCXsKLQkgIC8qCi0JICAgKglJZiB0aGUgc3RyaW5ncyBtYXRjaCwgc2V0L2NsZWFyIHRoZSBhdHRyLgotCSAgICovCi0JICBpZiAoc3RybmNtcCAoTmFtZSwgQXR0cmlidXRlc1tpXS5OYW1lLCBjcCAtIE5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqCVNldCBvciBjbGVhcgotCSAgICAgICAqLwotCSAgICAgIGlmIChOZWdhdGUpCi0JCSpBdHRyaWJ1dGVfUG9pbnRlciAmPQotCQkgIH5BdHRyaWJ1dGVzW2ldLlZhbHVlOwotCSAgICAgIGVsc2UKLQkJKkF0dHJpYnV0ZV9Qb2ludGVyIHw9Ci0JCSAgQXR0cmlidXRlc1tpXS5WYWx1ZTsKLQkgICAgICAvKgotCSAgICAgICAqCURvbmUKLQkgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIC8qCi0gICAgICAgKglOb3cgc2tpcCB0aGUgYXR0cmlidXRlCi0gICAgICAgKi8KLSAgICAgIE5hbWUgPSBjcDsKLSAgICAgIGlmICgqTmFtZSA9PSAnXycpCi0JTmFtZSsrOwotICAgIH0KLX0KLQwKLQotI2RlZmluZSBHQkxTWU1fUkVGIDAKLSNkZWZpbmUgR0JMU1lNX0RFRiAxCi0jZGVmaW5lIEdCTFNZTV9WQUwgMgotI2RlZmluZSBHQkxTWU1fTENMIDQJLyogbm90IEdCTCBhZnRlciBhbGwuLi4gKi8KLSNkZWZpbmUgR0JMU1lNX1dFQUsgOAotCi0vKgotICoJRGVmaW5lIGEgZ2xvYmFsIHN5bWJvbCAob3IgcG9zc2libHkgYSBsb2NhbCBvbmUpLgotICovCi1zdGF0aWMgdm9pZAotVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoTmFtZSwgUHNlY3RfTnVtYmVyLCBQc2VjdF9PZmZzZXQsIEZsYWdzKQotICAgICBjb25zdCBjaGFyICpOYW1lOwotICAgICBpbnQgUHNlY3RfTnVtYmVyOwotICAgICBpbnQgUHNlY3RfT2Zmc2V0OwotICAgICBpbnQgRmxhZ3M7Ci17Ci0gIGNoYXIgTG9jYWxbMzJdOwotCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZAotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIEdsb2JhbCAob3IgbG9jYWwpIHN5bWJvbCBkZWZpbml0aW9uIHN1YnJlY29yZC4KLSAgICovCi0gIFBVVF9DSEFSICgoRmxhZ3MgJiBHQkxTWU1fTENMKSAhPSAwID8gR1NEX1NfQ19MU1kgOgotCSAgICAoKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KSA/IEdTRF9TX0NfU1lNIDogR1NEX1NfQ19TWU1XKTsKLSAgLyoKLSAgICoJRGF0YSB0eXBlIGlzIHVuZGVmaW5lZAotICAgKi8KLSAgUFVUX0NIQVIgKDApOwotICAvKgotICAgKglTd2l0Y2ggb24gRGVmaW5pdGlvbi9SZWZlcmVuY2UKLSAgICovCi0gIGlmICgoRmxhZ3MgJiBHQkxTWU1fREVGKSA9PSAwKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglSZWZlcmVuY2UKLSAgICAgICAqLwotICAgICAgUFVUX1NIT1JUICgoKEZsYWdzICYgR0JMU1lNX1ZBTCkgPT0gMCkgPyBHU1lfU19NX1JFTCA6IDApOwotICAgICAgaWYgKChGbGFncyAmIEdCTFNZTV9MQ0wpICE9IDApCS8qIGxvY2FsIHN5bWJvbHMgaGF2ZSBleHRyYSBmaWVsZCAqLwotCVBVVF9TSE9SVCAoQ3VycmVudF9FbnZpcm9ubWVudCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IHN5bV9mbGFnczsKLQotICAgICAgLyoKLSAgICAgICAqCURlZmluaXRpb24KLSAgICAgICAqWyBhc3NlcnQgKExTWV9TX01fREVGID09IEdTWV9TX01fREVGICYmIExTWV9TX01fUkVMID09IEdTWV9TX01fUkVMKTsgXQotICAgICAgICovCi0gICAgICBzeW1fZmxhZ3MgPSBHU1lfU19NX0RFRjsKLSAgICAgIGlmIChGbGFncyAmIEdCTFNZTV9XRUFLKQotCXN5bV9mbGFncyB8PSBHU1lfU19NX1dFQUs7Ci0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX1ZBTCkgPT0gMCkKLQlzeW1fZmxhZ3MgfD0gR1NZX1NfTV9SRUw7Ci0gICAgICBQVVRfU0hPUlQgKHN5bV9mbGFncyk7Ci0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX0xDTCkgIT0gMCkJLyogbG9jYWwgc3ltYm9scyBoYXZlIGV4dHJhIGZpZWxkICovCi0JUFVUX1NIT1JUIChDdXJyZW50X0Vudmlyb25tZW50KTsKLSAgICAgIC8qCi0gICAgICAgKglQc2VjdCBOdW1iZXIKLSAgICAgICAqLwotICAgICAgaWYgKChGbGFncyAmIEdCTFNZTV9MQ0wpID09IDAgJiYgKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KQotCVBVVF9DSEFSIChQc2VjdF9OdW1iZXIpOwotICAgICAgZWxzZQotCVBVVF9TSE9SVCAoUHNlY3RfTnVtYmVyKTsKLSAgICAgIC8qCi0gICAgICAgKglPZmZzZXQKLSAgICAgICAqLwotICAgICAgUFVUX0xPTkcgKFBzZWN0X09mZnNldCk7Ci0gICAgfQotICAvKgotICAgKglGaW5hbGx5LCB0aGUgZ2xvYmFsIHN5bWJvbCBuYW1lCi0gICAqLwotICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoTmFtZSwgTG9jYWwpOwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKLSAgLyoKLSAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLS8qCi0gKglEZWZpbmUgYW4gZW52aXJvbm1lbnQgdG8gc3VwcG9ydCBsb2NhbCBzeW1ib2wgcmVmZXJlbmNlcy4KLSAqCVRoaXMgaXMganVzdCB0byBtb2xsaWZ5IHRoZSBsaW5rZXI7IHdlIGRvbid0IGFjdHVhbGx5IGRvCi0gKglhbnl0aGluZyB1c2VmdWwgd2l0aCBpdC4KLSAqLwotc3RhdGljIHZvaWQKLVZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCAoRW52X05hbWUpCi0gICAgY29uc3QgY2hhciAqRW52X05hbWU7Ci17Ci0gIC8qIFdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0dTRCk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIEdTRCByZWNvcmQgdHlwZS4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChPQkpfU19DX0dTRCk7Ci0gIC8qIFdlIGFyZSB3cml0aW5nIGFuIEVOViBzdWJyZWNvcmQuICAqLwotICBQVVRfQ0hBUiAoR1NEX1NfQ19FTlYpOwotCi0gICsrQ3VycmVudF9FbnZpcm9ubWVudDsJLyogaW5kZXggb2YgZW52aXJvbm1lbnQgYmVpbmcgZGVmaW5lZCAqLwotCi0gIC8qIEVOViRXX0ZMQUdTOiAgd2UgYXJlIGRlZmluaW5nIHRoZSBuZXh0IGVudmlyb25tZW50LiAgSXQncyBub3QgbmVzdGVkLiAgKi8KLSAgUFVUX1NIT1JUIChFTlZfU19NX0RFRik7Ci0gIC8qIEVOViRXX0VOVklORFg6ICBpbmRleCBpcyBhbHdheXMgMCBmb3Igbm9uLW5lc3RlZCBkZWZpbml0aW9ucy4gICovCi0gIFBVVF9TSE9SVCAoMCk7Ci0KLSAgLyogRU5WJEJfTkFNTE5HICsgRU5WJFRfTkFNRTogIGVudmlyb25tZW50IG5hbWUgaW4gQVNDSUMgZm9ybWF0LiAgKi8KLSAgaWYgKCFFbnZfTmFtZSkgRW52X05hbWUgPSAiIjsKLSAgUFVUX0NPVU5URURfU1RSSU5HICgoY2hhciAqKUVudl9OYW1lKTsKLQotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLS8qCi0gKglEZWZpbmUgYSBwc2VjdAotICovCi1zdGF0aWMgaW50Ci1WTVNfUHNlY3RfU3BlYyAoTmFtZSwgU2l6ZSwgVHlwZSwgdnNwKQotICAgICBjb25zdCBjaGFyICpOYW1lOwotICAgICBpbnQgU2l6ZTsKLSAgICAgZW51bSBwc190eXBlIFR5cGU7Ci0gICAgIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci17Ci0gIGNoYXIgTG9jYWxbMzJdOwotICBpbnQgUHNlY3RfQXR0cmlidXRlczsKLQotICAvKgotICAgKglHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgUFNFQ1QgZmxhZ3MgZ2l2ZW4gdGhlIFBTRUNUIHR5cGUKLSAgICovCi0gIHN3aXRjaCAoVHlwZSkKLSAgICB7Ci0gICAgY2FzZSBwc19URVhUOgotICAgICAgLyogVGV4dCBwc2VjdHMgYXJlIFBJQyxub09WUixSRUwsbm9HQkwsU0hSLEVYRSxSRCxub1dSVC4gKi8KLSAgICAgIFBzZWN0X0F0dHJpYnV0ZXMgPSAoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9TSFJ8R1BTX1NfTV9FWEUKLQkJCSAgfEdQU19TX01fUkQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwc19EQVRBOgotICAgICAgLyogRGF0YSBwc2VjdHMgYXJlIFBJQyxub09WUixSRUwsbm9HQkwsbm9TSFIsbm9FWEUsUkQsV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfQ09NTU9OOgotICAgICAgLyogQ29tbW9uIGJsb2NrIHBzZWN0cyBhcmU6ICBQSUMsT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTAotCQkJICB8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHBzX0NPTlNUOgotICAgICAgLyogQ29uc3QgZGF0YSBwc2VjdHMgYXJlOiAgUElDLE9WUixSRUwsR0JMLG5vU0hSLG5vRVhFLFJELG5vV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTAotCQkJICB8R1BTX1NfTV9SRCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHBzX0NUT1JTOgotICAgICAgLyogQ3RvciBwc2VjdHMgYXJlIFBJQyxub09WUixSRUwsR0JMLG5vU0hSLG5vRVhFLFJELG5vV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfRFRPUlM6Ci0gICAgICAvKiBEdG9yIHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsbm9XUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkQpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIGltcG9zc2libGUgKi8KLSAgICAgIGVycm9yIChfKCJVbmtub3duIFZNUyBwc2VjdCB0eXBlICglbGQpIiksIChsb25nKSBUeXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgLyoKLSAgICoJTW9kaWZ5IHRoZSBwc2VjdCBhdHRyaWJ1dGVzIGFjY29yZGluZyB0byBhbnkgYXR0cmlidXRlIHN0cmluZwotICAgKi8KLSAgaWYgKHZzcCAmJiBTX0dFVF9UWVBFICh2c3AtPlN5bWJvbCkgPT0gTl9BQlMpCi0gICAgUHNlY3RfQXR0cmlidXRlcyB8PSBHTE9CQUxWQUxVRV9CSVQ7Ci0gIGVsc2UgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChOYW1lKSkKLSAgICBWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMgKE5hbWUsICZQc2VjdF9BdHRyaWJ1dGVzKTsKLSAgLyoKLSAgICoJQ2hlY2sgZm9yIGdsb2JhbHJlZi9kZWYvdmFsLgotICAgKi8KLSAgaWYgKChQc2VjdF9BdHRyaWJ1dGVzICYgR0xPQkFMVkFMVUVfQklUKSAhPSAwKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBnbG9iYWx2YWx1ZSBzeW1ib2xzIHdlcmUgZ2VuZXJhdGVkIGJlZm9yZS4gVGhpcyBjb2RlCi0gICAgICAgKiBwcmV2ZW50cyB1bnNpZ2h0bHkgcHNlY3QgYnVpbGR1cCwgYW5kIG1ha2VzIHN1cmUgdGhhdAotICAgICAgICogZml4dXAgcmVmZXJlbmNlcyBhcmUgZW1pdHRlZCBjb3JyZWN0bHkuCi0gICAgICAgKi8KLSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSAtMTsJLyogdG8gY2F0Y2ggZXJyb3JzICovCi0gICAgICBTX1NFVF9UWVBFICh2c3AtPlN5bWJvbCwgTl9VTkRGKTsJCS8qIG1ha2UgcmVmcyB3b3JrICovCi0gICAgICByZXR1cm4gMTsJCQkvKiBkZWNyZW1lbnQgcHNlY3QgY291bnRlciAqLwotICAgIH0KLQotICBpZiAoKFBzZWN0X0F0dHJpYnV0ZXMgJiBHTE9CQUxTWU1CT0xfQklUKSAhPSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHZzcC0+U3ltYm9sKSkKLQl7Ci0JY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKE5hbWUsIHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkJICB2c3AtPlBzZWN0X09mZnNldCwgR0JMU1lNX1JFRik7Ci0JICB2c3AtPlBzZWN0X0luZGV4ID0gLTE7Ci0JICBTX1NFVF9UWVBFICh2c3AtPlN5bWJvbCwgTl9VTkRGKTsKLQkgIHJldHVybiAxOwkJLyogcmV0dXJuIGFuZCBpbmRpY2F0ZSBubyBwc2VjdCAqLwotCWNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCB2c3AtPlBzZWN0X0luZGV4LAotCQkJCSAgdnNwLT5Qc2VjdF9PZmZzZXQsIEdCTFNZTV9ERUYpOwotCSAgLyogSW4gdGhpcyBjYXNlIHdlIHN0aWxsIGdlbmVyYXRlIHRoZSBwc2VjdCAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2ZhdGFsIChfKCJHbG9iYWxzeW1ib2wgYXR0cmlidXRlIGZvciBzeW1ib2wgJXMgd2FzIHVuZXhwZWN0ZWQuIiksCi0JCSAgICBOYW1lKTsKLQkgIGJyZWFrOwotCX0JCQkvKiBzd2l0Y2ggKi8KLSAgICB9Ci0KLSAgUHNlY3RfQXR0cmlidXRlcyAmPSAweGZmZmY7CS8qIGNsZWFyIG91dCB0aGUgZ2xvYmFscmVmL2RlZiBzdHVmZiAqLwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIEdTRCByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0dTRCk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIEdTRCByZWNvcmQgdHlwZQotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJV2UgYXJlIHdyaXRpbmcgYSBQU0VDVCBkZWZpbml0aW9uIHN1YnJlY29yZAotICAgKi8KLSAgUFVUX0NIQVIgKEdTRF9TX0NfUFNDKTsKLSAgLyoKLSAgICoJUHNlY3RzIGFyZSBhbHdheXMgTE9OR1dPUkQgYWxpZ25lZAotICAgKi8KLSAgUFVUX0NIQVIgKDIpOwotICAvKgotICAgKglTcGVjaWZ5IHRoZSBwc2VjdCBhdHRyaWJ1dGVzCi0gICAqLwotICBQVVRfU0hPUlQgKFBzZWN0X0F0dHJpYnV0ZXMpOwotICAvKgotICAgKglTcGVjaWZ5IHRoZSBhbGxvY2F0aW9uCi0gICAqLwotICBQVVRfTE9ORyAoU2l6ZSk7Ci0gIC8qCi0gICAqCUZpbmFsbHksIHRoZSBwc2VjdCBuYW1lCi0gICAqLwotICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoTmFtZSwgTG9jYWwpOwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKLSAgLyoKLSAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci0gIHJldHVybiAwOwotfQotDAotCi0vKiBHaXZlbiB0aGUgcG9pbnRlciB0byBhIHN5bWJvbCB3ZSBjYWxjdWxhdGUgaG93IGJpZyB0aGUgZGF0YSBhdCB0aGUKLSAgIHN5bWJvbCBpcy4gIFdlIGRvIHRoaXMgYnkgbG9va2luZyBmb3IgdGhlIG5leHQgc3ltYm9sIChsb2NhbCBvciBnbG9iYWwpCi0gICB3aGljaCB3aWxsIGluZGljYXRlIHRoZSBzdGFydCBvZiBhbm90aGVyIGRhdHVtLiAgKi8KLQotc3RhdGljIG9mZnNldFQKLVZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUgKHMwUCwgRW5kX09mX0RhdGEpCi0gICAgIHJlZ2lzdGVyIHN5bWJvbFMgKnMwUDsKLSAgICAgdW5zaWduZWQgRW5kX09mX0RhdGE7Ci17Ci0gIHN5bWJvbFMgKnMxUDsKLSAgdmFsdWVUIHMwUF92YWwgPSBTX0dFVF9WQUxVRSAoczBQKSwgczFQX3ZhbCwKLQkgbmVhcmVzdF92YWwgPSAodmFsdWVUKSBFbmRfT2ZfRGF0YTsKLQotICAvKiBGaW5kIHRoZSBuZWFyZXN0IHN5bWJvbCB3aGF0IGZvbGxvd3MgdGhpcyBvbmUuICAqLwotICBmb3IgKHMxUCA9IHN5bWJvbF9yb290UDsgczFQOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgZGF0YSB0eXBlIG11c3QgbWF0Y2guICAqLwotICAgICAgaWYgKFNfR0VUX1RZUEUgKHMxUCkgIT0gTl9EQVRBKQotCWNvbnRpbnVlOwotICAgICAgczFQX3ZhbCA9IFNfR0VUX1ZBTFVFIChzMVApOwotICAgICAgaWYgKHMxUF92YWwgPiBzMFBfdmFsICYmIHMxUF92YWwgPCBuZWFyZXN0X3ZhbCkKLQluZWFyZXN0X3ZhbCA9IHMxUF92YWw7Ci0gICAgfQotICAvKiBDYWxjdWxhdGUgaXRzIHNpemUuICAqLwotICByZXR1cm4gKG9mZnNldFQpIChuZWFyZXN0X3ZhbCAtIHMwUF92YWwpOwotfQotCi0KLS8qIENoZWNrIHN5bWJvbCBuYW1lcyBmb3IgdGhlIFBzZWN0IGhhY2sgd2l0aCBhIGdsb2JhbHZhbHVlLCBhbmQgdGhlbgotICAgZ2VuZXJhdGUgZ2xvYmFsdmFsdWVzIGZvciB0aG9zZSB0aGF0IGhhdmUgaXQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX0VtaXRfR2xvYmFsdmFsdWVzICh0ZXh0X3NpeiwgZGF0YV9zaXosIERhdGFfU2VnbWVudCkKLSAgICAgdW5zaWduZWQgdGV4dF9zaXo7Ci0gICAgIHVuc2lnbmVkIGRhdGFfc2l6OwotICAgICBjaGFyICpEYXRhX1NlZ21lbnQ7Ci17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnNwOwotICBjaGFyICpzdHJpcHBlZF9uYW1lLCAqTmFtZTsKLSAgaW50IFNpemU7Ci0gIGludCBQc2VjdF9BdHRyaWJ1dGVzOwotICBpbnQgZ2xvYmFsdmFsdWU7Ci0gIGludCB0eXAsIGFic3R5cDsKLQotICAvKgotICAgKiBTY2FuIHRoZSBzeW1ib2wgdGFibGUgZm9yIGdsb2JhbHZhbHVlcywgYW5kIGVtaXQgZGVmL3JlZiB3aGVuCi0gICAqIHJlcXVpcmVkLiAgVGhlc2Ugd2lsbCBiZSBjYXVnaHQgYWdhaW4gbGF0ZXIgYW5kIGNvbnZlcnRlZCB0bwotICAgKiBOX1VOREYKLSAgICovCi0gIGZvciAoc3AgPSBzeW1ib2xfcm9vdFA7IHNwOyBzcCA9IHNwLT5zeV9uZXh0KQotICAgIHsKLSAgICAgIHR5cCA9IFNfR0VUX1JBV19UWVBFIChzcCk7Ci0gICAgICBhYnN0eXAgPSAoKHR5cCAmIH5OX0VYVCkgPT0gTl9BQlMpOwotICAgICAgLyoKLSAgICAgICAqCVNlZSBpZiB0aGlzIGlzIHNvbWV0aGluZyB3ZSB3YW50IHRvIGxvb2sgYXQuCi0gICAgICAgKi8KLSAgICAgIGlmICghYWJzdHlwICYmCi0JICB0eXAgIT0gKE5fREFUQSB8IE5fRVhUKSAmJgotCSAgdHlwICE9IChOX1VOREYgfCBOX0VYVCkpCi0JY29udGludWU7Ci0gICAgICAvKgotICAgICAgICoJU2VlIGlmIHRoaXMgaGFzIGdsb2JhbHZhbHVlIHNwZWNpZmljYXRpb24uCi0gICAgICAgKi8KLSAgICAgIE5hbWUgPSBTX0dFVF9OQU1FIChzcCk7Ci0KLSAgICAgIGlmIChhYnN0eXApCi0JewotCSAgc3RyaXBwZWRfbmFtZSA9IDA7Ci0JICBQc2VjdF9BdHRyaWJ1dGVzID0gR0xPQkFMVkFMVUVfQklUOwotCX0KLSAgICAgIGVsc2UgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChOYW1lKSkKLQl7Ci0JICBzdHJpcHBlZF9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChOYW1lKSArIDEpOwotCSAgc3RyY3B5IChzdHJpcHBlZF9uYW1lLCBOYW1lKTsKLQkgIFBzZWN0X0F0dHJpYnV0ZXMgPSAwOwotCSAgVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzIChzdHJpcHBlZF9uYW1lLCAmUHNlY3RfQXR0cmlidXRlcyk7Ci0JfQotICAgICAgZWxzZQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKFBzZWN0X0F0dHJpYnV0ZXMgJiBHTE9CQUxWQUxVRV9CSVQpICE9IDApCi0JewotCSAgc3dpdGNoICh0eXApCi0JICAgIHsKLQkgICAgY2FzZSBOX0FCUzoKLQkgICAgICAvKiBMb2NhbCBzeW1ib2wgcmVmZXJlbmNlcyB3aWxsIHdhbnQKLQkJIHRvIGhhdmUgYW4gZW52aXJvbm1lbnQgZGVmaW5lZC4gICovCi0JICAgICAgaWYgKEN1cnJlbnRfRW52aXJvbm1lbnQgPCAwKQotCQlWTVNfTG9jYWxfRW52aXJvbm1lbnRfU2V0dXAgKCIuTl9BQlMiKTsKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCAwLAotCQkJCSAgICAgIFNfR0VUX1ZBTFVFIChzcCksCi0JCQkJICAgICAgR0JMU1lNX0RFRnxHQkxTWU1fVkFMfEdCTFNZTV9MQ0wpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoTmFtZSwgMCwKLQkJCQkgICAgICBTX0dFVF9WQUxVRSAoc3ApLAotCQkJCSAgICAgIEdCTFNZTV9ERUZ8R0JMU1lNX1ZBTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0JICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoc3RyaXBwZWRfbmFtZSwgMCwgMCwgR0JMU1lNX1ZBTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JICAgICAgU2l6ZSA9IFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUgKHNwLCB0ZXh0X3NpeiArIGRhdGFfc2l6KTsKLQkgICAgICBpZiAoU2l6ZSA+IDQpCi0JCWVycm9yIChfKCJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZ2xvYmFsdmFsdWUiKSk7Ci0JICAgICAgZ2xvYmFsdmFsdWUgPSBtZF9jaGFyc190b19udW1iZXIgKERhdGFfU2VnbWVudCArIAotCQkgICAgIFNfR0VUX1ZBTFVFIChzcCkgLSB0ZXh0X3NpeiAsIFNpemUpOwotCSAgICAgIC8qIFRocmVlIHRpbWVzIGZvciBnb29kIGx1Y2suICBUaGUgbGlua2VyIHNlZW1zIHRvIGdldCBjb25mdXNlZAotCSAgICAgICAgIGlmIHRoZXJlIGFyZSBmZXdlciB0aGFuIHRocmVlICovCi0JICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoc3RyaXBwZWRfbmFtZSwgMCwgMCwgR0JMU1lNX1ZBTCk7Ci0JICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoc3RyaXBwZWRfbmFtZSwgMCwgZ2xvYmFsdmFsdWUsCi0JCQkJICAgICAgR0JMU1lNX0RFRnxHQkxTWU1fVkFMKTsKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCBnbG9iYWx2YWx1ZSwKLQkJCQkgICAgICBHQkxTWU1fREVGfEdCTFNZTV9WQUwpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgZ2xvYmFsdmFsdWUgb2YgJXMiKSwgc3RyaXBwZWRfbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JCQkvKiBzd2l0Y2ggKi8KLQl9CQkJLyogaWYgKi8KLSAgICAgIGlmIChzdHJpcHBlZF9uYW1lKSBmcmVlIChzdHJpcHBlZF9uYW1lKTsJLyogY2xlYW4gdXAgKi8KLSAgICB9CQkJCS8qIGZvciAqLwotCi19Ci0MCi0KLS8qCi0gKglEZWZpbmUgYSBwcm9jZWR1cmUgZW50cnkgcHQvbWFzawotICovCi1zdGF0aWMgdm9pZAotVk1TX1Byb2NlZHVyZV9FbnRyeV9QdCAoTmFtZSwgUHNlY3RfTnVtYmVyLCBQc2VjdF9PZmZzZXQsIEVudHJ5X01hc2spCi0gICAgIGNoYXIgKk5hbWU7Ci0gICAgIGludCBQc2VjdF9OdW1iZXI7Ci0gICAgIGludCBQc2VjdF9PZmZzZXQ7Ci0gICAgIGludCBFbnRyeV9NYXNrOwotewotICBjaGFyIExvY2FsWzMyXTsKLQotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIEdTRCByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0dTRCk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIEdTRCByZWNvcmQgdHlwZQotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJV2UgYXJlIHdyaXRpbmcgYSBQcm9jZWR1cmUgRW50cnkgUHQvTWFzayBzdWJyZWNvcmQKLSAgICovCi0gIFBVVF9DSEFSICgoKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KSA/IEdTRF9TX0NfRVBNIDogR1NEX1NfQ19FUE1XKTsKLSAgLyoKLSAgICoJRGF0YSB0eXBlIGlzIHVuZGVmaW5lZAotICAgKi8KLSAgUFVUX0NIQVIgKDApOwotICAvKgotICAgKglGbGFncyA9ICJSRUxPQ0FUQUJMRSIgYW5kICJERUZJTkVEIgotICAgKi8KLSAgUFVUX1NIT1JUIChHU1lfU19NX0RFRiB8IEdTWV9TX01fUkVMKTsKLSAgLyoKLSAgICoJUHNlY3QgTnVtYmVyCi0gICAqLwotICBpZiAoKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KQotICAgIFBVVF9DSEFSIChQc2VjdF9OdW1iZXIpOwotICBlbHNlCi0gICAgUFVUX1NIT1JUIChQc2VjdF9OdW1iZXIpOwotICAvKgotICAgKglPZmZzZXQKLSAgICovCi0gIFBVVF9MT05HIChQc2VjdF9PZmZzZXQpOwotICAvKgotICAgKglFbnRyeSBtYXNrCi0gICAqLwotICBQVVRfU0hPUlQgKEVudHJ5X01hc2spOwotICAvKgotICAgKglGaW5hbGx5LCB0aGUgZ2xvYmFsIHN5bWJvbCBuYW1lCi0gICAqLwotICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoTmFtZSwgTG9jYWwpOwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKLSAgLyoKLSAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLS8qCi0gKglTZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gY291bnRlciB0byBhIHBhcnRpY3VsYXIgUHNlY3QgYW5kIE9mZnNldAotICovCi1zdGF0aWMgdm9pZAotVk1TX1NldF9Qc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgUmVjb3JkX1R5cGUpCi0gICAgIGludCBQc2VjdF9JbmRleDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotewotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhICJSZWNvcmRfVHlwZSIgcmVjb3JkCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSByZWNvcmQgdHlwZQotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKFJlY29yZF9UeXBlKTsKLSAgLyoKLSAgICoJU3RhY2sgdGhlIFBzZWN0IGJhc2UgKyBPZmZzZXQKLSAgICovCi0gIHZtc190aXJfc3RhY2tfcHNlY3QgKFBzZWN0X0luZGV4LCBPZmZzZXQsIDApOwotICAvKgotICAgKglTZXQgcmVsb2NhdGlvbiBiYXNlCi0gICAqLwotICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfU0VUUkIpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCVN0b3JlIHJlcGVhdGVkIGltbWVkaWF0ZSBkYXRhIGluIGN1cnJlbnQgUHNlY3QKLSAqLwotc3RhdGljIHZvaWQKLVZNU19TdG9yZV9SZXBlYXRlZF9EYXRhIChSZXBlYXRfQ291bnQsIFBvaW50ZXIsIFNpemUsIFJlY29yZF9UeXBlKQotICAgICBpbnQgUmVwZWF0X0NvdW50OwotICAgICByZWdpc3RlciBjaGFyICpQb2ludGVyOwotICAgICBpbnQgU2l6ZTsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotewotCi0gIC8qCi0gICAqCUlnbm9yZSB6ZXJvIGJ5dGVzL3dvcmRzL2xvbmd3b3JkcwotICAgKi8KLSAgc3dpdGNoIChTaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAoUG9pbnRlclszXSAhPSAwIHx8IFBvaW50ZXJbMl0gIT0gMCkgYnJlYWs7Ci0gICAgICAvKiBlbHNlIEZBTExUSFJVICovCi0gICAgY2FzZSAyOgotICAgICAgaWYgKFBvaW50ZXJbMV0gIT0gMCkgYnJlYWs7Ci0gICAgICAvKiBlbHNlIEZBTExUSFJVICovCi0gICAgY2FzZSAxOgotICAgICAgaWYgKFBvaW50ZXJbMF0gIT0gMCkgYnJlYWs7Ci0gICAgICAvKiB6ZXJvIHZhbHVlICovCi0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgLyoKLSAgICoJSWYgdGhlIGRhdGEgaXMgdG9vIGJpZyBmb3IgYSBUSVJfU19DX1NUT19SSVZCIHN1Yi1yZWNvcmQKLSAgICoJdGhlbiB3ZSBkbyBpdCBtYW51YWxseQotICAgKi8KLSAgaWYgKFNpemUgPiAyNTUpCi0gICAgewotICAgICAgd2hpbGUgKC0tUmVwZWF0X0NvdW50ID49IDApCi0JVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChQb2ludGVyLCBTaXplLCBSZWNvcmRfVHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhICJSZWNvcmRfVHlwZSIgcmVjb3JkCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglTdGFjayB0aGUgcmVwZWF0IGNvdW50Ci0gICAqLwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfTFcpOwotICBQVVRfTE9ORyAoUmVwZWF0X0NvdW50KTsKLSAgLyoKLSAgICoJQW5kIG5vdyB0aGUgY29tbWFuZCBhbmQgaXRzIGRhdGEKLSAgICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19SSVZCKTsKLSAgUFVUX0NIQVIgKFNpemUpOwotICB3aGlsZSAoLS1TaXplID49IDApCi0gICAgUFVUX0NIQVIgKCpQb2ludGVyKyspOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCVN0b3JlIGEgUG9zaXRpb24gSW5kZXBlbmRlbnQgUmVmZXJlbmNlCi0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgKFN5bWJvbCwgT2Zmc2V0LCBQQ19SZWxhdGl2ZSwKLQkJCQlQc2VjdCwgUHNlY3RfT2Zmc2V0LCBSZWNvcmRfVHlwZSkKLSAgICAgc3ltYm9sUyAqU3ltYm9sOwotICAgICBpbnQgT2Zmc2V0OwotICAgICBpbnQgUENfUmVsYXRpdmU7Ci0gICAgIGludCBQc2VjdDsKLSAgICAgaW50IFBzZWN0X09mZnNldDsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotewotICByZWdpc3RlciBzdHJ1Y3QgVk1TX1N5bWJvbCAqdnNwID0gU3ltYm9sLT5zeV9vYmo7Ci0gIGNoYXIgTG9jYWxbMzJdOwotICBpbnQgbG9jYWxfc3ltID0gMDsKLQotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhICJSZWNvcmRfVHlwZSIgcmVjb3JkCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglTZXQgdG8gdGhlIGFwcHJvcHJpYXRlIG9mZnNldCBpbiB0aGUgUHNlY3QuCi0gICAqCUZvciBhIENvZGUgcmVmZXJlbmNlIHdlIG5lZWQgdG8gZml4IHRoZSBvcGVyYW5kCi0gICAqCXNwZWNpZmllciBhcyB3ZWxsLCBzbyBiYWNrIHVwIDEgYnl0ZTsKLSAgICoJZm9yIGEgRGF0YSByZWZlcmVuY2Ugd2UganVzdCBzdG9yZSBIRVJFLgotICAgKi8KLSAgVk1TX1NldF9Qc2VjdCAoUHNlY3QsCi0JCSBQQ19SZWxhdGl2ZSA/IFBzZWN0X09mZnNldCAtIDEgOiBQc2VjdF9PZmZzZXQsCi0JCSBSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCU1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgZ2VuZXJhdGluZyBhICJSZWNvcmQgVHlwZSIgcmVjb3JkCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglEaXNwYXRjaCBvbiBzeW1ib2wgdHlwZSAoc28gd2UgY2FuIHN0YWNrIGl0cyB2YWx1ZSkKLSAgICovCi0gIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKFN5bWJvbCkpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCUdsb2JhbCBzeW1ib2wKLSAgICAgICAqLwotICAgIGNhc2UgTl9BQlM6Ci0gICAgICBsb2NhbF9zeW0gPSAxOwotICAgICAgLypGQUxMVEhSVSovCi0gICAgY2FzZSBOX0FCUyB8IE5fRVhUOgotI2lmZGVmCU5PVF9WQVhfMTFfQ19DT01QQVRJQkxFCi0gICAgY2FzZSBOX1VOREYgfCBOX0VYVDoKLSAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgotI2VuZGlmCS8qIE5PVF9WQVhfMTFfQ19DT01QQVRJQkxFICovCi0gICAgY2FzZSBOX1VOREY6Ci0gICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLSAgICAgIC8qCi0gICAgICAgKglHZXQgdGhlIHN5bWJvbCBuYW1lIChjYXNlIGhhY2tlZCkKLSAgICAgICAqLwotICAgICAgVk1TX0Nhc2VfSGFja19TeW1ib2wgKFNfR0VUX05BTUUgKFN5bWJvbCksIExvY2FsKTsKLSAgICAgIC8qCi0gICAgICAgKglTdGFjayB0aGUgZ2xvYmFsIHN5bWJvbCB2YWx1ZQotICAgICAgICovCi0gICAgICBpZiAoIWxvY2FsX3N5bSkKLQl7Ci0JICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfR0JMKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTG9jYWwgc3ltYm9scyBoYXZlIGFuIGV4dHJhIGZpZWxkLiAgKi8KLQkgIFBVVF9DSEFSIChUSVJfU19DX1NUQV9MU1kpOwotCSAgUFVUX1NIT1JUIChDdXJyZW50X0Vudmlyb25tZW50KTsKLQl9Ci0gICAgICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKLSAgICAgIGlmIChPZmZzZXQpCi0JewotCSAgLyoKLQkgICAqCVN0YWNrIHRoZSBsb25nd29yZCBvZmZzZXQKLQkgICAqLwotCSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX0xXKTsKLQkgIFBVVF9MT05HIChPZmZzZXQpOwotCSAgLyoKLQkgICAqCUFkZCB0aGUgdHdvLCBsZWF2aW5nIHRoZSByZXN1bHQgb24gdGhlIHN0YWNrCi0JICAgKi8KLQkgIFBVVF9DSEFSIChUSVJfU19DX09QUl9BREQpOwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgLyoKLSAgICAgICAqCVVuaW5pdGlhbGl6ZWQgbG9jYWwgZGF0YQotICAgICAgICovCi0gICAgY2FzZSBOX0JTUzoKLSAgICAgIC8qCi0gICAgICAgKglTdGFjayB0aGUgUHNlY3QgKCtvZmZzZXQpCi0gICAgICAgKi8KLSAgICAgIHZtc190aXJfc3RhY2tfcHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkgICB2c3AtPlBzZWN0X09mZnNldCArIE9mZnNldCwKLQkJCSAgIDApOwotICAgICAgYnJlYWs7Ci0gICAgICAvKgotICAgICAgICoJTG9jYWwgdGV4dAotICAgICAgICovCi0gICAgY2FzZSBOX1RFWFQ6Ci0gICAgICAvKgotICAgICAgICoJU3RhY2sgdGhlIFBzZWN0ICgrb2Zmc2V0KQotICAgICAgICovCi0gICAgICB2bXNfdGlyX3N0YWNrX3BzZWN0ICh2c3AtPlBzZWN0X0luZGV4LAotCQkJICAgU19HRVRfVkFMVUUgKFN5bWJvbCkgKyBPZmZzZXQsCi0JCQkgICAwKTsKLSAgICAgIGJyZWFrOwotICAgICAgLyoKLSAgICAgICAqCUluaXRpYWxpemVkIGxvY2FsIG9yIGdsb2JhbCBkYXRhCi0gICAgICAgKi8KLSAgICBjYXNlIE5fREFUQToKLSNpZm5kZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0jZW5kaWYJLyogTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUgKi8KLSAgICAgIC8qCi0gICAgICAgKglTdGFjayB0aGUgUHNlY3QgKCtvZmZzZXQpCi0gICAgICAgKi8KLSAgICAgIHZtc190aXJfc3RhY2tfcHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkgICB2c3AtPlBzZWN0X09mZnNldCArIE9mZnNldCwKLQkJCSAgIDApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKgotICAgKglTdG9yZSBlaXRoZXIgYSBjb2RlIG9yIGRhdGEgcmVmZXJlbmNlCi0gICAqLwotICBQVVRfQ0hBUiAoUENfUmVsYXRpdmUgPyBUSVJfU19DX1NUT19QSUNSIDogVElSX1NfQ19TVE9fUElEUik7Ci0gIC8qCi0gICAqCUZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKgotICoJQ2hlY2sgaW4gdGhlIHRleHQgYXJlYSBmb3IgYW4gaW5kaXJlY3QgcGMtcmVsYXRpdmUgcmVmZXJlbmNlCi0gKglhbmQgZml4IGl0IHVwIHdpdGggYWRkcmVzc2luZyBtb2RlIDB4ZmYgW1BDIGluZGlyZWN0XQotICoKLSAqCVRISVMgU0hPVUxEIEJFIFJFUExBQ0VEIEJZIFRIRSBVU0UgT0YgVElSX1NfQ19TVE9fUElSUiBJTiBUSEUKLSAqCVBJQyBDT0RFIEdFTkVSQVRJTkcgRklYVVAgUk9VVElORS4KLSAqLwotc3RhdGljIHZvaWQKLVZNU19GaXhfSW5kaXJlY3RfUmVmZXJlbmNlIChUZXh0X1BzZWN0LCBPZmZzZXQsIGZyYWdQLCB0ZXh0X2ZyYWdfcm9vdCkKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgZnJhZ1MgKnRleHRfZnJhZ19yb290OwotewotICAvKgotICAgKglUaGUgYWRkcmVzc2luZyBtb2RlIGJ5dGUgaXMgMSBieXRlIGJlZm9yZSB0aGUgYWRkcmVzcwotICAgKi8KLSAgT2Zmc2V0LS07Ci0gIC8qCi0gICAqCUlzIGl0IGluIFRISVMgZnJhZz8/Ci0gICAqLwotICBpZiAoKE9mZnNldCA8IGZyYWdQLT5mcl9hZGRyZXNzKSB8fAotICAgICAgKE9mZnNldCA+PSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4KSkpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVdlIG5lZWQgdG8gc2VhcmNoIGZvciB0aGUgZnJhZ21lbnQgY29udGFpbmluZyB0aGlzCi0gICAgICAgKglPZmZzZXQKLSAgICAgICAqLwotICAgICAgZm9yIChmcmFnUCA9IHRleHRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLQl7Ci0JICBpZiAoKE9mZnNldCA+PSBmcmFnUC0+ZnJfYWRkcmVzcykgJiYKLQkgICAgICAoT2Zmc2V0IDwgKGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCkpKQotCSAgICBicmVhazsKLQl9Ci0gICAgICAvKgotICAgICAgICoJSWYgd2UgY291bGRuJ3QgZmluZCB0aGUgZnJhZywgdGhpbmdzIGFyZSBCQUQhIQotICAgICAgICovCi0gICAgICBpZiAoZnJhZ1AgPT0gMCkKLQllcnJvciAoXygiQ291bGRuJ3QgZmluZCBmaXh1cCBmcmFnbWVudCB3aGVuIGNoZWNraW5nIGZvciBpbmRpcmVjdCByZWZlcmVuY2UiKSk7Ci0gICAgfQotICAvKgotICAgKglDaGVjayBmb3IgaW5kaXJlY3QgUEMgcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlCi0gICAqLwotICBpZiAoZnJhZ1AtPmZyX2xpdGVyYWxbT2Zmc2V0IC0gZnJhZ1AtPmZyX2FkZHJlc3NdID09IChjaGFyKSAweGZmKQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIEFkZHJlc3NfTW9kZSA9IChjaGFyKSAweGZmOwotCi0gICAgICAvKgotICAgICAgICoJWWVzOiBTdG9yZSB0aGUgaW5kaXJlY3QgbW9kZSBiYWNrIGludG8gdGhlIGltYWdlCi0gICAgICAgKgkgICAgIHRvIGZpeCB1cCB0aGUgZGFtYWdlIGRvbmUgYnkgU1RPX1BJQ1IKLSAgICAgICAqLwotICAgICAgVk1TX1NldF9Qc2VjdCAoVGV4dF9Qc2VjdCwgT2Zmc2V0LCBPQkpfU19DX1RJUik7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKCZBZGRyZXNzX01vZGUsIDEsIE9CSl9TX0NfVElSKTsKLSAgICB9Ci19Ci0MCi0KLS8qCi0gKglJZiB0aGUgcHJvY2VkdXJlICJtYWluKCkiIGV4aXN0cyB3ZSBoYXZlIHRvIGFkZCB0aGUgaW5zdHJ1Y3Rpb24KLSAqCSJqc2IgYyRtYWluX2FyZ3MiIGF0IHRoZSBiZWdpbm5pbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFZBWC0xMSAiQyIuCi0gKgotICoJRklYTUU6ICB0aGUgbWFjcm8gbmFtZSBgSEFDS19ERUNfQ19TVEFSVFVQJyBzaG91bGQgYmUgcmVuYW1lZAotICoJCXRvIGBIQUNLX1ZBWENSVExfU1RBUlRVUCcgYmVjYXVzZSBEaWdpdGFsJ3MgY29tcGlsZXIKLSAqCQluYW1lZCAiREVDIEMiIHVzZXMgcnVuLXRpbWUgbGlicmFyeSAiREVDQyRTSFIiLCBidXQgdGhpcwotICoJCXN0YXJ0dXAgY29kZSBpcyBmb3IgIlZBWENSVEwiLCB0aGUgbGlicmFyeSBmb3IgRGlnaXRhbCdzCi0gKgkJb2xkZXIgIlZBWCBDIi4gIEFsc28sIHRoaXMgZXh0cmEgY29kZSBpc24ndCBuZWVkZWQgZm9yCi0gKgkJc3VwcG9ydGluZyBnY2MgYmVjYXVzZSBpdCBhbHJlYWR5IGdlbmVyYXRlcyB0aGUgVkFYQ1JUTAotICoJCXN0YXJ0dXAgY2FsbCB3aGVuIGNvbXBpbGluZyBtYWluKCkuICBUaGUgcmVmZXJlbmNlIHRvCi0gKgkJYGZsYWdfaGFzaF9sb25nX25hbWVzJyBsb29rcyB2ZXJ5IHN1c3BpY2lvdXMgdG9vOwotICoJCXByb2JhYmx5IGFuIG9sZC1zdHlsZSBjb21tYW5kIGxpbmUgb3B0aW9uIHdhcyBpbmFkdmVydGVudGx5Ci0gKgkJb3ZlcmxvYWRlZCBoZXJlLCB0aGVuIGJsaW5kbHkgY29udmVydGVkIGludG8gdGhlIG5ldyBvbmUuCi0gKi8KLXZvaWQKLXZtc19jaGVja19mb3JfbWFpbiAoKQotewotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotI2lmZGVmCUhBQ0tfREVDX0NfU1RBUlRVUAkvKiBKRiAqLwotICByZWdpc3RlciBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpblA7Ci0gIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgcmVnaXN0ZXIgZnJhZ1MgKipwcmV2X2ZyYWdQUDsKLSAgcmVnaXN0ZXIgc3RydWN0IGZpeCAqZml4UDsKLSAgcmVnaXN0ZXIgZnJhZ1MgKk5ld19GcmFnOwotICBpbnQgaTsKLSNlbmRpZgkvKiBIQUNLX0RFQ19DX1NUQVJUVVAgKi8KLQotICBzeW1ib2xQID0gKHN5bWJvbFMgKikgc3ltYm9sX2ZpbmQgKCJfbWFpbiIpOwotICBpZiAoc3ltYm9sUCAmJiAhU19JU19ERUJVRyAoc3ltYm9sUCkgJiYKLSAgICAgIFNfSVNfRVhURVJOQUwgKHN5bWJvbFApICYmIChTX0dFVF9UWVBFIChzeW1ib2xQKSA9PSBOX1RFWFQpKQotICAgIHsKLSNpZmRlZglIQUNLX0RFQ19DX1NUQVJUVVAKLSAgICAgIGlmICghZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JewotI2VuZGlmCi0JICAvKgotCSAgICoJUmVtZW1iZXIgdGhlIGVudHJ5IHBvaW50IHN5bWJvbAotCSAgICovCi0JICBFbnRyeV9Qb2ludF9TeW1ib2wgPSBzeW1ib2xQOwotI2lmZGVmIEhBQ0tfREVDX0NfU1RBUlRVUAotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICoJU2NhbiBhbGwgdGhlIGZyYWdtZW50IGNoYWlucyBmb3IgdGhlIG9uZSB3aXRoICJfbWFpbiIKLQkgICAqCShBY3R1YWxseSB3ZSBrbm93IHRoZSBmcmFnbWVudCBmcm9tIHRoZSBzeW1ib2wsIGJ1dCB3ZSBuZWVkCi0JICAgKgkgdGhlIHByZXZpb3VzIGZyYWdtZW50IHNvIHdlIGNhbiBjaGFuZ2UgaXRzIHBvaW50ZXIpCi0JICAgKi8KLQkgIGZyY2hhaW5QID0gZnJjaGFpbl9yb290OwotCSAgd2hpbGUgKGZyY2hhaW5QKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKglTY2FuIGFsbCB0aGUgZnJhZ21lbnRzIGluIHRoaXMgY2hhaW4sIHJlbWVtYmVyaW5nCi0JICAgICAgICoJdGhlICJwcmV2aW91cyBmcmFnbWVudCIKLQkgICAgICAgKi8KLQkgICAgICBwcmV2X2ZyYWdQUCA9ICZmcmNoYWluUC0+ZnJjaF9yb290OwotCSAgICAgIGZyYWdQID0gZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgICAgICB3aGlsZSAoZnJhZ1AgJiYgKGZyYWdQICE9IGZyY2hhaW5QLT5mcmNoX2xhc3QpKQotCQl7Ci0JCSAgLyoKLQkJICAgKglJcyB0aGlzIHRoZSBmcmFnbWVudD8KLQkJICAgKi8KLQkJICBpZiAoZnJhZ1AgPT0gc3ltYm9sUC0+c3lfZnJhZykKLQkJICAgIHsKLQkJICAgICAgLyoKLQkJICAgICAgICoJWWVzOiBNb2RpZnkgdGhlIGZyYWdtZW50IGJ5IHJlcGxhY2luZwotCQkgICAgICAgKgkgICAgIGl0IHdpdGggYSBuZXcgZnJhZ21lbnQuCi0JCSAgICAgICAqLwotCQkgICAgICBOZXdfRnJhZyA9IChmcmFnUyAqKQotCQkJeG1hbGxvYyAoc2l6ZW9mICgqTmV3X0ZyYWcpICsKLQkJCQkgZnJhZ1AtPmZyX2ZpeCArCi0JCQkJIGZyYWdQLT5mcl92YXIgKwotCQkJCSA1KTsKLQkJICAgICAgLyoKLQkJICAgICAgICoJVGhlIGZyYWdtZW50cyBhcmUgdGhlIHNhbWUgZXhjZXB0Ci0JCSAgICAgICAqCXRoYXQgdGhlICJmaXhlZCIgYXJlYSBpcyBsYXJnZXIKLQkJICAgICAgICovCi0JCSAgICAgICpOZXdfRnJhZyA9ICpmcmFnUDsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2ZpeCArPSA2OwotCQkgICAgICAvKgotCQkgICAgICAgKglDb3B5IHRoZSBsaXRlcmFsIGRhdGEgb3BlbmluZyBhIGhvbGUKLQkJICAgICAgICoJMiBieXRlcyBhZnRlciAiX21haW4iIChpLmUuIGp1c3QgYWZ0ZXIKLQkJICAgICAgICoJdGhlIGVudHJ5IG1hc2spLiAgSW50byB3aGljaCB3ZSBwbGFjZQotCQkgICAgICAgKgl0aGUgSlNCIGluc3RydWN0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbMF0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFswXTsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbMV0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFsxXTsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbMl0gPSAweDE2OwkvKiBKc2IgKi8KLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbM10gPSAweGVmOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFs0XSA9IDA7Ci0JCSAgICAgIE5ld19GcmFnLT5mcl9saXRlcmFsWzVdID0gMDsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbNl0gPSAwOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFs3XSA9IDA7Ci0JCSAgICAgIGZvciAoaSA9IDI7IGkgPCBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX3ZhcjsgaSsrKQotCQkJTmV3X0ZyYWctPmZyX2xpdGVyYWxbaSArIDZdID0KLQkJCSAgZnJhZ1AtPmZyX2xpdGVyYWxbaV07Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCU5vdyByZXBsYWNlIHRoZSBvbGQgZnJhZ21lbnQgd2l0aCB0aGUKLQkJICAgICAgICoJbmV3bHkgZ2VuZXJhdGVkIG9uZS4KLQkJICAgICAgICovCi0JCSAgICAgICpwcmV2X2ZyYWdQUCA9IE5ld19GcmFnOwotCQkgICAgICAvKgotCQkgICAgICAgKglSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3ltYm9sCi0JCSAgICAgICAqLwotCQkgICAgICBFbnRyeV9Qb2ludF9TeW1ib2wgPSBzeW1ib2xQOwotCQkgICAgICAvKgotCQkgICAgICAgKglTY2FuIHRoZSB0ZXh0IGFyZWEgZml4dXAgc3RydWN0dXJlcwotCQkgICAgICAgKglhcyBvZmZzZXRzIGluIHRoZSBmcmFnbWVudCBtYXkgaGF2ZQotCQkgICAgICAgKgljaGFuZ2VkCi0JCSAgICAgICAqLwotCQkgICAgICBmb3IgKGZpeFAgPSB0ZXh0X2ZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLQkJCXsKLQkJCSAgLyoKLQkJCSAgICoJTG9vayBmb3IgcmVmZXJlbmNlcyB0byB0aGlzCi0JCQkgICAqCWZyYWdtZW50LgotCQkJICAgKi8KLQkJCSAgaWYgKGZpeFAtPmZ4X2ZyYWcgPT0gZnJhZ1ApCi0JCQkgICAgewotCQkJICAgICAgLyoKLQkJCSAgICAgICAqCUNoYW5nZSB0aGUgZnJhZ21lbnQKLQkJCSAgICAgICAqCXBvaW50ZXIKLQkJCSAgICAgICAqLwotCQkJICAgICAgZml4UC0+ZnhfZnJhZyA9IE5ld19GcmFnOwotCQkJICAgICAgLyoKLQkJCSAgICAgICAqCUlmIHRoZSBvZmZzZXQgaXMgYWZ0ZXIKLQkJCSAgICAgICAqCXRoZSBlbnRyeSBtYXNrIHdlIG5lZWQKLQkJCSAgICAgICAqCXRvIGFjY291bnQgZm9yIHRoZSBKU0IKLQkJCSAgICAgICAqCWluc3RydWN0aW9uIHdlIGp1c3QKLQkJCSAgICAgICAqCWluc2VydGVkLgotCQkJICAgICAgICovCi0JCQkgICAgICBpZiAoZml4UC0+Znhfd2hlcmUgPj0gMikKLQkJCQlmaXhQLT5meF93aGVyZSArPSA2OwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgLyoKLQkJICAgICAgICoJU2NhbiB0aGUgc3ltYm9scyBhcyBvZmZzZXRzIGluIHRoZQotCQkgICAgICAgKglmcmFnbWVudCBtYXkgaGF2ZSBjaGFuZ2VkCi0JCSAgICAgICAqLwotCQkgICAgICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7Ci0JCQkgICBzeW1ib2xQOwotCQkJICAgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLQkJCXsKLQkJCSAgLyoKLQkJCSAgICoJTG9vayBmb3IgcmVmZXJlbmNlcyB0byB0aGlzCi0JCQkgICAqCWZyYWdtZW50LgotCQkJICAgKi8KLQkJCSAgaWYgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gZnJhZ1ApCi0JCQkgICAgewotCQkJICAgICAgLyoKLQkJCSAgICAgICAqCUNoYW5nZSB0aGUgZnJhZ21lbnQKLQkJCSAgICAgICAqCXBvaW50ZXIKLQkJCSAgICAgICAqLwotCQkJICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IE5ld19GcmFnOwotCQkJICAgICAgLyoKLQkJCSAgICAgICAqCUlmIHRoZSBvZmZzZXQgaXMgYWZ0ZXIKLQkJCSAgICAgICAqCXRoZSBlbnRyeSBtYXNrIHdlIG5lZWQKLQkJCSAgICAgICAqCXRvIGFjY291bnQgZm9yIHRoZSBKU0IKLQkJCSAgICAgICAqCWluc3RydWN0aW9uIHdlIGp1c3QKLQkJCSAgICAgICAqCWluc2VydGVkLgotCQkJICAgICAgICovCi0JCQkgICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApID49IDIpCi0JCQkJU19TRVRfVkFMVUUgKHN5bWJvbFAsCi0JCQkJCSAgICAgU19HRVRfVkFMVUUgKHN5bWJvbFApICsgNik7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICAvKgotCQkgICAgICAgKglNYWtlIGEgc3ltYm9sIHJlZmVyZW5jZSB0bwotCQkgICAgICAgKgkiX2MkbWFpbl9hcmdzIiBzbyB3ZSBjYW4gZ2V0Ci0JCSAgICAgICAqCWl0cyBhZGRyZXNzIGluc2VydGVkIGludG8gdGhlCi0JCSAgICAgICAqCUpTQiBpbnN0cnVjdGlvbi4KLQkJICAgICAgICovCi0JCSAgICAgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSB4bWFsbG9jIChzaXplb2YgKCpzeW1ib2xQKSk7Ci0JCSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsICJfQyRNQUlOX0FSR1MiKTsKLQkJICAgICAgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9VTkRGKTsKLQkJICAgICAgU19TRVRfT1RIRVIgKHN5bWJvbFAsIDApOwotCQkgICAgICBTX1NFVF9ERVNDIChzeW1ib2xQLCAwKTsKLQkJICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIDApOwotCQkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X251bWJlciA9IDA7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X29iaiA9IDA7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSBOZXdfRnJhZzsKLQkJICAgICAgc3ltYm9sUC0+c3lfcmVzb2x2ZWQgPSAwOwotCQkgICAgICBzeW1ib2xQLT5zeV9yZXNvbHZpbmcgPSAwOwotCQkgICAgICAvKiB0aGlzIGFjdHVhbGx5IGluc2VydHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCAqLwotCQkgICAgICBzeW1ib2xfYXBwZW5kIChzeW1ib2xfcm9vdFAsIHN5bWJvbFAsCi0JCQkJICAgICAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotCQkgICAgICBzeW1ib2xfcm9vdFAgPSBzeW1ib2xQOwotCQkgICAgICAvKgotCQkgICAgICAgKglHZW5lcmF0ZSBhIHRleHQgZml4dXAgc3RydWN0dXJlCi0JCSAgICAgICAqCXRvIGdldCAiX2MkbWFpbl9hcmdzIiBzdG9yZWQgaW50byB0aGUKLQkJICAgICAgICoJSlNCIGluc3RydWN0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgZml4UCA9IChzdHJ1Y3QgZml4ICopIHhtYWxsb2MgKHNpemVvZiAoKmZpeFApKTsKLQkJICAgICAgZml4UC0+ZnhfZnJhZyA9IE5ld19GcmFnOwotCQkgICAgICBmaXhQLT5meF93aGVyZSA9IDQ7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gc3ltYm9sUDsKLQkJICAgICAgZml4UC0+Znhfc3Vic3kgPSAwOwotCQkgICAgICBmaXhQLT5meF9vZmZzZXQgPSAwOwotCQkgICAgICBmaXhQLT5meF9zaXplID0gNDsKLQkJICAgICAgZml4UC0+ZnhfcGNyZWwgPSAxOwotCQkgICAgICBmaXhQLT5meF9uZXh0ID0gdGV4dF9maXhfcm9vdDsKLQkJICAgICAgdGV4dF9maXhfcm9vdCA9IGZpeFA7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCU5vdyBtYWtlIHN1cmUgd2UgZXhpdCBmcm9tIHRoZSBsb29wCi0JCSAgICAgICAqLwotCQkgICAgICBmcmNoYWluUCA9IDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qCi0JCSAgICoJVHJ5IHRoZSBuZXh0IGZyYWdtZW50Ci0JCSAgICovCi0JCSAgcHJldl9mcmFnUFAgPSAmZnJhZ1AtPmZyX25leHQ7Ci0JCSAgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dDsKLQkJfQotCSAgICAgIC8qCi0JICAgICAgICoJVHJ5IHRoZSBuZXh0IGZyYWdtZW50IGNoYWluCi0JICAgICAgICovCi0JICAgICAgaWYgKGZyY2hhaW5QKQotCQlmcmNoYWluUCA9IGZyY2hhaW5QLT5mcmNoX25leHQ7Ci0JICAgIH0KLQl9Ci0jZW5kaWYgLyogSEFDS19ERUNfQ19TVEFSVFVQICovCi0gICAgfQotfQotDAotCi0vKgotICoJQmVnaW5uaW5nIG9mIHZtc193cml0ZV9vYmplY3RfZmlsZSgpLgotICovCi0KLXN0YXRpYwotc3RydWN0IHZtc19vYmpfc3RhdGUgewotCi0gIC8qIE5leHQgcHJvZ3JhbSBzZWN0aW9uIGluZGV4IHRvIHVzZS4gICovCi0gIGludAlwc2VjdF9udW1iZXI7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIGNvZGUuICBBbHdheXMgZW5kcyB1cCAjMC4gICovCi0gIGludAl0ZXh0X3BzZWN0OwotCi0gIC8qIFBzZWN0IGluZGV4IGZvciBpbml0aWFsaXplZCBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLSAgaW50CWRhdGFfcHNlY3Q7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIHVuaW5pdGlhbGl6ZWQgc3RhdGljIHZhcmlhYmxlcy4gICovCi0gIGludAlic3NfcHNlY3Q7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIHN0YXRpYyBjb25zdHJ1Y3RvcnMuICAqLwotICBpbnQJY3RvcnNfcHNlY3Q7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIHN0YXRpYyBkZXN0cnVjdG9ycy4gICovCi0gIGludAlkdG9yc19wc2VjdDsKLQotICAvKiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgbG9jYWwgc3ltYm9sIGRhdGEuICAqLwotICBpbnQJbG9jYWxfaW5pdGRfZGF0YV9zaXplOwotCi0gIC8qIER5bmFtaWMgYnVmZmVyIGZvciBpbml0aWFsaXplZCBkYXRhLiAgKi8KLSAgY2hhciAqZGF0YV9zZWdtZW50OwotCi19IHZtc19vYmpfc3RhdGU7Ci0KLSNkZWZpbmUgUHNlY3RfTnVtYmVyCQl2bXNfb2JqX3N0YXRlLnBzZWN0X251bWJlcgotI2RlZmluZSBUZXh0X1BzZWN0CQl2bXNfb2JqX3N0YXRlLnRleHRfcHNlY3QKLSNkZWZpbmUgRGF0YV9Qc2VjdAkJdm1zX29ial9zdGF0ZS5kYXRhX3BzZWN0Ci0jZGVmaW5lIEJzc19Qc2VjdAkJdm1zX29ial9zdGF0ZS5ic3NfcHNlY3QKLSNkZWZpbmUgQ3RvcnNfUHNlY3QJCXZtc19vYmpfc3RhdGUuY3RvcnNfcHNlY3QKLSNkZWZpbmUgRHRvcnNfUHNlY3QJCXZtc19vYmpfc3RhdGUuZHRvcnNfcHNlY3QKLSNkZWZpbmUgTG9jYWxfSW5pdGRfRGF0YV9TaXplCXZtc19vYmpfc3RhdGUubG9jYWxfaW5pdGRfZGF0YV9zaXplCi0jZGVmaW5lIERhdGFfU2VnbWVudAkJdm1zX29ial9zdGF0ZS5kYXRhX3NlZ21lbnQKLQotCi0jZGVmaW5lIElTX0dYWF9WVEFCTEUoc3ltUCkgKHN0cm5jbXAgKFNfR0VUX05BTUUgKHN5bVApLCAiX192dC4iLCA1KSA9PSAwKQotI2RlZmluZSBJU19HWFhfWFRPUihzeW1QKSAoc3RybmNtcCAoU19HRVRfTkFNRSAoc3ltUCksICJfX0dMT0JBTF8uIiwgMTApID09IDApCi0jZGVmaW5lIFhUT1JfU0laRSA0Ci0MCi0KLS8qIFBlcmZvcm0gdGV4dCBzZWdtZW50IGZpeHVwcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfZml4dXBfdGV4dF9zZWN0aW9uICh0ZXh0X3NpeiwgdGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290KQotICAgICB1bnNpZ25lZCB0ZXh0X3NpejsKLSAgICAgc3RydWN0IGZyYWcgKnRleHRfZnJhZ19yb290OwotICAgICBzdHJ1Y3QgZnJhZyAqZGF0YV9mcmFnX3Jvb3Q7Ci17Ci0gIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgcmVnaXN0ZXIgc3RydWN0IGZpeCAqZml4UDsKLSAgb2Zmc2V0VCBkaWY7Ci0KLSAgLyogU2NhbiB0aGUgdGV4dCBmcmFnbWVudHMuICAqLwotICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotICAgIHsKLSAgICAgIC8qIFN0b3AgaWYgd2UgZ2V0IHRvIHRoZSBkYXRhIGZyYWdtZW50cy4gICovCi0gICAgICBpZiAoZnJhZ1AgPT0gZGF0YV9mcmFnX3Jvb3QpCi0JYnJlYWs7Ci0gICAgICAvKiBJZ25vcmUgZnJhZ21lbnRzIHdpdGggbm8gZGF0YS4gICovCi0gICAgICBpZiAoKGZyYWdQLT5mcl9maXggPT0gMCkgJiYgKGZyYWdQLT5mcl92YXIgPT0gMCkpCi0JY29udGludWU7Ci0gICAgICAvKiBHbyB0aGUgdGhlIGFwcHJvcHJpYXRlIG9mZnNldCBpbiB0aGUgVGV4dCBQc2VjdC4gICovCi0gICAgICBWTVNfU2V0X1BzZWN0IChUZXh0X1BzZWN0LCBmcmFnUC0+ZnJfYWRkcmVzcywgT0JKX1NfQ19USVIpOwotICAgICAgLyogU3RvcmUgdGhlICJmaXhlZCIgcGFydC4gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX2ZpeCkKLQlWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKGZyYWdQLT5mcl9saXRlcmFsLAotCQkJCSAgZnJhZ1AtPmZyX2ZpeCwKLQkJCQkgIE9CSl9TX0NfVElSKTsKLSAgICAgIC8qIFN0b3JlIHRoZSAidmFyaWFibGUiIHBhcnQuICAqLwotICAgICAgaWYgKGZyYWdQLT5mcl92YXIgJiYgZnJhZ1AtPmZyX29mZnNldCkKLQlWTVNfU3RvcmVfUmVwZWF0ZWRfRGF0YSAoZnJhZ1AtPmZyX29mZnNldCwKLQkJCQkgZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LAotCQkJCSBmcmFnUC0+ZnJfdmFyLAotCQkJCSBPQkpfU19DX1RJUik7Ci0gICAgfQkJCS8qIHRleHQgZnJhZyBsb29wICovCi0KLSAgLyoKLSAgICoJTm93IHdlIGdvIHRocm91Z2ggdGhlIHRleHQgc2VnbWVudCBmaXh1cHMgYW5kIGdlbmVyYXRlCi0gICAqCVRJUiByZWNvcmRzIHRvIGZpeCB1cCBhZGRyZXNzZXMgd2l0aGluIHRoZSBUZXh0IFBzZWN0LgotICAgKi8KLSAgZm9yIChmaXhQID0gdGV4dF9maXhfcm9vdDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotICAgICAgLyogV2UgRE8gaGFuZGxlIHRoZSBjYXNlIG9mICJTeW1ib2wgLSBTeW1ib2wiIGFzCi0JIGxvbmcgYXMgaXQgaXMgaW4gdGhlIHNhbWUgc2VnbWVudC4gICovCi0gICAgICBpZiAoZml4UC0+Znhfc3Vic3kgJiYgZml4UC0+ZnhfYWRkc3kpCi0JewotCSAgLyogVGhleSBuZWVkIHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgaWYgKFNfR0VUX1JBV19UWVBFIChmaXhQLT5meF9zdWJzeSkgIT0KLQkgICAgICBTX0dFVF9SQVdfVFlQRSAoZml4UC0+ZnhfYWRkc3kpKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSB0aGUgc2FtZSB0eXBlIikpOwotCSAgLyogQW5kIHRoZXkgbmVlZCB0byBiZSBpbiBvbmUgdGhhdCB3ZSBjYW4gY2hlY2sgdGhlIHBzZWN0IG9uLiAgKi8KLQkgIGlmICgoU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpICE9IE5fREFUQSkgJiYKLQkJICAgIChTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkgIT0gTl9URVhUKSkKLQkgICAgZXJyb3IgKF8oIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgYW4gYXBwcm9wcmlhdGUgdHlwZSIpKTsKLQkgIC8qIFRoaXMgaGFkIGJldHRlciBub3QgYmUgUEMgcmVsYXRpdmUhICAqLwotCSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0YSBpcyBlcnJvbmVvdXNseSBcInBjcmVsXCIiKSk7Ci0JICAvKiBTdWJ0cmFjdCB0aGVpciB2YWx1ZXMgdG8gZ2V0IHRoZSBkaWZmZXJlbmNlLiAgKi8KLQkgIGRpZiA9IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSkgLSBTX0dFVF9WQUxVRSAoZml4UC0+Znhfc3Vic3kpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChMb2NhbCwgKHZhbHVlVClkaWYsIGZpeFAtPmZ4X3NpemUpOwotCSAgLyogTm93IGdlbmVyYXRlIHRoZSBmaXh1cCBvYmplY3QgcmVjb3JkczsKLQkgICAgIHNldCB0aGUgcHNlY3QgYW5kIHN0b3JlIHRoZSBkYXRhLiAgKi8KLQkgIFZNU19TZXRfUHNlY3QgKFRleHRfUHNlY3QsCi0JCQkgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzLAotCQkJIE9CSl9TX0NfVElSKTsKLQkgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsCi0JCQkJICAgIGZpeFAtPmZ4X3NpemUsCi0JCQkJICAgIE9CSl9TX0NfVElSKTsKLQkgIGNvbnRpbnVlOwkvKiBkb25lIHdpdGggdGhpcyBmaXh1cCAqLwotCSAgICB9CQkvKiBpZiBmeF9zdWJzeSAmJiBmeF9hZGRzeSAqLwotICAgICAgLyogU2l6ZSB3aWxsIEhBVkUgdG8gYmUgImxvbmciLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9zaXplICE9IDQpCi0JZXJyb3IgKF8oIkZpeHVwIGRhdHVtIGlzIG5vdCBhIGxvbmd3b3JkIikpOwotICAgICAgLyogU3ltYm9sIG11c3QgYmUgImFkZGVkIiAoaWYgaXQgaXMgZXZlcgotCSBzdWJ0cmFjdGVkIHdlIGNhbiBmaXggdGhpcyBhc3N1bXB0aW9uKS4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQllcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IFwiZml4UC0+ZnhfYWRkc3lcIiIpKTsKLSAgICAgIC8qIFN0b3JlIHRoZSBzeW1ib2wgdmFsdWUgaW4gYSBQSUMgZmFzaGlvbi4gICovCi0gICAgICBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgKGZpeFAtPmZ4X2FkZHN5LAotCQkJCSAgICAgIGZpeFAtPmZ4X29mZnNldCwKLQkJCQkgICAgICBmaXhQLT5meF9wY3JlbCwKLQkJCQkgICAgICBUZXh0X1BzZWN0LAotCQkJCSAgICBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCi0JCQkJICAgICAgT0JKX1NfQ19USVIpOwotCSAgLyoKLQkgICAqICBDaGVjayBmb3IgaW5kaXJlY3QgYWRkcmVzcyByZWZlcmVuY2UsIHdoaWNoIGhhcyB0byBiZSBmaXhlZCB1cAotCSAgICogIChhcyB0aGUgbGlua2VyIHdpbGwgc2NyZXcgaXQgdXAgd2l0aCBUSVJfU19DX1NUT19QSUNSKS4uLgotCSAgICovCi0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JVk1TX0ZpeF9JbmRpcmVjdF9SZWZlcmVuY2UgKFRleHRfUHNlY3QsCi0JCQkJICAgIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkgICAgZml4UC0+ZnhfZnJhZywKLQkJCQkgICAgdGV4dF9mcmFnX3Jvb3QpOwotICAgIH0JCQkvKiB0ZXh0IGZpeCBsb29wICovCi19Ci0MCi0KLS8qIENyZWF0ZSBhIGJ1ZmZlciBob2xkaW5nIHRoZSBkYXRhIHNlZ21lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc3ludGhlc2l6ZV9kYXRhX3NlZ21lbnQgKGRhdGFfc2l6LCB0ZXh0X3NpeiwgZGF0YV9mcmFnX3Jvb3QpCi0gICAgIHVuc2lnbmVkIGRhdGFfc2l6LCB0ZXh0X3NpejsKLSAgICAgc3RydWN0IGZyYWcgKmRhdGFfZnJhZ19yb290OwotewotICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gIGNoYXIgKmZpbGxfbGl0ZXJhbDsKLSAgbG9uZyBmaWxsX3NpemUsIGNvdW50LCBpOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBkYXRhIHNlZ21lbnQuICAqLwotICBEYXRhX1NlZ21lbnQgPSAoY2hhciAqKSB4bWFsbG9jIChkYXRhX3Npeik7Ci0gIC8qIFJ1biB0aHJvdWdoIHRoZSBkYXRhIGZyYWdtZW50cywgZmlsbGluZyBpbiB0aGUgc2VnbWVudC4gICovCi0gIGZvciAoZnJhZ1AgPSBkYXRhX2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgaSA9IGZyYWdQLT5mcl9hZGRyZXNzIC0gdGV4dF9zaXo7Ci0gICAgICBpZiAoZnJhZ1AtPmZyX2ZpeCkKLQltZW1jcHkgKERhdGFfU2VnbWVudCArIGksIGZyYWdQLT5mcl9saXRlcmFsLCBmcmFnUC0+ZnJfZml4KTsKLSAgICAgIGkgKz0gZnJhZ1AtPmZyX2ZpeDsKLQotICAgICAgaWYgKChmaWxsX3NpemUgPSBmcmFnUC0+ZnJfdmFyKSAhPSAwKQotCXsKLQkgIGZpbGxfbGl0ZXJhbCA9IGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeDsKLQkgIGZvciAoY291bnQgPSBmcmFnUC0+ZnJfb2Zmc2V0OyBjb3VudDsgY291bnQtLSkKLQkgICAgewotCSAgICAgIG1lbWNweSAoRGF0YV9TZWdtZW50ICsgaSwgZmlsbF9saXRlcmFsLCBmaWxsX3NpemUpOwotCSAgICAgIGkgKz0gZmlsbF9zaXplOwotCSAgICB9Ci0JfQotICAgIH0JCQkvKiBkYXRhIGZyYWcgbG9vcCAqLwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBQZXJmb3JtIGRhdGEgc2VnbWVudCBmaXh1cHMuICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2ZpeHVwX2RhdGFfc2VjdGlvbiAoZGF0YV9zaXosIHRleHRfc2l6KQotICAgICB1bnNpZ25lZCBkYXRhX3NpeiwgdGV4dF9zaXo7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBmaXggKmZpeFA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnNwOwotICBhZGRyZXNzVCBmcl9hZGRyZXNzOwotICBvZmZzZXRUIGRpZjsKLSAgdmFsdWVUIHZhbDsKLQotICAvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIGRhdGEgc3ltYm9scyBhbmQgc3RvcmUgdGhlIGRhdGEuICAqLwotICBmb3IgKHZzcCA9IFZNU19TeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKLSAgICB7Ci0gICAgICAvKiBJZ25vcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBkYXRhIHN5bWJvbHMuICAqLwotICAgICAgaWYgKFNfR0VUX1RZUEUgKHZzcC0+U3ltYm9sKSAhPSBOX0RBVEEpCi0JY29udGludWU7Ci0gICAgICAvKiBTZXQgdGhlIFBzZWN0ICsgT2Zmc2V0LiAgKi8KLSAgICAgIFZNU19TZXRfUHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCi0JCSAgICAgICB2c3AtPlBzZWN0X09mZnNldCwKLQkJICAgICAgIE9CSl9TX0NfVElSKTsKLSAgICAgIC8qIFN0b3JlIHRoZSBkYXRhLiAgKi8KLSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFICh2c3AtPlN5bWJvbCk7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKERhdGFfU2VnbWVudCArIHZhbCAtIHRleHRfc2l6LAotCQkJCXZzcC0+U2l6ZSwKLQkJCQlPQkpfU19DX1RJUik7Ci0gICAgfQkJCS8qIE5fREFUQSBzeW1ib2wgbG9vcCAqLwotCi0gIC8qCi0gICAqCU5vdyB3ZSBnbyB0aHJvdWdoIHRoZSBkYXRhIHNlZ21lbnQgZml4dXBzIGFuZCBnZW5lcmF0ZQotICAgKglUSVIgcmVjb3JkcyB0byBmaXggdXAgYWRkcmVzc2VzIHdpdGhpbiB0aGUgRGF0YSBQc2VjdHMuCi0gICAqLwotICBmb3IgKGZpeFAgPSBkYXRhX2ZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBGaW5kIHRoZSBzeW1ib2wgZm9yIHRoZSBjb250YWluaW5nIGRhdHVtLiAgKi8KLSAgICAgIGZvciAodnNwID0gVk1TX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCXsKLQkgIC8qIE9ubHkgYm90aGVyIHdpdGggRGF0YSBzeW1ib2xzLiAgKi8KLQkgIHNwID0gdnNwLT5TeW1ib2w7Ci0JICBpZiAoU19HRVRfVFlQRSAoc3ApICE9IE5fREFUQSkKLQkgICAgY29udGludWU7Ci0JICAvKiBJZ25vcmUgc3ltYm9sIGlmIEFmdGVyIGZpeHVwLiAgKi8KLQkgIHZhbCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0JICBmcl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLQkgIGlmICh2YWwgPiBmaXhQLT5meF93aGVyZSArIGZyX2FkZHJlc3MpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogU2VlIGlmIHRoZSBkYXR1bSBpcyBoZXJlLiAgKi8KLQkgIGlmICh2YWwgKyB2c3AtPlNpemUgPD0gZml4UC0+Znhfd2hlcmUgKyBmcl9hZGRyZXNzKQotCSAgICBjb250aW51ZTsKLQkgIC8qIFdlIERPIGhhbmRsZSB0aGUgY2FzZSBvZiAiU3ltYm9sIC0gU3ltYm9sIiBhcwotCSAgICAgbG9uZyBhcyBpdCBpcyBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLQkgIGlmIChmaXhQLT5meF9zdWJzeSAmJiBmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIC8qIFRoZXkgbmVlZCB0byBiZSBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLQkgICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKGZpeFAtPmZ4X3N1YnN5KSAhPQotCQkgIFNfR0VUX1JBV19UWVBFIChmaXhQLT5meF9hZGRzeSkpCi0JCWVycm9yIChfKCJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIHRoZSBzYW1lIHR5cGUiKSk7Ci0JICAgICAgLyogQW5kIHRoZXkgbmVlZCB0byBiZSBpbiBvbmUgdGhhdCB3ZSBjYW4gY2hlY2sgdGhlIHBzZWN0IG9uLiAgKi8KLQkgICAgICBpZiAoKFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSAhPSBOX0RBVEEpICYmCi0JCSAgKFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSAhPSBOX1RFWFQpKQotCQllcnJvciAoXygiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIikpOwotCSAgICAgIC8qIFRoaXMgaGFkIGJldHRlciBub3QgYmUgUEMgcmVsYXRpdmUhICAqLwotCSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQkJZXJyb3IgKF8oIkZpeHVwIGRhdGEgaXMgZXJyb25lb3VzbHkgXCJwY3JlbFwiIikpOwotCSAgICAgIC8qIFN1YnRyYWN0IHRoZWlyIHZhbHVlcyB0byBnZXQgdGhlIGRpZmZlcmVuY2UuICAqLwotCSAgICAgIGRpZiA9IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSkgLSBTX0dFVF9WQUxVRSAoZml4UC0+Znhfc3Vic3kpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoTG9jYWwsICh2YWx1ZVQpZGlmLCBmaXhQLT5meF9zaXplKTsKLQkgICAgICAvKgotCSAgICAgICAqIE5vdyBnZW5lcmF0ZSB0aGUgZml4dXAgb2JqZWN0IHJlY29yZHM7Ci0JICAgICAgICogc2V0IHRoZSBwc2VjdCBhbmQgc3RvcmUgdGhlIGRhdGEuCi0JICAgICAgICovCi0JICAgICAgVk1TX1NldF9Qc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJCSAgICAgZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlCi0JCQkJIC0gdmFsICsgdnNwLT5Qc2VjdF9PZmZzZXQsCi0JCQkgICAgIE9CSl9TX0NfVElSKTsKLQkgICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLAotCQkJCQlmaXhQLT5meF9zaXplLAotCQkJCQlPQkpfU19DX1RJUik7Ci0JCSAgYnJlYWs7CS8qIGRvbmUgd2l0aCB0aGlzIGZpeHVwICovCi0JCX0KLQkgIC8qIFNpemUgd2lsbCBIQVZFIHRvIGJlICJsb25nIi4gICovCi0JICBpZiAoZml4UC0+Znhfc2l6ZSAhPSA0KQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiKSk7Ci0JICAvKiBTeW1ib2wgbXVzdCBiZSAiYWRkZWQiIChpZiBpdCBpcyBldmVyCi0JICAgICBzdWJ0cmFjdGVkIHdlIGNhbiBmaXggdGhpcyBhc3N1bXB0aW9uKS4gICovCi0JICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQkgICAgZXJyb3IgKF8oIkZpeHVwIGRhdHVtIGlzIG5vdCBcImZpeFAtPmZ4X2FkZHN5XCIiKSk7Ci0JICAvKiBTdG9yZSB0aGUgc3ltYm9sIHZhbHVlIGluIGEgUElDIGZhc2hpb24uICAqLwotCSAgVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlIChmaXhQLT5meF9hZGRzeSwKLQkJCQkJICBmaXhQLT5meF9vZmZzZXQsCi0JCQkJCSAgZml4UC0+ZnhfcGNyZWwsCi0JCQkJCSAgdnNwLT5Qc2VjdF9JbmRleCwKLQkJCQkJICBmcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUKLQkJCQkJICAgICAgLSB2YWwgKyB2c3AtPlBzZWN0X09mZnNldCwKLQkJCQkJICBPQkpfU19DX1RJUik7Ci0JICAvKiBEb25lIHdpdGggdGhpcyBmaXh1cC4gICovCi0JICBicmVhazsKLQl9CQkvKiB2bXNfc3ltYm9sIGxvb3AgKi8KLQotICAgIH0JCQkvKiBkYXRhIGZpeCBsb29wICovCi19Ci0KLS8qIFBlcmZvcm0gY3RvcnMvZHRvcnMgc2VnbWVudCBmaXh1cHMuICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24gKHN5bWJvbHMsIHNlY3Rfbm8pCi0Jc3RydWN0IFZNU19TeW1ib2wgKnN5bWJvbHM7Ci0JaW50IHNlY3Rfbm87Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci0KLSAgLyogUnVuIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZCBzdG9yZSB0aGUgZGF0YS4gICovCi0gIGZvciAodnNwID0gc3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3ltYm9sUyAqc3A7Ci0KLSAgICAgIC8qIFNldCByZWxvY2F0aW9uIGJhc2UuICAqLwotICAgICAgVk1TX1NldF9Qc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwgdnNwLT5Qc2VjdF9PZmZzZXQsIE9CSl9TX0NfVElSKTsKLQotICAgICAgc3AgPSB2c3AtPlN5bWJvbDsKLSAgICAgIC8qIFN0YWNrIHRoZSBQc2VjdCBiYXNlIHdpdGggaXRzIG9mZnNldC4gICovCi0gICAgICBWTVNfU2V0X0RhdGEgKFRleHRfUHNlY3QsIFNfR0VUX1ZBTFVFIChzcCksIE9CSl9TX0NfVElSLCAwKTsKLSAgICB9Ci0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLQotICByZXR1cm47Ci19Ci0MCi0KLS8qIERlZmluZSBzeW1ib2xzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5ICh0ZXh0X3NpeiwgZGF0YV9zaXopCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6LCBkYXRhX3NpejsKLXsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBzeW1ib2xTICpzcDsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLSAgaW50IEdsb2JhbHJlZiwgZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2w7Ci0KLSNpZiAwCi0gIC8qIFRoZSBnKysgY29tcGlsZXIgZG9lcyBub3Qgd3JpdGUgb3V0IGV4dGVybmFsIHJlZmVyZW5jZXMgdG8KLSAgICAgdnRhYmxlcyBjb3JyZWN0bHkuICBDaGVjayBmb3IgdGhpcyBhbmQgaG9sbGVyIGlmIHdlIHNlZSBpdAotICAgICBoYXBwZW5pbmcuICBJZiB0aGF0IGNvbXBpbGVyIGJ1ZyBpcyBldmVyIGZpeGVkIHdlIGNhbiByZW1vdmUKLSAgICAgdGhpcy4KLQotICAgICAoSnVuJzk1OiBnY2MgMi43LjAncyBjYzFwbHVzIHN0aWxsIGV4aGliaXRzIHRoaXMgYmVoYXZpb3IuKQotCi0gICAgIFRoaXMgd2FzIHJlcG9ydGVkbHkgZml4ZWQgYXMgb2YgSnVuZSAyLCAxOTk4LiAgICovCi0KLSAgZm9yIChzcCA9IHN5bWJvbF9yb290UDsgc3A7IHNwID0gc3ltYm9sX25leHQgKHNwKSkKLSAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHNwKSA9PSBOX1VOREYgJiYgSVNfR1hYX1ZUQUJMRSAoc3ApKQotICAgICAgewotCVNfU0VUX1RZUEUgKHNwLCBOX1VOREYgfCBOX0VYVCk7Ci0JU19TRVRfT1RIRVIgKHNwLCAxKTsKLQlhc193YXJuIChfKCJnKysgd3JvdGUgYW4gZXh0ZXJuIHJlZmVyZW5jZSB0byBgJXMnIGFzIGEgcm91dGluZS5cbkkgd2lsbCBmaXggaXQsIGJ1dCBJIGhvcGUgdGhhdCBpdCB3YXMgbm90ZSByZWFsbHkgYSByb3V0aW5lLiIpLAotCQkgU19HRVRfTkFNRSAoc3ApKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gIC8qCi0gICAqIE5vdyBzY2FuIHRoZSBzeW1ib2xzIGFuZCBlbWl0IHRoZSBhcHByb3ByaWF0ZSBHU0QgcmVjb3JkcwotICAgKi8KLSAgZm9yIChzcCA9IHN5bWJvbF9yb290UDsgc3A7IHNwID0gc3ltYm9sX25leHQgKHNwKSkKLSAgICB7Ci0gICAgICBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbCA9IDA7Ci0gICAgICB2c3AgPSAwOwotICAgICAgLyogRGlzcGF0Y2ggb24gc3ltYm9sIHR5cGUuICAqLwotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ApKQotCXsKLQotCS8qIEdsb2JhbCB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCWNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0JICAvKiBNYWtlIGEgVk1TIGRhdGEgc3ltYm9sIGVudHJ5LiAgKi8KLQkgIHZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JICB2c3AtPlN5bWJvbCA9IHNwOwotCSAgdnNwLT5TaXplID0gU19HRVRfVkFMVUUgKHNwKTsKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSBQc2VjdF9OdW1iZXIrKzsKLQkgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gMDsKLQkgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOwotCSAgVk1TX1N5bWJvbHMgPSB2c3A7Ci0JICBzcC0+c3lfb2JqID0gdnNwOwotCSAgLyogTWFrZSB0aGUgcHNlY3QgZm9yIHRoaXMgZGF0YS4gICovCi0JICBHbG9iYWxyZWYgPSBWTVNfUHNlY3RfU3BlYyAoU19HRVRfTkFNRSAoc3ApLAotCQkJCSAgICAgIHZzcC0+U2l6ZSwKLQkJCQkgICAgICBTX0dFVF9PVEhFUiAoc3ApID8gcHNfQ09OU1QgOiBwc19DT01NT04sCi0JCQkJICAgICAgdnNwKTsKLQkgIGlmIChHbG9iYWxyZWYpCi0JICAgIFBzZWN0X051bWJlci0tOwotI2lmZGVmCU5PVF9WQVhfMTFfQ19DT01QQVRJQkxFCi0JICBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbCA9IDE7Ci0jZWxzZQotCSAgLyogU2VlIGlmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdnRhYmxlLiAgV2Ugd2FudCB0byBoZWxwIHRoZQotCSAgICAgbGlua2VyIGZpbmQgdGhlc2UgdGhpbmdzIGluIGxpYnJhcmllcywgc28gd2UgbWFrZSBhIHN5bWJvbAotCSAgICAgcmVmZXJlbmNlLiAgVGhpcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFZBWC1DIHVzYWdlIGZvcgotCSAgICAgdmFyaWFibGVzLCBidXQgc2luY2UgdnRhYmxlcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkgYnkKLQkgICAgIGcrKywgd2UgY2FuIGdldCBhd2F5IHdpdGggdGhpcyBoYWNrLiAgKi8KLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gSVNfR1hYX1ZUQUJMRSAoc3ApOwotI2VuZGlmCi0JICBicmVhazsKLQotCS8qIExvY2FsIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0JY2FzZSBOX0JTUzoKLQkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkgIHZzcC0+U3ltYm9sID0gc3A7Ci0JICB2c3AtPlNpemUgPSAwOwotCSAgdnNwLT5Qc2VjdF9JbmRleCA9IEJzc19Qc2VjdDsKLQkgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHNwKSAtIGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzczsKLQkgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOwotCSAgVk1TX1N5bWJvbHMgPSB2c3A7Ci0JICBzcC0+c3lfb2JqID0gdnNwOwotCSAgYnJlYWs7Ci0KLQkvKiBHbG9iYWwgaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0JY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkgIHZzcC0+U3ltYm9sID0gc3A7Ci0JICB2c3AtPlNpemUgPSBWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplIChzcCwgdGV4dF9zaXogKyBkYXRhX3Npeik7Ci0JICB2c3AtPlBzZWN0X0luZGV4ID0gUHNlY3RfTnVtYmVyKys7Ci0JICB2c3AtPlBzZWN0X09mZnNldCA9IDA7Ci0JICB2c3AtPk5leHQgPSBWTVNfU3ltYm9sczsKLQkgIFZNU19TeW1ib2xzID0gdnNwOwotCSAgc3AtPnN5X29iaiA9IHZzcDsKLQkgIC8qIE1ha2UgaXRzIHBzZWN0LiAgKi8KLQkgIEdsb2JhbHJlZiA9IFZNU19Qc2VjdF9TcGVjIChTX0dFVF9OQU1FIChzcCksCi0JCQkJICAgICAgdnNwLT5TaXplLAotCQkJCSAgICAgIFNfR0VUX09USEVSIChzcCkgPyBwc19DT05TVCA6IHBzX0NPTU1PTiwKLQkJCQkgICAgICB2c3ApOwotCSAgaWYgKEdsb2JhbHJlZikKLQkgICAgUHNlY3RfTnVtYmVyLS07Ci0jaWZkZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gMTsKLSNlbHNlCi0JICAvKiBTZWUgTl9VTkRGfE5fRVhUIGFib3ZlIGZvciBleHBsYW5hdGlvbi4gICovCi0JICBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbCA9IElTX0dYWF9WVEFCTEUgKHNwKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQkvKiBMb2NhbCBpbml0aWFsaXplZCBkYXRhLiAgKi8KLQljYXNlIE5fREFUQToKLQkgIHsKLQkgICAgY2hhciAqc3ltX25hbWUgPSBTX0dFVF9OQU1FIChzcCk7Ci0KLQkgICAgLyogQWx3YXlzIHN1cHByZXNzIGxvY2FsIG51bWVyaWMgbGFiZWxzLiAgKi8KLQkgICAgaWYgKHN5bV9uYW1lICYmIHN0cmNtcCAoc3ltX25hbWUsIEZBS0VfTEFCRUxfTkFNRSkgPT0gMCkKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBNYWtlIGEgVk1TIGRhdGEgc3ltYm9sIGVudHJ5LiAgKi8KLQkgICAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkgICAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgICAgdnNwLT5TaXplID0gVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSAoc3AsIHRleHRfc2l6ICsgZGF0YV9zaXopOwotCSAgICB2c3AtPlBzZWN0X0luZGV4ID0gRGF0YV9Qc2VjdDsKLQkgICAgdnNwLT5Qc2VjdF9PZmZzZXQgPSBMb2NhbF9Jbml0ZF9EYXRhX1NpemU7Ci0JICAgIExvY2FsX0luaXRkX0RhdGFfU2l6ZSArPSB2c3AtPlNpemU7Ci0JICAgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOwotCSAgICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgICAgc3AtPnN5X29iaiA9IHZzcDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JLyogR2xvYmFsIFRleHQgZGVmaW5pdGlvbi4gICovCi0JY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQkgIHsKLQotCSAgICBpZiAoSVNfR1hYX1hUT1IgKHNwKSkKLQkgICAgICB7Ci0JCXZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JCXZzcC0+U3ltYm9sID0gc3A7Ci0JCXZzcC0+U2l6ZSA9IFhUT1JfU0laRTsKLQkJc3AtPnN5X29iaiA9IHZzcDsKLQkJc3dpdGNoICgoU19HRVRfTkFNRSAoc3ApKVsxMF0pCi0JCSAgewotCQkgICAgY2FzZSAnSSc6Ci0JCSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSBDdG9yc19Qc2VjdDsKLQkJICAgICAgdnNwLT5Qc2VjdF9PZmZzZXQgPSAoQ3RvcnNfU3ltYm9scz09MCk/MDooQ3RvcnNfU3ltYm9scy0+UHNlY3RfT2Zmc2V0K1hUT1JfU0laRSk7Ci0JCSAgICAgIHZzcC0+TmV4dCA9IEN0b3JzX1N5bWJvbHM7Ci0JCSAgICAgIEN0b3JzX1N5bWJvbHMgPSB2c3A7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnRCc6Ci0JCSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSBEdG9yc19Qc2VjdDsKLQkJICAgICAgdnNwLT5Qc2VjdF9PZmZzZXQgPSAoRHRvcnNfU3ltYm9scz09MCk/MDooRHRvcnNfU3ltYm9scy0+UHNlY3RfT2Zmc2V0K1hUT1JfU0laRSk7Ci0JCSAgICAgIHZzcC0+TmV4dCA9IER0b3JzX1N5bWJvbHM7Ci0JCSAgICAgIER0b3JzX1N5bWJvbHMgPSB2c3A7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnRyc6Ci0JCSAgICAgIGFzX3dhcm4gKF8oIkNhbid0IGhhbmRsZSBnbG9iYWwgeHRvcnMgc3ltYm9scyB5ZXQuIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGFzX3dhcm4gKF8oIlVua25vd24gJXMiKSwgU19HRVRfTkFNRSAoc3ApKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJdW5zaWduZWQgc2hvcnQgRW50cnlfTWFzazsKLQotCQkvKiBHZXQgdGhlIGVudHJ5IG1hc2suICAqLwotCQlmcmFnUCA9IHNwLT5zeV9mcmFnOwotCQkvKiBGaXJzdCBmcmFnIG1pZ2h0IGJlIGVtcHR5IGlmIHdlJ3JlIGdlbmVyYXRpbmcgbGlzdGluZ3MuCi0JCSAgIFNvIHNraXAgZW1wdHkgcnNfZmlsbCBmcmFncy4gICovCi0JCXdoaWxlIChmcmFnUCAmJiBmcmFnUC0+ZnJfdHlwZSA9PSByc19maWxsICYmIGZyYWdQLT5mcl9maXggPT0gMCkKLQkJICBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0OwotCi0JCS8qIElmIGZpcnN0IGZyYWcgZG9lc24ndCBjb250YWluIHRoZSBkYXRhLCB3aGF0IGRvIHdlIGRvPwotCQkgICBJZiBpdCdzIHBvc3NpYmx5IHNtYWxsZXIgdGhhbiB0d28gYnl0ZXMsIHRoYXQgd291bGQKLQkJICAgaW1wbHkgdGhhdCB0aGUgZW50cnkgbWFzayBpcyBub3Qgc3RvcmVkIHdoZXJlIHdlJ3JlCi0JCSAgIGV4cGVjdGluZyBpdC4KLQotCQkgICBJZiB5b3UgY2FuIGZpbmQgYSB0ZXN0IGNhc2UgdGhhdCB0cmlnZ2VycyB0aGlzLCByZXBvcnQKLQkJICAgaXQgKGFuZCB0ZWxsIG1lIHdoYXQgdGhlIGVudHJ5IG1hc2sgZmllbGQgb3VnaHQgdG8gYmUpLAotCQkgICBhbmQgSSdsbCB0cnkgdG8gZml4IGl0LiAgS1IgKi8KLQkJaWYgKGZyYWdQLT5mcl9maXggPCAyKQotCQkgIGFib3J0ICgpOwotCi0JCUVudHJ5X01hc2sgPSAoZnJhZ1AtPmZyX2xpdGVyYWxbMF0gJiAweDAwZmYpIHwKLQkJCSAgICAgKChmcmFnUC0+ZnJfbGl0ZXJhbFsxXSAmIDB4MDBmZikgPDwgOCk7Ci0JCS8qIERlZmluZSB0aGUgcHJvY2VkdXJlIGVudHJ5IHBvaW50LiAgKi8KLQkJVk1TX1Byb2NlZHVyZV9FbnRyeV9QdCAoU19HRVRfTkFNRSAoc3ApLAotCQkJCSAgICBUZXh0X1BzZWN0LAotCQkJCSAgICBTX0dFVF9WQUxVRSAoc3ApLAotCQkJCSAgICBFbnRyeV9NYXNrKTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogTG9jYWwgVGV4dCBkZWZpbml0aW9uLiAgKi8KLQljYXNlIE5fVEVYVDoKLQkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgaWYgKFRleHRfUHNlY3QgIT0gLTEpCi0JICAgIHsKLQkgICAgICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgICAgIHZzcC0+U3ltYm9sID0gc3A7Ci0JICAgICAgdnNwLT5TaXplID0gMDsKLQkgICAgICB2c3AtPlBzZWN0X0luZGV4ID0gVGV4dF9Qc2VjdDsKLQkgICAgICB2c3AtPlBzZWN0X09mZnNldCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0JICAgICAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICAgICAgVk1TX1N5bWJvbHMgPSB2c3A7Ci0JICAgICAgc3AtPnN5X29iaiA9IHZzcDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBHbG9iYWwgUmVmZXJlbmNlLiAgKi8KLQljYXNlIE5fVU5ERjoKLQkgIC8qIE1ha2UgYSBHU0QgZ2xvYmFsIHN5bWJvbCByZWZlcmVuY2UgcmVjb3JkLiAgKi8KLQkgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKFNfR0VUX05BTUUgKHNwKSwKLQkJCQkgIDAsCi0JCQkJICAwLAotCQkJCSAgR0JMU1lNX1JFRik7Ci0JICBicmVhazsKLQotCS8qIEFic29sdXRlIHN5bWJvbC4gICovCi0JY2FzZSBOX0FCUzoKLQljYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICAvKiBnY2MgZG9lc24ndCBnZW5lcmF0ZSB0aGVzZTsKLQkgICAgIFZNU19FbWl0X0dsb2JhbHZhbHVlIGhhbmRsZXMgdGhlbSB0aG91Z2guCSovCi0JICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgIHZzcC0+U2l6ZSA9IDQ7CQkvKiBhbHdheXMgYXNzdW1lIDMyIGJpdHMgKi8KLQkgIHZzcC0+UHNlY3RfSW5kZXggPSAwOwotCSAgdnNwLT5Qc2VjdF9PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ApOwotCSAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgIHNwLT5zeV9vYmogPSB2c3A7Ci0JICBicmVhazsKLQotCS8qIEFueXRoaW5nIGVsc2UuICAqLwotCWRlZmF1bHQ6Ci0JICAvKiBJZ25vcmUgU1RBQiBzeW1ib2xzLCBpbmNsdWRpbmcgLnN0YWJzIGVtaXR0ZWQgYnkgZysrLiAgKi8KLQkgIGlmIChTX0lTX0RFQlVHIChzcCkgfHwgKFNfR0VUX1RZUEUgKHNwKSA9PSAyMikpCi0JICAgIGJyZWFrOwotCSAgLyoKLQkgICAqCUVycm9yIG90aGVyd2lzZS4KLQkgICAqLwotCSAgYXNfdHNrdHNrIChfKCJ1bmhhbmRsZWQgc3RhYiB0eXBlICVkIiksIFNfR0VUX1RZUEUgKHNwKSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEdsb2JhbCBzeW1ib2xzIGhhdmUgZGlmZmVyZW50IGxpbmthZ2UgdGhhbiBleHRlcm5hbCB2YXJpYWJsZXMuICAqLwotICAgICAgaWYgKGRlZmluZV9hc19nbG9iYWxfc3ltYm9sKQotCVZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKFNfR0VUX05BTUUgKHNwKSwKLQkJCQl2c3AtPlBzZWN0X0luZGV4LAotCQkJCTAsCi0JCQkJR0JMU1lNX0RFRik7Ci0gICAgfQotCi0gIHJldHVybjsKLX0KLQwKLQotLyogT3V0cHV0IGRlYnVnZ2VyIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBmb3Igc3ltYm9scyB3aGljaAotICAgYXJlIGxvY2FsIHRvIGEgc3BlY2lmaWMgcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1sb2NhbF9zeW1ib2xzX0RTVCAoczBQLCBDdXJyZW50X1JvdXRpbmUpCi0gICAgIHN5bWJvbFMgKnMwUCwgKkN1cnJlbnRfUm91dGluZTsKLXsKLSAgc3ltYm9sUyAqczFQOwotICBjaGFyICpzMFBfbmFtZSwgKnBudDAsICpwbnQxOwotCi0gIHMwUF9uYW1lID0gU19HRVRfTkFNRSAoczBQKTsKLSAgaWYgKCpzMFBfbmFtZSsrICE9ICdfJykKLSAgICByZXR1cm47Ci0KLSAgZm9yIChzMVAgPSBDdXJyZW50X1JvdXRpbmU7IHMxUDsgczFQID0gc3ltYm9sX25leHQgKHMxUCkpCi0gICAgewotI2lmIDAJCS8qIHJlZHVuZGFudDsgUkFXX1RZUEUgIT0gTl9GVU4gc3VmZmljZXMgKi8KLSAgICAgIGlmICghU19JU19ERUJVRyAoczFQKSkKLQljb250aW51ZTsKLSNlbmRpZgotICAgICAgaWYgKFNfR0VUX1JBV19UWVBFIChzMVApICE9IE5fRlVOKQotCWNvbnRpbnVlOwotICAgICAgcG50MCA9IHMwUF9uYW1lOwotICAgICAgcG50MSA9IFNfR0VUX05BTUUgKHMxUCk7Ci0gICAgICAvKiBXZSBhc3N1bWUgdGhlIHR3byBzdHJpbmdzIGFyZSBuZXZlciBleGFjdGx5IGVxdWFsLi4uICAqLwotICAgICAgd2hpbGUgKCpwbnQwKysgPT0gKnBudDErKykKLQl7Ci0JfQotICAgICAgLyogRm91bmQgaXQgaWYgczBQIG5hbWUgaXMgZXhoYXVzdGVkIGFuZCBzMVAgbmFtZSBoYXMgIjpGIiBvciAiOmYiIG5leHQuCi0JIE5vdGU6ICBib3RoIHBvaW50ZXJzIGhhdmUgYWR2YW5jZWQgb25lIHBhc3QgdGhlIG5vbi1tYXRjaGluZyBjaGFyLiAgKi8KLSAgICAgIGlmICgoKnBudDEgPT0gJ0YnIHx8ICpwbnQxID09ICdmJykgJiYgKi0tcG50MSA9PSAnOicgJiYgKi0tcG50MCA9PSAnXDAnKQotCXsKLQkgIERlZmluZV9Sb3V0aW5lIChzMVAsIDAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotCi0vKiBDb25zdHJ1Y3QgYW5kIG91dHB1dCB0aGUgZGVidWcgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXZtc19idWlsZF9EU1QgKHRleHRfc2l6KQotICAgICB1bnNpZ25lZCB0ZXh0X3NpejsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3ltYm9sUyAqQ3VycmVudF9Sb3V0aW5lID0gMDsKLSAgc3RydWN0IGlucHV0X2ZpbGUgKkN1cl9GaWxlID0gMDsKLSAgb2Zmc2V0VCBDdXJfT2Zmc2V0ID0gLTE7Ci0gIGludCBDdXJfTGluZV9OdW1iZXIgPSAwOwotICBpbnQgRmlsZV9OdW1iZXIgPSAwOwotICBpbnQgRGVidWdnZXJfT2Zmc2V0ID0gMDsKLSAgaW50IGZpbGVfYXZhaWxhYmxlOwotICBpbnQgZHNjOwotICBvZmZzZXRUIHZhbDsKLQotICAvKiBXcml0ZSB0aGUgVHJhY2ViYWNrIEJlZ2luIE1vZHVsZSByZWNvcmQuICAqLwotICBWTVNfVEJUX01vZHVsZV9CZWdpbiAoKTsKLQotICAvKgotICAgKglPdXRwdXQgZGVidWdnaW5nIGluZm8gZm9yIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHN0YXRpYyB2YXJpYWJsZXMKLSAgICoJdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIG9uZSByb3V0aW5lLiAgV2UgYWxzbyBuZWVkIHRvIGV4YW1pbmUKLSAgICoJYWxsIHN0YWJzIGRpcmVjdGl2ZXMsIHRvIGZpbmQgdGhlIGRlZmluaXRpb25zIHRvIGFsbCBvZiB0aGUKLSAgICoJYWR2YW5jZWQgZGF0YSB0eXBlcywgYW5kIHRoaXMgaXMgZG9uZSBieSBWTVNfTFNZTV9QYXJzZS4gIFRoaXMKLSAgICoJbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgYW55IGRlZmluaXRpb25zIGFyZSBvdXRwdXQgdG8gdGhlIG9iamVjdAotICAgKglmaWxlLCBzaW5jZSB0aGVyZSBjYW4gYmUgZm9yd2FyZCByZWZlcmVuY2VzIGluIHRoZSBzdGFicwotICAgKglkaXJlY3RpdmVzLiAgV2hlbiB0aHJvdWdoIHdpdGggcGFyc2luZywgdGhlIHRleHQgb2YgdGhlIHN0YWJzCi0gICAqCWRpcmVjdGl2ZSBpcyBhbHRlcmVkLCB3aXRoIHRoZSBkZWZpbml0aW9ucyByZW1vdmVkLCBzbyB0aGF0IGxhdGVyCi0gICAqCXBhc3NlcyB3aWxsIHNlZSBkaXJlY3RpdmVzIGFzIHRoZXkgd291bGQgYmUgd3JpdHRlbiBpZiB0aGUgdHlwZQotICAgKgl3ZXJlIGFscmVhZHkgZGVmaW5lZC4KLSAgICoKLSAgICoJV2UgYWxzbyBsb29rIGZvciBmaWxlcyBhbmQgaW5jbHVkZSBmaWxlcywgYW5kIG1ha2UgYSBsaXN0IG9mCi0gICAqCXRoZW0uICBXZSBleGFtaW5lIHRoZSBzb3VyY2UgZmlsZSBudW1iZXJzIHRvIGVzdGFibGlzaCB0aGUgYWN0dWFsCi0gICAqCWxpbmVzIHRoYXQgY29kZSB3YXMgZ2VuZXJhdGVkIGZyb20sIGFuZCB0aGVuIGdlbmVyYXRlIG9mZnNldHMuCi0gICAqLwotICBWTVNfTFNZTV9QYXJzZSAoKTsKLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIE9ubHkgZGVhbCB3aXRoIFNUQUIgc3ltYm9scyBoZXJlLiAgKi8KLSAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkpCi0JY29udGludWU7Ci0gICAgICAvKgotICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlLgotICAgICAgICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSkKLQl7Ci0JY2FzZSBOX1NMSU5FOgotCSAgZHNjID0gU19HRVRfREVTQyAoc3ltYm9sUCk7Ci0JICBpZiAoZHNjID4gQ3VyX0ZpbGUtPm1heF9saW5lKQotCSAgICBDdXJfRmlsZS0+bWF4X2xpbmUgPSBkc2M7Ci0JICBpZiAoZHNjIDwgQ3VyX0ZpbGUtPm1pbl9saW5lKQotCSAgICBDdXJfRmlsZS0+bWluX2xpbmUgPSBkc2M7Ci0JICBicmVhazsKLQljYXNlIE5fU086Ci0JICBDdXJfRmlsZSA9IGZpbmRfZmlsZSAoc3ltYm9sUCk7Ci0JICBDdXJfRmlsZS0+ZmxhZyA9IDE7Ci0JICBDdXJfRmlsZS0+bWluX2xpbmUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NPTDoKLQkgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9HU1lNOgotCSAgVk1TX0dTWU1fUGFyc2UgKHN5bWJvbFAsIFRleHRfUHNlY3QpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0xDU1lNOgotCSAgVk1TX0xDU1lNX1BhcnNlIChzeW1ib2xQLCBUZXh0X1BzZWN0KTsKLQkgIGJyZWFrOwotCWNhc2UgTl9GVU46CQkvKiBGb3Igc3RhdGljIGNvbnN0YW50IHN5bWJvbHMgKi8KLQljYXNlIE5fU1RTWU06Ci0JICBWTVNfU1RTWU1fUGFyc2UgKHN5bWJvbFAsIFRleHRfUHNlY3QpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0JCS8qIHN3aXRjaCAqLwotICAgIH0JCQkvKiBmb3IgKi8KLQotICAvKgotICAgKglOb3cgd2UgdGFrZSBhIHF1aWNrIHN3ZWVwIHRocm91Z2ggdGhlIGZpbGVzIGFuZCBhc3NpZ24gb2Zmc2V0cwotICAgKgl0byBlYWNoIG9uZS4gIFRoaXMgd2lsbCBlc3NlbnRpYWxseSBiZSB0aGUgc3RhcnRpbmcgbGluZSBudW1iZXIgdG8KLSAgICoJdGhlIGRlYnVnZ2VyIGZvciBlYWNoIGZpbGUuICBPdXRwdXQgdGhlIGluZm8gZm9yIHRoZSBkZWJ1Z2dlciB0bwotICAgKglzcGVjaWZ5IHRoZSBmaWxlcywgYW5kIHRoZW4gdGVsbCBpdCBob3cgbWFueSBsaW5lcyB0byB1c2UuCi0gICAqLwotICBmb3IgKEN1cl9GaWxlID0gZmlsZV9yb290OyBDdXJfRmlsZTsgQ3VyX0ZpbGUgPSBDdXJfRmlsZS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoQ3VyX0ZpbGUtPm1heF9saW5lID09IDApCi0JY29udGludWU7Ci0gICAgICBpZiAoKHN0cm5jbXAgKEN1cl9GaWxlLT5uYW1lLCAiR05VX0dYWF9JTkNMVURFOiIsIDE2KSA9PSAwKSAmJgotCSAgIWZsYWdfZGVidWcpCi0JY29udGludWU7Ci0gICAgICBpZiAoKHN0cm5jbXAgKEN1cl9GaWxlLT5uYW1lLCAiR05VX0NDX0lOQ0xVREU6IiwgMTUpID09IDApICYmCi0JICAhZmxhZ19kZWJ1ZykKLQljb250aW51ZTsKLSAgICAgIC8qIHNob3cgYSBmZXcgZXh0cmEgbGluZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gc2VsZWN0ZWQgKi8KLSAgICAgIGlmIChDdXJfRmlsZS0+bWluX2xpbmUgPiAyKQotCUN1cl9GaWxlLT5taW5fbGluZSAtPSAyOwotICAgICAgQ3VyX0ZpbGUtPm9mZnNldCA9IERlYnVnZ2VyX09mZnNldCAtIEN1cl9GaWxlLT5taW5fbGluZSArIDE7Ci0gICAgICBEZWJ1Z2dlcl9PZmZzZXQgKz0gQ3VyX0ZpbGUtPm1heF9saW5lIC0gQ3VyX0ZpbGUtPm1pbl9saW5lICsgMTsKLSAgICAgIGlmIChDdXJfRmlsZS0+c2FtZV9maWxlX2ZwbnQpCi0JewotCSAgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID0gQ3VyX0ZpbGUtPnNhbWVfZmlsZV9mcG50LT5maWxlX251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID0gKytGaWxlX051bWJlcjsKLQkgIGZpbGVfYXZhaWxhYmxlID0gVk1TX1RCVF9Tb3VyY2VfRmlsZSAoQ3VyX0ZpbGUtPm5hbWUsCi0JCQkJCQlDdXJfRmlsZS0+ZmlsZV9udW1iZXIpOwotCSAgaWYgKCFmaWxlX2F2YWlsYWJsZSkKLQkgICAgewotCSAgICAgIEN1cl9GaWxlLT5maWxlX251bWJlciA9IDA7Ci0JICAgICAgRmlsZV9OdW1iZXItLTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICAgIFZNU19UQlRfU291cmNlX0xpbmVzIChDdXJfRmlsZS0+ZmlsZV9udW1iZXIsCi0JCQkgICAgQ3VyX0ZpbGUtPm1pbl9saW5lLAotCQkJICAgIEN1cl9GaWxlLT5tYXhfbGluZSAtIEN1cl9GaWxlLT5taW5fbGluZSArIDEpOwotICB9CQkJLyogZm9yICovCi0gIEN1cl9GaWxlID0gKHN0cnVjdCBpbnB1dF9maWxlICopIE5VTEw7Ci0KLSAgLyoKLSAgICoJU2NhbiB0aGUgc3ltYm9scyBhbmQgd3JpdGUgb3V0IHRoZSByb3V0aW5lcwotICAgKgkodGhpcyBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHN5bWJvbHMgYXJlIGluCi0gICAqCSBvcmRlciBvZiBhc2NlbmRpbmcgdGV4dCBzZWdtZW50IG9mZnNldCkKLSAgICovCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJRGVhbCB3aXRoIHRleHQgc3ltYm9scy4KLSAgICAgICAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiBTX0dFVF9UWVBFIChzeW1ib2xQKSA9PSBOX1RFWFQpCi0JewotCSAgLyoKLQkgICAqIElnbm9yZSBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggIkwiLCBhcyB0aGV5IGFyZSBsb2NhbCBzeW1ib2xzLgotCSAgICovCi0JICBpZiAoKlNfR0VUX05BTUUgKHN5bWJvbFApID09ICdMJykKLQkgICAgY29udGludWU7Ci0JICAvKgotCSAgICogSWYgdGhlcmUgaXMgYSByb3V0aW5lIHN0YXJ0IGRlZmluZWQsIHRlcm1pbmF0ZSBpdC4KLQkgICAqLwotCSAgaWYgKEN1cnJlbnRfUm91dGluZSkKLQkgICAgVk1TX1RCVF9Sb3V0aW5lX0VuZCAodGV4dF9zaXosIEN1cnJlbnRfUm91dGluZSk7Ci0KLQkgIC8qCi0JICAgKiBDaGVjayBmb3IgJiBza2lwIGR1bW15IGxhYmVscyBsaWtlICJnY2NfY29tcGlsZWQuIi4KLQkgICAqIFRoZXkncmUgaWRlbnRpZmllZCBieSB0aGUgSU5fREVGQVVMVF9TRUNUSU9OIGZsYWcuCi0JICAgKi8KLQkgIGlmICgoU19HRVRfT1RIRVIgKHN5bWJvbFApICYgSU5fREVGQVVMVF9TRUNUSU9OKSAhPSAwICYmCi0JICAgICAgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IDApCi0JICAgIGNvbnRpbnVlOwotCSAgLyoKLQkgICAqIFN0b3JlIHRoZSByb3V0aW5lIGJlZ2luIHRyYWNlYmFjayBpbmZvLgotCSAgICovCi0JICBWTVNfVEJUX1JvdXRpbmVfQmVnaW4gKHN5bWJvbFAsIFRleHRfUHNlY3QpOwotCSAgQ3VycmVudF9Sb3V0aW5lID0gc3ltYm9sUDsKLQkgIC8qCi0JICAgKiBEZWZpbmUgc3ltYm9scyBsb2NhbCB0byB0aGlzIHJvdXRpbmUuCi0JICAgKi8KLQkgIGxvY2FsX3N5bWJvbHNfRFNUIChzeW1ib2xQLCBDdXJyZW50X1JvdXRpbmUpOwotCSAgLyoKLQkgICAqCURvbmUKLQkgICAqLwotCSAgY29udGludWU7Ci0KLQl9Ci0gICAgICAvKgotICAgICAgICoJRGVhbCB3aXRoIFNUQUIgc3ltYm9scy4KLSAgICAgICAqLwotICAgICAgZWxzZSBpZiAoU19JU19ERUJVRyAoc3ltYm9sUCkpCi0JewotCSAgLyoKLQkgICAqICBEaXNwYXRjaCBvbiBTVEFCIHR5cGUuCi0JICAgKi8KLQkgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApKQotCSAgICB7Ci0JCS8qCi0JCSAqCUxpbmUgbnVtYmVyCi0JCSAqLwotCSAgICBjYXNlIE5fU0xJTkU6Ci0JICAgICAgLyogT2Zmc2V0IHRoZSBsaW5lIGludG8gdGhlIGNvcnJlY3QgcG9ydGlvbiBvZiB0aGUgZmlsZS4gICovCi0JICAgICAgaWYgKEN1cl9GaWxlLT5maWxlX251bWJlciA9PSAwKQotCQlicmVhazsKLQkgICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAgICAgLyogU29tZXRpbWVzIHRoZSBzYW1lIG9mZnNldCBnZXRzIHNldmVyYWwgc291cmNlIGxpbmVzCi0JCSBhc3NpZ25lZCB0byBpdC4gIFdlIHNob3VsZCBiZSBzZWxlY3RpdmUgYWJvdXQgd2hpY2gKLQkJIGxpbmVzIHdlIGFsbG93LCB3ZSBzaG91bGQgcHJlZmVyIGxpbmVzIHRoYXQgYXJlIGluCi0JCSB0aGUgbWFpbiBzb3VyY2UgZmlsZSB3aGVuIGRlYnVnZ2luZyBpbmxpbmUgZnVuY3Rpb25zLiAgKi8KLQkgICAgICBpZiAodmFsID09IEN1cl9PZmZzZXQgJiYgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyICE9IDEpCi0JCWJyZWFrOwotCi0JICAgICAgLyogY2FsY3VsYXRlIGFjdHVhbCBkZWJ1Z2dlciBzb3VyY2UgbGluZSAqLwotCSAgICAgIGRzYyA9IFNfR0VUX0RFU0MgKHN5bWJvbFApICsgQ3VyX0ZpbGUtPm9mZnNldDsKLQkgICAgICBTX1NFVF9ERVNDIChzeW1ib2xQLCBkc2MpOwotCSAgICAgIC8qCi0JICAgICAgICogRGVmaW5lIFBDL0xpbmUgY29ycmVsYXRpb24uCi0JICAgICAgICovCi0JICAgICAgaWYgKEN1cl9PZmZzZXQgPT0gLTEpCi0JCXsKLQkJICAvKgotCQkgICAqIEZpcnN0IE5fU0xJTkU7IHNldCB1cCBpbml0aWFsIGNvcnJlbGF0aW9uLgotCQkgICAqLwotCQkgIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiAoZHNjLAotCQkJCQkgICAgICAgdmFsLAotCQkJCQkgICAgICAgVGV4dF9Qc2VjdCwKLQkJCQkJICAgICAgIDApOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGRzYyAtIEN1cl9MaW5lX051bWJlcikgPD0gMCkKLQkJewotCQkgIC8qCi0JCSAgICogTGluZSBkZWx0YSBpcyBub3QgK3ZlLCB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBsaW5lIGFuZAotCQkgICAqIHN0YXJ0IGEgbmV3IFBDL0xpbmUgY29ycmVsYXRpb24uCi0JCSAgICovCi0JCSAgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uICgwLAotCQkJCQkgICAgICAgdmFsIC0gQ3VyX09mZnNldCwKLQkJCQkJICAgICAgIDAsCi0JCQkJCSAgICAgICAtMSk7Ci0JCSAgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIChkc2MsCi0JCQkJCSAgICAgICB2YWwsCi0JCQkJCSAgICAgICBUZXh0X1BzZWN0LAotCQkJCQkgICAgICAgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKgotCQkgICAqIExpbmUgZGVsdGEgaXMgK3ZlLCBhbGwgaXMgd2VsbC4KLQkJICAgKi8KLQkJICBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKGRzYyAtIEN1cl9MaW5lX051bWJlciwKLQkJCQkJICAgICAgIHZhbCAtIEN1cl9PZmZzZXQsCi0JCQkJCSAgICAgICAwLAotCQkJCQkgICAgICAgMSk7Ci0JCX0KLQkgICAgICAvKiBVcGRhdGUgdGhlIGN1cnJlbnQgbGluZS9QQyBpbmZvLiAgKi8KLQkgICAgICBDdXJfTGluZV9OdW1iZXIgPSBkc2M7Ci0JICAgICAgQ3VyX09mZnNldCA9IHZhbDsKLQkgICAgICBicmVhazsKLQotCQkvKgotCQkgKglTb3VyY2UgZmlsZQotCQkgKi8KLQkgICAgY2FzZSBOX1NPOgotCSAgICAgIC8qIFJlbWVtYmVyIHRoYXQgd2UgaGFkIGEgc291cmNlIGZpbGUgYW5kIGVtaXQKLQkJIHRoZSBzb3VyY2UgZmlsZSBkZWJ1Z2dlciByZWNvcmQuICAqLwotCSAgICAgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fU09MOgotCSAgICAgIC8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIHJlYWxseSBpbiB0aGUgYWN0dWFsCi0JCSBzb3VyY2UgZmlsZSB3aGVuIHdlIGNvbXB1dGUgdGhlIG1heGltdW0gbGluZSBudW1iZXIuCi0JCSBPdGhlcndpc2UgdGhlIGRlYnVnZ2VyIGdldHMgcmVhbGx5IGNvbmZ1c2VkLiAgKi8KLQkgICAgICBDdXJfRmlsZSA9IGZpbmRfZmlsZSAoc3ltYm9sUCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQkJLyogc3dpdGNoICovCi0JfQkJLyogaWYgKElTX0RFQlVHKSAqLwotICAgIH0JCQkvKiBmb3IgKi8KLQotICAgIC8qCi0gICAgICogSWYgdGhlcmUgaXMgYSByb3V0aW5lIHN0YXJ0IGRlZmluZWQsIHRlcm1pbmF0ZSBpdAotICAgICAqIChhbmQgdGhlIGxpbmUgbnVtYmVycykuCi0gICAgICovCi0gICAgaWYgKEN1cnJlbnRfUm91dGluZSkKLSAgICAgIHsKLQkvKiBUZXJtaW5hdGUgdGhlIGxpbmUgbnVtYmVycy4gICovCi0JVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uICgwLAotCQkJCSAgICAgdGV4dF9zaXogLSBTX0dFVF9WQUxVRSAoQ3VycmVudF9Sb3V0aW5lKSwKLQkJCQkgICAgIDAsCi0JCQkJICAgICAtMSk7Ci0JLyogVGVybWluYXRlIHRoZSByb3V0aW5lLiAgKi8KLQlWTVNfVEJUX1JvdXRpbmVfRW5kICh0ZXh0X3NpeiwgQ3VycmVudF9Sb3V0aW5lKTsKLSAgICAgIH0KLQotICAvKiBXcml0ZSB0aGUgVHJhY2ViYWNrIEVuZCBNb2R1bGUgVEJUIHJlY29yZC4gICovCi0gIFZNU19UQlRfTW9kdWxlX0VuZCAoKTsKLX0KLQwKLQotLyogV3JpdGUgYSBWQVgvVk1TIG9iamVjdCBmaWxlIChldmVyeXRoaW5nIGVsc2UgaGFzIGJlZW4gZG9uZSEpLiAgKi8KLQotdm9pZAotdm1zX3dyaXRlX29iamVjdF9maWxlICh0ZXh0X3NpeiwgZGF0YV9zaXosIGJzc19zaXosIHRleHRfZnJhZ19yb290LAotCQkgICAgICAgZGF0YV9mcmFnX3Jvb3QpCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6OwotICAgICB1bnNpZ25lZCBkYXRhX3NpejsKLSAgICAgdW5zaWduZWQgYnNzX3NpejsKLSAgICAgZnJhZ1MgKnRleHRfZnJhZ19yb290OwotICAgICBmcmFnUyAqZGF0YV9mcmFnX3Jvb3Q7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci0KLSAgLyoKLSAgICogSW5pdGlhbGl6ZSBwcm9ncmFtIHNlY3Rpb24gaW5kaWNlczsgdmFsdWVzIGdldCB1cGRhdGVkIGxhdGVyLgotICAgKi8KLSAgUHNlY3RfTnVtYmVyID0gMDsJCS8qIG5leHQgUHNlY3QgSW5kZXggdG8gdXNlICovCi0gIFRleHRfUHNlY3QgPSAtMTsJCS8qIFRleHQgUHNlY3QgSW5kZXggICAqLwotICBEYXRhX1BzZWN0ID0gLTI7CQkvKiBEYXRhIFBzZWN0IEluZGV4ICAgSkY6IFdhcyAtMSAqLwotICBCc3NfUHNlY3QgPSAtMzsJCS8qIEJzcyBQc2VjdCBJbmRleCAgICBKRjogV2FzIC0xICovCi0gIEN0b3JzX1BzZWN0ID0gLTQ7CQkvKiBDdG9ycyBQc2VjdCBJbmRleCAgKi8KLSAgRHRvcnNfUHNlY3QgPSAtNTsJCS8qIER0b3JzIFBzZWN0IEluZGV4ICAqLwotICAvKiBJbml0aWFsaXplIG90aGVyIHN0YXRlIHZhcmlhYmxlcy4gICovCi0gIERhdGFfU2VnbWVudCA9IDA7Ci0gIExvY2FsX0luaXRkX0RhdGFfU2l6ZSA9IDA7Ci0KLSAgLyoKLSAgICoJQ3JlYXRlIHRoZSBhY3R1YWwgb3V0cHV0IGZpbGUgYW5kIHBvcHVsYXRlIGl0IHdpdGggcmVxdWlyZWQKLSAgICoJIm1vZHVsZSBoZWFkZXIiIGluZm9ybWF0aW9uLgotICAgKi8KLSAgQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSAoKTsKLSAgV3JpdGVfVk1TX01IRF9SZWNvcmRzICgpOwotCi0gIC8qCi0gICAqCUNyZWF0ZSB0aGUgRGF0YSBzZWdtZW50OgotICAgKgotICAgKglTaW5jZSB0aGlzIGlzIFJFQUxMWSBoYXJkIHRvIGRvIGFueSBvdGhlciB3YXksCi0gICAqCXdlIGFjdHVhbGx5IG1hbnVmYWN0dXJlIHRoZSBkYXRhIHNlZ21lbnQgYW5kCi0gICAqCXRoZW4gc3RvcmUgdGhlIGFwcHJvcHJpYXRlIHZhbHVlcyBvdXQgb2YgaXQuCi0gICAqCVdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhpcyBlYXJseSwgc28gdGhhdCBnbG9iYWx2YWx1ZXMKLSAgICoJY2FuIGJlIHByb3Blcmx5IGVtaXR0ZWQuCi0gICAqLwotICBpZiAoZGF0YV9zaXogPiAwKQotICAgIHN5bnRoZXNpemVfZGF0YV9zZWdtZW50IChkYXRhX3NpeiwgdGV4dF9zaXosIGRhdGFfZnJhZ19yb290KTsKLQotCi0gIC8qKioqKioqICBHbG9iYWwgU3ltYm9sIERpcmVjdG9yeSAgKioqKioqKi8KLQotICAvKgotICAgKglFbWl0IGdsb2JhbHZhbHVlcyBub3cuICBXZSBtdXN0IGRvIHRoaXMgYmVmb3JlIHRoZSB0ZXh0IHBzZWN0IGlzCi0gICAqCWRlZmluZWQsIG9yIHdlIHdpbGwgZ2V0IGxpbmtlciB3YXJuaW5ncyBhYm91dCBtdWx0aXBseSBkZWZpbmVkCi0gICAqCXN5bWJvbHMuICBBbGwgb2YgdGhlIGdsb2JhbHZhbHVlcyAicmVmZXJlbmNlIiBwc2VjdCAwLCBhbHRob3VnaAotICAgKglpdCByZWFsbHkgZG9lcyBub3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIGl0LgotICAgKi8KLSAgVk1TX0VtaXRfR2xvYmFsdmFsdWVzICh0ZXh0X3NpeiwgZGF0YV9zaXosIERhdGFfU2VnbWVudCk7Ci0gIC8qCi0gICAqCURlZmluZSB0aGUgVGV4dCBQc2VjdAotICAgKi8KLSAgVGV4dF9Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICBWTVNfUHNlY3RfU3BlYyAoIiRjb2RlIiwgdGV4dF9zaXosIHBzX1RFWFQsIDApOwotICAvKgotICAgKglEZWZpbmUgdGhlIEJTUyBQc2VjdAotICAgKi8KLSAgaWYgKGJzc19zaXogPiAwKQotICAgIHsKLSAgICAgIEJzc19Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICAgICAgVk1TX1BzZWN0X1NwZWMgKCIkdW5pbml0aWFsaXplZF9kYXRhIiwgYnNzX3NpeiwgcHNfREFUQSwgMCk7Ci0gICAgfQotICAvKgotICAgKiBEZWZpbmUgc3ltYm9scyB0byB0aGUgbGlua2VyLgotICAgKi8KLSAgZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkgKHRleHRfc2l6LCBkYXRhX3Npeik7Ci0gIC8qCi0gICAqCURlZmluZSB0aGUgRGF0YSBQc2VjdAotICAgKi8KLSAgaWYgKGRhdGFfc2l6ID4gMCAmJiBMb2NhbF9Jbml0ZF9EYXRhX1NpemUgPiAwKQotICAgIHsKLSAgICAgIERhdGFfUHNlY3QgPSBQc2VjdF9OdW1iZXIrKzsKLSAgICAgIFZNU19Qc2VjdF9TcGVjICgiJGRhdGEiLCBMb2NhbF9Jbml0ZF9EYXRhX1NpemUsIHBzX0RBVEEsIDApOwotICAgICAgLyoKLSAgICAgICAqIExvY2FsIGluaXRpYWxpemVkIGRhdGEgKE5fREFUQSkgc3ltYm9scyBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gdGhlCi0gICAgICAgKiBwcm9wZXIgdmFsdWUgb2YgRGF0YV9Qc2VjdCBub3cgdGhhdCBpdCdzIGFjdHVhbGx5IGJlZW4gZGVmaW5lZC4KLSAgICAgICAqIChBIGR1bW15IHZhbHVlIHdhcyB1c2VkIGluIGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5KCkgYWJvdmUuKQotICAgICAgICovCi0gICAgICBmb3IgKHZzcCA9IFZNU19TeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKLQlpZiAodnNwLT5Qc2VjdF9JbmRleCA8IDAgJiYgU19HRVRfUkFXX1RZUEUgKHZzcC0+U3ltYm9sKSA9PSBOX0RBVEEpCi0JICB2c3AtPlBzZWN0X0luZGV4ID0gRGF0YV9Qc2VjdDsKLSAgICB9Ci0KLQotICBpZiAoQ3RvcnNfU3ltYm9scyAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnBzX25hbWUgPSAiJGN0b3JzIjsKLSAgICAgIEN0b3JzX1BzZWN0ID0gUHNlY3RfTnVtYmVyKys7Ci0gICAgICBWTVNfUHNlY3RfU3BlYyAocHNfbmFtZSwgQ3RvcnNfU3ltYm9scy0+UHNlY3RfT2Zmc2V0ICsgWFRPUl9TSVpFLAotCQkgICAgICBwc19DVE9SUywgMCk7Ci0gICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChwc19uYW1lLCBDdG9yc19Qc2VjdCwKLQkJCQkgIDAsIEdCTFNZTV9ERUZ8R0JMU1lNX1dFQUspOwotICAgICAgZm9yICh2c3AgPSBDdG9yc19TeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKLQl2c3AtPlBzZWN0X0luZGV4ID0gQ3RvcnNfUHNlY3Q7Ci0gICAgfQotCi0gIGlmIChEdG9yc19TeW1ib2xzICE9IDApCi0gICAgewotICAgICAgY2hhciAqcHNfbmFtZSA9ICIkZHRvcnMiOwotICAgICAgRHRvcnNfUHNlY3QgPSBQc2VjdF9OdW1iZXIrKzsKLSAgICAgIFZNU19Qc2VjdF9TcGVjIChwc19uYW1lLCBEdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQgKyBYVE9SX1NJWkUsCi0JCSAgICAgIHBzX0RUT1JTLCAwKTsKLSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKHBzX25hbWUsIER0b3JzX1BzZWN0LAotCQkJCSAgMCwgR0JMU1lNX0RFRnxHQkxTWU1fV0VBSyk7Ci0gICAgICBmb3IgKHZzcCA9IER0b3JzX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCXZzcC0+UHNlY3RfSW5kZXggPSBEdG9yc19Qc2VjdDsKLSAgICB9Ci0KLSAgLyoqKioqKiogIFRleHQgSW5mb3JtYXRpb24gYW5kIFJlbG9jYXRpb24gUmVjb3JkcyAgKioqKioqKi8KLQotICAvKgotICAgKglXcml0ZSB0aGUgdGV4dCBzZWdtZW50IGRhdGEKLSAgICovCi0gIGlmICh0ZXh0X3NpeiA+IDApCi0gICAgdm1zX2ZpeHVwX3RleHRfc2VjdGlvbiAodGV4dF9zaXosIHRleHRfZnJhZ19yb290LCBkYXRhX2ZyYWdfcm9vdCk7Ci0gIC8qCi0gICAqCVdyaXRlIHRoZSBkYXRhIHNlZ21lbnQgZGF0YSwgdGhlbiBkaXNjYXJkIGl0LgotICAgKi8KLSAgaWYgKGRhdGFfc2l6ID4gMCkKLSAgICB7Ci0gICAgICB2bXNfZml4dXBfZGF0YV9zZWN0aW9uIChkYXRhX3NpeiwgdGV4dF9zaXopOwotICAgICAgZnJlZSAoRGF0YV9TZWdtZW50KSwgIERhdGFfU2VnbWVudCA9IDA7Ci0gICAgfQotCi0gIGlmIChDdG9yc19TeW1ib2xzICE9IDApCi0gICAgewotICAgICAgdm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24gKEN0b3JzX1N5bWJvbHMsIEN0b3JzX1BzZWN0KTsKLSAgICB9Ci0KLSAgaWYgKER0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoRHRvcnNfU3ltYm9scywgRHRvcnNfUHNlY3QpOwotICAgIH0KLQotCi0gIC8qKioqKioqICBEZWJ1Z2dlciBTeW1ib2wgVGFibGUgUmVjb3JkcyAgKioqKioqKi8KLQotICB2bXNfYnVpbGRfRFNUICh0ZXh0X3Npeik7Ci0KLQotICAvKioqKioqKiAgV3JhcCB0aGluZ3MgdXAgICoqKioqKiovCi0KLSAgLyoKLSAgICoJV3JpdGUgdGhlIEVuZCBPZiBNb2R1bGUgcmVjb3JkCi0gICAqLwotICBpZiAoRW50cnlfUG9pbnRfU3ltYm9sKQotICAgIFdyaXRlX1ZNU19FT01fUmVjb3JkIChUZXh0X1BzZWN0LCBTX0dFVF9WQUxVRSAoRW50cnlfUG9pbnRfU3ltYm9sKSk7Ci0gIGVsc2UKLSAgICBXcml0ZV9WTVNfRU9NX1JlY29yZCAoLTEsICh2YWx1ZVQpIDApOwotCi0gIC8qCi0gICAqCUFsbCBkb25lLCBjbG9zZSB0aGUgb2JqZWN0IGZpbGUKLSAgICovCi0gIENsb3NlX1ZNU19PYmplY3RfRmlsZSAoKTsKLX0KLQotLyogZW5kIG9mIG9iai12bXMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotdm1zLmggYi9nYXMvY29uZmlnL29iai12bXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4ZmRjZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai12bXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0vKiBWTVMgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLW9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyogVGFnIHRvIHZhbGlkYXRlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCBwcm9jZXNzaW5nICovCi0jZGVmaW5lIE9CSl9WTVMgMQotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2RlZmluZSBMT05HV09SRF9BTElHTk1FTlQJMgotCi0vKiBUaGlzIG1hY3JvIGNvbnRyb2xzIHN1YnNlY3Rpb24gYWxpZ25tZW50IHdpdGhpbiBhIHNlY3Rpb24uCi0gKgotICogVW5kZXIgVkFYL1ZNUywgdGhlIGxpbmtlciAoYW5kIFBTRUNUIHNwZWNpZmljYXRpb25zKQotICogdGFrZSBjYXJlIG9mIGNvcnJlY3RseSBhbGlnbmluZyB0aGUgc2VnbWVudHMuCi0gKiBEb2luZyB0aGUgYWxpZ25tZW50IGhlcmUgKG9uIGluaXRpYWxpemVkIGRhdGEpIGNhbgotICogbWVzcyB1cCB0aGUgY2FsY3VsYXRpb24gb2YgZ2xvYmFsIGRhdGEgUFNFQ1Qgc2l6ZXMuCi0gKi8KLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKQlcCi0JCSgoKFNFRykgPT0gZGF0YV9zZWN0aW9uKSA/IDAgOiBMT05HV09SRF9BTElHTk1FTlQpCi0KLS8qIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHJlbWVtYmVyIHdoZXRoZXIgd2UgYXJlIGluIHRoZSBjb25zdCBvciB0aGUKLSAgIGRhdGEgc2VjdGlvbi4gIEJ5IGFuZCBsYXJnZSB0aGV5IGFyZSBpZGVudGljYWwsIGJ1dCB3ZSBzZXQgYSBuby13cml0ZQotICAgYml0IGZvciBwc2VjdHMgaW4gdGhlIGNvbnN0IHNlY3Rpb24uICAqLwotCi1leHRlcm4gdW5zaWduZWQgY2hhciBjb25zdF9mbGFnOwotCi0vKiBUaGlzIGlzIG92ZXJsb2FkZWQgb250byBjb25zdF9mbGFnLCBmb3IgY29udmVuaWVuY2UuICBJdCdzIHVzZWQgdG8gZmxhZwotICAgZHVtbXkgbGFiZWxzIGxpa2UgImdjYzJfY29tcGlsZWQuIiAgd2hpY2ggb2NjdXIgYmVmb3JlIHRoZSBmaXJzdCAudGV4dAotICAgb3IgLmRhdGEgc2VjdGlvbiBkaXJlY3RpdmUuICAqLwotCi0jZGVmaW5lIElOX0RFRkFVTFRfU0VDVElPTiAweDgwCi0KLS8qIFRoZXNlIGFyZSBkZWZpbmVkIGluIG9iai12bXMuYy4gKi8KLWV4dGVybiBjb25zdCBzaG9ydCBzZWdfTl9UWVBFW107Ci1leHRlcm4gY29uc3Qgc2VnVCBOX1RZUEVfc2VnW107Ci0KLSN1bmRlZiBOT19SRUxPQwotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBOT19SRUxPQywgUkVMT0NfMzIKLSAgfTsKLQotI2RlZmluZSBOX0JBRE1BRyh4KQkoMCkKLSNkZWZpbmUgTl9UWFRPRkYoeCkJKCBzaXplb2Yoc3RydWN0IGV4ZWMpICkKLSNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArICh4KS5hX3RleHQgKQotI2RlZmluZSBOX1RST0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNkZWZpbmUgTl9EUk9GRih4KQkoIE5fVFJPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0KLS8qIFdlIHVzZSB0aGlzIGNvcHkgb2YgdGhlIGV4ZWMgaGVhZGVyIGZvciBWTVMuICBXZSBkbyBub3QgYWN0dWFsbHkgdXNlIGl0LCBidXQKLSAgIHdoYXQgd2UgYWN0dWFsbHkgZG8gaXMgbGV0IGdhcyBmaWxsIGluIHRoZSByZWxldmFudCBzbG90cywgYW5kIHdoZW4gd2UgZ2V0Ci0gICBhcm91bmQgdG8gd3JpdGluZyBhbiBvYmogZmlsZSwgd2UganVzdCBwaWNrIG91dCB3aGF0IHdlIG5lZWQuICAqLwotCi1zdHJ1Y3QgZXhlYwotewotICB1bnNpZ25lZCBsb25nIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfdHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgZXhlYyBoZWFkZXI7CQkvKiBhLm91dCBoZWFkZXIgKi8KLSAgICBsb25nIHN0cmluZ190YWJsZV9zaXplOwkvKiBuYW1lcyArICdcMCcgKyBzaXplb2YoaW50KSAqLwotICB9Ci1vYmplY3RfaGVhZGVyczsKLQotLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQotICogKHRoaXMgc3RhcnRlZCBhcyBhIGNsb25lIG9mIGJvdXQuaCdzIG5saXN0LCBidXQgbXVjaCB3YXMgdW5uZWVkZWQpLgotICovCi1zdHJ1Y3Qgbmxpc3QKLSAgewotICAgIGNoYXIgKm5fbmFtZTsKLSAgICB1bnNpZ25lZCBjaGFyIG5fdHlwZTsJLyogU2VlIGJlbG93CQkJCSovCi0gICAgdW5zaWduZWQgY2hhciBuX290aGVyOwkvKiB1c2VkIGZvciBjb25zdF9mbGFnIGFuZCAiZGVmYXVsdCBzZWN0aW9uIiAqLwotICAgIHVuc2lnbmVkCTogMTY7CQkvKiBwYWRkaW5nIGZvciBhbGlnbm1lbnQgKi8KLSAgICBpbnQgbl9kZXNjOwkJCS8qIHNvdXJjZSBsaW5lIG51bWJlciBmb3IgTl9TTElORSBzdGFicyAqLwotICB9OwotCi0vKiBMZWdhbCB2YWx1ZXMgb2Ygbl90eXBlIChzZWUgYW91dC9zdGFiLmRlZiBmb3IgdGhlIG1ham9yaXR5IG9mIHRoZSBjb2RlcykuCi0gKi8KLSNkZWZpbmUgTl9VTkRGCTAJCS8qIFVuZGVmaW5lZCBzeW1ib2wJKi8KLSNkZWZpbmUgTl9BQlMJMgkJLyogQWJzb2x1dGUgc3ltYm9sCSovCi0jZGVmaW5lIE5fVEVYVAk0CQkvKiBUZXh0IHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9EQVRBCTYJCS8qIERhdGEgc3ltYm9sCQkqLwotI2RlZmluZSBOX0JTUwk4CQkvKiBCU1Mgc3ltYm9sCQkqLwotI2RlZmluZSBOX0ZOCTMxCQkvKiBGaWxlbmFtZSBzeW1ib2wJKi8KLQotI2RlZmluZSBOX0VYVAkxCQkvKiBFeHRlcm5hbCBzeW1ib2wgKE9SJ2QgaW4gd2l0aCBvbmUgb2YgYWJvdmUpCSovCi0jZGVmaW5lIE5fVFlQRQkwMzYJCS8qIE1hc2sgZm9yIGFsbCB0aGUgdHlwZSBiaXRzCQkJKi8KLQotI2RlZmluZSBOX1NUQUIJMDM0MAkJLyogTWFzayBmb3IgYWxsIGJpdHMgdXNlZCBmb3IgU0RCIGVudHJpZXMgCSovCi0KLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLS8qIFNZTUJPTCBUQUJMRSAqLwotLyogU3ltYm9sIHRhYmxlIGVudHJ5IGRhdGEgdHlwZSAqLwotCi10eXBlZGVmIHN0cnVjdCBubGlzdCBvYmpfc3ltYm9sX3R5cGU7CS8qIFN5bWJvbCB0YWJsZSBlbnRyeSAqLwotCi0vKiBTeW1ib2wgdGFibGUgbWFjcm9zIGFuZCBjb25zdGFudHMgKi8KLQotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRSBzdHJ1Y3QgVk1TX1N5bWJvbCAqCi0KLS8qCi0gKiAgTWFjcm9zIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqICBUaGlzIHN5bnRheGljIGluZGlyZWN0aW9uIGFsbG93cyBpbmRlcGVuZGVuY2UgcmVnYXJkaW5nIGEub3V0IG9yIGNvZmYuCi0gKiAgVGhlIGFyZ3VtZW50IChzKSBvZiBhbGwgdGhlc2UgbWFjcm9zIGlzIGEgcG9pbnRlciB0byBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqLwotCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19JU19FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0KLS8qIFRydWUgaWYgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQsIGllIGlzIGluIE5fe1RFWFQsREFUQSxCU1MsQUJTfSBvciBOX0VYVCAqLwotI2RlZmluZSBTX0lTX0RFRklORUQocykJCShTX0dFVF9UWVBFKHMpICE9IE5fVU5ERikKLQotI2RlZmluZSBTX0lTX0NPTU1PTihzKQkoU19HRVRfVFlQRShzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUocykgIT0gMCkKLQotI2RlZmluZSBTX0lTX1JFR0lTVEVSKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPT0gTl9SRUdJU1RFUikKLQotLyogVHJ1ZSBpZiBhIGRlYnVnIHNwZWNpYWwgc3ltYm9sIGVudHJ5ICovCi0jZGVmaW5lIFNfSVNfREVCVUcocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1NUQUIpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIGxvY2FsIHN5bWJvbCBuYW1lICovCi0vKiBBIHN5bWJvbCBuYW1lIHdob3NlIG5hbWUgYmVnaW4gd2l0aCBeQSBpcyBhIGdhcyBpbnRlcm5hbCBwc2V1ZG8gc3ltYm9sCi0gICBuYW1lbGVzcyBzeW1ib2xzIGNvbWUgZnJvbSAuc3RhYiBkaXJlY3RpdmVzLiAqLwotI2RlZmluZSBTX0lTX0xPQ0FMKHMpCQkoU19HRVRfTkFNRShzKSAmJiBcCi0JCQkJICFTX0lTX0RFQlVHKHMpICYmIFwKLQkJCQkgKHN0cmNocihTX0dFVF9OQU1FKHMpLCAnXDAwMScpICE9IDAgfHwgXAotCQkJCSAgc3RyY2hyKFNfR0VUX05BTUUocyksICdcMDAyJykgIT0gMCB8fCBcCi0JCQkJICAoU19MT0NBTF9OQU1FKHMpICYmICFmbGFnX2tlZXBfbG9jYWxzKSkpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTX0lTX0VYVEVSTihzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGdlbmVyYXRlZCBiZWNhdXNlIG9mIGEgLnN0YWJkIGRpcmVjdGl2ZSAqLwotI2RlZmluZSBTX0lTX1NUQUJEKHMpCQkoU19HRVRfTkFNRShzKSA9PSAoY2hhciAqKTApCi0KLS8qIEFjY2Vzc29ycyAqLwotLyogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9OQU1FKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9uYW1lKQotLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX0dFVF9PRkZTRVQocykJCSgocyktPnN5X25hbWVfb2Zmc2V0KQotLyogVGhlIHJhdyB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfUkFXX1RZUEUocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUpCi0vKiBUaGUgdHlwZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX1RZUEUocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1RZUEUpCi0vKiBUaGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgc2VnbWVudCAqLwotI2RlZmluZSBTX0dFVF9TRUdNRU5UKHMpCShOX1RZUEVfc2VnW1NfR0VUX1RZUEUocyldKQotLyogVGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9PVEhFUihzKQkJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIpCi0vKiBUaGUgbl9kZXNjIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19HRVRfREVTQyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYykKLQotLyogTW9kaWZpZXJzICovCi0vKiBBc3N1bWUgdGhhdCBhIHN5bWJvbCBjYW5ub3QgYmUgc2ltdWx0YW5lb3VzbHkgaW4gbW9yZSB0aGFuIG9uIHNlZ21lbnQgKi8KLS8qIHNldCBzZWdtZW50ICovCi0jZGVmaW5lIFNfU0VUX1NFR01FTlQocyxzZWcpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJj0gfk5fVFlQRSwocyktPnN5X3N5bWJvbC5uX3R5cGV8PVNFR01FTlRfVE9fU1lNQk9MX1RZUEUoc2VnKSkKLS8qIFRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19TRVRfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSB8PSBOX0VYVCkKLS8qIFRoZSBzeW1ib2wgaXMgbm90IGV4dGVybmFsICovCi0jZGVmaW5lIFNfQ0xFQVJfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9FWFQpCi0vKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX1NFVF9OQU1FKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX25hbWUgPSAodikpCi0vKiBTZXQgdGhlIG9mZnNldCBpbiB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfU0VUX09GRlNFVChzLHYpCSgocyktPnN5X25hbWVfb2Zmc2V0ID0gKHYpKQotLyogU2V0IHRoZSBuX290aGVyIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19TRVRfT1RIRVIocyx2KQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlciA9ICh2KSkKLS8qIFNldCB0aGUgbl9kZXNjIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19TRVRfREVTQyhzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjID0gKHYpKQotLyogU2V0IHRoZSBuX3R5cGUgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9UWVBFKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodikpCi0KLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0jZGVmaW5lIEhfR0VUX1RFWFRfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfdGV4dCkKLSNkZWZpbmUgSF9HRVRfREFUQV9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9kYXRhKQotI2RlZmluZSBIX0dFVF9CU1NfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfYnNzKQotCi0jZGVmaW5lIEhfU0VUX1RFWFRfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV90ZXh0ID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfVEVYVCwgKHYpKSkKLSNkZWZpbmUgSF9TRVRfREFUQV9TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX2RhdGEgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19EQVRBLCAodikpKQotI2RlZmluZSBIX1NFVF9CU1NfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9ic3MgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19CU1MsICh2KSkpCi0KLSNkZWZpbmUgSF9TRVRfU1RSSU5HX1NJWkUoaCx2KQkJKChoKS0+c3RyaW5nX3RhYmxlX3NpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfc3ltcyA9ICh2KSAqIFwKLQkJCQkJIHNpemVvZihzdHJ1Y3Qgbmxpc3QpKQotCi0vKiBsaW5lIG51bWJlcmluZyBzdHVmZi4gKi8KLSNkZWZpbmUgT0JKX0VNSVRfTElORU5PKGEsIGIsIGMpCXs7fQotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykJezt9Ci0KLS8qIEZvcmNlIHN0cnVjdHVyZSB0YWdzIGludG8gc2NvcGUgc28gdGhhdCB0aGVpciB1c2UgaW4gcHJvdG90eXBlcwotICAgd2lsbCBuZXZlciBiZSB0aGVpciBmaXJzdCBvY2N1cmFuY2UuICAqLwotc3RydWN0IGZpeDsKLXN0cnVjdCBmcmFnOwotCi0vKiBvYmotdm1zIHJvdXRpbmVzIHZpc2libGUgdG8gdGhlIHJlc3Qgb2YgZ2FzLiAgKi8KLQotZXh0ZXJuIHZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqLHN0cnVjdCBmaXggKixyZWxheF9hZGRyZXNzVCkpOwotCi1leHRlcm4gaW50IHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZiBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OKFgpCXZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZihYKQotCi0vKiBDb21waWxlci1nZW5lcmF0ZWQgbGFiZWwgIl9fdmF4X2dfZG91YmxlcyIgaXMgdXNlZCB0byBhdWdtZW50IC5zdGFicy4gKi8KLWV4dGVybiB2b2lkIHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgb2JqX2Zyb2JfbGFiZWwoWCkgdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsKFgpCi0KLWV4dGVybiB2b2lkIHZtc19jaGVja19mb3JfbWFpbiBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIHZtc193cml0ZV9vYmplY3RfZmlsZSBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCx1bnNpZ25lZCwKLQkJCQkJICAgc3RydWN0IGZyYWcgKixzdHJ1Y3QgZnJhZyAqKSk7Ci0KLS8qIFZNUyBleGVjdXRhYmxlcyBhcmUgbm90aGluZyBsaWtlIGEub3V0LCBidXQgdGhlIFZNUyBwb3J0IG9mIGdjYyB1c2VzCi0gICBhLm91dCBmb3JtYXQgc3RhYnMgd2hpY2ggb2JqLXZtcy5jIHRoZW4gdHJhbnNsYXRlcy4gICovCi0KLSNkZWZpbmUgQU9VVF9TVEFCUwotCi0MCi0jaWZkZWYgV0FOVF9WTVNfT0JKX0RFRlMKLQotLyogVGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciBjb25zdGFudHMgdXNlZCB3aXRoaW4KLSAgIHRoZSBhY3R1YWwgVk1TIG9iamVjdCBmaWxlLiAgV2UgZG8gbm90IHVzZSBhICQgaW4gdGhlIHN5bWJvbHMgKGFzIHBlcgotICAgdXN1YWwgVk1TIGNvbnZlbnRpb24pIHNpbmNlIFN5c3RlbSBWIGdhZ3Mgb24gaXQuICAqLwotCi0jZGVmaW5lCU9CSl9TX0NfSERSCTAKLSNkZWZpbmUJT0JKX1NfQ19IRFJfTUhECTAKLSNkZWZpbmUJT0JKX1NfQ19IRFJfTE5NCTEKLSNkZWZpbmUJT0JKX1NfQ19IRFJfU1JDCTIKLSNkZWZpbmUJT0JKX1NfQ19IRFJfVFRMCTMKLSNkZWZpbmUJT0JKX1NfQ19IRFJfQ1BSCTQKLSNkZWZpbmUJT0JKX1NfQ19IRFJfTVRDCTUKLSNkZWZpbmUJT0JKX1NfQ19IRFJfR1RYCTYKLSNkZWZpbmUJT0JKX1NfQ19HU0QJMQotI2RlZmluZQlPQkpfU19DX0dTRF9QU0MJMAotI2RlZmluZQlPQkpfU19DX0dTRF9TWU0JMQotI2RlZmluZQlPQkpfU19DX0dTRF9FUE0JMgotI2RlZmluZQlPQkpfU19DX0dTRF9QUk8JMwotI2RlZmluZQlPQkpfU19DX0dTRF9TWU1XCTQKLSNkZWZpbmUJT0JKX1NfQ19HU0RfRVBNVwk1Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX1BST1cJNgotI2RlZmluZQlPQkpfU19DX0dTRF9JREMJNwotI2RlZmluZQlPQkpfU19DX0dTRF9FTlYJOAotI2RlZmluZQlPQkpfU19DX0dTRF9MU1kJOQotI2RlZmluZQlPQkpfU19DX0dTRF9MRVBNCTEwCi0jZGVmaW5lCU9CSl9TX0NfR1NEX0xQUk8JMTEKLSNkZWZpbmUJT0JKX1NfQ19HU0RfU1BTQwkxMgotI2RlZmluZQlPQkpfU19DX1RJUgkyCi0jZGVmaW5lCU9CSl9TX0NfRU9NCTMKLSNkZWZpbmUJT0JKX1NfQ19EQkcJNAotI2RlZmluZQlPQkpfU19DX1RCVAk1Ci0jZGVmaW5lCU9CSl9TX0NfTE5LCTYKLSNkZWZpbmUJT0JKX1NfQ19FT01XCTcKLSNkZWZpbmUJT0JKX1NfQ19NQVhSRUNUWVAJNwotI2RlZmluZQlPQkpfU19LX1NVQlRZUAkxCi0jZGVmaW5lCU9CSl9TX0NfU1VCVFlQCTEKLSNkZWZpbmUJT0JKX1NfQ19NQVhSRUNTSVoJMjA0OAotI2RlZmluZQlPQkpfU19DX1NUUkxWTAkwCi0jZGVmaW5lCU9CSl9TX0NfU1lNU0laCTMxCi0jZGVmaW5lCU9CSl9TX0NfU1RPUkVQTElNCS0xCi0jZGVmaW5lCU9CSl9TX0NfUFNDQUxJTElNCTkKLQwKLSNkZWZpbmUJTUhEX1NfQ19NSEQJMAotI2RlZmluZQlNSERfU19DX0xOTQkxCi0jZGVmaW5lCU1IRF9TX0NfU1JDCTIKLSNkZWZpbmUJTUhEX1NfQ19UVEwJMwotI2RlZmluZQlNSERfU19DX0NQUgk0Ci0jZGVmaW5lCU1IRF9TX0NfTVRDCTUKLSNkZWZpbmUJTUhEX1NfQ19HVFgJNgotI2RlZmluZQlNSERfU19DX01BWEhEUlRZUAk2Ci0MCi0jZGVmaW5lCUdTRF9TX0tfRU5UUklFUwkxCi0jZGVmaW5lCUdTRF9TX0NfRU5UUklFUwkxCi0jZGVmaW5lCUdTRF9TX0NfUFNDCTAKLSNkZWZpbmUJR1NEX1NfQ19TWU0JMQotI2RlZmluZQlHU0RfU19DX0VQTQkyCi0jZGVmaW5lCUdTRF9TX0NfUFJPCTMKLSNkZWZpbmUJR1NEX1NfQ19TWU1XCTQKLSNkZWZpbmUJR1NEX1NfQ19FUE1XCTUKLSNkZWZpbmUJR1NEX1NfQ19QUk9XCTYKLSNkZWZpbmUJR1NEX1NfQ19JREMJNwotI2RlZmluZQlHU0RfU19DX0VOVgk4Ci0jZGVmaW5lCUdTRF9TX0NfTFNZCTkKLSNkZWZpbmUJR1NEX1NfQ19MRVBNCTEwCi0jZGVmaW5lCUdTRF9TX0NfTFBSTwkxMQotI2RlZmluZQlHU0RfU19DX1NQU0MJMTIKLSNkZWZpbmUJR1NEX1NfQ19TWU1WCTEzCi0jZGVmaW5lCUdTRF9TX0NfRVBNVgkxNAotI2RlZmluZQlHU0RfU19DX1BST1YJMTUKLSNkZWZpbmUJR1NEX1NfQ19NQVhSRUNUWVAJMTUKLQwKLSNkZWZpbmUJR1NZX1NfTV9XRUFLCTEKLSNkZWZpbmUJR1NZX1NfTV9ERUYJMgotI2RlZmluZQlHU1lfU19NX1VOSQk0Ci0jZGVmaW5lCUdTWV9TX01fUkVMCTgKLQotI2RlZmluZQlMU1lfU19NX0RFRgkyCi0jZGVmaW5lCUxTWV9TX01fUkVMCTgKLQotI2RlZmluZQlFTlZfU19NX0RFRgkxCi0jZGVmaW5lCUVOVl9TX01fTkVTVEVECTIKLQwKLSNkZWZpbmUJR1BTX1NfTV9QSUMJMQotI2RlZmluZQlHUFNfU19NX0xJQgkyCi0jZGVmaW5lCUdQU19TX01fT1ZSCTQKLSNkZWZpbmUJR1BTX1NfTV9SRUwJOAotI2RlZmluZQlHUFNfU19NX0dCTAkxNgotI2RlZmluZQlHUFNfU19NX1NIUgkzMgotI2RlZmluZQlHUFNfU19NX0VYRQk2NAotI2RlZmluZQlHUFNfU19NX1JECTEyOAotI2RlZmluZQlHUFNfU19NX1dSVAkyNTYKLSNkZWZpbmUJR1BTX1NfTV9WRUMJNTEyCi0jZGVmaW5lCUdQU19TX0tfTkFNRQk5Ci0jZGVmaW5lCUdQU19TX0NfTkFNRQk5Ci0MCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0dCTAkwCi0jZGVmaW5lCVRJUl9TX0NfU1RBX1NCCTEKLSNkZWZpbmUJVElSX1NfQ19TVEFfU1cJMgotI2RlZmluZQlUSVJfU19DX1NUQV9MVwkzCi0jZGVmaW5lCVRJUl9TX0NfU1RBX1BCCTQKLSNkZWZpbmUJVElSX1NfQ19TVEFfUFcJNQotI2RlZmluZQlUSVJfU19DX1NUQV9QTAk2Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1VCCTcKLSNkZWZpbmUJVElSX1NfQ19TVEFfVVcJOAotI2RlZmluZQlUSVJfU19DX1NUQV9CRkkJOQotI2RlZmluZQlUSVJfU19DX1NUQV9XRkkJMTAKLSNkZWZpbmUJVElSX1NfQ19TVEFfTEZJCTExCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0VQTQkxMgotI2RlZmluZQlUSVJfU19DX1NUQV9DS0FSRwkxMwotI2RlZmluZQlUSVJfU19DX1NUQV9XUEIJMTQKLSNkZWZpbmUJVElSX1NfQ19TVEFfV1BXCTE1Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1dQTAkxNgotI2RlZmluZQlUSVJfU19DX1NUQV9MU1kJMTcKLSNkZWZpbmUJVElSX1NfQ19TVEFfTElUCTE4Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0xFUE0JMTkKLSNkZWZpbmUJVElSX1NfQ19NQVhTVEFDT0QJMTkKLSNkZWZpbmUJVElSX1NfQ19NSU5TVE9DT0QJMjAKLSNkZWZpbmUJVElSX1NfQ19TVE9fU0IJMjAKLSNkZWZpbmUJVElSX1NfQ19TVE9fU1cJMjEKLSNkZWZpbmUJVElSX1NfQ19TVE9fTAkyMgotI2RlZmluZQlUSVJfU19DX1NUT19CRAkyMwotI2RlZmluZQlUSVJfU19DX1NUT19XRAkyNAotI2RlZmluZQlUSVJfU19DX1NUT19MRAkyNQotI2RlZmluZQlUSVJfU19DX1NUT19MSQkyNgotI2RlZmluZQlUSVJfU19DX1NUT19QSURSCTI3Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1BJQ1IJMjgKLSNkZWZpbmUJVElSX1NfQ19TVE9fUlNCCTI5Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JTVwkzMAotI2RlZmluZQlUSVJfU19DX1NUT19STAkzMQotI2RlZmluZQlUSVJfU19DX1NUT19WUFMJMzIKLSNkZWZpbmUJVElSX1NfQ19TVE9fVVNCCTMzCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1VTVwkzNAotI2RlZmluZQlUSVJfU19DX1NUT19SVUIJMzUKLSNkZWZpbmUJVElSX1NfQ19TVE9fUlVXCTM2Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0IJMzcKLSNkZWZpbmUJVElSX1NfQ19TVE9fVwkzOAotI2RlZmluZQlUSVJfU19DX1NUT19SQgkzOQotI2RlZmluZQlUSVJfU19DX1NUT19SVwk0MAotI2RlZmluZQlUSVJfU19DX1NUT19SSVZCCTQxCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1BJUlIJNDIKLSNkZWZpbmUJVElSX1NfQ19NQVhTVE9DT0QJNDIKLSNkZWZpbmUJVElSX1NfQ19NSU5PUFJDT0QJNTAKLSNkZWZpbmUJVElSX1NfQ19PUFJfTk9QCTUwCi0jZGVmaW5lCVRJUl9TX0NfT1BSX0FERAk1MQotI2RlZmluZQlUSVJfU19DX09QUl9TVUIJNTIKLSNkZWZpbmUJVElSX1NfQ19PUFJfTVVMCTUzCi0jZGVmaW5lCVRJUl9TX0NfT1BSX0RJVgk1NAotI2RlZmluZQlUSVJfU19DX09QUl9BTkQJNTUKLSNkZWZpbmUJVElSX1NfQ19PUFJfSU9SCTU2Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0VPUgk1NwotI2RlZmluZQlUSVJfU19DX09QUl9ORUcJNTgKLSNkZWZpbmUJVElSX1NfQ19PUFJfQ09NCTU5Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0lOU1YJNjAKLSNkZWZpbmUJVElSX1NfQ19PUFJfQVNICTYxCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1VTSAk2MgotI2RlZmluZQlUSVJfU19DX09QUl9ST1QJNjMKLSNkZWZpbmUJVElSX1NfQ19PUFJfU0VMCTY0Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX1JFREVGCTY1Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0RGTElUCTY2Ci0jZGVmaW5lCVRJUl9TX0NfTUFYT1BSQ09ECTY2Ci0jZGVmaW5lCVRJUl9TX0NfTUlOQ1RMQ09ECTgwCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX1NFVFJCCTgwCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX0FVR1JCCTgxCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX0RGTE9DCTgyCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX1NUTE9DCTgzCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX1NUS0RMCTg0Ci0jZGVmaW5lCVRJUl9TX0NfTUFYQ1RMQ09ECTg0Ci0MCi0vKgotICoJRGVidWdnZXIgc3ltYm9sIGRlZmluaXRpb25zOiAgVGhlc2UgYXJlIGRvbmUgYnkgaGFuZCwgYXMgbm8KLSAqCQkJCQltYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gc2VlbXMKLSAqCQkJCQl0byBiZSBhdmFpbGFibGUuCi0gKi8KLSNkZWZpbmUgRFNUX1NfQ19DCSAgNwkvKiBMYW5ndWFnZSA9PSAiQyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19DWFgJIDE1CS8qIExhbmd1YWdlID09ICJDKysiCSovCi0jZGVmaW5lIERTVF9TX0NfVkVSU0lPTgkxNTMKLSNkZWZpbmUJRFNUX1NfQ19TT1VSQ0UJMTU1CS8qIFNvdXJjZSBmaWxlCQkqLwotI2RlZmluZSBEU1RfU19DX1BST0xPRwkxNjIKLSNkZWZpbmUJRFNUX1NfQ19CTEtCRUcJMTc2CS8qIEJlZ2lubmluZyBvZiBibG9jawkqLwotI2RlZmluZQlEU1RfU19DX0JMS0VORAkxNzcJLyogRW5kIG9mIGJsb2NrCSovCi0jZGVmaW5lIERTVF9TX0NfRU5UUlkJMTgxCi0jZGVmaW5lIERTVF9TX0NfUFNFQ1QJMTg0Ci0jZGVmaW5lCURTVF9TX0NfTElORV9OVU0JMTg1CS8qIExpbmUgTnVtYmVyCQkqLwotI2RlZmluZSBEU1RfU19DX0xCTE9STElUCTE4NgotI2RlZmluZSBEU1RfU19DX0xBQkVMCTE4NwotI2RlZmluZQlEU1RfU19DX01PREJFRwkxODgJLyogQmVnaW5uaW5nIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX01PREVORAkxODkJLyogRW5kIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkJFRwkxOTAJLyogQmVnaW5uaW5nIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19SVE5FTkQJMTkxCS8qIEVuZCBvZiByb3V0aW5lCSovCi0jZGVmaW5lCURTVF9TX0NfREVMVEFfUENfVwkxCS8qIEluY3IgUEMJKi8KLSNkZWZpbmUJRFNUX1NfQ19JTkNSX0xJTlVNCTIJLyogSW5jciBMaW5lICMJKi8KLSNkZWZpbmUJRFNUX1NfQ19JTkNSX0xJTlVNX1cJMwkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSCTQKLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fSU5DUl9XCTUKLSNkZWZpbmUgRFNUX1NfQ19SRVNFVF9MSU5VTV9JTkNSCTYKLSNkZWZpbmUgRFNUX1NfQ19CRUdfU1RNVF9NT0RFCTcKLSNkZWZpbmUgRFNUX1NfQ19FTkRfU1RNVF9NT0RFCTgKLSNkZWZpbmUJRFNUX1NfQ19TRVRfTElORV9OVU0JOQkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDCQkxMAotI2RlZmluZSBEU1RfU19DX1NFVF9QQ19XCQkxMQotI2RlZmluZSBEU1RfU19DX1NFVF9QQ19MCQkxMgotI2RlZmluZSBEU1RfU19DX1NFVF9TVE1UTlVNCTEzCi0jZGVmaW5lIERTVF9TX0NfVEVSTQkJMTQJLyogRW5kIG9mIGxpbmVzCSovCi0jZGVmaW5lIERTVF9TX0NfVEVSTV9XCQkxNQkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUJRFNUX1NfQ19TRVRfQUJTX1BDCTE2CS8qIFNldCBQQwkqLwotI2RlZmluZQlEU1RfU19DX0RFTFRBX1BDX0wJMTcJLyogSW5jciBQQwkqLwotI2RlZmluZSBEU1RfU19DX0lOQ1JfTElOVU1fTAkxOAkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9CCTE5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fTAkyMAkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lCURTVF9TX0NfVEVSTV9MCQkyMQkvKiBFbmQgb2YgbGluZXMJKi8KLS8qIHRoZXNlIGFyZSB1c2VkIHdpdGggRFNUX1NfQ19TT1VSQ0UgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVDTEZJTEUJIDEJLyogRGVjbGFyZSBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRGSUxFCSAyCS8qIFNldCBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfTAkgMwkvKiBTZXQgcmVjb3JkLCBsb25nd29yZCB2YWx1ZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfVwkgNAkvKiBTZXQgcmVjb3JkLCB3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0RFRkxJTkVTX1cJMTAJLyogIyBvZiBsaW5lLCB3b3JkIGNvdW50ZXIgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfQgkxMQkvKiAjIG9mIGxpbmUsIGJ5dGUgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19GT1JNRkVFRAkxNgkvKiBeTCBjb3VudHMgYXMgYSByZWNvcmQgKi8KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgZGF0YSB0eXBlcy4gIEFueXRoaW5nIG5vdCBvbgotICogdGhlIGxpc3QgaXMgaW5jbHVkZWQgdW5kZXIgJ2FkdmFuY2VkX3R5cGUnCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQ0hBUgkJMHgwMgotI2RlZmluZSBEQkdfU19DX1VTSU5UCQkweDAzCi0jZGVmaW5lIERCR19TX0NfVUxJTlQJCTB4MDQKLSNkZWZpbmUgREJHX1NfQ19VUVVBRAkJMHgwNQotI2RlZmluZSBEQkdfU19DX1NDSEFSCQkweDA2Ci0jZGVmaW5lIERCR19TX0NfU1NJTlQJCTB4MDcKLSNkZWZpbmUgREJHX1NfQ19TTElOVAkJMHgwOAotI2RlZmluZSBEQkdfU19DX1NRVUFECQkweDA5Ci0jZGVmaW5lIERCR19TX0NfUkVBTDQJCTB4MGEKLSNkZWZpbmUgREJHX1NfQ19SRUFMOAkJMHgwYgkJLyogRF9mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg0CQkweDBjCQkvKiAyeEZfZmxvYXQgY29tcGxleCBmbG9hdCAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDgJCTB4MGQJCS8qIDJ4RF9mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX1JFQUw4X0cJCTB4MWIJCS8qIEdfZmxvYXQgZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOF9HCTB4MWQJCS8qIDJ4R19mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0ZVTkNUSU9OX0FERFIJMHgxNwotI2RlZmluZSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUJMHhhMwotLyogIFNvbWUgb2YgdGhlc2UgYXJlIGp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICBbcHJdCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUQQkJMHgwMQkvKiB1bnNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUVQkJMHgyMgkvKiB1bnNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRBCQkweDI5CS8qIHNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19TQklUVQkJMHgyYQkvKiBzaWduZWQsIHVuYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19DU1RSSU5HCQkweDJlCS8qIGFzY2l6ICgnXDAnIHRlcm1pbmF0ZWQpIHN0cmluZyAqLwotI2RlZmluZSBEQkdfU19DX1dDSEFSCQkweDM4CS8qIHdjaGFyX3QgKi8KLS8qICBUaGVzZSBhcmUgZGVzY3JpcHRvciBjbGFzcyBjb2Rlcy4KLSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19TCQkweDAxCS8qIHN0YXRpYyAoZml4ZWQgbGVuZ3RoKSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19ECQkweDAyCS8qIGR5bmFtaWMgc3RyaW5nIChub3QgdmlhIG1hbGxvYyEpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0EJCTB4MDQJLyogYXJyYXkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfVUJTCQkweDBkCS8qIHVuYWxpZ25lZCBiaXQgc3RyaW5nICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBvZiBzdHJ1Y3QKLSAqICB1bmlvbiBhbmQgZW51bSByZWNvcmRzCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19FTlVNX0lURU0JCTB4YTQKLSNkZWZpbmUgREJHX1NfQ19FTlVNX1NUQVJUCQkweGE1Ci0jZGVmaW5lIERCR19TX0NfRU5VTV9FTkQJCTB4YTYKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfSVRFTQkJRFNUX0tfVkZMQUdTX0JJVE9GRlMJLyogMHhmZiAqLwotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9TVEFSVAkJMHhhYgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9FTkQJCTB4YWMKLSNkZWZpbmUgRFNUX0tfVFlQU1BFQwkJCTB4YWYJCS8qIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotLyogVGhlc2UgY29kZXMgYXJlIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZHMKLSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfTk9WQUwJCTB4ODAJLyogc3RydWN0IGRlZmluaXRpb24gb25seSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfRFNDCQkweGZhCS8qIGRlc2NyaXB0b3IgdXNlZCAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfVFZTCQkweGZiCS8qIHRyYWlsaW5nIHZhbHVlIHNwZWNpZmllZCAqLwotI2RlZmluZSBEU1RfS19WU19GT0xMT1dTCQkweGZkCS8qIHZhbHVlIHNwZWMgZm9sbG93cyAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfQklUT0ZGUwkJMHhmZgkvKiB2YWx1ZSBjb250YWlucyBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfTElURVJBTAkwCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfQUREUgkxCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfREVTQwkyCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfUkVHCTMKLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9BUAkweDBjCS8qIFIxMiAqLwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0ZQCTB4MGQJLyogUjEzICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfU1AJMHgwZQkvKiBSMTQgKi8KLSNkZWZpbmUgRFNUX1ZfVkFMS0lORAkJMAkvKiBvZmZzZXQgb2YgdmFsa2luZCBmaWVsZCAqLwotI2RlZmluZSBEU1RfVl9JTkRJUkVDVAkJMgkvKiBvZmZzZXQgdG8gaW5kaXJlY3QgYml0ICovCi0jZGVmaW5lIERTVF9WX0RJU1AJCTMJLyogb2Zmc2V0IHRvIGRpc3BsYWNlbWVudCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfUkVHTlVNCQk0CS8qIG9mZnNldCB0byByZWdpc3RlciBudW1iZXIgKi8KLSNkZWZpbmUgRFNUX01fSU5ESVJFQ1QJCSgxPDxEU1RfVl9JTkRJUkVDVCkKLSNkZWZpbmUgRFNUX01fRElTUAkJKDE8PERTVF9WX0RJU1ApCi0jZGVmaW5lIERCR19DX0ZVTkNUSU9OX1BBUkFNCS8qIDB4YzkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9BUDw8RFNUX1ZfUkVHTlVNKSkKLSNkZWZpbmUgREJHX0NfTE9DQUxfU1lNCQkvKiAweGQ5ICovCVwKLQkoRFNUX0tfVkFMS0lORF9BRERSfERTVF9NX0RJU1B8KERTVF9LX1JFR19WQVhfRlA8PERTVF9WX1JFR05VTSkpCi0vKiBLaW5kcyBvZiB2YWx1ZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1ZTX0FMTE9DX1NQTElUCTMJLyogc3BsaXQgbGlmZXRpbWUgKi8KLS8qIEtpbmRzIG9mIHR5cGUgc3BlY2lmaWNhdGlvbnMKLSAqLwotI2RlZmluZSBEU1RfS19UU19BVE9NCQkweDAxCS8qIGF0b21pYyB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfRFNDCQkweDAyCS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX0lORAkJMHgwMwkvKiBpbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfVFBUUgkJMHgwNAkvKiB0eXBlZCBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19QVFIJCTB4MDUJLyogcG9pbnRlciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfQVJSQVkJCTB4MDcJLyogYXJyYXkgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX05PVl9MRU5HCTB4MGUJLyogbm92ZWwgbGVuZ3RoIHR5cGUgc3BlYyAqLwotLyogIFRoZXNlIGFyZSB0aGUgY29kZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgc3VmZml4IHJlY29yZHMgdG8gZGV0ZXJtaW5lIHRoZQotICogIGFjdHVhbCBkYXRhIHR5cGUKLSAqLwotI2RlZmluZSBEQkdfU19DX0JBU0lDCQkJRFNUX0tfVFNfQVRPTQotI2RlZmluZSBEQkdfU19DX0JBU0lDX0FSUkFZCQlEU1RfS19UU19EU0MKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1QJCQlEU1RfS19UU19JTkQKLSNkZWZpbmUgREJHX1NfQ19QT0lOVEVSCQkJRFNUX0tfVFNfVFBUUgotI2RlZmluZSBEQkdfU19DX1ZPSUQJCQlEU1RfS19UU19QVFIKLSNkZWZpbmUgREJHX1NfQ19DT01QTEVYX0FSUkFZCQlEU1RfS19UU19BUlJBWQotCi0jZW5kaWYJLyogV0FOVF9WTVNfT0JKX0RFRlMgKi8KLQotLyogZW5kIG9mIG9iai12bXMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hMjlrLmMgYi9nYXMvY29uZmlnL3RjLWEyOWsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwZmVjNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOTYgKzAsMCBAQAotLyogdGMtYTI5ay5jIC0tIEFzc2VtYmxlIGZvciB0aGUgQU1EIDI5MDAwLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSm9obiBHaWxtb3JlIGhhcyByZW9yZ2FuaXplZCB0aGlzIG1vZHVsZSBzb21ld2hhdCwgdG8gbWFrZSBpdCBlYXNpZXIKLSAgIHRvIGNvbnZlcnQgaXQgdG8gbmV3IG1hY2hpbmVzJyBhc3NlbWJsZXJzIGFzIGRlc2lyZWQuICBUaGVyZSB3YXMgdG9vCi0gICBtdWNoIGJsb29keSByZXdyaXRpbmcgcmVxdWlyZWQgYmVmb3JlLiAgVGhlcmUgc3RpbGwgcHJvYmFibHkgaXMuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL2EyOWsuaCIKLQotLyogTWFrZSBpdCBlYXNpZXIgdG8gY2xvbmUgdGhpcyBtYWNoaW5lIGRlc2MgaW50byBhbm90aGVyIG9uZS4gICovCi0jZGVmaW5lCW1hY2hpbmVfb3Bjb2RlCWEyOWtfb3Bjb2RlCi0jZGVmaW5lCW1hY2hpbmVfb3Bjb2RlcwlhMjlrX29wY29kZXMKLSNkZWZpbmUJbWFjaGluZV9pcAlhMjlrX2lwCi0jZGVmaW5lCW1hY2hpbmVfaXQJYTI5a19pdAotCi0jZGVmaW5lCUlNTUVESUFURV9CSVQJMHgwMTAwMDAwMAkvKiBUdXJucyBSQiBpbnRvIEltbWVkaWF0ZSAqLwotI2RlZmluZQlBQlNPTFVURV9CSVQJMHgwMTAwMDAwMAkvKiBUdXJucyBQQy1yZWxhdGl2ZSB0byBBYnNvbHV0ZSAqLwotI2RlZmluZQlDRV9CSVQJCTB4MDA4MDAwMDAJLyogQ29wcm9jZXNzb3IgZW5hYmxlIGluIExPQUQgKi8KLSNkZWZpbmUJVUlfQklUCQkweDAwMDAwMDgwCS8qIFVuc2lnbmVkIGludGVnZXIgaW4gQ09OVkVSVCAqLwotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7Ci0KLXN0cnVjdCBtYWNoaW5lX2l0Ci0gIHsKLSAgICBjaGFyICplcnJvcjsKLSAgICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgICBzdHJ1Y3Qgbmxpc3QgKm5saXN0cDsKLSAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgaW50IHBjcmVsOwotICAgIGludCByZWxvY19vZmZzZXQ7CQkvKiBPZmZzZXQgb2YgcmVsb2Mgd2l0aGluIGluc24gKi8KLQotICAgIGludCByZWxvYzsKLSAgfQotdGhlX2luc247Ci0KLXN0YXRpYyB2b2lkIG1hY2hpbmVfaXAgUEFSQU1TICgoY2hhciAqc3RyKSk7Ci0vKiBzdGF0aWMgdm9pZCBwcmludF9pbnNuIFBBUkFNUyAoKHN0cnVjdCBtYWNoaW5lX2l0ICppbnNuKSk7ICovCi0jaWZuZGVmIE9CSl9DT0ZGCi1zdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNfdXNlIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLWNvbnN0IHBzZXVkb190eXBlUwotbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgNH0sCi0gIHsiYmxvY2siLCBzX3NwYWNlLCAwfSwKLSAgeyJjcHV0eXBlIiwgc19pZ25vcmUsIDB9LAkvKiBDUFUgYXMgMjkwMDAgb3IgMjkwNTAgKi8KLSAgeyJyZWciLCBzX2xzeW0sIDB9LAkJLyogUmVnaXN0ZXIgZXF1YXRlLCBzYW1lIGFzIGVxdSAqLwotICB7InNwYWNlIiwgc19pZ25vcmUsIDB9LAkvKiBMaXN0aW5nIGNvbnRyb2wgKi8KLSAgeyJzZWN0Iiwgc19pZ25vcmUsIDB9LAkvKiBDcmVhdGlvbiBvZiBjb2ZmIHNlY3Rpb25zICovCi0jaWZuZGVmIE9CSl9DT0ZGCi0gIC8qIFdlIGNhbiBkbyB0aGlzIHJpZ2h0IHdpdGggY29mZi4gICovCi0gIHsidXNlIiwgc191c2UsIDB9LAotI2VuZGlmCi0gIHsid29yZCIsIGNvbnMsIDR9LAotICB7TlVMTCwgMCwgMH0sCi19OwotCi0jaWYgZGVmaW5lZChCRkRfSEVBREVSUykKLSNpZmRlZiBSRUxTWgotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSBSRUxTWjsJLyogQ29mZiBoZWFkZXJzICovCi0jZWxzZQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAxMjsJCS8qIHNvbWV0aGluZyBlbHNlIGhlYWRlcnMgKi8KLSNlbmRpZgotI2Vsc2UKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gMTI7CQkvKiBOb3QgYmZkaXplZCovCi0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBXZSBuZWVkZWQgYW4gdW51c2VkIGNoYXIgZm9yIGxpbmUgc2VwYXJhdGlvbiB0byB3b3JrIGFyb3VuZCB0aGUKLSAgIGxhY2sgb2YgbWFjcm9zLCB1c2luZyBzZWQgYW5kIHN1Y2guICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIkAiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQKLSAgIGFsbCwgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi0vKgotICogIGFudWxsIGJpdCAtIGNhdXNlcyB0aGUgYnJhbmNoIGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb25zIHRvIG5vdCBiZSBleGVjdXRlZAotICovCi0jZGVmaW5lIEFOTlVMICAgICAgICgxIDw8IDI5KQotCi0jaWZuZGVmIE9CSl9DT0ZGCi0KLXN0YXRpYyB2b2lkCi1zX3VzZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLnRleHQiLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotICAgICAgc190ZXh0ICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIuZGF0YSIsIDUpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBzX2RhdGEgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5kYXRhMSIsIDYpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gICAgICBzX2RhdGExICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgLyogTGl0ZXJhbHMgY2FuJ3QgZ28gaW4gdGhlIHRleHQgc2VnbWVudCBiZWNhdXNlIHlvdSBjYW4ndCByZWFkIGZyb20KLSAgICAgaW5zdHJ1Y3Rpb24gbWVtb3J5IG9uIHNvbWUgMjlrJ3MuICBTbywgaW50byBpbml0aWFsaXplZCBkYXRhLiAqLwotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmxpdCIsIDQpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0gICAgICBzdWJzZWdfc2V0IChTRUdfREFUQSwgMjAwKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFzX2JhZCAoXygiVW5rbm93biBzZWdtZW50IHR5cGUiKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2RhdGExICgpCi17Ci0gIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAxKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLS8qIEluc3RhbGwgc3ltYm9sIGRlZmluaXRpb24gdGhhdCBtYXBzIFJFR05BTUUgdG8gUkVHTk8uCi0gICBGSVhNRS1TT09OOiAgVGhlc2UgYXJlIG5vdCByZWNvZ25pemVkIGluIG1peGVkIGNhc2UuICAqLwotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3NyZWcgKHJlZ25hbWUsIHJlZ251bSkKLSAgICAgY2hhciAqcmVnbmFtZTsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgLyogRklYTUUtU09PTiwgcHV0IHNvbWV0aGluZyBpbiB0aGVzZSBzeW1zIHNvIHRoZXkgd29uJ3QgYmUgb3V0cHV0Ci0gICAgIHRvIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZS4gICovCi0KLSAgLyogTXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgbmFtZXMgb2YgdGhlIHNwZWNpYWwgcmVnaXN0ZXJzLiAgKi8KLSAgY2hhciBidWZbODBdOwotICBpbnQgaTsKLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChyZWduYW1lLCBTRUdfUkVHSVNURVIsICh2YWx1ZVQpIHJlZ251bSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgZm9yIChpID0gMDsgcmVnbmFtZVtpXTsgaSsrKQotICAgIGJ1ZltpXSA9IGlzbG93ZXIgKHJlZ25hbWVbaV0pID8gdG91cHBlciAocmVnbmFtZVtpXSkgOiByZWduYW1lW2ldOwotICBidWZbaV0gPSAnXDAnOwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKGJ1ZiwgU0VHX1JFR0lTVEVSLCAodmFsdWVUKSByZWdudW0sCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci19Ci0KLS8qIEluc3RhbGwgc3ltYm9sIGRlZmluaXRpb25zIGZvciBhc3NvcnRlZCBzcGVjaWFsIHJlZ2lzdGVycy4KLSAgIFNlZSBBU00yOUsgUmVmIHBhZ2UgMi05LiAgKi8KLQotdm9pZAotZGVmaW5lX3NvbWVfcmVncyAoKQotewotI2RlZmluZSBTUkVHCTI1NgotCi0gIC8qIFByb3RlY3RlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgKi8KLSAgaW5zZXJ0X3NyZWcgKCJ2YWIiLCBTUkVHICsgMCk7Ci0gIGluc2VydF9zcmVnICgib3BzIiwgU1JFRyArIDEpOwotICBpbnNlcnRfc3JlZyAoImNwcyIsIFNSRUcgKyAyKTsKLSAgaW5zZXJ0X3NyZWcgKCJjZmciLCBTUkVHICsgMyk7Ci0gIGluc2VydF9zcmVnICgiY2hhIiwgU1JFRyArIDQpOwotICBpbnNlcnRfc3JlZyAoImNoZCIsIFNSRUcgKyA1KTsKLSAgaW5zZXJ0X3NyZWcgKCJjaGMiLCBTUkVHICsgNik7Ci0gIGluc2VydF9zcmVnICgicmJwIiwgU1JFRyArIDcpOwotICBpbnNlcnRfc3JlZyAoInRtYyIsIFNSRUcgKyA4KTsKLSAgaW5zZXJ0X3NyZWcgKCJ0bXIiLCBTUkVHICsgOSk7Ci0gIGluc2VydF9zcmVnICgicGMwIiwgU1JFRyArIDEwKTsKLSAgaW5zZXJ0X3NyZWcgKCJwYzEiLCBTUkVHICsgMTEpOwotICBpbnNlcnRfc3JlZyAoInBjMiIsIFNSRUcgKyAxMik7Ci0gIGluc2VydF9zcmVnICgibW11IiwgU1JFRyArIDEzKTsKLSAgaW5zZXJ0X3NyZWcgKCJscnUiLCBTUkVHICsgMTQpOwotCi0gIC8qIEFkZGl0aW9uYWwgcHJvdGVjdGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlcnMgZm9yIHRoZSAyOTA1MCAqLwotICBpbnNlcnRfc3JlZyAoInJzbiIsICBTUkVHICsgMTUpOwotICBpbnNlcnRfc3JlZyAoInJtYTAiLCBTUkVHICsgMTYpOwotICBpbnNlcnRfc3JlZyAoInJtYzAiLCBTUkVHICsgMTcpOwotICBpbnNlcnRfc3JlZyAoInJtYTEiLCBTUkVHICsgMTgpOwotICBpbnNlcnRfc3JlZyAoInJtYzEiLCBTUkVHICsgMTkpOwotICBpbnNlcnRfc3JlZyAoInNwYzAiLCBTUkVHICsgMjApOwotICBpbnNlcnRfc3JlZyAoInNwYzEiLCBTUkVHICsgMjEpOwotICBpbnNlcnRfc3JlZyAoInNwYzIiLCBTUkVHICsgMjIpOwotICBpbnNlcnRfc3JlZyAoImliYTAiLCBTUkVHICsgMjMpOwotICBpbnNlcnRfc3JlZyAoImliYzAiLCBTUkVHICsgMjQpOwotICBpbnNlcnRfc3JlZyAoImliYTEiLCBTUkVHICsgMjUpOwotICBpbnNlcnRfc3JlZyAoImliYzEiLCBTUkVHICsgMjYpOwotCi0gIC8qIEFkZGl0aW9uYWwgcmVnaXN0ZXJzIGZvciB0aGUgMjkwNDAuICAqLwotICBpbnNlcnRfc3JlZyAoImRiYSIsIFNSRUcgKyAyNyk7Ci0gIGluc2VydF9zcmVnICgiZGJjIiwgU1JFRyArIDI4KTsKLSAgaW5zZXJ0X3NyZWcgKCJjaXIiLCBTUkVHICsgMjkpOwotICBpbnNlcnRfc3JlZyAoImNkciIsIFNSRUcgKyAzMCk7Ci0KLSAgLyogVW5wcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG5hbWVzICovCi0gIGluc2VydF9zcmVnICgiaXBjIiwgU1JFRyArIDEyOCk7Ci0gIGluc2VydF9zcmVnICgiaXBhIiwgU1JFRyArIDEyOSk7Ci0gIGluc2VydF9zcmVnICgiaXBiIiwgU1JFRyArIDEzMCk7Ci0gIGluc2VydF9zcmVnICgicSIsIFNSRUcgKyAxMzEpOwotICBpbnNlcnRfc3JlZyAoImFsdSIsIFNSRUcgKyAxMzIpOwotICBpbnNlcnRfc3JlZyAoImJwIiwgU1JFRyArIDEzMyk7Ci0gIGluc2VydF9zcmVnICgiZmMiLCBTUkVHICsgMTM0KTsKLSAgaW5zZXJ0X3NyZWcgKCJjciIsIFNSRUcgKyAxMzUpOwotICBpbnNlcnRfc3JlZyAoImZwZSIsIFNSRUcgKyAxNjApOwotICBpbnNlcnRfc3JlZyAoImludGUiLCBTUkVHICsgMTYxKTsKLSAgaW5zZXJ0X3NyZWcgKCJmcHMiLCBTUkVHICsgMTYyKTsKLSAgLyogICIiLCAgICBTUkVHKzE2Myk7CSAgUmVzZXJ2ZWQgKi8KLSAgaW5zZXJ0X3NyZWcgKCJleG9wIiwgU1JFRyArIDE2NCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiwgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwKLSAgIG5lZWQuICAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgaW50IGxvc2UgPSAwOwotICByZWdpc3RlciBpbnQgc2tpcG5leHQgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLSAgcmVnaXN0ZXIgY2hhciAqc3RyZW5kLCAqc3RyZW5kMjsKLQotICAvKiBIYXNoIHVwIGFsbCB0aGUgb3Bjb2RlcyBmb3IgZmFzdCB1c2UgbGF0ZXIuICAqLwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtX29wY29kZXM7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gbWFjaGluZV9vcGNvZGVzW2ldLm5hbWU7Ci0KLSAgICAgIGlmIChza2lwbmV4dCkKLQl7Ci0JICBza2lwbmV4dCA9IDA7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEhhY2sgdG8gYXZvaWQgbXVsdGlwbGUgb3Bjb2RlIGVudHJpZXMuICBXZSBwcmUtbG9jYXRlIGFsbCB0aGUKLQkgdmFyaWF0aW9ucyAoYi9pIGZpZWxkIGFuZCBQL0EgZmllbGQpIGFuZCBoYW5kbGUgdGhlbS4gKi8KLQotICAgICAgaWYgKCFzdHJjbXAgKG5hbWUsIG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0ubmFtZSkpCi0JewotCSAgaWYgKChtYWNoaW5lX29wY29kZXNbaV0ub3Bjb2RlICYgMHgwMTAwMDAwMCkgIT0gMAotCSAgICAgIHx8IChtYWNoaW5lX29wY29kZXNbaSArIDFdLm9wY29kZSAmIDB4MDEwMDAwMDApID09IDAKLQkgICAgICB8fCAoKG1hY2hpbmVfb3Bjb2Rlc1tpXS5vcGNvZGUgfCAweDAxMDAwMDAwKQotCQkgICE9IG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0ub3Bjb2RlKSkKLQkgICAgZ290byBiYWRfdGFibGU7Ci0JICBzdHJlbmQgPSBtYWNoaW5lX29wY29kZXNbaV0uYXJncyArIHN0cmxlbiAobWFjaGluZV9vcGNvZGVzW2ldLmFyZ3MpIC0gMTsKLQkgIHN0cmVuZDIgPSBtYWNoaW5lX29wY29kZXNbaSArIDFdLmFyZ3MgKyBzdHJsZW4gKG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0uYXJncykgLSAxOwotCSAgc3dpdGNoICgqc3RyZW5kKQotCSAgICB7Ci0JICAgIGNhc2UgJ2InOgotCSAgICAgIGlmICgqc3RyZW5kMiAhPSAnaScpCi0JCWdvdG8gYmFkX3RhYmxlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdQJzoKLQkgICAgICBpZiAoKnN0cmVuZDIgIT0gJ0EnKQotCQlnb3RvIGJhZF90YWJsZTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgYmFkX3RhYmxlOgotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgImludGVybmFsIGVycm9yOiBjYW4ndCBoYW5kbGUgb3Bjb2RlICVzXG4iLAotCQkgICAgICAgbmFtZSk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQotCSAgLyogT0ssIHRoaXMgaXMgYW4gaS9iIG9yIEEvUCBwYWlyLiAgV2Ugc2tpcCB0aGUKLQkgICAgIGhpZ2hlci12YWx1ZWQgb25lLCBhbmQgbGV0IHRoZSBjb2RlIGZvciBvcGVyYW5kIGNoZWNraW5nCi0JICAgICBoYW5kbGUgT1ItaW5nIGluIHRoZSBiaXQuICAqLwotCSAgc2tpcG5leHQgPSAxOwotCX0KLQotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChQVFIpICZtYWNoaW5lX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iLAotCQkgICBtYWNoaW5lX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLQkgIGxvc2UgPSAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxvc2UpCi0gICAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCi0gIGRlZmluZV9zb21lX3JlZ3MgKCk7Ci19Ci0KLS8qIEFzc2VtYmxlIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgSXRzIGxhYmVsIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZAotICAgYnkgdGhlIGdlbmVyaWMgZnJvbnQgZW5kLiAgV2UganVzdCBwYXJzZSBvcGNvZGUgYW5kIG9wZXJhbmRzLCBhbmQKLSAgIHByb2R1Y2UgdGhlIGJ5dGVzIG9mIGRhdGEgYW5kIHJlbG9jYXRpb24uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnRvUDsKLQotICBrbm93IChzdHIpOwotICBtYWNoaW5lX2lwIChzdHIpOwotICB0b1AgPSBmcmFnX21vcmUgKDQpOwotICAvKiBwdXQgb3V0IHRoZSBvcGNvZGUgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIHRoZV9pbnNuLm9wY29kZSwgNCk7Ci0KLSAgLyogcHV0IG91dCB0aGUgc3ltYm9sLWRlcGVuZGVudCBzdHVmZiAqLwotICBpZiAodGhlX2luc24ucmVsb2MgIT0gTk9fUkVMT0MpCi0gICAgewotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyB0aGVfaW5zbi5yZWxvY19vZmZzZXQpLAotCQkgICA0LAkJLyogc2l6ZSAqLwotCQkgICAmdGhlX2luc24uZXhwLAotCQkgICB0aGVfaW5zbi5wY3JlbCwKLQkJICAgdGhlX2luc24ucmVsb2MpOwotICAgIH0KLX0KLQotY2hhciAqCi1wYXJzZV9vcGVyYW5kIChzLCBvcGVyYW5kcCwgb3B0KQotICAgICBjaGFyICpzOwotICAgICBleHByZXNzaW9uUyAqb3BlcmFuZHA7Ci0gICAgIGludCBvcHQ7Ci17Ci0gIGNoYXIgKnNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKm5ldzsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICBleHByZXNzaW9uIChvcGVyYW5kcCk7Ci0gIGlmIChvcGVyYW5kcC0+WF9vcCA9PSBPX2Fic2VudCAmJiAhIG9wdCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBJbnN0cnVjdGlvbiBwYXJzaW5nLiAgVGFrZXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgb3Bjb2RlLgotICAgT3BlcmFuZHMgYXJlIGF0IGlucHV0X2xpbmVfcG9pbnRlci4gIE91dHB1dCBpcyBpbiB0aGVfaW5zbi4KLSAgIFdhcm5pbmdzIG9yIGVycm9ycyBhcmUgZ2VuZXJhdGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hY2hpbmVfaXAgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBjb25zdCBjaGFyICphcmdzOwotICBzdHJ1Y3QgbWFjaGluZV9vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NTdGFydDsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIGV4cHJlc3Npb25TIHRoZV9vcGVyYW5kOwotICBleHByZXNzaW9uUyAqb3BlcmFuZCA9ICZ0aGVfb3BlcmFuZDsKLSAgdW5zaWduZWQgaW50IHJlZzsKLQotICAvKiBNdXN0IGhhbmRsZSBgZGl2MCcgb3Bjb2RlLiAgKi8KLSAgcyA9IHN0cjsKLSAgaWYgKGlzYWxwaGEgKCpzKSkKLSAgICBmb3IgKDsgaXNhbG51bSAoKnMpOyArK3MpCi0gICAgICBpZiAoaXN1cHBlciAoKnMpKQotCSpzID0gdG9sb3dlciAoKnMpOwotCi0gIHN3aXRjaCAoKnMpCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnICc6CQkJLyogRklYTUUtU09NRURBWSBtb3JlIHdoaXRlc3BhY2UgKi8KLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKChpbnNuID0gKHN0cnVjdCBtYWNoaW5lX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbmtub3duIG9wY29kZSBgJXMnLiIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYXJnc1N0YXJ0ID0gczsKLSAgb3Bjb2RlID0gaW5zbi0+b3Bjb2RlOwotICBtZW1zZXQgKCZ0aGVfaW5zbiwgJ1wwJywgc2l6ZW9mICh0aGVfaW5zbikpOwotICB0aGVfaW5zbi5yZWxvYyA9IE5PX1JFTE9DOwotCi0gIC8qIEJ1aWxkIHRoZSBvcGNvZGUsIGNoZWNraW5nIGFzIHdlIGdvIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotICAgICBvcGVyYW5kcyBtYXRjaC4KLSAgIAotICAgICBJZiBhbiBvcGVyYW5kIG1hdGNoZXMsIHdlIG1vZGlmeSB0aGVfaW5zbiBvciBvcGNvZGUgYXBwcm9wcmlhdGVseSwKLSAgICAgYW5kIGRvIGEgImNvbnRpbnVlIi4gIElmIGFuIG9wZXJhbmQgZmFpbHMgdG8gbWF0Y2gsIHdlICJicmVhayIuICAqLwotCi0gIGlmIChpbnNuLT5hcmdzWzBdICE9ICdcMCcpCi0gICAgewotICAgICAgLyogUHJpbWUgdGhlIHB1bXAuICAqLwotICAgICAgcyA9IHBhcnNlX29wZXJhbmQgKHMsIG9wZXJhbmQsIGluc24tPmFyZ3NbMF0gPT0gJ0knKTsKLSAgICB9Ci0KLSAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCphcmdzKQotCXsKLQotCWNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCi0JICBpZiAoKnMgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSB0cnVseSBkb25lLiAqLwotCSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IG9wY29kZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGFzX2JhZCAoXygiVG9vIG1hbnkgb3BlcmFuZHM6ICVzIiksIHMpOwotCSAgYnJlYWs7Ci0KLQljYXNlICcsJzoJCS8qIE11c3QgbWF0Y2ggYSBjb21tYSAqLwotCSAgaWYgKCpzKysgPT0gJywnKQotCSAgICB7Ci0JICAgICAgLyogUGFyc2UgbmV4dCBvcGVyYW5kLiAgKi8KLQkgICAgICBzID0gcGFyc2Vfb3BlcmFuZCAocywgb3BlcmFuZCwgYXJnc1sxXSA9PSAnSScpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ3YnOgkJLyogVHJhcCBudW1iZXJzIChpbW1lZGlhdGUgZmllbGQpICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDI1NikKLQkJewotCQkgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDE2KTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZCAoXygiSW1tZWRpYXRlIHZhbHVlIG9mICVsZCBpcyB0b28gbGFyZ2UiKSwKLQkJCSAgKGxvbmcpIG9wZXJhbmQtPlhfYWRkX251bWJlcik7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ184OwotCSAgdGhlX2luc24ucmVsb2Nfb2Zmc2V0ID0gMTsJLyogQklHLUVORElBTiBCeXRlIDEgb2YgaW5zbiAqLwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2InOgkJLyogQSBnZW5lcmFsIHJlZ2lzdGVyIG9yIDgtYml0IGltbWVkaWF0ZSAqLwotCWNhc2UgJ2knOgotCSAgLyogV2UgdHJlYXQgdGhlIHR3byBjYXNlcyBpZGVudGljYWxseSBzaW5jZSB3ZSBtYXNoZWQKLQkgICAgIHRoZW0gdG9nZXRoZXIgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX3JlZ2lzdGVyKQotCSAgICBnb3RvIGdlbmVyYWxfcmVnOwotCi0JICAvKiBNYWtlIHN1cmUgdGhlICdpJyBjYXNlIHJlYWxseSBleGlzdHMuICAqLwotCSAgaWYgKChpbnNuLT5vcGNvZGUgfCBJTU1FRElBVEVfQklUKSAhPSAoaW5zbiArIDEpLT5vcGNvZGUpCi0JICAgIGJyZWFrOwotCi0JICBvcGNvZGUgfD0gSU1NRURJQVRFX0JJVDsKLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgMjU2KQotCQl7Ci0JCSAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlcjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZCAoXygiSW1tZWRpYXRlIHZhbHVlIG9mICVsZCBpcyB0b28gbGFyZ2UiKSwKLQkJCSAgKGxvbmcpIG9wZXJhbmQtPlhfYWRkX251bWJlcik7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ184OwotCSAgdGhlX2luc24ucmVsb2Nfb2Zmc2V0ID0gMzsJLyogQklHLUVORElBTiBCeXRlIDMgb2YgaW5zbiAqLwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2EnOgkJLyogbmV4dCBvcGVyYW5kIG11c3QgYmUgYSByZWdpc3RlciAqLwotCWNhc2UgJ2MnOgotCWdlbmVyYWxfcmVnOgotCSAgLyogbHJOTk4gb3IgZ3JOTk4gb3IgJSVleHByIG9yIGEgdXNlci1kZWYgcmVnaXN0ZXIgbmFtZSAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgIT0gT19yZWdpc3RlcikKLQkgICAgYnJlYWs7CQkvKiBPbmx5IHJlZ2lzdGVycyAqLwotCSAga25vdyAob3BlcmFuZC0+WF9hZGRfc3ltYm9sID09IDApOwotCSAga25vdyAob3BlcmFuZC0+WF9vcF9zeW1ib2wgPT0gMCk7Ci0JICByZWcgPSBvcGVyYW5kLT5YX2FkZF9udW1iZXI7Ci0JICBpZiAocmVnID49IFNSRUcpCi0JICAgIGJyZWFrOwkJLyogTm8gc3BlY2lhbCByZWdpc3RlcnMgKi8KLQotCSAgLyogR290IHRoZSByZWdpc3Rlciwgbm93IGZpZ3VyZSBvdXQgd2hlcmUgaXQgZ29lcyBpbiB0aGUKLQkgICAgIG9wY29kZS4gICovCi0JICBzd2l0Y2ggKCphcmdzKQotCSAgICB7Ci0JICAgIGNhc2UgJ2EnOgotCSAgICAgIG9wY29kZSB8PSByZWcgPDwgODsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdiJzoKLQkgICAgY2FzZSAnaSc6Ci0JICAgICAgb3Bjb2RlIHw9IHJlZzsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdjJzoKLQkgICAgICBvcGNvZGUgfD0gcmVnIDw8IDE2OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3gnOgkJLyogMTYgYml0IGNvbnN0YW50LCB6ZXJvLWV4dGVuZGVkICovCi0JY2FzZSAnWCc6CQkvKiAxNiBiaXQgY29uc3RhbnQsIG9uZS1leHRlbmRlZCAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHhGRikgPDwgMCB8Ci0JCSgob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHhGRjAwKSA8PCA4KTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ19DT05TVDsKLQkgIHRoZV9pbnNuLmV4cCA9ICpvcGVyYW5kOwotCSAgY29udGludWU7Ci0KLQljYXNlICdoJzoKLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4MDBGRjAwMDApID4+IDE2IHwKLQkJKCgodW5zaWduZWQgbG9uZykgb3BlcmFuZC0+WF9hZGRfbnVtYmVyCi0JCSAgLyogYXZvaWQgc2lnbiBleHQgKi8gICYgMHhGRjAwMDAwMCkgPj4gOCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIHRoZV9pbnNuLnJlbG9jID0gUkVMT0NfQ09OU1RIOwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1AnOgkJLyogUEMtcmVsYXRpdmUganVtcCBhZGRyZXNzICovCi0JY2FzZSAnQSc6CQkvKiBBYnNvbHV0ZSBqdW1wIGFkZHJlc3MgKi8KLQkgIC8qIFRoZXNlIHR3byBhcmUgdHJlYXRlZCB0b2dldGhlciBzaW5jZSB3ZSBmb2xkZWQgdGhlCi0JICAgICBvcGNvZGUgdGFibGUgZW50cmllcyB0b2dldGhlci4gICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgLyogTWFrZSBzdXJlIHRoZSAnQScgY2FzZSByZWFsbHkgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoKGluc24tPm9wY29kZSB8IEFCU09MVVRFX0JJVCkgIT0gKGluc24gKyAxKS0+b3Bjb2RlKQotCQlicmVhazsKLQkgICAgICB7Ci0JCWJmZF92bWEgdiwgbWFzazsKLQkJbWFzayA9IDB4MWZmZmY7Ci0JCXYgPSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiB+IG1hc2s7Ci0JCWlmICh2KQotCQkgIGFzX2JhZCAoImNhbGwvam1wIHRhcmdldCBvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICB9Ci0JICAgICAgb3Bjb2RlIHw9IEFCU09MVVRFX0JJVCB8Ci0JCShvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweDAwMDNGQzAwKSA8PCA2IHwKLQkJKChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweDAwMDAwM0ZDKSA+PiAyKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ19KVU1QVEFSRzsKLQkgIHRoZV9pbnNuLmV4cCA9ICpvcGVyYW5kOwotCSAgdGhlX2luc24ucGNyZWwgPSAxOwkvKiBBc3N1bWUgUEMtcmVsYXRpdmUganVtcCAqLwotCSAgLyogRklYTUUtU09PTiwgRG8gd2UgZmlndXJlIG91dCB3aGV0aGVyIGFicyBsYXRlciwgYWZ0ZXIKLSAgICAgICAgICAgICBrbm93IHN5bSB2YWw/ICovCi0JICBjb250aW51ZTsKLQotCWNhc2UgJ2UnOgkJLyogQ29wcm9jZXNzb3IgZW5hYmxlIGJpdCBmb3IgTE9BRC9TVE9SRSBpbnNuICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA9PSAwKQotCQljb250aW51ZTsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDEpCi0JCXsKLQkJICBvcGNvZGUgfD0gQ0VfQklUOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnbic6CQkvKiBDb250cm9sIGJpdHMgZm9yIExPQUQvU1RPUkUgaW5zdHJ1Y3Rpb25zICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCi0JICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgMTI4KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTYpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ3MnOgkJLyogU3BlY2lhbCByZWdpc3RlciBudW1iZXIgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wICE9IE9fcmVnaXN0ZXIpCi0JICAgIGJyZWFrOwkJLyogT25seSByZWdpc3RlcnMgKi8KLQkgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBTUkVHKQotCSAgICBicmVhazsJCS8qIE5vdCBhIHNwZWNpYWwgcmVnaXN0ZXIgKi8KLQkgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHhGRikgPDwgODsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAndSc6CQkvKiBVSSBiaXQgb2YgQ09OVkVSVCAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA9PSAxKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IFVJX0JJVDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ3InOgkJLyogUk5EIGJpdHMgb2YgQ09OVkVSVCAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgotCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDgpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnSSc6CQkvKiBJRCBiaXRzIG9mIElOViBhbmQgSVJFVElOVi4gICovCi0JICAvKiBUaGlzIG9wZXJhbmQgaXMgb3B0aW9uYWwuICAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19hYnNlbnQpCi0JICAgIGNvbnRpbnVlOwotCSAgZWxzZSBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICYmIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDQpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDE2OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ2QnOgkJLyogRkQgYml0cyBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCi0JICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgNCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMjsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQotCWNhc2UgJ2YnOgkJLyogRlMgYml0cyBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCi0JICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgNCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoKLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA0KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxNjsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCAxNikKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTg7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIEJBRF9DQVNFICgqYXJncyk7Ci0JfQotICAgICAgLyogVHlwZXMgb3IgdmFsdWVzIG9mIGFyZ3MgZG9uJ3QgbWF0Y2guICAqLwotICAgICAgYXNfYmFkICgiSW52YWxpZCBvcGVyYW5kcyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG1kX2F0b2YgaW4gbTY4ay5jLiAgSSB0aGluayB0aGlzIGlzIHJpZ2h0LAotICAgYnV0IEknbSBub3Qgc3VyZS4KLQotICAgVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotCi0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSI7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBvdXQgYmlnLWVuZGlhbi4KLSAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7CS8qIFJlbWVtYmVyIHZhbHVlIGZvciBlbWl0X3JlbG9jICovCi0KLQotICBrbm93IChmaXhQLT5meF9zaXplID09IDQpOwotICBrbm93IChmaXhQLT5meF9yX3R5cGUgPCBOT19SRUxPQyk7Ci0KLSAgLyogVGhpcyBpcyBhIGhhY2suICBUaGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSRUxPQ19XRElTUDMwICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHsKLSAgICAgIHZhbCArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0gICAgfQotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLQotICAgIGNhc2UgUkVMT0NfMzI6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMjQ7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ184OgotICAgICAgYnVmWzBdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1dESVNQMzA6Ci0gICAgICB2YWwgPSAodmFsID4+PSAyKSArIDE7Ci0gICAgICBidWZbMF0gfD0gKHZhbCA+PiAyNCkgJiAweDNmOwotICAgICAgYnVmWzFdID0gKHZhbCA+PiAxNik7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19ISTIyOgotICAgICAgYnVmWzFdIHw9ICh2YWwgPj4gMjYpICYgMHgzZjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiAxODsKLSAgICAgIGJ1ZlszXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19MTzEwOgotICAgICAgYnVmWzJdIHw9ICh2YWwgPj4gOCkgJiAweDAzOwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0JBU0UxMzoKLSAgICAgIGJ1ZlsyXSB8PSAodmFsID4+IDgpICYgMHgxZjsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19XRElTUDIyOgotICAgICAgdmFsID0gKHZhbCA+Pj0gMikgKyAxOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIFJFTE9DX0JBU0UyMjoKLSAgICAgIGJ1ZlsxXSB8PSAodmFsID4+IDE2KSAmIDB4M2Y7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19KVU1QVEFSRzoJLyogMDBYWDAwWFggcGF0dGVybiBpbiBhIHdvcmQgKi8KLSAgICAgIGlmICghZml4UC0+ZnhfZG9uZSkKLQl7Ci0JICAvKiBUaGUgbGlua2VyIHRyaWVzIHRvIHN1cHBvcnQgYm90aCBBTUQgYW5kIG9sZCBHTlUgc3R5bGUKLSAgICAgICAgICAgICBSX0lSRUwgcmVsb2NzLiAgVGhhdCBtZWFucyB0aGF0IGlmIHRoZSBhZGRlbmQgaXMgZXhhY3RseQotICAgICAgICAgICAgIHRoZSBuZWdhdGl2ZSBvZiB0aGUgYWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24sIHRoZQotICAgICAgICAgICAgIGxpbmtlciB3aWxsIG5vdCBoYW5kbGUgaXQgY29ycmVjdGx5LiAgKi8KLQkgIGlmIChmaXhQLT5meF9wY3JlbAotCSAgICAgICYmIHZhbCAhPSAwCi0JICAgICAgJiYgdmFsID09IC0gKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSkpCi0JICAgIGFzX2JhZF93aGVyZQotCSAgICAgIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCSAgICAgICAidGhlIGxpbmtlciB3aWxsIG5vdCBoYW5kbGUgdGhpcyByZWxvY2F0aW9uIGNvcnJlY3RseSIpOwotCX0KLSAgICAgIGVsc2UgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCXsKLQkgIGxvbmcgdiA9IHZhbCA+PiAxNzsKLQkgIGlmICh2ICE9IDAgJiYgdiAhPSAtMSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAiY2FsbC9qbXAgdGFyZ2V0IG91dCBvZiByYW5nZSIpOwotCX0KLSAgICAgIGVsc2UKLQkvKiB0aGlzIGNhc2Ugd2FzIHN1cHBvc2VkIHRvIGJlIGhhbmRsZWQgaW4gbWFjaGluZV9pcCAqLwotCWFib3J0ICgpOwotICAgICAgYnVmWzFdID0gdmFsID4+IDEwOwkvKiBIb2xkcyBiaXRzIDAwMDNGRkZDIG9mIGFkZHJlc3MgKi8KLSAgICAgIGJ1ZlszXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0NPTlNUOgkJLyogMDBYWDAwWFggcGF0dGVybiBpbiBhIHdvcmQgKi8KLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiA4OwkvKiBIb2xkcyBiaXRzIDAwMDBYWFhYICovCi0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfQ09OU1RIOgkJLyogMDBYWDAwWFggcGF0dGVybiBpbiBhIHdvcmQgKi8KLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAyNDsJLyogSG9sZHMgYml0cyBYWFhYMDAwMCAqLwotICAgICAgYnVmWzNdID0gdmFsID4+IDE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5PX1JFTE9DOgotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImJhZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIpLCBmaXhQLT5meF9yX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jaWZkZWYgT0JKX0NPRkYKLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIHJldHVybiAoUl9XT1JEKTsKLSAgICBjYXNlIFJFTE9DXzg6Ci0gICAgICByZXR1cm4gKFJfQllURSk7Ci0gICAgY2FzZSBSRUxPQ19DT05TVDoKLSAgICAgIHJldHVybiAoUl9JTE9IQUxGKTsKLSAgICBjYXNlIFJFTE9DX0NPTlNUSDoKLSAgICAgIHJldHVybiAoUl9JSElIQUxGKTsKLSAgICBjYXNlIFJFTE9DX0pVTVBUQVJHOgotICAgICAgcmV0dXJuIChSX0lSRUwpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKF8oIm5lZWQgJW8zXG4iKSwgZml4UC0+Znhfcl90eXBlKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0JCQkJLyogc3dpdGNoIG9uIHR5cGUgKi8KLQotICByZXR1cm4gKDApOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgMjlrICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBhc19mYXRhbCAoXygiYTI5a19jb252ZXJ0X2ZyYWdcbiIpKTsKLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgYTI5ayAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWd0eXBlOwotewotICBhc19mYXRhbCAoXygiYTI5a19lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIikpOwotICByZXR1cm4gMDsKLX0KLQotI2lmIDAKLS8qIGZvciBkZWJ1Z2dpbmcgb25seSAqLwotc3RhdGljIHZvaWQKLXByaW50X2luc24gKGluc24pCi0gICAgIHN0cnVjdCBtYWNoaW5lX2l0ICppbnNuOwotewotICBjaGFyICpSZWxvY1tdID0KLSAgewotICAgICJSRUxPQ184IiwKLSAgICAiUkVMT0NfMTYiLAotICAgICJSRUxPQ18zMiIsCi0gICAgIlJFTE9DX0RJU1A4IiwKLSAgICAiUkVMT0NfRElTUDE2IiwKLSAgICAiUkVMT0NfRElTUDMyIiwKLSAgICAiUkVMT0NfV0RJU1AzMCIsCi0gICAgIlJFTE9DX1dESVNQMjIiLAotICAgICJSRUxPQ19ISTIyIiwKLSAgICAiUkVMT0NfMjIiLAotICAgICJSRUxPQ18xMyIsCi0gICAgIlJFTE9DX0xPMTAiLAotICAgICJSRUxPQ19TRkFfQkFTRSIsCi0gICAgIlJFTE9DX1NGQV9PRkYxMyIsCi0gICAgIlJFTE9DX0JBU0UxMCIsCi0gICAgIlJFTE9DX0JBU0UxMyIsCi0gICAgIlJFTE9DX0JBU0UyMiIsCi0gICAgIlJFTE9DX1BDMTAiLAotICAgICJSRUxPQ19QQzIyIiwKLSAgICAiUkVMT0NfSk1QX1RCTCIsCi0gICAgIlJFTE9DX1NFR09GRjE2IiwKLSAgICAiUkVMT0NfR0xPQl9EQVQiLAotICAgICJSRUxPQ19KTVBfU0xPVCIsCi0gICAgIlJFTE9DX1JFTEFUSVZFIiwKLSAgICAiTk9fUkVMT0MiCi0gIH07Ci0KLSAgaWYgKGluc24tPmVycm9yKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiAlc1xuIik7Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJvcGNvZGU9MHglMDh4XG4iLCBpbnNuLT5vcGNvZGUpOwotICBmcHJpbnRmIChzdGRlcnIsICJyZWxvYyA9ICVzXG4iLCBSZWxvY1tpbnNuLT5yZWxvY10pOwotICBmcHJpbnRmIChzdGRlcnIsICJleHAgPSAge1xuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX2FkZF9zeW1ib2wgPSAlc1xuIiwKLQkgICBpbnNuLT5leHAuWF9hZGRfc3ltYm9sID8KLQkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCkgPwotCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA6ICI/Pz8iKSA6ICIwIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX29wX3N5bWJvbCA9ICVzXG4iLAotCSAgIGluc24tPmV4cC5YX29wX3N5bWJvbCA/Ci0JICAgKFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgPwotCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9vcF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX251bWJlciA9ICVkXG4iLAotCSAgIGluc24tPmV4cC5YX2FkZF9udW1iZXIpOwotICBmcHJpbnRmIChzdGRlcnIsICJ9XG4iKTsKLX0KLQotI2VuZGlmCi0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gdGFyZ2V0IGZvcm1hdC4KLQotICAgT24gc3BhcmMvMjlrOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBuZXh0IHRocmVlCi0gICBieXRlcyBhcmUgaW5kZXgsIG1vc3Qgc2lnLiBieXRlIGZpcnN0LiAgQnl0ZSA3IGlzIGJyb2tlbiB1cCB3aXRoCi0gICBiaXQgNyBhcyBleHRlcm5hbCwgYml0cyA2ICYgNSB1bnVzZWQsIGFuZCB0aGUgbG93ZXIKLSAgIGZpdmUgYml0cyBhcyByZWxvY2F0aW9uIHR5cGUuICBOZXh0IDQgYnl0ZXMgYXJlIGxvbmcgYWRkZW5kLiAqLwotLyogVGhhbnggYW5kIGEgdGlwIG9mIHRoZSBoYXQgdG8gTWljaGFlbCBCbG9vbSwgbWJAdHRpZGNhLnR0aS5jb20gKi8KLQotI2lmZGVmIE9CSl9BT1VUCi0KLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9yX3R5cGUgPCBOT19SRUxPQyk7Ci0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs0XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgNykgJiAweDgwKSB8ICgwICYgMHg2MCkgfCAoZml4UC0+Znhfcl90eXBlICYgMHgxRik7Ci0gIC8qIEFsc28gZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCZ3aGVyZVs4XSwgZml4UC0+ZnhfYWRkbnVtYmVyLCA0KTsKLX0KLQotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGxpbmUgaXMgdW5yZWNvZ25pemVkLiAgVGhpcyBpcyB1c2VkIHRvIGhhbmRsZQotICAgZGVmaW5pdGlvbnMgb2YgYTI5ayBzdHlsZSBsb2NhbCBsYWJlbHMuICAqLwotCi1pbnQKLWEyOWtfdW5yZWNvZ25pemVkX2xpbmUgKGMpCi0gICAgIGludCBjOwotewotICBpbnQgbGFiOwotICBjaGFyICpzOwotCi0gIGlmIChjICE9ICckJwotICAgICAgfHwgISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzBdKSkKLSAgICByZXR1cm4gMDsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGxhYiA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotICAgIHsKLSAgICAgIGxhYiA9IGxhYiAqIDEwICsgKnMgLSAnMCc7Ci0gICAgICArK3M7Ci0gICAgfQotCi0gIGlmICgqcyAhPSAnOicpCi0gICAgewotICAgICAgLyogTm90IGEgbGFiZWwgZGVmaW5pdGlvbi4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvbGxhcl9sYWJlbF9kZWZpbmVkIChsYWIpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibGFiZWwgXCIkJWRcIiByZWRlZmluZWQiKSwgbGFiKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBkZWZpbmVfZG9sbGFyX2xhYmVsIChsYWIpOwotICBjb2xvbiAoZG9sbGFyX2xhYmVsX25hbWUgKGxhYiwgMCkpOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzICsgMTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVmYXVsdCB0aGUgdmFsdWVzIG9mIHN5bWJvbHMga25vd24gdGhhdCBzaG91bGQgYmUgInByZWRlZmluZWQiLiAgV2UKLSAgIGRvbid0IGJvdGhlciB0byBwcmVkZWZpbmUgdGhlbSB1bmxlc3MgeW91IGFjdHVhbGx5IHVzZSBvbmUsIHNpbmNlIHRoZXJlCi0gICBhcmUgYSBsb3Qgb2YgdGhlbS4gICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgbG9uZyByZWdudW07Ci0gIGNoYXIgdGVzdGJ1Zls1ICsgLypTTE9QKi8gNV07Ci0KLSAgaWYgKG5hbWVbMF0gPT0gJ2cnIHx8IG5hbWVbMF0gPT0gJ0cnCi0gICAgICB8fCBuYW1lWzBdID09ICdsJyB8fCBuYW1lWzBdID09ICdMJwotICAgICAgfHwgbmFtZVswXSA9PSAncycgfHwgbmFtZVswXSA9PSAnUycpCi0gICAgewotICAgICAgLyogUGVyaGFwcyBhIGdsb2JhbCBvciBsb2NhbCByZWdpc3RlciBuYW1lICovCi0gICAgICBpZiAobmFtZVsxXSA9PSAncicgfHwgbmFtZVsxXSA9PSAnUicpCi0JewotCSAgbG9uZyBtYXhyZWc7Ci0KLQkgIC8qIFBhcnNlIHRoZSBudW1iZXIsIG1ha2Ugc3VyZSBpdCBoYXMgbm8gZXh0cmEgemVyb2VzIG9yCi0JICAgICB0cmFpbGluZyBjaGFycy4gKi8KLQkgIHJlZ251bSA9IGF0b2wgKCZuYW1lWzJdKTsKLQotCSAgaWYgKG5hbWVbMF0gPT0gJ3MnIHx8IG5hbWVbMF0gPT0gJ1MnKQotCSAgICBtYXhyZWcgPSAyNTU7Ci0JICBlbHNlCi0JICAgIG1heHJlZyA9IDEyNzsKLQkgIGlmIChyZWdudW0gPiBtYXhyZWcpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICBzcHJpbnRmICh0ZXN0YnVmLCAiJWxkIiwgcmVnbnVtKTsKLQkgIGlmIChzdHJjbXAgKHRlc3RidWYsICZuYW1lWzJdKSAhPSAwKQotCSAgICByZXR1cm4gTlVMTDsJLyogZ3IwMDcgb3IgbHI3Zm9vIG9yIHdoYXRldmVyICovCi0KLQkgIC8qIFdlIGhhdmUgYSB3aWVuZXIhICBEZWZpbmUgYW5kIHJldHVybiBhIG5ldyBzeW1ib2wgZm9yIGl0LiAgKi8KLQkgIGlmIChuYW1lWzBdID09ICdsJyB8fCBuYW1lWzBdID09ICdMJykKLQkgICAgcmVnbnVtICs9IDEyODsKLQkgIGVsc2UgaWYgKG5hbWVbMF0gPT0gJ3MnIHx8IG5hbWVbMF0gPT0gJ1MnKQotCSAgICByZWdudW0gKz0gU1JFRzsKLQkgIHJldHVybiAoc3ltYm9sX25ldyAobmFtZSwgU0VHX1JFR0lTVEVSLCAodmFsdWVUKSByZWdudW0sCi0JCQkgICAgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBQYXJzZSBhbiBvcGVyYW5kIHRoYXQgaXMgbWFjaGluZS1zcGVjaWZpYy4gICovCi0KLXZvaWQKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJScgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICclJykKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgbnVtZXJpYyByZWdpc3RlciBleHByZXNzaW9uLiAgTm8gYmlnZ3kuICAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7CS8qIFNraXAgJSUgKi8KLSAgICAgICh2b2lkKSBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgIT0gT19jb25zdGFudAotCSAgfHwgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA+IDI1NSkKLQlhc19iYWQgKF8oIkludmFsaWQgZXhwcmVzc2lvbiBhZnRlciAlJSUlXG4iKSk7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgfQotICBlbHNlIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJyYnKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSB0YWtpbmcgdGhlICdhZGRyZXNzJyBvZiBhIHJlZ2lzdGVyLi4udGhpcyBvbmUgaXMgbm90Ci0JIGluIHRoZSBtYW51YWwsIGJ1dCBpdCAqaXMqIGluIHRyYXBzL2Zwc3ltYm9sLmghICBXaGF0IHRoZXkKLQkgc2VlbSB0byB3YW50IGlzIHRoZSByZWdpc3RlciBudW1iZXIsIGFzIGFuIGFic29sdXRlIG51bWJlci4gICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJLyogU2tpcCAmICovCi0gICAgICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX29wICE9IE9fcmVnaXN0ZXIpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGluICYgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGVsc2UKLQlleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJyQnCi0JICAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclsxXSkpCi0gICAgewotICAgICAgbG9uZyBsYWI7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgc3ltYm9sUyAqc3ltOwotCi0gICAgICAvKiBUaGlzIGlzIGEgbG9jYWwgbGFiZWwuICAqLwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBsYWIgPSAobG9uZykgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKGxhYikpCi0JewotCSAgbmFtZSA9IGRvbGxhcl9sYWJlbF9uYW1lIChsYWIsIDApOwotCSAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gZG9sbGFyX2xhYmVsX25hbWUgKGxhYiwgMSk7Ci0JICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQl9Ci0KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJyQnKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyIHR5cGU7Ci0gICAgICBpbnQgZmllbGRudW0sIGZpZWxkbGltaXQ7Ci0gICAgICBMSVRUTEVOVU1fVFlQRSBmbG9hdGJ1Zls4XTsKLQotICAgICAgLyogJGZsb2F0KCksICRkb3VibGVOKCksIG9yICRleHRlbmROKCkgY29udmVydCBmbG9hdGluZyB2YWx1ZXMKLQkgdG8gaW50ZWdlcnMuICAqLwotCi0gICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICArK3M7Ci0KLSAgICAgIGZpZWxkbnVtID0gMDsKLSAgICAgIGlmIChzdHJuY21wIChzLCAiZG91YmxlIiwgc2l6ZW9mICJkb3VibGUiIC0gMSkgPT0gMCkKLQl7Ci0JICBzICs9IHNpemVvZiAiZG91YmxlIiAtIDE7Ci0JICB0eXBlID0gJ2QnOwotCSAgZmllbGRsaW1pdCA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImZsb2F0Iiwgc2l6ZW9mICJmbG9hdCIgLSAxKSA9PSAwKQotCXsKLQkgIHMgKz0gc2l6ZW9mICJmbG9hdCIgLSAxOwotCSAgdHlwZSA9ICdmJzsKLQkgIGZpZWxkbGltaXQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHMsICJleHRlbmQiLCBzaXplb2YgImV4dGVuZCIgLSAxKSA9PSAwKQotCXsKLQkgIHMgKz0gc2l6ZW9mICJleHRlbmQiIC0gMTsKLQkgIHR5cGUgPSAneCc7Ci0JICBmaWVsZGxpbWl0ID0gNDsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChpc2RpZ2l0ICgqcykpCi0JewotCSAgZmllbGRudW0gPSAqcyAtICcwJzsKLQkgICsrczsKLQl9Ci0gICAgICBpZiAoZmllbGRudW0gPj0gZmllbGRsaW1pdCkKLQlyZXR1cm47Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqcyAhPSAnKCcpCi0JcmV0dXJuOwotICAgICAgKytzOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBzID0gYXRvZl9pZWVlIChzLCB0eXBlLCBmbG9hdGJ1Zik7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXJldHVybjsKLSAgICAgIHMgPSBzOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKnMgIT0gJyknKQotCXJldHVybjsKLSAgICAgICsrczsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsgCi0gICAgICBleHByZXNzaW9uUC0+WF91bnNpZ25lZCA9IDE7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gKChmbG9hdGJ1ZltmaWVsZG51bSAqIDJdCi0JCQkJICAgIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkJCQkgICArIGZsb2F0YnVmW2ZpZWxkbnVtICogMiArIDFdKTsKLSAgICB9Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIDI5MDAwLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiwKLSAgIHdoaWNoIHdlIGhhdmUgc2V0IHVwIGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXh1cCB0b28uICAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLyogZW5kIG9mIHRjLWEyOWsuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hMjlrLmggYi9nYXMvY29uZmlnL3RjLWEyOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwZjYwNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWEyOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIHRjLWEyOWsuaCAtLSBBc3NlbWJsZSBmb3IgdGhlIEFNRCAyOTAwMC4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX0EyOUsKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkxCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIExFWF9ET0xMQVIgMQotCi0jZGVmaW5lIHRjX3VucmVjb2duaXplZF9saW5lKGMpIGEyOWtfdW5yZWNvZ25pemVkX2xpbmUgKGMpCi1leHRlcm4gaW50IGEyOWtfdW5yZWNvZ25pemVkX2xpbmUgUEFSQU1TICgoaW50KSk7Ci0KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQk7CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJOwkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJOwkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2soYSkJOwkvKiBub3QgdXNlZCAqLwotCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMTAxCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeF9wdHIpIHRjX2NvZmZfZml4MnJ0eXBlKGZpeF9wdHIpCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX2EyOWsKLSNkZWZpbmUgQ09GRl9NQUdJQyBTSVBGQk9NQUdJQwotLyogU2hvdWxkIHRoZSByZWxvYyBiZSBvdXRwdXQgPwotCW9uIHRoZSAyOWssIHRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoZXJlIGlzIGEgc3ltYm9sIGF0dGF0Y2hlZC4KLQlvbiB0aGUgaDgsIHRoaXMgaXMgYWxsd2F5cyB0cnVlLCBzaW5jZSBubyBmaXh1cCBpcyBkb25lCi0qLwotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoeC0+ZnhfYWRkc3kpCi0jZGVmaW5lIFRDX0NPTlNfUkVMT0MgUkVMT0NfMzIKLQotI2RlZmluZSBDT0ZGX0ZMQUdTIEZfQVIzMlcKLSNkZWZpbmUgcmVsb2NfdHlwZSBpbnQKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLQotI2RlZmluZSBaRVJPX0JBU0VEX1NFR01FTlRTCi0KLS8qIGVuZCBvZiB0Yy1hMjlrLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYWxwaGEuYyBiL2dhcy9jb25maWcvdGMtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkYmE0Yi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjU1ICswLDAgQEAKLS8qIHRjLWFscGhhLmMgLSBQcm9jZXNzb3Itc3BlY2lmaWMgY29kZSBmb3IgdGhlIERFQyBBbHBoYSBBWFAgQ1BVLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5My05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LCAxOTkzLgotICAgV3JpdHRlbiBieSBBbGVzc2FuZHJvIEZvcmluLCBiYXNlZCBvbiBlYXJsaWVyIGdhcy0xLjM4IHRhcmdldCBDUFUgZmlsZXMuCi0gICBNb2RpZmllZCBieSBLZW4gUmFlYnVybiBmb3IgZ2FzLTIueCBhbmQgRUNPRkYgc3VwcG9ydC4KLSAgIE1vZGlmaWVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIGZvciBFTEYgc3VwcG9ydC4KLSAgIE1vZGlmaWVkIGJ5IEtsYXVzIEsiYW1wZiBmb3IgRVZBWCAoT3BlblZNUy9BbHBoYSkgc3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIE1hY2ggT3BlcmF0aW5nIFN5c3RlbQotICogQ29weXJpZ2h0IChjKSAxOTkzIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZQotICogc29mdHdhcmUsIGRlcml2YXRpdmUgd29ya3Mgb3IgbW9kaWZpZWQgdmVyc2lvbnMsIGFuZCBhbnkgcG9ydGlvbnMKLSAqIHRoZXJlb2YsIGFuZCB0aGF0IGJvdGggbm90aWNlcyBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBBTExPV1MgRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMKLSAqIENPTkRJVElPTi4gIENBUk5FR0lFIE1FTExPTiBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBPRiBBTlkgS0lORCBGT1IKLSAqIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqIENhcm5lZ2llIE1lbGxvbiByZXF1ZXN0cyB1c2VycyBvZiB0aGlzIHNvZnR3YXJlIHRvIHJldHVybiB0bwotICoKLSAqICBTb2Z0d2FyZSBEaXN0cmlidXRpb24gQ29vcmRpbmF0b3IgIG9yICBTb2Z0d2FyZS5EaXN0cmlidXRpb25AQ1MuQ01VLkVEVQotICogIFNjaG9vbCBvZiBDb21wdXRlciBTY2llbmNlCi0gKiAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICBQaXR0c2J1cmdoIFBBIDE1MjEzLTM4OTAKLSAqCi0gKiBhbnkgaW1wcm92ZW1lbnRzIG9yIGV4dGVuc2lvbnMgdGhhdCB0aGV5IG1ha2UgYW5kIGdyYW50IENhcm5lZ2llIHRoZQotICogcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSB0aGVzZSBjaGFuZ2VzLgotICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJzdHJ1Yy1zeW1ib2wuaCIKLSNpbmNsdWRlICJlY29mZi5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL2FscGhhLmgiCi0KLSNpZmRlZiBPQkpfRUxGCi0jaW5jbHVkZSAiZWxmL2FscGhhLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLQwKLS8qIExvY2FsIHR5cGVzICovCi0KLSNkZWZpbmUgVE9LRU5JWkVfRVJST1IgLTEKLSNkZWZpbmUgVE9LRU5JWkVfRVJST1JfUkVQT1JUIC0yCi0KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTIDIKLSNkZWZpbmUgTUFYX0lOU05fQVJHUyA1Ci0KLXN0cnVjdCBhbHBoYV9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXN0cnVjdCBhbHBoYV9pbnNuCi17Ci0gIHVuc2lnbmVkIGluc247Ci0gIGludCBuZml4dXBzOwotICBzdHJ1Y3QgYWxwaGFfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci0gIHVuc2lnbmVkIHNlcXVlbmNlW01BWF9JTlNOX0ZJWFVQU107Ci19OwotCi1lbnVtIGFscGhhX21hY3JvX2FyZwotewotICBNQUNST19FT0EgPSAxLAotICBNQUNST19JUiwKLSAgTUFDUk9fUElSLAotICBNQUNST19PUElSLAotICBNQUNST19DUElSLAotICBNQUNST19GUFIsCi0gIE1BQ1JPX0VYUCwKLSAgTUFDUk9fTElURVJBTCwKLSAgTUFDUk9fQkFTRSwKLSAgTUFDUk9fQllUT0ZGLAotICBNQUNST19KU1IKLX07Ci0KLXN0cnVjdCBhbHBoYV9tYWNybwotewotICBjb25zdCBjaGFyICpuYW1lOwotICB2b2lkICgqZW1pdCkgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLSAgY29uc3QgUFRSIGFyZzsKLSAgZW51bSBhbHBoYV9tYWNyb19hcmcgYXJnc2V0c1sxNl07Ci19OwotCi0vKiBFeHRyYSBleHByZXNzaW9uIHR5cGVzLiAqLwotCi0jZGVmaW5lIE9fcHJlZ2lzdGVyCU9fbWQxCS8qIE9fcmVnaXN0ZXIsIGluIHBhcmVudGhlc2VzICovCi0jZGVmaW5lIE9fY3ByZWdpc3RlcglPX21kMgkvKiArIGEgbGVhZGluZyBjb21tYSAqLwotCi0jaWZkZWYgUkVMT0NfT1BfUAotLyogTm90ZSwgdGhlIGFscGhhX3JlbG9jX29wIHRhYmxlIGJlbG93IGRlcGVuZHMgb24gdGhlIG9yZGVyaW5nCi0gICBvZiBPX2xpdGVyYWwgLi4gT19ncHJlbG93LiAgKi8KLSNkZWZpbmUgT19saXRlcmFsCU9fbWQzCS8qICFsaXRlcmFsIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgT19saXR1c2VfYmFzZQlPX21kNAkvKiAhbGl0dXNlX2Jhc2UgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBPX2xpdHVzZV9ieXRvZmYJT19tZDUJLyogIWxpdHVzZV9ieXRvZmYgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBPX2xpdHVzZV9qc3IJT19tZDYJLyogIWxpdHVzZV9qc3IgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBPX2dwZGlzcAlPX21kNwkvKiAhZ3BkaXNwIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgT19ncHJlbGhpZ2gJT19tZDgJLyogIWdwcmVsaGlnaCByZWxvY2F0aW9uICovCi0jZGVmaW5lIE9fZ3ByZWxsb3cJT19tZDkJLyogIWdwcmVsbG93IHJlbG9jYXRpb24gKi8KLQotI2RlZmluZSBVU0VSX1JFTE9DX1AoUikgKChSKSA+PSBPX2xpdGVyYWwgJiYgKFIpIDw9IE9fZ3ByZWxsb3cpCi0jZW5kaWYKLQotCi0vKiBNYWNyb3MgZm9yIGV4dHJhY3RpbmcgdGhlIHR5cGUgYW5kIG51bWJlciBvZiBlbmNvZGVkIHJlZ2lzdGVyIHRva2VucyAqLwotCi0jZGVmaW5lIGlzX2lyX251bSh4KQkJKCgoeCkgJiAzMikgPT0gMCkKLSNkZWZpbmUgaXNfZnByX251bSh4KQkJKCgoeCkgJiAzMikgIT0gMCkKLSNkZWZpbmUgcmVnbm8oeCkJCSgoeCkgJiAzMSkKLQotLyogU29tZXRoaW5nIG9kZCBpbmhlcml0ZWQgZnJvbSB0aGUgb2xkIGFzc2VtYmxlciAqLwotCi0jZGVmaW5lIG5vdGVfZ3ByZWcoUikJCShhbHBoYV9ncHJtYXNrIHw9ICgxIDw8IChSKSkpCi0jZGVmaW5lIG5vdGVfZnByZWcoUikJCShhbHBoYV9mcHJtYXNrIHw9ICgxIDw8IChSKSkpCi0KLS8qIFByZWRpY2F0ZXMgZm9yIDE2LSBhbmQgMzItYml0IHJhbmdlcyAqLwotLyogWFhYOiBUaGUgbm9uLXNoaWZ0IHZlcnNpb24gYXBwZWFycyB0byB0cmlnZ2VyIGEgY29tcGlsZXIgYnVnIHdoZW4KLSAgIGNyb3NzLWFzc2VtYmxpbmcgZnJvbSB4ODYgdy8gZ2NjIDIuNy4yLiAgKi8KLQotI2lmIDEKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzE2KHgpIFwKLQkoKChvZmZzZXRUKSh4KSA+PiAxNSkgPT0gMCB8fCAoKG9mZnNldFQpKHgpID4+IDE1KSA9PSAtMSkKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzMyKHgpIFwKLQkoKChvZmZzZXRUKSh4KSA+PiAzMSkgPT0gMCB8fCAoKG9mZnNldFQpKHgpID4+IDMxKSA9PSAtMSkKLSNlbHNlCi0jZGVmaW5lIHJhbmdlX3NpZ25lZF8xNih4KQkoKG9mZnNldFQpKHgpID49IC0ob2Zmc2V0VCkweDgwMDAgJiYJXAotCQkJCSAob2Zmc2V0VCkoeCkgPD0gIChvZmZzZXRUKTB4N0ZGRikKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzMyKHgpCSgob2Zmc2V0VCkoeCkgPj0gLShvZmZzZXRUKTB4ODAwMDAwMDAgJiYgXAotCQkJCSAob2Zmc2V0VCkoeCkgPD0gIChvZmZzZXRUKTB4N0ZGRkZGRkYpCi0jZW5kaWYKLQotLyogTWFjcm9zIGZvciBzaWduIGV4dGVuZGluZyBmcm9tIDE2LSBhbmQgMzItYml0cy4gICovCi0vKiBYWFg6IFRoZSBjYXN0IG1hY3JvcyB3aWxsIHdvcmsgb24gYWxsIHRoZSBzeXN0ZW1zIHRoYXQgSSBjYXJlIGFib3V0LAotICAgYnV0IHJlYWxseSBhIHByZWRpY2F0ZSBzaG91bGQgYmUgZm91bmQgdG8gdXNlIHRoZSBub24tY2FzdCBmb3Jtcy4gICovCi0KLSNpZiAxCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzE2KHgpCSgoc2hvcnQpKHgpKQotI2RlZmluZSBzaWduX2V4dGVuZF8zMih4KQkoKGludCkoeCkpCi0jZWxzZQotI2RlZmluZSBzaWduX2V4dGVuZF8xNih4KQkoKG9mZnNldFQpKCgoeCkgJiAweEZGRkYpIF4gMHg4MDAwKSAtIDB4ODAwMCkKLSNkZWZpbmUgc2lnbl9leHRlbmRfMzIoeCkJKChvZmZzZXRUKSgoKHgpICYgMHhGRkZGRkZGRikgXAotCQkJCQkgICBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkKLSNlbmRpZgotCi0vKiBNYWNyb3MgdG8gYnVpbGQgdG9rZW5zICovCi0KLSNkZWZpbmUgc2V0X3Rva19yZWcodCwgcikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fcmVnaXN0ZXIsCQkJXAotCQkJCSAodCkuWF9hZGRfbnVtYmVyID0gKHIpKQotI2RlZmluZSBzZXRfdG9rX3ByZWcodCwgcikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fcHJlZ2lzdGVyLAkJXAotCQkJCSAodCkuWF9hZGRfbnVtYmVyID0gKHIpKQotI2RlZmluZSBzZXRfdG9rX2NwcmVnKHQsIHIpCShtZW1zZXQoJih0KSwgMCwgc2l6ZW9mKHQpKSwJCVwKLQkJCQkgKHQpLlhfb3AgPSBPX2NwcmVnaXN0ZXIsCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfZnJlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19yZWdpc3RlciwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikrMzIpCi0jZGVmaW5lIHNldF90b2tfc3ltKHQsIHMsIGEpCShtZW1zZXQoJih0KSwgMCwgc2l6ZW9mKHQpKSwJCVwKLQkJCQkgKHQpLlhfb3AgPSBPX3N5bWJvbCwJCQlcCi0JCQkJICh0KS5YX2FkZF9zeW1ib2wgPSAocyksCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAoYSkpCi0jZGVmaW5lIHNldF90b2tfY29uc3QodCwgbikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fY29uc3RhbnQsCQkJXAotCQkJCSAodCkuWF9hZGRfbnVtYmVyID0gKG4pKQotCi0MCi0vKiBQcm90b3R5cGVzIGZvciBhbGwgbG9jYWwgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBpbnQgdG9rZW5pemVfYXJndW1lbnRzIFBBUkFNUyAoKGNoYXIgKiwgZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqZmluZF9vcGNvZGVfbWF0Y2gKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQgKiwgaW50ICopKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKmZpbmRfbWFjcm9fbWF0Y2gKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X29wZXJhbmQKLSAgUEFSQU1TICgodW5zaWduZWQsIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICosIG9mZnNldFQsIGNoYXIgKiwgdW5zaWduZWQpKTsKLXN0YXRpYyB2b2lkIGFzc2VtYmxlX2luc24KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsCi0JICAgc3RydWN0IGFscGhhX2luc24gKikpOwotc3RhdGljIHZvaWQgZW1pdF9pbnNuIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9pbnNuICopKTsKLXN0YXRpYyB2b2lkIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBzdHJ1Y3QgYWxwaGFfaW5zbiAqKSk7Ci1zdGF0aWMgdm9pZCBhc3NlbWJsZV90b2tlbnMKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50IGxvYWRfZXhwcmVzc2lvbgotICBQQVJBTVMgKChpbnQsIGNvbnN0IGV4cHJlc3Npb25TICosIGludCAqLCBleHByZXNzaW9uUyAqLAotCSAgIGNvbnN0IGV4cHJlc3Npb25TICopKTsKLQotc3RhdGljIHZvaWQgZW1pdF9sZGdwIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2RpdmlzaW9uIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkYSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZGFoIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2lyX2xvYWQgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbG9hZHN0b3JlIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2pzcmptcCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbGRYdSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF91bGRYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VsZFh1IFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkaWwgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc3RYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VzdFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc2V4dFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfcmV0amNyIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkIHNfYWxwaGFfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc19hbHBoYV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9yZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHZvaWQgc19hbHBoYV9zZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZW50IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9lbmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX21hc2sgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2ZyYW1lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9sb2d1ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfY29mZl93cmFwcGVyIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgc19hbHBoYV9ncHJlbDMyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2Jhc2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc3BhY2UgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyB2b2lkIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWdUICosIHN5bWJvbFMgKiopKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc2VsZWN0X2dwX3ZhbHVlIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgYWxwaGFfYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIHN5bWJvbFMgKiwgaW50KSk7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi1zdGF0aWMgdm9pZCBhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0jZW5kaWYKLQotDAotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsCi0gICB0YXJnZXRzLiAgKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEKLSAgIHNpbmdsZSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsCi0gICBhcyBpbiAwZDEuMC4gICovCi0jaWYgMAotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0jZWxzZQotLyogWFhYOiBEbyBhbGwgb2YgdGhlc2UgcmVhbGx5IGdldCB1c2VkIG9uIHRoZSBhbHBoYT8/ICAqLwotY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRVZBWAotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkZtOmcrMWg6SEc6IjsKLSNlbHNlCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiRm06Z0c6IjsKLSNlbmRpZgotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl8zMkFERFIgKE9QVElPTl9NRF9CQVNFKQotICB7ICIzMmFkZHIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzMyQUREUiB9LAotI2RlZmluZSBPUFRJT05fUkVMQVggKE9QVElPTl8zMkFERFIrMSkKLSAgeyAicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYIH0sCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBPUFRJT05fTURFQlVHIChPUFRJT05fUkVMQVgrMSkKLSNkZWZpbmUgT1BUSU9OX05PX01ERUJVRyAoT1BUSU9OX01ERUJVRysxKQotICB7ICJtZGVidWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01ERUJVRyB9LAotICB7ICJuby1tZGVidWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX01ERUJVRyB9LAotI2VuZGlmCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDAgfQotfTsKLQotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi0MCi0jaWZkZWYgT0JKX0VWQVgKLSNkZWZpbmUgQVhQX1JFR19SMCAgICAgMAotI2RlZmluZSBBWFBfUkVHX1IxNiAgICAxNgotI2RlZmluZSBBWFBfUkVHX1IxNyAgICAxNwotI3VuZGVmIEFYUF9SRUdfVDkKLSNkZWZpbmUgQVhQX1JFR19UOSAgICAgMjIKLSN1bmRlZiBBWFBfUkVHX1QxMAotI2RlZmluZSBBWFBfUkVHX1QxMCAgICAyMwotI3VuZGVmIEFYUF9SRUdfVDExCi0jZGVmaW5lIEFYUF9SRUdfVDExICAgIDI0Ci0jdW5kZWYgQVhQX1JFR19UMTIKLSNkZWZpbmUgQVhQX1JFR19UMTIgICAgMjUKLSNkZWZpbmUgQVhQX1JFR19BSSAgICAgMjUKLSN1bmRlZiBBWFBfUkVHX0ZQCi0jZGVmaW5lIEFYUF9SRUdfRlAgICAgIDI5Ci0KLSN1bmRlZiBBWFBfUkVHX0dQCi0jZGVmaW5lIEFYUF9SRUdfR1AgQVhQX1JFR19QVgotI2VuZGlmIC8qIE9CSl9FVkFYICAqLwotCi0vKiBUaGUgY3B1IGZvciB3aGljaCB3ZSBhcmUgZ2VuZXJhdGluZyBjb2RlICovCi1zdGF0aWMgdW5zaWduZWQgYWxwaGFfdGFyZ2V0ID0gQVhQX09QQ09ERV9CQVNFOwotc3RhdGljIGNvbnN0IGNoYXIgKmFscGhhX3RhcmdldF9uYW1lID0gIjxhbGw+IjsKLQotLyogVGhlIGhhc2ggdGFibGUgb2YgaW5zdHJ1Y3Rpb24gb3Bjb2RlcyAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFscGhhX29wY29kZV9oYXNoOwotCi0vKiBUaGUgaGFzaCB0YWJsZSBvZiBtYWNybyBvcGNvZGVzICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYWxwaGFfbWFjcm9faGFzaDsKLQotI2lmZGVmIE9CSl9FQ09GRgotLyogVGhlICRncCByZWxvY2F0aW9uIHN5bWJvbCAqLwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2dwX3N5bWJvbDsKLQotLyogWFhYOiB3aGF0IGlzIHRoaXMsIGFuZCB3aHkgaXMgaXQgZXhwb3J0ZWQ/ICovCi12YWx1ZVQgYWxwaGFfZ3BfdmFsdWU7Ci0jZW5kaWYKLQotLyogVGhlIGN1cnJlbnQgJGdwIHJlZ2lzdGVyICovCi1zdGF0aWMgaW50IGFscGhhX2dwX3JlZ2lzdGVyID0gQVhQX1JFR19HUDsKLQotLyogQSB0YWJsZSBvZiB0aGUgcmVnaXN0ZXIgc3ltYm9scyAqLwotc3RhdGljIHN5bWJvbFMgKmFscGhhX3JlZ2lzdGVyX3RhYmxlWzY0XTsKLQotLyogQ29uc3RhbnQgc2VjdGlvbnMsIG9yIHNlY3Rpb25zIG9mIGNvbnN0YW50cyAqLwotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHNlZ1QgYWxwaGFfbGl0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgYWxwaGFfbGl0NF9zZWN0aW9uOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyBzZWdUIGFscGhhX2xpbmtfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIGFscGhhX2N0b3JzX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBhbHBoYV9kdG9yc19zZWN0aW9uOwotI2VuZGlmCi1zdGF0aWMgc2VnVCBhbHBoYV9saXQ4X3NlY3Rpb247Ci0KLS8qIFN5bWJvbHMgcmVmZXJyaW5nIHRvIHNhaWQgc2VjdGlvbnMuICovCi0jaWZkZWYgT0JKX0VDT0ZGCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfbGl0YV9zeW1ib2w7Ci1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfbGl0NF9zeW1ib2w7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRVZBWAotc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpbmtfc3ltYm9sOwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2N0b3JzX3N5bWJvbDsKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9kdG9yc19zeW1ib2w7Ci0jZW5kaWYKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9saXQ4X3N5bWJvbDsKLQotLyogTGl0ZXJhbCBmb3IgLmxpdFgrMHg4MDAwIHdpdGhpbiAubGl0YSAqLwotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIG9mZnNldFQgYWxwaGFfbGl0NF9saXRlcmFsOwotc3RhdGljIG9mZnNldFQgYWxwaGFfbGl0OF9saXRlcmFsOwotI2VuZGlmCi0KLS8qIFRoZSBhY3RpdmUgLmVudCBzeW1ib2wuICAqLwotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9jdXJfZW50X3N5bTsKLSNlbmRpZgotCi0vKiBJcyB0aGUgYXNzZW1ibGVyIG5vdCBhbGxvd2VkIHRvIHVzZSAkYXQ/ICovCi1zdGF0aWMgaW50IGFscGhhX25vYXRfb24gPSAwOwotCi0vKiBBcmUgbWFjcm9zIGVuYWJsZWQ/ICovCi1zdGF0aWMgaW50IGFscGhhX21hY3Jvc19vbiA9IDE7Ci0KLS8qIEFyZSBmbG9hdHMgZGlzYWJsZWQ/ICovCi1zdGF0aWMgaW50IGFscGhhX25vZmxvYXRzX29uID0gMDsKLQotLyogQXJlIGFkZHJlc3NlcyAzMiBiaXQ/ICovCi1zdGF0aWMgaW50IGFscGhhX2FkZHIzMl9vbiA9IDA7Ci0KLS8qIFN5bWJvbCBsYWJlbGxpbmcgdGhlIGN1cnJlbnQgaW5zbi4gIFdoZW4gdGhlIEFscGhhIGdhcyBzZWVzCi0gICAgIGZvbzoKLSAgICAgICAucXVhZCAwCi0gICBhbmQgdGhlIHNlY3Rpb24gaGFwcGVucyB0byBub3QgYmUgb24gYW4gZWlnaHQgYnl0ZSBib3VuZGFyeSwgaXQKLSAgIHdpbGwgYWxpZ24gYm90aCB0aGUgc3ltYm9sIGFuZCB0aGUgLnF1YWQgdG8gYW4gZWlnaHQgYnl0ZSBib3VuZGFyeS4gICovCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfaW5zbl9sYWJlbDsKLQotLyogV2hldGhlciB3ZSBzaG91bGQgYXV0b21hdGljYWxseSBhbGlnbiBkYXRhIGdlbmVyYXRpb24gcHNldWRvLW9wcy4KLSAgIC5hbGlnbiAwIHdpbGwgdHVybiB0aGlzIG9mZi4gICovCi1zdGF0aWMgaW50IGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotCi0vKiBUaGUga25vd24gY3VycmVudCBhbGlnbm1lbnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50IGFscGhhX2N1cnJlbnRfYWxpZ247Ci0KLS8qIFRoZXNlIGFyZSBleHBvcnRlZCB0byBFQ09GRiBjb2RlLiAgKi8KLXVuc2lnbmVkIGxvbmcgYWxwaGFfZ3BybWFzaywgYWxwaGFfZnBybWFzazsKLQotLyogV2hldGhlciB0aGUgZGVidWdnaW5nIG9wdGlvbiB3YXMgc2Vlbi4gICovCi1zdGF0aWMgaW50IGFscGhhX2RlYnVnOwotCi0jaWZkZWYgT0JKX0VMRgotLyogV2hldGhlciB3ZSBhcmUgZW1pdHRpbmcgYW4gbWRlYnVnIHNlY3Rpb24uICAqLwotaW50IGFscGhhX2ZsYWdfbWRlYnVnID0gMTsKLSNlbmRpZgotCi0vKiBEb24ndCBmdWxseSByZXNvbHZlIHJlbG9jYXRpb25zLCBhbGxvd2luZyBjb2RlIG1vdmVtZW50IGluIHRoZSBsaW5rZXIuICAqLwotc3RhdGljIGludCBhbHBoYV9mbGFnX3JlbGF4OwotCi0vKiBXaGF0IHZhbHVlIHRvIGdpdmUgdG8gYmZkX3NldF9ncF9zaXplLiAgKi8KLXN0YXRpYyBpbnQgZ19zd2l0Y2hfdmFsdWUgPSA4OwotCi0jaWZkZWYgT0JKX0VWQVgKLS8qIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBwcm9jZWR1cmUgaGVyZS4gICovCi1zdGF0aWMgc3RydWN0IHsKLSAgc3ltYm9sUyAqc3ltYm9sOwkvKiBwcm9jIHBkZXNjIHN5bWJvbCAqLwotICBpbnQgcGRzY2tpbmQ7Ci0gIGludCBmcmFtZXJlZzsJCS8qIHJlZ2lzdGVyIGZvciBmcmFtZSBwb2ludGVyICovCi0gIGludCBmcmFtZXNpemU7CS8qIHNpemUgb2YgZnJhbWUgKi8KLSAgaW50IHJzYV9vZmZzZXQ7Ci0gIGludCByYV9zYXZlOwotICBpbnQgZnBfc2F2ZTsKLSAgbG9uZyBpbWFzazsKLSAgbG9uZyBmbWFzazsKLSAgaW50IHR5cGU7Ci0gIGludCBwcm9sb2d1ZTsKLX0gYWxwaGFfZXZheF9wcm9jOwotCi1zdGF0aWMgaW50IGFscGhhX2ZsYWdfaGFzaF9sb25nX25hbWVzID0gMDsJCS8qIC0rICovCi1zdGF0aWMgaW50IGFscGhhX2ZsYWdfc2hvd19hZnRlcl90cnVuYyA9IDA7CQkvKiAtSCAqLwotCi0vKiBJZiB0aGUgLSsgc3dpdGNoIGlzIGdpdmVuLCB0aGVuIGEgaGFzaCBpcyBhcHBlbmRlZCB0byBhbnkgbmFtZSB0aGF0IGlzCi0gKiBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzLCBlbHNlIGxvbmdlciBzeW1ib2wgbmFtZXMgYXJlIHRydW5jYXRlZC4KLSAqLwotCi0jZW5kaWYKLQwKLSNpZmRlZiBSRUxPQ19PUF9QCi0vKiBBIHRhYmxlIHRvIG1hcCB0aGUgc3BlbGxpbmcgb2YgYSByZWxvY2F0aW9uIG9wZXJhbmQgaW50byBhbiBhcHByb3ByaWF0ZQotICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHR5cGUuICBUaGUgdGFibGUgaXMgYXNzdW1lZCB0byBiZSBvcmRlcmVkIHN1Y2gKLSAgIHRoYXQgb3AtT19saXRlcmFsIGluZGV4ZXMgaW50byBpdC4gICovCi0KLSNkZWZpbmUgQUxQSEFfUkVMT0NfVEFCTEUob3ApCQkJCQkJXAotJmFscGhhX3JlbG9jX29wWyAoKCFVU0VSX1JFTE9DX1AgKG9wKSkJCQkJCVwKLQkJICA/IChhYm9ydCAoKSwgMCkJCQkJCVwKLQkJICA6IChpbnQpKG9wKSAtIChpbnQpT19saXRlcmFsKSBdCi0KLSNkZWZpbmUgTElUVVNFX0JBU0UJMQotI2RlZmluZSBMSVRVU0VfQllUT0ZGCTIKLSNkZWZpbmUgTElUVVNFX0pTUgkzCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnIHsKLSAgY29uc3QgY2hhciAqbmFtZTsJCQkJLyogc3RyaW5nIHRvIGxvb2t1cCAqLwotICBzaXplX3QgbGVuZ3RoOwkJCQkvKiBzaXplIG9mIHRoZSBzdHJpbmcgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwkJLyogcmVsb2NhdGlvbiBiZWZvcmUgZnJvYiAqLwotICBvcGVyYXRvclQgb3A7CQkJCQkvKiB3aGljaCBvcGVyYXRvciB0byB1c2UgKi8KLSAgaW50IGxpdHVzZTsJCQkJCS8qIGFkZGVuZWQgdG8gc3BlY2lmeSBsaXR1c2UgKi8KLX0gYWxwaGFfcmVsb2Nfb3BbXSA9IHsKLQotICB7Ci0gICAgImxpdGVyYWwiLAkJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImxpdGVyYWwiKS0xLAkJCS8qIGxlbmd0aCAqLwotICAgIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwsCQkvKiByZWxvYyAqLwotICAgIE9fbGl0ZXJhbCwJCQkJCS8qIG9wICovCi0gICAgMCwJCQkJCQkvKiBsaXR1c2UgKi8KLSAgfSwKLQotICB7Ci0gICAgImxpdHVzZV9iYXNlIiwJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImxpdHVzZV9iYXNlIiktMSwJCQkvKiBsZW5ndGggKi8KLSAgICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRSwJCS8qIHJlbG9jICovCi0gICAgT19saXR1c2VfYmFzZSwJCQkJLyogb3AgKi8KLSAgICBMSVRVU0VfQkFTRSwJCQkJLyogbGl0dXNlICovCi0gIH0sCi0KLSAgewotICAgICJsaXR1c2VfYnl0b2ZmIiwJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImxpdHVzZV9ieXRvZmYiKS0xLAkJCS8qIGxlbmd0aCAqLwotICAgIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYsCQkvKiByZWxvYyAqLwotICAgIE9fbGl0dXNlX2J5dG9mZiwJCQkJLyogb3AgKi8KLSAgICBMSVRVU0VfQllUT0ZGLAkJCQkvKiBsaXR1c2UgKi8KLSAgfSwKLQotICB7Ci0gICAgImxpdHVzZV9qc3IiLAkJCQkvKiBuYW1lICovCi0gICAgc2l6ZW9mICgibGl0dXNlX2pzciIpLTEsCQkJLyogbGVuZ3RoICovCi0gICAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUiwJCS8qIHJlbG9jICovCi0gICAgT19saXR1c2VfanNyLAkJCQkvKiBvcCAqLwotICAgIExJVFVTRV9KU1IsCQkJCQkvKiBsaXR1c2UgKi8KLSAgfSwKLQotICB7Ci0gICAgImdwZGlzcCIsCQkJCQkvKiBuYW1lICovCi0gICAgc2l6ZW9mICgiZ3BkaXNwIiktMSwJCQkvKiBsZW5ndGggKi8KLSAgICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AsCQkvKiByZWxvYyAqLwotICAgIE9fZ3BkaXNwLAkJCQkJLyogb3AgKi8KLSAgICAwLAkJCQkJCS8qIGxpdHVzZSAqLwotICB9LAotCi0gIHsKLSAgICAiZ3ByZWxoaWdoIiwJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImdwcmVsaGlnaCIpLTEsCQkJLyogbGVuZ3RoICovCi0gICAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdILAkJLyogcmVsb2MgKi8KLSAgICBPX2dwcmVsaGlnaCwJCQkJLyogb3AgKi8KLSAgICAwLAkJCQkJCS8qIGxpdHVzZSAqLwotICB9LAotCi0gIHsKLSAgICAiZ3ByZWxsb3ciLAkJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImdwcmVsbG93IiktMSwJCQkvKiBsZW5ndGggKi8KLSAgICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVywJCS8qIHJlbG9jICovCi0gICAgT19ncHJlbGxvdywJCQkJCS8qIG9wICovCi0gICAgMCwJCQkJCQkvKiBsaXR1c2UgKi8KLSAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgYWxwaGFfbnVtX3JlbG9jX29wCi0gID0gc2l6ZW9mKGFscGhhX3JlbG9jX29wKSAvIHNpemVvZigqYWxwaGFfcmVsb2Nfb3ApOwotCi0vKiBNYXhpbXVtICMgZGlnaXRzIG5lZWRlZCB0byBob2xkIHRoZSBsYXJnZXN0IHNlcXVlbmNlICMgKi8KLSNkZWZpbmUgQUxQSEFfUkVMT0NfRElHSVRTIDI1Ci0KLS8qIFdoZXRoZXIgYSBzZXF1ZW5jZSBudW1iZXIgaXMgdmFsaWQuICAqLwotI2RlZmluZSBBTFBIQV9SRUxPQ19TRVFVRU5DRV9PSyhYKSAoKFgpID4gMCAmJiAoKHVuc2lnbmVkKShYKSkgPT0gKFgpKQotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBleHBsaWN0IHNlcXVlbmNlIGluZm9ybWF0aW9uLiAgKi8KLXN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZwotewotICBmaXhTICpsaXR1c2U7CQkJLyogaGVhZCBvZiBsaW5rZWQgbGlzdCBvZiAhbGl0ZXJhbHMgKi8KLSAgc2VnVCBzZWdtZW50OwkJCS8qIHNlZ21lbnQgcmVsb2NzIGFyZSBpbiBvciB1bmRlZmluZWRfc2VjdGlvbiovCi0gIGludCBtdWx0aV9zZWN0aW9uX3A7CQkvKiBUcnVlIGlmIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiB3YXMgdXNlZCAqLwotICB1bnNpZ25lZCBzZXF1ZW5jZTsJCS8qIHNlcXVlbmNlICMgKi8KLSAgdW5zaWduZWQgbl9saXRlcmFsczsJCS8qICMgb2YgbGl0ZXJhbHMgKi8KLSAgdW5zaWduZWQgbl9saXR1c2VzOwkJLyogIyBvZiBsaXR1c2VzICovCi0gIGNoYXIgc3RyaW5nWzFdOwkJLyogcHJpbnRhYmxlIGZvcm0gb2Ygc2VxdWVuY2UgdG8gaGFzaCB3aXRoICovCi19OwotCi0vKiBIYXNoIHRhYmxlIHRvIGxpbmsgdXAgbGl0ZXJhbHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbGl0dXNlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYWxwaGFfbGl0ZXJhbF9oYXNoOwotI2VuZGlmCi0MCi0vKiBBIHRhYmxlIG9mIENQVSBuYW1lcyBhbmQgb3Bjb2RlIHNldHMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdV90eXBlCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGZsYWdzOwotfSBjcHVfdHlwZXNbXSA9Ci17Ci0gIC8qIEFkIGhvYyBjb252ZW50aW9uOiBjcHUgbnVtYmVyIGdldHMgcGFsY29kZSwgcHJvY2VzcyBjb2RlIGRvZXNuJ3QuCi0gICAgIFRoaXMgc3VwcG9ydHMgdXNhZ2UgdW5kZXIgRFUgNC4wYiB0aGF0IGRvZXMgIi5hcmNoIGV2NCIsIGFuZCAKLSAgICAgdXNhZ2UgaW4gTUlMTyB0aGF0IGRvZXMgLW0yMTA2NC4gIFByb2JhYmx5IHNvbWV0aGluZyBtb3JlCi0gICAgIHNwZWNpZmljIGxpa2UgLW0yMTA2NC1wYWwgc2hvdWxkIGJlIHVzZWQsIGJ1dCBvaCB3ZWxsLiAgKi8KLQotICB7ICIyMTA2NCIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNCB9LAotICB7ICIyMTA2NGEiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjYiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjgiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjExNjQiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjUgfSwKLSAgeyAiMjExNjRhIiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYIH0sCi0gIHsgIjIxMTY0cGMiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYCi0JCXxBWFBfT1BDT0RFX01BWCkgfSwKLSAgeyAiMjEyNjQiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY2fEFYUF9PUENPREVfQldYCi0JICAgICAgfEFYUF9PUENPREVfTUFYfEFYUF9PUENPREVfQ0lYKSB9LAotCi0gIHsgImV2NCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImxjYTQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImV2NSIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYIH0sCi0gIHsgInBjYTU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYfEFYUF9PUENPREVfTUFYIH0sCi0gIHsgImV2NiIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0JXWHxBWFBfT1BDT0RFX01BWHxBWFBfT1BDT0RFX0NJWCB9LAotCi0gIHsgImFsbCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7IDAsIDAgfQotfTsKLQotLyogVGhlIG1hY3JvIHRhYmxlICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gYWxwaGFfbWFjcm9zW10gPSB7Ci0vKiBMb2FkL1N0b3JlIG1hY3JvcyAqLwotICB7ICJsZGEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0xJVEVSQUwsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkYWgiLAllbWl0X2xkYWgsIE5VTEwsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotCi0gIHsgImxkbCIsCWVtaXRfaXJfbG9hZCwgImxkbCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGxfbCIsCWVtaXRfaXJfbG9hZCwgImxkbF9sIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcSIsCWVtaXRfaXJfbG9hZCwgImxkcSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19MSVRFUkFMLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHFfbCIsCWVtaXRfaXJfbG9hZCwgImxkcV9sIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcV91IiwJZW1pdF9pcl9sb2FkLCAibGRxX3UiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRmIiwJZW1pdF9sb2Fkc3RvcmUsICJsZGYiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkZyIsCWVtaXRfbG9hZHN0b3JlLCAibGRnIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHMiLAllbWl0X2xvYWRzdG9yZSwgImxkcyIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGR0IiwJZW1pdF9sb2Fkc3RvcmUsICJsZHQiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRiIiwJZW1pdF9sZFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkYnUiLAllbWl0X2xkWHUsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkdyIsCWVtaXRfbGRYLCAoUFRSKTEsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHd1IiwJZW1pdF9sZFh1LCAoUFRSKTEsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotCi0gIHsgInVsZHciLAllbWl0X3VsZFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVsZHd1IiwJZW1pdF91bGRYdSwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkbCIsCWVtaXRfdWxkWCwgKFBUUikyLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkbHUiLAllbWl0X3VsZFh1LCAoUFRSKTIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGRxIiwJZW1pdF91bGRYdSwgKFBUUikzLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLQotICB7ICJsZGdwIiwJZW1pdF9sZGdwLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EgfSB9LAotCi0gIHsgImxkaSIsCWVtaXRfbGRhLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpbCIsCWVtaXRfbGRpbCwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaXEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jaWYgMAotICB7ICJsZGlmIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpZCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaWciCWVtaXRfbGRpcSwgTlVMTCwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGlzIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpdCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jZW5kaWYKLQotICB7ICJzdGwiLAllbWl0X2xvYWRzdG9yZSwgInN0bCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdGxfYyIsCWVtaXRfbG9hZHN0b3JlLCAic3RsX2MiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxIiwJZW1pdF9sb2Fkc3RvcmUsICJzdHEiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxX2MiLAllbWl0X2xvYWRzdG9yZSwgInN0cV9jIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0cV91IiwJZW1pdF9sb2Fkc3RvcmUsICJzdHFfdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdGYiLAllbWl0X2xvYWRzdG9yZSwgInN0ZiIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RnIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGciLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0cyIsCWVtaXRfbG9hZHN0b3JlLCAic3RzIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdHQiLAllbWl0X2xvYWRzdG9yZSwgInN0dCIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLQotICB7ICJzdGIiLAllbWl0X3N0WCwgKFBUUikwLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3R3IiwJZW1pdF9zdFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVzdHciLAllbWl0X3VzdFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVzdGwiLAllbWl0X3VzdFgsIChQVFIpMiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVzdHEiLAllbWl0X3VzdFgsIChQVFIpMywKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0KLS8qIEFyaXRobWV0aWMgbWFjcm9zICovCi0jaWYgMAotICB7ICJhYnNsIgllbWl0X2Fic2wsIDEsIHsgSVIgfSB9LAotICB7ICJhYnNsIgllbWl0X2Fic2wsIDIsIHsgSVIsIElSIH0gfSwKLSAgeyAiYWJzbCIJZW1pdF9hYnNsLCAyLCB7IEVYUCwgSVIgfSB9LAotICB7ICJhYnNxIgllbWl0X2Fic3EsIDEsIHsgSVIgfSB9LAotICB7ICJhYnNxIgllbWl0X2Fic3EsIDIsIHsgSVIsIElSIH0gfSwKLSAgeyAiYWJzcSIJZW1pdF9hYnNxLCAyLCB7IEVYUCwgSVIgfSB9LAotI2VuZGlmCi0KLSAgeyAic2V4dGIiLAllbWl0X3NleHRYLCAoUFRSKTAsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJzZXh0dyIsCWVtaXRfc2V4dFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSAqLyB9IH0sCi0KLSAgeyAiZGl2bCIsCWVtaXRfZGl2aXNpb24sICJfX2RpdmwiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAiZGl2bHUiLAllbWl0X2RpdmlzaW9uLCAiX19kaXZsdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJkaXZxIiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2cSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJkaXZxdSIsCWVtaXRfZGl2aXNpb24sICJfX2RpdnF1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgInJlbWwiLAllbWl0X2RpdmlzaW9uLCAiX19yZW1sIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgInJlbWx1IiwJZW1pdF9kaXZpc2lvbiwgIl9fcmVtbHUiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtcSIsCWVtaXRfZGl2aXNpb24sICJfX3JlbXEiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtcXUiLAllbWl0X2RpdmlzaW9uLCAiX19yZW1xdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotCi0gIHsgImpzciIsCWVtaXRfanNyam1wLCAianNyIiwKLSAgICB7IE1BQ1JPX1BJUiwgTUFDUk9fRVhQLCBNQUNST19KU1IsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fSlNSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgIE1BQ1JPX0VYUCwgTUFDUk9fSlNSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0pTUiwgTUFDUk9fRU9BIH0gfSwKLSAgeyAiam1wIiwJZW1pdF9qc3JqbXAsICJqbXAiLAotICAgIHsgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0pTUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19KU1IsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCAgTUFDUk9fRVhQLCBNQUNST19KU1IsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VYUCwgTUFDUk9fSlNSLCBNQUNST19FT0EgfSB9LAotICB7ICJyZXQiLAllbWl0X3JldGpjciwgInJldCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FT0EgfSB9LAotICB7ICJqY3IiLAllbWl0X3JldGpjciwgImpjciIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FT0EgfSB9LAotICB7ICJqc3JfY29yb3V0aW5lIiwJZW1pdF9yZXRqY3IsICJqY3IiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRU9BIH0gfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWxwaGFfbnVtX21hY3JvcwotICA9IHNpemVvZihhbHBoYV9tYWNyb3MpIC8gc2l6ZW9mKCphbHBoYV9tYWNyb3MpOwotDAotLyogUHVibGljIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNldHMKLSAgIHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsCi0gICBuZWVkLCB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIGJlZm9yZSBhcmd1bWVudHMgYXJlIHBhcnNlZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIFZlcmlmeSB0aGF0IFhfb3AgZmllbGQgaXMgd2lkZSBlbm91Z2guICAqLwotICB7Ci0gICAgZXhwcmVzc2lvblMgZTsKLSAgICBlLlhfb3AgPSBPX21heDsKLSAgICBhc3NlcnQgKGUuWF9vcCA9PSBPX21heCk7Ci0gIH0KLQotICAvKiBDcmVhdGUgdGhlIG9wY29kZSBoYXNoIHRhYmxlICovCi0KLSAgYWxwaGFfb3Bjb2RlX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgZm9yIChpID0gMDsgaSA8IGFscGhhX251bV9vcGNvZGVzOyApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSwgKnJldHZhbCwgKnNsYXNoOwotCi0gICAgICBuYW1lID0gYWxwaGFfb3Bjb2Rlc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKGFscGhhX29wY29kZV9oYXNoLCBuYW1lLCAoUFRSKSZhbHBoYV9vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwpCi0JYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG9wY29kZSBgJXMnOiAlcyIpLCBuYW1lLCByZXR2YWwpOwotCi0gICAgICAvKiBTb21lIG9wY29kZXMgaW5jbHVkZSBtb2RpZmllcnMgb2YgdmFyaW91cyBzb3J0cyB3aXRoIGEgIi9tb2QiCi0JIHN5bnRheCwgbGlrZSB0aGUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBzdWdnZXN0cy4gIEhvd2V2ZXIsIGZvcgotCSB1c2Ugd2l0aCBnY2MgYXQgbGVhc3QsIHdlIGFsc28gbmVlZCBhY2Nlc3MgdG8gdGhvc2Ugc2FtZSBvcGNvZGVzCi0JIHdpdGhvdXQgdGhlICIvIi4gICovCi0KLSAgICAgIGlmICgoc2xhc2ggPSBzdHJjaHIgKG5hbWUsICcvJykpICE9IE5VTEwpCi0JewotCSAgY2hhciAqcCA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkpOwotCSAgbWVtY3B5IChwLCBuYW1lLCBzbGFzaCAtIG5hbWUpOwotCSAgc3RyY3B5IChwICsgKHNsYXNoIC0gbmFtZSksIHNsYXNoICsgMSk7Ci0KLQkgICh2b2lkKWhhc2hfaW5zZXJ0KGFscGhhX29wY29kZV9oYXNoLCBwLCAoUFRSKSZhbHBoYV9vcGNvZGVzW2ldKTsKLQkgIC8qIElnbm9yZSBmYWlsdXJlcyAtLSB0aGUgb3Bjb2RlIHRhYmxlIGRvZXMgZHVwbGljYXRlIHNvbWUKLQkgICAgIHZhcmlhbnRzIGluIGRpZmZlcmVudCBmb3JtcywgbGlrZSAiaHdfc3RxIiBhbmQgImh3X3N0L3EiLiAgKi8KLQl9Ci0KLSAgICAgIHdoaWxlICgrK2kgPCBhbHBoYV9udW1fb3Bjb2RlcwotCSAgICAgJiYgKGFscGhhX29wY29kZXNbaV0ubmFtZSA9PSBuYW1lCi0JCSB8fCAhc3RyY21wIChhbHBoYV9vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKSkKLQljb250aW51ZTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBtYWNybyBoYXNoIHRhYmxlICovCi0KLSAgYWxwaGFfbWFjcm9faGFzaCA9IGhhc2hfbmV3ICgpOwotICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFfbnVtX21hY3JvczsgKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsICpyZXR2YWw7Ci0KLSAgICAgIG5hbWUgPSBhbHBoYV9tYWNyb3NbaV0ubmFtZTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChhbHBoYV9tYWNyb19oYXNoLCBuYW1lLCAoUFRSKSZhbHBoYV9tYWNyb3NbaV0pOwotICAgICAgaWYgKHJldHZhbCkKLQlhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggbWFjcm8gYCVzJzogJXMiKSwgbmFtZSwgcmV0dmFsKTsKLQotICAgICAgd2hpbGUgKCsraSA8IGFscGhhX251bV9tYWNyb3MKLQkgICAgICYmIChhbHBoYV9tYWNyb3NbaV0ubmFtZSA9PSBuYW1lCi0JCSB8fCAhc3RyY21wIChhbHBoYV9tYWNyb3NbaV0ubmFtZSwgbmFtZSkpKQotCWNvbnRpbnVlOwotICAgIH0KLQotICAvKiBDb25zdHJ1Y3Qgc3ltYm9scyBmb3IgZWFjaCBvZiB0aGUgcmVnaXN0ZXJzICovCi0KLSAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpCi0gICAgewotICAgICAgY2hhciBuYW1lWzRdOwotICAgICAgc3ByaW50ZihuYW1lLCAiJCVkIiwgaSk7Ci0gICAgICBhbHBoYV9yZWdpc3Rlcl90YWJsZVtpXSA9IHN5bWJvbF9jcmVhdGUobmFtZSwgcmVnX3NlY3Rpb24sIGksCi0JCQkJCSAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgfQotICBmb3IgKDsgaSA8IDY0OyArK2kpCi0gICAgewotICAgICAgY2hhciBuYW1lWzVdOwotICAgICAgc3ByaW50ZihuYW1lLCAiJGYlZCIsIGktMzIpOwotICAgICAgYWxwaGFfcmVnaXN0ZXJfdGFibGVbaV0gPSBzeW1ib2xfY3JlYXRlKG5hbWUsIHJlZ19zZWN0aW9uLCBpLAotCQkJCQkgICAgICAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIHNwZWNpYWwgc3ltYm9scyBhbmQgc2VjdGlvbnMgd2UnbGwgYmUgdXNpbmcgKi8KLQotICAvKiBTbyAuc2JzcyB3aWxsIGdldCB1c2VkIGZvciB0aW55IG9iamVjdHMuICAqLwotICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgZ19zd2l0Y2hfdmFsdWUpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gKCIubGl0YSIsICZhbHBoYV9saXRhX3NlY3Rpb24sICZhbHBoYV9saXRhX3N5bWJvbCk7Ci0KLSAgLyogRm9yIGhhbmRsaW5nIHRoZSBHUCwgY3JlYXRlIGEgc3ltYm9sIHRoYXQgd29uJ3QgYmUgb3V0cHV0IGluIHRoZQotICAgICBzeW1ib2wgdGFibGUuICBXZSdsbCBlZGl0IGl0IG91dCBvZiByZWxvY3MgbGF0ZXIuICAqLwotICBhbHBoYV9ncF9zeW1ib2wgPSBzeW1ib2xfY3JlYXRlICgiPEdQIHZhbHVlPiIsIGFscGhhX2xpdGFfc2VjdGlvbiwgMHg4MDAwLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FVkFYCi0gIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gKCIubGluayIsICZhbHBoYV9saW5rX3NlY3Rpb24sICZhbHBoYV9saW5rX3N5bWJvbCk7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICBzZWdUIHNlYyA9IHN1YnNlZ19uZXcoIi5tZGVidWciLCAoc3Vic2VnVCkwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyhzdGRvdXRwdXQsIHNlYywgU0VDX0hBU19DT05URU5UU3xTRUNfUkVBRE9OTFkpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChzdGRvdXRwdXQsIHNlYywgMyk7Ci0gICAgfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotICBzdWJzZWdfc2V0KHRleHRfc2VjdGlvbiwgMCk7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIC8qIENyZWF0ZSBsaXRlcmFsIGxvb2t1cCBoYXNoIHRhYmxlLiAgKi8KLSAgYWxwaGFfbGl0ZXJhbF9oYXNoID0gaGFzaF9uZXcoKTsKLSNlbmRpZgotfQotCi0vKiBUaGUgcHVibGljIGludGVyZmFjZSB0byB0aGUgaW5zdHJ1Y3Rpb24gYXNzZW1ibGVyLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyIG9wbmFtZVszMl07CQkJLyogY3VycmVudCBtYXhpbXVtIGlzIDEzICovCi0gIGV4cHJlc3Npb25TIHRva1tNQVhfSU5TTl9BUkdTXTsKLSAgaW50IG50b2ssIHRydW5jbGVuOwotICBzaXplX3Qgb3BuYW1lbGVuOwotCi0gIC8qIHNwbGl0IG9mZiB0aGUgb3Bjb2RlICovCi0gIG9wbmFtZWxlbiA9IHN0cnNwbiAoc3RyLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpfLzQ2ODE5Iik7Ci0gIHRydW5jbGVuID0gKG9wbmFtZWxlbiA8IHNpemVvZiAob3BuYW1lKSAtIDEKLQkgICAgICA/IG9wbmFtZWxlbgotCSAgICAgIDogc2l6ZW9mIChvcG5hbWUpIC0gMSk7Ci0gIG1lbWNweSAob3BuYW1lLCBzdHIsIHRydW5jbGVuKTsKLSAgb3BuYW1lW3RydW5jbGVuXSA9ICdcMCc7Ci0KLSAgLyogdG9rZW5pemUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KLSAgaWYgKChudG9rID0gdG9rZW5pemVfYXJndW1lbnRzIChzdHIgKyBvcG5hbWVsZW4sIHRvaywgTUFYX0lOU05fQVJHUykpIDwgMCkKLSAgICB7Ci0gICAgICBpZiAobnRvayAhPSBUT0tFTklaRV9FUlJPUl9SRVBPUlQpCi0JYXNfYmFkIChfKCJzeW50YXggZXJyb3IiKSk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogZmluaXNoIGl0IG9mZiAqLwotICBhc3NlbWJsZV90b2tlbnMgKG9wbmFtZSwgdG9rLCBudG9rLCBhbHBoYV9tYWNyb3Nfb24pOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24ncyBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBzaXplKQotICAgICBzZWdUIHNlZzsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoc3Rkb3V0cHV0LCBzZWcpOwotICB2YWx1ZVQgbWFzayA9ICgodmFsdWVUKTEgPDwgYWxpZ24pIC0gMTsKLQotICByZXR1cm4gKHNpemUgKyBtYXNrKSAmIH5tYXNrOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotZXh0ZXJuIGNoYXIgKnZheF9tZF9hdG9mIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQgKikpOwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgICAgLyogVkFYIGZsb2F0cyAqLwotICAgIGNhc2UgJ0cnOgotICAgICAgLyogVkFYIG1kX2F0b2YgZG9lc24ndCBsaWtlICJHIiBmb3Igc29tZSByZWFzb24uICAqLwotICAgICAgdHlwZSA9ICdnJzsKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHJldHVybiB2YXhfbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApOwotCi0gICAgICAvKiBJRUVFIGZsb2F0cyAqLwotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQLS0pLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogVGFrZSBjYXJlIG9mIHRoZSB0YXJnZXQtc3BlY2lmaWMgY29tbWFuZC1saW5lIG9wdGlvbnMuICAqLwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ0YnOgotICAgICAgYWxwaGFfbm9mbG9hdHNfb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl8zMkFERFI6Ci0gICAgICBhbHBoYV9hZGRyMzJfb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoKLSAgICAgIGFscGhhX2RlYnVnID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IGF0b2koYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbSc6Ci0gICAgICB7Ci0JY29uc3Qgc3RydWN0IGNwdV90eXBlICpwOwotCWZvciAocCA9IGNwdV90eXBlczsgcC0+bmFtZTsgKytwKQotCSAgaWYgKHN0cmNtcChhcmcsIHAtPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBhbHBoYV90YXJnZXRfbmFtZSA9IHAtPm5hbWUsIGFscGhhX3RhcmdldCA9IHAtPmZsYWdzOwotCSAgICAgIGdvdG8gZm91bmQ7Ci0JICAgIH0KLQlhc193YXJuKF8oIlVua25vd24gQ1BVIGlkZW50aWZpZXIgYCVzJyIpLCBhcmcpOwotICAgICAgZm91bmQ6OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICAgIGNhc2UgJysnOgkJCS8qIEZvciBnKysuICBIYXNoIGFueSBuYW1lID4gNjMgY2hhcnMgbG9uZy4gKi8KLSAgICAgIGFscGhhX2ZsYWdfaGFzaF9sb25nX25hbWVzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSCc6CQkJLyogU2hvdyBuZXcgc3ltYm9sIGFmdGVyIGhhc2ggdHJ1bmNhdGlvbiAqLwotICAgICAgYWxwaGFfZmxhZ19zaG93X2FmdGVyX3RydW5jID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6CQkJLyogZm9yIGdudS1jL3ZheCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIE9QVElPTl9SRUxBWDoKLSAgICAgIGFscGhhX2ZsYWdfcmVsYXggPSAxOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBPUFRJT05fTURFQlVHOgotICAgICAgYWxwaGFfZmxhZ19tZGVidWcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTk9fTURFQlVHOgotICAgICAgYWxwaGFfZmxhZ19tZGVidWcgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFByaW50IGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRoYXQgd2UgYWNjZXB0LiAgKi8KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwdXRzKF8oIlwKLUFscGhhIG9wdGlvbnM6XG5cCi0tMzJhZGRyCQkJdHJlYXQgYWRkcmVzc2VzIGFzIDMyLWJpdCB2YWx1ZXNcblwKLS1GCQkJbGFjayBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgc3VwcG9ydFxuXAotLW1ldjQgfCAtbWV2NDUgfCAtbWV2NSB8IC1tZXY1NiB8IC1tcGNhNTYgfCAtbWV2NiB8IC1tYWxsXG5cCi0JCQlzcGVjaWZ5IHZhcmlhbnQgb2YgQWxwaGEgYXJjaGl0ZWN0dXJlXG5cCi0tbTIxMDY0IHwgLW0yMTA2NiB8IC1tMjExNjQgfCAtbTIxMTY0YSB8IC1tMjExNjRwYyB8IC1tMjEyNjRcblwKLQkJCXRoZXNlIHZhcmlhbnRzIGluY2x1ZGUgUEFMY29kZSBvcGNvZGVzXG4iKSwKLQlzdHJlYW0pOwotI2lmZGVmIE9CSl9FVkFYCi0gIGZwdXRzIChfKCJcCi1WTVMgb3B0aW9uczpcblwKLS0rCQkJaGFzaCBlbmNvZGUgKGRvbid0IHRydW5jYXRlKSBuYW1lcyBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzXG5cCi0tSAkJCXNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cbiIpLAotCXN0cmVhbSk7Ci0jZW5kaWYKLX0KLQotLyogRGVjaWRlIGZyb20gd2hhdCBwb2ludCBhIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8sCi0gICByZWxhdGl2ZSB0byB0aGUgcGMtcmVsYXRpdmUgZml4dXAuICBFciwgcmVsYXRpdmVseSBzcGVha2luZy4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHZhbHVlVCBhZGRyID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgICAgcmV0dXJuIGFkZHI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmaXhQLT5meF9zaXplICsgYWRkcjsKLSAgICB9Ci19Ci0KLS8qIEF0dGVtcHQgdG8gc2ltcGxpZnkgb3IgZXZlbiBlbGltaW5hdGUgYSBmaXh1cC4gIFRoZSByZXR1cm4gdmFsdWUgaXMKLSAgIGlnbm9yZWQ7IHBlcmhhcHMgaXQgd2FzIG9uY2UgbWVhbmluZ2Z1bCwgYnV0IG5vdyBpdCBpcyBoaXN0b3JpY2FsLgotICAgVG8gaW5kaWNhdGUgdGhhdCBhIGZpeHVwIGhhcyBiZWVuIGVsaW1pbmF0ZWQsIHNldCBmaXhQLT5meF9kb25lLgotCi0gICBGb3IgRUxGLCBoZXJlIGl0IGlzIHRoYXQgd2UgdHJhbnNmb3JtIHRoZSBHUERJU1BfSEkxNiByZWxvYyB3ZSB1c2VkCi0gICBpbnRlcm5hbGx5IGludG8gdGhlIEdQRElTUCByZWxvYyB1c2VkIGV4dGVybmFsbHkuICBXZSBoYWQgdG8gZG8KLSAgIHRoaXMgc28gdGhhdCB3ZSdkIGhhdmUgdGhlIEdQRElTUF9MTzE2IHJlbG9jIGFzIGEgdGFnIHRvIGNvbXB1dGUKLSAgIHRoZSBkaXN0YW5jZSB0byB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZm9yIHNldHRpbmcgdGhlIGFkZGVuZCB0bwotICAgR1BESVNQLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHVlUCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWx1ZVA7Ci17Ci0gIGNoYXIgKiBjb25zdCBmaXhwb3MgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gIHZhbHVlVCB2YWx1ZSA9ICp2YWx1ZVA7Ci0gIHVuc2lnbmVkIGltYWdlLCBzaXplOwotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICAgIC8qIFRoZSBHUERJU1AgcmVsb2NhdGlvbnMgYXJlIHByb2Nlc3NlZCBpbnRlcm5hbGx5IHdpdGggYSBzeW1ib2wKLQkgcmVmZXJyaW5nIHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uOyB3ZSBuZWVkIHRvIGRyb3AgaW4gYSB2YWx1ZQotCSB3aGljaCwgd2hlbiBhZGRlZCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLAotCSBnaXZlcyB0aGUgZGVzaXJlZCBHUC4gICovCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6Ci0gICAgICB7Ci0JZml4UyAqbmV4dCA9IGZpeFAtPmZ4X25leHQ7Ci0JYXNzZXJ0IChuZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2KTsKLQotCWZpeFAtPmZ4X29mZnNldCA9IChuZXh0LT5meF9mcmFnLT5mcl9hZGRyZXNzICsgbmV4dC0+Znhfd2hlcmUKLQkJCSAgIC0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIGZpeFAtPmZ4X3doZXJlKTsKLQotCXZhbHVlID0gKHZhbHVlIC0gc2lnbl9leHRlbmRfMTYgKHZhbHVlKSkgPj4gMTY7Ci0gICAgICB9Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUDsKLSNlbmRpZgotICAgICAgZ290byBkb19yZWxvY19ncDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgICAgdmFsdWUgPSBzaWduX2V4dGVuZF8xNiAodmFsdWUpOwotICAgICAgZml4UC0+Znhfb2Zmc2V0ID0gMDsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBmaXhQLT5meF9kb25lID0gMTsKLSNlbmRpZgotCi0gICAgZG9fcmVsb2NfZ3A6Ci0gICAgICBmaXhQLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLSAgICAgIHNpemUgPSAyOwotICAgICAgZ290byBkb19yZWxvY194eDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0gICAgICBzaXplID0gNDsKLSAgICAgIGdvdG8gZG9fcmVsb2NfeHg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzY0X1BDUkVMOwotICAgICAgc2l6ZSA9IDg7Ci0gICAgZG9fcmVsb2NfeHg6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgc2l6ZSk7Ci0JICBnb3RvIGRvbmU7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgICAgYXNzZXJ0IChmaXhQLT5meF9zdWJzeSA9PSBhbHBoYV9ncF9zeW1ib2wpOwotICAgICAgZml4UC0+Znhfc3Vic3kgPSAwOwotICAgICAgLyogRklYTUU6IGluaGVyaXRlZCB0aGlzIG9ibGl2aW91c25lc3Mgb2YgYHZhbHVlJyAtLSB3aHk/ICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgLWFscGhhX2dwX3ZhbHVlLCA0KTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0gICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQotCXsKLQkgIGltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOwotCSAgaW1hZ2UgPSAoaW1hZ2UgJiB+MHgxRkZGRkYpIHwgKCh2YWx1ZSA+PiAyKSAmIDB4MUZGRkZGKTsKLQkgIGdvdG8gd3JpdGVfZG9uZTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQotCXsKLQkgIGltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOwotCSAgaW1hZ2UgPSAoaW1hZ2UgJiB+MHgzRkZGKSB8ICgodmFsdWUgPj4gMikgJiAweDNGRkYpOwotCSAgZ290byB3cml0ZV9kb25lOwotCX0KLSAgICAgIHJldHVybiAxOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgMik7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIHJldHVybiAxOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIHJldHVybiAxOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgotICAgICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRToKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSOgotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQRElTUDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XOgotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0JY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQlpZiAoKGludClmaXhQLT5meF9yX3R5cGUgPj0gMCkKLQkgIGFzX2ZhdGFsIChfKCJ1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0KLQlhc3NlcnQgKC0oaW50KWZpeFAtPmZ4X3JfdHlwZSA8IChpbnQpYWxwaGFfbnVtX29wZXJhbmRzKTsKLQlvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWy0oaW50KWZpeFAtPmZ4X3JfdHlwZV07Ci0KLQkvKiBUaGUgcmVzdCBvZiB0aGVzZSBmaXh1cHMgb25seSBleGlzdCBpbnRlcm5hbGx5IGR1cmluZyBzeW1ib2wKLQkgICByZXNvbHV0aW9uIGFuZCBoYXZlIG5vIHJlcHJlc2VudGF0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4KLQkgICBUaGVyZWZvcmUgdGhleSBtdXN0IGJlIGNvbXBsZXRlbHkgcmVzb2x2ZWQgYXMgY29uc3RhbnRzLiAgKi8KLQotCWlmIChmaXhQLT5meF9hZGRzeSAhPSAwCi0JICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygibm9uLWFic29sdXRlIGV4cHJlc3Npb24gaW4gY29uc3RhbnQgZmllbGQiKSk7Ci0KLQlpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKLQlpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCAob2Zmc2V0VCl2YWx1ZSwKLQkJCSAgICAgICBmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lKTsKLSAgICAgIH0KLSAgICAgIGdvdG8gd3JpdGVfZG9uZTsKLSAgICB9Ci0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IDAgfHwgZml4UC0+ZnhfcGNyZWwgIT0gMCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm5fd2hlcmUoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgIF8oInR5cGUgJWQgcmVsb2MgZG9uZT9cbiIpLCAoaW50KWZpeFAtPmZ4X3JfdHlwZSk7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi13cml0ZV9kb25lOgotICBtZF9udW1iZXJfdG9fY2hhcnMoZml4cG9zLCBpbWFnZSwgNCk7Ci0KLWRvbmU6Ci0gIGZpeFAtPmZ4X2RvbmUgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIExvb2sgZm9yIGEgcmVnaXN0ZXIgbmFtZSBpbiB0aGUgZ2l2ZW4gc3ltYm9sLgotICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoKm5hbWUgPT0gJyQnKQotICAgIHsKLSAgICAgIGludCBpc19mbG9hdCA9IDAsIG51bTsKLQotICAgICAgc3dpdGNoICgqKytuYW1lKQotCXsKLQljYXNlICdmJzoKLQkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX0ZQXTsKLQkgIGlzX2Zsb2F0ID0gMzI7Ci0JICAvKiBGQUxMVEhSVSAqLwotCi0JY2FzZSAncic6Ci0JICBpZiAoIWlzZGlnaXQoKisrbmFtZSkpCi0JICAgIGJyZWFrOwotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JICBpZiAobmFtZVsxXSA9PSAnXDAnKQotCSAgICBudW0gPSBuYW1lWzBdIC0gJzAnOwotCSAgZWxzZSBpZiAobmFtZVswXSAhPSAnMCcgJiYgaXNkaWdpdChuYW1lWzFdKSAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBudW0gPSAobmFtZVswXSAtICcwJykgKiAxMCArIG5hbWVbMV0gLSAnMCc7Ci0JICAgICAgaWYgKG51bSA+PSAzMikKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICghYWxwaGFfbm9hdF9vbiAmJiBudW0gPT0gQVhQX1JFR19BVCkKLQkgICAgYXNfd2FybihfKCJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbbnVtICsgaXNfZmxvYXRdOwotCi0JY2FzZSAnYSc6Ci0JICBpZiAobmFtZVsxXSA9PSAndCcgJiYgbmFtZVsyXSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKCFhbHBoYV9ub2F0X29uKQotCQlhc193YXJuKF8oIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkgICAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbQVhQX1JFR19BVF07Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnZyc6Ci0JICBpZiAobmFtZVsxXSA9PSAncCcgJiYgbmFtZVsyXSA9PSAnXDAnKQotCSAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbYWxwaGFfZ3BfcmVnaXN0ZXJdOwotCSAgYnJlYWs7Ci0KLQljYXNlICdzJzoKLQkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX1NQXTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgT0JKX0VDT0ZGCi0vKiBAQEAgTWFnaWMgRUNPRkYgYml0cy4gICovCi0KLXZvaWQKLWFscGhhX2Zyb2JfZWNvZmZfZGF0YSAoKQotewotICBzZWxlY3RfZ3BfdmFsdWUgKCk7Ci0gIC8qICR6ZXJvIGFuZCAkZjMxIGFyZSByZWFkLW9ubHkgKi8KLSAgYWxwaGFfZ3BybWFzayAmPSB+MTsKLSAgYWxwaGFfZnBybWFzayAmPSB+MTsKLX0KLSNlbmRpZgotCi0vKiBIb29rIHRvIHJlbWVtYmVyIGEgcmVjZW50bHkgZGVmaW5lZCBsYWJlbCBzbyB0aGF0IHRoZSBhdXRvLWFsaWduCi0gICBjb2RlIGNhbiBhZGp1c3QgdGhlIHN5bWJvbCBhZnRlciB3ZSBrbm93IHdoYXQgYWxpZ25tZW50IHdpbGwgYmUKLSAgIHJlcXVpcmVkLiAgKi8KLQotdm9pZAotYWxwaGFfZGVmaW5lX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IHN5bTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgd2UgbXVzdCBhbHdheXMgZW1pdCBhIHJlbG9jIGZvciBhIHR5cGUgYW5kIGZhbHNlIGlmCi0gICB0aGVyZSBpcyBzb21lIGhvcGUgb2YgcmVzb2x2aW5nIGl0IGEgYXNzZW1ibHkgdGltZS4gICovCi0KLWludAotYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiAoZikKLSAgICAgZml4UyAqZjsKLXsKLSAgaWYgKGFscGhhX2ZsYWdfcmVsYXgpCi0gICAgcmV0dXJuIDE7Ci0KLSAgc3dpdGNoIChmLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKLSNpZmRlZiBPQkpfRUNPRkYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotI2VuZGlmCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOgotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgotI2VuZGlmCi0jaWZkZWYgUkVMT0NfT1BfUAotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1A6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0g6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVzoKLSNlbmRpZgotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KChpbnQpZi0+Znhfcl90eXBlIDwgMCAmJiAtKGludClmLT5meF9yX3R5cGUgPCAoaW50KWFscGhhX251bV9vcGVyYW5kcyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwYXJ0aWFsbHkgcmVzb2x2ZSBhIHJlbG9jYXRpb24gbm93LiAgKi8KLQotaW50Ci1hbHBoYV9maXhfYWRqdXN0YWJsZSAoZikKLSAgICAgZml4UyAqZjsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZi0+ZnhfYWRkc3kpIHx8IFNfSVNfV0VBSyAoZi0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0KLSAgLyogQXJlIHRoZXJlIGFueSByZWxvY2F0aW9uIHR5cGVzIGZvciB3aGljaCB3ZSBtdXN0IGdlbmVyYXRlIGEgcmVsb2MKLSAgICAgYnV0IHdlIGNhbiBhZGp1c3QgdGhlIHZhbHVlcyBjb250YWluZWQgd2l0aGluIGl0PyAgKi8KLSAgc3dpdGNoIChmLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKLSAgICAgIHJldHVybiAwOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIFJFTE9DX09QX1AKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUw6Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRVZBWAotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0U6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFI6Ci0jZW5kaWYKLSAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOgotI2lmZGVmIFJFTE9DX09QX1AKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1A6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0g6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVzoKLSNlbmRpZgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQgKChpbnQpZi0+Znhfcl90eXBlIDwgMAotCSAgICAgICYmIC0gKGludClmLT5meF9yX3R5cGUgPCAoaW50KWFscGhhX251bV9vcGVyYW5kcyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEdlbmVyYXRlIHRoZSBCRkQgcmVsb2MgdG8gYmUgc3R1Y2sgaW4gdGhlIG9iamVjdCBmaWxlIGZyb20gdGhlCi0gICBmaXh1cCB1c2VkIGludGVybmFsbHkgaW4gdGhlIGFzc2VtYmxlci4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAvKiBNYWtlIHN1cmUgbm9uZSBvZiBvdXIgaW50ZXJuYWwgcmVsb2NhdGlvbnMgbWFrZSBpdCB0aGlzIGZhci4KLSAgICAgVGhleSdkIGJldHRlciBoYXZlIGJlZW4gZnVsbHkgcmVzb2x2ZWQgYnkgdGhpcyBwb2ludC4gICovCi0gIGFzc2VydCAoKGludClmaXhwLT5meF9yX3R5cGUgPiAwKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oImNhbm5vdCByZXByZXNlbnQgYCVzJyByZWxvY2F0aW9uIGluIG9iamVjdCBmaWxlIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCFmaXhwLT5meF9wY3JlbCAhPSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I/IGNhbm5vdCBnZW5lcmF0ZSBgJXMnIHJlbG9jYXRpb24iKSwKLQkJYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOwotICAgIH0KLSAgYXNzZXJ0ICghZml4cC0+ZnhfcGNyZWwgPT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUwpCi0gICAgewotICAgICAgLyogZmFrZSBvdXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gc2lnaCAqLwotICAgICAgcmVsb2MtPmFkZGVuZCA9IC1hbHBoYV9ncF92YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyoKLSAgICAgICAqIE9oaGgsIHRoaXMgaXMgdWdseS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgaWYgdGhpcyBpcyBhIGxvY2FsIGdsb2JhbAotICAgICAgICogc3ltYm9sLCB0aGUgcmVsb2NhdGlvbiB3aWxsIGVudGlyZWx5IGJlIHBlcmZvcm1lZCBhdCBsaW5rIHRpbWUsIG5vdAotICAgICAgICogYXQgYXNzZW1ibHkgdGltZS4gIGJmZF9wZXJmb3JtX3JlbG9jIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIHNvcnQKLSAgICAgICAqIG9mIHRoaW5nLCBhbmQgYXMgYSByZXN1bHQgd2UgbmVlZCB0byBmYWtlIGl0IG91dCBoZXJlLgotICAgICAgICovCi0gICAgICBpZiAoKFNfSVNfRVhURVJOIChmaXhwLT5meF9hZGRzeSkgfHwgU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCi0JICAmJiAhU19JU19DT01NT04oZml4cC0+ZnhfYWRkc3kpKQotCXJlbG9jLT5hZGRlbmQgLT0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KS0+dmFsdWU7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi0vKiBQYXJzZSBhIHJlZ2lzdGVyIG5hbWUgb2ZmIG9mIHRoZSBpbnB1dF9saW5lIGFuZCByZXR1cm4gYSByZWdpc3RlcgotICAgbnVtYmVyLiAgR2V0cyBtZF91bmRlZmluZWRfc3ltYm9sIGFib3ZlIHRvIGRvIHRoZSByZWdpc3RlciBuYW1lCi0gICBtYXRjaGluZyBmb3IgdXMuCi0KLSAgIE9ubHkgY2FsbGVkIGFzIGEgcGFydCBvZiBwcm9jZXNzaW5nIHRoZSBFQ09GRiAuZnJhbWUgZGlyZWN0aXZlLiAgKi8KLQotaW50Ci10Y19nZXRfcmVnaXN0ZXIgKGZyYW1lKQotICAgICBpbnQgZnJhbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGZyYW1lcmVnID0gQVhQX1JFR19TUDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICckJykKLSAgICB7Ci0gICAgICBjaGFyICpzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xTICpzeW0gPSBtZF91bmRlZmluZWRfc3ltYm9sIChzKTsKLQotICAgICAgKnN0cmNocihzLCAnXDAnKSA9IGM7Ci0gICAgICBpZiAoc3ltICYmIChmcmFtZXJlZyA9IFNfR0VUX1ZBTFVFIChzeW0pKSA8PSAzMSkKLQlnb3RvIGZvdW5kOwotICAgIH0KLSAgYXNfd2FybiAoXygiZnJhbWUgcmVnIGV4cGVjdGVkLCB1c2luZyAkJWQuIiksIGZyYW1lcmVnKTsKLQotZm91bmQ6Ci0gIG5vdGVfZ3ByZWcgKGZyYW1lcmVnKTsKLSAgcmV0dXJuIGZyYW1lcmVnOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHN5bWJvbCB0YWJsZSBpcyBwcm9jZXNzZWQuICBJbiBvcmRlciB0bwotICAgd29yayB3aXRoIGdjYyB3aGVuIHVzaW5nIG1pcHMtdGZpbGUsIHdlIG11c3Qga2VlcCBhbGwgbG9jYWwgbGFiZWxzLgotICAgSG93ZXZlciwgaW4gb3RoZXIgY2FzZXMsIHdlIHdhbnQgdG8gZGlzY2FyZCB0aGVtLiAgSWYgd2Ugd2VyZQotICAgY2FsbGVkIHdpdGggLWcsIGJ1dCB3ZSBkaWRuJ3Qgc2VlIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGl0IG1heQotICAgbWVhbiB0aGF0IGdjYyBpcyBzbXVnZ2xpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRocm91Z2ggdG8KLSAgIG1pcHMtdGZpbGUsIGluIHdoaWNoIGNhc2Ugd2UgbXVzdCBnZW5lcmF0ZSBhbGwgbG9jYWwgbGFiZWxzLiAgKi8KLQotI2lmZGVmIE9CSl9FQ09GRgotCi12b2lkCi1hbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQotewotICBpZiAoYWxwaGFfZGVidWcgIT0gMAotICAgICAgJiYgISBlY29mZl9kZWJ1Z2dpbmdfc2VlbikKLSAgICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKLX0KLQotI2VuZGlmIC8qIE9CSl9FQ09GRiAqLwotDAotI2lmZGVmIFJFTE9DX09QX1AKLQotLyogQmVmb3JlIHRoZSByZWxvY2F0aW9ucyBhcmUgd3JpdHRlbiwgcmVvcmRlciB0aGVtLCBzbyB0aGF0IHVzZXIgc3VwcGxpZWQKLSAgICFsaXR1c2UgcmVsb2NhdGlvbnMgZm9sbG93IHRoZSBhcHByb3ByaWF0ZSAhbGl0ZXJhbCByZWxvY2F0aW9ucy4gIEFsc28KLSAgIGNvbnZlcnQgdGhlIGdhcy1pbnRlcm5hbCByZWxvY2F0aW9ucyB0byB0aGUgYXBwcm9wcmlhdGUgbGlua2VyIHJlbG9jYXRpb25zLgotICAgKi8KLQotdm9pZAotYWxwaGFfYWRqdXN0X3N5bXRhYiAoKQotewotICBpZiAoYWxwaGFfbGl0ZXJhbF9oYXNoKQotICAgIHsKLSNpZmRlZiBERUJVRzJfQUxQSEEKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgImFscGhhX2FkanVzdF9zeW10YWIgY2FsbGVkXG4iKTsKLSNlbmRpZgotCi0gICAgICAvKiBHbyBvdmVyIGVhY2ggc2VjdGlvbiwgcmVvcmRlcmluZyB0aGUgcmVsb2NhdGlvbnMgc28gdGhhdCBhbGwgb2YgdGhlCi0gICAgICAgICBleHBsaWNpdCBMSVRVU0UncyBhcmUgYWRqYWNlbnQgdG8gdGhlIGV4cGxpY2l0IExJVEVSQUwncyAqLwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGFscGhhX2FkanVzdF9zeW10YWJfcmVsb2NzLCAoY2hhciAqKSAwKTsKLSAgICB9Ci19Ci0KLQwKLS8qIElubmVyIGZ1bmN0aW9uIHRvIG1vdmUgTElUVVNFJ3MgbmV4dCB0byB0aGUgTElURVJBTC4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jcyAoYWJmZCwgc2VjLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHB0cjsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgZml4UyAqKnByZXZQOwotICBmaXhTICpmaXhwOwotICBmaXhTICpuZXh0OwotICBmaXhTICpsaXR1c2U7Ci0gIGludCBuX2xpdHVzZXMgPSAwOwotCi0jaWZkZWYgREVCVUcyX0FMUEhBCi0gIGludCBuID0gMDsKLSAgaW50IG5fbGl0ZXJhbHMgPSAwOwotICBpbnQgbl9kdXBfbGl0ZXJhbHMgPSAwOwotI2VuZGlmCi0KLSAgLyogSWYgc2VnaW5mbyBpcyBOVUxMLCB3ZSBkaWQgbm90IGNyZWF0ZSB0aGlzIHNlY3Rpb247IGRvbid0IGRvIGFueXRoaW5nIHdpdGgKLSAgICAgaXQuICBCeSB1c2luZyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyLCB3ZSBjYW4gdXBkYXRlIHRoZSBsaW5rcyBpbiBwbGFjZS4gICovCi0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWxvY2F0aW9ucywgc2tpcCB0aGUgc2VjdGlvbi4gICovCi0gIGlmICghIHNlZ2luZm8tPmZpeF9yb290KQotICAgIHJldHVybjsKLQotICAvKiBGaXJzdCByZWJ1aWxkIHRoZSBmaXh1cCBjaGFpbiB3aXRob3V0IHRoZSBleHBpY2l0IGxpdHVzZSdzLiAgKi8KLSAgcHJldlAgPSAmKHNlZ2luZm8tPmZpeF9yb290KTsKLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHA7IGZpeHAgPSBuZXh0KQotICAgIHsKLSAgICAgIG5leHQgPSBmaXhwLT5meF9uZXh0OwotICAgICAgZml4cC0+ZnhfbmV4dCA9IChmaXhTICopMDsKLSNpZmRlZiBERUJVRzJfQUxQSEEKLSAgICAgIG4rKzsKLSNlbmRpZgotCi0gICAgICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgICpwcmV2UCA9IGZpeHA7Ci0JICBwcmV2UCA9ICYoZml4cC0+ZnhfbmV4dCk7Ci0jaWZkZWYgREVCVUcyX0FMUEhBCi0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICJhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jczogMHglbHgsIG90aGVyIHJlbG9jYXRpb24gJXNcbiIsCi0JCSAgIChsb25nKWZpeHAsCi0JCSAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhwLT5meF9yX3R5cGUpKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUw6Ci0JICAqcHJldlAgPSBmaXhwOwotCSAgcHJldlAgPSAmKGZpeHAtPmZ4X25leHQpOwotCSAgLyogcHJldmVudCBhc3NlbWJsZXIgZnJvbSB0cnlpbmcgdG8gYWRqdXN0IHRoZSBvZmZzZXQgKi8KLSNpZmRlZiBERUJVRzJfQUxQSEEKLQkgIG5fbGl0ZXJhbHMrKzsKLQkgIGlmIChmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5uX2xpdGVyYWxzICE9IDEpCi0JICAgIG5fZHVwX2xpdGVyYWxzKys7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICJhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jczogMHglbHgsICFsaXRlcmFsISUuNmQsICMgbGl0ZXJhbHMgPSAlMmRcbiIsCi0JCSAgIChsb25nKWZpeHAsCi0JCSAgIGZpeHAtPnRjX2ZpeF9kYXRhLmluZm8tPnNlcXVlbmNlLAotCQkgICBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5uX2xpdGVyYWxzKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQkgIC8qIGRvIG5vdCBsaW5rIGluIGxpdHVzZSdzICovCi0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRToKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSOgotCSAgbl9saXR1c2VzKys7Ci0JICBpZiAoZml4cC0+dGNfZml4X2RhdGEuaW5mby0+bl9saXRlcmFscyA9PSAwKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgIF8oIk5vICFsaXRlcmFsISVkIHdhcyBmb3VuZCIpLAotCQkJICBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5zZXF1ZW5jZSk7Ci0jaWZkZWYgREVCVUcyX0FMUEhBCi0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICJhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jczogMHglbHgsICFsaXR1c2UgISUuNmQsICMgbGl0dXNlcyAgPSAlMmQsIG5leHRfbGl0dXNlID0gMHglbHhcbiIsCi0JCSAgIChsb25nKWZpeHAsCi0JCSAgIGZpeHAtPnRjX2ZpeF9kYXRhLmluZm8tPnNlcXVlbmNlLAotCQkgICBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5uX2xpdHVzZXMsCi0JCSAgIChsb25nKWZpeHAtPnRjX2ZpeF9kYXRhLm5leHRfbGl0dXNlKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGVyZSB3ZXJlIGFueSBsaXR1c2VzLCBnbyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNoYWluLCB1bmxlc3MgdGhlcmUgaXMKLSAgICAgbW9yZSB0aGFuIG9uZSAhbGl0ZXJhbCBmb3IgYSBnaXZlbiBzZXF1ZW5jZSBudW1iZXIuICBUaGV5IGFyZSBsaW5rZWQKLSAgICAgdGhyb3VnaCB0aGUgbmV4dF9saXR1c2UgZmllbGQgaW4gcmV2ZXJzZSBvcmRlciwgc28gYXMgd2UgZ28gdGhyb3VnaCB0aGUKLSAgICAgbmV4dF9saXR1c2UgY2hhaW4sIHdlIGVmZmVjdGl2ZWx5IHJldmVyc2UgdGhlIGNoYWluIG9uY2UgYWdhaW4uICBJZiB0aGVyZQotICAgICB3YXMgbW9yZSB0aGFuIG9uZSAhbGl0ZXJhbCwgd2UgZmFsbCBiYWNrIHRvIGxvYWRpbmcgdXAgdGhlIGFkZHJlc3Mgdy9vCi0gICAgIG9wdGltaXphdGlvbi4gIEFsc28sIGlmIHRoZSAhbGl0ZXJhbHMvIWxpdHVzZXMgYXJlIHNwcmVhZCBpbiBkaWZmZXJlbnQKLSAgICAgc2VnbWVudHMgKGhhcHBlbnMgaW4gdGhlIExpbnV4IGtlcm5lbCBzZW1hcGhvcmVzKSwgc3VwcHJlc3MgdGhlCi0gICAgIG9wdGltaXphdGlvbi4gICovCi0gIGlmIChuX2xpdHVzZXMpCi0gICAgewotICAgICAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHA7IGZpeHAgPSBmaXhwLT5meF9uZXh0KQotCXsKLQkgIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMOgotI2lmZGVmIE9CSl9FTEYKLQkgICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw7Ci0jZWxzZQotCSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOwkvKiBYWFggY2hlY2sgdGhpcyAqLwotI2VuZGlmCi0JICAgICAgaWYgKGZpeHAtPnRjX2ZpeF9kYXRhLmluZm8tPm5fbGl0ZXJhbHMgPT0gMQotCQkgICYmICEgZml4cC0+dGNfZml4X2RhdGEuaW5mby0+bXVsdGlfc2VjdGlvbl9wKQotCQl7Ci0JCSAgZm9yIChsaXR1c2UgPSBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5saXR1c2U7Ci0JCSAgICAgICBsaXR1c2UgIT0gKGZpeFMgKikwOwotCQkgICAgICAgbGl0dXNlID0gbGl0dXNlLT50Y19maXhfZGF0YS5uZXh0X2xpdHVzZSkKLQkJICAgIHsKLQkJICAgICAgbGl0dXNlLT5meF9uZXh0ID0gZml4cC0+ZnhfbmV4dDsKLQkJICAgICAgZml4cC0+ZnhfbmV4dCA9IGxpdHVzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0U6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSOgotCSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWZkZWYgREVCVUcyX0FMUEhBCi0gIGZwcmludGYgKHN0ZGVyciwgImFscGhhX2FkanVzdF9zeW10YWJfcmVsb2NzOiAlcywgJWQgbGl0ZXJhbCVzLCAlZCBkdXBsaWNhdGUgbGl0ZXJhbCVzLCAlZCBsaXR1c2Ulc1xuXG4iLAotCSAgIHNlYy0+bmFtZSwKLQkgICBuX2xpdGVyYWxzLCAobl9saXRlcmFscyA9PSAxKSA/ICIiIDogInMiLAotCSAgIG5fZHVwX2xpdGVyYWxzLCAobl9kdXBfbGl0ZXJhbHMgPT0gMSkgPyAiIiA6ICJzIiwKLQkgICBuX2xpdHVzZXMsIChuX2xpdHVzZXMgPT0gMSkgPyAiIiA6ICJzIik7Ci0jZW5kaWYKLX0KLQotI2VuZGlmIC8qIFJFTE9DX09QX1AgKi8KLQotDAotI2lmZGVmIERFQlVHX0FMUEhBCi1zdGF0aWMgdm9pZAotZGVidWdfZXhwICh0b2ssIG50b2spCi0gICAgIGV4cHJlc3Npb25TIHRva1tdOwotICAgICBpbnQgbnRvazsKLXsKLSAgaW50IGk7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiZGVidWdfZXhwOiAlZCB0b2tlbnMiLCBudG9rKTsKLSAgZm9yIChpID0gMDsgaSA8IG50b2s7IGkrKykKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyAqdCA9ICZ0b2tbaV07Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3dpdGNoICh0LT5YX29wKQotCXsKLQlkZWZhdWx0OgkJCW5hbWUgPSAidW5rbm93biI7CQlicmVhazsKLQljYXNlIE9faWxsZWdhbDoJCQluYW1lID0gIk9faWxsZWdhbCI7CQlicmVhazsKLQljYXNlIE9fYWJzZW50OgkJCW5hbWUgPSAiT19hYnNlbnQiOwkJYnJlYWs7Ci0JY2FzZSBPX2NvbnN0YW50OgkJbmFtZSA9ICJPX2NvbnN0YW50IjsJCWJyZWFrOwotCWNhc2UgT19zeW1ib2w6CQkJbmFtZSA9ICJPX3N5bWJvbCI7CQlicmVhazsKLQljYXNlIE9fc3ltYm9sX3J2YToJCW5hbWUgPSAiT19zeW1ib2xfcnZhIjsJCWJyZWFrOwotCWNhc2UgT19yZWdpc3RlcjoJCW5hbWUgPSAiT19yZWdpc3RlciI7CQlicmVhazsKLQljYXNlIE9fYmlnOgkJCW5hbWUgPSAiT19iaWciOwkJCWJyZWFrOwotCWNhc2UgT191bWludXM6CQkJbmFtZSA9ICJPX3VtaW51cyI7CQlicmVhazsKLQljYXNlIE9fYml0X25vdDoJCQluYW1lID0gIk9fYml0X25vdCI7CQlicmVhazsKLQljYXNlIE9fbG9naWNhbF9ub3Q6CQluYW1lID0gIk9fbG9naWNhbF9ub3QiOwkJYnJlYWs7Ci0JY2FzZSBPX211bHRpcGx5OgkJbmFtZSA9ICJPX211bHRpcGx5IjsJCWJyZWFrOwotCWNhc2UgT19kaXZpZGU6CQkJbmFtZSA9ICJPX2RpdmlkZSI7CQlicmVhazsKLQljYXNlIE9fbW9kdWx1czoJCQluYW1lID0gIk9fbW9kdWx1cyI7CQlicmVhazsKLQljYXNlIE9fbGVmdF9zaGlmdDoJCW5hbWUgPSAiT19sZWZ0X3NoaWZ0IjsJCWJyZWFrOwotCWNhc2UgT19yaWdodF9zaGlmdDoJCW5hbWUgPSAiT19yaWdodF9zaGlmdCI7CQlicmVhazsKLQljYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoJbmFtZSA9ICJPX2JpdF9pbmNsdXNpdmVfb3IiOwlicmVhazsKLQljYXNlIE9fYml0X29yX25vdDoJCW5hbWUgPSAiT19iaXRfb3Jfbm90IjsJCWJyZWFrOwotCWNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgluYW1lID0gIk9fYml0X2V4Y2x1c2l2ZV9vciI7CWJyZWFrOwotCWNhc2UgT19iaXRfYW5kOgkJCW5hbWUgPSAiT19iaXRfYW5kIjsJCWJyZWFrOwotCWNhc2UgT19hZGQ6CQkJbmFtZSA9ICJPX2FkZCI7CQkJYnJlYWs7Ci0JY2FzZSBPX3N1YnRyYWN0OgkJbmFtZSA9ICJPX3N1YnRyYWN0IjsJCWJyZWFrOwotCWNhc2UgT19lcToJCQluYW1lID0gIk9fZXEiOwkJCWJyZWFrOwotCWNhc2UgT19uZToJCQluYW1lID0gIk9fbmUiOwkJCWJyZWFrOwotCWNhc2UgT19sdDoJCQluYW1lID0gIk9fbHQiOwkJCWJyZWFrOwotCWNhc2UgT19sZToJCQluYW1lID0gIk9fbGUiOwkJCWJyZWFrOwotCWNhc2UgT19nZToJCQluYW1lID0gIk9fZ2UiOwkJCWJyZWFrOwotCWNhc2UgT19ndDoJCQluYW1lID0gIk9fZ3QiOwkJCWJyZWFrOwotCWNhc2UgT19sb2dpY2FsX2FuZDoJCW5hbWUgPSAiT19sb2dpY2FsX2FuZCI7CQlicmVhazsKLQljYXNlIE9fbG9naWNhbF9vcjoJCW5hbWUgPSAiT19sb2dpY2FsX29yIjsJCWJyZWFrOwotCWNhc2UgT19pbmRleDoJCQluYW1lID0gIk9faW5kZXgiOwkJYnJlYWs7Ci0JY2FzZSBPX3ByZWdpc3RlcjoJCW5hbWUgPSAiT19wcmVnaXN0ZXIiOwkJYnJlYWs7Ci0JY2FzZSBPX2NwcmVnaXN0ZXI6CQluYW1lID0gIk9fY3ByZWdpc3RlciI7CQlicmVhazsKLQljYXNlIE9fbGl0ZXJhbDoJCQluYW1lID0gIk9fbGl0ZXJhbCI7CQlicmVhazsKLQljYXNlIE9fbGl0dXNlX2Jhc2U6CQluYW1lID0gIk9fbGl0dXNlX2Jhc2UiOwkJYnJlYWs7Ci0JY2FzZSBPX2xpdHVzZV9ieXRvZmY6CQluYW1lID0gIk9fbGl0dXNlX2J5dG9mZiI7CWJyZWFrOwotCWNhc2UgT19saXR1c2VfanNyOgkJbmFtZSA9ICJPX2xpdHVzZV9qc3IiOwkJYnJlYWs7Ci0JY2FzZSBPX2dwZGlzcDoJCQluYW1lID0gIk9fZ3BkaXNwIjsJCWJyZWFrOwotCWNhc2UgT19ncHJlbGhpZ2g6CQluYW1lID0gIk9fZ3ByZWxoaWdoIjsJCWJyZWFrOwotCWNhc2UgT19ncHJlbGxvdzoJCW5hbWUgPSAiT19ncHJlbGxvdyI7CQlicmVhazsKLQljYXNlIE9fbWQxMDoJCQluYW1lID0gIk9fbWQxMCI7CQlicmVhazsKLQljYXNlIE9fbWQxMToJCQluYW1lID0gIk9fbWQxMSI7CQlicmVhazsKLQljYXNlIE9fbWQxMjoJCQluYW1lID0gIk9fbWQxMiI7CQlicmVhazsKLQljYXNlIE9fbWQxMzoJCQluYW1lID0gIk9fbWQxMyI7CQlicmVhazsKLQljYXNlIE9fbWQxNDoJCQluYW1lID0gIk9fbWQxNCI7CQlicmVhazsKLQljYXNlIE9fbWQxNToJCQluYW1lID0gIk9fbWQxNSI7CQlicmVhazsKLQljYXNlIE9fbWQxNjoJCQluYW1lID0gIk9fbWQxNiI7CQlicmVhazsKLQl9Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiwgJXMoJXMsICVzLCAlZCkiLCBuYW1lLAotCSAgICAgICAodC0+WF9hZGRfc3ltYm9sKSA/IFNfR0VUX05BTUUgKHQtPlhfYWRkX3N5bWJvbCkgOiAiLS0iLAotCSAgICAgICAodC0+WF9vcF9zeW1ib2wpID8gU19HRVRfTkFNRSAodC0+WF9vcF9zeW1ib2wpIDogIi0tIiwKLQkgICAgICAgKGludCl0LT5YX2FkZF9udW1iZXIpOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotfQotI2VuZGlmCi0KLS8qIFBhcnNlIHRoZSBhcmd1bWVudHMgdG8gYW4gb3Bjb2RlLiAgKi8KLQotc3RhdGljIGludAotdG9rZW5pemVfYXJndW1lbnRzIChzdHIsIHRvaywgbnRvaykKLSAgICAgY2hhciAqc3RyOwotICAgICBleHByZXNzaW9uUyB0b2tbXTsKLSAgICAgaW50IG50b2s7Ci17Ci0gIGV4cHJlc3Npb25TICplbmRfdG9rID0gdG9rICsgbnRvazsKLSAgY2hhciAqb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IHNhd19jb21tYSA9IDAsIHNhd19hcmcgPSAwOwotI2lmZGVmIERFQlVHX0FMUEhBCi0gIGV4cHJlc3Npb25TICpvcmlnX3RvayA9IHRvazsKLSNlbmRpZgotI2lmZGVmIFJFTE9DX09QX1AKLSAgY2hhciAqcDsKLSAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqcjsKLSAgaW50IGMsIGk7Ci0gIHNpemVfdCBsZW47Ci0gIGludCByZWxvY19mb3VuZF9wID0gMDsKLSNlbmRpZgotCi0gIG1lbXNldCAodG9rLCAwLCBzaXplb2YgKCp0b2spICogbnRvayk7Ci0KLSAgLyogU2F2ZSBhbmQgcmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIgYXJvdW5kIHRoaXMgZnVuY3Rpb24gKi8KLSAgb2xkX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIHdoaWxlICh0b2sgPCBlbmRfdG9rICYmICppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQljYXNlICdcMCc6Ci0JICBnb3RvIGZpbmk7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0JY2FzZSAnISc6Ci0JICAvKiBBIHJlbG9jYXRpb24gb3BlcmFuZCBjYW4gYmUgcGxhY2VkIGFmdGVyIHRoZSBub3JtYWwgb3BlcmFuZCBvbiBhbgotCSAgICAgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3RhdGVtZW50LCBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybToKLQkJIXJlbG9jYXRpb25fdHlwZSFzZXF1ZW5jZV9udW1iZXIuICAqLwotCSAgaWYgKHJlbG9jX2ZvdW5kX3ApCi0JICAgIHsJCQkvKiBvbmx5IHN1cHBvcnQgb25lIHJlbG9jYXRpb24gb3AgcGVyIGluc24gKi8KLQkgICAgICBhc19iYWQgKF8oIk1vcmUgdGhhbiBvbmUgcmVsb2NhdGlvbiBvcCBwZXIgaW5zbiIpKTsKLQkgICAgICBnb3RvIGVycl9yZXBvcnQ7Ci0JICAgIH0KLQotCSAgaWYgKCFzYXdfYXJnKQotCSAgICBnb3RvIGVycjsKLQotCSAgZm9yIChwID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgICgoYyA9ICpwKSAhPSAnIScgJiYgYyAhPSAnOycgJiYgYyAhPSAnIycgJiYgYyAhPSAnLCcKLQkJJiYgIWlzX2VuZF9vZl9saW5lW2NdKTsKLQkgICAgICAgcCsrKQotCSAgICA7Ci0KLQkgIC8qIFBhcnNlICFyZWxvY2F0aW9uX3R5cGUgKi8KLQkgIGxlbiA9IHAgLSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpZiAobGVuID09IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIk5vIHJlbG9jYXRpb24gb3BlcmFuZCIpKTsKLQkgICAgICBnb3RvIGVycl9yZXBvcnQ7Ci0JICAgIH0KLQotCSAgaWYgKGMgIT0gJyEnKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJObyAhc2VxdWVuY2UtbnVtYmVyIGFmdGVyICElcyIpLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgICAgIGdvdG8gZXJyX3JlcG9ydDsKLQkgICAgfQotCi0JICByID0gJmFscGhhX3JlbG9jX29wWzBdOwotCSAgZm9yIChpID0gYWxwaGFfbnVtX3JlbG9jX29wLTE7IGkgPj0gMDsgaS0tLCByKyspCi0JICAgIHsKLQkgICAgICBpZiAobGVuID09IHItPmxlbmd0aAotCQkgICYmIG1lbWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCByLT5uYW1lLCBsZW4pID09IDApCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoaSA8IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIlVua25vd24gcmVsb2NhdGlvbiBvcGVyYW5kOiAhJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICAgICBnb3RvIGVycl9yZXBvcnQ7Ci0JICAgIH0KLQotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gKytwOwotCi0JICAvKiBQYXJzZSAhc2VxdWVuY2VfbnVtYmVyICovCi0JICBtZW1zZXQgKHRvaywgJ1wwJywgc2l6ZW9mIChleHByZXNzaW9uUykpOwotCSAgZXhwcmVzc2lvbiAodG9rKTsKLQotCSAgaWYgKHRvay0+WF9vcCAhPSBPX2NvbnN0YW50Ci0JICAgICAgfHwgISBBTFBIQV9SRUxPQ19TRVFVRU5DRV9PSyAodG9rLT5YX2FkZF9udW1iZXIpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJCYWQgc2VxdWVuY2UgbnVtYmVyOiAhJXMhJXMiKSwgci0+bmFtZSwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICAgICBnb3RvIGVycl9yZXBvcnQ7Ci0JICAgIH0KLQotCSAgdG9rLT5YX29wID0gci0+b3A7Ci0JICByZWxvY19mb3VuZF9wID0gMTsKLQkgICsrdG9rOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgJywnOgotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpZiAoc2F3X2NvbW1hIHx8ICFzYXdfYXJnKQotCSAgICBnb3RvIGVycjsKLQkgIHNhd19jb21tYSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJygnOgotCSAgewotCSAgICBjaGFyICpob2xkID0gaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLQkgICAgLyogRmlyc3QgdHJ5IGZvciBwYXJlbnRoZXNpemVkIHJlZ2lzdGVyIC4uLiAqLwotCSAgICBleHByZXNzaW9uICh0b2spOwotCSAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKScgJiYgdG9rLT5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgICAgewotCQl0b2stPlhfb3AgPSAoc2F3X2NvbW1hID8gT19jcHJlZ2lzdGVyIDogT19wcmVnaXN0ZXIpOwotCQlzYXdfY29tbWEgPSAwOwotCQlzYXdfYXJnID0gMTsKLQkJKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSsrdG9rOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogLi4uIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHBsYWluIGV4cHJlc3Npb24gKi8KLQkgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgIH0KLQotCWRlZmF1bHQ6Ci0JICBpZiAoc2F3X2FyZyAmJiAhc2F3X2NvbW1hKQotCSAgICBnb3RvIGVycjsKLQotCSAgZXhwcmVzc2lvbiAodG9rKTsKLQkgIGlmICh0b2stPlhfb3AgPT0gT19pbGxlZ2FsIHx8IHRvay0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgZ290byBlcnI7Ci0KLQkgIHNhd19jb21tYSA9IDA7Ci0JICBzYXdfYXJnID0gMTsKLQkgICsrdG9rOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotZmluaToKLSAgaWYgKHNhd19jb21tYSkKLSAgICBnb3RvIGVycjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotI2lmZGVmIERFQlVHX0FMUEhBCi0gIGRlYnVnX2V4cCAob3JpZ190b2ssIG50b2sgLSAoZW5kX3RvayAtIHRvaykpOwotI2VuZGlmCi0KLSAgcmV0dXJuIG50b2sgLSAoZW5kX3RvayAtIHRvayk7Ci0KLWVycjoKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgcmV0dXJuIFRPS0VOSVpFX0VSUk9SOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotZXJyX3JlcG9ydDoKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgcmV0dXJuIFRPS0VOSVpFX0VSUk9SX1JFUE9SVDsKLSNlbmRpZgotfQotCi0vKiBTZWFyY2ggZm9yd2FyZCB0aHJvdWdoIGFsbCB2YXJpYW50cyBvZiBhbiBvcGNvZGUgbG9va2luZyBmb3IgYQotICAgc3ludGF4IG1hdGNoLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKgotZmluZF9vcGNvZGVfbWF0Y2goZmlyc3Rfb3Bjb2RlLCB0b2ssIHBudG9rLCBwY3B1bWF0Y2gpCi0gICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKmZpcnN0X29wY29kZTsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50ICpwbnRvazsKLSAgICAgaW50ICpwY3B1bWF0Y2g7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZSA9IGZpcnN0X29wY29kZTsKLSAgaW50IG50b2sgPSAqcG50b2s7Ci0gIGludCBnb3RfY3B1X21hdGNoID0gMDsKLQotICBkbwotICAgIHsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waWR4OwotICAgICAgaW50IHRva2lkeCA9IDA7Ci0KLSAgICAgIC8qIERvbid0IG1hdGNoIG9wY29kZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIGFyY2hpdGVjdHVyZSAqLwotICAgICAgaWYgKCEob3Bjb2RlLT5mbGFncyAmIGFscGhhX3RhcmdldCkpCi0JZ290byBtYXRjaF9mYWlsZWQ7Ci0KLSAgICAgIGdvdF9jcHVfbWF0Y2ggPSAxOwotCi0gICAgICBmb3IgKG9waWR4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waWR4OyArK29waWR4KQotCXsKLQkgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWypvcGlkeF07Ci0KLQkgIC8qIG9ubHkgdGFrZSBpbnB1dCBmcm9tIHJlYWwgb3BlcmFuZHMgKi8KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZBS0UpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiB3aGVuIHdlIGV4cGVjdCBpbnB1dCwgbWFrZSBzdXJlIHdlIGhhdmUgaXQgKi8KLQkgIGlmICh0b2tpZHggPj0gbnRvaykKLQkgICAgewotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9PUFRJT05BTF9NQVNLKSA9PSAwKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBtYXRjaCBvcGVyYW5kIHR5cGUgd2l0aCBleHByZXNzaW9uIHR5cGUgKi8KLQkgIHN3aXRjaCAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9UWVBFQ0hFQ0tfTUFTSykKLQkgICAgewotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0lSOgotCSAgICAgIGlmICh0b2tbdG9raWR4XS5YX29wICE9IE9fcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0ZQUjoKLQkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2Zwcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TOgotCSAgICAgIGlmICh0b2tbdG9raWR4XS5YX29wICE9IE9fcHJlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9QQVJFTlN8QVhQX09QRVJBTkRfQ09NTUE6Ci0JICAgICAgaWYgKHRva1t0b2tpZHhdLlhfb3AgIT0gT19jcHJlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFYUF9PUEVSQU5EX1JFTEFUSVZFOgotCSAgICBjYXNlIEFYUF9PUEVSQU5EX1NJR05FRDoKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9VTlNJR05FRDoKLQkgICAgICBzd2l0Y2ggKHRva1t0b2tpZHhdLlhfb3ApCi0JCXsKLQkJY2FzZSBPX2lsbGVnYWw6Ci0JCWNhc2UgT19hYnNlbnQ6Ci0JCWNhc2UgT19yZWdpc3RlcjoKLQkJY2FzZSBPX3ByZWdpc3RlcjoKLQkJY2FzZSBPX2NwcmVnaXN0ZXI6Ci0JCSAgZ290byBtYXRjaF9mYWlsZWQ7Ci0KLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogZXZlcnl0aGluZyBlbHNlIHNob3VsZCBoYXZlIGJlZW4gZmFrZSAqLwotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQkgICsrdG9raWR4OwotCX0KLQotICAgICAgLyogcG9zc2libGUgbWF0Y2ggLS0gZGlkIHdlIHVzZSBhbGwgb2Ygb3VyIGlucHV0PyAqLwotICAgICAgaWYgKHRva2lkeCA9PSBudG9rKQotCXsKLQkgICpwbnRvayA9IG50b2s7Ci0JICByZXR1cm4gb3Bjb2RlOwotCX0KLQotICAgIG1hdGNoX2ZhaWxlZDo7Ci0gICAgfQotICB3aGlsZSAoKytvcGNvZGUtYWxwaGFfb3Bjb2RlcyA8IGFscGhhX251bV9vcGNvZGVzCi0JICYmICFzdHJjbXAob3Bjb2RlLT5uYW1lLCBmaXJzdF9vcGNvZGUtPm5hbWUpKTsKLQotICBpZiAoKnBjcHVtYXRjaCkKLSAgICAgICpwY3B1bWF0Y2ggPSBnb3RfY3B1X21hdGNoOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZWFyY2ggZm9yd2FyZCB0aHJvdWdoIGFsbCB2YXJpYW50cyBvZiBhIG1hY3JvIGxvb2tpbmcgZm9yIGEgc3ludGF4Ci0gICBtYXRjaC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKgotZmluZF9tYWNyb19tYXRjaChmaXJzdF9tYWNybywgdG9rLCBwbnRvaykKLSAgICAgY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICpmaXJzdF9tYWNybzsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50ICpwbnRvazsKLXsKLSAgY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICptYWNybyA9IGZpcnN0X21hY3JvOwotICBpbnQgbnRvayA9ICpwbnRvazsKLQotICBkbwotICAgIHsKLSAgICAgIGNvbnN0IGVudW0gYWxwaGFfbWFjcm9fYXJnICphcmcgPSBtYWNyby0+YXJnc2V0czsKLSAgICAgIGludCB0b2tpZHggPSAwOwotCi0gICAgICB3aGlsZSAoKmFyZykKLQl7Ci0JICBzd2l0Y2ggKCphcmcpCi0JICAgIHsKLQkgICAgY2FzZSBNQUNST19FT0E6Ci0JICAgICAgaWYgKHRva2lkeCA9PSBudG9rKQotCQlyZXR1cm4gbWFjcm87Ci0JICAgICAgZWxzZQotCQl0b2tpZHggPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgICAgLyogaW5kZXggcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSBNQUNST19JUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIHBhcmVudGhlc2l6ZWQgaW5kZXggcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSBNQUNST19QSVI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19wcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCi0JICAgICAgLyogb3B0aW9uYWwgcGFyZW50aGVzaXplZCBpbmRleCByZWdpc3RlciAqLwotCSAgICBjYXNlIE1BQ1JPX09QSVI6Ci0JICAgICAgaWYgKHRva2lkeCA8IG50b2sgJiYgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX3ByZWdpc3RlcgotCQkgICYmIGlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQkrK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIGxlYWRpbmcgY29tbWEgd2l0aCBhIHBhcmVudGhlc2l6ZWQgaW5kZXggcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSBNQUNST19DUElSOgotCSAgICAgIGlmICh0b2tpZHggPj0gbnRvayB8fCB0b2tbdG9raWR4XS5YX29wICE9IE9fY3ByZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgKyt0b2tpZHg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAvKiBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotCSAgICBjYXNlIE1BQ1JPX0ZQUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2Zwcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgKyt0b2tpZHg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAvKiBub3JtYWwgZXhwcmVzc2lvbiAqLwotCSAgICBjYXNlIE1BQ1JPX0VYUDoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2spCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIHN3aXRjaCAodG9rW3Rva2lkeF0uWF9vcCkKLQkJewotCQljYXNlIE9faWxsZWdhbDoKLQkJY2FzZSBPX2Fic2VudDoKLQkJY2FzZSBPX3JlZ2lzdGVyOgotCQljYXNlIE9fcHJlZ2lzdGVyOgotCQljYXNlIE9fY3ByZWdpc3RlcjoKLSNpZmRlZiBSRUxPQ19PUF9QCi0JCWNhc2UgT19saXRlcmFsOgotCQljYXNlIE9fbGl0dXNlX2Jhc2U6Ci0JCWNhc2UgT19saXR1c2VfYnl0b2ZmOgotCQljYXNlIE9fbGl0dXNlX2pzcjoKLQkJY2FzZSBPX2dwZGlzcDoKLQkJY2FzZSBPX2dwcmVsaGlnaDoKLQkJY2FzZSBPX2dwcmVsbG93OgotI2VuZGlmCi0JCSAgZ290byBtYXRjaF9mYWlsZWQ7Ci0KLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCi0JICAgICAgLyogb3B0aW9uYWwgIWxpdGVyYWwhPG51bWJlcj4gKi8KLQkgICAgY2FzZSBNQUNST19MSVRFUkFMOgotI2lmZGVmIFJFTE9DX09QX1AKLQkgICAgICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fbGl0ZXJhbCkKLQkJdG9raWR4Kys7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIG9wdGlvbmFsICFsaXR1c2VfYmFzZSE8bnVtYmVyPiAqLwotCSAgICBjYXNlIE1BQ1JPX0JBU0U6Ci0jaWZkZWYgUkVMT0NfT1BfUAotCSAgICAgIGlmICh0b2tpZHggPCBudG9rICYmIHRva1t0b2tpZHhdLlhfb3AgPT0gT19saXR1c2VfYmFzZSkKLQkJdG9raWR4Kys7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIG9wdGlvbmFsICFsaXR1c2VfYnl0b2ZmITxudW1iZXI+ICovCi0JICAgIGNhc2UgTUFDUk9fQllUT0ZGOgotI2lmZGVmIFJFTE9DX09QX1AKLQkgICAgICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fbGl0dXNlX2J5dG9mZikKLQkJdG9raWR4Kys7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIG9wdGlvbmFsICFsaXR1c2VfanNyITxudW1iZXI+ICovCi0JICAgIGNhc2UgTUFDUk9fSlNSOgotI2lmZGVmIFJFTE9DX09QX1AKLQkgICAgICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fbGl0dXNlX2pzcikKLQkJdG9raWR4Kys7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICBtYXRjaF9mYWlsZWQ6Ci0JICAgICAgd2hpbGUgKCphcmcgIT0gTUFDUk9fRU9BKQotCQkrK2FyZzsKLQkgICAgICB0b2tpZHggPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICArK2FyZzsKLQl9Ci0gICAgfQotICB3aGlsZSAoKyttYWNyby1hbHBoYV9tYWNyb3MgPCBhbHBoYV9udW1fbWFjcm9zCi0JICYmICFzdHJjbXAobWFjcm8tPm5hbWUsIGZpcnN0X21hY3JvLT5uYW1lKSk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9vcGVyYW5kKGluc24sIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMiAmJiAhKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfTk9PVkVSRkxPVykpCi0gICAgewotICAgICAgb2Zmc2V0VCBtaW4sIG1heDsKLQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKQotCXsKLQkgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0oMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgbWluID0gMDsKLQl9Ci0KLSAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KQotCXsKLQkgIGNvbnN0IGNoYXIgKmVyciA9Ci0JICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlZCBhbmQgJWQpIik7Ci0JICBjaGFyIGJ1ZltzaXplb2YgKHZhbCkgKiAzICsgMl07Ci0KLQkgIHNwcmludF92YWx1ZShidWYsIHZhbCk7Ci0JICBpZiAoZmlsZSkKLQkgICAgYXNfd2Fybl93aGVyZShmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgZWxzZQotCSAgICBhc193YXJuKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIHZhbCwgJmVycm1zZyk7Ci0gICAgICBpZiAoZXJybXNnKQotCWFzX3dhcm4gKGVycm1zZyk7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zbiB8PSAoKHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qCi0gKiBUdXJuIGFuIG9wY29kZSBkZXNjcmlwdGlvbiBhbmQgYSBzZXQgb2YgYXJndW1lbnRzIGludG8KLSAqIGFuIGluc3RydWN0aW9uIGFuZCBhIGZpeHVwLgotICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV9pbnNuKG9wY29kZSwgdG9rLCBudG9rLCBpbnNuKQotICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYXJnaWR4OwotICB1bnNpZ25lZCBpbWFnZTsKLSAgaW50IHRva2lkeCA9IDA7Ci0KLSAgbWVtc2V0IChpbnNuLCAwLCBzaXplb2YgKCppbnNuKSk7Ci0gIGltYWdlID0gb3Bjb2RlLT5vcGNvZGU7Ci0KLSAgZm9yIChhcmdpZHggPSBvcGNvZGUtPm9wZXJhbmRzOyAqYXJnaWR4OyArK2FyZ2lkeCkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1sqYXJnaWR4XTsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0ID0gKGNvbnN0IGV4cHJlc3Npb25TICopMDsKLQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfRkFLRSkKLQl7Ci0JICAvKiBmYWtlIG9wZXJhbmRzIHRha2Ugbm8gdmFsdWUgYW5kIGdlbmVyYXRlIG5vIGZpeHVwICovCi0JICBpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCAwLCBOVUxMLCAwKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHRva2lkeCA+PSBudG9rKQotCXsKLQkgIHN3aXRjaCAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9PUFRJT05BTF9NQVNLKQotCSAgICB7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfREVGQVVMVF9GSVJTVDoKLQkgICAgICB0ID0gJnRva1swXTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORDoKLQkgICAgICB0ID0gJnRva1sxXTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk86Ci0JICAgICAgewotCQlzdGF0aWMgZXhwcmVzc2lvblMgemVyb19leHA7Ci0JCXQgPSAmemVyb19leHA7Ci0JCXplcm9fZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCQl6ZXJvX2V4cC5YX3Vuc2lnbmVkID0gMTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl0ID0gJnRva1t0b2tpZHgrK107Ci0KLSAgICAgIHN3aXRjaCAodC0+WF9vcCkKLQl7Ci0JY2FzZSBPX3JlZ2lzdGVyOgotCWNhc2UgT19wcmVnaXN0ZXI6Ci0JY2FzZSBPX2NwcmVnaXN0ZXI6Ci0JICBpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCByZWdubyh0LT5YX2FkZF9udW1iZXIpLAotCQkJCSBOVUxMLCAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX2NvbnN0YW50OgotCSAgaW1hZ2UgPSBpbnNlcnRfb3BlcmFuZChpbWFnZSwgb3BlcmFuZCwgdC0+WF9hZGRfbnVtYmVyLCBOVUxMLCAwKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHsKLQkgICAgc3RydWN0IGFscGhhX2ZpeHVwICpmaXh1cDsKLQotCSAgICBpZiAoaW5zbi0+bmZpeHVwcyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgICAgYXNfZmF0YWwoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICAgIGZpeHVwID0gJmluc24tPmZpeHVwc1tpbnNuLT5uZml4dXBzKytdOwotCi0JICAgIGZpeHVwLT5leHAgPSAqdDsKLQkgICAgZml4dXAtPnJlbG9jID0gb3BlcmFuZC0+ZGVmYXVsdF9yZWxvYzsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaW5zbi0+aW5zbiA9IGltYWdlOwotfQotCi0vKgotICogQWN0dWFsbHkgb3V0cHV0IGFuIGluc3RydWN0aW9uIHdpdGggaXRzIGZpeHVwLgotICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2luc24gKGluc24pCi0gICAgc3RydWN0IGFscGhhX2luc24gKmluc247Ci17Ci0gIGNoYXIgKmY7Ci0gIGludCBpOwotCi0gIC8qIFRha2UgY2FyZSBvZiBhbGlnbm1lbnQgZHV0aWVzICovCi0gIGlmIChhbHBoYV9hdXRvX2FsaWduX29uICYmIGFscGhhX2N1cnJlbnRfYWxpZ24gPCAyKQotICAgIGFscGhhX2FsaWduICgyLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiAyKQotICAgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAyOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbi0+aW5zbiwgNCk7Ci0KLSAgLyogQXBwbHkgdGhlIGZpeHVwcyBpbiBvcmRlciAqLwotICBmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bmZpeHVwczsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gKGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICopMDsKLSAgICAgIHN0cnVjdCBhbHBoYV9maXh1cCAqZml4dXAgPSAmaW5zbi0+Zml4dXBzW2ldOwotICAgICAgaW50IHNpemUsIHBjcmVsOwotICAgICAgZml4UyAqZml4UDsKLSNpZmRlZiBSRUxPQ19PUF9QCi0gICAgICBjaGFyIGJ1ZmZlcltBTFBIQV9SRUxPQ19ESUdJVFNdOwotICAgICAgc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnICppbmZvOwotI2VuZGlmCi0KLSAgICAgIC8qIFNvbWUgZml4dXBzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBhbmQgc28gaGF2ZSBubyBob3d0byAqLwotICAgICAgaWYgKChpbnQpZml4dXAtPnJlbG9jIDwgMCkKLQl7Ci0JICBvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWy0oaW50KWZpeHVwLT5yZWxvY107Ci0JICBzaXplID0gNDsKLQkgIHBjcmVsID0gKChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1JFTEFUSVZFKSAhPSAwKTsKLQl9Ci0gICAgICBlbHNlIHN3aXRjaCAoZml4dXAtPnJlbG9jKQotCXsKLSNpZmRlZiBPQkpfRUxGCi0JICAvKiBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseS4gKi8KLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjoKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLQkgIHNpemUgPSAyOwotCSAgcGNyZWwgPSAwOwotCSAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBSRUxPQ19PUF9QCi0JICAvKiBhbmQgdGhlc2UgYWxzbyBhcmUgaW50ZXJuYWwgb25seSByZWxvY2F0aW9ucyAqLwotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTDoKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFOgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1I6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1A6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0g6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVzoKLQkgIHNpemUgPSAyOwotCSAgcGNyZWwgPSAwOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvCi0JICAgICAgPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4dXAtPnJlbG9jKTsKLQkgICAgYXNzZXJ0IChyZWxvY19ob3d0byk7Ci0KLQkgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCSAgICBwY3JlbCA9IHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZTsKLQkgIH0KLQkgIGFzc2VydCAoc2l6ZSA+PSAxICYmIHNpemUgPD0gNCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKLQkJCSAgJmZpeHVwLT5leHAsIHBjcmVsLCBmaXh1cC0+cmVsb2MpOwotCi0gICAgICAvKiBUdXJuIG9mZiBjb21wbGFpbnRzIHRoYXQgdGhlIGFkZGVuZCBpcyB0b28gbGFyZ2UgZm9yIHNvbWUgZml4dXBzLAotICAgICAgICAgYW5kIGNvcHkgaW4gdGhlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIGV4cGxpY2l0IHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIHN3aXRjaCAoZml4dXAtPnJlbG9jKQotCXsKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSNpZmRlZiBPQkpfRUNPRkYKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotI2VuZGlmCi0JY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLQkgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgIGJyZWFrOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTDoKLQkgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgIHNwcmludGYgKGJ1ZmZlciwgIiEldSIsIGluc24tPnNlcXVlbmNlW2ldKTsKLQkgIGluZm8gPSAoKHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZyAqKQotCQkgIGhhc2hfZmluZCAoYWxwaGFfbGl0ZXJhbF9oYXNoLCBidWZmZXIpKTsKLQotCSAgaWYgKCEgaW5mbykKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGJ1ZmZlcik7Ci0JICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0JICAgICAgaW5mbyA9ICgoc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnICopCi0JCSAgICAgIHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnKSArIGxlbiwgMSkpOwotCi0JICAgICAgaW5mby0+c2VnbWVudCA9IG5vd19zZWc7Ci0JICAgICAgaW5mby0+c2VxdWVuY2UgPSBpbnNuLT5zZXF1ZW5jZVtpXTsKLQkgICAgICBzdHJjcHkgKGluZm8tPnN0cmluZywgYnVmZmVyKTsKLQkgICAgICBlcnJtc2cgPSBoYXNoX2luc2VydCAoYWxwaGFfbGl0ZXJhbF9oYXNoLCBpbmZvLT5zdHJpbmcsIChQVFIpaW5mbyk7Ci0JICAgICAgaWYgKGVycm1zZykKLQkJYXNfYmFkIChlcnJtc2cpOwotCSAgICB9Ci0KLQkgICsraW5mby0+bl9saXRlcmFsczsKLQotCSAgaWYgKGluZm8tPnNlZ21lbnQgIT0gbm93X3NlZykKLQkgICAgaW5mby0+bXVsdGlfc2VjdGlvbl9wID0gMTsKLQotCSAgZml4UC0+dGNfZml4X2RhdGEuaW5mbyA9IGluZm87Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0U6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGOgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUjoKLQkgIHNwcmludGYgKGJ1ZmZlciwgIiEldSIsIGluc24tPnNlcXVlbmNlW2ldKTsKLQkgIGluZm8gPSAoKHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZyAqKQotCQkgIGhhc2hfZmluZCAoYWxwaGFfbGl0ZXJhbF9oYXNoLCBidWZmZXIpKTsKLQotCSAgaWYgKCEgaW5mbykKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGJ1ZmZlcik7Ci0JICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0JICAgICAgaW5mbyA9ICgoc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnICopCi0JCSAgICAgIHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnKSArIGxlbiwgMSkpOwotCi0JICAgICAgaW5mby0+c2VnbWVudCA9IG5vd19zZWc7Ci0JICAgICAgaW5mby0+c2VxdWVuY2UgPSBpbnNuLT5zZXF1ZW5jZVtpXTsKLQkgICAgICBzdHJjcHkgKGluZm8tPnN0cmluZywgYnVmZmVyKTsKLQkgICAgICBlcnJtc2cgPSBoYXNoX2luc2VydCAoYWxwaGFfbGl0ZXJhbF9oYXNoLCBpbmZvLT5zdHJpbmcsIChQVFIpaW5mbyk7Ci0JICAgICAgaWYgKGVycm1zZykKLQkJYXNfYmFkIChlcnJtc2cpOwotCSAgICB9Ci0JICBpbmZvLT5uX2xpdHVzZXMrKzsKLQkgIGZpeFAtPnRjX2ZpeF9kYXRhLmluZm8gPSBpbmZvOwotCSAgZml4UC0+dGNfZml4X2RhdGEubmV4dF9saXR1c2UgPSBpbmZvLT5saXR1c2U7Ci0JICBpbmZvLT5saXR1c2UgPSBmaXhQOwotCSAgaWYgKGluZm8tPnNlZ21lbnQgIT0gbm93X3NlZykKLQkgICAgaW5mby0+bXVsdGlfc2VjdGlvbl9wID0gMTsKLQotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWRlZmF1bHQ6Ci0JICBpZiAoKGludClmaXh1cC0+cmVsb2MgPCAwKQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfTk9PVkVSRkxPVykKLQkJZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhbiBvcGNvZGUgbmFtZSBhbmQgYSBwcmUtdG9rZW5pemVkIHNldCBvZiBhcmd1bWVudHMsIGFzc2VtYmxlCi0gICB0aGUgaW5zbiwgYnV0IGRvIG5vdCBlbWl0IGl0LgotCi0gICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzIG5vIG1hY3JvcyBhbGxvd2VkLCBzaW5jZSB3ZSBjYW4ndCBzdG9yZSBtb3JlCi0gICB0aGFuIG9uZSBpbnNuIGluIGFuIGluc24gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzc2VtYmxlX3Rva2Vuc190b19pbnNuKG9wbmFtZSwgdG9rLCBudG9rLCBpbnNuKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlOwotCi0gIC8qIHNlYXJjaCBvcGNvZGVzICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICopIGhhc2hfZmluZCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG9wbmFtZSk7Ci0gIGlmIChvcGNvZGUpCi0gICAgewotICAgICAgaW50IGNwdW1hdGNoOwotICAgICAgb3Bjb2RlID0gZmluZF9vcGNvZGVfbWF0Y2ggKG9wY29kZSwgdG9rLCAmbnRvaywgJmNwdW1hdGNoKTsKLSAgICAgIGlmIChvcGNvZGUpCi0JewotCSAgYXNzZW1ibGVfaW5zbiAob3Bjb2RlLCB0b2ssIG50b2ssIGluc24pOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKGNwdW1hdGNoKQotCWFzX2JhZCAoXygiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiKSwgb3BuYW1lLAotCSAgICAgICAgYWxwaGFfdGFyZ2V0X25hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotfQotCi0vKiBHaXZlbiBhbiBvcGNvZGUgbmFtZSBhbmQgYSBwcmUtdG9rZW5pemVkIHNldCBvZiBhcmd1bWVudHMsIHRha2UgdGhlCi0gICBvcGNvZGUgYWxsIHRoZSB3YXkgdGhyb3VnaCBlbWlzc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV90b2tlbnMgKG9wbmFtZSwgdG9rLCBudG9rLCBsb2NhbF9tYWNyb3Nfb24pCi0gICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGludCBsb2NhbF9tYWNyb3Nfb247Ci17Ci0gIGludCBmb3VuZF9zb21ldGhpbmcgPSAwOwotICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqbWFjcm87Ci0gIGludCBjcHVtYXRjaCA9IDE7Ci0KLSAgLyogc2VhcmNoIG1hY3JvcyAqLwotICBpZiAobG9jYWxfbWFjcm9zX29uKQotICAgIHsKLSAgICAgIG1hY3JvID0gKChjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKikKLQkgICAgICAgaGFzaF9maW5kIChhbHBoYV9tYWNyb19oYXNoLCBvcG5hbWUpKTsKLSAgICAgIGlmIChtYWNybykKLQl7Ci0JICBmb3VuZF9zb21ldGhpbmcgPSAxOwotCSAgbWFjcm8gPSBmaW5kX21hY3JvX21hdGNoIChtYWNybywgdG9rLCAmbnRvayk7Ci0JICBpZiAobWFjcm8pCi0JICAgIHsKLQkgICAgICAoKm1hY3JvLT5lbWl0KSAodG9rLCBudG9rLCBtYWNyby0+YXJnKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkgICAgICAoaW50KXJlbG9jX2V4cC0+WF9hZGRfbnVtYmVyLCBvcG5hbWUpOwotICAgICAgbnRvay0tOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIHNlYXJjaCBvcGNvZGVzICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICopIGhhc2hfZmluZCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG9wbmFtZSk7Ci0gIGlmIChvcGNvZGUpCi0gICAgewotICAgICAgZm91bmRfc29tZXRoaW5nID0gMTsKLSAgICAgIG9wY29kZSA9IGZpbmRfb3Bjb2RlX21hdGNoIChvcGNvZGUsIHRvaywgJm50b2ssICZjcHVtYXRjaCk7Ci0gICAgICBpZiAob3Bjb2RlKQotCXsKLQkgIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0JICBhc3NlbWJsZV9pbnNuIChvcGNvZGUsIHRvaywgbnRvaywgJmluc24pOwotCSAgZW1pdF9pbnNuICgmaW5zbik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZm91bmRfc29tZXRoaW5nKQotICAgIGlmIChjcHVtYXRjaCkKLSAgICAgIGFzX2JhZCAoXygiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci0gICAgZWxzZQotICAgICAgYXNfYmFkIChfKCJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiKSwgb3BuYW1lLAotCSAgICAgIGFscGhhX3RhcmdldF9uYW1lKTsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotfQotCi0MCi0vKiBTb21lIGluc3RydWN0aW9uIHNldHMgaW5kZXhlZCBieSBsZyhzaXplKSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZXh0WF9vcFtdID0geyAic2V4dGIiLCAic2V4dHciLCAic2V4dGwiLCBOVUxMIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluc1hsX29wW10gPSB7ICJpbnNibCIsICJpbnN3bCIsICJpbnNsbCIsICJpbnNxbCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5zWGhfb3BbXSA9IHsgTlVMTCwgICAgImluc3doIiwgImluc2xoIiwgImluc3FoIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRYbF9vcFtdID0geyAiZXh0YmwiLCAiZXh0d2wiLCAiZXh0bGwiLCAiZXh0cWwiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dFhoX29wW10gPSB7IE5VTEwsICAgICJleHR3aCIsICJleHRsaCIsICJleHRxaCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNrWGxfb3BbXSA9IHsgIm1za2JsIiwgIm1za3dsIiwgIm1za2xsIiwgIm1za3FsIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2tYaF9vcFtdID0geyBOVUxMLCAgICAibXNrd2giLCAibXNrbGgiLCAibXNrcWgiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN0WF9vcFtdID0geyAic3RiIiwgInN0dyIsICJzdGwiLCAic3RxIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZFhfb3BbXSA9IHsgImxkYiIsICJsZHciLCAibGRsbCIsICJsZHEiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxkWHVfb3BbXSA9IHsgImxkYnUiLCAibGR3dSIsIE5VTEwsIE5VTEwgfTsKLQotLyogSW1wbGVtZW50IHRoZSBsZGdwIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRncCAodG9rLCBudG9rLCB1bnVzZWQpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IFBUUiB1bnVzZWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBPQkpfQU9VVAotRklYTUUKLSNlbmRpZgotI2lmIGRlZmluZWQoT0JKX0VDT0ZGKSB8fCBkZWZpbmVkKE9CSl9FTEYpCi0gIC8qIGZyb20gImxkZ3AgcjEsbihyMikiLCBnZW5lcmF0ZSAibGRhaCByMSxYKFIyKTsgbGRhIHIxLFkocjEpIgotICAgICB3aXRoIGFwcHJvcHJpYXRlIGNvbnN0YW50cyBhbmQgcmVsb2NhdGlvbnMuICAqLwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0gIGV4cHJlc3Npb25TIGFkZGVuZDsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKG50b2sgJiYgVVNFUl9SRUxPQ19QICh0b2tbbnRvay0xXS5YX29wKSkKLSAgICB7Ci0gICAgICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2NfZXhwID0gJnRva1tudG9rLTFdOwotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvY19leHAtPlhfb3ApOwotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JICAgICAgKGludClyZWxvY19leHAtPlhfYWRkX251bWJlciwgImxkZ3AiKTsKLSAgICAgIG50b2stLTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FQ09GRgotICBpZiAocmVnbm8gKHRva1syXS5YX2FkZF9udW1iZXIpID09IEFYUF9SRUdfUFYpCi0gICAgZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplICgwKTsKLSNlbmRpZgotCi0gIG5ld3Rva1swXSA9IHRva1swXTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgbmV3dG9rWzJdID0gdG9rWzJdOwotCi0gIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRhaCIsIG5ld3RvaywgMywgJmluc24pOwotCi0gIGFkZGVuZCA9IHRva1sxXTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICBpZiAoYWRkZW5kLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICBhc19iYWQgKF8oImNhbiBub3QgcmVzb2x2ZSBleHByZXNzaW9uIikpOwotICBhZGRlbmQuWF9vcCA9IE9fc3ltYm9sOwotICBhZGRlbmQuWF9hZGRfc3ltYm9sID0gYWxwaGFfZ3Bfc3ltYm9sOwotI2VuZGlmCi0KLSAgaW5zbi5uZml4dXBzID0gMTsKLSAgaW5zbi5maXh1cHNbMF0uZXhwID0gYWRkZW5kOwotICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjsKLQotICBlbWl0X2luc24gKCZpbnNuKTsKLQotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgdG9rWzBdLlhfYWRkX251bWJlcik7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGEiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICBhZGRlbmQuWF9hZGRfbnVtYmVyICs9IDQ7Ci0jZW5kaWYKLQotICBpbnNuLm5maXh1cHMgPSAxOwotICBpbnNuLmZpeHVwc1swXS5leHAgPSBhZGRlbmQ7Ci0gIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OwotCi0gIGVtaXRfaW5zbiAoJmluc24pOwotI2VuZGlmIC8qIE9CSl9FQ09GRiB8fCBPQkpfRUxGICovCi19Ci0KLSNpZmRlZiBPQkpfRVZBWAotCi0vKiBBZGQgc3ltYm9sK2FkZGVuZCB0byBsaW5rIHBvb2wuCi0gICBSZXR1cm4gb2Zmc2V0IGZyb20gYmFzZXN5bSB0byBlbnRyeSBpbiBsaW5rIHBvb2wuCi0KLSAgIEFkZCBuZXcgZml4dXAgb25seSBpZiBvZmZzZXQgaXNuJ3QgMTZiaXQuICAqLwotCi12YWx1ZVQKLWFkZF90b19saW5rX3Bvb2wgKGJhc2VzeW0sIHN5bSwgYWRkZW5kKQotICAgICBzeW1ib2xTICpiYXNlc3ltOwotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIG9mZnNldFQgYWRkZW5kOwotewotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY190eXBlOwotICBjaGFyICpwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChhbHBoYV9saW5rX3NlY3Rpb24pOwotICBmaXhTICpmaXhwOwotCi0gIG9mZnNldCA9IC0gKnN5bWJvbF9nZXRfb2JqIChiYXNlc3ltKTsKLQotICAvKiBAQCBUaGlzIGFzc3VtZXMgYWxsIGVudHJpZXMgaW4gYSBnaXZlbiBzZWN0aW9uIHdpbGwgYmUgb2YgdGhlIHNhbWUKLSAgICAgc2l6ZS4uLiAgUHJvYmFibHkgY29ycmVjdCwgYnV0IHVud2lzZSB0byByZWx5IG9uLiAgKi8KLSAgLyogVGhpcyBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBzdWJzZWdtZW50LiAgKi8KLQotICBpZiAoc2VnaW5mby0+ZnJjaGFpblApCi0gICAgZm9yIChmaXhwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZpeF9yb290OwotCSBmaXhwICE9IChmaXhTICopIE5VTEw7Ci0JIGZpeHAgPSBmaXhwLT5meF9uZXh0LCBvZmZzZXQgKz0gOCkKLSAgICAgIHsKLQlpZiAoZml4cC0+ZnhfYWRkc3kgPT0gc3ltICYmIGZpeHAtPmZ4X29mZnNldCA9PSBhZGRlbmQpCi0JICB7Ci0JICAgIGlmIChyYW5nZV9zaWduZWRfMTYgKG9mZnNldCkpCi0JICAgICAgewotCSAgICAgICAgcmV0dXJuIG9mZnNldDsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0KLSAgLyogTm90IGZvdW5kIGluIDE2Yml0IHNpZ25lZCByYW5nZS4gICovCi0KLSAgc3Vic2VnX3NldCAoYWxwaGFfbGlua19zZWN0aW9uLCAwKTsKLSAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gIG1lbXNldCAocCwgMCwgOCk7Ci0KLSAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgc3ltLCBhZGRlbmQsIDAsCi0JICAgQkZEX1JFTE9DXzY0KTsKLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gODsKLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotI2VuZGlmIC8qIE9CSl9FVkFYICovCi0KLS8qIExvYWQgYSAocGFydGlhbCkgZXhwcmVzc2lvbiBpbnRvIGEgdGFyZ2V0IHJlZ2lzdGVyLgotCi0gICBJZiBwb2Zmc2V0IGlzIG5vdCBudWxsLCBhZnRlciB0aGUgY2FsbCBpdCB3aWxsIGVpdGhlciBjb250YWluCi0gICBPX2NvbnN0YW50IDAsIG9yIGEgMTYtYml0IG9mZnNldCBhcHByb3ByaWF0ZSBmb3IgYW55IE1FTSBmb3JtYXQKLSAgIGluc3RydWN0aW9uLiAgSW4gYWRkaXRpb24sIHBiYXNlcmVnIHdpbGwgYmUgbW9kaWZpZWQgdG8gcG9pbnQgdG8KLSAgIHRoZSBiYXNlIHJlZ2lzdGVyIHRvIHVzZSBpbiB0aGF0IE1FTSBmb3JtYXQgaW5zdHJ1Y3Rpb24uCi0KLSAgIEluIGFueSBjYXNlLCAqcGJhc2VyZWcgc2hvdWxkIGNvbnRhaW4gYSBiYXNlIHJlZ2lzdGVyIHRvIGFkZCB0byB0aGUKLSAgIGV4cHJlc3Npb24uICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZWl0aGVyIEFYUF9SRUdfWkVSTyBvcgotICAgYWxwaGFfZ3BfcmVnaXN0ZXIuICBTeW1ib2wgYWRkcmVzc2VzIHdpbGwgYWx3YXlzIGJlIGxvYWRlZCB2aWEgJGdwLAotICAgc28gImZvbygkMCkiIGlzIGludGVycHJldGVkIGFzIGFkZGluZyB0aGUgYWRkcmVzcyBvZiBmb28gdG8gJDA7Ci0gICBpLmUuICJsZHEgJHRhcmcsIExJVCgkZ3ApOyBhZGRxICR0YXJnLCAkMCwgJHRhcmciLiAgT2RkLCBwZXJoYXBzLAotICAgYnV0IHRoaXMgaXMgd2hhdCBPU0YvMSBkb2VzLgotCi0gICBJZiBleHBsaWNpdCByZWxvY2F0aW9ucyBvZiB0aGUgZm9ybSAhbGl0ZXJhbCE8bnVtYmVyPiBhcmUgYWxsb3dlZCwKLSAgIGFuZCB1c2VkLCB0aGVuIGV4cGxpY3RfcmVsb2Mgd2l0aCBiZSBhbiBleHByZXNzaW9uIHBvaW50ZXIuCi0KLSAgIEZpbmFsbHksIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgY2FsbGluZyBtYWNybyBtYXkgZW1pdCBhCi0gICBMSVRVU0UgcmVsb2MgaWYgb3RoZXJ3aXNlIGFwcHJvcHJpYXRlLiAgKi8KLQotc3RhdGljIGludAotbG9hZF9leHByZXNzaW9uICh0YXJncmVnLCBleHAsIHBiYXNlcmVnLCBwb2Zmc2V0LCBleHBsaWNpdF9yZWxvYykKLSAgICAgaW50IHRhcmdyZWc7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCAqcGJhc2VyZWc7Ci0gICAgIGV4cHJlc3Npb25TICpwb2Zmc2V0OwotICAgICBjb25zdCBleHByZXNzaW9uUyAqZXhwbGljaXRfcmVsb2M7Ci17Ci0gIGludCBlbWl0X2xpdHVzZSA9IDA7Ci0gIG9mZnNldFQgYWRkZW5kID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gIGludCBiYXNlcmVnID0gKnBiYXNlcmVnOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICB7Ci0jaWZkZWYgT0JKX0VDT0ZGCi0Jb2Zmc2V0VCBsaXQ7Ci0KLQkvKiBhdHRlbXB0IHRvIHJlZHVjZSAubGl0IGxvYWQgYnkgc3BsaXR0aW5nIHRoZSBvZmZzZXQgZnJvbQotCSAgIGl0cyBzeW1ib2wgd2hlbiBwb3NzaWJsZSwgYnV0IGRvbid0IGNyZWF0ZSBhIHNpdHVhdGlvbiBpbgotCSAgIHdoaWNoIHdlJ2QgZmFpbC4gICovCi0JaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkgJiYKLQkgICAgKGFscGhhX25vYXRfb24gfHwgdGFyZ3JlZyA9PSBBWFBfUkVHX0FUKSkKLQkgIHsKLQkgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCwKLQkJCQkgICAgICAgYWxwaGFfbGl0YV9zZWN0aW9uLCA4KTsKLQkgICAgYWRkZW5kID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGxpdCA9IGFkZF90b19saXRlcmFsX3Bvb2wgKGV4cC0+WF9hZGRfc3ltYm9sLCAwLAotCQkJCSAgICAgICBhbHBoYV9saXRhX3NlY3Rpb24sIDgpOwotCSAgfQotCi0JaWYgKGxpdCA+PSAweDgwMDApCi0JICBhc19mYXRhbCAoXygib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdGEpIHRhYmxlIikpOwotCi0JLyogZW1pdCAibGRxIHIsIGxpdChncCkiICovCi0KLQlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiB0YXJncmVnID09IGJhc2VyZWcpCi0JICB7Ci0JICAgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCSAgICBpZiAodGFyZ3JlZyA9PSBBWFBfUkVHX0FUKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0JICB9Ci0JZWxzZQotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0Jc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0YV9zeW1ib2wsIGxpdCk7Ci0Jc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLQotCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLQlhc3NlcnQgKGV4cGxpY2l0X3JlbG9jID09IChjb25zdCBleHByZXNzaW9uUyAqKTApOwotCWFzc2VydCAoaW5zbi5uZml4dXBzID09IDEpOwotCWluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw7Ci0jZW5kaWYgLyogT0JKX0VDT0ZGICovCi0jaWZkZWYgT0JKX0VMRgotCS8qIGVtaXQgImxkcSByLCBnb3RvZmYoZ3ApIiAqLwotCi0JaWYgKGJhc2VyZWcgIT0gYWxwaGFfZ3BfcmVnaXN0ZXIgJiYgdGFyZ3JlZyA9PSBiYXNlcmVnKQotCSAgewotCSAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQkgICAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQkgICAgaWYgKHRhcmdyZWcgPT0gQVhQX1JFR19BVCkKLQkgICAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCB3aGlsZSAkYXQgaW4gdXNlIikpOwotCi0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotCSAgfQotCWVsc2UKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCi0JLyogWFhYOiBEaXNhYmxlIHRoaXMgLmdvdCBtaW5pbWl6aW5nIG9wdGltaXphdGlvbiBzbyB0aGF0IHdlIGNhbiBnZXQKLQkgICBiZXR0ZXIgaW5zdHJ1Y3Rpb24gb2Zmc2V0IGtub3dsZWRnZSBpbiB0aGUgY29tcGlsZXIuICBUaGlzIGhhcHBlbnMKLQkgICB2ZXJ5IGluZnJlcXVlbnRseSBhbnl3YXkuICAqLwotCWlmICgxIHx8ICghcmFuZ2Vfc2lnbmVkXzMyIChhZGRlbmQpCi0JICAgICYmIChhbHBoYV9ub2F0X29uIHx8IHRhcmdyZWcgPT0gQVhQX1JFR19BVCkpKQotCSAgewotCSAgICBuZXd0b2tbMV0gPSAqZXhwOwotCSAgICBhZGRlbmQgPSAwOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgZXhwLT5YX2FkZF9zeW1ib2wsIDApOwotCSAgfQotCi0Jc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLQotCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLQlhc3NlcnQgKGluc24ubmZpeHVwcyA9PSAxKTsKLQlpZiAoIWV4cGxpY2l0X3JlbG9jKQotCSAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw7Ci0JZWxzZQotCSAgewotI2lmZGVmIFJFTE9DX09QX1AKLQkgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MKLQkgICAgICA9IChBTFBIQV9SRUxPQ19UQUJMRSAoZXhwbGljaXRfcmVsb2MtPlhfb3ApKS0+cmVsb2M7Ci0JICAgIGluc24uc2VxdWVuY2VbMF0gPSBleHBsaWNpdF9yZWxvYy0+WF9hZGRfbnVtYmVyOwotI2Vsc2UKLQkgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQkgIH0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0jaWZkZWYgT0JKX0VWQVgKLQlvZmZzZXRUIGxpbms7Ci0KLQkvKiBGaW5kIHN5bWJvbCBvciBzeW1ib2wgcG9pbnRlciBpbiBsaW5rIHNlY3Rpb24uICAqLwotCi0JYXNzZXJ0IChleHBsaWNpdF9yZWxvYyA9PSAoY29uc3QgZXhwcmVzc2lvblMgKikwKTsKLQlpZiAoZXhwLT5YX2FkZF9zeW1ib2wgPT0gYWxwaGFfZXZheF9wcm9jLnN5bWJvbCkKLQkgIHsKLQkgICAgaWYgKHJhbmdlX3NpZ25lZF8xNiAoYWRkZW5kKSkKLQkgICAgICB7Ci0JCXNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCQlzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGFkZGVuZCk7Ci0JCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQkJYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGEiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQkJYWRkZW5kID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCQlzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotCQlzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0JCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRhIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkpCi0JICAgICAgewotCQlsaW5rID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCQkJIGV4cC0+WF9hZGRfc3ltYm9sLCBhZGRlbmQpOwotCQlhZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbGluayA9IGFkZF90b19saW5rX3Bvb2wgKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wsCi0JCQkJCSBleHAtPlhfYWRkX3N5bWJvbCwgMCk7Ci0JICAgICAgfQotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLQkgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaW5rKTsKLQkgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCSAgICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCSAgfQotI2VuZGlmIC8qIE9CSl9FVkFYICovCi0KLQllbWl0X2luc24oJmluc24pOwotCi0jaWZuZGVmIE9CSl9FVkFYCi0JZW1pdF9saXR1c2UgPSAxOwotCi0JaWYgKGJhc2VyZWcgIT0gYWxwaGFfZ3BfcmVnaXN0ZXIgJiYgYmFzZXJlZyAhPSBBWFBfUkVHX1pFUk8pCi0JICB7Ci0JICAgIC8qIGVtaXQgImFkZHEgciwgYmFzZSwgciIgKi8KLQotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBiYXNlcmVnKTsKLQkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgdGFyZ3JlZyk7Ci0JICAgIGFzc2VtYmxlX3Rva2VucyAoImFkZHEiLCBuZXd0b2ssIDMsIDApOwotCSAgfQotI2VuZGlmCi0KLQliYXNlcmVnID0gdGFyZ3JlZzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgYXNzZXJ0IChleHBsaWNpdF9yZWxvYyA9PSAoY29uc3QgZXhwcmVzc2lvblMgKikwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgLyogQXNzdW1lIHRoYXQgdGhpcyBkaWZmZXJlbmNlIGV4cHJlc3Npb24gd2lsbCBiZSByZXNvbHZlZCB0byBhbgotCSBhYnNvbHV0ZSB2YWx1ZSBhbmQgdGhhdCB0aGF0IHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMuICovCi0KLSAgICAgIGFzc2VydCAoZXhwbGljaXRfcmVsb2MgPT0gKGNvbnN0IGV4cHJlc3Npb25TICopMCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSAgICAgIG5ld3Rva1sxXSA9ICpleHA7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOwotCi0gICAgICBpZiAocG9mZnNldCkKLQlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgMCk7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT19iaWc6Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBhZGRlbmQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJjYW4ndCBoYW5kbGUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkpCi0gICAgewotICAgICAgb2Zmc2V0VCBsaXQ7Ci0KLSAgICAgIC8qIGZvciA2NC1iaXQgYWRkZW5kcywganVzdCBwdXQgaXQgaW4gdGhlIGxpdGVyYWwgcG9vbCAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICAgIC8qIGVtaXQgImxkcSB0YXJncmVnLCBsaXQoYmFzZXJlZykiICAqLwotICAgICAgbGl0ID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCSAgICAgIHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKSwgYWRkZW5kKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcSIsIG5ld3RvaywgMywgMCk7Ci0jZWxzZQotCi0gICAgICBpZiAoYWxwaGFfbGl0OF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saXQ4IiwKLQkJCQkgICZhbHBoYV9saXQ4X3NlY3Rpb24sCi0JCQkJICAmYWxwaGFfbGl0OF9zeW1ib2wpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0JICBhbHBoYV9saXQ4X2xpdGVyYWwgPSBhZGRfdG9fbGl0ZXJhbF9wb29sIChhbHBoYV9saXQ4X3N5bWJvbCwgMHg4MDAwLAotCQkJCQkJICAgIGFscGhhX2xpdGFfc2VjdGlvbiwgOCk7Ci0JICBpZiAoYWxwaGFfbGl0OF9saXRlcmFsID49IDB4ODAwMCkKLQkgICAgYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIpKTsKLSNlbmRpZgotCX0KLQotICAgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoTlVMTCwgYWRkZW5kLCBhbHBoYV9saXQ4X3NlY3Rpb24sIDgpIC0gMHg4MDAwOwotICAgICAgaWYgKGxpdCA+PSAweDgwMDApCi0JYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXQ4KSB0YWJsZSIpKTsKLQotICAgICAgLyogZW1pdCAibGRhIGxpdHJlZywgLmxpdDgrMHg4MDAwIiAqLwotCi0gICAgICBpZiAodGFyZ3JlZyA9PSBiYXNlcmVnKQotCXsKLQkgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQkgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCi0JICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotCX0KLSAgICAgIGVsc2UKLQlzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSNpZmRlZiBPQkpfRUNPRkYKLSAgICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGFscGhhX2xpdGFfc3ltYm9sLCBhbHBoYV9saXQ4X2xpdGVyYWwpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgICAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0OF9zeW1ib2wsIDB4ODAwMCk7Ci0jZW5kaWYKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLSAgICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzID09IDEpOwotI2lmZGVmIE9CSl9FQ09GRgotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOwotI2VuZGlmCi0KLSAgICAgIGVtaXRfaW5zbiAoJmluc24pOwotCi0gICAgICAvKiBlbWl0ICJsZHEgbGl0cmVnLCBsaXQobGl0cmVnKSIgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIG5ld3Rva1swXS5YX2FkZF9udW1iZXIpOwotCi0gICAgICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyID0gTElUVVNFX0JBU0U7Ci0gICAgICBlbWl0X2xpdHVzZSA9IDA7Ci0KLSAgICAgIGVtaXRfaW5zbiAoJmluc24pOwotCi0gICAgICAvKiBlbWl0ICJhZGRxIGxpdHJlZywgYmFzZSwgdGFyZ2V0IiAqLwotCi0gICAgICBpZiAoYmFzZXJlZyAhPSBBWFBfUkVHX1pFUk8pCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgYmFzZXJlZyk7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCB0YXJncmVnKTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoImFkZHEiLCBuZXd0b2ssIDMsIDApOwotCX0KLSNlbmRpZiAvKiAhT0JKX0VWQVggKi8KLQotICAgICAgaWYgKHBvZmZzZXQpCi0Jc2V0X3Rva19jb25zdCAoKnBvZmZzZXQsIDApOwotICAgICAgKnBiYXNlcmVnID0gdGFyZ3JlZzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXRUIGxvdywgaGlnaCwgZXh0cmEsIHRtcDsKLQotICAgICAgLyogZm9yIDMyLWJpdCBvcGVyYW5kcywgYnJlYWsgdXAgdGhlIGFkZGVuZCAqLwotCi0gICAgICBsb3cgPSBzaWduX2V4dGVuZF8xNiAoYWRkZW5kKTsKLSAgICAgIHRtcCA9IGFkZGVuZCAtIGxvdzsKLSAgICAgIGhpZ2ggPSBzaWduX2V4dGVuZF8xNiAodG1wID4+IDE2KTsKLQotICAgICAgaWYgKHRtcCAtIChoaWdoIDw8IDE2KSkKLQl7Ci0JICBleHRyYSA9IDB4NDAwMDsKLQkgIHRtcCAtPSAweDQwMDAwMDAwOwotCSAgaGlnaCA9IHNpZ25fZXh0ZW5kXzE2ICh0bXAgPj4gMTYpOwotCX0KLSAgICAgIGVsc2UKLQlleHRyYSA9IDA7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCi0gICAgICBpZiAoZXh0cmEpCi0JewotCSAgLyogZW1pdCAibGRhaCByLCBleHRyYShyKSAqLwotCSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBleHRyYSk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKLQkgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnID0gdGFyZ3JlZyk7Ci0JfQotCi0gICAgICBpZiAoaGlnaCkKLQl7Ci0JICAvKiBlbWl0ICJsZGFoIHIsIGhpZ2gocikgKi8KLQkgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgaGlnaCk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKLQkgIGJhc2VyZWcgPSB0YXJncmVnOwotCSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCX0KLQotICAgICAgaWYgKChsb3cgJiYgIXBvZmZzZXQpIHx8ICghcG9mZnNldCAmJiBiYXNlcmVnICE9IHRhcmdyZWcpKQotCXsKLQkgIC8qIGVtaXQgImxkYSByLCBsb3coYmFzZSkiICovCi0JICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGxvdyk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOwotCSAgYmFzZXJlZyA9IHRhcmdyZWc7Ci0JICBsb3cgPSAwOwotCX0KLQotICAgICAgaWYgKHBvZmZzZXQpCi0Jc2V0X3Rva19jb25zdCAoKnBvZmZzZXQsIGxvdyk7Ci0gICAgICAqcGJhc2VyZWcgPSBiYXNlcmVnOwotICAgIH0KLQotICByZXR1cm4gZW1pdF9saXR1c2U7Ci19Ci0KLS8qIFRoZSBsZGEgbWFjcm8gZGlmZmVycyBmcm9tIHRoZSBsZGEgaW5zdHJ1Y3Rpb24gaW4gdGhhdCBpdCBoYW5kbGVzCi0gICBtb3N0IHNpbXBsZSBleHByZXNzaW9ucywgcGFydGljdWFscmx5IHN5bWJvbCBhZGRyZXNzIGxvYWRzIGFuZAotICAgbGFyZ2UgY29uc3RhbnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRhICh0b2ssIG50b2ssIG9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBvcG5hbWU7Ci17Ci0gIGludCBiYXNlcmVnOwotICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2MgPSAoY29uc3QgZXhwcmVzc2lvblMgKikwOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnI7Ci0KLSAgICAgIHJlbG9jID0gJnRva1tudG9rLTFdOwotICAgICAgciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvYy0+WF9vcCk7Ci0gICAgICBzd2l0Y2ggKHJlbG9jLT5YX29wKQotCXsKLQlkZWZhdWx0OgotCSAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JCSAgKGludClyZWxvYy0+WF9hZGRfbnVtYmVyLCAoY29uc3QgY2hhciAqKW9wbmFtZSk7Ci0KLQkgIHJlbG9jID0gKGNvbnN0IGV4cHJlc3Npb25TICopMDsKLQkgIG50b2stLTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX2xpdGVyYWw6Ci0JICBudG9rLS07Ci0JICBicmVhazsKLQotCSAgLyogRm9yIGxkYSAkeCwwKCR4KSFsaXR1c2VfYmFzZSF5LCBkb24ndCB1c2UgbG9hZF9leHByZXNzaW9uLCBzaW5jZQotCSAgICAgaXQgaXMgcmVhbGx5IHRvbyBnZW5lcmFsIGZvciBvdXIgbmVlZHMuICBJbnN0ZWFkIGp1c3QgZ2VuZXJhdGUgdGhlCi0JICAgICBsZGEgZGlyZWN0bHkuICAqLwotCWNhc2UgT19saXR1c2VfYmFzZToKLQkgIGlmIChudG9rICE9IDQKLQkgICAgICB8fCB0b2tbMF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JICAgICAgfHwgIWlzX2lyX251bSh0b2tbMF0uWF9hZGRfbnVtYmVyKQotCSAgICAgIHx8IHRva1sxXS5YX29wICE9IE9fY29uc3RhbnQKLQkgICAgICB8fCB0b2tbMl0uWF9vcCAhPSBPX3ByZWdpc3RlcgotCSAgICAgIHx8ICFpc19pcl9udW0odG9rWzJdLlhfYWRkX251bWJlcikpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCBpbnN0cnVjdGlvbiBmb3JtYXQgZm9yIGxkYSAhJXMhJWQiKSwgci0+bmFtZSwKLQkJICAgICAgcmVsb2MtPlhfYWRkX251bWJlcik7Ci0KLQkgICAgICByZWxvYyA9IChjb25zdCBleHByZXNzaW9uUyAqKTA7Ci0JICAgICAgbnRvay0tOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGVtaXRfbG9hZHN0b3JlICh0b2ssIG50b2ssICJsZGEiKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKG50b2sgPT0gMikKLSAgICBiYXNlcmVnID0gKHRva1sxXS5YX29wID09IE9fY29uc3RhbnQgPyBBWFBfUkVHX1pFUk8gOiBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIGVsc2UKLSAgICBiYXNlcmVnID0gdG9rWzJdLlhfYWRkX251bWJlcjsKLQotICAodm9pZCkgbG9hZF9leHByZXNzaW9uICh0b2tbMF0uWF9hZGRfbnVtYmVyLCAmdG9rWzFdLCAmYmFzZXJlZywgTlVMTCwgcmVsb2MpOwotfQotCi0vKiBUaGUgbGRhaCBtYWNybyBkaWZmZXJzIGZyb20gdGhlIGxkYWggaW5zdHJ1Y3Rpb24gaW4gdGhhdCBpdCBoYXMgJDMxCi0gICBhcyBhbiBpbXBsaWVkIGJhc2UgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZGFoICh0b2ssIG50b2ssIHVudXNlZCkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2sgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgUFRSIHVudXNlZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsICJsZGFoIik7Ci0gICAgICBudG9rLS07Ci0gICAgfQotI2VuZGlmCi0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBuZXd0b2tbMV0gPSB0b2tbMV07Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1pFUk8pOwotCi0gIGFzc2VtYmxlX3Rva2VucyAoImxkYWgiLCBuZXd0b2ssIDMsIDApOwotfQotCi0vKiBIYW5kbGUgYWxsICJzaW1wbGUiIGludGVnZXIgcmVnaXN0ZXIgbG9hZHMgLS0gbGRxLCBsZHFfbCwgbGRxX3UsCi0gICBldGMuICBUaGV5IGRpZmZlciBmcm9tIHRoZSByZWFsIGluc3RydWN0aW9ucyBpbiB0aGF0IHRoZXkgZG8gc2ltcGxlCi0gICBleHByZXNzaW9ucyBsaWtlIHRoZSBsZGEgbWFjcm8uICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9pcl9sb2FkICh0b2ssIG50b2ssIG9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBvcG5hbWU7Ci17Ci0gIGludCBiYXNlcmVnLCBsaXR1c2U7Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jID0gKGNvbnN0IGV4cHJlc3Npb25TICopMDsKLQotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnI7Ci0KLSAgICAgIHJlbG9jID0gJnRva1tudG9rLTFdOwotICAgICAgc3dpdGNoIChyZWxvYy0+WF9vcCkKLQl7Ci0JY2FzZSBPX2xpdHVzZV9iYXNlOgotCSAgbnRvay0tOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fbGl0ZXJhbDoKLQkgIGlmIChzdHJjbXAgKChjb25zdCBjaGFyICopb3BuYW1lLCAibGRxIikgPT0gMCkKLQkgICAgewotCSAgICAgIGVtaXRfbGRhICh0b2ssIG50b2ssIG9wbmFtZSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JICBudG9rLS07Ci0JICByID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jLT5YX29wKTsKLQkgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCQkgIChpbnQpcmVsb2MtPlhfYWRkX251bWJlciwgKGNvbnN0IGNoYXIgKilvcG5hbWUpOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobnRvayA9PSAyKQotICAgIGJhc2VyZWcgPSAodG9rWzFdLlhfb3AgPT0gT19jb25zdGFudCA/IEFYUF9SRUdfWkVSTyA6IGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgZWxzZQotICAgIGJhc2VyZWcgPSB0b2tbMl0uWF9hZGRfbnVtYmVyOwotCi0gIGxpdHVzZSA9IGxvYWRfZXhwcmVzc2lvbiAodG9rWzBdLlhfYWRkX251bWJlciwgJnRva1sxXSwgJmJhc2VyZWcsCi0JCQkgICAgJm5ld3Rva1sxXSwgKGNvbnN0IGV4cHJlc3Npb25TICopMCk7Ci0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKChjb25zdCBjaGFyICopb3BuYW1lLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKHJlbG9jKQotICAgIHsKLSAgICAgIGludCBuZml4dXBzID0gaW5zbi5uZml4dXBzOwotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvYy0+WF9vcCk7Ci0KLSAgICAgIGFzc2VydCAobmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpbnNuLmZpeHVwc1tuZml4dXBzXS5yZWxvYyA9IHItPnJlbG9jOwotICAgICAgaW5zbi5maXh1cHNbbmZpeHVwc10uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzW25maXh1cHNdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1tuZml4dXBzXS5leHAuWF9hZGRfbnVtYmVyID0gci0+bGl0dXNlOwotICAgICAgaW5zbi5zZXF1ZW5jZVtuZml4dXBzXSA9IHJlbG9jLT5YX2FkZF9udW1iZXI7Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobGl0dXNlKQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzIDwgTUFYX0lOU05fRklYVVBTKTsKLSAgICAgIGlmIChpbnNuLm5maXh1cHMgPiAwKQotCXsKLQkgIG1lbW1vdmUgKCZpbnNuLmZpeHVwc1sxXSwgJmluc24uZml4dXBzWzBdLAotCQkgICBzaXplb2Yoc3RydWN0IGFscGhhX2ZpeHVwKSAqIGluc24ubmZpeHVwcyk7Ci0JfQotICAgICAgaW5zbi5uZml4dXBzKys7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSBMSVRVU0VfQkFTRTsKLSAgICB9Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci19Ci0KLS8qIEhhbmRsZSBmcCByZWdpc3RlciBsb2FkcywgYW5kIGJvdGggaW50ZWdlciBhbmQgZnAgcmVnaXN0ZXIgc3RvcmVzLgotICAgQWdhaW4sIHdlIGhhbmRsZSBzaW1wbGUgZXhwcmVzc2lvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sb2Fkc3RvcmUgKHRvaywgbnRvaywgb3BuYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIG9wbmFtZTsKLXsKLSAgaW50IGJhc2VyZWcsIGxpdHVzZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2MgPSAoY29uc3QgZXhwcmVzc2lvblMgKikwOwotCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgcmVsb2MgPSAmdG9rWy0tbnRva107Ci0gICAgICBpZiAocmVsb2MtPlhfb3AgIT0gT19saXR1c2VfYmFzZSkKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gJmFscGhhX3JlbG9jX29wWyByZWxvYy0+WF9tZCBdOwotCSAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JCSAgKGludClyZWxvYy0+WF9hZGRfbnVtYmVyLCAoY29uc3QgY2hhciAqKW9wbmFtZSk7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIGlmIChudG9rID09IDIpCi0gICAgYmFzZXJlZyA9ICh0b2tbMV0uWF9vcCA9PSBPX2NvbnN0YW50ID8gQVhQX1JFR19aRVJPIDogYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICBlbHNlCi0gICAgYmFzZXJlZyA9IHRva1syXS5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKHRva1sxXS5YX29wICE9IE9fY29uc3RhbnQgfHwgIXJhbmdlX3NpZ25lZF8xNih0b2tbMV0uWF9hZGRfbnVtYmVyKSkKLSAgICB7Ci0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgbGl0dXNlID0gbG9hZF9leHByZXNzaW9uIChBWFBfUkVHX0FULCAmdG9rWzFdLCAmYmFzZXJlZywgJm5ld3Rva1sxXSwKLQkJCQkoY29uc3QgZXhwcmVzc2lvblMgKikwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXd0b2tbMV0gPSB0b2tbMV07Ci0gICAgICBsaXR1c2UgPSAwOwotICAgIH0KLQotICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQotICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoKGNvbnN0IGNoYXIgKilvcG5hbWUsIG5ld3RvaywgMywgJmluc24pOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAocmVsb2MpCi0gICAgewotICAgICAgaW50IG5maXh1cHMgPSBpbnNuLm5maXh1cHM7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jLT5YX29wKTsKLQotICAgICAgYXNzZXJ0IChuZml4dXBzIDwgTUFYX0lOU05fRklYVVBTKTsKLSAgICAgIGluc24uZml4dXBzW25maXh1cHNdLnJlbG9jID0gci0+cmVsb2M7Ci0gICAgICBpbnNuLmZpeHVwc1tuZml4dXBzXS5leHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgaW5zbi5maXh1cHNbbmZpeHVwc10uZXhwLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIGluc24uZml4dXBzW25maXh1cHNdLmV4cC5YX2FkZF9udW1iZXIgPSByLT5saXR1c2U7Ci0gICAgICBpbnNuLnNlcXVlbmNlW25maXh1cHNdID0gcmVsb2MtPlhfYWRkX251bWJlcjsKLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChsaXR1c2UpCi0gICAgewotICAgICAgYXNzZXJ0IChpbnNuLm5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOwotICAgICAgaWYgKGluc24ubmZpeHVwcyA+IDApCi0JewotCSAgbWVtbW92ZSAoJmluc24uZml4dXBzWzFdLCAmaW5zbi5maXh1cHNbMF0sCi0JCSAgIHNpemVvZihzdHJ1Y3QgYWxwaGFfZml4dXApICogaW5zbi5uZml4dXBzKTsKLQl9Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVFVTRTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sID0gc2VjdGlvbl9zeW1ib2wgKG5vd19zZWcpOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciA9IExJVFVTRV9CQVNFOwotICAgIH0KLQotICBlbWl0X2luc24gKCZpbnNuKTsKLX0KLQotLyogTG9hZCBhIGhhbGYtd29yZCBvciBieXRlIGFzIGFuIHVuc2lnbmVkIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2lyX2xvYWQgKHRvaywgbnRvaywgbGRYdV9vcFsobG9uZyl2bGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0JewotCSAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLQkgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIKLQkgICAgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLQotCSAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JCSAgKGludClyZWxvY19leHAtPlhfYWRkX251bWJlciwgImxkYnUvbGR3dSIpOwotCSAgbnRvay0tOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgLyogZW1pdCAibGRhICRhdCwgZXhwIiAqLwotCi0gICAgICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICAgICAgbmV3dG9rWzBdLlhfYWRkX251bWJlciA9IEFYUF9SRUdfQVQ7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIG50b2ssIDEpOwotCi0gICAgICAvKiBlbWl0ICJsZHFfdSB0YXJnLCAwKCRhdCkiICovCi0KLSAgICAgIG5ld3Rva1swXSA9IHRva1swXTsKLSAgICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgICAgIC8qIGVtaXQgImV4dFhsIHRhcmcsICRhdCwgdGFyZyIgKi8KLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gICAgICBuZXd0b2tbMl0gPSBuZXd0b2tbMF07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKGV4dFhsX29wWyhsb25nKXZsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotICAgIH0KLX0KLQotLyogTG9hZCBhIGhhbGYtd29yZCBvciBieXRlIGFzIGEgc2lnbmVkIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgZW1pdF9sZFh1ICh0b2ssIG50b2ssIHZsZ3NpemUpOwotICBhc3NlbWJsZV90b2tlbnMgKHNleHRYX29wWyhsb25nKXZsZ3NpemVdLCB0b2ssIDEsIDEpOwotfQotCi0vKiBMb2FkIGFuIGludGVncmFsIHZhbHVlIGZyb20gYW4gdW5hbGlnbmVkIGFkZHJlc3MgYXMgYW4gdW5zaWduZWQKLSAgIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfdWxkWHUgKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBsb25nIGxnc2l6ZSA9IChsb25nKXZsZ3NpemU7Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLQotICBpZiAoYWxwaGFfbm9hdF9vbikKLSAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAvKiBlbWl0ICJsZGEgJGF0LCBleHAiICovCi0KLSAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKLSAgbmV3dG9rWzBdLlhfYWRkX251bWJlciA9IEFYUF9SRUdfQVQ7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci0KLSAgLyogZW1pdCAibGRxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgImxkcV91ICR0MTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMTw8bGdzaXplKS0xKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgImV4dFhsICR0OSwgJGF0LCAkdDkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1Q5KTsKLSAgYXNzZW1ibGVfdG9rZW5zIChleHRYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgImV4dFhoICR0MTAsICRhdCwgJHQxMCIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDEwKTsKLSAgYXNzZW1ibGVfdG9rZW5zIChleHRYaF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgIm9yICR0OSwgJHQxMCwgdGFyZyIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTApOwotICBuZXd0b2tbMl0gPSB0b2tbMF07Ci0gIGFzc2VtYmxlX3Rva2VucyAoIm9yIiwgbmV3dG9rLCAzLCAxKTsKLX0KLQotLyogTG9hZCBhbiBpbnRlZ3JhbCB2YWx1ZSBmcm9tIGFuIHVuYWxpZ25lZCBhZGRyZXNzIGFzIGEgc2lnbmVkIHZhbHVlLgotICAgTm90ZSB0aGF0IHF1YWRzIHNob3VsZCBnZXQgZnVubmVsZWQgdG8gdGhlIHVuc2lnbmVkIGxvYWQgc2luY2Ugd2UKLSAgIGRvbid0IGhhdmUgdG8gZG8gdGhlIHNpZ24gZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfdWxkWCAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGVtaXRfdWxkWHUgKHRvaywgbnRvaywgdmxnc2l6ZSk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoc2V4dFhfb3BbKGxvbmcpdmxnc2l6ZV0sIHRvaywgMSwgMSk7Ci19Ci0KLS8qIEltcGxlbWVudCB0aGUgbGRpbCBtYWNyby4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2xkaWwgKHRvaywgbnRvaywgdW51c2VkKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHVudXNlZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBleHByZXNzaW9uUyBuZXd0b2tbMl07Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsICJsZGlsIik7Ci0gICAgICBudG9rLS07Ci0gICAgfQotI2VuZGlmCi0KLSAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mKG5ld3RvaykpOwotICBuZXd0b2tbMV0uWF9hZGRfbnVtYmVyID0gc2lnbl9leHRlbmRfMzIgKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci19Ci0KLS8qIFN0b3JlIGEgaGFsZi13b3JkIG9yIGJ5dGUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9zdFggKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBpbnQgbGdzaXplID0gKGludCkobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2xvYWRzdG9yZSAodG9rLCBudG9rLCBzdFhfb3BbbGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICAgICAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKLSAgICAgIG5ld3Rva1swXS5YX2FkZF9udW1iZXIgPSBBWFBfUkVHX0FUOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAgICAgLyogZW1pdCAibGRxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTAiICovCi0KLSAgICAgIG5ld3Rva1swXSA9IHRva1swXTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOwotICAgICAgYXNzZW1ibGVfdG9rZW5zIChpbnNYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJtc2tYbCAkdDksICRhdCwgJHQ5IiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAobXNrWGxfb3BbbGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCAkdDkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm9yIiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoInN0cV91IiwgbmV3dG9rLCAzLCAxKTsKLSAgICB9Ci19Ci0KLS8qIFN0b3JlIGFuIGludGVnZXIgdG8gYW4gdW5hbGlnbmVkIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91c3RYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgaW50IGxnc2l6ZSA9IChpbnQpKGxvbmcpdmxnc2l6ZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkOSwgMCgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkMTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTEiICovCi0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTEpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGggc3JjLCAkYXQsICR0MTIiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTIpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGwgJHQ5LCAkYXQsICR0OSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGggJHQxMCwgJGF0LCAkdDEwIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQ5LCAkdDExLCAkdDkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDExKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQxMCwgJHQxMiwgJHQxMCIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEyKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgic3RxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgInN0cV91ICR0MTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJzdHFfdSIsIG5ld3RvaywgMywgMSk7Ci19Ci0KLS8qIFNpZ24gZXh0ZW5kIGEgaGFsZi13b3JkIG9yIGJ5dGUuICBUaGUgMzItYml0IHNpZ24gZXh0ZW5kIGlzCi0gICBpbXBsZW1lbnRlZCBhcyAiYWRkbCAkMzEsICRyLCAkdCIgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X3NleHRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgbG9uZyBsZ3NpemUgPSAobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBhc3NlbWJsZV90b2tlbnMgKHNleHRYX29wW2xnc2l6ZV0sIHRvaywgbnRvaywgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgYml0c2hpZnQgPSA2NCAtIDggKiAoMSA8PCBsZ3NpemUpOwotICAgICAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotCXsKLQkgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0JICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyCi0JICAgID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0KLQkgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCQkgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsICJzZXR4dCIpOwotCSAgbnRvay0tOwotCX0KLSNlbmRpZgotCi0gICAgICAvKiBlbWl0ICJzbGwgc3JjLGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gICAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGJpdHNoaWZ0KTsKLSAgICAgIG5ld3Rva1syXSA9IHRva1tudG9rIC0gMV07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzbGwiLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJzcmEgZHN0LGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSBuZXd0b2tbMl07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzcmEiLCBuZXd0b2ssIDMsIDEpOwotICAgIH0KLX0KLQotLyogSW1wbGVtZW50IHRoZSBkaXZpc2lvbiBhbmQgbW9kdWx1cyBtYWNyb3MuICAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLQotLyogTWFrZSByZWdpc3RlciB1c2FnZSBsaWtlIGluIG5vcm1hbCBwcm9jZWR1cmUgY2FsbC4KLSAgIERvbid0IGNsb2JiZXIgUFYgYW5kIFJBLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfZGl2aXNpb24gKHRvaywgbnRvaywgc3ltbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBzeW1uYW1lOwotewotICAvKiBESVZJU0lPTiBhbmQgTU9EVUxVUy4gWWVjaC4KLSAgICoKLSAgICogQ29udmVydAotICAgKiAgICBPUCB4LHkscmVzdWx0Ci0gICAqIHRvCi0gICAqICAgIG1vdiB4LFIxNgkjIGlmIHggIT0gUjE2Ci0gICAqICAgIG1vdiB5LFIxNwkjIGlmIHkgIT0gUjE3Ci0gICAqICAgIGxkYSBBVCxfX09QCi0gICAqICAgIGpzciBBVCwoQVQpLDAKLSAgICogICAgbW92IFIwLHJlc3VsdAotICAgKgotICAgKiB3aXRoIGFwcHJvcHJpYXRlIG9wdGltaXphdGlvbnMgaWYgUjAsUjE2LFIxNyBhcmUgdGhlIHJlZ2lzdGVycwotICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgotICAgKi8KLQotICBpbnQgeHIsIHlyLCBycjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsIChjaGFyIGNoYXIgKilzeW1uYW1lKTsKLSAgICAgIG50b2stLTsKLSAgICB9Ci0jZW5kaWYKLQotICB4ciA9IHJlZ25vICh0b2tbMF0uWF9hZGRfbnVtYmVyKTsKLSAgeXIgPSByZWdubyAodG9rWzFdLlhfYWRkX251bWJlcik7Ci0KLSAgaWYgKG50b2sgPCAzKQotICAgIHJyID0geHI7Ci0gIGVsc2UKLSAgICByciA9IHJlZ25vICh0b2tbMl0uWF9hZGRfbnVtYmVyKTsKLQotICAvKiBNb3ZlIHRoZSBvcGVyYW5kcyBpbnRvIHRoZSByaWdodCBwbGFjZSAqLwotICBpZiAoeXIgPT0gQVhQX1JFR19SMTYgJiYgeHIgPT0gQVhQX1JFR19SMTcpCi0gICAgewotICAgICAgLyogVGhleSBhcmUgaW4gZXhhY3RseSB0aGUgd3Jvbmcgb3JkZXIgLS0gc3dhcCB0aHJvdWdoIEFUICovCi0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1IxNik7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjE3KTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE2KTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTcpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoeXIgPT0gQVhQX1JFR19SMTYpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19SMTYpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTcpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh4ciAhPSBBWFBfUkVHX1IxNikKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB4cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1IxNik7Ci0gICAgICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh5ciAhPSBBWFBfUkVHX1IxNiAmJiB5ciAhPSBBWFBfUkVHX1IxNykKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB5cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1IxNyk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLSAgICB9Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNvbnN0IGNoYXIgKilzeW1uYW1lKTsKLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgc3ltLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCAyLCAxKTsKLQotICAvKiBDYWxsIHRoZSBkaXZpc2lvbiByb3V0aW5lICovCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotICBzZXRfdG9rX2NwcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMl0sIDApOwotICBhc3NlbWJsZV90b2tlbnMgKCJqc3IiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIE1vdmUgdGhlIHJlc3VsdCB0byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKHJyICE9IEFYUF9SRUdfUjApCi0gICAgewotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19SMCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBycik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotICAgIH0KLX0KLQotI2Vsc2UgLyogIU9CSl9FVkFYICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2RpdmlzaW9uICh0b2ssIG50b2ssIHN5bW5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgc3ltbmFtZTsKLXsKLSAgLyogRElWSVNJT04gYW5kIE1PRFVMVVMuIFllY2guCi0gICAqIENvbnZlcnQKLSAgICogICAgT1AgeCx5LHJlc3VsdAotICAgKiB0bwotICAgKiAgICBsZGEgcHYsX19PUAotICAgKiAgICBtb3YgeCx0MTAKLSAgICogICAgbW92IHksdDExCi0gICAqICAgIGpzciB0OSwocHYpLF9fT1AKLSAgICogICAgbW92IHQxMixyZXN1bHQKLSAgICoKLSAgICogd2l0aCBhcHByb3ByaWF0ZSBvcHRpbWl6YXRpb25zIGlmIHQxMCx0MTEsdDEyIGFyZSB0aGUgcmVnaXN0ZXJzCi0gICAqIHNwZWNpZmllZCBieSB0aGUgY29tcGlsZXIuCi0gICAqLwotCi0gIGludCB4ciwgeXIsIHJyOwotICBzeW1ib2xTICpzeW07Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKG50b2sgJiYgVVNFUl9SRUxPQ19QICh0b2tbbnRvay0xXS5YX29wKSkKLSAgICB7Ci0gICAgICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2NfZXhwID0gJnRva1tudG9rLTFdOwotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvY19leHAtPlhfb3ApOwotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JICAgICAgKGludClyZWxvY19leHAtPlhfYWRkX251bWJlciwgKGNvbnN0IGNoYXIgKilzeW1uYW1lKTsKLSAgICAgIG50b2stLTsKLSAgICB9Ci0jZW5kaWYKLQotICB4ciA9IHJlZ25vICh0b2tbMF0uWF9hZGRfbnVtYmVyKTsKLSAgeXIgPSByZWdubyAodG9rWzFdLlhfYWRkX251bWJlcik7Ci0KLSAgaWYgKG50b2sgPCAzKQotICAgIHJyID0geHI7Ci0gIGVsc2UKLSAgICByciA9IHJlZ25vICh0b2tbMl0uWF9hZGRfbnVtYmVyKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY29uc3QgY2hhciAqKXN5bW5hbWUpOwotCi0gIC8qIE1vdmUgdGhlIG9wZXJhbmRzIGludG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmICh5ciA9PSBBWFBfUkVHX1QxMCAmJiB4ciA9PSBBWFBfUkVHX1QxMSkKLSAgICB7Ci0gICAgICAvKiBUaGV5IGFyZSBpbiBleGFjdGx5IHRoZSB3cm9uZyBvcmRlciAtLSBzd2FwIHRocm91Z2ggQVQgKi8KLQotICAgICAgaWYgKGFscGhhX25vYXRfb24pCi0JYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTEpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTApOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh5ciA9PSBBWFBfUkVHX1QxMCkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLQotICAgICAgaWYgKHhyICE9IEFYUF9SRUdfVDEwKQotCXsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHhyKTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLQotICAgICAgaWYgKHlyICE9IEFYUF9SRUdfVDEwICYmIHlyICE9IEFYUF9SRUdfVDExKQotCXsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHlyKTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDExKTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotICAgIH0KLQotICAvKiBDYWxsIHRoZSBkaXZpc2lvbiByb3V0aW5lICovCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX3N5bSAobmV3dG9rWzFdLCBzeW0sIDApOwotICBhc3NlbWJsZV90b2tlbnMgKCJqc3IiLCBuZXd0b2ssIDIsIDEpOwotCi0gIC8qIFJlbG9hZCB0aGUgR1AgcmVnaXN0ZXIgKi8KLSNpZmRlZiBPQkpfQU9VVAotRklYTUUKLSNlbmRpZgotI2lmIGRlZmluZWQoT0JKX0VDT0ZGKSB8fCBkZWZpbmVkKE9CSl9FTEYpCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDkpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZGdwIiwgbmV3dG9rLCAzLCAxKTsKLSNlbmRpZgotCi0gIC8qIE1vdmUgdGhlIHJlc3VsdCB0byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKHJyICE9IEFYUF9SRUdfVDEyKQotICAgIHsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEyKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIHJyKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogIU9CSl9FVkFYICovCi0KLS8qIFRoZSBqc3IgYW5kIGptcCBtYWNyb3MgZGlmZmVyIGZyb20gdGhlaXIgaW5zdHJ1Y3Rpb24gY291bnRlcnBhcnRzCi0gICBpbiB0aGF0IHRoZXkgY2FuIGxvYWQgdGhlIHRhcmdldCBhZGRyZXNzIGFuZCBkZWZhdWx0IG1vc3QKLSAgIGV2ZXJ5dGhpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9qc3JqbXAgKHRvaywgbnRvaywgdm9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2b3BuYW1lOwotewotICBjb25zdCBjaGFyICpvcG5hbWUgPSAoY29uc3QgY2hhciAqKSB2b3BuYW1lOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0gIGludCByLCB0b2tpZHggPSAwLCBsaXR1c2UgPSAwOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkgICAgICAoaW50KXJlbG9jX2V4cC0+WF9hZGRfbnVtYmVyLCBvcG5hbWUpOwotICAgICAgbnRvay0tOwotICAgIH0KLSNlbmRpZgotCi0gIGlmICh0b2tpZHggPCBudG9rICYmIHRva1t0b2tpZHhdLlhfb3AgPT0gT19yZWdpc3RlcikKLSAgICByID0gcmVnbm8gKHRva1t0b2tpZHgrK10uWF9hZGRfbnVtYmVyKTsKLSAgZWxzZQotICAgIHIgPSBzdHJjbXAgKG9wbmFtZSwgImptcCIpID09IDAgPyBBWFBfUkVHX1pFUk8gOiBBWFBfUkVHX1JBOwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHIpOwotCi0gIGlmICh0b2tpZHggPCBudG9rICYmCi0gICAgICAodG9rW3Rva2lkeF0uWF9vcCA9PSBPX3ByZWdpc3RlciB8fCB0b2tbdG9raWR4XS5YX29wID09IE9fY3ByZWdpc3RlcikpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0jaWZkZWYgT0JKX0VWQVgKLSAgLyoga2VlcCByZWdpc3RlciBpZiBqc3IgJG4uPHN5bT4gICovCi0jZWxzZQotICBlbHNlCi0gICAgewotICAgICAgaW50IGJhc2VyZWcgPSBhbHBoYV9ncF9yZWdpc3RlcjsKLSAgICAgIGxpdHVzZSA9IGxvYWRfZXhwcmVzc2lvbiAociA9IEFYUF9SRUdfUFYsICZ0b2tbdG9raWR4XSwgJmJhc2VyZWcsIE5VTEwsCi0JCQkJKGNvbnN0IGV4cHJlc3Npb25TICopMCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCByKTsKLQotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIEZJWE1FOiBBZGQgaGludCByZWxvY3MgdG8gQkZEIGZvciBldmF4LiAgKi8KLSNlbHNlCi0gIGlmICh0b2tpZHggPCBudG9rKQotICAgIG5ld3Rva1syXSA9IHRva1t0b2tpZHhdOwotICBlbHNlCi0jZW5kaWYKLSAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMl0sIDApOwotCi0gIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuIChvcG5hbWUsIG5ld3RvaywgMywgJmluc24pOwotCi0gIC8qIGFkZCB0aGUgTElUVVNFIGZpeHVwICovCi0gIGlmIChsaXR1c2UpCi0gICAgewotICAgICAgYXNzZXJ0IChpbnNuLm5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOwotICAgICAgaWYgKGluc24ubmZpeHVwcyA+IDApCi0JewotCSAgbWVtbW92ZSAoJmluc24uZml4dXBzWzFdLCAmaW5zbi5maXh1cHNbMF0sCi0JCSAgIHNpemVvZihzdHJ1Y3QgYWxwaGFfZml4dXApICogaW5zbi5uZml4dXBzKTsKLQl9Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVFVTRTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sID0gc2VjdGlvbl9zeW1ib2wgKG5vd19zZWcpOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciA9IExJVFVTRV9KU1I7Ci0gICAgfQotCi0gIGVtaXRfaW5zbiAoJmluc24pOwotfQotCi0vKiBUaGUgcmV0IGFuZCBqY3IgaW5zdHJ1Y3Rpb25zIGRpZmZlciBmcm9tIHRoZWlyIGluc3RydWN0aW9uCi0gICBjb3VudGVycGFydHMgaW4gdGhhdCBldmVyeXRoaW5nIGNhbiBiZSBkZWZhdWx0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9yZXRqY3IgKHRvaywgbnRvaywgdm9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2b3BuYW1lOwotewotICBjb25zdCBjaGFyICpvcG5hbWUgPSAoY29uc3QgY2hhciAqKXZvcG5hbWU7Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLSAgaW50IHIsIHRva2lkeCA9IDA7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsIG9wbmFtZSk7Ci0gICAgICBudG9rLS07Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKHRva2lkeCA8IG50b2sgJiYgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotICBlbHNlCi0gICAgciA9IEFYUF9SRUdfWkVSTzsKLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJgotICAgICAgKHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIgfHwgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2NwcmVnaXN0ZXIpKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotICBlbHNlCi0gICAgciA9IEFYUF9SRUdfUkE7Ci0KLSAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvaykKLSAgICBuZXd0b2tbMl0gPSB0b2tbdG9raWR4XTsKLSAgZWxzZQotICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1syXSwgc3RyY21wKG9wbmFtZSwgInJldCIpID09IDApOwotCi0gIGFzc2VtYmxlX3Rva2VucyAob3BuYW1lLCBuZXd0b2ssIDMsIDApOwotfQotDAotLyogQXNzZW1ibGVyIGRpcmVjdGl2ZXMgKi8KLQotLyogSGFuZGxlIHRoZSAudGV4dCBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV90ZXh0IChpKQotICAgICBpbnQgaTsKLQotewotICBzX3RleHQgKGkpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0vKiBIYW5kbGUgdGhlIC5kYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2RhdGEgKGkpCi0gICAgIGludCBpOwotewotICBzX2RhdGEgKGkpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0jaWYgZGVmaW5lZCAoT0JKX0VDT0ZGKSB8fCBkZWZpbmVkIChPQkpfRVZBWCkKLQotLyogSGFuZGxlIHRoZSBPU0YvMSBhbmQgb3BlblZNUyAuY29tbSBwc2V1ZG8gcXVpcmtzLgotICAgb3BlblZNUyBjb25zdHJ1Y3RzIGEgc2VjdGlvbiBmb3IgZXZlcnkgY29tbW9uIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2NvbW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBvZmZzZXRUIHRlbXA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHNlZ1QgbmV3X3NlZzsKLSNlbmRpZgotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBBbHBoYSBPU0YvMSBjb21waWxlciBkb2Vzbid0IHByb3ZpZGUgdGhlIGNvbW1hLCBnY2MgZG9lcy4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIE1ha2UgYSBzZWN0aW9uIGZvciB0aGUgY29tbW9uIHN5bWJvbC4gICovCi0gIG5ld19zZWcgPSBzdWJzZWdfbmV3ICh4c3RyZHVwIChuYW1lKSwgMCk7Ci0jZW5kaWYKLQotICAqcCA9IGM7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICAvKiBhbGlnbm1lbnQgbWlnaHQgZm9sbG93ICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgb2Zmc2V0VCBhbGlnbjsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7ICAgICAgCi0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBuZXdfc2VnLCBhbGlnbik7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIE9CSl9FVkFYCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIG5ld19zZWcpID4gMCkKLSAgICB7IAotICAgICAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgbmV3X3NlZykgIT0gdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIG5ld19zZWcpLAotCQkobG9uZykgdGVtcCk7Ci0gICAgfQotI2Vsc2UKLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHRlbXApCi0JYXNfYmFkIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCQkobG9uZykgdGVtcCk7Ci0gICAgfQotI2VuZGlmCi0gIGVsc2UKLSAgICB7Ci0jaWZkZWYgT0JKX0VWQVggCi0gICAgICBzdWJzZWdfc2V0IChuZXdfc2VnLCAwKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHRlbXApOwotICAgICAgbmV3X3NlZy0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgIGlmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgbmV3X3NlZyk7Ci0jZWxzZQotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHRlbXApOwotI2VuZGlmCi0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VWQVgKLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7Ci0jZW5kaWYKLQotICBrbm93IChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmIC8qICEgT0JKX0VMRiAqLwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0KLS8qIEhhbmRsZSB0aGUgLnJkYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3JkYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FQ09GRgotCi0vKiBIYW5kbGUgdGhlIC5zZGF0YSBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19uZXcgKCIuc2RhdGEiLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgb2JqX2VsZl9zZWN0aW9uIChpZ25vcmUpOwotCi0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2VudCAoZHVtbXkpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbnQgKDApOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbmFtZSwgbmFtZV9lbmQ7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoKm5hbWUpKQotCXsKLQkgIGFzX3dhcm4gKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIGlmIChhbHBoYV9jdXJfZW50X3N5bSkKLQkgICAgYXNfd2FybiAoXygibmVzdGVkIC5lbnQgZGlyZWN0aXZlcyIpKTsKLQotCSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgYWxwaGFfY3VyX2VudF9zeW0gPSBzeW07Ci0KLQkgIC8qIFRoZSAuZW50IGRpcmVjdGl2ZSBpcyBzb21ldGltZXMgZm9sbG93ZWQgYnkgYSBudW1iZXIuICBOb3Qgc3VyZQotCSAgICAgd2hhdCBpdCByZWFsbHkgbWVhbnMsIGJ1dCBpZ25vcmUgaXQuICAqLwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICB9Ci0JICBpZiAoaXNkaWdpdCAoKmlucHV0X2xpbmVfcG9pbnRlcikgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0JICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW5kIChkdW1teSkKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfZGlyZWN0aXZlX2VuZCAoMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lLCBuYW1lX2VuZDsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgICBpZiAoISBpc19uYW1lX2JlZ2lubmVyICgqbmFtZSkpCi0JewotCSAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiKSk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKnN5bTsKLQotCSAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCSAgaWYgKHN5bSAhPSBhbHBoYV9jdXJfZW50X3N5bSkKLQkgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgbmFtZXMgZGlmZmVyZW50IHN5bWJvbCB0aGFuIC5lbnQiKSk7Ci0KLQkgIC8qIENyZWF0ZSBhbiBleHByZXNzaW9uIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24uICAqLwotCSAgaWYgKHN5bSkKLQkgICAgewotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplID0KLQkJKGV4cHJlc3Npb25TICopIHhtYWxsb2MgKHNpemVvZiAoZXhwcmVzc2lvblMpKTsKLQkgICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZS0+WF9vcCA9IE9fc3VidHJhY3Q7Ci0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnNpemUtPlhfYWRkX3N5bWJvbAotCSAgICAgICAgPSBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywgZnJhZ19ub3dfZml4ICgpLCBmcmFnX25vdyk7Ci0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnNpemUtPlhfb3Bfc3ltYm9sID0gc3ltOwotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICB9Ci0KLQkgIGFscGhhX2N1cl9lbnRfc3ltID0gTlVMTDsKLQotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCX0KLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9tYXNrIChmcCkKLSAgICAgaW50IGZwOwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIHsKLSAgICAgIGlmIChmcCkKLSAgICAgICAgZWNvZmZfZGlyZWN0aXZlX2ZtYXNrICgwKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZWNvZmZfZGlyZWN0aXZlX21hc2sgKDApOwotICAgIH0KLSAgZWxzZQotICAgIGRpc2NhcmRfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9mcmFtZSAoZHVtbXkpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSAoMCk7Ci0gIGVsc2UKLSAgICBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfcHJvbG9ndWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW1ib2xTICpzeW07Ci0gIGludCBhcmc7Ci0KLSAgYXJnID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBzeW0gPSBlY29mZl9nZXRfY3VyX3Byb2Nfc3ltICgpOwotICBlbHNlCi0gICAgc3ltID0gYWxwaGFfY3VyX2VudF9zeW07Ci0gIGtub3cgKHN5bSAhPSBOVUxMKTsKLQotICBzd2l0Y2ggKGFyZykKLSAgICB7Ci0gICAgICBjYXNlIDA6IC8qIE5vIFBWIHJlcXVpcmVkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfTk9QVik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6IC8qIFN0ZCBHUCBsb2FkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6IC8qIE5vbi1zdGQgdXNlIG9mIFBWLiAgKi8KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgJWQgdG8gLnByb2xvZ3VlLiIpLCBhcmcpOwotCWJyZWFrOwotICAgIH0gIAotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9jb2ZmX3dyYXBwZXIgKHdoaWNoKQotICAgICBpbnQgd2hpY2g7Ci17Ci0gIHN0YXRpYyB2b2lkICgqIGNvbnN0IGZuc1tdKSBQQVJBTVMgKChpbnQpKSA9IHsKLSAgICBlY29mZl9kaXJlY3RpdmVfYmVnaW4sCi0gICAgZWNvZmZfZGlyZWN0aXZlX2JlbmQsCi0gICAgZWNvZmZfZGlyZWN0aXZlX2RlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZGltLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZmlsZSwKLSAgICBlY29mZl9kaXJlY3RpdmVfc2NsLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV90YWcsCi0gICAgZWNvZmZfZGlyZWN0aXZlX3ZhbCwKLSAgICBlY29mZl9kaXJlY3RpdmVfbG9jLAotICB9OwotCi0gIGFzc2VydCAod2hpY2ggPj0gMCAmJiB3aGljaCA8IChpbnQpKHNpemVvZihmbnMpL3NpemVvZigqZm5zKSkpOwotCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgKCpmbnNbd2hpY2hdKSgwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRUNPRkYgZGVidWdnaW5nIGlzIGRpc2FibGVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotI2lmZGVmIE9CSl9FVkFYCi0gIAotLyogSGFuZGxlIHRoZSBzZWN0aW9uIHNwZWNpZmljIHBzZXVkby1vcC4gICovCi0gIAotc3RhdGljIHZvaWQKLXNfYWxwaGFfc2VjdGlvbiAoc2VjaWQpCi0gICAgIGludCBzZWNpZDsKLXsKLSAgaW50IHRlbXA7Ci0jZGVmaW5lIEVWQVhfU0VDVElPTl9DT1VOVCA1Ci0gIHN0YXRpYyBjaGFyICpzZWN0aW9uX25hbWVbRVZBWF9TRUNUSU9OX0NPVU5UKzFdID0KLSAgICB7ICJOVUxMIiwgIi5yZGF0YSIsICIuY29tbSIsICIubGluayIsICIuY3RvcnMiLCAiLmR0b3JzIiB9OwotCi0gIGlmICgoc2VjaWQgPD0gMCkgfHwgKHNlY2lkID4gRVZBWF9TRUNUSU9OX0NPVU5UKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiVW5rbm93biBzZWN0aW9uIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19uZXcgKHNlY3Rpb25fbmFtZVtzZWNpZF0sIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi0KLS8qIFBhcnNlIC5lbnQgZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2VudCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW1ib2w7Ci0gIGV4cHJlc3Npb25TIHN5bWV4cHI7Ci0KLSAgYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLmZyYW1lcmVnID0gLTE7Ci0gIGFscGhhX2V2YXhfcHJvYy5mcmFtZXNpemUgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MucnNhX29mZnNldCA9IDA7Ci0gIGFscGhhX2V2YXhfcHJvYy5yYV9zYXZlID0gQVhQX1JFR19SQTsKLSAgYWxwaGFfZXZheF9wcm9jLmZwX3NhdmUgPSAtMTsKLSAgYWxwaGFfZXZheF9wcm9jLmltYXNrID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLmZtYXNrID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLnByb2xvZ3VlID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLnR5cGUgPSAwOwotCi0gIGV4cHJlc3Npb24gKCZzeW1leHByKTsKLQotICBpZiAoc3ltZXhwci5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gc3ltYm9sIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnN5bWV4cHIpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sID0gc3ltYm9sOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBQYXJzZSAuZnJhbWUgPGZyYW1yZWc+LDxmcmFtZXNpemU+LFJBLDxyc2Ffb2Zmc2V0PiBkaXJlY3RpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZnJhbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgYWxwaGFfZXZheF9wcm9jLmZyYW1lcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnCi0gICAgICB8fCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDEuLzIuIHBhcmFtIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVzaXplID0gdmFsOwotCi0gICh2b2lkKSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDMuLzQuIHBhcmFtIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYWxwaGFfZXZheF9wcm9jLnJzYV9vZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3BkZXNjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0gIGxvbmcgdmFsOwotICByZWdpc3RlciBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHN5bWJvbFMgKmVudHJ5X3N5bTsKLSAgZml4UyAqZml4cDsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKLQotICBpZiAobm93X3NlZyAhPSBhbHBoYV9saW5rX3NlY3Rpb24pCi0gICAgewotICAgICAgYXNfYmFkIChfKCIucGRlc2MgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCA9PSAwKQotICAgICAgfHwgKCFTX0lTX0RFRklORUQgKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wpKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiLnBkZXNjIGhhcyBubyBtYXRjaGluZyAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKnN5bWJvbF9nZXRfb2JqIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sKSA9Ci0gICAgKHZhbHVlVCkgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemU7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIucGRlc2MgZGlyZWN0aXZlIGhhcyBubyBlbnRyeSBzeW1ib2wiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbnRyeV9zeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmZXhwKTsKLSAgLyogU2F2ZSBiZmQgc3ltYm9sIG9mIHByb2MgZGVzYyBpbiBmdW5jdGlvbiBzeW1ib2wuICAqLwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCktPnVkYXRhLnAKLSAgICA9IHN5bWJvbF9nZXRfYmZkc3ltIChlbnRyeV9zeW0pOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTm8gY29tbWEgYWZ0ZXIgLnBkZXNjIDxlbnRyeW5hbWU+IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmIChzdHJuY21wKG5hbWUsICJzdGFjayIsIDUpID09IDApCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID0gUERTQ19TX0tfS0lORF9GUF9TVEFDSzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAobmFtZSwgInJlZyIsIDMpID09IDApCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID0gUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAobmFtZSwgIm51bGwiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9IFBEU0NfU19LX0tJTkRfTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygidW5rbm93biBwcm9jZWR1cmUga2luZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZnJhZ19hbGlnbiAoMywgMCwgMCk7Ci0gIHAgPSBmcmFnX21vcmUgKDE2KTsKLSAgZml4cCA9IGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsIDAsIDAsIDAsIDApOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gMTY7Ci0KLSAgKnAgPSBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQKLSAgICAgICB8ICgoYWxwaGFfZXZheF9wcm9jLmZyYW1lcmVnID09IDI5KSA/IFBEU0NfU19NX0JBU0VfUkVHX0lTX0ZQIDogMCk7Ci0gICoocCsxKSA9IFBEU0NfU19NX05BVElWRQotCSAgIHwgUERTQ19TX01fTk9fSkFDS0VUOwotCi0gIHN3aXRjaCAoYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kKQotICAgIHsKLSAgICAgIGNhc2UgUERTQ19TX0tfS0lORF9OVUxMOgotCSoocCsyKSA9IDA7Ci0JKihwKzMpID0gMDsKLQlicmVhazsKLSAgICAgIGNhc2UgUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUjoKLQkqKHArMikgPSBhbHBoYV9ldmF4X3Byb2MuZnBfc2F2ZTsKLQkqKHArMykgPSBhbHBoYV9ldmF4X3Byb2MucmFfc2F2ZTsKLQlicmVhazsKLSAgICAgIGNhc2UgUERTQ19TX0tfS0lORF9GUF9TVEFDSzoKLQltZF9udW1iZXJfdG9fY2hhcnMgKHArMiwgKHZhbHVlVClhbHBoYV9ldmF4X3Byb2MucnNhX29mZnNldCwgMik7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgkJLyogaW1wb3NzaWJsZSAqLwotCWJyZWFrOwotICAgIH0KLQotICAqKHArNCkgPSAwOwotICAqKHArNSkgPSBhbHBoYV9ldmF4X3Byb2MudHlwZSAmIDB4MGY7Ci0KLSAgLyogU2lnbmF0dXJlIG9mZnNldC4gICovCi0gIG1kX251bWJlcl90b19jaGFycyAocCs2LCAodmFsdWVUKTAsIDIpOwotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCs4LCA4LCAmZXhwLCAwLCBCRkRfUkVMT0NfNjQpOwotCi0gIGlmIChhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPT0gUERTQ19TX0tfS0lORF9OVUxMKQotICAgIHJldHVybjsKLQotICAvKiBBZGQgZHVtbXkgZml4IHRvIG1ha2UgYWRkX3RvX2xpbmtfcG9vbCB3b3JrLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gIGZpeHAgPSBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAwLCAwLCAwLCAwKTsKLSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDg7Ci0KLSAgLyogcGRlc2MrMTY6IFNpemUuICAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpYWxwaGFfZXZheF9wcm9jLmZyYW1lc2l6ZSwgNCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwKzQsICh2YWx1ZVQpMCwgMik7Ci0KLSAgLyogRW50cnkgbGVuZ3RoLiAgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwKzYsIGFscGhhX2V2YXhfcHJvYy5wcm9sb2d1ZSwgMik7Ci0KLSAgaWYgKGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9PSBQRFNDX1NfS19LSU5EX0ZQX1JFR0lTVEVSKQotICAgIHJldHVybjsKLQotICAvKiBBZGQgZHVtbXkgZml4IHRvIG1ha2UgYWRkX3RvX2xpbmtfcG9vbCB3b3JrLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gIGZpeHAgPSBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAwLCAwLCAwLCAwKTsKLSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDg7Ci0KLSAgLyogcGRlc2MrMjQ6IHJlZ2lzdGVyIG1hc2tzLiAgKi8KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIGFscGhhX2V2YXhfcHJvYy5pbWFzaywgNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCs0LCBhbHBoYV9ldmF4X3Byb2MuZm1hc2ssIDQpOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBTdXBwb3J0IGZvciBjcmFzaCBkZWJ1ZyBvbiB2bXMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9uYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKLQotICBpZiAobm93X3NlZyAhPSBhbHBoYV9saW5rX3NlY3Rpb24pCi0gICAgewotICAgICAgYXNfYmFkIChfKCIubmFtZSBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubmFtZSBkaXJlY3RpdmUgaGFzIG5vIHN5bWJvbCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGZyYWdfYWxpZ24gKDMsIDAsIDApOwotICBwID0gZnJhZ19tb3JlICg4KTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gODsKLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsICZleHAsIDAsIEJGRF9SRUxPQ182NCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2xpbmthZ2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBjaGFyICpwOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJObyBzeW1ib2wgYWZ0ZXIgLmxpbmthZ2UiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcCA9IGZyYWdfbW9yZSAoTEtQX1NfS19TSVpFKTsKLSAgICAgIG1lbXNldCAocCwgMCwgTEtQX1NfS19TSVpFKTsKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBMS1BfU19LX1NJWkUsICZleHAsIDAsXAotCQkgICBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRSk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9jb2RlX2FkZHJlc3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBjaGFyICpwOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJObyBzeW1ib2wgYWZ0ZXIgLmNvZGVfYWRkcmVzcyIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwID0gZnJhZ19tb3JlICg4KTsKLSAgICAgIG1lbXNldCAocCwgMCwgOCk7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgJmV4cCwgMCxcCi0JCSAgIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUik7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9mcF9zYXZlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0KLSAgYWxwaGFfZXZheF9wcm9jLmZwX3NhdmUgPSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9tYXNrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAubWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MuaW1hc2sgPSB2YWw7Ci0gICAgICAodm9pZClnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2ZtYXNrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZm1hc2sgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLmZtYXNrID0gdmFsOwotICAgICAgKHZvaWQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2VuZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyIGM7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgYWxwaGFfZXZheF9wcm9jLnN5bWJvbCA9IDA7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2ZpbGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqczsKLSAgaW50IGxlbmd0aDsKLSAgc3RhdGljIGNoYXIgY2FzZV9oYWNrWzMyXTsKLQotICBleHRlcm4gY2hhciAqZGVtYW5kX2NvcHlfc3RyaW5nIFBBUkFNUyAoKGludCAqbGVuUCkpOwotCi0gIHNwcmludGYgKGNhc2VfaGFjaywgIjxDQVNFOiUwMWQlMDFkPiIsCi0JICAgYWxwaGFfZmxhZ19oYXNoX2xvbmdfbmFtZXMsIGFscGhhX2ZsYWdfc2hvd19hZnRlcl90cnVuYyk7Ci0KLSAgcyA9IHN5bWJvbF9maW5kX29yX21ha2UgKGNhc2VfaGFjayk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzKS0+ZmxhZ3MgfD0gQlNGX0ZJTEU7Ci0KLSAgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHMgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChkZW1hbmRfY29weV9zdHJpbmcgKCZsZW5ndGgpKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHMpLT5mbGFncyB8PSBCU0ZfRklMRTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0jZW5kaWYgLyogT0JKX0VWQVggICovCi0KLS8qIEhhbmRsZSB0aGUgLmdwcmVsMzIgcHNldWRvIG9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZ3ByZWwzMiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIGNoYXIgKnA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBleHByZXNzaW9uICgmZSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIHN3aXRjaCAoZS5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBlLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sKGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgZS5YX29wID0gT19zeW1ib2w7Ci0gICAgICAvKiBGQUxMVEhSVSAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0jZWxzZQotI2lmZGVmIE9CSl9FQ09GRgotICBzd2l0Y2ggKGUuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgZS5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgZS5YX29wID0gT19zdWJ0cmFjdDsKLSAgICAgIGUuWF9vcF9zeW1ib2wgPSBhbHBoYV9ncF9zeW1ib2w7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLSAgICBhbHBoYV9hbGlnbiAoMiwgKGNoYXIgKikgTlVMTCwgYWxwaGFfaW5zbl9sYWJlbCwgMCk7Ci0gIGlmIChhbHBoYV9jdXJyZW50X2FsaWduID4gMikKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gMjsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1lbXNldCAocCwgMCwgNCk7Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkgICAgICAgJmUsIDAsIEJGRF9SRUxPQ19HUFJFTDMyKTsKLX0KLQotLyogSGFuZGxlIGZsb2F0aW5nIHBvaW50IGFsbG9jYXRpb24gcHNldWRvLW9wcy4gIFRoaXMgaXMgbGlrZSB0aGUKLSAgIGdlbmVyaWMgdnJlc2lvbiwgYnV0IGl0IG1ha2VzIHN1cmUgdGhlIGN1cnJlbnQgbGFiZWwsIGlmIGFueSwgaXMKLSAgIGNvcnJlY3RseSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZmxvYXRfY29ucyAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGludCBsb2dfc2l6ZTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICBsb2dfc2l6ZSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ0cnOgotICAgICAgbG9nX3NpemUgPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIGxvZ19zaXplID0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgYWxwaGFfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotCi0gIGZsb2F0X2NvbnMgKHR5cGUpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5wcm9jIHBzZXVkbyBvcC4gIFdlIGRvbid0IHJlYWxseSBkbyBtdWNoIHdpdGggaXQgZXhjZXB0Ci0gICBwYXJzZSBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3Byb2MgKGlzX3N0YXRpYykKLSAgICAgaW50IGlzX3N0YXRpYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCB0ZW1wOwotCi0gIC8qIFRha2VzICIucHJvYyBuYW1lLG5hcmdzIiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc193YXJuIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIHRlbXAgPSAwOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIC8qICAqc3ltYm9sX2dldF9vYmogKHN5bWJvbFApID0gKHNpZ25lZCBjaGFyKSB0ZW1wOyAqLwotICBhc193YXJuIChfKCJ1bmhhbmRsZWQ6IC5wcm9jICVzLCVkIiksIG5hbWUsIHRlbXApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5zZXQgcHNldWRvIG9wLiAgVGhpcyBpcyB1c2VkIHRvIHR1cm4gb24gYW5kIG9mZiBtb3N0IG9mCi0gICB0aGUgYXNzZW1ibGVyIGZlYXR1cmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfc2V0ICh4KQotICAgICBpbnQgeCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lLCBjaCwgKnM7Ci0gIGludCB5ZXNubyA9IDE7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHMgPSBuYW1lOwotICBpZiAoc1swXSA9PSAnbicgJiYgc1sxXSA9PSAnbycpCi0gICAgewotICAgICAgeWVzbm8gPSAwOwotICAgICAgcyArPSAyOwotICAgIH0KLSAgaWYgKCFzdHJjbXAgKCJyZW9yZGVyIiwgcykpCi0gICAgLyogaWdub3JlICovIDsKLSAgZWxzZSBpZiAoIXN0cmNtcCAoImF0IiwgcykpCi0gICAgYWxwaGFfbm9hdF9vbiA9ICF5ZXNubzsKLSAgZWxzZSBpZiAoIXN0cmNtcCAoIm1hY3JvIiwgcykpCi0gICAgYWxwaGFfbWFjcm9zX29uID0geWVzbm87Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKCJtb3ZlIiwgcykpCi0gICAgLyogaWdub3JlICovIDsKLSAgZWxzZSBpZiAoIXN0cmNtcCAoInZvbGF0aWxlIiwgcykpCi0gICAgLyogaWdub3JlICovIDsKLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIlRyaWVkIHRvIC5zZXQgdW5yZWNvZ25pemVkIG1vZGUgYCVzJyIpLCBuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gY2g7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmJhc2UgcHNldWRvIG9wLiAgVGhpcyBjaGFuZ2VzIHRoZSBhc3NlbWJsZXIncyBub3Rpb24gb2YKLSAgIHRoZSAkZ3AgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9iYXNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiAwCi0gIGlmIChmaXJzdF8zMmJpdF9xdWFkcmFudCkKLSAgICB7Ci0gICAgICAvKiBub3QgZmF0YWwsIGJ1dCBpdCBtaWdodCBub3Qgd29yayBpbiB0aGUgZW5kICovCi0gICAgICBhc193YXJuIChfKCJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iKSk7Ci0gICAgICBmaXJzdF8zMmJpdF9xdWFkcmFudCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcpCi0gICAgewkJCQkvKiAkck5OIGZvcm0gKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ3InKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBhbHBoYV9ncF9yZWdpc3RlciA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxwaGFfZ3BfcmVnaXN0ZXIgPCAwIHx8IGFscGhhX2dwX3JlZ2lzdGVyID4gMzEpCi0gICAgewotICAgICAgYWxwaGFfZ3BfcmVnaXN0ZXIgPSBBWFBfUkVHX0dQOwotICAgICAgYXNfd2FybiAoXygiQmFkIGJhc2UgcmVnaXN0ZXIsIHVzaW5nICQlZC4iKSwgYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3AuICBUaGlzIGFsaWducyB0byBhIHBvd2VyIG9mIHR3by4gIEl0Ci0gICBhbHNvIGFkanVzdHMgYW55IGN1cnJlbnQgaW5zdHJ1Y3Rpb24gbGFiZWwuICBXZSB0cmVhdCB0aGlzIHRoZSBzYW1lCi0gICB3YXkgdGhlIE1JUFMgcG9ydCBkb2VzOiAuYWxpZ24gMCB0dXJucyBvZmYgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9hbGlnbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBhbGlnbjsKLSAgY2hhciBmaWxsLCAqcGZpbGw7Ci0gIGxvbmcgbWF4X2FsaWdubWVudCA9IDE1OwotCi0gIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCi0gICAgewotICAgICAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OwotICAgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZCIpLCBhbGlnbik7Ci0gICAgfQotICBlbHNlIGlmIChhbGlnbiA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiKSk7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHBmaWxsID0gJmZpbGw7Ci0gICAgfQotICBlbHNlCi0gICAgcGZpbGwgPSBOVUxMOwotCi0gIGlmIChhbGlnbiAhPSAwKQotICAgIHsKLSAgICAgIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICAgICAgYWxwaGFfYWxpZ24gKGFsaWduLCBwZmlsbCwgYWxwaGFfaW5zbl9sYWJlbCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDA7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhvb2sgdGhlIG5vcm1hbCBzdHJpbmcgcHJvY2Vzc29yIHRvIHJlc2V0IGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3N0cmluZ2VyICh0ZXJtaW5hdGUpCi0gICAgIGludCB0ZXJtaW5hdGU7Ci17Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgc3RyaW5nZXIgKHRlcm1pbmF0ZSk7Ci19Ci0KLS8qIEhvb2sgdGhlIG5vcm1hbCBzcGFjZSBwcm9jZXNzaW5nIHRvIHJlc2V0IGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NwYWNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgc19zcGFjZSAoaWdub3JlKTsKLX0KLQotLyogSG9vayBpbnRvIGNvbnMgZm9yIGF1dG8tYWxpZ25tZW50LiAgKi8KLQotdm9pZAotYWxwaGFfY29uc19hbGlnbiAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBsb2dfc2l6ZTsKLQotICBsb2dfc2l6ZSA9IDA7Ci0gIHdoaWxlICgoc2l6ZSA+Pj0gMSkgIT0gMCkKLSAgICArK2xvZ19zaXplOwotCi0gIGlmIChhbHBoYV9hdXRvX2FsaWduX29uICYmIGFscGhhX2N1cnJlbnRfYWxpZ24gPCBsb2dfc2l6ZSkKLSAgICBhbHBoYV9hbGlnbiAobG9nX3NpemUsIChjaGFyICopIE5VTEwsIGFscGhhX2luc25fbGFiZWwsIDApOwotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+IGxvZ19zaXplKQotICAgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSBsb2dfc2l6ZTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci19Ci0KLS8qIEhlcmUgY29tZSB0aGUgLnV3b3JkLCAudWxvbmcsIGFuZCAudXF1YWQgZXhwbGljaXRseSB1bmFsaWduZWQKLSAgIHBzZXVkb3MuICBXZSBqdXN0IHR1cm4gb2ZmIGF1dG8tYWxpZ25tZW50IGFuZCBjYWxsIGRvd24gdG8gY29ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3Vjb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICBpbnQgaG9sZCA9IGFscGhhX2F1dG9fYWxpZ25fb247Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAwOwotICBjb25zIChieXRlcyk7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSBob2xkOwotfQotCi0vKiBTd2l0Y2ggdGhlIHdvcmtpbmcgY3B1IHR5cGUuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9hcmNoIChpZ25vcmVkKQotICAgICBpbnQgaWdub3JlZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lLCBjaDsKLSAgY29uc3Qgc3RydWN0IGNwdV90eXBlICpwOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2ggPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBmb3IgKHAgPSBjcHVfdHlwZXM7IHAtPm5hbWU7ICsrcCkKLSAgICBpZiAoc3RyY21wKG5hbWUsIHAtPm5hbWUpID09IDApCi0gICAgICB7Ci0gICAgICAgIGFscGhhX3RhcmdldF9uYW1lID0gcC0+bmFtZSwgYWxwaGFfdGFyZ2V0ID0gcC0+ZmxhZ3M7Ci0JZ290byBmb3VuZDsKLSAgICAgIH0KLSAgYXNfd2FybigiVW5rbm93biBDUFUgaWRlbnRpZmllciBgJXMnIiwgbmFtZSk7Ci0KLWZvdW5kOgotICAqaW5wdXRfbGluZV9wb2ludGVyID0gY2g7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLQwKLQotI2lmZGVmIERFQlVHMQotLyogcHJpbnQgdG9rZW4gZXhwcmVzc2lvbiB3aXRoIGFscGhhIHNwZWNpZmljIGV4dGVuc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9wcmludF90b2tlbihmLCBleHApCi0gICAgRklMRSAqZjsKLSAgICBjb25zdCBleHByZXNzaW9uUyAqZXhwOwotewotICBzd2l0Y2ggKGV4cC0+WF9vcCkKLSAgICB7Ci0gICAgICBjYXNlIE9fY3ByZWdpc3RlcjoKLQlwdXRjICgnLCcsIGYpOwotCS8qIEZBTExUSFJVICovCi0gICAgICBjYXNlIE9fcHJlZ2lzdGVyOgotCXB1dGMgKCcoJywgZik7Ci0JewotCSAgZXhwcmVzc2lvblMgbmV4cCA9ICpleHA7Ci0JICBuZXhwLlhfb3AgPSBPX3JlZ2lzdGVyOwotCSAgcHJpbnRfZXhwciAoZiwgJm5leHApOwotCX0KLQlwdXRjICgnKScsIGYpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlwcmludF9leHByIChmLCBleHApOwotCWJyZWFrOwotICAgIH0KLSAgcmV0dXJuOwotfQotI2VuZGlmCi0MCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0jaWZkZWYgT0JKX0VDT0ZGCi0gIHsiY29tbSIsIHNfYWxwaGFfY29tbSwgMH0sCS8qIG9zZjEgY29tcGlsZXIgZG9lcyB0aGlzICovCi0gIHsicmRhdGEiLCBzX2FscGhhX3JkYXRhLCAwfSwKLSNlbmRpZgotICB7InRleHQiLCBzX2FscGhhX3RleHQsIDB9LAotICB7ImRhdGEiLCBzX2FscGhhX2RhdGEsIDB9LAotI2lmZGVmIE9CSl9FQ09GRgotICB7InNkYXRhIiwgc19hbHBoYV9zZGF0YSwgMH0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIHsic2VjdGlvbiIsIHNfYWxwaGFfc2VjdGlvbiwgMH0sCi0gIHsic2VjdGlvbi5zIiwgc19hbHBoYV9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0Iiwgc19hbHBoYV9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0LnMiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLSAgeyAicGRlc2MiLCBzX2FscGhhX3BkZXNjLCAwfSwKLSAgeyAibmFtZSIsIHNfYWxwaGFfbmFtZSwgMH0sCi0gIHsgImxpbmthZ2UiLCBzX2FscGhhX2xpbmthZ2UsIDB9LAotICB7ICJjb2RlX2FkZHJlc3MiLCBzX2FscGhhX2NvZGVfYWRkcmVzcywgMH0sCi0gIHsgImVudCIsIHNfYWxwaGFfZW50LCAwfSwKLSAgeyAiZnJhbWUiLCBzX2FscGhhX2ZyYW1lLCAwfSwKLSAgeyAiZnBfc2F2ZSIsIHNfYWxwaGFfZnBfc2F2ZSwgMH0sCi0gIHsgIm1hc2siLCBzX2FscGhhX21hc2ssIDB9LAotICB7ICJmbWFzayIsIHNfYWxwaGFfZm1hc2ssIDB9LAotICB7ICJlbmQiLCBzX2FscGhhX2VuZCwgMH0sCi0gIHsgImZpbGUiLCBzX2FscGhhX2ZpbGUsIDB9LAotICB7ICJyZGF0YSIsIHNfYWxwaGFfc2VjdGlvbiwgMX0sCi0gIHsgImNvbW0iLCBzX2FscGhhX2NvbW0sIDB9LAotICB7ICJsaW5rIiwgc19hbHBoYV9zZWN0aW9uLCAzfSwKLSAgeyAiY3RvcnMiLCBzX2FscGhhX3NlY3Rpb24sIDR9LAotICB7ICJkdG9ycyIsIHNfYWxwaGFfc2VjdGlvbiwgNX0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEZyYW1lIHJlbGF0ZWQgcHNldWRvcy4gICovCi0gIHsiZW50Iiwgc19hbHBoYV9lbnQsIDB9LAotICB7ImVuZCIsIHNfYWxwaGFfZW5kLCAwfSwKLSAgeyJtYXNrIiwgc19hbHBoYV9tYXNrLCAwfSwKLSAgeyJmbWFzayIsIHNfYWxwaGFfbWFzaywgMX0sCi0gIHsiZnJhbWUiLCBzX2FscGhhX2ZyYW1lLCAwfSwKLSAgeyJwcm9sb2d1ZSIsIHNfYWxwaGFfcHJvbG9ndWUsIDB9LAotICAvKiBDT0ZGIGRlYnVnZ2luZyByZWxhdGVkIHBzZXVkb3MuICAqLwotICB7ImJlZ2luIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDB9LAotICB7ImJlbmQiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMX0sCi0gIHsiZGVmIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDJ9LAotICB7ImRpbSIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCAzfSwKLSAgeyJlbmRlZiIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA0fSwKLSAgeyJmaWxlIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDV9LAotICB7InNjbCIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA2fSwKLSAgeyJ0YWciLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgN30sCi0gIHsidmFsIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDh9LAotICB7ImxvYyIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA5fSwKLSNlbHNlCi0gIHsicHJvbG9ndWUiLCBzX2lnbm9yZSwgMH0sCi0jZW5kaWYKLSAgeyJncHJlbDMyIiwgc19hbHBoYV9ncHJlbDMyLCAwfSwKLSAgeyJ0X2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZCd9LAotICB7InNfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsiZl9mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ0YnfSwKLSAgeyJnX2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnRyd9LAotICB7ImRfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdEJ30sCi0KLSAgeyJwcm9jIiwgc19hbHBoYV9wcm9jLCAwfSwKLSAgeyJhcHJvYyIsIHNfYWxwaGFfcHJvYywgMX0sCi0gIHsic2V0Iiwgc19hbHBoYV9zZXQsIDB9LAotICB7InJlZ3VzZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJsaXZlcmVnIiwgc19pZ25vcmUsIDB9LAotICB7ImJhc2UiLCBzX2FscGhhX2Jhc2UsIDB9LAkJLyo/PyovCi0gIHsib3B0aW9uIiwgc19pZ25vcmUsIDB9LAotICB7ImFlbnQiLCBzX2lnbm9yZSwgMH0sCi0gIHsidWdlbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJlZmxhZyIsIHNfaWdub3JlLCAwfSwKLQotICB7ImFsaWduIiwgc19hbHBoYV9hbGlnbiwgMH0sCi0gIHsiZG91YmxlIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZCd9LAotICB7ImZsb2F0Iiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZid9LAotICB7InNpbmdsZSIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJhc2NpaSIsIHNfYWxwaGFfc3RyaW5nZXIsIDB9LAotICB7ImFzY2l6Iiwgc19hbHBoYV9zdHJpbmdlciwgMX0sCi0gIHsic3RyaW5nIiwgc19hbHBoYV9zdHJpbmdlciwgMX0sCi0gIHsic3BhY2UiLCBzX2FscGhhX3NwYWNlLCAwfSwKLSAgeyJza2lwIiwgc19hbHBoYV9zcGFjZSwgMH0sCi0gIHsiemVybyIsIHNfYWxwaGFfc3BhY2UsIDB9LAotCi0vKiBVbmFsaWduZWQgZGF0YSBwc2V1ZG9zLiAgKi8KLSAgeyJ1d29yZCIsIHNfYWxwaGFfdWNvbnMsIDJ9LAotICB7InVsb25nIiwgc19hbHBoYV91Y29ucywgNH0sCi0gIHsidXF1YWQiLCBzX2FscGhhX3Vjb25zLCA4fSwKLQotI2lmZGVmIE9CSl9FTEYKLS8qIER3YXJmIHdhbnRzIHRoZXNlIHZlcnNpb25zIG9mIHVuYWxpZ25lZC4gICovCi0gIHsiMmJ5dGUiLCBzX2FscGhhX3Vjb25zLCAyfSwKLSAgeyI0Ynl0ZSIsIHNfYWxwaGFfdWNvbnMsIDR9LAotICB7IjhieXRlIiwgc19hbHBoYV91Y29ucywgOH0sCi0jZW5kaWYKLQotLyogV2UgZG9uJ3QgZG8gYW55IG9wdGltaXppbmcsIHNvIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZXNlLiAgKi8KLSAgeyJub2FsaWFzIiwgc19pZ25vcmUsIDB9LAotICB7ImFsaWFzIiwgc19pZ25vcmUsIDB9LAotCi0gIHsiYXJjaCIsIHNfYWxwaGFfYXJjaCwgMH0sCi0KLSAge05VTEwsIDAsIDB9LAotfTsKLQotDAotLyogQnVpbGQgYSBCRkQgc2VjdGlvbiB3aXRoIGl0cyBmbGFncyBzZXQgYXBwcm9wcmlhdGVseSBmb3IgdGhlIC5saXRhLAotICAgLmxpdDgsIG9yIC5saXQ0IHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gKG5hbWUsIHNlY3AsIHN5bXApCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHNlZ1QgKnNlY3A7Ci0gICAgIHN5bWJvbFMgKipzeW1wOwotewotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHNlZ1QgbmV3X3NlYzsKLQotICAqc2VjcCA9IG5ld19zZWMgPSBzdWJzZWdfbmV3IChuYW1lLCAwKTsKLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgbmV3X3NlYywgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBuZXdfc2VjLAotCQkJIFNFQ19SRUxPQyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZCi0JCQkgfCBTRUNfREFUQSk7Ci0KLSAgU19DTEVBUl9FWFRFUk5BTCAoKnN5bXAgPSBzZWN0aW9uX3N5bWJvbCAobmV3X3NlYykpOwotfQotCi0jaWZkZWYgT0JKX0VDT0ZGCi0KLS8qIEBAQCBHUCBzZWxlY3Rpb24gdm9vZG9vLiAgQWxsIG9mIHRoaXMgc2VlbXMgb3Zlcmx5IGNvbXBsaWNhdGVkIGFuZAotICAgdW5uZWNlc3Nhcnk7IHdoaWNoIGlzIHRoZSBwcmltYXJ5IHJlYXNvbiBpdCdzIGZvciBFQ09GRiBvbmx5LiAgKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi1tYXliZV9zZXRfZ3AgKHNlYykKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgYmZkX3ZtYSB2bWE7Ci0gIGlmICghc2VjKQotICAgIHJldHVybjsKLSAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoZm9vLCBzZWMpOwotICBpZiAodm1hICYmIHZtYSA8IGFscGhhX2dwX3ZhbHVlKQotICAgIGFscGhhX2dwX3ZhbHVlID0gdm1hOwotfQotCi1zdGF0aWMgdm9pZAotc2VsZWN0X2dwX3ZhbHVlICgpCi17Ci0gIGFzc2VydCAoYWxwaGFfZ3BfdmFsdWUgPT0gMCk7Ci0KLSAgLyogR2V0IG1pbnVzLW9uZSBpbiB3aGF0ZXZlciB3aWR0aC4uLiAgKi8KLSAgYWxwaGFfZ3BfdmFsdWUgPSAwOyBhbHBoYV9ncF92YWx1ZS0tOwotCi0gIC8qIFNlbGVjdCB0aGUgc21hbGxlc3QgVk1BIG9mIHRoZXNlIGV4aXN0aW5nIHNlY3Rpb25zLiAgKi8KLSAgbWF5YmVfc2V0X2dwIChhbHBoYV9saXRhX3NlY3Rpb24pOwotI2lmIDAKLSAgLyogVGhlc2Ugd2VyZSBkaXNhYmxlZCBiZWZvcmUgLS0gc2hvdWxkIHdlIHVzZSB0aGVtPyAgKi8KLSAgbWF5YmVfc2V0X2dwIChzZGF0YSk7Ci0gIG1heWJlX3NldF9ncCAobGl0OF9zZWMpOwotICBtYXliZV9zZXRfZ3AgKGxpdDRfc2VjKTsKLSNlbmRpZgotCi0vKiBAQCBXaWxsIGEgc2ltcGxlIDB4ODAwMCB3b3JrIGhlcmU/ICBJZiBub3QsIHdoeSBub3Q/ICAqLwotI2RlZmluZSBHUF9BREpVU1RNRU5UCSgweDgwMDAgLSAweDEwKQotCi0gIGFscGhhX2dwX3ZhbHVlICs9IEdQX0FESlVTVE1FTlQ7Ci0KLSAgU19TRVRfVkFMVUUgKGFscGhhX2dwX3N5bWJvbCwgYWxwaGFfZ3BfdmFsdWUpOwotCi0jaWZkZWYgREVCVUcxCi0gIHByaW50ZiAoXygiQ2hvc2UgR1AgdmFsdWUgb2YgJWx4XG4iKSwgYWxwaGFfZ3BfdmFsdWUpOwotI2VuZGlmCi19Ci0jZW5kaWYgLyogT0JKX0VDT0ZGICovCi0KLS8qIENhbGxlZCBpbnRlcm5hbGx5IHRvIGhhbmRsZSBhbGwgYWxpZ25tZW50IG5lZWRzLiAgVGhpcyB0YWtlcyBjYXJlCi0gICBvZiBlbGlkaW5nIGNhbGxzIHRvIGZyYWdfYWxpZ24gaWYnbiB0aGUgY2FjaGVkIGN1cnJlbnQgYWxpZ25tZW50Ci0gICBzYXlzIHdlJ3ZlIGFscmVhZHkgZ290IGl0LCBhcyB3ZWxsIGFzIHRha2luZyBjYXJlIG9mIHRoZSBhdXRvLWFsaWduCi0gICBmZWF0dXJlIHdydCBsYWJlbHMuICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfYWxpZ24gKG4sIHBmaWxsLCBsYWJlbCwgZm9yY2UpCi0gICAgIGludCBuOwotICAgICBjaGFyICpwZmlsbDsKLSAgICAgc3ltYm9sUyAqbGFiZWw7Ci0gICAgIGludCBmb3JjZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+PSBuKQotICAgIHJldHVybjsKLQotICBpZiAocGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA+IDIKLQkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLQl7Ci0JICBzdGF0aWMgY2hhciBjb25zdCB1bm9wWzRdID0geyAweDAwLCAweDAwLCAweGUwLCAweDJmIH07Ci0JICBzdGF0aWMgY2hhciBjb25zdCBub3B1bm9wWzhdID0gewotCQkweDFmLCAweDA0LCAweGZmLCAweDQ3LAotCQkweDAwLCAweDAwLCAweGUwLCAweDJmCi0JICB9OwotCi0JICAvKiBGaXJzdCwgbWFrZSBzdXJlIHdlJ3JlIG9uIGEgZm91ci1ieXRlIGJvdW5kYXJ5LCBpbiBjYXNlCi0JICAgICBzb21lb25lIGhhcyBiZWVuIHB1dHRpbmcgLmJ5dGUgdmFsdWVzIGludG8gdGhlIHRleHQKLQkgICAgIHNlY3Rpb24uICBUaGUgREVDIGFzc2VtYmxlciBzaWxlbnRseSBmaWxscyB3aXRoIHVuYWxpZ25lZAotCSAgICAgbm8tb3AgaW5zdHJ1Y3Rpb25zLiAgVGhpcyB3aWxsIHplcm8tZmlsbCwgdGhlbiBub3AtZmlsbAotCSAgICAgd2l0aCBwcm9wZXIgYWxpZ25tZW50LiAgKi8KLQkgIGlmIChhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLQkgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0JICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA8IDMpCi0JICAgIGZyYWdfYWxpZ25fcGF0dGVybiAoMywgdW5vcCwgc2l6ZW9mIHVub3AsIDApOwotCSAgaWYgKG4gPiAzKQotCSAgICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcHVub3AsIHNpemVvZiBub3B1bm9wLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbiAobiwgMCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKLQotICBhbHBoYV9jdXJyZW50X2FsaWduID0gbjsKLQotICBpZiAobGFiZWwgIT0gTlVMTCAmJiBTX0dFVF9TRUdNRU5UIChsYWJlbCkgPT0gbm93X3NlZykKLSAgICB7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxhYmVsLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9WQUxVRSAobGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgfQotCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIG4pOwotCi0gIC8qID8/PyBpZiBhbHBoYV9mbGFnX3JlbGF4ICYmIGZvcmNlICYmIGVsZiwgcmVjb3JkIHRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50Ci0gICAgIGluIGEgcmVsb2MgZm9yIHRoZSBsaW5rZXIgdG8gc2VlLiAgKi8KLX0KLQotLyogVGhlIEFscGhhIGhhcyBzdXBwb3J0IGZvciBzb21lIFZBWCBmbG9hdGluZyBwb2ludCB0eXBlcywgYXMgd2VsbCBhcyBmb3IKLSAgIElFRUUgZmxvYXRpbmcgcG9pbnQuICBXZSBjb25zaWRlciBJRUVFIHRvIGJlIHRoZSBwcmltYXJ5IGZsb2F0aW5nIHBvaW50Ci0gICBmb3JtYXQsIGFuZCBzbmVhayBpbiB0aGUgVkFYIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgaGVyZS4gICovCi0jZGVmaW5lIG1kX2F0b2YgdmF4X21kX2F0b2YKLSNpbmNsdWRlICJjb25maWcvYXRvZi12YXguYyIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYWxwaGEuaCBiL2dhcy9jb25maWcvdGMtYWxwaGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyYjA0ZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWFscGhhLmgKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtlbiBSYWVidXJuIDxyYWVidXJuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX0FMUEhBCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBUQVJHRVRfQVJDSAkJCWJmZF9hcmNoX2FscGhhCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIJXAotCQkgICAgICAgPyAiZWNvZmYtbGl0dGxlYWxwaGEiCQkJCVwKLQkJICAgICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCVwKLQkJICAgICAgID8gImVsZjY0LWFscGhhIgkJCQkJXAotCQkgICAgICAgOiBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCVwKLQkJICAgICAgID8gInZtcy1hbHBoYSIJCQkJCVwKLQkJICAgICAgIDogInVua25vd24tZm9ybWF0IikKLQotI2RlZmluZSBORUVEX0xJVEVSQUxfUE9PTAotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLSNkZWZpbmUgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLQotZXh0ZXJuIGludCBhbHBoYV9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotZXh0ZXJuIGludCBhbHBoYV9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYWxwaGFfZ3BybWFzaywgYWxwaGFfZnBybWFzazsKLWV4dGVybiB2YWx1ZVQgYWxwaGFfZ3BfdmFsdWU7Ci0KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQlhbHBoYV9mb3JjZV9yZWxvY2F0aW9uIChGSVhQKQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVhQKQkJYWxwaGFfZml4X2FkanVzdGFibGUgKEZJWFApCi0jZGVmaW5lIFJFTE9DX1JFUVVJUkVTX1NZTUJPTAotCi0vKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsCi0gICBvYmplY3QgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4KLSAgIFRydWUgaWYgd2UgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcKLSAgIHRoZSAubyBmaWxlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHBjcmVsIHJlbG9jYXRpb25zLiAgKi8KLQotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKQkJCQlcCi0gICgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTAkJCQkJXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLSAgICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KQkJCQlcCi0gICAgICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotICAgICAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKQotCi0jZGVmaW5lIG1kX2NvbnZlcnRfZnJhZyhiLHMsZikJCWFzX2ZhdGFsICgiYWxwaGEgY29udmVydF9mcmFnXG4iKQotI2RlZmluZSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheChmLHMpIFwKLQkJCShhc19mYXRhbCgiZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggY2FsbGVkIiksMSkKLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jaWZkZWYgT0JKX0VWQVgKLQotLyogVGhpcyBmaWVsZCBrZWVwcyB0aGUgc3ltYm9scyBwb3NpdGlvbiBpbiB0aGUgbGluayBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgdmFsdWVUCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXKEZSQUcsT0ZGLExFTixFWFApIFwKLSAgICAgIGZpeF9uZXdfZXhwIChGUkFHLCBPRkYsIChpbnQpTEVOLCBFWFAsIDAsIFwKLQlMRU4gPT0gMiA/IEJGRF9SRUxPQ18xNiBcCi0JOiBMRU4gPT0gNCA/IEJGRF9SRUxPQ18zMiBcCi0JOiBMRU4gPT0gOCA/IEJGRF9SRUxPQ182NCBcCi0JOiBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRSk7Ci0jZW5kaWYKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMJCW51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotZXh0ZXJuIGludCB0Y19nZXRfcmVnaXN0ZXIgUEFSQU1TICgoaW50IGZyYW1lKSk7Ci1leHRlcm4gdm9pZCBhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBhbHBoYV9kZWZpbmVfbGFiZWwgKHN5bSkKLWV4dGVybiB2b2lkIGFscGhhX2RlZmluZV9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgYWxwaGFfY29uc19hbGlnbiAobmJ5dGVzKQotZXh0ZXJuIHZvaWQgYWxwaGFfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLQotI2lmZGVmIE9CSl9FQ09GRgotI2RlZmluZSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCgpIGFscGhhX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpCi1leHRlcm4gdm9pZCBhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBESUZGX0VYUFJfT0sgICAvKiBmb28tLiBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5zZGF0YSIsICAgU0hUX1BST0dCSVRTLCAgIFNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9BTFBIQV9HUFJFTCAgfSwgXAotICB7ICIuc2JzcyIsICAgIFNIVF9OT0JJVFMsICAgICBTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfQUxQSEFfR1BSRUwgIH0sCi0jZW5kaWYKLQotLyogV2hldGhlciB0byBhZGQgc3VwcG9ydCBmb3IgZXhwbGljdCAhcmVsb2NhdGlvbl9vcCFzZXF1ZW5jZV9udW1iZXIuICBBdCB0aGUKLSAgIG1vbWVudCwgb25seSBkbyB0aGlzIGZvciBFTEYsIHRob3VnaCBFQ09GRiBjb3VsZCB1c2UgaXQgYXMgd2VsbC4gICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFJFTE9DX09QX1AKLSNlbmRpZgotCi0jaWZkZWYgUkVMT0NfT1BfUAotLyogQmVmb3JlIHRoZSByZWxvY2F0aW9ucyBhcmUgd3JpdHRlbiwgcmVvcmRlciB0aGVtLCBzbyB0aGF0IHVzZXIgc3VwcGxpZWQKLSAgICFsaXR1c2UgcmVsb2NhdGlvbnMgZm9sbG93IHRoZSBhcHByb3ByaWF0ZSAhbGl0ZXJhbCByZWxvY2F0aW9ucy4gIEFsc28KLSAgIGNvbnZlcnQgdGhlIGdhcy1pbnRlcm5hbCByZWxvY2F0aW9ucyB0byB0aGUgYXBwcm9wcmlhdGUgbGlua2VyIHJlbG9jYXRpb25zLgotICAgKi8KLSNkZWZpbmUgdGNfYWRqdXN0X3N5bXRhYigpIGFscGhhX2FkanVzdF9zeW10YWIgKCkKLWV4dGVybiB2b2lkIGFscGhhX2FkanVzdF9zeW10YWIgUEFSQU1TICgodm9pZCkpOwotCi0vKiBOZXcgZmllbGRzIGZvciBzdXBwb3J0aW5nIGV4cGxpY2l0IHJlbG9jYXRpb25zIChzdWNoIGFzICFsaXRlcmFsIHRvIG1hcmsKLSAgIHdoZXJlIGEgcG9pbnRlciBpcyBsb2FkZWQgZnJvbSB0aGUgZ2xvYmFsIHRhYmxlLCBhbmQgIWxpdHVzZV9iYXNlIHRvIHRyYWNrCi0gICBhbGwgb2YgdGhlIG5vcm1hbCB1c2VzIG9mIHRoYXQgcG9pbnRlcikuICAqLwotCi0jZGVmaW5lIFRDX0ZJWF9UWVBFIHN0cnVjdCBhbHBoYV9maXhfdGFnCi0KLXN0cnVjdCBhbHBoYV9maXhfdGFnCi17Ci0gIHN0cnVjdCBmaXggKm5leHRfbGl0dXNlOwkJLyogbmV4dCAhbGl0dXNlICovCi0gIHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZyAqaW5mbzsJLyogb3RoZXIgbWVtYmVycyB3aXRoIHNhbWUgc2VxdWVuY2UgKi8KLX07Ci0KLS8qIEluaXRpYWxpemUgdGhlIFRDX0ZJWF9UWVBFIGZpZWxkLiAgKi8KLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShmaXhQKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGZpeFAtPnRjX2ZpeF9kYXRhLm5leHRfbGl0dXNlID0gKHN0cnVjdCBmaXggKikwOwkJCVwKLSAgZml4UC0+dGNfZml4X2RhdGEuaW5mbyA9IChzdHJ1Y3QgYWxwaGFfbGl0ZXJhbF90YWcgKikwOwkJXAotfSB3aGlsZSAoMCkKLQotLyogV29yayB3aXRoIERFQlVHNSB0byBwcmludCBmaWVsZHMgaW4gdGNfZml4X3R5cGUuICAqLwotI2RlZmluZSBUQ19GSVhfREFUQV9QUklOVChzdHJlYW0sZml4UCkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIGlmIChmaXhQLT50Y19maXhfZGF0YS5pbmZvKQkJCQkJCVwKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcdGluZm8gPSAweCVseCwgbmV4dF9saXR1c2UgPSAweCVseFxuIiwgXAotCSAgICAgKGxvbmcpZml4UC0+dGNfZml4X2RhdGEuaW5mbywJCQkJXAotCSAgICAgKGxvbmcpZml4UC0+dGNfZml4X2RhdGEubmV4dF9saXR1c2UpOwkJCVwKLX0gd2hpbGUgKDApCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJjLmMgYi9nYXMvY29uZmlnL3RjLWFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFmZWEzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg0ICswLDAgQEAKLS8qIHRjLWFyYy5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIEFSQwotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2FyYy5oIgotI2luY2x1ZGUgImVsZi9hcmMuaCIKLQotZXh0ZXJuIGludCBhcmNfZ2V0X21hY2ggUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBhcmNfaW5zbiBhcmNfaW5zZXJ0X29wZXJhbmQgUEFSQU1TICgoYXJjX2luc24sCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKiwgaW50LAotCQkJCQkgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICosCi0JCQkJCSAgICBvZmZzZXRULCBjaGFyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgYXJjX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGFyY19jcHUgUEFSQU1TICgoaW50KSk7Ci0vKnN0YXRpYyB2b2lkIGFyY19yZW5hbWUgUEFSQU1TICgoaW50KSk7Ki8KLXN0YXRpYyBpbnQgZ2V0X2FyY19leHBfcmVsb2NfdHlwZSBQQVJBTVMgKChpbnQsIGludCwgZXhwcmVzc2lvblMgKiwKLQkJCQkJICAgZXhwcmVzc2lvblMgKikpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDAgfSwJLyogRGVmYXVsdGluZyBpcyBpbnZhbGlkICgwKSAqLwotICB7ICJjb21tb24iLCBhcmNfY29tbW9uLCAwIH0sCi0vKnsgImh3b3JkIiwgY29ucywgMiB9LCAtIGFscmVhZHkgZXhpc3RzICovCi0gIHsgIndvcmQiLCBjb25zLCA0IH0sCi0vKnsgInh3b3JkIiwgY29ucywgOCB9LCovCi0gIHsgImNwdSIsIGFyY19jcHUsIDAgfSwKLS8qeyAicmVuYW1lIiwgYXJjX3JlbmFtZSwgMCB9LCovCi0gIHsgTlVMTCwgMCwgMCB9LAotfTsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiM7IjsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIHN0YXJ0ZWQgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cwotICAgd29yayBpZiAnLycgaXNuJ3Qgb3RoZXJ3aXNlIGRlZmluZWQuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREIjsKLQotLyogQnl0ZSBvcmRlci4gICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotY29uc3QgY2hhciAqYXJjX3RhcmdldF9mb3JtYXQgPSBERUZBVUxUX1RBUkdFVF9GT1JNQVQ7Ci1zdGF0aWMgaW50IGJ5dGVfb3JkZXIgPSBERUZBVUxUX0JZVEVfT1JERVI7Ci0KLS8qIE9uZSBvZiBiZmRfbWFjaF9hcmNfeHh4LiAgKi8KLXN0YXRpYyBpbnQgYXJjX21hY2hfdHlwZSA9IGJmZF9tYWNoX2FyY19iYXNlOwotCi0vKiBOb24temVybyBpZiB0aGUgY3B1IHR5cGUgaGFzIGJlZW4gZXhwbGljaXRseSBzcGVjaWZpZWQuICAqLwotc3RhdGljIGludCBtYWNoX3R5cGVfc3BlY2lmaWVkX3AgPSAwOwotCi0vKiBOb24temVybyBpZiBvcGNvZGUgdGFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgIEEgLmNwdSBjb21tYW5kIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgaW5zdHJ1Y3Rpb25zLiAgKi8KLXN0YXRpYyBpbnQgY3B1X3RhYmxlc19pbml0X3AgPSAwOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYXJjX3N1ZmZpeF9oYXNoID0gTlVMTDsKLQwKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSNkZWZpbmUgT1BUSU9OX0VCIChPUFRJT05fTURfQkFTRSArIDApCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSNkZWZpbmUgT1BUSU9OX0VMIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSAgeyBOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMCB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotLyoKLSAqIG1kX3BhcnNlX29wdGlvbgotICoKLSAqIEludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gKiBTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uCi0gKi8KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9FQjoKLSAgICAgIGJ5dGVfb3JkZXIgPSBCSUdfRU5ESUFOOwotICAgICAgYXJjX3RhcmdldF9mb3JtYXQgPSAiZWxmMzItYmlnYXJjIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0VMOgotICAgICAgYnl0ZV9vcmRlciA9IExJVFRMRV9FTkRJQU47Ci0gICAgICBhcmNfdGFyZ2V0X2Zvcm1hdCA9ICJlbGYzMi1saXR0bGVhcmMiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLUFSQyBvcHRpb25zOlxuXAotLUVCCQkJZ2VuZXJhdGUgYmlnIGVuZGlhbiBvdXRwdXRcblwKLS1FTAkJCWdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gb3V0cHV0XG4iKSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLgotICAgT3Bjb2RlIHNlbGVjdGlvbiBpcyBkZWZlcmVkIHVudGlsIGxhdGVyIGJlY2F1c2Ugd2UgbWlnaHQgc2VlIGEgLmNwdQotICAgY29tbWFuZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIC8qIFRoZSBlbmRpYW5uZXNzIGNhbiBiZSBjaG9zZW4gImF0IHRoZSBmYWN0b3J5Ii4gICovCi0gIHRhcmdldF9iaWdfZW5kaWFuID0gYnl0ZV9vcmRlciA9PSBCSUdfRU5ESUFOOwotCi0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfYXJjLCBhcmNfbWFjaF90eXBlKSkKLSAgICBhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICAvKiBBc3N1bWUgdGhlIGJhc2UgY3B1LiAgVGhpcyBjYWxsIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIG5lZWQgdG8KLSAgICAgaW5pdGlhbGl6ZSBgYXJjX29wZXJhbmRfbWFwJyB3aGljaCBtYXkgYmUgbmVlZGVkIGJlZm9yZSB3ZSBzZWUgdGhlCi0gICAgIGZpcnN0IGluc24uICAqLwotICBhcmNfb3Bjb2RlX2luaXRfdGFibGVzIChhcmNfZ2V0X29wY29kZV9tYWNoIChiZmRfbWFjaF9hcmNfYmFzZSwKLQkJCQkJICAgICAgIHRhcmdldF9iaWdfZW5kaWFuKSk7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgb3Bjb2RlIGFuZCBvcGVyYW5kIHRhYmxlcy4KLSAgIE1BQ0ggaXMgb25lIG9mIGJmZF9tYWNoX2FyY194eHguICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF9vcGNvZGVfdGFibGVzIChtYWNoKQotICAgICBpbnQgbWFjaDsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0gIGNoYXIgKmxhc3Q7Ci0KLSAgaWYgKChhcmNfc3VmZml4X2hhc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIikpOwotCi0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfYXJjLCBtYWNoKSkKLSAgICBhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICAvKiBUaGlzIGluaXRpYWxpemVzIGEgZmV3IHRoaW5ncyBpbiBhcmMtb3BjLmMgdGhhdCB3ZSBuZWVkLgotICAgICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdmFyaW91cyBhcmNfeHh4X3N1cHBvcnRlZCBmbnMuICAqLwotICBhcmNfb3Bjb2RlX2luaXRfdGFibGVzIChhcmNfZ2V0X29wY29kZV9tYWNoIChtYWNoLCB0YXJnZXRfYmlnX2VuZGlhbikpOwotCi0gIC8qIE9ubHkgcHV0IHRoZSBmaXJzdCBlbnRyeSBvZiBlYWNoIGVxdWl2YWxlbnRseSBuYW1lZCBzdWZmaXggaW4gdGhlCi0gICAgIHRhYmxlLiAgKi8KLSAgbGFzdCA9ICIiOwotICBmb3IgKGkgPSAwOyBpIDwgYXJjX3N1ZmZpeGVzX2NvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKCEgYXJjX29wdmFsX3N1cHBvcnRlZCAoJmFyY19zdWZmaXhlc1tpXSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoc3RyY21wIChhcmNfc3VmZml4ZXNbaV0ubmFtZSwgbGFzdCkgIT0gMCkKLQloYXNoX2luc2VydCAoYXJjX3N1ZmZpeF9oYXNoLCBhcmNfc3VmZml4ZXNbaV0ubmFtZSwgKFBUUikgKGFyY19zdWZmaXhlcyArIGkpKTsKLSAgICAgIGxhc3QgPSBhcmNfc3VmZml4ZXNbaV0ubmFtZTsKLSAgICB9Ci0KLSAgLyogU2luY2UgcmVnaXN0ZXJzIGRvbid0IGhhdmUgYSBwcmVmaXgsIHdlIHB1dCB0aGVtIGluIHRoZSBzeW1ib2wgdGFibGUgc28KLSAgICAgdGhleSBjYW4ndCBiZSB1c2VkIGFzIHN5bWJvbHMuICBUaGlzIGFsc28gc2ltcGxpZmllcyBhcmd1bWVudCBwYXJzaW5nIGFzCi0gICAgIHdlIGNhbiBsZXQgZ2FzIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuICBUaGUgcmVjb3JkZWQgcmVnaXN0ZXIgbnVtYmVyIGlzCi0gICAgIHRoZSBpbmRleCBpbiBgYXJjX3JlZ19uYW1lcycuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgYXJjX3JlZ19uYW1lc19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFyY19vcHZhbF9zdXBwb3J0ZWQgKCZhcmNfcmVnX25hbWVzW2ldKSkKLQljb250aW51ZTsKLSAgICAgIC8qIFVzZSBzeW1ib2xfY3JlYXRlIGhlcmUgaW5zdGVhZCBvZiBzeW1ib2xfbmV3IHNvIHdlIGRvbid0IHRyeSB0bwotCSBvdXRwdXQgcmVnaXN0ZXJzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKGFyY19yZWdfbmFtZXNbaV0ubmFtZSwgcmVnX3NlY3Rpb24sCi0JCQkJCSAgaSwgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gICAgfQotCi0gIC8qIFRlbGwgYHNfY3B1JyBpdCdzIHRvbyBsYXRlLiAgKi8KLSAgY3B1X3RhYmxlc19pbml0X3AgPSAxOwotfQotDAotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4KLSAgIElmIFJFRyBpcyBub24tTlVMTCwgaXQgaXMgYSByZWdpc3RlciBudW1iZXIgYW5kIGlnbm9yZSBWQUwuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWFyY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWwsIGZpbGUsIGxpbmUpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci17Ci0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05PUFQpICE9IDApCi0JICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIGVsc2UKLQkgICAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgbWluID0gMDsKLQl9Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9ORUdBVElWRSkgIT0gMCkKLQl0ZXN0ID0gLSB2YWw7Ci0gICAgICBlbHNlCi0JdGVzdCA9IHZhbDsKLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotCXsKLQkgIGNvbnN0IGNoYXIgKmVyciA9Ci0JICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLQkgIGNoYXIgYnVmWzEwMF07Ci0KLQkgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKLQkgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JICAgIGFzX3dhcm4gKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICBlbHNlCi0JICAgIGFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICAgICAgZXJybXNnID0gTlVMTDsKLSAgICAgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgKGxvbmcpIHZhbCwgJmVycm1zZyk7Ci0gICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JYXNfd2FybiAoZXJybXNnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBpbnNuIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCSAgICAgPDwgb3BlcmFuZC0+c2hpZnQpOwotCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFdlIGNhbid0IHNpbXBseSBnZW5lcmF0ZSB0aGVtIGFzCi0gICB3ZSBnbywgYmVjYXVzZSB0aGF0IHdvdWxkIHJlcXVpcmUgdXMgdG8gZmlyc3QgY3JlYXRlIHRoZSBmcmFnLCBhbmQKLSAgIHRoYXQgd291bGQgc2NyZXcgdXAgcmVmZXJlbmNlcyB0byBgYC4nJy4gICovCi0KLXN0cnVjdCBhcmNfZml4dXAKLXsKLSAgLyogaW5kZXggaW50byBgYXJjX29wZXJhbmRzJyAqLwotICBpbnQgb3BpbmRleDsKLSAgZXhwcmVzc2lvblMgZXhwOwotfTsKLQotI2RlZmluZSBNQVhfRklYVVBTIDUKLQotI2RlZmluZSBNQVhfU1VGRklYRVMgNQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKm9wY29kZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGFyY19pbnNuIGluc247Ci0gIHN0YXRpYyBpbnQgaW5pdF90YWJsZXNfcCA9IDA7Ci0KLSAgLyogT3Bjb2RlIHRhYmxlIGluaXRpYWxpemF0aW9uIGlzIGRlZmVycmVkIHVudGlsIGhlcmUgYmVjYXVzZSB3ZSBoYXZlIHRvCi0gICAgIHdhaXQgZm9yIGEgcG9zc2libGUgLmNwdSBjb21tYW5kLiAgKi8KLSAgaWYgKCFpbml0X3RhYmxlc19wKQotICAgIHsKLSAgICAgIGluaXRfb3Bjb2RlX3RhYmxlcyAoYXJjX21hY2hfdHlwZSk7Ci0gICAgICBpbml0X3RhYmxlc19wID0gMTsKLSAgICB9Ci0KLSAgLyogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgIHN0cisrOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBsaXN0cyBoYXNoZWQgYnkgdGhlIGZpcnN0IGxldHRlciAodGhvdWdoCi0gICAgIHdlIG5lZWRuJ3QgY2FyZSBob3cgdGhleSdyZSBoYXNoZWQpLiAgR2V0IHRoZSBmaXJzdCBpbiB0aGUgbGlzdC4gICovCi0KLSAgb3Bjb2RlID0gYXJjX29wY29kZV9sb29rdXBfYXNtIChzdHIpOwotCi0gIC8qIEtlZXAgbG9va2luZyB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guICAqLwotCi0gIHN0YXJ0ID0gc3RyOwotICBmb3IgKCA7IG9wY29kZSAhPSBOVUxMOyBvcGNvZGUgPSBBUkNfT1BDT0RFX05FWFRfQVNNIChvcGNvZGUpKQotICAgIHsKLSAgICAgIGludCBwYXN0X29wY29kZV9wLCBmYywgbnVtX3N1ZmZpeGVzOwotICAgICAgY2hhciAqc3luOwotICAgICAgc3RydWN0IGFyY19maXh1cCBmaXh1cHNbTUFYX0ZJWFVQU107Ci0gICAgICAvKiBVc2VkIGFzIGEgc2FuaXR5IGNoZWNrLiAgSWYgd2UgbmVlZCBhIGxpbW0gcmVsb2MsIG1ha2Ugc3VyZSB3ZSBhc2sKLQkgZm9yIGFuIGV4dHJhIDQgYnl0ZXMgZnJvbSBmcmFnX21vcmUuICAqLwotICAgICAgaW50IGxpbW1fcmVsb2NfcDsKLSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqaW5zbl9zdWZmaXhlc1tNQVhfU1VGRklYRVNdOwotCi0gICAgICAvKiBJcyB0aGlzIG9wY29kZSBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGNwdT8gICovCi0gICAgICBpZiAoISBhcmNfb3Bjb2RlX3N1cHBvcnRlZCAob3Bjb2RlKSkKLQljb250aW51ZTsKLQotICAgICAgLyogU2NhbiB0aGUgc3ludGF4IHN0cmluZy4gIElmIGl0IGRvZXNuJ3QgbWF0Y2gsIHRyeSB0aGUgbmV4dCBvbmUuICAqLwotCi0gICAgICBhcmNfb3Bjb2RlX2luaXRfaW5zZXJ0ICgpOwotICAgICAgaW5zbiA9IG9wY29kZS0+dmFsdWU7Ci0gICAgICBmYyA9IDA7Ci0gICAgICBwYXN0X29wY29kZV9wID0gMDsKLSAgICAgIG51bV9zdWZmaXhlcyA9IDA7Ci0gICAgICBsaW1tX3JlbG9jX3AgPSAwOwotCi0gICAgICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLQkgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgICAgIGZvciAoc3RyID0gc3RhcnQsIHN5biA9IG9wY29kZS0+c3ludGF4OyAqc3luICE9ICdcMCc7ICkKLQl7Ci0JICBpbnQgbW9kczsKLQkgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLQotCSAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLQkgIGlmICgqc3luICE9ICclJyB8fCAqKytzeW4gPT0gJyUnKQotCSAgICB7Ci0JICAgICAgLyogSGFuZGxlICcrJyBzcGVjaWFsbHkgYXMgd2Ugd2FudCB0byBhbGxvdyAibGQgcjAsW3NwLTRdIi4gICovCi0JICAgICAgLyogPz8/IFRoZSBzeW50YXggaGFzIGNoYW5nZWQgdG8gW3NwLC00XS4gICovCi0JICAgICAgaWYgKDAgJiYgKnN5biA9PSAnKycgJiYgKnN0ciA9PSAnLScpCi0JCXsKLQkJICAvKiBTa2lwIG92ZXIgc3luJ3MgKywgYnV0IGxlYXZlIHN0cidzIC0gYWxvbmUuCi0JCSAgICAgVGhhdCBtYWtlcyB0aGUgY2FzZSBpZGVudGljYWwgdG8gImxkIHIwLFtzcCstNF0iLiAgKi8KLQkJICArK3N5bjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCpzdHIgPT0gKnN5bikKLQkJewotCQkgIGlmICgqc3luID09ICcgJykKLQkJICAgIHBhc3Rfb3Bjb2RlX3AgPSAxOwotCQkgICsrc3luOwotCQkgICsrc3RyOwotCQl9Ci0JICAgICAgZWxzZQotCQlicmVhazsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICBQaWNrIG91dCBhbnkgbW9kaWZpZXJzLiAgKi8KLQkgIG1vZHMgPSAwOwotCSAgd2hpbGUgKEFSQ19NT0RfUCAoYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFsqc3luXV0uZmxhZ3MpKQotCSAgICB7Ci0JICAgICAgbW9kcyB8PSBhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwWypzeW5dXS5mbGFncyAmIEFSQ19NT0RfQklUUzsKLQkgICAgICArK3N5bjsKLQkgICAgfQotCSAgb3BlcmFuZCA9IGFyY19vcGVyYW5kcyArIGFyY19vcGVyYW5kX21hcFsqc3luXTsKLQkgIGlmIChvcGVyYW5kLT5mbXQgPT0gMCkKLQkgICAgYXNfZmF0YWwgKF8oInVua25vd24gc3ludGF4IGZvcm1hdCBjaGFyYWN0ZXIgYCVjJyIpLCAqc3luKTsKLQotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfRkFLRSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0JICAgICAgaWYgKG9wZXJhbmQtPmluc2VydCkKLQkJewotCQkgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIG9wZXJhbmQsIG1vZHMsIE5VTEwsIDAsICZlcnJtc2cpOwotCQkgIC8qIElmIHdlIGdldCBhbiBlcnJvciwgZ28gb24gdG8gdHJ5IHRoZSBuZXh0IGluc24uICAqLwotCQkgIGlmIChlcnJtc2cpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgICsrc3luOwotCSAgICB9Ci0JICAvKiBBcmUgd2UgZmluaXNoZWQgd2l0aCBzdWZmaXhlcz8gICovCi0JICBlbHNlIGlmICghcGFzdF9vcGNvZGVfcCkKLQkgICAgewotCSAgICAgIGludCBmb3VuZDsKLQkgICAgICBjaGFyIGM7Ci0JICAgICAgY2hhciAqcywqdDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnN1Ziwqc3VmZml4LCpzdWZmaXhfZW5kOwotCi0JICAgICAgaWYgKCEob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TVUZGSVgpKQotCQlhYm9ydCAoKTsKLQotCSAgICAgIC8qIElmIHdlJ3JlIGF0IGEgc3BhY2UgaW4gdGhlIGlucHV0IHN0cmluZywgd2Ugd2FudCB0byBza2lwIHRoZQotCQkgcmVtYWluaW5nIHN1ZmZpeGVzLiAgVGhlcmUgbWF5IGJlIHNvbWUgZmFrZSBvbmVzIHRob3VnaCwgc28KLQkJIGp1c3QgZ28gb24gdG8gdHJ5IHRoZSBuZXh0IG9uZS4gICovCi0JICAgICAgaWYgKCpzdHIgPT0gJyAnKQotCQl7Ci0JCSAgKytzeW47Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIHMgPSBzdHI7Ci0JICAgICAgaWYgKG1vZHMgJiBBUkNfTU9EX0RPVCkKLQkJewotCQkgIGlmICgqcyAhPSAnLicpCi0JCSAgICBicmVhazsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGlzIGNhbiBoYXBwZW4gaW4gImIubmQgZm9vIiBhbmQgd2UncmUgY3VycmVudGx5IGxvb2tpbmcKLQkJICAgICBmb3IgIiVxIiAoaWU6IGEgY29uZGl0aW9uIGNvZGUgc3VmZml4KS4gICovCi0JCSAgaWYgKCpzID09ICcuJykKLQkJICAgIHsKLQkJICAgICAgKytzeW47Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBQaWNrIHRoZSBzdWZmaXggb3V0IGFuZCBsb29rIGl0IHVwIHZpYSB0aGUgaGFzaCB0YWJsZS4gICovCi0JICAgICAgZm9yICh0ID0gczsgKnQgJiYgaXNhbHBoYSAoKnQpOyArK3QpCi0JCWNvbnRpbnVlOwotCSAgICAgIGMgPSAqdDsKLQkgICAgICAqdCA9ICdcMCc7Ci0JICAgICAgc3VmID0gaGFzaF9maW5kIChhcmNfc3VmZml4X2hhc2gsIHMpOwotCSAgICAgICp0ID0gYzsKLQkgICAgICBpZiAoIXN1ZikKLQkJewotCQkgIC8qIFRoaXMgY2FuIGhhcHBlbiBpbiAiYmxsZSBmb28iIGFuZCB3ZSdyZSBjdXJyZW50bHkgdXNpbmcKLQkJICAgICB0aGUgdGVtcGxhdGUgImIlcSUubiAlaiIuICBUaGUgImJsIiBpbnNuIG9jY3VycyBsYXRlciBpbgotCQkgICAgIHRoZSB0YWJsZSBzbyAibGxlIiBpc24ndCBhbiBpbGxlZ2FsIHN1ZmZpeC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIElzIGl0IHRoZSByaWdodCB0eXBlPyAgTm90ZSB0aGF0IHRoZSBzYW1lIGNoYXJhY3RlciBpcyB1c2VkCi0JICAgICAgICAgc2V2ZXJhbCB0aW1lcywgc28gd2UgaGF2ZSB0byBleGFtaW5lIGFsbCBvZiB0aGVtLiAgVGhpcyBpcwotCQkgcmVsYXRpdmVseSBlZmZpY2llbnQgYXMgZXF1aXZhbGVudCBlbnRyaWVzIGFyZSBrZXB0Ci0JCSB0b2dldGhlci4gIElmIGl0J3Mgbm90IHRoZSByaWdodCB0eXBlLCBkb24ndCBpbmNyZW1lbnQgYHN0cicKLQkJIHNvIHdlIHRyeSB0aGUgbmV4dCBvbmUgaW4gdGhlIHNlcmllcy4gICovCi0JICAgICAgZm91bmQgPSAwOwotCSAgICAgIHN1ZmZpeF9lbmQgPSBhcmNfc3VmZml4ZXMgKyBhcmNfc3VmZml4ZXNfY291bnQ7Ci0JICAgICAgZm9yIChzdWZmaXggPSBzdWY7Ci0JCSAgIHN1ZmZpeCA8IHN1ZmZpeF9lbmQgJiYgc3RyY21wIChzdWZmaXgtPm5hbWUsIHN1Zi0+bmFtZSkgPT0gMDsKLQkJICAgKytzdWZmaXgpCi0JCXsKLQkJICBpZiAoYXJjX29wZXJhbmRzW3N1ZmZpeC0+dHlwZV0uZm10ID09ICpzeW4pCi0JCSAgICB7Ci0JCSAgICAgIC8qIEluc2VydCB0aGUgc3VmZml4J3MgdmFsdWUgaW50byB0aGUgaW5zbi4gICovCi0JCSAgICAgIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0JCQlpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLAotCQkJCQkJICAgbW9kcywgTlVMTCwgc3VmZml4LT52YWx1ZSwKLQkJCQkJCSAgIE5VTEwpOwotCQkgICAgICBlbHNlCi0JCQlpbnNuIHw9IHN1ZmZpeC0+dmFsdWUgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0KLQkJICAgICAgc3RyID0gdDsKLQkJICAgICAgZm91bmQgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgICsrc3luOwotCSAgICAgIGlmICghZm91bmQpCi0JCTsgLyogV3JvbmcgdHlwZS4gIEp1c3QgZ28gb24gdG8gdHJ5IG5leHQgaW5zbiBlbnRyeS4gICovCi0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKG51bV9zdWZmaXhlcyA9PSBNQVhfU1VGRklYRVMpCi0JCSAgICBhc19iYWQgKF8oInRvbyBtYW55IHN1ZmZpeGVzIikpOwotCQkgIGVsc2UKLQkJICAgIGluc25fc3VmZml4ZXNbbnVtX3N1ZmZpeGVzKytdID0gc3VmZml4OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgLyogVGhpcyBpcyBlaXRoZXIgYSByZWdpc3RlciBvciBhbiBleHByZXNzaW9uIG9mIHNvbWUga2luZC4gICovCi0JICAgIHsKLQkgICAgICBjaGFyIGM7Ci0JICAgICAgY2hhciAqaG9sZDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZyA9IE5VTEw7Ci0JICAgICAgbG9uZyB2YWx1ZSA9IDA7Ci0JICAgICAgZXhwcmVzc2lvblMgZXhwOwotCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKQotCQlhYm9ydCAoKTsKLQotCSAgICAgIC8qIElzIHRoZXJlIGFueXRoaW5nIGxlZnQgdG8gcGFyc2U/Ci0JCSBXZSBkb24ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgdG9wIGJlY2F1c2Ugd2Ugd2FudCB0byBwYXJzZQotCQkgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLQkgICAgICBpZiAoKnN0ciA9PSAnXDAnKQotCQlicmVhazsKLSNpZiAwCi0JICAgICAgLyogSXMgdGhpcyBhIHN5bnRheCBjaGFyYWN0ZXI/ICBFZzogaXMgdGhlcmUgYSAnWycgcHJlc2VudCB3aGVuCi0JCSB0aGVyZSBzaG91bGRuJ3QgYmU/ICAqLwotCSAgICAgIGlmICghaXNhbG51bSAoKnN0cikKLQkJICAvKiAnLicgYXMgaW4gIi5MTEMwIiAqLwotCQkgICYmICpzdHIgIT0gJy4nCi0JCSAgLyogJ18nIGFzIGluICJfcHJpbnQiICovCi0JCSAgJiYgKnN0ciAhPSAnXycKLQkJICAvKiAnLScgYXMgaW4gIltmcCwtNF0iICovCi0JCSAgJiYgKnN0ciAhPSAnLScKLQkJICAvKiAnJScgYXMgaW4gIiVpYShfZnVuYykiICovCi0JCSAgJiYgKnN0ciAhPSAnJScpCi0JCWJyZWFrOwotI2VuZGlmCi0KLQkgICAgICAvKiBQYXJzZSB0aGUgb3BlcmFuZC4gICovCi0JICAgICAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0JICAgICAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLQkgICAgICBpZiAoZXhwLlhfb3AgPT0gT19pbGxlZ2FsKQotCQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLQkgICAgICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKLQkJYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0JICAgICAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIHZhbHVlID0gZXhwLlhfYWRkX251bWJlcjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGV4cC5YX29wID09IE9fcmVnaXN0ZXIpCi0JCXsKLQkJICByZWcgPSBhcmNfcmVnX25hbWVzICsgZXhwLlhfYWRkX251bWJlcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkJICBpZiAoZmMgPj0gTUFYX0ZJWFVQUykKLQkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JCSAgZml4dXBzW2ZjXS5leHAgPSBleHA7Ci0KLQkJICAvKiBJZiB0aGlzIGlzIGEgcmVnaXN0ZXIgY29uc3RhbnQgKElFOiBvbmUgd2hvc2UKLQkJICAgICByZWdpc3RlciB2YWx1ZSBnZXRzIHN0b3JlZCBhcyA2MS02MykgdGhlbiB0aGlzCi0JCSAgICAgbXVzdCBiZSBhIGxpbW0uICBXZSBkb24ndCBzdXBwb3J0IHNoaW1tIHJlbG9jcy4gICovCi0JCSAgLyogPz8/IFRoaXMgYml0IGNvdWxkIHVzZSBzb21lIGNsZWFuaW5nIHVwLgotCQkgICAgIFJlZmVyZW5jaW5nIHRoZSBmb3JtYXQgY2hhcnMgbGlrZSB0aGlzIGdvZXMKLQkJICAgICBhZ2FpbnN0IHN0eWxlLiAgKi8KLSNkZWZpbmUgSVNfUkVHX09QRVJBTkQobykgKChvKSA9PSAnYScgfHwgKG8pID09ICdiJyB8fCAobykgPT0gJ2MnKQotCQkgIGlmIChJU19SRUdfT1BFUkFORCAoKnN5bikpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmp1bms7Ci0KLQkJICAgICAgZml4dXBzW2ZjXS5vcGluZGV4ID0gYXJjX29wZXJhbmRfbWFwWydMJ107Ci0JCSAgICAgIGxpbW1fcmVsb2NfcCA9IDE7Ci0JCSAgICAgIC8qIFRlbGwgaW5zZXJ0X3JlZyB3ZSBuZWVkIGEgbGltbS4gIFRoaXMgaXMKLQkJCSBuZWVkZWQgYmVjYXVzZSB0aGUgdmFsdWUgYXQgdGhpcyBwb2ludCBpcwotCQkJIHplcm8sIGEgc2hpbW0uICAqLwotCQkgICAgICAvKiA/Pz8gV2UgbmVlZCBhIGNsZWFuZXIgaW50ZXJmYWNlIHRoYW4gdGhpcy4gICovCi0JCSAgICAgICgqYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFsnUSddXS5pbnNlcnQpCi0JCQkoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCAwTCwgJmp1bmspOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGZpeHVwc1tmY10ub3BpbmRleCA9IGFyY19vcGVyYW5kX21hcFsqc3luXTsKLQkJICArK2ZjOwotCQkgIHZhbHVlID0gMDsKLQkJfQotCi0JICAgICAgLyogSW5zZXJ0IHRoZSByZWdpc3RlciBvciBleHByZXNzaW9uIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotCQl7Ci0JCSAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKLQkJICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLCBtb2RzLAotCQkJCQkgICAgIHJlZywgKGxvbmcpIHZhbHVlLCAmZXJybXNnKTsKLSNpZiAwCi0JCSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCQkgICAgYXNfd2FybiAoZXJybXNnKTsKLSNlbmRpZgotCQkgIC8qIEZJWE1FOiBXZSB3YW50IHRvIHRyeSBzaGltbSBpbnNucyBmb3IgbGltbSBvbmVzLiAgQnV0IGlmCi0JCSAgICAgdGhlIGNvbnN0YW50IHdvbid0IGZpdCwgd2UgbXVzdCBnbyBvbiB0byB0cnkgdGhlIG5leHQKLQkJICAgICBwb3NzaWJpbGl0eS4gIFdoZXJlIGRvIHdlIGlzc3VlIHdhcm5pbmdzIGZvciBjb25zdGFudHMKLQkJICAgICB0aGF0IGFyZSB0b28gYmlnIHRoZW4/ICBBdCBwcmVzZW50LCB3ZSdsbCBmbGFnIHRoZSBpbnNuCi0JCSAgICAgYXMgdW5yZWNvZ25pemFibGUhICBNYXliZSBoYXZlIHRoZSAiYmFkIGluc3RydWN0aW9uIgotCQkgICAgIGVycm9yIG1lc3NhZ2UgaW5jbHVkZSBvdXIgYGVycm1zZyc/ICAqLwotCQkgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgICAgZWxzZQotCQlpbnNuIHw9ICh2YWx1ZSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLQotCSAgICAgICsrc3luOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzeW50YXggc3RyaW5nLCB3ZSdyZSBkb25lLiAgKi8KLSAgICAgIC8qIEZJWE1FOiB0cnkgdG8gbW92ZSB0aGlzIHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKCpzeW4gPT0gJ1wwJykKLQl7Ci0JICBpbnQgaTsKLQkgIGNoYXIgKmY7Ci0JICBsb25nIGxpbW0sIGxpbW1fcDsKLQotCSAgLyogRm9yIHRoZSBtb21lbnQgd2UgYXNzdW1lIGEgdmFsaWQgYHN0cicgY2FuIG9ubHkgY29udGFpbiBibGFua3MKLQkgICAgIG5vdy4gIElFOiBXZSBuZWVkbid0IHRyeSBhZ2FpbiB3aXRoIGEgbG9uZ2VyIHZlcnNpb24gb2YgdGhlCi0JICAgICBpbnNuIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgbG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIGFwcGVhcgotCSAgICAgYmVmb3JlIHNob3J0ZXIgb25lcyAoZWc6IGxzciByMixyMywxIHZzIGxzciByMixyMykuICAqLwotCi0JICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0JICAgICsrc3RyOwotCi0JICBpZiAoKnN0ciAhPSAnXDAnKQotCSAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKLQotCSAgLyogSXMgdGhlcmUgYSBsaW1tIHZhbHVlPyAgKi8KLQkgIGxpbW1fcCA9IGFyY19vcGNvZGVfbGltbV9wICgmbGltbSk7Ci0KLQkgIC8qIFBlcmZvcm0gdmFyaW91cyBlcnJvciBhbmQgd2FybmluZyB0ZXN0cy4gICovCi0KLQkgIHsKLQkgICAgc3RhdGljIGludCBpbl9kZWxheV9zbG90X3AgPSAwOwotCSAgICBzdGF0aWMgaW50IHByZXZfaW5zbl9uZWVkc19jY19ub3BfcCA9IDA7Ci0JICAgIC8qIGRlbGF5IHNsb3QgdHlwZSBzZWVuICovCi0JICAgIGludCBkZWxheV9zbG90X3R5cGUgPSBBUkNfREVMQVlfTk9ORTsKLQkgICAgLyogY29uZGl0aW9uYWwgZXhlY3V0aW9uIGZsYWcgc2VlbiAqLwotCSAgICBpbnQgY29uZGl0aW9uYWwgPSAwOwotCSAgICAvKiAxIGlmIGNvbmRpdGlvbiBjb2RlcyBhcmUgYmVpbmcgc2V0ICovCi0JICAgIGludCBjY19zZXRfcCA9IDA7Ci0JICAgIC8qIDEgaWYgY29uZGl0aW9uYWwgYnJhbmNoLCBpbmNsdWRpbmcgYGInICJicmFuY2ggYWx3YXlzIiAqLwotCSAgICBpbnQgY29uZF9icmFuY2hfcCA9IG9wY29kZS0+ZmxhZ3MgJiBBUkNfT1BDT0RFX0NPTkRfQlJBTkNIOwotCSAgICBpbnQgbmVlZF9jY19ub3BfcCA9IDA7Ci0KLQkgICAgZm9yIChpID0gMDsgaSA8IG51bV9zdWZmaXhlczsgKytpKQotCSAgICAgIHsKLQkJc3dpdGNoIChhcmNfb3BlcmFuZHNbaW5zbl9zdWZmaXhlc1tpXS0+dHlwZV0uZm10KQotCQkgIHsKLQkJICBjYXNlICduJyA6Ci0JCSAgICBkZWxheV9zbG90X3R5cGUgPSBpbnNuX3N1ZmZpeGVzW2ldLT52YWx1ZTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJ3EnIDoKLQkJICAgIGNvbmRpdGlvbmFsID0gaW5zbl9zdWZmaXhlc1tpXS0+dmFsdWU7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdmJyA6Ci0JCSAgICBjY19zZXRfcCA9IDE7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIC8qIFB1dHRpbmcgYW4gaW5zbiB3aXRoIGEgbGltbSB2YWx1ZSBpbiBhIGRlbGF5IHNsb3QgaXMgc3VwcG9zZWQgdG8KLQkgICAgICAgYmUgbGVnYWwsIGJ1dCBsZXQncyB3YXJuIHRoZSB1c2VyIGFueXdheS4gIERpdHRvIGZvciA4IGJ5dGUKLQkgICAgICAganVtcHMgd2l0aCBkZWxheSBzbG90cy4gICovCi0JICAgIGlmIChpbl9kZWxheV9zbG90X3AgJiYgbGltbV9wKQotCSAgICAgIGFzX3dhcm4gKF8oIjggYnl0ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IikpOwotCSAgICBpZiAoZGVsYXlfc2xvdF90eXBlICE9IEFSQ19ERUxBWV9OT05FICYmIGxpbW1fcCkKLQkgICAgICBhc193YXJuIChfKCI4IGJ5dGUganVtcCBpbnN0cnVjdGlvbiB3aXRoIGRlbGF5IHNsb3QiKSk7Ci0JICAgIGluX2RlbGF5X3Nsb3RfcCA9IChkZWxheV9zbG90X3R5cGUgIT0gQVJDX0RFTEFZX05PTkUpICYmICFsaW1tX3A7Ci0KLQkgICAgLyogV2FybiB3aGVuIGEgY29uZGl0aW9uYWwgYnJhbmNoIGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBzZXQgb2YKLQkgICAgICAgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gIE5vdGUgdGhhdCB0aGlzIG5lZWRuJ3QgYmUgZG9uZSBpZiB0aGUKLQkgICAgICAgaW5zbiB0aGF0IHNldHMgdGhlIGNvbmRpdGlvbiBjb2RlcyB1c2VzIGEgbGltbS4gICovCi0JICAgIGlmIChjb25kX2JyYW5jaF9wICYmIGNvbmRpdGlvbmFsICE9IDAgLyogMCA9ICJhbHdheXMiICovCi0JCSYmIHByZXZfaW5zbl9uZWVkc19jY19ub3BfcCkKLQkgICAgICBhc193YXJuIChfKCJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiKSk7Ci0JICAgIHByZXZfaW5zbl9uZWVkc19jY19ub3BfcCA9IGNjX3NldF9wICYmICFsaW1tX3A7Ci0JICB9Ci0KLQkgIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uCi0JICAgICBJdCBpcyBpbXBvcnRhbnQgdG8gZmV0Y2ggZW5vdWdoIHNwYWNlIGluIG9uZSBjYWxsIHRvIGBmcmFnX21vcmUnLgotCSAgICAgV2UgdXNlIChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpIHRvIGNvbXB1dGUgd2hlcmUgd2UgYXJlIGFuZCB3ZQotCSAgICAgZG9uJ3Qgd2FudCBmcmFnX25vdyB0byBjaGFuZ2UgYmV0d2VlbiBjYWxscy4gICovCi0JICBpZiAobGltbV9wKQotCSAgICB7Ci0JICAgICAgZiA9IGZyYWdfbW9yZSAoOCk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYgKyA0LCBsaW1tLCA0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAobGltbV9yZWxvY19wKQotCSAgICB7Ci0JICAgICAgLyogV2UgbmVlZCBhIGxpbW0gcmVsb2MsIGJ1dCB0aGUgdGFibGVzIHRoaW5rIHdlIGRvbid0LiAgKi8KLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKLQkgICAgfQotCi0JICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgZmM7ICsraSkKLQkgICAgewotCSAgICAgIGludCBvcF90eXBlLCByZWxvY190eXBlOwotCSAgICAgIGV4cHJlc3Npb25TIGV4cHRtcDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQkgICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhpcyBvcGVyYW5kLgotCQkgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGZvcgotCQkgb3BlcmFuZHMgcmVzaWRpbmcgaW4gdGhlIGluc24sIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotCQkgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkgaGFuZGxlIGZpeHVwcyBmb3IgYW55Ci0JCSBvcGVyYW5kIHR5cGUsIGFsdGhvdWdoIHRoYXQgaXMgYWRtaXR0ZWRseSBub3QgYSB2ZXJ5IGV4Y2l0aW5nCi0JCSBmZWF0dXJlLiAgV2UgcGljayBhIEJGRCByZWxvYyB0eXBlIGluIG1kX2FwcGx5X2ZpeC4KLQotCQkgTGltbSB2YWx1ZXMgKDQgYnl0ZSBpbW1lZGlhdGUgImNvbnN0YW50cyIpIG11c3QgYmUgdHJlYXRlZAotCQkgbm9ybWFsbHkgYmVjYXVzZSB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBhY3R1YWwgaW5zbiB3b3JkCi0JCSBhbmQgdGh1cyB0aGUgaW5zZXJ0aW9uIHJvdXRpbmVzIGRvbid0IGhhbmRsZSB0aGVtLiAgKi8KLQotCSAgICAgIGlmIChhcmNfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdLmZsYWdzICYgQVJDX09QRVJBTkRfTElNTSkKLQkJewotCQkgIG9wX3R5cGUgPSBmaXh1cHNbaV0ub3BpbmRleDsKLQkJICAvKiBGSVhNRTogY2FuIHdlIGFkZCB0aGlzIGRhdGEgdG8gdGhlIG9wZXJhbmQgdGFibGU/ICAqLwotCQkgIGlmIChvcF90eXBlID09IGFyY19vcGVyYW5kX21hcFsnTCddKQotCQkgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLQkJICBlbHNlIGlmIChvcF90eXBlID09IGFyY19vcGVyYW5kX21hcFsnSiddKQotCQkgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ19BUkNfQjI2OwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIHJlbG9jX3R5cGUgPSBnZXRfYXJjX2V4cF9yZWxvY190eXBlICgxLCByZWxvY190eXBlLAotCQkJCQkJICAgICAgICZmaXh1cHNbaV0uZXhwLAotCQkJCQkJICAgICAgICZleHB0bXApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb3BfdHlwZSA9IGdldF9hcmNfZXhwX3JlbG9jX3R5cGUgKDAsIGZpeHVwc1tpXS5vcGluZGV4LAotCQkJCQkJICAgICZmaXh1cHNbaV0uZXhwLCAmZXhwdG1wKTsKLQkJICByZWxvY190eXBlID0gb3BfdHlwZSArIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7Ci0JCX0KLQkgICAgICBvcGVyYW5kID0gJmFyY19vcGVyYW5kc1tvcF90eXBlXTsKLQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgICAoKGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkKLQkJCSAgICArIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0xJTU0gPyA0IDogMCkpLCA0LAotCQkJICAgJmV4cHRtcCwKLQkJCSAgIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCkgIT0gMCwKLQkJCSAgIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIHJlbG9jX3R5cGUpOwotCSAgICB9Ci0KLQkgIC8qIEFsbCBkb25lLiAgKi8KLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0aGUgbmV4dCBlbnRyeS4gICovCi0gICAgfQotCi0gIGFzX2JhZCAoXygiYmFkIGluc3RydWN0aW9uIGAlcyciKSwgc3RhcnQpOwotfQotDAotLyogPz8/IFRoaXMgd2FzIGNvcGllZCBmcm9tIHRjLXNwYXJjLmMsIEkgdGhpbmsuICBJcyBpdCBuZWNlc3Nhcnk/ICAqLwotCi1zdGF0aWMgdm9pZAotYXJjX2NvbW1vbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBzaXplOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IHNpemUpCi0JewotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICBhc3NlcnQgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0gICAgewotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKHRlbXAgPCAwKQotCXsKLQkgIHRlbXAgPSAwOwotCSAgYXNfd2FybiAoXygiQ29tbW9uIGFsaWdubWVudCBuZWdhdGl2ZTsgMCBhc3N1bWVkIikpOwotCX0KLSAgICAgIGlmIChzeW1ib2xQLT5sb2NhbCkKLQl7Ci0JICBzZWdUIG9sZF9zZWM7Ci0JICBpbnQgb2xkX3N1YnNlYzsKLQkgIGNoYXIgKnA7Ci0JICBpbnQgYWxpZ247Ci0KLQlhbGxvY2F0ZV9ic3M6Ci0JICBvbGRfc2VjID0gbm93X3NlZzsKLQkgIG9sZF9zdWJzZWMgPSBub3dfc3Vic2VnOwotCSAgYWxpZ24gPSB0ZW1wOwotCSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLQkgIGlmIChhbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotCSAgICBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0JICBwID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwKLQkJCShvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKLQkgICpwID0gMDsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQlhbGxvY2F0ZV9jb21tb246Ci0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiA/Pz8gU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIuYnNzXCIiLCA1KQotCSAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmRhdGFcIiIsIDYpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCSAgZ290byBiYWRfY29tbW9uX3NlZ21lbnQ7Ci0JfQotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnIicpCi0JOwotICAgICAgZ290byBhbGxvY2F0ZV9jb21tb247Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICByZXR1cm47Ci0KLSAgewotICBiYWRfY29tbW9uX3NlZ21lbnQ6Ci0gICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJ1xuJykKLSAgICAgIHArKzsKLSAgICBjID0gKnA7Ci0gICAgKnAgPSAnXDAnOwotICAgIGFzX2JhZCAoXygiYmFkIC5jb21tb24gc2VnbWVudCAlcyIpLCBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKTsKLSAgICAqcCA9IGM7Ci0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIHJldHVybjsKLSAgfQotfQotCi0vKiBTZWxlY3QgdGhlIGNwdSB3ZSdyZSBhc3NlbWJsaW5nIGZvci4gICovCi0KLXN0YXRpYyB2b2lkCi1hcmNfY3B1IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBtYWNoOwotICBjaGFyIGM7Ci0gIGNoYXIgKmNwdTsKLQotICAvKiBJZiBhbiBpbnN0cnVjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNlZW4sIGl0J3MgdG9vIGxhdGUuICAqLwotICBpZiAoY3B1X3RhYmxlc19pbml0X3ApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuY3B1IGNvbW1hbmQgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBpbnN0cnVjdGlvbnMiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjcHUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgbWFjaCA9IGFyY19nZXRfbWFjaCAoY3B1KTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGlmIChtYWNoID09IC0xKQotICAgIGdvdG8gYmFkX2NwdTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIC8qIFRoZSBjcHUgbWF5IGhhdmUgYmVlbiBzZWxlY3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAgICBUaGUgY2hvaWNlcyBtdXN0IG1hdGNoLiAgKi8KLSAgLyogPz8/IFRoaXMgd2FzIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBlYXJseSBvbi4gIEl0J3MgZ29uZSBub3csIGJ1dAotICAgICBsZWF2ZSB0aGlzIGluLiAgKi8KLSAgaWYgKG1hY2hfdHlwZV9zcGVjaWZpZWRfcCAmJiBtYWNoICE9IGFyY19tYWNoX3R5cGUpCi0gICAgYXNfYmFkIChfKCIuY3B1IGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzIHZhbHVlIikpOwotICBlbHNlCi0gICAgewotICAgICAgYXJjX21hY2hfdHlwZSA9IG1hY2g7Ci0gICAgICBtYWNoX3R5cGVfc3BlY2lmaWVkX3AgPSAxOwotICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9hcmMsIG1hY2gpKQotCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotICAgIH0KLSAgcmV0dXJuOwotCi0gYmFkX2NwdToKLSAgYXNfYmFkIChfKCJiYWQgLmNwdSBvcCIpKTsKLSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2lmIDAKLS8qIFRoZSAucmVuYW1lIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCBieSBnY2MgdG8gaW1wbGVtZW50Ci0gICAtbW1hbmdsZS1jcHUtbGliZ2NjLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19yZW5hbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZSwqbmV3OwotICBjaGFyIGM7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgaW50IGxlbjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHJlbmFtZSBzdHJpbmciKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGlmICgqbmFtZSA9PSAnXDAnKQotICAgIHsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIHN5bWJvbCB0byByZW5hbWUgdG8iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgbmV3ID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICBzdHJjcHkgKG5ldywgbmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUgPSBuZXc7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLSNlbmRpZgotDAotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUC4KLSAgIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0KLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLS8qIFdlIGRvbid0IGhhdmUgYW55IGZvcm0gb2YgcmVsYXhpbmcuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBDb252ZXJ0IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gIFdlIG5ldmVyIGdlbmVyYXRlIHRoZXNlLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGZyYWdTICpmcmFncDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFBhcnNlIGFuIG9wZXJhbmQgdGhhdCBpcyBtYWNoaW5lLXNwZWNpZmljLgotCi0gICBUaGUgQVJDIGhhcyBhIHNwZWNpYWwgJS1vcCB0byBhZGp1c3QgYWRkcmVzc2VzIHNvIHRoZXkncmUgdXNhYmxlIGluCi0gICBicmFuY2hlcy4gIFRoZSAic3QiIGlzIHNob3J0IGZvciB0aGUgU1RhdHVzIHJlZ2lzdGVyLgotICAgPz8/IExhdGVyIGV4cGFuZCB0aGlzIHRvIHRha2UgYSBmbGFncyB2YWx1ZSB0b28uCi0KLSAgID8/PyBXZSBjYW4ndCBjcmVhdGUgbmV3IGV4cHJlc3Npb24gdHlwZXMgc28gd2UgbWFwIHRoZSAlLW9wJ3Mgb250byB0aGUKLSAgIGV4aXN0aW5nIHN5bnRheC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciBjb3VsZCB1c2UgdGhlIGNob3NlbiBzeW50YXgKLSAgIHRvIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0LiAgUGVyaGFwcyBwdXQgYSBzcGVjaWFsIGNvb2tpZSBpbiBYX2FkZF9udW1iZXIKLSAgIHRvIG1hcmsgdGhlIGV4cHJlc3Npb24gYXMgc3BlY2lhbC4gICovCi0KLXZvaWQgCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBjaGFyICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmICgqcCA9PSAnJScgJiYgc3RybmNtcCAocCwgIiVzdCgiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA0OwotICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyknKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyAnKScgaW4gJS1vcCIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9PSAwCi0JICAvKiBJIHRoaW5rIHRoaXMgdGVzdCBpcyB1bm5lY2Vzc2FyeSBidXQganVzdCBhcyBhIHNhbml0eSBjaGVjay4uLiAqLwotCSAgJiYgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID09IE5VTEwpCi0JewotCSAgZXhwcmVzc2lvblMgdHdvOwotCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICB0d28uWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICB0d28uWF9hZGRfc3ltYm9sID0gdHdvLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIHR3by5YX2FkZF9udW1iZXIgPSAyOwotCSAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnR3byk7Ci0JfQotICAgICAgLyogYWxsb3cgJXN0KHN5bTEtc3ltMikgKi8KLSAgICAgIGVsc2UgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fc3VidHJhY3QKLQkgICAgICAgJiYgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0JICAgICAgICYmIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCAhPSBOVUxMCi0JICAgICAgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBleHByZXNzaW9uUyB0d287Ci0KLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sIChleHByZXNzaW9uUCk7Ci0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICB0d28uWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICB0d28uWF9hZGRfc3ltYm9sID0gdHdvLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIHR3by5YX2FkZF9udW1iZXIgPSAyOwotCSAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnR3byk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCBmb3IgJSVzdCIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4KLSAgIFdlIGNvdWxkIGNhdGNoIHJlZ2lzdGVyIG5hbWVzIGhlcmUsIGJ1dCB0aGF0IGlzIGhhbmRsZWQgYnkgaW5zZXJ0aW5nCi0gICB0aGVtIGFsbCBpbiB0aGUgc3ltYm9sIHRhYmxlIHRvIGJlZ2luIHdpdGguICAqLwotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotDAotLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgZXhwcmVzc2lvbnMuICAqLwotCi0vKiBQYXJzZSBhIC5ieXRlLCAud29yZCwgZXRjLiBleHByZXNzaW9uLgotCi0gICBWYWx1ZXMgZm9yIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYXJlIHNwZWNpZmllZCB3aXRoICVzdChsYWJlbCkuCi0gICBgbGFiZWwnIHdpbGwgYmUgcmlnaHQgc2hpZnRlZCBieSAyLiAgKi8KLQotdm9pZAotYXJjX3BhcnNlX2NvbnNfZXhwcmVzc2lvbiAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGV4cHIgKDAsIGV4cCk7Ci19Ci0KLS8qIFJlY29yZCBhIGZpeHVwIGZvciBhIGNvbnMgZXhwcmVzc2lvbi4gICovCi0KLXZvaWQKLWFyY19jb25zX2ZpeF9uZXcgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IG5ieXRlczsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaWYgKG5ieXRlcyA9PSA0KQotICAgIHsKLSAgICAgIGludCByZWxvY190eXBlOwotICAgICAgZXhwcmVzc2lvblMgZXhwdG1wOwotCi0gICAgICAvKiBUaGlzIG1heSBiZSBhIHNwZWNpYWwgQVJDIHJlbG9jIChlZzogJXN0KCkpLiAgKi8KLSAgICAgIHJlbG9jX3R5cGUgPSBnZXRfYXJjX2V4cF9yZWxvY190eXBlICgxLCBCRkRfUkVMT0NfMzIsIGV4cCwgJmV4cHRtcCk7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIG5ieXRlcywgJmV4cHRtcCwgMCwgcmVsb2NfdHlwZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCwgMCwKLQkJICAgbmJ5dGVzID09IDIgPyBCRkRfUkVMT0NfMTYKLQkJICAgOiBuYnl0ZXMgPT0gOCA/IEJGRF9SRUxPQ182NAotCQkgICA6IEJGRF9SRUxPQ18zMik7Ci0gICAgfQotfQotDAotLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgcmVsb2NzLiAgKi8KLQotLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAotICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4gICovCi0KLWxvbmcgCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgISBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZGVsYXkgc2xvdC4gICovCi0gIHJldHVybiBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9zaXplOwotfQotCi0vKiBDb21wdXRlIHRoZSByZWxvYyB0eXBlIG9mIGFuIGV4cHJlc3Npb24uCi0gICBUaGUgcG9zc2libHkgbW9kaWZpZWQgZXhwcmVzc2lvbiBpcyBzdG9yZWQgaW4gRVhQTkVXLgotCi0gICBUaGlzIGlzIHVzZWQgdG8gY29udmVydCB0aGUgZXhwcmVzc2lvbnMgZ2VuZXJhdGVkIGJ5IHRoZSAlLW9wJ3MgaW50bwotICAgdGhlIGFwcHJvcHJpYXRlIG9wZXJhbmQgdHlwZS4gIEl0IGlzIGNhbGxlZCBmb3IgYm90aCBkYXRhIGluIGluc3RydWN0aW9ucwotICAgKG9wZXJhbmRzKSBhbmQgZGF0YSBvdXRzaWRlIGluc3RydWN0aW9ucyAodmFyaWFibGVzLCBkZWJ1Z2dpbmcgaW5mbywgZXRjLikuCi0KLSAgIEN1cnJlbnRseSBzdXBwb3J0ZWQgJS1vcHM6Ci0KLSAgICVzdChzeW1ib2wpOiByZXByZXNlbnRlZCBhcyAic3ltYm9sID4+IDIiCi0gICAgICAgICAgICAgICAgInN0IiBpcyBzaG9ydCBmb3IgU1RhdHVzIGFzIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKHBjKQotCi0gICBERUZBVUxUX1RZUEUgaXMgdGhlIHR5cGUgdG8gdXNlIGlmIG5vIHNwZWNpYWwgcHJvY2Vzc2luZyBpcyByZXF1aXJlZC4KLQotICAgREFUQV9QIGlzIG5vbi16ZXJvIGZvciBkYXRhIG9yIGxpbW0gdmFsdWVzLCB6ZXJvIGZvciBpbnNuIG9wZXJhbmRzLgotICAgUmVtZW1iZXIgdGhhdCB0aGUgb3Bjb2RlICJpbnNlcnRpb24gZm5zIiBjYW5ub3QgYmUgdXNlZCBvbiBkYXRhLCB0aGV5J3JlCi0gICBvbmx5IGZvciBpbnNlcnRpbmcgb3BlcmFuZHMgaW50byBpbnNucy4gIFRoZXkgYWxzbyBjYW4ndCBiZSB1c2VkIGZvciBsaW1tCi0gICB2YWx1ZXMgYXMgdGhlIGluc2VydGlvbiByb3V0aW5lcyBkb24ndCBoYW5kbGUgbGltbSB2YWx1ZXMuICBXaGVuIGNhbGxlZCBmb3IKLSAgIGluc25zIHdlIHJldHVybiBmdWRnZWQgcmVsb2MgdHlwZXMgKHJlYWxfdmFsdWUgLSBCRkRfUkVMT0NfVU5VU0VEKS4gIFdoZW4KLSAgIGNhbGxlZCBmb3IgZGF0YSBvciBsaW1tIHZhbHVlcyB3ZSB1c2UgcmVhbCByZWxvYyB0eXBlcy4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9hcmNfZXhwX3JlbG9jX3R5cGUgKGRhdGFfcCwgZGVmYXVsdF90eXBlLCBleHAsIGV4cG5ldykKLSAgICAgaW50IGRhdGFfcDsKLSAgICAgaW50IGRlZmF1bHRfdHlwZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cG5ldzsKLXsKLSAgLyogSWYgdGhlIGV4cHJlc3Npb24gaXMgInN5bWJvbCA+PiAyIiB3ZSBtdXN0IGNoYW5nZSBpdCB0byBqdXN0ICJzeW1ib2wiLAotICAgICBhcyBmaXhfbmV3X2V4cCBjYW4ndCBoYW5kbGUgaXQuICBTaW1pbGFyaWx5IGZvciAoc3ltYm9sIC0gc3ltYm9sKSA+PiAyLgotICAgICBUaGF0J3Mgb2sgdGhvdWdoLiAgV2hhdCdzIHJlYWxseSBnb2luZyBvbiBoZXJlIGlzIHRoYXQgd2UncmUgdXNpbmcKLSAgICAgIj4+IDIiIGFzIGEgc3BlY2lhbCBzeW50YXggZm9yIHNwZWNpZnlpbmcgQkZEX1JFTE9DX0FSQ19CMjYuICAqLwotCi0gIGlmIChleHAtPlhfb3AgPT0gT19yaWdodF9zaGlmdAotICAgICAgJiYgZXhwLT5YX29wX3N5bWJvbCAhPSBOVUxMCi0gICAgICAmJiBzeW1ib2xfY29uc3RhbnRfcCAoZXhwLT5YX29wX3N5bWJvbCkKLSAgICAgICYmIFNfR0VUX1ZBTFVFIChleHAtPlhfb3Bfc3ltYm9sKSA9PSAyCi0gICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAwKQotICAgIHsKLSAgICAgIGlmIChleHAtPlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0JICAmJiAoc3ltYm9sX2NvbnN0YW50X3AgKGV4cC0+WF9hZGRfc3ltYm9sKQotCSAgICAgIHx8IHN5bWJvbF9lcXVhdGVkX3AgKGV4cC0+WF9hZGRfc3ltYm9sKSkpCi0JewotCSAgKmV4cG5ldyA9ICpleHA7Ci0JICBleHBuZXctPlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cG5ldy0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgcmV0dXJuIGRhdGFfcCA/IEJGRF9SRUxPQ19BUkNfQjI2IDogYXJjX29wZXJhbmRfbWFwWydKJ107Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgICAgICAmJiAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCktPlhfb3AKLQkJICAgPT0gT19zdWJ0cmFjdCkpCi0JewotCSAgKmV4cG5ldyA9ICpzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGV4cC0+WF9hZGRfc3ltYm9sKTsKLQkgIHJldHVybiBkYXRhX3AgPyBCRkRfUkVMT0NfQVJDX0IyNiA6IGFyY19vcGVyYW5kX21hcFsnSiddOwotCX0KLSAgICB9Ci0KLSAgKmV4cG5ldyA9ICpleHA7Ci0gIHJldHVybiBkZWZhdWx0X3R5cGU7Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBjb2RlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIGZpeHVwcyB3ZSBnZW5lcmF0ZWQgYnkgdGhlIGNhbGwgdG8gZml4X25ld19leHAsIGFib3ZlLiAgSW4gdGhlIGNhbGwKLSAgIGFib3ZlIHdlIHVzZWQgYSByZWxvYyBjb2RlIHdoaWNoIHdhcyB0aGUgbGFyZ2VzdCBsZWdhbCByZWxvYyBjb2RlCi0gICBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgSGVyZSB3ZSB1bmRvIHRoYXQgdG8gcmVjb3ZlciB0aGUgb3BlcmFuZAotICAgaW5kZXguICBBdCB0aGlzIHBvaW50IGFsbCBzeW1ib2wgdmFsdWVzIHNob3VsZCBiZSBmdWxseSByZXNvbHZlZCwKLSAgIGFuZCB3ZSBhdHRlbXB0IHRvIGNvbXBsZXRlbHkgcmVzb2x2ZSB0aGUgcmVsb2MuICBJZiB3ZSBjYW4gbm90IGRvCi0gICB0aGF0LCB3ZSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcmVsb2MgY29kZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIGZpeHVwLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWx1ZVAsIHNlZykKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWx1ZVA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKmNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsqLwotICB2YWx1ZVQgdmFsdWU7Ci0KLSAgLyogRklYTUUgRklYTUUgRklYTUU6IFRoZSB2YWx1ZSB3ZSBhcmUgcGFzc2VkIGluICp2YWx1ZVAgaW5jbHVkZXMKLSAgICAgdGhlIHN5bWJvbCB2YWx1ZXMuICBTaW5jZSB3ZSBhcmUgdXNpbmcgQkZEX0FTU0VNQkxFUiwgaWYgd2UgYXJlCi0gICAgIGRvaW5nIHRoaXMgcmVsb2NhdGlvbiB0aGUgY29kZSBpbiB3cml0ZS5jIGlzIGdvaW5nIHRvIGNhbGwKLSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgd2hpY2ggaXMgYWxzbyBnb2luZyB0byB1c2UgdGhlIHN5bWJvbAotICAgICB2YWx1ZS4gIFRoYXQgbWVhbnMgdGhhdCBpZiB0aGUgcmVsb2MgaXMgZnVsbHkgcmVzb2x2ZWQgd2Ugd2FudCB0bwotICAgICB1c2UgKnZhbHVlUCBzaW5jZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkLgotICAgICBIb3dldmVyLCBpZiB0aGUgcmVsb2MgaXMgbm90IGZ1bGx5IHJlc29sdmVkIHdlIGRvIG5vdCB3YW50IHRvIHVzZQotICAgICAqdmFsdWVQLCBhbmQgbXVzdCB1c2UgZnhfb2Zmc2V0IGluc3RlYWQuICBIb3dldmVyLCBpZiB0aGUgcmVsb2MKLSAgICAgaXMgUEMgcmVsYXRpdmUsIHdlIGRvIHdhbnQgdG8gdXNlICp2YWx1ZVAgc2luY2UgaXQgaW5jbHVkZXMgdGhlCi0gICAgIHJlc3VsdCBvZiBtZF9wY3JlbF9mcm9tLiAgVGhpcyBpcyBjb25mdXNpbmcuICAqLwotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlUDsKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgdmFsdWUgPSAqdmFsdWVQOwotICAgICAgLyogRUxGIHJlbG9jYXRpb25zIGFyZSBhZ2FpbnN0IHN5bWJvbHMuCi0JIElmIHRoaXMgc3ltYm9sIGlzIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gdGhlbiB3ZSBuZWVkIHRvIGxlYXZlIGl0IGZvcgotCSB0aGUgbGlua2VyIHRvIGRlYWwgd2l0aC4gIFVuZm9ydHVuYXRlbHksIG1kX3BjcmVsX2Zyb20gY2FuJ3QgdGVsbCwKLQkgc28gd2UgaGF2ZSB0byB1bmRvIGl0J3MgZWZmZWN0cyBoZXJlLiAgKi8KLSAgICAgIGlmIChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlZykKLQl2YWx1ZSArPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgIGlmIChmaXhQLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X3N1YnN5KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoKGludCkgZml4UC0+Znhfcl90eXBlID49IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaW50IG9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBjaGFyICp3aGVyZTsKLSAgICAgIGFyY19pbnNuIGluc247Ci0KLSAgICAgIG9waW5kZXggPSAoaW50KSBmaXhQLT5meF9yX3R5cGUgLSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEOwotCi0gICAgICBvcGVyYW5kID0gJmFyY19vcGVyYW5kc1tvcGluZGV4XTsKLQotICAgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLQkgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0gICAgICB3aGVyZSA9IGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBpbnNuID0gYXJjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAtMSwgTlVMTCwgKG9mZnNldFQpIHZhbHVlLAotCQkJCSBmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQliZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0KLSAgICAgIGlmIChmaXhQLT5meF9kb25lKQotCXsKLQkgIC8qIE5vdGhpbmcgZWxzZSB0byBkbyBoZXJlLiAgKi8KLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogRGV0ZXJtaW5lIGEgQkZEIHJlbG9jIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIGluZm9ybWF0aW9uLgotCSBXZSBhcmUgb25seSBwcmVwYXJlZCB0byB0dXJuIGEgZmV3IG9mIHRoZSBvcGVyYW5kcyBpbnRvIHJlbG9jcy4KLQkgISEhIE5vdGUgdGhhdCB3ZSBjYW4ndCBoYW5kbGUgbGltbSB2YWx1ZXMgaGVyZS4gIFNpbmNlIHdlJ3JlIHVzaW5nCi0JIGltcGxpY2l0IGFkZGVuZHMgdGhlIGFkZGVuZCBtdXN0IGJlIGluc2VydGVkIGludG8gdGhlIGluc3RydWN0aW9uLAotCSBob3dldmVyLCB0aGUgb3Bjb2RlIGluc2VydGlvbiByb3V0aW5lcyBjdXJyZW50bHkgZG8gbm90aGluZyB3aXRoCi0JIGxpbW0gdmFsdWVzLiAgKi8KLSAgICAgIGlmIChvcGVyYW5kLT5mbXQgPT0gJ0InKQotCXsKLQkgIGFzc2VydCAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIKSAhPSAwCi0JCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAyMAotCQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDcpOwotCSAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0FSQ19CMjJfUENSRUw7Ci0JfQotICAgICAgZWxzZSBpZiAoMCAmJiBvcGVyYW5kLT5mbXQgPT0gJ0onKQotCXsKLQkgIGFzc2VydCAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfQUJTT0xVVEVfQlJBTkNIKSAhPSAwCi0JCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAyNAotCQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDMyKTsKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BUkNfQjI2OwotCX0KLSAgICAgIGVsc2UgaWYgKDAgJiYgb3BlcmFuZC0+Zm10ID09ICdMJykKLQl7Ci0JICBhc3NlcnQgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0xJTU0pICE9IDAKLQkJICAmJiBvcGVyYW5kLT5iaXRzID09IDMyCi0JCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMzIpOwotCSAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIHJlc29sdmVkIikpOwotCSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzE2OgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgMik7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18zMjoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDQpOwotCSAgYnJlYWs7Ci0jaWYgMAotCWNhc2UgQkZEX1JFTE9DXzY0OgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgOCk7Ci0JICBicmVhazsKLSNlbmRpZgotCWNhc2UgQkZEX1JFTE9DX0FSQ19CMjY6Ci0JICAvKiBJZiAhZml4UC0+ZnhfZG9uZSB0aGVuIGB2YWx1ZScgaXMgYW4gaW1wbGljaXQgYWRkZW5kLgotCSAgICAgV2UgbXVzdCBzaGlmdCBpdCByaWdodCBieSAyIGluIHRoaXMgY2FzZSBhcyB3ZWxsIGJlY2F1c2UgdGhlCi0JICAgICBsaW5rZXIgcGVyZm9ybXMgdGhlIHJlbG9jYXRpb24gYW5kIHRoZW4gYWRkcyB0aGlzIGluIChhcyBvcHBvc2VkCi0JICAgICB0byBhZGRpbmcgdGhpcyBpbiBhbmQgdGhlbiBzaGlmdGluZyByaWdodCBieSAyKS4gICovCi0JICB2YWx1ZSA+Pj0gMjsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeFApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhQOwotewotICBhcmVsZW50ICpyZWxvYzsKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhQLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGV4cG9ydCByZWxvYyB0eXBlICVkIChgJXMnKSIpLAotCQkgICAgZml4UC0+Znhfcl90eXBlLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYXNzZXJ0ICghZml4UC0+ZnhfcGNyZWwgPT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpOwotCi0gIHJlbG9jLT5hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotDAotLyogRnJvYmJlcnMuICAqLwotCi0jaWYgMAotLyogU2V0IHRoZSByZWFsIG5hbWUgaWYgdGhlIC5yZW5hbWUgcHNldWRvLW9wIHdhcyB1c2VkLgotICAgUmV0dXJuIDEgaWYgdGhlIHN5bWJvbCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1pbnQKLWFyY19mcm9iX3N5bWJvbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBTX1NFVF9OQU1FIChzeW0sIHN5bWJvbF9nZXRfdGMgKHN5bSktPnJlYWxfbmFtZSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJjLmggYi9nYXMvY29uZmlnL3RjLWFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDY2MjAxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiB0Yy1hcmMuaCAtIE1hY3JvcyBhbmQgdHlwZSBkZWZpbmVzIGZvciB0aGUgQVJDLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfQVJDIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9hcmMKLQotI2RlZmluZSBMSVRUTEVfRU5ESUFOICAgMTIzNAotI2RlZmluZSBCSUdfRU5ESUFOICAgICAgNDMyMQotCi0vKiBUaGUgZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0IGZvcm1hdCBtYXkgY2hhbmdlIGJhc2VkIG9uIGNvbW1hbmQKLSAgIGxpbmUgYXJndW1lbnRzLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICphcmNfdGFyZ2V0X2Zvcm1hdDsKLSNkZWZpbmUgREVGQVVMVF9UQVJHRVRfRk9STUFUICJlbGYzMi1saXR0bGVhcmMiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgYXJjX3RhcmdldF9mb3JtYXQKLSNkZWZpbmUgREVGQVVMVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkFSQyBHQVMgIgotCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotLyogVGhlIEFSQyBuZWVkcyB0byBwYXJzZSByZWxvYyBzcGVjaWZpZXJzIGluIC53b3JkLiAgKi8KLQotZXh0ZXJuIHZvaWQgYXJjX3BhcnNlX2NvbnNfZXhwcmVzc2lvbiAoKTsKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBcCi1hcmNfcGFyc2VfY29uc19leHByZXNzaW9uIChFWFAsIE5CWVRFUykKLQotZXh0ZXJuIHZvaWQgYXJjX2NvbnNfZml4X25ldyAoKTsKLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXKEZSQUcsIFdIRVJFLCBOQllURVMsIEVYUCkgXAotYXJjX2NvbnNfZml4X25ldyAoRlJBRywgV0hFUkUsIE5CWVRFUywgRVhQKQotCi0jaWYgMAotLyogRXh0cmEgc3R1ZmYgdGhhdCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgZm9yIGVhY2ggc3ltYm9sLiAgKi8KLXN0cnVjdCBhcmNfdGNfc3kKLXsKLSAgLyogVGhlIHJlYWwgbmFtZSwgaWYgdGhlIHN5bWJvbCB3YXMgcmVuYW1lZC4gICovCi0gIGNoYXIgKnJlYWxfbmFtZTsKLX07Ci0KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSBzdHJ1Y3QgYXJjX3RjX3N5Ci0KLS8qIEZpbmlzaCB1cCB0aGUgc3ltYm9sLiAgKi8KLWV4dGVybiBpbnQgYXJjX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0sIHB1bnQpIHB1bnQgPSBhcmNfZnJvYl9zeW1ib2wgKHN5bSkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hcm0uYyBiL2dhcy9jb25maWcvdGMtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzliM2QuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDcyMDQgKzAsMCBAQAotLyogdGMtYXJtLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBBUk0KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCU1vZGlmaWVkIGJ5IERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSAgTk9fUkVMT0MgMAotI2luY2x1ZGUgImFzLmgiCi0KLS8qIG5lZWQgVEFSR0VUX0NQVSAqLwotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotI2luY2x1ZGUgImxpc3RpbmcuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvYXJtLmgiCi0jZW5kaWYKLQotLyogVHlwZXMgb2YgcHJvY2Vzc29yIHRvIGFzc2VtYmxlIGZvci4gICovCi0jZGVmaW5lIEFSTV8xCQkweDAwMDAwMDAxCi0jZGVmaW5lIEFSTV8yCQkweDAwMDAwMDAyCi0jZGVmaW5lIEFSTV8zCQkweDAwMDAwMDA0Ci0jZGVmaW5lIEFSTV8yNTAJCUFSTV8zCi0jZGVmaW5lIEFSTV82CQkweDAwMDAwMDA4Ci0jZGVmaW5lIEFSTV83CQlBUk1fNiAgICAgICAgICAgLyogc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCAqLwotI2RlZmluZSBBUk1fOAkJQVJNXzYgICAgICAgICAgIC8qIHNhbWUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKi8KLSNkZWZpbmUgQVJNXzkJCUFSTV82ICAgICAgICAgICAvKiBzYW1lIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0ICovCi0jZGVmaW5lIEFSTV9DUFVfTUFTSwkweDAwMDAwMDBmCi0KLS8qIFRoZSBmb2xsb3dpbmcgYml0bWFza3MgY29udHJvbCBDUFUgZXh0ZW5zaW9ucyAoQVJNNyBvbndhcmRzKTogKi8KLSNkZWZpbmUgQVJNX0xPTkdNVUwJMHgwMDAwMDAxMAkvKiBhbGxvdyBsb25nIG11bHRpcGxpZXMgKi8KLSNkZWZpbmUgQVJNX0hBTEZXT1JEICAgIDB4MDAwMDAwMjAJLyogYWxsb3cgaGFsZiB3b3JkIGxvYWRzICovCi0jZGVmaW5lIEFSTV9USFVNQiAgICAgICAweDAwMDAwMDQwCS8qIGFsbG93IEJYIGluc3RydWN0aW9uICAqLwotI2RlZmluZSBBUk1fRVhUX1Y1CTB4MDAwMDAwODAJLyogYWxsb3cgQ0xaIGV0YwkgKi8KLSNkZWZpbmUgQVJNX0VYVF9WNUUgICAgIDB4MDAwMDAyMDAJLyogIkVsIFNlZ3VuZG8iIAkgKi8KLQotLyogQXJjaGl0ZWN0dXJlcyBhcmUgdGhlIHN1bSBvZiB0aGUgYmFzZSBhbmQgZXh0ZW5zaW9ucy4gICovCi0jZGVmaW5lIEFSTV9BUkNIX1Y0CShBUk1fNyB8IEFSTV9MT05HTVVMIHwgQVJNX0hBTEZXT1JEKQotI2RlZmluZSBBUk1fQVJDSF9WNFQJKEFSTV9BUkNIX1Y0IHwgQVJNX1RIVU1CKQotI2RlZmluZSBBUk1fQVJDSF9WNQkoQVJNX0FSQ0hfVjQgfCBBUk1fRVhUX1Y1KQotI2RlZmluZSBBUk1fQVJDSF9WNVQJKEFSTV9BUkNIX1Y1IHwgQVJNX1RIVU1CKQotCi0vKiBTb21lIHVzZWZ1bCBjb21iaW5hdGlvbnM6ICAqLwotI2RlZmluZSBBUk1fQU5ZCQkweDAwZmZmZmZmCi0jZGVmaW5lIEFSTV8yVVAJCShBUk1fQU5ZIC0gQVJNXzEpCi0jZGVmaW5lIEFSTV9BTEwJCUFSTV8yVVAJCS8qIE5vdCBhcm0xIG9ubHkgKi8KLSNkZWZpbmUgQVJNXzNVUAkJMHgwMGZmZmZmYwotI2RlZmluZSBBUk1fNlVQCQkweDAwZmZmZmY4ICAgICAgLyogSW5jbHVkZXMgQVJNNyAqLwotCi0jZGVmaW5lIEZQVV9DT1JFCTB4ODAwMDAwMDAKLSNkZWZpbmUgRlBVX0ZQQTEwCTB4NDAwMDAwMDAKLSNkZWZpbmUgRlBVX0ZQQTExCTB4NDAwMDAwMDAKLSNkZWZpbmUgRlBVX05PTkUJMAotCi0vKiBTb21lIHVzZWZ1bCBjb21iaW5hdGlvbnMgICovCi0jZGVmaW5lIEZQVV9BTEwJCTB4ZmYwMDAwMDAJLyogTm90ZSB0aGlzIGlzIH5BUk1fQU5ZICovCi0jZGVmaW5lIEZQVV9NRU1NVUxUSQkweDdmMDAwMDAwCS8qIE5vdCBmcHVfY29yZSAqLwotCi0gICAgIAotI2lmbmRlZiBDUFVfREVGQVVMVAotI2lmIGRlZmluZWQgX190aHVtYl9fCi0jZGVmaW5lIENQVV9ERUZBVUxUIChBUk1fQVJDSF9WNCB8IEFSTV9USFVNQikKLSNlbHNlCi0jZGVmaW5lIENQVV9ERUZBVUxUIEFSTV9BTEwKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRlBVX0RFRkFVTFQKLSNkZWZpbmUgRlBVX0RFRkFVTFQgRlBVX0FMTAotI2VuZGlmCi0KLSNkZWZpbmUgc3RyZXEoYSwgYikgICAgICAgICAgIChzdHJjbXAgKGEsIGIpID09IDApCi0jZGVmaW5lIHNraXBfd2hpdGVzcGFjZShzdHIpICB3aGlsZSAoKiAoc3RyKSA9PSAnICcpICsrIChzdHIpCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCWNwdV92YXJpYW50ID0gQ1BVX0RFRkFVTFQgfCBGUFVfREVGQVVMVDsKLXN0YXRpYyBpbnQgdGFyZ2V0X29hYmkgPSAwOwotCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLS8qIEZsYWdzIHN0b3JlZCBpbiBwcml2YXRlIGFyZWEgb2YgQkZEIHN0cnVjdHVyZSAqLwotc3RhdGljIGJvb2xlYW4JCXVzZXNfYXBjc18yNiA9IGZhbHNlOwotc3RhdGljIGJvb2xlYW4JCXN1cHBvcnRfaW50ZXJ3b3JrID0gZmFsc2U7Ci1zdGF0aWMgYm9vbGVhbgkJdXNlc19hcGNzX2Zsb2F0ID0gZmFsc2U7Ci1zdGF0aWMgYm9vbGVhbgkJcGljX2NvZGUgPSBmYWxzZTsKLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4gICovCi1DT05TVCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICJAIjsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dC4gICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAgKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gICovCi1DT05TVCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0jaWZkZWYgVEVfTElOVVgKLUNPTlNUIGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLSNlbHNlCi1DT05TVCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLSNlbmRpZgotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQKLSAgIGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICAqLwotQ09OU1QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLQotQ09OU1QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYZUVwUCI7Ci0KLS8qIFByZWZpeCBjaGFyYWN0ZXJzIHRoYXQgaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGFuIGltbWVkaWF0ZQotICAgdmFsdWUuICAqLwotI2RlZmluZSBpc19pbW1lZGlhdGVfcHJlZml4KEMpICgoQykgPT0gJyMnIHx8IChDKSA9PSAnJCcpCi0KLSNpZmRlZiBPQkpfRUxGCi1zeW1ib2xTICogR09UX3N5bWJvbDsJCS8qIFByZS1kZWZpbmVkICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iICovCi0jZW5kaWYKLQotQ09OU1QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLXN0YXRpYyBpbnQgdGh1bWJfbW9kZSA9IDA7ICAgICAgLyogMDogYXNzZW1ibGUgZm9yIEFSTSwgMTogYXNzZW1ibGUgZm9yIFRodW1iLAotCQkJCSAgIDI6IGFzc2VtYmxlIGZvciBUaHVtYiBldmVuIHRob3VnaCB0YXJnZXQgY3B1Ci0JCQkJICAgZG9lcyBub3Qgc3VwcG9ydCB0aHVtYiBpbnN0cnVjdGlvbnMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgYXJtX2ZpeAotewotICBpbnQgdGh1bWJfbW9kZTsKLX0gYXJtX2ZpeF9kYXRhOwotCi1zdHJ1Y3QgYXJtX2l0Ci17Ci0gIENPTlNUIGNoYXIgKiAgZXJyb3I7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb247Ci0gIGludCAgICAgICAgICAgc3VmZml4OwotICBpbnQgICAgICAgICAgIHNpemU7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSB0eXBlOwotICAgICAgZXhwcmVzc2lvblMgICAgICAgICAgICAgIGV4cDsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICBwY19yZWw7Ci0gICAgfSByZWxvYzsKLX07Ci0KLXN0cnVjdCBhcm1faXQgaW5zdDsKLQotc3RydWN0IGFzbV9zaGlmdAotewotICBDT05TVCBjaGFyICogIHRlbXBsYXRlOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fc2hpZnQgc2hpZnRbXSA9Ci17Ci0gIHsiYXNsIiwgMH0sCi0gIHsibHNsIiwgMH0sCi0gIHsibHNyIiwgMHgwMDAwMDAyMH0sCi0gIHsiYXNyIiwgMHgwMDAwMDA0MH0sCi0gIHsicm9yIiwgMHgwMDAwMDA2MH0sCi0gIHsicnJ4IiwgMHgwMDAwMDA2MH0sCi0gIHsiQVNMIiwgMH0sCi0gIHsiTFNMIiwgMH0sCi0gIHsiTFNSIiwgMHgwMDAwMDAyMH0sCi0gIHsiQVNSIiwgMHgwMDAwMDA0MH0sCi0gIHsiUk9SIiwgMHgwMDAwMDA2MH0sCi0gIHsiUlJYIiwgMHgwMDAwMDA2MH0KLX07Ci0KLSNkZWZpbmUgTk9fU0hJRlRfUkVTVFJJQ1QgMQotI2RlZmluZSBTSElGVF9SRVNUUklDVAkgIDAKLQotI2RlZmluZSBOVU1fRkxPQVRfVkFMUyA4Ci0KLUNPTlNUIGNoYXIgKiBmcF9jb25zdFtdID0gCi17Ci0gICIwLjAiLCAiMS4wIiwgIjIuMCIsICIzLjAiLCAiNC4wIiwgIjUuMCIsICIwLjUiLCAiMTAuMCIsIDAKLX07Ci0KLS8qIE51bWJlciBvZiBsaXR0bGVudW1zIHJlcXVpcmVkIHRvIGhvbGQgYW4gZXh0ZW5kZWQgcHJlY2lzaW9uIG51bWJlci4gICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotTElUVExFTlVNX1RZUEUgZnBfdmFsdWVzW05VTV9GTE9BVF9WQUxTXVtNQVhfTElUVExFTlVNU107Ci0KLSNkZWZpbmUgRkFJTAkoLTEpCi0jZGVmaW5lIFNVQ0NFU1MgKDApCi0KLSNkZWZpbmUgU1VGRl9TIDEKLSNkZWZpbmUgU1VGRl9EIDIKLSNkZWZpbmUgU1VGRl9FIDMKLSNkZWZpbmUgU1VGRl9QIDQKLQotI2RlZmluZSBDUF9UX1ggICAweDAwMDA4MDAwCi0jZGVmaW5lIENQX1RfWSAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgQ1BfVF9QcmUgMHgwMTAwMDAwMAotI2RlZmluZSBDUF9UX1VEICAweDAwODAwMDAwCi0jZGVmaW5lIENQX1RfV0IgIDB4MDAyMDAwMDAKLQotI2RlZmluZSBDT05EU19CSVQgICAgICAgKDB4MDAxMDAwMDApCi0jZGVmaW5lIExPQURfQklUICAgICAgICAoMHgwMDEwMDAwMCkKLSNkZWZpbmUgVFJBTlNfQklUCSgweDAwMjAwMDAwKQotCi1zdHJ1Y3QgYXNtX2NvbmQKLXsKLSAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLX07Ci0KLS8qIFRoaXMgaXMgdG8gc2F2ZSBhIGhhc2ggbG9vay11cCBpbiB0aGUgY29tbW9uIGNhc2UuICAqLwotI2RlZmluZSBDT05EX0FMV0FZUyAweGUwMDAwMDAwCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2NvbmQgY29uZHNbXSA9IAotewotICB7ImVxIiwgMHgwMDAwMDAwMH0sCi0gIHsibmUiLCAweDEwMDAwMDAwfSwKLSAgeyJjcyIsIDB4MjAwMDAwMDB9LCB7ImhzIiwgMHgyMDAwMDAwMH0sCi0gIHsiY2MiLCAweDMwMDAwMDAwfSwgeyJ1bCIsIDB4MzAwMDAwMDB9LCB7ImxvIiwgMHgzMDAwMDAwMH0sCi0gIHsibWkiLCAweDQwMDAwMDAwfSwKLSAgeyJwbCIsIDB4NTAwMDAwMDB9LAotICB7InZzIiwgMHg2MDAwMDAwMH0sCi0gIHsidmMiLCAweDcwMDAwMDAwfSwKLSAgeyJoaSIsIDB4ODAwMDAwMDB9LAotICB7ImxzIiwgMHg5MDAwMDAwMH0sCi0gIHsiZ2UiLCAweGEwMDAwMDAwfSwKLSAgeyJsdCIsIDB4YjAwMDAwMDB9LAotICB7Imd0IiwgMHhjMDAwMDAwMH0sCi0gIHsibGUiLCAweGQwMDAwMDAwfSwKLSAgeyJhbCIsIDB4ZTAwMDAwMDB9LAotICB7Im52IiwgMHhmMDAwMDAwMH0KLX07Ci0KLS8qIFdhcm5pbmc6IElmIHRoZSB0b3AgYml0IG9mIHRoZSBzZXRfYml0cyBpcyBzZXQsIHRoZW4gdGhlIHN0YW5kYXJkCi0gICBpbnN0cnVjdGlvbiBiaXRtYXNrIGlzIGlnbm9yZWQsIGFuZCB0aGUgbmV3IGJpdG1hc2sgaXMgdGFrZW4gZnJvbQotICAgdGhlIHNldF9iaXRzOiAgKi8KLXN0cnVjdCBhc21fZmxnCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7CS8qIEJhc2ljIGZsYWcgc3RyaW5nICovCi0gIHVuc2lnbmVkIGxvbmcgc2V0X2JpdHM7CS8qIEJpdHMgdG8gc2V0ICovCi19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc19mbGFnW10gPQotewotICB7InMiLCBDT05EU19CSVR9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBsZHJfZmxhZ3NbXSA9Ci17Ci0gIHsiYiIsICAweDAwNDAwMDAwfSwKLSAgeyJ0IiwgIFRSQU5TX0JJVH0sCi0gIHsiYnQiLCAweDAwNDAwMDAwIHwgVFJBTlNfQklUfSwKLSAgeyJoIiwgIDB4ODAxMDAwYjB9LAotICB7InNoIiwgMHg4MDEwMDBmMH0sCi0gIHsic2IiLCAweDgwMTAwMGQwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc3RyX2ZsYWdzW10gPQotewotICB7ImIiLCAgMHgwMDQwMDAwMH0sCi0gIHsidCIsICBUUkFOU19CSVR9LAotICB7ImJ0IiwgMHgwMDQwMDAwMCB8IFRSQU5TX0JJVH0sCi0gIHsiaCIsICAweDgwMDAwMGIwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgYnl0ZV9mbGFnW10gPQotewotICB7ImIiLCAweDAwNDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgY21wX2ZsYWdzW10gPQotewotICB7InMiLCBDT05EU19CSVR9LAotICB7InAiLCAweDAwMTBmMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgbGRtX2ZsYWdzW10gPQotewotICB7ImVkIiwgMHgwMTgwMDAwMH0sCi0gIHsiZmQiLCAweDAwODAwMDAwfSwKLSAgeyJlYSIsIDB4MDEwMDAwMDB9LAotICB7ImZhIiwgMHgwODAwMDAwMH0sCi0gIHsiaWIiLCAweDAxODAwMDAwfSwKLSAgeyJpYSIsIDB4MDA4MDAwMDB9LAotICB7ImRiIiwgMHgwMTAwMDAwMH0sCi0gIHsiZGEiLCAweDA4MDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc3RtX2ZsYWdzW10gPQotewotICB7ImVkIiwgMHgwODAwMDAwMH0sCi0gIHsiZmQiLCAweDAxMDAwMDAwfSwKLSAgeyJlYSIsIDB4MDA4MDAwMDB9LAotICB7ImZhIiwgMHgwMTgwMDAwMH0sCi0gIHsiaWIiLCAweDAxODAwMDAwfSwKLSAgeyJpYSIsIDB4MDA4MDAwMDB9LAotICB7ImRiIiwgMHgwMTAwMDAwMH0sCi0gIHsiZGEiLCAweDA4MDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgbGZtX2ZsYWdzW10gPQotewotICB7ImZkIiwgMHgwMDgwMDAwMH0sCi0gIHsiZWEiLCAweDAxMDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgc2ZtX2ZsYWdzW10gPQotewotICB7ImZkIiwgMHgwMTAwMDAwMH0sCi0gIHsiZWEiLCAweDAwODAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgcm91bmRfZmxhZ3NbXSA9Ci17Ci0gIHsicCIsIDB4MDAwMDAwMjB9LAotICB7Im0iLCAweDAwMDAwMDQwfSwKLSAgeyJ6IiwgMHgwMDAwMDA2MH0sCi0gIHtOVUxMLCAwfQotfTsKLQotLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBGSVggaW5zdHJ1Y3Rpb24gaXMgYnJva2VuIG9uIHNvbWUgYXNzZW1ibGVycywKLSAgIGluIHRoYXQgaXQgYWNjZXB0cyBhIHByZWNpc2lvbiBzcGVjaWZpZXIgYXMgd2VsbCBhcyBhIHJvdW5kaW5nIHNwZWNpZmllciwKLSAgIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGlzIGlzIG1lYW5pbmdsZXNzLiAgVG8gYmUgbW9yZSBjb21wYXRpYmxlLCB3ZQotICAgYWNjZXB0IGl0IGFzIHdlbGwsIHRob3VnaCBvZiBjb3Vyc2UgaXQgZG9lcyBub3Qgc2V0IGFueSBiaXRzLiAgKi8KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBmaXhfZmxhZ3NbXSA9Ci17Ci0gIHsicCIsIDB4MDAwMDAwMjB9LAotICB7Im0iLCAweDAwMDAwMDQwfSwKLSAgeyJ6IiwgMHgwMDAwMDA2MH0sCi0gIHsic3AiLCAweDAwMDAwMDIwfSwKLSAgeyJzbSIsIDB4MDAwMDAwNDB9LAotICB7InN6IiwgMHgwMDAwMDA2MH0sCi0gIHsiZHAiLCAweDAwMDAwMDIwfSwKLSAgeyJkbSIsIDB4MDAwMDAwNDB9LAotICB7ImR6IiwgMHgwMDAwMDA2MH0sCi0gIHsiZXAiLCAweDAwMDAwMDIwfSwKLSAgeyJlbSIsIDB4MDAwMDAwNDB9LAotICB7ImV6IiwgMHgwMDAwMDA2MH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGV4Y2VwdF9mbGFnW10gPQotewotICB7ImUiLCAweDAwNDAwMDAwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgY3Bsb25nX2ZsYWdbXSA9Ci17Ci0gIHsibCIsIDB4MDA0MDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0cnVjdCBhc21fcHNyCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotfTsKLQotI2RlZmluZSBQU1JfRklFTERfTUFTSyAgMHgwMDBmMDAwMAotCi0jZGVmaW5lIFBTUl9GTEFHUwkweDAwMDgwMDAwCi0jZGVmaW5lIFBTUl9DT05UUk9MCTB4MDAwMTAwMDAgLyogVW5kb2N1bWVudGVkIGluc3RydWN0aW9uLCBpdHMgdXNlIGlzIGRpc2NvdXJhZ2VkIGJ5IEFSTSAqLwotI2RlZmluZSBQU1JfQUxMCQkweDAwMDkwMDAwCi0KLSNkZWZpbmUgQ1BTUl9BTEwJMAotI2RlZmluZSBTUFNSX0FMTAkxCi0jZGVmaW5lIENQU1JfRkxHCTIKLSNkZWZpbmUgU1BTUl9GTEcJMwotI2RlZmluZSBDUFNSX0NUTAk0Ci0jZGVmaW5lIFNQU1JfQ1RMCTUKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fcHNyIHBzcnNbXSA9Ci17Ci0gIC8qIFZhbGlkIDxwc3I+J3MgKi8KLSAgeyJjcHNyIiwJQ1BTUl9BTEx9LAotICB7ImNwc3JfYWxsIiwJQ1BTUl9BTEx9LAotICB7InNwc3IiLAlTUFNSX0FMTH0sCi0gIHsic3Bzcl9hbGwiLAlTUFNSX0FMTH0sCi0KLSAgLyogVmFsaWQgPHBzcmY+J3MgKi8KLSAgeyJjcHNyX2ZsZyIsCUNQU1JfRkxHfSwKLSAgeyJzcHNyX2ZsZyIsCVNQU1JfRkxHfSwKLSAgCi0gIC8qIFZhbGlkIDxwc3JjPidzICovCi0gIHsiY3Bzcl9jIiwJQ1BTUl9DVEx9LAotICB7ImNwc3JfY3RsIiwJQ1BTUl9DVEx9LAotICB7InNwc3JfYyIsCVNQU1JfQ1RMfSwKLSAgeyJzcHNyX2N0bCIsCVNQU1JfQ1RMfQotfTsKLQotLyogRnVuY3Rpb25zIGNhbGxlZCBieSBwYXJzZXIuICAqLwotLyogQVJNIGluc3RydWN0aW9ucyAqLwotc3RhdGljIHZvaWQgZG9fYXJpdAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19jbXAJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fbW92CQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2xkc3QJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fbGRtc3RtCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2JyYW5jaAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19zd2kJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotLyogUHNldWRvIE9wIGNvZGVzICovCQkJICAgICAgIAkJICAgICAgCi1zdGF0aWMgdm9pZCBkb19hZHIJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fYWRybAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19ub3AJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotLyogQVJNIDIgKi8JCQkJICAgICAgIAkJICAgICAgCi1zdGF0aWMgdm9pZCBkb19tdWwJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fbWxhCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLS8qIEFSTSAzICovCQkJCSAgICAgICAJCSAgICAgIAotc3RhdGljIHZvaWQgZG9fc3dhcAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci0vKiBBUk0gNiAqLwkJCQkgICAgICAgCQkgICAgICAKLXN0YXRpYyB2b2lkIGRvX21zcgkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19tcnMJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotLyogQVJNIDdNICovCQkJCSAgICAgICAJCSAgICAgIAotc3RhdGljIHZvaWQgZG9fbXVsbAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci0vKiBBUk0gVEhVTUIgKi8JCQkJICAgICAgIAkJICAgICAgCi1zdGF0aWMgdm9pZCBkb19ieCAgICAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotCi0JCQkJCSAgICAgICAJCSAgICAgIAotLyogQ29wcm9jZXNzb3IgSW5zdHJ1Y3Rpb25zICovCQkgICAgICAgCQkgICAgICAKLXN0YXRpYyB2b2lkIGRvX2NkcAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19sc3RjCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2NvX3JlZwkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9jdHJsCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2xkc3QJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fZnBfbGRtc3RtCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fZnBfZHlhZGljCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fZnBfbW9uYWRpYwlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2NtcAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9mcm9tX3JlZwlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX3RvX3JlZwlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLQotc3RhdGljIHZvaWQgZml4X25ld19hcm0JCVBBUkFNUyAoKGZyYWdTICosIGludCwgc2hvcnQsIGV4cHJlc3Npb25TICosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGFybV9yZWdfcGFyc2UJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBhcm1fcHNyX3BhcnNlCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHN5bWJvbF9sb2NhdGUJUEFSQU1TICgoc3ltYm9sUyAqLCBDT05TVCBjaGFyICosIHNlZ1QsIHZhbHVlVCwgZnJhZ1MgKikpOwotc3RhdGljIGludCBhZGRfdG9fbGl0X3Bvb2wJUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHVuc2lnbmVkIHZhbGlkYXRlX2ltbWVkaWF0ZSBQQVJBTVMgKCh1bnNpZ25lZCkpOwotc3RhdGljIHVuc2lnbmVkIHZhbGlkYXRlX2ltbWVkaWF0ZV90d29wYXJ0IFBBUkFNUyAoKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyBpbnQgdmFsaWRhdGVfb2Zmc2V0X2ltbQlQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3Bjb2RlX3NlbGVjdAlQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGVuZF9vZl9saW5lCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgcmVnX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBzcl9yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGNvX3Byb2NfbnVtYmVyCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgY3Bfb3BjX2V4cHIJCVBBUkFNUyAoKGNoYXIgKiosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGNwX3JlZ19yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBmcF9yZWdfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgY3BfYWRkcmVzc19vZmZzZXQJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBteV9nZXRfZmxvYXRfZXhwcmVzc2lvbglQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHNraXBfcGFzdF9jb21tYQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHdhbGtfbm9fYmlnbnVtcwlQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyBpbnQgbmVnYXRlX2RhdGFfb3AJUEFSQU1TICgodW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGRhdGFfb3AyCQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGZwX29wMgkJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGxvbmcgcmVnX2xpc3QJCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHRodW1iX2xvYWRfc3RvcmUJUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBkZWNvZGVfc2hpZnQJCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBsZHN0X2V4dGVuZAkJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB0aHVtYl9hZGRfc3ViCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmVnCQlQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHRodW1iX3NoaWZ0CQlQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgdGh1bWJfbW92X2NvbXBhcmUJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF9jb25zdGFudF9mbG9udW1zCVBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2YWx1ZVQgbWRfY2hhcnNfdG9fbnVtYmVyCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmVnX2FsaWFzCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfaW5zdAkJUEFSQU1TICgodm9pZCkpOwotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUJYXJtX3BhcnNlX3JlbG9jIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0vKiBBUk0gaW5zdHJ1Y3Rpb25zIHRha2UgNGJ5dGVzIGluIHRoZSBvYmplY3QgZmlsZSwgVGh1bWIgaW5zdHJ1Y3Rpb25zCi0gICB0YWtlIDI6ICAqLwotI2RlZmluZSBJTlNOX1NJWkUgICAgICAgNAotCi0vKiBMT05HRVNUX0lOU1QgaXMgdGhlIGxvbmdlc3QgYmFzaWMgaW5zdHJ1Y3Rpb24gbmFtZSB3aXRob3V0IGNvbmRpdGlvbnMgb3IgCi0gICBmbGFncy4gIEFSTTdNIGhhcyA0IG9mIGxlbmd0aCA1LiAgKi8KLQotI2RlZmluZSBMT05HRVNUX0lOU1QgNQotCi0KLXN0cnVjdCBhc21fb3Bjb2RlIAotewotICBDT05TVCBjaGFyICogICAgICAgICAgIHRlbXBsYXRlOwkvKiBCYXNpYyBzdHJpbmcgdG8gbWF0Y2ggKi8KLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2YWx1ZTsJCS8qIEJhc2ljIGluc3RydWN0aW9uIGNvZGUgKi8KLQotICAvKiBDb21wdWxzb3J5IHN1ZmZpeCB0aGF0IG11c3QgZm9sbG93IGNvbmRzLiBJZiAiIiwgdGhlbiB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gaXMgbm90IGNvbmRpdGlvbmFsIGFuZCBtdXN0IGhhdmUgbm8gc3VmZml4LiAqLwotICBDT05TVCBjaGFyICogICAgICAgICAgIGNvbXBfc3VmZml4OwkKLQotICBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyAqIGZsYWdzOwkgICAgICAgIC8qIEJpdHMgdG8gdG9nZ2xlIGlmIGZsYWcgJ24nIHNldCAqLwotICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZhcmlhbnRzOwkvKiBXaGljaCBDUFUgdmFyaWFudHMgdGhpcyBleGlzdHMgZm9yICovCi0gIC8qIEZ1bmN0aW9uIHRvIGNhbGwgdG8gcGFyc2UgYXJncyAqLwotICB2b2lkICgqICAgICAgICAgICAgICAgIHBhcm1zKSBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX29wY29kZSBpbnNuc1tdID0gCi17Ci0vKiBBUk0gSW5zdHJ1Y3Rpb25zICovCi0gIHsiYW5kIiwgICAweDAwMDAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7ImVvciIsICAgMHgwMDIwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJzdWIiLCAgIDB4MDA0MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsicnNiIiwgICAweDAwNjAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7ImFkZCIsICAgMHgwMDgwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJhZGMiLCAgIDB4MDBhMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsic2JjIiwgICAweDAwYzAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InJzYyIsICAgMHgwMGUwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJvcnIiLCAgIDB4MDE4MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsiYmljIiwgICAweDAxYzAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InRzdCIsICAgMHgwMTAwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAotICB7InRlcSIsICAgMHgwMTIwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAotICB7ImNtcCIsICAgMHgwMTQwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAotICB7ImNtbiIsICAgMHgwMTYwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAotICB7Im1vdiIsICAgMHgwMWEwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19tb3Z9LAotICB7Im12biIsICAgMHgwMWUwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19tb3Z9LAotICB7InN0ciIsICAgMHgwNDAwMDAwMCwgTlVMTCwgICBzdHJfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZHN0fSwKLSAgeyJsZHIiLCAgIDB4MDQxMDAwMDAsIE5VTEwsICAgbGRyX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fbGRzdH0sCi0gIHsic3RtIiwgICAweDA4MDAwMDAwLCBOVUxMLCAgIHN0bV9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkbXN0bX0sCi0gIHsibGRtIiwgICAweDA4MTAwMDAwLCBOVUxMLCAgIGxkbV9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkbXN0bX0sCi0gIHsic3dpIiwgICAweDBmMDAwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX3N3aX0sCi0jaWZkZWYgVEVfV0lOQ0UKLSAgeyJibCIsICAgIDB4MGIwMDAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fYnJhbmNofSwKLSAgeyJiIiwgICAgIDB4MGEwMDAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fYnJhbmNofSwKLSNlbHNlCi0gIHsiYmwiLCAgICAweDBiZmZmZmZlLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2JyYW5jaH0sCi0gIHsiYiIsICAgICAweDBhZmZmZmZlLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2JyYW5jaH0sCi0jZW5kaWYKLSAgCi0vKiBQc2V1ZG8gb3BzICovCi0gIHsiYWRyIiwgICAweDAyOGYwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2Fkcn0sCi0gIHsiYWRybCIsICAweDAyOGYwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2Fkcmx9LAotICB7Im5vcCIsICAgMHgwMWEwMDAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19ub3B9LAotCi0vKiBBUk0gMiBtdWx0aXBsaWVzICovCi0gIHsibXVsIiwgICAweDAwMDAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fMlVQLCAgICAgIGRvX211bH0sCi0gIHsibWxhIiwgICAweDAwMjAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fMlVQLCAgICAgIGRvX21sYX0sCi0KLS8qIEFSTSAzIC0gc3dwIGluc3RydWN0aW9ucyAqLwotICB7InN3cCIsICAgMHgwMTAwMDA5MCwgTlVMTCwgICBieXRlX2ZsYWcsICAgQVJNXzNVUCwgICAgICBkb19zd2FwfSwKLQotLyogQVJNIDYgQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gIHsibXJzIiwgICAweDAxMGYwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fNlVQLCAgICAgIGRvX21yc30sCi0gIHsibXNyIiwgICAweDAxMjBmMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fNlVQLCAgICAgIGRvX21zcn0sCi0vKiBTY290dEI6IG91ciBjb2RlIHVzZXMgMHgwMTI4ZjAwMCBmb3IgbXNyLgotICAgTmlja0M6ICBidXQgdGhpcyBpcyB3cm9uZyBiZWNhdXNlIHRoZSBiaXRzIDE2IGFuZCAxOSBhcmUgaGFuZGxlZAotICAgICAgICAgICBieSB0aGUgUFNSX3h4eCBkZWZpbmVzIGFib3ZlLiAgKi8KLQotLyogQVJNIDdNIGxvbmcgbXVsdGlwbGllcyAtIG5lZWQgc2lnbmVkL3Vuc2lnbmVkIGZsYWdzISAqLwotICB7InNtdWxsIiwgMHgwMGMwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0xPTkdNVUwsICBkb19tdWxsfSwKLSAgeyJ1bXVsbCIsIDB4MDA4MDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9MT05HTVVMLCAgZG9fbXVsbH0sCi0gIHsic21sYWwiLCAweDAwZTAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAotICB7InVtbGFsIiwgMHgwMGEwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0xPTkdNVUwsICBkb19tdWxsfSwKLQotLyogQVJNIFRIVU1CIGludGVyd29ya2luZyAqLwotICB7ImJ4IiwgICAgMHgwMTJmZmYxMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX1RIVU1CLCAgICBkb19ieH0sCi0KLS8qIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotICB7IndmcyIsICAgMHgwZTIwMDExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jdHJsfSwKLSAgeyJyZnMiLCAgIDB4MGUzMDAxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY3RybH0sCi0gIHsid2ZjIiwgICAweDBlNDAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAotICB7InJmYyIsICAgMHgwZTUwMDExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jdHJsfSwKLSAgeyJsZGYiLCAgIDB4MGMxMDAxMDAsICJzZGVwIiwgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfbGRzdH0sCi0gIHsic3RmIiwgICAweDBjMDAwMTAwLCAic2RlcCIsIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2xkc3R9LAotICB7ImxmbSIsICAgMHgwYzEwMDIwMCwgTlVMTCwgICBsZm1fZmxhZ3MsICAgRlBVX01FTU1VTFRJLCBkb19mcF9sZG1zdG19LAotICB7InNmbSIsICAgMHgwYzAwMDIwMCwgTlVMTCwgICBzZm1fZmxhZ3MsICAgRlBVX01FTU1VTFRJLCBkb19mcF9sZG1zdG19LAotICB7Im12ZiIsICAgMHgwZTAwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJtbmYiLCAgIDB4MGUxMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiYWJzIiwgICAweDBlMjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InJuZCIsICAgMHgwZTMwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJzcXQiLCAgIDB4MGU0MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsibG9nIiwgICAweDBlNTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImxnbiIsICAgMHgwZTYwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJleHAiLCAgIDB4MGU3MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsic2luIiwgICAweDBlODA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImNvcyIsICAgMHgwZTkwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJ0YW4iLCAgIDB4MGVhMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiYXNuIiwgICAweDBlYjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImFjcyIsICAgMHgwZWMwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhdG4iLCAgIDB4MGVkMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsidXJkIiwgICAweDBlZTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7Im5ybSIsICAgMHgwZWYwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhZGYiLCAgIDB4MGUwMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJzdWYiLCAgIDB4MGUyMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJyc2YiLCAgIDB4MGUzMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJtdWYiLCAgIDB4MGUxMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJkdmYiLCAgIDB4MGU0MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJyZGYiLCAgIDB4MGU1MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJwb3ciLCAgIDB4MGU2MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJycHciLCAgIDB4MGU3MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJybWYiLCAgIDB4MGU4MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJmbWwiLCAgIDB4MGU5MDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJmZHYiLCAgIDB4MGVhMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJmcmQiLCAgIDB4MGViMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJwb2wiLCAgIDB4MGVjMDAxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZHlhZGljfSwKLSAgeyJjbWYiLCAgIDB4MGU5MGYxMTAsIE5VTEwsICAgZXhjZXB0X2ZsYWcsIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLSAgeyJjbmYiLCAgIDB4MGViMGYxMTAsIE5VTEwsICAgZXhjZXB0X2ZsYWcsIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLS8qIFRoZSBGUEExMCBkYXRhIHNoZWV0IHN1Z2dlc3RzIHRoYXQgdGhlICdFJyBvZiBjbWZlL2NuZmUgc2hvdWxkIG5vdAotICAgYmUgYW4gb3B0aW9uYWwgc3VmZml4LCBidXQgcGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUbyBiZSBjb21wYXRpYmxlLAotICAgd2UgYWNjZXB0IGVpdGhlci4gICovCi0gIHsiY21mZSIsICAweDBlZDBmMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2NtcH0sCi0gIHsiY25mZSIsICAweDBlZjBmMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2NtcH0sCi0gIHsiZmx0IiwgICAweDBlMDAwMTEwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2Zyb21fcmVnfSwKLSAgeyJmaXgiLCAgIDB4MGUxMDAxMTAsIE5VTEwsICAgZml4X2ZsYWdzLCAgIEZQVV9BTEwsICAgICAgZG9fZnBfdG9fcmVnfSwKLQotLyogR2VuZXJpYyBjb3ByZXNzb3IgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgeyJjZHAiLCAgIDB4MGUwMDAwMDAsIE5VTEwsICBOVUxMLCAgICAgICAgIEFSTV8yVVAsICAgICAgZG9fY2RwfSwKLSAgeyJsZGMiLCAgIDB4MGMxMDAwMDAsIE5VTEwsICBjcGxvbmdfZmxhZywgIEFSTV8yVVAsICAgICAgZG9fbHN0Y30sCi0gIHsic3RjIiwgICAweDBjMDAwMDAwLCBOVUxMLCAgY3Bsb25nX2ZsYWcsICBBUk1fMlVQLCAgICAgIGRvX2xzdGN9LAotICB7Im1jciIsICAgMHgwZTAwMDAxMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jb19yZWd9LAotICB7Im1yYyIsICAgMHgwZTEwMDAxMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jb19yZWd9LAotfTsKLQotLyogRGVmaW5lcyBmb3IgdmFyaW91cyBiaXRzIHRoYXQgd2Ugd2lsbCB3YW50IHRvIHRvZ2dsZS4gICovCi0jZGVmaW5lIElOU1RfSU1NRURJQVRFCTB4MDIwMDAwMDAKLSNkZWZpbmUgT0ZGU0VUX1JFRwkweDAyMDAwMDAwCi0jZGVmaW5lIEhXT0ZGU0VUX0lNTSAgICAweDAwNDAwMDAwCi0jZGVmaW5lIFNISUZUX0JZX1JFRwkweDAwMDAwMDEwCi0jZGVmaW5lIFBSRV9JTkRFWAkweDAxMDAwMDAwCi0jZGVmaW5lIElOREVYX1VQCTB4MDA4MDAwMDAKLSNkZWZpbmUgV1JJVEVfQkFDSwkweDAwMjAwMDAwCi0jZGVmaW5lIExETV9UWVBFXzJfT1JfMwkweDAwNDAwMDAwCi0KLSNkZWZpbmUgTElURVJBTF9NQVNLCTB4ZjAwMGYwMDAKLSNkZWZpbmUgQ09ORF9NQVNLCTB4ZjAwMDAwMDAKLSNkZWZpbmUgT1BDT0RFX01BU0sJMHhmZTFmZmZmZgotI2RlZmluZSBEQVRBX09QX1NISUZUCTIxCi0KLS8qIENvZGVzIHRvIGRpc3Rpbmd1aXNoIHRoZSBhcml0aG1ldGljIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIE9QQ09ERV9BTkQJMAotI2RlZmluZSBPUENPREVfRU9SCTEKLSNkZWZpbmUgT1BDT0RFX1NVQgkyCi0jZGVmaW5lIE9QQ09ERV9SU0IJMwotI2RlZmluZSBPUENPREVfQURECTQKLSNkZWZpbmUgT1BDT0RFX0FEQwk1Ci0jZGVmaW5lIE9QQ09ERV9TQkMJNgotI2RlZmluZSBPUENPREVfUlNDCTcKLSNkZWZpbmUgT1BDT0RFX1RTVAk4Ci0jZGVmaW5lIE9QQ09ERV9URVEJOQotI2RlZmluZSBPUENPREVfQ01QCTEwCi0jZGVmaW5lIE9QQ09ERV9DTU4JMTEKLSNkZWZpbmUgT1BDT0RFX09SUgkxMgotI2RlZmluZSBPUENPREVfTU9WCTEzCi0jZGVmaW5lIE9QQ09ERV9CSUMJMTQKLSNkZWZpbmUgT1BDT0RFX01WTgkxNQotCi1zdGF0aWMgdm9pZCBkb190X25vcAkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FyaXQJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9hZGQJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9hc3IJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9icmFuY2g5CVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9icmFuY2gxMglQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfYnJhbmNoMjMJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2J4CQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfY29tcGFyZQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfbGRtc3RtCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfbGRyCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfbGRyYgkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xkcmgJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9sZHMJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9sc2wJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9sc3IJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9tb3YJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9wdXNoX3BvcAlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3RyCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3RyYgkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X3N0cmgJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9zdWIJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9zd2kJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9hZHIJCVBBUkFNUyAoKGNoYXIgKikpOwotCi0jZGVmaW5lIFRfT1BDT0RFX01VTCAweDQzNDAKLSNkZWZpbmUgVF9PUENPREVfVFNUIDB4NDIwMAotI2RlZmluZSBUX09QQ09ERV9DTU4gMHg0MmMwCi0jZGVmaW5lIFRfT1BDT0RFX05FRyAweDQyNDAKLSNkZWZpbmUgVF9PUENPREVfTVZOIDB4NDNjMAotCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9SMwkweDE4MDAKLSNkZWZpbmUgVF9PUENPREVfU1VCX1IzIDB4MWEwMAotI2RlZmluZSBUX09QQ09ERV9BRERfSEkgMHg0NDAwCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9TVCAweGIwMDAKLSNkZWZpbmUgVF9PUENPREVfU1VCX1NUIDB4YjA4MAotI2RlZmluZSBUX09QQ09ERV9BRERfU1AgMHhhODAwCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9QQyAweGEwMDAKLSNkZWZpbmUgVF9PUENPREVfQUREX0k4IDB4MzAwMAotI2RlZmluZSBUX09QQ09ERV9TVUJfSTggMHgzODAwCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9JMyAweDFjMDAKLSNkZWZpbmUgVF9PUENPREVfU1VCX0kzIDB4MWUwMAotCi0jZGVmaW5lIFRfT1BDT0RFX0FTUl9SCTB4NDEwMAotI2RlZmluZSBUX09QQ09ERV9MU0xfUgkweDQwODAKLSNkZWZpbmUgVF9PUENPREVfTFNSX1IgIDB4NDBjMAotI2RlZmluZSBUX09QQ09ERV9BU1JfSQkweDEwMDAKLSNkZWZpbmUgVF9PUENPREVfTFNMX0kJMHgwMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xTUl9JCTB4MDgwMAotCi0jZGVmaW5lIFRfT1BDT0RFX01PVl9JOAkweDIwMDAKLSNkZWZpbmUgVF9PUENPREVfQ01QX0k4IDB4MjgwMAotI2RlZmluZSBUX09QQ09ERV9DTVBfTFIgMHg0MjgwCi0jZGVmaW5lIFRfT1BDT0RFX01PVl9IUiAweDQ2MDAKLSNkZWZpbmUgVF9PUENPREVfQ01QX0hSIDB4NDUwMAotCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9QQyAweDQ4MDAKLSNkZWZpbmUgVF9PUENPREVfTERSX1NQIDB4OTgwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfU1AgMHg5MDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9JVyAweDY4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX0lXIDB4NjAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfSUggMHg4ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9JSCAweDgwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX0lCIDB4NzgwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfSUIgMHg3MDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9SVyAweDU4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1JXIDB4NTAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfUkggMHg1YTAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9SSCAweDUyMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX1JCIDB4NWMwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfUkIgMHg1NDAwCi0KLSNkZWZpbmUgVF9PUENPREVfUFVTSAkweGI0MDAKLSNkZWZpbmUgVF9PUENPREVfUE9QCTB4YmMwMAotCi0jZGVmaW5lIFRfT1BDT0RFX0JSQU5DSCAweGU3ZmUKLQotc3RhdGljIGludCB0aHVtYl9yZWcJCVBBUkFNUyAoKGNoYXIgKiogc3RyLCBpbnQgaGlfbG8pKTsKLQotI2RlZmluZSBUSFVNQl9TSVpFCTIJLyogU2l6ZSBvZiB0aHVtYiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFRIVU1CX1JFR19MTwkweDEKLSNkZWZpbmUgVEhVTUJfUkVHX0hJCTB4MgotI2RlZmluZSBUSFVNQl9SRUdfQU5ZCTB4MwotCi0jZGVmaW5lIFRIVU1CX0gxCTB4MDA4MAotI2RlZmluZSBUSFVNQl9IMgkweDAwNDAKLQotI2RlZmluZSBUSFVNQl9BU1IgMAotI2RlZmluZSBUSFVNQl9MU0wgMQotI2RlZmluZSBUSFVNQl9MU1IgMgotCi0jZGVmaW5lIFRIVU1CX01PVkUgMAotI2RlZmluZSBUSFVNQl9DT01QQVJFIDEKLQotI2RlZmluZSBUSFVNQl9MT0FEIDAKLSNkZWZpbmUgVEhVTUJfU1RPUkUgMQotCi0jZGVmaW5lIFRIVU1CX1BQX1BDX0xSIDB4MDEwMAotCi0vKiBUaGVzZSB0aHJlZSBhcmUgdXNlZCBmb3IgaW1tZWRpYXRlIHNoaWZ0cywgZG8gbm90IGFsdGVyLiAgKi8KLSNkZWZpbmUgVEhVTUJfV09SRCAyCi0jZGVmaW5lIFRIVU1CX0hBTEZXT1JEIDEKLSNkZWZpbmUgVEhVTUJfQllURSAwCi0KLXN0cnVjdCB0aHVtYl9vcGNvZGUgCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7CS8qIEJhc2ljIHN0cmluZyB0byBtYXRjaCAqLwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwkJLyogQmFzaWMgaW5zdHJ1Y3Rpb24gY29kZSAqLwotICBpbnQgICAgICAgICAgIHNpemU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmFyaWFudHM7ICAgIC8qIFdoaWNoIENQVSB2YXJpYW50cyB0aGlzIGV4aXN0cyBmb3IgKi8KLSAgdm9pZCAoKiAgICAgICBwYXJtcykgUEFSQU1TICgoY2hhciAqKSk7ICAvKiBGdW5jdGlvbiB0byBjYWxsIHRvIHBhcnNlIGFyZ3MgKi8KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgdGh1bWJfb3Bjb2RlIHRpbnNuc1tdID0KLXsKLSAgeyJhZGMiLAkweDQxNDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsiYWRkIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FkZH0sCi0gIHsiYW5kIiwJMHg0MDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7ImFzciIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9hc3J9LAotICB7ImIiLAkJVF9PUENPREVfQlJBTkNILCAyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoMTJ9LAotICB7ImJlcSIsCTB4ZDBmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJibmUiLAkweGQxZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmNzIiwJMHhkMmZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJocyIsCTB4ZDJmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJiY2MiLAkweGQzZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYnVsIiwJMHhkM2ZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJsbyIsCTB4ZDNmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJibWkiLAkweGQ0ZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYnBsIiwJMHhkNWZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJ2cyIsCTB4ZDZmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJidmMiLAkweGQ3ZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmhpIiwJMHhkOGZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJscyIsCTB4ZDlmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJiZ2UiLAkweGRhZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmx0IiwJMHhkYmZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJndCIsCTB4ZGNmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJibGUiLAkweGRkZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmFsIiwJMHhkZWZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJpYyIsCTB4NDM4MCwJCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgeyJibCIsCTB4ZjdmZmZmZmUsCTQsCUFSTV9USFVNQiwgZG9fdF9icmFuY2gyM30sCi0gIHsiYngiLAkweDQ3MDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnh9LAotICB7ImNtbiIsCVRfT1BDT0RFX0NNTiwJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7ImNtcCIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9jb21wYXJlfSwKLSAgeyJlb3IiLAkweDQwNDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsibGRtaWEiLAkweGM4MDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRtc3RtfSwKLSAgeyJsZHIiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRyfSwKLSAgeyJsZHJiIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xkcmJ9LAotICB7ImxkcmgiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRyaH0sCi0gIHsibGRyc2IiLAkweDU2MDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRzfSwKLSAgeyJsZHJzaCIsCTB4NWUwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9sZHN9LAotICB7Imxkc2IiLAkweDU2MDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRzfSwKLSAgeyJsZHNoIiwJMHg1ZTAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xkc30sCi0gIHsibHNsIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xzbH0sCi0gIHsibHNyIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xzcn0sCi0gIHsibW92IiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X21vdn0sCi0gIHsibXVsIiwJVF9PUENPREVfTVVMLAkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsibXZuIiwJVF9PUENPREVfTVZOLAkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsibmVnIiwJVF9PUENPREVfTkVHLAkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsib3JyIiwJMHg0MzAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7InBvcCIsCTB4YmMwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9wdXNoX3BvcH0sCi0gIHsicHVzaCIsCTB4YjQwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9wdXNoX3BvcH0sCi0gIHsicm9yIiwJMHg0MWMwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7InNiYyIsCTB4NDE4MCwJCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgeyJzdG1pYSIsCTB4YzAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9sZG1zdG19LAotICB7InN0ciIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9zdHJ9LAotICB7InN0cmIiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3Rfc3RyYn0sCi0gIHsic3RyaCIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9zdHJofSwKLSAgeyJzd2kiLAkweGRmMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3Rfc3dpfSwKLSAgeyJzdWIiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3Rfc3VifSwKLSAgeyJ0c3QiLAlUX09QQ09ERV9UU1QsCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgLyogUHNldWRvIG9wczogKi8KLSAgeyJhZHIiLCAgICAgICAweDAwMDAsICAgICAgICAgMiwgICAgICBBUk1fVEhVTUIsIGRvX3RfYWRyfSwKLSAgeyJub3AiLCAgICAgICAweDQ2QzAsICAgICAgICAgMiwgICAgICBBUk1fVEhVTUIsIGRvX3Rfbm9wfSwgICAgICAvKiBtb3YgcjgscjggKi8KLX07Ci0KLXN0cnVjdCByZWdfZW50cnkKLXsKLSAgQ09OU1QgY2hhciAqIG5hbWU7Ci0gIGludCAgICAgICAgICBudW1iZXI7Ci19OwotCi0jZGVmaW5lIGludF9yZWdpc3RlcihyZWcpICgocmVnKSA+PSAwICYmIChyZWcpIDw9IDE1KQotI2RlZmluZSBjcF9yZWdpc3RlcihyZWcpICgocmVnKSA+PSAzMiAmJiAocmVnKSA8PSA0NykKLSNkZWZpbmUgZnBfcmVnaXN0ZXIocmVnKSAoKHJlZykgPj0gMTYgJiYgKHJlZykgPD0gMjMpCi0KLSNkZWZpbmUgUkVHX1BDCTE1Ci0jZGVmaW5lIFJFR19MUiAgMTQKLSNkZWZpbmUgUkVHX1NQICAxMwotCi0vKiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIG5hbWVzLiAgVXNlcnMgY2FuIGFkZCBhbGlhc2VzIHdpdGggLnJlcSAgKi8KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgcmVnX2VudHJ5IHJlZ190YWJsZVtdID0KLXsKLSAgLyogUHJvY2Vzc29yIFJlZ2lzdGVyIE51bWJlcnMuICAqLwotICB7InIwIiwgMH0sICAgIHsicjEiLCAxfSwgICAgICB7InIyIiwgMn0sICAgICAgeyJyMyIsIDN9LAotICB7InI0IiwgNH0sICAgIHsicjUiLCA1fSwgICAgICB7InI2IiwgNn0sICAgICAgeyJyNyIsIDd9LAotICB7InI4IiwgOH0sICAgIHsicjkiLCA5fSwgICAgICB7InIxMCIsIDEwfSwgICAgeyJyMTEiLCAxMX0sCi0gIHsicjEyIiwgMTJ9LCAgeyJyMTMiLCBSRUdfU1B9LHsicjE0IiwgUkVHX0xSfSx7InIxNSIsIFJFR19QQ30sCi0gIC8qIEFQQ1MgY29udmVudGlvbnMuICAqLwotICB7ImExIiwgMH0sCXsiYTIiLCAxfSwgICAgeyJhMyIsIDJ9LCAgICAgeyJhNCIsIDN9LAotICB7InYxIiwgNH0sCXsidjIiLCA1fSwgICAgeyJ2MyIsIDZ9LCAgICAgeyJ2NCIsIDd9LCAgICAgeyJ2NSIsIDh9LAotICB7InY2IiwgOX0sCXsic2IiLCA5fSwgICAgeyJ2NyIsIDEwfSwgICAgeyJzbCIsIDEwfSwKLSAgeyJmcCIsIDExfSwJeyJpcCIsIDEyfSwgICB7InNwIiwgUkVHX1NQfSx7ImxyIiwgUkVHX0xSfSx7InBjIiwgUkVHX1BDfSwKLSAgLyogQVRQQ1MgYWRkaXRpb25zIHRvIEFQQ1MgY29udmVudGlvbnMuICAqLwotICB7IndyIiwgN30sICAgIHsidjgiLCAxMX0sCi0gIC8qIEZQIFJlZ2lzdGVycy4gICovCi0gIHsiZjAiLCAxNn0sICAgeyJmMSIsIDE3fSwgICB7ImYyIiwgMTh9LCAgIHsiZjMiLCAxOX0sCi0gIHsiZjQiLCAyMH0sICAgeyJmNSIsIDIxfSwgICB7ImY2IiwgMjJ9LCAgIHsiZjciLCAyM30sCi0gIHsiYzAiLCAzMn0sICAgeyJjMSIsIDMzfSwgICB7ImMyIiwgMzR9LCAgIHsiYzMiLCAzNX0sCi0gIHsiYzQiLCAzNn0sICAgeyJjNSIsIDM3fSwgICB7ImM2IiwgMzh9LCAgIHsiYzciLCAzOX0sCi0gIHsiYzgiLCA0MH0sICAgeyJjOSIsIDQxfSwgICB7ImMxMCIsIDQyfSwgIHsiYzExIiwgNDN9LAotICB7ImMxMiIsIDQ0fSwgIHsiYzEzIiwgNDV9LCAgeyJjMTQiLCA0Nn0sICB7ImMxNSIsIDQ3fSwKLSAgeyJjcjAiLCAzMn0sICB7ImNyMSIsIDMzfSwgIHsiY3IyIiwgMzR9LCAgeyJjcjMiLCAzNX0sCi0gIHsiY3I0IiwgMzZ9LCAgeyJjcjUiLCAzN30sICB7ImNyNiIsIDM4fSwgIHsiY3I3IiwgMzl9LAotICB7ImNyOCIsIDQwfSwgIHsiY3I5IiwgNDF9LCAgeyJjcjEwIiwgNDJ9LCB7ImNyMTEiLCA0M30sCi0gIHsiY3IxMiIsIDQ0fSwgeyJjcjEzIiwgNDV9LCB7ImNyMTQiLCA0Nn0sIHsiY3IxNSIsIDQ3fSwKLSAgLyogQVRQQ1MgYWRkaXRpb25zIHRvIGZsb2F0IHJlZ2lzdGVyIG5hbWVzLiAgKi8KLSAgeyJzMCIsMTZ9LAl7InMxIiwxN30sCXsiczIiLDE4fSwJeyJzMyIsMTl9LAotICB7InM0IiwyMH0sCXsiczUiLDIxfSwJeyJzNiIsMjJ9LAl7InM3IiwyM30sCi0gIHsiZDAiLDE2fSwJeyJkMSIsMTd9LAl7ImQyIiwxOH0sCXsiZDMiLDE5fSwKLSAgeyJkNCIsMjB9LAl7ImQ1IiwyMX0sCXsiZDYiLDIyfSwJeyJkNyIsMjN9LAotICAvKiBGSVhNRTogQXQgc29tZSBwb2ludCB3ZSBuZWVkIHRvIGFkZCBWRlAgcmVnaXN0ZXIgbmFtZXMuICAqLwotICAvKiBBcnJheSB0ZXJtaW5hdG9yLiAgKi8KLSAge05VTEwsIDB9Ci19OwotCi0jZGVmaW5lIEJBRF9BUkdTIAlfKCJCYWQgYXJndW1lbnRzIHRvIGluc3RydWN0aW9uIikKLSNkZWZpbmUgQkFEX1BDIAkJXygicjE1IG5vdCBhbGxvd2VkIGhlcmUiKQotI2RlZmluZSBCQURfRkxBR1MgCV8oIkluc3RydWN0aW9uIHNob3VsZCBub3QgaGF2ZSBmbGFncyIpCi0jZGVmaW5lIEJBRF9DT05EIAlfKCJJbnN0cnVjdGlvbiBpcyBub3QgY29uZGl0aW9uYWwiKQotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9vcHNfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX3RvcHNfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX2NvbmRfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX3NoaWZ0X2hzaCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9yZWdfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX3Bzcl9oc2ggPSBOVUxMOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZCBzX3JlcSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2JzcyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZXZlbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbHRvcmcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FybSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfdGh1bWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NvZGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2ZvcmNlX3RodW1iIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc190aHVtYl9mdW5jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc190aHVtYl9zZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBhcm1fc190ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYXJtX3NfZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZCBhcm1fc19zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hcm1fZWxmX2NvbnMgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotc3RhdGljIGludCBteV9nZXRfZXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqLCBjaGFyICoqKSk7Ci0KLUNPTlNUIHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgInJlcSIsICAgICAgICAgc19yZXEsICAgICAgICAgMCB9LAkvKiBOZXZlciBjYWxsZWQgYmVjYXN1ZSAnLnJlcScgZG9lcyBub3Qgc3RhcnQgbGluZSAqLwotICB7ICJic3MiLCAgICAgICAgIHNfYnNzLCAgICAgICAgIDAgfSwKLSAgeyAiYWxpZ24iLCAgICAgICBzX2FsaWduLCAgICAgICAwIH0sCi0gIHsgImFybSIsICAgICAgICAgc19hcm0sICAgICAgICAgMCB9LAotICB7ICJ0aHVtYiIsICAgICAgIHNfdGh1bWIsICAgICAgIDAgfSwKLSAgeyAiY29kZSIsICAgICAgICBzX2NvZGUsICAgICAgICAwIH0sCi0gIHsgImZvcmNlX3RodW1iIiwgc19mb3JjZV90aHVtYiwgMCB9LAotICB7ICJ0aHVtYl9mdW5jIiwgIHNfdGh1bWJfZnVuYywgIDAgfSwKLSAgeyAidGh1bWJfc2V0IiwgICBzX3RodW1iX3NldCwgICAwIH0sCi0gIHsgImV2ZW4iLCAgICAgICAgc19ldmVuLCAgICAgICAgMCB9LAotICB7ICJsdG9yZyIsICAgICAgIHNfbHRvcmcsICAgICAgIDAgfSwKLSAgeyAicG9vbCIsICAgICAgICBzX2x0b3JnLCAgICAgICAwIH0sCi0gIC8qIEFsbG93IGZvciB0aGUgZWZmZWN0IG9mIHNlY3Rpb24gY2hhbmdlcy4gICovCi0gIHsgInRleHQiLCAgICAgICAgYXJtX3NfdGV4dCwgICAgMCB9LAotICB7ICJkYXRhIiwgICAgICAgIGFybV9zX2RhdGEsICAgIDAgfSwKLSNpZmRlZiBPQkpfRUxGICAKLSAgeyAic2VjdGlvbiIsICAgICBhcm1fc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3Rpb24ucyIsICAgYXJtX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0IiwgICAgICAgIGFybV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdC5zIiwgICAgICBhcm1fc19zZWN0aW9uLCAwIH0sCi0gIHsgIndvcmQiLCAgICAgICAgc19hcm1fZWxmX2NvbnMsIDQgfSwKLSAgeyAibG9uZyIsICAgICAgICBzX2FybV9lbGZfY29ucywgNCB9LAotI2Vsc2UKLSAgeyAid29yZCIsICAgICAgICBjb25zLCA0fSwKLSNlbmRpZgotICB7ICJleHRlbmQiLCAgICAgIGZsb2F0X2NvbnMsICd4JyB9LAotICB7ICJsZG91YmxlIiwgICAgIGZsb2F0X2NvbnMsICd4JyB9LAotICB7ICJwYWNrZWQiLCAgICAgIGZsb2F0X2NvbnMsICdwJyB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotLyogU3R1ZmYgbmVlZGVkIHRvIHJlc29sdmUgdGhlIGxhYmVsIGFtYmlndWl0eQotICAgQXM6Ci0gICAgIC4uLgotICAgICBsYWJlbDogICA8aW5zbj4KLSAgIG1heSBkaWZmZXIgZnJvbToKLSAgICAgLi4uCi0gICAgIGxhYmVsOgotICAgICAgICAgICAgICA8aW5zbj4KLSovCi0KLXN5bWJvbFMgKiAgbGFzdF9sYWJlbF9zZWVuOwotc3RhdGljIGludCBsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lID0gZmFsc2U7Ci0KLS8qIExpdGVyYWwgc3R1ZmYgKi8KLQotI2RlZmluZSBNQVhfTElURVJBTF9QT09MX1NJWkUgMTAyNAotCi10eXBlZGVmIHN0cnVjdCBsaXRlcmFsUwotewotICBzdHJ1Y3QgZXhwcmVzc2lvblMgIGV4cDsKLSAgc3RydWN0IGFybV9pdCAqICAgICBpbnN0OwotfSBsaXRlcmFsVDsKLQotbGl0ZXJhbFQgIGxpdGVyYWxzW01BWF9MSVRFUkFMX1BPT0xfU0laRV07Ci1pbnQgICAgICAgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UgPSAwOyAvKiBOZXh0IGZyZWUgZW50cnkgaW4gdGhlIHBvb2wgKi8KLWludCAgICAgICBsaXRfcG9vbF9udW0gPSAxOyAvKiBOZXh0IGxpdGVyYWwgcG9vbCBudW1iZXIgKi8KLXN5bWJvbFMgKiBjdXJyZW50X3Bvb2xQID0gTlVMTDsKLQotc3RhdGljIGludAotYWRkX3RvX2xpdF9wb29sICgpCi17Ci0gIGludCBsaXRfY291bnQgPSAwOwotCi0gIGlmIChjdXJyZW50X3Bvb2xQID09IE5VTEwpCi0gICAgY3VycmVudF9wb29sUCA9IHN5bWJvbF9jcmVhdGUgKEZBS0VfTEFCRUxfTkFNRSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJICAgKHZhbHVlVCkgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICAvKiBDaGVjayBpZiB0aGlzIGxpdGVyYWwgdmFsdWUgaXMgYWxyZWFkeSBpbiB0aGUgcG9vbDogICovCi0gIHdoaWxlIChsaXRfY291bnQgPCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkKLSAgICB7Ci0gICAgICBpZiAobGl0ZXJhbHNbbGl0X2NvdW50XS5leHAuWF9vcCA9PSBpbnN0LnJlbG9jLmV4cC5YX29wCi0gICAgICAgICAgJiYgaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0gICAgICAgICAgJiYgbGl0ZXJhbHNbbGl0X2NvdW50XS5leHAuWF9hZGRfbnVtYmVyCi0JICAgICA9PSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIKLSAgICAgICAgICAmJiBsaXRlcmFsc1tsaXRfY291bnRdLmV4cC5YX3Vuc2lnbmVkID09IGluc3QucmVsb2MuZXhwLlhfdW5zaWduZWQpCi0gICAgICAgIGJyZWFrOwotICAgICAgbGl0X2NvdW50Kys7Ci0gICAgfQotCi0gIGlmIChsaXRfY291bnQgPT0gbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UpIC8qIG5ldyBlbnRyeSAqLwotICAgIHsKLSAgICAgIGlmIChuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA+IE1BWF9MSVRFUkFMX1BPT0xfU0laRSkKLSAgICAgICAgewotICAgICAgICAgIGluc3QuZXJyb3IgPSBfKCJMaXRlcmFsIFBvb2wgT3ZlcmZsb3ciKTsKLSAgICAgICAgICByZXR1cm4gRkFJTDsKLSAgICAgICAgfQotCi0gICAgICBsaXRlcmFsc1tuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZV0uZXhwID0gaW5zdC5yZWxvYy5leHA7Ci0gICAgICBsaXRfY291bnQgPSBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSsrOwotICAgIH0KLQotICBpbnN0LnJlbG9jLmV4cC5YX29wID0gT19zeW1ib2w7Ci0gIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciA9IChsaXRfY291bnQpICogNCAtIDg7Ci0gIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCA9IGN1cnJlbnRfcG9vbFA7Ci0KLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0gCi0vKiBDYW4ndCB1c2Ugc3ltYm9sX25ldyBoZXJlLCBzbyBoYXZlIHRvIGNyZWF0ZSBhIHN5bWJvbCBhbmQgdGhlbiBhdAotICAgYSBsYXRlciBkYXRlIGFzc2lnbiBpdCBhIHZhbHVlLiBUaGF0cyB3aGF0IHRoZXNlIGZ1bmN0aW9ucyBkby4gICovCi1zdGF0aWMgdm9pZAotc3ltYm9sX2xvY2F0ZSAoc3ltYm9sUCwgbmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZykKLSAgICAgc3ltYm9sUyAqICAgIHN5bWJvbFA7IAotICAgICBDT05TVCBjaGFyICogbmFtZTsJCS8qIEl0IGlzIGNvcGllZCwgdGhlIGNhbGxlciBjYW4gbW9kaWZ5ICovCi0gICAgIHNlZ1QgICAgICAgICBzZWdtZW50OwkvKiBTZWdtZW50IGlkZW50aWZpZXIgKFNFR188c29tZXRoaW5nPikgKi8KLSAgICAgdmFsdWVUICAgICAgIHZhbHU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KLSAgICAgZnJhZ1MgKiAgICAgIGZyYWc7CQkvKiBBc3NvY2lhdGVkIGZyYWdtZW50ICovCi17Ci0gIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKLSAgY2hhciAqIHByZXNlcnZlZF9jb3B5X29mX25hbWU7Ci0KLSAgbmFtZV9sZW5ndGggPSBzdHJsZW4gKG5hbWUpICsgMTsgICAgICAvKiArMSBmb3IgXDAgKi8KLSAgb2JzdGFja19ncm93ICgmbm90ZXMsIG5hbWUsIG5hbWVfbGVuZ3RoKTsKLSAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSA9IG9ic3RhY2tfZmluaXNoICgmbm90ZXMpOwotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgaWYgKHByZXNlcnZlZF9jb3B5X29mX25hbWVbMF0gPT0gJ18nKQotICAgIHByZXNlcnZlZF9jb3B5X29mX25hbWUrKzsKLSNlbmRpZgotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHByZXNlcnZlZF9jb3B5X29mX25hbWUgPQotICAgIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAocHJlc2VydmVkX2NvcHlfb2ZfbmFtZSk7Ci0jZW5kaWYKLQotICBTX1NFVF9OQU1FIChzeW1ib2xQLCBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKTsKLQotICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzZWdtZW50KTsKLSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIHZhbHUpOwotICBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyhzeW1ib2xQKTsKLQotICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWcpOwotCi0gIC8qIExpbmsgdG8gZW5kIG9mIHN5bWJvbCBjaGFpbi4gICovCi0gIHsKLSAgICBleHRlcm4gaW50IHN5bWJvbF90YWJsZV9mcm96ZW47Ci0gICAgaWYgKHN5bWJvbF90YWJsZV9mcm96ZW4pCi0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9sYXN0UCwgJiBzeW1ib2xfcm9vdFAsICYgc3ltYm9sX2xhc3RQKTsKLQotICBvYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKLQotI2lmZGVmIHRjX3N5bWJvbF9uZXdfaG9vawotICB0Y19zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotI2VuZGlmCi0gCi0jaWZkZWYgREVCVUdfU1lNUwotICB2ZXJpZnlfc3ltYm9sX2NoYWluIChzeW1ib2xfcm9vdFAsIHN5bWJvbF9sYXN0UCk7Ci0jZW5kaWYgLyogREVCVUdfU1lNUyAqLwotfQotCi0vKiBDaGVjayB0aGF0IGFuIGltbWVkaWF0ZSBpcyB2YWxpZCwgYW5kIGlmIHNvLAotICAgY29udmVydCBpdCB0byB0aGUgcmlnaHQgZm9ybWF0LiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsKQotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotewotICB1bnNpZ25lZCBpbnQgYTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotI2RlZmluZSByb3RhdGVfbGVmdCh2LCBuKSAodiA8PCBuIHwgdiA+PiAoMzIgLSBuKSkKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSAyKQotICAgIGlmICgoYSA9IHJvdGF0ZV9sZWZ0ICh2YWwsIGkpKSA8PSAweGZmKQotICAgICAgcmV0dXJuIGEgfCAoaSA8PCA3KTsgLyogMTItYml0IHBhY2s6IFtzaGlmdC1jbnQsY29uc3RdICovCi0gIAotICByZXR1cm4gRkFJTDsKLX0KLQotLyogQ2hlY2sgdG8gc2VlIGlmIGFuIGltbWVkaWF0ZSBjYW4gYmUgY29tcHV0ZWQgYXMgdHdvIHNlcGVyYXRlIGltbWVkaWF0ZQotICAgdmFsdWVzLCBhZGRlZCB0b2dldGhlci4gIFdlIGFscmVhZHkga25vdyB0aGF0IHRoaXMgdmFsdWUgY2Fubm90IGJlCi0gICBjb21wdXRlZCBieSBqdXN0IG9uZSBBUk0gaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHVuc2lnbmVkIGludAotdmFsaWRhdGVfaW1tZWRpYXRlX3R3b3BhcnQgKHZhbCwgaGlnaHBhcnQpCi0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci0gICAgIHVuc2lnbmVkIGludCAqIGhpZ2hwYXJ0OwotewotICB1bnNpZ25lZCBpbnQgYTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gMikKLSAgICBpZiAoKChhID0gcm90YXRlX2xlZnQgKHZhbCwgaSkpICYgMHhmZikgIT0gMCkKLSAgICAgIHsKLQlpZiAoYSAmIDB4ZmYwMCkKLQkgIHsKLQkgICAgaWYgKGEgJiB+IDB4ZmZmZikKLQkgICAgICBjb250aW51ZTsKLQkgICAgKiBoaWdocGFydCA9IChhICA+PiA4KSB8ICgoaSArIDI0KSA8PCA3KTsKLQkgIH0KLQllbHNlIGlmIChhICYgMHhmZjAwMDApCi0JICB7Ci0JICAgIGlmIChhICYgMHhmZjAwMDAwMCkKLQkgICAgICBjb250aW51ZTsKLQotCSAgICAqIGhpZ2hwYXJ0ID0gKGEgPj4gMTYpIHwgKChpICsgMTYpIDw8IDcpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYXNzZXJ0IChhICYgMHhmZjAwMDAwMCk7Ci0KLQkgICAgKiBoaWdocGFydCA9IChhID4+IDI0KSB8ICgoaSArIDgpIDw8IDcpOwotCSAgfQotCi0JcmV0dXJuIChhICYgMHhmZikgfCAoaSA8PCA3KTsKLSAgICAgIH0KLSAgCi0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWwsIGh3c2UpCi0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci0gICAgIGludCBod3NlOwotewotICBpZiAoKGh3c2UgJiYgdmFsID4gMjU1KSB8fCB2YWwgPiA0MDk1KQotICAgICByZXR1cm4gRkFJTDsKLSAgcmV0dXJuIHZhbDsKLX0KLQotICAgIAotc3RhdGljIHZvaWQKLXNfcmVxIChhKQotICAgICBpbnQgYSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhc19iYWQgKF8oIkludmFsaWQgc3ludGF4IGZvciAucmVxIGRpcmVjdGl2ZS4iKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFdlIGRvbid0IHN1cHBvcnQgcHV0dGluZyBmcmFncyBpbiB0aGUgQlNTIHNlZ21lbnQsIHdlIGZha2UgaXQgYnkKLSAgICAgbWFya2luZyBpbl9ic3MsIHRoZW4gbG9va2luZyBhdCBzX3NraXAgZm9yIGNsdWVzPy4uICovCi0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZXZlbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmICghbmVlZF9wYXNzXzIpCQkvKiBOZXZlciBtYWtlIGZyYWcgaWYgZXhwZWN0IGV4dHJhIHBhc3MuICovCi0gICAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0gIAotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2x0b3JnIChpZ25vcmVkKQotICAgICBpbnQgaWdub3JlZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgbGl0X2NvdW50ID0gMDsKLSAgY2hhciBzeW1fbmFtZVsyMF07Ci0KLSAgaWYgKGN1cnJlbnRfcG9vbFAgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogQWxpZ24gcG9vbCBhcyB5b3UgaGF2ZSB3b3JkIGFjY2Vzc2VzICovCi0gIC8qIE9ubHkgbWFrZSBhIGZyYWcgaWYgd2UgaGF2ZSB0byAuLi4gKi8KLSAgaWYgKCFuZWVkX3Bhc3NfMikKLSAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAyKTsKLQotICBzcHJpbnRmIChzeW1fbmFtZSwgIiQkbGl0X1wwMDIleCIsIGxpdF9wb29sX251bSsrKTsKLQotICBzeW1ib2xfbG9jYXRlIChjdXJyZW50X3Bvb2xQLCBzeW1fbmFtZSwgbm93X3NlZywKLQkJICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwgZnJhZ19ub3cpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChjdXJyZW50X3Bvb2xQKTsKLQotICBBUk1fU0VUX1RIVU1CIChjdXJyZW50X3Bvb2xQLCB0aHVtYl9tb2RlKTsKLSAgCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLSAgQVJNX1NFVF9JTlRFUldPUksgKGN1cnJlbnRfcG9vbFAsIHN1cHBvcnRfaW50ZXJ3b3JrKTsKLSNlbmRpZgotICAKLSAgd2hpbGUgKGxpdF9jb3VudCA8IG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlKQotICAgIC8qIEZpcnN0IG91dHB1dCB0aGUgZXhwcmVzc2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHBvb2wuICAqLwotICAgIGVtaXRfZXhwciAoJihsaXRlcmFsc1tsaXRfY291bnQrK10uZXhwKSwgNCk7IC8qIC53b3JkICovCi0KLSAgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UgPSAwOwotICBjdXJyZW50X3Bvb2xQID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxpZ24gKHVudXNlZCkJLyogU2FtZSBhcyBzX2FsaWduX3B0d28gYnV0IGFsaWduIDAgPT4gYWxpZ24gMiAqLwotICAgICBpbnQgdW51c2VkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLSAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAodGVtcCA+IG1heF9hbGlnbm1lbnQpCi0gICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iKSwgdGVtcCA9IG1heF9hbGlnbm1lbnQpOwotICBlbHNlIGlmICh0ZW1wIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkFsaWdubWVudCBuZWdhdGl2ZS4gMCBhc3N1bWVkLiIpKTsKLSAgICAgIHRlbXAgPSAwOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wX2ZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZW1wX2ZpbGwgPSAwOwotCi0gIGlmICghdGVtcCkKLSAgICB0ZW1wID0gMjsKLQotICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIEhBVkUgdG8uIC4gLiAqLwotICBpZiAodGVtcCAmJiAhbmVlZF9wYXNzXzIpCi0gICAgZnJhZ19hbGlnbiAodGVtcCwgKGludCkgdGVtcF9maWxsLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCB0ZW1wKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZm9yY2VfdGh1bWIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBJZiB3ZSBhcmUgbm90IGFscmVhZHkgaW4gdGh1bWIgbW9kZSBnbyBpbnRvIGl0LCBFVkVOIGlmCi0gICAgIHRoZSB0YXJnZXQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGh1bWIgaW5zdHJ1Y3Rpb25zLgotICAgICBUaGlzIGlzIHVzZWQgYnkgZ2NjL2NvbmZpZy9hcm0vbGliMWZ1bmNzLmFzbSBmb3IgZXhhbXBsZQotICAgICB0byBjb21waWxlIGludGVyd29ya2luZyBzdXBwb3J0IGZ1bmN0aW9ucyBldmVuIGlmIHRoZQotICAgICB0YXJnZXQgcHJvY2Vzc29yIHNob3VsZCBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcuICAqLwotICAgICAKLSAgaWYgKCEgdGh1bWJfbW9kZSkKLSAgICB7Ci0gICAgICB0aHVtYl9tb2RlID0gMjsKLSAgICAgIAotICAgICAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Ci0gICAgfQotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfdGh1bWJfZnVuYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFRoZSBmb2xsb3dpbmcgbGFiZWwgaXMgdGhlIG5hbWUvYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgYSBUaHVtYiBmdW5jdGlvbi4KLSAgICAgV2UgbmVlZCB0byBrbm93IHRoaXMgZm9yIHRoZSBpbnRlcndvcmtpbmcgc3VwcG9ydC4gICovCi0KLSAgbGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSA9IHRydWU7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQZXJmb3JtIGEgLnNldCBkaXJlY3RpdmUsIGJ1dCBhbHNvIG1hcmsgdGhlIGFsaWFzIGFzCi0gICBiZWluZyBhIHRodW1iIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfdGh1bWJfc2V0IChlcXVpdikKLSAgICAgaW50IGVxdWl2OwotewotICAvKiBYWFggdGhlIGZvbGxvd2luZyBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgY29kZSBmb3Igc19zZXQoKSBpbiByZWFkLmMKLSAgICAgV2UgY2Fubm90IGp1c3QgY2FsbCB0aGF0IGNvZGUgYXMgd2UgbmVlZCB0byBnZXQgYXQgdGhlIHN5bWJvbCB0aGF0Ci0gICAgIGlzIGNyZWF0ZWQuICAqLwotICByZWdpc3RlciBjaGFyICogICAgbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciAgICAgIGRlbGltOwotICByZWdpc3RlciBjaGFyICogICAgZW5kX25hbWU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKiBzeW1ib2xQOwotCi0gIC8qCi0gICAqIEVzcGVjaWFsIGFwb2xvZ2llcyBmb3IgdGhlIHJhbmRvbSBsb2dpYzoKLSAgICogdGhpcyBqdXN0IGdyZXcsIGFuZCBjb3VsZCBiZSBwYXJzZWQgbXVjaCBtb3JlIHNpbXBseSEKLSAgICogRGVhbiBpbiBoYXN0ZS4KLSAgICovCi0gIG5hbWUgICAgICA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZGVsaW0gICAgID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVuZF9uYW1lICA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmVuZF9uYW1lID0gZGVsaW07Ci0gIAotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICplbmRfbmFtZSA9IDA7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgKmVuZF9uYW1lID0gZGVsaW07Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgKmVuZF9uYW1lID0gMDsKLQotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFhYWCAtIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdG8gLnRodW1iX3NldCAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSkpID09IE5VTEwKLSAgICAgICYmIChzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkpID09IE5VTEwpCi0gICAgewotI2lmbmRlZiBOT19MSVNUSU5HCi0gICAgICAvKiBXaGVuIGRvaW5nIHN5bWJvbCBsaXN0aW5ncywgcGxheSBnYW1lcyB3aXRoIGR1bW15IGZyYWdtZW50cyBsaXZpbmcKLQkgb3V0c2lkZSB0aGUgbm9ybWFsIGZyYWdtZW50IGNoYWluIHRvIHJlY29yZCB0aGUgZmlsZSBhbmQgbGluZSBpbmZvCi0gICAgICAgICBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX1NZTUJPTFMpCi0JewotCSAgZXh0ZXJuIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogbGlzdGluZ190YWlsOwotCSAgZnJhZ1MgKiBkdW1teV9mcmFnID0gKGZyYWdTICopIHhtYWxsb2MgKHNpemVvZihmcmFnUykpOwotCSAgbWVtc2V0IChkdW1teV9mcmFnLCAwLCBzaXplb2YoZnJhZ1MpKTsKLQkgIGR1bW15X2ZyYWctPmZyX3R5cGUgPSByc19maWxsOwotCSAgZHVtbXlfZnJhZy0+bGluZSA9IGxpc3RpbmdfdGFpbDsKLQkgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgZHVtbXlfZnJhZyk7Ci0JICBkdW1teV9mcmFnLT5mcl9zeW1ib2wgPSBzeW1ib2xQOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JCQkgICAgCi0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIC8qICJzZXQiIHN5bWJvbHMgYXJlIGxvY2FsIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiAqLwotICAgICAgU0ZfU0VUX0xPQ0FMIChzeW1ib2xQKTsKLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotICAgIH0JCQkJLyogbWFrZSBhIG5ldyBzeW1ib2wgKi8KLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLQotICAqIGVuZF9uYW1lID0gZGVsaW07Ci0KLSAgaWYgKGVxdWl2Ci0gICAgICAmJiBTX0lTX0RFRklORUQgKHN5bWJvbFApCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSAhPSByZWdfc2VjdGlvbikKLSAgICBhc19iYWQgKF8oInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgcHNldWRvX3NldCAoc3ltYm9sUCk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIC8qIFhYWCBOb3cgd2UgY29tZSB0byB0aGUgVGh1bWIgc3BlY2lmaWMgYml0IG9mIGNvZGUuICAqLwotICAKLSAgVEhVTUJfU0VUX0ZVTkMgKHN5bWJvbFAsIDEpOwotICBBUk1fU0VUX1RIVU1CIChzeW1ib2xQLCAxKTsKLSNpZiBkZWZpbmVkIE9CSl9FTEYgfHwgZGVmaW5lZCBPQkpfQ09GRgotICBBUk1fU0VUX0lOVEVSV09SSyAoc3ltYm9sUCwgc3VwcG9ydF9pbnRlcndvcmspOwotI2VuZGlmCi19Ci0KLS8qIElmIHdlIGNoYW5nZSBzZWN0aW9uIHdlIG11c3QgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGZpcnN0LiAgKi8KLXN0YXRpYyB2b2lkCi1hcm1fc190ZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChub3dfc2VnICE9IHRleHRfc2VjdGlvbikKLSAgICBzX2x0b3JnICgwKTsKLSAgCi0jaWZkZWYgT0JKX0VMRgotICBvYmpfZWxmX3RleHQgKGlnbm9yZSk7Ci0jZWxzZQotICBzX3RleHQgKGlnbm9yZSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLWFybV9zX2RhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGlmIChub3dfc2VnICE9IHRleHRfc2VjdGlvbikKLQlzX2x0b3JnICgwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uKQotICAgIHNfbHRvcmcgKDApOwotICAKLSNpZmRlZiBPQkpfRUxGCi0gIG9ial9lbGZfZGF0YSAoaWdub3JlKTsKLSNlbHNlCi0gIHNfZGF0YSAoaWdub3JlKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQKLWFybV9zX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19sdG9yZyAoMCk7Ci0KLSAgb2JqX2VsZl9zZWN0aW9uIChpZ25vcmUpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1vcGNvZGVfc2VsZWN0ICh3aWR0aCkKLSAgICAgaW50IHdpZHRoOwotewotICBzd2l0Y2ggKHdpZHRoKQotICAgIHsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKCEgdGh1bWJfbW9kZSkKLQl7Ci0JICBpZiAoISAoY3B1X3ZhcmlhbnQgJiBBUk1fVEhVTUIpKQotCSAgICBhc19iYWQgKF8oInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IFRIVU1CIG9wY29kZXMiKSk7Ci0JICB0aHVtYl9tb2RlID0gMTsKLSAgICAgICAgICAvKiBObyBuZWVkIHRvIGZvcmNlIHRoZSBhbGlnbm1lbnQsIHNpbmNlIHdlIHdpbGwgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgY29taW5nIGZyb20gQVJNIG1vZGUsIHdoaWNoIGlzIHdvcmQtYWxpZ25lZC4gKi8KLSAgICAgICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAodGh1bWJfbW9kZSkKLQl7Ci0gICAgICAgICAgaWYgKChjcHVfdmFyaWFudCAmIEFSTV9BTlkpID09IEFSTV9USFVNQikKLQkgICAgYXNfYmFkIChfKCJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBBUk0gb3Bjb2RlcyIpKTsKLQkgIHRodW1iX21vZGUgPSAwOwotICAgICAgICAgIGlmICghbmVlZF9wYXNzXzIpCi0gICAgICAgICAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLSAgICAgICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgaW5zdHJ1Y3Rpb24gc2l6ZSBzZWxlY3RlZCAoJWQpIiksIHdpZHRoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FybSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIG9wY29kZV9zZWxlY3QgKDMyKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfdGh1bWIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBvcGNvZGVfc2VsZWN0ICgxNik7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NvZGUgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN3aXRjaCAodGVtcCkKLSAgICB7Ci0gICAgY2FzZSAxNjoKLSAgICBjYXNlIDMyOgotICAgICAgb3Bjb2RlX3NlbGVjdCAodGVtcCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZCB0byAuY29kZSBkaXJlY3RpdmUgKCVkKSAoZXhwZWN0aW5nIDE2IG9yIDMyKSIpLCB0ZW1wKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbmRfb2ZfbGluZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKCogc3RyICE9ICdcMCcpCi0gICAgaW5zdC5lcnJvciA9IF8oIkdhcmJhZ2UgZm9sbG93aW5nIGluc3RydWN0aW9uIik7Ci19Ci0KLXN0YXRpYyBpbnQKLXNraXBfcGFzdF9jb21tYSAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgY2hhciAqcCA9ICpzdHIsIGM7Ci0gIGludCBjb21tYSA9IDA7Ci0gICAgCi0gIHdoaWxlICgoYyA9ICpwKSA9PSAnICcgfHwgYyA9PSAnLCcpCi0gICAgewotICAgICAgcCsrOwotICAgICAgaWYgKGMgPT0gJywnICYmIGNvbW1hKyspCi0JcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGlmIChjID09ICdcMCcpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgKnN0ciA9IHA7Ci0gIHJldHVybiBjb21tYSA/IFNVQ0NFU1MgOiBGQUlMOwotfQotCi0vKiBBIHN0YW5kYXJkIHJlZ2lzdGVyIG11c3QgYmUgZ2l2ZW4gYXQgdGhpcyBwb2ludC4KLSAgIFNoaWZ0IGlzIHRoZSBwbGFjZSB0byBwdXQgaXQgaW4gaW5zdC5pbnN0cnVjdGlvbi4KLSAgIFJlc3RvcmVzIGlucHV0IHN0YXJ0IHBvaW50IG9uIGVyci4KLSAgIFJldHVybnMgdGhlIHJlZyMsIG9yIEZBSUwuICAqLwotc3RhdGljIGludAotcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgc2hpZnQpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHNoaWZ0OwotewotICBzdGF0aWMgY2hhciBidWZmIFsxMjhdOyAvKiBYWFggKi8KLSAgaW50ICAgIHJlZzsKLSAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKLQotICBpZiAoKHJlZyA9IGFybV9yZWdfcGFyc2UgKHN0cikpICE9IEZBSUwgJiYgaW50X3JlZ2lzdGVyIChyZWcpKQotICAgIHsKLSAgICAgIGlmIChzaGlmdCA+PSAwKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHNoaWZ0OwotICAgICAgcmV0dXJuIHJlZzsKLSAgICB9Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQsIHdlIG1heSBoYXZlIGdvdCBhIHJlZyBvZiB0aGUgd3JvbmcgY2xhc3MuICAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIAotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uICAqLwotICBzcHJpbnRmIChidWZmLCBfKCJSZWdpc3RlciBleHBlY3RlZCwgbm90ICclLjEwMHMnIiksIHN0YXJ0KTsKLSAgaW5zdC5lcnJvciA9IGJ1ZmY7Ci0KLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLXBzcl9yZXF1aXJlZF9oZXJlIChzdHIsIGNwc3IsIHNwc3IpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIGNwc3I7Ci0gICAgIGludCAgICAgc3BzcjsKLXsKLSAgaW50ICAgIHBzcjsKLSAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKLSAgcHNyID0gYXJtX3Bzcl9wYXJzZSAoc3RyKTsKLSAgCi0gIGlmICAocHNyID09IGNwc3IgfHwgcHNyID09IHNwc3IpCi0gICAgewotICAgICAgaWYgKHBzciA9PSBzcHNyKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gMSA8PCAyMjsKLSAgICAgIAotICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgfQotCi0gIC8qIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSAgICAgdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbi4gICovCi0gIGluc3QuZXJyb3IgPSBfKCI8cHNyKGYpPiBleHBlY3RlZCIpOwotCi0gIC8qIFJlc3RvcmUgdGhlIHN0YXJ0IHBvaW50LiAgKi8KLSAgKnN0ciA9IHN0YXJ0OwotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotY29fcHJvY19udW1iZXIgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIGludCBwcm9jZXNzb3IsIHBjaGFyOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotCi0gIC8qIFRoZSBkYXRhIHNoZWV0IHNlZW1zIHRvIGltcGx5IHRoYXQganVzdCBhIG51bWJlciBvbiBpdHMgb3duIGlzIHZhbGlkCi0gICAgIGhlcmUsIGJ1dCB0aGUgUklTQyBpWCBhc3NlbWJsZXIgc2VlbXMgdG8gYWNjZXB0IGEgcHJlZml4ICdwJy4gIFdlIHdpbGwKLSAgICAgYWNjZXB0IGVpdGhlci4gICovCi0gIGlmICgqKnN0ciA9PSAncCcgfHwgKipzdHIgPT0gJ1AnKQotICAgICgqc3RyKSsrOwotCi0gIHBjaGFyID0gKigqc3RyKSsrOwotICBpZiAocGNoYXIgPj0gJzAnICYmIHBjaGFyIDw9ICc5JykKLSAgICB7Ci0gICAgICBwcm9jZXNzb3IgPSBwY2hhciAtICcwJzsKLSAgICAgIGlmICgqKnN0ciA+PSAnMCcgJiYgKipzdHIgPD0gJzknKQotCXsKLQkgIHByb2Nlc3NvciA9IHByb2Nlc3NvciAqIDEwICsgKigqc3RyKSsrIC0gJzAnOwotCSAgaWYgKHByb2Nlc3NvciA+IDE1KQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIklsbGVnYWwgY28tcHJvY2Vzc29yIG51bWJlciIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJCYWQgb3IgbWlzc2luZyBjby1wcm9jZXNzb3IgbnVtYmVyIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBwcm9jZXNzb3IgPDwgODsKLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX29wY19leHByIChzdHIsIHdoZXJlLCBsZW5ndGgpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cHI7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlICgqIHN0cik7Ci0KLSAgbWVtc2V0ICgmZXhwciwgJ1wwJywgc2l6ZW9mIChleHByKSk7Ci0KLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmZXhwciwgc3RyKSkKLSAgICByZXR1cm4gRkFJTDsKLSAgaWYgKGV4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJiYWQgb3IgbWlzc2luZyBleHByZXNzaW9uIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaWYgKChleHByLlhfYWRkX251bWJlciAmICgoMSA8PCBsZW5ndGgpIC0gMSkpICE9IGV4cHIuWF9hZGRfbnVtYmVyKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbW1lZGlhdGUgY28tcHJvY2Vzc29yIGV4cHJlc3Npb24gdG9vIGxhcmdlIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBleHByLlhfYWRkX251bWJlciA8PCB3aGVyZTsKLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX3JlZ19yZXF1aXJlZF9oZXJlIChzdHIsIHdoZXJlKQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICB3aGVyZTsKLXsKLSAgaW50ICAgIHJlZzsKLSAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKLQotICBpZiAoKHJlZyA9IGFybV9yZWdfcGFyc2UgKHN0cikpICE9IEZBSUwgJiYgY3BfcmVnaXN0ZXIgKHJlZykpCi0gICAgewotICAgICAgcmVnICY9IDE1OwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgd2hlcmU7Ci0gICAgICByZXR1cm4gcmVnOwotICAgIH0KLQotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uICAqLwotICBpbnN0LmVycm9yID0gXygiQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGV4cGVjdGVkIik7Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQuICAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1mcF9yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCB3aGVyZSkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCAgICAgd2hlcmU7Ci17Ci0gIGludCByZWc7Ci0gIGNoYXIgKiBzdGFydCA9ICpzdHI7Ci0KLSAgaWYgKChyZWcgPSBhcm1fcmVnX3BhcnNlIChzdHIpKSAhPSBGQUlMICYmIGZwX3JlZ2lzdGVyIChyZWcpKQotICAgIHsKLSAgICAgIHJlZyAmPSA3OwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgd2hlcmU7Ci0gICAgICByZXR1cm4gcmVnOwotICAgIH0KLQotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uICAqLwotICBpbnN0LmVycm9yID0gXygiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgZXhwZWN0ZWQiKTsKLQotICAvKiBSZXN0b3JlIHRoZSBzdGFydCBwb2ludC4gICovCi0gICpzdHIgPSBzdGFydDsKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX2FkZHJlc3Nfb2Zmc2V0IChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBpbnQgb2Zmc2V0OwotCi0gIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotCi0gIGlmICghIGlzX2ltbWVkaWF0ZV9wcmVmaXggKCoqc3RyKSkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiaW1tZWRpYXRlIGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICAoKnN0cikrKzsKLSAgCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgc3RyKSkKLSAgICByZXR1cm4gRkFJTDsKLSAgCi0gIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotICAgICAgCi0gICAgICBpZiAob2Zmc2V0ICYgMykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiY28tcHJvY2Vzc29yIGFkZHJlc3MgbXVzdCBiZSB3b3JkIGFsaWduZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLQotICAgICAgaWYgKG9mZnNldCA+IDEwMjMgfHwgb2Zmc2V0IDwgLTEwMjMpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIm9mZnNldCB0b28gbGFyZ2UiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLQotICAgICAgaWYgKG9mZnNldCA+PSAwKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5ERVhfVVA7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0ID0gLW9mZnNldDsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBvZmZzZXQgPj4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU07Ci0KLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgY2hhciAqIHAgPSAqIHN0cjsKLSAgaW50ICAgIHByZV9pbmMgPSAwOwotICBpbnQgICAgd3JpdGVfYmFjayA9IDA7Ci0KLSAgaWYgKCpwID09ICdbJykKLSAgICB7Ci0gICAgICBpbnQgcmVnOwotCi0gICAgICBwKys7Ci0gICAgICBza2lwX3doaXRlc3BhY2UgKHApOwotCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHAsIDE2KSkgPT0gRkFJTCkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgc2tpcF93aGl0ZXNwYWNlIChwKTsKLQotICAgICAgaWYgKCpwID09ICddJykKLQl7Ci0JICBwKys7Ci0JICAKLQkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCYgcCkgPT0gU1VDQ0VTUykKLQkgICAgewotCSAgICAgIC8qIFtSbl0sICNleHByICovCi0JICAgICAgd3JpdGVfYmFjayA9IFdSSVRFX0JBQ0s7Ci0JICAgICAgCi0JICAgICAgaWYgKHJlZyA9PSBSRUdfUEMpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygicGMgbWF5IG5vdCBiZSB1c2VkIGluIHBvc3QtaW5jcmVtZW50Iik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIGlmIChjcF9hZGRyZXNzX29mZnNldCAoJiBwKSA9PSBGQUlMKQotCQlyZXR1cm4gRkFJTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBwcmVfaW5jID0gUFJFX0lOREVYIHwgSU5ERVhfVVA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qICdbJ1JuLCAjZXhwciddJ1shXSAqLwotCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmIHApID09IEZBSUwpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygicHJlLWluZGV4ZWQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIHByZV9pbmMgPSBQUkVfSU5ERVg7Ci0JICAKLQkgIGlmIChjcF9hZGRyZXNzX29mZnNldCAoJiBwKSA9PSBGQUlMKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgc2tpcF93aGl0ZXNwYWNlIChwKTsKLQotCSAgaWYgKCpwKysgIT0gJ10nKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIm1pc3NpbmcgXSIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIHNraXBfd2hpdGVzcGFjZSAocCk7Ci0KLQkgIGlmICgqcCA9PSAnIScpCi0JICAgIHsKLQkgICAgICBpZiAocmVnID09IFJFR19QQykKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJwYyBtYXkgbm90IGJlIHVzZWQgd2l0aCB3cml0ZS1iYWNrIik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIHArKzsKLQkgICAgICB3cml0ZV9iYWNrID0gV1JJVEVfQkFDSzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnApKQotCXJldHVybiBGQUlMOwotCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU07Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gODsgIC8qIFBDIHJlbCBhZGp1c3QgKi8KLSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJFR19QQyA8PCAxNik7Ci0gICAgICBwcmVfaW5jID0gUFJFX0lOREVYOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IHdyaXRlX2JhY2sgfCBwcmVfaW5jOwotICAqc3RyID0gcDsKLSAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19ub3AgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIERvIG5vdGhpbmcgcmVhbGx5LiAgKi8KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsgLyogVGhpcyBpcyBwb2ludGxlc3MuICAqLwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbXJzIChzdHIsIGZsYWdzKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIE9ubHkgb25lIHN5bnRheC4gICovCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcHNyX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCBDUFNSX0FMTCwgU1BTUl9BTEwpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIjxwc3I+IGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLS8qIFRocmVlIHBvc3NpYmxlIGZvcm1zOiAiPHBzcj4sIFJtIiwgIjxwc3JmPiwgUm0iLCAiPHBzcmY+LCAjZXhwcmVzc2lvbiIuICAqLwotc3RhdGljIHZvaWQKLWRvX21zciAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJlZzsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKHBzcl9yZXF1aXJlZF9oZXJlICgmc3RyLCBDUFNSX0FMTCwgU1BTUl9BTEwpID09IFNVQ0NFU1MpCi0gICAgewotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfQUxMOwotCi0gICAgICAvKiBTeXRheCBzaG91bGQgYmUgIjxwc3I+LCBSbSIgKi8KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLQkgIHx8IChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocHNyX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCBDUFNSX0ZMRywgU1BTUl9GTEcpID09IFNVQ0NFU1MpCi0JaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfRkxBR1M7Ci0gICAgICBlbHNlIGlmIChwc3JfcmVxdWlyZWRfaGVyZSAoJiBzdHIsIENQU1JfQ1RMLCBTUFNSX0NUTCkgPT0gU1VDQ0VTUykKLQlpbnN0Lmluc3RydWN0aW9uIHw9IFBTUl9DT05UUk9MOwotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIAotICAgICAgLyogU3ludGF4IGNvdWxkIGJlICI8cHNyZj4sIHJtIiwgIjxwc3JmPiwgI2V4cHJlc3Npb24iICovCi0gICAgICAKLSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAwKSkgIT0gRkFJTCkKLQk7Ci0gICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbi4gICovCi0gICAgICBlbHNlIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqIHN0cikpCi0JewotCSAgc3RyICsrOwotCSAgaW5zdC5lcnJvciA9IE5VTEw7Ci0JICAKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIlJlZ2lzdGVyIG9yIHNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgaWYgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOwotCSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgdmFsdWUgPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcik7Ci0JICAgICAgaWYgKHZhbHVlID09ICh1bnNpZ25lZCkgRkFJTCkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IHZhbHVlOwotCSAgICB9Ci0KLQkgIGZsYWdzIHw9IElOU1RfSU1NRURJQVRFOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiRXJyb3I6IHVucmVjb2duaXNlZCBzeW50YXggZm9yIHNlY29uZCBhcmd1bWVudCB0byBtc3IgaW5zdHJ1Y3Rpb24iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGluc3QuZXJyb3IgPSBOVUxMOyAKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogTG9uZyBNdWx0aXBseSBQYXJzZXIKLSAgIFVNVUxMIFJkTG8sIFJkSGksIFJtLCBScwotICAgU01VTEwgUmRMbywgUmRIaSwgUm0sIFJzCi0gICBVTUxBTCBSZExvLCBSZEhpLCBSbSwgUnMKLSAgIFNNTEFMIFJkTG8sIFJkSGksIFJtLCBScwotKi8gICAKLXN0YXRpYyB2b2lkCi1kb19tdWxsIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmRsbywgcmRoaSwgcm0sIHJzOwotCi0gIC8qIE9ubHkgb25lIGZvcm1hdCAicmRsbywgcmRoaSwgcm0sIHJzIiAqLwotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChyZGxvID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyZGhpID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHJkaGksIHJkbG8gYW5kIHJtIG11c3QgYWxsIGJlIGRpZmZlcmVudCAqLwotICBpZiAocmRsbyA9PSByZGhpIHx8IHJkbG8gPT0gcm0gfHwgcmRoaSA9PSBybSkKLSAgICBhc190c2t0c2sgKF8oInJkaGksIHJkbG8gYW5kIHJtIG11c3QgYWxsIGJlIGRpZmZlcmVudCIpKTsKLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocnMgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgOCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmRoaSA9PSBSRUdfUEMgfHwgcmRoaSA9PSBSRUdfUEMgfHwgcmRoaSA9PSBSRUdfUEMgfHwgcmRoaSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX211bCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCByZCwgcm07Ci0gIAotICAvKiBPbmx5IG9uZSBmb3JtYXQgInJkLCBybSwgcnMiICovCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKHJkID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZCA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gcmQpCi0gICAgYXNfdHNrdHNrIChfKCJyZCBhbmQgcm0gc2hvdWxkIGJlIGRpZmZlcmVudCBpbiBtdWwiKSk7Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDgpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbWxhIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJkLCBybTsKLQotICAvKiBPbmx5IG9uZSBmb3JtYXQgInJkLCBybSwgcnMsIHJuIiAqLwotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChyZCA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmQgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChybSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IHJkKQotICAgIGFzX3Rza3RzayAoXygicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbWxhIikpOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyZCA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA4KSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJkID09IFJFR19QQyB8fCBybSA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotLyogUmV0dXJucyB0aGUgaW5kZXggaW50byBmcF92YWx1ZXMgb2YgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIG9yIC0xIGlmCi0gICBub3QgaW4gdGhlIHRhYmxlLiAgKi8KLXN0YXRpYyBpbnQKLW15X2dldF9mbG9hdF9leHByZXNzaW9uIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKiAgICAgICAgIHNhdmVfaW47Ci0gIGV4cHJlc3Npb25TICAgIGV4cDsKLSAgaW50ICAgICAgICAgICAgaTsKLSAgaW50ICAgICAgICAgICAgajsKLQotICBtZW1zZXQgKHdvcmRzLCAwLCBNQVhfTElUVExFTlVNUyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgLyogTG9vayBmb3IgYSByYXcgZmxvYXRpbmcgcG9pbnQgbnVtYmVyICovCi0gIGlmICgoc2F2ZV9pbiA9IGF0b2ZfaWVlZSAoKnN0ciwgJ3gnLCB3b3JkcykpICE9IE5VTEwKLSAgICAgICYmIChpc19lbmRfb2ZfbGluZSBbKGludCkoKnNhdmVfaW4pXSB8fCAqc2F2ZV9pbiA9PSAnXDAnKSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT0FUX1ZBTFM7IGkrKykKLQl7Ci0JICBmb3IgKGogPSAwOyBqIDwgTUFYX0xJVFRMRU5VTVM7IGorKykKLQkgICAgewotCSAgICAgIGlmICh3b3Jkc1tqXSAhPSBmcF92YWx1ZXNbaV1bal0pCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChqID09IE1BWF9MSVRUTEVOVU1TKQotCSAgICB7Ci0JICAgICAgKnN0ciA9IHNhdmVfaW47Ci0JICAgICAgcmV0dXJuIGk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFRyeSBhbmQgcGFyc2UgYSBtb3JlIGNvbXBsZXggZXhwcmVzc2lvbiwgdGhpcyB3aWxsIHByb2JhYmx5IGZhaWwKLSAgICAgdW5sZXNzIHRoZSBjb2RlIHVzZXMgYSBmbG9hdGluZyBwb2ludCBwcmVmaXggKGVnICIwZiIpICovCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9ICpzdHI7Ci0gIGlmIChleHByZXNzaW9uICgmZXhwKSA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAmJiBleHAuWF9vcCA9PSBPX2JpZwotICAgICAgJiYgZXhwLlhfYWRkX251bWJlciA8IDApCi0gICAgewotICAgICAgLyogRklYTUU6IDUgPSBYX1BSRUNJU0lPTiwgc2hvdWxkIGJlICNkZWZpbmUnZCB3aGVyZSB3ZSBjYW4gdXNlIGl0LgotCSBEaXR0byBmb3IgMTUuICAqLwotICAgICAgaWYgKGdlbl90b193b3JkcyAod29yZHMsIDUsIChsb25nKTE1KSA9PSAwKQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBOVU1fRkxPQVRfVkFMUzsgaSsrKQotCSAgICB7Ci0JICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9MSVRUTEVOVU1TOyBqKyspCi0JCXsKLQkJICBpZiAod29yZHNbal0gIT0gZnBfdmFsdWVzW2ldW2pdKQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChqID09IE1BWF9MSVRUTEVOVU1TKQotCQl7Ci0JCSAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotCQkgIHJldHVybiBpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICpzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAtMTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgYW55dGhpbmcgaW4gdGhlIGV4cHJlc3Npb24gaXMgYSBiaWdudW0gKi8KLXN0YXRpYyBpbnQKLXdhbGtfbm9fYmlnbnVtcyAoc3ApCi0gICAgIHN5bWJvbFMgKiBzcDsKLXsKLSAgaWYgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX29wID09IE9fYmlnKQotICAgIHJldHVybiAxOwotCi0gIGlmIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHNwKS0+WF9hZGRfc3ltYm9sKQotICAgIHsKLSAgICAgIHJldHVybiAod2Fsa19ub19iaWdudW1zIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHNwKS0+WF9hZGRfc3ltYm9sKQotCSAgICAgIHx8IChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHNwKS0+WF9vcF9zeW1ib2wKLQkJICAmJiB3YWxrX25vX2JpZ251bXMgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX29wX3N5bWJvbCkpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW15X2dldF9leHByZXNzaW9uIChlcCwgc3RyKQotICAgICBleHByZXNzaW9uUyAqIGVwOwotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgY2hhciAqIHNhdmVfaW47Ci0gIHNlZ1QgICBzZWc7Ci0gIAotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RyOwotICBzZWcgPSBleHByZXNzaW9uIChlcCk7Ci0KLSNpZmRlZiBPQkpfQU9VVAotICBpZiAoc2VnICE9IGFic29sdXRlX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSBic3Nfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJiYWRfc2VnbWVudCIpOwotICAgICAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBHZXQgcmlkIG9mIGFueSBiaWdudW1zIG5vdywgc28gdGhhdCB3ZSBkb24ndCBnZW5lcmF0ZSBhbiBlcnJvciBmb3Igd2hpY2gKLSAgICAgd2UgY2FuJ3QgZXN0YWJsaXNoIGEgbGluZSBudW1iZXIgbGF0ZXIgb24uICBCaWcgbnVtYmVycyBhcmUgbmV2ZXIgdmFsaWQKLSAgICAgaW4gaW5zdHJ1Y3Rpb25zLCB3aGljaCBpcyB3aGVyZSB0aGlzIHJvdXRpbmUgaXMgYWx3YXlzIGNhbGxlZC4gICovCi0gIGlmIChlcC0+WF9vcCA9PSBPX2JpZwotICAgICAgfHwgKGVwLT5YX2FkZF9zeW1ib2wKLQkgICYmICh3YWxrX25vX2JpZ251bXMgKGVwLT5YX2FkZF9zeW1ib2wpCi0JICAgICAgfHwgKGVwLT5YX29wX3N5bWJvbAotCQkgICYmIHdhbGtfbm9fYmlnbnVtcyAoZXAtPlhfb3Bfc3ltYm9sKSkpKSkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBjb25zdGFudCIpOwotICAgICAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHVucmVzdHJpY3Qgc2hvdWxkIGJlIG9uZSBpZiA8c2hpZnQ+IDxyZWdpc3Rlcj4gaXMgcGVybWl0dGVkIGZvciB0aGlzCi0gICBpbnN0cnVjdGlvbiAqLwotCi1zdGF0aWMgaW50Ci1kZWNvZGVfc2hpZnQgKHN0ciwgdW5yZXN0cmljdCkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCAgICAgdW5yZXN0cmljdDsKLXsKLSAgc3RydWN0IGFzbV9zaGlmdCAqIHNoZnQ7Ci0gIGNoYXIgKiBwOwotICBjaGFyICAgYzsKLSAgICAKLSAgc2tpcF93aGl0ZXNwYWNlICgqIHN0cik7Ci0gICAgCi0gIGZvciAocCA9ICpzdHI7IGlzYWxwaGEgKCpwKTsgcCsrKQotICAgIDsKLQotICBpZiAocCA9PSAqc3RyKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJTaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgYyA9ICpwOwotICAqcCA9ICdcMCc7Ci0gIHNoZnQgPSAoc3RydWN0IGFzbV9zaGlmdCAqKSBoYXNoX2ZpbmQgKGFybV9zaGlmdF9oc2gsICpzdHIpOwotICAqcCA9IGM7Ci0gIGlmIChzaGZ0KQotICAgIHsKLSAgICAgIGlmICghc3RybmNtcCAoKnN0ciwgInJyeCIsIDMpCi0gICAgICAgICAgfHwgIXN0cm5jbXAgKCpzdHIsICJSUlgiLCAzKSkKLQl7Ci0JICAqc3RyID0gcDsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hmdC0+dmFsdWU7Ci0JICByZXR1cm4gU1VDQ0VTUzsKLQl9Ci0KLSAgICAgIHNraXBfd2hpdGVzcGFjZSAocCk7Ci0gICAgICAKLSAgICAgIGlmICh1bnJlc3RyaWN0ICYmIHJlZ19yZXF1aXJlZF9oZXJlICgmcCwgOCkgIT0gRkFJTCkKLQl7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHNoZnQtPnZhbHVlIHwgU0hJRlRfQllfUkVHOwotCSAgKnN0ciA9IHA7Ci0JICByZXR1cm4gU1VDQ0VTUzsKLQl9Ci0gICAgICBlbHNlIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqIHApKQotCXsKLQkgIGluc3QuZXJyb3IgPSBOVUxMOwotCSAgcCsrOwotCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZwKSkKLQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkgIC8qIFZhbGlkYXRlIHNvbWUgc2ltcGxlICNleHByZXNzaW9ucyAqLwotCSAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIG51bSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgICAgIC8qIFJlamVjdCBvcGVyYXRpb25zIGdyZWF0ZXIgdGhhbiAzMiwgb3IgbHNsICMzMiAqLwotCSAgICAgIGlmIChudW0gPiAzMiB8fCAobnVtID09IDMyICYmIHNoZnQtPnZhbHVlID09IDApKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgaW1tZWRpYXRlIHNoaWZ0Iik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIC8qIFNoaWZ0cyBvZiB6ZXJvIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gbHNsICh3aGljaCBpcyB6ZXJvKSovCi0JICAgICAgaWYgKG51bSA9PSAwKQotCQl7Ci0JCSAgKnN0ciA9IHA7Ci0JCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JCX0KLQotCSAgICAgIC8qIFNoaWZ0cyBvZiAzMiBhcmUgZW5jb2RlZCBhcyAwLCBmb3IgdGhvc2Ugc2hpZnRzIHRoYXQKLQkJIHN1cHBvcnQgaXQuICAqLwotCSAgICAgIGlmIChudW0gPT0gMzIpCi0JCW51bSA9IDA7Ci0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChudW0gPDwgNykgfCBzaGZ0LT52YWx1ZTsKLQkgICAgICAqc3RyID0gcDsKLQkgICAgICByZXR1cm4gU1VDQ0VTUzsKLQkgICAgfQotCi0JICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTTsKLQkgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hmdC0+dmFsdWU7Ci0JICAqc3RyID0gcDsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LmVycm9yID0gdW5yZXN0cmljdCA/IF8oInNoaWZ0IHJlcXVpcmVzIHJlZ2lzdGVyIG9yICNleHByZXNzaW9uIikKLQkgICAgOiBfKCJzaGlmdCByZXF1aXJlcyAjZXhwcmVzc2lvbiIpOwotCSAgKnN0ciA9IHA7Ci0JICByZXR1cm4gRkFJTDsKLQl9Ci0gICAgfQotCi0gIGluc3QuZXJyb3IgPSBfKCJTaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gIHJldHVybiBGQUlMOwotfQotCi0vKiBEbyB0aG9zZSBkYXRhX29wcyB3aGljaCBjYW4gdGFrZSBhIG5lZ2F0aXZlIGltbWVkaWF0ZSBjb25zdGFudCAqLwotLyogYnkgYWx0ZXJpbmcgdGhlIGluc3R1Y3Rpb24uIEEgYml0IG9mIGEgaGFjayByZWFsbHkgKi8KLS8qICAgICAgTU9WIDwtPiBNVk4KLSAgICAgICAgQU5EIDwtPiBCSUMKLSAgICAgICAgQURDIDwtPiBTQkMKLSAgICAgICAgYnkgaW52ZXJ0aW5nIHRoZSBzZWNvbmQgb3BlcmFuZCwgYW5kCi0gICAgICAgIEFERCA8LT4gU1VCCi0gICAgICAgIENNUCA8LT4gQ01OCi0gICAgICAgIGJ5IG5lZ2F0aW5nIHRoZSBzZWNvbmQgb3BlcmFuZC4KLSovCi1zdGF0aWMgaW50Ci1uZWdhdGVfZGF0YV9vcCAoaW5zdHJ1Y3Rpb24sIHZhbHVlKQotICAgICB1bnNpZ25lZCBsb25nICogaW5zdHJ1Y3Rpb247Ci0gICAgIHVuc2lnbmVkIGxvbmcgICB2YWx1ZTsKLXsKLSAgaW50IG9wLCBuZXdfaW5zdDsKLSAgdW5zaWduZWQgbG9uZyBuZWdhdGVkLCBpbnZlcnRlZDsKLQotICBuZWdhdGVkID0gdmFsaWRhdGVfaW1tZWRpYXRlICgtdmFsdWUpOwotICBpbnZlcnRlZCA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAofnZhbHVlKTsKLQotICBvcCA9ICgqaW5zdHJ1Y3Rpb24gPj4gREFUQV9PUF9TSElGVCkgJiAweGY7Ci0gIHN3aXRjaCAob3ApCi0gICAgewotICAgICAgLyogRmlyc3QgbmVnYXRlcyAqLwotICAgIGNhc2UgT1BDT0RFX1NVQjogICAgICAgICAgICAgLyogQUREIDwtPiBTVUIgKi8KLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0FERDsKLSAgICAgIHZhbHVlID0gbmVnYXRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQUREOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX1NVQjsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gbmVnYXRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQ01QOiAgICAgICAgICAgICAvKiBDTVAgPC0+IENNTiAqLwotICAgICAgbmV3X2luc3QgPSBPUENPREVfQ01OOwotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9DTU46IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfQ01QOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE5vdyBJbnZlcnRlZCBvcHMgKi8KLSAgICBjYXNlIE9QQ09ERV9NT1Y6ICAgICAgICAgICAgIC8qIE1PViA8LT4gTVZOICovCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9NVk47ICAgICAgICAgICAgICAgCi0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9NVk46IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfTU9WOwotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQU5EOiAgICAgICAgICAgICAvKiBBTkQgPC0+IEJJQyAqLyAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0JJQzsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0JJQzogCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9BTkQ7Ci0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9BREM6ICAgICAgICAgICAgICAvKiBBREMgPC0+IFNCQyAqLwotICAgICAgbmV3X2luc3QgPSBPUENPREVfU0JDOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfU0JDOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0FEQzsKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogV2UgY2Fubm90IGRvIGFueXRoaW5nICovCi0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGlmICh2YWx1ZSA9PSAodW5zaWduZWQpIEZBSUwpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgKmluc3RydWN0aW9uICY9IE9QQ09ERV9NQVNLOwotICAqaW5zdHJ1Y3Rpb24gfD0gbmV3X2luc3QgPDwgREFUQV9PUF9TSElGVDsKLSAgcmV0dXJuIHZhbHVlOyAKLX0KLQotc3RhdGljIGludAotZGF0YV9vcDIgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIGludCB2YWx1ZTsKLSAgZXhwcmVzc2lvblMgZXhwcjsKLQotICBza2lwX3doaXRlc3BhY2UgKCogc3RyKTsKLSAgICAKLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlIChzdHIsIDApICE9IEZBSUwpCi0gICAgewotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoc3RyKSA9PSBTVUNDRVNTKQotCS8qIFNoaWZ0IG9wZXJhdGlvbiBvbiByZWdpc3Rlci4gICovCi0JcmV0dXJuIGRlY29kZV9zaGlmdCAoc3RyLCBOT19TSElGVF9SRVNUUklDVCk7Ci0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEltbWVkaWF0ZSBleHByZXNzaW9uICovCi0gICAgICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKipzdHIpKQotCXsKLQkgICgqc3RyKSsrOwotCSAgaW5zdC5lcnJvciA9IE5VTEw7Ci0JICAKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCBzdHIpKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgaWYgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOwotCSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoc3RyKSA9PSBTVUNDRVNTKQotCQl7Ci0JCSAgLyogI3gsIHkgLS0gaWUgZXhwbGljaXQgcm90YXRpb24gYnkgWSAgKi8KLQkJICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZleHByLCBzdHIpKQotCQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkJICBpZiAoZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotIAotCQkgIC8qIFJvdGF0ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiAqLwotCQkgIGlmICgoKHVuc2lnbmVkKSBleHByLlhfYWRkX251bWJlcikgPiAzMAotCQkgICAgICB8fCAoZXhwci5YX2FkZF9udW1iZXIgJiAxKSAhPSAwCi0JCSAgICAgIHx8ICgodW5zaWduZWQpIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcikgPiAyNTUpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotCQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5TVF9JTU1FRElBVEU7Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBleHByLlhfYWRkX251bWJlciA8PCA3OwotCQkgIHJldHVybiBTVUNDRVNTOwotCQl9Ci0KLQkgICAgICAvKiBJbXBsaWNpdCByb3RhdGlvbiwgc2VsZWN0IGEgc3VpdGFibGUgb25lICAqLwotCSAgICAgIHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpOwotCi0JICAgICAgaWYgKHZhbHVlID09IEZBSUwpCi0JCXsKLQkJICAvKiBDYW4ndCBiZSBkb25lLCBwZXJoYXBzIHRoZSBjb2RlIHJlYWRzIHNvbWV0aGluZyBsaWtlCi0JCSAgICAgImFkZCBSZCwgUm4sICMtbiIsIHdoZXJlICJzdWIgUmQsIFJuLCAjbiIgd291bGQgYmUgb2sgKi8KLQkJICBpZiAoKHZhbHVlID0gbmVnYXRlX2RhdGFfb3AgKCZpbnN0Lmluc3RydWN0aW9uLAotCQkJCQkgICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKSkKLQkJICAgICAgPT0gRkFJTCkKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKLQkJICAgICAgcmV0dXJuIEZBSUw7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gdmFsdWU7Ci0JICAgIH0KLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBJTlNUX0lNTUVESUFURTsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLQotICAgICAgKCpzdHIpKys7Ci0gICAgICBpbnN0LmVycm9yID0gXygiUmVnaXN0ZXIgb3Igc2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1mcF9vcDIgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCAwKSAhPSBGQUlMKQotICAgIHJldHVybiBTVUNDRVNTOwotICBlbHNlCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIGV4cHJlc3Npb24gKi8KLSAgICAgIGlmICgqKCgqc3RyKSsrKSA9PSAnIycpCi0JewotCSAgaW50IGk7Ci0KLQkgIGluc3QuZXJyb3IgPSBOVUxMOwotCi0JICBza2lwX3doaXRlc3BhY2UgKCogc3RyKTsKLQotCSAgLyogRmlyc3QgdHJ5IGFuZCBtYXRjaCBleGFjdCBzdHJpbmdzLCB0aGlzIGlzIHRvIGd1YXJhbnRlZSB0aGF0Ci0JICAgICBzb21lIGZvcm1hdHMgd2lsbCB3b3JrIGV2ZW4gZm9yIGNyb3NzIGFzc2VtYmx5ICovCi0KLQkgIGZvciAoaSA9IDA7IGZwX2NvbnN0W2ldOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybmNtcCAoKnN0ciwgZnBfY29uc3RbaV0sIHN0cmxlbiAoZnBfY29uc3RbaV0pKSA9PSAwKQotCQl7Ci0JCSAgY2hhciAqc3RhcnQgPSAqc3RyOwotCi0JCSAgKnN0ciArPSBzdHJsZW4gKGZwX2NvbnN0W2ldKTsKLQkJICBpZiAoaXNfZW5kX29mX2xpbmVbKGludCkqKnN0cl0gfHwgKipzdHIgPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpICsgODsKLQkJICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0JCSAgICB9Ci0JCSAgKnN0ciA9IHN0YXJ0OwotCQl9Ci0JICAgIH0KLQotCSAgLyogSnVzdCBiZWNhdXNlIHdlIGRpZG4ndCBnZXQgYSBtYXRjaCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUKLQkgICAgIGNvbnN0YW50IGlzbid0IHZhbGlkLCBqdXN0IHRoYXQgaXQgaXMgaW4gYSBmb3JtYXQgdGhhdCB3ZQotCSAgICAgZG9uJ3QgYXV0b21hdGljYWxseSByZWNvZ25pemUuICBUcnkgcGFyc2luZyBpdCB3aXRoCi0JICAgICB0aGUgc3RhbmRhcmQgZXhwcmVzc2lvbiByb3V0aW5lcy4gICovCi0JICBpZiAoKGkgPSBteV9nZXRfZmxvYXRfZXhwcmVzc2lvbiAoc3RyKSkgPj0gMCkKLQkgICAgewotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gaSArIDg7Ci0JICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0JICAgIH0KLQotCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIGV4cHJlc3Npb24iKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGluc3QuZXJyb3IgPSBfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBvciBpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZG9fYXJpdCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBkYXRhX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYWRyIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogVGhpcyBpcyBhIHBzZXVkby1vcCBvZiB0aGUgZm9ybSAiYWRyIHJkLCBsYWJlbCIgdG8gYmUgY29udmVydGVkCi0gICAgIGludG8gYSByZWxhdGl2ZSBhZGRyZXNzIG9mIHRoZSBmb3JtICJhZGQgcmQsIHBjLCAjbGFiZWwtLi04Ii4gICovCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgLyogRnJhZyBoYWNraW5nIHdpbGwgdHVybiB0aGlzIGludG8gYSBzdWIgaW5zdHJ1Y3Rpb24gaWYgdGhlIG9mZnNldCB0dXJucwotICAgICBvdXQgdG8gYmUgbmVnYXRpdmUuICAqLwotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURTsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDg7IC8qIFBDIHJlbGF0aXZlIGFkanVzdC4gICovCi0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2FkcmwgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHJsIHJkLCBsYWJlbCIgdG8gYmUgY29udmVydGVkCi0gICAgIGludG8gYSByZWxhdGl2ZSBhZGRyZXNzIG9mIHRoZSBmb3JtOgotICAgICAJYWRkIHJkLCBwYywgI2xvdyhsYWJlbC0uLTgpIgotICAgICAJYWRkIHJkLCByZCwgI2hpZ2gobGFiZWwtLi04KSIgICAqLwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAxMikgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmIHN0cikgPT0gRkFJTAotICAgICAgfHwgbXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsICYgc3RyKSkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICAKLSAgLyogRnJhZyBoYWNraW5nIHdpbGwgdHVybiB0aGlzIGludG8gYSBzdWIgaW5zdHJ1Y3Rpb24gaWYgdGhlIG9mZnNldCB0dXJucwotICAgICBvdXQgdG8gYmUgbmVnYXRpdmUuICAqLwotICBpbnN0LnJlbG9jLnR5cGUgICAgICAgICAgICAgID0gQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURTsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDg7IC8qIFBDIHJlbGF0aXZlIGFkanVzdCAqLwotICBpbnN0LnJlbG9jLnBjX3JlbCAgICAgICAgICAgID0gMTsKLSAgaW5zdC5pbnN0cnVjdGlvbiAgICAgICAgICAgIHw9IGZsYWdzOwotICBpbnN0LnNpemUgICAgICAgICAgICAgICAgICAgID0gSU5TTl9TSVpFICogMjsKLSAgCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NtcCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGlmICgoZmxhZ3MgJiAweDAwMDBmMDAwKSA9PSAwKQotICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ09ORFNfQklUOwotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19tb3YgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBkYXRhX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgaW50Ci1sZHN0X2V4dGVuZCAoc3RyLCBod3NlKQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICBod3NlOwotewotICBpbnQgYWRkID0gSU5ERVhfVVA7Ci0KLSAgc3dpdGNoICgqKnN0cikKLSAgICB7Ci0gICAgY2FzZSAnIyc6Ci0gICAgY2FzZSAnJCc6Ci0gICAgICAoKnN0cikrKzsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgc3RyKSkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBpbnQgdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgICAgICAgICBpZiAoKGh3c2UgJiYgKHZhbHVlIDwgLTI1NSB8fCB2YWx1ZSA+IDI1NSkpCi0gICAgICAgICAgICAgICB8fCAodmFsdWUgPCAtNDA5NSB8fCB2YWx1ZSA+IDQwOTUpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oImFkZHJlc3Mgb2Zmc2V0IHRvbyBsYXJnZSIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIGlmICh2YWx1ZSA8IDApCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IC12YWx1ZTsKLQkgICAgICBhZGQgPSAwOwotCSAgICB9Ci0KLSAgICAgICAgICAvKiBIYWxmd29yZCBhbmQgc2lnbmV4dGVuc2lvbiBpbnN0cnVjdGlvbnMgaGF2ZSB0aGUKLSAgICAgICAgICAgICBpbW1lZGlhdGUgdmFsdWUgc3BsaXQgYWNyb3NzIGJpdHMgMTEuLjggYW5kIGJpdHMgMy4uMCAqLwotICAgICAgICAgIGlmIChod3NlKQotICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBhZGQgfCBIV09GRlNFVF9JTU0gfCAoKHZhbHVlID4+IDQpIDw8IDgpIHwgKHZhbHVlICYgMHhGKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGFkZCB8IHZhbHVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0gICAgICAgICAgaWYgKGh3c2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSFdPRkZTRVRfSU1NOwotICAgICAgICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTsKLQkgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQl9Ci0gICAgICByZXR1cm4gU1VDQ0VTUzsKLQotICAgIGNhc2UgJy0nOgotICAgICAgYWRkID0gMDsJLyogYW5kIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgJysnOgotICAgICAgKCpzdHIpKys7CS8qIGFuZCBmYWxsIHRocm91Z2ggKi8KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlIChzdHIsIDApID09IEZBSUwpCi0JcmV0dXJuIEZBSUw7Ci0KLSAgICAgIGlmIChod3NlKQotICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGFkZDsKLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkIHwgT0ZGU0VUX1JFRzsKLSAgICAgICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hIChzdHIpID09IFNVQ0NFU1MpCi0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX3NoaWZ0IChzdHIsIFNISUZUX1JFU1RSSUNUKTsKLSAgICAgICAgfQotCi0gICAgICByZXR1cm4gU1VDQ0VTUzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19sZHN0IChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IGhhbGZ3b3JkID0gMDsKLSAgaW50IHByZV9pbmMgPSAwOwotICBpbnQgY29uZmxpY3RfcmVnOwotICBpbnQgdmFsdWU7Ci0KLSAgLyogVGhpcyBpcyBub3QgaWRlYWwsIGJ1dCBpdCBpcyB0aGUgc2ltcGxlc3Qgd2F5IG9mIGRlYWxpbmcgd2l0aCB0aGUKLSAgICAgQVJNN1QgaGFsZndvcmQgaW5zdHJ1Y3Rpb25zIChzaW5jZSB0aGV5IHVzZSBhIGRpZmZlcmVudAotICAgICBlbmNvZGluZywgYnV0IHRoZSBzYW1lIG1uZW1vbmljKTogKi8KLSAgaGFsZndvcmQgPSAoZmxhZ3MgJiAweDgwMDAwMDAwKSAhPSAwOwotICBpZiAoaGFsZndvcmQpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhIGxvYWQvc3RvcmUgb2YgYSBoYWxmd29yZCwgb3IgYQotICAgICAgICAgc2lnbmVkLWV4dGVuc2lvbiBsb2FkICovCi0gICAgICBpZiAoKGNwdV92YXJpYW50ICYgQVJNX0hBTEZXT1JEKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5lcnJvcgotCSAgICA9IF8oIlByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IGhhbGZ3b3JkcyBvciBzaWduZWQgYnl0ZXMiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IChpbnN0Lmluc3RydWN0aW9uICYgQ09ORF9NQVNLKQotICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGZsYWdzICYgfkNPTkRfTUFTSyk7Ci0KLSAgICAgIGZsYWdzID0gMDsKLSAgICB9Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotICAgIAotICBpZiAoKGNvbmZsaWN0X3JlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHN0ciwgMTIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCYgc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJBZGRyZXNzIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3RyID09ICdbJykKLSAgICB7Ci0gICAgICBpbnQgcmVnOwotCi0gICAgICBzdHIrKzsKLQotICAgICAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICAvKiBDb25mbGljdHMgY2FuIG9jY3VyIG9uIHN0b3JlcyBhcyB3ZWxsIGFzIGxvYWRzLiAgKi8KLSAgICAgIGNvbmZsaWN0X3JlZyA9IChjb25mbGljdF9yZWcgPT0gcmVnKTsKLQotICAgICAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gICAgICBpZiAoKnN0ciA9PSAnXScpCi0JewotCSAgc3RyICsrOwotCSAgCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBTVUNDRVNTKQotCSAgICB7Ci0JICAgICAgLyogW1JuXSwuLi4gKHBvc3QgaW5jKSAqLwotCSAgICAgIGlmIChsZHN0X2V4dGVuZCAoJnN0ciwgaGFsZndvcmQpID09IEZBSUwpCi0JCXJldHVybjsKLQkgICAgICBpZiAoY29uZmxpY3RfcmVnKQotCQlhc193YXJuIChfKCIlcyByZWdpc3RlciBzYW1lIGFzIHdyaXRlLWJhY2sgYmFzZSIpLAotCQkJIChpbnN0Lmluc3RydWN0aW9uICYgTE9BRF9CSVQpID8gXygiZGVzdGluYXRpb24iKSA6IF8oInNvdXJjZSIpICk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFtSbl0gKi8KLSAgICAgICAgICAgICAgaWYgKGhhbGZ3b3JkKQotICAgICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSFdPRkZTRVRfSU1NOwotCi0gICAgICAgICAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgICAgICAgICBpZiAoKnN0ciA9PSAnIScpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIGlmIChjb25mbGljdF9yZWcpCi0JCSAgIGFzX3dhcm4gKF8oIiVzIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlIiksCi0JCQkgICAgKGluc3QuaW5zdHJ1Y3Rpb24gJiBMT0FEX0JJVCkgPyBfKCJkZXN0aW5hdGlvbiIpIDogXygic291cmNlIikgKTsKLSAgICAgICAgICAgICAgICAgc3RyKys7Ci0gICAgICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gV1JJVEVfQkFDSzsKLSAgICAgICAgICAgICAgIH0KLQotCSAgICAgIGZsYWdzIHw9IElOREVYX1VQOwotCSAgICAgIGlmICghIChmbGFncyAmIFRSQU5TX0JJVCkpCi0JCXByZV9pbmMgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFtSbiwuLi5dICovCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oInByZS1pbmRleGVkIGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgcHJlX2luYyA9IDE7Ci0JICBpZiAobGRzdF9leHRlbmQgKCZzdHIsIGhhbGZ3b3JkKSA9PSBGQUlMKQotCSAgICByZXR1cm47Ci0KLQkgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotCSAgaWYgKCpzdHIrKyAhPSAnXScpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygibWlzc2luZyBdIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotCSAgaWYgKCpzdHIgPT0gJyEnKQotCSAgICB7Ci0JICAgICAgaWYgKGNvbmZsaWN0X3JlZykKLQkJYXNfd2FybiAoXygiJXMgcmVnaXN0ZXIgc2FtZSBhcyB3cml0ZS1iYWNrIGJhc2UiKSwKLQkJCSAoaW5zdC5pbnN0cnVjdGlvbiAmIExPQURfQklUKSA/IF8oImRlc3RpbmF0aW9uIikgOiBfKCJzb3VyY2UiKSApOwotCSAgICAgIHN0cisrOwotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gV1JJVEVfQkFDSzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCpzdHIgPT0gJz0nKQotICAgIHsKLSAgICAgIC8qIFBhcnNlIGFuICJsZHIgUmQsID1leHByIiBpbnN0cnVjdGlvbjsgdGhpcyBpcyBhbm90aGVyIHBzZXVkbyBvcCAqLwotICAgICAgc3RyKys7Ci0KLSAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCSAgJiYgaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX3N5bWJvbCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgKHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcikpICE9IEZBSUwpCi0JewotCSAgLyogVGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgbW92IGluc3RydWN0aW9uICovCi0JICBpbnN0Lmluc3RydWN0aW9uICY9IExJVEVSQUxfTUFTSzsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5TVF9JTU1FRElBVEUgfCAoT1BDT0RFX01PViA8PCBEQVRBX09QX1NISUZUKTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKGZsYWdzICYgQ09ORF9NQVNLKSB8ICh2YWx1ZSAmIDB4ZmZmKTsKLQkgIGVuZF9vZl9saW5lKHN0cik7Ci0JICByZXR1cm47IAotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJbnNlcnQgaW50byBsaXRlcmFsIHBvb2wgKi8gICAgIAotCSAgaWYgKGFkZF90b19saXRfcG9vbCAoKSA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaWYgKCFpbnN0LmVycm9yKQotCQlpbnN0LmVycm9yID0gXygibGl0ZXJhbCBwb29sIGluc2VydGlvbiBmYWlsZWQiKTsgCi0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIENoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24gZXhwIHRvIHBvaW50IHRvIHRoZSBwb29sICovCi0gICAgICAgICAgaWYgKGhhbGZ3b3JkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKLSAgICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotCSAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw7Ci0JICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOwotCSAgcHJlX2luYyA9IDE7IAotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoaGFsZndvcmQpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKLSAgICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTsKLSNpZm5kZWYgVEVfV0lOQ0UKLSAgICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAgLyogUEMgcmVsIGFkanVzdCAqLwotI2VuZGlmCi0gICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOwotICAgICAgcHJlX2luYyA9IDE7Ci0gICAgfQotICAgIAotICBpZiAocHJlX2luYyAmJiAoZmxhZ3MgJiBUUkFOU19CSVQpKQotICAgIGluc3QuZXJyb3IgPSBfKCJQcmUtaW5jcmVtZW50IGluc3RydWN0aW9uIHdpdGggdHJhbnNsYXRlIik7Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFncyB8IChwcmVfaW5jID8gUFJFX0lOREVYIDogMCk7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBsb25nCi1yZWdfbGlzdCAoc3RycCkKLSAgICAgY2hhciAqKiBzdHJwOwotewotICBjaGFyICogc3RyID0gKnN0cnA7Ci0gIGxvbmcgICByYW5nZSA9IDA7Ci0gIGludCAgICBhbm90aGVyX3JhbmdlOwotCi0gIC8qIFdlIGNvbWUgYmFjayBoZXJlIGlmIHdlIGdldCByYW5nZXMgY29uY2F0ZW5hdGVkIGJ5ICcrJyBvciAnfCcgKi8KLSAgZG8KLSAgICB7Ci0gICAgICBhbm90aGVyX3JhbmdlID0gMDsKLQotICAgICAgaWYgKCpzdHIgPT0gJ3snKQotCXsKLQkgIGludCBpbl9yYW5nZSA9IDA7Ci0JICBpbnQgY3VyX3JlZyA9IC0xOwotICAgICAgCi0JICBzdHIrKzsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBpbnQgcmVnOwotCSAgICAKLQkgICAgICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLQkgICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHN0ciwgLTEpKSA9PSBGQUlMKQotCQlyZXR1cm4gRkFJTDsKLQkgICAgICAKLQkgICAgICBpZiAoaW5fcmFuZ2UpCi0JCXsKLQkJICBpbnQgaTsKLQkgICAgICAKLQkJICBpZiAocmVnIDw9IGN1cl9yZWcpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJCYWQgcmFuZ2UgaW4gcmVnaXN0ZXIgbGlzdCIpOwotCQkgICAgICByZXR1cm4gRkFJTDsKLQkJICAgIH0KLQotCQkgIGZvciAoaSA9IGN1cl9yZWcgKyAxOyBpIDwgcmVnOyBpKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmIChyYW5nZSAmICgxIDw8IGkpKQotCQkJYXNfdHNrdHNrIAotCQkJICAoXygiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IiksCi0JCQkgICBpKTsKLQkJICAgICAgZWxzZQotCQkJcmFuZ2UgfD0gMSA8PCBpOwotCQkgICAgfQotCQkgIGluX3JhbmdlID0gMDsKLQkJfQotCi0JICAgICAgaWYgKHJhbmdlICYgKDEgPDwgcmVnKSkKLQkJYXNfdHNrdHNrIChfKCJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiKSwKLQkJCSAgIHJlZyk7Ci0JICAgICAgZWxzZSBpZiAocmVnIDw9IGN1cl9yZWcpCi0JCWFzX3Rza3RzayAoXygiV2FybmluZzogUmVnaXN0ZXIgcmFuZ2Ugbm90IGluIGFzY2VuZGluZyBvcmRlciIpKTsKLQotCSAgICAgIHJhbmdlIHw9IDEgPDwgcmVnOwotCSAgICAgIGN1cl9yZWcgPSByZWc7Ci0JICAgIH0gd2hpbGUgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgIT0gRkFJTAotCQkgICAgIHx8IChpbl9yYW5nZSA9IDEsICpzdHIrKyA9PSAnLScpKTsKLQkgIHN0ci0tOwotCSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0JICBpZiAoKnN0cisrICE9ICd9JykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJNaXNzaW5nIGB9JyIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHJlc3Npb25TIGV4cHI7Ci0KLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsICZzdHIpKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgaWYgKGV4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKGV4cHIuWF9hZGRfbnVtYmVyIAotCQkgICE9IChleHByLlhfYWRkX251bWJlciAmIDB4MDAwMGZmZmYpKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgcmVnaXN0ZXIgbWFzayIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICBpZiAoKHJhbmdlICYgZXhwci5YX2FkZF9udW1iZXIpICE9IDApCi0JCXsKLQkJICBpbnQgcmVnbm8gPSByYW5nZSAmIGV4cHIuWF9hZGRfbnVtYmVyOwotCi0JCSAgcmVnbm8gJj0gLXJlZ25vOwotCQkgIHJlZ25vID0gKDEgPDwgcmVnbm8pIC0gMTsKLQkJICBhc190c2t0c2sgCi0JCSAgICAoXygiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IiksCi0JCSAgICAgcmVnbm8pOwotCQl9Ci0KLQkgICAgICByYW5nZSB8PSBleHByLlhfYWRkX251bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGluc3QucmVsb2MudHlwZSAhPSAwKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgbWVtY3B5ICgmaW5zdC5yZWxvYy5leHAsICZleHByLCBzaXplb2YgKGV4cHJlc3Npb25TKSk7Ci0JICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9NVUxUSTsKLQkgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgaWYgKCpzdHIgPT0gJ3wnIHx8ICpzdHIgPT0gJysnKQotCXsKLQkgIHN0cisrOwotCSAgYW5vdGhlcl9yYW5nZSA9IDE7Ci0JfQotICAgIH0gd2hpbGUgKGFub3RoZXJfcmFuZ2UpOwotCi0gICpzdHJwID0gc3RyOwotICByZXR1cm4gcmFuZ2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19sZG1zdG0gKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgYmFzZV9yZWc7Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgoYmFzZV9yZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICBpZiAoYmFzZV9yZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKCpzdHIgPT0gJyEnKQotICAgIHsKLSAgICAgIGZsYWdzIHw9IFdSSVRFX0JBQ0s7Ci0gICAgICBzdHIrKzsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJhbmdlID0gcmVnX2xpc3QgKCZzdHIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKnN0ciA9PSAnXicpCi0gICAgewotICAgICAgc3RyKys7Ci0gICAgICBmbGFncyB8PSBMRE1fVFlQRV8yX09SXzM7Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCByYW5nZTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3N3aSAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLSAgCi0gIC8qIEFsbG93IG9wdGlvbmFsIGxlYWRpbmcgJyMnLiAgKi8KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHN0cisrOwotCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotICAgIHJldHVybjsKLQotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1NXSTsKLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICAKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIAotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19zd2FwIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJlZzsKLSAgCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChyZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgaW4gc3dhcCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgaW4gc3dhcCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAqc3RyKysgIT0gJ1snKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgqc3RyKysgIT0gJ10nKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJtaXNzaW5nIF0iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2JyYW5jaCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgCi0jaWZkZWYgT0JKX0VMRgotICB7Ci0gICAgY2hhciAqIHNhdmVfaW47Ci0gIAotICAgIC8qIFNjb3R0QjogRmVicnVhcnkgNSwgMTk5OCAqLwotICAgIC8qIENoZWNrIHRvIHNlZSBvZiBQTFQzMiByZWxvYyByZXF1aXJlZCBmb3IgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAKLSAgICAvKiBhcm1fcGFyc2VfcmVsb2MoKSB3b3JrcyBvbiBpbnB1dF9saW5lX3BvaW50ZXIuCi0gICAgICAgV2UgYWN0dWFsbHkgd2FudCB0byBwYXJzZSB0aGUgb3BlcmFuZHMgdG8gdGhlIGJyYW5jaCBpbnN0cnVjdGlvbgotICAgICAgIHBhc3NlZCBpbiAnc3RyJy4gIFNhdmUgdGhlIGlucHV0IHBvaW50ZXIgYW5kIHJlc3RvcmUgaXQgbGF0ZXIuICAqLwotICAgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fc3ltYm9sCi0JJiYgKnN0ciA9PSAnKCcKLQkmJiBhcm1fcGFyc2VfcmVsb2MgKCkgPT0gQkZEX1JFTE9DX0FSTV9QTFQzMikKLSAgICAgIHsKLQlpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fUExUMzI7Ci0JaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCS8qIE1vZGlmeSBzdHIgdG8gcG9pbnQgdG8gYWZ0ZXIgcGFyc2VkIG9wZXJhbmRzLCBvdGhlcndpc2UKLQkgICBlbmRfb2ZfbGluZSgpIHdpbGwgY29tcGxhaW4gYWJvdXQgdGhlIChQTFQpIGxlZnQgaW4gc3RyLiAgKi8KLQlzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g7Ci0JaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgfQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIH0KLSNlbHNlCi0gIGluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSNlbmRpZiAvKiBPQkpfRUxGICovCi0gIAotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYnggKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByZWc7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NkcCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogQ28tcHJvY2Vzc29yIGRhdGEgb3BlcmF0aW9uLgotICAgICBGb3JtYXQ6IENEUHtjb25kfSBDUCMsPGV4cHI+LENSZCxDUm4sQ1Jteyw8ZXhwcj59ICAqLwotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKGNvX3Byb2NfbnVtYmVyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX29wY19leHByICgmc3RyLCAyMCw0KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gU1VDQ0VTUykKLSAgICB7Ci0gICAgICBpZiAoY3Bfb3BjX2V4cHIgKCZzdHIsIDUsIDMpID09IEZBSUwpCi0JewotCSAgaWYgKCFpbnN0LmVycm9yKQotCSAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbHN0YyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIENvLXByb2Nlc3NvciByZWdpc3RlciBsb2FkL3N0b3JlLgotICAgICBGb3JtYXQ6IDxMREN8U1RDe2NvbmR9W0xdIENQIyxDUmQsPGFkZHJlc3M+ICAqLwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoY29fcHJvY19udW1iZXIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NvX3JlZyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIENvLXByb2Nlc3NvciByZWdpc3RlciB0cmFuc2Zlci4KLSAgICAgRm9ybWF0OiA8TUNSfE1SQz57Y29uZH0gQ1AjLDxleHByMT4sUmQsQ1JuLENSbXssPGV4cHIyPn0gICovCi0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChjb19wcm9jX251bWJlciAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9vcGNfZXhwciAoJnN0ciwgMjEsIDMpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBTVUNDRVNTKQotICAgIHsKLSAgICAgIGlmIChjcF9vcGNfZXhwciAoJnN0ciwgNSwgMykgPT0gRkFJTCkKLQl7Ci0JICBpZiAoIWluc3QuZXJyb3IpCi0JICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9DT05EOwotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfY3RybCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRlAgY29udHJvbCByZWdpc3RlcnMuCi0gICAgIEZvcm1hdDogPFdGU3xSRlN8V0ZDfFJGQz57Y29uZH0gUm4gICovCi0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2xkc3QgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBzd2l0Y2ggKGluc3Quc3VmZml4KQotICAgIHsKLSAgICBjYXNlIFNVRkZfUzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9EOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX1A6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWCB8IENQX1RfWTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9sZG1zdG0gKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgbnVtX3JlZ3M7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEdldCBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHRyYW5zZmVyICovCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgdmFsdWUgcmVxdWlyZWQgZm9yIG51bWJlciBvZiByZWdpc3RlcnMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbnVtX3JlZ3MgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKG51bV9yZWdzIDwgMSB8fCBudW1fcmVncyA+IDQpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIm51bWJlciBvZiByZWdpc3RlcnMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzE6NF0iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW1fcmVncykKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZIHwgQ1BfVF9YOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaW50IHJlZzsKLSAgICAgIGludCB3cml0ZV9iYWNrOwotICAgICAgaW50IG9mZnNldDsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCAiZWEiIG9yICJmZCIsIHNvIHdlIGNhbiBvbmx5IGFjY2VwdAotCSBbUm5deyF9LiAgVGhlIGluc3RydWN0aW9uIGRvZXMgbm90IHJlYWxseSBzdXBwb3J0IHN0YWNraW5nIG9yCi0JIHVuc3RhY2tpbmcsIHNvIHdlIGhhdmUgdG8gZW11bGF0ZSB0aGVzZSBieSBzZXR0aW5nIGFwcHJvcHJpYXRlCi0JIGJpdHMgYW5kIG9mZnNldHMuICAqLwotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotCSAgfHwgKnN0ciAhPSAnWycpCi0JewotCSAgaWYgKCEgaW5zdC5lcnJvcikKLQkgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgc3RyKys7Ci0gICAgICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgaWYgKCpzdHIgIT0gJ10nKQotCXsKLQkgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIHN0cisrOwotICAgICAgaWYgKCpzdHIgPT0gJyEnKQotCXsKLQkgIHdyaXRlX2JhY2sgPSAxOwotCSAgc3RyKys7Ci0JICBpZiAocmVnID09IFJFR19QQykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJSMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciB3aXRoIHdyaXRlLWJhY2siKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0Jd3JpdGVfYmFjayA9IDA7Ci0KLSAgICAgIGlmIChmbGFncyAmIENQX1RfUHJlKQotCXsKLQkgIC8qIFByZS1kZWNyZW1lbnQgKi8KLQkgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKLQkgIGlmICh3cml0ZV9iYWNrKQotCSAgICBmbGFncyB8PSBDUF9UX1dCOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQb3N0LWluY3JlbWVudCAqLwotCSAgaWYgKHdyaXRlX2JhY2spCi0JICAgIHsKLQkgICAgICBmbGFncyB8PSBDUF9UX1dCOwotCSAgICAgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm8gd3JpdGUtYmFjaywgc28gY29udmVydCB0aGlzIGludG8gYSBzdGFuZGFyZCBwcmUtaW5jcmVtZW50Ci0JCSBpbnN0cnVjdGlvbiAtLSBhZXN0aGV0aWNhbGx5IG1vcmUgcGxlYXNpbmcuICAqLwotCSAgICAgIGZsYWdzID0gQ1BfVF9QcmUgfCBDUF9UX1VEOwotCSAgICAgIG9mZnNldCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCBvZmZzZXQ7Ci0gICAgfQotICBlbHNlIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLQkgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfZHlhZGljIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBmcF9vcDIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9tb25hZGljIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfY21wIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2Zyb21fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfdG9fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBUaHVtYiBzcGVjaWZpYyByb3V0aW5lcyAqLwotCi0vKiBQYXJzZSBhbmQgdmFsaWRhdGUgdGhhdCBhIHJlZ2lzdGVyIGlzIG9mIHRoZSByaWdodCBmb3JtLCB0aGlzIHNhdmVzCi0gICByZXBlYXRlZCBjaGVja2luZyBvZiB0aGlzIGluZm9ybWF0aW9uIGluIG1hbnkgc2ltaWxhciBjYXNlcy4gCi0gICBVbmxpa2UgdGhlIDMyLWJpdCBjYXNlIHdlIGRvIG5vdCBpbnNlcnQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIG9wY29kZSAKLSAgIGhlcmUsIHNpbmNlIHRoZSBwb3NpdGlvbiBpcyBvZnRlbiB1bmtub3duIHVudGlsIHRoZSBmdWxsIGluc3RydWN0aW9uIAotICAgaGFzIGJlZW4gcGFyc2VkLiAgKi8KLXN0YXRpYyBpbnQKLXRodW1iX3JlZyAoc3RycCwgaGlfbG8pCi0gICAgIGNoYXIgKiogc3RycDsKLSAgICAgaW50ICAgICBoaV9sbzsKLXsKLSAgaW50IHJlZzsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlIChzdHJwLCAtMSkpID09IEZBSUwpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgc3dpdGNoIChoaV9sbykKLSAgICB7Ci0gICAgY2FzZSBUSFVNQl9SRUdfTE86Ci0gICAgICBpZiAocmVnID4gNykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygibG8gcmVnaXN0ZXIgcmVxdWlyZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUSFVNQl9SRUdfSEk6Ci0gICAgICBpZiAocmVnIDwgOCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiaGkgcmVnaXN0ZXIgcmVxdWlyZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVnOwotfQotCi0vKiBQYXJzZSBhbiBhZGQgb3Igc3VidHJhY3QgaW5zdHJ1Y3Rpb24sIFNVQlRSQUNUIGlzIG5vbi16ZXJvIGlmIHRoZSBvcGNvZGUKLSAgIHdhcyBTVUIuICAqLwotc3RhdGljIHZvaWQKLXRodW1iX2FkZF9zdWIgKHN0ciwgc3VidHJhY3QpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBzdWJ0cmFjdDsKLXsKLSAgaW50IFJkLCBScywgUm4gPSBGQUlMOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgewotICAgICAgUnMgPSBSZDsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKFJzID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JewotCSAgLyogVHdvIG9wZXJhbmQgZm9ybWF0LCBzaHVmZmxlIHRoZSByZWdpc3RlcnMgYW5kIHByZXRlbmQgdGhlcmUgCi0JICAgICBhcmUgMyAqLwotCSAgUm4gPSBSczsKLQkgIFJzID0gUmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JewotCSAgc3RyKys7Ci0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotCXJldHVybjsKLSAgICB9Ci0KLSAgLyogV2Ugbm93IGhhdmUgUmQgYW5kIFJzIHNldCB0byByZWdpc3RlcnMsIGFuZCBSbiBzZXQgdG8gYSByZWdpc3RlciBvciBGQUlMOwotICAgICBmb3IgdGhlIGxhdHRlciBjYXNlLCBFWFBSIGNvbnRhaW5zIHRoZSBpbW1lZGlhdGUgdGhhdCB3YXMgZm91bmQuICovCi0gIGlmIChSbiAhPSBGQUlMKQotICAgIHsKLSAgICAgIC8qIEFsbCByZWdpc3RlciBmb3JtYXQuICAqLwotICAgICAgaWYgKFJkID4gNyB8fCBScyA+IDcgfHwgUm4gPiA3KQotCXsKLQkgIGlmIChScyAhPSBSZCkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJkZXN0IGFuZCBzb3VyY2UxIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgLyogQ2FuJ3QgZG8gdGhpcyBmb3IgU1VCICovCi0JICBpZiAoc3VidHJhY3QpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygic3VidHJhY3QgdmFsaWQgb25seSBvbiBsbyByZWdzIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSAoVF9PUENPREVfQUREX0hJCi0JCQkgICAgICB8IChSZCA+IDcgPyBUSFVNQl9IMSA6IDApCi0JCQkgICAgICB8IChSbiA+IDcgPyBUSFVNQl9IMiA6IDApKTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJkICYgNykgfCAoKFJuICYgNykgPDwgMyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9SMyA6IFRfT1BDT0RFX0FERF9SMzsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMykgfCAoUm4gPDwgNik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEltbWVkaWF0ZSBleHByZXNzaW9uLCBub3cgdGhpbmdzIHN0YXJ0IHRvIGdldCBuYXN0eS4gICovCi0KLSAgICAgIC8qIEZpcnN0IGRlYWwgd2l0aCBISSByZWdzLCBvbmx5IHZlcnkgcmVzdHJpY3RlZCBjYXNlcyBhbGxvd2VkOgotCSBBZGp1c3RpbmcgU1AsIGFuZCB1c2luZyBQQyBvciBTUCB0byBnZXQgYW4gYWRkcmVzcy4gICovCi0gICAgICBpZiAoKFJkID4gNyAmJiAoUmQgIT0gUkVHX1NQIHx8IFJzICE9IFJFR19TUCkpCi0JICB8fCAoUnMgPiA3ICYmIFJzICE9IFJFR19TUCAmJiBScyAhPSBSRUdfUEMpKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIEhpIHJlZ2lzdGVyIHdpdGggaW1tZWRpYXRlIik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFZhbHVlIGlzbid0IGtub3duIHlldCwgYWxsIHdlIGNhbiBkbyBpcyBzdG9yZSBhbGwgdGhlIGZyYWdtZW50cwotCSAgICAgd2Uga25vdyBhYm91dCBpbiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGxldCB0aGUgcmVsb2MgaGFja2luZyAKLQkgICAgIHdvcmsgaXQgYWxsIG91dC4gICovCi0JICBpbnN0Lmluc3RydWN0aW9uID0gKHN1YnRyYWN0ID8gMHg4MDAwIDogMCkgfCAoUmQgPDwgNCkgfCBSczsKLQkgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0JICBpZiAoc3VidHJhY3QpCi0JICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0KLQkgIGlmIChvZmZzZXQgPCAwKQotCSAgICB7Ci0JICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLQkgICAgICBzdWJ0cmFjdCA9IDE7Ci0KLQkgICAgICAvKiBRdWljayBjaGVjaywgaW4gY2FzZSBvZmZzZXQgaXMgTUlOX0lOVCAqLwotCSAgICAgIGlmIChvZmZzZXQgPCAwKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBzdWJ0cmFjdCA9IDA7Ci0KLQkgIGlmIChSZCA9PSBSRUdfU1ApCi0JICAgIHsKLQkgICAgICBpZiAob2Zmc2V0ICYgfjB4MWZjKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIHZhbHVlIGZvciBzdGFjayBhZGp1c3QiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfU1QgOiBUX09QQ09ERV9BRERfU1Q7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBvZmZzZXQgPj4gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAoUnMgPT0gUkVHX1BDIHx8IFJzID09IFJFR19TUCkKLQkgICAgewotCSAgICAgIGlmIChzdWJ0cmFjdAotCQkgIHx8IChvZmZzZXQgJiB+MHgzZmMpKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IChScyA9PSBSRUdfUEMgPyBUX09QQ09ERV9BRERfUEMKLQkJCQkgIDogVF9PUENPREVfQUREX1NQKTsKLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSZCA8PCA4KSB8IChvZmZzZXQgPj4gMik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKFJzID09IFJkKQotCSAgICB7Ci0JICAgICAgaWYgKG9mZnNldCAmIH4weGZmKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTggOiBUX09QQ09ERV9BRERfSTg7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgPDwgOCkgfCBvZmZzZXQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChvZmZzZXQgJiB+MHg3KQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTMgOiBUX09QQ09ERV9BRERfSTM7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKSB8IChvZmZzZXQgPDwgNik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHVtYl9zaGlmdCAoc3RyLCBzaGlmdCkKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgaW50ICAgIHNoaWZ0OwotewotICBpbnQgUmQsIFJzLCBSbiA9IEZBSUw7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHsKLSAgICAgIC8qIFR3byBvcGVyYW5kIGltbWVkaWF0ZSBmb3JtYXQsIHNldCBScyB0byBSZC4gICovCi0gICAgICBScyA9IFJkOwotICAgICAgc3RyICsrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKFJzID0gIHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JewotCSAgLyogVHdvIG9wZXJhbmQgZm9ybWF0LCBzaHVmZmxlIHRoZSByZWdpc3RlcnMgYW5kIHByZXRlbmQgdGhlcmUKLQkgICAgIGFyZSAzICovCi0JICBSbiA9IFJzOwotCSAgUnMgPSBSZDsKLQl9Ci0gICAgICBlbHNlIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqc3RyKSkKLQl7Ci0JICBzdHIrKzsKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQkgICAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKChSbiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBoYXZlIFJkIGFuZCBScyBzZXQgdG8gcmVnaXN0ZXJzLCBhbmQgUm4gc2V0IHRvIGEgcmVnaXN0ZXIgb3IgRkFJTDsKLSAgICAgZm9yIHRoZSBsYXR0ZXIgY2FzZSwgRVhQUiBjb250YWlucyB0aGUgaW1tZWRpYXRlIHRoYXQgd2FzIGZvdW5kLiAqLwotCi0gIGlmIChSbiAhPSBGQUlMKQotICAgIHsKLSAgICAgIGlmIChScyAhPSBSZCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygic291cmNlMSBhbmQgZGVzdCBtdXN0IGJlIHNhbWUgcmVnaXN0ZXIiKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc2hpZnQpCi0JewotCWNhc2UgVEhVTUJfQVNSOiBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQVNSX1I7IGJyZWFrOwotCWNhc2UgVEhVTUJfTFNMOiBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTFNMX1I7IGJyZWFrOwotCWNhc2UgVEhVTUJfTFNSOiBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfTFNSX1I7IGJyZWFrOwotCX0KLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChSbiA8PCAzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNoaWZ0KQotCXsKLQljYXNlIFRIVU1CX0FTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0FTUl9JOyBicmVhazsKLQljYXNlIFRIVU1CX0xTTDogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTTF9JOyBicmVhazsKLQljYXNlIFRIVU1CX0xTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTUl9JOyBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JewotCSAgLyogVmFsdWUgaXNuJ3Qga25vd24geWV0LCBjcmVhdGUgYSBkdW1teSByZWxvYyBhbmQgbGV0IHJlbG9jCi0JICAgICBoYWNraW5nIGZpeCBpdCB1cCAqLwotCi0JICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBzaGlmdF92YWx1ZSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKHNoaWZ0X3ZhbHVlID4gMzIgfHwgKHNoaWZ0X3ZhbHVlID09IDMyICYmIHNoaWZ0ID09IFRIVU1CX0xTTCkpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHNoaWZ0Iik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIFNoaWZ0cyBvZiB6ZXJvIGFyZSBoYW5kbGVkIGJ5IGNvbnZlcnRpbmcgdG8gTFNMICovCi0JICBpZiAoc2hpZnRfdmFsdWUgPT0gMCkKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTTF9JOwotCi0JICAvKiBTaGlmdHMgb2YgMzIgYXJlIGVuY29kZWQgYXMgYSBzaGlmdCBvZiB6ZXJvICovCi0JICBpZiAoc2hpZnRfdmFsdWUgPT0gMzIpCi0JICAgIHNoaWZ0X3ZhbHVlID0gMDsKLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBzaGlmdF92YWx1ZSA8PCA2OwotCX0KLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKTsKLSAgICB9Ci0gIAotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXRodW1iX21vdl9jb21wYXJlIChzdHIsIG1vdmUpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBtb3ZlOwotewotICBpbnQgUmQsIFJzID0gRkFJTDsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKChScyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChScyAhPSBGQUlMKQotICAgIHsKLSAgICAgIGlmIChScyA8IDggJiYgUmQgPCA4KQotCXsKLQkgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCi0JICAgIC8qIEEgbW92ZSBvZiB0d28gbG93cmVncyBpcyBlbmNvZGVkIGFzIEFERCBSZCwgUnMsICMwCi0JICAgICAgIHNpbmNlIGEgTU9WIGluc3RydWN0aW9uIHByb2R1Y2VzIHVucHJlZGljdGFibGUgcmVzdWx0cyAqLwotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQUREX0kzOwotCSAgZWxzZQotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0xSOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG1vdmUgPT0gVEhVTUJfTU9WRSkKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9IUjsKLQkgIGVsc2UKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0NNUF9IUjsKLQotCSAgaWYgKFJkID4gNykKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMTsKLQotCSAgaWYgKFJzID4gNykKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMjsKLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgJiA3KSB8ICgoUnMgJiA3KSA8PCAzKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKFJkID4gNykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygib25seSBsbyByZWdzIGFsbG93ZWQgd2l0aCBpbW1lZGlhdGUiKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9JODsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0k4OwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9JTU07Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmICh2YWx1ZSA+IDI1NSkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIGltbWVkaWF0ZSIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHZhbHVlOwotCX0KLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHVtYl9sb2FkX3N0b3JlIChzdHIsIGxvYWRfc3RvcmUsIHNpemUpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBsb2FkX3N0b3JlOwotICAgICBpbnQgICAgc2l6ZTsKLXsKLSAgaW50IFJkLCBSYiwgUm8gPSBGQUlMOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3RyID09ICdbJykKLSAgICB7Ci0gICAgICBzdHIrKzsKLSAgICAgIGlmICgoUmIgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotCXJldHVybjsKLQotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgIT0gRkFJTCkKLQl7Ci0JICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JICAgIHsKLQkgICAgICBzdHIrKzsKLQkgICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JCXJldHVybjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKFJvID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQotCSAgICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QucmVsb2MuZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyID0gMDsKLQl9Ci0KLSAgICAgIGlmICgqc3RyICE9ICddJykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiZXhwZWN0ZWQgJ10nIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc3RyKys7Ci0gICAgfQotICBlbHNlIGlmICgqc3RyID09ICc9JykKLSAgICB7Ci0gICAgICAvKiBQYXJzZSBhbiAibGRyIFJkLCA9ZXhwciIgaW5zdHJ1Y3Rpb247IHRoaXMgaXMgYW5vdGhlciBwc2V1ZG8gb3AgKi8KLSAgICAgIHN0cisrOwotCi0gICAgICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotCXJldHVybjsKLQotICAgICAgZW5kX29mX2xpbmUgKHN0cik7Ci0gICAgICAKLSAgICAgIGlmICggICBpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkgICYmIGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgaW5zdC5lcnJvciA9ICJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIjsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkgICYmICgoaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyICYgfjB4RkYpID09IDApKQotCXsKLQkgIC8qIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIG1vdiBpbnN0cnVjdGlvbiAqLwotCi0JICBpbnN0Lmluc3RydWN0aW9uICA9IFRfT1BDT0RFX01PVl9JOCB8IChSZCA8PCA4KTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCSAgcmV0dXJuOyAKLQl9Ci0KLSAgICAgIC8qIEluc2VydCBpbnRvIGxpdGVyYWwgcG9vbCAqLyAgICAgCi0gICAgICBpZiAoYWRkX3RvX2xpdF9wb29sICgpID09IEZBSUwpCi0JewotCSAgaWYgKCFpbnN0LmVycm9yKQotCSAgICBpbnN0LmVycm9yID0gImxpdGVyYWwgcG9vbCBpbnNlcnRpb24gZmFpbGVkIjsgCi0JICByZXR1cm47Ci0JfQotCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiAgPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgKz0gNDsgLyogQWRqdXN0IEFSTSBwaXBlbGluZSBvZmZzZXQgdG8gVGh1bWIgKi8KLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7Ci0gICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gNDsgLyogUGlwZWxpbmUgb2Zmc2V0ICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICAgIGVuZF9vZl9saW5lIChzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoUmIgPT0gUkVHX1BDIHx8IFJiID09IFJFR19TUCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZSAhPSBUSFVNQl9XT1JEKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJieXRlIG9yIGhhbGZ3b3JkIG5vdCB2YWxpZCBmb3IgYmFzZSByZWdpc3RlciIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKFJiID09IFJFR19QQyAmJiBsb2FkX3N0b3JlICE9IFRIVU1CX0xPQUQpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIlIxNSBiYXNlZCBzdG9yZSBub3QgYWxsb3dlZCIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKFJvICE9IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgYmFzZSByZWdpc3RlciBmb3IgcmVnaXN0ZXIgb2Zmc2V0Iik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoUmIgPT0gUkVHX1BDKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEM7Ci0gICAgICBlbHNlIGlmIChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xEUl9TUDsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfU1RSX1NQOwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7Ci0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHVuc2lnbmVkIG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKG9mZnNldCAmIH4weDNmYykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIG9mZnNldCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IG9mZnNldCA+PiAyOwotCX0KLSAgICAgIGVsc2UKLQlpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICB9Ci0gIGVsc2UgaWYgKFJiID4gNykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBiYXNlIHJlZ2lzdGVyIGluIGxvYWQvc3RvcmUiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKFJvID09IEZBSUwpCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIG9mZnNldCAqLwotICAgICAgaWYgKHNpemUgPT0gVEhVTUJfV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX0lXIDogVF9PUENPREVfU1RSX0lXKTsKLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gVEhVTUJfSEFMRldPUkQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9JSCA6IFRfT1BDT0RFX1NUUl9JSCk7Ci0gICAgICBlbHNlCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9JQiA6IFRfT1BDT0RFX1NUUl9JQik7Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMyk7Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgdW5zaWduZWQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCSAgCi0JICBpZiAob2Zmc2V0ICYgfigweDFmIDw8IHNpemUpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgb2Zmc2V0Iik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChvZmZzZXQgPj4gc2l6ZSkgPDwgNjsKLQl9Ci0gICAgICBlbHNlCi0JaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0ICovCi0gICAgICBpZiAoc2l6ZSA9PSBUSFVNQl9XT1JEKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECi0JCQkgICAgPyBUX09QQ09ERV9MRFJfUlcgOiBUX09QQ09ERV9TVFJfUlcpOwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSBUSFVNQl9IQUxGV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX1JIIDogVF9PUENPREVfU1RSX1JIKTsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX1JCIDogVF9PUENPREVfU1RSX1JCKTsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChSYiA8PCAzKSB8IChSbyA8PCA2KTsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X25vcCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICAvKiBEbyBub3RoaW5nICovCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLS8qIEhhbmRsZSB0aGUgRm9ybWF0IDQgaW5zdHJ1Y3Rpb25zIHRoYXQgZG8gbm90IGhhdmUgZXF1aXZhbGVudHMgaW4gb3RoZXIgCi0gICBmb3JtYXRzLiAgVGhhdCBpcywgQURDLCBBTkQsIEVPUiwgU0JDLCBST1IsIFRTVCwgTkVHLCBDTU4sIE9SUiwgTVVMLAotICAgQklDIGFuZCBNVk4uICAqLwotc3RhdGljIHZvaWQKLWRvX3RfYXJpdCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBpbnQgUmQsIFJzLCBSbjsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAoUnMgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0gICAgewotICAgIAlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICAJcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSAhPSBGQUlMKQotICAgIHsKLSAgICAgIC8qIFRocmVlIG9wZXJhbmQgZm9ybWF0IG5vdCBhbGxvd2VkIGZvciBUU1QsIENNTiwgTkVHIGFuZCBNVk4uCi0JIChJdCBpc24ndCBhbGxvd2VkIGZvciBDTVAgZWl0aGVyLCBidXQgdGhhdCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMKLQkgZnVuY3Rpb24uKSAgKi8KLSAgICAgIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX1RTVAotCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9DTU4KLQkgIHx8IGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfTkVHCi0gCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9NVk4pCi0JewotCSAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKChSbiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChScyAhPSBSZCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiZGVzdCBhbmQgc291cmNlMSBvbmUgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIFJzID0gUm47Ci0gICAgfQotCi0gIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX01VTAotICAgICAgJiYgUnMgPT0gUmQpCi0gICAgYXNfdHNrdHNrIChfKCJScyBhbmQgUmQgbXVzdCBiZSBkaWZmZXJlbnQgaW4gTVVMIikpOwotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9hZGQgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfYWRkX3N1YiAoc3RyLCAwKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYXNyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0FTUik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDkgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDEyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjsKLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotLyogRmluZCB0aGUgcmVhbCwgVGh1bWIgZW5jb2RlZCBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIHN5bWJvbFMgKgotZmluZF9yZWFsX3N0YXJ0IChzeW1ib2xQKQotICAgICBzeW1ib2xTICogc3ltYm9sUDsKLXsKLSAgY2hhciAqICAgICAgIHJlYWxfc3RhcnQ7Ci0gIGNvbnN0IGNoYXIgKiBuYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gIHN5bWJvbFMgKiAgICBuZXdfdGFyZ2V0OwotCi0gIC8qIFRoaXMgZGVmaW5pdG9uIG11c3QgYWdyZWUgd2l0aCB0aGUgb25lIGluIGdjYy9jb25maWcvYXJtL3RodW1iLmMgKi8KLSNkZWZpbmUgU1RVQl9OQU1FICIucmVhbF9zdGFydF9vZiIKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIGFib3J0KCk7Ci0KLSAgLyogTmFtZXMgdGhhdCBzdGFydCB3aXRoICcuJyBhcmUgbG9jYWwgbGFiZWxzLCBub3QgZnVuY3Rpb24gZW50cnkgcG9pbnRzLgotICAgICBUaGUgY29tcGlsZXIgbWF5IGdlbmVyYXRlIEJMIGluc3RydWN0aW9ucyB0byB0aGVzZSBsYWJlbHMgYmVjYXVzZSBpdAotICAgICBuZWVkcyB0byBwZXJmb3JtIGEgYnJhbmNoIHRvIGEgZmFyIGF3YXkgbG9jYXRpb24uICAqLwotICBpZiAobmFtZVswXSA9PSAnLicpCi0gICAgcmV0dXJuIHN5bWJvbFA7Ci0gIAotICByZWFsX3N0YXJ0ID0gbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChTVFVCX05BTUUpICsgMSk7Ci0gIHNwcmludGYgKHJlYWxfc3RhcnQsICIlcyVzIiwgU1RVQl9OQU1FLCBuYW1lKTsKLQotICBuZXdfdGFyZ2V0ID0gc3ltYm9sX2ZpbmQgKHJlYWxfc3RhcnQpOwotICAKLSAgaWYgKG5ld190YXJnZXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuICgiRmFpbGVkIHRvIGZpbmQgcmVhbCBzdGFydCBvZiBmdW5jdGlvbjogJXNcbiIsIG5hbWUpOwotICAgICAgbmV3X3RhcmdldCA9IHN5bWJvbFA7Ci0gICAgfQotCi0gIGZyZWUgKHJlYWxfc3RhcnQpOwotCi0gIHJldHVybiBuZXdfdGFyZ2V0OwotfQotCi0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDIzIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotICAgIHJldHVybjsKLSAgCi0gIGluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzOwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotCi0gIC8qIElmIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoIGlzIGEgZGVmaW5lZCBzeW1ib2wgd2hpY2ggZG9lcyBub3QgaGF2ZQotICAgICB0aGUgVEhVTUJfRlVOQyBhdHRyaWJ1dGUsIHRoZW4gd2UgbXVzdCBiZSBjYWxsaW5nIGEgZnVuY3Rpb24gd2hpY2ggaGFzCi0gICAgIHRoZSAoaW50ZXJmYWNlYXJtKSBhdHRyaWJ1dGUuICBXZSBsb29rIGZvciB0aGUgVGh1bWIgZW50cnkgcG9pbnQgdG8gdGhhdAotICAgICBmdW5jdGlvbiBhbmQgY2hhbmdlIHRoZSBicmFuY2ggdG8gcmVmZXIgdG8gdGhhdCBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLSAgaWYgKCAgIGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICYmIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0gICAgICAmJiBTX0lTX0RFRklORUQgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCkKLSAgICAgICYmICEgVEhVTUJfSVNfRlVOQyAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKSkKLSAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wgPSBmaW5kX3JlYWxfc3RhcnQgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2J4IChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCByZWc7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmVnID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhpcyBzZXRzIFRIVU1CX0gyIGZyb20gdGhlIHRvcCBiaXQgb2YgcmVnLiAgKi8KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgMzsKLQotICAvKiA/Pz8gRklYTUU6IFNob3VsZCBhZGQgYSBoYWNreSByZWxvYyBoZXJlIGlmIHJlZyBpcyBSRUdfUEMuICBUaGUgcmVsb2MKLSAgICAgc2hvdWxkIGNhdXNlIHRoZSBhbGlnbm1lbnQgdG8gYmUgY2hlY2tlZCBvbmNlIGl0IGlzIGtub3duLiAgVGhpcyBpcwotICAgICBiZWNhdXNlIEJYIFBDIG9ubHkgd29ya3MgaWYgdGhlIGluc3RydWN0aW9uIGlzIHdvcmQgYWxpZ25lZC4gICovCi0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2NvbXBhcmUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbW92X2NvbXBhcmUgKHN0ciwgVEhVTUJfQ09NUEFSRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2xkbXN0bSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBpbnQgUmI7Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgoUmIgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmICgqc3RyICE9ICchJykKLSAgICBhc193YXJuIChfKCJJbnNlcnRlZCBtaXNzaW5nICchJzogbG9hZC9zdG9yZSBtdWx0aXBsZSBhbHdheXMgd3JpdGVzIGJhY2sgYmFzZSByZWdpc3RlciIpKTsKLSAgZWxzZQotICAgIHN0cisrOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MudHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHJlYWxseSBkb2Vzbid0IHNlZW0gd29ydGggaXQuICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJFeHByZXNzaW9uIHRvbyBjb21wbGV4Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyYW5nZSAmIH4weGZmKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJvbmx5IGxvLXJlZ3MgdmFsaWQgaW4gbG9hZC9zdG9yZSBtdWx0aXBsZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IChSYiA8PCA4KSB8IHJhbmdlOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX2xvYWRfc3RvcmUgKHN0ciwgVEhVTUJfTE9BRCwgVEhVTUJfV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2xkcmIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9MT0FELCBUSFVNQl9CWVRFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRyaCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX0xPQUQsIFRIVU1CX0hBTEZXT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRzIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCBSZCwgUmIsIFJvOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8ICpzdHIrKyAhPSAnWycKLSAgICAgIHx8IChSYiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAoUm8gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKLSAgICAgIHx8ICpzdHIrKyAhPSAnXScpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gXygiU3ludGF4OiBsZHJzW2JdIFJkLCBbUmIsIFJvXSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJiIDw8IDMpIHwgKFJvIDw8IDYpOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbHNsIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0xTTCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2xzciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9zaGlmdCAoc3RyLCBUSFVNQl9MU1IpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9tb3YgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbW92X2NvbXBhcmUgKHN0ciwgVEhVTUJfTU9WRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3B1c2hfcG9wIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmFuZ2UgPSByZWdfbGlzdCAoJnN0cikpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnN0LnJlbG9jLnR5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgewotICAgICAgLyogVGhpcyByZWFsbHkgZG9lc24ndCBzZWVtIHdvcnRoIGl0LiAqLwotICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBpbnN0LmVycm9yID0gXygiRXhwcmVzc2lvbiB0b28gY29tcGxleCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmFuZ2UgJiB+MHhmZikKLSAgICB7Ci0gICAgICBpZiAoKGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfUFVTSAotCSAgICYmIChyYW5nZSAmIH4weGZmKSA9PSAxIDw8IFJFR19MUikKLQkgIHx8IChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX1BPUAotCSAgICAgICYmIChyYW5nZSAmIH4weGZmKSA9PSAxIDw8IFJFR19QQykpCi0JewotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9QUF9QQ19MUjsKLQkgIHJhbmdlICY9IDB4ZmY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QgdG8gcHVzaC9wb3AgaW5zdHJ1Y3Rpb24iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcmFuZ2U7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9zdHIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9TVE9SRSwgVEhVTUJfV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N0cmIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9TVE9SRSwgVEhVTUJfQllURSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N0cmggKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9TVE9SRSwgVEhVTUJfSEFMRldPUkQpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9zdWIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfYWRkX3N1YiAoc3RyLCAxKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfc3dpIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgcmV0dXJuOwotCi0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fU1dJOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9hZHIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaW50IHJlZzsKLQotICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHIgcmQsIGxhYmVsIiB0byBiZSBjb252ZXJ0ZWQKLSAgICAgaW50byBhIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlIGZvcm0gImFkZCByZCwgcGMsICNsYWJlbC0uLTQiLiAgKi8KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIC8qIFN0b3JlIFJkIGluIHRlbXBvcmFyeSBsb2NhdGlvbiBpbnNpZGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA0KSkgPT0gRkFJTAotICAgICAgfHwgKHJlZyA+IDcpICAvKiBGb3IgVGh1bWIgcmVnIG11c3QgYmUgcjAuLnI3LiAgKi8KLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgbXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9BREQ7Ci0gIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA0OyAvKiBQQyByZWxhdGl2ZSBhZGp1c3QuICAqLwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUkVHX1BDOyAvKiBSZCBpcyBhbHJlYWR5IHBsYWNlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIAotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9yZWcgKGVudHJ5KQotICAgICBpbnQgZW50cnk7Ci17Ci0gIGludCAgICBsZW4gPSBzdHJsZW4gKHJlZ190YWJsZVtlbnRyeV0ubmFtZSkgKyAyOwotICBjaGFyICogYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgY2hhciAqIGJ1ZjIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBpbnQgICAgaSA9IDA7Ci0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLSAgYnVmW2krK10gPSBSRUdJU1RFUl9QUkVGSVg7Ci0jZW5kaWYKLQotICBzdHJjcHkgKGJ1ZiArIGksIHJlZ190YWJsZVtlbnRyeV0ubmFtZSk7Ci0KLSAgZm9yIChpID0gMDsgYnVmW2ldOyBpKyspCi0gICAgYnVmMltpXSA9IGlzbG93ZXIgKGJ1ZltpXSkgPyB0b3VwcGVyIChidWZbaV0pIDogYnVmW2ldOwotCi0gIGJ1ZjJbaV0gPSAnXDAnOwotCi0gIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmLCAoUFRSKSAmcmVnX3RhYmxlW2VudHJ5XSk7Ci0gIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmMiwgKFBUUikgJnJlZ190YWJsZVtlbnRyeV0pOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3JlZ19hbGlhcyAoc3RyLCByZWdudW0pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgc3RydWN0IHJlZ19lbnRyeSAqbmV3ID0KLSAgICAoc3RydWN0IHJlZ19lbnRyeSAqKXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlZ19lbnRyeSkpOwotICBjaGFyICpuYW1lID0geG1hbGxvYyAoc3RybGVuIChzdHIpICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgc3RyKTsKLQotICBuZXctPm5hbWUgPSBuYW1lOwotICBuZXctPm51bWJlciA9IHJlZ251bTsKLQotICBoYXNoX2luc2VydCAoYXJtX3JlZ19oc2gsIG5hbWUsIChQVFIpIG5ldyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfY29uc3RhbnRfZmxvbnVtcyAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT0FUX1ZBTFM7IGkrKykKLSAgICBpZiAoYXRvZl9pZWVlICgoY2hhciAqKWZwX2NvbnN0W2ldLCAneCcsIGZwX3ZhbHVlc1tpXSkgPT0gTlVMTCkKLSAgICAgIGFib3J0ICgpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICB1bnNpZ25lZCBtYWNoOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgCi0gIGlmICggICAoYXJtX29wc19oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTAotICAgICAgfHwgKGFybV90b3BzX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX2NvbmRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fc2hpZnRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fcmVnX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX3Bzcl9oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIikpOwotICAgIAotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChpbnNucykgLyBzaXplb2YgKHN0cnVjdCBhc21fb3Bjb2RlKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fb3BzX2hzaCwgaW5zbnNbaV0udGVtcGxhdGUsIChQVFIpIChpbnNucyArIGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGluc25zKSAvIHNpemVvZiAoc3RydWN0IHRodW1iX29wY29kZSk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3RvcHNfaHNoLCB0aW5zbnNbaV0udGVtcGxhdGUsIChQVFIpICh0aW5zbnMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvbmRzKSAvIHNpemVvZiAoc3RydWN0IGFzbV9jb25kKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fY29uZF9oc2gsIGNvbmRzW2ldLnRlbXBsYXRlLCAoUFRSKSAoY29uZHMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNoaWZ0KSAvIHNpemVvZiAoc3RydWN0IGFzbV9zaGlmdCk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3NoaWZ0X2hzaCwgc2hpZnRbaV0udGVtcGxhdGUsIChQVFIpIChzaGlmdCArIGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHNycykgLyBzaXplb2YgKHN0cnVjdCBhc21fcHNyKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fcHNyX2hzaCwgcHNyc1tpXS50ZW1wbGF0ZSwgKFBUUikgKHBzcnMgKyBpKSk7Ci0KLSAgZm9yIChpID0gMDsgcmVnX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICBpbnNlcnRfcmVnIChpKTsKLQotICBzZXRfY29uc3RhbnRfZmxvbnVtcyAoKTsKLQotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotICAgIAotICAgIC8qIFNldCB0aGUgZmxhZ3MgaW4gdGhlIHByaXZhdGUgc3RydWN0dXJlLiAgKi8KLSAgICBpZiAodXNlc19hcGNzXzI2KSAgICAgIGZsYWdzIHw9IEZfQVBDUzI2OwotICAgIGlmIChzdXBwb3J0X2ludGVyd29yaykgZmxhZ3MgfD0gRl9JTlRFUldPUks7Ci0gICAgaWYgKHVzZXNfYXBjc19mbG9hdCkgICBmbGFncyB8PSBGX0FQQ1NfRkxPQVQ7Ci0gICAgaWYgKHBpY19jb2RlKSAgICAgICAgICBmbGFncyB8PSBGX1BJQzsKLSAgICBpZiAoKGNwdV92YXJpYW50ICYgRlBVX0FMTCkgPT0gRlBVX05PTkUpIGZsYWdzIHw9IEZfU09GVF9GTE9BVDsKLQotICAgIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyAoc3Rkb3V0cHV0LCBmbGFncyk7Ci0gIH0KLSNlbmRpZgotICAKLSAgLyogUmVjb3JkIHRoZSBDUFUgdHlwZSBhcyB3ZWxsLiAgKi8KLSAgc3dpdGNoIChjcHVfdmFyaWFudCAmIEFSTV9DUFVfTUFTSykKLSAgICB7Ci0gICAgY2FzZSBBUk1fMjoKLSAgICAgIG1hY2ggPSBiZmRfbWFjaF9hcm1fMjsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBBUk1fMzogCQkvKiBBbHNvIEFSTV8yNTAuICAqLwotICAgICAgbWFjaCA9IGJmZF9tYWNoX2FybV8yYTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEFSTV82IHwgQVJNXzMgfCBBUk1fMjoJLyogQWN0dWFsbHkgbm8gQ1BVIHR5cGUgZGVmaW5lZC4gICovCi0gICAgICBtYWNoID0gYmZkX21hY2hfYXJtXzQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQVJNXzc6IAkJLyogQWxzbyBBUk1fNi4gICovCi0gICAgICBtYWNoID0gYmZkX21hY2hfYXJtXzM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICAvKiBDYXRjaCBzcGVjaWFsIGNhc2VzLiAgKi8KLSAgaWYgKGNwdV92YXJpYW50ICE9IChGUFVfREVGQVVMVCB8IENQVV9ERUZBVUxUKSkKLSAgICB7Ci0gICAgICBpZiAoY3B1X3ZhcmlhbnQgJiAoQVJNX0VYVF9WNSAmIEFSTV9USFVNQikpCi0JbWFjaCA9IGJmZF9tYWNoX2FybV81VDsKLSAgICAgIGVsc2UgaWYgKGNwdV92YXJpYW50ICYgQVJNX0VYVF9WNSkKLQltYWNoID0gYmZkX21hY2hfYXJtXzU7Ci0gICAgICBlbHNlIGlmIChjcHVfdmFyaWFudCAmIEFSTV9USFVNQikKLQltYWNoID0gYmZkX21hY2hfYXJtXzRUOwotICAgICAgZWxzZSBpZiAoKGNwdV92YXJpYW50ICYgQVJNX0FSQ0hfVjQpID09IEFSTV9BUkNIX1Y0KQotCW1hY2ggPSBiZmRfbWFjaF9hcm1fNDsKLSAgICAgIGVsc2UgaWYgKGNwdV92YXJpYW50ICYgQVJNX0xPTkdNVUwpCi0JbWFjaCA9IGJmZF9tYWNoX2FybV8zTTsKLSAgICB9Ci0gIAotICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBUQVJHRVRfQVJDSCwgbWFjaCk7Ci19Ci0KLS8qIFR1cm4gYW4gaW50ZWdlciBvZiBuIGJ5dGVzIChpbiB2YWwpIGludG8gYSBzdHJlYW0gb2YgYnl0ZXMgYXBwcm9wcmlhdGUKLSAgIGZvciB1c2UgaW4gdGhlIGEub3V0IGZpbGUsIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSBidWYuCi0gICBUaGlzIGtub3dzIGFib3V0IHRoZSBlbmRpYW4tbmVzcyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUgYW5kIGRvZXMKLSAgIFRIRSBSSUdIVCBUSElORywgd2hhdGV2ZXIgaXQgaXMuICBQb3NzaWJsZSB2YWx1ZXMgZm9yIG4gYXJlIDEgKGJ5dGUpCi0gICAyIChzaG9ydCkgYW5kIDQgKGxvbmcpICBGbG9hdGluZyBudW1iZXJzIGFyZSBwdXQgb3V0IGFzIGEgc2VyaWVzIG9mCi0gICBMSVRUTEVOVU1TIChzaG9ydHMsIGhlcmUgYXQgbGVhc3QpLiAgKi8KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCAgICBuOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi1zdGF0aWMgdmFsdWVUIAotbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIGludCBuOwotewotICB2YWx1ZVQgcmVzdWx0ID0gMDsKLSAgdW5zaWduZWQgY2hhciAqIHdoZXJlID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIHJlc3VsdCA8PD0gODsKLQkgIHJlc3VsdCB8PSAoKndoZXJlKysgJiAyNTUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAobi0tKQotCXsKLQkgIHJlc3VsdCA8PD0gODsKLQkgIHJlc3VsdCB8PSAod2hlcmVbbl0gJiAyNTUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIFRZUEUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLQotICAgTm90ZSB0aGF0IGZwIGNvbnN0YW50cyBhcmVuJ3QgcmVwcmVzZW50IGluIHRoZSBub3JtYWwgd2F5IG9uIHRoZSBBUk0uCi0gICBJbiBiaWcgZW5kaWFuIG1vZGUsIHRoaW5ncyBhcmUgYXMgZXhwZWN0ZWQuICBIb3dldmVyLCBpbiBsaXR0bGUgZW5kaWFuCi0gICBtb2RlIGZwIGNvbnN0YW50cyBhcmUgYmlnLWVuZGlhbiB3b3JkLXdpc2UsIGFuZCBsaXR0bGUtZW5kaWFuIGJ5dGUtd2lzZQotICAgd2l0aGluIHRoZSB3b3Jkcy4gIEZvciBleGFtcGxlLCAoZG91YmxlKSAxLjEgaW4gYmlnIGVuZGlhbiBtb2RlIGlzCi0gICB0aGUgYnl0ZSBzZXF1ZW5jZSAzZiBmMSA5OSA5OSA5OSA5OSA5OSA5YSwgYW5kIGluIGxpdHRsZSBlbmRpYW4gbW9kZSBpcwotICAgdGhlIGJ5dGUgc2VxdWVuY2UgOTkgOTkgZjEgM2YgOWEgOTkgOTkgOTkuCi0KLSAgID8/PyBUaGUgZm9ybWF0IG9mIDEyIGJ5dGUgZmxvYXRzIGlzIHVuY2VydGFpbiBhY2NvcmRpbmcgdG8gZ2NjJ3MgYXJtLmguICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyICAgdHlwZTsKLSAgICAgY2hhciAqIGxpdFA7Ci0gICAgIGludCAqICBzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiAyOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3IgYSA0IGJ5dGUgZmxvYXQgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGluIGB3b3JkcycgaXMgMSAwLiAgRm9yIGFuCi0JIDggYnl0ZSBmbG9hdCB0aGUgb3JkZXIgaXMgMSAwIDMgMi4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSArPSAyKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaSArIDFdLCAyKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCArIDIsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gNDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGUga25vd2xlZGdlIG9mIHRoZSBQQydzIHBpcGVsaW5lIG9mZnNldCBpcyBidWlsdCBpbnRvIHRoZSBpbnNucyB0aGVtc2VsdmVzLiAgKi8gCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICogZml4UDsKLXsKLSAgaWYgKCAgIGZpeFAtPmZ4X2FkZHN5Ci0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLSAgICAgICYmIGZpeFAtPmZ4X3N1YnN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBpZiAoZml4UC0+ZnhfcGNyZWwgJiYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCkpCi0gICAgewotICAgICAgLyogUEMgcmVsYXRpdmUgYWRkcmVzc2luZyBvbiB0aGUgVGh1bWIgaXMgc2xpZ2h0bHkgb2RkCi0JIGFzIHRoZSBib3R0b20gdHdvIGJpdHMgb2YgdGhlIFBDIGFyZSBmb3JjZWQgdG8gemVybwotCSBmb3IgdGhlIGNhbGN1bGF0aW9uLiAgKi8KLSAgICAgIHJldHVybiAoZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzKSAmIH4zOwotICAgIH0KLQotI2lmZGVmIFRFX1dJTkNFCi0gIC8qIFRoZSBwYXR0ZXJuIHdhcyBhZGp1c3RlZCB0byBhY2NvbW9kYXRlIENFJ3Mgb2ZmLWJ5LW9uZSBmaXh1cHMsCi0gICAgIHNvIHdlIHVuLWFkanVzdCBoZXJlIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBhY2NvbW9kYXRpb24uICAqLwotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgODsKLSNlbHNlCi0gIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUICAgc2VnbWVudCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIHJldHVybiBzaXplOwotI2Vsc2UKLSAgLyogUm91bmQgYWxsIHNlY3RzIHRvIG11bHRpcGxlIG9mIDQgKi8KLSAgcmV0dXJuIChzaXplICsgMykgJiB+MzsKLSNlbmRpZgotfQotCi0vKiBVbmRlciBFTEYgd2UgbmVlZCB0byBkZWZhdWx0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFLiAgT3RoZXJ3aXNlIAotICAgd2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICogbmFtZTsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdID09ICdHJwotICAgICAgJiYgc3RyZXEgKG5hbWUsIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSkpCi0gICAgewotICAgICAgaWYgKCFHT1Rfc3ltYm9sKQotCXsKLQkgIGlmIChzeW1ib2xfZmluZCAobmFtZSkpCi0JICAgIGFzX2JhZCAoIkdPVCBhbHJlYWR5IGluIHRoZSBzeW1ib2wgdGFibGUiKTsKLQkgIAotCSAgR09UX3N5bWJvbCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLAotCQkJCSAgICh2YWx1ZVQpMCwgJiB6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JfQotICAgICAgCi0gICAgICByZXR1cm4gR09UX3N5bWJvbDsKLSAgICB9Ci0jZW5kaWYKLSAgCi0gIHJldHVybiAwOwotfQotCi0vKiBhcm1fcmVnX3BhcnNlICgpIDo9IGlmIGl0IGxvb2tzIGxpa2UgYSByZWdpc3RlciwgcmV0dXJuIGl0cyB0b2tlbiBhbmQgCi0gICBhZHZhbmNlIHRoZSBwb2ludGVyLiAqLwotCi1zdGF0aWMgaW50Ci1hcm1fcmVnX3BhcnNlIChjY3ApCi0gICAgIHJlZ2lzdGVyIGNoYXIgKiogY2NwOwotewotICBjaGFyICogc3RhcnQgPSAqIGNjcDsKLSAgY2hhciAgIGM7Ci0gIGNoYXIgKiBwOwotICBzdHJ1Y3QgcmVnX2VudHJ5ICogcmVnOwotCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0gIGlmICgqc3RhcnQgIT0gUkVHSVNURVJfUFJFRklYKQotICAgIHJldHVybiBGQUlMOwotICBwID0gc3RhcnQgKyAxOwotI2Vsc2UKLSAgcCA9IHN0YXJ0OwotI2lmZGVmIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWAotICBpZiAoKnAgPT0gT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYKQotICAgIHArKywgc3RhcnQrKzsKLSNlbmRpZgotI2VuZGlmCi0gIGlmICghaXNhbHBoYSAoKnApIHx8ICFpc19uYW1lX2JlZ2lubmVyICgqcCkpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgYyA9ICpwKys7Ci0gIHdoaWxlIChpc2FscGhhIChjKSB8fCBpc2RpZ2l0IChjKSB8fCBjID09ICdfJykKLSAgICBjID0gKnArKzsKLQotICAqLS1wID0gMDsKLSAgcmVnID0gKHN0cnVjdCByZWdfZW50cnkgKikgaGFzaF9maW5kIChhcm1fcmVnX2hzaCwgc3RhcnQpOwotICAqcCA9IGM7Ci0gIAotICBpZiAocmVnKQotICAgIHsKLSAgICAgICpjY3AgPSBwOwotICAgICAgcmV0dXJuIHJlZy0+bnVtYmVyOwotICAgIH0KLQotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotYXJtX3Bzcl9wYXJzZSAoY2NwKQotICAgICByZWdpc3RlciBjaGFyICoqIGNjcDsKLXsKLSAgY2hhciAqIHN0YXJ0ID0gKiBjY3A7Ci0gIGNoYXIgICBjOwotICBjaGFyICogcDsKLSAgQ09OU1Qgc3RydWN0IGFzbV9wc3IgKiBwc3I7Ci0KLSAgcCA9IHN0YXJ0OwotICBjID0gKnArKzsKLSAgd2hpbGUgKGlzYWxwaGEgKGMpIHx8IGMgPT0gJ18nKQotICAgIGMgPSAqcCsrOwotCi0gICotLXAgPSAwOyAgCi0gIHBzciA9IChDT05TVCBzdHJ1Y3QgYXNtX3BzciAqKSBoYXNoX2ZpbmQgKGFybV9wc3JfaHNoLCBzdGFydCk7Ci0gICpwID0gYzsKLQotICBpZiAocHNyKQotICAgIHsKLSAgICAgICpjY3AgPSBwOwotICAgICAgcmV0dXJuIHBzci0+bnVtYmVyOwotICAgIH0KLQotICByZXR1cm4gRkFJTDsKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWwsIHNlZykKLSAgICAgZml4UyAqICAgICAgZml4UDsKLSAgICAgdmFsdWVUICogICAgdmFsOwotICAgICBzZWdUICAgICAgICBzZWc7Ci17Ci0gIG9mZnNldFQgICAgICAgIHZhbHVlID0gKiB2YWw7Ci0gIG9mZnNldFQgICAgICAgIG5ld3ZhbDsKLSAgdW5zaWduZWQgaW50ICAgbmV3aW1tOwotICB1bnNpZ25lZCBsb25nICB0ZW1wOwotICBpbnQgICAgICAgICAgICBzaWduOwotICBjaGFyICogICAgICAgICBidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGFybV9maXhfZGF0YSAqIGFybV9kYXRhID0gKGFybV9maXhfZGF0YSAqKSBmaXhQLT50Y19maXhfZGF0YTsKLQotICBhc3NlcnQgKGZpeFAtPmZ4X3JfdHlwZSA8IEJGRF9SRUxPQ19VTlVTRUQpOwotCi0gIC8qIE5vdGUgd2hldGhlciB0aGlzIHdpbGwgZGVsZXRlIHRoZSByZWxvY2F0aW9uLiAgKi8KLSNpZiAwIC8qIHBhdGNoIGZyb20gUkVhcm5zaGF3IHRvIEpEYXZpcyAoZGlzYWJsZWQgZm9yIHRoZSBtb21lbnQsIHNpbmNlIGl0IGRvZXNuJ3Qgd29yayBmdWxseSkgKi8KLSAgaWYgKChmaXhQLT5meF9hZGRzeSA9PSAwIHx8IHN5bWJvbF9jb25zdGFudF9wIChmaXhQLT5meF9hZGRzeSkpCi0gICAgICAmJiAhZml4UC0+ZnhfcGNyZWwpCi0jZWxzZQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCAmJiAhZml4UC0+ZnhfcGNyZWwpCi0jZW5kaWYKLSAgICBmaXhQLT5meF9kb25lID0gMTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIHRoZW4gd2UgbmVlZCB0byBsZWF2ZSBpdCBmb3IKLSAgICAgdGhlIGxpbmtlciB0byBkZWFsIHdpdGguICBVbmZvcnR1bmF0ZWx5LCBtZF9wY3JlbF9mcm9tIGNhbid0IHRlbGwsCi0gICAgIHNvIHdlIGhhdmUgdG8gdW5kbyBpdCdzIGVmZmVjdHMgaGVyZS4gICovCi0gIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB7Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgJiYgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWcpCi0JewotCSAgaWYgKHRhcmdldF9vYWJpCi0JICAgICAgJiYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAotCQkpKQotCSAgICB2YWx1ZSA9IDA7Ci0JICBlbHNlCi0JICAgIHZhbHVlICs9IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotCX0KLSAgICB9Ci0KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7CS8qIFJlbWVtYmVyIHZhbHVlIGZvciBlbWl0X3JlbG9jLiAgKi8KLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURToKLSAgICAgIG5ld2ltbSA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsdWUpOwotICAgICAgdGVtcCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBmYWlsLCBzZWUgaWYgd2UgY2FuIGZpeCB0aGluZ3MgdXAgYnkKLQkgY2hhbmdpbmcgdGhlIG9wY29kZS4gICovCi0gICAgICBpZiAobmV3aW1tID09ICh1bnNpZ25lZCBpbnQpIEZBSUwKLQkgICYmIChuZXdpbW0gPSBuZWdhdGVfZGF0YV9vcCAoJnRlbXAsIHZhbHVlKSkgPT0gKHVuc2lnbmVkIGludCkgRkFJTCkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJpbnZhbGlkIGNvbnN0YW50ICglbHgpIGFmdGVyIGZpeHVwIiksCi0JCQkodW5zaWduZWQgbG9uZykgdmFsdWUpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBuZXdpbW0gfD0gKHRlbXAgJiAweGZmZmZmMDAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCAodmFsdWVUKSBuZXdpbW0sIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURToKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgaGlnaHBhcnQgPSAwOwotCXVuc2lnbmVkIGludCBuZXdpbnNuICA9IDB4ZTFhMDAwMDA7IC8qIG5vcCAqLwotCW5ld2ltbSA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsdWUpOwotCXRlbXAgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLQotCS8qIElmIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGZhaWwsIHNlZSBpZiB3ZSBjYW4gZml4IHRoaW5ncyB1cCBieQotCSAgIGNoYW5naW5nIHRoZSBvcGNvZGUuICAqLwotCWlmIChuZXdpbW0gPT0gKHVuc2lnbmVkIGludCkgRkFJTAotCSAgICAmJiAobmV3aW1tID0gbmVnYXRlX2RhdGFfb3AgKCYgdGVtcCwgdmFsdWUpKSA9PSAodW5zaWduZWQgaW50KSBGQUlMKQotCSAgewotCSAgICAvKiBObyA/ICBPSyAtIHRyeSB1c2luZyB0d28gQUREIGluc3RydWN0aW9ucyB0byBnZW5lcmF0ZSB0aGUgdmFsdWUuICAqLwotCSAgICBuZXdpbW0gPSB2YWxpZGF0ZV9pbW1lZGlhdGVfdHdvcGFydCAodmFsdWUsICYgaGlnaHBhcnQpOwotCi0JICAgIC8qIFllcyAtIHRoZW4gbWFrZSBzdXJlIHRoYXQgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBpcyBhbHNvIGFuIGFkZC4gICovCi0JICAgIGlmIChuZXdpbW0gIT0gKHVuc2lnbmVkIGludCkgRkFJTCkKLQkgICAgICBuZXdpbnNuID0gdGVtcDsKLQkgICAgLyogU3RpbGwgTm8gPyAgVHJ5IHVzaW5nIGEgbmVnYXRlZCB2YWx1ZS4gICovCi0JICAgIGVsc2UgaWYgKHZhbGlkYXRlX2ltbWVkaWF0ZV90d29wYXJ0ICgtIHZhbHVlLCAmIGhpZ2hwYXJ0KSAhPSAodW5zaWduZWQgaW50KSBGQUlMKQotCQl0ZW1wID0gbmV3aW5zbiA9ICh0ZW1wICYgT1BDT0RFX01BU0spIHwgT1BDT0RFX1NVQiA8PCBEQVRBX09QX1NISUZUOwotCSAgICAvKiBPdGhlcndpc2UgLSBnaXZlIHVwLiAgKi8KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgICAgXygiVW5hYmxlIHRvIGNvbXB1dGUgQURSTCBpbnN0cnVjdGlvbnMgZm9yIFBDIG9mZnNldCBvZiAweCV4IiksIHZhbHVlKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIC8qIFJlcGxhY2UgdGhlIGZpcnN0IG9wZXJhbmQgaW4gdGhlIDJuZCBpbnN0cnVjdGlvbiAod2hpY2ggaXMgdGhlIFBDKQotCSAgICAgICB3aXRoIHRoZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4gIFdlIGhhdmUgYWxyZWFkeSBhZGRlZCBpbiB0aGUgUEMgaW4gdGhlCi0JICAgICAgIGZpcnN0IGluc3RydWN0aW9uIGFuZCB3ZSBkbyBub3Qgd2FudCB0byBkbyBpdCBhZ2Fpbi4gICovCi0JICAgIG5ld2luc24gJj0gfiAweGYwMDAwOwotCSAgICBuZXdpbnNuIHw9ICgobmV3aW5zbiAmIDB4MGYwMDApIDw8IDQpOwotCSAgfQotCi0JbmV3aW1tIHw9ICh0ZW1wICYgMHhmZmZmZjAwMCk7Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsICh2YWx1ZVQpIG5ld2ltbSwgSU5TTl9TSVpFKTsKLQotCWhpZ2hwYXJ0IHw9IChuZXdpbnNuICYgMHhmZmZmZjAwMCk7Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYgKyBJTlNOX1NJWkUsICh2YWx1ZVQpIGhpZ2hwYXJ0LCBJTlNOX1NJWkUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTToKLSAgICAgIHNpZ24gPSB2YWx1ZSA+PSAwOwotICAgICAgCi0gICAgICBpZiAodmFsdWUgPCAwKQotCXZhbHVlID0gLSB2YWx1ZTsKLSAgICAgIAotICAgICAgaWYgKHZhbGlkYXRlX29mZnNldF9pbW0gKHZhbHVlLCAwKSA9PSBGQUlMKQotICAgICAgICB7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgXygiYmFkIGltbWVkaWF0ZSB2YWx1ZSBmb3Igb2Zmc2V0ICglbGQpIiksIChsb25nKSB2YWx1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBuZXd2YWwgJj0gMHhmZjdmZjAwMDsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSB8IChzaWduID8gSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg6Ci0gICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw6Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIAotICAgICAgaWYgKHZhbHVlIDwgMCkKLQl2YWx1ZSA9IC0gdmFsdWU7Ci0KLSAgICAgIGlmICh2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMSkgPT0gRkFJTCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCi0JCQlfKCJpbnZhbGlkIGxpdGVyYWwgY29uc3RhbnQ6IHBvb2wgbmVlZHMgdG8gYmUgY2xvc2VyIikpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX2JhZCAoXygiYmFkIGltbWVkaWF0ZSB2YWx1ZSBmb3IgaGFsZi13b3JkIG9mZnNldCAoJWxkKSIpLAotCQkgICAgKGxvbmcpIHZhbHVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG5ld3ZhbCAmPSAweGZmN2ZmMGYwOwotICAgICAgbmV3dmFsIHw9ICgodmFsdWUgPj4gNCkgPDwgOCkgfCAodmFsdWUgJiAweGYpIHwgKHNpZ24gPyBJTkRFWF9VUCA6IDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw6Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIAotICAgICAgaWYgKHZhbHVlIDwgMCkKLQl2YWx1ZSA9IC0gdmFsdWU7Ci0KLSAgICAgIGlmICh2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMCkgPT0gRkFJTCkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIAotCQkJXygiaW52YWxpZCBsaXRlcmFsIGNvbnN0YW50OiBwb29sIG5lZWRzIHRvIGJlIGNsb3NlciIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBuZXd2YWwgJj0gMHhmZjdmZjAwMDsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSB8IChzaWduID8gSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU06Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDMyCi0JICB8fCAodmFsdWUgPT0gMzIgCi0JICAgICAgJiYgKCgobmV3dmFsICYgMHg2MCkgPT0gMCkgfHwgKG5ld3ZhbCAmIDB4NjApID09IDB4NjApKSkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJzaGlmdCBleHByZXNzaW9uIGlzIHRvbyBsYXJnZSIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHZhbHVlID09IDApCi0JbmV3dmFsICY9IH4weDYwOwkvKiBTaGlmdHMgb2YgemVybyBtdXN0IGJlIGRvbmUgYXMgbHNsICovCi0gICAgICBlbHNlIGlmICh2YWx1ZSA9PSAzMikKLQl2YWx1ZSA9IDA7Ci0gICAgICBuZXd2YWwgJj0gMHhmZmZmZjA3ZjsKLSAgICAgIG5ld3ZhbCB8PSAodmFsdWUgJiAweDFmKSA8PCA3OwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TV0k6Ci0gICAgICBpZiAoYXJtX2RhdGEtPnRodW1iX21vZGUpCi0JewotCSAgaWYgKCgodW5zaWduZWQgbG9uZykgdmFsdWUpID4gMHhmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIHN3aSBleHByZXNzaW9uIikpOwotCSAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpICYgMHhmZjAwOwotCSAgbmV3dmFsIHw9IHZhbHVlOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4MDBmZmZmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCi0JCQkgIF8oIkludmFsaWQgc3dpIGV4cHJlc3Npb24iKSk7Ci0JICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKSAmIDB4ZmYwMDAwMDA7Ci0JICBuZXd2YWwgfD0gdmFsdWU7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9NVUxUSToKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4ZmZmZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkludmFsaWQgZXhwcmVzc2lvbiBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIikpOwotICAgICAgbmV3dmFsID0gdmFsdWUgfCBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g6Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLQotICAgICAgLyogU2lnbi1leHRlbmQgYSAyNC1iaXQgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU0VYVDI0KHgpCSgoKCh4KSAmIDB4ZmZmZmZmKSBeICh+IDB4N2ZmZmZmKSkgKyAweDgwMDAwMCkKLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGlmICghIHRhcmdldF9vYWJpKQotCXZhbHVlID0gZml4UC0+Znhfb2Zmc2V0OwotI2VuZGlmCi0KLSAgICAgIC8qIFdlIGFyZSBnb2luZyB0byBzdG9yZSB2YWx1ZSAoc2hpZnRlZCByaWdodCBieSB0d28pIGluIHRoZQotCSBpbnN0cnVjdGlvbiwgaW4gYSAyNCBiaXQsIHNpZ25lZCBmaWVsZC4gIFRodXMgd2UgbmVlZCB0byBjaGVjawotCSB0aGF0IG5vbmUgb2YgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIHNoaWZ0ZWQgdmFsdWUgKHRvcCA3IGJpdHMgb2YKLSAgICAgICAgIHRoZSB1bnNoaWZ0ZWQsIHVuc2lnbmVkIHZhbHVlKSBhcmUgc2V0LCBvciB0aGF0IHRoZXkgYXJlIGFsbCBzZXQuICAqLwotICAgICAgaWYgKCh2YWx1ZSAmIDB4ZmUwMDAwMDBVTCkgIT0gMAotCSAgJiYgKCh2YWx1ZSAmIDB4ZmUwMDAwMDBVTCkgIT0gMHhmZTAwMDAwMFVMKSkKLQl7Ci0jaWZkZWYgT0JKX0VMRgotCSAgLyogTm9ybWFsbHkgd2Ugd291bGQgYmUgc3R1Y2sgYXQgdGhpcyBwb2ludCwgc2luY2Ugd2UgY2Fubm90IHN0b3JlCi0JICAgICB0aGUgYWJzb2x1dGUgYWRkcmVzcyB0aGF0IGlzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoIGluIHRoZQotCSAgICAgMjQgYml0cyBvZiB0aGUgYnJhbmNoIGluc3RydWN0aW9uLiAgSWYgaG93ZXZlciwgd2UgaGFwcGVuIHRvIGtub3cKLQkgICAgIHRoYXQgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggaXMgaW4gdGhlIHNhbWUgc2VjdGlvbiBhcyB0aGUKLQkgICAgIGJyYW5jaCBpbnN0cnVjaXRvbiBpdHNlbGYsIHRoZW4gd2UgY2FuIGNvbXB1dGUgdGhlIHJlbG9jYXRpb24gZm9yCi0JICAgICBvdXJzZWx2ZXMgYW5kIG5vdCBoYXZlIHRvIGJvdGhlciB0aGUgbGlua2VyIHdpdGggaXQuCi0JICAgICAKLQkgICAgIEZJWE1FOiBUaGUgdGVzdHMgZm9yIE9CSl9FTEYgYW5kICEgdGFyZ2V0X29hYmkgYXJlIG9ubHkgaGVyZQotCSAgICAgYmVjYXVzZSBJIGhhdmUgbm90IHdvcmtlZCBvdXQgaG93IHRvIGRvIHRoaXMgZm9yIE9CSl9DT0ZGIG9yCi0JICAgICB0YXJnZXRfb2FiaS4gICovCi0JICBpZiAoISB0YXJnZXRfb2FiaQotCSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAgICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSA9PSBzZWcpCi0JICAgIHsKLQkgICAgICAvKiBHZXQgcGMgcmVsYXRpdmUgdmFsdWUgdG8gZ28gaW50byB0aGUgYnJhbmNoLiAgKi8KLQkgICAgICB2YWx1ZSA9ICogdmFsOwotCi0JICAgICAgLyogUGVybWl0IGEgYmFja3dhcmQgYnJhbmNoIHByb3ZpZGVkIHRoYXQgZW5vdWdoIGJpdHMgYXJlIHNldC4KLQkJIEFsbG93IGEgZm9yd2FyZHMgYnJhbmNoLCBwcm92aWRlZCB0aGF0IGVub3VnaCBiaXRzIGFyZSBjbGVhci4gICovCi0JICAgICAgaWYgKCh2YWx1ZSAmIDB4ZmUwMDAwMDBVTCkgPT0gMHhmZTAwMDAwMFVMCi0JCSAgfHwgKHZhbHVlICYgMHhmZTAwMDAwMFVMKSA9PSAwKQotCQlmaXhQLT5meF9kb25lID0gMTsKLQkgICAgfQotCSAgCi0JICBpZiAoISBmaXhQLT5meF9kb25lKQotI2VuZGlmCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiZ2FzIGNhbid0IGhhbmRsZSBzYW1lLXNlY3Rpb24gYnJhbmNoIGRlc3QgPj0gMHgwNDAwMDAwMCIpKTsKLQl9Ci0KLSAgICAgIHZhbHVlID4+PSAyOwotICAgICAgdmFsdWUgKz0gU0VYVDI0IChuZXd2YWwpOwotICAgICAgCi0gICAgICBpZiAoKHZhbHVlICYgMHhmZjAwMDAwMFVMKSAhPSAwCi0JICAmJiAoKHZhbHVlICYgMHhmZjAwMDAwMFVMKSAhPSAweGZmMDAwMDAwVUwpKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygib3V0IG9mIHJhbmdlIGJyYW5jaCIpKTsKLSAgICAgIAotICAgICAgbmV3dmFsID0gKHZhbHVlICYgMHgwMGZmZmZmZikgfCAobmV3dmFsICYgMHhmZjAwMDAwMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk6IC8qIGNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpOwotICAgICAgewotICAgICAgICBhZGRyZXNzVCBkaWZmID0gKG5ld3ZhbCAmIDB4ZmYpIDw8IDE7Ci0gICAgICAgIGlmIChkaWZmICYgMHgxMDApCi0gICAgICAgICBkaWZmIHw9IH4weGZmOwotCi0gICAgICAgIHZhbHVlICs9IGRpZmY7Ci0gICAgICAgIGlmICgodmFsdWUgJiB+MHhmZikgJiYgKCh2YWx1ZSAmIH4weGZmKSAhPSB+MHhmZikpCi0gICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIF8oIkJyYW5jaCBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgIG5ld3ZhbCA9IChuZXd2YWwgJiAweGZmMDApIHwgKCh2YWx1ZSAmIDB4MWZmKSA+PiAxKTsKLSAgICAgIH0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjogLyogdW5jb25kaXRpb25hbCBicmFuY2ggKi8KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIHsKLSAgICAgICAgYWRkcmVzc1QgZGlmZiA9IChuZXd2YWwgJiAweDdmZikgPDwgMTsKLSAgICAgICAgaWYgKGRpZmYgJiAweDgwMCkKLSAgICAgICAgIGRpZmYgfD0gfjB4N2ZmOwotCi0gICAgICAgIHZhbHVlICs9IGRpZmY7Ci0gICAgICAgIGlmICgodmFsdWUgJiB+MHg3ZmYpICYmICgodmFsdWUgJiB+MHg3ZmYpICE9IH4weDdmZikpCi0gICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIF8oIkJyYW5jaCBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgIG5ld3ZhbCA9IChuZXd2YWwgJiAweGY4MDApIHwgKCh2YWx1ZSAmIDB4ZmZmKSA+PiAxKTsKLSAgICAgIH0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMzoKLSAgICAgIHsKLSAgICAgICAgb2Zmc2V0VCBuZXd2YWwyOwotICAgICAgICBhZGRyZXNzVCBkaWZmOwotCi0JbmV3dmFsICA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgICAgbmV3dmFsMiA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmICsgVEhVTUJfU0laRSwgVEhVTUJfU0laRSk7Ci0gICAgICAgIGRpZmYgPSAoKG5ld3ZhbCAmIDB4N2ZmKSA8PCAxMikgfCAoKG5ld3ZhbDIgJiAweDdmZikgPDwgMSk7Ci0gICAgICAgIGlmIChkaWZmICYgMHg0MDAwMDApCi0JICBkaWZmIHw9IH4weDNmZmZmZjsKLSNpZmRlZiBPQkpfRUxGCi0JdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0jZW5kaWYKLSAgICAgICAgdmFsdWUgKz0gZGlmZjsKLSAgICAgICAgaWYgKCh2YWx1ZSAmIH4weDNmZmZmZikgJiYgKCh2YWx1ZSAmIH4weDNmZmZmZikgIT0gfjB4M2ZmZmZmKSkKLQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCV8oIkJyYW5jaCB3aXRoIGxpbmsgb3V0IG9mIHJhbmdlIikpOwotCi0gICAgICAgIG5ld3ZhbCAgPSAobmV3dmFsICAmIDB4ZjgwMCkgfCAoKHZhbHVlICYgMHg3ZmZmZmYpID4+IDEyKTsKLSAgICAgICAgbmV3dmFsMiA9IChuZXd2YWwyICYgMHhmODAwKSB8ICgodmFsdWUgJiAweGZmZikgPj4gMSk7Ci0gICAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIFRIVU1CX1NJWkUpOwotICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiArIFRIVU1CX1NJWkUsIG5ld3ZhbDIsIFRIVU1CX1NJWkUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAxKTsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDEpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSB8fCBmaXhQLT5meF9wY3JlbCkKLQltZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGVsc2UgaWYgKCF0YXJnZXRfb2FiaSkKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMik7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVDMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1RPRkY6Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIDAsIDQpOwotCWJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSB8fCBmaXhQLT5meF9wY3JlbCkKLQltZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDQpOwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGVsc2UgaWYgKCF0YXJnZXRfb2FiaSkKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgNCk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1BMVDMyOgotICAgICAgLyogSXQgYXBwZWFycyB0aGUgaW5zdHJ1Y3Rpb24gaXMgZnVsbHkgcHJlcGFyZWQgYXQgdGhpcyBwb2ludC4gKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UUEM6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTToKLSAgICAgIHNpZ24gPSB2YWx1ZSA+PSAwOwotICAgICAgaWYgKHZhbHVlIDwgLTEwMjMgfHwgdmFsdWUgPiAxMDIzIHx8ICh2YWx1ZSAmIDMpKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygiSWxsZWdhbCB2YWx1ZSBmb3IgY28tcHJvY2Vzc29yIG9mZnNldCIpKTsKLSAgICAgIGlmICh2YWx1ZSA8IDApCi0JdmFsdWUgPSAtdmFsdWU7Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKSAmIDB4ZmY3ZmZmMDA7Ci0gICAgICBuZXd2YWwgfD0gKHZhbHVlID4+IDIpIHwgKHNpZ24gPyAgSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOgotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpOwotICAgICAgLyogRXhhY3RseSB3aGF0IHJhbmdlcywgYW5kIHdoZXJlIHRoZSBvZmZzZXQgaXMgaW5zZXJ0ZWQgZGVwZW5kcyBvbgotCSB0aGUgdHlwZSBvZiBpbnN0cnVjdGlvbiwgd2UgY2FuIGVzdGFibGlzaCB0aGlzIGZyb20gdGhlIHRvcCA0IGJpdHMgKi8KLSAgICAgIHN3aXRjaCAobmV3dmFsID4+IDEyKQotCXsKLQljYXNlIDQ6IC8qIFBDIGxvYWQgKi8KLQkgIC8qIFRodW1iIFBDIGxvYWRzIGFyZSBzb21ld2hhdCBvZGQsIGJpdCAxIG9mIHRoZSBQQyBpcwotCSAgICAgZm9yY2VkIHRvIHplcm8gZm9yIHRoZXNlIGxvYWRzLCBzbyB3ZSB3aWxsIG5lZWQgdG8gcm91bmQKLQkgICAgIHVwIHRoZSBvZmZzZXQgaWYgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MgaXMgbm90IHdvcmQKLQkgICAgIGFsaWduZWQgKHNpbmNlIHRoZSBmaW5hbCBhZGRyZXNzIHByb2R1Y2VkIG11c3QgYmUsIGFuZAotCSAgICAgd2UgY2FuIG9ubHkgZGVzY3JpYmUgd29yZC1hbGlnbmVkIGltbWVkaWF0ZSBvZmZzZXRzKS4gICovCi0KLQkgIGlmICgoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlICsgdmFsdWUpICYgMykKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCwgdGFyZ2V0IG5vdCB3b3JkIGFsaWduZWQgKDB4JTA4WCkiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlICsgdmFsdWUpKTsKLQotCSAgaWYgKCh2YWx1ZSArIDIpICYgfjB4M2ZlKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0LCB2YWx1ZSB0b28gYmlnICgweCUwOFgpIiksIHZhbHVlKTsKLQotICAgICAgICAgIC8qIFJvdW5kIHVwLCBzaW5jZSBwYyB3aWxsIGJlIHJvdW5kZWQgZG93bi4gICovCi0JICBuZXd2YWwgfD0gKHZhbHVlICsgMikgPj4gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSA5OiAvKiBTUCBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHgzZmMpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQsIHZhbHVlIHRvbyBiaWcgKDB4JTA4WCkiKSwgdmFsdWUpOwotCSAgbmV3dmFsIHw9IHZhbHVlID4+IDI7Ci0JICBicmVhazsKLQotCWNhc2UgNjogLyogV29yZCBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHg3YykKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCwgdmFsdWUgdG9vIGJpZyAoMHglMDhYKSIpLCB2YWx1ZSk7Ci0JICBuZXd2YWwgfD0gdmFsdWUgPDwgNDsgLyogNiAtIDIgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSA3OiAvKiBCeXRlIGxvYWQvc3RvcmUgKi8KLQkgIGlmICh2YWx1ZSAmIH4weDFmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0LCB2YWx1ZSB0b28gYmlnICgweCUwOFgpIiksIHZhbHVlKTsKLQkgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA2OwotCSAgYnJlYWs7Ci0KLQljYXNlIDg6IC8qIEhhbGZ3b3JkIGxvYWQvc3RvcmUgKi8KLQkgIGlmICh2YWx1ZSAmIH4weDNlKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0LCB2YWx1ZSB0b28gYmlnICgweCUwOFgpIiksIHZhbHVlKTsKLQkgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA1OyAvKiA2IC0gMSAqLwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJIlVuYWJsZSB0byBwcm9jZXNzIHJlbG9jYXRpb24gZm9yIHRodW1iIG9wY29kZTogJWx4IiwKLQkJCSh1bnNpZ25lZCBsb25nKSBuZXd2YWwpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQ6Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tcGxpY2F0ZWQgcmVsb2NhdGlvbiwgc2luY2Ugd2UgdXNlIGl0IGZvciBhbGwgb2YKLSAgICAgICAgIHRoZSBmb2xsb3dpbmcgaW1tZWRpYXRlIHJlbG9jYXRpb25zOgotICAgICAgICAgICAgM2JpdCBBREQvU1VCCi0gICAgICAgICAgICA4Yml0IEFERC9TVUIKLSAgICAgICAgICAgIDliaXQgQUREL1NVQiBTUCB3b3JkLWFsaWduZWQKLSAgICAgICAgICAgMTBiaXQgQUREIFBDL1NQIHdvcmQtYWxpZ25lZAotCi0gICAgICAgICBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbiBiZWluZyBwcm9jZXNzZWQgaXMgZW5jb2RlZCBpbiB0aGUKLSAgICAgICAgIGluc3RydWN0aW9uIGZpZWxkOgotICAgICAgICAgICAweDgwMDAgIFNVQgotICAgICAgICAgICAweDAwRjAgIFJkCi0gICAgICAgICAgIDB4MDAwRiAgUnMKLSAgICAgICovCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICB7Ci0gICAgICAgIGludCByZCA9IChuZXd2YWwgPj4gNCkgJiAweGY7Ci0gICAgICAgIGludCBycyA9IG5ld3ZhbCAmIDB4ZjsKLSAgICAgICAgaW50IHN1YnRyYWN0ID0gbmV3dmFsICYgMHg4MDAwOwotCi0gICAgICAgIGlmIChyZCA9PSBSRUdfU1ApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlICYgfjB4MWZjKQotICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHN0YWNrIGFkZHJlc3MgY2FsY3VsYXRpb24iKSk7Ci0gICAgICAgICAgICBuZXd2YWwgPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9TVCA6IFRfT1BDT0RFX0FERF9TVDsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSB2YWx1ZSA+PiAyOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocnMgPT0gUkVHX1BDIHx8IHJzID09IFJFR19TUCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3VidHJhY3QgfHwKLSAgICAgICAgICAgICAgICB2YWx1ZSAmIH4weDNmYykKLSAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uICh2YWx1ZSA9IDB4JTA4bFgpIiksCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIHZhbHVlKTsKLSAgICAgICAgICAgIG5ld3ZhbCA9IChycyA9PSBSRUdfUEMgPyBUX09QQ09ERV9BRERfUEMgOiBUX09QQ09ERV9BRERfU1ApOwotICAgICAgICAgICAgbmV3dmFsIHw9IHJkIDw8IDg7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gdmFsdWUgPj4gMjsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJzID09IHJkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAmIH4weGZmKQotICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCA4Yml0IGltbWVkaWF0ZSIpKTsKLSAgICAgICAgICAgIG5ld3ZhbCA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX0k4IDogVF9PUENPREVfQUREX0k4OwotICAgICAgICAgICAgbmV3dmFsIHw9IChyZCA8PCA4KSB8IHZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAmIH4weDcpCi0gICAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIDNiaXQgaW1tZWRpYXRlIikpOwotICAgICAgICAgICAgbmV3dmFsID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTMgOiBUX09QQ09ERV9BRERfSTM7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gcmQgfCAocnMgPDwgMykgfCAodmFsdWUgPDwgNik7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NOgotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpOwotICAgICAgc3dpdGNoIChuZXd2YWwgPj4gMTEpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAweDA0OiAvKiA4Yml0IGltbWVkaWF0ZSBNT1YgKi8KLSAgICAgICAgY2FzZSAweDA1OiAvKiA4Yml0IGltbWVkaWF0ZSBDTVAgKi8KLSAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KQotICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIGltbWVkaWF0ZTogJWxkIGlzIHRvbyBsYXJnZSIpLAotCQkJICAobG9uZykgdmFsdWUpOwotICAgICAgICAgIG5ld3ZhbCB8PSB2YWx1ZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVDoKLSAgICAgIC8qIDViaXQgc2hpZnQgdmFsdWUgKDAuLjMxKSAqLwotICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDMxKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygiSWxsZWdhbCBUaHVtYiBzaGlmdCB2YWx1ZTogJWxkIiksIChsb25nKSB2YWx1ZSk7Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSkgJiAweGYwM2Y7Ci0gICAgICBuZXd2YWwgfD0gdmFsdWUgPDwgNjsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgIF8oIkJhZCByZWxvY2F0aW9uIGZpeHVwIHR5cGUgKCVkKSIpLCBmaXhQLT5meF9yX3R5cGUpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICAqLwotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICogc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaXhTICogZml4cDsKLXsKLSAgYXJlbGVudCAqIHJlbG9jOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgLyogQEAgV2h5IGZ4X2FkZG51bWJlciBzb21ldGltZXMgYW5kIGZ4X29mZnNldCBvdGhlciB0aW1lcz8gICovCi0jaWZuZGVmIE9CSl9FTEYKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsID09IDApCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQgPSByZWxvYy0+YWRkcmVzczsKLSNlbHNlICAvKiBPQkpfRUxGICovCi0gIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl7Ci0JICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JICBicmVhazsKLQl9Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl7Ci0JICBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JewotCSAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgIGJyZWFrOwotCX0KLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g6Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOiAgICAgIAotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0hXTElURVJBTDoKLSAgICAgIC8qIElmIHRoaXMgaXMgY2FsbGVkIHRoZW4gdGhlIGEgbGl0ZXJhbCBoYXMgYmVlbiByZWZlcmVuY2VkIGFjcm9zcwotCSBhIHNlY3Rpb24gYm91bmRhcnkgLSBwb3NzaWJseSBkdWUgdG8gYW4gaW1wbGljaXQgZHVtcCAqLwotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiTGl0ZXJhbCByZWZlcmVuY2VkIGFjcm9zcyBzZWN0aW9uIGJvdW5kYXJ5IChJbXBsaWNpdCBkdW1wPykiKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fUExUMzI6Ci0gICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURToKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkludGVybmFsX3JlbG9jYXRpb24gKHR5cGUgJWQpIG5vdCBmaXhlZCB1cCAoSU1NRURJQVRFKSIpLAotCQkgICAgZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFOgotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiQURSTCB1c2VkIGZvciBhIHN5bWJvbCBub3QgZGVmaW5lZCBpbiB0aGUgc2FtZSBmaWxlIiksCi0JCSAgICBmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTToKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkludGVybmFsX3JlbG9jYXRpb24gKHR5cGUgJWQpIG5vdCBmaXhlZCB1cCAoT0ZGU0VUX0lNTSkiKSwKLQkJICAgIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0JY2hhciAqIHR5cGU7Ci0Jc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0JICB7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOiAgICB0eXBlID0gIklNTUVESUFURSI7ICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU06ICAgdHlwZSA9ICJPRkZTRVRfSU1NIjsgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NODogIHR5cGUgPSAiT0ZGU0VUX0lNTTgiOyAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NOiAgICB0eXBlID0gIlNISUZUX0lNTSI7ICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1NXSTogICAgICAgICAgdHlwZSA9ICJTV0kiOyAgICAgICAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9NVUxUSTogICAgICAgIHR5cGUgPSAiTVVMVEkiOyAgICAgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTTogICB0eXBlID0gIkNQX09GRl9JTU0iOyAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDogICAgdHlwZSA9ICJUSFVNQl9BREQiOyAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVDogIHR5cGUgPSAiVEhVTUJfU0hJRlQiOyAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NOiAgICB0eXBlID0gIlRIVU1CX0lNTSI7ICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDogdHlwZSA9ICJUSFVNQl9PRkZTRVQiOyBicmVhazsKLQkgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBfKCI8dW5rbm93bj4iKTsgYnJlYWs7Ci0JICB9Ci0JYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0ICglZCkiKSwKLQkJICAgICAgdHlwZSwgZml4cC0+ZnhfcGNyZWwpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIH0KLQotI2lmZGVmIE9CSl9FTEYKLSBpZiAoY29kZSA9PSBCRkRfUkVMT0NfMzJfUENSRUwKLSAgICAgJiYgR09UX3N5bWJvbAotICAgICAmJiBmaXhwLT5meF9hZGRzeSA9PSBHT1Rfc3ltYm9sKQotICAgewotICAgICBjb2RlID0gQkZEX1JFTE9DX0FSTV9HT1RQQzsKLSAgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldCA9IHJlbG9jLT5hZGRyZXNzOwotICAgfQotI2VuZGlmCi0gICAKLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotCi0gIGlmIChyZWxvYy0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAvKiBIQUNLOiBTaW5jZSBhcm0gRUxGIHVzZXMgUmVsIGluc3RlYWQgb2YgUmVsYSwgZW5jb2RlIHRoZQotICAgICAgdnRhYmxlIGVudHJ5IHRvIGJlIHVzZWQgaW4gdGhlIHJlbG9jYXRpb24ncyBzZWN0aW9uIG9mZnNldC4gICovCi0gICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+Znhfb2Zmc2V0OwotCi0gIHJldHVybiByZWxvYzsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ3R5cGUpCi0gICAgIGZyYWdTICogZnJhZ1AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VnVCAgICBzZWd0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzX2ZhdGFsIChfKCJtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIikpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLW91dHB1dF9pbnN0IFBBUkFNUyAoKHZvaWQpKQotewotICBjaGFyICogdG8gPSBOVUxMOwotICAgIAotICBpZiAoaW5zdC5lcnJvcikKLSAgICB7Ci0gICAgICBhc19iYWQgKGluc3QuZXJyb3IpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0byA9IGZyYWdfbW9yZSAoaW5zdC5zaXplKTsKLSAgCi0gIGlmICh0aHVtYl9tb2RlICYmIChpbnN0LnNpemUgPiBUSFVNQl9TSVpFKSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc3Quc2l6ZSA9PSAoMiAqIFRIVU1CX1NJWkUpKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAodG8sIGluc3QuaW5zdHJ1Y3Rpb24gPj4gMTYsIFRIVU1CX1NJWkUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0byArIFRIVU1CX1NJWkUsIGluc3QuaW5zdHJ1Y3Rpb24sIFRIVU1CX1NJWkUpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5zdC5zaXplID4gSU5TTl9TSVpFKQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5zdC5zaXplID09ICgyICogSU5TTl9TSVpFKSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvLCBpbnN0Lmluc3RydWN0aW9uLCBJTlNOX1NJWkUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0byArIElOU05fU0laRSwgaW5zdC5pbnN0cnVjdGlvbiwgSU5TTl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvLCBpbnN0Lmluc3RydWN0aW9uLCBpbnN0LnNpemUpOwotCi0gIGlmIChpbnN0LnJlbG9jLnR5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgZml4X25ld19hcm0gKGZyYWdfbm93LCB0byAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgaW5zdC5zaXplLCAmIGluc3QucmVsb2MuZXhwLCBpbnN0LnJlbG9jLnBjX3JlbCwKLQkJIGluc3QucmVsb2MudHlwZSk7Ci0KLSAgcmV0dXJuOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBjaGFyICAgYzsKLSAgY2hhciAqIHA7Ci0gIGNoYXIgKiBxOwotICBjaGFyICogc3RhcnQ7Ci0KLSAgLyogQWxpZ24gdGhlIGluc3RydWN0aW9uLgotICAgICBUaGlzIG1heSBub3QgYmUgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGJ1dCAuLi4gKi8KLSAgLyogYXJtX2FsaWduICgyLCAwKTsgKi8KLSAgbGlzdGluZ19wcmV2X2xpbmUgKCk7IC8qIERlZmluZWQgaW4gbGlzdGluZy5oICovCi0KLSAgLyogQWxpZ24gdGhlIHByZXZpb3VzIGxhYmVsIGlmIG5lZWRlZC4gICovCi0gIGlmIChsYXN0X2xhYmVsX3NlZW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxhc3RfbGFiZWxfc2VlbiwgZnJhZ19ub3cpOwotICAgICAgU19TRVRfVkFMVUUgKGxhc3RfbGFiZWxfc2VlbiwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGxhc3RfbGFiZWxfc2Vlbiwgbm93X3NlZyk7Ci0gICAgfQotCi0gIG1lbXNldCAoJmluc3QsICdcMCcsIHNpemVvZiAoaW5zdCkpOwotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0gIAotICAvKiBTY2FuIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG9wLWNvZGUsIHdoaWNoIG11c3QgZW5kIGluIHdoaXRlIHNwYWNlIG9yCi0gICAgIGVuZCBvZiBzdHJpbmcuICAqLwotICBmb3IgKHN0YXJ0ID0gcCA9IHN0cjsgKnAgIT0gJ1wwJzsgcCsrKQotICAgIGlmICgqcCA9PSAnICcpCi0gICAgICBicmVhazsKLSAgICAKLSAgaWYgKHAgPT0gc3RyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTm8gb3BlcmF0b3IgLS0gc3RhdGVtZW50IGAlcydcbiIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAodGh1bWJfbW9kZSkKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3QgdGh1bWJfb3Bjb2RlICogb3Bjb2RlOwotCi0gICAgICBjID0gKnA7Ci0gICAgICAqcCA9ICdcMCc7Ci0gICAgICBvcGNvZGUgPSAoQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSAqKSBoYXNoX2ZpbmQgKGFybV90b3BzX2hzaCwgc3RyKTsKLSAgICAgICpwID0gYzsKLSAgICAgIAotICAgICAgaWYgKG9wY29kZSkKLQl7Ci0JICAvKiBDaGVjayB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIGZvciB0aGlzIENQVS4gICovCi0JICBpZiAodGh1bWJfbW9kZSA9PSAxICYmIChvcGNvZGUtPnZhcmlhbnRzICYgY3B1X3ZhcmlhbnQpID09IDApCi0JICAgICB7Ci0JICAgIAlhc19iYWQgKF8oInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3Bjb2RlIikpOwotCQlyZXR1cm47Ci0JICAgICB9Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSBvcGNvZGUtPnZhbHVlOwotCSAgaW5zdC5zaXplID0gb3Bjb2RlLT5zaXplOwotCSAgKCpvcGNvZGUtPnBhcm1zKShwKTsKLQkgIG91dHB1dF9pbnN0ICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3QgYXNtX29wY29kZSAqIG9wY29kZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgY29uZF9jb2RlOwotCi0gICAgICBpbnN0LnNpemUgPSBJTlNOX1NJWkU7Ci0gICAgICAvKiBwIG5vdyBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgb3Bjb2RlLCBwcm9iYWJseSB3aGl0ZSBzcGFjZSwgYnV0IHdlCi0JIGhhdmUgdG8gYnJlYWsgdGhlIG9wY29kZSB1cCBpbiBjYXNlIGl0IGNvbnRhaW5zIGNvbmRpb25hbHMgYW5kIGZsYWdzOwotCSBrZWVwIHRyeWluZyB3aXRoIHByb2dyZXNzaXZlbHkgc21hbGxlciBiYXNpYyBpbnN0cnVjdGlvbnMgdW50aWwgb25lCi0JIG1hdGNoZXMsIG9yIHdlIHJ1biBvdXQgb2Ygb3Bjb2RlLiAgKi8KLSAgICAgIHEgPSAocCAtIHN0ciA+IExPTkdFU1RfSU5TVCkgPyBzdHIgKyBMT05HRVNUX0lOU1QgOiBwOwotICAgICAgZm9yICg7IHEgIT0gc3RyOyBxLS0pCi0JewotCSAgYyA9ICpxOwotCSAgKnEgPSAnXDAnOwotCSAgb3Bjb2RlID0gKENPTlNUIHN0cnVjdCBhc21fb3Bjb2RlICopIGhhc2hfZmluZCAoYXJtX29wc19oc2gsIHN0cik7Ci0JICAqcSA9IGM7Ci0JICAKLQkgIGlmIChvcGNvZGUgJiYgb3Bjb2RlLT50ZW1wbGF0ZSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ19iaXRzID0gMDsKLQkgICAgICBjaGFyICogcjsKLQotCSAgICAgIC8qIENoZWNrIHRoYXQgdGhpcyBpbnN0cnVjdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgQ1BVLiAgKi8KLQkgICAgICBpZiAoKG9wY29kZS0+dmFyaWFudHMgJiBjcHVfdmFyaWFudCkgPT0gMCkKLQkJZ290byB0cnlfc2hvcnRlcjsKLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBvcGNvZGUtPnZhbHVlOwotCSAgICAgIGlmIChxID09IHApCQkvKiBKdXN0IGEgc2ltcGxlIG9wY29kZS4gICovCi0JCXsKLQkJICBpZiAob3Bjb2RlLT5jb21wX3N1ZmZpeCkKLQkJICAgIHsKLQkJICAgICAgIGlmICgqb3Bjb2RlLT5jb21wX3N1ZmZpeCAhPSAnXDAnKQotCQkgICAgCSBhc19iYWQgKF8oIk9wY29kZSBgJXMnIG11c3QgaGF2ZSBzdWZmaXggZnJvbSBsaXN0OiA8JXM+IiksCi0JCQkgICAgIHN0ciwgb3Bjb2RlLT5jb21wX3N1ZmZpeCk7Ci0JCSAgICAgICBlbHNlCi0JCQkgLyogTm90IGEgY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb24uICovCi0JCSAgICAgICAgICgqb3Bjb2RlLT5wYXJtcykocSwgMCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBBIGNvbmRpdGlvbmFsIGluc3RydWN0aW9uIHdpdGggZGVmYXVsdCBjb25kaXRpb24uICovCi0JCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ09ORF9BTFdBWVM7Ci0JCSAgICAgICgqb3Bjb2RlLT5wYXJtcykocSwgMCk7Ci0JCSAgICB9Ci0JCSAgb3V0cHV0X2luc3QgKCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBOb3QganVzdCBhIHNpbXBsZSBvcGNvZGUuICBDaGVjayBpZiBleHRyYSBpcyBhIGNvbmRpdGlvbmFsLiAqLwotCSAgICAgIHIgPSBxOwotCSAgICAgIGlmIChwIC0gciA+PSAyKQotCQl7Ci0JCSAgQ09OU1Qgc3RydWN0IGFzbV9jb25kICpjb25kOwotCQkgIGNoYXIgZCA9ICoociArIDIpOwotCi0JCSAgKihyICsgMikgPSAnXDAnOwotCQkgIGNvbmQgPSAoQ09OU1Qgc3RydWN0IGFzbV9jb25kICopIGhhc2hfZmluZCAoYXJtX2NvbmRfaHNoLCByKTsKLQkJICAqKHIgKyAyKSA9IGQ7Ci0JCSAgaWYgKGNvbmQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb25kLT52YWx1ZSA9PSAweGYwMDAwMDAwKQotCQkJYXNfdHNrdHNrICgKLV8oIldhcm5pbmc6IFVzZSBvZiB0aGUgJ252JyBjb25kaXRpb25hbCBpcyBkZXByZWNhdGVkXG4iKSk7Ci0KLQkJICAgICAgY29uZF9jb2RlID0gY29uZC0+dmFsdWU7Ci0JCSAgICAgIHIgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBjb25kX2NvZGUgPSBDT05EX0FMV0FZUzsKLQkJfQotCSAgICAgIGVsc2UKLQkJY29uZF9jb2RlID0gQ09ORF9BTFdBWVM7Ci0KLQkgICAgICAvKiBBcHBseSB0aGUgY29uZGl0aW9uYWwsIG9yIGNvbXBsYWluIGl0J3Mgbm90IGFsbG93ZWQuICovCi0JICAgICAgaWYgKG9wY29kZS0+Y29tcF9zdWZmaXggJiYgKm9wY29kZS0+Y29tcF9zdWZmaXggPT0gJ1wwJykKLQkJewotCQkgICAvKiBJbnN0cnVjdGlvbiBpc24ndCBjb25kaXRpb25hbCAqLwotCQkgICBpZiAoY29uZF9jb2RlICE9IENPTkRfQUxXQVlTKQotCQkgICAgIHsKLQkJICAgICAgIGFzX2JhZCAoXygiT3Bjb2RlIGAlcycgaXMgdW5jb25kaXRpb25hbFxuIiksIHN0cik7Ci0JCSAgICAgICByZXR1cm47Ci0JCSAgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQkvKiBJbnN0cnVjdGlvbiBpcyBjb25kaXRpb25hbDogc2V0IHRoZSBjb25kaXRpb24gaW50byBpdC4gKi8KLQkJaW5zdC5pbnN0cnVjdGlvbiB8PSBjb25kX2NvZGU7CSAgICAgCi0KLQotCSAgICAgIC8qIElmIHRoZXJlIGlzIGEgY29tcHVsc29yeSBzdWZmaXgsIGl0IHNob3VsZCBjb21lIGhlcmUsIGJlZm9yZQotCQkgYW55IG9wdGlvbmFsIGZsYWdzLiAgKi8KLQkgICAgICBpZiAob3Bjb2RlLT5jb21wX3N1ZmZpeCAmJiAqb3Bjb2RlLT5jb21wX3N1ZmZpeCAhPSAnXDAnKQotCQl7Ci0JCSAgQ09OU1QgY2hhciAqcyA9IG9wY29kZS0+Y29tcF9zdWZmaXg7Ci0KLQkJICB3aGlsZSAoKnMpCi0JCSAgICB7Ci0JCSAgICAgIGluc3Quc3VmZml4Kys7Ci0JCSAgICAgIGlmICgqciA9PSAqcykKLQkJCWJyZWFrOwotCQkgICAgICBzKys7Ci0JCSAgICB9Ci0KLQkJICBpZiAoKnMgPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJPcGNvZGUgYCVzJyBtdXN0IGhhdmUgc3VmZml4IGZyb20gPCVzPlxuIiksIHN0ciwKLQkJCSAgICAgIG9wY29kZS0+Y29tcF9zdWZmaXgpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0KLQkJICByKys7Ci0JCX0KLQotCSAgICAgIC8qIFRoZSByZW1haW5kZXIsIGlmIGFueSBzaG91bGQgbm93IGJlIGZsYWdzIGZvciB0aGUgaW5zdHJ1Y3Rpb247Ci0JCSBTY2FuIHRoZXNlIGNoZWNraW5nIGVhY2ggb25lIGZvdW5kIHdpdGggdGhlIG9wY29kZS4gICovCi0JICAgICAgaWYgKHIgIT0gcCkKLQkJewotCQkgIGNoYXIgZDsKLQkJICBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyAqZmxhZyA9IG9wY29kZS0+ZmxhZ3M7Ci0KLQkJICBpZiAoZmxhZykKLQkJICAgIHsKLQkJICAgICAgaW50IGZsYWdubzsKLQotCQkgICAgICBkID0gKnA7Ci0JCSAgICAgICpwID0gJ1wwJzsKLQotCQkgICAgICBmb3IgKGZsYWdubyA9IDA7IGZsYWdbZmxhZ25vXS50ZW1wbGF0ZTsgZmxhZ25vKyspCi0JCQl7Ci0JCQkgIGlmIChzdHJlcSAociwgZmxhZ1tmbGFnbm9dLnRlbXBsYXRlKSkKLQkJCSAgICB7Ci0JCQkgICAgICBmbGFnX2JpdHMgfD0gZmxhZ1tmbGFnbm9dLnNldF9iaXRzOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgICpwID0gZDsKLQkJICAgICAgaWYgKCEgZmxhZ1tmbGFnbm9dLnRlbXBsYXRlKQotCQkJZ290byB0cnlfc2hvcnRlcjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBnb3RvIHRyeV9zaG9ydGVyOwotCQl9Ci0KLQkgICAgICAoKm9wY29kZS0+cGFybXMpIChwLCBmbGFnX2JpdHMpOwotCSAgICAgIG91dHB1dF9pbnN0ICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JdHJ5X3Nob3J0ZXI6Ci0JICA7Ci0JfQotICAgIH0KLQotICAvKiBJdCB3YXNuJ3QgYW4gaW5zdHJ1Y3Rpb24sIGJ1dCBpdCBtaWdodCBiZSBhIHJlZ2lzdGVyIGFsaWFzIG9mIHRoZSBmb3JtCi0gICAgIGFsaWFzIC5yZXEgcmVnICovCi0gIHEgPSBwOwotICBza2lwX3doaXRlc3BhY2UgKHEpOwotCi0gIGMgPSAqcDsKLSAgKnAgPSAnXDAnOwotICAgIAotICBpZiAoKnEgJiYgIXN0cm5jbXAgKHEsICIucmVxICIsIDQpKQotICAgIHsKLSAgICAgIGludCAgICByZWc7Ci0gICAgICBjaGFyICogY29weV9vZl9zdHIgPSBzdHI7Ci0gICAgICBjaGFyICogcjsKLSAgICAgIAotICAgICAgcSArPSA0OwotICAgICAgc2tpcF93aGl0ZXNwYWNlIChxKTsKLQotICAgICAgZm9yIChyID0gcTsgKnIgIT0gJ1wwJzsgcisrKQotCWlmICgqciA9PSAnICcpCi0JICBicmVhazsKLSAgICAgIAotICAgICAgaWYgKHIgIT0gcSkKLQl7Ci0JICBpbnQgcmVnbnVtOwotCSAgY2hhciBkID0gKnI7Ci0KLQkgICpyID0gJ1wwJzsKLQkgIHJlZ251bSA9IGFybV9yZWdfcGFyc2UgKCYgcSk7Ci0JICAqciA9IGQ7Ci0KLQkgIHJlZyA9IGFybV9yZWdfcGFyc2UgKCYgc3RyKTsKLQkgIAotCSAgaWYgKHJlZyA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaWYgKHJlZ251bSAhPSBGQUlMKQotCQlpbnNlcnRfcmVnX2FsaWFzIChzdHIsIHJlZ251bSk7Ci0JICAgICAgZWxzZQotCQlhc193YXJuIChfKCJyZWdpc3RlciAnJXMnIGRvZXMgbm90IGV4aXN0XG4iKSwgcSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJlZ251bSAhPSBGQUlMKQotCSAgICB7Ci0JICAgICAgaWYgKHJlZyAhPSByZWdudW0pCi0JCWFzX3dhcm4gKF8oImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiByZWdpc3RlciBhbGlhcyAnJXMnIiksCi0JCQkgY29weV9vZl9zdHIgKTsKLQkgICAgICAKLQkgICAgICAvKiBEbyBub3Qgd2FybiBhYm91dCByZWRlZmluaXRpb25zIHRvIHRoZSBzYW1lIGFsaWFzLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICBhc193YXJuIChfKCJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyB0byBub24tZXhpc3RhbnQgcmVnaXN0ZXIgJyVzJyIpLAotCQkgICAgIGNvcHlfb2Zfc3RyLCBxKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfd2FybiAoXygiaWdub3JpbmcgaW5jb21wbGV0ZSAucmVxIHBzZXVzbyBvcCIpKTsKLSAgICAgIAotICAgICAgKnAgPSBjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqcCA9IGM7Ci0gIGFzX2JhZCAoXygiYmFkIGluc3RydWN0aW9uIGAlcyciKSwgc3RhcnQpOwotfQotCi0vKgotICogbWRfcGFyc2Vfb3B0aW9uCi0gKiAgICBJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICogICAgU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgVGhlc2UgYXJlOgotICogICAgQ3B1IHZhcmlhbnRzLCB0aGUgYXJtIHBhcnQgaXMgb3B0aW9uYWw6Ci0gKiAgICAgICAgICAgIC1tW2FybV0xICAgICAgICAgICAgICAgIEN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgotICogICAgICAgICAgICAtbVthcm1dMiwgLW1bYXJtXTI1MCAgICBBcm0gMiBhbmQgQXJtIDI1MCBwcm9jZXNzb3IKLSAqICAgICAgICAgICAgLW1bYXJtXTMgICAgICAgICAgICAgICAgQXJtIDMgcHJvY2Vzc29yCi0gKiAgICAgICAgICAgIC1tW2FybV02W3h4XSwgICAgICAgICAgIEFybSA2IHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1bYXJtXTdbeHhdW3RdW1tkXW1dICAgQXJtIDcgcHJvY2Vzc29ycwotICogICAgICAgICAgICAtbVthcm1dOFsxMF0gICAgICAgICAgICBBcm0gOCBwcm9jZXNzb3JzCi0gKiAgICAgICAgICAgIC1tW2FybV05WzIwXVt0ZG1pXSAgICAgIEFybSA5IHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1zdHJvbmdhcm1bMTEwWzBdXSAgICAgU3Ryb25nQVJNIHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1bYXJtXXZbMjM0NV0JICAgICAgQXJtIGFyY2hpdGVjdHVyZXMKLSAqICAgICAgICAgICAgLW1hbGwgICAgICAgICAgICAgICAgICAgQWxsIChleGNlcHQgdGhlIEFSTTEpCi0gKiAgICBGUCB2YXJpYW50czoKLSAqICAgICAgICAgICAgLW1mcGExMCwgLW1mcGExMSAgICAgICAgRlBBMTAgYW5kIDExIGNvLXByb2Nlc3NvciBpbnN0cnVjdGlvbnMKLSAqICAgICAgICAgICAgLW1mcGUtb2xkICAgICAgICAgICAgICAgKE5vIGZsb2F0IGxvYWQvc3RvcmUgbXVsdGlwbGVzKQotICogICAgICAgICAgICAtbW5vLWZwdSAgICAgICAgICAgICAgICBEaXNhYmxlIGFsbCBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMKLSAqICAgIFJ1bi10aW1lIGVuZGlhbiBzZWxlY3Rpb246Ci0gKiAgICAgICAgICAgIC1FQiAgICAgICAgICAgICAgICAgICAgIGJpZyBlbmRpYW4gY3B1Ci0gKiAgICAgICAgICAgIC1FTCAgICAgICAgICAgICAgICAgICAgIGxpdHRsZSBlbmRpYW4gY3B1Ci0gKiAgICBBUk0gUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQ6Ci0gKgkgICAgICAtbWFwY3MtMzIJCSAgICAgIDMyIGJpdCBBUENTCi0gKgkgICAgICAtbWFwY3MtMjYJCSAgICAgIDI2IGJpdCBBUENTCi0gKgkgICAgICAtbWFwY3MtZmxvYXQJICAgICAgUGFzcyBmbG9hdHMgaW4gZmxvYXQgcmVncwotICoJICAgICAgLW1hcGNzLXJlZW50cmFudCAgICAgICAgUG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZQotICogICAgICAgICAgICAtbXRodW1iLWludGVyd29yayAgICAgICBDb2RlIHN1cHBvcnRzIEFybS9UaHVtYiBpbnRlcndvcmtpbmcKLSAqICAgICAgICAgICAgLW1vYWJpICAgICAgICAgICAgICAgICAgT2xkIEVMRiBBQkkKLSAqLwotCi1DT05TVCBjaGFyICogbWRfc2hvcnRvcHRzID0gIm06ayI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotI2lmZGVmIEFSTV9CSV9FTkRJQU4KLSNkZWZpbmUgT1BUSU9OX0VCIChPUFRJT05fTURfQkFTRSArIDApCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSNkZWZpbmUgT1BUSU9OX0VMIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIE9QVElPTl9PQUJJIChPUFRJT05fTURfQkFTRSArMikKLSAgeyJvYWJpIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PQUJJfSwKLSNlbmRpZgotI2VuZGlmCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgICAgYzsKLSAgICAgY2hhciAqIGFyZzsKLXsKLSAgY2hhciAqIHN0ciA9IGFyZzsKLQotICBzd2l0Y2ggKGMpCi0gICAgewotI2lmZGVmIEFSTV9CSV9FTkRJQU4KLSAgICBjYXNlIE9QVElPTl9FQjoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0VMOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgJ20nOgotICAgICAgc3dpdGNoICgqc3RyKQotCXsKLQljYXNlICdmJzoKLQkgIGlmIChzdHJlcSAoc3RyLCAiZnBhMTAiKSkKLQkgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfRlBBMTA7Ci0JICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZnBhMTEiKSkKLQkgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfRlBBMTE7Ci0JICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZnBlLW9sZCIpKQotCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9DT1JFOwotCSAgZWxzZQotCSAgICBnb3RvIGJhZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbic6Ci0JICBpZiAoc3RyZXEgKHN0ciwgIm5vLWZwdSIpKQotCSAgICBjcHVfdmFyaWFudCAmPSB+RlBVX0FMTDsKLQkgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgICBjYXNlICdvJzoKLSAgICAgICAgICBpZiAoc3RyZXEgKHN0ciwgIm9hYmkiKSkKLSAgICAgICAgICAgIHRhcmdldF9vYWJpID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSNlbmRpZgotCSAgCi0gICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgIC8qIExpbWl0IGFzc2VtYmxlciB0byBnZW5lcmF0aW5nIG9ubHkgVGh1bWIgaW5zdHJ1Y3Rpb25zOiAqLwotICAgICAgICAgIGlmIChzdHJlcSAoc3RyLCAidGh1bWIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fVEhVTUI7Ci0gICAgICAgICAgICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkZQVV9BTEwpIHwgRlBVX05PTkU7Ci0gICAgICAgICAgICAgIHRodW1iX21vZGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJ0aHVtYi1pbnRlcndvcmsiKSkKLSAgICAgICAgICAgIHsKLQkgICAgICBpZiAoKGNwdV92YXJpYW50ICYgQVJNX1RIVU1CKSA9PSAwKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9BUkNIX1Y0VDsKLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICAgICAgICAgICAgICBzdXBwb3J0X2ludGVyd29yayA9IHRydWU7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0JICAgIGdvdG8gYmFkOwotICAgICAgICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGlmIChzdHJlcSAoc3RyLCAiYWxsIikpCi0JICAgIHsKLQkgICAgICBjcHVfdmFyaWFudCA9IEFSTV9BTEwgfCBGUFVfQUxMOwotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLQkgIGlmICghIHN0cm5jbXAgKHN0ciwgImFwY3MtIiwgNSkpCi0JICAgIHsKLQkgICAgICAvKiBHQ0MgcGFzc2VzIG9uIGFsbCBjb21tYW5kIGxpbmUgb3B0aW9ucyBzdGFydGluZyAiLW1hcGNzLS4uLiIKLQkJIHRvIHVzLCBzbyB3ZSBtdXN0IHBhcnNlIHRoZW0gaGVyZS4gICovCi0KLQkgICAgICBzdHIgKz0gNTsKLQkgICAgICAKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjMyIikpCi0JCXsKLQkJICB1c2VzX2FwY3NfMjYgPSBmYWxzZTsKLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICIyNiIpKQotCQl7Ci0JCSAgdXNlc19hcGNzXzI2ID0gdHJ1ZTsKLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmcmFtZSIpKQotCQl7Ci0JCSAgLyogU3RhY2sgZnJhbWVzIGFyZSBiZWluZyBnZW5lcmF0ZWQgLSBkb2VzIG5vdCBhZmZlY3QKLQkJICAgICBsaW5rYWdlIG9mIGNvZGUuICAqLwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgInN0YWNrLWNoZWNrIikpCi0JCXsKLQkJICAvKiBTdGFjayBjaGVja2luZyBpcyBiZWluZyBwZXJmb3JtZWQgLSBkb2VzIG5vdCBhZmZlY3QKLQkJICAgICBsaW5rYWdlLCBidXQgZG9lcyByZXF1aXJlIHRoYXQgdGhlIGZ1bmN0aW9ucwotCQkgICAgIF9fcnRfc3Rrb3ZmX3NwbGl0X3NtYWxsIGFuZCBfX3J0X3N0a292Zl9zcGxpdF9iaWcgYmUKLQkJICAgICBwcmVzZW50IGluIHRoZSBmaW5hbCBsaW5rLiAgKi8KLQotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgImZsb2F0IikpCi0JCXsKLQkJICAvKiBGbG9hdGluZyBwb2ludCBhcmd1bWVudHMgYXJlIGJlaW5nIHBhc3NlZCBpbiB0aGUgZmxvYXRpbmcKLQkJICAgICBwb2ludCByZWdpc3RlcnMuICBUaGlzIGRvZXMgYWZmZWN0IGxpbmtpbmcsIHNpbmNlIHRoaXMKLQkJICAgICB2ZXJzaW9uIG9mIHRoZSBBUENTIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQKLQkJICAgICBwYXNzZXMgZmxvYXRpbmcgcG9pbnRzIGluIHRoZSBpbnRlZ2VyIHJlZ2lzdGVycy4gICovCi0KLQkJICB1c2VzX2FwY3NfZmxvYXQgPSB0cnVlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgInJlZW50cmFudCIpKQotCQl7Ci0JCSAgLyogUmVlbnRyYW50IGNvZGUgaGFzIGJlZW4gZ2VuZXJhdGVkLiAgVGhpcyBkb2VzIGFmZmVjdAotCQkgICAgIGxpbmtpbmcsIHNpbmNlIHRoZXJlIGlzIG5vIHBvaW50IGluIGxpbmtpbmcgcmVlbnRyYW50LwotCQkgICAgIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbiBjb2RlLiAqLwotCQkgIHBpY19jb2RlID0gdHJ1ZTsKLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIAotCSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pc2VkIEFQQ1Mgc3dpdGNoIC1tJXMiKSwgYXJnKTsKLQkgICAgICByZXR1cm4gMDsKLSAgCSAgICB9Ci0jZW5kaWYKLQkgIC8qIFN0cmlwIG9mZiBvcHRpb25hbCAiYXJtIiAqLwotCSAgaWYgKCEgc3RybmNtcCAoc3RyLCAiYXJtIiwgMykpCi0JICAgIHN0ciArPSAzOwotCi0JICBzd2l0Y2ggKCpzdHIpCi0JICAgIHsKLQkgICAgY2FzZSAnMSc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICIxIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzE7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcyJzoKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjIiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMjsKLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiMjUwIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzI1MDsKLQkgICAgICBlbHNlCi0JCWdvdG8gYmFkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzMnOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMyIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8zOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNic6Ci0JICAgICAgc3dpdGNoIChzdHJ0b2wgKHN0ciwgTlVMTCwgMTApKQotCQl7Ci0JCWNhc2UgNjoKLQkJY2FzZSA2MDoKLQkJY2FzZSA2MDA6Ci0JCWNhc2UgNjEwOgotCQljYXNlIDYyMDoKLQkJICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV82OwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGdvdG8gYmFkOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgc3dpdGNoIChzdHJ0b2wgKHN0ciwgJiBzdHIsIDEwKSkJLyogRWF0IHRoZSBwcm9jZXNzb3IgbmFtZSAqLwotCQl7Ci0JCWNhc2UgNzoKLQkJY2FzZSA3MDoKLQkJY2FzZSA3MDA6Ci0JCWNhc2UgNzEwOgotCQljYXNlIDcyMDoKLQkJY2FzZSA3MTAwOgotCQljYXNlIDc1MDA6Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgZ290byBiYWQ7Ci0JCX0KLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fNzsKLSAgICAgICAgICAgICAgZm9yICg7ICpzdHI7IHN0cisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKCogc3RyKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICAgICAgICAgIGNwdV92YXJpYW50IHw9IChBUk1fVEhVTUIgfCBBUk1fQVJDSF9WNCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgfD0gQVJNX0xPTkdNVUw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZic6IC8qIGZlID0+IGZwIGVuYWJsZWQgY3B1LiAgKi8KLQkJICAgIGlmIChzdHJbMV0gPT0gJ2UnKQotCQkgICAgICArKyBzdHI7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGdvdG8gYmFkOwotCQkgICAgCi0JCSAgY2FzZSAnYyc6IC8qIExlZnQgb3ZlciBmcm9tIDcxMGMgcHJvY2Vzc29yIG5hbWUuICAqLwotICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6IC8qIERlYnVnICovCi0gICAgICAgICAgICAgICAgICBjYXNlICdpJzogLyogRW1iZWRkZWQgSUNFICovCi0gICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MgaW4gQVJNIHByb2Nlc3NvciBuYW1pbmcuICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnOCc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICI4IikgfHwgc3RyZXEgKHN0ciwgIjgxMCIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKQotCQkgIHwgQVJNXzggfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgJzknOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiOSIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKQotCQkgIHwgQVJNXzkgfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICI5MjAiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkKLQkJICB8IEFSTV85IHwgQVJNX0FSQ0hfVjQgfCBBUk1fTE9OR01VTDsKLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiOTIwdCIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKQotCQkgIHwgQVJNXzkgfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICI5dGRtaSIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKQotCQkgIHwgQVJNXzkgfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICJzdHJvbmdhcm0iKQotCQkgIHx8IHN0cmVxIChzdHIsICJzdHJvbmdhcm0xMTAiKQotCQkgIHx8IHN0cmVxIChzdHIsICJzdHJvbmdhcm0xMTAwIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpCi0JCSAgfCBBUk1fOCB8IEFSTV9BUkNIX1Y0IHwgQVJNX0xPTkdNVUw7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQkJCi0JICAgIGNhc2UgJ3YnOgotCSAgICAgIC8qIFNlbGVjdCB2YXJpYW50IGJhc2VkIG9uIGFyY2hpdGVjdHVyZSByYXRoZXIgdGhhbiBwcm9jZXNzb3IuICAqLwotCSAgICAgIHN3aXRjaCAoKisrc3RyKQotCQl7Ci0JCWNhc2UgJzInOgotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAnYSc6Ci0JCSAgICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzM7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAwOgotCQkgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8yOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlICczJzoKLQkJICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzc7Ci0gICAgICAgICAgICAgICAgICAgIAotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAnbSc6IGNwdV92YXJpYW50IHw9IEFSTV9MT05HTVVMOyBicmVhazsKLQkJICAgIGNhc2UgMDogICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlICc0JzoKLQkJICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9BUkNIX1Y0OwotCQkgIAotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAndCc6IGNwdV92YXJpYW50IHw9IEFSTV9USFVNQjsgYnJlYWs7Ci0JCSAgICBjYXNlIDA6ICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIpLCBhcmcpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICc1JzoKLQkJICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9BUkNIX1Y1OwotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAndCc6IGNwdV92YXJpYW50IHw9IEFSTV9USFVNQjsgYnJlYWs7Ci0JCSAgICBjYXNlICdlJzogY3B1X3ZhcmlhbnQgfD0gQVJNX0VYVF9WNUU7IGJyZWFrOwotCQkgICAgY2FzZSAwOiAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICBiYWQ6Ci0JICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIHByb2Nlc3NvciB2YXJpYW50IC1tJXMiKSwgYXJnKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0jaWYgZGVmaW5lZCBPQkpfRUxGIHx8IGRlZmluZWQgT0JKX0NPRkYKLSAgICBjYXNlICdrJzoKLSAgICAgIHBpY19jb2RlID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoZnApCi0gICAgIEZJTEUgKiBmcDsKLXsKLSAgZnByaW50ZiAoZnAsIF8oIlwKLSBBUk0gU3BlY2lmaWMgQXNzZW1ibGVyIE9wdGlvbnM6XG5cCi0gIC1tW2FybV1bPHByb2Nlc3NvciBuYW1lPl0gc2VsZWN0IHByb2Nlc3NvciB2YXJpYW50XG5cCi0gIC1tW2FybV12WzJ8MmF8M3wzbXw0fDR0fDVbdF1bZV1dIHNlbGVjdCBhcmNoaXRlY3R1cmUgdmFyaWFudFxuXAotICAtbXRodW1iICAgICAgICAgICAgICAgICAgIG9ubHkgYWxsb3cgVGh1bWIgaW5zdHJ1Y3Rpb25zXG5cCi0gIC1tdGh1bWItaW50ZXJ3b3JrICAgICAgICAgbWFyayB0aGUgYXNzZW1ibGVkIGNvZGUgYXMgc3VwcG9ydGluZyBpbnRlcndvcmtpbmdcblwKLSAgLW1hbGwgICAgICAgICAgICAgICAgICAgICBhbGxvdyBhbnkgaW5zdHJ1Y3Rpb25cblwKLSAgLW1mcGExMCwgLW1mcGExMSAgICAgICAgICBzZWxlY3QgZmxvYXRpbmcgcG9pbnQgYXJjaGl0ZWN0dXJlXG5cCi0gIC1tZnBlLW9sZCAgICAgICAgICAgICAgICAgZG9uJ3QgYWxsb3cgZmxvYXRpbmctcG9pbnQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zXG5cCi0gIC1tbm8tZnB1ICAgICAgICAgICAgICAgICAgZG9uJ3QgYWxsb3cgYW55IGZsb2F0aW5nLXBvaW50IGluc3RydWN0aW9ucy5cblwKLSAgLWsgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBQSUMgY29kZS5cbiIpKTsKLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICBmcHJpbnRmIChmcCwgXygiXAotICAtbWFwY3MtMzIsIC1tYXBjcy0yNiAgICAgIHNwZWNpZnkgd2hpY2ggQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkIHRvIHVzZVxuXAotICAtbWFwY3MtZmxvYXQgICAgICAgICAgICAgIGZsb2F0aW5nIHBvaW50IGFyZ3MgYXJlIHBhc3NlZCBpbiBGUCByZWdzXG5cCi0gIC1tYXBjcy1yZWVudHJhbnQgICAgICAgICAgdGhlIGNvZGUgaXMgcG9zaXRpb24gaW5kZXBlbmRlbnQvcmVlbnRyYW50XG4iKSk7Ci0gICNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgZnByaW50ZiAoZnAsIF8oIlwKLSAgLW1vYWJpICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvbGQgRUxGIEFCSVxuIikpOwotI2VuZGlmCi0jaWZkZWYgQVJNX0JJX0VORElBTgotICBmcHJpbnRmIChmcCwgXygiXAotICAtRUIgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgYmlnIGVuZGlhbiBjcHVcblwKLSAgLUVMICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gY3B1XG4iKSk7Ci0jZW5kaWYKLX0KLQotLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIGZpeCB1cCBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgaW4gc29tZSBzdGF0ZW1lbnRzLgotICAgVGhpcyBpcyBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgc3ltYm9scyB0aGF0IGFyZSBhbiBhcmJpdHJhcnkgZGlzdGFuY2UgZnJvbQotICAgdGhlIHBjLiAgVGhlIG1vc3QgY29tbW9uIGNhc2VzIGFyZSBvZiB0aGUgZm9ybSAoKCsvLXN5bSAtLysgLiAtIDgpICYgbWFzayksCi0gICB3aGljaCByZXR1cm5zIHBhcnQgb2YgYW4gYWRkcmVzcyBpbiBhIGZvcm0gd2hpY2ggd2lsbCBiZSB2YWxpZCBmb3IKLSAgIGEgZGF0YSBpbnN0cnVjdGlvbi4gIFdlIGRvIHRoaXMgYnkgcHVzaGluZyB0aGUgZXhwcmVzc2lvbiBpbnRvIGEgc3ltYm9sCi0gICBpbiB0aGUgZXhwcl9zZWN0aW9uLCBhbmQgY3JlYXRpbmcgYSBmaXggZm9yIHRoYXQuICAqLwotCi1zdGF0aWMgdm9pZAotZml4X25ld19hcm0gKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjX3JlbCwgcmVsb2MpCi0gICAgIGZyYWdTICogICAgICAgZnJhZzsKLSAgICAgaW50ICAgICAgICAgICB3aGVyZTsKLSAgICAgc2hvcnQgaW50ICAgICBzaXplOwotICAgICBleHByZXNzaW9uUyAqIGV4cDsKLSAgICAgaW50ICAgICAgICAgICBwY19yZWw7Ci0gICAgIGludCAgICAgICAgICAgcmVsb2M7Ci17Ci0gIGZpeFMgKiAgICAgICAgIG5ld19maXg7Ci0gIGFybV9maXhfZGF0YSAqIGFybV9kYXRhOwotCi0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICBjYXNlIE9fYWRkOgotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIG5ld19maXggPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNfcmVsLCByZWxvYyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBuZXdfZml4ID0gZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIG1ha2VfZXhwcl9zeW1ib2wgKGV4cCksIDAsCi0JCQkgcGNfcmVsLCByZWxvYyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogTWFyayB3aGV0aGVyIHRoZSBmaXggaXMgdG8gYSBUSFVNQiBpbnN0cnVjdGlvbiwgb3IgYW4gQVJNIGluc3RydWN0aW9uICovCi0gIGFybV9kYXRhID0gKGFybV9maXhfZGF0YSAqKSBvYnN0YWNrX2FsbG9jICgmIG5vdGVzLCBzaXplb2YgKGFybV9maXhfZGF0YSkpOwotICBuZXdfZml4LT50Y19maXhfZGF0YSA9IChQVFIpIGFybV9kYXRhOwotICBhcm1fZGF0YS0+dGh1bWJfbW9kZSA9IHRodW1iX21vZGU7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFRoaXMgZml4X25ldyBpcyBjYWxsZWQgYnkgY29ucyB2aWEgVENfQ09OU19GSVhfTkVXLiAgKi8KLXZvaWQKLWNvbnNfZml4X25ld19hcm0gKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICogICAgICAgZnJhZzsKLSAgICAgaW50ICAgICAgICAgICB3aGVyZTsKLSAgICAgaW50ICAgICAgICAgICBzaXplOwotICAgICBleHByZXNzaW9uUyAqIGV4cDsKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHR5cGU7Ci0gIGludCBwY3JlbCA9IDA7Ci0gIAotICAvKiBQaWNrIGEgcmVsb2MgLi4uCi0gICAqCi0gICAqIEBAIFNob3VsZCBsb29rIGF0IENQVSB3b3JkIHNpemUuCi0gICAqLwotICBzd2l0Y2ggKHNpemUpIAotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICB0eXBlID0gQkZEX1JFTE9DXzE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgIGRlZmF1bHQ6Ci0gICAgICB0eXBlID0gQkZEX1JFTE9DXzMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgdHlwZSA9IEJGRF9SRUxPQ182NDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgKGludCkgc2l6ZSwgZXhwLCBwY3JlbCwgdHlwZSk7Ci19Ci0KLS8qIEEgZ29vZCBwbGFjZSB0byBkbyB0aGlzLCBhbHRob3VnaCB0aGlzIHdhcyBwcm9iYWJseSBub3QgaW50ZW5kZWQKLSAgIGZvciB0aGlzIGtpbmQgb2YgdXNlLiAgV2UgbmVlZCB0byBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgYmVmb3JlCi0gICByZWZlcmVuY2VzIGFyZSBtYWRlIHRvIGEgbnVsbCBzeW1ib2wgcG9pbnRlci4gICovCi12b2lkCi1hcm1fY2xlYW51cCAoKQotewotICBpZiAoY3VycmVudF9wb29sUCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgCi0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7IC8qIFB1dCBpdCBhdCB0aGUgZW5kIG9mIHRleHQgc2VjdGlvbi4gICovCi0gIHNfbHRvcmcgKDApOwotICBsaXN0aW5nX3ByZXZfbGluZSAoKTsKLX0KLQotdm9pZAotYXJtX3N0YXJ0X2xpbmVfaG9vayAoKQotewotICBsYXN0X2xhYmVsX3NlZW4gPSBOVUxMOwotfQotCi12b2lkCi1hcm1fZnJvYl9sYWJlbCAoc3ltKQotICAgICBzeW1ib2xTICogc3ltOwotewotICBsYXN0X2xhYmVsX3NlZW4gPSBzeW07Ci0gIAotICBBUk1fU0VUX1RIVU1CIChzeW0sIHRodW1iX21vZGUpOwotICAKLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICBBUk1fU0VUX0lOVEVSV09SSyAoc3ltLCBzdXBwb3J0X2ludGVyd29yayk7Ci0jZW5kaWYKLSAgCi0gIGlmIChsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lKQotICAgIHsKLSAgICAgIC8qIFdoZW4gdGhlIGFkZHJlc3Mgb2YgYSBUaHVtYiBmdW5jdGlvbiBpcyB0YWtlbiB0aGUgYm90dG9tCi0JIGJpdCBvZiB0aGF0IGFkZHJlc3Mgc2hvdWxkIGJlIHNldC4gIFRoaXMgd2lsbCBhbGxvdwotCSBpbnRlcndvcmtpbmcgYmV0d2VlbiBBcm0gYW5kIFRodW1iIGZ1bmN0aW9ucyB0byB3b3JrCi0JIGNvcnJlY3RseS4gICovCi0KLSAgICAgIFRIVU1CX1NFVF9GVU5DIChzeW0sIDEpOwotICAgICAgCi0gICAgICBsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lID0gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGp1c3QgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgbWFya3MgVGh1bWIgc3ltYm9scyBhcyBkaXN0aW5jdCBmcm9tCi0gICBBUk0gb25lcy4gICovCi0KLXZvaWQKLWFybV9hZGp1c3Rfc3ltdGFiICgpCi17Ci0jaWZkZWYgT0JKX0NPRkYKLSAgc3ltYm9sUyAqIHN5bTsKLQotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChBUk1fSVNfVEhVTUIgKHN5bSkpCi0gICAgICAgIHsKLQkgIGlmIChUSFVNQl9JU19GVU5DIChzeW0pKQotCSAgICB7Ci0JICAgICAgLyogTWFyayB0aGUgc3ltYm9sIGFzIGEgVGh1bWIgZnVuY3Rpb24uICAqLwotCSAgICAgIGlmICggICBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfU1RBVAotCQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19MQUJFTCkgLyogVGhpcyBjYW4gaGFwcGVuISAqLwotCQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJTVEFURlVOQyk7Ci0KLQkgICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUKQotCQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJFWFRGVU5DKTsKLQkgICAgICBlbHNlCi0JCWFzX2JhZCAoXygiJXM6IHVuZXhwZWN0ZWQgZnVuY3Rpb24gdHlwZTogJWQiKSwKLQkJCVNfR0VUX05BTUUgKHN5bSksIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkpOwotCSAgICB9Ci0gICAgICAgICAgZWxzZSBzd2l0Y2ggKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgQ19FWFQ6Ci0gICAgICAgICAgICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CRVhUKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBDX1NUQVQ6Ci0gICAgICAgICAgICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CU1RBVCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgQ19MQUJFTDoKLSAgICAgICAgICAgICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJMQUJFTCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGRvIG5vdGhpbmcgKi8gCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgaWYgKEFSTV9JU19JTlRFUldPUksgKHN5bSkpCi0JY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSAweEZGOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgc3ltYm9sUyAqICAgICAgICAgc3ltOwotICBjaGFyICAgICAgICAgICAgICBiaW5kOwotCi0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgaWYgKEFSTV9JU19USFVNQiAoc3ltKSkKLSAgICAgICAgewotCSAgZWxmX3N5bWJvbF90eXBlICogZWxmX3N5bTsKLQkgIAotCSAgZWxmX3N5bSA9IGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKTsKLQkgIGJpbmQgPSBFTEZfU1RfQklORCAoZWxmX3N5bSk7Ci0JICAKLQkgIC8qIElmIGl0J3MgYSAudGh1bWJfZnVuYywgZGVjbGFyZSBpdCBhcyBzbywKLQkgICAgIG90aGVyd2lzZSB0YWcgbGFiZWwgYXMgLmNvZGUgMTYuICAqLwotCSAgaWYgKFRIVU1CX0lTX0ZVTkMgKHN5bSkpCi0JICAgIGVsZl9zeW0tPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbyA9Ci0JICAgICAgRUxGX1NUX0lORk8gKGJpbmQsIFNUVF9BUk1fVEZVTkMpOwotCSAgZWxzZQotCSAgICBlbGZfc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8gPQotCSAgICAgIEVMRl9TVF9JTkZPIChiaW5kLCBTVFRfQVJNXzE2QklUKTsKLSAgICAgICAgIH0KLSAgICAgfQotI2VuZGlmCi19Ci0KLWludAotYXJtX2RhdGFfaW5fY29kZSAoKQotewotICBpZiAodGh1bWJfbW9kZSAmJiAhIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciArIDEsICJkYXRhOiIsIDUpKQotICAgIHsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnLyc7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAobmFtZSkKLSAgICAgY2hhciAqIG5hbWU7Ci17Ci0gIGludCBsZW47Ci0KLSAgaWYgKHRodW1iX21vZGUgJiYgKGxlbiA9IHN0cmxlbiAobmFtZSkpID4gNQotICAgICAgJiYgc3RyZXEgKG5hbWUgKyBsZW4gLSA1LCAiL2RhdGEiKSkKLSAgICAqKG5hbWUgKyBsZW4gLSA1KSA9IDA7Ci0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLWJvb2xlYW4KLWFybV92YWxpZGF0ZV9maXggKGZpeFApCi0gICAgIGZpeFMgKiBmaXhQOwotewotICAvKiBJZiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGJyYW5jaCBpcyBhIGRlZmluZWQgc3ltYm9sIHdoaWNoIGRvZXMgbm90IGhhdmUKLSAgICAgdGhlIFRIVU1CX0ZVTkMgYXR0cmlidXRlLCB0aGVuIHdlIG11c3QgYmUgY2FsbGluZyBhIGZ1bmN0aW9uIHdoaWNoIGhhcwotICAgICB0aGUgKGludGVyZmFjZWFybSkgYXR0cmlidXRlLiAgV2UgbG9vayBmb3IgdGhlIFRodW1iIGVudHJ5IHBvaW50IHRvIHRoYXQKLSAgICAgZnVuY3Rpb24gYW5kIGNoYW5nZSB0aGUgYnJhbmNoIHRvIHJlZmVyIHRvIHRoYXQgZnVuY3Rpb24gaW5zdGVhZC4gICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzCi0gICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgJiYgISBUSFVNQl9JU19GVU5DIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgZml4UC0+ZnhfYWRkc3kgPSBmaW5kX3JlYWxfc3RhcnQgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBSZWxvY2F0aW9ucyBhZ2FpbnN0IFRodW1iIGZ1bmN0aW9uIG5hbWVzIG11c3QgYmUgbGVmdCB1bmFkanVzdGVkLAotICAgc28gdGhhdCB0aGUgbGlua2VyIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBjb3JyZWN0bHkgc2V0IHRoZQotICAgYm90dG9tIGJpdCBvZiB0aGVpciBhZGRyZXNzZXMuICBUaGUgTUlQUyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24KLSAgIGFsc28gcHJldmVudHMgcmVsb2NhdGlvbnMgdGhhdCBhcmUgbWlwcy0xNiBzcGVjaWZpYywgYnV0IEkgZG8gbm90Ci0gICBrbm93IHdoeSBpdCBkb2VzIHRoaXMuCi0KLSAgIEZJWE1FOgotICAgVGhlcmUgaXMgb25lIG90aGVyIHByb2JsZW0gdGhhdCBvdWdodCB0byBiZSBhZGRyZXNzZWQgaGVyZSwgYnV0Ci0gICB3aGljaCBjdXJyZW50bHkgaXMgbm90OiAgVGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgbGFiZWwgKHJhdGhlcgotICAgdGhhbiBhIGZ1bmN0aW9uKSBhbmQgdGhlbiBsYXRlciBqdW1waW5nIHRvIHRoYXQgYWRkcmVzcy4gIFN1Y2gKLSAgIGFkZHJlc3NlcyBhbHNvIG91Z2h0IHRvIGhhdmUgdGhlaXIgYm90dG9tIGJpdCBzZXQgKGFzc3VtaW5nIHRoYXQKLSAgIHRoZXkgcmVzaWRlIGluIFRodW1iIGNvZGUpLCBidXQgYXQgdGhlIG1vbWVudCB0aGV5IHdpbGwgbm90LiAgKi8KLSAgIAotYm9vbGVhbgotYXJtX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICAKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotCi0gIGlmIChUSFVNQl9JU19GVU5DIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICYmIGZpeFAtPmZ4X3N1YnN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KLQotY29uc3QgY2hhciAqCi1lbGYzMl9hcm1fdGFyZ2V0X2Zvcm1hdCAoKQotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgaWYgKHRhcmdldF9vYWJpKQotICAgICAgcmV0dXJuICJlbGYzMi1iaWdhcm0tb2FiaSI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICJlbGYzMi1iaWdhcm0iOwotICBlbHNlCi0gICAgaWYgKHRhcmdldF9vYWJpKQotICAgICAgcmV0dXJuICJlbGYzMi1saXR0bGVhcm0tb2FiaSI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICJlbGYzMi1saXR0bGVhcm0iOwotfQotCi12b2lkCi1hcm1lbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKQotICAgICBzeW1ib2xTICogc3ltcDsKLSAgICAgaW50ICogcHVudHA7Ci17Ci0gIGVsZl9mcm9iX3N5bWJvbCAoc3ltcCwgcHVudHApOwotfSAKLQotaW50Ci1hcm1fZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgc3RydWN0IGZpeCAqIGZpeHA7Ci17Ci0gIGlmICggICBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNICi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzKSAgICAKLSAgICByZXR1cm4gMTsKLSAgCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1hcm1fcGFyc2VfcmVsb2MgKCkKLXsKLSAgY2hhciAgIGlkWzE2XTsKLSAgY2hhciAqIGlwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RhdGljIHN0cnVjdAotICB7Ci0gICAgY2hhciAqIHN0cjsKLSAgICBpbnQgICAgbGVuOwotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgfQotICByZWxvY19tYXBbXSA9Ci0gIHsKLSNkZWZpbmUgTUFQKHN0cixyZWxvYykgeyBzdHIsIHNpemVvZiAoc3RyKS0xLCByZWxvYyB9Ci0gICAgTUFQICgiKGdvdCkiLCAgICBCRkRfUkVMT0NfQVJNX0dPVDMyKSwKLSAgICBNQVAgKCIoZ290b2ZmKSIsIEJGRF9SRUxPQ19BUk1fR09UT0ZGKSwKLSAgICAvKiBTY290dEI6IEphbiAzMCwgMTk5OCAqLwotICAgIC8qIEFkZGVkIHN1cHBvcnQgZm9yIHBhcnNpbmcgInZhcihQTFQpIiBicmFuY2ggaW5zdHJ1Y3Rpb25zICovCi0gICAgLyogZ2VuZXJhdGVkIGJ5IEdDQyBmb3IgUExUIHJlbG9jcyAqLwotICAgIE1BUCAoIihwbHQpIiwgICAgQkZEX1JFTE9DX0FSTV9QTFQzMiksCi0gICAgeyBOVUxMLCAwLCAgICAgICAgIEJGRF9SRUxPQ19VTlVTRUQgfQotI3VuZGVmIE1BUCAgICAKLSAgfTsKLQotICBmb3IgKGkgPSAwLCBpcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICBpIDwgc2l6ZW9mIChpZCkgJiYgKGlzYWxudW0gKCppcCkgfHwgaXNwdW5jdCAoKmlwKSk7Ci0gICAgICAgaSsrLCBpcCsrKQotICAgIGlkW2ldID0gdG9sb3dlciAoKmlwKTsKLSAgCi0gIGZvciAoaSA9IDA7IHJlbG9jX21hcFtpXS5zdHI7IGkrKykKLSAgICBpZiAoc3RybmNtcCAoaWQsIHJlbG9jX21hcFtpXS5zdHIsIHJlbG9jX21hcFtpXS5sZW4pID09IDApCi0gICAgICBicmVhazsKLSAgCi0gIGlucHV0X2xpbmVfcG9pbnRlciArPSByZWxvY19tYXBbaV0ubGVuOwotICAKLSAgcmV0dXJuIHJlbG9jX21hcFtpXS5yZWxvYzsKLX0KLQotc3RhdGljIHZvaWQKLXNfYXJtX2VsZl9jb25zIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9jb25zX2FsaWduCi0gIG1kX2NvbnNfYWxpZ24gKG5ieXRlcyk7Ci0jZW5kaWYKLQotICBkbwotICAgIHsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgICAgIAotICAgICAgZXhwcmVzc2lvbiAoJiBleHApOwotCi0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICAgICAmJiAqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnKCcKLSAgICAgICAgICAmJiAocmVsb2MgPSBhcm1fcGFyc2VfcmVsb2MoKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICAgICAgewotICAgICAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByZWxvYyk7Ci0gICAgICAgICAgaW50IHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLQotICAgICAgICAgIGlmIChzaXplID4gbmJ5dGVzKQotICAgICAgICAgICAgYXNfYmFkICgiJXMgcmVsb2NhdGlvbnMgZG8gbm90IGZpdCBpbiAlZCBieXRlcyIsCi0JCSAgICBob3d0by0+bmFtZSwgbmJ5dGVzKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlZ2lzdGVyIGNoYXIgKiBwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOwotICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gbmJ5dGVzIC0gc2l6ZTsKLQotICAgICAgICAgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwgc2l6ZSwKLQkJCSAgICYgZXhwLCAwLCByZWxvYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZW1pdF9leHByICgmIGV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hcm0uaCBiL2dhcy9jb25maWcvdGMtYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YWI4ODcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtYXJtLmgKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCU1vZGlmaWVkIGJ5IERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfQVJNIDEKLQotI2lmbmRlZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0jZW5kaWYKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgQ09GRl9NQUdJQyAJQVJNTUFHSUMKLSNkZWZpbmUgVEFSR0VUX0FSQ0ggCWJmZF9hcmNoX2FybQotCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgCTAKLQotI2RlZmluZSBESUZGX0VYUFJfT0sKLQotI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0jdW5kZWYgIExJVFRMRV9FTkRJQU4KLSNlbmRpZgotCi0jaWZkZWYgIEJJR19FTkRJQU4KLSN1bmRlZiAgQklHX0VORElBTgotI2VuZGlmCi0KLSNkZWZpbmUgTElUVExFX0VORElBTiAJMTIzNAotI2RlZmluZSBCSUdfRU5ESUFOIAk0MzIxCi0KLSNpZiBkZWZpbmVkIE9CSl9BT1VUCi0jaWYgZGVmaW5lZCBURV9SSVNDSVgKLSMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LXJpc2NpeCIKLSNlbGlmIGRlZmluZWQgVEVfTElOVVgKLSMgZGVmaW5lIEFSTV9CSV9FTkRJQU4KLSMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LWFybS1saW51eCIKLSNlbGlmIGRlZmluZWQgVEVfTmV0QlNECi0jIGRlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1hcm0tbmV0YnNkIgotI2Vsc2UKLSMgZGVmaW5lIEFSTV9CSV9FTkRJQU4KLSMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgXAotICAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiYS5vdXQtYXJtLWJpZyIgOiAiYS5vdXQtYXJtLWxpdHRsZSIpCi0jZW5kaWYKLSNlbmRpZiAvKiBPQkpfQU9VVCAqLwotCi0jaWZkZWYgT0JKX0FJRgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhaWYiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0jIGRlZmluZSBBUk1fQklfRU5ESUFOCi0gICAgIAotIyBkZWZpbmUgVENfVkFMSURBVEVfRklYKGZpeFAsIHNlZ1R5cGUsIExhYmVsKSBcCi0gICAgIGlmIChhcm1fdmFsaWRhdGVfZml4IChmaXhQKSkgYWRkX3N5bWJvbFAgPSBmaXhQLT5meF9hZGRzeQotICBleHRlcm4gYm9vbGVhbiBhcm1fdmFsaWRhdGVfZml4IFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0gICAgIAotI2lmZGVmIE9CSl9DT0ZGCi0jIGlmIGRlZmluZWQgVEVfUEUKLSMgIGRlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKHgpICgoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUlZBKQotIyAgIGlmZGVmIFRFX0VQT0MKLSMgICAgZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImVwb2MtcGUtYXJtLWJpZyIgOiAiZXBvYy1wZS1hcm0tbGl0dGxlIikKLSMgICBlbHNlCi0jICAgIGRlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJwZS1hcm0tYmlnIiA6ICJwZS1hcm0tbGl0dGxlIikKLSMgICBlbmRpZgotIyBlbHNlCi0jICBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiY29mZi1hcm0tYmlnIiA6ICJjb2ZmLWFybS1saXR0bGUiKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0jIGRlZmluZSBUQVJHRVRfRk9STUFUIGVsZjMyX2FybV90YXJnZXRfZm9ybWF0KCkKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBlbGYzMl9hcm1fdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7Ci0gIAotIyBkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSBhcm1fZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgZXh0ZXJuIGludCBhcm1fZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLSNlbmRpZgotCi0jZGVmaW5lIG1kX2NvbnZlcnRfZnJhZyhiLCBzLCBmKSB7YXNfZmF0YWwgKF8oImFybSBjb252ZXJ0X2ZyYWdcbiIpKTt9Ci0KLSNkZWZpbmUgbWRfY2xlYW51cCgpIGFybV9jbGVhbnVwICgpCi0gZXh0ZXJuIHZvaWQgYXJtX2NsZWFudXAgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIG1kX3N0YXJ0X2xpbmVfaG9vaygpIGFybV9zdGFydF9saW5lX2hvb2sgKCkKLSBleHRlcm4gdm9pZCBhcm1fc3RhcnRfbGluZV9ob29rIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKFMpIGFybV9mcm9iX2xhYmVsIChTKQotIGV4dGVybiB2b2lkIGFybV9mcm9iX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBXZSBhbHNvIG5lZWQgdG8gbWFyayBhc3NlbWJsZXIgY3JlYXRlZCBzeW1ib2xzOiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9mYWtlX2xhYmVsKFMpIGFybV9mcm9iX2xhYmVsIChTKQotCi0vKiBOT1RFOiBUaGUgZmFrZSBsYWJlbCBjcmVhdGlvbiBpbiBzdGFicy5jOnNfc3RhYl9nZW5lcmljKCkgaGFzCi0gICBkZWxpYmVyYXRlbHkgbm90IGJlZW4gdXBkYXRlZCB0byBtYXJrIGFzc2VtYmxlciBjcmVhdGVkIHN0YWJzCi0gICBzeW1ib2xzIGFzIFRodW1iLiAgKi8KLQotI2RlZmluZSBUQ19GSVhfVFlQRSBQVFIKLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGSVhQKSAoKEZJWFApLT50Y19maXhfZGF0YSA9IE5VTEwpCi0KLSNpZmRlZiBPQkpfRUxGCi0jaW5jbHVkZSAid3JpdGUuaCIgICAgICAgIC8qIEZvciBkZWZpbml0aW9uIG9mIGZpeFMgKi8KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIGFybV9maXhfYWRqdXN0YWJsZSAoZml4UCkKLWJvb2xlYW4gYXJtX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKGZpeFMgKikpOwotI2Vsc2UKLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIDAKLSNlbmRpZgotCi0vKiBXZSBuZWVkIHRvIGtlZXAgc29tZSBsb2NhbCBpbmZvcm1hdGlvbiBvbiBzeW1ib2xzLiAgKi8KLQotI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHVuc2lnbmVkIGludAotI2RlZmluZSBBUk1fR0VUX0ZMQUcocykgICAJKCpzeW1ib2xfZ2V0X3RjIChzKSkKLSNkZWZpbmUgQVJNX1NFVF9GTEFHKHMsdikgCSgqc3ltYm9sX2dldF90YyAocykgfD0gKHYpKQotI2RlZmluZSBBUk1fUkVTRVRfRkxBRyhzLHYpIAkoKnN5bWJvbF9nZXRfdGMgKHMpICY9IH4odikpCi0KLSNkZWZpbmUgQVJNX0ZMQUdfVEhVTUIgCQkoMSA8PCAwKQkvKiBUaGUgc3ltYm9sIGlzIGEgVGh1bWIgc3ltYm9sIHJhdGhlciB0aGFuIGFuIEFybSBzeW1ib2wuICAqLwotI2RlZmluZSBBUk1fRkxBR19JTlRFUldPUksgCSgxIDw8IDEpCS8qIFRoZSBzeW1ib2wgaXMgYXR0YWNoZWQgdG8gY29kZSB0aGF0IHN1cHBwb3J0cyBpbnRlcndvcmtpbmcuICAqLwotI2RlZmluZSBUSFVNQl9GTEFHX0ZVTkMJCSgxIDw8IDIpCS8qIFRoZSBzeW1ib2wgaXMgYXR0YWNoZWQgdG8gdGhlIHN0YXJ0IG9mIGEgVGh1bWIgZnVuY3Rpb24uICAqLwotCi0jZGVmaW5lIEFSTV9JU19USFVNQihzKQkJKEFSTV9HRVRfRkxBRyAocykgJiBBUk1fRkxBR19USFVNQikKLSNkZWZpbmUgQVJNX0lTX0lOVEVSV09SSyhzKQkoQVJNX0dFVF9GTEFHIChzKSAmIEFSTV9GTEFHX0lOVEVSV09SSykKLSNkZWZpbmUgVEhVTUJfSVNfRlVOQyhzKQkoQVJNX0dFVF9GTEFHIChzKSAmIFRIVU1CX0ZMQUdfRlVOQykKLQotI2RlZmluZSBBUk1fU0VUX1RIVU1CKHMsdCkgICAgICAoKHQpID8gQVJNX1NFVF9GTEFHIChzLCBBUk1fRkxBR19USFVNQikgICAgIDogQVJNX1JFU0VUX0ZMQUcgKHMsIEFSTV9GTEFHX1RIVU1CKSkKLSNkZWZpbmUgQVJNX1NFVF9JTlRFUldPUksocyx0KSAgKCh0KSA/IEFSTV9TRVRfRkxBRyAocywgQVJNX0ZMQUdfSU5URVJXT1JLKSA6IEFSTV9SRVNFVF9GTEFHIChzLCBBUk1fRkxBR19JTlRFUldPUkspKQotI2RlZmluZSBUSFVNQl9TRVRfRlVOQyhzLHQpICAgICAoKHQpID8gQVJNX1NFVF9GTEFHIChzLCBUSFVNQl9GTEFHX0ZVTkMpICAgIDogQVJNX1JFU0VUX0ZMQUcgKHMsIFRIVU1CX0ZMQUdfRlVOQykpCi0KLQotI2RlZmluZSBUQ19TVEFSVF9MQUJFTChDLFNUUikgXAotICAoYyA9PSAnOicgfHwgKGMgPT0gJy8nICYmIGFybV9kYXRhX2luX2NvZGUgKCkpKQotaW50IGFybV9kYXRhX2luX2NvZGUgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZShzdHIpIFwKLSBhcm1fY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzdHIpOwotY2hhciAqIGFybV9jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLSNkZWZpbmUgb2JqX2FkanVzdF9zeW10YWIoKSBhcm1fYWRqdXN0X3N5bXRhYiAoKQotIGV4dGVybiB2b2lkIGFybV9hZGp1c3Rfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKHN5bSwgcHVudCkgIGFybWVsZl9mcm9iX3N5bWJvbCAoKHN5bSksICYgKHB1bnQpKQotdm9pZCBhcm1lbGZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiQVJNIEdBUyAiCi0KLSNkZWZpbmUgT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYICclJwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09ICdMJykpCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAgIDEKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIExPQ0FMX0xBQkVMX1BSRUZJWCAnLicKLSNlbmRpZgotCi0vKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsIG9iamVjdAotICAgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4gIFRydWUgaWYgd2UKLSAgIGFyZSB3aWxsaW5nIHRvIHBlcmZvcm0gdGhpcyByZWxvY2F0aW9uIHdoaWxlIGJ1aWxkaW5nIHRoZSAubyBmaWxlLgotICAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHBjcmVsIHJlbG9jYXRpb25zLCBzbyBHT1RPRkYgZG9lcyBub3QgbmVlZCB0byBiZQotICAgY2hlY2tlZCBoZXJlLiAgSSBhbSBub3Qgc3VyZSBpZiBzb21lIG9mIHRoZSBvdGhlcnMgYXJlIGV2ZXIgdXNlZCB3aXRoCi0gICBwY3JlbCwgYnV0IGl0IGlzIGVhc2llciB0byBiZSBzYWZlIHRoYW4gc29ycnkuICAqLwotCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpICBcCi0gICAoICAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19BUk1fR09UMTIgXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfQVJNX0dPVDMyIFwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyKQotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfYXJtCi0gZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X2FybSBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGludCwgZXhwcmVzc2lvblMgKikpOwotCi0vKiBEb24ndCBhbGxvdyBzeW1ib2xzIHRvIGJlIGRpc2NhcmRlZCBvbiBHT1QgcmVsYXRlZCByZWxvY3MsCi0gICBub3Igb24gZ2xvYmFscy4gICovIAotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZSh4KSAoXAotICAgICAoKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9QTFQzMiBcCi0gICB8fCAoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX0dPVDMyIFwKLSAgIHx8ICh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fR09UT0ZGIFwKLSAgIHx8IFNfSVNfRVhURVJOICgoeCktPmZ4X2FkZHN5KSBcCi0gICB8fCBTX0lTX1dFQUsgKCh4KS0+ZnhfYWRkc3kpKSA/IDAgOiAxKQotICAgICAKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotI2Vsc2UKLSNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotI2VuZGlmCi0gICAgIAotLyogZW5kIG9mIHRjLWFybS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWF2ci5jIGIvZ2FzL2NvbmZpZy90Yy1hdnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4MDA4Yy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWF2ci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1MiArMCwwIEBACi0vKiB0Yy1hdnIuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIEFUTUVMIEFWUgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEZW5pcyBDaGVydHlrb3YgPGRlbmlzY0BvdmVydGEucnU+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIkIjsKLQotI2RlZmluZSBBVlJfSVNBXzEyMDAgICAgICAxCi0jZGVmaW5lIEFWUl9JU0FfMnh4eCAgICAgIDMKLSNkZWZpbmUgQVZSX0lTQV9NRUdBX3gwMyAgMHgxNwotI2RlZmluZSBBVlJfSVNBX01FR0EgICAgICAweDEwCi0jZGVmaW5lIEFWUl9JU0FfTUVHQV8xNjEgIDB4MWIKLQotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIm06IjsKLXN0cnVjdCBtY3VfdHlwZV9zCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBpc2E7Ci0gIGludCBtYWNoOwotfTsKLQotc3RhdGljIHN0cnVjdCBtY3VfdHlwZV9zIG1jdV90eXBlc1tdID0KLXsKLSAgeyJhdnIxIiwgICAgICBBVlJfSVNBXzEyMDAsICAgICBiZmRfbWFjaF9hdnIxfSwKLSAgeyJhdnIyIiwgICAgICBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdnIzIiwgICAgICBBVlJfSVNBX01FR0FfeDAzLCBiZmRfbWFjaF9hdnIzfSwKLSAgeyJhdnI0IiwgICAgICBBVlJfSVNBX01FR0FfMTYxLCBiZmRfbWFjaF9hdnI0fSwKLSAgeyJhdDkwczEyMDAiLCBBVlJfSVNBXzEyMDAsICAgICBiZmRfbWFjaF9hdnIxfSwKLSAgeyJhdDkwczIzMTMiLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdDkwczIzMjMiLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdDkwczIzMzMiLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdHRpbnkyMiIgLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdDkwczIzNDMiLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdDkwczQ0MzMiLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdDkwczQ0MTQiLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdDkwczQ0MzQiLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdDkwczg1MTUiLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdDkwczg1MzUiLCBBVlJfSVNBXzJ4eHgsICAgICBiZmRfbWFjaF9hdnIyfSwKLSAgeyJhdG1lZ2E2MDMiLCBBVlJfSVNBX01FR0FfeDAzLCBiZmRfbWFjaF9hdnIzfSwKLSAgeyJhdG1lZ2ExMDMiLCBBVlJfSVNBX01FR0FfeDAzLCBiZmRfbWFjaF9hdnIzfSwKLSAgeyJhdG1lZ2ExNjEiLCBBVlJfSVNBX01FR0FfMTYxLCBiZmRfbWFjaF9hdnI0fSwKLSAge05VTEwsIDAsIDB9Ci19OwotCi0KLS8qIEN1cnJlbnQgTUNVIHR5cGUuICAqLwotc3RhdGljIHN0cnVjdCBtY3VfdHlwZV9zIGRlZmF1bHRfbWN1ID0geyJhdnIyIiwgQVZSX0lTQV8yeHh4LGJmZF9tYWNoX2F2cjJ9Owotc3RhdGljIHN0cnVjdCBtY3VfdHlwZV9zICphdnJfbWN1ID0gJmRlZmF1bHRfbWN1OwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotc3RhdGljIHZvaWQgYXZyX3NldF9hcmNoIChpbnQgZHVtbXkpOwotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImFyY2giLCBhdnJfc2V0X2FyY2gsCTB9LAotICB7IE5VTEwsCU5VTEwsCQkwfQotfTsKLQotI2RlZmluZSBMRElfSU1NRURJQVRFKHgpICgoKHgpICYgMHhmKSB8ICgoKHgpIDw8IDQpICYgMHhmMDApKQotI2RlZmluZSBSRUdJU1RFUl9QKHgpICgoeCkgPT0gJ3InIHx8ICh4KSA9PSAnZCcgfHwgKHgpID09ICd3JykKLQotc3RydWN0IGF2cl9vcGNvZGVzX3MKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqY29uc3RyYWludHM7Ci0gIGNoYXIgKm9wY29kZTsKLSAgaW50IGluc25fc2l6ZTsJCS8qIGluIHdvcmRzICovCi0gIGludCBpc2E7Ci0gIHVuc2lnbmVkIGludCBiaW5fb3Bjb2RlOwotfTsKLQotc3RhdGljIGNoYXIgKiBza2lwX3NwYWNlIChjaGFyICogcyk7Ci1zdGF0aWMgY2hhciAqIGV4dHJhY3Rfd29yZCAoY2hhciAqZnJvbSwgY2hhciAqdG8sIGludCBsaW1pdCk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGF2cl9vcGVyYW5kIChzdHJ1Y3QgYXZyX29wY29kZXNfcyAqb3Bjb2RlLAotCQkJCSBpbnQgd2hlcmUsIGNoYXIgKm9wLCBjaGFyICoqbGluZSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGF2cl9vcGVyYW5kcyAoc3RydWN0IGF2cl9vcGNvZGVzX3MgKm9wY29kZSwgY2hhciAqKmxpbmUpOwotc3RhdGljIHVuc2lnbmVkIGludCBhdnJfZ2V0X2NvbnN0YW50IChjaGFyICogc3RyLCB1bnNpZ25lZCBpbnQgbWF4KTsKLXN0YXRpYyBjaGFyICpwYXJzZV9leHAgKGNoYXIgKnMsIGV4cHJlc3Npb25TICogb3ApOwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBhdnJfbGRpX2V4cHJlc3Npb24gKGV4cHJlc3Npb25TICpleHApOwotbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoZml4UyAqLCBzZWdUKSk7Ci0KLS8qIGNvbnN0cmFpbnQgbGV0dGVycwotICAgciAtIGFueSByZWdpc3RlcgotICAgZCAtIGBsZGknIHJlZ2lzdGVyIChyMTYtcjMxKQotICAgTSAtIGltbWVkaWF0ZSB2YWx1ZSBmcm9tIDAgdG8gMjU1Ci0gICBuIC0gaW1tZWRpYXRlIHZhbHVlIGZyb20gMCB0byAyNTUgKCBuID0gfk0gKS4gUmVsb2NhdGlvbiBpbXBvc3NpYmxlCi0gICB3IC0gYGFkaXcnIHJlZ2lzdGVyIChyMjQscjI2LHIyOCxyMzApCi0gICBzIC0gaW1tZWRpYXRlIHZhbHVlIGZyb20gMCB0byA3Ci0gICBQIC0gUG9ydCBhZGRyZXNzIHZhbHVlIGZyb20gMCB0byA2NC4gKGluLCBvdXQpCi0gICBwIC0gUG9ydCBhZGRyZXNzIHZhbHVlIGZyb20gMCB0byAzMi4gKGNiaSwgc2JpLCBzYmljLCBzYmlzKQotICAgSyAtIGltbWVkaWF0ZSB2YWx1ZSBmcm9tIDAgdG8gNjQgKHVzZWQgaW4gYGFkaXcnLCBgc2JpdycpCi0gICBlIC0gcG9pbnRlciByZWdlZ2lzdGVycyAoWCxZLFopCi0gICBiIC0gYmFzZSBwb2ludGVyIHJlZ2lzdGVyIGFuZCBkaXNwbGFjZW1lbnQgKFtZWl0rZGlzcCkKLSAgIGkgLSBpbW1lZGlhdGUgdmFsdWUKLSAgIGwgLSBzaWduZWQgcGMgcmVsYXRpdmUgb2Zmc2V0IGZyb20gLTY0IHRvIDYzCi0gICBMIC0gc2lnbmVkIHBjIHJlbGF0aXZlIG9mZnNldCBmcm9tIC0yMDQ4IHRvIDIwNDcKLSAgIGggLSBhYnNvbHV0IGNvZGUgYWRkcmVzcyAoY2FsbCwgam1wKQotICAgUyAtIGltbWVkaWF0ZSB2YWx1ZSBmcm9tIDAgdG8gNyAoUyA9IHMgPDwgNCkKLSovCi1zdHJ1Y3QgYXZyX29wY29kZXNfcyBhdnJfb3Bjb2Rlc1tdID0KLXsKLSAgeyJhZGMiLCAgInIsciIsICIwMDAxMTFyZGRkZGRycnJyIiwgMSwgQVZSX0lTQV8xMjAwLCAweDFjMDB9LAotICB7ImFkZCIsICAicixyIiwgIjAwMDAxMXJkZGRkZHJycnIiLCAxLCBBVlJfSVNBXzEyMDAsIDB4MGMwMH0sCi0gIHsiYW5kIiwgICJyLHIiLCAiMDAxMDAwcmRkZGRkcnJyciIsIDEsIEFWUl9JU0FfMTIwMCwgMHgyMDAwfSwKLSAgeyJjcCIsICAgInIsciIsICIwMDAxMDFyZGRkZGRycnJyIiwgMSwgQVZSX0lTQV8xMjAwLCAweDE0MDB9LAotICB7ImNwYyIsICAicixyIiwgIjAwMDAwMXJkZGRkZHJycnIiLCAxLCBBVlJfSVNBXzEyMDAsIDB4MDQwMH0sCi0gIHsiY3BzZSIsICJyLHIiLCAiMDAwMTAwcmRkZGRkcnJyciIsIDEsIEFWUl9JU0FfMTIwMCwgMHgxMDAwfSwKLSAgeyJlb3IiLCAgInIsciIsICIwMDEwMDFyZGRkZGRycnJyIiwgMSwgQVZSX0lTQV8xMjAwLCAweDI0MDB9LAotICB7Im1vdiIsICAicixyIiwgIjAwMTAxMXJkZGRkZHJycnIiLCAxLCBBVlJfSVNBXzEyMDAsIDB4MmMwMH0sCi0gIHsibXVsIiwgICJyLHIiLCAiMTAwMTExcmRkZGRkcnJyciIsIDEsIEFWUl9JU0FfTUVHQV8xNjEsIDB4OWMwMH0sCi0gIHsib3IiLCAgICJyLHIiLCAiMDAxMDEwcmRkZGRkcnJyciIsIDEsIEFWUl9JU0FfMTIwMCwgMHgyODAwfSwKLSAgeyJzYmMiLCAgInIsciIsICIwMDAwMTByZGRkZGRycnJyIiwgMSwgQVZSX0lTQV8xMjAwLCAweDA4MDB9LAotICB7InN1YiIsICAicixyIiwgIjAwMDExMHJkZGRkZHJycnIiLCAxLCBBVlJfSVNBXzEyMDAsIDB4MTgwMH0sCi0KLSAgeyJjbHIiLCAgInI9ciIsICIwMDEwMDFyZGRkZGRycnJyIiwgMSwgQVZSX0lTQV8xMjAwLCAweDI0MDB9LAotICB7ImxzbCIsICAicj1yIiwgIjAwMDAxMXJkZGRkZHJycnIiLCAxLCBBVlJfSVNBXzEyMDAsIDB4MGMwMH0sCi0gIHsicm9sIiwgICJyPXIiLCAiMDAwMTExcmRkZGRkcnJyciIsIDEsIEFWUl9JU0FfMTIwMCwgMHgxYzAwfSwKLSAgeyJ0c3QiLCAgInI9ciIsICIwMDEwMDByZGRkZGRycnJyIiwgMSwgQVZSX0lTQV8xMjAwLCAweDIwMDB9LAotCi0gIHsiYW5kaSIsICJkLE0iLCAiMDExMUtLS0tkZGRkS0tLSyIsIDEsIEFWUl9JU0FfMTIwMCwgMHg3MDAwfSwKLSAgLypYWFggc3BlY2lhbCBjYXNlKi8KLSAgeyJjYnIiLCAgImQsbiIsICIwMTExS0tLS2RkZGRLS0tLIiwgMSwgQVZSX0lTQV8xMjAwLCAweDcwMDB9LAotICB7ImNwaSIsICAiZCxNIiwgIjAwMTFLS0tLZGRkZEtLS0siLCAxLCBBVlJfSVNBXzEyMDAsIDB4MzAwMH0sCi0gIHsibGRpIiwgICJkLE0iLCAiMTExMEtLS0tkZGRkS0tLSyIsIDEsIEFWUl9JU0FfMTIwMCwgMHhlMDAwfSwKLSAgeyJvcmkiLCAgImQsTSIsICIwMTEwS0tLS2RkZGRLS0tLIiwgMSwgQVZSX0lTQV8xMjAwLCAweDYwMDB9LAotICB7InNiY2kiLCAiZCxNIiwgIjAxMDBLS0tLZGRkZEtLS0siLCAxLCBBVlJfSVNBXzEyMDAsIDB4NDAwMH0sCi0gIHsic2JyIiwgICJkLE0iLCAiMDExMEtLS0tkZGRkS0tLSyIsIDEsIEFWUl9JU0FfMTIwMCwgMHg2MDAwfSwKLSAgeyJzdWJpIiwgImQsTSIsICIwMTAxS0tLS2RkZGRLS0tLIiwgMSwgQVZSX0lTQV8xMjAwLCAweDUwMDB9LAotCi0gIHsic2JyYyIsICJyLHMiLCAiMTExMTExMHJycnJyMHNzcyIsIDEsIEFWUl9JU0FfMTIwMCwgMHhmYzAwfSwKLSAgeyJzYnJzIiwgInIscyIsICIxMTExMTExcnJycnIwc3NzIiwgMSwgQVZSX0lTQV8xMjAwLCAweGZlMDB9LAotICB7ImJsZCIsICAicixzIiwgIjExMTExMDBkZGRkZDBzc3MiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZjgwMH0sCi0gIHsiYnN0IiwgICJyLHMiLCAiMTExMTEwMWRkZGRkMHNzcyIsIDEsIEFWUl9JU0FfMTIwMCwgMHhmYTAwfSwKLQotICB7ImluIiwgICAicixQIiwgIjEwMTEwUFBkZGRkZFBQUFAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4YjAwMH0sCi0gIHsib3V0IiwgICJQLHIiLCAiMTAxMTFQUHJycnJyUFBQUCIsIDEsIEFWUl9JU0FfMTIwMCwgMHhiODAwfSwKLQotICB7ImFkaXciLCAidyxLIiwgIjEwMDEwMTEwS0tkZEtLS0siLCAxLCBBVlJfSVNBXzJ4eHgsIDB4OTYwMH0sCi0gIHsic2JpdyIsICJ3LEsiLCAiMTAwMTAxMTFLS2RkS0tLSyIsIDEsIEFWUl9JU0FfMnh4eCwgMHg5NzAwfSwKLQotICB7ImNiaSIsICAicCxzIiwgIjEwMDExMDAwcHBwcHBzc3MiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTgwMH0sCi0gIHsic2JpIiwgICJwLHMiLCAiMTAwMTEwMTBwcHBwcHNzcyIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5YTAwfSwKLSAgeyJzYmljIiwgInAscyIsICIxMDAxMTAwMXBwcHBwc3NzIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk5MDB9LAotICB7InNiaXMiLCAicCxzIiwgIjEwMDExMDExcHBwcHBzc3MiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OWIwMH0sCi0KLSAgLyogZWUgPSB7WD0xMSxZPTEwLFo9MDAsIDB9ICovCi0gIHsibGQiLCAgICJyLGUiLCAiMTAwITAwMGRkZGRkZWUtKyIsIDEsIEFWUl9JU0FfMnh4eCwgMHg4MDAwfSwKLSAgeyJzdCIsICAgImUsciIsICIxMDAhMDAxcnJycnJlZS0rIiwgMSwgQVZSX0lTQV8yeHh4LCAweDgyMDB9LAotICB7ImxkZCIsICAicixiIiwgIjEwbzBvbzBkZGRkZGJvb28iLCAxLCBBVlJfSVNBXzJ4eHgsIDB4ODAwMH0sCi0gIHsic3RkIiwgICJiLHIiLCAiMTBvMG9vMXJycnJyYm9vbyIsIDEsIEFWUl9JU0FfMnh4eCwgMHg4MjAwfSwKLSAgeyJzdHMiLCAgImksciIsICIxMDAxMDAxZGRkZGQwMDAwIiwgMiwgQVZSX0lTQV8yeHh4LCAweDkyMDB9LAotICB7ImxkcyIsICAicixpIiwgIjEwMDEwMDBkZGRkZDAwMDAiLCAyLCBBVlJfSVNBXzJ4eHgsIDB4OTAwMH0sCi0KLSAgeyJicmJjIiwgInMsbCIsICIxMTExMDFsbGxsbGxsc3NzIiwgMSwgQVZSX0lTQV8xMjAwLCAweGY0MDB9LAotICB7ImJyYnMiLCAicyxsIiwgIjExMTEwMGxsbGxsbGxzc3MiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZjAwMH0sCi0KLSAgeyJicmNjIiwgImwiLCAgICIxMTExMDFsbGxsbGxsMDAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweGY0MDB9LAotICB7ImJyY3MiLCAibCIsICAgIjExMTEwMGxsbGxsbGwwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZjAwMH0sCi0gIHsiYnJlcSIsICJsIiwgICAiMTExMTAwbGxsbGxsbDAwMSIsIDEsIEFWUl9JU0FfMTIwMCwgMHhmMDAxfSwKLSAgeyJicmdlIiwgImwiLCAgICIxMTExMDFsbGxsbGxsMTAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweGY0MDR9LAotICB7ImJyaGMiLCAibCIsICAgIjExMTEwMWxsbGxsbGwxMDEiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZjQwNX0sCi0gIHsiYnJocyIsICJsIiwgICAiMTExMTAwbGxsbGxsbDEwMSIsIDEsIEFWUl9JU0FfMTIwMCwgMHhmMDA1fSwKLSAgeyJicmlkIiwgImwiLCAgICIxMTExMDFsbGxsbGxsMTExIiwgMSwgQVZSX0lTQV8xMjAwLCAweGY0MDd9LAotICB7ImJyaWUiLCAibCIsICAgIjExMTEwMGxsbGxsbGwxMTEiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZjAwN30sCi0gIHsiYnJsbyIsICJsIiwgICAiMTExMTAwbGxsbGxsbDAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHhmMDAwfSwKLSAgeyJicmx0IiwgImwiLCAgICIxMTExMDBsbGxsbGxsMTAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweGYwMDR9LAotICB7ImJybWkiLCAibCIsICAgIjExMTEwMGxsbGxsbGwwMTAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZjAwMn0sCi0gIHsiYnJuZSIsICJsIiwgICAiMTExMTAxbGxsbGxsbDAwMSIsIDEsIEFWUl9JU0FfMTIwMCwgMHhmNDAxfSwKLSAgeyJicnBsIiwgImwiLCAgICIxMTExMDFsbGxsbGxsMDEwIiwgMSwgQVZSX0lTQV8xMjAwLCAweGY0MDJ9LAotICB7ImJyc2giLCAibCIsICAgIjExMTEwMWxsbGxsbGwwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZjQwMH0sCi0gIHsiYnJ0YyIsICJsIiwgICAiMTExMTAxbGxsbGxsbDExMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHhmNDA2fSwKLSAgeyJicnRzIiwgImwiLCAgICIxMTExMDBsbGxsbGxsMTEwIiwgMSwgQVZSX0lTQV8xMjAwLCAweGYwMDZ9LAotICB7ImJydmMiLCAibCIsICAgIjExMTEwMWxsbGxsbGwwMTEiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZjQwM30sCi0gIHsiYnJ2cyIsICJsIiwgICAiMTExMTAwbGxsbGxsbDAxMSIsIDEsIEFWUl9JU0FfMTIwMCwgMHhmMDAzfSwKLQotICB7InJjYWxsIiwgIkwiLCAgIjExMDFMTExMTExMTExMTEwiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZDAwMH0sCi0gIHsicmptcCIsICAiTCIsICAiMTEwMExMTExMTExMTExMTCIsIDEsIEFWUl9JU0FfMTIwMCwgMHhjMDAwfSwKLQotICB7ImNhbGwiLCAiaCIsICAgIjEwMDEwMTBoaGhoaDExMWgiLCAyLCBBVlJfSVNBX01FR0EsIDB4OTQwZX0sCi0gIHsiam1wIiwgICJoIiwgICAiMTAwMTAxMGhoaGhoMTEwaCIsIDIsIEFWUl9JU0FfTUVHQSwgMHg5NDBjfSwKLQotICB7ImFzciIsICAiciIsICAgIjEwMDEwMTBycnJycjAxMDEiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTQwNX0sCi0gIHsiY29tIiwgICJyIiwgICAiMTAwMTAxMHJycnJyMDAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NDAwfSwKLSAgeyJkZWMiLCAgInIiLCAgICIxMDAxMDEwcnJycnIxMDEwIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk0MGF9LAotICB7ImluYyIsICAiciIsICAgIjEwMDEwMTBycnJycjAwMTEiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTQwM30sCi0gIHsibHNyIiwgICJyIiwgICAiMTAwMTAxMHJycnJyMDExMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NDA2fSwKLSAgeyJuZWciLCAgInIiLCAgICIxMDAxMDEwcnJycnIwMDAxIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk0MDF9LAotICB7InBvcCIsICAiciIsICAgIjEwMDEwMDBycnJycjExMTEiLCAxLCBBVlJfSVNBXzJ4eHgsIDB4OTAwZn0sCi0gIHsicHVzaCIsICJyIiwgICAiMTAwMTAwMXJycnJyMTExMSIsIDEsIEFWUl9JU0FfMnh4eCwgMHg5MjBmfSwKLSAgeyJyb3IiLCAgInIiLCAgICIxMDAxMDEwcnJycnIwMTExIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk0MDd9LAotICB7InNlciIsICAiZCIsICAgIjExMTAxMTExZGRkZDExMTEiLCAxLCBBVlJfSVNBXzEyMDAsIDB4ZWYwZn0sCi0gIHsic3dhcCIsICJyIiwgICAiMTAwMTAxMHJycnJyMDAxMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NDAyfSwKLQotICB7ImJjbHIiLCAiUyIsICAgIjEwMDEwMTAwMVNTUzEwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTQ4OH0sCi0gIHsiYnNldCIsICJTIiwgICAiMTAwMTAxMDAwU1NTMTAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NDA4fSwKLQotICB7ImNsYyIsICAiIiwgCSAgIjEwMDEwMTAwMTAwMDEwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTQ4OH0sCi0gIHsiY2xoIiwgICIiLCAJICAiMTAwMTAxMDAxMTAxMTAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NGQ4fSwKLSAgeyJjbGkiLCAgIiIsIAkgICIxMDAxMDEwMDExMTExMDAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk0Zjh9LAotICB7ImNsbiIsICAiIiwgCSAgIjEwMDEwMTAwMTAxMDEwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTRhOH0sCi0gIHsiY2xzIiwgICIiLCAJICAiMTAwMTAxMDAxMTAwMTAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NGM4fSwKLSAgeyJjbHQiLCAgIiIsIAkgICIxMDAxMDEwMDExMTAxMDAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk0ZTh9LAotICB7ImNsdiIsICAiIiwgCSAgIjEwMDEwMTAwMTAxMTEwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTRiOH0sCi0gIHsiY2x6IiwgICIiLCAJICAiMTAwMTAxMDAxMDAxMTAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NDk4fSwKLSAgeyJpY2FsbCIsIiIsIAkgICIxMDAxMDEwMTAwMDAxMDAxIiwgMSwgQVZSX0lTQV8yeHh4LCAweDk1MDl9LAotICB7ImlqbXAiLCAiIiwgCSAgIjEwMDEwMTAwMDAwMDEwMDEiLCAxLCBBVlJfSVNBXzJ4eHgsIDB4OTQwOX0sCi0gIHsibHBtIiwgICIiLCAJICAiMTAwMTAxMDExMTAwMTAwMCIsIDEsIEFWUl9JU0FfMnh4eCwgMHg5NWM4fSwKLSAgeyJub3AiLCAgIiIsIAkgICIwMDAwMDAwMDAwMDAwMDAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweDAwMDB9LAotICB7InJldCIsICAiIiwgCSAgIjEwMDEwMTAxMDAwMDEwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTUwOH0sCi0gIHsicmV0aSIsICIiLCAJICAiMTAwMTAxMDEwMDAxMTAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NTE4fSwKLSAgeyJzZWMiLCAgIiIsIAkgICIxMDAxMDEwMDAwMDAxMDAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk0MDh9LAotICB7InNlaCIsICAiIiwgCSAgIjEwMDEwMTAwMDEwMTEwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTQ1OH0sCi0gIHsic2VpIiwgICIiLCAJICAiMTAwMTAxMDAwMTExMTAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NDc4fSwKLSAgeyJzZW4iLCAgIiIsIAkgICIxMDAxMDEwMDAwMTAxMDAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk0Mjh9LAotICB7InNlcyIsICAiIiwgCSAgIjEwMDEwMTAwMDEwMDEwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTQ0OH0sCi0gIHsic2V0IiwgICIiLCAJICAiMTAwMTAxMDAwMTEwMTAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NDY4fSwKLSAgeyJzZXYiLCAgIiIsIAkgICIxMDAxMDEwMDAwMTExMDAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk0Mzh9LAotICB7InNleiIsICAiIiwgCSAgIjEwMDEwMTAwMDAwMTEwMDAiLCAxLCBBVlJfSVNBXzEyMDAsIDB4OTQxOH0sCi0gIHsic2xlZXAiLCIiLCAJICAiMTAwMTAxMDExMDAwMTAwMCIsIDEsIEFWUl9JU0FfMTIwMCwgMHg5NTg4fSwKLSAgeyJ3ZHIiLCAgIiIsIAkgICIxMDAxMDEwMTEwMTAxMDAwIiwgMSwgQVZSX0lTQV8xMjAwLCAweDk1YTh9LAotICB7ImVscG0iLCAiIiwgCSAgIjEwMDEwMTAxMTEwMTEwMDAiLCAxLCBBVlJfSVNBX01FR0FfeDAzLCAweDk1ZDh9LAotICB7TlVMTCwgTlVMTCwgTlVMTCwgMCwgMCwgMH0KLX07Ci0KLQotCi0jZGVmaW5lIEVYUF9NT0RfTkFNRShpKSBleHBfbW9kW2ldLm5hbWUKLSNkZWZpbmUgRVhQX01PRF9SRUxPQyhpKSBleHBfbW9kW2ldLnJlbG9jCi0jZGVmaW5lIEVYUF9NT0RfTkVHX1JFTE9DKGkpIGV4cF9tb2RbaV0ubmVnX3JlbG9jCi0jZGVmaW5lIEhBVkVfUE1fUChpKSBleHBfbW9kW2ldLmhhdmVfcG0KLQotc3RydWN0IGV4cF9tb2RfcwotewotICBjaGFyICogbmFtZTsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgbmVnX3JlbG9jOwotICBpbnQgaGF2ZV9wbTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwX21vZF9zIGV4cF9tb2RbXSA9IHsKLSAgeyJoaDgiLCAgICBCRkRfUkVMT0NfQVZSX0hIOF9MREksICAgIEJGRF9SRUxPQ19BVlJfSEg4X0xESV9ORUcsICAgIDF9LAotICB7InBtX2hoOCIsIEJGRF9SRUxPQ19BVlJfSEg4X0xESV9QTSwgQkZEX1JFTE9DX0FWUl9ISDhfTERJX1BNX05FRywgMH0sCi0gIHsiaGk4IiwgICAgQkZEX1JFTE9DX0FWUl9ISThfTERJLCAgICBCRkRfUkVMT0NfQVZSX0hJOF9MRElfTkVHLCAgICAxfSwKLSAgeyJwbV9oaTgiLCBCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE0sIEJGRF9SRUxPQ19BVlJfSEk4X0xESV9QTV9ORUcsIDB9LAotICB7ImxvOCIsICAgIEJGRF9SRUxPQ19BVlJfTE84X0xESSwgICAgQkZEX1JFTE9DX0FWUl9MTzhfTERJX05FRywgICAgMX0sCi0gIHsicG1fbG84IiwgQkZEX1JFTE9DX0FWUl9MTzhfTERJX1BNLCBCRkRfUkVMT0NfQVZSX0xPOF9MRElfUE1fTkVHLCAwfSwKLSAgeyJobG84IiwgICAtQkZEX1JFTE9DX0FWUl9MTzhfTERJLCAgIC1CRkRfUkVMT0NfQVZSX0xPOF9MRElfTkVHLCAgIDB9LAotICB7ImhoaTgiLCAgIC1CRkRfUkVMT0NfQVZSX0hJOF9MREksICAgLUJGRF9SRUxPQ19BVlJfSEk4X0xESV9ORUcsICAgMH0sCi19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYXZyX2hhc2g7Ci0KLS8qIFJlbG9jIG1vZGlmaWVycyBoYXNoIGNvbnRyb2wgKGhoOCxoaTgsbG84LHBtX3h4KS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYXZyX21vZF9oYXNoOwotCi0jZGVmaW5lIE9QVElPTl9NTUNVIChPUFRJT05fTURfQkFTRSArIDEpCi0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAgeyJtbWN1IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdtJ30sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciAqCi1za2lwX3NwYWNlIChzKQotICAgICBjaGFyICogczsKLXsKLSAgd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKQotICAgICsrczsKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIEV4dHJhY3Qgb25lIHdvcmQgZnJvbSBGUk9NIGFuZCBjb3B5IGl0IHRvIFRPLiAgKi8KLXN0YXRpYyBjaGFyICoKLWV4dHJhY3Rfd29yZCAoY2hhciAqZnJvbSwgY2hhciAqdG8sIGludCBsaW1pdCkKLXsKLSAgY2hhciAqb3Bfc3RhcnQ7Ci0gIGNoYXIgKm9wX2VuZDsKLSAgaW50IHNpemUgPSAwOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgZnJvbSA9IHNraXBfc3BhY2UgKGZyb20pOwotICAqdG8gPSAwOwotICAvKiBGaW5kIHRoZSBvcCBjb2RlIGVuZC4gICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSBmcm9tOyAqb3BfZW5kICE9IDAgJiYgaXNfcGFydF9vZl9uYW1lKCpvcF9lbmQpOyApCi0gICAgewotICAgICAgdG9bc2l6ZSsrXSA9ICpvcF9lbmQrKzsKLSAgICAgIGlmIChzaXplICsgMSA+PSBsaW1pdCkKLQlicmVhazsKLSAgICB9Ci0gIHRvW3NpemVdID0gMDsKLSAgcmV0dXJuIG9wX2VuZDsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmCi0gICAgKHN0cmVhbSwKLSAgICAgXyAoIkFWUiBvcHRpb25zOlxuIgotCSIgIC1tbWN1PVthdnItbmFtZV0gc2VsZWN0IG1pY3JvY29udHJvbGxlciB2YXJpYW50XG4iCi0JIiAgICAgICAgICAgICAgICAgICBbYXZyLW5hbWVdIGNhbiBiZTpcbiIKLQkiICAgICAgICAgICAgICAgICAgIGF2cjEgLSBBVDkwUzEyMDBcbiIKLQkiICAgICAgICAgICAgICAgICAgIGF2cjIgLSBBVDkwUzJ4eHgsIEFUOTBTNHh4eCwgQVQ5MFM4NXh4LCBBVHRpbnkyMlxuIgotCSIgICAgICAgICAgICAgICAgICAgYXZyMyAtIEFUbWVnYTEwMyBvciBBVG1lZ2E2MDNcbiIKLQkiICAgICAgICAgICAgICAgICAgIGF2cjQgLSBBVG1lZ2ExNjFcbiIKLQkiICAgICAgICAgICAgICAgICAgIG9yIGltbWVkaWF0ZSBtaWNyb2NvbnRyb2xsZXIgbmFtZS5cbiIpKTsKLX0KLQotc3RhdGljIHZvaWQKLWF2cl9zZXRfYXJjaCAoZHVtbXkpCi0gICAgIGludCBkdW1teTsKLXsKLSAgY2hhciAqIHN0cjsKLSAgc3RyID0gKGNoYXIgKilhbGxvY2EgKDIwKTsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gZXh0cmFjdF93b3JkIChpbnB1dF9saW5lX3BvaW50ZXIsIHN0ciwgMjApOwotICBtZF9wYXJzZV9vcHRpb24gKCdtJywgc3RyKTsKLSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIGF2cl9tY3UtPm1hY2gpOwotfQotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBjaGFyICp0ID0gYWxsb2NhIChzdHJsZW4gKGFyZykgKyAxKTsKLSAgY2hhciAqcyA9IHQ7Ci0gIGNoYXIgKmFyZzEgPSBhcmc7Ci0gIGRvCi0gICAgKnQgPSB0b2xvd2VyICgqYXJnMSsrKTsKLSAgd2hpbGUgKCp0KyspOwotCi0gIGlmIChjID09ICdtJykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgbWN1X3R5cGVzW2ldLm5hbWU7ICsraSkKLQlpZiAoc3RyY21wIChtY3VfdHlwZXNbaV0ubmFtZSwgcykgPT0gMCkKLQkgIGJyZWFrOwotCi0gICAgICBpZiAoIW1jdV90eXBlc1tpXS5uYW1lKQotCWFzX2ZhdGFsIChfICgidW5rbm93biBNQ1U6ICVzXG4iKSwgYXJnKTsKLSAgICAgIGlmIChhdnJfbWN1ID09ICZkZWZhdWx0X21jdSkKLQlhdnJfbWN1ID0gJm1jdV90eXBlc1tpXTsKLSAgICAgIGVsc2UKLQlhc19mYXRhbCAoXyAoInJlZGVmaW5pdGlvbiBvZiBtY3UgdHlwZSBgJXMnIiksIG1jdV90eXBlc1tpXS5uYW1lKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbnZlcnQgYSBzdHJpbmcgcG9pbnRlZCB0byBieSBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50Ci0gICBjb25zdGFudCBvZiB0eXBlIGB0eXBlJywgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyB0byBgKmxpdFAnLgotICAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluIGAqc2l6ZVAnLiAgUmV0dXJucyBOVUxMIGlmCi0gICBPSywgb3IgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuICAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgLyogVGhpcyBsb29wIG91dHB1dHMgdGhlIExJVFRMRU5VTXMgaW4gUkVWRVJTRSBvcmRlci4gICovCi0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWMgLSAxOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUC0tKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBhYm9ydCAoKTsKLX0KLQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBpbnQgaTsKLSAgc3RydWN0IGF2cl9vcGNvZGVzX3MgKm9wY29kZTsKLSAgYXZyX2hhc2ggPSBoYXNoX25ldygpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYQotICAgICBxdWljayBpbmRleCB0byB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZQotICAgICB0YWJsZS4gICovCi0KLSAgZm9yIChvcGNvZGUgPSBhdnJfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICBoYXNoX2luc2VydCAoYXZyX2hhc2gsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQotICBhdnJfbW9kX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChleHBfbW9kKSAvIHNpemVvZiAoZXhwX21vZFswXSk7ICsraSkKLSAgICBoYXNoX2luc2VydCAoYXZyX21vZF9oYXNoLCBFWFBfTU9EX05BTUUoaSksICh2b2lkKikoaSsxMCkpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzVdOwotCi0gICAgICBzcHJpbnRmIChidWYsICJyJWQiLCBpKTsKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKGJ1ZiwgcmVnX3NlY3Rpb24sIGksCi0JCQkJICAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiUiVkIiwgaSk7Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChidWYsIHJlZ19zZWN0aW9uLCBpLAotCQkJCSAgICAgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgICB9Ci0KLSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIGF2cl9tY3UtPm1hY2gpOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWF2cl9vcGVyYW5kcyAob3Bjb2RlLCBsaW5lKQotICAgICBzdHJ1Y3QgYXZyX29wY29kZXNfcyAqb3Bjb2RlOwotICAgICBjaGFyICoqbGluZTsKLXsKLSAgY2hhciAqb3AgPSBvcGNvZGUtPmNvbnN0cmFpbnRzOwotICB1bnNpZ25lZCBpbnQgYmluID0gb3Bjb2RlLT5iaW5fb3Bjb2RlOwotICBjaGFyICpmcmFnID0gZnJhZ19tb3JlIChvcGNvZGUtPmluc25fc2l6ZSAqIDIpOwotICBjaGFyICpzdHIgPSAqbGluZTsKLSAgaW50IHdoZXJlID0gZnJhZyAtIGZyYWdfbm93LT5mcl9saXRlcmFsOwotCi0gIC8qIE9wY29kZSBoYXZlIG9wZXJhbmRzLiAgKi8KLSAgaWYgKCpvcCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgcmVnMSA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgcmVnMiA9IDA7Ci0gICAgICBpbnQgcmVnMV9wcmVzZW50ID0gMDsKLSAgICAgIGludCByZWcyX3ByZXNlbnQgPSAwOwotCi0gICAgICAvKiBQYXJzZSBmaXJzdCBvcGVyYW5kLiAgKi8KLSAgICAgIGlmIChSRUdJU1RFUl9QICgqb3ApKQotCXJlZzFfcHJlc2VudCA9IDE7Ci0gICAgICByZWcxID0gYXZyX29wZXJhbmQgKG9wY29kZSwgd2hlcmUsIG9wLCAmc3RyKTsKLSAgICAgICsrb3A7Ci0KLSAgICAgIC8qIFBhcnNlIHNlY29uZCBvcGVyYW5kLiAgKi8KLSAgICAgIGlmICgqb3ApCi0JewotCSAgaWYgKCpvcCA9PSAnLCcpCi0JICAgICsrb3A7Ci0JICBpZiAoKm9wID09ICc9JykKLQkgICAgewotCSAgICAgIHJlZzIgPSByZWcxOwotCSAgICAgIHJlZzJfcHJlc2VudCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChSRUdJU1RFUl9QICgqb3ApKQotCQlyZWcyX3ByZXNlbnQgPSAxOwotCi0JICAgICAgc3RyID0gc2tpcF9zcGFjZSAoc3RyKTsKLQkgICAgICBpZiAoKnN0cisrICE9ICcsJykKLQkJYXNfYmFkIChfICgiYCwnIHJlcXVpcmVkIikpOwotCSAgICAgIHN0ciA9IHNraXBfc3BhY2UgKHN0cik7Ci0KLQkgICAgICByZWcyID0gYXZyX29wZXJhbmQgKG9wY29kZSwgd2hlcmUsIG9wLCAmc3RyKTsKLQotCSAgICB9Ci0JICBpZiAocmVnMV9wcmVzZW50ICYmIHJlZzJfcHJlc2VudCkKLQkgICAgcmVnMiA9IChyZWcyICYgMHhmKSB8ICgocmVnMiA8PCA1KSAmIDB4MjAwKTsKLQkgIGVsc2UgaWYgKHJlZzJfcHJlc2VudCkKLQkgICAgcmVnMiA8PD0gNDsKLQl9Ci0gICAgICBpZiAocmVnMV9wcmVzZW50KQotCXJlZzEgPDw9IDQ7Ci0gICAgICBiaW4gfD0gcmVnMSB8IHJlZzI7Ci0gICAgfQotICBpZiAob3Bjb2RlLT5pbnNuX3NpemUgPT0gMikKLSAgICB7Ci0gICAgICBiZmRfcHV0bDMyICgoYmZkX3ZtYSliaW4sIGZyYWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9wdXRsMTYgKChiZmRfdm1hKWJpbiwgZnJhZyk7Ci0gICAgfQotICAqbGluZSA9IHN0cjsKLSAgcmV0dXJuIGJpbjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotYXZyX2dldF9jb25zdGFudCAoc3RyLCBtYXgpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIHVuc2lnbmVkIGludCBtYXg7Ci17Ci0gIGV4cHJlc3Npb25TIGV4OwotICBzdHIgPSBza2lwX3NwYWNlIChzdHIpOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0gIGV4cHJlc3Npb24gKCZleCk7Ci0KLSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKLSAgICBhc19iYWQgKF8oImNvbnN0YW50IHZhbHVlIHJlcXVpcmVkIikpOwotCi0gIGlmIChleC5YX2FkZF9udW1iZXIgPiBtYXgpCi0gICAgYXNfYmFkIChfKCJudW1iZXIgbXVzdCBiZSBsZXNzIHRoYW4gJWQiKSwgbWF4KzEpOwotICByZXR1cm4gZXguWF9hZGRfbnVtYmVyOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1hdnJfb3BlcmFuZCAob3Bjb2RlLCB3aGVyZSwgb3AsIGxpbmUpCi0gICAgIHN0cnVjdCBhdnJfb3Bjb2Rlc19zICpvcGNvZGU7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgY2hhciAqb3A7Ci0gICAgIGNoYXIgKipsaW5lOwotewotICB1bnNpZ25lZCBpbnQgb3BfbWFzayA9IDA7Ci0gIGNoYXIgKnN0ciA9ICpsaW5lOwotICBleHByZXNzaW9uUyBvcF9leHByOwotCi0gIHN0ciA9IHNraXBfc3BhY2UgKHN0cik7Ci0gIHN3aXRjaCAoKm9wKQotICAgIHsKLSAgICAgIC8qIEFueSByZWdpc3RlciBvcGVyYW5kLiAgKi8KLSAgICBjYXNlICd3JzoKLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdyJzoKLSAgICAgIHsKLQljaGFyIHJfbmFtZVsyNTZdOwotCXN0ciA9IGV4dHJhY3Rfd29yZCAoc3RyLCByX25hbWUsIHNpemVvZiAocl9uYW1lKSk7Ci0JcGFyc2VfZXhwIChyX25hbWUsICZvcF9leHByKTsKLQlpZiAob3BfZXhwci5YX29wID09IE9fcmVnaXN0ZXIpCi0JICB7Ci0JICAgIG9wX21hc2sgPSBvcF9leHByLlhfYWRkX251bWJlcjsKLQkgICAgaWYgKG9wX21hc2sgPD0gMzEpCi0JICAgICAgewotCQlpZiAoKm9wID09ICdkJykKLQkJICB7Ci0JCSAgICBpZiAob3BfbWFzayA8IDE2KQotCQkgICAgICBhc19iYWQgKF8gKCJyZWdpc3RlciBudW1iZXIgYWJvdmUgMTUgcmVxdWlyZWQiKSk7Ci0JCSAgICBvcF9tYXNrIC09IDE2OwotCQkgIH0KLQkJaWYgKCpvcCA9PSAndycpCi0JCSAgewotCQkgICAgb3BfbWFzayAtPSAyNDsKLQkJICAgIGlmIChvcF9tYXNrICYgMSB8fCBvcF9tYXNrID4gNikKLQkJICAgICAgYXNfYmFkIChfICgicmVnaXN0ZXIgcjI0LHIyNixyMjggb3IgcjMwIHJlcXVpcmVkIikpOwotCQkgICAgb3BfbWFzayA+Pj0gMTsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQlhc19iYWQgKF8gKCJyZWdpc3RlciByZXF1aXJlZCIpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZSc6Ci0gICAgICB7Ci0JY2hhciBjOwotCWlmICgqc3RyID09ICctJykKLQkgIHsKLQkgICAgc3RyID0gc2tpcF9zcGFjZSAoc3RyKzEpOwotCSAgICBvcF9tYXNrID0gMHgxMDAyOwotCSAgfQotCWMgPSB0b2xvd2VyICgqc3RyKTsKLQlpZiAoYyA9PSAneCcpCi0JICBvcF9tYXNrIHw9IDB4MTAwYzsKLQllbHNlIGlmIChjID09ICd5JykKLQkgIG9wX21hc2sgfD0gMHg4OwotCWVsc2UgaWYgKGMgIT0gJ3onKQotCSAgYXNfYmFkIChfICgicG9pbnRlciByZWdpc3RlciAoWCxZIG9yIFopIHJlcXVpcmVkIikpOwotCi0Jc3RyID0gc2tpcF9zcGFjZSAoc3RyKzEpOwotCWlmICgqc3RyID09ICcrJykKLQkgIHsKLQkgICAgKytzdHI7Ci0JICAgIGlmIChvcF9tYXNrICYgMikKLQkgICAgICBhc19iYWQgKF8gKCJjYW5ub3QgYm90aCBwcmVkZWNyZW1lbnQgYW5kIHBvc3RpbmNyZW1lbnQiKSk7Ci0JICAgIG9wX21hc2sgfD0gMHgxMDAxOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzoKLSAgICAgIHsKLQljaGFyIGMgPSB0b2xvd2VyICgqc3RyKyspOwotCWlmIChjID09ICd5JykKLQkgIG9wX21hc2sgfD0gMHg4OwotCWVsc2UgaWYgKGMgIT0gJ3onKQotCSAgYXNfYmFkIChfICgicG9pbnRlciByZWdpc3RlciAoWSBvciBaKSByZXF1aXJlZCIpKTsKLQlzdHIgPSBza2lwX3NwYWNlIChzdHIpOwotCWlmICgqc3RyKysgPT0gJysnKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgeDsKLQkgICAgeCA9IGF2cl9nZXRfY29uc3RhbnQgKHN0ciwgNjMpOwotCSAgICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIG9wX21hc2sgfD0gKHggJiA3KSB8ICgoeCAmICgzIDw8IDMpKSA8PCA3KSB8ICgoeCAmICgxIDw8IDUpKSA8PCA4KTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6Ci0gICAgICB7Ci0Jc3RyID0gcGFyc2VfZXhwIChzdHIsICZvcF9leHByKTsKLQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHdoZXJlLCBvcGNvZGUtPmluc25fc2l6ZSAqIDIsCi0JCSAgICAgJm9wX2V4cHIsIGZhbHNlLCBCRkRfUkVMT0NfQVZSX0NBTEwpOwotCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0wnOgotICAgICAgewotCXN0ciA9IHBhcnNlX2V4cCAoc3RyLCAmb3BfZXhwcik7Ci0JZml4X25ld19leHAgKGZyYWdfbm93LCB3aGVyZSwgb3Bjb2RlLT5pbnNuX3NpemUgKiAyLAotCQkgICAgICZvcF9leHByLCB0cnVlLCBCRkRfUkVMT0NfQVZSXzEzX1BDUkVMKTsKLQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdsJzoKLSAgICAgIHsKLQlzdHIgPSBwYXJzZV9leHAgKHN0ciwgJm9wX2V4cHIpOwotCWZpeF9uZXdfZXhwIChmcmFnX25vdywgd2hlcmUsIG9wY29kZS0+aW5zbl9zaXplICogMiwKLQkJICAgICAmb3BfZXhwciwgdHJ1ZSwgQkZEX1JFTE9DX0FWUl83X1BDUkVMKTsKLQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdpJzoKLSAgICAgIHsKLQlzdHIgPSBwYXJzZV9leHAgKHN0ciwgJm9wX2V4cHIpOwotCWZpeF9uZXdfZXhwIChmcmFnX25vdywgd2hlcmUrMiwgb3Bjb2RlLT5pbnNuX3NpemUgKiAyLAotCQkgICAgICZvcF9leHByLCBmYWxzZSwgQkZEX1JFTE9DXzE2KTsKLQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgIHsKLQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOwotIAlpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0gCXJfdHlwZSA9IGF2cl9sZGlfZXhwcmVzc2lvbiAoJm9wX2V4cHIpOwotIAlzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JZml4X25ld19leHAgKGZyYWdfbm93LCB3aGVyZSwgMywKLQkJICAgICAmb3BfZXhwciwgZmFsc2UsIHJfdHlwZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ24nOgotICAgICAgewotCXVuc2lnbmVkIGludCB4OwotCXggPSB+YXZyX2dldF9jb25zdGFudCAoc3RyLCAyNTUpOwotCXN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQlvcF9tYXNrIHw9ICh4ICYgMHhmKSB8ICgoeCA8PCA0KSAmIDB4ZjAwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSyc6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHg7Ci0JeCA9IGF2cl9nZXRfY29uc3RhbnQgKHN0ciwgNjMpOwotCXN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQlvcF9tYXNrIHw9ICh4ICYgMHhmKSB8ICgoeCAmIDB4MzApIDw8IDIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICBjYXNlICdzJzoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgeDsKLQl4ID0gYXZyX2dldF9jb25zdGFudCAoc3RyLCA3KTsKLQlzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JaWYgKCpvcCA9PSAnUycpCi0JICB4IDw8PSA0OwotCW9wX21hc2sgfD0geDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUCc6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHg7Ci0JeCA9IGF2cl9nZXRfY29uc3RhbnQgKHN0ciwgNjMpOwotCXN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQlvcF9tYXNrIHw9ICh4ICYgMHhmKSB8ICgoeCAmIDB4MzApIDw8IDUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgeDsKLQl4ID0gYXZyX2dldF9jb25zdGFudCAoc3RyLCAzMSk7Ci0Jc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCW9wX21hc2sgfD0geCA8PCAzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXyAoInVua25vd24gY29uc3RyYWludCBgJWMnIiksICpvcCk7Ci0gICAgfQotICAqbGluZSA9IHN0cjsKLSAgcmV0dXJuIG9wX21hc2s7Ci19Ci0KLS8qIEdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LAotICAgdG8gcGVybWl0IHRoZSBDUFUgYmFja2VuZCB0byBhZGp1c3QgdGhlIGFsaWdubWVudCBvZiBhIHNlY3Rpb24uICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0vKiBJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gdGhlIG9mZnNldCBiZXR3ZWVuIHRoZQotICAgYWRkcmVzcyBvZiBhIFBDIHJlbGF0aXZlIGZpeHVwIGFuZCB0aGUgcG9zaXRpb24gZnJvbSB3aGljaCB0aGUgUEMKLSAgIHJlbGF0aXZlIGFkanVzdG1lbnQgc2hvdWxkIGJlIG1hZGUuICBPbiBtYW55IHByb2Nlc3NvcnMsIHRoZSBiYXNlCi0gICBvZiBhIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIGlzIHRoZSBuZXh0IGluc3RydWN0aW9uLCBzbyB0aGlzCi0gICBtYWNybyB3b3VsZCByZXR1cm4gdGhlIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKU5VTEwKLSAgICAgICYmICghU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKLQkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjKSkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLS8qIEdBUyB3aWxsIGNhbGwgdGhpcyBmb3IgZWFjaCBmaXh1cC4gIEl0IHNob3VsZCBzdG9yZSB0aGUgY29ycmVjdAotICAgdmFsdWUgaW4gdGhlIG9iamVjdCBmaWxlLiAqLwotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICB1bnNpZ25lZCBjaGFyICp3aGVyZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBsb25nIHZhbHVlOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgc2VnVCBzID0gU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICYmIChzID09IHNlZyB8fCBzID09IGFic29sdXRlX3NlY3Rpb24pKQotCXsKLQkgIHZhbHVlID0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X2FkZHN5KSArICp2YWx1ZXA7Ci0JICBmaXhwLT5meF9kb25lID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JdmFsdWUgPSAqdmFsdWVwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gZml4cC0+Znhfb2Zmc2V0OwotICAgICAgaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKLQkgICAgICBmaXhwLT5meF9kb25lID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCi0gCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfICgiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgZml4cC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVZSXzdfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQVZSXzEzX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgIGNhc2UgQkZEX1JFTE9DX0FWUl9DQUxMOgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChmaXhwLT5meF9kb25lKQotICAgIHsKLSAgICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0JIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLwotICAgICAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICBpbnNuID0gYmZkX2dldGwxNiAod2hlcmUpOwotCi0gICAgICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfQVZSXzdfUENSRUw6Ci0JICBpZiAodmFsdWUgJiAxKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgIF8oIm9kZCBhZGRyZXNzIG9wZXJhbmQ6ICVsZCIpLCB2YWx1ZSk7Ci0JICAvKiBJbnN0cnVjdGlvbiBhZGRyZXNzZXMgYXJlIGFsd2F5cyByaWdodC1zaGlmdGVkIGJ5IDEuICAqLwotCSAgdmFsdWUgPj49IDE7Ci0JICAtLXZhbHVlOwkJCS8qIENvcnJlY3QgUEMuICAqLwotCSAgaWYgKHZhbHVlIDwgLTY0IHx8IHZhbHVlID4gNjMpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVsZCIpLCB2YWx1ZSk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCAzKSAmIDB4M2Y4OwotCSAgYmZkX3B1dGwxNiAoKGJmZF92bWEpICh2YWx1ZSB8IGluc24pLCB3aGVyZSk7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX0FWUl8xM19QQ1JFTDoKLQkgIGlmICh2YWx1ZSAmIDEpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgXygib2RkIGFkZHJlc3Mgb3BlcmFuZDogJWxkIiksIHZhbHVlKTsKLQkgIC8qIEluc3RydWN0aW9uIGFkZHJlc3NlcyBhcmUgYWx3YXlzIHJpZ2h0LXNoaWZ0ZWQgYnkgMS4gICovCi0JICB2YWx1ZSA+Pj0gMTsKLQkgIC0tdmFsdWU7CQkJLyogQ29ycmVjdCBQQy4gICovCi0JICAvKiBYWFggQVQ5MFM4NTE1IG11c3QgaGF2ZSBXUkFQIGhlcmUuICAqLwotCi0JICBpZiAodmFsdWUgPCAtMjA0OCB8fCB2YWx1ZSA+IDIwNDcpCi0JICAgIHsKLQkgICAgICBpZiAoYXZyX21jdS0+bWFjaCA9PSBiZmRfbWFjaF9hdnIyKQotCQl7Ci0JCSAgaWYgKHZhbHVlID4gMjA0NykKLQkJICAgIHZhbHVlIC09IDQwOTY7Ci0JCSAgZWxzZQotCQkgICAgdmFsdWUgKz0gNDA5NjsKLQkJfQotCSAgICAgIGVsc2UKLQkJYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVsZCIpLCB2YWx1ZSk7Ci0JICAgIH0KLQotCSAgdmFsdWUgJj0gMHhmZmY7Ci0JICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgKHZhbHVlIHwgaW5zbiksIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgdmFsdWUsIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfMTY6Ci0JICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgdmFsdWUsIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfQVZSXzE2X1BNOgotCSAgYmZkX3B1dGwxNiAoKGJmZF92bWEpICh2YWx1ZT4+MSksIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfQVZSX0xPOF9MREk6Ci0JICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgaW5zbiB8IExESV9JTU1FRElBVEUgKHZhbHVlKSwgd2hlcmUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIC1CRkRfUkVMT0NfQVZSX0xPOF9MREk6Ci0JICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgaW5zbiB8IExESV9JTU1FRElBVEUgKHZhbHVlID4+IDE2KSwgd2hlcmUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19BVlJfSEk4X0xESToKLQkgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSBpbnNuIHwgTERJX0lNTUVESUFURSAodmFsdWUgPj4gOCksIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAtQkZEX1JFTE9DX0FWUl9ISThfTERJOgotCSAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIGluc24gfCBMRElfSU1NRURJQVRFICh2YWx1ZSA+PiAyNCksIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfQVZSX0hIOF9MREk6Ci0JICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgaW5zbiB8IExESV9JTU1FRElBVEUgKHZhbHVlID4+IDE2KSwgd2hlcmUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19BVlJfTE84X0xESV9ORUc6Ci0JICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgaW5zbiB8IExESV9JTU1FRElBVEUgKC12YWx1ZSksIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAtQkZEX1JFTE9DX0FWUl9MTzhfTERJX05FRzoKLQkgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSBpbnNuIHwgTERJX0lNTUVESUFURSAoLXZhbHVlID4+IDE2KSwgd2hlcmUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19BVlJfSEk4X0xESV9ORUc6Ci0JICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgaW5zbiB8IExESV9JTU1FRElBVEUgKC12YWx1ZSA+PiA4KSwgd2hlcmUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIC1CRkRfUkVMT0NfQVZSX0hJOF9MRElfTkVHOgotCSAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIGluc24gfCBMRElfSU1NRURJQVRFICgtdmFsdWUgPj4gMjQpLCB3aGVyZSk7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX0FWUl9ISDhfTERJX05FRzoKLQkgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSBpbnNuIHwgTERJX0lNTUVESUFURSAoLXZhbHVlID4+IDE2KSwgd2hlcmUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19BVlJfTE84X0xESV9QTToKLQkgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSBpbnNuIHwgTERJX0lNTUVESUFURSAodmFsdWUgPj4gMSksIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE06Ci0JICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgaW5zbiB8IExESV9JTU1FRElBVEUgKHZhbHVlID4+IDkpLCB3aGVyZSk7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX0FWUl9ISDhfTERJX1BNOgotCSAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIGluc24gfCBMRElfSU1NRURJQVRFICh2YWx1ZSA+PiAxNyksIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfQVZSX0xPOF9MRElfUE1fTkVHOgotCSAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIGluc24gfCBMRElfSU1NRURJQVRFICgtdmFsdWUgPj4gMSksIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfQVZSX0hJOF9MRElfUE1fTkVHOgotCSAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIGluc24gfCBMRElfSU1NRURJQVRFICgtdmFsdWUgPj4gOSksIHdoZXJlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfQVZSX0hIOF9MRElfUE1fTkVHOgotCSAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIGluc24gfCBMRElfSU1NRURJQVRFICgtdmFsdWUgPj4gMTcpLCB3aGVyZSk7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX0FWUl9DQUxMOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIHg7Ci0JICAgIHggPSBiZmRfZ2V0bDE2ICh3aGVyZSk7Ci0JICAgIGlmICh2YWx1ZSAmIDEpCi0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oIm9kZCBhZGRyZXNzIG9wZXJhbmQ6ICVsZCIpLCB2YWx1ZSk7Ci0JICAgIHZhbHVlID4+PSAxOwotCSAgICB4IHw9ICgodmFsdWUgJiAweDEwMDAwKSB8ICgodmFsdWUgPDwgMykgJiAweDFmMDAwMDApKSA+PiAxNjsKLQkgICAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIHgsIHdoZXJlKTsKLQkgICAgYmZkX3B1dGwxNiAoKGJmZF92bWEpICh2YWx1ZSAmIDB4ZmZmZiksIHdoZXJlKzIpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKCBfKCJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIpLAotCQkgICAgIGZpeHAtPmZ4X2xpbmUsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0JewotCWNhc2UgLUJGRF9SRUxPQ19BVlJfSEk4X0xESV9ORUc6Ci0JY2FzZSAtQkZEX1JFTE9DX0FWUl9ISThfTERJOgotCWNhc2UgLUJGRF9SRUxPQ19BVlJfTE84X0xESV9ORUc6Ci0JY2FzZSAtQkZEX1JFTE9DX0FWUl9MTzhfTERJOgotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJXygib25seSBjb25zdGFudCBleHByZXNzaW9uIGFsbG93ZWQiKSk7Ci0JICBmaXhwLT5meF9kb25lID0gMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgICBmaXhwLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIEEgYEJGRF9BU1NFTUJMRVInIEdBUyB3aWxsIGNhbGwgdGhpcyB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgR0FTCi0gICB3aWxsIHBhc3MgdGhlIHJlc3VsdGluZyByZWxvYyB0byBgYmZkX2luc3RhbGxfcmVsb2NhdGlvbicuICBUaGlzCi0gICBjdXJyZW50bHkgd29ya3MgcG9vcmx5LCBhcyBgYmZkX2luc3RhbGxfcmVsb2NhdGlvbicgb2Z0ZW4gZG9lcyB0aGUKLSAgIHdyb25nIHRoaW5nLCBhbmQgaW5zdGFuY2VzIG9mIGB0Y19nZW5fcmVsb2MnIGhhdmUgYmVlbiB3cml0dGVuIHRvCi0gICB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbXMsIHdoaWNoIGluIHR1cm5zIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBmaXgKLSAgIGBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uJy4gKi8KLQotLyogSWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkCi0gICB0aGVuIGl0IGlzIGRvbmUgaGVyZS4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotCi0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9vZmZzZXQ7Ci0KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBzdHJ1Y3QgYXZyX29wY29kZXNfcyAqIG9wY29kZTsKLSAgY2hhciBvcFsxMV07Ci0KLSAgc3RyID0gZXh0cmFjdF93b3JkIChzdHIsIG9wLCBzaXplb2Yob3ApKTsKLQotICBpZiAoIW9wWzBdKQotICAgIGFzX2JhZCAoXyAoImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLQotICBvcGNvZGUgPSAoc3RydWN0IGF2cl9vcGNvZGVzX3MgKikgaGFzaF9maW5kIChhdnJfaGFzaCwgb3ApOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8gKCJ1bmtub3duIG9wY29kZSBgJXMnIiksIG9wKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKChvcGNvZGUtPmlzYSAmIGF2cl9tY3UtPmlzYSkgIT0gb3Bjb2RlLT5pc2EpCi0gICAgYXNfYmFkIChfICgiaWxsZWdhbCBvcGNvZGUgJXMgZm9yIG1jdSAlcyIpLCBvcGNvZGUtPm5hbWUsIGF2cl9tY3UtPm5hbWUpOwotCi0gIC8qIFdlIHVzZWQgdG8gc2V0IGlucHV0X2xpbmVfcG9pbnRlciB0byB0aGUgcmVzdWx0IG9mIGdldF9vcGVyYW5kcywKLSAgICAgYnV0IHRoYXQgaXMgd3JvbmcuICBPdXIgY2FsbGVyIGFzc3VtZXMgd2UgZG9uJ3QgY2hhbmdlIGl0LiAgKi8KLSAgewotICAgIGNoYXIgKnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgYXZyX29wZXJhbmRzIChvcGNvZGUsICZzdHIpOwotICAgIGlmICgqc3RyKQotICAgICAgYXNfYmFkIChfICgiZ2FyYmFnZSBhdCBlbmQgb2YgbGluZSIpKTsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICB9Ci19Ci0KLS8qIFBhcnNlIG9yZGluYXJ5IGV4cHJlc3Npb24uICAqLwotc3RhdGljIGNoYXIgKgotcGFyc2VfZXhwIChzLCBvcCkKLSAgICAgY2hhciAqczsKLSAgICAgZXhwcmVzc2lvblMgKiBvcDsKLXsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgZXhwcmVzc2lvbiAob3ApOwotICBpZiAob3AtPlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIHJldHVybiBpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLQotLyogUGFyc2Ugc3BlY2lhbCBleHByZXNzaW9ucyAobmVlZGVkIGZvciBMREkgY29tbWFuZCk6Ci0gICB4eDggKGFkZHJlc3MpCi0gICB4eDggKC1hZGRyZXNzKQotICAgcG1feHg4IChhZGRyZXNzKQotICAgcG1feHg4ICgtYWRkcmVzcykKLSAgIHdoZXJlIHh4IGlzOiBoaCwgaGksIGxvCi0qLwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotYXZyX2xkaV9leHByZXNzaW9uIChleHApCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGNoYXIgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqdG1wOwotICBjaGFyIG9wWzhdOwotICBpbnQgbW9kOwotICB0bXAgPSBzdHI7Ci0KLSAgc3RyID0gZXh0cmFjdF93b3JkIChzdHIsIG9wLCBzaXplb2YgKG9wKSk7Ci0gIGlmIChvcFswXSkKLSAgICB7Ci0gICAgICBtb2QgPSAoaW50KSBoYXNoX2ZpbmQgKGF2cl9tb2RfaGFzaCwgb3ApOwotICAgICAgaWYgKG1vZCkKLQl7Ci0JICBpbnQgY2xvc2VzID0gMDsKLQkgIG1vZCAtPSAxMDsKLQkgIHN0ciA9IHNraXBfc3BhY2UgKHN0cik7Ci0JICBpZiAoKnN0ciA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBpbnQgbmVnX3AgPSAwOwotCSAgICAgICsrc3RyOwotCSAgICAgIGlmIChzdHJuY21wICgicG0oIiwgc3RyLCAzKSA9PSAwCi0JCSAgfHwgc3RybmNtcCAoIi0ocG0oIiwgc3RyLCA1KSA9PSAwKQotCQl7Ci0JCSAgaWYgKEhBVkVfUE1fUChtb2QpKQotCQkgICAgewotCQkgICAgICArK21vZDsKLQkJICAgICAgKytjbG9zZXM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkIChfICgiaWxsZWdhbCBleHByZXNzaW9uIikpOwotCQkgIGlmICgqc3RyID09ICctJykKLQkJICAgIHsKLQkJICAgICAgbmVnX3AgPSAxOwotCQkgICAgICArK2Nsb3NlczsKLQkJICAgICAgc3RyICs9IDU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgc3RyICs9IDM7Ci0JCX0KLQkgICAgICBpZiAoKnN0ciA9PSAnLScgJiYgKihzdHIgKyAxKSA9PSAnKCcpCi0JCXsKLQkJICBuZWdfcCBePSAxOwotCQkgICsrY2xvc2VzOwotCQkgIHN0ciArPSAyOwotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCSAgICAgIGV4cHJlc3Npb24gKGV4cCk7Ci0JICAgICAgZG8KLQkJewotCQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJykKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfICgiYCknIHJlcXVpcmVkIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJfQotCSAgICAgIHdoaWxlIChjbG9zZXMtLSk7Ci0JICAgICAgcmV0dXJuIG5lZ19wID8gRVhQX01PRF9ORUdfUkVMT0MgKG1vZCkgOiBFWFBfTU9EX1JFTE9DIChtb2QpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gdG1wOwotICBleHByZXNzaW9uIChleHApOwotICByZXR1cm4gQkZEX1JFTE9DX0FWUl9MTzhfTERJOwotfQotCi0vKiBGbGFnIHRvIHBhc3MgYHBtJyBtb2RlIGJldHdlZW4gYGF2cl9wYXJzZV9jb25zX2V4cHJlc3Npb24nIGFuZAotICAgYGF2cl9jb25zX2ZpeF9uZXcnICovCi1zdGF0aWMgaW50IGV4cF9tb2RfcG0gPSAwOwotCi0vKiBQYXJzZSBzcGVjaWFsIENPTlMgZXhwcmVzc2lvbjogcG0gKGV4cHJlc3Npb24pCi0gICB3aGljaCBpcyB1c2VkIGZvciBhZGRyZXNzaW5nIHRvIGEgcHJvZ3JhbSBtZW1vcnkuCi0gICBSZWxvY2F0aW9uOiBCRkRfUkVMT0NfQVZSXzE2X1BNICovCi12b2lkCi1hdnJfcGFyc2VfY29uc19leHByZXNzaW9uIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgY2hhciAqIHRtcDsKLQotICBleHBfbW9kX3BtID0gMDsKLQotICB0bXAgPSBpbnB1dF9saW5lX3BvaW50ZXIgPSBza2lwX3NwYWNlIChpbnB1dF9saW5lX3BvaW50ZXIpOwotCi0gIGlmIChuYnl0ZXMgPT0gMikKLSAgICB7Ci0gICAgICBjaGFyICogcG1fbmFtZSA9ICJwbSI7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChwbV9uYW1lKTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCBwbV9uYW1lLCBsZW4pID09IDApCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2tpcF9zcGFjZSAoaW5wdXRfbGluZV9wb2ludGVyICsgbGVuKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcoJykKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNraXBfc3BhY2UgKGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotCSAgICAgIGV4cF9tb2RfcG0gPSAxOwotCSAgICAgIGV4cHJlc3Npb24gKGV4cCk7Ci0JICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyknKQotCQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc19iYWQgKF8gKCJgKScgcmVxdWlyZWQiKSk7Ci0JCSAgZXhwX21vZF9wbSA9IDA7Ci0JCX0KLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRtcDsKLQl9Ci0gICAgfQotICBleHByZXNzaW9uIChleHApOwotfQotCi12b2lkCi1hdnJfY29uc19maXhfbmV3KGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IG5ieXRlczsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaWYgKGV4cF9tb2RfcG0gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobmJ5dGVzID09IDIpCi0JZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCwgZmFsc2UsIEJGRF9SRUxPQ18xNik7Ci0gICAgICBlbHNlIGlmIChuYnl0ZXMgPT0gNCkKLQlmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwLCBmYWxzZSwgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8gKCJpbGxlZ2FsICVzcmVsb2NhdGlvbiBzaXplOiAlZCIpLCAiIiwgbmJ5dGVzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobmJ5dGVzID09IDIpCi0JZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCwgZmFsc2UsIEJGRF9SRUxPQ19BVlJfMTZfUE0pOwotICAgICAgZWxzZQotCWFzX2JhZCAoXyAoImlsbGVnYWwgJXNyZWxvY2F0aW9uIHNpemU6ICVkIiksICJgcG0nICIsIG5ieXRlcyk7Ci0gICAgICBleHBfbW9kX3BtID0gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWF2ci5oIGIvZ2FzL2NvbmZpZy90Yy1hdnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4ZDNlZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWF2ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1hdnIuaAotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSBEZW5pcyBDaGVydHlrb3YgPGRlbmlzY0BvdmVydGEucnU+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBBVlIgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotCi0jZGVmaW5lIFRDX0FWUgotLyogICBCeSBjb252ZW50aW9uLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIGluIHRoZSBgLmgnIGZpbGUuICBGb3IKLSAgICAgZXhhbXBsZSwgYHRjLW02OGsuaCcgZGVmaW5lcyBgVENfTTY4SycuICBZb3UgbWlnaHQgaGF2ZSB0byB1c2UgdGhpcwotICAgICBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIENQVSBzcGVjaWZpYyBjb2RlIHRvIHRoZSBvYmplY3QgZm9ybWF0Ci0gICAgIGZpbGUuICovCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItYXZyIgotLyogICBUaGlzIG1hY3JvIGlzIHRoZSBCRkQgdGFyZ2V0IG5hbWUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIG91dHB1dAotICAgICBmaWxlLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGRlcGVuZCB1cG9uIHRoZSBgT0JKX0ZNVCcgbWFjcm8uICovCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfYXZyCi0vKiAgIFRoaXMgbWFjcm8gaXMgdGhlIEJGRCBhcmNoaXRlY3R1cmUgdG8gcGFzcyB0byBgYmZkX3NldF9hcmNoX21hY2gnLiAqLwotCi0jZGVmaW5lIFRBUkdFVF9NQUNIIDAKLS8qICAgVGhpcyBtYWNybyBpcyB0aGUgQkZEIG1hY2hpbmUgbnVtYmVyIHRvIHBhc3MgdG8KLSAgICAgYGJmZF9zZXRfYXJjaF9tYWNoJy4gIElmIGl0IGlzIG5vdCBkZWZpbmVkLCBHQVMgd2lsbCB1c2UgMC4gKi8KLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0vKiAgIFlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gdG8gYmUgbm9uLXplcm8gaWYgdGhlIHRhcmdldCBpcyBiaWcKLSAgICAgZW5kaWFuLCBhbmQgemVybyBpZiB0aGUgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4uICovCi0KLSNkZWZpbmUgT05MWV9TVEFOREFSRF9FU0NBUEVTCi0vKiAgIElmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgd2FybiBhYm91dCB0aGUgdXNlIG9mCi0gICAgIG5vbnN0YW5kYXJkIGVzY2FwZSBzZXF1ZW5jZXMgaW4gYSBzdHJpbmcuICovCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotLyogICBHQVMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGFueSBleHByZXNzaW9uIHRoYXQgY2FuIG5vdCBiZQotICAgICByZWNvZ25pemVkLiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLCBgaW5wdXRfbGluZV9wb2ludGVyJwotICAgICB3aWxsIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgZXhwcmVzc2lvbi4gKi8KLQotdm9pZCBhdnJfcGFyc2VfY29uc19leHByZXNzaW9uIChleHByZXNzaW9uUyAqZXhwLCBpbnQgbmJ5dGVzKTsKLQotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQUixOKSBhdnJfcGFyc2VfY29uc19leHByZXNzaW9uIChFWFBSLE4pCi0vKgotICAgICBZb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24gdXNlZCBpbiBhIGRhdGEKLSAgICAgYWxsb2NhdGlvbiBwc2V1ZG8tb3Agc3VjaCBhcyBgLndvcmQnLiAgWW91IGNhbiB1c2UgdGhpcyB0bwotICAgICByZWNvZ25pemUgcmVsb2NhdGlvbiBkaXJlY3RpdmVzIHRoYXQgbWF5IGFwcGVhciBpbiBzdWNoIGRpcmVjdGl2ZXMuKi8KLQotdm9pZCBhdnJfY29uc19maXhfbmV3KGZyYWdTICpmcmFnLGludCB3aGVyZSwgaW50IG5ieXRlcywgZXhwcmVzc2lvblMgKmV4cCk7Ci0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXKEZSQUcsV0hFUkUsTixFWFApIGF2cl9jb25zX2ZpeF9uZXcoRlJBRyxXSEVSRSxOLEVYUCkKLS8qICAgWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciBhIGRhdGEKLSAgICAgYWxsb2NhdGlvbiBwc2V1ZG8tb3AuICovCi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLS8qICAgVGhpcyBzaG91bGQganVzdCBjYWxsIGVpdGhlciBgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbicgb3IKLSAgICAgYG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4nLCB3aGljaGV2ZXIgaXMgYXBwcm9wcmlhdGUuICBPbgotICAgICB0YXJnZXRzIGxpa2UgdGhlIE1JUFMgd2hpY2ggc3VwcG9ydCBvcHRpb25zIHRvIGNoYW5nZSB0aGUKLSAgICAgZW5kaWFubmVzcywgd2hpY2ggZnVuY3Rpb24gdG8gY2FsbCBpcyBhIHJ1bnRpbWUgZGVjaXNpb24uICBPbgotICAgICBvdGhlciB0YXJnZXRzLCBgbWRfbnVtYmVyX3RvX2NoYXJzJyBjYW4gYmUgYSBzaW1wbGUgbWFjcm8uICovCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotLyoKLWBtZF9zaG9ydF9qdW1wX3NpemUnCi1gbWRfbG9uZ19qdW1wX3NpemUnCi1gbWRfY3JlYXRlX3Nob3J0X2p1bXAnCi1gbWRfY3JlYXRlX2xvbmdfanVtcCcKLSAgICAgSWYgYFdPUktJTkdfRE9UX1dPUkQnIGlzIGRlZmluZWQsIEdBUyB3aWxsIG5vdCBkbyBicm9rZW4gd29yZAotICAgICBwcm9jZXNzaW5nICgqbm90ZSBCcm9rZW4gd29yZHM6Oi4pLiAgT3RoZXJ3aXNlLCB5b3Ugc2hvdWxkIHNldAotICAgICBgbWRfc2hvcnRfanVtcF9zaXplJyB0byB0aGUgc2l6ZSBvZiBhIHNob3J0IGp1bXAgKGEganVtcCB0aGF0IGlzCi0gICAgIGp1c3QgbG9uZyBlbm91Z2ggdG8ganVtcCBhcm91bmQgYSBsb25nIGptcCkgYW5kCi0gICAgIGBtZF9sb25nX2p1bXBfc2l6ZScgdG8gdGhlIHNpemUgb2YgYSBsb25nIGp1bXAgKGEganVtcCB0aGF0IGNhbiBnbwotICAgICBhbnl3aGVyZSBpbiB0aGUgZnVuY3Rpb24pLCBZb3Ugc2hvdWxkIGRlZmluZQotICAgICBgbWRfY3JlYXRlX3Nob3J0X2p1bXAnIHRvIGNyZWF0ZSBhIHNob3J0IGp1bXAgYXJvdW5kIGEgbG9uZyBqdW1wLAotICAgICBhbmQgZGVmaW5lIGBtZF9jcmVhdGVfbG9uZ19qdW1wJyB0byBjcmVhdGUgYSBsb25nIGp1bXAuICovCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotCi0jdW5kZWYgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi0vKiAgIElmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgaXQgbWVhbnMgdGhhdCBgdGNfZ2VuX3JlbG9jJyBtYXkgcmV0dXJuCi0gICAgIG11bHRpcGxlIHJlbG9jYXRpb24gZW50cmllcyBmb3IgYSBzaW5nbGUgZml4dXAuICBJbiB0aGlzIGNhc2UsIHRoZQotICAgICByZXR1cm4gdmFsdWUgb2YgYHRjX2dlbl9yZWxvYycgaXMgYSBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkCi0gICAgIGFycmF5LiAqLwotCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpICAgCi0vKiAgIElmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgaXQgc2hvdWxkIHJldHVybiB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlCi0gICAgIGFkZHJlc3Mgb2YgYSBQQyByZWxhdGl2ZSBmaXh1cCBhbmQgdGhlIHBvc2l0aW9uIGZyb20gd2hpY2ggdGhlIFBDCi0gICAgIHJlbGF0aXZlIGFkanVzdG1lbnQgc2hvdWxkIGJlIG1hZGUuICBPbiBtYW55IHByb2Nlc3NvcnMsIHRoZSBiYXNlCi0gICAgIG9mIGEgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gaXMgdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHNvIHRoaXMKLSAgICAgbWFjcm8gd291bGQgcmV0dXJuIHRoZSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24uICovCi0KLSNkZWZpbmUgTElTVElOR19XT1JEX1NJWkUgMgotLyogICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHB1dCBpbnRvIGEgd29yZCBpbiBhIGxpc3RpbmcuICBUaGlzIGFmZmVjdHMKLSAgICAgdGhlIHdheSB0aGUgYnl0ZXMgYXJlIGNsdW1wZWQgdG9nZXRoZXIgaW4gdGhlIGxpc3RpbmcuICBGb3IKLSAgICAgZXhhbXBsZSwgYSB2YWx1ZSBvZiAyIG1pZ2h0IHByaW50IGAxMjM0IDU2NzgnIHdoZXJlIGEgdmFsdWUgb2YgMQotICAgICB3b3VsZCBwcmludCBgMTIgMzQgNTYgNzgnLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4gKi8KLQotI2RlZmluZSBMRVhfRE9MTEFSIDAKLS8qIEFWUiBwb3J0IHVzZXMgYCQnIGFzIGEgbG9naWNhbCBsaW5lIHNlcGFyYXRvciAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmMgYi9nYXMvY29uZmlnL3RjLWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIwYWUxMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWQxMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NjMgKzAsMCBAQAotLyogdGMtZDEwdi5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTWl0c3ViaXNoaSBEMTBWCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL2QxMHYuaCIKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIk8iOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQotaW50IE9wdGltaXppbmcgPSAwOwotCi0jZGVmaW5lIEFUX1dPUkRfUChYKSAoKFgpLT5YX29wID09IE9fcmlnaHRfc2hpZnQgXAotCQkgICAgICAmJiAoWCktPlhfb3Bfc3ltYm9sICE9IE5VTEwgXAotCQkgICAgICAmJiBzeW1ib2xfY29uc3RhbnRfcCAoKFgpLT5YX29wX3N5bWJvbCkgXAotCQkgICAgICAmJiBTX0dFVF9WQUxVRSAoKFgpLT5YX29wX3N5bWJvbCkgPT0gQVRfV09SRF9SSUdIVF9TSElGVCkKLSNkZWZpbmUgQVRfV09SRF9SSUdIVF9TSElGVCAyCi0KLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCBkMTB2X2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9wZXJhbmQ7Ci0gIGludCBwY3JlbDsKLSAgaW50IHNpemU7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9maXh1cHMKLXsKLSAgaW50IGZjOwotICBzdHJ1Y3QgZDEwdl9maXh1cCBmaXhbTUFYX0lOU05fRklYVVBTXTsKLSAgc3RydWN0IF9maXh1cHMgKm5leHQ7Ci19IEZpeHVwczsKLQotc3RhdGljIEZpeHVwcyBGaXhVcHNbMl07Ci1zdGF0aWMgRml4dXBzICpmaXh1cHM7Ci0KLXN0YXRpYyBpbnQgZG9fbm90X2lnbm9yZV9oYXNoID0gMDsKLQotLyogVHJ1ZSBpZiBpbnN0cnVjdGlvbiBzd2FwcGluZyB3YXJuaW5ncyBzaG91bGQgYmUgaW5oaWJpdGVkLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXA7IC8qIC0tbm93YXJuc3dhcCAqLwotCi0vKiBsb2NhbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBpbnQgcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBpbnQgY2hlY2tfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyBudW0sIGludCBiaXRzLCBpbnQgZmxhZ3MpKTsKLXN0YXRpYyBpbnQgcG9zdGZpeCBQQVJBTVMgKChjaGFyICpwKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGdldF9yZWxvYyBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcCkpOwotc3RhdGljIGludCBnZXRfb3BlcmFuZHMgUEFSQU1TICgoZXhwcmVzc2lvblMgZXhwW10pKTsKLXN0YXRpYyBzdHJ1Y3QgZDEwdl9vcGNvZGUgKmZpbmRfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlLCBleHByZXNzaW9uUyBvcHNbXSkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVpbGRfaW5zbiBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgZXhwcmVzc2lvblMgKm9wZXJzLCB1bnNpZ25lZCBsb25nIGluc24pKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2xvbmcgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIHVuc2lnbmVkIGxvbmcgaW5zbiwgRml4dXBzICpmeCkpOwotc3RhdGljIHZvaWQgd3JpdGVfMV9zaG9ydCBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgdW5zaWduZWQgbG9uZyBpbnNuLCBGaXh1cHMgKmZ4KSk7Ci1zdGF0aWMgaW50IHdyaXRlXzJfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUxLCB1bnNpZ25lZCBsb25nIGluc24xLCAKLQkJCQkgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwgaW50IGV4ZWNfdHlwZSwgRml4dXBzICpmeCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9fYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgZDEwdl9vcGNvZGUgKipvcGNvZGUpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGQxMHZfaW5zZXJ0X29wZXJhbmQgUEFSQU1TICgoIHVuc2lnbmVkIGxvbmcgaW5zbiwgaW50IG9wX3R5cGUsCi0JCQkJCQkgICBvZmZzZXRUIHZhbHVlLCBpbnQgbGVmdCwgZml4UyAqZml4KSk7Ci1zdGF0aWMgaW50IHBhcmFsbGVsX29rIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCi0JCQkJc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUyLCB1bnNpZ25lZCBsb25nIGluc24yLAotCQkJCWludCBleGVjX3R5cGUpKTsKLXN0YXRpYyBzeW1ib2xTICogZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotI2RlZmluZSBPUFRJT05fTk9XQVJOU1dBUCAoT1BUSU9OX01EX0JBU0UpCi0gIHsibm93YXJuc3dhcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9XQVJOU1dBUH0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7ICAgICAgIAotCi1zdGF0aWMgdm9pZCBkMTB2X2RvdF93b3JkIFBBUkFNUyAoKGludCkpOwotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJ3b3JkIiwJZDEwdl9kb3Rfd29yZCwJMiB9LAotICB7IE5VTEwsICAgICAgIE5VTEwsICAgICAgICAgICAwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpkMTB2X2hhc2g7Ci0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycwotICAgYXJyYXkgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IGQxMHZfcmVnX25hbWVfY250KCkgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZSAKLQkgIHJldHVybiBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIHJlZ2lzdGVyX25hbWUoKSBjaGVja3MgdGhlIHN0cmluZyBhdCBpbnB1dF9saW5lX3BvaW50ZXIKLSAgIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIHJlZ2lzdGVyIG5hbWUgKi8KLQotc3RhdGljIGludAotcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgYywgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIAotICB3aGlsZSAoKnAgJiYgKnAhPSdcbicgJiYgKnAhPSdccicgJiYgKnAgIT0nLCcgJiYgKnAhPScgJyAmJiAqcCE9JyknKQotICAgIHArKzsKLQotICBjID0gKnA7Ci0gIGlmIChjKQotICAgICpwKysgPSAwOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIC8qIHRlbXBvcmFyaWx5IHN0b3JlIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGhlcmUgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoYykKLSAgICAqKHAtMSkgPSBjOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1jaGVja19yYW5nZSAobnVtLCBiaXRzLCBmbGFncykKLSAgICAgdW5zaWduZWQgbG9uZyBudW07Ci0gICAgIGludCBiaXRzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGxvbmcgbWluLCBtYXgsIGJpdDE7Ci0gIGludCByZXR2YWw9MDsKLQotICAvKiBkb24ndCBib3RoZXIgY2hlY2tpbmcgMTYtYml0IHZhbHVlcyAqLwotICBpZiAoYml0cyA9PSAxNikKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotICAgIHsKLSAgICAgIC8qIGFsbCBzcGVjaWFsIHNoaWZ0IG9wZXJhbmRzIGFyZSB1bnNpZ25lZCAqLwotICAgICAgLyogYW5kIDw9IDE2LiAgV2UgYWxsb3cgMCBmb3Igbm93LiAqLwotICAgICAgaWYgKG51bT4xNikKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0gICAgewotICAgICAgLyogU2lnbmVkIDMtYml0IGludGVnZXJzIGFyZSByZXN0cmljdGVkIHRvIHRoZSAoLTIsIDMpIHJhbmdlICovCi0gICAgICBpZiAoZmxhZ3MgJiBSRVNUUklDVEVEX05VTTMpCi0JewotCSAgaWYgKChsb25nKSBudW0gPCAtMiB8fCAobG9uZykgbnVtID4gMykKLQkgICAgcmV0dmFsID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOyAKLQkgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7ICAKLQkgIGlmICgoKGxvbmcpIG51bSA+IG1heCkgfHwgKChsb25nKSBudW0gPCBtaW4pKQotCSAgICByZXR2YWwgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0gICAgICBtaW4gPSAwOwotICAgICAgaWYgKChudW0gPiBtYXgpIHx8IChudW0gPCBtaW4pKQotCXJldHZhbCA9IDE7Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiRDEwViBvcHRpb25zOlxuXAotLU8gICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUuICBXaWxsIGRvIHNvbWUgb3BlcmF0aW9ucyBpbiBwYXJhbGxlbC5cbiIpKTsKLX0gCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnTyc6Ci0gICAgICAvKiBPcHRpbWl6ZS4gV2lsbCBhdHRlbXB0IHRvIHBhcmFsbGVsaXplIG9wZXJhdGlvbnMgKi8KLSAgICAgIE9wdGltaXppbmcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTk9XQVJOU1dBUDoKLSAgICAgIGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXAgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0gIAotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgCi0gICpzaXplUCA9IHByZWMgKiAyOwotICAKLSAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgZDEwdl9oYXNoID0gaGFzaF9uZXcoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBEMTB2IGluc3RydWN0aW9uIHNldAotICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAotICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCi0gICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotICBmb3IgKG9wY29kZSA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKilkMTB2X29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcGNvZGUtPm5hbWUpKQotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopb3Bjb2RlLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKGQxMHZfaGFzaCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCX0KLSAgICB9Ci0KLSAgZml4dXBzID0gJkZpeFVwc1swXTsKLSAgRml4VXBzWzBdLm5leHQgPSAmRml4VXBzWzFdOwotICBGaXhVcHNbMV0ubmV4dCA9ICZGaXhVcHNbMF07Ci19Ci0KLQotLyogdGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBwb3N0aW5jcmVtZW50IG9yIHBvc3RkZWNyZW1lbnQKLSAgIG9wZXJhdG9yICggJysnIG9yICctJyApIGZyb20gYW4gZXhwcmVzc2lvbiAqLwotCi1zdGF0aWMgaW50IHBvc3RmaXggKHApIAotICAgICBjaGFyICpwOwotewotICB3aGlsZSAoKnAgIT0gJy0nICYmICpwICE9ICcrJykgCi0gICAgewotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKLQlicmVhazsKLSAgICAgIHArKzsKLSAgICB9Ci0KLSAgaWYgKCpwID09ICctJykgCi0gICAgewotICAgICAgKnAgPSAnICc7Ci0gICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0gIGlmICgqcCA9PSAnKycpIAotICAgIHsKLSAgICAgICpwID0gJyAnOwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIAotZ2V0X3JlbG9jIChvcCkgCi0gICAgIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wOwotewotICBpbnQgYml0cyA9IG9wLT5iaXRzOwotCi0gIGlmIChiaXRzIDw9IDQpIAotICAgIHJldHVybiAoMCk7Ci0gICAgICAKLSAgaWYgKG9wLT5mbGFncyAmIE9QRVJBTkRfQUREUikgCi0gICAgewotICAgICAgaWYgKGJpdHMgPT0gOCkKLQlyZXR1cm4gKEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpOwotICAgICAgZWxzZQotCXJldHVybiAoQkZEX1JFTE9DX0QxMFZfMThfUENSRUwpOwotICAgIH0KLQotICByZXR1cm4gKEJGRF9SRUxPQ18xNik7Ci19Ci0KLQotLyogZ2V0X29wZXJhbmRzIHBhcnNlcyBhIHN0cmluZyBvZiBvcGVyYW5kcyBhbmQgcmV0dXJucwotICAgYW4gYXJyYXkgb2YgZXhwcmVzc2lvbnMgKi8KLQotc3RhdGljIGludAotZ2V0X29wZXJhbmRzIChleHApIAotICAgICBleHByZXNzaW9uUyBleHBbXTsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IG51bW9wcyA9IDA7Ci0gIGludCBwb3N0ID0gMDsKLSAgaW50IHVzZXNfYXQgPSAwOwotICAKLSAgd2hpbGUgKCpwKSAgCi0gICAgewotICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCi0JcCsrOwotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKLQlicmVhazsKLSAgICAgIAotICAgICAgaWYgKCpwID09ICdAJykgCi0JewotCSAgdXNlc19hdCA9IDE7Ci0JICAKLQkgIHArKzsKLQkgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGlmICgqcCA9PSAnKCcpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRQQVI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwID09ICctJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVE1JTlVTOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUU0lHTjsKLQkgICAgICBwb3N0ID0gcG9zdGZpeCAocCk7Ci0JICAgIH0KLQkgIG51bW9wcysrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKnAgPT0gJyknKSAKLQl7Ci0JICAvKiBqdXN0IHNraXAgdGhlIHRyYWlsaW5nIHBhcmVuICovCi0JICBwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0KLSAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiBpdCBtaWdodCBiZSBhIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgIGlmICghcmVnaXN0ZXJfbmFtZSAoJmV4cFtudW1vcHNdKSkKLQl7Ci0JICAvKiBwYXJzZSBhcyBhbiBleHByZXNzaW9uICovCi0JICBpZiAodXNlc19hdCkKLQkgICAgewotCSAgICAgIC8qIEFueSBleHByZXNzaW9uIHRoYXQgaW52b2x2ZXMgdGhlIGluZGlyZWN0IGFkZHJlc3NpbmcKLQkJIGNhbm5vdCBhbHNvIGludm9sdmUgaW1tZWRpYXRlIGFkZHJlc3NpbmcuICBUaGVyZWZvcmUKLQkJIHRoZSB1c2Ugb2YgdGhlIGhhc2ggY2hhcmFjdGVyIGlzIGlsbGVnYWwuICAqLwotCSAgICAgIGludCBzYXZlID0gZG9fbm90X2lnbm9yZV9oYXNoOwotCSAgICAgIGRvX25vdF9pZ25vcmVfaGFzaCA9IDE7Ci0JICAgICAgCi0JICAgICAgZXhwcmVzc2lvbiAoJmV4cFtudW1vcHNdKTsKLQkgICAgICAKLQkgICAgICBkb19ub3RfaWdub3JlX2hhc2ggPSBzYXZlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGV4cHJlc3Npb24gKCZleHBbbnVtb3BzXSk7Ci0JfQotCi0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkB3b3JkIiwgNSkgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLQkgIGlmIChleHBbbnVtb3BzXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgIHsKLQkgICAgICAvKiBpZiBpdCBsb29rZWQgbGlrZSBhIHJlZ2lzdGVyIG5hbWUgYnV0IHdhcyBmb2xsb3dlZCBieQotICAgICAgICAgICAgICAgICAiQHdvcmQiIHRoZW4gaXQgd2FzIHJlYWxseSBhIHN5bWJvbCwgc28gY2hhbmdlIGl0IHRvCi0gICAgICAgICAgICAgICAgIG9uZSAqLwotCSAgICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKWV4cFtudW1vcHNdLlhfb3Bfc3ltYm9sKTsKLQkgICAgfQotCi0JICAvKiBjaGVjayBmb3IgaWRlbnRpZmllckB3b3JkK2NvbnN0YW50ICovCi0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKycpCi0JICB7Ci0JICAgIGNoYXIgKm9yaWdfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgZXhwcmVzc2lvblMgbmV3X2V4cDsKLQkgICAgZXhwcmVzc2lvbiAoJm5ld19leHApOwotCSAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBuZXdfZXhwLlhfYWRkX251bWJlcjsKLQkgIH0KLQotCSAgLyogY29udmVydCBleHByIGludG8gYSByaWdodCBzaGlmdCBieSBBVF9XT1JEX1JJR0hUX1NISUZUICovCi0JICB7Ci0JICAgIGV4cHJlc3Npb25TIG5ld19leHA7Ci0JICAgIG1lbXNldCAoJm5ld19leHAsIDAsIHNpemVvZiBuZXdfZXhwKTsKLQkgICAgbmV3X2V4cC5YX2FkZF9udW1iZXIgPSBBVF9XT1JEX1JJR0hUX1NISUZUOwotCSAgICBuZXdfZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICBuZXdfZXhwLlhfdW5zaWduZWQgPSAxOwotCSAgICBleHBbbnVtb3BzXS5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZuZXdfZXhwKTsKLQkgICAgZXhwW251bW9wc10uWF9vcCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICB9Ci0KLQkgIGtub3cgKEFUX1dPUkRfUCAoJmV4cFtudW1vcHNdKSk7Ci0JfQotICAgICAgCi0gICAgICBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2lsbGVnYWwpIAotCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOwotICAgICAgZWxzZSBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2Fic2VudCkgCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0KLSAgICAgIG51bW9wcysrOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgc3dpdGNoIChwb3N0KSAKLSAgICB7Ci0gICAgY2FzZSAtMToJLyogcG9zdGRlY3JlbWVudCBtb2RlICovCi0gICAgICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfTUlOVVM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6CS8qIHBvc3RpbmNyZW1lbnQgbW9kZSAqLwotICAgICAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotICAgICAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX1BMVVM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZXhwW251bW9wc10uWF9vcCA9IDA7Ci0gIHJldHVybiAobnVtb3BzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWQxMHZfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wX3R5cGUsIHZhbHVlLCBsZWZ0LCBmaXgpIAotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCBvcF90eXBlOwotICAgICBvZmZzZXRUIHZhbHVlOwotICAgICBpbnQgbGVmdDsKLSAgICAgZml4UyAqZml4OwotewotICBpbnQgc2hpZnQsIGJpdHM7Ci0KLSAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wX3R5cGVdLnNoaWZ0OwotICBpZiAobGVmdCkKLSAgICBzaGlmdCArPSAxNTsKLQotICBiaXRzID0gZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5iaXRzOwotCi0gIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KLSAgaWYgKGNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5mbGFncykpCi0gICAgYXNfYmFkX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+ZnhfbGluZSwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksIHZhbHVlKTsKLQotICB2YWx1ZSAmPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOwotICBpbnNuIHw9ICh2YWx1ZSA8PCBzaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQotLyogYnVpbGRfaW5zbiB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIG9wY29kZSBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlCi0gICBhbmQgdGhlIGFycmF5IG9mIG9wZXJhbmQgZXhwcmVzc2lvbnMgYW5kIHJldHVybnMgdGhlIGluc3RydWN0aW9uICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1idWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzLCBpbnNuKSAKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyczsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotewotICBpbnQgaSwgYml0cywgc2hpZnQsIGZsYWdzLCBmb3JtYXQ7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotICAKLSAgLyogdGhlIGluc24gYXJndW1lbnQgaXMgb25seSB1c2VkIGZvciB0aGUgRElWUyBrbHVkZ2UgKi8KLSAgaWYgKGluc24pCi0gICAgZm9ybWF0ID0gTE9OR19SOwotICBlbHNlCi0gICAgewotICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotICAgICAgZm9ybWF0ID0gb3Bjb2RlLT5mb3JtYXQ7Ci0gICAgfQotICAKLSAgZm9yIChpPTA7b3Bjb2RlLT5vcGVyYW5kc1tpXTtpKyspIAotICAgIHsKLSAgICAgIGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLSAgICAgIGJpdHMgPSBkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmJpdHM7Ci0gICAgICBzaGlmdCA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uc2hpZnQ7Ci0gICAgICBudW1iZXIgPSBvcGVyc1tpXS5YX2FkZF9udW1iZXI7Ci0KLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKSAKLQl7Ci0JICBudW1iZXIgJj0gUkVHSVNURVJfTUFTSzsKLQkgIGlmIChmb3JtYXQgPT0gTE9OR19MKQotCSAgICBzaGlmdCArPSAxNTsKLQl9Ci0KLSAgICAgIGlmIChvcGVyc1tpXS5YX29wICE9IE9fcmVnaXN0ZXIgJiYgb3BlcnNbaV0uWF9vcCAhPSBPX2NvbnN0YW50KSAKLQl7Ci0JICAvKiBub3cgY3JlYXRlIGEgZml4dXAgKi8KLQotCSAgaWYgKGZpeHVwcy0+ZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICBpZiAoQVRfV09SRF9QICgmb3BlcnNbaV0pKQotCSAgICB7Ci0JICAgICAgLyogUmVjb25pemUgWFhYPj4xK04gYWthIFhYWEB3b3JkK04gYXMgc3BlY2lhbCAoQVRfV09SRCkgKi8KLQkgICAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9IEJGRF9SRUxPQ19EMTBWXzE4OwotCSAgICAgIG9wZXJzW2ldLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBvcGVyc1tpXS5YX29wX3N5bWJvbCA9IE5VTEw7IC8qIFNob3VsZCBmcmVlIGl0ICovCi0JICAgICAgLyogbnVtYmVyIGlzIGxlZnQgc2hpZnRlZCBieSBBVF9XT1JEX1JJR0hUX1NISUZUIHNvCi0gICAgICAgICAgICAgICAgIHRoYXQsIGl0IGlzIGFsaWduZWQgd2l0aCB0aGUgc3ltYm9sJ3MgdmFsdWUuICBMYXRlciwKLSAgICAgICAgICAgICAgICAgQkZEX1JFTE9DX0QxMFZfMTggd2lsbCByaWdodCBzaGlmdCAoc3ltYm9sX3ZhbHVlICsKLSAgICAgICAgICAgICAgICAgWF9hZGRfbnVtYmVyKS4gKi8KLQkgICAgICBudW1iZXIgPDw9IEFUX1dPUkRfUklHSFRfU0hJRlQ7Ci0JICAgICAgb3BlcnNbaV0uWF9hZGRfbnVtYmVyID0gbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID0gCi0JICAgICAgZ2V0X3JlbG9jKChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0pOwotCi0JICBpZiAoZml4dXBzLT5maXhbZml4dXBzLT5mY10ucmVsb2MgPT0gQkZEX1JFTE9DXzE2IHx8IAotCSAgICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5zaXplID0gMjsgCSAgICAKLQkgIGVsc2UKLQkgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDQ7Ci0gCSAgICAKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLmV4cCA9IG9wZXJzW2ldOwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ub3BlcmFuZCA9IG9wY29kZS0+b3BlcmFuZHNbaV07Ci0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IChmbGFncyAmIE9QRVJBTkRfQUREUikgPyB0cnVlIDogZmFsc2U7Ci0JICAoZml4dXBzLT5mYykrKzsKLQl9Ci0KLSAgICAgIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgIGlmICgob3BlcnNbaV0uWF9vcCA9PSBPX2NvbnN0YW50KSAmJiBjaGVja19yYW5nZSAobnVtYmVyLCBiaXRzLCBmbGFncykpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG91dCBvZiByYW5nZTogJWQiKSxudW1iZXIpOwotICAgICAgbnVtYmVyICY9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7Ci0gICAgICBpbnNuID0gaW5zbiB8IChudW1iZXIgPDwgc2hpZnQpOwotICAgIH0KLQotICAvKiBrbHVkZ2U6IGZvciBESVZTLCB3ZSBuZWVkIHRvIHB1dCB0aGUgb3BlcmFuZHMgaW4gdHdpY2UgKi8KLSAgLyogb24gdGhlIHNlY29uZCBwYXNzLCBmb3JtYXQgaXMgY2hhbmdlZCB0byBMT05HX1IgdG8gZm9yY2UgKi8KLSAgLyogdGhlIHNlY29uZCBzZXQgb2Ygb3BlcmFuZHMgdG8gbm90IGJlIHNoaWZ0ZWQgb3ZlciAxNSAqLwotICBpZiAoKG9wY29kZS0+b3Bjb2RlID09IE9QQ09ERV9ESVZTKSAmJiAoZm9ybWF0PT1MT05HX0wpKQotICAgIGluc24gPSBidWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzLCBpbnNuKTsKLSAgICAgIAotICByZXR1cm4gaW5zbjsKLX0KLQotLyogd3JpdGUgb3V0IGEgbG9uZyBmb3JtIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZAotd3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmeCkgCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIEZpeHVwcyAqZng7Ci17Ci0gIGludCBpLCB3aGVyZTsKLSAgY2hhciAqZiA9IGZyYWdfbW9yZSg0KTsKLQotICBpbnNuIHw9IEZNMTE7Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIDQpOwotCi0gIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotICAgIHsKLSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCXsgCi0JICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCi0JICBpZiAoZngtPmZpeFtpXS5zaXplID09IDIpCi0JICAgIHdoZXJlICs9IDI7Ci0KLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCSAgICBmeC0+Zml4W2ldLm9wZXJhbmQgfD0gNDA5NjsJICAKLQotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgd2hlcmUsCi0JCSAgICAgICBmeC0+Zml4W2ldLnNpemUsCi0JCSAgICAgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJICAgICAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCSAgICAgICBmeC0+Zml4W2ldLm9wZXJhbmR8MjA0OCk7Ci0JfQotICAgIH0KLSAgZngtPmZjID0gMDsKLX0KLQotCi0vKiB3cml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGJ5IGl0c2VsZiAqLwotc3RhdGljIHZvaWQKLXdyaXRlXzFfc2hvcnQgKG9wY29kZSwgaW5zbiwgZngpIAotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBGaXh1cHMgKmZ4OwotewotICBjaGFyICpmID0gZnJhZ19tb3JlKDQpOwotICBpbnQgaSwgd2hlcmU7Ci0KLSAgaWYgKG9wY29kZS0+ZXhlY190eXBlICYgUEFST05MWSkKLSAgICBhc19mYXRhbCAoXygiSW5zdHJ1Y3Rpb24gbXVzdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCB3aXRoIGFub3RoZXIgaW5zdHJ1Y3Rpb24uIikpOwotCi0gIC8qIHRoZSBvdGhlciBjb250YWluZXIgbmVlZHMgdG8gYmUgTk9QICovCi0gIC8qIGFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAwLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZCBvbmx5Ci0gICAgIGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLwotICBpZiAob3Bjb2RlLT51bml0ID09IElVKQotICAgIGluc24gfD0gRk0wMCB8IChOT1AgPDwgMTUpOwkJLyogcmlnaHQgY29udGFpbmVyICovCi0gIGVsc2UKLSAgICBpbnNuID0gRk0wMCB8IChpbnNuIDw8IDE1KSB8IE5PUDsJLyogbGVmdCBjb250YWluZXIgKi8KLQotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKLSAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCi0gICAgewotICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCi0JeyAKLQkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKLQkgIGlmIChmeC0+Zml4W2ldLnNpemUgPT0gMikKLQkgICAgd2hlcmUgKz0gMjsKLQotCSAgaWYgKGZ4LT5maXhbaV0ucmVsb2MgPT0gQkZEX1JFTE9DX0QxMFZfMTgpCi0JICAgIGZ4LT5maXhbaV0ub3BlcmFuZCB8PSA0MDk2OwkgIAotCi0JICAvKiBpZiBpdCdzIGFuIFIgcmVsb2MsIHdlIG1heSBoYXZlIHRvIHN3aXRjaCBpdCB0byBMICovCi0JICBpZiAoIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpICYmIChvcGNvZGUtPnVuaXQgIT0gSVUpICkKLQkgICAgZngtPmZpeFtpXS5vcGVyYW5kIHw9IDEwMjQ7Ci0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIHdoZXJlLCAKLQkJICAgICAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJICAgICAgICYoZngtPmZpeFtpXS5leHApLAotCQkgICAgICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJICAgICAgIGZ4LT5maXhbaV0ub3BlcmFuZHwyMDQ4KTsKLQl9Ci0gICAgfQotICBmeC0+ZmMgPSAwOwotfQotCi0vKiB3cml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGlmIHBvc3NpYmxlICovCi0vKiByZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBub3Qgd3JpdHRlbiBvdXQgKi8KLXN0YXRpYyBpbnQKLXdyaXRlXzJfc2hvcnQgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlLCBmeCkgCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgKm9wY29kZTI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBpbnQgZXhlY190eXBlOwotICAgICBGaXh1cHMgKmZ4OwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGNoYXIgKmY7Ci0gIGludCBpLGosIHdoZXJlOwotCi0gIGlmICggKGV4ZWNfdHlwZSAhPSAxKSAmJiAoKG9wY29kZTEtPmV4ZWNfdHlwZSAmIFBBUk9OTFkpCi0JICAgICAgICAgICAgICAgIHx8IChvcGNvZGUyLT5leGVjX3R5cGUgJiBQQVJPTkxZKSkpCi0gICAgYXNfZmF0YWwgKF8oIkluc3RydWN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gIAotICBpZiAoIChvcGNvZGUxLT5mb3JtYXQgJiBMT05HX09QQ09ERSkgfHwgKG9wY29kZTItPmZvcm1hdCAmIExPTkdfT1BDT0RFKSkKLSAgICBhc19mYXRhbCAoXygiTG9uZyBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBjb21iaW5lZC4iKSk7Ci0KLSAgaWYob3Bjb2RlMS0+ZXhlY190eXBlICYgQlJBTkNIX0xJTksgJiYgZXhlY190eXBlID09IDApCi0gICAgewotICAgICAgLyogSW5zdHJ1Y3Rpb25zIHBhaXJlZCB3aXRoIGEgc3Vicm91dGluZSBjYWxsIGFyZSBleGVjdXRlZCBiZWZvcmUgdGhlCi0JIHN1YnJvdXRpbmUsIHNvIGRvbid0IGRvIHRoZXNlIHBhaXJpbmdzIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gICovCi0gICAgICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQpOwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChleGVjX3R5cGUpIAotICAgIHsKLSAgICBjYXNlIDA6CS8qIG9yZGVyIG5vdCBzcGVjaWZpZWQgKi8KLSAgICAgIGlmICggT3B0aW1pemluZyAmJiBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpKQotCXsKLQkgIC8qIHBhcmFsbGVsICovCi0JICBpZiAob3Bjb2RlMS0+dW5pdCA9PSBJVSkKLQkgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7Ci0JICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VKQotCSAgICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc24gPSBGTTAwIHwgKGluc24xIDw8IDE1KSB8IGluc24yOyAgCi0JICAgICAgZnggPSBmeC0+bmV4dDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUpIAotCXsKLQkgIC8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLwotCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHNlcXVlbnRpYWwgKi8KLQkgIGluc24gPSBGTTAxIHwgKGluc24xIDw8IDE1KSB8IGluc24yOwotCSAgZnggPSBmeC0+bmV4dDsgIAotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToJLyogcGFyYWxsZWwgKi8KLSAgICAgIGlmIChvcGNvZGUxLT5leGVjX3R5cGUgJiBTRVEgfHwgb3Bjb2RlMi0+ZXhlY190eXBlICYgU0VRKQotCWFzX2ZhdGFsIChfKCJPbmUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIikpOwotCi0gICAgICBpZiAob3Bjb2RlMS0+dW5pdCA9PSBJVSkKLQl7Ci0JICBpZiAob3Bjb2RlMi0+dW5pdCA9PSBJVSkKLQkgICAgYXNfZmF0YWwgKF8oIlR3byBJVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKLSAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCi0JICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotIAkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTItPnVuaXQgPT0gTVUpCi0JewotCSAgaWYgKG9wY29kZTEtPnVuaXQgPT0gTVUpCi0JICAgIGFzX2ZhdGFsIChfKCJUd28gTVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gICAgICAgICAgaWYgKCFmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKQotCSAgICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLQkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsgIAotCSAgZnggPSBmeC0+bmV4dDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6CS8qIHNlcXVlbnRpYWwgKi8KLSAgICAgIGlmIChvcGNvZGUxLT51bml0ICE9IElVKQotCWluc24gPSBGTTAxIHwgKGluc24xIDw8IDE1KSB8IGluc24yOyAgCi0gICAgICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VIHx8IG9wY29kZTItPnVuaXQgPT0gRUlUSEVSKQotCXsKLSAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCi0JICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7ICAKLQl9Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIklVIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIGxlZnQgY29udGFpbmVyIikpOwotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoJLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCi0gICAgICBpZiAob3Bjb2RlMi0+dW5pdCAhPSBNVSkKLQlpbnNuID0gRk0xMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsKLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUgfHwgb3Bjb2RlMS0+dW5pdCA9PSBFSVRIRVIpCi0JewotICAgICAgICAgIGlmICghZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCkKLQkgICAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7Ci0JICBpbnNuID0gRk0wMSB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsgIAotCX0KLSAgICAgIGVsc2UKLQlhc19mYXRhbCAoXygiTVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgcmlnaHQgY29udGFpbmVyIikpOwotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygidW5rbm93biBleGVjdXRpb24gdHlwZSBwYXNzZWQgdG8gd3JpdGVfMl9zaG9ydCgpIikpOwotICAgIH0KLQotICBmID0gZnJhZ19tb3JlKDQpOwotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKLQotICBmb3IgKGo9MDsgajwyOyBqKyspIAotICAgIHsKLSAgICAgIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotCXsKLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCSAgICB7Ci0JICAgICAgd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7IAotCSAgICAgIGlmIChmeC0+Zml4W2ldLnNpemUgPT0gMikKLQkJd2hlcmUgKz0gMjsKLQkgICAgICAKLQkgICAgICBpZiAoIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpICYmIChqID09IDApICkKLQkJZngtPmZpeFtpXS5vcGVyYW5kIHw9IDEwMjQ7Ci0JICAgICAgCi0JICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MgPT0gQkZEX1JFTE9DX0QxMFZfMTgpCi0JCWZ4LT5maXhbaV0ub3BlcmFuZCB8PSA0MDk2OwkgIAotCi0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgd2hlcmUsIAotCQkJICAgZngtPmZpeFtpXS5zaXplLAotCQkJICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCQkgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkJICAgZngtPmZpeFtpXS5vcGVyYW5kfDIwNDgpOwotCSAgICB9Ci0JfQotICAgICAgZngtPmZjID0gMDsKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0KLS8qIENoZWNrIDIgaW5zdHJ1Y3Rpb25zIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBjYW4gYmUgc2FmZWx5ICovCi0vKiBleGVjdXRlZCBpbiBwYXJhbGxlbC4gIFJldHVybnMgMSBpZiB0aGV5IGNhbiBiZS4gICAgICAgICAqLwotc3RhdGljIGludAotcGFyYWxsZWxfb2sgKG9wMSwgaW5zbjEsIG9wMiwgaW5zbjIsIGV4ZWNfdHlwZSkKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDEsICpvcDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBpbnQgZXhlY190eXBlOwotewotICBpbnQgaSwgaiwgZmxhZ3MsIG1hc2ssIHNoaWZ0LCByZWdubzsKLSAgdW5zaWduZWQgbG9uZyBpbnMsIG1vZFsyXSwgdXNlZFsyXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDsKLQotICBpZiAoKG9wMS0+ZXhlY190eXBlICYgU0VRKSAhPSAwIHx8IChvcDItPmV4ZWNfdHlwZSAmIFNFUSkgIT0gMAotICAgICAgfHwgKG9wMS0+ZXhlY190eXBlICYgUEFSKSA9PSAwIHx8IChvcDItPmV4ZWNfdHlwZSAmIFBBUikgPT0gMAotICAgICAgfHwgKG9wMS0+dW5pdCA9PSBCT1RIKSB8fCAob3AyLT51bml0ID09IEJPVEgpCi0gICAgICB8fCAob3AxLT51bml0ID09IElVICYmIG9wMi0+dW5pdCA9PSBJVSkKLSAgICAgIHx8IChvcDEtPnVuaXQgPT0gTVUgJiYgb3AyLT51bml0ID09IE1VKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBJZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggYW5kIHRoaXMgaXMgYXV0byBwYXJhbGxhemF0aW9uLAotICAgICBkb24ndCBjb21iaW5lIHdpdGggYW55IHNlY29uZCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChleGVjX3R5cGUgPT0gMCAmJiAob3AxLT5leGVjX3R5cGUgJiBCUkFOQ0gpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogVGhlIGlkZWEgaGVyZSBpcyB0byBjcmVhdGUgdHdvIHNldHMgb2YgYml0bWFza3MgKG1vZCBhbmQgdXNlZCkKLSAgICAgd2hpY2ggaW5kaWNhdGUgd2hpY2ggcmVnaXN0ZXJzIGFyZSBtb2RpZmllZCBvciB1c2VkIGJ5IGVhY2gKLSAgICAgaW5zdHJ1Y3Rpb24uICBUaGUgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIGRvbmUgaW4gcGFyYWxsZWwgaWYKLSAgICAgaW5zdHJ1Y3Rpb24gMSBhbmQgaW5zdHJ1Y3Rpb24gMiBtb2RpZnkgZGlmZmVyZW50IHJlZ2lzdGVycywgYW5kCi0gICAgIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtb2RpZnkgcmVnaXN0ZXJzIHRoYXQgdGhlIHNlY29uZAotICAgICBpcyB1c2luZyAoVGhlIHNlY29uZCBpbnN0cnVjdGlvbiBjYW4gbW9kaWZ5IHJlZ2lzdGVycyB0aGF0IHRoZQotICAgICBmaXJzdCBpcyB1c2luZyBhcyB0aGV5IGFyZSBvbmx5IHdyaXR0ZW4gYmFjayBhZnRlciB0aGUgZmlyc3QKLSAgICAgaW5zdHJ1Y3Rpb24gaGFzIGNvbXBsZXRlZCkuICBBY2Nlc3NlcyB0byBjb250cm9sIHJlZ2lzdGVycywgUFNXLAotICAgICBhbmQgbWVtb3J5IGFyZSB0cmVhdGVkIGFzIGFjY2Vzc2VzIHRvIGEgc2luZ2xlIHJlZ2lzdGVyLiAgU28gaWYKLSAgICAgYm90aCBpbnN0cnVjdGlvbnMgd3JpdGUgbWVtb3J5IG9yIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3cml0ZXMKLSAgICAgbWVtb3J5IGFuZCB0aGUgc2Vjb25kIHJlYWRzLCB0aGVuIHRoZXkgY2Fubm90IGJlIGRvbmUgaW4KLSAgICAgcGFyYWxsZWwuICBMaWtld2lzZSwgaWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIG11Y2tzIHdpdGggdGhlIHBzdwotICAgICBhbmQgdGhlIHNlY29uZCByZWFkcyB0aGUgUFNXICh3aGljaCBpbmNsdWRlcyBDLCBGMCwgYW5kIEYxKSwgdGhlbgotICAgICB0aGV5IGNhbm5vdCBvcGVyYXRlIHNhZmVseSBpbiBwYXJhbGxlbC4gKi8KLQotICAvKiB0aGUgYml0bWFza3MgKG1vZCBhbmQgdXNlZCkgbG9vayBsaWtlIHRoaXMgKGJpdCAzMSA9IE1TQikgKi8KLSAgLyogcjAtcjE1CSAgMC0xNSAgKi8KLSAgLyogYTAtYTEJICAxNi0xNyAqLwotICAvKiBjciAobm90IHBzdykgMTggICAgKi8KLSAgLyogcHN3CSAgMTkgICAgKi8KLSAgLyogbWVtCSAgMjAgICAgKi8KLQotICBmb3IgKGo9MDtqPDI7aisrKQotICAgIHsKLSAgICAgIGlmIChqID09IDApCi0JewotCSAgb3AgPSBvcDE7Ci0JICBpbnMgPSBpbnNuMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3AgPSBvcDI7Ci0JICBpbnMgPSBpbnNuMjsKLQl9Ci0gICAgICBtb2Rbal0gPSB1c2VkW2pdID0gMDsKLSAgICAgIGlmIChvcC0+ZXhlY190eXBlICYgQlJBTkNIX0xJTkspCi0JbW9kW2pdIHw9IDEgPDwgMTM7Ci0KLSAgICAgIGZvciAoaSA9IDA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQotCXsKLQkgIGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV0uc2hpZnQ7Ci0JICBtYXNrID0gMHg3RkZGRkZGRiA+PiAoMzEgLSBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV0uYml0cyk7Ci0JICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQkgICAgewotCSAgICAgIHJlZ25vID0gKGlucyA+PiBzaGlmdCkgJiBtYXNrOwotCSAgICAgIGlmIChmbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQkJcmVnbm8gKz0gMTY7Ci0JICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCS8qIG12dGMgb3IgbXZmYyAqLwotCQl7IAotCQkgIGlmIChyZWdubyA9PSAwKQotCQkgICAgcmVnbm8gPSAxOTsKLQkJICBlbHNlCi0JCSAgICByZWdubyA9IDE4OyAKLQkJfQotCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgKE9QRVJBTkRfRkZMQUd8T1BFUkFORF9DRkxBRykpCi0JCXJlZ25vID0gMTk7Ci0JICAgICAgCi0JICAgICAgaWYgKCBmbGFncyAmIE9QRVJBTkRfREVTVCApCi0JCXsKLQkJICBtb2Rbal0gfD0gMSA8PCByZWdubzsKLQkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0VWRU4pCi0JCSAgICBtb2Rbal0gfD0gMSA8PCAocmVnbm8gKyAxKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHVzZWRbal0gfD0gMSA8PCByZWdubyA7Ci0JCSAgaWYgKGZsYWdzICYgT1BFUkFORF9FVkVOKQotCQkgICAgdXNlZFtqXSB8PSAxIDw8IChyZWdubyArIDEpOwotCi0JCSAgLyogQXV0byBpbmMvZGVjIGFsc28gbW9kaWZpZXMgdGhlIHJlZ2lzdGVyLiAgKi8KLQkJICBpZiAob3AtPm9wZXJhbmRzW2krMV0gIT0gMAotCQkgICAgICAmJiAoZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MKLQkJCSAgJiAoT1BFUkFORF9QTFVTIHwgT1BFUkFORF9NSU5VUykpICE9IDApCi0JCSAgICBtb2Rbal0gfD0gMSA8PCByZWdubzsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykKLQkgICAgewotCSAgICAgIC8qIFNQIGltcGxpY2l0bHkgdXNlZC9tb2RpZmllZCAqLwotCSAgICAgIG1vZFtqXSB8PSAxIDw8IDE1OwotCSAgICAgIHVzZWRbal0gfD0gMSA8PCAxNTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChvcC0+ZXhlY190eXBlICYgUk1FTSkKLQl1c2VkW2pdIHw9IDEgPDwgMjA7Ci0gICAgICBlbHNlIGlmIChvcC0+ZXhlY190eXBlICYgV01FTSkKLQltb2Rbal0gfD0gMSA8PCAyMDsKLSAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBSRjApCi0JdXNlZFtqXSB8PSAxIDw8IDE5OwotICAgICAgZWxzZSBpZiAob3AtPmV4ZWNfdHlwZSAmIFdGMCkKLQltb2Rbal0gfD0gMSA8PCAxOTsKLSAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBXQ0FSKQotCW1vZFtqXSB8PSAxIDw8IDE5OwotICAgIH0KLSAgaWYgKChtb2RbMF0gJiBtb2RbMV0pID09IDAgJiYgKG1vZFswXSAmIHVzZWRbMV0pID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBzdHIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUtZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyAKLSAgIGl0IGFzc2VtYmxlcyB0by4gIEZvciB0aGUgRDEwViwgaXQgbW9zdGx5IGhhbmRsZXMgdGhlIHNwZWNpYWwgVkxJVyBwYXJzaW5nIGFuZCBwYWNraW5nCi0gICBhbmQgbGVhdmVzIHRoZSBkaWZmaWN1bHQgc3R1ZmYgdG8gZG9fYXNzZW1ibGUoKS4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X2luc247Ci1zdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICpwcmV2X29wY29kZSA9IDA7Ci1zdGF0aWMgc3Vic2VnVCBwcmV2X3N1YnNlZzsKLXN0YXRpYyBzZWdUIHByZXZfc2VnID0gMDs7Ci1zdGF0aWMgaW50IGV0eXBlID0gMDsJCS8qIHNhdmVkIGV4dHlwZS4gIHVzZWQgZm9yIG11bHRpbGluZSBpbnN0cnVjdGlvbnMgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKiBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgaW50IGV4dHlwZSA9IDA7CQkvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwsIGV0YyAqLwotICBjaGFyICogc3RyMjsKLQotICBpZiAoZXR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBsb29rIGZvciB0aGUgc3BlY2lhbCBtdWx0aXBsZSBpbnN0cnVjdGlvbiBzZXBhcmF0b3JzICovCi0gICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICJ8fCIpOwotICAgICAgaWYgKHN0cjIpIAotCWV4dHlwZSA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyMiA9IHN0cnN0ciAoc3RyLCAiLT4iKTsKLQkgIGlmIChzdHIyKSAKLQkgICAgZXh0eXBlID0gMjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIjwtIik7Ci0JICAgICAgaWYgKHN0cjIpIAotCQlleHR5cGUgPSAzOwotCSAgICB9Ci0JfQotICAgICAgLyogc3RyMiBwb2ludHMgdG8gdGhlIHNlcGFyYXRvciwgaWYgb25lICovCi0gICAgICBpZiAoc3RyMikgCi0JewotCSAgKnN0cjIgPSAwOwotCSAgCi0JICAvKiBpZiB0d28gaW5zdHJ1Y3Rpb25zIGFyZSBwcmVzZW50IGFuZCB3ZSBhbHJlYWR5IGhhdmUgb25lIHNhdmVkCi0JICAgICB0aGVuIGZpcnN0IHdyaXRlIGl0IG91dCAqLwotCSAgZDEwdl9jbGVhbnVwICgpOwotCSAgCi0JICAvKiBhc3NlbWJsZSBmaXJzdCBpbnN0cnVjdGlvbiBhbmQgc2F2ZSBpdCAqLwotCSAgcHJldl9pbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJnByZXZfb3Bjb2RlKTsKLQkgIGlmIChwcmV2X2luc24gPT0gLTEpCi0JICAgIGFzX2ZhdGFsIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0JICBmaXh1cHMgPSBmaXh1cHMtPm5leHQ7Ci0JICBzdHIgPSBzdHIyICsgMjsKLQl9Ci0gICAgfQotCi0gIGluc24gPSBkb19hc3NlbWJsZSAoc3RyLCAmb3Bjb2RlKTsKLSAgaWYgKGluc24gPT0gLTEpCi0gICAgewotICAgICAgaWYgKGV4dHlwZSkKLQl7Ci0JICBldHlwZSA9IGV4dHlwZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhc19mYXRhbCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLQotICBpZiAoZXR5cGUpCi0gICAgewotICAgICAgZXh0eXBlID0gZXR5cGU7Ci0gICAgICBldHlwZSA9IDA7Ci0gICAgfQotCi0gIC8qIGlmIHRoaXMgaXMgYSBsb25nIGluc3RydWN0aW9uLCB3cml0ZSBpdCBhbmQgYW55IHByZXZpb3VzIHNob3J0IGluc3RydWN0aW9uICovCi0gIGlmIChvcGNvZGUtPmZvcm1hdCAmIExPTkdfT1BDT0RFKSAKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlKSAKLQlhc19mYXRhbCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOwotICAgICAgZDEwdl9jbGVhbnVwICgpOwotICAgICAgd3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmaXh1cHMpOwotICAgICAgcHJldl9vcGNvZGUgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGlmIChwcmV2X29wY29kZSAmJiBwcmV2X3NlZyAmJiAoKHByZXZfc2VnICE9IG5vd19zZWcpIHx8IChwcmV2X3N1YnNlZyAhPSBub3dfc3Vic2VnKSkpCi0gICAgZDEwdl9jbGVhbnVwKCk7Ci0gIAotICBpZiAocHJldl9vcGNvZGUgJiYgKHdyaXRlXzJfc2hvcnQgKHByZXZfb3Bjb2RlLCBwcmV2X2luc24sIG9wY29kZSwgaW5zbiwgZXh0eXBlLCBmaXh1cHMpID09IDApKSAKLSAgICB7Ci0gICAgICAvKiBubyBpbnN0cnVjdGlvbnMgc2F2ZWQgKi8KLSAgICAgIHByZXZfb3Bjb2RlID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlKSAKLQlhc19mYXRhbCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOwotICAgICAgLyogc2F2ZSBvZmYgbGFzdCBpbnN0cnVjdGlvbiBzbyBpdCBtYXkgYmUgcGFja2VkIG9uIG5leHQgcGFzcyAqLwotICAgICAgcHJldl9vcGNvZGUgPSBvcGNvZGU7Ci0gICAgICBwcmV2X2luc24gPSBpbnNuOwotICAgICAgcHJldl9zZWcgPSBub3dfc2VnOwotICAgICAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgZml4dXBzID0gZml4dXBzLT5uZXh0OwotICAgIH0KLX0KLQotCi0vKiBkb19hc3NlbWJsZSBhc3NlbWJsZXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gYW5kIHJldHVybnMgYW4gb3Bjb2RlICovCi0vKiBpdCByZXR1cm5zIC0xIChhbiBpbnZhbGlkIG9wY29kZSkgb24gZXJyb3IgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWRvX2Fzc2VtYmxlIChzdHIsIG9wY29kZSkgCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICoqb3Bjb2RlOwotewotICB1bnNpZ25lZCBjaGFyICpvcF9zdGFydCwgKnNhdmU7Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKLSAgY2hhciBuYW1lWzIwXTsKLSAgaW50IG5sZW4gPSAwOwotICBleHByZXNzaW9uUyBteW9wc1s2XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIEZpbmQgdGhlIG9wY29kZSBlbmQuICAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gKHVuc2lnbmVkIGNoYXIgKikgKHN0cik7Ci0gICAgICAgKm9wX2VuZAotICAgICAgICYmIG5sZW4gPCAyMAotICAgICAgICYmICFpc19lbmRfb2ZfbGluZVsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgICBuYW1lW25sZW5dID0gdG9sb3dlciAob3Bfc3RhcnRbbmxlbl0pOwotICAgICAgbmxlbisrOwotICAgIH0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgaWYgKG5sZW4gPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0gIAotICAvKiBGaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUuICAqLwotICAqb3Bjb2RlID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWhhc2hfZmluZCAoZDEwdl9oYXNoLCBuYW1lKTsKLSAgaWYgKCpvcGNvZGUgPT0gTlVMTCkKLSAgICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIG9wY29kZTogJXMiKSxuYW1lKTsKLQotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcF9lbmQ7Ci0gICpvcGNvZGUgPSBmaW5kX29wY29kZSAoKm9wY29kZSwgbXlvcHMpOwotICBpZiAoKm9wY29kZSA9PSAwKQotICAgIHJldHVybiAtMTsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLQotICBpbnNuID0gYnVpbGRfaW5zbiAoKCpvcGNvZGUpLCBteW9wcywgMCk7IAotICByZXR1cm4gKGluc24pOwotfQotCi0vKiBGaW5kIHRoZSBzeW1ib2wgd2hpY2ggaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyIGluIHRoZSBnaXZlbiBleHByZXNzaW9uLiAgKi8KLXN0YXRpYyBzeW1ib2xTICoKLWZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyIChleHApCi0gICAgIGV4cHJlc3Npb25TICogZXhwOwotewotICBpbnQgaTsKLSAgCi0gIGlmIChleHAtPlhfb3AgIT0gT19yZWdpc3RlcikKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIEZpbmQgdGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyLiAgKi8KLSAgZm9yIChpID0gZDEwdl9yZWdfbmFtZV9jbnQgKCk7IGktLTspCi0gICAgaWYgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgW2ldLnZhbHVlID09IGV4cC0+WF9hZGRfbnVtYmVyKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGkgPCAwKQotICAgIGFib3J0ICgpOwotCi0gIC8qIE5vdyBzZWUgaWYgYSBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICByZXR1cm4gc3ltYm9sX2ZpbmQgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgW2ldLm5hbWUpOwotfQotCi0KLS8qIGZpbmRfb3Bjb2RlKCkgZ2V0cyBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZS4gICAgICAgKi8KLS8qIEl0IG11c3QgbG9vayBhdCBhbGwgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHVzZSB0aGUgb3BlcmFuZHMgKi8KLS8qIHRvIGNob29zZSB0aGUgY29ycmVjdCBvcGNvZGUuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZDEwdl9vcGNvZGUgKgotZmluZF9vcGNvZGUgKG9wY29kZSwgbXlvcHMpCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyBteW9wc1tdOwotewotICBpbnQgaSwgbWF0Y2gsIGRvbmU7Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqbmV4dF9vcGNvZGU7Ci0KLSAgLyogZ2V0IGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucyAqLwotICBnZXRfb3BlcmFuZHMgKG15b3BzKTsKLQotICAvKiBub3cgc2VlIGlmIHRoZSBvcGVyYW5kIGlzIGEgZmFrZS4gIElmIHNvLCBmaW5kIHRoZSBjb3JyZWN0IHNpemUgKi8KLSAgLyogaW5zdHJ1Y3Rpb24sIGlmIHBvc3NpYmxlICovCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBPUENPREVfRkFLRSkKLSAgICB7Ci0gICAgICBpbnQgb3BudW0gPSBvcGNvZGUtPm9wZXJhbmRzWzBdOwotICAgICAgaW50IGZsYWdzOwotCQkJIAotICAgICAgaWYgKG15b3BzW29wbnVtXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgbXlvcHNbb3BudW1dLlhfb3AgPSBPX3N5bWJvbDsKLQkgIG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW29wbnVtXS5YX29wX3N5bWJvbCk7Ci0JICBteW9wc1tvcG51bV0uWF9hZGRfbnVtYmVyID0gMDsKLQkgIG15b3BzW29wbnVtXS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBuZXh0X29wY29kZT1vcGNvZGUrMTsKLQotICAgICAgLyogSWYgdGhlIGZpcnN0IG9wZXJhbmQgaXMgc3VwcG9zZWQgdG8gYmUgYSByZWdpc3RlciwgbWFrZSBzdXJlCi0JIHdlIGdvdCBhIHZhbGlkIG9uZS4gICovCi0gICAgICBmbGFncyA9IGQxMHZfb3BlcmFuZHNbbmV4dF9vcGNvZGUtPm9wZXJhbmRzWzBdXS5mbGFnczsKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCXsKLQkgIGludCBYX29wID0gbXlvcHNbMF0uWF9vcDsKLQkgIGludCBudW0gPSBteW9wc1swXS5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChYX29wICE9IE9fcmVnaXN0ZXIKLQkgICAgICB8fCAobnVtICYgfmZsYWdzCi0JCSAgJiAoT1BFUkFORF9HUFIgfCBPUEVSQU5EX0FDQzAgfCBPUEVSQU5EX0FDQzEKLQkJICAgICB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0NGTEFHIHwgT1BFUkFORF9DT05UUk9MKSkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiKSk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChteW9wc1tvcG51bV0uWF9vcCA9PSBPX2NvbnN0YW50IHx8IChteW9wc1tvcG51bV0uWF9vcCA9PSBPX3N5bWJvbCAmJgotCSAgU19JU19ERUZJTkVEKG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wpICYmCi0JICAoU19HRVRfU0VHTUVOVChteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnKSkpCi0JewotCSAgZm9yIChpPTA7IG9wY29kZS0+b3BlcmFuZHNbaSsxXTsgaSsrKQotCSAgICB7Ci0JICAgICAgaW50IGJpdHMgPSBkMTB2X29wZXJhbmRzW25leHRfb3Bjb2RlLT5vcGVyYW5kc1tvcG51bV1dLmJpdHM7Ci0JICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tuZXh0X29wY29kZS0+b3BlcmFuZHNbb3BudW1dXS5mbGFnczsKLQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FERFIpCi0JCWJpdHMgKz0gMjsKLQkgICAgICBpZiAobXlvcHNbb3BudW1dLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIGlmICghY2hlY2tfcmFuZ2UgKG15b3BzW29wbnVtXS5YX2FkZF9udW1iZXIsIGJpdHMsIGZsYWdzKSkKLQkJICAgIHJldHVybiBuZXh0X29wY29kZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZyYWdTICpmOwotCQkgIGxvbmcgdmFsdWU7Ci0JCSAgLyogY2FsY3VsYXRlIHRoZSBjdXJyZW50IGFkZHJlc3MgYnkgcnVubmluZyB0aHJvdWdoIHRoZSBwcmV2aW91cyBmcmFncyAqLwotCQkgIC8qIGFuZCBhZGRpbmcgb3VyIGN1cnJlbnQgb2Zmc2V0ICovCi0JCSAgZm9yICh2YWx1ZSA9IDAsIGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmOyBmID0gZi0+ZnJfbmV4dCkKLQkJICAgIHZhbHVlICs9IGYtPmZyX2ZpeCArIGYtPmZyX29mZnNldDsKLQotCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQUREUikKLQkJICAgIHZhbHVlID0gU19HRVRfVkFMVUUobXlvcHNbb3BudW1dLlhfYWRkX3N5bWJvbCkgLSB2YWx1ZSAtCi0JCSAgICAgIChvYnN0YWNrX25leHRfZnJlZSgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCk7Ci0JCSAgZWxzZQotCQkgICAgdmFsdWUgKz0gU19HRVRfVkFMVUUobXlvcHNbb3BudW1dLlhfYWRkX3N5bWJvbCk7Ci0KLQkJICBpZiAoQVRfV09SRF9QICgmbXlvcHNbb3BudW1dKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGJpdHMgPiA0KQotCQkJewotCQkJICBiaXRzICs9IDI7Ci0JCQkgIGlmICghY2hlY2tfcmFuZ2UgKHZhbHVlLCBiaXRzLCBmbGFncykpCi0JCQkgICAgcmV0dXJuIG5leHRfb3Bjb2RlOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKCFjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGZsYWdzKSkKLQkJICAgIHJldHVybiBuZXh0X29wY29kZTsKLQkJfQotCSAgICAgIG5leHRfb3Bjb2RlKys7Ci0JICAgIH0KLQkgIGFzX2ZhdGFsIChfKCJ2YWx1ZSBvdXQgb2YgcmFuZ2UiKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG5vdCBhIGNvbnN0YW50LCBzbyB1c2UgYSBsb25nIGluc3RydWN0aW9uICovICAgIAotCSAgcmV0dXJuIG9wY29kZSsyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtYXRjaCA9IDA7Ci0gICAgICAvKiBub3cgc2VhcmNoIHRoZSBvcGNvZGUgdGFibGUgdGFibGUgZm9yIG9uZSB3aXRoIG9wZXJhbmRzICovCi0gICAgICAvKiB0aGF0IG1hdGNoZXMgd2hhdCB3ZSd2ZSBnb3QgKi8KLSAgICAgIHdoaWxlICghbWF0Y2gpCi0JewotCSAgbWF0Y2ggPSAxOwotCSAgZm9yIChpID0gMDsgb3Bjb2RlLT5vcGVyYW5kc1tpXTsgaSsrKSAKLQkgICAgewotCSAgICAgIGludCBmbGFncyA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0JICAgICAgaW50IFhfb3AgPSBteW9wc1tpXS5YX29wOwotCSAgICAgIGludCBudW0gPSBteW9wc1tpXS5YX2FkZF9udW1iZXI7Ci0KLQkgICAgICBpZiAoWF9vcCA9PSAwKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgCi0JICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JCXsKLQkJICBpZiAoKFhfb3AgIT0gT19yZWdpc3RlcikKLQkJICAgICAgfHwgKG51bSAmIH5mbGFncwotCQkJICAmIChPUEVSQU5EX0dQUiB8IE9QRVJBTkRfQUNDMCB8IE9QRVJBTkRfQUNDMQotCQkJICAgICB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0NGTEFHCi0JCQkgICAgIHwgT1BFUkFORF9DT05UUk9MKSkpCi0JCSAgICB7Ci0JCSAgICAgIG1hdGNoID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAKLQkgICAgICBpZiAoKChmbGFncyAmIE9QRVJBTkRfTUlOVVMpICAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfTUlOVVMpKSkgfHwKLQkJICAoKGZsYWdzICYgT1BFUkFORF9QTFVTKSAgICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9QTFVTKSkpIHx8Ci0JCSAgKChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfQVRNSU5VUykpKSB8fAotCQkgICgoZmxhZ3MgJiBPUEVSQU5EX0FUUEFSKSAgICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBPUEVSQU5EX0FUUEFSKSkpIHx8Ci0JCSAgKChmbGFncyAmIE9QRVJBTkRfQVRTSUdOKSAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAoKG51bSAhPSBPUEVSQU5EX0FUU0lHTikgJiYgKG51bSAhPSBPUEVSQU5EX0FUUEFSKSkpKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIAotCSAgICAgIC8qIFVuZm9ydHVuYXRseSwgZm9yIHRoZSBpbmRpcmVjdCBvcGVyYW5kIGluIGluc3RydWN0aW9ucyBzdWNoIGFzCi0JCSBgYGxkYiByMSwgQChjLHIxNCknJyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBwYXNzZWQgWF9vcCA9PSBPX3JlZ2lzdGVyCi0JCSAoYmVjYXVzZSAnYycgaXMgYSB2YWxpZCByZWdpc3RlciBuYW1lKS4gIEhvd2V2ZXIgd2UgY2Fubm90IGp1c3QKLQkJIGlnbm9yZSB0aGUgY2FzZSB3aGVuIFhfb3AgPT0gT19yZWdpc3RlciBidXQgZmxhZ3MgJiBPUEVSQU5EX1JFRyBpcwotCQkgbnVsbCwgc28gd2UgY2hlY2sgdG8gc2VlIGlmIGEgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyCi0JCSBleGlzdHMuICBJZiB0aGUgc3ltYm9sIGRvZXMgZXhpc3QsIHRoZW4gdGhlIHBhcnNlciB3YXMgdW5hYmxlIHRvCi0JCSBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIGFuZCB3ZSBmaXggdGhpbmdzIGhlcmUuICAoUmVmOiBQUjE0ODI2KSAqLwotCSAgICAgIAotCSAgICAgIGlmICghKGZsYWdzICYgT1BFUkFORF9SRUcpICYmIChYX29wID09IE9fcmVnaXN0ZXIpKQotCQl7Ci0JCSAgc3ltYm9sUyAqIHN5bTsKLQkJICAKLQkJICBzeW0gPSBmaW5kX3N5bWJvbF9tYXRjaGluZ19yZWdpc3RlciAoJiBteW9wc1tpXSk7Ci0JCSAgCi0JCSAgaWYgKHN5bSAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBteW9wcyBbaV0uWF9vcCA9PSBYX29wID09IE9fc3ltYm9sOwotCQkgICAgICBteW9wcyBbaV0uWF9hZGRfc3ltYm9sID0gc3ltOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZAotCQkgICAgICAoXygiaWxsZWdhbCBvcGVyYW5kIC0gcmVnaXN0ZXIgbmFtZSBmb3VuZCB3aGVyZSBub25lIGV4cGVjdGVkIikpOwotCQl9Ci0JICAgIH0KLQkgIAotCSAgLyogV2UncmUgb25seSBkb25lIGlmIHRoZSBvcGVyYW5kcyBtYXRjaGVkIHNvIGZhciBBTkQgdGhlcmUKLQkgICAgIGFyZSBubyBtb3JlIHRvIGNoZWNrLiAgKi8KLQkgIGlmIChtYXRjaCAmJiBteW9wc1tpXS5YX29wID09IDApIAotCSAgICBicmVhazsKLQkgIGVsc2UKLQkgICAgbWF0Y2ggPSAwOwotCi0JICBuZXh0X29wY29kZSA9IG9wY29kZSArIDE7Ci0JICAKLQkgIGlmIChuZXh0X29wY29kZS0+b3Bjb2RlID09IDApIAotCSAgICBicmVhazsKLQkgIAotCSAgaWYgKHN0cmNtcCAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkpCi0JICAgIGJyZWFrOwotCSAgCi0JICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLQl9Ci0gICAgfQotCi0gIGlmICghbWF0Y2gpICAKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiKSk7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLQotICAvKiBDaGVjayB0aGF0IGFsbCByZWdpc3RlcnMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgZXZlbiBhcmUuICovCi0gIC8qIEFsc28sIGlmIGFueSBvcGVyYW5kcyB3ZXJlIG1hcmtlZCBhcyByZWdpc3RlcnMsIGJ1dCB3ZXJlIHJlYWxseSBzeW1ib2xzICovCi0gIC8qIGZpeCB0aGF0IGhlcmUuICovCi0gIGZvciAoaT0wOyBvcGNvZGUtPm9wZXJhbmRzW2ldOyBpKyspIAotICAgIHsKLSAgICAgIGlmICgoZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFncyAmIE9QRVJBTkRfRVZFTikgJiYKLQkgIChteW9wc1tpXS5YX2FkZF9udW1iZXIgJiAxKSkgCi0JYXNfZmF0YWwgKF8oIlJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIEVWRU4iKSk7Ci0gICAgICBpZiAobXlvcHNbaV0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotCXsKLQkgIGlmICghKGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3MgJiBPUEVSQU5EX1JFRykpIAotCSAgICB7Ci0JICAgICAgbXlvcHNbaV0uWF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIG15b3BzW2ldLlhfYWRkX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKChjaGFyICopbXlvcHNbaV0uWF9vcF9zeW1ib2wpOwotCSAgICAgIG15b3BzW2ldLlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgbXlvcHNbaV0uWF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIG9wY29kZTsKLX0KLQotLyogaWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCi0vKiB0aGVuIGl0IGlzIGRvbmUgaGVyZSAqLwotICAgICAgICAgICAgICAgICAKLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X29mZnNldDsKLQotICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJldHVybiByZWxvYzsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19IAotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKU5VTEwgJiYgKCFTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KSB8fAotICAgICAgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBzZWMpKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICp3aGVyZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBsb25nIHZhbHVlOwotICBpbnQgb3BfdHlwZTsKLSAgaW50IGxlZnQ9MDsKLQotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICp2YWx1ZXA7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gZml4cC0+Znhfb2Zmc2V0OwotICAgICAgaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCi0gCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBvcF90eXBlID0gZml4cC0+Znhfcl90eXBlOwotICBpZiAob3BfdHlwZSAmIDIwNDgpCi0gICAgewotICAgICAgb3BfdHlwZSAtPSAyMDQ4OwotICAgICAgaWYgKG9wX3R5cGUgJiAxMDI0KQotCXsKLQkgIG9wX3R5cGUgLT0gMTAyNDsKLQkgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0w7Ci0JICBsZWZ0ID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcF90eXBlICYgNDA5NikKLQl7Ci0JICBvcF90eXBlIC09IDQwOTY7Ci0JICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDEwVl8xODsKLQl9Ci0gICAgICBlbHNlCi0JZml4cC0+Znhfcl90eXBlID0gZ2V0X3JlbG9jKChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3BfdHlwZV0pOyAKLSAgICB9Ci0KLSAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLSAgICAgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0gIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICBpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0w6Ci0gICAgY2FzZSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SOgotICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMThfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfRDEwVl8xODoKLSAgICAgIC8qIGluc3RydWN0aW9uIGFkZHJlc3NlcyBhcmUgYWx3YXlzIHJpZ2h0LXNoaWZ0ZWQgYnkgMiAqLwotICAgICAgdmFsdWUgPj49IEFUX1dPUkRfUklHSFRfU0hJRlQ7Ci0gICAgICBpZiAoZml4cC0+Znhfc2l6ZSA9PSAyKQotCWJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBkMTB2X29wY29kZSAqcmVwLCAqcmVwaTsKLQotCSAgcmVwID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKSBoYXNoX2ZpbmQgKGQxMHZfaGFzaCwgInJlcCIpOwotCSAgcmVwaSA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKikgaGFzaF9maW5kIChkMTB2X2hhc2gsICJyZXBpIik7Ci0JICBpZiAoKGluc24gJiBGTTExKSA9PSBGTTExCi0JICAgICAgJiYgKHJlcGkgIT0gTlVMTCAmJiAoaW5zbiAmIHJlcGktPm1hc2spID09IHJlcGktPm9wY29kZQotCQkgIHx8IHJlcCAhPSBOVUxMICYmIChpbnNuICYgcmVwLT5tYXNrKSA9PSByZXAtPm9wY29kZSkKLQkgICAgICAmJiB2YWx1ZSA8IDQpCi0JICAgIGFzX2ZhdGFsCi0JICAgICAgKF8oImxpbmUgJWQ6IHJlcCBvciByZXBpIG11c3QgaW5jbHVkZSBhdCBsZWFzdCA0IGluc3RydWN0aW9ucyIpLAotCSAgICAgICBmaXhwLT5meF9saW5lKTsKLQkgIGluc24gPSBkMTB2X2luc2VydF9vcGVyYW5kIChpbnNuLCBvcF90eXBlLCAob2Zmc2V0VCl2YWx1ZSwgbGVmdCwgZml4cCk7Ci0JICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOyAgCi0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oImxpbmUgJWQ6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlOiAweCV4IiksZml4cC0+ZnhfbGluZSxmaXhwLT5meF9yX3R5cGUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIGQxMHZfY2xlYW51cCgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZCBwYXJzaW5nIHRoZSBpbnB1dCAKLSAgIGZpbGUgb3IgYWZ0ZXIgYSBsYWJlbCBpcyBkZWZpbmVkLiAgQmVjYXVzZSB0aGUgRDEwViBhc3NlbWJsZXIgc29tZXRpbWVzIHNhdmVzIHNob3J0IAotICAgaW5zdHJ1Y3Rpb25zIHRvIHNlZSBpZiBpdCBjYW4gcGFja2FnZSB0aGVtIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHRoZXJlIG1heQotICAgYmUgYSBzaG9ydCBpbnN0cnVjdGlvbiB0aGF0IHN0aWxsIG5lZWRzIHdyaXR0ZW4uICAqLwotaW50Ci1kMTB2X2NsZWFudXAgKCkKLXsKLSAgc2VnVCBzZWc7Ci0gIHN1YnNlZ1Qgc3Vic2VnOwotCi0gIGlmIChwcmV2X29wY29kZSAmJiBldHlwZSA9PSAwKQotICAgIHsKLSAgICAgIHNlZyA9IG5vd19zZWc7Ci0gICAgICBzdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgaWYgKHByZXZfc2VnKQotCXN1YnNlZ19zZXQgKHByZXZfc2VnLCBwcmV2X3N1YnNlZyk7Ci0gICAgICB3cml0ZV8xX3Nob3J0IChwcmV2X29wY29kZSwgcHJldl9pbnNuLCBmaXh1cHMtPm5leHQpOwotICAgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotICAgICAgcHJldl9vcGNvZGUgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIExpa2Ugbm9ybWFsIC53b3JkLCBleGNlcHQgc3VwcG9ydCBAd29yZCAqLwotLyogY2xvYmJlcnMgaW5wdXRfbGluZV9wb2ludGVyLCBjaGVja3MgZW5kLW9mLWxpbmUuICovCi1zdGF0aWMgdm9pZAotZDEwdl9kb3Rfd29yZCAobmJ5dGVzKQotICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOwkvKiAxPS5ieXRlLCAyPS53b3JkLCA0PS5sb25nICovCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICBjaGFyICpwOwotICBpbnQgb2Zmc2V0OwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRvCi0gICAgewotICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoIXN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJAd29yZCIsIDUpKQotCXsKLQkgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0JCi0JICBwID0gZnJhZ19tb3JlICgyKTsKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAyLCAKLQkJICAgICAgICZleHAsIDAsIEJGRF9SRUxPQ19EMTBWXzE4KTsKLQl9Ci0gICAgICBlbHNlCi0JZW1pdF9leHByICgmZXhwLCAyKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLQotLyogTWl0c3ViaXNoaSBhc2tlZCB0aGF0IHdlIHN1cHBvcnQgc29tZSBvbGQgc3ludGF4IHRoYXQgYXBwYXJlbnRseSAqLwotLyogaGFkIGltbWVkaWF0ZSBvcGVyYW5kcyBzdGFydGluZyB3aXRoICcjJy4gIFRoaXMgaXMgaW4gc29tZSBvZiB0aGVpciAqLwotLyogc2FtcGxlIGNvZGUgYnV0IGlzIG5vdCBkb2N1bWVudGVkIChhbHRob3VnaCBpdCBhcHBlYXJzIGluIHNvbWUgICovCi0vKiBleGFtcGxlcyBpbiB0aGVpciBhc3NlbWJsZXIgbWFudWFsKS4gRm9yIG5vdywgd2UnbGwgc29sdmUgdGhpcyAqLwotLyogY29tcGF0aWJpbGl0eSBwcm9ibGVtIGJ5IHNpbXBseSBpZ25vcmluZyBhbnkgJyMnIGF0IHRoZSBiZWdpbm5pbmcgKi8KLS8qIG9mIGFuIG9wZXJhbmQuICovCi0KLS8qIG9wZXJhbmRzIHRoYXQgYmVnaW4gd2l0aCAnIycgc2hvdWxkIGZhbGwgdGhyb3VnaCB0byBoZXJlICovCi0vKiBmcm9tIGV4cHIuYyAqLwotCi12b2lkIAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnICYmICEgZG9fbm90X2lnbm9yZV9oYXNoKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgIH0KLX0KLQotYm9vbGVhbgotZDEwdl9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKmZpeFA7Ci17Ci0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzICovCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1kMTB2X2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgICBzdHJ1Y3QgZml4ICpmaXhwOwotewotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWQxMHYuaCBiL2dhcy9jb25maWcvdGMtZDEwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGU2ZTMwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZDEwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogdGMtZDEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1kMTB2LmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX0QxMFYKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBEMTBWIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2QxMHYKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1kMTB2IgotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpICAgCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogLi1mb28gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIG1kX251bWJlcl90b19jaGFycyAgICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbgotCi1pbnQgZDEwdl9jbGVhbnVwIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfYWZ0ZXJfcGFzc19ob29rKCkJICAgICBkMTB2X2NsZWFudXAoKQotI2RlZmluZSBtZF9jbGVhbnVwKCkJCSAgICAgZDEwdl9jbGVhbnVwKCkKLSNkZWZpbmUgbWRfZG9fYWxpZ24oYSxiLGMsZCxlKQkgICAgIGQxMHZfY2xlYW51cCgpCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBkbyB7XAotICBkMTB2X2NsZWFudXAoKTsgXAotICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBkMTB2X2ZpeF9hZGp1c3RhYmxlKGZpeFApCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgZDEwdl9mb3JjZV9yZWxvY2F0aW9uKGZpeHApCi1leHRlcm4gaW50IGQxMHZfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAgZDEwdl9jbGVhbnVwCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWQzMHYuYyBiL2dhcy9jb25maWcvdGMtZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWRjMGVhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZDMwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIzNyArMCwwIEBACi0vKiB0Yy1kMzB2LmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNaXRzdWJpc2hpIEQzMFYKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJvcGNvZGUvZDMwdi5oIgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJPbk5jQyI7Ci1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotCi0jaWYgSEFWRV9MSU1JVFNfSAotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgQ0hBUl9CSVQKLSNkZWZpbmUgQ0hBUl9CSVQgOAotI2VuZGlmCi0KLSNkZWZpbmUgTk9QX01VTFRJUExZIDEKLSNkZWZpbmUgTk9QX0FMTCAyCi1zdGF0aWMgaW50IHdhcm5fbm9wcyA9IDA7Ci1zdGF0aWMgaW50IE9wdGltaXppbmcgPSAwOwotc3RhdGljIGludCB3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzID0gMTsKLQotI2RlZmluZSBGT1JDRV9TSE9SVAkxCi0jZGVmaW5lIEZPUkNFX0xPTkcJMgotCi0vKiBFWEVDIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBfZXhlY190eXBlCi17Ci0gIEVYRUNfVU5LTk9XTiwJCQkvKiBubyBvcmRlciBzcGVjaWZpZWQgKi8KLSAgRVhFQ19QQVJBTExFTCwJCS8qIGRvbmUgaW4gcGFyYWxsZWwgKEZNPTAwKSAqLwotICBFWEVDX1NFUSwJCQkvKiBzZXF1ZW50aWFsIChGTT0wMSkgKi8KLSAgRVhFQ19SRVZTRVEJCQkvKiByZXZlcnNlIHNlcXVlbnRpYWwgKEZNPTEwKSAqLwotfSBleGVjX3R5cGVfZW51bTsKLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCBkMzB2X2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9wZXJhbmQ7Ci0gIGludCBwY3JlbDsKLSAgaW50IHNpemU7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9maXh1cHMKLXsKLSAgaW50IGZjOwotICBzdHJ1Y3QgZDMwdl9maXh1cCBmaXhbTUFYX0lOU05fRklYVVBTXTsKLSAgc3RydWN0IF9maXh1cHMgKm5leHQ7Ci19IEZpeHVwczsKLQotc3RhdGljIEZpeHVwcyBGaXhVcHNbMl07Ci1zdGF0aWMgRml4dXBzICpmaXh1cHM7Ci0KLS8qIFdoZXRoZXIgY3VycmVudCBhbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gYXJlIHdvcmQgbXVsdGlwbHkgaW5zbnMuICAqLwotc3RhdGljIGludCBjdXJfbXVsMzJfcCA9IDA7Ci1zdGF0aWMgaW50IHByZXZfbXVsMzJfcCA9IDA7Ci0KLS8qICBUaGUgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsIGlzIHRydWUgaWZmIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBhc3NlbWJsZWQKLSAgICBoYXMgYmVlbiBleHBsaWNpdGx5IHdyaXR0ZW4gYXMgYSBwYXJhbGxlbCBzaG9ydC1pbnN0cnVjdGlvbiBwYWlyIGJ5IHRoZQotICAgIGh1bWFuIHByb2dyYW1tZXIuICBJdCBpcyB1c2VkIGluIHBhcmFsbGVsX29rKCkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgotICAgIHRob3NlIGRhbmdlcm91cyBwYXJhbGxlbGl6YXRpb25zIGF0dGVtcHRlZCBieSB0aGUgaHVtYW4sIHdoaWNoIGFyZSB0byBiZQotICAgIGFsbG93ZWQsIGFuZCB0aG9zZSBhdHRlbXB0ZWQgYnkgdGhlIGFzc2VtYmxlciwgd2hpY2ggYXJlIG5vdC4gIEl0IGlzIHNldAotICAgIGZyb20gbWRfYXNzZW1ibGUoKS4gICovCi1zdGF0aWMgaW50IGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IDA7IAotc3RhdGljIGludCBmbGFnX3hwX3N0YXRlID0gMDsKLQotLyogV2hldGhlciBjdXJyZW50IGFuZCBwcmV2aW91cyBsZWZ0IHN1Yi1pbnN0cnVjdGlvbiBkaXNhYmxlcwotICAgZXhlY3V0aW9uIG9mIHJpZ2h0IHN1Yi1pbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgaW50IGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOwotc3RhdGljIGludCBwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci0KLS8qIFRoZSBrbm93biBjdXJyZW50IGFsaWdubWVudCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgZDMwdl9jdXJyZW50X2FsaWduOwotc3RhdGljIHNlZ1QgZDMwdl9jdXJyZW50X2FsaWduX3NlZzsKLQotLyogVGhlIGxhc3Qgc2VlbiBsYWJlbCBpbiB0aGUgY3VycmVudCBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkIHRvIGF1dG8tYWxpZ24KLSAgIGxhYmVscyBwcmVjZWVkaW5nIGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgc3ltYm9sUyAqZDMwdl9sYXN0X2xhYmVsOwotCi0vKiBUd28gbm9wcyAqLwotI2RlZmluZSBOT1BfTEVGVCAgICgobG9uZyBsb25nKSBOT1AgPDwgMzIpCi0jZGVmaW5lIE5PUF9SSUdIVCAgKChsb25nIGxvbmcpIE5PUCkKLSNkZWZpbmUgTk9QMiAoRk0wMCB8IE5PUF9MRUZUIHwgTk9QX1JJR0hUKQotCi0vKiBsb2NhbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBpbnQgcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBpbnQgY2hlY2tfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyBudW0sIGludCBiaXRzLCBpbnQgZmxhZ3MpKTsKLXN0YXRpYyBpbnQgcG9zdGZpeCBQQVJBTVMgKChjaGFyICpwKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGdldF9yZWxvYyBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcCwgaW50IHJlbF9mbGFnKSk7Ci1zdGF0aWMgaW50IGdldF9vcGVyYW5kcyBQQVJBTVMgKChleHByZXNzaW9uUyBleHBbXSwgaW50IGNtcF9oYWNrKSk7Ci1zdGF0aWMgc3RydWN0IGQzMHZfZm9ybWF0ICpmaW5kX2Zvcm1hdCBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wY29kZSwgCi0JCQlleHByZXNzaW9uUyBvcHNbXSxpbnQgZnNpemUsIGludCBjbXBfaGFjaykpOwotc3RhdGljIGxvbmcgbG9uZyBidWlsZF9pbnNuIFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwgZXhwcmVzc2lvblMgKm9wZXJzKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9sb25nIFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwgbG9uZyBsb25nIGluc24sIEZpeHVwcyAqZngpKTsKLXN0YXRpYyB2b2lkIHdyaXRlXzFfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlLCBsb25nIGxvbmcgaW5zbiwKLQkJCQkgICBGaXh1cHMgKmZ4LCBpbnQgdXNlX3NlcXVlbnRpYWwpKTsKLXN0YXRpYyBpbnQgd3JpdGVfMl9zaG9ydCBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUxLCBsb25nIGxvbmcgaW5zbjEsIAotCQkgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUyLCBsb25nIGxvbmcgaW5zbjIsIGV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZSwgRml4dXBzICpmeCkpOwotc3RhdGljIGxvbmcgbG9uZyBkb19hc3NlbWJsZSBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwKLQkJCQkgICAgICBpbnQgc2hvcnRwLCBpbnQgaXNfcGFyYWxsZWwpKTsKLXN0YXRpYyBpbnQgcGFyYWxsZWxfb2sgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCi0JCQkJc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwKLQkJCQlleGVjX3R5cGVfZW51bSBleGVjX3R5cGUpKTsKLXN0YXRpYyB2b2lkIGQzMHZfbnVtYmVyX3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgbG9uZyBsb25nIHZhbHVlLCBpbnQgbmJ5dGVzKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19zaXplIFBBUkFNUyAoKGxvbmcgdmFsdWUsIGludCBiaXRzLCBjaGFyICpmaWxlLCBpbnQgbGluZSkpOwotc3RhdGljIHZvaWQgZDMwdl9hbGlnbiBQQVJBTVMgKChpbnQsIGNoYXIgKiwgc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBzX2QzMHZfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2QzMHZfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZDMwdl9kYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kMzB2X3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsgICAgICAgCi0KLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsIGNvbnMsIDQgfSwKLSAgeyAiaHdvcmQiLCBjb25zLCAyIH0sCi0gIHsgImFsaWduIiwgc19kMzB2X2FsaWduLCAwIH0sCi0gIHsgInRleHQiLCBzX2QzMHZfdGV4dCwgMCB9LAotICB7ICJkYXRhIiwgc19kMzB2X2RhdGEsIDAgfSwKLSAgeyAic2VjdGlvbiIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3Rpb24ucyIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QiLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0LnMiLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAotICB7IE5VTEwsIE5VTEwsIDAgfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmQzMHZfaGFzaDsKLQotLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMKLSAgIGFycmF5IHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdfbmFtZV9jbnQgKCkgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHN5bWJvbF9maW5kIChuYW1lKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHdhcm5fcmVnaXN0ZXJfbmFtZV9jb25mbGljdHMpCi0JCWFzX3dhcm4gKF8oIlJlZ2lzdGVyIG5hbWUgJXMgY29uZmxpY3RzIHdpdGggc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUiKSwKLQkJCSBuYW1lKTsKLQkgICAgfQotICAKLQkgIHJldHVybiBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS52YWx1ZTsKLQl9Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICAKLSAgcmV0dXJuIC0xOwotfQotCi0vKiByZWdpc3Rlcl9uYW1lKCkgY2hlY2tzIHRoZSBzdHJpbmcgYXQgaW5wdXRfbGluZV9wb2ludGVyCi0gICB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCByZWdpc3RlciBuYW1lLiAgKi8KLQotc3RhdGljIGludAotcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgYywgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIAotICB3aGlsZSAoKnAgJiYgKnAhPSdcbicgJiYgKnAhPSdccicgJiYgKnAgIT0nLCcgJiYgKnAhPScgJyAmJiAqcCE9JyknKQotICAgIHArKzsKLQotICBjID0gKnA7Ci0gIGlmIChjKQotICAgICpwKysgPSAwOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIC8qIHRlbXBvcmFyaWx5IHN0b3JlIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGhlcmUgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoYykKLSAgICAqKHAtMSkgPSBjOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1jaGVja19yYW5nZSAobnVtLCBiaXRzLCBmbGFncykKLSAgICAgdW5zaWduZWQgbG9uZyBudW07Ci0gICAgIGludCBiaXRzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGxvbmcgbWluLCBtYXg7Ci0KLSAgLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIDMyLWJpdCB2YWx1ZXMuICAqLwotICBpZiAoYml0cyA9PSAzMikKLSAgICB7Ci0gICAgICBpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQgPT0gMzIpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICAvKiBXZSBkb24ndCByZWNvcmQgc2lnbmVkIG9yIHVuc2lnbmVkIGZvciAzMi1iaXQgcXVhbnRpdGllcy4KLQkgQWxsb3cgZWl0aGVyLiAgKi8KLSAgICAgIG1pbiA9IC0oKHVuc2lnbmVkIGxvbmcpMSA8PCAoYml0cyAtIDEpKTsKLSAgICAgIG1heCA9ICgodW5zaWduZWQgbG9uZykxIDw8IGJpdHMpIC0gMTsKLSAgICAgIHJldHVybiAobG9uZyludW0gPCBtaW4gfHwgKGxvbmcpbnVtID4gbWF4OwotICAgIH0KLQotICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotICAgIHsKLSAgICAgIC8qIFdlIGtub3cgdGhhdCBhbGwgc2hpZnRzIGFyZSByaWdodCBieSB0aHJlZSBiaXRzLi4uLiAqLwotICAgICAgCi0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKLQludW0gPSAodW5zaWduZWQgbG9uZykgKCAobG9uZykgbnVtID49IDApIAotCQk/ICggKChsb25nKSBudW0pID4+IDMgKQotCQk6ICggKG51bSA+PiAzKSB8IH4ofih1bnNpZ25lZCBsb25nKTAgPj4gMykgKTsKLSAgICAgIGVsc2UKLQludW0gPj49IDM7Ci0gICAgfQotCi0gIGlmIChmbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotICAgIHsKLSAgICAgIG1heCA9ICgodW5zaWduZWQgbG9uZykxIDw8IChiaXRzIC0gMSkpIC0gMTsgCi0gICAgICBtaW4gPSAtICgodW5zaWduZWQgbG9uZykxIDw8IChiaXRzIC0gMSkpOwotICAgICAgcmV0dXJuIChsb25nKW51bSA+IG1heCB8fCAobG9uZyludW0gPCBtaW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWF4ID0gKCh1bnNpZ25lZCBsb25nKTEgPDwgYml0cykgLSAxOwotICAgICAgbWluID0gMDsKLSAgICAgIHJldHVybiBudW0gPiBtYXggfHwgbnVtIDwgbWluOwotICAgIH0KLX0KLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcbkQzMFYgb3B0aW9uczpcblwKLS1PICAgICAgICAgICAgICAgICAgICAgIE1ha2UgYWRqYWNlbnQgc2hvcnQgaW5zdHJ1Y3Rpb25zIHBhcmFsbGVsIGlmIHBvc3NpYmxlLlxuXAotLW4gICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBhbGwgTk9QcyBpbnNlcnRlZCBieSB0aGUgYXNzZW1ibGVyLlxuXAotLU4JCQlXYXJuIGFib3V0IE5PUHMgaW5zZXJ0ZWQgYWZ0ZXIgd29yZCBtdWx0aXBsaWVzLlxuXAotLWMgICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBzeW1ib2xzIHdob2VzIG5hbWVzIG1hdGNoIHJlZ2lzdGVyIG5hbWVzLlxuXAotLUMgICAgICAgICAgICAgICAgICAgICAgT3Bwb3NpdGUgb2YgLUMuICAtYyBpcyB0aGUgZGVmYXVsdC5cbiIpKTsKLX0KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICAgIC8qIE9wdGltaXplLiBXaWxsIGF0dGVtcHQgdG8gcGFyYWxsZWxpemUgb3BlcmF0aW9ucyAqLwotICAgIGNhc2UgJ08nOgotICAgICAgT3B0aW1pemluZyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogV2FybiBhYm91dCBhbGwgTk9QUyB0aGF0IHRoZSBhc3NlbWJsZXIgaW5zZXJ0cy4gICovCi0gICAgY2FzZSAnbic6Ci0gICAgICB3YXJuX25vcHMgPSBOT1BfQUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgdGhlIE5PUFMgdGhhdCB0aGUgYXNzZW1ibGVyIGluc2VydHMgYmVjYXVzZSBvZiB0aGUKLQkgbXVsdGlwbHkgaGF6YXJkLiAgKi8KLSAgICBjYXNlICdOJzoKLSAgICAgIHdhcm5fbm9wcyA9IE5PUF9NVUxUSVBMWTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYyc6Ci0gICAgICB3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQyc6Ci0gICAgICB3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzID0gMDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0gIAotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgCi0gICpzaXplUCA9IHByZWMgKiAyOwotICAKLSAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqIG9wY29kZTsKLSAgZDMwdl9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IG9wY29kZSBuYW1lcyBpbnRvIGEgaGFzaCB0YWJsZS4gKi8KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IGQzMHZfb3Bjb2RlICopZDMwdl9vcGNvZGVfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgICBoYXNoX2luc2VydCAoZDMwdl9oYXNoLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0KLSAgZml4dXBzID0gJkZpeFVwc1swXTsKLSAgRml4VXBzWzBdLm5leHQgPSAmRml4VXBzWzFdOwotICBGaXhVcHNbMV0ubmV4dCA9ICZGaXhVcHNbMF07Ci0KLSAgZDMwdl9jdXJyZW50X2FsaWduX3NlZyA9IG5vd19zZWc7Ci19Ci0KLQotLyogdGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBwb3N0aW5jcmVtZW50IG9yIHBvc3RkZWNyZW1lbnQKLSAgIG9wZXJhdG9yICggJysnIG9yICctJyApIGZyb20gYW4gZXhwcmVzc2lvbiAqLwotCi1zdGF0aWMgaW50IHBvc3RmaXggKHApIAotICAgICBjaGFyICpwOwotewotICB3aGlsZSAoKnAgIT0gJy0nICYmICpwICE9ICcrJykgCi0gICAgewotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInIHx8ICpwPT0nICcgfHwgKnA9PScsJykgCi0JYnJlYWs7Ci0gICAgICBwKys7Ci0gICAgfQotCi0gIGlmICgqcCA9PSAnLScpIAotICAgIHsKLSAgICAgICpwID0gJyAnOwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotICBpZiAoKnAgPT0gJysnKSAKLSAgICB7Ci0gICAgICAqcCA9ICcgJzsKLSAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotCi0gIHJldHVybiAoMCk7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAKLWdldF9yZWxvYyAob3AsIHJlbF9mbGFnKSAKLSAgICAgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3A7Ci0gICAgIGludCByZWxfZmxhZzsKLXsKLSAgc3dpdGNoIChvcC0+Yml0cykKLSAgICB7Ci0gICAgY2FzZSA2OgotICAgICAgaWYgKG9wLT5mbGFncyAmIE9QRVJBTkRfU0hJRlQpCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzlfUENSRUw7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgICAgaWYgKCEob3AtPmZsYWdzICYgT1BFUkFORF9TSElGVCkpCi0JYXNfd2FybiAoXygidW5leHBlY3RlZCAxMi1iaXQgcmVsb2MgdHlwZSIpKTsKLSAgICAgIGlmIChyZWxfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMTVfUENSRUw7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzE1OwotICAgIGNhc2UgMTg6Ci0gICAgICBpZiAoIShvcC0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKSkKLQlhc193YXJuIChfKCJ1bmV4cGVjdGVkIDE4LWJpdCByZWxvYyB0eXBlIikpOwotICAgICAgaWYgKHJlbF9mbGFnID09IFJFTE9DX1BDUkVMKQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMjE7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChyZWxfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMzJfUENSRUw7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzMyOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIGdldF9vcGVyYW5kcyBwYXJzZXMgYSBzdHJpbmcgb2Ygb3BlcmFuZHMgYW5kIHJldHVybnMKLSAgIGFuIGFycmF5IG9mIGV4cHJlc3Npb25zICovCi0KLXN0YXRpYyBpbnQKLWdldF9vcGVyYW5kcyAoZXhwLCBjbXBfaGFjaykgCi0gICAgIGV4cHJlc3Npb25TIGV4cFtdOwotICAgICBpbnQgY21wX2hhY2s7Ci17Ci0gIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGludCBudW1vcHMgPSAwOwotICBpbnQgcG9zdCA9IDA7Ci0KLSAgaWYgKGNtcF9oYWNrKQotICAgIHsKLSAgICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGV4cFtudW1vcHMrK10uWF9hZGRfbnVtYmVyID0gY21wX2hhY2sgLSAxOwotICAgIH0KLQotICB3aGlsZSAoKnApICAKLSAgICB7Ci0gICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJywnKSAKLQlwKys7Ci0gICAgICBpZiAoKnA9PTAgfHwgKnA9PSdcbicgfHwgKnA9PSdccicpIAotCWJyZWFrOwotICAgICAgCi0gICAgICBpZiAoKnAgPT0gJ0AnKSAKLQl7Ci0JICBwKys7Ci0JICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0JICBpZiAoKnAgPT0gJygnKSAKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUUEFSOwotCSAgICAgIHBvc3QgPSBwb3N0Zml4IChwKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnAgPT0gJy0nKSAKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUTUlOVVM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRTSUdOOwotCSAgICAgIHBvc3QgPSBwb3N0Zml4IChwKTsKLQkgICAgfQotCSAgbnVtb3BzKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgqcCA9PSAnKScpIAotCXsKLQkgIC8qIGp1c3Qgc2tpcCB0aGUgdHJhaWxpbmcgcGFyZW4gKi8KLQkgIHArKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLQotICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIGl0IG1pZ2h0IGJlIGEgcmVnaXN0ZXIgbmFtZSAqLwotICAgICAgaWYgKCFyZWdpc3Rlcl9uYW1lICgmZXhwW251bW9wc10pKQotCXsKLQkgIC8qIHBhcnNlIGFzIGFuIGV4cHJlc3Npb24gKi8KLQkgIGV4cHJlc3Npb24gKCZleHBbbnVtb3BzXSk7Ci0JfQotCi0gICAgICBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2lsbGVnYWwpIAotCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOwotICAgICAgZWxzZSBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2Fic2VudCkgCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0KLSAgICAgIG51bW9wcysrOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgc3dpdGNoIChwb3N0KSAKLQl7Ci0JY2FzZSAtMToJLyogcG9zdGRlY3JlbWVudCBtb2RlICovCi0JICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0JICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfTUlOVVM7Ci0JICBicmVhazsKLQljYXNlIDE6CS8qIHBvc3RpbmNyZW1lbnQgbW9kZSAqLwotCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotCSAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX1BMVVM7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwb3N0ID0gMDsKLSAgICB9Ci0KLSAgZXhwW251bW9wc10uWF9vcCA9IDA7Ci0gIHJldHVybiAobnVtb3BzKTsKLX0KLQotLyogYnVpbGRfaW5zbiBnZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uLiAgSXQgZG9lcyBldmVyeXRoaW5nICovCi0vKiBidXQgd3JpdGUgdGhlIEZNIGJpdHMuICovCi0KLXN0YXRpYyBsb25nIGxvbmcKLWJ1aWxkX2luc24gKG9wY29kZSwgb3BlcnMpIAotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyczsKLXsKLSAgaW50IGksIGxlbmd0aCwgYml0cywgc2hpZnQsIGZsYWdzOwotICB1bnNpZ25lZCBsb25nIG51bWJlciwgaWQ9MDsKLSAgbG9uZyBsb25nIGluc247Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqb3AgPSBvcGNvZGUtPm9wOwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZvcm0gPSBvcGNvZGUtPmZvcm07Ci0KLSAgaW5zbiA9IG9wY29kZS0+ZWNjIDw8IDI4IHwgb3AtPm9wMSA8PCAyNSB8IG9wLT5vcDIgPDwgMjAgfCBmb3JtLT5tb2RpZmllciA8PCAxODsKLQotICBmb3IgKGk9MDsgZm9ybS0+b3BlcmFuZHNbaV07IGkrKykgCi0gICAgeyAKLSAgICAgIGZsYWdzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5mbGFnczsKLQotICAgICAgLyogbXVzdCBiZSBhIHJlZ2lzdGVyIG9yIG51bWJlciAqLwotICAgICAgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX1JFRykgJiYgIShmbGFncyAmIE9QRVJBTkRfTlVNKSAmJiAKLQkgICEoZmxhZ3MgJiBPUEVSQU5EX05BTUUpICYmICEoZmxhZ3MgJiBPUEVSQU5EX1NQRUNJQUwpKQotCWNvbnRpbnVlOwotCi0gICAgICBiaXRzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5iaXRzOwotICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKLQliaXRzICs9IDM7Ci0KLSAgICAgIGxlbmd0aCA9IGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0ubGVuZ3RoOwotICAgICAgc2hpZnQgPSAxMiAtIGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0ucG9zaXRpb247Ci0gICAgICBpZiAob3BlcnNbaV0uWF9vcCAhPSBPX3N5bWJvbCkKLQludW1iZXIgPSBvcGVyc1tpXS5YX2FkZF9udW1iZXI7Ci0gICAgICBlbHNlCi0JbnVtYmVyID0gMDsKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCXsKLQkgIC8qIGNoZWNrIGZvciBtdmZzeXMgb3IgbXZ0c3lzIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0JICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wgJiYgKG51bWJlciAmIDB4N2YpID4gTUFYX0NPTlRST0xfUkVHKQotCSAgICB7Ci0JICAgICAgLyogUFNXTCBvciBQU1dIICovCi0JICAgICAgaWQgPSAobnVtYmVyICYgMHg3ZikgLSBNQVhfQ09OVFJPTF9SRUc7Ci0JICAgICAgbnVtYmVyID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAobnVtYmVyICYgT1BFUkFORF9GTEFHKQotCSAgICB7Ci0JICAgICAgaWQgPSAzOyAgLyogbnVtYmVyIGlzIGEgZmxhZyByZWdpc3RlciAqLwotCSAgICB9Ci0JICBudW1iZXIgJj0gMHg3RjsKLQl9Ci0gICAgICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfU1BFQ0lBTCkKLQl7Ci0JICBudW1iZXIgPSBpZDsKLQl9Ci0KLSAgICAgIGlmIChvcGVyc1tpXS5YX29wICE9IE9fcmVnaXN0ZXIgJiYgb3BlcnNbaV0uWF9vcCAhPSBPX2NvbnN0YW50ICYmICEoZmxhZ3MgJiBPUEVSQU5EX05BTUUpKQotCXsKLQkgIC8qIG5vdyBjcmVhdGUgYSBmaXh1cCAqLwotCi0JICBpZiAoZml4dXBzLT5mYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID0gCi0JICAgIGdldF9yZWxvYyAoKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXSwgb3AtPnJlbG9jX2ZsYWcpOwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDQ7Ci0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5leHAgPSBvcGVyc1tpXTsKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLm9wZXJhbmQgPSBmb3JtLT5vcGVyYW5kc1tpXTsKLQkgIGlmIChmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDMwVl85X1BDUkVMKQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IFJFTE9DX1BDUkVMOwotCSAgZWxzZQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IG9wLT5yZWxvY19mbGFnOwotCSAgKGZpeHVwcy0+ZmMpKys7Ci0JfQotCi0gICAgICAvKiB0cnVuY2F0ZSB0byB0aGUgcHJvcGVyIG51bWJlciBvZiBiaXRzICovCi0gICAgICBpZiAoKG9wZXJzW2ldLlhfb3AgPT0gT19jb25zdGFudCkgJiYgY2hlY2tfcmFuZ2UgKG51bWJlciwgYml0cywgZmxhZ3MpKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksbnVtYmVyKTsKLSAgICAgIGlmIChiaXRzIDwgMzEpCi0JbnVtYmVyICY9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7Ci0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotCW51bWJlciA+Pj0gMzsKLSAgICAgIGlmIChiaXRzID09IDMyKQotCXsKLQkgIC8qIGl0J3MgYSBMT05HIGluc3RydWN0aW9uICovCi0JICBpbnNuIHw9ICgobnVtYmVyICYgMHhmZmZmZmZmZikgPj4gMjYpOwkvKiB0b3AgNiBiaXRzICovCi0JICBpbnNuIDw8PSAzMjsJCQkvKiBzaGlmdCB0aGUgZmlyc3Qgd29yZCBvdmVyICovCi0JICBpbnNuIHw9ICgobnVtYmVyICYgMHgwM0ZDMDAwMCkgPDwgMik7CQkvKiBuZXh0IDggYml0cyAqLyAKLQkgIGluc24gfD0gbnVtYmVyICYgMHgwMDAzRkZGRjsJCQkvKiBib3R0b20gMTggYml0cyAqLwotCX0KLSAgICAgIGVsc2UKLQlpbnNuIHw9IG51bWJlciA8PCBzaGlmdDsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0KLS8qIHdyaXRlIG91dCBhIGxvbmcgZm9ybSBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQKLXdyaXRlX2xvbmcgKG9wY29kZSwgaW5zbiwgZngpIAotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGU7Ci0gICAgIGxvbmcgbG9uZyBpbnNuOwotICAgICBGaXh1cHMgKmZ4OwotewotICBpbnQgaSwgd2hlcmU7Ci0gIGNoYXIgKmYgPSBmcmFnX21vcmUgKDgpOwotCi0gIGluc24gfD0gRk0xMTsKLSAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDgpOwotCi0gIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotICAgIHsKLSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCXsgCi0JICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICB3aGVyZSwKLQkJICAgICAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJICAgICAgICYoZngtPmZpeFtpXS5leHApLAotCQkgICAgICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJICAgICAgIGZ4LT5maXhbaV0ucmVsb2MpOwotCX0KLSAgICB9Ci0gIGZ4LT5mYyA9IDA7Ci19Ci0KLQotLyogV3JpdGUgb3V0IGEgc2hvcnQgZm9ybSBpbnN0cnVjdGlvbiBieSBpdHNlbGYuICAqLwotc3RhdGljIHZvaWQKLXdyaXRlXzFfc2hvcnQgKG9wY29kZSwgaW5zbiwgZngsIHVzZV9zZXF1ZW50aWFsKSAKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlOwotICAgICBsb25nIGxvbmcgaW5zbjsKLSAgICAgRml4dXBzICpmeDsKLSAgICAgaW50IHVzZV9zZXF1ZW50aWFsOwotewotICBjaGFyICpmID0gZnJhZ19tb3JlICg4KTsKLSAgaW50IGksIHdoZXJlOwotCi0gIGlmICh3YXJuX25vcHMgPT0gTk9QX0FMTCkKLSAgICBhc193YXJuIChfKCIlcyBOT1AgaW5zZXJ0ZWQiKSwgdXNlX3NlcXVlbnRpYWwgPwotCSAgICAgXygic2VxdWVudGlhbCIpIDogXygicGFyYWxsZWwiKSk7Ci0KLSAgLyogVGhlIG90aGVyIGNvbnRhaW5lciBuZWVkcyB0byBiZSBOT1AuICovCi0gIGlmICh1c2Vfc2VxdWVudGlhbCkKLSAgICB7Ci0gICAgICAvKiBVc2UgYSBzZXF1ZW50aWFsIE5PUCByYXRoZXIgdGhhbiBhIHBhcmFsbGVsIG9uZSwKLQkgYXMgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaXMgYSBGTEFHX01VTDMyIHR5cGUgb25lCi0JIGFuZCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhIGxvYWQuICAqLwotICAgICAgCi0gICAgICAvKiBBY2NvcmRpbmcgdG8gNC4zLjE6IGZvciBGTT0wMSwgc3ViLWluc3RydWN0aW9ucyBwZXJmb3JtZWQKLQkgb25seSBieSBJVSBjYW5ub3QgYmUgZW5jb2RlZCBpbiBMLWNvbnRhaW5lci4gKi8KLSAgICAgIAotICAgICAgaWYgKG9wY29kZS0+b3AtPnVuaXQgPT0gSVUpCi0JaW5zbiB8PSBGTTEwIHwgTk9QX0xFRlQ7CS8qIHJpZ2h0IHRoZW4gbGVmdCAqLwotICAgICAgZWxzZQotCWluc24gPSBGTTAxIHwgKGluc24gPDwgMzIpIHwgTk9QX1JJR0hUOwkvKiBsZWZ0IHRoZW4gcmlnaHQgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBY2NvcmRpbmcgdG8gNC4zLjE6IGZvciBGTT0wMCwgc3ViLWluc3RydWN0aW9ucyBwZXJmb3JtZWQKLQkgb25seSBieSBJVSBjYW5ub3QgYmUgZW5jb2RlZCBpbiBMLWNvbnRhaW5lci4gKi8KLSAgICAgIAotICAgICAgaWYgKG9wY29kZS0+b3AtPnVuaXQgPT0gSVUpCi0JaW5zbiB8PSBGTTAwIHwgTk9QX0xFRlQ7CQkvKiByaWdodCBjb250YWluZXIgKi8KLSAgICAgIGVsc2UKLQlpbnNuID0gRk0wMCB8IChpbnNuIDw8IDMyKSB8IE5PUF9SSUdIVDsJLyogbGVmdCBjb250YWluZXIgKi8KLSAgICB9Ci0KLSAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDgpOwotCi0gIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotICAgIHsKLSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCXsgCi0JICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICB3aGVyZSwgCi0JCSAgICAgICBmeC0+Zml4W2ldLnNpemUsCi0JCSAgICAgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJICAgICAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCSAgICAgICBmeC0+Zml4W2ldLnJlbG9jKTsKLQl9Ci0gICAgfQotICBmeC0+ZmMgPSAwOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGlmIHBvc3NpYmxlLgotICAgUmV0dXJuIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgbm90IHdyaXR0ZW4gb3V0LiAgKi8KLXN0YXRpYyBpbnQKLXdyaXRlXzJfc2hvcnQgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlLCBmeCkgCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTEsICpvcGNvZGUyOwotICAgICBsb25nIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBleGVjX3R5cGVfZW51bSBleGVjX3R5cGU7Ci0gICAgIEZpeHVwcyAqZng7Ci17Ci0gIGxvbmcgbG9uZyBpbnNuID0gTk9QMjsKLSAgY2hhciAqZjsKLSAgaW50IGksaiwgd2hlcmU7Ci0KLSAgaWYgKGV4ZWNfdHlwZSA9PSBFWEVDX1NFUQotICAgICAgJiYgKG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgKEZMQUdfSk1QIHwgRkxBR19KU1IpKQotICAgICAgJiYgKChvcGNvZGUxLT5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfREVMQVkpID09IDApCi0gICAgICAmJiAoKG9wY29kZTEtPmVjYyA9PSBFQ0NfQUwpIHx8ICEgT3B0aW1pemluZykpCi0gICAgewotICAgICAgLyogVW5jb25kaXRpb25hbCwgbm9uLWRlbGF5ZWQgYnJhbmNoZXMga2lsbCBpbnN0cnVjdGlvbnMgaW4KLQkgdGhlIHJpZ2h0IGJpbi4gIENvbmRpdGlvbmFsIGJyYW5jaGVzIGRvbid0IGFsd2F5cyBidXQgaWYKLQkgd2UgYXJlIG5vdCBvcHRpbWl6aW5nLCB0aGVuIHdlIGhhdmUgYmVlbiBhc2tlZCB0byBwcm9kdWNlCi0JIGFuIGVycm9yIGFib3V0IHN1Y2ggY29uc3RydWN0cy4gIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcwotCSB0ZXN0LCBzdWJyb3V0aW5lIGNhbGxzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGJyYW5jaGVzLiAgKi8KLSAgICAgIHdyaXRlXzFfc2hvcnQgKG9wY29kZTEsIGluc24xLCBmeC0+bmV4dCwgZmFsc2UpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAKLSAgLyogTm90ZTogd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc3Vicm91dGluZSBjYWxscyBvY2N1cmluZwotICAgICBpbiB0aGUgcmlnaHQgaGFuZCBjb250YWluZXIuICBUaGUgcmV0dXJuIGFkZHJlc3MgaXMgYWx3YXlzCi0gICAgIGFsaWduZWQgdG8gdGhlIG5leHQgNjQgYml0IGJvdW5kYXJ5LCBiZSB0aGF0IDY0IG9yIDMyIGJpdCBhd2F5LiAgKi8KLSAgCi0gIHN3aXRjaCAoZXhlY190eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBFWEVDX1VOS05PV046CS8qIE9yZGVyIG5vdCBzcGVjaWZpZWQuICovCi0gICAgICBpZiAoT3B0aW1pemluZwotCSAgJiYgcGFyYWxsZWxfb2sgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlKQotCSAgJiYgISAoICAgKG9wY29kZTEtPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VCi0JCSB8fCBvcGNvZGUxLT5vcC0+dW5pdCA9PSBNVSkKLQkJJiYKLQkJKCAgIG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VCi0JCSB8fCBvcGNvZGUyLT5vcC0+dW5pdCA9PSBNVSkpKQotCXsKLQkgIC8qIHBhcmFsbGVsICovCi0JICBleGVjX3R5cGUgPSBFWEVDX1BBUkFMTEVMOwotCSAgCi0JICBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gSVUKLQkgICAgICB8fCBvcGNvZGUyLT5vcC0+dW5pdCA9PSBNVQotCSAgICAgIHx8IG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCSAgICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAzMikgfCBpbnNuMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc24gPSBGTTAwIHwgKGluc24xIDw8IDMyKSB8IGluc24yOyAgCi0JICAgICAgZnggPSBmeC0+bmV4dDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChvcGNvZGUxLT5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX0pNUCB8IEZMQUdfSlNSKQotCQkmJiAoKG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgRkxBR19ERUxBWSkgPT0gMCkKLQkJJiYgKChvcGNvZGUxLT5lY2MgPT0gRUNDX0FMKSB8fCAhIE9wdGltaXppbmcpKQotCSAgICAgICB8fCBvcGNvZGUxLT5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfUlApCi0JewotCSAgLyogV2UgbXVzdCBlbWl0IChub24tZGVsYXllZCkgYnJhbmNoIHR5cGUgaW5zdHJ1Y3Rpb25zCi0JICAgICBvbiB0aGVpciBvd24gd2l0aCBub3RoaW5nIGluIHRoZSByaWdodCBjb250YWluZXIuICAqLwotCSAgLyogV2UgbXVzdCB0cmVhdCByZXBlYXQgaW5zdHJ1Y3Rpb25zIGxpa2V3aXNlLCBzaW5jZSB0aGUKLQkgICAgIGZvbGxvd2luZyBpbnN0cnVjdGlvbiBoYXMgdG8gYmUgc2VwYXJhdGUgZnJvbSB0aGUgcmVwZWF0Ci0JICAgICBpbiBvcmRlciB0byBiZSByZXBlYXRlZC4gICovCi0JICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQsIGZhbHNlKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZXZfbGVmdF9raWxsc19yaWdodF9wKQotCXsKLQkgIC8qIFRoZSBsZWZ0IGluc3RydWN0aW9uIGtpbHMgdGhlIHJpZ2h0IHNsb3QsIHNvIHdlCi0JICAgICBtdXN0IGxlYXZlIGl0IGVtcHR5LiAgKi8KLQkgIHdyaXRlXzFfc2hvcnQgKG9wY29kZTEsIGluc24xLCBmeC0+bmV4dCwgZmFsc2UpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gSVUKLQkgICAgICAgfHwgKG9wY29kZTEtPm9wLT51bml0ID09IEVJVEhFUgotCQkgICAmJiBvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkpCi0JewotCSAgLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCi0JICBpbnNuID0gRk0xMCB8IChpbnNuMiA8PCAzMikgfCBpbnNuMTsKLQkgIGV4ZWNfdHlwZSA9IEVYRUNfUkVWU0VROwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzZXF1ZW50aWFsICovCi0JICBpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsKLQkgIGZ4ID0gZngtPm5leHQ7Ci0JICBleGVjX3R5cGUgPSBFWEVDX1NFUTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVhFQ19QQVJBTExFTDoJLyogcGFyYWxsZWwgKi8KLSAgICAgIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IGZsYWdfeHBfc3RhdGU7Ci0gICAgICBpZiAoISBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpKQotCWFzX2JhZCAoXygiSW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gICAgICBlbHNlIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVSkKLQl7Ci0JICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gSVUpCi0JICAgIGFzX2JhZCAoXygiVHdvIElVIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotCSAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7Ci0gCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gTVUpCi0JewotCSAgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IE1VKQotCSAgICBhc19iYWQgKF8oIlR3byBNVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKLQkgIGVsc2UgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCSAgICBhc193YXJuIChfKCJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIiksIG9wY29kZTEtPm9wLT5uYW1lKTsKLQkgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQkgICAgYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUyLT5vcC0+bmFtZSk7Ci0JICAKLQkgIGluc24gPSBGTTAwIHwgKGluc24xIDw8IDMyKSB8IGluc24yOyAgCi0JICBmeCA9IGZ4LT5uZXh0OwotCX0KLSAgICAgIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVhFQ19TRVE6CS8qIHNlcXVlbnRpYWwgKi8KLSAgICAgIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVSkKLQlhc19iYWQgKF8oIklVIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIGxlZnQgY29udGFpbmVyIikpOwotICAgICAgaWYgKHByZXZfbGVmdF9raWxsc19yaWdodF9wKQotCWFzX2JhZCAoXygic3BlY2lhbCBsZWZ0IGluc3RydWN0aW9uIGAlcycga2lsbHMgaW5zdHJ1Y3Rpb24gIgotCQkgICAiYCVzJyBpbiByaWdodCBjb250YWluZXIiKSwKLQkJIG9wY29kZTEtPm9wLT5uYW1lLCBvcGNvZGUyLT5vcC0+bmFtZSk7Ci0gICAgICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUyLT5vcC0+bmFtZSk7Ci0gICAgICBpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFWEVDX1JFVlNFUToJLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCi0gICAgICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gTVUpCi0JYXNfYmFkIChfKCJNVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSByaWdodCBjb250YWluZXIiKSk7Ci0gICAgICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUyLT5vcC0+bmFtZSk7Ci0gICAgICBpbnNuID0gRk0xMCB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIGV4ZWN1dGlvbiB0eXBlIHBhc3NlZCB0byB3cml0ZV8yX3Nob3J0KCkiKSk7Ci0gICAgfQotCi0gIC8qICBwcmludGYgKCJ3cml0aW5nIG91dCAlbGx4XG4iLGluc24pOyAqLwotICBmID0gZnJhZ19tb3JlICg4KTsKLSAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDgpOwotCi0gIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYSAzMi1iaXQgbXVsdGlwbHkgYnV0IGl0IGlzIHB1dCBpbnRvIGEKLSAgICAgcGFyYWxsZWwgY29udGFpbmVyLCBtYXJrIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGFzIGJlaW5nIGEgMzItYml0Ci0gICAgIG11bHRpcGx5LiAgKi8KLSAgaWYgKHByZXZfbXVsMzJfcCAmJiBleGVjX3R5cGUgPT0gRVhFQ19QQVJBTExFTCkKLSAgICBjdXJfbXVsMzJfcCA9IDE7Ci0KLSAgZm9yIChqPTA7IGo8MjsgaisrKSAKLSAgICB7Ci0gICAgICBmb3IgKGk9MDsgaSA8IGZ4LT5mYzsgaSsrKSAKLQl7Ci0JICBpZiAoZngtPmZpeFtpXS5yZWxvYykKLQkgICAgewotCSAgICAgIHdoZXJlID0gKGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkgKyA0Kmo7Ci0KLQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgICB3aGVyZSwgCi0JCQkgICBmeC0+Zml4W2ldLnNpemUsCi0JCQkgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJCSAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCQkgICBmeC0+Zml4W2ldLnJlbG9jKTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgZngtPmZjID0gMDsKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogQ2hlY2sgMiBpbnN0cnVjdGlvbnMgYW5kIGRldGVybWluZSBpZiB0aGV5IGNhbiBiZSBzYWZlbHkgKi8KLS8qIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgUmV0dXJucyAxIGlmIHRoZXkgY2FuIGJlLiAgICAgICAgICovCi1zdGF0aWMgaW50Ci1wYXJhbGxlbF9vayAob3AxLCBpbnNuMSwgb3AyLCBpbnNuMiwgZXhlY190eXBlKQotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcDEsICpvcDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBleGVjX3R5cGVfZW51bSBleGVjX3R5cGU7Ci17Ci0gIGludCBpLCBqLCBzaGlmdCwgcmVnbm8sIGJpdHMsIGVjYzsKLSAgdW5zaWduZWQgbG9uZyBmbGFncywgbWFzaywgZmxhZ3Nfc2V0MSwgZmxhZ3Nfc2V0MiwgZmxhZ3NfdXNlZDEsIGZsYWdzX3VzZWQyOwotICB1bnNpZ25lZCBsb25nIGlucywgbW9kX3JlZ1syXVszXSwgdXNlZF9yZWdbMl1bM10sIGZsYWdfcmVnWzJdOwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmY7Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqb3A7Ci0KLSAgLyogc2VjdGlvbiA0LjM6IGJvdGggaW5zdHJ1Y3Rpb25zIG11c3Qgbm90IGJlIElVIG9yIE1VIG9ubHkgKi8KLSAgaWYgKChvcDEtPm9wLT51bml0ID09IElVICYmIG9wMi0+b3AtPnVuaXQgPT0gSVUpCi0gICAgICB8fCAob3AxLT5vcC0+dW5pdCA9PSBNVSAmJiBvcDItPm9wLT51bml0ID09IE1VKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBmaXJzdCBpbnN0cnVjdGlvbiBtdXN0IG5vdCBiZSBhIGp1bXAgdG8gc2FmZWx5IG9wdGltaXplLCB1bmxlc3MgdGhpcwotICAgICBpcyBhbiBleHBsaWNpdCBwYXJhbGxlbCBvcGVyYXRpb24uICAqLwotICBpZiAoZXhlY190eXBlICE9IEVYRUNfUEFSQUxMRUwKLSAgICAgICYmIChvcDEtPm9wLT5mbGFnc191c2VkICYgKEZMQUdfSk1QIHwgRkxBR19KU1IpKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBJZiBvbmUgaW5zdHJ1Y3Rpb24gaXMgL1RYIG9yIC9YVCBhbmQgdGhlIG90aGVyIGlzIC9GWCBvciAvWEYgcmVzcGVjdGl2ZWx5LAotICAgICB0aGVuIGl0IGlzIHNhZmUgdG8gYWxsb3cgdGhlIHR3byB0byBiZSBkb25lIGFzIHBhcmFsbGVsIG9wcywgc2luY2Ugb25seQotICAgICBvbmUgd2lsbCBldmVyIGJlIGV4ZWN1dGVkIGF0IGEgdGltZS4gICovCi0gIGlmICgob3AxLT5lY2MgPT0gRUNDX1RYICYmIG9wMi0+ZWNjID09IEVDQ19GWCkKLSAgICAgIHx8IChvcDEtPmVjYyA9PSBFQ0NfRlggJiYgb3AyLT5lY2MgPT0gRUNDX1RYKQotICAgICAgfHwgKG9wMS0+ZWNjID09IEVDQ19YVCAmJiBvcDItPmVjYyA9PSBFQ0NfWEYpCi0gICAgICB8fCAob3AxLT5lY2MgPT0gRUNDX1hGICYmIG9wMi0+ZWNjID09IEVDQ19YVCkpCi0gICAgIHJldHVybiAxOwotCi0gIC8qIFswXSByMC1yMzEKLSAgICAgWzFdIHIzMi1yNjMKLSAgICAgWzJdIGEwLCBhMSwgZmxhZyByZWdpc3RlcnMgKi8KLQotICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgIHsKLSAgICAgIGlmIChqID09IDApCi0JewotCSAgZiA9IG9wMS0+Zm9ybTsKLQkgIG9wID0gb3AxLT5vcDsKLQkgIGVjYyA9IG9wMS0+ZWNjOwotCSAgaW5zID0gaW5zbjE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGYgPSBvcDItPmZvcm07Ci0JICBvcCA9IG9wMi0+b3A7Ci0JICBlY2MgPSBvcDItPmVjYzsKLQkgIGlucyA9IGluc24yOwotCX0KLSAgICAgIGZsYWdfcmVnW2pdID0gMDsKLSAgICAgIG1vZF9yZWdbal1bMF0gPSBtb2RfcmVnW2pdWzFdID0gMDsKLSAgICAgIHVzZWRfcmVnW2pdWzBdID0gdXNlZF9yZWdbal1bMV0gPSAwOwotCi0gICAgICBpZiAoZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsKQotCXsKLQkgIC8qIEZvciBodW1hbiBzcGVjaWZpZWQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIHdlIGhhdmUgYmVlbiBhc2tlZAotCSAgICAgdG8gaWdub3JlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGJvdGggaW5zdHJ1Y3Rpb25zIGNvdWxkIG1vZGlmeQotCSAgICAgYml0cyBpbiB0aGUgUFNXLCBzbyB3ZSBpbml0aWFsaXNlIHRoZSBtb2QgJiB1c2VkIGFycmF5cyB0byAwLgotCSAgICAgV2UgaGF2ZSBiZWVuIGFza2VkLCBob3dldmVyLCB0byByZWZ1c2UgdG8gYWxsb3cgcGFyYWxsZWwKLQkgICAgIGluc3RydWN0aW9ucyB3aGljaCBleHBsaWNpdGx5IHNldCB0aGUgc2FtZSBmbGFnIHJlZ2lzdGVyLAotCSAgICAgZWcgImNtcG5lIGYwLHIxLDB4MTAgfHwgY21wZXEgZjAsIHI1LCAweDIiLCBzbyBmdXJ0aGVyIG9uIHdlIHRlc3QKLQkgICAgIGZvciB0aGUgdXNlIG9mIGEgZmxhZyByZWdpc3RlciBhbmQgc2V0IGEgYml0IGluIHRoZSBtb2Qgb3IgdXNlZAotCSAgICAgYXJyYXkgYXBwcm9wcmlhdGVseS4gICovCi0JICAgICAKLQkgIG1vZF9yZWdbal1bMl0gID0gMDsKLQkgIHVzZWRfcmVnW2pdWzJdID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbW9kX3JlZ1tqXVsyXSA9IChvcC0+ZmxhZ3Nfc2V0ICYgRkxBR19BTEwpOwotCSAgdXNlZF9yZWdbal1bMl0gPSAob3AtPmZsYWdzX3VzZWQgJiBGTEFHX0FMTCk7Ci0JfQotICAgICAgCi0gICAgICAvKiBCU1IvSlNSIGFsd2F5cyBzZXRzIFI2MiAqLwotICAgICAgaWYgKG9wLT5mbGFnc191c2VkICYgRkxBR19KU1IpCi0JbW9kX3JlZ1tqXVsxXSA9ICgxTCA8PCAoNjItMzIpKTsKLQotICAgICAgLyogY29uZGl0aW9uYWwgZXhlY3V0aW9uIGFmZmVjdHMgdGhlIGZsYWdzX3VzZWQgKi8KLSAgICAgIHN3aXRjaCAoZWNjKQotCXsKLQljYXNlIEVDQ19UWDoKLQljYXNlIEVDQ19GWDoKLQkgIHVzZWRfcmVnW2pdWzJdIHw9IGZsYWdfcmVnW2pdID0gRkxBR18wOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVDQ19YVDoKLQljYXNlIEVDQ19YRjoKLQkgIHVzZWRfcmVnW2pdWzJdIHw9IGZsYWdfcmVnW2pdID0gRkxBR18xOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVDQ19UVDoKLQljYXNlIEVDQ19URjoKLQkgIHVzZWRfcmVnW2pdWzJdIHw9IGZsYWdfcmVnW2pdID0gKEZMQUdfMCB8IEZMQUdfMSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGZvciAoaSA9IDA7IGYtPm9wZXJhbmRzW2ldOyBpKyspCi0JewotCSAgZmxhZ3MgPSBkMzB2X29wZXJhbmRfdGFibGVbZi0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgc2hpZnQgPSAxMiAtIGQzMHZfb3BlcmFuZF90YWJsZVtmLT5vcGVyYW5kc1tpXV0ucG9zaXRpb247Ci0JICBiaXRzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ldXS5iaXRzOwotCSAgaWYgKGJpdHMgPT0gMzIpCi0JICAgIG1hc2sgPSAweGZmZmZmZmZmOwotCSAgZWxzZQotCSAgICBtYXNrID0gMHg3RkZGRkZGRiA+PiAoMzEgLSBiaXRzKTsKLQotCSAgaWYgKChmbGFncyAmIE9QRVJBTkRfUExVUykgfHwgKGZsYWdzICYgT1BFUkFORF9NSU5VUykpCi0JICAgIHsKLQkgICAgICAvKiB0aGlzIGlzIGEgcG9zdC1pbmNyZW1lbnQgb3IgcG9zdC1kZWNyZW1lbnQgKi8KLQkgICAgICAvKiB0aGUgcHJldmlvdXMgcmVnaXN0ZXIgbmVlZHMgdG8gYmUgbWFya2VkIGFzIG1vZGlmaWVkICovCi0KLQkgICAgICBzaGlmdCA9IDEyIC0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ktMV1dLnBvc2l0aW9uOwotCSAgICAgIHJlZ25vID0gKGlucyA+PiBzaGlmdCkgJiAweDNmOwotCSAgICAgIGlmIChyZWdubyA+PSAzMikKLQkJbW9kX3JlZ1tqXVsxXSB8PSAxTCA8PCAocmVnbm8gLSAzMik7Ci0JICAgICAgZWxzZQotCQltb2RfcmVnW2pdWzBdIHw9IDFMIDw8IHJlZ25vOwotCSAgICB9Ci0JICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCSAgICB7Ci0JICAgICAgcmVnbm8gPSAoaW5zID4+IHNoaWZ0KSAmIG1hc2s7Ci0JICAgICAgLyogdGhlIG1lbW9yeSB3cml0ZSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0JICAgICAgaWYgKChmbGFncyAmIE9QRVJBTkRfREVTVCkgJiYgIShvcC0+ZmxhZ3Nfc2V0ICYgRkxBR19NRU0pKQotCQl7Ci0JCSAgLyogTU9ESUZJRUQgcmVnaXN0ZXJzIGFuZCBmbGFncyAqLwotCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQUNDKQotCQkgICAgewotCQkgICAgICBpZiAocmVnbm8gPT0gMCkKLQkJCW1vZF9yZWdbal1bMl0gfD0gRkxBR19BMDsKLQkJICAgICAgZWxzZSBpZiAocmVnbm8gPT0gMSkKLQkJCW1vZF9yZWdbal1bMl0gfD0gRkxBR19BMTsKLQkJICAgICAgZWxzZQotCQkJYWJvcnQgKCk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCi0JCSAgICBtb2RfcmVnW2pdWzJdIHw9IDFMIDw8IHJlZ25vOwotCQkgIGVsc2UgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpKQotCQkgICAgewotCQkgICAgICBpbnQgciwgejsKLQotCQkgICAgICAvKiBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSB0d28gZGVzdGluYXRpb24gKi8KLQkJICAgICAgLyogcmVnaXN0ZXJzLCBmb3IgZXhhbXBsZSBsZDJ3ICovCi0JCSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfMlJFRykKLQkJCXogPSAxOwotCQkgICAgICBlbHNlCi0JCQl6ID0gMDsKLQotCQkgICAgICBmb3IgKHIgPSByZWdubzsgciA8PSByZWdubyArIHo7IHIrKykKLQkJCXsgCi0JCQkgIGlmIChyID49IDMyKQotCQkJICAgIG1vZF9yZWdbal1bMV0gfD0gMUwgPDwgKHIgLSAzMik7Ci0JCQkgIGVsc2UKLQkJCSAgICBtb2RfcmVnW2pdWzBdIHw9IDFMIDw8IHI7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBVU0VELCBidXQgbm90IG1vZGlmaWVkIHJlZ2lzdGVycyBhbmQgZmxhZ3MgKi8KLQkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FDQykKLQkJICAgIHsKLQkJICAgICAgaWYgKHJlZ25vID09IDApCi0JCQl1c2VkX3JlZ1tqXVsyXSB8PSBGTEFHX0EwOwotCQkgICAgICBlbHNlIGlmIChyZWdubyA9PSAxKQotCQkJdXNlZF9yZWdbal1bMl0gfD0gRkxBR19BMTsKLQkJICAgICAgZWxzZQotCQkJYWJvcnQgKCk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCi0JCSAgICB1c2VkX3JlZ1tqXVsyXSB8PSAxTCA8PCByZWdubzsKLQkJICBlbHNlIGlmICghKGZsYWdzICYgT1BFUkFORF9DT05UUk9MKSkKLQkJICAgIHsKLQkJICAgICAgaW50IHIsIHo7Ci0KLQkJICAgICAgLyogbmVlZCB0byBjaGVjayBpZiB0aGVyZSBhcmUgdHdvIHNvdXJjZSAqLwotCQkgICAgICAvKiByZWdpc3RlcnMsIGZvciBleGFtcGxlIHN0MncgKi8KLQkJICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF8yUkVHKQotCQkJeiA9IDE7Ci0JCSAgICAgIGVsc2UKLQkJCXogPSAwOwotCi0JCSAgICAgIGZvciAociA9IHJlZ25vOyByIDw9IHJlZ25vICsgejsgcisrKQotCQkJeyAKLQkJCSAgaWYgKHIgPj0gMzIpCi0JCQkgICAgdXNlZF9yZWdbal1bMV0gfD0gMUwgPDwgKHIgLSAzMik7Ci0JCQkgIGVsc2UKLQkJCSAgICB1c2VkX3JlZ1tqXVswXSB8PSAxTCA8PCByOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgZmxhZ3Nfc2V0MSA9IG9wMS0+b3AtPmZsYWdzX3NldDsKLSAgZmxhZ3Nfc2V0MiA9IG9wMi0+b3AtPmZsYWdzX3NldDsKLSAgZmxhZ3NfdXNlZDEgPSBvcDEtPm9wLT5mbGFnc191c2VkOwotICBmbGFnc191c2VkMiA9IG9wMi0+b3AtPmZsYWdzX3VzZWQ7Ci0KLSAgLyogQ2hlY2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIHdpdGggQUREcHBwL1NVQnBwcC4gICovCi0gIGlmICgoKGZsYWdzX3NldDEgJiBGTEFHX05PVF9XSVRIX0FERFNVQnBwcCkgIT0gMAotICAgICAgICYmIChmbGFnc191c2VkMiAmIEZMQUdfQUREU1VCcHBwKSAhPSAwKQotICAgICAgfHwgKChmbGFnc19zZXQyICYgRkxBR19OT1RfV0lUSF9BRERTVUJwcHApICE9IDAKLQkgICYmIChmbGFnc191c2VkMSAmIEZMQUdfQUREU1VCcHBwKSAhPSAwKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBMb2FkIGluc3RydWN0aW9uIGNvbWJpbmVkIHdpdGggaGFsZi13b3JkIG11bHRpcGx5IGlzIGlsbGVnYWwuICAqLwotICBpZiAoKChmbGFnc191c2VkMSAmIEZMQUdfTUVNKSAhPSAwICYmIChmbGFnc191c2VkMiAmIEZMQUdfTVVMMTYpKQotICAgICAgfHwgKChmbGFnc191c2VkMiAmIEZMQUdfTUVNKSAhPSAwICYmIChmbGFnc191c2VkMSAmIEZMQUdfTVVMMTYpKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTcGVjaWZpY2FsbHkgYWxsb3cgYWRkIHx8IGFkZCBieSByZW1vdmluZyBjYXJyeSwgb3ZlcmZsb3cgYml0cyBkZXBlbmRlbmN5LgotICAgICBUaGlzIGlzIHNhZmUsIGV2ZW4gaWYgYW4gYWRkYyBmb2xsb3dzIHNpbmNlIHRoZSBJVSB0YWtlcyB0aGUgYXJndW1lbnQgaW4KLSAgICAgdGhlIHJpZ2h0IGNvbnRhaW5lciwgYW5kIGl0IHdyaXRlcyBpdHMgcmVzdWx0cyBsYXN0LgotICAgICBIb3dldmVyLCBkb24ndCBwYXJhbGVsbGl6ZSBhZGQgZm9sbG93ZWQgYnkgYWRkYyBvciBzdWIgZm9sbG93ZWQgYnkKLSAgICAgc3ViYi4gICovCi0KLSAgaWYgKG1vZF9yZWdbMF1bMl0gPT0gRkxBR19DVlZBICYmIG1vZF9yZWdbMV1bMl0gPT0gRkxBR19DVlZBCi0gICAgICAmJiAodXNlZF9yZWdbMF1bMl0gJiB+ZmxhZ19yZWdbMF0pID09IDAKLSAgICAgICYmICh1c2VkX3JlZ1sxXVsyXSAmIH5mbGFnX3JlZ1sxXSkgPT0gMAotICAgICAgJiYgb3AxLT5vcC0+dW5pdCA9PSBFSVRIRVIgJiYgb3AyLT5vcC0+dW5pdCA9PSBFSVRIRVIpCi0gICAgewotICAgICAgbW9kX3JlZ1swXVsyXSA9IG1vZF9yZWdbMV1bMl0gPSAwOwotICAgIH0KLQotICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gZGVwZW5kcyBvbiB0aGUgZmlyc3QsIHdlIG9idmlvdXNseQotCSBjYW5ub3QgcGFyYWxsZWxpemUuICBOb3RlLCB0aGUgbW9kIGZsYWcgaW1wbGllcyB1c2UsIHNvCi0JIGNoZWNrIHRoYXQgYXMgd2VsbC4gICovCi0gICAgICAvKiBJZiBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgaXMgc2V0LCB0aGVuIHRoZSBjYXNlIG9mIHRoZSAKLQkgc2Vjb25kIGluc3RydWN0aW9uIHVzaW5nIGEgcmVnaXN0ZXIgdGhlIGZpcnN0IGluc3RydWN0aW9uCi0JIG1vZGlmaWVzIGlzIGFzc3VtZWQgdG8gYmUgb2theTsgd2UgdHJ1c3QgdGhlIGh1bWFuLiAgV2UKLQkgZG9uJ3QgdHJ1c3QgdGhlIGh1bWFuIGlmIGJvdGggaW5zdHJ1Y3Rpb25zIG1vZGlmeSB0aGUgc2FtZQotCSByZWdpc3RlciBidXQgd2UgZG8gdHJ1c3QgdGhlIGh1bWFuIGlmIHRoZXkgbW9kaWZ5IHRoZSBzYW1lCi0JIGZsYWdzLiAqLwotICAgICAgLyogV2UgaGF2ZSBub3cgYmVlbiByZXF1ZXN0ZWQgbm90IHRvIHRydXN0IHRoZSBodW1hbiBpZiB0aGUKLQkgaW5zdHJ1Y3Rpb25zIG1vZGlmeSB0aGUgc2FtZSBmbGFnIHJlZ2lzdGVycyBlaXRoZXIuICAqLwotICAgICAgaWYgKGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCkKLQl7Ci0JICBpZiAoKG1vZF9yZWdbMF1bal0gJiBtb2RfcmVnWzFdW2pdKSAhPSAwKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIGlmICgobW9kX3JlZ1swXVtqXSAmIChtb2RfcmVnWzFdW2pdIHwgdXNlZF9yZWdbMV1bal0pKSAhPSAwKQotCSAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLS8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBzdHIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUtZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyAKLSAgIGl0IGFzc2VtYmxlcyB0by4gIEZvciB0aGUgRDMwViwgaXQgbW9zdGx5IGhhbmRsZXMgdGhlIHNwZWNpYWwgVkxJVyBwYXJzaW5nIGFuZCBwYWNraW5nCi0gICBhbmQgbGVhdmVzIHRoZSBkaWZmaWN1bHQgc3R1ZmYgdG8gZG9fYXNzZW1ibGUoKS4gICovCi0KLXN0YXRpYyBsb25nIGxvbmcgcHJldl9pbnNuID0gLTE7Ci1zdGF0aWMgc3RydWN0IGQzMHZfaW5zbiBwcmV2X29wY29kZTsKLXN0YXRpYyBzdWJzZWdUIHByZXZfc3Vic2VnOwotc3RhdGljIHNlZ1QgcHJldl9zZWcgPSAwOwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHN0cnVjdCBkMzB2X2luc24gb3Bjb2RlOwotICBsb25nIGxvbmcgaW5zbjsKLSAgZXhlY190eXBlX2VudW0gZXh0eXBlID0gRVhFQ19VTktOT1dOOwkJLyogZXhlY3V0aW9uIHR5cGU7IHBhcmFsbGVsLCBldGMgKi8KLSAgc3RhdGljIGV4ZWNfdHlwZV9lbnVtIGV0eXBlID0gRVhFQ19VTktOT1dOOwkvKiBzYXZlZCBleHR5cGUuICB1c2VkIGZvciBtdWx0aWxpbmUgaW5zdHJ1Y3Rpb25zICovCi0gIGNoYXIgKnN0cjI7Ci0KLSAgaWYgKChwcmV2X2luc24gIT0gLTEpICYmIHByZXZfc2VnCi0gICAgICAgJiYgKChwcmV2X3NlZyAhPSBub3dfc2VnKSB8fCAocHJldl9zdWJzZWcgIT0gbm93X3N1YnNlZykpKQotICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCi0gIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPCAzKQotICAgIGQzMHZfYWxpZ24gKDMsIE5VTEwsIGQzMHZfbGFzdF9sYWJlbCk7Ci0gIGVsc2UgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA+IDMpCi0gICAgZDMwdl9jdXJyZW50X2FsaWduID0gMzsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLQotICBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgPSAwOwotICBmbGFnX3hwX3N0YXRlID0gMDsKLSAgaWYgKGV0eXBlID09IEVYRUNfVU5LTk9XTikKLSAgICB7Ci0gICAgICAvKiBsb29rIGZvciB0aGUgc3BlY2lhbCBtdWx0aXBsZSBpbnN0cnVjdGlvbiBzZXBhcmF0b3JzICovCi0gICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICJ8fCIpOwotICAgICAgaWYgKHN0cjIpIAotCXsKLQkgIGV4dHlwZSA9IEVYRUNfUEFSQUxMRUw7Ci0JICBmbGFnX3hwX3N0YXRlID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RyMiA9IHN0cnN0ciAoc3RyLCAiLT4iKTsKLQkgIGlmIChzdHIyKSAKLQkgICAgZXh0eXBlID0gRVhFQ19TRVE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICI8LSIpOwotCSAgICAgIGlmIChzdHIyKSAKLQkJZXh0eXBlID0gRVhFQ19SRVZTRVE7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBzdHIyIHBvaW50cyB0byB0aGUgc2VwYXJhdG9yLCBpZiBvbmUgKi8KLSAgICAgIGlmIChzdHIyKSAKLQl7Ci0JICAqc3RyMiA9IDA7Ci0JICAKLQkgIC8qIGlmIHR3byBpbnN0cnVjdGlvbnMgYXJlIHByZXNlbnQgYW5kIHdlIGFscmVhZHkgaGF2ZSBvbmUgc2F2ZWQKLQkgICAgIHRoZW4gZmlyc3Qgd3JpdGUgaXQgb3V0ICovCi0JICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQkgIAotCSAgLyogQXNzZW1ibGUgZmlyc3QgaW5zdHJ1Y3Rpb24gYW5kIHNhdmUgaXQuICAqLwotCSAgcHJldl9pbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJnByZXZfb3Bjb2RlLCAxLCAwKTsKLQkgIGlmIChwcmV2X2luc24gPT0gLTEpCi0JICAgIGFzX2JhZCAoXygiQ2Fubm90IGFzc2VtYmxlIGluc3RydWN0aW9uIikpOwotCSAgaWYgKHByZXZfb3Bjb2RlLmZvcm0gIT0gTlVMTCAmJiBwcmV2X29wY29kZS5mb3JtLT5mb3JtID49IExPTkcpCi0JICAgIGFzX2JhZCAoXygiRmlyc3Qgb3Bjb2RlIGlzIGxvbmcuICBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQuIikpOyAKLQkgIGZpeHVwcyA9IGZpeHVwcy0+bmV4dDsKLQkgIHN0ciA9IHN0cjIgKyAyOwotCSAgcHJldl9zZWcgPSBub3dfc2VnOwotCSAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotCX0KLSAgICB9Ci0KLSAgaW5zbiA9IGRvX2Fzc2VtYmxlIChzdHIsICZvcGNvZGUsCi0JCSAgICAgIChleHR5cGUgIT0gRVhFQ19VTktOT1dOIHx8IGV0eXBlICE9IEVYRUNfVU5LTk9XTiksCi0JCSAgICAgIGV4dHlwZSA9PSBFWEVDX1BBUkFMTEVMKTsKLSAgaWYgKGluc24gPT0gLTEpCi0gICAgewotICAgICAgaWYgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04pCi0JZXR5cGUgPSBleHR5cGU7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCBhc3NlbWJsZSBpbnN0cnVjdGlvbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGV0eXBlICE9IEVYRUNfVU5LTk9XTikKLSAgICB7Ci0gICAgICBleHR5cGUgPSBldHlwZTsKLSAgICAgIGV0eXBlID0gRVhFQ19VTktOT1dOOwotICAgIH0KLQotICAvKiBXb3JkIG11bHRpcGx5IGluc3RydWN0aW9ucyBtdXN0IG5vdCBiZSBmb2xsb3dlZCBieSBlaXRoZXIgYSBsb2FkIG9yIGEKLSAgICAgMTYtYml0IG11bHRpcGx5IGluc3RydWN0aW9uIGluIHRoZSBuZXh0IGN5Y2xlLiAgKi8KLSAgaWYgKCAgIChleHR5cGUgIT0gRVhFQ19SRVZTRVEpCi0gICAgICAmJiBwcmV2X211bDMyX3AKLSAgICAgICYmIChvcGNvZGUub3AtPmZsYWdzX3VzZWQgJiAoRkxBR19NRU0gfCBGTEFHX01VTDE2KSkpCi0gICAgewotICAgICAgLyogSG93ZXZlciwgbG9hZCBhbmQgbXVsdGlwbHkgc2hvdWxkIGFibGUgdG8gYmUgY29tYmluZWQgaW4gYSBwYXJhbGxlbAotCSBvcGVyYXRpb24sIHNvIGNoZWNrIGZvciB0aGF0IGZpcnN0LiAgKi8KLSAgICAgIGlmIChwcmV2X2luc24gIT0gLTEKLQkgICYmIChvcGNvZGUub3AtPmZsYWdzX3VzZWQgJiBGTEFHX01FTSkKLQkgICYmIG9wY29kZS5mb3JtLT5mb3JtIDwgTE9ORwotCSAgJiYgKGV4dHlwZSA9PSBFWEVDX1BBUkFMTEVMIHx8IChPcHRpbWl6aW5nICYmIGV4dHlwZSA9PSBFWEVDX1VOS05PV04pKQotCSAgJiYgcGFyYWxsZWxfb2sgKCZwcmV2X29wY29kZSwgKGxvbmcpcHJldl9pbnNuLAotCQkJICAmb3Bjb2RlLCAobG9uZylpbnNuLCBleHR5cGUpCi0JICAmJiB3cml0ZV8yX3Nob3J0ICgmcHJldl9vcGNvZGUsIChsb25nKXByZXZfaW5zbiwKLQkJCSAgICAmb3Bjb2RlLCAobG9uZylpbnNuLCBleHR5cGUsIGZpeHVwcykgPT0gMCkKLQl7Ci0JICAvKiBubyBpbnN0cnVjdGlvbnMgc2F2ZWQgKi8KLQkgIHByZXZfaW5zbiA9IC0xOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYW4ndCBwYXJhbGxlbGl6ZSwgZmx1c2ggcHJldmlvdXMgaW5zdHJ1Y3Rpb24gYW5kIGVtaXQgYSB3b3JkIG9mIE5PUFMsCi0JICAgICB1bmxlc3MgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgTk9QLCBpbiB3aGljaCBjYXNlIGp1c3QgZmx1c2ggaXQsCi0JICAgICBhcyB0aGlzIHdpbGwgZ2VuZXJhdGUgYSB3b3JkIG9mIE5PUHMgZm9yIHVzLiAgKi8KLQotCSAgaWYgKHByZXZfaW5zbiAhPSAtMSAmJiAoc3RyY21wIChwcmV2X29wY29kZS5vcC0+bmFtZSwgIm5vcCIpID09IDApKQotCSAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKiBmOwotCSAgICAgIAotCSAgICAgIGlmIChwcmV2X2luc24gIT0gLTEpCi0JCWQzMHZfY2xlYW51cCAodHJ1ZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZiA9IGZyYWdfbW9yZSAoOCk7Ci0JCSAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIE5PUDIsIDgpOwotCQkgIAotCQkgIGlmICh3YXJuX25vcHMgPT0gTk9QX0FMTCB8fCB3YXJuX25vcHMgPT0gTk9QX01VTFRJUExZKQotCQkgICAgewotCQkgICAgICBpZiAob3Bjb2RlLm9wLT5mbGFnc191c2VkICYgRkxBR19NRU0pCi0JCQlhc193YXJuIChfKCJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCBsb2FkIikpOwotCQkgICAgICBlbHNlCi0JCQlhc193YXJuIChfKCJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCAxNi1iaXQgbXVsdGlwbHkiKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgCi0JICBleHR5cGUgPSBFWEVDX1VOS05PV047Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoICAgKGV4dHlwZSA9PSBFWEVDX1JFVlNFUSkKLQkgICAmJiBjdXJfbXVsMzJfcAotCSAgICYmIChwcmV2X29wY29kZS5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX01FTSB8IEZMQUdfTVVMMTYpKSkKLSAgICB7Ci0gICAgICAvKiBDYW4ndCBwYXJhbGxlbGl6ZSwgZmx1c2ggY3VycmVudCBpbnN0cnVjdGlvbiBhbmQgYWRkIGEgc2VxdWVudGlhbCBOT1AuICovCi0gICAgICB3cml0ZV8xX3Nob3J0ICgmIG9wY29kZSwgKGxvbmcpIGluc24sIGZpeHVwcy0+bmV4dC0+bmV4dCwgdHJ1ZSk7Ci0gICAgICAKLSAgICAgIC8qIE1ha2UgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHRoZSBjdXJyZW50IG9uZS4gICovCi0gICAgICBleHR5cGUgPSBFWEVDX1VOS05PV047Ci0gICAgICBpbnNuID0gcHJldl9pbnNuOwotICAgICAgbm93X3NlZyA9IHByZXZfc2VnOwotICAgICAgbm93X3N1YnNlZyA9IHByZXZfc3Vic2VnOwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgICBjdXJfbXVsMzJfcCA9IHByZXZfbXVsMzJfcDsKLSAgICAgIHByZXZfbXVsMzJfcCA9IDA7Ci0gICAgICBtZW1jcHkgKCZvcGNvZGUsICZwcmV2X29wY29kZSwgc2l6ZW9mIChwcmV2X29wY29kZSkpOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbG9uZyBpbnN0cnVjdGlvbiwgd3JpdGUgaXQgYW5kIGFueSBwcmV2aW91cyBzaG9ydCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChvcGNvZGUuZm9ybS0+Zm9ybSA+PSBMT05HKSAKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlICE9IEVYRUNfVU5LTk9XTikgCi0JYXNfYmFkIChfKCJJbnN0cnVjdGlvbiB1c2VzIGxvbmcgdmVyc2lvbiwgc28gaXQgY2Fubm90IGJlIG1peGVkIGFzIHNwZWNpZmllZCIpKTsKLSAgICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotICAgICAgd3JpdGVfbG9uZyAoJiBvcGNvZGUsIGluc24sIGZpeHVwcyk7Ci0gICAgICBwcmV2X2luc24gPSAtMTsKLSAgICB9Ci0gIGVsc2UgaWYgKChwcmV2X2luc24gIT0gLTEpCi0JICAgJiYgKHdyaXRlXzJfc2hvcnQKLQkgICAgICAgKCYgcHJldl9vcGNvZGUsIChsb25nKSBwcmV2X2luc24sICYgb3Bjb2RlLAotCQkobG9uZykgaW5zbiwgZXh0eXBlLCBmaXh1cHMpID09IDApKSAKLSAgICB7Ci0gICAgICAvKiBObyBpbnN0cnVjdGlvbnMgc2F2ZWQuICAqLwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04pIAotCWFzX2JhZCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOwotICAgICAgCi0gICAgICAvKiBTYXZlIG9mZiBsYXN0IGluc3RydWN0aW9uIHNvIGl0IG1heSBiZSBwYWNrZWQgb24gbmV4dCBwYXNzLiAgKi8KLSAgICAgIG1lbWNweSAoJnByZXZfb3Bjb2RlLCAmb3Bjb2RlLCBzaXplb2YgKHByZXZfb3Bjb2RlKSk7Ci0gICAgICBwcmV2X2luc24gPSBpbnNuOwotICAgICAgcHJldl9zZWcgPSBub3dfc2VnOwotICAgICAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgZml4dXBzID0gZml4dXBzLT5uZXh0OwotICAgICAgcHJldl9tdWwzMl9wID0gY3VyX211bDMyX3A7Ci0gICAgfQotfQotCi0KLS8qIGRvX2Fzc2VtYmxlIGFzc2VtYmxlcyBhIHNpbmdsZSBpbnN0cnVjdGlvbiBhbmQgcmV0dXJucyBhbiBvcGNvZGUgKi8KLS8qIGl0IHJldHVybnMgLTEgKGFuIGludmFsaWQgb3Bjb2RlKSBvbiBlcnJvciAqLwotCi0jZGVmaW5lIE5BTUVfQlVGX0xFTgkyMAotCi1zdGF0aWMgbG9uZyBsb25nCi1kb19hc3NlbWJsZSAoc3RyLCBvcGNvZGUsIHNob3J0cCwgaXNfcGFyYWxsZWwpIAotICAgICBjaGFyICpzdHI7Ci0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTsKLSAgICAgaW50IHNob3J0cDsKLSAgICAgaW50IGlzX3BhcmFsbGVsOwotewotICB1bnNpZ25lZCBjaGFyICogb3Bfc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKiBzYXZlOwotICB1bnNpZ25lZCBjaGFyICogb3BfZW5kOwotICBjaGFyICAgICAgICAgICAgbmFtZSBbTkFNRV9CVUZfTEVOXTsKLSAgaW50ICAgICAgICAgICAgIGNtcF9oYWNrOwotICBpbnQgICAgICAgICAgICAgbmxlbiA9IDA7Ci0gIGludCAgICAgICAgICAgICBmc2l6ZSA9IChzaG9ydHAgPyBGT1JDRV9TSE9SVCA6IDApOwotICBleHByZXNzaW9uUyAgICAgbXlvcHMgWzZdOwotICBsb25nIGxvbmcgICAgICAgaW5zbjsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKiBzdHIgPT0gJyAnKQotICAgIHN0ciArKzsKLQotICAvKiBmaW5kIHRoZSBvcGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSAodW5zaWduZWQgY2hhciAqKSAoc3RyKTsKLSAgICAgICAqIG9wX2VuZAotICAgICAgICYmIG5sZW4gPCAoTkFNRV9CVUZfTEVOIC0gMSkKLSAgICAgICAmJiAqIG9wX2VuZCAhPSAnLycKLSAgICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgbmFtZVtubGVuXSA9IHRvbG93ZXIgKG9wX3N0YXJ0W25sZW5dKTsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0KLSAgaWYgKG5sZW4gPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgLyogaWYgdGhlcmUgaXMgYW4gZXhlY3V0aW9uIGNvbmRpdGlvbiBjb2RlLCBoYW5kbGUgaXQgKi8KLSAgaWYgKCpvcF9lbmQgPT0gJy8nKQotICAgIHsKLSAgICAgIGludCBpID0gMDsKLSAgICAgIHdoaWxlICggKGkgPCBFQ0NfTUFYKSAmJiBzdHJuY2FzZWNtcCAoZDMwdl9lY2NfbmFtZXNbaV0sIG9wX2VuZCArIDEsIDIpKQotCWkrKzsKLSAgICAgIAotICAgICAgaWYgKGkgPT0gRUNDX01BWCkKLQl7Ci0JICBjaGFyIHRtcFs0XTsKLQkgIHN0cm5jcHkgKHRtcCwgb3BfZW5kICsgMSwgMik7Ci0JICB0bXBbMl0gPSAwOwotCSAgYXNfYmFkIChfKCJ1bmtub3duIGNvbmRpdGlvbiBjb2RlOiAlcyIpLHRtcCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgLyogICAgICBwcmludGYgKCJjb25kaXRpb24gY29kZT0lZFxuIixpKTsgKi8KLSAgICAgIG9wY29kZS0+ZWNjID0gaTsKLSAgICAgIG9wX2VuZCArPSAzOwotICAgIH0KLSAgZWxzZQotICAgIG9wY29kZS0+ZWNjID0gRUNDX0FMOwotICAKLQotICAvKiBDTVAgYW5kIENNUFUgY2hhbmdlIHRoZWlyIG5hbWUgYmFzZWQgb24gY29uZGl0aW9uIGNvZGVzICovCi0gIGlmICghc3RybmNtcCAobmFtZSwgImNtcCIsIDMpKQotICAgIHsKLSAgICAgIGludCBwLGk7Ci0gICAgICBjaGFyICoqc3RyID0gKGNoYXIgKiopZDMwdl9jY19uYW1lczsKLSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKLQlwID0gNDsKLSAgICAgIGVsc2UKLQlwID0gMzsKLQotICAgICAgZm9yIChpPTE7ICpzdHIgJiYgc3RybmNtcCAoKnN0ciwgJiBuYW1lW3BdLCAyKTsgaSsrLCBzdHIrKykKLQk7Ci0KLSAgICAgIC8qIGNtcHUgb25seSBzdXBwb3J0cyBzb21lIGNvbmRpdGlvbiBjb2RlcyAqLwotICAgICAgaWYgKHAgPT0gNCkKLQl7Ci0JICBpZiAoaSA8IDMgfHwgaSA+IDYpCi0JICAgIHsKLQkgICAgICBuYW1lW3ArMl09MDsKLQkgICAgICBhc19iYWQgKF8oImNtcHUgZG9lc24ndCBzdXBwb3J0IGNvbmRpdGlvbiBjb2RlICVzIiksJm5hbWVbcF0pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISpzdHIpCi0JewotCSAgbmFtZVtwKzJdPTA7Ci0JICBhc19iYWQgKF8oInVua25vd24gY29uZGl0aW9uIGNvZGU6ICVzIiksJm5hbWVbcF0pOyAgICAgIAotCX0KLSAgICAgIAotICAgICAgY21wX2hhY2sgPSBpOwotICAgICAgbmFtZVtwXSA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgY21wX2hhY2sgPSAwOwotICAKLSAgLyogIHByaW50ZigiY21wX2hhY2s9JWRcbiIsY21wX2hhY2spOyAqLwotCi0gIC8qIG5lZWQgdG8gbG9vayBmb3IgLnMgb3IgLmwgKi8KLSAgaWYgKG5hbWVbbmxlbi0yXSA9PSAnLicpCi0gICAgewotICAgICAgc3dpdGNoIChuYW1lW25sZW4tMV0pCi0JewotCWNhc2UgJ3MnOgotCSAgZnNpemUgPSBGT1JDRV9TSE9SVDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgZnNpemUgPSBGT1JDRV9MT05HOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbmFtZVtubGVuLTJdID0gMDsKLSAgICB9Ci0KLSAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovICAKLSAgb3Bjb2RlLT5vcCA9IChzdHJ1Y3QgZDMwdl9vcGNvZGUgKiloYXNoX2ZpbmQgKGQzMHZfaGFzaCwgbmFtZSk7Ci0gIGlmIChvcGNvZGUtPm9wID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZTogJXMiKSxuYW1lKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BfZW5kOwotICB3aGlsZSAoIShvcGNvZGUtPmZvcm0gPSBmaW5kX2Zvcm1hdCAob3Bjb2RlLT5vcCwgbXlvcHMsIGZzaXplLCBjbXBfaGFjaykpKQotICAgIHsKLSAgICAgIG9wY29kZS0+b3ArKzsKLSAgICAgIGlmIChvcGNvZGUtPm9wLT5uYW1lID09IE5VTEwgfHwgc3RyY21wIChvcGNvZGUtPm9wLT5uYW1lLCBuYW1lKSkKLQl7Ci0JICBhc19iYWQgKF8oIm9wZXJhbmRzIGZvciBvcGNvZGUgYCVzJyBkbyBub3QgbWF0Y2ggYW55IHZhbGlkIGZvcm1hdCIpLCBuYW1lKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotCi0gIGluc24gPSBidWlsZF9pbnNuIChvcGNvZGUsIG15b3BzKTsgCi0KLSAgLyogUHJvcGlnYXRlIG11bHRpcGx5IHN0YXR1cyAqLwotICBpZiAoaW5zbiAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoaXNfcGFyYWxsZWwgJiYgcHJldl9tdWwzMl9wKQotCWN1cl9tdWwzMl9wID0gMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmV2X211bDMyX3AgPSBjdXJfbXVsMzJfcDsKLQkgIGN1cl9tdWwzMl9wICA9IChvcGNvZGUtPm9wLT5mbGFnc191c2VkICYgRkxBR19NVUwzMikgIT0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIFByb3BhZ2F0ZSBsZWZ0X2tpbGxzX3JpZ2h0IHN0YXR1cyAqLwotICBpZiAoaW5zbiAhPSAtMSkKLSAgICB7Ci0gICAgICBwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCA9IGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3A7Ci0KLSAgICAgIGlmIChvcGNvZGUtPm9wLT5mbGFnc19zZXQgJiBGTEFHX0xLUikKLQl7Ci0JICBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMTsKLQkgIAotCSAgaWYgKHN0cmNtcCAob3Bjb2RlLT5vcC0+bmFtZSwgIm12dHN5cyIpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBMZWZ0IGtpbGxzIHJpZ2h0IGZvciBvbmx5IG12dHN5cyBvbmx5IGZvciBQU1cvUFNXSC9QU1dML2ZsYWdzIHRhcmdldC4gKi8KLQkgICAgICBpZiAoKG15b3BzWzBdLlhfb3AgPT0gT19yZWdpc3RlcikgJiYKLQkJICAoKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0NPTlRST0wpIHx8IC8qIHBzdyAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMikgfHwgLyogcHN3aCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMSkgfHwgLyogcHN3bCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRyswKSB8fCAvKiBmMCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRysxKSB8fCAvKiBmMSAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRysyKSB8fCAvKiBmMiAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRyszKSB8fCAvKiBmMyAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys0KSB8fCAvKiBmNCAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys1KSB8fCAvKiBmNSAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys2KSB8fCAvKiBmNiAqLwotCQkgICAobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfRkxBRys3KSkpIC8qIGY3ICovCi0JCXsKLQkJICBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIE90aGVyIG12dHN5cyB0YXJnZXQgcmVnaXN0ZXJzIGRvbid0IGtpbGwgcmlnaHQgaW5zdHJ1Y3Rpb24uICovCi0JCSAgY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci0JCX0KLQkgICAgfSAvKiBtdnRzeXMgKi8KLQl9Ci0gICAgICBlbHNlCi0JY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiBpbnNuOwotfQotCi0KLS8qIGZpbmRfZm9ybWF0KCkgZ2V0cyBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGZvcm1hdCB0YWJsZS4KLSAgIEl0IG11c3QgbG9vayBhdCBhbGwgZm9ybWF0cyBmb3IgYW4gb3Bjb2RlIGFuZCB1c2UgdGhlIG9wZXJhbmRzCi0gICB0byBjaG9vc2UgdGhlIGNvcnJlY3Qgb25lLiAgUmV0dXJucyBOVUxMIG9uIGVycm9yLiAqLwotCi1zdGF0aWMgc3RydWN0IGQzMHZfZm9ybWF0ICoKLWZpbmRfZm9ybWF0IChvcGNvZGUsIG15b3BzLCBmc2l6ZSwgY21wX2hhY2spCi0gICAgIHN0cnVjdCBkMzB2X29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyBteW9wc1tdOwotICAgICBpbnQgZnNpemU7Ci0gICAgIGludCBjbXBfaGFjazsKLXsKLSAgaW50IG51bW9wcywgbWF0Y2gsIGluZGV4LCBpPTAsIGosIGs7Ci0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZm07Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgLyogR2V0IGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucy4gICovCi0gIG51bW9wcyA9IGdldF9vcGVyYW5kcyAobXlvcHMsIGNtcF9oYWNrKTsKLQotICB3aGlsZSAoKGluZGV4ID0gb3Bjb2RlLT5mb3JtYXRbaSsrXSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZnNpemUgPT0gRk9SQ0VfU0hPUlQgJiYgaW5kZXggPj0gTE9ORykKLQljb250aW51ZTsKLQotICAgICAgaWYgKGZzaXplID09IEZPUkNFX0xPTkcgJiYgaW5kZXggPCBMT05HKQotCWNvbnRpbnVlOwotCi0gICAgICBmbSA9IChzdHJ1Y3QgZDMwdl9mb3JtYXQgKikmZDMwdl9mb3JtYXRfdGFibGVbaW5kZXhdOwotICAgICAgayA9IGluZGV4OwotICAgICAgd2hpbGUgKGZtLT5mb3JtID09IGluZGV4KQotCXsKLQkgIG1hdGNoID0gMTsKLQkgIC8qIE5vdyBjaGVjayB0aGUgb3BlcmFuZHMgZm9yIGNvbXBhdGliaWxpdHkuICAqLwotCSAgZm9yIChqID0gMDsgbWF0Y2ggJiYgZm0tPm9wZXJhbmRzW2pdOyBqKyspCi0JICAgIHsKLQkgICAgICBpbnQgZmxhZ3MgPSBkMzB2X29wZXJhbmRfdGFibGVbZm0tPm9wZXJhbmRzW2pdXS5mbGFnczsKLQkgICAgICBpbnQgYml0cyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmbS0+b3BlcmFuZHNbal1dLmJpdHM7Ci0JICAgICAgaW50IFhfb3AgPSBteW9wc1tqXS5YX29wOwotCSAgICAgIGludCBudW0gPSBteW9wc1tqXS5YX2FkZF9udW1iZXI7Ci0JICAgICAgCi0JICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9TUEVDSUFMKQotCQlicmVhazsKLQkgICAgICBlbHNlIGlmIChYX29wID09IE9faWxsZWdhbCkKLQkJbWF0Y2ggPSAwOwotCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JCXsKLQkJICBpZiAoWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0FDQykgJiYgIShudW0gJiBPUEVSQU5EX0FDQykpCi0JCSAgICAgIHx8ICghKGZsYWdzICYgT1BFUkFORF9BQ0MpICYmIChudW0gJiBPUEVSQU5EX0FDQykpCi0JCSAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpICYmICEobnVtICYgT1BFUkFORF9GTEFHKSkKLQkJICAgICAgfHwgKCEoZmxhZ3MgJiAoT1BFUkFORF9GTEFHIHwgT1BFUkFORF9DT05UUk9MKSkgJiYgKG51bSAmIE9QRVJBTkRfRkxBRykpCi0JCSAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCi0JCQkgICYmICEobnVtICYgKE9QRVJBTkRfQ09OVFJPTCB8IE9QRVJBTkRfRkxBRykpKSkKLQkJICAgIHsKLQkJICAgICAgbWF0Y2ggPSAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKChmbGFncyAmIE9QRVJBTkRfTUlOVVMpCi0JCSAgICAgICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfTUlOVVMpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfUExVUykKLQkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX1BMVVMpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykKLQkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX0FUTUlOVVMpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQVRQQVIpCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9BVFBBUikpCi0JCSAgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9BVFNJR04pCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9BVFNJR04pKSkKLQkJewotCQkgIG1hdGNoPTA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfTlVNKQotCQl7Ci0JCSAgLyogQSBudW1iZXIgY2FuIGJlIGEgY29uc3RhbnQgb3Igc3ltYm9sIGV4cHJlc3Npb24uICAqLwotCi0JCSAgLyogSWYgd2UgaGF2ZSBmb3VuZCBhIHJlZ2lzdGVyIG5hbWUsIGJ1dCB0aGF0IG5hbWUgYWxzbwotCQkgICAgIG1hdGNoZXMgYSBzeW1ib2wsIHRoZW4gcmUtcGFyc2UgdGhlIG5hbWUgYXMgYW4gZXhwcmVzc2lvbi4gICovCi0JCSAgaWYgKFhfb3AgPT0gT19yZWdpc3RlcgotCQkgICAgICAmJiBzeW1ib2xfZmluZCAoKGNoYXIgKikgbXlvcHNbal0uWF9vcF9zeW1ib2wpKQotCQkgICAgewotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAoY2hhciAqKSBteW9wc1tqXS5YX29wX3N5bWJvbDsKLQkJICAgICAgZXhwcmVzc2lvbiAoJiBteW9wc1tqXSk7Ci0JCSAgICB9Ci0JCSAgICAgIAotCQkgIC8qIFR1cm4gYW4gZXhwcmVzc2lvbiBpbnRvIGEgc3ltYm9sIGZvciBsYXRlciByZXNvbHV0aW9uLiAgKi8KLQkJICBpZiAoWF9vcCAhPSBPX2Fic2VudCAmJiBYX29wICE9IE9fY29uc3RhbnQKLQkJICAgICAgJiYgWF9vcCAhPSBPX3N5bWJvbCAmJiBYX29wICE9IE9fcmVnaXN0ZXIKLQkJICAgICAgJiYgWF9vcCAhPSBPX2JpZykKLQkJICAgIHsKLQkJICAgICAgc3ltYm9sUyAqc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJm15b3BzW2pdKTsKLQkJICAgICAgbXlvcHNbal0uWF9vcCA9IFhfb3AgPSBPX3N5bWJvbDsKLQkJICAgICAgbXlvcHNbal0uWF9hZGRfc3ltYm9sID0gc3ltOwotCQkgICAgICBteW9wc1tqXS5YX2FkZF9udW1iZXIgPSBudW0gPSAwOwotCQkgICAgfQotCi0JCSAgaWYgKGZtLT5mb3JtID49IExPTkcpCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHdlJ3JlIHRlc3RpbmcgZm9yIGEgTE9ORyBmb3JtYXQsIGVpdGhlciBmaXRzLiAqLwotCQkgICAgICBpZiAoWF9vcCAhPSBPX2NvbnN0YW50ICYmIFhfb3AgIT0gT19zeW1ib2wpCi0JCQltYXRjaCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZm0tPmZvcm0gPCBMT05HCi0JCQkgICAmJiAoKGZzaXplID09IEZPUkNFX1NIT1JUICYmIFhfb3AgPT0gT19zeW1ib2wpCi0JCQkgICAgICAgfHwgKGZtLT5mb3JtID09IFNIT1JUX0QyICYmIGogPT0gMCkpKQotCQkgICAgbWF0Y2ggPSAxOwotCQkgIC8qIFRoaXMgaXMgdGhlIHRyaWNreSBwYXJ0LiAgV2lsbCB0aGUgY29uc3RhbnQgb3Igc3ltYm9sCi0JCSAgICAgZml0IGludG8gdGhlIHNwYWNlIGluIHRoZSBjdXJyZW50IGZvcm1hdD8gKi8KLQkJICBlbHNlIGlmIChYX29wID09IE9fY29uc3RhbnQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjaGVja19yYW5nZSAobnVtLCBiaXRzLCBmbGFncykpCi0JCQltYXRjaCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoWF9vcCA9PSBPX3N5bWJvbAotCQkJICAgJiYgU19JU19ERUZJTkVEIChteW9wc1tqXS5YX2FkZF9zeW1ib2wpCi0JCQkgICAmJiBTX0dFVF9TRUdNRU5UIChteW9wc1tqXS5YX2FkZF9zeW1ib2wpID09IG5vd19zZWcKLQkJCSAgICYmIG9wY29kZS0+cmVsb2NfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBzZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0Ci0JCQkgaW50byB0aGUgZm9ybSB3ZSdyZSBjb25zaWRlcmluZy4gKi8KLQkJICAgICAgZnJhZ1MgKmY7Ci0JCSAgICAgIGxvbmcgdmFsdWU7Ci0KLQkJICAgICAgLyogQ2FsY3VsYXRlIHRoZSBjdXJyZW50IGFkZHJlc3MgYnkgcnVubmluZyB0aHJvdWdoIHRoZQotCQkJIHByZXZpb3VzIGZyYWdzIGFuZCBhZGRpbmcgb3VyIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgICBmb3IgKGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmOyBmID0gZi0+ZnJfbmV4dCkKLQkJCXZhbHVlICs9IGYtPmZyX2ZpeCArIGYtPmZyX29mZnNldDsKLQkJICAgICAgdmFsdWUgPSAoU19HRVRfVkFMVUUgKG15b3BzW2pdLlhfYWRkX3N5bWJvbCkgLSB2YWx1ZQotCQkJICAgICAgIC0gKG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykKLQkJCQkgIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpKTsKLQkJICAgICAgaWYgKGNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZmxhZ3MpKSAKLQkJCW1hdGNoID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgfQotCSAgLyogcHJpbnRmKCJ0aHJvdWdoIHRoZSBsb29wOiBtYXRjaD0lZFxuIixtYXRjaCk7ICAqLwotCSAgLyogV2UncmUgb25seSBkb25lIGlmIHRoZSBvcGVyYW5kcyBtYXRjaGVkIHNvIGZhciBBTkQgdGhlcmUKLQkgICAgIGFyZSBubyBtb3JlIHRvIGNoZWNrLiAgKi8KLQkgIGlmIChtYXRjaCAmJiBteW9wc1tqXS5YX29wID09IDApCi0JICAgIHsKLQkgICAgICAvKiBGaW5hbCBjaGVjayAtIGlzc3VlIGEgd2FybmluZyBpZiBhbiBvZGQgbnVtYmVyZWQgcmVnaXN0ZXIKLQkJIGlzIHVzZWQgYXMgdGhlIGZpcnN0IHJlZ2lzdGVyIGluIGFuIGluc3RydWN0aW9uIHRoYXQgcmVhZHMKLQkJIG9yIHdyaXRlcyAyIHJlZ2lzdGVycy4gICovCi0KLQkgICAgICBmb3IgKGogPSAwOyBmbS0+b3BlcmFuZHNbal07IGorKykKLQkJaWYgKG15b3BzW2pdLlhfb3AgPT0gT19yZWdpc3RlcgotCQkgICAgJiYgKG15b3BzW2pdLlhfYWRkX251bWJlciAmIDEpCi0JCSAgICAmJiAoZDMwdl9vcGVyYW5kX3RhYmxlW2ZtLT5vcGVyYW5kc1tqXV0uZmxhZ3MgJiBPUEVSQU5EXzJSRUcpKQotCQkgIGFzX3dhcm4gKFwKLV8oIk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbiIpKTsKLQkgICAgICAKLQkgICAgICByZXR1cm4gZm07Ci0JICAgIH0KLQkgIGZtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKSZkMzB2X2Zvcm1hdF90YWJsZVsrK2tdOwotCX0KLSAgICAgIC8qIHByaW50ZigidHJ5aW5nIGFub3RoZXIgZm9ybWF0OiBpPSVkXG4iLGkpOyAqLwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0gCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjKQotICAgICBmaXhTICpmaXhwOwotICAgICBzZWdUIHNlYzsKLXsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopTlVMTCAmJiAoIVNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpIHx8Ci0gICAgIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjKSkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKiBmaXhwOwotICAgICB2YWx1ZVQgKiB2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICogd2hlcmU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbiwgaW5zbjI7Ci0gIGxvbmcgdmFsdWU7Ci0gIAotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICogdmFsdWVwOwotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICogdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICAKLSAgICAgIGlmIChmaXhwLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikgCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAotICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KLSAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gIGluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gIAotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODogIC8qIENoZWNrIGZvciBhIGJhZCAuYnl0ZSBkaXJlY3RpdmUuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgYnl0ZSIpLAotCQlmaXhwLT5meF9saW5lLCBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOwotICAgICAgZWxzZSBpZiAoKCh1bnNpZ25lZCl2YWx1ZSkgPiAweGZmKQotCSAgYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIGJ5dGUiKSwKLQkJICAgIGZpeHAtPmZ4X2xpbmUsIHZhbHVlKTsKLSAgICAgIGVsc2UKLQkqICh1bnNpZ25lZCBjaGFyICopIHdoZXJlID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQkZEX1JFTE9DXzE2OiAgLyogQ2hlY2sgZm9yIGEgYmFkIC5zaG9ydCBkaXJlY3RpdmUuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgc2hvcnQiKSwKLQkJZml4cC0+ZnhfbGluZSwgU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpKTsKLSAgICAgIGVsc2UgaWYgKCgodW5zaWduZWQpdmFsdWUpID4gMHhmZmZmKQotCSAgYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIHNob3J0IiksCi0JCSAgICBmaXhwLT5meF9saW5lLCB2YWx1ZSk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQkZEX1JFTE9DXzY0OiAgLyogQ2hlY2sgZm9yIGEgYmFkIC5xdWFkIGRpcmVjdGl2ZS4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQlhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBxdWFkIiksCi0JCWZpeHAtPmZ4X2xpbmUsIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICBiZmRfcHV0YjMyICgwLCAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpICsgNCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzY6Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgNiwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9IHZhbHVlICYgMHgzRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTDoKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSAmIDB4NykKLQl7Ci0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgICAgdmFsdWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SOwotCX0KLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCA5LCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKCh2YWx1ZSA+PiAzKSAmIDB4M0YpIDw8IDEyOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8xNToKLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCAxNSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAzKSAmIDB4RkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTDoKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSAmIDB4NykKLQl7Ci0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgICAgdmFsdWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUjsKLQl9Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMTUsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweEZGRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMjE6Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMjEsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweDNGRkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTDoKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSAmIDB4NykKLQl7Ci0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgICAgdmFsdWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUjsKLQl9Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMjEsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweDNGRkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8zMjoKLSAgICAgIGluc24yID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgKyA0KTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDI2KSAmIDB4M0Y7CQkvKiB0b3AgNiBiaXRzICovCi0gICAgICBpbnNuMiB8PSAoKHZhbHVlICYgMHgwM0ZDMDAwMCkgPDwgMik7CS8qIG5leHQgOCBiaXRzICovIAotICAgICAgaW5zbjIgfD0gdmFsdWUgJiAweDAwMDNGRkZGOwkJLyogYm90dG9tIDE4IGJpdHMgKi8KLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbjIsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUw6Ci0gICAgICBpbnNuMiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAyNikgJiAweDNGOwkJLyogdG9wIDYgYml0cyAqLwotICAgICAgaW5zbjIgfD0gKCh2YWx1ZSAmIDB4MDNGQzAwMDApIDw8IDIpOwkvKiBuZXh0IDggYml0cyAqLyAKLSAgICAgIGluc24yIHw9IHZhbHVlICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCi0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24yLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSArIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIpLAotCSAgICAgIGZpeHAtPmZ4X2xpbmUsZml4cC0+Znhfcl90eXBlKTsKLSAgICB9Ci0gIAotICByZXR1cm4gMDsKLX0KLQotCi0vKiBkMzB2X2NsZWFudXAoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQgcGFyc2luZyB0aGUgaW5wdXQgCi0gICBmaWxlIG9yIGFmdGVyIGEgbGFiZWwgaXMgZGVmaW5lZC4gIEJlY2F1c2UgdGhlIEQzMFYgYXNzZW1ibGVyIHNvbWV0aW1lcyBzYXZlcyBzaG9ydCAKLSAgIGluc3RydWN0aW9ucyB0byBzZWUgaWYgaXQgY2FuIHBhY2thZ2UgdGhlbSB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uLCB0aGVyZSBtYXkKLSAgIGJlIGEgc2hvcnQgaW5zdHJ1Y3Rpb24gdGhhdCBzdGlsbCBuZWVkcyB3cml0dGVuLiAgKi8KLWludAotZDMwdl9jbGVhbnVwICh1c2Vfc2VxdWVudGlhbCkKLSAgICAgaW50IHVzZV9zZXF1ZW50aWFsOwotewotICBzZWdUIHNlZzsKLSAgc3Vic2VnVCBzdWJzZWc7Ci0KLSAgaWYgKHByZXZfaW5zbiAhPSAtMSkKLSAgICB7Ci0gICAgICBzZWcgPSBub3dfc2VnOwotICAgICAgc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIHN1YnNlZ19zZXQgKHByZXZfc2VnLCBwcmV2X3N1YnNlZyk7Ci0gICAgICB3cml0ZV8xX3Nob3J0ICgmcHJldl9vcGNvZGUsIChsb25nKXByZXZfaW5zbiwgZml4dXBzLT5uZXh0LCB1c2Vfc2VxdWVudGlhbCk7Ci0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgICBwcmV2X2luc24gPSAtMTsKLSAgICAgIGlmICh1c2Vfc2VxdWVudGlhbCkKLQlwcmV2X211bDMyX3AgPSBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAKLWQzMHZfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBuKQotICAgICBjaGFyICpidWY7CQkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIGxvbmcgbG9uZyB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG47CQkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIHdoaWxlIChuLS0pCi0gICAgewotICAgICAgYnVmW25dID0gdmFsdWUgJiAweGZmOwotICAgICAgdmFsdWUgPj49IDg7Ci0gICAgfQotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBldmVyeSBsaW5lLiAqLwotLyogaXQgY2hlY2tzIHRvIHNlZSBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgJy4nICovCi0vKiB3aGljaCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGEgcHNldWRvLW9wLiAgSWYgaXQgaXMsICovCi0vKiB0aGVuIHdyaXRlIG91dCBhbnkgdW53cml0dGVuIGluc3RydWN0aW9ucyAqLwotCi12b2lkIAotZDMwdl9zdGFydF9saW5lICgpCi17Ci0gIGNoYXIgKmMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgd2hpbGUgKGlzc3BhY2UgKCpjKSkKLSAgICBjKys7Ci0KLSAgaWYgKCpjID09ICcuJykKLSAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgCi1jaGVja19zaXplICh2YWx1ZSwgYml0cywgZmlsZSwgbGluZSkKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIGludCBsaW5lOwotewotICBpbnQgdG1wLCBtYXg7Ci0KLSAgaWYgKHZhbHVlIDwgMCkKLSAgICB0bXAgPSB+dmFsdWU7Ci0gIGVsc2UKLSAgICB0bXAgPSB2YWx1ZTsKLSAgICAKLSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOwotCi0gIGlmICh0bXAgPiBtYXgpCi0gICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJ2YWx1ZSB0b28gbGFyZ2UgdG8gZml0IGluICVkIGJpdHMiKSwgYml0cyk7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBkMzB2X2Zyb2JfbGFiZWwoKSBpcyBjYWxsZWQgd2hlbiBhZnRlciBhIGxhYmVsIGlzIHJlY29nbml6ZWQuICAqLwotCi12b2lkCi1kMzB2X2Zyb2JfbGFiZWwgKGxhYikKLSAgICAgc3ltYm9sUyAqbGFiOwotewotICAvKiBFbWl0IGFueSBwZW5kaW5nIGluc3RydWN0aW9ucy4gICovCi0gIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCi0gIC8qIFVwZGF0ZSB0aGUgbGFiZWwncyBhZGRyZXNzIHdpdGggdGhlIGN1cnJlbnQgb3V0cHV0IHBvaW50ZXIuICAqLwotICBzeW1ib2xfc2V0X2ZyYWcgKGxhYiwgZnJhZ19ub3cpOwotICBTX1NFVF9WQUxVRSAobGFiLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCi0gIC8qIFJlY29yZCB0aGlzIGxhYmVsIGZvciBmdXR1cmUgYWRqdXN0bWVudCBhZnRlciB3ZSBmaW5kIG91dCB3aGF0Ci0gICAgIGtpbmQgb2YgZGF0YSBpdCByZWZlcmVuY2VzLCBhbmQgdGhlIHJlcXVpcmVkIGFsaWdubWVudCB0aGVyZXdpdGguICAqLwotICBkMzB2X2xhc3RfbGFiZWwgPSBsYWI7Ci19Ci0KLS8qIEhvb2sgaW50byBjb25zIGZvciBjYXB0dXJpbmcgYWxpZ25tZW50IGNoYW5nZXMuICAqLwotCi12b2lkCi1kMzB2X2NvbnNfYWxpZ24gKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBpbnQgbG9nX3NpemU7Ci0KLSAgbG9nX3NpemUgPSAwOwotICB3aGlsZSAoKHNpemUgPj49IDEpICE9IDApCi0gICAgKytsb2dfc2l6ZTsKLQotICBpZiAoZDMwdl9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgZDMwdl9hbGlnbiAobG9nX3NpemUsIChjaGFyICopIE5VTEwsIE5VTEwpOwotICBlbHNlIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBkMzB2X2N1cnJlbnRfYWxpZ24gPSBsb2dfc2l6ZTsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLX0KLQotLyogQ2FsbGVkIGludGVybmFsbHkgdG8gaGFuZGxlIGFsbCBhbGlnbm1lbnQgbmVlZHMuICBUaGlzIHRha2VzIGNhcmUKLSAgIG9mIGVsaWRpbmcgY2FsbHMgdG8gZnJhZ19hbGlnbiBpZiduIHRoZSBjYWNoZWQgY3VycmVudCBhbGlnbm1lbnQKLSAgIHNheXMgd2UndmUgYWxyZWFkeSBnb3QgaXQsIGFzIHdlbGwgYXMgdGFraW5nIGNhcmUgb2YgdGhlIGF1dG8tYWxpZ25pbmcKLSAgIGxhYmVscyB3cnQgY29kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1kMzB2X2FsaWduIChuLCBwZmlsbCwgbGFiZWwpCi0gICAgIGludCBuOwotICAgICBjaGFyICpwZmlsbDsKLSAgICAgc3ltYm9sUyAqbGFiZWw7Ci17Ci0gIC8qIFRoZSBmcm9udCBlbmQgaXMgcHJvbmUgdG8gY2hhbmdpbmcgc2VnbWVudHMgb3V0IGZyb20gdW5kZXIgdXMKLSAgICAgdGVtcG9yYXJpbHkgd2hlbiAtZyBpcyBpbiBlZmZlY3QuICAqLwotICBpbnQgc3dpdGNoZWRfc2VnX3AgPSAoZDMwdl9jdXJyZW50X2FsaWduX3NlZyAhPSBub3dfc2VnKTsKLQotICAvKiBEbyBub3QgYXNzdW1lIHRoYXQgaWYgJ2QzMHZfY3VycmVudF9hbGlnbiA+PSBuJyBhbmQKLSAgICAgJyEgc3dpdGNoZWRfc2VnX3AnIHRoYXQgaXQgaXMgc2FmZSB0byBhdm9pZCBwZXJmb3JtaW5nCi0gICAgIHRoaXMgYWxpZ25lbWVudCByZXF1ZXN0LiAgVGhlIGFsaWdubWVudCBvZiB0aGUgY3VycmVudCBmcmFnCi0gICAgIGNhbiBiZSBjaGFuZ2VkIHVuZGVyIG91ciBmZWV0LCBmb3IgZXhhbXBsZSBieSBhIC5hc2NpaQotICAgICBkaXJlY3RpdmUgaW4gdGhlIHNvdXJjZSBjb2RlLiAgY2YgdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMgICovCi0gIAotICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQotICBpZiAocGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA+IDIKLQkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLQl7Ci0JICBzdGF0aWMgY2hhciBjb25zdCBub3BbNF0gPSB7IDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAgfTsKLQotCSAgLyogRmlyc3QsIG1ha2Ugc3VyZSB3ZSdyZSBvbiBhIGZvdXItYnl0ZSBib3VuZGFyeSwgaW4gY2FzZQotCSAgICAgc29tZW9uZSBoYXMgYmVlbiBwdXR0aW5nIC5ieXRlIHZhbHVlcyB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPCAyIHx8IHN3aXRjaGVkX3NlZ19wKQotCSAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLQkgIGZyYWdfYWxpZ25fcGF0dGVybiAobiwgbm9wLCBzaXplb2Ygbm9wLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbiAobiwgMCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKLQotICBpZiAoIXN3aXRjaGVkX3NlZ19wKQotICAgIGQzMHZfY3VycmVudF9hbGlnbiA9IG47Ci0KLSAgaWYgKGxhYmVsICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUyAqICAgICBzeW07Ci0gICAgICBpbnQgICAgICAgICAgIGxhYmVsX3NlZW4gPSBmYWxzZTsKLSAgICAgIHN0cnVjdCBmcmFnICogb2xkX2ZyYWc7Ci0gICAgICB2YWx1ZVQgICAgICAgIG9sZF92YWx1ZTsKLSAgICAgIHZhbHVlVCAgICAgICAgbmV3X3ZhbHVlOwotICAgICAgCi0gICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKLQotICAgICAgb2xkX2ZyYWcgID0gc3ltYm9sX2dldF9mcmFnIChsYWJlbCk7Ci0gICAgICBvbGRfdmFsdWUgPSBTX0dFVF9WQUxVRSAobGFiZWwpOwotICAgICAgbmV3X3ZhbHVlID0gKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpOwotICAgICAgCi0gICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbGFiZWwgYXQgYSBwYXJ0aWN1bGFyCi0JIGFkZHJlc3MsIGVzcGVjaWFsbHkgaWYgZGVidWdnaW5nIGlzIGVuYWJsZWQsIHNvIHdlIG11c3QKLQkgdGFrZSBjYXJlIHRvIGFkanVzdCBhbGwgdGhlIGxhYmVscyBhdCB0aGlzIGFkZHJlc3MgaW4gdGhpcwotCSBmcmFnbWVudC4gIFRvIHNhdmUgdGltZSB3ZSBzZWFyY2ggZnJvbSB0aGUgZW5kIG9mIHRoZSBzeW1ib2wKLQkgbGlzdCwgYmFja3dhcmRzLCBzaW5jZSB0aGUgc3ltYm9scyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBhcmUKLQkgYWxtb3N0IGNlcnRhaW5seSB0aGUgb25lcyB0aGF0IHdlcmUgbW9zdCByZWNlbnRseSBhZGRlZC4KLQkgQWxzbyB0byBzYXZlIHRpbWUgd2Ugc3RvcCBzZWFyY2hpbmcgb25jZSB3ZSBoYXZlIHNlZW4gYXQgbGVhc3QKLQkgb25lIG1hdGNoaW5nIGxhYmVsLCBhbmQgd2UgZW5jb3VudGVyIGEgbGFiZWwgdGhhdCBpcyBubyBsb25nZXIKLQkgaW4gdGhlIHRhcmdldCBmcmFnbWVudC4gIE5vdGUsIHRoaXMgc2VhcmNoIGlzIGd1YXJhbnRlZWQgdG8KLQkgZmluZCBhdCBsZWFzdCBvbmUgbWF0Y2ggd2hlbiBzeW0gPT0gbGFiZWwsIHNvIG5vIHNwZWNpYWwgY2FzZQotCSBjb2RlIGlzIG5lY2Vzc2FyeS4gICovCi0gICAgICBmb3IgKHN5bSA9IHN5bWJvbF9sYXN0UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9wcmV2aW91cyAoc3ltKSkKLQl7Ci0JICBpZiAoc3ltYm9sX2dldF9mcmFnIChzeW0pID09IG9sZF9mcmFnCi0JICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPT0gb2xkX3ZhbHVlKQotCSAgICB7Ci0JICAgICAgbGFiZWxfc2VlbiA9IHRydWU7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLQkgICAgICBTX1NFVF9WQUxVRSAoc3ltLCBuZXdfdmFsdWUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChsYWJlbF9zZWVuICYmIHN5bWJvbF9nZXRfZnJhZyAoc3ltKSAhPSBvbGRfZnJhZykKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wLiAgVGhpcyBhbGlnbnMgdG8gYSBwb3dlciBvZiB0d28uICBXZQotICAgaG9vayBoZXJlIHRvIGxhdGNoIHRoZSBjdXJyZW50IGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfYWxpZ24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGFsaWduOwotICBjaGFyIGZpbGwsICpwZmlsbCA9IE5VTEw7Ci0gIGxvbmcgbWF4X2FsaWdubWVudCA9IDE1OwotCi0gIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCi0gICAgewotICAgICAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OwotICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQgYXNzdW1lZCIpLCBhbGlnbik7Ci0gICAgfQotICBlbHNlIGlmIChhbGlnbiA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiKSk7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHBmaWxsID0gJmZpbGw7Ci0gICAgfQotCi0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfYWxpZ24gKGFsaWduLCBwZmlsbCwgTlVMTCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAudGV4dCBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgdGhlIHNhdmVkIGxhc3QgbGFiZWwgYW5kIHJlc2V0cyBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19kMzB2X3RleHQgKGkpCi0gICAgIGludCBpOwotCi17Ci0gIHNfdGV4dCAoaSk7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7Ci0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQotCi0vKiBIYW5kbGUgdGhlIC5kYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfZGF0YSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHNfZGF0YSAoaSk7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7Ci0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0gIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7Ci0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmggYi9nYXMvY29uZmlnL3RjLWQzMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlYmJiOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWQzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIHRjLTMxMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtZDMwdi5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19EMzBWCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBEMzBWIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2QzMHYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItZDMwdiIKLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oRklYUCwgU0VDKSAgIAotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIC4tZm9vIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgICAgICAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4KLQotaW50IGQzMHZfY2xlYW51cCBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgbWRfYWZ0ZXJfcGFzc19ob29rKCkJICAgICBkMzB2X2NsZWFudXAgKGZhbHNlKQotI2RlZmluZSBtZF9jbGVhbnVwKCkJCSAgICAgZDMwdl9jbGVhbnVwIChmYWxzZSkKLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2gsIHB0cikgICAgICAoY2ggPT0gJzonICYmIGQzMHZfY2xlYW51cCAoZmFsc2UpKQotI2RlZmluZSBtZF9zdGFydF9saW5lX2hvb2soKQkgICAgIGQzMHZfc3RhcnRfbGluZSAoZmFsc2UpCi0KLXZvaWQgZDMwdl9mcm9iX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkJICAgICBkMzB2X2Zyb2JfbGFiZWwoc3ltKQotCi12b2lkIGQzMHZfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpCSAgICAgZDMwdl9jb25zX2FsaWduKG5ieXRlcykKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZnIzMC5jIGIvZ2FzL2NvbmZpZy90Yy1mcjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTU4ODAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1mcjMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLyogdGMtZnIzMC5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIEZ1aml0c3UgRlIzMC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGVzL2ZyMzAtZGVzYy5oIgotI2luY2x1ZGUgIm9wY29kZXMvZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJjZ2VuLmgiCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgZGVzY3JpYmluZwotICAgYW4gaW5kaXZpZHVhbCBpbnN0cnVjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBDR0VOX0lOU04gKglpbnNuOwotICBjb25zdCBDR0VOX0lOU04gKglvcmlnX2luc247Ci0gIENHRU5fRklFTERTCQlmaWVsZHM7Ci0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0gIENHRU5fSU5TTl9JTlQgICAgICAgICBidWZmZXIgWzFdOwotI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKCooYnVmKSkKLSNlbHNlCi0gIHVuc2lnbmVkIGNoYXIgICAgICAgICBidWZmZXIgW0NHRU5fTUFYX0lOU05fU0laRV07Ci0jZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoYnVmKQotI2VuZGlmCi0gIGNoYXIgKgkJYWRkcjsKLSAgZnJhZ1MgKgkJZnJhZzsKLSAgaW50ICAgICAgICAgICAgICAgICAgIG51bV9maXh1cHM7Ci0gIGZpeFMgKiAgICAgICAgICAgICAgICBmaXh1cHMgW0dBU19DR0VOX01BWF9GSVhVUFNdOwotICBpbnQgICAgICAgICAgICAgICAgICAgaW5kaWNlcyBbTUFYX09QRVJBTkRfSU5TVEFOQ0VTXTsKLX0KLWZyMzBfaW5zbjsKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gICAgICAgID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSAgID0gIiMiOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gInwiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSAgICAgICAgICAgID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gICAgICAgICAgICA9ICJkRCI7Ci0MCi0jZGVmaW5lIEZSMzBfU0hPUlRPUFRTICIiCi1jb25zdCBjaGFyICogbWRfc2hvcnRvcHRzID0gRlIzMF9TSE9SVE9QVFM7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgICAgYzsKLSAgICAgY2hhciAqIGFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICogc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIiBGUjMwIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zOlxuIikpOwotfSAKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsCWNvbnMsCQk0IH0sCi0gIHsgTlVMTCwgCU5VTEwsIAkJMCB9Ci19OwotCi0MCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBmbGFnd29yZCBhcHBsaWNhYmxlOwotICBzZWdUICAgICBzZWc7Ci0gIHN1YnNlZ1QgIHN1YnNlZzsKLQotICAvKiBJbml0aWFsaXplIHRoZSBgY2dlbicgaW50ZXJmYWNlLiAgKi8KLSAgCi0gIC8qIFNldCB0aGUgbWFjaGluZSBudW1iZXIgYW5kIGVuZGlhbi4gICovCi0gIGdhc19jZ2VuX2NwdV9kZXNjID0gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX01BQ0hTLCAwLAotCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5ESUFOLAotCQkJCQkgIENHRU5fRU5ESUFOX0JJRywKLQkJCQkJICBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gIGZyMzBfY2dlbl9pbml0X2FzbSAoZ2FzX2NnZW5fY3B1X2Rlc2MpOwotCi0gIC8qIFRoaXMgaXMgYSBjYWxsYmFjayBmcm9tIGNnZW4gdG8gZ2FzIHRvIHBhcnNlIG9wZXJhbmRzLiAgKi8KLSAgY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGdhc19jZ2VuX3BhcnNlX29wZXJhbmQpOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBzdGF0aWMgaW50IGxhc3RfaW5zbl9oYWRfZGVsYXlfc2xvdCA9IDA7Ci0gIGZyMzBfaW5zbiBpbnNuOwotICBjaGFyICogICAgZXJybXNnOwotICBjaGFyICogICAgc3RyMiA9IE5VTEw7Ci0KLSAgLyogSW5pdGlhbGl6ZSBHQVMncyBjZ2VuIGludGVyZmFjZSBmb3IgYSBuZXcgaW5zdHJ1Y3Rpb24uICAqLwotICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOwotCi0gIGluc24uaW5zbiA9IGZyMzBfY2dlbl9hc3NlbWJsZV9pbnNuCi0gICAgKGdhc19jZ2VuX2NwdV9kZXNjLCBzdHIsICYgaW5zbi5maWVsZHMsIGluc24uYnVmZmVyLCAmIGVycm1zZyk7Ci0gIAotICBpZiAoIWluc24uaW5zbikKLSAgICB7Ci0gICAgICBhc19iYWQgKGVycm1zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGF0IHdlIHBhc3MgZm9yIFJFTEFYX1AgaGVyZS4gICovCi0gIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLmluc24sIGluc24uYnVmZmVyLAotCQkJQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBpbnNuLmZpZWxkcyksIDEsIE5VTEwpOwotCi0gIC8qIFdhcm4gYWJvdXQgaW52YWxpZCBpbnNucyBpbiBkZWxheSBzbG90cy4gICovCi0gIGlmIChsYXN0X2luc25faGFkX2RlbGF5X3Nsb3QKLSAgICAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLmluc24sIENHRU5fSU5TTl9OT1RfSU5fREVMQVlfU0xPVCkpCi0gICAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXMgbm90IGFsbG93ZWQgaW4gYSBkZWxheSBzbG90LiIpLAotCSAgICAgQ0dFTl9JTlNOX05BTUUgKGluc24uaW5zbikpOwotCi0gIGxhc3RfaW5zbl9oYWRfZGVsYXlfc2xvdAotICAgID0gQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24uaW5zbiwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QpOwotfQotCi0vKiBUaGUgc3ludGF4IGluIHRoZSBtYW51YWwgc2F5cyBjb25zdGFudHMgYmVnaW4gd2l0aCAnIycuCi0gICBXZSBqdXN0IGlnbm9yZSBpdC4gICovCi0KLXZvaWQgCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0gICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgfQotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1QgICBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqIG5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotDAotLyogSW50ZXJmYWNlIHRvIHJlbGF4X3NlZ21lbnQuICAqLwotCi0vKiBGSVhNRTogQnVpbGQgdGFibGUgYnkgaGFuZCwgZ2V0IGl0IHdvcmtpbmcsIHRoZW4gbWFjaGluZSBnZW5lcmF0ZS4gICovCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotLyogVGhlIGZpZWxkcyBhcmU6Ci0gICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLiAgKi8KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgbXVzdCBiZSB1bnVzZWQgYmVjYXVzZSBhbiBgcmx4X21vcmUnIHZhbHVlIG9mIHplcm8gZW5kcwotICAgICBlYWNoIGxpc3QuICAqLwotICB7MSwgMSwgMCwgMH0sCi0KLSAgLyogVGhlIGRpc3BsYWNlbWVudCB1c2VkIGJ5IEdBUyBpcyBmcm9tIHRoZSBlbmQgb2YgdGhlIDIgYnl0ZSBpbnNuLAotICAgICBzbyB3ZSBzdWJ0cmFjdCAyIGZyb20gdGhlIGZvbGxvd2luZy4gICovCi0gIC8qIDE2IGJpdCBpbnNuLCA4IGJpdCBkaXNwIC0+IDEwIGJpdCByYW5nZS4KLSAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSBhIGJyYW5jaCBpbiB0aGUgcmlnaHQgc2xvdCBhdCB0aGUgYm9yZGVyOgotICAgICB0aGUgIiYgLTQiIGlzbid0IHRha2VuIGludG8gYWNjb3VudC4gIEl0J3Mgbm90IGltcG9ydGFudCBlbm91Z2ggdG8KLSAgICAgY29tcGxpY2F0ZSB0aGluZ3Mgb3ZlciBpdCwgc28gd2Ugc3VidHJhY3QgYW4gZXh0cmEgMiAob3IgKyAyIGluIC12ZQotICAgICBjYXNlKS4gICovCi0gIHs1MTEgLSAyIC0gMiwgLTUxMiAtIDIgKyAyLCAwLCAyIH0sCi0gIC8qIDMyIGJpdCBpbnNuLCAyNCBiaXQgZGlzcCAtPiAyNiBiaXQgcmFuZ2UuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCAyLCAwIH0sCi0gIC8qIFNhbWUgdGhpbmcsIGJ1dCB3aXRoIGxlYWRpbmcgbm9wIGZvciBhbGlnbm1lbnQuICAqLwotICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCA0LCAwIH0KLX07Ci0KLWxvbmcKLWZyMzBfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICogZnJhZ1A7Ci0gICAgIGxvbmcgICAgc3RyZXRjaDsKLXsKLSAgLyogQWRkcmVzcyBvZiBicmFuY2ggaW5zbi4gICovCi0gIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0gIGxvbmcgZ3Jvd3RoID0gMDsKLQotICAvKiBLZWVwIDMyIGJpdCBpbnNucyBhbGlnbmVkIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KLSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgewotICAgICAgaWYgKChhZGRyZXNzICYgMykgPT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDI7Ci0JICBncm93dGggPSAtMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZ3Jvd3RoID0gcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOwotCi0gICAgICAvKiBMb25nIGp1bXAgb24gb2RkIGhhbGZ3b3JkIGJvdW5kYXJ5PyAgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyICYmIChhZGRyZXNzICYgMykgIT0gMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7Ci0JICBncm93dGggKz0gMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBncm93dGg7Ci19Ci0KLS8qIFJldHVybiBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBsZW5ndGggYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8KLSAgIGhvbGQgYSBicmFuY2ggdG8gcmVhY2ggaXRzIGRlc3RpbmF0aW9uLgotICAgQWxzbyB1cGRhdGVzIGZyX3R5cGUvZnJfc3VidHlwZSBhcyBuZWNlc3NhcnkuCi0KLSAgIENhbGxlZCBqdXN0IGJlZm9yZSBkb2luZyByZWxheGF0aW9uLgotICAgQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCi0gICBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gICBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICAgQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICAgMCB2YWx1ZS4gICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBzZWdUICAgIHNlZ21lbnQ7Ci17Ci0gIGludCAgICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLQotICAvKiBUaGUgb25seSB0aGluZyB3ZSBoYXZlIHRvIGhhbmRsZSBoZXJlIGFyZSBzeW1ib2xzIG91dHNpZGUgb2YgdGhlCi0gICAgIGN1cnJlbnQgc2VnbWVudC4gIFRoZXkgbWF5IGJlIHVuZGVmaW5lZCBvciBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGluCi0gICAgIHdoaWNoIGNhc2UgbGlua2VyIHNjcmlwdHMgbWF5IHBsYWNlIHRoZW0gYW55d2hlcmUuCi0gICAgIEhvd2V2ZXIsIHdlIGNhbid0IGZpbmlzaCB0aGUgZnJhZ21lbnQgaGVyZSBhbmQgZW1pdCB0aGUgcmVsb2MgYXMgaW5zbgotICAgICBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG1heSBtb3ZlIHRoZSBpbnNuIGFib3V0LiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQuCi0JIENoYW5nZSB0aGUgcmVsYXhhdGlvbiBzdWJ0eXBlIHRvIHRoZSBtYXggYWxsb3dhYmxlIGFuZCBsZWF2ZQotCSBhbGwgZnVydGhlciBoYW5kbGluZyB0byBtZF9jb252ZXJ0X2ZyYWcuICAqLwotICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOwotCi0jaWYgMCAvKiBDYW4ndCB1c2UgdGhpcywgYnV0IGxlYXZlIGluIGZvciBpbGx1c3RyYXRpb24uICAqLyAgICAgCi0gICAgICAvKiBDaGFuZ2UgMTYgYml0IGluc24gdG8gMzIgYml0IGluc24uICAqLwotICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSB8PSAweDgwOwotCi0gICAgICAvKiBJbmNyZWFzZSBrbm93biAoZml4ZWQpIHNpemUgb2YgZnJhZ21lbnQuICAqLwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotCi0gICAgICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBpdC4gICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCwgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSAvKiBwY3JlbCAqLywKLQkgICAgICAgLyogRklYTUU6IENhbid0IHVzZSBhIHJlYWwgQkZEIHJlbG9jIGhlcmUuCi0JCSAgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MyBjYW4ndCBoYW5kbGUgaXQuICAqLwotCSAgICAgICBCRkRfUkVMT0NfRlIzMF8yNl9QQ1JFTCk7Ci0KLSAgICAgIC8qIE1hcmsgdGhpcyBmcmFnbWVudCBhcyBmaW5pc2hlZC4gICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLSNlbHNlCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLQlpbnQgICAgICAgICAgICAgICBpOwotCi0JLyogVXBkYXRlIHRoZSByZWNvcmRlZCBpbnNuLgotCSAgIEZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgdG8gbG9vayB2ZXJ5IGZhci4KLQkgICBGSVhNRTogQ2hhbmdlIHRoaXMgdG8gcmVjb3JkIGluIHRoZSBpbnN0cnVjdGlvbiB0aGUgbmV4dCBoaWdoZXIKLQkgICByZWxheGFibGUgaW5zbiB0byB1c2UuICAqLwotCWZvciAoaSA9IDAsIGluc24gPSBmcmFnUC0+ZnJfY2dlbi5pbnNuOyBpIDwgNDsgaSsrLCBpbnNuKyspCi0JICB7Ci0JICAgIGlmICgoc3RyY21wIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pLAotCQkJIENHRU5fSU5TTl9NTkVNT05JQyAoZnJhZ1AtPmZyX2NnZW4uaW5zbikpCi0JCSA9PSAwKQotCQkmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSkKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoaSA9PSA0KQotCSAgYWJvcnQgKCk7Ci0KLQlmcmFnUC0+ZnJfY2dlbi5pbnNuID0gaW5zbjsKLQlyZXR1cm4gMjsKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Ci19IAotCi0vKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCi0gICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplLgotCi0gICBDYWxsZWQgYWZ0ZXIgcmVsYXhhdGlvbiBpcyBmaW5pc2hlZC4KLSAgIGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICAgZnJhZ1AtPmZyX3N1YnR5cGUgaXMgdGhlIHN1YnR5cGUgb2Ygd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKiAgIGFiZmQ7Ci0gIHNlZ1QgICAgc2VjOwotICBmcmFnUyAqIGZyYWdQOwotewotI2lmIDAKLSAgY2hhciAqIG9wY29kZTsKLSAgY2hhciAqIGRpc3BsYWNlbWVudDsKLSAgaW50ICAgIHRhcmdldF9hZGRyZXNzOwotICBpbnQgICAgb3Bjb2RlX2FkZHJlc3M7Ci0gIGludCAgICBleHRlbnNpb247Ci0gIGludCAgICBhZGRlbmQ7Ci0KLSAgb3Bjb2RlID0gZnJhZ1AtPmZyX29wY29kZTsKLQotICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICAqLwotICBvcGNvZGVfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSAxIDoKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMiA6Ci0gICAgICBvcGNvZGVbMF0gfD0gMHg4MDsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMyA6Ci0gICAgICBvcGNvZGVbMl0gPSBvcGNvZGVbMF0gfCAweDgwOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvcGNvZGUsIFBBUl9OT1BfSU5TTiwgMik7Ci0gICAgICBvcGNvZGVfYWRkcmVzcyArPSAyOwotICAgICAgZXh0ZW5zaW9uID0gNDsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzNdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlYykKLSAgICB7Ci0gICAgICAvKiBzeW1ib2wgbXVzdCBiZSByZXNvbHZlZCBieSBsaW5rZXIgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfb2Zmc2V0ICYgMykKLQlhc193YXJuIChfKCJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIikpOwotICAgICAgYWRkZW5kID0gZnJhZ1AtPmZyX29mZnNldCA+PiAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFkZHJlc3Mgd2Ugd2FudCB0byByZWFjaCBpbiBmaWxlIHNwYWNlLiAgKi8KLSAgICAgIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKLSAgICAgIHRhcmdldF9hZGRyZXNzICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0gICAgICBhZGRlbmQgPSAodGFyZ2V0X2FkZHJlc3MgLSAob3Bjb2RlX2FkZHJlc3MgJiAtNCkpID4+IDI7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIHN5bWJvbHMgdGhhdCBtdXN0IGJlIHJlc29sdmVkIGJ5IHRoZSBsaW5rZXIuCi0gICAgIE90aGVyd2lzZSBvdXRwdXQgdGhlIGNvbXBsZXRlZCBpbnNuLiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQotICAgIHsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX3N1YnR5cGUgIT0gMSk7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9jZ2VuLmluc24gIT0gMCk7Ci0gICAgICBnYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWdQLAotCQkJICAgICAvKiBPZmZzZXQgb2YgYnJhbmNoIGluc24gaW4gZnJhZy4gICovCi0JCQkgICAgIGZyYWdQLT5mcl9maXggKyBleHRlbnNpb24gLSA0LAotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5pbnNuLAotCQkJICAgICA0IC8qbGVuZ3RoKi8sCi0JCQkgICAgIC8qIEZJWE1FOiBxdWljayBoYWNrICovCi0jaWYgMAotCQkJICAgICBDR0VOX09QRVJBTkRfRU5UUlkgKGZyYWdQLT5mcl9jZ2VuLm9waW5kZXgpLAotI2Vsc2UKLQkJCSAgICAgQ0dFTl9PUEVSQU5EX0VOVFJZIChGUjMwX09QRVJBTkRfRElTUDI0KSwKLSNlbmRpZgotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5vcGluZm8sCi0JCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQpOwotICAgIH0KLQotI2RlZmluZSBTSVpFX0ZST01fUkVMQVhfU1RBVEUobikgKChuKSA9PSAxID8gMSA6IDMpCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChkaXNwbGFjZW1lbnQsICh2YWx1ZVQpIGFkZGVuZCwKLQkJICAgICAgU0laRV9GUk9NX1JFTEFYX1NUQVRFIChmcmFnUC0+ZnJfc3VidHlwZSkpOwotCi0gIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOwotI2VuZGlmCi19Ci0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWMpCi0gICAgIGZpeFMgKiBmaXhQOwotICAgICBzZWdUICAgc2VjOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWMpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIChvciBpcyBkZWZpbmVkIGJ1dCBub3QgaW4gdGhpcyBzZWN0aW9uKS4KLQkgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUpICYgfjE7Ci19Ci0KLS8qIFJldHVybiB0aGUgYmZkIHJlbG9jIHR5cGUgZm9yIE9QRVJBTkQgb2YgSU5TTiBhdCBmaXh1cCBGSVhQLgotICAgUmV0dXJucyBCRkRfUkVMT0NfTk9ORSBpZiBubyByZWxvYyB0eXBlIGNhbiBiZSBmb3VuZC4KLSAgICpGSVhQIG1heSBiZSBtb2RpZmllZCBpZiBkZXNpcmVkLiAgKi8KLQotYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1tZF9jZ2VuX2xvb2t1cF9yZWxvYyAoaW5zbiwgb3BlcmFuZCwgZml4UCkKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogICAgaW5zbjsKLSAgICAgY29uc3QgQ0dFTl9PUEVSQU5EICogb3BlcmFuZDsKLSAgICAgZml4UyAqICAgICAgICAgICAgICAgZml4UDsKLXsKLSAgc3dpdGNoIChvcGVyYW5kLT50eXBlKQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDk6ICBmaXhQLT5meF9wY3JlbCA9IDE7IHJldHVybiBCRkRfUkVMT0NfRlIzMF85X1BDUkVMOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTI6IGZpeFAtPmZ4X3BjcmVsID0gMTsgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMDogIHJldHVybiBCRkRfUkVMT0NfRlIzMF8xMF9JTl84OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5OiAgIHJldHVybiBCRkRfUkVMT0NfRlIzMF85X0lOXzg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDg6ICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzhfSU5fODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDY6ICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfNl9JTl80OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4OiAgICAgIHJldHVybiBCRkRfUkVMT0NfODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzI6ICAgICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfNDg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwOiAgICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzIwOwotICAgIGRlZmF1bHQgOiAvKiBhdm9pZCAtV2FsbCB3YXJuaW5nICovCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOwotfQotCi0vKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCi0gICByZWxheGluZy4gICovCi0KLWludAotZnIzMF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKiBmaXg7Ci17Ci0gIGlmICggICBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqIGJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50ICAgIG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgICB0eXBlOwotICAgICBjaGFyICogbGl0UDsKLSAgICAgaW50ICogIHNpemVQOwotewotICBpbnQgICAgICAgICAgICAgIGk7Ci0gIGludCAgICAgICAgICAgICAgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgICB3b3JkcyBbTUFYX0xJVFRMRU5VTVNdOwotICBjaGFyICogICAgICAgICAgIHQ7Ci0gIGNoYXIgKiAgICAgICAgICAgYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAvKiBGSVhNRTogU29tZSB0YXJnZXRzIGFsbG93IG90aGVyIGZvcm1hdCBjaGFycyBmb3IgYmlnZ2VyIHNpemVzIGhlcmUuICAqLwotCi0gICAgZGVmYXVsdDoKLSAgICAgICogc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKiBzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCi0JCQkgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdvcmtlciBmdW5jdGlvbiBmb3IgZnIzMF9pc19jb2xvbl9pbnNuKCkuICAqLwotc3RhdGljIGNoYXIKLXJlc3RvcmVfY29sb24gKGFkdmFuY2VfaV9sX3BfYnkpCi0gICAgIGludCBhZHZhbmNlX2lfbF9wX2J5OwotewotICBjaGFyIGM7Ci0gIAotICAvKiBSZXN0b3JlIHRoZSBjb2xvbiwgYW5kIGFkdmFuY2UgaW5wdXRfbGluZV9wb2ludGVyIHRvCi0gICAgIHRoZSBlbmQgb2YgdGhlIG5ldyBzeW1ib2wuICAqLwotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9ICc6JzsKLSAgaW5wdXRfbGluZV9wb2ludGVyICs9IGFkdmFuY2VfaV9sX3BfYnk7Ci0gIGMgPSAqIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICAKLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIERldGVybWluZXMgaWYgdGhlIHN5bWJvbCBzdGFydGluZyBhdCBTVEFSVCBhbmQgZW5kaW5nIGluCi0gICBhIGNvbG9uIHRoYXQgd2FzIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IElOUFVUX0xJTkVfUE9JTlRFUgotICAgKGJ1dCB3aGljaCBoYXMgbm93IGJlZW4gcmVwbGFjZWQgYnUgYSBOVUwpIGlzIGluIGZhY3QgYW4KLSAgIExESTo4LCBMREk6MjAsIExESTozMiwgQ0FMTDpELiBKTVA6RCwgUkVUOkQgb3IgQmNjOkQgaW5zdHJ1Y3Rpb24uCi0gICBJZiBpdCBpcywgdGhlbiBpdCByZXN0b3JlcyB0aGUgY29sb24sIGFkdmFuY2VzIElOUFVUX0xJTkVfUE9JTlRFUgotICAgdG8gdGhlIHJlYWwgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi9zeW1ib2wsIGFuZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIKLSAgIHRoYXQgcmVhbGx5IHRlcm1pbmF0ZWQgdGhlIHN5bWJvbC4gIE90aGVyd2lzZSBpdCByZXR1cm5zIDAuICAqLwotY2hhcgotZnIzMF9pc19jb2xvbl9pbnNuIChzdGFydCkKLSAgICAgY2hhciAqICBzdGFydDsKLXsKLSAgY2hhciAqIGlfbF9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc3ltYm9sIHBhcnNlZCBzbyBmYXIgaXMgJ2xkaScgICovCi0gIGlmICggICAoc3RhcnRbMF0gIT0gJ2wnICYmIHN0YXJ0WzBdICE9ICdMJykKLSAgICAgIHx8IChzdGFydFsxXSAhPSAnZCcgJiYgc3RhcnRbMV0gIT0gJ0QnKQotICAgICAgfHwgKHN0YXJ0WzJdICE9ICdpJyAmJiBzdGFydFsyXSAhPSAnSScpCi0gICAgICB8fCBzdGFydFszXSAhPSAwKQotICAgIHsKLSAgICAgIC8qIE5vcGUgLSBjaGVjayB0byBzZWUgYSAnZCcgZm9sbG93cyB0aGUgY29sb24uICAqLwotICAgICAgaWYgKCAgIChpX2xfcFsxXSA9PSAnZCcgfHwgaV9sX3BbMV0gPT0gJ0QnKQotCSAgJiYgKGlfbF9wWzJdID09ICcgJyB8fCBpX2xfcFsyXSA9PSAnXHQnIHx8IGlfbF9wWzJdID09ICdcbicpKQotCXsKLQkgIC8qIFl1cCAtIGl0IG1pZ2h0IGJlIGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb24uICAqLwotCSAgaW50ICAgICAgICAgICBpOwotCSAgc3RhdGljIGNoYXIgKiBkZWxheV9pbnNucyBbXSA9Ci0JICB7Ci0JICAgICJjYWxsIiwgImptcCIsICJyZXQiLCAiYnJhIiwgImJubyIsCi0JICAgICJiZXEiLCAgImJuZSIsICJiYyIsICAiYm5jIiwgImJuIiwKLQkgICAgImJwIiwgICAiYnYiLCAgImJudiIsICJibHQiLCAiYmdlIiwKLQkgICAgImJsZSIsICAiYmd0IiwgImJscyIsICJiaGkiCi0JICB9OwotCi0JICBmb3IgKGkgPSBzaXplb2YgKGRlbGF5X2luc25zKSAvIHNpemVvZiAoZGVsYXlfaW5zbnNbMF0pOyBpLS07KQotCSAgICB7Ci0JICAgICAgY2hhciAqIGluc24gPSBkZWxheV9pbnNuc1tpXTsKLQkgICAgICBpbnQgICAgbGVuICA9IHN0cmxlbiAoaW5zbik7Ci0KLQkgICAgICBpZiAoc3RhcnQgW2xlbl0gIT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgCi0JICAgICAgd2hpbGUgKGxlbiAtLSkKLQkJaWYgKHRvbG93ZXIgKHN0YXJ0IFtsZW5dKSAhPSBpbnNuIFtsZW5dKQotCQkgIGJyZWFrOwotCSAgICAgIAotCSAgICAgIGlmIChsZW4gPT0gLTEpCi0JCXJldHVybiByZXN0b3JlX2NvbG9uICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogTm9wZSAtIGl0IGlzIGEgbm9ybWFsIGxhYmVsLiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnOCcgKi8KLSAgaWYgKGlfbF9wWzFdID09ICc4JyAmJiAoaV9sX3BbMl0gPT0gJyAnIHx8IGlfbF9wWzJdID09ICdcdCcpKQotICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgyKTsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnMjAnICovCi0gIGVsc2UgaWYgKGlfbF9wWzFdID09ICcyJyAmJiBpX2xfcFsyXSA9PScwJyAmJiAoaV9sX3BbM10gPT0gJyAnIHx8IGlfbF9wWzNdID09ICdcdCcpKQotICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgzKTsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnMzInICovCi0gIGVsc2UgaWYgKGlfbF9wWzFdID09ICczJyAmJiBpX2xfcFsyXSA9PScyJyAmJiAoaV9sX3BbM10gPT0gJyAnIHx8IGlfbF9wWzNdID09ICdcdCcpKQotICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgzKTsKLQotICByZXR1cm4gMDsKLX0KLQotYm9vbGVhbgotZnIzMF9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKiBmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0jaWYgMCAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWZyMzAuaCBiL2dhcy9jb25maWcvdGMtZnIzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjcyZDhiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZnIzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogdGMtZnIzMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1mcjMwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19GUjMwCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotLyogbGVhZGluZyBzcGFjZSBzbyB3aWxsIGNvbXBpbGUgd2l0aCBjYyAqLwotICNlcnJvciBGUjMwIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkZSMzAgR0FTICIKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfZnIzMAotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWZyMzAiCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLWxvbmcgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCkpOwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gKEZJWFAsIFNFQykKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9hcHBseV9maXgzIGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMKLQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgZnIzMF9maXhfYWRqdXN0YWJsZSAoZml4UCkKLWV4dGVybiBib29sZWFuIGZyMzBfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gZW1pdCB2YXJpb3VzIHJlbG9jcyB3ZSBvdGhlcndpc2Ugd291bGRuJ3QuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgZnIzMF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IGZyMzBfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2RlZmluZSB0Y19nZW5fcmVsb2MgZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jCi0KLS8qIENhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKCksIG5vdCBtZF9wY3JlbF9mcm9tKCkuICAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gKEZJWFAsIFNFQykKLWV4dGVybiBsb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLQotLyogRm9yIDggdnMgMTYgdnMgMzIgYml0IGJyYW5jaCBzZWxlY3Rpb24uICAqLwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLQotLyogV2UgbmVlZCBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgVENfU1RBUlRfTEFCRUwgbWFjcm8gc28gdGhhdCB3ZQotICAgYWxsb3cgdGhlIExESTo4LCBMREk6MjAsIExESTozMiBhbmQgZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMgdG8gYmUKLSAgIHBhcnNlZCBhcyBzdWNoLiAgTm90ZSAtIGluIGEgSE9SUklCTEUgSEFDSywgd2UgbWFrZSB1c2Ugb2YgdGhlCi0gICBrbm93bGVkZ2UgdGhhdCB0aGlzIG1hcmNvIGlzIG9ubHkgZXZlciBldmFsdWF0ZWQgaW4gb25lIHBsYWNlCi0gICAocmVhZF9hX3NvdXJjZV9maWxlIGluIHJlYWQuYykgd2hlcmUgd2UgY2FuIGFjY2VzcyB0aGUgbG9jYWwKLSAgIHZhcmlhYmxlICdzJyAtIHRoZSBzdGFydCBvZiB0aGUgc3ltYm9sIHRoYXQgd2FzIHRlcm1pbmF0ZWQgYnkKLSAgICdjaGFyYWN0ZXInLiAgQWxzbyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZgotICAgdGhlIGxvY2FsIHZhcmlhYmxlICdjJyB3aGljaCBpcyBwYXNzZWQgdG8gdGhpcyBtYWNybyBhcyAnY2hhcmFjdGVyJy4gICovCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoYXJhY3RlciwgaV9sX3ApCQkJXAotICAoKGNoYXJhY3RlcikgIT0gJzonID8gMCA6IChjaGFyYWN0ZXIgPSBmcjMwX2lzX2NvbG9uX2luc24gKHMpKSA/IDAgOiAoKGNoYXJhY3RlciA9ICc6JyksIDEpKQotZXh0ZXJuIGNoYXIgZnIzMF9pc19jb2xvbl9pbnNuIFBBUkFNUyAoKGNoYXIgKikpOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmMgYi9nYXMvY29uZmlnL3RjLWdlbmVyaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuYworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuaCBiL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmRmMDIwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWdlbmVyaWMuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBpcyB0Yy1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yIHRhcmdldCBjcHUKLSAqIHNwZWNpZmljIGhlYWRlciBmaWxlcy4gIEl0IGlzIG15IGludGVudCB0aGF0IHRoaXMgZmlsZSBjb21waWxlLiAgSXQgaXMgYWxzbwotICogbXkgaW50ZW50IHRoYXQgdGhpcyBmaWxlIGdyb3cgaW50byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBib3RoIGEKLSAqIHRlbXBsYXRlIGZvciBwb3J0aW5nLCBhbmQgYSBzdHViIGZvciB0ZXN0aW5nLiAgeG94b3JpY2guCi0gKi8KLQotI2RlZmluZSBUQ19HRU5FUklDIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy1nZW5lcmljLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaDgzMDAuYyBiL2dhcy9jb25maWcvdGMtaDgzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2ZDZiOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWg4MzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk1ICswLDAgQEAKLS8qIHRjLWg4MzAwLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEhpdGFjaGkgSDgvMzAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0gIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgc2FjQGN5Z251cy5jb20KLSAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2RlZmluZSBoOF9vcGNvZGVzIG9wcwotI2luY2x1ZGUgIm9wY29kZS9oODMwMC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0KLXsnOycsIDB9OwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0KLXswfTsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotdm9pZCBjb25zICgpOwotCi1pbnQgSG1vZGU7Ci1pbnQgU21vZGU7Ci0jZGVmaW5lIFBTSVpFIChIbW9kZSA/IExfMzIgOiBMXzE2KQotI2RlZmluZSBETU9ERSAoTF8xNikKLSNkZWZpbmUgRFNZTU1PREUgKEhtb2RlID8gTF8yNCA6IExfMTYpCi1pbnQgYnNpemUgPSBMXzg7CQkvKiBkZWZhdWx0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKi8KLQotCi12b2lkCi1oODMwMGhtb2RlICgpCi17Ci0gIEhtb2RlID0gMTsKLSAgU21vZGUgPSAwOwotfQotCi12b2lkCi1oODMwMHNtb2RlICgpCi17Ci0gIFNtb2RlID0gMTsKLSAgSG1vZGUgPSAxOwotfQotdm9pZAotc2JyYW5jaCAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGJzaXplID0gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgcGludCAoKQotewotICBjb25zIChIbW9kZSA/IDQgOiAyKTsKLX0KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLQotICB7Img4MzAwaCIsIGg4MzAwaG1vZGUsIDB9LAotICB7Img4MzAwcyIsIGg4MzAwc21vZGUsIDB9LAotICB7InNicmFuY2giLCBzYnJhbmNoLCBMXzh9LAotICB7ImxicmFuY2giLCBzYnJhbmNoLCBMXzE2fSwKLQotICB7ImludCIsIHBpbnQsIDB9LAotICB7ImRhdGEuYiIsIGNvbnMsIDF9LAotICB7ImRhdGEudyIsIGNvbnMsIDJ9LAotICB7ImRhdGEubCIsIGNvbnMsIDR9LAotICB7ImZvcm0iLCBsaXN0aW5nX3BzaXplLCAwfSwKLSAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKgotICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgVGhpcyBzaG91bGQKLSAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCi0gICovCi0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgc3RydWN0IGg4X29wY29kZSAqb3Bjb2RlOwotICBjaGFyIHByZXZfYnVmZmVyWzEwMF07Ci0gIGludCBpZHggPSAwOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLSAgcHJldl9idWZmZXJbMF0gPSAwOwotCi0gIGZvciAob3Bjb2RlID0gaDhfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICAvKiBTdHJpcCBvZmYgYW55IC4gcGFydCB3aGVuIGluc2VydGluZyB0aGUgb3Bjb2RlIGFuZCBvbmx5IGVudGVyCi0gICAgICAgICB1bmlxdWUgY29kZXMgaW50byB0aGUgaGFzaCB0YWJsZQotICAgICAgICAgKi8KLSAgICAgIGNoYXIgKnNyYyA9IG9wY29kZS0+bmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4gKHNyYyk7Ci0gICAgICBjaGFyICpkc3QgPSBtYWxsb2MgKGxlbiArIDEpOwotICAgICAgY2hhciAqYnVmZmVyID0gZHN0OwotCi0gICAgICBvcGNvZGUtPnNpemUgPSAwOwotICAgICAgd2hpbGUgKCpzcmMpCi0JewotCSAgaWYgKCpzcmMgPT0gJy4nKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgb3Bjb2RlLT5zaXplID0gKnNyYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKmRzdCsrID0gKnNyYysrOwotCX0KLSAgICAgICpkc3QrKyA9IDA7Ci0gICAgICBpZiAoc3RyY21wIChidWZmZXIsIHByZXZfYnVmZmVyKSkKLQl7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgYnVmZmVyLCAoY2hhciAqKSBvcGNvZGUpOwotCSAgc3RyY3B5IChwcmV2X2J1ZmZlciwgYnVmZmVyKTsKLQkgIGlkeCsrOwotCX0KLSAgICAgIG9wY29kZS0+aWR4ID0gaWR4OwotCi0KLSAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyAqLwotICAgICAgb3Bjb2RlLT5ub3BlcmFuZHMgPSAwOwotICAgICAgd2hpbGUgKG9wY29kZS0+YXJncy5uaWJbb3Bjb2RlLT5ub3BlcmFuZHNdICE9IEUpCi0Jb3Bjb2RlLT5ub3BlcmFuZHMrKzsKLSAgICAgIC8qIEZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgb3Bjb2RlIGluIGJ5dGVzICovCi0gICAgICBvcGNvZGUtPmxlbmd0aCA9IDA7Ci0gICAgICB3aGlsZSAob3Bjb2RlLT5kYXRhLm5pYltvcGNvZGUtPmxlbmd0aCAqIDJdICE9IEUpCi0Jb3Bjb2RlLT5sZW5ndGgrKzsKLSAgICB9Ci0KLSAgbGlua3JlbGF4ID0gMTsKLX0KLQotCi1zdHJ1Y3QgaDhfZXhwCi17Ci0gIGNoYXIgKmVfYmVnOwotICBjaGFyICplX2VuZDsKLSAgZXhwcmVzc2lvblMgZV9leHA7Ci19OwotaW50IGRpc3ByZWc7Ci1pbnQgb3BzaXplOwkJCS8qIFNldCB3aGVuIGEgcmVnaXN0ZXIgc2l6ZSBpcyBzZWVuICovCi0KLQotc3RydWN0IGg4X29wCi17Ci0gIG9wX3R5cGUgbW9kZTsKLSAgdW5zaWduZWQgcmVnOwotICBleHByZXNzaW9uUyBleHA7Ci19OwotCi0vKgotICBwYXJzZSBvcGVyYW5kcwotICBXUkVHIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHI3LGZwLHNwCi0gIHIwbCxyMGgsLi5yN2wscjdoCi0gIEBXUkVHCi0gIEBXUkVHKwotICBALVdSRUcKLSAgI2NvbnN0Ci0gIGNjcgotKi8KLQotLyogdHJ5IGFuZCBwYXJzZSBhIHJlZyBuYW1lLCByZXR1cm5zIG51bWJlciBvZiBjaGFycyBjb25zdW1lZCAqLwotaW50Ci1wYXJzZV9yZWcgKHNyYywgbW9kZSwgcmVnLCBkaXJlY3Rpb24pCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgb3BfdHlwZSAqbW9kZTsKLSAgICAgdW5zaWduZWQgaW50ICpyZWc7Ci0gICAgIGludCBkaXJlY3Rpb247Ci0KLXsKLSAgY2hhciAqZW5kOwotICBpbnQgbGVuOwotCi0gIC8qIENyaWJiZWQgZnJvbSBnZXRfc3ltYm9sX2VuZCgpLiAgKi8KLSAgaWYgKCFpc19uYW1lX2JlZ2lubmVyICgqc3JjKSB8fCAqc3JjID09ICdcMDAxJykKLSAgICByZXR1cm4gMDsKLSAgZW5kID0gc3JjKzE7Ci0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCplbmQpIHx8ICplbmQgPT0gJ1wwMDEnKQotICAgIGVuZCsrOwotICBsZW4gPSBlbmQgLSBzcmM7Ci0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAncycgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IFBTSVpFIHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IDc7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnYycgJiYgc3JjWzFdID09ICdjJyAmJiBzcmNbMl0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gQ0NSOwotICAgICAgKnJlZyA9IDA7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICd4JyAmJiBzcmNbMl0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gRVhSOwotICAgICAgKnJlZyA9IDA7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IFBTSVpFIHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IDY7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICdyJwotICAgICAgJiYgc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzcnKQotICAgIHsKLSAgICAgICptb2RlID0gTF8zMiB8IFJFRyB8IGRpcmVjdGlvbjsKLSAgICAgICpyZWcgPSBzcmNbMl0gLSAnMCc7Ci0gICAgICBpZiAoIUhtb2RlKQotCWFzX3dhcm4gKF8oIlJlZyBub3QgdmFsaWQgZm9yIEg4LzMwMCIpKTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPj0gJzAnICYmIHNyY1sxXSA8PSAnNycpCi0gICAgewotICAgICAgKm1vZGUgPSBMXzE2IHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IHNyY1sxXSAtICcwJyArIDg7Ci0gICAgICBpZiAoIUhtb2RlKQotCWFzX3dhcm4gKF8oIlJlZyBub3QgdmFsaWQgZm9yIEg4LzMwMCIpKTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMV0gPj0gJzAnICYmIHNyY1sxXSA8PSAnNycpCi0JewotCSAgaWYgKGxlbiA9PSAzICYmIHNyY1syXSA9PSAnbCcpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IExfOCB8IFJFRyB8IGRpcmVjdGlvbjsKLQkgICAgICAqcmVnID0gKHNyY1sxXSAtICcwJykgKyA4OwotCSAgICAgIHJldHVybiBsZW47Ci0JICAgIH0KLQkgIGlmIChsZW4gPT0gMyAmJiBzcmNbMl0gPT0gJ2gnKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBMXzggfCBSRUcgfCBkaXJlY3Rpb247Ci0JICAgICAgKnJlZyA9IChzcmNbMV0gLSAnMCcpOwotCSAgICAgIHJldHVybiBsZW47Ci0JICAgIH0KLQkgIGlmIChsZW4gPT0gMikKLQkgICAgewotCSAgICAgICptb2RlID0gTF8xNiB8IFJFRyB8IGRpcmVjdGlvbjsKLQkgICAgICAqcmVnID0gKHNyY1sxXSAtICcwJyk7Ci0JICAgICAgcmV0dXJuIGxlbjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotcGFyc2VfZXhwIChzLCBvcCkKLSAgICAgY2hhciAqczsKLSAgICAgZXhwcmVzc2lvblMgKiBvcDsKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqbmV3OwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKG9wKTsKLSAgaWYgKG9wLT5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXNraXBfY29sb250aGluZyAocHRyLCBleHAsIG1vZGUpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgZXhwcmVzc2lvblMgKmV4cCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgKm1vZGU7Ci17Ci0gIGlmICgqcHRyID09ICc6JykKLSAgICB7Ci0gICAgICBwdHIrKzsKLSAgICAgICptb2RlICY9IH5TSVpFOwotICAgICAgaWYgKCpwdHIgPT0gJzgnKQotCXsKLQkgIHB0cisrOwotCSAgLyogZmYgZmlsbCBhbnkgOCBiaXQgcXVhbnRpdHkgKi8KLQkgLyogZXhwLT5YX2FkZF9udW1iZXIgLT0gMHgxMDA7Ki8KLQkgICptb2RlIHw9IExfODsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCpwdHIgPT0gJzInKQotCSAgICB7Ci0JICAgICAgKm1vZGUgfD0gTF8yNDsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnB0ciA9PSAnMycpCi0JICAgIHsKLQkgICAgICAqbW9kZSB8PSBMXzMyOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcHRyID09ICcxJykKLQkgICAgewotCSAgICAgICptb2RlIHw9IExfMTY7Ci0JICAgIH0KLQkgIHdoaWxlIChpc2RpZ2l0ICgqcHRyKSkKLQkgICAgcHRyKys7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogVGhlIG1hbnkgZm9ybXMgb2Ygb3BlcmFuZDoKLQotICAgUm4JCQlSZWdpc3RlciBkaXJlY3QKLSAgIEBSbgkJCVJlZ2lzdGVyIGluZGlyZWN0Ci0gICBAKGV4cFs6MTZdLCBSbikJUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLSAgIEBSbisKLSAgIEAtUm4KLSAgIEBhYTo4CQkJYWJzb2x1dGUgOCBiaXQKLSAgIEBhYToxNgkJCWFic29sdXRlIDE2IGJpdAotICAgQGFhCQkJYWJzb2x1dGUgMTYgYml0Ci0KLSAgICN4eFs6c2l6ZV0JCWltbWVkaWF0ZSBkYXRhCi0gICBAKGV4cDpbOF0sIHBjKQkJcGMgcmVsCi0gICBAQGFhWzo4XQkJbWVtb3J5IGluZGlyZWN0Ci0KLSAgICovCi0KLWNoYXIgKgotY29sb25tb2QyNCAob3AsIHNyYykKLSAgICAgc3RydWN0IGg4X29wICpvcDsKLSAgICAgY2hhciAqc3JjOwotCi17Ci0gIGludCBtb2RlID0gMDsKLSAgc3JjID0gc2tpcF9jb2xvbnRoaW5nIChzcmMsICZvcC0+ZXhwLCAmbW9kZSk7Ci0KLSAgaWYgKCFtb2RlKQotICAgIHsKLSAgICAgIC8qIENob29zZSBhIGRlZmF1bHQgbW9kZSAqLwotICAgICAgaWYgKG9wLT5leHAuWF9hZGRfbnVtYmVyIDwgLTMyNzY4Ci0JICB8fCBvcC0+ZXhwLlhfYWRkX251bWJlciA+IDMyNzY3KQotCXsKLQkgIGlmIChIbW9kZSkKLQkgICAgbW9kZSA9IExfMjQ7Ci0JICBlbHNlCi0JICAgIG1vZGUgPSBMXzE2OwotCX0KLSAgICAgIGVsc2UgaWYgKG9wLT5leHAuWF9hZGRfc3ltYm9sCi0JICAgICAgIHx8IG9wLT5leHAuWF9vcF9zeW1ib2wpCi0JbW9kZSA9IERTWU1NT0RFOwotICAgICAgZWxzZQotCW1vZGUgPSBETU9ERTsKLSAgICB9Ci0gIG9wLT5tb2RlIHw9IG1vZGU7Ci0gIHJldHVybiBzcmM7Ci0KLX0KLQotCi1zdGF0aWMgdm9pZAotZ2V0X29wZXJhbmQgKHB0ciwgb3AsIGRzdCwgZGlyZWN0aW9uKQotICAgICBjaGFyICoqcHRyOwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wOwotICAgICB1bnNpZ25lZCBpbnQgZHN0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBkaXJlY3Rpb247Ci17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIG9wX3R5cGUgbW9kZTsKLSAgdW5zaWduZWQgaW50IG51bTsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBvcC0+bW9kZSA9IEU7Ci0KLSAgLyogR3Jvc3MuICBHcm9zcy4gIGxkbSBhbmQgc3RtIGhhdmUgYSBmb3JtYXQgbm90IGVhc2lseSBoYW5kbGVkCi0gICAgIGJ5IGdldF9vcGVyYW5kLiAgV2UgZGVhbCB3aXRoIGl0IGV4cGxpY2l0bHkgaGVyZS4gICovCi0gIGlmIChzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA9PSAncicgJiYgaXNkaWdpdChzcmNbMl0pCi0gICAgICAmJiBzcmNbM10gPT0gJy0nICYmIHNyY1s0XSA9PSAnZScgJiYgc3JjWzVdID09ICdyJyAmJiBpc2RpZ2l0KHNyY1s2XSkpCi0gICAgewotICAgICAgaW50IGxvdywgaGlnaDsKLQotICAgICAgbG93ID0gc3JjWzJdIC0gJzAnOwotICAgICAgaGlnaCA9IHNyY1s2XSAtICcwJzsKLQotICAgICAgaWYgKGhpZ2ggPCBsb3cpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGxpc3QgZm9yIGxkbS9zdG1cbiIpKTsKLQotICAgICAgaWYgKGxvdyAlIDIpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGxpc3QgZm9yIGxkbS9zdG1cbiIpKTsKLQotICAgICAgaWYgKGhpZ2ggLSBsb3cgPiAzKQotCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iKSk7Ci0KLSAgICAgIGlmIChoaWdoIC0gbG93ICE9IDEKLQkgICYmIGxvdyAlIDQpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGxpc3QgZm9yIGxkbS9zdG1cbiIpKTsKLQotICAgICAgLyogRXZlbiBzaWNrZXIuICBXZSBlbmNvZGUgdHdvIHJlZ2lzdGVycyBpbnRvIG9wLT5yZWcuICBPbmUKLQkgZm9yIHRoZSBsb3cgcmVnaXN0ZXIgdG8gc2F2ZSwgdGhlIG90aGVyIGZvciB0aGUgaGlnaAotCSByZWdpc3RlciB0byBzYXZlOyAgd2UgYWxzbyBzZXQgdGhlIGhpZ2ggYml0IGluIG9wLT5yZWcKLQkgc28gd2Uga25vdyB0aGlzIGlzICJ2ZXJ5IHNwZWNpYWwiLiAgKi8KLSAgICAgIG9wLT5yZWcgPSAweDgwMDAwMDAwIHwgKGhpZ2ggPDwgOCkgfCBsb3c7Ci0gICAgICBvcC0+bW9kZSA9IFJFRzsKLSAgICAgICpwdHIgPSBzcmMgKyA3OwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm9wLT5tb2RlLCAmb3AtPnJlZywgZGlyZWN0aW9uKTsKLSAgaWYgKGxlbikKLSAgICB7Ci0gICAgICAqcHRyID0gc3JjICsgbGVuOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKnNyYyA9PSAnQCcpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICBpZiAoKnNyYyA9PSAnQCcpCi0JewotCSAgc3JjKys7Ci0JICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotCi0JICBzcmMgPSBza2lwX2NvbG9udGhpbmcgKHNyYywgJm9wLT5leHAsICZvcC0+bW9kZSk7Ci0KLQkgICpwdHIgPSBzcmM7Ci0KLQkgIG9wLT5tb2RlID0gTUVNSU5EOwotCSAgcmV0dXJuOwotCi0JfQotCi0KLSAgICAgIGlmICgqc3JjID09ICctJykKLQl7Ci0JICBzcmMrKzsKLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm51bSwgZGlyZWN0aW9uKTsKLQkgIGlmIChsZW4gPT0gMCkKLQkgICAgewotCSAgICAgIC8qIE9vcHMsIG5vdCBhIHJlZyBhZnRlciBhbGwsIG11c3QgYmUgb3JkaW5hcnkgZXhwICovCi0JICAgICAgc3JjLS07Ci0JICAgICAgLyogbXVzdCBiZSBhIHN5bWJvbCAqLwotCSAgICAgIG9wLT5tb2RlID0gQUJTIHwgUFNJWkUgfCBkaXJlY3Rpb247Ci0JICAgICAgKnB0ciA9IHNraXBfY29sb250aGluZyAocGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKSwKLQkJCQkgICAgICAmb3AtPmV4cCwgJm9wLT5tb2RlKTsKLQotCSAgICAgIHJldHVybjsKLQotCi0JICAgIH0KLQotCi0JICBpZiAoKG1vZGUgJiBTSVpFKSAhPSBQU0laRSkKLQkgICAgYXNfYmFkIChfKCJXcm9uZyBzaXplIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIGFyY2hpdGVjdHVyZS4iKSk7Ci0JICBvcC0+bW9kZSA9IFJEREVDOwotCSAgb3AtPnJlZyA9IG51bTsKLQkgICpwdHIgPSBzcmMgKyBsZW47Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKCpzcmMgPT0gJygnKQotCXsKLQkgIC8qIERpc3AgKi8KLQkgIHNyYysrOwotCi0JICAvKiBTdGFydCBvZmYgYXNzdW1pbmcgYSAxNiBiaXQgb2Zmc2V0ICovCi0KLQotCSAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKLQotCSAgc3JjID0gY29sb25tb2QyNCAob3AsIHNyYyk7Ci0KLQkgIGlmICgqc3JjID09ICcpJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIG9wLT5tb2RlIHw9IEFCUyB8IGRpcmVjdGlvbjsKLQkgICAgICAqcHRyID0gc3JjOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpZiAoKnNyYyAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCByZWcxNikiKSk7Ci0JICAgICAgcmV0dXJuOwotCi0JICAgIH0KLQkgIHNyYysrOwotCi0JICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZvcC0+cmVnLCBkaXJlY3Rpb24pOwotCSAgaWYgKGxlbiA9PSAwIHx8ICEobW9kZSAmIFJFRykpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCByZWcxNikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBvcC0+bW9kZSB8PSBESVNQIHwgZGlyZWN0aW9uOwotCSAgZGlzcHJlZyA9IG9wLT5yZWc7Ci0JICBzcmMgKz0gbGVuOwotCSAgc3JjID0gc2tpcF9jb2xvbnRoaW5nIChzcmMsICZvcC0+ZXhwLCAmb3AtPm1vZGUpOwotCi0JICBpZiAoKnNyYyAhPSAnKScgJiYgJygnKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgcmVnMTYpIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgKnB0ciA9IHNyYyArIDE7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZudW0sIGRpcmVjdGlvbik7Ci0KLSAgICAgIGlmIChsZW4pCi0JewotCSAgc3JjICs9IGxlbjsKLQkgIGlmICgqc3JjID09ICcrJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIGlmICgobW9kZSAmIFNJWkUpICE9IFBTSVpFKQotCQlhc19iYWQgKF8oIldyb25nIHNpemUgcG9pbnRlciByZWdpc3RlciBmb3IgYXJjaGl0ZWN0dXJlLiIpKTsKLQkgICAgICBvcC0+bW9kZSA9IFJTSU5DOwotCSAgICAgIG9wLT5yZWcgPSBudW07Ci0JICAgICAgKnB0ciA9IHNyYzsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGlmICgobW9kZSAmIFNJWkUpICE9IFBTSVpFKQotCSAgICBhc19iYWQgKF8oIldyb25nIHNpemUgcG9pbnRlciByZWdpc3RlciBmb3IgYXJjaGl0ZWN0dXJlLiIpKTsKLQotCSAgb3AtPm1vZGUgPSBkaXJlY3Rpb24gfCBJTkQgfCBQU0laRTsKLQkgIG9wLT5yZWcgPSBudW07Ci0JICAqcHRyID0gc3JjOwotCi0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG11c3QgYmUgYSBzeW1ib2wgKi8KLQotCSAgb3AtPm1vZGUgPSBBQlMgfCBkaXJlY3Rpb247Ci0JICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotCi0JICAqcHRyID0gY29sb25tb2QyNCAob3AsIHNyYyk7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0KLSAgaWYgKCpzcmMgPT0gJyMnKQotICAgIHsKLSAgICAgIHNyYysrOwotICAgICAgb3AtPm1vZGUgPSBJTU07Ci0gICAgICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotICAgICAgKnB0ciA9IHNraXBfY29sb250aGluZyAoc3JjLCAmb3AtPmV4cCwgJm9wLT5tb2RlKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoc3JjLCAibWFjaCIsIDQpID09IDAKLQkgICB8fCBzdHJuY21wIChzcmMsICJtYWNsIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBvcC0+cmVnID0gc3JjWzNdID09ICdsJzsKLSAgICAgIG9wLT5tb2RlID0gTUFDUkVHOwotICAgICAgKnB0ciA9IHNyYyArIDQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKLSAgICAgIC8qIFRyYWlsaW5nICc6JyBzaXplID8gKi8KLSAgICAgIGlmICgqc3JjID09ICc6JykKLQl7Ci0JICBpZiAoc3JjWzFdID09ICcxJyAmJiBzcmNbMl0gPT0gJzYnKQotCSAgICB7Ci0JICAgICAgb3AtPm1vZGUgPSBQQ1JFTCB8IExfMTY7Ci0JICAgICAgc3JjICs9IDM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNyY1sxXSA9PSAnOCcpCi0JICAgIHsKLQkgICAgICBvcC0+bW9kZSA9IFBDUkVMIHwgTF84OwotCSAgICAgIHNyYyArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdCA6OCBvciA6MTYgaGVyZSIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcC0+bW9kZSA9IFBDUkVMIHwgYnNpemU7Ci0JfQotICAgICAgKnB0ciA9IHNyYzsKLSAgICB9Ci19Ci0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAobm9wZXJhbmRzLCBvcF9lbmQsIG9wZXJhbmQpCi0gICAgIHVuc2lnbmVkIGludCBub3BlcmFuZHM7Ci0gICAgIGNoYXIgKm9wX2VuZDsKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOwotewotICBjaGFyICpwdHIgPSBvcF9lbmQ7Ci0KLSAgc3dpdGNoIChub3BlcmFuZHMpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIG9wZXJhbmRbMF0ubW9kZSA9IDA7Ci0gICAgICBvcGVyYW5kWzFdLm1vZGUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCwgU1JDKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQl7Ci0JICBwdHIrKzsKLQkgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSwgRFNUKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3BlcmFuZFsxXS5tb2RlID0gMDsKLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwLCBTUkMpOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxLCBEU1QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogUGFzc2VkIGEgcG9pbnRlciB0byBhIGxpc3Qgb2Ygb3Bjb2RlcyB3aGljaCB1c2UgZGlmZmVyZW50Ci0gICBhZGRyZXNzaW5nIG1vZGVzLCByZXR1cm4gdGhlIG9wY29kZSB3aGljaCBtYXRjaGVzIHRoZSBvcGNvZGVzCi0gICBwcm92aWRlZAotICAgKi8KLXN0YXRpYwotc3RydWN0IGg4X29wY29kZSAqCi1nZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZHMsIHNpemUpCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKm9wY29kZTsKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kczsKLSAgICAgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKnRoaXNfdHJ5ID0gb3Bjb2RlOwotICBpbnQgZm91bmQgPSAwOwotCi0gIHVuc2lnbmVkIGludCB0aGlzX2luZGV4ID0gb3Bjb2RlLT5pZHg7Ci0KLSAgLyogVGhlcmUncyBvbmx5IG9uZSBsZG0vc3RtIGFuZCBpdCdzIGVhc2llciB0byBqdXN0Ci0gICAgIGdldCBvdXQgcXVpY2sgZm9yIHRoZW0uICAqLwotICBpZiAoc3RyY21wIChvcGNvZGUtPm5hbWUsICJzdG0ubCIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAob3Bjb2RlLT5uYW1lLCAibGRtLmwiKSA9PSAwKQotICAgIHJldHVybiB0aGlzX3RyeTsKLQotICB3aGlsZSAodGhpc19pbmRleCA9PSBvcGNvZGUtPmlkeCAmJiAhZm91bmQpCi0gICAgewotICAgICAgZm91bmQgPSAxOwotCi0gICAgICB0aGlzX3RyeSA9IG9wY29kZSsrOwotICAgICAgaWYgKHRoaXNfdHJ5LT5ub3BlcmFuZHMgPT0gMCkKLQl7Ci0JICBpbnQgdGhpc19zaXplOwotCi0JICB0aGlzX3NpemUgPSB0aGlzX3RyeS0+aG93ICYgU047Ci0JICBpZiAodGhpc19zaXplICE9IHNpemUgJiYgKHRoaXNfc2l6ZSAhPSBTQiB8fCBzaXplICE9IFNOKSkKLQkgICAgZm91bmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgaSA8IHRoaXNfdHJ5LT5ub3BlcmFuZHMgJiYgZm91bmQ7IGkrKykKLQkgICAgewotCSAgICAgIG9wX3R5cGUgb3AgPSB0aGlzX3RyeS0+YXJncy5uaWJbaV07Ci0JICAgICAgaW50IHggPSBvcGVyYW5kc1tpXS5tb2RlOwotCi0JICAgICAgaWYgKChvcCAmIChESVNQIHwgUkVHKSkgPT0gKERJU1AgfCBSRUcpCi0JCSAgJiYgKCh4ICYgKERJU1AgfCBSRUcpKSA9PSAoRElTUCB8IFJFRykpKQotCQl7Ci0JCSAgZGlzcHJlZyA9IG9wZXJhbmRzW2ldLnJlZzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wICYgUkVHKQotCQl7Ci0JCSAgaWYgKCEoeCAmIFJFRykpCi0JCSAgICBmb3VuZCA9IDA7Ci0KLQkJICBpZiAoeCAmIExfUCkKLQkJICAgIHggPSAoeCAmIH5MX1ApIHwgKEhtb2RlID8gTF8zMiA6IExfMTYpOwotCQkgIGlmIChvcCAmIExfUCkKLQkJICAgIG9wID0gKG9wICYgfkxfUCkgfCAoSG1vZGUgPyBMXzMyIDogTF8xNik7Ci0KLQkJICBvcHNpemUgPSBvcCAmIFNJWkU7Ci0KLQkJICAvKiBUaGUgc2l6ZSBvZiB0aGUgcmVnIGlzIHYgaW1wb3J0YW50ICovCi0JCSAgaWYgKChvcCAmIFNJWkUpICE9ICh4ICYgU0laRSkpCi0JCSAgICBmb3VuZCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiBBQlNKTVApICYmICh4ICYgQUJTKSkKLQkJewotCQkgIG9wZXJhbmRzW2ldLm1vZGUgJj0gfkFCUzsKLQkJICBvcGVyYW5kc1tpXS5tb2RlIHw9IEFCU0pNUDsKLQkJICAvKiBCdXQgaXQgbWF5IG5vdCBiZSAyNCBiaXRzIGxvbmcgKi8KLQkJICBpZiAoIUhtb2RlKQotCQkgICAgewotCQkgICAgICBvcGVyYW5kc1tpXS5tb2RlICY9IH5TSVpFOwotCQkgICAgICBvcGVyYW5kc1tpXS5tb2RlIHw9IExfMTY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiAoS0JJVCB8IERCSVQpKSAmJiAoeCAmIElNTSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIG9rIGlmIHRoZSBpbW1lZGlhdGUgdmFsdWUgaXMgc2Vuc2libGUgKi8KLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wICYgUENSRUwpCi0JCXsKLQkJICAvKiBUaGUgc2l6ZSBvZiB0aGUgZGlzcGxhY2VtZW50IGlzIGltcG9ydGFudCAqLwotCQkgIGlmICgob3AgJiBTSVpFKSAhPSAoeCAmIFNJWkUpKQotCQkgICAgZm91bmQgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wICYgKERJU1AgfCBJTU0gfCBBQlMpKQotCQkgICAgICAgJiYgKG9wICYgKERJU1AgfCBJTU0gfCBBQlMpKSA9PSAoeCAmIChESVNQIHwgSU1NIHwgQUJTKSkpCi0JCXsKLQkJICAvKiBQcm9tb3RlIGEgTF8yNCB0byBMXzMyIGlmIGl0IG1ha2VzIHVzIG1hdGNoLiAgKi8KLQkJICBpZiAoKHggJiBMXzI0KSAmJiAob3AgJiBMXzMyKSkKLQkJICAgIHsKLQkJICAgICAgeCAmPSB+TF8yNDsKLQkJICAgICAgeCB8PSBMXzMyOwotCQkgICAgfQotCQkgIC8qIFByb21vdGUgYW4gTDggdG8gTF8xNiBpZiBpdCBtYWtlcyB1cyBtYXRjaC4gICovCi0JCSAgaWYgKG9wICYgQUJTICYmIG9wICYgTF84ICYmIG9wICYgRElTUCkgCi0JCSAgICB7Ci0JCSAgICAgIGlmICh4ICYgTF8xNikKLQkJCWZvdW5kPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCh4ICYgU0laRSkgIT0gMAotCQkJICAgJiYgKChvcCAmIFNJWkUpICE9ICh4ICYgU0laRSkpKQotCQkgICAgZm91bmQgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wICYgTUFDUkVHKSAhPSAoeCAmIE1BQ1JFRykpCi0JCXsKLQkJICBmb3VuZCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiBNT0RFKSAhPSAoeCAmIE1PREUpKQotCQl7Ci0JCSAgZm91bmQgPSAwOwotCQl9CQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0aGlzX3RyeTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgd2lkdGgsIHN0cmluZykKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOwotICAgICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKG9wZXJhbmQtPmV4cC5YX2FkZF9zeW1ib2wgPT0gMAotICAgICAgJiYgb3BlcmFuZC0+ZXhwLlhfb3Bfc3ltYm9sID09IDApCi0gICAgewotCi0gICAgICAvKiBObyBzeW1ib2wgaW52b2x2ZWQsIGxldCdzIGxvb2sgYXQgb2Zmc2V0LCBpdCdzIGRhbmdlcm91cyBpZiBhbnkgb2YKLQkgdGhlIGhpZ2ggYml0cyBhcmUgbm90IDAgb3IgZmYncywgZmluZCBvdXQgYnkgb3Jpbmcgb3IgYW5kaW5nIHdpdGgKLQkgdGhlIHdpZHRoIGFuZCBzZWVpbmcgaWYgdGhlIGFuc3dlciBpcyAwIG9yIGFsbCBmcyovCi0gICAgICAKLSAgICAgIGlmICgob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciAmIH53aWR0aCkgIT0gMCAmJgotCSAgKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgfCB3aWR0aCkgIT0gKH4wKSkKLQl7Ci0JICBpZiAod2lkdGggPT0gMjU1IAotCSAgICAgICYmIChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICYgMHhmZjAwKSA9PSAweGZmMDApCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IGlnbm9yZSB0aGlzIG9uZSAtIHdoaWNoIGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8KLQkJIGZpdCBhIDE2IGJpdCBhZGRyZXNzIHRydW5jYXRlZCBpbnRvIGFuIDggYml0IGFkZHJlc3MKLQkJIG9mIHNvbWV0aGluZyBsaWtlIGJzZXQuICAqLwotCSAgICB9Ci0JICBlbHNlIAotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygib3BlcmFuZCAlczB4JWx4IG91dCBvZiByYW5nZS4iKSwgc3RyaW5nLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotfQotCi0vKiBSRUxBWE1PREUgaGFzIG9uZSBvZiAzIHZhbHVlczoKLQotICAgMCBPdXRwdXQgYSAibm9ybWFsIiByZWxvYywgbm8gcmVsYXhpbmcgcG9zc2libGUgZm9yIHRoaXMgaW5zbi9yZWxvYwotCi0gICAxIE91dHB1dCBhIHJlbGF4YWJsZSAyNGJpdCBhYnNvbHV0ZSBtb3YudyBhZGRyZXNzIHJlbG9jYXRpb24KLSAgICAgKG1heSByZWxheCBpbnRvIGEgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcykuCi0KLSAgIDIgT3V0cHV0IGEgcmVsYXhhYmxlIDE2LzI0IGFic29sdXRlIG1vdi5iIGFkZHJlc3MgcmVsb2NhdGlvbgotICAgICAobWF5IHJlbGF4IGludG8gYW4gOGJpdCBhYnNvbHV0ZSBhZGRyZXNzKS4gICovCi0KLXN0YXRpYyB2b2lkCi1kb19hX2ZpeF9pbW0gKG9mZnNldCwgb3BlcmFuZCwgcmVsYXhtb2RlKQotICAgICBpbnQgb2Zmc2V0OwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Ci0gICAgIGludCByZWxheG1vZGU7Ci17Ci0gIGludCBpZHg7Ci0gIGludCBzaXplOwotICBpbnQgd2hlcmU7Ci0KLQotICBjaGFyICp0ID0gb3BlcmFuZC0+bW9kZSAmIElNTSA/ICIjIiA6ICJAIjsKLQotICBpZiAob3BlcmFuZC0+ZXhwLlhfYWRkX3N5bWJvbCA9PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKmJ5dGVzID0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQ7Ci0gICAgICBzd2l0Y2ggKG9wZXJhbmQtPm1vZGUgJiBTSVpFKQotCXsKLQljYXNlIExfMjoKLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4MywgdCk7Ci0JICBieXRlc1swXSB8PSAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcikgPDwgNDsKLQkgIGJyZWFrOwotCWNhc2UgTF8zOgotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHg3LCB0KTsKLQkgIGJ5dGVzWzBdIHw9IChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKSA8PCA0OwotCSAgYnJlYWs7Ci0JY2FzZSBMXzg6Ci0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweGZmLCB0KTsKLQkgIGJ5dGVzWzBdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcjsKLQkgIGJyZWFrOwotCWNhc2UgTF8xNjoKLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4ZmZmZiwgdCk7Ci0JICBieXRlc1swXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gODsKLQkgIGJ5dGVzWzFdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAwOwotCSAgYnJlYWs7Ci0JY2FzZSBMXzI0OgotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHhmZmZmZmYsIHQpOwotCSAgYnl0ZXNbMF0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDE2OwotCSAgYnl0ZXNbMV0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDg7Ci0JICBieXRlc1syXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBMXzMyOgotCSAgLyogVGhpcyBzaG91bGQgYmUgZG9uZSB3aXRoIGJmZCAqLwotCSAgYnl0ZXNbMF0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDI0OwotCSAgYnl0ZXNbMV0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDE2OwotCSAgYnl0ZXNbMl0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDg7Ci0JICBieXRlc1szXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMDsKLQkgIGJyZWFrOwotCX0KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAob3BlcmFuZC0+bW9kZSAmIFNJWkUpCi0JewotCi0JY2FzZSBMXzI0OgotCWNhc2UgTF8zMjoKLQkgIHNpemUgPSA0OwotCSAgd2hlcmUgPSAob3BlcmFuZC0+bW9kZSAmIFNJWkUpID09IExfMjQgPyAtMSA6IDA7Ci0JICBpZiAocmVsYXhtb2RlID09IDIpCi0JICAgIGlkeCA9IFJfTU9WMjRCMTsKLQkgIGVsc2UgaWYgKHJlbGF4bW9kZSA9PSAxKQotCSAgICBpZHggPSBSX01PVkwxOwotCSAgZWxzZQotCSAgICBpZHggPSBSX1JFTExPTkc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfYmFkKF8oIkNhbid0IHdvcmsgb3V0IHNpemUgb2Ygb3BlcmFuZC5cbiIpKTsKLQljYXNlIExfMTY6Ci0JICBzaXplID0gMjsKLQkgIHdoZXJlID0gMDsKLQkgIGlmIChyZWxheG1vZGUgPT0gMikKLQkgICAgaWR4ID0gUl9NT1YxNkIxOwotCSAgZWxzZQotCSAgICBpZHggPSBSX1JFTFdPUkQ7Ci0JICBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID0gKHNob3J0KW9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXI7Ci0JICBicmVhazsKLQljYXNlIExfODoKLQkgIHNpemUgPSAxOwotCSAgd2hlcmUgPSAwOwotCSAgaWR4ID0gUl9SRUxCWVRFOwotCSAgLyogVGhpcyB1c2VkIHRvIHVzZSBhIGNhc3QgdG8gY2hhciwgYnV0IHRoYXQgZmFpbHMgaWYgY2hhciBpcyBhbgotCSAgICAgdW5zaWduZWQgdHlwZS4gIFdlIGNhbid0IHVzZSBgc2lnbmVkIGNoYXInLCBhcyB0aGF0IGlzbid0IHZhbGlkCi0JICAgICBLJlIgQy4gICovCi0JICBpZiAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciAmIDB4ODApCi0JICAgIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgfD0gKChvZmZzZXRUKSAtMSA8PCA4KTsKLQkgIGVsc2UKLQkgICAgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciAmPSAweGZmOwotCX0KLQotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICBvZmZzZXQgKyB3aGVyZSwKLQkJICAgc2l6ZSwKLQkJICAgJm9wZXJhbmQtPmV4cCwKLQkJICAgMCwKLQkJICAgaWR4KTsKLSAgICB9Ci0KLX0KLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotc3RhdGljIHZvaWQKLWJ1aWxkX2J5dGVzICh0aGlzX3RyeSwgb3BlcmFuZCkKLSAgICAgc3RydWN0IGg4X29wY29kZSAqdGhpc190cnk7Ci0gICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgY2hhciAqb3V0cHV0ID0gZnJhZ19tb3JlICh0aGlzX3RyeS0+bGVuZ3RoKTsKLSAgb3BfdHlwZSAqbmliYmxlX3B0ciA9IHRoaXNfdHJ5LT5kYXRhLm5pYjsKLSAgb3BfdHlwZSBjOwotICB1bnNpZ25lZCBpbnQgbmliYmxlX2NvdW50ID0gMDsKLSAgaW50IGFic2F0OwotICBpbnQgaW1tYXQ7Ci0gIGludCBuaWI7Ci0gIGludCBtb3ZiID0gMDsKLSAgY2hhciBhc25pYmJsZXNbMzBdOwotICBjaGFyICpwID0gYXNuaWJibGVzOwotCi0gIGlmICghKHRoaXNfdHJ5LT5pbmJhc2UgfHwgSG1vZGUpKQotICAgIGFzX3dhcm4gKF8oIk9wY29kZSBgJXMnIHdpdGggdGhlc2Ugb3BlcmFuZCB0eXBlcyBub3QgYXZhaWxhYmxlIGluIEg4LzMwMCBtb2RlIiksCi0JICAgICB0aGlzX3RyeS0+bmFtZSk7Ci0KLSAgd2hpbGUgKCpuaWJibGVfcHRyICE9IEUpCi0gICAgewotICAgICAgaW50IGQ7Ci0gICAgICBjID0gKm5pYmJsZV9wdHIrKzsKLQotICAgICAgZCA9IChjICYgKERTVCB8IFNSQ19JTl9EU1QpKSAhPSAwOwotCi0gICAgICBpZiAoYyA8IDE2KQotCXsKLQkgIG5pYiA9IGM7Ci0JfQotICAgICAgZWxzZQotCXsKLQotCSAgaWYgKGMgJiAoUkVHIHwgSU5EIHwgSU5DIHwgREVDKSkKLQkgICAgewotCSAgICAgIG5pYiA9IG9wZXJhbmRbZF0ucmVnOwotCSAgICB9Ci0JICBlbHNlIGlmICgoYyAmIERJU1BSRUcpID09IChESVNQUkVHKSkKLQkgICAgewotCSAgICAgIG5pYiA9IGRpc3ByZWc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiAgQUJTICkKLQkgICAgewotCSAgICAgIG9wZXJhbmRbZF0ubW9kZSA9IGM7Ci0JICAgICAgYWJzYXQgPSBuaWJibGVfY291bnQgLyAyOwotCSAgICAgIG5pYiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiAoSU1NIHwgUENSRUwgfCBBQlMgfCBBQlNKTVAgfCBESVNQKSkKLQkgICAgewotCSAgICAgIG9wZXJhbmRbZF0ubW9kZSA9IGM7Ci0JICAgICAgaW1tYXQgPSBuaWJibGVfY291bnQgLyAyOwotCSAgICAgIG5pYiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiBJR05PUkUpCi0JICAgIHsKLQkgICAgICBuaWIgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChjICYgREJJVCkKLQkgICAgewotCSAgICAgIHN3aXRjaCAob3BlcmFuZFswXS5leHAuWF9hZGRfbnVtYmVyKQotCQl7Ci0JCWNhc2UgMToKLQkJICBuaWIgPSBjOwotCQkgIGJyZWFrOwotCQljYXNlIDI6Ci0JCSAgbmliID0gMHg4IHwgYzsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc19iYWQgKF8oIk5lZWQgIzEgb3IgIzIgaGVyZSIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChjICYgS0JJVCkKLQkgICAgewotCSAgICAgIHN3aXRjaCAob3BlcmFuZFswXS5leHAuWF9hZGRfbnVtYmVyKQotCQl7Ci0JCWNhc2UgMToKLQkJICBuaWIgPSAwOwotCQkgIGJyZWFrOwotCQljYXNlIDI6Ci0JCSAgbmliID0gODsKLQkJICBicmVhazsKLQkJY2FzZSA0OgotCQkgIGlmICghSG1vZGUpCi0JCSAgICBhc193YXJuIChfKCIjNCBub3QgdmFsaWQgb24gSDgvMzAwLiIpKTsKLQkJICBuaWIgPSA5OwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkIChfKCJOZWVkICMxIG9yICMyIGhlcmUiKSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAvKiBzdG9wIGl0IG1ha2luZyBhIGZpeCAqLwotCSAgICAgIG9wZXJhbmRbMF0ubW9kZSA9IDA7Ci0JICAgIH0KLQotCSAgaWYgKGMgJiBNRU1SRUxBWCkKLQkgICAgewotCSAgICAgIG9wZXJhbmRbZF0ubW9kZSB8PSBNRU1SRUxBWDsKLQkgICAgfQotCi0JICBpZiAoYyAmIEIzMSkKLQkgICAgewotCSAgICAgIG5pYiB8PSAweDg7Ci0JICAgIH0KLQotCSAgaWYgKGMgJiBNQUNSRUcpCi0JICAgIHsKLQkgICAgICBuaWIgPSAyICsgb3BlcmFuZFtkXS5yZWc7Ci0JICAgIH0KLQl9Ci0gICAgICBuaWJibGVfY291bnQrKzsKLQotICAgICAgKnArKyA9IG5pYjsKLSAgICB9Ci0KLSAgLyogRGlzZ3VzdGluZy4gIFdoeSwgb2ggd2h5IGRpZG4ndCBzb21lb25lIGFzayB1cyBmb3IgYWR2aWNlCi0gICAgIG9uIHRoZSBhc3NlbWJsZXIgZm9ybWF0LiAgKi8KLSAgaWYgKHN0cmNtcCAodGhpc190cnktPm5hbWUsICJzdG0ubCIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAodGhpc190cnktPm5hbWUsICJsZG0ubCIpID09IDApCi0gICAgewotICAgICAgaW50IGhpZ2gsIGxvdzsKLSAgICAgIGhpZ2ggPSAob3BlcmFuZFt0aGlzX3RyeS0+bmFtZVswXSA9PSAnbCcgPyAxIDogMF0ucmVnID4+IDgpICYgMHhmOwotICAgICAgbG93ID0gb3BlcmFuZFt0aGlzX3RyeS0+bmFtZVswXSA9PSAnbCcgPyAxIDogMF0ucmVnICYgMHhmOwotCi0gICAgICBhc25pYmJsZXNbMl0gPSBoaWdoIC0gbG93OwotICAgICAgYXNuaWJibGVzWzddID0gKHRoaXNfdHJ5LT5uYW1lWzBdID09ICdsJykgPyBoaWdoIDogbG93OwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgdGhpc190cnktPmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIG91dHB1dFtpXSA9IChhc25pYmJsZXNbaSAqIDJdIDw8IDQpIHwgYXNuaWJibGVzW2kgKiAyICsgMV07Ci0gICAgfQotCi0gIC8qIE5vdGUgaWYgdGhpcyBpcyBhIG1vdmIgaW5zdHJ1Y3Rpb24gLS0gdGhlcmUncyBhIHNwZWNpYWwgcmVsYXhhdGlvbgotICAgICB3aGljaCBvbmx5IGFwcGxpZXMgdG8gdGhlbS4gICovCi0gIGlmIChzdHJjbXAgKHRoaXNfdHJ5LT5uYW1lLCAibW92LmIiKSA9PSAwKQotICAgIG1vdmIgPSAxOwotCi0gIC8qIG91dHB1dCBhbnkgZml4ZXMgKi8KLSAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgeCA9IG9wZXJhbmRbaV0ubW9kZTsKLQotICAgICAgaWYgKHggJiAoSU1NIHwgRElTUCkpCi0JewotCSAgZG9fYV9maXhfaW1tIChvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIGltbWF0LAotCQkJb3BlcmFuZCArIGksIHggJiBNRU1SRUxBWCAhPSAwKTsKLQl9Ci0gICAgICBlbHNlIGlmICh4ICYgQUJTKQotCXsKLQkgIGRvX2FfZml4X2ltbSAob3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBhYnNhdCwKLQkJCW9wZXJhbmQgKyBpLCB4ICYgTUVNUkVMQVggPyBtb3ZiICsgMSA6IDApOwotCX0KLSAgICAgIGVsc2UgaWYgKHggJiBQQ1JFTCkKLQl7Ci0JICBpbnQgc2l6ZTE2ID0geCAmIExfMTY7Ci0JICBpbnQgd2hlcmUgPSBzaXplMTYgPyAyIDogMTsKLQkgIGludCBzaXplID0gc2l6ZTE2ID8gMiA6IDE7Ci0JICBpbnQgdHlwZSA9IHNpemUxNiA/IFJfUENSV09SRCA6IFJfUENSQllURTsKLQotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCArIGksIHNpemUxNiA/IDB4N2ZmZiA6IDB4N2YsICJAIik7Ci0KLQkgIGlmIChvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgJiAxKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiYnJhbmNoIG9wZXJhbmQgaGFzIG9kZCBvZmZzZXQgKCVseClcbiIpLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpOwotCSAgICB9Ci0KLQkgIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAtPSAxOwotCSAgLyogVGhpcyB1c2VkIHRvIHVzZSBhIGNhc3QgdG8gY2hhciwgYnV0IHRoYXQgZmFpbHMgaWYgY2hhciBpcyBhbgotCSAgICAgdW5zaWduZWQgdHlwZS4gIFdlIGNhbid0IHVzZSBgc2lnbmVkIGNoYXInLCBhcyB0aGF0IGlzbid0IHZhbGlkCi0JICAgICBLJlIgQy4gICovCi0JICBpZiAob3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyICYgMHg4MCkKLQkgICAgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyIHw9ICgob2Zmc2V0VCkgLTEgPDwgOCk7Ci0JICBlbHNlCi0JICAgIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAmPSAweGZmOwotCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIHdoZXJlLAotCQkgICAgICAgc2l6ZSwKLQkJICAgICAgICZvcGVyYW5kW2ldLmV4cCwKLQkJICAgICAgIDEsCi0JCSAgICAgICB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmICh4ICYgTUVNSU5EKQotCXsKLQotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCArIGksIDB4ZmYsICJAQCIpOwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgb3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyAxLAotCQkgICAgICAgMSwKLQkJICAgICAgICZvcGVyYW5kW2ldLmV4cCwKLQkJICAgICAgIDAsCi0JCSAgICAgICBSX01FTV9JTkRJUkVDVCk7Ci0JfQotICAgICAgZWxzZSBpZiAoeCAmIEFCU0pNUCkKLQl7Ci0JICAvKiBUaGlzIGptcCBtYXkgYmUgYSBqdW1wIG9yIGEgYnJhbmNoICovCi0KLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQgKyBpLCBIbW9kZSA/IDB4ZmZmZmZmIDogMHhmZmZmLCAiQCIpOwotCSAgaWYgKG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAmIDEpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJicmFuY2ggb3BlcmFuZCBoYXMgb2RkIG9mZnNldCAoJWx4KVxuIiksCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcik7Ci0JICAgIH0KLQkgIGlmICghSG1vZGUpCi0JICAgIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciA9IChzaG9ydCkgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyOwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgb3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCSAgICAgICA0LAotCQkgICAgICAgJm9wZXJhbmRbaV0uZXhwLAotCQkgICAgICAgMCwKLQkJICAgICAgIFJfSk1QTDEpOwotCX0KLSAgICB9Ci0KLX0KLQotLyoKLSAgdHJ5IGFuZCBnaXZlIGFuIGludGVsbGlnZW50IGVycm9yIG1lc3NhZ2UgZm9yIGNvbW1vbiBhbmQgc2ltcGxlIHRvCi0gIGRldGVjdCBlcnJvcnMKLSAgKi8KLQotc3RhdGljIHZvaWQKLWNsZXZlcl9tZXNzYWdlIChvcGNvZGUsIG9wZXJhbmQpCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKm9wY29kZTsKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOwotewotICAvKiBGaW5kIG91dCBpZiB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZSBwb3NzaWJsZSBvcGNjb2RlICovCi0KLSAgaWYgKChvcGNvZGUgKyAxKS0+aWR4ICE9IG9wY29kZS0+aWR4KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBhcmduOwotCi0gICAgICAvKiBPbmx5IG9uZSBvcGNvZGUgb2YgdGhpcyBmbGF2b3VyLCB0cnkgYW5kIGd1ZXNzIHdoaWNoIG9wZXJhbmQKLSAgICAgICAgIGRpZG4ndCBtYXRjaCAqLwotICAgICAgZm9yIChhcmduID0gMDsgYXJnbiA8IG9wY29kZS0+bm9wZXJhbmRzOyBhcmduKyspCi0JewotCSAgc3dpdGNoIChvcGNvZGUtPmFyZ3MubmliW2FyZ25dKQotCSAgICB7Ci0JICAgIGNhc2UgUkQxNjoKLQkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IFJEMTYpCi0JCXsKLQkJICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSAxNiBiaXQgcmVnaXN0ZXIiKSk7Ci0JCSAgcmV0dXJuOwotCi0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJTODoKLQotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gUlM4KQotCQl7Ci0JCSAgYXNfYmFkIChfKCJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIikpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQUJTMTZEU1Q6Ci0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBBQlMxNkRTVCkKLQkJewotCQkgIGFzX2JhZCAoXygiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ4OgotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gUkQ4KQotCQl7Ci0JCSAgYXNfYmFkIChfKCJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgOCBiaXQgcmVnaXN0ZXIiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQotCSAgICBjYXNlIEFCUzE2U1JDOgotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gQUJTMTZTUkMpCi0JCXsKLQkJICBhc19iYWQgKF8oInNvdXJjZSBvcGVyYW5kIG11c3QgYmUgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICB9Ci0JfQotICAgIH0KLSAgYXNfYmFkIChfKCJpbnZhbGlkIG9wZXJhbmRzIikpOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jaXRvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICAgKi8KLQotCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqb3Bfc3RhcnQ7Ci0gIGNoYXIgKm9wX2VuZDsKLSAgc3RydWN0IGg4X29wIG9wZXJhbmRbMl07Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKm9wY29kZTsKLSAgc3RydWN0IGg4X29wY29kZSAqcHJldl9vcGNvZGU7Ci0KLSAgY2hhciAqZG90ID0gMDsKLSAgY2hhciBjOwotICBpbnQgc2l6ZTsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9IHN0cjsKLSAgICAgICAqb3BfZW5kICE9IDAgJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgaWYgKCpvcF9lbmQgPT0gJy4nKQotCXsKLQkgIGRvdCA9IG9wX2VuZCArIDE7Ci0JICAqb3BfZW5kID0gMDsKLQkgIG9wX2VuZCArPSAyOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICA7Ci0KLSAgaWYgKG9wX2VuZCA9PSBvcF9zdGFydCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0gIGMgPSAqb3BfZW5kOwotCi0gICpvcF9lbmQgPSAwOwotCi0gIG9wY29kZSA9IChzdHJ1Y3QgaDhfb3Bjb2RlICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwKLQkJCQkJICAgb3Bfc3RhcnQpOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSB1c2UgdG8gc2V0IGlucHV0X2xpbmVfcG9pbnRlciB0byB0aGUgcmVzdWx0IG9mIGdldF9vcGVyYW5kcywKLSAgICAgYnV0IHRoYXQgaXMgd3JvbmcuICBPdXIgY2FsbGVyIGFzc3VtZXMgd2UgZG9uJ3QgY2hhbmdlIGl0LiAgKi8KLQotICAodm9pZCkgZ2V0X29wZXJhbmRzIChvcGNvZGUtPm5vcGVyYW5kcywgb3BfZW5kLCBvcGVyYW5kKTsKLSAgKm9wX2VuZCA9IGM7Ci0gIHByZXZfb3Bjb2RlID0gb3Bjb2RlOwotCi0gIHNpemUgPSBTTjsKLSAgaWYgKGRvdCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpkb3QpCi0JewotCWNhc2UgJ2InOgotCSAgc2l6ZSA9IFNCOwotCSAgYnJlYWs7Ci0KLQljYXNlICd3JzoKLQkgIHNpemUgPSBTVzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbCc6Ci0JICBzaXplID0gU0w7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZCwgc2l6ZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIENvdWxkbid0IGZpbmQgYW4gb3Bjb2RlIHdoaWNoIG1hdGNoZWQgdGhlIG9wZXJhbmRzICovCi0gICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMik7Ci0KLSAgICAgIHdoZXJlWzBdID0gMHgwOwotICAgICAgd2hlcmVbMV0gPSAweDA7Ci0gICAgICBjbGV2ZXJfbWVzc2FnZSAocHJldl9vcGNvZGUsIG9wZXJhbmQpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAob3Bjb2RlLT5zaXplICYmIGRvdCkKLSAgICB7Ci0gICAgICBpZiAob3Bjb2RlLT5zaXplICE9ICpkb3QpCi0JewotCSAgYXNfd2FybiAoXygibWlzbWF0Y2ggYmV0d2VlbiBvcGNvZGUgc2l6ZSBhbmQgb3BlcmFuZCBzaXplIikpOwotCX0KLSAgICB9Ci0KLSAgYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLX0KLQotdm9pZAotdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi10Y19oZWFkZXJzX2hvb2sgKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAgICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqYXJnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbSBBVFRSSUJVVEVfVU5VU0VEOwotewotfQotDAotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKCkKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2FvdXRfZml4X3RvX2NoYXJzIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVycyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWdUIHNlZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmcmFnUyAqZnJhZ1AgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIG1kX2NvbnZlcnRfZnJhZyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVCAKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgc2l6ZSkKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gKChzaXplICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKSAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Ci0KLX0KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9zaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICpwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYm9ydCAoKTsKLX0KLQotCi12b2lkCi10Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgYmZkX3ZtYSBiYXNlOwotCi17Ci0gIHN5bWJvbFMgKnN5bWJvbF9wdHI7Ci0KLSAgc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBhdHRhY2hlZCB0byBhIHN5bWJvbCB0aGVuIGl0J3Mgb2sKLSAgICAgdG8gb3V0cHV0IGl0ICovCi0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gVENfQ09OU19SRUxPQykKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgICAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDQ6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX1JFTExPTkc7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX1JFTFdPUkQ7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX1JFTEJZVEU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7Ci0gICAgfQotCi0gIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOwotICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLQotICBpZiAoc3ltYm9sX3B0cikKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sX3B0ci0+c3lfbnVtYmVyICE9IC0xKQotCWludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKnNlZ3N5bTsKLQotCSAgLyogVGhpcyBjYXNlIGFyaXNlcyB3aGVuIGEgcmVmZXJlbmNlIGlzIG1hZGUgdG8gYC4nLiAgKi8KLQkgIHNlZ3N5bSA9IHNlZ19pbmZvIChTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKSktPmRvdDsKLQkgIGlmIChzZWdzeW0gPT0gTlVMTCkKLQkgICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludHItPnJfc3ltbmR4ID0gc2Vnc3ltLT5zeV9udW1iZXI7Ci0JICAgICAgaW50ci0+cl9vZmZzZXQgKz0gU19HRVRfVkFMVUUgKHN5bWJvbF9wdHIpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci0KLQotfQotCi0vKiBlbmQgb2YgdGMtaDgzMDAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1oODMwMC5oIGIvZ2FzL2NvbmZpZy90Yy1oODMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTJhNzA0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaDgzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1oODMwMC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIFRDX0g4MzAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7Ci0jZW5kaWYKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIGFib3J0KCk7Ci0KLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfaDgzMDAKLSNkZWZpbmUgQ09GRl9NQUdJQyAoIFNtb2RlID8gMHg4MzAyIDogSG1vZGUgPyAweDgzMDEgOiAweDgzMDApCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKSA7IC8qIG5vdCB1c2VkICovCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCi1leHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOwotCi0jZGVmaW5lIFRDX0NPTlNfUkVMT0MgICAgICAgICAgKEhtb2RlID8gUl9SRUxMT05HOiBSX1JFTFdPUkQpCi0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkhpdGFjaGkgSDgvMzAwIEdBUyAiCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKLSNkZWZpbmUgUkVMT0NfMzIgMTIzNAotCi1leHRlcm4gaW50IEhtb2RlOwotZXh0ZXJuIGludCBTbW9kZTsKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIGVuZCBvZiB0Yy1oODMwMC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4NTAwLmMgYi9nYXMvY29uZmlnL3RjLWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWMzZTIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1oODUwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzMyArMCwwIEBACi0vKiB0Yy1oODUwMC5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBIaXRhY2hpIEg4LzUwMAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICBXcml0dGVuIEJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gIHNhY0BjeWdudXMuY29tCi0gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNkZWZpbmUgQVNTRU1CTEVSX1RBQkxFCi0jaW5jbHVkZSAib3Bjb2Rlcy9oODUwMC1vcGMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiISMiOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAgICovCi0KLXZvaWQgY29ucyAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJpbnQiLCBjb25zLCAyfSwKLSAgeyJkYXRhLmIiLCBjb25zLCAxfSwKLSAgeyJkYXRhLnciLCBjb25zLCAyfSwKLSAgeyJkYXRhLmwiLCBjb25zLCA0fSwKLSAgeyJmb3JtIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKLSAgezAsIDAsIDB9Ci19OwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZTsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKLSNkZWZpbmUgRU5DT0RFX1JFTEFYKHdoYXQsbGVuZ3RoKSAoKCh3aGF0KSA8PCAyKSArIChsZW5ndGgpKQotCi0jZGVmaW5lIEdFVF9XSEFUKHgpICgoeD4+MikpCi0KLSNkZWZpbmUgQllURV9ESVNQIDEKLSNkZWZpbmUgV09SRF9ESVNQIDIKLSNkZWZpbmUgVU5ERUZfQllURV9ESVNQIDAKLSNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDMKLQotI2RlZmluZSBCUkFOQ0ggIDEKLSNkZWZpbmUgU0NCX0YgICAyCi0jZGVmaW5lIFNDQl9UU1QgMwotI2RlZmluZSBFTkQgNAotCi0jZGVmaW5lIEJZVEVfRiAxMjcKLSNkZWZpbmUgQllURV9CIC0xMjYKLSNkZWZpbmUgV09SRF9GIDMyNzY3Ci0jZGVmaW5lIFdPUkRfQiAzMjc2OAotCi1yZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtDIChFTkQsIDApXTsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotLyoKLSAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciBuZWVkcwotICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICBjaGFyIHByZXZfYnVmZmVyWzEwMF07Ci0gIGludCBpZHggPSAwOwotICByZWdpc3RlciByZWxheF90eXBlUyAqdGFibGU7Ci0KLSAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOwotICBwcmV2X2J1ZmZlclswXSA9IDA7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChvcGNvZGUgPSBoODUwMF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAoaWR4ICE9IG9wY29kZS0+aWR4KQotCXsKLQkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0JICBpZHgrKzsKLQl9Ci0gICAgfQotCi0gIC8qIEluaXRpYWxpemUgdGhlIHJlbGF4IHRhYmxlLiAgV2UgdXNlIGEgbG9jYWwgdmFyaWFibGUgdG8gYXZvaWQKLSAgICAgd2FybmluZ3MgYWJvdXQgbW9kaWZ5aW5nIGEgc3VwcG9zZWRseSBjb25zdCBkYXRhIHN0cnVjdHVyZS4gICovCi0gIHRhYmxlID0gKHJlbGF4X3R5cGVTICopIG1kX3JlbGF4X3RhYmxlOwotICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9mb3J3YXJkID0gQllURV9GOwotICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKLSAgdGFibGVbQyAoQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMjsKLSAgdGFibGVbQyAoQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfbW9yZSA9IEMgKEJSQU5DSCwgV09SRF9ESVNQKTsKLQotICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOwotICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9iYWNrd2FyZCA9IFdPUkRfQjsKLSAgdGFibGVbQyAoQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gMzsKLSAgdGFibGVbQyAoQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLSAgdGFibGVbQyAoU0NCX0YsIEJZVEVfRElTUCldLnJseF9mb3J3YXJkID0gQllURV9GOwotICB0YWJsZVtDIChTQ0JfRiwgQllURV9ESVNQKV0ucmx4X2JhY2t3YXJkID0gQllURV9COwotICB0YWJsZVtDIChTQ0JfRiwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCA9IDM7Ci0gIHRhYmxlW0MgKFNDQl9GLCBCWVRFX0RJU1ApXS5ybHhfbW9yZSA9IEMgKFNDQl9GLCBXT1JEX0RJU1ApOwotCi0gIHRhYmxlW0MgKFNDQl9GLCBXT1JEX0RJU1ApXS5ybHhfZm9yd2FyZCA9IFdPUkRfRjsKLSAgdGFibGVbQyAoU0NCX0YsIFdPUkRfRElTUCldLnJseF9iYWNrd2FyZCA9IFdPUkRfQjsKLSAgdGFibGVbQyAoU0NCX0YsIFdPUkRfRElTUCldLnJseF9sZW5ndGggPSA4OwotICB0YWJsZVtDIChTQ0JfRiwgV09SRF9ESVNQKV0ucmx4X21vcmUgPSAwOwotCi0gIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9mb3J3YXJkID0gQllURV9GOwotICB0YWJsZVtDIChTQ0JfVFNULCBCWVRFX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBCWVRFX0I7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9sZW5ndGggPSAzOwotICB0YWJsZVtDIChTQ0JfVFNULCBCWVRFX0RJU1ApXS5ybHhfbW9yZSA9IEMgKFNDQl9UU1QsIFdPUkRfRElTUCk7Ci0KLSAgdGFibGVbQyAoU0NCX1RTVCwgV09SRF9ESVNQKV0ucmx4X2ZvcndhcmQgPSBXT1JEX0Y7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIFdPUkRfRElTUCldLnJseF9iYWNrd2FyZCA9IFdPUkRfQjsKLSAgdGFibGVbQyAoU0NCX1RTVCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCA9IDEwOwotICB0YWJsZVtDIChTQ0JfVFNULCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLX0KLQotc3RhdGljIGludCBybjsJCQkvKiByZWdpc3RlciBudW1iZXIgdXNlZCBieSBSTiAqLwotc3RhdGljIGludCByczsJCQkvKiByZWdpc3RlciBudW1iZXIgdXNlZCBieSBSUyAqLwotc3RhdGljIGludCByZDsJCQkvKiByZWdpc3RlciBudW1iZXIgdXNlZCBieSBSRCAqLwotc3RhdGljIGludCBjcmI7CQkJLyogYnl0ZSBzaXplIGNyICovCi1zdGF0aWMgaW50IGNydzsJCQkvKiB3b3JkIHNpemVkIGNyICovCi1zdGF0aWMgaW50IGNyOwkJCS8qIHVua25vd24gc2l6ZSBjciAqLwotCi1zdGF0aWMgZXhwcmVzc2lvblMgZGlzcGxhY2VtZW50Oy8qIGRpc3BsYWNlbWVudCBleHByZXNzaW9uICovCi1zdGF0aWMgaW50IGRpc3BsYWNlbWVudF9zaXplOwkvKiBhbmQgc2l6ZSBpZiBnaXZlbiAqLwotCi1zdGF0aWMgaW50IGltbWVkaWF0ZV9pbnBhZ2U7Ci1zdGF0aWMgZXhwcmVzc2lvblMgaW1tZWRpYXRlOwkvKiBpbW1lZGlhdGUgZXhwcmVzc2lvbiAqLwotc3RhdGljIGludCBpbW1lZGlhdGVfc2l6ZTsJLyogYW5kIHNpemUgaWYgZ2l2ZW4gKi8KLQotc3RhdGljIGV4cHJlc3Npb25TIGFic29sdXRlOwkvKiBhYnNvbHV0ZSBleHByZXNzaW9uICovCi1zdGF0aWMgaW50IGFic29sdXRlX3NpemU7CS8qIGFuZCBzaXplIGlmIGdpdmVuICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGludCB0eXBlOwotICBpbnQgcmVnOwotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBwYWdlOwotfQotCi1oODUwMF9vcGVyYW5kX2luZm87Ci0KLS8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KLXN0YXRpYyBpbnQKLXBhcnNlX3JlZyAoc3JjLCBtb2RlLCByZWcpCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgaW50ICptb2RlOwotICAgICBpbnQgKnJlZzsKLXsKLSAgY2hhciAqZW5kOwotICBpbnQgbGVuOwotCi0gIC8qIENyaWJiZWQgZnJvbSBnZXRfc3ltYm9sX2VuZCgpLiAgKi8KLSAgaWYgKCFpc19uYW1lX2JlZ2lubmVyICgqc3JjKSB8fCAqc3JjID09ICdcMDAxJykKLSAgICByZXR1cm4gMDsKLSAgZW5kID0gc3JjKzE7Ci0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCplbmQpIHx8ICplbmQgPT0gJ1wwMDEnKQotICAgIGVuZCsrOwotICBsZW4gPSBlbmQgLSBzcmM7Ci0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc3JykKLQl7Ci0JICAqbW9kZSA9IFJOOwotCSAgKnJlZyA9IChzcmNbMV0gLSAnMCcpOwotCSAgcmV0dXJuIGxlbjsKLQl9Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gUk47Ci0gICAgICAqcmVnID0gNzsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDMgJiYgc3JjWzBdID09ICdjJyAmJiBzcmNbMV0gPT0gJ2MnICYmIHNyY1syXSA9PSAncicpCi0gICAgewotICAgICAgKm1vZGUgPSBDUkI7Ci0gICAgICAqcmVnID0gMTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JXOwotICAgICAgKnJlZyA9IDA7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnYicgJiYgc3JjWzFdID09ICdyJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSQjsKLSAgICAgICpyZWcgPSAzOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBDUkI7Ci0gICAgICAqcmVnID0gNDsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdkJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JCOwotICAgICAgKnJlZyA9IDU7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAndCcgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSQjsKLSAgICAgICpyZWcgPSA3OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBSTjsKLSAgICAgICpyZWcgPSA2OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMKLWNoYXIgKgotcGFyc2VfZXhwIChzLCBvcCwgcGFnZSkKLSAgICAgY2hhciAqczsKLSAgICAgZXhwcmVzc2lvblMgKm9wOwotICAgICBpbnQgKnBhZ2U7Ci17Ci0gIGNoYXIgKnNhdmU7Ci0gIGNoYXIgKm5ldzsKLQotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICpwYWdlID0gMDsKLSAgaWYgKHNbMF0gPT0gJyUnKQotICAgIHsKLSAgICAgIGlmIChzWzFdID09ICdwJyAmJiBzWzJdID09ICdhJyAmJiBzWzNdID09ICdnJyAmJiBzWzRdID09ICdlJykKLQl7Ci0JICBzICs9IDU7Ci0JICAqcGFnZSA9ICdwJzsKLQl9Ci0gICAgICBpZiAoc1sxXSA9PSAnaCcgJiYgc1syXSA9PSAnaScgJiYgc1szXSA9PSAnMScgJiYgc1s0XSA9PSAnNicpCi0JewotCSAgcyArPSA1OwotCSAgKnBhZ2UgPSAnaCc7Ci0JfQotICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnbycgJiYgc1syXSA9PSAnZicgJiYgc1szXSA9PSAnZicpCi0JewotCSAgcyArPSA0OwotCSAgKnBhZ2UgPSAnbyc7Ci0JfQotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCi0gIGV4cHJlc3Npb24gKG9wKTsKLSAgaWYgKG9wLT5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgZXhwX3NpZ25lZCwgZXhwX3Vuc2lnbmVkLCBleHBfc2FuZHUKLSAgfSBzaWduX3R5cGU7Ci0KLQotc3RhdGljIGNoYXIgKgotc2tpcF9jb2xvbnRoaW5nIChzaWduLCBwdHIsIGV4cCwgZGVmLCBzaXplOCwgc2l6ZTE2LCBzaXplMjQpCi0gICAgIHNpZ25fdHlwZSBzaWduOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqZXhwOwotICAgICBpbnQgZGVmOwotICAgICBpbnQgc2l6ZTg7Ci0gICAgIGludCBzaXplMTY7Ci0gICAgIGludCBzaXplMjQ7Ci17Ci0gIHB0ciA9IHBhcnNlX2V4cCAocHRyLCAmZXhwLT5leHAsICZleHAtPnBhZ2UpOwotICBpZiAoKnB0ciA9PSAnOicpCi0gICAgewotICAgICAgcHRyKys7Ci0gICAgICBpZiAoKnB0ciA9PSAnOCcpCi0JewotCSAgcHRyKys7Ci0JICBleHAtPnR5cGUgPSBzaXplODsKLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJzEnICYgcHRyWzFdID09ICc2JykKLQl7Ci0JICBwdHIgKz0gMjsKLQkgIGV4cC0+dHlwZSA9IHNpemUxNjsKLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJzInICYgcHRyWzFdID09ICc0JykKLQl7Ci0JICBpZiAoIXNpemUyNCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiOjI0IG5vdCB2YWxpZCBmb3IgdGhpcyBvcGNvZGUiKSk7Ci0JICAgIH0KLQkgIHB0ciArPSAyOwotCSAgZXhwLT50eXBlID0gc2l6ZTI0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImV4cGVjdCA6OCw6MTYgb3IgOjI0IikpOwotCSAgZXhwLT50eXBlID0gc2l6ZTE2OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXhwLT5wYWdlID09ICdwJykKLQl7Ci0JICBleHAtPnR5cGUgPSBJTU04OwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cC0+cGFnZSA9PSAnaCcpCi0JewotCSAgZXhwLT50eXBlID0gSU1NMTY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIExldCdzIHdvcmsgb3V0IHRoZSBzaXplIGZyb20gdGhlIGNvbnRleHQgKi8KLQkgIGludCBuID0gZXhwLT5leHAuWF9hZGRfbnVtYmVyOwotCSAgaWYgKHNpemU4Ci0JICAgICAgJiYgZXhwLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAgJiYgKChzaWduID09IGV4cF9zaWduZWQgJiYgKG4gPj0gLTEyOCAmJiBuIDw9IDEyNykpCi0JCSAgfHwgKHNpZ24gPT0gZXhwX3Vuc2lnbmVkICYmIChuID49IDAgJiYgKG4gPD0gMjU1KSkpCi0JCSAgfHwgKHNpZ24gPT0gZXhwX3NhbmR1ICYmIChuID49IC0xMjggJiYgKG4gPD0gMjU1KSkpKSkKLQkgICAgewotCSAgICAgIGV4cC0+dHlwZSA9IHNpemU4OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHAtPnR5cGUgPSBkZWY7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9yZWdsaXN0IChzcmMsIG9wKQotICAgICBjaGFyICpzcmM7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3A7Ci17Ci0gIGludCBtb2RlOwotICBpbnQgcm47Ci0gIGludCBtYXNrID0gMDsKLSAgaW50IHJtOwotICBpbnQgaWR4ID0gMTsJCQkvKiBza2lwICggKi8KLQotICB3aGlsZSAoc3JjW2lkeF0gJiYgc3JjW2lkeF0gIT0gJyknKQotICAgIHsKLSAgICAgIGludCBkb25lID0gcGFyc2VfcmVnIChzcmMgKyBpZHgsICZtb2RlLCAmcm4pOwotCi0gICAgICBpZiAoZG9uZSkKLQl7Ci0JICBpZHggKz0gZG9uZTsKLQkgIG1hc2sgfD0gMSA8PCBybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gcmVnIGxpc3QiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBpZiAoc3JjW2lkeF0gPT0gJy0nKQotCXsKLQkgIGlkeCsrOwotCSAgZG9uZSA9IHBhcnNlX3JlZyAoc3JjICsgaWR4LCAmbW9kZSwgJnJtKTsKLQkgIGlmIChkb25lKQotCSAgICB7Ci0JICAgICAgaWR4ICs9IGRvbmU7Ci0JICAgICAgd2hpbGUgKHJuIDw9IHJtKQotCQl7Ci0JCSAgbWFzayB8PSAxIDw8IHJuOwotCQkgIHJuKys7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGZpbmFsIHJlZ2lzdGVyIGluIHJhbmdlIikpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1tpZHhdID09ICcsJykKLQlpZHgrKzsKLSAgICB9Ci0gIGlkeCsrOwotICBvcC0+ZXhwLlhfYWRkX3N5bWJvbCA9IDA7Ci0gIG9wLT5leHAuWF9vcF9zeW1ib2wgPSAwOwotICBvcC0+ZXhwLlhfYWRkX251bWJlciA9IG1hc2s7Ci0gIG9wLT5leHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIG9wLT5leHAuWF91bnNpZ25lZCA9IDE7Ci0gIG9wLT50eXBlID0gSU1NODsKLSAgcmV0dXJuIGlkeDsKLQotfQotCi0vKiBUaGUgbWFueSBmb3JtcyBvZiBvcGVyYW5kOgotCi0gICBSbgkJCVJlZ2lzdGVyIGRpcmVjdAotICAgQFJuCQkJUmVnaXN0ZXIgaW5kaXJlY3QKLSAgIEAoZGlzcFs6c2l6ZV0sIFJuKQlSZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotICAgQFJuKwotICAgQC1SbgotICAgQGFhWzpzaXplXQkJYWJzb2x1dGUKLSAgICN4eFs6c2l6ZV0JCWltbWVkaWF0ZSBkYXRhCi0KLSAgICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfb3BlcmFuZCAocHRyLCBvcCwgaXNwYWdlKQotICAgICBjaGFyICoqcHRyOwotICAgICBoODUwMF9vcGVyYW5kX2luZm8gKm9wOwotICAgICBjaGFyIGlzcGFnZTsKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IG1vZGU7Ci0gIHVuc2lnbmVkIGludCBudW07Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIG9wLT5wYWdlID0gMDsKLSAgaWYgKHNyY1swXSA9PSAnKCcgJiYgc3JjWzFdID09ICdyJykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgcmVnaXN0ZXIgbGlzdCAqLwotICAgICAgKnB0ciA9IHNyYyArIHBhcnNlX3JlZ2xpc3QgKHNyYywgb3ApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm9wLT50eXBlLCAmb3AtPnJlZyk7Ci0KLSAgaWYgKGxlbikKLSAgICB7Ci0gICAgICAqcHRyID0gc3JjICsgbGVuOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKnNyYyA9PSAnQCcpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICBpZiAoKnNyYyA9PSAnLScpCi0JewotCSAgc3JjKys7Ci0JICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZudW0pOwotCSAgaWYgKGxlbiA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogT29wcywgbm90IGEgcmVnIGFmdGVyIGFsbCwgbXVzdCBiZSBvcmRpbmFyeSBleHAgKi8KLQkgICAgICBzcmMtLTsKLQkgICAgICAvKiBtdXN0IGJlIGEgc3ltYm9sICovCi0JICAgICAgKnB0ciA9IHNraXBfY29sb250aGluZyAoZXhwX3Vuc2lnbmVkLCBzcmMsCi0JCQkJICAgICAgb3AsIEFCUzE2LCBBQlM4LCBBQlMxNiwgQUJTMjQpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBvcC0+dHlwZSA9IFJOREVDOwotCSAgb3AtPnJlZyA9IG51bTsKLQkgICpwdHIgPSBzcmMgKyBsZW47Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKCpzcmMgPT0gJygnKQotCXsKLQkgIC8qIERpc3AgKi8KLQkgIHNyYysrOwotCi0JICBzcmMgPSBza2lwX2NvbG9udGhpbmcgKGV4cF9zaWduZWQsIHNyYywgCi0JCQkJIG9wLCBSTklORF9EMTYsIFJOSU5EX0Q4LCBSTklORF9EMTYsIDApOwotCi0JICBpZiAoKnNyYyAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCBSbikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBzcmMrKzsKLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm9wLT5yZWcpOwotCSAgaWYgKGxlbiA9PSAwIHx8IG1vZGUgIT0gUk4pCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCBSbikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBzcmMgKz0gbGVuOwotCSAgaWYgKCpzcmMgIT0gJyknKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgUm4pIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgKnB0ciA9IHNyYyArIDE7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmbnVtKTsKLQotICAgICAgaWYgKGxlbikKLQl7Ci0JICBzcmMgKz0gbGVuOwotCSAgaWYgKCpzcmMgPT0gJysnKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgaWYgKG1vZGUgIT0gUk4pCi0JCXsKLQkJICBhc19iYWQgKF8oIkBSbisgbmVlZHMgd29yZCByZWdpc3RlciIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBvcC0+dHlwZSA9IFJOSU5DOwotCSAgICAgIG9wLT5yZWcgPSBudW07Ci0JICAgICAgKnB0ciA9IHNyYzsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGlmIChtb2RlICE9IFJOKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJAUm4gbmVlZHMgd29yZCByZWdpc3RlciIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIG9wLT50eXBlID0gUk5JTkQ7Ci0JICBvcC0+cmVnID0gbnVtOwotCSAgKnB0ciA9IHNyYzsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbXVzdCBiZSBhIHN5bWJvbCAqLwotCSAgKnB0ciA9Ci0JICAgIHNraXBfY29sb250aGluZyAoZXhwX3Vuc2lnbmVkLCBzcmMsIG9wLAotCQkJICAgICBpc3BhZ2UgPyBBQlMyNCA6IEFCUzE2LCBBQlM4LCBBQlMxNiwgQUJTMjQpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKCpzcmMgPT0gJyMnKQotICAgIHsKLSAgICAgIHNyYysrOwotICAgICAgKnB0ciA9IHNraXBfY29sb250aGluZyAoZXhwX3NhbmR1LCBzcmMsIG9wLCBJTU0xNiwgSU1NOCwgSU1NMTYsIEFCUzI0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChleHBfc2lnbmVkLCBzcmMsIG9wLAotCQkJICAgICAgaXNwYWdlID8gQUJTMjQgOiBQQ1JFTDgsIFBDUkVMOCwgUENSRUwxNiwgQUJTMjQpOwotICAgIH0KLX0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAoaW5mbywgYXJncywgb3BlcmFuZCkKLSAgICAgaDg1MDBfb3Bjb2RlX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKmFyZ3M7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLQotewotICBjaGFyICpwdHIgPSBhcmdzOwotCi0gIHN3aXRjaCAoaW5mby0+bmFyZ3MpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIG9wZXJhbmRbMF0udHlwZSA9IDA7Ci0gICAgICBvcGVyYW5kWzFdLnR5cGUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgaW5mby0+bmFtZVswXSA9PSAncCcpOwotICAgICAgb3BlcmFuZFsxXS50eXBlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0vKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKLSAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKLSAgIHByb3ZpZGVkCi0gICAqLwotCi1pbnQgcGNyZWw4OwkJCS8qIFNldCB3aGVuIHdlJ3ZlIHNlZW4gYSBwY3JlbCBvcGVyYW5kICovCi0KLXN0YXRpYwotaDg1MDBfb3Bjb2RlX2luZm8gKgotZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmRzKQotICAgICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICAgICBoODUwMF9vcGVyYW5kX2luZm8gKm9wZXJhbmRzOwotewotICBoODUwMF9vcGNvZGVfaW5mbyAqdGhpc190cnkgPSBvcGNvZGU7Ci0gIGludCBmb3VuZCA9IDA7Ci0gIHVuc2lnbmVkIGludCBub3BlcmFuZHMgPSBvcGNvZGUtPm5hcmdzOwotCi0gIHVuc2lnbmVkIGludCB0aGlzX2luZGV4ID0gb3Bjb2RlLT5pZHg7Ci0KLSAgd2hpbGUgKHRoaXNfaW5kZXggPT0gb3Bjb2RlLT5pZHggJiYgIWZvdW5kKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICB0aGlzX3RyeSA9IG9wY29kZSsrOwotCi0gICAgICAvKiBsb29rIGF0IGJvdGggb3BlcmFuZHMgbmVlZGVkIGJ5IHRoZSBvcGNvZGVzIGFuZCBwcm92aWRlZCBieQotICAgICAgIHRoZSB1c2VyKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBub3BlcmFuZHM7IGkrKykKLQl7Ci0JICBoODUwMF9vcGVyYW5kX2luZm8gKnVzZXIgPSBvcGVyYW5kcyArIGk7Ci0KLQkgIHN3aXRjaCAodGhpc190cnktPmFyZ190eXBlW2ldKQotCSAgICB7Ci0JICAgIGNhc2UgRlBJTkRfRDg6Ci0JICAgICAgLyogT3Bjb2RlIG5lZWRzIChkaXNwOjgsZnApICovCi0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkRfRDggJiYgdXNlci0+cmVnID09IDYpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EMTY6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkRfRDE2KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIHJkID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkRfRDg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkRfRDgpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgcmQgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORF9EMTY6Ci0JICAgIGNhc2UgUk5JTkRfRDg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gdGhpc190cnktPmFyZ190eXBlW2ldKQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIHJuID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBTUERFQzoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTkRFQyAmJiB1c2VyLT5yZWcgPT0gNykKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1BJTkM6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkMgJiYgdXNlci0+cmVnID09IDcpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzE2OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IEFCUzE2KQotCQl7Ci0JCSAgYWJzb2x1dGUgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlM4OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IEFCUzgpCi0JCXsKLQkJICBhYnNvbHV0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzI0OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IEFCUzI0KQotCQl7Ci0JCSAgYWJzb2x1dGUgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENSQjoKLQkgICAgICBpZiAoKHVzZXItPnR5cGUgPT0gQ1JCIHx8IHVzZXItPnR5cGUgPT0gQ1IpICYmIHVzZXItPnJlZyAhPSAwKQotCQl7Ci0JCSAgY3JiID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ1JXOgotCSAgICAgIGlmICgodXNlci0+dHlwZSA9PSBDUlcgfHwgdXNlci0+dHlwZSA9PSBDUikgJiYgdXNlci0+cmVnID09IDApCi0JCXsKLQkJICBjcncgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQMTY6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gRElTUDE2KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRElTUDg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gRElTUDgpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGUDoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTiAmJiB1c2VyLT5yZWcgPT0gNikKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUwxNjoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBQQ1JFTDE2KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUw4OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFBDUkVMOCkKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICBwY3JlbDggPSAxOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBJTU0xNjoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU0xNgotCQkgIHx8IHVzZXItPnR5cGUgPT0gSU1NOCkKLQkJewotCQkgIGltbWVkaWF0ZV9pbnBhZ2UgPSB1c2VyLT5wYWdlOwotCQkgIGltbWVkaWF0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJMSVNUOgotCSAgICBjYXNlIElNTTg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gSU1NOCkKLQkJewotCQkgIGltbWVkaWF0ZV9pbnBhZ2UgPSB1c2VyLT5wYWdlOwotCQkgIGltbWVkaWF0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTTQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gSU1NOCkKLQkJewotCQkgIGltbWVkaWF0ZV9pbnBhZ2UgPSB1c2VyLT5wYWdlOwotCQkgIGltbWVkaWF0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFFJTToKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU04Ci0JCSAgJiYgdXNlci0+ZXhwLlhfb3AgPT0gT19jb25zdGFudAotCQkgICYmCi0JCSAgKHVzZXItPmV4cC5YX2FkZF9udW1iZXIgPT0gLTIKLQkJICAgfHwgdXNlci0+ZXhwLlhfYWRkX251bWJlciA9PSAtMQotCQkgICB8fCB1c2VyLT5leHAuWF9hZGRfbnVtYmVyID09IDEKLQkJICAgfHwgdXNlci0+ZXhwLlhfYWRkX251bWJlciA9PSAyKSkKLQkJewotCQkgIGltbWVkaWF0ZV9pbnBhZ2UgPSB1c2VyLT5wYWdlOwotCQkgIGltbWVkaWF0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJEOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOKQotCQl7Ci0JCSAgcmQgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSUzoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTikKLQkJewotCQkgIHJzID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkQpCi0JCXsKLQkJICByZCA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkM6Ci0JICAgIGNhc2UgUk5JTkQ6Ci0JICAgIGNhc2UgUk5ERUM6Ci0JICAgIGNhc2UgUk46Ci0KLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSB0aGlzX3RyeS0+YXJnX3R5cGVbaV0pCi0JCXsKLQkJICBybiA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOICYmIHVzZXItPnJlZyA9PSA3KQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBwcmludGYgKF8oInVuaGFuZGxlZCAlZFxuIiksIHRoaXNfdHJ5LT5hcmdfdHlwZVtpXSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgZ2V0IGhlcmUgdGhpcyBkaWRuJ3Qgd29yayBvdXQgKi8KLQkgIGdvdG8gZmFpbDsKLQl9Ci0gICAgICBmb3VuZCA9IDE7Ci0gICAgZmFpbDo7Ci0KLSAgICB9Ci0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0aGlzX3RyeTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLWNoZWNrIChvcGVyYW5kLCBsb3csIGhpZ2gpCi0gICAgIGV4cHJlc3Npb25TICpvcGVyYW5kOwotICAgICBpbnQgbG93OwotICAgICBpbnQgaGlnaDsKLXsKLSAgaWYgKG9wZXJhbmQtPlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgbG93Ci0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPiBoaWdoKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCIpLCBsb3csIGhpZ2gpOwotICAgIH0KLSAgcmV0dXJuIG9wZXJhbmQtPlhfYWRkX251bWJlcjsKLX0KLQotc3RhdGljCi12b2lkCi1pbnNlcnQgKG91dHB1dCwgaW5kZXgsIGV4cCwgcmVsb2MsIHBjcmVsKQotICAgICBjaGFyICpvdXRwdXQ7Ci0gICAgIGludCBpbmRleDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50IHJlbG9jOwotICAgICBpbnQgcGNyZWw7Ci17Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkgICAgICAgb3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBpbmRleCwKLQkgICAgICAgNCwJICAgICAgIAkvKiBhbHdheXMgc2F5IHNpemUgaXMgNCwgYnV0IHdlIGtub3cgYmV0dGVyICovCi0JICAgICAgIGV4cCwKLQkgICAgICAgcGNyZWwsCi0JICAgICAgIHJlbG9jKTsKLX0KLQotdm9pZAotYnVpbGRfcmVsYXhhYmxlX2luc3RydWN0aW9uIChvcGNvZGUsIG9wZXJhbmQpCi0gICAgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLXsKLSAgLyogQWxsIHJlbGF4YWJsZSBpbnN0cnVjdGlvbnMgc3RhcnQgbGlmZSBhcyB0d28gYnl0ZXMgYnV0IGNhbiBiZWNvbWUKLSAgICAgdGhyZWUgYnl0ZXMgbG9uZyBpZiBhIGxvbmVseSBicmFuY2ggYW5kIHVwIHRvIDkgYnl0ZXMgaWYgbG9uZyBzY2IKLSAgICAgKi8KLSAgY2hhciAqcDsKLSAgaW50IGxlbjsKLSAgaW50IHR5cGU7Ci0KLSAgaWYgKG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgPT0gMHgwMSkKLSAgICB7Ci0gICAgICB0eXBlID0gU0NCX0Y7Ci0gICAgfQotICBlbHNlIGlmIChvcGNvZGUtPmJ5dGVzWzBdLmNvbnRlbnRzID09IDB4MDYKLQkgICB8fCBvcGNvZGUtPmJ5dGVzWzBdLmNvbnRlbnRzID09IDB4MDcpCi0gICAgewotICAgICAgdHlwZSA9IFNDQl9UU1Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdHlwZSA9IEJSQU5DSDsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJbWRfcmVsYXhfdGFibGVbQyAodHlwZSwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCwKLQkJbGVuID0gbWRfcmVsYXhfdGFibGVbQyAodHlwZSwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCwKLQkJQyAodHlwZSwgVU5ERUZfQllURV9ESVNQKSwKLQkJZGlzcGxhY2VtZW50LlhfYWRkX3N5bWJvbCwKLQkJZGlzcGxhY2VtZW50LlhfYWRkX251bWJlciwKLQkJMCk7Ci0KLSAgcFswXSA9IG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHM7Ci0gIGlmICh0eXBlICE9IEJSQU5DSCkKLSAgICB7Ci0gICAgICBwWzFdID0gb3Bjb2RlLT5ieXRlc1sxXS5jb250ZW50cyB8IHJzOwotICAgIH0KLX0KLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotc3RhdGljIHZvaWQKLWJ1aWxkX2J5dGVzIChvcGNvZGUsIG9wZXJhbmQpCi0gICAgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLQotewotICBpbnQgaW5kZXg7Ci0KLSAgaWYgKHBjcmVsOCkKLSAgICB7Ci0gICAgICBwY3JlbDggPSAwOwotICAgICAgYnVpbGRfcmVsYXhhYmxlX2luc3RydWN0aW9uIChvcGNvZGUsIG9wZXJhbmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKm91dHB1dCA9IGZyYWdfbW9yZSAob3Bjb2RlLT5sZW5ndGgpOwotCi0gICAgICBtZW1zZXQgKG91dHB1dCwgMCwgb3Bjb2RlLT5sZW5ndGgpOwotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgb3Bjb2RlLT5sZW5ndGg7IGluZGV4KyspCi0JewotCSAgb3V0cHV0W2luZGV4XSA9IG9wY29kZS0+Ynl0ZXNbaW5kZXhdLmNvbnRlbnRzOwotCi0JICBzd2l0Y2ggKG9wY29kZS0+Ynl0ZXNbaW5kZXhdLmluc2VydCkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIHByaW50ZiAoXygiZmFpbGVkIGZvciAlZFxuIiksIG9wY29kZS0+Ynl0ZXNbaW5kZXhdLmluc2VydCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTjoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IHJuOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJEOgotCSAgICBjYXNlIFJESU5EOgotCSAgICAgIAotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gcmQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUlM6Ci0JICAgICAgb3V0cHV0W2luZGV4XSB8PSByczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQMTY6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmZGlzcGxhY2VtZW50LCBSX0g4NTAwX0lNTTE2LCAwKTsKLQkgICAgICBpbmRleCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1A4OgotCSAgICBjYXNlIEZQSU5EX0Q4OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmRpc3BsYWNlbWVudCwgUl9IODUwMF9JTU04LCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIElNTTE2OgotCSAgICAgIHsKLQkJaW50IHA7Ci0JCXN3aXRjaCAoaW1tZWRpYXRlX2lucGFnZSkgewotCQljYXNlICdwJzoKLQkJICBwID0gUl9IODUwMF9ISUdIMTY7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2gnOgkJCi0JCSAgcCA9IFJfSDg1MDBfSElHSDE2OwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIHAgPSBSX0g4NTAwX0lNTTE2OwotCQkgIGJyZWFrOwotCQl9Ci0JCQotCQlpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZpbW1lZGlhdGUscCwgMCk7Ci0JICAgICAgfQotCQkKLQkgICAgICBpbmRleCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJMSVNUOgotCSAgICBjYXNlIElNTTg6Ci0JICAgICAgaWYgKGltbWVkaWF0ZV9pbnBhZ2UpCi0JCXsKLQkJICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZpbW1lZGlhdGUsIFJfSDg1MDBfSElHSDgsIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmaW1tZWRpYXRlLCBSX0g4NTAwX0lNTTgsIDApOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUwxNjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZkaXNwbGFjZW1lbnQsIFJfSDg1MDBfUENSRUwxNiwgMSk7Ci0JICAgICAgaW5kZXgrKzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDg6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmZGlzcGxhY2VtZW50LCBSX0g4NTAwX1BDUkVMOCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NNDoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IGNoZWNrICgmaW1tZWRpYXRlLCAwLCAxNSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ1I6Ci0KLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IGNyOwotCSAgICAgIGlmIChjciA9PSAwKQotCQl7Ci0JCSAgb3V0cHV0WzBdIHw9IDB4ODsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG91dHB1dFswXSAmPSB+MHg4OwotCQl9Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENSQjoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IGNyYjsKLQkgICAgICBvdXRwdXRbMF0gJj0gfjB4ODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUlc6Ci0JICAgICAgb3V0cHV0W2luZGV4XSB8PSBjcnc7Ci0JICAgICAgb3V0cHV0WzBdIHw9IDB4ODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMyNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZhYnNvbHV0ZSwgUl9IODUwMF9JTU0yNCwgMCk7Ci0JICAgICAgaW5kZXggKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMxNjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZhYnNvbHV0ZSwgUl9IODUwMF9JTU0xNiwgMCk7Ci0JICAgICAgaW5kZXgrKzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlM4OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmFic29sdXRlLCBSX0g4NTAwX0lNTTgsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFFJTToKLQkgICAgICBzd2l0Y2ggKGltbWVkaWF0ZS5YX2FkZF9udW1iZXIpCi0JCXsKLQkJY2FzZSAtMjoKLQkJICBvdXRwdXRbaW5kZXhdIHw9IDB4NTsKLQkJICBicmVhazsKLQkJY2FzZSAtMToKLQkJICBvdXRwdXRbaW5kZXhdIHw9IDB4NDsKLQkJICBicmVhazsKLQkJY2FzZSAxOgotCQkgIG91dHB1dFtpbmRleF0gfD0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAyOgotCQkgIG91dHB1dFtpbmRleF0gfD0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY2l0b24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAgICovCi0KLXZvaWQKLURFRlVOIChtZF9hc3NlbWJsZSwgKHN0ciksCi0gICAgICAgY2hhciAqc3RyKQotewotICBjaGFyICpvcF9zdGFydDsKLSAgY2hhciAqb3BfZW5kOwotICBoODUwMF9vcGVyYW5kX2luZm8gb3BlcmFuZFsyXTsKLSAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgaDg1MDBfb3Bjb2RlX2luZm8gKnByZXZfb3Bjb2RlOwotICBjaGFyIG5hbWVbMTFdOwotCi0gIGludCBubGVuID0gMDsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9IHN0cjsKLSAgICAgICAqb3BfZW5kICYmCi0gICAgICAgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIGlmICgJCQkvKipvcF9lbmQgIT0gJy4nCi0JICAmJiAqb3BfZW5kICE9ICc6JwotCSAgIAkgICAJICAgCSAgJiYgKi8gbmxlbiA8IDEwKQotCXsKLQkgIG5hbWVbbmxlbisrXSA9ICpvcF9lbmQ7Ci0JfQotICAgIH0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgaWYgKG9wX2VuZCA9PSBvcF9zdGFydCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0KLSAgb3Bjb2RlID0gKGg4NTAwX29wY29kZV9pbmZvICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGdldF9vcGVyYW5kcyAob3Bjb2RlLCBvcF9lbmQsIG9wZXJhbmQpOwotICBwcmV2X29wY29kZSA9IG9wY29kZTsKLQotICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLSAgaWYgKG9wY29kZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIENvdWxkbid0IGZpbmQgYW4gb3Bjb2RlIHdoaWNoIG1hdGNoZWQgdGhlIG9wZXJhbmRzICovCi0gICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMik7Ci0KLSAgICAgIHdoZXJlWzBdID0gMHgwOwotICAgICAgd2hlcmVbMV0gPSAweDA7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLX0KLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotc3ltYm9sUyAqCi1ERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAotICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1ERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAgICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKCkKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2FvdXRfZml4X3RvX2NoYXJzIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljCi12b2lkCi13b3JkaWZ5X3NjYiAoYnVmZmVyLCBkaXNwX3NpemUsIGluc3Rfc2l6ZSkKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICBpbnQgKmRpc3Bfc2l6ZTsKLSAgICAgaW50ICppbnN0X3NpemU7Ci17Ci0gIGludCBybiA9IGJ1ZmZlclsxXSAmIDB4NzsKLQotICBzd2l0Y2ggKGJ1ZmZlclswXSkKLSAgICB7Ci0gICAgY2FzZSAweDBlOgkJCS8qIEJTUiAqLwotICAgIGNhc2UgMHgyMDoKLSAgICBjYXNlIDB4MjE6Ci0gICAgY2FzZSAweDIyOgotICAgIGNhc2UgMHgyMzoKLSAgICBjYXNlIDB4MjQ6Ci0gICAgY2FzZSAweDI1OgotICAgIGNhc2UgMHgyNjoKLSAgICBjYXNlIDB4Mjc6Ci0gICAgY2FzZSAweDI4OgotICAgIGNhc2UgMHgyOToKLSAgICBjYXNlIDB4MmE6Ci0gICAgY2FzZSAweDJiOgotICAgIGNhc2UgMHgyYzoKLSAgICBjYXNlIDB4MmQ6Ci0gICAgY2FzZSAweDJlOgotICAgIGNhc2UgMHgyZjoKLSAgICAgIGJ1ZmZlclswXSB8PSAweDEwOwotICAgICAgYnVmZmVyWzFdID0gMDsKLSAgICAgIGJ1ZmZlclsyXSA9IDA7Ci0gICAgICAqZGlzcF9zaXplID0gMjsKLSAgICAgICppbnN0X3NpemUgPSAxOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgMHgwMToKLSAgICAgICppbnN0X3NpemUgPSA2OwotICAgICAgKmRpc3Bfc2l6ZSA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDY6Ci0gICAgICAqaW5zdF9zaXplID0gODsKLSAgICAgICpkaXNwX3NpemUgPSAyOwotCi0gICAgICAqYnVmZmVyKysgPSAweDI2OwkJLyogYm5lICsgOCAqLwotICAgICAgKmJ1ZmZlcisrID0gMHgwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwNzoKLSAgICAgICppbnN0X3NpemUgPSA4OwotICAgICAgKmRpc3Bfc2l6ZSA9IDI7Ci0gICAgICAqYnVmZmVyKysgPSAweDI3OwkJLyogYm5lICsgOCAqLwotICAgICAgKmJ1ZmZlcisrID0gMHgwODsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotICAqYnVmZmVyKysgPSAweGE4IHwgcm47CS8qIGFkZHEgLTEscm4gKi8KLSAgKmJ1ZmZlcisrID0gMHgwYzsKLSAgKmJ1ZmZlcisrID0gMHgwNDsJCS8qIGNtcCAjMHhmZjo4LCBybiAqLwotICAqYnVmZmVyKysgPSAweGZmOwotICAqYnVmZmVyKysgPSAweDcwIHwgcm47Ci0gICpidWZmZXIrKyA9IDB4MzY7CQkvKiBibmUgLi4uICovCi0gICpidWZmZXIrKyA9IDA7Ci0gICpidWZmZXIrKyA9IDA7Ci19Ci0KLS8qCi1jYWxsZWQgYWZ0ZXIgcmVsYXhpbmcsIGNoYW5nZSB0aGUgZnJhZ3Mgc28gdGhleSBrbm93IGhvdyBiaWcgdGhleSBhcmUKLSovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBpbnQgZGlzcF9zaXplID0gMDsKLSAgaW50IGluc3Rfc2l6ZSA9IDA7Ci0gIGNoYXIgKmJ1ZmZlciA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbDsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKEJSQU5DSCwgQllURV9ESVNQKToKLSAgICAgIGRpc3Bfc2l6ZSA9IDE7Ci0gICAgICBpbnN0X3NpemUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKFNDQl9GLCBCWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX1RTVCwgQllURV9ESVNQKToKLSAgICAgIGRpc3Bfc2l6ZSA9IDE7Ci0gICAgICBpbnN0X3NpemUgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEJyYW5jaGVzIHRvIGEga25vd24gMTYgYml0IGRpc3BsYWNlbWVudCAqLwotCi0gICAgICAvKiBUdXJuIG9uIHRoZSAxNmJpdCBiaXQgKi8KLSAgICBjYXNlIEMgKEJSQU5DSCwgV09SRF9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9GLCBXT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX1RTVCwgV09SRF9ESVNQKToKLSAgICAgIHdvcmRpZnlfc2NiIChidWZmZXIsICZkaXNwX3NpemUsICZpbnN0X3NpemUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKEJSQU5DSCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9GLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX1RTVCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIC8qIFRoaXMgdHJpZWQgdG8gYmUgcmVsYXhlZCwgYnV0IGRpZG4ndCBtYW5hZ2UgaXQsIGl0IG5vdyBuZWVkcyBhCi0JIGZpeCAqLwotICAgICAgd29yZGlmeV9zY2IgKGJ1ZmZlciwgJmRpc3Bfc2l6ZSwgJmluc3Rfc2l6ZSk7Ci0KLSAgICAgIC8qIE1ha2UgYSByZWxvYyAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsCi0JICAgICAgIGZyYWdQLT5mcl9maXggKyBpbnN0X3NpemUsCi0JICAgICAgIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDAsCi0JICAgICAgIFJfSDg1MDBfUENSRUwxNik7Ci0KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBpZiAoaW5zdF9zaXplKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgICAgaW50IG5leHRfaW5zdCA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzcyArIGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKLSAgICAgIGludCB0YXJnX2FkZHIgPSAoU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsKLQkJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQpOwotICAgICAgaW50IGRpc3AgPSB0YXJnX2FkZHIgLSBuZXh0X2luc3Q7Ci0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyICsgaW5zdF9zaXplLCBkaXNwLCBkaXNwX3NpemUpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICB9Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBzaXplKQotICAgICBzZWdUIHNlZyA7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gKChzaXplICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKSAKLQkgICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLQotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBpZiAoZml4UC0+Znhfcl90eXBlID09IDApCi0gICAgewotICAgICAgZml4UC0+Znhfcl90eXBlID0gZml4UC0+Znhfc2l6ZSA9PSA0ID8gUl9IODUwMF9JTU0zMiA6IFJfSDg1MDBfSU1NMTY7Ci0gICAgfQotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLQotICAgIGNhc2UgUl9IODUwMF9JTU04OgotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDg6Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMTY6Ci0gICAgY2FzZSBSX0g4NTAwX0xPVzE2OgotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDE2OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIODoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIMTY6Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMjQ7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMjQ6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIH0KLX0KLQotLyoKLWNhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24sIHJldHVybiB0aGUgbGVuZ3RoCi1ieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0byByZWFjaCBpdCdzIGRlc3RpbmF0aW9uCi0qLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgaW50IHdoYXQgPSBHRVRfV0hBVCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIEMgKEJSQU5DSCwgVU5ERUZfQllURV9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9GLCBVTkRFRl9CWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX1RTVCwgVU5ERUZfQllURV9ESVNQKToKLSAgICAgIC8qIHVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duICovCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIC8qIEdvdCBhIHN5bWJvbCBhbmQgaXQncyBkZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgYmVjb21lIGJ5dGUKLQkgc2l6ZWQgLSBtYXliZSBpdCB3aWxsIGZpeCB1cCAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBCWVRFX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIEJZVEVfRElTUCldLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEl0cyBnb3QgYSBzZWdtZW50LCBidXQgaXRzIG5vdCBvdXJzLCBzbyBpdCB3aWxsIGFsd2F5cyBiZSBsb25nICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoOwotCX0KLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICpwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi10Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKGlnbm9yZSkKLSAgICAgc3ltYm9sUyAqaWdub3JlOwotewotfQotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeF9wdHIpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci17Ci0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfMzIpCi0gICAgewotICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uCi0gICAgICovCi0gICAgICBzd2l0Y2ggKGZpeF9wdHItPmZ4X3NpemUpCi0JewotCWNhc2UgMjoKLQkgIHJldHVybiBSX0g4NTAwX0lNTTE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgcmV0dXJuIFJfSDg1MDBfSU1NODsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICByZXR1cm4gZml4X3B0ci0+Znhfcl90eXBlOwotfQotCi12b2lkCi10Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgYmZkX3ZtYSBiYXNlOwotCi17Ci0gIHN5bWJvbFMgKnN5bWJvbF9wdHI7Ci0KLSAgc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBhdHRhY2hlZCB0byBhIHN5bWJvbCB0aGVuIGl0J3Mgb2sKLSAgICAgdG8gb3V0cHV0IGl0ICovCi0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfMzIpCi0gICAgewotICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKLQl7Ci0JY2FzZSAyOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU0xNjsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIGludHItPnJfdHlwZSA9IFJfSU1NODsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ci0+cl90eXBlID0gZml4X3B0ci0+Znhfcl90eXBlOwotICAgIH0KLQotICBpbnRyLT5yX3ZhZGRyID0gZml4X3B0ci0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeF9wdHItPmZ4X3doZXJlICsgYmFzZTsKLSAgaW50ci0+cl9vZmZzZXQgPSBmaXhfcHRyLT5meF9vZmZzZXQ7Ci0KLSAgLyogVHVybiB0aGUgc2VnbWVudCBvZiB0aGUgc3ltYm9sIGludG8gYW4gb2Zmc2V0LiAgKi8KLSAgaWYgKHN5bWJvbF9wdHIpCi0gICAgewotICAgICAgc3ltYm9sUyAqZG90OwotCi0gICAgICBkb3QgPSBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cildLmRvdDsKLSAgICAgIGlmIChkb3QpCi0JewotCSAgLyoJICBpbnRyLT5yX29mZnNldCAtPQotCSAgICBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVChzeW1ib2xfcHRyKV0uc2NuaGRyLnNfcGFkZHI7Ki8KLQkgIGludHItPnJfb2Zmc2V0ICs9IFNfR0VUX1ZBTFVFIChzeW1ib2xfcHRyKTsKLQkgIGludHItPnJfc3ltbmR4ID0gZG90LT5zeV9udW1iZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotCX0KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci0gICAgfQotCi19Ci0KLQotCi1pbnQKLXN0YXJ0X2xhYmVsIChwdHIpCi0gICAgIGNoYXIgKnB0cjsKLXsKLSAgLyogQ2hlY2sgZm9yIDpzLncgKi8KLSAgaWYgKGlzYWxwaGEgKHB0clsxXSkgJiYgcHRyWzJdID09ICcuJykKLSAgICByZXR1cm4gMDsKLSAgLyogQ2hlY2sgZm9yIDpzICovCi0gIGlmIChpc2FscGhhIChwdHJbMV0pICYmICFpc2FscGhhIChwdHJbMl0pKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotCi1pbnQKLXRjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICByZXR1cm4gbWRfcmVsYXhfdGFibGVbZnJhZy0+ZnJfc3VidHlwZV0ucmx4X2xlbmd0aDsKLX0KLQotLyogZW5kIG9mIHRjLWg4NTAwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1oODUwMC5oIGIvZ2FzL2NvbmZpZy90Yy1oODUwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTUzZWMzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaDg1MDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1oODUwMC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIFRDX0g4NTAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7Ci0jZW5kaWYKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCi0KLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfaDg1MDAKLSNkZWZpbmUgQ09GRl9NQUdJQyAweDg1MDAKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCh4KS0+ZnhfYWRkc3l8fCh4KS0+Znhfc3Vic3kpCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkhpdGFjaGkgSDgvNTAwIEdBUyAiCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKLSNkZWZpbmUgUkVMT0NfMzIgMTIzNAotCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoLCBwdHIpICAoY2ggPT0gJzonICYmIHN0YXJ0X2xhYmVsKHB0cikpCi0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcChmcmFnKQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyogZW5kIG9mIHRjLWg4NTAwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaHBwYS5jIGIvZ2FzL2NvbmZpZy90Yy1ocHBhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOTVhNGEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NDIxICswLDAgQEAKLS8qIHRjLWhwcGEuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFBBCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIEhQIFBBLVJJU0Mgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotICAgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgImJmZC9saWJocHBhLmgiCi0jaW5jbHVkZSAiYmZkL2xpYmJmZC5oIgotCi0vKiBCZSBjYXJlZnVsLCB0aGlzIGZpbGUgaW5jbHVkZXMgZGF0YSAqZGVjbGFyYXRpb25zKi4gICovCi0jaW5jbHVkZSAib3Bjb2RlL2hwcGEuaCIKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpICYmIGRlZmluZWQgKE9CSl9TT00pCi1lcnJvciBvbmx5IG9uZSBvZiBPQkpfRUxGIGFuZCBPQkpfU09NIGNhbiBiZSBkZWZpbmVkCi0jZW5kaWYKLQotLyogSWYgd2UgYXJlIHVzaW5nIEVMRiwgdGhlbiB3ZSBwcm9iYWJseSBjYW4gc3VwcG9ydCBkd2FyZjIgZGVidWcKLSAgIHJlY29yZHMuICBGdXJ0aGVybW9yZSwgaWYgd2UgYXJlIHN1cHBvcnRpbmcgZHdhcmYyIGRlYnVnIHJlY29yZHMsCi0gICB0aGVuIHdlIHdhbnQgdG8gdXNlIHRoZSBhc3NlbWJsZXIgc3VwcG9ydCBmb3IgY29tcGFjdCBsaW5lIG51bWJlcnMuICAqLwotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJkd2FyZjJkYmcuaCIKLXN0cnVjdCBkd2FyZjJfbGluZV9pbmZvIGRlYnVnX2xpbmU7Ci0jZW5kaWYKLQotLyogQSAiY29udmllbnQiIHBsYWNlIHRvIHB1dCBvYmplY3QgZmlsZSBkZXBlbmRlbmNpZXMgd2hpY2ggZG8KLSAgIG5vdCBuZWVkIHRvIGJlIHNlZW4gb3V0c2lkZSBvZiB0Yy1ocHBhLmMuICAqLwotI2lmZGVmIE9CSl9FTEYKLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLXR5cGVkZWYgZWxmX2hwcGFfcmVsb2NfdHlwZSByZWxvY190eXBlOwotCi0vKiBPYmplY3QgZmlsZSBmb3JtYXRzIHNwZWNpZnkgQkZEIHN5bWJvbCB0eXBlcy4gICovCi10eXBlZGVmIGVsZl9zeW1ib2xfdHlwZSBvYmpfc3ltYm9sX3R5cGU7Ci0KLSNpZmRlZiBCRkQ2NAotLyogSG93IHRvIGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgX2JmZF9lbGY2NF9ocHBhX2dlbl9yZWxvY190eXBlCi0jZWxzZQotI2RlZmluZSBocHBhX2dlbl9yZWxvY190eXBlIF9iZmRfZWxmMzJfaHBwYV9nZW5fcmVsb2NfdHlwZQotI2VuZGlmCi0KLS8qIEVMRiBvYmplY3RzIGNhbiBoYXZlIHZlcnNpb25zLCBidXQgYXBwYXJlbnRseSBkbyBub3QgaGF2ZSBhbnl3aGVyZQotICAgdG8gc3RvcmUgYSBjb3B5cmlnaHQgc3RyaW5nLiAgKi8KLSNkZWZpbmUgb2JqX3ZlcnNpb24gb2JqX2VsZl92ZXJzaW9uCi0jZGVmaW5lIG9ial9jb3B5cmlnaHQgb2JqX2VsZl92ZXJzaW9uCi0KLSNkZWZpbmUgVU5XSU5EX1NFQ1RJT05fTkFNRSAiLlBBUklTQy51bndpbmQiCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9TT00KLS8qIE5hbWVzIG9mIHZhcmlvdXMgZGVidWdnaW5nIHNwYWNlcy9zdWJzcGFjZXMuICAqLwotI2RlZmluZSBHREJfREVCVUdfU1BBQ0VfTkFNRSAiJEdEQl9ERUJVRyQiCi0jZGVmaW5lIEdEQl9TVFJJTkdTX1NVQlNQQUNFX05BTUUgIiRHREJfU1RSSU5HUyQiCi0jZGVmaW5lIEdEQl9TWU1CT0xTX1NVQlNQQUNFX05BTUUgIiRHREJfU1lNQk9MUyQiCi0jZGVmaW5lIFVOV0lORF9TRUNUSU9OX05BTUUgIiRVTldJTkQkIgotCi0vKiBPYmplY3QgZmlsZSBmb3JtYXRzIHNwZWNpZnkgcmVsb2NhdGlvbiB0eXBlcy4gICovCi10eXBlZGVmIGludCByZWxvY190eXBlOwotCi0vKiBTT00gb2JqZWN0cyBjYW4gaGF2ZSBib3RoIGEgdmVyc2lvbiBzdHJpbmcgYW5kIGEgY29weXJpZ2h0IHN0cmluZy4gICovCi0jZGVmaW5lIG9ial92ZXJzaW9uIG9ial9zb21fdmVyc2lvbgotI2RlZmluZSBvYmpfY29weXJpZ2h0IG9ial9zb21fY29weXJpZ2h0Ci0KLS8qIEhvdyB0byBnZW5lcmF0ZSBhIHJlbG9jYXRpb24uICAqLwotI2RlZmluZSBocHBhX2dlbl9yZWxvY190eXBlIGhwcGFfc29tX2dlbl9yZWxvY190eXBlCi0KLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSBCRkQgc3ltYm9sIHR5cGVzLiAgKi8KLXR5cGVkZWYgc29tX3N5bWJvbF90eXBlIG9ial9zeW1ib2xfdHlwZTsKLQotLyogVGhpcyBhcHBhcmVudGx5IGlzbid0IGluIG9sZGVyIHZlcnNpb25zIG9mIGhwdXggcmVsb2MuaC4gICovCi0jaWZuZGVmIFJfRExUX1JFTAotI2RlZmluZSBSX0RMVF9SRUwgMHg3OAotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBSX04wU0VMCi0jZGVmaW5lIFJfTjBTRUwgMHhkOAotI2VuZGlmCi0KLSNpZm5kZWYgUl9OMVNFTAotI2RlZmluZSBSX04xU0VMIDB4ZDkKLSNlbmRpZgotCi0vKiBWYXJpb3VzIHN0cnVjdHVyZXMgYW5kIHR5cGVzIHVzZWQgaW50ZXJuYWxseSBpbiB0Yy1ocHBhLmMuICAqLwotCi0vKiBVbndpbmQgdGFibGUgYW5kIGRlc2NyaXB0b3IuICBGSVhNRTogU3luYyB0aGlzIHdpdGggR0RCIHZlcnNpb24uICAqLwotCi1zdHJ1Y3QgdW53aW5kX2Rlc2MKLSAgewotICAgIHVuc2lnbmVkIGludCBjYW5ub3RfdW53aW5kOjE7Ci0gICAgdW5zaWduZWQgaW50IG1pbGxpY29kZToxOwotICAgIHVuc2lnbmVkIGludCBtaWxsaWNvZGVfc2F2ZV9yZXN0OjE7Ci0gICAgdW5zaWduZWQgaW50IHJlZ2lvbl9kZXNjOjI7Ci0gICAgdW5zaWduZWQgaW50IHNhdmVfc3I6MjsKLSAgICB1bnNpZ25lZCBpbnQgZW50cnlfZnI6NDsKLSAgICB1bnNpZ25lZCBpbnQgZW50cnlfZ3I6NTsKLSAgICB1bnNpZ25lZCBpbnQgYXJnc19zdG9yZWQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgY2FsbF9mcjo1OwotICAgIHVuc2lnbmVkIGludCBjYWxsX2dyOjU7Ci0gICAgdW5zaWduZWQgaW50IHNhdmVfc3A6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2F2ZV9ycDoxOwotICAgIHVuc2lnbmVkIGludCBzYXZlX3JwX2luX2ZyYW1lOjE7Ci0gICAgdW5zaWduZWQgaW50IGV4dG5fcHRyX2RlZmluZWQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgY2xlYW51cF9kZWZpbmVkOjE7Ci0KLSAgICB1bnNpZ25lZCBpbnQgaHBlX2ludGVycnVwdF9tYXJrZXI6MTsKLSAgICB1bnNpZ25lZCBpbnQgaHB1eF9pbnRlcnJ1cHRfbWFya2VyOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc2VydmVkOjM7Ci0gICAgdW5zaWduZWQgaW50IGZyYW1lX3NpemU6Mjc7Ci0gIH07Ci0KLXN0cnVjdCB1bndpbmRfdGFibGUKLSAgewotICAgIC8qIFN0YXJ0aW5nIGFuZCBlbmRpbmcgb2Zmc2V0cyBvZiB0aGUgcmVnaW9uIGRlc2NyaWJlZCBieQotICAgICAgIGRlc2NyaXB0b3IuICAqLwotICAgIHVuc2lnbmVkIGludCBzdGFydF9vZmZzZXQ7Ci0gICAgdW5zaWduZWQgaW50IGVuZF9vZmZzZXQ7Ci0gICAgc3RydWN0IHVud2luZF9kZXNjIGRlc2NyaXB0b3I7Ci0gIH07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIC5jYWxsaW5mbywgLmVudGVyLCAubGVhdmUgcHNldWRvLW9wcyB0bwotICAgY29udHJvbCB0aGUgZW50cnkgYW5kIGV4aXQgY29kZSB0aGV5IGdlbmVyYXRlLiBJdCBpcyBhbHNvIHVzZWQgaW4KLSAgIGNyZWF0aW9uIG9mIHRoZSBjb3JyZWN0IHN0YWNrIHVud2luZCBkZXNjcmlwdG9ycy4KLQotICAgTk9URTogIEdBUyBkb2VzIG5vdCBzdXBwb3J0IC5lbnRlciBhbmQgLmxlYXZlIGZvciB0aGUgZ2VuZXJhdGlvbiBvZgotICAgcHJvbG9ndWVzIGFuZCBlcGlsb2d1ZXMuICBGSVhNRS4KLQotICAgVGhlIGZpZWxkcyBpbiBzdHJ1Y3R1cmUgcm91Z2hseSBjb3JyZXNwb25kIHRvIHRoZSBhcmd1bWVudHMgYXZhaWxhYmxlIG9uIHRoZQotICAgLmNhbGxpbmZvIHBzZXVkby1vcC4gICovCi0KLXN0cnVjdCBjYWxsX2luZm8KLSAgewotICAgIC8qIFRoZSB1bndpbmQgZGVzY3JpcHRvciBiZWluZyBidWlsdC4gICovCi0gICAgc3RydWN0IHVud2luZF90YWJsZSBjaV91bndpbmQ7Ci0KLSAgICAvKiBOYW1lIG9mIHRoaXMgZnVuY3Rpb24uICAqLwotICAgIHN5bWJvbFMgKnN0YXJ0X3N5bWJvbDsKLQotICAgIC8qICh0ZW1wb3JhcnkpIHN5bWJvbCB1c2VkIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgICBzeW1ib2xTICplbmRfc3ltYm9sOwotCi0gICAgLyogTmV4dCBlbnRyeSBpbiB0aGUgY2hhaW4uICAqLwotICAgIHN0cnVjdCBjYWxsX2luZm8gKmNpX25leHQ7Ci0gIH07Ci0KLS8qIE9wZXJhbmQgZm9ybWF0cyBmb3IgRlAgaW5zdHJ1Y3Rpb25zLiAgIE5vdGUgbm90IGFsbCBGUCBpbnN0cnVjdGlvbnMKLSAgIGFsbG93IGFsbCBmb3VyIGZvcm1hdHMgdG8gYmUgdXNlZCAoZm9yIGV4YW1wbGUgZm1weXN1YiBvbmx5IGFsbG93cwotICAgU0dMIGFuZCBEQkwpLiAgKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgU0dMLCBEQkwsIElMTEVHQUxfRk1ULCBRVUFELCBXLCBVVywgRFcsIFVEVywgUVcsIFVRVwotICB9Ci1mcF9vcGVyYW5kX2Zvcm1hdDsKLQotLyogVGhpcyBmdWxseSBkZXNjcmliZXMgdGhlIHN5bWJvbCB0eXBlcyB3aGljaCBtYXkgYmUgYXR0YWNoZWQgdG8KLSAgIGFuIEVYUE9SVCBvciBJTVBPUlQgZGlyZWN0aXZlLiAgT25seSBTT00gdXNlcyB0aGlzIGZvcm1hdGlvbgotICAgKEVMRiBoYXMgbm8gbmVlZCBmb3IgaXQpLiAgKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgU1lNQk9MX1RZUEVfVU5LTk9XTiwKLSAgICBTWU1CT0xfVFlQRV9BQlNPTFVURSwKLSAgICBTWU1CT0xfVFlQRV9DT0RFLAotICAgIFNZTUJPTF9UWVBFX0RBVEEsCi0gICAgU1lNQk9MX1RZUEVfRU5UUlksCi0gICAgU1lNQk9MX1RZUEVfTUlMTElDT0RFLAotICAgIFNZTUJPTF9UWVBFX1BMQUJFTCwKLSAgICBTWU1CT0xfVFlQRV9QUklfUFJPRywKLSAgICBTWU1CT0xfVFlQRV9TRUNfUFJPRywKLSAgfQotcGFfc3ltYm9sX3R5cGU7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG5lZWRlZCB0byBhc3NlbWJsZQotICAgaW5kaXZpZHVhbCBpbnN0cnVjdGlvbnMuICAqLwotc3RydWN0IHBhX2l0Ci0gIHsKLSAgICAvKiBIb2xkcyB0aGUgb3Bjb2RlIGFmdGVyIHBhcnNpbmcgYnkgcGFfaXAuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gICAgLyogSG9sZHMgYW4gZXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotICAgIGV4cHJlc3Npb25TIGV4cDsKLQotICAgIC8qIERvZXMgdGhpcyBpbnN0cnVjdGlvbiB1c2UgUEMtcmVsYXRpdmUgYWRkcmVzc2luZy4gICovCi0gICAgaW50IHBjcmVsOwotCi0gICAgLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0cyBmb3Igb3BlcmFuZDEgYW5kIG9wZXJhbmQyLiAgKi8KLSAgICBmcF9vcGVyYW5kX2Zvcm1hdCBmcG9mMTsKLSAgICBmcF9vcGVyYW5kX2Zvcm1hdCBmcG9mMjsKLQotICAgIC8qIFdoZXRoZXIgb3Igbm90IHdlIHNhdyBhIHRydW5jYXRpb24gcmVxdWVzdCBvbiBhbiBmY252IGluc24uICAqLwotICAgIGludCB0cnVuYzsKLQotICAgIC8qIEhvbGRzIHRoZSBmaWVsZCBzZWxlY3RvciBmb3IgdGhpcyBpbnN0cnVjdGlvbgotICAgICAgIChmb3IgZXhhbXBsZSBMJSwgTFIlLCBldGMpLiAgKi8KLSAgICBsb25nIGZpZWxkX3NlbGVjdG9yOwotCi0gICAgLyogSG9sZHMgYW55IGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAgIGluc3RydWN0aW9uLiAgKGluc3RydWN0aW9uIHNob3VsZCBiZSBzb21lIHNvcnQgb2YgY2FsbCkuICAqLwotICAgIGxvbmcgYXJnX3JlbG9jOwotCi0gICAgLyogVGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICBpbnQgZm9ybWF0OwotCi0gICAgLyogVGhlIHJlbG9jYXRpb24gKGlmIGFueSkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgIHJlbG9jX3R5cGUgcmVsb2M7Ci0gIH07Ci0KLS8qIFBBLTg5IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhcmUgYXJyYW5nZWQgbGlrZSB0aGlzOgotCi0KLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgICAwIG9yIDE2TCAgIHwgIDE2IG9yIDE2UiAgIHwKLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgICAxIG9yIDE3TCAgIHwgIDE3IG9yIDE3UiAgIHwKLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKLQotICAgLiAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLgotICAgLiAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLgotICAgLiAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLgotCi0gICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAxNCBvciAzMEwgICB8ICAzMCBvciAzMFIgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAxNSBvciAzMUwgICB8ICAzMSBvciAzMVIgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0KLQotICAgVGhlIGZvbGxvd2luZyBpcyBhIHZlcnNpb24gb2YgcGFfcGFyc2VfbnVtYmVyIHRoYXQKLSAgIGhhbmRsZXMgdGhlIEwvUiBub3RhdGlvbiBhbmQgcmV0dXJucyB0aGUgY29ycmVjdAotICAgdmFsdWUgdG8gcHV0IGludG8gdGhlIGluc3RydWN0aW9uIHJlZ2lzdGVyIGZpZWxkLgotICAgVGhlIGNvcnJlY3QgdmFsdWUgdG8gcHV0IGludG8gdGhlIGluc3RydWN0aW9uIGlzCi0gICBlbmNvZGVkIGluIHRoZSBzdHJ1Y3R1cmUgJ3BhXzExX2ZwX3JlZ19zdHJ1Y3QnLiAgKi8KLQotc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QKLSAgewotICAgIC8qIFRoZSByZWdpc3RlciBudW1iZXIuICAqLwotICAgIGNoYXIgbnVtYmVyX3BhcnQ7Ci0KLSAgICAvKiBML1Igc2VsZWN0b3IuICAqLwotICAgIGNoYXIgbF9yX3NlbGVjdDsKLSAgfTsKLQotLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQgYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVicy4gICovCi1zdHJ1Y3QgY2FsbF9kZXNjCi0gIHsKLSAgICAvKiBUaGUgYXJndW1lbnQgcmVsb2NhdGlvbiBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgYXJnX3JlbG9jOwotCi0gICAgLyogTnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0gICAgdW5zaWduZWQgaW50IGFyZ19jb3VudDsKLSAgfTsKLQotI2lmZGVmIE9CSl9TT00KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZW50cnkgaW4gdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkKLSAgIGNoYWluLiAgKi8KLQotc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4KLSAgewotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyIGNvZGUuICAqLwotICAgIHVuc2lnbmVkIGludCBzc2RfZGVmaW5lZDsKLQotICAgIC8qIE5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgY2hhciAqc3NkX25hbWU7Ci0KLSAgICAvKiBHQVMgc2VnbWVudCBhbmQgc3Vic2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKnNzZF9zZWc7Ci0gICAgaW50IHNzZF9zdWJzZWc7Ci0KLSAgICAvKiBOZXh0IHNwYWNlIGluIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5IGNoYWluLiAgKi8KLSAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbiAqc3NkX25leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc3NkX2NoYWluX3N0cnVjdDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBlbnRyeSBpbiB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeQotICAgY2hhaW4uICAqLwotCi1zdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9jaGFpbgotICB7Ci0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZSBvcgotICAgICAgIGFzIGEgZGVmYXVsdCBzcGFjZS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX2RlZmluZWQ7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2VzIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX3VzZXJfZGVmaW5lZDsKLQotICAgIC8qIFRoZSBzcGFjZSBudW1iZXIgKG9yIGluZGV4KS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX3NwbnVtOwotCi0gICAgLyogVGhlIG5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgY2hhciAqc2RfbmFtZTsKLQotICAgIC8qIEdBUyBzZWdtZW50IHRvIHdoaWNoIHRoaXMgc3Vic3BhY2UgY29ycmVzcG9uZHMuICAqLwotICAgIGFzZWN0aW9uICpzZF9zZWc7Ci0KLSAgICAvKiBDdXJyZW50IHN1YnNlZ21lbnQgbnVtYmVyIGJlaW5nIHVzZWQuICAqLwotICAgIGludCBzZF9sYXN0X3N1YnNlZzsKLQotICAgIC8qIFRoZSBjaGFpbiBvZiBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwYWNlLiAgKi8KLSAgICBzc2RfY2hhaW5fc3RydWN0ICpzZF9zdWJzcGFjZXM7Ci0KLSAgICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGUgc3BhY2UgZGljdGlvbmFyeSBjaGFpbi4gICovCi0gICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gKnNkX25leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc2RfY2hhaW5fc3RydWN0OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGF0dHJpYnV0ZXMgb2YgdGhlIGRlZmF1bHQgc3Vic3BhY2UKLSAgIGRpY3Rpb25hcnkgZW50cmllcy4gICovCi0KLXN0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QKLSAgewotICAgIC8qIE5hbWUgb2YgdGhlIHN1YnNwYWNlLiAgKi8KLSAgICBjaGFyICpuYW1lOwotCi0gICAgLyogRklYTUUuICBJcyB0aGlzIHN0aWxsIG5lZWRlZD8gICovCi0gICAgY2hhciBkZWZpbmVkOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGlzIGxvYWRhYmxlLiAgKi8KLSAgICBjaGFyIGxvYWRhYmxlOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGNvbnRhaW5zIG9ubHkgY29kZS4gICovCi0gICAgY2hhciBjb2RlX29ubHk7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBjb21tb24gc3Vic3BhY2UuICAqLwotICAgIGNoYXIgY29tbW9uOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN1YnNwYWNlIHdoaWNoIGFsbG93cyBzeW1ib2xzCi0gICAgICAgdG8gYmUgbXVsdGlwbHkgZGVmaW5lZC4gICovCi0gICAgY2hhciBkdXBfY29tbW9uOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIHNob3VsZCBiZSB6ZXJvIGZpbGxlZC4gICovCi0gICAgY2hhciB6ZXJvOwotCi0gICAgLyogU29ydCBrZXkgZm9yIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIHVuc2lnbmVkIGNoYXIgc29ydDsKLQotICAgIC8qIEFjY2VzcyBjb250cm9sIGJpdHMgZm9yIHRoaXMgc3Vic3BhY2UuICBDYW4gcmVwcmVzZW50IFJXWCBhY2Nlc3MKLSAgICAgICBhcyB3ZWxsIGFzIHByaXZpbGVnZSBsZXZlbCBjaGFuZ2VzIGZvciBnYXRld2F5cy4gICovCi0gICAgaW50IGFjY2VzczsKLQotICAgIC8qIEluZGV4IG9mIGNvbnRhaW5pbmcgc3BhY2UuICAqLwotICAgIGludCBzcGFjZV9pbmRleDsKLQotICAgIC8qIEFsaWdubWVudCAoaW4gYnl0ZXMpIG9mIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIGludCBhbGlnbm1lbnQ7Ci0KLSAgICAvKiBRdWFkcmFudCB3aXRoaW4gc3BhY2Ugd2hlcmUgdGhpcyBzdWJzcGFjZSBzaG91bGQgYmUgbG9hZGVkLiAgKi8KLSAgICBpbnQgcXVhZHJhbnQ7Ci0KLSAgICAvKiBBbiBpbmRleCBpbnRvIHRoZSBkZWZhdWx0IHNwYWNlcyBhcnJheS4gICovCi0gICAgaW50IGRlZl9zcGFjZV9pbmRleDsKLQotICAgIC8qIFN1YnNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIHN1YnNlZ1Qgc3Vic2VnbWVudDsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhdHRyaWJ1dGVzIG9mIHRoZSBkZWZhdWx0IHNwYWNlCi0gICBkaWN0aW9uYXJ5IGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgZGVmYXVsdF9zcGFjZV9kaWN0Ci0gIHsKLSAgICAvKiBOYW1lIG9mIHRoZSBzcGFjZS4gICovCi0gICAgY2hhciAqbmFtZTsKLQotICAgIC8qIFNwYWNlIG51bWJlci4gIEl0IGlzIHBvc3NpYmxlIHRvIGlkZW50aWZ5IHNwYWNlcyB3aXRoaW4KLSAgICAgICBhc3NlbWJseSBjb2RlIG51bWVyaWNhbGx5ISAgKi8KLSAgICBpbnQgc3BudW07Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2UgaXMgbG9hZGFibGUuICAqLwotICAgIGNoYXIgbG9hZGFibGU7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2UgaXMgImRlZmluZWQiLiAgRklYTUUgaXMgc3RpbGwgbmVlZGVkICovCi0gICAgY2hhciBkZWZpbmVkOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGNhbiBub3QgYmUgc2hhcmVkLiAgKi8KLSAgICBjaGFyIHByaXZhdGU7Ci0KLSAgICAvKiBTb3J0IGtleSBmb3IgdGhpcyBzcGFjZS4gICovCi0gICAgdW5zaWduZWQgY2hhciBzb3J0OwotCi0gICAgLyogU2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKnNlZ21lbnQ7Ci0gIH07Ci0jZW5kaWYKLQotLyogU3RydWN0dXJlIGZvciBwcmV2aW91cyBsYWJlbCB0cmFja2luZy4gIE5lZWRlZCBzbyB0aGF0IGFsaWdubWVudHMsCi0gICBjYWxsaW5mbyBkZWNsYXJhdGlvbnMsIGV0YyBjYW4gYmUgZWFzaWx5IGF0dGFjaGVkIHRvIGEgcGFydGljdWxhcgotICAgbGFiZWwuICAqLwotdHlwZWRlZiBzdHJ1Y3QgbGFiZWxfc3ltYm9sX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IHN5bWJvbCAqbHNzX2xhYmVsOwotI2lmZGVmIE9CSl9TT00KLSAgICBzZF9jaGFpbl9zdHJ1Y3QgKmxzc19zcGFjZTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBzZWdUIGxzc19zZWdtZW50OwotI2VuZGlmCi0gICAgc3RydWN0IGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxzc19uZXh0OwotICB9Ci1sYWJlbF9zeW1ib2xfc3RydWN0OwotCi0vKiBFeHRyYSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcGVyZm9ybSBmaXh1cHMgKHJlbG9jYXRpb25zKSBvbiB0aGUgUEEuICAqLwotc3RydWN0IGhwcGFfZml4X3N0cnVjdAotICB7Ci0gICAgLyogVGhlIGZpZWxkIHNlbGVjdG9yLiAgKi8KLSAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgZnhfcl9maWVsZDsKLQotICAgIC8qIFR5cGUgb2YgZml4dXAuICAqLwotICAgIGludCBmeF9yX3R5cGU7Ci0KLSAgICAvKiBGb3JtYXQgb2YgZml4dXAuICAqLwotICAgIGludCBmeF9yX2Zvcm1hdDsKLQotICAgIC8qIEFyZ3VtZW50IHJlbG9jYXRpb24gYml0cy4gICovCi0gICAgbG9uZyBmeF9hcmdfcmVsb2M7Ci0KLSAgICAvKiBUaGUgc2VnbWVudCB0aGlzIGZpeHVwIGFwcGVhcnMgaW4uICAqLwotICAgIHNlZ1Qgc2VnbWVudDsKLSAgfTsKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotCi1zdHJ1Y3QgcGRfcmVnCi0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGludCB2YWx1ZTsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgbWFwcGluZyBmcm9tIGEgRlAgY29uZGl0aW9uIHN0cmluZwotICAgdG8gYSBjb25kaXRpb24gbnVtYmVyIHdoaWNoIGNhbiBiZSByZWNvcmRlZCBpbiBhbiBpbnN0cnVjdGlvbi4gICovCi1zdHJ1Y3QgZnBfY29uZF9tYXAKLSAgewotICAgIGNoYXIgKnN0cmluZzsKLSAgICBpbnQgY29uZDsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhIGZpZWxkIHNlbGVjdG9yCi0gICBzdHJpbmcgdG8gYSBmaWVsZCBzZWxlY3RvciB0eXBlLiAgKi8KLXN0cnVjdCBzZWxlY3Rvcl9lbnRyeQotICB7Ci0gICAgY2hhciAqcHJlZml4OwotICAgIGludCBmaWVsZF9zZWxlY3RvcjsKLSAgfTsKLQotLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGxvY2FsIHRvIHRjLWhwcGEuYy4gICovCi0KLSNpZmRlZiBPQkpfU09NCi1zdGF0aWMgdm9pZCBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotc3RhdGljIGZwX29wZXJhbmRfZm9ybWF0IHBhX3BhcnNlX2ZwX2Zvcm1hdCBQQVJBTVMgKChjaGFyICoqcykpOwotc3RhdGljIHZvaWQgcGFfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2RhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZmlsbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xjb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbHN5bSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3N0cmluZ2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3ZlcnNpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2ZwX2NtcF9jb25kIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgZ2V0X2V4cHJlc3Npb24gUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uIFBBUkFNUyAoKHN0cnVjdCBwYV9pdCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGV2YWx1YXRlX2Fic29sdXRlIFBBUkFNUyAoKHN0cnVjdCBwYV9pdCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBhX2J1aWxkX2FyZ19yZWxvYyBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfYWxpZ25fYXJnX3JlbG9jIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX251bGxpZiBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0ciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9jbXBiXzY0X2NtcGx0ciBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2NtcGliXzY0X2NtcGx0ciBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2FkZGJfNjRfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHBhX2Jsb2NrIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfYnJ0YWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV90cnkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jYWxsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY2FsbF9hcmdzIFBBUkFNUyAoKHN0cnVjdCBjYWxsX2Rlc2MgKikpOwotc3RhdGljIHZvaWQgcGFfY2FsbGluZm8gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jb2RlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2NvcHlyaWdodCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2VuZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2VudGVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZW50cnkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9lcXUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9leGl0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZXhwb3J0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdHlwZV9hcmdzIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9pbXBvcnQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9sYWJlbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xlYXZlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbGV2ZWwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9vcmlnaW4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfcHJvY2VuZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3BhcmFtIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdW5kZWZpbmVfbGFiZWwgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBuZWVkX3BhMTFfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCBwYV9pdCAqLAotCQkJCSAgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKikpOwotc3RhdGljIGludCBwYV9wYXJzZV9udW1iZXIgUEFSQU1TICgoY2hhciAqKiwgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKikpOwotc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKnBhX2dldF9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZkZWYgT0JKX1NPTQotc3RhdGljIHZvaWQgcGFfY29tcGlsZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9hbGlnbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3NwYWNlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfc3BudW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9zdWJzcGFjZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKmNyZWF0ZV9uZXdfc3BhY2UgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgYXNlY3Rpb24gKiwgaW50KSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqY3JlYXRlX25ld19zdWJzcGFjZSBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKiwKLQkJCQkJCSAgICAgIGNoYXIgKiwgaW50LCBpbnQsCi0JCQkJCQkgICAgICBpbnQsIGludCwgaW50LAotCQkJCQkJICAgICAgaW50LCBpbnQsIGludCwgaW50LAotCQkJCQkJICAgICAgaW50LCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqdXBkYXRlX3N1YnNwYWNlIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqLAotCQkJCQkJICBjaGFyICosIGludCwgaW50LCBpbnQsCi0JCQkJCQkgIGludCwgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgYXNlY3Rpb24gKikpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqaXNfZGVmaW5lZF9zcGFjZSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICppc19kZWZpbmVkX3N1YnNwYWNlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqcGFfc2VnbWVudF90b19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqLAotCQkJCQkJCSAgICBzdWJzZWdUKSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9maW5kX3NwYWNlX2J5X251bWJlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfc3Vic3BhY2Vfc3RhcnQgUEFSQU1TICgoc2RfY2hhaW5fc3RydWN0ICosIGludCkpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqcGFfcGFyc2Vfc3BhY2Vfc3RtdCBQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIGludCBwYV9uZXh0X3N1YnNlZyBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKikpOwotc3RhdGljIHZvaWQgcGFfc3BhY2VzX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgcGFfaXAgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBmaXhfbmV3X2hwcGEgUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBpbnQsIHN5bWJvbFMgKiwKLQkJCQkgIGxvbmcsIGV4cHJlc3Npb25TICosIGludCwKLQkJCQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKLQkJCQkgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKLQkJCQkgIGludCwgbG9uZywgaW50ICopKTsKLXN0YXRpYyBpbnQgaXNfZW5kX29mX3N0YXRlbWVudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgaXNfc2FtZV9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGZyYWdTICopKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfZXhpdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBhX3N0cmluZ2VyX2F1eCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBmcF9vcGVyYW5kX2Zvcm1hdCBwYV9wYXJzZV9mcF9jbnZfZm9ybWF0IFBBUkFNUyAoKGNoYXIgKipzKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2Z0ZXN0X2dmeF9jb21wbGV0ZXIgUEFSQU1TICgoY2hhciAqKikpOwotCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlIFBBUkFNUyAoKHN0cnVjdCBjYWxsX2luZm8gKikpOwotI2VuZGlmCi0KLS8qIEZpbGUgYW5kIGdsb2FsbHkgc2NvcGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gICovCi0KLSNpZmRlZiBPQkpfU09NCi0vKiBSb290IGFuZCBmaW5hbCBlbnRyeSBpbiB0aGUgc3BhY2UgY2hhaW4uICAqLwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfZGljdF9yb290Owotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfZGljdF9sYXN0OwotCi0vKiBUaGUgY3VycmVudCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqY3VycmVudF9zcGFjZTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICpjdXJyZW50X3N1YnNwYWNlOwotI2VuZGlmCi0KLS8qIFJvb3Qgb2YgdGhlIGNhbGxfaW5mbyBjaGFpbi4gICovCi1zdGF0aWMgc3RydWN0IGNhbGxfaW5mbyAqY2FsbF9pbmZvX3Jvb3Q7Ci0KLS8qIFRoZSBsYXN0IGNhbGxfaW5mbyAoZm9yIGZ1bmN0aW9ucykgc3RydWN0dXJlCi0gICBzZWVuIHNvIGl0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZml4dXBzIGFuZAotICAgZnVuY3Rpb24gbGFiZWxzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2FsbF9pbmZvICpsYXN0X2NhbGxfaW5mbzsKLQotLyogVGhlIGxhc3QgY2FsbCBkZXNjcmlwdGlvbiAoZm9yIGFjdHVhbCBjYWxscykuICAqLwotc3RhdGljIHN0cnVjdCBjYWxsX2Rlc2MgbGFzdF9jYWxsX2Rlc2M7Ci0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwuICAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRhYmxlIG9mIHBzZXVkbyBvcHMgZm9yIHRoZSBQQS4gIEZJWE1FIC0tIGhvdyBtYW55IG9mIHRoZXNlCi0gICBhcmUgbm93IHJlZHVuZGFudCB3aXRoIHRoZSBvdmVyYWxsIEdBUyBhbmQgdGhlIG9iamVjdCBmaWxlCi0gICBkZXBlbmRlbnQgdGFibGVzPyAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIC8qIGFsaWduIHBzZXVkby1vcHMgb24gdGhlIFBBIHNwZWNpZnkgdGhlIGFjdHVhbCBhbGlnbm1lbnQgcmVxdWVzdGVkLAotICAgICBub3QgdGhlIGxvZzIgb2YgdGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuICAqLwotI2lmZGVmIE9CSl9TT00KLSAgeyJhbGlnbiIsIHBhX2FsaWduLCA4fSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDh9LAotI2VuZGlmCi0gIHsiYmVnaW5fYnJ0YWIiLCBwYV9icnRhYiwgMX0sCi0gIHsiYmVnaW5fdHJ5IiwgcGFfdHJ5LCAxfSwKLSAgeyJibG9jayIsIHBhX2Jsb2NrLCAxfSwKLSAgeyJibG9ja3oiLCBwYV9ibG9jaywgMH0sCi0gIHsiYnl0ZSIsIHBhX2NvbnMsIDF9LAotICB7ImNhbGwiLCBwYV9jYWxsLCAwfSwKLSAgeyJjYWxsaW5mbyIsIHBhX2NhbGxpbmZvLCAwfSwKLSAgeyJjb2RlIiwgcGFfY29kZSwgMH0sCi0gIHsiY29tbSIsIHBhX2NvbW0sIDB9LAotI2lmZGVmIE9CSl9TT00KLSAgeyJjb21waWxlciIsIHBhX2NvbXBpbGVyLCAwfSwKLSNlbmRpZgotICB7ImNvcHlyaWdodCIsIHBhX2NvcHlyaWdodCwgMH0sCi0gIHsiZGF0YSIsIHBhX2RhdGEsIDB9LAotICB7ImRvdWJsZSIsIHBhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZHdvcmQiLCBwYV9jb25zLCA4fSwKLSAgeyJlbmQiLCBwYV9lbmQsIDB9LAotICB7ImVuZF9icnRhYiIsIHBhX2JydGFiLCAwfSwKLSAgeyJlbmRfdHJ5IiwgcGFfdHJ5LCAwfSwKLSAgeyJlbnRlciIsIHBhX2VudGVyLCAwfSwKLSAgeyJlbnRyeSIsIHBhX2VudHJ5LCAwfSwKLSAgeyJlcXUiLCBwYV9lcXUsIDB9LAotICB7ImV4aXQiLCBwYV9leGl0LCAwfSwKLSAgeyJleHBvcnQiLCBwYV9leHBvcnQsIDB9LAotI2lmZGVmIE9CSl9FTEYKLSAgeyAiZmlsZSIsIGR3YXJmMl9kaXJlY3RpdmVfZmlsZSB9LAotI2VuZGlmCi0gIHsiZmlsbCIsIHBhX2ZpbGwsIDB9LAotICB7ImZsb2F0IiwgcGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJoYWxmIiwgcGFfY29ucywgMn0sCi0gIHsiaW1wb3J0IiwgcGFfaW1wb3J0LCAwfSwKLSAgeyJpbnQiLCBwYV9jb25zLCA0fSwKLSAgeyJsYWJlbCIsIHBhX2xhYmVsLCAwfSwKLSAgeyJsY29tbSIsIHBhX2xjb21tLCAwfSwKLSAgeyJsZWF2ZSIsIHBhX2xlYXZlLCAwfSwKLSAgeyJsZXZlbCIsIHBhX2xldmVsLCAwfSwKLSNpZmRlZiBPQkpfRUxGCi0gIHsgImxvYyIsIGR3YXJmMl9kaXJlY3RpdmVfbG9jIH0sCi0jZW5kaWYKLSAgeyJsb25nIiwgcGFfY29ucywgNH0sCi0gIHsibHN5bSIsIHBhX2xzeW0sIDB9LAotI2lmZGVmIE9CSl9TT00KLSAgeyJuc3Vic3BhIiwgcGFfc3Vic3BhY2UsIDF9LAotI2VuZGlmCi0gIHsib2N0YSIsIHBhX2NvbnMsIDE2fSwKLSAgeyJvcmciLCBwYV9vcmlnaW4sIDB9LAotICB7Im9yaWdpbiIsIHBhX29yaWdpbiwgMH0sCi0gIHsicGFyYW0iLCBwYV9wYXJhbSwgMH0sCi0gIHsicHJvYyIsIHBhX3Byb2MsIDB9LAotICB7InByb2NlbmQiLCBwYV9wcm9jZW5kLCAwfSwKLSAgeyJxdWFkIiwgcGFfY29ucywgOH0sCi0gIHsicmVnIiwgcGFfZXF1LCAxfSwKLSAgeyJzaG9ydCIsIHBhX2NvbnMsIDJ9LAotICB7InNpbmdsZSIsIHBhX2Zsb2F0X2NvbnMsICdmJ30sCi0jaWZkZWYgT0JKX1NPTQotICB7InNwYWNlIiwgcGFfc3BhY2UsIDB9LAotICB7InNwbnVtIiwgcGFfc3BudW0sIDB9LAotI2VuZGlmCi0gIHsic3RyaW5nIiwgcGFfc3RyaW5nZXIsIDB9LAotICB7InN0cmluZ3oiLCBwYV9zdHJpbmdlciwgMX0sCi0jaWZkZWYgT0JKX1NPTQotICB7InN1YnNwYSIsIHBhX3N1YnNwYWNlLCAwfSwKLSNlbmRpZgotICB7InRleHQiLCBwYV90ZXh0LCAwfSwKLSAgeyJ2ZXJzaW9uIiwgcGFfdmVyc2lvbiwgMH0sCi0gIHsid29yZCIsIHBhX2NvbnMsIDR9LAotICB7TlVMTCwgMCwgMH0KLX07Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQuCi0KLSAgIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuCi0KLSAgIEFsc28gbm90ZSB0aGF0IEMgc3R5bGUgY29tbWVudHMgd2lsbCBhbHdheXMgd29yay4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggYWN0IGFzIGxpbmUgc2VwYXJhdG9ycy4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiISI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4KLSAgIEFzIGluIDBmMTIuNDU2IG9yIDBkMS4yMzQ1ZTEyLgotCi0gICBCZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYWUgdG8ga25vdyBhYm91IGl0IGF0Ci0gICBhbGwsIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotc3RhdGljIHN0cnVjdCBwYV9pdCB0aGVfaW5zbjsKLQotLyogUG9pbnRzIHRvIHRoZSBlbmQgb2YgYW4gZXhwcmVzc2lvbiBqdXN0IHBhcnNlZCBieSBnZXRfZXhwcmVzc29pbgotICAgYW5kIGZyaWVuZHMuICBGSVhNRS4gIFRoaXMgc2hvdWxkbid0IGJlIGhhbmRsZWQgd2l0aCBhIGZpbGUtZ2xvYmFsCi0gICB2YXJpYWJsZS4gICovCi1zdGF0aWMgY2hhciAqZXhwcl9lbmQ7Ci0KLS8qIE5vbnplcm8gaWYgYSAuY2FsbGluZm8gYXBwZWFyZWQgd2l0aGluIHRoZSBjdXJyZW50IHByb2NlZHVyZS4gICovCi1zdGF0aWMgaW50IGNhbGxpbmZvX2ZvdW5kOwotCi0vKiBOb256ZXJvIGlmIHRoZSBhc3NlbWJsZXIgaXMgY3VycmVudGx5IHdpdGhpbiBhIC5lbnRyeS8uZXhpdCBwYWlyLiAgKi8KLXN0YXRpYyBpbnQgd2l0aGluX2VudHJ5X2V4aXQ7Ci0KLS8qIE5vbnplcm8gaWYgdGhlIGFzc2VtYmxlciBpcyBjdXJyZW50bHkgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uICAqLwotc3RhdGljIGludCB3aXRoaW5fcHJvY2VkdXJlOwotCi0vKiBIYW5kbGUgb24gc3RydWN1dHJlIHdoaWNoIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgc3ltYm9sCi0gICBzZWVuIGluIGVhY2ggc3Vic3BhY2UuICAqLwotc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbHNfcm9vdHAgPSBOVUxMOwotCi0vKiBIb2xkcyB0aGUgbGFzdCBmaWVsZCBzZWxlY3Rvci4gICovCi1zdGF0aWMgaW50IGhwcGFfZmllbGRfc2VsZWN0b3I7Ci0KLS8qIE5vbnplcm8gd2hlbiBzdHJpY3Qgc3ludGF4IGNoZWNraW5nIGlzIGVuYWJsZWQuICBaZXJvIG90aGVyd2lzZS4KLQotICAgRWFjaCBvcGNvZGUgaW4gdGhlIHRhYmxlIGhhcyBhIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90Ci0gICBzdHJpY3Qgc3ludGF4IGNoZWNraW5nIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGF0IGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgc3RyaWN0ID0gMDsKLQotI2lmZGVmIE9CSl9TT00KLS8qIEEgZHVtbXkgYmZkIHN5bWJvbCBzbyB0aGF0IGFsbCByZWxvY2F0aW9ucyBoYXZlIHN5bWJvbHMgb2Ygc29tZSBraW5kLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpkdW1teV9zeW1ib2w7Ci0jZW5kaWYKLQotLyogTm9uemVybyBpZiBlcnJvcnMgYXJlIHRvIGJlIHByaW50ZWQuICAqLwotc3RhdGljIGludCBwcmludF9lcnJvcnMgPSAxOwotCi0vKiBMaXN0IG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBwcmUtZGVmaW5lZDoKLQotICAgRWFjaCBnZW5lcmFsIHJlZ2lzdGVyIGhhcyBvbmUgcHJlZGVmaW5lZCBuYW1lIG9mIHRoZSBmb3JtCi0gICAlcjxSRUdOVU0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPFJFR05VTT4uCi0KLSAgIFNwYWNlIGFuZCBjb250cm9sIHJlZ2lzdGVycyBhcmUgaGFuZGxlZCBpbiBhIHNpbWlsYXIgbWFubmVyLAotICAgYnV0IHVzZSAlc3I8UkVHTlVNPiBhbmQgJWNyPFJFR05VTT4gYXMgdGhlaXIgcHJlZGVmaW5lZCBuYW1lcy4KLQotICAgTGlrZXdpc2UgZm9yIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMsIGJ1dCBvZiB0aGUgZm9ybQotICAgJWZyPFJFR05VTT4uICBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaGF2ZSBhZGRpdGlvbmFsIHByZWRlZmluZWQKLSAgIG5hbWVzIHdpdGggJ0wnIGFuZCAnUicgc3VmZml4ZXMgKGUuZy4gJWZyMTlMLCAlZnIxOVIpIHdoaWNoCi0gICBhZ2FpbiBoYXZlIHRoZSB2YWx1ZSA8UkVHTlVNPi4KLQotICAgTWFueSByZWdpc3RlcnMgYWxzbyBoYXZlIHN5bm9ueW1zOgotCi0gICAlcjI2IC0gJXIyMyBoYXZlICVhcmcwIC0gJWFyZzMgYXMgc3lub255bXMKLSAgICVyMjggLSAlcjI5IGhhdmUgJXJldDAgLSAlcmV0MSBhcyBzeW5vbnltcwotICAgJXIzMCBoYXMgJXNwIGFzIGEgc3lub255bQotICAgJXIyNyBoYXMgJWRwIGFzIGEgc3lub255bQotICAgJXIyICBoYXMgJXJwIGFzIGEgc3lub255bQotCi0gICBBbG1vc3QgZXZlcnkgY29udHJvbCByZWdpc3RlciBoYXMgYSBzeW5vbnltOyB0aGV5IGFyZSBub3QgbGlzdGVkCi0gICBoZXJlIGZvciBicmV2aXR5LgotCi0gICBUaGUgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW10gPQotewotICB7IiVhcmcwIiwgMjZ9LAotICB7IiVhcmcxIiwgMjV9LAotICB7IiVhcmcyIiwgMjR9LAotICB7IiVhcmczIiwgMjN9LAotICB7IiVjcjAiLCAwfSwKLSAgeyIlY3IxMCIsIDEwfSwKLSAgeyIlY3IxMSIsIDExfSwKLSAgeyIlY3IxMiIsIDEyfSwKLSAgeyIlY3IxMyIsIDEzfSwKLSAgeyIlY3IxNCIsIDE0fSwKLSAgeyIlY3IxNSIsIDE1fSwKLSAgeyIlY3IxNiIsIDE2fSwKLSAgeyIlY3IxNyIsIDE3fSwKLSAgeyIlY3IxOCIsIDE4fSwKLSAgeyIlY3IxOSIsIDE5fSwKLSAgeyIlY3IyMCIsIDIwfSwKLSAgeyIlY3IyMSIsIDIxfSwKLSAgeyIlY3IyMiIsIDIyfSwKLSAgeyIlY3IyMyIsIDIzfSwKLSAgeyIlY3IyNCIsIDI0fSwKLSAgeyIlY3IyNSIsIDI1fSwKLSAgeyIlY3IyNiIsIDI2fSwKLSAgeyIlY3IyNyIsIDI3fSwKLSAgeyIlY3IyOCIsIDI4fSwKLSAgeyIlY3IyOSIsIDI5fSwKLSAgeyIlY3IzMCIsIDMwfSwKLSAgeyIlY3IzMSIsIDMxfSwKLSAgeyIlY3I4IiwgOH0sCi0gIHsiJWNyOSIsIDl9LAotICB7IiVkcCIsIDI3fSwKLSAgeyIlZWllbSIsIDE1fSwKLSAgeyIlZWlyciIsIDIzfSwKLSAgeyIlZnIwIiwgMH0sCi0gIHsiJWZyMGwiLCAwfSwKLSAgeyIlZnIwciIsIDB9LAotICB7IiVmcjEiLCAxfSwKLSAgeyIlZnIxMCIsIDEwfSwKLSAgeyIlZnIxMGwiLCAxMH0sCi0gIHsiJWZyMTByIiwgMTB9LAotICB7IiVmcjExIiwgMTF9LAotICB7IiVmcjExbCIsIDExfSwKLSAgeyIlZnIxMXIiLCAxMX0sCi0gIHsiJWZyMTIiLCAxMn0sCi0gIHsiJWZyMTJsIiwgMTJ9LAotICB7IiVmcjEyciIsIDEyfSwKLSAgeyIlZnIxMyIsIDEzfSwKLSAgeyIlZnIxM2wiLCAxM30sCi0gIHsiJWZyMTNyIiwgMTN9LAotICB7IiVmcjE0IiwgMTR9LAotICB7IiVmcjE0bCIsIDE0fSwKLSAgeyIlZnIxNHIiLCAxNH0sCi0gIHsiJWZyMTUiLCAxNX0sCi0gIHsiJWZyMTVsIiwgMTV9LAotICB7IiVmcjE1ciIsIDE1fSwKLSAgeyIlZnIxNiIsIDE2fSwKLSAgeyIlZnIxNmwiLCAxNn0sCi0gIHsiJWZyMTZyIiwgMTZ9LAotICB7IiVmcjE3IiwgMTd9LAotICB7IiVmcjE3bCIsIDE3fSwKLSAgeyIlZnIxN3IiLCAxN30sCi0gIHsiJWZyMTgiLCAxOH0sCi0gIHsiJWZyMThsIiwgMTh9LAotICB7IiVmcjE4ciIsIDE4fSwKLSAgeyIlZnIxOSIsIDE5fSwKLSAgeyIlZnIxOWwiLCAxOX0sCi0gIHsiJWZyMTlyIiwgMTl9LAotICB7IiVmcjFsIiwgMX0sCi0gIHsiJWZyMXIiLCAxfSwKLSAgeyIlZnIyIiwgMn0sCi0gIHsiJWZyMjAiLCAyMH0sCi0gIHsiJWZyMjBsIiwgMjB9LAotICB7IiVmcjIwciIsIDIwfSwKLSAgeyIlZnIyMSIsIDIxfSwKLSAgeyIlZnIyMWwiLCAyMX0sCi0gIHsiJWZyMjFyIiwgMjF9LAotICB7IiVmcjIyIiwgMjJ9LAotICB7IiVmcjIybCIsIDIyfSwKLSAgeyIlZnIyMnIiLCAyMn0sCi0gIHsiJWZyMjMiLCAyM30sCi0gIHsiJWZyMjNsIiwgMjN9LAotICB7IiVmcjIzciIsIDIzfSwKLSAgeyIlZnIyNCIsIDI0fSwKLSAgeyIlZnIyNGwiLCAyNH0sCi0gIHsiJWZyMjRyIiwgMjR9LAotICB7IiVmcjI1IiwgMjV9LAotICB7IiVmcjI1bCIsIDI1fSwKLSAgeyIlZnIyNXIiLCAyNX0sCi0gIHsiJWZyMjYiLCAyNn0sCi0gIHsiJWZyMjZsIiwgMjZ9LAotICB7IiVmcjI2ciIsIDI2fSwKLSAgeyIlZnIyNyIsIDI3fSwKLSAgeyIlZnIyN2wiLCAyN30sCi0gIHsiJWZyMjdyIiwgMjd9LAotICB7IiVmcjI4IiwgMjh9LAotICB7IiVmcjI4bCIsIDI4fSwKLSAgeyIlZnIyOHIiLCAyOH0sCi0gIHsiJWZyMjkiLCAyOX0sCi0gIHsiJWZyMjlsIiwgMjl9LAotICB7IiVmcjI5ciIsIDI5fSwKLSAgeyIlZnIybCIsIDJ9LAotICB7IiVmcjJyIiwgMn0sCi0gIHsiJWZyMyIsIDN9LAotICB7IiVmcjMwIiwgMzB9LAotICB7IiVmcjMwbCIsIDMwfSwKLSAgeyIlZnIzMHIiLCAzMH0sCi0gIHsiJWZyMzEiLCAzMX0sCi0gIHsiJWZyMzFsIiwgMzF9LAotICB7IiVmcjMxciIsIDMxfSwKLSAgeyIlZnIzbCIsIDN9LAotICB7IiVmcjNyIiwgM30sCi0gIHsiJWZyNCIsIDR9LAotICB7IiVmcjRsIiwgNH0sCi0gIHsiJWZyNHIiLCA0fSwKLSAgeyIlZnI1IiwgNX0sCi0gIHsiJWZyNWwiLCA1fSwKLSAgeyIlZnI1ciIsIDV9LAotICB7IiVmcjYiLCA2fSwKLSAgeyIlZnI2bCIsIDZ9LAotICB7IiVmcjZyIiwgNn0sCi0gIHsiJWZyNyIsIDd9LAotICB7IiVmcjdsIiwgN30sCi0gIHsiJWZyN3IiLCA3fSwKLSAgeyIlZnI4IiwgOH0sCi0gIHsiJWZyOGwiLCA4fSwKLSAgeyIlZnI4ciIsIDh9LAotICB7IiVmcjkiLCA5fSwKLSAgeyIlZnI5bCIsIDl9LAotICB7IiVmcjlyIiwgOX0sCi0gIHsiJWh0YSIsIDI1fSwKLSAgeyIlaWlyIiwgMTl9LAotICB7IiVpb3IiLCAyMX0sCi0gIHsiJWlwc3ciLCAyMn0sCi0gIHsiJWlzciIsIDIwfSwKLSAgeyIlaXRtciIsIDE2fSwKLSAgeyIlaXZhIiwgMTR9LAotICB7IiVwY29xIiwgMTh9LAotICB7IiVwY3NxIiwgMTd9LAotICB7IiVwaWRyMSIsIDh9LAotICB7IiVwaWRyMiIsIDl9LAotICB7IiVwaWRyMyIsIDEyfSwKLSAgeyIlcGlkcjQiLCAxM30sCi0gIHsiJXBwZGEiLCAyNH0sCi0gIHsiJXIwIiwgMH0sCi0gIHsiJXIxIiwgMX0sCi0gIHsiJXIxMCIsIDEwfSwKLSAgeyIlcjExIiwgMTF9LAotICB7IiVyMTIiLCAxMn0sCi0gIHsiJXIxMyIsIDEzfSwKLSAgeyIlcjE0IiwgMTR9LAotICB7IiVyMTUiLCAxNX0sCi0gIHsiJXIxNiIsIDE2fSwKLSAgeyIlcjE3IiwgMTd9LAotICB7IiVyMTgiLCAxOH0sCi0gIHsiJXIxOSIsIDE5fSwKLSAgeyIlcjIiLCAyfSwKLSAgeyIlcjIwIiwgMjB9LAotICB7IiVyMjEiLCAyMX0sCi0gIHsiJXIyMiIsIDIyfSwKLSAgeyIlcjIzIiwgMjN9LAotICB7IiVyMjQiLCAyNH0sCi0gIHsiJXIyNSIsIDI1fSwKLSAgeyIlcjI2IiwgMjZ9LAotICB7IiVyMjciLCAyN30sCi0gIHsiJXIyOCIsIDI4fSwKLSAgeyIlcjI5IiwgMjl9LAotICB7IiVyMyIsIDN9LAotICB7IiVyMzAiLCAzMH0sCi0gIHsiJXIzMSIsIDMxfSwKLSAgeyIlcjQiLCA0fSwKLSAgeyIlcjUiLCA1fSwKLSAgeyIlcjYiLCA2fSwKLSAgeyIlcjciLCA3fSwKLSAgeyIlcjgiLCA4fSwKLSAgeyIlcjkiLCA5fSwKLSAgeyIlcmN0ciIsIDB9LAotICB7IiVyZXQwIiwgMjh9LAotICB7IiVyZXQxIiwgMjl9LAotICB7IiVycCIsIDJ9LAotICB7IiVzYXIiLCAxMX0sCi0gIHsiJXNwIiwgMzB9LAotICB7IiVzcjAiLCAwfSwKLSAgeyIlc3IxIiwgMX0sCi0gIHsiJXNyMiIsIDJ9LAotICB7IiVzcjMiLCAzfSwKLSAgeyIlc3I0IiwgNH0sCi0gIHsiJXNyNSIsIDV9LAotICB7IiVzcjYiLCA2fSwKLSAgeyIlc3I3IiwgN30sCi0gIHsiJXRyMCIsIDI0fSwKLSAgeyIldHIxIiwgMjV9LAotICB7IiV0cjIiLCAyNn0sCi0gIHsiJXRyMyIsIDI3fSwKLSAgeyIldHI0IiwgMjh9LAotICB7IiV0cjUiLCAyOX0sCi0gIHsiJXRyNiIsIDMwfSwKLSAgeyIldHI3IiwgMzF9Ci19OwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZCBieSBvcmRlciBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuIFRoaXMgaXMKLSAgIHNvIHdlIGNoZWNrIGZvciA8PiBiZWZvcmUgd2UgY2hlY2sgZm9yIDwuIElmIHdlIGhhZCBhIDw+IGFuZCBjaGVja2VkCi0gICBmb3IgPCBmaXJzdCwgd2Ugd291bGQgZ2V0IGEgZmFsc2UgbWF0Y2guICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmcF9jb25kX21hcCBmcF9jb25kX21hcFtdID0KLXsKLSAgeyJmYWxzZT8iLCAwfSwKLSAgeyJmYWxzZSIsIDF9LAotICB7InRydWU/IiwgMzB9LAotICB7InRydWUiLCAzMX0sCi0gIHsiITw9PiIsIDN9LAotICB7IiE/Pj0iLCA4fSwKLSAgeyIhPzw9IiwgMTZ9LAotICB7IiE8PiIsIDd9LAotICB7IiE+PSIsIDExfSwKLSAgeyIhPz4iLCAxMn0sCi0gIHsiPzw9IiwgMTR9LAotICB7IiE8PSIsIDE5fSwKLSAgeyIhPzwiLCAyMH0sCi0gIHsiPz49IiwgMjJ9LAotICB7IiE/PSIsIDI0fSwKLSAgeyIhPXQiLCAyN30sCi0gIHsiPD0+IiwgMjl9LAotICB7Ij10IiwgNX0sCi0gIHsiPz0iLCA2fSwKLSAgeyI/PCIsIDEwfSwKLSAgeyI8PSIsIDEzfSwKLSAgeyIhPiIsIDE1fSwKLSAgeyI/PiIsIDE4fSwKLSAgeyI+PSIsIDIxfSwKLSAgeyIhPCIsIDIzfSwKLSAgeyI8PiIsIDI1fSwKLSAgeyIhPSIsIDI2fSwKLSAgeyIhPyIsIDI4fSwKLSAgeyI/IiwgMn0sCi0gIHsiPSIsIDR9LAotICB7IjwiLCA5fSwKLSAgeyI+IiwgMTd9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlbGVjdG9yX2VudHJ5IHNlbGVjdG9yX3RhYmxlW10gPQotewotICB7ImYiLCBlX2ZzZWx9LAotICB7ImwiLCBlX2xzZWx9LAotICB7ImxkIiwgZV9sZHNlbH0sCi0gIHsibHAiLCBlX2xwc2VsfSwKLSAgeyJsciIsIGVfbHJzZWx9LAotICB7ImxzIiwgZV9sc3NlbH0sCi0gIHsibHQiLCBlX2x0c2VsfSwKLSAgeyJsdHAiLCBlX2x0cHNlbH0sCi0gIHsibiIsIGVfbnNlbH0sCi0gIHsibmwiLCBlX25sc2VsfSwKLSAgeyJubHIiLCBlX25scnNlbH0sCi0gIHsicCIsIGVfcHNlbH0sCi0gIHsiciIsIGVfcnNlbH0sCi0gIHsicmQiLCBlX3Jkc2VsfSwKLSAgeyJycCIsIGVfcnBzZWx9LAotICB7InJyIiwgZV9ycnNlbH0sCi0gIHsicnMiLCBlX3Jzc2VsfSwKLSAgeyJydCIsIGVfcnRzZWx9LAotICB7InJ0cCIsIGVfcnRwc2VsfSwKLSAgeyJ0IiwgZV90c2VsfSwKLX07Ci0KLSNpZmRlZiBPQkpfU09NCi0vKiBkZWZhdWx0IHNwYWNlIGFuZCBzdWJzcGFjZSBkaWN0aW9uYXJpZXMgKi8KLQotI2RlZmluZSBHREJfU1lNQk9MUyAgICAgICAgICBHREJfU1lNQk9MU19TVUJTUEFDRV9OQU1FCi0jZGVmaW5lIEdEQl9TVFJJTkdTICAgICAgICAgIEdEQl9TVFJJTkdTX1NVQlNQQUNFX05BTUUKLQotLyogcHJlLWRlZmluZWQgc3Vic2VnbWVudHMgKHN1YnNwYWNlcykgZm9yIHRoZSBIUFBBLiAgKi8KLSNkZWZpbmUgU1VCU0VHX0NPREUgICAwCi0jZGVmaW5lIFNVQlNFR19MSVQgICAgMQotI2RlZmluZSBTVUJTRUdfTUlMTEkgIDIKLSNkZWZpbmUgU1VCU0VHX0RBVEEgICAwCi0jZGVmaW5lIFNVQlNFR19CU1MgICAgMgotI2RlZmluZSBTVUJTRUdfVU5XSU5EIDMKLSNkZWZpbmUgU1VCU0VHX0dEQl9TVFJJTkdTIDAKLSNkZWZpbmUgU1VCU0VHX0dEQl9TWU1CT0xTIDEKLQotc3RhdGljIHN0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QgcGFfZGVmX3N1YnNwYWNlc1tdID0KLXsKLSAgeyIkQ09ERSQiLCAxLCAxLCAxLCAwLCAwLCAwLCAyNCwgMHgyYywgMCwgOCwgMCwgMCwgU1VCU0VHX0NPREV9LAotICB7IiREQVRBJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDI0LCAweDFmLCAxLCA4LCAxLCAxLCBTVUJTRUdfREFUQX0sCi0gIHsiJExJVCQiLCAxLCAxLCAwLCAwLCAwLCAwLCAxNiwgMHgyYywgMCwgOCwgMCwgMCwgU1VCU0VHX0xJVH0sCi0gIHsiJE1JTExJQ09ERSQiLCAxLCAxLCAwLCAwLCAwLCAwLCA4LCAweDJjLCAwLCA4LCAwLCAwLCBTVUJTRUdfTUlMTEl9LAotICB7IiRCU1MkIiwgMSwgMSwgMCwgMCwgMCwgMSwgODAsIDB4MWYsIDEsIDgsIDEsIDEsIFNVQlNFR19CU1N9LAotICB7TlVMTCwgMCwgMSwgMCwgMCwgMCwgMCwgMjU1LCAweDFmLCAwLCA0LCAwLCAwLCAwfQotfTsKLQotc3RhdGljIHN0cnVjdCBkZWZhdWx0X3NwYWNlX2RpY3QgcGFfZGVmX3NwYWNlc1tdID0KLXsKLSAgeyIkVEVYVCQiLCAwLCAxLCAxLCAwLCA4LCBBU0VDX05VTEx9LAotICB7IiRQUklWQVRFJCIsIDEsIDEsIDEsIDEsIDE2LCBBU0VDX05VTEx9LAotICB7TlVMTCwgMCwgMCwgMCwgMCwgMCwgQVNFQ19OVUxMfQotfTsKLQotLyogTWlzYyBsb2NhbCBkZWZpbml0aW9ucyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICAqLwotCi0vKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gbWFpbnRhaW4gc3BhY2VzL3N1YnNwYWNlcy4gICovCi0jZGVmaW5lIFNQQUNFX0RFRklORUQoc3BhY2VfY2hhaW4pCShzcGFjZV9jaGFpbiktPnNkX2RlZmluZWQKLSNkZWZpbmUgU1BBQ0VfVVNFUl9ERUZJTkVEKHNwYWNlX2NoYWluKSAoc3BhY2VfY2hhaW4pLT5zZF91c2VyX2RlZmluZWQKLSNkZWZpbmUgU1BBQ0VfU1BOVU0oc3BhY2VfY2hhaW4pCShzcGFjZV9jaGFpbiktPnNkX3NwbnVtCi0jZGVmaW5lIFNQQUNFX05BTUUoc3BhY2VfY2hhaW4pCQkoc3BhY2VfY2hhaW4pLT5zZF9uYW1lCi0KLSNkZWZpbmUgU1VCU1BBQ0VfREVGSU5FRChzc19jaGFpbikJKHNzX2NoYWluKS0+c3NkX2RlZmluZWQKLSNkZWZpbmUgU1VCU1BBQ0VfTkFNRShzc19jaGFpbikJCShzc19jaGFpbiktPnNzZF9uYW1lCi0jZW5kaWYKLQotLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFMgcG90ZW50aWFsbHkgcmVwcmVzZW50cwotICAgYSByaWdodCBvciBsZWZ0IGhhbGYgb2YgYSBGUCByZWdpc3RlciAgKi8KLSNkZWZpbmUgSVNfUl9TRUxFQ1QoUykgICAoKihTKSA9PSAnUicgfHwgKihTKSA9PSAncicpCi0jZGVmaW5lIElTX0xfU0VMRUNUKFMpICAgKCooUykgPT0gJ0wnIHx8ICooUykgPT0gJ2wnKQotCi0vKiBJbnNlcnQgRklFTEQgaW50byBPUENPREUgc3RhcnRpbmcgYXQgYml0IFNUQVJULiAgQ29udGludWUgcGFfaXAKLSAgIG1haW4gbG9vcCBhZnRlciBpbnNlcnRpb24uICAqLwotCi0jZGVmaW5lIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUoT1BDT0RFLCBGSUVMRCwgU1RBUlQpIFwKLSAgeyBcCi0gICAgKChPUENPREUpIHw9IChGSUVMRCkgPDwgKFNUQVJUKSk7IFwKLSAgICBjb250aW51ZTsgXAotICB9Ci0KLS8qIFNpbXBsZSByYW5nZSBjaGVja2luZyBmb3IgRklFTEQgYWdhaW50IEhJR0ggYW5kIExPVyBib3VuZHMuCi0gICBJR05PUkUgaXMgdXNlZCB0byBzdXBwcmVzcyB0aGUgZXJyb3IgbWVzc2FnZS4gICovCi0KLSNkZWZpbmUgQ0hFQ0tfRklFTEQoRklFTEQsIEhJR0gsIExPVywgSUdOT1JFKSBcCi0gIHsgXAotICAgIGlmICgoRklFTEQpID4gKEhJR0gpIHx8IChGSUVMRCkgPCAoTE9XKSkgXAotICAgICAgeyBcCi0JaWYgKCEgSUdOT1JFKSBcCi0gICAgICAgICAgYXNfYmFkIChfKCJGaWVsZCBvdXQgb2YgcmFuZ2UgWyVkLi4lZF0gKCVkKS4iKSwgKExPVyksIChISUdIKSwgXAotCQkgIChpbnQpIChGSUVMRCkpO1wKLSAgICAgICAgYnJlYWs7IFwKLSAgICAgIH0gXAotICB9Ci0KLSNkZWZpbmUgaXNfRFBfcmVsYXRpdmUoZXhwKQkJCVwKLSAgKChleHApLlhfb3AgPT0gT19zdWJ0cmFjdAkJCVwKLSAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoKGV4cCkuWF9vcF9zeW1ib2wpLCAiJGdsb2JhbCQiKSA9PSAwKQotCi0jZGVmaW5lIGlzX1BDX3JlbGF0aXZlKGV4cCkJCQlcCi0gICgoZXhwKS5YX29wID09IE9fc3VidHJhY3QJCQlcCi0gICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKChleHApLlhfb3Bfc3ltYm9sKSwgIiRQSUNfcGNyZWwkMCIpID09IDApCi0KLS8qIFdlIG5lZWQgc29tZSBjb21wbGV4IGhhbmRsaW5nIGZvciBzdGFicyAoc3ltMSAtIHN5bTIpLiAgTHVja2lseSwgd2UnbGwKLSAgIGFsd2F5cyBiZSBhYmxlIHRvIHJlZHVjZSB0aGUgZXhwcmVzc2lvbiB0byBhIGNvbnN0YW50LCBzbyB3ZSBkb24ndAotICAgbmVlZCByZWFsIGNvbXBsZXggaGFuZGxpbmcgeWV0LiAgKi8KLSNkZWZpbmUgaXNfY29tcGxleChleHApCQkJCVwKLSAgKChleHApLlhfb3AgIT0gT19jb25zdGFudCAmJiAoZXhwKS5YX29wICE9IE9fc3ltYm9sKQotCi0vKiBBY3R1YWwgZnVuY3Rpb25zIHRvIGltcGxlbWVudCB0aGUgUEEgc3BlY2lmaWMgY29kZSBmb3IgdGhlIGFzc2VtYmxlci4gICovCi0KLS8qIENhbGxlZCBiZWZvcmUgd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUuICBNYWtlIHN1cmUgZW50cnkvZXhpdCBhbmQKLSAgIHByb2MvcHJvY2VuZCBwYWlycyBtYXRjaC4gICovCi0KLXZvaWQKLXBhX2NoZWNrX2VvZiAoKQotewotICBpZiAod2l0aGluX2VudHJ5X2V4aXQpCi0gICAgYXNfZmF0YWwgKF8oIk1pc3NpbmcgLmV4aXRcbiIpKTsKLQotICBpZiAod2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19mYXRhbCAoXygiTWlzc2luZyAucHJvY2VuZFxuIikpOwotfQotCi0vKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFiZWxfc3ltYm9sX3N0cnVjdCBmb3IgdGhlIGN1cnJlbnQgc3BhY2UuCi0gICBvciBOVUxMIGlmIG5vIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgZXhpc3RzIGZvciB0aGUgY3VycmVudCBzcGFjZS4gICovCi0KLXN0YXRpYyBsYWJlbF9zeW1ib2xfc3RydWN0ICoKLXBhX2dldF9sYWJlbCAoKQotewotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9jaGFpbjsKLQotICBmb3IgKGxhYmVsX2NoYWluID0gbGFiZWxfc3ltYm9sc19yb290cDsKLSAgICAgICBsYWJlbF9jaGFpbjsKLSAgICAgICBsYWJlbF9jaGFpbiA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dCkKLSAgICB7Ci0jaWZkZWYgT0JKX1NPTQotICAgIGlmIChjdXJyZW50X3NwYWNlID09IGxhYmVsX2NoYWluLT5sc3Nfc3BhY2UgJiYgbGFiZWxfY2hhaW4tPmxzc19sYWJlbCkKLSAgICAgIHJldHVybiBsYWJlbF9jaGFpbjsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBpZiAobm93X3NlZyA9PSBsYWJlbF9jaGFpbi0+bHNzX3NlZ21lbnQgJiYgbGFiZWxfY2hhaW4tPmxzc19sYWJlbCkKLSAgICAgIHJldHVybiBsYWJlbF9jaGFpbjsKLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVmaW5lcyBhIGxhYmVsIGZvciB0aGUgY3VycmVudCBzcGFjZS4gIElmIG9uZSBpcyBhbHJlYWR5IGRlZmluZWQsCi0gICB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgbGFiZWwuICAqLwotCi12b2lkCi1wYV9kZWZpbmVfbGFiZWwgKHN5bWJvbCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sOwotewotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9jaGFpbiA9IHBhX2dldF9sYWJlbCAoKTsKLQotICBpZiAobGFiZWxfY2hhaW4pCi0gICAgbGFiZWxfY2hhaW4tPmxzc19sYWJlbCA9IHN5bWJvbDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhIG5ldyBsYWJlbCBlbnRyeSBhbmQgYWRkIGl0IHRvIHRoZSBoZWFkIG9mIHRoZSBjaGFpbi4gICovCi0gICAgICBsYWJlbF9jaGFpbgotCT0gKGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKikgeG1hbGxvYyAoc2l6ZW9mIChsYWJlbF9zeW1ib2xfc3RydWN0KSk7Ci0gICAgICBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsID0gc3ltYm9sOwotI2lmZGVmIE9CSl9TT00KLSAgICAgIGxhYmVsX2NoYWluLT5sc3Nfc3BhY2UgPSBjdXJyZW50X3NwYWNlOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgICAgbGFiZWxfY2hhaW4tPmxzc19zZWdtZW50ID0gbm93X3NlZzsKLSNlbmRpZgotICAgICAgbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gTlVMTDsKLQotICAgICAgaWYgKGxhYmVsX3N5bWJvbHNfcm9vdHApCi0JbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gbGFiZWxfc3ltYm9sc19yb290cDsKLQotICAgICAgbGFiZWxfc3ltYm9sc19yb290cCA9IGxhYmVsX2NoYWluOwotICAgIH0KLX0KLQotLyogUmVtb3ZlcyBhIGxhYmVsIGRlZmluaXRpb24gZm9yIHRoZSBjdXJyZW50IHNwYWNlLgotICAgSWYgdGhlcmUgaXMgbm8gbGFiZWxfc3ltYm9sX3N0cnVjdCBlbnRyeSwgdGhlbiBubyBhY3Rpb24gaXMgdGFrZW4uICAqLwotCi1zdGF0aWMgdm9pZAotcGFfdW5kZWZpbmVfbGFiZWwgKCkKLXsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfY2hhaW47Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKnByZXZfbGFiZWxfY2hhaW4gPSBOVUxMOwotCi0gIGZvciAobGFiZWxfY2hhaW4gPSBsYWJlbF9zeW1ib2xzX3Jvb3RwOwotICAgICAgIGxhYmVsX2NoYWluOwotICAgICAgIGxhYmVsX2NoYWluID0gbGFiZWxfY2hhaW4tPmxzc19uZXh0KQotICAgIHsKLSAgICAgIGlmICgxCi0jaWZkZWYgT0JKX1NPTQotIAkgICYmIGN1cnJlbnRfc3BhY2UgPT0gbGFiZWxfY2hhaW4tPmxzc19zcGFjZSAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gCSAgJiYgbm93X3NlZyA9PSBsYWJlbF9jaGFpbi0+bHNzX3NlZ21lbnQgJiYgbGFiZWxfY2hhaW4tPmxzc19sYWJlbAotI2VuZGlmCi0JICApCi0JewotCSAgLyogUmVtb3ZlIHRoZSBsYWJlbCBmcm9tIHRoZSBjaGFpbiBhbmQgZnJlZSBpdHMgbWVtb3J5LiAgKi8KLQkgIGlmIChwcmV2X2xhYmVsX2NoYWluKQotCSAgICBwcmV2X2xhYmVsX2NoYWluLT5sc3NfbmV4dCA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dDsKLQkgIGVsc2UKLQkgICAgbGFiZWxfc3ltYm9sc19yb290cCA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dDsKLQotCSAgZnJlZSAobGFiZWxfY2hhaW4pOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJldl9sYWJlbF9jaGFpbiA9IGxhYmVsX2NoYWluOwotICAgIH0KLX0KLQotCi0vKiBBbiBIUFBBLXNwZWNpZmljIHZlcnNpb24gb2YgZml4X25ldy4gIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgSFBQQQotICAgY29kZSBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHNvbWUgZXh0cmEgc3R1ZmYuICBFYWNoIGNhbGwgdG8gZml4X25ld19ocHBhCi0gICByZXN1bHRzIGluIHRoZSBjcmVhdGlvbiBvZiBhbiBpbnN0YW5jZSBvZiBhbiBocHBhX2ZpeF9zdHJ1Y3QuICBBbgotICAgaHBwYV9maXhfc3RydWN0IHN0b3JlcyB0aGUgZXh0cmEgaW5mb3JtYXRpb24gYWxvbmcgd2l0aCBhIHBvaW50ZXIgdG8gdGhlCi0gICBvcmlnaW5hbCBmaXhTLiAgVGhpcyBpcyBhdHRhY2hlZCB0byB0aGUgb3JpZ2luYWwgZml4dXAgdmlhIHRoZQotICAgdGNfZml4X2RhdGEgZmllbGQuICAqLwotCi1zdGF0aWMgdm9pZAotZml4X25ld19ocHBhIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBleHAsIHBjcmVsLAotCSAgICAgIHJfdHlwZSwgcl9maWVsZCwgcl9mb3JtYXQsIGFyZ19yZWxvYywgdW53aW5kX2JpdHMpCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBzaXplOwotICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50IHBjcmVsOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOwotICAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgcl9maWVsZDsKLSAgICAgaW50IHJfZm9ybWF0OwotICAgICBsb25nIGFyZ19yZWxvYzsKLSAgICAgaW50KiB1bndpbmRfYml0czsKLXsKLSAgZml4UyAqbmV3X2ZpeDsKLQotICBzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICpocHBhX2ZpeCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopCi0gIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mIChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0KSk7Ci0KLSAgaWYgKGV4cCAhPSBOVUxMKQotICAgIG5ld19maXggPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsIHJfdHlwZSk7Ci0gIGVsc2UKLSAgICBuZXdfZml4ID0gZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgcGNyZWwsIHJfdHlwZSk7Ci0gIG5ld19maXgtPnRjX2ZpeF9kYXRhID0gKHZvaWQgKikgaHBwYV9maXg7Ci0gIGhwcGFfZml4LT5meF9yX3R5cGUgPSByX3R5cGU7Ci0gIGhwcGFfZml4LT5meF9yX2ZpZWxkID0gcl9maWVsZDsKLSAgaHBwYV9maXgtPmZ4X3JfZm9ybWF0ID0gcl9mb3JtYXQ7Ci0gIGhwcGFfZml4LT5meF9hcmdfcmVsb2MgPSBhcmdfcmVsb2M7Ci0gIGhwcGFfZml4LT5zZWdtZW50ID0gbm93X3NlZzsKLSNpZmRlZiBPQkpfU09NCi0gIGlmIChyX3R5cGUgPT0gUl9FTlRSWSB8fCByX3R5cGUgPT0gUl9FWElUKQotICAgIG5ld19maXgtPmZ4X29mZnNldCA9ICp1bndpbmRfYml0czsKLSNlbmRpZgotCi0gIC8qIGZvby0kZ2xvYmFsJCBpcyB1c2VkIHRvIGFjY2VzcyBub24tYXV0b21hdGljIHN0b3JhZ2UuICAkZ2xvYmFsJAotICAgICBpcyByZWFsbHkganVzdCBhIG1hcmtlciBhbmQgaGFzIHNlcnZlZCBpdHMgcHVycG9zZSwgc28gZWxpbWluYXRlCi0gICAgIGl0IG5vdyBzbyBhcyBub3QgdG8gY29uZnVzZSB3cml0ZS5jLiAgKi8KLSAgaWYgKG5ld19maXgtPmZ4X3N1YnN5Ci0gICAgICAmJiAhc3RyY21wIChTX0dFVF9OQU1FIChuZXdfZml4LT5meF9zdWJzeSksICIkZ2xvYmFsJCIpKQotICAgIG5ld19maXgtPmZ4X3N1YnN5ID0gTlVMTDsKLX0KLQotLyogUGFyc2UgYSAuYnl0ZSwgLndvcmQsIC5sb25nIGV4cHJlc3Npb24gZm9yIHRoZSBIUFBBLiAgQ2FsbGVkIGJ5Ci0gICBjb25zIHZpYSB0aGUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OIG1hY3JvLiAgKi8KLQotdm9pZAotcGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEgKGV4cCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaHBwYV9maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIGV4cHJlc3Npb24gKGV4cCk7Ci19Ci0KLS8qIFRoaXMgZml4X25ldyBpcyBjYWxsZWQgYnkgY29ucyB2aWEgVENfQ09OU19GSVhfTkVXLgotICAgaHBwYV9maWVsZF9zZWxlY3RvciBpcyBzZXQgYnkgdGhlIHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhLiAgKi8KLQotdm9pZAotY29uc19maXhfbmV3X2hwcGEgKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBzaXplOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICB1bnNpZ25lZCBpbnQgcmVsX3R5cGU7Ci0KLSAgLyogR2V0IGEgYmFzZSByZWxvY2F0aW9uIHR5cGUuICAqLwotICBpZiAoaXNfRFBfcmVsYXRpdmUgKCpleHApKQotICAgIHJlbF90eXBlID0gUl9IUFBBX0dPVE9GRjsKLSAgZWxzZSBpZiAoaXNfY29tcGxleCAoKmV4cCkpCi0gICAgcmVsX3R5cGUgPSBSX0hQUEFfQ09NUExFWDsKLSAgZWxzZQotICAgIHJlbF90eXBlID0gUl9IUFBBOwotCi0gIGlmIChocHBhX2ZpZWxkX3NlbGVjdG9yICE9IGVfcHNlbCAmJiBocHBhX2ZpZWxkX3NlbGVjdG9yICE9IGVfZnNlbCkKLSAgICBhc193YXJuIChfKCJJbnZhbGlkIGZpZWxkIHNlbGVjdG9yLiAgQXNzdW1pbmcgRiUlLiIpKTsKLQotICBmaXhfbmV3X2hwcGEgKGZyYWcsIHdoZXJlLCBzaXplLAotCQkoc3ltYm9sUyAqKSBOVUxMLCAob2Zmc2V0VCkgMCwgZXhwLCAwLCByZWxfdHlwZSwKLQkJaHBwYV9maWVsZF9zZWxlY3Rvciwgc2l6ZSAqIDgsIDAsIE5VTEwpOwotCi0gIC8qIFJlc2V0IGZpZWxkIHNlbGVjdG9yIHRvIGl0cyBkZWZhdWx0IHN0YXRlLiAgKi8KLSAgaHBwYV9maWVsZF9zZWxlY3RvciA9IDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLiAgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgaW50IGxvc2UgPSAwOwotICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgbGFzdF9jYWxsX2luZm8gPSBOVUxMOwotICBjYWxsX2luZm9fcm9vdCA9IE5VTEw7Ci0KLSAgLyogU2V0IHRoZSBkZWZhdWx0IG1hY2hpbmUgdHlwZS4gICovCi0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgMTApKQotICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIC8qIEZvbGRpbmcgb2YgdGV4dCBhbmQgZGF0YSBzZWdtZW50cyBmYWlscyBtaXNlcmFibHkgb24gdGhlIFBBLgotICAgICBXYXJuIHVzZXIgYW5kIGRpc2FibGUgIi1SIiBvcHRpb24uICAqLwotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLVIgb3B0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0YXJnZXQuIikpOwotICAgICAgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgPSAwOwotICAgIH0KLQotI2lmZGVmIE9CSl9TT00KLSAgcGFfc3BhY2VzX2JlZ2luICgpOwotI2VuZGlmCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIHdoaWxlIChpIDwgTlVNT1BDT0RFUykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gcGFfb3Bjb2Rlc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChzdHJ1Y3QgcGFfb3Bjb2RlICopICZwYV9vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiAqcmV0dmFsICE9ICdcMCcpCi0JewotCSAgYXNfZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwgbmFtZSwgcmV0dmFsKTsKLQkgIGxvc2UgPSAxOwotCX0KLSAgICAgIGRvCi0JewotCSAgaWYgKChwYV9vcGNvZGVzW2ldLm1hdGNoICYgcGFfb3Bjb2Rlc1tpXS5tYXNrKQotCSAgICAgICE9IHBhX29wY29kZXNbaV0ubWF0Y2gpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBsb3Npbmcgb3Bjb2RlOiBgJXMnIFwiJXNcIlxuIiksCi0JCSAgICAgICBwYV9vcGNvZGVzW2ldLm5hbWUsIHBhX29wY29kZXNbaV0uYXJncyk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMgJiYgIXN0cmNtcCAocGFfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7Ci0gICAgfQotCi0gIGlmIChsb3NlKQotICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogU09NIHdpbGwgY2hhbmdlIHRleHRfc2VjdGlvbi4gIFRvIG1ha2Ugc3VyZSB3ZSBuZXZlciBwdXQKLSAgICAgYW55dGhpbmcgaW50byB0aGUgb2xkIG9uZSBzd2l0Y2ggdG8gdGhlIG5ldyBvbmUgbm93LiAgKi8KLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX1NPTQotICBkdW1teV9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgiTCRkdW1teSIpOwotICBTX1NFVF9TRUdNRU5UIChkdW1teV9zeW1ib2wsIHRleHRfc2VjdGlvbik7Ci0gIC8qIEZvcmNlIHRoZSBzeW1ib2wgdG8gYmUgY29udmVydGVkIHRvIGEgcmVhbCBzeW1ib2wuICovCi0gICh2b2lkKSBzeW1ib2xfZ2V0X2JmZHN5bSAoZHVtbXlfc3ltYm9sKTsKLSNlbmRpZgotfQotCi0vKiBBc3NlbWJsZSBhIHNpbmdsZSBpbnN0cnVjdGlvbiBzdG9yaW5nIGl0IGludG8gYSBmcmFnLiAgKi8KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqdG87Ci0KLSAgLyogVGhlIGhhZCBiZXR0ZXIgYmUgc29tZXRoaW5nIHRvIGFzc2VtYmxlLiAgKi8KLSAgYXNzZXJ0IChzdHIpOwotCi0gIC8qIElmIHdlIGFyZSB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbiwgbWFrZSBzdXJlIHdlJ3ZlCi0gICAgIGRlZmluZWQgYSBsYWJlbCBmb3IgdGhlIHByb2NlZHVyZTsgaGFuZGxlIGNhc2Ugd2hlcmUgdGhlCi0gICAgIGxhYmVsIHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAuUFJPQyBkaXJlY3RpdmUuCi0KLSAgICAgTm90ZSB0aGVyZSdzIG5vdCBuZWVkIHRvIGRpZGRsZSB3aXRoIHRoZSBzZWdtZW50IG9yIGZyYWdtZW50Ci0gICAgIGZvciB0aGUgbGFiZWwgc3ltYm9sIGluIHRoaXMgY2FzZS4gIFdlIGhhdmUgYWxyZWFkeSBzd2l0Y2hlZAotICAgICBpbnRvIHRoZSBuZXcgJENPREUkIHN1YnNwYWNlIGF0IHRoaXMgcG9pbnQuICAqLwotICBpZiAod2l0aGluX3Byb2NlZHVyZSAmJiBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID09IE5VTEwpCi0gICAgewotICAgICAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gICAgICBpZiAobGFiZWxfc3ltYm9sKQotCXsKLQkgIGlmIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCkKLQkgICAgewotCSAgICAgIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKLQkgICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpLT5mbGFncwotCQl8PSBCU0ZfRlVOQ1RJT047Ci0jaWZkZWYgT0JKX1NPTQotCSAgICAgIC8qIEFsc28gaGFuZGxlIGFsbG9jYXRpb24gb2YgYSBmaXh1cCB0byBob2xkIHRoZSB1bndpbmQKLQkJIGluZm9ybWF0aW9uIHdoZW4gdGhlIGxhYmVsIGFwcGVhcnMgYWZ0ZXIgdGhlIHByb2MvcHJvY2VuZC4gICovCi0JICAgICAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotCQl7Ci0JCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0JCSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJCQkwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKLQkJCQkoaW50ICopJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvcik7Ci0JCX0KLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIikpOwotICAgIH0KLQotICAvKiBBc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb24uICBSZXN1bHRzIGFyZSBzYXZlZCBpbnRvICJ0aGVfaW5zbiIuICAqLwotICBwYV9pcCAoc3RyKTsKLQotICAvKiBHZXQgc29tZXdoZXJlIHRvIHB1dCB0aGUgYXNzZW1ibGVkIGluc3RydXRpb24uICAqLwotICB0byA9IGZyYWdfbW9yZSAoNCk7Ci0KLSAgLyogT3V0cHV0IHRoZSBvcGNvZGUuICovCi0gIG1kX251bWJlcl90b19jaGFycyAodG8sIHRoZV9pbnNuLm9wY29kZSwgNCk7Ci0KLSAgLyogSWYgbmVjZXNzYXJ5IG91dHB1dCBtb3JlIHN0dWZmLiAgKi8KLSAgaWYgKHRoZV9pbnNuLnJlbG9jICE9IFJfSFBQQV9OT05FKQotICAgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csICh0byAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwgNCwgTlVMTCwKLQkJICAob2Zmc2V0VCkgMCwgJnRoZV9pbnNuLmV4cCwgdGhlX2luc24ucGNyZWwsCi0JCSAgdGhlX2luc24ucmVsb2MsIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yLAotCQkgIHRoZV9pbnNuLmZvcm1hdCwgdGhlX2luc24uYXJnX3JlbG9jLCBOVUxMKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfRFdBUkYyKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkcjsKLQotICAgICAgLyogRmlyc3QgdXBkYXRlIHRoZSBub3Rpb24gb2YgdGhlIGN1cnJlbnQgc291cmNlIGxpbmUuICAqLwotICAgICAgZHdhcmYyX3doZXJlICgmZGVidWdfbGluZSk7Ci0KLSAgICAgIC8qIFdlIHdhbnQgdGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBpbnN0cnVjdGlvbiB3aXRoaW4gdGhlCi0JIHRoZSBjdXJyZW50IGZyYWcuICAqLwotICAgICAgYWRkciA9IGZyYWdfbm93LT5mcl9hZGRyZXNzICsgZnJhZ19ub3dfZml4ICgpIC0gNDsKLQotICAgICAgLyogQW5kIHJlY29yZCB0aGUgaW5mb3JtYXRpb24uICAqLwotICAgICAgZHdhcmYyX2dlbl9saW5lX2luZm8gKGFkZHIsICZkZWJ1Z19saW5lKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogRG8gdGhlIHJlYWwgd29yayBmb3IgYXNzZW1ibGluZyBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIFN0b3JlIHJlc3VsdHMKLSAgIGludG8gdGhlIGdsb2JhbCAidGhlX2luc24iIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2lwIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9ICIiOwotICBjaGFyICpzLCBjLCAqYXJnc3RhcnQsICpuYW1lLCAqc2F2ZV9zOwotICBjb25zdCBjaGFyICphcmdzOwotICBpbnQgbWF0Y2ggPSBGQUxTRTsKLSAgaW50IGNvbW1hID0gMDsKLSAgaW50IGNtcGx0ciwgbnVsbGlmLCBmbGFnLCBjb25kLCBudW07Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICBzdHJ1Y3QgcGFfb3Bjb2RlICppbnNuOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIC8qIENvbnZlcnQgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW50byBsb3dlcgotICAgICBjYXNlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAqcyAhPSAnXG4nICYmICpzICE9ICdcMCc7IHMrKykKLSAgICBpZiAoaXN1cHBlciAoKnMpKQotICAgICAgKnMgPSB0b2xvd2VyICgqcyk7Ci0KLSAgLyogU2tpcCB0byBzb21ldGhpbmcgaW50ZXJlc3RpbmcuICAqLwotICBmb3IgKHMgPSBzdHI7IGlzdXBwZXIgKCpzKSB8fCBpc2xvd2VyICgqcykgfHwgKCpzID49ICcwJyAmJiAqcyA8PSAnMycpOyArK3MpCi0gICAgOwotCi0gIHN3aXRjaCAoKnMpCi0gICAgewotCi0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcsJzoKLSAgICAgIGNvbW1hID0gMTsKLQotICAgICAgLypGQUxMVEhST1VHSCAqLwotCi0gICAgY2FzZSAnICc6Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgIH0KLQotICBzYXZlX3MgPSBzdHI7Ci0KLSAgLyogTG9vayB1cCB0aGUgb3Bjb2RlIGluIHRoZSBoYXMgdGFibGUuICAqLwotICBpZiAoKGluc24gPSAoc3RydWN0IHBhX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkICgiVW5rbm93biBvcGNvZGU6IGAlcyciLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY29tbWEpCi0gICAgewotICAgICAgKi0tcyA9ICcsJzsKLSAgICB9Ci0KLSAgLyogTWFyayB0aGUgbG9jYXRpb24gd2hlcmUgYXJndW1lbnRzIGZvciB0aGUgaW5zdHJ1Y3Rpb24gc3RhcnQsIHRoZW4KLSAgICAgc3RhcnQgcHJvY2Vzc2luZyB0aGVtLiAgKi8KLSAgYXJnc3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIC8qIERvIHNvbWUgaW5pdGlhbGl6YXRpb24uICAqLwotICAgICAgb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBzdHJpY3QgPSAoaW5zbi0+ZmxhZ3MgJiBGTEFHX1NUUklDVCk7Ci0gICAgICBtZW1zZXQgKCZ0aGVfaW5zbiwgMCwgc2l6ZW9mICh0aGVfaW5zbikpOwotCi0gICAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9OT05FOwotCi0gICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBhcmNoaXRlY3R1cmUsCi0JIHRoZW4gc2V0IGEgbmV3IGFyY2hpdGVjdHVyZS4gICovCi0gICAgICAvKiBCdXQgZG8gbm90IGF1dG9tYXRpY2FsbHkgcHJvbW90ZSB0byBwYTIuMC4gIFRoZSBhdXRvbWF0aWMgcHJvbW90aW9uCi0JIGNydWQgaXMgZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBIUCdzIG9sZCBhc3NlbWJsZXJzIG9ubHkuICAqLwotICAgICAgaWYgKGluc24tPmFyY2ggPCAyMAotCSAgJiYgYmZkX2dldF9tYWNoIChzdGRvdXRwdXQpIDwgaW5zbi0+YXJjaCkKLQl7Ci0JICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIGluc24tPmFyY2gpKQotCSAgICBhc193YXJuIChfKCJjb3VsZCBub3QgdXBkYXRlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKHN0ZG91dHB1dCkgPCBpbnNuLT5hcmNoKQotCXsKLQkgIG1hdGNoID0gRkFMU0U7Ci0JICBnb3RvIGZhaWxlZDsKLQl9Ci0KLSAgICAgIC8qIEJ1aWxkIHRoZSBvcGNvZGUsIGNoZWNraW5nIGFzIHdlIGdvIHRvIG1ha2UKLSAgICAgICAgIHN1cmUgdGhhdCB0aGUgb3BlcmFuZHMgbWF0Y2guICAqLwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLQl7Ci0JICAvKiBBYnNvcmIgd2hpdGUgc3BhY2UgaW4gaW5zdHJ1Y3Rpb24uICAqLwotCSAgd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKQotCSAgICBzKys7Ci0KLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQotCSAgICAvKiBFbmQgb2YgYXJndW1lbnRzLiAgKi8KLQkgICAgY2FzZSAnXDAnOgotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQltYXRjaCA9IFRSVUU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKyc6Ci0JICAgICAgaWYgKCpzID09ICcrJykKLQkJewotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmICgqcyA9PSAnLScpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggZXhhY3RseS4gICovCi0JICAgIGNhc2UgJygnOgotCSAgICBjYXNlICcpJzoKLQkgICAgY2FzZSAnLCc6Ci0JICAgIGNhc2UgJyAnOgotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBvciBjb250cm9sIHJlZ2lzdGVyIGZpZWxkIGF0IDEwLiAgKi8KLQkgICAgY2FzZSAnYic6Ci0JICAgIGNhc2UgJ14nOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDIxKTsKLQotCSAgICAvKiBIYW5kbGUgJXNhciBvciAlY3IxMS4gIE5vIGJpdHMgZ2V0IHNldCwgd2UganVzdCB2ZXJpZnkgdGhhdCBpdAotCSAgICAgICBpcyB0aGVyZS4gICovCi0JICAgIGNhc2UgJyEnOgotCSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZSBiZWZvcmUgcmVnaXN0ZXIuICAqLwotCSAgICAgIHdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykKLQkJcyA9IHMgKyAxOwotCi0JICAgICAgaWYgKCFzdHJuY2FzZWNtcChzLCAiJXNhciIsIDQpKQotCSAgICAgICAgewotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcChzLCAiJWNyMTEiLCA1KSkKLQkgICAgICAgIHsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAxNS4gICovCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAzMS4gICovCi0JICAgIGNhc2UgJ3QnOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDEwIGFuZCAxNS4gICovCi0JICAgIGNhc2UgJ2EnOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgb3Bjb2RlIHw9IG51bSA8PCAxNjsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMjEpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGZpZWxkIGxlbmd0aCBhdCAzMS4gICovCi0JICAgIGNhc2UgJ1QnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMiwgMSwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAzMiAtIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgaW1tZWRpYXRlIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAnNSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIC8qIFdoZW4gaW4gc3RyaWN0IG1vZGUsIHdlIHdhbnQgdG8ganVzdCByZWplY3QgdGhpcwotCQkgbWF0Y2ggaW5zdGVhZCBvZiBnaXZpbmcgYW4gb3V0IG9mIHJhbmdlIGVycm9yLiAgKi8KLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxNSwgLTE2LCBzdHJpY3QpOwotCSAgICAgIGxvd19zaWduX3VuZXh0IChudW0sIDUsICZudW0pOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnVic6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIC8qIFdoZW4gaW4gc3RyaWN0IG1vZGUsIHdlIHdhbnQgdG8ganVzdCByZWplY3QgdGhpcwotCQkgbWF0Y2ggaW5zdGVhZCBvZiBnaXZpbmcgYW4gb3V0IG9mIHJhbmdlIGVycm9yLiAgKi8KLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxNSwgLTE2LCBzdHJpY3QpCi0JICAgICAgbG93X3NpZ25fdW5leHQgKG51bSwgNSwgJm51bSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhbiB1bnNpZ25lZCA1IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdyJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCBzdHJpY3QpOwotCi0JICAgIC8qIEhhbmRsZSBhbiB1bnNpZ25lZCA1IGJpdCBpbW1lZGlhdGUgYXQgMTUuICAqLwotCSAgICBjYXNlICdSJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYW4gdW5zaWduZWQgMTAgYml0IGltbWVkaWF0ZSBhdCAxNS4gICovCi0JICAgIGNhc2UgJ1UnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxMDIzLCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgMiBiaXQgc3BhY2UgaWRlbnRpZmllciBhdCAxNy4gICovCi0JICAgIGNhc2UgJ3MnOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzLCAwLCAxKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTQpOwotCi0JICAgIC8qIEhhbmRsZSBhIDMgYml0IHNwYWNlIGlkZW50aWZpZXIgYXQgMTguICAqLwotCSAgICBjYXNlICdTJzoKLQkgICAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkgICAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJYnJlYWs7Ci0JICAgICAgbnVtID0gcGFfcGFyc2VfbnVtYmVyICgmcywgMCk7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgMSk7Ci0JICAgICAgZGlzX2Fzc2VtYmxlXzMgKG51bSwgJm51bSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKLQotCSAgICAvKiBIYW5kbGUgYWxsIGNvbXBsZXRlcnMuICAqLwotCSAgICBjYXNlICdjJzoKLQkgICAgICBzd2l0Y2ggKCorK2FyZ3MpCi0JCXsKLQotCQkvKiBIYW5kbGUgYSBjb21wbGV0ZXIgZm9yIGFuIGluZGV4aW5nIGxvYWQgb3Igc3RvcmUuICAqLwotCQljYXNlICd4JzoKLQkJICB7Ci0JCSAgICBpbnQgdXUgPSAwOwotCQkgICAgaW50IG0gPSAwOwotCQkgICAgaW50IGkgPSAwOwotCQkgICAgd2hpbGUgKCpzID09ICcsJyAmJiBpIDwgMikKLQkJICAgICAgewotCQkJcysrOwotCQkJaWYgKHN0cm5jYXNlY21wIChzLCAic20iLCAyKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgdXUgPSAxOwotCQkJICAgIG0gPSAxOwotCQkJICAgIHMrKzsKLQkJCSAgICBpKys7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibSIsIDEpID09IDApCi0JCQkgIG0gPSAxOwotCQkJZWxzZSBpZiAoKHN0cm5jYXNlY21wIChzLCAicyAiLCAyKSA9PSAwKQotCQkJCSB8fCAoc3RybmNhc2VjbXAgKHMsICJzLCIsIDIpID09IDApKQotCQkJICB1dSA9IDE7Ci0JCQkvKiBXaGVuIGluIHN0cmljdCBtb2RlIHRoaXMgaXMgYSBtYXRjaCBmYWlsdXJlLiAgKi8KLQkJCWVsc2UgaWYgKHN0cmljdCkKLQkJCSAgewotCQkJICAgIHMtLTsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBhc19iYWQgKF8oIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlci4iKSk7Ci0JCQlzKys7Ci0JCQlpKys7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChpID4gMikKLQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIgU3ludGF4LiIpKTsKLQkJICAgIG9wY29kZSB8PSBtIDw8IDU7Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHV1LCAxMyk7Ci0JCSAgfQotCi0JCS8qIEhhbmRsZSBhIHNob3J0IGxvYWQvc3RvcmUgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnbSc6Ci0JCWNhc2UgJ3EnOgotCQljYXNlICdKJzoKLQkJY2FzZSAnZSc6Ci0JCSAgewotCQkgICAgaW50IGEgPSAwOwotCQkgICAgaW50IG0gPSAwOwotCQkgICAgaWYgKCpzID09ICcsJykKLQkJICAgICAgewotCQkJaW50IGZvdW5kID0gMDsKLQkJCXMrKzsKLQkJCWlmIChzdHJuY2FzZWNtcCAocywgIm1hIiwgMikgPT0gMCkKLQkJCSAgewotCQkJICAgIGEgPSAwOwotCQkJICAgIG0gPSAxOwotCQkJICAgIGZvdW5kID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJtYiIsIDIpID09IDApCi0JCQkgIHsKLQkJCSAgICBhID0gMTsKLQkJCSAgICBtID0gMTsKLQkJCSAgICBmb3VuZCA9IDE7Ci0JCQkgIH0KLQotCQkJLyogV2hlbiBpbiBzdHJpY3QgbW9kZSwgcGFzcyB0aHJvdWdoIGZvciBjYWNoZSBvcC4gICovCi0JCQlpZiAoIWZvdW5kICYmIHN0cmljdCkKLQkJCSAgcy0tOwotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgaWYgKCFmb3VuZCkKLQkJCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBTaG9ydCBMb2FkL1N0b3JlIENvbXBsZXRlci4iKSk7Ci0JCQkgICAgcyArPSAyOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIC8qIElmIHdlIGRpZCBub3QgZ2V0IGEgbWEvbWIgY29tcGxldGVyLCB0aGVuIHdlIGRvIG5vdAotCQkgICAgICAgY29uc2lkZXIgdGhpcyBhIHBvc2l0aXZlIG1hdGNoIGZvciAnY2UnLiAgKi8KLQkJICAgIGVsc2UgaWYgKCphcmdzID09ICdlJykKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgLyogJ0onLCAnbScgYW5kICdxJyBhcmUgdGhlIHNhbWUsIGV4Y2VwdCBmb3Igd2hlcmUgdGhleQotCQkgICAgICAgZW5jb2RlIHRoZSBiZWZvcmUvYWZ0ZXIgZmllbGQuICAqLwotCQkgICBpZiAoKmFyZ3MgPT0gJ20nKQotCQkgICAgICB7Ci0JCQlvcGNvZGUgfD0gbSA8PCA1OwotCQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBhLCAxMyk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKCphcmdzID09ICdxJykKLQkJICAgICAgewotCQkJb3Bjb2RlIHw9IG0gPDwgMzsKLQkJCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgYSwgMik7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKCphcmdzID09ICdKJykKLQkJICAgICAgewotCQkgICAgICAgIC8qIE0gYml0IGlzIGV4cGxpY2l0IGluIHRoZSBtYWpvciBvcGNvZGUuICAqLwotCQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBhLCAyKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoKmFyZ3MgPT0gJ2UnKQotCQkgICAgICB7Ci0JCQkvKiBHcm9zcyEgIEhpZGUgdGhlc2UgdmFsdWVzIGluIHRoZSBpbW1lZGlhdGUgZmllbGQKLQkJCSAgIG9mIHRoZSBpbnN0cnVjdGlvbiwgdGhlbiBwdWxsIHRoZW0gb3V0IGxhdGVyLiAgKi8KLQkJCW9wY29kZSB8PSBtIDw8IDg7Ci0JCQlvcGNvZGUgfD0gYSA8PCA5OwotCQkJY29udGludWU7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJLyogSGFuZGxlIGEgc3RieXMgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAncyc6Ci0JCSAgewotCQkgICAgaW50IGEgPSAwOwotCQkgICAgaW50IG0gPSAwOwotCQkgICAgaW50IGkgPSAwOwotCQkgICAgd2hpbGUgKCpzID09ICcsJyAmJiBpIDwgMikKLQkJICAgICAgewotCQkJcysrOwotCQkJaWYgKHN0cm5jYXNlY21wIChzLCAibSIsIDEpID09IDApCi0JCQkgIG0gPSAxOwotCQkJZWxzZSBpZiAoKHN0cm5jYXNlY21wIChzLCAiYiAiLCAyKSA9PSAwKQotCQkJCSB8fCAoc3RybmNhc2VjbXAgKHMsICJiLCIsIDIpID09IDApKQotCQkJICBhID0gMDsKLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAiZSIsIDEpID09IDApCi0JCQkgIGEgPSAxOwotCQkJLyogV2hlbiBpbiBzdHJpY3QgbW9kZSB0aGlzIGlzIGEgbWF0Y2ggZmFpbHVyZS4gICovCi0JCQllbHNlIGlmIChzdHJpY3QpCi0JCQkgIHsKLQkJCSAgICBzLS07Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgYXNfYmFkIChfKCJJbnZhbGlkIFN0b3JlIEJ5dGVzIFNob3J0IENvbXBsZXRlciIpKTsKLQkJCXMrKzsKLQkJCWkrKzsKLQkJICAgICAgfQotCQkgICAgaWYgKGkgPiAyKQotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgU3RvcmUgQnl0ZXMgU2hvcnQgQ29tcGxldGVyIikpOwotCQkgICAgb3Bjb2RlIHw9IG0gPDwgNTsKLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgYSwgMTMpOwotCQkgIH0KLQotCQkvKiBIYW5kbGUgbG9hZCBjYWNoZSBoaW50IGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ2MnOgotCQkgIGNtcGx0ciA9IDA7Ci0JCSAgaWYgKCFzdHJuY21wKHMsICIsc2wiLCAzKSkKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICBjbXBsdHIgPSAyOwotCQkgICAgfQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMCk7Ci0KLQkJLyogSGFuZGxlIHN0b3JlIGNhY2hlIGhpbnQgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnQyc6Ci0JCSAgY21wbHRyID0gMDsKLQkJICBpZiAoIXN0cm5jbXAocywgIixzbCIsIDMpKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jbXAocywgIixiYyIsIDMpKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIGNtcGx0ciA9IDE7Ci0JCSAgICB9Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEwKTsKLQotCQkvKiBIYW5kbGUgbG9hZCBhbmQgY2xlYXIgY2FjaGUgaGludCBjb21wbGV0ZXIuICAqLwotCQljYXNlICdkJzoKLQkJICBjbXBsdHIgPSAwOwotCQkgIGlmICghc3RybmNtcChzLCAiLGNvIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgICAgY21wbHRyID0gMTsKLQkJICAgIH0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTApOwotCi0JCS8qIEhhbmRsZSBsb2FkIG9yZGVyaW5nIGNvbXBsZXRlci4gKi8KLQkJY2FzZSAnbyc6Ci0JCSAgaWYgKHN0cm5jbXAocywgIixvIiwgMikgIT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQotCQkvKiBIYW5kbGUgYSBicmFuY2ggZ2F0ZSBjb21wbGV0ZXIuICAqLwotCQljYXNlICdnJzoKLQkJICBpZiAoc3RybmNhc2VjbXAgKHMsICIsZ2F0ZSIsIDUpICE9IDApCi0JCSAgICBicmVhazsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0KLQkJLyogSGFuZGxlIGEgYnJhbmNoIGxpbmsgYW5kIHB1c2ggY29tcGxldGVyLiAgKi8KLQkJY2FzZSAncCc6Ci0JCSAgaWYgKHN0cm5jYXNlY21wIChzLCAiLGwscHVzaCIsIDcpICE9IDApCi0JCSAgICBicmVhazsKLQkJICBzICs9IDc7Ci0JCSAgY29udGludWU7Ci0KLQkJLyogSGFuZGxlIGEgYnJhbmNoIGxpbmsgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnbCc6Ci0JCSAgaWYgKHN0cm5jYXNlY21wIChzLCAiLGwiLCAyKSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCi0JCS8qIEhhbmRsZSBhIGJyYW5jaCBwb3AgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnUCc6Ci0JCSAgaWYgKHN0cm5jYXNlY21wIChzLCAiLHBvcCIsIDQpICE9IDApCi0JCSAgICBicmVhazsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0KLQkJLyogSGFuZGxlIGEgbG9jYWwgcHJvY2Vzc29yIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ0wnOgotCQkgIGlmIChzdHJuY2FzZWNtcCAocywgIixsIiwgMikgIT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQotCQkvKiBIYW5kbGUgYSBQUk9CRSByZWFkL3dyaXRlIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ3cnOgotCQkgIGZsYWcgPSAwOwotCQkgIGlmICghc3RybmNhc2VjbXAgKHMsICIsdyIsIDIpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAocywgIixyIiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDYpOwotCi0JCS8qIEhhbmRsZSBNRkNUTCB3aWRlIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ1cnOgotCQkgIGlmIChzdHJuY2FzZWNtcCAocywgIix3IiwgMikgIT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQotCQkvKiBIYW5kbGUgYW4gUkZJIHJlc3RvcmUgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAncic6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixyIiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSA1OwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDUpOwotCi0JCS8qIEhhbmRsZSBhIHN5c3RlbSBjb250cm9sIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ1onOgotCQkgIGlmICgqcyA9PSAnLCcgJiYgKCoocyArIDEpID09ICdtJyB8fCAqKHMgKyAxKSA9PSAnTScpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGZsYWcgPSAwOwotCi0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCA1KTsKLQotCQkvKiBIYW5kbGUgaW50ZXJtZWRpYXRlL2ZpbmFsIGNvbXBsZXRlciBmb3IgRENPUi4gICovCi0JCWNhc2UgJ2knOgotCQkgIGZsYWcgPSAwOwotCQkgIGlmICghc3RybmNhc2VjbXAgKHMsICIsaSIsIDIpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCi0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCA2KTsKLQotCQkvKiBIYW5kbGUgemVyby9zaWduIGV4dGVuc2lvbiBjb21wbGV0ZXIuICAqLwotCQljYXNlICd6JzoKLQkJICBmbGFnID0gMTsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHoiLCAyKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDA7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTApOwotCi0JCS8qIEhhbmRsZSBhZGQgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnYSc6Ci0JCSAgZmxhZyA9IDE7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixsIiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAyOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHRzdiIsIDQpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMzsKLQkJICAgICAgcyArPSA0OwotCQkgICAgfQotCi0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMCk7Ci0KLQkJLyogSGFuZGxlIDY0IGJpdCBjYXJyeSBmb3IgQURELiAgKi8KLQkJY2FzZSAnWSc6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixkYyx0c3YiLCA3KSB8fAotCQkgICAgICAhc3RybmNhc2VjbXAgKHMsICIsdHN2LGRjIiwgNykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDc7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGRjIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgMzIgYml0IGNhcnJ5IGZvciBBREQuICAqLwotCQljYXNlICd5JzoKLQkJICBmbGFnID0gMDsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGMsdHN2IiwgNikgfHwKLQkJICAgICAgIXN0cm5jYXNlY21wIChzLCAiLHRzdixjIiwgNikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDY7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGMiLCAyKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDA7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JCS8qIEhhbmRsZSB0cmFwIG9uIHNpZ25lZCBvdmVyZmxvdy4gICovCi0JCWNhc2UgJ3YnOgotCQkgIGZsYWcgPSAwOwotCQkgIGlmICghc3RybmNhc2VjbXAgKHMsICIsdHN2IiwgNCkpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDQ7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgdHJhcCBvbiBjb25kaXRpb24gYW5kIG92ZXJmbG93LiAgKi8KLQkJY2FzZSAndCc6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIix0Yyx0c3YiLCA3KSB8fAotCQkgICAgICAhc3RybmNhc2VjbXAgKHMsICIsdHN2LHRjIiwgNykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDc7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHRjIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgNjQgYml0IGJvcnJvdyBmb3IgU1VCLiAgKi8KLQkJY2FzZSAnQic6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixkYix0c3YiLCA3KSB8fAotCQkgICAgICAhc3RybmNhc2VjbXAgKHMsICIsdHN2LGRiIiwgNykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDc7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGRiIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgMzIgYml0IGJvcnJvdyBmb3IgU1VCLiAgKi8KLQkJY2FzZSAnYic6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixiLHRzdiIsIDYpIHx8Ci0JCSAgICAgICFzdHJuY2FzZWNtcCAocywgIix0c3YsYiIsIDYpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSA2OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAocywgIixiIiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgdHJhcCBjb25kaXRpb24gY29tcGxldGVyIGZvciBVQUREQ00uICAqLwotCQljYXNlICdUJzoKLQkJICBmbGFnID0gMDsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHRjIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDYpOwotCi0JCS8qIEhhbmRsZSBzaWduZWQvdW5zaWduZWQgYXQgMjEuICAqLwotCQljYXNlICdTJzoKLQkJICB7Ci0JCSAgICBpbnQgc2lnbiA9IDE7Ci0JCSAgICBpZiAoc3RybmNhc2VjbXAgKHMsICIscyIsIDIpID09IDApCi0JCSAgICAgIHsKLQkJCXNpZ24gPSAxOwotCQkJcyArPSAyOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIix1IiwgMikgPT0gMCkKLQkJICAgICAgewotCQkJc2lnbiA9IDA7Ci0JCQlzICs9IDI7Ci0JCSAgICAgIH0KLQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBzaWduLCAxMCk7Ci0JCSAgfQotCi0JCS8qIEhhbmRsZSBsZWZ0L3JpZ2h0IGNvbWJpbmF0aW9uIGF0IDE3OjE4LiAgKi8KLQkJY2FzZSAnaCc6Ci0JCSAgaWYgKCpzKysgPT0gJywnKQotCQkgICAgewotCQkgICAgICBpbnQgbHIgPSAwOwotCQkgICAgICBpZiAoKnMgPT0gJ3InKQotCQkJbHIgPSAyOwotCQkgICAgICBlbHNlIGlmICgqcyA9PSAnbCcpCi0JCQlsciA9IDA7Ci0JCSAgICAgIGVsc2UKLQkJCWFzX2JhZChfKCJJbnZhbGlkIGxlZnQvcmlnaHQgY29tYmluYXRpb24gY29tcGxldGVyIikpOwotCi0JCSAgICAgIHMrKzsKLQkJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBsciwgMTMpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZChfKCJJbnZhbGlkIGxlZnQvcmlnaHQgY29tYmluYXRpb24gY29tcGxldGVyIikpOwotCQkgIGJyZWFrOwotCi0JCS8qIEhhbmRsZSBzYXR1cmF0aW9uIGF0IDI0OjI1LiAgKi8KLQkJY2FzZSAnSCc6Ci0JCSAgewotCQkgICAgaW50IHNhdCA9IDM7Ci0JCSAgICBpZiAoc3RybmNhc2VjbXAgKHMsICIsc3MiLCAzKSA9PSAwKQotCQkgICAgICB7Ci0JCQlzYXQgPSAxOwotCQkJcyArPSAzOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIix1cyIsIDMpID09IDApCi0JCSAgICAgIHsKLQkJCXNhdCA9IDA7Ci0JCQlzICs9IDM7Ci0JCSAgICAgIH0KLQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBzYXQsIDYpOwotCQkgIH0KLQotCQkvKiBIYW5kbGUgcGVybXV0YXRpb24gY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnKic6Ci0JCSAgaWYgKCpzKysgPT0gJywnKQotCQkgICAgewotCQkgICAgICBpbnQgcGVybWxvY1s0XTsKLQkJICAgICAgaW50IHBlcm0gPSAwOwotCQkgICAgICBpbnQgaSA9IDA7Ci0JCSAgICAgIHBlcm1sb2NbMF0gPSAxMzsKLQkJICAgICAgcGVybWxvY1sxXSA9IDEwOwotCQkgICAgICBwZXJtbG9jWzJdID0gODsKLQkJICAgICAgcGVybWxvY1szXSA9IDY7Ci0JCSAgICAgIGZvciAoOyBpIDwgNDsgaSsrKQotCQkgICAgICAgIHsKLQkJCSAgc3dpdGNoICgqcysrKQotCQkJICAgIHsKLQkJCSAgICBjYXNlICcwJzoKLQkJCSAgICAgIHBlcm0gPSAwOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSAnMSc6Ci0JCQkgICAgICBwZXJtID0gMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgJzInOgotCQkJICAgICAgcGVybSA9IDI7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlICczJzoKLQkJCSAgICAgIHBlcm0gPSAzOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCSAgICAgIGFzX2JhZChfKCJJbnZhbGlkIHBlcm11dGF0aW9uIGNvbXBsZXRlciIpKTsKLQkJCSAgICB9Ci0JCQkgIG9wY29kZSB8PSBwZXJtIDw8IHBlcm1sb2NbaV07Ci0JCQl9Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZChfKCJJbnZhbGlkIHBlcm11dGF0aW9uIGNvbXBsZXRlciIpKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlIGFsbCBjb25kaXRpb25zLiAgKi8KLQkgICAgY2FzZSAnPyc6Ci0JICAgICAgewotCQlhcmdzKys7Ci0JCXN3aXRjaCAoKmFyZ3MpCi0JCSAgewotIAkJICAvKiBIYW5kbGUgRlAgY29tcGFyZSBjb25kaXRpb25zLiAgKi8KLSAJCSAgY2FzZSAnZic6Ci0gCQkgICAgY29uZCA9IHBhX3BhcnNlX2ZwX2NtcF9jb25kICgmcyk7Ci0gCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjb25kLCAwKTsKLQotCQkgIC8qIEhhbmRsZSBhbiBhZGQgY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdBJzoKLQkJICBjYXNlICdhJzoKLSAJCSAgICBjbXBsdHIgPSAwOwotIAkJICAgIGZsYWcgPSAwOwotCQkgICAgaWYgKCpzID09ICcsJykKLQkJICAgICAgewotCQkJcysrOwotCi0JCQkvKiA2NCBiaXQgY29uZGl0aW9ucy4gICovCi0JCQlpZiAoKmFyZ3MgPT0gJ0EnKQotCQkJICB7Ci0JCQkgICAgaWYgKCpzID09ICcqJykKLQkJCSAgICAgIHMrKzsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBicmVhazsKLQkJCSAgfQotCQkJZWxzZSBpZiAoKnMgPT0gJyonKQotCQkJICBicmVhazsKLQkJCW5hbWUgPSBzOwotCi0JCQluYW1lID0gczsKLQkJCXdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0JCQkgIHMgKz0gMTsKLQkJCWMgPSAqczsKLQkJCSpzID0gMHgwMDsKLQkJCWlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMTsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkJICBjbXBsdHIgPSAyOwotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCQkJICBjbXBsdHIgPSAzOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm51diIpID09IDApCi0JCQkgIGNtcGx0ciA9IDQ7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiem52IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNTsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JCQkgIGNtcGx0ciA9IDY7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCQkJICBjbXBsdHIgPSA3OwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDA7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDE7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDI7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMzsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInV2IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDQ7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ2bnoiKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNTsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA2OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNzsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJLyogIiwqIiBpcyBhIHZhbGlkIGNvbmRpdGlvbi4gICovCi0JCQllbHNlIGlmICgqYXJncyA9PSAnYScpCi0JCQkgIGFzX2JhZCAoXygiSW52YWxpZCBBZGQgQ29uZGl0aW9uOiAlcyIpLCBuYW1lKTsKLQkJCSpzID0gYzsKLQkJICAgICAgfQotCQkgICAgb3Bjb2RlIHw9IGNtcGx0ciA8PCAxMzsKLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOwotCi0JCSAgLyogSGFuZGxlIG5vbi1uZWdhdGVkIGFkZCBhbmQgYnJhbmNoIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnZCc6Ci0JCSAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfYWRkX2NtcGx0ciAoJnMsIDEpOwotCQkgICAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSW52YWxpZCBBZGQgYW5kIEJyYW5jaCBDb25kaXRpb246ICVjIiksICpzKTsKLQkJCWNtcGx0ciA9IDA7Ci0JCSAgICAgIH0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkJICAvKiBIYW5kbGUgNjQgYml0IHdpZGUtbW9kZSBhZGQgYW5kIGJyYW5jaCBjb25kaXRpb24uICAqLwotCQkgIGNhc2UgJ1cnOgotCQkgICAgY21wbHRyID0gcGFfcGFyc2VfYWRkYl82NF9jbXBsdHIgKCZzKTsKLQkJICAgIGlmIChjbXBsdHIgPCAwKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIkludmFsaWQgQWRkIGFuZCBCcmFuY2ggQ29uZGl0aW9uOiAlYyIpLCAqcyk7Ci0JCQljbXBsdHIgPSAwOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCS8qIE5lZ2F0ZWQgY29uZGl0aW9uIHJlcXVpcmVzIGFuIG9wY29kZSBjaGFuZ2UuICovCi0JCQlvcGNvZGUgfD0gKGNtcGx0ciAmIDgpIDw8IDI0OwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciAmIDcsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSBhIG5lZ2F0ZWQgb3Igbm9uLW5lZ2F0ZWQgYWRkIGFuZCBicmFuY2gKLQkJICAgICBjb25kaXRpb24uICAqLwotCQkgIGNhc2UgJ0AnOgotCQkgICAgc2F2ZV9zID0gczsKLQkJICAgIGNtcGx0ciA9IHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyICgmcywgMSk7Ci0JCSAgICBpZiAoY21wbHRyIDwgMCkKLQkJICAgICAgewotCQkJcyA9IHNhdmVfczsKLQkJCWNtcGx0ciA9IHBhX3BhcnNlX25lZ19hZGRfY21wbHRyICgmcywgMSk7Ci0JCQlpZiAoY21wbHRyIDwgMCkKLQkJCSAgewotCQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbiIpKTsKLQkJCSAgICBjbXBsdHIgPSAwOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICAvKiBOZWdhdGVkIGNvbmRpdGlvbiByZXF1aXJlcyBhbiBvcGNvZGUgY2hhbmdlLiAqLwotCQkJICAgIG9wY29kZSB8PSAxIDw8IDI3OwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkJICAvKiBIYW5kbGUgYnJhbmNoIG9uIGJpdCBjb25kaXRpb25zLiAgKi8KLQkJICBjYXNlICdCJzoKLQkJICBjYXNlICdiJzoKLQkJICAgIGNtcGx0ciA9IDA7Ci0JCSAgICBpZiAoKnMgPT0gJywnKQotCQkgICAgICB7Ci0JCQlzKys7Ci0KLQkJCWlmICgqYXJncyA9PSAnQicpCi0JCQkgIHsKLQkJCSAgICBpZiAoKnMgPT0gJyonKQotCQkJICAgICAgcysrOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGJyZWFrOwotCQkJICB9Ci0JCQllbHNlIGlmICgqcyA9PSAnKicpCi0JCQkgIGJyZWFrOwotCi0JCQlpZiAoc3RybmNtcCAocywgIjwiLCAxKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMDsKLQkJCSAgICBzKys7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jbXAgKHMsICI+PSIsIDIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAxOwotCQkJICAgIHMgKz0gMjsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBhc19iYWQgKF8oIkludmFsaWQgQml0IEJyYW5jaCBDb25kaXRpb246ICVjIiksICpzKTsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDE1KTsKLQotCQkgIC8qIEhhbmRsZSBhIGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdTJzoKLQkJICBjYXNlICdzJzoKLQkJICAgIGNtcGx0ciA9IDA7Ci0JCSAgICBmbGFnID0gMDsKLQkJICAgIGlmICgqcyA9PSAnLCcpCi0JCSAgICAgIHsKLQkJCXMrKzsKLQotCQkJLyogNjQgYml0IGNvbmRpdGlvbnMuICAqLwotCQkJaWYgKCphcmdzID09ICdTJykKLQkJCSAgewotCQkJICAgIGlmICgqcyA9PSAnKicpCi0JCQkgICAgICBzKys7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKCpzID09ICcqJykKLQkJCSAgYnJlYWs7Ci0JCQluYW1lID0gczsKLQotCQkJbmFtZSA9IHM7Ci0JCQl3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkJICBzICs9IDE7Ci0JCQljID0gKnM7Ci0JCQkqcyA9IDB4MDA7Ci0JCQlpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JCQkgIGNtcGx0ciA9IDE7Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMjsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMzsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI8PCIpID09IDApCi0JCQkgIGNtcGx0ciA9IDQ7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPDw9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNTsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JCQkgIGNtcGx0ciA9IDY7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCQkJICBjbXBsdHIgPSA3OwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDA7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDE7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDI7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMzsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIj4+PSIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA0OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPj4iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNTsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA2OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNzsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJLyogIiwqIiBpcyBhIHZhbGlkIGNvbmRpdGlvbi4gICovCi0JCQllbHNlIGlmICgqYXJncyAhPSAnUycpCi0JCQkgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJXMiKSwKLQkJCQkgIG5hbWUpOwotCQkJKnMgPSBjOwotCQkgICAgICB9Ci0JCSAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkJICAvKiBIYW5kbGUgYSBub24tbmVnYXRlZCBjb21wYXJlIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAndCc6Ci0JCSAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ciAoJnMsIDEpOwotCQkgICAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJWMiKSwgKnMpOwotCQkJY21wbHRyID0gMDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSBhIDMyIGJpdCBjb21wYXJlIGFuZCBicmFuY2ggY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICduJzoKLQkJICAgIHNhdmVfcyA9IHM7Ci0JCSAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ciAoJnMsIDEpOwotCQkgICAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICAgIHsKLQkJCXMgPSBzYXZlX3M7Ci0JCQljbXBsdHIgPSBwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0ciAoJnMsIDEpOwotCQkJaWYgKGNtcGx0ciA8IDApCi0JCQkgIHsKLQkJCSAgICBhc19iYWQgKF8oIkludmFsaWQgQ29tcGFyZSBhbmQgQnJhbmNoIENvbmRpdGlvbi4iKSk7Ci0JCQkgICAgY21wbHRyID0gMDsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgLyogTmVnYXRlZCBjb25kaXRpb24gcmVxdWlyZXMgYW4gb3Bjb2RlIGNoYW5nZS4gKi8KLQkJCSAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQkJCSAgfQotCQkgICAgICB9Ci0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkJICAvKiBIYW5kbGUgYSA2NCBiaXQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnTic6Ci0JCSAgICBjbXBsdHIgPSBwYV9wYXJzZV9jbXBiXzY0X2NtcGx0ciAoJnMpOwotCQkgICAgaWYgKGNtcGx0ciA+PSAwKQotCQkgICAgICB7Ci0JCQkvKiBOZWdhdGVkIGNvbmRpdGlvbiByZXF1aXJlcyBhbiBvcGNvZGUgY2hhbmdlLiAqLwotCQkJb3Bjb2RlIHw9IChjbXBsdHIgJiA4KSA8PCAyNjsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICAvKiBOb3QgYSA2NCBiaXQgY29uZC4gIEdpdmUgMzIgYml0IGEgY2hhbmNlLiAqLwotCQkgICAgICBicmVhazsKLQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIgJiA3LCAxMyk7Ci0KLQkJICAvKiBIYW5kbGUgYSA2NCBiaXQgY21waWIgY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdRJzoKLQkJICAgIGNtcGx0ciA9IHBhX3BhcnNlX2NtcGliXzY0X2NtcGx0ciAoJnMpOwotCQkgICAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICAgIC8qIE5vdCBhIDY0IGJpdCBjb25kLiAgR2l2ZSAzMiBiaXQgYSBjaGFuY2UuICovCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JCSAgICAvKiBIYW5kbGUgYSBsb2dpY2FsIGluc3RydWN0aW9uIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnTCc6Ci0JCSAgY2FzZSAnbCc6Ci0JCSAgICBjbXBsdHIgPSAwOwotCQkgICAgZmxhZyA9IDA7Ci0JCSAgICBpZiAoKnMgPT0gJywnKQotCQkgICAgICB7Ci0JCQlzKys7Ci0KLQkJCS8qIDY0IGJpdCBjb25kaXRpb25zLiAgKi8KLQkJCWlmICgqYXJncyA9PSAnTCcpCi0JCQkgIHsKLQkJCSAgICBpZiAoKnMgPT0gJyonKQotCQkJICAgICAgcysrOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGJyZWFrOwotCQkJICB9Ci0JCQllbHNlIGlmICgqcyA9PSAnKicpCi0JCQkgIGJyZWFrOwotCQkJbmFtZSA9IHM7Ci0KLQkJCW5hbWUgPSBzOwotCQkJd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKLQkJCSAgcyArPSAxOwotCQkJYyA9ICpzOwotCQkJKnMgPSAweDAwOwotCi0KLQkJCWlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMTsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkJICBjbXBsdHIgPSAyOwotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCQkJICBjbXBsdHIgPSAzOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQkJCSAgY21wbHRyID0gNzsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAwOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAxOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAyOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDM7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA3OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQkvKiAiLCoiIGlzIGEgdmFsaWQgY29uZGl0aW9uLiAgKi8KLQkJCWVsc2UgaWYgKCphcmdzICE9ICdMJykKLQkJCSAgYXNfYmFkIChfKCJJbnZhbGlkIExvZ2ljYWwgSW5zdHJ1Y3Rpb24gQ29uZGl0aW9uLiIpKTsKLQkJCSpzID0gYzsKLQkJICAgICAgfQotCQkgICAgb3Bjb2RlIHw9IGNtcGx0ciA8PCAxMzsKLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOwotCi0JCSAgLyogSGFuZGxlIGEgc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnWCc6Ci0JCSAgY2FzZSAneCc6Ci0JCSAgY2FzZSAneSc6Ci0JCSAgICBjbXBsdHIgPSAwOwotCQkgICAgaWYgKCpzID09ICcsJykKLQkJICAgICAgewotCQkJc2F2ZV9zID0gcysrOwotCi0JCQkvKiA2NCBiaXQgY29uZGl0aW9ucy4gICovCi0JCQlpZiAoKmFyZ3MgPT0gJ1gnKQotCQkJICB7Ci0JCQkgICAgaWYgKCpzID09ICcqJykKLQkJCSAgICAgIHMrKzsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBicmVhazsKLQkJCSAgfQotCQkJZWxzZSBpZiAoKnMgPT0gJyonKQotCQkJICBicmVhazsKLQkJCW5hbWUgPSBzOwotCi0JCQluYW1lID0gczsKLQkJCXdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0JCQkgIHMgKz0gMTsKLQkJCWMgPSAqczsKLQkJCSpzID0gMHgwMDsKLQkJCWlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMTsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkJICBjbXBsdHIgPSAyOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQkJCSAgY21wbHRyID0gMzsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JCQkgIGNtcGx0ciA9IDQ7Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JCQkgIGNtcGx0ciA9IDU7Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JCQkgIGNtcGx0ciA9IDY7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkJICBjbXBsdHIgPSA3OwotCQkJLyogSGFuZGxlIG1vdmIsbi4gIFB1dCB0aGluZ3MgYmFjayB0aGUgd2F5IHRoZXkgd2VyZS4KLQkJCSAgIFRoaXMgaW5jbHVkZXMgbW92aW5nIHMgYmFjayB0byB3aGVyZSBpdCBzdGFydGVkLiAgKi8KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCAmJiAqYXJncyA9PSAneScpCi0JCQkgIHsKLQkJCSAgICAqcyA9IGM7Ci0JCQkgICAgcyA9IHNhdmVfczsKLQkJCSAgICBjb250aW51ZTsKLQkJCSAgfQotCQkJLyogIiwqIiBpcyBhIHZhbGlkIGNvbmRpdGlvbi4gICovCi0JCQllbHNlIGlmICgqYXJncyAhPSAnWCcpCi0JCQkgIGFzX2JhZCAoXygiSW52YWxpZCBTaGlmdC9FeHRyYWN0L0RlcG9zaXQgQ29uZGl0aW9uLiIpKTsKLQkJCSpzID0gYzsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSBhIHVuaXQgaW5zdHJ1Y3Rpb24gY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdVJzoKLQkJICBjYXNlICd1JzoKLQkJICAgIGNtcGx0ciA9IDA7Ci0JCSAgICBmbGFnID0gMDsKLQkJICAgIGlmICgqcyA9PSAnLCcpCi0JCSAgICAgIHsKLQkJCXMrKzsKLQotCQkJLyogNjQgYml0IGNvbmRpdGlvbnMuICAqLwotCQkJaWYgKCphcmdzID09ICdVJykKLQkJCSAgewotCQkJICAgIGlmICgqcyA9PSAnKicpCi0JCQkgICAgICBzKys7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKCpzID09ICcqJykKLQkJCSAgYnJlYWs7Ci0KLQkJCWlmIChzdHJuY2FzZWNtcCAocywgInNieiIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAyOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzaHoiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMzsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAic2RjIiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDQ7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNiYyIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA2OwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzaGMiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNzsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAidHIiLCAyKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMDsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgICBzICs9IDI7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmJ6IiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDI7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5oeiIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAzOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuZGMiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNDsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmJjIiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDY7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5oYyIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA3OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzd3oiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMTsKLQkJCSAgICBmbGFnID0gMDsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAic3djIiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDU7Ci0JCQkgICAgZmxhZyA9IDA7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm53eiIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAxOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJud2MiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNTsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCS8qICIsKiIgaXMgYSB2YWxpZCBjb25kaXRpb24uICAqLwotCQkJZWxzZSBpZiAoKmFyZ3MgIT0gJ1UnKQotCQkJICBhc19iYWQgKF8oIkludmFsaWQgVW5pdCBJbnN0cnVjdGlvbiBDb25kaXRpb24uIikpOwotCQkgICAgICB9Ci0JCSAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkJICBkZWZhdWx0OgotCQkgICAgYWJvcnQgKCk7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBjYXNlICduJzoKLQkgICAgICBudWxsaWYgPSBwYV9wYXJzZV9udWxsaWYgKCZzKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bGxpZiwgMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgZm9yIGNvcHIgYW5kIHNwb3AgaW5zbnMuICAqLwotCSAgICBjYXNlICdOJzoKLQkgICAgICBudWxsaWYgPSBwYV9wYXJzZV9udWxsaWYgKCZzKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bGxpZiwgNSk7Ci0KLQkgICAgLyogSGFuZGxlICwlcjIgY29tcGxldGVyIGZvciBuZXcgc3ludGF4IGJyYW5jaGVzLiAgKi8KLQkgICAgY2FzZSAnTCc6Ci0JICAgICAgaWYgKCpzID09ICcsJyAmJiBzdHJuY2FzZWNtcCAocyArIDEsICIlcjIiLCAzKSA9PSAwKQotCQlzICs9IDQ7Ci0JICAgICAgZWxzZSBpZiAoKnMgPT0gJywnICYmIHN0cm5jYXNlY21wIChzICsgMSwgIiVycCIsIDMpID09IDApCi0JCXMgKz0gNDsKLQkgICAgICBlbHNlCi0JCWJyZWFrOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIC8qIEhhbmRsZSAzIGJpdCBlbnRyeSBpbnRvIHRoZSBmcCBjb21wYXJlIGFycmF5LiAgIFZhbGlkIHZhbHVlcwotCSAgICAgICBhcmUgMC4uNiBpbmNsdXNpdmUuICAqLwotCSAgICBjYXNlICdoJzoKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgNiwgMCwgMCk7Ci0JCSAgbnVtKys7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlIDMgYml0IGVudHJ5IGludG8gdGhlIGZwIGNvbXBhcmUgYXJyYXkuICAgVmFsaWQgdmFsdWVzCi0JICAgICAgIGFyZSAwLi42IGluY2x1c2l2ZS4gICovCi0JICAgIGNhc2UgJ20nOgotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIHMgPSBleHByX2VuZDsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA2LCAwLCAwKTsKLQkJICBudW0gPSAobnVtICsgMSkgXiAxOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxMyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWJyZWFrOwotCi0JICAgIC8qIEhhbmRsZSBncmFwaGljcyB0ZXN0IGNvbXBsZXRlcnMgZm9yIGZ0ZXN0ICovCi0JICAgIGNhc2UgJz0nOgotCSAgICAgIHsKLQkJbnVtID0gcGFfcGFyc2VfZnRlc3RfZ2Z4X2NvbXBsZXRlciAoJnMpOwotCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIDExIGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdpJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtLCAxMDIzLCAtMTAyNCwgMCk7Ci0JCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTEsICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKLQkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7Ci0JCSAgZWxzZQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMTE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAxNCBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnSic6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgaW50IGEsIG07Ci0KLQkJICAvKiBYWFggdGhlIGNvbXBsZXRlciBzdG9yZWQgYXdheSB0aWJpdHMgb2YgaW5mb3JtYXRpb24KLQkJICAgICBmb3IgdXMgdG8gZXh0cmFjdC4gIFdlIG5lZWQgYSBjbGVhbmVyIHdheSB0byBkbyB0aGlzLgotCQkgICAgIE5vdyB0aGF0IHdlIGhhdmUgbG90cyBvZiBsZXR0ZXJzIGFnYWluLCBpdCB3b3VsZCBiZQotCQkgICAgIGdvb2QgdG8gcmV0aGluayB0aGlzLiAgKi8KLQkJICBtID0gKG9wY29kZSAmICgxIDw8IDgpKSAhPSAwOwotCQkgIGEgPSAob3Bjb2RlICYgKDEgPDwgOSkpICE9IDA7Ci0JCSAgb3Bjb2RlICY9IH4gKDMgPDwgOCk7Ci0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgaWYgKChhID09IDEgJiYgbnVtID49IDApIHx8IChhID09IDAgJiYgbnVtIDwgMCkpCi0JCSAgICBicmVhazsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAtODE5MiwgMCk7Ci0JCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTQsICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTQgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ0snOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIGludCBhLCBtOwotCi0JCSAgLyogWFhYIHRoZSBjb21wbGV0ZXIgc3RvcmVkIGF3YXkgdGliaXRzIG9mIGluZm9ybWF0aW9uCi0JCSAgICAgZm9yIHVzIHRvIGV4dHJhY3QuICBXZSBuZWVkIGEgY2xlYW5lciB3YXkgdG8gZG8gdGhpcy4KLQkJICAgICBOb3cgdGhhdCB3ZSBoYXZlIGxvdHMgb2YgbGV0dGVycyBhZ2FpbiwgaXQgd291bGQgYmUKLQkJICAgICBnb29kIHRvIHJldGhpbmsgdGhpcy4gICovCi0JCSAgbSA9IChvcGNvZGUgJiAoMSA8PCA4KSkgIT0gMDsKLQkJICBhID0gKG9wY29kZSAmICgxIDw8IDkpKSAhPSAwOwotCQkgIG9wY29kZSAmPSB+ICgzIDw8IDgpOwotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmICgoYSA9PSAxICYmIG51bSA8IDApIHx8IChhID09IDAgJiYgbnVtID4gMCkpCi0JCSAgICBicmVhazsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIGJyZWFrOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgxOTEsIC04MTkyLCAwKTsKLQkJICBpZiAobnVtIDwgMCkKLQkJICAgIG9wY29kZSB8PSAxOwotICAgICAgICAgICAgICAgICAgbnVtICY9IDB4MWZmZjsKLSAgICAgICAgICAgICAgICAgIG51bSA+Pj0gMjsKLSAgICAgICAgICAgICAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAzKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIDE0IGJpdCBpbW1lZGlhdGVkLCBzaGlmdGVkIGxlZnQgdGhyZWUgdGltZXMuICAqLwotCSAgICBjYXNlICcjJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICYgMHg3KQotCQkgICAgYnJlYWs7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgODE5MSwgLTgxOTIsIDApOwotCQkgIGlmIChudW0gPCAwKQotCQkgICAgb3Bjb2RlIHw9IDE7Ci0JCSAgbnVtICY9IDB4MWZmZjsKLQkJICBudW0gPj49IDM7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIEhhbmRsZSAxNCBiaXQgaW1tZWRpYXRlLCBzaGlmdGVkIGxlZnQgdHdpY2UuICAqLwotCSAgICBjYXNlICdkJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICYgMHgzKQotCQkgICAgYnJlYWs7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgODE5MSwgLTgxOTIsIDApOwotCQkgIGlmIChudW0gPCAwKQotCQkgICAgb3Bjb2RlIHw9IDE7Ci0JCSAgbnVtICY9IDB4MWZmZjsKLQkJICBudW0gPj49IDI7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDMpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNDsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDE0IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdqJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAtODE5MiwgMCk7Ci0JCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTQsICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKLQkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7Ci0JCSAgZWxzZQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMTQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAyMSBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnayc6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSA+PiAxMSwgMTA0ODU3NSwgLTEwNDg1NzYsIDApOwotCQkgIGRpc19hc3NlbWJsZV8yMSAobnVtLCAmbnVtKTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaXNfRFBfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9HT1RPRkY7Ci0JCSAgZWxzZSBpZiAoaXNfUENfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIGVsc2UKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDIxOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQuICAqLwotCSAgICBjYXNlICd3JzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGlmICghc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MSwgdywgcmVzdWx0OwotCi0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgaWYgKG51bSAlIDQpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiQnJhbmNoIHRvIHVuYWxpZ25lZCBhZGRyZXNzIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTk5LCAtODE4NCwgMCk7Ci0JCSAgc2lnbl91bmV4dCAoKG51bSAtIDgpID4+IDIsIDEyLCAmcmVzdWx0KTsKLQkJICBkaXNfYXNzZW1ibGVfMTIgKHJlc3VsdCwgJncxLCAmdyk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAoKHcxIDw8IDIpIHwgdyksIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxMjsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIHMgPSBleHByX2VuZDsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDE3IGJpdCBicmFuY2ggZGlzcGxhY2VtZW50LiAgKi8KLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBpZiAoIXRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wKLQkJICB8fCAhc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwKLQkJCSAgICAgICJMJDBcMDAxIikpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdzIsIHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCkKLQkJICAgIG51bSAtPSA4OwotCi0JCSAgc2lnbl91bmV4dCAobnVtID4+IDIsIDE3LCAmcmVzdWx0KTsKLQkJICBkaXNfYXNzZW1ibGVfMTcgKHJlc3VsdCwgJncxLCAmdzIsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsCi0JCQkJCSAgICgodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyksIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNzsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMjIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQuICAqLwotCSAgICBjYXNlICdYJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGlmICghdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbAotCQkgIHx8ICFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLAotCQkJICAgICAgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MywgdzIsIHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgzODg2MDcsIC04Mzg4NjA4LCAwKTsKLQotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKQotCQkgICAgbnVtIC09IDg7Ci0KLQkJICBzaWduX3VuZXh0IChudW0gPj4gMiwgMjIsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8yMiAocmVzdWx0LCAmdzMsICZ3MSwgJncyLCAmdyk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLAotCQkJCQkgICAgICgodzMgPDwgMjEpIHwgKHcyIDw8IDIpCi0JCQkJCSAgICAgIHwgKHcxIDw8IDE2KSB8IHcpLAotCQkJCQkgICAgIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAyMjsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGFuIGFic29sdXRlIDE3IGJpdCBicmFuY2ggdGFyZ2V0LiAgKi8KLQkgICAgY2FzZSAneic6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMDsKLQkgICAgICBpZiAoIXRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wKLQkJICB8fCAhc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwKLQkJCSAgICAgICJMJDBcMDAxIikpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdzIsIHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCkKLQkJICAgIG51bSAtPSA4OwotCi0JCSAgc2lnbl91bmV4dCAobnVtID4+IDIsIDE3LCAmcmVzdWx0KTsKLQkJICBkaXNfYXNzZW1ibGVfMTcgKHJlc3VsdCwgJncxLCAmdzIsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsCi0JCQkJCSAgICgodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyksIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfQUJTX0NBTEw7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMTc7Ci0JCSAgdGhlX2luc24uYXJnX3JlbG9jID0gbGFzdF9jYWxsX2Rlc2MuYXJnX3JlbG9jOwotCQkgIG1lbXNldCAoJmxhc3RfY2FsbF9kZXNjLCAwLCBzaXplb2YgKHN0cnVjdCBjYWxsX2Rlc2MpKTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSAnJXIxJyBpbXBsaWNpdCBvcGVyYW5kIG9mIGFkZGlsIGluc3RydWN0aW9uLiAgKi8KLQkgICAgY2FzZSAnWic6Ci0JICAgICAgaWYgKCpzID09ICcsJyAmJiAqKHMgKyAxKSA9PSAnJScgJiYgKihzICsgMykgPT0gJzEnCi0JCSAgJiYgKCoocyArIDIpID09ICdyJyB8fCAqKHMgKyAyKSA9PSAnUicpKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlICclc3IwLCVyMzEnIGltcGxpY2l0IG9wZXJhbmQgb2YgYmUsbCBpbnN0cnVjdGlvbi4gICovCi0JICAgIGNhc2UgJ1knOgotCSAgICAgIGlmIChzdHJuY2FzZWNtcCAocywgIiVzcjAsJXIzMSIsIDkpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gOTsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICAvKiBIYW5kbGUgaW1tZWRpYXRlIHZhbHVlIG9mIDAgZm9yIG9yZGVyZWQgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBjYXNlICdAJzoKLQkgICAgICBpZiAoKnMgIT0gJzAnKQotCQlicmVhazsKLQkgICAgICBzKys7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgLyogSGFuZGxlIGEgMiBiaXQgc2hpZnQgY291bnQgYXQgMjUuICAqLwotCSAgICBjYXNlICcuJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMywgMSwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgNCBiaXQgc2hpZnQgY291bnQgYXQgMjUuICAqLwotCSAgICBjYXNlICcqJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMTUsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHNoaWZ0IGNvdW50IGF0IDI2LiAgKi8KLQkgICAgY2FzZSAncCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgMzEgLSBudW0sIDUpOwotCi0JICAgIC8qIEhhbmRsZSBhIDYgYml0IHNoaWZ0IGNvdW50IGF0IDIwLDIyOjI2LiAgKi8KLQkgICAgY2FzZSAnfic6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDYzLCAwLCBzdHJpY3QpOwotCSAgICAgIG51bSA9IDYzIC0gbnVtOwotCSAgICAgIG9wY29kZSB8PSAobnVtICYgMHgyMCkgPDwgNjsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSAmIDB4MWYsIDUpOwotCi0JICAgIC8qIEhhbmRsZSBhIDYgYml0IGZpZWxkIGxlbmd0aCBhdCAyMywyNzozMS4gICovCi0JICAgIGNhc2UgJyUnOgotCSAgICAgIGZsYWcgPSAwOwotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2NCwgMSwgc3RyaWN0KTsKLQkgICAgICBudW0tLTsKLQkgICAgICBvcGNvZGUgfD0gKG51bSAmIDB4MjApIDw8IDM7Ci0JICAgICAgbnVtID0gMzEgLSAobnVtICYgMHgxZik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDYgYml0IGZpZWxkIGxlbmd0aCBhdCAxOSwyNzozMS4gICovCi0JICAgIGNhc2UgJ3wnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2NCwgMSwgc3RyaWN0KTsKLQkgICAgICBudW0tLTsKLQkgICAgICBvcGNvZGUgfD0gKG51bSAmIDB4MjApIDw8IDc7Ci0JICAgICAgbnVtID0gMzEgLSAobnVtICYgMHgxZik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGJpdCBwb3NpdGlvbiBhdCAyNi4gICovCi0JICAgIGNhc2UgJ1AnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNiBiaXQgYml0IHBvc2l0aW9uIGF0IDIwLDIyOjI2LiAgKi8KLQkgICAgY2FzZSAncSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDYzLCAwLCBzdHJpY3QpOwotCSAgICAgIG9wY29kZSB8PSAobnVtICYgMHgyMCkgPDwgNjsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSAmIDB4MWYsIDUpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGltbWVkaWF0ZSBhdCAxMCB3aXRoICdkJyBhcyB0aGUgY29tcGxlbWVudAotCSAgICAgICBvZiB0aGUgaGlnaCBiaXQgb2YgdGhlIGltbWVkaWF0ZS4gICovCi0JICAgIGNhc2UgJ0InOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2MywgMCwgc3RyaWN0KTsKLQkgICAgICBpZiAobnVtICYgMHgyMCkKLQkJOwotCSAgICAgIGVsc2UKLQkJb3Bjb2RlIHw9ICgxIDw8IDEzKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSAmIDB4MWYsIDIxKTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCBpbW1lZGlhdGUgYXQgMTAuICAqLwotCSAgICBjYXNlICdRJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAyMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgOSBiaXQgaW1tZWRpYXRlIGF0IDI4LiAgKi8KLQkgICAgY2FzZSAnJCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDUxMSwgMSwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMTMgYml0IGltbWVkaWF0ZSBhdCAxOC4gICovCi0JICAgIGNhc2UgJ0EnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMjYgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ0QnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2NzExMDg4NjQsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDMgYml0IFNGVSBpZGVudGlmaWVyIGF0IDI1LiAgKi8KLQkgICAgY2FzZSAndic6Ci0JICAgICAgaWYgKCpzKysgIT0gJywnKQotCQlhc19iYWQgKF8oIkludmFsaWQgU0ZVIGlkZW50aWZpZXIiKSk7Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDcsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDIwIGJpdCBTT1AgZmllbGQgZm9yIHNwb3AwLiAgKi8KLQkgICAgY2FzZSAnTyc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDEwNDg1NzUsIDAsIHN0cmljdCk7Ci0JICAgICAgbnVtID0gKG51bSAmIDB4MWYpIHwgKChudW0gJiAweDAwMGZmZmUwKSA8PCA2KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMTViaXQgU09QIGZpZWxkIGZvciBzcG9wMS4gICovCi0JICAgIGNhc2UgJ28nOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMjc2NywgMCwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTEpOwotCi0JICAgIC8qIEhhbmRsZSBhIDEwYml0IFNPUCBmaWVsZCBmb3Igc3BvcDMuICAqLwotCSAgICBjYXNlICcwJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMTAyMywgMCwgc3RyaWN0KTsKLQkgICAgICBudW0gPSAobnVtICYgMHgxZikgfCAoKG51bSAmIDB4MDAwMDAzZTApIDw8IDYpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYSAxNSBiaXQgU09QIGZpZWxkIGZvciBzcG9wMi4gICovCi0JICAgIGNhc2UgJzEnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMjc2NywgMCwgc3RyaWN0KTsKLQkgICAgICBudW0gPSAobnVtICYgMHgxZikgfCAoKG51bSAmIDB4MDAwMDdmZTApIDw8IDYpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYSAzLWJpdCBjby1wcm9jZXNzb3IgSUQgZmllbGQuICAqLwotCSAgICBjYXNlICd1JzoKLQkgICAgICBpZiAoKnMrKyAhPSAnLCcpCi0JCWFzX2JhZCAoXygiSW52YWxpZCBDT1BSIGlkZW50aWZpZXIiKSk7Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDcsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDIyYml0IFNPUCBmaWVsZCBmb3IgY29wci4gICovCi0JICAgIGNhc2UgJzInOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA0MTk0MzAzLCAwLCBzdHJpY3QpOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDNmZmZlMCkgPDwgNCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIHNvdXJjZSBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICd7JzoKLQkgICAgICBpZiAoKnMgPT0gJywnICYmICoocysxKSA9PSAndCcpCi0JCXsKLQkJICB0aGVfaW5zbi50cnVuYyA9IDE7Ci0JCSAgcyArPSAyOwotCQl9Ci0JICAgICAgZWxzZQotCQl0aGVfaW5zbi50cnVuYyA9IDA7Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Nudl9mb3JtYXQgKCZzKTsKLQkgICAgICB0aGVfaW5zbi5mcG9mMSA9IGZsYWc7Ci0JICAgICAgaWYgKGZsYWcgPT0gVyB8fCBmbGFnID09IFVXKQotCQlmbGFnID0gU0dMOwotCSAgICAgIGlmIChmbGFnID09IERXIHx8IGZsYWcgPT0gVURXKQotCQlmbGFnID0gREJMOwotCSAgICAgIGlmIChmbGFnID09IFFXIHx8IGZsYWcgPT0gVVFXKQotCQlmbGFnID0gUVVBRDsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCSAgICAvKiBIYW5kbGUgYSBkZXN0aW5hdGlvbiBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdfJzoKLQkgICAgICAvKiBwYV9wYXJzZV9mb3JtYXQgbmVlZHMgdGhlICcsJyBwcmVmaXguICAqLwotCSAgICAgIHMtLTsKLQkgICAgICBmbGFnID0gcGFfcGFyc2VfZnBfY252X2Zvcm1hdCAoJnMpOwotCSAgICAgIHRoZV9pbnNuLmZwb2YyID0gZmxhZzsKLQkgICAgICBpZiAoZmxhZyA9PSBXIHx8IGZsYWcgPT0gVVcpCi0JCWZsYWcgPSBTR0w7Ci0JICAgICAgaWYgKGZsYWcgPT0gRFcgfHwgZmxhZyA9PSBVRFcpCi0JCWZsYWcgPSBEQkw7Ci0JICAgICAgaWYgKGZsYWcgPT0gUVcgfHwgZmxhZyA9PSBVUVcpCi0JCWZsYWcgPSBRVUFEOwotCSAgICAgIG9wY29kZSB8PSBmbGFnIDw8IDEzOwotCSAgICAgIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wKLQkJICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBEQkwKLQkJICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBRVUFEKQotCQl7Ci0JCSAgaWYgKHRoZV9pbnNuLmZwb2YyID09IFNHTAotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBEQkwKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gUVVBRCkKLQkJICAgIGZsYWcgPSAwOwotCQkgIGVsc2UgaWYgKHRoZV9pbnNuLmZwb2YyID09IFcKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gRFcKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gUVcpCi0JCSAgICBmbGFnID0gMjsKLQkJICBlbHNlIGlmICh0aGVfaW5zbi5mcG9mMiA9PSBVVwotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBVRFcKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gVVFXKQotCQkgICAgZmxhZyA9IDY7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBXCi0JCSAgICAgICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBEVwotCQkgICAgICAgfHwgdGhlX2luc24uZnBvZjEgPT0gUVcpCi0JCXsKLQkJICBpZiAodGhlX2luc24uZnBvZjIgPT0gU0dMCi0JCSAgICAgIHx8IHRoZV9pbnNuLmZwb2YyID09IERCTAotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBRVUFEKQotCQkgICAgZmxhZyA9IDE7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBVVwotCQkgICAgICAgfHwgdGhlX2luc24uZnBvZjEgPT0gVURXCi0JCSAgICAgICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBVUVcpCi0JCXsKLQkJICBpZiAodGhlX2luc24uZnBvZjIgPT0gU0dMCi0JCSAgICAgIHx8IHRoZV9pbnNuLmZwb2YyID09IERCTAotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBRVUFEKQotCQkgICAgZmxhZyA9IDU7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBmbGFnIHw9IHRoZV9pbnNuLnRydW5jOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTUpOwotCi0JICAgIC8qIEhhbmRsZSBhIHNvdXJjZSBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdGJzoKLQkgICAgICBmbGFnID0gcGFfcGFyc2VfZnBfZm9ybWF0ICgmcyk7Ci0JICAgICAgdGhlX2luc24uZnBvZjEgPSBmbGFnOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JICAgIC8qIEhhbmRsZSBhIGRlc3RpbmF0aW9uIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ0cnOgotCSAgICAgIC8qIHBhX3BhcnNlX2Zvcm1hdCBuZWVkcyB0aGUgJywnIHByZWZpeC4gICovCi0JICAgICAgcy0tOwotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKLQkgICAgICB0aGVfaW5zbi5mcG9mMiA9IGZsYWc7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgc291cmNlIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlciBhdCAyMC4gICovCi0JICAgIGNhc2UgJ0knOgotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKLQkgICAgICB0aGVfaW5zbi5mcG9mMSA9IGZsYWc7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZCBmb3JtYXQgYXQgMjYuCi0JICAgICAgIE9ubHkgYWxsb3dzIHNpbmdsZSBhbmQgZG91YmxlIHByZWNpc2lvbi4gICovCi0JICAgIGNhc2UgJ0gnOgotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKLQkgICAgICBzd2l0Y2ggKGZsYWcpCi0JCXsKLQkJY2FzZSBTR0w6Ci0JCSAgb3Bjb2RlIHw9IDB4MjA7Ci0JCWNhc2UgREJMOgotCQkgIHRoZV9pbnNuLmZwb2YxID0gZmxhZzsKLQkJICBjb250aW51ZTsKLQotCQljYXNlIFFVQUQ6Ci0JCWNhc2UgSUxMRUdBTF9GTVQ6Ci0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0LiIpKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIEhhbmRsZSBhbGwgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLiAgKi8KLQkgICAgY2FzZSAnZic6Ci0JICAgICAgc3dpdGNoICgqKythcmdzKQotCSAgICAgICAgewotCQkvKiBGbG9hdCB0YXJnZXQgcmVnaXN0ZXIuICAqLwotCQljYXNlICd0JzoKLQkJICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgIGJyZWFrOwotCQkgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkJLyogRmxvYXQgdGFyZ2V0IHJlZ2lzdGVyIHdpdGggTC9SIHNlbGVjdGlvbi4gICovCi0JCWNhc2UgJ1QnOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIG9wY29kZSB8PSByZXN1bHQubnVtYmVyX3BhcnQ7Ci0KLQkJICAgIC8qIDB4MzAgb3Bjb2RlcyBhcmUgRlAgYXJpdGhtZXRpYyBvcGVyYXRpb24gb3Bjb2RlcwotCQkgICAgICAgYW5kIG5lZWQgdG8gYmUgdHVybmVkIGludG8gMHgzOCBvcGNvZGVzLiAgVGhpcwotCQkgICAgICAgaXMgbm90IG5lY2Vzc2FyeSBmb3IgbG9hZHMvc3RvcmVzLiAgKi8KLQkJICAgIGlmIChuZWVkX3BhMTFfb3Bjb2RlICgmdGhlX2luc24sICZyZXN1bHQpCi0JCQkmJiAoKG9wY29kZSAmIDB4ZmMwMDAwMDApID09IDB4MzAwMDAwMDApKQotCQkgICAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubF9yX3NlbGVjdCAmIDEsIDYpOwotCQkgIH0KLQotCQkvKiBGbG9hdCBvcGVyYW5kIDEuICAqLwotCQljYXNlICdhJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCQkgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCSAgICBDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCSAgICBvcGNvZGUgfD0gcmVzdWx0Lm51bWJlcl9wYXJ0IDw8IDIxOwotCQkgICAgaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgICAgIHsKLQkJCW9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA3OwotCQkJb3Bjb2RlIHw9IDEgPDwgMjc7Ci0JCSAgICAgIH0KLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQotCQkvKiBGbG9hdCBvcGVyYW5kIDEgd2l0aCBML1Igc2VsZWN0aW9uLiAgKi8KLQkJY2FzZSAnWCc6Ci0JCWNhc2UgJ0EnOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIG9wY29kZSB8PSByZXN1bHQubnVtYmVyX3BhcnQgPDwgMjE7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNzsKLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQotCQkvKiBGbG9hdCBvcGVyYW5kIDIuICAqLwotCQljYXNlICdiJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCQkgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCSAgICBDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MWYpIDw8IDE2OwotCQkgICAgaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgICAgIHsKLQkJCW9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCAxMjsKLQkJCW9wY29kZSB8PSAxIDw8IDI3OwotCQkgICAgICB9Ci0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0KLQkJLyogRmxvYXQgb3BlcmFuZCAyIHdpdGggTC9SIHNlbGVjdGlvbi4gICovCi0JCWNhc2UgJ0InOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIG9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgxZikgPDwgMTY7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgMTI7Ci0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0KLQkJLyogRmxvYXQgb3BlcmFuZCAzIGZvciBmbXB5ZmFkZCwgZm1weW5mYWRkLiAgKi8KLQkJY2FzZSAnQyc6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDFjKSA8PCAxMTsKLQkJICAgIG9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgzKSA8PCA5OwotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDg7Ci0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0KLQkJLyogRmxvYXQgbXVsdCBvcGVyYW5kIDEgZm9yIGZtcHlhZGQsIGZtcHlzdWIgKi8KLQkJY2FzZSAnaSc6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICAgICAgewotCQkJaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQotCQkJICB7Ci0JCQkgICAgYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQotCQkJcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJCXJlc3VsdC5udW1iZXJfcGFydCB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA0OwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMjEpOwotCQkgIH0KLQotCQkvKiBGbG9hdCBtdWx0IG9wZXJhbmQgMiBmb3IgZm1weWFkZCwgZm1weXN1YiAqLwotCQljYXNlICdqJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCQkgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCSAgICBDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCSAgICBpZiAodGhlX2luc24uZnBvZjEgPT0gU0dMKQotCQkgICAgICB7Ci0JCSAgICAgICAgaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQotCQkgICAgICAgICAgewotCQkgICAgCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOwotCQkgICAgCWJyZWFrOwotCQkgICAgICAgICAgfQotCQkgICAgICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICAgICAgcmVzdWx0Lm51bWJlcl9wYXJ0IHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDQ7Ci0JCSAgICAgIH0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAxNik7Ci0JCSAgfQotCi0JCS8qIEZsb2F0IG11bHQgdGFyZ2V0IGZvciBmbXB5YWRkLCBmbXB5c3ViICovCi0JCWNhc2UgJ2snOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgICAgIHsKLQkJICAgICAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgICAgICB7Ci0JCSAgICAJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDApOwotCQkgIH0KLQotCQkvKiBGbG9hdCBhZGQgb3BlcmFuZCAxIGZvciBmbXB5YWRkLCBmbXB5c3ViICovCi0JCWNhc2UgJ2wnOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgICAgIHsKLQkJICAgICAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgICAgICB7Ci0JCSAgICAJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDYpOwotCQkgIH0KLQotCQkvKiBGbG9hdCBhZGQgdGFyZ2V0IGZvciBmbXB5YWRkLCBmbXB5c3ViICovCi0JCWNhc2UgJ20nOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgICAgIHsKLQkJICAgICAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgICAgICB7Ci0JCSAgICAJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDExKTsKLQkJICB9Ci0KLQkJLyogSGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMgbGlrZSAneCcuICAqLwotCQljYXNlICdlJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDFmKSA8PCAxNjsKLQkJICAgIGlmIChuZWVkX3BhMTFfb3Bjb2RlICgmdGhlX2luc24sICZyZXN1bHQpKQotCQkgICAgICB7Ci0JCQlvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgMTsKLQkJICAgICAgfQotCQkgICAgY29udGludWU7Ci0JCSAgfQotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gZmFpbGVkOgotICAgICAgLyogQ2hlY2sgaWYgdGhlIGFyZ3MgbWF0Y2hlZC4gICovCi0gICAgICBpZiAobWF0Y2ggPT0gRkFMU0UpCi0JewotCSAgaWYgKCZpbnNuWzFdIC0gcGFfb3Bjb2RlcyA8IChpbnQpIE5VTU9QQ09ERVMKLQkgICAgICAmJiAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIHMgPSBhcmdzdGFydDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG9wZXJhbmRzICVzIiksIGVycm9yX21lc3NhZ2UpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogV3JpdGUgb3V0IGJpZy1lbmRpYW4uICAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLQotYXJlbGVudCAqKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0gIHN0YXRpYyBhcmVsZW50ICpub19yZWxvY3MgPSBOVUxMOwotICBhcmVsZW50ICoqcmVsb2NzOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgKipjb2RlczsKLSAgaW50IG5fcmVsb2NzOwotICBpbnQgaTsKLQotICBocHBhX2ZpeHAgPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKSBmaXhwLT50Y19maXhfZGF0YTsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IDApCi0gICAgcmV0dXJuICZub19yZWxvY3M7Ci0gIGFzc2VydCAoaHBwYV9maXhwICE9IDApOwotICBhc3NlcnQgKHNlY3Rpb24gIT0gMCk7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIGNvZGVzID0gKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAqKikgaHBwYV9nZW5fcmVsb2NfdHlwZSAoc3Rkb3V0cHV0LAotCQkJICAgICAgIGZpeHAtPmZ4X3JfdHlwZSwKLQkJCSAgICAgICBocHBhX2ZpeHAtPmZ4X3JfZm9ybWF0LAotCQkJICAgICAgIGhwcGFfZml4cC0+Znhfcl9maWVsZCwKLQkJCSAgICAgICBmaXhwLT5meF9zdWJzeSAhPSBOVUxMLAotCQkJICAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSkpOwotCi0gIGlmIChjb2RlcyA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIGZvciAobl9yZWxvY3MgPSAwOyBjb2Rlc1tuX3JlbG9jc107IG5fcmVsb2NzKyspCi0gICAgOwotCi0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiBuX3JlbG9jcyArIDEpOwotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkgKiBuX3JlbG9jcyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuX3JlbG9jczsgaSsrKQotICAgIHJlbG9jc1tpXSA9ICZyZWxvY1tpXTsKLQotICByZWxvY3Nbbl9yZWxvY3NdID0gTlVMTDsKLQotI2lmZGVmIE9CSl9FTEYKLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQgKG5fcmVsb2NzID09IDEpOwotCi0gICAgICBjb2RlID0gKmNvZGVzWzBdOwotCi0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICAgICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gMDsJLyogZGVmYXVsdCAqLwotCi0gICAgICBhc3NlcnQgKHJlbG9jLT5ob3d0byAmJiBjb2RlID09IHJlbG9jLT5ob3d0by0+dHlwZSk7Ci0KLSAgICAgIC8qIE5vdywgZG8gYW55IHByb2Nlc3NpbmcgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIHJlbG9jYXRpb24gdHlwZS4gICovCi0gICAgICBzd2l0Y2ggKGNvZGUpCi0JewotCWNhc2UgUl9QQVJJU0NfRExUUkVMMjFMOgotCWNhc2UgUl9QQVJJU0NfRExUUkVMMTRSOgotCWNhc2UgUl9QQVJJU0NfRExUUkVMMTRGOgotCWNhc2UgUl9QQVJJU0NfUExBQkVMMzI6Ci0JY2FzZSBSX1BBUklTQ19QTEFCRUwyMUw6Ci0JY2FzZSBSX1BBUklTQ19QTEFCRUwxNFI6Ci0JICAvKiBGb3IgcGxhYmVsIHJlbG9jYXRpb25zLCB0aGUgYWRkZW5kIG9mIHRoZQotCSAgICAgcmVsb2NhdGlvbiBzaG91bGQgYmUgZWl0aGVyIDAgKG5vIHN0YXRpYyBsaW5rKSBvciAyCi0JICAgICAoc3RhdGljIGxpbmsgcmVxdWlyZWQpLgotCi0JICAgICBGSVhNRTogV2UgYWx3YXlzIGFzc3VtZSBubyBzdGF0aWMgbGluayEKLQotCSAgICAgV2UgYWxzbyBzbGFtIGEgemVybyBhZGRlbmQgaW50byB0aGUgRExUIHJlbGF0aXZlIHJlbG9jczsKLQkgICAgIGl0IGRvZXNuJ3QgbWFrZSBhIGxvdCBvZiBzZW5zZSB0byB1c2UgYW55IGFkZGVuZCBzaW5jZQotCSAgICAgaXQgZ2V0cyB5b3UgYSBkaWZmZXJlbnQgKGVnIHVua25vd24pIERMVCBlbnRyeS4gICovCi0JICByZWxvYy0+YWRkZW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BBUklTQ19QQ1JFTDIxTDoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTdSOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxN0Y6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDE3QzoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0JICAvKiBUaGUgY29uc3RhbnQgaXMgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICByZWxvYy0+YWRkZW5kID0gSFBQQV9SX0FEREVORCAoaHBwYV9maXhwLT5meF9hcmdfcmVsb2MsIDApOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0jZWxzZSAvKiBPQkpfU09NICovCi0KLSAgLyogV2FsayBvdmVyIHJlYWNoIHJlbG9jYXRpb24gcmV0dXJuZWQgYnkgdGhlIEJGRCBiYWNrZW5kLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5fcmVsb2NzOyBpKyspCi0gICAgewotICAgICAgY29kZSA9ICpjb2Rlc1tpXTsKLQotICAgICAgcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgcmVsb2NzW2ldLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgICAgIHJlbG9jc1tpXS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAgICAgc3dpdGNoIChjb2RlKQotCXsKLQljYXNlIFJfQ09NUDI6Ci0JICAvKiBUaGUgb25seSB0aW1lIHdlIGV2ZXIgdXNlIGEgUl9DT01QMiBmaXh1cCBpcyBmb3IgdGhlIGRpZmZlcmVuY2UKLQkgICAgIG9mIHR3byBzeW1ib2xzLiAgV2l0aCB0aGF0IGluIG1pbmQgd2UgZmlsbCBpbiBhbGwgZm91cgotCSAgICAgcmVsb2NzIG5vdyBhbmQgYnJlYWsgb3V0IG9mIHRoZSBsb29wLiAgKi8KLQkgIGFzc2VydCAoaSA9PSAxKTsKLQkgIHJlbG9jc1swXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgJihiZmRfYWJzX3N5bWJvbCk7Ci0JICByZWxvY3NbMF0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1swXSk7Ci0JICByZWxvY3NbMF0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMF0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbMV0tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0JICAqcmVsb2NzWzFdLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0JICByZWxvY3NbMV0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1sxXSk7Ci0JICByZWxvY3NbMV0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMV0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbMl0tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0JICAqcmVsb2NzWzJdLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9zdWJzeSk7Ci0JICByZWxvY3NbMl0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1syXSk7Ci0JICByZWxvY3NbMl0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMl0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbM10tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopICYoYmZkX2Fic19zeW1ib2wpOwotCSAgcmVsb2NzWzNdLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCAqY29kZXNbM10pOwotCSAgcmVsb2NzWzNdLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCSAgcmVsb2NzWzNdLT5hZGRlbmQgPSAwOwotCSAgcmVsb2NzWzRdLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSAmKGJmZF9hYnNfc3ltYm9sKTsKLQkgIHJlbG9jc1s0XS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgKmNvZGVzWzRdKTsKLQkgIHJlbG9jc1s0XS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQkgIHJlbG9jc1s0XS0+YWRkZW5kID0gMDsKLQkgIGdvdG8gZG9uZTsKLQljYXNlIFJfUENSRUxfQ0FMTDoKLQljYXNlIFJfQUJTX0NBTEw6Ci0JICByZWxvY3NbaV0tPmFkZGVuZCA9IEhQUEFfUl9BRERFTkQgKGhwcGFfZml4cC0+ZnhfYXJnX3JlbG9jLCAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0RMVF9SRUw6Ci0JY2FzZSBSX0RBVEFfUExBQkVMOgotCWNhc2UgUl9DT0RFX1BMQUJFTDoKLQkgIC8qIEZvciBwbGFiZWwgcmVsb2NhdGlvbnMsIHRoZSBhZGRlbmQgb2YgdGhlCi0JICAgICByZWxvY2F0aW9uIHNob3VsZCBiZSBlaXRoZXIgMCAobm8gc3RhdGljIGxpbmspIG9yIDIKLQkgICAgIChzdGF0aWMgbGluayByZXF1aXJlZCkuCi0KLQkgICAgIEZJWE1FOiBXZSBhbHdheXMgYXNzdW1lIG5vIHN0YXRpYyBsaW5rIQotCi0JICAgICBXZSBhbHNvIHNsYW0gYSB6ZXJvIGFkZGVuZCBpbnRvIHRoZSBETFQgcmVsYXRpdmUgcmVsb2NzOwotCSAgICAgaXQgZG9lc24ndCBtYWtlIGEgbG90IG9mIHNlbnNlIHRvIHVzZSBhbnkgYWRkZW5kIHNpbmNlCi0JICAgICBpdCBnZXRzIHlvdSBhIGRpZmZlcmVudCAoZWcgdW5rbm93bikgRExUIGVudHJ5LiAgKi8KLQkgIHJlbG9jc1tpXS0+YWRkZW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX05fTU9ERToKLQljYXNlIFJfU19NT0RFOgotCWNhc2UgUl9EX01PREU6Ci0JY2FzZSBSX1JfTU9ERToKLQljYXNlIFJfRlNFTDoKLQljYXNlIFJfTFNFTDoKLQljYXNlIFJfUlNFTDoKLQljYXNlIFJfQkVHSU5fQlJUQUI6Ci0JY2FzZSBSX0VORF9CUlRBQjoKLQljYXNlIFJfQkVHSU5fVFJZOgotCWNhc2UgUl9OMFNFTDoKLQljYXNlIFJfTjFTRUw6Ci0JICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgb3IgYWRkZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBmaXh1cHMuICAqLwotICAgICAgICAgIHJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICAgICAqcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChkdW1teV9zeW1ib2wpOwotCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfRU5EX1RSWToKLQljYXNlIFJfRU5UUlk6Ci0JY2FzZSBSX0VYSVQ6Ci0JICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGZpeHVwcy4gICovCi0gICAgICAgICAgcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgICAgICpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGR1bW15X3N5bWJvbCk7Ci0JICByZWxvY3NbaV0tPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJlbG9jc1tpXS0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotCX0KLSAgICB9Ci0KLSBkb25lOgotI2VuZGlmCi0KLSAgcmV0dXJuIHJlbG9jczsKLX0KLQotLyogUHJvY2VzcyBhbnkgbWFjaGluZSBkZXBlbmRlbnQgZnJhZyB0eXBlcy4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgcmVnaXN0ZXIgYmZkICphYmZkOwotICAgICByZWdpc3RlciBhc2VjdGlvbiAqc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHVuc2lnbmVkIGludCBhZGRyZXNzOwotCi0gIGlmIChmcmFnUC0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKChpbnQpIGZyYWdQLT5mcl9zdWJ0eXBlKQotCXsKLQljYXNlIDA6Ci0JICBmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JICBrbm93IChmcmFnUC0+ZnJfdmFyID09IDEpOwotCSAga25vdyAoZnJhZ1AtPmZyX25leHQpOwotCSAgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeDsKLQkgIGlmIChhZGRyZXNzICUgZnJhZ1AtPmZyX29mZnNldCkKLQkgICAgewotCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQgPQotCQlmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcwotCQktIGZyYWdQLT5mcl9hZGRyZXNzCi0JCS0gZnJhZ1AtPmZyX2ZpeDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmcmFnUC0+ZnJfb2Zmc2V0ID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBhc2VjdGlvbiAqc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIGludCBhbGlnbjIgPSAoMSA8PCBhbGlnbikgLSAxOwotCi0gIHJldHVybiAoc2l6ZSArIGFsaWduMikgJiB+YWxpZ24yOwotfQotCi0vKiBSZXR1cm4gdGhlIGFwcHJveGltYXRlIHNpemUgb2YgYSBmcmFnIGJlZm9yZSByZWxheGF0aW9uIGhhcyBvY2N1cnJlZC4gICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBhc2VjdGlvbiAqc2VnbWVudDsKLXsKLSAgaW50IHNpemU7Ci0KLSAgc2l6ZSA9IDA7Ci0KLSAgd2hpbGUgKChmcmFnUC0+ZnJfZml4ICsgc2l6ZSkgJSBmcmFnUC0+ZnJfb2Zmc2V0KQotICAgIHNpemUrKzsKLQotICByZXR1cm4gc2l6ZTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4UDsKLSAgbG9uZyBuZXdfdmFsLCByZXN1bHQgPSAwOwotICB1bnNpZ25lZCBpbnQgdzEsIHcyLCB3LCByZXN1bHRpOwotCi0gIGhwcGFfZml4UCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopIGZpeFAtPnRjX2ZpeF9kYXRhOwotICAvKiBTT00gdXNlcyBSX0hQUEFfRU5UUlkgYW5kIFJfSFBQQV9FWElUIHJlbG9jYXRpb25zIHdoaWNoIGNhbgotICAgICBuZXZlciBiZSAiYXBwbGllZCIgKHRoZXkgYXJlIGp1c3QgbWFya2VycykuICBMaWtld2lzZSBmb3IKLSAgICAgUl9IUFBBX0JFR0lOX0JSVEFCIGFuZCBSX0hQUEFfRU5EX0JSVEFCLiAgKi8KLSNpZmRlZiBPQkpfU09NCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VOVFJZCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VYSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fQlJUQUIKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX0JSVEFCCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0JFR0lOX1RSWSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBEaXNndXN0aW5nLiAgV2UgbXVzdCBzZXQgZnhfb2Zmc2V0IG91cnNlbHZlcyAtLSBSX0hQUEFfRU5EX1RSWQotICAgICBmaXh1cHMgYXJlIGNvbnNpZGVyZWQgbm90IGFkanVzdGFibGUsIHdoaWNoIGluIHR1cm4gY2F1c2VzCi0gICAgIGFkanVzdF9yZWxvY19zeW1zIHRvIG5vdCBzZXQgZnhfb2Zmc2V0LiAgVWdoLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX1RSWSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9vZmZzZXQgPSAqdmFscDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYW4gSFBQQSBzcGVjaWZpYyBmaXh1cCBhc3NvY2lhdGVkCi0gICAgIHdpdGggdGhlIEdBUyBmaXh1cC4gICovCi0gIGlmIChocHBhX2ZpeFApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBidWZfd2QgPSBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1Zik7Ci0gICAgICBpbnQgZm10ID0gYmZkX2hwcGFfaW5zbjJmbXQgKGJ1Zl93ZCk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIGEgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpeHVwLCB0aGVuIGl0J3Mgc29tZXRoaW5nCi0JIHdoaWNoIHdpbGwgbmVlZCBhIFNPTSByZWxvY2F0aW9uIChleGNlcHQgZm9yIHNvbWUgUEMtcmVsYXRpdmUgcmVsb2NzKS4KLQkgSW4gc3VjaCBjYXNlcyB3ZSBzaG91bGQgdHJlYXQgdGhlICJ2YWwiIG9yICJhZGRlbmQiIGFzIHplcm8gc2luY2UgaXQKLQkgd2lsbCBiZSBhZGRlZCBpbiBhcyBuZWVkZWQgZnJvbSBmeF9vZmZzZXQgaW4gdGNfZ2VuX3JlbG9jLiAgKi8KLSAgICAgIGlmICgoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfTk9ORSkKLSNpZmRlZiBPQkpfU09NCi0JICAmJiBmbXQgIT0gMzIKLSNlbmRpZgotCSAgKQotCW5ld192YWwgPSAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcgfHwgZm10ID09IDIyKSA/IDggOiAwKTsKLSNpZmRlZiBPQkpfU09NCi0gICAgICAvKiBUaGVzZSBmaWVsZCBzZWxlY3RvcnMgaW1wbHkgdGhhdCB3ZSBkbyBub3Qgd2FudCBhbiBhZGRlbmQuICAqLwotICAgICAgZWxzZSBpZiAoaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfcHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9ycHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9scHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV90c2VsCi0JICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX3J0c2VsCi0JICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX2x0c2VsKQotCW5ld192YWwgPSAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcgfHwgZm10ID09IDIyKSA/IDggOiAwKTsKLSAgICAgIC8qIFRoaXMgaXMgdHJ1ZWx5IGRpc2d1c3RpbmcuICBUaGUgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlIGJsaW5kbHkKLQkgYWRkcyBpbiB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBiZWluZyByZWxvY2F0ZWQgYWdhaW5zdC4gIERhbW4hICAqLwotICAgICAgZWxzZSBpZiAoZm10ID09IDMyCi0JICAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IGJmZF9jb21fc2VjdGlvbl9wdHIpCi0JbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCAtIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSksCi0JCQkJICAgICAwLCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQpOwotI2VuZGlmCi0gICAgICBlbHNlCi0JbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCwgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKLQotICAgICAgLyogSGFuZGxlIHBjLXJlbGF0aXZlIGV4Y2VwdGlvbnMgZnJvbSBhYm92ZS4gICovCi0jZGVmaW5lIGFyZ19yZWxvY19zdHViX25lZWRlZChDQUxMRVIsIENBTExFRSkgXAotICAoKENBTExFRSkgJiYgKENBTExFUikgJiYgKChDQUxMRUUpICE9IChDQUxMRVIpKSkKLSAgICAgIGlmICgoZm10ID09IDEyIHx8IGZtdCA9PSAxNyB8fCBmbXQgPT0gMjIpCi0JICAmJiBmaXhQLT5meF9hZGRzeQotCSAgJiYgZml4UC0+ZnhfcGNyZWwKLSNpZmRlZiBPQkpfU09NCi0JICAmJiAhYXJnX3JlbG9jX3N0dWJfbmVlZGVkICgobG9uZykgKChvYmpfc3ltYm9sX3R5cGUgKikKLQkJc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KSktPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2MsCi0JCWhwcGFfZml4UC0+ZnhfYXJnX3JlbG9jKQotI2VuZGlmCi0JICAmJiAoKChpbnQpKCp2YWxwKSA+IC0yNjIxNDQgJiYgKGludCkoKnZhbHApIDwgMjYyMTQzKSAmJiBmbXQgIT0gMjIpCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgPT0gaHBwYV9maXhQLT5zZWdtZW50Ci0JICAmJiAhKGZpeFAtPmZ4X3N1YnN5Ci0JICAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X3N1YnN5KSAhPSBocHBhX2ZpeFAtPnNlZ21lbnQpKQotCi0JbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCwgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKLSN1bmRlZiBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQKLQotICAgICAgc3dpdGNoIChmbXQpCi0JewotCS8qIEhhbmRsZSBhbGwgb3Bjb2RlcyB3aXRoIHRoZSAnaicgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDE0OgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDgxOTEsIC04MTkyLCAwKTsKLQotCSAgLyogTWFzayBvZmYgMTQgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmZmYzAwMCwKLQkJICAgICAgYnVmKTsKLQkgIGxvd19zaWduX3VuZXh0IChuZXdfdmFsLCAxNCwgJnJlc3VsdGkpOwotCSAgcmVzdWx0ID0gcmVzdWx0aTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIGFsbCBvcGNvZGVzIHdpdGggdGhlICdrJyBvcGVyYW5kIHR5cGUuICAqLwotCWNhc2UgMjE6Ci0JICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgMjA5NzE1MiwgMCwgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDIxIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZlMDAwMDAsCi0JCSAgICAgIGJ1Zik7Ci0JICBkaXNfYXNzZW1ibGVfMjEgKG5ld192YWwsICZyZXN1bHRpKTsKLQkgIHJlc3VsdCA9IHJlc3VsdGk7Ci0JICBicmVhazsKLQotCS8qIEhhbmRsZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ2knIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxMToKLQkgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCAxMDIzLCAtMTAyMywgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDExIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZmZjgwMCwKLQkJICAgICAgYnVmKTsKLQkgIGxvd19zaWduX3VuZXh0IChuZXdfdmFsLCAxMSwgJnJlc3VsdGkpOwotCSAgcmVzdWx0ID0gcmVzdWx0aTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSAndycgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDEyOgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDgxOTksIC04MTg0LCAwKTsKLQotCSAgLyogTWFzayBvZmYgMTEgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIHNpZ25fdW5leHQgKChuZXdfdmFsIC0gOCkgPj4gMiwgMTIsICZyZXN1bHRpKTsKLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmZmZTAwMiwKLQkJICAgICAgYnVmKTsKLQotCSAgZGlzX2Fzc2VtYmxlXzEyIChyZXN1bHRpLCAmdzEsICZ3KTsKLQkgIHJlc3VsdCA9ICgodzEgPDwgMikgfCB3KTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIHNvbWUgb2YgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ1cnIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxNzoKLQkgIHsKLQkgICAgaW50IGRpc3RhbmNlID0gKnZhbHA7Ci0KLQkgICAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkgICAgLyogSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggKGllIG5vIGxpbmspIHdpdGggYW4gb3V0IG9mCi0JICAgICAgIHJhbmdlIHRhcmdldCwgdGhlbiB3ZSB3YW50IHRvIGNvbXBsYWluLiAgKi8KLQkgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfUENSRUxfQ0FMTAotCQkmJiAoZGlzdGFuY2UgPiAyNjIxNDMgfHwgZGlzdGFuY2UgPCAtMjYyMTQ0KQotCQkmJiAoYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwMDAwMCkgPT0gMHhlODAwMDAwMCkKLQkgICAgICBDSEVDS19GSUVMRCAoZGlzdGFuY2UsIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkgICAgLyogTWFzayBvZmYgMTcgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgICAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAotCQkJYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwZTAwMiwKLQkJCWJ1Zik7Ci0JICAgIHNpZ25fdW5leHQgKChuZXdfdmFsIC0gOCkgPj4gMiwgMTcsICZyZXN1bHRpKTsKLQkgICAgZGlzX2Fzc2VtYmxlXzE3IChyZXN1bHRpLCAmdzEsICZ3MiwgJncpOwotCSAgICByZXN1bHQgPSAoKHcyIDw8IDIpIHwgKHcxIDw8IDE2KSB8IHcpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgMjI6Ci0JICB7Ci0JICAgIGludCBkaXN0YW5jZSA9ICp2YWxwLCB3MzsKLQotCSAgICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgODM4ODYwNywgLTgzODg2MDgsIDApOwotCi0JICAgIC8qIElmIHRoaXMgaXMgYW4gYWJzb2x1dGUgYnJhbmNoIChpZSBubyBsaW5rKSB3aXRoIGFuIG91dCBvZgotCSAgICAgICByYW5nZSB0YXJnZXQsIHRoZW4gd2Ugd2FudCB0byBjb21wbGFpbi4gICovCi0JICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX1BDUkVMX0NBTEwKLQkJJiYgKGRpc3RhbmNlID4gODM4ODYwNyB8fCBkaXN0YW5jZSA8IC04Mzg4NjA4KQotCQkmJiAoYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwMDAwMCkgPT0gMHhlODAwMDAwMCkKLQkgICAgICBDSEVDS19GSUVMRCAoZGlzdGFuY2UsIDgzODg2MDcsIC04Mzg4NjA4LCAwKTsKLQotCSAgICAvKiBNYXNrIG9mZiAyMiBiaXRzIHRvIGJlIGNoYW5nZWQuICAqLwotCSAgICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCQliZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZjMDBlMDAyLAotCQkJYnVmKTsKLQkgICAgc2lnbl91bmV4dCAoKG5ld192YWwgLSA4KSA+PiAyLCAyMiwgJnJlc3VsdGkpOwotCSAgICBkaXNfYXNzZW1ibGVfMjIgKHJlc3VsdGksICZ3MywgJncxLCAmdzIsICZ3KTsKLQkgICAgcmVzdWx0ID0gKCh3MyA8PCAyMSkgfCAodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSAzMjoKLQkgIHJlc3VsdCA9IDA7Ci0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsIG5ld192YWwsIGJ1Zik7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhc19iYWQgKF8oIlVua25vd24gcmVsb2NhdGlvbiBlbmNvdW50ZXJlZCBpbiBtZF9hcHBseV9maXguIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBJbnNlcnQgdGhlIHJlbG9jYXRpb24uICAqLwotICAgICAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LCBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgfCByZXN1bHQsIGJ1Zik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIm5vIGhwcGFfZml4dXAgZW50cnkgZm9yIHRoaXMgZml4dXAgKGZpeFAgPSAweCV4LCB0eXBlID0gMHgleClcbiIpLAotCSAgICAgICh1bnNpZ25lZCBpbnQpIGZpeFAsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBQQSwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGlucHV0IGxpbmUgcG9pbnRlciBpcyBhdCB0aGUgZW5kIG9mCi0gICBhIHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyBpbnQKLWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkKLXsKLSAgcmV0dXJuICgoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgfHwgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzsnKQotCSAgfHwgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyEnKSk7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgZnJvbSBTLiAgVGhlIG51bWJlciBtaWdodCBjb21lIGluIG9uZSBvZiBtYW55IGZvcm1zLAotICAgdGhlIG1vc3QgY29tbW9uIHdpbGwgYmUgYSBoZXggb3IgZGVjaW1hbCBjb25zdGFudCwgYnV0IGl0IGNvdWxkIGJlCi0gICBhIHByZS1kZWZpbmVkIHJlZ2lzdGVyIChZdWshKSwgb3IgYW4gYWJzb2x1dGUgc3ltYm9sLgotCi0gICBSZXR1cm4gYSBudW1iZXIgb3IgLTEgZm9yIGZhaWx1cmUuCi0KLSAgIFdoZW4gcGFyc2luZyBQQS04OSBGUCByZWdpc3RlciBudW1iZXJzIFJFU1VMVCB3aWxsIGJlCi0gICB0aGUgYWRkcmVzcyBvZiBhIHN0cnVjdHVyZSB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKLSAgIEwvUiBoYWxmIG9mIEZQIHJlZ2lzdGVycywgc3RvcmUgcmVzdWx0cyB0aGVyZSBhcyBhcHByb3ByaWF0ZS4KLQotICAgcGFfcGFyc2VfbnVtYmVyIGNhbiBub3QgaGFuZGxlIG5lZ2F0aXZlIGNvbnN0YW50cyBhbmQgd2lsbCBmYWlsCi0gICBob3JyaWJseSBpZiBpdCBpcyBwYXNzZWQgc3VjaCBhIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfbnVtYmVyIChzLCByZXN1bHQpCi0gICAgIGNoYXIgKipzOwotICAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqcmVzdWx0OwotewotICBpbnQgbnVtOwotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgaW50IHN0YXR1czsKLSAgY2hhciAqcCA9ICpzOwotCi0gIC8qIFNraXAgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIG51bWJlci4gICovCi0gIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKLSAgICBwID0gcCArIDE7Ci0KLSAgLyogU3RvcmUgaW5mbyBpbiBSRVNVTFQgaWYgcmVxdWVzdGVkIGJ5IGNhbGxlci4gICovCi0gIGlmIChyZXN1bHQpCi0gICAgewotICAgICAgcmVzdWx0LT5udW1iZXJfcGFydCA9IC0xOwotICAgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gLTE7Ci0gICAgfQotICBudW0gPSAtMTsKLQotICBpZiAoaXNkaWdpdCAoKnApKQotICAgIHsKLSAgICAgIC8qIExvb2tzIGxpa2UgYSBudW1iZXIuICAqLwotICAgICAgbnVtID0gMDsKLQotICAgICAgaWYgKCpwID09ICcwJyAmJiAoKihwICsgMSkgPT0gJ3gnIHx8ICoocCArIDEpID09ICdYJykpCi0JewotCSAgLyogVGhlIG51bWJlciBpcyBzcGVjaWZpZWQgaW4gaGV4LiAgKi8KLQkgIHAgKz0gMjsKLQkgIHdoaWxlIChpc2RpZ2l0ICgqcCkgfHwgKCgqcCA+PSAnYScpICYmICgqcCA8PSAnZicpKQotCQkgfHwgKCgqcCA+PSAnQScpICYmICgqcCA8PSAnRicpKSkKLQkgICAgewotCSAgICAgIGlmIChpc2RpZ2l0ICgqcCkpCi0JCW51bSA9IG51bSAqIDE2ICsgKnAgLSAnMCc7Ci0JICAgICAgZWxzZSBpZiAoKnAgPj0gJ2EnICYmICpwIDw9ICdmJykKLQkJbnVtID0gbnVtICogMTYgKyAqcCAtICdhJyArIDEwOwotCSAgICAgIGVsc2UKLQkJbnVtID0gbnVtICogMTYgKyAqcCAtICdBJyArIDEwOwotCSAgICAgICsrcDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgbnVtYmVyIGlzIHNwZWNpZmllZCBpbiBkZWNpbWFsLiAgKi8KLQkgIHdoaWxlIChpc2RpZ2l0ICgqcCkpCi0JICAgIHsKLQkgICAgICBudW0gPSBudW0gKiAxMCArICpwIC0gJzAnOwotCSAgICAgICsrcDsKLQkgICAgfQotCX0KLQotICAgICAgLyogU3RvcmUgaW5mbyBpbiBSRVNVTFQgaWYgcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIuICAqLwotICAgICAgaWYgKHJlc3VsdCkKLQl7Ci0JICByZXN1bHQtPm51bWJlcl9wYXJ0ID0gbnVtOwotCi0JICBpZiAoSVNfUl9TRUxFQ1QgKHApKQotCSAgICB7Ci0JICAgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMTsKLQkgICAgICArK3A7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKElTX0xfU0VMRUNUIChwKSkKLQkgICAgewotCSAgICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKnAgPT0gJyUnKQotICAgIHsKLSAgICAgIC8qIFRoZSBudW1iZXIgbWlnaHQgYmUgYSBwcmVkZWZpbmVkIHJlZ2lzdGVyLiAgKi8KLSAgICAgIG51bSA9IDA7Ci0gICAgICBuYW1lID0gcDsKLSAgICAgIHArKzsKLSAgICAgIGMgPSAqcDsKLSAgICAgIC8qIFRlZ2UgaGFjazogU3BlY2lhbCBjYXNlIGZvciBnZW5lcmFsIHJlZ2lzdGVycyBhcyB0aGUgZ2VuZXJhbAotICAgICAgICAgY29kZSBtYWtlcyBhIGJpbmFyeSBzZWFyY2ggd2l0aCBjYXNlIHRyYW5zbGF0aW9uLCBhbmQgaXMgVkVSWQotICAgICAgICAgc2xvdy4gKi8KLSAgICAgIGlmIChjID09ICdyJykKLQl7Ci0JICBwKys7Ci0JICBpZiAoKnAgPT0gJ2UnICYmICoocCArIDEpID09ICd0JwotCSAgICAgICYmICgqKHAgKyAyKSA9PSAnMCcgfHwgKihwICsgMikgPT0gJzEnKSkKLQkgICAgewotCSAgICAgIHAgKz0gMjsKLQkgICAgICBudW0gPSAqcCAtICcwJyArIDI4OwotCSAgICAgIHArKzsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnAgPT0gJ3AnKQotCSAgICB7Ci0JICAgICAgbnVtID0gMjsKLQkgICAgICBwKys7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCFpc2RpZ2l0ICgqcCkpCi0JICAgIHsKLQkgICAgICBpZiAocHJpbnRfZXJyb3JzKQotCQlhc19iYWQgKF8oIlVuZGVmaW5lZCByZWdpc3RlcjogJyVzJy4iKSwgbmFtZSk7Ci0JICAgICAgbnVtID0gLTE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRvCi0JCW51bSA9IG51bSAqIDEwICsgKnArKyAtICcwJzsKLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKnApKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEbyBhIG5vcm1hbCByZWdpc3RlciBzZWFyY2guICAqLwotCSAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYykpCi0JICAgIHsKLQkgICAgICBwID0gcCArIDE7Ci0JICAgICAgYyA9ICpwOwotCSAgICB9Ci0JICAqcCA9IDA7Ci0JICBzdGF0dXMgPSByZWdfbmFtZV9zZWFyY2ggKG5hbWUpOwotCSAgaWYgKHN0YXR1cyA+PSAwKQotCSAgICBudW0gPSBzdGF0dXM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocHJpbnRfZXJyb3JzKQotCQlhc19iYWQgKF8oIlVuZGVmaW5lZCByZWdpc3RlcjogJyVzJy4iKSwgbmFtZSk7Ci0JICAgICAgbnVtID0gLTE7Ci0JICAgIH0KLQkgICpwID0gYzsKLQl9Ci0KLSAgICAgIC8qIFN0b3JlIGluZm8gaW4gUkVTVUxUIGlmIHJlcXVlc3RlZCBieSBjYWxsZXIuICAqLwotICAgICAgaWYgKHJlc3VsdCkKLQl7Ci0JICByZXN1bHQtPm51bWJlcl9wYXJ0ID0gbnVtOwotCSAgaWYgKElTX1JfU0VMRUNUIChwIC0gMSkpCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDE7Ci0JICBlbHNlIGlmIChJU19MX1NFTEVDVCAocCAtIDEpKQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCSAgZWxzZQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBbmQgZmluYWxseSwgaXQgY291bGQgYmUgYSBzeW1ib2wgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24gd2hpY2gKLSAgICAgICAgIGlzIGVmZmVjdGl2ZWx5IGEgY29uc3RhbnQuICAqLwotICAgICAgbnVtID0gMDsKLSAgICAgIG5hbWUgPSBwOwotICAgICAgYyA9ICpwOwotICAgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYykpCi0JewotCSAgcCA9IHAgKyAxOwotCSAgYyA9ICpwOwotCX0KLSAgICAgICpwID0gMDsKLSAgICAgIGlmICgoc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSAhPSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09ICZiZmRfYWJzX3NlY3Rpb24pCi0JICAgIG51bSA9IFNfR0VUX1ZBTFVFIChzeW0pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHByaW50X2Vycm9ycykKLQkJYXNfYmFkIChfKCJOb24tYWJzb2x1dGUgc3ltYm9sOiAnJXMnLiIpLCBuYW1lKTsKLQkgICAgICBudW0gPSAtMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGVyZSBpcyB3aGVyZSB3ZSdkIGNvbWUgZm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wKLQkgICAgIG9yIGZvciBhbiBlbXB0eSBzdHJpbmcuICBGb3IgYW4gZW1wdHkgc3RyaW5nIHdlCi0JICAgICB3aWxsIHJldHVybiB6ZXJvLiAgVGhhdCdzIGEgY29uY2Vzc2lvbiBtYWRlIGZvcgotCSAgICAgY29tcGF0YWJpbGl0eSB3aXRoIHRoZSBicmFpbmRhbWFnZWQgSFAgYXNzZW1ibGVycy4gICovCi0JICBpZiAoKm5hbWUgPT0gMCkKLQkgICAgbnVtID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwcmludF9lcnJvcnMpCi0JCWFzX2JhZCAoXygiVW5kZWZpbmVkIGFic29sdXRlIGNvbnN0YW50OiAnJXMnLiIpLCBuYW1lKTsKLQkgICAgICBudW0gPSAtMTsKLQkgICAgfQotCX0KLSAgICAgICpwID0gYzsKLQotICAgICAgLyogU3RvcmUgaW5mbyBpbiBSRVNVTFQgaWYgcmVxdWVzdGVkIGJ5IGNhbGxlci4gICovCi0gICAgICBpZiAocmVzdWx0KQotCXsKLQkgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSBudW07Ci0JICBpZiAoSVNfUl9TRUxFQ1QgKHAgLSAxKSkKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMTsKLQkgIGVsc2UgaWYgKElTX0xfU0VMRUNUIChwIC0gMSkpCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JICBlbHNlCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JfQotICAgIH0KLQotICAqcyA9IHA7Ci0gIHJldHVybiBudW07Ci19Ci0KLSNkZWZpbmUgUkVHX05BTUVfQ05UCShzaXplb2YocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcGRfcmVnKSkKLQotLyogR2l2ZW4gTkFNRSwgZmluZCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5hbWUsIHJldHVybgotICAgdGhlIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIC0xIG9uIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gUkVHX05BTUVfQ05UIC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZQotCXJldHVybiBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIFJldHVybiBub256ZXJvIGlmIHRoZSBnaXZlbiBJTlNOIGFuZCBML1IgaW5mb3JtYXRpb24gd2lsbCByZXF1aXJlCi0gICBhIG5ldyBQQS0xLjEgb3Bjb2RlLiAgKi8KLQotc3RhdGljIGludAotbmVlZF9wYTExX29wY29kZSAoaW5zbiwgcmVzdWx0KQotICAgICBzdHJ1Y3QgcGFfaXQgKmluc247Ci0gICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0ICpyZXN1bHQ7Ci17Ci0gIGlmIChyZXN1bHQtPmxfcl9zZWxlY3QgPT0gMSAmJiAhKGluc24tPmZwb2YxID09IERCTCAmJiBpbnNuLT5mcG9mMiA9PSBEQkwpKQotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZSwKLQkgdGhlbiBzZXQgYSBuZXcgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKHN0ZG91dHB1dCkgPCBwYTExKQotCXsKLQkgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgcGExMSkpCi0JICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCB1cGRhdGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCX0KLSAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLyogUGFyc2UgYSBjb25kaXRpb24gZm9yIGEgZmNtcCBpbnN0cnVjdGlvbi4gIFJldHVybiB0aGUgbnVtZXJpY2FsCi0gICBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZGl0aW9uLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfZnBfY21wX2NvbmQgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgY29uZCwgaTsKLQotICBjb25kID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKCpzLCBmcF9jb25kX21hcFtpXS5zdHJpbmcsCi0JCSAgICAgICBzdHJsZW4gKGZwX2NvbmRfbWFwW2ldLnN0cmluZykpID09IDApCi0JewotCSAgY29uZCA9IGZwX2NvbmRfbWFwW2ldLmNvbmQ7Ci0JICAqcyArPSBzdHJsZW4gKGZwX2NvbmRfbWFwW2ldLnN0cmluZyk7Ci0JICAvKiBJZiBub3QgYSBjb21wbGV0ZSBtYXRjaCwgYmFjayB1cCB0aGUgaW5wdXQgc3RyaW5nIGFuZAotCSAgICAgcmVwb3J0IGFuIGVycm9yLiAgKi8KLQkgIGlmICgqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSAgICB7Ci0JICAgICAgKnMgLT0gc3RybGVuIChmcF9jb25kX21hcFtpXS5zdHJpbmcpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICB3aGlsZSAoKipzID09ICcgJyB8fCAqKnMgPT0gJ1x0JykKLQkgICAgKnMgPSAqcyArIDE7Ci0JICByZXR1cm4gY29uZDsKLQl9Ci0gICAgfQotCi0gIGFzX2JhZCAoXygiSW52YWxpZCBGUCBDb21wYXJlIENvbmRpdGlvbjogJXMiKSwgKnMpOwotCi0gIC8qIEFkdmFuY2Ugb3ZlciB0aGUgYm9ndXMgY29tcGxldGVyLiAgKi8KLSAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLSAgICAqcyArPSAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBQYXJzZSBhIGdyYXBoaWNzIHRlc3QgY29tcGxldGUgZm9yIGZ0ZXN0LiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfZnRlc3RfZ2Z4X2NvbXBsZXRlciAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCB2YWx1ZTsKLQotICB2YWx1ZSA9IDA7Ci0gIGlmIChzdHJuY2FzZWNtcCAoKnMsICJhY2M4IiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IDU7Ci0gICAgICAqcyArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiYWNjNiIsIDQpID09IDApCi0gICAgewotICAgICAgdmFsdWUgPSA5OwotICAgICAgKnMgKz0gNDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgImFjYzQiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIHZhbHVlID0gMTM7Ci0gICAgICAqcyArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiYWNjMiIsIDQpID09IDApCi0gICAgewotICAgICAgdmFsdWUgPSAxNzsKLSAgICAgICpzICs9IDQ7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJhY2MiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIHZhbHVlID0gMTsKLSAgICAgICpzICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJyZWo4IiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IDY7Ci0gICAgICAqcyArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAicmVqIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IDI7Ci0gICAgICAqcyArPSAzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBGVEVTVCBjb21wbGV0ZXI6ICVzIiksICpzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBQYXJzZSBhbiBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZSBjb21wbGV0ZXIKLSAgIHR5cGUuICAqLwotCi1zdGF0aWMgZnBfb3BlcmFuZF9mb3JtYXQKLXBhX3BhcnNlX2ZwX2Nudl9mb3JtYXQgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgZm9ybWF0OwotCi0gIGZvcm1hdCA9IFNHTDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsICJzZ2wiLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFNHTDsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiZGJsIiwgMykgPT0gMCkKLQl7Ci0JICBmb3JtYXQgPSBEQkw7Ci0JICAqcyArPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInF1YWQiLCA0KSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFFVQUQ7Ci0JICAqcyArPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInciLCAxKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFc7Ci0JICAqcyArPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInV3IiwgMikgPT0gMCkKLQl7Ci0JICBmb3JtYXQgPSBVVzsKLQkgICpzICs9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiZHciLCAyKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IERXOwotCSAgKnMgKz0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJ1ZHciLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFVEVzsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAicXciLCAyKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFFXOwotCSAgKnMgKz0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJ1cXciLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFVRVzsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvcm1hdCA9IElMTEVHQUxfRk1UOwotCSAgYXNfYmFkIChfKCJJbnZhbGlkIEZQIE9wZXJhbmQgRm9ybWF0OiAlM3MiKSwgKnMpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZvcm1hdDsKLX0KLQotLyogUGFyc2UgYW4gRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyIHJldHVybmluZyB0aGUgY29tcGxldGVyCi0gICB0eXBlLiAgKi8KLQotc3RhdGljIGZwX29wZXJhbmRfZm9ybWF0Ci1wYV9wYXJzZV9mcF9mb3JtYXQgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgZm9ybWF0OwotCi0gIGZvcm1hdCA9IFNHTDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsICJzZ2wiLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFNHTDsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiZGJsIiwgMykgPT0gMCkKLQl7Ci0JICBmb3JtYXQgPSBEQkw7Ci0JICAqcyArPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInF1YWQiLCA0KSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFFVQUQ7Ci0JICAqcyArPSA1OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3JtYXQgPSBJTExFR0FMX0ZNVDsKLQkgIGFzX2JhZCAoXygiSW52YWxpZCBGUCBPcGVyYW5kIEZvcm1hdDogJTNzIiksICpzKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBmb3JtYXQ7Ci19Ci0KLS8qIENvbnZlcnQgZnJvbSBhIHNlbGVjdG9yIHN0cmluZyBpbnRvIGEgc2VsZWN0b3IgdHlwZS4gICovCi0KLXN0YXRpYyBpbnQKLXBhX2Noa19maWVsZF9zZWxlY3RvciAoc3RyKQotICAgICBjaGFyICoqc3RyOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0gIGNoYXIgbmFtZVs0XTsKLQotICAvKiBSZWFkIHBhc3QgYW55IHdoaXRlc3BhY2UuICAqLwotICAvKiBGSVhNRTogc2hvdWxkIHdlIHJlYWQgcGFzdCBuZXdsaW5lcyBhbmQgZm9ybWZlZWRzPz8/ICovCi0gIHdoaWxlICgqKnN0ciA9PSAnICcgfHwgKipzdHIgPT0gJ1x0JyB8fCAqKnN0ciA9PSAnXG4nIHx8ICoqc3RyID09ICdcZicpCi0gICAgKnN0ciA9ICpzdHIgKyAxOwotCi0gIGlmICgoKnN0cilbMV0gPT0gJ1wnJyB8fCAoKnN0cilbMV0gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSAwOwotICBlbHNlIGlmICgoKnN0cilbMl0gPT0gJ1wnJyB8fCAoKnN0cilbMl0gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSB0b2xvd2VyICgoKnN0cilbMV0pLAotICAgIG5hbWVbMl0gPSAwOwotICBlbHNlIGlmICgoKnN0cilbM10gPT0gJ1wnJyB8fCAoKnN0cilbM10gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSB0b2xvd2VyICgoKnN0cilbMV0pLAotICAgIG5hbWVbMl0gPSB0b2xvd2VyICgoKnN0cilbMl0pLAotICAgIG5hbWVbM10gPSAwOwotICBlbHNlCi0gICAgcmV0dXJuIGVfZnNlbDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gc2l6ZW9mIChzZWxlY3Rvcl90YWJsZSkgLyBzaXplb2YgKHN0cnVjdCBzZWxlY3Rvcl9lbnRyeSkgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNtcCAobmFtZSwgc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5wcmVmaXgpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JewotCSAgKnN0ciArPSBzdHJsZW4gKG5hbWUpICsgMTsKLSNpZm5kZWYgT0JKX1NPTQotCSAgaWYgKHNlbGVjdG9yX3RhYmxlW21pZGRsZV0uZmllbGRfc2VsZWN0b3IgPT0gZV9uc2VsKQotCSAgICByZXR1cm4gZV9mc2VsOwotI2VuZGlmCi0JICByZXR1cm4gc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5maWVsZF9zZWxlY3RvcjsKLQl9Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotCi0gIHJldHVybiBlX2ZzZWw7Ci19Ci0KLS8qIE1hcmsgKHZpYSBleHByX2VuZCkgdGhlIGVuZCBvZiBhbiBleHByZXNzaW9uIChJIHRoaW5rKS4gIEZJWE1FLiAgKi8KLQotc3RhdGljIGludAotZ2V0X2V4cHJlc3Npb24gKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzYXZlX2luOwotICBhc2VjdGlvbiAqc2VnOwotCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7Ci0gIGlmICghKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0JfHwgc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uCi0JfHwgU0VHX05PUk1BTCAoc2VnKSkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIHNlZ21lbnQgaW4gZXhwcmVzc2lvbi4iKSk7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotLyogTWFyayAodmlhIGV4cHJfZW5kKSB0aGUgZW5kIG9mIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBGSVhNRS4gKi8KLXN0YXRpYyBpbnQKLXBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uIChpbnNuLCBzdHJwKQotICAgICBzdHJ1Y3QgcGFfaXQgKmluc247Ci0gICAgIGNoYXIgKipzdHJwOwotewotICBjaGFyICpzYXZlX2luOwotCi0gIGluc24tPmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIChzdHJwKTsKLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cnA7Ci0gIGV4cHJlc3Npb24gKCZpbnNuLT5leHApOwotICAvKiBUaGlzIGlzIG5vdCBwZXJmZWN0LCBidXQgaXMgYSBodWdlIGltcHJvdmVtZW50IG92ZXIgZG9pbmcgbm90aGluZy4KLQotICAgICBUaGUgUEEgYXNzZW1ibHkgc3ludGF4IGlzIGFtYmlnaW91cyBpbiBhIHZhcmlldHkgb2Ygd2F5cy4gIENvbnNpZGVyCi0gICAgIHRoaXMgc3RyaW5nICI0ICVyNSIgIElzIHRoYXQgdGhlIG51bWJlciA0IGZvbGxvd2VkIGJ5IHRoZSByZWdpc3RlcgotICAgICByNSwgb3IgaXMgdGhhdCA0IE1PRCA1PwotCi0gICAgIElmIHdlIGdldCBhIG1vZHVsbyBleHByZXNpb24gV2hlbiBsb29raW5nIGZvciBhbiBhYnNvbHV0ZSwgd2UgdHJ5Ci0gICAgIGFnYWluIGN1dHRpbmcgb2ZmIHRoZSBpbnB1dCBzdHJpbmcgYXQgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAgKi8KLSAgaWYgKGluc24tPmV4cC5YX29wID09IE9fbW9kdWx1cykKLSAgICB7Ci0gICAgICBjaGFyICpzLCBjOwotICAgICAgaW50IHJldHZhbDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cnA7Ci0gICAgICBzID0gKnN0cnA7Ci0gICAgICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotICAgICAgICBzKys7Ci0KLSAgICAgIGMgPSAqczsKLSAgICAgICpzID0gMDsKLQotICAgICAgcmV0dmFsID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKGluc24sIHN0cnApOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgKnMgPSBjOwotICAgICAgcmV0dXJuIGV2YWx1YXRlX2Fic29sdXRlIChpbnNuKTsKLSAgICB9Ci0gIC8qIFdoZW4gaW4gc3RyaWN0IG1vZGUgd2UgaGF2ZSBhIG5vbi1tYXRjaCwgZml4IHVwIHRoZSBwb2ludGVycwotICAgICBhbmQgcmV0dXJuIHRvIG91ciBjYWxsZXIuICAqLwotICBpZiAoaW5zbi0+ZXhwLlhfb3AgIT0gT19jb25zdGFudCAmJiBzdHJpY3QpCi0gICAgewotICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoaW5zbi0+ZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkJhZCBzZWdtZW50IChzaG91bGQgYmUgYWJzb2x1dGUpLiIpKTsKLSAgICAgIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiBldmFsdWF0ZV9hYnNvbHV0ZSAoaW5zbik7Ci19Ci0KLS8qIEV2YWx1YXRlIGFuIGFic29sdXRlIGV4cHJlc3Npb24gRVhQIHdoaWNoIG1heSBiZSBtb2RpZmllZCBieQotICAgdGhlIHNlbGVjdG9yIEZJRUxEX1NFTEVDVE9SLiAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gICovCi1zdGF0aWMgaW50Ci1ldmFsdWF0ZV9hYnNvbHV0ZSAoaW5zbikKLSAgICAgc3RydWN0IHBhX2l0ICppbnNuOwotewotICBpbnQgdmFsdWU7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IGZpZWxkX3NlbGVjdG9yID0gaW5zbi0+ZmllbGRfc2VsZWN0b3I7Ci0KLSAgZXhwID0gaW5zbi0+ZXhwOwotICB2YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgc3dpdGNoIChmaWVsZF9zZWxlY3RvcikKLSAgICB7Ci0gICAgLyogTm8gY2hhbmdlLiAgKi8KLSAgICBjYXNlIGVfZnNlbDoKLSAgICAgIGJyZWFrOwotCi0gICAgLyogSWYgYml0IDIxIGlzIG9uIHRoZW4gYWRkIDB4ODAwIGFuZCBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMuICAqLwotICAgIGNhc2UgZV9sc3NlbDoKLSAgICAgIGlmICh2YWx1ZSAmIDB4MDAwMDA0MDApCi0JdmFsdWUgKz0gMHg4MDA7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTaWduIGV4dGVuZCBmcm9tIGJpdCAyMS4gICovCi0gICAgY2FzZSBlX3Jzc2VsOgotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSB8PSAweGZmZmZmODAwOwotICAgICAgZWxzZQotCXZhbHVlICY9IDB4N2ZmOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMuICAqLwotICAgIGNhc2UgZV9sc2VsOgotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogU2V0IGJpdHMgMC0yMCB0byB6ZXJvLiAgKi8KLSAgICBjYXNlIGVfcnNlbDoKLSAgICAgIHZhbHVlID0gdmFsdWUgJiAweDdmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQWRkIDB4ODAwIGFuZCBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMuICAqLwotICAgIGNhc2UgZV9sZHNlbDoKLSAgICAgIHZhbHVlICs9IDB4ODAwOwotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogU2V0IGJpdGdzIDAtMjEgdG8gb25lLiAgKi8KLSAgICBjYXNlIGVfcmRzZWw6Ci0gICAgICB2YWx1ZSB8PSAweGZmZmZmODAwOwotICAgICAgYnJlYWs7Ci0KLSNkZWZpbmUgUlNFTF9ST1VORChjKSAgKCgoYykgKyAweDEwMDApICYgfjB4MWZmZikKLSAgICBjYXNlIGVfcnJzZWw6Ci0gICAgICB2YWx1ZSA9IChSU0VMX1JPVU5EICh2YWx1ZSkgJiAweDdmZikgKyAodmFsdWUgLSBSU0VMX1JPVU5EICh2YWx1ZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfbHJzZWw6Ci0gICAgICB2YWx1ZSA9IChSU0VMX1JPVU5EICh2YWx1ZSkgPj4gMTEpICYgMHgxZmZmZmY7Ci0gICAgICBicmVhazsKLSN1bmRlZiBSU0VMX1JPVU5ECi0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZpZWxkX3NlbGVjdG9yKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBHaXZlbiBhbiBhcmd1bWVudCBsb2NhdGlvbiBzcGVjaWZpY2F0aW9uIHJldHVybiB0aGUgYXNzb2NpYXRlZAotICAgYXJndW1lbnQgbG9jYXRpb24gbnVtYmVyLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGFfYnVpbGRfYXJnX3JlbG9jICh0eXBlX25hbWUpCi0gICAgIGNoYXIgKnR5cGVfbmFtZTsKLXsKLQotICBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgIm5vIiwgMikgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHN0cm5jYXNlY21wICh0eXBlX25hbWUsICJnciIsIDIpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICh0eXBlX25hbWUsICJmciIsIDIpID09IDApCi0gICAgcmV0dXJuIDI7Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICh0eXBlX25hbWUsICJmdSIsIDIpID09IDApCi0gICAgcmV0dXJuIDM7Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgbG9jYXRpb246ICVzXG4iKSwgdHlwZV9uYW1lKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogRW5jb2RlIGFuZCByZXR1cm4gYW4gYXJndW1lbnQgcmVsb2NhdGlvbiBzcGVjaWZpY2F0aW9uIGZvcgotICAgdGhlIGdpdmVuIHJlZ2lzdGVyIGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgYXJnX3JlbG9jLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGFfYWxpZ25fYXJnX3JlbG9jIChyZWcsIGFyZ19yZWxvYykKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLSAgICAgdW5zaWduZWQgaW50IGFyZ19yZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IG5ld19yZWxvYzsKLQotICBuZXdfcmVsb2MgPSBhcmdfcmVsb2M7Ci0gIHN3aXRjaCAocmVnKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBuZXdfcmVsb2MgPDw9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBuZXdfcmVsb2MgPDw9IDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBuZXdfcmVsb2MgPDw9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBuZXdfcmVsb2MgPDw9IDI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIGFyZ3VtZW50IGRlc2NyaXB0aW9uOiAlZCIpLCByZWcpOwotICAgIH0KLQotICByZXR1cm4gbmV3X3JlbG9jOwotfQotCi0vKiBQYXJzZSBhIFBBIG51bGxpZmljYXRpb24gY29tcGxldGVyICgsbikuICBSZXR1cm4gbm9uemVybyBpZiB0aGUKLSAgIGNvbXBsZXRlciB3YXMgZm91bmQ7IHJldHVybiB6ZXJvIGlmIG5vIGNvbXBsZXRlciB3YXMgZm91bmQuICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9udWxsaWYgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgbnVsbGlmOwotCi0gIG51bGxpZiA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzID0gKnMgKyAxOwotICAgICAgaWYgKHN0cm5jYXNlY21wICgqcywgIm4iLCAxKSA9PSAwKQotCW51bGxpZiA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJJbnZhbGlkIE51bGxpZmljYXRpb246ICglYykiKSwgKipzKTsKLQkgIG51bGxpZiA9IDA7Ci0JfQotICAgICAgKnMgPSAqcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBudWxsaWY7Ci19Ci0KLS8qIFBhcnNlIGEgbm9uLW5lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZQotICAgbnVtYmVyIChmb3IgZW5jb2RpbmcgaW4gaW5zdHJ1dGlvbnMpIG9mIHRoZSBnaXZlbiBjb21wbGV0ZXIuCi0KLSAgIElTQlJBTkNIIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHBhcnNpbmcgYSBjb25kaXRpb24KLSAgIGNvbXBsZXRlciBmb3IgYSBicmFuY2ggKHZzIGEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgZm9yIGEKLSAgIGNvbXB1dGF0aW9uYWwgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ciAocywgaXNicmFuY2gpCi0gICAgIGNoYXIgKipzOwotICAgICBpbnQgaXNicmFuY2g7Ci17Ci0gIGludCBjbXBsdHI7Ci0gIGNoYXIgKm5hbWUgPSAqcyArIDE7Ci0gIGNoYXIgYzsKLSAgY2hhciAqc2F2ZV9zID0gKnM7Ci0gIGludCBudWxsaWZ5ID0gMDsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0KLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PCIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInN2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA2OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCi0JewotCSAgY21wbHRyID0gNzsKLQl9Ci0gICAgICAvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlIGFkZGIsbiB0aGVuIHRoZXJlIGlzIG5vIGNvbmRpdGlvbgotICAgICAgICAgY29tcGxldGVyLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCAmJiBpc2JyYW5jaCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCSAgbnVsbGlmeSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChudWxsaWZ5KQotICAgICpzID0gc2F2ZV9zOwotCi0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotLyogUGFyc2UgYSBuZWdhdGVkIGNvbXBhcmUvc3VidHJhY3QgY29tcGxldGVyIHJldHVybmluZyB0aGUKLSAgIG51bWJlciAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIgKHMsIGlzYnJhbmNoKQotICAgICBjaGFyICoqczsKLSAgICAgaW50IGlzYnJhbmNoOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotICBpbnQgbnVsbGlmeSA9IDA7Ci0KLSAgY21wbHRyID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotCi0KLSAgICAgIGlmIChzdHJjYXNlY21wIChuYW1lLCAidHIiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPiIpID09IDApCi0JewotCSAgY21wbHRyID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+Pj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQkgIG51bGxpZnkgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjbXBsdHIgPSAtMTsKLQl9Ci0gICAgICAqKnMgPSBjOwotICAgIH0KLQotICAvKiBSZXNldCBwb2ludGVycyBpZiB0aGlzIHdhcyByZWFsbHkgYSAsbiBmb3IgYSBicmFuY2ggaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAobnVsbGlmeSkKLSAgICAqcyA9IHNhdmVfczsKLQotCi0gIHJldHVybiBjbXBsdHI7Ci19Ci0KLQotLyogUGFyc2UgYSA2NCBiaXQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlciAoZm9yCi0gICBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgTm9ubmVnYXRlZCBjb21wYXJpc29ucyBhcmUgcmV0dXJuZWQgYXMgMC03LCBuZWdhdGVkIGNvbXBhcmlzb25zIGFyZQotICAgcmV0dXJuZWQgYXMgOC0xNS4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX2NtcGJfNjRfY21wbHRyIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAtMTsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiKiIpID09IDApCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPCIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKjw8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8PD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIipzdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKm9kIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqdHIiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKjw+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA5OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTA7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDExOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio+Pj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDEyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio+PiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIipuc3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqZXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE1OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjbXBsdHIgPSAtMTsKLQl9Ci0gICAgICAqKnMgPSBjOwotICAgIH0KLQotCi0gIHJldHVybiBjbXBsdHI7Ci19Ci0KLS8qIFBhcnNlIGEgNjQgYml0IGNvbXBhcmUgaW1tZWRpYXRlIGFuZCBicmFuY2ggY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyCi0gICAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfY21waWJfNjRfY21wbHRyIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAtMTsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiKjw8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA2OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqPiIpID09IDApCi0JewotCSAgY21wbHRyID0gNzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLQotICByZXR1cm4gY21wbHRyOwotfQotCi0vKiBQYXJzZSBhIG5vbi1uZWdhdGVkIGFkZGl0aW9uIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlcgotICAgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJudXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInpudiIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChjbXBsdHIgPT0gMCAmJiAqbmFtZSA9PSAnbicgJiYgaXNicmFuY2gpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotLyogUGFyc2UgYSBuZWdhdGVkIGFkZGl0aW9uIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlcgotICAgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbikuICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9uZWdfYWRkX2NtcGx0ciAocywgaXNicmFuY2gpCi0gICAgIGNoYXIgKipzOwotICAgICBpbnQgaXNicmFuY2g7Ci17Ci0gIGludCBjbXBsdHI7Ci0gIGNoYXIgKm5hbWUgPSAqcyArIDE7Ci0gIGNoYXIgYzsKLSAgY2hhciAqc2F2ZV9zID0gKnM7Ci0KLSAgY21wbHRyID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ1diIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidm56IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuc3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChjbXBsdHIgPT0gMCAmJiAqbmFtZSA9PSAnbicgJiYgaXNicmFuY2gpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotLyogUGFyc2UgYSA2NCBiaXQgd2lkZSBtb2RlIGFkZCBhbmQgYnJhbmNoIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlciAoZm9yCi0gICBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX2FkZGJfNjRfY21wbHRyIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLSAgaW50IG51bGxpZnkgPSAwOwotCi0gIGNtcGx0ciA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzICs9IDE7Ci0gICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSpzICs9IDE7Ci0gICAgICBjID0gKipzOwotICAgICAgKipzID0gMHgwMDsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm51diIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA2OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidHIiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDEwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDExOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ1diIpID09IDApCi0JewotCSAgY21wbHRyID0gMTI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxNTsKLQl9Ci0gICAgICAvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlIGFkZGIsbiB0aGVuIHRoZXJlIGlzIG5vIGNvbmRpdGlvbgotICAgICAgICAgY29tcGxldGVyLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCSAgbnVsbGlmeSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChudWxsaWZ5KQotICAgICpzID0gc2F2ZV9zOwotCi0gIHJldHVybiBjbXBsdHI7Ci19Ci0KLSNpZmRlZiBPQkpfU09NCi0vKiBIYW5kbGUgYW4gYWxpZ25tZW50IGRpcmVjdGl2ZS4gIFNwZWNpYWwgc28gdGhhdCB3ZSBjYW4gdXBkYXRlIHRoZQotICAgYWxpZ25tZW50IG9mIHRoZSBzdWJzcGFjZSBpZiBuZWNlc3NhcnkuICAqLwotc3RhdGljIHZvaWQKLXBhX2FsaWduIChieXRlcykKLXsKLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0KLSAgLyogTGV0IHRoZSBnZW5lcmljIGdhcyBjb2RlIGRvIG1vc3Qgb2YgdGhlIHdvcmsuICAqLwotICBzX2FsaWduX2J5dGVzIChieXRlcyk7Ci0KLSAgLyogSWYgYnl0ZXMgaXMgYSBwb3dlciBvZiAyLCB0aGVuIHVwZGF0ZSB0aGUgY3VycmVudCBzdWJzcGFjZSdzCi0gICAgIGFsaWdubWVudCBpZiBuZWNlc3NhcnkuICAqLwotICBpZiAobG9nMiAoYnl0ZXMpICE9IC0xKQotICAgIHJlY29yZF9hbGlnbm1lbnQgKGN1cnJlbnRfc3Vic3BhY2UtPnNzZF9zZWcsIGxvZzIgKGJ5dGVzKSk7Ci19Ci0jZW5kaWYKLQotLyogSGFuZGxlIGEgLkJMT0NLIHR5cGUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2Jsb2NrICh6KQotICAgICBpbnQgejsKLXsKLSAgY2hhciAqcDsKLSAgbG9uZyBpbnQgdGVtcF9maWxsOwotICB1bnNpZ25lZCBpbnQgdGVtcF9zaXplOwotICB1bnNpZ25lZCBpbnQgaTsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICB0ZW1wX3NpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAvKiBBbHdheXMgZmlsbCB3aXRoIHplcm9zLCB0aGF0J3Mgd2hhdCB0aGUgSFAgYXNzZW1ibGVyIGRvZXMuICAqLwotICB0ZW1wX2ZpbGwgPSAwOwotCi0gIHAgPSBmcmFnX3ZhciAocnNfZmlsbCwgKGludCkgdGVtcF9zaXplLCAoaW50KSB0ZW1wX3NpemUsCi0JCShyZWxheF9zdWJzdGF0ZVQpIDAsIChzeW1ib2xTICopIDAsIChvZmZzZXRUKSAxLCBOVUxMKTsKLSAgbWVtc2V0IChwLCAwLCB0ZW1wX3NpemUpOwotCi0gIC8qIENvbnZlcnQgMiBieXRlcyBhdCBhIHRpbWUuICAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCB0ZW1wX3NpemU7IGkgKz0gMikKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyBpLAotCQkJICAodmFsdWVUKSB0ZW1wX2ZpbGwsCi0JCQkgIChpbnQpICgodGVtcF9zaXplIC0gaSkgPiAyID8gMiA6ICh0ZW1wX3NpemUgLSBpKSkpOwotICAgIH0KLQotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmJlZ2luX2JydGFiIGFuZCAuZW5kX2JydGFiIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9icnRhYiAoYmVnaW4pCi0gICAgIGludCBiZWdpbjsKLXsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogVGhlIEJSVEFCIHJlbG9jYXRpb25zIGFyZSBvbmx5IGF2YWlsYmxlIGluIFNPTSAodG8gZGVub3RlCi0gICAgIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBicmFuY2ggdGFibGVzKS4gICovCi0gIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJMCwgYmVnaW4gPyBSX0hQUEFfQkVHSU5fQlJUQUIgOiBSX0hQUEFfRU5EX0JSVEFCLAotCQllX2ZzZWwsIDAsIDAsIE5VTEwpOwotI2VuZGlmCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmJlZ2luX3RyeSBhbmQgLmVuZF90cnkgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3RyeSAoYmVnaW4pCi0gICAgIGludCBiZWdpbjsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIGV4cHJlc3Npb25TIGV4cDsKLSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0gIGlmICghIGJlZ2luKQotICAgIGV4cHJlc3Npb24gKCZleHApOwotCi0gIC8qIFRoZSBUUlkgcmVsb2NhdGlvbnMgYXJlIG9ubHkgYXZhaWxibGUgaW4gU09NICh0byBkZW5vdGUKLSAgICAgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGV4Y2VwdGlvbiBoYW5kbGluZyByZWdpb25zKS4gICovCi0KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJTlVMTCwgKG9mZnNldFQpIDAsIGJlZ2luID8gTlVMTCA6ICZleHAsCi0JCTAsIGJlZ2luID8gUl9IUFBBX0JFR0lOX1RSWSA6IFJfSFBQQV9FTkRfVFJZLAotCQllX2ZzZWwsIDAsIDAsIE5VTEwpOwotI2VuZGlmCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLkNBTEwgcHNldWRvLW9wLiAgVGhpcyBpbnZvbHZlcyBzdG9yaW5nIGF3YXkgaW5mb3JtYXRpb24KLSAgIGFib3V0IHdoZXJlIGFyZ3VtZW50cyBhcmUgdG8gYmUgZm91bmQgc28gdGhlIGxpbmtlciBjYW4gZGV0ZWN0Ci0gICAoYW5kIGNvcnJlY3QpIGFyZ3VtZW50IGxvY2F0aW9uIG1pc21hdGNoZXMgYmV0d2VlbiBjYWxsZXIgYW5kIGNhbGxlZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jYWxsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHBhX2NhbGxfYXJncyAoJmxhc3RfY2FsbF9kZXNjKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogRG8gdGhlIGRpcnR5IHdvcmsgb2YgYnVpbGRpbmcgYSBjYWxsIGRlc2NyaXB0b3Igd2hpY2ggZGVzY3JpYmVzCi0gICB3aGVyZSB0aGUgY2FsbGVyIHBsYWNlZCBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbiBjYWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NhbGxfYXJncyAoY2FsbF9kZXNjKQotICAgICBzdHJ1Y3QgY2FsbF9kZXNjICpjYWxsX2Rlc2M7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICB1bnNpZ25lZCBpbnQgdGVtcCwgYXJnX3JlbG9jOwotCi0gIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgLyogUHJvY2VzcyBhIHNvdXJjZSBhcmd1bWVudC4gICovCi0gICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYXJndyIsIDQpID09IDApKQotCXsKLQkgIHRlbXAgPSBhdG9pIChuYW1lICsgNCk7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgYXJnX3JlbG9jID0gcGFfYnVpbGRfYXJnX3JlbG9jIChuYW1lKTsKLQkgIGNhbGxfZGVzYy0+YXJnX3JlbG9jIHw9IHBhX2FsaWduX2FyZ19yZWxvYyAodGVtcCwgYXJnX3JlbG9jKTsKLQl9Ci0gICAgICAvKiBQcm9jZXNzIGEgcmV0dXJuIHZhbHVlLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInJ0bnZhbCIsIDYpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBhcmdfcmVsb2MgPSBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpOwotCSAgY2FsbF9kZXNjLT5hcmdfcmVsb2MgfD0gKGFyZ19yZWxvYyAmIDB4Myk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiSW52YWxpZCAuQ0FMTCBhcmd1bWVudDogJXMiKSwgbmFtZSk7Ci0JfQotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiBUUlVFIGlmIEZSQUcxIGFuZCBGUkFHMiBhcmUgdGhlIHNhbWUuICAqLwotCi1zdGF0aWMgaW50Ci1pc19zYW1lX2ZyYWcgKGZyYWcxLCBmcmFnMikKLSAgICAgZnJhZ1MgKmZyYWcxOwotICAgICBmcmFnUyAqZnJhZzI7Ci17Ci0KLSAgaWYgKGZyYWcxID09IE5VTEwpCi0gICAgcmV0dXJuIChGQUxTRSk7Ci0gIGVsc2UgaWYgKGZyYWcyID09IE5VTEwpCi0gICAgcmV0dXJuIChGQUxTRSk7Ci0gIGVsc2UgaWYgKGZyYWcxID09IGZyYWcyKQotICAgIHJldHVybiAoVFJVRSk7Ci0gIGVsc2UgaWYgKGZyYWcyLT5mcl90eXBlID09IHJzX2ZpbGwgJiYgZnJhZzItPmZyX2ZpeCA9PSAwKQotICAgIHJldHVybiAoaXNfc2FtZV9mcmFnIChmcmFnMSwgZnJhZzItPmZyX25leHQpKTsKLSAgZWxzZQotICAgIHJldHVybiAoRkFMU0UpOwotfQotCi0jaWZkZWYgT0JKX0VMRgotLyogQnVpbGQgYW4gZW50cnkgaW4gdGhlIFVOV0lORCBzdWJzcGFjZSBmcm9tIHRoZSBnaXZlbiBmdW5jdGlvbgotICAgYXR0cmlidXRlcyBpbiBDQUxMX0lORk8uICBUaGlzIGlzIG5vdCBuZWVkZWQgZm9yIFNPTSBhcyB1c2luZwotICAgUl9FTlRSWSBhbmQgUl9FWElUIHJlbG9jYXRpb25zIGFsbG93IHRoZSBsaW5rZXIgdG8gaGFuZGxlIGJ1aWxkaW5nCi0gICBvZiB0aGUgdW53aW5kIHNwYWNlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9idWlsZF91bndpbmRfc3Vic3BhY2UgKGNhbGxfaW5mbykKLSAgICAgc3RydWN0IGNhbGxfaW5mbyAqY2FsbF9pbmZvOwotewotICBjaGFyICp1bndpbmQ7Ci0gIGFzZWN0aW9uICpzZWcsICpzYXZlX3NlZzsKLSAgYXN5bWJvbCAqc3ltOwotICBzdWJzZWdUIHN1YnNlZywgc2F2ZV9zdWJzZWc7Ci0gIGludCBpLCByZWxvYzsKLSAgY2hhciBjLCAqcDsKLQotICBpZiAobm93X3NlZyAhPSB0ZXh0X3NlY3Rpb24pCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoc3Rkb3V0cHV0KS0+Yml0c19wZXJfYWRkcmVzcyA9PSAzMikKLSAgICByZWxvYyA9IFJfUEFSSVNDX0RJUjMyOwotICBlbHNlCi0gICAgcmVsb2MgPSBSX1BBUklTQ19TRUdSRUwzMjsKLQotICBzYXZlX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgLyogR2V0IGludG8gdGhlIHJpZ2h0IHNlZy9zdWJzZWcuICBUaGlzIG1heSBpbnZvbHZlIGNyZWF0aW5nCi0gICAgIHRoZSBzZWcgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaC4gIE1ha2Ugc3VyZSB0byBoYXZlIHRoZQotICAgICBvbGQgc2VnL3N1YnNlZyBzbyB0aGF0IHdlIGNhbiByZXNldCB0aGluZ3Mgd2hlbiB3ZSBhcmUgZG9uZS4gICovCi0gIHNlZyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsIFVOV0lORF9TRUNUSU9OX05BTUUpOwotICBpZiAoc2VnID09IEFTRUNfTlVMTCkKLSAgICB7Ci0gICAgICBzZWcgPSBzdWJzZWdfbmV3IChVTldJTkRfU0VDVElPTl9OQU1FLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsCi0JCQkgICAgIFNFQ19SRUFET05MWSB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSAgICAgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19BTExPQyB8IFNFQ19EQVRBKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKLSAgICB9Ci0KLSAgc3Vic2VnX3NldCAoc2VnLCAwKTsKLQotCi0gIC8qIEdldCBzb21lIHNwYWNlIHRvIGhvbGQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHVud2luZAotICAgICBkZXNjcmlwdG9yLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgMCwgNCk7Ci0KLSAgLyogUmVsb2NhdGlvbiBpbmZvLiBmb3Igc3RhcnQgb2Zmc2V0IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgcmVsb2MsCi0JCWVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDAsIDQpOwotCi0gIC8qIFJlbG9jYXRpb24gaW5mby4gZm9yIGVuZCBvZmZzZXQgb2YgdGhlIGZ1bmN0aW9uLgotCi0gICAgIEJlY2F1c2Ugd2UgYWxsb3cgcmVkdWN0aW9ucyBvZiAzMmJpdCByZWxvY2F0aW9ucyBmb3IgRUxGLCB0aGlzIHdpbGwgYmUKLSAgICAgcmVkdWNlZCB0byBzZWN0aW9uX3N5bSArIG9mZnNldCB3aGljaCBhdm9pZHMgcHV0dGluZyB0aGUgdGVtcG9yYXJ5Ci0gICAgIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBJdCAoc2hvdWxkKSBlbmQgdXAgZ2l2aW5nIHRoZSBzYW1lCi0gICAgIHZhbHVlIGFzIGNhbGxfaW5mby0+c3RhcnRfc3ltYm9sICsgZnVuY3Rpb24gc2l6ZSBvbmNlIHRoZSBsaW5rZXIgaXMKLSAgICAgZmluaXNoZWQgd2l0aCBpdHMgd29yay4gICovCi0KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQljYWxsX2luZm8tPmVuZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgcmVsb2MsCi0JCWVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIC8qIER1bXAgaXQuICovCi0gIHVud2luZCA9IChjaGFyICopICZjYWxsX2luZm8tPmNpX3Vud2luZDsKLSAgZm9yIChpID0gODsgaSA8IHNpemVvZiAoc3RydWN0IHVud2luZF90YWJsZSk7IGkrKykKLSAgICB7Ci0gICAgICBjID0gKih1bndpbmQgKyBpKTsKLSAgICAgIHsKLQlGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotICAgICAgfQotICAgIH0KLQotICAvKiBSZXR1cm4gYmFjayB0byB0aGUgb3JpZ2luYWwgc2VnbWVudC9zdWJzZWdtZW50LiAgKi8KLSAgc3Vic2VnX3NldCAoc2F2ZV9zZWcsIHNhdmVfc3Vic2VnKTsKLX0KLSNlbmRpZgotCi0vKiBQcm9jZXNzIGEgLkNBTExJTkZPIHBzZXVkby1vcC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBsYXRlcgotICAgdG8gYnVpbGQgdW53aW5kIGRlc2NyaXB0b3JzIGFuZCBtYXliZSBvbmUgZGF5IHRvIHN1cHBvcnQKLSAgIC5FTlRFUiBhbmQgLkxFQVZFLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NhbGxpbmZvICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBpbnQgdGVtcDsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICAvKiAuQ0FMTElORk8gbXVzdCBhcHBlYXIgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uICAqLwotICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfYmFkIChfKCIuY2FsbGluZm8gaXMgbm90IHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uIikpOwotCi0gIC8qIE1hcmsgdGhlIGZhY3QgdGhhdCB3ZSBmb3VuZCB0aGUgLkNBTExJTkZPIGZvciB0aGUKLSAgICAgY3VycmVudCBwcm9jZWR1cmUuICAqLwotICBjYWxsaW5mb19mb3VuZCA9IFRSVUU7Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIHRoZSAuQ0FMTElORk8gYXJndW1lbnRzLiAgKi8KLSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICAvKiBGcmFtZSBzaXplIHNwZWNpZmljYXRpb24uICAqLwotICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImZyYW1lIiwgNSkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKCh0ZW1wICYgMHgzKSAhPSAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJGUkFNRSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDg6ICVkXG4iKSwgdGVtcCk7Ci0JICAgICAgdGVtcCA9IDA7Ci0JICAgIH0KLQotCSAgLyogY2FsbGluZm8gaXMgaW4gYnl0ZXMgYW5kIHVud2luZF9kZXNjIGlzIGluIDggYnl0ZSB1bml0cy4gICovCi0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuZnJhbWVfc2l6ZSA9IHRlbXAgLyA4OwotCi0JfQotICAgICAgLyogRW50cnkgcmVnaXN0ZXIgKEdSLCBHUiBhbmQgU1IpIHNwZWNpZmljYXRpb25zLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImVudHJ5X2dyIiwgOCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgLyogVGhlIEhQIGFzc2VtYmxlciBhY2NlcHRzIDE5IGFzIHRoZSBoaWdoIGJvdW5kIGZvciBFTlRSWV9HUgotCSAgICAgZXZlbiB0aG91Z2ggJXIxOSBpcyBjYWxsZXIgc2F2ZWQuICBJIHRoaW5rIHRoaXMgaXMgYSBidWcgaW4KLQkgICAgIHRoZSBIUCBhc3NlbWJsZXIsIGFuZCB3ZSBhcmUgbm90IGdvaW5nIHRvIGVtdWxhdGUgaXQuICAqLwotCSAgaWYgKHRlbXAgPCAzIHx8IHRlbXAgPiAxOCkKLQkgICAgYXNfYmFkIChfKCJWYWx1ZSBmb3IgRU5UUllfR1IgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMy4uMThcbiIpKTsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5lbnRyeV9nciA9IHRlbXAgLSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImVudHJ5X2ZyIiwgOCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgLyogU2ltaWxhcmx5IHRoZSBIUCBhc3NlbWJsZXIgdGFrZXMgMzEgYXMgdGhlIGhpZ2ggYm91bmQgZXZlbgotCSAgICAgdGhvdWdoICVmcjIxIGlzIHRoZSBsYXN0IGNhbGxlZSBzYXZlZCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0JICBpZiAodGVtcCA8IDEyIHx8IHRlbXAgPiAyMSkKLQkgICAgYXNfYmFkIChfKCJWYWx1ZSBmb3IgRU5UUllfRlIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMTIuLjIxXG4iKSk7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuZW50cnlfZnIgPSB0ZW1wIC0gMTE7Ci0JfQotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZW50cnlfc3IiLCA4KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBpZiAodGVtcCAhPSAzKQotCSAgICBhc19iYWQgKF8oIlZhbHVlIGZvciBFTlRSWV9TUiBtdXN0IGJlIDNcbiIpKTsKLQl9Ci0gICAgICAvKiBOb3RlIHdoZXRoZXIgb3Igbm90IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYW55IGNhbGxzLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImNhbGxzIiwgNSkgPT0gMCkgfHwKLQkgICAgICAgKHN0cm5jYXNlY21wIChuYW1lLCAiY2FsbGVyIiwgNikgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQl9Ci0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJub19jYWxscyIsIDgpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JfQotICAgICAgLyogU2hvdWxkIFJQIGJlIHNhdmVkIGludG8gdGhlIHN0YWNrLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNhdmVfcnAiLCA3KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLnNhdmVfcnAgPSAxOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciBTUC4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzYXZlX3NwIiwgNykgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5zYXZlX3NwID0gMTsKLQl9Ci0gICAgICAvKiBJcyB0aGlzIGFuIHVud2luZGFibGUgcHJvY2VkdXJlLiAgSWYgc28gbWFyayBpdCBzbwotICAgICAgICAgaW4gdGhlIHVud2luZCBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm5vX3Vud2luZCIsIDkpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuY2Fubm90X3Vud2luZCA9IDE7Ci0JfQotICAgICAgLyogSXMgdGhpcyBhbiBpbnRlcnJ1cHQgcm91dGluZS4gIElmIHNvIG1hcmsgaXQgaW4gdGhlCi0gICAgICAgICB1bndpbmQgZGVzY3JpcHRvci4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJocHV4X2ludCIsIDcpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuaHB1eF9pbnRlcnJ1cHRfbWFya2VyID0gMTsKLQl9Ci0gICAgICAvKiBJcyB0aGlzIGEgbWlsbGljb2RlIHJvdXRpbmUuICAibWlsbGljb2RlIiBpc24ndCBpbiBteQotCSBhc3NlbWJsZXIgbWFudWFsLCBidXQgbXkgY29weSBpcyBvbGQuICBUaGUgSFAgYXNzZW1ibGVyCi0JIGFjY2VwdHMgaXQsIGFuZCB0aGVyZSdzIGEgcGxhY2UgaW4gdGhlIHVud2luZCBkZXNjcmlwdG9yCi0JIHRvIGRyb3AgdGhlIGluZm9ybWF0aW9uLCBzbyB3ZSdsbCBhY2NlcHQgaXQgdG9vLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm1pbGxpY29kZSIsIDkpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IubWlsbGljb2RlID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJJbnZhbGlkIC5DQUxMSU5GTyBhcmd1bWVudDogJXMiKSwgbmFtZSk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFN3aXRjaCBpbnRvIHRoZSBjb2RlIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvZGUgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIGN1cnJlbnRfc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlICgiJFRFWFQkIik7Ci0gIGN1cnJlbnRfc3Vic3BhY2UKLSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGN1cnJlbnRfc3BhY2UtPnNkX3NlZywgMCk7Ci0jZW5kaWYKLSAgc190ZXh0ICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHN0YW5kYXJkIEdBUyBzX2NvbW0oKS4gT24gSFA5MDAwLzgwMCBtYWNoaW5lcywKLSAgIHRoZSAuY29tbSBwc2V1ZG8tb3AgaGFzIHRoZSBmb2xsb3dpbmcgc3ltdGF4OgotCi0gICA8bGFiZWw+IC5jb21tIDxsZW5ndGg+Ci0KLSAgIHdoZXJlIDxsYWJlbD4gaXMgb3B0aW9uYWwgYW5kIGlzIGEgc3ltYm9sIHdob3NlIGFkZHJlc3Mgd2lsbCBiZSB0aGUgc3RhcnQgb2YKLSAgIGEgYmxvY2sgb2YgbWVtb3J5IDxsZW5ndGg+IGJ5dGVzIGxvbmcuIDxsZW5ndGg+IG11c3QgYmUgYW4gYWJzb2x1dGUKLSAgIGV4cHJlc3Npb24uICA8bGVuZ3RoPiBieXRlcyB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGUgY3VycmVudCBzcGFjZQotICAgYW5kIHN1YnNwYWNlLgotCi0gICBBbHNvIG5vdGUgdGhlIGxhYmVsIG1heSBub3QgZXZlbiBiZSBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSAuY29tbS4KLQotICAgVGhpcyBkaWZmZXJlbmNlIGluIHN5bnRheCBtZWFucyB0aGUgY29sb24gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLSAgIG9uIHRoZSBzeW1ib2wgYmVmb3JlIHdlIGFycml2ZSBpbiBwYV9jb21tLiAgY29sb24gd2lsbCBzZXQgYSBudW1iZXIKLSAgIG9mIGF0dHJpYnV0ZXMgb2YgdGhlIHN5bWJvbCB0aGF0IG5lZWQgdG8gYmUgZml4ZWQgaGVyZS4gIEluIHBhcnRpY3VsYXIKLSAgIHRoZSB2YWx1ZSwgc2VjdGlvbiBwb2ludGVyLCBmcmFnbWVudCBwb2ludGVyLCBmbGFncywgZXRjLiAgV2hhdAotICAgYSBwYWluLgotCi0gICBUaGlzIGFsc28gbWFrZXMgZXJyb3IgZGV0ZWN0aW9uIGFsbCBidXQgaW1wb3NzaWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jb21tICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzeW1ib2xTICpzeW1ib2w7Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbCA9IHBhX2dldF9sYWJlbCAoKTsKLQotICBpZiAobGFiZWxfc3ltYm9sKQotICAgIHN5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotICBlbHNlCi0gICAgc3ltYm9sID0gTlVMTDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBpZiAoc3ltYm9sKQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2wsIHNpemUpOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sLCBiZmRfdW5kX3NlY3Rpb25fcHRyKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2wpOwotCi0gICAgICAvKiBjb2xvbigpIGhhcyBhbHJlYWR5IHNldCB0aGUgZnJhZyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUKLSAgICAgICAgIGN1cnJlbnQgc3Vic3BhY2U7IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGZyYWdtZW50IHRvIHRoZSB6ZXJvIGFkZHJlc3MKLSAgICAgICAgIGZyYWdtZW50LiAgV2UgYWxzbyBuZWVkIHRvIHJlc2V0IHRoZSBzZWdtZW50IHBvaW50ZXIuICAqLwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2wsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQcm9jZXNzIGEgLkVORCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZW5kICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgYSAuRU5URVIgcHNldWRvLW9wLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAgKi8KLXN0YXRpYyB2b2lkCi1wYV9lbnRlciAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBhc19iYWQgKF8oIlRoZSAuRU5URVIgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgYSAuRU5UUlkgcHNldWRvLW9wLiAgLkVOVFJZIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBwcm9jZXN1cmUuICAqLwotc3RhdGljIHZvaWQKLXBhX2VudHJ5ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIGlmICghd2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19iYWQgKF8oIk1pc3BsYWNlZCAuZW50cnkuIElnbm9yZWQuIikpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCFjYWxsaW5mb19mb3VuZCkKLQlhc19iYWQgKF8oIk1pc3NpbmcgLmNhbGxpbmZvLiIpKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHdpdGhpbl9lbnRyeV9leGl0ID0gVFJVRTsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogU09NIGRlZmVycyBidWlsZGluZyBvZiB1bndpbmQgZGVzY3JpcHRvcnMgdW50aWwgdGhlIGxpbmsgcGhhc2UuCi0gICAgIFRoZSBhc3NlbWJsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuIFJfRU5UUlkgcmVsb2NhdGlvbgotICAgICB0byBtYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSByZWdpb24gYW5kIGhvbGQgdGhlIHVud2luZCBiaXRzLCBhbmQKLSAgICAgZm9yIGNyZWF0aW5nIGFuIFJfRVhJVCByZWxvY2F0aW9uIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgcmVnaW9uLgotCi0gICAgIEZJWE1FLiAgRUxGIHNob3VsZCBiZSB1c2luZyB0aGUgc2FtZSBjb252ZW50aW9ucyEgIFRoZSBwcm9ibGVtCi0gICAgIGlzIGFuIHVud2luZCByZXF1aXJlcyB0b28gbXVjaCByZWxvY2F0aW9uIHNwYWNlLiAgSG1tbS4gIE1heWJlCi0gICAgIGlmIHdlIHNwbGl0IHRoZSB1bndpbmQgYml0cyB1cCBiZXR3ZWVuIHRoZSByZWxvY2F0aW9ucyB3aGljaAotICAgICBkZW5vdGUgdGhlIGVudHJ5IGFuZCBleGl0IHBvaW50cy4gICovCi0gIGlmIChsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0gICAgICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQkgICAgTlVMTCwgKG9mZnNldFQpIDAsIE5VTEwsCi0JCSAgICAwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKLQkJICAgIChpbnQgKikgJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvcik7Ci0gICAgfQotI2VuZGlmCi19Ci0KLS8qIEhhbmRsZSBhIC5FUVUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2VxdSAocmVnKQotICAgICBpbnQgcmVnOwotewotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICBpZiAobGFiZWxfc3ltYm9sKQotICAgIHsKLSAgICAgIHN5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotICAgICAgaWYgKHJlZykKLQlTX1NFVF9WQUxVRSAoc3ltYm9sLCBwYV9wYXJzZV9udW1iZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIsIDApKTsKLSAgICAgIGVsc2UKLQlTX1NFVF9WQUxVRSAoc3ltYm9sLCAodW5zaWduZWQgaW50KSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2wsIGJmZF9hYnNfc2VjdGlvbl9wdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChyZWcpCi0JYXNfYmFkIChfKCIuUkVHIG11c3QgdXNlIGEgbGFiZWwiKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCIuRVFVIG11c3QgdXNlIGEgbGFiZWwiKSk7Ci0gICAgfQotCi0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIZWxwZXIgZnVuY3Rpb24uICBEb2VzIHByb2Nlc3NpbmcgZm9yIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4gIFRoaXMKLSAgIHVzdWFsbHkgaW52b2x2ZXMgY3JlYXRpbmcgc29tZSByZWxvY2F0aW9ucyBvciBidWlsZGluZyBzcGVjaWFsCi0gICBzeW1ib2xzIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19leGl0ICgpCi17Ci0gIGNoYXIgKndoZXJlOwotCi0gIHdoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogTWFyayB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwgc3R1ZmYgYXdheSB0aGUgbG9jYXRpb24gb2YgdGhlIGZyYWcKLSAgICAgZm9yIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCBhbmQgZmluYWxseSBjYWxsIHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZQotICAgICB0byBhZGQgYW4gZW50cnkgaW4gdGhlIHVud2luZCB0YWJsZS4gICovCi0gIGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uICgpOwotICBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UgKGxhc3RfY2FsbF9pbmZvKTsKLSNlbHNlCi0gIC8qIFNPTSBkZWZlcnMgYnVpbGRpbmcgb2YgdW53aW5kIGRlc2NyaXB0b3JzIHVudGlsIHRoZSBsaW5rIHBoYXNlLgotICAgICBUaGUgYXNzZW1ibGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbiBSX0VOVFJZIHJlbG9jYXRpb24KLSAgICAgdG8gbWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgcmVnaW9uIGFuZCBob2xkIHRoZSB1bndpbmQgYml0cywgYW5kCi0gICAgIGZvciBjcmVhdGluZyBhbiBSX0VYSVQgcmVsb2NhdGlvbiB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbi4KLQotICAgICBGSVhNRS4gIEVMRiBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUgY29udmVudGlvbnMhICBUaGUgcHJvYmxlbQotICAgICBpcyBhbiB1bndpbmQgcmVxdWlyZXMgdG9vIG11Y2ggcmVsb2NhdGlvbiBzcGFjZS4gIEhtbW0uICBNYXliZQotICAgICBpZiB3ZSBzcGxpdCB0aGUgdW53aW5kIGJpdHMgdXAgYmV0d2VlbiB0aGUgcmVsb2NhdGlvbnMgd2hpY2gKLSAgICAgZGVub3RlIHRoZSBlbnRyeSBhbmQgZXhpdCBwb2ludHMuICAqLwotICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQlOVUxMLCAob2Zmc2V0VCkgMCwKLQkJTlVMTCwgMCwgUl9IUFBBX0VYSVQsIGVfZnNlbCwgMCwgMCwKLQkJKGludCAqKSAmbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yICsgMSk7Ci0jZW5kaWYKLX0KLQotLyogUHJvY2VzcyBhIC5FWElUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9leGl0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIGlmICghd2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19iYWQgKF8oIi5FWElUIG11c3QgYXBwZWFyIHdpdGhpbiBhIHByb2NlZHVyZSIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghY2FsbGluZm9fZm91bmQpCi0JYXNfYmFkIChfKCJNaXNzaW5nIC5jYWxsaW5mbyIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoIXdpdGhpbl9lbnRyeV9leGl0KQotCSAgICBhc19iYWQgKF8oIk5vIC5FTlRSWSBmb3IgdGhpcyAuRVhJVCIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdpdGhpbl9lbnRyeV9leGl0ID0gRkFMU0U7Ci0JICAgICAgcHJvY2Vzc19leGl0ICgpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyBhIC5FWFBPUlQgZGlyZWN0aXZlLiAgVGhpcyBtYWtlcyBmdW5jdGlvbnMgZXh0ZXJuYWwKLSAgIGFuZCBwcm92aWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIGFyZ3VtZW50IHJlbG9jYXRpb24gZW50cmllcwotICAgdG8gY2FsbGVycy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9leHBvcnQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIC8qIE1ha2Ugc3VyZSB0aGUgZ2l2ZW4gc3ltYm9sIGV4aXN0cy4gICovCi0gIGlmICgoc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgZGVmaW5lIGV4cG9ydCBzeW1ib2w6ICVzXG4iKSwgbmFtZSk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogT0suICBTZXQgdGhlIGV4dGVybmFsIGJpdHMgYW5kIHByb2Nlc3MgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbCk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgcGFfdHlwZV9hcmdzIChzeW1ib2wsIDEpOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGVscGVyIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYXJndW1lbnRzIHRvIGEgLkVYUE9SVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfdHlwZV9hcmdzIChzeW1ib2xQLCBpc19leHBvcnQpCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIGludCBpc19leHBvcnQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICB1bnNpZ25lZCBpbnQgdGVtcCwgYXJnX3JlbG9jOwotICBwYV9zeW1ib2xfdHlwZSB0eXBlID0gU1lNQk9MX1RZUEVfVU5LTk9XTjsKLSAgb2JqX3N5bWJvbF90eXBlICpzeW1ib2wgPSAob2JqX3N5bWJvbF90eXBlICopIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKTsKLQotICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImFic29sdXRlIiwgOCkgPT0gMCkKLQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA4OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2Fic19zZWN0aW9uX3B0cik7Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfQUJTT0xVVEU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiY29kZSIsIDQpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0gICAgICAvKiBJTVBPUlRpbmcvRVhQT1JUaW5nIENPREUgdHlwZXMgZm9yIGZ1bmN0aW9ucyBpcyBtZWFuaW5nbGVzcyBmb3IgU09NLAotICAgICAgICAgaW5zdGVhZCBvbmUgc2hvdWxkIGJlIElNUE9SVGluZy9FWFBPUlRpbmcgRU5UUlkgdHlwZXMuCi0KLSAgICAgICAgIENvbXBsYWluIGlmIG9uZSB0cmllcyB0byBFWFBPUlQgYSBDT0RFIHR5cGUgc2luY2UgdGhhdCdzIG5ldmVyCi0gICAgICAgICBkb25lLiAgQm90aCBHQ0MgYW5kIEhQIEMgc3RpbGwgdHJ5IHRvIElNUE9SVCBDT0RFIHR5cGVzLCBzbwotICAgICAgICAgc2lsZW50bHkgZml4IHRoZW0gdG8gYmUgRU5UUlkgdHlwZXMuICAqLwotICAgICAgaWYgKFNfSVNfRlVOQ1RJT04gKHN5bWJvbFApKQotCXsKLQkgIGlmIChpc19leHBvcnQpCi0JICAgIGFzX3Rza3RzayAoXygiVXNpbmcgRU5UUlkgcmF0aGVyIHRoYW4gQ09ERSBpbiBleHBvcnQgZGlyZWN0aXZlIGZvciAlcyIpLAotCQkgICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgIHR5cGUgPSBTWU1CT0xfVFlQRV9FTlRSWTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotCSAgdHlwZSA9IFNZTUJPTF9UWVBFX0NPREU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGEiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA0OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX0RBVEE7Ci0gICAgfQotICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImVudHJ5IiwgNSkgPT0gMCkpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9FTlRSWTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJtaWxsaWNvZGUiLCA5KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA5OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfTUlMTElDT0RFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInBsYWJlbCIsIDYpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfUExBQkVMOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInByaV9wcm9nIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gODsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX1BSSV9QUk9HOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNlY19wcm9nIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gODsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX1NFQ19QUk9HOwotICAgIH0KLQotICAvKiBTT00gcmVxdWlyZXMgbXVjaCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCB0eXBlcwotICAgICB0aGFuIEJGRCB1bmRlcnN0YW5kcy4gIFRoaXMgaXMgaG93IHdlIGdldCB0aGlzIGluZm9ybWF0aW9uCi0gICAgIHRvIHRoZSBTT00gQkZEIGJhY2tlbmQuICAqLwotI2lmZGVmIG9ial9zZXRfc3ltYm9sX3R5cGUKLSAgb2JqX3NldF9zeW1ib2xfdHlwZSAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLCAoaW50KSB0eXBlKTsKLSNlbmRpZgotCi0gIC8qIE5vdyB0aGF0IHRoZSB0eXBlIG9mIHRoZSBleHBvcnRlZCBzeW1ib2wgaGFzIGJlZW4gaGFuZGxlZCwKLSAgICAgaGFuZGxlIGFueSBhcmd1bWVudCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICAvKiBBcmd1bWVudCBzb3VyY2VzLiAgKi8KLSAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhcmd3IiwgNCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGF0b2kgKG5hbWUgKyA0KTsKLQkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBhcmdfcmVsb2MgPSBwYV9hbGlnbl9hcmdfcmVsb2MgKHRlbXAsIHBhX2J1aWxkX2FyZ19yZWxvYyAobmFtZSkpOwotI2lmZGVmIE9CSl9TT00KLQkgIHN5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyB8PSBhcmdfcmVsb2M7Ci0jZW5kaWYKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICAgIC8qIFRoZSByZXR1cm4gdmFsdWUuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicnRudmFsIiwgNikpID09IDApCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGFyZ19yZWxvYyA9IHBhX2J1aWxkX2FyZ19yZWxvYyAobmFtZSk7Ci0jaWZkZWYgT0JKX1NPTQotCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jIHw9IGFyZ19yZWxvYzsKLSNlbmRpZgotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgLyogUHJpdmVsZWdlIGxldmVsLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInByaXZfbGV2IiwgOCkpID09IDApCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGF0b2kgKGlucHV0X2xpbmVfcG9pbnRlcik7Ci0jaWZkZWYgT0JKX1NPTQotCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbCA9IHRlbXA7Ci0jZW5kaWYKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIlVuZGVmaW5lZCAuRVhQT1JULy5JTVBPUlQgYXJndW1lbnQgKGlnbm9yZWQpOiAlcyIpLCBuYW1lKTsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JfQotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLX0KLQotLyogSGFuZGxlIGFuIC5JTVBPUlQgcHNldWRvLW9wLiAgQW55IHN5bWJvbCByZWZlcmVuY2VkIGluIGEgZ2l2ZW4KLSAgIGFzc2VtYmx5IGZpbGUgbXVzdCBlaXRoZXIgYmUgZGVmaW5lZCBpbiB0aGUgYXNzZW1ibHkgZmlsZSwgb3IKLSAgIGV4cGxpY2l0bHkgSU1QT1JURUQgZnJvbSBhbm90aGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2ltcG9ydCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgc3ltYm9sUyAqc3ltYm9sOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzeW1ib2wgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gIC8qIFVnaC4gIFdlIG1pZ2h0IGJlIGltcG9ydGluZyBhIHN5bWJvbCBkZWZpbmVkIGVhcmxpZXIgaW4gdGhlIGZpbGUsCi0gICAgIGluIHdoaWNoIGNhc2UgYWxsIHRoZSBjb2RlIGJlbG93IHdpbGwgcmVhbGx5IHNjcmV3IHRoaW5ncyB1cAotICAgICAoc2V0IHRoZSB3cm9uZyBzZWdtZW50LCBzeW1ib2wgZmxhZ3MgJiB0eXBlLCBldGMpLiAgKi8KLSAgaWYgKHN5bWJvbCA9PSBOVUxMIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbCkpCi0gICAgewotICAgICAgc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotCi0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBwYV90eXBlX2FyZ3MgKHN5bWJvbCwgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFNpZ2guICBUbyBiZSBjb21wYXRhYmxlIHdpdGggdGhlIEhQIGFzc2VtYmxlciBhbmQgdG8gaGVscAotCSAgICAgcG9vcmx5IHdyaXR0ZW4gYXNzZW1ibHkgY29kZSwgd2UgYXNzaWduIGEgdHlwZSBiYXNlZCBvbgotCSAgICAgdGhlIHRoZSBjdXJyZW50IHNlZ21lbnQuICBOb3RlIG9ubHkgQlNGX0ZVTkNUSU9OIHJlYWxseQotCSAgICAgbWF0dGVycywgd2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBmdWxsIFNZTUJPTF9UWVBFXyogaW5mby4gICovCi0JICBpZiAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pCi0JICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2wpLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLQkgIC8qIElmIHRoZSBzZWN0aW9uIGlzIHVuZGVmaW5lZCwgdGhlbiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZAotCSAgICAgU2luY2UgdGhpcyBpcyBhbiBpbXBvcnQsIGxlYXZlIHRoZSBzZWN0aW9uIHVuZGVmaW5lZC4gICovCi0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2wsIGJmZF91bmRfc2VjdGlvbl9wdHIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIHdhcyBhbHJlYWR5IGRlZmluZWQuICBKdXN0IGVhdCBldmVyeXRoaW5nIHVwIHRvCi0JIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc3RhdGVtZW50LiAgKi8KLSAgICAgIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLkxBQkVMIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9sYWJlbCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKHN0cmxlbiAobmFtZSkgPiAwKQotICAgIHsKLSAgICAgIGNvbG9uIChuYW1lKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBsYWJlbCBuYW1lIG9uIC5MQUJFTCIpKTsKLSAgICB9Ci0KLSAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oImV4dHJhIC5MQUJFTCBhcmd1bWVudHMgaWdub3JlZC4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLkxFQVZFIHBzZXVkby1vcC4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbGVhdmUgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgYXNfYmFkIChfKCJUaGUgLkxFQVZFIHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuTEVWRUwgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xldmVsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKmxldmVsOwotCi0gIGxldmVsID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoc3RybmNtcCAobGV2ZWwsICIxLjAiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAxMCkpCi0JYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChsZXZlbCwgIjEuMSIsIDMpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDExKSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGxldmVsLCAiMi4wdyIsIDQpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0gICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDI1KSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGxldmVsLCAiMi4wIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgMjApKQotCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIC5MRVZFTCBhcmd1bWVudFxuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5PUklHSU4gcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX29yaWdpbiAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBzX29yZyAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBIYW5kbGUgYSAuUEFSQU0gcHNldWRvLW9wLiAgVGhpcyBpcyBtdWNoIGxpa2UgYSAuRVhQT1JULCBleGNlcHQgaXQKLSAgIGlzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgRklYTUUuICBTaG91bGQgc2hhcmUgbW9yZSBjb2RlIHdpdGggLkVYUE9SVC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9wYXJhbSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgc3ltYm9sUyAqc3ltYm9sOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoKHN5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IGRlZmluZSBzdGF0aWMgc3ltYm9sOiAlc1xuIiksIG5hbWUpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbCk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgcGFfdHlwZV9hcmdzIChzeW1ib2wsIDApOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLlBST0MgcHNldWRvLW9wLiAgSXQgaXMgdXNlZCB0byBtYXJrIHRoZSBiZWdpbm5pbmcKLSAgIG9mIGEgcHJvY2VkdXJlIGZyb20gYSBzeW50YXRpY2FsIHBvaW50IG9mIHZpZXcuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfcHJvYyAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm87Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgaWYgKHdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfZmF0YWwgKF8oIk5lc3RlZCBwcm9jZWR1cmVzIikpOwotCi0gIC8qIFJlc2V0IGdsb2JhbCB2YXJpYWJsZXMgZm9yIG5ldyBwcm9jZWR1cmUuICAqLwotICBjYWxsaW5mb19mb3VuZCA9IEZBTFNFOwotICB3aXRoaW5fcHJvY2VkdXJlID0gVFJVRTsKLQotICAvKiBDcmVhdGUgYW5vdGhlciBjYWxsX2luZm8gc3RydWN0dXJlLiAgKi8KLSAgY2FsbF9pbmZvID0gKHN0cnVjdCBjYWxsX2luZm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY2FsbF9pbmZvKSk7Ci0KLSAgaWYgKCFjYWxsX2luZm8pCi0gICAgYXNfZmF0YWwgKF8oIkNhbm5vdCBhbGxvY2F0ZSB1bndpbmQgZGVzY3JpcHRvclxuIikpOwotCi0gIG1lbXNldCAoY2FsbF9pbmZvLCAwLCBzaXplb2YgKHN0cnVjdCBjYWxsX2luZm8pKTsKLQotICBjYWxsX2luZm8tPmNpX25leHQgPSBOVUxMOwotCi0gIGlmIChjYWxsX2luZm9fcm9vdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNhbGxfaW5mb19yb290ID0gY2FsbF9pbmZvOwotICAgICAgbGFzdF9jYWxsX2luZm8gPSBjYWxsX2luZm87Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGFzdF9jYWxsX2luZm8tPmNpX25leHQgPSBjYWxsX2luZm87Ci0gICAgICBsYXN0X2NhbGxfaW5mbyA9IGNhbGxfaW5mbzsKLSAgICB9Ci0KLSAgLyogc2V0IHVwIGRlZmF1bHRzIG9uIGNhbGxfaW5mbyBzdHJ1Y3R1cmUgKi8KLQotICBjYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmNhbm5vdF91bndpbmQgPSAwOwotICBjYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLnJlZ2lvbl9kZXNjID0gMTsKLSAgY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5ocHV4X2ludGVycnVwdF9tYXJrZXIgPSAwOwotCi0gIC8qIElmIHdlIGdvdCBhIC5QUk9DIHBzZXVkby1vcCwgd2Uga25vdyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkCi0gICAgIGxvY2FsbHkuICBNYWtlIHN1cmUgaXQgZ2V0cyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICB7Ci0gICAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gICAgaWYgKGxhYmVsX3N5bWJvbCkKLSAgICAgIHsKLQlpZiAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpCi0JICB7Ci0JICAgIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKLQkgICAgc3ltYm9sX2dldF9iZmRzeW0gKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgfQotCWVsc2UKLQkgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID0gTlVMTDsKLSAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgdGhlIHN5bnRhdGljYWwgZW5kIG9mIGEgcHJvY2VkdXJlLiAgTWFrZSBzdXJlIGFsbCB0aGUKLSAgIGFwcHJvcHJpYXRlIHBzZXVkby1vcHMgd2VyZSBmb3VuZCB3aXRoaW4gdGhlIHByb2NlZHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9wcm9jZW5kICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgLyogSWYgd2UgYXJlIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLCBtYWtlIHN1cmUgd2UndmUKLSAgICAgZGVmaW5lZCBhIGxhYmVsIGZvciB0aGUgcHJvY2VkdXJlOyBoYW5kbGUgY2FzZSB3aGVyZSB0aGUKLSAgICAgbGFiZWwgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotICAgICBOb3RlIHRoZXJlJ3Mgbm90IG5lZWQgdG8gZGlkZGxlIHdpdGggdGhlIHNlZ21lbnQgb3IgZnJhZ21lbnQKLSAgICAgZm9yIHRoZSBsYWJlbCBzeW1ib2wgaW4gdGhpcyBjYXNlLiAgV2UgaGF2ZSBhbHJlYWR5IHN3aXRjaGVkCi0gICAgIGludG8gdGhlIG5ldyAkQ09ERSQgc3Vic3BhY2UgYXQgdGhpcyBwb2ludC4gICovCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlICYmIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgICAgIGlmIChsYWJlbF9zeW1ib2wpCi0JewotCSAgaWYgKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKQotCSAgICB7Ci0JICAgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotCSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCktPmZsYWdzCi0JCXw9IEJTRl9GVU5DVElPTjsKLSNpZmRlZiBPQkpfU09NCi0JICAgICAgLyogQWxzbyBoYW5kbGUgYWxsb2NhdGlvbiBvZiBhIGZpeHVwIHRvIGhvbGQgdGhlIHVud2luZAotCQkgaW5mb3JtYXRpb24gd2hlbiB0aGUgbGFiZWwgYXBwZWFycyBhZnRlciB0aGUgcHJvYy9wcm9jZW5kLiAgKi8KLQkgICAgICBpZiAod2l0aGluX2VudHJ5X2V4aXQpCi0JCXsKLQkJICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLQkJICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQkJCU5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAotCQkJCTAsIFJfSFBQQV9FTlRSWSwgZV9mc2VsLCAwLCAwLAotCQkJCShpbnQgKikgJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvcik7Ci0JCX0KLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIikpOwotICAgIH0KLQotICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfYmFkIChfKCJtaXNwbGFjZWQgLnByb2NlbmQiKSk7Ci0KLSAgaWYgKCFjYWxsaW5mb19mb3VuZCkKLSAgICBhc19iYWQgKF8oIk1pc3NpbmcgLmNhbGxpbmZvIGZvciB0aGlzIHByb2NlZHVyZSIpKTsKLQotICBpZiAod2l0aGluX2VudHJ5X2V4aXQpCi0gICAgYXNfYmFkIChfKCJNaXNzaW5nIC5FWElUIGZvciBhIC5FTlRSWSIpKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogRUxGIG5lZWRzIHRvIG1hcmsgdGhlIGVuZCBvZiBlYWNoIGZ1bmN0aW9uIHNvIHRoYXQgaXQgY2FuIGNvbXB1dGUKLSAgICAgdGhlIHNpemUgb2YgdGhlIGZ1bmN0aW9uIChhcHBhcmVudGx5IGl0cyBuZWVkZWQgaW4gdGhlIHN5bWJvbCB0YWJsZSkuICAqLwotICBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiAoKTsKLSNlbmRpZgotCi0gIHdpdGhpbl9wcm9jZWR1cmUgPSBGQUxTRTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIElmIFZBTFVFIGlzIGFuIGV4YWN0IHBvd2VyIG9mIHR3byBiZXR3ZWVuIHplcm8gYW5kIDJeMzEsIHRoZW4KLSAgIHJldHVybiBsb2cyIChWQUxVRSkuICBFbHNlIHJldHVybiAtMS4gICovCi0KLXN0YXRpYyBpbnQKLWxvZzIgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGludCBzaGlmdCA9IDA7Ci0KLSAgd2hpbGUgKCgxIDw8IHNoaWZ0KSAhPSB2YWx1ZSAmJiBzaGlmdCA8IDMyKQotICAgIHNoaWZ0Kys7Ci0KLSAgaWYgKHNoaWZ0ID49IDMyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZQotICAgIHJldHVybiBzaGlmdDsKLX0KLQotCi0jaWZkZWYgT0JKX1NPTQotLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCkKLXsKLSAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiTm90IGluIGEgc3BhY2UuXG4iKSk7Ci0KLSAgaWYgKGN1cnJlbnRfc3Vic3BhY2UgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiTm90IGluIGEgc3Vic3BhY2UuXG4iKSk7Ci19Ci0KLS8qIFBhcnNlIHRoZSBwYXJhbWV0ZXJzIHRvIGEgLlNQQUNFIGRpcmVjdGl2ZTsgaWYgQ1JFQVRFX0ZMQUcgaXMgbm9uemVybywKLSAgIHRoZW4gY3JlYXRlIGEgbmV3IHNwYWNlIGVudHJ5IHRvIGhvbGQgdGhlIGluZm9ybWF0aW9uIHNwZWNpZmllZAotICAgYnkgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIC5TUEFDRSBkaXJlY3RpdmUuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLXBhX3BhcnNlX3NwYWNlX3N0bXQgKHNwYWNlX25hbWUsIGNyZWF0ZV9mbGFnKQotICAgICBjaGFyICpzcGFjZV9uYW1lOwotICAgICBpbnQgY3JlYXRlX2ZsYWc7Ci17Ci0gIGNoYXIgKm5hbWUsICpwdGVtcCwgYzsKLSAgY2hhciBsb2FkYWJsZSwgZGVmaW5lZCwgcHJpdmF0ZSwgc29ydDsKLSAgaW50IHNwbnVtLCB0ZW1wOwotICBhc2VjdGlvbiAqc2VnID0gTlVMTDsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLQotICAvKiBsb2FkIGRlZmF1bHQgdmFsdWVzICovCi0gIHNwbnVtID0gMDsKLSAgc29ydCA9IDA7Ci0gIGxvYWRhYmxlID0gVFJVRTsKLSAgZGVmaW5lZCA9IFRSVUU7Ci0gIHByaXZhdGUgPSBGQUxTRTsKLSAgaWYgKHN0cmNtcCAoc3BhY2VfbmFtZSwgIiRURVhUJCIpID09IDApCi0gICAgewotICAgICAgc2VnID0gcGFfZGVmX3NwYWNlc1swXS5zZWdtZW50OwotICAgICAgZGVmaW5lZCA9IHBhX2RlZl9zcGFjZXNbMF0uZGVmaW5lZDsKLSAgICAgIHByaXZhdGUgPSBwYV9kZWZfc3BhY2VzWzBdLnByaXZhdGU7Ci0gICAgICBzb3J0ID0gcGFfZGVmX3NwYWNlc1swXS5zb3J0OwotICAgICAgc3BudW0gPSBwYV9kZWZfc3BhY2VzWzBdLnNwbnVtOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChzcGFjZV9uYW1lLCAiJFBSSVZBVEUkIikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWcgPSBwYV9kZWZfc3BhY2VzWzFdLnNlZ21lbnQ7Ci0gICAgICBkZWZpbmVkID0gcGFfZGVmX3NwYWNlc1sxXS5kZWZpbmVkOwotICAgICAgcHJpdmF0ZSA9IHBhX2RlZl9zcGFjZXNbMV0ucHJpdmF0ZTsKLSAgICAgIHNvcnQgPSBwYV9kZWZfc3BhY2VzWzFdLnNvcnQ7Ci0gICAgICBzcG51bSA9IHBhX2RlZl9zcGFjZXNbMV0uc3BudW07Ci0gICAgfQotCi0gIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBwcmludF9lcnJvcnMgPSBGQUxTRTsKLSAgICAgIHB0ZW1wID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLSAgICAgIC8qIEZpcnN0IHNlZSBpZiB0aGUgc3BhY2Ugd2FzIHNwZWNpZmllZCBhcyBhIG51bWJlciByYXRoZXIgdGhhbgotICAgICAgICAgYXMgYSBuYW1lLiAgQWNjb3JkaW5nIHRvIHRoZSBQQSBhc3NlbWJseSBtYW51YWwgdGhlIHJlc3Qgb2YKLSAgICAgICAgIHRoZSBsaW5lIHNob3VsZCBiZSBpZ25vcmVkLiAgKi8KLSAgICAgIHRlbXAgPSBwYV9wYXJzZV9udW1iZXIgKCZwdGVtcCwgMCk7Ci0gICAgICBpZiAodGVtcCA+PSAwKQotCXsKLQkgIHNwbnVtID0gdGVtcDsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHB0ZW1wOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAic3BudW0iLCA1KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHNwbnVtID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzb3J0IiwgNCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBzb3J0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJ1bmxvYWRhYmxlIiwgMTApID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgbG9hZGFibGUgPSBGQUxTRTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm5vdGRlZmluZWQiLCAxMCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBkZWZpbmVkID0gRkFMU0U7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJwcml2YXRlIiwgNykgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBwcml2YXRlID0gVFJVRTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZCAoXygiSW52YWxpZCAuU1BBQ0UgYXJndW1lbnQiKSk7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCQkgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHByaW50X2Vycm9ycyA9IFRSVUU7Ci0gICAgfQotCi0gIGlmIChjcmVhdGVfZmxhZyAmJiBzZWcgPT0gTlVMTCkKLSAgICBzZWcgPSBzdWJzZWdfbmV3IChzcGFjZV9uYW1lLCAwKTsKLQotICAvKiBJZiBjcmVhdGVfZmxhZyBpcyBub256ZXJvLCB0aGVuIGNyZWF0ZSB0aGUgbmV3IHNwYWNlIHdpdGgKLSAgICAgdGhlIGF0dHJpYnV0ZXMgY29tcHV0ZWQgYWJvdmUuICBFbHNlIHNldCB0aGUgdmFsdWVzIGluCi0gICAgIGFuIGFscmVhZHkgZXhpc3Rpbmcgc3BhY2UgLS0gdGhpcyBjYW4gb25seSBoYXBwZW4gZm9yCi0gICAgIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgYSBidWlsdC1pbiBzcGFjZS4gICovCi0gIGlmIChjcmVhdGVfZmxhZykKLSAgICBzcGFjZSA9IGNyZWF0ZV9uZXdfc3BhY2UgKHNwYWNlX25hbWUsIHNwbnVtLCBsb2FkYWJsZSwgZGVmaW5lZCwKLQkJCSAgICAgIHByaXZhdGUsIHNvcnQsIHNlZywgMSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKHNwYWNlX25hbWUpOwotICAgICAgU1BBQ0VfU1BOVU0gKHNwYWNlKSA9IHNwbnVtOwotICAgICAgU1BBQ0VfREVGSU5FRCAoc3BhY2UpID0gZGVmaW5lZCAmIDE7Ci0gICAgICBTUEFDRV9VU0VSX0RFRklORUQgKHNwYWNlKSA9IDE7Ci0gICAgfQotCi0jaWZkZWYgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMKLSAgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNlZywgZGVmaW5lZCwgcHJpdmF0ZSwgc29ydCwgc3BudW0pOwotI2VuZGlmCi0KLSAgcmV0dXJuIHNwYWNlOwotfQotCi0vKiBIYW5kbGUgYSAuU1BBQ0UgcHNldWRvLW9wOyB0aGlzIHN3aXRjaGVzIHRoZSBjdXJyZW50IHNwYWNlIHRvIHRoZQotICAgZ2l2ZW4gc3BhY2UsIGNyZWF0aW5nIHRoZSBuZXcgc3BhY2UgaWYgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3NwYWNlICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpzcGFjZV9uYW1lLCAqc2F2ZV9zOwotICBpbnQgdGVtcDsKLSAgc2RfY2hhaW5fc3RydWN0ICpzZF9jaGFpbjsKLQotICBpZiAod2l0aGluX3Byb2NlZHVyZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNhblwndCBjaGFuZ2Ugc3BhY2VzIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLiBJZ25vcmVkIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBDaGVjayBmb3Igc29tZSBvZiB0aGUgcHJlZGVmaW5lZCBzcGFjZXMuICAgRklYTUU6IG1vc3Qgb2YgdGhlIGNvZGUKLSAgICAgICAgIGJlbG93IGlzIHJlcGVhdGVkIHNldmVyYWwgdGltZXMsIGNhbiB3ZSBleHRyYWN0IHRoZSBjb21tb24gcGFydHMKLSAgICAgICAgIGFuZCBwbGFjZSB0aGVtIGludG8gYSBzdWJyb3V0aW5lIG9yIHNvbWV0aGluZyBzaW1pbGFyPyAgKi8KLSAgICAgIC8qIEZJWE1FIElzIHRoaXMgKGFuZCB0aGUgbmV4dCBJRiBzdG10KSByZWFsbHkgcmlnaHQ/Ci0JIFdoYXQgaWYgSU5QVVRfTElORV9QT0lOVEVSIHBvaW50cyB0byAiJFRFWFQkRk9PIj8gICovCi0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiJFRFWFQkIiwgNikgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLQkgIHNkX2NoYWluID0gaXNfZGVmaW5lZF9zcGFjZSAoIiRURVhUJCIpOwotCSAgaWYgKHNkX2NoYWluID09IE5VTEwpCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRURVhUJCIsIDEpOwotCSAgZWxzZSBpZiAoU1BBQ0VfVVNFUl9ERUZJTkVEIChzZF9jaGFpbikgPT0gMCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10ICgiJFRFWFQkIiwgMCk7Ci0KLQkgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQkgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIGN1cnJlbnRfc3Vic3BhY2UKLQkgICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlICh0ZXh0X3NlY3Rpb24sCi0JCQkJCSBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiJFBSSVZBVEUkIiwgOSkgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gOTsKLQkgIHNkX2NoYWluID0gaXNfZGVmaW5lZF9zcGFjZSAoIiRQUklWQVRFJCIpOwotCSAgaWYgKHNkX2NoYWluID09IE5VTEwpCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRQUklWQVRFJCIsIDEpOwotCSAgZWxzZSBpZiAoU1BBQ0VfVVNFUl9ERUZJTkVEIChzZF9jaGFpbikgPT0gMCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10ICgiJFBSSVZBVEUkIiwgMCk7Ci0KLQkgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQkgIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIGN1cnJlbnRfc3Vic3BhY2UKLQkgICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChkYXRhX3NlY3Rpb24sCi0JCQkJCSBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoIXN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsCi0JCQlHREJfREVCVUdfU1BBQ0VfTkFNRSwKLQkJCXN0cmxlbiAoR0RCX0RFQlVHX1NQQUNFX05BTUUpKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc3RybGVuIChHREJfREVCVUdfU1BBQ0VfTkFNRSk7Ci0JICBzZF9jaGFpbiA9IGlzX2RlZmluZWRfc3BhY2UgKEdEQl9ERUJVR19TUEFDRV9OQU1FKTsKLQkgIGlmIChzZF9jaGFpbiA9PSBOVUxMKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKEdEQl9ERUJVR19TUEFDRV9OQU1FLCAxKTsKLQkgIGVsc2UgaWYgKFNQQUNFX1VTRVJfREVGSU5FRCAoc2RfY2hhaW4pID09IDApCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoR0RCX0RFQlVHX1NQQUNFX05BTUUsIDApOwotCi0JICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0KLQkgIHsKLQkgICAgYXNlY3Rpb24gKmdkYl9zZWN0aW9uCi0JICAgID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIEdEQl9ERUJVR19TUEFDRV9OQU1FKTsKLQotCSAgICBzdWJzZWdfc2V0IChnZGJfc2VjdGlvbiwgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgICAgY3VycmVudF9zdWJzcGFjZQotCSAgICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoZ2RiX3NlY3Rpb24sCi0JCQkJCSAgIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICB9Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogSXQgY291bGQgYmUgYSBzcGFjZSBzcGVjaWZpZWQgYnkgbnVtYmVyLiAgKi8KLSAgICAgIHByaW50X2Vycm9ycyA9IDA7Ci0gICAgICBzYXZlX3MgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoKHRlbXAgPSBwYV9wYXJzZV9udW1iZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIsIDApKSA+PSAwKQotCXsKLQkgIGlmICgoc2RfY2hhaW4gPSBwYV9maW5kX3NwYWNlX2J5X251bWJlciAodGVtcCkpKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCi0JICAgICAgc3Vic2VnX3NldCAoc2RfY2hhaW4tPnNkX3NlZywgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgICAgICBjdXJyZW50X3N1YnNwYWNlCi0JCT0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoc2RfY2hhaW4tPnNkX3NlZywKLQkJCQkJICAgICBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOb3QgYSBudW1iZXIsIGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHNwYWNlLiAgKi8KLSAgICAgIHByaW50X2Vycm9ycyA9IDE7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3M7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3BhY2VfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgICAgIHN0cmNweSAoc3BhY2VfbmFtZSwgbmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICAgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10IChzcGFjZV9uYW1lLCAxKTsKLSAgICAgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQotICAgICAgc3Vic2VnX3NldCAoc2RfY2hhaW4tPnNkX3NlZywgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLSAgICAgIGN1cnJlbnRfc3Vic3BhY2UgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChzZF9jaGFpbi0+c2Rfc2VnLAotCQkJCQkJICBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci19Ci0KLS8qIFN3aXRjaCB0byBhIG5ldyBzcGFjZS4gIChJIHRoaW5rKS4gIEZJWE1FLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3NwbnVtICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqcDsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHNwYWNlID0gaXNfZGVmaW5lZF9zcGFjZSAobmFtZSk7Ci0gIGlmIChzcGFjZSkKLSAgICB7Ci0gICAgICBwID0gZnJhZ19tb3JlICg0KTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgU1BBQ0VfU1BOVU0gKHNwYWNlKSwgNCk7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfd2FybiAoXygiVW5kZWZpbmVkIHNwYWNlOiAnJXMnIEFzc3VtaW5nIHNwYWNlIG51bWJlciA9IDAuIiksIG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuU1VCU1BBQ0UgcHNldWRvLW9wOyB0aGlzIHN3aXRjaGVzIHRoZSBjdXJyZW50IHN1YnNwYWNlIHRvIHRoZQotICAgZ2l2ZW4gc3Vic3BhY2UsIGNyZWF0aW5nIHRoZSBuZXcgc3Vic3BhY2UgaWYgbmVjZXNzYXJ5LgotCi0gICBGSVhNRS4gIFNob3VsZCBtaXJyb3IgcGFfc3BhY2UgbW9yZSBjbG9zZWx5LCBpbiBwYXJ0aWN1bGFyIGhvdwotICAgdGhleSdyZSBicm9rZW4gdXAgaW50byBzdWJyb3V0aW5lcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zdWJzcGFjZSAoY3JlYXRlX25ldykKLSAgICAgaW50IGNyZWF0ZV9uZXc7Ci17Ci0gIGNoYXIgKm5hbWUsICpzc19uYW1lLCBjOwotICBjaGFyIGxvYWRhYmxlLCBjb2RlX29ubHksIGNvbW1vbiwgZHVwX2NvbW1vbiwgemVybywgc29ydDsKLSAgaW50IGksIGFjY2Vzcywgc3BhY2VfaW5kZXgsIGFsaWdubWVudCwgcXVhZHJhbnQsIGFwcGxpY2FibGUsIGZsYWdzOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotICBzc2RfY2hhaW5fc3RydWN0ICpzc2Q7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGlmIChjdXJyZW50X3NwYWNlID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIk11c3QgYmUgaW4gYSBzcGFjZSBiZWZvcmUgY2hhbmdpbmcgb3IgZGVjbGFyaW5nIHN1YnNwYWNlcy5cbiIpKTsKLQotICBpZiAod2l0aGluX3Byb2NlZHVyZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNhblwndCBjaGFuZ2Ugc3Vic3BhY2VzIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLiBJZ25vcmVkIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3NfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgICAgIHN0cmNweSAoc3NfbmFtZSwgbmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICAgICAgLyogTG9hZCBkZWZhdWx0IHZhbHVlcy4gICovCi0gICAgICBzb3J0ID0gMDsKLSAgICAgIGFjY2VzcyA9IDB4N2Y7Ci0gICAgICBsb2FkYWJsZSA9IDE7Ci0gICAgICBjb21tb24gPSAwOwotICAgICAgZHVwX2NvbW1vbiA9IDA7Ci0gICAgICBjb2RlX29ubHkgPSAwOwotICAgICAgemVybyA9IDA7Ci0gICAgICBzcGFjZV9pbmRleCA9IH4wOwotICAgICAgYWxpZ25tZW50ID0gMTsKLSAgICAgIHF1YWRyYW50ID0gMDsKLQotICAgICAgc3BhY2UgPSBjdXJyZW50X3NwYWNlOwotICAgICAgaWYgKGNyZWF0ZV9uZXcpCi0Jc3NkID0gTlVMTDsKLSAgICAgIGVsc2UKLQlzc2QgPSBpc19kZWZpbmVkX3N1YnNwYWNlIChzc19uYW1lKTsKLSAgICAgIC8qIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGJ1aWx0aW4gYXR0cmlidXRlcyBvZiBzdWJzcGFjZXMuICBCdXQKLSAgICAgICAgIG9ubHkgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgY2hhbmdlZCBvbmNlISAgKi8KLSAgICAgIGlmIChzc2QgJiYgU1VCU1BBQ0VfREVGSU5FRCAoc3NkKSkKLQl7Ci0JICBzdWJzZWdfc2V0IChzc2QtPnNzZF9zZWcsIHNzZC0+c3NkX3N1YnNlZyk7Ci0JICBjdXJyZW50X3N1YnNwYWNlID0gc3NkOwotCSAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCSAgICBhc193YXJuIChfKCJQYXJhbWV0ZXJzIG9mIGFuIGV4aXN0aW5nIHN1YnNwYWNlIGNhblwndCBiZSBtb2RpZmllZCIpKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgbmV3IHN1YnNwYWNlLiAgTG9hZCBkZWZhdWx0IHZhbHVlcyBpZiBpdCBtYXRjaGVzIG9uZSBvZgotCSAgICAgdGhlIGJ1aWx0aW4gc3Vic3BhY2VzLiAgKi8KLQkgIGkgPSAwOwotCSAgd2hpbGUgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSkKLQkgICAgewotCSAgICAgIGlmIChzdHJjYXNlY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsIHNzX25hbWUpID09IDApCi0JCXsKLQkJICBsb2FkYWJsZSA9IHBhX2RlZl9zdWJzcGFjZXNbaV0ubG9hZGFibGU7Ci0JCSAgY29tbW9uID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5jb21tb247Ci0JCSAgZHVwX2NvbW1vbiA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uZHVwX2NvbW1vbjsKLQkJICBjb2RlX29ubHkgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvZGVfb25seTsKLQkJICB6ZXJvID0gcGFfZGVmX3N1YnNwYWNlc1tpXS56ZXJvOwotCQkgIHNwYWNlX2luZGV4ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5zcGFjZV9pbmRleDsKLQkJICBhbGlnbm1lbnQgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmFsaWdubWVudDsKLQkJICBxdWFkcmFudCA9IHBhX2RlZl9zdWJzcGFjZXNbaV0ucXVhZHJhbnQ7Ci0JCSAgYWNjZXNzID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5hY2Nlc3M7Ci0JCSAgc29ydCA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uc29ydDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGkrKzsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2Ugc2hvdWxkIGJlIHdvcmtpbmcgd2l0aCBhIG5ldyBzdWJzcGFjZSBub3cuICBGaWxsIGluCi0gICAgICAgICBhbnkgaW5mb3JtYXRpb24gYXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgKi8KLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQkgICAgewotCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJxdWFkIiwgNCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBxdWFkcmFudCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYWxpZ24iLCA1KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIGFsaWdubWVudCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQkgIGlmIChsb2cyIChhbGlnbm1lbnQpID09IC0xKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgMiIpKTsKLQkJICAgICAgYWxpZ25tZW50ID0gMTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImFjY2VzcyIsIDYpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgYWNjZXNzID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzb3J0IiwgNCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBzb3J0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJjb2RlX29ubHkiLCA5KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGNvZGVfb25seSA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJ1bmxvYWRhYmxlIiwgMTApID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgbG9hZGFibGUgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiY29tbW9uIiwgNikgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBjb21tb24gPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZHVwX2NvbW0iLCA4KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGR1cF9jb21tb24gPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiemVybyIsIDQpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgemVybyA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJmaXJzdCIsIDUpID09IDApKQotCQlhc19iYWQgKF8oIkZJUlNUIG5vdCBzdXBwb3J0ZWQgYXMgYSAuU1VCU1BBQ0UgYXJndW1lbnQiKSk7Ci0JICAgICAgZWxzZQotCQlhc19iYWQgKF8oIkludmFsaWQgLlNVQlNQQUNFIGFyZ3VtZW50IikpOwotCSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQkJaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIENvbXB1dGUgYSByZWFzb25hYmxlIHNldCBvZiBCRkQgZmxhZ3MgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uCi0gICAgICAgICBpbiB0aGUgLnN1YnNwYWNlIGRpcmVjdGl2ZS4gICovCi0gICAgICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLSAgICAgIGZsYWdzID0gMDsKLSAgICAgIGlmIChsb2FkYWJsZSkKLQlmbGFncyB8PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpOwotICAgICAgaWYgKGNvZGVfb25seSkKLQlmbGFncyB8PSBTRUNfQ09ERTsKLSAgICAgIGlmIChjb21tb24gfHwgZHVwX2NvbW1vbikKLQlmbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCi0gICAgICBmbGFncyB8PSBTRUNfUkVMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOwotCi0gICAgICAvKiBUaGlzIGlzIGEgemVyby1maWxsZWQgc3Vic3BhY2UgKGVnIEJTUykuICAqLwotICAgICAgaWYgKHplcm8pCi0JZmxhZ3MgJj0gfihTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotCi0gICAgICBhcHBsaWNhYmxlICY9IGZsYWdzOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIGV4aXN0aW5nIHN1YnNwYWNlLCB0aGVuIHdlIHdhbnQgdG8gdXNlIHRoZQotICAgICAgICAgc2VnbWVudCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic3BhY2UuCi0KLSAgICAgICAgIEZJWE1FIE5PVyEgIEVMRiBCRkQgZG9lc24ndCBhcHBlYXIgdG8gYmUgcmVhZHkgdG8gZGVhbCB3aXRoCi0gICAgICAgICBsb3RzIG9mIHNlY3Rpb25zLiAgSXQgbWlnaHQgYmUgYSBwcm9ibGVtIGluIHRoZSBQQSBFTEYKLSAgICAgICAgIGNvZGUsIEkgZG8gbm90IGtub3cgeWV0LiAgRm9yIG5vdyBhdm9pZCBjcmVhdGluZyBhbnl0aGluZwotICAgICAgICAgYnV0IHRoZSAic3RhbmRhcmQiIHNlY3Rpb25zIGZvciBFTEYuICAqLwotICAgICAgaWYgKGNyZWF0ZV9uZXcpCi0Jc2VjdGlvbiA9IHN1YnNlZ19mb3JjZV9uZXcgKHNzX25hbWUsIDApOwotICAgICAgZWxzZSBpZiAoc3NkKQotCXNlY3Rpb24gPSBzc2QtPnNzZF9zZWc7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbiA9IHN1YnNlZ19uZXcgKHNzX25hbWUsIDApOwotCi0gICAgICBpZiAoemVybykKLQlzZWdfaW5mbyAoc2VjdGlvbiktPmJzcyA9IDE7Ci0KLSAgICAgIC8qIE5vdyBzZXQgdGhlIGZsYWdzLiAgKi8KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWN0aW9uLCBhcHBsaWNhYmxlKTsKLQotICAgICAgLyogUmVjb3JkIGFueSBhbGlnbm1lbnQgcmVxdWVzdCBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHNlY3Rpb24sIGxvZzIgKGFsaWdubWVudCkpOwotCi0gICAgICAvKiBTZXQgdGhlIHN0YXJ0aW5nIG9mZnNldCBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgc2VjdGlvbiwKLQkJCSAgIHBhX3N1YnNwYWNlX3N0YXJ0IChzcGFjZSwgcXVhZHJhbnQpKTsKLQotICAgICAgLyogTm93IHRoYXQgYWxsIHRoZSBmbGFncyBhcmUgc2V0LCB1cGRhdGUgYW4gZXhpc3Rpbmcgc3Vic3BhY2UsCi0gICAgICAgICBvciBjcmVhdGUgYSBuZXcgb25lLiAgKi8KLSAgICAgIGlmIChzc2QpCi0KLQljdXJyZW50X3N1YnNwYWNlID0gdXBkYXRlX3N1YnNwYWNlIChzcGFjZSwgc3NfbmFtZSwgbG9hZGFibGUsCi0JCQkJCSAgICBjb2RlX29ubHksIGNvbW1vbiwgZHVwX2NvbW1vbiwKLQkJCQkJICAgIHNvcnQsIHplcm8sIGFjY2Vzcywgc3BhY2VfaW5kZXgsCi0JCQkJCSAgICBhbGlnbm1lbnQsIHF1YWRyYW50LAotCQkJCQkgICAgc2VjdGlvbik7Ci0gICAgICBlbHNlCi0JY3VycmVudF9zdWJzcGFjZSA9IGNyZWF0ZV9uZXdfc3Vic3BhY2UgKHNwYWNlLCBzc19uYW1lLCBsb2FkYWJsZSwKLQkJCQkJCWNvZGVfb25seSwgY29tbW9uLAotCQkJCQkJZHVwX2NvbW1vbiwgemVybywgc29ydCwKLQkJCQkJCWFjY2Vzcywgc3BhY2VfaW5kZXgsCi0JCQkJCSAgICAgIGFsaWdubWVudCwgcXVhZHJhbnQsIHNlY3Rpb24pOwotCi0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgY3VycmVudF9zdWJzcGFjZS0+c3NkX3NlZyA9IHNlY3Rpb247Ci0gICAgICBzdWJzZWdfc2V0IChjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc2VnLCBjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc3Vic2VnKTsKLSAgICB9Ci0gIFNVQlNQQUNFX0RFRklORUQgKGN1cnJlbnRfc3Vic3BhY2UpID0gMTsKLX0KLQotCi0vKiBDcmVhdGUgZGVmYXVsdCBzcGFjZSBhbmQgc3Vic3BhY2UgZGljdGlvbmFyaWVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3NwYWNlc19iZWdpbiAoKQotewotICBpbnQgaTsKLQotICBzcGFjZV9kaWN0X3Jvb3QgPSBOVUxMOwotICBzcGFjZV9kaWN0X2xhc3QgPSBOVUxMOwotCi0gIGkgPSAwOwotICB3aGlsZSAocGFfZGVmX3NwYWNlc1tpXS5uYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIFBpY2sgdGhlIHJpZ2h0IG5hbWUgdG8gdXNlIGZvciB0aGUgbmV3IHNlY3Rpb24uICAqLwotICAgICAgbmFtZSA9IHBhX2RlZl9zcGFjZXNbaV0ubmFtZTsKLQotICAgICAgcGFfZGVmX3NwYWNlc1tpXS5zZWdtZW50ID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0gICAgICBjcmVhdGVfbmV3X3NwYWNlIChwYV9kZWZfc3BhY2VzW2ldLm5hbWUsIHBhX2RlZl9zcGFjZXNbaV0uc3BudW0sCi0JCQlwYV9kZWZfc3BhY2VzW2ldLmxvYWRhYmxlLCBwYV9kZWZfc3BhY2VzW2ldLmRlZmluZWQsCi0JCQlwYV9kZWZfc3BhY2VzW2ldLnByaXZhdGUsIHBhX2RlZl9zcGFjZXNbaV0uc29ydCwKLQkJCXBhX2RlZl9zcGFjZXNbaV0uc2VnbWVudCwgMCk7Ci0gICAgICBpKys7Ci0gICAgfQotCi0gIGkgPSAwOwotICB3aGlsZSAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBpbnQgYXBwbGljYWJsZSwgc3Vic2VnbWVudDsKLSAgICAgIGFzZWN0aW9uICpzZWdtZW50ID0gTlVMTDsKLSAgICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0KLSAgICAgIC8qIFBpY2sgdGhlIHJpZ2h0IG5hbWUgZm9yIHRoZSBuZXcgc2VjdGlvbiBhbmQgcGljayB0aGUgcmlnaHQKLSAgICAgICAgIHN1YnNlZ21lbnQgbnVtYmVyLiAgKi8KLSAgICAgIG5hbWUgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWU7Ci0gICAgICBzdWJzZWdtZW50ID0gMDsKLQotICAgICAgLyogQ3JlYXRlIHRoZSBuZXcgc2VjdGlvbi4gICovCi0gICAgICBzZWdtZW50ID0gc3Vic2VnX25ldyAobmFtZSwgc3Vic2VnbWVudCk7Ci0KLQotICAgICAgLyogRm9yIFNPTSB3ZSB3YW50IHRvIHJlcGxhY2UgdGhlIHN0YW5kYXJkIC50ZXh0LCAuZGF0YSwgYW5kIC5ic3MKLSAgICAgICAgIHNlY3Rpb25zIHdpdGggb3VyIG93bi4gICBXZSBhbHNvIHdhbnQgdG8gc2V0IEJGRCBmbGFncyBmb3IKLQkgYWxsIHRoZSBidWlsdC1pbiBzdWJzcGFjZXMuICAqLwotICAgICAgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRDT0RFJCIpKQotCXsKLQkgIHRleHRfc2VjdGlvbiA9IHNlZ21lbnQ7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICAgICB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFCi0JCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJERBVEEkIikpCi0JewotCSAgZGF0YV9zZWN0aW9uID0gc2VnbWVudDsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQotCi0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJEJTUyQiKSkKLQl7Ci0JICBic3Nfc2VjdGlvbiA9IHNlZ21lbnQ7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgU0VDX0FMTE9DKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkTElUJCIpKQotCXsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJE1JTExJQ09ERSQiKSkKLQl7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICAgICB8IFNFQ19SRUxPQwotCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRVTldJTkQkIikpCi0JewotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgICAgfCBTRUNfUkVMT0MKLQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQl9Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNwYWNlLiAgKi8KLSAgICAgIHNwYWNlID0gcGFfc2VnbWVudF90b19zcGFjZSAocGFfZGVmX3NwYWNlc1twYV9kZWZfc3Vic3BhY2VzW2ldLgotCQkJCQkJIGRlZl9zcGFjZV9pbmRleF0uc2VnbWVudCk7Ci0gICAgICBpZiAoc3BhY2UgPT0gTlVMTCkKLQl7Ci0JICBhc19mYXRhbCAoXygiSW50ZXJuYWwgZXJyb3I6IFVuYWJsZSB0byBmaW5kIGNvbnRhaW5pbmcgc3BhY2UgZm9yICVzLiIpLAotCQkgICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lKTsKLQl9Ci0KLSAgICAgIGNyZWF0ZV9uZXdfc3Vic3BhY2UgKHNwYWNlLCBuYW1lLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5sb2FkYWJsZSwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uY29kZV9vbmx5LAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5jb21tb24sCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmR1cF9jb21tb24sCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnplcm8sCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnNvcnQsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmFjY2VzcywKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uc3BhY2VfaW5kZXgsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmFsaWdubWVudCwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0ucXVhZHJhbnQsCi0JCQkgICBzZWdtZW50KTsKLSAgICAgIGkrKzsKLSAgICB9Ci19Ci0KLQotCi0vKiBDcmVhdGUgYSBuZXcgc3BhY2UgTkFNRSwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYXMgZGVmaW5lZAotICAgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLWNyZWF0ZV9uZXdfc3BhY2UgKG5hbWUsIHNwbnVtLCBsb2FkYWJsZSwgZGVmaW5lZCwgcHJpdmF0ZSwKLQkJICBzb3J0LCBzZWcsIHVzZXJfZGVmaW5lZCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IHNwbnVtOwotICAgICBpbnQgbG9hZGFibGU7Ci0gICAgIGludCBkZWZpbmVkOwotICAgICBpbnQgcHJpdmF0ZTsKLSAgICAgaW50IHNvcnQ7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGludCB1c2VyX2RlZmluZWQ7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqY2hhaW5fZW50cnk7Ci0KLSAgY2hhaW5fZW50cnkgPSAoc2RfY2hhaW5fc3RydWN0ICopIHhtYWxsb2MgKHNpemVvZiAoc2RfY2hhaW5fc3RydWN0KSk7Ci0gIGlmICghY2hhaW5fZW50cnkpCi0gICAgYXNfZmF0YWwgKF8oIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iKSwKLQkgICAgICBuYW1lKTsKLQotICBTUEFDRV9OQU1FIChjaGFpbl9lbnRyeSkgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIHN0cmNweSAoU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpLCBuYW1lKTsKLSAgU1BBQ0VfREVGSU5FRCAoY2hhaW5fZW50cnkpID0gZGVmaW5lZDsKLSAgU1BBQ0VfVVNFUl9ERUZJTkVEIChjaGFpbl9lbnRyeSkgPSB1c2VyX2RlZmluZWQ7Ci0gIFNQQUNFX1NQTlVNIChjaGFpbl9lbnRyeSkgPSBzcG51bTsKLQotICBjaGFpbl9lbnRyeS0+c2Rfc2VnID0gc2VnOwotICBjaGFpbl9lbnRyeS0+c2RfbGFzdF9zdWJzZWcgPSAtMTsKLSAgY2hhaW5fZW50cnktPnNkX3N1YnNwYWNlcyA9IE5VTEw7Ci0gIGNoYWluX2VudHJ5LT5zZF9uZXh0ID0gTlVMTDsKLQotICAvKiBGaW5kIHNwb3QgZm9yIHRoZSBuZXcgc3BhY2UgYmFzZWQgb24gaXRzIHNvcnQga2V5LiAgKi8KLSAgaWYgKCFzcGFjZV9kaWN0X2xhc3QpCi0gICAgc3BhY2VfZGljdF9sYXN0ID0gY2hhaW5fZW50cnk7Ci0KLSAgaWYgKHNwYWNlX2RpY3Rfcm9vdCA9PSBOVUxMKQotICAgIHNwYWNlX2RpY3Rfcm9vdCA9IGNoYWluX2VudHJ5OwotICBlbHNlCi0gICAgewotICAgICAgc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9wb2ludGVyOwotICAgICAgc2RfY2hhaW5fc3RydWN0ICpwcmV2X2NoYWluX3BvaW50ZXI7Ci0KLSAgICAgIGNoYWluX3BvaW50ZXIgPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICBwcmV2X2NoYWluX3BvaW50ZXIgPSBOVUxMOwotCi0gICAgICB3aGlsZSAoY2hhaW5fcG9pbnRlcikKLQl7Ci0JICBwcmV2X2NoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyOwotCSAgY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXItPnNkX25leHQ7Ci0JfQotCi0gICAgICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGZvdW5kIHRoZSBjb3JyZWN0IHBsYWNlIHRvIGFkZCB0aGUgbmV3Ci0gICAgICAgICBlbnRyeS4gIFNvIGFkZCBpdCBhbmQgdXBkYXRlIHRoZSBsaW5rZWQgbGlzdHMgYXMgYXBwcm9wcmlhdGUuICAqLwotICAgICAgaWYgKHByZXZfY2hhaW5fcG9pbnRlcikKLQl7Ci0JICBjaGFpbl9lbnRyeS0+c2RfbmV4dCA9IGNoYWluX3BvaW50ZXI7Ci0JICBwcmV2X2NoYWluX3BvaW50ZXItPnNkX25leHQgPSBjaGFpbl9lbnRyeTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3BhY2VfZGljdF9yb290ID0gY2hhaW5fZW50cnk7Ci0JICBjaGFpbl9lbnRyeS0+c2RfbmV4dCA9IGNoYWluX3BvaW50ZXI7Ci0JfQotCi0gICAgICBpZiAoY2hhaW5fZW50cnktPnNkX25leHQgPT0gTlVMTCkKLQlzcGFjZV9kaWN0X2xhc3QgPSBjaGFpbl9lbnRyeTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBoZXJlIHRvIGNhdGNoIHByZWRlZmluZWQgc3BhY2VzIHdoaWNoIGRvIG5vdCBnZXQKLSAgICAgbW9kaWZpZWQgYnkgdGhlIHVzZXIncyBpbnB1dC4gIEFub3RoZXIgY2FsbCBpcyBmb3VuZCBhdAotICAgICB0aGUgYm90dG9tIG9mIHBhX3BhcnNlX3NwYWNlX3N0bXQgdG8gaGFuZGxlIGNhc2VzIHdoZXJlCi0gICAgIHRoZSB1c2VyIG1vZGlmaWVzIGEgcHJlZGVmaW5lZCBzcGFjZS4gICovCi0jaWZkZWYgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMKLSAgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNlZywgZGVmaW5lZCwgcHJpdmF0ZSwgc29ydCwgc3BudW0pOwotI2VuZGlmCi0KLSAgcmV0dXJuIGNoYWluX2VudHJ5OwotfQotCi0vKiBDcmVhdGUgYSBuZXcgc3Vic3BhY2UgTkFNRSwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYXMgZGVmaW5lZAotICAgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0KLSAgIEFkZCB0aGUgbmV3IHN1YnNwYWNlIHRvIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5IGNoYWluIGluIG51bWVyaWNhbAotICAgb3JkZXIgYXMgZGVmaW5lZCBieSB0aGUgU09SVCBlbnRyaWVzLiAgKi8KLQotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKgotY3JlYXRlX25ld19zdWJzcGFjZSAoc3BhY2UsIG5hbWUsIGxvYWRhYmxlLCBjb2RlX29ubHksIGNvbW1vbiwKLQkJICAgICBkdXBfY29tbW9uLCBpc196ZXJvLCBzb3J0LCBhY2Nlc3MsIHNwYWNlX2luZGV4LAotCQkgICAgIGFsaWdubWVudCwgcXVhZHJhbnQsIHNlZykKLSAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGxvYWRhYmxlLCBjb2RlX29ubHksIGNvbW1vbiwgZHVwX2NvbW1vbiwgaXNfemVybzsKLSAgICAgaW50IHNvcnQ7Ci0gICAgIGludCBhY2Nlc3M7Ci0gICAgIGludCBzcGFjZV9pbmRleDsKLSAgICAgaW50IGFsaWdubWVudDsKLSAgICAgaW50IHF1YWRyYW50OwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBzc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9lbnRyeTsKLQotICBjaGFpbl9lbnRyeSA9IChzc2RfY2hhaW5fc3RydWN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3NkX2NoYWluX3N0cnVjdCkpOwotICBpZiAoIWNoYWluX2VudHJ5KQotICAgIGFzX2ZhdGFsIChfKCJPdXQgb2YgbWVtb3J5OiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IHN1YnNwYWNlIGNoYWluIGVudHJ5OiAlc1xuIiksIG5hbWUpOwotCi0gIFNVQlNQQUNFX05BTUUgKGNoYWluX2VudHJ5KSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgc3RyY3B5IChTVUJTUEFDRV9OQU1FIChjaGFpbl9lbnRyeSksIG5hbWUpOwotCi0gIC8qIEluaXRpYWxpemUgc3Vic3BhY2VfZGVmaW5lZC4gIFdoZW4gd2UgaGl0IGEgLnN1YnNwYWNlIGRpcmVjdGl2ZQotICAgICB3ZSdsbCBzZXQgaXQgdG8gMSB3aGljaCAibG9ja3MtaW4iIHRoZSBzdWJzcGFjZSBhdHRyaWJ1dGVzLiAgKi8KLSAgU1VCU1BBQ0VfREVGSU5FRCAoY2hhaW5fZW50cnkpID0gMDsKLQotICBjaGFpbl9lbnRyeS0+c3NkX3N1YnNlZyA9IDA7Ci0gIGNoYWluX2VudHJ5LT5zc2Rfc2VnID0gc2VnOwotICBjaGFpbl9lbnRyeS0+c3NkX25leHQgPSBOVUxMOwotCi0gIC8qIEZpbmQgc3BvdCBmb3IgdGhlIG5ldyBzdWJzcGFjZSBiYXNlZCBvbiBpdHMgc29ydCBrZXkuICAqLwotICBpZiAoc3BhY2UtPnNkX3N1YnNwYWNlcyA9PSBOVUxMKQotICAgIHNwYWNlLT5zZF9zdWJzcGFjZXMgPSBjaGFpbl9lbnRyeTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX3BvaW50ZXI7Ci0gICAgICBzc2RfY2hhaW5fc3RydWN0ICpwcmV2X2NoYWluX3BvaW50ZXI7Ci0KLSAgICAgIGNoYWluX3BvaW50ZXIgPSBzcGFjZS0+c2Rfc3Vic3BhY2VzOwotICAgICAgcHJldl9jaGFpbl9wb2ludGVyID0gTlVMTDsKLQotICAgICAgd2hpbGUgKGNoYWluX3BvaW50ZXIpCi0JewotCSAgcHJldl9jaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlcjsKLQkgIGNoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyLT5zc2RfbmV4dDsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBoYXZlIHNvbWV3aGVyZSB0byBwdXQgdGhlIG5ldyBlbnRyeS4gIEluc2VydCBpdCBhbmQgdXBkYXRlCi0gICAgICAgICB0aGUgbGlua3MuICAqLwotICAgICAgaWYgKHByZXZfY2hhaW5fcG9pbnRlcikKLQl7Ci0JICBjaGFpbl9lbnRyeS0+c3NkX25leHQgPSBjaGFpbl9wb2ludGVyOwotCSAgcHJldl9jaGFpbl9wb2ludGVyLT5zc2RfbmV4dCA9IGNoYWluX2VudHJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzcGFjZS0+c2Rfc3Vic3BhY2VzID0gY2hhaW5fZW50cnk7Ci0JICBjaGFpbl9lbnRyeS0+c3NkX25leHQgPSBjaGFpbl9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSNpZmRlZiBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcwotICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBzcGFjZS0+c2Rfc2VnLCBhY2Nlc3MsCi0JCQkJIHNvcnQsIHF1YWRyYW50KTsKLSNlbmRpZgotCi0gIHJldHVybiBjaGFpbl9lbnRyeTsKLX0KLQotLyogVXBkYXRlIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHN1YnNwYWNlIGJhc2VkIHVwb24gdGhlCi0gICB2YXJpb3VzIGFyZ3VtZW50cy4gICBSZXR1cm4gdGhlIG1vZGlmaWVkIHN1YnNwYWNlIGNoYWluIGVudHJ5LiAgKi8KLQotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKgotdXBkYXRlX3N1YnNwYWNlIChzcGFjZSwgbmFtZSwgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLCBzb3J0LAotCQkgemVybywgYWNjZXNzLCBzcGFjZV9pbmRleCwgYWxpZ25tZW50LCBxdWFkcmFudCwgc2VjdGlvbikKLSAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGxvYWRhYmxlOwotICAgICBpbnQgY29kZV9vbmx5OwotICAgICBpbnQgY29tbW9uOwotICAgICBpbnQgZHVwX2NvbW1vbjsKLSAgICAgaW50IHplcm87Ci0gICAgIGludCBzb3J0OwotICAgICBpbnQgYWNjZXNzOwotICAgICBpbnQgc3BhY2VfaW5kZXg7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0gICAgIGludCBxdWFkcmFudDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX2VudHJ5OwotCi0gIGNoYWluX2VudHJ5ID0gaXNfZGVmaW5lZF9zdWJzcGFjZSAobmFtZSk7Ci0KLSNpZmRlZiBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcwotICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VjdGlvbiwgc3BhY2UtPnNkX3NlZywgYWNjZXNzLAotCQkJCSBzb3J0LCBxdWFkcmFudCk7Ci0jZW5kaWYKLQotICByZXR1cm4gY2hhaW5fZW50cnk7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3BhY2UgY2hhaW4gZW50cnkgZm9yIHRoZSBzcGFjZSB3aXRoIHRoZSBuYW1lIE5BTUUgb3IKLSAgIE5VTEwgaWYgbm8gc3VjaCBzcGFjZSBleGlzdHMuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLWlzX2RlZmluZWRfc3BhY2UgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqY2hhaW5fcG9pbnRlcjsKLQotICBmb3IgKGNoYWluX3BvaW50ZXIgPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgY2hhaW5fcG9pbnRlcjsKLSAgICAgICBjaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlci0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChTUEFDRV9OQU1FIChjaGFpbl9wb2ludGVyKSwgbmFtZSkgPT0gMCkKLQlyZXR1cm4gY2hhaW5fcG9pbnRlcjsKLSAgICB9Ci0KLSAgLyogTm8gbWFwcGluZyBmcm9tIHNlZ21lbnQgdG8gc3BhY2Ugd2FzIGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRmluZCBhbmQgcmV0dXJuIHRoZSBzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNlZy4gIElmIG5vIG1hcHBpbmcKLSAgIGZyb20gdGhlIGdpdmVuIHNlZyB0byBhIHNwYWNlIGlzIGZvdW5kLCB0aGVuIHJldHVybiBOVUxMLgotCi0gICBVbmxpa2Ugc3Vic3BhY2VzLCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpcyBub3QgZXhwZWN0ZWQgdG8gZ3JvdyBtdWNoLAotICAgc28gYSBsaW5lYXIgZXhoYXVzdGl2ZSBzZWFyY2ggaXMgT0sgaGVyZS4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotcGFfc2VnbWVudF90b19zcGFjZSAoc2VnKQotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluOwotCi0gIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHNwYWNlIGxvb2tpbmcgZm9yIHRoZSBjb3JyZWN0IG1hcHBpbmcuICAqLwotICBmb3IgKHNwYWNlX2NoYWluID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIHNwYWNlX2NoYWluOwotICAgICAgIHNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX25leHQpCi0gICAgewotICAgICAgaWYgKHNwYWNlX2NoYWluLT5zZF9zZWcgPT0gc2VnKQotCXJldHVybiBzcGFjZV9jaGFpbjsKLSAgICB9Ci0KLSAgLyogTWFwcGluZyB3YXMgbm90IGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJuIHRoZSBzcGFjZSBjaGFpbiBlbnRyeSBmb3IgdGhlIHN1YnNwYWNlIHdpdGggdGhlIG5hbWUgTkFNRSBvcgotICAgTlVMTCBpZiBubyBzdWNoIHN1YnNwYWNlIGV4aXN0cy4KLQotICAgVXNlcyBhIGxpbmVhciBzZWFyY2ggdGhyb3VnaCBhbGwgdGhlIHNwYWNlcyBhbmQgc3Vic3BhY2VzLCB0aGlzIG1heQotICAgbm90IGJlIGFwcHJvcHJpYXRlIGlmIHdlIGV2ZXIgYmVpbmcgcGxhY2luZyBlYWNoIGZ1bmN0aW9uIGluIGl0cwotICAgb3duIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKgotaXNfZGVmaW5lZF9zdWJzcGFjZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9jaGFpbjsKLSAgc3NkX2NoYWluX3N0cnVjdCAqc3Vic3BhY2VfY2hhaW47Ci0KLSAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3BhY2UuICAqLwotICBmb3IgKHNwYWNlX2NoYWluID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIHNwYWNlX2NoYWluOwotICAgICAgIHNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX25leHQpCi0gICAgewotICAgICAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3Vic3BhY2UgbG9va2luZyBmb3IgYSBuYW1lIHdoaWNoIG1hdGNoZXMuICAqLwotICAgICAgZm9yIChzdWJzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9zdWJzcGFjZXM7Ci0JICAgc3Vic3BhY2VfY2hhaW47Ci0JICAgc3Vic3BhY2VfY2hhaW4gPSBzdWJzcGFjZV9jaGFpbi0+c3NkX25leHQpCi0JaWYgKHN0cmNtcCAoU1VCU1BBQ0VfTkFNRSAoc3Vic3BhY2VfY2hhaW4pLCBuYW1lKSA9PSAwKQotCSAgcmV0dXJuIHN1YnNwYWNlX2NoYWluOwotICAgIH0KLQotICAvKiBTdWJzcGFjZSB3YXNuJ3QgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBGaW5kIGFuZCByZXR1cm4gdGhlIHN1YnNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc2VnLiAgSWYgbm8KLSAgIG1hcHBpbmcgZnJvbSB0aGUgZ2l2ZW4gc2VnIHRvIGEgc3Vic3BhY2UgaXMgZm91bmQsIHRoZW4gcmV0dXJuIE5VTEwuCi0KLSAgIElmIHdlIGV2ZXIgcHV0IGVhY2ggcHJvY2VkdXJlL2Z1bmN0aW9uIHdpdGhpbiBpdHMgb3duIHN1YnNwYWNlCi0gICAodG8gbWFrZSBsaWZlIGVhc2llciBvbiB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciksIHRoZW4gdGhpcyB3aWxsIGhhdmUKLSAgIHRvIGJlY29tZSBtb3JlIGVmZmljaWVudC4gICovCi0KLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKLXBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKHNlZywgc3Vic2VnKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9jaGFpbjsKLSAgc3NkX2NoYWluX3N0cnVjdCAqc3Vic3BhY2VfY2hhaW47Ci0KLSAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3BhY2UuICAqLwotICBmb3IgKHNwYWNlX2NoYWluID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIHNwYWNlX2NoYWluOwotICAgICAgIHNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX25leHQpCi0gICAgewotICAgICAgaWYgKHNwYWNlX2NoYWluLT5zZF9zZWcgPT0gc2VnKQotCXsKLQkgIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHN1YnNwYWNlIHdpdGhpbiBlYWNoIHNwYWNlIGxvb2tpbmcgZm9yCi0JICAgICB0aGUgY29ycmVjdCBtYXBwaW5nLiAgKi8KLQkgIGZvciAoc3Vic3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2Rfc3Vic3BhY2VzOwotCSAgICAgICBzdWJzcGFjZV9jaGFpbjsKLQkgICAgICAgc3Vic3BhY2VfY2hhaW4gPSBzdWJzcGFjZV9jaGFpbi0+c3NkX25leHQpCi0JICAgIGlmIChzdWJzcGFjZV9jaGFpbi0+c3NkX3N1YnNlZyA9PSAoaW50KSBzdWJzZWcpCi0JICAgICAgcmV0dXJuIHN1YnNwYWNlX2NoYWluOwotCX0KLSAgICB9Ci0KLSAgLyogTm8gbWFwcGluZyBmcm9tIHN1YnNlZ21lbnQgdG8gc3Vic3BhY2UgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHaXZlbiBhIG51bWJlciwgdHJ5IGFuZCBmaW5kIGEgc3BhY2Ugd2l0aCB0aGUgbmFtZSBudW1iZXIuCi0KLSAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBzcGFjZSBkaWN0aW9uYXJ5IGNoYWluIGVudHJ5IGZvciB0aGUgc3BhY2UKLSAgIHRoYXQgd2FzIGZvdW5kIG9yIE5VTEwgb24gZmFpbHVyZS4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotcGFfZmluZF9zcGFjZV9ieV9udW1iZXIgKG51bWJlcikKLSAgICAgaW50IG51bWJlcjsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9jaGFpbjsKLQotICBmb3IgKHNwYWNlX2NoYWluID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIHNwYWNlX2NoYWluOwotICAgICAgIHNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX25leHQpCi0gICAgewotICAgICAgaWYgKFNQQUNFX1NQTlVNIChzcGFjZV9jaGFpbikgPT0gKHVuc2lnbmVkIGludCkgbnVtYmVyKQotCXJldHVybiBzcGFjZV9jaGFpbjsKLSAgICB9Ci0KLSAgLyogTm8gYXBwcm9wcmlhdGUgc3BhY2UgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXR1cm4gdGhlIHN0YXJ0aW5nIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBzdWJzcGFjZS4gIElmIHRoZSBzdGFydGluZwotICAgYWRkcmVzcyBpcyB1bmtub3duIHRoZW4gcmV0dXJuIHplcm8uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYV9zdWJzcGFjZV9zdGFydCAoc3BhY2UsIHF1YWRyYW50KQotICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotICAgICBpbnQgcXVhZHJhbnQ7Ci17Ci0gIC8qIEZJWE1FLiAgQXNzdW1lcyBldmVyeW9uZSBwdXRzIHJlYWQvd3JpdGUgZGF0YSBhdCAweDQwMDAwMDAsIHRoaXMKLSAgICAgaXMgbm90IGNvcnJlY3QgZm9yIHRoZSBQQSBPU0YxIHBvcnQuICAqLwotICBpZiAoKHN0cmNtcCAoU1BBQ0VfTkFNRSAoc3BhY2UpLCAiJFBSSVZBVEUkIikgPT0gMCkgJiYgcXVhZHJhbnQgPT0gMSkKLSAgICByZXR1cm4gMHg0MDAwMDAwMDsKLSAgZWxzZSBpZiAoc3BhY2UtPnNkX3NlZyA9PSBkYXRhX3NlY3Rpb24gJiYgcXVhZHJhbnQgPT0gMSkKLSAgICByZXR1cm4gMHg0MDAwMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiAwOwotICByZXR1cm4gMDsKLX0KLQotLyogRklYTUUuICBOZWVkcyBkb2N1bWVudGF0aW9uLiAgKi8KLXN0YXRpYyBpbnQKLXBhX25leHRfc3Vic2VnIChzcGFjZSkKLSAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLXsKLQotICBzcGFjZS0+c2RfbGFzdF9zdWJzZWcrKzsKLSAgcmV0dXJuIHNwYWNlLT5zZF9sYXN0X3N1YnNlZzsKLX0KLSNlbmRpZgotCi0vKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHBhX3N0cmluZ2VyLiAgVXNlZCB0byBmaW5kIHRoZSBlbmQgb2YKLSAgIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGFfc3RyaW5nZXJfYXV4IChzKQotICAgICBjaGFyICpzOwotewotICB1bnNpZ25lZCBpbnQgYyA9ICpzICYgQ0hBUl9NQVNLOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnXCInOgotICAgICAgYyA9IE5PVF9BX0NIQVI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gYzsKLX0KLQotLyogSGFuZGxlIGEgLlNUUklORyB0eXBlIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zdHJpbmdlciAoYXBwZW5kX3plcm8pCi0gICAgIGludCBhcHBlbmRfemVybzsKLXsKLSAgY2hhciAqcywgbnVtX2J1Zls0XTsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIGludCBpOwotCi0gIC8qIFByZXByb2Nlc3MgdGhlIHN0cmluZyB0byBoYW5kbGUgUEEtc3BlY2lmaWMgZXNjYXBlIHNlcXVlbmNlcy4KLSAgICAgRm9yIGV4YW1wbGUsIFx4REQgd2hlcmUgREQgaXMgYSBoZXhpZGVjaW1hbCBudW1iZXIgc2hvdWxkIGJlCi0gICAgIGNoYW5nZWQgdG8gXE9PTyB3aGVyZSBPT08gaXMgYW4gb2N0YWwgbnVtYmVyLiAgKi8KLQotICAvKiBTa2lwIHRoZSBvcGVuaW5nIHF1b3RlLiAgKi8KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0KLSAgd2hpbGUgKGlzX2FfY2hhciAoYyA9IHBhX3N0cmluZ2VyX2F1eCAocysrKSkpCi0gICAgewotICAgICAgaWYgKGMgPT0gJ1xcJykKLQl7Ci0JICBjID0gKnM7Ci0JICBzd2l0Y2ggKGMpCi0JICAgIHsKLQkgICAgICAvKiBIYW5kbGUgXHg8bnVtPi4gICovCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IG51bWJlcjsKLQkJaW50IG51bV9kaWdpdDsKLQkJY2hhciBkZzsKLQkJY2hhciAqc19zdGFydCA9IHM7Ci0KLQkJLyogR2V0IHBhcyB0aGUgJ3gnLiAgKi8KLQkJcysrOwotCQlmb3IgKG51bV9kaWdpdCA9IDAsIG51bWJlciA9IDAsIGRnID0gKnM7Ci0JCSAgICAgbnVtX2RpZ2l0IDwgMgotCQkgICAgICYmIChpc2RpZ2l0IChkZykgfHwgKGRnID49ICdhJyAmJiBkZyA8PSAnZicpCi0JCQkgfHwgKGRnID49ICdBJyAmJiBkZyA8PSAnRicpKTsKLQkJICAgICBudW1fZGlnaXQrKykKLQkJICB7Ci0JCSAgICBpZiAoaXNkaWdpdCAoZGcpKQotCQkgICAgICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGRnIC0gJzAnOwotCQkgICAgZWxzZSBpZiAoZGcgPj0gJ2EnICYmIGRnIDw9ICdmJykKLQkJICAgICAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBkZyAtICdhJyArIDEwOwotCQkgICAgZWxzZQotCQkgICAgICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGRnIC0gJ0EnICsgMTA7Ci0KLQkJICAgIHMrKzsKLQkJICAgIGRnID0gKnM7Ci0JCSAgfQotCQlpZiAobnVtX2RpZ2l0ID4gMCkKLQkJICB7Ci0JCSAgICBzd2l0Y2ggKG51bV9kaWdpdCkKLQkJICAgICAgewotCQkgICAgICBjYXNlIDE6Ci0JCQlzcHJpbnRmIChudW1fYnVmLCAiJTAybyIsIG51bWJlcik7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAyOgotCQkJc3ByaW50ZiAobnVtX2J1ZiwgIiUwM28iLCBudW1iZXIpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX2RpZ2l0OyBpKyspCi0JCSAgICAgIHNfc3RhcnRbaV0gPSBudW1fYnVmW2ldOwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAvKiBUaGlzIG1pZ2h0IGJlIGEgIlwiIiwgc2tpcCBvdmVyIHRoZSBlc2NhcGVkIGNoYXIuICAqLwotCSAgICBkZWZhdWx0OgotCSAgICAgIHMrKzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHN0cmluZ2VyIChhcHBlbmRfemVybyk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBIYW5kbGUgYSAuVkVSU0lPTiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfdmVyc2lvbiAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBvYmpfdmVyc2lvbiAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0jaWZkZWYgT0JKX1NPTQotCi0vKiBIYW5kbGUgYSAuQ09NUElMRVIgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvbXBpbGVyICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIG9ial9zb21fY29tcGlsZXIgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotI2VuZGlmCi0KLS8qIEhhbmRsZSBhIC5DT1BZUklHSFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvcHlyaWdodCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBvYmpfY29weXJpZ2h0ICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIEp1c3QgbGlrZSBhIG5vcm1hbCBjb25zLCBidXQgd2hlbiBmaW5pc2hlZCB3ZSBoYXZlIHRvIHVuZGVmaW5lCi0gICB0aGUgbGF0ZXN0IHNwYWNlIGxhYmVsLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvbnMgKG5ieXRlcykKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgY29ucyAobmJ5dGVzKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIFN3aXRjaCB0byB0aGUgZGF0YSBzcGFjZS4gIEFzIHVzdWFsIGRlbGV0ZSBvdXIgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZGF0YSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgY3VycmVudF9zcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKCIkUFJJVkFURSQiKTsKLSAgY3VycmVudF9zdWJzcGFjZQotICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoY3VycmVudF9zcGFjZS0+c2Rfc2VnLCAwKTsKLSNlbmRpZgotICBzX2RhdGEgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogTGlrZSBmbG9hdF9jb25zLCBidXQgd2UgbmVlZCB0byB1bmRlZmluZSBvdXIgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZmxvYXRfY29ucyAoZmxvYXRfdHlwZSkKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci17Ci0gIGZsb2F0X2NvbnMgKGZsb2F0X3R5cGUpOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogTGlrZSBzX2ZpbGwsIGJ1dCBkZWxldGUgb3VyIGxhYmVsIHdoZW4gZmluaXNoZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZmlsbCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBzX2ZpbGwgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogTGlrZSBsY29tbSwgYnV0IGRlbGV0ZSBvdXIgbGFiZWwgd2hlbiBmaW5pc2hlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9sY29tbSAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgc19sY29tbSAobmVlZHNfYWxpZ24pOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogTGlrZSBsc3ltLCBidXQgZGVsZXRlIG91ciBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xzeW0gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgc19sc3ltICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIFN3aXRjaCB0byB0aGUgdGV4dCBzcGFjZS4gIExpa2Ugc190ZXh0LCBidXQgZGVsZXRlIG91cgotICAgbGFiZWwgd2hlbiBmaW5pc2hlZC4gICovCi1zdGF0aWMgdm9pZAotcGFfdGV4dCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgY3VycmVudF9zcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKCIkVEVYVCQiKTsKLSAgY3VycmVudF9zdWJzcGFjZQotICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoY3VycmVudF9zcGFjZS0+c2Rfc2VnLCAwKTsKLSNlbmRpZgotCi0gIHNfdGV4dCAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBPbiB0aGUgUEEgcmVsb2NhdGlvbnMgd2hpY2ggaW52b2x2ZSBmdW5jdGlvbiBzeW1ib2xzIG11c3Qgbm90IGJlCi0gICBhZGp1c3RlZC4gIFRoaXMgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBrbm93IHdoZW4vaG93IHRvIGNyZWF0ZSBhcmd1bWVudAotICAgcmVsb2NhdGlvbiBzdHVicyBmb3IgaW5kaXJlY3QgY2FsbHMgYW5kIGNhbGxzIHRvIHN0YXRpYyBmdW5jdGlvbnMuCi0KLSAgICJUIiBmaWVsZCBzZWxlY3RvcnMgY3JlYXRlIERMVCByZWxhdGl2ZSBmaXh1cHMgZm9yIGFjY2Vzc2luZwotICAgZ2xvYmFscyBhbmQgc3RhdGljcyBpbiBQSUMgY29kZTsgZWFjaCBETFQgcmVsYXRpdmUgZml4dXAgY3JlYXRlcwotICAgYW4gZW50cnkgaW4gdGhlIERMVCB0YWJsZS4gIFRoZSBlbnRyaWVzIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YKLSAgIHRoZSBmaW5hbCB0YXJnZXQgKGVnIGFjY2Vzc2luZyAiZm9vIiB3b3VsZCBjcmVhdGUgYSBETFQgZW50cnkKLSAgIHdpdGggdGhlIGFkZHJlc3Mgb2YgImZvbyIpLgotCi0gICBVbmZvcnR1bmF0ZWx5LCB0aGUgSFAgbGlua2VyIGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgYW55IGFkZGVuZAotICAgd2hlbiBnZW5lcmF0aW5nIHRoZSBETFQ7IHNvIGFjY2Vzc2luZyAkTElUJCs4IHB1dHMgdGhlIGFkZHJlc3Mgb2YKLSAgICRMSVQkIGludG8gdGhlIERMVCByYXRoZXIgdGhhbiB0aGUgYWRkcmVzcyBvZiAkTElUJCs4LgotCi0gICBUaGUgZW5kIHJlc3VsdCBpcyB3ZSBjYW4ndCBwZXJmb3JtIHJlbG9jYXRpb24gc3ltYm9sIHJlZHVjdGlvbnMgZm9yCi0gICBhbnkgZml4dXAgd2hpY2ggY3JlYXRlcyBlbnRyaWVzIGluIHRoZSBETFQgKGVnIHRoZXkgdXNlICJUIiBmaWVsZAotICAgc2VsZWN0b3JzKS4KLQotICAgUmVqZWN0IHJlZHVjdGlvbnMgaW52b2x2aW5nIHN5bWJvbHMgd2l0aCBleHRlcm5hbCBzY29wZTsgc3VjaAotICAgcmVkdWN0aW9ucyBtYWtlIGxpZmUgYSBsaXZpbmcgaGVsbCBmb3Igb2JqZWN0IGZpbGUgZWRpdG9ycy4KLQotICAgRklYTUUuICBBbHNvIHJlamVjdCBSX0hQUEEgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIDMyYml0cyB3aWRlIGluCi0gICB0aGUgY29kZSBzcGFjZS4gIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBrbm93IGhvdyB0byBwdWxsIHRoZQotICAgcmlnaHQgYml0cyBvdXQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLWhwcGFfZml4X2FkanVzdGFibGUgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4OwotCi0gIGhwcGFfZml4ID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gMzJiaXQgcmVsb2NzLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEEgJiYgaHBwYV9maXgtPmZ4X3JfZm9ybWF0ID09IDMyKQotICAgIHJldHVybiAwOwotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gc3ltMS1zeW0yIGV4cHJlc3Npb25zIHdoZW4KLSAgICAgdGhlIGZpeHVwIHdpbGwgb2NjdXIgaW4gYSBDT0RFIHN1YnNwYWNlLgotCi0gICAgIFhYWCBGSVhNRTogTG9uZyB0ZXJtIHdlIHByb2JhYmx5IHdhbnQgdG8gcmVqZWN0IGFsbCBvZiB0aGVzZTsKLSAgICAgZm9yIGV4YW1wbGUgcmVkdWNpbmcgaW4gdGhlIGRlYnVnIHNlY3Rpb24gd291bGQgbG9zZSBpZiB3ZSBldmVyCi0gICAgIHN1cHBvcnRlZCB1c2luZyB0aGUgb3B0aW1pemluZyBocCBsaW5rZXIuICAqLwotICBpZiAoZml4cC0+ZnhfYWRkc3kKLSAgICAgICYmIGZpeHAtPmZ4X3N1YnN5Ci0gICAgICAmJiAoaHBwYV9maXgtPnNlZ21lbnQtPmZsYWdzICYgU0VDX0NPREUpKQotICAgIHsKLSAgICAgIC8qIEFwcGFyZW50bHkgc3lfdXNlZF9pbl9yZWxvYyBuZXZlciBnZXRzIHNldCBmb3Igc3ViIHN5bWJvbHMuICAqLwotICAgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+Znhfc3Vic3kpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFdlIGNhbid0IGFkanVzdCBhbnkgcmVsb2NzIHRoYXQgdXNlIExSJSBhbmQgUlIlIGZpZWxkIHNlbGVjdG9ycy4KLSAgICAgVGhhdCBjb25mdXNlcyB0aGUgSFAgbGlua2VyLiAgKi8KLSAgaWYgKGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfbHJzZWwKLSAgICAgIHx8IGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfcnJzZWwKLSAgICAgIHx8IGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfbmxyc2VsKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0KLSAgLyogUmVqZWN0IHJlZHVjdGlvbnMgb2Ygc3ltYm9scyBpbiBETFQgcmVsYXRpdmUgcmVsb2NzLAotICAgICByZWxvY2F0aW9ucyB3aXRoIHBsYWJlbHMuICAqLwotICBpZiAoaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV90c2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2x0c2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3J0c2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3BzZWwKLSAgICAgIHx8IGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfcnBzZWwKLSAgICAgIHx8IGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfbHBzZWwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICYmIFNfSVNfRVhURVJOQUwgKGZpeHAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBSZWplY3QgYWJzb2x1dGUgY2FsbHMgKGp1bXBzKS4gICovCi0gIGlmIChocHBhX2ZpeC0+Znhfcl90eXBlID09IFJfSFBQQV9BQlNfQ0FMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBSZWplY3QgcmVkdWN0aW9ucyBvZiBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IDAgfHwgISBTX0lTX0ZVTkNUSU9OIChmaXhwLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBub256ZXJvIGlmIHRoZSBmaXh1cCBpbiBGSVhQIHdpbGwgcmVxdWlyZSBhIHJlbG9jYXRpb24sCi0gICBldmVuIGl0IGlmIGFwcGVhcnMgdGhhdCB0aGUgZml4dXAgY291bGQgYmUgY29tcGxldGVseSBoYW5kbGVkCi0gICB3aXRoaW4gR0FTLiAgKi8KLQotaW50Ci1ocHBhX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4cDsKLSAgaW50IGRpc3RhbmNlOwotCi0gIGhwcGFfZml4cCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopIGZpeHAtPnRjX2ZpeF9kYXRhOwotI2lmZGVmIE9CSl9TT00KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5UUlkgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9FWElUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0JFR0lOX0JSVEFCCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VORF9CUlRBQgotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9CRUdJTl9UUlkKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX1RSWQotICAgICAgfHwgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwgJiYgZml4cC0+Znhfc3Vic3kgIT0gTlVMTAotCSAgJiYgKGhwcGFfZml4cC0+c2VnbWVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkpCi0gICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotI2RlZmluZSBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQoQ0FMTEVSLCBDQUxMRUUpIFwKLSAgKChDQUxMRUUpICYmIChDQUxMRVIpICYmICgoQ0FMTEVFKSAhPSAoQ0FMTEVSKSkpCi0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIEl0IGlzIG5lY2Vzc2FyeSB0byBmb3JjZSBQQy1yZWxhdGl2ZSBjYWxscy9qdW1wcyB0byBoYXZlIGEgcmVsb2NhdGlvbgotICAgICBlbnRyeSBpZiB0aGV5J3JlIGdvaW5nIHRvIG5lZWQgZWl0aGVyIGEgYXJndW1lbnQgcmVsb2NhdGlvbiBvciBsb25nCi0gICAgIGNhbGwgc3R1Yi4gIEZJWE1FLiAgQ2FuJ3Qgd2UgbmVlZCB0aGUgc2FtZSBmb3IgYWJzb2x1dGUgY2FsbHM/ICAqLwotICBpZiAoZml4cC0+ZnhfcGNyZWwgJiYgZml4cC0+ZnhfYWRkc3kKLSAgICAgICYmIChhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQgKChsb25nKSAoKG9ial9zeW1ib2xfdHlwZSAqKQotCXN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSkpLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jLAotCWhwcGFfZml4cC0+ZnhfYXJnX3JlbG9jKSkpCi0gICAgcmV0dXJuIDE7Ci0jZW5kaWYKLSAgZGlzdGFuY2UgPSAoZml4cC0+Znhfb2Zmc2V0ICsgU19HRVRfVkFMVUUgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgIC0gbWRfcGNyZWxfZnJvbSAoZml4cCkpOwotICAvKiBOb3cgY2hlY2sgYW5kIHNlZSBpZiB3ZSdyZSBnb2luZyB0byBuZWVkIGEgbG9uZy1icmFuY2ggc3R1Yi4gICovCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX1BDUkVMX0NBTEwKLSAgICAgICYmIChkaXN0YW5jZSA+IDI2MjE0MyB8fCBkaXN0YW5jZSA8IC0yNjIxNDQpKQotICAgIHJldHVybiAxOwotCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0FCU19DQUxMKQotICAgIHJldHVybiAxOwotI3VuZGVmIGFyZ19yZWxvY19zdHViX25lZWRlZAotCi0gIC8qIE5vIG5lZWQgKHlldCkgdG8gZm9yY2UgYW5vdGhlciByZWxvY2F0aW9ucyB0byBiZSBlbWl0dGVkLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE5vdyBmb3Igc29tZSBFTEYgc3BlY2lmaWMgY29kZS4gIEZJWE1FLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0vKiBNYXJrIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gY29tcHV0ZQotICAgdGhlIHNpemUgb2YgdGhlIGZ1bmN0aW9uIGluIGhwcGFfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gKCkKLXsKLSAgLyogRUxGIGRvZXMgbm90IGhhdmUgRVhJVCByZWxvY2F0aW9ucy4gIEFsbCB3ZSBkbyBpcyBjcmVhdGUgYQotICAgICB0ZW1wb3Jhcnkgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBjaGFyICpuYW1lID0gKGNoYXIgKikKLSAgICB4bWFsbG9jIChzdHJsZW4gKCJMJFwwMDFlbmRfIikgKwotCSAgICAgc3RybGVuIChTX0dFVF9OQU1FIChsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sKSkgKyAxKTsKLQotICBpZiAobmFtZSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1ib2xQOwotCi0gICAgICBzdHJjcHkgKG5hbWUsICJMJFwwMDFlbmRfIik7Ci0gICAgICBzdHJjYXQgKG5hbWUsIFNfR0VUX05BTUUgKGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wpKTsKLQotICAgICAgLyogSWYgd2UgaGF2ZSBhIC5leGl0IGZvbGxvd2VkIGJ5IGEgLnByb2NlbmQsIHRoZW4gdGhlCi0JIHN5bWJvbCB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQuICAqLwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgICAgIGlmIChzeW1ib2xQKQotCXsKLQkgIC8qIFRoZSBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkISAgVGhpcyBjYW4KLQkgICAgIGhhcHBlbiBpZiB3ZSBoYXZlIGEgLmV4aXQgZm9sbG93ZWQgYnkgYSAucHJvY2VuZC4KLQotCSAgICAgVGhpcyBpcyAqbm90KiBhbiBlcnJvci4gIEFsbCB3ZSB3YW50IHRvIGRvIGlzIGZyZWUKLQkgICAgIHRoZSBtZW1vcnkgd2UganVzdCBhbGxvY2F0ZWQgZm9yIHRoZSBuYW1lIGFuZCBjb250aW51ZS4gICovCi0JICB4ZnJlZSAobmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHN5bWJvbCB2YWx1ZSBzaG91bGQgYmUgdGhlIG9mZnNldCBvZiB0aGUKLQkgICAgIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGZ1bmN0aW9uICovCi0JICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgbm93X3NlZywgKHZhbHVlVCkgKGZyYWdfbm93X2ZpeCAoKSAtIDQpLAotCQkJCWZyYWdfbm93KTsKLQotCSAgYXNzZXJ0IChzeW1ib2xQKTsKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0JfQotCi0gICAgICBpZiAoc3ltYm9sUCkKLQlsYXN0X2NhbGxfaW5mby0+ZW5kX3N5bWJvbCA9IHN5bWJvbFA7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJTeW1ib2wgJyVzJyBjb3VsZCBub3QgYmUgY3JlYXRlZC4iKSwgbmFtZSk7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oIk5vIG1lbW9yeSBmb3Igc3ltYm9sIG5hbWUuIikpOwotCi19Ci0KLS8qIEZvciBFTEYsIHRoaXMgZnVuY3Rpb24gc2VydmVzIG9uZSBwdXJwb3NlOiAgdG8gc2V0dXAgdGhlIHN0X3NpemUKLSAgIGZpZWxkIG9mIFNUVF9GVU5DIHN5bWJvbHMuICBUbyBkbyB0aGlzLCB3ZSBuZWVkIHRvIHNjYW4gdGhlCi0gICBjYWxsX2luZm8gc3RydWN0dXJlIGxpc3QsIGRldGVybWluaW5nIHN0X3NpemUgaW4gYnkgdGFraW5nIHRoZQotICAgZGlmZmVyZW5jZSBpbiB0aGUgYWRkcmVzcyBvZiB0aGUgYmVnaW5uaW5nL2VuZCBtYXJrZXIgc3ltYm9scy4gICovCi0KLXZvaWQKLWVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcgKCkKLXsKLSAgc3RydWN0IGNhbGxfaW5mbyAqY2FsbF9pbmZvX3BvaW50ZXI7Ci0KLSAgZm9yIChjYWxsX2luZm9fcG9pbnRlciA9IGNhbGxfaW5mb19yb290OwotICAgICAgIGNhbGxfaW5mb19wb2ludGVyOwotICAgICAgIGNhbGxfaW5mb19wb2ludGVyID0gY2FsbF9pbmZvX3BvaW50ZXItPmNpX25leHQpCi0gICAgewotICAgICAgZWxmX3N5bWJvbF90eXBlICplc3ltCi0JPSAoKGVsZl9zeW1ib2xfdHlwZSAqKQotCSAgIHN5bWJvbF9nZXRfYmZkc3ltIChjYWxsX2luZm9fcG9pbnRlci0+c3RhcnRfc3ltYm9sKSk7Ci0gICAgICBlc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgPQotCVNfR0VUX1ZBTFVFIChjYWxsX2luZm9fcG9pbnRlci0+ZW5kX3N5bWJvbCkKLQktIFNfR0VUX1ZBTFVFIChjYWxsX2luZm9fcG9pbnRlci0+c3RhcnRfc3ltYm9sKSArIDQ7Ci0gICAgfQotfQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi1wYV9lbmRfb2Zfc291cmNlICgpCi17Ci0gIGlmIChkZWJ1Z190eXBlID09IERFQlVHX0RXQVJGMikKLSAgICBkd2FyZjJfZmluaXNoICgpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWhwcGEuaCBiL2dhcy9jb25maWcvdGMtaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZjOGNhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qIHRjLWhwcGEuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGhlIFBBCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLwotCi0vKiBQbGVhc2UgcmVmcmFpbiBmcm9tIGV4cG9zaW5nIHRoZSB3b3JsZCB0byB0aGUgaW50ZXJuYWxzIG9mIHRjLWhwcGEuYwotICAgd2hlbiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuICBUaGlzIG1lYW5zIG9ubHkgZGVjbGFyaW5nIGV4cG9ydGVkIGZ1bmN0aW9ucywKLSAgIChwbGVhc2UgUEFSQU1pemUgdGhlbSEpIG5vdCBleHBvcnRpbmcgc3RydWN0dXJlcyBhbmQgZGF0YSBpdGVtcyB3aGljaAotICAgYXJlIHVzZWQgc29sZWx5IHdpdGhpbiB0Yy1ocHBhLmMsIGV0Yy4KLQotICAgQWxzbyByZWZyYWluIGZyb20gYWRkaW5nIGFueSBtb3JlIG9iamVjdCBmaWxlIGRlcGVuZGVudCBjb2RlLCB0aGVyZSBpcyAKLSAgIGFscmVhZHkgZmFyIHRvbyBtdWNoIG9iamVjdCBmaWxlIGZvcm1hdCBkZXBlbmRlbnQgY29kZSBpbiB0aGlzIGZpbGUuCi0gICBJbiB0aGVvcnkgdGhpcyBmaWxlIHNob3VsZCBjb250YWluIG9ubHkgZXhwb3J0ZWQgZnVuY3Rpb25zLCBzdHJ1Y3R1cmVzCi0gICBhbmQgZGF0YSBkZWNsYXJhdGlvbnMgY29tbW9uIHRvIGFsbCBQQSBhc3NlbWJsZXJzLiAgKi8KLQotI2lmbmRlZiBfVENfSFBQQV9ICi0jZGVmaW5lIF9UQ19IUFBBX0gKLQotI2lmbmRlZiBUQ19IUFBBCi0jZGVmaW5lIFRDX0hQUEEJMQotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2hwcGEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIEZJWE1FLiAgVGhlIGxhY2sgb2YgYSBwbGFjZSB0byBwdXQgdGhpbmdzIHdoaWNoIGFyZSBib3RoIHRhcmdldCBjcHUKLSAgIGFuZCB0YXJnZXQgZm9ybWF0IGRlcGVuZGVudCBtYWtlcyBoYWNrcyBsaWtlIHRoaXMgbmVjZXNzYXJ5LiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0jaWZkZWYgQkZENjQKLSNpbmNsdWRlICJiZmQvZWxmNjQtaHBwYS5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGY2NC1ocHBhIgotI2Vsc2UKLSNpbmNsdWRlICJiZmQvZWxmMzItaHBwYS5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1ocHBhIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9TT00KLSNpbmNsdWRlICJiZmQvc29tLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgInNvbSIKLSNlbmRpZgotCi0vKiBGSVhNRS4gIFdoeSBvaCB3aHkgYXJlbid0IHRoZXNlIGRlZmluZWQgc29tZXdoZXJlIGdsb2JhbGx5PyAgKi8KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAoMCkKLSNkZWZpbmUgVFJVRSAgICAoIUZBTFNFKQotI2VuZGlmCi0KLSNkZWZpbmUgQVNFQ19OVUxMIChhc2VjdGlvbiAqKTAKLQotLyogTGFiZWxzIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbG9uIGZvciBhIHN1ZmZpeC4gICovCi0jZGVmaW5lIExBQkVMU19XSVRIT1VUX0NPTE9OUyAxCi0KLS8qIEZJWE1FLiAgVGhpcyBzaG91bGQgYmUgc3RhdGljIGFuZCBkZWNsYXJlZCBpbiB0Yy1ocHBhLmMsIGJ1dCAKLSAgIHBhX2RlZmluZV9sYWJlbCBnZXRzIHVzZWQgb3V0c2lkZSBvZiB0Yy1ocHBhLmMgdmlhIHRjX2Zyb2JfbGFiZWwuCi0gICBTaG91bGQgYWxzbyBiZSBQQVJBTWl6ZWQsIGJ1dCBzeW1ib2xTIGlzbid0IGF2YWlsYWJsZSBoZXJlLiAgKi8KLWV4dGVybiB2b2lkIHBhX2RlZmluZV9sYWJlbCAoKTsKLQotLyogRklYTUUuICBUeXBlcyBub3QgYXZhaWxhYmxlIGhlcmUsIHNvIHRoZXkgY2FuJ3QgYmUgUEFSQU1pemVkLiAgKi8KLWV4dGVybiB2b2lkIHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhICgpOwotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X2hwcGEgKCk7Ci1leHRlcm4gaW50IGhwcGFfZm9yY2VfcmVsb2NhdGlvbiAoKTsKLQotLyogVGhpcyBnZXRzIGNhbGxlZCBiZWZvcmUgd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUgdG8gbWFrZSBzdXJlCi0gICB0aGluZ3MgbGlrZSBlbnRyeS9leGl0IGFuZCBwcm9jL3Byb2NlbmQgcGFpcnMgbWF0Y2guICAqLwotZXh0ZXJuIHZvaWQgcGFfY2hlY2tfZW9mIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgdGNfZnJvYl9maWxlIHBhX2NoZWNrX2VvZgotCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBwYV9kZWZpbmVfbGFiZWwgKHN5bSkKLQotLyogVGhlIFBBIGRvZXMgbm90IG5lZWQgc3VwcG9ydCBmb3IgZWl0aGVyIG9mIHRoZXNlLiAgKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGhlYWRlcnMpIHs7fQotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soaGVhZGVycykgezt9Ci0KLSNkZWZpbmUgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi0jZGVmaW5lIE1BWF9SRUxPQ19FWFBBTlNJT04gNgotCi0vKiBGSVhNRS4gIE1vcmUgdGhpbmdzIHdoaWNoIGFyZSBib3RoIEhQUEEgYW5kIEVMRiBzcGVjaWZpYy4gIFRoZXJlIGlzIAotICAgbm93aGVyZSB0byBwdXQgc3VjaCB0aGluZ3MuICAqLwotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcJZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZwotdm9pZCBlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0vKiBUaGUgUEEgbmVlZHMgdG8gcGFyc2UgZmllbGQgc2VsZWN0b3JzIGluIC5ieXRlLCBldGMuICAqLwotCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgXAotICBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSAoRVhQKQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X2hwcGEKLQotLyogT24gdGhlIFBBLCBhbiBlcXVhbCBzaWduIG9mdGVuIGFwcGVhcnMgYXMgYSBjb25kaXRpb24gb3IgbnVsbGlmaWNhdGlvbgotICAgY29tcGxldGVyIGluIGFuIGluc3RydWN0aW9uLiAgVGhpcyBjYW4gYmUgZGV0ZWN0ZWQgYnkgY2hlY2tpbmcgdGhlCi0gICBwcmV2aW91cyBjaGFyYWN0ZXIsIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBjb21tYSwgdGhlbiB0aGUgZXF1YWwgaXMKLSAgIGJlaW5nIHVzZWQgYXMgcGFydCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFRDX0VRVUFMX0lOX0lOU04oQywgUFRSKQkoKEMpID09ICcsJykKLQotLyogU2ltaWxhcmx5IGZvciBhbiBleGNsYW1hdGlvbiBwb2ludC4gIEl0IGlzIHVzZWQgaW4gRlAgY29tcGFyaXNvbgotICAgaW5zdHJ1Y3Rpb25zIGFuZCBhcyBhbiBlbmQgb2YgbGluZSBtYXJrZXIuICBXaGVuIHVzZWQgaW4gYW4gaW5zdHJ1Y3Rpb24KLSAgIGl0IHdpbGwgYWx3YXlzIGZvbGxvdyBhIGNvbW1hLiAgKi8KLSNkZWZpbmUgVENfRU9MX0lOX0lOU04oUFRSKQkoKihQVFIpID09ICchJyAmJiAoUFRSKVstMV0gPT0gJywnKQotCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlIGhwcGFfZml4X2FkanVzdGFibGUKLQotLyogQmVjYXVzZSBvZiB0aGUgc3RyYW5nZSBQQSBjYWxsaW5nIGNvbnZlbnRpb25zLCBpdCBpcyBzb21ldGltZXMKLSAgIG5lY2Vzc2FyeSB0byBlbWl0IGEgcmVsb2NhdGlvbiBmb3IgYSBjYWxsIGV2ZW4gdGhvdWdoIGl0IHdvdWxkCi0gICBub3JtYWxseSBhcHBlYXIgc2FmZSB0byBoYW5kbGUgaXQgY29tcGxldGVseSB3aXRoaW4gR0FTLiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKSBocHBhX2ZvcmNlX3JlbG9jYXRpb24gKEZJWFApCi0KLSNpZmRlZiBPQkpfU09NCi0vKiBJZiBhIHN5bWJvbCBpcyBpbXBvcnRlZCwgYnV0IG5ldmVyIHVzZWQsIHRoZW4gdGhlIHN5bWJvbCBzaG91bGQKLSAgICpub3QqIGVuZCB1cCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgTGlrZXdpc2UgZm9yIGFic29sdXRlIHN5bWJvbHMKLSAgIHdpdGggbG9jYWwgc2NvcGUuICAqLwotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0scHVudCkgXAotICAgIGlmICgoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX3VuZF9zZWN0aW9uICYmICEgc3ltYm9sX3VzZWRfcCAoc3ltKSkgXAotCXx8IChTX0dFVF9TRUdNRU5UIChzeW0pID09ICZiZmRfYWJzX3NlY3Rpb24gXAotCSAgICAmJiAhIFNfSVNfRVhURVJOQUwgKHN5bSkpKSBcCi0gICAgICBwdW50ID0gMQotCi0vKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gbWFrZSByZWxvY2F0aW9ucyBpbnZvbHZpbmcgdGhlIGRpZmZlcmVuY2Ugb2YKLSAgIHR3byBzeW1ib2xzLiAgVGhpcyBpbmNsdWRlcyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyB3aGVuCi0gICBvbmUgb2YgdGhlbSBpcyB1bmRlZmluZWQgKHRoaXMgY29tZXMgdXAgaW4gUElDIGNvZGUgZ2VuZXJhdGlvbikuIAotCi0gICBXZSBkb24ndCBkZWZpbmUgRElGRl9FWFBSX09LIGJlY2F1c2UgaXQgZG9lcyB0aGUgd3JvbmcgdGhpbmcgaWYKLSAgIHRoZSBhZGQgc3ltYm9sIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHN1YiBzeW1ib2wgaXMgYSBzeW1ib2wgaW4KLSAgIHRoZSBzYW1lIHNlY3Rpb24gYXMgdGhlIHJlbG9jYXRpb24uICBXZSBhbHNvIG5lZWQgc29tZSB3YXkgdG8KLSAgIHNwZWNpYWxpemUgc29tZSBjb2RlIGluIGFkanVzdF9yZWxvY19zeW1zLiAgKi8KLSNkZWZpbmUgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0scHVudCkgXAotICB7IFwKLSAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAhIHN5bWJvbF91c2VkX3AgKHN5bSkpIFwKLQl8fCAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX2Fic19zZWN0aW9uIFwKLQkgICAgJiYgISBTX0lTX0VYVEVSTkFMIChzeW0pKSBcCi0JfHwgc3RyY21wIChTX0dFVF9OQU1FIChzeW0pLCAiJGdsb2JhbCQiKSA9PSAwKSBcCi0gICAgICBwdW50ID0gMTsgXAotICB9Ci0jZW5kaWYKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBtZF9lbmQoKSBwYV9lbmRfb2Zfc291cmNlICgpCi0jZW5kaWYKLQotI2RlZmluZSBUQ19GSVhfVFlQRSBQVFIKLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGSVhQKSAoKEZJWFApLT50Y19maXhfZGF0YSA9IE5VTEwpCi0KLSNlbmRpZiAvKiBfVENfSFBQQV9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWkzNzAuYyBiL2dhcy9jb25maWcvdGMtaTM3MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTgzMjczLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTM3MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk2NyArMCwwIEBACi0vKiB0Yy1pMzcwLmMgLS0gQXNzZW1ibGVyIGZvciB0aGUgSUJNIDM2MC8zNzAvMzkwIGluc3RydWN0aW9uIHNldC4KLSAgIExvb3NlbHkgYmFzZWQgb24gdGhlIHBwYyBmaWxlcyBieSBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+IDE5OTgsIDk5Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyogVGhpcyBhc3NlbWJsZXIgaW1wbGVtZW50cyBhIHZlcnkgaGFja2VkIHZlcnNpb24gb2YgYW4gZWxmLWxpa2UgdGhpbmcKLSAqIHRoYXQgZ2NjIGVtaXRzICh3aGVuIGdjYyBpcyBzdWl0YWJseSBoYWNrZWQpLiAgVG8gbWFrZSBpdCBiZWhhdmUgbW9yZQotICogSExBU00tbGlrZSwgdHJ5IHR1cm5pbmcgb24gdGhlIC1NIG9yIC0tbXJpIGZsYWcgKGFzIHRoZXJlIGFyZSB2YXJpb3VzCi0gKiBzaW1pbGFyaXRpZXMgYmV0d2VlbiBITEFTTSBhbmQgdGhlIE1SSSBhc3NlbWJsZXJzLCBzdWNoIGFzIHNlY3Rpb24KLSAqIG5hbWVzLCBsYWNrIG9mIGxlYWRpbmcgLiBpbiBwc2V1ZG8tb3BzLCBEQyBhbmQgRFMsIGV0YyAuLi4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgInN0cnVjLXN5bWJvbC5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL2kzNzAuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvaTM3MC5oIgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIGFzc2VtYmxlciBmb3IgdGhlIFN5c3RlbS8zOTAgQXJjaGl0ZWN0dXJlICAqLwotCi0vKiBUZWxsIHRoZSBtYWluIGNvZGUgd2hhdCB0aGUgZW5kaWFubmVzcyBpcy4gICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0MCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwKLSAgIHRhcmdldHMuICAqLwotCi0jaWZkZWYgT0JKX0VMRgotLyogVGhpcyBzdHJpbmcgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLiAgVGhlIG1hY3JvCi0gICB0Y19jb21tZW50X2NoYXJzIHBvaW50cyB0byB0aGlzLiAgV2UgdXNlIHRoaXMsIHJhdGhlciB0aGFuIHRoZQotICAgdXN1YWwgY29tbWVudF9jaGFycywgc28gdGhhdCB3ZSBjYW4gc3dpdGNoIGZvciBTb2xhcmlzIGNvbnZlbnRpb25zLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGkzNzBfZWFiaV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLWNvbnN0IGNoYXIgKmkzNzBfY29tbWVudF9jaGFycyA9IGkzNzBfZWFiaV9jb21tZW50X2NoYXJzOwotI2Vsc2UKLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotI2VuZGlmCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyoiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEKLSAgIHNpbmdsZSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sICJcCi1TLzM3MCBvcHRpb25zOiAodGhlc2UgaGF2ZSBub3QgeWV0IGJlZW4gdGVzdGVkIGFuZCBtYXkgbm90IHdvcmspIFxuXAotLXUgICAgICAgIAkJaWdub3JlZFxuXAotLW1yZWduYW1lcyAgICAgICAgCUFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcblwKLS1tbm8tcmVnbmFtZXMgICAgICAgIAlEbyBub3QgYWxsb3cgc3ltYm9saWMgbmFtZXMgZm9yIHJlZ2lzdGVyc1xuIik7Ci0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmKHN0cmVhbSwgIlwKLS1tcmVsb2NhdGFibGUgICAgICAgIAlzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUgb3B0aW9uXG5cCi0tbXJlbG9jYXRhYmxlLWxpYiAgICAgICBzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUtbGliIG9wdGlvblxuXAotLVYgICAgICAgIAkJcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG4iKTsKLSNlbmRpZgotfQotCi0MCi1zdGF0aWMgdm9pZCBpMzcwX2J5dGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpMzcwX3RjIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgaTM3MF9lYmNkaWMgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyB2b2lkIGkzNzBfZGMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpMzcwX2RzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgaTM3MF9ybW9kZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGkzNzBfY3NlY3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpMzcwX2RzZWN0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgaTM3MF9sdG9yZyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGkzNzBfdXNpbmcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpMzcwX2Ryb3AgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpMzcwX21ha2VfcmVsYXRpdmUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgZXhwcmVzc2lvblMgKmJhc2VhZGRyKSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGkzNzBfZWxmX3N1ZmZpeCBQQVJBTVMgKChjaGFyICoqLCBleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBpMzcwX2VsZl9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgaTM3MF9lbGZfcmRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpMzcwX2VsZl9sY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGkzNzBfZWxmX3ZhbGlkYXRlX2ZpeCBQQVJBTVMgKChmaXhTICosIHNlZ1QpKTsKLSNlbmRpZgotCi0KLQwKLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgLyogUHNldWRvLW9wcyB3aGljaCBtdXN0IGJlIG92ZXJyaWRkZW4uICAqLwotICB7ICJieXRlIiwgICAgIGkzNzBfYnl0ZSwJMCB9LAotCi0gIHsgImRjIiwgICAgICAgaTM3MF9kYywJMCB9LAotICB7ICJkcyIsICAgICAgIGkzNzBfZHMsCTAgfSwKLSAgeyAicm1vZGUiLCAgICBpMzcwX3Jtb2RlLAkwIH0sCi0gIHsgImNzZWN0IiwgICAgaTM3MF9jc2VjdCwJMCB9LAotICB7ICJkc2VjdCIsICAgIGkzNzBfZHNlY3QsCTAgfSwKLQotICAvKiBlbmFibGUgZWJjZGljIHN0cmluZ3MgZS5nLiBmb3IgMzI3MCBzdXBwb3J0ICovCi0gIHsgImViY2RpYyIsICAgaTM3MF9lYmNkaWMsCTAgfSwKLQotI2lmZGVmIE9CSl9FTEYKLSAgeyAibG9uZyIsICAgICBpMzcwX2VsZl9jb25zLAk0IH0sCi0gIHsgIndvcmQiLCAgICAgaTM3MF9lbGZfY29ucywJNCB9LAotICB7ICJzaG9ydCIsICAgIGkzNzBfZWxmX2NvbnMsCTIgfSwKLSAgeyAicmRhdGEiLCAgICBpMzcwX2VsZl9yZGF0YSwJMCB9LAotICB7ICJyb2RhdGEiLCAgIGkzNzBfZWxmX3JkYXRhLAkwIH0sCi0gIHsgImxjb21tIiwgICAgaTM3MF9lbGZfbGNvbW0sCTAgfSwKLSNlbmRpZgotCi0gIC8qIFRoaXMgcHNldWRvLW9wIGlzIHVzZWQgZXZlbiB3aGVuIG5vdCBnZW5lcmF0aW5nIFhDT0ZGIG91dHB1dC4gICovCi0gIHsgInRjIiwgICAgICAgaTM3MF90YywJMCB9LAotCi0gIC8qIGR1bXAgdGhlIGxpdGVyYWwgcG9vbCAqLwotICB7ICJsdG9yZyIsICAgIGkzNzBfbHRvcmcsCTAgfSwKLQotICAvKiBzdXBwb3J0IHRoZSBobGFzbS1zdHlsZSBVU0lORyBkaXJlY3RpdmUgKi8KLSAgeyAidXNpbmciLCAgICBpMzcwX3VzaW5nLAkwIH0sCi0gIHsgImRyb3AiLCAgICAgaTM3MF9kcm9wLAkwIH0sCi0KLSAgeyBOVUxMLCAgICAgICBOVUxMLAkJMCB9Ci19OwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBXaGV0aGVyIHRvIHVzZSB1c2VyIGZyaWVuZGx5IHJlZ2lzdGVyIG5hbWVzLiAgKi8KLSNkZWZpbmUgVEFSR0VUX1JFR19OQU1FU19QIHRydWUKLQotc3RhdGljIGJvb2xlYW4gcmVnX25hbWVzX3AgPSBUQVJHRVRfUkVHX05BTUVTX1A7Ci0KLXN0YXRpYyBib29sZWFuIHJlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgaTM3MF9zZXRfY3B1IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpMzcwX2luc25fdCBpMzcwX2luc2VydF9vcGVyYW5kCi0gIFBBUkFNUyAoKGkzNzBfaW5zbl90IGluc24sIGNvbnN0IHN0cnVjdCBpMzcwX29wZXJhbmQgKm9wZXJhbmQsIG9mZnNldFQgdmFsKSk7Ci1zdGF0aWMgdm9pZCBpMzcwX21hY3JvIFBBUkFNUyAoKGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IGkzNzBfbWFjcm8gKm1hY3JvKSk7Ci0MCi0vKiBQcmVkZWZpbmVkIHJlZ2lzdGVyIG5hbWVzIGlmIC1tcmVnbmFtZXMgKi8KLS8qIEluIGdlbmVyYWwsIHRoZXJlIGFyZSBsb3RzIG9mIHRoZW0sIGluIGFuIGF0dGVtcHQgdG8gYmUgY29tcGF0aWJsZSAqLwotLyogd2l0aCBhIG51bWJlciBvZiBhc3NlbWJsZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcGRfcmVnCi0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGludCB2YWx1ZTsKLSAgfTsKLQotLyogTGlzdCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgcHJlLWRlZmluZWQ6Ci0KLSAgIEVhY2ggZ2VuZXJhbCByZWdpc3RlciBoYXMgcHJlZGVmaW5lZCBuYW1lcyBvZiB0aGUgZm9ybToKLSAgIDEuIHI8cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0gICAyLiByLjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLQotCi0gICBFYWNoIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGhhcyBwcmVkZWZpbmVkIG5hbWVzIG9mIHRoZSBmb3JtOgotICAgMS4gZjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLSAgIDIuIGYuPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotCi0gICBUaGVyZSBhcmUgb25seSBmb3VyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgYW5kIHRoZXNlIGFyZQotICAgY29tbW9ubHkgbGFiZWxsZWQgMCwyLDQgYW5kIDYuICBUaHVzLCB0aGVyZSBpcyBubyBmMSwgZjMsIGV0Yy4KLQotCi0gICBUaGVyZSBhcmUgaW5kaXZpZHVhbCByZWdpc3RlcnMgYXMgd2VsbDoKLSAgIHJiYXNlIG9yIHIuYmFzZSBoYXMgdGhlIHZhbHVlICAzICAoYmFzZSByZWdpc3RlcikKLSAgIHJwZ3Qgb3Igci5wZ3QgICBoYXMgdGhlIHZhbHVlICA0ICAocGFnZSBvcmlnaW4gdGFibGUgcG9pbnRlcikKLSAgIHJhcmcgb3Igci5hcmcgICBoYXMgdGhlIHZhbHVlIDExICAoYXJndW1lbnQgcG9pbnRlcikKLSAgIHJ0Y2Egb3Igci50Y2EgICBoYXMgdGhlIHZhbHVlIDEyICAodGFibGUgb2YgY29udGVudHMgcG9pbnRlcikKLSAgIHJ0b2Mgb3Igci50b2MgICBoYXMgdGhlIHZhbHVlIDEyICAodGFibGUgb2YgY29udGVudHMgcG9pbnRlcikKLSAgIHNwIG9yIHIuc3AgICAgICBoYXMgdGhlIHZhbHVlIDEzICAoc3RhY2sgcG9pbnRlcikKLSAgIGRzYSBvciByLmRzYSAgICBoYXMgdGhlIHZhbHVlIDEzICAoc3RhY2sgcG9pbnRlcikKLSAgIGxyICAgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDE0ICAobGluayByZWcpCi0KLSAgIFRoZSB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImFyZyIsIDExIH0sICAvKiBBcmd1bWVudCBQb2ludGVyICovCi0gIHsgImJhc2UiLCAzIH0sICAvKiBCYXNlIFJlZyAqLwotCi0gIHsgImYuMCIsIDAgfSwgICAgIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLwotICB7ICJmLjIiLCAyIH0sCi0gIHsgImYuNCIsIDQgfSwKLSAgeyAiZi42IiwgNiB9LAotCi0gIHsgImYwIiwgMCB9LAotICB7ICJmMiIsIDIgfSwKLSAgeyAiZjQiLCA0IH0sCi0gIHsgImY2IiwgNiB9LAotCi0KLSAgeyAiZHNhIiwxMyB9LCAgICAvKiBzdGFjayBwb2ludGVyICovCi0gIHsgImxyIiwgMTQgfSwgICAgLyogTGluayBSZWdpc3RlciAqLwotICB7ICJwZ3QiLCA0IH0sICAgIC8qIFBhZ2UgT3JpZ2luIFRhYmxlIFBvaW50ZXIgKi8KLQotICB7ICJyLjAiLCAwIH0sICAgIC8qIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlcnMgKi8KLSAgeyAici4xIiwgMSB9LAotICB7ICJyLjEwIiwgMTAgfSwKLSAgeyAici4xMSIsIDExIH0sCi0gIHsgInIuMTIiLCAxMiB9LAotICB7ICJyLjEzIiwgMTMgfSwKLSAgeyAici4xNCIsIDE0IH0sCi0gIHsgInIuMTUiLCAxNSB9LAotICB7ICJyLjIiLCAyIH0sCi0gIHsgInIuMyIsIDMgfSwKLSAgeyAici40IiwgNCB9LAotICB7ICJyLjUiLCA1IH0sCi0gIHsgInIuNiIsIDYgfSwKLSAgeyAici43IiwgNyB9LAotICB7ICJyLjgiLCA4IH0sCi0gIHsgInIuOSIsIDkgfSwKLQotICB7ICJyLmFyZyIsIDExIH0sICAvKiBBcmd1bWVudCBQb2ludGVyICovCi0gIHsgInIuYmFzZSIsIDMgfSwgIC8qIEJhc2UgUmVnICovCi0gIHsgInIuZHNhIiwgMTMgfSwgIC8qIFN0YWNrIFBvaW50ZXIgKi8KLSAgeyAici5wZ3QiLCA0IH0sICAgLyogUGFnZSBPcmlnaW4gVGFibGUgUG9pbnRlciAqLwotICB7ICJyLnNwIiwgMTMgfSwgICAvKiBTdGFjayBQb2ludGVyICovCi0KLSAgeyAici50Y2EiLCAxMiB9LCAgLyogUG9pbnRlciB0byB0aGUgdGFibGUgb2YgY29udGVudHMgKi8KLSAgeyAici50b2MiLCAxMiB9LCAgLyogUG9pbnRlciB0byB0aGUgdGFibGUgb2YgY29udGVudHMgKi8KLQotICB7ICJyMCIsIDAgfSwgICAgIC8qIE1vcmUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwotICB7ICJyMSIsIDEgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAicjIiLCAyIH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotCi0gIHsgInJiYXNlIiwgMyB9LCAgLyogQmFzZSBSZWcgKi8KLQotICB7ICJydGNhIiwgMTIgfSwgIC8qIFBvaW50ZXIgdG8gdGhlIHRhYmxlIG9mIGNvbnRlbnRzICovCi0gIHsgInJ0b2MiLCAxMiB9LCAgLyogUG9pbnRlciB0byB0aGUgdGFibGUgb2YgY29udGVudHMgKi8KLQotICB7ICJzcCIsIDEzIH0sICAgLyogU3RhY2sgUG9pbnRlciAqLwotCi19OwotCi0jZGVmaW5lIFJFR19OQU1FX0NOVCAgICAgICAgKHNpemVvZihwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKQotCi0vKiBHaXZlbiBOQU1FLCBmaW5kIHRoZSByZWdpc3RlciBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZSwgcmV0dXJuCi0gICB0aGUgaW50ZWdlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgLTEgb24gZmFpbHVyZS4gICovCi0KLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBwZF9yZWcgKiwgaW50LCBjb25zdCBjaGFyICogbmFtZSkpOwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKHJlZ3MsIHJlZ2NvdW50LCBuYW1lKQotICAgICBjb25zdCBzdHJ1Y3QgcGRfcmVnICpyZWdzOwotICAgICBpbnQgcmVnY291bnQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gcmVnY291bnQgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0gICAgICAgIGxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiByZWdzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotCi0gIHJldHVybiAtMTsKLX0KLQotLyoKLSAqIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiAgICAgICAgSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogICAgICAgIEEgZXhwcmVzc2lvblMuCi0gKiAgICAgIFRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKiAgICAgIFhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICogICAgICAgIElucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluIGl0cwotICogICAgICBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAobmFtZVswXSA9PSAnJScgJiYgaXNhbHBoYSAobmFtZVsxXSkpCi0gICAgbmFtZSA9ICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGVsc2UgaWYgKCFyZWdfbmFtZXNfcCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgd2hpbGUgKCcgJyA9PSAqbmFtZSkKLSAgICBuYW1lID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogaWYgaXRzIGEgbnVtYmVyLCB0cmVhdCBpdCBhcyBhIG51bWJlciAqLwotICAvKiBpZiBpdHMgYWxwaGEsIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmICghaXNhbHBoYSAobmFtZVswXSkpCi0gICAgewotICAgICAgcmVnX251bWJlciA9IGdldF9zaW5nbGVfbnVtYmVyKCk7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAocHJlX2RlZmluZWRfcmVnaXN0ZXJzLCBSRUdfTkFNRV9DTlQsIG5hbWUpOwotICAgIH0KLQotICAvKiBpZiBudW1lcmljLCBtYWtlIHN1cmUgaXRzIG5vdCBvdXQgb2YgYm91bmRzICovCi0gIGlmICgoMCA8PSByZWdfbnVtYmVyKSAmJiAoMTYgPj0gcmVnX251bWJlcikpCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBMb2NhbCB2YXJpYWJsZXMuICAqLwotCi0vKiBUaGUgdHlwZSBvZiBwcm9jZXNzb3Igd2UgYXJlIGFzc2VtYmxpbmcgZm9yLiAgVGhpcyBpcyBvbmUgb3IgbW9yZQotICAgb2YgdGhlIEkzNzBfT1BDT0RFIGZsYWdzIGRlZmluZWQgaW4gb3Bjb2RlL2kzNzAuaC4gICovCi1zdGF0aWMgaW50IGkzNzBfY3B1ID0gMDsKLQotLyogVGhlIGJhc2UgcmVnaXN0ZXIgdG8gdXNlIGZvciBvcGNvZGUgd2l0aCBvcHRpb25hbCBvcGVyYW5kcy4KLSAqIFdlIGRlZmluZSB0d28gb2YgdGhlc2U6ICJ0ZXh0IiBhbmQgIm90aGVyIi4gIE5vcm1hbGx5LCAidGV4dCIKLSAqIHdvdWxkIGdldCB1c2VkIGluIHRoZSAudGV4dCBzZWN0aW9uIGZvciBicmFuY2hlcywgd2hpbGUgIm90aGVyIgotICogZ2V0cyB1c2VkIGluIHRoZSAuZGF0YSBzZWN0aW9uIGZvciBhZGRyZXNzIGNvbnN0YW50cy4KLSAqCi0gKiBUaGUgaWRlYSBvZiBhIHNlY29uZCBiYXNlIHJlZ2lzdGVyIGluIGEgZGlmZmVyZW50IHNlY3Rpb24KLSAqIGlzIGZvcmVpZ24gdG8gdGhlIHVzdWFsIEhMQVNNLXN0eWxlIHNlbWFudGljczsgaG93ZXZlciwgaXQKLSAqIGFsbG93cyB1cyB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGR5bmFtaWNhbGx5IGxvYWRlZCBsaWJyYXJpZXMsCi0gKiBieSBhbGxvd2luZyB1cyB0byBwbGFjZSBhZGRyZXNzIGNvbnN0YW50cyBpbiBhIHNlY3Rpb24gb3RoZXIKLSAqIHRoYW4gdGhlIHRleHQgc2VjdGlvbi4gVGhlICJvdGhlciIgc2VjdGlvbiBuZWVkIG5vdCBiZSB0aGUKLSAqIC5kYXRhIHNlY3Rpb24sIGl0IGNhbiBiZSBhbnkgc2VjdGlvbiB0aGF0IGlzbid0IHRoZSAudGV4dCBzZWN0aW9uLgotICoKLSAqIE5vdGUgdGhhdCBITEFTTSBkZWZpbmVzIGEgbXVsdGlwbGUsIGNvbmN1cnJlbnQgLnVzaW5nIHNlbWFudGljCi0gKiB0aGF0IHdlIGRvIG5vdDogaW4gY2FsY3VsYXRpbmcgb2Zmc2V0cywgaXQgdXNlcyBlaXRoZXIgdGhlIG1vc3QKLSAqIHJlY2VudCAudXNpbmcgZGlyZWN0aXZlLCBvciB0aGUgb25lIHdpdGggdGhlIHNtYWxsZXN0IGRpc3BsYWNlbWVudC4KLSAqIFRoaXMgYWxsb3dzIEhMQVNNIHRvIHN1cHBvcnQgYSBxdWFzaS1ibG9jay1zY29wZS1saWtlIGJlaGF2aW91ci4KLSAqIEhhbmR5IGZvciBwZW9wbGUgd3JpdGluZyBhc3NlbWJseSBieSBoYW5kIC4uLiBidXQgbm90IHN1cHBvcnRlZAotICogYnkgdXMuCi0gKi8KLXN0YXRpYyBpbnQgaTM3MF91c2luZ190ZXh0X3JlZ25vID0gLTE7Ci1zdGF0aWMgaW50IGkzNzBfdXNpbmdfb3RoZXJfcmVnbm8gPSAtMTsKLQotLyogVGhlIGJhc2UgYWRkcmVzcyBmb3IgYWRkcmVzcyBsaXRlcmFscyAqLwotc3RhdGljIGV4cHJlc3Npb25TIGkzNzBfdXNpbmdfdGV4dF9iYXNlYWRkcjsKLXN0YXRpYyBleHByZXNzaW9uUyBpMzcwX3VzaW5nX290aGVyX2Jhc2VhZGRyOwotCi0vKiB0aGUgIm90aGVyIiBzZWN0aW9uLCB1c2VkIG9ubHkgZm9yIHN5bnRheCBlcnJvciBkZXRlY3Rpb24gKi8KLXN0YXRpYyBzZWdUIGkzNzBfb3RoZXJfc2VjdGlvbiA9IHVuZGVmaW5lZF9zZWN0aW9uOwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqaTM3MF9oYXNoOwotCi0vKiBNYWNybyBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICppMzcwX21hY3JvX2hhc2g7Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBXaGF0IHR5cGUgb2Ygc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCB0byB1c2UgKi8KLXN0YXRpYyBlbnVtIHsgU0hMSUJfTk9ORSwgU0hMSUJfUElDLCBTSElMQl9NUkVMT0NBVEFCTEUgfSBzaGxpYiA9IFNITElCX05PTkU7Ci0jZW5kaWYKLQotLyogRmxhZ3MgdG8gc2V0IGluIHRoZSBlbGYgaGVhZGVyICovCi1zdGF0aWMgZmxhZ3dvcmQgaTM3MF9mbGFncyA9IDA7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotY29uc3QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDQ7Ci1jb25zdCBpbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA0OwotI2VuZGlmCi0MCi0jaWZkZWYgT0JKX0VMRgotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImw6dW06SzpWUToiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJ1bToiOwotI2VuZGlmCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ3UnOgotICAgICAgLyogLXUgbWVhbnMgdGhhdCBhbnkgdW5kZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMKLSAgICAgICAgIGV4dGVybmFsLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBmb3IgZ2FzIGFueWhvdy4gICovCi0gICAgICBicmVhazsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlICdLJzoKLSAgICAgIC8qIFJlY29nbml6ZSAtSyBQSUMgKi8KLSAgICAgIGlmIChzdHJjbXAgKGFyZywgIlBJQyIpID09IDAgfHwgc3RyY21wIChhcmcsICJwaWMiKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgc2hsaWIgPSBTSExJQl9QSUM7Ci0gICAgICAgICAgaTM3MF9mbGFncyB8PSBFRl9JMzcwX1JFTE9DQVRBQkxFX0xJQjsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgJ20nOgotCi0gICAgICAvKiAtbTM2MCBtZWFuIHRvIGFzc2VtYmxlIGZvciB0aGUgYW5jaWVudCAzNjAgYXJjaGl0ZWN0dXJlICovCi0gICAgICBpZiAoc3RyY21wIChhcmcsICIzNjAiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAiaTM2MCIpID09IDApCi0JaTM3MF9jcHUgPSBJMzcwX09QQ09ERV8zNjA7Ci0gICAgICAvKiAtbXhhIG1lYW5zIHRvIGFzc2VtYmxlIGZvciB0aGUgSUJNIDM3MCBYQSAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAieGEiKSA9PSAwKQotCWkzNzBfY3B1ID0gSTM3MF9PUENPREVfMzcwX1hBOwotICAgICAgLyogLW1hbnkgbWVhbnMgdG8gYXNzZW1ibGUgZm9yIGFueSBhcmNoaXRlY3R1cmUgKDM3MC9YQSkuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJhbnkiKSA9PSAwKQotCWkzNzBfY3B1ID0gSTM3MF9PUENPREVfMzcwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlZ25hbWVzIikgPT0gMCkKLQlyZWdfbmFtZXNfcCA9IHRydWU7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8tcmVnbmFtZXMiKSA9PSAwKQotCXJlZ19uYW1lc19wID0gZmFsc2U7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICAvKiAtbXJlbG9jYXRhYmxlLy1tcmVsb2NhdGFibGUtbGliIC0tIHdhcm4gYWJvdXQgaW5pdGlhbGl6YXRpb25zIHRoYXQgcmVxdWlyZSByZWxvY2F0aW9uICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlbG9jYXRhYmxlIikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHNobGliID0gU0hJTEJfTVJFTE9DQVRBQkxFOwotICAgICAgICAgIGkzNzBfZmxhZ3MgfD0gRUZfSTM3MF9SRUxPQ0FUQUJMRTsKLSAgICAgICAgfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlbG9jYXRhYmxlLWxpYiIpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBzaGxpYiA9IFNISUxCX01SRUxPQ0FUQUJMRTsKLSAgICAgICAgICBpMzcwX2ZsYWdzIHw9IEVGX0kzNzBfUkVMT0NBVEFCTEVfTElCOwotICAgICAgICB9Ci0KLSNlbmRpZgotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYXNfYmFkICgiaW52YWxpZCBzd2l0Y2ggLW0lcyIsIGFyZyk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogLVY6IFNWUjQgYXJndW1lbnQgdG8gcHJpbnQgdmVyc2lvbiBJRC4gICovCi0gICAgY2FzZSAnVic6Ci0gICAgICBwcmludF92ZXJzaW9uX2lkICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1ReSwgLVFuOiBTVlI0IGFyZ3VtZW50cyBjb250cm9sbGluZyB3aGV0aGVyIGEgLmNvbW1lbnQgc2VjdGlvbgotICAgICAgICAgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLQotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0MCi0vKiBTZXQgaTM3MF9jcHUgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0LgotICAgQ3VycmVudGx5IGRlZmF1bHRzIHRvIHRoZSByZWFzb25hYmxlIHN1cGVyc2V0OwotICAgYnV0IGNhbiBiZSBtYWRlIG1vcmUgZmluZSBncmFpbmVkIGlmIGRlc3JlZC4gKi8KLQotc3RhdGljIHZvaWQKLWkzNzBfc2V0X2NwdSAoKQotewotICBjb25zdCBjaGFyICpkZWZhdWx0X29zICA9IFRBUkdFVF9PUzsKLSAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotCi0gIC8qIG92ZXJyaWRlIHdpdGggdGhlIHN1cGVyc2V0IGZvciB0aGUgbW9tZW50LiAqLwotICBpMzcwX2NwdSA9IEkzNzBfT1BDT0RFX0VTQTM5MF9TVVBFUlNFVDsKLSAgaWYgKGkzNzBfY3B1ID09IDApCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJpMzYwIikgPT0gMCkKLSAgICAgICAgaTM3MF9jcHUgPSBJMzcwX09QQ09ERV8zNjA7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAiaTM3MCIpID09IDApCi0gICAgICAgIGkzNzBfY3B1ID0gSTM3MF9PUENPREVfMzcwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChkZWZhdWx0X2NwdSwgIlhBIikgPT0gMCkKLSAgICAgICAgaTM3MF9jcHUgPSBJMzcwX09QQ09ERV8zNzBfWEE7Ci0gICAgICBlbHNlCi0gICAgICAgIGFzX2ZhdGFsICgiVW5rbm93biBkZWZhdWx0IGNwdSA9ICVzLCBvcyA9ICVzIiwgZGVmYXVsdF9jcHUsIGRlZmF1bHRfb3MpOwotICAgIH0KLX0KLQotLyogRmlndXJlIG91dCB0aGUgQkZEIGFyY2hpdGVjdHVyZSB0byB1c2UuICAqLwotLy8gaGFjayBhbGVydCAtLSBzcGVjaWZ5IHRoZSBkaWZmZXJlbnQgMzcwIGFyY2hpdGVjdHVyZXMKLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi1pMzcwX2FyY2ggKCkKLXsKLSAgIHJldHVybiBiZmRfYXJjaF9pMzcwOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzIHVwLiAgSXQgaXMgY2FsbGVkCi0gICBhZnRlciB0aGUgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkIGFuZCB0aGUgb3V0cHV0IGZpbGUgaGFzIGJlZW4KLSAgIG9wZW5lZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpMzcwX29wY29kZSAqb3A7Ci0gIGNvbnN0IHN0cnVjdCBpMzcwX29wY29kZSAqb3BfZW5kOwotICBjb25zdCBzdHJ1Y3QgaTM3MF9tYWNybyAqbWFjcm87Ci0gIGNvbnN0IHN0cnVjdCBpMzcwX21hY3JvICptYWNyb19lbmQ7Ci0gIGJvb2xlYW4gZHVwX2luc24gPSBmYWxzZTsKLQotICBpMzcwX3NldF9jcHUgKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFNldCB0aGUgRUxGIGZsYWdzIGlmIGRlc2lyZWQuICovCi0gIGlmIChpMzcwX2ZsYWdzKQotICAgIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyAoc3Rkb3V0cHV0LCBpMzcwX2ZsYWdzKTsKLSNlbmRpZgotCi0gIC8qIEluc2VydCB0aGUgb3Bjb2RlcyBpbnRvIGEgaGFzaCB0YWJsZS4gICovCi0gIGkzNzBfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gICBvcF9lbmQgPSBpMzcwX29wY29kZXMgKyBpMzcwX251bV9vcGNvZGVzOwotICAgZm9yIChvcCA9IGkzNzBfb3Bjb2Rlczsgb3AgPCBvcF9lbmQ7IG9wKyspCi0gICAgIHsKLSAgICAgICBrbm93ICgob3AtPm9wY29kZSAmIG9wLT5tYXNrKSA9PSBvcC0+b3Bjb2RlKTsKLQotICAgICAgIGlmICgob3AtPmZsYWdzICYgaTM3MF9jcHUpICE9IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotICAgICAgICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoaTM3MF9oYXNoLCBvcC0+bmFtZSwgKFBUUikgb3ApOwotICAgICAgICAgICBpZiAocmV0dmFsICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgYXNfYmFkICgiSW50ZXJuYWwgYXNzZW1ibGVyIGVycm9yIGZvciBpbnN0cnVjdGlvbiAlcyIsIG9wLT5uYW1lKTsKLSAgICAgICAgICAgICAgIGR1cF9pbnNuID0gdHJ1ZTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgIH0KLQotICAvKiBJbnNlcnQgdGhlIG1hY3JvcyBpbnRvIGEgaGFzaCB0YWJsZS4gICovCi0gIGkzNzBfbWFjcm9faGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIG1hY3JvX2VuZCA9IGkzNzBfbWFjcm9zICsgaTM3MF9udW1fbWFjcm9zOwotICBmb3IgKG1hY3JvID0gaTM3MF9tYWNyb3M7IG1hY3JvIDwgbWFjcm9fZW5kOyBtYWNybysrKQotICAgIHsKLSAgICAgIGlmICgobWFjcm8tPmZsYWdzICYgaTM3MF9jcHUpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLSAgICAgICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoaTM3MF9tYWNyb19oYXNoLCBtYWNyby0+bmFtZSwgKFBUUikgbWFjcm8pOwotICAgICAgICAgIGlmIChyZXR2YWwgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXNfYmFkICgiSW50ZXJuYWwgYXNzZW1ibGVyIGVycm9yIGZvciBtYWNybyAlcyIsIG1hY3JvLT5uYW1lKTsKLSAgICAgICAgICAgICAgZHVwX2luc24gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gIGlmIChkdXBfaW5zbikKLSAgICBhYm9ydCAoKTsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpMzcwX2luc25fdAotaTM3MF9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsKQotICAgICBpMzcwX2luc25fdCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgaTM3MF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLXsKLSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIC8qIHVzZWQgZm9yIDQ4LWJpdCBpbnNuJ3MgKi8KLSAgICAgIGVycm1zZyA9IE5VTEw7Ci0gICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCAobG9uZykgdmFsLCAmZXJybXNnKTsKLSAgICAgIGlmIChlcnJtc2cpCi0gICAgICAgIGFzX2JhZCAoIiVzIiwgZXJybXNnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiB0aGlzIGlzIHVzZWQgb25seSBmb3IgMTYsIDMyIGJpdCBpbnNuJ3MgKi8KLSAgICAgIGluc24uaVswXSB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJICAgIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQwKLSNpZmRlZiBPQkpfRUxGCi0vKiBQYXJzZSBAZ290LCBldGMuIGFuZCByZXR1cm4gdGhlIGRlc2lyZWQgcmVsb2NhdGlvbi4KLSAqIEN1cnJlbnRseSwgaTM3MCBkb2VzIG5vdCBzdXBwb3J0IChkb24ndCByZWFsbHkgbmVlZCB0byBzdXBwb3J0KSBhbnkKLSAqIG9mIHRoZXNlIGZhbmNpZXIgbWFya3VwcyAuLi4gZm9yIGV4YW1wbGUsIG5vIG9uZSBpcyBnb2luZyB0bwotICogd3JpdGUgJ0wgNiw9Vihib2d1cylAZ290JyBpdCBqdXN0IGRvZXNuJ3QgbWFrZSBzZW5zZSAoYXQgbGVhc3QgdG8gbWUpLgotICogU28gYmFzaWNhbGx5LCB3ZSBjb3VsZCBnZXQgYXdheSB3aXRoIHRoaXMgcm91dGluZSByZXR1cm5pbmcKLSAqIEJGRF9SRUxPQ19VTlVTRUQgaW4gYWxsIGNpcmN1bXN0YW5jZXMuICBIb3dldmVyLCBJJ2xsIGxlYXZlCi0gKiBpbiBmb3Igbm93IGluIGNhc2Ugc29tZW9uZSBhbWJpdGlvdXMgZmluZHMgYSBnb29kIHVzZSBmb3IgdGhpcyBzdHVmZiAuLi4KLSAqIHRoaXMgcm91dGluZSB3YXMgcHJldHR5IG11Y2gganVzdCBjb3BpZWQgZnJvbSB0aGUgcG93ZXJwYyBjb2RlIC4uLgotICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1pMzcwX2VsZl9zdWZmaXggKHN0cl9wLCBleHBfcCkKLSAgICAgY2hhciAqKnN0cl9wOwotICAgICBleHByZXNzaW9uUyAqZXhwX3A7Ci17Ci0gIHN0cnVjdCBtYXBfYmZkCi0gIHsKLSAgICBjaGFyICpzdHJpbmc7Ci0gICAgaW50IGxlbmd0aDsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gIH07Ci0KLSAgY2hhciBpZGVudFsyMF07Ci0gIGNoYXIgKnN0ciA9ICpzdHJfcDsKLSAgY2hhciAqc3RyMjsKLSAgaW50IGNoOwotICBpbnQgbGVuOwotICBzdHJ1Y3QgbWFwX2JmZCAqcHRyOwotCi0jZGVmaW5lIE1BUChzdHIscmVsb2MpIHsgc3RyLCBzaXplb2Yoc3RyKS0xLCByZWxvYyB9Ci0KLSAgc3RhdGljIHN0cnVjdCBtYXBfYmZkIG1hcHBpbmdbXSA9Ci0gIHsKLSAgICAvLyAgICAgTUFQICgibCIsICAgICAgICAJQkZEX1JFTE9DX0xPMTYpLAotICAgIC8vICAgICBNQVAgKCJoIiwgICAgICAgIAlCRkRfUkVMT0NfSEkxNiksCi0gICAgLy8gICAgIE1BUCAoImhhIiwgICAgICAgIAlCRkRfUkVMT0NfSEkxNl9TKSwKLSAgICBNQVAgKCJmaXh1cCIsICAgICAgICBCRkRfUkVMT0NfQ1RPUiksICAgICAgICAgIC8qIHdhcm5pbmdzIHdpdGggLW1yZWxvY2F0YWJsZSAqLwotICAgIHsgKGNoYXIgKikwLCAgICAgICAgMCwJQkZEX1JFTE9DX1VOVVNFRCB9Ci0gIH07Ci0KLSAgaWYgKCpzdHIrKyAhPSAnQCcpCi0gICAgcmV0dXJuIEJGRF9SRUxPQ19VTlVTRUQ7Ci0KLSAgZm9yIChjaCA9ICpzdHIsIHN0cjIgPSBpZGVudDsKLSAgICAgICAoc3RyMiA8IGlkZW50ICsgc2l6ZW9mIChpZGVudCkgLSAxCi0gICAgICAgICYmIChpc2FsbnVtIChjaCkgfHwgY2ggPT0gJ0AnKSk7Ci0gICAgICAgY2ggPSAqKytzdHIpCi0gICAgewotICAgICAgKnN0cjIrKyA9IChpc2xvd2VyIChjaCkpID8gY2ggOiB0b2xvd2VyIChjaCk7Ci0gICAgfQotCi0gICpzdHIyID0gJ1wwJzsKLSAgbGVuID0gc3RyMiAtIGlkZW50OwotCi0gIGNoID0gaWRlbnRbMF07Ci0gIGZvciAocHRyID0gJm1hcHBpbmdbMF07IHB0ci0+bGVuZ3RoID4gMDsgcHRyKyspCi0gICAgaWYgKGNoID09IHB0ci0+c3RyaW5nWzBdCi0gICAgICAgICYmIGxlbiA9PSBwdHItPmxlbmd0aAotICAgICAgICAmJiBtZW1jbXAgKGlkZW50LCBwdHItPnN0cmluZywgcHRyLT5sZW5ndGgpID09IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChleHBfcC0+WF9hZGRfbnVtYmVyICE9IDAKLSAgICAgICAgICAgICYmIChwdHItPnJlbG9jID09IEJGRF9SRUxPQ18xNl9HT1RPRkYKLSAgICAgICAgCXx8IHB0ci0+cmVsb2MgPT0gQkZEX1JFTE9DX0xPMTZfR09UT0ZGCi0gICAgICAgIAl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotICAgICAgICAJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRikpCi0gICAgICAgICAgYXNfd2FybiAoImlkZW50aWZpZXIrY29uc3RhbnRAZ290IG1lYW5zIGlkZW50aWZpZXJAZ290K2NvbnN0YW50Iik7Ci0KLSAgICAgICAgLyogTm93IGNoZWNrIGZvciBpZGVudGlmaWVyQHN1ZmZpeCtjb25zdGFudCAqLwotICAgICAgICBpZiAoKnN0ciA9PSAnLScgfHwgKnN0ciA9PSAnKycpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhciAqb3JpZ19saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgICAgICAgZXhwcmVzc2lvblMgbmV3X2V4cDsKLQotICAgICAgICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICAgICAgICAgICAgZXhwcmVzc2lvbiAoJm5ld19leHApOwotICAgICAgICAgICAgaWYgKG5ld19leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgIAlleHBfcC0+WF9hZGRfbnVtYmVyICs9IG5ld19leHAuWF9hZGRfbnVtYmVyOwotICAgICAgICAJc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgmaW5wdXRfbGluZV9wb2ludGVyICE9IHN0cl9wKQotICAgICAgICAgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcmlnX2xpbmU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICpzdHJfcCA9IHN0cjsKLSAgICAgICAgcmV0dXJuIHB0ci0+cmVsb2M7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIEJGRF9SRUxPQ19VTlVTRUQ7Ci19Ci0KLS8qIExpa2Ugbm9ybWFsIC5sb25nLy5zaG9ydC8ud29yZCwgZXhjZXB0IHN1cHBvcnQgQGdvdCwgZXRjLiAqLwotLyogY2xvYmJlcnMgaW5wdXRfbGluZV9wb2ludGVyLCBjaGVja3MgZW5kLW9mLWxpbmUuICovCi1zdGF0aWMgdm9pZAotaTM3MF9lbGZfY29ucyAobmJ5dGVzKQotICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOyAgICAgICAgLyogMT0uYnl0ZSwgMj0ud29yZCwgND0ubG9uZyAqLwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLQotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGV4cHJlc3Npb24gKCZleHApOwotICAgICAgaWYgKGV4cC5YX29wID09IE9fc3ltYm9sCi0gICAgICAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcKLSAgICAgICAgICAmJiAocmVsb2MgPSBpMzcwX2VsZl9zdWZmaXggKCZpbnB1dF9saW5lX3BvaW50ZXIsICZleHApKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQotICAgICAgICB7Ci0gICAgICAgICAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgcmVsb2MpOwotICAgICAgICAgIGludCBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7Ci0KLSAgICAgICAgICBpZiAoc2l6ZSA+IG5ieXRlcykKLSAgICAgICAgICAgIGFzX2JhZCAoIiVzIHJlbG9jYXRpb25zIGRvIG5vdCBmaXQgaW4gJWQgYnl0ZXNcbiIsIHJlbG9jX2hvd3RvLT5uYW1lLCBuYnl0ZXMpOwotCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWdpc3RlciBjaGFyICpwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOwotICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gbmJ5dGVzIC0gc2l6ZTsKLQotICAgICAgICAgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwgc2l6ZSwgJmV4cCwgMCwgcmVsb2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGVtaXRfZXhwciAoJmV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsgICAgICAgIAkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0MCi0vKiBBU0NJSSB0byBFQkNESUMgY29udmVyc2lvbiB0YWJsZS4gICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc2NlYmNbMjU2XSA9Ci17Ci0gLyowMCAgTkwgICAgU0ggICAgU1ggICAgRVggICAgRVQgICAgTlEgICAgQUsgICAgQkwgKi8KLSAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgzNywgMHgyRCwgMHgyRSwgMHgyRiwKLSAvKjA4ICBCUyAgICBIVCAgICBMRiAgICBWVCAgICBGRiAgICBDUiAgICBTTyAgICBTSSAqLwotICAgICAweDE2LCAweDA1LCAweDE1LCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotIC8qMTAgIERMICAgIEQxICAgIEQyICAgIEQzICAgIEQ0ICAgIE5LICAgIFNOICAgIEVCICovCi0gICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4M0MsIDB4M0QsIDB4MzIsIDB4MjYsCi0gLyoxOCAgQ04gICAgRU0gICAgU0IgICAgRUMgICAgRlMgICAgR1MgICAgUlMgICAgVVMgKi8KLSAgICAgMHgxOCwgMHgxOSwgMHgzRiwgMHgyNywgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwKLSAvKjIwICBTUCAgICAgISAgICAgIiAgICAgIyAgICAgJCAgICAgJSAgICAgJiAgICAgJyAqLwotICAgICAweDQwLCAweDVBLCAweDdGLCAweDdCLCAweDVCLCAweDZDLCAweDUwLCAweDdELAotIC8qMjggICAoICAgICApICAgICAqICAgICArICAgICAsICAgICAtICAgIC4gICAgICAvICovCi0gICAgIDB4NEQsIDB4NUQsIDB4NUMsIDB4NEUsIDB4NkIsIDB4NjAsIDB4NEIsIDB4NjEsCi0gLyozMCAgIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgKi8KLSAgICAgMHhGMCwgMHhGMSwgMHhGMiwgMHhGMywgMHhGNCwgMHhGNSwgMHhGNiwgMHhGNywKLSAvKjM4ICAgOCAgICAgOSAgICAgOiAgICAgOyAgICAgPCAgICAgPSAgICAgPiAgICAgPyAqLwotICAgICAweEY4LCAweEY5LCAweDdBLCAweDVFLCAweDRDLCAweDdFLCAweDZFLCAweDZGLAotIC8qNDAgICBAICAgICBBICAgICBCICAgICBDICAgICBEICAgICBFICAgICBGICAgICBHICovCi0gICAgIDB4N0MsIDB4QzEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsCi0gLyo0OCAgIEggICAgIEkgICAgIEogICAgIEsgICAgIEwgICAgIE0gICAgIE4gICAgIE8gKi8KLSAgICAgMHhDOCwgMHhDOSwgMHhEMSwgMHhEMiwgMHhEMywgMHhENCwgMHhENSwgMHhENiwKLSAvKjUwICAgUCAgICAgUSAgICAgUiAgICAgUyAgICAgVCAgICAgVSAgICAgViAgICAgVyAqLwotICAgICAweEQ3LCAweEQ4LCAweEQ5LCAweEUyLCAweEUzLCAweEU0LCAweEU1LCAweEU2LAotIC8qNTggICBYICAgICBZICAgICBaICAgICBbICAgICBcICAgICBdICAgICBeICAgICBfICovCi0gICAgIDB4RTcsIDB4RTgsIDB4RTksIDB4QUQsIDB4RTAsIDB4QkQsIDB4NUYsIDB4NkQsCi0gLyo2MCAgIGAgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgIGcgKi8KLSAgICAgMHg3OSwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKLSAvKjY4ICAgaCAgICAgaSAgICAgaiAgICAgayAgICAgbCAgICAgbSAgICAgbiAgICAgbyAqLwotICAgICAweDg4LCAweDg5LCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LAotIC8qNzAgICBwICAgICBxICAgICByICAgICBzICAgICB0ICAgICB1ICAgICB2ICAgICB3ICovCi0gICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTYsCi0gLyo3OCAgIHggICAgIHkgICAgIHogICAgIHsgICAgIHwgICAgIH0gICAgIH4gICAgREwgKi8KLSAgICAgMHhBNywgMHhBOCwgMHhBOSwgMHhDMCwgMHg0RiwgMHhEMCwgMHhBMSwgMHgwNywKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwKLSAgICAgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHhGRgotfTsKLQotLyogRUJDRElDIHRvIEFTQ0lJIGNvbnZlcnNpb24gdGFibGUuICAqLwotdW5zaWduZWQgY2hhciBlYmNhc2NbMjU2XSA9Ci17Ci0gLyowMCAgTlUgICAgU0ggICAgU1ggICAgRVggICAgUEYgICAgSFQgICAgTEMgICAgREwgKi8KLSAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwOSwgMHgwMCwgMHg3RiwKLSAvKjA4ICAgICAgICAgICAgICBTTSAgICBWVCAgICBGRiAgICBDUiAgICBTTyAgICBTSSAqLwotICAgICAweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotIC8qMTAgIERFICAgIEQxICAgIEQyICAgIFRNICAgIFJTICAgIE5MICAgIEJTICAgIElMICovCi0gICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MEEsIDB4MDgsIDB4MDAsCi0gLyoxOCAgQ04gICAgRU0gICAgQ0MgICAgQzEgICAgRlMgICAgR1MgICAgUlMgICAgVVMgKi8KLSAgICAgMHgxOCwgMHgxOSwgMHgwMCwgMHgwMCwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwKLSAvKjIwICBEUyAgICBTUyAgICBGUyAgICAgICAgICBCUCAgICBMRiAgICBFQiAgICBFQyAqLwotICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDE3LCAweDFCLAotIC8qMjggICAgICAgICAgICAgIFNNICAgIEMyICAgIEVRICAgIEFLICAgIEJMICAgICAgICovCi0gICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDAsCi0gLyozMCAgICAgICAgICAgICAgU1kgICAgICAgICAgUE4gICAgUlMgICAgVUMgICAgRVQgKi8KLSAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwKLSAvKjM4ICAgICAgICAgICAgICAgICAgICBDMyAgICBENCAgICBOSyAgICAgICAgICBTVSAqLwotICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDE1LCAweDAwLCAweDFBLAotIC8qNDAgIFNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gLyo0OCAgICAgICAgICAgICAgICAgICAgIC4gICAgIDwgICAgICggICAgICsgICAgIHwgKi8KLSAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyRSwgMHgzQywgMHgyOCwgMHgyQiwgMHg3QywKLSAvKjUwICAgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotIC8qNTggICAgICAgICAgICAgICAhICAgICAkICAgICAqICAgICApICAgICA7ICAgICBeICovCi0gICAgIDB4MDAsIDB4MDAsIDB4MjEsIDB4MjQsIDB4MkEsIDB4MjksIDB4M0IsIDB4NUUsCi0gLyo2MCAgIC0gICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgMHgyRCwgMHgyRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAvKjY4ICAgICAgICAgICAgICAgICAgICAgLCAgICAgJSAgICAgXyAgICAgPiAgICAgPyAqLwotICAgICAweDAwLCAweDAwLCAweDAwLCAweDJDLCAweDI1LCAweDVGLCAweDNFLCAweDNGLAotIC8qNzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gLyo3OCAgICAgICAgIGAgICAgIDogICAgICMgICAgIEAgICAgICcgICAgID0gICAgICIgKi8KLSAgICAgMHgwMCwgMHg2MCwgMHgzQSwgMHgyMywgMHg0MCwgMHgyNywgMHgzRCwgMHgyMiwKLSAvKjgwICAgICAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAgZyAqLwotICAgICAweDAwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotIC8qODggICBoICAgICBpICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgIDB4NjgsIDB4NjksIDB4MDAsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gLyo5MCAgICAgICAgIGogICAgIGsgICAgIGwgICAgIG0gICAgIG4gICAgIG8gICAgIHAgKi8KLSAgICAgMHgwMCwgMHg2QSwgMHg2QiwgMHg2QywgMHg2RCwgMHg2RSwgMHg2RiwgMHg3MCwKLSAvKjk4ICAgcSAgICAgciAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAweDcxLCAweDcyLCAweDAwLCAweDdELCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotIC8qQTAgICAgICAgICB+ICAgICBzICAgICB0ICAgICB1ICAgICB2ICAgICB3ICAgICB4ICovCi0gICAgIDB4MDAsIDB4N0UsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCi0gLypBOCAgIHkgICAgIHogICAgICAgICAgICAgICAgICAgICAgIFsgICAgICAgICAgICAgKi8KLSAgICAgMHg3OSwgMHg3QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1QiwgMHgwMCwgMHgwMCwKLSAvKkIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotIC8qQjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdICAgICAgICAgICAgICovCi0gICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NUQsIDB4MDAsIDB4MDAsCi0gLypDMCAgIHsgICAgIEEgICAgIEIgICAgIEMgICAgIEQgICAgIEUgICAgIEYgICAgIEcgKi8KLSAgICAgMHg3QiwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywKLSAvKkM4ICAgSCAgICAgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAweDQ4LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotIC8qRDAgICB9ICAgICBKICAgICBLICAgICBMICAgICBNICAgICBOICAgICBPICAgICBQICovCi0gICAgIDB4N0QsIDB4NEEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NEUsIDB4NEYsIDB4NTAsCi0gLypEOCAgIFEgICAgIFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgMHg1MSwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAvKkUwICAgXCAgICAgICAgICAgUyAgICAgVCAgICAgVSAgICAgViAgICAgVyAgICAgWCAqLwotICAgICAweDVDLCAweDAwLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAotIC8qRTggICBZICAgICBaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgIDB4NTksIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gLypGMCAgIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgKi8KLSAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKLSAvKkY4ICAgOCAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAweDM4LCAweDM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGCi19OwotCi0vKiBlYmNkaWMgdHJhbnNsYXRpb24gdGFibGVzIG5lZWRlZCBmb3IgMzI3MCBzdXBwb3J0ICovCi1zdGF0aWMgdm9pZAotaTM3MF9lYmNkaWMgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqcCwgKmVuZDsKLSAgY2hhciBkZWxpbSA9IDA7Ci0gIHNpemVfdCBuYnl0ZXM7Ci0KLSAgbmJ5dGVzID0gc3RybGVuIChpbnB1dF9saW5lX3BvaW50ZXIpOwotICBlbmQgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyBuYnl0ZXM7Ci0gIHdoaWxlICgnXHInID09ICplbmQpIGVuZCAtLTsKLSAgd2hpbGUgKCdcbicgPT0gKmVuZCkgZW5kIC0tOwotCi0gIGRlbGltID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCgnXCcnID09IGRlbGltKSB8fCAoJ1wiJyA9PSBkZWxpbSkpIHsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0gICAgZW5kID0gcmluZGV4IChpbnB1dF9saW5lX3BvaW50ZXIsIGRlbGltKTsKLSAgfQotCi0gIGlmIChlbmQgPiBpbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgewotICAgICAgbmJ5dGVzID0gZW5kIC0gaW5wdXRfbGluZV9wb2ludGVyICsxOwotICAgICAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKLSAgICAgIHdoaWxlIChlbmQgPiBpbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCSAgKnAgPSBhc2NlYmMgWyh1bnNpZ25lZCBjaGFyKSgqaW5wdXRfbGluZV9wb2ludGVyKV07Ci0JICArK3A7ICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICAgICpwID0gJ1wwJzsKLSAgICB9Ci0gIGlmIChkZWxpbSA9PSAqaW5wdXRfbGluZV9wb2ludGVyKSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotDAotLyogc3R1YiBvdXQgYSBjb3VwbGUgb2Ygcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkCi1pMzcwX3Jtb2RlICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGFzX3Rza3RzayAoInJtb2RlIGlnbm9yZWQiKTsKLX0KLQotc3RhdGljIHZvaWQKLWkzNzBfZHNlY3QgKHNlY3QpCi0gICAgIGludCBzZWN0OwotewotICBjaGFyICpzYXZlX2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN0YXRpYyBjaGFyIHNlY3Rpb25bXSA9ICIuZGF0YVxuIjsKLQotICAvKiBKdXN0IHByZXRlbmQgdGhpcyBpcyAuc2VjdGlvbiAuZGF0YSAqLwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzZWN0aW9uOwotICBvYmpfZWxmX3NlY3Rpb24gKHNlY3QpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfbGluZTsKLX0KLQotc3RhdGljIHZvaWQKLWkzNzBfY3NlY3QgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgYXNfdHNrdHNrICgiY3NlY3Qgbm90IHN1cHBvcnRlZCIpOwotfQotCi0MCi0vKiBEQyBEZWZpbmUgQ29uc3QgIGlzIG9ubHkgcGFydGlhbGx5IHN1cHBvcnRlZC4KLSAqIEZvciBzYW1wbGVjb2RlIG9uIHdoYXQgdG8gZG8sIGxvb2sgYXQgaTM3MF9lbGZfY29ucygpIGFib3ZlLgotICogVGhpcyBjb2RlIGhhbmRsZXMgcHNldWRvb3BzIG9mIHRoZSBzdHlsZQotICogREMgICBEJzMuMTQxNTkyNjUzJyAgICMgaW4gc3lzdjQsIC5kb3VibGUgMy4xNDE1OTI2NQotICogREMgICBGJzEnICAgICAgICAgICAgICMgaW4gc3lzdjQsIC5sb25nICAgMQotICovCi1zdGF0aWMgdm9pZAotaTM3MF9kYyh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKiBwLCB0bXBbNTBdOwotICBpbnQgbmJ5dGVzPTA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgY2hhciB0eXBlPTA7Ci0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogZmlndXJlIG91dCB0aGUgc2l6ZSAqLwotICB0eXBlID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ0gnOiAgLyogMTYtYml0ICovCi0gICAgICBuYnl0ZXMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRSc6ICAvKiAzMi1iaXQgKi8KLSAgICBjYXNlICdGJzogIC8qIDMyLWJpdCAqLwotICAgICAgbmJ5dGVzID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0QnOiAgLyogNjQtYml0ICovCi0gICAgICBuYnl0ZXMgPSA4OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoInVuc3VwcG9ydGVkIERDIHR5cGUiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogZ2V0IHJpZCBvZiBwZXNreSBxdW90ZXMgKi8KLSAgaWYgKCdcJycgPT0gKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICB7Ci0gICAgICBjaGFyICogY2xvc2U7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGNsb3NlID0gc3RyY2hyIChpbnB1dF9saW5lX3BvaW50ZXIsICdcJycpOwotICAgICAgaWYgKGNsb3NlKQotCSpjbG9zZT0gJyAnOwotICAgICAgZWxzZQotCWFzX2JhZCAoIm1pc3NpbmcgZW5kLXF1b3RlIik7Ci0gICAgfQotICBpZiAoJ1wiJyA9PSAqaW5wdXRfbGluZV9wb2ludGVyKQotICAgIHsKLSAgICAgIGNoYXIgKiBjbG9zZTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY2xvc2UgPSBzdHJjaHIgKGlucHV0X2xpbmVfcG9pbnRlciwgJ1wiJyk7Ci0gICAgICBpZiAoY2xvc2UpCi0JKmNsb3NlPSAnICc7Ci0gICAgICBlbHNlCi0JYXNfYmFkICgibWlzc2luZyBlbmQtcXVvdGUiKTsKLSAgICB9Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdIJzogIC8qIDE2LWJpdCAqLwotICAgIGNhc2UgJ0YnOiAgLyogMzItYml0ICovCi0gICAgICBleHByZXNzaW9uICgmZXhwKTsKLSAgICAgIGVtaXRfZXhwciAoJmV4cCwgbmJ5dGVzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0UnOiAgLyogMzItYml0ICovCi0gICAgY2FzZSAnRCc6ICAvKiA2NC1iaXQgKi8KLSAgICAgIG1kX2F0b2YgKHR5cGUsIHRtcCwgJm5ieXRlcyk7Ci0gICAgICBwID0gZnJhZ19tb3JlIChuYnl0ZXMpOwotICAgICAgbWVtY3B5IChwLCB0bXAsIG5ieXRlcyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkICgidW5zdXBwb3J0ZWQgREMgdHlwZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0MCi0vKiBwcm92aWRlIG1pbmltYWwgc3VwcG9ydCBmb3IgRFMgRGVmaW5lIFN0b3JhZ2UgKi8KLXN0YXRpYyB2b2lkCi1pMzcwX2RzICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIC8qIERTIDBIIG9yIERTIDBGIG9yIERTIDBEICovCi0gIGlmICgnMCcgPT0gKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICB7Ci0gICAgICBpbnQgYWxpZ25tZW50ID0gMDsgIC8qIGxlZnQgc2hpZnQgMTw8YWxpZ24gKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcisrKQotCXsKLQljYXNlICdIJzogIC8qIDE2LWJpdCAqLwotCSAgYWxpZ25tZW50ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ0YnOiAgLyogMzItYml0ICovCi0JICBhbGlnbm1lbnQgPSAyOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6ICAvKiA2NC1iaXQgKi8KLQkgIGFsaWdubWVudCA9IDM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfYmFkICgidW5zdXBwb3J0ZWQgYWxpZ25tZW50Iik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZnJhZ19hbGlnbiAoYWxpZ25tZW50LCAwLCAwKTsKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIGFsaWdubWVudCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkICgidGhpcyBEUyBmb3JtIG5vdCB5ZXQgc3VwcG9ydGVkIik7Ci0gICAgfQotfQotCi0vKiBTb2xhcmlzIHBzZXVkbyBvcCB0byBjaGFuZ2UgdG8gdGhlIC5yb2RhdGEgc2VjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotaTM3MF9lbGZfcmRhdGEgKHNlY3QpCi0gICAgIGludCBzZWN0OwotewotICBjaGFyICpzYXZlX2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN0YXRpYyBjaGFyIHNlY3Rpb25bXSA9ICIucm9kYXRhXG4iOwotCi0gIC8qIEp1c3QgcHJldGVuZCB0aGlzIGlzIC5zZWN0aW9uIC5yb2RhdGEgKi8KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2VjdGlvbjsKLSAgb2JqX2VsZl9zZWN0aW9uIChzZWN0KTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2xpbmU7Ci19Ci0KLS8qIFBzZXVkbyBvcCB0byBtYWtlIGZpbGUgc2NvcGUgYnNzIGl0ZW1zICovCi1zdGF0aWMgdm9pZAotaTM3MF9lbGZfbGNvbW0odW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIG9mZnNldFQgc2l6ZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgb2Zmc2V0VCBhbGlnbjsKLSAgc2VnVCBvbGRfc2VjOwotICBpbnQgb2xkX3N1YnNlYzsKLSAgY2hhciAqcGZyYWc7Ci0gIGludCBhbGlnbjI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOyAgICAgICAgCS8qIHNraXAgJywnICovCi0gIGlmICgoc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoIi5DT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iLCAobG9uZykgc2l6ZSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gLmxjb21tIGlzIHRoZSBhbGlnbm1lbnQuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYWxpZ24gPSA4OwotICBlbHNlCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKGFsaWduIDw9IDApCi0gICAgICAgIHsKLSAgICAgICAgICBhc193YXJuICgiaWdub3JpbmcgYmFkIGFsaWdubWVudCIpOwotICAgICAgICAgIGFsaWduID0gODsKLSAgICAgICAgfQotICAgIH0KLQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIsCi0gICAgICAgICAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCi0gICAgewotICAgICAgYXNfYmFkICgiTGVuZ3RoIG9mIC5sY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iLAotICAgICAgICAgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwKLSAgICAgICAgICAgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwKLSAgICAgICAgICAgICAgKGxvbmcpIHNpemUpOwotCi0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBhbGxvY2F0ZV9ic3M6ICovCi0gIG9sZF9zZWMgPSBub3dfc2VnOwotICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgaWYgKGFsaWduKQotICAgIHsKLSAgICAgIC8qIGNvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudCAqLwotICAgICAgZm9yIChhbGlnbjIgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKythbGlnbjIpCi0JOwotICAgICAgaWYgKGFsaWduICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBhc19iYWQgKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKTsKLSAgICAgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIGFsaWduMiA9IDA7Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduMik7Ci0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLSAgaWYgKGFsaWduMikKLSAgICBmcmFnX2FsaWduIChhbGlnbjIsIDAsIDApOwotICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0gICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0gIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwgc2l6ZSwKLSAgICAgICAgCSAgICAoY2hhciAqKSAwKTsKLSAgKnBmcmFnID0gMDsKLSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFZhbGlkYXRlIGFueSByZWxvY2F0aW9ucyBlbWl0dGVkIGZvciAtbXJlbG9jYXRhYmxlLCBwb3NzaWJseSBhZGRpbmcKLSAgIGZpeHVwcyBmb3Igd29yZCByZWxvY2F0aW9ucyBpbiB3cml0YWJsZSBzZWdtZW50cywgc28gd2UgY2FuIGFkanVzdAotICAgdGhlbSBhdCBydW50aW1lLiAgKi8KLXN0YXRpYyB2b2lkCi1pMzcwX2VsZl92YWxpZGF0ZV9maXggKGZpeHAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGlmIChmaXhwLT5meF9kb25lIHx8IGZpeHAtPmZ4X3BjcmVsKQotICAgIHJldHVybjsKLQotICBzd2l0Y2ggKHNobGliKQotICAgIHsKLSAgICBjYXNlIFNITElCX05PTkU6Ci0gICAgY2FzZSBTSExJQl9QSUM6Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFNISUxCX01SRUxPQ0FUQUJMRToKLSAgICAgIGlmIChmaXhwLT5meF9yX3R5cGUgPD0gQkZEX1JFTE9DX1VOVVNFRAotICAgICAgICAgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMTZfR09UT0ZGCi0gICAgICAgICAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotICAgICAgICAgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLSAgICAgICAgICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYKLSAgICAgICAgICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyX0JBU0VSRUwKLSAgICAgICAgICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0xPMTZfQkFTRVJFTAotICAgICAgICAgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMCi0gICAgICAgICAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTAotICAgICAgICAgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmdvdDIiKSAhPSAwCi0gICAgICAgICAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZHRvcnMiKSAhPSAwCi0gICAgICAgICAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuY3RvcnMiKSAhPSAwCi0gICAgICAgICAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZml4dXAiKSAhPSAwCi0gICAgICAgICAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuc3RhYiIpICE9IDAKLSAgICAgICAgICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5nY2NfZXhjZXB0X3RhYmxlIikgIT0gMAotICAgICAgICAgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmV4X3NoYXJlZCIpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKHNlZy0+ZmxhZ3MgJiAoU0VDX1JFQURPTkxZIHwgU0VDX0NPREUpKSAhPSAwCi0gICAgICAgICAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfQ1RPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAJCSAgICAiUmVsb2NhdGlvbiBjYW5ub3QgYmUgZG9uZSB3aGVuIHVzaW5nIC1tcmVsb2NhdGFibGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLQotDAotI2RlZmluZSBMSVRFUkFMX1BPT0xfU1VQUE9SVAotI2lmZGVmIExJVEVSQUxfUE9PTF9TVVBQT1JUCi0vKiBQcm92aWRlIHN1cHBvcnQgZm9yIGxpdGVyYWwgcG9vbHMgd2l0aGluIHRoZSB0ZXh0IHNlY3Rpb24uICovCi0vKiBMb29zZWx5IGJhc2VkIG9uIHNpbWlsYXIgY29kZSBmcm9tIHRjLWFybS5jICAqLwotLyoKLSAqIFdlIHdpbGwgdXNlIGZvdXIgc3ltYm9scyB0byBsb2NhdGUgZm91ciBwYXJ0cyBvZiB0aGUgbGl0ZXJhbCBwb29sLgotICogICAgVGhlc2UgZm91ciBzZWN0aW9ucyBjb250YWluIDY0LDMyLDE2IGFuZCA4LWJpdCBjb25zdGFudHM7IHdlIHVzZQotICogICAgZm91ciBzZWN0aW9ucyBzbyB0aGF0IGFsbCBtZW1vcnkgYWNjZXNzIGNhbiBiZSBhcHByb3ByaWF0ZWx5IGFsaWduZWQuCi0gKiAgICBUaGF0IGlzLCB3ZSB3YW50IHRvIGF2b2lkIG1peGluZyB0aGVzZSB0b2dldGhlciBzbyB0aGF0IHdlIGRvbid0Ci0gKiAgICB3YXN0ZSBzcGFjZSBwYWRkaW5nIG91dCB0byBhbGlnbm1lbnRzLiAgVGhlIGZvdXIgcG9pbnRlcnMKLSAqICAgIGxvbmdsb25nX3Bvb2xQLCB3b3JkX3Bvb2xQLCBldGMuIHBvaW50IHRvIGEgc3ltYm9sIGxhYmVsaW5nIHRoZQotICogICAgc3RhcnQgb2YgZWFjaCBwb29sIHBhcnQuCi0gKgotICogbGl0X3Bvb2xfbnVtIGluY3JlbWVudHMgZnJvbSB6ZXJvIHRvIGluZmluaXR5IGFuZCB1bmlxdWVseSBpZCdzCi0gKiAgICAtLSBpdHMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgKl9wb29sUCBzeW1ib2wgbmFtZS4KLSAqLwotCi0jZGVmaW5lIE1BWF9MSVRFUkFMX1BPT0xfU0laRSAxMDI0Ci0KLXR5cGVkZWYgc3RydWN0IGxpdGVyYWxTCi17Ci0gIHN0cnVjdCBleHByZXNzaW9uUyAgZXhwOwotICBjaGFyICogc3ltX25hbWU7Ci0gIGNoYXIgc2l6ZTsgIC8qIDEsMiw0IG9yIDggKi8KLSAgc2hvcnQgb2Zmc2V0OwotfSBsaXRlcmFsVDsKLQotbGl0ZXJhbFQgbGl0ZXJhbHNbTUFYX0xJVEVSQUxfUE9PTF9TSVpFXTsKLWludCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA9IDA7IC8qIE5leHQgZnJlZSBlbnRyeSBpbiB0aGUgcG9vbCAqLwotCi1zdGF0aWMgc3ltYm9sUyAqbG9uZ2xvbmdfcG9vbFAgPSBOVUxMOyAgIC8qIDY0LWJpdCBwb29sIGVudHJpZXMgKi8KLXN0YXRpYyBzeW1ib2xTICp3b3JkX3Bvb2xQID0gTlVMTDsgICAgICAgLyogMzItYml0IHBvb2wgZW50cmllcyAqLwotc3RhdGljIHN5bWJvbFMgKnNob3J0X3Bvb2xQID0gTlVMTDsgICAgICAvKiAxNi1iaXQgcG9vbCBlbnRyaWVzICovCi1zdGF0aWMgc3ltYm9sUyAqYnl0ZV9wb29sUCA9IE5VTEw7ICAgICAgIC8qIDgtYml0ICBwb29sIGVudHJpZXMgKi8KLQotc3RhdGljIGludCBsaXRfcG9vbF9udW0gPSAxOwotCi0vKiBjcmVhdGUgYSBuZXcsIGVtcHR5IHN5bWJvbCAqLwotc3RhdGljIHN5bWJvbFMgKgotc3ltYm9sX21ha2VfZW1wdHkgKHZvaWQpCi17Ci0gIHJldHVybiBzeW1ib2xfY3JlYXRlIChGQUtFX0xBQkVMX05BTUUsIHVuZGVmaW5lZF9zZWN0aW9uLAotICAJCQkodmFsdWVUKSAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotfQotCi0vKiBhZGQgYW4gZXhwcmVzc2lvbiB0byB0aGUgbGl0ZXJhbCBwb29sICovCi1zdGF0aWMgIHZvaWQKLWFkZF90b19saXRfcG9vbCAoZXhwcmVzc2lvblMgKmV4eCwgY2hhciAqbmFtZSwgaW50IHN6KQotewotICBpbnQgbGl0X2NvdW50ID0gMDsKLSAgaW50IG9mZnNldF9pbl9wb29sID0gMDsKLQotICAvKiBzdGFydCBhIG5ldyBwb29sLCBpZiBuZWNlc3NhcnkgKi8KLSAgaWYgKDggPT0gc3ogJiYgTlVMTCA9PSBsb25nbG9uZ19wb29sUCkKLSAgICBsb25nbG9uZ19wb29sUCA9IHN5bWJvbF9tYWtlX2VtcHR5KCk7Ci0gIGVsc2UgaWYgKDQgPT0gc3ogJiYgTlVMTCA9PSB3b3JkX3Bvb2xQKQotICAgIHdvcmRfcG9vbFAgPSBzeW1ib2xfbWFrZV9lbXB0eSgpOwotICBlbHNlIGlmICgyID09IHN6ICYmIE5VTEwgPT0gc2hvcnRfcG9vbFApCi0gICAgc2hvcnRfcG9vbFAgPSBzeW1ib2xfbWFrZV9lbXB0eSgpOwotICBlbHNlIGlmICgxID09IHN6ICYmIE5VTEwgPT0gYnl0ZV9wb29sUCkKLSAgICBieXRlX3Bvb2xQID0gc3ltYm9sX21ha2VfZW1wdHkoKTsKLQotICAvKiBDaGVjayBpZiB0aGlzIGxpdGVyYWwgdmFsdWUgaXMgYWxyZWFkeSBpbiB0aGUgcG9vbDogKi8KLSAgLyogaGFjayBhbGVydCAtLSB3ZSBzaG91bGQgcHJvYmFibHkgYmUgY2hlY2tpbmcgZXhwcmVzc2lvbnMKLSAgICogb2YgdHlwZSBPX3N5bWJvbCBhcyB3ZWxsIC4uLiAgKi8KLSAgLyogaGFjayBhbGVydCBYWFggdGhpcyBpcyBwcm9iYWJseShjZXJ0YWlubHk/KSBicm9rZW4gZm9yIE9fYmlnLAotICAgKiB3aGljaCBpbmNsdWRlcyA2NC1iaXQgbG9uZy1sb25ncyAuLi4KLSAgICovCi0gIHdoaWxlIChsaXRfY291bnQgPCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkKLSAgICB7Ci0gICAgICBpZiAoZXh4LT5YX29wID09IE9fY29uc3RhbnQKLSAgICAgICAgICAmJiBsaXRlcmFsc1tsaXRfY291bnRdLmV4cC5YX29wID09IGV4eC0+WF9vcAotICAgICAgICAgICYmIGxpdGVyYWxzW2xpdF9jb3VudF0uZXhwLlhfYWRkX251bWJlciA9PSBleHgtPlhfYWRkX251bWJlcgotICAgICAgICAgICYmIGxpdGVyYWxzW2xpdF9jb3VudF0uZXhwLlhfdW5zaWduZWQgPT0gZXh4LT5YX3Vuc2lnbmVkCi0gICAgICAgICAgJiYgbGl0ZXJhbHNbbGl0X2NvdW50XS5zaXplID09IHN6KQotICAgICAgICBicmVhazsKLSAgICAgIGVsc2UgaWYgKGxpdGVyYWxzW2xpdF9jb3VudF0uc3ltX25hbWUKLQkgICAgICAgJiYgbmFtZQotCSAgICAgICAmJiAhc3RyY21wIChuYW1lLCBsaXRlcmFsc1tsaXRfY291bnRdLnN5bV9uYW1lKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAoc3ogPT0gbGl0ZXJhbHNbbGl0X2NvdW50XS5zaXplKQotCW9mZnNldF9pbl9wb29sICs9IHN6OwotICAgICAgbGl0X2NvdW50ICsrOwotICAgIH0KLQotICBpZiAobGl0X2NvdW50ID09IG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlKSAvKiBuZXcgZW50cnkgKi8KLSAgICB7Ci0gICAgICBpZiAobmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UgPiBNQVhfTElURVJBTF9QT09MX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBhc19iYWQoIkxpdGVyYWwgUG9vbCBPdmVyZmxvdyIpOwotICAgICAgICB9Ci0KLSAgICAgIGxpdGVyYWxzW25leHRfbGl0ZXJhbF9wb29sX3BsYWNlXS5leHAgPSAqZXh4OwotICAgICAgbGl0ZXJhbHNbbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2VdLnNpemUgPSBzejsKLSAgICAgIGxpdGVyYWxzW25leHRfbGl0ZXJhbF9wb29sX3BsYWNlXS5vZmZzZXQgPSBvZmZzZXRfaW5fcG9vbDsKLSAgICAgIGlmIChuYW1lKQotCXsKLQkgIGxpdGVyYWxzW25leHRfbGl0ZXJhbF9wb29sX3BsYWNlXS5zeW1fbmFtZSA9IHN0cmR1cCAobmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxpdGVyYWxzW25leHRfbGl0ZXJhbF9wb29sX3BsYWNlXS5zeW1fbmFtZSA9IE5VTEw7Ci0JfQotICAgICAgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UrKzsKLSAgICB9Ci0KLSAgLyogPz8/X3Bvb2xQIHBvaW50cyB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIGxpdGVyYWwgcG9vbC4KLSAgICogWF9hZGRfbnVtYmVyIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5pbmcgb2YgdGhlCi0gICAqIGxpdGVyYWwgcG9vbCB0byB0aGlzIGV4cHIgbWludXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBtb3N0Ci0gICAqIHJlY2VudCAudXNpbmcgZGlyZWN0aXZlLiAgVGh1cywgdGhlIGdyYW5kIHRvdGFsIHZhbHVlIG9mIHRoZQotICAgKiBleHByZXNzaW9uIGlzIHRoZSBkaXN0YW5jZSBmcm9tIC51c2luZyB0byB0aGUgbGl0ZXJhbC4KLSAgICovCi0gIGlmICg4ID09IHN6KQotICAgIGV4eC0+WF9hZGRfc3ltYm9sID0gbG9uZ2xvbmdfcG9vbFA7Ci0gIGVsc2UgaWYgKDQgPT0gc3opCi0gICAgZXh4LT5YX2FkZF9zeW1ib2wgPSB3b3JkX3Bvb2xQOwotICBlbHNlIGlmICgyID09IHN6KQotICAgIGV4eC0+WF9hZGRfc3ltYm9sID0gc2hvcnRfcG9vbFA7Ci0gIGVsc2UgaWYgKDEgPT0gc3opCi0gICAgZXh4LT5YX2FkZF9zeW1ib2wgPSBieXRlX3Bvb2xQOwotICBleHgtPlhfYWRkX251bWJlciA9IG9mZnNldF9pbl9wb29sOwotICBleHgtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQotICAvKiBJZiB0aGUgdXNlciBoYXMgc2V0IHVwIGEgYmFzZSByZWcgaW4gYW5vdGhlciBzZWN0aW9uLAotICAgKiB1c2UgdGhhdDsgb3RoZXJ3aXNlIHVzZSB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLSAgaWYgKDAgPCBpMzcwX3VzaW5nX290aGVyX3JlZ25vKQotICAgIHsKLSAgICAgIGkzNzBfbWFrZV9yZWxhdGl2ZSAoZXh4LCAmaTM3MF91c2luZ19vdGhlcl9iYXNlYWRkcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaTM3MF9tYWtlX3JlbGF0aXZlIChleHgsICZpMzcwX3VzaW5nX3RleHRfYmFzZWFkZHIpOwotICAgIH0KLX0KLQotLyogVGhlIHN5bWJvbCBzZXR1cCBmb3IgdGhlIGxpdGVyYWwgcG9vbCBpcyBkb25lIGluIHR3byBzdGVwcy4gIEZpcnN0LAotICogYSBzeW1ib2wgdGhhdCByZXByZXNlbnRzIHRoZSBzdGFydCBvZiB0aGUgbGl0ZXJhbCBwb29sIGlzIGNyZWF0ZWQsCi0gKiBhYm92ZSwgaW4gdGhlIGFkZF90b19wb29sKCkgcm91dGluZS4gVGhpcyBzeW0gPz8/X3Bvb2xQLgotICogSG93ZXZlciwgd2UgZG9uJ3Qga25vdyB3aGF0IGZyYWdtZW50IGl0cyBpbiB1bnRpbCBhIGJpdCBsYXRlci4KLSAqIFNvIHdlIGRlZmVyIHRoZSBmcmFnX25vdyB0aGluZywgYW5kIHRoZSBzeW1ib2wgbmFtZSwgdW50aWwgLmx0b3JnIHRpbWUKLSAqLwotCi0vKiBDYW4ndCB1c2Ugc3ltYm9sX25ldyBoZXJlLCBzbyBoYXZlIHRvIGNyZWF0ZSBhIHN5bWJvbCBhbmQgdGhlbiBhdAotICAgYSBsYXRlciBkYXRlIGFzc2lnbiBpdCBhIHZhbHVlLiBUaGF0cyB3aGF0IHRoZXNlIGZ1bmN0aW9ucyBkbyAqLwotc3RhdGljIHZvaWQKLXN5bWJvbF9sb2NhdGUgKHN5bWJvbFAsIG5hbWUsIHNlZ21lbnQsIHZhbHUsIGZyYWcpCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7CQkvKiBJdCBpcyBjb3BpZWQsIHRoZSBjYWxsZXIgY2FuIG1vZGlmeSAqLwotICAgICBzZWdUIHNlZ21lbnQ7CQkvKiBTZWdtZW50IGlkZW50aWZpZXIgKFNFR188c29tZXRoaW5nPikgKi8KLSAgICAgdmFsdWVUIHZhbHU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBBc3NvY2lhdGVkIGZyYWdtZW50ICovCi17Ci0gIHNpemVfdCBuYW1lX2xlbmd0aDsKLSAgY2hhciAqcHJlc2VydmVkX2NvcHlfb2ZfbmFtZTsKLQotICBuYW1lX2xlbmd0aCA9IHN0cmxlbiAobmFtZSkgKyAxOyAgICAgIC8qICsxIGZvciBcMCAqLwotICBvYnN0YWNrX2dyb3cgKCZub3RlcywgbmFtZSwgbmFtZV9sZW5ndGgpOwotICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7Ci0KLSAgU19TRVRfTkFNRSAoc3ltYm9sUCwgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSk7Ci0KLSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2VnbWVudCk7Ci0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCB2YWx1KTsKLSAgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMoc3ltYm9sUCk7Ci0KLSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnKTsKLQotICAvKgotICAgKiBMaW5rIHRvIGVuZCBvZiBzeW1ib2wgY2hhaW4uCi0gICAqLwotICB7Ci0gICAgZXh0ZXJuIGludCBzeW1ib2xfdGFibGVfZnJvemVuOwotICAgIGlmIChzeW1ib2xfdGFibGVfZnJvemVuKQotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICBzeW1ib2xfYXBwZW5kIChzeW1ib2xQLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gIG9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotCi0jaWZkZWYgdGNfc3ltYm9sX25ld19ob29rCi0gIHRjX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0jZW5kaWYKLQotI2RlZmluZSBERUJVR19TWU1TCi0jaWZkZWYgREVCVUdfU1lNUwotICB2ZXJpZnlfc3ltYm9sX2NoYWluKHN5bWJvbF9yb290UCwgc3ltYm9sX2xhc3RQKTsKLSNlbmRpZiAvKiBERUJVR19TWU1TICovCi19Ci0KLS8qIGkzNzBfYWRkcl9vZmZzZXQoKSB3aWxsIGNvbnZlcnQgb3BlcmFuZCBleHByZXNzaW9ucwotICogdGhhdCBhcHBlYXIgdG8gYmUgYWJzb2x1dGUgaW50byB0aGllciBiYXNlLXJlZ2lzdGVyCi0gKiByZWxhdGl2ZSBmb3JtLiAgVGhlc2UgZXhwcmVzc2lvbnMgY29tZSBpbiB0d28gdHlwZXM6Ci0gKgotICogKDEpIG9mIHRoZSBmb3JtICIqICsgY29uc3QiICogd2hlcmUgIioiIG1lYW5zCi0gKiByZWxhdGl2ZSBvZmZzZXQgc2luY2UgdGhlIGxhc3QgdXNpbmcKLSAqIGkuZS4gIioiIG1lYW5zICIuLXVzaW5nX2Jhc2VhZGRyIgotICoKLSAqICgyKSBsYWJlbHMsIHdoaWNoIGFyZSBuZXZlciBhYnNvbHV0ZSwgYnV0IGFyZSBhbHdheXMKLSAqIHJlbGF0aXZlIHRvIHRoZSBsYXN0ICJ1c2luZyIuICBBbnl0aGluZyB3aXRoIGFuIGFscGhhCi0gKiBjaGFyYWN0ZXIgaXMgY29uc2lkZXJlZCB0byBiZSBhIGxhYmVsIChzaW5jZSBzeW1ib2xzCi0gKiBjYW4gbmV2ZXIgYmUgb3BlcmFuZHMpLCBhbmQgc2luY2Ugd2UndmUgYWxyZWFkeSBoYW5kbGVkCi0gKiByZWdpc3RlciBvcGVyYW5kcy4gRm9yIGV4YW1wbGUsICJCTCAuTDMzIiBicmFuY2ggbG93Ci0gKiB0byAuTDMzIFJYIGZvcm0gaW5zbiBmcmVxdWVudGx5IHRlcm1pbmF0ZXMgZm9yLWxvb3BzLAotICovCi1zdGF0aWMgYm9vbGVhbgotaTM3MF9hZGRyX29mZnNldCAoZXhwcmVzc2lvblMgKmV4eCkKLXsKLSAgY2hhciAqZG90LCAqbGFiOwotICBpbnQgaXNsYWJlbCA9IDA7Ci0gIGludCBhbGxfZGlnaXRzID0gMDsKLQotICAvKiBzZWFyY2ggZm9yIGEgbGFiZWw7IGFueXRoaW5nIHdpdGggYW4gYWxwaGEgY2hhciB3aWxsIGRvICovCi0gIC8qIGxvY2FsIGxhYmVscyBjb25zaXN0IG9mIE4gZGlnaXRzIGZvbGxvd2VkIGJ5IGVpdGhlciBiIG9yIGYgKi8KLSAgbGFiID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoKmxhYiAmJiAoJywnICE9ICpsYWIpICYmICgnKCcgIT0gKmxhYikpCi0gICAgewotICAgICAgaWYgKGlzZGlnaXQoKmxhYikpCi0JewotCSAgYWxsX2RpZ2l0cyA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNhbHBoYSgqbGFiKSkKLQl7Ci0JICBpZiAoIWFsbF9kaWdpdHMpCi0JICAgIHsKLQkgICAgICBpc2xhYmVsID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZWxzZSBpZiAoKCdmJyA9PSAqbGFiKSB8fCAoJ2InID09ICpsYWIpKQotCSAgICB7Ci0JICAgICAgaXNsYWJlbCA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChhbGxfZGlnaXRzKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBlbHNlIGlmICgnLicgIT0gKmxhYikKLSAgICAgICAgYnJlYWs7Ci0gICAgICArK2xhYjsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIG9wZXJhbmQgaGFzIGEgKiBpbiBpdCAqLwotICBkb3QgPSBzdHJjaHIgKGlucHV0X2xpbmVfcG9pbnRlciwgJyonKTsKLQotICBpZiAoIWRvdCAmJiAhaXNsYWJlbCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogcmVwbGFjZSAqIHdpdGggLiBhbmQgbGV0IGV4cHIgbXVuY2ggb24gaXQuICAqLwotICBpZiAoZG90KQotICAgICpkb3QgPSAnLic7Ci0gIGV4cHJlc3Npb24gKGV4eCk7Ci0KLSAgLyogT0ssIG5vdyB3ZSBoYXZlIHRvIHN1YnRyYWN0IHRoZSAidXNpbmciIGxvY2F0aW9uICAqLwotICAvKiBub3JtYWxseSBicmFuY2hlcyBhcHBlYXIgaW4gdGhlIHRleHQgc2VjdGlvbiBvbmx5Li4uICovCi0gIGlmICgwID09IHN0cm5jbXAgKG5vd19zZWctPm5hbWUsICIudGV4dCIsIDUpIHx8IDAgPiBpMzcwX3VzaW5nX290aGVyX3JlZ25vKQotICAgIHsKLSAgICAgIGkzNzBfbWFrZV9yZWxhdGl2ZSAoZXh4LCAmaTM3MF91c2luZ190ZXh0X2Jhc2VhZGRyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpMzcwX21ha2VfcmVsYXRpdmUgKGV4eCwgJmkzNzBfdXNpbmdfb3RoZXJfYmFzZWFkZHIpOwotICAgIH0KLQotICAvKiBwdXQgdGhlICogYmFjayAqLwotICBpZiAoZG90KQotICAgICpkb3QgPSAnKic7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIGhhbmRsZSBhZGRyZXNzIGNvbnN0YW50cyBvZiB2YXJpb3VzIHNvcnRzICovCi0vKiBUaGUgY3VycmVudGx5IHN1cHBvcnRlZCB0eXBlcyBhcmUKLSAqICAgID1BKHNvbWVfc3ltYikKLSAqICAgID1WKHNvbWVfZXh0ZXJuKQotICogICAgPVgnZGVhZGJlZWYnICAgIGhleGFkZWNpbWFsCi0gKiAgICA9RicxMjM0JyAgICAgICAgMzItYml0IGNvbnN0IGludAotICogICAgPUgnMTIzNCcgICAgICAgIDE2LWJpdCBjb25zdCBpbnQKLSAqLwotc3RhdGljIGJvb2xlYW4KLWkzNzBfYWRkcl9jb25zIChleHByZXNzaW9uUyAqZXhwKQotewotICBjaGFyICpuYW1lOwotICBjaGFyICpzeW1fbmFtZSwgZGVsaW07Ci0gIGludCBuYW1lX2xlbjsKLSAgaW50IGhleF9sZW49MDsKLSAgaW50IGNvbnNfbGVuPTA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgc3ltX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIGlmIChuYW1lWzBdID09ICc9JyAmJiBpc2FscGhhIChuYW1lWzFdKSkKLSAgICB7Ci0gICAgICBuYW1lID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc3dpdGNoIChuYW1lWzBdKQotICAgIHsKLSAgICBjYXNlICdBJzoKLSAgICBjYXNlICdWJzoKLSAgICAgIC8qIEEgPT0gYWRkcmVzcy1vZiAqLwotICAgICAgLyogViA9PSBleHRlcm4gKi8KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZXhwcmVzc2lvbiAoZXhwKTsKLQotICAgICAgLyogd2UgdXNlIGEgc2ltcGxlIHN0cmluZyBuYW1lIHRvIGNvbGxhcHNlIHRvZ2V0aGVyCi0gICAgICAgKiBtdWx0aXBsZSByZWZyZW5jZXMgdG8gdGhlIHNhbWUgYWRkcmVzcyBsaXRlcmFsCi0gICAgICAgKi8KLSAgICAgIG5hbWVfbGVuID0gc3RyY3NwbiAoc3ltX25hbWUsICIsICIpOwotICAgICAgZGVsaW0gPSAqKHN5bV9uYW1lICsgbmFtZV9sZW4pOwotICAgICAgKihzeW1fbmFtZSArIG5hbWVfbGVuKSA9IDB4MDsKLSAgICAgIGFkZF90b19saXRfcG9vbCAoZXhwLCBzeW1fbmFtZSwgNCk7Ci0gICAgICAqKHN5bV9uYW1lICsgbmFtZV9sZW4pID0gZGVsaW07Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0gnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ1gnOgotICAgIGNhc2UgJ0UnOiAgLyogc2luZ2xlLXByZWNpc2lvbiBmbG9hdCBwb2ludCAqLwotICAgIGNhc2UgJ0QnOiAgLyogZG91YmxlLXByZWNpc2lvbiBmbG9hdCBwb2ludCAqLwotCi0gICAgICAvKiBIID09IDE2LWJpdCBmaXhlZC1wb2ludCBjb25zdDsgZXhwcmVzc2lvbiBtdXN0IGJlIGNvbnN0ICovCi0gICAgICAvKiBGID09IGZpeGVkLXBvaW50IGNvbnN0OyBleHByZXNzaW9uIG11c3QgYmUgY29uc3QgKi8KLSAgICAgIC8qIFggPT0gZml4ZWQtcG9pbnQgY29uc3Q7IGV4cHJlc3Npb24gbXVzdCBiZSBjb25zdCAqLwotICAgICAgaWYgKCdIJyA9PSBuYW1lWzBdKSBjb25zX2xlbiA9IDI7Ci0gICAgICBlbHNlIGlmICgnRicgPT0gbmFtZVswXSkgY29uc19sZW4gPSA0OwotICAgICAgZWxzZSBpZiAoJ1gnID09IG5hbWVbMF0pIGNvbnNfbGVuID0gLTE7Ci0gICAgICBlbHNlIGlmICgnRScgPT0gbmFtZVswXSkgY29uc19sZW4gPSA0OwotICAgICAgZWxzZSBpZiAoJ0QnID09IG5hbWVbMF0pIGNvbnNfbGVuID0gODsKLQotICAgICAgLyogZXh0cmFjdCBsZW5ndGgsIGlmIGl0IGlzIHByZXNlbnQ7IGhhY2sgYWxlcnQgLS0gYXNzdW1lIHNpbmdsZS1kaWdpdAotICAgICAgICogbGVuZ3RoICovCi0gICAgICBpZiAoJ0wnID09IG5hbWVbMV0pCi0JewotCSAgY29uc19sZW4gPSBuYW1lWzJdIC0gJzAnOyAgLyogc2hvdWxkIHdvcmsgZm9yIGFzY2lpIGFuZCBlYmNkaWMgKi8KLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCX0KLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIC8qIGdldCByaWQgb2YgcGVza3kgcXVvdGVzICovCi0gICAgICBpZiAoJ1wnJyA9PSAqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQkgIGNoYXIgKiBjbG9zZTsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgY2xvc2UgPSBzdHJjaHIgKGlucHV0X2xpbmVfcG9pbnRlciwgJ1wnJyk7Ci0JICBpZiAoY2xvc2UpCi0JICAgICpjbG9zZT0gJyAnOwotCSAgZWxzZQotCSAgICBhc19iYWQgKCJtaXNzaW5nIGVuZC1xdW90ZSIpOwotCX0KLSAgICAgIGlmICgnXCInID09ICppbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCSAgY2hhciAqIGNsb3NlOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjbG9zZSA9IHN0cmNociAoaW5wdXRfbGluZV9wb2ludGVyLCAnXCInKTsKLQkgIGlmIChjbG9zZSkKLQkgICAgKmNsb3NlPSAnICc7Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoIm1pc3NpbmcgZW5kLXF1b3RlIik7Ci0JfQotICAgICAgaWYgKCgnWCcgPT0gbmFtZVswXSkgfHwgKCdFJyA9PSBuYW1lWzBdKSB8fCAoJ0QnID09IG5hbWVbMF0pKQotCXsKLQkgIGNoYXIgdG1wWzUwXTsKLQkgIGNoYXIgKnNhdmU7Ci0KLQkgIC8qIFRoZSBsZW5ndGggb2YgaGV4IGNvbnN0YW50cyBpcyBzcGVjaWZpZWQgZGlyZWN0bHkgd2l0aCBMLAotCSAgICogb3IgaW1wbGllZCB0aHJvdWdoIHRoZSBudW1iZXIgb2YgaGV4IGRpZ2l0cy4gRm9yIGV4YW1wbGU6Ci0JICAgKiA9WCdBQicgICAgICAgb25lIGJ5dGUKLQkgICAqID1YJ2FiY2QnICAgICB0d28gYnl0ZXMKLQkgICAqID1YJzAwMDAwMEFCJyBmb3VyIGJ5dGVzCi0JICAgKiA9WEw0J0FCJyAgICAgZm91ciBieXRlcywgbGVmdC1wYWRkZWQgd2l0aG4gemVybwotCSAgICovCi0JICBpZiAoKCdYJyA9PSBuYW1lWzBdKSAmJiAoMCA+IGNvbnNfbGVuKSkKLQkgICAgewotCSAgICAgIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgd2hpbGUgKCpzYXZlKQotCQl7Ci0JCSAgaWYgKGlzeGRpZ2l0KCpzYXZlKSkKLQkJICAgIGhleF9sZW4rKzsKLQkJICBzYXZlKys7Ci0JCX0KLQkgICAgICBjb25zX2xlbiA9IChoZXhfbGVuKzEpIC8yOwotCSAgICB9Ci0JICAvKiBJIGJlbGVpdmUgdGhpcyB3b3JrcyBldmVuIGZvciA9WEw4J2RhZGEwMDAwYmVlZWJhYWEnCi0JICAgKiB3aGljaCBzaG91bGQgcGFyc2Ugb3V0IHRvIFhfb3AgPT0gT19iaWcKLQkgICAqIE5vdGUgdGhhdCBmbG9hdHMgYW5kIGRvdWJsZXMgZ2V0IHJlcHJlc2VudGVkIGFzCi0JICAgKiAwZDMuMTQxNTkyNjUzNTg5NzkgIG9yIDBmIDIuNwotCSAgICovCi0JICB0bXBbMF0gPSAnMCc7Ci0JICB0bXBbMV0gPSBuYW1lWzBdOwotCSAgdG1wWzJdID0gMDsKLQkgIHN0cmNhdCAodG1wLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRtcDsKLQkgIGV4cHJlc3Npb24gKGV4cCk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlICsgKGlucHV0X2xpbmVfcG9pbnRlci10bXAtMik7Ci0KLQkgIC8qIGZpeCB1cCBsZW5ndGhzIGZvciBmbG9hdHMgYW5kIGRvdWJsZXMgKi8KLQkgIGlmIChPX2JpZyA9PSBleHAtPlhfb3ApCi0JICAgIHsKLQkgICAgICBleHAtPlhfYWRkX251bWJlciA9IGNvbnNfbGVuIC8gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByZXNzaW9uIChleHApOwotCX0KLSAgICAgIC8qIE9fYmlnIG9jY3VycyB3aGVuIG1vcmUgdGhhbiA0IGJ5dGVzIHdvcnRoIGdldHMgcGFyc2VkICovCi0gICAgICBpZiAoKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KSAmJiAoZXhwLT5YX29wICE9IE9fYmlnKSkKLQl7Ci0JICBhc19iYWQgKCJleHByZXNzaW9uIG5vdCBhIGNvbnN0YW50Iik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYWRkX3RvX2xpdF9wb29sIChleHAsIDB4MCwgY29uc19sZW4pOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkICgiVW5rbm93bi91bnN1cHBvcnRlZCBhZGRyZXNzIGxpdGVyYWwgdHlwZSIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogRHVtcCB0aGUgY29udGVudHMgb2YgdGhlIGxpdGVyYWwgcG9vbCB0aGF0IHdlJ3ZlIGFjY3VtdWxhdGVkIHNvIGZhci4KLSAqIFRoaXMgYWxpZ25zIHRoZSBwb29sIHRvIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGxpdGVyYWwgaW4gdGhlIHBvb2wuCi0gKi8KLQotc3RhdGljIHZvaWQKLWkzNzBfbHRvcmcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IGxpdHNpemU7Ci0gIGludCBsaXRfY291bnQgPSAwOwotICBpbnQgYmlnZ2VzdF9saXRlcmFsX3NpemUgPSAwOwotICBpbnQgYmlnZ2VzdF9hbGlnbiA9IDA7Ci0gIGNoYXIgcG9vbF9uYW1lWzIwXTsKLQotICBpZiAoc3RybmNtcCAobm93X3NlZy0+bmFtZSwgIi50ZXh0IiwgNSkpCi0gICAgewotICAgICAgaWYgKGkzNzBfb3RoZXJfc2VjdGlvbiA9PSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGFzX2JhZCAoIi5sdG9yZyB3aXRob3V0IHByaW9yIC51c2luZyBpbiBzZWN0aW9uICVzIiwKLQkJICBub3dfc2VnLT5uYW1lKTsKLSAgICAgICAgfQotICAgICAgaWYgKGkzNzBfb3RoZXJfc2VjdGlvbiAhPSBub3dfc2VnKQotICAgICAgICB7Ci0JICBhc19iYWQgKCIubHRvcmcgaW4gc2VjdGlvbiAlcyBwYWlyZWQgdG8gLnVzaW5nIGluIHNlY3Rpb24gJXMiLAotCQkgIG5vd19zZWctPm5hbWUsIGkzNzBfb3RoZXJfc2VjdGlvbi0+bmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIGlmICghIGxvbmdsb25nX3Bvb2xQCi0gICAgICAmJiAhIHdvcmRfcG9vbFAKLSAgICAgICYmICEgc2hvcnRfcG9vbFAKLSAgICAgICYmICEgYnl0ZV9wb29sUCkKLSAgICB7Ci0gICAgICAvKiBOb3RoaW5nIHRvIGRvICovCi0gICAgICAvKiBhc190c2t0c2sgKCJOb3RoaW5nIHRvIHB1dCBpbiB0aGUgcG9vbFxuIik7ICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGZpbmQgbGFyZ2VzdCBsaXRlcmFsIC4uIDIgNCBvciA4ICovCi0gIGxpdF9jb3VudCA9IDA7Ci0gIHdoaWxlIChsaXRfY291bnQgPCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkKLSAgICB7Ci0gICAgICBpZiAoYmlnZ2VzdF9saXRlcmFsX3NpemUgPCBsaXRlcmFsc1tsaXRfY291bnRdLnNpemUpCi0JYmlnZ2VzdF9saXRlcmFsX3NpemUgPSBsaXRlcmFsc1tsaXRfY291bnRdLnNpemU7Ci0gICAgICBsaXRfY291bnQgKys7Ci0gICAgfQotICBpZiAoMSA9PSBiaWdnZXN0X2xpdGVyYWxfc2l6ZSkgYmlnZ2VzdF9hbGlnbiA9IDA7Ci0gIGVsc2UgaWYgKDIgPT0gYmlnZ2VzdF9saXRlcmFsX3NpemUpIGJpZ2dlc3RfYWxpZ24gPSAxOwotICBlbHNlIGlmICg0ID09IGJpZ2dlc3RfbGl0ZXJhbF9zaXplKSBiaWdnZXN0X2FsaWduID0gMjsKLSAgZWxzZSBpZiAoOCA9PSBiaWdnZXN0X2xpdGVyYWxfc2l6ZSkgYmlnZ2VzdF9hbGlnbiA9IDM7Ci0gIGVsc2UgYXNfYmFkICgiYmFkIGFsaWdubWVudCBvZiAlZCBieXRlcyBpbiBsaXRlcmFsIHBvb2wiLCBiaWdnZXN0X2xpdGVyYWxfc2l6ZSk7Ci0gIGlmICgwID09IGJpZ2dlc3RfYWxpZ24pIGJpZ2dlc3RfYWxpZ24gPSAxOwotCi0KLSAgLyogQWxpZ24gcG9vbCBmb3Igc2hvcnQsIHdvcmQsIGRvdWJsZSB3b3JkIGFjY2Vzc2VzICovCi0gIGZyYWdfYWxpZ24gKGJpZ2dlc3RfYWxpZ24sIDAsIDApOwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBiaWdnZXN0X2FsaWduKTsKLQotICAvKiBOb3RlIHRoYXQgdGhlIGdhcyBsaXN0aW5nIHdpbGwgcHJpbnQgb25seSB0aGUgZmlyc3QgZml2ZQotICAgKiBlbnRyaWVzIGluIHRoZSBwb29sIC4uLi4gd29uZGVyIGhvdyB0byBtYWtlIGl0IHByaW50IG1vcmUgLi4uCi0gICAqLwotICAvKiBvdXRwdXQgbGFyZ2VzdCBsaXRlcmFscyBmaXJzdCwgdGhlbiB0aGUgc21hbGxlciBvbmVzLiAqLwotICBmb3IgKGxpdHNpemU9ODsgbGl0c2l6ZTsgbGl0c2l6ZSAvPTIpCi0gICAgewotICAgICAgc3ltYm9sUyAqY3VycmVudF9wb29sUCA9IE5VTEw7Ci0gICAgICBzd2l0Y2ggKGxpdHNpemUpCi0JewotCWNhc2UgODoKLQkgIGN1cnJlbnRfcG9vbFAgPSBsb25nbG9uZ19wb29sUDsgYnJlYWs7Ci0JY2FzZSA0OgotCSAgY3VycmVudF9wb29sUCA9IHdvcmRfcG9vbFA7IGJyZWFrOwotCWNhc2UgMjoKLQkgIGN1cnJlbnRfcG9vbFAgPSBzaG9ydF9wb29sUDsgYnJlYWs7Ci0JY2FzZSAxOgotCSAgY3VycmVudF9wb29sUCA9IGJ5dGVfcG9vbFA7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19iYWQgKCJiYWQgbGl0ZXJhbCBzaXplXG4iKTsKLQl9Ci0gICAgICBpZiAoTlVMTCA9PSBjdXJyZW50X3Bvb2xQKQotCWNvbnRpbnVlOwotICAgICAgc3ByaW50ZiAocG9vbF9uYW1lLCAiLkxJVFAlMDFkJTA2ZCIsIGxpdHNpemUsIGxpdF9wb29sX251bSk7Ci0gICAgICBzeW1ib2xfbG9jYXRlIChjdXJyZW50X3Bvb2xQLCBwb29sX25hbWUsIG5vd19zZWcsCi0JCSAgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLCBmcmFnX25vdyk7Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChjdXJyZW50X3Bvb2xQKTsKLQotICAgICAgbGl0X2NvdW50ID0gMDsKLSAgICAgIHdoaWxlIChsaXRfY291bnQgPCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkKLQl7Ci0JICBpZiAobGl0c2l6ZSA9PSBsaXRlcmFsc1tsaXRfY291bnRdLnNpemUpCi0JICAgIHsKLSNkZWZpbmUgRU1JVF9BRERSX0NPTlNfU1lNQk9MUwotI2lmZGVmIEVNSVRfQUREUl9DT05TX1NZTUJPTFMKLQkgICAgICAvKiBjcmVhdGUgYSBib2d1cyBzeW1ib2wsIGFkZCBpdCB0byB0aGUgcG9vbCAuLi4KLQkgICAgICAgKiBGb3IgdGhlIG1vc3QgcGFydCwgSSB0aGluayB0aGlzIGlzIGEgdXNlbGVzcyBleGNlcmNpc2UsCi0JICAgICAgICogZXhjZXB0IHRoYXQgaGF2aW5nIHRoZXNlIHN5bWJvbCBuYW1lcyBpbiB0aGUgb2JqZWN0cwotCSAgICAgICAqIGlzIHZhZ3VlbHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgLi4uCi0JICAgICAgICovCi0JICAgICAgaWYgKGxpdGVyYWxzW2xpdF9jb3VudF0uc3ltX25hbWUpCi0JCXsKLQkJICBzeW1ib2xTICogc3ltUCA9IHN5bWJvbF9tYWtlX2VtcHR5KCk7Ci0JCSAgc3ltYm9sX2xvY2F0ZSAoc3ltUCwgbGl0ZXJhbHNbbGl0X2NvdW50XS5zeW1fbmFtZSwgbm93X3NlZywKLQkJCQkgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLCBmcmFnX25vdyk7Ci0JCSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltUCk7Ci0JCX0KLSNlbmRpZiAvKiBFTUlUX0FERFJfQ09OU19TWU1CT0xTICovCi0KLQkgICAgICBlbWl0X2V4cHIgKCYobGl0ZXJhbHNbbGl0X2NvdW50XS5leHApLCBsaXRlcmFsc1tsaXRfY291bnRdLnNpemUpOwotCSAgICB9Ci0JICBsaXRfY291bnQgKys7Ci0JfQotICAgIH0KLQotICBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA9IDA7Ci0gIGxvbmdsb25nX3Bvb2xQID0gTlVMTDsKLSAgd29yZF9wb29sUCA9IE5VTEw7Ci0gIHNob3J0X3Bvb2xQID0gTlVMTDsKLSAgYnl0ZV9wb29sUCA9IE5VTEw7Ci0gIGxpdF9wb29sX251bSsrOwotfQotCi0jZW5kaWYgLyogTElURVJBTF9QT09MX1NVUFBPUlQgKi8KLQotDAotLyogYWRkIHN1cHBvcnQgZm9yIHRoZSBITEFTTS1saWtlIFVTSU5HIGRpcmVjdGl2ZSB0byBpbmRpY2F0ZQotICogdGhlIGJhc2UgcmVnaXN0ZXIgdG8gdXNlIC4uLiAgd2UgZG9uJ3Qgc3VwcG9ydCB0aGUgZnVsbAotICogaGxhc20gc2VtYW50aWNzIGZvciB0aGlzIC4uLiB3ZSBtZXJlbHkgcGx1Y2sgYSBiYXNlIGFkZHJlc3MKLSAqIGFuZCBhIHJlZ2lzdGVyIG51bWJlciBvdXQuICBXZSBwcmludCBhIHdhcm5pbmcgaWYgdXNpbmcgaXMKLSAqIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gIEkgc3VwcG9zZSB3ZSBzaG91bGQgY2hlY2sgdG8gc2VlCi0gKiBpZiB0aGUgcmVnbm8gaXMgdmFsaWQgLi4uCi0gKi8KLXN0YXRpYyB2b2lkCi1pMzcwX3VzaW5nIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4LCBiYXNlYWRkcjsKLSAgaW50IGlyZWdubzsKLSAgY2hhciAqc3RhcjsKLQotICAvKiBpZiAiKiIgYXBwZWFycyBpbiBhIHVzaW5nLCBpdCBtZWFucyAiLiIgICovCi0gIC8qIHJlcGxhY2UgaXQgd2l0aCAiLiIgc28gdGhhdCBleHByIGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkLiAqLwotICBzdGFyID0gc3RyY2hyIChpbnB1dF9saW5lX3BvaW50ZXIsICcqJyk7Ci0gIGlmIChzdGFyKQotICAgICpzdGFyID0gJy4nOwotCi0gIC8qIHRoZSBmaXJzdCBhcmcgdG8gdXNpbmcgd2lsbCB1c3VhbGx5IGJlICIuIiwgYnV0IGl0IGNhbgotICAgKiBiZSBhIG1vcmUgY29tcGxleCBleHByc3NzaW9uIHRvbyAuLi4gKi8KLSAgZXhwcmVzc2lvbiAoJmJhc2VhZGRyKTsKLSAgaWYgKHN0YXIpCi0gICAgKnN0YXIgPSAnKic7Ci0gIGlmIChPX2NvbnN0YW50ICE9IGJhc2VhZGRyLlhfb3AKLSAgICAgICYmIE9fc3ltYm9sICE9IGJhc2VhZGRyLlhfb3AKLSAgICAgICYmIE9fdW1pbnVzICE9IGJhc2VhZGRyLlhfb3ApCi0gIHsKLSAgICBhc19iYWQgKCIudXNpbmc6IGJhc2UgYWRkcmVzcyBleHByZXNzaW9uIGlsbGVnYWwgb3IgdG9vIGNvbXBsZXgiKTsKLSAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcMCcpICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIHRoZSBzZWNvbmQgYXJnIHRvIHVzaW5nIGhhZCBiZXR0ZXIgYmUgYSByZWdpc3RlciAqLwotICByZWdpc3Rlcl9uYW1lICgmZXgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBpcmVnbm8gPSBleC5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKDAgPT0gc3RybmNtcCAobm93X3NlZy0+bmFtZSwgIi50ZXh0IiwgNSkpCi0gICAgewotICAgICAgaTM3MF91c2luZ190ZXh0X2Jhc2VhZGRyID0gYmFzZWFkZHI7Ci0gICAgICBpMzcwX3VzaW5nX3RleHRfcmVnbm8gPSBpcmVnbm87Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaTM3MF91c2luZ19vdGhlcl9iYXNlYWRkciA9IGJhc2VhZGRyOwotICAgICAgaTM3MF91c2luZ19vdGhlcl9yZWdubyA9IGlyZWdubzsKLSAgICAgIGkzNzBfb3RoZXJfc2VjdGlvbiA9IG5vd19zZWc7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotaTM3MF9kcm9wIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4OwotICBpbnQgaXJlZ25vOwotCi0gIHJlZ2lzdGVyX25hbWUgKCZleCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGlyZWdubyA9IGV4LlhfYWRkX251bWJlcjsKLQotICBpZiAoMCA9PSBzdHJuY21wIChub3dfc2VnLT5uYW1lLCAiLnRleHQiLCA1KSkKLSAgICB7Ci0gICAgICBpZiAoaXJlZ25vICE9IGkzNzBfdXNpbmdfdGV4dF9yZWdubykKLSAgICAgICAgewotICAgICAgICAgIGFzX2JhZCAoImRyb3BpbmcgcmVnaXN0ZXIgJWQgaW4gc2VjdGlvbiAlcyBkb2VzIG5vdCBtYXRjaCB1c2luZyByZWdpc3RlciAlZCIsCi0JCSAgaXJlZ25vLCBub3dfc2VnLT5uYW1lLCBpMzcwX3VzaW5nX3RleHRfcmVnbm8pOwotICAgICAgICB9Ci0gICAgICBpMzcwX3VzaW5nX3RleHRfcmVnbm8gPSAtMTsKLSAgICAgIGkzNzBfdXNpbmdfdGV4dF9iYXNlYWRkci5YX29wID0gT19hYnNlbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGlyZWdubyAhPSBpMzcwX3VzaW5nX290aGVyX3JlZ25vKQotICAgICAgICB7Ci0gICAgICAgICAgYXNfYmFkICgiZHJvcGluZyByZWdpc3RlciAlZCBpbiBzZWN0aW9uICVzIGRvZXMgbm90IG1hdGNoIHVzaW5nIHJlZ2lzdGVyICVkIiwKLQkJICBpcmVnbm8sIG5vd19zZWctPm5hbWUsIGkzNzBfdXNpbmdfb3RoZXJfcmVnbm8pOwotICAgICAgICB9Ci0gICAgICBpZiAoaTM3MF9vdGhlcl9zZWN0aW9uICE9IG5vd19zZWcpCi0gICAgICAgIHsKLSAgICAgICAgICBhc19iYWQgKCJkcm9waW5nIHJlZ2lzdGVyICVkIGluIHNlY3Rpb24gJXMgcHJldmlvdXNseSB1c2VkIGluIHNlY3Rpb24gJXMiLAotCQkgIGlyZWdubywgbm93X3NlZy0+bmFtZSwgaTM3MF9vdGhlcl9zZWN0aW9uLT5uYW1lKTsKLSAgICAgICAgfQotICAgICAgaTM3MF91c2luZ19vdGhlcl9yZWdubyA9IC0xOwotICAgICAgaTM3MF91c2luZ19vdGhlcl9iYXNlYWRkci5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBpMzcwX290aGVyX3NlY3Rpb24gPSB1bmRlZmluZWRfc2VjdGlvbjsKLSAgICB9Ci19Ci0KLS8qIE1ha2UgdGhlIGZpcnN0IGFyZ3VtZW50IGFuIGFkZHJlc3MtcmVsYXRpdmUgZXhwcmVzc2lvbgotICogYnkgc3VidHJhY3RpbmcgdGhlIHNlY29uZCBhcmd1bWVudC4KLSAqLwotc3RhdGljIHZvaWQKLWkzNzBfbWFrZV9yZWxhdGl2ZSAoZXhwcmVzc2lvblMgKmV4eCwgZXhwcmVzc2lvblMgKmJhc2VhZGRyKQotewotCi0gIGlmIChPX2NvbnN0YW50ID09IGJhc2VhZGRyLT5YX29wKQotICAgIHsKLSAgICAgICBleHgtPlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgICBleHgtPlhfYWRkX251bWJlciAtPSBiYXNlYWRkci0+WF9hZGRfbnVtYmVyOwotICAgIH0KLSAgZWxzZSBpZiAoT19zeW1ib2wgPT0gYmFzZWFkZHItPlhfb3ApCi0gICAgewotICAgICAgIGV4eC0+WF9vcCA9IE9fc3VidHJhY3Q7Ci0gICAgICAgZXh4LT5YX29wX3N5bWJvbCA9IGJhc2VhZGRyLT5YX2FkZF9zeW1ib2w7Ci0gICAgICAgZXh4LT5YX2FkZF9udW1iZXIgLT0gYmFzZWFkZHItPlhfYWRkX251bWJlcjsKLSAgICB9Ci0gIGVsc2UgaWYgKE9fdW1pbnVzID09IGJhc2VhZGRyLT5YX29wKQotICAgIHsKLSAgICAgICBleHgtPlhfb3AgPSBPX2FkZDsKLSAgICAgICBleHgtPlhfb3Bfc3ltYm9sID0gYmFzZWFkZHItPlhfYWRkX3N5bWJvbDsKLSAgICAgICBleHgtPlhfYWRkX251bWJlciArPSBiYXNlYWRkci0+WF9hZGRfbnVtYmVyOwotICAgICB9Ci0gIGVsc2UKLSAgICAgewotICAgICAgIGFzX2JhZCAoIk1pc3Npbmcgb3IgYmFkIC51c2luZyBkaXJlY3RpdmUiKTsKLSAgICAgfQotfQotDAotLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcwotICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCi0gICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuICAqLwotCi1zdHJ1Y3QgaTM3MF9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19OwotCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnMsICpvcGNvZGVfc3RyOwotICBjb25zdCBzdHJ1Y3QgaTM3MF9vcGNvZGUgKm9wY29kZTsKLSAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0gIGludCBoYXZlX29wdGlvbmFsX2luZGV4LCBoYXZlX29wdGlvbmFsX2Jhc2VyZWcsIGhhdmVfb3B0aW9uYWxfcmVnOwotICBpbnQgc2tpcF9vcHRpb25hbF9pbmRleCwgc2tpcF9vcHRpb25hbF9iYXNlcmVnLCBza2lwX29wdGlvbmFsX3JlZzsKLSAgaW50IHVzZV90ZXh0PTAsIHVzZV9vdGhlcj0wOwotICBpbnQgb2ZmX2J5X29uZTsKLSAgc3RydWN0IGkzNzBfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci0gIGludCBmYzsKLSAgY2hhciAqZjsKLSAgaW50IGk7Ci0jaWZkZWYgT0JKX0VMRgotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0jZW5kaWYKLQotICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQotICAgIDsKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgKnMrKyA9ICdcMCc7Ci0gIG9wY29kZV9zdHIgPSBzdHI7Ci0KLSAgLyogTG9vayB1cCB0aGUgb3Bjb2RlIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBpMzcwX29wY29kZSAqKSBoYXNoX2ZpbmQgKGkzNzBfaGFzaCwgc3RyKTsKLSAgaWYgKG9wY29kZSA9PSAoY29uc3Qgc3RydWN0IGkzNzBfb3Bjb2RlICopIE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGkzNzBfbWFjcm8gKm1hY3JvOwotCi0gICAgICBhc3NlcnQgKGkzNzBfbWFjcm9faGFzaCk7Ci0gICAgICBtYWNybyA9IChjb25zdCBzdHJ1Y3QgaTM3MF9tYWNybyAqKSBoYXNoX2ZpbmQgKGkzNzBfbWFjcm9faGFzaCwgc3RyKTsKLSAgICAgIGlmIChtYWNybyA9PSAoY29uc3Qgc3RydWN0IGkzNzBfbWFjcm8gKikgTlVMTCkKLSAgICAgICAgYXNfYmFkICgiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIsIHN0cik7Ci0gICAgICBlbHNlCi0JaTM3MF9tYWNybyAocywgbWFjcm8pOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLQotICBzdHIgPSBzOwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgLyogSTM3MCBvcGVyYW5kcyBhcmUgZWl0aGVyIGV4cHJlc3Npb25zIG9yIGFkZHJlc3MgY29uc3RhbnRzLgotICAgICBNYW55IG9wZXJhbmQgdHlwZXMgYXJlIG9wdGlvbmFsLiAgVGhlIG9wdGlvbmFsIG9wZXJhbmRzCi0gICAgIGFyZSBhbHdheXMgc3Vycm91bmRlZCBieSBwYXJlbnMsIGFuZCBhcmUgdXNlZCB0byBkZW5vdGUgdGhlIGJhc2UKLSAgICAgcmVnaXN0ZXIgLi4uIGUuZy4gIkEgUjEsIEQyIiBvciAiQSBSMSwgRDIoLEIyKSBhcyBvcHBvc2VkIHRvCi0gICAgIHRoZSBmdWxseS1mb3JtZWQgIkEgUjEsIEQyKFgyLEIyKSIuICBOb3RlIGFsc28gdGhlID0gc2lnbiwKLSAgICAgc3VjaCBhcyBBIFIxLD1BKGkpIHdoZXJlIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yID1BIGltcGxpZXMKLSAgICAgdXNlIG9mIGJvdGggYSBiYXNlIHJlZ2lzdGVyLCBhbmQgYSBtaXNzaW5nIGluZGV4IHJlZ2lzdGVyLgotCi0gICAgIFNvLCBiZWZvcmUgd2Ugc3RhcnQgc2VyaW91c2x5IHBhcnNpbmcgdGhlIG9wZXJhbmRzLCB3ZSBjaGVjawotICAgICB0byBzZWUgaWYgd2UgaGF2ZSBhbiBvcHRpb25hbCBvcGVyYW5kLCBhbmQsIGlmIHdlIGRvLCB3ZSBjb3VudAotICAgICB0aGUgbnVtYmVyIG9mIGNvbW1hcyB0byBzZWUgd2hpY2ggb3BlcmFuZCBzaG91bGQgYmUgb21pdHRlZC4gICovCi0KLSAgaGF2ZV9vcHRpb25hbF9pbmRleCA9IGhhdmVfb3B0aW9uYWxfYmFzZXJlZyA9IGhhdmVfb3B0aW9uYWxfcmVnID0gMDsKLSAgZm9yIChvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4X3B0ciAhPSAwOyBvcGluZGV4X3B0cisrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBpMzcwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBvcGVyYW5kID0gJmkzNzBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBJMzcwX09QRVJBTkRfSU5ERVgpICE9IDApCi0JaGF2ZV9vcHRpb25hbF9pbmRleCA9IDE7Ci0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgSTM3MF9PUEVSQU5EX0JBU0UpICE9IDApCi0JaGF2ZV9vcHRpb25hbF9iYXNlcmVnID0gMTsKLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBJMzcwX09QRVJBTkRfT1BUSU9OQUwpICE9IDApCi0JaGF2ZV9vcHRpb25hbF9yZWcgPSAxOwotICAgIH0KLQotICBza2lwX29wdGlvbmFsX2luZGV4ID0gc2tpcF9vcHRpb25hbF9iYXNlcmVnID0gc2tpcF9vcHRpb25hbF9yZWcgPSAwOwotICBpZiAoaGF2ZV9vcHRpb25hbF9pbmRleCB8fCBoYXZlX29wdGlvbmFsX2Jhc2VyZWcpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG9wY291bnQsIG53YW50ZWQ7Ci0KLSAgICAgIC8qIFRoZXJlIGlzIGFuIG9wdGlvbmFsIG9wZXJhbmQuICBDb3VudCB0aGUgbnVtYmVyIG9mCi0JIGNvbW1hcyBhbmQgb3Blbi1wYXJlbnMgaW4gdGhlIGlucHV0IGxpbmUuICAqLwotICAgICAgaWYgKCpzdHIgPT0gJ1wwJykKLQlvcGNvdW50ID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcGNvdW50ID0gMTsKLQkgIHMgPSBzdHI7Ci0JICB3aGlsZSAoKHMgPSBzdHJwYnJrIChzLCAiLCg9IikpICE9IChjaGFyICopIE5VTEwpCi0JICAgIHsKLQkgICAgICArK29wY291bnQ7Ci0JICAgICAgKytzOwotCSAgICAgIGlmICgnLCcgPT0gKnMpICsrczsgIC8qIGF2b2lkIGNvdW50aW5nIHRoaW5ncyBsaWtlICgsICovCi0JICAgICAgaWYgKCc9JyA9PSAqcykgeyArK3M7IC0tb3Bjb3VudDsgfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB0aGVyZSBhcmUgZmV3ZXIgb3BlcmFuZHMgaW4gdGhlIGxpbmUgdGhlbiBhcmUgY2FsbGVkCi0JIGZvciBieSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHdhbnQgdG8gc2tpcCB0aGUgb3B0aW9uYWwKLQkgb3BlcmFuZC4gICovCi0gICAgICBud2FudGVkID0gc3RybGVuIChvcGNvZGUtPm9wZXJhbmRzKTsKLSAgICAgIGlmIChoYXZlX29wdGlvbmFsX2luZGV4KQotCXsKLQkgIGlmIChvcGNvdW50IDwgbndhbnRlZCkKLQkgICAgc2tpcF9vcHRpb25hbF9pbmRleCA9IDE7Ci0JICBpZiAoaGF2ZV9vcHRpb25hbF9iYXNlcmVnICYmICgob3Bjb3VudCsxKSA8IG53YW50ZWQpKQotCSAgICBza2lwX29wdGlvbmFsX2Jhc2VyZWcgPSAxOwotCSAgaWYgKGhhdmVfb3B0aW9uYWxfcmVnICYmICgob3Bjb3VudCsxKSA8IG53YW50ZWQpKQotCSAgICBza2lwX29wdGlvbmFsX3JlZyA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoYXZlX29wdGlvbmFsX2Jhc2VyZWcgJiYgKG9wY291bnQgPCBud2FudGVkKSkKLQkgICAgc2tpcF9vcHRpb25hbF9iYXNlcmVnID0gMTsKLQkgIGlmIChoYXZlX29wdGlvbmFsX3JlZyAmJiAob3Bjb3VudCA8IG53YW50ZWQpKQotCSAgICBza2lwX29wdGlvbmFsX3JlZyA9IDE7Ci0JfQotICAgIH0KLQotICAvKiBQZXJmb3JtIHNvbWUgb2ZmLWJ5LW9uZSBoYWNrcyBvbiB0aGUgbGVuZ3RoIGZpZWxkIG9mIGNlcnRhaW4gaW5zdHJ1Y3Rpb25zLgotICAgKiBJdHMgc3VjaCBhIHNoYW1lIHRvIGhhdmUgdG8gZG8gdGhpcywgYnV0IHRoZSBwcm9ibGVtIGlzIHRoYXQgSExBU00gZ290Ci0gICAqIGRlZmluZWQgc28gdGhhdCB0aGUgbGVuZ3RocyBkaWZmZXIgYnkgb25lIGZyb20gdGhlIGFjdHVhbCBtYWNoaW5lIGluc3RydWN0aW9ucy4KLSAgICogdGhpcyBjb2RlIHNob3VsZCBwcm9iYWJseSBiZSBtb3ZlZCB0byBhIHNwZWNpYWwgaW5zdGVyLW9wZXJhbmQgcm91dGluZS4KLSAgICogU2lnaC4gQWZmZWN0ZWQgaW5zdHJ1Y3Rpb25zIGFyZSBDb21wYXJlIExvZ2ljYWwsIE1vdmUgYW5kIEV4Y2x1c2l2ZSBPUgotICAgKiBoYWNrIGFsZXJ0IC0tIGFyZW4ndCAqYWxsKiBTUyBpbnN0cnVjdGlvbnMgYWZmZWN0ZWQgPz8KLSAgICovCi0gIG9mZl9ieV9vbmUgPSAwOwotICBpZiAoMCA9PSBzdHJjYXNlY21wICgiQ0xDIiwgb3Bjb2RlLT5uYW1lKQotICAgICAgfHwgMCA9PSBzdHJjYXNlY21wICgiRUQiLCBvcGNvZGUtPm5hbWUpCi0gICAgICB8fCAwID09IHN0cmNhc2VjbXAgKCJFRE1LIiwgb3Bjb2RlLT5uYW1lKQotICAgICAgfHwgMCA9PSBzdHJjYXNlY21wICgiTVZDIiwgb3Bjb2RlLT5uYW1lKQotICAgICAgfHwgMCA9PSBzdHJjYXNlY21wICgiTVZDSU4iLCBvcGNvZGUtPm5hbWUpCi0gICAgICB8fCAwID09IHN0cmNhc2VjbXAgKCJNVk4iLCBvcGNvZGUtPm5hbWUpCi0gICAgICB8fCAwID09IHN0cmNhc2VjbXAgKCJNVloiLCBvcGNvZGUtPm5hbWUpCi0gICAgICB8fCAwID09IHN0cmNhc2VjbXAgKCJOQyIsIG9wY29kZS0+bmFtZSkKLSAgICAgIHx8IDAgPT0gc3RyY2FzZWNtcCAoIk9DIiwgb3Bjb2RlLT5uYW1lKQotICAgICAgfHwgMCA9PSBzdHJjYXNlY21wICgiWEMiLCBvcGNvZGUtPm5hbWUpKQotICAgIG9mZl9ieV9vbmUgPSAxOwotCi0gIC8qIEdhdGhlciB0aGUgb3BlcmFuZHMuICAqLwotICBmYyA9IDA7Ci0gIGZvciAob3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleF9wdHIgIT0gMDsgb3BpbmRleF9wdHIrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgaTM3MF9vcGVyYW5kICpvcGVyYW5kOwotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgICAgY2hhciAqaG9sZDsKLSAgICAgIGV4cHJlc3Npb25TIGV4OwotCi0gICAgICBvcGVyYW5kID0gJmkzNzBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLSAgICAgIGVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gaW5kZXggb3BlcmFuZCwgYW5kIHdlIGFyZSBza2lwcGluZyBpdCwKLQkganVzdCBpbnNlcnQgYSB6ZXJvLiAgKi8KLSAgICAgIGlmIChza2lwX29wdGlvbmFsX2luZGV4ICYmCi0JICAoKG9wZXJhbmQtPmZsYWdzICYgSTM3MF9PUEVSQU5EX0lOREVYKSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgIGluc24gPSBpMzcwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAwKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBiYXNlIG9wZXJhbmQsIGFuZCB3ZSBhcmUgc2tpcHBpbmcgaXQsCi0JIGp1c3QgaW5zZXJ0IHRoZSBjdXJyZW50IHVzaW5nIGJhc3JlZy4gICovCi0gICAgICBpZiAoc2tpcF9vcHRpb25hbF9iYXNlcmVnICYmCi0gICAgICAgICAgKChvcGVyYW5kLT5mbGFncyAmIEkzNzBfT1BFUkFORF9CQVNFKSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgIGludCBiYXNlcmVnID0gLTE7Ci0gICAgICAgICAgaWYgKHVzZV90ZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoMCA9PSBzdHJuY21wIChub3dfc2VnLT5uYW1lLCAiLnRleHQiLCA1KQotCQkgIHx8IDAgPiBpMzcwX3VzaW5nX290aGVyX3JlZ25vKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJhc2VyZWcgPSBpMzcwX3VzaW5nX3RleHRfcmVnbm87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmFzZXJlZyA9IGkzNzBfdXNpbmdfb3RoZXJfcmVnbm87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHVzZV9vdGhlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKDAgPiBpMzcwX3VzaW5nX290aGVyX3JlZ25vKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJhc2VyZWcgPSBpMzcwX3VzaW5nX3RleHRfcmVnbm87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmFzZXJlZyA9IGkzNzBfdXNpbmdfb3RoZXJfcmVnbm87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIGlmICgwID4gYmFzZXJlZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXNfYmFkICgibm90IHVzaW5nIGFueSBiYXNlIHJlZ2lzdGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgaW5zbiA9IGkzNzBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGJhc2VyZWcpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gb3B0aW9uYWwgb3BlcmFuZCwgYW5kIHdlIGFyZSBza2lwcGluZyBpdCwKLQkgVXNlIHplcm8gKHNpbmNlIGEgbm9uLXplcm8gdmFsdWUgd291bGQgZGVub3RlIGEgcmVnaXN0ZXIpICAqLwotICAgICAgaWYgKHNraXBfb3B0aW9uYWxfcmVnCi0JICAmJiAoKG9wZXJhbmQtPmZsYWdzICYgSTM3MF9PUEVSQU5EX09QVElPTkFMKSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgIGluc24gPSBpMzcwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAwKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAvKiBHYXRoZXIgdGhlIG9wZXJhbmQuICAqLwotICAgICAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICAgICAgLyogcmVnaXN0ZXIgbmFtZXMgYXJlIG9ubHkgYWxsb3dlZCB3aGVyZSB0aGVyZSBhcmUgcmVnaXN0ZXJzIC4uLiAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEkzNzBfT1BFUkFORF9HUFIpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBxdWlja2llIGhhY2sgdG8gZ2V0IHBhc3QgdGhpbmdzIGxpa2UgKCxyMTMpICovCi0gICAgICAgICAgaWYgKHNraXBfb3B0aW9uYWxfaW5kZXggJiYgKCcsJyA9PSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICcgJzsKLSAgICAgICAgICAgICAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgIGlmICghIHJlZ2lzdGVyX25hbWUgKCZleCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFzX2JhZCAoImV4cGVjdGluZyBhIHJlZ2lzdGVyIGZvciBvcGVyYW5kICVkIiwKLQkJICAgICAgb3BpbmRleF9wdHIgLSBvcGNvZGUtPm9wZXJhbmRzICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgLyogY2hlY2sgZm9yIGEgYWRkcmVzcyBjb25zdGFudCBleHByZXNzaW9uICovCi0gICAgICAvKiBXZSB3aWxsIHB1dCBQU1ctcmVsYXRpdmUgYWRkcmVzc2VzIGluIHRoZSB0ZXh0IHNlY3Rpb24sCi0gICAgICAgKiBhbmQgYWRyZXNzIGxpdGVyYWxzIGluIHRoZSAuZGF0YSAob3Igb3RoZXIpIHNlY3Rpb24uICovCi0gICAgICBlbHNlIGlmIChpMzcwX2FkZHJfY29ucyAoJmV4KSkKLQl1c2Vfb3RoZXI9MTsKLSAgICAgIGVsc2UgaWYgKGkzNzBfYWRkcl9vZmZzZXQgKCZleCkpCi0JdXNlX3RleHQ9MTsKLSAgICAgIGVsc2UgZXhwcmVzc2lvbiAoJmV4KTsKLQotICAgICAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotICAgICAgLyogcGVyZm9ybSBzb21lIG9mZi1ieS1vbmUgaGFja3Mgb24gdGhlIGxlbmd0aCBmaWVsZCBvZiBjZXJ0YWluIGluc3RydWN0aW9ucy4KLSAgICAgICAqIEl0cyBzdWNoIGEgc2hhbWUgdG8gaGF2ZSB0byBkbyB0aGlzLCBidXQgdGhlIHByb2JsZW0gaXMgdGhhdCBITEFTTSBnb3QKLSAgICAgICAqIGRlZmluZWQgc28gdGhhdCB0aGUgcHJvZ3JhbW1lciBzcGVjaWZpZXMgYSBsZW5ndGggdGhhdCBpcyBvbmUgZ3JlYXRlcgotICAgICAgICogdGhhbiB3aGF0IHRoZSBtYWNoaW5lIGluc3RydWN0aW9uIHdhbnRzLgotICAgICAgICogU2lnaC4KLSAgICAgICAqLwotICAgICAgaWYgKG9mZl9ieV9vbmUgJiYgKDAgPT0gc3RyY2FzZWNtcCAoIlNTIEwiLCBvcGVyYW5kLT5uYW1lKSkpCi0JewotCSAgZXguWF9hZGRfbnVtYmVyIC0tOwotCX0KLQotICAgICAgaWYgKGV4Llhfb3AgPT0gT19pbGxlZ2FsKQotICAgICAgICBhc19iYWQgKCJpbGxlZ2FsIG9wZXJhbmQiKTsKLSAgICAgIGVsc2UgaWYgKGV4Llhfb3AgPT0gT19hYnNlbnQpCi0gICAgICAgIGFzX2JhZCAoIm1pc3Npbmcgb3BlcmFuZCIpOwotICAgICAgZWxzZSBpZiAoZXguWF9vcCA9PSBPX3JlZ2lzdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgaW5zbiA9IGkzNzBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlcik7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGV4Llhfb3AgPT0gT19jb25zdGFudCkKLSAgICAgICAgewotI2lmZGVmIE9CSl9FTEYKLSAgICAgICAgICAvKiBBbGxvdyBASEEsIEBMLCBASCBvbiBjb25zdGFudHMuCi0gICAgICAgICAgICogV2VsbCBhY3R1YWxseSwgbm8gd2UgZG9uJ3Q7IHRoZXJlIHJlYWxseSBkb24ndCBtYWtlIHNlbnNlCi0gICAgICAgICAgICogKGF0IGxlYXN0IG5vdCB0byBtZSkgZm9yIHRoZSBpMzcwLiAgSG93ZXZlciwgdGhpcyBjb2RlIGlzCi0gICAgICAgICAgICogbGVmdCBoZXJlIGZvciBhbnkgZHViaW91cyBmdXR1cmUgZXhwYW5zaW9uIHJlYXNvbnMgLi4uICovCi0gICAgICAgICAgY2hhciAqb3JpZ19zdHIgPSBzdHI7Ci0KLSAgICAgICAgICBpZiAoKHJlbG9jID0gaTM3MF9lbGZfc3VmZml4ICgmc3RyLCAmZXgpKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQotICAgICAgICAgICAgc3dpdGNoIChyZWxvYykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAJc3RyID0gb3JpZ19zdHI7Ci0gICAgICAgIAlicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotICAgICAgICAJLyogWF91bnNpZ25lZCBpcyB0aGUgZGVmYXVsdCwgc28gaWYgdGhlIHVzZXIgaGFzIGRvbmUKLSAgICAgICAgICAgICAgICAgICBzb21ldGhpbmcgd2hpY2ggY2xlYXJlZCBpdCwgd2UgYWx3YXlzIHByb2R1Y2UgYQotICAgICAgICAgICAgICAgICAgIHNpZ25lZCB2YWx1ZS4gICovCi0JCWV4LlhfYWRkX251bWJlciA9ICgoKGV4LlhfYWRkX251bWJlciAmIDB4ZmZmZikKLQkJCQkgICAgXiAweDgwMDApCi0JCQkJICAgLSAweDgwMDApOwotICAgICAgICAJYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLSAgICAgICAgCWV4LlhfYWRkX251bWJlciA9IChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotICAgICAgICAJYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgICAJZXguWF9hZGRfbnVtYmVyID0gKCgoZXguWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZikKLSAgICAgICAgCQkJICAgKyAoKGV4LlhfYWRkX251bWJlciA+PiAxNSkgJiAxKSk7Ci0gICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgaW5zbiA9IGkzNzBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlcik7Ci0gICAgICAgIH0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICgocmVsb2MgPSBpMzcwX2VsZl9zdWZmaXggKCZzdHIsICZleCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgICAgIHsKLSAgICAgICAgICBhc190c2t0c2sgKCJtZF9hc3NlbWJsZSgpOiBzdWZmaXhlZCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKLQotICAgICAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLSAgICAgICAgICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotICAgICAgICAgICAgYXNfZmF0YWwgKCJ0b28gbWFueSBmaXh1cHMiKTsKLSAgICAgICAgICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotICAgICAgICAgIGZpeHVwc1tmY10ub3BpbmRleCA9IDA7Ci0gICAgICAgICAgZml4dXBzW2ZjXS5yZWxvYyA9IHJlbG9jOwotICAgICAgICAgICsrZmM7Ci0gICAgICAgIH0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLSAgICAgICAgICAvKiBUeXBpY2FsbHksIHRoZSBleHByZXNzaW9uIHdpbGwganVzdCBiZSBhIHN5bWJvbCAuLi4KLSAgICAgICAgICAgKiBwcmludGYgKCJpbnNuICVzIG5lZWRzIGZpeHVwIGZvciAlcyBcbiIsCi0gICAgICAgICAgICogICAgICAgIG9wY29kZS0+bmFtZSwgZXguWF9hZGRfc3ltYm9sLT5ic3ltLT5uYW1lKTsKLSAgICAgICAgICAgKi8KLQotICAgICAgICAgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0gICAgICAgICAgICBhc19mYXRhbCAoInRvbyBtYW55IGZpeHVwcyIpOwotICAgICAgICAgIGZpeHVwc1tmY10uZXhwID0gZXg7Ci0gICAgICAgICAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotICAgICAgICAgIGZpeHVwc1tmY10ucmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotICAgICAgICAgICsrZmM7Ci0gICAgICAgIH0KLQotICAgICAgLyogc2tpcCBvdmVyIGRlbGltaXRlciAoY2xvc2UgcGFyZW4sIG9yIGNvbW1hKSAqLwotICAgICAgaWYgKCgnKScgPT0gKnN0cikgJiYgKCcsJyA9PSAqKHN0cisxKSkpCi0JKytzdHI7Ci0gICAgICBpZiAoKnN0ciAhPSAnXDAnKQotCSsrc3RyOwotICAgIH0KLQotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgIT0gJ1wwJykKLSAgICBhc19iYWQgKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiwgc3RyKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgZiA9IGZyYWdfbW9yZSAob3Bjb2RlLT5sZW4pOwotICBpZiAoNCA+PSBvcGNvZGUtPmxlbikKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24uaVswXSwgb3Bjb2RlLT5sZW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbi5pWzBdLCA0KTsKLSAgICAgIGlmICg2ID09IG9wY29kZS0+bGVuKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAoKGYrNCksICgoaW5zbi5pWzFdKT4+MTYpLCAyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbm90IHVzZWQgLS0tIGRvbid0IGhhdmUgYW55IDggYnl0ZSBpbnN0cnVjdGlvbnMgKi8KLQkgIGFzX2JhZCAoIkludGVybmFsIEVycm9yOiBiYWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoIik7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKChmKzQpLCBpbnNuLmlbMV0sIG9wY29kZS0+bGVuIC00KTsKLQl9Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhbnkgZml4dXBzLiAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKLSAgICAgQkZEX1JFTE9DX1VOVVNFRCBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgVGhpcyBsZXRzIHVzIGVhc2lseQotICAgICBoYW5kbGUgZml4dXBzIGZvciBhbnkgb3BlcmFuZCB0eXBlLCBhbHRob3VnaCB0aGF0IGlzIGFkbWl0dGVkbHkKLSAgICAgbm90IGEgdmVyeSBleGNpdGluZyBmZWF0dXJlLiAgV2UgcGljayBhIEJGRCByZWxvYyB0eXBlIGluCi0gICAgIG1kX2FwcGx5X2ZpeC4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBmYzsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBpMzcwX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLSAgICAgIG9wZXJhbmQgPSAmaTM3MF9vcGVyYW5kc1tmaXh1cHNbaV0ub3BpbmRleF07Ci0gICAgICBpZiAoZml4dXBzW2ldLnJlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JewotCSAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4dXBzW2ldLnJlbG9jKTsKLQkgIGludCBzaXplOwotCSAgZml4UyAqZml4UDsKLQotCSAgaWYgKCFyZWxvY19ob3d0bykKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgaWYgKHNpemUgPCAxIHx8IHNpemUgPiA0KQotCSAgICBhYm9ydCgpOwotCi0JICBwcmludGYgKCIgZ3dhbmEgZG9vIGZpeHVwICVkIFxuIiwgaSk7Ci0JICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0gICAgICAgICAJCSAgICAgICZmaXh1cHNbaV0uZXhwLCByZWxvY19ob3d0by0+cGNfcmVsYXRpdmUsCi0gICAgICAgICAJCSAgICAgIGZpeHVwc1tpXS5yZWxvYyk7Ci0KLQkgIC8qIFR1cm4gb2ZmIGNvbXBsYWludHMgdGhhdCB0aGUgYWRkZW5kIGlzIHRvbyBsYXJnZSBmb3IgdGhpbmdzIGxpa2UKLQkgICAgIGZvbysxMDAwMDBAaGEuICAqLwotCSAgc3dpdGNoIChmaXh1cHNbaV0ucmVsb2MpCi0JICAgIHsKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0JICAgICAgZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBvcGNvZGUtPmxlbiwKLQkJICAgICAgICZmaXh1cHNbaV0uZXhwLAotCQkgICAgICAgKG9wZXJhbmQtPmZsYWdzICYgSTM3MF9PUEVSQU5EX1JFTEFUSVZFKSAhPSAwLAotCQkgICAgICAgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpCi0JCQkoZml4dXBzW2ldLm9waW5kZXggKyAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKSkpOwotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSBhIG1hY3JvLiAgR2F0aGVyIGFsbCB0aGUgb3BlcmFuZHMsIHRyYW5zZm9ybSB0aGVtIGFzCi0gICBkZXNjcmliZWQgYnkgdGhlIG1hY3JvLCBhbmQgY2FsbCBtZF9hc3NlbWJsZSByZWN1cnNpdmVseS4gIEFsbCB0aGUKLSAgIG9wZXJhbmRzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzOyB3ZSBkb24ndCBhY2NlcHQgcGFyZW50aGVzZXMKLSAgIGFyb3VuZCBvcGVyYW5kcyBoZXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWkzNzBfbWFjcm8gKHN0ciwgbWFjcm8pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgY29uc3Qgc3RydWN0IGkzNzBfbWFjcm8gKm1hY3JvOwotewotICBjaGFyICpvcGVyYW5kc1sxMF07Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgY2hhciAqczsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY29uc3QgY2hhciAqZm9ybWF0OwotICBpbnQgYXJnOwotICBjaGFyICpzZW5kOwotICBjaGFyICpjb21wbGV0ZTsKLQotICAvKiBHYXRoZXIgdGhlIHVzZXJzIG9wZXJhbmRzIGludG8gdGhlIG9wZXJhbmRzIGFycmF5LiAgKi8KLSAgY291bnQgPSAwOwotICBzID0gc3RyOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoY291bnQgPj0gc2l6ZW9mIG9wZXJhbmRzIC8gc2l6ZW9mIG9wZXJhbmRzWzBdKQotICAgICAgICBicmVhazsKLSAgICAgIG9wZXJhbmRzW2NvdW50KytdID0gczsKLSAgICAgIHMgPSBzdHJjaHIgKHMsICcsJyk7Ci0gICAgICBpZiAocyA9PSAoY2hhciAqKSBOVUxMKQotICAgICAgICBicmVhazsKLSAgICAgICpzKysgPSAnXDAnOwotICAgIH0KLQotICBpZiAoY291bnQgIT0gbWFjcm8tPm9wZXJhbmRzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIndyb25nIG51bWJlciBvZiBvcGVyYW5kcyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXb3JrIG91dCBob3cgbGFyZ2UgdGhlIHN0cmluZyBtdXN0IGJlICh0aGUgc2l6ZSBpcyB1bmJvdW5kZWQKLSAgICAgYmVjYXVzZSBpdCBpbmNsdWRlcyB1c2VyIGlucHV0KS4gICovCi0gIGxlbiA9IDA7Ci0gIGZvcm1hdCA9IG1hY3JvLT5mb3JtYXQ7Ci0gIHdoaWxlICgqZm9ybWF0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCpmb3JtYXQgIT0gJyUnKQotICAgICAgICB7Ci0gICAgICAgICAgKytsZW47Ci0gICAgICAgICAgKytmb3JtYXQ7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFyZyA9IHN0cnRvbCAoZm9ybWF0ICsgMSwgJnNlbmQsIDEwKTsKLSAgICAgICAgICBrbm93IChzZW5kICE9IGZvcm1hdCAmJiBhcmcgPj0gMCAmJiBhcmcgPCBjb3VudCk7Ci0gICAgICAgICAgbGVuICs9IHN0cmxlbiAob3BlcmFuZHNbYXJnXSk7Ci0gICAgICAgICAgZm9ybWF0ID0gc2VuZDsKLSAgICAgICAgfQotICAgIH0KLQotICAvKiBQdXQgdGhlIHN0cmluZyB0b2dldGhlci4gICovCi0gIGNvbXBsZXRlID0gcyA9IChjaGFyICopIGFsbG9jYSAobGVuICsgMSk7Ci0gIGZvcm1hdCA9IG1hY3JvLT5mb3JtYXQ7Ci0gIHdoaWxlICgqZm9ybWF0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCpmb3JtYXQgIT0gJyUnKQotICAgICAgICAqcysrID0gKmZvcm1hdCsrOwotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYXJnID0gc3RydG9sIChmb3JtYXQgKyAxLCAmc2VuZCwgMTApOwotICAgICAgICAgIHN0cmNweSAocywgb3BlcmFuZHNbYXJnXSk7Ci0gICAgICAgICAgcyArPSBzdHJsZW4gKHMpOwotICAgICAgICAgIGZvcm1hdCA9IHNlbmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICpzID0gJ1wwJzsKLQotICAvKiBBc3NlbWJsZSB0aGUgY29uc3RydWN0ZWQgaW5zdHJ1Y3Rpb24uICAqLwotICBtZF9hc3NlbWJsZSAoY29tcGxldGUpOwotfQotDAotI2lmZGVmIE9CSl9FTEYKLS8qIEZvciBFTEYsIGFkZCBzdXBwb3J0IGZvciBTSEZfRVhDTFVERSBhbmQgU0hUX09SREVSRUQgKi8KLQotaW50Ci1pMzcwX3NlY3Rpb25fbGV0dGVyIChsZXR0ZXIsIHB0cl9tc2cpCi0gICAgIGludCBsZXR0ZXI7Ci0gICAgIGNoYXIgKipwdHJfbXNnOwotewotICBpZiAobGV0dGVyID09ICdlJykKLSAgICByZXR1cm4gU0hGX0VYQ0xVREU7Ci0KLSAgKnB0cl9tc2cgPSAiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZTogd2FudCBhLHcseCxlIGluIHN0cmluZyI7Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLWkzNzBfc2VjdGlvbl93b3JkIChzdHIsIGxlbikKLSAgICBjaGFyICpzdHI7Ci0gICAgc2l6ZV90IGxlbjsKLXsKLSAgaWYgKGxlbiA9PSA3ICYmIHN0cm5jbXAgKHN0ciwgImV4Y2x1ZGUiLCA3KSA9PSAwKQotICAgIHJldHVybiBTSEZfRVhDTFVERTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotaTM3MF9zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKQotICAgIGNoYXIgKnN0cjsKLSAgICBzaXplX3QgbGVuOwotewotICBpZiAobGVuID09IDcgJiYgc3RybmNtcCAoc3RyLCAib3JkZXJlZCIsIDcpID09IDApCi0gICAgIHJldHVybiBTSFRfT1JERVJFRDsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotaTM3MF9zZWN0aW9uX2ZsYWdzIChmbGFncywgYXR0ciwgdHlwZSkKLSAgICAgaW50IGZsYWdzOwotICAgICBpbnQgYXR0cjsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGlmICh0eXBlID09IFNIVF9PUkRFUkVEKQotICAgIGZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1NPUlRfRU5UUklFUzsKLQotICBpZiAoYXR0ciAmIFNIRl9FWENMVURFKQotICAgIGZsYWdzIHw9IFNFQ19FWENMVURFOwotCi0gIHJldHVybiBmbGFnczsKLX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLQwKLS8qIFBzZXVkby1vcCBoYW5kbGluZy4gICovCi0KLS8qIFRoZSAuYnl0ZSBwc2V1ZG8tb3AuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIG5vcm1hbCAuYnl0ZQotICAgcHNldWRvLW9wLCBidXQgaXQgY2FuIGFsc28gdGFrZSBhIHNpbmdsZSBBU0NJSSBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotaTM3MF9ieXRlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcIicpCi0gICAgewotICAgICAgY29ucyAoMSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEdhdGhlciBjaGFyYWN0ZXJzLiAgQSByZWFsIGRvdWJsZSBxdW90ZSBpcyBkb3VibGVkLiAgVW51c3VhbAotICAgICBjaGFyYWN0ZXJzIGFyZSBub3QgcGVybWl0dGVkLiAgKi8KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgYzsKLQotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICAgICAgaWYgKGMgPT0gJ1wiJykKLSAgICAgICAgewotICAgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCInKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAgIH0KLQotICAgICAgRlJBR19BUFBFTkRfMV9DSEFSIChjKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFRoZSAudGMgcHNldWRvLW9wLiAgVGhpcyBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBYQ09GRiBhbmQgRUxGLgotICAgVGhpcyB0YWtlcyB0d28gb3IgbW9yZSBhcmd1bWVudHMuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyBYQ09GRiBvdXRwdXQsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbmFtZSB0bwotICAgZ2l2ZSB0byB0aGlzIGxvY2F0aW9uIGluIHRoZSB0b2M7IHRoaXMgd2lsbCBiZSBhIHN5bWJvbCB3aXRoIGNsYXNzCi0gICBUQy4gIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgYXJlIDQgYnl0ZSB2YWx1ZXMgdG8gYWN0dWFsbHkgcHV0IGF0Ci0gICB0aGlzIGxvY2F0aW9uIGluIHRoZSBUT0M7IG9mdGVuIHRoZXJlIGlzIGp1c3Qgb25lIG1vcmUgYXJndW1lbnQsIGEKLSAgIHJlbG9jYXRlYWJsZSBzeW1ib2wgcmVmZXJlbmNlLgotCi0gICBXaGVuIG5vdCBnZW5lcmF0aW5nIFhDT0ZGIG91dHB1dCwgdGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUsIGJ1dAotICAgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHNpbXBseSBpZ25vcmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWkzNzBfdGMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLQotICAvKiBTa2lwIHRoZSBUT0Mgc3ltYm9sIG5hbWUuICAqLwotICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKQotICAgICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnWycKLSAgICAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ10nCi0gICAgICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICd7JwotICAgICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnfScpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogQWxpZ24gdG8gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGNvbnMgKDQpOwotICAgIH0KLX0KLQwKLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgb2YgdHlwZSB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRwLiAgVGhlIG51bWJlcgotICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZXAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0cDsKLSAgICAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0UnOgotICAgICAgdHlwZSA9ICdmJzsKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHR5cGUgPSAnZCc7Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplcCA9IDA7Ci0gICAgICByZXR1cm4gImJhZCBjYWxsIHRvIG1kX2F0b2YiOwotICAgIH0KLQotICAvKiAzNjAvMzcwLzM5MCBoYXZlIHR3byBmbG9hdCBmb3JtYXRzOiBhbiBvbGQsIGZ1bmt5IDM2MCBzaW5nbGUtcHJlY2lzaW9uCi0gICAqIGZvcm1hdCwgYW5kIHRoZSBpZWVlIGZvcm1hdC4gIFN1cHBvcnQgb25seSB0aGUgaWVlZSBmb3JtYXQuICovCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplcCA9IHByZWMgKiAyOwotCi0gIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0gICAgICBsaXRwICs9IDI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgZW5kaWFubmVzcy4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi0vKiBBbGlnbiBhIHNlY3Rpb24gKEkgZG9uJ3Qga25vdyB3aHkgdGhpcyBpcyBtYWNoaW5lIGRlcGVuZGVudCkuICAqLwotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgdmFsdWVUIGFkZHI7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLQotICByZXR1cm4gKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbik7Ci19Ci0KLS8qIFdlIGRvbid0IGhhdmUgYW55IGZvcm0gb2YgcmVsYXhpbmcuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogQ29udmVydCBhIG1hY2hpbmUgZGVwZW5kZW50IGZyYWcuICBXZSBuZXZlciBnZW5lcmF0ZSB0aGVzZS4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLQotLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGNvZGUuICBUaGlzIGlzIGNhbGxlZCBmb3IgYWxsIHRoZQotICAgZml4dXBzIHdlIGdlbmVyYXRlZCBieSB0aGUgY2FsbCB0byBmaXhfbmV3X2V4cCwgYWJvdmUuICBJbiB0aGUgY2FsbAotICAgYWJvdmUgd2UgdXNlZCBhIHJlbG9jIGNvZGUgd2hpY2ggd2FzIHRoZSBsYXJnZXN0IGxlZ2FsIHJlbG9jIGNvZGUKLSAgIHBsdXMgdGhlIG9wZXJhbmQgaW5kZXguICBIZXJlIHdlIHVuZG8gdGhhdCB0byByZWNvdmVyIHRoZSBvcGVyYW5kCi0gICBpbmRleC4gIEF0IHRoaXMgcG9pbnQgYWxsIHN5bWJvbCB2YWx1ZXMgc2hvdWxkIGJlIGZ1bGx5IHJlc29sdmVkLAotICAgYW5kIHdlIGF0dGVtcHQgdG8gY29tcGxldGVseSByZXNvbHZlIHRoZSByZWxvYy4gIElmIHdlIGNhbiBub3QgZG8KLSAgIHRoYXQsIHdlIGRldGVybWluZSB0aGUgY29ycmVjdCByZWxvYyBjb2RlIGFuZCBwdXQgaXQgYmFjayBpbiB0aGUKLSAgIGZpeHVwLgotCi0gICBTZWUgZ2FzL2NnZW4uYyBmb3IgbW9yZSBzYW1wbGUgY29kZSBhbmQgZXhwbGFuYXRpb25zIG9mIHdoYXQncwotICAgZ29pbmcgb24gaGVyZSAuLi4KLSovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHZhbHVlVCAqdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgdmFsdWVUIHZhbHVlOwotCi0gIHZhbHVlID0gKnZhbHVlcDsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogTm90ZXM6Ci0gICAgICAgICBCcmFuY2hlcyB0byBsYWJlbHMgd2lsbCBjb21lIGluIGhlcmUgd2l0aCBmaXhwLT5meF9wY3JlbCBzZXQgdG8gMQotICAgICAgICAgYW5kIGZpeHAtPmZ4X3N1YnN5IG5vdCBudWxsLCBhbmQgaG9sZGluZyB0aGUgdmFsdWUgb2YgdGhlIGJhc2UKLSAgICAgICAgIChpLmUuIHRoZSB2YWx1ZSBvZiB0aGUgLnVzaW5nKS4gVGhlc2Ugd2Ugd2FudCB0byBpZ25vcmUuCi0KLSAgICAgICAgICdTdHJvbmcnIGFuZCAnd2Vhaycgc3ltYm9scyB3aWxsIGNvbWUgaW4gaGVyZSB3aXRoCi0gICAgICAgICBmaXhwLT5meF9wY3JlbD09MCwgZml4cC0+ZnhfYWRkc3kgZGVmaW5lZCwgYW5kCi0gICAgICAgICAqdmFsdWVwIGhvbGRpbmcgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuCi0KLSAgICAgICAgICdTdHJvbmcnIHN5bWJvbHMgd2lsbCBoYXZlIFNfR0VUX1ZBTFVFKGZ4X2FkZHN5KSBlcXVhbCB0byB6ZXJvLAotICAgICAgICAgd2hlcmVhcyAnd2Vhaycgc3ltYm9scyB3aWxsIGhhdmUgU19HRVRfVkFMVUUoZnhfYWRkc3kpIHNldCB0byB0aGUKLSAgICAgICAgIHN5bWJvbCB2YWx1ZSAodXN1YWxseSkuCi0KLSAgICAgICAgIFdlIHdhbnQgdG8gc3VidHJhY3QgU19HRVRfVkFMVUUoZnhfYWRkc3kpIGlmIGl0IHNldCwgYW5kCi0gICAgICAgICBmb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgZG8gYSBmaXh1cCB3aXRoIHZhbHVlIHplcm8uICBUaGlzCi0gICAgICAgICBpcyBiZWNhdXNlIHRoZSBsaW5rZXIvbG9hZGVyLCBhdCBhIGxhdGVyIHRpbWUsIHdpbGwgZG8gdGhpcwotICAgICAgICAgZml4dXAgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZS4gSWYgd2UgZml4dXAgbm93IHdpdGggYSB2YWx1ZSwKLSAgICAgICAgIGl0IHdpbGwgZ2V0IGRvdWJsZS1maXhlZCwgbGVhZGluZyB0byBnYXJiYWdlLgotCi0gICAgICAgICBOb3RlIHRoYXQgc3Vic3kgd2lsbCBhbHNvIGJlIHNldCBmb3Igc3Ryb25nL3dlYWsgc3ltYm9scwotICAgICAgICAgd2hlbiB0aGUgdXNlciBwcm9ncmFtIHdhcyBjb21waWxlZCB3aXRoIC1nLiAgSW4gdGhhdCBjYXNlLAotICAgICAgICAgc3Vic3kgd2lsbCBob2xkIHRoZSBiYXNlIGFkZHJlc3MgKGkuZS4gdGhlIC51c2luZyBhZGRyZXNzKS4KLSAgICAgICovCi0KLSAgICAgIGlmIChmaXhwLT5meF9hZGRzeS0+c3lfdXNlZF9pbl9yZWxvYwotICAgICAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAgICAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSkpCi0gICAgICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSk7Ci0KLSNpZmRlZiBERUJVRwotICAgICAgcHJpbnRmICgiXG5tZF9hcHBseV9maXgzOiBzeW1ib2wgJXMgYXQgMHgleCAoJXM6JWQpIHZhbD0weCV4IGFkZGVuZD0weCV4XG4iLAotCSAgICAgIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSwKLQkgICAgICBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmUsCi0JICAgICAgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkgICAgICBTX0dFVF9WQUxVRSAoZml4cC0+ZnhfYWRkc3kpLCB2YWx1ZSk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBBcHBseSBmaXh1cHMgdG8gb3BlcmFuZHMuICBOb3RlIHRoYXQgdGhlcmUgc2hvdWxkIGJlIG5vIHJlbG9jYXRpb25zCi0gICAgIGZvciBhbnkgb3BlcmFuZHMsIHNpbmNlIG5vIGluc3RydWN0aW9uIGV2ZXIgdGFrZXMgYW4gb3BlcmFuZAotICAgICB0aGF0IHJlcXVpcmVzIHJlbG9jLiAgKi8KLSAgaWYgKChpbnQpIGZpeHAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IGkzNzBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGNoYXIgKndoZXJlOwotICAgICAgaTM3MF9pbnNuX3QgaW5zbjsKLQotICAgICAgb3BpbmRleCA9IChpbnQpIGZpeHAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7Ci0KLSAgICAgIG9wZXJhbmQgPSAmaTM3MF9vcGVyYW5kc1tvcGluZGV4XTsKLQotI2lmZGVmIERFQlVHCi0gICAgICBwcmludGYgKCJcbm1kX2FwcGx5X2ZpeDM6IGZpeHVwIG9wZXJhbmQgJXMgYXQgMHgleCBpbiAlczolZCBhZGRlbmQ9MHgleFxuIiwKLQkgICAgICBvcGVyYW5kLT5uYW1lLAotCSAgICAgIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZSwKLQkgICAgICBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCSAgICAgIHZhbHVlKTsKLSNlbmRpZgotICAgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLSAgICAgICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uCi0gICAgICAgICBmaXN4cC0+Znhfc2l6ZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgICAgIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICAgICAgaW5zbi5pWzBdID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgaWYgKDYgPD0gZml4cC0+Znhfc2l6ZSkKLQl7ICAgIC8qIGRlYWwgd2l0aCA0OC1iaXQgaW5zbidzICovCi0JICBpbnNuLmlbMV0gPSBiZmRfZ2V0YjMyICgoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpKzQpOwotCX0KLSAgICAgIGluc24gPSBpMzcwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAob2Zmc2V0VCkgdmFsdWUpOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24uaVswXSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgaWYgKDYgPD0gZml4cC0+Znhfc2l6ZSkKLQl7ICAgLyogZGVhbCB3aXRoIDQ4LWJpdCBpbnNuJ3MgKi8KLQkgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLmlbMV0sICgoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpKzQpKTsKLQl9Ci0KLSAgICAgIC8qIHdlIGFyZSBkb25lLCByaWdodD8gcmlnaHQgISEgKi8KLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOwotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8gaGVyZS4gICovCi0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQotICAgICAgLyogRGV0ZXJtaW5lIGEgQkZEIHJlbG9jIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIGluZm9ybWF0aW9uLgotCSBXZSBhcmUgb25seSBwcmVwYXJlZCB0byB0dXJuIGEgZmV3IG9mIHRoZSBvcGVyYW5kcyBpbnRvCi0JIHJlbG9jcy4gIEluIGZhY3QsIHdlIHN1cHBvcnQgKnplcm8qIG9wZXJhbmQgcmVsb2NhdGlvbnMgLi4uCi0JIFdoeT8gIEJlY2F1c2Ugd2UgYXJlIG5vdCBleHBlY3RpbmcgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlCi0JIGFueSBvcGVyYW5kcyB0aGF0IG5lZWQgcmVsb2NhdGlvbi4gIER1ZSB0byB0aGUgMTItYml0IG5hdHVyZXcgb2YKLQkgaTM3MCBhZGRyZXNzaW5nLCB0aGlzIHdvdWxkIGJlIHVudXN1YWwuICovCi0jaWYgMAotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEkzNzBfT1BFUkFORF9SRUxBVElWRSkgIT0gMAotICAgICAgICAgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTIKLSAgICAgICAgICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAwKQotICAgICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfSTM3MF9EMTI7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKnNmaWxlOwotICAgICAgICAgIHVuc2lnbmVkIGludCBzbGluZTsKLQotICAgICAgICAgIC8qIFVzZSBleHByX3N5bWJvbF93aGVyZSB0byBzZWUgaWYgdGhpcyBpcyBhbiBleHByZXNzaW9uCi0gICAgICAgICAgICAgc3ltYm9sLiAgKi8KLSAgICAgICAgICBpZiAoZXhwcl9zeW1ib2xfd2hlcmUgKGZpeHAtPmZ4X2FkZHN5LCAmc2ZpbGUsICZzbGluZSkpCi0gICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgIAkJICAidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgCQkgICJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiKTsKLSAgICAgICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGJyYW5jaCB0byBoZXJlIGlmIHRoZSBmaXh1cCBpcyBub3QgdG8gYSBzeW1ib2wgdGhhdAotICAgICAgICogYXBwZWFycyBpbiBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kLCBidXQgaXMgcmF0aGVyIHNvbWUKLSAgICAgICAqIGRlY2xhcmVkIHN0b3JhZ2UuCi0gICAgICAgKi8KLSNpZmRlZiBPQkpfRUxGCi0gICAgICBpMzcwX2VsZl92YWxpZGF0ZV9maXggKGZpeHAsIHNlZyk7Ci0jZW5kaWYKLSNpZmRlZiBERUJVRwotICAgICAgcHJpbnRmICgibWRfYXBwbHlfZml4MzogcmVsb2MgY2FzZSAlZCBpbiBzZWdtZW50ICAlcyAlczolZFxuIiwKLQkgICAgICBmaXhwLT5meF9yX3R5cGUsIHNlZ21lbnRfbmFtZSAoc2VnKSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBwcmludGYgKCJcdGN1cnJlbnQgZml4dXAgdmFsdWUgaXMgMHgleCBcbiIsIHZhbHVlKTsKLSNlbmRpZgotICAgICAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgICAgICAgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgLyogZmFsbCB0aHJvdWdoICovCi0KLSAgICAgICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgICAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgICAgY2FzZSBCRkRfUkVMT0NfMzJfQkFTRVJFTDoKLSNpZmRlZiBERUJVRwotICAgICAgICAgIHByaW50ZiAoIlx0MzIgYml0IHJlbG9jYXRpb24gYXQgMHgleFxuIiwKLQkJICBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmUpOwotI2VuZGlmCi0gICAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCi0gICAgICAgIAkJICAgICAgdmFsdWUsIDQpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0gICAgICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgCQkgICJjYW5ub3QgZW1pdCBQQyByZWxhdGl2ZSAlcyByZWxvY2F0aW9uJXMlcyIsCi0gICAgICAgIAkJICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSwKLSAgICAgICAgCQkgIGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwgPyAiIGFnYWluc3QgIiA6ICIiLAotICAgICAgICAJCSAgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICAgCQkgICA/IFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KQotICAgICAgICAJCSAgIDogIiIpKTsKLQotICAgICAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotICAgICAgICAJCSAgICAgIHZhbHVlLCAyKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIC8qIFRoaXMgY2FzZSBoYXBwZW5zIHdoZW4geW91IHdyaXRlLCBmb3IgZXhhbXBsZSwKLSAgICAgICAgICAgICBsaXMgJXIzLChMMS1MMilAaGEKLSAgICAgICAgICAgICB3aGVyZSBMMSBhbmQgTDIgYXJlIGRlZmluZWQgbGF0ZXIuICAqLwotICAgICAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotICAgICAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotICAgICAgICAJCSAgICAgIHZhbHVlID4+IDE2LCAyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotICAgICAgICAJCSAgICAgICh2YWx1ZSArIDB4ODAwMCkgPj4gMTYsIDIpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgICAgICAgICAgYWJvcnQgKCk7Ci0KLSAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZSwKLSAgICAgICAgCQkgICAgICB2YWx1ZSwgMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgCSAgIkdhcyBmYWlsdXJlLCByZWxvYyB2YWx1ZSAlZFxuIiwgZml4cC0+Znhfcl90eXBlKTsKLSAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICBmaXhwLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyBmb3IgYSBmaXh1cC4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgIAkgICAgInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiwgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotCi0jaWZkZWYgREVCVUcKLSAgcHJpbnRmICgiXG5nZW5fcmVsb2MoKTogc3ltICVzICglczolZCkgYXQgYWRkciAweCV4IGFkZGVuZD0weCV4XG4iLAotCSAgZml4cC0+ZnhfYWRkc3ktPmJzeW0tPm5hbWUsCi0JICBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCSAgcmVsb2MtPmFkZHJlc3MsIHJlbG9jLT5hZGRlbmQpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHJlbG9jOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pMzcwLmggYi9nYXMvY29uZmlnL3RjLWkzNzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzMmZhOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWkzNzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKiB0Yy1pMzcwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLWkzNzAuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfSTM3MAotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgZml4OwotI2VuZGlmCi0KLS8qIFNldCB0aGUgZW5kaWFubmVzcyB3ZSBhcmUgdXNpbmcuICBEZWZhdWx0IHRvIGJpZyBlbmRpYW4uICAqLwotI2lmbmRlZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0jZW5kaWYKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIEkzNzAgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggKGkzNzBfYXJjaCAoKSkKLWV4dGVybiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgaTM3MF9hcmNoIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogV2hldGhlciBvciBub3QgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiBUaGUgdGFyZ2V0IEJGRCBmb3JtYXQuICAqLwotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAoImVsZjMyLWkzNzAiKQotI2VuZGlmCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiAkIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24uICAqLwotLyogI2RlZmluZSBET0xMQVJfRE9UICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLSNlbmRpZgotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFdlIHNldCB0aGUgZnhfZG9uZSBmaWVsZCBhcHByb3ByaWF0ZWx5IGluIG1kX2FwcGx5X2ZpeC4gICovCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotDAotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBCcmFuY2ggcHJlZGljdGlvbiByZWxvY2F0aW9ucyBtdXN0IGZvcmNlIHJlbG9jYXRpb24uICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04oRklYUCxTRUMpIDEKLQotLyogU3VwcG9ydCBmb3IgU0hGX0VYQ0xVREUgYW5kIFNIVF9PUkRFUkVEICovCi1leHRlcm4gaW50IGkzNzBfc2VjdGlvbl9sZXR0ZXIgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1leHRlcm4gaW50IGkzNzBfc2VjdGlvbl90eXBlIFBBUkFNUyAoKGNoYXIgKiwgc2l6ZV90KSk7Ci1leHRlcm4gaW50IGkzNzBfc2VjdGlvbl93b3JkIFBBUkFNUyAoKGNoYXIgKiwgc2l6ZV90KSk7Ci1leHRlcm4gaW50IGkzNzBfc2VjdGlvbl9mbGFncyBQQVJBTVMgKChpbnQsIGludCwgaW50KSk7Ci0KLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fbGV0dGVyKExFVFRFUiwgUFRSX01TRykJaTM3MF9zZWN0aW9uX2xldHRlciAoTEVUVEVSLCBQVFJfTVNHKQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl90eXBlKFNUUiwgTEVOKQkJaTM3MF9zZWN0aW9uX3R5cGUgKFNUUiwgTEVOKQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl93b3JkKFNUUiwgTEVOKQkJaTM3MF9zZWN0aW9uX3dvcmQgKFNUUiwgTEVOKQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9mbGFncyhGTEFHUywgQVRUUiwgVFlQRSkJaTM3MF9zZWN0aW9uX2ZsYWdzIChGTEFHUywgQVRUUiwgVFlQRSkKLQotI2RlZmluZSB0Y19jb21tZW50X2NoYXJzIGkzNzBfY29tbWVudF9jaGFycwotZXh0ZXJuIGNvbnN0IGNoYXIgKmkzNzBfY29tbWVudF9jaGFyczsKLQotLyogV2UgbXVzdCBuZXZlciBldmVyIHRyeSB0byByZXNvbHZlIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWxseSB2aXNpYmxlCi0gICBzeW1ib2xzIGluIHRoZSBhc3NlbWJsZXIsIGJlY2F1c2UgdGhlIC5vIGZpbGUgbWlnaHQgZ28gaW50byBhIHNoYXJlZAotICAgbGlicmFyeSwgYW5kIHNvbWUgb3RoZXIgc2hhcmVkIGxpYnJhcnkgbWlnaHQgb3ZlcnJpZGUgdGhhdCBzeW1ib2wuICAqLwotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKSAgXAotICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLS8qIGNhbGwgbWRfYXBwbHlfZml4MyB3aXRoIHNlZ21lbnQgaW5zdGVhZCBvZiBtZF9hcHBseV9maXggKi8KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykKLWV4dGVybiBsb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWkzODYuYyBiL2dhcy9jb25maWcvdGMtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTAxYmFiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUzNiArMCwwIEBACi0vKiBpMzg2LmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEludGVsIDgwMzg2Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgSW50ZWwgODAzODYgbWFjaGluZSBzcGVjaWZpYyBnYXMuCi0gIFdyaXR0ZW4gYnkgRWxpb3QgRHJlc3NlbGhhdXMgKGVsaW90QG1nbS5taXQuZWR1KS4KLSAgQnVncyAmIHN1Z2dlc3Rpb25zIGFyZSBjb21wbGV0ZWx5IHdlbGNvbWUuICBUaGlzIGlzIGZyZWUgc29mdHdhcmUuCi0gIFBsZWFzZSBoZWxwIHVzIG1ha2UgaXQgYmV0dGVyLgotICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9wY29kZS9pMzg2LmgiCi0KLSNpZm5kZWYgUkVHSVNURVJfV0FSTklOR1MKLSNkZWZpbmUgUkVHSVNURVJfV0FSTklOR1MgMQotI2VuZGlmCi0KLSNpZm5kZWYgSU5GRVJfQUREUl9QUkVGSVgKLSNkZWZpbmUgSU5GRVJfQUREUl9QUkVGSVggMQotI2VuZGlmCi0KLSNpZm5kZWYgU0NBTEUxX1dIRU5fTk9fSU5ERVgKLS8qIFNwZWNpZnlpbmcgYSBzY2FsZSBmYWN0b3IgYmVzaWRlcyAxIHdoZW4gdGhlcmUgaXMgbm8gaW5kZXggaXMKLSAgIGZ1dGlsZS4gIGVnLiBgbW92ICglZWJ4LDIpLCVhbCcgZG9lcyBleGFjdGx5IHRoZSBzYW1lIGFzCi0gICBgbW92ICglZWJ4KSwlYWwnLiAgVG8gc2xhdmlzaGx5IGZvbGxvdyB3aGF0IHRoZSBwcm9ncmFtbWVyCi0gICBzcGVjaWZpZWQsIHNldCBTQ0FMRTFfV0hFTl9OT19JTkRFWCB0byAwLiAgKi8KLSNkZWZpbmUgU0NBTEUxX1dIRU5fTk9fSU5ERVggMQotI2VuZGlmCi0KLSNkZWZpbmUgdHJ1ZSAxCi0jZGVmaW5lIGZhbHNlIDAKLQotc3RhdGljIHVuc2lnbmVkIGludCBtb2RlX2Zyb21fZGlzcF9zaXplIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGludCBmaXRzX2luX3NpZ25lZF9ieXRlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgZml0c19pbl91bnNpZ25lZF9ieXRlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgZml0c19pbl91bnNpZ25lZF93b3JkIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgZml0c19pbl9zaWduZWRfd29yZCBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IHNtYWxsZXN0X2ltbV90eXBlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgYWRkX3ByZWZpeCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF8xNmJpdF9jb2RlX2ZsYWcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzZXRfMTZiaXRfZ2NjX2NvZGVfZmxhZyBQQVJBTVMoKGludCkpOwotc3RhdGljIHZvaWQgc2V0X2ludGVsX3N5bnRheCBQQVJBTVMgKChpbnQpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2MKLSAgUEFSQU1TICgoaW50LCBpbnQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotI2VuZGlmCi0KLS8qICdtZF9hc3NlbWJsZSAoKScgZ2F0aGVycyB0b2dldGhlciBpbmZvcm1hdGlvbiBhbmQgcHV0cyBpdCBpbnRvIGEKLSAgIGkzODZfaW5zbi4gKi8KLQotdW5pb24gaTM4Nl9vcAotICB7Ci0gICAgZXhwcmVzc2lvblMgKmRpc3BzOwotICAgIGV4cHJlc3Npb25TICppbW1zOwotICAgIGNvbnN0IHJlZ19lbnRyeSAqcmVnczsKLSAgfTsKLQotc3RydWN0IF9pMzg2X2luc24KLSAgewotICAgIC8qIFRNIGhvbGRzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGluc24gd2VyZSBjdXJyZW50bHkgYXNzZW1ibGluZy4gKi8KLSAgICB0ZW1wbGF0ZSB0bTsKLQotICAgIC8qIFNVRkZJWCBob2xkcyB0aGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGlmIGdpdmVuLgotICAgICAgIChlLmcuICdsJyBmb3IgJ21vdmwnKSAgKi8KLSAgICBjaGFyIHN1ZmZpeDsKLQotICAgIC8qIE9QRVJBTkRTIGdpdmVzIHRoZSBudW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMuICovCi0gICAgdW5zaWduZWQgaW50IG9wZXJhbmRzOwotCi0gICAgLyogUkVHX09QRVJBTkRTLCBESVNQX09QRVJBTkRTLCBNRU1fT1BFUkFORFMsIElNTV9PUEVSQU5EUyBnaXZlIHRoZSBudW1iZXIKLSAgICAgICBvZiBnaXZlbiByZWdpc3RlciwgZGlzcGxhY2VtZW50LCBtZW1vcnkgb3BlcmFuZHMgYW5kIGltbWVkaWF0ZQotICAgICAgIG9wZXJhbmRzLiAqLwotICAgIHVuc2lnbmVkIGludCByZWdfb3BlcmFuZHMsIGRpc3Bfb3BlcmFuZHMsIG1lbV9vcGVyYW5kcywgaW1tX29wZXJhbmRzOwotCi0gICAgLyogVFlQRVMgW2ldIGlzIHRoZSB0eXBlIChzZWUgYWJvdmUgI2RlZmluZXMpIHdoaWNoIHRlbGxzIHVzIGhvdyB0bwotICAgICAgIHVzZSBPUFtpXSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmFuZC4gICovCi0gICAgdW5zaWduZWQgaW50IHR5cGVzW01BWF9PUEVSQU5EU107Ci0KLSAgICAvKiBEaXNwbGFjZW1lbnQgZXhwcmVzc2lvbiwgaW1tZWRpYXRlIGV4cHJlc3Npb24sIG9yIHJlZ2lzdGVyIGZvciBlYWNoCi0gICAgICAgb3BlcmFuZC4gICovCi0gICAgdW5pb24gaTM4Nl9vcCBvcFtNQVhfT1BFUkFORFNdOwotCi0gICAgLyogUmVsb2NhdGlvbiB0eXBlIGZvciBvcGVyYW5kICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgIGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCBkaXNwX3JlbG9jW01BWF9PUEVSQU5EU107Ci0jZWxzZQotICAgIGludCBkaXNwX3JlbG9jW01BWF9PUEVSQU5EU107Ci0jZW5kaWYKLQotICAgIC8qIEJBU0VfUkVHLCBJTkRFWF9SRUcsIGFuZCBMT0cyX1NDQUxFX0ZBQ1RPUiBhcmUgdXNlZCB0byBlbmNvZGUKLSAgICAgICB0aGUgYmFzZSBpbmRleCBieXRlIGJlbG93LiAgKi8KLSAgICBjb25zdCByZWdfZW50cnkgKmJhc2VfcmVnOwotICAgIGNvbnN0IHJlZ19lbnRyeSAqaW5kZXhfcmVnOwotICAgIHVuc2lnbmVkIGludCBsb2cyX3NjYWxlX2ZhY3RvcjsKLQotICAgIC8qIFNFRyBnaXZlcyB0aGUgc2VnX2VudHJpZXMgb2YgdGhpcyBpbnNuLiAgVGhleSBhcmUgemVybyB1bmxlc3MKLSAgICAgICBleHBsaWNpdCBzZWdtZW50IG92ZXJyaWRlcyBhcmUgZ2l2ZW4uICovCi0gICAgY29uc3Qgc2VnX2VudHJ5ICpzZWdbMl07CS8qIHNlZ21lbnRzIGZvciBtZW1vcnkgb3BlcmFuZHMgKGlmIGdpdmVuKSAqLwotCi0gICAgLyogUFJFRklYIGhvbGRzIGFsbCB0aGUgZ2l2ZW4gcHJlZml4IG9wY29kZXMgKHVzdWFsbHkgbnVsbCkuCi0gICAgICAgUFJFRklYRVMgaXMgdGhlIG51bWJlciBvZiBwcmVmaXggb3Bjb2Rlcy4gICovCi0gICAgdW5zaWduZWQgaW50IHByZWZpeGVzOwotICAgIHVuc2lnbmVkIGNoYXIgcHJlZml4W01BWF9QUkVGSVhFU107Ci0KLSAgICAvKiBSTSBhbmQgU0lCIGFyZSB0aGUgbW9kcm0gYnl0ZSBhbmQgdGhlIHNpYiBieXRlIHdoZXJlIHRoZQotICAgICAgIGFkZHJlc3NpbmcgbW9kZXMgb2YgdGhpcyBpbnNuIGFyZSBlbmNvZGVkLiAgKi8KLQotICAgIG1vZHJtX2J5dGUgcm07Ci0gICAgc2liX2J5dGUgc2liOwotICB9OwotCi10eXBlZGVmIHN0cnVjdCBfaTM4Nl9pbnNuIGkzODZfaW5zbjsKLQotLyogTGlzdCBvZiBjaGFycyBiZXNpZGVzIHRob3NlIGluIGFwcC5jOnN5bWJvbF9jaGFycyB0aGF0IGNhbiBzdGFydCBhbgotICAgb3BlcmFuZC4gIFVzZWQgdG8gcHJldmVudCB0aGUgc2NydWJiZXIgZWF0aW5nIHZpdGFsIHdoaXRlLXNwYWNlLiAgKi8KLSNpZmRlZiBMRVhfQVQKLWNvbnN0IGNoYXIgZXh0cmFfc3ltYm9sX2NoYXJzW10gPSAiKiUtKEAiOwotI2Vsc2UKLWNvbnN0IGNoYXIgZXh0cmFfc3ltYm9sX2NoYXJzW10gPSAiKiUtKCI7Ci0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLSNpZiBkZWZpbmVkIChURV9JMzg2QUlYKSB8fCAoKGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpKSAmJiAhIGRlZmluZWQgKFRFX0xJTlVYKSkKLS8qIFB1dHRpbmcgJy8nIGhlcmUgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byB1c2UgdGhlIGRpdmlkZSBvcGVyYXRvci4KLSAgIEhvd2V2ZXIsIHdlIG5lZWQgaXQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTVlI0IHN5c3RlbXMuICAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIy8iOwotI2RlZmluZSBQUkVGSVhfU0VQQVJBVE9SICdcXCcKLSNlbHNlCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLSNkZWZpbmUgUFJFRklYX1NFUEFSQVRPUiAnLycKLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgc3RhcnRlZCBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsgaWYKLSAgICcvJyBpc24ndCBvdGhlcndpc2UgZGVmaW5lZC4gICovCi0jaWYgZGVmaW5lZCAoVEVfSTM4NkFJWCkgfHwgKChkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKSkgJiYgISBkZWZpbmVkIChURV9MSU5VWCkpCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiI7Ci0jZWxzZQotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIvIjsKLSNlbmRpZgotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImZGZER4WCI7Ci0KLS8qIHRhYmxlcyBmb3IgbGV4aWNhbCBhbmFseXNpcyAqLwotc3RhdGljIGNoYXIgbW5lbW9uaWNfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIHJlZ2lzdGVyX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBvcGVyYW5kX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBpZGVudGlmaWVyX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBkaWdpdF9jaGFyc1syNTZdOwotCi0vKiBsZXhpY2FsIG1hY3JvcyAqLwotI2RlZmluZSBpc19tbmVtb25pY19jaGFyKHgpIChtbmVtb25pY19jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX29wZXJhbmRfY2hhcih4KSAob3BlcmFuZF9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX3JlZ2lzdGVyX2NoYXIoeCkgKHJlZ2lzdGVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfc3BhY2VfY2hhcih4KSAoKHgpID09ICcgJykKLSNkZWZpbmUgaXNfaWRlbnRpZmllcl9jaGFyKHgpIChpZGVudGlmaWVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfZGlnaXRfY2hhcih4KSAoZGlnaXRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotCi0vKiBwdXQgaGVyZSBhbGwgbm9uLWRpZ2l0IG5vbi1sZXR0ZXIgY2hhcmN0ZXJzIHRoYXQgbWF5IG9jY3VyIGluIGFuIG9wZXJhbmQgKi8KLXN0YXRpYyBjaGFyIG9wZXJhbmRfc3BlY2lhbF9jaGFyc1tdID0gIiUkLSsoLCkqLl9+Lzw+fCZeITpbQF0iOwotCi0vKiBtZF9hc3NlbWJsZSgpIGFsd2F5cyBsZWF2ZXMgdGhlIHN0cmluZ3MgaXQncyBwYXNzZWQgdW5hbHRlcmVkLiAgVG8KLSAgIGVmZmVjdCB0aGlzIHdlIG1haW50YWluIGEgc3RhY2sgb2Ygc2F2ZWQgY2hhcmFjdGVycyB0aGF0IHdlJ3ZlIHNtYXNoZWQKLSAgIHdpdGggJ1wwJ3MgKGluZGljYXRpbmcgZW5kIG9mIHN0cmluZ3MgZm9yIHZhcmlvdXMgc3ViLWZpZWxkcyBvZiB0aGUKLSAgIGFzc2VtYmxlciBpbnN0cnVjdGlvbikuICovCi1zdGF0aWMgY2hhciBzYXZlX3N0YWNrWzMyXTsKLXN0YXRpYyBjaGFyICpzYXZlX3N0YWNrX3A7CS8qIHN0YWNrIHBvaW50ZXIgKi8KLSNkZWZpbmUgRU5EX1NUUklOR19BTkRfU0FWRShzKSBcCi0JZG8geyAqc2F2ZV9zdGFja19wKysgPSAqKHMpOyAqKHMpID0gJ1wwJzsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgUkVTVE9SRV9FTkRfU1RSSU5HKHMpIFwKLQlkbyB7ICoocykgPSAqLS1zYXZlX3N0YWNrX3A7IH0gd2hpbGUgKDApCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB3ZSdyZSBhc3NlbWJsaW5nLiAqLwotc3RhdGljIGkzODZfaW5zbiBpOwotCi0vKiBQb3NzaWJsZSB0ZW1wbGF0ZXMgZm9yIGN1cnJlbnQgaW5zbi4gICovCi1zdGF0aWMgY29uc3QgdGVtcGxhdGVzICpjdXJyZW50X3RlbXBsYXRlczsKLQotLyogUGVyIGluc3RydWN0aW9uIGV4cHJlc3Npb25TIGJ1ZmZlcnM6IDIgZGlzcGxhY2VtZW50cyAmIDIgaW1tZWRpYXRlIG1heC4gKi8KLXN0YXRpYyBleHByZXNzaW9uUyBkaXNwX2V4cHJlc3Npb25zWzJdLCBpbV9leHByZXNzaW9uc1syXTsKLQotc3RhdGljIGludCB0aGlzX29wZXJhbmQ7CS8qIGN1cnJlbnQgb3BlcmFuZCB3ZSBhcmUgd29ya2luZyBvbiAqLwotCi1zdGF0aWMgaW50IGZsYWdfZG9fbG9uZ19qdW1wOwkvKiBGSVhNRSB3aGF0IGRvZXMgdGhpcyBkbz8gKi8KLQotc3RhdGljIGludCBmbGFnXzE2Yml0X2NvZGU7CS8qIDEgaWYgd2UncmUgd3JpdGluZyAxNi1iaXQgY29kZSwgMCBpZiAzMi1iaXQgKi8KLQotc3RhdGljIGludCBpbnRlbF9zeW50YXggPSAwOwkvKiAxIGZvciBpbnRlbCBzeW50YXgsIDAgaWYgYXR0IHN5bnRheCAqLwotCi1zdGF0aWMgaW50IGFsbG93X25ha2VkX3JlZyA9IDA7ICAvKiAxIGlmIHJlZ2lzdGVyIHByZWZpeCAlIG5vdCByZXF1aXJlZCAqLwotCi1zdGF0aWMgY2hhciBzdGFja29wX3NpemUgPSAnXDAnOyAgLyogVXNlZCBpbiAxNiBiaXQgZ2NjIG1vZGUgdG8gYWRkIGFuIGwKLQkJCQkgICAgIHN1ZmZpeCB0byBjYWxsLCByZXQsIGVudGVyLCBsZWF2ZSwgcHVzaCwKLQkJCQkgICAgIGFuZCBwb3AgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgZ2NjIGhhcyB0aGUKLQkJCQkgICAgIHNhbWUgc3RhY2sgZnJhbWUgYXMgaW4gMzIgYml0IG1vZGUuICAqLwotCi0vKiBJbnRlcmZhY2UgdG8gcmVsYXhfc2VnbWVudC4KLSAgIFRoZXJlIGFyZSAyIHJlbGF4IHN0YXRlcyBmb3IgMzg2IGp1bXAgaW5zbnM6IG9uZSBmb3IgY29uZGl0aW9uYWwgJgotICAgb25lIGZvciB1bmNvbmRpdGlvbmFsIGp1bXBzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXNlIHR3byB0eXBlcyBvZgotICAganVtcHMgYWRkIGRpZmZlcmVudCBzaXplcyB0byBmcmFncyB3aGVuIHdlJ3JlIGZpZ3VyaW5nIG91dCB3aGF0Ci0gICBzb3J0IG9mIGp1bXAgdG8gY2hvb3NlIHRvIHJlYWNoIGEgZ2l2ZW4gbGFiZWwuICAqLwotCi0vKiB0eXBlcyAqLwotI2RlZmluZSBDT05EX0pVTVAgMQkJLyogY29uZGl0aW9uYWwganVtcCAqLwotI2RlZmluZSBVTkNPTkRfSlVNUCAyCQkvKiB1bmNvbmRpdGlvbmFsIGp1bXAgKi8KLS8qIHNpemVzICovCi0jZGVmaW5lIENPREUxNgkxCi0jZGVmaW5lIFNNQUxMCTAKLSNkZWZpbmUgU01BTEwxNiAoU01BTEx8Q09ERTE2KQotI2RlZmluZSBCSUcJMgotI2RlZmluZSBCSUcxNgkoQklHfENPREUxNikKLQotI2lmbmRlZiBJTkxJTkUKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIEVOQ09ERV9SRUxBWF9TVEFURSh0eXBlLHNpemUpIFwKLSAgKChyZWxheF9zdWJzdGF0ZVQpKCh0eXBlPDwyKSB8IChzaXplKSkpCi0jZGVmaW5lIFNJWkVfRlJPTV9SRUxBWF9TVEFURShzKSBcCi0gICAgKCAoKChzKSAmIDB4MykgPT0gQklHID8gNCA6ICgoKHMpICYgMHgzKSA9PSBCSUcxNiA/IDIgOiAxKSkgKQotCi0vKiBUaGlzIHRhYmxlIGlzIHVzZWQgYnkgcmVsYXhfZnJhZyB0byBwcm9tb3RlIHNob3J0IGp1bXBzIHRvIGxvbmcKLSAgIG9uZXMgd2hlcmUgbmVjZXNzYXJ5LiAgU01BTEwgKHNob3J0KSBqdW1wcyBtYXkgYmUgcHJvbW90ZWQgdG8gQklHCi0gICAoMzIgYml0IGxvbmcpIG9uZXMsIGFuZCBTTUFMTDE2IGp1bXBzIHRvIEJJRzE2ICgxNiBiaXQgbG9uZykuICBXZQotICAgZG9uJ3QgYWxsb3cgYSBzaG9ydCBqdW1wIGluIGEgMzIgYml0IGNvZGUgc2VnbWVudCB0byBiZSBwcm9tb3RlZCB0bwotICAgYSAxNiBiaXQgb2Zmc2V0IGp1bXAgYmVjYXVzZSBpdCdzIHNsb3dlciAocmVxdWlyZXMgZGF0YSBzaXplCi0gICBwcmVmaXgpLCBhbmQgZG9lc24ndCB3b3JrLCB1bmxlc3MgdGhlIGRlc3RpbmF0aW9uIGlzIGluIHRoZSBib3R0b20KLSAgIDY0ayBvZiB0aGUgY29kZSBzZWdtZW50IChUaGUgdG9wIDE2IGJpdHMgb2YgZWlwIGFyZSB6ZXJvZWQpLiAgKi8KLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIC8qIFRoZSBmaWVsZHMgYXJlOgotICAgICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAgIDIpIG1vc3QgbmVnYXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgICAgMykgaG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLgotICAqLwotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHKX0sCi0gIHsxMjcgKyAxLCAtMTI4ICsgMSwgMCwgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIEJJRzE2KX0sCi0gIC8qIGR3b3JkIGNvbmRpdGlvbmFscyBhZGRzIDQgYnl0ZXMgdG8gZnJhZzoKLSAgICAgMSBleHRyYSBvcGNvZGUgYnl0ZSwgMyBleHRyYSBkaXNwbGFjZW1lbnQgYnl0ZXMuICAqLwotICB7MCwgMCwgNCwgMH0sCi0gIC8qIHdvcmQgY29uZGl0aW9uYWxzIGFkZCAyIGJ5dGVzIHRvIGZyYWc6Ci0gICAgIDEgZXh0cmEgb3Bjb2RlIGJ5dGUsIDEgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGUuICAqLwotICB7MCwgMCwgMiwgMH0sCi0KLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcpfSwKLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcxNil9LAotICAvKiBkd29yZCBqbXAgYWRkcyAzIGJ5dGVzIHRvIGZyYWc6Ci0gICAgIDAgZXh0cmEgb3Bjb2RlIGJ5dGVzLCAzIGV4dHJhIGRpc3BsYWNlbWVudCBieXRlcy4gICovCi0gIHswLCAwLCAzLCAwfSwKLSAgLyogd29yZCBqbXAgYWRkcyAxIGJ5dGUgdG8gZnJhZzoKLSAgICAgMCBleHRyYSBvcGNvZGUgYnl0ZXMsIDEgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGUuICAqLwotICB7MCwgMCwgMSwgMH0KLQotfTsKLQotCi12b2lkCi1pMzg2X2FsaWduX2NvZGUgKGZyYWdQLCBjb3VudCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIC8qIFZhcmlvdXMgZWZmaWNpZW50IG5vLW9wIHBhdHRlcm5zIGZvciBhbGlnbmluZyBjb2RlIGxhYmVscy4gICovCi0gIC8qIE5vdGU6IERvbid0IHRyeSB0byBhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBjb21tZW50cy4gKi8KLSAgLyogICAgICAgMEwgYW5kIDB3IGFyZSBub3QgbGVnYWwgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzFbXSA9Ci0gICAgezB4OTB9OwkJCQkJLyogbm9wCQkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzJbXSA9Ci0gICAgezB4ODksMHhmNn07CQkJCS8qIG1vdmwgJWVzaSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8zW10gPQotICAgIHsweDhkLDB4NzYsMHgwMH07CQkJCS8qIGxlYWwgMCglZXNpKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl80W10gPQotICAgIHsweDhkLDB4NzQsMHgyNiwweDAwfTsJCQkvKiBsZWFsIDAoJWVzaSwxKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl81W10gPQotICAgIHsweDkwLAkJCQkJLyogbm9wCQkJKi8KLSAgICAgMHg4ZCwweDc0LDB4MjYsMHgwMH07CQkJLyogbGVhbCAwKCVlc2ksMSksJWVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfNltdID0KLSAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkJLyogbGVhbCAwTCglZXNpKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl83W10gPQotICAgIHsweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzhbXSA9Ci0gICAgezB4OTAsCQkJCQkvKiBub3AJCQkqLwotICAgICAweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzlbXSA9Ci0gICAgezB4ODksMHhmNiwJCQkJCS8qIG1vdmwgJWVzaSwlZXNpCSovCi0gICAgIDB4OGQsMHhiYywweDI3LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlZGksMSksJWVkaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTBbXSA9Ci0gICAgezB4OGQsMHg3NiwweDAwLAkJCQkvKiBsZWFsIDAoJWVzaSksJWVzaQkqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzExW10gPQotICAgIHsweDhkLDB4NzQsMHgyNiwweDAwLAkJCS8qIGxlYWwgMCglZXNpLDEpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xMltdID0KLSAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJmLDB4MDAsMHgwMCwweDAwLDB4MDB9OwkJLyogbGVhbCAwTCglZWRpKSwlZWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xM1tdID0KLSAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xNFtdID0KLSAgICB7MHg4ZCwweGI0LDB4MjYsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xNVtdID0KLSAgICB7MHhlYiwweDBkLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwJLyogam1wIC4rMTU7IGxvdHNhIG5vcHMJKi8KLSAgICAgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwfTsKLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzNbXSA9Ci0gICAgezB4OGQsMHg3NCwweDAwfTsJCQkJLyogbGVhIDAoJWVzaSksJWVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMTZfNFtdID0KLSAgICB7MHg4ZCwweGI0LDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVzaSksJXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl81W10gPQotICAgIHsweDkwLAkJCQkJLyogbm9wCQkJKi8KLSAgICAgMHg4ZCwweGI0LDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVzaSksJXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl82W10gPQotICAgIHsweDg5LDB4ZjYsCQkJCQkvKiBtb3YgJXNpLCVzaQkJKi8KLSAgICAgMHg4ZCwweGJkLDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVkaSksJWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl83W10gPQotICAgIHsweDhkLDB4NzQsMHgwMCwJCQkJLyogbGVhIDAoJXNpKSwlc2kJKi8KLSAgICAgMHg4ZCwweGJkLDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVkaSksJWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl84W10gPQotICAgIHsweDhkLDB4YjQsMHgwMCwweDAwLAkJCS8qIGxlYSAwdyglc2kpLCVzaQkqLwotICAgICAweDhkLDB4YmQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJWRpKSwlZGkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGYzMl9wYXR0W10gPSB7Ci0gICAgZjMyXzEsIGYzMl8yLCBmMzJfMywgZjMyXzQsIGYzMl81LCBmMzJfNiwgZjMyXzcsIGYzMl84LAotICAgIGYzMl85LCBmMzJfMTAsIGYzMl8xMSwgZjMyXzEyLCBmMzJfMTMsIGYzMl8xNCwgZjMyXzE1Ci0gIH07Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmMTZfcGF0dFtdID0gewotICAgIGYzMl8xLCBmMzJfMiwgZjE2XzMsIGYxNl80LCBmMTZfNSwgZjE2XzYsIGYxNl83LCBmMTZfOCwKLSAgICBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUKLSAgfTsKLQotICBpZiAoY291bnQgPiAwICYmIGNvdW50IDw9IDE1KQotICAgIHsKLSAgICAgIGlmIChmbGFnXzE2Yml0X2NvZGUpCi0JewotCSAgbWVtY3B5KGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeCwKLQkJIGYxNl9wYXR0W2NvdW50IC0gMV0sIGNvdW50KTsKLQkgIGlmIChjb3VudCA+IDgpIC8qIGFkanVzdCBqdW1wIG9mZnNldCAqLwotCSAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtmcmFnUC0+ZnJfZml4ICsgMV0gPSBjb3VudCAtIDI7Ci0JfQotICAgICAgZWxzZQotCW1lbWNweShmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsCi0JICAgICAgIGYzMl9wYXR0W2NvdW50IC0gMV0sIGNvdW50KTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSBjb3VudDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICpvdXRwdXRfaW52YWxpZCBQQVJBTVMgKChpbnQgYykpOwotc3RhdGljIGludCBpMzg2X29wZXJhbmQgUEFSQU1TICgoY2hhciAqb3BlcmFuZF9zdHJpbmcpKTsKLXN0YXRpYyBpbnQgaTM4Nl9pbnRlbF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKm9wZXJhbmRfc3RyaW5nLCBpbnQgZ290X2FfZmxvYXQpKTsKLXN0YXRpYyBjb25zdCByZWdfZW50cnkgKnBhcnNlX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKnJlZ19zdHJpbmcsCi0JCQkJCQljaGFyICoqZW5kX29wKSk7Ci0KLSNpZm5kZWYgSTM4NkNPRkYKLXN0YXRpYyB2b2lkIHNfYnNzIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLXN5bWJvbFMgKkdPVF9zeW1ib2w7CQkvKiBQcmUtZGVmaW5lZCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotbW9kZV9mcm9tX2Rpc3Bfc2l6ZSAodCkKLSAgICAgdW5zaWduZWQgaW50IHQ7Ci17Ci0gIHJldHVybiAodCAmIERpc3A4KSA/IDEgOiAodCAmIChEaXNwMTZ8RGlzcDMyKSkgPyAyIDogMDsKLX0KLQotc3RhdGljIElOTElORSBpbnQKLWZpdHNfaW5fc2lnbmVkX2J5dGUgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0gIHJldHVybiAobnVtID49IC0xMjgpICYmIChudW0gPD0gMTI3KTsKLX0JCQkJLyogZml0c19pbl9zaWduZWRfYnl0ZSgpICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1maXRzX2luX3Vuc2lnbmVkX2J5dGUgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0gIHJldHVybiAobnVtICYgMHhmZikgPT0gbnVtOwotfQkJCQkvKiBmaXRzX2luX3Vuc2lnbmVkX2J5dGUoKSAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotZml0c19pbl91bnNpZ25lZF93b3JkIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotICByZXR1cm4gKG51bSAmIDB4ZmZmZikgPT0gbnVtOwotfQkJCQkvKiBmaXRzX2luX3Vuc2lnbmVkX3dvcmQoKSAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotZml0c19pbl9zaWduZWRfd29yZCAobnVtKQotICAgICBsb25nIG51bTsKLXsKLSAgcmV0dXJuICgtMzI3NjggPD0gbnVtKSAmJiAobnVtIDw9IDMyNzY3KTsKLX0JCQkJLyogZml0c19pbl9zaWduZWRfd29yZCgpICovCi0KLXN0YXRpYyBpbnQKLXNtYWxsZXN0X2ltbV90eXBlIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotI2lmIDAKLSAgLyogVGhpcyBjb2RlIGlzIGRpc2FibGVkIGJlY2F1c2UgYWxsIHRoZSBJbW0xIGZvcm1zIGluIHRoZSBvcGNvZGUgdGFibGUKLSAgICAgYXJlIHNsb3dlciBvbiB0aGUgaTQ4NiwgYW5kIHRoZXkncmUgdGhlIHZlcnNpb25zIHdpdGggdGhlIGltcGxpY2l0bHkKLSAgICAgc3BlY2lmaWVkIHNpbmdsZS1wb3NpdGlvbiBkaXNwbGFjZW1lbnQsIHdoaWNoIGhhcyBhbm90aGVyIHN5bnRheCBpZgotICAgICB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoYXQgZm9ybS4gIElmIHlvdSByZWFsbHkgcHJlZmVyIHRvIGhhdmUgdGhlCi0gICAgIG9uZS1ieXRlLXNob3J0ZXIgSW1tMSBmb3JtIGRlc3BpdGUgdGhlc2UgcHJvYmxlbXMsIHJlLWVuYWJsZSB0aGlzCi0gICAgIGNvZGUuICAqLwotICBpZiAobnVtID09IDEpCi0gICAgcmV0dXJuIEltbTEgfCBJbW04IHwgSW1tOFMgfCBJbW0xNiB8IEltbTMyOwotI2VuZGlmCi0gIHJldHVybiAoZml0c19pbl9zaWduZWRfYnl0ZSAobnVtKQotCSAgPyAoSW1tOFMgfCBJbW04IHwgSW1tMTYgfCBJbW0zMikKLQkgIDogZml0c19pbl91bnNpZ25lZF9ieXRlIChudW0pCi0JICA/IChJbW04IHwgSW1tMTYgfCBJbW0zMikKLQkgIDogKGZpdHNfaW5fc2lnbmVkX3dvcmQgKG51bSkgfHwgZml0c19pbl91bnNpZ25lZF93b3JkIChudW0pKQotCSAgPyAoSW1tMTYgfCBJbW0zMikKLQkgIDogKEltbTMyKSk7Ci19CQkJCS8qIHNtYWxsZXN0X2ltbV90eXBlKCkgKi8KLQotLyogUmV0dXJucyAwIGlmIGF0dGVtcHRpbmcgdG8gYWRkIGEgcHJlZml4IHdoZXJlIG9uZSBmcm9tIHRoZSBzYW1lCi0gICBjbGFzcyBhbHJlYWR5IGV4aXN0cywgMSBpZiBub24gcmVwL3JlcG5lIGFkZGVkLCAyIGlmIHJlcC9yZXBuZQotICAgYWRkZWQuICAqLwotc3RhdGljIGludAotYWRkX3ByZWZpeCAocHJlZml4KQotICAgICB1bnNpZ25lZCBpbnQgcHJlZml4OwotewotICBpbnQgcmV0ID0gMTsKLSAgaW50IHE7Ci0KLSAgc3dpdGNoIChwcmVmaXgpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgQ1NfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIERTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBFU19QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgRlNfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIEdTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBTU19QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IFNFR19QUkVGSVg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVQTkVfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIFJFUEVfUFJFRklYX09QQ09ERToKLSAgICAgIHJldCA9IDI7Ci0gICAgICAvKiBmYWxsIHRocnUgKi8KLSAgICBjYXNlIExPQ0tfUFJFRklYX09QQ09ERToKLSAgICAgIHEgPSBMT0NLUkVQX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGV0FJVF9PUENPREU6Ci0gICAgICBxID0gV0FJVF9QUkVGSVg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUREUl9QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IEFERFJfUFJFRklYOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERBVEFfUFJFRklYX09QQ09ERToKLSAgICAgIHEgPSBEQVRBX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoaS5wcmVmaXhbcV0pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzYW1lIHR5cGUgb2YgcHJlZml4IHVzZWQgdHdpY2UiKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaS5wcmVmaXhlcyArPSAxOwotICBpLnByZWZpeFtxXSA9IHByZWZpeDsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF8xNmJpdF9jb2RlX2ZsYWcgKG5ld18xNmJpdF9jb2RlX2ZsYWcpCi0gICAgIGludCBuZXdfMTZiaXRfY29kZV9mbGFnOwotewotICBmbGFnXzE2Yml0X2NvZGUgPSBuZXdfMTZiaXRfY29kZV9mbGFnOwotICBzdGFja29wX3NpemUgPSAnXDAnOwotfQotCi1zdGF0aWMgdm9pZAotc2V0XzE2Yml0X2djY19jb2RlX2ZsYWcgKG5ld18xNmJpdF9jb2RlX2ZsYWcpCi0gICAgIGludCBuZXdfMTZiaXRfY29kZV9mbGFnOwotewotICBmbGFnXzE2Yml0X2NvZGUgPSBuZXdfMTZiaXRfY29kZV9mbGFnOwotICBzdGFja29wX3NpemUgPSBuZXdfMTZiaXRfY29kZV9mbGFnID8gJ2wnIDogJ1wwJzsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9pbnRlbF9zeW50YXggKHN5bnRheF9mbGFnKQotICAgICBpbnQgc3ludGF4X2ZsYWc7Ci17Ci0gIC8qIEZpbmQgb3V0IGlmIHJlZ2lzdGVyIHByZWZpeGluZyBpcyBzcGVjaWZpZWQuICAqLwotICBpbnQgYXNrX25ha2VkX3JlZyA9IDA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgY2hhciAqc3RyaW5nID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50IGUgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKHN0cmNtcChzdHJpbmcsICJwcmVmaXgiKSA9PSAwKQotCWFza19uYWtlZF9yZWcgPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wKHN0cmluZywgIm5vcHJlZml4IikgPT0gMCkKLQlhc2tfbmFrZWRfcmVnID0gLTE7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJiYWQgYXJndW1lbnQgdG8gc3ludGF4IGRpcmVjdGl2ZS4iKSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gZTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaW50ZWxfc3ludGF4ID0gc3ludGF4X2ZsYWc7Ci0KLSAgaWYgKGFza19uYWtlZF9yZWcgPT0gMCkKLSAgICB7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYWxsb3dfbmFrZWRfcmVnID0gKGludGVsX3N5bnRheAotCQkJICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKHN0ZG91dHB1dCkgIT0gJ1wwJykpOwotI2Vsc2UKLSAgICAgIGFsbG93X25ha2VkX3JlZyA9IDA7IC8qIGNvbnNlcnZhdGl2ZSBkZWZhdWx0ICovCi0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICBhbGxvd19uYWtlZF9yZWcgPSAoYXNrX25ha2VkX3JlZyA8IDApOwotfQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotI2lmbmRlZiBJMzg2Q09GRgotICB7ImJzcyIsIHNfYnNzLCAwfSwKLSNlbmRpZgotI2lmICFkZWZpbmVkKE9CSl9BT1VUKSAmJiAhZGVmaW5lZChVU0VfQUxJR05fUFRXTykKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAotI2Vsc2UKLSAgeyJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0jZW5kaWYKLSAgeyJmZmxvYXQiLCBmbG9hdF9jb25zLCAnZid9LAotICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsidGZsb2F0IiwgZmxvYXRfY29ucywgJ3gnfSwKLSAgeyJ2YWx1ZSIsIGNvbnMsIDJ9LAotICB7Im5vb3B0Iiwgc19pZ25vcmUsIDB9LAotICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAotICB7ImNvZGUxNmdjYyIsIHNldF8xNmJpdF9nY2NfY29kZV9mbGFnLCAxfSwKLSAgeyJjb2RlMTYiLCBzZXRfMTZiaXRfY29kZV9mbGFnLCAxfSwKLSAgeyJjb2RlMzIiLCBzZXRfMTZiaXRfY29kZV9mbGFnLCAwfSwKLSAgeyJpbnRlbF9zeW50YXgiLCBzZXRfaW50ZWxfc3ludGF4LCAxfSwKLSAgeyJhdHRfc3ludGF4Iiwgc2V0X2ludGVsX3N5bnRheCwgMH0sCi0gIHswLCAwLCAwfQotfTsKLQotLyogZm9yIGludGVyZmFjZSB3aXRoIGV4cHJlc3Npb24gKCkgKi8KLWV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0KLS8qIGhhc2ggdGFibGUgZm9yIGluc3RydWN0aW9uIG1uZW1vbmljIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0vKiBoYXNoIHRhYmxlIGZvciByZWdpc3RlciBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZWdfaGFzaDsKLQwKLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqaGFzaF9lcnI7Ci0KLSAgLyogaW5pdGlhbGl6ZSBvcF9oYXNoIGhhc2ggdGFibGUgKi8KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIHsKLSAgICByZWdpc3RlciBjb25zdCB0ZW1wbGF0ZSAqb3B0YWI7Ci0gICAgcmVnaXN0ZXIgdGVtcGxhdGVzICpjb3JlX29wdGFiOwotCi0gICAgb3B0YWIgPSBpMzg2X29wdGFiOwkJLyogc2V0dXAgZm9yIGxvb3AgKi8KLSAgICBjb3JlX29wdGFiID0gKHRlbXBsYXRlcyAqKSB4bWFsbG9jIChzaXplb2YgKHRlbXBsYXRlcykpOwotICAgIGNvcmVfb3B0YWItPnN0YXJ0ID0gb3B0YWI7Ci0KLSAgICB3aGlsZSAoMSkKLSAgICAgIHsKLQkrK29wdGFiOwotCWlmIChvcHRhYi0+bmFtZSA9PSBOVUxMCi0JICAgIHx8IHN0cmNtcCAob3B0YWItPm5hbWUsIChvcHRhYiAtIDEpLT5uYW1lKSAhPSAwKQotCSAgewotCSAgICAvKiBkaWZmZXJlbnQgbmFtZSAtLT4gc2hpcCBvdXQgY3VycmVudCB0ZW1wbGF0ZSBsaXN0OwotCSAgICAgICBhZGQgdG8gaGFzaCB0YWJsZTsgJiBiZWdpbiBhbmV3ICovCi0JICAgIGNvcmVfb3B0YWItPmVuZCA9IG9wdGFiOwotCSAgICBoYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLAotCQkJCSAgICAob3B0YWIgLSAxKS0+bmFtZSwKLQkJCQkgICAgKFBUUikgY29yZV9vcHRhYik7Ci0JICAgIGlmIChoYXNoX2VycikKLQkgICAgICB7Ci0JICAgICAgaGFzaF9lcnJvcjoKLQkJYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiAgQ2FuJ3QgaGFzaCAlczogJXMiKSwKLQkJCSAgKG9wdGFiIC0gMSktPm5hbWUsCi0JCQkgIGhhc2hfZXJyKTsKLQkgICAgICB9Ci0JICAgIGlmIChvcHRhYi0+bmFtZSA9PSBOVUxMKQotCSAgICAgIGJyZWFrOwotCSAgICBjb3JlX29wdGFiID0gKHRlbXBsYXRlcyAqKSB4bWFsbG9jIChzaXplb2YgKHRlbXBsYXRlcykpOwotCSAgICBjb3JlX29wdGFiLT5zdGFydCA9IG9wdGFiOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogaW5pdGlhbGl6ZSByZWdfaGFzaCBoYXNoIHRhYmxlICovCi0gIHJlZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICByZWdpc3RlciBjb25zdCByZWdfZW50cnkgKnJlZ3RhYjsKLQotICAgIGZvciAocmVndGFiID0gaTM4Nl9yZWd0YWI7Ci0JIHJlZ3RhYiA8IGkzODZfcmVndGFiICsgc2l6ZW9mIChpMzg2X3JlZ3RhYikgLyBzaXplb2YgKGkzODZfcmVndGFiWzBdKTsKLQkgcmVndGFiKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIHJlZ3RhYi0+cmVnX25hbWUsIChQVFIpIHJlZ3RhYik7Ci0JaWYgKGhhc2hfZXJyKQotCSAgZ290byBoYXNoX2Vycm9yOwotICAgICAgfQotICB9Ci0KLSAgLyogZmlsbCBpbiBsZXhpY2FsIHRhYmxlczogIG1uZW1vbmljX2NoYXJzLCBvcGVyYW5kX2NoYXJzLiAgKi8KLSAgewotICAgIHJlZ2lzdGVyIGludCBjOwotICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0KLSAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspCi0gICAgICB7Ci0JaWYgKGlzZGlnaXQgKGMpKQotCSAgewotCSAgICBkaWdpdF9jaGFyc1tjXSA9IGM7Ci0JICAgIG1uZW1vbmljX2NoYXJzW2NdID0gYzsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOwotCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQkgIH0KLQllbHNlIGlmIChpc2xvd2VyIChjKSkKLQkgIHsKLQkgICAgbW5lbW9uaWNfY2hhcnNbY10gPSBjOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7Ci0JICAgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCSAgfQotCWVsc2UgaWYgKGlzdXBwZXIgKGMpKQotCSAgewotCSAgICBtbmVtb25pY19jaGFyc1tjXSA9IHRvbG93ZXIgKGMpOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IG1uZW1vbmljX2NoYXJzW2NdOwotCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQkgIH0KLQotCWlmIChpc2FscGhhIChjKSB8fCBpc2RpZ2l0IChjKSkKLQkgIGlkZW50aWZpZXJfY2hhcnNbY10gPSBjOwotCWVsc2UgaWYgKGMgPj0gMTI4KQotCSAgewotCSAgICBpZGVudGlmaWVyX2NoYXJzW2NdID0gYzsKLQkgICAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0gICAgICB9Ci0KLSNpZmRlZiBMRVhfQVQKLSAgICBpZGVudGlmaWVyX2NoYXJzWydAJ10gPSAnQCc7Ci0jZW5kaWYKLSAgICBkaWdpdF9jaGFyc1snLSddID0gJy0nOwotICAgIGlkZW50aWZpZXJfY2hhcnNbJ18nXSA9ICdfJzsKLSAgICBpZGVudGlmaWVyX2NoYXJzWycuJ10gPSAnLic7Ci0KLSAgICBmb3IgKHAgPSBvcGVyYW5kX3NwZWNpYWxfY2hhcnM7ICpwICE9ICdcMCc7IHArKykKLSAgICAgIG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpwXSA9ICpwOwotICB9Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHRleHRfc2VjdGlvbiwgMik7Ci0gICAgICByZWNvcmRfYWxpZ25tZW50IChkYXRhX3NlY3Rpb24sIDIpOwotICAgICAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIDIpOwotICAgIH0KLSNlbmRpZgotfQotCi12b2lkCi1pMzg2X3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgImkzODYgb3Bjb2RlIiwgb3BfaGFzaCk7Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgImkzODYgcmVnaXN0ZXIiLCByZWdfaGFzaCk7Ci19Ci0MCi0KLSNpZmRlZiBERUJVRzM4NgotCi0vKiBkZWJ1Z2dpbmcgcm91dGluZXMgZm9yIG1kX2Fzc2VtYmxlICovCi1zdGF0aWMgdm9pZCBwaSBQQVJBTVMgKChjaGFyICosIGkzODZfaW5zbiAqKSk7Ci1zdGF0aWMgdm9pZCBwdGUgUEFSQU1TICgodGVtcGxhdGUgKikpOwotc3RhdGljIHZvaWQgcHQgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBwZSBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcyBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotc3RhdGljIHZvaWQKLXBpIChsaW5lLCB4KQotICAgICBjaGFyICpsaW5lOwotICAgICBpMzg2X2luc24gKng7Ci17Ci0gIHJlZ2lzdGVyIHRlbXBsYXRlICpwOwotICBpbnQgaTsKLQotICBmcHJpbnRmIChzdGRvdXQsICIlczogdGVtcGxhdGUgIiwgbGluZSk7Ci0gIHB0ZSAoJngtPnRtKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiICBtb2RybTogIG1vZGUgJXggIHJlZyAleCAgcmVnL21lbSAleCIsCi0JICAgeC0+cm0ubW9kZSwgeC0+cm0ucmVnLCB4LT5ybS5yZWdtZW0pOwotICBmcHJpbnRmIChzdGRvdXQsICIgYmFzZSAleCAgaW5kZXggJXggIHNjYWxlICV4XG4iLAotCSAgIHgtPmJpLmJhc2UsIHgtPmJpLmluZGV4LCB4LT5iaS5zY2FsZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCB4LT5vcGVyYW5kczsgaSsrKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICAjJWQ6ICAiLCBpICsgMSk7Ci0gICAgICBwdCAoeC0+dHlwZXNbaV0pOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICAgIGlmICh4LT50eXBlc1tpXQotCSAgJiAoUmVnIHwgU1JlZzIgfCBTUmVnMyB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QgfCBSZWdNTVggfCBSZWdYTU0pKQotCWZwcmludGYgKHN0ZG91dCwgIiVzXG4iLCB4LT5vcFtpXS5yZWdzLT5yZWdfbmFtZSk7Ci0gICAgICBpZiAoeC0+dHlwZXNbaV0gJiBJbW0pCi0JcGUgKHgtPm9wW2ldLmltbXMpOwotICAgICAgaWYgKHgtPnR5cGVzW2ldICYgRGlzcCkKLQlwZSAoeC0+b3BbaV0uZGlzcHMpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXB0ZSAodCkKLSAgICAgdGVtcGxhdGUgKnQ7Ci17Ci0gIGludCBpOwotICBmcHJpbnRmIChzdGRvdXQsICIgJWQgb3BlcmFuZHMgIiwgdC0+b3BlcmFuZHMpOwotICBmcHJpbnRmIChzdGRvdXQsICJvcGNvZGUgJXggIiwKLQkgICB0LT5iYXNlX29wY29kZSk7Ci0gIGlmICh0LT5leHRlbnNpb25fb3Bjb2RlICE9IE5vbmUpCi0gICAgZnByaW50ZiAoc3Rkb3V0LCAiZXh0ICV4ICIsIHQtPmV4dGVuc2lvbl9vcGNvZGUpOwotICBpZiAodC0+b3Bjb2RlX21vZGlmaWVyICYgRCkKLSAgICBmcHJpbnRmIChzdGRvdXQsICJEIik7Ci0gIGlmICh0LT5vcGNvZGVfbW9kaWZpZXIgJiBXKQotICAgIGZwcmludGYgKHN0ZG91dCwgIlciKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgZm9yIChpID0gMDsgaSA8IHQtPm9wZXJhbmRzOyBpKyspCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiICAgICMlZCB0eXBlICIsIGkgKyAxKTsKLSAgICAgIHB0ICh0LT5vcGVyYW5kX3R5cGVzW2ldKTsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcGUgKGUpCi0gICAgIGV4cHJlc3Npb25TICplOwotewotICBmcHJpbnRmIChzdGRvdXQsICIgICAgb3BlcmF0aW9uICAgICAlZFxuIiwgZS0+WF9vcCk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIiAgICBhZGRfbnVtYmVyICAgICVsZCAoJWx4KVxuIiwKLQkgICAobG9uZykgZS0+WF9hZGRfbnVtYmVyLCAobG9uZykgZS0+WF9hZGRfbnVtYmVyKTsKLSAgaWYgKGUtPlhfYWRkX3N5bWJvbCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgYWRkX3N5bWJvbCAgICAiKTsKLSAgICAgIHBzIChlLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICB9Ci0gIGlmIChlLT5YX29wX3N5bWJvbCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgb3Bfc3ltYm9sICAgICIpOwotICAgICAgcHMgKGUtPlhfb3Bfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHMgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGZwcmludGYgKHN0ZG91dCwgIiVzIHR5cGUgJXMlcyIsCi0JICAgU19HRVRfTkFNRSAocyksCi0JICAgU19JU19FWFRFUk5BTCAocykgPyAiRVhURVJOQUwgIiA6ICIiLAotCSAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAocykpKTsKLX0KLQotc3RydWN0IHR5cGVfbmFtZQotICB7Ci0gICAgdW5zaWduZWQgaW50IG1hc2s7Ci0gICAgY2hhciAqdG5hbWU7Ci0gIH0KLQotdHlwZV9uYW1lc1tdID0KLXsKLSAgeyBSZWc4LCAicjgiIH0sCi0gIHsgUmVnMTYsICJyMTYiIH0sCi0gIHsgUmVnMzIsICJyMzIiIH0sCi0gIHsgSW1tOCwgImk4IiB9LAotICB7IEltbThTLCAiaThzIiB9LAotICB7IEltbTE2LCAiaTE2IiB9LAotICB7IEltbTMyLCAiaTMyIiB9LAotICB7IEltbTEsICJpMSIgfSwKLSAgeyBCYXNlSW5kZXgsICJCYXNlSW5kZXgiIH0sCi0gIHsgRGlzcDgsICJkOCIgfSwKLSAgeyBEaXNwMTYsICJkMTYiIH0sCi0gIHsgRGlzcDMyLCAiZDMyIiB9LAotICB7IEluT3V0UG9ydFJlZywgIkluT3V0UG9ydFJlZyIgfSwKLSAgeyBTaGlmdENvdW50LCAiU2hpZnRDb3VudCIgfSwKLSAgeyBDb250cm9sLCAiY29udHJvbCByZWciIH0sCi0gIHsgVGVzdCwgInRlc3QgcmVnIiB9LAotICB7IERlYnVnLCAiZGVidWcgcmVnIiB9LAotICB7IEZsb2F0UmVnLCAiRlJlZyIgfSwKLSAgeyBGbG9hdEFjYywgIkZBY2MiIH0sCi0gIHsgU1JlZzIsICJTUmVnMiIgfSwKLSAgeyBTUmVnMywgIlNSZWczIiB9LAotICB7IEFjYywgIkFjYyIgfSwKLSAgeyBKdW1wQWJzb2x1dGUsICJKdW1wIEFic29sdXRlIiB9LAotICB7IFJlZ01NWCwgInJNTVgiIH0sCi0gIHsgUmVnWE1NLCAiclhNTSIgfSwKLSAgeyBFc1NlZywgImVzIiB9LAotICB7IDAsICIiIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1wdCAodCkKLSAgICAgdW5zaWduZWQgaW50IHQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB0eXBlX25hbWUgKnR5OwotCi0gIGlmICh0ID09IFVua25vd24pCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCBfKCJVbmtub3duIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAodHkgPSB0eXBlX25hbWVzOyB0eS0+bWFzazsgdHkrKykKLQlpZiAodCAmIHR5LT5tYXNrKQotCSAgZnByaW50ZiAoc3Rkb3V0LCAiJXMsICIsIHR5LT50bmFtZSk7Ci0gICAgfQotICBmZmx1c2ggKHN0ZG91dCk7Ci19Ci0KLSNlbmRpZiAvKiBERUJVRzM4NiAqLwotDAotaW50Ci10Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgIHN0cnVjdCBmaXggKmZpeHA7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotI2Vsc2UKLSAgLyogRm9yIENPRkYgKi8KLSAgcmV0dXJuIGZpeHAtPmZ4X3JfdHlwZSA9PSA3OwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jCi0gIFBBUkFNUyAoKGludCwgaW50LCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotcmVsb2MgKHNpemUsIHBjcmVsLCBvdGhlcikKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBwY3JlbDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIG90aGVyOwotewotICBpZiAob3RoZXIgIT0gTk9fUkVMT0MpIHJldHVybiBvdGhlcjsKLQotICBpZiAocGNyZWwpCi0gICAgewotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6IHJldHVybiBCRkRfUkVMT0NfOF9QQ1JFTDsKLQljYXNlIDI6IHJldHVybiBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JY2FzZSA0OiByZXR1cm4gQkZEX1JFTE9DXzMyX1BDUkVMOwotCX0KLSAgICAgIGFzX2JhZCAoXygiY2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6IHJldHVybiBCRkRfUkVMT0NfODsKLQljYXNlIDI6IHJldHVybiBCRkRfUkVMT0NfMTY7Ci0JY2FzZSA0OiByZXR1cm4gQkZEX1JFTE9DXzMyOwotCX0KLSAgICAgIGFzX2JhZCAoXygiY2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLX0KLQotLyoKLSAqIEhlcmUgd2UgZGVjaWRlIHdoaWNoIGZpeHVwcyBjYW4gYmUgYWRqdXN0ZWQgdG8gbWFrZSB0aGVtIHJlbGF0aXZlIHRvCi0gKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIGluc3RlYWQgb2YgdGhlIHN5bWJvbC4gIEJhc2ljYWxseSB3ZSBuZWVkCi0gKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyBhcmUgZG9uZSBjb3JyZWN0bHksIHNvIGluCi0gKiBzb21lIGNhc2VzIHdlIGZvcmNlIHRoZSBvcmlnaW5hbCBzeW1ib2wgdG8gYmUgdXNlZC4KLSAqLwotaW50Ci10Y19pMzg2X2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKFRFX1BFKQotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scywgb3IgZWxzZSBkeW5hbWljCi0gICAgIGxpbmtpbmcgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuICAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0gIC8qIGFkanVzdF9yZWxvY19zeW1zIGRvZXNuJ3Qga25vdyBhYm91dCB0aGUgR09UICovCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9HT1RPRkYKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzg2X1BMVDMyCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9HT1QzMgotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19SVkEKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLSNlbHNlCi0jZGVmaW5lIHJlbG9jKFNJWkUsUENSRUwsT1RIRVIpCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzE2CQkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zMgkJMAotI2RlZmluZSBCRkRfUkVMT0NfMTZfUENSRUwJMAotI2RlZmluZSBCRkRfUkVMT0NfMzJfUENSRUwJMAotI2RlZmluZSBCRkRfUkVMT0NfMzg2X1BMVDMyCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzM4Nl9HT1QzMgkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zODZfR09UT0ZGCTAKLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1pbnRlbF9mbG9hdF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKm1uZW1vbmljKSk7Ci0KLXN0YXRpYyBpbnQKLWludGVsX2Zsb2F0X29wZXJhbmQgKG1uZW1vbmljKQotICAgICBjaGFyICptbmVtb25pYzsKLXsKLSAgaWYgKG1uZW1vbmljWzBdID09ICdmJyAmJiBtbmVtb25pY1sxXSA9PSdpJykKLSAgICByZXR1cm4gMjsKLQotICBpZiAobW5lbW9uaWNbMF0gPT0gJ2YnKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBMSU5FIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChsaW5lKQotICAgICBjaGFyICpsaW5lOwotewotICAvKiBQb2ludHMgdG8gdGVtcGxhdGUgb25jZSB3ZSd2ZSBmb3VuZCBpdC4gKi8KLSAgY29uc3QgdGVtcGxhdGUgKnQ7Ci0KLSAgLyogQ291bnQgdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIGdlbmVyYXRlZC4gICovCi0gIGludCBpbnNuX3NpemUgPSAwOwotCi0gIGludCBqOwotCi0gIGNoYXIgbW5lbW9uaWNbTUFYX01ORU1fU0laRV07Ci0KLSAgLyogSW5pdGlhbGl6ZSBnbG9iYWxzLiAqLwotICBtZW1zZXQgKCZpLCAnXDAnLCBzaXplb2YgKGkpKTsKLSAgZm9yIChqID0gMDsgaiA8IE1BWF9PUEVSQU5EUzsgaisrKQotICAgIGkuZGlzcF9yZWxvY1tqXSA9IE5PX1JFTE9DOwotICBtZW1zZXQgKGRpc3BfZXhwcmVzc2lvbnMsICdcMCcsIHNpemVvZiAoZGlzcF9leHByZXNzaW9ucykpOwotICBtZW1zZXQgKGltX2V4cHJlc3Npb25zLCAnXDAnLCBzaXplb2YgKGltX2V4cHJlc3Npb25zKSk7Ci0gIHNhdmVfc3RhY2tfcCA9IHNhdmVfc3RhY2s7CS8qIHJlc2V0IHN0YWNrIHBvaW50ZXIgKi8KLQotICAvKiBGaXJzdCBwYXJzZSBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYyAmIGNhbGwgaTM4Nl9vcGVyYW5kIGZvciB0aGUgb3BlcmFuZHMuCi0gICAgIFdlIGFzc3VtZSB0aGF0IHRoZSBzY3J1YmJlciBoYXMgYXJyYW5nZWQgaXQgc28gdGhhdCBsaW5lWzBdIGlzIHRoZSB2YWxpZAotICAgICBzdGFydCBvZiBhIChwb3NzaWJseSBwcmVmaXhlZCkgbW5lbW9uaWMuICovCi0gIHsKLSAgICBjaGFyICpsID0gbGluZTsKLSAgICBjaGFyICp0b2tlbl9zdGFydCA9IGw7Ci0gICAgY2hhciAqbW5lbV9wOwotCi0gICAgLyogTm9uLXplcm8gaWYgd2UgZm91bmQgYSBwcmVmaXggb25seSBhY2NlcHRhYmxlIHdpdGggc3RyaW5nIGluc25zLiAqLwotICAgIGNvbnN0IGNoYXIgKmV4cGVjdGluZ19zdHJpbmdfaW5zdHJ1Y3Rpb24gPSBOVUxMOwotCi0gICAgd2hpbGUgKDEpCi0gICAgICB7Ci0JbW5lbV9wID0gbW5lbW9uaWM7Ci0Jd2hpbGUgKCgqbW5lbV9wID0gbW5lbW9uaWNfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpsXSkgIT0gMCkKLQkgIHsKLQkgICAgbW5lbV9wKys7Ci0JICAgIGlmIChtbmVtX3AgPj0gbW5lbW9uaWMgKyBzaXplb2YgKG1uZW1vbmljKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygibm8gc3VjaCAzODYgaW5zdHJ1Y3Rpb246IGAlcyciKSwgdG9rZW5fc3RhcnQpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICBsKys7Ci0JICB9Ci0JaWYgKCFpc19zcGFjZV9jaGFyICgqbCkKLQkgICAgJiYgKmwgIT0gRU5EX09GX0lOU04KLQkgICAgJiYgKmwgIT0gUFJFRklYX1NFUEFSQVRPUikKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBtbmVtb25pYyIpLAotCQkgICAgb3V0cHV0X2ludmFsaWQgKCpsKSk7Ci0JICAgIHJldHVybjsKLQkgIH0KLQlpZiAodG9rZW5fc3RhcnQgPT0gbCkKLQkgIHsKLQkgICAgaWYgKCpsID09IFBSRUZJWF9TRVBBUkFUT1IpCi0JICAgICAgYXNfYmFkIChfKCJleHBlY3RpbmcgcHJlZml4OyBnb3Qgbm90aGluZyIpKTsKLQkgICAgZWxzZQotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIG1uZW1vbmljOyBnb3Qgbm90aGluZyIpKTsKLQkgICAgcmV0dXJuOwotCSAgfQotCi0JLyogTG9vayB1cCBpbnN0cnVjdGlvbiAob3IgcHJlZml4KSB2aWEgaGFzaCB0YWJsZS4gICovCi0JY3VycmVudF90ZW1wbGF0ZXMgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG1uZW1vbmljKTsKLQotCWlmICgqbCAhPSBFTkRfT0ZfSU5TTgotCSAgICAmJiAoISBpc19zcGFjZV9jaGFyICgqbCkgfHwgbFsxXSAhPSBFTkRfT0ZfSU5TTikKLQkgICAgJiYgY3VycmVudF90ZW1wbGF0ZXMKLQkgICAgJiYgKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNQcmVmaXgpKQotCSAgewotCSAgICAvKiBJZiB3ZSBhcmUgaW4gMTYtYml0IG1vZGUsIGRvIG5vdCBhbGxvdyBhZGRyMTYgb3IgZGF0YTE2LgotCSAgICAgICBTaW1pbGFybHksIGluIDMyLWJpdCBtb2RlLCBkbyBub3QgYWxsb3cgYWRkcjMyIG9yIGRhdGEzMi4gICovCi0JICAgIGlmICgoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiAoU2l6ZTE2IHwgU2l6ZTMyKSkKLQkJJiYgKCgoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBTaXplMzIpICE9IDApCi0JCSAgICBeIGZsYWdfMTZiaXRfY29kZSkpCi0JICAgICAgewotCQlhc19iYWQgKF8oInJlZHVuZGFudCAlcyBwcmVmaXgiKSwKLQkJCWN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIC8qIEFkZCBwcmVmaXgsIGNoZWNraW5nIGZvciByZXBlYXRlZCBwcmVmaXhlcy4gICovCi0JICAgIHN3aXRjaCAoYWRkX3ByZWZpeCAoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5iYXNlX29wY29kZSkpCi0JICAgICAgewotCSAgICAgIGNhc2UgMDoKLQkJcmV0dXJuOwotCSAgICAgIGNhc2UgMjoKLQkJZXhwZWN0aW5nX3N0cmluZ19pbnN0cnVjdGlvbiA9Ci0JCSAgY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIC8qIFNraXAgcGFzdCBQUkVGSVhfU0VQQVJBVE9SIGFuZCByZXNldCB0b2tlbl9zdGFydC4gICovCi0JICAgIHRva2VuX3N0YXJ0ID0gKytsOwotCSAgfQotCWVsc2UKLQkgIGJyZWFrOwotICAgICAgfQotCi0gICAgaWYgKCFjdXJyZW50X3RlbXBsYXRlcykKLSAgICAgIHsKLQkvKiBTZWUgaWYgd2UgY2FuIGdldCBhIG1hdGNoIGJ5IHRyaW1taW5nIG9mZiBhIHN1ZmZpeC4gICovCi0Jc3dpdGNoIChtbmVtX3BbLTFdKQotCSAgewotCSAgY2FzZSBXT1JEX01ORU1fU1VGRklYOgotCSAgY2FzZSBCWVRFX01ORU1fU1VGRklYOgotCSAgY2FzZSBTSE9SVF9NTkVNX1NVRkZJWDoKLQkgIGNhc2UgTE9OR19NTkVNX1NVRkZJWDoKLQkgICAgaS5zdWZmaXggPSBtbmVtX3BbLTFdOwotCSAgICBtbmVtX3BbLTFdID0gJ1wwJzsKLQkgICAgY3VycmVudF90ZW1wbGF0ZXMgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG1uZW1vbmljKTsKLQkgICAgYnJlYWs7Ci0KLQkgIC8qIEludGVsIFN5bnRheCAqLwotCSAgY2FzZSBEV09SRF9NTkVNX1NVRkZJWDoKLQkgICAgaWYgKGludGVsX3N5bnRheCkKLQkgICAgICB7Ci0JCWkuc3VmZml4ID0gbW5lbV9wWy0xXTsKLQkJbW5lbV9wWy0xXSA9ICdcMCc7Ci0JCWN1cnJlbnRfdGVtcGxhdGVzID0gaGFzaF9maW5kIChvcF9oYXNoLCBtbmVtb25pYyk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQlpZiAoIWN1cnJlbnRfdGVtcGxhdGVzKQotCSAgewotCSAgICBhc19iYWQgKF8oIm5vIHN1Y2ggMzg2IGluc3RydWN0aW9uOiBgJXMnIiksIHRva2VuX3N0YXJ0KTsKLQkgICAgcmV0dXJuOwotCSAgfQotICAgICAgfQotCi0gICAgLyogY2hlY2sgZm9yIHJlcC9yZXBuZSB3aXRob3V0IGEgc3RyaW5nIGluc3RydWN0aW9uICovCi0gICAgaWYgKGV4cGVjdGluZ19zdHJpbmdfaW5zdHJ1Y3Rpb24KLQkmJiAhKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpKQotICAgICAgewotCWFzX2JhZCAoXygiZXhwZWN0aW5nIHN0cmluZyBpbnN0cnVjdGlvbiBhZnRlciBgJXMnIiksCi0JCWV4cGVjdGluZ19zdHJpbmdfaW5zdHJ1Y3Rpb24pOwotCXJldHVybjsKLSAgICAgIH0KLQotICAgIC8qIFRoZXJlIG1heSBiZSBvcGVyYW5kcyB0byBwYXJzZS4gKi8KLSAgICBpZiAoKmwgIT0gRU5EX09GX0lOU04pCi0gICAgICB7Ci0JLyogcGFyc2Ugb3BlcmFuZHMgKi8KLQotCS8qIDEgaWYgb3BlcmFuZCBpcyBwZW5kaW5nIGFmdGVyICcsJy4gKi8KLQl1bnNpZ25lZCBpbnQgZXhwZWN0aW5nX29wZXJhbmQgPSAwOwotCi0JLyogTm9uLXplcm8gaWYgb3BlcmFuZCBwYXJlbnMgbm90IGJhbGFuY2VkLiAqLwotCXVuc2lnbmVkIGludCBwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0KLQlkbwotCSAgewotCSAgICAvKiBza2lwIG9wdGlvbmFsIHdoaXRlIHNwYWNlIGJlZm9yZSBvcGVyYW5kICovCi0JICAgIGlmIChpc19zcGFjZV9jaGFyICgqbCkpCi0JICAgICAgKytsOwotCSAgICBpZiAoIWlzX29wZXJhbmRfY2hhciAoKmwpICYmICpsICE9IEVORF9PRl9JTlNOKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJpbnZhbGlkIGNoYXJhY3RlciAlcyBiZWZvcmUgb3BlcmFuZCAlZCIpLAotCQkJb3V0cHV0X2ludmFsaWQgKCpsKSwKLQkJCWkub3BlcmFuZHMgKyAxKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgdG9rZW5fc3RhcnQgPSBsOwkvKiBhZnRlciB3aGl0ZSBzcGFjZSAqLwotCSAgICBwYXJlbl9ub3RfYmFsYW5jZWQgPSAwOwotCSAgICB3aGlsZSAocGFyZW5fbm90X2JhbGFuY2VkIHx8ICpsICE9ICcsJykKLQkgICAgICB7Ci0JCWlmICgqbCA9PSBFTkRfT0ZfSU5TTikKLQkJICB7Ci0JCSAgICBpZiAocGFyZW5fbm90X2JhbGFuY2VkKQotCQkgICAgICB7Ci0JCQlpZiAoIWludGVsX3N5bnRheCkKLQkJCSAgYXNfYmFkIChfKCJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIGluIG9wZXJhbmQgJWQuIiksCi0JCQkJICBpLm9wZXJhbmRzICsgMSk7Ci0JCQllbHNlCi0JCQkgIGFzX2JhZCAoXygidW5iYWxhbmNlZCBicmFja2V0cyBpbiBvcGVyYW5kICVkLiIpLAotCQkJCSAgaS5vcGVyYW5kcyArIDEpOwotCQkJcmV0dXJuOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIGJyZWFrOwkvKiB3ZSBhcmUgZG9uZSAqLwotCQkgIH0KLQkJZWxzZSBpZiAoIWlzX29wZXJhbmRfY2hhciAoKmwpICYmICFpc19zcGFjZV9jaGFyICgqbCkpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBvcGVyYW5kICVkIiksCi0JCQkgICAgb3V0cHV0X2ludmFsaWQgKCpsKSwKLQkJCSAgICBpLm9wZXJhbmRzICsgMSk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCQlpZiAoIWludGVsX3N5bnRheCkKLQkJICB7Ci0JCSAgICBpZiAoKmwgPT0gJygnKQotCQkgICAgICArK3BhcmVuX25vdF9iYWxhbmNlZDsKLQkJICAgIGlmICgqbCA9PSAnKScpCi0JCSAgICAgIC0tcGFyZW5fbm90X2JhbGFuY2VkOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmICgqbCA9PSAnWycpCi0JCSAgICAgICsrcGFyZW5fbm90X2JhbGFuY2VkOwotCQkgICAgaWYgKCpsID09ICddJykKLQkJICAgICAgLS1wYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JCSAgfQotCQlsKys7Ci0JICAgICAgfQotCSAgICBpZiAobCAhPSB0b2tlbl9zdGFydCkKLQkgICAgICB7CQkJLyogeWVzLCB3ZSd2ZSByZWFkIGluIGFub3RoZXIgb3BlcmFuZCAqLwotCQl1bnNpZ25lZCBpbnQgb3BlcmFuZF9vazsKLQkJdGhpc19vcGVyYW5kID0gaS5vcGVyYW5kcysrOwotCQlpZiAoaS5vcGVyYW5kcyA+IE1BWF9PUEVSQU5EUykKLQkJICB7Ci0JCSAgICBhc19iYWQgKF8oInNwdXJpb3VzIG9wZXJhbmRzOyAoJWQgb3BlcmFuZHMvaW5zdHJ1Y3Rpb24gbWF4KSIpLAotCQkJICAgIE1BWF9PUEVSQU5EUyk7Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCQkvKiBub3cgcGFyc2Ugb3BlcmFuZCBhZGRpbmcgaW5mbyB0byAnaScgYXMgd2UgZ28gYWxvbmcgKi8KLQkJRU5EX1NUUklOR19BTkRfU0FWRSAobCk7Ci0KLQkJaWYgKGludGVsX3N5bnRheCkKLQkJICBvcGVyYW5kX29rID0gaTM4Nl9pbnRlbF9vcGVyYW5kICh0b2tlbl9zdGFydCwgaW50ZWxfZmxvYXRfb3BlcmFuZCAobW5lbW9uaWMpKTsKLQkJZWxzZQotCQkgIG9wZXJhbmRfb2sgPSBpMzg2X29wZXJhbmQgKHRva2VuX3N0YXJ0KTsKLQotCQlSRVNUT1JFX0VORF9TVFJJTkcgKGwpOwkvKiByZXN0b3JlIG9sZCBjb250ZW50cyAqLwotCQlpZiAoIW9wZXJhbmRfb2spCi0JCSAgcmV0dXJuOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKGV4cGVjdGluZ19vcGVyYW5kKQotCQkgIHsKLQkJICBleHBlY3Rpbmdfb3BlcmFuZF9hZnRlcl9jb21tYToKLQkJICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JCWlmICgqbCA9PSAnLCcpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJleHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIpKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIC8qIG5vdyAqbCBtdXN0IGJlIGVpdGhlciAnLCcgb3IgRU5EX09GX0lOU04gKi8KLQkgICAgaWYgKCpsID09ICcsJykKLQkgICAgICB7Ci0JCWlmICgqKytsID09IEVORF9PRl9JTlNOKQotCQkgIHsJCS8qIGp1c3Qgc2tpcCBpdCwgaWYgaXQncyBcbiBjb21wbGFpbiAqLwotCQkgICAgZ290byBleHBlY3Rpbmdfb3BlcmFuZF9hZnRlcl9jb21tYTsKLQkJICB9Ci0JCWV4cGVjdGluZ19vcGVyYW5kID0gMTsKLQkgICAgICB9Ci0JICB9Ci0Jd2hpbGUgKCpsICE9IEVORF9PRl9JTlNOKTsJLyogdW50aWwgd2UgZ2V0IGVuZCBvZiBpbnNuICovCi0gICAgICB9Ci0gIH0KLQotICAvKiBOb3cgd2UndmUgcGFyc2VkIHRoZSBtbmVtb25pYyBpbnRvIGEgc2V0IG9mIHRlbXBsYXRlcywgYW5kIGhhdmUgdGhlCi0gICAgIG9wZXJhbmRzIGF0IGhhbmQuCi0KLSAgICAgTmV4dCwgd2UgZmluZCBhIHRlbXBsYXRlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaW5zbiwKLSAgICAgbWFraW5nIHN1cmUgdGhlIG92ZXJsYXAgb2YgdGhlIGdpdmVuIG9wZXJhbmRzIHR5cGVzIGlzIGNvbnNpc3RlbnQKLSAgICAgd2l0aCB0aGUgdGVtcGxhdGUgb3BlcmFuZCB0eXBlcy4gKi8KLQotI2RlZmluZSBNQVRDSChvdmVybGFwLCBnaXZlbiwgdGVtcGxhdGUpIFwKLSAgKChvdmVybGFwICYgfkp1bXBBYnNvbHV0ZSkgXAotICAgJiYgKChnaXZlbikgJiAoQmFzZUluZGV4fEp1bXBBYnNvbHV0ZSkpID09ICgob3ZlcmxhcCkgJiAoQmFzZUluZGV4fEp1bXBBYnNvbHV0ZSkpKQotCi0gIC8qIElmIGdpdmVuIHR5cGVzIHIwIGFuZCByMSBhcmUgcmVnaXN0ZXJzIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlCi0gICAgIHVubGVzcyB0aGUgZXhwZWN0ZWQgb3BlcmFuZCB0eXBlIHJlZ2lzdGVyIG92ZXJsYXAgaXMgbnVsbC4KLSAgICAgTm90ZSB0aGF0IEFjYyBpbiBhIHRlbXBsYXRlIG1hdGNoZXMgZXZlcnkgc2l6ZSBvZiByZWcuICAqLwotI2RlZmluZSBDT05TSVNURU5UX1JFR0lTVEVSX01BVENIKG0wLCBnMCwgdDAsIG0xLCBnMSwgdDEpIFwKLSAgKCAoKGcwKSAmIFJlZykgPT0gMCB8fCAoKGcxKSAmIFJlZykgPT0gMCB8fCBcCi0gICAgKChnMCkgJiBSZWcpID09ICgoZzEpICYgUmVnKSB8fCBcCi0gICAgKCgoKG0wKSAmIEFjYykgPyBSZWcgOiAodDApKSAmICgoKG0xKSAmIEFjYykgPyBSZWcgOiAodDEpKSAmIFJlZykgPT0gMCApCi0KLSAgewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBvdmVybGFwMCwgb3ZlcmxhcDE7Ci0gICAgdW5zaWduZWQgaW50IG92ZXJsYXAyOwotICAgIHVuc2lnbmVkIGludCBmb3VuZF9yZXZlcnNlX21hdGNoOwotICAgIGludCBzdWZmaXhfY2hlY2s7Ci0KLSAgICAvKiBBbGwgaW50ZWwgb3Bjb2RlcyBoYXZlIHJldmVyc2VkIG9wZXJhbmRzIGV4Y2VwdCBmb3IgImJvdW5kIiBhbmQKLSAgICAgICAiZW50ZXIiLiAgV2UgYWxzbyBkb24ndCByZXZlcnNlIGludGVyc2VnbWVudCAiam1wIiBhbmQgImNhbGwiCi0gICAgICAgaW5zdHJ1Y3Rpb25zIHdpdGggMiBpbW1lZGlhdGUgb3BlcmFuZHMgc28gdGhhdCB0aGUgaW1tZWRpYXRlIHNlZ21lbnQKLSAgICAgICBwcmVjZWRlcyB0aGUgb2Zmc2V0LCBhcyBpdCBkb2VzIHdoZW4gaW4gQVQmVCBtb2RlLiAgImVudGVyIiBhbmQgdGhlCi0gICAgICAgaW50ZXJzZWdtZW50ICJqbXAiIGFuZCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgb25seSBvbmVzIHRoYXQKLSAgICAgICBoYXZlIHR3byBpbW1lZGlhdGUgb3BlcmFuZHMuICAqLwotICAgIGlmIChpbnRlbF9zeW50YXggJiYgaS5vcGVyYW5kcyA+IDEKLQkmJiAoc3RyY21wIChtbmVtb25pYywgImJvdW5kIikgIT0gMCkKLQkmJiAhKChpLnR5cGVzWzBdICYgSW1tKSAmJiAoaS50eXBlc1sxXSAmIEltbSkpKQotICAgICAgewotCXVuaW9uIGkzODZfb3AgdGVtcF9vcDsKLQl1bnNpZ25lZCBpbnQgdGVtcF90eXBlOwotCWludCB4Y2hnMSA9IDA7Ci0JaW50IHhjaGcyID0gMDsKLQotCWlmIChpLm9wZXJhbmRzID09IDIpCi0JICB7Ci0JICAgIHhjaGcxID0gMDsKLQkgICAgeGNoZzIgPSAxOwotCSAgfQotCWVsc2UgaWYgKGkub3BlcmFuZHMgPT0gMykKLQkgIHsKLQkgICAgeGNoZzEgPSAwOwotCSAgICB4Y2hnMiA9IDI7Ci0JICB9Ci0JdGVtcF90eXBlID0gaS50eXBlc1t4Y2hnMl07Ci0JaS50eXBlc1t4Y2hnMl0gPSBpLnR5cGVzW3hjaGcxXTsKLQlpLnR5cGVzW3hjaGcxXSA9IHRlbXBfdHlwZTsKLQl0ZW1wX29wID0gaS5vcFt4Y2hnMl07Ci0JaS5vcFt4Y2hnMl0gPSBpLm9wW3hjaGcxXTsKLQlpLm9wW3hjaGcxXSA9IHRlbXBfb3A7Ci0KLQlpZiAoaS5tZW1fb3BlcmFuZHMgPT0gMikKLQkgIHsKLQkgICAgY29uc3Qgc2VnX2VudHJ5ICp0ZW1wX3NlZzsKLQkgICAgdGVtcF9zZWcgPSBpLnNlZ1swXTsKLQkgICAgaS5zZWdbMF0gPSBpLnNlZ1sxXTsKLQkgICAgaS5zZWdbMV0gPSB0ZW1wX3NlZzsKLQkgIH0KLSAgICAgIH0KLQotICAgIGlmIChpLmltbV9vcGVyYW5kcykKLSAgICAgIHsKLQkvKiBUcnkgdG8gZW5zdXJlIGNvbnN0YW50IGltbWVkaWF0ZXMgYXJlIHJlcHJlc2VudGVkIGluIHRoZSBzbWFsbGVzdAotCSAgIG9wY29kZSBwb3NzaWJsZS4gICovCi0JY2hhciBndWVzc19zdWZmaXggPSAwOwotCWludCBvcDsKLQotCWlmIChpLnN1ZmZpeCkKLQkgIGd1ZXNzX3N1ZmZpeCA9IGkuc3VmZml4OwotCWVsc2UgaWYgKGkucmVnX29wZXJhbmRzKQotCSAgewotCSAgICAvKiBGaWd1cmUgb3V0IGEgc3VmZml4IGZyb20gdGhlIGxhc3QgcmVnaXN0ZXIgb3BlcmFuZCBzcGVjaWZpZWQuCi0JICAgICAgIFdlIGNhbid0IGRvIHRoaXMgcHJvcGVybHkgeWV0LCBpZS4gZXhjbHVkaW5nIEluT3V0UG9ydFJlZywKLQkgICAgICAgYnV0IHRoZSBmb2xsb3dpbmcgd29ya3MgZm9yIGluc3RydWN0aW9ucyB3aXRoIGltbWVkaWF0ZXMuCi0JICAgICAgIEluIGFueSBjYXNlLCB3ZSBjYW4ndCBzZXQgaS5zdWZmaXggeWV0LiAgKi8KLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIGlmIChpLnR5cGVzW29wXSAmIFJlZykKLQkJewotCQkgIGlmIChpLnR5cGVzW29wXSAmIFJlZzgpCi0JCSAgICBndWVzc19zdWZmaXggPSBCWVRFX01ORU1fU1VGRklYOwotCQkgIGVsc2UgaWYgKGkudHlwZXNbb3BdICYgUmVnMTYpCi0JCSAgICBndWVzc19zdWZmaXggPSBXT1JEX01ORU1fU1VGRklYOwotCQkgIGJyZWFrOwotCQl9Ci0JICB9Ci0JZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgaWYgKChpLnR5cGVzW29wXSAmIEltbSkKLQkgICAgICAmJiBpLm9wW29wXS5pbW1zLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICAvKiBJZiBhIHN1ZmZpeCBpcyBnaXZlbiwgdGhpcyBvcGVyYW5kIG1heSBiZSBzaG9ydGVuZWQuICAqLwotCSAgICAgIHN3aXRjaCAoZ3Vlc3Nfc3VmZml4KQotCQl7Ci0JCWNhc2UgV09SRF9NTkVNX1NVRkZJWDoKLQkJICBpLnR5cGVzW29wXSB8PSBJbW0xNjsKLQkJICBicmVhazsKLQkJY2FzZSBCWVRFX01ORU1fU1VGRklYOgotCQkgIGkudHlwZXNbb3BdIHw9IEltbTE2IHwgSW1tOCB8IEltbThTOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgaXMgYXQgbW9zdCAxNiBiaXRzLCBjb252ZXJ0IGl0IHRvIGEKLQkJIHNpZ25lZCAxNiBiaXQgbnVtYmVyIGJlZm9yZSB0cnlpbmcgdG8gc2VlIHdoZXRoZXIgaXQgd2lsbAotCQkgZml0IGluIGFuIGV2ZW4gc21hbGxlciBzaXplLiAgVGhpcyBhbGxvd3MgYSAxNi1iaXQgb3BlcmFuZAotCQkgc3VjaCBhcyAkMHhmZmUwIHRvIGJlIHJlY29nbmlzZWQgYXMgd2l0aGluIEltbThTIHJhbmdlLiAgKi8KLQkgICAgICBpZiAoKGkudHlwZXNbb3BdICYgSW1tMTYpCi0JCSAgJiYgKGkub3Bbb3BdLmltbXMtPlhfYWRkX251bWJlciAmIH4ob2Zmc2V0VCkweGZmZmYpID09IDApCi0JCXsKLQkJICBpLm9wW29wXS5pbW1zLT5YX2FkZF9udW1iZXIgPQotCQkgICAgKCgoaS5vcFtvcF0uaW1tcy0+WF9hZGRfbnVtYmVyICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDApOwotCQl9Ci0JICAgICAgaS50eXBlc1tvcF0gfD0gc21hbGxlc3RfaW1tX3R5cGUgKChsb25nKSBpLm9wW29wXS5pbW1zLT5YX2FkZF9udW1iZXIpOwotCSAgICB9Ci0gICAgICB9Ci0KLSAgICBvdmVybGFwMCA9IDA7Ci0gICAgb3ZlcmxhcDEgPSAwOwotICAgIG92ZXJsYXAyID0gMDsKLSAgICBmb3VuZF9yZXZlcnNlX21hdGNoID0gMDsKLSAgICBzdWZmaXhfY2hlY2sgPSAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWAotCQkgICAgPyBOb19iU3VmCi0JCSAgICA6IChpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYCi0JCSAgICAgICA/IE5vX3dTdWYKLQkJICAgICAgIDogKGkuc3VmZml4ID09IFNIT1JUX01ORU1fU1VGRklYCi0JCQkgID8gTm9fc1N1ZgotCQkJICA6IChpLnN1ZmZpeCA9PSBMT05HX01ORU1fU1VGRklYCi0JCQkgICAgID8gTm9fbFN1ZgotCQkJICAgICA6IChpLnN1ZmZpeCA9PSBEV09SRF9NTkVNX1NVRkZJWAotCQkJCT8gTm9fZFN1ZgotCQkJCTogKGkuc3VmZml4ID09IExPTkdfRE9VQkxFX01ORU1fU1VGRklYID8gTm9feFN1ZiA6IDApKSkpKSk7Ci0KLSAgICBmb3IgKHQgPSBjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQ7Ci0JIHQgPCBjdXJyZW50X3RlbXBsYXRlcy0+ZW5kOwotCSB0KyspCi0gICAgICB7Ci0JLyogTXVzdCBoYXZlIHJpZ2h0IG51bWJlciBvZiBvcGVyYW5kcy4gKi8KLQlpZiAoaS5vcGVyYW5kcyAhPSB0LT5vcGVyYW5kcykKLQkgIGNvbnRpbnVlOwotCi0JLyogQ2hlY2sgdGhlIHN1ZmZpeCwgZXhjZXB0IGZvciBzb21lIGluc3RydWN0aW9ucyBpbiBpbnRlbCBtb2RlLiAgKi8KLQlpZiAoKHQtPm9wY29kZV9tb2RpZmllciAmIHN1ZmZpeF9jaGVjaykKLQkgICAgJiYgIShpbnRlbF9zeW50YXgKLQkJICYmIHQtPmJhc2Vfb3Bjb2RlID09IDB4ZDkKLQkJICYmICh0LT5leHRlbnNpb25fb3Bjb2RlID09IDUJLyogMHhkOSw1ICJmbGRjdyIgICovCi0JCSAgICAgfHwgdC0+ZXh0ZW5zaW9uX29wY29kZSA9PSA3KSkpIC8qIDB4ZDksNyAiZntufXN0Y3ciICAqLwotCSAgY29udGludWU7Ci0KLQllbHNlIGlmICghdC0+b3BlcmFuZHMpCi0JICBicmVhazsJCS8qIDAgb3BlcmFuZHMgYWx3YXlzIG1hdGNoZXMgKi8KLQotCW92ZXJsYXAwID0gaS50eXBlc1swXSAmIHQtPm9wZXJhbmRfdHlwZXNbMF07Ci0Jc3dpdGNoICh0LT5vcGVyYW5kcykKLQkgIHsKLQkgIGNhc2UgMToKLQkgICAgaWYgKCFNQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sIHQtPm9wZXJhbmRfdHlwZXNbMF0pKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgIGNhc2UgMzoKLQkgICAgb3ZlcmxhcDEgPSBpLnR5cGVzWzFdICYgdC0+b3BlcmFuZF90eXBlc1sxXTsKLQkgICAgaWYgKCFNQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sIHQtPm9wZXJhbmRfdHlwZXNbMF0pCi0JCXx8ICFNQVRDSCAob3ZlcmxhcDEsIGkudHlwZXNbMV0sIHQtPm9wZXJhbmRfdHlwZXNbMV0pCi0JCXx8ICFDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwKLQkJCQkJICAgICAgIHQtPm9wZXJhbmRfdHlwZXNbMF0sCi0JCQkJCSAgICAgICBvdmVybGFwMSwgaS50eXBlc1sxXSwKLQkJCQkJICAgICAgIHQtPm9wZXJhbmRfdHlwZXNbMV0pKQotCSAgICAgIHsKLQotCQkvKiBjaGVjayBpZiBvdGhlciBkaXJlY3Rpb24gaXMgdmFsaWQgLi4uICovCi0JCWlmICgodC0+b3Bjb2RlX21vZGlmaWVyICYgKER8RmxvYXREKSkgPT0gMCkKLQkJICBjb250aW51ZTsKLQotCQkvKiB0cnkgcmV2ZXJzaW5nIGRpcmVjdGlvbiBvZiBvcGVyYW5kcyAqLwotCQlvdmVybGFwMCA9IGkudHlwZXNbMF0gJiB0LT5vcGVyYW5kX3R5cGVzWzFdOwotCQlvdmVybGFwMSA9IGkudHlwZXNbMV0gJiB0LT5vcGVyYW5kX3R5cGVzWzBdOwotCQlpZiAoIU1BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwgdC0+b3BlcmFuZF90eXBlc1sxXSkKLQkJICAgIHx8ICFNQVRDSCAob3ZlcmxhcDEsIGkudHlwZXNbMV0sIHQtPm9wZXJhbmRfdHlwZXNbMF0pCi0JCSAgICB8fCAhQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sCi0JCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzFdLAotCQkJCQkJICAgb3ZlcmxhcDEsIGkudHlwZXNbMV0sCi0JCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzBdKSkKLQkJICB7Ci0JCSAgICAvKiBkb2VzIG5vdCBtYXRjaCBlaXRoZXIgZGlyZWN0aW9uICovCi0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0JCS8qIGZvdW5kX3JldmVyc2VfbWF0Y2ggaG9sZHMgd2hpY2ggb2YgRCBvciBGbG9hdERSCi0JCSAgIHdlJ3ZlIGZvdW5kLiAgKi8KLQkJZm91bmRfcmV2ZXJzZV9tYXRjaCA9IHQtPm9wY29kZV9tb2RpZmllciAmIChEfEZsb2F0RFIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIC8qIGZvdW5kIGEgZm9yd2FyZCAyIG9wZXJhbmQgbWF0Y2ggaGVyZSAqLwotCSAgICBpZiAodC0+b3BlcmFuZHMgPT0gMykKLQkgICAgICB7Ci0JCS8qIEhlcmUgd2UgbWFrZSB1c2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbm8KLQkJICAgcmV2ZXJzZSBtYXRjaCAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLCBhbmQgYWxsIDMKLQkJICAgb3BlcmFuZCBpbnN0cnVjdGlvbnMgb25seSBuZWVkIHRvIGJlIGNoZWNrZWQgZm9yCi0JCSAgIHJlZ2lzdGVyIGNvbnNpc3RlbmN5IGJldHdlZW4gb3BlcmFuZHMgMiBhbmQgMy4gICovCi0JCW92ZXJsYXAyID0gaS50eXBlc1syXSAmIHQtPm9wZXJhbmRfdHlwZXNbMl07Ci0JCWlmICghTUFUQ0ggKG92ZXJsYXAyLCBpLnR5cGVzWzJdLCB0LT5vcGVyYW5kX3R5cGVzWzJdKQotCQkgICAgfHwgIUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggKG92ZXJsYXAxLCBpLnR5cGVzWzFdLAotCQkJCQkJICAgdC0+b3BlcmFuZF90eXBlc1sxXSwKLQkJCQkJCSAgIG92ZXJsYXAyLCBpLnR5cGVzWzJdLAotCQkJCQkJICAgdC0+b3BlcmFuZF90eXBlc1syXSkpCi0KLQkJICBjb250aW51ZTsKLQkgICAgICB9Ci0JICAgIC8qIGZvdW5kIGVpdGhlciBmb3J3YXJkL3JldmVyc2UgMiBvciAzIG9wZXJhbmQgbWF0Y2ggaGVyZToKLQkgICAgICAgc2xpcCB0aHJvdWdoIHRvIGJyZWFrICovCi0JICB9Ci0JYnJlYWs7CQkJLyogd2UndmUgZm91bmQgYSBtYXRjaDsgYnJlYWsgb3V0IG9mIGxvb3AgKi8KLSAgICAgIH0JCQkJLyogZm9yICh0ID0gLi4uICovCi0gICAgaWYgKHQgPT0gY3VycmVudF90ZW1wbGF0ZXMtPmVuZCkKLSAgICAgIHsJCQkJLyogd2UgZm91bmQgbm8gbWF0Y2ggKi8KLQlhc19iYWQgKF8oInN1ZmZpeCBvciBvcGVyYW5kcyBpbnZhbGlkIGZvciBgJXMnIiksCi0JCWN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gICAgaWYgKCFpbnRlbF9zeW50YXgKLQkmJiAoaS50eXBlc1swXSAmIEp1bXBBYnNvbHV0ZSkgIT0gKHQtPm9wZXJhbmRfdHlwZXNbMF0gJiBKdW1wQWJzb2x1dGUpKQotICAgICAgewotCWFzX3dhcm4gKF8oImluZGlyZWN0ICVzIHdpdGhvdXQgYConIiksIHQtPm5hbWUpOwotICAgICAgfQotCi0gICAgaWYgKCh0LT5vcGNvZGVfbW9kaWZpZXIgJiAoSXNQcmVmaXh8SWdub3JlU2l6ZSkpID09IChJc1ByZWZpeHxJZ25vcmVTaXplKSkKLSAgICAgIHsKLQkvKiBXYXJuIHRoZW0gdGhhdCBhIGRhdGEgb3IgYWRkcmVzcyBzaXplIHByZWZpeCBkb2Vzbid0IGFmZmVjdAotCSAgIGFzc2VtYmx5IG9mIHRoZSBuZXh0IGxpbmUgb2YgY29kZS4gICovCi0JYXNfd2FybiAoXygic3RhbmQtYWxvbmUgYCVzJyBwcmVmaXgiKSwgdC0+bmFtZSk7Ci0gICAgICB9Ci0KLSAgICAvKiBDb3B5IHRoZSB0ZW1wbGF0ZSB3ZSBmb3VuZC4gICovCi0gICAgaS50bSA9ICp0OwotICAgIGlmIChmb3VuZF9yZXZlcnNlX21hdGNoKQotICAgICAgewotCS8qIElmIHdlIGZvdW5kIGEgcmV2ZXJzZSBtYXRjaCB3ZSBtdXN0IGFsdGVyIHRoZSBvcGNvZGUKLQkgICBkaXJlY3Rpb24gYml0LiAgZm91bmRfcmV2ZXJzZV9tYXRjaCBob2xkcyBiaXRzIHRvIGNoYW5nZQotCSAgIChkaWZmZXJlbnQgZm9yIGludCAmIGZsb2F0IGluc25zKS4gICovCi0KLQlpLnRtLmJhc2Vfb3Bjb2RlIF49IGZvdW5kX3JldmVyc2VfbWF0Y2g7Ci0KLQlpLnRtLm9wZXJhbmRfdHlwZXNbMF0gPSB0LT5vcGVyYW5kX3R5cGVzWzFdOwotCWkudG0ub3BlcmFuZF90eXBlc1sxXSA9IHQtPm9wZXJhbmRfdHlwZXNbMF07Ci0gICAgICB9Ci0KLSAgICAvKiBVbmRvIFNZU1YzODZfQ09NUEFUIGJyb2tlbm5lc3Mgd2hlbiBpbiBJbnRlbCBtb2RlLiAgU2VlIGkzODYuaCAgKi8KLSAgICAgaWYgKFNZU1YzODZfQ09NUEFUCi0JICYmIGludGVsX3N5bnRheAotCSAmJiAoaS50bS5iYXNlX29wY29kZSAmIDB4ZmZmZmZkZTApID09IDB4ZGNlMCkKLSAgICAgICBpLnRtLmJhc2Vfb3Bjb2RlIF49IEZsb2F0UjsKLQotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEZXYWl0KQotICAgICAgaWYgKCEgYWRkX3ByZWZpeCAoRldBSVRfT1BDT0RFKSkKLQlyZXR1cm47Ci0KLSAgICAvKiBDaGVjayBzdHJpbmcgaW5zdHJ1Y3Rpb24gc2VnbWVudCBvdmVycmlkZXMgKi8KLSAgICBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpICE9IDAgJiYgaS5tZW1fb3BlcmFuZHMgIT0gMCkKLSAgICAgIHsKLQlpbnQgbWVtX29wID0gKGkudHlwZXNbMF0gJiBBbnlNZW0pID8gMCA6IDE7Ci0JaWYgKChpLnRtLm9wZXJhbmRfdHlwZXNbbWVtX29wXSAmIEVzU2VnKSAhPSAwKQotCSAgewotCSAgICBpZiAoaS5zZWdbMF0gIT0gTlVMTCAmJiBpLnNlZ1swXSAhPSAmZXMpCi0JICAgICAgewotCQlhc19iYWQgKF8oImAlcycgb3BlcmFuZCAlZCBtdXN0IHVzZSBgJSVlcycgc2VnbWVudCIpLAotCQkJaS50bS5uYW1lLAotCQkJbWVtX29wICsgMSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIC8qIFRoZXJlJ3Mgb25seSBldmVyIG9uZSBzZWdtZW50IG92ZXJyaWRlIGFsbG93ZWQgcGVyIGluc3RydWN0aW9uLgotCSAgICAgICBUaGlzIGluc3RydWN0aW9uIHBvc3NpYmx5IGhhcyBhIGxlZ2FsIHNlZ21lbnQgb3ZlcnJpZGUgb24gdGhlCi0JICAgICAgIHNlY29uZCBvcGVyYW5kLCBzbyBjb3B5IHRoZSBzZWdtZW50IHRvIHdoZXJlIG5vbi1zdHJpbmcKLQkgICAgICAgaW5zdHJ1Y3Rpb25zIHN0b3JlIGl0LCBhbGxvd2luZyBjb21tb24gY29kZS4gICovCi0JICAgIGkuc2VnWzBdID0gaS5zZWdbMV07Ci0JICB9Ci0JZWxzZSBpZiAoKGkudG0ub3BlcmFuZF90eXBlc1ttZW1fb3AgKyAxXSAmIEVzU2VnKSAhPSAwKQotCSAgewotCSAgICBpZiAoaS5zZWdbMV0gIT0gTlVMTCAmJiBpLnNlZ1sxXSAhPSAmZXMpCi0JICAgICAgewotCQlhc19iYWQgKF8oImAlcycgb3BlcmFuZCAlZCBtdXN0IHVzZSBgJSVlcycgc2VnbWVudCIpLAotCQkJaS50bS5uYW1lLAotCQkJbWVtX29wICsgMik7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAvKiBJZiBtYXRjaGVkIGluc3RydWN0aW9uIHNwZWNpZmllcyBhbiBleHBsaWNpdCBpbnN0cnVjdGlvbiBtbmVtb25pYwotICAgICAgIHN1ZmZpeCwgdXNlIGl0LiAgKi8KLSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiAoU2l6ZTE2IHwgU2l6ZTMyKSkKLSAgICAgIHsKLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBTaXplMTYpCi0JICBpLnN1ZmZpeCA9IFdPUkRfTU5FTV9TVUZGSVg7Ci0JZWxzZQotCSAgaS5zdWZmaXggPSBMT05HX01ORU1fU1VGRklYOwotICAgICAgfQotICAgIGVsc2UgaWYgKGkucmVnX29wZXJhbmRzKQotICAgICAgewotCS8qIElmIHRoZXJlJ3Mgbm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IHdlIHRyeSB0byBpbnZlbnQgb25lCi0JICAgYmFzZWQgb24gcmVnaXN0ZXIgb3BlcmFuZHMuICovCi0JaWYgKCFpLnN1ZmZpeCkKLQkgIHsKLQkgICAgLyogV2UgdGFrZSBpLnN1ZmZpeCBmcm9tIHRoZSBsYXN0IHJlZ2lzdGVyIG9wZXJhbmQgc3BlY2lmaWVkLAotCSAgICAgICBEZXN0aW5hdGlvbiByZWdpc3RlciB0eXBlIGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiBzb3VyY2UKLQkgICAgICAgcmVnaXN0ZXIgdHlwZS4gICovCi0JICAgIGludCBvcDsKLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIGlmICgoaS50eXBlc1tvcF0gJiBSZWcpCi0JCSAgJiYgIShpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgSW5PdXRQb3J0UmVnKSkKLQkJewotCQkgIGkuc3VmZml4ID0gKChpLnR5cGVzW29wXSAmIFJlZzgpID8gQllURV9NTkVNX1NVRkZJWCA6Ci0JCQkgICAgICAoaS50eXBlc1tvcF0gJiBSZWcxNikgPyBXT1JEX01ORU1fU1VGRklYIDoKLQkJCSAgICAgIExPTkdfTU5FTV9TVUZGSVgpOwotCQkgIGJyZWFrOwotCQl9Ci0JICB9Ci0JZWxzZSBpZiAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCkKLQkgIHsKLQkgICAgaW50IG9wOwotCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCi0JICAgICAgewotCQkvKiBJZiB0aGlzIGlzIGFuIGVpZ2h0IGJpdCByZWdpc3RlciwgaXQncyBPSy4gIElmIGl0J3MKLQkJICAgdGhlIDE2IG9yIDMyIGJpdCB2ZXJzaW9uIG9mIGFuIGVpZ2h0IGJpdCByZWdpc3RlciwKLQkJICAgd2Ugd2lsbCBqdXN0IHVzZSB0aGUgbG93IHBvcnRpb24sIGFuZCB0aGF0J3MgT0sgdG9vLiAqLwotCQlpZiAoaS50eXBlc1tvcF0gJiBSZWc4KQotCQkgIGNvbnRpbnVlOwotCi0JCS8qIG1vdnp4IGFuZCBtb3ZzeCBzaG91bGQgbm90IGdlbmVyYXRlIHRoaXMgd2FybmluZy4gKi8KLQkJaWYgKGludGVsX3N5bnRheAotCQkgICAgJiYgKGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYjcKLQkJCXx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYjYKLQkJCXx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYmUKLQkJCXx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYmYpKQotCQkgIGNvbnRpbnVlOwotCi0JCWlmICgoaS50eXBlc1tvcF0gJiBXb3JkUmVnKSAmJiBpLm9wW29wXS5yZWdzLT5yZWdfbnVtIDwgNAotI2lmIDAKLQkJICAgIC8qIENoZWNrIHRoYXQgdGhlIHRlbXBsYXRlIGFsbG93cyBlaWdodCBiaXQgcmVncwotCQkgICAgICAgVGhpcyBraWxscyBpbnNucyBzdWNoIGFzIGBvcmIgJDEsJWVkeCcsIHdoaWNoCi0JCSAgICAgICBtYXliZSBzaG91bGQgYmUgYWxsb3dlZC4gICovCi0JCSAgICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWc4fEluT3V0UG9ydFJlZykpCi0jZW5kaWYKLQkJICAgICkKLQkJICB7Ci0jaWYgUkVHSVNURVJfV0FSTklOR1MKLQkJICAgIGlmICgoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIEluT3V0UG9ydFJlZykgPT0gMCkKLQkJICAgICAgYXNfd2FybiAoXygidXNpbmcgYCUlJXMnIGluc3RlYWQgb2YgYCUlJXMnIGR1ZSB0byBgJWMnIHN1ZmZpeCIpLAotCQkJICAgICAgIChpLm9wW29wXS5yZWdzIC0gKGkudHlwZXNbb3BdICYgUmVnMTYgPyA4IDogMTYpKS0+cmVnX25hbWUsCi0JCQkgICAgICAgaS5vcFtvcF0ucmVncy0+cmVnX25hbWUsCi0JCQkgICAgICAgaS5zdWZmaXgpOwotI2VuZGlmCi0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0JCS8qIEFueSBvdGhlciByZWdpc3RlciBpcyBiYWQgKi8KLQkJaWYgKGkudHlwZXNbb3BdICYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJCSAgIHwgU1JlZzIgfCBTUmVnMwotCQkJCSAgIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdAotCQkJCSAgIHwgRmxvYXRSZWcgfCBGbG9hdEFjYykpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciKSwKLQkJCSAgICBpLm9wW29wXS5yZWdzLT5yZWdfbmFtZSwKLQkJCSAgICBpLnRtLm5hbWUsCi0JCQkgICAgaS5zdWZmaXgpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAoaS5zdWZmaXggPT0gTE9OR19NTkVNX1NVRkZJWCkKLQkgIHsKLQkgICAgaW50IG9wOwotCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCi0JICAgICAgLyogUmVqZWN0IGVpZ2h0IGJpdCByZWdpc3RlcnMsIGV4Y2VwdCB3aGVyZSB0aGUgdGVtcGxhdGUKLQkJIHJlcXVpcmVzIHRoZW0uIChlZy4gbW92emIpICAqLwotCSAgICAgIGlmICgoaS50eXBlc1tvcF0gJiBSZWc4KSAhPSAwCi0JCSAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMTZ8UmVnMzJ8QWNjKSkgIT0gMCkKLQkJewotCQkgIGFzX2JhZCAoXygiYCUlJXMnIG5vdCBhbGxvd2VkIHdpdGggYCVzJWMnIiksCi0JCQkgIGkub3Bbb3BdLnJlZ3MtPnJlZ19uYW1lLAotCQkJICBpLnRtLm5hbWUsCi0JCQkgIGkuc3VmZml4KTsKLQkJICByZXR1cm47Ci0JCX0KLSNpZiBSRUdJU1RFUl9XQVJOSU5HUwotCSAgICAgIC8qIFdhcm4gaWYgdGhlIGUgcHJlZml4IG9uIGEgZ2VuZXJhbCByZWcgaXMgbWlzc2luZy4gICovCi0JICAgICAgZWxzZSBpZiAoKGkudHlwZXNbb3BdICYgUmVnMTYpICE9IDAKLQkJICAgICAgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzMyfEFjYykpICE9IDApCi0JCXsKLQkJICBhc193YXJuIChfKCJ1c2luZyBgJSUlcycgaW5zdGVhZCBvZiBgJSUlcycgZHVlIHRvIGAlYycgc3VmZml4IiksCi0JCQkgICAoaS5vcFtvcF0ucmVncyArIDgpLT5yZWdfbmFtZSwKLQkJCSAgIGkub3Bbb3BdLnJlZ3MtPnJlZ19uYW1lLAotCQkJICAgaS5zdWZmaXgpOwotCQl9Ci0jZW5kaWYKLQkgIH0KLQllbHNlIGlmIChpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYKQotCSAgewotCSAgICBpbnQgb3A7Ci0JICAgIGZvciAob3AgPSBpLm9wZXJhbmRzOyAtLW9wID49IDA7ICkKLQkgICAgICAvKiBSZWplY3QgZWlnaHQgYml0IHJlZ2lzdGVycywgZXhjZXB0IHdoZXJlIHRoZSB0ZW1wbGF0ZQotCQkgcmVxdWlyZXMgdGhlbS4gKGVnLiBtb3Z6YikgICovCi0JICAgICAgaWYgKChpLnR5cGVzW29wXSAmIFJlZzgpICE9IDAKLQkJICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWcxNnxSZWczMnxBY2MpKSAhPSAwKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciKSwKLQkJCSAgaS5vcFtvcF0ucmVncy0+cmVnX25hbWUsCi0JCQkgIGkudG0ubmFtZSwKLQkJCSAgaS5zdWZmaXgpOwotCQkgIHJldHVybjsKLQkJfQotI2lmIFJFR0lTVEVSX1dBUk5JTkdTCi0JICAgICAgLyogV2FybiBpZiB0aGUgZSBwcmVmaXggb24gYSBnZW5lcmFsIHJlZyBpcyBwcmVzZW50LiAgKi8KLQkgICAgICBlbHNlIGlmICgoaS50eXBlc1tvcF0gJiBSZWczMikgIT0gMAotCQkgICAgICAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMTZ8QWNjKSkgIT0gMCkKLQkJewotCQkgIGFzX3dhcm4gKF8oInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiKSwKLQkJCSAgIChpLm9wW29wXS5yZWdzIC0gOCktPnJlZ19uYW1lLAotCQkJICAgaS5vcFtvcF0ucmVncy0+cmVnX25hbWUsCi0JCQkgICBpLnN1ZmZpeCk7Ci0JCX0KLSNlbmRpZgotCSAgfQotCWVsc2UKLQkgIGFib3J0KCk7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgRGVmYXVsdFNpemUpICYmICFpLnN1ZmZpeCkKLSAgICAgIHsKLQlpLnN1ZmZpeCA9IHN0YWNrb3Bfc2l6ZTsKLSAgICAgIH0KLQotICAgIC8qIE1ha2Ugc3RpbGwgdW5yZXNvbHZlZCBpbW1lZGlhdGUgbWF0Y2hlcyBjb25mb3JtIHRvIHNpemUgb2YgaW1tZWRpYXRlCi0gICAgICAgZ2l2ZW4gaW4gaS5zdWZmaXguICBOb3RlOiBvdmVybGFwMiBjYW5ub3QgYmUgYW4gaW1tZWRpYXRlISAgKi8KLSAgICBpZiAoKG92ZXJsYXAwICYgKEltbTggfCBJbW04UyB8IEltbTE2IHwgSW1tMzIpKQotCSYmIG92ZXJsYXAwICE9IEltbTggJiYgb3ZlcmxhcDAgIT0gSW1tOFMKLQkmJiBvdmVybGFwMCAhPSBJbW0xNiAmJiBvdmVybGFwMCAhPSBJbW0zMikKLSAgICAgIHsKLQlpZiAoaS5zdWZmaXgpCi0JICB7Ci0JICAgIG92ZXJsYXAwICY9IChpLnN1ZmZpeCA9PSBCWVRFX01ORU1fU1VGRklYID8gKEltbTggfCBJbW04UykgOgotCQkJIChpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYID8gSW1tMTYgOiBJbW0zMikpOwotCSAgfQotCWVsc2UgaWYgKG92ZXJsYXAwID09IChJbW0xNiB8IEltbTMyKSkKLQkgIHsKLQkgICAgb3ZlcmxhcDAgPQotCSAgICAgIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbREFUQV9QUkVGSVhdICE9IDApKSA/IEltbTE2IDogSW1tMzI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBhc19iYWQgKF8oIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbjsgY2FuJ3QgZGV0ZXJtaW5lIGltbWVkaWF0ZSBzaXplIikpOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgaWYgKChvdmVybGFwMSAmIChJbW04IHwgSW1tOFMgfCBJbW0xNiB8IEltbTMyKSkKLQkmJiBvdmVybGFwMSAhPSBJbW04ICYmIG92ZXJsYXAxICE9IEltbThTCi0JJiYgb3ZlcmxhcDEgIT0gSW1tMTYgJiYgb3ZlcmxhcDEgIT0gSW1tMzIpCi0gICAgICB7Ci0JaWYgKGkuc3VmZml4KQotCSAgewotCSAgICBvdmVybGFwMSAmPSAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCA/IChJbW04IHwgSW1tOFMpIDoKLQkJCSAoaS5zdWZmaXggPT0gV09SRF9NTkVNX1NVRkZJWCA/IEltbTE2IDogSW1tMzIpKTsKLQkgIH0KLQllbHNlIGlmIChvdmVybGFwMSA9PSAoSW1tMTYgfCBJbW0zMikpCi0JICB7Ci0JICAgIG92ZXJsYXAxID0KLQkgICAgICAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0RBVEFfUFJFRklYXSAhPSAwKSkgPyBJbW0xNiA6IEltbTMyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW47IGNhbid0IGRldGVybWluZSBpbW1lZGlhdGUgc2l6ZSIpKTsKLQkgICAgcmV0dXJuOwotCSAgfQotICAgICAgfQotICAgIGFzc2VydCAoKG92ZXJsYXAyICYgSW1tKSA9PSAwKTsKLQotICAgIGkudHlwZXNbMF0gPSBvdmVybGFwMDsKLSAgICBpZiAob3ZlcmxhcDAgJiBJbXBsaWNpdFJlZ2lzdGVyKQotICAgICAgaS5yZWdfb3BlcmFuZHMtLTsKLSAgICBpZiAob3ZlcmxhcDAgJiBJbW0xKQotICAgICAgaS5pbW1fb3BlcmFuZHMgPSAwOwkvKiBrbHVkZ2UgZm9yIHNoaWZ0IGluc25zICovCi0KLSAgICBpLnR5cGVzWzFdID0gb3ZlcmxhcDE7Ci0gICAgaWYgKG92ZXJsYXAxICYgSW1wbGljaXRSZWdpc3RlcikKLSAgICAgIGkucmVnX29wZXJhbmRzLS07Ci0KLSAgICBpLnR5cGVzWzJdID0gb3ZlcmxhcDI7Ci0gICAgaWYgKG92ZXJsYXAyICYgSW1wbGljaXRSZWdpc3RlcikKLSAgICAgIGkucmVnX29wZXJhbmRzLS07Ci0KLSAgICAvKiBGaW5hbGl6ZSBvcGNvZGUuICBGaXJzdCwgd2UgY2hhbmdlIHRoZSBvcGNvZGUgYmFzZWQgb24gdGhlIG9wZXJhbmQKLSAgICAgICBzaXplIGdpdmVuIGJ5IGkuc3VmZml4OiAgV2UgbmVlZCBub3QgY2hhbmdlIHRoaW5ncyBmb3IgYnl0ZSBpbnNucy4gICovCi0KLSAgICBpZiAoIWkuc3VmZml4ICYmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFcpKQotICAgICAgewotCWFzX2JhZCAoXygibm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGdpdmVuIGFuZCBubyByZWdpc3RlciBvcGVyYW5kczsgY2FuJ3Qgc2l6ZSBpbnN0cnVjdGlvbiIpKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICAvKiBGb3IgbW92enggYW5kIG1vdnN4LCBuZWVkIHRvIGNoZWNrIHRoZSByZWdpc3RlciB0eXBlICovCi0gICAgaWYgKGludGVsX3N5bnRheAotCSYmIChpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmI2IHx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYmUpKQotICAgICAgaWYgKGkuc3VmZml4ICYmIGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVgpCi0JewotCSAgdW5zaWduZWQgaW50IHByZWZpeCA9IERBVEFfUFJFRklYX09QQ09ERTsKLQotCSAgaWYgKChpLm9wWzFdLnJlZ3MtPnJlZ190eXBlICYgUmVnMTYpICE9IDApCi0JICAgIGlmICghYWRkX3ByZWZpeCAocHJlZml4KSkKLQkgICAgICByZXR1cm47Ci0JfQotCi0gICAgaWYgKGkuc3VmZml4ICYmIGkuc3VmZml4ICE9IEJZVEVfTU5FTV9TVUZGSVgpCi0gICAgICB7Ci0JLyogSXQncyBub3QgYSBieXRlLCBzZWxlY3Qgd29yZC9kd29yZCBvcGVyYXRpb24uICAqLwotCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFcpCi0JICB7Ci0JICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFNob3J0Rm9ybSkKLQkgICAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IDg7Ci0JICAgIGVsc2UKLQkgICAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IDE7Ci0JICB9Ci0JLyogTm93IHNlbGVjdCBiZXR3ZWVuIHdvcmQgJiBkd29yZCBvcGVyYXRpb25zIHZpYSB0aGUgb3BlcmFuZAotCSAgIHNpemUgcHJlZml4LCBleGNlcHQgZm9yIGluc3RydWN0aW9ucyB0aGF0IHdpbGwgaWdub3JlIHRoaXMKLQkgICBwcmVmaXggYW55d2F5LiAgKi8KLQlpZiAoKChpbnRlbF9zeW50YXggJiYgKGkuc3VmZml4ID09IERXT1JEX01ORU1fU1VGRklYKSkKLQkgICAgIHx8IGkuc3VmZml4ID09IExPTkdfTU5FTV9TVUZGSVgpID09IGZsYWdfMTZiaXRfY29kZQotCSAgICAmJiAhKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSWdub3JlU2l6ZSkpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBwcmVmaXggPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEp1bXBCeXRlKSAvKiBqY3h6LCBsb29wICovCi0JICAgICAgcHJlZml4ID0gQUREUl9QUkVGSVhfT1BDT0RFOwotCi0JICAgIGlmICghIGFkZF9wcmVmaXggKHByZWZpeCkpCi0JICAgICAgcmV0dXJuOwotCSAgfQotCS8qIFNpemUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24uICAqLwotCWlmIChpLnN1ZmZpeCA9PSBMT05HX01ORU1fU1VGRklYCi0JICAgIHx8IChpbnRlbF9zeW50YXggJiYgaS5zdWZmaXggPT0gRFdPUkRfTU5FTV9TVUZGSVgpKQotCSAgewotCSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBGbG9hdE1GKQotCSAgICAgIGkudG0uYmFzZV9vcGNvZGUgXj0gNDsKLQkgIH0KLSAgICAgIH0KLQotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEltbUV4dCkKLSAgICAgIHsKLQkvKiBUaGVzZSBBTUQgM0ROb3chIGFuZCBJbnRlbCBLYXRtYWkgTmV3IEluc3RydWN0aW9ucyBoYXZlIGFuCi0JICAgb3Bjb2RlIHN1ZmZpeCB3aGljaCBpcyBjb2RlZCBpbiB0aGUgc2FtZSBwbGFjZSBhcyBhbiA4LWJpdAotCSAgIGltbWVkaWF0ZSBmaWVsZCB3b3VsZCBiZS4gIEhlcmUgd2UgZmFrZSBhbiA4LWJpdCBpbW1lZGlhdGUKLQkgICBvcGVyYW5kIGZyb20gdGhlIG9wY29kZSBzdWZmaXggc3RvcmVkIGluIHRtLmV4dGVuc2lvbl9vcGNvZGUuICAqLwotCi0JZXhwcmVzc2lvblMgKmV4cDsKLQotCWFzc2VydChpLmltbV9vcGVyYW5kcyA9PSAwICYmIGkub3BlcmFuZHMgPD0gMiAmJiAyIDwgTUFYX09QRVJBTkRTKTsKLQotCWV4cCA9ICZpbV9leHByZXNzaW9uc1tpLmltbV9vcGVyYW5kcysrXTsKLQlpLm9wW2kub3BlcmFuZHNdLmltbXMgPSBleHA7Ci0JaS50eXBlc1tpLm9wZXJhbmRzKytdID0gSW1tODsKLQlleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotCWV4cC0+WF9hZGRfbnVtYmVyID0gaS50bS5leHRlbnNpb25fb3Bjb2RlOwotCWkudG0uZXh0ZW5zaW9uX29wY29kZSA9IE5vbmU7Ci0gICAgICB9Ci0KLSAgICAvKiBGb3IgaW5zbnMgd2l0aCBvcGVyYW5kcyB0aGVyZSBhcmUgbW9yZSBkaWRkbGVzIHRvIGRvIHRvIHRoZSBvcGNvZGUuICovCi0gICAgaWYgKGkub3BlcmFuZHMpCi0gICAgICB7Ci0JLyogRGVmYXVsdCBzZWdtZW50IHJlZ2lzdGVyIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCB1c2UKLQkgICBmb3IgbWVtb3J5IGFjY2Vzc2VzLiAgMCBtZWFucyB1bmtub3duLgotCSAgIFRoaXMgaXMgb25seSBmb3Igb3B0aW1pemluZyBvdXQgdW5uZWNlc3Nhcnkgc2VnbWVudCBvdmVycmlkZXMuICAqLwotCWNvbnN0IHNlZ19lbnRyeSAqZGVmYXVsdF9zZWcgPSAwOwotCi0JLyogVGhlIGltdWwgJGltbSwgJXJlZyBpbnN0cnVjdGlvbiBpcyBjb252ZXJ0ZWQgaW50bwotCSAgIGltdWwgJGltbSwgJXJlZywgJXJlZywgYW5kIHRoZSBjbHIgJXJlZyBpbnN0cnVjdGlvbgotCSAgIGlzIGNvbnZlcnRlZCBpbnRvIHhvciAlcmVnLCAlcmVnLiAgKi8KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiByZWdLbHVkZ2UpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBmaXJzdF9yZWdfb3AgPSAoaS50eXBlc1swXSAmIFJlZykgPyAwIDogMTsKLQkgICAgLyogUHJldGVuZCB3ZSBzYXcgdGhlIGV4dHJhIHJlZ2lzdGVyIG9wZXJhbmQuICovCi0JICAgIGFzc2VydCAoaS5vcFtmaXJzdF9yZWdfb3ArMV0ucmVncyA9PSAwKTsKLQkgICAgaS5vcFtmaXJzdF9yZWdfb3ArMV0ucmVncyA9IGkub3BbZmlyc3RfcmVnX29wXS5yZWdzOwotCSAgICBpLnR5cGVzW2ZpcnN0X3JlZ19vcCsxXSA9IGkudHlwZXNbZmlyc3RfcmVnX29wXTsKLQkgICAgaS5yZWdfb3BlcmFuZHMgPSAyOwotCSAgfQotCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgU2hvcnRGb3JtKQotCSAgewotCSAgICAvKiBUaGUgcmVnaXN0ZXIgb3IgZmxvYXQgcmVnaXN0ZXIgb3BlcmFuZCBpcyBpbiBvcGVyYW5kIDAgb3IgMS4gKi8KLQkgICAgdW5zaWduZWQgaW50IG9wID0gKGkudHlwZXNbMF0gJiAoUmVnIHwgRmxvYXRSZWcpKSA/IDAgOiAxOwotCSAgICAvKiBSZWdpc3RlciBnb2VzIGluIGxvdyAzIGJpdHMgb2Ygb3Bjb2RlLiAqLwotCSAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IGkub3Bbb3BdLnJlZ3MtPnJlZ19udW07Ci0JICAgIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBVZ2gpICE9IDApCi0JICAgICAgewotCQkvKiBXYXJuIGFib3V0IHNvbWUgY29tbW9uIGVycm9ycywgYnV0IHByZXNzIG9uIHJlZ2FyZGxlc3MuCi0JCSAgIFRoZSBmaXJzdCBjYXNlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgZ2NjICg8PSAyLjguMSkuICAqLwotCQlpZiAoaS5vcGVyYW5kcyA9PSAyKQotCQkgIHsKLQkJICAgIC8qIHJldmVyc2VkIGFyZ3VtZW50cyBvbiBmYWRkcCwgZnN1YnAsIGV0Yy4gKi8KLQkJICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIHRvIGAlcyAlJSVzLCUlJXMnIiksIGkudG0ubmFtZSwKLQkJCSAgICAgaS5vcFsxXS5yZWdzLT5yZWdfbmFtZSwKLQkJCSAgICAgaS5vcFswXS5yZWdzLT5yZWdfbmFtZSk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogZXh0cmFuZW91cyBgbCcgc3VmZml4IG9uIGZwIGluc24gKi8KLQkJICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIHRvIGAlcyAlJSVzJyIpLCBpLnRtLm5hbWUsCi0JCQkgICAgIGkub3BbMF0ucmVncy0+cmVnX25hbWUpOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBNb2RybSkKLQkgIHsKLQkgICAgLyogVGhlIG9wY29kZSBpcyBjb21wbGV0ZWQgKG1vZHVsbyBpLnRtLmV4dGVuc2lvbl9vcGNvZGUgd2hpY2gKLQkgICAgICAgbXVzdCBiZSBwdXQgaW50byB0aGUgbW9kcm0gYnl0ZSkuCi0JICAgICAgIE5vdywgd2UgbWFrZSB0aGUgbW9kcm0gJiBpbmRleCBiYXNlIGJ5dGVzIGJhc2VkIG9uIGFsbCB0aGUKLQkgICAgICAgaW5mbyB3ZSd2ZSBjb2xsZWN0ZWQuICovCi0KLQkgICAgLyogaS5yZWdfb3BlcmFuZHMgTVVTVCBiZSB0aGUgbnVtYmVyIG9mIHJlYWwgcmVnaXN0ZXIgb3BlcmFuZHM7Ci0JICAgICAgIGltcGxpY2l0IHJlZ2lzdGVycyBkbyBub3QgY291bnQuICovCi0JICAgIGlmIChpLnJlZ19vcGVyYW5kcyA9PSAyKQotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IHNvdXJjZSwgZGVzdDsKLQkJc291cmNlID0gKChpLnR5cGVzWzBdCi0JCQkgICAmIChSZWcgfCBSZWdNTVggfCBSZWdYTU0KLQkJCSAgICAgIHwgU1JlZzIgfCBTUmVnMwotCQkJICAgICAgfCBDb250cm9sIHwgRGVidWcgfCBUZXN0KSkKLQkJCSAgPyAwIDogMSk7Ci0JCWRlc3QgPSBzb3VyY2UgKyAxOwotCi0JCWkucm0ubW9kZSA9IDM7Ci0JCS8qIE9uZSBvZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMgd2lsbCBiZSBlbmNvZGVkIGluIHRoZQotCQkgICBpLnRtLnJlZyBmaWVsZCwgdGhlIG90aGVyIGluIHRoZSBjb21iaW5lZCBpLnRtLm1vZGUKLQkJICAgYW5kIGkudG0ucmVnbWVtIGZpZWxkcy4gIElmIG5vIGZvcm0gb2YgdGhpcwotCQkgICBpbnN0cnVjdGlvbiBzdXBwb3J0cyBhIG1lbW9yeSBkZXN0aW5hdGlvbiBvcGVyYW5kLAotCQkgICB0aGVuIHdlIGFzc3VtZSB0aGUgc291cmNlIG9wZXJhbmQgbWF5IHNvbWV0aW1lcyBiZQotCQkgICBhIG1lbW9yeSBvcGVyYW5kIGFuZCBzbyB3ZSBuZWVkIHRvIHN0b3JlIHRoZQotCQkgICBkZXN0aW5hdGlvbiBpbiB0aGUgaS5ybS5yZWcgZmllbGQuICAqLwotCQlpZiAoKGkudG0ub3BlcmFuZF90eXBlc1tkZXN0XSAmIEFueU1lbSkgPT0gMCkKLQkJICB7Ci0JCSAgICBpLnJtLnJlZyA9IGkub3BbZGVzdF0ucmVncy0+cmVnX251bTsKLQkJICAgIGkucm0ucmVnbWVtID0gaS5vcFtzb3VyY2VdLnJlZ3MtPnJlZ19udW07Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaS5ybS5yZWcgPSBpLm9wW3NvdXJjZV0ucmVncy0+cmVnX251bTsKLQkJICAgIGkucm0ucmVnbWVtID0gaS5vcFtkZXN0XS5yZWdzLT5yZWdfbnVtOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7CQkJLyogaWYgaXQncyBub3QgMiByZWcgb3BlcmFuZHMuLi4gKi8KLQkJaWYgKGkubWVtX29wZXJhbmRzKQotCQkgIHsKLQkJICAgIHVuc2lnbmVkIGludCBmYWtlX3plcm9fZGlzcGxhY2VtZW50ID0gMDsKLQkJICAgIHVuc2lnbmVkIGludCBvcCA9ICgoaS50eXBlc1swXSAmIEFueU1lbSkKLQkJCQkgICAgICAgPyAwCi0JCQkJICAgICAgIDogKGkudHlwZXNbMV0gJiBBbnlNZW0pID8gMSA6IDIpOwotCi0JCSAgICBkZWZhdWx0X3NlZyA9ICZkczsKLQotCQkgICAgaWYgKCEgaS5iYXNlX3JlZykKLQkJICAgICAgewotCQkJaS5ybS5tb2RlID0gMDsKLQkJCWlmICghIGkuZGlzcF9vcGVyYW5kcykKLQkJCSAgZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDE7Ci0JCQlpZiAoISBpLmluZGV4X3JlZykKLQkJCSAgewotCQkJICAgIC8qIE9wZXJhbmQgaXMganVzdCA8ZGlzcD4gKi8KLQkJCSAgICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0FERFJfUFJFRklYXSAhPSAwKSkKLQkJCSAgICAgIHsKLQkJCQlpLnJtLnJlZ21lbSA9IE5PX0JBU0VfUkVHSVNURVJfMTY7Ci0JCQkJaS50eXBlc1tvcF0gJj0gfkRpc3A7Ci0JCQkJaS50eXBlc1tvcF0gfD0gRGlzcDE2OwotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQlpLnJtLnJlZ21lbSA9IE5PX0JBU0VfUkVHSVNURVI7Ci0JCQkJaS50eXBlc1tvcF0gJj0gfkRpc3A7Ci0JCQkJaS50eXBlc1tvcF0gfD0gRGlzcDMyOwotCQkJICAgICAgfQotCQkJICB9Ci0JCQllbHNlIC8qICEgaS5iYXNlX3JlZyAmJiBpLmluZGV4X3JlZyAqLwotCQkJICB7Ci0JCQkgICAgaS5zaWIuaW5kZXggPSBpLmluZGV4X3JlZy0+cmVnX251bTsKLQkJCSAgICBpLnNpYi5iYXNlID0gTk9fQkFTRV9SRUdJU1RFUjsKLQkJCSAgICBpLnNpYi5zY2FsZSA9IGkubG9nMl9zY2FsZV9mYWN0b3I7Ci0JCQkgICAgaS5ybS5yZWdtZW0gPSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORzsKLQkJCSAgICBpLnR5cGVzW29wXSAmPSB+RGlzcDsKLQkJCSAgICBpLnR5cGVzW29wXSB8PSBEaXNwMzI7CS8qIE11c3QgYmUgMzIgYml0ICovCi0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWcxNikKLQkJICAgICAgewotCQkJc3dpdGNoIChpLmJhc2VfcmVnLT5yZWdfbnVtKQotCQkJICB7Ci0JCQkgIGNhc2UgMzogLyogKCVieCkgKi8KLQkJCSAgICBpZiAoISBpLmluZGV4X3JlZykKLQkJCSAgICAgIGkucm0ucmVnbWVtID0gNzsKLQkJCSAgICBlbHNlIC8qICglYngsJXNpKSAtPiAwLCBvciAoJWJ4LCVkaSkgLT4gMSAqLwotCQkJICAgICAgaS5ybS5yZWdtZW0gPSBpLmluZGV4X3JlZy0+cmVnX251bSAtIDY7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgNTogLyogKCVicCkgKi8KLQkJCSAgICBkZWZhdWx0X3NlZyA9ICZzczsKLQkJCSAgICBpZiAoISBpLmluZGV4X3JlZykKLQkJCSAgICAgIHsKLQkJCQlpLnJtLnJlZ21lbSA9IDY7Ci0JCQkJaWYgKChpLnR5cGVzW29wXSAmIERpc3ApID09IDApCi0JCQkJICB7Ci0JCQkJICAgIC8qIGZha2UgKCVicCkgaW50byAwKCVicCkgKi8KLQkJCQkgICAgaS50eXBlc1tvcF0gfD0gRGlzcDg7Ci0JCQkJICAgIGZha2VfemVyb19kaXNwbGFjZW1lbnQgPSAxOwotCQkJCSAgfQotCQkJICAgICAgfQotCQkJICAgIGVsc2UgLyogKCVicCwlc2kpIC0+IDIsIG9yICglYnAsJWRpKSAtPiAzICovCi0JCQkgICAgICBpLnJtLnJlZ21lbSA9IGkuaW5kZXhfcmVnLT5yZWdfbnVtIC0gNiArIDI7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGRlZmF1bHQ6IC8qICglc2kpIC0+IDQgb3IgKCVkaSkgLT4gNSAqLwotCQkJICAgIGkucm0ucmVnbWVtID0gaS5iYXNlX3JlZy0+cmVnX251bSAtIDYgKyA0OwotCQkJICB9Ci0JCQlpLnJtLm1vZGUgPSBtb2RlX2Zyb21fZGlzcF9zaXplIChpLnR5cGVzW29wXSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgLyogaS5iYXNlX3JlZyBhbmQgMzIgYml0IG1vZGUgKi8KLQkJICAgICAgewotCQkJaS5ybS5yZWdtZW0gPSBpLmJhc2VfcmVnLT5yZWdfbnVtOwotCQkJaS5zaWIuYmFzZSA9IGkuYmFzZV9yZWctPnJlZ19udW07Ci0JCQlpZiAoaS5iYXNlX3JlZy0+cmVnX251bSA9PSBFQlBfUkVHX05VTSkKLQkJCSAgewotCQkJICAgIGRlZmF1bHRfc2VnID0gJnNzOwotCQkJICAgIGlmIChpLmRpc3Bfb3BlcmFuZHMgPT0gMCkKLQkJCSAgICAgIHsKLQkJCQlmYWtlX3plcm9fZGlzcGxhY2VtZW50ID0gMTsKLQkJCQlpLnR5cGVzW29wXSB8PSBEaXNwODsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJZWxzZSBpZiAoaS5iYXNlX3JlZy0+cmVnX251bSA9PSBFU1BfUkVHX05VTSkKLQkJCSAgewotCQkJICAgIGRlZmF1bHRfc2VnID0gJnNzOwotCQkJICB9Ci0JCQlpLnNpYi5zY2FsZSA9IGkubG9nMl9zY2FsZV9mYWN0b3I7Ci0JCQlpZiAoISBpLmluZGV4X3JlZykKLQkJCSAgewotCQkJICAgIC8qIDxkaXNwPiglZXNwKSBiZWNvbWVzIHR3byBieXRlIG1vZHJtCi0JCQkgICAgICAgd2l0aCBubyBpbmRleCByZWdpc3Rlci4gIFdlJ3ZlIGFscmVhZHkKLQkJCSAgICAgICBzdG9yZWQgdGhlIGNvZGUgZm9yIGVzcCBpbiBpLnJtLnJlZ21lbQotCQkJICAgICAgIGllLiBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORy4gIEFueQotCQkJICAgICAgIGJhc2UgcmVnaXN0ZXIgYmVzaWRlcyAlZXNwIHdpbGwgbm90IHVzZQotCQkJICAgICAgIHRoZSBleHRyYSBtb2RybSBieXRlLiAgKi8KLQkJCSAgICBpLnNpYi5pbmRleCA9IE5PX0lOREVYX1JFR0lTVEVSOwotI2lmICEgU0NBTEUxX1dIRU5fTk9fSU5ERVgKLQkJCSAgICAvKiBBbm90aGVyIGNhc2Ugd2hlcmUgd2UgZm9yY2UgdGhlIHNlY29uZAotCQkJICAgICAgIG1vZHJtIGJ5dGUuICAqLwotCQkJICAgIGlmIChpLmxvZzJfc2NhbGVfZmFjdG9yKQotCQkJICAgICAgaS5ybS5yZWdtZW0gPSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORzsKLSNlbmRpZgotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpLnNpYi5pbmRleCA9IGkuaW5kZXhfcmVnLT5yZWdfbnVtOwotCQkJICAgIGkucm0ucmVnbWVtID0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkc7Ci0JCQkgIH0KLQkJCWkucm0ubW9kZSA9IG1vZGVfZnJvbV9kaXNwX3NpemUgKGkudHlwZXNbb3BdKTsKLQkJICAgICAgfQotCi0JCSAgICBpZiAoZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCkKLQkJICAgICAgewotCQkJLyogRmFrZXMgYSB6ZXJvIGRpc3BsYWNlbWVudCBhc3N1bWluZyB0aGF0IGkudHlwZXNbb3BdCi0JCQkgICBob2xkcyB0aGUgY29ycmVjdCBkaXNwbGFjZW1lbnQgc2l6ZS4gKi8KLQkJCWV4cHJlc3Npb25TICpleHA7Ci0KLQkJCWFzc2VydCAoaS5vcFtvcF0uZGlzcHMgPT0gMCk7Ci0JCQlleHAgPSAmZGlzcF9leHByZXNzaW9uc1tpLmRpc3Bfb3BlcmFuZHMrK107Ci0JCQlpLm9wW29wXS5kaXNwcyA9IGV4cDsKLQkJCWV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlleHAtPlhfYWRkX251bWJlciA9IDA7Ci0JCQlleHAtPlhfYWRkX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0JCQlleHAtPlhfb3Bfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKLQkJICAgICAgfQotCQkgIH0KLQotCQkvKiBGaWxsIGluIGkucm0ucmVnIG9yIGkucm0ucmVnbWVtIGZpZWxkIHdpdGggcmVnaXN0ZXIKLQkJICAgb3BlcmFuZCAoaWYgYW55KSBiYXNlZCBvbiBpLnRtLmV4dGVuc2lvbl9vcGNvZGUuCi0JCSAgIEFnYWluLCB3ZSBtdXN0IGJlIGNhcmVmdWwgdG8gbWFrZSBzdXJlIHRoYXQKLQkJICAgc2VnbWVudC9jb250cm9sL2RlYnVnL3Rlc3QvTU1YIHJlZ2lzdGVycyBhcmUgY29kZWQKLQkJICAgaW50byB0aGUgaS5ybS5yZWcgZmllbGQuICovCi0JCWlmIChpLnJlZ19vcGVyYW5kcykKLQkJICB7Ci0JCSAgICB1bnNpZ25lZCBpbnQgb3AgPQotCQkgICAgICAoKGkudHlwZXNbMF0KLQkJCSYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJICAgfCBTUmVnMiB8IFNSZWczCi0JCQkgICB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QpKQotCQkgICAgICAgPyAwCi0JCSAgICAgICA6ICgoaS50eXBlc1sxXQotCQkJICAgJiAoUmVnIHwgUmVnTU1YIHwgUmVnWE1NCi0JCQkgICAgICB8IFNSZWcyIHwgU1JlZzMKLQkJCSAgICAgIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdCkpCi0JCQkgID8gMQotCQkJICA6IDIpKTsKLQkJICAgIC8qIElmIHRoZXJlIGlzIGFuIGV4dGVuc2lvbiBvcGNvZGUgdG8gcHV0IGhlcmUsIHRoZQotCQkgICAgICAgcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgcHV0IGludG8gdGhlIHJlZ21lbSBmaWVsZC4gKi8KLQkJICAgIGlmIChpLnRtLmV4dGVuc2lvbl9vcGNvZGUgIT0gTm9uZSkKLQkJICAgICAgaS5ybS5yZWdtZW0gPSBpLm9wW29wXS5yZWdzLT5yZWdfbnVtOwotCQkgICAgZWxzZQotCQkgICAgICBpLnJtLnJlZyA9IGkub3Bbb3BdLnJlZ3MtPnJlZ19udW07Ci0KLQkJICAgIC8qIE5vdywgaWYgbm8gbWVtb3J5IG9wZXJhbmQgaGFzIHNldCBpLnJtLm1vZGUgPSAwLCAxLCAyCi0JCSAgICAgICB3ZSBtdXN0IHNldCBpdCB0byAzIHRvIGluZGljYXRlIHRoaXMgaXMgYSByZWdpc3RlcgotCQkgICAgICAgb3BlcmFuZCBpbiB0aGUgcmVnbWVtIGZpZWxkLiAgKi8KLQkJICAgIGlmICghaS5tZW1fb3BlcmFuZHMpCi0JCSAgICAgIGkucm0ubW9kZSA9IDM7Ci0JCSAgfQotCi0JCS8qIEZpbGwgaW4gaS5ybS5yZWcgZmllbGQgd2l0aCBleHRlbnNpb24gb3Bjb2RlIChpZiBhbnkpLiAqLwotCQlpZiAoaS50bS5leHRlbnNpb25fb3Bjb2RlICE9IE5vbmUpCi0JCSAgaS5ybS5yZWcgPSBpLnRtLmV4dGVuc2lvbl9vcGNvZGU7Ci0JICAgICAgfQotCSAgfQotCWVsc2UgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgKFNlZzJTaG9ydEZvcm0gfCBTZWczU2hvcnRGb3JtKSkKLQkgIHsKLQkgICAgaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0gUE9QX1NFR19TSE9SVCAmJiBpLm9wWzBdLnJlZ3MtPnJlZ19udW0gPT0gMSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygieW91IGNhbid0IGBwb3AgJSVjcyciKSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gKGkub3BbMF0ucmVncy0+cmVnX251bSA8PCAzKTsKLQkgIH0KLQllbHNlIGlmICgoaS50bS5iYXNlX29wY29kZSAmIH4oRHxXKSkgPT0gTU9WX0FYX0RJU1AzMikKLQkgIHsKLQkgICAgZGVmYXVsdF9zZWcgPSAmZHM7Ci0JICB9Ci0JZWxzZSBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpICE9IDApCi0JICB7Ci0JICAgIC8qIEZvciB0aGUgc3RyaW5nIGluc3RydWN0aW9ucyB0aGF0IGFsbG93IGEgc2VnbWVudCBvdmVycmlkZQotCSAgICAgICBvbiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMsIHRoZSBkZWZhdWx0IHNlZ21lbnQgaXMgZHMuICAqLwotCSAgICBkZWZhdWx0X3NlZyA9ICZkczsKLQkgIH0KLQotCS8qIElmIGEgc2VnbWVudCB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQsCi0JICAgYW5kIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBpcyBub3QgdGhlIGRlZmF1bHQsCi0JICAgdXNlIGFuIG9wY29kZSBwcmVmaXggdG8gc2VsZWN0IGl0LgotCSAgIElmIHdlIG5ldmVyIGZpZ3VyZWQgb3V0IHdoYXQgdGhlIGRlZmF1bHQgc2VnbWVudCBpcywKLQkgICB0aGVuIGRlZmF1bHRfc2VnIHdpbGwgYmUgemVybyBhdCB0aGlzIHBvaW50LAotCSAgIGFuZCB0aGUgc3BlY2lmaWVkIHNlZ21lbnQgcHJlZml4IHdpbGwgYWx3YXlzIGJlIHVzZWQuICAqLwotCWlmICgoaS5zZWdbMF0pICYmIChpLnNlZ1swXSAhPSBkZWZhdWx0X3NlZykpCi0JICB7Ci0JICAgIGlmICghIGFkZF9wcmVmaXggKGkuc2VnWzBdLT5zZWdfcHJlZml4KSkKLQkgICAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVWdoKSAhPSAwKQotICAgICAgewotCS8qIFVuaXhXYXJlIGZzdWIgbm8gYXJncyBpcyBhbGlhcyBmb3IgZnN1YnAsIGZhZGQgLT4gZmFkZHAsIGV0Yy4gICovCi0JYXNfd2FybiAoXygidHJhbnNsYXRpbmcgdG8gYCVzcCciKSwgaS50bS5uYW1lKTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIEhhbmRsZSBjb252ZXJzaW9uIG9mICdpbnQgJDMnIC0tPiBzcGVjaWFsIGludDMgaW5zbi4gKi8KLSAgaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0gSU5UX09QQ09ERSAmJiBpLm9wWzBdLmltbXMtPlhfYWRkX251bWJlciA9PSAzKQotICAgIHsKLSAgICAgIGkudG0uYmFzZV9vcGNvZGUgPSBJTlQzX09QQ09ERTsKLSAgICAgIGkuaW1tX29wZXJhbmRzID0gMDsKLSAgICB9Ci0KLSAgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIChKdW1wIHwgSnVtcEJ5dGUgfCBKdW1wRHdvcmQpKQotICAgICAgJiYgaS5vcFswXS5kaXNwcy0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIC8qIENvbnZlcnQgImptcCBjb25zdGFudCIgKGFuZCAiY2FsbCBjb25zdGFudCIpIHRvIGEganVtcCAoY2FsbCkgdG8KLQkgdGhlIGFic29sdXRlIGFkZHJlc3MgZ2l2ZW4gYnkgdGhlIGNvbnN0YW50LiAgU2luY2UgaXg4NiBqdW1wcyBhbmQKLQkgY2FsbHMgYXJlIHBjIHJlbGF0aXZlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVsb2MuICAqLwotICAgICAgaS5vcFswXS5kaXNwcy0+WF9hZGRfc3ltYm9sID0gJmFic19zeW1ib2w7Ci0gICAgICBpLm9wWzBdLmRpc3BzLT5YX29wID0gT19zeW1ib2w7Ci0gICAgfQotCi0gIC8qIFdlIGFyZSByZWFkeSB0byBvdXRwdXQgdGhlIGluc24uICovCi0gIHsKLSAgICByZWdpc3RlciBjaGFyICpwOwotCi0gICAgLyogT3V0cHV0IGp1bXBzLiAqLwotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEp1bXApCi0gICAgICB7Ci0JaW50IHNpemU7Ci0JaW50IGNvZGUxNjsKLQlpbnQgcHJlZml4OwotCi0JY29kZTE2ID0gMDsKLQlpZiAoZmxhZ18xNmJpdF9jb2RlKQotCSAgY29kZTE2ID0gQ09ERTE2OwotCi0JcHJlZml4ID0gMDsKLQlpZiAoaS5wcmVmaXhbREFUQV9QUkVGSVhdKQotCSAgewotCSAgICBwcmVmaXggPSAxOwotCSAgICBpLnByZWZpeGVzIC09IDE7Ci0JICAgIGNvZGUxNiBePSBDT0RFMTY7Ci0JICB9Ci0KLQlzaXplID0gNDsKLQlpZiAoY29kZTE2KQotCSAgc2l6ZSA9IDI7Ci0KLQlpZiAoaS5wcmVmaXhlcyAhPSAwICYmICFpbnRlbF9zeW50YXgpCi0JICBhc193YXJuIChfKCJza2lwcGluZyBwcmVmaXhlcyBvbiB0aGlzIGluc3RydWN0aW9uIikpOwotCi0JLyogSXQncyBhbHdheXMgYSBzeW1ib2w7ICBFbmQgZnJhZyAmIHNldHVwIGZvciByZWxheC4KLQkgICBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gdGhpcyBmcmFnIGZvciB0aGUgbGFyZ2VzdAotCSAgIGluc3RydWN0aW9uIHdlIG1heSBnZW5lcmF0ZSBpbiBtZF9jb252ZXJ0X2ZyYWcuICBUaGlzIGlzIDIKLQkgICBieXRlcyBmb3IgdGhlIG9wY29kZSBhbmQgcm9vbSBmb3IgdGhlIHByZWZpeCBhbmQgbGFyZ2VzdAotCSAgIGRpc3BsYWNlbWVudC4gICovCi0JZnJhZ19ncm93IChwcmVmaXggKyAyICsgc2l6ZSk7Ci0JaW5zbl9zaXplICs9IHByZWZpeCArIDE7Ci0JLyogUHJlZml4IGFuZCAxIG9wY29kZSBieXRlIGdvIGluIGZyX2ZpeC4gICovCi0JcCA9IGZyYWdfbW9yZSAocHJlZml4ICsgMSk7Ci0JaWYgKHByZWZpeCkKLQkgICpwKysgPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JKnAgPSBpLnRtLmJhc2Vfb3Bjb2RlOwotCS8qIDEgcG9zc2libGUgZXh0cmEgb3Bjb2RlICsgZGlzcGxhY2VtZW50IGdvIGluIGZyX3Zhci4gICovCi0JZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkgIDEgKyBzaXplLAotCQkgIDEsCi0JCSAgKCh1bnNpZ25lZCBjaGFyKSAqcCA9PSBKVU1QX1BDX1JFTEFUSVZFCi0JCSAgID8gRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwpIHwgY29kZTE2Ci0JCSAgIDogRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIFNNQUxMKSB8IGNvZGUxNiksCi0JCSAgaS5vcFswXS5kaXNwcy0+WF9hZGRfc3ltYm9sLAotCQkgIGkub3BbMF0uZGlzcHMtPlhfYWRkX251bWJlciwKLQkJICBwKTsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChKdW1wQnl0ZSB8IEp1bXBEd29yZCkpCi0gICAgICB7Ci0JaW50IHNpemU7Ci0KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wQnl0ZSkKLQkgIHsKLQkgICAgLyogVGhpcyBpcyBhIGxvb3Agb3IgamVjeHogdHlwZSBpbnN0cnVjdGlvbi4gICovCi0JICAgIHNpemUgPSAxOwotCSAgICBpZiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDE7Ci0JCUZSQUdfQVBQRU5EXzFfQ0hBUiAoQUREUl9QUkVGSVhfT1BDT0RFKTsKLQkJaS5wcmVmaXhlcyAtPSAxOwotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGludCBjb2RlMTY7Ci0KLQkgICAgY29kZTE2ID0gMDsKLQkgICAgaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgICAgICBjb2RlMTYgPSBDT0RFMTY7Ci0KLQkgICAgaWYgKGkucHJlZml4W0RBVEFfUFJFRklYXSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAxOwotCQlGUkFHX0FQUEVORF8xX0NIQVIgKERBVEFfUFJFRklYX09QQ09ERSk7Ci0JCWkucHJlZml4ZXMgLT0gMTsKLQkJY29kZTE2IF49IENPREUxNjsKLQkgICAgICB9Ci0KLQkgICAgc2l6ZSA9IDQ7Ci0JICAgIGlmIChjb2RlMTYpCi0JICAgICAgc2l6ZSA9IDI7Ci0JICB9Ci0KLQlpZiAoaS5wcmVmaXhlcyAhPSAwICYmICFpbnRlbF9zeW50YXgpCi0JICBhc193YXJuIChfKCJza2lwcGluZyBwcmVmaXhlcyBvbiB0aGlzIGluc3RydWN0aW9uIikpOwotCi0JaWYgKGZpdHNfaW5fdW5zaWduZWRfYnl0ZSAoaS50bS5iYXNlX29wY29kZSkpCi0JICB7Ci0JICAgIGluc25fc2l6ZSArPSAxICsgc2l6ZTsKLQkgICAgcCA9IGZyYWdfbW9yZSAoMSArIHNpemUpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogb3Bjb2RlIGNhbiBiZSBhdCBtb3N0IHR3byBieXRlcyAqLwotCSAgICBpbnNuX3NpemUgKz0gMiArIHNpemU7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDIgKyBzaXplKTsKLQkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDgpICYgMHhmZjsKLQkgIH0KLQkqcCsrID0gaS50bS5iYXNlX29wY29kZSAmIDB4ZmY7Ci0KLQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKLQkJICAgICBpLm9wWzBdLmRpc3BzLCAxLCByZWxvYyAoc2l6ZSwgMSwgaS5kaXNwX3JlbG9jWzBdKSk7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wSW50ZXJTZWdtZW50KQotICAgICAgewotCWludCBzaXplOwotCWludCBwcmVmaXg7Ci0JaW50IGNvZGUxNjsKLQotCWNvZGUxNiA9IDA7Ci0JaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgIGNvZGUxNiA9IENPREUxNjsKLQotCXByZWZpeCA9IDA7Ci0JaWYgKGkucHJlZml4W0RBVEFfUFJFRklYXSkKLQkgIHsKLQkgICAgcHJlZml4ID0gMTsKLQkgICAgaS5wcmVmaXhlcyAtPSAxOwotCSAgICBjb2RlMTYgXj0gQ09ERTE2OwotCSAgfQotCi0Jc2l6ZSA9IDQ7Ci0JaWYgKGNvZGUxNikKLQkgIHNpemUgPSAyOwotCi0JaWYgKGkucHJlZml4ZXMgIT0gMCAmJiAhaW50ZWxfc3ludGF4KQotCSAgYXNfd2FybiAoXygic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIpKTsKLQotCWluc25fc2l6ZSArPSBwcmVmaXggKyAxICsgMiArIHNpemU7ICAvKiAxIG9wY29kZTsgMiBzZWdtZW50OyBvZmZzZXQgKi8KLQlwID0gZnJhZ19tb3JlIChwcmVmaXggKyAxICsgMiArIHNpemUpOwotCWlmIChwcmVmaXgpCi0JICAqcCsrID0gREFUQV9QUkVGSVhfT1BDT0RFOwotCSpwKysgPSBpLnRtLmJhc2Vfb3Bjb2RlOwotCWlmIChpLm9wWzFdLmltbXMtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgIHsKLQkgICAgbG9uZyBuID0gKGxvbmcpIGkub3BbMV0uaW1tcy0+WF9hZGRfbnVtYmVyOwotCi0JICAgIGlmIChzaXplID09IDIKLQkJJiYgIWZpdHNfaW5fdW5zaWduZWRfd29yZCAobikKLQkJJiYgIWZpdHNfaW5fc2lnbmVkX3dvcmQgKG4pKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCIxNi1iaXQganVtcCBvdXQgb2YgcmFuZ2UiKSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgbiwgc2l6ZSk7Ci0JICB9Ci0JZWxzZQotCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCSAgICAgICBpLm9wWzFdLmltbXMsIDAsIHJlbG9jIChzaXplLCAwLCBpLmRpc3BfcmVsb2NbMF0pKTsKLQlpZiAoaS5vcFswXS5pbW1zLT5YX29wICE9IE9fY29uc3RhbnQpCi0JICBhc19iYWQgKF8oImNhbid0IGhhbmRsZSBub24gYWJzb2x1dGUgc2VnbWVudCBpbiBgJXMnIiksCi0JCSAgaS50bS5uYW1lKTsKLQltZF9udW1iZXJfdG9fY2hhcnMgKHAgKyBzaXplLCAodmFsdWVUKSBpLm9wWzBdLmltbXMtPlhfYWRkX251bWJlciwgMik7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCS8qIE91dHB1dCBub3JtYWwgaW5zdHJ1Y3Rpb25zIGhlcmUuICovCi0JdW5zaWduZWQgY2hhciAqcTsKLQotCS8qIFRoZSBwcmVmaXggYnl0ZXMuICovCi0JZm9yIChxID0gaS5wcmVmaXg7Ci0JICAgICBxIDwgaS5wcmVmaXggKyBzaXplb2YgKGkucHJlZml4KSAvIHNpemVvZiAoaS5wcmVmaXhbMF0pOwotCSAgICAgcSsrKQotCSAgewotCSAgICBpZiAoKnEpCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMTsKLQkJcCA9IGZyYWdfbW9yZSAoMSk7Ci0JCW1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgKnEsIDEpOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIE5vdyB0aGUgb3Bjb2RlOyBiZSBjYXJlZnVsIGFib3V0IHdvcmQgb3JkZXIgaGVyZSEgKi8KLQlpZiAoZml0c19pbl91bnNpZ25lZF9ieXRlIChpLnRtLmJhc2Vfb3Bjb2RlKSkKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDE7Ci0JICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoaS50bS5iYXNlX29wY29kZSk7Ci0JICB9Ci0JZWxzZSBpZiAoZml0c19pbl91bnNpZ25lZF93b3JkIChpLnRtLmJhc2Vfb3Bjb2RlKSkKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDI7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDIpOwotCSAgICAvKiBwdXQgb3V0IGhpZ2ggYnl0ZSBmaXJzdDogY2FuJ3QgdXNlIG1kX251bWJlcl90b19jaGFycyEgKi8KLQkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDgpICYgMHhmZjsKLQkgICAgKnAgPSBpLnRtLmJhc2Vfb3Bjb2RlICYgMHhmZjsKLQkgIH0KLQllbHNlCi0JICB7CQkJLyogb3Bjb2RlIGlzIGVpdGhlciAzIG9yIDQgYnl0ZXMgKi8KLQkgICAgaWYgKGkudG0uYmFzZV9vcGNvZGUgJiAweGZmMDAwMDAwKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDQ7Ci0JCXAgPSBmcmFnX21vcmUgKDQpOwotCQkqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gMjQpICYgMHhmZjsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAzOwotCQlwID0gZnJhZ19tb3JlICgzKTsKLQkgICAgICB9Ci0JICAgICpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiAxNikgJiAweGZmOwotCSAgICAqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gOCkgJiAweGZmOwotCSAgICAqcCA9IChpLnRtLmJhc2Vfb3Bjb2RlKSAmIDB4ZmY7Ci0JICB9Ci0KLQkvKiBOb3cgdGhlIG1vZHJtIGJ5dGUgYW5kIHNpYiBieXRlIChpZiBwcmVzZW50KS4gICovCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgTW9kcm0pCi0JICB7Ci0JICAgIGluc25fc2l6ZSArPSAxOwotCSAgICBwID0gZnJhZ19tb3JlICgxKTsKLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCSh2YWx1ZVQpIChpLnJtLnJlZ21lbSA8PCAwCi0JCQkJCSAgfCBpLnJtLnJlZyA8PCAzCi0JCQkJCSAgfCBpLnJtLm1vZGUgPDwgNiksCi0JCQkJMSk7Ci0JICAgIC8qIElmIGkucm0ucmVnbWVtID09IEVTUCAoNCkKLQkgICAgICAgJiYgaS5ybS5tb2RlICE9IChSZWdpc3RlciBtb2RlKQotCSAgICAgICAmJiBub3QgMTYgYml0Ci0JICAgICAgID09PiBuZWVkIHNlY29uZCBtb2RybSBieXRlLiAgKi8KLQkgICAgaWYgKGkucm0ucmVnbWVtID09IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HCi0JCSYmIGkucm0ubW9kZSAhPSAzCi0JCSYmICEoaS5iYXNlX3JlZyAmJiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWcxNikgIT0gMCkpCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMTsKLQkJcCA9IGZyYWdfbW9yZSAoMSk7Ci0JCW1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkgICAgKHZhbHVlVCkgKGkuc2liLmJhc2UgPDwgMAotCQkJCQkgICAgICB8IGkuc2liLmluZGV4IDw8IDMKLQkJCQkJICAgICAgfCBpLnNpYi5zY2FsZSA8PCA2KSwKLQkJCQkgICAgMSk7Ci0JICAgICAgfQotCSAgfQotCi0JaWYgKGkuZGlzcF9vcGVyYW5kcykKLQkgIHsKLQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IG47Ci0KLQkgICAgZm9yIChuID0gMDsgbiA8IGkub3BlcmFuZHM7IG4rKykKLQkgICAgICB7Ci0JCWlmIChpLnR5cGVzW25dICYgRGlzcCkKLQkJICB7Ci0JCSAgICBpZiAoaS5vcFtuXS5kaXNwcy0+WF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgICB7Ci0JCQlpbnQgc2l6ZSA9IDQ7Ci0JCQlsb25nIHZhbCA9IChsb25nKSBpLm9wW25dLmRpc3BzLT5YX2FkZF9udW1iZXI7Ci0KLQkJCWlmIChpLnR5cGVzW25dICYgKERpc3A4IHwgRGlzcDE2KSkKLQkJCSAgewotCQkJICAgIGxvbmcgbWFzazsKLQotCQkJICAgIHNpemUgPSAyOwotCQkJICAgIG1hc2sgPSB+IChsb25nKSAweGZmZmY7Ci0JCQkgICAgaWYgKGkudHlwZXNbbl0gJiBEaXNwOCkKLQkJCSAgICAgIHsKLQkJCQlzaXplID0gMTsKLQkJCQltYXNrID0gfiAobG9uZykgMHhmZjsKLQkJCSAgICAgIH0KLQotCQkJICAgIGlmICgodmFsICYgbWFzaykgIT0gMCAmJiAodmFsICYgbWFzaykgIT0gbWFzaykKLQkJCSAgICAgIGFzX3dhcm4gKF8oIiVsZCBzaG9ydGVuZWQgdG8gJWxkIiksCi0JCQkJICAgICAgIHZhbCwgdmFsICYgfm1hc2spOwotCQkJICB9Ci0JCQlpbnNuX3NpemUgKz0gc2l6ZTsKLQkJCXAgPSBmcmFnX21vcmUgKHNpemUpOwotCQkJbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSB2YWwsIHNpemUpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWludCBzaXplID0gNDsKLQotCQkJaWYgKGkudHlwZXNbbl0gJiBEaXNwMTYpCi0JCQkgIHNpemUgPSAyOwotCi0JCQlpbnNuX3NpemUgKz0gc2l6ZTsKLQkJCXAgPSBmcmFnX21vcmUgKHNpemUpOwotCQkJZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCQkJICAgICBpLm9wW25dLmRpc3BzLCAwLAotCQkJCSAgICAgcmVsb2MgKHNpemUsIDAsIGkuZGlzcF9yZWxvY1tuXSkpOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0JCQkvKiBlbmQgZGlzcGxhY2VtZW50IG91dHB1dCAqLwotCi0JLyogb3V0cHV0IGltbWVkaWF0ZSAqLwotCWlmIChpLmltbV9vcGVyYW5kcykKLQkgIHsKLQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IG47Ci0KLQkgICAgZm9yIChuID0gMDsgbiA8IGkub3BlcmFuZHM7IG4rKykKLQkgICAgICB7Ci0JCWlmIChpLnR5cGVzW25dICYgSW1tKQotCQkgIHsKLQkJICAgIGlmIChpLm9wW25dLmltbXMtPlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJaW50IHNpemUgPSA0OwotCQkJbG9uZyB2YWwgPSAobG9uZykgaS5vcFtuXS5pbW1zLT5YX2FkZF9udW1iZXI7Ci0KLQkJCWlmIChpLnR5cGVzW25dICYgKEltbTggfCBJbW04UyB8IEltbTE2KSkKLQkJCSAgewotCQkJICAgIGxvbmcgbWFzazsKLQotCQkJICAgIHNpemUgPSAyOwotCQkJICAgIG1hc2sgPSB+IChsb25nKSAweGZmZmY7Ci0JCQkgICAgaWYgKGkudHlwZXNbbl0gJiAoSW1tOCB8IEltbThTKSkKLQkJCSAgICAgIHsKLQkJCQlzaXplID0gMTsKLQkJCQltYXNrID0gfiAobG9uZykgMHhmZjsKLQkJCSAgICAgIH0KLQkJCSAgICBpZiAoKHZhbCAmIG1hc2spICE9IDAgJiYgKHZhbCAmIG1hc2spICE9IG1hc2spCi0JCQkgICAgICBhc193YXJuIChfKCIlbGQgc2hvcnRlbmVkIHRvICVsZCIpLAotCQkJCSAgICAgICB2YWwsIHZhbCAmIH5tYXNrKTsKLQkJCSAgfQotCQkJaW5zbl9zaXplICs9IHNpemU7Ci0JCQlwID0gZnJhZ19tb3JlIChzaXplKTsKLQkJCW1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgdmFsLCBzaXplKTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7CQkvKiBub3QgYWJzb2x1dGVfc2VjdGlvbiAqLwotCQkJLyogTmVlZCBhIDMyLWJpdCBmaXh1cCAoZG9uJ3Qgc3VwcG9ydCA4Yml0Ci0JCQkgICBub24tYWJzb2x1dGUgaW1tcykuICBUcnkgdG8gc3VwcG9ydCBvdGhlcgotCQkJICAgc2l6ZXMgLi4uICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIHJlbG9jX3R5cGU7Ci0jZWxzZQotCQkJaW50IHJlbG9jX3R5cGU7Ci0jZW5kaWYKLQkJCWludCBzaXplID0gNDsKLQotCQkJaWYgKGkudHlwZXNbbl0gJiBJbW0xNikKLQkJCSAgc2l6ZSA9IDI7Ci0JCQllbHNlIGlmIChpLnR5cGVzW25dICYgKEltbTggfCBJbW04UykpCi0JCQkgIHNpemUgPSAxOwotCi0JCQlpbnNuX3NpemUgKz0gc2l6ZTsKLQkJCXAgPSBmcmFnX21vcmUgKHNpemUpOwotCQkJcmVsb2NfdHlwZSA9IHJlbG9jIChzaXplLCAwLCBpLmRpc3BfcmVsb2NbMF0pOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkJCWlmIChyZWxvY190eXBlID09IEJGRF9SRUxPQ18zMgotCQkJICAgICYmIEdPVF9zeW1ib2wKLQkJCSAgICAmJiBHT1Rfc3ltYm9sID09IGkub3Bbbl0uaW1tcy0+WF9hZGRfc3ltYm9sCi0JCQkgICAgJiYgKGkub3Bbbl0uaW1tcy0+WF9vcCA9PSBPX3N5bWJvbAotCQkJCXx8IChpLm9wW25dLmltbXMtPlhfb3AgPT0gT19hZGQKLQkJCQkgICAgJiYgKChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24KLQkJCQkJIChpLm9wW25dLmltbXMtPlhfb3Bfc3ltYm9sKS0+WF9vcCkKLQkJCQkJPT0gT19zdWJ0cmFjdCkpKSkKLQkJCSAgewotCQkJICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMzg2X0dPVFBDOwotCQkJICAgIGkub3Bbbl0uaW1tcy0+WF9hZGRfbnVtYmVyICs9IDM7Ci0JCQkgIH0KLSNlbmRpZgotCQkJZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCQkJICAgICBpLm9wW25dLmltbXMsIDAsIHJlbG9jX3R5cGUpOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0JCQkvKiBlbmQgaW1tZWRpYXRlIG91dHB1dCAqLwotICAgICAgfQotCi0jaWZkZWYgREVCVUczODYKLSAgICBpZiAoZmxhZ19kZWJ1ZykKLSAgICAgIHsKLQlwaSAobGluZSwgJmkpOwotICAgICAgfQotI2VuZGlmIC8qIERFQlVHMzg2ICovCi0gIH0KLX0KLQwKLXN0YXRpYyBpbnQgaTM4Nl9pbW1lZGlhdGUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfaW1tZWRpYXRlIChpbW1fc3RhcnQpCi0gICAgIGNoYXIgKmltbV9zdGFydDsKLXsKLSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHNlZ1QgZXhwX3NlZyA9IDA7Ci0gIGV4cHJlc3Npb25TICogZXhwOwotCi0gIGlmIChpLmltbV9vcGVyYW5kcyA9PSBNQVhfSU1NRURJQVRFX09QRVJBTkRTKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygib25seSAxIG9yIDIgaW1tZWRpYXRlIG9wZXJhbmRzIGFyZSBhbGxvd2VkIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGV4cCA9ICZpbV9leHByZXNzaW9uc1tpLmltbV9vcGVyYW5kcysrXTsKLSAgaS5vcFt0aGlzX29wZXJhbmRdLmltbXMgPSBleHA7Ci0KLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCppbW1fc3RhcnQpKQotICAgICsraW1tX3N0YXJ0OwotCi0gIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbW1fc3RhcnQ7Ci0KLSNpZm5kZWYgTEVYX0FUCi0gIHsKLSAgICAvKgotICAgICAqIFdlIGNhbiBoYXZlIG9wZXJhbmRzIG9mIHRoZSBmb3JtCi0gICAgICogICA8c3ltYm9sPkBHT1RPRkYrPG5ubj4KLSAgICAgKiBUYWtlIHRoZSBlYXN5IHdheSBvdXQgaGVyZSBhbmQgY29weSBldmVyeXRoaW5nCi0gICAgICogaW50byBhIHRlbXBvcmFyeSBidWZmZXIuLi4KLSAgICAgKi8KLSAgICByZWdpc3RlciBjaGFyICpjcDsKLQotICAgIGNwID0gc3RyY2hyIChpbnB1dF9saW5lX3BvaW50ZXIsICdAJyk7Ci0gICAgaWYgKGNwICE9IE5VTEwpCi0gICAgICB7Ci0JY2hhciAqdG1wYnVmOwotCWludCBsZW4gPSAwOwotCWludCBmaXJzdDsKLQotCS8qIEdPVCByZWxvY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSAqLwotCWlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICBhc19iYWQgKF8oIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIikpOwotCi0JaWYgKEdPVF9zeW1ib2wgPT0gTlVMTCkKLQkgIEdPVF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOwotCi0JaWYgKHN0cm5jbXAgKGNwICsgMSwgIlBMVCIsIDMpID09IDApCi0JICB7Ci0JICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9QTFQzMjsKLQkgICAgbGVuID0gMzsKLQkgIH0KLQllbHNlIGlmIChzdHJuY21wIChjcCArIDEsICJHT1RPRkYiLCA2KSA9PSAwKQotCSAgewotCSAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UT0ZGOwotCSAgICBsZW4gPSA2OwotCSAgfQotCWVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVCIsIDMpID09IDApCi0JICB7Ci0JICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1QzMjsKLQkgICAgbGVuID0gMzsKLQkgIH0KLQllbHNlCi0JICBhc19iYWQgKF8oImJhZCByZWxvYyBzcGVjaWZpZXIgaW4gZXhwcmVzc2lvbiIpKTsKLQotCS8qIFJlcGxhY2UgdGhlIHJlbG9jYXRpb24gdG9rZW4gd2l0aCAnICcsIHNvIHRoYXQgZXJyb3JzIGxpa2UKLQkgICBmb29AR09UT0ZGMSB3aWxsIGJlIGRldGVjdGVkLiAgKi8KLQlmaXJzdCA9IGNwIC0gaW5wdXRfbGluZV9wb2ludGVyOwotCXRtcGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuKGlucHV0X2xpbmVfcG9pbnRlcikpOwotCW1lbWNweSAodG1wYnVmLCBpbnB1dF9saW5lX3BvaW50ZXIsIGZpcnN0KTsKLQl0bXBidWZbZmlyc3RdID0gJyAnOwotCXN0cmNweSAodG1wYnVmICsgZmlyc3QgKyAxLCBjcCArIDEgKyBsZW4pOwotCWlucHV0X2xpbmVfcG9pbnRlciA9IHRtcGJ1ZjsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgZXhwX3NlZyA9IGV4cHJlc3Npb24gKGV4cCk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICBhc19iYWQgKF8oImlnbm9yaW5nIGp1bmsgYCVzJyBhZnRlciBleHByZXNzaW9uIiksIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKGV4cC0+WF9vcCA9PSBPX2Fic2VudCB8fCBleHAtPlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgLyogbWlzc2luZyBvciBiYWQgZXhwciBiZWNvbWVzIGFic29sdXRlIDAgKi8KLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBvciBpbnZhbGlkIGltbWVkaWF0ZSBleHByZXNzaW9uIGAlcycgdGFrZW4gYXMgMCIpLAotCSAgICAgIGltbV9zdGFydCk7Ci0gICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZXhwLT5YX2FkZF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotICAgICAgZXhwLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0gICAgfQotCi0gIGlmIChleHAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpbnQgYmlnaW1tID0gSW1tMzI7Ci0gICAgICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0RBVEFfUFJFRklYXSAhPSAwKSkKLQliaWdpbW0gPSBJbW0xNjsKLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBiaWdpbW07Ci0gICAgfQotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0FPVVQpKQotICBlbHNlIGlmICgKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciAmJgotI2VuZGlmCi0JICAgZXhwX3NlZyAhPSB0ZXh0X3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IGRhdGFfc2VjdGlvbgotCSAgICYmIGV4cF9zZWcgIT0gYnNzX3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKGV4cF9zZWcpCi0jZW5kaWYKLQkgICApCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGFzX2JhZCAoXygidW5pbXBsZW1lbnRlZCBzZWdtZW50ICVzIGluIG9wZXJhbmQiKSwgZXhwX3NlZy0+bmFtZSk7Ci0jZWxzZQotICAgICAgYXNfYmFkIChfKCJ1bmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIiksIGV4cF9zZWcpOwotI2VuZGlmCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gYWRkcmVzcy4gIFRoZSBzaXplIG9mIHRoZSBhZGRyZXNzIHdpbGwgYmUKLQkgZGV0ZXJtaW5lZCBsYXRlciwgZGVwZW5kaW5nIG9uIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLAotCSBzdWZmaXgsIG9yIHRoZSBkZWZhdWx0IGZvciB0aGUgc2VjdGlvbi4gIFdlIGV4Y2x1ZGUKLQkgSW1tOFMgaGVyZSBzbyB0aGF0IGBwdXNoICRmb28nIGFuZCBvdGhlciBpbnN0cnVjdGlvbnMKLQkgd2l0aCBhbiBJbW04UyBmb3JtIHdpbGwgdXNlIEltbTE2IG9yIEltbTMyLiAgKi8KLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSAoSW1tOCB8IEltbTE2IHwgSW1tMzIpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBpMzg2X3NjYWxlIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X3NjYWxlIChzY2FsZSkKLSAgICAgY2hhciAqc2NhbGU7Ci17Ci0gIGlmICghaXNkaWdpdCAoKnNjYWxlKSkKLSAgICBnb3RvIGJhZF9zY2FsZTsKLQotICBzd2l0Y2ggKCpzY2FsZSkKLSAgICB7Ci0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzInOgotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICc0JzoKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnOCc6Ci0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgYmFkX3NjYWxlOgotICAgICAgYXNfYmFkIChfKCJleHBlY3Rpbmcgc2NhbGUgZmFjdG9yIG9mIDEsIDIsIDQsIG9yIDg6IGdvdCBgJXMnIiksCi0JICAgICAgc2NhbGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoaS5sb2cyX3NjYWxlX2ZhY3RvciAhPSAwICYmICEgaS5pbmRleF9yZWcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygic2NhbGUgZmFjdG9yIG9mICVkIHdpdGhvdXQgYW4gaW5kZXggcmVnaXN0ZXIiKSwKLQkgICAgICAgMSA8PCBpLmxvZzJfc2NhbGVfZmFjdG9yKTsKLSNpZiBTQ0FMRTFfV0hFTl9OT19JTkRFWAotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDA7Ci0jZW5kaWYKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGkzODZfZGlzcGxhY2VtZW50IFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfZGlzcGxhY2VtZW50IChkaXNwX3N0YXJ0LCBkaXNwX2VuZCkKLSAgICAgY2hhciAqZGlzcF9zdGFydDsKLSAgICAgY2hhciAqZGlzcF9lbmQ7Ci17Ci0gIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHA7Ci0gIHNlZ1QgZXhwX3NlZyA9IDA7Ci0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnQgYmlnZGlzcCA9IERpc3AzMjsKLQotICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0FERFJfUFJFRklYXSAhPSAwKSkKLSAgICBiaWdkaXNwID0gRGlzcDE2OwotICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gYmlnZGlzcDsKLQotICBleHAgPSAmZGlzcF9leHByZXNzaW9uc1tpLmRpc3Bfb3BlcmFuZHNdOwotICBpLm9wW3RoaXNfb3BlcmFuZF0uZGlzcHMgPSBleHA7Ci0gIGkuZGlzcF9vcGVyYW5kcysrOwotICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gZGlzcF9zdGFydDsKLSAgRU5EX1NUUklOR19BTkRfU0FWRSAoZGlzcF9lbmQpOwotCi0jaWZuZGVmIEdDQ19BU01fT19IQUNLCi0jZGVmaW5lIEdDQ19BU01fT19IQUNLIDAKLSNlbmRpZgotI2lmIEdDQ19BU01fT19IQUNLCi0gIEVORF9TVFJJTkdfQU5EX1NBVkUgKGRpc3BfZW5kICsgMSk7Ci0gIGlmICgoaS50eXBlc1t0aGlzX29wZXJhbmRdICYgQmFzZUluZGV4KSAhPSAwCi0gICAgICAmJiBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZFstMV0gPT0gJysnKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaGFjayBpcyB0byBhdm9pZCBhIHdhcm5pbmcgd2hlbiB1c2luZyB0aGUgIm8iCi0JIGNvbnN0cmFpbnQgd2l0aGluIGdjYyBhc20gc3RhdGVtZW50cy4KLQkgRm9yIGluc3RhbmNlOgotCi0JICNkZWZpbmUgX3NldF90c3NsZHRfZGVzYyhuLGFkZHIsbGltaXQsdHlwZSkgXAotCSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKLQkgIm1vdncgJXcyLCUwXG5cdCIgXAotCSAibW92dyAldzEsMislMFxuXHQiIFwKLQkgInJvcmwgJDE2LCUxXG5cdCIgXAotCSAibW92YiAlYjEsNCslMFxuXHQiIFwKLQkgIm1vdmIgJTQsNSslMFxuXHQiIFwKLQkgIm1vdmIgJDAsNislMFxuXHQiIFwKLQkgIm1vdmIgJWgxLDcrJTBcblx0IiBcCi0JICJyb3JsICQxNiwlMSIgXAotCSA6ICI9byIoKihuKSkgOiAicSIgKGFkZHIpLCAicmkiKGxpbWl0KSwgImkiKHR5cGUpKQotCi0JIFRoaXMgd29ya3MgZ3JlYXQgZXhjZXB0IHRoYXQgdGhlIG91dHB1dCBhc3NlbWJsZXIgZW5kcwotCSB1cCBsb29raW5nIGEgYml0IHdlaXJkIGlmIGl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIGlzCi0JIG5vIG9mZnNldC4gIFlvdSBlbmQgdXAgcHJvZHVjaW5nIGNvZGUgdGhhdCBsb29rcyBsaWtlOgotCi0JICNBUFAKLQkgbW92dyAkMjM1LCglZWF4KQotCSBtb3Z3ICVkeCwyKyglZWF4KQotCSByb3JsICQxNiwlZWR4Ci0JIG1vdmIgJWRsLDQrKCVlYXgpCi0JIG1vdmIgJDEzNyw1KyglZWF4KQotCSBtb3ZiICQwLDYrKCVlYXgpCi0JIG1vdmIgJWRoLDcrKCVlYXgpCi0JIHJvcmwgJDE2LCVlZHgKLQkgI05PX0FQUAotCi0JIFNvIGhlcmUgd2UgcHJvdmlkZSB0aGUgbWlzc2luZyB6ZXJvLgotICAgICAgKi8KLQotICAgICAgKmRpc3BsYWNlbWVudF9zdHJpbmdfZW5kID0gJzAnOwotICAgIH0KLSNlbmRpZgotI2lmbmRlZiBMRVhfQVQKLSAgewotICAgIC8qCi0gICAgICogV2UgY2FuIGhhdmUgb3BlcmFuZHMgb2YgdGhlIGZvcm0KLSAgICAgKiAgIDxzeW1ib2w+QEdPVE9GRis8bm5uPgotICAgICAqIFRha2UgdGhlIGVhc3kgd2F5IG91dCBoZXJlIGFuZCBjb3B5IGV2ZXJ5dGhpbmcKLSAgICAgKiBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4uLgotICAgICAqLwotICAgIHJlZ2lzdGVyIGNoYXIgKmNwOwotCi0gICAgY3AgPSBzdHJjaHIgKGlucHV0X2xpbmVfcG9pbnRlciwgJ0AnKTsKLSAgICBpZiAoY3AgIT0gTlVMTCkKLSAgICAgIHsKLQljaGFyICp0bXBidWY7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGZpcnN0OwotCi0JLyogR09UIHJlbG9jYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlICovCi0JaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgIGFzX2JhZCAoXygiR09UIHJlbG9jYXRpb25zIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUiKSk7Ci0KLQlpZiAoR09UX3N5bWJvbCA9PSBOVUxMKQotCSAgR09UX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk7Ci0KLQlpZiAoc3RybmNtcCAoY3AgKyAxLCAiUExUIiwgMykgPT0gMCkKLQkgIHsKLQkgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X1BMVDMyOwotCSAgICBsZW4gPSAzOwotCSAgfQotCWVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVE9GRiIsIDYpID09IDApCi0JICB7Ci0JICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1RPRkY7Ci0JICAgIGxlbiA9IDY7Ci0JICB9Ci0JZWxzZSBpZiAoc3RybmNtcCAoY3AgKyAxLCAiR09UIiwgMykgPT0gMCkKLQkgIHsKLQkgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X0dPVDMyOwotCSAgICBsZW4gPSAzOwotCSAgfQotCWVsc2UKLQkgIGFzX2JhZCAoXygiYmFkIHJlbG9jIHNwZWNpZmllciBpbiBleHByZXNzaW9uIikpOwotCi0JLyogUmVwbGFjZSB0aGUgcmVsb2NhdGlvbiB0b2tlbiB3aXRoICcgJywgc28gdGhhdCBlcnJvcnMgbGlrZQotCSAgIGZvb0BHT1RPRkYxIHdpbGwgYmUgZGV0ZWN0ZWQuICAqLwotCWZpcnN0ID0gY3AgLSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JdG1wYnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4oaW5wdXRfbGluZV9wb2ludGVyKSk7Ci0JbWVtY3B5ICh0bXBidWYsIGlucHV0X2xpbmVfcG9pbnRlciwgZmlyc3QpOwotCXRtcGJ1ZltmaXJzdF0gPSAnICc7Ci0Jc3RyY3B5ICh0bXBidWYgKyBmaXJzdCArIDEsIGNwICsgMSArIGxlbik7Ci0JaW5wdXRfbGluZV9wb2ludGVyID0gdG1wYnVmOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICBleHBfc2VnID0gZXhwcmVzc2lvbiAoZXhwKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogV2UgZG8gdGhpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbiBzeW1ib2wgaXMgaW4KLSAgICAgdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHdpbGwgdWx0aW1hdGVseSBjaGFuZ2UgdGhlIHJlbG9jYXRpb24KLSAgICAgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiAqLwotICBpZiAoaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPT0gQkZEX1JFTE9DXzM4Nl9HT1RPRkYpCi0gICAgewotICAgICAgaWYgKFNfSVNfTE9DQUwoZXhwLT5YX2FkZF9zeW1ib2wpCi0JICAmJiBTX0dFVF9TRUdNRU5UIChleHAtPlhfYWRkX3N5bWJvbCkgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0Jc2VjdGlvbl9zeW1ib2wgKFNfR0VUX1NFR01FTlQgKGV4cC0+WF9hZGRfc3ltYm9sKSk7Ci0gICAgICBhc3NlcnQgKGV4cC0+WF9vcCA9PSBPX3N5bWJvbCk7Ci0gICAgICBleHAtPlhfb3AgPSBPX3N1YnRyYWN0OwotICAgICAgZXhwLT5YX29wX3N5bWJvbCA9IEdPVF9zeW1ib2w7Ci0gICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zMjsKLSAgICB9Ci0jZW5kaWYKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKQotICAgIGFzX2JhZCAoXygiaWdub3JpbmcganVuayBgJXMnIGFmdGVyIGV4cHJlc3Npb24iKSwKLQkgICAgaW5wdXRfbGluZV9wb2ludGVyKTsKLSNpZiBHQ0NfQVNNX09fSEFDSwotICBSRVNUT1JFX0VORF9TVFJJTkcgKGRpc3BfZW5kICsgMSk7Ci0jZW5kaWYKLSAgUkVTVE9SRV9FTkRfU1RSSU5HIChkaXNwX2VuZCk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChleHAtPlhfb3AgPT0gT19hYnNlbnQgfHwgZXhwLT5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIC8qIG1pc3Npbmcgb3IgYmFkIGV4cHIgYmVjb21lcyBhYnNvbHV0ZSAwICovCi0gICAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3IgaW52YWxpZCBkaXNwbGFjZW1lbnQgZXhwcmVzc2lvbiBgJXMnIHRha2VuIGFzIDAiKSwKLQkgICAgICBkaXNwX3N0YXJ0KTsKLSAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBleHAtPlhfYWRkX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0gICAgICBleHAtPlhfb3Bfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKLSAgICB9Ci0KLSAgaWYgKGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGlmIChpLnR5cGVzW3RoaXNfb3BlcmFuZF0gJiBEaXNwMTYpCi0JewotCSAgLyogV2Uga25vdyB0aGlzIG9wZXJhbmQgaXMgYXQgbW9zdCAxNiBiaXRzLCBzbyBjb252ZXJ0IHRvIGEKLQkgICAgIHNpZ25lZCAxNiBiaXQgbnVtYmVyIGJlZm9yZSB0cnlpbmcgdG8gc2VlIHdoZXRoZXIgaXQgd2lsbAotCSAgICAgZml0IGluIGFuIGV2ZW4gc21hbGxlciBzaXplLiAgKi8KLQkgIGV4cC0+WF9hZGRfbnVtYmVyID0KLQkgICAgKCgoZXhwLT5YX2FkZF9udW1iZXIgJiAweGZmZmYpIF4gMHg4MDAwKSAtIDB4ODAwMCk7Ci0JfQotICAgICAgaWYgKGZpdHNfaW5fc2lnbmVkX2J5dGUgKGV4cC0+WF9hZGRfbnVtYmVyKSkKLQlpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gRGlzcDg7Ci0gICAgfQotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0FPVVQpKQotICBlbHNlIGlmICgKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciAmJgotI2VuZGlmCi0JICAgZXhwX3NlZyAhPSB0ZXh0X3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IGRhdGFfc2VjdGlvbgotCSAgICYmIGV4cF9zZWcgIT0gYnNzX3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBhc19iYWQgKF8oInVuaW1wbGVtZW50ZWQgc2VnbWVudCAlcyBpbiBvcGVyYW5kIiksIGV4cF9zZWctPm5hbWUpOwotI2Vsc2UKLSAgICAgIGFzX2JhZCAoXygidW5pbXBsZW1lbnRlZCBzZWdtZW50IHR5cGUgJWQgaW4gb3BlcmFuZCIpLCBleHBfc2VnKTsKLSNlbmRpZgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2VuZGlmCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGkzODZfb3BlcmFuZF9tb2RpZmllciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLQotc3RhdGljIGludAotaTM4Nl9vcGVyYW5kX21vZGlmaWVyIChvcF9zdHJpbmcsIGdvdF9hX2Zsb2F0KQotICAgICBjaGFyICoqb3Bfc3RyaW5nOwotICAgICBpbnQgZ290X2FfZmxvYXQ7Ci17Ci0gIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJCWVRFIFBUUiIsIDgpKQotICAgIHsKLSAgICAgIGkuc3VmZml4ID0gQllURV9NTkVNX1NVRkZJWDsKLSAgICAgICpvcF9zdHJpbmcgKz0gODsKLSAgICAgIHJldHVybiBCWVRFX1BUUjsKLQotICAgIH0KLSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiV09SRCBQVFIiLCA4KSkKLSAgICB7Ci0gICAgICBpZiAoZ290X2FfZmxvYXQgPT0gMikJLyogImZpLi4uIiAqLwotCWkuc3VmZml4ID0gU0hPUlRfTU5FTV9TVUZGSVg7Ci0gICAgICBlbHNlCi0JaS5zdWZmaXggPSBXT1JEX01ORU1fU1VGRklYOwotICAgICAgKm9wX3N0cmluZyArPSA4OwotICAgICAgcmV0dXJuIFdPUkRfUFRSOwotICAgIH0KLQotICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJEV09SRCBQVFIiLCA5KSkKLSAgICB7Ci0gICAgICBpZiAoZ290X2FfZmxvYXQgPT0gMSkJLyogImYuLi4iICovCi0JaS5zdWZmaXggPSBTSE9SVF9NTkVNX1NVRkZJWDsKLSAgICAgIGVsc2UKLQlpLnN1ZmZpeCA9IExPTkdfTU5FTV9TVUZGSVg7Ci0gICAgICAqb3Bfc3RyaW5nICs9IDk7Ci0gICAgICByZXR1cm4gRFdPUkRfUFRSOwotICAgIH0KLQotICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJRV09SRCBQVFIiLCA5KSkKLSAgICB7Ci0gICAgICBpLnN1ZmZpeCA9IERXT1JEX01ORU1fU1VGRklYOwotICAgICAgKm9wX3N0cmluZyArPSA5OwotICAgICAgcmV0dXJuIFFXT1JEX1BUUjsKLSAgICB9Ci0KLSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiWFdPUkQgUFRSIiwgOSkpCi0gICAgewotICAgICAgaS5zdWZmaXggPSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWDsKLSAgICAgICpvcF9zdHJpbmcgKz0gOTsKLSAgICAgIHJldHVybiBYV09SRF9QVFI7Ci0gICAgfQotCi0gIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIlNIT1JUIiwgNSkpCi0gICAgewotICAgICAgKm9wX3N0cmluZyArPSA1OwotICAgICAgcmV0dXJuIFNIT1JUOwotICAgIH0KLQotICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJPRkZTRVQgRkxBVDoiLCAxMikpCi0gICAgewotICAgICAgKm9wX3N0cmluZyArPSAxMjsKLSAgICAgIHJldHVybiBPRkZTRVRfRkxBVDsKLSAgICB9Ci0KLSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiRkxBVCIsIDQpKQotICAgIHsKLSAgICAgICpvcF9zdHJpbmcgKz0gNDsKLSAgICAgIHJldHVybiBGTEFUOwotICAgIH0KLQotICBlbHNlIHJldHVybiBOT05FX0ZPVU5EOwotfQotCi1zdGF0aWMgY2hhciAqIGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLQotc3RhdGljIGNoYXIgKgotYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyAoaW5pdGlhbF9kaXNwLCBvcF9zdHJpbmcpCi0gICAgIGludCBpbml0aWFsX2Rpc3A7Ci0gICAgIGNoYXIgKm9wX3N0cmluZzsKLXsKLSAgY2hhciAqdGVtcF9zdHJpbmcgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAob3Bfc3RyaW5nKSArIDEpOwotICBjaGFyICplbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gIGNoYXIgKnRjOwotICBjaGFyICp0ZW1wX2Rpc3A7Ci0KLSAgdGVtcF9zdHJpbmdbMF0gPSAnXDAnOwotICB0YyA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IHN0cmNociAob3Bfc3RyaW5nLCAnWycpOwotICBpZiAoaW5pdGlhbF9kaXNwICYmICFlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpCi0gICAgewotICAgICAgc3RyY3B5ICh0ZW1wX3N0cmluZywgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiB0ZW1wX3N0cmluZzsKLSAgICB9Ci0KLSAgLyogQnVpbGQgdGhlIHdob2xlIGRpc3BsYWNlbWVudCBzdHJpbmcgKi8KLSAgaWYgKGluaXRpYWxfZGlzcCkKLSAgICB7Ci0gICAgICBzdHJuY3B5ICh0ZW1wX3N0cmluZywgb3Bfc3RyaW5nLCBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgLSBvcF9zdHJpbmcpOwotICAgICAgdGVtcF9zdHJpbmdbZW5kX29mX29wZXJhbmRfc3RyaW5nIC0gb3Bfc3RyaW5nXSA9ICdcMCc7Ci0gICAgICB0ZW1wX2Rpc3AgPSB0YzsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZW1wX2Rpc3AgPSBvcF9zdHJpbmc7Ci0KLSAgd2hpbGUgKCp0ZW1wX2Rpc3AgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBjaGFyICplbmRfb3A7Ci0gICAgICBpbnQgYWRkX21pbnVzID0gKCp0ZW1wX2Rpc3AgPT0gJy0nKTsKLQotICAgICAgaWYgKCp0ZW1wX2Rpc3AgPT0gJysnIHx8ICp0ZW1wX2Rpc3AgPT0gJy0nIHx8ICp0ZW1wX2Rpc3AgPT0gJ1snKQotCXRlbXBfZGlzcCsrOwotCi0gICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKnRlbXBfZGlzcCkpCi0JdGVtcF9kaXNwKys7Ci0KLSAgICAgIC8qIERvbid0IGNvbnNpZGVyIHJlZ2lzdGVycyAqLwotICAgICAgaWYgKCAhKCgqdGVtcF9kaXNwID09IFJFR0lTVEVSX1BSRUZJWCB8fCBhbGxvd19uYWtlZF9yZWcpCi0JICAgICAmJiBwYXJzZV9yZWdpc3RlciAodGVtcF9kaXNwLCAmZW5kX29wKSkgKQotCXsKLQkgIGNoYXIgKnN0cmluZ19zdGFydCA9IHRlbXBfZGlzcDsKLQotCSAgd2hpbGUgKCp0ZW1wX2Rpc3AgIT0gJ10nCi0JCSAmJiAqdGVtcF9kaXNwICE9ICcrJwotCQkgJiYgKnRlbXBfZGlzcCAhPSAnLScKLQkJICYmICp0ZW1wX2Rpc3AgIT0gJyonKQotCSAgICArK3RlbXBfZGlzcDsKLQotCSAgaWYgKGFkZF9taW51cykKLQkgICAgc3RyY2F0ICh0ZW1wX3N0cmluZywgIi0iKTsKLQkgIGVsc2UKLQkgICAgc3RyY2F0ICh0ZW1wX3N0cmluZywgIisiKTsKLQotCSAgc3RybmNhdCAodGVtcF9zdHJpbmcsIHN0cmluZ19zdGFydCwgdGVtcF9kaXNwIC0gc3RyaW5nX3N0YXJ0KTsKLQkgIGlmICgqdGVtcF9kaXNwID09ICcrJyB8fCAqdGVtcF9kaXNwID09ICctJykKLQkgICAgLS10ZW1wX2Rpc3A7Ci0JfQotCi0gICAgICB3aGlsZSAoKnRlbXBfZGlzcCAhPSAnXDAnCi0JICAgICAmJiAqdGVtcF9kaXNwICE9ICcrJwotCSAgICAgJiYgKnRlbXBfZGlzcCAhPSAnLScpCi0JKyt0ZW1wX2Rpc3A7Ci0gICAgfQotCi0gIHJldHVybiB0ZW1wX3N0cmluZzsKLX0KLQotc3RhdGljIGludCBpMzg2X3BhcnNlX3NlZyBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9wYXJzZV9zZWcgKG9wX3N0cmluZykKLSAgICAgY2hhciAqb3Bfc3RyaW5nOwotewotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgLyogU2hvdWxkIGJlIG9uZSBvZiBlcywgY3MsIHNzLCBkcyBmcyBvciBncyAqLwotICBzd2l0Y2ggKCpvcF9zdHJpbmcrKykKLSAgICB7Ci0gICAgY2FzZSAnZSc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZXM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZjczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJnNzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZHM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZmczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmdzOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCpvcF9zdHJpbmcrKyAhPSAncycpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgc2VnbWVudCBuYW1lIGAlcyciKSwgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgaWYgKCpvcF9zdHJpbmcgIT0gJzonKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci0KLX0KLQotc3RhdGljIGludCBpMzg2X2luZGV4X2NoZWNrIFBBUkFNUygoY29uc3QgY2hhciAqKSk7Ci0KLS8qIE1ha2Ugc3VyZSB0aGUgbWVtb3J5IG9wZXJhbmQgd2UndmUgYmVlbiBkZWFsdCBpcyB2YWxpZC4KLSAgIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGEgZmFpbHVyZS4KLSovCi1zdGF0aWMgaW50Ci1pMzg2X2luZGV4X2NoZWNrIChvcGVyYW5kX3N0cmluZykKLSAgICAgY29uc3QgY2hhciAqb3BlcmFuZF9zdHJpbmc7Ci17Ci0jaWYgSU5GRVJfQUREUl9QUkVGSVgKLSAgaW50IGZ1ZGdlZCA9IDA7Ci0KLSB0cnlwcmVmaXg6Ci0jZW5kaWYKLSAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkKLSAgICAgIC8qIDE2IGJpdCBtb2RlIGNoZWNrcyAqLwotICAgICAgPyAoKGkuYmFzZV9yZWcKLQkgICYmICgoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiAoUmVnMTZ8QmFzZUluZGV4KSkKLQkgICAgICAhPSAoUmVnMTZ8QmFzZUluZGV4KSkpCi0JIHx8IChpLmluZGV4X3JlZwotCSAgICAgJiYgKCgoaS5pbmRleF9yZWctPnJlZ190eXBlICYgKFJlZzE2fEJhc2VJbmRleCkpCi0JCSAgIT0gKFJlZzE2fEJhc2VJbmRleCkpCi0JCSB8fCAhIChpLmJhc2VfcmVnCi0JCSAgICAgICAmJiBpLmJhc2VfcmVnLT5yZWdfbnVtIDwgNgotCQkgICAgICAgJiYgaS5pbmRleF9yZWctPnJlZ19udW0gPj0gNgotCQkgICAgICAgJiYgaS5sb2cyX3NjYWxlX2ZhY3RvciA9PSAwKSkpKQotICAgICAgLyogMzIgYml0IG1vZGUgY2hlY2tzICovCi0gICAgICA6ICgoaS5iYXNlX3JlZwotCSAgJiYgKGkuYmFzZV9yZWctPnJlZ190eXBlICYgUmVnMzIpID09IDApCi0JIHx8IChpLmluZGV4X3JlZwotCSAgICAgJiYgKChpLmluZGV4X3JlZy0+cmVnX3R5cGUgJiAoUmVnMzJ8QmFzZUluZGV4KSkKLQkJICE9IChSZWczMnxCYXNlSW5kZXgpKSkpKQotICAgIHsKLSNpZiBJTkZFUl9BRERSX1BSRUZJWAotICAgICAgaWYgKGkucHJlZml4W0FERFJfUFJFRklYXSA9PSAwICYmIHN0YWNrb3Bfc2l6ZSAhPSAnXDAnKQotCXsKLQkgIGkucHJlZml4W0FERFJfUFJFRklYXSA9IEFERFJfUFJFRklYX09QQ09ERTsKLQkgIGkucHJlZml4ZXMgKz0gMTsKLQkgIC8qIENoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgZGlzcGxhY2VtZW50IHRvby4gIEF0IG1vc3Qgb25lIG9mCi0JICAgICBEaXNwMTYgb3IgRGlzcDMyIGlzIHNldC4KLQkgICAgIEZJWE1FLiAgVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSByZWFsIG5lZWQgZm9yIHNlcGFyYXRlCi0JICAgICBEaXNwMTYgYW5kIERpc3AzMiBmbGFncy4gIFRoZSBzYW1lIGdvZXMgZm9yIEltbTE2IGFuZCBJbW0zMi4KLQkgICAgIFJlbW92aW5nIHRoZW0gd291bGQgcHJvYmFibHkgY2xlYW4gdXAgdGhlIGNvZGUgcXVpdGUgYSBsb3QuCi0JICAqLwotCSAgaWYgKGkudHlwZXNbdGhpc19vcGVyYW5kXSAmIChEaXNwMTZ8RGlzcDMyKSkKLQkgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSBePSAoRGlzcDE2fERpc3AzMik7Ci0JICBmdWRnZWQgPSAxOwotCSAgZ290byB0cnlwcmVmaXg7Ci0JfQotICAgICAgaWYgKGZ1ZGdlZCkKLQlhc19iYWQgKF8oImAlcycgaXMgbm90IGEgdmFsaWQgYmFzZS9pbmRleCBleHByZXNzaW9uIiksCi0JCW9wZXJhbmRfc3RyaW5nKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCWFzX2JhZCAoXygiYCVzJyBpcyBub3QgYSB2YWxpZCAlcyBiaXQgYmFzZS9pbmRleCBleHByZXNzaW9uIiksCi0JCW9wZXJhbmRfc3RyaW5nLAotCQlmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdICE9IDApID8gIjE2IiA6ICIzMiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIChvcGVyYW5kX3N0cmluZykKLSAgICAgY2hhciAqb3BlcmFuZF9zdHJpbmc7Ci17Ci0gIGNoYXIgKm9wX3N0cmluZyA9IG9wZXJhbmRfc3RyaW5nOwotICBjaGFyICplbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0KLSAgaWYgKChpLm1lbV9vcGVyYW5kcyA9PSAxCi0gICAgICAgJiYgKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpID09IDApCi0gICAgICB8fCBpLm1lbV9vcGVyYW5kcyA9PSAyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgbWVtb3J5IHJlZmVyZW5jZXMgZm9yIGAlcyciKSwKLQkgICAgICBjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm5hbWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIEZpcnN0IGNoZWNrIGZvciBhIHNlZ21lbnQgb3ZlcnJpZGUuICAqLwotICBpZiAoKm9wX3N0cmluZyAhPSAnWycpCi0gICAgewotICAgICAgY2hhciAqZW5kX3NlZzsKLQotICAgICAgZW5kX3NlZyA9IHN0cmNociAob3Bfc3RyaW5nLCAnOicpOwotICAgICAgaWYgKGVuZF9zZWcpCi0JewotCSAgaWYgKCFpMzg2X3BhcnNlX3NlZyAob3Bfc3RyaW5nKSkKLQkgICAgcmV0dXJuIDA7Ci0JICBvcF9zdHJpbmcgPSBlbmRfc2VnICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGRpc3BsYWNlbWVudCBwcmVjZWRpbmcgb3BlbiBicmFja2V0ICovCi0gIGlmICgqb3Bfc3RyaW5nICE9ICdbJykKLSAgICB7Ci0gICAgICBjaGFyICp0ZW1wX3N0cmluZzsKLQotICAgICAgaWYgKGkuZGlzcF9vcGVyYW5kcykKLQlyZXR1cm4gMDsKLQotICAgICAgdGVtcF9zdHJpbmcgPSBidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nICh0cnVlLCBvcF9zdHJpbmcpOwotCi0gICAgICBpZiAoIWkzODZfZGlzcGxhY2VtZW50ICh0ZW1wX3N0cmluZywgdGVtcF9zdHJpbmcgKyBzdHJsZW4gKHRlbXBfc3RyaW5nKSkpCi0JewotCSAgZnJlZSAodGVtcF9zdHJpbmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZnJlZSAodGVtcF9zdHJpbmcpOwotCi0gICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBzdHJjaHIgKG9wX3N0cmluZywgJ1snKTsKLSAgICAgIGlmICghZW5kX29mX29wZXJhbmRfc3RyaW5nKQotCWVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZyArIHN0cmxlbiAob3Bfc3RyaW5nKTsKLQotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCplbmRfb2Zfb3BlcmFuZF9zdHJpbmcpKQotCS0tZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCi0gICAgICBvcF9zdHJpbmcgPSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gICAgfQotCi0gIGlmICgqb3Bfc3RyaW5nID09ICdbJykKLSAgICB7Ci0gICAgICArK29wX3N0cmluZzsKLQotICAgICAgLyogUGljayBvZmYgZWFjaCBjb21wb25lbnQgYW5kIGZpZ3VyZSBvdXQgd2hlcmUgaXQgYmVsb25ncyAqLwotCi0gICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmc7Ci0KLSAgICAgIHdoaWxlICgqb3Bfc3RyaW5nICE9ICddJykKLQl7Ci0JICBjb25zdCByZWdfZW50cnkgKnRlbXBfcmVnOwotCSAgY2hhciAqZW5kX29wOwotCSAgY2hhciAqdGVtcF9zdHJpbmc7Ci0KLQkgIHdoaWxlICgqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcrJwotCQkgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnLScKLQkJICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJyonCi0JCSAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICddJykKLQkgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nKys7Ci0KLQkgIHRlbXBfc3RyaW5nID0gb3Bfc3RyaW5nOwotCSAgaWYgKCp0ZW1wX3N0cmluZyA9PSAnKycpCi0JICAgIHsKLQkgICAgICArK3RlbXBfc3RyaW5nOwotCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqdGVtcF9zdHJpbmcpKQotCQkrK3RlbXBfc3RyaW5nOwotCSAgICB9Ci0KLQkgIGlmICgoKnRlbXBfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCB8fCBhbGxvd19uYWtlZF9yZWcpCi0JICAgICAgJiYgKHRlbXBfcmVnID0gcGFyc2VfcmVnaXN0ZXIgKHRlbXBfc3RyaW5nLCAmZW5kX29wKSkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChpLmJhc2VfcmVnID09IE5VTEwpCi0JCWkuYmFzZV9yZWcgPSB0ZW1wX3JlZzsKLQkgICAgICBlbHNlCi0JCWkuaW5kZXhfcmVnID0gdGVtcF9yZWc7Ci0KLQkgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gQmFzZUluZGV4OwotCSAgICB9Ci0JICBlbHNlIGlmICgqdGVtcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbmFtZSBgJXMnIiksIHRlbXBfc3RyaW5nKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLQkJICAgfHwgKm9wX3N0cmluZyA9PSAnKycgfHwgKm9wX3N0cmluZyA9PSAnLScpCi0JICAgIHsKLQkgICAgICBjaGFyICp0ZW1wX3N0cjsKLQotCSAgICAgIGlmIChpLmRpc3Bfb3BlcmFuZHMgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkgICAgICB0ZW1wX3N0cmluZyA9IGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcgKGZhbHNlLCBvcF9zdHJpbmcpOwotCi0JICAgICAgdGVtcF9zdHIgPSB0ZW1wX3N0cmluZzsKLQkgICAgICBpZiAoKnRlbXBfc3RyID09ICcrJykKLQkJKyt0ZW1wX3N0cjsKLQotCSAgICAgIGlmICghaTM4Nl9kaXNwbGFjZW1lbnQgKHRlbXBfc3RyLCB0ZW1wX3N0ciArIHN0cmxlbiAodGVtcF9zdHIpKSkKLQkJewotCQkgIGZyZWUgKHRlbXBfc3RyaW5nKTsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICAgIGZyZWUgKHRlbXBfc3RyaW5nKTsKLQotCSAgICAgICsrb3Bfc3RyaW5nOwotCSAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZzsKLQkgICAgICB3aGlsZSAoKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnXScKLQkJICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcrJwotCQkgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJy0nCi0JCSAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKicpCi0JCSsrZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmICgqb3Bfc3RyaW5nID09ICcqJykKLQkgICAgewotCSAgICAgICsrb3Bfc3RyaW5nOwotCi0JICAgICAgaWYgKGkuYmFzZV9yZWcgJiYgIWkuaW5kZXhfcmVnKQotCQl7Ci0JCSAgaS5pbmRleF9yZWcgPSBpLmJhc2VfcmVnOwotCQkgIGkuYmFzZV9yZWcgPSAwOwotCQl9Ci0KLQkgICAgICBpZiAoIWkzODZfc2NhbGUgKG9wX3N0cmluZykpCi0JCXJldHVybiAwOwotCSAgICB9Ci0JICBvcF9zdHJpbmcgPSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0JICArK2VuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQl9Ci0gICAgfQotCi0gIGlmIChpMzg2X2luZGV4X2NoZWNrIChvcGVyYW5kX3N0cmluZykgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpLm1lbV9vcGVyYW5kcysrOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotaTM4Nl9pbnRlbF9vcGVyYW5kIChvcGVyYW5kX3N0cmluZywgZ290X2FfZmxvYXQpCi0gICAgIGNoYXIgKm9wZXJhbmRfc3RyaW5nOwotICAgICBpbnQgZ290X2FfZmxvYXQ7Ci17Ci0gIGNvbnN0IHJlZ19lbnRyeSAqIHI7Ci0gIGNoYXIgKmVuZF9vcDsKLSAgY2hhciAqb3Bfc3RyaW5nID0gb3BlcmFuZF9zdHJpbmc7Ci0KLSAgaW50IG9wZXJhbmRfbW9kaWZpZXIgPSBpMzg2X29wZXJhbmRfbW9kaWZpZXIgKCZvcF9zdHJpbmcsIGdvdF9hX2Zsb2F0KTsKLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotICAgICsrb3Bfc3RyaW5nOwotCi0gIHN3aXRjaCAob3BlcmFuZF9tb2RpZmllcikKLSAgICB7Ci0gICAgY2FzZSBCWVRFX1BUUjoKLSAgICBjYXNlIFdPUkRfUFRSOgotICAgIGNhc2UgRFdPUkRfUFRSOgotICAgIGNhc2UgUVdPUkRfUFRSOgotICAgIGNhc2UgWFdPUkRfUFRSOgotICAgICAgaWYgKCFpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIChvcF9zdHJpbmcpKQotCXJldHVybiAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZMQVQ6Ci0gICAgY2FzZSBPRkZTRVRfRkxBVDoKLSAgICAgIGlmICghaTM4Nl9pbW1lZGlhdGUgKG9wX3N0cmluZykpCi0JcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hPUlQ6Ci0gICAgY2FzZSBOT05FX0ZPVU5EOgotICAgICAgLyogU2hvdWxkIGJlIHJlZ2lzdGVyIG9yIGltbWVkaWF0ZSAqLwotICAgICAgaWYgKGlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpCi0JICAmJiBzdHJjaHIgKG9wX3N0cmluZywgJ1snKSA9PSAwKQotCXsKLQkgIGlmICghaTM4Nl9pbW1lZGlhdGUgKG9wX3N0cmluZykpCi0JICAgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UgaWYgKCgqb3Bfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCB8fCBhbGxvd19uYWtlZF9yZWcpCi0JICAgICAgICYmIChyID0gcGFyc2VfcmVnaXN0ZXIgKG9wX3N0cmluZywgJmVuZF9vcCkpICE9IE5VTEwpCi0JewotCSAgLyogQ2hlY2sgZm9yIGEgc2VnbWVudCBvdmVycmlkZSBieSBzZWFyY2hpbmcgZm9yICc6JyBhZnRlciBhCi0JICAgICBzZWdtZW50IHJlZ2lzdGVyLiAgKi8KLQkgIG9wX3N0cmluZyA9IGVuZF9vcDsKLQkgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLQkgICAgKytvcF9zdHJpbmc7Ci0JICBpZiAoKm9wX3N0cmluZyA9PSAnOicgJiYgKHItPnJlZ190eXBlICYgKFNSZWcyIHwgU1JlZzMpKSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoci0+cmVnX251bSkKLQkJewotCQljYXNlIDA6Ci0JCSAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmVzOwotCQkgIGJyZWFrOwotCQljYXNlIDE6Ci0JCSAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmNzOwotCQkgIGJyZWFrOwotCQljYXNlIDI6Ci0JCSAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJnNzOwotCQkgIGJyZWFrOwotCQljYXNlIDM6Ci0JCSAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmRzOwotCQkgIGJyZWFrOwotCQljYXNlIDQ6Ci0JCSAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmZzOwotCQkgIGJyZWFrOwotCQljYXNlIDU6Ci0JCSAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmdzOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgfQotCSAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IHItPnJlZ190eXBlICYgfkJhc2VJbmRleDsKLQkgIGkub3BbdGhpc19vcGVyYW5kXS5yZWdzID0gcjsKLQkgIGkucmVnX29wZXJhbmRzKys7Ci0JfQotICAgICAgZWxzZSBpZiAoKm9wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgpCi0JewotCSAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlIGlmICghaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCAob3Bfc3RyaW5nKSkKLQlyZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0gICAgfSAgLyogZW5kIHN3aXRjaCAqLwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQYXJzZSBPUEVSQU5EX1NUUklORyBpbnRvIHRoZSBpMzg2X2luc24gc3RydWN0dXJlIEkuICBSZXR1cm5zIG5vbi16ZXJvCi0gICBvbiBlcnJvci4gKi8KLQotc3RhdGljIGludAotaTM4Nl9vcGVyYW5kIChvcGVyYW5kX3N0cmluZykKLSAgICAgY2hhciAqb3BlcmFuZF9zdHJpbmc7Ci17Ci0gIGNvbnN0IHJlZ19lbnRyeSAqcjsKLSAgY2hhciAqZW5kX29wOwotICBjaGFyICpvcF9zdHJpbmcgPSBvcGVyYW5kX3N0cmluZzsKLQotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgLyogV2UgY2hlY2sgZm9yIGFuIGFic29sdXRlIHByZWZpeCAoZGlmZmVyZW50aWF0aW5nLAotICAgICBmb3IgZXhhbXBsZSwgJ2ptcCBwY19yZWxhdGl2ZV9sYWJlbCcgZnJvbSAnam1wICphYnNvbHV0ZV9sYWJlbCcuICovCi0gIGlmICgqb3Bfc3RyaW5nID09IEFCU09MVVRFX1BSRUZJWCkKLSAgICB7Ci0gICAgICArK29wX3N0cmluZzsKLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLQkrK29wX3N0cmluZzsKLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBKdW1wQWJzb2x1dGU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGlmIG9wZXJhbmQgaXMgYSByZWdpc3Rlci4gKi8KLSAgaWYgKCgqb3Bfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCB8fCBhbGxvd19uYWtlZF9yZWcpCi0gICAgICAmJiAociA9IHBhcnNlX3JlZ2lzdGVyIChvcF9zdHJpbmcsICZlbmRfb3ApKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIENoZWNrIGZvciBhIHNlZ21lbnQgb3ZlcnJpZGUgYnkgc2VhcmNoaW5nIGZvciAnOicgYWZ0ZXIgYQotCSBzZWdtZW50IHJlZ2lzdGVyLiAgKi8KLSAgICAgIG9wX3N0cmluZyA9IGVuZF9vcDsKLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLQkrK29wX3N0cmluZzsKLSAgICAgIGlmICgqb3Bfc3RyaW5nID09ICc6JyAmJiAoci0+cmVnX3R5cGUgJiAoU1JlZzIgfCBTUmVnMykpKQotCXsKLQkgIHN3aXRjaCAoci0+cmVnX251bSkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmVzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmNzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJnNzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDM6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmRzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDQ6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmZzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDU6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmdzOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIFNraXAgdGhlICc6JyBhbmQgd2hpdGVzcGFjZS4gICovCi0JICArK29wX3N0cmluZzsKLQkgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLQkgICAgKytvcF9zdHJpbmc7Ci0KLQkgIGlmICghaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLQkgICAgICAmJiAhaXNfaWRlbnRpZmllcl9jaGFyICgqb3Bfc3RyaW5nKQotCSAgICAgICYmICpvcF9zdHJpbmcgIT0gJygnCi0JICAgICAgJiYgKm9wX3N0cmluZyAhPSBBQlNPTFVURV9QUkVGSVgpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCBtZW1vcnkgb3BlcmFuZCBgJXMnIiksIG9wX3N0cmluZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIC8qIEhhbmRsZSBjYXNlIG9mICVlczoqZm9vLiAqLwotCSAgaWYgKCpvcF9zdHJpbmcgPT0gQUJTT0xVVEVfUFJFRklYKQotCSAgICB7Ci0JICAgICAgKytvcF9zdHJpbmc7Ci0JICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotCQkrK29wX3N0cmluZzsKLQkgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSnVtcEFic29sdXRlOwotCSAgICB9Ci0JICBnb3RvIGRvX21lbW9yeV9yZWZlcmVuY2U7Ci0JfQotICAgICAgaWYgKCpvcF9zdHJpbmcpCi0JewotCSAgYXNfYmFkIChfKCJqdW5rIGAlcycgYWZ0ZXIgcmVnaXN0ZXIiKSwgb3Bfc3RyaW5nKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSByLT5yZWdfdHlwZSAmIH5CYXNlSW5kZXg7Ci0gICAgICBpLm9wW3RoaXNfb3BlcmFuZF0ucmVncyA9IHI7Ci0gICAgICBpLnJlZ19vcGVyYW5kcysrOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKCpvcF9zdHJpbmcgPT0gSU1NRURJQVRFX1BSRUZJWCkKLSAgICB7CQkJCS8qIC4uLiBvciBhbiBpbW1lZGlhdGUgKi8KLSAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgaWYgKGkudHlwZXNbdGhpc19vcGVyYW5kXSAmIEp1bXBBYnNvbHV0ZSkKLQl7Ci0JICBhc19iYWQgKF8oImltbWVkaWF0ZSBvcGVyYW5kIGlsbGVnYWwgd2l0aCBhYnNvbHV0ZSBqdW1wIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaWYgKCFpMzg2X2ltbWVkaWF0ZSAob3Bfc3RyaW5nKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpCi0JICAgfHwgaXNfaWRlbnRpZmllcl9jaGFyICgqb3Bfc3RyaW5nKQotCSAgIHx8ICpvcF9zdHJpbmcgPT0gJygnICkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgbWVtb3J5IHJlZmVyZW5jZSBvZiBzb21lIHNvcnQuICovCi0gICAgICBjaGFyICpiYXNlX3N0cmluZzsKLQotICAgICAgLyogU3RhcnQgYW5kIGVuZCBvZiBkaXNwbGFjZW1lbnQgc3RyaW5nIGV4cHJlc3Npb24gKGlmIGZvdW5kKS4gKi8KLSAgICAgIGNoYXIgKmRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQ7Ci0gICAgICBjaGFyICpkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZDsKLQotICAgIGRvX21lbW9yeV9yZWZlcmVuY2U6Ci0gICAgICBpZiAoKGkubWVtX29wZXJhbmRzID09IDEKLQkgICAmJiAoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykgPT0gMCkKLQkgIHx8IGkubWVtX29wZXJhbmRzID09IDIpCi0JewotCSAgYXNfYmFkIChfKCJ0b28gbWFueSBtZW1vcnkgcmVmZXJlbmNlcyBmb3IgYCVzJyIpLAotCQkgIGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIENoZWNrIGZvciBiYXNlIGluZGV4IGZvcm0uICBXZSBkZXRlY3QgdGhlIGJhc2UgaW5kZXggZm9ybSBieQotCSBsb29raW5nIGZvciBhbiAnKScgYXQgdGhlIGVuZCBvZiB0aGUgb3BlcmFuZCwgc2VhcmNoaW5nCi0JIGZvciB0aGUgJygnIG1hdGNoaW5nIGl0LCBhbmQgZmluZGluZyBhIFJFR0lTVEVSX1BSRUZJWCBvciAnLCcKLQkgYWZ0ZXIgdGhlICcoJy4gICovCi0gICAgICBiYXNlX3N0cmluZyA9IG9wX3N0cmluZyArIHN0cmxlbiAob3Bfc3RyaW5nKTsKLQotICAgICAgLS1iYXNlX3N0cmluZzsKLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCS0tYmFzZV9zdHJpbmc7Ci0KLSAgICAgIC8qIElmIHdlIG9ubHkgaGF2ZSBhIGRpc3BsYWNlbWVudCwgc2V0LXVwIGZvciBpdCB0byBiZSBwYXJzZWQgbGF0ZXIuICovCi0gICAgICBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0ID0gb3Bfc3RyaW5nOwotICAgICAgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgPSBiYXNlX3N0cmluZyArIDE7Ci0KLSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gJyknKQotCXsKLQkgIGNoYXIgKnRlbXBfc3RyaW5nOwotCSAgdW5zaWduZWQgaW50IHBhcmVuc19iYWxhbmNlZCA9IDE7Ci0JICAvKiBXZSd2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgbnVtYmVyIG9mIGxlZnQgJiByaWdodCAoKSdzIGFyZQotCSAgICAgZXF1YWwsIHNvIHRoaXMgbG9vcCB3aWxsIG5vdCBiZSBpbmZpbml0ZS4gKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICBiYXNlX3N0cmluZy0tOwotCSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gJyknKQotCQlwYXJlbnNfYmFsYW5jZWQrKzsKLQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09ICcoJykKLQkJcGFyZW5zX2JhbGFuY2VkLS07Ci0JICAgIH0KLQkgIHdoaWxlIChwYXJlbnNfYmFsYW5jZWQpOwotCi0JICB0ZW1wX3N0cmluZyA9IGJhc2Vfc3RyaW5nOwotCi0JICAvKiBTa2lwIHBhc3QgJygnIGFuZCB3aGl0ZXNwYWNlLiAgKi8KLQkgICsrYmFzZV9zdHJpbmc7Ci0JICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkgICAgKytiYXNlX3N0cmluZzsKLQotCSAgaWYgKCpiYXNlX3N0cmluZyA9PSAnLCcKLQkgICAgICB8fCAoKCpiYXNlX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVggfHwgYWxsb3dfbmFrZWRfcmVnKQotCQkgICYmIChpLmJhc2VfcmVnID0gcGFyc2VfcmVnaXN0ZXIgKGJhc2Vfc3RyaW5nLCAmZW5kX29wKSkgIT0gTlVMTCkpCi0JICAgIHsKLQkgICAgICBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCA9IHRlbXBfc3RyaW5nOwotCi0JICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEJhc2VJbmRleDsKLQotCSAgICAgIGlmIChpLmJhc2VfcmVnKQotCQl7Ci0JCSAgYmFzZV9zdHJpbmcgPSBlbmRfb3A7Ci0JCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSAgICArK2Jhc2Vfc3RyaW5nOwotCQl9Ci0KLQkgICAgICAvKiBUaGVyZSBtYXkgYmUgYW4gaW5kZXggcmVnIG9yIHNjYWxlIGZhY3RvciBoZXJlLiAgKi8KLQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09ICcsJykKLQkJewotCQkgICsrYmFzZV9zdHJpbmc7Ci0JCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCSAgICArK2Jhc2Vfc3RyaW5nOwotCi0JCSAgaWYgKCgqYmFzZV9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYIHx8IGFsbG93X25ha2VkX3JlZykKLQkJICAgICAgJiYgKGkuaW5kZXhfcmVnID0gcGFyc2VfcmVnaXN0ZXIgKGJhc2Vfc3RyaW5nLCAmZW5kX29wKSkgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgYmFzZV9zdHJpbmcgPSBlbmRfb3A7Ci0JCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCQkJKytiYXNlX3N0cmluZzsKLQkJICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSAnLCcpCi0JCQl7Ci0JCQkgICsrYmFzZV9zdHJpbmc7Ci0JCQkgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCQkJICAgICsrYmFzZV9zdHJpbmc7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKCpiYXNlX3N0cmluZyAhPSAnKScgKQotCQkJewotCQkJICBhc19iYWQgKF8oImV4cGVjdGluZyBgLCcgb3IgYCknIGFmdGVyIGluZGV4IHJlZ2lzdGVyIGluIGAlcyciKSwKLQkJCQkgIG9wZXJhbmRfc3RyaW5nKTsKLQkJCSAgcmV0dXJuIDA7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmJhc2Vfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbmFtZSBgJXMnIiksIGJhc2Vfc3RyaW5nKTsKLQkJICAgICAgcmV0dXJuIDA7Ci0JCSAgICB9Ci0KLQkJICAvKiBDaGVjayBmb3Igc2NhbGUgZmFjdG9yLiAqLwotCQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmJhc2Vfc3RyaW5nKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCFpMzg2X3NjYWxlIChiYXNlX3N0cmluZykpCi0JCQlyZXR1cm4gMDsKLQotCQkgICAgICArK2Jhc2Vfc3RyaW5nOwotCQkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkJCSsrYmFzZV9zdHJpbmc7Ci0JCSAgICAgIGlmICgqYmFzZV9zdHJpbmcgIT0gJyknKQotCQkJewotCQkJICBhc19iYWQgKF8oImV4cGVjdGluZyBgKScgYWZ0ZXIgc2NhbGUgZmFjdG9yIGluIGAlcyciKSwKLQkJCQkgIG9wZXJhbmRfc3RyaW5nKTsKLQkJCSAgcmV0dXJuIDA7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIWkuaW5kZXhfcmVnKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBpbmRleCByZWdpc3RlciBvciBzY2FsZSBmYWN0b3IgYWZ0ZXIgYCwnOyBnb3QgJyVjJyIpLAotCQkJICAgICAgKmJhc2Vfc3RyaW5nKTsKLQkJICAgICAgcmV0dXJuIDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgqYmFzZV9zdHJpbmcgIT0gJyknKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJleHBlY3RpbmcgYCwnIG9yIGApJyBhZnRlciBiYXNlIHJlZ2lzdGVyIGluIGAlcyciKSwKLQkJCSAgb3BlcmFuZF9zdHJpbmcpOwotCQkgIHJldHVybiAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpiYXNlX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCByZWdpc3RlciBuYW1lIGAlcyciKSwgYmFzZV9zdHJpbmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB0aGVyZSdzIGFuIGV4cHJlc3Npb24gYmVnaW5uaW5nIHRoZSBvcGVyYW5kLCBwYXJzZSBpdCwKLQkgYXNzdW1pbmcgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCBhbmQKLQkgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgYXJlIG1lYW5pbmdmdWwuICAqLwotICAgICAgaWYgKGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQgIT0gZGlzcGxhY2VtZW50X3N0cmluZ19lbmQpCi0JewotCSAgaWYgKCFpMzg2X2Rpc3BsYWNlbWVudCAoZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCwKLQkJCQkgIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kKSkKLQkgICAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yICglZHgpIHdoaWxlIGRvaW5nIGlucHV0L291dHB1dCBvcC4gICovCi0gICAgICBpZiAoaS5iYXNlX3JlZwotCSAgJiYgaS5iYXNlX3JlZy0+cmVnX3R5cGUgPT0gKFJlZzE2IHwgSW5PdXRQb3J0UmVnKQotCSAgJiYgaS5pbmRleF9yZWcgPT0gMAotCSAgJiYgaS5sb2cyX3NjYWxlX2ZhY3RvciA9PSAwCi0JICAmJiBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPT0gMAotCSAgJiYgKGkudHlwZXNbdGhpc19vcGVyYW5kXSAmIERpc3ApID09IDApCi0JewotCSAgaS50eXBlc1t0aGlzX29wZXJhbmRdID0gSW5PdXRQb3J0UmVnOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICBpZiAoaTM4Nl9pbmRleF9jaGVjayAob3BlcmFuZF9zdHJpbmcpID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBpLm1lbV9vcGVyYW5kcysrOwotICAgIH0KLSAgZWxzZQotICAgIHsJCQkJLyogaXQncyBub3QgYSBtZW1vcnkgb3BlcmFuZDsgYXJnaCEgKi8KLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBjaGFyICVzIGJlZ2lubmluZyBvcGVyYW5kICVkIGAlcyciKSwKLQkgICAgICBvdXRwdXRfaW52YWxpZCAoKm9wX3N0cmluZyksCi0JICAgICAgdGhpc19vcGVyYW5kICsgMSwKLQkgICAgICBvcF9zdHJpbmcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsJCQkvKiBub3JtYWwgcmV0dXJuICovCi19Ci0MCi0vKgotICogbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKQotICoKLSAqIENhbGxlZCBqdXN0IGJlZm9yZSByZWxheCgpLgotICogQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCi0gKiBSZXR1cm4gdGhlIGNvcnJlY3QgZnJfc3VidHlwZSBpbiB0aGUgZnJhZy4KLSAqIFJldHVybiB0aGUgaW5pdGlhbCAiZ3Vlc3MgZm9yIGZyX3ZhciIgdG8gY2FsbGVyLgotICogVGhlIGd1ZXNzIGZvciBmcl92YXIgaXMgQUNUVUFMTFkgdGhlIGdyb3d0aCBiZXlvbmQgZnJfZml4LgotICogV2hhdGV2ZXIgd2UgZG8gdG8gZ3JvdyBmcl9maXggb3IgZnJfdmFyIGNvbnRyaWJ1dGVzIHRvIG91ciByZXR1cm5lZCB2YWx1ZS4KLSAqIEFsdGhvdWdoIGl0IG1heSBub3QgYmUgZXhwbGljaXQgaW4gdGhlIGZyYWcsIHByZXRlbmQgZnJfdmFyIHN0YXJ0cyB3aXRoIGEKLSAqIDAgdmFsdWUuCi0gKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3Bjb2RlOwotICByZWdpc3RlciBpbnQgb2xkX2ZyX2ZpeDsKLQotICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgb3Bjb2RlID0gKHVuc2lnbmVkIGNoYXIgKikgZnJhZ1AtPmZyX29wY29kZTsKLSAgLyogV2UndmUgYWxyZWFkeSBnb3QgZnJhZ1AtPmZyX3N1YnR5cGUgcmlnaHQ7ICBhbGwgd2UgaGF2ZSB0byBkbyBpcwotICAgICBjaGVjayBmb3IgdW4tcmVsYXhhYmxlIHN5bWJvbHMuICAqLwotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKLSAgICB7Ci0gICAgICAvKiBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgc2VnbWVudCAqLwotICAgICAgaW50IGNvZGUxNiA9IGZyYWdQLT5mcl9zdWJ0eXBlICYgQ09ERTE2OwotICAgICAgaW50IHNpemUgPSBjb2RlMTYgPyAyIDogNDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgcmVsb2NfdHlwZTsKLSNlbHNlCi0gICAgICBpbnQgcmVsb2NfdHlwZTsKLSNlbmRpZgotCi0gICAgICBpZiAoR09UX3N5bWJvbCAvKiBOb3QgcXVpdGUgcmlnaHQgLSB3ZSBzaG91bGQgc3dpdGNoIG9uIHByZXNlbmNlIG9mCi0JCQlAUExULCBidXQgSSBjYW5ub3Qgc2VlIGhvdyB0byBnZXQgdG8gdGhhdCBmcm9tCi0JCQloZXJlLiAgV2Ugc2hvdWxkIGhhdmUgZG9uZSB0aGlzIGluIG1kX2Fzc2VtYmxlIHRvCi0JCQlyZWFsbHkgZ2V0IGl0IHJpZ2h0IGFsbCBvZiB0aGUgdGltZSwgYnV0IEkgdGhpbmsgaXQKLQkJCWRvZXMgbm90IG1hdHRlciB0aGF0IG11Y2gsIGFzIHRoaXMgd2lsbCBiZSByaWdodAotCQkJbW9zdCBvZiB0aGUgdGltZS4gRVJZICAqLwotCSAgJiYgU19HRVRfU0VHTUVOVChmcmFnUC0+ZnJfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQlyZWxvY190eXBlID0gQkZEX1JFTE9DXzM4Nl9QTFQzMjsKLSAgICAgIGVsc2UgaWYgKGNvZGUxNikKLQlyZWxvY190eXBlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotICAgICAgZWxzZQotCXJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlWzBdKQotCXsKLQljYXNlIEpVTVBfUENfUkVMQVRJVkU6CS8qIG1ha2Ugam1wICgweGViKSBhIGR3b3JkIGRpc3BsYWNlbWVudCBqdW1wICovCi0JICBvcGNvZGVbMF0gPSAweGU5OwkvKiBkd29yZCBkaXNwIGptcCAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSBzaXplOwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXgsIHNpemUsCi0JCSAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsCi0JCSAgIHJlbG9jX3R5cGUpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgLyogVGhpcyBjaGFuZ2VzIHRoZSBieXRlLWRpc3BsYWNlbWVudCBqdW1wIDB4N04KLQkgICAgIHRvIHRoZSBkd29yZC1kaXNwbGFjZW1lbnQganVtcCAweDBmLDB4OE4uICAqLwotCSAgb3Bjb2RlWzFdID0gb3Bjb2RlWzBdICsgMHgxMDsKLQkgIG9wY29kZVswXSA9IFRXT19CWVRFX09QQ09ERV9FU0NBUEU7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyBzaXplOwkvKiB3ZSd2ZSBhZGRlZCBhbiBvcGNvZGUgYnl0ZSAqLwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCBzaXplLAotCQkgICBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLAotCQkgICByZWxvY190eXBlKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotICAgIH0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0MCi0vKgotICoJCQltZF9jb252ZXJ0X2ZyYWcoKTsKLSAqCi0gKiBDYWxsZWQgYWZ0ZXIgcmVsYXgoKSBpcyBmaW5pc2hlZC4KLSAqIEluOglBZGRyZXNzIG9mIGZyYWcuCi0gKglmcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICoJZnJfc3VidHlwZSBpcyB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uCi0gKgotICogT3V0OglBbnkgZml4U3MgYW5kIGNvbnN0YW50cyBhcmUgc2V0IHVwLgotICoJQ2FsbGVyIHdpbGwgdHVybiBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICovCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VjLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VnVCBzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotI2Vsc2UKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlZ1Qgc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpvcGNvZGU7Ci0gIHVuc2lnbmVkIGNoYXIgKndoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCBvcGNvZGVfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbiA9IDA7Ci0gIGludCBkaXNwbGFjZW1lbnRfZnJvbV9vcGNvZGVfc3RhcnQ7Ci0KLSAgb3Bjb2RlID0gKHVuc2lnbmVkIGNoYXIgKikgZnJhZ1AtPmZyX29wY29kZTsKLQotICAvKiBBZGRyZXNzIHdlIHdhbnQgdG8gcmVhY2ggaW4gZmlsZSBzcGFjZS4gKi8KLSAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotI2lmZGVmIEJGRF9BU1NFTUJMRVIgLyogbm90IG5lZWRlZCBvdGhlcndpc2U/ICovCi0gIHRhcmdldF9hZGRyZXNzICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLQotICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICovCi0gIG9wY29kZV9hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4OwotCi0gIC8qIERpc3BsYWNlbWVudCBmcm9tIG9wY29kZSBzdGFydCB0byBmaWxsIGludG8gaW5zdHJ1Y3Rpb24uICovCi0gIGRpc3BsYWNlbWVudF9mcm9tX29wY29kZV9zdGFydCA9IHRhcmdldF9hZGRyZXNzIC0gb3Bjb2RlX2FkZHJlc3M7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgU01BTEwpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIFNNQUxMMTYpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwpOgotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwxNik6Ci0gICAgICAvKiBkb24ndCBoYXZlIHRvIGNoYW5nZSBvcGNvZGUgKi8KLSAgICAgIGV4dGVuc2lvbiA9IDE7CQkvKiAxIG9wY29kZSArIDEgZGlzcGxhY2VtZW50ICovCi0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHKToKLSAgICAgIGV4dGVuc2lvbiA9IDU7CQkvKiAyIG9wY29kZSArIDQgZGlzcGxhY2VtZW50ICovCi0gICAgICBvcGNvZGVbMV0gPSBvcGNvZGVbMF0gKyAweDEwOwotICAgICAgb3Bjb2RlWzBdID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzJdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIEJJRyk6Ci0gICAgICBleHRlbnNpb24gPSA0OwkJLyogMSBvcGNvZGUgKyA0IGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzBdID0gMHhlOTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBCSUcxNik6Ci0gICAgICBleHRlbnNpb24gPSAzOwkJLyogMiBvcGNvZGUgKyAyIGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzFdID0gb3Bjb2RlWzBdICsgMHgxMDsKLSAgICAgIG9wY29kZVswXSA9IFRXT19CWVRFX09QQ09ERV9FU0NBUEU7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsyXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcxNik6Ci0gICAgICBleHRlbnNpb24gPSAyOwkJLyogMSBvcGNvZGUgKyAyIGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzBdID0gMHhlOTsKLSAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgLyogbm93IHB1dCBkaXNwbGFjZW1lbnQgYWZ0ZXIgb3Bjb2RlICovCi0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCwKLQkJICAgICAgKHZhbHVlVCkgKGRpc3BsYWNlbWVudF9mcm9tX29wY29kZV9zdGFydCAtIGV4dGVuc2lvbiksCi0JCSAgICAgIFNJWkVfRlJPTV9SRUxBWF9TVEFURSAoZnJhZ1AtPmZyX3N1YnR5cGUpKTsKLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19Ci0MCi0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAyOwkvKiBzaXplIG9mIGJ5dGUgZGlzcGxhY2VtZW50IGptcCAqLwotaW50IG1kX2xvbmdfanVtcF9zaXplID0gNTsJLyogc2l6ZSBvZiBkd29yZCBkaXNwbGFjZW1lbnQgam1wICovCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzeW1ib2xTICp0b19zeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbG9uZyBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAyKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4ZWIsIDEpOwkvKiBvcGNvZGUgZm9yIGJ5dGUtZGlzcCBqdW1wICovCi0gIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCAxKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIGxvbmcgb2Zmc2V0OwotCi0gIGlmIChmbGFnX2RvX2xvbmdfanVtcCkKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gU19HRVRfVkFMVUUgKHRvX3N5bWJvbCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHhlOSwgMSk7Lyogb3Bjb2RlIGZvciBsb25nIGptcCAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgICAgZml4X25ldyAoZnJhZywgKHB0ciArIDEpIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwKLQkgICAgICAgdG9fc3ltYm9sLCAob2Zmc2V0VCkgMCwgMCwgQkZEX1JFTE9DXzMyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4ZTksIDEpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgIH0KLX0KLQwKLS8qIEFwcGx5IGEgZml4dXAgKGZpeFMpIHRvIHNlZ21lbnQgZGF0YSwgb25jZSBpdCBoYXMgYmVlbiBkZXRlcm1pbmVkCi0gICBieSBvdXIgY2FsbGVyIHRoYXQgd2UgaGF2ZSBhbGwgdGhlIGluZm8gd2UgbmVlZCB0byBmaXggaXQgdXAuCi0KLSAgIE9uIHRoZSAzODYsIGltbWVkaWF0ZXMsIGRpc3BsYWNlbWVudHMsIGFuZCBkYXRhIHBvaW50ZXJzIGFyZSBhbGwgaW4KLSAgIHRoZSBzYW1lIChsaXR0bGUtZW5kaWFuKSBmb3JtYXQsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB3aGljaAotICAgd2UgYXJlIGhhbmRsaW5nLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWxwLCBzZWcpCi0gICAgIGZpeFMgKmZpeFA7CQkvKiBUaGUgZml4IHdlJ3JlIHRvIHB1dCBpbi4gICovCi0gICAgIHZhbHVlVCAqdmFscDsJCS8qIFBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAgKi8KLSAgICAgc2VnVCBzZWcgQVRUUklCVVRFX1VOVVNFRDsJLyogU2VnbWVudCBmaXggaXMgZnJvbS4gICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnAgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIHZhbHVlVCB2YWx1ZSA9ICp2YWxwOwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKFRFX01hY2gpCi0gIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIGhhY2suICBUaGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLgotICAgICBUaGlzIGNvdmVycyBmb3IgdGhlIGZhY3QgdGhhdCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdpbGwKLSAgICAgc3VidHJhY3QgdGhlIGN1cnJlbnQgbG9jYXRpb24gKGZvciBwYXJ0aWFsX2lucGxhY2UsIFBDIHJlbGF0aXZlCi0gICAgIHJlbG9jYXRpb25zKTsgc2VlIG1vcmUgYmVsb3cuICAqLwotICBpZiAoKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUwKLSAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMCi0gICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184X1BDUkVMKQotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgewotI2lmbmRlZiBPQkpfQU9VVAotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotI2lmZGVmIFRFX1BFCi0JICB8fCBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0jZW5kaWYKLQkgICkKLQl2YWx1ZSArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBzZWdUIGZzZWcgPSBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSk7Ci0KLQkgIGlmICgoZnNlZyA9PSBzZWcKLQkgICAgICAgfHwgKHN5bWJvbF9zZWN0aW9uX3AgKGZpeFAtPmZ4X2FkZHN5KQotCQkgICAmJiBmc2VnICE9IGFic29sdXRlX3NlY3Rpb24pKQotCSAgICAgICYmICEgU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCi0JICAgICAgJiYgISBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAgICAgJiYgISBTX0lTX0NPTU1PTiAoZml4UC0+ZnhfYWRkc3kpKQotCSAgICB7Ci0JICAgICAgLyogWWVzLCB3ZSBhZGQgdGhlIHZhbHVlcyBpbiB0d2ljZS4gIFRoaXMgaXMgYmVjYXVzZQotCQkgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBzdWJ0cmFjdHMgdGhlbSBvdXQgYWdhaW4uICBJIHRoaW5rCi0JCSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIGJyb2tlbiwgYnV0IEkgZG9uJ3QgZGFyZSBjaGFuZ2UKLQkJIGl0LiAgRklYTUUuICAqLwotCSAgICAgIHZhbHVlICs9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLQkgICAgfQotCX0KLSNlbmRpZgotI2lmIGRlZmluZWQgKE9CSl9DT0ZGKSAmJiBkZWZpbmVkIChURV9QRSkKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFBFIGZvcm1hdCBkb2VzIG5vdCBzdG9yZSBhIHNlY3Rpb24KLQkgYWRkcmVzcyBvZmZzZXQgZm9yIGEgUEMgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnKQotCXZhbHVlICs9IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotICAgICAgZWxzZSBpZiAoU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCi0JICAgICAgIHx8IFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGFuIGV4dGVybmFsIHJlbG9jYXRpb24gZm9yIHRoaXMgZGVmaW5lZAotICAgICAgICAgICAgIHN5bWJvbC4gIFdlIGFkZCB0aGUgYWRkcmVzcywgYmVjYXVzZQotICAgICAgICAgICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd2lsbCBzdWJ0cmFjdCBpdC4gIFZBTFVFIGFscmVhZHkKLSAgICAgICAgICAgICBob2xkcyB0aGUgc3ltYm9sIHZhbHVlLCBiZWNhdXNlIGZpeHVwX3NlZ21lbnQgYWRkZWQgaXQKLSAgICAgICAgICAgICBpbi4gIFdlIHN1YnRyYWN0IGl0IG91dCwgYW5kIHRoZW4gd2Ugc3VidHJhY3QgaXQgb3V0Ci0gICAgICAgICAgICAgYWdhaW4gYmVjYXVzZSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdpbGwgYWRkIGl0IGluCi0gICAgICAgICAgICAgYWdhaW4uICAqLwotCSAgdmFsdWUgKz0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0JICB2YWx1ZSAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0jaWZkZWYgVEVfUEUKLSAgZWxzZSBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAgJiYgKFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkpCi0gICAgewotICAgICAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYW4gZXh0ZXJuYWwgcmVsb2NhdGlvbiBmb3IgdGhpcyBkZWZpbmVkCi0gICAgICAgICBzeW1ib2wuICBWQUxVRSBhbHJlYWR5IGhvbGRzIHRoZSBzeW1ib2wgdmFsdWUsIGFuZAotICAgICAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGFkZCBpdCBpbiBhZ2Fpbi4gIFdlIGRvbid0IHdhbnQKLSAgICAgICAgIGVpdGhlciBhZGRpdGlvbi4gICovCi0gICAgICB2YWx1ZSAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBGaXggYSBmZXcgdGhpbmdzIC0gdGhlIGR5bmFtaWMgbGlua2VyIGV4cGVjdHMgY2VydGFpbiB2YWx1ZXMgaGVyZSwKLSAgICAgYW5kIHdlIG11c3Qgbm90IGRpc3NhcHBvaW50IGl0LiAqLwotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKSB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X1BMVDMyOgotICAgICAgLyogTWFrZSB0aGUganVtcCBpbnN0cnVjdGlvbiBwb2ludCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb3BlcmFuZC4gIEF0Ci0JIHJ1bnRpbWUgd2UgbWVyZWx5IGFkZCB0aGUgb2Zmc2V0IHRvIHRoZSBhY3R1YWwgUExUIGVudHJ5LiAqLwotICAgICAgdmFsdWUgPSAweGZmZmZmZmZjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVFBDOgotLyoKLSAqICAgVGhpcyBpcyB0b3VnaCB0byBleHBsYWluLiAgV2UgZW5kIHVwIHdpdGggdGhpcyBvbmUgaWYgd2UgaGF2ZQotICogb3BlcmFuZHMgdGhhdCBsb29rIGxpa2UgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDI4NF0iLiAgVGhlIGdvYWwKLSAqIGhlcmUgaXMgdG8gb2J0YWluIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIHRoZSBHT1QsIGFuZCBpdCBpcyBzdHJvbmdseQotICogcHJlZmVyYWJsZSBmcm9tIGEgcGVyZm9ybWFuY2UgcG9pbnQgb2YgdmlldyB0byBhdm9pZCB1c2luZyBhIHJ1bnRpbWUKLSAqIHJlbG9jYXRpb24gZm9yIHRoaXMuICBUaGUgYWN0dWFsIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyBvZnRlbiBsb29rCi0gKiBzb21ldGhpbmcgbGlrZToKLSAqCi0gKgljYWxsCS5MNjYKLSAqIC5MNjY6Ci0gKglwb3BsCSVlYngKLSAqCWFkZGwJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDY2XSwlZWJ4Ci0gKgotICogICBUaGUgY2FsbCBhbmQgcG9wIGVzc2VudGlhbGx5IHJldHVybiB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZgotICogdGhlIGxhYmVsIC5MNjYgYW5kIHN0b3JlIGl0IGluICVlYnguICBUaGUgbGlua2VyIGl0c2VsZiB3aWxsCi0gKiB1bHRpbWF0ZWx5IGNoYW5nZSB0aGUgZmlyc3Qgb3BlcmFuZCBvZiB0aGUgYWRkbCBzbyB0aGF0ICVlYnggcG9pbnRzIHRvCi0gKiB0aGUgR09ULCBidXQgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCB0aGUgLm8gZmlsZSBtdXN0IGhhdmUgdGhpcyBvcGVyYW5kCi0gKiBzZXQgc28gdGhhdCBpdCBnZW5lcmF0ZXMgbm90IHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIC5MNjYsIGJ1dCB0aGUKLSAqIGFic29sdXRlIGFkZHJlc3Mgb2YgaXRzZWxmLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciBpdHNlbGYgc2ltcGx5Ci0gKiB0cmVhdCBhIEdPVFBDIHJlbG9jYXRpb24gYXMgYXNraW5nIGZvciBhIHBjcmVsIG9mZnNldCB0byB0aGUgR09UIHRvIGJlCi0gKiBhZGRlZCBpbiwgYW5kIHRoZSBhZGRlbmQgb2YgdGhlIHJlbG9jYXRpb24gaXMgc3RvcmVkIGluIHRoZSBvcGVyYW5kCi0gKiBmaWVsZCBmb3IgdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KLSAqCi0gKiAgIE91ciBqb2IgaGVyZSBpcyB0byBmaXggdGhlIG9wZXJhbmQgc28gdGhhdCBpdCB3b3VsZCBhZGQgdGhlIGNvcnJlY3QKLSAqIG9mZnNldCBzbyB0aGF0ICVlYnggd291bGQgcG9pbnQgdG8gaXRzZWxmLiAgVGhlIHRoaW5nIHRoYXQgaXMgdHJpY2t5IGlzCi0gKiB0aGF0IC4tLkw2NiB3aWxsIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB3ZSBuZWVkCi0gKiB0byBmdXJ0aGVyIG1vZGlmeSB0aGUgb3BlcmFuZCBzbyB0aGF0IGl0IHdpbGwgcG9pbnQgdG8gaXRzZWxmLgotICogVGhlcmUgYXJlIG90aGVyIGNhc2VzIHdoZXJlIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgotICoKLSAqCS5sb25nCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkw2Nl0KLSAqCi0gKiBhbmQgaGVyZSBubyBjb3JyZWN0aW9uIHdvdWxkIGJlIHJlcXVpcmVkLiAgSW50ZXJuYWxseSBpbiB0aGUgYXNzZW1ibGVyCi0gKiB3ZSB0cmVhdCBvcGVyYW5kcyBvZiB0aGlzIGZvcm0gYXMgbm90IGJlaW5nIHBjcmVsIHNpbmNlIHRoZSAnLicgaXMKLSAqIGV4cGxpY2l0bHkgbWVudGlvbmVkLCBhbmQgSSB3b25kZXIgd2hldGhlciBpdCB3b3VsZCBzaW1wbGlmeSBtYXR0ZXJzCi0gKiB0byBkbyBpdCB0aGlzIHdheS4gIFdobyBrbm93cy4gIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIFBJQyBwYXRjaGVzLAotICogdGhlIHBjcmVsX2FkanVzdCBmaWVsZCB3YXMgdXNlZCB0byBzdG9yZSB0aGUgY29ycmVjdGlvbiwgYnV0IHNpbmNlIHRoZQotICogZXhwcmVzc2lvbiBpcyBub3QgcGNyZWwsIEkgZmVsdCBpdCB3b3VsZCBiZSBjb25mdXNpbmcgdG8gZG8gaXQgdGhpcyB3YXkuCi0gKi8KLSAgICAgIHZhbHVlIC09IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6Ci0gICAgICB2YWx1ZSA9IDA7IC8qIEZ1bGx5IHJlc29sdmVkIGF0IHJ1bnRpbWUuICBObyBhZGRlbmQuICAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikgKi8KLSAgKnZhbHAgPSB2YWx1ZTsKLSNlbmRpZiAvKiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhZGVmaW5lZCAoVEVfTWFjaCkgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB2YWx1ZSwgZml4UC0+Znhfc2l6ZSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiAwCi0vKiBUaGlzIGlzIG5ldmVyIHVzZWQuICAqLwotbG9uZwkJCQkvKiBLbm93cyBhYm91dCB0aGUgYnl0ZSBvcmRlciBpbiBhIHdvcmQuICovCi1tZF9jaGFyc190b19udW1iZXIgKGNvbiwgbmJ5dGVzKQotICAgICB1bnNpZ25lZCBjaGFyIGNvbltdOwkvKiBMb3cgb3JkZXIgYnl0ZSAxc3QuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGlucHV0LiAqLwotewotICBsb25nIHJldHZhbDsKLSAgZm9yIChyZXR2YWwgPSAwLCBjb24gKz0gbmJ5dGVzIC0gMTsgbmJ5dGVzLS07IGNvbi0tKQotICAgIHsKLSAgICAgIHJldHZhbCA8PD0gQklUU19QRVJfQ0hBUjsKLSAgICAgIHJldHZhbCB8PSAqY29uOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZiAvKiAwICovCi0MCi0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBsaXRQIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgZW1pdCB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMgZW1pdHRlZAotICAgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mICgpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIC8qIFRoaXMgbG9vcHMgb3V0cHV0cyB0aGUgTElUVExFTlVNcyBpbiBSRVZFUlNFIG9yZGVyOyBpbiBhY2NvcmQgd2l0aAotICAgICB0aGUgYmlnZW5kaWFuIDM4Ni4gICovCi0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWMgLSAxOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUC0tKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotDAotY2hhciBvdXRwdXRfaW52YWxpZF9idWZbOF07Ci0KLXN0YXRpYyBjaGFyICogb3V0cHV0X2ludmFsaWQgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBjaGFyICoKLW91dHB1dF9pbnZhbGlkIChjKQotICAgICBpbnQgYzsKLXsKLSAgaWYgKGlzcHJpbnQgKGMpKQotICAgIHNwcmludGYgKG91dHB1dF9pbnZhbGlkX2J1ZiwgIiclYyciLCBjKTsKLSAgZWxzZQotICAgIHNwcmludGYgKG91dHB1dF9pbnZhbGlkX2J1ZiwgIigweCV4KSIsICh1bnNpZ25lZCkgYyk7Ci0gIHJldHVybiBvdXRwdXRfaW52YWxpZF9idWY7Ci19Ci0KLQotLyogUkVHX1NUUklORyBzdGFydHMgKmJlZm9yZSogUkVHSVNURVJfUFJFRklYLiAgKi8KLQotc3RhdGljIGNvbnN0IHJlZ19lbnRyeSAqCi1wYXJzZV9yZWdpc3RlciAocmVnX3N0cmluZywgZW5kX29wKQotICAgICBjaGFyICpyZWdfc3RyaW5nOwotICAgICBjaGFyICoqZW5kX29wOwotewotICBjaGFyICpzID0gcmVnX3N0cmluZzsKLSAgY2hhciAqcDsKLSAgY2hhciByZWdfbmFtZV9naXZlbltNQVhfUkVHX05BTUVfU0laRSArIDFdOwotICBjb25zdCByZWdfZW50cnkgKnI7Ci0KLSAgLyogU2tpcCBwb3NzaWJsZSBSRUdJU1RFUl9QUkVGSVggYW5kIHBvc3NpYmxlIHdoaXRlc3BhY2UuICAqLwotICBpZiAoKnMgPT0gUkVHSVNURVJfUFJFRklYKQotICAgICsrczsKLQotICBpZiAoaXNfc3BhY2VfY2hhciAoKnMpKQotICAgICsrczsKLQotICBwID0gcmVnX25hbWVfZ2l2ZW47Ci0gIHdoaWxlICgoKnArKyA9IHJlZ2lzdGVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqc10pICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKHAgPj0gcmVnX25hbWVfZ2l2ZW4gKyBNQVhfUkVHX05BTUVfU0laRSkKLQlyZXR1cm4gKGNvbnN0IHJlZ19lbnRyeSAqKSBOVUxMOwotICAgICAgcysrOwotICAgIH0KLQotICAqZW5kX29wID0gczsKLQotICByID0gKGNvbnN0IHJlZ19lbnRyeSAqKSBoYXNoX2ZpbmQgKHJlZ19oYXNoLCByZWdfbmFtZV9naXZlbik7Ci0KLSAgLyogSGFuZGxlIGZsb2F0aW5nIHBvaW50IHJlZ3MsIGFsbG93aW5nIHNwYWNlcyBpbiB0aGUgKGkpIHBhcnQuICAqLwotICBpZiAociA9PSBpMzg2X3JlZ3RhYiAvKiAlc3QgaXMgZmlyc3QgZW50cnkgb2YgdGFibGUgKi8pCi0gICAgewotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpzKSkKLQkrK3M7Ci0gICAgICBpZiAoKnMgPT0gJygnKQotCXsKLQkgICsrczsKLQkgIGlmIChpc19zcGFjZV9jaGFyICgqcykpCi0JICAgICsrczsKLQkgIGlmICgqcyA+PSAnMCcgJiYgKnMgPD0gJzcnKQotCSAgICB7Ci0JICAgICAgciA9ICZpMzg2X2Zsb2F0X3JlZ3RhYlsqcyAtICcwJ107Ci0JICAgICAgKytzOwotCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqcykpCi0JCSsrczsKLQkgICAgICBpZiAoKnMgPT0gJyknKQotCQl7Ci0JCSAgKmVuZF9vcCA9IHMgKyAxOwotCQkgIHJldHVybiByOwotCQl9Ci0JICAgIH0KLQkgIC8qIFdlIGhhdmUgIiVzdCgiIHRoZW4gZ2FyYmFnZSAqLwotCSAgcmV0dXJuIChjb25zdCByZWdfZW50cnkgKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotDAotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAia21WUTpzcSI7Ci0jZWxzZQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIm0iOwotI2VuZGlmCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICBmbGFnX2RvX2xvbmdfanVtcCA9IDE7Ci0gICAgICBicmVhazsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gICAgICAvKiAtazogSWdub3JlIGZvciBGcmVlQlNEIGNvbXBhdGliaWxpdHkuICAqLwotICAgIGNhc2UgJ2snOgotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KLQkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgLyogLXM6IE9uIGkzODYgU29sYXJpcywgdGhpcyB0ZWxscyB0aGUgbmF0aXZlIGFzc2VtYmxlciB0byB1c2UKLSAgICAgICAgIC5zdGFiIGluc3RlYWQgb2YgLnN0YWIuZXhjbC4gIFdlIGFsd2F5cyB1c2UgLnN0YWIgYW55aG93LiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncSc6Ci0gICAgICAvKiAtcTogT24gaTM4NiBTb2xhcmlzLCB0aGlzIHRlbGxzIHRoZSBuYXRpdmUgYXNzZW1ibGVyIGRvZXMKLSAgICAgICAgIGZld2VyIGNoZWNrcy4gICovCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLW0JCQkgIGRvIGxvbmcganVtcFxuIikpOwotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtVgkJCSAgcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG5cCi0gIC1rCQkJICBpZ25vcmVkXG5cCi0gIC1ReSwgLVFuCQkgIGlnbm9yZWRcblwKLSAgLXEJCQkgIGlnbm9yZWRcblwKLSAgLXMJCQkgIGlnbm9yZWRcbiIpKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmICgoZGVmaW5lZCAoT0JKX01BWUJFX0VMRikgJiYgZGVmaW5lZCAoT0JKX01BWUJFX0NPRkYpKSBcCi0gICAgIHx8IChkZWZpbmVkIChPQkpfTUFZQkVfRUxGKSAmJiBkZWZpbmVkIChPQkpfTUFZQkVfQU9VVCkpIFwKLSAgICAgfHwgKGRlZmluZWQgKE9CSl9NQVlCRV9DT0ZGKSAmJiBkZWZpbmVkIChPQkpfTUFZQkVfQU9VVCkpKQotCi0vKiBQaWNrIHRoZSB0YXJnZXQgZm9ybWF0IHRvIHVzZS4gICovCi0KLWNvbnN0IGNoYXIgICoKLWkzODZfdGFyZ2V0X2Zvcm1hdCAoKQotewotICBzd2l0Y2ggKE9VVFBVVF9GTEFWT1IpCi0gICAgewotI2lmZGVmIE9CSl9NQVlCRV9BT1VUCi0gICAgY2FzZSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cjoKLSAgICAgcmV0dXJuIEFPVVRfVEFSR0VUX0ZPUk1BVDsKLSNlbmRpZgotI2lmZGVmIE9CSl9NQVlCRV9DT0ZGCi0gICAgY2FzZSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cjoKLSAgICAgIHJldHVybiAiY29mZi1pMzg2IjsKLSNlbmRpZgotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLSAgICBjYXNlIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gImVsZjMyLWkzODYiOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogT0JKX01BWUJFXyBtb3JlIHRoYW4gb25lICovCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotDAotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUVbMF0KLSAgICAgICYmIG5hbWVbMV0gPT0gR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FWzFdCi0gICAgICAmJiBuYW1lWzJdID09IEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRVsyXQotICAgICAgJiYgc3RyY21wIChuYW1lLCBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpID09IDApCi0gICAgewotICAgICAgaWYgKCFHT1Rfc3ltYm9sKQotCXsKLQkgIGlmIChzeW1ib2xfZmluZCAobmFtZSkpCi0JICAgIGFzX2JhZCAoXygiR09UIGFscmVhZHkgaW4gc3ltYm9sIHRhYmxlIikpOwotCSAgR09UX3N5bWJvbCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLAotCQkJCSAgICh2YWx1ZVQpIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JfTsKLSAgICAgIHJldHVybiBHT1Rfc3ltYm9sOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfQU9VVCkpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotICAgIHsKLSAgICAgIC8qIEZvciBhLm91dCwgZm9yY2UgdGhlIHNlY3Rpb24gc2l6ZSB0byBiZSBhbGlnbmVkLiAgSWYgd2UgZG9uJ3QgZG8KLQkgdGhpcywgQkZEIHdpbGwgYWxpZ24gaXQgZm9yIHVzLCBidXQgaXQgd2lsbCBub3Qgd3JpdGUgb3V0IHRoZQotCSBmaW5hbCBieXRlcyBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgbWF5IGJlIGEgYnVnIGluIEJGRCwgYnV0IGl0IGlzCi0JIGVhc2llciB0byBmaXggaXQgaGVyZSBzaW5jZSB0aGF0IGlzIGhvdyB0aGUgb3RoZXIgYS5vdXQgdGFyZ2V0cwotCSB3b3JrLiAgKi8KLSAgICAgIGludCBhbGlnbjsKLQotICAgICAgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICAgICAgc2l6ZSA9ICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKCh2YWx1ZVQpIC0xIDw8IGFsaWduKSk7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYKLQotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogT24gdGhlIGkzODYsIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgIG5leHQgaW5zdHJ1Y3Rpb24uICBUaGF0IGlzLCB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzIGl0cwotICAgc2l6ZSwgc2luY2UgdGhlIG9mZnNldCBpcyBhbHdheXMgdGhlIGxhc3QgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0jaWZuZGVmIEkzODZDT0ZGCi0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIChzdWJzZWdUKSB0ZW1wKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmCi0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotaTM4Nl92YWxpZGF0ZV9maXggKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9zdWJzeSAmJiBmaXhwLT5meF9zdWJzeSA9PSBHT1Rfc3ltYm9sKQotICAgIHsKLSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zODZfR09UT0ZGOwotICAgICAgZml4cC0+Znhfc3Vic3kgPSAwOwotICAgIH0KLX0KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UUEM6Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIHN3aXRjaCAoZml4cC0+Znhfc2l6ZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZCAoXygiY2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iKSwKLQkJICAgICAgZml4cC0+Znhfc2l6ZSk7Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOiBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7ICBicmVhazsKLQkgICAgY2FzZSAyOiBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOyBicmVhazsKLQkgICAgY2FzZSA0OiBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOyBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGZpeHAtPmZ4X3NpemUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19iYWQgKF8oImNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIiksIGZpeHAtPmZ4X3NpemUpOwotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTogY29kZSA9IEJGRF9SRUxPQ184OyAgYnJlYWs7Ci0JICAgIGNhc2UgMjogY29kZSA9IEJGRF9SRUxPQ18xNjsgYnJlYWs7Ci0JICAgIGNhc2UgNDogY29kZSA9IEJGRF9SRUxPQ18zMjsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DXzMyCi0gICAgICAmJiBHT1Rfc3ltYm9sCi0gICAgICAmJiBmaXhwLT5meF9hZGRzeSA9PSBHT1Rfc3ltYm9sKQotICAgIGNvZGUgPSBCRkRfUkVMT0NfMzg2X0dPVFBDOwotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLQotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIC8qIEhBQ0s6IFNpbmNlIGkzODYgRUxGIHVzZXMgUmVsIGluc3RlYWQgb2YgUmVsYSwgZW5jb2RlIHRoZQotICAgICB2dGFibGUgZW50cnkgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X29mZnNldDsKLQotICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgaWYgKHJlbC0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJjYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIC8qIFNldCBob3d0byB0byBhIGdhcmJhZ2UgdmFsdWUgc28gdGhhdCB3ZSBjYW4ga2VlcCBnb2luZy4gICovCi0gICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ18zMik7Ci0gICAgICBhc3NlcnQgKHJlbC0+aG93dG8gIT0gTlVMTCk7Ci0gICAgfQotCi0gIHJldHVybiByZWw7Ci19Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWYgKGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkpCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIC8qCi0gICAqIEluOiBsZW5ndGggb2YgcmVsb2NhdGlvbiAob3Igb2YgYWRkcmVzcykgaW4gY2hhcnM6IDEsIDIgb3IgNC4KLSAgICogT3V0OiBHTlUgTEQgcmVsb2NhdGlvbiBsZW5ndGggY29kZTogMCwgMSwgb3IgMi4KLSAgICovCi0KLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotCQkgICAgICAodmFsdWVUKSAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkJCSsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSksCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs2XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNF0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDMpICYgMHgwOCkKLQkgICAgICB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDEpICYgMHgwNikKLQkgICAgICB8ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDApICYgMHgwMSkgJiAweDBmKSk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCi0jaWYgZGVmaW5lZCAoSTM4NkNPRkYpCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0lNQUdFQkFTRSkKLSAgICByZXR1cm4gUl9JTUFHRUJBU0U7Ci0KLSAgcmV0dXJuIChmaXhQLT5meF9wY3JlbCA/Ci0JICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9QQ1JCWVRFIDoKLQkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1BDUldPUkQgOgotCSAgIFJfUENSTE9ORykgOgotCSAgKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUkVMQllURSA6Ci0JICAgZml4UC0+Znhfc2l6ZSA9PSAyID8gUl9SRUxXT1JEIDoKLQkgICBSX0RJUjMyKSk7Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGlmIChmcmFnLT5mcl9uZXh0KQotICAgIHJldHVybiAoZnJhZy0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2FkZHJlc3MpOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBJMzg2Q09GRiAqLwotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0MCi0vKiBlbmQgb2YgdGMtaTM4Ni5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWkzODYuaCBiL2dhcy9jb25maWcvdGMtaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDgzMGVlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTM4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qIHRjLWkzODYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtaTM4Ni5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFRDX0kzODYKLSNkZWZpbmUgVENfSTM4NiAxCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmaXg7Ci0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkwCi0KLSNpZmRlZiBURV9MWU5YCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJjb2ZmLWkzODYtbHlueCIKLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotLyogVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSByZWxvY2F0aW9uIHR5cGVzIGluIHRjLWkzODYuYy4gIFRoZSBmaXJzdAotICAgcGFyYW1ldGVyIGlzIHRoZSBjdXJyZW50IHJlbG9jYXRpb24gdHlwZSwgdGhlIHNlY29uZCBvbmUgaXMgdGhlIGRlc2lyZWQKLSAgIHR5cGUuICBUaGUgaWRlYSBpcyB0aGF0IGlmIHRoZSBvcmlnaW5hbCB0eXBlIGlzIGFscmVhZHkgc29tZSBraW5kIG9mIFBJQwotICAgcmVsb2NhdGlvbiwgd2UgbGVhdmUgaXQgYWxvbmUsIG90aGVyd2lzZSB3ZSBnaXZlIGl0IHRoZSBkZXNpcmVkIHR5cGUgKi8KLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShYKSAgdGNfaTM4Nl9maXhfYWRqdXN0YWJsZShYKQotZXh0ZXJuIGludCB0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBUaGlzIGlzIHRoZSByZWxvY2F0aW9uIHR5cGUgZm9yIGRpcmVjdCByZWZlcmVuY2VzIHRvIEdMT0JBTF9PRkZTRVRfVEFCTEUuCi0gKiBJdCBjb21lcyB1cCBpbiBjb21wbGljYXRlZCBleHByZXNzaW9ucyBzdWNoIGFzIAotICogX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLS5MMjg0XSwgd2hpY2ggY2Fubm90IGJlIGV4cHJlc3NlZCBub3JtYWxseSB3aXRoCi0gKiB0aGUgcmVndWxhciBleHByZXNzaW9ucy4gIFRoZSBmaXh1cCBzcGVjaWZpZWQgaGVyZSB3aGVuIHVzZWQgYXQgcnVudGltZSAKLSAqIGltcGxpZXMgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBhZGRyZXNzIG9mIHRoZSBHT1QgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiwKLSAqIGFuZCBhcyBhIHJlc3VsdCB3ZSBoYXZlIHNpbXBsaWZpZWQgdGhlIGV4cHJlc3Npb24gaW50byBzb21ldGhpbmcgd2UgY2FuIHVzZS4KLSAqLwotI2RlZmluZSBUQ19SRUxPQ19HTE9CQUxfT0ZGU0VUX1RBQkxFIEJGRF9SRUxPQ18zODZfR09UUEMKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbCBvYmplY3QKLSAgIGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICBUcnVlIGlmIHdlCi0gICBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZyB0aGUgLm8gZmlsZS4KLSAgIFRoaXMgaXMgb25seSB1c2VkIGZvciBwY3JlbCByZWxvY2F0aW9ucywgc28gR09UT0ZGIGRvZXMgbm90IG5lZWQgdG8gYmUKLSAgIGNoZWNrZWQgaGVyZS4gIEkgYW0gbm90IHN1cmUgaWYgc29tZSBvZiB0aGUgb3RoZXJzIGFyZSBldmVyIHVzZWQgd2l0aAotICAgcGNyZWwsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gYmUgc2FmZSB0aGFuIHNvcnJ5LiAqLwotCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpCQkJCVwKLSAgKChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzM4Nl9QTFQzMgkJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzM4Nl9HT1QzMgkJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzM4Nl9HT1RQQwkJCVwKLSAgICYmICgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTAkJCQkJXAotICAgICAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0JICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0JICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKSkKLQotI2RlZmluZSBUQVJHRVRfQVJDSAkJYmZkX2FyY2hfaTM4NgotCi0jaWZkZWYgVEVfTmV0QlNECi0jZGVmaW5lIEFPVVRfVEFSR0VUX0ZPUk1BVAkiYS5vdXQtaTM4Ni1uZXRic2QiCi0jZW5kaWYKLSNpZmRlZiBURV8zODZCU0QKLSNkZWZpbmUgQU9VVF9UQVJHRVRfRk9STUFUCSJhLm91dC1pMzg2LWJzZCIKLSNlbmRpZgotI2lmZGVmIFRFX0xJTlVYCi0jZGVmaW5lIEFPVVRfVEFSR0VUX0ZPUk1BVAkiYS5vdXQtaTM4Ni1saW51eCIKLSNlbmRpZgotI2lmZGVmIFRFX01hY2gKLSNkZWZpbmUgQU9VVF9UQVJHRVRfRk9STUFUCSJhLm91dC1tYWNoMyIKLSNlbmRpZgotI2lmZGVmIFRFX0RZTklYCi0jZGVmaW5lIEFPVVRfVEFSR0VUX0ZPUk1BVAkiYS5vdXQtaTM4Ni1keW5peCIKLSNlbmRpZgotI2lmbmRlZiBBT1VUX1RBUkdFVF9GT1JNQVQKLSNkZWZpbmUgQU9VVF9UQVJHRVRfRk9STUFUCSJhLm91dC1pMzg2IgotI2VuZGlmCi0KLSNpZiAoKGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpICYmIGRlZmluZWQgKE9CSl9NQVlCRV9DT0ZGKSkgXAotICAgICB8fCAoZGVmaW5lZCAoT0JKX01BWUJFX0VMRikgJiYgZGVmaW5lZCAoT0JKX01BWUJFX0FPVVQpKSBcCi0gICAgIHx8IChkZWZpbmVkIChPQkpfTUFZQkVfQ09GRikgJiYgZGVmaW5lZCAoT0JKX01BWUJFX0FPVVQpKSkKLWV4dGVybiBjb25zdCBjaGFyICppMzg2X3RhcmdldF9mb3JtYXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBUQVJHRVRfRk9STUFUIGkzODZfdGFyZ2V0X2Zvcm1hdCAoKQotI2Vsc2UKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJlbGYzMi1pMzg2IgotI2VuZGlmCi0jaWZkZWYgT0JKX0FPVVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJQU9VVF9UQVJHRVRfRk9STUFUCi0jZW5kaWYKLSNlbmRpZgotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogQ09GRiBTVFVGRiAqLwotCi0jZGVmaW5lIENPRkZfTUFHSUMgSTM4Nk1BR0lDCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX2kzODYKLSNkZWZpbmUgQ09GRl9GTEFHUyBGX0FSMzJXUgotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKHgpLT5meF9hZGRzeSB8fCAoeCktPmZ4X3JfdHlwZT09NykKLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLWV4dGVybiBzaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgUEFSQU1TICgoZnJhZ1MgKmZyYWcpKTsKLQotI2lmZGVmIFRFX0dPMzIKLS8qIERKR1BQIG5vdyBleHBlY3RzIHNvbWUgc2VjdGlvbnMgdG8gYmUgMioqNCBhbGlnbmVkLiAgKi8KLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKQkJCQkJCVwKLSAgKChzdHJjbXAgKG9ial9zZWdtZW50X25hbWUgKFNFRyksICIudGV4dCIpID09IDAJCQlcCi0gICAgfHwgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmRhdGEiKSA9PSAwCQkJXAotICAgIHx8IHN0cm5jbXAgKG9ial9zZWdtZW50X25hbWUgKFNFRyksICIuZ251LmxpbmtvbmNlLnQiLCAxNSkgPT0gMAlcCi0gICAgfHwgc3RybmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5nbnUubGlua29uY2UuZCIsIDE1KSA9PSAwCVwKLSAgICB8fCBzdHJuY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmdudS5saW5rb25jZS5yIiwgMTUpID09IDApCVwKLSAgID8gNAkJCQkJCQkJCVwKLSAgIDogMikKLSNlbHNlCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgotI2VuZGlmCi0KLSNkZWZpbmUgVENfUlZBX1JFTE9DIDcKLS8qIE5lZWQgdGhpcyBmb3IgUElDIHJlbG9jYXRpb25zICovCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFCi0KLQotI2lmZGVmIFRFXzM4NkJTRAotLyogVGhlIEJTREkgbGlua2VyIGFwcGFyZW50bHkgcmVqZWN0cyBvYmplY3RzIHdpdGggYSBtYWNoaW5lIHR5cGUgb2YKLSAgIE1fMzg2ICgxMDApLiAgKi8KLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAwCi0jZWxzZQotI2RlZmluZSBBT1VUX01BQ0hUWVBFIDEwMAotI2VuZGlmCi0KLSN1bmRlZiBSRVZFUlNFX1NPUlRfUkVMT0NTCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIHRjX2kzODZfZm9yY2VfcmVsb2NhdGlvbihmaXhwKQotZXh0ZXJuIGludCB0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIE5PX1JFTE9DIEJGRF9SRUxPQ19OT05FCi0jZWxzZQotI2RlZmluZSBOT19SRUxPQyAwCi0jZW5kaWYKLSNkZWZpbmUgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKGEpCTsJLyogbm90IHVzZWQgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZuZGVmIE9CSl9BT1VUCi0jaWZuZGVmIFRFX1BFCi0jaWZuZGVmIFRFX0dPMzIKLS8qIExvY2FsIGxhYmVscyBzdGFydHMgd2l0aCAuTCAqLwotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAobmFtZVswXSA9PSAnLicgXAotCQkgJiYgKG5hbWVbMV0gPT0gJ0wnIHx8IG5hbWVbMV0gPT0gJ1gnIHx8IG5hbWVbMV0gPT0gJy4nKSkKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLwotCi1leHRlcm4gY29uc3QgY2hhciBleHRyYV9zeW1ib2xfY2hhcnNbXTsKLSNkZWZpbmUgdGNfc3ltYm9sX2NoYXJzIGV4dHJhX3N5bWJvbF9jaGFycwotCi0jZGVmaW5lIE1BWF9PUEVSQU5EUyAzCQkvKiBtYXggb3BlcmFuZHMgcGVyIGluc24gKi8KLSNkZWZpbmUgTUFYX0lNTUVESUFURV9PUEVSQU5EUyAyLyogbWF4IGltbWVkaWF0ZXMgcGVyIGluc24gKGxjYWxsLCBsam1wKSAqLwotI2RlZmluZSBNQVhfTUVNT1JZX09QRVJBTkRTIDIJLyogbWF4IG1lbW9yeSByZWZzIHBlciBpbnNuIChzdHJpbmcgb3BzKSAqLwotCi0vKiBQcmVmaXhlcyB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlIG9yZGVyIGRlZmluZWQgYmVsb3cuCi0gICBXQUlUX1BSRUZJWCBtdXN0IGJlIHRoZSBmaXJzdCBwcmVmaXggc2luY2UgRldBSVQgaXMgcmVhbGx5IGlzIGFuCi0gICBpbnN0cnVjdGlvbiwgYW5kIHNvIG11c3QgY29tZSBiZWZvcmUgYW55IHByZWZpeGVzLiAqLwotI2RlZmluZSBXQUlUX1BSRUZJWAkwCi0jZGVmaW5lIExPQ0tSRVBfUFJFRklYCTEKLSNkZWZpbmUgQUREUl9QUkVGSVgJMgotI2RlZmluZSBEQVRBX1BSRUZJWAkzCi0jZGVmaW5lIFNFR19QUkVGSVgJNAotI2RlZmluZSBNQVhfUFJFRklYRVMJNQkvKiBtYXggcHJlZml4ZXMgcGVyIG9wY29kZSAqLwotCi0vKiB3ZSBkZWZpbmUgdGhlIHN5bnRheCBoZXJlIChtb2R1bG8gYmFzZSxpbmRleCxzY2FsZSBzeW50YXgpICovCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWCAnJScKLSNkZWZpbmUgSU1NRURJQVRFX1BSRUZJWCAnJCcKLSNkZWZpbmUgQUJTT0xVVEVfUFJFRklYICcqJwotCi0jZGVmaW5lIFRXT19CWVRFX09QQ09ERV9FU0NBUEUgMHgwZgotI2RlZmluZSBOT1BfT1BDT0RFIChjaGFyKSAweDkwCi0KLS8qIHJlZ2lzdGVyIG51bWJlcnMgKi8KLSNkZWZpbmUgRUJQX1JFR19OVU0gNQotI2RlZmluZSBFU1BfUkVHX05VTSA0Ci0KLS8qIG1vZHJtX2J5dGUucmVnbWVtIGZvciB0d29ieXRlIGVzY2FwZSAqLwotI2RlZmluZSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORyBFU1BfUkVHX05VTQotLyogaW5kZXhfYmFzZV9ieXRlLmluZGV4IGZvciBubyBpbmRleCByZWdpc3RlciBhZGRyZXNzaW5nICovCi0jZGVmaW5lIE5PX0lOREVYX1JFR0lTVEVSIEVTUF9SRUdfTlVNCi0vKiBpbmRleF9iYXNlX2J5dGUuYmFzZSBmb3Igbm8gYmFzZSByZWdpc3RlciBhZGRyZXNzaW5nICovCi0jZGVmaW5lIE5PX0JBU0VfUkVHSVNURVIgRUJQX1JFR19OVU0KLSNkZWZpbmUgTk9fQkFTRV9SRUdJU1RFUl8xNiA2Ci0KLS8qIHRoZXNlIGFyZSB0aGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMuICAqLwotI2RlZmluZSBXT1JEX01ORU1fU1VGRklYICAndycKLSNkZWZpbmUgQllURV9NTkVNX1NVRkZJWCAgJ2InCi0jZGVmaW5lIFNIT1JUX01ORU1fU1VGRklYICdzJwotI2RlZmluZSBMT05HX01ORU1fU1VGRklYICAnbCcKLS8qIEludGVsIFN5bnRheCAqLwotI2RlZmluZSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCAneCcKLS8qIEludGVsIFN5bnRheCAqLwotI2RlZmluZSBEV09SRF9NTkVNX1NVRkZJWCAnZCcKLQotLyogbW9kcm0ubW9kZSA9IFJFR01FTV9GSUVMRF9IQVNfUkVHIHdoZW4gYSByZWdpc3RlciBpcyBpbiB0aGVyZSAqLwotI2RlZmluZSBSRUdNRU1fRklFTERfSEFTX1JFRyAweDMvKiBhbHdheXMgPSAweDMgKi8KLSNkZWZpbmUgUkVHTUVNX0ZJRUxEX0hBU19NRU0gKH5SRUdNRU1fRklFTERfSEFTX1JFRykKLQotI2RlZmluZSBFTkRfT0ZfSU5TTiAnXDAnCi0KLS8qIEludGVsIFN5bnRheCAqLwotLyogVmFsdWVzIDAtNCBtYXAgb250byBzY2FsZSBmYWN0b3IgKi8KLSNkZWZpbmUgQllURV9QVFIgICAgIDAKLSNkZWZpbmUgV09SRF9QVFIgICAgIDEKLSNkZWZpbmUgRFdPUkRfUFRSICAgIDIKLSNkZWZpbmUgUVdPUkRfUFRSICAgIDMKLSNkZWZpbmUgWFdPUkRfUFRSICAgIDQKLSNkZWZpbmUgU0hPUlQgICAgICAgIDUKLSNkZWZpbmUgT0ZGU0VUX0ZMQVQgIDYKLSNkZWZpbmUgRkxBVCAgICAgICAgIDcKLSNkZWZpbmUgTk9ORV9GT1VORCAgIDgKLS8qCi0gIFdoZW4gYW4gb3BlcmFuZCBpcyByZWFkIGluIGl0IGlzIGNsYXNzaWZpZWQgYnkgaXRzIHR5cGUuICBUaGlzIHR5cGUgaW5jbHVkZXMKLSAgYWxsIHRoZSBwb3NzaWJsZSB3YXlzIGFuIG9wZXJhbmQgY2FuIGJlIHVzZWQuICBUaHVzLCAnJWVheCcgaXMgYm90aCAncmVnaXN0ZXIKLSAgIyAwJyBhbmQgJ1RoZSBBY2N1bXVsYXRvcicuICBJbiBvdXIgbGFuZ3VhZ2UgdGhpcyBpcyBleHByZXNzZWQgYnkgT1InaW5nCi0gICdSZWczMicgKGFueSAzMiBiaXQgcmVnaXN0ZXIpIGFuZCAnQWNjJyAodGhlIGFjY3VtdWxhdG9yKS4KLSAgT3BlcmFuZHMgYXJlIGNsYXNzaWZpZWQgc28gdGhhdCB3ZSBjYW4gbWF0Y2ggZ2l2ZW4gb3BlcmFuZCB0eXBlcyB3aXRoCi0gIHRoZSBvcGNvZGUgdGFibGUgaW4gb3Bjb2RlL2kzODYuaC4KLSAgKi8KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIFJlZzgJCSAgIDB4MQkvKiA4IGJpdCByZWcgKi8KLSNkZWZpbmUgUmVnMTYJCSAgIDB4MgkvKiAxNiBiaXQgcmVnICovCi0jZGVmaW5lIFJlZzMyCQkgICAweDQJLyogMzIgYml0IHJlZyAqLwotLyogaW1tZWRpYXRlICovCi0jZGVmaW5lIEltbTgJCSAgIDB4OAkvKiA4IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tOFMJCSAgMHgxMAkvKiA4IGJpdCBpbW1lZGlhdGUgc2lnbiBleHRlbmRlZCAqLwotI2RlZmluZSBJbW0xNgkJICAweDIwCS8qIDE2IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tMzIJCSAgMHg0MAkvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIEltbTEJCSAgMHg4MAkvKiAxIGJpdCBpbW1lZGlhdGUgKi8KLS8qIG1lbW9yeSAqLwotI2RlZmluZSBCYXNlSW5kZXgJIDB4MTAwCi0vKiBEaXNwOCwxNiwzMiBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIG9uIHRoZQotICAgaW5zdHJ1Y3Rpb24uICBGb3IganVtcHMsIHRoZXkgc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgUEMgcmVsYXRpdmUKLSAgIGRpc3BsYWNlbWVudCwgZm9yIGJhc2VpbmRleCB0eXBlIGluc3RydWN0aW9ucywgdGhleSBzcGVjaWZ5IHRoZQotICAgc2l6ZSBvZiB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBiYXNlIHJlZ2lzdGVyLCBhbmQgZm9yIG1lbW9yeQotICAgb2Zmc2V0IGluc3RydWN0aW9ucyBzdWNoIGFzIGBtb3YgMTIzNCwlYWwnIHRoZXkgc3BlY2lmeSB0aGUgc2l6ZSBvZgotICAgdGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc2VnbWVudCBiYXNlLiAgKi8KLSNkZWZpbmUgRGlzcDgJCSAweDIwMAkvKiA4IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgRGlzcDE2CQkgMHg0MDAJLyogMTYgYml0IGRpc3BsYWNlbWVudCAqLwotI2RlZmluZSBEaXNwMzIJCSAweDgwMAkvKiAzMiBiaXQgZGlzcGxhY2VtZW50ICovCi0vKiBzcGVjaWFscyAqLwotI2RlZmluZSBJbk91dFBvcnRSZWcJMHgxMDAwCS8qIHJlZ2lzdGVyIHRvIGhvbGQgaW4vb3V0IHBvcnQgYWRkciA9IGR4ICovCi0jZGVmaW5lIFNoaWZ0Q291bnQJMHgyMDAwCS8qIHJlZ2lzdGVyIHRvIGhvbGQgc2hpZnQgY291bmQgPSBjbCAqLwotI2RlZmluZSBDb250cm9sCSAgICAgICAgMHg0MDAwCS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRGVidWcJICAgICAgICAweDgwMDAJLyogRGVidWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVGVzdAkgICAgICAgMHgxMDAwMAkvKiBUZXN0IHJlZ2lzdGVyICovCi0jZGVmaW5lIEZsb2F0UmVnICAgICAgIDB4MjAwMDAJLyogRmxvYXQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRmxvYXRBY2MgICAgICAgMHg0MDAwMAkvKiBGbG9hdCBzdGFjayB0b3AgJXN0KDApICovCi0jZGVmaW5lIFNSZWcyCSAgICAgICAweDgwMDAwCS8qIDIgYml0IHNlZ21lbnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1JlZzMJICAgICAgMHgxMDAwMDAJLyogMyBiaXQgc2VnbWVudCByZWdpc3RlciAqLwotI2RlZmluZSBBY2MJICAgICAgMHgyMDAwMDAJLyogQWNjdW11bGF0b3IgJWFsIG9yICVheCBvciAlZWF4ICovCi0jZGVmaW5lIEp1bXBBYnNvbHV0ZSAgMHg0MDAwMDAKLSNkZWZpbmUgUmVnTU1YCSAgICAgIDB4ODAwMDAwCS8qIE1NWCByZWdpc3RlciAqLwotI2RlZmluZSBSZWdYTU0JICAgICAweDEwMDAwMDAJLyogWE1NIHJlZ2lzdGVycyBpbiBQSUlJICovCi0jZGVmaW5lIEVzU2VnCSAgICAgMHgyMDAwMDAwCS8qIFN0cmluZyBpbnNuIG9wZXJhbmQgd2l0aCBmaXhlZCBlcyBzZWdtZW50ICovCi0vKiBJbnZNZW0gaXMgZm9yIGluc3RydWN0aW9ucyB3aXRoIGEgbW9kcm0gYnl0ZSB0aGF0IG9ubHkgYWxsb3cgYQotICAgZ2VuZXJhbCByZWdpc3RlciBlbmNvZGluZyBpbiB0aGUgaS50bS5tb2RlIGFuZCBpLnRtLnJlZ21lbSBmaWVsZHMsCi0gICBlZy4gY29udHJvbCByZWcgbW92ZXMuICBUaGV5IHJlYWxseSBvdWdodCB0byBzdXBwb3J0IGEgbWVtb3J5IGZvcm0sCi0gICBidXQgZG9uJ3QsIHNvIHdlIGFkZCBhbiBJbnZNZW0gZmxhZyB0byB0aGUgcmVnaXN0ZXIgb3BlcmFuZCB0bwotICAgaW5kaWNhdGUgdGhhdCBpdCBzaG91bGQgYmUgZW5jb2RlZCBpbiB0aGUgaS50bS5yZWdtZW0gZmllbGQuICAqLwotI2RlZmluZSBJbnZNZW0JICAgICAweDQwMDAwMDAKLQotI2RlZmluZSBSZWcJKFJlZzh8UmVnMTZ8UmVnMzIpCS8qIGdlbidsIHJlZ2lzdGVyICovCi0jZGVmaW5lIFdvcmRSZWcgKFJlZzE2fFJlZzMyKQotI2RlZmluZSBJbXBsaWNpdFJlZ2lzdGVyIChJbk91dFBvcnRSZWd8U2hpZnRDb3VudHxBY2N8RmxvYXRBY2MpCi0jZGVmaW5lIEltbQkoSW1tOHxJbW04U3xJbW0xNnxJbW0zMikgLyogZ2VuJ2wgaW1tZWRpYXRlICovCi0jZGVmaW5lIERpc3AJKERpc3A4fERpc3AxNnxEaXNwMzIpCS8qIEdlbmVyYWwgZGlzcGxhY2VtZW50ICovCi0jZGVmaW5lIEFueU1lbQkoRGlzcHxCYXNlSW5kZXh8SW52TWVtKQkvKiBHZW5lcmFsIG1lbW9yeSAqLwotLyogVGhlIGZvbGxvd2luZyBhbGlhc2VzIGFyZSBkZWZpbmVkIGJlY2F1c2UgdGhlIG9wY29kZSB0YWJsZQotICAgY2FyZWZ1bGx5IHNwZWNpZmllcyB0aGUgYWxsb3dlZCBtZW1vcnkgdHlwZXMgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uCi0gICBBdCB0aGUgbW9tZW50IHdlIGNhbiBvbmx5IHRlbGwgYSBtZW1vcnkgcmVmZXJlbmNlIHNpemUgYnkgdGhlCi0gICBpbnN0cnVjdGlvbiBzdWZmaXgsIHNvIHRoZXJlJ3Mgbm90IG11Y2ggcG9pbnQgaW4gZGVmaW5pbmcgTWVtOCwKLSAgIE1lbTE2LCBNZW0zMiBhbmQgTWVtNjQgb3Bjb2RlIG1vZGlmaWVycyAtIFdlIG1pZ2h0IGFzIHdlbGwganVzdCB1c2UKLSAgIHRoZSBzdWZmaXggZGlyZWN0bHkgdG8gY2hlY2sgbWVtb3J5IG9wZXJhbmRzLiAgKi8KLSNkZWZpbmUgTExvbmdNZW0gQW55TWVtCQkvKiA2NCBiaXRzIChvciBtb3JlKSAqLwotI2RlZmluZSBMb25nTWVtIEFueU1lbQkJLyogMzIgYml0IG1lbW9yeSByZWYgKi8KLSNkZWZpbmUgU2hvcnRNZW0gQW55TWVtCQkvKiAxNiBiaXQgbWVtb3J5IHJlZiAqLwotI2RlZmluZSBXb3JkTWVtIEFueU1lbQkJLyogMTYgb3IgMzIgYml0IG1lbW9yeSByZWYgKi8KLSNkZWZpbmUgQnl0ZU1lbSBBbnlNZW0JCS8qIDggYml0IG1lbW9yeSByZWYgKi8KLQotI2RlZmluZSBTTUFMTEVTVF9ESVNQX1RZUEUobnVtKSBcCi0gICAgKGZpdHNfaW5fc2lnbmVkX2J5dGUobnVtKSA/IChEaXNwOHxEaXNwMzIpIDogRGlzcDMyKQotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBpbnN0cnVjdGlvbiBuYW1lIHNhbnMgd2lkdGggc3VmZml4ICgibW92IiBmb3IgbW92bCBpbnNucykgKi8KLSAgY2hhciAqbmFtZTsKLQotICAvKiBob3cgbWFueSBvcGVyYW5kcyAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlIHdpdGhvdXQgb3B0aW9uYWwKLSAgICAgcHJlZml4KGVzKS4gICovCi0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKLQotICAvKiBleHRlbnNpb25fb3Bjb2RlIGlzIHRoZSAzIGJpdCBleHRlbnNpb24gZm9yIGdyb3VwIDxuPiBpbnNucy4KLSAgICAgVGhpcyBmaWVsZCBpcyBhbHNvIHVzZWQgdG8gc3RvcmUgdGhlIDgtYml0IG9wY29kZSBzdWZmaXggZm9yIHRoZQotICAgICBBTUQgM0ROb3chIGluc3RydWN0aW9ucy4KLSAgICAgSWYgdGhpcyB0ZW1wbGF0ZSBoYXMgbm8gZXh0ZW5zaW9uIG9wY29kZSAodGhlIHVzdWFsIGNhc2UpIHVzZSBOb25lICovCi0gIHVuc2lnbmVkIGludCBleHRlbnNpb25fb3Bjb2RlOwotI2RlZmluZSBOb25lIDB4ZmZmZgkJLyogSWYgbm8gZXh0ZW5zaW9uX29wY29kZSBpcyBwb3NzaWJsZS4gKi8KLQotICAvKiB0aGUgYml0cyBpbiBvcGNvZGVfbW9kaWZpZXIgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGZpbmFsIG9wY29kZSBmcm9tCi0gICAgIHRoZSBiYXNlX29wY29kZS4gIFRoZXNlIGJpdHMgYWxzbyBhcmUgdXNlZCB0byBkZXRlY3QgYWx0ZXJuYXRlIGZvcm1zIG9mCi0gICAgIHRoZSBzYW1lIGluc3RydWN0aW9uICovCi0gIHVuc2lnbmVkIGludCBvcGNvZGVfbW9kaWZpZXI7Ci0KLSAgLyogb3Bjb2RlX21vZGlmaWVyIGJpdHM6ICovCi0jZGVmaW5lIFcJCSAgIDB4MQkvKiBzZXQgaWYgb3BlcmFuZHMgY2FuIGJlIHdvcmRzIG9yIGR3b3JkcwotCQkJCSAgIGVuY29kZWQgdGhlIGNhbm9uaWNhbCB3YXkgKi8KLSNkZWZpbmUgRAkJICAgMHgyCS8qIEQgPSAwIGlmIFJlZyAtLT4gUmVnbWVtOwotCQkJCSAgIEQgPSAxIGlmIFJlZ21lbSAtLT4gUmVnOiAgICBNVVNUIEJFIDB4MiAqLwotI2RlZmluZSBNb2RybQkJICAgMHg0Ci0jZGVmaW5lIEZsb2F0UgkJICAgMHg4CS8qIHNyYy9kZXN0IHN3YXAgZm9yIGZsb2F0czogICBNVVNUIEJFIDB4OCAqLwotI2RlZmluZSBTaG9ydEZvcm0JICAweDEwCS8qIHJlZ2lzdGVyIGlzIGluIGxvdyAzIGJpdHMgb2Ygb3Bjb2RlICovCi0jZGVmaW5lIEZsb2F0TUYJCSAgMHgyMAkvKiBGUCBpbnNuIG1lbW9yeSBmb3JtYXQgYml0LCBzaXplZCBieSAweDQgKi8KLSNkZWZpbmUgSnVtcAkJICAweDQwCS8qIHNwZWNpYWwgY2FzZSBmb3IganVtcCBpbnNucy4gKi8KLSNkZWZpbmUgSnVtcER3b3JkCSAgMHg4MCAgLyogY2FsbCBhbmQganVtcCAqLwotI2RlZmluZSBKdW1wQnl0ZQkgMHgxMDAgIC8qIGxvb3AgYW5kIGplY3h6ICovCi0jZGVmaW5lIEp1bXBJbnRlclNlZ21lbnQgMHgyMDAJLyogc3BlY2lhbCBjYXNlIGZvciBpbnRlcnNlZ21lbnQgbGVhcHMvY2FsbHMgKi8KLSNkZWZpbmUgRmxvYXRECQkgMHg0MDAJLyogZGlyZWN0aW9uIGZvciBmbG9hdCBpbnNuczogIE1VU1QgQkUgMHg0MDAgKi8KLSNkZWZpbmUgU2VnMlNob3J0Rm9ybQkgMHg4MDAJLyogZW5jb2Rpbmcgb2YgbG9hZCBzZWdtZW50IHJlZyBpbnNucyAqLwotI2RlZmluZSBTZWczU2hvcnRGb3JtCTB4MTAwMAkvKiBmcy9ncyBzZWdtZW50IHJlZ2lzdGVyIGluc25zLiAqLwotI2RlZmluZSBTaXplMTYJCTB4MjAwMAkvKiBuZWVkcyBzaXplIHByZWZpeCBpZiBpbiAzMi1iaXQgbW9kZSAqLwotI2RlZmluZSBTaXplMzIJCTB4NDAwMAkvKiBuZWVkcyBzaXplIHByZWZpeCBpZiBpbiAxNi1iaXQgbW9kZSAqLwotI2RlZmluZSBJZ25vcmVTaXplCTB4ODAwMCAgLyogaW5zdHJ1Y3Rpb24gaWdub3JlcyBvcGVyYW5kIHNpemUgcHJlZml4ICovCi0jZGVmaW5lIERlZmF1bHRTaXplICAgIDB4MTAwMDAgIC8qIGRlZmF1bHQgaW5zbiBzaXplIGRlcGVuZHMgb24gbW9kZSAqLwotI2RlZmluZSBOb19iU3VmCSAgICAgICAweDIwMDAwCS8qIGIgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgTm9fd1N1ZgkgICAgICAgMHg0MDAwMAkvKiB3IHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX2xTdWYJICAgICAgIDB4ODAwMDAJLyogbCBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb19zU3VmCSAgICAgIDB4MTAwMDAwCS8qIHMgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgTm9fZFN1ZiAgICAgICAweDIwMDAwMCAgLyogZCBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb194U3VmICAgICAgIDB4NDAwMDAwICAvKiB4IHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIEZXYWl0CSAgICAgIDB4ODAwMDAwCS8qIGluc3RydWN0aW9uIG5lZWRzIEZXQUlUICovCi0jZGVmaW5lIElzU3RyaW5nICAgICAweDEwMDAwMDAJLyogcXVpY2sgdGVzdCBmb3Igc3RyaW5nIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSByZWdLbHVkZ2UgICAgMHgyMDAwMDAwCS8qIGZha2UgYW4gZXh0cmEgcmVnIG9wZXJhbmQgZm9yIGNsciwgaW11bCAqLwotI2RlZmluZSBJc1ByZWZpeCAgICAgMHg0MDAwMDAwCS8qIG9wY29kZSBpcyBhIHByZWZpeCAqLwotI2RlZmluZSBJbW1FeHQJICAgICAweDgwMDAwMDAJLyogaW5zdHJ1Y3Rpb24gaGFzIGV4dGVuc2lvbiBpbiA4IGJpdCBpbW0gKi8KLSNkZWZpbmUgVWdoCSAgICAweDgwMDAwMDAwCS8qIGRlcHJlY2F0ZWQgZnAgaW5zbiwgZ2V0cyBhIHdhcm5pbmcgKi8KLQotICAvKiBvcGVyYW5kX3R5cGVzW2ldIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBvcGVyYW5kIGkuICBUaGlzIGlzIG1hZGUKLSAgICAgYnkgT1InaW5nIHRvZ2V0aGVyIGFsbCBvZiB0aGUgcG9zc2libGUgdHlwZSBtYXNrcy4gIChlLmcuCi0gICAgICdvcGVyYW5kX3R5cGVzW2ldID0gUmVnfEltbScgc3BlY2lmaWVzIHRoYXQgb3BlcmFuZCBpIGNhbiBiZQotICAgICBlaXRoZXIgYSByZWdpc3RlciBvciBhbiBpbW1lZGlhdGUgb3BlcmFuZCAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZF90eXBlc1szXTsKLX0KLXRlbXBsYXRlOwotCi0vKgotICAndGVtcGxhdGVzJyBpcyBmb3IgZ3JvdXBpbmcgdG9nZXRoZXIgJ3RlbXBsYXRlJyBzdHJ1Y3R1cmVzIGZvciBvcGNvZGVzCi0gIG9mIHRoZSBzYW1lIG5hbWUuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3Igc3RvcmluZyB0aGUgaW5zbnMgaW4gdGhlIGdyYW5kCi0gIG9sZSBoYXNoIHRhYmxlIG9mIGluc25zLgotICBUaGUgdGVtcGxhdGVzIHRoZW1zZWx2ZXMgc3RhcnQgYXQgU1RBUlQgYW5kIHJhbmdlIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykKLSAgRU5ELgotICAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGNvbnN0IHRlbXBsYXRlICpzdGFydDsKLSAgICBjb25zdCB0ZW1wbGF0ZSAqZW5kOwotICB9IHRlbXBsYXRlczsKLQotLyogdGhlc2UgYXJlIGZvciByZWdpc3RlciBuYW1lIC0tPiBudW1iZXIgJiB0eXBlIGhhc2ggbG9va3VwICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgY2hhciAqcmVnX25hbWU7Ci0gICAgdW5zaWduZWQgaW50IHJlZ190eXBlOwotICAgIHVuc2lnbmVkIGludCByZWdfbnVtOwotICB9Ci1yZWdfZW50cnk7Ci0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBjaGFyICpzZWdfbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgc2VnX3ByZWZpeDsKLSAgfQotc2VnX2VudHJ5OwotCi0vKiAzODYgb3BlcmFuZCBlbmNvZGluZyBieXRlczogIHNlZSAzODYgYm9vayBmb3IgZGV0YWlscyBvZiB0aGlzLiAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGludCByZWdtZW07CS8qIGNvZGVzIHJlZ2lzdGVyIG9yIG1lbW9yeSBvcGVyYW5kICovCi0gICAgdW5zaWduZWQgaW50IHJlZzsJCS8qIGNvZGVzIHJlZ2lzdGVyIG9wZXJhbmQgKG9yIGV4dGVuZGVkIG9wY29kZSkgKi8KLSAgICB1bnNpZ25lZCBpbnQgbW9kZTsJCS8qIGhvdyB0byBpbnRlcnByZXQgcmVnbWVtICYgcmVnICovCi0gIH0KLW1vZHJtX2J5dGU7Ci0KLS8qIDM4NiBvcGNvZGUgYnl0ZSB0byBjb2RlIGluZGlyZWN0IGFkZHJlc3NpbmcuICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgYmFzZTsKLSAgICB1bnNpZ25lZCBpbmRleDsKLSAgICB1bnNpZ25lZCBzY2FsZTsKLSAgfQotc2liX2J5dGU7Ci0KLS8qIFRoZSBuYW1lIG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIuIEFsbG93Ci0gICB0aGlzIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZCBiZS4gKi8KLSNpZm5kZWYgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FCi0jZGVmaW5lIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkIGkzODZfdmFsaWRhdGVfZml4IFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2RlZmluZSBUQ19WQUxJREFURV9GSVgoRklYUCxTRUdUWVBFLFNLSVApIGkzODZfdmFsaWRhdGVfZml4KEZJWFApCi0jZW5kaWYKLQotI2VuZGlmIC8qIFRDX0kzODYgKi8KLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLSNkZWZpbmUgbWRfZG9fYWxpZ24obiwgZmlsbCwgbGVuLCBtYXgsIGFyb3VuZCkJCQkJXAotaWYgKChuKSAmJiAhbmVlZF9wYXNzXzIJCQkJCQkJXAotICAgICYmICghKGZpbGwpIHx8ICgoY2hhcikqKGZpbGwpID09IChjaGFyKTB4OTAgJiYgKGxlbikgPT0gMSkpCQlcCi0gICAgJiYgc3Vic2VnX3RleHRfcCAobm93X3NlZykpCQkJCQkJXAotICB7CQkJCQkJCQkJXAotICAgIGNoYXIgKnA7CQkJCQkJCQlcCi0gICAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxNSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgbWF4LAkJXAotCQkgIChzeW1ib2xTICopIDAsIChvZmZzZXRUKSAobiksIChjaGFyICopIDApOwkJXAotICAgICpwID0gMHg5MDsJCQkJCQkJCVwKLSAgICBnb3RvIGFyb3VuZDsJCQkJCQkJXAotICB9Ci0KLWV4dGVybiB2b2lkIGkzODZfYWxpZ25fY29kZSBQQVJBTVMgKChmcmFnUyAqLCBpbnQpKTsKLQotI2RlZmluZSBIQU5ETEVfQUxJR04oZnJhZ1ApCQkJCQkJXAotaWYgKGZyYWdQLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUpIAkJCQkJXAotICBpMzg2X2FsaWduX2NvZGUgKGZyYWdQLCAoZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3MJCQlcCi0JCQkgICAtIGZyYWdQLT5mcl9hZGRyZXNzCQkJCVwKLQkJCSAgIC0gZnJhZ1AtPmZyX2ZpeCkpOwotCi0vKiBjYWxsIG1kX2FwcGx5X2ZpeDMgd2l0aCBzZWdtZW50IGluc3RlYWQgb2YgbWRfYXBwbHlfZml4ICovCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotdm9pZCBpMzg2X3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci0jZGVmaW5lIHRjX3ByaW50X3N0YXRpc3RpY3MgaTM4Nl9wcmludF9zdGF0aXN0aWNzCi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotI2lmZGVmIFNDT19FTEYKLSNkZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzKCkgc2NvX2lkICgpCi1leHRlcm4gdm9pZCBzY29faWQgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LICAgIC8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIGVuZCBvZiB0Yy1pMzg2LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTg2MC5jIGIvZ2FzL2NvbmZpZy90Yy1pODYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMTcyODIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYzICswLDAgQEAKLS8qIHRjLWk4NjAuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIEk4NjAKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL2k4NjAuaCIKLQotdm9pZCBtZF9iZWdpbiAoKTsKLXZvaWQgbWRfbnVtYmVyX3RvX2NoYXJzICgpOwotdm9pZCBtZF9hc3NlbWJsZSAoKTsKLWNoYXIgKm1kX2F0b2YgKCk7Ci12b2lkIG1kX2NvbnZlcnRfZnJhZyAoKTsKLWludCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoKTsKLXZvaWQgbWRfbnVtYmVyX3RvX2ltbSAoKTsKLXZvaWQgbWRfbnVtYmVyX3RvX2Rpc3AgKCk7Ci12b2lkIG1kX251bWJlcl90b19maWVsZCAoKTsKLXZvaWQgbWRfcmlfdG9fY2hhcnMgKCk7Ci1zdGF0aWMgdm9pZCBpODYwX2lwICgpOwotLyogdm9pZCBlbWl0X21hY2hpbmVfcmVsb2MoKTsgKi8KLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotCi0vKiB2b2lkICgqbWRfZW1pdF9yZWxvY2F0aW9ucykoKSA9IGVtaXRfbWFjaGluZV9yZWxvYzsgKi8KLQotLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOwotCi1zdGF0aWMgdm9pZCBzX2R1YWwgKCksIHNfZW5kZHVhbCAoKTsKLXN0YXRpYyB2b2lkIHNfYXRtcCAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTCi0gIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkdWFsIiwgc19kdWFsLCA0fSwKLSAgeyJlbmRkdWFsIiwgc19lbmRkdWFsLCA0fSwKLSAgeyJhdG1wIiwgc19hdG1wLCA0fSwKLSAge05VTEwsIDAsIDB9LAotfTsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEvIjsJLyogSkYgcmVtb3ZlZCAnfCcgZnJvbSBjb21tZW50X2NoYXJzICovCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMvIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuCi0gICAqLwotaW50IHNpemVfcmVsb2NfaW5mbyA9IHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIG9jdGFsWzI1Nl07Ci0jZGVmaW5lIGlzb2N0YWwoYykgIG9jdGFsW2NdCi1zdGF0aWMgdW5zaWduZWQgY2hhciB0b0hleFsyNTZdOwotCi1zdHJ1Y3QgaTg2MF9pdAotICB7Ci0gICAgY2hhciAqZXJyb3I7Ci0gICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gICAgc3RydWN0IG5saXN0ICpubGlzdHA7Ci0gICAgZXhwcmVzc2lvblMgZXhwOwotICAgIGludCBwY3JlbDsKLSAgICBlbnVtIGV4cGFuZF90eXBlIGV4cGFuZDsKLSAgICBlbnVtIGhpZ2hsb3dfdHlwZSBoaWdobG93OwotICAgIGVudW0gcmVsb2NfdHlwZSByZWxvYzsKLSAgfSB0aGVfaW5zbjsKLQotI2lmIF9fU1REQ19fID09IDEKLQotc3RhdGljIHZvaWQgcHJpbnRfaW5zbiAoc3RydWN0IGk4NjBfaXQgKmluc24pOwotc3RhdGljIGludCBnZXRFeHByZXNzaW9uIChjaGFyICpzdHIpOwotCi0jZWxzZSAvKiBub3QgX19TVERDX18gKi8KLQotc3RhdGljIHZvaWQgcHJpbnRfaW5zbiAoKTsKLXN0YXRpYyBpbnQgZ2V0RXhwcmVzc2lvbiAoKTsKLQotI2VuZGlmIC8qIG5vdCBfX1NURENfXyAqLwotCi1zdGF0aWMgY2hhciAqZXhwcl9lbmQ7Ci1zdGF0aWMgY2hhciBsYXN0X2V4cGFuZDsJLyogZXJyb3IgaWYgZXhwYW5zaW9uIGFmdGVyIGJyYW5jaCAqLwotCi1lbnVtIGR1YWwKLXsKLSAgRFVBTF9PRkYgPSAwLCBEVUFMX09OLCBEVUFMX0RET1QsIERVQUxfT05ERE9ULAotfTsKLXN0YXRpYyBlbnVtIGR1YWwgZHVhbF9tb2RlID0gRFVBTF9PRkY7CS8qIGR1YWwtaW5zdHJ1Y3Rpb24gbW9kZSAqLwotCi1zdGF0aWMgdm9pZAotc19kdWFsICgpCQkJLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGhhdmUgZHVhbCBzZXQgKi8KLXsKLSAgZHVhbF9tb2RlID0gRFVBTF9PTjsKLX0KLQotc3RhdGljIHZvaWQKLXNfZW5kZHVhbCAoKQkJCS8qIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBoYXZlIGR1YWwgc2V0ICovCi17Ci0gIGR1YWxfbW9kZSA9IERVQUxfT0ZGOwotfQotCi1zdGF0aWMgaW50IGF0bXAgPSAzMTsJCS8qIHRlbXBvcmFyeSByZWdpc3RlciBmb3IgcHNldWRvJ3MgKi8KLQotc3RhdGljIHZvaWQKLXNfYXRtcCAoKQotewotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNwIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICAgIGF0bXAgPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZnAiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICAgICAgYXRtcCA9IDM7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJyIiwgMSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMTsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICh0ZW1wID49IDAgJiYgdGVtcCA8PSAzMSkKLQlhdG1wID0gdGVtcDsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIlVua25vd24gdGVtcG9yYXJ5IHBzZXVkbyByZWdpc3RlciIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gdGVtcG9yYXJ5IHBzZXVkbyByZWdpc3RlciIpKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLiAgKi8KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIGludCBsb3NlID0gMDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGk4NjBfb3Bjb2Rlc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsICZpODYwX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLAotCQkgICBpODYwX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLQkgIGxvc2UgPSAxOwotCX0KLSAgICAgIGRvCi0JewotCSAgaWYgKGk4NjBfb3Bjb2Rlc1tpXS5tYXRjaCAmIGk4NjBfb3Bjb2Rlc1tpXS5sb3NlKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIpLAotCQkgICAgICAgaTg2MF9vcGNvZGVzW2ldLm5hbWUsIGk4NjBfb3Bjb2Rlc1tpXS5hcmdzKTsKLQkgICAgICBsb3NlID0gMTsKLQkgICAgfQotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChpIDwgTlVNT1BDT0RFUwotCSAgICAgJiYgIXN0cmNtcCAoaTg2MF9vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKTsKLSAgICB9Ci0KLSAgaWYgKGxvc2UpCi0gICAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCi0gIGZvciAoaSA9ICcwJzsgaSA8ICc4JzsgKytpKQotICAgIG9jdGFsW2ldID0gMTsKLSAgZm9yIChpID0gJzAnOyBpIDw9ICc5JzsgKytpKQotICAgIHRvSGV4W2ldID0gaSAtICcwJzsKLSAgZm9yIChpID0gJ2EnOyBpIDw9ICdmJzsgKytpKQotICAgIHRvSGV4W2ldID0gaSArIDEwIC0gJ2EnOwotICBmb3IgKGkgPSAnQSc7IGkgPD0gJ0YnOyArK2kpCi0gICAgdG9IZXhbaV0gPSBpICsgMTAgLSAnQSc7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqdG9QOwotICBpbnQgcnNkOwotICBpbnQgbm9fb3Bjb2RlcyA9IDE7Ci0gIGludCBpOwotICBzdHJ1Y3QgaTg2MF9pdCBwc2V1ZG9bM107Ci0KLSAgYXNzZXJ0IChzdHIpOwotICBpODYwX2lwIChzdHIpOwotCi0gIC8qIGNoZWNrIGZvciBleHBhbmRhYmxlIGZsYWcgdG8gcHJvZHVjZSBwc2V1ZG8taW5zdHJ1Y3Rpb25zICovCi0gIGlmICh0aGVfaW5zbi5leHBhbmQgIT0gMCAmJiB0aGVfaW5zbi5oaWdobG93ID09IE5PX1NQRUMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQlwc2V1ZG9baV0gPSB0aGVfaW5zbjsKLQotICAgICAgc3dpdGNoICh0aGVfaW5zbi5leHBhbmQpCi0JewotCi0JY2FzZSBFX0RFTEFZOgotCSAgbm9fb3Bjb2RlcyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgRV9NT1Y6Ci0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE1KSAmJgotCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IC0oMSA8PCAxNSkpKQotCSAgICBicmVhazsKLQkgIC8qIG9yIGwlY29uc3QscjAsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIHwgMHhlNDAwMDAwMDsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gUEFJUjsKLQkgIC8qIG9yaCBoJWNvbnN0LGlyZWdfZGVzdCxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwM2ZmZmZmZikgfCAweGVjMDAwMDAwIHwKLQkgICAgKCh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSA8PCA1KTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gSElHSDsKLQkgIG5vX29wY29kZXMgPSAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfQUREUjoKLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICAvKiBvcmggaGElYWRkcl9leHByLHIwLHIzMSAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9IDB4ZWMwMDAwMDAgfCAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0hBREo7Ci0JICBwc2V1ZG9bMF0ucmVsb2MgPSBMT1cwOwkvKiBtdXN0IG92ZXJ3cml0ZSAqLwotCSAgLyogbCVhZGRyX2V4cHIocjMxKSxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgfjB4MDAzZTAwMDApIHwgKGF0bXAgPDwgMjEpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBQQUlSOwotCSAgbm9fb3Bjb2RlcyA9IDI7Ci0JICBicmVhazsKLQotCWNhc2UgRV9VMzI6CQkvKiAybmQgdmVyc2lvbiBlbXVsYXRlcyBJbnRlbCBhcywgbm90IGRvYy4gKi8KLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgKDEgPDwgMTYpICYmCi0JICAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj0gMCkpCi0JICAgIGJyZWFrOwotCSAgLyogJChvcGNvZGUpaCBoJWNvbnN0LGlyZWdfc3JjMixpcmVnX2Rlc3QKLQkJCSAgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHhmM2ZmZmZmZikgfCAweDBjMDAwMDAwOyAqLwotCSAgLyogJChvcGNvZGUpaCBoJWNvbnN0LGlyZWdfc3JjMixyMzEgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHhmM2UwZmZmZikgfCAweDBjMDAwMDAwIHwKLQkgICAgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBISUdIOwotCSAgLyogJChvcGNvZGUpIGwlY29uc3QsaXJlZ19kZXN0LGlyZWdfZGVzdAotCQkJICAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweGYwMWYwMDAwKSB8IDB4MDQwMDAwMDAgfAotCQkJICAgKCh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSA8PCA1KTsgKi8KLQkgIC8qICQob3Bjb2RlKSBsJWNvbnN0LHIzMSxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHhmMDFmMDAwMCkgfCAweDA0MDAwMDAwIHwKLQkgICAgKGF0bXAgPDwgMjEpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBQQUlSOwotCSAgbm9fb3Bjb2RlcyA9IDI7Ci0JICBicmVhazsKLQotCWNhc2UgRV9BTkQ6CQkvKiAybmQgdmVyc2lvbiBlbXVsYXRlcyBJbnRlbCBhcywgbm90IGRvYy4gKi8KLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgKDEgPDwgMTYpICYmCi0JICAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj0gMCkpCi0JICAgIGJyZWFrOwotCSAgLyogYW5kbm90IGglY29uc3QsaXJlZ19zcmMyLGlyZWdfZGVzdAotCQkJICAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAzZmZmZmZmKSB8IDB4ZDQwMDAwMDA7ICovCi0JICAvKiBhbmRub3QgaCVjb25zdCxpcmVnX3NyYzIscjMxICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDNlMGZmZmYpIHwgMHhkNDAwMDAwMCB8Ci0JICAgIChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gSElHSDsKLQkgIHBzZXVkb1swXS5leHAuWF9hZGRfbnVtYmVyID0gLTEgLSB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyOwotCSAgLyogYW5kbm90IGwlY29uc3QsaXJlZ19kZXN0LGlyZWdfZGVzdAotCQkJICAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSB8IDB4ZDQwMDAwMDAgfAotCQkJICAgKCh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSA8PCA1KTsgKi8KLQkgIC8qIGFuZG5vdCBsJWNvbnN0LHIzMSxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgfCAweGQ0MDAwMDAwIHwKLQkgICAgKGF0bXAgPDwgMjEpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBQQUlSOwotCSAgcHNldWRvWzFdLmV4cC5YX2FkZF9udW1iZXIgPSAtMSAtIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7Ci0JICBub19vcGNvZGVzID0gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX1MzMjoKLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgKDEgPDwgMTUpICYmCi0JICAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj0gLSgxIDw8IDE1KSkpCi0JICAgIGJyZWFrOwotCSAgLyogb3JoIGglY29uc3QscjAscjMxICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gMHhlYzAwMDAwMCB8IChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gSElHSDsKLQkgIC8qIG9yIGwlY29uc3QscjMxLHIzMSAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9IDB4ZTQwMDAwMDAgfCAoYXRtcCA8PCAyMSkgfCAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IFBBSVI7Ci0JICAvKiByMzEsaXJlZ19zcmMyLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzJdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiB+MHgwNDAwZmZmZikgfCAoYXRtcCA8PCAxMSk7Ci0JICBwc2V1ZG9bMl0ucmVsb2MgPSBOT19SRUxPQzsKLQkgIG5vX29wY29kZXMgPSAzOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotCX0KLQotICAgICAgdGhlX2luc24gPSBwc2V1ZG9bMF07Ci0gICAgICAvKiBjaGVjayBmb3IgZXhwYW5kZWQgb3Bjb2RlIGFmdGVyIGJyYW5jaCBvciBpbiBkdWFsICovCi0gICAgICBpZiAobm9fb3Bjb2RlcyA+IDEgJiYgbGFzdF9leHBhbmQgPT0gMSkKLQlhc193YXJuIChfKCJFeHBhbmRlZCBvcGNvZGUgYWZ0ZXIgZGVsYXllZCBicmFuY2g6IGAlcyciKSwgc3RyKTsKLSAgICAgIGlmIChub19vcGNvZGVzID4gMSAmJiBkdWFsX21vZGUgIT0gRFVBTF9PRkYpCi0JYXNfd2FybiAoXygiRXhwYW5kZWQgb3Bjb2RlIGluIGR1YWwgbW9kZTogYCVzJyIpLCBzdHIpOwotICAgIH0KLQotICBpID0gMDsKLSAgZG8KLSAgICB7CQkJCS8qIGFsd2F5cyBwcm9kdWNlIGF0IGxlYXN0IG9uZSBvcGNvZGUgKi8KLSAgICAgIHRvUCA9IGZyYWdfbW9yZSAoNCk7Ci0gICAgICAvKiBwdXQgb3V0IHRoZSBvcGNvZGUgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAodG9QLCB0aGVfaW5zbi5vcGNvZGUsIDQpOwotCi0gICAgICAvKiBjaGVjayBmb3IgZXhwYW5kZWQgb3Bjb2RlIGFmdGVyIGJyYW5jaCBvciBpbiBkdWFsICovCi0gICAgICBsYXN0X2V4cGFuZCA9IHRoZV9pbnNuLnBjcmVsOwotCi0gICAgICAvKiBwdXQgb3V0IHRoZSBzeW1ib2wtZGVwZW5kZW50IHN0dWZmICovCi0gICAgICBpZiAodGhlX2luc24ucmVsb2MgIT0gTk9fUkVMT0MpCi0JewotCSAgZml4X25ldyAoZnJhZ19ub3csCS8qIHdoaWNoIGZyYWcgKi8KLQkJICAgKHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwJLyogd2hlcmUgKi8KLQkJICAgNCwJCS8qIHNpemUgKi8KLQkJICAgJnRoZV9pbnNuLmV4cCwKLQkJICAgdGhlX2luc24ucGNyZWwsCi0JICAvKiBtZXJnZSBiaXQgZmllbGRzIGludG8gb25lIGFyZ3VtZW50ICovCi0JICAoaW50KSAoKCh0aGVfaW5zbi5oaWdobG93ICYgMHgzKSA8PCA0KSB8ICh0aGVfaW5zbi5yZWxvYyAmIDB4ZikpKTsKLQl9Ci0gICAgICB0aGVfaW5zbiA9IHBzZXVkb1srK2ldOwotICAgIH0KLSAgd2hpbGUgKC0tbm9fb3Bjb2RlcyA+IDApOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1pODYwX2lwIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY2hhciBjOwotICB1bnNpZ25lZCBsb25nIGk7Ci0gIHN0cnVjdCBpODYwX29wY29kZSAqaW5zbjsKLSAgY2hhciAqYXJnc1N0YXJ0OwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgdW5zaWduZWQgaW50IG1hc2s7Ci0gIGludCBtYXRjaCA9IDA7Ci0gIGludCBjb21tYSA9IDA7Ci0KLQotICBmb3IgKHMgPSBzdHI7IGlzbG93ZXIgKCpzKSB8fCAqcyA9PSAnLicgfHwgKnMgPT0gJzMnOyArK3MpCi0gICAgOwotICBzd2l0Y2ggKCpzKQotICAgIHsKLQotICAgIGNhc2UgJ1wwJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLCc6Ci0gICAgICBjb21tYSA9IDE7Ci0KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotCi0gICAgY2FzZSAnICc6Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgIH0KLQotICBpZiAoc3RybmNtcCAoc3RyLCAiZC4iLCAyKSA9PSAwKQotICAgIHsJCQkJLyogY2hlY2sgZm9yIGQuIG9wY29kZSBwcmVmaXggKi8KLSAgICAgIGlmIChkdWFsX21vZGUgPT0gRFVBTF9PTikKLQlkdWFsX21vZGUgPSBEVUFMX09ORERPVDsKLSAgICAgIGVsc2UKLQlkdWFsX21vZGUgPSBEVUFMX0RET1Q7Ci0gICAgICBzdHIgKz0gMjsKLSAgICB9Ci0KLSAgaWYgKChpbnNuID0gKHN0cnVjdCBpODYwX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR1YWxfbW9kZSA9PSBEVUFMX0RET1QgfHwgZHVhbF9tb2RlID09IERVQUxfT05ERE9UKQotCXN0ciAtPSAyOwotICAgICAgYXNfYmFkIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKGNvbW1hKQotICAgIHsKLSAgICAgICotLXMgPSAnLCc7Ci0gICAgfQotICBhcmdzU3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIG9wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gTk9fUkVMT0M7Ci0KLSAgICAgIC8qCi0JCSAqIEJ1aWxkIHRoZSBvcGNvZGUsIGNoZWNraW5nIGFzIHdlIGdvIHRvIG1ha2UKLQkJICogc3VyZSB0aGF0IHRoZSBvcGVyYW5kcyBtYXRjaAotCQkgKi8KLSAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7OyArK2FyZ3MpCi0JewotCSAgc3dpdGNoICgqYXJncykKLQkgICAgewotCi0JICAgIGNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCi0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXsKLQkJICBtYXRjaCA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcrJzoKLQkgICAgY2FzZSAnKCc6CQkvKiB0aGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KLQkgICAgY2FzZSAnKSc6Ci0JICAgIGNhc2UgJywnOgotCSAgICBjYXNlICcgJzoKLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnIyc6CQkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCAqLwotCSAgICAgIGlmIChpc2RpZ2l0ICgqcysrKSkKLQkJewotCQkgIHdoaWxlIChpc2RpZ2l0ICgqcykpCi0JCSAgICB7Ci0JCSAgICAgICsrczsKLQkJICAgIH0KLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzEnOgkJLyogbmV4dCBvcGVyYW5kIG11c3QgYmUgYSByZWdpc3RlciAqLwotCSAgICBjYXNlICcyJzoKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgc3dpdGNoICgqcykKLQkJewotCi0JCWNhc2UgJ2YnOgkvKiBmcmFtZSBwb2ludGVyICovCi0JCSAgcysrOwotCQkgIGlmICgqcysrID09ICdwJykKLQkJICAgIHsKLQkJICAgICAgbWFzayA9IDB4MzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgZ290byBlcnJvcjsKLQotCQljYXNlICdzJzoJLyogc3RhY2sgcG9pbnRlciAqLwotCQkgIHMrKzsKLQkJICBpZiAoKnMrKyA9PSAncCcpCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgPSAweDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGdvdG8gZXJyb3I7Ci0KLQkJY2FzZSAncic6CS8qIGFueSByZWdpc3RlciAqLwotCQkgIHMrKzsKLQkJICBpZiAoIWlzZGlnaXQgKGMgPSAqcysrKSkKLQkJICAgIHsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQkJICBpZiAoaXNkaWdpdCAoKnMpKQotCQkgICAgewotCQkgICAgICBpZiAoKGMgPSAxMCAqIChjIC0gJzAnKSArICgqcysrIC0gJzAnKSkgPj0gMzIpCi0JCQl7Ci0JCQkgIGdvdG8gZXJyb3I7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBjIC09ICcwJzsKLQkJICAgIH0KLQkJICBtYXNrID0gYzsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgkvKiBub3QgdGhpcyBvcGNvZGUgKi8KLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgLyoKLQkJCQkgKiBHb3QgdGhlIHJlZ2lzdGVyLCBub3cgZmlndXJlIG91dCB3aGVyZQotCQkJCSAqIGl0IGdvZXMgaW4gdGhlIG9wY29kZS4KLQkJCQkgKi8KLQkgICAgICBzd2l0Y2ggKCphcmdzKQotCQl7Ci0KLQkJY2FzZSAnMSc6Ci0JCSAgb3Bjb2RlIHw9IG1hc2sgPDwgMTE7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnMic6Ci0JCSAgb3Bjb2RlIHw9IG1hc2sgPDwgMjE7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnZCc6Ci0JCSAgb3Bjb2RlIHw9IG1hc2sgPDwgMTY7Ci0JCSAgY29udGludWU7Ci0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2UnOgkJLyogbmV4dCBvcGVyYW5kIGlzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICAgIGlmICgqcysrID09ICdmJyAmJiBpc2RpZ2l0ICgqcykpCi0JCXsKLQkJICBtYXNrID0gKnMrKzsKLQkJICBpZiAoaXNkaWdpdCAoKnMpKQotCQkgICAgewotCQkgICAgICBtYXNrID0gMTAgKiAobWFzayAtICcwJykgKyAoKnMrKyAtICcwJyk7Ci0JCSAgICAgIGlmIChtYXNrID49IDMyKQotCQkJewotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgLT0gJzAnOwotCQkgICAgfQotCQkgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICB7Ci0KLQkJICAgIGNhc2UgJ2UnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxMTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2YnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAyMTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2cnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxNjsKLQkJICAgICAgaWYgKGR1YWxfbW9kZSAhPSBEVUFMX09GRikKLQkJCW9wY29kZSB8PSAoMSA8PCA5KTsJLyogZHVhbCBtb2RlIGluc3RydWN0aW9uICovCi0JCSAgICAgIGlmIChkdWFsX21vZGUgPT0gRFVBTF9ERE9UKQotCQkJZHVhbF9tb2RlID0gRFVBTF9PRkY7Ci0JCSAgICAgIGlmIChkdWFsX21vZGUgPT0gRFVBTF9PTkRET1QpCi0JCQlkdWFsX21vZGUgPSBEVUFMX09OOwotCQkgICAgICBpZiAoKG9wY29kZSAmICgxIDw8IDEwKSkgJiYgKG1hc2sgPT0gKChvcGNvZGUgPj4gMTEpICYgMHgxZikpKQotCQkJYXNfd2FybiAoXygiRnNyMSBlcXVhbHMgZmRlc3Qgd2l0aCBQaXBlbGluaW5nIikpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2MnOgkJLyogbmV4dCBvcGVyYW5kIG11c3QgYmUgYSBjb250cm9sIHJlZ2lzdGVyICovCi0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJmaXIiLCAzKSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4MCA8PCAyMTsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgInBzciIsIDMpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHgxIDw8IDIxOwotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZGlyYmFzZSIsIDcpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHgyIDw8IDIxOwotCQkgIHMgKz0gNzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZGIiLCAyKSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4MyA8PCAyMTsKLQkJICBzICs9IDI7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgImZzciIsIDMpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHg0IDw8IDIxOwotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZXBzciIsIDQpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHg1IDw8IDIxOwotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzUnOgkJLyogNSBiaXQgaW1tZWRpYXRlIGluIHNyYzEgKi8KLQkgICAgICBtZW1zZXQgKCZ0aGVfaW5zbiwgJ1wwJywgc2l6ZW9mICh0aGVfaW5zbikpOwotCSAgICAgIGlmICghZ2V0RXhwcmVzc2lvbiAocykpCi0JCXsKLQkJICBzID0gZXhwcl9lbmQ7Ci0JCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgJiB+MHgxZikKLQkJICAgIGFzX2JhZCAoXygiNS1iaXQgaW1tZWRpYXRlIHRvbyBsYXJnZSIpKTsKLQkJICBvcGNvZGUgfD0gKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgJiAweDFmKSA8PCAxMTsKLQkJICBtZW1zZXQgKCZ0aGVfaW5zbiwgJ1wwJywgc2l6ZW9mICh0aGVfaW5zbikpOwotCQkgIHRoZV9pbnNuLnJlbG9jID0gTk9fUkVMT0M7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdsJzoJCS8qIDI2IGJpdCBpbW1lZGlhdGUsIHJlbGF0aXZlIGJyYW5jaCAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQlJBRERSOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdzJzoJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIHNwbGl0IHJlbGF0aXZlIGJyYW5jaCAqLwotCSAgICAgIC8qIHVwcGVyIDUgYml0cyBvZiBvZmZzZXQgaW4gZGVzdCBmaWVsZCAqLwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IFNQTElUMDsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdTJzoJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIHNwbGl0IChzdCksIGFsaWduZWQgKi8KLQkgICAgICBpZiAob3Bjb2RlICYgKDEgPDwgMjgpKQotCQlpZiAob3Bjb2RlICYgMHgxKQotCQkgIHRoZV9pbnNuLnJlbG9jID0gU1BMSVQyOwotCQllbHNlCi0JCSAgdGhlX2luc24ucmVsb2MgPSBTUExJVDE7Ci0JICAgICAgZWxzZQotCQl0aGVfaW5zbi5yZWxvYyA9IFNQTElUMDsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdJJzoJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIGFsaWduZWQgKi8KLQkgICAgICBpZiAob3Bjb2RlICYgKDEgPDwgMjgpKQotCQlpZiAob3Bjb2RlICYgMHgxKQotCQkgIHRoZV9pbnNuLnJlbG9jID0gTE9XMjsKLQkJZWxzZQotCQkgIHRoZV9pbnNuLnJlbG9jID0gTE9XMTsKLQkgICAgICBlbHNlCi0JCXRoZV9pbnNuLnJlbG9jID0gTE9XMDsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdpJzoJCS8qIDE2IGJpdCBpbW1lZGlhdGUgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IExPVzA7Ci0KLQkgICAgICAvKkZBTExUSFJPVUdIKi8KLQotCSAgICBpbW1lZGlhdGU6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJcysrOwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiaGElIiwgMykgPT0gMCkKLQkJewotCQkgIHRoZV9pbnNuLmhpZ2hsb3cgPSBISUdIQURKOwotCQkgIHMgKz0gMzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHMsICJoJSIsIDIpID09IDApCi0JCXsKLQkJICB0aGVfaW5zbi5oaWdobG93ID0gSElHSDsKLQkJICBzICs9IDI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChzLCAibCUiLCAyKSA9PSAwKQotCQl7Ci0JCSAgdGhlX2luc24uaGlnaGxvdyA9IFBBSVI7Ci0JCSAgcyArPSAyOwotCQl9Ci0JICAgICAgdGhlX2luc24uZXhwYW5kID0gaW5zbi0+ZXhwYW5kOwotCi0JICAgICAgLyogTm90ZSB0aGF0IGlmIHRoZSBnZXRFeHByZXNzaW9uKCkgZmFpbHMsIHdlIHdpbGwgc3RpbGwgaGF2ZQotCQkJCSAgIGNyZWF0ZWQgVSBlbnRyaWVzIGluIHRoZSBzeW1ib2wgdGFibGUgZm9yIHRoZSAnc3ltYm9scycKLQkJCQkgICBpbiB0aGUgaW5wdXQgc3RyaW5nLiAgVHJ5IG5vdCB0byBjcmVhdGUgVSBzeW1ib2xzIGZvcgotCQkJCSAgIHJlZ2lzdGVycywgZXRjLiAqLwotCi0JICAgICAgaWYgKCFnZXRFeHByZXNzaW9uIChzKSkKLQkJewotCQkgIHMgPSBleHByX2VuZDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgZXJyb3I6Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLQl7Ci0JICAvKiBBcmdzIGRvbid0IG1hdGNoLiAgKi8KLQkgIGlmICgmaW5zblsxXSAtIGk4NjBfb3Bjb2RlcyA8IE5VTU9QQ09ERVMKLQkgICAgICAmJiAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIHMgPSBhcmdzU3RhcnQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kcyIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgdGhlX2luc24ub3Bjb2RlID0gb3Bjb2RlOwotfQotCi1zdGF0aWMgaW50Ci1nZXRFeHByZXNzaW9uIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqc2F2ZV9pbjsKLSAgc2VnVCBzZWc7Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBzZWcgPSBleHByZXNzaW9uICgmdGhlX2luc24uZXhwKTsKLSAgaWYgKHNlZyAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLSAgICAgICYmICEgU0VHX05PUk1BTCAoc2VnKSkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5lcnJvciA9IF8oImJhZCBzZWdtZW50Iik7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotCi0vKgotICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbWRfYXRvZiBpbiBtNjhrLmMuICBJIHRoaW5rIHRoaXMgaXMgcmlnaHQsCi0gIGJ1dCBJJ20gbm90IHN1cmUuCi0KLSAgVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLQotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdyaXRlIG91dCBiaWctZW5kaWFuLgotICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuLCBmaXhQKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBpbnQgbjsKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgZW51bSByZWxvY190eXBlIHJlbG9jID0gZml4UC0+Znhfcl90eXBlICYgMHhmOwotICBlbnVtIGhpZ2hsb3dfdHlwZSBoaWdobG93ID0gKGZpeFAtPmZ4X3JfdHlwZSA+PiA0KSAmIDB4MzsKLQotICBhc3NlcnQgKGJ1Zik7Ci0gIGFzc2VydCAobiA9PSA0KTsJCS8qIGFsd2F5cyBvbiBpODYwICovCi0KLSAgc3dpdGNoIChoaWdobG93KQotICAgIHsKLQotICAgIGNhc2UgSElHSEFESjoJCS8qIGFkanVzdHMgdGhlIGhpZ2gtb3JkZXIgMTYtYml0cyAqLwotICAgICAgaWYgKHZhbCAmICgxIDw8IDE1KSkKLQl2YWwgKz0gKDEgPDwgMTYpOwotCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLQotICAgIGNhc2UgSElHSDoJCQkvKiBzZWxlY3RzIHRoZSBoaWdoLW9yZGVyIDE2LWJpdHMgKi8KLSAgICAgIHZhbCA+Pj0gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUEFJUjoJCQkvKiBzZWxlY3RzIHRoZSBsb3ctb3JkZXIgMTYtYml0cyAqLwotICAgICAgdmFsID0gdmFsICYgMHhmZmZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHN3aXRjaCAocmVsb2MpCi0gICAgewotCi0gICAgY2FzZSBCUkFERFI6CQkvKiBicixjYWxsLGJjLGJjLnQsYm5jLGJuYy50IHcvMjYtYml0IGltbWVkaWF0ZSAqLwotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsICE9IDEpCi0JYXNfYmFkIChfKCIyNi1iaXQgYnJhbmNoIHcvbyBwYyByZWxhdGl2ZSBzZXQ6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsID4+PSAyOwkJLyogYWxpZ24gcGNyZWwgb2Zmc2V0LCBzZWUgbWFudWFsICovCi0KLSAgICAgIGlmICh2YWwgPj0gKDEgPDwgMjUpIHx8IHZhbCA8IC0oMSA8PCAyNSkpCS8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLwotCWFzX2JhZCAoXygiMjYtYml0IGJyYW5jaCBvZmZzZXQgb3ZlcmZsb3c6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgYnVmWzBdID0gKGJ1ZlswXSAmIDB4ZmMpIHwgKCh2YWwgPj4gMjQpICYgMHgzKTsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNQTElUMjoJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIDQtYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHgzKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSA0LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHgzOwkJLyogNC1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIFNQTElUMToJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIDItYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHgxKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSAyLWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHgxOwkJLyogMi1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIFNQTElUMDoJCS8qIHN0LGJsYSxidGUsYnRuZSB3LzE2LWJpdCBpbW1lZGlhdGUgKi8KLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCA9PSAxKQotCXZhbCA+Pj0gMjsJCS8qIGFsaWduIHBjcmVsIG9mZnNldCwgc2VlIG1hbnVhbCAqLwotICAgICAgLyogY2hlY2sgZm9yIGJvdW5kcyAqLwotICAgICAgaWYgKGhpZ2hsb3cgIT0gUEFJUiAmJiAodmFsID49ICgxIDw8IDE2KSB8fCB2YWwgPCAtKDEgPDwgMTUpKSkKLQlhc19iYWQgKF8oIjE2LWJpdCBicmFuY2ggb2Zmc2V0IG92ZXJmbG93OiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIGJ1ZlsxXSA9IChidWZbMV0gJiB+MHgxZikgfCAoKHZhbCA+PiAxMSkgJiAweDFmKTsKLSAgICAgIGJ1ZlsyXSA9IChidWZbMl0gJiB+MHg3KSB8ICgodmFsID4+IDgpICYgMHg3KTsKLSAgICAgIGJ1ZlszXSB8PSB2YWw7CQkvKiBwZXJzZXJ2ZSBib3R0b20gb3Bjb2RlIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMT1c0OgkJCS8qIGZsZCxwZmxkLHBzdCxmbHVzaCAxNi1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweGYpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDE2LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHhmOwkJLyogMTYtYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBMT1czOgkJCS8qIGZsZCxwZmxkLHBzdCxmbHVzaCA4LWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4NykKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgOC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4NzsJCS8qIDgtYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBMT1cyOgkJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIDQtYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHgzKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSA0LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHgzOwkJLyogNC1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIExPVzE6CQkJLyogMTYgYml0IGltbWVkaWF0ZSwgMi1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDEpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDItYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDE7CQkvKiAyLWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgTE9XMDoJCQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBieXRlIGFsaWduZWQgKi8KLSAgICAgIC8qIGNoZWNrIGZvciBib3VuZHMgKi8KLSAgICAgIGlmIChoaWdobG93ICE9IFBBSVIgJiYgKHZhbCA+PSAoMSA8PCAxNikgfHwgdmFsIDwgLSgxIDw8IDE1KSkpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIG92ZXJmbG93OiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdIHw9IHZhbDsJCS8qIHBlcnNlcnZlIGJvdHRvbSBvcGNvZGUgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5PX1JFTE9DOgotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImJhZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIpLCByZWxvYyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIGk4NjAgKi8KLXZvaWQKLW1kX251bWJlcl90b19kaXNwIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLXsKLSAgYXNfZmF0YWwgKF8oIm1kX251bWJlcl90b19kaXNwXG4iKSk7Ci19Ci0KLS8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIGk4NjAgKi8KLXZvaWQKLW1kX251bWJlcl90b19maWVsZCAoYnVmLCB2YWwsIGZpeCkKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgdm9pZCAqZml4OwotewotICBhc19mYXRhbCAoXygiaTg2MF9udW1iZXJfdG9fZmllbGRcbiIpKTsKLX0KLQotLyogdGhlIGJpdC1maWVsZCBlbnRyaWVzIGluIHRoZSByZWxvY2F0aW9uX2luZm8gc3RydWN0IHBsYXlzIGhlbGwKLSAgIHdpdGggdGhlIGJ5dGUtb3JkZXIgcHJvYmxlbXMgb2YgY3Jvc3MtYXNzZW1ibHkuICBTbyBhcyBhIGhhY2ssCi0gICBJIGFkZGVkIHRoaXMgbWFjaC4gZGVwZW5kZW50IHJpIHR3aWRkbGVyLiAgVWdseSwgYnV0IGl0IGdldHMKLSAgIHlvdSB0aGVyZS4gLUtXSyAqLwotLyogb24gaTg2MDogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgbmV4dCB0aHJlZQotICAgYnl0ZXMgYXJlIGluZGV4LCBtb3N0IHNpZy4gYnl0ZSBmaXJzdC4gIEJ5dGUgNyBpcyBicm9rZW4gdXAgd2l0aAotICAgYml0IDcgYXMgcGNyZWwsIGJpdCA2IGFzIGV4dGVybiwgYW5kIHRoZSBsb3dlciBzaXggYml0cyBhcwotICAgcmVsb2NhdGlvbiB0eXBlIChoaWdobG93IDUtNCkuICBOZXh0IDQgYnl0ZXMgYXJlIGxvbmcgYWRkZW5kLiAqLwotLyogVGhhbnggYW5kIGEgdGlwIG9mIHRoZSBoYXQgdG8gTWljaGFlbCBCbG9vbSwgbWJAdHRpZGNhLnR0aS5jb20gKi8KLXZvaWQKLW1kX3JpX3RvX2NoYXJzIChyaV9wLCByaSkKLSAgICAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcmlfcCwgcmk7Ci17Ci0jaWYgMAotICB1bnNpZ25lZCBjaGFyIHRoZV9ieXRlc1tzaXplb2YgKCpyaV9wKV07Ci0KLSAgLyogdGhpcyBpcyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAodGhlX2J5dGVzLCByaS5yX2FkZHJlc3MsIHNpemVvZiAocmkucl9hZGRyZXNzKSk7Ci0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIHRoZV9ieXRlc1s0XSA9IChyaS5yX2luZGV4ID4+IDE2KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNV0gPSAocmkucl9pbmRleCA+PiA4KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNl0gPSByaS5yX2luZGV4ICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s3XSA9ICgocmkucl9leHRlcm4gPDwgNykgJiAweDgwKSB8ICgwICYgMHg2MCkgfCAocmkucl90eXBlICYgMHgxRik7Ci0gIC8qIEFsc28gZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCZ0aGVfYnl0ZXNbOF0sIHJpLnJfYWRkZW5kLCBzaXplb2YgKHJpLnJfYWRkZW5kKSk7Ci0gIC8qIG5vdyBwdXQgaXQgYmFjayB3aGVyZSB5b3UgZm91bmQgaXQsIEp1bmlvci4uLiAqLwotICBtZW1jcHkgKChjaGFyICopIHJpX3AsIHRoZV9ieXRlcywgc2l6ZW9mICgqcmlfcCkpOwotI2VuZGlmCi19Ci0KLS8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIGk4NjAgKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGFzX2ZhdGFsIChfKCJpODYwX2NvbnZlcnRfZnJhZ1xuIikpOwotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VndHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ3R5cGU7Ci17Ci0gIGFzX2ZhdGFsIChfKCJpODYwX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iKSk7Ci19Ci0KLS8qIGZvciBkZWJ1Z2dpbmcgb25seSwgbXVzdCBtYXRjaCBlbnVtIHJlbG9jX3R5cGUgKi8KLXN0YXRpYyBjaGFyICpSZWxvY1tdID0KLXsKLSAgIk5PX1JFTE9DIiwKLSAgIkJSQUREUiIsCi0gICJMT1cwIiwKLSAgIkxPVzEiLAotICAiTE9XMiIsCi0gICJMT1czIiwKLSAgIkxPVzQiLAotICAiU1BMSVQwIiwKLSAgIlNQTElUMSIsCi0gICJTUExJVDIiLAotICAiUkVMT0NfMzIiLAotfTsKLXN0YXRpYyBjaGFyICpIaWdobG93W10gPQotewotICAiTk9fU1BFQyIsCi0gICJQQUlSIiwKLSAgIkhJR0giLAotICAiSElHSEFESiIsCi19Owotc3RhdGljIHZvaWQKLXByaW50X2luc24gKGluc24pCi0gICAgIHN0cnVjdCBpODYwX2l0ICppbnNuOwotewotICBpZiAoaW5zbi0+ZXJyb3IpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6ICVzXG4iKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIm9wY29kZT0weCUwOHhcdCIsIGluc24tPm9wY29kZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4cGFuZD0weCUwOHhcdCIsIGluc24tPmV4cGFuZCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgInJlbG9jID0gJXNcdCIsIFJlbG9jW2luc24tPnJlbG9jXSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImhpZ2hsb3cgPSAlc1xuIiwgSGlnaGxvd1tpbnNuLT5oaWdobG93XSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4cCA9ICB7XG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX3N5bWJvbCA9ICVzXG4iLAotCSAgIGluc24tPmV4cC5YX2FkZF9zeW1ib2wgPwotCSAgIChTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX2FkZF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfb3Bfc3ltYm9sID0gJXNcbiIsCi0JICAgaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sID8KLQkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgOiAiPz8/IikgOiAiMCIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9hZGRfbnVtYmVyID0gJWRcbiIsCi0JICAgaW5zbi0+ZXhwLlhfYWRkX251bWJlcik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIn1cbiIpOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLX0KLQwKLSNpZmRlZiBjb21tZW50Ci0vKgotICogSTg2MCByZWxvY2F0aW9ucyBhcmUgY29tcGxldGVseSBkaWZmZXJlbnQsIHNvIGl0IG5lZWRzCi0gKiB0aGlzIG1hY2hpbmUgZGVwZW5kZW50IHJvdXRpbmUgdG8gZW1pdCB0aGVtLgotICovCi12b2lkCi1lbWl0X21hY2hpbmVfcmVsb2MgKGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICByZWdpc3RlciBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgc3RydWN0IHJlbG9jX2luZm9faTg2MCByaTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZXh0ZXJuIGNoYXIgKm5leHRfb2JqZWN0X2ZpbGVfY2hhclA7Ci0gIGxvbmcgYWRkX251bWJlcjsKLQotICBtZW1zZXQgKChjaGFyICopICZyaSwgJ1wwJywgc2l6ZW9mIChyaSkpOwotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotCi0gICAgICBpZiAoZml4UC0+Znhfcl90eXBlICYgfjB4M2YpCi0JewotCSAgYXNfZmF0YWwgKCJmaXhQLT5meF9yX3R5cGUgPSAlZFxuIiwgZml4UC0+Znhfcl90eXBlKTsKLQl9Ci0gICAgICByaS5yX3BjcmVsID0gZml4UC0+ZnhfcGNyZWw7Ci0gICAgICByaS5yX3R5cGUgPSBmaXhQLT5meF9yX3R5cGU7Ci0KLSAgICAgIGlmICgoc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5KSAhPSBOVUxMKQotCXsKLQkgIHJpLnJfYWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKwotCSAgICBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotCSAgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgcmkucl9leHRlcm4gPSAxOwotCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gc3ltYm9sUC0+c3lfbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByaS5yX2V4dGVybiA9IDA7Ci0JICAgICAgcmkucl9zeW1ib2xudW0gPSBTX0dFVF9UWVBFIChzeW1ib2xQKTsKLQkgICAgfQotCSAgaWYgKHN5bWJvbFAgJiYgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kID0gc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfYWRkcmVzczsKLQkgICAgfQotCSAgcmkucl90eXBlID0gZml4UC0+Znhfcl90eXBlOwotCSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCSAgICB7Ci0JICAgICAgLyogcHJlc2VydmUgYWN0dWFsIG9mZnNldCB2cy4gcGMgKyA0ICovCi0JICAgICAgcmkucl9hZGRlbmQgLT0gKHJpLnJfYWRkcmVzcyArIDQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKLQkgICAgfQotCi0JICBtZF9yaV90b19jaGFycyAoKGNoYXIgKikgJnJpLCByaSk7Ci0JICBhcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCAoY2hhciAqKSAmcmksIHNpemVvZiAocmkpKTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi0jaWZkZWYgT0JKX0FPVVQKLQotLyogb24gaTg2MDogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgbmV4dCB0aHJlZQotICAgYnl0ZXMgYXJlIGluZGV4LCBtb3N0IHNpZy4gYnl0ZSBmaXJzdC4gIEJ5dGUgNyBpcyBicm9rZW4gdXAgd2l0aAotICAgYml0IDcgYXMgcGNyZWwsIGJpdCA2IGFzIGV4dGVybiwgYW5kIHRoZSBsb3dlciBzaXggYml0cyBhcwotICAgcmVsb2NhdGlvbiB0eXBlIChoaWdobG93IDUtNCkuICBOZXh0IDQgYnl0ZXMgYXJlIGxvbmcgYWRkZW5kLiAqLwotCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIGxvbmcgcl9pbmRleDsKLSAgbG9uZyByX2V4dGVybjsKLSAgbG9uZyByX2FkZGVuZCA9IDA7Ci0gIGxvbmcgcl9hZGRyZXNzOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5KTsKLSAga25vdyAoIShmaXhQLT5meF9yX3R5cGUgJiB+MHgzZikpOwotCi0gIGlmICghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgcl9leHRlcm4gPSAxOwotICAgICAgcl9pbmRleCA9IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICB9Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLQkJICAgICAgcl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHdoZXJlWzRdID0gKHJfaW5kZXggPj4gMTYpICYgMHgwZmY7Ci0gIHdoZXJlWzVdID0gKHJfaW5kZXggPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSByX2luZGV4ICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoZml4UC0+ZnhfcGNyZWwgPDwgNykgJiAweDgwKQotCSAgICAgIHwgKChyX2V4dGVybiA8PCA2KSAmIDB4NDApCi0JICAgICAgfCAoZml4UC0+Znhfcl90eXBlICYgMHgzRikpOwotCi0gIGlmIChzeW1ib2xfZ2V0X2ZyYWcgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICByX2FkZGVuZCA9IHN5bWJvbF9nZXRfZnJhZyAoZml4UC0+ZnhfYWRkc3kpLT5mcl9hZGRyZXNzOwotICAgIH0KLQotICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgLyogcHJlc2VydmUgYWN0dWFsIG9mZnNldCB2cy4gcGMgKyA0ICovCi0gICAgICByX2FkZGVuZCAtPSAocl9hZGRyZXNzICsgNCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcl9hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0gICAgfQotCi0gIG1kX251bWJlcl90b19jaGFycyAoJndoZXJlWzhdLCByX2FkZGVuZCwgNCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQU9VVCAqLwotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gc2l6ZTsJCQkvKiBCeXRlIGFsaWdubWVudCBpcyBmaW5lICovCi19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBpODYwLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQsIHBsdXMKLSAgIGl0cyBzaXplLiAoPz8/IElzIHRoaXMgcmlnaHQ/ICBGSVhNRS1TT09OISkgKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKnBsYWNlID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIC8qIGxvb2tzIHRvIG1lIGxpa2UgaTg2MCBuZXZlciBoYXMgYml0IGZpeGVzLiBMZXQncyBzZWUuIHhveG9yaWNoLiAqLwotICBrbm93IChmaXhQLT5meF9iaXRfZml4UCA9PSBOVUxMKTsKLSAgaWYgKCFmaXhQLT5meF9iaXRfZml4UCkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7Ci0gICAgICBtZF9udW1iZXJfdG9faW1tIChwbGFjZSwgdmFsLCBmaXhQLT5meF9zaXplLCBmaXhQKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fZmllbGQgKHBsYWNlLCB2YWwsIGZpeFAtPmZ4X2JpdF9maXhQKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBjb21tZW50LWNvbHVtbjogMAotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy1pODYwLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTg2MC5oIGIvZ2FzL2NvbmZpZy90Yy1pODYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjIxYzEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pODYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiB0Yy1pODYwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRoZSBJODYwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX0k4NjAgMQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLWk4NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pOTYwLmMgYi9nYXMvY29uZmlnL3RjLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjMTVjMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk5NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNDkgKzAsMCBAQAotLyogdGMtaTk2MC5jIC0gQWxsIHRoZSBpODA5NjAtc3BlY2lmaWMgc3R1ZmYKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogU2VlIGNvbW1lbnQgb24gbWRfcGFyc2Vfb3B0aW9uIGZvciA4MDk2MC1zcGVjaWZpYyBpbnZvY2F0aW9uIG9wdGlvbnMuICovCi0KLS8qIFRoZXJlIGFyZSA0IGRpZmZlcmVudCBsZW5ndGhzIG9mIChwb3RlbnRpYWxseSkgc3ltYm9sLWJhc2VkIGRpc3BsYWNlbWVudHMKLSAgIGluIHRoZSA4MDk2MCBpbnN0cnVjdGlvbiBzZXQsIGVhY2ggb2Ygd2hpY2ggY291bGQgcmVxdWlyZSBhZGRyZXNzIGZpeC11cHMKLSAgIGFuZCAoaW4gdGhlIGNhc2Ugb2YgZXh0ZXJuYWwgc3ltYm9scykgZW1pc3Npb24gb2YgcmVsb2NhdGlvbiBkaXJlY3RpdmVzOgotCi0gICAzMi1iaXQgKE1FTUIpCi0gICAgICAgIFRoaXMgaXMgYSBzdGFuZGFyZCBsZW5ndGggZm9yIHRoZSBiYXNlIGFzc2VtYmxlciBhbmQgcmVxdWlyZXMgbm8KLSAgICAgICAgc3BlY2lhbCBhY3Rpb24uCi0KLSAgIDEzLWJpdCAoQ09CUikKLSAgICAgICAgVGhpcyBpcyBhIG5vbi1zdGFuZGFyZCBsZW5ndGgsIGJ1dCB0aGUgYmFzZSBhc3NlbWJsZXIgaGFzIGEKLSAgICAgICAgaG9vayBmb3IgYml0IGZpZWxkIGFkZHJlc3MgZml4dXBzOiB0aGUgZml4UyBzdHJ1Y3R1cmUgY2FuCi0gICAgICAgIHBvaW50IHRvIGEgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQsIGluIHdoaWNoIGNhc2Ugb3VyCi0gICAgICAgIG1kX251bWJlcl90b19maWVsZCgpIHJvdXRpbmUgZ2V0cyBjYWxsZWQgdG8gcHJvY2VzcyBpdC4KLQotICAgICAgICBJIG1hZGUgdGhlIGhvb2sgYSBsaXR0bGUgY2xlYW5lciBieSBoYXZpbmcgZml4X25ldygpIChpbiB0aGUgYmFzZQotICAgICAgICBhc3NlbWJsZXIpIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpeFMgaW4gcXVlc3Rpb24uICBBbmQgSSBtYWRlIGl0IGEKLSAgICAgICAgbGl0dGxlIHNpbXBsZXIgYnkgc3RvcmluZyB0aGUgZmllbGQgc2l6ZSAoaW4gdGhpcyBjYXNlIDEzKSBpbnN0ZWFkIG9mCi0gICAgICAgIG9mIGEgcG9pbnRlciB0byBhbm90aGVyIHN0cnVjdHVyZTogIDgwOTYwIGRpc3BsYWNlbWVudHMgYXJlIEFMV0FZUwotICAgICAgICBzdG9yZWQgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGEgNC1ieXRlIHdvcmQuCi0KLSAgICAgICAgU2luY2UgdGhlIHRhcmdldCBvZiBhIENPQlIgY2Fubm90IGJlIGV4dGVybmFsLCBubyByZWxvY2F0aW9uCi0gICAgICAgIGRpcmVjdGl2ZXMgZm9yIHRoaXMgc2l6ZSBkaXNwbGFjZW1lbnQgaGF2ZSB0byBiZSBnZW5lcmF0ZWQuCi0gICAgICAgIEJ1dCB0aGUgYmFzZSBhc3NlbWJsZXIgaGFkIHRvIGJlIG1vZGlmaWVkIHRvIGlzc3VlIGVycm9yCi0gICAgICAgIG1lc3NhZ2VzIGlmIHRoZSBzeW1ib2wgZGlkIHR1cm4gb3V0IHRvIGJlIGV4dGVybmFsLgotCi0gICAyNC1iaXQgKENUUkwpCi0gICAgICAgIEZpeHVwcyBhcmUgaGFuZGxlZCBhcyBmb3IgdGhlIDEzLWJpdCBjYXNlIChleGNlcHQgdGhhdCAyNCBpcyBzdG9yZWQKLSAgICAgICAgaW4gdGhlIGZpeFMpLgotCi0gICAgICAgIFRoZSByZWxvY2F0aW9uIGRpcmVjdGl2ZSBnZW5lcmF0ZWQgaXMgdGhlIHNhbWUgYXMgdGhhdCBmb3IgdGhlIDMyLWJpdAotICAgICAgICBkaXNwbGFjZW1lbnQsIGV4Y2VwdCB0aGF0IGl0J3MgUEMtcmVsYXRpdmUgKHRoZSAzMi1iaXQgZGlzcGxhY2VtZW50Ci0gICAgICAgIG5ldmVyIGlzKS4gICBUaGUgaTgwOTYwIHZlcnNpb24gb2YgdGhlIGxpbmtlciBuZWVkcyBhIG1vZCB0bwotICAgICAgICBkaXN0aW5ndWlzaCBhbmQgaGFuZGxlIHRoZSAyNC1iaXQgY2FzZS4KLQotICAgMTItYml0IChNRU1BKQotICAgICAgICBNRU1BIGZvcm1hdHMgYXJlIGFsd2F5cyBwcm9tb3RlZCB0byBNRU1CICgzMi1iaXQpIGlmIHRoZSBkaXNwbGFjZW1lbnQKLSAgICAgICAgaXMgYmFzZWQgb24gYSBzeW1ib2wsIGJlY2F1c2UgaXQgY291bGQgYmUgcmVsb2NhdGVkIGF0IGxpbmsgdGltZS4KLSAgICAgICAgVGhlIG9ubHkgdGltZSB3ZSB1c2UgdGhlIDEyLWJpdCBmb3JtYXQgaXMgaWYgYW4gYWJzb2x1dGUgdmFsdWUgb2YKLSAgICAgICAgbGVzcyB0aGFuIDQwOTYgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgbmVpdGhlciBhIGZpeHVwIG5vcgotICAgICAgICBhIHJlbG9jYXRpb24gZGlyZWN0aXZlLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvaTk2MC5oIgotCi0jaWYgZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKQotCi0jZGVmaW5lIFRDX1NfSVNfU1lTUFJPQyhzKQkoKDE8PVNfR0VUX09USEVSKHMpKSAmJiAoU19HRVRfT1RIRVIocyk8PTMyKSkKLSNkZWZpbmUgVENfU19JU19CQUxOQU1FKHMpCShTX0dFVF9PVEhFUihzKSA9PSBOX0JBTE5BTUUpCi0jZGVmaW5lIFRDX1NfSVNfQ0FMTE5BTUUocykJKFNfR0VUX09USEVSKHMpID09IE5fQ0FMTE5BTUUpCi0jZGVmaW5lIFRDX1NfSVNfQkFEUFJPQyhzKQkoKFNfR0VUX09USEVSKHMpICE9IDApICYmICFUQ19TX0lTX0NBTExOQU1FKHMpICYmICFUQ19TX0lTX0JBTE5BTUUocykgJiYgIVRDX1NfSVNfU1lTUFJPQyhzKSkKLQotI2RlZmluZSBUQ19TX1NFVF9TWVNQUk9DKHMsIHApCShTX1NFVF9PVEhFUigocyksIChwKSsxKSkKLSNkZWZpbmUgVENfU19HRVRfU1lTUFJPQyhzKQkoU19HRVRfT1RIRVIocyktMSkKLQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUocykJKFNfU0VUX09USEVSKChzKSwgTl9CQUxOQU1FKSkKLSNkZWZpbmUgVENfU19GT1JDRV9UT19DQUxMTkFNRShzKQkoU19TRVRfT1RIRVIoKHMpLCBOX0NBTExOQU1FKSkKLSNkZWZpbmUgVENfU19GT1JDRV9UT19TWVNQUk9DKHMpCXs7fQotCi0jZWxzZSAvKiAhIE9CSl9BL0JPVVQgKi8KLSNpZmRlZiBPQkpfQ09GRgotCi0jZGVmaW5lIFRDX1NfSVNfU1lTUFJPQyhzKQkoU19HRVRfU1RPUkFHRV9DTEFTUyhzKSA9PSBDX1NDQUxMKQotI2RlZmluZSBUQ19TX0lTX0JBTE5BTUUocykJKFNGX0dFVF9CQUxOQU1FKHMpKQotI2RlZmluZSBUQ19TX0lTX0NBTExOQU1FKHMpCShTRl9HRVRfQ0FMTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfSVNfQkFEUFJPQyhzKQkoVENfU19JU19TWVNQUk9DKHMpICYmIFRDX1NfR0VUX1NZU1BST0MocykgPCAwICYmIDMxIDwgVENfU19HRVRfU1lTUFJPQyhzKSkKLQotI2RlZmluZSBUQ19TX1NFVF9TWVNQUk9DKHMsIHApCSgocyktPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzFdLnhfc2MueF9zdGluZHggPSAocCkpCi0jZGVmaW5lIFRDX1NfR0VUX1NZU1BST0MocykJKChzKS0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMV0ueF9zYy54X3N0aW5keCkKLQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUocykJKFNGX1NFVF9CQUxOQU1FKHMpKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0NBTExOQU1FKHMpCShTRl9TRVRfQ0FMTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fU1lTUFJPQyhzKQkoU19TRVRfU1RPUkFHRV9DTEFTUygocyksIENfU0NBTEwpKQotCi0jZWxzZSAvKiAhIE9CSl9DT0ZGICovCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQ19TX0lTX1NZU1BST0MocykJMAotCi0jZGVmaW5lIFRDX1NfSVNfQkFMTkFNRShzKQkwCi0jZGVmaW5lIFRDX1NfSVNfQ0FMTE5BTUUocykJMAotI2RlZmluZSBUQ19TX0lTX0JBRFBST0MocykJMAotCi0jZGVmaW5lIFRDX1NfU0VUX1NZU1BST0MocywgcCkKLSNkZWZpbmUgVENfU19HRVRfU1lTUFJPQyhzKSAwCi0KLSNkZWZpbmUgVENfU19GT1JDRV9UT19CQUxOQU1FKHMpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQ0FMTE5BTUUocykKLSNkZWZpbmUgVENfU19GT1JDRV9UT19TWVNQUk9DKHMpCi0jZWxzZQotICNlcnJvciBDT0ZGLCBhLm91dCwgYi5vdXQsIGFuZCBFTEYgYXJlIHRoZSBvbmx5IHN1cHBvcnRlZCBmb3JtYXRzLgotI2VuZGlmIC8qICEgT0JKX0VMRiAqLwotI2VuZGlmIC8qICEgT0JKX0NPRkYgKi8KLSNlbmRpZiAvKiAhIE9CSl9BL0JPVVQgKi8KLQotZXh0ZXJuIGNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsKLQotI2lmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhZGVmaW5lZCAoQkZEKQotI2lmZGVmIE9CSl9DT0ZGCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJlbG9jKTsKLSNlbHNlIC8qIE9CSl9DT0ZGICovCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLSNlbmRpZgotCi0vKiBMb2NhbCBpODA5NjAgcm91dGluZXMuICAqLwotCi1zdGF0aWMgdm9pZCBicmNudF9lbWl0ICgpOwkvKiBFbWl0IGJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbiBjb2RlICovCi1zdGF0aWMgY2hhciAqYnJsYWJfbmV4dCAoKTsJLyogUmV0dXJuIG5leHQgYnJhbmNoIGxvY2FsIGxhYmVsICovCi12b2lkIGJydGFiX2VtaXQgKCk7CQkvKiBFbWl0IGJyLXByZWRpY3QgaW5zdHJ1bWVudGF0aW9uIHRhYmxlICovCi1zdGF0aWMgdm9pZCBjb2JyX2ZtdCAoKTsJLyogR2VuZXJhdGUgQ09CUiBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQgY3RybF9mbXQgKCk7CS8qIEdlbmVyYXRlIENUUkwgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyBjaGFyICplbWl0ICgpOwkJLyogRW1pdCAoaW50ZXJuYWxseSkgYmluYXJ5ICovCi1zdGF0aWMgaW50IGdldF9hcmdzICgpOwkJLyogQnJlYWsgYXJndW1lbnRzIG91dCBvZiBjb21tYS1zZXBhcmF0ZWQgbGlzdCAqLwotc3RhdGljIHZvaWQgZ2V0X2NkaXNwICgpOwkvKiBIYW5kbGUgQ09CUiBvciBDVFJMIGRpc3BsYWNlbWVudCAqLwotc3RhdGljIGNoYXIgKmdldF9pc3BlYyAoKTsJLyogRmluZCBpbmRleCBzcGVjaWZpY2F0aW9uIHN0cmluZyAqLwotc3RhdGljIGludCBnZXRfcmVnbnVtICgpOwkvKiBUcmFuc2xhdGUgdGV4dCB0byByZWdpc3RlciBudW1iZXIgKi8KLXN0YXRpYyBpbnQgaV9zY2FuICgpOwkJLyogTGV4aWNhbCBzY2FuIG9mIGluc3RydWN0aW9uIHNvdXJjZSAqLwotc3RhdGljIHZvaWQgbWVtX2ZtdCAoKTsJCS8qIEdlbmVyYXRlIE1FTUEgb3IgTUVNQiBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQgbWVtYV90b19tZW1iICgpOwkvKiBDb252ZXJ0IE1FTUEgaW5zdHJ1Y3Rpb24gdG8gTUVNQiBmb3JtYXQgKi8KLXN0YXRpYyB2b2lkIHBhcnNlX2V4cHIgKCk7CS8qIFBhcnNlIGFuIGV4cHJlc3Npb24gKi8KLXN0YXRpYyBpbnQgcGFyc2VfbGRjb25zdCAoKTsJLyogUGFyc2UgYW5kIHJlcGxhY2UgYSAnbGRjb25zdCcgcHNldWRvLW9wICovCi1zdGF0aWMgdm9pZCBwYXJzZV9tZW1vcCAoKTsJLyogUGFyc2UgYSBtZW1vcnkgb3BlcmFuZCAqLwotc3RhdGljIHZvaWQgcGFyc2VfcG8gKCk7CS8qIFBhcnNlIG1hY2hpbmUtZGVwZW5kZW50IHBzZXVkby1vcCAqLwotc3RhdGljIHZvaWQgcGFyc2VfcmVnb3AgKCk7CS8qIFBhcnNlIGEgcmVnaXN0ZXIgb3BlcmFuZCAqLwotc3RhdGljIHZvaWQgcmVnX2ZtdCAoKTsJCS8qIEdlbmVyYXRlIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbiAqLwotdm9pZCByZWxvY19jYWxsaiAoKTsJCS8qIFJlbG9jYXRlIGEgJ2NhbGxqJyBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQgcmVsYXhfY29iciAoKTsJLyogIkRlLW9wdGltaXplIiBjb2JyIGludG8gY29tcGFyZS9icmFuY2ggKi8KLXN0YXRpYyB2b2lkIHNfbGVhZnByb2MgKCk7CS8qIFByb2Nlc3MgJy5sZWFmcHJvYycgcHNldWRvLW9wICovCi1zdGF0aWMgdm9pZCBzX3N5c3Byb2MgKCk7CS8qIFByb2Nlc3MgJy5zeXNwcm9jJyBwc2V1ZG8tb3AgKi8KLXN0YXRpYyBpbnQgc2hpZnRfb2sgKCk7CQkvKiBXaWxsIGEgJ3NobG8nIHN1YnN0aXR1cmUgZm9yIGEgJ2xkY29uc3QnPyAqLwotc3RhdGljIHZvaWQgc3ludGF4ICgpOwkJLyogR2l2ZSBzeW50YXggZXJyb3IgKi8KLXN0YXRpYyBpbnQgdGFyZ19oYXNfc2ZyICgpOwkvKiBUYXJnZXQgY2hpcCBzdXBwb3J0cyBzcGVjLWZ1bmMgcmVnaXN0ZXI/ICovCi1zdGF0aWMgaW50IHRhcmdfaGFzX2ljbGFzcyAoKTsJLyogVGFyZ2V0IGNoaXAgc3VwcG9ydHMgaW5zdHJ1Y3Rpb24gc2V0PyAqLwotCi0vKiBTZWUgbWRfcGFyc2Vfb3B0aW9uKCkgZm9yIG1lYW5pbmdzIG9mIHRoZXNlIG9wdGlvbnMgKi8KLXN0YXRpYyBjaGFyIG5vcmVsYXg7CQkvKiBUcnVlIGlmIC1ub3JlbGF4IHN3aXRjaCBzZWVuICovCi1zdGF0aWMgY2hhciBpbnN0cnVtZW50X2JyYW5jaGVzOwkvKiBUcnVlIGlmIC1iIHN3aXRjaCBzZWVuICovCi0KLS8qIENoYXJhY3RlcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LgotICAgSWYgdGhlIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4KLSAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dC4KLQotICAgTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4KLSAqLwotCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gKi8KLQotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbMV07Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbMV07Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsCi0gICBhcyBpbiAwZjEyLjQ1NiBvciAwZDEuMjM0NWUxMgotICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImZGZER0VCI7Ci0KLQotLyogVGFibGUgdXNlZCBieSBiYXNlIGFzc2VtYmxlciB0byByZWxheCBhZGRyZXNzZXMgYmFzZWQgb24gdmFyeWluZyBsZW5ndGgKLSAgIGluc3RydWN0aW9ucy4gIFRoZSBmaWVsZHMgYXJlOgotICAgICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAgIDIpIG1vc3QgbmVnYXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgICAgMykgaG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLgotCi0gICBGb3IgaTgwOTYwLCB0aGUgb25seSBhcHBsaWNhdGlvbiBpcyB0aGUgKGRlLSlvcHRpbWl6YXRpb24gb2YgY29icgotICAgaW5zdHJ1Y3Rpb25zIGludG8gc2VwYXJhdGUgY29tcGFyZSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucyB3aGVuIGEgMTMtYml0Ci0gICBkaXNwbGFjZW1lbnQgd29uJ3QgaGFjayBpdC4KLSAqLwotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHswLCAwLCAwLCAwfSwJCQkvKiBTdGF0ZSAwID0+IG5vIG1vcmUgcmVsYXhhdGlvbiBwb3NzaWJsZSAqLwotICB7NDA4OCwgLTQwOTYsIDAsIDJ9LAkJLyogU3RhdGUgMTogY29uZGl0aW9uYWwgYnJhbmNoIChjb2JyKSAqLwotICB7MHg4MDAwMDAgLSA4LCAtMHg4MDAwMDAsIDQsIDB9LAkvKiBTdGF0ZSAyOiBjb21wYXJlIChyZWcpICYgYnJhbmNoIChjdHJsKSAqLwotfTsKLQotc3RhdGljIHZvaWQgc19lbmRpYW4gUEFSQU1TICgoaW50KSk7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgbWFjaGluZSBkZXBlbmRlbnQgcHNldWRvLW9wcy4KLQotICAgVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgICAgICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgICAgICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICAgICAgIGludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gKi8KLSNkZWZpbmUgU19MRUFGUFJPQwkxCi0jZGVmaW5lIFNfU1lTUFJPQwkyCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiYnNzIiwgc19sY29tbSwgMX0sCi0gIHsiZW5kaWFuIiwgc19lbmRpYW4sIDB9LAotICB7ImV4dGVuZGVkIiwgZmxvYXRfY29ucywgJ3QnfSwKLSAgeyJsZWFmcHJvYyIsIHBhcnNlX3BvLCBTX0xFQUZQUk9DfSwKLSAgeyJzeXNwcm9jIiwgcGFyc2VfcG8sIFNfU1lTUFJPQ30sCi0KLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIHsicXVhZCIsIGNvbnMsIDE2fSwKLQotICB7MCwgMCwgMH0KLX07Ci0MCi0vKiBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvIGZyb20gYW4gJ2V4cHJlc3Npb25TJyBzdHJ1Y3R1cmUgJ2UnICovCi0jZGVmaW5lIGFkZHMoZSkJZS5YX2FkZF9zeW1ib2wKLSNkZWZpbmUgb2ZmcyhlKQllLlhfYWRkX251bWJlcgotCi0KLS8qIEJyYW5jaC1wcmVkaWN0aW9uIGJpdHMgZm9yIENUUkwvQ09CUiBmb3JtYXQgb3Bjb2RlcyAqLwotI2RlZmluZSBCUF9NQVNLCQkweDAwMDAwMDAyCS8qIE1hc2sgZm9yIGJyYW5jaC1wcmVkaWN0aW9uIGJpdCAqLwotI2RlZmluZSBCUF9UQUtFTgkweDAwMDAwMDAwCS8qIFZhbHVlIHRvIE9SIGluIHRvIHByZWRpY3QgYnJhbmNoICovCi0jZGVmaW5lIEJQX05PVF9UQUtFTgkweDAwMDAwMDAyCS8qIFZhbHVlIHRvIE9SIGluIHRvIHByZWRpY3Qgbm8gYnJhbmNoICovCi0KLQotLyogU29tZSBpbnN0cnVjdGlvbiBvcGNvZGVzIHRoYXQgd2UgbmVlZCBleHBsaWNpdGx5ICovCi0jZGVmaW5lIEJFCTB4MTIwMDAwMDAKLSNkZWZpbmUgQkcJMHgxMTAwMDAwMAotI2RlZmluZSBCR0UJMHgxMzAwMDAwMAotI2RlZmluZSBCTAkweDE0MDAwMDAwCi0jZGVmaW5lIEJMRQkweDE2MDAwMDAwCi0jZGVmaW5lIEJORQkweDE1MDAwMDAwCi0jZGVmaW5lIEJOTwkweDEwMDAwMDAwCi0jZGVmaW5lIEJPCTB4MTcwMDAwMDAKLSNkZWZpbmUgQ0hLQklUCTB4NWEwMDI3MDAKLSNkZWZpbmUgQ01QSQkweDVhMDAyMDgwCi0jZGVmaW5lIENNUE8JMHg1YTAwMjAwMAotCi0jZGVmaW5lIEIJMHgwODAwMDAwMAotI2RlZmluZSBCQUwJMHgwYjAwMDAwMAotI2RlZmluZSBDQUxMCTB4MDkwMDAwMDAKLSNkZWZpbmUgQ0FMTFMJMHg2NjAwMzgwMAotI2RlZmluZSBSRVQJMHgwYTAwMDAwMAotCi0KLS8qIFRoZXNlIG1hc2tzIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIGEgc2V0IG9mIE1FTUIgbW9kZSBiaXRzLiAqLwotI2RlZmluZQlBX0JJVAkJMHgwNDAwCi0jZGVmaW5lCUlfQklUCQkweDA4MDAKLSNkZWZpbmUgTUVNQl9CSVQJMHgxMDAwCi0jZGVmaW5lCURfQklUCQkweDIwMDAKLQotCi0vKiBNYXNrIGZvciB0aGUgb25seSBtb2RlIGJpdCBpbiBhIE1FTUEgaW5zdHJ1Y3Rpb24gKGlmIHNldCwgYWJhc2UgcmVnIGlzCi0gICB1c2VkKS4gICovCi0jZGVmaW5lIE1FTUFfQUJBU0UJMHgyMDAwCi0KLS8qIEluZm8gZnJvbSB3aGljaCBhIE1FTUEgb3IgTUVNQiBmb3JtYXQgaW5zdHJ1Y3Rpb24gY2FuIGJlIGdlbmVyYXRlZCAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIC8qIChGaXJzdCkgMzIgYml0cyBvZiBpbnN0cnVjdGlvbiAqLwotICAgIGxvbmcgb3Bjb2RlOwotICAgIC8qIDAtKG5vbmUpLCAxMi0gb3IsIDMyLWJpdCBkaXNwbGFjZW1lbnQgbmVlZGVkICovCi0gICAgaW50IGRpc3A7Ci0gICAgLyogVGhlIGV4cHJlc3Npb24gaW4gdGhlIHNvdXJjZSBpbnN0cnVjdGlvbiBmcm9tIHdoaWNoIHRoZQotICAgICAgIGRpc3BsYWNlbWVudCBzaG91bGQgYmUgZGV0ZXJtaW5lZC4gICovCi0gICAgY2hhciAqZTsKLSAgfQotCi1tZW1TOwotCi0KLS8qIFRoZSB0d28gcGllY2VzIG9mIGluZm8gd2UgbmVlZCB0byBnZW5lcmF0ZSBhIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLXN0cnVjdCByZWdvcAotICB7Ci0gICAgaW50IG1vZGU7CQkJLyogMCA9PmxvY2FsL2dsb2JhbC9zcGVjIHJlZzsgMT0+IGxpdGVyYWwgb3IgZnAgcmVnICovCi0gICAgaW50IHNwZWNpYWw7CQkvKiAwID0+bm90IGEgc2ZyOyAgMT0+IGlzIGEgc2ZyIChub3QgdmFsaWQgdy9tb2RlPTApICovCi0gICAgaW50IG47CQkJLyogUmVnaXN0ZXIgbnVtYmVyIG9yIGxpdGVyYWwgdmFsdWUgKi8KLSAgfTsKLQotCi0vKiBOdW1iZXIgYW5kIGFzc2VtYmxlciBtbmVtb25pYyBmb3IgYWxsIHJlZ2lzdGVycyB0aGF0IGNhbiBhcHBlYXIgaW4KLSAgIG9wZXJhbmRzLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKnJlZ19uYW1lOwotICAgIGludCByZWdfbnVtOwotICB9Ci1yZWduYW1lc1tdID0KLXsKLSAgeyAicGZwIiwgMCB9LAotICB7ICJzcCIsIDEgfSwKLSAgeyAicmlwIiwgMiB9LAotICB7ICJyMyIsIDMgfSwKLSAgeyAicjQiLCA0IH0sCi0gIHsgInI1IiwgNSB9LAotICB7ICJyNiIsIDYgfSwKLSAgeyAicjciLCA3IH0sCi0gIHsgInI4IiwgOCB9LAotICB7ICJyOSIsIDkgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAiZzAiLCAxNiB9LAotICB7ICJnMSIsIDE3IH0sCi0gIHsgImcyIiwgMTggfSwKLSAgeyAiZzMiLCAxOSB9LAotICB7ICJnNCIsIDIwIH0sCi0gIHsgImc1IiwgMjEgfSwKLSAgeyAiZzYiLCAyMiB9LAotICB7ICJnNyIsIDIzIH0sCi0gIHsgImc4IiwgMjQgfSwKLSAgeyAiZzkiLCAyNSB9LAotICB7ICJnMTAiLCAyNiB9LAotICB7ICJnMTEiLCAyNyB9LAotICB7ICJnMTIiLCAyOCB9LAotICB7ICJnMTMiLCAyOSB9LAotICB7ICJnMTQiLCAzMCB9LAotICB7ICJmcCIsIDMxIH0sCi0KLSAgLyogTnVtYmVycyBmb3Igc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlcnMgYXJlIGZvciBhc3NlbWJsZXIgaW50ZXJuYWwKLSAgICAgdXNlIG9ubHk6IHRoZXkgYXJlIHNjYWxlZCBiYWNrIHRvIHJhbmdlIFswLTMxXSBmb3IgYmluYXJ5IG91dHB1dC4gICovCi0jZGVmaW5lIFNGMAkzMgotCi0gIHsgInNmMCIsIDMyIH0sCi0gIHsgInNmMSIsIDMzIH0sCi0gIHsgInNmMiIsIDM0IH0sCi0gIHsgInNmMyIsIDM1IH0sCi0gIHsgInNmNCIsIDM2IH0sCi0gIHsgInNmNSIsIDM3IH0sCi0gIHsgInNmNiIsIDM4IH0sCi0gIHsgInNmNyIsIDM5IH0sCi0gIHsgInNmOCIsIDQwIH0sCi0gIHsgInNmOSIsIDQxIH0sCi0gIHsgInNmMTAiLCA0MiB9LAotICB7ICJzZjExIiwgNDMgfSwKLSAgeyAic2YxMiIsIDQ0IH0sCi0gIHsgInNmMTMiLCA0NSB9LAotICB7ICJzZjE0IiwgNDYgfSwKLSAgeyAic2YxNSIsIDQ3IH0sCi0gIHsgInNmMTYiLCA0OCB9LAotICB7ICJzZjE3IiwgNDkgfSwKLSAgeyAic2YxOCIsIDUwIH0sCi0gIHsgInNmMTkiLCA1MSB9LAotICB7ICJzZjIwIiwgNTIgfSwKLSAgeyAic2YyMSIsIDUzIH0sCi0gIHsgInNmMjIiLCA1NCB9LAotICB7ICJzZjIzIiwgNTUgfSwKLSAgeyAic2YyNCIsIDU2IH0sCi0gIHsgInNmMjUiLCA1NyB9LAotICB7ICJzZjI2IiwgNTggfSwKLSAgeyAic2YyNyIsIDU5IH0sCi0gIHsgInNmMjgiLCA2MCB9LAotICB7ICJzZjI5IiwgNjEgfSwKLSAgeyAic2YzMCIsIDYyIH0sCi0gIHsgInNmMzEiLCA2MyB9LAotCi0gIC8qIE51bWJlcnMgZm9yIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhcmUgZm9yIGFzc2VtYmxlciBpbnRlcm5hbAotICAgICB1c2Ugb25seTogdGhleSBhcmUgc2NhbGVkIGJhY2sgdG8gWzAtM10gZm9yIGJpbmFyeSBvdXRwdXQuICAqLwotI2RlZmluZSBGUDAJNjQKLQotICB7ICJmcDAiLCA2NCB9LAotICB7ICJmcDEiLCA2NSB9LAotICB7ICJmcDIiLCA2NiB9LAotICB7ICJmcDMiLCA2NyB9LAotCi0gIHsgTlVMTCwgMCB9LAkJCQkvKiBFTkQgT0YgTElTVCAqLwotfTsKLQotI2RlZmluZQlJU19SR19SRUcobikJKCgwIDw9IChuKSkgJiYgKChuKSA8IFNGMCkpCi0jZGVmaW5lCUlTX1NGX1JFRyhuKQkoKFNGMCA8PSAobikpICYmICgobikgPCBGUDApKQotI2RlZmluZQlJU19GUF9SRUcobikJKChuKSA+PSBGUDApCi0KLS8qIE51bWJlciBhbmQgYXNzZW1ibGVyIG1uZW1vbmljIGZvciBhbGwgcmVnaXN0ZXJzIHRoYXQgY2FuIGFwcGVhciBhcwotICAgJ2FiYXNlJyAoaW5kaXJlY3QgYWRkcmVzc2luZykgcmVnaXN0ZXJzLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKmFyZWdfbmFtZTsKLSAgICBpbnQgYXJlZ19udW07Ci0gIH0KLWFyZWdzW10gPQotewotICB7ICIocGZwKSIsIDAgfSwKLSAgeyAiKHNwKSIsIDEgfSwKLSAgeyAiKHJpcCkiLCAyIH0sCi0gIHsgIihyMykiLCAzIH0sCi0gIHsgIihyNCkiLCA0IH0sCi0gIHsgIihyNSkiLCA1IH0sCi0gIHsgIihyNikiLCA2IH0sCi0gIHsgIihyNykiLCA3IH0sCi0gIHsgIihyOCkiLCA4IH0sCi0gIHsgIihyOSkiLCA5IH0sCi0gIHsgIihyMTApIiwgMTAgfSwKLSAgeyAiKHIxMSkiLCAxMSB9LAotICB7ICIocjEyKSIsIDEyIH0sCi0gIHsgIihyMTMpIiwgMTMgfSwKLSAgeyAiKHIxNCkiLCAxNCB9LAotICB7ICIocjE1KSIsIDE1IH0sCi0gIHsgIihnMCkiLCAxNiB9LAotICB7ICIoZzEpIiwgMTcgfSwKLSAgeyAiKGcyKSIsIDE4IH0sCi0gIHsgIihnMykiLCAxOSB9LAotICB7ICIoZzQpIiwgMjAgfSwKLSAgeyAiKGc1KSIsIDIxIH0sCi0gIHsgIihnNikiLCAyMiB9LAotICB7ICIoZzcpIiwgMjMgfSwKLSAgeyAiKGc4KSIsIDI0IH0sCi0gIHsgIihnOSkiLCAyNSB9LAotICB7ICIoZzEwKSIsIDI2IH0sCi0gIHsgIihnMTEpIiwgMjcgfSwKLSAgeyAiKGcxMikiLCAyOCB9LAotICB7ICIoZzEzKSIsIDI5IH0sCi0gIHsgIihnMTQpIiwgMzAgfSwKLSAgeyAiKGZwKSIsIDMxIH0sCi0KLSNkZWZpbmUgSVBSRUwJMzIKLSAgLyogRm9yIGFzc2VtYmxlciBpbnRlcm5hbCB1c2Ugb25seTogdGhpcyBudW1iZXIgbmV2ZXIgYXBwZWFycyBpbiBiaW5hcnkKLSAgICAgb3V0cHV0LiAgKi8KLSAgeyAiKGlwKSIsIElQUkVMIH0sCi0KLSAgeyBOVUxMLCAwIH0sCQkJCS8qIEVORCBPRiBMSVNUICovCi19OwotCi0KLS8qIEhhc2ggdGFibGVzICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnJlZ19oYXNoOwkvKiBSZWdpc3RlciBuYW1lIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICphcmVnX2hhc2g7CS8qIEFiYXNlIHJlZ2lzdGVyIGhhc2ggdGFibGUgKi8KLQotCi0vKiBBcmNoaXRlY3R1cmUgZm9yIHdoaWNoIHdlIGFyZSBhc3NlbWJsaW5nICovCi0jZGVmaW5lIEFSQ0hfQU5ZCTAJLyogRGVmYXVsdDogbm8gYXJjaGl0ZWN0dXJlIGNoZWNraW5nIGRvbmUgKi8KLSNkZWZpbmUgQVJDSF9LQQkJMQotI2RlZmluZSBBUkNIX0tCCQkyCi0jZGVmaW5lIEFSQ0hfTUMJCTMKLSNkZWZpbmUgQVJDSF9DQQkJNAotI2RlZmluZSBBUkNIX0pYCQk1Ci0jZGVmaW5lIEFSQ0hfSFgJCTYKLWludCBhcmNoaXRlY3R1cmUgPSBBUkNIX0FOWTsJLyogQXJjaGl0ZWN0dXJlIHJlcXVlc3RlZCBvbiBpbnZvY2F0aW9uIGxpbmUgKi8KLWludCBpY2xhc3Nlc19zZWVuOwkJLyogT1Igb2YgaW5zdHJ1Y3Rpb24gY2xhc3NlcyAoSV8qIGNvbnN0YW50cykKLQkJCQkgKiAgICBmb3Igd2hpY2ggd2UndmUgYWN0dWFsbHkgYXNzZW1ibGVkCi0JCQkJICogICAgICBpbnN0cnVjdGlvbnMuCi0JCQkJICovCi0KLQotLyogQlJBTkNILVBSRURJQ1RJT04gSU5TVFJVTUVOVEFUSU9OCi0KLSAgICAgICAgVGhlIGZvbGxvd2luZyBzdXBwb3J0cyBnZW5lcmF0aW9uIG9mIGJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbgotICAgICAgICAodHVybmVkIG9uIGJ5IC1iIHN3aXRjaCkuICBUaGUgaW5zdHJ1bWVudGF0aW9uIGNvbGxlY3RzIGNvdW50cwotICAgICAgICBvZiBicmFuY2hlcyB0YWtlbi9ub3QtdGFrZW4gZm9yIGxhdGVyIGlucHV0IHRvIGEgdXRpbGl0eSB0aGF0IHdpbGwKLSAgICAgICAgc2V0IHRoZSBicmFuY2ggcHJlZGljdGlvbiBiaXRzIG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4gYWNjb3JkYW5jZSB3aXRoCi0gICAgICAgIHRoZSBiZWhhdmlvciBvYnNlcnZlZC4gIChOb3RlIHRoYXQgdGhlIEtYIHNlcmllcyBkb2VzIG5vdCBoYXZlCi0gICAgICAgIGJyYWNoLXByZWRpY3Rpb24uKQotCi0gICAgICAgIFRoZSBpbnN0cnVtZW50YXRpb24gY29uc2lzdHMgb2Y6Ci0KLSAgICAgICAgKDEpIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBjb25kaXRpb25hbCBicmFuY2gsIGEgY2FsbCB0byBhbiBleHRlcm5hbAotICAgICAgICAgICAgcm91dGluZSB0aGF0IGluY3JlbWVudHMgYW5kIHN0ZXBzIG92ZXIgYW4gaW5saW5lIGNvdW50ZXIuICBUaGUKLSAgICAgICAgICAgIGNvdW50ZXIgaXRzZWxmLCBpbml0aWFsaXplZCB0byAwLCBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBjYWxsCi0gICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEZvciBlYWNoIGJyYW5jaCwgdGhlIGNvdW50ZXIgZm9sbG93aW5nIHRoZSBicmFuY2gKLSAgICAgICAgICAgIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGJyYW5jaCB3YXMgbm90IHRha2VuLCBhbmQgdGhlIGRpZmZlcmVuY2UKLSAgICAgICAgICAgIGJldHdlZW4gdGhlIGNvdW50ZXJzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgaXQgd2FzIHRha2VuLiAgQW4KLSAgICAgICAgICAgIGV4YW1wbGUgb2YgYW4gaW5zdHJ1bWVudGVkIGNvbmRpdGlvbmFsIGJyYW5jaDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsICAgIEJSX0NOVF9GVU5DCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53b3JkICAgMAotICAgICAgICAgICAgICAgIExCUkFOQ0gyMzogICAgICBiZSAgICAgIGxhYmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgICAgQlJfQ05UX0ZVTkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndvcmQgICAwCi0KLSAgICAgICAgKDIpIGEgdGFibGUgb2YgcG9pbnRlcnMgdG8gdGhlIGluc3RydW1lbnRlZCBicmFuY2hlcywgc28gdGhhdCBhbgotICAgICAgICAgICAgZXh0ZXJuYWwgcG9zdHByb2Nlc3Npbmcgcm91dGluZSBjYW4gbG9jYXRlIGFsbCBvZiB0aGUgY291bnRlcnMuCi0gICAgICAgICAgICB0aGUgdGFibGUgYmVnaW5zIHdpdGggYSAyLXdvcmQgaGVhZGVyOiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgaW4KLSAgICAgICAgICAgIGEgbGlua2VkIGxpc3Qgb2Ygc3VjaCB0YWJsZXMgKGluaXRpYWxpemVkIHRvIDApOyAgYW5kIGEgY291bnQKLSAgICAgICAgICAgIG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGFibGUgKGV4Y2x1c2l2ZSBvZiB0aGUgaGVhZGVyLgotCi0gICAgICAgICAgICBOb3RlIHRoYXQgaW5wdXQgc291cmNlIGNvZGUgaXMgZXhwZWN0ZWQgdG8gYWxyZWFkeSBjb250YWluIGNhbGxzCi0gICAgICAgICAgICBhbiBleHRlcm5hbCByb3V0aW5lIHRoYXQgd2lsbCBsaW5rIHRoZSBicmFuY2ggbG9jYWwgdGFibGUgaW50byBhCi0gICAgICAgICAgICBsaXN0IG9mIHN1Y2ggdGFibGVzLgotICovCi0KLS8qIE51bWJlciBvZiBicmFuY2hlcyBpbnN0cnVtZW50ZWQgc28gZmFyLiAgQWxzbyB1c2VkIHRvIGdlbmVyYXRlCi0gICB1bmlxdWUgbG9jYWwgbGFiZWxzIGZvciBlYWNoIGluc3RydW1lbnRlZCBicmFuY2guICAqLwotc3RhdGljIGludCBicl9jbnQ7Ci0KLSNkZWZpbmUgQlJfTEFCRUxfQkFTRQkiTEJSQU5DSCIKLS8qIEJhc2VuYW1lIG9mIGxvY2FsIGxhYmVscyBvbiBpbnN0cnVtZW50ZWQgYnJhbmNoZXMsIHRvIGF2b2lkCi0gICBjb25mbGljdCB3aXRoIGNvbXBpbGVyLSBnZW5lcmF0ZWQgbG9jYWwgbGFiZWxzLiAgKi8KLQotI2RlZmluZSBCUl9DTlRfRlVOQwkiX19pbmNfYnJhbmNoIgotLyogTmFtZSBvZiB0aGUgZXh0ZXJuYWwgcm91dGluZSB0aGF0IHdpbGwgaW5jcmVtZW50IChhbmQgc3RlcCBvdmVyKSBhbgotICAgaW5saW5lIGNvdW50ZXIuICAqLwotCi0jZGVmaW5lIEJSX1RBQl9OQU1FCSJfX0JSQU5DSF9UQUJMRV9fIgotLyogTmFtZSBvZiB0aGUgdGFibGUgb2YgcG9pbnRlcnMgdG8gYnJhbmNoZXMuICBBIGxvY2FsIChpLmUuLAotICAgbm9uLWV4dGVybmFsKSBzeW1ib2wuICAqLwotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9iZWdpbjogIE9uZS10aW1lIGluaXRpYWxpemF0aW9uLgotCi0gIAlTZXQgdXAgaGFzaCB0YWJsZXMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBpbnQgaTsJCQkvKiBMb29wIGNvdW50ZXIgKi8KLSAgY29uc3Qgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsJLyogUG9pbnRlciBpbnRvIG9wY29kZSB0YWJsZSAqLwotICBjb25zdCBjaGFyICpyZXR2YWw7CQkvKiBWYWx1ZSByZXR1cm5lZCBieSBoYXNoIGZ1bmN0aW9ucyAqLwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgcmVnX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgYXJlZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgYmFzZSBhc3NlbWJsZXIgdXNlcyBhbiBlbXB0eSBzdHJpbmcgZm9yICJubwotICAgICBlcnJvciBtZXNzYWdlIiwgaW5zdGVhZCBvZiBhIE5VTEwgcG9pbnRlci4gICovCi0gIHJldHZhbCA9IDA7Ci0KLSAgZm9yIChvUCA9IGk5NjBfb3Bjb2Rlczsgb1AtPm5hbWUgJiYgIXJldHZhbDsgb1ArKykKLSAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgb1AtPm5hbWUsIChQVFIpIG9QKTsKLQotICBmb3IgKGkgPSAwOyByZWduYW1lc1tpXS5yZWdfbmFtZSAmJiAhcmV0dmFsOyBpKyspCi0gICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKHJlZ19oYXNoLCByZWduYW1lc1tpXS5yZWdfbmFtZSwKLQkJCSAgKGNoYXIgKikgJnJlZ25hbWVzW2ldLnJlZ19udW0pOwotCi0gIGZvciAoaSA9IDA7IGFyZWdzW2ldLmFyZWdfbmFtZSAmJiAhcmV0dmFsOyBpKyspCi0gICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKGFyZWdfaGFzaCwgYXJlZ3NbaV0uYXJlZ19uYW1lLAotCQkJICAoY2hhciAqKSAmYXJlZ3NbaV0uYXJlZ19udW0pOwotCi0gIGlmIChyZXR2YWwpCi0gICAgYXNfZmF0YWwgKF8oIkhhc2hpbmcgcmV0dXJuZWQgXCIlc1wiLiIpLCByZXR2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2Fzc2VtYmxlOiAgQXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24KLQotICAgQXNzdW1wdGlvbnMgYWJvdXQgdGhlIHBhc3NlZC1pbiB0ZXh0OgotICAJLSBhbGwgY29tbWVudHMsIGxhYmVscyByZW1vdmVkCi0gIAktIHRleHQgaXMgYW4gaW5zdHJ1Y3Rpb24KLSAgCS0gYWxsIHdoaXRlIHNwYWNlIGNvbXByZXNzZWQgdG8gc2luZ2xlIGJsYW5rcwotICAJLSBhbGwgY2hhcmFjdGVyIGNvbnN0YW50cyBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBkZWNpbWFsCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9hc3NlbWJsZSAodGV4dFApCi0gICAgIGNoYXIgKnRleHRQOwkJLyogU291cmNlIHRleHQgb2YgaW5zdHJ1Y3Rpb24gKi8KLXsKLSAgLyogUGFyc2VkIGluc3RydWN0aW9uIHRleHQsIGNvbnRhaW5pbmcgTk8gd2hpdGVzcGFjZTogYXJnWzBdLT5vcGNvZGUKLSAgICAgbW5lbW9uaWMgYXJnWzEtM10tPm9wZXJhbmRzLCB3aXRoIGNoYXIgY29uc3RhbnRzIHJlcGxhY2VkIGJ5Ci0gICAgIGRlY2ltYWwgbnVtYmVycy4gICovCi0gIGNoYXIgKmFyZ3NbNF07Ci0KLSAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBpbnN0cnVjdGlvbiBvcGVyYW5kcyAqLwotICAvKiBQb2ludGVyIHRvIGluc3RydWN0aW9uIGRlc2NyaXB0aW9uICovCi0gIHN0cnVjdCBpOTYwX29wY29kZSAqb1A7Ci0gIC8qIFRSVUUgaWZmIG9wY29kZSBtbmVtb25pYyBpbmNsdWRlZCBicmFuY2gtcHJlZGljdGlvbiBzdWZmaXggKCIuZiIKLSAgICAgb3IgIi50IikuICAqLwotICBpbnQgYnJhbmNoX3ByZWRpY3Q7Ci0gIC8qIFNldHRpbmcgb2YgYnJhbmNoLXByZWRpY3Rpb24gYml0KHMpIHRvIGJlIE9SJ2QgaW50byBpbnN0cnVjdGlvbgotICAgICBvcGNvZGUgb2YgQ1RSTC9DT0JSIGZvcm1hdCBpbnN0cnVjdGlvbnMuICAqLwotICBsb25nIGJwX2JpdHM7Ci0KLSAgaW50IG47CQkJLyogT2Zmc2V0IG9mIGxhc3QgY2hhcmFjdGVyIGluIG9wY29kZSBtbmVtb25pYyAqLwotCi0gIGNvbnN0IGNoYXIgKmJwX2Vycm9yX21zZyA9IF8oImJyYW5jaCBwcmVkaWN0aW9uIGludmFsaWQgb24gdGhpcyBvcGNvZGUiKTsKLQotCi0gIC8qIFBhcnNlIGluc3RydWN0aW9uIGludG8gb3Bjb2RlIGFuZCBvcGVyYW5kcyAqLwotICBtZW1zZXQgKGFyZ3MsICdcMCcsIHNpemVvZiAoYXJncykpOwotICBuX29wcyA9IGlfc2NhbiAodGV4dFAsIGFyZ3MpOwotICBpZiAobl9vcHMgPT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuOwkJCS8qIEVycm9yIG1lc3NhZ2UgYWxyZWFkeSBpc3N1ZWQgKi8KLSAgICB9Ci0KLSAgLyogRG8gIm1hY3JvIHN1YnN0aXR1dGlvbiIgKHNvcnQgb2YpIG9uICdsZGNvbnN0JyBwc2V1ZG8taW5zdHJ1Y3Rpb24gKi8KLSAgaWYgKCFzdHJjbXAgKGFyZ3NbMF0sICJsZGNvbnN0IikpCi0gICAgewotICAgICAgbl9vcHMgPSBwYXJzZV9sZGNvbnN0IChhcmdzKTsKLSAgICAgIGlmIChuX29wcyA9PSAtMSkKLQl7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotCi0KLSAgLyogQ2hlY2sgZm9yIGJyYW5jaC1wcmVkaWN0aW9uIHN1ZmZpeCBvbiBvcGNvZGUgbW5lbW9uaWMsIHN0cmlwIGl0IG9mZiAqLwotICBuID0gc3RybGVuIChhcmdzWzBdKSAtIDE7Ci0gIGJyYW5jaF9wcmVkaWN0ID0gMDsKLSAgYnBfYml0cyA9IDA7Ci0gIGlmIChhcmdzWzBdW24gLSAxXSA9PSAnLicgJiYgKGFyZ3NbMF1bbl0gPT0gJ3QnIHx8IGFyZ3NbMF1bbl0gPT0gJ2YnKSkKLSAgICB7Ci0gICAgICAvKiBXZSBjb3VsZCBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQotCSBzdXBwb3J0cyBicmFuY2ggcHJlZGljdGlvbiwgYnV0IHdoeSBib3RoZXI/ICBUaGUgYml0IHdpbGwKLQkganVzdCBiZSBpZ25vcmVkIGJ5IHByb2Nlc3NvcnMgdGhhdCBkb24ndCB1c2UgaXQuICAqLwotICAgICAgYnJhbmNoX3ByZWRpY3QgPSAxOwotICAgICAgYnBfYml0cyA9IChhcmdzWzBdW25dID09ICd0JykgPyBCUF9UQUtFTiA6IEJQX05PVF9UQUtFTjsKLSAgICAgIGFyZ3NbMF1bbiAtIDFdID0gJ1wwJzsJLyogU3RyaXAgc3VmZml4IGZyb20gb3Bjb2RlIG1uZW1vbmljICovCi0gICAgfQotCi0gIC8qIExvb2sgdXAgb3Bjb2RlIG1uZW1vbmljIGluIHRhYmxlIGFuZCBjaGVjayBudW1iZXIgb2Ygb3BlcmFuZHMuCi0gICAgIENoZWNrIHRoYXQgb3Bjb2RlIGlzIGxlZ2FsIGZvciB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gIElmIGFsbAotICAgICBsb29rcyBnb29kLCBhc3NlbWJsZSBpbnN0cnVjdGlvbi4gICovCi0gIG9QID0gKHN0cnVjdCBpOTYwX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIGFyZ3NbMF0pOwotICBpZiAoIW9QIHx8ICF0YXJnX2hhc19pY2xhc3MgKG9QLT5pY2xhc3MpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBvcGNvZGUsIFwiJXNcIi4iKSwgYXJnc1swXSk7Ci0KLSAgICB9Ci0gIGVsc2UgaWYgKG5fb3BzICE9IG9QLT5udW1fb3BzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW1wcm9wZXIgbnVtYmVyIG9mIG9wZXJhbmRzLiAgZXhwZWN0aW5nICVkLCBnb3QgJWQiKSwKLQkgICAgICBvUC0+bnVtX29wcywgbl9vcHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAob1AtPmZvcm1hdCkKLQl7Ci0JY2FzZSBGQlJBOgotCWNhc2UgQ1RSTDoKLQkgIGN0cmxfZm10IChhcmdzWzFdLCBvUC0+b3Bjb2RlIHwgYnBfYml0cywgb1AtPm51bV9vcHMpOwotCSAgaWYgKG9QLT5mb3JtYXQgPT0gRkJSQSkKLQkgICAgewotCSAgICAgIC8qIE5vdyBnZW5lcmF0ZSBhICdibm8nIHRvIHNhbWUgYXJnICovCi0JICAgICAgY3RybF9mbXQgKGFyZ3NbMV0sIEJOTyB8IGJwX2JpdHMsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENPQlI6Ci0JY2FzZSBDT0o6Ci0JICBjb2JyX2ZtdCAoYXJncywgb1AtPm9wY29kZSB8IGJwX2JpdHMsIG9QKTsKLQkgIGJyZWFrOwotCWNhc2UgUkVHOgotCSAgaWYgKGJyYW5jaF9wcmVkaWN0KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoYnBfZXJyb3JfbXNnKTsKLQkgICAgfQotCSAgcmVnX2ZtdCAoYXJncywgb1ApOwotCSAgYnJlYWs7Ci0JY2FzZSBNRU0xOgotCSAgaWYgKGFyZ3NbMF1bMF0gPT0gJ2MnICYmIGFyZ3NbMF1bMV0gPT0gJ2EnKQotCSAgICB7Ci0JICAgICAgaWYgKGJyYW5jaF9wcmVkaWN0KQotCQl7Ci0JCSAgYXNfd2FybiAoYnBfZXJyb3JfbXNnKTsKLQkJfQotCSAgICAgIG1lbV9mbXQgKGFyZ3MsIG9QLCAxKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWNhc2UgTUVNMjoKLQljYXNlIE1FTTQ6Ci0JY2FzZSBNRU04OgotCWNhc2UgTUVNMTI6Ci0JY2FzZSBNRU0xNjoKLQkgIGlmIChicmFuY2hfcHJlZGljdCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKGJwX2Vycm9yX21zZyk7Ci0JICAgIH0KLQkgIG1lbV9mbXQgKGFyZ3MsIG9QLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0FMTEo6Ci0JICBpZiAoYnJhbmNoX3ByZWRpY3QpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChicF9lcnJvcl9tc2cpOwotCSAgICB9Ci0JICAvKiBPdXRwdXQgb3Bjb2RlICYgc2V0IHVwICJmaXh1cCIgKHJlbG9jYXRpb24pOyBmbGFnCi0JICAgICByZWxvY2F0aW9uIGFzICdjYWxsaicgdHlwZS4gICovCi0JICBrbm93IChvUC0+bnVtX29wcyA9PSAxKTsKLQkgIGdldF9jZGlzcCAoYXJnc1sxXSwgIkNUUkwiLCBvUC0+b3Bjb2RlLCAyNCwgMCwgMSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKG9QLT5mb3JtYXQpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0JCQkJLyogbWRfYXNzZW1ibGUoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX251bWJlcl90b19jaGFyczogIGNvbnZlcnQgYSBudW1iZXIgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIKLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbHVlLCBuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9jaGFyc190b19udW1iZXI6ICBjb252ZXJ0IGZyb20gdGFyZ2V0IGJ5dGUgb3JkZXIgdG8gaG9zdCBieXRlIG9yZGVyLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotaW50Ci1tZF9jaGFyc190b19udW1iZXIgKHZhbCwgbikKLSAgICAgdW5zaWduZWQgY2hhciAqdmFsOwkvKiBWYWx1ZSBpbiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgICBpbnQgbjsJCQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGlucHV0ICovCi17Ci0gIGludCByZXR2YWw7Ci0KLSAgZm9yIChyZXR2YWwgPSAwOyBuLS07KQotICAgIHsKLSAgICAgIHJldHZhbCA8PD0gODsKLSAgICAgIHJldHZhbCB8PSB2YWxbbl07Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMJNgotI2RlZmluZSBMTlVNX1NJWkUJc2l6ZW9mKExJVFRMRU5VTV9UWVBFKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2F0b2Y6CWNvbnZlcnQgYXNjaWkgdG8gZmxvYXRpbmcgcG9pbnQKLQotICAgVHVybiBhIHN0cmluZyBhdCBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgICd0eXBlJywgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBhdCAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyByZXR1cm5lZCBhdCAnc2l6ZVAnLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgYSBwb2ludGVyCi0gICB0byBhbiBlbXB0eSBtZXNzYWdlIGlmIE9LLgotCi0gICBOb3RlIHdlIGNhbGwgdGhlIGkzODYgZmxvYXRpbmcgcG9pbnQgcm91dGluZSwgcmF0aGVyIHRoYW4gY29tcGxpY2F0aW5nCi0gICB0aGluZ3Mgd2l0aCBtb3JlIGZpbGVzIG9yIHN5bWJvbGljIGxpbmtzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBpbnQgcHJlYzsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgY2FzZSAnVCc6Ci0gICAgICBwcmVjID0gNTsKLSAgICAgIHR5cGUgPSAneCc7CQkvKiBUaGF0J3Mgd2hhdCBhdG9mX2llZWUoKSB1bmRlcnN0YW5kcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICAgfQotCi0gICpzaXplUCA9IHByZWMgKiBMTlVNX1NJWkU7Ci0KLSAgLyogT3V0cHV0IHRoZSBMSVRUTEVOVU1zIGluIFJFVkVSU0Ugb3JkZXIgaW4gYWNjb3JkIHdpdGggaTgwOTYwCi0gICAgIHdvcmQtb3JkZXIuICAoRHVubm8gd2h5IGF0b2ZfaWVlZSBkb2Vzbid0IGRvIGl0IGluIHRoZSByaWdodAotICAgICBvcmRlciBpbiB0aGUgZmlyc3QgcGxhY2UgLS0gcHJvYmFibHkgYmVjYXVzZSBpdCdzIGEgaGFjayBvZgotICAgICBhdG9mX202OGsuKSAgKi8KLQotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQLS0pLCBMTlVNX1NJWkUpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9udW1iZXJfdG9faW1tCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfbnVtYmVyX3RvX2Rpc3AKLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX251bWJlcl90b19kaXNwIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX251bWJlcl90b19maWVsZDoKLQotICAJU3RpY2sgYSB2YWx1ZSAoYW4gYWRkcmVzcyBmaXh1cCkgaW50byBhIGJpdCBmaWVsZCBvZgotICAJcHJldmlvdXNseS1nZW5lcmF0ZWQgaW5zdHJ1Y3Rpb24uCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9udW1iZXJfdG9fZmllbGQgKGluc3RyUCwgdmFsLCBiZml4UCkKLSAgICAgY2hhciAqaW5zdHJQOwkJLyogUG9pbnRlciB0byBpbnN0cnVjdGlvbiB0byBiZSBmaXhlZCAqLwotICAgICBsb25nIHZhbDsJCQkvKiBBZGRyZXNzIGZpeHVwIHZhbHVlICovCi0gICAgIGJpdF9maXhTICpiZml4UDsJCS8qIERlc2NyaXB0aW9uIG9mIGJpdCBmaWVsZCB0byBiZSBmaXhlZCB1cCAqLwotewotICBpbnQgbnVtYml0czsJCQkvKiBMZW5ndGggb2YgYml0IGZpZWxkIHRvIGJlIGZpeGVkICovCi0gIGxvbmcgaW5zdHI7CQkJLyogMzItYml0IGluc3RydWN0aW9uIHRvIGJlIGZpeGVkLXVwICovCi0gIGxvbmcgc2lnbjsJCQkvKiAwIG9yIC0xLCBhY2NvcmRpbmcgdG8gc2lnbiBiaXQgb2YgJ3ZhbCcgKi8KLQotICAvKiBDb252ZXJ0IGluc3RydWN0aW9uIGJhY2sgdG8gaG9zdCBieXRlIG9yZGVyLiAgKi8KLSAgaW5zdHIgPSBtZF9jaGFyc190b19udW1iZXIgKGluc3RyUCwgNCk7Ci0KLSAgLyogU3VycHJpc2UhIC0tIHdlIHN0b3JlZCB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgbW9kaWZpZWQgcmF0aGVyCi0gICAgIHRoYW4gYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlLiAgKi8KLSAgbnVtYml0cyA9IChpbnQpIGJmaXhQOwotICBpZiAobnVtYml0cyA9PSAxKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBuby1vcCwgc3R1Y2sgaGVyZSBieSByZWxvY19jYWxsaigpICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGtub3cgKChudW1iaXRzID09IDEzKSB8fCAobnVtYml0cyA9PSAyNCkpOwotCi0gIC8qIFByb3BhZ2F0ZSBzaWduIGJpdCBvZiAndmFsJyBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBiaXRzLiAgUmVzdWx0Ci0gICAgIHNob3VsZCBiZSBhbGwgMCBvciBhbGwgMS4gICovCi0gIHNpZ24gPSB2YWwgPj4gKChpbnQpIG51bWJpdHMgLSAxKTsKLSAgaWYgKCgodmFsIDwgMCkgJiYgKHNpZ24gIT0gLTEpKQotICAgICAgfHwgKCh2YWwgPiAwKSAmJiAoc2lnbiAhPSAwKSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJGaXh1cCBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCB3aWR0aCBvZiAlZCIpLAotCSAgICAgIHZhbCwgbnVtYml0cyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogUHV0IGJpdCBmaWVsZCBpbnRvIGluc3RydWN0aW9uIGFuZCB3cml0ZSBiYWNrIGluIHRhcmdldAotICAgICAgICAgKiBieXRlIG9yZGVyLgotICAgICAgICovCi0gICAgICB2YWwgJj0gfigtMSA8PCAoaW50KSBudW1iaXRzKTsJLyogQ2xlYXIgdW51c2VkIHNpZ24gYml0cyAqLwotICAgICAgaW5zdHIgfD0gdmFsOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChpbnN0clAsIGluc3RyLCA0KTsKLSAgICB9Ci19CQkJCS8qIG1kX251bWJlcl90b19maWVsZCgpICovCi0MCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfcGFyc2Vfb3B0aW9uCi0gIAlJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICAJU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgRm9yIHRoZSA5NjAsIHRoZXNlIGFyZToKLQotICAJLW5vcmVsYXg6Ci0gIAkJQ29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9ucyB0aGF0IHJlcXVpcmUgZGlzcGxhY2VtZW50cwotICAJCWdyZWF0ZXIgdGhhbiAxMyBiaXRzIChvciB0aGF0IGhhdmUgZXh0ZXJuYWwgdGFyZ2V0cykgc2hvdWxkCi0gIAkJZ2VuZXJhdGUgZXJyb3JzLiAgVGhlIGRlZmF1bHQgaXMgdG8gcmVwbGFjZSBlYWNoIHN1Y2gKLSAgCQlpbnN0cnVjdGlvbiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgKG9yIGNoa2JpdCkgYW5kCi0gIAkJYnJhbmNoIGluc3RydWN0aW9ucy4gIE5vdGUgdGhhdCB0aGUgSW50ZWwgImoiIGNvYnIgZGlyZWN0aXZlcwotICAJCWFyZSBBTFdBWVMgImRlLW9wdGltaXplZCIgaW4gdGhpcyB3YXkgd2hlbiBuZWNlc3NhcnksCi0gIAkJcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiB0aGlzIG9wdGlvbi4KLQotICAJLWI6Ci0gIAkJQWRkIGNvZGUgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBicmFuY2hlcyB0YWtlbiwgZm9yCi0gIAkJbGF0ZXIgb3B0aW1pemF0aW9uIG9mIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMgYnkgYSBzZXBhcmF0ZQotICAJCXRvb2wuICBDT0JSIGFuZCBDTlRMIGZvcm1hdCBpbnN0cnVjdGlvbnMgaGF2ZSBicmFuY2gKLSAgCQlwcmVkaWN0aW9uIGJpdHMgKGluIHRoZSBDWCBhcmNoaXRlY3R1cmUpOyAgaWYgIkJSIiByZXByZXNlbnRzCi0gIAkJYW4gaW5zdHJ1Y3Rpb24gaW4gb25lIG9mIHRoZXNlIGNsYXNzZXMsIHRoZSBmb2xsb3dpbmcgcmVwLQotICAJCXJlc2VudHMgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXI6Ci0KLSAgCQkJY2FsbAk8aW5jcmVtZW50IHJvdXRpbmU+Ci0gIAkJCS53b3JkCTAJIyBwcmUtY291bnRlcgotICAJCUxhYmVsOiAgQlIKLSAgCQkJY2FsbAk8aW5jcmVtZW50IHJvdXRpbmU+Ci0gIAkJCS53b3JkCTAJIyBwb3N0LWNvdW50ZXIKLQotICAJCUEgdGFibGUgb2YgYWxsIHN1Y2ggIkxhYmVscyIgaXMgYWxzbyBnZW5lcmF0ZWQuCi0KLQotICAJLUFLQSwgLUFLQiwgLUFLQywgLUFTQSwgLUFTQiwgLUFNQywgLUFDQToKLSAgCQlTZWxlY3QgdGhlIDgwOTYwIGFyY2hpdGVjdHVyZS4gIEluc3RydWN0aW9ucyBvciBmZWF0dXJlcyBub3QKLSAgCQlzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGFyY2hpdGVjdHVyZSBjYXVzZSBmYXRhbCBlcnJvcnMuCi0gIAkJVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYW55IGluc3RydWN0aW9uIG9yIGZlYXR1cmUKLSAgCQl0aGF0IGlzIHN1cHBvcnRlZCBieSBTT01FIHZlcnNpb24gb2YgdGhlIDk2MCAoZXZlbiBpZiB0aGlzCi0gIAkJbWVhbnMgbWl4aW5nIGFyY2hpdGVjdHVyZXMhKS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiQTpiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jZGVmaW5lIE9QVElPTl9MSU5LUkVMQVggKE9QVElPTl9NRF9CQVNFKQotICB7ImxpbmtyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElOS1JFTEFYfSwKLSAgeyJsaW5rLXJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSU5LUkVMQVh9LAotI2RlZmluZSBPUFRJT05fTk9SRUxBWCAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7Im5vcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PUkVMQVh9LAotICB7Im5vLXJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT1JFTEFYfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLXN0cnVjdCB0YWJlbnRyeQotICB7Ci0gICAgY2hhciAqZmxhZzsKLSAgICBpbnQgYXJjaDsKLSAgfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFiZW50cnkgYXJjaF90YWJbXSA9Ci17Ci0gIHsiS0EiLCBBUkNIX0tBfSwKLSAgeyJLQiIsIEFSQ0hfS0J9LAotICB7IlNBIiwgQVJDSF9LQX0sCQkvKiBTeW5vbnltIGZvciBLQSAqLwotICB7IlNCIiwgQVJDSF9LQn0sCQkvKiBTeW5vbnltIGZvciBLQiAqLwotICB7IktDIiwgQVJDSF9NQ30sCQkvKiBTeW5vbnltIGZvciBNQyAqLwotICB7Ik1DIiwgQVJDSF9NQ30sCi0gIHsiQ0EiLCBBUkNIX0NBfSwKLSAgeyJKWCIsIEFSQ0hfSlh9LAotICB7IkhYIiwgQVJDSF9IWH0sCi0gIHtOVUxMLCAwfQotfTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9MSU5LUkVMQVg6Ci0gICAgICBsaW5rcmVsYXggPSAxOwotICAgICAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PUkVMQVg6Ci0gICAgICBub3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6Ci0gICAgICBpbnN0cnVtZW50X2JyYW5jaGVzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICB7Ci0JY29uc3Qgc3RydWN0IHRhYmVudHJ5ICp0cDsKLQljaGFyICpwID0gYXJnOwotCi0JZm9yICh0cCA9IGFyY2hfdGFiOyB0cC0+ZmxhZyAhPSBOVUxMOyB0cCsrKQotCSAgaWYgKCFzdHJjbXAgKHAsIHRwLT5mbGFnKSkKLQkgICAgYnJlYWs7Ci0KLQlpZiAodHAtPmZsYWcgPT0gTlVMTCkKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSAlcyIpLCBwKTsKLQkgICAgcmV0dXJuIDA7Ci0JICB9Ci0JZWxzZQotCSAgYXJjaGl0ZWN0dXJlID0gdHAtPmFyY2g7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBpbnQgaTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJJOTYwIG9wdGlvbnM6XG4iKSk7Ci0gIGZvciAoaSA9IDA7IGFyY2hfdGFiW2ldLmZsYWc7IGkrKykKLSAgICBmcHJpbnRmIChzdHJlYW0sICIlcy1BJXMiLCBpID8gIiB8ICIgOiAiIiwgYXJjaF90YWJbaV0uZmxhZyk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXG5cCi0JCQlzcGVjaWZ5IHZhcmlhbnQgb2YgOTYwIGFyY2hpdGVjdHVyZVxuXAotLWIJCQlhZGQgY29kZSB0byBjb2xsZWN0IHN0YXRpc3RpY3MgYWJvdXQgYnJhbmNoZXMgdGFrZW5cblwKLS1saW5rLXJlbGF4CQlwcmVzZXJ2ZSBpbmRpdmlkdWFsIGFsaWdubWVudCBkaXJlY3RpdmVzIHNvIGxpbmtlclxuXAotCQkJY2FuIGRvIHJlbGF4aW5nIChiLm91dCBmb3JtYXQgb25seSlcblwKLS1uby1yZWxheAkJZG9uJ3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3JcblwKLQkJCWxvbmcgZGlzcGxhY2VtZW50c1xuIikpOwotfQotDAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2NvbnZlcnRfZnJhZzoKLSAgCUNhbGxlZCBieSBiYXNlIGFzc2VtYmxlciBhZnRlciBhZGRyZXNzIHJlbGF4YXRpb24gaXMgZmluaXNoZWQ6ICBtb2RpZnkKLSAgCXZhcmlhYmxlIGZyYWdtZW50cyBhY2NvcmRpbmcgdG8gaG93IG11Y2ggcmVsYXhhdGlvbiB3YXMgZG9uZS4KLQotICAJSWYgdGhlIGZyYWdtZW50IHN1YnN0YXRlIGlzIHN0aWxsIDEsIGEgMTMtYml0IGRpc3BsYWNlbWVudCB3YXMgZW5vdWdoCi0gIAl0byByZWFjaCB0aGUgc3ltYm9sIGluIHF1ZXN0aW9uLiAgU2V0IHVwIGFuIGFkZHJlc3MgZml4dXAsIGJ1dCBvdGhlcndpc2UKLSAgCWxlYXZlIHRoZSBjb2JyIGluc3RydWN0aW9uIGFsb25lLgotCi0gIAlJZiB0aGUgZnJhZ21lbnQgc3Vic3RhdGUgaXMgMiwgYSAxMy1iaXQgZGlzcGxhY2VtZW50IHdhcyBub3QgZW5vdWdoLgotICAJUmVwbGFjZSB0aGUgY29iciB3aXRoIGEgdHdvIGluc3RydWN0aW9ucyAoYSBjb21wYXJlIGFuZCBhIGJyYW5jaCkuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci0jZWxzZQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBmcmFnUyAqZnJhZ1A7Ci0jZW5kaWYKLXsKLSAgZml4UyAqZml4UDsJCQkvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBuZWVkZWQgYWRkcmVzcyBmaXggKi8KLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBMRUFWRSBTSU5HTEUgQ09CUiBJTlNUUlVDVElPTiAqLwotICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLAotCQkgICAgICBmcmFnUC0+ZnJfb3Bjb2RlIC0gZnJhZ1AtPmZyX2xpdGVyYWwsCi0JCSAgICAgIDQsCi0JCSAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JCSAgICAgIDEsCi0JCSAgICAgIE5PX1JFTE9DKTsKLQotICAgICAgZml4UC0+ZnhfYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgMTM7CS8qIHNpemUgb2YgYml0IGZpZWxkICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAvKiBSRVBMQUNFIENPQlIgV0lUSCBDT01QQVJFL0JSQU5DSCBJTlNUUlVDVElPTlMgKi8KLSAgICAgIHJlbGF4X2NvYnIgKGZyYWdQKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4OiAgSG93IG11Y2ggZG9lcyBpdCBsb29rIGxpa2UgKmZyYWdQIHdpbGwgZ3Jvdz8KLQotICAJQ2FsbGVkIGJ5IGJhc2UgYXNzZW1ibGVyIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbi4KLSAgCVJldHVybiB0aGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBmcmFnbWVudCB3aWxsIGdyb3cuCi0KLSAgCUFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkOyBjb2JyJ3MKLSAgCWJhc2VkIG9uIHVuZGVmaW5lZCBzeW1ib2xzIHdpbGwgaGF2ZSB0byBiZSByZXBsYWNlZCB3aXRoIGEgY29tcGFyZQotICAJaW5zdHJ1Y3Rpb24gYW5kIGEgYnJhbmNoIGluc3RydWN0aW9uLCBhbmQgdGhlIGNvZGUgZnJhZ21lbnQgd2lsbCBncm93Ci0gIAlieSA0IGJ5dGVzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgLyogSWYgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGdvIHRvICJyZWxheGVkIiBzdGF0ZQotICAgICAoY29tcGFyZSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIGNvYnIpIHJpZ2h0IG5vdy4gICovCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWdtZW50X3R5cGUpCi0gICAgewotICAgICAgcmVsYXhfY29iciAoZnJhZ1ApOwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICByZXR1cm4gMDsKLX0JCQkJLyogbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSAqLwotCi0jaWYgZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX3JpX3RvX2NoYXJzOgotICAJVGhpcyByb3V0aW5lIGV4aXN0cyBpbiBvcmRlciB0byBvdmVyY29tZSBtYWNoaW5lIGJ5dGUtb3JkZXIgcHJvYmxlbXMKLSAgCXdoZW4gZGVhbGluZyB3aXRoIGJpdC1maWVsZCBlbnRyaWVzIGluIHRoZSByZWxvY2F0aW9uX2luZm8gc3RydWN0LgotCi0gIAlCdXQgcmVsb2NhdGlvbiBpbmZvIHdpbGwgYmUgdXNlZCBvbiB0aGUgaG9zdCBtYWNoaW5lIG9ubHkgKG9ubHkKLSAgCWV4ZWN1dGFibGUgY29kZSBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSBpODA5NjApLiAgVGhlcmVmb3JlLAotICAJd2UgbGVhdmUgaXQgaW4gaG9zdCBieXRlIG9yZGVyLgotCi0gIAlUaGUgYWJvdmUgY29tbWVudCBpcyBubyBsb25nZXIgdHJ1ZS4gIFRoaXMgcm91dGluZSBub3cgcmVhbGx5Ci0gIAlkb2VzIGRvIHRoZSByZW9yZGVyaW5nIChJYW4gVGF5bG9yIDI4IEF1ZyA5MikuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXN0YXRpYyB2b2lkCi1tZF9yaV90b19jaGFycyAod2hlcmUsIHJpKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcmk7Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIHJpLT5yX2FkZHJlc3MsCi0JCSAgICAgIHNpemVvZiAocmktPnJfYWRkcmVzcykpOwotICB3aGVyZVs0XSA9IHJpLT5yX2luZGV4ICYgMHgwZmY7Ci0gIHdoZXJlWzVdID0gKHJpLT5yX2luZGV4ID4+IDgpICYgMHgwZmY7Ci0gIHdoZXJlWzZdID0gKHJpLT5yX2luZGV4ID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgocmktPnJfcGNyZWwgPDwgMCkKLQkgICAgICB8IChyaS0+cl9sZW5ndGggPDwgMSkKLQkgICAgICB8IChyaS0+cl9leHRlcm4gPDwgMykKLQkgICAgICB8IChyaS0+cl9ic3IgPDwgNCkKLQkgICAgICB8IChyaS0+cl9kaXNwIDw8IDUpCi0JICAgICAgfCAocmktPnJfY2FsbGogPDwgNikpOwotfQotCi0jZW5kaWYgLyogZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKSAqLwotCi0MCi0vKiBGT0xMT1dJTkcgQVJFIFRIRSBMT0NBTCBST1VUSU5FUywgSU4gQUxQSEFCRVRJQ0FMIE9SREVSICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGJyY250X2VtaXQ6CUVtaXQgY29kZSB0byBpbmNyZW1lbnQgaW5saW5lIGJyYW5jaCBjb3VudGVyLgotCi0gIAlTZWUgdGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBkZWNsYXJhdGlvbiBvZiAnYnJfY250JyBmb3IgZGV0YWlscyBvbgotICAJYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1icmNudF9lbWl0ICgpCi17Ci0gIGN0cmxfZm10IChCUl9DTlRfRlVOQywgQ0FMTCwgMSk7CS8qIEVtaXQgY2FsbCB0byAiaW5jcmVtZW50IiByb3V0aW5lICovCi0gIGVtaXQgKDApOwkJCS8qIEVtaXQgaW5saW5lIGNvdW50ZXIgdG8gYmUgaW5jcmVtZW50ZWQgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBicmxhYl9uZXh0OglnZW5lcmF0ZSB0aGUgbmV4dCBicmFuY2ggbG9jYWwgbGFiZWwKLQotICAJU2VlIHRoZSBjb21tZW50cyBhYm92ZSB0aGUgZGVjbGFyYXRpb24gb2YgJ2JyX2NudCcgZm9yIGRldGFpbHMgb24KLSAgCWJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbi4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgY2hhciAqCi1icmxhYl9uZXh0ICgpCi17Ci0gIHN0YXRpYyBjaGFyIGJ1ZlsyMF07Ci0KLSAgc3ByaW50ZiAoYnVmLCAiJXMlZCIsIEJSX0xBQkVMX0JBU0UsIGJyX2NudCsrKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBicnRhYl9lbWl0OglnZW5lcmF0ZSB0aGUgZmV0Y2gtcHJlZGljdGlvbiBicmFuY2ggdGFibGUuCi0KLSAgCVNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIGRlY2xhcmF0aW9uIG9mICdicl9jbnQnIGZvciBkZXRhaWxzIG9uCi0gIAlicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24uCi0KLSAgCVRoZSBjb2RlIGVtaXR0ZWQgaGVyZSB3b3VsZCBiZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nCi0gIAlleGFtcGxlIGFzc2VtYmxlciBzb3VyY2UuCi0KLSAgCQkJLmRhdGEKLSAgCQkJLmFsaWduCTIKLSAgCSAgIEJSX1RBQl9OQU1FOgotICAJCQkud29yZAkwCQkjIGxpbmsgdG8gbmV4dCB0YWJsZQotICAJCQkud29yZAkzCQkjIGxlbmd0aCBvZiB0YWJsZQotICAJCQkud29yZAlMQlJBTkNIMAkjIDFzdCBlbnRyeSBpbiB0YWJsZSBwcm9wZXIKLSAgCQkJLndvcmQJTEJSQU5DSDEKLSAgCQkJLndvcmQJTEJSQU5DSDIKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotYnJ0YWJfZW1pdCAoKQotewotICBpbnQgaTsKLSAgY2hhciBidWZbMjBdOwotICBjaGFyICpwOwkJCS8qIFdoZXJlIHRoZSBiaW5hcnkgd2FzIG91dHB1dCB0byAqLwotICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0aW9uIG9mIGRlZmVycmVkIGFkZHJlc3MgZml4dXAuICAqLwotICBmaXhTICpmaXhQOwotCi0gIGlmICghaW5zdHJ1bWVudF9icmFuY2hlcykKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgMCk7CS8qICAgICAgLmRhdGEgKi8KLSAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7CQkvKiAgICAgIC5hbGlnbiAyICovCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOwotICBjb2xvbiAoQlJfVEFCX05BTUUpOwkJLyogQlJfVEFCX05BTUU6ICovCi0gIGVtaXQgKDApOwkJCS8qICAgICAgLndvcmQgMCAjbGluayB0byBuZXh0IHRhYmxlICovCi0gIGVtaXQgKGJyX2NudCk7CQkvKiAgICAgIC53b3JkIG4gI2xlbmd0aCBvZiB0YWJsZSAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBicl9jbnQ7IGkrKykKLSAgICB7Ci0gICAgICBzcHJpbnRmIChidWYsICIlcyVkIiwgQlJfTEFCRUxfQkFTRSwgaSk7Ci0gICAgICBwID0gZW1pdCAoMCk7Ci0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ19ub3csCi0JCSAgICAgIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgNCwKLQkJICAgICAgc3ltYm9sX2ZpbmQgKGJ1ZiksCi0JCSAgICAgIDAsCi0JCSAgICAgIDAsCi0JCSAgICAgIE5PX1JFTE9DKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgY29icl9mbXQ6CWdlbmVyYXRlIGEgQ09CUi1mb3JtYXQgaW5zdHJ1Y3Rpb24KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotdm9pZAotY29icl9mbXQgKGFyZywgb3Bjb2RlLCBvUCkKLSAgICAgLyogYXJnWzBdLT5vcGNvZGUgbW5lbW9uaWMsIGFyZ1sxLTNdLT5vcGVyYW5kcyAoYXNjaWkpICovCi0gICAgIGNoYXIgKmFyZ1tdOwotICAgICAvKiBPcGNvZGUsIHdpdGggYnJhbmNoLXByZWRpY3Rpb24gYml0cyBhbHJlYWR5IHNldCBpZiBuZWNlc3NhcnkuICAqLwotICAgICBsb25nIG9wY29kZTsKLSAgICAgLyogUG9pbnRlciB0byBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbi4gICovCi0gICAgIHN0cnVjdCBpOTYwX29wY29kZSAqb1A7Ci17Ci0gIGxvbmcgaW5zdHI7CQkJLyogMzItYml0IGluc3RydWN0aW9uICovCi0gIHN0cnVjdCByZWdvcCByZWdvcDsJCS8qIERlc2NyaXB0aW9uIG9mIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLSAgaW50IG47CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gIGludCB2YXJfZnJhZzsJCQkvKiAxIGlmIHZhcnlpbmcgbGVuZ3RoIGNvZGUgZnJhZ21lbnQgc2hvdWxkCi0JCQkJICogICAgYmUgZW1pdHRlZDsgIDAgaWYgYW4gYWRkcmVzcyBmaXgKLQkJCQkgKiAgICAgIHNob3VsZCBiZSBlbWl0dGVkLgotCQkJCSAqLwotCi0gIGluc3RyID0gb3Bjb2RlOwotICBuID0gb1AtPm51bV9vcHM7Ci0KLSAgaWYgKG4gPj0gMSkKLSAgICB7Ci0gICAgICAvKiBGaXJzdCBvcGVyYW5kIChpZiBhbnkpIG9mIGEgQ09CUiBpcyBhbHdheXMgYSByZWdpc3RlcgotCSBvcGVyYW5kLiAgUGFyc2UgaXQuICAqLwotICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnWzFdLCBvUC0+b3BlcmFuZFswXSk7Ci0gICAgICBpbnN0ciB8PSAocmVnb3AubiA8PCAxOSkgfCAocmVnb3AubW9kZSA8PCAxMyk7Ci0gICAgfQotICBpZiAobiA+PSAyKQotICAgIHsKLSAgICAgIC8qIFNlY29uZCBvcGVyYW5kIChpZiBhbnkpIG9mIGEgQ09CUiBpcyBhbHdheXMgYSByZWdpc3RlcgotCSBvcGVyYW5kLiAgUGFyc2UgaXQuICAqLwotICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ1syXSwgb1AtPm9wZXJhbmRbMV0pOwotICAgICAgaW5zdHIgfD0gKHJlZ29wLm4gPDwgMTQpIHwgcmVnb3Auc3BlY2lhbDsKLSAgICB9Ci0KLQotICBpZiAobiA8IDMpCi0gICAgewotICAgICAgZW1pdCAoaW5zdHIpOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGluc3RydW1lbnRfYnJhbmNoZXMpCi0JewotCSAgYnJjbnRfZW1pdCAoKTsKLQkgIGNvbG9uIChicmxhYl9uZXh0ICgpKTsKLQl9Ci0KLSAgICAgIC8qIEEgdGhpcmQgb3BlcmFuZCB0byBhIENPQlIgaXMgYWx3YXlzIGEgZGlzcGxhY2VtZW50LiAgUGFyc2UKLSAgICAgICAgIGl0OyBpZiBpdCdzIHJlbGF4YWJsZSAoYSBjb2JyICJqIiBkaXJlY3RpdmUsIG9yIGFueSBjb2JyCi0gICAgICAgICBvdGhlciB0aGFuIGJicy9iYmMgd2hlbiB0aGUgIi1ub3JlbGF4IiBvcHRpb24gaXMgbm90IGluIHVzZSkKLSAgICAgICAgIHNldCB1cCBhIHZhcmlhYmxlIGNvZGUgZnJhZ21lbnQ7IG90aGVyd2lzZSBzZXQgdXAgYW4gYWRkcmVzcwotICAgICAgICAgZml4LiAgKi8KLSAgICAgIHZhcl9mcmFnID0gIW5vcmVsYXggfHwgKG9QLT5mb3JtYXQgPT0gQ09KKTsJLyogVFJVRSBvciBGQUxTRSAqLwotICAgICAgZ2V0X2NkaXNwIChhcmdbM10sICJDT0JSIiwgaW5zdHIsIDEzLCB2YXJfZnJhZywgMCk7Ci0KLSAgICAgIGlmIChpbnN0cnVtZW50X2JyYW5jaGVzKQotCXsKLQkgIGJyY250X2VtaXQgKCk7Ci0JfQotICAgIH0KLX0JCQkJLyogY29icl9mbXQoKSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgY3RybF9mbXQ6CWdlbmVyYXRlIGEgQ1RSTC1mb3JtYXQgaW5zdHJ1Y3Rpb24KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotdm9pZAotY3RybF9mbXQgKHRhcmdQLCBvcGNvZGUsIG51bV9vcHMpCi0gICAgIGNoYXIgKnRhcmdQOwkJLyogUG9pbnRlciB0byB0ZXh0IG9mIGxvbmUgb3BlcmFuZCAoaWYgYW55KSAqLwotICAgICBsb25nIG9wY29kZTsJCS8qIFRlbXBsYXRlIG9mIGluc3RydWN0aW9uICovCi0gICAgIGludCBudW1fb3BzOwkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi17Ci0gIGludCBpbnN0cnVtZW50OwkJLyogVFJVRSBpZmYgd2Ugc2hvdWxkIGFkZCBpbnN0cnVtZW50YXRpb24gdG8gdHJhY2sKLQkJCQkgICAqIGhvdyBvZnRlbiB0aGUgYnJhbmNoIGlzIHRha2VuCi0JCQkJICovCi0KLQotICBpZiAobnVtX29wcyA9PSAwKQotICAgIHsKLSAgICAgIGVtaXQgKG9wY29kZSk7CQkvKiBPdXRwdXQgb3Bjb2RlICovCi0gICAgfQotICBlbHNlCi0gICAgewotCi0gICAgICBpbnN0cnVtZW50ID0gaW5zdHJ1bWVudF9icmFuY2hlcyAmJiAob3Bjb2RlICE9IENBTEwpCi0JJiYgKG9wY29kZSAhPSBCKSAmJiAob3Bjb2RlICE9IFJFVCkgJiYgKG9wY29kZSAhPSBCQUwpOwotCi0gICAgICBpZiAoaW5zdHJ1bWVudCkKLQl7Ci0JICBicmNudF9lbWl0ICgpOwotCSAgY29sb24gKGJybGFiX25leHQgKCkpOwotCX0KLQotICAgICAgLyogVGhlIG9wZXJhbmQgTVVTVCBiZSBhbiBpcC1yZWxhdGl2ZSBkaXNwbGFjbWVudC4gUGFyc2UgaXQKLSAgICAgICAgICogYW5kIHNldCB1cCBhZGRyZXNzIGZpeCBmb3IgdGhlIGluc3RydWN0aW9uIHdlIGp1c3Qgb3V0cHV0LgotICAgICAgICovCi0gICAgICBnZXRfY2Rpc3AgKHRhcmdQLCAiQ1RSTCIsIG9wY29kZSwgMjQsIDAsIDApOwotCi0gICAgICBpZiAoaW5zdHJ1bWVudCkKLQl7Ci0JICBicmNudF9lbWl0ICgpOwotCX0KLSAgICB9Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGVtaXQ6CW91dHB1dCBpbnN0cnVjdGlvbiBiaW5hcnkKLQotICAJT3V0cHV0IGluc3RydWN0aW9uIGJpbmFyeSwgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIsIDQgYnl0ZXMgYXQgYSB0aW1lLgotICAJUmV0dXJuIHBvaW50ZXIgdG8gd2hlcmUgaXQgd2FzIHBsYWNlZC4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotY2hhciAqCi1lbWl0IChpbnN0cikKLSAgICAgbG9uZyBpbnN0cjsJCS8qIFdvcmQgdG8gYmUgb3V0cHV0LCBob3N0IGJ5dGUgb3JkZXIgKi8KLXsKLSAgY2hhciAqdG9QOwkJCS8qIFdoZXJlIHRvIG91dHB1dCBpdCAqLwotCi0gIHRvUCA9IGZyYWdfbW9yZSAoNCk7CQkvKiBBbGxvY2F0ZSBzdG9yYWdlICovCi0gIG1kX251bWJlcl90b19jaGFycyAodG9QLCBpbnN0ciwgNCk7CS8qIENvbnZlcnQgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgcmV0dXJuIHRvUDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGdldF9hcmdzOglicmVhayBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvdXQgb2YgY29tbWEtc2VwYXJhdGVkIGxpc3QKLQotICAgSW5wdXQgYXNzdW1wdGlvbnM6Ci0gIAktIGFsbCBjb21tZW50cyBhbmQgbGFiZWxzIGhhdmUgYmVlbiByZW1vdmVkCi0gIAktIGFsbCBzdHJpbmdzIG9mIHdoaXRlc3BhY2UgaGF2ZSBiZWVuIGNvbGxhcHNlZCB0byBhIHNpbmdsZSBibGFuay4KLSAgCS0gYWxsIGNoYXJhY3RlciBjb25zdGFudHMgKCd4JykgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZGVjaW1hbAotCi0gICBPdXRwdXQ6Ci0gIAlhcmdzWzBdIGlzIHVudG91Y2hlZC4gYXJnc1sxXSBwb2ludHMgdG8gZmlyc3Qgb3BlcmFuZCwgZXRjLiBBbGwgYXJnczoKLSAgCS0gYXJlIE5VTEwtdGVybWluYXRlZAotICAJLSBjb250YWluIG5vIHdoaXRlc3BhY2UKLQotICAgUmV0dXJuIHZhbHVlOgotICAJTnVtYmVyIG9mIG9wZXJhbmRzICgwLDEsMiwgb3IgMykgb3IgLTEgb24gZXJyb3IuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgaW50Ci1nZXRfYXJncyAocCwgYXJncykKLSAgICAgLyogUG9pbnRlciB0byBjb21tYS1zZXBhcmF0ZWQgb3BlcmFuZHM7IE1VQ0tFRCBCWSBVUyAqLwotICAgICByZWdpc3RlciBjaGFyICpwOwotICAgICAvKiBPdXRwdXQgYXJnOiBwb2ludGVycyB0byBvcGVyYW5kcyBwbGFjZWQgaW4gYXJnc1sxLTNdLiAgTVVTVAotICAgICAgICBBQ0NPTU1PREFURSA0IEVOVFJJRVMgKGFyZ3NbMC0zXSkuICAqLwotICAgICBjaGFyICphcmdzW107Ci17Ci0gIHJlZ2lzdGVyIGludCBuOwkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gIHJlZ2lzdGVyIGNoYXIgKnRvOwotCi0gIC8qIFNraXAgbGVhZCB3aGl0ZSBzcGFjZSAqLwotICB3aGlsZSAoKnAgPT0gJyAnKQotICAgIHsKLSAgICAgIHArKzsKLSAgICB9Ci0KLSAgaWYgKCpwID09ICdcMCcpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIG4gPSAxOwotICBhcmdzWzFdID0gcDsKLQotICAvKiBTcXVlemUgYmxhbmtzIG91dCBieSBtb3Zpbmcgbm9uLWJsYW5rcyB0b3dhcmQgc3RhcnQgb2Ygc3RyaW5nLgotICAgICAqIElzb2xhdGUgb3BlcmFuZHMsIHdoZW5ldmVyIGNvbW1hIGlzIGZvdW5kLgotICAgKi8KLSAgdG8gPSBwOwotICB3aGlsZSAoKnAgIT0gJ1wwJykKLSAgICB7Ci0KLSAgICAgIGlmICgqcCA9PSAnICcKLQkgICYmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBwWzFdKQotCSAgICAgIHx8ICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHBbLTFdKSkpCi0JewotCSAgcCsrOwotCi0JfQotICAgICAgZWxzZSBpZiAoKnAgPT0gJywnKQotCXsKLQotCSAgLyogU3RhcnQgb2Ygb3BlcmFuZCAqLwotCSAgaWYgKG4gPT0gMykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgb3BlcmFuZHMiKSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICAqdG8rKyA9ICdcMCc7CQkvKiBUZXJtaW5hdGUgYXJndW1lbnQgKi8KLQkgIGFyZ3NbKytuXSA9IHRvOwkvKiBTdGFydCBuZXh0IGFyZ3VtZW50ICovCi0JICBwKys7Ci0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKnRvKysgPSAqcCsrOwotCX0KLSAgICB9Ci0gICp0byA9ICdcMCc7Ci0gIHJldHVybiBuOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZ2V0X2NkaXNwOgloYW5kbGUgZGlzcGxhY2VtZW50IGZvciBhIENPQlIgb3IgQ1RSTCBpbnN0cnVjdGlvbi4KLQotICAJUGFyc2UgZGlzcGxhY2VtZW50IGZvciBhIENPQlIgb3IgQ1RSTCBpbnN0cnVjdGlvbi4KLQotICAJSWYgc3VjY2Vzc2Z1bCwgb3V0cHV0IHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUgYW5kIHNldCB1cCBmb3IgaXQsCi0gIAlkZXBlbmRpbmcgb24gdGhlIGFyZyAndmFyX2ZyYWcnLCBlaXRoZXI6Ci0gIAkgICAgbyBhbiBhZGRyZXNzIGZpeHVwIHRvIGJlIGRvbmUgd2hlbiBhbGwgc3ltYm9sIHZhbHVlcyBhcmUga25vd24sIG9yCi0gIAkgICAgbyBhIHZhcnlpbmcgbGVuZ3RoIGNvZGUgZnJhZ21lbnQsIHdpdGggYWRkcmVzcyBmaXh1cCBpbmZvLiAgVGhpcwotICAJCXdpbGwgYmUgZG9uZSBmb3IgY29iciBpbnN0cnVjdGlvbnMgdGhhdCBtYXkgaGF2ZSB0byBiZSByZWxheGVkCi0gIAkJaW4gdG8gY29tcGFyZS9icmFuY2ggaW5zdHJ1Y3Rpb25zICg4IGJ5dGVzKSBpZiB0aGUgZmluYWwKLSAgCQlhZGRyZXNzIGRpc3BsYWNlbWVudCBpcyBncmVhdGVyIHRoYW4gMTMgYml0cy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkCi1nZXRfY2Rpc3AgKGRpc3BQLCBpZm10UCwgaW5zdHIsIG51bWJpdHMsIHZhcl9mcmFnLCBjYWxsaikKLSAgICAgLyogZGlzcGxhY2VtZW50IGFzIHNwZWNpZmllZCBpbiBzb3VyY2UgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgY2hhciAqZGlzcFA7Ci0gICAgIC8qICJDT0JSIiBvciAiQ1RSTCIgKGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZSkgKi8KLSAgICAgY2hhciAqaWZtdFA7Ci0gICAgIC8qIEluc3RydWN0aW9uIG5lZWRpbmcgdGhlIGRpc3BsYWNlbWVudCAqLwotICAgICBsb25nIGluc3RyOwotICAgICAvKiAjIGJpdHMgb2YgZGlzcGxhY2VtZW50ICgxMyBmb3IgQ09CUiwgMjQgZm9yIENUUkwpICovCi0gICAgIGludCBudW1iaXRzOwotICAgICAvKiAxIGlmIHZhcnlpbmcgbGVuZ3RoIGNvZGUgZnJhZ21lbnQgc2hvdWxkIGJlIGVtaXR0ZWQ7Ci0gICAgICAqICAgICAgIDAgaWYgYW4gYWRkcmVzcyBmaXggc2hvdWxkIGJlIGVtaXR0ZWQuCi0gICAgICAqLwotICAgICBpbnQgdmFyX2ZyYWc7Ci0gICAgIC8qIDEgaWYgY2FsbGogcmVsb2NhdGlvbiBzaG91bGQgYmUgZG9uZTsgZWxzZSAwICovCi0gICAgIGludCBjYWxsajsKLXsKLSAgZXhwcmVzc2lvblMgZTsJCS8qIFBhcnNlZCBleHByZXNzaW9uICovCi0gIGZpeFMgKmZpeFA7CQkJLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgbmVlZGVkIGFkZHJlc3MgZml4ICovCi0gIGNoYXIgKm91dFA7CQkJLyogV2hlcmUgaW5zdHJ1Y3Rpb24gYmluYXJ5IGlzIG91dHB1dCB0byAqLwotCi0gIGZpeFAgPSBOVUxMOwotCi0gIHBhcnNlX2V4cHIgKGRpc3BQLCAmZSk7Ci0gIHN3aXRjaCAoZS5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICAgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiBzeW50YXggZXJyb3IiKSk7Ci0KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGUuWF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnCi0JICB8fCBTX0dFVF9TRUdNRU5UIChlLlhfYWRkX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JewotCSAgaWYgKHZhcl9mcmFnKQotCSAgICB7Ci0JICAgICAgb3V0UCA9IGZyYWdfbW9yZSAoOCk7CS8qIEFsbG9jYXRlIHdvcnN0LWNhc2Ugc3RvcmFnZSAqLwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAob3V0UCwgaW5zdHIsIDQpOwotCSAgICAgIGZyYWdfdmFyaWFudCAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDQsIDEsCi0JCQkgICAgYWRkcyAoZSksIG9mZnMgKGUpLCBvdXRQKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2V0IHVwIGEgbmV3IGZpeCBzdHJ1Y3R1cmUsIHNvIGFkZHJlc3MgY2FuIGJlIHVwZGF0ZWQKLQkgICAgICAgKiB3aGVuIGFsbCBzeW1ib2wgdmFsdWVzIGFyZSBrbm93bi4KLQkgICAgICAgKi8KLQkgICAgICBvdXRQID0gZW1pdCAoaW5zdHIpOwotCSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnX25vdywKLQkJCSAgICAgIG91dFAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgIDQsCi0JCQkgICAgICBhZGRzIChlKSwKLQkJCSAgICAgIG9mZnMgKGUpLAotCQkJICAgICAgMSwKLQkJCSAgICAgIE5PX1JFTE9DKTsKLQotCSAgICAgIGZpeFAtPmZ4X3RjYml0ID0gY2FsbGo7Ci0KLQkgICAgICAvKiBXZSB3YW50IHRvIG1vZGlmeSBhIGJpdCBmaWVsZCB3aGVuIHRoZSBhZGRyZXNzIGlzCi0JICAgICAgICoga25vd24uICBCdXQgd2UgZG9uJ3QgbmVlZCBhbGwgdGhlIGdhcmJhZ2UgaW4gdGhlCi0JICAgICAgICogYml0X2ZpeCBzdHJ1Y3R1cmUuICBTbyB3ZSdyZSBnb2luZyB0byBsaWUgYW5kIHN0b3JlCi0JICAgICAgICogdGhlIG51bWJlciBvZiBiaXRzIGFmZmVjdGVkIGluc3RlYWQgb2YgYSBwb2ludGVyLgotCSAgICAgICAqLwotCSAgICAgIGZpeFAtPmZ4X2JpdF9maXhQID0gKGJpdF9maXhTICopIG51bWJpdHM7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJhdHRlbXB0IHRvIGJyYW5jaCBpbnRvIGRpZmZlcmVudCBzZWdtZW50IikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJ0YXJnZXQgb2YgJXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBhIGxhYmVsIiksIGlmbXRQKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGdldF9pc3BlYzoJcGFyc2UgYSBtZW1vcnkgb3BlcmFuZCBmb3IgYW4gaW5kZXggc3BlY2lmaWNhdGlvbgotCi0gIAlIZXJlLCBhbiAiaW5kZXggc3BlY2lmaWNhdGlvbiIgaXMgdGFrZW4gdG8gYmUgYW55dGhpbmcgc3Vycm91bmRlZAotICAJYnkgc3F1YXJlIGJyYWNrZXRzIGFuZCBOT1QgZm9sbG93ZWQgYnkgYW55dGhpbmcgZWxzZS4KLQotICAJSWYgaXQncyBmb3VuZCwgZGV0YWNoIGl0IGZyb20gdGhlIGlucHV0IHN0cmluZywgcmVtb3ZlIHRoZSBzdXJyb3VuZGluZwotICAJc3F1YXJlIGJyYWNrZXRzLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gIE90aGVyd2lzZSwgcmV0dXJuIE5VTEwuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLWNoYXIgKgotZ2V0X2lzcGVjICh0ZXh0UCkKLSAgICAgLyogUG9pbnRlciB0byBtZW1vcnkgb3BlcmFuZCBmcm9tIHNvdXJjZSBpbnN0cnVjdGlvbiwgbm8gd2hpdGUgc3BhY2UuICAqLwotICAgICBjaGFyICp0ZXh0UDsKLXsKLSAgLyogUG9pbnRzIHRvIHN0YXJ0IG9mIGluZGV4IHNwZWNpZmljYXRpb24uICAqLwotICBjaGFyICpzdGFydDsKLSAgLyogUG9pbnRzIHRvIGVuZCBvZiBpbmRleCBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgY2hhciAqZW5kOwotCi0gIC8qIEZpbmQgb3BlbmluZyBzcXVhcmUgYnJhY2tldCwgaWYgYW55LiAgKi8KLSAgc3RhcnQgPSBzdHJjaHIgKHRleHRQLCAnWycpOwotCi0gIGlmIChzdGFydCAhPSBOVUxMKQotICAgIHsKLQotICAgICAgLyogRWxpbWluYXRlICdbJywgZGV0YWNoIGZyb20gcmVzdCBvZiBvcGVyYW5kICovCi0gICAgICAqc3RhcnQrKyA9ICdcMCc7Ci0KLSAgICAgIGVuZCA9IHN0cmNociAoc3RhcnQsICddJyk7Ci0KLSAgICAgIGlmIChlbmQgPT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oInVubWF0Y2hlZCAnWyciKSk7Ci0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRWxpbWluYXRlICddJyBhbmQgbWFrZSBzdXJlIGl0IHdhcyB0aGUgbGFzdCB0aGluZwotCSAgICAgKiBpbiB0aGUgc3RyaW5nLgotCSAgICovCi0JICAqZW5kID0gJ1wwJzsKLQkgIGlmICgqKGVuZCArIDEpICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImdhcmJhZ2UgYWZ0ZXIgaW5kZXggc3BlYyBpZ25vcmVkIikpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHN0YXJ0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGdldF9yZWdudW06Ci0KLSAgCUxvb2sgdXAgYSAoc3VzcGVjdGVkKSByZWdpc3RlciBuYW1lIGluIHRoZSByZWdpc3RlciB0YWJsZSBhbmQgcmV0dXJuIHRoZQotICAJYXNzb2NpYXRlZCByZWdpc3RlciBudW1iZXIgKG9yIC0xIGlmIG5vdCBmb3VuZCkuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLWludAotZ2V0X3JlZ251bSAocmVnbmFtZSkKLSAgICAgY2hhciAqcmVnbmFtZTsJCS8qIFN1c3BlY3RlZCByZWdpc3RlciBuYW1lICovCi17Ci0gIGludCAqclA7Ci0KLSAgclAgPSAoaW50ICopIGhhc2hfZmluZCAocmVnX2hhc2gsIHJlZ25hbWUpOwotICByZXR1cm4gKHJQID09IE5VTEwpID8gLTEgOiAqclA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBpX3NjYW46CXBlcmZvcm0gbGV4aWNhbCBzY2FuIG9mIGFzY2lpIGFzc2VtYmxlciBpbnN0cnVjdGlvbi4KLQotICAgSW5wdXQgYXNzdW1wdGlvbnM6Ci0gIAktIGlucHV0IHN0cmluZyBpcyBhbiBpODA5NjAgaW5zdHJ1Y3Rpb24gKG5vdCBhIHBzZXVkby1vcCkKLSAgCS0gYWxsIGNvbW1lbnRzIGFuZCBsYWJlbHMgaGF2ZSBiZWVuIHJlbW92ZWQKLSAgCS0gYWxsIHN0cmluZ3Mgb2Ygd2hpdGVzcGFjZSBoYXZlIGJlZW4gY29sbGFwc2VkIHRvIGEgc2luZ2xlIGJsYW5rLgotCi0gICBPdXRwdXQ6Ci0gIAlhcmdzWzBdIHBvaW50cyB0byBvcGNvZGUsIG90aGVyIGVudHJpZXMgcG9pbnQgdG8gb3BlcmFuZHMuIEFsbCBzdHJpbmdzOgotICAJLSBhcmUgTlVMTC10ZXJtaW5hdGVkCi0gIAktIGNvbnRhaW4gbm8gd2hpdGVzcGFjZQotICAJLSBoYXZlIGNoYXJhY3RlciBjb25zdGFudHMgKCd4JykgcmVwbGFjZWQgd2l0aCBhIGRlY2ltYWwgbnVtYmVyCi0KLSAgIFJldHVybiB2YWx1ZToKLSAgCU51bWJlciBvZiBvcGVyYW5kcyAoMCwxLDIsIG9yIDMpIG9yIC0xIG9uIGVycm9yLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGludAotaV9zY2FuIChpUCwgYXJncykKLSAgICAgLyogUG9pbnRlciB0byBhc2NpaSBpbnN0cnVjdGlvbjsgIE1VQ0tFRCBCWSBVUy4gKi8KLSAgICAgcmVnaXN0ZXIgY2hhciAqaVA7Ci0gICAgIC8qIE91dHB1dCBhcmc6IHBvaW50ZXJzIHRvIG9wY29kZSBhbmQgb3BlcmFuZHMgcGxhY2VkIGhlcmUuICBNVVNUCi0JQUNDT01NT0RBVEUgNCBFTlRSSUVTLiAgKi8KLSAgICAgY2hhciAqYXJnc1tdOwotewotCi0gIC8qIElzb2xhdGUgb3Bjb2RlICovCi0gIGlmICgqKGlQKSA9PSAnICcpCi0gICAgewotICAgICAgaVArKzsKLSAgICB9CQkJCS8qIFNraXAgbGVhZCBzcGFjZSwgaWYgYW55ICovCi0gIGFyZ3NbMF0gPSBpUDsKLSAgZm9yICg7ICppUCAhPSAnICc7IGlQKyspCi0gICAgewotICAgICAgaWYgKCppUCA9PSAnXDAnKQotCXsKLQkgIC8qIFRoZXJlIGFyZSBubyBvcGVyYW5kcyAqLwotCSAgaWYgKGFyZ3NbMF0gPT0gaVApCi0JICAgIHsKLQkgICAgICAvKiBXZSBuZXZlciBtb3ZlZDogdGhlcmUgd2FzIG5vIG9wY29kZSBlaXRoZXIhICovCi0JICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wY29kZSIpKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gICppUCsrID0gJ1wwJzsJCQkvKiBUZXJtaW5hdGUgb3Bjb2RlICovCi0gIHJldHVybiAoZ2V0X2FyZ3MgKGlQLCBhcmdzKSk7Ci19CQkJCS8qIGlfc2NhbigpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZW1fZm10OglnZW5lcmF0ZSBhIE1FTUEtIG9yIE1FTUItZm9ybWF0IGluc3RydWN0aW9uCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZAotbWVtX2ZtdCAoYXJncywgb1AsIGNhbGx4KQotICAgICBjaGFyICphcmdzW107CQkvKiBhcmdzWzBdLT5vcGNvZGUgbW5lbW9uaWMsIGFyZ3NbMS0zXS0+b3BlcmFuZHMgKi8KLSAgICAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsJLyogUG9pbnRlciB0byBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbiAqLwotICAgICBpbnQgY2FsbHg7CQkJLyogSXMgdGhpcyBhIGNhbGx4IG9wY29kZSAqLwotewotICBpbnQgaTsJCQkvKiBMb29wIGNvdW50ZXIgKi8KLSAgc3RydWN0IHJlZ29wIHJlZ29wOwkJLyogRGVzY3JpcHRpb24gb2YgcmVnaXN0ZXIgb3BlcmFuZCAqLwotICBjaGFyIG9wZGVzYzsJCQkvKiBPcGVyYW5kIGRlc2NyaXB0b3IgYnl0ZSAqLwotICBtZW1TIGluc3RyOwkJCS8qIERlc2NyaXB0aW9uIG9mIGJpbmFyeSB0byBiZSBvdXRwdXQgKi8KLSAgY2hhciAqb3V0UDsJCQkvKiBXaGVyZSB0aGUgYmluYXJ5IHdhcyBvdXRwdXQgdG8gKi8KLSAgZXhwcmVzc2lvblMgZXhwcjsJCS8qIFBhcnNlZCBleHByZXNzaW9uICovCi0gIC8qIC0+ZGVzY3JpcHRpb24gb2YgZGVmZXJyZWQgYWRkcmVzcyBmaXh1cCAqLwotICBmaXhTICpmaXhQOwotCi0jaWZkZWYgT0JKX0NPRkYKLSAgLyogQ09GRiBzdXBwb3J0IGlzbid0IGluIHBsYWNlIHlldCBmb3IgY2FsbHggcmVsYXhpbmcuICAqLwotICBjYWxseCA9IDA7Ci0jZW5kaWYKLQotICBtZW1zZXQgKCZpbnN0ciwgJ1wwJywgc2l6ZW9mIChtZW1TKSk7Ci0gIGluc3RyLm9wY29kZSA9IG9QLT5vcGNvZGU7Ci0KLSAgLyogUHJvY2VzcyBvcGVyYW5kcy4gKi8KLSAgZm9yIChpID0gMTsgaSA8PSBvUC0+bnVtX29wczsgaSsrKQotICAgIHsKLSAgICAgIG9wZGVzYyA9IG9QLT5vcGVyYW5kW2kgLSAxXTsKLQotICAgICAgaWYgKE1FTU9QIChvcGRlc2MpKQotCXsKLQkgIHBhcnNlX21lbW9wICgmaW5zdHIsIGFyZ3NbaV0sIG9QLT5mb3JtYXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdzW2ldLCBvcGRlc2MpOwotCSAgaW5zdHIub3Bjb2RlIHw9IHJlZ29wLm4gPDwgMTk7Ci0JfQotICAgIH0KLQotICAvKiBQYXJzZSB0aGUgZGlzcGxhY2VtZW50OyB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgZW1pdHRpbmcgdGhlCi0gICAgIG9wY29kZSwgaW4gY2FzZSBpdCBpcyBhbiBleHByZXNzaW9uIHVzaW5nIGAuJy4gICovCi0gIHBhcnNlX2V4cHIgKGluc3RyLmUsICZleHByKTsKLQotICAvKiBPdXRwdXQgb3Bjb2RlICovCi0gIG91dFAgPSBlbWl0IChpbnN0ci5vcGNvZGUpOwotCi0gIGlmIChpbnN0ci5kaXNwID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBQcm9jZXNzIHRoZSBkaXNwbGFjZW1lbnQgKi8KLSAgc3dpdGNoIChleHByLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgICAgYXNfYmFkIChfKCJleHByZXNzaW9uIHN5bnRheCBlcnJvciIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgaWYgKGluc3RyLmRpc3AgPT0gMzIpCi0JewotCSAgKHZvaWQpIGVtaXQgKG9mZnMgKGV4cHIpKTsJLyogT3V0cHV0IGRpc3BsYWNlbWVudCAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiAxMi1iaXQgZGlzcGxhY2VtZW50ICovCi0JICBpZiAob2ZmcyAoZXhwcikgJiB+MHhmZmYpCi0JICAgIHsKLQkgICAgICAvKiBXb24ndCBmaXQgaW4gMTIgYml0czogY29udmVydCBhbHJlYWR5LW91dHB1dAotCSAgICAgICAqIGluc3RydWN0aW9uIHRvIE1FTUIgZm9ybWF0LCBvdXRwdXQKLQkgICAgICAgKiBkaXNwbGFjZW1lbnQuCi0JICAgICAgICovCi0JICAgICAgbWVtYV90b19tZW1iIChvdXRQKTsKLQkgICAgICAodm9pZCkgZW1pdCAob2ZmcyAoZXhwcikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXSUxMIGZpdCBpbiAxMiBiaXRzOiAgT1IgaW50byBvcGNvZGUgYW5kCi0JICAgICAgICogb3ZlcndyaXRlIHRoZSBiaW5hcnkgd2UgYWxyZWFkeSBwdXQgb3V0Ci0JICAgICAgICovCi0JICAgICAgaW5zdHIub3Bjb2RlIHw9IG9mZnMgKGV4cHIpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAob3V0UCwgaW5zdHIub3Bjb2RlLCA0KTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChpbnN0ci5kaXNwID09IDEyKQotCXsKLQkgIC8qIERpc3BsYWNlbWVudCBpcyBkZXBlbmRlbnQgb24gYSBzeW1ib2wsIHdob3NlIHZhbHVlCi0JICAgKiBtYXkgY2hhbmdlIGF0IGxpbmsgdGltZS4gIFdlIEhBVkUgdG8gcmVzZXJ2ZSAzMiBiaXRzLgotCSAgICogQ29udmVydCBhbHJlYWR5LW91dHB1dCBvcGNvZGUgdG8gTUVNQiBmb3JtYXQuCi0JICAgKi8KLQkgIG1lbWFfdG9fbWVtYiAob3V0UCk7Ci0JfQotCi0gICAgICAvKiBPdXRwdXQgMCBkaXNwbGFjZW1lbnQgYW5kIHNldCB1cCBhZGRyZXNzIGZpeHVwIGZvciB3aGVuCi0gICAgICAgKiB0aGlzIHN5bWJvbCdzIHZhbHVlIGJlY29tZXMga25vd24uCi0gICAgICAgKi8KLSAgICAgIG91dFAgPSBlbWl0ICgobG9uZykgMCk7Ci0gICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICBvdXRQIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgIDQsCi0JCQkgICZleHByLAotCQkJICAwLAotCQkJICBOT19SRUxPQyk7Ci0gICAgICAvKiBTdGV2ZSdzIGxpbmtlciByZWxheGluZyBoYWNrLiAgTWFyayB0aGlzIDMyLWJpdCByZWxvY2F0aW9uIGFzCi0gICAgICAgICBiZWluZyBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLCBzcGVjaWZpY2FsbHkgYXMgcGFydCBvZiBhIGNhbGx4Ci0gICAgICAgICBpbnN0cnVjdGlvbi4gICovCi0gICAgICBmaXhQLT5meF9ic3IgPSBjYWxseDsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0JCQkJLyogbWVtZm10KCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1lbWFfdG9fbWVtYjoJY29udmVydCBhIE1FTUEtZm9ybWF0IG9wY29kZSB0byBhIE1FTUItZm9ybWF0IG9wY29kZS4KLQotICAgVGhlcmUgYXJlIDIgcG9zc2libGUgTUVNQSBmb3JtYXRzOgotICAJLSBkaXNwbGFjZW1lbnQgb25seQotICAJLSBkaXNwbGFjZW1lbnQgKyBhYmFzZQotCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSBzZXR0aW5nIG9mIHRoZSBNRU1BX0FCQVNFIGJpdC4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1tZW1hX3RvX21lbWIgKG9wY29kZVApCi0gICAgIGNoYXIgKm9wY29kZVA7CQkvKiBXaGVyZSB0byBmaW5kIHRoZSBvcGNvZGUsIGluIHRhcmdldCBieXRlIG9yZGVyICovCi17Ci0gIGxvbmcgb3Bjb2RlOwkJCS8qIE9wY29kZSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KLSAgbG9uZyBtb2RlOwkJCS8qIE1vZGUgYml0cyBmb3IgTUVNQiBpbnN0cnVjdGlvbiAqLwotCi0gIG9wY29kZSA9IG1kX2NoYXJzX3RvX251bWJlciAob3Bjb2RlUCwgNCk7Ci0gIGtub3cgKCEob3Bjb2RlICYgTUVNQl9CSVQpKTsKLQotICBtb2RlID0gTUVNQl9CSVQgfCBEX0JJVDsKLSAgaWYgKG9wY29kZSAmIE1FTUFfQUJBU0UpCi0gICAgewotICAgICAgbW9kZSB8PSBBX0JJVDsKLSAgICB9Ci0KLSAgb3Bjb2RlICY9IDB4ZmZmZmMwMDA7CQkvKiBDbGVhciBNRU1BIG9mZnNldCBhbmQgbW9kZSBiaXRzICovCi0gIG9wY29kZSB8PSBtb2RlOwkJLyogU2V0IE1FTUIgbW9kZSBiaXRzICovCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChvcGNvZGVQLCBvcGNvZGUsIDQpOwotfQkJCQkvKiBtZW1hX3RvX21lbWIoKSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcGFyc2VfZXhwcjoJCXBhcnNlIGFuIGV4cHJlc3Npb24KLQotICAJVXNlIGJhc2UgYXNzZW1ibGVyJ3MgZXhwcmVzc2lvbiBwYXJzZXIgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbi4KLSAgCUl0LCB1bmZvcnR1bmF0ZWx5LCBydW5zIG9mZiBhIGdsb2JhbCB3aGljaCB3ZSBoYXZlIHRvIHNhdmUvcmVzdG9yZQotICAJaW4gb3JkZXIgdG8gbWFrZSBpdCB3b3JrIGZvciB1cy4KLQotICAJQW4gZW1wdHkgZXhwcmVzc2lvbiBzdHJpbmcgaXMgdHJlYXRlZCBhcyBhbiBhYnNvbHV0ZSAwLgotCi0gIAlTZXRzIE9faWxsZWdhbCByZWdhcmRsZXNzIG9mIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBpZiBlbnRpcmUgaW5wdXQKLSAgCXN0cmluZyBpcyBub3QgY29uc3VtZWQgaW4gdGhlIGV2YWx1YXRpb24gLS0gdG9sZXJhdGUgbm8gZGFuZ2xpbmcganVuayEKLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1wYXJzZV9leHByICh0ZXh0UCwgZXhwUCkKLSAgICAgY2hhciAqdGV4dFA7CQkvKiBUZXh0IG9mIGV4cHJlc3Npb24gdG8gYmUgcGFyc2VkICovCi0gICAgIGV4cHJlc3Npb25TICpleHBQOwkJLyogV2hlcmUgdG8gcHV0IHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgKi8KLXsKLSAgY2hhciAqc2F2ZV9pbjsJCS8qIFNhdmUgZ2xvYmFsIGhlcmUgKi8KLSAgc3ltYm9sUyAqc3ltUDsKLQotICBrbm93ICh0ZXh0UCk7Ci0KLSAgaWYgKCp0ZXh0UCA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFRyZWF0IGVtcHR5IHN0cmluZyBhcyBhYnNvbHV0ZSAwICovCi0gICAgICBleHBQLT5YX2FkZF9zeW1ib2wgPSBleHBQLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsJLyogU2F2ZSBnbG9iYWwgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRleHRQOwkvKiBNYWtlIHBhcnNlciB3b3JrIGZvciB1cyAqLwotCi0gICAgICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwUCk7Ci0gICAgICBpZiAoKHNpemVfdCkgKGlucHV0X2xpbmVfcG9pbnRlciAtIHRleHRQKSAhPSBzdHJsZW4gKHRleHRQKSkKLQl7Ci0JICAvKiBEaWQgbm90IGNvbnN1bWUgYWxsIG9mIHRoZSBpbnB1dCAqLwotCSAgZXhwUC0+WF9vcCA9IE9faWxsZWdhbDsKLQl9Ci0gICAgICBzeW1QID0gZXhwUC0+WF9hZGRfc3ltYm9sOwotICAgICAgaWYgKHN5bVAgJiYgKGhhc2hfZmluZCAocmVnX2hhc2gsIFNfR0VUX05BTUUgKHN5bVApKSkpCi0JewotCSAgLyogUmVnaXN0ZXIgbmFtZSBpbiBhbiBleHByZXNzaW9uICovCi0JICAvKiBGSVhNRTogdGhpcyBpc24ndCBtdWNoIG9mIGEgY2hlY2sgYW55IG1vcmUuICAqLwotCSAgZXhwUC0+WF9vcCA9IE9faWxsZWdhbDsKLQl9Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47CS8qIFJlc3RvcmUgZ2xvYmFsICovCi0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcGFyc2VfbGRjb250OgotICAJUGFyc2UgYW5kIHJlcGxhY2UgYSAnbGRjb25zdCcgcHNldWRvLWluc3RydWN0aW9uIHdpdGggYW4gYXBwcm9wcmlhdGUKLSAgCWk4MDk2MCBpbnN0cnVjdGlvbi4KLQotICAJQXNzdW1lcyB0aGUgaW5wdXQgY29uc2lzdHMgb2Y6Ci0gIAkJYXJnWzBdCW9wY29kZSBtbmVtb25pYyAoJ2xkY29uc3QnKQotICAJCWFyZ1sxXSAgZmlyc3Qgb3BlcmFuZCAoY29uc3RhbnQpCi0gIAkJYXJnWzJdCW5hbWUgb2YgcmVnaXN0ZXIgdG8gYmUgbG9hZGVkCi0KLSAgCVJlcGxhY2VzIG9wY29kZSBhbmQvb3Igb3BlcmFuZHMgYXMgYXBwcm9wcmlhdGUuCi0KLSAgCVJldHVybnMgdGhlIG5ldyBudW1iZXIgb2YgYXJndW1lbnRzLCBvciAtMSBvbiBmYWlsdXJlLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi1pbnQKLXBhcnNlX2xkY29uc3QgKGFyZykKLSAgICAgY2hhciAqYXJnW107CQkvKiBTZWUgYWJvdmUgKi8KLXsKLSAgaW50IG47CQkJLyogQ29uc3RhbnQgdG8gYmUgbG9hZGVkICovCi0gIGludCBzaGlmdDsJCQkvKiBTaGlmdCBjb3VudCBmb3IgInNobG8iIGluc3RydWN0aW9uICovCi0gIHN0YXRpYyBjaGFyIGJ1Zls1XTsJCS8qIExpdGVyYWwgZm9yIGZpcnN0IG9wZXJhbmQgKi8KLSAgc3RhdGljIGNoYXIgYnVmMls1XTsJCS8qIExpdGVyYWwgZm9yIHNlY29uZCBvcGVyYW5kICovCi0gIGV4cHJlc3Npb25TIGU7CQkvKiBQYXJzZWQgZXhwcmVzc2lvbiAqLwotCi0KLSAgYXJnWzNdID0gTlVMTDsJCS8qIFNvIHdlIGNhbiB0ZWxsIGF0IHRoZSBlbmQgaWYgaXQgZ290IHVzZWQgb3Igbm90ICovCi0KLSAgcGFyc2VfZXhwciAoYXJnWzFdLCAmZSk7Ci0gIHN3aXRjaCAoZS5YX29wKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgLyogV2UncmUgZGVwZW5kZW50IG9uIG9uZSBvciBtb3JlIHN5bWJvbHMgLS0gdXNlICJsZGEiICovCi0gICAgICBhcmdbMF0gPSAibGRhIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgLyogVHJ5IHRoZSBmb2xsb3dpbmcgbWFwcGluZ3M6Ci0gICAgICAgKiAgICAgIGxkY29uc3QgMCw8cmVnPiAgLT5tb3YgIDAsPHJlZz4KLSAgICAgICAqICAgICAgICBsZGNvbnN0IDMxLDxyZWc+IC0+bW92ICAzMSw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgMzIsPHJlZz4gLT5hZGRvIDEsMzEsPHJlZz4KLSAgICAgICAqICAgICAgICBsZGNvbnN0IDYyLDxyZWc+IC0+YWRkbyAzMSwzMSw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgNjQsPHJlZz4gLT5zaGxvIDgsMyw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgLTEsPHJlZz4gLT5zdWJvIDEsMCw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgLTMxLDxyZWc+LT5zdWJvIDMxLDAsPHJlZz4KLSAgICAgICAqCi0gICAgICAgKiBhbnRoaW5nIGVsc2UgYmVjb21lczoKLSAgICAgICAqICAgICAgICBsZGEgeHh4LDxyZWc+Ci0gICAgICAgKi8KLSAgICAgIG4gPSBvZmZzIChlKTsKLSAgICAgIGlmICgoMCA8PSBuKSAmJiAobiA8PSAzMSkpCi0JewotCSAgYXJnWzBdID0gIm1vdiI7Ci0KLQl9Ci0gICAgICBlbHNlIGlmICgoLTMxIDw9IG4pICYmIChuIDw9IC0xKSkKLQl7Ci0JICBhcmdbMF0gPSAic3VibyI7Ci0JICBhcmdbM10gPSBhcmdbMl07Ci0JICBzcHJpbnRmIChidWYsICIlZCIsIC1uKTsKLQkgIGFyZ1sxXSA9IGJ1ZjsKLQkgIGFyZ1syXSA9ICIwIjsKLQotCX0KLSAgICAgIGVsc2UgaWYgKCgzMiA8PSBuKSAmJiAobiA8PSA2MikpCi0JewotCSAgYXJnWzBdID0gImFkZG8iOwotCSAgYXJnWzNdID0gYXJnWzJdOwotCSAgYXJnWzFdID0gIjMxIjsKLQkgIHNwcmludGYgKGJ1ZiwgIiVkIiwgbiAtIDMxKTsKLQkgIGFyZ1syXSA9IGJ1ZjsKLQotCX0KLSAgICAgIGVsc2UgaWYgKChzaGlmdCA9IHNoaWZ0X29rIChuKSkgIT0gMCkKLQl7Ci0JICBhcmdbMF0gPSAic2hsbyI7Ci0JICBhcmdbM10gPSBhcmdbMl07Ci0JICBzcHJpbnRmIChidWYsICIlZCIsIHNoaWZ0KTsKLQkgIGFyZ1sxXSA9IGJ1ZjsKLQkgIHNwcmludGYgKGJ1ZjIsICIlZCIsIG4gPj4gc2hpZnQpOwotCSAgYXJnWzJdID0gYnVmMjsKLQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhcmdbMF0gPSAibGRhIjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNvbnN0YW50IikpOwotICAgICAgcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKGFyZ1szXSA9PSAwKSA/IDIgOiAzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHBhcnNlX21lbW9wOglwYXJzZSBhIG1lbW9yeSBvcGVyYW5kCi0KLSAgCVRoaXMgcm91dGluZSBpcyBiYXNlZCBvbiB0aGUgb2JzZXJ2YXRpb24gdGhhdCB0aGUgNCBtb2RlIGJpdHMgb2YgdGhlCi0gIAlNRU1CIGZvcm1hdCwgdGFrZW4gaW5kaXZpZHVhbGx5LCBoYXZlIGZhaXJseSBjb25zaXN0ZW50IG1lYW5pbmc6Ci0KLSAgCQkgTTMgKGJpdCAxMyk6IDEgaWYgZGlzcGxhY2VtZW50IGlzIHByZXNlbnQgKERfQklUKQotICAJCSBNMiAoYml0IDEyKTogMSBmb3IgTUVNQiBpbnN0cnVjdGlvbnMgKE1FTUJfQklUKQotICAJCSBNMSAoYml0IDExKTogMSBpZiBpbmRleCBpcyBwcmVzZW50IChJX0JJVCkKLSAgCQkgTTAgKGJpdCAxMCk6IDEgaWYgYWJhc2UgaXMgcHJlc2VudCAoQV9CSVQpCi0KLSAgCVNvIHdlIHBhcnNlIHRoZSBtZW1vcnkgb3BlcmFuZCBhbmQgc2V0IGJpdHMgaW4gdGhlIG1vZGUgYXMgd2UgZmluZAotICAJdGhpbmdzLiAgVGhlbiBhdCB0aGUgZW5kLCBpZiB3ZSBnbyB0byBNRU1CIGZvcm1hdCwgd2UgbmVlZCBvbmx5IHNldAotICAJdGhlIE1FTUIgYml0IChNMikgYW5kIG91ciBtb2RlIGlzIGJ1aWx0IGZvciB1cy4KLQotICAJVW5mb3J0dW5hdGVseSwgSSBzYWlkICJmYWlybHkgY29uc2lzdGVudCIuICBUaGUgZXhjZXB0aW9uczoKLQotICAJCSBEQklBCi0gIAkJIDAxMDAJV291bGQgc2VlbSBpbGxlZ2FsLCBidXQgbWVhbnMgImFiYXNlLW9ubHkiLgotCi0gIAkJIDAxMDEJV291bGQgc2VlbSB0byBtZWFuICJhYmFzZS1vbmx5IiAtLSBpdCBtZWFucyBJUC1yZWxhdGl2ZS4KLSAgCQkJTXVzdCBiZSBjb252ZXJ0ZWQgdG8gMDEwMC4KLQotICAJCSAwMTEwCVdvdWxkIHNlZW0gdG8gbWVhbiAiaW5kZXgtb25seSIsIGJ1dCBpcyByZXNlcnZlZC4KLSAgCQkJV2UgdHVybiBvbiB0aGUgRCBiaXQgYW5kIHByb3ZpZGUgYSAwIGRpc3BsYWNlbWVudC4KLQotICAJVGhlIG90aGVyIHRoaW5nIHRvIG9ic2VydmUgaXMgdGhhdCB3ZSBwYXJzZSBmcm9tIHRoZSByaWdodCwgcGVlbGluZwotICAJdGhpbmdzICogb2ZmIGFzIHdlIGdvOiAgZmlyc3QgYW55IGluZGV4IHNwZWMsIHRoZW4gYW55IGFiYXNlLCB0aGVuCi0gIAl0aGUgZGlzcGxhY2VtZW50LgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1wYXJzZV9tZW1vcCAobWVtUCwgYXJnUCwgb3B0eXBlKQotICAgICBtZW1TICptZW1QOwkJLyogV2hlcmUgdG8gcHV0IHRoZSByZXN1bHRzICovCi0gICAgIGNoYXIgKmFyZ1A7CQkvKiBUZXh0IG9mIHRoZSBvcGVyYW5kIHRvIGJlIHBhcnNlZCAqLwotICAgICBpbnQgb3B0eXBlOwkJLyogTUVNMSwgTUVNMiwgTUVNNCwgTUVNOCwgTUVNMTIsIG9yIE1FTTE2ICovCi17Ci0gIGNoYXIgKmluZGV4UDsJCQkvKiBQb2ludGVyIHRvIGluZGV4IHNwZWNpZmljYXRpb24gd2l0aCAiW10iIHJlbW92ZWQgKi8KLSAgY2hhciAqcDsJCQkvKiBUZW1wIGNoYXIgcG9pbnRlciAqLwotICBjaGFyIGlwcmVsX2ZsYWc7CQkvKiBUcnVlIGlmIHRoaXMgaXMgYW4gSVAtcmVsYXRpdmUgb3BlcmFuZCAqLwotICBpbnQgcmVnbnVtOwkJCS8qIFJlZ2lzdGVyIG51bWJlciAqLwotICAvKiBTY2FsZSBmYWN0b3I6IDEsMiw0LDgsIG9yIDE2LiAgTGF0ZXIgY29udmVydGVkIHRvIGludGVybmFsIGZvcm1hdAotICAgICAoMCwxLDIsMyw0IHJlc3BlY3RpdmVseSkuICAqLwotICBpbnQgc2NhbGU7Ci0gIGludCBtb2RlOwkJCS8qIE1FTUIgbW9kZSBiaXRzICovCi0gIGludCAqaW50UDsJCQkvKiBQb2ludGVyIHRvIHJlZ2lzdGVyIG51bWJlciAqLwotCi0gIC8qIFRoZSBmb2xsb3dpbmcgdGFibGUgY29udGFpbnMgdGhlIGRlZmF1bHQgc2NhbGUgZmFjdG9ycyBmb3IgZWFjaAotICAgICB0eXBlIG9mIG1lbW9yeSBpbnN0cnVjdGlvbi4gIEl0IGlzIGFjY2Vzc2VkIHVzaW5nIChvcHR5cGUtTUVNMSkKLSAgICAgYXMgYW4gaW5kZXggLS0gdGh1cyBpdCBhc3N1bWVzIHRoZSAnb3B0eXBlJyBjb25zdGFudHMgYXJlCi0gICAgIGFzc2lnbmVkIGNvbnNlY3V0aXZlIHZhbHVlcywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoaXMKLSAgICAgdGFibGUuICAqLwotICBzdGF0aWMgY29uc3QgaW50IGRlZl9zY2FsZVtdID0KLSAgewotICAgIDEsCQkJCS8qIE1FTTEgKi8KLSAgICAyLAkJCQkvKiBNRU0yICovCi0gICAgNCwJCQkJLyogTUVNNCAqLwotICAgIDgsCQkJCS8qIE1FTTggKi8KLSAgICAtMSwJCQkJLyogTUVNMTIgLS0gbm8gdmFsaWQgZGVmYXVsdCAqLwotICAgIDE2CQkJCS8qIE1FTTE2ICovCi0gIH07Ci0KLQotICBpcHJlbF9mbGFnID0gbW9kZSA9IDA7Ci0KLSAgLyogQW55IGluZGV4IHByZXNlbnQ/ICovCi0gIGluZGV4UCA9IGdldF9pc3BlYyAoYXJnUCk7Ci0gIGlmIChpbmRleFApCi0gICAgewotICAgICAgcCA9IHN0cmNociAoaW5kZXhQLCAnKicpOwotICAgICAgaWYgKHAgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBleHBsaWNpdCBzY2FsZSAtLSB1c2UgZGVmYXVsdCBmb3IgdGhpcyBpbnN0cnVjdGlvbgotCSAgICAgdHlwZSBhbmQgYXNzZW1ibGVyIG1vZGUuICAqLwotCSAgaWYgKGZsYWdfbXJpKQotCSAgICBzY2FsZSA9IDE7Ci0JICBlbHNlCi0JICAgIC8qIEdOVTk2MCBjb21wYXRpYmlsaXR5ICovCi0JICAgIHNjYWxlID0gZGVmX3NjYWxlW29wdHlwZSAtIE1FTTFdOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqcCsrID0gJ1wwJzsJCS8qIEVsaW1pbmF0ZSAnKicgKi8KLQotCSAgLyogTm93IGluZGV4UC0+YSAnXDAnLXRlcm1pbmF0ZWQgcmVnaXN0ZXIgbmFtZSwKLQkgICAgICogYW5kIHAtPmEgc2NhbGUgZmFjdG9yLgotCSAgICovCi0KLQkgIGlmICghc3RyY21wIChwLCAiMTYiKSkKLQkgICAgewotCSAgICAgIHNjYWxlID0gMTY7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNociAoIjEyNDgiLCAqcCkgJiYgKHBbMV0gPT0gJ1wwJykpCi0JICAgIHsKLQkgICAgICBzY2FsZSA9ICpwIC0gJzAnOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzY2FsZSA9IC0xOwotCSAgICB9Ci0JfQotCi0gICAgICByZWdudW0gPSBnZXRfcmVnbnVtIChpbmRleFApOwkvKiBHZXQgaW5kZXggcmVnLiAjICovCi0gICAgICBpZiAoIUlTX1JHX1JFRyAocmVnbnVtKSkKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgaW5kZXggcmVnaXN0ZXIiKSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBDb252ZXJ0IHNjYWxlIHRvIGl0cyBiaW5hcnkgZW5jb2RpbmcgKi8KLSAgICAgIHN3aXRjaCAoc2NhbGUpCi0JewotCWNhc2UgMToKLQkgIHNjYWxlID0gMCA8PCA3OwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgc2NhbGUgPSAxIDw8IDc7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JICBzY2FsZSA9IDIgPDwgNzsKLQkgIGJyZWFrOwotCWNhc2UgODoKLQkgIHNjYWxlID0gMyA8PCA3OwotCSAgYnJlYWs7Ci0JY2FzZSAxNjoKLQkgIHNjYWxlID0gNCA8PCA3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBzY2FsZSBmYWN0b3IiKSk7Ci0JICByZXR1cm47Ci0JfTsKLQotICAgICAgbWVtUC0+b3Bjb2RlIHw9IHNjYWxlIHwgcmVnbnVtOwkvKiBTZXQgaW5kZXggYml0cyBpbiBvcGNvZGUgKi8KLSAgICAgIG1vZGUgfD0gSV9CSVQ7CQkvKiBGb3VuZCBhIHZhbGlkIGluZGV4IHNwZWMgKi8KLSAgICB9Ci0KLSAgLyogQW55IGFiYXNlIChSZWdpc3RlciBJbmRpcmVjdCkgc3BlY2lmaWNhdGlvbiBwcmVzZW50PyAqLwotICBpZiAoKHAgPSBzdHJyY2hyIChhcmdQLCAnKCcpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qICIoIiBpcyB0aGVyZSAtLSBkb2VzIGl0IHN0YXJ0IGEgbGVnYWwgYWJhc2Ugc3BlYz8gIElmIG5vdCwgaXQKLSAgICAgICAgIGNvdWxkIGJlIHBhcnQgb2YgYSBkaXNwbGFjZW1lbnQgZXhwcmVzc2lvbi4gICovCi0gICAgICBpbnRQID0gKGludCAqKSBoYXNoX2ZpbmQgKGFyZWdfaGFzaCwgcCk7Ci0gICAgICBpZiAoaW50UCAhPSBOVUxMKQotCXsKLQkgIC8qIEdvdCBhbiBhYmFzZSBoZXJlICovCi0JICByZWdudW0gPSAqaW50UDsKLQkgICpwID0gJ1wwJzsJCS8qIGRpc2NhcmQgcmVnaXN0ZXIgc3BlYyAqLwotCSAgaWYgKHJlZ251bSA9PSBJUFJFTCkKLQkgICAgewotCSAgICAgIC8qIFdlIGhhdmUgdG8gc3BlY2lhbGNhc2UgaXAtcmVsIG1vZGUgKi8KLQkgICAgICBpcHJlbF9mbGFnID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWVtUC0+b3Bjb2RlIHw9IHJlZ251bSA8PCAxNDsKLQkgICAgICBtb2RlIHw9IEFfQklUOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBbnkgZXhwcmVzc2lvbiBwcmVzZW50PyAqLwotICBtZW1QLT5lID0gYXJnUDsKLSAgaWYgKCphcmdQICE9ICdcMCcpCi0gICAgewotICAgICAgbW9kZSB8PSBEX0JJVDsKLSAgICB9Ci0KLSAgLyogU3BlY2lhbC1jYXNlIGlwLXJlbGF0aXZlIGFkZHJlc3NpbmcgKi8KLSAgaWYgKGlwcmVsX2ZsYWcpCi0gICAgewotICAgICAgaWYgKG1vZGUgJiBJX0JJVCkKLQl7Ci0JICBzeW50YXggKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbVAtPm9wY29kZSB8PSA1IDw8IDEwOwkvKiBJUC1yZWxhdGl2ZSBtb2RlICovCi0JICBtZW1QLT5kaXNwID0gMzI7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBIYW5kbGUgYWxsIG90aGVyIG1vZGVzICovCi0gIHN3aXRjaCAobW9kZSkKLSAgICB7Ci0gICAgY2FzZSBEX0JJVCB8IEFfQklUOgotICAgICAgLyogR28gd2l0aCBNRU1BIGluc3RydWN0aW9uIGZvcm1hdCBmb3Igbm93IChncm93IHRvIE1FTUIgbGF0ZXIKLSAgICAgICAgIGlmIDEyIGJpdHMgaXMgbm90IGVub3VnaCBmb3IgdGhlIGRpc3BsYWNlbWVudCkuICBNRU1BIGZvcm1hdAotICAgICAgICAgaGFzIGEgc2luZ2xlIG1vZGUgYml0OiBzZXQgaXQgdG8gaW5kaWNhdGUgdGhhdCBhYmFzZSBpcwotICAgICAgICAgcHJlc2VudC4gICovCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gTUVNQV9BQkFTRTsKLSAgICAgIG1lbVAtPmRpc3AgPSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEX0JJVDoKLSAgICAgIC8qIEdvIHdpdGggTUVNQSBpbnN0cnVjdGlvbiBmb3JtYXQgZm9yIG5vdyAoZ3JvdyB0byBNRU1CIGxhdGVyCi0gICAgICAgICBpZiAxMiBiaXRzIGlzIG5vdCBlbm91Z2ggZm9yIHRoZSBkaXNwbGFjZW1lbnQpLiAgKi8KLSAgICAgIG1lbVAtPmRpc3AgPSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBX0JJVDoKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIGJpdCBzdHJpbmcgZm9yIHRoaXMgbW9kZSBpcyBub3QKLSAgICAgICAgIGNvbnNpc3RlbnQ6IGl0IHNob3VsZCBiZSAwIChleGNsdXNpdmUgb2YgdGhlIE1FTUIgYml0KSwgc28gd2UKLSAgICAgICAgIHNldCBpdCAiYnkgaGFuZCIgaGVyZS4gICovCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gTUVNQl9CSVQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQV9CSVQgfCBJX0JJVDoKLSAgICAgIC8qIHNldCBNRU1CIGJpdCBpbiBtb2RlLCBhbmQgT1IgaW4gbW9kZSBiaXRzICovCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gbW9kZSB8IE1FTUJfQklUOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIElfQklUOgotICAgICAgLyogVHJlYXQgbWlzc2luZyBkaXNwbGFjZW1lbnQgYXMgZGlzcGxhY2VtZW50IG9mIDAuICAqLwotICAgICAgbW9kZSB8PSBEX0JJVDsKLSAgICAgIC8qIEZhbGwgaW50byBuZXh0IGNhc2UuICAqLwotICAgIGNhc2UgRF9CSVQgfCBBX0JJVCB8IElfQklUOgotICAgIGNhc2UgRF9CSVQgfCBJX0JJVDoKLSAgICAgIC8qIHNldCBNRU1CIGJpdCBpbiBtb2RlLCBhbmQgT1IgaW4gbW9kZSBiaXRzICovCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gbW9kZSB8IE1FTUJfQklUOwotICAgICAgbWVtUC0+ZGlzcCA9IDMyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3ludGF4ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHBhcnNlX3BvOglwYXJzZSBtYWNoaW5lLWRlcGVuZGVudCBwc2V1ZG8tb3AKLQotICAJVGhpcyBpcyBhIHRvcC1sZXZlbCByb3V0aW5lIGZvciBtYWNoaW5lLWRlcGVuZGVudCBwc2V1ZG8tb3BzLiAgSXQgc2x1cnBzCi0gIAl1cCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQgbGluZSwgYnJlYWtzIG91dCB0aGUgaW5kaXZpZHVhbCBhcmd1bWVudHMsCi0gIAlhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHRoZSBjb3JyZWN0IGhhbmRsZXIuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1wYXJzZV9wbyAocG9fbnVtKQotICAgICBpbnQgcG9fbnVtOwkJLyogUHNldWRvLW9wIG51bWJlcjogIGN1cnJlbnRseSBTX0xFQUZQUk9DIG9yIFNfU1lTUFJPQyAqLwotewotICAvKiBQb2ludGVycyBvcGVyYW5kcywgd2l0aCBubyBlbWJlZGRlZCB3aGl0ZXNwYWNlLgotICAgICBhcmdbMF0gdW51c2VkLCBhcmdbMS0zXS0+b3BlcmFuZHMgKi8KLSAgY2hhciAqYXJnc1s0XTsKLSAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotICBjaGFyICpwOwkJCS8qIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHVucGFyc2VkIGFyZ3VtZW50IHN0cmluZyAqLwotICBjaGFyIGVvbDsJCQkvKiBDaGFyYWN0ZXIgdGhhdCBpbmRpY2F0ZWQgZW5kIG9mIGxpbmUgKi8KLQotICBleHRlcm4gY2hhciBpc19lbmRfb2ZfbGluZVtdOwotCi0gIC8qIEFkdmFuY2UgaW5wdXQgcG9pbnRlciB0byBlbmQgb2YgbGluZS4gKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlb2wgPSAqaW5wdXRfbGluZV9wb2ludGVyOwkvKiBTYXZlIGVuZC1vZi1saW5lIGNoYXIgKi8KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7CS8qIFRlcm1pbmF0ZSBhcmd1bWVudCBsaXN0ICovCi0KLSAgLyogUGFyc2Ugb3V0IG9wZXJhbmRzICovCi0gIG5fb3BzID0gZ2V0X2FyZ3MgKHAsIGFyZ3MpOwotICBpZiAobl9vcHMgPT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEaXNwYXRjaCB0byBjb3JyZWN0IGhhbmRsZXIgKi8KLSAgc3dpdGNoIChwb19udW0pCi0gICAgewotICAgIGNhc2UgU19TWVNQUk9DOgotICAgICAgc19zeXNwcm9jIChuX29wcywgYXJncyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNfTEVBRlBST0M6Ci0gICAgICBzX2xlYWZwcm9jIChuX29wcywgYXJncyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKHBvX251bSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogUmVzdG9yZSBlb2wsIHNvIGxpbmUgbnVtYmVycyBnZXQgdXBkYXRlZCBjb3JyZWN0bHkuICBCYXNlCi0gICAgIGFzc2VtYmxlciBhc3N1bWVzIHdlIGxlYXZlIGlucHV0IHBvaW50ZXIgcG9pbnRpbmcgYXQgY2hhcgotICAgICBmb2xsb3dpbmcgdGhlIGVvbC4gICovCi0gICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGVvbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBwYXJzZV9yZWdvcDogcGFyc2UgYSByZWdpc3RlciBvcGVyYW5kLgotCi0gIAlJbiBjYXNlIG9mIGlsbGVnYWwgb3BlcmFuZCwgaXNzdWUgYSBtZXNzYWdlIGFuZCByZXR1cm4gc29tZSB2YWxpZAotICAJaW5mb3JtYXRpb24gc28gaW5zdHJ1Y3Rpb24gcHJvY2Vzc2luZyBjYW4gY29udGludWUuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1wYXJzZV9yZWdvcCAocmVnb3BQLCBvcHRleHQsIG9wZGVzYykKLSAgICAgc3RydWN0IHJlZ29wICpyZWdvcFA7CS8qIFdoZXJlIHRvIHB1dCBkZXNjcmlwdGlvbiBvZiByZWdpc3RlciBvcGVyYW5kICovCi0gICAgIGNoYXIgKm9wdGV4dDsJCS8qIFRleHQgb2Ygb3BlcmFuZCAqLwotICAgICBjaGFyIG9wZGVzYzsJCS8qIERlc2NyaXB0b3IgYnl0ZTogIHdoYXQncyBsZWdhbCBmb3IgdGhpcyBvcGVyYW5kICovCi17Ci0gIGludCBuOwkJCS8qIFJlZ2lzdGVyIG51bWJlciAqLwotICBleHByZXNzaW9uUyBlOwkJLyogUGFyc2VkIGV4cHJlc3Npb24gKi8KLQotICAvKiBTZWUgaWYgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyICovCi0gIG4gPSBnZXRfcmVnbnVtIChvcHRleHQpOwotICBpZiAobiA+PSAwKQotICAgIHsKLSAgICAgIGlmIChJU19SR19SRUcgKG4pKQotCXsKLQkgIC8qIGdsb2JhbCBvciBsb2NhbCByZWdpc3RlciAqLwotCSAgaWYgKCFSRUdfQUxJR04gKG9wZGVzYywgbikpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInVuYWxpZ25lZCByZWdpc3RlciIpKTsKLQkgICAgfQotCSAgcmVnb3BQLT5uID0gbjsKLQkgIHJlZ29wUC0+bW9kZSA9IDA7Ci0JICByZWdvcFAtPnNwZWNpYWwgPSAwOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKElTX0ZQX1JFRyAobikgJiYgRlBfT0sgKG9wZGVzYykpCi0JewotCSAgLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIsIGFuZCBpdCdzIGFsbG93ZWQgKi8KLQkgIHJlZ29wUC0+biA9IG4gLSBGUDA7Ci0JICByZWdvcFAtPm1vZGUgPSAxOwotCSAgcmVnb3BQLT5zcGVjaWFsID0gMDsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChJU19TRl9SRUcgKG4pICYmIFNGUl9PSyAob3BkZXNjKSkKLQl7Ci0JICAvKiBTcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyLCBhbmQgaXQncyBhbGxvd2VkICovCi0JICByZWdvcFAtPm4gPSBuIC0gU0YwOwotCSAgcmVnb3BQLT5tb2RlID0gMDsKLQkgIHJlZ29wUC0+c3BlY2lhbCA9IDE7Ci0JICBpZiAoIXRhcmdfaGFzX3NmciAocmVnb3BQLT5uKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygibm8gc3VjaCBzZnIgaW4gdGhpcyBhcmNoaXRlY3R1cmUiKSk7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChMSVRfT0sgKG9wZGVzYykpCi0gICAgewotICAgICAgLyogSG93IGFib3V0IGEgbGl0ZXJhbD8gICovCi0gICAgICByZWdvcFAtPm1vZGUgPSAxOwotICAgICAgcmVnb3BQLT5zcGVjaWFsID0gMDsKLSAgICAgIGlmIChGUF9PSyAob3BkZXNjKSkKLQl7CQkJLyogZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbCBhY2NlcHRhYmxlICovCi0JICAvKiBTa2lwIG92ZXIgMGYsIDBkLCBvciAwZSBwcmVmaXggKi8KLQkgIGlmICgob3B0ZXh0WzBdID09ICcwJykKLQkgICAgICAmJiAob3B0ZXh0WzFdID49ICdkJykKLQkgICAgICAmJiAob3B0ZXh0WzFdIDw9ICdmJykpCi0JICAgIHsKLQkgICAgICBvcHRleHQgKz0gMjsKLQkgICAgfQotCi0JICBpZiAoIXN0cmNtcCAob3B0ZXh0LCAiMC4wIikgfHwgIXN0cmNtcCAob3B0ZXh0LCAiMCIpKQotCSAgICB7Ci0JICAgICAgcmVnb3BQLT5uID0gMHgxMDsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGlmICghc3RyY21wIChvcHRleHQsICIxLjAiKSB8fCAhc3RyY21wIChvcHRleHQsICIxIikpCi0JICAgIHsKLQkgICAgICByZWdvcFAtPm4gPSAweDE2OwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JfQotICAgICAgZWxzZQotCXsJCQkvKiBmaXhlZCBwb2ludCBsaXRlcmFsIGFjY2VwdGFibGUgKi8KLQkgIHBhcnNlX2V4cHIgKG9wdGV4dCwgJmUpOwotCSAgaWYgKGUuWF9vcCAhPSBPX2NvbnN0YW50Ci0JICAgICAgfHwgKG9mZnMgKGUpIDwgMCkgfHwgKG9mZnMgKGUpID4gMzEpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJpbGxlZ2FsIGxpdGVyYWwiKSk7Ci0JICAgICAgb2ZmcyAoZSkgPSAwOwotCSAgICB9Ci0JICByZWdvcFAtPm4gPSBvZmZzIChlKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdGhpbmcgd29ya2VkICovCi0gIHN5bnRheCAoKTsKLSAgcmVnb3BQLT5tb2RlID0gMDsJCS8qIFJlZ2lzdGVyIHIwIGlzIGFsd2F5cyBhIGdvb2Qgb25lICovCi0gIHJlZ29wUC0+biA9IDA7Ci0gIHJlZ29wUC0+c3BlY2lhbCA9IDA7Ci19CQkJCS8qIHBhcnNlX3JlZ29wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICByZWdfZm10OglnZW5lcmF0ZSBhIFJFRy1mb3JtYXQgaW5zdHJ1Y3Rpb24KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1yZWdfZm10IChhcmdzLCBvUCkKLSAgICAgY2hhciAqYXJnc1tdOwkJLyogYXJnc1swXS0+b3Bjb2RlIG1uZW1vbmljLCBhcmdzWzEtM10tPm9wZXJhbmRzICovCi0gICAgIHN0cnVjdCBpOTYwX29wY29kZSAqb1A7CS8qIFBvaW50ZXIgdG8gZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24gKi8KLXsKLSAgbG9uZyBpbnN0cjsJCQkvKiBCaW5hcnkgdG8gYmUgb3V0cHV0ICovCi0gIHN0cnVjdCByZWdvcCByZWdvcDsJCS8qIERlc2NyaXB0aW9uIG9mIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLSAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotCi0KLSAgaW5zdHIgPSBvUC0+b3Bjb2RlOwotICBuX29wcyA9IG9QLT5udW1fb3BzOwotCi0gIGlmIChuX29wcyA+PSAxKQotICAgIHsKLSAgICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ3NbMV0sIG9QLT5vcGVyYW5kWzBdKTsKLQotICAgICAgaWYgKChuX29wcyA9PSAxKSAmJiAhKGluc3RyICYgTTMpKQotCXsKLQkgIC8qIDEtb3BlcmFuZCBpbnN0cnVjdGlvbiBpbiB3aGljaCB0aGUgZHN0IGZpZWxkIHNob3VsZAotCSAgICAgKiBiZSB1c2VkIChpbnN0ZWFkIG9mIHNyYzEpLgotCSAgICovCi0JICByZWdvcC5uIDw8PSAxOTsKLQkgIGlmIChyZWdvcC5zcGVjaWFsKQotCSAgICB7Ci0JICAgICAgcmVnb3AubW9kZSA9IHJlZ29wLnNwZWNpYWw7Ci0JICAgIH0KLQkgIHJlZ29wLm1vZGUgPDw9IDEzOwotCSAgcmVnb3Auc3BlY2lhbCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHJlZ29wLm4gZ29lcyBpbiBiaXQgMCwgbmVlZHMgbm8gc2hpZnRpbmcgKi8KLQkgIHJlZ29wLm1vZGUgPDw9IDExOwotCSAgcmVnb3Auc3BlY2lhbCA8PD0gNTsKLQl9Ci0gICAgICBpbnN0ciB8PSByZWdvcC5uIHwgcmVnb3AubW9kZSB8IHJlZ29wLnNwZWNpYWw7Ci0gICAgfQotCi0gIGlmIChuX29wcyA+PSAyKQotICAgIHsKLSAgICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ3NbMl0sIG9QLT5vcGVyYW5kWzFdKTsKLQotICAgICAgaWYgKChuX29wcyA9PSAyKSAmJiAhKGluc3RyICYgTTMpKQotCXsKLQkgIC8qIDItb3BlcmFuZCBpbnN0cnVjdGlvbiBpbiB3aGljaCB0aGUgZHN0IGZpZWxkIHNob3VsZAotCSAgICAgKiBiZSB1c2VkIGluc3RlYWQgb2Ygc3JjMikuCi0JICAgKi8KLQkgIHJlZ29wLm4gPDw9IDE5OwotCSAgaWYgKHJlZ29wLnNwZWNpYWwpCi0JICAgIHsKLQkgICAgICByZWdvcC5tb2RlID0gcmVnb3Auc3BlY2lhbDsKLQkgICAgfQotCSAgcmVnb3AubW9kZSA8PD0gMTM7Ci0JICByZWdvcC5zcGVjaWFsID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVnb3AubiA8PD0gMTQ7Ci0JICByZWdvcC5tb2RlIDw8PSAxMjsKLQkgIHJlZ29wLnNwZWNpYWwgPDw9IDY7Ci0JfQotICAgICAgaW5zdHIgfD0gcmVnb3AubiB8IHJlZ29wLm1vZGUgfCByZWdvcC5zcGVjaWFsOwotICAgIH0KLSAgaWYgKG5fb3BzID09IDMpCi0gICAgewotICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnc1szXSwgb1AtPm9wZXJhbmRbMl0pOwotICAgICAgaWYgKHJlZ29wLnNwZWNpYWwpCi0JewotCSAgcmVnb3AubW9kZSA9IHJlZ29wLnNwZWNpYWw7Ci0JfQotICAgICAgaW5zdHIgfD0gKHJlZ29wLm4gPDw9IDE5KSB8IChyZWdvcC5tb2RlIDw8PSAxMyk7Ci0gICAgfQotICBlbWl0IChpbnN0cik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICByZWxheF9jb2JyOgotICAJUmVwbGFjZSBjb2JyIGluc3RydWN0aW9uIGluIGEgY29kZSBmcmFnbWVudCB3aXRoIGVxdWl2YWxlbnQgYnJhbmNoIGFuZAotICAJY29tcGFyZSBpbnN0cnVjdGlvbnMsIHNvIGl0IGNhbiByZWFjaCBiZXlvbmQgYSAxMy1iaXQgZGlzcGxhY2VtZW50LgotICAJU2V0IHVwIGFuIGFkZHJlc3MgZml4L3JlbG9jYXRpb24gZm9yIHRoZSBuZXcgYnJhbmNoIGluc3RydWN0aW9uLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBUaGlzICJjb25kaXRpb25hbCBqdW1wIiB0YWJsZSBtYXBzIGNvYnIgaW5zdHJ1Y3Rpb25zIGludG8KLSAgIGVxdWl2YWxlbnQgY29tcGFyZSBhbmQgYnJhbmNoIG9wY29kZXMuICAqLwotc3RhdGljIGNvbnN0Ci1zdHJ1Y3QKLXsKLSAgbG9uZyBjb21wYXJlOwotICBsb25nIGJyYW5jaDsKLX0KLQotY29qW10gPQotewkJCQkvKiBDT0JSIE9QQ09ERTogKi8KLSAgeyBDSEtCSVQsIEJOTyB9LAkJLyogICAgICAweDMwIC0gYmJjICovCi0gIHsgQ01QTywgQkcgfSwJCQkvKiAgICAgIDB4MzEgLSBjbXBvYmcgKi8KLSAgeyBDTVBPLCBCRSB9LAkJCS8qICAgICAgMHgzMiAtIGNtcG9iZSAqLwotICB7IENNUE8sIEJHRSB9LAkJLyogICAgICAweDMzIC0gY21wb2JnZSAqLwotICB7IENNUE8sIEJMIH0sCQkJLyogICAgICAweDM0IC0gY21wb2JsICovCi0gIHsgQ01QTywgQk5FIH0sCQkvKiAgICAgIDB4MzUgLSBjbXBvYm5lICovCi0gIHsgQ01QTywgQkxFIH0sCQkvKiAgICAgIDB4MzYgLSBjbXBvYmxlICovCi0gIHsgQ0hLQklULCBCTyB9LAkJLyogICAgICAweDM3IC0gYmJzICovCi0gIHsgQ01QSSwgQk5PIH0sCQkvKiAgICAgIDB4MzggLSBjbXBpYm5vICovCi0gIHsgQ01QSSwgQkcgfSwJCQkvKiAgICAgIDB4MzkgLSBjbXBpYmcgKi8KLSAgeyBDTVBJLCBCRSB9LAkJCS8qICAgICAgMHgzYSAtIGNtcGliZSAqLwotICB7IENNUEksIEJHRSB9LAkJLyogICAgICAweDNiIC0gY21waWJnZSAqLwotICB7IENNUEksIEJMIH0sCQkJLyogICAgICAweDNjIC0gY21waWJsICovCi0gIHsgQ01QSSwgQk5FIH0sCQkvKiAgICAgIDB4M2QgLSBjbXBpYm5lICovCi0gIHsgQ01QSSwgQkxFIH0sCQkvKiAgICAgIDB4M2UgLSBjbXBpYmxlICovCi0gIHsgQ01QSSwgQk8gfSwJCQkvKiAgICAgIDB4M2YgLSBjbXBpYm8gKi8KLX07Ci0KLXN0YXRpYwotdm9pZAotcmVsYXhfY29iciAoZnJhZ1ApCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsJLyogZnJhZ1AtPmZyX29wY29kZSBpcyBhc3N1bWVkIHRvIHBvaW50IHRvCi0JCQkJICogdGhlIGNvYnIgaW5zdHJ1Y3Rpb24sIHdoaWNoIGNvbWVzIGF0IHRoZQotCQkJCSAqIGVuZCBvZiB0aGUgY29kZSBmcmFnbWVudC4KLQkJCQkgKi8KLXsKLSAgaW50IG9wY29kZSwgc3JjMSwgc3JjMiwgbTEsIHMyOwotICAvKiBCaXQgZmllbGRzIGZyb20gY29iciBpbnN0cnVjdGlvbiAqLwotICBsb25nIGJwX2JpdHM7CQkJLyogQnJhbmNoIHByZWRpY3Rpb24gYml0cyBmcm9tIGNvYnIgaW5zdHJ1Y3Rpb24gKi8KLSAgbG9uZyBpbnN0cjsJCQkvKiBBIHNpbmdsZSBpOTYwIGluc3RydWN0aW9uICovCi0gIC8qIC0+aW5zdHJ1Y3Rpb24gdG8gYmUgcmVwbGFjZWQgKi8KLSAgY2hhciAqaVA7Ci0gIGZpeFMgKmZpeFA7CQkJLyogUmVsb2NhdGlvbiB0aGF0IGNhbiBiZSBkb25lIGF0IGFzc2VtYmx5IHRpbWUgKi8KLQotICAvKiBQSUNLIFVQICYgUEFSU0UgQ09CUiBJTlNUUlVDVElPTiAqLwotICBpUCA9IGZyYWdQLT5mcl9vcGNvZGU7Ci0gIGluc3RyID0gbWRfY2hhcnNfdG9fbnVtYmVyIChpUCwgNCk7Ci0gIG9wY29kZSA9ICgoaW5zdHIgPj4gMjQpICYgMHhmZikgLSAweDMwOwkvKiAiLTB4MzAiIGZvciB0YWJsZSBpbmRleCAqLwotICBzcmMxID0gKGluc3RyID4+IDE5KSAmIDB4MWY7Ci0gIG0xID0gKGluc3RyID4+IDEzKSAmIDE7Ci0gIHMyID0gaW5zdHIgJiAxOwotICBzcmMyID0gKGluc3RyID4+IDE0KSAmIDB4MWY7Ci0gIGJwX2JpdHMgPSBpbnN0ciAmIEJQX01BU0s7Ci0KLSAgLyogR0VORVJBVEUgQU5EIE9VVFBVVCBDT01QQVJFIElOU1RSVUNUSU9OICovCi0gIGluc3RyID0gY29qW29wY29kZV0uY29tcGFyZQotICAgIHwgc3JjMSB8IChtMSA8PCAxMSkgfCAoczIgPDwgNikgfCAoc3JjMiA8PCAxNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoaVAsIGluc3RyLCA0KTsKLQotICAvKiBPVVRQVVQgQlJBTkNIIElOU1RSVUNUSU9OICovCi0gIG1kX251bWJlcl90b19jaGFycyAoaVAgKyA0LCBjb2pbb3Bjb2RlXS5icmFuY2ggfCBicF9iaXRzLCA0KTsKLQotICAvKiBTRVQgVVAgQUREUkVTUyBGSVhVUC9SRUxPQ0FUSU9OICovCi0gIGZpeFAgPSBmaXhfbmV3IChmcmFnUCwKLQkJICBpUCArIDQgLSBmcmFnUC0+ZnJfbGl0ZXJhbCwKLQkJICA0LAotCQkgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgZnJhZ1AtPmZyX29mZnNldCwKLQkJICAxLAotCQkgIE5PX1JFTE9DKTsKLQotICBmaXhQLT5meF9iaXRfZml4UCA9IChiaXRfZml4UyAqKSAyNDsJLyogU3RvcmUgc2l6ZSBvZiBiaXQgZmllbGQgKi8KLQotICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gIGZyYWdfd2FuZSAoZnJhZ1ApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcmVsb2NfY2FsbGo6CVJlbG9jYXRlIGEgJ2NhbGxqJyBpbnN0cnVjdGlvbgotCi0gIAlUaGlzIGlzIGEgIm5vbi0oR05VKS1zdGFuZGFyZCIgbWFjaGluZS1kZXBlbmRlbnQgaG9vay4gIFRoZSBiYXNlCi0gIAlhc3NlbWJsZXIgY2FsbHMgaXQgd2hlbiBpdCBkZWNpZGVzIGl0IGNhbiByZWxvY2F0ZSBhbiBhZGRyZXNzIGF0Ci0gIAlhc3NlbWJseSB0aW1lIGluc3RlYWQgb2YgZW1pdHRpbmcgYSByZWxvY2F0aW9uIGRpcmVjdGl2ZS4KLQotICAJQ2hlY2sgdG8gc2VlIGlmIHRoZSByZWxvY2F0aW9uIGludm9sdmVzIGEgJ2NhbGxqJyBpbnN0cnVjdGlvbiB0byBhOgotICAJICAgIHN5c3Byb2M6CVJlcGxhY2UgdGhlIGRlZmF1bHQgJ2NhbGwnIGluc3RydWN0aW9uIHdpdGggYSAnY2FsbHMnCi0gIAkgICAgbGVhZnByb2M6CVJlcGxhY2UgdGhlIGRlZmF1bHQgJ2NhbGwnIGluc3RydWN0aW9uIHdpdGggYSAnYmFsJy4KLSAgCSAgICBvdGhlciBwcm9jOglEbyBub3RoaW5nLgotCi0gIAlTZWUgYi5vdXQuaCBmb3IgZGV0YWlscyBvbiB0aGUgJ25fb3RoZXInIGZpZWxkIGluIGEgc3ltYm9sIHN0cnVjdHVyZS4KLQotICAgSU1QT1JUQU5UIToKLSAgCUFzc3VtZXMgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBmaWd1cmVkIG91dCwgaW4gdGhlIGNhc2Ugb2YgYSBsZWFmcHJvYywKLSAgCXRvIHVzZSB0aGUgJ2JhbCcgZW50cnkgcG9pbnQsIGFuZCBoYXMgc3Vic3RpdHV0ZWQgdGhhdCBzeW1ib2wgaW50byB0aGUKLSAgCXBhc3NlZCBmaXh1cCBzdHJ1Y3R1cmUuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1yZWxvY19jYWxsaiAoZml4UCkKLSAgICAgLyogUmVsb2NhdGlvbiB0aGF0IGNhbiBiZSBkb25lIGF0IGFzc2VtYmx5IHRpbWUgKi8KLSAgICAgZml4UyAqZml4UDsKLXsKLSAgLyogUG9pbnRzIHRvIHRoZSBiaW5hcnkgZm9yIHRoZSBpbnN0cnVjdGlvbiBiZWluZyByZWxvY2F0ZWQuICAqLwotICBjaGFyICp3aGVyZTsKLQotICBpZiAoIWZpeFAtPmZ4X3RjYml0KQotICAgIHsKLSAgICAgIC8qIFRoaXMgd2Fzbid0IGEgY2FsbGogaW5zdHJ1Y3Rpb24gaW4gdGhlIGZpcnN0IHBsYWNlICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHdoZXJlID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotCi0gIGlmIChUQ19TX0lTX1NZU1BST0MgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBTeW1ib2wgaXMgYSAuc3lzcHJvYzogcmVwbGFjZSAnY2FsbCcgd2l0aCAnY2FsbHMnLiAgU3lzdGVtCi0gICAgICAgICBwcm9jZWR1cmUgbnVtYmVyIGlzIChvdGhlci0xKS4gICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCBDQUxMUyB8IFRDX1NfR0VUX1NZU1BST0MgKGZpeFAtPmZ4X2FkZHN5KSwgNCk7Ci0KLSAgICAgIC8qIE5vdGhpbmcgZWxzZSBuZWVkcyB0byBiZSBkb25lIGZvciB0aGlzIGluc3RydWN0aW9uLiAgTWFrZQotICAgICAgICAgc3VyZSAnbWRfbnVtYmVyX3RvX2ZpZWxkKCknIHdpbGwgcGVyZm9ybSBhIG5vLW9wLiAgKi8KLSAgICAgIGZpeFAtPmZ4X2JpdF9maXhQID0gKGJpdF9maXhTICopIDE7Ci0KLSAgICB9Ci0gIGVsc2UgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBTaG91bGQgbm90IGhhcHBlbjogc2VlIGJsb2NrIGNvbW1lbnQgYWJvdmUgKi8KLSAgICAgIGFzX2ZhdGFsIChfKCJUcnlpbmcgdG8gJ2JhbCcgdG8gJXMiKSwgU19HRVRfTkFNRSAoZml4UC0+ZnhfYWRkc3kpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKFRDX1NfSVNfQkFMTkFNRSAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFJlcGxhY2UgJ2NhbGwnIHdpdGggJ2JhbCc7IGJvdGggaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIHNhbWUKLSAgICAgICAgIGZvcm1hdCwgc28gY2FsbGluZyBjb2RlIHNob3VsZCBjb21wbGV0ZSByZWxvY2F0aW9uIGFzIGlmCi0gICAgICAgICBub3RoaW5nIGhhcHBlbmVkIGhlcmUuICAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgQkFMLCA0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKFRDX1NfSVNfQkFEUFJPQyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTG9va3MgbGlrZSBhIHByb2MsIGJ1dCBjYW4ndCB0ZWxsIHdoYXQga2luZC5cbiIpKTsKLSAgICB9CQkJCS8qIHN3aXRjaCBvbiBwcm9jIHR5cGUgKi8KLQotICAvKiBlbHNlIFN5bWJvbCBpcyBuZWl0aGVyIGEgc3lzcHJvYyBub3IgYSBsZWFmcHJvYyAqLwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgc19sZWFmcHJvYzoJcHJvY2VzcyAubGVhZnByb2MgcHNldWRvLW9wCi0KLSAgCS5sZWFmcHJvYyB0YWtlcyB0d28gYXJndW1lbnRzLCB0aGUgc2Vjb25kIG9uZSBpcyBvcHRpb25hbDoKLSAgCQlhcmdbMV06IG5hbWUgb2YgJ2NhbGwnIGVudHJ5IHBvaW50IHRvIGxlYWYgcHJvY2VkdXJlCi0gIAkJYXJnWzJdOiBuYW1lIG9mICdiYWwnIGVudHJ5IHBvaW50IHRvIGxlYWYgcHJvY2VkdXJlCi0KLSAgCUlmIHRoZSB0d28gYXJndW1lbnRzIGFyZSBpZGVudGljYWwsIG9yIGlmIHRoZSBzZWNvbmQgb25lIGlzIG1pc3NpbmcsCi0gIAl0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGFrZW4gdG8gYmUgdGhlICdiYWwnIGVudHJ5IHBvaW50LgotCi0gIAlJZiB0aGVyZSBhcmUgMiBkaXN0aW5jdCBhcmd1bWVudHMsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlICdiYWwnCi0gIAllbnRyeSBwb2ludCBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgaW4gdGhlIGxpbmtlZAotICAJbGlzdCBvZiBzeW1ib2xzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLXNfbGVhZnByb2MgKG5fb3BzLCBhcmdzKQotICAgICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gICAgIGNoYXIgKmFyZ3NbXTsJCS8qIGFyZ3NbMV0tPjFzdCBvcGVyYW5kLCBhcmdzWzJdLT4ybmQgb3BlcmFuZCAqLwotewotICBzeW1ib2xTICpjYWxsUDsJCS8qIFBvaW50ZXIgdG8gbGVhZnByb2MgJ2NhbGwnIGVudHJ5IHBvaW50IHN5bWJvbCAqLwotICBzeW1ib2xTICpiYWxQOwkJLyogUG9pbnRlciB0byBsZWFmcHJvYyAnYmFsJyBlbnRyeSBwb2ludCBzeW1ib2wgKi8KLQotICBpZiAoKG5fb3BzICE9IDEpICYmIChuX29wcyAhPSAyKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInNob3VsZCBoYXZlIDEgb3IgMiBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIENoZWNrIG51bWJlciBvZiBhcmd1bWVudHMgKi8KLQotICAvKiBGaW5kIG9yIGNyZWF0ZSBzeW1ib2wgZm9yICdjYWxsJyBlbnRyeSBwb2ludC4gKi8KLSAgY2FsbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChhcmdzWzFdKTsKLQotICBpZiAoVENfU19JU19DQUxMTkFNRSAoY2FsbFApKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlJlZGVmaW5pbmcgbGVhZnByb2MgJXMiKSwgU19HRVRfTkFNRSAoY2FsbFApKTsKLSAgICB9CQkJCS8qIGlzIGxlYWZwcm9jICovCi0KLSAgLyogSWYgdGhhdCB3YXMgdGhlIG9ubHkgYXJndW1lbnQsIHVzZSBpdCBhcyB0aGUgJ2JhbCcgZW50cnkgcG9pbnQuCi0gICAgICogT3RoZXJ3aXNlLCBtYXJrIGl0IGFzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgYW5kIGZpbmQgb3IgY3JlYXRlCi0gICAgICogYW5vdGhlciBzeW1ib2wgZm9yIHRoZSAnYmFsJyBlbnRyeSBwb2ludC4KLSAgICovCi0gIGlmICgobl9vcHMgPT0gMSkgfHwgIXN0cmNtcCAoYXJnc1sxXSwgYXJnc1syXSkpCi0gICAgewotICAgICAgVENfU19GT1JDRV9UT19CQUxOQU1FIChjYWxsUCk7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBUQ19TX0ZPUkNFX1RPX0NBTExOQU1FIChjYWxsUCk7Ci0KLSAgICAgIGJhbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChhcmdzWzJdKTsKLSAgICAgIGlmIChUQ19TX0lTX0NBTExOQU1FIChiYWxQKSkKLQl7Ci0JICBhc193YXJuIChfKCJSZWRlZmluaW5nIGxlYWZwcm9jICVzIiksIFNfR0VUX05BTUUgKGJhbFApKTsKLQl9Ci0gICAgICBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUgKGJhbFApOwotCi0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIHRjX3NldF9iYWxfb2ZfY2FsbCAoY2FsbFAsIGJhbFApOwotI2VuZGlmCi0gICAgfQkJCQkvKiBpZiBvbmx5IG9uZSBhcmcsIG9yIHRoZSBhcmdzIGFyZSB0aGUgc2FtZSAqLwotfQotCi0KLS8qCi0gICBzX3N5c3Byb2M6IHByb2Nlc3MgLnN5c3Byb2MgcHNldWRvLW9wCi0KLSAgICAgICAgLnN5c3Byb2MgdGFrZXMgdHdvIGFyZ3VtZW50czoKLSAgICAgICAgICAgICAgICBhcmdbMV06IG5hbWUgb2YgZW50cnkgcG9pbnQgdG8gc3lzdGVtIHByb2NlZHVyZQotICAgICAgICAgICAgICAgIGFyZ1syXTogJ2VudHJ5X251bScgKGluZGV4KSBvZiBzeXN0ZW0gcHJvY2VkdXJlIGluIHRoZSByYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgWzAsMzFdIGluY2x1c2l2ZS4KLQotICAgICAgICBGb3IgW2FiXS5vdXQsIHdlIHN0b3JlIHRoZSAnZW50cnludW0nIGluIHRoZSAnbl9vdGhlcicgZmllbGQgb2YKLSAgICAgICAgdGhlIHN5bWJvbC4gIFNpbmNlIHRoYXQgZW50cnkgaXMgbm9ybWFsbHkgMCwgd2UgYmlhcyAnZW50cnludW0nCi0gICAgICAgIGJ5IGFkZGluZyAxIHRvIGl0LiAgSXQgbXVzdCBiZSB1bmJpYXNlZCBiZWZvcmUgaXQgaXMgdXNlZC4gICovCi1zdGF0aWMgdm9pZAotc19zeXNwcm9jIChuX29wcywgYXJncykKLSAgICAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotICAgICBjaGFyICphcmdzW107CQkvKiBhcmdzWzFdLT4xc3Qgb3BlcmFuZCwgYXJnc1syXS0+Mm5kIG9wZXJhbmQgKi8KLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBzeW1ib2xTICpzeW1QOwotCi0gIGlmIChuX29wcyAhPSAyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic2hvdWxkIGhhdmUgdHdvIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogYmFkIGFyZyBjb3VudCAqLwotCi0gIC8qIFBhcnNlICJlbnRyeV9udW0iIGFyZ3VtZW50IGFuZCBjaGVjayBpdCBmb3IgdmFsaWRpdHkuICovCi0gIHBhcnNlX2V4cHIgKGFyZ3NbMl0sICZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgKG9mZnMgKGV4cCkgPCAwKQotICAgICAgfHwgKG9mZnMgKGV4cCkgPiAzMSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCInZW50cnlfbnVtJyBtdXN0IGJlIGFic29sdXRlIG51bWJlciBpbiBbMCwzMV0iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEZpbmQvbWFrZSBzeW1ib2wgYW5kIHN0aWNrIGVudHJ5IG51bWJlciAoYmlhc2VkIGJ5ICsxKSBpbnRvIGl0ICovCi0gIHN5bVAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChhcmdzWzFdKTsKLQotICBpZiAoVENfU19JU19TWVNQUk9DIChzeW1QKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJSZWRlZmluaW5nIGVudHJ5bnVtIGZvciBzeXNwcm9jICVzIiksIFNfR0VUX05BTUUgKHN5bVApKTsKLSAgICB9CQkJCS8qIHJlZGVmaW5pbmcgKi8KLQotICBUQ19TX1NFVF9TWVNQUk9DIChzeW1QLCBvZmZzIChleHApKTsJLyogZW5jb2RlIGVudHJ5IG51bWJlciAqLwotICBUQ19TX0ZPUkNFX1RPX1NZU1BST0MgKHN5bVApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgc2hpZnRfb2s6Ci0gIAlEZXRlcm1pbmUgaWYgYSAic2hsbyIgaW5zdHJ1Y3Rpb24gY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGEgImxkY29uc3QiLgotICAJVGhpcyBtZWFucyB0aGF0IHNvbWUgbnVtYmVyIFggPCAzMiBjYW4gYmUgc2hpZnRlZCBsZWZ0IHRvIHByb2R1Y2UgdGhlCi0gIAljb25zdGFudCBvZiBpbnRlcmVzdC4KLQotICAJUmV0dXJuIHRoZSBzaGlmdCBjb3VudCwgb3IgMCBpZiB3ZSBjYW4ndCBkbyBpdC4KLSAgCUNhbGxlciBjYWxjdWxhdGVzIFggYnkgc2hpZnRpbmcgb3JpZ2luYWwgY29uc3RhbnQgcmlnaHQgJ3NoaWZ0JyBwbGFjZXMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLWludAotc2hpZnRfb2sgKG4pCi0gICAgIGludCBuOwkJCS8qIFRoZSBjb25zdGFudCBvZiBpbnRlcmVzdCAqLwotewotICBpbnQgc2hpZnQ7CQkJLyogVGhlIHNoaWZ0IGNvdW50ICovCi0KLSAgaWYgKG4gPD0gMCkKLSAgICB7Ci0gICAgICAvKiBDYW4ndCBkbyBpdCBmb3IgbmVnYXRpdmUgbnVtYmVycyAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFNoaWZ0ICduJyByaWdodCB1bnRpbCBhIDEgaXMgYWJvdXQgdG8gYmUgbG9zdCAqLwotICBmb3IgKHNoaWZ0ID0gMDsgKG4gJiAxKSA9PSAwOyBzaGlmdCsrKQotICAgIHsKLSAgICAgIG4gPj49IDE7Ci0gICAgfQotCi0gIGlmIChuID49IDMyKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIHNoaWZ0OwotfQotCi0KLS8qIHN5bnRheDogaXNzdWUgc3ludGF4IGVycm9yICovCi0KLXN0YXRpYyB2b2lkCi1zeW50YXggKCkKLXsKLSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IiKSk7Ci19CQkJCS8qIHN5bnRheCgpICovCi0KLQotLyogdGFyZ19oYXNfc2ZyOgotCi0gICBSZXR1cm4gVFJVRSBpZmYgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlciAoc2ZyKS4gICovCi0KLXN0YXRpYwotaW50Ci10YXJnX2hhc19zZnIgKG4pCi0gICAgIGludCBuOwkJCS8qIE51bWJlciAoMC0zMSkgb2Ygc2ZyICovCi17Ci0gIHN3aXRjaCAoYXJjaGl0ZWN0dXJlKQotICAgIHsKLSAgICBjYXNlIEFSQ0hfS0E6Ci0gICAgY2FzZSBBUkNIX0tCOgotICAgIGNhc2UgQVJDSF9NQzoKLSAgICBjYXNlIEFSQ0hfSlg6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEFSQ0hfSFg6Ci0gICAgICByZXR1cm4gKCgwIDw9IG4pICYmIChuIDw9IDQpKTsKLSAgICBjYXNlIEFSQ0hfQ0E6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoKDAgPD0gbikgJiYgKG4gPD0gMikpOwotICAgIH0KLX0KLQotCi0vKiB0YXJnX2hhc19pY2xhc3M6Ci0KLSAgIFJldHVybiBUUlVFIGlmZiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyB0aGUgaW5kaWNhdGVkCi0gICBjbGFzcyBvZiBpbnN0cnVjdGlvbnMuICAqLwotc3RhdGljCi1pbnQKLXRhcmdfaGFzX2ljbGFzcyAoaWMpCi0gICAgIC8qIEluc3RydWN0aW9uIGNsYXNzOyAgb25lIG9mOgotICAgICAgICBJX0JBU0UsIElfQ1gsIElfREVDLCBJX0tYLCBJX0ZQLCBJX01JTCwgSV9DQVNJTSwgSV9DWDIsIElfSFgsIElfSFgyCi0gICAgICAqLwotICAgICBpbnQgaWM7Ci17Ci0gIGljbGFzc2VzX3NlZW4gfD0gaWM7Ci0gIHN3aXRjaCAoYXJjaGl0ZWN0dXJlKQotICAgIHsKLSAgICBjYXNlIEFSQ0hfS0E6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9LWCk7Ci0gICAgY2FzZSBBUkNIX0tCOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfS1ggfCBJX0ZQIHwgSV9ERUMpOwotICAgIGNhc2UgQVJDSF9NQzoKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0tYIHwgSV9GUCB8IElfREVDIHwgSV9NSUwpOwotICAgIGNhc2UgQVJDSF9DQToKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0NYIHwgSV9DWDIgfCBJX0NBU0lNKTsKLSAgICBjYXNlIEFSQ0hfSlg6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9DWDIgfCBJX0pYKTsKLSAgICBjYXNlIEFSQ0hfSFg6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9DWDIgfCBJX0pYIHwgSV9IWCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICgoaWNsYXNzZXNfc2VlbiAmIChJX0tYIHwgSV9GUCB8IElfREVDIHwgSV9NSUwpKQotCSAgJiYgKGljbGFzc2VzX3NlZW4gJiAoSV9DWCB8IElfQ1gyKSkpCi0JewotCSAgYXNfd2FybiAoXygiYXJjaGl0ZWN0dXJlIG9mIG9wY29kZSBjb25mbGljdHMgd2l0aCB0aGF0IG9mIGVhcmxpZXIgaW5zdHJ1Y3Rpb24ocykiKSk7Ci0JICBpY2xhc3Nlc19zZWVuICY9IH5pYzsKLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIC5lbmRpYW4gcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZW5kaWFuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGlmIChzdHJjYXNlY21wIChuYW1lLCAibGl0dGxlIikgPT0gMCkKLSAgICA7Ci0gIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJiaWciKSA9PSAwKQotICAgIGFzX2JhZCAoXygiYmlnIGVuZGlhbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gIGVsc2UKLSAgICBhc193YXJuIChfKCJpZ25vcmluZyB1bnJlY29nbml6ZWQgLmVuZGlhbiB0eXBlIGAlcyciKSwgbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgaTk2MCwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24sCi0gICB3aGljaCB3ZSBoYXZlIHNldCB1cCBhcyB0aGUgYWRkcmVzcyBvZiB0aGUgZml4dXAgdG9vLiAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHA7Ci0jZWxzZQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotI2VuZGlmCi17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBsb25nIHZhbCA9ICp2YWxwOwotI2VuZGlmCi0gIGNoYXIgKnBsYWNlID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIGlmICghZml4UC0+ZnhfYml0X2ZpeFApCi0gICAgewotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICAvKiBGb3IgY2FsbHgsIHdlIGFsd2F5cyB3YW50IHRvIHdyaXRlIG91dCB6ZXJvLCBhbmQgZW1pdCBhCi0JIHN5bWJvbGljIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2JzcikKLQl2YWwgPSAwOwotCi0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7Ci0jZW5kaWYKLQotICAgICAgbWRfbnVtYmVyX3RvX2ltbSAocGxhY2UsIHZhbCwgZml4UC0+Znhfc2l6ZSwgZml4UCk7Ci0gICAgfQotICBlbHNlCi0gICAgbWRfbnVtYmVyX3RvX2ZpZWxkIChwbGFjZSwgdmFsLCBmaXhQLT5meF9iaXRfZml4UCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLSNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCi12b2lkCi10Y19ib3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07Ci0gIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gcmk7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAmcmksICdcMCcsIHNpemVvZiAocmkpKTsKLSAgc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5OwotICBrbm93IChzeW1ib2xQICE9IDAgfHwgZml4UC0+Znhfcl90eXBlICE9IE5PX1JFTE9DKTsKLSAgcmkucl9ic3IgPSBmaXhQLT5meF9ic3I7CS8qU0FDIExEIFJFTEFYIEhBQ0sgKi8KLSAgLyogVGhlc2UgdHdvICdjdXogb2YgTlMzMksgKi8KLSAgcmkucl9jYWxsaiA9IGZpeFAtPmZ4X3RjYml0OwotICBpZiAoZml4UC0+ZnhfYml0X2ZpeFApCi0gICAgcmkucl9sZW5ndGggPSAyOwotICBlbHNlCi0gICAgcmkucl9sZW5ndGggPSBuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV07Ci0gIHJpLnJfcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKLSAgcmkucl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci0KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSAhPSBOT19SRUxPQykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLQl7Ci0JY2FzZSByc19hbGlnbjoKLQkgIHJpLnJfaW5kZXggPSAtMjsKLQkgIHJpLnJfcGNyZWwgPSAxOwotCSAgcmkucl9sZW5ndGggPSBmaXhQLT5meF9zaXplIC0gMTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfb3JnOgotCSAgcmkucl9pbmRleCA9IC0yOwotCSAgcmkucl9wY3JlbCA9IDA7Ci0JICBicmVhazsKLQljYXNlIHJzX2ZpbGw6Ci0JICByaS5yX2luZGV4ID0gLTE7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgcmkucl9leHRlcm4gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAobGlua3JlbGF4IHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IGZpeFAtPmZ4X2JzcikKLSAgICB7Ci0gICAgICByaS5yX2V4dGVybiA9IDE7Ci0gICAgICByaS5yX2luZGV4ID0gc3ltYm9sUC0+c3lfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJpLnJfZXh0ZXJuID0gMDsKLSAgICAgIHJpLnJfaW5kZXggPSBTX0dFVF9UWVBFIChzeW1ib2xQKTsKLSAgICB9Ci0KLSAgLyogT3V0cHV0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGluIG1hY2hpbmUtZGVwZW5kZW50IGZvcm0uICovCi0gIG1kX3JpX3RvX2NoYXJzICh3aGVyZSwgJnJpKTsKLX0KLQotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSNpZiBkZWZpbmVkIChPQkpfQ09GRikgJiYgZGVmaW5lZCAoQkZEKQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYnNyKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChmaXhQLT5meF9wY3JlbCA9PSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gUl9SRUxMT05HOwotCi0gIGlmIChmaXhQLT5meF9wY3JlbCAhPSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gUl9JUFJNRUQ7Ci0KLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLXRjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBpZiAoZnJhZy0+ZnJfbmV4dCkKLSAgICByZXR1cm4gZnJhZy0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2FkZHJlc3M7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiBBbGlnbiBhbiBhZGRyZXNzIGJ5IHJvdW5kaW5nIGl0IHVwIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIHNlZ1Qgc2VnOwotICAgICB2YWx1ZVQgYWRkcjsJCS8qIEFkZHJlc3MgdG8gYmUgcm91bmRlZCB1cCAqLwotewotICBpbnQgYWxpZ247Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLSNlbHNlCi0gIGFsaWduID0gc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXTsKLSNlbmRpZgotICByZXR1cm4gKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbik7Ci19Ci0KLWV4dGVybiBpbnQgY29mZl9mbGFnczsKLQotI2lmZGVmIE9CSl9DT0ZGCi12b2lkCi10Y19oZWFkZXJzX2hvb2sgKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBzd2l0Y2ggKGFyY2hpdGVjdHVyZSkKLSAgICB7Ci0gICAgY2FzZSBBUkNIX0tBOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBLQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0tCOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBLQjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX01DOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBNQzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0NBOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBDQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0pYOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBKWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0hYOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBIWDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChpY2xhc3Nlc19zZWVuID09IElfQkFTRSkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MENPUkU7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9DWCkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MENBOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfSFgpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBIWDsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX0pYKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwSlg7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9DWDIpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBDQTsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX01JTCkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2ME1DOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIChJX0RFQyB8IElfRlApKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwS0I7Ci0gICAgICBlbHNlCi0JY29mZl9mbGFncyB8PSBGX0k5NjBLQTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgaGVhZGVycy0+ZmlsZWhkci5mX21hZ2ljID0gSTk2MFJXTUFHSUM7Ci0gICAgICBoZWFkZXJzLT5hb3V0aGRyLm1hZ2ljID0gT01BR0lDOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhlYWRlcnMtPmZpbGVoZHIuZl9tYWdpYyA9IEk5NjBST01BR0lDOwotICAgICAgaGVhZGVycy0+YW91dGhkci5tYWdpYyA9IE5NQUdJQzsKLSAgICB9CQkJCS8qIHNldCBtYWdpYyBudW1iZXJzICovCi19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogVGhpbmdzIGdvaW5nIG9uIGhlcmU6Ci0KLSAgIEZvciBib3V0LCBXZSBuZWVkIHRvIGFzc3VyZSBhIGNvdXBsZSBvZiBzaW1wbGlmeWluZwotICAgYXNzdW1wdGlvbnMgYWJvdXQgbGVhZnByb2NzIGZvciB0aGUgbGlua2VyOiB0aGUgbGVhZnByb2MKLSAgIGVudHJ5IHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkIGluIHRoZSBzYW1lIGFzc2VtYmx5IGluCi0gICB3aGljaCB0aGV5J3JlIGRlY2xhcmVkIHdpdGggdGhlICcubGVhZnByb2MnIGRpcmVjdGl2ZTsKLSAgIGFuZCBpZiBhIGxlYWZwcm9jIGhhcyBib3RoICdjYWxsJyBhbmQgJ2JhbCcgZW50cnkgcG9pbnRzCi0gICB0aGV5IGFyZSBib3RoIGdsb2JhbCBvciBib3RoIGxvY2FsLgotCi0gICBGb3IgY29mZiwgdGhlIGNhbGwgc3ltYm9sIGhhcyBhIHNlY29uZCBhdXggZW50cnkgdGhhdAotICAgY29udGFpbnMgdGhlIGJhbCBlbnRyeSBwb2ludC4gIFRoZSBiYWwgc3ltYm9sIGJlY29tZXMgYQotICAgbGFiZWwuCi0KLSAgIEZvciBjb2ZmIHJlcHJlc2VudGF0aW9uLCB0aGUgY2FsbCBzeW1ib2wgaGFzIGEgc2Vjb25kIGF1eCBlbnRyeSB0aGF0Ci0gICBjb250YWlucyB0aGUgYmFsIGVudHJ5IHBvaW50LiAgVGhlIGJhbCBzeW1ib2wgYmVjb21lcyBhIGxhYmVsLiAgKi8KLQotdm9pZAotdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotI2lmZGVmIE9CSl9DT0ZGCi0gICAgICBpZiAoVENfU19JU19TWVNQUk9DIChzeW1ib2xQKSkKLQl7Ci0JICAvKiBzZWNvbmQgYXV4IGVudHJ5IGFscmVhZHkgY29udGFpbnMgdGhlIHN5c3Byb2MgbnVtYmVyICovCi0JICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAyKTsKLQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU0NBTEwpOwotCSAgU19TRVRfREFUQV9UWVBFIChzeW1ib2xQLCBTX0dFVF9EQVRBX1RZUEUgKHN5bWJvbFApIHwgKERUX0ZDTiA8PCBOX0JUU0hGVCkpOwotCSAgY29udGludWU7Ci0JfQkJCS8qIHJld3JpdGUgc3lzcHJvYyAqLwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSAgICAgIGlmICghVENfU19JU19CQUxOQU1FIChzeW1ib2xQKSAmJiAhVENfU19JU19DQUxMTkFNRSAoc3ltYm9sUCkpCi0JewotCSAgY29udGludWU7Ci0JfQkJCS8qIE5vdCBhIGxlYWZwcm9jIHN5bWJvbCAqLwotCi0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JewotCSAgYXNfYmFkIChfKCJsZWFmcHJvYyBzeW1ib2wgJyVzJyB1bmRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCX0JCQkvKiB1bmRlZmluZWQgbGVhZiAqLwotCi0gICAgICBpZiAoVENfU19JU19DQUxMTkFNRSAoc3ltYm9sUCkpCi0JewotCSAgc3ltYm9sUyAqYmFsUCA9IHRjX2dldF9iYWxfb2ZfY2FsbCAoc3ltYm9sUCk7Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgIT0gU19JU19FWFRFUk5BTCAoYmFsUCkpCi0JICAgIHsKLQkgICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICAgICAgU19TRVRfRVhURVJOQUwgKGJhbFApOwotCSAgICAgIGFzX3dhcm4gKF8oIldhcm5pbmc6IG1ha2luZyBsZWFmcHJvYyBlbnRyaWVzICVzIGFuZCAlcyBib3RoIGdsb2JhbFxuIiksCi0JCSAgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgU19HRVRfTkFNRSAoYmFsUCkpOwotCSAgICB9CQkJLyogZXh0ZXJuYWxpdHkgbWlzbWF0Y2ggKi8KLQl9CQkJLyogaWYgY2FsbG5hbWUgKi8KLSAgICB9CQkJCS8qIHdhbGsgdGhlIHN5bWJvbCBjaGFpbiAqLwotfQotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIEZvciBhb3V0IG9yIGJvdXQsIHRoZSBiYWwgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgY2FsbC4KLQotICAgRm9yIGNvZmYsIHdlIGNoZWF0IGFuZCBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGJhbCBzeW1ib2wgaW4gdGhlCi0gICBzZWNvbmQgYXV4IGVudHJ5IG9mIHRoZSBjYWxsLiAgKi8KLQotI3VuZGVmIE9CSl9BQk9VVAotI2lmZGVmIE9CSl9BT1VUCi0jZGVmaW5lIE9CSl9BQk9VVAotI2VuZGlmCi0jaWZkZWYgT0JKX0JPVVQKLSNkZWZpbmUgT0JKX0FCT1VUCi0jZW5kaWYKLQotdm9pZAotdGNfc2V0X2JhbF9vZl9jYWxsIChjYWxsUCwgYmFsUCkKLSAgICAgc3ltYm9sUyAqY2FsbFA7Ci0gICAgIHN5bWJvbFMgKmJhbFA7Ci17Ci0gIGtub3cgKFRDX1NfSVNfQ0FMTE5BTUUgKGNhbGxQKSk7Ci0gIGtub3cgKFRDX1NfSVNfQkFMTkFNRSAoYmFsUCkpOwotCi0jaWZkZWYgT0JKX0NPRkYKLQotICBjYWxsUC0+c3lfdGMgPSBiYWxQOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChjYWxsUCwgMik7Ci0KLSNlbHNlIC8qICEgT0JKX0NPRkYgKi8KLSNpZmRlZiBPQkpfQUJPVVQKLQotICAvKiBJZiB0aGUgJ2JhbCcgZW50cnkgZG9lc24ndCBpbW1lZGlhdGVseSBmb2xsb3cgdGhlICdjYWxsJwotICAgICAqIHN5bWJvbCwgdW5saW5rIGl0IGZyb20gdGhlIHN5bWJvbCBsaXN0IGFuZCByZS1pbnNlcnQgaXQuCi0gICAqLwotICBpZiAoc3ltYm9sX25leHQgKGNhbGxQKSAhPSBiYWxQKQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKGJhbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoYmFsUCwgY2FsbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0JCQkJLyogaWYgbm90IGluIG9yZGVyICovCi0KLSNlbHNlIC8qICEgT0JKX0FCT1VUICovCi0gIGFzX2ZhdGFsICgiT25seSBzdXBwb3J0ZWQgZm9yIGEub3V0LCBiLm91dCwgb3IgQ09GRiIpOwotI2VuZGlmIC8qICEgT0JKX0FCT1VUICovCi0jZW5kaWYgLyogISBPQkpfQ09GRiAqLwotfQotCi1zeW1ib2xTICoKLXRjX2dldF9iYWxfb2ZfY2FsbCAoY2FsbFApCi0gICAgIHN5bWJvbFMgKmNhbGxQOwotewotICBzeW1ib2xTICpyZXR2YWw7Ci0KLSAga25vdyAoVENfU19JU19DQUxMTkFNRSAoY2FsbFApKTsKLQotI2lmZGVmIE9CSl9DT0ZGCi0gIHJldHZhbCA9IGNhbGxQLT5zeV90YzsKLSNlbHNlCi0jaWZkZWYgT0JKX0FCT1VUCi0gIHJldHZhbCA9IHN5bWJvbF9uZXh0IChjYWxsUCk7Ci0jZWxzZQotICBhc19mYXRhbCAoIk9ubHkgc3VwcG9ydGVkIGZvciBhLm91dCwgYi5vdXQsIG9yIENPRkYiKTsKLSNlbmRpZiAvKiAhIE9CSl9BQk9VVCAqLwotI2VuZGlmIC8qICEgT0JKX0NPRkYgKi8KLQotICBrbm93IChUQ19TX0lTX0JBTE5BTUUgKHJldHZhbCkpOwotICByZXR1cm4gcmV0dmFsOwotfQkJCQkvKiBfdGNfZ2V0X2JhbF9vZl9jYWxsKCkgKi8KLQotdm9pZAotdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBpZiAoVENfU19JU19DQUxMTkFNRSAoc3ltYm9sUCkpCi0gICAgewotI2lmZGVmIE9CSl9DT0ZGCi0gICAgICBzeW1ib2xTICpiYWxQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChzeW1ib2xQKTsKLQotI2lmIDAKLSAgICAgIC8qIHNlY29uZCBhdXggZW50cnkgY29udGFpbnMgdGhlIGJhbCBlbnRyeSBwb2ludCAqLwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMik7Ci0jZW5kaWYKLSAgICAgIHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzFdLnhfYmFsLnhfYmFsbnRyeSA9IFNfR0VUX1ZBTFVFIChiYWxQKTsKLSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVCkKLQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0xFQUZFWFQpOwotICAgICAgZWxzZQotCVNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTEVBRlNUQVQpOwotICAgICAgU19TRVRfREFUQV9UWVBFIChzeW1ib2xQLCBTX0dFVF9EQVRBX1RZUEUgKHN5bWJvbFApIHwgKERUX0ZDTiA8PCBOX0JUU0hGVCkpOwotICAgICAgLyogZml4IHVwIHRoZSBiYWwgc3ltYm9sICovCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChiYWxQLCBDX0xBQkVMKTsKLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotICAgIH0JCQkJLyogb25seSBvbiBjYWxscyAqLwotfQotCi12b2lkCi1pOTYwX2hhbmRsZV9hbGlnbiAoZnJhZ3ApCi0gICAgIGZyYWdTICpmcmFncDsKLXsKLSAgaWYgKCFsaW5rcmVsYXgpCi0gICAgcmV0dXJuOwotCi0jaWZuZGVmIE9CSl9CT1VUCi0KLSAgYXNfYmFkIChfKCJvcHRpb24gLS1saW5rLXJlbGF4IGlzIG9ubHkgc3VwcG9ydGVkIGluIGIub3V0IGZvcm1hdCIpKTsKLSAgbGlua3JlbGF4ID0gMDsKLSAgcmV0dXJuOwotCi0jZWxzZQotCi0gIC8qIFRoZSB0ZXh0IHNlY3Rpb24gImVuZHMiIHdpdGggYW5vdGhlciBhbGlnbm1lbnQgcmVsb2MsIHRvIHdoaWNoIHdlCi0gICAgIGFyZW4ndCBhZGRpbmcgcGFkZGluZy4gICovCi0gIGlmIChmcmFncC0+ZnJfbmV4dCA9PSB0ZXh0X2xhc3RfZnJhZwotICAgICAgfHwgZnJhZ3AtPmZyX25leHQgPT0gZGF0YV9sYXN0X2ZyYWcpCi0gICAgcmV0dXJuOwotCi0gIC8qIGFsaWdubWVudCBkaXJlY3RpdmUgKi8KLSAgZml4X25ldyAoZnJhZ3AsIGZyYWdwLT5mcl9maXgsIGZyYWdwLT5mcl9vZmZzZXQsIDAsIDAsIDAsCi0JICAgKGludCkgZnJhZ3AtPmZyX3R5cGUpOwotI2VuZGlmIC8qIE9CSl9CT1VUICovCi19Ci0KLWludAotaTk2MF92YWxpZGF0ZV9maXggKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlLCBhZGRfc3ltYm9sUFApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHNlZ1QgdGhpc19zZWdtZW50X3R5cGU7Ci0gICAgIHN5bWJvbFMgKiphZGRfc3ltYm9sUFA7Ci17Ci0jZGVmaW5lIGFkZF9zeW1ib2xQICgqYWRkX3N5bWJvbFBQKQotICBpZiAoZml4UC0+ZnhfdGNiaXQgJiYgVENfU19JU19DQUxMTkFNRSAoYWRkX3N5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIFJlbG9jYXRpb24gc2hvdWxkIGJlIGRvbmUgdmlhIHRoZSBhc3NvY2lhdGVkICdiYWwnCi0gICAgICAgICBlbnRyeSBwb2ludCBzeW1ib2wuICovCi0KLSAgICAgIGlmICghVENfU19JU19CQUxOQU1FICh0Y19nZXRfYmFsX29mX2NhbGwgKGFkZF9zeW1ib2xQKSkpCi0JewotCSAgYXNfYmFkIChfKCJObyAnYmFsJyBlbnRyeSBwb2ludCBmb3IgbGVhZnByb2MgJXMiKSwKLQkJICBTX0dFVF9OQU1FIChhZGRfc3ltYm9sUCkpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sUCA9IHRjX2dldF9iYWxfb2ZfY2FsbCAoYWRkX3N5bWJvbFApOwotICAgIH0KLSNpZiAwCi0gIC8qIFN0aWxsIGhhdmUgdG8gd29yayBvdXQgb3RoZXIgY29uZGl0aW9ucyBmb3IgdGhlc2UgdGVzdHMuICAqLwotICB7Ci0gICAgaWYgKGZpeFAtPmZ4X3RjYml0KQotICAgICAgewotCWFzX2JhZCAoXygiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyIpKTsKLQlyZXR1cm4gMTsKLSAgICAgIH0KLSAgICByZWxvY19jYWxsaiAoZml4UCk7Ci0gICAgaWYgKChpbnQpIGZpeFAtPmZ4X2JpdF9maXhQID09IDEzKQotICAgICAgewotCS8qIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYSAxMy1iaXQKLQkgICBkaXNwbGFjZW1lbnQgYW5kIGFyZSBvbmx5IHRvIGJlIHVzZWQgZm9yIGxvY2FsIGJyYW5jaGVzOgotCSAgIGZsYWcgYXMgZXJyb3IsIGRvbid0IGdlbmVyYXRlIHJlbG9jYXRpb24uICAqLwotCWFzX2JhZCAoXygiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiKSk7Ci0JZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwkvKiBObyByZWxvY2F0aW9ucyBwbGVhc2UuICovCi0JcmV0dXJuIDE7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotI3VuZGVmIGFkZF9zeW1ib2xQCi0gIHJldHVybiAwOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBGcm9tIGNnZW4uYzogICovCi0KLXN0YXRpYyBzaG9ydAotdGNfYmZkX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSNpZiAwCi0gIGlmIChmaXhQLT5meF9ic3IpCi0gICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQotICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9zaXplID09IDQpCi0gICAgcmV0dXJuIEJGRF9SRUxPQ18zMjsKLQotICBpZiAoZml4UC0+ZnhfcGNyZWwgIT0gMCAmJiBmaXhQLT5meF9zaXplID09IDQpCi0gICAgcmV0dXJuIEJGRF9SRUxPQ18yNF9QQ1JFTDsKLQotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LgotCi0gICBGSVhNRTogVG8gd2hhdCBleHRlbnQgY2FuIHdlIGdldCBhbGwgcmVsZXZhbnQgdGFyZ2V0cyB0byB1c2UgdGhpcz8gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYXJlbGVudCAqIHJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgLyogSEFDSzogSXMgdGhpcyByaWdodD8gKi8KLSAgZml4UC0+Znhfcl90eXBlID0gdGNfYmZkX2ZpeDJydHlwZSAoZml4UCk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGV4cG9ydCByZWxvYyB0eXBlICVkIChgJXMnKSIsCi0JCSAgICBmaXhQLT5meF9yX3R5cGUsCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYXNzZXJ0ICghZml4UC0+ZnhfcGNyZWwgPT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi0vKiBlbmQgZnJvbSBjZ2VuLmMgKi8KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogZW5kIG9mIHRjLWk5NjAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pOTYwLmggYi9nYXMvY29uZmlnL3RjLWk5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0NmVkZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKiB0Yy1pOTYwLmggLSBCYXNpYyA4MDk2MCBpbnN0cnVjdGlvbiBmb3JtYXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZuZGVmIFRDX0k5NjAKLSNkZWZpbmUgVENfSTk2MCAxCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWk5NjAiCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2k5NjAKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qCi0gKiBUaGUgJ0NPSicgaW5zdHJ1Y3Rpb25zIGFyZSBhY3R1YWxseSBDT0JSIGluc3RydWN0aW9ucyB3aXRoIHRoZSAnYicgaW4KLSAqIHRoZSBtbmVtb25pYyByZXBsYWNlZCBieSBhICdqJzsgIHRoZXkgYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpZiBuZWNlc3Nhcnk6Ci0gKiBpZiB0aGUgZGlzcGxhY2VtZW50IHdpbGwgbm90IGZpdCBpbiAxMyBiaXRzLCB0aGUgYXNzZW1ibGVyIHdpbGwgcmVwbGFjZSB0aGVtCi0gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0gKgotICogQWxsIG9mIHRoZSAnTUVNbicgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgc2FtZSBmb3JtYXQ7IHRoZSAnbicgaW4gdGhlIG5hbWUKLSAqIGluZGljYXRlcyB0aGUgZGVmYXVsdCBpbmRleCBzY2FsZSBmYWN0b3IgKHRoZSBzaXplIG9mIHRoZSBkYXR1bSBvcGVyYXRlZCBvbikuCi0gKgotICogVGhlIEZCUkEgZm9ybWF0cyBhcmUgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIFRoZXkgYXJlIHRoZQotICogImNvbnZlbmllbmNlIGRpcmVjdGl2ZXMiIGZvciBicmFuY2hpbmcgb24gZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMsCi0gKiBlYWNoIG9mIHdoaWNoIGdlbmVyYXRlcyAyIGluc3RydWN0aW9ucyAoYSAnYm5vJyBhbmQgb25lIG90aGVyIGJyYW5jaCkuCi0gKgotICogVGhlIENBTExKIGZvcm1hdCBpcyBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgSXQgaW5kaWNhdGVzIHRoYXQKLSAqIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgKGEgQ1RSTC1mb3JtYXQgJ2NhbGwnKSBzaG91bGQgaGF2ZSBpdHMgcmVsb2NhdGlvbgotICogc3BlY2lhbGx5IGZsYWdnZWQgZm9yIGxpbmstdGltZSByZXBsYWNlbWVudCB3aXRoIGEgJ2JhbCcgb3IgJ2NhbGxzJyBpZgotICogYXBwcm9wcmlhdGUuCi0gKi8KLQotLyogdGFpbG9yIGdhcyAqLwotI2RlZmluZSBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0jZGVmaW5lIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMKLQotLyogdGFpbG9yIHRoZSBjb2ZmIGZvcm1hdCAqLwotI2RlZmluZSBCRkRfQVJDSAkJCQliZmRfYXJjaF9pOTYwCi0jZGVmaW5lIENPRkZfRkxBR1MJCQkJRl9BUjMyV1IKLSNkZWZpbmUgQ09GRl9NQUdJQwkJCQlJOTYwUk9NQUdJQwotI2RlZmluZSBPQkpfQ09GRl9TRUNUSU9OX0hFQURFUl9IQVNfQUxJR05NRU5UCi0jZGVmaW5lIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTCQkJKDIpCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKEZJWFApCQkJKCEoRklYUCktPmZ4X2RvbmUpCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKEZJWFApCQkJdGNfY29mZl9maXgycnR5cGUoRklYUCkKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChGUkFHUCkJCXRjX2NvZmZfc2l6ZW1hY2hkZXAoRlJBR1ApCi0jZGVmaW5lIFRDX0NPRkZfU0VUX01BQ0hJTkUoSERSUykJCXRjX2hlYWRlcnNfaG9vayAoSERSUykKLWV4dGVybiB2b2lkIHRjX2hlYWRlcnNfaG9vayAoKTsKLWV4dGVybiBzaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSAoKTsKLWV4dGVybiBpbnQgdGNfY29mZl9zaXplbWFjaGRlcCAoKTsKLQotLyogTUVBTklORyBPRiAnbl9vdGhlcicgaW4gdGhlIHN5bWJvbCByZWNvcmQuCi0gKgotICogSWYgbm9uLXplcm8sIHRoZSAnbl9vdGhlcicgZmllbGRzIGluZGljYXRlcyBlaXRoZXIgYSBsZWFmIHByb2NlZHVyZSBvcgotICogYSBzeXN0ZW0gcHJvY2VkdXJlLCBhcyBmb2xsb3dzOgotICoKLSAqCTEgPD0gbl9vdGhlciA8PSAzMiA6Ci0gKgkJVGhlIHN5bWJvbCBpcyB0aGUgZW50cnkgcG9pbnQgdG8gYSBzeXN0ZW0gcHJvY2VkdXJlLgotICoJCSduX3ZhbHVlJyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnksIGFzIGZvciBhbnkgb3RoZXIKLSAqCQlwcm9jZWR1cmUuICBUaGUgc3lzdGVtIHByb2NlZHVyZSBudW1iZXIgKHdoaWNoIGNhbiBiZSB1c2VkIGluCi0gKgkJYSAnY2FsbHMnIGluc3RydWN0aW9uKSBpcyAobl9vdGhlci0xKS4gIFRoZXNlIGVudHJpZXMgY29tZSBmcm9tCi0gKgkJJy5zeXNwcm9jJyBkaXJlY3RpdmVzLgotICoKLSAqCW5fb3RoZXIgPT0gTl9DQUxMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdjYWxsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgotICoJCVRoZSAqbmV4dCogc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgbXVzdCBiZSB0aGUgY29ycmVzcG9uZGluZwotICoJCSdiYWwnIGVudHJ5IHBvaW50IHRvIHRoZSBwcm9jZWR1cmUgKHNlZSBmb2xsb3dpbmcpLiAgVGhlc2UKLSAqCQllbnRyaWVzIGNvbWUgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIHR3byBkaWZmZXJlbnQKLSAqCQlzeW1ib2xzIGFyZSBzcGVjaWZpZWQgKHRoZSBmaXJzdCBvbmUgaXMgcmVwcmVzZW50ZWQgaGVyZSkuCi0gKgotICoKLSAqCW5fb3RoZXIgPT0gTl9CQUxOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2JhbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KLSAqCQlUaGVzZSBlbnRyaWVzIHJlc3VsdCBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggb25seQotICoJCW9uZSBzeW1ib2wgaXMgc3BlY2lmaWVkLCBvciBpbiB3aGljaCB0aGUgc2FtZSBzeW1ib2wgaXMKLSAqCQlzcGVjaWZpZWQgdHdpY2UuCi0gKgotICogTm90ZSB0aGF0IGFuIE5fQ0FMTE5BTUUgZW50cnkgKm11c3QqIGhhdmUgYSBjb3JyZXNwb25kaW5nIE5fQkFMTkFNRSBlbnRyeSwKLSAqIGJ1dCBub3QgZXZlcnkgTl9CQUxOQU1FIGVudHJ5IG11c3QgaGF2ZSBhbiBOX0NBTExOQU1FIGVudHJ5LgotICovCi0jZGVmaW5lCU5fQ0FMTE5BTUUJKChjaGFyKS0xKQotI2RlZmluZQlOX0JBTE5BTUUJKChjaGFyKS0yKQotCi0vKiBpOTYwIHVzZXMgYSBjdXN0b20gcmVsb2NhdGlvbiByZWNvcmQuICovCi0KLS8qIGxldCBvYmotYW91dC5oIGtub3cgKi8KLSNkZWZpbmUgQ1VTVE9NX1JFTE9DX0ZPUk1BVCAxCi0vKiBsZXQgYW91dF9nbnUuaCBrbm93ICovCi0jZGVmaW5lIE5fUkVMT0NBVElPTl9JTkZPX0RFQ0xBUkVEIDEKLXN0cnVjdCByZWxvY2F0aW9uX2luZm8KLSAgewotICAgIGludCByX2FkZHJlc3M7CQkvKiBGaWxlIGFkZHJlc3Mgb2YgaXRlbSB0byBiZSByZWxvY2F0ZWQJKi8KLSAgICB1bnNpZ25lZAotICAgICAgcl9pbmRleDoyNCwJCS8qIEluZGV4IG9mIHN5bWJvbCBvbiB3aGljaCByZWxvY2F0aW9uIGlzIGJhc2VkKi8KLSAgICAgIHJfcGNyZWw6MSwJCS8qIDEgPT4gcmVsb2NhdGUgUEMtcmVsYXRpdmU7IGVsc2UgYWJzb2x1dGUKLQkJCQkgKglPbiBpOTYwLCBwYy1yZWxhdGl2ZSBpbXBsaWVzIDI0LWJpdAotCQkJCSAqCWFkZHJlc3MsIGFic29sdXRlIGltcGxpZXMgMzItYml0LgotCQkJCSAqLwotICAgICAgcl9sZW5ndGg6MiwJCS8qIE51bWJlciBvZiBieXRlcyB0byByZWxvY2F0ZToKLQkJCQkgKgkwID0+IDEgYnl0ZQotCQkJCSAqCTEgPT4gMiBieXRlcwotCQkJCSAqCTIgPT4gNCBieXRlcyAtLSBvbmx5IHZhbHVlIHVzZWQgZm9yIGk5NjAKLQkJCQkgKi8KLSAgICAgIHJfZXh0ZXJuOjEsIHJfYnNyOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLSAgICAgIHJfZGlzcDoxLAkJCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLSAgICAgIHJfY2FsbGo6MSwJCS8qIDEgaWYgcmVsb2NhdGlvbiB0YXJnZXQgaXMgYW4gaTk2MCAnY2FsbGonICovCi0gICAgICBudXRoaW46MTsJCQkvKiBVbnVzZWQJCQkJKi8KLSAgfTsKLQotI2lmZGVmIE9CSl9DT0ZGCi0KLS8qIFdlIHN0b3JlIHRoZSBiYWwgaW5mb3JtYXRpb24gaW4gdGhlIHN5X3RjIGZpZWxkLiAgKi8KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSBzeW1ib2xTICoKLQotI2RlZmluZSBUQ19BREpVU1RfUkVMT0NfQ09VTlQoRklYUCxDT1VOVCkgXAotICB7IGZpeFMgKnRjZml4cCA9IChGSVhQKTsgXAotICAgIGZvciAoO3RjZml4cDt0Y2ZpeHA9dGNmaXhwLT5meF9uZXh0KSBcCi0gICAgICBpZiAodGNmaXhwLT5meF90Y2JpdCAmJiB0Y2ZpeHAtPmZ4X2FkZHN5ICE9IDApIFwKLSAgICAgICAgKysoQ09VTlQpOyBcCi0gIH0KLSNlbmRpZgotCi1leHRlcm4gaW50IGk5NjBfdmFsaWRhdGVfZml4IFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCwgc3ltYm9sUyAqKikpOwotI2RlZmluZSBUQ19WQUxJREFURV9GSVgoRklYUCxTRUdUWVBFLExBQkVMKSBcCi0JaWYgKGk5NjBfdmFsaWRhdGVfZml4IChGSVhQLCBTRUdUWVBFLCAmYWRkX3N5bWJvbFApICE9IDApIGdvdG8gTEFCRUwKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMIFwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiBTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKQotI2VuZGlmCi0KLSNpZm5kZWYgT0JKX0VMRgotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVhQKQkJKChGSVhQKS0+ZnhfYnNyID09IDApCi0jZWxzZQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVhQKQkJCQkJCVwKLSAgKChGSVhQKS0+ZnhfYnNyID09IDAJCQkJCQkJXAotICAgJiYgISBTX0lTX0VYVEVSTkFMICgoRklYUCktPmZ4X2FkZHN5KQkJCQlcCi0gICAmJiAhIFNfSVNfV0VBSyAoKEZJWFApLT5meF9hZGRzeSkpCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgYnJ0YWJfZW1pdCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2VuZCgpCWJydGFiX2VtaXQgKCkKLQotZXh0ZXJuIHZvaWQgcmVsb2NfY2FsbGogKCk7Ci0KLWV4dGVybiB2b2lkIHRjX3NldF9iYWxfb2ZfY2FsbCBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotCi1leHRlcm4gc3RydWN0IHN5bWJvbCAqdGNfZ2V0X2JhbF9vZl9jYWxsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi1leHRlcm4gdm9pZCBpOTYwX2hhbmRsZV9hbGlnbiAoKTsKLSNkZWZpbmUgSEFORExFX0FMSUdOKEZSQUcpCWk5NjBfaGFuZGxlX2FsaWduIChGUkFHKQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotI2RlZmluZSBOT19SRUxPQyAtMQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotI2RlZmluZSBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZCi0KLSNkZWZpbmUgVENfRklYX1RZUEUgc3RydWN0IHsgdW5zaWduZWQgYnNyIDogMTsgfQotI2RlZmluZSBmeF9ic3IgdGNfZml4X2RhdGEuYnNyCi0jZGVmaW5lIFRDX0lOSVRfRklYX0RBVEEoRikJKChGKS0+dGNfZml4X2RhdGEuYnNyID0gMCkKLQotI2VuZGlmCi0KLS8qIGVuZCBvZiB0Yy1pOTYwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTMyci5jIGIvZ2FzL2NvbmZpZy90Yy1tMzJyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDUzMzguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTE3ICswLDAgQEAKLS8qIHRjLW0zMnIuYyAtLSBBc3NlbWJsZXIgZm9yIHRoZSBNaXRzdWJpc2hpIE0zMlIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2Rlcy9tMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJvcGNvZGVzL20zMnItb3BjLmgiCi0jaW5jbHVkZSAiY2dlbi5oIgotCi0vKiBMaW5rZWQgbGlzdCBvZiBzeW1ib2xzIHRoYXQgYXJlIGRlYnVnZ2luZyBzeW1ib2xzIHRvIGJlIGRlZmluZWQgYXMgdGhlCi0gICBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3ltX2xpbmsKLXsKLSAgc3RydWN0IHN5bV9saW5rICpuZXh0OwotICBzeW1ib2xTCSAgKnN5bWJvbDsKLX0gc3ltX2xpbmtTOwotCi1zdGF0aWMgc3ltX2xpbmtTICpkZWJ1Z19zeW1fbGluayA9IChzeW1fbGlua1MgKikwOwotICAKLS8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgZGVzY3JpYmluZwotICAgYW4gaW5kaXZpZHVhbCBpbnN0cnVjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBDR0VOX0lOU04gKglpbnNuOwotICBjb25zdCBDR0VOX0lOU04gKglvcmlnX2luc247Ci0gIENHRU5fRklFTERTCQlmaWVsZHM7Ci0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0gIENHRU5fSU5TTl9JTlQgICAgICAgICBidWZmZXIgWzFdOwotI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKCooYnVmKSkKLSNlbHNlCi0gIHVuc2lnbmVkIGNoYXIgICAgICAgICBidWZmZXIgW0NHRU5fTUFYX0lOU05fU0laRV07Ci0jZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoYnVmKQotI2VuZGlmCi0gIGNoYXIgKgkJYWRkcjsKLSAgZnJhZ1MgKgkJZnJhZzsKLSAgaW50ICAgICAgICAgICAgICAgICAgIG51bV9maXh1cHM7Ci0gIGZpeFMgKiAgICAgICAgICAgICAgICBmaXh1cHMgW0dBU19DR0VOX01BWF9GSVhVUFNdOwotICBpbnQgICAgICAgICAgICAgICAgICAgaW5kaWNlcyBbTUFYX09QRVJBTkRfSU5TVEFOQ0VTXTsKLSAgc3ltX2xpbmtTCQkqZGVidWdfc3ltX2xpbms7Ci19Ci1tMzJyX2luc247Ci0KLS8qIHByZXZfaW5zbi5pbnNuIGlzIG5vbi1udWxsIGlmIGxhc3QgaW5zbiB3YXMgYSAxNiBiaXQgaW5zbiBvbiBhIDMyIGJpdAotICAgYm91bmRhcnkgKGkuZS4gd2FzIHRoZSBmaXJzdCBvZiB0d28gMTYgYml0IGluc25zKS4gICovCi1zdGF0aWMgbTMycl9pbnNuCXByZXZfaW5zbjsKLQotLyogTm9uLXplcm8gaWYgd2UndmUgc2VlbiBhIHJlbGF4YWJsZSBpbnNuIHNpbmNlIHRoZSBsYXN0IDMyIGJpdAotICAgYWxpZ25tZW50IHJlcXVlc3QuICAqLwotc3RhdGljIGludCBzZWVuX3JlbGF4YWJsZV9wID0gMDsKLQotLyogTm9uLXplcm8gaWYgLXJlbGF4IHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBzdWZmaWNpZW50IHJlbG9jcyBhcmUgb3V0cHV0Ci0gICBmb3IgdGhlIGxpbmtlciB0byBkbyByZWxheGluZy4KLSAgIFdlIGRvIHNpbXBsZSBmb3JtcyBvZiByZWxheGluZyBpbnRlcm5hbGx5LCBidXQgdGhleSBhcmUgYWx3YXlzIGRvbmUuCi0gICBUaGlzIGZsYWcgZG9lcyBub3QgYXBwbHkgdG8gdGhlbS4gICovCi1zdGF0aWMgaW50IG0zMnJfcmVsYXg7Ci0KLSNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0vKiBJZiBub24tTlVMTCwgcG9pbnRlciB0byBjcHUgZGVzY3JpcHRpb24gZmlsZSB0byByZWFkLgotICAgVGhpcyBhbGxvd3MgcnVudGltZSBhZGRpdGlvbnMgdG8gdGhlIGFzc2VtYmxlci4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqIG0zMnJfY3B1X2Rlc2M7Ci0jZW5kaWYKLQotLyogTm9uLXplcm8gaWYgd2FybiB3aGVuIGEgaGlnaC9zaGlnaCByZWxvYyBoYXMgbm8gbWF0Y2hpbmcgbG93IHJlbG9jLgotICAgRWFjaCBoaWdoL3NoaWdoIHJlbG9jIG11c3QgYmUgcGFpcmVkIHdpdGggaXQncyBsb3cgY291c2luIGluIG9yZGVyIHRvCi0gICBwcm9wZXJseSBjYWxjdWxhdGUgdGhlIGFkZGVuZCBpbiBhIHJlbG9jYXRhYmxlIGxpbmsgKHNpbmNlIHRoZXJlIGlzIGEKLSAgIHBvdGVudGlhbCBjYXJyeSBmcm9tIHRoZSBsb3cgdG8gdGhlIGhpZ2gvc2hpZ2gpLgotICAgVGhpcyBvcHRpb24gaXMgb2ZmIGJ5IGRlZmF1bHQgdGhvdWdoIGZvciB1c2VyLXdyaXR0ZW4gYXNzZW1ibGVyIGNvZGUgaXQKLSAgIG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gbWFrZSB0aGUgZGVmYXVsdCBiZSBvbiAoaS5lLiBoYXZlIGdjYyBwYXNzIGEgZmxhZwotICAgdG8gdHVybiBpdCBvZmYpLiAgVGhpcyB3YXJuaW5nIG11c3Qgbm90IGJlIG9uIGZvciBHQ0MgY3JlYXRlZCBjb2RlIGFzCi0gICBvcHRpbWl6YXRpb24gbWF5IGRlbGV0ZSB0aGUgbG93IGJ1dCBub3QgdGhlIGhpZ2gvc2hpZ2ggKGF0IGxlYXN0IHdlCi0gICBzaG91bGRuJ3QgYXNzdW1lIG9yIHJlcXVpcmUgaXQgdG8pLiAgKi8KLXN0YXRpYyBpbnQgd2Fybl91bm1hdGNoZWRfaGlnaCA9IDA7Ci0KLS8qIE5vbi16ZXJvIGlmIC1tMzJyeCBoYXMgYmVlbiBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2Ugc3VwcG9ydCBmb3IgdGhlCi0gICBleHRlbmRlZCBNMzJSWCBpbnN0cnVjdGlvbiBzZXQgc2hvdWxkIGJlIGVuYWJsZWQuICAqLwotc3RhdGljIGludCBlbmFibGVfbTMycnggPSAwOwotCi0vKiBOb24temVybyBpZiAtbTMycnggLWhpZGRlbiBoYXMgYmVlbiBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2Ugc3VwcG9ydCBmb3IKLSAgIHRoZSBzcGVjaWFsIE0zMlJYIGluc3RydWN0aW9uIHNldCBzaG91bGQgYmUgZW5hYmxlZC4gICovCi1zdGF0aWMgaW50IGVuYWJsZV9zcGVjaWFsID0gMDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByb2dyYW1tZXIgc2hvdWxkIGJlIHdhcm5lZCB3aGVuIGFuIGV4cGxpY2l0IHBhcmFsbGVsCi0gICBpbnN0cnVjdGlvbiBtaWdodCBoYXZlIGNvbnN0cmFpbnQgdmlvbGF0aW9ucy4gICovCi1zdGF0aWMgaW50IHdhcm5fZXhwbGljaXRfcGFyYWxsZWxfY29uZmxpY3RzID0gMTsKLQotLyogTm9uLXplcm8gaWYgaW5zbnMgY2FuIGJlIG1hZGUgcGFyYWxsZWwuICAqLwotc3RhdGljIGludCBvcHRpbWl6ZTsKLQotLyogc3R1ZmYgZm9yIC5zY29tbSBzeW1ib2xzLiAgKi8KLXN0YXRpYyBzZWdUICAgICBzYnNzX3NlY3Rpb247Ci1zdGF0aWMgYXNlY3Rpb24gc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgIHNjb21fc3ltYm9sOwotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSAgICAgICAgPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdICAgPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gICAgICAgICAgICA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdICAgICAgICAgICAgPSAiZEQiOwotCi0vKiBSZWxvY2F0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgYXJlIGRvbmUgaW4gdHdvCi0gICBwYXJ0cywgd2l0aCBhIEhJIHJlbG9jYXRpb24gYW5kIGEgTE8gcmVsb2NhdGlvbi4gIEVhY2ggcmVsb2NhdGlvbgotICAgaGFzIG9ubHkgMTYgYml0cyBvZiBzcGFjZSB0byBzdG9yZSBhbiBhZGRlbmQuICBUaGlzIG1lYW5zIHRoYXQgaW4KLSAgIG9yZGVyIGZvciB0aGUgbGlua2VyIHRvIGhhbmRsZSBjYXJyaWVzIGNvcnJlY3RseSwgaXQgbXVzdCBiZSBhYmxlCi0gICB0byBsb2NhdGUgYm90aCB0aGUgSEkgYW5kIHRoZSBMTyByZWxvY2F0aW9uLiAgVGhpcyBtZWFucyB0aGF0IHRoZQotICAgcmVsb2NhdGlvbnMgbXVzdCBhcHBlYXIgaW4gb3JkZXIgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUuCi0KLSAgIEluIG9yZGVyIHRvIGltcGxlbWVudCB0aGlzLCB3ZSBrZWVwIHRyYWNrIG9mIGVhY2ggdW5tYXRjaGVkIEhJCi0gICByZWxvY2F0aW9uLiAgV2UgdGhlbiBzb3J0IHRoZW0gc28gdGhhdCB0aGV5IGltbWVkaWF0ZWx5IHByZWNlZGUgdGhlCi0gICBjb3JyZXNwb25kaW5nIExPIHJlbG9jYXRpb24uICovCi0KLXN0cnVjdCBtMzJyX2hpX2ZpeHVwCi17Ci0gIHN0cnVjdCBtMzJyX2hpX2ZpeHVwICogbmV4dDsgIC8qIE5leHQgSEkgZml4dXAuICAqLwotICBmaXhTICogICAgICAgICAgICAgICAgIGZpeHA7ICAvKiBUaGlzIGZpeHVwLiAgKi8KLSAgc2VnVCAgICAgICAgICAgICAgICAgICBzZWc7ICAgLyogVGhlIHNlY3Rpb24gdGhpcyBmaXh1cCBpcyBpbi4gICovCi0KLX07Ci0KLS8qIFRoZSBsaXN0IG9mIHVubWF0Y2hlZCBISSByZWxvY3MuICAqLwotCi1zdGF0aWMgc3RydWN0IG0zMnJfaGlfZml4dXAgKiBtMzJyX2hpX2ZpeHVwX2xpc3Q7Ci0KLQwKLXN0YXRpYyB2b2lkCi1hbGxvd19tMzJyeCAob24pCi0gICAgIGludCBvbjsKLXsKLSAgZW5hYmxlX20zMnJ4ID0gb247Ci0KLSAgaWYgKHN0ZG91dHB1dCAhPSBOVUxMKQotICAgIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILAotCQkgICAgICAgZW5hYmxlX20zMnJ4ID8gYmZkX21hY2hfbTMycnggOiBiZmRfbWFjaF9tMzJyKTsKLX0KLQwKLSNkZWZpbmUgTTMyUl9TSE9SVE9QVFMgIk8iCi1jb25zdCBjaGFyICogbWRfc2hvcnRvcHRzID0gTTMyUl9TSE9SVE9QVFM7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jZGVmaW5lIE9QVElPTl9NMzJSCQkoT1BUSU9OX01EX0JBU0UpCi0jZGVmaW5lIE9QVElPTl9NMzJSWAkJKE9QVElPTl9NMzJSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fUEFSQUxMRUwJKE9QVElPTl9NMzJSWCArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19XQVJOX1BBUkFMTEVMCShPUFRJT05fV0FSTl9QQVJBTExFTCArIDEpCi0jZGVmaW5lIE9QVElPTl9TUEVDSUFMCQkoT1BUSU9OX05PX1dBUk5fUEFSQUxMRUwgKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9VTk1BVENIRUQgCShPUFRJT05fU1BFQ0lBTCArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRCAoT1BUSU9OX1dBUk5fVU5NQVRDSEVEICsgMSkKLSAgeyJtMzJyIiwgIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTMyUn0sCi0gIHsibTMycngiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX00zMlJYfSwKLSAgeyJ3YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0cyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9QQVJBTExFTH0sCi0gIHsiV3AiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fUEFSQUxMRUx9LAotICB7Im5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XQVJOX1BBUkFMTEVMfSwKLSAgeyJXbnAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1dBUk5fUEFSQUxMRUx9LAotICB7ImhpZGRlbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1BFQ0lBTH0sCi0gIC8qIFNpZ2guICBJIGd1ZXNzIGFsbCB3YXJuaW5ncyBtdXN0IG5vdyBoYXZlIGJvdGggdmFyaWFudHMuICAqLwotICB7Indhcm4tdW5tYXRjaGVkLWhpZ2giLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLSAgeyJXdWgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLSAgeyJuby13YXJuLXVubWF0Y2hlZC1oaWdoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRH0sCi0gIHsiV251aCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fV0FSTl9VTk1BVENIRUR9LAotCi0jaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLwotI2RlZmluZSBPUFRJT05fUkVMQVgJCShPUFRJT05fTk9fV0FSTl9VTk1BVENIRUQgKyAxKQotI2RlZmluZSBPUFRJT05fQ1BVX0RFU0MJCShPUFRJT05fUkVMQVggKyAxKQotICB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCi0gIHsiY3B1LWRlc2MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NQVV9ERVNDfSwKLSNlbmRpZgotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50ICAgIGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnTyc6Ci0gICAgICBvcHRpbWl6ZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX00zMlI6Ci0gICAgICBhbGxvd19tMzJyeCAoMCk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BUSU9OX00zMlJYOgotICAgICAgYWxsb3dfbTMycnggKDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QVElPTl9XQVJOX1BBUkFMTEVMOgotICAgICAgd2Fybl9leHBsaWNpdF9wYXJhbGxlbF9jb25mbGljdHMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QVElPTl9OT19XQVJOX1BBUkFMTEVMOgotICAgICAgd2Fybl9leHBsaWNpdF9wYXJhbGxlbF9jb25mbGljdHMgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TUEVDSUFMOgotICAgICAgaWYgKGVuYWJsZV9tMzJyeCkKLQllbmFibGVfc3BlY2lhbCA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgLyogUHJldGVuZCB0aGF0IHdlIGRvIG5vdCByZWNvZ25pc2UgdGhpcyBvcHRpb24uICAqLwotCSAgYXNfYmFkIChfKCJVbnJlY29nbmlzZWQgb3B0aW9uOiAtaGlkZGVuIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9XQVJOX1VOTUFUQ0hFRDoKLSAgICAgIHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRDoKLSAgICAgIHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICBtMzJyX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0NQVV9ERVNDOgotICAgICAgbTMycl9jcHVfZGVzYyA9IGFyZzsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqIHN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgTTMyUiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uczpcbiIpKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLW0zMnIgICAgICAgICAgICAgICAgICAgZGlzYWJsZSBzdXBwb3J0IGZvciB0aGUgbTMycnggaW5zdHJ1Y3Rpb24gc2V0XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtbTMycnggICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBleHRlbmRlZCBtMzJyeCBpbnN0cnVjdGlvbiBzZXRcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1PICAgICAgICAgICAgICAgICAgICAgIHRyeSB0byBjb21iaW5lIGluc3RydWN0aW9ucyBpbiBwYXJhbGxlbFxuIikpOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtd2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHMgICAgIHdhcm4gd2hlbiBwYXJhbGxlbCBpbnN0cnVjdGlvbnNcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGUgY29udHJhaW50c1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLW5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzICBkbyBub3Qgd2FybiB3aGVuIHBhcmFsbGVsXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMgdmlvbGF0ZSBjb250cmFpbnRzXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtV3AgICAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtd2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHNcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1XbnAgICAgICAgICAgICAgICAgICAgIHN5bm9ueW0gZm9yIC1uby13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0c1xuIikpOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtd2Fybi11bm1hdGNoZWQtaGlnaCAgICB3YXJuIHdoZW4gYW4gKHMpaGlnaCByZWxvYyBoYXMgbm8gbWF0Y2hpbmcgbG93IHJlbG9jXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtbm8td2Fybi11bm1hdGNoZWQtaGlnaCBkbyBub3Qgd2FybiBhYm91dCBtaXNzaW5nIGxvdyByZWxvY3NcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1XdWggICAgICAgICAgICAgICAgICAgIHN5bm9ueW0gZm9yIC13YXJuLXVubWF0Y2hlZC1oaWdoXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtV251aCAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtbm8td2Fybi11bm1hdGNoZWQtaGlnaFxuIikpOwotCi0jaWYgMAotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLXJlbGF4ICAgICAgICAgICAgICAgICBjcmVhdGUgbGlua2VyIHJlbGF4YWJsZSBjb2RlXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtY3B1LWRlc2MgICAgICAgICAgICAgIHByb3ZpZGUgcnVudGltZSBjcHUgZGVzY3JpcHRpb24gZmlsZVxuIikpOwotI2VuZGlmCi19IAotCi1zdGF0aWMgdm9pZCBmaWxsX2luc24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBtMzJyX3Njb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgZGVidWdfc3ltIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgZXhwYW5kX2RlYnVnX3N5bXMgUEFSQU1TICgoc3ltX2xpbmtTICosIGludCkpOwotCi0vKiBTZXQgYnkgbWRfYXNzZW1ibGUgZm9yIHVzZSBieSBtMzJyX2ZpbGxfaW5zbi4gICovCi1zdGF0aWMgc3Vic2VnVCBwcmV2X3N1YnNlZzsKLXN0YXRpYyBzZWdUIHByZXZfc2VnOwotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJ3b3JkIiwJY29ucywJCTQgfSwKLSAgeyAiZmlsbGluc24iLCBmaWxsX2luc24sCTAgfSwKLSAgeyAic2NvbW0iLAltMzJyX3Njb21tLAkwIH0sCi0gIHsgImRlYnVnc3ltIiwJZGVidWdfc3ltLAkwIH0sCi0gIC8qIE5vdCBkb2N1bWVudGVkIGFzIHNvIGZhciB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGVtLi4uLiAqLyAgCi0gIHsgIm0zMnIiLAlhbGxvd19tMzJyeCwJMCB9LAotICB7ICJtMzJyeCIsCWFsbG93X20zMnJ4LAkxIH0sCi0gIHsgTlVMTCwgTlVMTCwgMCB9Ci19OwotCi0vKiBGSVhNRTogU2hvdWxkIGJlIG1hY2hpbmUgZ2VuZXJhdGVkLiAgKi8KLSNkZWZpbmUgTk9QX0lOU04gMHg3MDAwCi0jZGVmaW5lIFBBUl9OT1BfSU5TTiAweGYwMDAgLyogY2FuIG9ubHkgYmUgdXNlZCBpbiAybmQgc2xvdCAqLwotCi0vKiBXaGVuIHdlIGFsaWduIHRoZSAudGV4dCBzZWN0aW9uLCBpbnNlcnQgdGhlIGNvcnJlY3QgTk9QIHBhdHRlcm4uCi0gICBOIGlzIHRoZSBwb3dlciBvZiAyIGFsaWdubWVudC4gIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHBhdHRlcm4gRklMTC4KLSAgIE1BWCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwIHdoZW4gZG9pbmcgdGhlIGFsaWdubWVudCwKLSAgIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0KLWludAotbTMycl9kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpCi0gICAgIGludCAgICAgICAgICBuOwotICAgICBjb25zdCBjaGFyICogZmlsbDsKLSAgICAgaW50ICAgICAgICAgIGxlbjsKLSAgICAgaW50ICAgICAgICAgIG1heDsKLXsKLSAgLyogT25seSBkbyB0aGlzIGlmIHRoZSBmaWxsIHBhdHRlcm4gd2Fzbid0IHNwZWNpZmllZC4gICovCi0gIGlmIChmaWxsID09IE5VTEwKLSAgICAgICYmIHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpCi0gICAgICAvKiBPbmx5IGRvIHRoaXMgc3BlY2lhbCBoYW5kbGluZyBpZiBhbGlnbmluZyB0byBhdCBsZWFzdCBhCi0JIDQgYnl0ZSBib3VuZGFyeS4gICovCi0gICAgICAmJiBuID4gMQotICAgICAvKiBPbmx5IGRvIHRoaXMgc3BlY2lhbCBoYW5kbGluZyBpZiB3ZSdyZSBhbGxvd2VkIHRvIGVtaXQgYXQKLQkgbGVhc3QgdHdvIGJ5dGVzLiAgKi8KLSAgICAgICYmIChtYXggPT0gMCB8fCBtYXggPiAxKSkKLSAgICB7Ci0gICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub3BfcGF0dGVybltdID0geyAweGYwLCAweDAwIH07Ci0KLSNpZiAwCi0gICAgICAvKiBGaXJzdCBhbGlnbiB0byBhIDIgYnl0ZSBib3VuZGFyeSwgaW4gY2FzZSB0aGVyZSBpcyBhbiBvZGQgLmJ5dGUuICAqLwotICAgICAgLyogRklYTUU6IEhvdyBtdWNoIG1lbW9yeSB3aWxsIGNhdXNlIGdhcyB0byB1c2Ugd2hlbiBhc3NlbWJsaW5nIGEgYmlnCi0JIHByb2dyYW0/ICBQZXJoYXBzIHdlIGNhbiBhdm9pZCB0aGUgZnJhZ19hbGlnbiBjYWxsPyAgKi8KLSAgICAgIGZyYWdfYWxpZ24gKDEsIDAsIDApOwotI2VuZGlmCi0gICAgICAvKiBOZXh0IGFsaWduIHRvIGEgNCBieXRlIGJvdW5kYXJ5ICh3ZSBrbm93IG4gPj0gMikgdXNpbmcgYSBwYXJhbGxlbAotCSBub3AuICAqLwotICAgICAgZnJhZ19hbGlnbl9wYXR0ZXJuICgyLCBub3BfcGF0dGVybiwgc2l6ZW9mIG5vcF9wYXR0ZXJuLCAwKTsKLSAgICAgIC8qIElmIGRvaW5nIGxhcmdlciBhbGlnbm1lbnRzIHVzZSBhIHJlcGVhdGluZyBzZXF1ZW5jZSBvZiBhcHByb3ByaWF0ZQotCSBub3BzLiAgKi8KLSAgICAgIGlmIChuID4gMikKLQl7Ci0JICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtdWx0aV9ub3BfcGF0dGVybltdID0KLQkgIHsgMHg3MCwgMHgwMCwgMHhmMCwgMHgwMCB9OwotCSAgZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBtdWx0aV9ub3BfcGF0dGVybiwgc2l6ZW9mIG11bHRpX25vcF9wYXR0ZXJuLAotCQkJICAgICAgbWF4ID8gbWF4IC0gMiA6IDApOwotCX0KLSAgICAgIAotICAgICAgcHJldl9pbnNuLmluc24gPSBOVUxMOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBJZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiB3YXMgdGhlIGZpcnN0IG9mIDIgMTYgYml0IGluc25zLAotICAgb3V0cHV0IGEgbm9wIHRvIG1vdmUgdGhlIFBDIHRvIGEgMzIgYml0IGJvdW5kYXJ5LgotCi0gICBUaGlzIGlzIGRvbmUgdmlhIGFuIGFsaWdubWVudCBzcGVjaWZpY2F0aW9uIHNpbmNlIGJyYW5jaCByZWxheGluZwotICAgbWF5IG1ha2UgaXQgdW5uZWNlc3NhcnkuCi0KLSAgIEludGVybmFsbHksIHdlIG5lZWQgdG8gb3V0cHV0IG9uZSBvZiB0aGVzZSBlYWNoIHRpbWUgYSAzMiBiaXQgaW5zbiBpcwotICAgc2VlbiBhZnRlciBhbiBpbnNuIHRoYXQgaXMgcmVsYXhhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWZpbGxfaW5zbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAodm9pZCkgbTMycl9kb19hbGlnbiAoMiwgTlVMTCwgMCwgMCk7Ci0gIHByZXZfaW5zbi5pbnNuID0gTlVMTDsKLSAgc2Vlbl9yZWxheGFibGVfcCA9IDA7Ci19Ci0KLS8qIFJlY29yZCB0aGUgc3ltYm9sIHNvIHRoYXQgd2hlbiB3ZSBvdXRwdXQgdGhlIGluc24sIHdlIGNhbiBjcmVhdGUKLSAgIGEgc3ltYm9sIHRoYXQgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdXNlZAotICAgdG8gZW1pdCB0aGUgbGFiZWwgZm9yIHRoZSBzdGFydCBvZiBhIGJyZWFrcG9pbnQgd2l0aG91dCBjYXVzaW5nCi0gICB0aGUgYXNzZW1ibGVyIHRvIGVtaXQgYSBOT1AgaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhCi0gICAxNiBiaXQgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZGVidWdfc3ltIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgZGVsaW07Ci0gIHJlZ2lzdGVyIGNoYXIgKmVuZF9uYW1lOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICByZWdpc3RlciBzeW1fbGlua1MgKmxpbms7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZGVsaW0gPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZW5kX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKSkgPT0gTlVMTAotICAgICAgJiYgKHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgfQotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSAhPSByZWdfc2VjdGlvbikKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGFzX2JhZCAoXygic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQotICBlbHNlCi0gICAgewotICAgICAgbGluayA9IChzeW1fbGlua1MgKikgeG1hbGxvYyAoc2l6ZW9mIChzeW1fbGlua1MpKTsKLSAgICAgIGxpbmstPnN5bWJvbCA9IHN5bWJvbFA7Ci0gICAgICBsaW5rLT5uZXh0ID0gZGVidWdfc3ltX2xpbms7Ci0gICAgICBkZWJ1Z19zeW1fbGluayA9IGxpbms7Ci0gICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsID0gMTsKLSAgICB9Ci0KLSAgKmVuZF9uYW1lID0gZGVsaW07Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFNlY29uZCBwYXNzIHRvIGV4cGFuZGluZyB0aGUgZGVidWcgc3ltYm9scywgZ28gdGhyb3VnaCBsaW5rZWQKLSAgIGxpc3Qgb2Ygc3ltYm9scyBhbmQgcmVhc3NpZ24gdGhlIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgdm9pZAotZXhwYW5kX2RlYnVnX3N5bXMgKHN5bXMsIGFsaWduKQotICAgICBzeW1fbGlua1MgKnN5bXM7Ci0gICAgIGludCBhbGlnbjsKLXsKLSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBzeW1fbGlua1MgKm5leHRfc3ltczsKLQotICBpZiAoIXN5bXMpCi0gICAgcmV0dXJuOwotCi0gICh2b2lkKSBtMzJyX2RvX2FsaWduIChhbGlnbiwgTlVMTCwgMCwgMCk7Ci0gIGZvciAoOyBzeW1zICE9IChzeW1fbGlua1MgKikwOyBzeW1zID0gbmV4dF9zeW1zKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bWJvbFAgPSBzeW1zLT5zeW1ib2w7Ci0gICAgICBuZXh0X3N5bXMgPSBzeW1zLT5uZXh0OwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gIi5cbiI7Ci0gICAgICBwc2V1ZG9fc2V0IChzeW1ib2xQKTsKLSAgICAgIGZyZWUgKChjaGFyICopc3ltcyk7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZTsKLX0KLQotLyogQ292ZXIgZnVuY3Rpb24gdG8gZmlsbF9pbnNuIGNhbGxlZCBhZnRlciBhIGxhYmVsIGFuZCBhdCBlbmQgb2YgYXNzZW1ibHkuCi0gICBUaGUgcmVzdWx0IGlzIGFsd2F5cyAxOiB3ZSdyZSBjYWxsZWQgaW4gYSBjb25kaXRpb25hbCB0byBzZWUgaWYgdGhlCi0gICBjdXJyZW50IGxpbmUgaXMgYSBsYWJlbC4gICovCi0KLWludAotbTMycl9maWxsX2luc24gKGRvbmUpCi0gICAgIGludCBkb25lOwotewotICBpZiAocHJldl9zZWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWdUICAgIHNlZyAgICA9IG5vd19zZWc7Ci0gICAgICBzdWJzZWdUIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgICAgIHN1YnNlZ19zZXQgKHByZXZfc2VnLCBwcmV2X3N1YnNlZyk7Ci0gICAgICAKLSAgICAgIGZpbGxfaW5zbiAoMCk7Ci0KLSAgICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLSAgICB9Ci0KLSAgaWYgKGRvbmUgJiYgZGVidWdfc3ltX2xpbmspCi0gICAgewotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKGRlYnVnX3N5bV9saW5rLCAxKTsKLSAgICAgIGRlYnVnX3N5bV9saW5rID0gKHN5bV9saW5rUyAqKTA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotDAotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgZmxhZ3dvcmQgYXBwbGljYWJsZTsKLSAgc2VnVCAgICAgc2VnOwotICBzdWJzZWdUICBzdWJzZWc7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgYGNnZW4nIGludGVyZmFjZS4gICovCi0gIAotICAvKiBTZXQgdGhlIG1hY2hpbmUgbnVtYmVyIGFuZCBlbmRpYW4uICAqLwotICBnYXNfY2dlbl9jcHVfZGVzYyA9IG0zMnJfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9NQUNIUywgMCwKLQkJCQkJICBDR0VOX0NQVV9PUEVOX0VORElBTiwKLQkJCQkJICBDR0VOX0VORElBTl9CSUcsCi0JCQkJCSAgQ0dFTl9DUFVfT1BFTl9FTkQpOwotICBtMzJyX2NnZW5faW5pdF9hc20gKGdhc19jZ2VuX2NwdV9kZXNjKTsKLQotICAvKiBUaGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZSBpcyB1c2VkIGR1cmluZyBvcHRpbWl6YXRpb24gdG8gZGV0ZXJtaW5lCi0gICAgIHdoaWNoIGluc25zIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4gIEl0IGlzIGFsc28gdXNlZCB0byBnaXZlCi0gICAgIHdhcm5pbmdzIHJlZ2FyZGluZyBvcGVyYW5kIGludGVyZmVyZW5jZSBpbiBwYXJhbGxlbCBpbnNucy4gICovCi0gIG0zMnJfY2dlbl9pbml0X29waW5zdF90YWJsZSAoZ2FzX2NnZW5fY3B1X2Rlc2MpOwotCi0gIC8qIFRoaXMgaXMgYSBjYWxsYmFjayBmcm9tIGNnZW4gdG8gZ2FzIHRvIHBhcnNlIG9wZXJhbmRzLiAgKi8KLSAgY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGdhc19jZ2VuX3BhcnNlX29wZXJhbmQpOwotCi0jaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLwotICAvKiBJZiBhIHJ1bnRpbWUgY3B1IGRlc2NyaXB0aW9uIGZpbGUgd2FzIHByb3ZpZGVkLCBwYXJzZSBpdC4gICovCi0gIGlmIChtMzJyX2NwdV9kZXNjICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIGVycm1zZzsKLQotICAgICAgZXJybXNnID0gY2dlbl9yZWFkX2NwdV9maWxlIChnYXNfY2dlbl9jcHVfZGVzYywgbTMycl9jcHVfZGVzYyk7Ci0gICAgICBpZiAoZXJybXNnICE9IE5VTEwpCi0JYXNfYmFkICgiJXM6ICVzIiwgbTMycl9jcHVfZGVzYywgZXJybXNnKTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBTYXZlIHRoZSBjdXJyZW50IHN1YnNlZyBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBbaXQncyB0aGUgZGVmYXVsdCBvbmUgYW5kCi0gICAgIHdlIGRvbid0IHdhbnQgdGhlIGluaXRpYWwgc2VjdGlvbiB0byBiZSAuc2Jzc10uICAqLwotICBzZWcgICAgPSBub3dfc2VnOwotICBzdWJzZWcgPSBub3dfc3Vic2VnOwotCi0gIC8qIFRoZSBzYnNzIHNlY3Rpb24gaXMgZm9yIGxvY2FsIC5zY29tbSBzeW1ib2xzLiAgKi8KLSAgc2Jzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5zYnNzIiwgMCk7Ci0gIAotICAvKiBUaGlzIGlzIGNvcGllZCBmcm9tIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcy4gICovCi0gIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2Jzc19zZWN0aW9uLCBhcHBsaWNhYmxlICYgU0VDX0FMTE9DKTsKLSAgCi0jaWYgMCAvKiBXaGF0IGRvZXMgdGhpcyBkbz8gW3NlZSBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3NdICAqLwotICBzZWdfaW5mbyAoYnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotI2VuZGlmCi0KLSAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotCi0gIC8qIFdlIG11c3QgY29uc3RydWN0IGEgZmFrZSBzZWN0aW9uIHNpbWlsYXIgdG8gYmZkX2NvbV9zZWN0aW9uCi0gICAgIGJ1dCB3aXRoIHRoZSBuYW1lIC5zY29tbW9uLiAgKi8KLSAgc2NvbV9zZWN0aW9uICAgICAgICAgICAgICAgID0gYmZkX2NvbV9zZWN0aW9uOwotICBzY29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnNjb21tb24iOwotICBzY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHNjb21fc2VjdGlvbjsKLSAgc2NvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiBzY29tX3N5bWJvbDsKLSAgc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiBzY29tX3NlY3Rpb24uc3ltYm9sOwotICBzY29tX3N5bWJvbCAgICAgICAgICAgICAgICAgPSAqIGJmZF9jb21fc2VjdGlvbi5zeW1ib2w7Ci0gIHNjb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0gIHNjb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgc2NvbV9zZWN0aW9uOwotCi0gIGFsbG93X20zMnJ4IChlbmFibGVfbTMycngpOwotfQotCi0jZGVmaW5lIE9QRVJBTkRfSVNfQ09ORF9CSVQob3BlcmFuZCwgaW5kaWNlcywgaW5kZXgpIFwKLSAgKChvcGVyYW5kKS0+aHdfdHlwZSA9PSBIV19IX0NPTkQJCQlcCi0gICB8fCAoKG9wZXJhbmQpLT5od190eXBlID09IEhXX0hfUFNXKQkJCVwKLSAgIHx8ICgob3BlcmFuZCktPmh3X3R5cGUgPT0gSFdfSF9DUgkJCVwKLSAgICAgICAmJiAoaW5kaWNlcyBbaW5kZXhdID09IDAgfHwgaW5kaWNlcyBbaW5kZXhdID09IDEpKSkKLQotLyogUmV0dXJucyB0cnVlIGlmIGFuIG91dHB1dCBvZiBpbnN0cnVjdGlvbiAnYScgaXMgcmVmZXJlbmNlZCBieSBhbiBvcGVyYW5kCi0gICBvZiBpbnN0cnVjdGlvbiAnYicuICBJZiAnY2hlY2tfb3V0cHV0cycgaXMgdHJ1ZSB0aGVuIGIncyBvdXRwdXRzIGFyZQotICAgY2hlY2tlZCwgb3RoZXJ3aXNlIGl0cyBpbnB1dHMgYXJlIGV4YW1pbmVkLiAgKi8KLQotc3RhdGljIGludAotZmlyc3Rfd3JpdGVzX3RvX3NlY29uZHNfb3BlcmFuZHMgKGEsIGIsIGNoZWNrX291dHB1dHMpCi0gICAgIG0zMnJfaW5zbiAqIGE7Ci0gICAgIG0zMnJfaW5zbiAqIGI7Ci0gICAgIGNvbnN0IGludCAgIGNoZWNrX291dHB1dHM7Ci17Ci0gIGNvbnN0IENHRU5fT1BJTlNUICogYV9vcGVyYW5kcyA9IENHRU5fSU5TTl9PUEVSQU5EUyAoYS0+aW5zbik7Ci0gIGNvbnN0IENHRU5fT1BJTlNUICogYl9vcHMgPSBDR0VOX0lOU05fT1BFUkFORFMgKGItPmluc24pOwotICBpbnQgYV9pbmRleDsKLQotICAvKiBJZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGluc3RydWN0aW9ucyB0YWtlcyBubyBvcGVyYW5kcywgdGhlbiB0aGVyZSBpcwotICAgICBub3RoaW5nIHRvIGNoZWNrLiAgVGhlcmUgcmVhbGx5IGFyZSBpbnN0cnVjdGlvbnMgd2l0aG91dCBvcGVyYW5kcywKLSAgICAgZWcgJ25vcCcuICAqLwotICBpZiAoYV9vcGVyYW5kcyA9PSBOVUxMIHx8IGJfb3BzID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gICAgICAKLSAgLyogU2NhbiB0aGUgb3BlcmFuZCBsaXN0IG9mICdhJyBsb29raW5nIGZvciBhbiBvdXRwdXQgb3BlcmFuZC4gICovCi0gIGZvciAoYV9pbmRleCA9IDA7Ci0gICAgICAgYV9vcGVyYW5kcy0+dHlwZSAhPSBDR0VOX09QSU5TVF9FTkQ7Ci0gICAgICAgYV9pbmRleCArKywgYV9vcGVyYW5kcyArKykKLSAgICB7Ci0gICAgICBpZiAoYV9vcGVyYW5kcy0+dHlwZSA9PSBDR0VOX09QSU5TVF9PVVRQVVQpCi0JewotCSAgaW50IGJfaW5kZXg7Ci0JICBjb25zdCBDR0VOX09QSU5TVCAqIGJfb3BlcmFuZHMgPSBiX29wczsKLQotCSAgLyogU3BlY2lhbCBDYXNlOgotCSAgICAgVGhlIENvbmRpdGlvbiBiaXQgJ0MnIGlzIGEgc2hhZG93IG9mIHRoZSBDQlIgcmVnaXN0ZXIgKGNvbnRyb2wKLQkgICAgIHJlZ2lzdGVyIDEpIGFuZCBhbHNvIGEgc2hhZG93IG9mIGJpdCAzMSBvZiB0aGUgcHJvZ3JhbSBzdGF0dXMKLQkgICAgIHdvcmQgKGNvbnRyb2wgcmVnaXN0ZXIgMCkuICBGb3Igbm93IHRoaXMgaXMgaGFuZGxlZCBoZXJlLCByYXRoZXIKLQkgICAgIHRoYW4gYnkgY2dlbi4uLi4gKi8KLQkgIAotCSAgaWYgKE9QRVJBTkRfSVNfQ09ORF9CSVQgKGFfb3BlcmFuZHMsIGEtPmluZGljZXMsIGFfaW5kZXgpKQotCSAgICB7Ci0JICAgICAgLyogU2NhbiBvcGVyYW5kIGxpc3Qgb2YgJ2InIGxvb2tpbmcgZm9yIGFub3RoZXIgcmVmZXJlbmNlIHRvIHRoZQotCQkgY29uZGl0aW9uIGJpdCwgd2hpY2ggZ29lcyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLiAgKi8KLQkgICAgICBmb3IgKGJfaW5kZXggPSAwOwotCQkgICBiX29wZXJhbmRzLT50eXBlICE9IENHRU5fT1BJTlNUX0VORDsKLQkJICAgYl9pbmRleCArKywgYl9vcGVyYW5kcyArKykKLQkJewotCQkgIGlmICgoYl9vcGVyYW5kcy0+dHlwZQotCQkgICAgICAgPT0gKGNoZWNrX291dHB1dHMKLQkJCSAgID8gQ0dFTl9PUElOU1RfT1VUUFVUCi0JCQkgICA6IENHRU5fT1BJTlNUX0lOUFVUKSkKLQkJICAgICAgJiYgT1BFUkFORF9JU19DT05EX0JJVCAoYl9vcGVyYW5kcywgYi0+aW5kaWNlcywgYl9pbmRleCkpCi0JCSAgICByZXR1cm4gMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTY2FuIG9wZXJhbmQgbGlzdCBvZiAnYicgbG9va2luZyBmb3IgYW4gb3BlcmFuZCB0aGF0Ci0JCSByZWZlcmVuY2VzIHRoZSBzYW1lIGhhcmR3YXJlIGVsZW1lbnQsIGFuZCB3aGljaCBnb2VzIGluIHRoZQotCQkgcmlnaHQgZGlyZWN0aW9uLiAgKi8KLQkgICAgICBmb3IgKGJfaW5kZXggPSAwOwotCQkgICBiX29wZXJhbmRzLT50eXBlICE9IENHRU5fT1BJTlNUX0VORDsKLQkJICAgYl9pbmRleCArKywgYl9vcGVyYW5kcyArKykKLQkJewotCQkgIGlmICgoYl9vcGVyYW5kcy0+dHlwZQotCQkgICAgICAgPT0gKGNoZWNrX291dHB1dHMKLQkJCSAgID8gQ0dFTl9PUElOU1RfT1VUUFVUCi0JCQkgICA6IENHRU5fT1BJTlNUX0lOUFVUKSkKLQkJICAgICAgJiYgKGJfb3BlcmFuZHMtPmh3X3R5cGUgPT0gYV9vcGVyYW5kcy0+aHdfdHlwZSkKLQkJICAgICAgJiYgKGEtPmluZGljZXMgW2FfaW5kZXhdID09IGItPmluZGljZXMgW2JfaW5kZXhdKSkKLQkJICAgIHJldHVybiAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm5zIHRydWUgaWYgdGhlIGluc24gY2FuIChwb3RlbnRpYWxseSkgYWx0ZXIgdGhlIHByb2dyYW0gY291bnRlci4gICovCi0KLXN0YXRpYyBpbnQKLXdyaXRlc190b19wYyAoYSkKLSAgICAgbTMycl9pbnNuICogYTsKLXsKLSNpZiAwICAvKiBPbmNlIFBDIG9wZXJhbmRzIGFyZSB3b3JraW5nLi4uLiAqLwotICBjb25zdCBDR0VOX09QSU5TVCAqIGFfb3BlcmFuZHMgPT0gQ0dFTl9JTlNOX09QRVJBTkRTIChnYXNfY2dlbl9jcHVfZGVzYywKLQkJCQkJCQlhLT5pbnNuKTsKLQotICBpZiAoYV9vcGVyYW5kcyA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIHdoaWxlIChhX29wZXJhbmRzLT50eXBlICE9IENHRU5fT1BJTlNUX0VORCkKLSAgICB7Ci0gICAgICBpZiAoYV9vcGVyYW5kcy0+b3BlcmFuZCAhPSBOVUxMCi0JICAmJiBDR0VOX09QRVJBTkRfSU5ERVggKGdhc19jZ2VuX2NwdV9kZXNjLCBhX29wZXJhbmRzLT5vcGVyYW5kKSA9PSBNMzJSX09QRVJBTkRfUEMpCi0JcmV0dXJuIDE7Ci0gICAgICAKLSAgICAgIGFfb3BlcmFuZHMgKys7Ci0gICAgfQotI2Vsc2UKLSAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChhLT5pbnNuLCBDR0VOX0lOU05fVU5DT05EX0NUSSkKLSAgICAgIHx8IENHRU5fSU5TTl9BVFRSX1ZBTFVFIChhLT5pbnNuLCBDR0VOX0lOU05fQ09ORF9DVEkpKQotICAgIHJldHVybiAxOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm5zIE5VTEwgaWYgdGhlIHR3byAxNiBiaXQgaW5zbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLAotICAgb3RoZXJ3aXNlIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIGFuIGVycm9yIG1lc3NhZ2UgZXhwbGFpbmluZyB3aHkgbm90LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotY2FuX21ha2VfcGFyYWxsZWwgKGEsIGIpCi0gICAgIG0zMnJfaW5zbiAqIGE7Ci0gICAgIG0zMnJfaW5zbiAqIGI7Ci17Ci0gIFBJUEVfQVRUUiBhX3BpcGU7Ci0gIFBJUEVfQVRUUiBiX3BpcGU7Ci0gIAotICAvKiBNYWtlIHN1cmUgdGhlIGluc3RydWN0aW9ucyBhcmUgdGhlIHJpZ2h0IGxlbmd0aC4gICovCi0gIGlmICggICBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIGEtPmZpZWxkcykgIT0gMTYKLSAgICAgIHx8IENHRU5fRklFTERTX0JJVFNJWkUgKCYgYi0+ZmllbGRzKSAhPSAxNikKLSAgICBhYm9ydCgpOwotCi0gIGlmIChmaXJzdF93cml0ZXNfdG9fc2Vjb25kc19vcGVyYW5kcyAoYSwgYiwgdHJ1ZSkpCi0gICAgcmV0dXJuIF8oIkluc3RydWN0aW9ucyB3cml0ZSB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4iKTsKLSAgCi0gIGFfcGlwZSA9IENHRU5fSU5TTl9BVFRSX1ZBTFVFIChhLT5pbnNuLCBDR0VOX0lOU05fUElQRSk7Ci0gIGJfcGlwZSA9IENHRU5fSU5TTl9BVFRSX1ZBTFVFIChiLT5pbnNuLCBDR0VOX0lOU05fUElQRSk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGluc3RydWN0aW9ucyB1c2UgdGhlIGNvcnJlY3QgZXhlY3V0aW9uIHBpcGVsaW5lcy4gICovCi0gIGlmICggICBhX3BpcGUgPT0gUElQRV9OT05FCi0gICAgICB8fCBiX3BpcGUgPT0gUElQRV9OT05FKQotICAgIHJldHVybiBfKCJJbnN0cnVjdGlvbnMgZG8gbm90IHVzZSBwYXJhbGxlbCBleGVjdXRpb24gcGlwZWxpbmVzLiIpOwotCi0gIC8qIExlYXZlIHRoaXMgdGVzdCBmb3IgbGFzdCwgc2luY2UgaXQgaXMgdGhlIG9ubHkgdGVzdCB0aGF0IGNhbgotICAgICBnbyBhd2F5IGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHN3YXBwZWQsIGFuZCB3ZSB3YW50IHRvIG1ha2UKLSAgICAgc3VyZSB0aGF0IGFueSBvdGhlciBlcnJvcnMgYXJlIGRldGVjdGVkIGJlZm9yZSB0aGlzIGhhcHBlbnMuICAqLwotICBpZiAoICAgYV9waXBlID09IFBJUEVfUwotICAgICAgfHwgYl9waXBlID09IFBJUEVfTykKLSAgICByZXR1cm4gXygiSW5zdHJ1Y3Rpb25zIHNoYXJlIHRoZSBzYW1lIGV4ZWN1dGlvbiBwaXBlbGluZSIpOwotICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZvcmNlIHRoZSB0b3AgYml0IG9mIHRoZSBzZWNvbmQgMTYtYml0IGluc24gdG8gYmUgc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLW1ha2VfcGFyYWxsZWwgKGJ1ZmZlcikKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci17Ci0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0gICpidWZmZXIgfD0gMHg4MDAwOwotI2Vsc2UKLSAgYnVmZmVyIFtDR0VOX0NQVV9FTkRJQU4gKGdhc19jZ2VuX2NwdV9kZXNjKSA9PSBDR0VOX0VORElBTl9CSUcgPyAwIDogMV0KLSAgICB8PSAweDgwOwotI2VuZGlmCi19Ci0KLS8qIFNhbWUgYXMgbWFrZV9wYXJhbGxlbCBleGNlcHQgYnVmZmVyIGNvbnRhaW5zIHRoZSBieXRlcyBpbiB0YXJnZXQgb3JkZXIuICAqLwotCi1zdGF0aWMgdm9pZAotdGFyZ2V0X21ha2VfcGFyYWxsZWwgKGJ1ZmZlcikKLSAgICAgY2hhciAqYnVmZmVyOwotewotICBidWZmZXIgW0NHRU5fQ1BVX0VORElBTiAoZ2FzX2NnZW5fY3B1X2Rlc2MpID09IENHRU5fRU5ESUFOX0JJRyA/IDAgOiAxXQotICAgIHw9IDB4ODA7Ci19Ci0KLS8qIEFzc2VtYmxlIHR3byBpbnN0cnVjdGlvbnMgd2l0aCBhbiBleHBsaWNpdCBwYXJhbGxlbCBvcGVyYXRpb24gKHx8KSBvcgotICAgc2VxdWVudGlhbCBvcGVyYXRpb24gKC0+KS4gICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV90d29faW5zbnMgKHN0ciwgc3RyMiwgcGFyYWxsZWxfcCkKLSAgICAgY2hhciAqIHN0cjsKLSAgICAgY2hhciAqIHN0cjI7Ci0gICAgIGludCAgICBwYXJhbGxlbF9wOwotewotICBjaGFyICogICAgc3RyMzsKLSAgbTMycl9pbnNuIGZpcnN0OwotICBtMzJyX2luc24gc2Vjb25kOwotICBjaGFyICogICAgZXJybXNnOwotICBjaGFyICAgICAgc2F2ZV9zdHIyID0gKnN0cjI7Ci0KLSAgKiBzdHIyID0gMDsgLyogU2VwZXJhdGUgdGhlIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgdHdvIGluc25zIGJlZ2luIG9uIGEgMzIgYml0IGJvdW5kYXJ5LgotICAgICBUaGlzIGlzIGFsc28gZG9uZSBmb3IgdGhlIHNlcmlhbCBjYXNlIChmb28gLT4gYmFyKSwgcmVsYXhpbmcgZG9lc24ndAotICAgICBhZmZlY3QgaW5zbnMgd3JpdHRlbiBsaWtlIHRoaXMuCi0gICAgIE5vdGUgdGhhdCB3ZSBtdXN0IGFsd2F5cyBkbyB0aGlzIGFzIHdlIGNhbid0IGFzc3VtZSBhbnl0aGluZyBhYm91dAotICAgICB3aGV0aGVyIHdlJ3JlIGN1cnJlbnRseSBvbiBhIDMyIGJpdCBib3VuZGFyeSBvciBub3QuICBSZWxheGluZyBtYXkKLSAgICAgY2hhbmdlIHRoaXMuICAqLwotICBmaWxsX2luc24gKDApOwotCi0gIGZpcnN0LmRlYnVnX3N5bV9saW5rID0gZGVidWdfc3ltX2xpbms7Ci0gIGRlYnVnX3N5bV9saW5rID0gKHN5bV9saW5rUyAqKTA7Ci0KLSAgLyogUGFyc2UgdGhlIGZpcnN0IGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKCEgKGZpcnN0Lmluc24gPSBtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbgotCSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIHN0ciwgJiBmaXJzdC5maWVsZHMsIGZpcnN0LmJ1ZmZlciwgJiBlcnJtc2cpKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKGVycm1zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIENoZWNrIGl0LiAgKi8KLSAgaWYgKENHRU5fRklFTERTX0JJVFNJWkUgKCZmaXJzdC5maWVsZHMpICE9IDE2KQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oIm5vdCBhIDE2IGJpdCBpbnN0cnVjdGlvbiAnJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlIGlmICghIGVuYWJsZV9zcGVjaWFsCi0gICAgICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoZmlyc3QuaW5zbiwgQ0dFTl9JTlNOX1NQRUNJQUwpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oInVua25vd24gaW5zdHJ1Y3Rpb24gJyVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAoISBlbmFibGVfbTMycngKLSAgICAgIC8qIEZJWE1FOiBOZWVkIHN0YW5kYXJkIG1hY3JvIHRvIHBlcmZvcm0gdGhpcyB0ZXN0LiAgKi8KLSAgICAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChmaXJzdC5pbnNuLCBDR0VOX0lOU05fTUFDSCkgPT0gKDEgPDwgTUFDSF9NMzJSWCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiaW5zdHJ1Y3Rpb24gJyVzJyBpcyBmb3IgdGhlIE0zMlJYIG9ubHkiKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGFsbG93YWJsZSBwYXJhbGxlbCBpbnNuLiAgKi8KLSAgaWYgKHBhcmFsbGVsX3AgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGZpcnN0Lmluc24sIENHRU5fSU5TTl9QSVBFKSA9PSBQSVBFX05PTkUpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiaW5zdHJ1Y3Rpb24gJyVzJyBjYW5ub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgKnN0cjIgPSBzYXZlX3N0cjI7IC8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGFzc2VtYmx5IHRleHQsIGp1c3QgaW4gY2FzZSBpdCBpcyBuZWVkZWQuICAqLwotICBzdHIzICA9IHN0cjsgICAgICAgLyogU2F2ZSB0aGUgb3JpZ2luYWwgc3RyaW5nIHBvaW50ZXIuICAqLwotICBzdHIgICA9IHN0cjIgKyAyOyAgLyogQWR2YW5jZWQgcGFzdCB0aGUgcGFyc2VkIHN0cmluZy4gICovCi0gIHN0cjIgID0gc3RyMzsgICAgICAvKiBSZW1lbWJlciB0aGUgZW50aXJlIHN0cmluZyBpbiBjYXNlIGl0IGlzIG5lZWRlZCBmb3IgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0gIC8qIENvbnZlcnQgdGhlIG9wY29kZSB0byBsb3dlciBjYXNlLiAgKi8KLSAgewotICAgIGNoYXIgKnMyID0gc3RyOwotICAgIAotICAgIHdoaWxlIChpc3NwYWNlICgqczIgKyspKQotICAgICAgY29udGludWU7Ci0KLSAgICAtLXMyOwotCi0gICAgd2hpbGUgKGlzYWxudW0gKCpzMikpCi0gICAgICB7Ci0JaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSAqczIpKQotCSAgKnMyID0gdG9sb3dlciAoKnMyKTsKLQlzMiArKzsKLSAgICAgIH0KLSAgfQotICAKLSAgLyogUHJlc2VydmUgYW55IGZpeHVwcyB0aGF0IGhhdmUgYmVlbiBnZW5lcmF0ZWQgYW5kIHJlc2V0IHRoZSBsaXN0IHRvIGVtcHR5LiAgKi8KLSAgZ2FzX2NnZW5fc2F2ZV9maXh1cHMgKCk7Ci0KLSAgLyogR2V0IHRoZSBpbmRpY2VzIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBGSVhNRTogQ0dFTl9GSUVMRFMgaXMgYWxyZWFkeSByZWNvcmRlZCwgYnV0IHJlbHlpbmcgb24gdGhhdCBmYWN0Ci0gICAgIGRvZXNuJ3Qgc2VlbSByaWdodC4gIFBlcmhhcHMgYWxsb3cgcGFzc2luZyBmaWVsZHMgbGlrZSB3ZSBkbyBpbnNuLiAgKi8KLSAgLyogRklYTUU6IEFMSUFTIGluc25zIGRvIG5vdCBoYXZlIG9wZXJhbmRzLCBzbyB3ZSB1c2UgdGhpcyBmdW5jdGlvbgotICAgICB0byBmaW5kIHRoZSBlcXVpdmFsZW50IGluc24gYW5kIG92ZXJ3cml0ZSB0aGUgdmFsdWUgc3RvcmVkIGluIG91cgotICAgICBzdHJ1Y3R1cmUuICBXZSBzdGlsbCBuZWVkIHRoZSBvcmlnaW5hbCBpbnNuLCBob3dldmVyLCBzaW5jZSB0aGlzCi0gICAgIG1heSBoYXZlIGNlcnRhaW4gYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgdW5hbGlhc2VkCi0gICAgIHZlcnNpb24gKGVnIHJlbGF4YWJpbGl0eSkuICBXaGVuIGFsaWFzZXMgYmVoYXZlIGRpZmZlcmVudGx5IHRoaXMKLSAgICAgbWF5IGhhdmUgdG8gY2hhbmdlLiAgKi8KLSAgZmlyc3Qub3JpZ19pbnNuID0gZmlyc3QuaW5zbjsKLSAgewotICAgIENHRU5fRklFTERTIHRtcF9maWVsZHM7Ci0gICAgZmlyc3QuaW5zbiA9IGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzCi0gICAgICAoZ2FzX2NnZW5fY3B1X2Rlc2MsIE5VTEwsIElOU05fVkFMVUUgKGZpcnN0LmJ1ZmZlciksIE5VTEwsIDE2LAotICAgICAgIGZpcnN0LmluZGljZXMsICZ0bXBfZmllbGRzKTsKLSAgfQotICAKLSAgaWYgKGZpcnN0Lmluc24gPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I6IGxvb2t1cC9nZXQgb3BlcmFuZHMgZmFpbGVkIikpOwotCi0gIHNlY29uZC5kZWJ1Z19zeW1fbGluayA9IE5VTEw7Ci0KLSAgLyogUGFyc2UgdGhlIHNlY29uZCBpbnN0cnVjdGlvbi4gICovCi0gIGlmICghIChzZWNvbmQuaW5zbiA9IG0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuCi0JIChnYXNfY2dlbl9jcHVfZGVzYywgc3RyLCAmIHNlY29uZC5maWVsZHMsIHNlY29uZC5idWZmZXIsICYgZXJybXNnKSkpCi0gICAgewotICAgICAgYXNfYmFkIChlcnJtc2cpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBDaGVjayBpdC4gICovCi0gIGlmIChDR0VOX0ZJRUxEU19CSVRTSVpFICgmc2Vjb25kLmZpZWxkcykgIT0gMTYpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygibm90IGEgMTYgYml0IGluc3RydWN0aW9uICclcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZW5hYmxlX3NwZWNpYWwKLSAgICAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChzZWNvbmQuaW5zbiwgQ0dFTl9JTlNOX1NQRUNJQUwpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oInVua25vd24gaW5zdHJ1Y3Rpb24gJyVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAoISBlbmFibGVfbTMycngKLSAgICAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChzZWNvbmQuaW5zbiwgQ0dFTl9JTlNOX01BQ0gpID09ICgxIDw8IE1BQ0hfTTMyUlgpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oImluc3RydWN0aW9uICclcycgaXMgZm9yIHRoZSBNMzJSWCBvbmx5IiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGFsbG93YWJsZSBwYXJhbGxlbCBpbnNuLiAgKi8KLSAgaWYgKHBhcmFsbGVsX3AgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKHNlY29uZC5pbnNuLCBDR0VOX0lOU05fUElQRSkgPT0gUElQRV9OT05FKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oImluc3RydWN0aW9uICclcycgY2Fubm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGlmIChwYXJhbGxlbF9wICYmICEgZW5hYmxlX20zMnJ4KQotICAgIHsKLSAgICAgIGlmIChDR0VOX0lOU05fTlVNIChmaXJzdC5pbnNuKSAhPSBNMzJSX0lOU05fTk9QCi0JICAmJiBDR0VOX0lOU05fTlVNIChzZWNvbmQuaW5zbikgIT0gTTMyUl9JTlNOX05PUCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgYXNfYmFkIChfKCInJXMnOiBvbmx5IHRoZSBOT1AgaW5zdHJ1Y3Rpb24gY2FuIGJlIGlzc3VlZCBpbiBwYXJhbGxlbCBvbiB0aGUgbTMyciIpLCBzdHIyKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgaW5kaWNlcyBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgc2Vjb25kLm9yaWdfaW5zbiA9IHNlY29uZC5pbnNuOwotICB7Ci0gICAgQ0dFTl9GSUVMRFMgdG1wX2ZpZWxkczsKLSAgICBzZWNvbmQuaW5zbiA9IGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzCi0gICAgICAoZ2FzX2NnZW5fY3B1X2Rlc2MsIE5VTEwsIElOU05fVkFMVUUgKHNlY29uZC5idWZmZXIpLCBOVUxMLCAxNiwKLSAgICAgICBzZWNvbmQuaW5kaWNlcywgJnRtcF9maWVsZHMpOwotICB9Ci0gIAotICBpZiAoc2Vjb25kLmluc24gPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I6IGxvb2t1cC9nZXQgb3BlcmFuZHMgZmFpbGVkIikpOwotCi0gIC8qIFdlIGFzc3VtZSB0aGF0IGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3cml0ZXMgdG8gYSByZWdpc3RlciB0aGF0IGlzCi0gICAgIHJlYWQgYnkgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBpdCBpcyBiZWNhdXNlIHRoZSBwcm9ncmFtbWVyIGludGVuZGVkCi0gICAgIHRoaXMgdG8gaGFwcGVuLCAoYWZ0ZXIgYWxsIHRoZXkgaGF2ZSBleHBsaWNpdGx5IHJlcXVlc3RlZCB0aGF0IHRoZXNlCi0gICAgIHR3byBpbnN0cnVjdGlvbnMgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwpLiAgQWx0aG91Z2ggaWYgdGhlIGdsb2JhbAotICAgICB2YXJpYWJsZSB3YXJuX2V4cGxpY2l0X3BhcmFsbGVsX2NvbmZsaWN0cyBpcyB0cnVlIHRoZW4gd2UgZG8gZ2VuZXJhdGUKLSAgICAgYSB3YXJuaW5nIG1lc3NhZ2UuICBTaW1pbGFybHkgd2UgYXNzdW1lIHRoYXQgcGFyYWxsZWwgYnJhbmNoIGFuZCBqdW1wCi0gICAgIGluc3RydWN0aW9ucyBhcmUgZGVsaWJlcmF0ZSBhbmQgc2hvdWxkIG5vdCBwcm9kdWNlIGVycm9ycy4gICovCi0gIAotICBpZiAocGFyYWxsZWxfcCAmJiB3YXJuX2V4cGxpY2l0X3BhcmFsbGVsX2NvbmZsaWN0cykKLSAgICB7Ci0gICAgICBpZiAoZmlyc3Rfd3JpdGVzX3RvX3NlY29uZHNfb3BlcmFuZHMgKCYgZmlyc3QsICYgc2Vjb25kLCBmYWxzZSkpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlhc193YXJuIChfKCIlczogb3V0cHV0IG9mIDFzdCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbiBpbnB1dCB0byAybmQgaW5zdHJ1Y3Rpb24gLSBpcyB0aGlzIGludGVudGlvbmFsID8iKSwgc3RyMik7Ci0gICAgICAKLSAgICAgIGlmIChmaXJzdF93cml0ZXNfdG9fc2Vjb25kc19vcGVyYW5kcyAoJiBzZWNvbmQsICYgZmlyc3QsIGZhbHNlKSkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCWFzX3dhcm4gKF8oIiVzOiBvdXRwdXQgb2YgMm5kIGluc3RydWN0aW9uIGlzIHRoZSBzYW1lIGFzIGFuIGlucHV0IHRvIDFzdCBpbnN0cnVjdGlvbiAtIGlzIHRoaXMgaW50ZW50aW9uYWwgPyIpLCBzdHIyKTsKLSAgICB9Ci0gICAgICAKLSAgaWYgKCFwYXJhbGxlbF9wCi0gICAgICB8fCAoZXJybXNnID0gKGNoYXIgKikgY2FuX21ha2VfcGFyYWxsZWwgKCYgZmlyc3QsICYgc2Vjb25kKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIGZpeHVwcyBmb3IgdGhlIGZpcnN0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGdhc19jZ2VuX3N3YXBfZml4dXBzICgpOwotCi0gICAgICAvKiBXcml0ZSBpdCBvdXQuICAqLwotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKGZpcnN0LmRlYnVnX3N5bV9saW5rLCAxKTsKLSAgICAgIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChmaXJzdC5vcmlnX2luc24sIGZpcnN0LmJ1ZmZlciwKLQkJCSAgICBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIGZpcnN0LmZpZWxkcyksIDAsIE5VTEwpOwotICAgICAgCi0gICAgICAvKiBGb3JjZSB0aGUgdG9wIGJpdCBvZiB0aGUgc2Vjb25kIGluc24gdG8gYmUgc2V0LiAgKi8KLSAgICAgIGlmIChwYXJhbGxlbF9wKQotCW1ha2VfcGFyYWxsZWwgKHNlY29uZC5idWZmZXIpOwotCi0gICAgICAvKiBHZXQgaXRzIGZpeHVwcy4gICovCi0gICAgICBnYXNfY2dlbl9yZXN0b3JlX2ZpeHVwcyAoKTsKLQotICAgICAgLyogV3JpdGUgaXQgb3V0LiAgKi8KLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChzZWNvbmQuZGVidWdfc3ltX2xpbmssIDEpOwotICAgICAgZ2FzX2NnZW5fZmluaXNoX2luc24gKHNlY29uZC5vcmlnX2luc24sIHNlY29uZC5idWZmZXIsCi0JCQkgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBzZWNvbmQuZmllbGRzKSwgMCwgTlVMTCk7Ci0gICAgfQotICAvKiBUcnkgc3dhcHBpbmcgdGhlIGluc3RydWN0aW9ucyB0byBzZWUgaWYgdGhleSB3b3JrIHRoYXQgd2F5LiAgKi8KLSAgZWxzZSBpZiAoY2FuX21ha2VfcGFyYWxsZWwgKCYgc2Vjb25kLCAmIGZpcnN0KSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgc2Vjb25kIGluc3RydWN0aW9uIGZpcnN0LiAgKi8KLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChzZWNvbmQuZGVidWdfc3ltX2xpbmssIDEpOwotICAgICAgZ2FzX2NnZW5fZmluaXNoX2luc24gKHNlY29uZC5vcmlnX2luc24sIHNlY29uZC5idWZmZXIsCi0JCQkgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBzZWNvbmQuZmllbGRzKSwgMCwgTlVMTCk7Ci0gICAgICAKLSAgICAgIC8qIEZvcmNlIHRoZSB0b3AgYml0IG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byBiZSBzZXQuICAqLwotICAgICAgbWFrZV9wYXJhbGxlbCAoZmlyc3QuYnVmZmVyKTsKLQotICAgICAgLyogR2V0IHRoZSBmaXh1cHMgZm9yIHRoZSBmaXJzdCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBnYXNfY2dlbl9yZXN0b3JlX2ZpeHVwcyAoKTsKLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoZmlyc3QuZGVidWdfc3ltX2xpbmssIDEpOwotICAgICAgZ2FzX2NnZW5fZmluaXNoX2luc24gKGZpcnN0Lm9yaWdfaW5zbiwgZmlyc3QuYnVmZmVyLAotCQkJICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgZmlyc3QuZmllbGRzKSwgMCwgTlVMTCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkICgiJyVzJzogJXMiLCBzdHIyLCBlcnJtc2cpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgIAotICAvKiBTZXQgdGhlc2Ugc28gbTMycl9maWxsX2luc24gY2FuIHVzZSB0aGVtLiAgKi8KLSAgcHJldl9zZWcgICAgPSBub3dfc2VnOwotICBwcmV2X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIG0zMnJfaW5zbiBpbnNuOwotICBjaGFyICogICAgZXJybXNnOwotICBjaGFyICogICAgc3RyMiA9IE5VTEw7Ci0KLSAgLyogSW5pdGlhbGl6ZSBHQVMncyBjZ2VuIGludGVyZmFjZSBmb3IgYSBuZXcgaW5zdHJ1Y3Rpb24uICAqLwotICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOwotCi0gIC8qIExvb2sgZm9yIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gc2VwZXJhdG9yLiAgKi8KLSAgaWYgKChzdHIyID0gc3Ryc3RyIChzdHIsICJ8fCIpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzc2VtYmxlX3R3b19pbnNucyAoc3RyLCBzdHIyLCAxKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogQWxzbyBsb29rIGZvciBhIHNlcXVlbnRpYWwgaW5zdHJ1Y3Rpb24gc2VwZXJhdG9yLiAgKi8KLSAgaWYgKChzdHIyID0gc3Ryc3RyIChzdHIsICItPiIpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzc2VtYmxlX3R3b19pbnNucyAoc3RyLCBzdHIyLCAwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpbnNuLmRlYnVnX3N5bV9saW5rID0gZGVidWdfc3ltX2xpbms7Ci0gIGRlYnVnX3N5bV9saW5rID0gKHN5bV9saW5rUyAqKTA7Ci0KLSAgaW5zbi5pbnNuID0gbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24KLSAgICAoZ2FzX2NnZW5fY3B1X2Rlc2MsIHN0ciwgJiBpbnNuLmZpZWxkcywgaW5zbi5idWZmZXIsICYgZXJybXNnKTsKLSAgCi0gIGlmICghaW5zbi5pbnNuKQotICAgIHsKLSAgICAgIGFzX2JhZCAoZXJybXNnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCEgZW5hYmxlX3NwZWNpYWwKLSAgICAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLmluc24sIENHRU5fSU5TTl9TUEVDSUFMKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIGluc3RydWN0aW9uICclcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZW5hYmxlX20zMnJ4Ci0JICAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24uaW5zbiwgQ0dFTl9JTlNOX01BQ0gpID09ICgxIDw8IE1BQ0hfTTMyUlgpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oImluc3RydWN0aW9uICclcycgaXMgZm9yIHRoZSBNMzJSWCBvbmx5IiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaWYgKENHRU5fSU5TTl9CSVRTSVpFIChpbnNuLmluc24pID09IDMyKQotICAgIHsKLSAgICAgIC8qIDMyIGJpdCBpbnNucyBtdXN0IGxpdmUgb24gMzIgYml0IGJvdW5kYXJpZXMuICAqLwotICAgICAgaWYgKHByZXZfaW5zbi5pbnNuIHx8IHNlZW5fcmVsYXhhYmxlX3ApCi0JewotCSAgLyogPz8/IElmIGNhbGxpbmcgZmlsbF9pbnNuIHRvbyBtYW55IHRpbWVzIHR1cm5zIHVzIGludG8gYSBtZW1vcnkKLQkgICAgIHBpZywgY2FuIHdlIGNhbGwgYSBmbiB0byBhc3NlbWJsZSBhIG5vcCBpbnN0ZWFkIG9mCi0JICAgICAhc2Vlbl9yZWxheGFibGVfcD8gICovCi0JICBmaWxsX2luc24gKDApOwotCX0KLQotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKGluc24uZGVidWdfc3ltX2xpbmssIDIpOwotCi0gICAgICAvKiBEb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hhdCB3ZSBwYXNzIGZvciBSRUxBWF9QIGhlcmUuICAqLwotICAgICAgZ2FzX2NnZW5fZmluaXNoX2luc24gKGluc24uaW5zbiwgaW5zbi5idWZmZXIsCi0JCQkgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBpbnNuLmZpZWxkcyksIDEsIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBvbl8zMmJpdF9ib3VuZGFyeV9wOwotICAgICAgaW50IHN3YXAgPSBmYWxzZTsKLQotICAgICAgaWYgKENHRU5fSU5TTl9CSVRTSVpFIChpbnNuLmluc24pICE9IDE2KQotCWFib3J0KCk7Ci0KLSAgICAgIGluc24ub3JpZ19pbnNuID0gaW5zbi5pbnNuOwotCi0gICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zbiB3YXMgcmVsYXhhYmxlLCB0aGVuIGl0IG1heSBiZSBleHBhbmRlZAotCSB0byBmaWxsIHRoZSBjdXJyZW50IDE2IGJpdCBzbG90LiAgRW1pdCBhIE5PUCBoZXJlIHRvIG9jY3VweQotCSB0aGlzIHNsb3QsIHNvIHRoYXQgd2UgY2FuIHN0YXJ0IGF0IG9wdGltaXppbmcgYXQgYSAzMiBiaXQKLQkgYm91bmRhcnkuICAqLwotICAgICAgaWYgKHByZXZfaW5zbi5pbnNuICYmIHNlZW5fcmVsYXhhYmxlX3AgJiYgb3B0aW1pemUpCi0JZmlsbF9pbnNuICgwKTsKLSAgICAgIAotICAgICAgaWYgKGVuYWJsZV9tMzJyeCkKLQl7Ci0JICAvKiBHZXQgdGhlIGluZGljZXMgb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBpbnN0cnVjdGlvbi4KLQkgICAgIEZJWE1FOiBTZWUgYXNzZW1ibGVfcGFyYWxsZWwgZm9yIG5vdGVzIG9uIG9yaWdfaW5zbi4gICovCi0JICB7Ci0JICAgIENHRU5fRklFTERTIHRtcF9maWVsZHM7Ci0JICAgIGluc24uaW5zbiA9IGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzCi0JICAgICAgKGdhc19jZ2VuX2NwdV9kZXNjLCBOVUxMLCBJTlNOX1ZBTFVFIChpbnNuLmJ1ZmZlciksIE5VTEwsCi0JICAgICAgIDE2LCBpbnNuLmluZGljZXMsICZ0bXBfZmllbGRzKTsKLQkgIH0KLQkgIAotCSAgaWYgKGluc24uaW5zbiA9PSBOVUxMKQotCSAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I6IGxvb2t1cC9nZXQgb3BlcmFuZHMgZmFpbGVkIikpOwotCX0KLQotICAgICAgLyogQ29tcHV0ZSB3aGV0aGVyIHdlJ3JlIG9uIGEgMzIgYml0IGJvdW5kYXJ5IG9yIG5vdC4KLQkgcHJldl9pbnNuLmluc24gaXMgTlVMTCB3aGVuIHdlJ3JlIG9uIGEgMzIgYml0IGJvdW5kYXJ5LiAgKi8KLSAgICAgIG9uXzMyYml0X2JvdW5kYXJ5X3AgPSBwcmV2X2luc24uaW5zbiA9PSBOVUxMOwotCi0gICAgICAvKiBMb29rIHRvIHNlZSBpZiB0aGlzIGluc3RydWN0aW9uIGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZQotCSBwcmV2aW91cyBpbnN0cnVjdGlvbiB0byBtYWtlIG9uZSwgcGFyYWxsZWwsIDMyIGJpdCBpbnN0cnVjdGlvbi4KLQkgSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIChwb3RlbnRpYWxseSkgY2hhbmdlZCB0aGUgZmxvdyBvZgotCSBwcm9ncmFtIGNvbnRyb2wsIHRoZW4gaXQgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggdGhlIGN1cnJlbnQKLQkgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpcyByZWxheGFibGUsIHRoZW4gaXQKLQkgbWlnaHQgYmUgcmVwbGFjZWQgd2l0aCBhIGxvbmdlciB2ZXJzaW9uLCBzbyB3ZSBjYW5ub3QgY29tYmluZSBpdC4KLQkgQWxzbyBpZiB0aGUgb3V0cHV0IG9mIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyB1c2VkIGFzIGFuCi0JIGlucHV0IHRvIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHRoZW4gaXQgY2Fubm90IGJlIGNvbWJpbmVkLgotCSBPdGhlcndpc2UgY2FsbCBjYW5fbWFrZV9wYXJhbGxlbCgpIHdpdGggYm90aCBvcmRlcmluZ3Mgb2YgdGhlCi0JIGluc3RydWN0aW9ucyB0byBzZWUgaWYgdGhleSBjYW4gYmUgY29tYmluZWQuICAqLwotICAgICAgaWYgKCAgICAgISBvbl8zMmJpdF9ib3VuZGFyeV9wCi0JICAmJiAgIGVuYWJsZV9tMzJyeAotCSAgJiYgICBvcHRpbWl6ZQotCSAgJiYgICBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5vcmlnX2luc24sIENHRU5fSU5TTl9SRUxBWEFCTEUpID09IDAKLQkgICYmICEgd3JpdGVzX3RvX3BjICgmIHByZXZfaW5zbikKLQkgICYmICEgZmlyc3Rfd3JpdGVzX3RvX3NlY29uZHNfb3BlcmFuZHMgKCYgcHJldl9pbnNuLCAmaW5zbiwgZmFsc2UpCi0JICApCi0JewotCSAgaWYgKGNhbl9tYWtlX3BhcmFsbGVsICgmIHByZXZfaW5zbiwgJiBpbnNuKSA9PSBOVUxMKQotCSAgICBtYWtlX3BhcmFsbGVsIChpbnNuLmJ1ZmZlcik7Ci0JICBlbHNlIGlmIChjYW5fbWFrZV9wYXJhbGxlbCAoJiBpbnNuLCAmIHByZXZfaW5zbikgPT0gTlVMTCkKLQkgICAgc3dhcCA9IHRydWU7Ci0JfQotCi0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoaW5zbi5kZWJ1Z19zeW1fbGluaywgMSk7Ci0KLSAgICAgIHsKLQlpbnQgaTsKLQlmaW5pc2hlZF9pbnNuUyBmaTsKLQotCS8qIEVuc3VyZSBlYWNoIHBhaXIgb2YgMTYgYml0IGluc25zIGlzIGluIHRoZSBzYW1lIGZyYWcuICAqLwotCWZyYWdfZ3JvdyAoNCk7Ci0KLQlnYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbi5vcmlnX2luc24sIGluc24uYnVmZmVyLAotCQkJICAgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBpbnNuLmZpZWxkcyksCi0JCQkgICAgICAxIC8qcmVsYXhfcCovLCAmZmkpOwotCWluc24uYWRkciA9IGZpLmFkZHI7Ci0JaW5zbi5mcmFnID0gZmkuZnJhZzsKLQlpbnNuLm51bV9maXh1cHMgPSBmaS5udW1fZml4dXBzOwotCWZvciAoaSA9IDA7IGkgPCBmaS5udW1fZml4dXBzOyArK2kpCi0JICBpbnNuLmZpeHVwc1tpXSA9IGZpLmZpeHVwc1tpXTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN3YXApCi0JewotCSAgaW50IGksdG1wOwotCi0jZGVmaW5lIFNXQVBfQllURVMoYSxiKSB0bXAgPSBhOyBhID0gYjsgYiA9IHRtcAotCi0JICAvKiBTd2FwIHRoZSB0d28gaW5zbnMgKi8KLQkgIFNXQVBfQllURVMgKHByZXZfaW5zbi5hZGRyIFswXSwgaW5zbi5hZGRyIFswXSk7Ci0JICBTV0FQX0JZVEVTIChwcmV2X2luc24uYWRkciBbMV0sIGluc24uYWRkciBbMV0pOwotCi0JICB0YXJnZXRfbWFrZV9wYXJhbGxlbCAoaW5zbi5hZGRyKTsKLQotCSAgLyogU3dhcCBhbnkgcmVsYXhhYmxlIGZyYWdzIHJlY29yZGVkIGZvciB0aGUgdHdvIGluc25zLiAgKi8KLQkgIC8qIEZJWE1FOiBDbGFyaWZ5LiAgcmVsYXhhdGlvbiBwcmVjbHVkZXMgcGFyYWxsZWwgaW5zbnMgKi8KLQkgIGlmIChwcmV2X2luc24uZnJhZy0+ZnJfb3Bjb2RlID09IHByZXZfaW5zbi5hZGRyKQotCSAgICBwcmV2X2luc24uZnJhZy0+ZnJfb3Bjb2RlID0gaW5zbi5hZGRyOwotCSAgZWxzZSBpZiAoaW5zbi5mcmFnLT5mcl9vcGNvZGUgPT0gaW5zbi5hZGRyKQotCSAgICBpbnNuLmZyYWctPmZyX29wY29kZSA9IHByZXZfaW5zbi5hZGRyOwotCi0JICAvKiBVcGRhdGUgdGhlIGFkZHJlc3NlcyBpbiBhbnkgZml4dXBzLgotCSAgICAgTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGVhY2ggaW5zbiBpcyBpbgotCSAgICAgYSBkaWZmZXJlbnQgZnJhZyBhcyB3ZSBlbnN1cmUgdGhleSdyZSBpbiB0aGUgc2FtZSBmcmFnIGFib3ZlLiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCBwcmV2X2luc24ubnVtX2ZpeHVwczsgKytpKQotCSAgICBwcmV2X2luc24uZml4dXBzW2ldLT5meF93aGVyZSArPSAyOwotCSAgZm9yIChpID0gMDsgaSA8IGluc24ubnVtX2ZpeHVwczsgKytpKQotCSAgICBpbnNuLmZpeHVwc1tpXS0+Znhfd2hlcmUgLT0gMjsKLQl9Ci0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSd2ZSBzZWVuIGEgcGFpciBvZiAxNiBiaXQgaW5zbnMuCi0JIHByZXZfaW5zbi5pbnNuIGlzIE5VTEwgd2hlbiB3ZSdyZSBvbiBhIDMyIGJpdCBib3VuZGFyeS4gICovCi0gICAgICBpZiAob25fMzJiaXRfYm91bmRhcnlfcCkKLQlwcmV2X2luc24gPSBpbnNuOwotICAgICAgZWxzZQotCXByZXZfaW5zbi5pbnNuID0gTlVMTDsKLSAgICAgIAotICAgICAgLyogSWYgdGhlIGluc24gbmVlZHMgdGhlIGZvbGxvd2luZyBvbmUgdG8gYmUgb24gYSAzMiBiaXQgYm91bmRhcnkKLQkgKGUuZy4gc3Vicm91dGluZSBjYWxscyksIGZpbGwgdGhpcyBpbnNuJ3Mgc2xvdC4gICovCi0gICAgICBpZiAob25fMzJiaXRfYm91bmRhcnlfcAotCSAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24ub3JpZ19pbnNuLCBDR0VOX0lOU05fRklMTF9TTE9UKSAhPSAwKQotCWZpbGxfaW5zbiAoMCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWxheGFibGUgaW5zbiAoY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBsYXJnZXIgdmVyc2lvbikKLQkgbWFyayB0aGUgZmFjdCBzbyB0aGF0IHdlIGNhbiBlbWl0IGFuIGFsaWdubWVudCBkaXJlY3RpdmUgZm9yIGEKLQkgZm9sbG93aW5nIDMyIGJpdCBpbnNuIGlmIHdlIHNlZSBvbmUuICAgKi8KLSAgICAgIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5vcmlnX2luc24sIENHRU5fSU5TTl9SRUxBWEFCTEUpICE9IDApCi0Jc2Vlbl9yZWxheGFibGVfcCA9IDE7Ci0gICAgfQotCi0gIC8qIFNldCB0aGVzZSBzbyBtMzJyX2ZpbGxfaW5zbiBjYW4gdXNlIHRoZW0uICAqLwotICBwcmV2X3NlZyAgICA9IG5vd19zZWc7Ci0gIHByZXZfc3Vic2VnID0gbm93X3N1YnNlZzsKLX0KLQotLyogVGhlIHN5bnRheCBpbiB0aGUgbWFudWFsIHNheXMgY29uc3RhbnRzIGJlZ2luIHdpdGggJyMnLgotICAgV2UganVzdCBpZ25vcmUgaXQuICAqLwotCi12b2lkIAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgIH0KLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUICAgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKiBuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIC5zY29tbSBwc2V1ZG8tb3AgaGFuZGxlci4KLQotICAgVGhpcyBpcyBhIG5ldyBwc2V1ZG8tb3AgdG8gaGFuZGxlIHB1dHRpbmcgb2JqZWN0cyBpbiAuc2NvbW1vbi4KLSAgIEJ5IGRvaW5nIHRoaXMgdGhlIGxpbmtlciB3b24ndCBuZWVkIHRvIGRvIGFueSB3b3JrIGFuZCBtb3JlIGltcG9ydGFudGx5Ci0gICBpdCByZW1vdmVzIHRoZSBpbXBsaWNpdCAtRyBhcmcgbmVjZXNzYXJ5IHRvIGNvcnJlY3RseSBsaW5rIHRoZSBvYmplY3QgZmlsZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1tMzJyX3Njb21tIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKiAgICBuYW1lOwotICByZWdpc3RlciBjaGFyICAgICAgYzsKLSAgcmVnaXN0ZXIgY2hhciAqICAgIHA7Ci0gIG9mZnNldFQgICAgICAgICAgICBzaXplOwotICByZWdpc3RlciBzeW1ib2xTICogc3ltYm9sUDsKLSAgb2Zmc2V0VCAgICAgICAgICAgIGFsaWduOwotICBpbnQgICAgICAgICAgICAgICAgYWxpZ24yOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKiBwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciArKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgoc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX3dhcm4gKF8oIi5TQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSBzaXplKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAuc2NvbW0gaXMgdGhlIGFsaWdubWVudC4gICovCi0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYWxpZ24gPSA4OwotICBlbHNlCi0gICAgewotICAgICAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChhbGlnbiA8PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oImlnbm9yaW5nIGJhZCBhbGlnbm1lbnQiKSk7Ci0JICBhbGlnbiA9IDg7Ci0JfQotICAgIH0KLSAgLyogQ29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50LiAgKi8KLSAgaWYgKGFsaWduKQotICAgIHsKLSAgICAgIGZvciAoYWxpZ24yID0gMDsgKGFsaWduICYgMSkgPT0gMDsgYWxpZ24gPj49IDEsICsrIGFsaWduMikKLQljb250aW51ZTsKLSAgICAgIGlmIChhbGlnbiAhPSAxKQotCXsKLQkgIGFzX2JhZCAoXygiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgYWxpZ24yID0gMDsKLQotICAqIHAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICogcCA9IGM7Ci0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAmJiBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgc2l6ZSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJMZW5ndGggb2YgLnNjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCSAgICAgIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JICAgICAgKGxvbmcpIHNpemUpOwotCi0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCkKLSAgICB7Ci0gICAgICBzZWdUICAgb2xkX3NlYyAgICA9IG5vd19zZWc7Ci0gICAgICBpbnQgICAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gICAgICBjaGFyICogcGZyYWc7Ci0KLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHNic3Nfc2VjdGlvbiwgYWxpZ24yKTsKLSAgICAgIHN1YnNlZ19zZXQgKHNic3Nfc2VjdGlvbiwgMCk7Ci0gICAgICAKLSAgICAgIGlmIChhbGlnbjIpCi0JZnJhZ19hbGlnbiAoYWxpZ24yLCAwLCAwKTsKLSAgICAgIAotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHNic3Nfc2VjdGlvbikKLQlzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotICAgICAgCi0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLSAgICAgIAotICAgICAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLCBzaXplLAotCQkJKGNoYXIgKikgMCk7Ci0gICAgICAqIHBmcmFnID0gMDsKLSAgICAgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2Jzc19zZWN0aW9uKTsKLSAgICAgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotICAgICAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOwotICAgICAgU19TRVRfQUxJR04gKHN5bWJvbFAsIGFsaWduMik7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCAmIHNjb21fc2VjdGlvbik7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBJbnRlcmZhY2UgdG8gcmVsYXhfc2VnbWVudC4gICovCi0KLS8qIEZJWE1FOiBCdWlsZCB0YWJsZSBieSBoYW5kLCBnZXQgaXQgd29ya2luZywgdGhlbiBtYWNoaW5lIGdlbmVyYXRlLiAgKi8KLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0vKiBUaGUgZmllbGRzIGFyZToKLSAgIDEpIG1vc3QgcG9zaXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgIDIpIG1vc3QgbmVnYXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgIDMpIGhvdyBtYW55IGJ5dGVzIHRoaXMgbW9kZSB3aWxsIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBmcmFnCi0gICA0KSB3aGljaCBpbmRleCBpbnRvIHRoZSB0YWJsZSB0byB0cnkgaWYgd2UgY2FuJ3QgZml0IGludG8gdGhpcyBvbmUuICAqLwotCi0gIC8qIFRoZSBmaXJzdCBlbnRyeSBtdXN0IGJlIHVudXNlZCBiZWNhdXNlIGFuIGBybHhfbW9yZScgdmFsdWUgb2YgemVybyBlbmRzCi0gICAgIGVhY2ggbGlzdC4gICovCi0gIHsxLCAxLCAwLCAwfSwKLQotICAvKiBUaGUgZGlzcGxhY2VtZW50IHVzZWQgYnkgR0FTIGlzIGZyb20gdGhlIGVuZCBvZiB0aGUgMiBieXRlIGluc24sCi0gICAgIHNvIHdlIHN1YnRyYWN0IDIgZnJvbSB0aGUgZm9sbG93aW5nLiAgKi8KLSAgLyogMTYgYml0IGluc24sIDggYml0IGRpc3AgLT4gMTAgYml0IHJhbmdlLgotICAgICBUaGlzIGRvZXNuJ3QgaGFuZGxlIGEgYnJhbmNoIGluIHRoZSByaWdodCBzbG90IGF0IHRoZSBib3JkZXI6Ci0gICAgIHRoZSAiJiAtNCIgaXNuJ3QgdGFrZW4gaW50byBhY2NvdW50LiAgSXQncyBub3QgaW1wb3J0YW50IGVub3VnaCB0bwotICAgICBjb21wbGljYXRlIHRoaW5ncyBvdmVyIGl0LCBzbyB3ZSBzdWJ0cmFjdCBhbiBleHRyYSAyIChvciArIDIgaW4gLXZlCi0gICAgIGNhc2UpLiAgKi8KLSAgezUxMSAtIDIgLSAyLCAtNTEyIC0gMiArIDIsIDAsIDIgfSwKLSAgLyogMzIgYml0IGluc24sIDI0IGJpdCBkaXNwIC0+IDI2IGJpdCByYW5nZS4gICovCi0gIHsweDIwMDAwMDAgLSAxIC0gMiwgLTB4MjAwMDAwMCAtIDIsIDIsIDAgfSwKLSAgLyogU2FtZSB0aGluZywgYnV0IHdpdGggbGVhZGluZyBub3AgZm9yIGFsaWdubWVudC4gICovCi0gIHsweDIwMDAwMDAgLSAxIC0gMiwgLTB4MjAwMDAwMCAtIDIsIDQsIDAgfQotfTsKLQotbG9uZwotbTMycl9yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCkKLSAgICAgZnJhZ1MgKiBmcmFnUDsKLSAgICAgbG9uZyAgICBzdHJldGNoOwotewotICAvKiBBZGRyZXNzIG9mIGJyYW5jaCBpbnNuLiAgKi8KLSAgbG9uZyBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4IC0gMjsKLSAgbG9uZyBncm93dGggPSAwOwotCi0gIC8qIEtlZXAgMzIgYml0IGluc25zIGFsaWduZWQgb24gMzIgYml0IGJvdW5kYXJpZXMuICAqLwotICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMikKLSAgICB7Ci0gICAgICBpZiAoKGFkZHJlc3MgJiAzKSAhPSAwKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMzsKLQkgIGdyb3d0aCA9IDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBpZiAoKGFkZHJlc3MgJiAzKSA9PSAwKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMjsKLQkgIGdyb3d0aCA9IC0yOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBncm93dGggPSByZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCk7Ci0KLSAgICAgIC8qIExvbmcganVtcCBvbiBvZGQgaGFsZndvcmQgYm91bmRhcnk/ICAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIgJiYgKGFkZHJlc3MgJiAzKSAhPSAwKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMzsKLQkgIGdyb3d0aCArPSAyOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGdyb3d0aDsKLX0KLQotLyogUmV0dXJuIGFuIGluaXRpYWwgZ3Vlc3Mgb2YgdGhlIGxlbmd0aCBieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0bwotICAgaG9sZCBhIGJyYW5jaCB0byByZWFjaCBpdHMgZGVzdGluYXRpb24uCi0gICBBbHNvIHVwZGF0ZXMgZnJfdHlwZS9mcl9zdWJ0eXBlIGFzIG5lY2Vzc2FyeS4KLQotICAgQ2FsbGVkIGp1c3QgYmVmb3JlIGRvaW5nIHJlbGF4YXRpb24uCi0gICBBbnkgc3ltYm9sIHRoYXQgaXMgbm93IHVuZGVmaW5lZCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZC4KLSAgIFRoZSBndWVzcyBmb3IgZnJfdmFyIGlzIEFDVFVBTExZIHRoZSBncm93dGggYmV5b25kIGZyX2ZpeC4KLSAgIFdoYXRldmVyIHdlIGRvIHRvIGdyb3cgZnJfZml4IG9yIGZyX3ZhciBjb250cmlidXRlcyB0byBvdXIgcmV0dXJuZWQgdmFsdWUuCi0gICBBbHRob3VnaCBpdCBtYXkgbm90IGJlIGV4cGxpY2l0IGluIHRoZSBmcmFnLCBwcmV0ZW5kIGZyX3ZhciBzdGFydHMgd2l0aCBhCi0gICAwIHZhbHVlLiAgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIGZyYWdTICogZnJhZ1A7Ci0gICAgIHNlZ1QgICAgc2VnbWVudDsKLXsKLSAgaW50ICAgIG9sZF9mcl9maXggPSBmcmFnUC0+ZnJfZml4OwotCi0gIC8qIFRoZSBvbmx5IHRoaW5nIHdlIGhhdmUgdG8gaGFuZGxlIGhlcmUgYXJlIHN5bWJvbHMgb3V0c2lkZSBvZiB0aGUKLSAgICAgY3VycmVudCBzZWdtZW50LiAgVGhleSBtYXkgYmUgdW5kZWZpbmVkIG9yIGluIGEgZGlmZmVyZW50IHNlZ21lbnQgaW4KLSAgICAgd2hpY2ggY2FzZSBsaW5rZXIgc2NyaXB0cyBtYXkgcGxhY2UgdGhlbSBhbnl3aGVyZS4KLSAgICAgSG93ZXZlciwgd2UgY2FuJ3QgZmluaXNoIHRoZSBmcmFnbWVudCBoZXJlIGFuZCBlbWl0IHRoZSByZWxvYyBhcyBpbnNuCi0gICAgIGFsaWdubWVudCByZXF1aXJlbWVudHMgbWF5IG1vdmUgdGhlIGluc24gYWJvdXQuICAqLwotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWdtZW50KQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgc2VnbWVudC4KLQkgQ2hhbmdlIHRoZSByZWxheGF0aW9uIHN1YnR5cGUgdG8gdGhlIG1heCBhbGxvd2FibGUgYW5kIGxlYXZlCi0JIGFsbCBmdXJ0aGVyIGhhbmRsaW5nIHRvIG1kX2NvbnZlcnRfZnJhZy4gICovCi0gICAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IDI7Ci0KLSNpZiAwIC8qIENhbid0IHVzZSB0aGlzLCBidXQgbGVhdmUgaW4gZm9yIGlsbHVzdHJhdGlvbi4gICovICAgICAKLSAgICAgIC8qIENoYW5nZSAxNiBiaXQgaW5zbiB0byAzMiBiaXQgaW5zbi4gICovCi0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzBdIHw9IDB4ODA7Ci0KLSAgICAgIC8qIEluY3JlYXNlIGtub3duIChmaXhlZCkgc2l6ZSBvZiBmcmFnbWVudC4gICovCi0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIGl0LiAgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4LCA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxIC8qIHBjcmVsICovLAotCSAgICAgICAvKiBGSVhNRTogQ2FuJ3QgdXNlIGEgcmVhbCBCRkQgcmVsb2MgaGVyZS4KLQkJICBnYXNfY2dlbl9tZF9hcHBseV9maXgzIGNhbid0IGhhbmRsZSBpdC4gICovCi0JICAgICAgIEJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMKTsKLQotICAgICAgLyogTWFyayB0aGlzIGZyYWdtZW50IGFzIGZpbmlzaGVkLiAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotI2Vsc2UKLSAgICAgIHsKLQljb25zdCBDR0VOX0lOU04gKiBpbnNuOwotCWludCAgICAgICAgICAgICAgIGk7Ci0KLQkvKiBVcGRhdGUgdGhlIHJlY29yZGVkIGluc24uCi0JICAgRm9ydHVuYXRlbHkgd2UgZG9uJ3QgaGF2ZSB0byBsb29rIHZlcnkgZmFyLgotCSAgIEZJWE1FOiBDaGFuZ2UgdGhpcyB0byByZWNvcmQgaW4gdGhlIGluc3RydWN0aW9uIHRoZSBuZXh0IGhpZ2hlcgotCSAgIHJlbGF4YWJsZSBpbnNuIHRvIHVzZS4gICovCi0JZm9yIChpID0gMCwgaW5zbiA9IGZyYWdQLT5mcl9jZ2VuLmluc247IGkgPCA0OyBpKyssIGluc24rKykKLQkgIHsKLQkgICAgaWYgKChzdHJjbXAgKENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbiksCi0JCQkgQ0dFTl9JTlNOX01ORU1PTklDIChmcmFnUC0+ZnJfY2dlbi5pbnNuKSkKLQkJID09IDApCi0JCSYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpKQotCSAgICAgIGJyZWFrOwotCSAgfQotCWlmIChpID09IDQpCi0JICBhYm9ydCAoKTsKLQotCWZyYWdQLT5mcl9jZ2VuLmluc24gPSBpbnNuOwotCXJldHVybiAyOwotICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiAoZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZnJfZml4KTsKLX0gCi0KLS8qICpmcmFnUCBoYXMgYmVlbiByZWxheGVkIHRvIGl0cyBmaW5hbCBzaXplLCBhbmQgbm93IG5lZWRzIHRvIGhhdmUKLSAgIHRoZSBieXRlcyBpbnNpZGUgaXQgbW9kaWZpZWQgdG8gY29uZm9ybSB0byB0aGUgbmV3IHNpemUuCi0KLSAgIENhbGxlZCBhZnRlciByZWxheGF0aW9uIGlzIGZpbmlzaGVkLgotICAgZnJhZ1AtPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gICBmcmFnUC0+ZnJfc3VidHlwZSBpcyB0aGUgc3VidHlwZSBvZiB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uICAqLwotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqICAgYWJmZDsKLSAgc2VnVCAgICBzZWM7Ci0gIGZyYWdTICogZnJhZ1A7Ci17Ci0gIGNoYXIgKiBvcGNvZGU7Ci0gIGNoYXIgKiBkaXNwbGFjZW1lbnQ7Ci0gIGludCAgICB0YXJnZXRfYWRkcmVzczsKLSAgaW50ICAgIG9wY29kZV9hZGRyZXNzOwotICBpbnQgICAgZXh0ZW5zaW9uOwotICBpbnQgICAgYWRkZW5kOwotCi0gIG9wY29kZSA9IGZyYWdQLT5mcl9vcGNvZGU7Ci0KLSAgLyogQWRkcmVzcyBvcGNvZGUgcmVzaWRlcyBhdCBpbiBmaWxlIHNwYWNlLiAgKi8KLSAgb3Bjb2RlX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggLSAyOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgMSA6Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIgOgotICAgICAgb3Bjb2RlWzBdIHw9IDB4ODA7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMgOgotICAgICAgb3Bjb2RlWzJdID0gb3Bjb2RlWzBdIHwgMHg4MDsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAob3Bjb2RlLCBQQVJfTk9QX0lOU04sIDIpOwotICAgICAgb3Bjb2RlX2FkZHJlc3MgKz0gMjsKLSAgICAgIGV4dGVuc2lvbiA9IDQ7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVszXTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWMpCi0gICAgewotICAgICAgLyogc3ltYm9sIG11c3QgYmUgcmVzb2x2ZWQgYnkgbGlua2VyICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX29mZnNldCAmIDMpCi0JYXNfd2FybiAoXygiQWRkZW5kIHRvIHVucmVzb2x2ZWQgc3ltYm9sIG5vdCBvbiB3b3JkIGJvdW5kYXJ5LiIpKTsKLSAgICAgIGFkZGVuZCA9IGZyYWdQLT5mcl9vZmZzZXQgPj4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBZGRyZXNzIHdlIHdhbnQgdG8gcmVhY2ggaW4gZmlsZSBzcGFjZS4gICovCi0gICAgICB0YXJnZXRfYWRkcmVzcyA9IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArIGZyYWdQLT5mcl9vZmZzZXQ7Ci0gICAgICB0YXJnZXRfYWRkcmVzcyArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotICAgICAgYWRkZW5kID0gKHRhcmdldF9hZGRyZXNzIC0gKG9wY29kZV9hZGRyZXNzICYgLTQpKSA+PiAyOwotICAgIH0KLQotICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBzeW1ib2xzIHRoYXQgbXVzdCBiZSByZXNvbHZlZCBieSB0aGUgbGlua2VyLgotICAgICBPdGhlcndpc2Ugb3V0cHV0IHRoZSBjb21wbGV0ZWQgaW5zbi4gICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlYykKLSAgICB7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9zdWJ0eXBlICE9IDEpOwotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfY2dlbi5pbnNuICE9IDApOwotICAgICAgZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwIChmcmFnUCwKLQkJCSAgICAgLyogT2Zmc2V0IG9mIGJyYW5jaCBpbnNuIGluIGZyYWcuICAqLwotCQkJICAgICBmcmFnUC0+ZnJfZml4ICsgZXh0ZW5zaW9uIC0gNCwKLQkJCSAgICAgZnJhZ1AtPmZyX2NnZW4uaW5zbiwKLQkJCSAgICAgNCAvKmxlbmd0aCovLAotCQkJICAgICAvKiBGSVhNRTogcXVpY2sgaGFjayAqLwotI2lmIDAKLQkJCSAgICAgY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0gKGdhc19jZ2VuX2NwdV9kZXNjLAotCQkJCQkJCSBmcmFnUC0+ZnJfY2dlbi5vcGluZGV4KSwKLSNlbHNlCi0JCQkgICAgIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChnYXNfY2dlbl9jcHVfZGVzYywKLQkJCQkJCQkgTTMyUl9PUEVSQU5EX0RJU1AyNCksCi0jZW5kaWYKLQkJCSAgICAgZnJhZ1AtPmZyX2NnZW4ub3BpbmZvLAotCQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0KTsKLSAgICB9Ci0KLSNkZWZpbmUgU0laRV9GUk9NX1JFTEFYX1NUQVRFKG4pICgobikgPT0gMSA/IDEgOiAzKQotCi0gIG1kX251bWJlcl90b19jaGFycyAoZGlzcGxhY2VtZW50LCAodmFsdWVUKSBhZGRlbmQsCi0JCSAgICAgIFNJWkVfRlJPTV9SRUxBWF9TVEFURSAoZnJhZ1AtPmZyX3N1YnR5cGUpKTsKLQotICBmcmFnUC0+ZnJfZml4ICs9IGV4dGVuc2lvbjsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeFAsIHNlYykKLSAgICAgZml4UyAqIGZpeFA7Ci0gICAgIHNlZ1QgICBzZWM7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAoISBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgfHwgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlYykpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgKG9yIGlzIGRlZmluZWQgYnV0IG5vdCBpbiB0aGlzIHNlY3Rpb24pLgotCSBMZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSkgJiAtNEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgYmZkIHJlbG9jIHR5cGUgZm9yIE9QRVJBTkQgb2YgSU5TTiBhdCBmaXh1cCBGSVhQLgotICAgUmV0dXJucyBCRkRfUkVMT0NfTk9ORSBpZiBubyByZWxvYyB0eXBlIGNhbiBiZSBmb3VuZC4KLSAgICpGSVhQIG1heSBiZSBtb2RpZmllZCBpZiBkZXNpcmVkLiAgKi8KLQotYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1tZF9jZ2VuX2xvb2t1cF9yZWxvYyAoaW5zbiwgb3BlcmFuZCwgZml4UCkKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogICAgaW5zbjsKLSAgICAgY29uc3QgQ0dFTl9PUEVSQU5EICogb3BlcmFuZDsKLSAgICAgZml4UyAqICAgICAgICAgICAgICAgZml4UDsKLXsKLSAgc3dpdGNoIChvcGVyYW5kLT50eXBlKQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6IHJldHVybiAgQkZEX1JFTE9DX00zMlJfMTBfUENSRUw7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDogcmV0dXJuIEJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6IHJldHVybiBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTDsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOiByZXR1cm4gQkZEX1JFTE9DX00zMlJfMjQ7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIC8qIElmIGxvdy9oaWdoL3NoaWdoL3NkYSB3YXMgdXNlZCwgaXQgaXMgcmVjb3JkZWQgaW4gYG9waW5mbycuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2NnZW4ub3BpbmZvICE9IDApCi0JcmV0dXJuIGZpeFAtPmZ4X2NnZW4ub3BpbmZvOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6IC8qIGF2b2lkIC1XYWxsIHdhcm5pbmcgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOwotfQotCi0vKiBSZWNvcmQgYSBISTE2IHJlbG9jIGZvciBsYXRlciBtYXRjaGluZyB3aXRoIGl0cyBMTzE2IGNvdXNpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tMzJyX3JlY29yZF9oaTE2IChyZWxvY190eXBlLCBmaXhQLCBzZWcpCi0gICAgIGludCAgICByZWxvY190eXBlOwotICAgICBmaXhTICogZml4UDsKLSAgICAgc2VnVCAgIHNlZzsKLXsKLSAgc3RydWN0IG0zMnJfaGlfZml4dXAgKiBoaV9maXh1cDsKLQotICBhc3NlcnQgKHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8KLQkgIHx8IHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8pOwotCi0gIGhpX2ZpeHVwID0gKChzdHJ1Y3QgbTMycl9oaV9maXh1cCAqKQotCSAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG0zMnJfaGlfZml4dXApKSk7Ci0gIGhpX2ZpeHVwLT5maXhwID0gZml4UDsKLSAgaGlfZml4dXAtPnNlZyAgPSBub3dfc2VnOwotICBoaV9maXh1cC0+bmV4dCA9IG0zMnJfaGlfZml4dXBfbGlzdDsKLSAgCi0gIG0zMnJfaGlfZml4dXBfbGlzdCA9IGhpX2ZpeHVwOwotfQotCi0vKiBDYWxsZWQgd2hpbGUgcGFyc2luZyBhbiBpbnN0cnVjdGlvbiB0byBjcmVhdGUgYSBmaXh1cC4KLSAgIFdlIG5lZWQgdG8gY2hlY2sgZm9yIEhJMTYgcmVsb2NzIGFuZCBxdWV1ZSB0aGVtIHVwIGZvciBsYXRlciBzb3J0aW5nLiAgKi8KLQotZml4UyAqCi1tMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCAoZnJhZywgd2hlcmUsIGluc24sIGxlbmd0aCwgb3BlcmFuZCwgb3BpbmZvLCBleHApCi0gICAgIGZyYWdTICogICAgICAgICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIHdoZXJlOwotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIG9waW5mbzsKLSAgICAgZXhwcmVzc2lvblMgKiAgICAgICAgZXhwOwotewotICBmaXhTICogZml4UCA9IGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHAgKGZyYWcsIHdoZXJlLCBpbnNuLCBsZW5ndGgsCi0JCQkJCSAgIG9wZXJhbmQsIG9waW5mbywgZXhwKTsKLQotICBzd2l0Y2ggKG9wZXJhbmQtPnR5cGUpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgLyogSWYgbG93L2hpZ2gvc2hpZ2gvc2RhIHdhcyB1c2VkLCBpdCBpcyByZWNvcmRlZCBpbiBgb3BpbmZvJy4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfY2dlbi5vcGluZm8gPT0gQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8KLQkgIHx8IGZpeFAtPmZ4X2NnZW4ub3BpbmZvID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKQotCW0zMnJfcmVjb3JkX2hpMTYgKGZpeFAtPmZ4X2NnZW4ub3BpbmZvLCBmaXhQLCBub3dfc2VnKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOiAvKiBhdm9pZCAtV2FsbCB3YXJuaW5nICovCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpeFA7Ci19Ci0KLS8qIFJldHVybiBCRkQgcmVsb2MgdHlwZSBmcm9tIG9waW5mbyBmaWVsZCBpbiBhIGZpeFMuCi0gICBJdCdzIHRyaWNreSB1c2luZyBmeF9yX3R5cGUgaW4gbTMycl9mcm9iX2ZpbGUgYmVjYXVzZSB0aGUgdmFsdWVzCi0gICBhcmUgQkZEX1JFTE9DX1VOVVNFRCArIG9wZXJhbmQgbnVtYmVyLiAgKi8KLSNkZWZpbmUgRlhfT1BJTkZPX1JfVFlQRShmKSAoKGYpLT5meF9jZ2VuLm9waW5mbykKLQotLyogU29ydCBhbnkgdW5tYXRjaGVkIEhJMTYgcmVsb2NzIHNvIHRoYXQgdGhleSBpbW1lZGlhdGVseSBwcmVjZWRlCi0gICB0aGUgY29ycmVzcG9uZGluZyBMTzE2IHJlbG9jLiAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIG1kX2FwcGx5X2ZpeCBhbmQKLSAgIHRjX2dlbl9yZWxvYy4gICovCi0KLXZvaWQKLW0zMnJfZnJvYl9maWxlICgpCi17Ci0gIHN0cnVjdCBtMzJyX2hpX2ZpeHVwICogbDsKLQotICBmb3IgKGwgPSBtMzJyX2hpX2ZpeHVwX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgc2VnbWVudF9pbmZvX3R5cGUgKiBzZWdpbmZvOwotICAgICAgaW50ICAgICAgICAgICAgICAgICBwYXNzOwotCi0gICAgICBhc3NlcnQgKEZYX09QSU5GT19SX1RZUEUgKGwtPmZpeHApID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCi0JICAgICAgfHwgRlhfT1BJTkZPX1JfVFlQRSAobC0+Zml4cCkgPT0gQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8pOwotCi0gICAgICAvKiBDaGVjayBxdWlja2x5IHdoZXRoZXIgdGhlIG5leHQgZml4dXAgaGFwcGVucyB0byBiZSBhIG1hdGNoaW5nIGxvdy4gICovCi0gICAgICBpZiAobC0+Zml4cC0+ZnhfbmV4dCAhPSBOVUxMCi0JICAmJiBGWF9PUElORk9fUl9UWVBFIChsLT5maXhwLT5meF9uZXh0KSA9PSBCRkRfUkVMT0NfTTMyUl9MTzE2Ci0JICAmJiBsLT5maXhwLT5meF9hZGRzeSA9PSBsLT5maXhwLT5meF9uZXh0LT5meF9hZGRzeQotCSAgJiYgbC0+Zml4cC0+Znhfb2Zmc2V0ID09IGwtPmZpeHAtPmZ4X25leHQtPmZ4X29mZnNldCkKLQljb250aW51ZTsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBmaXh1cHMgZm9yIHRoaXMgc2VnbWVudCBmb3IgYSBtYXRjaGluZyBgbG93Jy4KLSAgICAgICAgIFdoZW4gd2UgZmluZCBvbmUsIG1vdmUgdGhlIGhpZ2gvc2hpZ2gganVzdCBpbiBmcm9udCBvZiBpdC4gIFdlIGRvCi0gICAgICAgICB0aGlzIGluIHR3byBwYXNzZXMuICBJbiB0aGUgZmlyc3QgcGFzcywgd2UgdHJ5IHRvIGZpbmQgYQotICAgICAgICAgdW5pcXVlIGBsb3cnLiAgSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBwZXJtaXQgbXVsdGlwbGUgaGlnaCdzCi0gICAgICAgICByZWxvY3MgZm9yIGEgc2luZ2xlIGBsb3cnLiAgKi8KLSAgICAgIHNlZ2luZm8gPSBzZWdfaW5mbyAobC0+c2VnKTsKLSAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspCi0JewotCSAgZml4UyAqIGY7Ci0JICBmaXhTICogcHJldjsKLQotCSAgcHJldiA9IE5VTEw7Ci0JICBmb3IgKGYgPSBzZWdpbmZvLT5maXhfcm9vdDsgZiAhPSBOVUxMOyBmID0gZi0+ZnhfbmV4dCkKLQkgICAgewotCSAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIGBsb3cnIGZpeHVwIHdoaWNoIG1hdGNoZXMgbC0+Zml4cC4gICovCi0JICAgICAgaWYgKEZYX09QSU5GT19SX1RZUEUgKGYpID09IEJGRF9SRUxPQ19NMzJSX0xPMTYKLQkJICAmJiBmLT5meF9hZGRzeSA9PSBsLT5maXhwLT5meF9hZGRzeQotCQkgICYmIGYtPmZ4X29mZnNldCA9PSBsLT5maXhwLT5meF9vZmZzZXQKLQkJICAmJiAocGFzcyA9PSAxCi0JCSAgICAgIHx8IHByZXYgPT0gTlVMTAotCQkgICAgICB8fCAoRlhfT1BJTkZPX1JfVFlQRSAocHJldikgIT0gQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8KLQkJCSAgJiYgRlhfT1BJTkZPX1JfVFlQRSAocHJldikgIT0gQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8pCi0JCSAgICAgIHx8IHByZXYtPmZ4X2FkZHN5ICE9IGYtPmZ4X2FkZHN5Ci0JCSAgICAgIHx8IHByZXYtPmZ4X29mZnNldCAhPSAgZi0+Znhfb2Zmc2V0KSkKLQkJewotCQkgIGZpeFMgKiogcGY7Ci0KLQkJICAvKiBNb3ZlIGwtPmZpeHAgYmVmb3JlIGYuICAqLwotCQkgIGZvciAocGYgPSAmc2VnaW5mby0+Zml4X3Jvb3Q7Ci0JCSAgICAgICAqIHBmICE9IGwtPmZpeHA7Ci0JCSAgICAgICBwZiA9ICYgKCogcGYpLT5meF9uZXh0KQotCQkgICAgYXNzZXJ0ICgqIHBmICE9IE5VTEwpOwotCi0JCSAgKiBwZiA9IGwtPmZpeHAtPmZ4X25leHQ7Ci0KLQkJICBsLT5maXhwLT5meF9uZXh0ID0gZjsKLQkJICBpZiAocHJldiA9PSBOVUxMKQotCQkgICAgc2VnaW5mby0+Zml4X3Jvb3QgPSBsLT5maXhwOwotCQkgIGVsc2UKLQkJICAgIHByZXYtPmZ4X25leHQgPSBsLT5maXhwOwotCi0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIHByZXYgPSBmOwotCSAgICB9Ci0KLQkgIGlmIChmICE9IE5VTEwpCi0JICAgIGJyZWFrOwotCi0JICBpZiAocGFzcyA9PSAxCi0JICAgICAgJiYgd2Fybl91bm1hdGNoZWRfaGlnaCkKLQkgICAgYXNfd2Fybl93aGVyZSAobC0+Zml4cC0+ZnhfZmlsZSwgbC0+Zml4cC0+ZnhfbGluZSwKLQkJCSAgIF8oIlVubWF0Y2hlZCBoaWdoL3NoaWdoIHJlbG9jIikpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gZm9yY2UgYSByZWxvY2F0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLgotICAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIG91dCBzd2l0Y2ggYW5kIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdoZW4KLSAgIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1tMzJyX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLSAgICAgZml4UyAqIGZpeDsKLXsKLSAgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoISBtMzJyX3JlbGF4KQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAoZml4LT5meF9wY3JlbAotCSAgfHwgMCAvKiA/Pz8gKi8pOwotfQotDAotLyogV3JpdGUgYSB2YWx1ZSBvdXQgdG8gdGhlIG9iamVjdCBmaWxlLCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZW5kaWFubmVzcy4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCAgICBuOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0qLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgICAgICAgICAgICAgIGk7Ci0gIGludCAgICAgICAgICAgICAgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgICB3b3JkcyBbTUFYX0xJVFRMRU5VTVNdOwotICBjaGFyICogICAgICAgICAgIHQ7Ci0gIGNoYXIgKiAgICAgICAgICAgYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAvKiBGSVhNRTogU29tZSB0YXJnZXRzIGFsbG93IG90aGVyIGZvcm1hdCBjaGFycyBmb3IgYmlnZ2VyIHNpemVzIGhlcmUuICAqLwotCi0gICAgZGVmYXVsdDoKLSAgICAgICogc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKiBzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLAotCQkJICAgICAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCSAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCi0JCQkgICAgICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gICAgIAotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKQotewotICAvKiBJZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiBhIHNlY3Rpb24gYW5kIHdlIGhhdmUganVzdCBlbWl0dGVkIGEKLSAgICAgMTYgYml0IGluc24sIHRoZW4gZW1pdCBhIG5vcCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbiBlbmRzIG9uCi0gICAgIGEgMzIgYml0IGJvdW5kYXJ5LiAgKi8KLSAgCi0gIGlmIChwcmV2X2luc24uaW5zbiB8fCBzZWVuX3JlbGF4YWJsZV9wKQotICAgICh2b2lkKSBtMzJyX2ZpbGxfaW5zbiAoMCk7Ci19Ci0KLWJvb2xlYW4KLW0zMnJfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICpmaXhQOwotewotCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY190eXBlOwotIAotICBpZiAoKGludCkgZml4UC0+Znhfcl90eXBlID49IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gTlVMTDsKLSAgICAgIGludCBvcGluZGV4ID0gKGludCkgZml4UC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLSAgICAgIGNvbnN0IENHRU5fT1BFUkFORCAqb3BlcmFuZCA9IGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtKGdhc19jZ2VuX2NwdV9kZXNjLCBvcGluZGV4KTsKLSAgICAgIHJlbG9jX3R5cGUgPSBtZF9jZ2VuX2xvb2t1cF9yZWxvYyAoaW5zbiwgb3BlcmFuZCwgZml4UCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmVsb2NfdHlwZSA9IGZpeFAtPmZ4X3JfdHlwZTsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTMyci5oIGIvZ2FzL2NvbmZpZy90Yy1tMzJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2ZjYTEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogdGMtbTMyci5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1tMzJyLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19NMzJSCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotLyogbGVhZGluZyBzcGFjZSBzbyB3aWxsIGNvbXBpbGUgd2l0aCBjYyAqLwotICNlcnJvciBNMzJSIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIk0zMlIgR0FTICIKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbTMycgotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLW0zMnIiCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLWxvbmcgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCkpOwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oRklYUCwgU0VDKSAgIAotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIC4tZm9vIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogRm9yIDggdnMgMTYgdnMgMzIgYml0IGJyYW5jaCBzZWxlY3Rpb24uICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLSNpZiAwCi1leHRlcm4gdm9pZCBtMzJyX3ByZXBhcmVfcmVsYXhfc2NhbiAoKTsKLSNkZWZpbmUgbWRfcHJlcGFyZV9yZWxheF9zY2FuKGZyYWdQLCBhZGRyZXNzLCBhaW0sIHRoaXNfc3RhdGUsIHRoaXNfdHlwZSkgXAotbTMycl9wcmVwYXJlX3JlbGF4X3NjYW4gKGZyYWdQLCBhZGRyZXNzLCBhaW0sIHRoaXNfc3RhdGUsIHRoaXNfdHlwZSkKLSNlbHNlCi1leHRlcm4gbG9uZyBtMzJyX3JlbGF4X2ZyYWcgUEFSQU1TICgoZnJhZ1MgKiwgbG9uZykpOwotI2RlZmluZSBtZF9yZWxheF9mcmFnKGZyYWdQLCBzdHJldGNoKSBcCi1tMzJyX3JlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKQotI2VuZGlmCi0vKiBBY2NvdW50IGZvciBub3AgaWYgMzIgYml0IGluc24gZmFsbHMgb24gb2RkIGhhbGZ3b3JkIGJvdW5kYXJ5LiAgKi8KLSNkZWZpbmUgVENfQ0dFTl9NQVhfUkVMQVgoaW5zbiwgbGVuKSAoNikKLQotLyogQWxpZ25tZW50cyBhcmUgdXNlZCB0byBlbnN1cmUgMzIgYml0IGluc25zIGxpdmUgb24gMzIgYml0IGJvdW5kYXJpZXMsIHNvCi0gICB3ZSB1c2UgYSBzcGVjaWFsIGFsaWdubWVudCBmdW5jdGlvbiB0byBpbnNlcnQgdGhlIGNvcnJlY3Qgbm9wIHBhdHRlcm4uICAqLwotZXh0ZXJuIGludCBtMzJyX2RvX2FsaWduIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotI2RlZmluZSBtZF9kb19hbGlnbihuLCBmaWxsLCBsZW4sIG1heCwgbCkgXAotaWYgKG0zMnJfZG9fYWxpZ24gKG4sIGZpbGwsIGxlbiwgbWF4KSkgZ290byBsCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9hcHBseV9maXgzIGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMKLQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgbTMycl9maXhfYWRqdXN0YWJsZShmaXhQKQotCi0vKiBBZnRlciBjcmVhdGluZyBhIGZpeHVwIGZvciBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kLCB3ZSBuZWVkIHRvIGNoZWNrIGZvcgotICAgSEkxNiByZWxvY3MgYW5kIHF1ZXVlIHRoZW0gdXAgZm9yIGxhdGVyIHNvcnRpbmcuICAqLwotI2RlZmluZSBtZF9jZ2VuX3JlY29yZF9maXh1cF9leHAgbTMycl9jZ2VuX3JlY29yZF9maXh1cF9leHAKLQotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2RlZmluZSB0Y19nZW5fcmVsb2MgZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jCi0KLSNkZWZpbmUgdGNfZnJvYl9maWxlKCkgbTMycl9mcm9iX2ZpbGUgKCkKLWV4dGVybiB2b2lkIG0zMnJfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBlbWl0IHZhcmlvdXMgcmVsb2NzIHdlIG90aGVyd2lzZSB3b3VsZG4ndC4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBtMzJyX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLWV4dGVybiBpbnQgbTMycl9mb3JjZV9yZWxvY2F0aW9uICgpOwotCi0vKiBFbnN1cmUgaW5zbnMgYXQgbGFiZWxzIGFyZSBhbGlnbmVkIHRvIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KLWludCBtMzJyX2ZpbGxfaW5zbiBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgbWRfYWZ0ZXJfcGFzc19ob29rKCkJbTMycl9maWxsX2luc24gKDEpCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoLCBwdHIpCShjaCA9PSAnOicgJiYgbTMycl9maWxsX2luc24gKDApKQotCi0vKiBBZGQgZXh0cmEgTTMyUiBzZWN0aW9ucy4gICovCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLnNkYXRhIiwJCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLSAgeyAiLnNic3MiLAkJU0hUX05PQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sCi0KLSNkZWZpbmUgbWRfY2xlYW51cCAgICAgICAgICAgICAgICAgbTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBtMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi1leHRlcm4gdm9pZCBtMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOyAgICAKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTY4ODUxLmggYi9nYXMvY29uZmlnL3RjLW02ODg1MS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZkNzQxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTY4ODUxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLW02ODg1MS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBwbW11LmgKLSAqLwotCi0vKiBJIHN1cHBvc2Ugd2UgaGF2ZSB0byBjb3B5cmlnaHQgdGhpcyBmaWxlLiAgU29tZW9uZSBvbiB0aGUgbmV0IHNlbnQgaXQKLSAgIHRvIHVzIGFzIHBhcnQgb2YgdGhlIGNoYW5nZXMgZm9yIHRoZSBtNjg4NTEgTWVtb3J5IE1hbmFnZW1lbnQgVW5pdCAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5ODcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdhcywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIFRoZSBHTlUgYXNzZW1ibGVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFkuICBObyBhdXRob3Igb3IgZGlzdHJpYnV0b3IKLSAgIGFjY2VwdHMgcmVzcG9uc2liaWxpdHkgdG8gYW55b25lIGZvciB0aGUgY29uc2VxdWVuY2VzIG9mIHVzaW5nIGl0Ci0gICBvciBmb3Igd2hldGhlciBpdCBzZXJ2ZXMgYW55IHBhcnRpY3VsYXIgcHVycG9zZSBvciB3b3JrcyBhdCBhbGwsCi0gICB1bmxlc3MgaGUgc2F5cyBzbyBpbiB3cml0aW5nLiAgUmVmZXIgdG8gdGhlIEdOVSBBc3NlbWJsZXIgR2VuZXJhbAotICAgUHVibGljIExpY2Vuc2UgZm9yIGZ1bGwgZGV0YWlscy4KLSAgIAotICAgRXZlcnlvbmUgaXMgZ3JhbnRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlCi0gICB0aGUgR05VIEFzc2VtYmxlciwgYnV0IG9ubHkgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZGVzY3JpYmVkIGluIHRoZQotICAgR05VIEFzc2VtYmxlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQSBjb3B5IG9mIHRoaXMgbGljZW5zZSBpcwotICAgc3VwcG9zZWQgdG8gaGF2ZSBiZWVuIGdpdmVuIHRvIHlvdSBhbG9uZyB3aXRoIHRoZSBHTlUgQXNzZW1ibGVyCi0gICBzbyB5b3UgY2FuIGtub3cgeW91ciByaWdodHMgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBJdCBzaG91bGQgYmUKLSAgIGluIGEgZmlsZSBuYW1lZCBDT1BZSU5HLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgY29weXJpZ2h0Ci0gICBub3RpY2UgYW5kIHRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuICAqLwotCi0jaWZkZWYgbTY4ODUxCi0KLS8qCi0gIEkgZGlkbid0IHVzZSBtdWNoIGltYWdpbmF0aW9uIGluIGNob29zaW5nIHRoZSAKLSAgZm9sbG93aW5nIGNvZGVzLCBzbyBtYW55IG9mIHRoZW0gYXJlbid0IHZlcnkKLSAgbW5lbW9uaWMuIC1yYWIKLSAgCi0gIFAgIHBtbXUgcmVnaXN0ZXIKLSAgUG9zc2libGUgdmFsdWVzOgotICAwMDAJVEMJVHJhbnNsYXRpb24gQ29udHJvbCByZWcKLSAgMTAwCUNBTAlDdXJyZW50IEFjY2VzcyBMZXZlbAotICAxMDEJVkFMCVZhbGlkYXRlIEFjY2VzcyBMZXZlbAotICAxMTAJU0NDCVN0YWNrIENoYW5nZSBDb250cm9sCi0gIDExMQlBQwlBY2Nlc3MgQ29udHJvbAotICAKLSAgVyAgd2lkZSBwbW11IHJlZ2lzdGVycwotICBQb3NzaWJsZSB2YWx1ZXM6Ci0gIDAwMQlEUlAJRG1hIFJvb3QgUG9pbnRlcgotICAwMTAJU1JQCVN1cGVydmlzb3IgUm9vdCBQb2ludGVyCi0gIDAxMQlDUlAJQ3B1IFJvb3QgUG9pbnRlcgotICAKLSAgZglmdW5jdGlvbiBjb2RlIHJlZ2lzdGVyCi0gIDAJU0ZDCi0gIDEJREZDCi0gIAotICBWCVZBTCByZWdpc3RlciBvbmx5Ci0gIAotICBYCUJBRHgsIEJBQ3gKLSAgMTAwCUJBRAlCcmVha3BvaW50IEFja25vd2xlZGdlIERhdGEKLSAgMTAxCUJBQwlCcmVha3BvaW50IEFja25vd2xlZGdlIENvbnRyb2wKLSAgCi0gIFkJUFNSCi0gIFoJUENTUgotICAKLSAgfAltZW1vcnkgCQkobW9kZXMgMi02LCA3LiopCi0gIAotICAqLwotCi0vKgotICogdGhlc2UgZGVmaW5lcyBzaG91bGQgYmUgaW4gbTY4ay5jIGJ1dAotICogaSBwdXQgdGhlbSBoZXJlIHRvIGtlZXAgYWxsIHRoZSBtNjg4NTEgc3R1ZmYKLSAqIHRvZ2V0aGVyIC1yYWIKLSAqIEpGLS1NYWtlIHN1cmUgdGhlc2UgI3MgZG9uJ3QgY2xhc2ggd2l0aCB0aGUgb25lcyBpbiBtNjhrLmMKLSAqIFRoYXQgd291bGQgYmUgQkFELgotICovCi0jZGVmaW5lIFRDCShGUFMrMSkJCS8qIDQ4ICovCi0jZGVmaW5lIERSUAkoVEMrMSkJCS8qIDQ5ICovCi0jZGVmaW5lIFNSUAkoRFJQKzEpCQkvKiA1MCAqLwotI2RlZmluZSBDUlAJKFNSUCsxKQkJLyogNTEgKi8KLSNkZWZpbmUgQ0FMCShDUlArMSkJCS8qIDUyICovCi0jZGVmaW5lIFZBTAkoQ0FMKzEpCQkvKiA1MyAqLwotI2RlZmluZSBTQ0MJKFZBTCsxKQkJLyogNTQgKi8KLSNkZWZpbmUgQUMJKFNDQysxKQkJLyogNTUgKi8KLSNkZWZpbmUgQkFECShBQysxKQkJLyogNTYsNTcsNTgsNTksIDYwLDYxLDYyLDYzICovCi0jZGVmaW5lIEJBQwkoQkFEKzgpCQkvKiA2NCw2NSw2Niw2NywgNjgsNjksNzAsNzEgKi8KLSNkZWZpbmUgUFNSCShCQUMrOCkJCS8qIDcyICovCi0jZGVmaW5lIFBDU1IJKFBTUisxKQkJLyogNzMgKi8KLQotLyogbmFtZSAqLwkvKiBvcGNvZGUgKi8JCS8qIG1hdGNoICovCQkvKiBhcmdzICovCi0KLXsicGJhYyIsCW9uZSgweGYwYzcpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJhY3ciLAlvbmUoMHhmMDg3KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYXMiLAlvbmUoMHhmMGM2KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYXN3IiwJb25lKDB4ZjA4NiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmJjIiwJb25lKDB4ZjBjMSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmJjdyIsCW9uZSgweGYwODEpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJicyIsCW9uZSgweGYwYzApLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJic3ciLAlvbmUoMHhmMDgwKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiY2MiLAlvbmUoMHhmMGNmKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiY2N3IiwJb25lKDB4ZjA4ZiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmNzIiwJb25lKDB4ZjBjZSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmNzdyIsCW9uZSgweGYwOGUpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJnYyIsCW9uZSgweGYwY2QpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJnY3ciLAlvbmUoMHhmMDhkKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiZ3MiLAlvbmUoMHhmMGNjKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiZ3N3IiwJb25lKDB4ZjA4YyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmljIiwJb25lKDB4ZjBjYiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmljdyIsCW9uZSgweGYwOGIpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJpcyIsCW9uZSgweGYwY2EpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJpc3ciLAlvbmUoMHhmMDhhKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBibGMiLAlvbmUoMHhmMGMzKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBibGN3IiwJb25lKDB4ZjA4MyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmxzIiwJb25lKDB4ZjBjMiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmxzdyIsCW9uZSgweGYwODIpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJzYyIsCW9uZSgweGYwYzUpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJzY3ciLAlvbmUoMHhmMDg1KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBic3MiLAlvbmUoMHhmMGM0KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBic3N3IiwJb25lKDB4ZjA4NCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYndjIiwJb25lKDB4ZjBjOSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYndjdyIsCW9uZSgweGYwODkpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJ3cyIsCW9uZSgweGYwYzgpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJ3c3ciLAlvbmUoMHhmMDg4KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi0gICAgCi0gICAgCi17InBkYmFjIiwJdHdvKDB4ZjA0OCwgMHgwMDA3KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiYXMiLAl0d28oMHhmMDQ4LCAweDAwMDYpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJiYyIsCXR3bygweGYwNDgsIDB4MDAwMSksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmJzIiwJdHdvKDB4ZjA0OCwgMHgwMDAwKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiY2MiLAl0d28oMHhmMDQ4LCAweDAwMGYpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJjcyIsCXR3bygweGYwNDgsIDB4MDAwZSksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmdjIiwJdHdvKDB4ZjA0OCwgMHgwMDBkKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiZ3MiLAl0d28oMHhmMDQ4LCAweDAwMGMpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJpYyIsCXR3bygweGYwNDgsIDB4MDAwYiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmlzIiwJdHdvKDB4ZjA0OCwgMHgwMDBhKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRibGMiLAl0d28oMHhmMDQ4LCAweDAwMDMpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJscyIsCXR3bygweGYwNDgsIDB4MDAwMiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYnNjIiwJdHdvKDB4ZjA0OCwgMHgwMDA1KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRic3MiLAl0d28oMHhmMDQ4LCAweDAwMDQpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJ3YyIsCXR3bygweGYwNDgsIDB4MDAwOSksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYndzIiwJdHdvKDB4ZjA0OCwgMHgwMDA4KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLSAgICAKLXsicGZsdXNoYSIsCXR3bygweGYwMDAsIDB4MjQwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIiIH0sCi0gICAgCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzAxMCksCXR3bygweGZmYzAsIDB4ZmUxMCksCSJUM1Q5IiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDM4MTApLAl0d28oMHhmZmMwLCAweGZlMTApLAkiVDNUOSZzIiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDMwMDgpLAl0d28oMHhmZmMwLCAweGZlMTgpLAkiRDNUOSIgfSwKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzODA4KSwJdHdvKDB4ZmZjMCwgMHhmZTE4KSwJIkQzVDkmcyIgfSwKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZTFlKSwJImYzVDkiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzgwMCksCXR3bygweGZmYzAsIDB4ZmUxZSksCSJmM1Q5JnMiIH0sCi0gICAgCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MTApLAl0d28oMHhmZmY4LCAweGZlMTApLAkiVDNUOSIgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MwMCksCXR3bygweGZmZjgsIDB4ZmUwMCksCSJUM1Q5JnMiIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MDgpLAl0d28oMHhmZmY4LCAweGZlMTgpLAkiRDNUOSIgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MwOCksCXR3bygweGZmZjgsIDB4ZmUxOCksCSJEM1Q5JnMiIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MDApLAl0d28oMHhmZmY4LCAweGZlMWUpLAkiZjNUOSIgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MwMCksCXR3bygweGZmZjgsIDB4ZmUxZSksCSJmM1Q5JnMifSwKLSAgICAKLXsicGZsdXNociIsCXR3bygweGYwMDAsIDB4YTAwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJ8cyIgfSwKLSAgICAKLXsicGxvYWRyIiwJdHdvKDB4ZjAwMCwgMHgyMjEwKSwJdHdvKDB4ZmZjMCwgMHhmZmYwKSwJIlQzJnMiIH0sCi17InBsb2FkciIsCXR3bygweGYwMDAsIDB4MjIwOCksCXR3bygweGZmYzAsIDB4ZmZmOCksCSJEMyZzIiB9LAoteyJwbG9hZHIiLAl0d28oMHhmMDAwLCAweDIyMDApLAl0d28oMHhmZmMwLCAweGZmZmUpLAkiZjMmcyIgfSwKLXsicGxvYWR3IiwJdHdvKDB4ZjAwMCwgMHgyMDEwKSwJdHdvKDB4ZmZjMCwgMHhmZmYwKSwJIlQzJnMiIH0sCi17InBsb2FkdyIsCXR3bygweGYwMDAsIDB4MjAwOCksCXR3bygweGZmYzAsIDB4ZmZmOCksCSJEMyZzIiB9LAoteyJwbG9hZHciLAl0d28oMHhmMDAwLCAweDIwMDApLAl0d28oMHhmZmMwLCAweGZmZmUpLAkiZjMmcyIgfSwKLSAgICAKLSAgICAvKiBUQywgQ1JQLCBEUlAsIFNSUCwgQ0FMLCBWQUwsIFNDQywgQUMgKi8KLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDQwMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLAkiKnNQOCIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDQyMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLAkiUDglcyIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDQwMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLAkifHNXOCIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDQyMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLAkiVzh+cyIgfSwKLSAgICAKLSAgICAvKiBCQUR4LCBCQUN4ICovCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MjAwKSwJdHdvKDB4ZmZjMCwgMHhlM2UzKSwJIipzWDMiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MDAwKSwJdHdvKDB4ZmZjMCwgMHhlM2UzKSwJIlgzJXMiIH0sCi0gICAgCi0gICAgLyogUFNSLCBQQ1NSICovCi0gICAgLyogeyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NjEwMCksCXR3byhveGZmYzAsIG94ZmZmZiksCSIqc1o4IiB9LCAqLwoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NjAwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSIqc1k4IiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NjIwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJZOCVzIiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NjYwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJaOCVzIiB9LAotICAgIAoteyJwcmVzdG9yZSIsCW9uZSgweGYxNDApLAkJb25lKDB4ZmZjMCksCQkiJnMifSwKLXsicHJlc3RvcmUiLAlvbmUoMHhmMTU4KSwJCW9uZSgweGZmZjgpLAkJIitzIn0sCi17InBzYXZlIiwJb25lKDB4ZjEwMCksCQlvbmUoMHhmZmMwKSwJCSImcyJ9LAoteyJwc2F2ZSIsCW9uZSgweGYxMDApLAkJb25lKDB4ZmZjMCksCQkiK3MifSwKLSAgICAKLXsicHNhYyIsCXR3bygweGYwNDAsIDB4MDAwNyksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2FzIiwJdHdvKDB4ZjA0MCwgMHgwMDA2KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzYmMiLAl0d28oMHhmMDQwLCAweDAwMDEpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNicyIsCXR3bygweGYwNDAsIDB4MDAwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2NjIiwJdHdvKDB4ZjA0MCwgMHgwMDBmKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzY3MiLAl0d28oMHhmMDQwLCAweDAwMGUpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNnYyIsCXR3bygweGYwNDAsIDB4MDAwZCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2dzIiwJdHdvKDB4ZjA0MCwgMHgwMDBjKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzaWMiLAl0d28oMHhmMDQwLCAweDAwMGIpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNpcyIsCXR3bygweGYwNDAsIDB4MDAwYSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2xjIiwJdHdvKDB4ZjA0MCwgMHgwMDAzKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzbHMiLAl0d28oMHhmMDQwLCAweDAwMDIpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNzYyIsCXR3bygweGYwNDAsIDB4MDAwNSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc3NzIiwJdHdvKDB4ZjA0MCwgMHgwMDA0KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzd2MiLAl0d28oMHhmMDQwLCAweDAwMDkpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHN3cyIsCXR3bygweGYwNDAsIDB4MDAwOCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAotICAgIAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgyMTApLAl0d28oMHhmZmMwLCAweGUzZjApLAkiVDMmc1E4IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgzMTApLAl0d28oMHhmZmMwLCAweGUzMTApLAkiVDMmc1E4QTkiIH0sCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODIwOCksCXR3bygweGZmYzAsIDB4ZTNmOCksCSJEMyZzUTgiIH0sCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODMwOCksCXR3bygweGZmYzAsIDB4ZTMxOCksCSJEMyZzUThBOSIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MjAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZlKSwJImYzJnNROCIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MzAwKSwJdHdvKDB4ZmZjMCwgMHhlMzFlKSwJImYzJnNROEE5IiB9LAotICAgIAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgwMTApLAl0d28oMHhmZmMwLCAweGUzZjApLAkiVDMmc1E4IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgxMTApLAl0d28oMHhmZmMwLCAweGUzMTApLAkiVDMmc1E4QTkiIH0sCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODAwOCksCXR3bygweGZmYzAsIDB4ZTNmOCksCSJEMyZzUTgiIH0sCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODEwOCksCXR3bygweGZmYzAsIDB4ZTMxOCksCSJEMyZzUThBOSIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MDAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZlKSwJImYzJnNROCIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MTAwKSwJdHdvKDB4ZmZjMCwgMHhlMzFlKSwJImYzJnNROEE5IiB9LAotICAgIAoteyJwdHJhcGFjdyIsCXR3bygweGYwN2EsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGFjbCIsCXR3bygweGYwN2IsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGFjIiwJdHdvKDB4ZjA3YywgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGFzdyIsCXR3bygweGYwN2EsIDB4MDAwNiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGFzbCIsCXR3bygweGYwN2IsIDB4MDAwNiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGFzIiwJdHdvKDB4ZjA3YywgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGJjdyIsCXR3bygweGYwN2EsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGJjbCIsCXR3bygweGYwN2IsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGJjIiwJdHdvKDB4ZjA3YywgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGJzdyIsCXR3bygweGYwN2EsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGJzbCIsCXR3bygweGYwN2IsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGJzIiwJdHdvKDB4ZjA3YywgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGNjdyIsCXR3bygweGYwN2EsIDB4MDAwZiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGNjbCIsCXR3bygweGYwN2IsIDB4MDAwZiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGNjIiwJdHdvKDB4ZjA3YywgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGNzdyIsCXR3bygweGYwN2EsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGNzbCIsCXR3bygweGYwN2IsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGNzIiwJdHdvKDB4ZjA3YywgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGdjdyIsCXR3bygweGYwN2EsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGdjbCIsCXR3bygweGYwN2IsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGdjIiwJdHdvKDB4ZjA3YywgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGdzdyIsCXR3bygweGYwN2EsIDB4MDAwYyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGdzbCIsCXR3bygweGYwN2IsIDB4MDAwYyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGdzIiwJdHdvKDB4ZjA3YywgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGljdyIsCXR3bygweGYwN2EsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGljbCIsCXR3bygweGYwN2IsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGljIiwJdHdvKDB4ZjA3YywgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGlzdyIsCXR3bygweGYwN2EsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGlzbCIsCXR3bygweGYwN2IsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGlzIiwJdHdvKDB4ZjA3YywgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGxjdyIsCXR3bygweGYwN2EsIDB4MDAwMyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGxjbCIsCXR3bygweGYwN2IsIDB4MDAwMyksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGxjIiwJdHdvKDB4ZjA3YywgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcGxzdyIsCXR3bygweGYwN2EsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcGxzbCIsCXR3bygweGYwN2IsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcGxzIiwJdHdvKDB4ZjA3YywgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcHNjdyIsCXR3bygweGYwN2EsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcHNjbCIsCXR3bygweGYwN2IsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcHNjIiwJdHdvKDB4ZjA3YywgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcHNzdyIsCXR3bygweGYwN2EsIDB4MDAwNCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcHNzbCIsCXR3bygweGYwN2IsIDB4MDAwNCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcHNzIiwJdHdvKDB4ZjA3YywgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcHdjdyIsCXR3bygweGYwN2EsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcHdjbCIsCXR3bygweGYwN2IsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcHdjIiwJdHdvKDB4ZjA3YywgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdHJhcHdzdyIsCXR3bygweGYwN2EsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjdyJ9LAoteyJwdHJhcHdzbCIsCXR3bygweGYwN2IsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksCSIjbCJ9LAoteyJwdHJhcHdzIiwJdHdvKDB4ZjA3YywgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiJ9LAotICAgIAoteyJwdmFsaWQiLAl0d28oMHhmMDAwLCAweDI4MDApLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiVnMmcyJ9LAoteyJwdmFsaWQiLAl0d28oMHhmMDAwLCAweDJjMDApLAl0d28oMHhmZmMwLCAweGZmZjgpLAkiQTMmcyIgfSwKLSAgICAKLSNlbmRpZiAvKiBtNjg4NTEgKi8KLQotLyogZW5kIG9mIHRjLW02ODg1MS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW02OGsuYyBiL2dhcy9jb25maWcvdGMtbTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ5NjY1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEzOCArMCwwIEBACi0vKiB0Yy1tNjhrLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBtNjhrIGZhbWlseQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvbTY4ay5oIgotI2luY2x1ZGUgIm02OGstcGFyc2UuaCIKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpCi0jaW5jbHVkZSAiZWxmL202OGsuaCIKLSNlbmRpZgotCi0vKiBUaGlzIHN0cmluZyBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwuICBUaGUgbWFjcm8KLSAgIHRjX2NvbW1lbnRfY2hhcnMgcG9pbnRzIHRvIHRoaXMuICBXZSB1c2UgdGhpcywgcmF0aGVyIHRoYW4gdGhlCi0gICB1c3VhbCBjb21tZW50X2NoYXJzLCBzbyB0aGF0IHRoZSAtLWJpdHdpc2Utb3Igb3B0aW9uIHdpbGwgd29yay4gICovCi0jaWYgZGVmaW5lZCAoVEVfU1ZSNCkgfHwgZGVmaW5lZCAoVEVfREVMVEEpCi1jb25zdCBjaGFyICptNjhrX2NvbW1lbnRfY2hhcnMgPSAifCMiOwotI2Vsc2UKLWNvbnN0IGNoYXIgKm02OGtfY29tbWVudF9jaGFycyA9ICJ8IjsKLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjKiI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotQ09OU1QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LCBhcwotICAgaW4gIjBmMTIuNDU2IiBvciAiMGQxLjIzNDVlMTIiLiAgKi8KLQotQ09OU1QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYZUVwUCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCi0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi0vKiBBcmUgd2UgdHJ5aW5nIHRvIGdlbmVyYXRlIFBJQyBjb2RlPyAgSWYgc28sIGFic29sdXRlIHJlZmVyZW5jZXMKLSAgIG91Z2h0IHRvIGJlIG1hZGUgaW50byBsaW5rYWdlIHRhYmxlIHJlZmVyZW5jZXMgb3IgcGMtcmVsYXRpdmUKLSAgIHJlZmVyZW5jZXMuICBOb3QgaW1wbGVtZW50ZWQuICBGb3IgRUxGIHRoZXJlIGFyZSBvdGhlciBtZWFucyAKLSAgIHRvIGRlbm90ZSBwaWMgcmVsb2NhdGlvbnMuICAqLwotaW50IGZsYWdfd2FudF9waWM7Ci0KLXN0YXRpYyBpbnQgZmxhZ19zaG9ydF9yZWZzOwkvKiAtbCBvcHRpb24gKi8KLXN0YXRpYyBpbnQgZmxhZ19sb25nX2p1bXBzOwkvKiAtUyBvcHRpb24gKi8KLQotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTAotaW50IGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTDsKLSNlbHNlCi1pbnQgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsOwotI2VuZGlmCi0KLS8qIFdoZXRoZXIgLS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWwgd2FzIHVzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi1zdGF0aWMgaW50IHJlZ19wcmVmaXhfb3B0aW9uYWxfc2VlbjsKLQotLyogVGhlIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIHRvIHVzZSBieSBkZWZhdWx0LiAgKi8KLXN0YXRpYyBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4a19mbG9hdF9jb3BudW0gPSBDT1AxOwotCi0vKiBJZiB0aGlzIGlzIG5vbi16ZXJvLCB0aGVuIHJlZmVyZW5jZXMgdG8gbnVtYmVyKCVwYykgd2lsbCBiZSB0YWtlbgotICAgdG8gcmVmZXIgdG8gbnVtYmVyLCByYXRoZXIgdGhhbiB0byAlcGMgKyBudW1iZXIuICAqLwotc3RhdGljIGludCBtNjhrX2Fic3BjYWRkOwotCi0vKiBJZiB0aGlzIGlzIG5vbi16ZXJvLCB0aGVuIHRoZSBxdWljayBmb3JtcyBvZiB0aGUgbW92ZSwgYWRkLCBhbmQgc3ViCi0gICBpbnN0cnVjdGlvbnMgYXJlIHVzZWQgd2hlbiBwb3NzaWJsZS4gICovCi1zdGF0aWMgaW50IG02OGtfcXVpY2sgPSAxOwotCi0vKiBJZiB0aGlzIGlzIG5vbi16ZXJvLCB0aGVuIGlmIHRoZSBzaXplIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGEgYmFzZQotICAgb3Igb3V0ZXIgZGlzcGxhY2VtZW50LCB0aGUgYXNzZW1ibGVyIGFzc3VtZXMgdGhhdCB0aGUgc2l6ZSBzaG91bGQKLSAgIGJlIDMyIGJpdHMuICAqLwotc3RhdGljIGludCBtNjhrX3JlbDMyID0gMTsKLQotLyogVGhpcyBpcyBub24temVybyBpZiBtNjhrX3JlbDMyIHdhcyBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLXN0YXRpYyBpbnQgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmU7Ci0KLS8qIFRoZSBkZWZhdWx0IHdpZHRoIHRvIHVzZSBmb3IgYW4gaW5kZXggcmVnaXN0ZXIgd2hlbiB1c2luZyBhIGJhc2UKLSAgIGRpc3BsYWNlbWVudC4gICovCi1zdGF0aWMgZW51bSBtNjhrX3NpemUgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0ID0gU0laRV9MT05HOwotCi0vKiBXZSB3YW50IHRvIHdhcm4gaWYgYW55IHRleHQgbGFiZWxzIGFyZSBtaXNhbGlnbmVkLiAgSW4gb3JkZXIgdG8gZ2V0Ci0gICB0aGUgcmlnaHQgbGluZSBudW1iZXIsIHdlIG5lZWQgdG8gcmVjb3JkIHRoZSBsaW5lIG51bWJlciBmb3IgZWFjaAotICAgbGFiZWwuICAqLwotCi1zdHJ1Y3QgbGFiZWxfbGluZQotewotICBzdHJ1Y3QgbGFiZWxfbGluZSAqbmV4dDsKLSAgc3ltYm9sUyAqbGFiZWw7Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICBpbnQgdGV4dDsKLX07Ci0KLS8qIFRoZSBsaXN0IG9mIGxhYmVscy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbGFiZWxfbGluZSAqbGFiZWxzOwotCi0vKiBUaGUgY3VycmVudCBsYWJlbC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbGFiZWxfbGluZSAqY3VycmVudF9sYWJlbDsKLQotLyogSXRzIGFuIGFyYml0cmFyeSBuYW1lOiAgVGhpcyBtZWFucyBJIGRvbid0IGFwcHJvdmUgb2YgaXQgKi8KLS8qIFNlZSBmbGFtZXMgYmVsb3cgKi8KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayByb2J5bjsKLQotI2RlZmluZSBUQUIoeCx5KQkoKCh4KTw8MikrKHkpKQotI2RlZmluZSBUQUJUWVBFKHh5KSAgICAgKCh4eSkgPj4gMikKLSNkZWZpbmUgQllURQkJMAotI2RlZmluZSBTSE9SVAkJMQotI2RlZmluZSBMT05HCQkyCi0jZGVmaW5lIFNaX1VOREVGCTMKLSN1bmRlZiBCUkFOQ0gKLS8qIENhc2UgYGcnIGV4Y2VwdCB3aGVuIEJDQzY4MDAwIGlzIGFwcGxpY2FibGUuICAqLwotI2RlZmluZSBBQlJBTkNICQkxCi0vKiBDb3Byb2Nlc3NvciBicmFuY2hlcy4gICovCi0jZGVmaW5lIEZCUkFOQ0gJCTIKLS8qIE1vZGUgNy4yIC0tIHByb2dyYW0gY291bnRlciBpbmRpcmVjdCB3aXRoICgxNi1iaXQpIGRpc3BsYWNlbWVudCwKLSAgIHN1cHBvcnRlZCBvbiBhbGwgY3B1cy4gIFdpZGVucyB0byAzMi1iaXQgYWJzb2x1dGUuICAqLwotI2RlZmluZSBQQ1JFTAkJMwotLyogRm9yIGluc2VydGluZyBhbiBleHRyYSBqbXAgaW5zdHJ1Y3Rpb24gd2l0aCBsb25nIG9mZnNldCBvbiA2ODAwMCwKLSAgIGZvciBleHBhbmRpbmcgY29uZGl0aW9uYWwgYnJhbmNoZXMuICAoTm90IGJzciBvciBicmEuKSAgU2luY2UgdGhlCi0gICA2ODAwMCBkb2Vzbid0IHN1cHBvcnQgMzItYml0IGRpc3BsYWNlbWVudHMgZm9yIGNvbmRpdGlvbmFsCi0gICBicmFuY2hlcywgd2UgZmFrZSBpdCBieSByZXZlcnNpbmcgdGhlIGNvbmRpdGlvbiBhbmQgYnJhbmNoaW5nCi0gICBhcm91bmQgYSBqbXAgd2l0aCBhbiBhYnNvbHV0ZSBsb25nIG9wZXJhbmQuICAqLwotI2RlZmluZSBCQ0M2ODAwMCAgICAgICAgNAotLyogRm9yIHRoZSBEQmNjICJpbnN0cnVjdGlvbnMiLiAgSWYgdGhlIGRpc3BsYWNlbWVudCByZXF1aXJlcyAzMiBiaXRzLAotICAgdGhlIGJyYW5jaC1hcm91bmQtYS1qdW1wIGdhbWUgaXMgcGxheWVkIGhlcmUgdG9vLiAgKi8KLSNkZWZpbmUgREJDQyAgICAgICAgICAgIDUKLS8qIE5vdCBjdXJyZW50bHkgdXNlZD8gICovCi0jZGVmaW5lIFBDTEVBCQk2Ci0vKiBNb2RlIEFJTkRYIChhcGMtcmVsYXRpdmUpIHVzaW5nIFBDLCB3aXRoIHZhcmlhYmxlIHRhcmdldCwgbWlnaHQgZml0Ci0gICBpbiAxNiBvciA4IGJpdHMuICAqLwotI2RlZmluZSBQQ0lOREVYCQk3Ci0KLXN0cnVjdCBtNjhrX2luY2FudAotICB7Ci0gICAgY29uc3QgY2hhciAqbV9vcGVyYW5kczsKLSAgICB1bnNpZ25lZCBsb25nIG1fb3Bjb2RlOwotICAgIHNob3J0IG1fb3BudW07Ci0gICAgc2hvcnQgbV9jb2RlbnVtOwotICAgIGludCBtX2FyY2g7Ci0gICAgc3RydWN0IG02OGtfaW5jYW50ICptX25leHQ7Ci0gIH07Ci0KLSNkZWZpbmUgZ2V0b25lKHgpCSgoKCh4KS0+bV9vcGNvZGUpPj4xNikmMHhmZmZmKQotI2RlZmluZSBnZXR0d28oeCkJKCgoeCktPm1fb3Bjb2RlKSYweGZmZmYpCi0KLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4MDAwX2NvbnRyb2xfcmVnc1tdID0geyAwIH07Ci1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODAxMF9jb250cm9sX3JlZ3NbXSA9IHsKLSAgU0ZDLCBERkMsIFVTUCwgVkJSLAotICAwCi19Owotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwMjBfY29udHJvbF9yZWdzW10gPSB7Ci0gIFNGQywgREZDLCBVU1AsIFZCUiwgQ0FDUiwgQ0FBUiwgTVNQLCBJU1AsCi0gIDAKLX07Ci1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODA0MF9jb250cm9sX3JlZ3NbXSA9IHsKLSAgU0ZDLCBERkMsIENBQ1IsIFRDLCBJVFQwLCBJVFQxLCBEVFQwLCBEVFQxLAotICBVU1AsIFZCUiwgTVNQLCBJU1AsIE1NVVNSLCBVUlAsIFNSUCwKLSAgMAotfTsKLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4MDYwX2NvbnRyb2xfcmVnc1tdID0gewotICBTRkMsIERGQywgQ0FDUiwgVEMsIElUVDAsIElUVDEsIERUVDAsIERUVDEsIEJVU0NSLAotICBVU1AsIFZCUiwgVVJQLCBTUlAsIFBDUiwKLSAgMAotfTsKLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgbWNmX2NvbnRyb2xfcmVnc1tdID0gewotICBDQUNSLCBUQywgSVRUMCwgSVRUMSwgRFRUMCwgRFRUMSwgVkJSLCBST01CQVIsIAotICBSQU1CQVIwLCBSQU1CQVIxLCBNQkFSLAotICAwCi19OwotI2RlZmluZSBjcHUzMl9jb250cm9sX3JlZ3MgbTY4MDEwX2NvbnRyb2xfcmVncwotCi1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyICpjb250cm9sX3JlZ3M7Ci0KLS8qIGludGVybmFsIGZvcm0gb2YgYSA2ODAyMCBpbnN0cnVjdGlvbiAqLwotc3RydWN0IG02OGtfaXQKLXsKLSAgY29uc3QgY2hhciAqZXJyb3I7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7CQkvKiBsaXN0IG9mIG9wY29kZSBpbmZvICovCi0gIGludCBudW1hcmdzOwotCi0gIGludCBudW1vOwkJCS8qIE51bWJlciBvZiBzaG9ydHMgaW4gb3Bjb2RlICovCi0gIHNob3J0IG9wY29kZVsxMV07Ci0KLSAgc3RydWN0IG02OGtfb3Agb3BlcmFuZHNbNl07Ci0KLSAgaW50IG5leHA7CQkJLyogbnVtYmVyIG9mIGV4cHJzIGluIHVzZSAqLwotICBzdHJ1Y3QgbTY4a19leHAgZXhwcnNbNF07Ci0KLSAgaW50IG5mcmFnOwkJCS8qIE51bWJlciBvZiBmcmFncyB3ZSBoYXZlIHRvIHByb2R1Y2UgKi8KLSAgc3RydWN0Ci0gICAgewotICAgICAgaW50IGZyYWdvZmY7CQkvKiBXaGVyZSBpbiB0aGUgY3VycmVudCBvcGNvZGUgdGhlIGZyYWcgZW5kcyAqLwotICAgICAgc3ltYm9sUyAqZmFkZDsKLSAgICAgIG9mZnNldFQgZm9mZjsKLSAgICAgIGludCBmcmFndHk7Ci0gICAgfQotICBmcmFnYls0XTsKLQotICBpbnQgbnJlbDsJCQkvKiBOdW0gb2YgcmVsb2Mgc3RydWNzIGluIHVzZSAqLwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBpbnQgbjsKLSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICAgIGNoYXIgd2lkOwotICAgICAgY2hhciBwY3JlbDsKLSAgICAgIC8qIEluIGEgcGMgcmVsYXRpdmUgYWRkcmVzcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzCi0JIG9mIHRoZSBvZmZzZXQgYW5kIHRoZSBhZGRyZXNzIHRoYXQgdGhlIG9mZnNldCBpcyByZWxhdGl2ZQotCSB0by4gIFRoaXMgZGVwZW5kcyBvbiB0aGUgYWRkcmVzc2luZyBtb2RlLiAgQmFzaWNhbGx5IHRoaXMKLQkgaXMgdGhlIHZhbHVlIHRvIHB1dCBpbiB0aGUgb2Zmc2V0IGZpZWxkIHRvIGFkZHJlc3MgdGhlCi0JIGZpcnN0IGJ5dGUgb2YgdGhlIG9mZnNldCwgd2l0aG91dCByZWdhcmRpbmcgdGhlIHNwZWNpYWwKLQkgc2lnbmlmaWNhbmNlIG9mIHNvbWUgdmFsdWVzIChpbiB0aGUgYnJhbmNoIGluc3RydWN0aW9uLCBmb3IKLQkgZXhhbXBsZSkuICAqLwotICAgICAgaW50IHBjcmVsX2ZpeDsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICAvKiBXaGV0aGVyIHRoaXMgZXhwcmVzc2lvbiBuZWVkcyBzcGVjaWFsIHBpYyByZWxvY2F0aW9uLCBhbmQgaWYKLQkgc28sIHdoaWNoLiAgKi8KLSAgICAgIGVudW0gcGljX3JlbG9jYXRpb24gcGljX3JlbG9jOwotI2VuZGlmCi0gICAgfQotICByZWxvY1s1XTsJCQkvKiBGaXZlIGlzIGVub3VnaD8/PyAqLwotfTsKLQotI2RlZmluZSBjcHVfb2ZfYXJjaCh4KQkJKCh4KSAmIChtNjgwMDB1cHxtY2YpKQotI2RlZmluZSBmbG9hdF9vZl9hcmNoKHgpCSgoeCkgJiBtZmxvYXQpCi0jZGVmaW5lIG1tdV9vZl9hcmNoKHgpCQkoKHgpICYgbW1tdSkKLSNkZWZpbmUgYXJjaF9jb2xkZmlyZV9wKHgpCSgoKHgpICYgbWNmKSAhPSAwKQotCi0vKiBNYWNyb3MgZm9yIGRldGVybWluaW5nIGlmIGNwdSBzdXBwb3J0cyBhIHNwZWNpZmljIGFkZHJlc3NpbmcgbW9kZSAqLwotI2RlZmluZSBIQVZFX0xPTkdfQlJBTkNIKHgpCSgoeCkgJiAobTY4MDIwfG02ODAzMHxtNjgwNDB8bTY4MDYwfGNwdTMyKSkKLQotc3RhdGljIHN0cnVjdCBtNjhrX2l0IHRoZV9pbnM7CS8qIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBhc3NlbWJsZWQgKi8KLQotI2RlZmluZSBvcChleCkJCSgoZXgpLT5leHAuWF9vcCkKLSNkZWZpbmUgYWRkcyhleCkJKChleCktPmV4cC5YX2FkZF9zeW1ib2wpCi0jZGVmaW5lIHN1YnMoZXgpCSgoZXgpLT5leHAuWF9vcF9zeW1ib2wpCi0jZGVmaW5lIG9mZnMoZXgpCSgoZXgpLT5leHAuWF9hZGRfbnVtYmVyKQotCi0vKiBNYWNyb3MgZm9yIGFkZGluZyB0aGluZ3MgdG8gdGhlIG02OGtfaXQgc3RydWN0ICovCi0KLSNkZWZpbmUgYWRkd29yZCh3KQl0aGVfaW5zLm9wY29kZVt0aGVfaW5zLm51bW8rK109KHcpCi0KLS8qIFN0YXRpYyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZCBpbnNvcCBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCBtNjhrX2luY2FudCAqKSk7Ci1zdGF0aWMgdm9pZCBhZGRfZml4IFBBUkFNUyAoKGludCwgc3RydWN0IG02OGtfZXhwICosIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBhZGRfZnJhZyBQQVJBTVMgKChzeW1ib2xTICosIG9mZnNldFQsIGludCkpOwotCi0vKiBMaWtlIGFkZHdvcmQsIGJ1dCBnb2VzIEJFRk9SRSBnZW5lcmFsIG9wZXJhbmRzICovCi1zdGF0aWMgdm9pZAotaW5zb3AgKHcsIG9wY29kZSkKLSAgICAgaW50IHc7Ci0gICAgIGNvbnN0IHN0cnVjdCBtNjhrX2luY2FudCAqb3Bjb2RlOwotewotICBpbnQgejsKLSAgZm9yKHo9dGhlX2lucy5udW1vO3o+b3Bjb2RlLT5tX2NvZGVudW07LS16KQotICAgIHRoZV9pbnMub3Bjb2RlW3pdPXRoZV9pbnMub3Bjb2RlW3otMV07Ci0gIGZvcih6PTA7ejx0aGVfaW5zLm5yZWw7eisrKQotICAgIHRoZV9pbnMucmVsb2Nbel0ubis9MjsKLSAgZm9yICh6ID0gMDsgeiA8IHRoZV9pbnMubmZyYWc7IHorKykKLSAgICB0aGVfaW5zLmZyYWdiW3pdLmZyYWdvZmYrKzsKLSAgdGhlX2lucy5vcGNvZGVbb3Bjb2RlLT5tX2NvZGVudW1dPXc7Ci0gIHRoZV9pbnMubnVtbysrOwotfQotCi0vKiBUaGUgbnVtbysxIGtsdWRnZSBpcyBzbyB3ZSBjYW4gaGl0IHRoZSBsb3cgb3JkZXIgYnl0ZSBvZiB0aGUgcHJldiB3b3JkLgotICAgQmxlY2NoLiAgKi8KLXN0YXRpYyB2b2lkCi1hZGRfZml4ICh3aWR0aCwgZXhwLCBwY19yZWwsIHBjX2ZpeCkKLSAgICAgaW50IHdpZHRoOwotICAgICBzdHJ1Y3QgbTY4a19leHAgKmV4cDsKLSAgICAgaW50IHBjX3JlbDsKLSAgICAgaW50IHBjX2ZpeDsKLXsKLSAgdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWxdLm4gPSAoKHdpZHRoID09ICdCJyB8fCB3aWR0aCA9PSAnMycpCi0JCQkJICAgPyAodGhlX2lucy5udW1vKjItMSkKLQkJCQkgICA6ICgoKHdpZHRoKT09J2InKQotCQkJCSAgICAgID8gKHRoZV9pbnMubnVtbyoyKzEpCi0JCQkJICAgICAgOiAodGhlX2lucy5udW1vKjIpKSk7Ci0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5leHAgPSBleHAtPmV4cDsKLSAgdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWxdLndpZCA9IHdpZHRoOwotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbF0ucGNyZWxfZml4ID0gcGNfZml4OwotI2lmZGVmIE9CSl9FTEYKLSAgdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWxdLnBpY19yZWxvYyA9IGV4cC0+cGljX3JlbG9jOwotI2VuZGlmCi0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsKytdLnBjcmVsID0gcGNfcmVsOwotfQotCi0vKiBDYXVzZSBhbiBleHRyYSBmcmFnIHRvIGJlIGdlbmVyYXRlZCBoZXJlLCBpbnNlcnRpbmcgdXAgdG8gMTAgYnl0ZXMKLSAgICh0aGF0IHZhbHVlIGlzIGNob3NlbiBpbiB0aGUgZnJhZ192YXIgY2FsbCBpbiBtZF9hc3NlbWJsZSkuICBUWVBFCi0gICBpcyB0aGUgc3VidHlwZSBvZiB0aGUgZnJhZyB0byBiZSBnZW5lcmF0ZWQ7IGl0cyBwcmltYXJ5IHR5cGUgaXMKLSAgIHJzX21hY2hpbmVfZGVwZW5kZW50LgotCi0gICBUaGUgVFlQRSBwYXJhbWV0ZXIgaXMgYWxzbyB1c2VkIGJ5IG1kX2NvbnZlcnRfZnJhZ18xIGFuZAotICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXguICBUaGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBmaXh1cCB3aWxsCi0gICBiZSBlbWl0dGVkIGJ5IG1kX2NvbnZlcnRfZnJhZ18xLgotCi0gICBBREQgYmVjb21lcyB0aGUgRlJfU1lNQk9MIGZpZWxkIG9mIHRoZSBmcmFnLCBhbmQgT0ZGIHRoZSBGUl9PRkZTRVQuICAqLwotc3RhdGljIHZvaWQKLWFkZF9mcmFnIChhZGQsIG9mZiwgdHlwZSkKLSAgICAgc3ltYm9sUyAqYWRkOwotICAgICBvZmZzZXRUIG9mZjsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIHRoZV9pbnMuZnJhZ2JbdGhlX2lucy5uZnJhZ10uZnJhZ29mZj10aGVfaW5zLm51bW87Ci0gIHRoZV9pbnMuZnJhZ2JbdGhlX2lucy5uZnJhZ10uZmFkZD1hZGQ7Ci0gIHRoZV9pbnMuZnJhZ2JbdGhlX2lucy5uZnJhZ10uZm9mZj1vZmY7Ci0gIHRoZV9pbnMuZnJhZ2JbdGhlX2lucy5uZnJhZysrXS5mcmFndHk9dHlwZTsKLX0KLQotI2RlZmluZSBpc3ZhcihleCkgXAotICAob3AgKGV4KSAhPSBPX2NvbnN0YW50ICYmIG9wIChleCkgIT0gT19iaWcpCi0KLXN0YXRpYyBjaGFyICpjcmFja19vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IG02OGtfb3AgKm9wUCkpOwotc3RhdGljIGludCBnZXRfbnVtIFBBUkFNUyAoKHN0cnVjdCBtNjhrX2V4cCAqZXhwLCBpbnQgb2spKTsKLXN0YXRpYyB2b2lkIG02OGtfaXAgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmVnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBzZWxlY3RfY29udHJvbF9yZWdzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGluaXRfcmVndGFibGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCByZXZlcnNlXzE2X2JpdHMgUEFSQU1TICgoaW50IGluKSk7Ci1zdGF0aWMgaW50IHJldmVyc2VfOF9iaXRzIFBBUkFNUyAoKGludCBpbikpOwotc3RhdGljIHZvaWQgaW5zdGFsbF9nZW5fb3BlcmFuZCBQQVJBTVMgKChpbnQgbW9kZSwgaW50IHZhbCkpOwotc3RhdGljIHZvaWQgaW5zdGFsbF9vcGVyYW5kIFBBUkFNUyAoKGludCBtb2RlLCBpbnQgdmFsKSk7Ci1zdGF0aWMgdm9pZCBzX2JzcyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZGF0YTEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2RhdGEyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19ldmVuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbXJpX2NoaXAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc19jaGlwIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19mb3B0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19vcHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3JlZyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfcmVzdG9yZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfc2F2ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX2lmIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfZWxzZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX2VuZGkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9icmVhayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX25leHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9mb3IgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9lbmRmIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfcmVwZWF0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfdW50aWwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV93aGlsZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX2VuZHcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBtZF9hcHBseV9maXhfMiBQQVJBTVMgKChmaXhTICosIG9mZnNldFQpKTsKLXN0YXRpYyB2b2lkIG1kX2NvbnZlcnRfZnJhZ18xIFBBUkFNUyAoKGZyYWdTICopKTsKLQotc3RhdGljIGludCBjdXJyZW50X2FyY2hpdGVjdHVyZTsKLQotc3RydWN0IG02OGtfY3B1IHsKLSAgdW5zaWduZWQgbG9uZyBhcmNoOwotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgYWxpYXM7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG02OGtfY3B1IGFyY2hzW10gPSB7Ci0gIHsgbTY4MDAwLCAiNjgwMDAiLCAwIH0sCi0gIHsgbTY4MDEwLCAiNjgwMTAiLCAwIH0sCi0gIHsgbTY4MDIwLCAiNjgwMjAiLCAwIH0sCi0gIHsgbTY4MDMwLCAiNjgwMzAiLCAwIH0sCi0gIHsgbTY4MDQwLCAiNjgwNDAiLCAwIH0sCi0gIHsgbTY4MDYwLCAiNjgwNjAiLCAwIH0sCi0gIHsgY3B1MzIsICAiY3B1MzIiLCAwIH0sCi0gIHsgbTY4ODgxLCAiNjg4ODEiLCAwIH0sCi0gIHsgbTY4ODUxLCAiNjg4NTEiLCAwIH0sCi0gIHsgbWNmNTIwMCwgIjUyMDAiLCAwIH0sCi0gIHsgbWNmNTIwNmUsICI1MjA2ZSIsIDAgfSwKLSAgeyBtY2Y1MzA3LCAiNTMwNyIsIDB9LAotICAvKiBBbGlhc2VzIChlZmZlY3RpdmVseSwgc28gZmFyIGFzIGdhcyBpcyBjb25jZXJuZWQpIGZvciB0aGUgYWJvdmUKLSAgICAgY3B1cy4gICovCi0gIHsgbTY4MDIwLCAiNjhrIiwgMSB9LAotICB7IG02ODAwMCwgIjY4MDA4IiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzAyIiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzA2IiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzA3IiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzIyIiwgMSB9LAotICB7IG02ODAwMCwgIjY4MzU2IiwgMSB9LAotICB7IG02ODAwMCwgIjY4ZWMwMDAiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjhoYzAwMCIsIDEgfSwKLSAgeyBtNjgwMDAsICI2OGhjMDAxIiwgMSB9LAotICB7IG02ODAyMCwgIjY4ZWMwMjAiLCAxIH0sCi0gIHsgbTY4MDMwLCAiNjhlYzAzMCIsIDEgfSwKLSAgeyBtNjgwNDAsICI2OGVjMDQwIiwgMSB9LAotICB7IG02ODA2MCwgIjY4ZWMwNjAiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzAiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzEiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzIiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzMiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzQiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzMzYiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzNDAiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzNDEiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzNDkiLCAxIH0sCi0gIHsgY3B1MzIsICAiNjgzNjAiLCAxIH0sCi0gIHsgbTY4ODgxLCAiNjg4ODIiLCAxIH0sCi0gIHsgbWNmNTIwMCwgIjUyMDIiLCAxIH0sCi0gIHsgbWNmNTIwMCwgIjUyMDQiLCAxIH0sCi0gIHsgbWNmNTIwMCwgIjUyMDYiLCAxIH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IG5fYXJjaHMgPSBzaXplb2YgKGFyY2hzKSAvIHNpemVvZiAoYXJjaHNbMF0pOwotCi0vKiBCQ0M2ODAwMCBpcyBmb3IgcGF0Y2hpbmcgaW4gYW4gZXh0cmEgam1wIGluc3RydWN0aW9uIGZvciBsb25nIG9mZnNldHMKLSAgIG9uIHRoZSA2ODAwMC4gIFRoZSA2ODAwMCBkb2Vzbid0IHN1cHBvcnQgbG9uZyBicmFuY2hlcyB3aXRoIGJyYW5jaHMgKi8KLQotLyogVGhpcyB0YWJsZSBkZXNyaWJlcyBob3cgeW91IGNoYW5nZSBzaXplcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgdmFyaWFibGUKLSAgIHNpemUgZXhwcmVzc2lvbnMuICBUaGlzIHZlcnNpb24gb25seSBzdXBwb3J0cyB0d28ga2luZHMuICovCi0KLS8qIE5vdGUgdGhhdCBjYWxscyB0byBmcmFnX3ZhciBuZWVkIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gZXhwYW5zaW9uCi0gICBuZWVkZWQ7IHRoaXMgaXMgY3VycmVudGx5IDEwIGJ5dGVzIGZvciBEQkNDLiAgKi8KLQotLyogVGhlIGZpZWxkcyBhcmU6Ci0gICBIb3cgZmFyIEZvcndhcmQgdGhpcyBtb2RlIHdpbGwgcmVhY2g6Ci0gICBIb3cgZmFyIEJhY2t3YXJkIHRoaXMgbW9kZSB3aWxsIHJlYWNoOgotICAgSG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBmcmFnCi0gICBXaGljaCBtb2RlIHRvIGdvIHRvIGlmIHRoZSBvZmZzZXQgd29uJ3QgZml0IGluIHRoaXMgb25lCi0gICAqLwotcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHsxLCAxLCAwLCAwfSwJCQkvKiBGaXJzdCBlbnRyaWVzIGFyZW4ndCB1c2VkICovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBGb3Igbm8gZ29vZCByZWFzb24gZXhjZXB0ICovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB0aGF0IHRoZSBWQVggZG9lc24ndCBlaXRoZXIgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIHsoMTI3KSwgKC0xMjgpLCAwLCBUQUIgKEFCUkFOQ0gsIFNIT1JUKX0sCi0gIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChBQlJBTkNILCBMT05HKX0sCi0gIHswLCAwLCA0LCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBGQlJBTkNIIGRvZXNuJ3QgY29tZSBCWVRFICovCi0gIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChGQlJBTkNILCBMT05HKX0sCi0gIHswLCAwLCA0LCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBQQ1JFTCBkb2Vzbid0IGNvbWUgQllURSAqLwotICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoUENSRUwsIExPTkcpfSwKLSAgezAsIDAsIDQsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgeygxMjcpLCAoLTEyOCksIDAsIFRBQiAoQkNDNjgwMDAsIFNIT1JUKX0sCi0gIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChCQ0M2ODAwMCwgTE9ORyl9LAotICB7MCwgMCwgNiwgMH0sCQkJLyogam1wIGxvbmcgc3BhY2UgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBEQkNDIGRvZXNuJ3QgY29tZSBCWVRFICovCi0gIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChEQkNDLCBMT05HKX0sCi0gIHswLCAwLCAxMCwgMH0sCQkvKiBicmEvam1wIGxvbmcgc3BhY2UgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiBQQ0xFQSBkb2Vzbid0IGNvbWUgQllURSAqLwotICB7MzI3NjcsIC0zMjc2OCwgMiwgVEFCIChQQ0xFQSwgTE9ORyl9LAotICB7MCwgMCwgNiwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICAvKiBGb3IsIGUuZy4sIGptcCBwY3JlbCBpbmRleGVkLiAgKi8KLSAgezEyNSwgLTEzMCwgMCwgVEFCIChQQ0lOREVYLCBTSE9SVCl9LAotICB7MzI3NjUsIC0zMjc3MCwgMiwgVEFCIChQQ0lOREVYLCBMT05HKX0sCi0gIHswLCAwLCA0LCAwfSwKLSAgezEsIDEsIDAsIDB9LAotfTsKLQotLyogVGhlc2UgYXJlIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwc2V1ZG8tb3BzLiAgVGhlc2UgYXJlIGluY2x1ZGVkIHNvCi0gICB0aGUgYXNzZW1ibGVyIGNhbiB3b3JrIG9uIHRoZSBvdXRwdXQgZnJvbSB0aGUgU1VOIEMgY29tcGlsZXIsIHdoaWNoCi0gICBnZW5lcmF0ZXMgdGhlc2UuCi0gICAqLwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAgICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRhdGExIiwgc19kYXRhMSwgMH0sCi0gIHsiZGF0YTIiLCBzX2RhdGEyLCAwfSwKLSAgeyJic3MiLCBzX2JzcywgMH0sCi0gIHsiZXZlbiIsIHNfZXZlbiwgMH0sCi0gIHsic2tpcCIsIHNfc3BhY2UsIDB9LAotICB7InByb2MiLCBzX3Byb2MsIDB9LAotI2lmIGRlZmluZWQgKFRFX1NVTjMpIHx8IGRlZmluZWQgKE9CSl9FTEYpCi0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwfSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgeyJzd2JlZyIsIHNfaWdub3JlLCAwfSwKLSNlbmRpZgotICB7ImV4dGVuZCIsIGZsb2F0X2NvbnMsICd4J30sCi0gIHsibGRvdWJsZSIsIGZsb2F0X2NvbnMsICd4J30sCi0KLSAgLyogVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGFyZSBzdXBwb3J0ZWQgZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KLSAgeyJjaGlwIiwgc19jaGlwLCAwfSwKLSAgeyJjb21saW5lIiwgc19zcGFjZSwgMX0sCi0gIHsiZm9wdCIsIHNfZm9wdCwgMH0sCi0gIHsibWFzazIiLCBzX2lnbm9yZSwgMH0sCi0gIHsib3B0Iiwgc19vcHQsIDB9LAotICB7InJlZyIsIHNfcmVnLCAwfSwKLSAgeyJyZXN0b3JlIiwgc19yZXN0b3JlLCAwfSwKLSAgeyJzYXZlIiwgc19zYXZlLCAwfSwKLQotICB7ImlmIiwgc19tcmlfaWYsIDB9LAotICB7ImlmLmIiLCBzX21yaV9pZiwgJ2InfSwKLSAgeyJpZi53Iiwgc19tcmlfaWYsICd3J30sCi0gIHsiaWYubCIsIHNfbXJpX2lmLCAnbCd9LAotICB7ImVsc2UiLCBzX21yaV9lbHNlLCAwfSwKLSAgeyJlbHNlLnMiLCBzX21yaV9lbHNlLCAncyd9LAotICB7ImVsc2UubCIsIHNfbXJpX2Vsc2UsICdsJ30sCi0gIHsiZW5kaSIsIHNfbXJpX2VuZGksIDB9LAotICB7ImJyZWFrIiwgc19tcmlfYnJlYWssIDB9LAotICB7ImJyZWFrLnMiLCBzX21yaV9icmVhaywgJ3MnfSwKLSAgeyJicmVhay5sIiwgc19tcmlfYnJlYWssICdsJ30sCi0gIHsibmV4dCIsIHNfbXJpX25leHQsIDB9LAotICB7Im5leHQucyIsIHNfbXJpX25leHQsICdzJ30sCi0gIHsibmV4dC5sIiwgc19tcmlfbmV4dCwgJ2wnfSwKLSAgeyJmb3IiLCBzX21yaV9mb3IsIDB9LAotICB7ImZvci5iIiwgc19tcmlfZm9yLCAnYid9LAotICB7ImZvci53Iiwgc19tcmlfZm9yLCAndyd9LAotICB7ImZvci5sIiwgc19tcmlfZm9yLCAnbCd9LAotICB7ImVuZGYiLCBzX21yaV9lbmRmLCAwfSwKLSAgeyJyZXBlYXQiLCBzX21yaV9yZXBlYXQsIDB9LAotICB7InVudGlsIiwgc19tcmlfdW50aWwsIDB9LAotICB7InVudGlsLmIiLCBzX21yaV91bnRpbCwgJ2InfSwKLSAgeyJ1bnRpbC53Iiwgc19tcmlfdW50aWwsICd3J30sCi0gIHsidW50aWwubCIsIHNfbXJpX3VudGlsLCAnbCd9LAotICB7IndoaWxlIiwgc19tcmlfd2hpbGUsIDB9LAotICB7IndoaWxlLmIiLCBzX21yaV93aGlsZSwgJ2InfSwKLSAgeyJ3aGlsZS53Iiwgc19tcmlfd2hpbGUsICd3J30sCi0gIHsid2hpbGUubCIsIHNfbXJpX3doaWxlLCAnbCd9LAotICB7ImVuZHciLCBzX21yaV9lbmR3LCAwfSwKLQotICB7MCwgMCwgMH0KLX07Ci0KLQotLyogVGhlIG1vdGUgcHNldWRvIG9wcyBhcmUgcHV0IGludG8gdGhlIG9wY29kZSB0YWJsZSwgc2luY2UgdGhleQotICAgZG9uJ3Qgc3RhcnQgd2l0aCBhIC4gdGhleSBsb29rIGxpa2Ugb3Bjb2RlcyB0byBnYXMuCi0gICAqLwotCi0jaWZkZWYgTTY4S0NPRkYKLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotQ09OU1QgcHNldWRvX3R5cGVTIG1vdGVfcHNldWRvX3RhYmxlW10gPQotewotCi0gIHsiZGNsIiwgY29ucywgNH0sCi0gIHsiZGMiLCBjb25zLCAyfSwKLSAgeyJkY3ciLCBjb25zLCAyfSwKLSAgeyJkY2IiLCBjb25zLCAxfSwKLQotICB7ImRzbCIsIHNfc3BhY2UsIDR9LAotICB7ImRzIiwgc19zcGFjZSwgMn0sCi0gIHsiZHN3Iiwgc19zcGFjZSwgMn0sCi0gIHsiZHNiIiwgc19zcGFjZSwgMX0sCi0KLSAgeyJ4ZGVmIiwgc19nbG9ibCwgMH0sCi0jaWZkZWYgT0JKX0VMRgotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCi0jZWxzZQotICB7ImFsaWduIiwgc19hbGlnbl9wdHdvLCAwfSwKLSNlbmRpZgotI2lmZGVmIE02OEtDT0ZGCi0gIHsic2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InNlY3Rpb24iLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSNlbmRpZgotICB7MCwgMCwgMH0KLX07Ci0KLSNkZWZpbmUgaXNzYnl0ZSh4KQkoKHgpPj0tMTI4ICYmICh4KTw9MTI3KQotI2RlZmluZSBpc3VieXRlKHgpCSgoeCk+PTAgJiYgKHgpPD0yNTUpCi0jZGVmaW5lIGlzc3dvcmQoeCkJKCh4KT49LTMyNzY4ICYmICh4KTw9MzI3NjcpCi0jZGVmaW5lIGlzdXdvcmQoeCkJKCh4KT49MCAmJiAoeCk8PTY1NTM1KQotCi0jZGVmaW5lIGlzYnl0ZSh4KQkoKHgpPj0gLTI1NSAmJiAoeCk8PTI1NSkKLSNkZWZpbmUgaXN3b3JkKHgpCSgoeCk+PS02NTUzNiAmJiAoeCk8PTY1NTM1KQotI2RlZmluZSBpc2xvbmcoeCkJKDEpCi0KLWV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0KLXN0YXRpYyBjaGFyIG1rbG93ZXJfdGFibGVbMjU2XTsKLSNkZWZpbmUgbWtsb3dlcihjKSAobWtsb3dlcl90YWJsZVsodW5zaWduZWQgY2hhcikoYyldKQotc3RhdGljIGNoYXIgbm90ZW5kX3RhYmxlWzI1Nl07Ci1zdGF0aWMgY2hhciBhbHRfbm90ZW5kX3RhYmxlWzI1Nl07Ci0jZGVmaW5lIG5vdGVuZChzKQkJCQkJCVwKLSAgKCEgKG5vdGVuZF90YWJsZVsodW5zaWduZWQgY2hhcikgKnNdCQkJCVwKLSAgICAgIHx8ICgqcyA9PSAnOicJCQkJCQlcCi0JICAmJiBhbHRfbm90ZW5kX3RhYmxlWyh1bnNpZ25lZCBjaGFyKSBzWzFdXSkpKQotCi0jaWYgZGVmaW5lZCAoTTY4S0NPRkYpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotCi0jaWZkZWYgTk9fUENSRUxfUkVMT0NTCi0KLWludAotbWFrZV9wY3JlbF9hYnNvbHV0ZShmaXhQLCBhZGRfbnVtYmVyKQotICAgIGZpeFMgKmZpeFA7Ci0gICAgbG9uZyAqYWRkX251bWJlcjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3Bjb2RlID0gZml4UC0+ZnhfZnJhZy0+ZnJfb3Bjb2RlOwotCi0gIC8qIHJld3JpdGUgdGhlIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyB0byBhYnNvbHV0ZSBhZGRyZXNzIG9uZXMuCi0gICAqIHRoZXNlIGFyZSBydW1vdXJlZCB0byBiZSBmYXN0ZXIsIGFuZCB0aGUgYXBvbGxvIGxpbmtlciByZWZ1c2VzCi0gICAqIHRvIGRlYWwgd2l0aCB0aGUgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0gICAqLwotICBpZiAob3Bjb2RlWzBdID09IDB4NjAgJiYgb3Bjb2RlWzFdID09IDB4ZmYpIC8qIEJSQSAtPiBKTVAgKi8KLSAgICB7Ci0gICAgICBvcGNvZGVbMF0gPSAweDRlOwotICAgICAgb3Bjb2RlWzFdID0gMHhmOTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wY29kZVswXSA9PSAweDYxICYmIG9wY29kZVsxXSA9PSAweGZmKSAvKiBCU1IgLT4gSlNSICovCi0gICAgewotICAgICAgb3Bjb2RlWzBdID0gMHg0ZTsKLSAgICAgIG9wY29kZVsxXSA9IDB4Yjk7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfZmF0YWwgKF8oIlVua25vd24gUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24iKSk7Ci0gICphZGRfbnVtYmVyIC09IDQ7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogTk9fUENSRUxfUkVMT0NTICovCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X3RjYml0ICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gUl9SRUxMT05HX05FRzsKLSNpZmRlZiBOT19QQ1JFTF9SRUxPQ1MKLSAga25vdyAoZml4UC0+ZnhfcGNyZWwgPT0gMCk7Ci0gIHJldHVybiAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9SRUxCWVRFCi0JICA6IGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfRElSMTYKLQkgIDogUl9ESVIzMik7Ci0jZWxzZQotICByZXR1cm4gKGZpeFAtPmZ4X3BjcmVsID8KLQkgIChmaXhQLT5meF9zaXplID09IDEgPyBSX1BDUkJZVEUgOgotCSAgIGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfUENSV09SRCA6Ci0JICAgUl9QQ1JMT05HKSA6Ci0JICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9SRUxCWVRFIDoKLQkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1JFTFdPUkQgOgotCSAgIFJfUkVMTE9ORykpOwotI2VuZGlmCi19Ci0KLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBDb21wdXRlIHRoZSByZWxvY2F0aW9uIGNvZGUgZm9yIGEgZml4dXAgb2YgU0laRSBieXRlcywgdXNpbmcgcGMKLSAgIHJlbGF0aXZlIHJlbG9jYXRpb24gaWYgUENSRUwgaXMgbm9uLXplcm8uICBQSUMgc2F5cyB3aGV0aGVyIGEgc3BlY2lhbAotICAgcGljIHJlbG9jYXRpb24gd2FzIHJlcXVlc3RlZC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgZ2V0X3JlbG9jX2NvZGUKLSAgUEFSQU1TICgoaW50LCBpbnQsIGVudW0gcGljX3JlbG9jYXRpb24pKTsKLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotZ2V0X3JlbG9jX2NvZGUgKHNpemUsIHBjcmVsLCBwaWMpCi0gICAgIGludCBzaXplOwotICAgICBpbnQgcGNyZWw7Ci0gICAgIGVudW0gcGljX3JlbG9jYXRpb24gcGljOwotewotICBzd2l0Y2ggKHBpYykKLSAgICB7Ci0gICAgY2FzZSBwaWNfZ290X3BjcmVsOgotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzhfR09UX1BDUkVMOwotCWNhc2UgMjoKLQkgIHJldHVybiBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOwotCWNhc2UgNDoKLQkgIHJldHVybiBCRkRfUkVMT0NfMzJfR09UX1BDUkVMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBwaWNfZ290X29mZjoKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOgotCSAgcmV0dXJuIEJGRF9SRUxPQ184X0dPVE9GRjsKLQljYXNlIDI6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzE2X0dPVE9GRjsKLQljYXNlIDQ6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzMyX0dPVE9GRjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcGljX3BsdF9wY3JlbDoKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOgotCSAgcmV0dXJuIEJGRF9SRUxPQ184X1BMVF9QQ1JFTDsKLQljYXNlIDI6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTDsKLQljYXNlIDQ6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcGljX3BsdF9vZmY6Ci0gICAgICBzd2l0Y2ggKHNpemUpCi0JewotCWNhc2UgMToKLQkgIHJldHVybiBCRkRfUkVMT0NfOF9QTFRPRkY7Ci0JY2FzZSAyOgotCSAgcmV0dXJuIEJGRF9SRUxPQ18xNl9QTFRPRkY7Ci0JY2FzZSA0OgotCSAgcmV0dXJuIEJGRF9SRUxPQ18zMl9QTFRPRkY7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHBpY19ub25lOgotICAgICAgaWYgKHBjcmVsKQotCXsKLQkgIHN3aXRjaCAoc2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDE6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ184X1BDUkVMOwotCSAgICBjYXNlIDI6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgICAgY2FzZSA0OgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChzaXplKQotCSAgICB7Ci0JICAgIGNhc2UgMToKLQkgICAgICByZXR1cm4gQkZEX1JFTE9DXzg7Ci0JICAgIGNhc2UgMjoKLQkgICAgICByZXR1cm4gQkZEX1JFTE9DXzE2OwotCSAgICBjYXNlIDQ6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ18zMjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKHBjcmVsKQotICAgIHsKLSAgICAgIGlmIChwaWMgPT0gcGljX25vbmUpCi0JYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbiIpLCBzaXplKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSBwaWMgcmVsb2NhdGlvbiIpLCBzaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocGljID09IHBpY19ub25lKQotCWFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGljIHJlbG9jYXRpb24iKSwgc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLX0KLQotLyogSGVyZSB3ZSBkZWNpZGUgd2hpY2ggZml4dXBzIGNhbiBiZSBhZGp1c3RlZCB0byBtYWtlIHRoZW0gcmVsYXRpdmUKLSAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gaW5zdGVhZCBvZiB0aGUgc3ltYm9sLiAgQmFzaWNhbGx5Ci0gICB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGFyZSBkb25lCi0gICBjb3JyZWN0bHksIHNvIGluIHNvbWUgY2FzZXMgd2UgZm9yY2UgdGhlIG9yaWdpbmFsIHN5bWJvbCB0byBiZQotICAgdXNlZC4gICovCi1pbnQKLXRjX202OGtfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBhZGp1c3RfcmVsb2Nfc3ltcyBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIEdPVCAqLwotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ184X0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfR09UT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9QTFRPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUExUT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotfQotCi0jZWxzZSAvKiAhT0JKX0VMRiAqLwotCi0jZGVmaW5lIGdldF9yZWxvY19jb2RlKFNJWkUsUENSRUwsT1RIRVIpIE5PX1JFTE9DCi0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIGlmIChmaXhwLT5meF90Y2JpdCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19OT05FKQotICAgIHsKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0KLSAgICAgIC8qIFNpbmNlIERJRkZfRVhQUl9PSyBpcyBkZWZpbmVkIGluIHRjLW02OGsuaCwgaXQgaXMgcG9zc2libGUKLSAgICAgICAgIHRoYXQgZml4dXBfc2VnbWVudCBjb252ZXJ0ZWQgYSBub24tUEMgcmVsYXRpdmUgcmVsb2MgaW50byBhCi0gICAgICAgICBQQyByZWxhdGl2ZSByZWxvYy4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlCi0gICAgICAgICByZWxvYyBjb2RlLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl7Ci0JICBzd2l0Y2ggKGNvZGUpCi0JICAgIHsKLQkgICAgY2FzZSBCRkRfUkVMT0NfODoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzJfR09UX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ184X0dPVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9HT1RPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QTFRfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfOF9QTFRPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BMVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUT0ZGOgotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJDYW5ub3QgbWFrZSAlcyByZWxvY2F0aW9uIFBDIHJlbGF0aXZlIiksCi0JCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jZGVmaW5lIEYoU1osUENSRUwpCQkoKChTWikgPDwgMSkgKyAoUENSRUwpKQotICAgICAgc3dpdGNoIChGIChmaXhwLT5meF9zaXplLCBmaXhwLT5meF9wY3JlbCkpCi0JewotI2RlZmluZSBNQVAoU1osUENSRUwsVFlQRSkJY2FzZSBGKFNaLFBDUkVMKTogY29kZSA9IChUWVBFKTsgYnJlYWsKLQkgIE1BUCAoMSwgMCwgQkZEX1JFTE9DXzgpOwotCSAgTUFQICgyLCAwLCBCRkRfUkVMT0NfMTYpOwotCSAgTUFQICg0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgTUFQICgxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0JICBNQVAgKDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0JICBNQVAgKDQsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0jdW5kZWYgRgotI3VuZGVmIE1BUAotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0jaWZuZGVmIE9CSl9FTEYKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gMDsKLSNlbHNlCi0gIGlmICghZml4cC0+ZnhfcGNyZWwpCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgPSAoc2VjdGlvbi0+dm1hCi0JCSAgICAgKyAoZml4cC0+ZnhfcGNyZWxfYWRqdXN0ID09IDY0Ci0JCQk/IC0xIDogZml4cC0+ZnhfcGNyZWxfYWRqdXN0KQotCQkgICAgICsgZml4cC0+ZnhfYWRkbnVtYmVyCi0JCSAgICAgKyBtZF9wY3JlbF9mcm9tIChmaXhwKSk7Ci0jZW5kaWYKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIGFzc2VydCAocmVsb2MtPmhvd3RvICE9IDApOwotCi0gIHJldHVybiByZWxvYzsKLX0KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogUmV0dXJuIHplcm8gaWYgdGhlIHJlZmVyZW5jZSB0byBTWU1CT0wgZnJvbSB3aXRoaW4gdGhlIHNhbWUgc2VnbWVudCBtYXkKLSAgIGJlIHJlbGF4ZWQuICAqLwotI2lmZGVmIE9CSl9FTEYKLQotLyogT24gYW4gRUxGIHN5c3RlbSwgd2UgY2FuJ3QgcmVsYXggYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbCwKLSAgIGJlY2F1c2UgaXQgbWF5IGJlIG92ZXJyaWRkZW4gYnkgYSBzaGFyZWQgbGlicmFyeS4gIEhvd2V2ZXIsIGlmCi0gICBUQVJHRVRfT1MgaXMgImVsZiIsIHRoZW4gd2UgcHJlc3VtZSB0aGF0IHdlIGFyZSBhc3NlbWJsaW5nIGZvciBhbgotICAgZW1iZWRkZWQgc3lzdGVtLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2hhcmVkCi0gICBsaWJyYXJpZXMsIGFuZCB3ZSBjYW4gcmVsYXggYW55dGhpbmcuICAqLwotCi0jZGVmaW5lIHJlbGF4YWJsZV9zeW1ib2woc3ltYm9sKQkJXAotICAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSA9PSAwCQlcCi0gICB8fCAoISBTX0lTX0VYVEVSTkFMIChzeW1ib2wpCQkJXAotICAgICAgICYmICEgU19JU19XRUFLIChzeW1ib2wpKSkKLQotI2Vsc2UKLQotI2RlZmluZSByZWxheGFibGVfc3ltYm9sKHN5bWJvbCkgMQotCi0jZW5kaWYKLSAKLS8qIEhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUuICBOVUxMIG1lYW5zIGFueSB1c2UgYmVmb3JlCi0gICBtNjhrX2lwX2JlZ2luKCkgd2lsbCBjcmFzaC4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLQwKLS8qIEFzc2VtYmxlIGFuIG02OGsgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotbTY4a19pcCAoaW5zdHJpbmcpCi0gICAgIGNoYXIgKmluc3RyaW5nOwotewotICByZWdpc3RlciBjaGFyICpwOwotICByZWdpc3RlciBzdHJ1Y3QgbTY4a19vcCAqb3BQOwotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKm9wY29kZTsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLSAgcmVnaXN0ZXIgaW50IHRtcHJlZyA9IDAsIGJhc2VvID0gMCwgb3V0cm8gPSAwLCBuZXh0d29yZDsKLSAgY2hhciAqcGRvdCwgKnBkb3Rtb3ZlOwotICBlbnVtIG02OGtfc2l6ZSBzaXoxLCBzaXoyOwotICBjaGFyIGM7Ci0gIGludCBsb3Npbmc7Ci0gIGludCBvcHNmb3VuZDsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNl07Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkcDsKLSAgdW5zaWduZWQgbG9uZyBva19hcmNoID0gMDsKLQotICBpZiAoKmluc3RyaW5nID09ICcgJykKLSAgICBpbnN0cmluZysrOwkJCS8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0KLSAgLyogU2NhbiB1cCB0byBlbmQgb2Ygb3BlcmF0aW9uLWNvZGUsIHdoaWNoIE1VU1QgZW5kIGluIGVuZC1vZi1zdHJpbmcKLSAgICAgb3IgZXhhY3RseSAxIHNwYWNlLiAqLwotICBwZG90ID0gMDsKLSAgZm9yIChwID0gaW5zdHJpbmc7ICpwICE9ICdcMCc7IHArKykKLSAgICB7Ci0gICAgICBpZiAoKnAgPT0gJyAnKQotCWJyZWFrOwotICAgICAgaWYgKCpwID09ICcuJykKLQlwZG90ID0gcDsKLSAgICB9Ci0KLSAgaWYgKHAgPT0gaW5zdHJpbmcpCi0gICAgewotICAgICAgdGhlX2lucy5lcnJvciA9IF8oIk5vIG9wZXJhdG9yIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHAgbm93IHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBvcGNvZGUgbmFtZSwgcHJvYmFibHkgd2hpdGVzcGFjZS4KLSAgICAgTWFrZSBzdXJlIHRoZSBuYW1lIGlzIG51bGwgdGVybWluYXRlZCBieSBjbG9iYmVyaW5nIHRoZQotICAgICB3aGl0ZXNwYWNlLCBsb29rIGl0IHVwIGluIHRoZSBoYXNoIHRhYmxlLCB0aGVuIGZpeCBpdCBiYWNrLgotICAgICBSZW1vdmUgYSBkb3QsIGZpcnN0LCBzaW5jZSB0aGUgb3Bjb2RlIHRhYmxlcyBoYXZlIG5vbmUuICAqLwotICBpZiAocGRvdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAocGRvdG1vdmUgPSBwZG90OyBwZG90bW92ZSA8IHA7IHBkb3Rtb3ZlKyspCi0JKnBkb3Rtb3ZlID0gcGRvdG1vdmVbMV07Ci0gICAgICBwLS07Ci0gICAgfQotCi0gIGMgPSAqcDsKLSAgKnAgPSAnXDAnOwotICBvcGNvZGUgPSAoY29uc3Qgc3RydWN0IG02OGtfaW5jYW50ICopIGhhc2hfZmluZCAob3BfaGFzaCwgaW5zdHJpbmcpOwotICAqcCA9IGM7Ci0KLSAgaWYgKHBkb3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKHBkb3Rtb3ZlID0gcDsgcGRvdG1vdmUgPiBwZG90OyBwZG90bW92ZS0tKQotCSpwZG90bW92ZSA9IHBkb3Rtb3ZlWy0xXTsKLSAgICAgICpwZG90ID0gJy4nOwotICAgICAgKytwOwotICAgIH0KLQotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgdGhlX2lucy5lcnJvciA9IF8oIlVua25vd24gb3BlcmF0b3IiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogZm91bmQgYSBsZWdpdGltYXRlIG9wY29kZSwgc3RhcnQgbWF0Y2hpbmcgb3BlcmFuZHMgKi8KLSAgd2hpbGUgKCpwID09ICcgJykKLSAgICArK3A7Ci0KLSAgaWYgKG9wY29kZS0+bV9vcGVyYW5kcyA9PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKm9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpvbGQgPSAnXG4nOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICAgIC8qIEFoaCAtIGl0J3MgYSBtb3Rvcm9sYSBzdHlsZSBwc3VlZG8gb3AgKi8KLSAgICAgIG1vdGVfcHNldWRvX3RhYmxlW29wY29kZS0+bV9vcG51bV0ucG9jX2hhbmRsZXIKLQkobW90ZV9wc2V1ZG9fdGFibGVbb3Bjb2RlLT5tX29wbnVtXS5wb2NfdmFsKTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZDsKLSAgICAgICpvbGQgPSAwOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChmbGFnX21yaSAmJiBvcGNvZGUtPm1fb3BudW0gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJbiBNUkkgbW9kZSwgcmFuZG9tIGdhcmJhZ2UgaXMgYWxsb3dlZCBhZnRlciBhbiBpbnN0cnVjdGlvbgotICAgICAgICAgd2hpY2ggYWNjZXB0cyBubyBvcGVyYW5kcy4gICovCi0gICAgICB0aGVfaW5zLmFyZ3MgPSBvcGNvZGUtPm1fb3BlcmFuZHM7Ci0gICAgICB0aGVfaW5zLm51bWFyZ3MgPSBvcGNvZGUtPm1fb3BudW07Ci0gICAgICB0aGVfaW5zLm51bW8gPSBvcGNvZGUtPm1fY29kZW51bTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdID0gZ2V0b25lIChvcGNvZGUpOwotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gPSBnZXR0d28gKG9wY29kZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZvciAob3BQID0gJnRoZV9pbnMub3BlcmFuZHNbMF07ICpwOyBvcFArKykKLSAgICB7Ci0gICAgICBwID0gY3JhY2tfb3BlcmFuZCAocCwgb3BQKTsKLQotICAgICAgaWYgKG9wUC0+ZXJyb3IpCi0JewotCSAgdGhlX2lucy5lcnJvciA9IG9wUC0+ZXJyb3I7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBvcHNmb3VuZCA9IG9wUCAtICZ0aGVfaW5zLm9wZXJhbmRzWzBdOwotCi0gIC8qIFRoaXMgdWdseSBoYWNrIGlzIHRvIHN1cHBvcnQgdGhlIGZsb2F0aW5nIHB0IG9wY29kZXMgaW4gdGhlaXIKLSAgICAgc3RhbmRhcmQgZm9ybS4gIEVzc2VudGlhbGx5LCB3ZSBmYWtlIGEgZmlyc3QgZW50eSBvZiB0eXBlIENPUCMxICovCi0gIGlmIChvcGNvZGUtPm1fb3BlcmFuZHNbMF0gPT0gJ0knKQotICAgIHsKLSAgICAgIGludCBuOwotCi0gICAgICBmb3IgKG4gPSBvcHNmb3VuZDsgbiA+IDA7IC0tbikKLQl0aGVfaW5zLm9wZXJhbmRzW25dID0gdGhlX2lucy5vcGVyYW5kc1tuIC0gMV07Ci0KLSAgICAgIG1lbXNldCAoKGNoYXIgKikgKCZ0aGVfaW5zLm9wZXJhbmRzWzBdKSwgJ1wwJywKLQkgICAgICBzaXplb2YgKHRoZV9pbnMub3BlcmFuZHNbMF0pKTsKLSAgICAgIHRoZV9pbnMub3BlcmFuZHNbMF0ubW9kZSA9IENPTlRST0w7Ci0gICAgICB0aGVfaW5zLm9wZXJhbmRzWzBdLnJlZyA9IG02OGtfZmxvYXRfY29wbnVtOwotICAgICAgb3BzZm91bmQrKzsKLSAgICB9Ci0KLSAgLyogV2UndmUgZ290IHRoZSBvcGVyYW5kcy4gIEZpbmQgYW4gb3Bjb2RlIHRoYXQnbGwgYWNjZXB0IHRoZW0gKi8KLSAgZm9yIChsb3NpbmcgPSAwOzspCi0gICAgewotICAgICAgLyogSWYgd2UgZGlkbid0IGdldCB0aGUgcmlnaHQgbnVtYmVyIG9mIG9wcywgb3Igd2UgaGF2ZSBubwotCSBjb21tb24gbW9kZWwgd2l0aCB0aGlzIHBhdHRlcm4gdGhlbiByZWplY3QgdGhpcyBwYXR0ZXJuLiAqLwotCi0gICAgICBva19hcmNoIHw9IG9wY29kZS0+bV9hcmNoOwotICAgICAgaWYgKG9wc2ZvdW5kICE9IG9wY29kZS0+bV9vcG51bQotCSAgfHwgKChvcGNvZGUtPm1fYXJjaCAmIGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSAwKSkKLQkrK2xvc2luZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKHMgPSBvcGNvZGUtPm1fb3BlcmFuZHMsIG9wUCA9ICZ0aGVfaW5zLm9wZXJhbmRzWzBdOwotCSAgICAgICAqcyAmJiAhbG9zaW5nOwotCSAgICAgICBzICs9IDIsIG9wUCsrKQotCSAgICB7Ci0JICAgICAgLyogV2FybmluZzogdGhpcyBzd2l0Y2ggaXMgaHVnZSEgKi8KLQkgICAgICAvKiBJJ3ZlIHRyaWVkIHRvIG9yZ2FuaXplIHRoZSBjYXNlcyBpbnRvIHRoaXMgb3JkZXI6Ci0JCSBub24tYWxwaGEgZmlyc3QsIHRoZW4gYWxwaGEgYnkgbGV0dGVyLiAgTG93ZXItY2FzZQotCQkgZ29lcyBkaXJlY3RseSBiZWZvcmUgdXBwZXJjYXNlIGNvdW50ZXJwYXJ0LiAgKi8KLQkgICAgICAvKiBDb2RlIHdpdGggbXVsdGlwbGUgY2FzZSAuLi46IGdldHMgc29ydGVkIGJ5IHRoZSBsb3dlc3QKLQkJIGNhc2UgLi4uIGl0IGJlbG9uZ3MgdG8uICBJIGhvcGUgdGhpcyBtYWtlcyBzZW5zZS4gICovCi0JICAgICAgc3dpdGNoICgqcykKLQkJewotCQljYXNlICchJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJzwnOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnPic6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEFCU0w6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDCi0JCQkgIHx8IG9wUC0+cmVnID09IFpQQykKLQkJCWxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICdtJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQUlORFI6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICduJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRElTUDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCWNhc2UgJ28nOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBCQVNFOgotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCWNhc2UgJ3AnOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBBSU5EUjoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIERJU1A6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQyB8fCBvcFAtPnJlZyA9PSBaUEMpCi0gICAgICAgICAgICAgICAgICAgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCWNhc2UgJ3EnOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBSU5EUjoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIERJU1A6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQyB8fCBvcFAtPnJlZyA9PSBaUEMpCi0gICAgICAgICAgICAgICAgICAgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICd2JzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQUlORFI6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICBjYXNlIEFCU0w6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBESVNQOgotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQotICAgICAgICAgICAgICAgICAgICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJyMnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChzWzFdID09ICdiJwotCQkJICAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJCSAgICYmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgICAgIHx8ICEgaXNieXRlIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnQicKLQkJCSAgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCQkgICAmJiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgICAgICB8fCAhIGlzc2J5dGUgKG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyKSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChzWzFdID09ICd3JwotCQkJICAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJCSAgICYmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgICAgIHx8ICEgaXN3b3JkIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnVycKLQkJCSAgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCQkgICAmJiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgICAgICB8fCAhIGlzc3dvcmQgKG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyKSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdeJzoKLQkJY2FzZSAnVCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJyQnOgotCQkgIGlmIChvcFAtPm1vZGUgPT0gQVJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gRlBSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IElNTUVECi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBSRUdMU1QKLQkJICAgICAgfHwgKG9wUC0+bW9kZSAhPSBBQlNMCi0JCQkgICYmIChvcFAtPnJlZyA9PSBQQwotCQkJICAgICAgfHwgb3BQLT5yZWcgPT0gWlBDKSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICclJzoKLQkJICBpZiAob3BQLT5tb2RlID09IENPTlRST0wKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBSRUdMU1QKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IElNTUVECi0JCSAgICAgIHx8IChvcFAtPm1vZGUgIT0gQUJTTAotCQkJICAmJiAob3BQLT5yZWcgPT0gUEMKLQkJCSAgICAgIHx8IG9wUC0+cmVnID09IFpQQykpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnJic6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEFCU0w6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDCi0JCQkgIHx8IG9wUC0+cmVnID09IFpQQykKLQkJCWxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICcqJzoKLQkJICBpZiAob3BQLT5tb2RlID09IENPTlRST0wKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBSRUdMU1QpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICcrJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IEFJTkMpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICctJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IEFERUMpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICcvJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJzsnOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICc/JzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgQUJTTDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQotCQkJbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0AnOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnfic6CS8qIEZvciBub3chIChKRiBGT08gaXMgdGhpcyByaWdodD8pICovCi0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEFCU0w6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDCi0JCQkgIHx8IG9wUC0+cmVnID09IFpQQykKLQkJCWxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICczJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgKG9wUC0+cmVnICE9IFRUMCAmJiBvcFAtPnJlZyAhPSBUVDEpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnQSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBUkVHKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnYSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBSU5EUikKLQkJICAgICsrbG9zaW5nOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0InOgkvKiBGT08gKi8KLQkJICBpZiAob3BQLT5tb2RlICE9IEFCU0wKLQkJICAgICAgfHwgKGZsYWdfbG9uZ19qdW1wcwotCQkJICAmJiBzdHJuY21wIChpbnN0cmluZywgImpic3IiLCA0KSA9PSAwKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0MnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBDQ1IpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdkJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IERJU1AKLQkJICAgICAgfHwgb3BQLT5yZWcgPCBBRERSMAotCQkgICAgICB8fCBvcFAtPnJlZyA+IEFERFI3KQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBEUkVHKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRSc6Ci0JCSAgaWYgKG9wUC0+cmVnICE9IEFDQykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0YnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gRlBSRUcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdHJzoKLQkJICBpZiAob3BQLT5yZWcgIT0gTUFDU1IpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdIJzoKLQkJICBpZiAob3BQLT5yZWcgIT0gTUFTSykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0knOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPnJlZyA8IENPUDAKLQkJICAgICAgfHwgb3BQLT5yZWcgPiBDT1A3KQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnSic6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+cmVnIDwgVVNQCi0JCSAgICAgIHx8IG9wUC0+cmVnID4gbGFzdF9tb3ZlY19yZWcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciAqcnA7Ci0JCSAgICAgIGZvciAocnAgPSBjb250cm9sX3JlZ3M7ICpycDsgcnArKykKLQkJCWlmICgqcnAgPT0gb3BQLT5yZWcpCi0JCQkgIGJyZWFrOwotCQkgICAgICBpZiAoKnJwID09IDApCi0JCQlsb3NpbmcrKzsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICdrJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IElNTUVEKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbCc6Ci0JCWNhc2UgJ0wnOgotCQkgIGlmIChvcFAtPm1vZGUgPT0gRFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gQVJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gRlBSRUcpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzWzFdID09ICc4JykKLQkJCWxvc2luZysrOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIERSRUc6Ci0JCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IChvcFAtPnJlZyAtIERBVEEwKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgQVJFRzoKLQkJCSAgICAgIG9wUC0+bWFzayA9IDEgPDwgKG9wUC0+cmVnIC0gQUREUjAgKyA4KTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgRlBSRUc6Ci0JCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IChvcFAtPnJlZyAtIEZQMCArIDE2KTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkgICAgICBhYm9ydCAoKTsKLQkJCSAgICB9Ci0JCQkgIG9wUC0+bW9kZSA9IFJFR0xTVDsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlIGlmIChvcFAtPm1vZGUgPT0gQ09OVFJPTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKHNbMV0gIT0gJzgnKQotCQkJbG9zaW5nKys7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3dpdGNoIChvcFAtPnJlZykKLQkJCSAgICB7Ci0JCQkgICAgY2FzZSBGUEk6Ci0JCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IDI0OwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSBGUFM6Ci0JCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IDI1OwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSBGUEM6Ci0JCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IDI2OwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCSAgICAgIGxvc2luZysrOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICBvcFAtPm1vZGUgPSBSRUdMU1Q7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAob3BQLT5tb2RlICE9IFJFR0xTVCkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJzgnICYmIChvcFAtPm1hc2sgJiAweDBmZmZmZmYpICE9IDApCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChzWzFdID09ICczJyAmJiAob3BQLT5tYXNrICYgMHg3MDAwMDAwKSAhPSAwKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnTSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICB8fCAhIGlzc2J5dGUgKG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKCEgbTY4a19xdWljawotCQkJICAgJiYgaW5zdHJpbmdbM10gIT0gJ3EnCi0JCQkgICAmJiBpbnN0cmluZ1s0XSAhPSAncScpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdPJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IERSRUcKLQkJICAgICAgJiYgb3BQLT5tb2RlICE9IElNTUVECi0JCSAgICAgICYmIG9wUC0+bW9kZSAhPSBBQlNMKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICB8fCBvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlciA8IDEKLQkJCSAgIHx8IG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyID4gOCkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKCEgbTY4a19xdWljawotCQkJICAgJiYgKHN0cm5jbXAgKGluc3RyaW5nLCAiYWRkIiwgMykgPT0gMAotCQkJICAgICAgIHx8IHN0cm5jbXAgKGluc3RyaW5nLCAic3ViIiwgMykgPT0gMCkKLQkJCSAgICYmIGluc3RyaW5nWzNdICE9ICdxJykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1InOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gRFJFRyAmJiBvcFAtPm1vZGUgIT0gQVJFRykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3InOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQUlORFIKLQkJICAgICAgJiYgKG9wUC0+bW9kZSAhPSBCQVNFCi0JCQkgIHx8IChvcFAtPnJlZyAhPSAwCi0JCQkgICAgICAmJiBvcFAtPnJlZyAhPSBaQUREUjApCi0JCQkgIHx8IG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2Fic2VudAotCQkJICB8fCAoKG9wUC0+aW5kZXgucmVnIDwgREFUQTAKLQkJCSAgICAgICB8fCBvcFAtPmluZGV4LnJlZyA+IERBVEE3KQotCQkJICAgICAgJiYgKG9wUC0+aW5kZXgucmVnIDwgQUREUjAKLQkJCQkgIHx8IG9wUC0+aW5kZXgucmVnID4gQUREUjcpKQotCQkJICB8fCBvcFAtPmluZGV4LnNpemUgIT0gU0laRV9VTlNQRUMKLQkJCSAgfHwgb3BQLT5pbmRleC5zY2FsZSAhPSAxKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3MnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCAhIChvcFAtPnJlZyA9PSBGUEkKLQkJCSAgICB8fCBvcFAtPnJlZyA9PSBGUFMKLQkJCSAgICB8fCBvcFAtPnJlZyA9PSBGUEMpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IFNSKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAndCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICB8fCBvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlciA8IDAKLQkJCSAgIHx8IG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyID4gNykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1UnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBVU1ApCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQkgIC8qIEpGIHRoZXNlIGFyZSBvdXQgb2Ygb3JkZXIuICBXZSBjb3VsZCBwdXQgdGhlbQotCQkgICAgIGluIG9yZGVyIGlmIHdlIHdlcmUgd2lsbGluZyB0byBwdXQgdXAgd2l0aAotCQkgICAgIGJ1bmNoZXMgb2YgI2lmZGVmIG02ODg1MXMgaW4gdGhlIGNvZGUuCi0KLQkJICAgICBEb24ndCBmb3JnZXQgdGhhdCB5b3UgbmVlZCB0aGVzZSBvcGVyYW5kcwotCQkgICAgIHRvIHVzZSA2ODAzMCBNTVUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNpZm5kZWYgTk9fNjg4NTEKLQkJICAvKiBNZW1vcnkgYWRkcmVzc2luZyBtb2RlIHVzZWQgYnkgcGZsdXNociAqLwotCQljYXNlICd8JzoKLQkJICBpZiAob3BQLT5tb2RlID09IENPTlRST0wKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBEUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBBUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBSRUdMU1QpCi0JCSAgICBsb3NpbmcrKzsKLQkJICAvKiBXZSBzaG91bGQgYWNjZXB0IGltbWVkaWF0ZSBvcGVyYW5kcywgYnV0IHRoZXkKLSAgICAgICAgICAgICAgICAgICAgIHN1cHBvc2VkbHkgaGF2ZSB0byBiZSBxdWFkIHdvcmQsIGFuZCB3ZSBkb24ndAotICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIHRoYXQuICBJIHdvdWxkIGxpa2UgdG8gc2VlIHdoYXQgYSBNb3Rvcm9sYQotICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGVyIGRvZXMgYmVmb3JlIGRvaW5nIHNvbWV0aGluZyBoZXJlLiAgKi8KLQkJICBpZiAob3BQLT5tb2RlID09IElNTUVEKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZic6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IChvcFAtPnJlZyAhPSBTRkMgJiYgb3BQLT5yZWcgIT0gREZDKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJzAnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBUQykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJzEnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBBQykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJzInOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCAob3BQLT5yZWcgIT0gQ0FMCi0JCQkgICYmIG9wUC0+cmVnICE9IFZBTAotCQkJICAmJiBvcFAtPnJlZyAhPSBTQ0MpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnVic6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+cmVnICE9IFZBTCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1cnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCAob3BQLT5yZWcgIT0gRFJQCi0JCQkgICYmIG9wUC0+cmVnICE9IFNSUAotCQkJICAmJiBvcFAtPnJlZyAhPSBDUlApKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8ICghKG9wUC0+cmVnID49IEJBRCAmJiBvcFAtPnJlZyA8PSBCQUQgKyA3KQotCQkJICAmJiAhKG9wUC0+cmVnID49IEJBQyAmJiBvcFAtPnJlZyA8PSBCQUMgKyA3KSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdZJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gUFNSKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWic6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IFBDU1IpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLSNlbmRpZgotCQljYXNlICdjJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgKG9wUC0+cmVnICE9IE5DCi0JCQkgICYmIG9wUC0+cmVnICE9IElDCi0JCQkgICYmIG9wUC0+cmVnICE9IERDCi0JCQkgICYmIG9wUC0+cmVnICE9IEJDKSkKLQkJICAgIHsKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICB9CQkvKiBub3QgYSBjYWNoZSBzcGVjaWZpZXIuICovCi0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnXyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBQlNMKQotCQkgICAgKytsb3Npbmc7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAndSc6Ci0JCSAgaWYgKG9wUC0+cmVnIDwgREFUQTBMIHx8IG9wUC0+cmVnID4gQUREUjdVKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgLyogRklYTUU6IGtsdWRnZSBpbnN0ZWFkIG9mIGZpeGluZyBwYXJzZXI6Ci0gICAgICAgICAgICAgICAgICAgICB1cHBlci9sb3dlciByZWdpc3RlcnMgYXJlICpub3QqIENPTlRST0wKLSAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVycywgYnV0IG9yZGluYXJ5IG9uZXMuICovCi0JCSAgaWYgKChvcFAtPnJlZyA+PSBEQVRBMEwgJiYgb3BQLT5yZWcgPD0gREFUQTdMKQotCQkgICAgICB8fCAob3BQLT5yZWcgPj0gREFUQTBVICYmIG9wUC0+cmVnIDw9IERBVEE3VSkpCi0JCSAgICBvcFAtPm1vZGUgPSBEUkVHOwotCQkgIGVsc2UKLQkJICAgIG9wUC0+bW9kZSA9IEFSRUc7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQkJLyogc3dpdGNoIG9uIHR5cGUgb2Ygb3BlcmFuZCAqLwotCi0JICAgICAgaWYgKGxvc2luZykKLQkJYnJlYWs7Ci0JICAgIH0JCQkvKiBmb3IgZWFjaCBvcGVyYW5kICovCi0JfQkJCS8qIGlmIGltbWVkaWF0ZWx5IHdyb25nICovCi0KLSAgICAgIGlmICghbG9zaW5nKQotCXsKLQkgIGJyZWFrOwotCX0JCQkvKiBnb3QgaXQuICovCi0KLSAgICAgIG9wY29kZSA9IG9wY29kZS0+bV9uZXh0OwotCi0gICAgICBpZiAoIW9wY29kZSkKLQl7Ci0JICBpZiAob2tfYXJjaAotCSAgICAgICYmICEob2tfYXJjaCAmIGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzIwMF0sICpjcDsKLQotCSAgICAgIHN0cmNweSAoYnVmLAotCQkgICAgICBfKCJpbnZhbGlkIGluc3RydWN0aW9uIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgIikpOwotCSAgICAgIGNwID0gYnVmICsgc3RybGVuIChidWYpOwotCSAgICAgIHN3aXRjaCAob2tfYXJjaCkKLQkJewotCQljYXNlIG1mbG9hdDoKLQkJICBzdHJjcHkgKGNwLCBfKCJmcHUgKDY4MDQwLCA2ODA2MCBvciA2ODg4MS82ODg4MikiKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgbW1tdToKLQkJICBzdHJjcHkgKGNwLCBfKCJtbXUgKDY4MDMwIG9yIDY4ODUxKSIpKTsKLQkJICBicmVhazsKLQkJY2FzZSBtNjgwMjB1cDoKLQkJICBzdHJjcHkgKGNwLCBfKCI2ODAyMCBvciBoaWdoZXIiKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgbTY4MDAwdXA6Ci0JCSAgc3RyY3B5IChjcCwgXygiNjgwMDAgb3IgaGlnaGVyIikpOwotCQkgIGJyZWFrOwotCQljYXNlIG02ODAxMHVwOgotCQkgIHN0cmNweSAoY3AsIF8oIjY4MDEwIG9yIGhpZ2hlciIpKTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICB7Ci0JCSAgICBpbnQgZ290X29uZSA9IDAsIGlkeDsKLQkJICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc2l6ZW9mIChhcmNocykgLyBzaXplb2YgKGFyY2hzWzBdKTsKLQkJCSBpZHgrKykKLQkJICAgICAgewotCQkJaWYgKChhcmNoc1tpZHhdLmFyY2ggJiBva19hcmNoKQotCQkJICAgICYmICEgYXJjaHNbaWR4XS5hbGlhcykKLQkJCSAgewotCQkJICAgIGlmIChnb3Rfb25lKQotCQkJICAgICAgewotCQkJCXN0cmNweSAoY3AsICIgb3IgIik7Ci0JCQkJY3AgKz0gc3RybGVuIChjcCk7Ci0JCQkgICAgICB9Ci0JCQkgICAgZ290X29uZSA9IDE7Ci0JCQkgICAgc3RyY3B5IChjcCwgYXJjaHNbaWR4XS5uYW1lKTsKLQkJCSAgICBjcCArPSBzdHJsZW4gKGNwKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQl9Ci0JICAgICAgY3AgPSB4bWFsbG9jIChzdHJsZW4gKGJ1ZikgKyAxKTsKLQkgICAgICBzdHJjcHkgKGNwLCBidWYpOwotCSAgICAgIHRoZV9pbnMuZXJyb3IgPSBjcDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB0aGVfaW5zLmVycm9yID0gXygib3BlcmFuZHMgbWlzbWF0Y2giKTsKLQkgIHJldHVybjsKLQl9CQkJLyogRmVsbCBvZmYgdGhlIGVuZCAqLwotCi0gICAgICBsb3NpbmcgPSAwOwotICAgIH0KLQotICAvKiBub3cgYXNzZW1ibGUgaXQgKi8KLQotICB0aGVfaW5zLmFyZ3MgPSBvcGNvZGUtPm1fb3BlcmFuZHM7Ci0gIHRoZV9pbnMubnVtYXJncyA9IG9wY29kZS0+bV9vcG51bTsKLSAgdGhlX2lucy5udW1vID0gb3Bjb2RlLT5tX2NvZGVudW07Ci0gIHRoZV9pbnMub3Bjb2RlWzBdID0gZ2V0b25lIChvcGNvZGUpOwotICB0aGVfaW5zLm9wY29kZVsxXSA9IGdldHR3byAob3Bjb2RlKTsKLQotICBmb3IgKHMgPSB0aGVfaW5zLmFyZ3MsIG9wUCA9ICZ0aGVfaW5zLm9wZXJhbmRzWzBdOyAqczsgcyArPSAyLCBvcFArKykKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN3aXRjaCBpcyBhIGRvb3p5LgotICAgICAgIFdhdGNoIHRoZSBmaXJzdCBzdGVwOyBpdHMgYSBiaWcgb25lISAqLwotICAgICAgc3dpdGNoIChzWzBdKQotCXsKLQotCWNhc2UgJyonOgotCWNhc2UgJ34nOgotCWNhc2UgJyUnOgotCWNhc2UgJzsnOgotCWNhc2UgJ0AnOgotCWNhc2UgJyEnOgotCWNhc2UgJyYnOgotCWNhc2UgJyQnOgotCWNhc2UgJz8nOgotCWNhc2UgJy8nOgotCWNhc2UgJzwnOgotCWNhc2UgJz4nOgotCWNhc2UgJ20nOgotCWNhc2UgJ24nOgotCWNhc2UgJ28nOgotCWNhc2UgJ3AnOgotCWNhc2UgJ3EnOgotCWNhc2UgJ3YnOgotI2lmbmRlZiBOT182ODg1MQotCWNhc2UgJ3wnOgotI2VuZGlmCi0JICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkgICAgewotCSAgICBjYXNlIElNTUVEOgotCSAgICAgIHRtcHJlZyA9IDB4M2M7CS8qIDcuNCAqLwotCSAgICAgIGlmIChzdHJjaHIgKCJid2wiLCBzWzFdKSkKLQkJbmV4dHdvcmQgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0JICAgICAgZWxzZQotCQluZXh0d29yZCA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDApOwotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCWFkZF9maXggKHNbMV0sICZvcFAtPmRpc3AsIDAsIDApOwotCSAgICAgIHN3aXRjaCAoc1sxXSkKLQkJewotCQljYXNlICdiJzoKLQkJICBpZiAoIWlzYnl0ZSAobmV4dHdvcmQpKQotCQkgICAgb3BQLT5lcnJvciA9IF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlIik7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgIGJhc2VvID0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAndyc6Ci0JCSAgaWYgKCFpc3dvcmQgKG5leHR3b3JkKSkKLQkJICAgIG9wUC0+ZXJyb3IgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSIpOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBiYXNlbyA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1cnOgotCQkgIGlmICghaXNzd29yZCAobmV4dHdvcmQpKQotCQkgICAgb3BQLT5lcnJvciA9IF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlIik7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgIGJhc2VvID0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAnbCc6Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQgPj4gMTYpOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBiYXNlbyA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZic6Ci0JCSAgYmFzZW8gPSAyOwotCQkgIG91dHJvID0gODsKLQkJICBicmVhazsKLQkJY2FzZSAnRic6Ci0JCSAgYmFzZW8gPSA0OwotCQkgIG91dHJvID0gMTE7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3gnOgotCQkgIGJhc2VvID0gNjsKLQkJICBvdXRybyA9IDE1OwotCQkgIGJyZWFrOwotCQljYXNlICdwJzoKLQkJICBiYXNlbyA9IDY7Ci0JCSAgb3V0cm8gPSAtMTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGlmICghYmFzZW8pCi0JCWJyZWFrOwotCi0JICAgICAgLyogV2UgZ290dGEgcHV0IG91dCBzb21lIGZsb2F0ICovCi0JICAgICAgaWYgKG9wICgmb3BQLT5kaXNwKSAhPSBPX2JpZykKLQkJewotCQkgIHZhbHVlVCB2YWw7Ci0JCSAgaW50IGdlbmNudDsKLQotCQkgIC8qIENhbiBvdGhlciBjYXNlcyBoYXBwZW4gaGVyZT8gICovCi0JCSAgaWYgKG9wICgmb3BQLT5kaXNwKSAhPSBPX2NvbnN0YW50KQotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICB2YWwgPSAodmFsdWVUKSBvZmZzICgmb3BQLT5kaXNwKTsKLQkJICBnZW5jbnQgPSAwOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIGdlbmVyaWNfYmlnbnVtW2dlbmNudF0gPSAoTElUVExFTlVNX1RZUEUpIHZhbDsKLQkJICAgICAgdmFsID4+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JCSAgICAgICsrZ2VuY250OwotCQkgICAgfQotCQkgIHdoaWxlICh2YWwgIT0gMCk7Ci0JCSAgb2ZmcyAoJm9wUC0+ZGlzcCkgPSBnZW5jbnQ7Ci0JCX0KLQkgICAgICBpZiAob2ZmcyAoJm9wUC0+ZGlzcCkgPiAwKQotCQl7Ci0JCSAgaWYgKG9mZnMgKCZvcFAtPmRpc3ApID4gYmFzZW8pCi0JCSAgICB7Ci0JCSAgICAgIGFzX3dhcm4gKF8oIkJpZ251bSB0b28gYmlnIGZvciAlYyBmb3JtYXQ7IHRydW5jYXRlZCIpLAotCQkJICAgICAgIHNbMV0pOwotCQkgICAgICBvZmZzICgmb3BQLT5kaXNwKSA9IGJhc2VvOwotCQkgICAgfQotCQkgIGJhc2VvIC09IG9mZnMgKCZvcFAtPmRpc3ApOwotCQkgIHdoaWxlIChiYXNlby0tKQotCQkgICAgYWRkd29yZCAoMCk7Ci0JCSAgZm9yICh3b3JkcCA9IGdlbmVyaWNfYmlnbnVtICsgb2ZmcyAoJm9wUC0+ZGlzcCkgLSAxOwotCQkgICAgICAgb2ZmcyAoJm9wUC0+ZGlzcCktLTsKLQkJICAgICAgIC0td29yZHApCi0JCSAgICBhZGR3b3JkICgqd29yZHApOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZ2VuX3RvX3dvcmRzICh3b3JkcywgYmFzZW8sIChsb25nKSBvdXRybyk7Ci0JICAgICAgZm9yICh3b3JkcCA9IHdvcmRzOyBiYXNlby0tOyB3b3JkcCsrKQotCQlhZGR3b3JkICgqd29yZHApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERSRUc6Ci0JICAgICAgdG1wcmVnID0gb3BQLT5yZWcgLSBEQVRBOwkvKiAwLmRyZWcgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkVHOgotCSAgICAgIHRtcHJlZyA9IDB4MDggKyBvcFAtPnJlZyAtIEFERFI7CS8qIDEuYXJlZyAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFJTkRSOgotCSAgICAgIHRtcHJlZyA9IDB4MTAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDIuYXJlZyAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFERUM6Ci0JICAgICAgdG1wcmVnID0gMHgyMCArIG9wUC0+cmVnIC0gQUREUjsJLyogNC5hcmVnICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUlOQzoKLQkgICAgICB0bXByZWcgPSAweDE4ICsgb3BQLT5yZWcgLSBBRERSOwkvKiAzLmFyZWcgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQOgotCi0JICAgICAgbmV4dHdvcmQgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0KLQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMKLQkJICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkgICYmIG02OGtfYWJzcGNhZGQpCi0JCXsKLQkJICBvcFAtPmRpc3AuZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCQkgIG9wUC0+ZGlzcC5leHAuWF9hZGRfc3ltYm9sID0gJmFic19zeW1ib2w7Ci0jZWxzZQotCQkgIG9wUC0+ZGlzcC5leHAuWF9hZGRfc3ltYm9sID0KLQkJICAgIHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLSNlbmRpZgotCQl9Ci0KLQkgICAgICAvKiBGb3JjZSBpbnRvIGluZGV4IG1vZGUuICBIb3BlIHRoaXMgd29ya3MgKi8KLQotCSAgICAgIC8qIFdlIGRvIHRoZSBmaXJzdCBiaXQgZm9yIDMyLWJpdCBkaXNwbGFjZW1lbnRzLCBhbmQgdGhlCi0JCSBzZWNvbmQgYml0IGZvciAxNiBiaXQgb25lcy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UKLQkJIHNob3VsZCBtYWtlIHRoZSBkZWZhdWx0IGJlIFdPUkQgaW5zdGVhZCBvZiBMT05HLCBidXQKLQkJIEkgdGhpbmsgdGhhdCdkIGJyZWFrIEdDQywgc28gd2UgcHV0IHVwIHdpdGggYSBsaXR0bGUKLQkJIGluZWZmaWNpZW5jeSBmb3IgdGhlIHNha2Ugb2Ygd29ya2luZyBvdXRwdXQuICAqLwotCi0JICAgICAgaWYgKCFpc3N3b3JkIChuZXh0d29yZCkKLQkJICB8fCAoaXN2YXIgKCZvcFAtPmRpc3ApCi0JCSAgICAgICYmICgob3BQLT5kaXNwLnNpemUgPT0gU0laRV9VTlNQRUMKLQkJCSAgICYmIGZsYWdfc2hvcnRfcmVmcyA9PSAwCi0JCQkgICAmJiBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID49IG02ODAyMAotCQkJICAgJiYgISBhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkJCSAgfHwgb3BQLT5kaXNwLnNpemUgPT0gU0laRV9MT05HKSkpCi0JCXsKLQkJICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCQkgICAgICB8fCBhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkJICAgIG9wUC0+ZXJyb3IgPQotCQkgICAgICBfKCJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIik7Ci0JCSAgaWYgKG9wUC0+cmVnID09IFBDKQotCQkgICAgdG1wcmVnID0gMHgzQjsJLyogNy4zICovCi0JCSAgZWxzZQotCQkgICAgdG1wcmVnID0gMHgzMCArIG9wUC0+cmVnIC0gQUREUjsJLyogNi5hcmVnICovCi0JCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDKQotCQkJewotCQkJICBpZiAob3BQLT5kaXNwLnNpemUgPT0gU0laRV9MT05HCi0jaWZkZWYgT0JKX0VMRgotCQkJICAgICAgLyogSWYgdGhlIGRpc3BsYWNlbWVudCBuZWVkcyBwaWMKLQkJCQkgcmVsb2NhdGlvbiBpdCBjYW5ub3QgYmUgcmVsYXhlZC4gICovCi0JCQkgICAgICB8fCBvcFAtPmRpc3AucGljX3JlbG9jICE9IHBpY19ub25lCi0jZW5kaWYKLQkJCSAgICAgICkKLQkJCSAgICB7Ci0JCQkgICAgICBhZGR3b3JkICgweDAxNzApOwotCQkJICAgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAxLCAyKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksCi0JCQkJCW9mZnMgKCZvcFAtPmRpc3ApLAotCQkJCQlUQUIgKFBDTEVBLCBTWl9VTkRFRikpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFkZHdvcmQgKDB4MDE3MCk7Ci0JCQkgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYWRkd29yZCAoMHgwMTcwKTsKLQkJICBhZGR3b3JkIChuZXh0d29yZCA+PiAxNik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAob3BQLT5yZWcgPT0gUEMpCi0JCSAgICB0bXByZWcgPSAweDNBOwkvKiA3LjIgKi8KLQkJICBlbHNlCi0JCSAgICB0bXByZWcgPSAweDI4ICsgb3BQLT5yZWcgLSBBRERSOwkvKiA1LmFyZWcgKi8KLQotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQykKLQkJCXsKLQkJCSAgYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFBPU1Q6Ci0JICAgIGNhc2UgUFJFOgotCSAgICBjYXNlIEJBU0U6Ci0JICAgICAgbmV4dHdvcmQgPSAwOwotCSAgICAgIGJhc2VvID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgICAgIGlmIChvcFAtPm1vZGUgPT0gUE9TVCB8fCBvcFAtPm1vZGUgPT0gUFJFKQotCQlvdXRybyA9IGdldF9udW0gKCZvcFAtPm9kaXNwLCA4MCk7Ci0JICAgICAgLyogRmlndXJlIG91dCB0aGUgYGFkZHJlc3NpbmcgbW9kZScuCi0JCSBBbHNvIHR1cm4gb24gdGhlIEJBU0VfRElTQUJMRSBiaXQsIGlmIG5lZWRlZC4gICovCi0JICAgICAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLQkJewotCQkgIHRtcHJlZyA9IDB4M2I7CS8qIDcuMyAqLwotCQkgIGlmIChvcFAtPnJlZyA9PSBaUEMpCi0JCSAgICBuZXh0d29yZCB8PSAweDgwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BQLT5yZWcgPT0gMCkKLQkJewotCQkgIG5leHR3b3JkIHw9IDB4ODA7Ci0JCSAgdG1wcmVnID0gMHgzMDsJLyogNi5nYXJiYWdlICovCi0JCX0KLQkgICAgICBlbHNlIGlmIChvcFAtPnJlZyA+PSBaQUREUjAgJiYgb3BQLT5yZWcgPD0gWkFERFI3KQotCQl7Ci0JCSAgbmV4dHdvcmQgfD0gMHg4MDsKLQkJICB0bXByZWcgPSAweDMwICsgb3BQLT5yZWcgLSBaQUREUjA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXRtcHJlZyA9IDB4MzAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDYuYXJlZyAqLwotCi0JICAgICAgc2l6MSA9IG9wUC0+ZGlzcC5zaXplOwotCSAgICAgIGlmIChvcFAtPm1vZGUgPT0gUE9TVCB8fCBvcFAtPm1vZGUgPT0gUFJFKQotCQlzaXoyID0gb3BQLT5vZGlzcC5zaXplOwotCSAgICAgIGVsc2UKLQkJc2l6MiA9IFNJWkVfVU5TUEVDOwotCi0JICAgICAgLyogSW5kZXggcmVnaXN0ZXIgc3R1ZmYgKi8KLQkgICAgICBpZiAob3BQLT5pbmRleC5yZWcgIT0gMAotCQkgICYmIG9wUC0+aW5kZXgucmVnID49IERBVEEKLQkJICAmJiBvcFAtPmluZGV4LnJlZyA8PSBBRERSNykKLQkJewotCQkgIG5leHR3b3JkIHw9IChvcFAtPmluZGV4LnJlZyAtIERBVEEpIDw8IDEyOwotCi0JCSAgaWYgKG9wUC0+aW5kZXguc2l6ZSA9PSBTSVpFX0xPTkcKLQkJICAgICAgfHwgKG9wUC0+aW5kZXguc2l6ZSA9PSBTSVpFX1VOU1BFQwotCQkJICAmJiBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPT0gU0laRV9MT05HKSkKLQkJICAgIG5leHR3b3JkIHw9IDB4ODAwOwotCi0JCSAgaWYgKChvcFAtPmluZGV4LnNjYWxlICE9IDEgCi0JCSAgICAgICAmJiBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwKQotCQkgICAgICB8fCAob3BQLT5pbmRleC5zY2FsZSA9PSA4IAotCQkJICAmJiBhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkpCi0JCSAgICB7Ci0JCSAgICAgIG9wUC0+ZXJyb3IgPQotCQkJXygic2NhbGUgZmFjdG9yIGludmFsaWQgb24gdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIGNwdTMyIG9yIDY4MDIwIG9yIGhpZ2hlciIpOwotCQkgICAgfQotCi0JCSAgaWYgKGFyY2hfY29sZGZpcmVfcCAoY3VycmVudF9hcmNoaXRlY3R1cmUpCi0JCSAgICAgICYmIG9wUC0+aW5kZXguc2l6ZSA9PSBTSVpFX1dPUkQpCi0JCSAgICBvcFAtPmVycm9yID0gXygiaW52YWxpZCBpbmRleCBzaXplIGZvciBjb2xkZmlyZSIpOwotCi0JCSAgc3dpdGNoIChvcFAtPmluZGV4LnNjYWxlKQotCQkgICAgewotCQkgICAgY2FzZSAxOgotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMjoKLQkJICAgICAgbmV4dHdvcmQgfD0gMHgyMDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA0OgotCQkgICAgICBuZXh0d29yZCB8PSAweDQwMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDg6Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4NjAwOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGFib3J0ICgpOwotCQkgICAgfQotCQkgIC8qIElGIGl0cyBzaW1wbGUsCi0JCSAgICAgR0VUIFVTIE9VVCBPRiBIRVJFISAqLwotCi0JCSAgLyogTXVzdCBiZSBJTkRFWCwgd2l0aCBhbiBpbmRleCByZWdpc3Rlci4gIEFkZHJlc3MKLQkJICAgICByZWdpc3RlciBjYW5ub3QgYmUgWkVSTy1QQywgYW5kIGVpdGhlciA6YiB3YXMKLQkJICAgICBmb3JjZWQsIG9yIHdlIGtub3cgaXQgd2lsbCBmaXQuICBGb3IgYSA2ODAwMCBvcgotCQkgICAgIDY4MDEwLCBmb3JjZSB0aGlzIG1vZGUgYW55d2F5cywgYmVjYXVzZSB0aGUKLQkJICAgICBsYXJnZXIgbW9kZXMgYXJlbid0IHN1cHBvcnRlZC4gICovCi0JCSAgaWYgKG9wUC0+bW9kZSA9PSBCQVNFCi0JCSAgICAgICYmICgob3BQLT5yZWcgPj0gQUREUjAKLQkJCSAgICYmIG9wUC0+cmVnIDw9IEFERFI3KQotCQkJICB8fCBvcFAtPnJlZyA9PSBQQykpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzaXoxID09IFNJWkVfQllURQotCQkJICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JCQkgIHx8IGFyY2hfY29sZGZpcmVfcCAoY3VycmVudF9hcmNoaXRlY3R1cmUpCi0JCQkgIHx8IChzaXoxID09IFNJWkVfVU5TUEVDCi0JCQkgICAgICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgICAgJiYgaXNzYnl0ZSAoYmFzZW8pKSkKLQkJCXsKLSAJCQkgIG5leHR3b3JkICs9IGJhc2VvICYgMHhmZjsKLSAJCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLSAJCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCQkgICAgewotCQkJICAgICAgLyogRG8gYSBieXRlIHJlbG9jYXRpb24uICBJZiBpdCBkb2Vzbid0Ci0JCQkJIGZpdCAocG9zc2libGUgb24gbTY4MDAwKSBsZXQgdGhlCi0JCQkJIGZpeHVwIHByb2Nlc3NpbmcgY29tcGxhaW4gbGF0ZXIuICAqLwotCQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDKQotCQkJCWFkZF9maXggKCdCJywgJm9wUC0+ZGlzcCwgMSwgMSk7Ci0JCQkgICAgICBlbHNlCi0JCQkJYWRkX2ZpeCAoJ0InLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKHNpejEgIT0gU0laRV9CWVRFKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChzaXoxICE9IFNJWkVfVU5TUEVDKQotCQkJCWFzX3dhcm4gKF8oIkZvcmNpbmcgYnl0ZSBkaXNwbGFjZW1lbnQiKSk7Ci0JCQkgICAgICBpZiAoISBpc3NieXRlIChiYXNlbykpCi0JCQkJb3BQLT5lcnJvciA9IF8oImJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIpOwotCQkJICAgIH0KLQotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc2l6MSA9PSBTSVpFX1VOU1BFQwotCQkJICAgICAgICYmIG9wUC0+cmVnID09IFBDCi0JCQkgICAgICAgJiYgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCQkgICAgICAgJiYgc3VicyAoJm9wUC0+ZGlzcCkgPT0gTlVMTAotI2lmZGVmIE9CSl9FTEYKLQkJCSAgICAgICAvKiBJZiB0aGUgZGlzcGxhY2VtZW50IG5lZWRzIHBpYwotCQkJCSAgcmVsb2NhdGlvbiBpdCBjYW5ub3QgYmUgcmVsYXhlZC4gICovCi0JCQkgICAgICAgJiYgb3BQLT5kaXNwLnBpY19yZWxvYyA9PSBwaWNfbm9uZQotI2VuZGlmCi0JCQkgICAgICAgKQotCQkJewotCQkJICAvKiBUaGUgY29kZSBpbiBtZF9jb252ZXJ0X2ZyYWdfMSBuZWVkcyB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmxlIHRvIGFkanVzdCBuZXh0d29yZC4gIENhbGwgZnJhZ19ncm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIHNwYWNlIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmFnIG9ic3RhY2sgdG8gbWFrZSBhbGwgdGhlIGJ5dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpZ3VvdXMuICAqLwotCQkJICBmcmFnX2dyb3cgKDE0KTsKLSAJCQkgIG5leHR3b3JkICs9IGJhc2VvICYgMHhmZjsKLSAJCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLSAJCQkgIGFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwgb2ZmcyAoJm9wUC0+ZGlzcCksCi0gCQkJCSAgICBUQUIgKFBDSU5ERVgsIFNaX1VOREVGKSk7Ci0KLQkJCSAgYnJlYWs7Ci0gCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbmV4dHdvcmQgfD0gMHg0MDsJLyogTm8gaW5kZXggcmVnICovCi0JCSAgaWYgKG9wUC0+aW5kZXgucmVnID49IFpEQVRBMAotCQkgICAgICAmJiBvcFAtPmluZGV4LnJlZyA8PSBaREFUQTcpCi0JCSAgICBuZXh0d29yZCB8PSAob3BQLT5pbmRleC5yZWcgLSBaREFUQTApIDw8IDEyOwotCQkgIGVsc2UgaWYgKG9wUC0+aW5kZXgucmVnID49IFpBRERSMAotCQkJICAgfHwgb3BQLT5pbmRleC5yZWcgPD0gWkFERFI3KQotCQkgICAgbmV4dHdvcmQgfD0gKG9wUC0+aW5kZXgucmVnIC0gWkFERFIwICsgOCkgPDwgMTI7Ci0JCX0KLQotCSAgICAgIC8qIEl0IGlzbid0IHNpbXBsZS4gICovCi0KLQkgICAgICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCQkgIHx8IGFyY2hfY29sZGZpcmVfcCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCQlvcFAtPmVycm9yID0KLQkJICBfKCJpbnZhbGlkIG9wZXJhbmQgbW9kZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIpOwotCi0JICAgICAgbmV4dHdvcmQgfD0gMHgxMDA7Ci0JICAgICAgLyogSWYgdGhlIGd1eSBzcGVjaWZpZWQgYSB3aWR0aCwgd2UgYXNzdW1lIHRoYXQgaXQgaXMKLQkJIHdpZGUgZW5vdWdoLiAgTWF5YmUgaXQgaXNuJ3QuICBJZiBzbywgd2UgbG9zZS4gICovCi0JICAgICAgc3dpdGNoIChzaXoxKQotCQl7Ci0JCWNhc2UgU0laRV9VTlNQRUM6Ci0JCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKQotCQkgICAgICA/IG02OGtfcmVsMzIKLQkJICAgICAgOiAhIGlzc3dvcmQgKGJhc2VvKSkKLQkJICAgIHsKLQkJICAgICAgc2l6MSA9IFNJWkVfTE9ORzsKLQkJICAgICAgbmV4dHdvcmQgfD0gMHgzMDsKLQkJICAgIH0KLQkJICBlbHNlIGlmICghIGlzdmFyICgmb3BQLT5kaXNwKSAmJiBiYXNlbyA9PSAwKQotCQkgICAgbmV4dHdvcmQgfD0gMHgxMDsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4MjA7Ci0JCSAgICAgIHNpejEgPSBTSVpFX1dPUkQ7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgU0laRV9CWVRFOgotCQkgIGFzX3dhcm4gKF8oIjpiIG5vdCBwZXJtaXR0ZWQ7IGRlZmF1bHRpbmcgdG8gOnciKSk7Ci0JCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJY2FzZSBTSVpFX1dPUkQ6Ci0JCSAgbmV4dHdvcmQgfD0gMHgyMDsKLQkJICBicmVhazsKLQkJY2FzZSBTSVpFX0xPTkc6Ci0JCSAgbmV4dHdvcmQgfD0gMHgzMDsKLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgLyogRmlndXJlIG91dCBpbm5uZXIgZGlzcGxhY2VtZW50IHN0dWZmICovCi0JICAgICAgaWYgKG9wUC0+bW9kZSA9PSBQT1NUIHx8IG9wUC0+bW9kZSA9PSBQUkUpCi0JCXsKLQkJICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIGNwdTMyKQotCQkgICAgb3BQLT5lcnJvciA9IF8oImludmFsaWQgb3BlcmFuZCBtb2RlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIik7Ci0JCSAgc3dpdGNoIChzaXoyKQotCQkgICAgewotCQkgICAgY2FzZSBTSVpFX1VOU1BFQzoKLQkJICAgICAgaWYgKGlzdmFyICgmb3BQLT5vZGlzcCkKLQkJCSAgPyBtNjhrX3JlbDMyCi0JCQkgIDogISBpc3N3b3JkIChvdXRybykpCi0JCQl7Ci0JCQkgIHNpejIgPSBTSVpFX0xPTkc7Ci0JCQkgIG5leHR3b3JkIHw9IDB4MzsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoISBpc3ZhciAoJm9wUC0+b2Rpc3ApICYmIG91dHJvID09IDApCi0JCQluZXh0d29yZCB8PSAweDE7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgbmV4dHdvcmQgfD0gMHgyOwotCQkJICBzaXoyID0gU0laRV9XT1JEOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMToKLQkJICAgICAgYXNfd2FybiAoXygiOmIgbm90IHBlcm1pdHRlZDsgZGVmYXVsdGluZyB0byA6dyIpKTsKLQkJICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJICAgIGNhc2UgMjoKLQkJICAgICAgbmV4dHdvcmQgfD0gMHgyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMzoKLQkJICAgICAgbmV4dHdvcmQgfD0gMHgzOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpZiAob3BQLT5tb2RlID09IFBPU1QKLQkJICAgICAgJiYgKG5leHR3b3JkICYgMHg0MCkgPT0gMCkKLQkJICAgIG5leHR3b3JkIHw9IDB4MDQ7Ci0JCX0KLQkgICAgICBhZGR3b3JkIChuZXh0d29yZCk7Ci0KLQkgICAgICBpZiAoc2l6MSAhPSBTSVpFX1VOU1BFQyAmJiBpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCXsKLQkJICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQotCQkgICAgYWRkX2ZpeCAoc2l6MSA9PSBTSVpFX0xPTkcgPyAnbCcgOiAndycsICZvcFAtPmRpc3AsIDEsIDIpOwotCQkgIGVsc2UKLQkJICAgIGFkZF9maXggKHNpejEgPT0gU0laRV9MT05HID8gJ2wnIDogJ3cnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkJfQotCSAgICAgIGlmIChzaXoxID09IFNJWkVfTE9ORykKLQkJYWRkd29yZCAoYmFzZW8gPj4gMTYpOwotCSAgICAgIGlmIChzaXoxICE9IFNJWkVfVU5TUEVDKQotCQlhZGR3b3JkIChiYXNlbyk7Ci0KLQkgICAgICBpZiAoc2l6MiAhPSBTSVpFX1VOU1BFQyAmJiBpc3ZhciAoJm9wUC0+b2Rpc3ApKQotCQlhZGRfZml4IChzaXoyID09IFNJWkVfTE9ORyA/ICdsJyA6ICd3JywgJm9wUC0+b2Rpc3AsIDAsIDApOwotCSAgICAgIGlmIChzaXoyID09IFNJWkVfTE9ORykKLQkJYWRkd29yZCAob3V0cm8gPj4gMTYpOwotCSAgICAgIGlmIChzaXoyICE9IFNJWkVfVU5TUEVDKQotCQlhZGR3b3JkIChvdXRybyk7Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFCU0w6Ci0JICAgICAgbmV4dHdvcmQgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0JICAgICAgc3dpdGNoIChvcFAtPmRpc3Auc2l6ZSkKLQkJewotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQljYXNlIFNJWkVfVU5TUEVDOgotCQkgIGlmICghaXN2YXIgKCZvcFAtPmRpc3ApICYmIGlzc3dvcmQgKG9mZnMgKCZvcFAtPmRpc3ApKSkKLQkJICAgIHsKLQkJICAgICAgdG1wcmVnID0gMHgzODsJLyogNy4wICovCi0JCSAgICAgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyogRG9uJ3QgZ2VuZXJhdGUgcGMgcmVsYXRpdmUgY29kZSBvbiA2ODAxMCBhbmQKLQkJICAgICA2ODAwMC4gICovCi0JCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKQotCQkgICAgICAmJiAhc3VicyAoJm9wUC0+ZGlzcCkKLQkJICAgICAgJiYgYWRkcyAoJm9wUC0+ZGlzcCkKLSNpZmRlZiBPQkpfRUxGCi0JCSAgICAgIC8qIElmIHRoZSBkaXNwbGFjZW1lbnQgbmVlZHMgcGljIHJlbG9jYXRpb24gaXQKLQkJCSBjYW5ub3QgYmUgcmVsYXhlZC4gICovCi0JCSAgICAgICYmIG9wUC0+ZGlzcC5waWNfcmVsb2MgPT0gcGljX25vbmUKLSNlbmRpZgotCQkgICAgICAmJiBTX0dFVF9TRUdNRU5UIChhZGRzICgmb3BQLT5kaXNwKSkgPT0gbm93X3NlZwotCQkgICAgICAmJiByZWxheGFibGVfc3ltYm9sIChhZGRzICgmb3BQLT5kaXNwKSkKLQkJICAgICAgJiYgSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkKLQkJICAgICAgJiYgIWZsYWdfbG9uZ19qdW1wcwotCQkgICAgICAmJiAhc3RyY2hyICgifiUmJD8iLCBzWzBdKSkKLQkJICAgIHsKLQkJICAgICAgdG1wcmVnID0gMHgzQTsJLyogNy4yICovCi0JCSAgICAgIGFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwKLQkJCQlvZmZzICgmb3BQLT5kaXNwKSwKLQkJCQlUQUIgKFBDUkVMLCBTWl9VTkRFRikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAvKiBGYWxsIHRocm91Z2ggaW50byBsb25nICovCi0JCWNhc2UgU0laRV9MT05HOgotCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCSAgICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDAsIDApOwotCi0JCSAgdG1wcmVnID0gMHgzOTsvKiA3LjEgbW9kZSAqLwotCQkgIGFkZHdvcmQgKG5leHR3b3JkID4+IDE2KTsKLQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTSVpFX0JZVEU6Ci0JCSAgYXNfYmFkIChfKCJ1bnN1cHBvcnRlZCBieXRlIHZhbHVlOyB1c2UgYSBkaWZmZXJlbnQgc3VmZml4IikpOwotCQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCWNhc2UgU0laRV9XT1JEOgkvKiBXb3JkICovCi0JCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJICAgIGFkZF9maXggKCd3JywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0KLQkJICB0bXByZWcgPSAweDM4Oy8qIDcuMCBtb2RlICovCi0JCSAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ09OVFJPTDoKLQkgICAgY2FzZSBGUFJFRzoKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19iYWQgKF8oInVua25vd24vaW5jb3JyZWN0IG9wZXJhbmQiKSk7Ci0JICAgICAgLyogYWJvcnQoKTsgKi8KLQkgICAgfQotCSAgaW5zdGFsbF9nZW5fb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnIyc6Ci0JY2FzZSAnXic6Ci0JICBzd2l0Y2ggKHNbMV0pCi0JICAgIHsJCQkvKiBKRjogSSBoYXRlIGZsb2F0aW5nIHBvaW50ISAqLwotCSAgICBjYXNlICdqJzoKLQkgICAgICB0bXByZWcgPSA3MDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnOCc6Ci0JICAgICAgdG1wcmVnID0gMjA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0MnOgotCSAgICAgIHRtcHJlZyA9IDUwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICczJzoKLQkgICAgZGVmYXVsdDoKLQkgICAgICB0bXByZWcgPSA4MDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgdG1wcmVnID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgdG1wcmVnKTsKLQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JICAgIGFkZF9maXggKHNbMV0sICZvcFAtPmRpc3AsIDAsIDApOwotCSAgc3dpdGNoIChzWzFdKQotCSAgICB7Ci0JICAgIGNhc2UgJ2InOgkJLyogRGFuZ2VyOiAgVGhlc2UgZG8gbm8gY2hlY2sgZm9yCi0JCQkJICAgY2VydGFpbiB0eXBlcyBvZiBvdmVyZmxvdy4KLQkJCQkgICB1c2VyIGJld2FyZSEgKi8KLQkgICAgICBpZiAoIWlzYnl0ZSAodG1wcmVnKSkKLQkJb3BQLT5lcnJvciA9IF8oIm91dCBvZiByYW5nZSIpOwotCSAgICAgIGluc29wICh0bXByZWcsIG9wY29kZSk7Ci0JICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWwgLSAxXS5uID0KLQkJICAob3Bjb2RlLT5tX2NvZGVudW0pICogMiArIDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIGlmICghaXNzYnl0ZSAodG1wcmVnKSkKLQkJb3BQLT5lcnJvciA9IF8oIm91dCBvZiByYW5nZSIpOwotCSAgICAgIHRoZV9pbnMub3Bjb2RlW3RoZV9pbnMubnVtbyAtIDFdIHw9IHRtcHJlZyAmIDB4ZmY7Ci0JICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWwgLSAxXS5uID0gb3Bjb2RlLT5tX2NvZGVudW0gKiAyIC0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAndyc6Ci0JICAgICAgaWYgKCFpc3dvcmQgKHRtcHJlZykpCi0JCW9wUC0+ZXJyb3IgPSBfKCJvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOwotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCXRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsIC0gMV0ubiA9IChvcGNvZGUtPm1fY29kZW51bSkgKiAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdXJzoKLQkgICAgICBpZiAoIWlzc3dvcmQgKHRtcHJlZykpCi0JCW9wUC0+ZXJyb3IgPSBfKCJvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOwotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCXRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsIC0gMV0ubiA9IChvcGNvZGUtPm1fY29kZW51bSkgKiAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdsJzoKLQkgICAgICAvKiBCZWNhdXNlIG9mIHRoZSB3YXkgaW5zb3Agd29ya3MsIHdlIHB1dCB0aGVzZSB0d28gb3V0Ci0JCSBiYWNrd2FyZHMuICAqLwotCSAgICAgIGluc29wICh0bXByZWcsIG9wY29kZSk7Ci0JICAgICAgaW5zb3AgKHRtcHJlZyA+PiAxNiwgb3Bjb2RlKTsKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCAtIDFdLm4gPSAob3Bjb2RlLT5tX2NvZGVudW0pICogMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMyc6Ci0JICAgICAgdG1wcmVnICY9IDB4RkY7Ci0JICAgIGNhc2UgJzgnOgotCSAgICBjYXNlICdDJzoKLQkgICAgY2FzZSAnaic6Ci0JICAgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJysnOgotCWNhc2UgJy0nOgotCWNhc2UgJ0EnOgotCWNhc2UgJ2EnOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIEFERFIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdCJzoKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQkgIHN3aXRjaCAoc1sxXSkKLQkgICAgewotCSAgICBjYXNlICdCJzoKLQkgICAgICAvKiBUaGUgcGNfZml4IGFyZ3VtZW50IHdpbmRzIHVwIGluIGZ4X3BjcmVsX2FkanVzdCwKLSAgICAgICAgICAgICAgICAgd2hpY2ggaXMgYSBjaGFyLCBhbmQgbWF5IHRoZXJlZm9yZSBiZSB1bnNpZ25lZC4gIFdlCi0gICAgICAgICAgICAgICAgIHdhbnQgdG8gcGFzcyAtMSwgYnV0IHdlIHBhc3MgNjQgaW5zdGVhZCwgYW5kIGNvbnZlcnQKLSAgICAgICAgICAgICAgICAgYmFjayBpbiBtZF9wY3JlbF9mcm9tLiAgKi8KLQkgICAgICBhZGRfZml4ICgnQicsICZvcFAtPmRpc3AsIDEsIDY0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkgICAgICBhZGR3b3JkICgwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnTCc6Ci0JICAgIGxvbmdfYnJhbmNoOgotCSAgICAgIGlmICghSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JCWFzX3dhcm4gKF8oIkNhbid0IHVzZSBsb25nIGJyYW5jaGVzIG9uIDY4MDAwLzY4MDEwLzUyMDAiKSk7Ci0JICAgICAgdGhlX2lucy5vcGNvZGVbdGhlX2lucy5udW1vIC0gMV0gfD0gMHhmZjsKLQkgICAgICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDEsIDApOwotCSAgICAgIGFkZHdvcmQgKDApOwotCSAgICAgIGFkZHdvcmQgKDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdnJzoKLQkgICAgICBpZiAoc3VicyAoJm9wUC0+ZGlzcCkpCS8qIFdlIGNhbid0IHJlbGF4IGl0ICovCi0JCWdvdG8gbG9uZ19icmFuY2g7Ci0KLSNpZmRlZiBPQkpfRUxGCi0JICAgICAgLyogSWYgdGhlIGRpc3BsYWNlbWVudCBuZWVkcyBwaWMgcmVsb2NhdGlvbiBpdCBjYW5ub3QgYmUKLQkJIHJlbGF4ZWQuICAqLwotCSAgICAgIGlmIChvcFAtPmRpc3AucGljX3JlbG9jICE9IHBpY19ub25lKQotCQlnb3RvIGxvbmdfYnJhbmNoOwotI2VuZGlmCi0KLQkgICAgICAvKiBUaGlzIGNvdWxkIGVpdGhlciBiZSBhIHN5bWJvbCwgb3IgYW4gYWJzb2x1dGUKLQkJIGFkZHJlc3MuICBObyBtYXR0ZXIsIHRoZSBmcmFnIGhhY2tpbmcgd2lsbCBmaW5nZXIgaXQKLQkJIG91dC4gIE5vdCBxdWl0ZTogaXQgY2FuJ3Qgc3dpdGNoIGZyb20gQlJBTkNIIHRvCi0JCSBCQ0M2ODAwMCBmb3IgdGhlIGNhc2Ugd2hlcmUgb3BuZCBpcyBhYnNvbHV0ZSAoaXQKLQkJIG5lZWRzIHRvIHVzZSB0aGUgNjgwMDAgaGFjayBzaW5jZSBubyBjb25kaXRpb25hbCBhYnMKLQkJIGp1bXBzKS4gICovCi0JICAgICAgaWYgKCggIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpCi0JCSAgIHx8ICgwID09IGFkZHMgKCZvcFAtPmRpc3ApKSkKLQkJICAmJiAodGhlX2lucy5vcGNvZGVbMF0gPj0gMHg2MjAwKQotCQkgICYmICh0aGVfaW5zLm9wY29kZVswXSA8PSAweDZmMDApKQotCQlhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksIG9mZnMgKCZvcFAtPmRpc3ApLAotCQkJICBUQUIgKEJDQzY4MDAwLCBTWl9VTkRFRikpOwotCSAgICAgIGVsc2UKLQkJYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLCBvZmZzICgmb3BQLT5kaXNwKSwKLQkJCSAgVEFCIChBQlJBTkNILCBTWl9VTkRFRikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd3JzoKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl7Ci0jaWYgMQotCQkgIC8qIGNoZWNrIGZvciBEQmNjIGluc3RydWN0aW9uICovCi0JCSAgaWYgKCh0aGVfaW5zLm9wY29kZVswXSAmIDB4ZjBmOCkgPT0gMHg1MGM4KQotCQkgICAgewotCQkgICAgICAvKiBzaXplIHZhcmllcyBpZiBwYXRjaCAqLwotCQkgICAgICAvKiBuZWVkZWQgZm9yIGxvbmcgZm9ybSAqLwotCQkgICAgICBhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksIG9mZnMgKCZvcFAtPmRpc3ApLAotCQkJCVRBQiAoREJDQywgU1pfVU5ERUYpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0jZW5kaWYKLQkJICBhZGRfZml4ICgndycsICZvcFAtPmRpc3AsIDEsIDApOwotCQl9Ci0JICAgICAgYWRkd29yZCAoMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0MnOgkJLyogRml4ZWQgc2l6ZSBMT05HIGNvcHJvYyBicmFuY2hlcyAqLwotCSAgICAgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JICAgICAgYWRkd29yZCAoMCk7Ci0JICAgICAgYWRkd29yZCAoMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2MnOgkJLyogVmFyIHNpemUgQ29wcm9jZXNzc29yIGJyYW5jaGVzICovCi0JICAgICAgaWYgKHN1YnMgKCZvcFAtPmRpc3ApKQotCQl7Ci0JCSAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkJICBhZGRfZnJhZyAoKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIDAsIFRBQiAoRkJSQU5DSCwgTE9ORykpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoYWRkcyAoJm9wUC0+ZGlzcCkpCi0JCWFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwgb2ZmcyAoJm9wUC0+ZGlzcCksCi0JCQkgIFRBQiAoRkJSQU5DSCwgU1pfVU5ERUYpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBhZGRfZnJhZyAoKHN5bWJvbFMgKikgMCwgb2ZmcyAoJm9wUC0+ZGlzcCksCi0JCSAgICAgCSAgICAgICBUQUIoRkJSQU5DSCxTSE9SVCkpOyAqLwotCQkgIHRoZV9pbnMub3Bjb2RlW3RoZV9pbnMubnVtbyAtIDFdIHw9IDB4NDA7Ci0JCSAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkJICBhZGR3b3JkICgwKTsKLQkJICBhZGR3b3JkICgwKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgkJLyogSWdub3JlIGl0ICovCi0JICBicmVhazsKLQotCWNhc2UgJ2QnOgkJLyogSkYgdGhpcyBpcyBhIGtsdWRnZSAqLwotCSAgaW5zdGFsbF9vcGVyYW5kICgncycsIG9wUC0+cmVnIC0gQUREUik7Ci0JICB0bXByZWcgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0JICBpZiAoIWlzc3dvcmQgKHRtcHJlZykpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJFeHByZXNzaW9uIG91dCBvZiByYW5nZSwgdXNpbmcgMCIpKTsKLQkgICAgICB0bXByZWcgPSAwOwotCSAgICB9Ci0JICBhZGR3b3JkICh0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdEJzoKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgb3BQLT5yZWcgLSBEQVRBKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRSc6CQkvKiBJZ25vcmUgaXQgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSAnRic6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gRlAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRyc6CQkvKiBJZ25vcmUgaXQgKi8KLQljYXNlICdIJzoKLQkgIGJyZWFrOwotCi0JY2FzZSAnSSc6Ci0JICB0bXByZWcgPSBvcFAtPnJlZyAtIENPUDA7Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0onOgkJLyogSkYgZm9vICovCi0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgU0ZDOgotCSAgICAgIHRtcHJlZyA9IDB4MDAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERGQzoKLQkgICAgICB0bXByZWcgPSAweDAwMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDQUNSOgotCSAgICAgIHRtcHJlZyA9IDB4MDAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFRDOgotCSAgICAgIHRtcHJlZyA9IDB4MDAzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElUVDA6Ci0JICAgICAgdG1wcmVnID0gMHgwMDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSVRUMToKLQkgICAgICB0bXByZWcgPSAweDAwNTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEVFQwOgotCSAgICAgIHRtcHJlZyA9IDB4MDA2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERUVDE6Ci0JICAgICAgdG1wcmVnID0gMHgwMDc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQlVTQ1I6Ci0JICAgICAgdG1wcmVnID0gMHgwMDg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBVU1A6Ci0JICAgICAgdG1wcmVnID0gMHg4MDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVkJSOgotCSAgICAgIHRtcHJlZyA9IDB4ODAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENBQVI6Ci0JICAgICAgdG1wcmVnID0gMHg4MDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTVNQOgotCSAgICAgIHRtcHJlZyA9IDB4ODAzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElTUDoKLQkgICAgICB0bXByZWcgPSAweDgwNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBNTVVTUjoKLQkgICAgICB0bXByZWcgPSAweDgwNTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBVUlA6Ci0JICAgICAgdG1wcmVnID0gMHg4MDY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1JQOgotCSAgICAgIHRtcHJlZyA9IDB4ODA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUjoKLQkgICAgICB0bXByZWcgPSAweDgwODsKLQkgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUk9NQkFSOgotCSAgICAgIHRtcHJlZyA9IDB4QzAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJBTUJBUjA6Ci0JICAgICAgdG1wcmVnID0gMHhDMDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkFNQkFSMToKLQkgICAgICB0bXByZWcgPSAweEMwNTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBNQkFSOgotCSAgICAgIHRtcHJlZyA9IDB4QzBGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2snOgotCSAgdG1wcmVnID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgNTUpOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcgJiAweDdmKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbCc6Ci0JICB0bXByZWcgPSBvcFAtPm1hc2s7Ci0JICBpZiAoc1sxXSA9PSAndycpCi0JICAgIHsKLQkgICAgICBpZiAodG1wcmVnICYgMHg3RkYwMDAwKQotCQlhc19iYWQgKF8oIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHJlZ2lzdGVyIGxpc3QiKSk7Ci0JICAgICAgaW5zb3AgKHJldmVyc2VfMTZfYml0cyAodG1wcmVnKSwgb3Bjb2RlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHRtcHJlZyAmIDB4NzAwRkZGRikKLQkJYXNfYmFkIChfKCJXcm9uZyByZWdpc3RlciBpbiBmbG9hdGluZy1wb2ludCByZWdsaXN0IikpOwotCSAgICAgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgcmV2ZXJzZV84X2JpdHMgKHRtcHJlZyA+PiAxNikpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0wnOgotCSAgdG1wcmVnID0gb3BQLT5tYXNrOwotCSAgaWYgKHNbMV0gPT0gJ3cnKQotCSAgICB7Ci0JICAgICAgaWYgKHRtcHJlZyAmIDB4N0ZGMDAwMCkKLQkJYXNfYmFkIChfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiByZWdpc3RlciBsaXN0IikpOwotCSAgICAgIGluc29wICh0bXByZWcsIG9wY29kZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNbMV0gPT0gJzgnKQotCSAgICB7Ci0JICAgICAgaWYgKHRtcHJlZyAmIDB4MEZGRkZGRikKLQkJYXNfYmFkIChfKCJpbmNvcnJlY3QgcmVnaXN0ZXIgaW4gcmVnbGlzdCIpKTsKLQkgICAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyA+PiAyNCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDcwMEZGRkYpCi0JCWFzX2JhZCAoXygid3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIpKTsKLQkgICAgICBlbHNlCi0JCWluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnID4+IDE2KTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdNJzoKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgZ2V0X251bSAoJm9wUC0+ZGlzcCwgNjApKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTyc6Ci0JICB0bXByZWcgPSAoKG9wUC0+bW9kZSA9PSBEUkVHKQotCQkgICAgPyAweDIwICsgb3BQLT5yZWcgLSBEQVRBCi0JCSAgICA6IChnZXRfbnVtICgmb3BQLT5kaXNwLCA0MCkgJiAweDFGKSk7Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1EnOgotCSAgdG1wcmVnID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgMTApOwotCSAgaWYgKHRtcHJlZyA9PSA4KQotCSAgICB0bXByZWcgPSAwOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdSJzoKLQkgIC8qIFRoaXMgZGVwZW5kcyBvbiB0aGUgZmFjdCB0aGF0IEFERFIgcmVnaXN0ZXJzIGFyZSBlaWdodAotCSAgICAgbW9yZSB0aGFuIHRoZWlyIGNvcnJlc3BvbmRpbmcgREFUQSByZWdzLCBzbyB0aGUgcmVzdWx0Ci0JICAgICB3aWxsIGhhdmUgdGhlIEFERFJfUkVHIGJpdCBzZXQgKi8KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgb3BQLT5yZWcgLSBEQVRBKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAncic6Ci0JICBpZiAob3BQLT5tb2RlID09IEFJTkRSKQotCSAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQSk7Ci0JICBlbHNlCi0JICAgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgb3BQLT5pbmRleC5yZWcgLSBEQVRBKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAncyc6Ci0JICBpZiAob3BQLT5yZWcgPT0gRlBJKQotCSAgICB0bXByZWcgPSAweDE7Ci0JICBlbHNlIGlmIChvcFAtPnJlZyA9PSBGUFMpCi0JICAgIHRtcHJlZyA9IDB4MjsKLQkgIGVsc2UgaWYgKG9wUC0+cmVnID09IEZQQykKLQkgICAgdG1wcmVnID0gMHg0OwotCSAgZWxzZQotCSAgICBhYm9ydCAoKTsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUyc6CQkvKiBJZ25vcmUgaXQgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSAnVCc6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIGdldF9udW0gKCZvcFAtPmRpc3AsIDMwKSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1UnOgkJLyogSWdub3JlIGl0ICovCi0JICBicmVhazsKLQotCWNhc2UgJ2MnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIE5DOgotCSAgICAgIHRtcHJlZyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgREM6Ci0JICAgICAgdG1wcmVnID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJQzoKLQkgICAgICB0bXByZWcgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJDOgotCSAgICAgIHRtcHJlZyA9IDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2siKSk7Ci0JICAgIH0JCQkvKiBzd2l0Y2ggb24gY2FjaGUgdG9rZW4gKi8KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotI2lmbmRlZiBOT182ODg1MQotCSAgLyogSkY6IFRoZXNlIGFyZSBvdXQgb2Ygb3JkZXIsIEkgZmVhci4gKi8KLQljYXNlICdmJzoKLQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JICAgIHsKLQkgICAgY2FzZSBTRkM6Ci0JICAgICAgdG1wcmVnID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBERkM6Ci0JICAgICAgdG1wcmVnID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICcwJzoKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JICAgIHsKLQkgICAgY2FzZSBUQzoKLQkgICAgICB0bXByZWcgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENBTDoKLQkgICAgICB0bXByZWcgPSA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZBTDoKLQkgICAgICB0bXByZWcgPSA1OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNDQzoKLQkgICAgICB0bXByZWcgPSA2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFDOgotCSAgICAgIHRtcHJlZyA9IDc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVic6Ci0JICBpZiAob3BQLT5yZWcgPT0gVkFMKQotCSAgICBicmVhazsKLQkgIGFib3J0ICgpOwotCi0JY2FzZSAnVyc6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgRFJQOgotCSAgICAgIHRtcHJlZyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1JQOgotCSAgICAgIHRtcHJlZyA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ1JQOgotCSAgICAgIHRtcHJlZyA9IDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnWCc6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgQkFEOgotCSAgICBjYXNlIEJBRCArIDE6Ci0JICAgIGNhc2UgQkFEICsgMjoKLQkgICAgY2FzZSBCQUQgKyAzOgotCSAgICBjYXNlIEJBRCArIDQ6Ci0JICAgIGNhc2UgQkFEICsgNToKLQkgICAgY2FzZSBCQUQgKyA2OgotCSAgICBjYXNlIEJBRCArIDc6Ci0JICAgICAgdG1wcmVnID0gKDQgPDwgMTApIHwgKChvcFAtPnJlZyAtIEJBRCkgPDwgMik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBCQUM6Ci0JICAgIGNhc2UgQkFDICsgMToKLQkgICAgY2FzZSBCQUMgKyAyOgotCSAgICBjYXNlIEJBQyArIDM6Ci0JICAgIGNhc2UgQkFDICsgNDoKLQkgICAgY2FzZSBCQUMgKyA1OgotCSAgICBjYXNlIEJBQyArIDY6Ci0JICAgIGNhc2UgQkFDICsgNzoKLQkgICAgICB0bXByZWcgPSAoNSA8PCAxMCkgfCAoKG9wUC0+cmVnIC0gQkFDKSA8PCAyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQljYXNlICdZJzoKLQkgIGtub3cgKG9wUC0+cmVnID09IFBTUik7Ci0JICBicmVhazsKLQljYXNlICdaJzoKLQkgIGtub3cgKG9wUC0+cmVnID09IFBDU1IpOwotCSAgYnJlYWs7Ci0jZW5kaWYgLyogbTY4ODUxICovCi0JY2FzZSAnMyc6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgVFQwOgotCSAgICAgIHRtcHJlZyA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVFQxOgotCSAgICAgIHRtcHJlZyA9IDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgdG1wcmVnID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgMjApOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnXyc6CS8qIHVzZWQgb25seSBmb3IgbW92ZTE2IGFic29sdXRlIDMyLWJpdCBhZGRyZXNzICovCi0JICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCSAgICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDAsIDApOwotCSAgdG1wcmVnID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgYWRkd29yZCAodG1wcmVnID4+IDE2KTsKLQkgIGFkZHdvcmQgKHRtcHJlZyAmIDB4RkZGRik7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgb3BQLT5yZWcgLSBEQVRBMEwpOwotCSAgb3BQLT5yZWcgLT0gKERBVEEwTCk7Ci0JICBvcFAtPnJlZyAmPSAweDBGOwkvKiByZW1vdmUgdXBwZXIvbG93ZXIgYml0ICovCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICAvKiBCeSB0aGUgdGltZSB3aGUgZ2V0IGhlcmUgKEZJTkFMTFkpIHRoZV9pbnMgY29udGFpbnMgdGhlIGNvbXBsZXRlCi0gICAgIGluc3RydWN0aW9uLCByZWFkeSB0byBiZSBlbWl0dGVkLiAuIC4gKi8KLX0KLQotc3RhdGljIGludAotcmV2ZXJzZV8xNl9iaXRzIChpbikKLSAgICAgaW50IGluOwotewotICBpbnQgb3V0ID0gMDsKLSAgaW50IG47Ci0KLSAgc3RhdGljIGludCBtYXNrWzE2XSA9Ci0gIHsKLSAgICAweDAwMDEsIDB4MDAwMiwgMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwKLSAgICAweDAxMDAsIDB4MDIwMCwgMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAsIDB4ODAwMAotICB9OwotICBmb3IgKG4gPSAwOyBuIDwgMTY7IG4rKykKLSAgICB7Ci0gICAgICBpZiAoaW4gJiBtYXNrW25dKQotCW91dCB8PSBtYXNrWzE1IC0gbl07Ci0gICAgfQotICByZXR1cm4gb3V0OwotfQkJCQkvKiByZXZlcnNlXzE2X2JpdHMoKSAqLwotCi1zdGF0aWMgaW50Ci1yZXZlcnNlXzhfYml0cyAoaW4pCi0gICAgIGludCBpbjsKLXsKLSAgaW50IG91dCA9IDA7Ci0gIGludCBuOwotCi0gIHN0YXRpYyBpbnQgbWFza1s4XSA9Ci0gIHsKLSAgICAweDAwMDEsIDB4MDAwMiwgMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwKLSAgfTsKLQotICBmb3IgKG4gPSAwOyBuIDwgODsgbisrKQotICAgIHsKLSAgICAgIGlmIChpbiAmIG1hc2tbbl0pCi0Jb3V0IHw9IG1hc2tbNyAtIG5dOwotICAgIH0KLSAgcmV0dXJuIG91dDsKLX0JCQkJLyogcmV2ZXJzZV84X2JpdHMoKSAqLwotCi0vKiBDYXVzZSBhbiBleHRyYSBmcmFnIHRvIGJlIGdlbmVyYXRlZCBoZXJlLCBpbnNlcnRpbmcgdXAgdG8gMTAgYnl0ZXMKLSAgICh0aGF0IHZhbHVlIGlzIGNob3NlbiBpbiB0aGUgZnJhZ192YXIgY2FsbCBpbiBtZF9hc3NlbWJsZSkuICBUWVBFCi0gICBpcyB0aGUgc3VidHlwZSBvZiB0aGUgZnJhZyB0byBiZSBnZW5lcmF0ZWQ7IGl0cyBwcmltYXJ5IHR5cGUgaXMKLSAgIHJzX21hY2hpbmVfZGVwZW5kZW50LgotCi0gICBUaGUgVFlQRSBwYXJhbWV0ZXIgaXMgYWxzbyB1c2VkIGJ5IG1kX2NvbnZlcnRfZnJhZ18xIGFuZAotICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXguICBUaGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBmaXh1cCB3aWxsCi0gICBiZSBlbWl0dGVkIGJ5IG1kX2NvbnZlcnRfZnJhZ18xLgotCi0gICBBREQgYmVjb21lcyB0aGUgRlJfU1lNQk9MIGZpZWxkIG9mIHRoZSBmcmFnLCBhbmQgT0ZGIHRoZSBGUl9PRkZTRVQuICAqLwotc3RhdGljIHZvaWQKLWluc3RhbGxfb3BlcmFuZCAobW9kZSwgdmFsKQotICAgICBpbnQgbW9kZTsKLSAgICAgaW50IHZhbDsKLXsKLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBjYXNlICdzJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCAmIDB4RkY7CS8qIEpGIEZGIGlzIGZvciBNIGtsdWRnZSAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWwgPDwgOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzEnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnMic6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzMnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsyXSB8PSB2YWwgPDwgMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICc1JzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzJdIHw9IHZhbCA8PCA2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnNic6Ci0gICAgICAvKiBEQU5HRVIhICBUaGlzIGlzIGEgaGFjayB0byBmb3JjZSBjYXMybCBhbmQgY2FzMncgY21kcyB0byBiZQotCSB0aHJlZSB3b3JkcyBsb25nISAqLwotICAgICAgdGhlX2lucy5udW1vKys7Ci0gICAgICB0aGVfaW5zLm9wY29kZVsyXSB8PSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICc3JzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCA3OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnOCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgMTA7Ci0gICAgICBicmVhazsKLSNpZm5kZWYgTk9fNjg4NTEKLSAgICBjYXNlICc5JzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCA1OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgJ3QnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKHZhbCA8PCAxMCkgfCAodmFsIDw8IDcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAodmFsIDw8IDEyKSB8IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsID0gMHhmZjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsIDw8IDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdDJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2onOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsOwotICAgICAgdGhlX2lucy5udW1vKys7CQkvKiBXaGF0IGEgaGFjayAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnayc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgIGNhc2UgJ3cnOgotICAgIGNhc2UgJ1cnOgotICAgIGNhc2UgJ2wnOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAodmFsIDw8IDYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnTCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSA9ICh2YWwgPj4gMTYpOwotICAgICAgdGhlX2lucy5vcGNvZGVbMl0gPSB2YWwgJiAweGZmZmY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdtJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9ICgodmFsICYgMHg4KSA8PCAoNiAtIDMpKTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9ICgodmFsICYgMHg3KSA8PCA5KTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICgodmFsICYgMHgxMCkgPDwgKDcgLSA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICduJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9ICgodmFsICYgMHg4KSA8PCAoNiAtIDMpKTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9ICgodmFsICYgMHg3KSA8PCA5KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ28nOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDEyOwotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKCh2YWwgJiAweDEwKSA8PCAoNyAtIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ00nOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKHZhbCAmIDB4Rik7Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAoKHZhbCAmIDB4MTApIDw8ICg2IC0gNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnTic6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAodmFsICYgMHhGKTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICgodmFsICYgMHgxMCkgPDwgKDYgLSA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdoJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICgodmFsICE9IDEpIDw8IDEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2MnOgotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0gICAgfQotfQkJCQkvKiBpbnN0YWxsX29wZXJhbmQoKSAqLwotCi1zdGF0aWMgdm9pZAotaW5zdGFsbF9nZW5fb3BlcmFuZCAobW9kZSwgdmFsKQotICAgICBpbnQgbW9kZTsKLSAgICAgaW50IHZhbDsKLXsKLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBjYXNlICdzJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgLyogVGhpcyBpcyBhIGtsdWRnZSEhISAqLwotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKHZhbCAmIDB4MDcpIDw8IDkgfCAodmFsICYgMHgzOCkgPDwgMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgIGNhc2UgJ3cnOgotICAgIGNhc2UgJ2wnOgotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ3AnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgICAvKiBtb3JlIHN0dWZmIGdvZXMgaGVyZSAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0gICAgfQotfQkJCQkvKiBpbnN0YWxsX2dlbl9vcGVyYW5kKCkgKi8KLQotLyoKLSAqIHZlcmlmeSB0aGF0IHdlIGhhdmUgc29tZSBudW1iZXIgb2YgcGFyZW4gcGFpcnMsIGRvIG02OGtfaXBfb3AoKSwgYW5kCi0gKiB0aGVuIGRlYWwgd2l0aCB0aGUgYml0ZmllbGQgaGFjay4KLSAqLwotCi1zdGF0aWMgY2hhciAqCi1jcmFja19vcGVyYW5kIChzdHIsIG9wUCkKLSAgICAgcmVnaXN0ZXIgY2hhciAqc3RyOwotICAgICByZWdpc3RlciBzdHJ1Y3QgbTY4a19vcCAqb3BQOwotewotICByZWdpc3RlciBpbnQgcGFyZW5zOwotICByZWdpc3RlciBpbnQgYzsKLSAgcmVnaXN0ZXIgY2hhciAqYmVnX3N0cjsKLSAgaW50IGlucXVvdGUgPSAwOwotCi0gIGlmICghc3RyKQotICAgIHsKLSAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotICBiZWdfc3RyID0gc3RyOwotICBmb3IgKHBhcmVucyA9IDA7ICpzdHIgJiYgKHBhcmVucyA+IDAgfHwgaW5xdW90ZSB8fCBub3RlbmQgKHN0cikpOyBzdHIrKykKLSAgICB7Ci0gICAgICBpZiAoISBpbnF1b3RlKQotCXsKLQkgIGlmICgqc3RyID09ICcoJykKLQkgICAgcGFyZW5zKys7Ci0JICBlbHNlIGlmICgqc3RyID09ICcpJykKLQkgICAgewotCSAgICAgIGlmICghcGFyZW5zKQotCQl7CQkJLyogRVJST1IgKi8KLQkJICBvcFAtPmVycm9yID0gXygiRXh0cmEgKSIpOwotCQkgIHJldHVybiBzdHI7Ci0JCX0KLQkgICAgICAtLXBhcmVuczsKLQkgICAgfQotCX0KLSAgICAgIGlmIChmbGFnX21yaSAmJiAqc3RyID09ICdcJycpCi0JaW5xdW90ZSA9ICEgaW5xdW90ZTsKLSAgICB9Ci0gIGlmICghKnN0ciAmJiBwYXJlbnMpCi0gICAgewkJCQkvKiBFUlJPUiAqLwotICAgICAgb3BQLT5lcnJvciA9IF8oIk1pc3NpbmcgKSIpOwotICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0gIGMgPSAqc3RyOwotICAqc3RyID0gJ1wwJzsKLSAgaWYgKG02OGtfaXBfb3AgKGJlZ19zdHIsIG9wUCkgIT0gMCkKLSAgICB7Ci0gICAgICAqc3RyID0gYzsKLSAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotICAqc3RyID0gYzsKLSAgaWYgKGMgPT0gJ30nKQotICAgIGMgPSAqKytzdHI7CQkJLyogSkYgYml0ZmllbGQgaGFjayAqLwotICBpZiAoYykKLSAgICB7Ci0gICAgICBjID0gKisrc3RyOwotICAgICAgaWYgKCFjKQotCWFzX2JhZCAoXygiTWlzc2luZyBvcGVyYW5kIikpOwotICAgIH0KLQotICAvKiBEZXRlY3QgTVJJIFJFRyBzeW1ib2xzIGFuZCBjb252ZXJ0IHRoZW0gdG8gUkVHTFNUcy4gICovCi0gIGlmIChvcFAtPm1vZGUgPT0gQ09OVFJPTCAmJiAoaW50KW9wUC0+cmVnIDwgMCkKLSAgICB7Ci0gICAgICBvcFAtPm1vZGUgPSBSRUdMU1Q7Ci0gICAgICBvcFAtPm1hc2sgPSB+KGludClvcFAtPnJlZzsKLSAgICAgIG9wUC0+cmVnID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAgICovCi0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfcmVnIChyZWduYW1lLCByZWdudW0pCi0gICAgIGNvbnN0IGNoYXIgKnJlZ25hbWU7Ci0gICAgIGludCByZWdudW07Ci17Ci0gIGNoYXIgYnVmWzEwMF07Ci0gIGludCBpOwotCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0gIGlmICghZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsKQotICAgIHsKLSAgICAgIGJ1ZlswXSA9IFJFR0lTVEVSX1BSRUZJWDsKLSAgICAgIHN0cmNweSAoYnVmICsgMSwgcmVnbmFtZSk7Ci0gICAgICByZWduYW1lID0gYnVmOwotICAgIH0KLSNlbmRpZgotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKHJlZ25hbWUsIHJlZ19zZWN0aW9uLCByZWdudW0sCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0KLSAgZm9yIChpID0gMDsgcmVnbmFtZVtpXTsgaSsrKQotICAgIGJ1ZltpXSA9IGlzbG93ZXIgKHJlZ25hbWVbaV0pID8gdG91cHBlciAocmVnbmFtZVtpXSkgOiByZWduYW1lW2ldOwotICBidWZbaV0gPSAnXDAnOwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKGJ1ZiwgcmVnX3NlY3Rpb24sIHJlZ251bSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLX0KLQotc3RydWN0IGluaXRfZW50cnkKLSAgewotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgaW50IG51bWJlcjsKLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpbml0X2VudHJ5IGluaXRfdGFibGVbXSA9Ci17Ci0gIHsgImQwIiwgREFUQTAgfSwKLSAgeyAiZDEiLCBEQVRBMSB9LAotICB7ICJkMiIsIERBVEEyIH0sCi0gIHsgImQzIiwgREFUQTMgfSwKLSAgeyAiZDQiLCBEQVRBNCB9LAotICB7ICJkNSIsIERBVEE1IH0sCi0gIHsgImQ2IiwgREFUQTYgfSwKLSAgeyAiZDciLCBEQVRBNyB9LAotICB7ICJhMCIsIEFERFIwIH0sCi0gIHsgImExIiwgQUREUjEgfSwKLSAgeyAiYTIiLCBBRERSMiB9LAotICB7ICJhMyIsIEFERFIzIH0sCi0gIHsgImE0IiwgQUREUjQgfSwKLSAgeyAiYTUiLCBBRERSNSB9LAotICB7ICJhNiIsIEFERFI2IH0sCi0gIHsgImZwIiwgQUREUjYgfSwKLSAgeyAiYTciLCBBRERSNyB9LAotICB7ICJzcCIsIEFERFI3IH0sCi0gIHsgInNzcCIsIEFERFI3IH0sCi0gIHsgImZwMCIsIEZQMCB9LAotICB7ICJmcDEiLCBGUDEgfSwKLSAgeyAiZnAyIiwgRlAyIH0sCi0gIHsgImZwMyIsIEZQMyB9LAotICB7ICJmcDQiLCBGUDQgfSwKLSAgeyAiZnA1IiwgRlA1IH0sCi0gIHsgImZwNiIsIEZQNiB9LAotICB7ICJmcDciLCBGUDcgfSwKLSAgeyAiZnBpIiwgRlBJIH0sCi0gIHsgImZwaWFyIiwgRlBJIH0sCi0gIHsgImZwYyIsIEZQSSB9LAotICB7ICJmcHMiLCBGUFMgfSwKLSAgeyAiZnBzciIsIEZQUyB9LAotICB7ICJmcGMiLCBGUEMgfSwKLSAgeyAiZnBjciIsIEZQQyB9LAotICB7ICJjb250cm9sIiwgRlBDIH0sCi0gIHsgInN0YXR1cyIsIEZQUyB9LAotICB7ICJpYWRkciIsIEZQSSB9LAotCi0gIHsgImNvcDAiLCBDT1AwIH0sCi0gIHsgImNvcDEiLCBDT1AxIH0sCi0gIHsgImNvcDIiLCBDT1AyIH0sCi0gIHsgImNvcDMiLCBDT1AzIH0sCi0gIHsgImNvcDQiLCBDT1A0IH0sCi0gIHsgImNvcDUiLCBDT1A1IH0sCi0gIHsgImNvcDYiLCBDT1A2IH0sCi0gIHsgImNvcDciLCBDT1A3IH0sCi0gIHsgInBjIiwgUEMgfSwKLSAgeyAienBjIiwgWlBDIH0sCi0gIHsgInNyIiwgU1IgfSwKLQotICB7ICJjY3IiLCBDQ1IgfSwKLSAgeyAiY2MiLCBDQ1IgfSwKLQotICB7ICJhY2MiLCBBQ0MgfSwKLSAgeyAibWFjc3IiLCBNQUNTUiB9LAotICB7ICJtYXNrIiwgTUFTSyB9LAotCi0gIC8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0gIHsgInNmYyIsIFNGQyB9LAkJLyogU291cmNlIEZ1bmN0aW9uIENvZGUgKi8KLSAgeyAic2ZjciIsIFNGQyB9LAotICB7ICJkZmMiLCBERkMgfSwJCS8qIERlc3RpbmF0aW9uIEZ1bmN0aW9uIENvZGUgKi8KLSAgeyAiZGZjciIsIERGQyB9LAotICB7ICJjYWNyIiwgQ0FDUiB9LAkJLyogQ2FjaGUgQ29udHJvbCBSZWdpc3RlciAqLwotICB7ICJjYWFyIiwgQ0FBUiB9LAkJLyogQ2FjaGUgQWRkcmVzcyBSZWdpc3RlciAqLwotCi0gIHsgInVzcCIsIFVTUCB9LAkJLyogVXNlciBTdGFjayBQb2ludGVyICovCi0gIHsgInZiciIsIFZCUiB9LAkJLyogVmVjdG9yIEJhc2UgUmVnaXN0ZXIgKi8KLSAgeyAibXNwIiwgTVNQIH0sCQkvKiBNYXN0ZXIgU3RhY2sgUG9pbnRlciAqLwotICB7ICJpc3AiLCBJU1AgfSwJCS8qIEludGVycnVwdCBTdGFjayBQb2ludGVyICovCi0KLSAgeyAiaXR0MCIsIElUVDAgfSwJCS8qIEluc3RydWN0aW9uIFRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIFJlZyAwICovCi0gIHsgIml0dDEiLCBJVFQxIH0sCQkvKiBJbnN0cnVjdGlvbiBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWcgMSAqLwotICB7ICJkdHQwIiwgRFRUMCB9LAkJLyogRGF0YSBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWdpc3RlciAwICovCi0gIHsgImR0dDEiLCBEVFQxIH0sCQkvKiBEYXRhIFRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIFJlZ2lzdGVyIDEgKi8KLQotICAvKiA2OGVjMDQwIHZlcnNpb25zIG9mIHNhbWUgKi8KLSAgeyAiaWFjcjAiLCBJVFQwIH0sCQkvKiBJbnN0cnVjdGlvbiBBY2Nlc3MgQ29udHJvbCBSZWdpc3RlciAwICovCi0gIHsgImlhY3IxIiwgSVRUMSB9LAkJLyogSW5zdHJ1Y3Rpb24gQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLwotICB7ICJkYWNyMCIsIERUVDAgfSwJCS8qIERhdGEgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLwotICB7ICJkYWNyMSIsIERUVDEgfSwJCS8qIERhdGEgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLwotCi0gIC8qIG1jZjUyMDAgdmVyc2lvbnMgb2Ygc2FtZS4gIFRoZSBDb2xkRmlyZSBwcm9ncmFtbWVyJ3MgcmVmZXJlbmNlCi0gICAgIG1hbnVhbCBpbmRpY2F0ZWQgdGhhdCB0aGUgb3JkZXIgaXMgMiwzLDAsMSwgYnV0IEtlbiBSb3NlCi0gICAgIDxyb3NlQG5ldGNvbS5jb20+IHNheXMgdGhhdCAwLDEsMiwzIGlzIHRoZSBjb3JyZWN0IG9yZGVyLiAgKi8KLSAgeyAiYWNyMCIsIElUVDAgfSwJCS8qIEFjY2VzcyBDb250cm9sIFVuaXQgMCAqLwotICB7ICJhY3IxIiwgSVRUMSB9LAkJLyogQWNjZXNzIENvbnRyb2wgVW5pdCAxICovCi0gIHsgImFjcjIiLCBEVFQwIH0sCQkvKiBBY2Nlc3MgQ29udHJvbCBVbml0IDIgKi8KLSAgeyAiYWNyMyIsIERUVDEgfSwJCS8qIEFjY2VzcyBDb250cm9sIFVuaXQgMyAqLwotCi0gIHsgInRjIiwgVEMgfSwJCQkvKiBNTVUgVHJhbnNsYXRpb24gQ29udHJvbCBSZWdpc3RlciAqLwotICB7ICJ0Y3IiLCBUQyB9LAotCi0gIHsgIm1tdXNyIiwgTU1VU1IgfSwJCS8qIE1NVSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSAgeyAic3JwIiwgU1JQIH0sCQkvKiBVc2VyIFJvb3QgUG9pbnRlciAqLwotICB7ICJ1cnAiLCBVUlAgfSwJCS8qIFN1cGVydmlzb3IgUm9vdCBQb2ludGVyICovCi0KLSAgeyAiYnVzY3IiLCBCVVNDUiB9LAotICB7ICJwY3IiLCBQQ1IgfSwKLQotICB7ICJyb21iYXIiLCBST01CQVIgfSwJCS8qIFJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSAgeyAicmFtYmFyMCIsIFJBTUJBUjAgfSwJLyogUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLwotICB7ICJyYW1iYXIxIiwgUkFNQkFSMSB9LAkvKiBST00gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0gIHsgIm1iYXIiLCBNQkFSIH0sCQkvKiBNb2R1bGUgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0gIC8qIGVuZCBvZiBjb250cm9sIHJlZ2lzdGVycyAqLwotCi0gIHsgImFjIiwgQUMgfSwKLSAgeyAiYmMiLCBCQyB9LAotICB7ICJjYWwiLCBDQUwgfSwKLSAgeyAiY3JwIiwgQ1JQIH0sCi0gIHsgImRycCIsIERSUCB9LAotICB7ICJwY3NyIiwgUENTUiB9LAotICB7ICJwc3IiLCBQU1IgfSwKLSAgeyAic2NjIiwgU0NDIH0sCi0gIHsgInZhbCIsIFZBTCB9LAotICB7ICJiYWQwIiwgQkFEMCB9LAotICB7ICJiYWQxIiwgQkFEMSB9LAotICB7ICJiYWQyIiwgQkFEMiB9LAotICB7ICJiYWQzIiwgQkFEMyB9LAotICB7ICJiYWQ0IiwgQkFENCB9LAotICB7ICJiYWQ1IiwgQkFENSB9LAotICB7ICJiYWQ2IiwgQkFENiB9LAotICB7ICJiYWQ3IiwgQkFENyB9LAotICB7ICJiYWMwIiwgQkFDMCB9LAotICB7ICJiYWMxIiwgQkFDMSB9LAotICB7ICJiYWMyIiwgQkFDMiB9LAotICB7ICJiYWMzIiwgQkFDMyB9LAotICB7ICJiYWM0IiwgQkFDNCB9LAotICB7ICJiYWM1IiwgQkFDNSB9LAotICB7ICJiYWM2IiwgQkFDNiB9LAotICB7ICJiYWM3IiwgQkFDNyB9LAotCi0gIHsgImljIiwgSUMgfSwKLSAgeyAiZGMiLCBEQyB9LAotICB7ICJuYyIsIE5DIH0sCi0KLSAgeyAidHQwIiwgVFQwIH0sCi0gIHsgInR0MSIsIFRUMSB9LAotICAvKiA2OGVjMDMwIHZlcnNpb25zIG9mIHNhbWUgKi8KLSAgeyAiYWMwIiwgVFQwIH0sCi0gIHsgImFjMSIsIFRUMSB9LAotICAvKiA2OGVjMDMwIGFjY2VzcyBjb250cm9sIHVuaXQsIGlkZW50aWNhbCB0byAwMzAgTU1VIHN0YXR1cyByZWcgKi8KLSAgeyAiYWN1c3IiLCBQU1IgfSwKLQotICAvKiBTdXBwcmVzc2VkIGRhdGEgYW5kIGFkZHJlc3MgcmVnaXN0ZXJzLiAgKi8KLSAgeyAiemQwIiwgWkRBVEEwIH0sCi0gIHsgInpkMSIsIFpEQVRBMSB9LAotICB7ICJ6ZDIiLCBaREFUQTIgfSwKLSAgeyAiemQzIiwgWkRBVEEzIH0sCi0gIHsgInpkNCIsIFpEQVRBNCB9LAotICB7ICJ6ZDUiLCBaREFUQTUgfSwKLSAgeyAiemQ2IiwgWkRBVEE2IH0sCi0gIHsgInpkNyIsIFpEQVRBNyB9LAotICB7ICJ6YTAiLCBaQUREUjAgfSwKLSAgeyAiemExIiwgWkFERFIxIH0sCi0gIHsgInphMiIsIFpBRERSMiB9LAotICB7ICJ6YTMiLCBaQUREUjMgfSwKLSAgeyAiemE0IiwgWkFERFI0IH0sCi0gIHsgInphNSIsIFpBRERSNSB9LAotICB7ICJ6YTYiLCBaQUREUjYgfSwKLSAgeyAiemE3IiwgWkFERFI3IH0sCi0KLSAgLyogVXBwZXIgYW5kIGxvd2VyIGRhdGEgYW5kIGFkZHJlc3MgcmVnaXN0ZXJzLCB1c2VkIGJ5IG1hY3cgYW5kIG1zYWN3LiAqLwotICB7ICJkMGwiLCBEQVRBMEwgfSwKLSAgeyAiZDFsIiwgREFUQTFMIH0sCi0gIHsgImQybCIsIERBVEEyTCB9LAotICB7ICJkM2wiLCBEQVRBM0wgfSwKLSAgeyAiZDRsIiwgREFUQTRMIH0sCi0gIHsgImQ1bCIsIERBVEE1TCB9LAotICB7ICJkNmwiLCBEQVRBNkwgfSwKLSAgeyAiZDdsIiwgREFUQTdMIH0sCi0KLSAgeyAiYTBsIiwgQUREUjBMIH0sCi0gIHsgImExbCIsIEFERFIxTCB9LAotICB7ICJhMmwiLCBBRERSMkwgfSwKLSAgeyAiYTNsIiwgQUREUjNMIH0sCi0gIHsgImE0bCIsIEFERFI0TCB9LAotICB7ICJhNWwiLCBBRERSNUwgfSwKLSAgeyAiYTZsIiwgQUREUjZMIH0sCi0gIHsgImE3bCIsIEFERFI3TCB9LAotCi0gIHsgImQwdSIsIERBVEEwVSB9LAotICB7ICJkMXUiLCBEQVRBMVUgfSwKLSAgeyAiZDJ1IiwgREFUQTJVIH0sCi0gIHsgImQzdSIsIERBVEEzVSB9LAotICB7ICJkNHUiLCBEQVRBNFUgfSwKLSAgeyAiZDV1IiwgREFUQTVVIH0sCi0gIHsgImQ2dSIsIERBVEE2VSB9LAotICB7ICJkN3UiLCBEQVRBN1UgfSwKLQotICB7ICJhMHUiLCBBRERSMFUgfSwKLSAgeyAiYTF1IiwgQUREUjFVIH0sCi0gIHsgImEydSIsIEFERFIyVSB9LAotICB7ICJhM3UiLCBBRERSM1UgfSwKLSAgeyAiYTR1IiwgQUREUjRVIH0sCi0gIHsgImE1dSIsIEFERFI1VSB9LAotICB7ICJhNnUiLCBBRERSNlUgfSwKLSAgeyAiYTd1IiwgQUREUjdVIH0sCi0KLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1pbml0X3JlZ3RhYmxlICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpbml0X3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICBpbnNlcnRfcmVnIChpbml0X3RhYmxlW2ldLm5hbWUsIGluaXRfdGFibGVbaV0ubnVtYmVyKTsKLX0KLQotc3RhdGljIGludCBub182ODg1MSwgbm9fNjg4ODE7Ci0KLSNpZmRlZiBPQkpfQU9VVAotLyogYS5vdXQgbWFjaGluZSB0eXBlLiAgRGVmYXVsdCB0byA2ODAyMC4gICovCi1pbnQgbTY4a19hb3V0X21hY2h0eXBlID0gMjsKLSNlbmRpZgotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNvbnN0IGNoYXIgKmVyOwotICBzaG9ydCAqZnJvbVA7Ci0gIGNoYXIgKnRvUCA9IE5VTEw7Ci0gIGludCBtLCBuID0gMDsKLSAgY2hhciAqdG9fYmVnX1A7Ci0gIGludCBzaG9ydHNfdGhpc19mcmFnOwotICBmaXhTICpmaXhQOwotCi0gIC8qIEluIE1SSSBtb2RlLCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIG9wZXJhbmRzIGFyZSBzZXBhcmF0ZWQgYnkgYQotICAgICBzcGFjZS4gIEFueXRoaW5nIGZvbGxvd2luZyB0aGUgb3BlcmFuZHMgaXMgYSBjb21tZW50LiAgVGhlIGxhYmVsCi0gICAgIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZC4gICovCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgaW50IGZpZWxkcyA9IDA7Ci0gICAgICBpbnQgaW5maWVsZCA9IDA7Ci0gICAgICBpbnQgaW5xdW90ZSA9IDA7Ci0KLSAgICAgIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJzsgcysrKQotCXsKLQkgIGlmICgoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpICYmICEgaW5xdW90ZSkKLQkgICAgewotCSAgICAgIGlmIChpbmZpZWxkKQotCQl7Ci0JCSAgKytmaWVsZHM7Ci0JCSAgaWYgKGZpZWxkcyA+PSAyKQotCQkgICAgewotCQkgICAgICAqcyA9ICdcMCc7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGluZmllbGQgPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGluZmllbGQpCi0JCWluZmllbGQgPSAxOwotCSAgICAgIGlmICgqcyA9PSAnXCcnKQotCQlpbnF1b3RlID0gISBpbnF1b3RlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBtZW1zZXQgKChjaGFyICopICgmdGhlX2lucyksICdcMCcsIHNpemVvZiAodGhlX2lucykpOwotICBtNjhrX2lwIChzdHIpOwotICBlciA9IHRoZV9pbnMuZXJyb3I7Ci0gIGlmICghZXIpCi0gICAgewotICAgICAgZm9yIChuID0gMDsgbiA8IHRoZV9pbnMubnVtYXJnczsgbisrKQotCWlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yKQotCSAgewotCSAgICBlciA9IHRoZV9pbnMub3BlcmFuZHNbbl0uZXJyb3I7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgIH0KLSAgaWYgKGVyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiJXMgLS0gc3RhdGVtZW50IGAlcycgaWdub3JlZCIpLCBlciwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBjdXJyZW50IGxhYmVsLCByZWNvcmQgdGhhdCBpdCBtYXJrcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChjdXJyZW50X2xhYmVsICE9IE5VTEwpCi0gICAgewotICAgICAgY3VycmVudF9sYWJlbC0+dGV4dCA9IDE7Ci0gICAgICBjdXJyZW50X2xhYmVsID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHRoZV9pbnMubmZyYWcgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBObyBmcmFnIGhhY2tpbmcgaW52b2x2ZWQ7IGp1c3QgcHV0IGl0IG91dCAqLwotICAgICAgdG9QID0gZnJhZ19tb3JlICgyICogdGhlX2lucy5udW1vKTsKLSAgICAgIGZyb21QID0gJnRoZV9pbnMub3Bjb2RlWzBdOwotICAgICAgZm9yIChtID0gdGhlX2lucy5udW1vOyBtOyAtLW0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIChsb25nKSAoKmZyb21QKSwgMik7Ci0JICB0b1AgKz0gMjsKLQkgIGZyb21QKys7Ci0JfQotICAgICAgLyogcHV0IG91dCBzeW1ib2wtZGVwZW5kZW50IGluZm8gKi8KLSAgICAgIGZvciAobSA9IDA7IG0gPCB0aGVfaW5zLm5yZWw7IG0rKykKLQl7Ci0JICBzd2l0Y2ggKHRoZV9pbnMucmVsb2NbbV0ud2lkKQotCSAgICB7Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIG4gPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdiJzoKLQkgICAgICBuID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMyc6Ci0JICAgICAgbiA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3cnOgotCSAgICBjYXNlICdXJzoKLQkgICAgICBuID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbCc6Ci0JICAgICAgbiA9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oIkRvbid0IGtub3cgaG93IHRvIGZpZ3VyZSB3aWR0aCBvZiAlYyBpbiBtZF9hc3NlbWJsZSgpIiksCi0JCQl0aGVfaW5zLnJlbG9jW21dLndpZCk7Ci0JICAgIH0KLQotCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgICAgICgodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCi0JCQkgICAgICAgLSB0aGVfaW5zLm51bW8gKiAyICsgdGhlX2lucy5yZWxvY1ttXS5uKSwKLQkJCSAgICAgIG4sCi0JCQkgICAgICAmdGhlX2lucy5yZWxvY1ttXS5leHAsCi0JCQkgICAgICB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAotCQkJICAgICAgZ2V0X3JlbG9jX2NvZGUgKG4sIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkJCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ucGljX3JlbG9jKSk7Ci0JICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSB0aGVfaW5zLnJlbG9jW21dLnBjcmVsX2ZpeDsKLQkgIGlmICh0aGVfaW5zLnJlbG9jW21dLndpZCA9PSAnQicpCi0JICAgIGZpeFAtPmZ4X3NpZ25lZCA9IDE7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGVyZSdzIHNvbWUgZnJhZyBoYWNraW5nICovCi0gIGZvciAobiA9IDAsIGZyb21QID0gJnRoZV9pbnMub3Bjb2RlWzBdOyBuIDwgdGhlX2lucy5uZnJhZzsgbisrKQotICAgIHsKLSAgICAgIGludCB3aWQ7Ci0KLSAgICAgIGlmIChuID09IDApCi0Jd2lkID0gMiAqIHRoZV9pbnMuZnJhZ2Jbbl0uZnJhZ29mZjsKLSAgICAgIGVsc2UKLQl3aWQgPSAyICogKHRoZV9pbnMubnVtbyAtIHRoZV9pbnMuZnJhZ2JbbiAtIDFdLmZyYWdvZmYpOwotICAgICAgdG9QID0gZnJhZ19tb3JlICh3aWQpOwotICAgICAgdG9fYmVnX1AgPSB0b1A7Ci0gICAgICBzaG9ydHNfdGhpc19mcmFnID0gMDsKLSAgICAgIGZvciAobSA9IHdpZCAvIDI7IG07IC0tbSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgKGxvbmcpICgqZnJvbVApLCAyKTsKLQkgIHRvUCArPSAyOwotCSAgZnJvbVArKzsKLQkgIHNob3J0c190aGlzX2ZyYWcrKzsKLQl9Ci0gICAgICBmb3IgKG0gPSAwOyBtIDwgdGhlX2lucy5ucmVsOyBtKyspCi0JewotCSAgaWYgKCh0aGVfaW5zLnJlbG9jW21dLm4pID49IDIgKiBzaG9ydHNfdGhpc19mcmFnKQotCSAgICB7Ci0JICAgICAgdGhlX2lucy5yZWxvY1ttXS5uIC09IDIgKiBzaG9ydHNfdGhpc19mcmFnOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICB3aWQgPSB0aGVfaW5zLnJlbG9jW21dLndpZDsKLQkgIGlmICh3aWQgPT0gMCkKLQkgICAgY29udGludWU7Ci0JICB0aGVfaW5zLnJlbG9jW21dLndpZCA9IDA7Ci0JICB3aWQgPSAod2lkID09ICdiJykgPyAxIDogKHdpZCA9PSAndycpID8gMiA6ICh3aWQgPT0gJ2wnKSA/IDQgOiA0MDAwOwotCi0JICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgICAgKCh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkKLQkJCSAgICAgICAtIHRoZV9pbnMubnVtbyAqIDIgKyB0aGVfaW5zLnJlbG9jW21dLm4pLAotCQkJICAgICAgd2lkLAotCQkJICAgICAgJnRoZV9pbnMucmVsb2NbbV0uZXhwLAotCQkJICAgICAgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCSAgICAgIGdldF9yZWxvY19jb2RlICh3aWQsIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkJCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ucGljX3JlbG9jKSk7Ci0JICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSB0aGVfaW5zLnJlbG9jW21dLnBjcmVsX2ZpeDsKLQl9Ci0gICAgICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMCwKLQkJICAgICAgIChyZWxheF9zdWJzdGF0ZVQpICh0aGVfaW5zLmZyYWdiW25dLmZyYWd0eSksCi0JCSAgICAgICB0aGVfaW5zLmZyYWdiW25dLmZhZGQsIHRoZV9pbnMuZnJhZ2Jbbl0uZm9mZiwgdG9fYmVnX1ApOwotICAgIH0KLSAgbiA9ICh0aGVfaW5zLm51bW8gLSB0aGVfaW5zLmZyYWdiW24gLSAxXS5mcmFnb2ZmKTsKLSAgc2hvcnRzX3RoaXNfZnJhZyA9IDA7Ci0gIGlmIChuKQotICAgIHsKLSAgICAgIHRvUCA9IGZyYWdfbW9yZSAobiAqIHNpemVvZiAoc2hvcnQpKTsKLSAgICAgIHdoaWxlIChuLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIChsb25nKSAoKmZyb21QKSwgMik7Ci0JICB0b1AgKz0gMjsKLQkgIGZyb21QKys7Ci0JICBzaG9ydHNfdGhpc19mcmFnKys7Ci0JfQotICAgIH0KLSAgZm9yIChtID0gMDsgbSA8IHRoZV9pbnMubnJlbDsgbSsrKQotICAgIHsKLSAgICAgIGludCB3aWQ7Ci0KLSAgICAgIHdpZCA9IHRoZV9pbnMucmVsb2NbbV0ud2lkOwotICAgICAgaWYgKHdpZCA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgdGhlX2lucy5yZWxvY1ttXS53aWQgPSAwOwotICAgICAgd2lkID0gKHdpZCA9PSAnYicpID8gMSA6ICh3aWQgPT0gJ3cnKSA/IDIgOiAod2lkID09ICdsJykgPyA0IDogNDAwMDsKLQotICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgKCh0aGVfaW5zLnJlbG9jW21dLm4gKyB0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkKLQkJCSAgIC0gc2hvcnRzX3RoaXNfZnJhZyAqIDIpLAotCQkJICB3aWQsCi0JCQkgICZ0aGVfaW5zLnJlbG9jW21dLmV4cCwKLQkJCSAgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCSAgZ2V0X3JlbG9jX2NvZGUgKHdpZCwgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCQkJICB0aGVfaW5zLnJlbG9jW21dLnBpY19yZWxvYykpOwotICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gdGhlX2lucy5yZWxvY1ttXS5wY3JlbF9maXg7Ci0gICAgfQotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICAvKgotICAgKiBtZF9iZWdpbiAtLSBzZXQgdXAgaGFzaCB0YWJsZXMgd2l0aCA2ODAwMCBpbnN0cnVjdGlvbnMuCi0gICAqIHNpbWlsYXIgdG8gd2hhdCB0aGUgdmF4IGFzc2VtYmxlciBkb2VzLiAgLS0tcGhyCi0gICAqLwotICAvKiBSTVMgY2xhaW1zIHRoZSB0aGluZyB0byBkbyBpcyB0YWtlIHRoZSBtNjhrLW9wY29kZS5oIHRhYmxlLCBhbmQgbWFrZQotICAgICBhIGNvcHkgb2YgaXQgYXQgcnVudGltZSwgYWRkaW5nIGluIHRoZSBpbmZvcm1hdGlvbiB3ZSB3YW50IGJ1dCBpc24ndAotICAgICB0aGVyZS4gIEkgdGhpbmsgaXQnZCBiZSBiZXR0ZXIgdG8gaGF2ZSBhbiBhd2sgc2NyaXB0IGhhY2sgdGhlIHRhYmxlCi0gICAgIGF0IGNvbXBpbGUgdGltZS4gIE9yIGV2ZW4ganVzdCB4c3RyIHRoZSB0YWJsZSBhbmQgdXNlIGl0IGFzLWlzLiAgQnV0Ci0gICAgIG15IGxvcmQgZ2hvZCBoYXRoIHNwb2tlbiwgc28gd2UgZG8gaXQgdGhpcyB3YXkuICBFeGN1c2UgdGhlIHVnbHkgdmFyCi0gICAgIG5hbWVzLiAgKi8KLQotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKmluczsKLSAgcmVnaXN0ZXIgc3RydWN0IG02OGtfaW5jYW50ICpoYWNrLCAqc2xhazsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcmV0dmFsID0gMDsJLyogZW1wdHkgc3RyaW5nLCBvciBlcnJvciBtc2cgdGV4dCAqLwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSAxOwotICAgICAgbTY4a19hYnNwY2FkZCA9IDE7Ci0gICAgICBpZiAoISBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSkKLQltNjhrX3JlbDMyID0gMDsKLSAgICB9Ci0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIG9ic3RhY2tfYmVnaW4gKCZyb2J5biwgNDAwMCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBtNjhrX251bW9wY29kZXM7IGkrKykKLSAgICB7Ci0gICAgICBoYWNrID0gc2xhayA9IChzdHJ1Y3QgbTY4a19pbmNhbnQgKikgb2JzdGFja19hbGxvYyAoJnJvYnluLCBzaXplb2YgKHN0cnVjdCBtNjhrX2luY2FudCkpOwotICAgICAgZG8KLQl7Ci0JICBpbnMgPSAmbTY4a19vcGNvZGVzW2ldOwotCSAgLyogV2UgKmNvdWxkKiBpZ25vcmUgaW5zbnMgdGhhdCBkb24ndCBtYXRjaCBvdXIgYXJjaCBoZXJlCi0JICAgICBidXQganVzdCBsZWF2aW5nIHRoZW0gb3V0IG9mIHRoZSBoYXNoLiAqLwotCSAgc2xhay0+bV9vcGVyYW5kcyA9IGlucy0+YXJnczsKLQkgIHNsYWstPm1fb3BudW0gPSBzdHJsZW4gKHNsYWstPm1fb3BlcmFuZHMpIC8gMjsKLQkgIHNsYWstPm1fYXJjaCA9IGlucy0+YXJjaDsKLQkgIHNsYWstPm1fb3Bjb2RlID0gaW5zLT5vcGNvZGU7Ci0JICAvKiBUaGlzIGlzIGtsdWRnZXkgKi8KLQkgIHNsYWstPm1fY29kZW51bSA9ICgoaW5zLT5tYXRjaCkgJiAweGZmZmZMKSA/IDIgOiAxOwotCSAgaWYgKGkgKyAxICE9IG02OGtfbnVtb3Bjb2RlcwotCSAgICAgICYmICFzdHJjbXAgKGlucy0+bmFtZSwgbTY4a19vcGNvZGVzW2kgKyAxXS5uYW1lKSkKLQkgICAgewotCSAgICAgIHNsYWstPm1fbmV4dCA9IChzdHJ1Y3QgbTY4a19pbmNhbnQgKikgb2JzdGFja19hbGxvYyAoJnJvYnluLCBzaXplb2YgKHN0cnVjdCBtNjhrX2luY2FudCkpOwotCSAgICAgIGkrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzbGFrLT5tX25leHQgPSAwOwotCSAgc2xhayA9IHNsYWstPm1fbmV4dDsKLQl9Ci0gICAgICB3aGlsZSAoc2xhayk7Ci0KLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBpbnMtPm5hbWUsIChjaGFyICopIGhhY2spOwotICAgICAgaWYgKHJldHZhbCkKLQlhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6ICBDYW4ndCBoYXNoICVzOiAlcyIpLCBpbnMtPm5hbWUsIHJldHZhbCk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBtNjhrX251bWFsaWFzZXM7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gbTY4a19vcGNvZGVfYWxpYXNlc1tpXS5wcmltYXJ5OwotICAgICAgY29uc3QgY2hhciAqYWxpYXMgPSBtNjhrX29wY29kZV9hbGlhc2VzW2ldLmFsaWFzOwotICAgICAgUFRSIHZhbCA9IGhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7Ci0gICAgICBpZiAoIXZhbCkKLQlhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6IENhbid0IGZpbmQgJXMgaW4gaGFzaCB0YWJsZSIpLCBuYW1lKTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBhbGlhcywgdmFsKTsKLSAgICAgIGlmIChyZXR2YWwpCi0JYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiBDYW4ndCBoYXNoICVzOiAlcyIpLCBhbGlhcywgcmV0dmFsKTsKLSAgICB9Ci0KLSAgLyogSW4gTVJJIG1vZGUsIGFsbCB1bnNpemVkIGJyYW5jaGVzIGFyZSB2YXJpYWJsZSBzaXplZC4gIE5vcm1hbGx5LAotICAgICB0aGV5IGFyZSB3b3JkIHNpemVkLiAgKi8KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHN0YXRpYyBzdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMgbXJpX2FsaWFzZXNbXSA9Ci0JewotCSAgeyAiYmhpIiwJImpoaSIsIH0sCi0JICB7ICJibHMiLAkiamxzIiwgfSwKLQkgIHsgImJjYyIsCSJqY2MiLCB9LAotCSAgeyAiYmNzIiwJImpjcyIsIH0sCi0JICB7ICJibmUiLAkiam5lIiwgfSwKLQkgIHsgImJlcSIsCSJqZXEiLCB9LAotCSAgeyAiYnZjIiwJImp2YyIsIH0sCi0JICB7ICJidnMiLAkianZzIiwgfSwKLQkgIHsgImJwbCIsCSJqcGwiLCB9LAotCSAgeyAiYm1pIiwJImptaSIsIH0sCi0JICB7ICJiZ2UiLAkiamdlIiwgfSwKLQkgIHsgImJsdCIsCSJqbHQiLCB9LAotCSAgeyAiYmd0IiwJImpndCIsIH0sCi0JICB7ICJibGUiLAkiamxlIiwgfSwKLQkgIHsgImJyYSIsCSJqcmEiLCB9LAotCSAgeyAiYnNyIiwJImpic3IiLCB9LAotCX07Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgbXJpX2FsaWFzZXMgLyBzaXplb2YgbXJpX2FsaWFzZXNbMF07IGkrKykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lID0gbXJpX2FsaWFzZXNbaV0ucHJpbWFyeTsKLQkgIGNvbnN0IGNoYXIgKmFsaWFzID0gbXJpX2FsaWFzZXNbaV0uYWxpYXM7Ci0JICBQVFIgdmFsID0gaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKLQkgIGlmICghdmFsKQotCSAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6IENhbid0IGZpbmQgJXMgaW4gaGFzaCB0YWJsZSIpLCBuYW1lKTsKLQkgIHJldHZhbCA9IGhhc2hfamFtIChvcF9oYXNoLCBhbGlhcywgdmFsKTsKLQkgIGlmIChyZXR2YWwpCi0JICAgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgaGFzaCAlczogJXMiKSwgYWxpYXMsIHJldHZhbCk7Ci0JfQotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChta2xvd2VyX3RhYmxlKTsgaSsrKQotICAgIG1rbG93ZXJfdGFibGVbaV0gPSAoaXN1cHBlciAoYyA9IChjaGFyKSBpKSkgPyB0b2xvd2VyIChjKSA6IGM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAobm90ZW5kX3RhYmxlKTsgaSsrKQotICAgIHsKLSAgICAgIG5vdGVuZF90YWJsZVtpXSA9IDA7Ci0gICAgICBhbHRfbm90ZW5kX3RhYmxlW2ldID0gMDsKLSAgICB9Ci0gIG5vdGVuZF90YWJsZVsnLCddID0gMTsKLSAgbm90ZW5kX3RhYmxlWyd7J10gPSAxOwotICBub3RlbmRfdGFibGVbJ30nXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ2EnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ0EnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ2QnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ0QnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJyMnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJyYnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ2YnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJ0YnXSA9IDE7Ci0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0gIGFsdF9ub3RlbmRfdGFibGVbUkVHSVNURVJfUFJFRklYXSA9IDE7Ci0jZW5kaWYKLQotICAvKiBXZSBuZWVkIHRvIHB1dCAnKCcgaW4gYWx0X25vdGVuZF90YWJsZSB0byBoYW5kbGUKLSAgICAgICBjYXMyICVkMDolZDIsJWQzOiVkNCwoJWEwKTooJWExKQotICAgICAqLwotICBhbHRfbm90ZW5kX3RhYmxlWycoJ10gPSAxOwotCi0gIC8qIFdlIG5lZWQgdG8gcHV0ICdAJyBpbiBhbHRfbm90ZW5kX3RhYmxlIHRvIGhhbmRsZQotICAgICAgIGNhczIgJWQwOiVkMiwlZDM6JWQ0LEAoJWQwKTpAKCVkMSkKLSAgICAgKi8KLSAgYWx0X25vdGVuZF90YWJsZVsnQCddID0gMTsKLQotICAvKiBXZSBuZWVkIHRvIHB1dCBkaWdpdHMgaW4gYWx0X25vdGVuZF90YWJsZSB0byBoYW5kbGUKLSAgICAgICBiZmV4dHUgJWQwezI0OjF9LCVkMAotICAgICAqLwotICBhbHRfbm90ZW5kX3RhYmxlWycwJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWycxJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWycyJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyczJ10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc0J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc1J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc2J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc3J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc4J10gPSAxOwotICBhbHRfbm90ZW5kX3RhYmxlWyc5J10gPSAxOwotCi0jaWZuZGVmIE1JVF9TWU5UQVhfT05MWQotICAvKiBJbnNlcnQgcHNldWRvIG9wcywgdGhlc2UgaGF2ZSB0byBnbyBpbnRvIHRoZSBvcGNvZGUgdGFibGUgc2luY2UKLSAgICAgZ2FzIGV4cGVjdHMgcHNldWRvIG9wcyB0byBzdGFydCB3aXRoIGEgZG90ICovCi0gIHsKLSAgICBpbnQgbiA9IDA7Ci0gICAgd2hpbGUgKG1vdGVfcHNldWRvX3RhYmxlW25dLnBvY19uYW1lKQotICAgICAgewotCWhhY2sgPSAoc3RydWN0IG02OGtfaW5jYW50ICopCi0JICBvYnN0YWNrX2FsbG9jICgmcm9ieW4sIHNpemVvZiAoc3RydWN0IG02OGtfaW5jYW50KSk7Ci0JaGFzaF9pbnNlcnQgKG9wX2hhc2gsCi0JCSAgICAgbW90ZV9wc2V1ZG9fdGFibGVbbl0ucG9jX25hbWUsIChjaGFyICopIGhhY2spOwotCWhhY2stPm1fb3BlcmFuZHMgPSAwOwotCWhhY2stPm1fb3BudW0gPSBuOwotCW4rKzsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgaW5pdF9yZWd0YWJsZSAoKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgcmVjb3JkX2FsaWdubWVudCAodGV4dF9zZWN0aW9uLCAyKTsKLSAgcmVjb3JkX2FsaWdubWVudCAoZGF0YV9zZWN0aW9uLCAyKTsKLSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIDIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1zZWxlY3RfY29udHJvbF9yZWdzICgpCi17Ci0gIC8qIE5vdGUgd2hpY2ggc2V0IG9mICJtb3ZlYyIgY29udHJvbCByZWdpc3RlcnMgaXMgYXZhaWxhYmxlLiAgKi8KLSAgc3dpdGNoIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQotICAgIHsKLSAgICBjYXNlIG02ODAwMDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODAwMF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG02ODAxMDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODAxMF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG02ODAyMDoKLSAgICBjYXNlIG02ODAzMDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODAyMF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG02ODA0MDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODA0MF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG02ODA2MDoKLSAgICAgIGNvbnRyb2xfcmVncyA9IG02ODA2MF9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNwdTMyOgotICAgICAgY29udHJvbF9yZWdzID0gY3B1MzJfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtY2Y1MjAwOgotICAgIGNhc2UgbWNmNTIwNmU6Ci0gICAgY2FzZSBtY2Y1MzA3OgotICAgICAgY29udHJvbF9yZWdzID0gbWNmX2NvbnRyb2xfcmVnczsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLXZvaWQKLW02OGtfaW5pdF9hZnRlcl9hcmdzICgpCi17Ci0gIGlmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID09IDApCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBjb25zdCBjaGFyICpkZWZhdWx0X2NwdSA9IFRBUkdFVF9DUFU7Ci0KLSAgICAgIGlmICgqZGVmYXVsdF9jcHUgPT0gJ20nKQotCWRlZmF1bHRfY3B1Kys7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQotCWlmIChzdHJjYXNlY21wIChkZWZhdWx0X2NwdSwgYXJjaHNbaV0ubmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGkgPT0gbl9hcmNocykKLQl7Ci0JICBhc19iYWQgKF8oInVucmVjb2duaXplZCBkZWZhdWx0IGNwdSBgJXMnID8/PyIpLCBUQVJHRVRfQ1BVKTsKLQkgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODAyMDsKLQl9Ci0gICAgICBlbHNlCi0JY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gYXJjaHNbaV0uYXJjaDsKLSAgICB9Ci0gIC8qIFBlcm1pdCBtNjg4ODEgc3BlY2lmaWNhdGlvbiB3aXRoIGFsbCBjcHVzOyB0aG9zZSB0aGF0IGNhbid0IHdvcmsKLSAgICAgd2l0aCBhIGNvcHJvY2Vzc29yIGNvdWxkIGJlIGRvaW5nIGVtdWxhdGlvbi4gICovCi0gIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSAmIG02ODg1MSkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwNDApCi0JewotCSAgYXNfd2FybiAoXygiNjgwNDAgYW5kIDY4ODUxIHNwZWNpZmllZDsgbW11IGluc3RydWN0aW9ucyBtYXkgYXNzZW1ibGUgaW5jb3JyZWN0bHkiKSk7Ci0JfQotICAgIH0KLSAgLyogV2hhdCBvdGhlciBpbmNvbXBhdGliaWxpdGllcyBjb3VsZCB3ZSBjaGVjayBmb3I/ICAqLwotCi0gIC8qIFRvc3MgaW4gc29tZSBkZWZhdWx0IGFzc3VtcHRpb25zIGFib3V0IGNvcHJvY2Vzc29ycy4gICovCi0gIGlmICghbm9fNjg4ODEKLSAgICAgICYmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpCi0JICAvKiBDYW4gQ1BVMzIgaGF2ZSBhIDY4ODgxIGNvcHJvY2Vzc29yPz8gICovCi0JICAmIChtNjgwMjAgfCBtNjgwMzAgfCBjcHUzMikpKQotICAgIHsKLSAgICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg4MTsKLSAgICB9Ci0gIGlmICghbm9fNjg4NTEKLSAgICAgICYmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpICYgbTY4MDIwdXApICE9IDAKLSAgICAgICYmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpICYgbTY4MDQwdXApID09IDApCi0gICAgewotICAgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODUxOwotICAgIH0KLSAgaWYgKG5vXzY4ODgxICYmIChjdXJyZW50X2FyY2hpdGVjdHVyZSAmIG02ODg4MSkpCi0gICAgYXNfYmFkIChfKCJvcHRpb25zIGZvciA2ODg4MSBhbmQgbm8tNjg4ODEgYm90aCBnaXZlbiIpKTsKLSAgaWYgKG5vXzY4ODUxICYmIChjdXJyZW50X2FyY2hpdGVjdHVyZSAmIG02ODg1MSkpCi0gICAgYXNfYmFkIChfKCJvcHRpb25zIGZvciA2ODg1MSBhbmQgbm8tNjg4NTEgYm90aCBnaXZlbiIpKTsKLQotI2lmZGVmIE9CSl9BT1VUCi0gIC8qIFdvcmsgb3V0IHRoZSBtYWdpYyBudW1iZXIuICBUaGlzIGlzbid0IHZlcnkgZ2VuZXJhbC4gICovCi0gIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSAmIG02ODAwMCkKLSAgICBtNjhrX2FvdXRfbWFjaHR5cGUgPSAwOwotICBlbHNlIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSAmIG02ODAxMCkKLSAgICBtNjhrX2FvdXRfbWFjaHR5cGUgPSAxOwotICBlbHNlIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSAmIG02ODAyMCkKLSAgICBtNjhrX2FvdXRfbWFjaHR5cGUgPSAyOwotICBlbHNlCi0gICAgbTY4a19hb3V0X21hY2h0eXBlID0gMjsKLSNlbmRpZgotCi0gIC8qIE5vdGUgd2hpY2ggc2V0IG9mICJtb3ZlYyIgY29udHJvbCByZWdpc3RlcnMgaXMgYXZhaWxhYmxlLiAgKi8KLSAgc2VsZWN0X2NvbnRyb2xfcmVncyAoKTsKLQotICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotICAgICAgfHwgYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0gICAgbWRfcmVsYXhfdGFibGVbVEFCIChQQ0lOREVYLCBCWVRFKV0ucmx4X21vcmUgPSAwOwotfQotDAotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGxhYmVsIGlzIGRlZmluZWQuICAqLwotCi12b2lkCi1tNjhrX2Zyb2JfbGFiZWwgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBzdHJ1Y3QgbGFiZWxfbGluZSAqbjsKLQotICBuID0gKHN0cnVjdCBsYWJlbF9saW5lICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm5leHQgPSBsYWJlbHM7Ci0gIG4tPmxhYmVsID0gc3ltOwotICBhc193aGVyZSAoJm4tPmZpbGUsICZuLT5saW5lKTsKLSAgbi0+dGV4dCA9IDA7Ci0gIGxhYmVscyA9IG47Ci0gIGN1cnJlbnRfbGFiZWwgPSBuOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgdmFsdWUgdGhhdCBpcyBub3QgYW4gaW5zdHJ1Y3Rpb24gaXMgZW1pdHRlZC4gICovCi0KLXZvaWQKLW02OGtfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCkKLXsKLSAgY3VycmVudF9sYWJlbCA9IE5VTEw7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LCB3aGVuIHRoZSBmaW5hbCB2YWx1ZSBvZgotICAgdGhlIGxhYmVsIGlzIGtub3duLiAgV2Ugd2FybiBpZiB0aGlzIGlzIGEgdGV4dCBzeW1ib2wgYWxpZ25lZCBhdCBhbgotICAgb2RkIGxvY2F0aW9uLiAgKi8KLQotdm9pZAotbTY4a19mcm9iX3N5bWJvbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IHJlZ19zZWN0aW9uCi0gICAgICAmJiAoaW50KSBTX0dFVF9WQUxVRSAoc3ltKSA8IDApCi0gICAgewotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIH4oaW50KVNfR0VUX1ZBTFVFIChzeW0pKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChTX0dFVF9WQUxVRSAoc3ltKSAmIDEpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGxhYmVsX2xpbmUgKmw7Ci0KLSAgICAgIGZvciAobCA9IGxhYmVsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQl7Ci0JICBpZiAobC0+bGFiZWwgPT0gc3ltKQotCSAgICB7Ci0JICAgICAgaWYgKGwtPnRleHQpCi0JCWFzX3dhcm5fd2hlcmUgKGwtPmZpbGUsIGwtPmxpbmUsCi0JCQkgICAgICAgXygidGV4dCBsYWJlbCBgJXMnIGFsaWduZWQgdG8gb2RkIGJvdW5kYXJ5IiksCi0JCQkgICAgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotDAotLyogVGhpcyBpcyBjYWxsZWQgaWYgd2UgZ28gaW4gb3Igb3V0IG9mIE1SSSBtb2RlIGJlY2F1c2Ugb2YgdGhlIC5tcmkKLSAgIHBzZXVkby1vcC4gICovCi0KLXZvaWQKLW02OGtfbXJpX21vZGVfY2hhbmdlIChvbikKLSAgICAgaW50IG9uOwotewotICBpZiAob24pCi0gICAgewotICAgICAgaWYgKCEgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsKQotCXsKLQkgIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IDE7Ci0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0JICBpbml0X3JlZ3RhYmxlICgpOwotI2VuZGlmCi0JfQotICAgICAgbTY4a19hYnNwY2FkZCA9IDE7Ci0gICAgICBpZiAoISBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSkKLQltNjhrX3JlbDMyID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISByZWdfcHJlZml4X29wdGlvbmFsX3NlZW4pCi0JewotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTAotCSAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gUkVHSVNURVJfUFJFRklYX09QVElPTkFMOwotI2Vsc2UKLQkgIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLQkgIGluaXRfcmVndGFibGUgKCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBtNjhrX2Fic3BjYWRkID0gMDsKLSAgICAgIGlmICghIG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lKQotCW02OGtfcmVsMzIgPSAxOwotICAgIH0KLX0KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgb2YgdHlwZSB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlcgotICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZF9hcHBseV9maXhfMiAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBvZmZzZXRUIHZhbDsKLXsKLSAgYWRkcmVzc1QgdXBwZXJfbGltaXQ7Ci0gIG9mZnNldFQgbG93ZXJfbGltaXQ7Ci0KLSAgLyogVGhpcyBpcyB1bm5lY2Vzc2FyeSBidXQgaXQgY29udmluY2VzIHRoZSBuYXRpdmUgcnM2MDAwIGNvbXBpbGVyCi0gICAgIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHdlIHdhbnQuICAqLwotICBjaGFyICpidWYgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBidWYgKz0gZml4UC0+Znhfd2hlcmU7Ci0gIC8qIGVuZCBpYm0gY29tcGlsZXIgd29ya2Fyb3VuZCAqLwotCi0gIGlmICh2YWwgJiAweDgwMDAwMDAwKQotICAgIHZhbCB8PSB+KGFkZHJlc3NUKTB4N2ZmZmZmZmY7Ci0gIGVsc2UKLSAgICB2YWwgJj0gMHg3ZmZmZmZmZjsKLQotI2lmZGVmIE9CSl9FTEYKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5KQotICAgIHsKLSAgICAgIG1lbXNldCAoYnVmLCAwLCBmaXhQLT5meF9zaXplKTsKLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIGVtaXRfcmVsb2MgKi8KLQotICAgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLQkgICYmICFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgJiYgIVNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotCVNfU0VUX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybjsKLSNlbmRpZgotCi0gIHN3aXRjaCAoZml4UC0+Znhfc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBUaGUgY2FzdCB0byBvZmZzZXRUIGJlbG93IGFyZSBuZWNlc3NhcnkgdG8gbWFrZSBjb2RlIGNvcnJlY3QgZm9yCi0JIG1hY2hpbmVzIHdoZXJlIGludHMgYXJlIHNtYWxsZXIgdGhhbiBvZmZzZXRUICovCi0gICAgY2FzZSAxOgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgdXBwZXJfbGltaXQgPSAweDdmOwotICAgICAgbG93ZXJfbGltaXQgPSAtIChvZmZzZXRUKSAweDgwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIHVwcGVyX2xpbWl0ID0gMHg3ZmZmOwotICAgICAgbG93ZXJfbGltaXQgPSAtIChvZmZzZXRUKSAweDgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIHVwcGVyX2xpbWl0ID0gMHg3ZmZmZmZmZjsKLSAgICAgIGxvd2VyX2xpbWl0ID0gLSAob2Zmc2V0VCkgMHg3ZmZmZmZmZiAtIDE7CS8qIGF2b2lkIGNvbnN0YW50IG92ZXJmbG93ICovCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZpeFAtPmZ4X3NpemUpOwotICAgIH0KLQotICAvKiBGaXggdXAgYSBuZWdhdGl2ZSByZWxvYy4gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMICYmIGZpeFAtPmZ4X3N1YnN5ICE9IE5VTEwpCi0gICAgewotICAgICAgZml4UC0+ZnhfYWRkc3kgPSBmaXhQLT5meF9zdWJzeTsKLSAgICAgIGZpeFAtPmZ4X3N1YnN5ID0gTlVMTDsKLSAgICAgIGZpeFAtPmZ4X3RjYml0ID0gMTsKLSAgICB9Ci0KLSAgLyogRm9yIG5vbi1wYy1yZWxhdGl2ZSB2YWx1ZXMsIGl0J3MgY29uY2VpdmFibGUgd2UgbWlnaHQgZ2V0IHNvbWV0aGluZwotICAgICBsaWtlICIweGZmIiBmb3IgYSBieXRlIGZpZWxkLiAgU28gZXh0ZW5kIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSByYW5nZQotICAgICB0byBhY2NlcHQgc3VjaCBudW1iZXJzLiAgV2UgYXJiaXRyYXJpbHkgZGlzYWxsb3cgIi0weGZmIiBvciAiMHhmZisweGZmIiwKLSAgICAgc28gdGhhdCB3ZSBjYW4gZG8gYW55IHJhbmdlIGNoZWNraW5nIGF0IGFsbC4gICovCi0gIGlmICghIGZpeFAtPmZ4X3BjcmVsICYmICEgZml4UC0+Znhfc2lnbmVkKQotICAgIHVwcGVyX2xpbWl0ID0gdXBwZXJfbGltaXQgKiAyICsgMTsKLQotICBpZiAoKGFkZHJlc3NUKSB2YWwgPiB1cHBlcl9saW1pdAotICAgICAgJiYgKHZhbCA+IDAgfHwgdmFsIDwgbG93ZXJfbGltaXQpKQotICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygidmFsdWUgb3V0IG9mIHJhbmdlIikpOwotCi0gIC8qIEEgb25lIGJ5dGUgUEMtcmVsYXRpdmUgcmVsb2MgbWVhbnMgYSBzaG9ydCBicmFuY2guICBXZSBjYW4ndCB1c2UKLSAgICAgYSBzaG9ydCBicmFuY2ggd2l0aCBhIHZhbHVlIG9mIDAgb3IgLTEsIGJlY2F1c2UgdGhvc2UgaW5kaWNhdGUKLSAgICAgZGlmZmVyZW50IG9wY29kZXMgKGJyYW5jaGVzIHdpdGggbG9uZ2VyIG9mZnNldHMpLiAgZml4dXBfc2VnbWVudAotICAgICBpbiB3cml0ZS5jIG1heSBoYXZlIGNsb2JiZXJlZCBmeF9wY3JlbCwgc28gd2UgbmVlZCB0byBleGFtaW5lIHRoZQotICAgICByZWxvYyB0eXBlLiAgKi8KLSAgaWYgKChmaXhQLT5meF9wY3JlbAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzhfUENSRUwKLSNlbmRpZgotICAgICAgICkKLSAgICAgICYmIGZpeFAtPmZ4X3NpemUgPT0gMQotICAgICAgJiYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwKLQkgIHx8IFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKQotICAgICAgJiYgKHZhbCA9PSAwIHx8IHZhbCA9PSAtMSkpCi0gICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJpbnZhbGlkIGJ5dGUgYnJhbmNoIG9mZnNldCIpKTsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHA7Ci17Ci0gIG1kX2FwcGx5X2ZpeF8yIChmaXhQLCAoYWRkcmVzc1QpICp2YWxwKTsKLSAgcmV0dXJuIDE7Ci19Ci0jZWxzZQotdm9pZCBtZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIG1kX2FwcGx5X2ZpeF8yIChmaXhQLCAoYWRkcmVzc1QpIHZhbCk7Ci19Ci0jZW5kaWYKLQotLyogKmZyYWdQIGhhcyBiZWVuIHJlbGF4ZWQgdG8gaXRzIGZpbmFsIHNpemUsIGFuZCBub3cgbmVlZHMgdG8gaGF2ZQotICAgdGhlIGJ5dGVzIGluc2lkZSBpdCBtb2RpZmllZCB0byBjb25mb3JtIHRvIHRoZSBuZXcgc2l6ZSAgVGhlcmUgaXMgVUdMWQotICAgTUFHSUMgaGVyZS4gLi4KLSAgICovCi1zdGF0aWMgdm9pZAotbWRfY29udmVydF9mcmFnXzEgKGZyYWdQKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGxvbmcgZGlzcDsKLSAgbG9uZyBleHQgPSAwOwotICBmaXhTICpmaXhQOwotCi0gIC8qIEFkZHJlc3MgaW4gb2JqZWN0IGNvZGUgb2YgdGhlIGRpc3BsYWNlbWVudC4gICovCi0gIHJlZ2lzdGVyIGludCBvYmplY3RfYWRkcmVzcyA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzczsKLQotICAvKiBBZGRyZXNzIGluIGdhcyBjb3JlIG9mIHRoZSBwbGFjZSB0byBzdG9yZSB0aGUgZGlzcGxhY2VtZW50LiAgKi8KLSAgLyogVGhpcyBjb252aW5jZXMgdGhlIG5hdGl2ZSByczYwMDAgY29tcGlsZXIgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgd2UKLSAgICAgd2FudC4gKi8KLSAgcmVnaXN0ZXIgY2hhciAqYnVmZmVyX2FkZHJlc3MgPSBmcmFnUC0+ZnJfbGl0ZXJhbDsKLSAgYnVmZmVyX2FkZHJlc3MgKz0gZnJhZ1AtPmZyX2ZpeDsKLSAgLyogZW5kIGlibSBjb21waWxlciB3b3JrYXJvdW5kICovCi0KLSAgLyogVGhlIGRpc3BsYWNlbWVudCBvZiB0aGUgYWRkcmVzcywgZnJvbSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLSAgZGlzcCA9IGZyYWdQLT5mcl9zeW1ib2wgPyBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgOiAwOwotICBkaXNwID0gKGRpc3AgKyBmcmFnUC0+ZnJfb2Zmc2V0KSAtIG9iamVjdF9hZGRyZXNzOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBkaXNwICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIEJZVEUpOgotICAgIGNhc2UgVEFCIChBQlJBTkNILCBCWVRFKToKLSAgICAgIGtub3cgKGlzc2J5dGUgKGRpc3ApKTsKLSAgICAgIGlmIChkaXNwID09IDApCi0JYXNfYmFkIChfKCJzaG9ydCBicmFuY2ggd2l0aCB6ZXJvIG9mZnNldDogdXNlIDp3IikpOwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IGRpc3A7Ci0gICAgICBleHQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKERCQ0MsIFNIT1JUKToKLSAgICAgIGtub3cgKGlzc3dvcmQgKGRpc3ApKTsKLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIFNIT1JUKToKLSAgICBjYXNlIFRBQiAoQUJSQU5DSCwgU0hPUlQpOgotICAgICAga25vdyAoaXNzd29yZCAoZGlzcCkpOwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IDB4MDA7Ci0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIExPTkcpOgotICAgICAgaWYgKCFIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQl7Ci0JICBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYxKQotCSAgICAvKiBCU1IgKi8KLQkgICAgewotCSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gPSAweDRFOwotCSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhCOTsgLyogSkJTUiB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KLQotCSAgICAgIGZpeF9uZXcgKGZyYWdQLAotCQkgICAgICAgZnJhZ1AtPmZyX2ZpeCwKLQkJICAgICAgIDQsCi0JCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkJICAgICAgIDAsCi0JCSAgICAgICBOT19SRUxPQyk7Ci0KLQkgICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICAgICAgZXh0ID0gMDsKLQkgICAgfQotCSAgLyogQlJBICovCi0JICBlbHNlIGlmIChmcmFnUC0+ZnJfb3Bjb2RlWzBdID09IDB4NjApCi0JICAgIHsKLQkgICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzBdID0gMHg0RTsKLQkgICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gKGNoYXIpIDB4Rjk7IC8qIEpNUCAgd2l0aCBBQlNMIExPTkcgb2Zmc2V0ICovCi0JICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgICAgIGV4dCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiTG9uZyBicmFuY2ggb2Zmc2V0IG5vdCBzdXBwb3J0ZWQuIikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhmZjsKLQkgIGV4dCA9IDQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBMT05HKToKLSAgICAgIC8qIG9ubHkgQmNjIDY4MDAwIGluc3RydWN0aW9ucyBjYW4gY29tZSBoZXJlICovCi0gICAgICAvKiBjaGFuZ2UgYmNjIGludG8gYiFjYy9qbXAgYWJzbCBsb25nICovCi0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzBdIF49IDB4MDE7CS8qIGludmVydCBiY2MgKi8KLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDY7LyogYnJhbmNoIG9mZnNldCA9IDYgKi8KLQotICAgICAgLyogSkY6IHRoZXNlIHVzZWQgdG8gYmUgZnJfb3Bjb2RlWzIsM10sIGJ1dCB0aGV5IG1heSBiZSBpbiBhCi0JICAgZGlmZmVyZW50IGZyYWcsIGluIHdoaWNoIGNhc2UgcmVmZXJpbmcgdG8gdGhlbSBpcyBhIG5vLW5vLgotCSAgIE9ubHkgZnJfb3Bjb2RlWzAsMV0gYXJlIGd1YXJhbnRlZWQgdG8gd29yay4gKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IChjaGFyKSAweGY5OwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwkvKiBhY2NvdW50IGZvciBqbXAgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gICAgICBleHQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKERCQ0MsIExPTkcpOgotICAgICAgLyogb25seSBEQmNjIDY4MDAwIGluc3RydWN0aW9ucyBjYW4gY29tZSBoZXJlICovCi0gICAgICAvKiBjaGFuZ2UgZGJjYyBpbnRvIGRiY2Mvam1wIGFic2wgbG9uZyAqLwotICAgICAgLyogSkY6IHRoZXNlIHVzZWQgdG8gYmUgZnJfb3Bjb2RlWzItN10sIGJ1dCB0aGF0J3Mgd3JvbmcgKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHgwMDsJLyogYnJhbmNoIG9mZnNldCA9IDQgKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHgwNDsKLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHg2MDsJLyogcHV0IGluIGJyYSBwYys2ICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4MDY7Ci0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAoY2hhcikgMHhmOTsKLQotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwkvKiBhY2NvdW50IGZvciBicmEvam1wIGluc3RydWN0aW9ucyAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgICAgIGV4dCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoRkJSQU5DSCwgU0hPUlQpOgotICAgICAga25vdyAoKGZyYWdQLT5mcl9vcGNvZGVbMV0gJiAweDQwKSA9PSAwKTsKLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoRkJSQU5DSCwgTE9ORyk6Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdIHw9IDB4NDA7CS8qIFR1cm4gb24gTE9ORyBiaXQgKi8KLSAgICAgIGV4dCA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoUENSRUwsIFNIT1JUKToKLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoUENSRUwsIExPTkcpOgotICAgICAgLyogVGhlIHRoaW5nIHRvIGRvIGhlcmUgaXMgZm9yY2UgaXQgdG8gQUJTT0xVVEUgTE9ORywgc2luY2UKLQlQQ1JFTCBpcyByZWFsbHkgdHJ5aW5nIHRvIHNob3J0ZW4gYW4gQUJTT0xVVEUgYWRkcmVzcyBhbnl3YXkgKi8KLSAgICAgIC8qIEpGIEZPTyBUaGlzIGNvZGUgaGFzIG5vdCBiZWVuIHRlc3RlZCAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDAsIE5PX1JFTE9DKTsKLSAgICAgIGlmICgoZnJhZ1AtPmZyX29wY29kZVsxXSAmIDB4M0YpICE9IDB4M0EpCi0JYXNfYmFkIChfKCJJbnRlcm5hbCBlcnJvciAobG9uZyBQQy1yZWxhdGl2ZSBvcGVyYW5kKSBmb3IgaW5zbiAweCUwNHggYXQgMHglbHgiKSwKLQkJKHVuc2lnbmVkKSBmcmFnUC0+ZnJfb3Bjb2RlWzBdLAotCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MpOwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSAmPSB+MHgzRjsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gfD0gMHgzOTsJLyogTW9kZSA3LjEgKi8KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgICAgIGV4dCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoUENMRUEsIFNIT1JUKToKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCAoaW50KSAoZnJhZ1AtPmZyX2ZpeCksIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gJj0gfjB4M0Y7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdIHw9IDB4M0E7IC8qIDA3MiAtIG1vZGUgNy4yICovCi0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDTEVBLCBMT05HKToKLSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnUCwgKGludCkgKGZyYWdQLT5mcl9maXgpICsgMiwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMjsKLSAgICAgIC8qIEFscmVhZHkgc2V0IHRvIG1vZGUgNy4zOyB0aGlzIGluZGljYXRlczogUEMgaW5kaXJlY3Qgd2l0aAotCSBzdXBwcmVzc2VkIGluZGV4LCAzMi1iaXQgZGlzcGxhY2VtZW50LiAgKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHgwMTsKLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHg3MDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICAgIGV4dCA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVEFCIChQQ0lOREVYLCBCWVRFKToKLSAgICAgIGRpc3AgKz0gMjsKLSAgICAgIGlmICghaXNzYnl0ZSAoZGlzcCkpCi0JewotCSAgYXNfYmFkIChfKCJkaXNwbGFjZW1lbnQgZG9lc24ndCBmaXQgaW4gb25lIGJ5dGUiKSk7Ci0JICBkaXNwID0gMDsKLQl9Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9maXggPj0gMik7Ci0gICAgICBidWZmZXJfYWRkcmVzc1stMl0gJj0gfjE7Ci0gICAgICBidWZmZXJfYWRkcmVzc1stMV0gPSBkaXNwOwotICAgICAgZXh0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ0lOREVYLCBTSE9SVCk6Ci0gICAgICBkaXNwICs9IDI7Ci0gICAgICBhc3NlcnQgKGlzc3dvcmQgKGRpc3ApKTsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2ZpeCA+PSAyKTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0yXSB8PSAweDE7Ci0gICAgICBidWZmZXJfYWRkcmVzc1stMV0gPSAweDIwOwotICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLCAoaW50KSAoZnJhZ1AtPmZyX2ZpeCksIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIChmcmFnUC0+ZnJfb3Bjb2RlWzFdICYgMDc3KSA9PSAwNzMsCi0JCSAgICAgIE5PX1JFTE9DKTsKLSAgICAgIGZpeFAtPmZ4X3BjcmVsX2FkanVzdCA9IDI7Ci0gICAgICBleHQgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDSU5ERVgsIExPTkcpOgotICAgICAgZGlzcCArPSAyOwotICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLCAoaW50KSAoZnJhZ1AtPmZyX2ZpeCksIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIChmcmFnUC0+ZnJfb3Bjb2RlWzFdICYgMDc3KSA9PSAwNzMsCi0JCSAgICAgIE5PX1JFTE9DKTsKLSAgICAgIGZpeFAtPmZ4X3BjcmVsX2FkanVzdCA9IDI7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9maXggPj0gMik7Ci0gICAgICBidWZmZXJfYWRkcmVzc1stMl0gfD0gMHgxOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTFdID0gMHgzMDsKLSAgICAgIGV4dCA9IDQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGV4dCkKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlcl9hZGRyZXNzLCAobG9uZykgZGlzcCwgKGludCkgZXh0KTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZXh0OwotICAgIH0KLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VjLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIG1kX2NvbnZlcnRfZnJhZ18xIChmcmFnUCk7Ci19Ci0KLSNlbHNlCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlZ1Qgc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgbWRfY29udmVydF9mcmFnXzEgKGZyYWdQKTsKLX0KLSNlbmRpZgotCi0vKiBGb3JjZSB0cnVseSB1bmRlZmluZWQgc3ltYm9scyB0byB0aGVpciBtYXhpbXVtIHNpemUsIGFuZCBnZW5lcmFsbHkgc2V0IHVwCi0gICB0aGUgZnJhZyBsaXN0IHRvIGJlIHJlbGF4ZWQKLSAgICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIGludCBvbGRfZml4OwotICByZWdpc3RlciBjaGFyICpidWZmZXJfYWRkcmVzcyA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbDsKLQotICBvbGRfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLQotICAvKiBoYW5kbGUgU1pfVU5ERUYgZmlyc3QsIGl0IGNhbiBiZSBjaGFuZ2VkIHRvIEJZVEUgb3IgU0hPUlQgKi8KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIFRBQiAoQUJSQU5DSCwgU1pfVU5ERUYpOgotICAgICAgewotCWlmICgoZnJhZ1AtPmZyX3N5bWJvbCAhPSBOVUxMKQkvKiBOb3QgYWJzb2x1dGUgKi8KLQkgICAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFRBQlRZUEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSwgQllURSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWVsc2UgaWYgKChmcmFnUC0+ZnJfc3ltYm9sID09IDApIHx8ICFIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkgIHsKLQkgICAgLyogT24gNjgwMDAsIG9yIGZvciBhYnNvbHV0ZSB2YWx1ZSwgc3dpdGNoIHRvIGFicyBsb25nICovCi0JICAgIC8qIEZJWE1FLCB3ZSBzaG91bGQgY2hlY2sgYWJzIHZhbCwgcGljayBzaG9ydCBvciBsb25nICovCi0JICAgIGlmIChmcmFnUC0+ZnJfb3Bjb2RlWzBdID09IDB4NjEpCi0JICAgICAgewotCQlmcmFnUC0+ZnJfb3Bjb2RlWzBdID0gMHg0RTsKLQkJZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweEI5OyAvKiBKQlNSIHdpdGggQUJTTCBMT05HIG9mZnNldCAqLwotCQlmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwKLQkJCSBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JCWZyYWdQLT5mcl9maXggKz0gNDsKLQkJZnJhZ193YW5lIChmcmFnUCk7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChmcmFnUC0+ZnJfb3Bjb2RlWzBdID09IDB4NjApCi0JICAgICAgewotCQlmcmFnUC0+ZnJfb3Bjb2RlWzBdID0gMHg0RTsKLQkJZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweEY5OyAvKiBKTVAgIHdpdGggQUJTTCBMT05HIG9mZnNldCAqLwotCQlmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwKLQkJCSBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JCWZyYWdQLT5mcl9maXggKz0gNDsKLQkJZnJhZ193YW5lIChmcmFnUCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlhc193YXJuIChfKCJMb25nIGJyYW5jaCBvZmZzZXQgdG8gZXh0ZXJuIHN5bWJvbCBub3Qgc3VwcG9ydGVkLiIpKTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgewkJCS8qIFN5bWJvbCBpcyBzdGlsbCB1bmRlZmluZWQuICBNYWtlIGl0IHNpbXBsZSAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgKGludCkgKGZyYWdQLT5mcl9maXgpLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gKGNoYXIpIDB4ZmY7Ci0JICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgICBicmVhazsKLQkgIH0KLQotCWJyZWFrOwotICAgICAgfQkJCQkvKiBjYXNlIFRBQihBQlJBTkNILFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKEZCUkFOQ0gsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgICB8fCBmbGFnX3Nob3J0X3JlZnMpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChGQlJBTkNILCBTSE9SVCk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZpeF9uZXcgKGZyYWdQLCAoaW50KSBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdIHw9IDB4NDA7IC8qIFR1cm4gb24gTE9ORyBiaXQgKi8KLQkgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIFRBQihGQlJBTkNILFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKFBDUkVMLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgICAgfHwgZmxhZ19zaG9ydF9yZWZzCi0JICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkgICAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSBtY2Y1MjAwKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENSRUwsIFNIT1JUKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSAyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDUkVMLCBMT05HKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSA0OwotCSAgfQotCWJyZWFrOwotICAgICAgfQkJCQkvKiBUQUIoUENSRUwsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKGZyYWdQLT5mcl9zeW1ib2wgIT0gTlVMTCkKLQkgICAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKEJDQzY4MDAwLCBCWVRFKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JLyogb25seSBCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KLQkvKiBjaGFuZ2UgYmNjIGludG8gYiFjYy9qbXAgYWJzbCBsb25nICovCi0JZnJhZ1AtPmZyX29wY29kZVswXSBePSAweDAxOwkvKiBpbnZlcnQgYmNjICovCi0JaWYgKGZsYWdfc2hvcnRfcmVmcykKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IDB4MDQ7CS8qIGJyYW5jaCBvZmZzZXQgPSA2ICovCi0JICAgIC8qIEpGOiB0aGVzZSB3ZXJlIGZyX29wY29kZVsyLDNdICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzBdID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzFdID0gKGNoYXIpIDB4Zjg7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsJLyogYWNjb3VudCBmb3Igam1wIGluc3RydWN0aW9uICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IDB4MDY7CS8qIGJyYW5jaCBvZmZzZXQgPSA2ICovCi0JICAgIC8qIEpGOiB0aGVzZSB3ZXJlIGZyX29wY29kZVsyLDNdICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzBdID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzFdID0gKGNoYXIpIDB4Zjk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsJLyogYWNjb3VudCBmb3Igam1wIGluc3RydWN0aW9uICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgfQotCWZyYWdfd2FuZSAoZnJhZ1ApOwotCWJyZWFrOwotICAgICAgfQkJCQkvKiBjYXNlIFRBQihCQ0M2ODAwMCxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChEQkNDLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKGZyYWdQLT5mcl9zeW1ib2wgIT0gTlVMTAotCSAgICAmJiBTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoREJDQywgU0hPUlQpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICAgIGJyZWFrOwotCSAgfQotCS8qIG9ubHkgREJjYyA2ODAwMCBpbnN0cnVjdGlvbnMgY2FuIGNvbWUgaGVyZSAqLwotCS8qIGNoYW5nZSBkYmNjIGludG8gZGJjYy9qbXAgYWJzbCBsb25nICovCi0JLyogSkY6IHRoZXNlIHVzZWQgdG8gYmUgZnJfb3Bjb2RlWzItNF0sIHdoaWNoIGlzIHdyb25nLiAqLwotCWJ1ZmZlcl9hZGRyZXNzWzBdID0gMHgwMDsJLyogYnJhbmNoIG9mZnNldCA9IDQgKi8KLQlidWZmZXJfYWRkcmVzc1sxXSA9IDB4MDQ7Ci0JYnVmZmVyX2FkZHJlc3NbMl0gPSAweDYwOwkvKiBwdXQgaW4gYnJhIHBjICsgLi4uICovCi0KLQlpZiAoZmxhZ19zaG9ydF9yZWZzKQotCSAgewotCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbNS03XSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1szXSA9IDB4MDQ7CS8qIHBsdXMgNCAqLwotCSAgICBidWZmZXJfYWRkcmVzc1s0XSA9IDB4NGU7CS8qIFB1dCBpbiBKdW1wIFdvcmQgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbNV0gPSAoY2hhcikgMHhmODsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwkvKiBhY2NvdW50IGZvciBicmEvam1wIGluc3RydWN0aW9uICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogSkY6IHRoZXNlIHdlcmUgZnJfb3Bjb2RlWzUtN10gKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbM10gPSAweDA2OwkvKiBQbHVzIDYgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbNF0gPSAweDRlOwkvKiBwdXQgaW4gam1wIGxvbmcgKDB4NGVmOSkgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbNV0gPSAoY2hhcikgMHhmOTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwkvKiBhY2NvdW50IGZvciBicmEvam1wIGluc3RydWN0aW9uICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgfQotCi0JZnJhZ193YW5lIChmcmFnUCk7Ci0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIGNhc2UgVEFCKERCQ0MsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoUENMRUEsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSkgPT0gc2VnbWVudAotCSAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICAgIHx8IGZsYWdfc2hvcnRfcmVmcwotCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDTEVBLCBTSE9SVCk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0xFQSwgTE9ORyk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gNjsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0JCQkJLyogVEFCKFBDTEVBLFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKFBDSU5ERVgsIFNaX1VOREVGKToKLSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCSAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSBtY2Y1MjAwKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0lOREVYLCBCWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDSU5ERVgsIExPTkcpOwotCSAgZnJhZ1AtPmZyX3ZhciArPSA0OwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBub3cgdGhhdCBTWl9VTkRFRiBhcmUgdGFrZW4gY2FyZSBvZiwgY2hlY2sgb3RoZXJzICovCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgQllURSk6Ci0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIEJZVEUpOgotICAgICAgLyogV2UgY2FuJ3QgZG8gYSBzaG9ydCBqdW1wIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBzbyBpbiB0aGF0Ci0JIGNhc2Ugd2UgZm9yY2Ugd29yZCBtb2RlLiAgQXQgdGhpcyBwb2ludCBTX0dFVF9WQUxVRSBzaG91bGQKLQkgcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIHN5bWJvbCB3aXRoaW4gaXRzIGZyYWcuICBJZiB0aGUKLQkgc3ltYm9sIGlzIGF0IHRoZSBzdGFydCBvZiBhIGZyYWcsIGFuZCBpdCBpcyB0aGUgbmV4dCBmcmFnCi0JIHdpdGggYW55IGRhdGEgaW4gaXQgKHVzdWFsbHkgdGhpcyBpcyBqdXN0IHRoZSBuZXh0IGZyYWcsIGJ1dAotCSBhc3NlbWJsZXIgbGlzdGluZ3MgbWF5IGludHJvZHVjZSBlbXB0eSBmcmFncyksIHdlIG11c3QgdXNlCi0JIHdvcmQgbW9kZS4gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3N5bWJvbCAmJiBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gMCkKLQl7Ci0JICBmcmFnUyAqc3RvcDsKLQkgIGZyYWdTICpsOwotCi0JICBzdG9wID0gc3ltYm9sX2dldF9mcmFnIChmcmFnUC0+ZnJfc3ltYm9sKTsKLQkgIGZvciAobCA9IGZyYWdQLT5mcl9uZXh0OyBsICE9IHN0b3A7IGwgPSBsLT5mcl9uZXh0KQotCSAgICBpZiAobC0+ZnJfZml4ICsgbC0+ZnJfdmFyICE9IDApCi0JICAgICAgYnJlYWs7Ci0JICBpZiAobCA9PSBzdG9wKQotCSAgICB7Ci0JICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFRBQlRZUEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSwgU0hPUlQpOwotCSAgICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9maXg7Ci19Ci0KLSNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCi0vKiB0aGUgYml0LWZpZWxkIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb25faW5mbyBzdHJ1Y3QgcGxheXMgaGVsbAotICAgd2l0aCB0aGUgYnl0ZS1vcmRlciBwcm9ibGVtcyBvZiBjcm9zcy1hc3NlbWJseS4gIFNvIGFzIGEgaGFjaywKLSAgIEkgYWRkZWQgdGhpcyBtYWNoLiBkZXBlbmRlbnQgcmkgdHdpZGRsZXIuICBVZ2x5LCBidXQgaXQgZ2V0cwotICAgeW91IHRoZXJlLiAtS1dLICovCi0vKiBvbiBtNjhrOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZywgbmV4dCB0aHJlZSBieXRlcwotICAgYXJlIHN5bWJvbG51bSwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBMYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIHBjcmVsLCBiaXRzIDYgJiA1IGFzIGxlbmd0aCwgYml0IDQgYXMgcGNyZWwsIGFuZCB0aGUgbG93ZXIKLSAgIG5pYmJsZSBhcyBudXRoaW4uIChvbiBTdW4gMyBhdCBsZWFzdCkgKi8KLS8qIFRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbnRvIHRhcmdldC1zcGVjaWZpYwotICAgZm9ybWF0LiAqLwotI2lmZGVmIGNvbW1lbnQKLXZvaWQKLW1kX3JpX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpKQotICAgICBjaGFyICp0aGVfYnl0ZXM7Ci0gICAgIHN0cnVjdCByZWxvY19pbmZvX2dlbmVyaWMgKnJpOwotewotICAvKiB0aGlzIGlzIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLT5yX2FkZHJlc3MsIDQpOwotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICB0aGVfYnl0ZXNbNF0gPSAocmktPnJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNV0gPSAocmktPnJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s2XSA9IHJpLT5yX3N5bWJvbG51bSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbN10gPSAoKChyaS0+cl9wY3JlbCA8PCA3KSAmIDB4ODApIHwgKChyaS0+cl9sZW5ndGggPDwgNSkgJiAweDYwKSB8Ci0JCSAgKChyaS0+cl9leHRlcm4gPDwgNCkgJiAweDEwKSk7Ci19Ci0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICAvKgotICAgKiBJbjogbGVuZ3RoIG9mIHJlbG9jYXRpb24gKG9yIG9mIGFkZHJlc3MpIGluIGNoYXJzOiAxLCAyIG9yIDQuCi0gICAqIE91dDogR05VIExEIHJlbG9jYXRpb24gbGVuZ3RoIGNvZGU6IDAsIDEsIG9yIDIuCi0gICAqLwotCi0gIHN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07Ci0gIGxvbmcgcl9zeW1ib2xudW07Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzRdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoZml4UC0+ZnhfcGNyZWwgPDwgNykgJiAweDgwKSB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDUpICYgMHg2MCkgfAotCSAgICAgICgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgNCkgJiAweDEwKSk7Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotQ09OU1QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDQ7Ci1DT05TVCBpbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA2OwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMik7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4NjAwMCwgMik7Ci0gIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMiwgKHZhbHVlVCkgb2Zmc2V0LCAyKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgaWYgKCFIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gU19HRVRfVkFMVUUgKHRvX3N5bWJvbCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg0RUY5LCAyKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMiwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLSAgICAgIGZpeF9uZXcgKGZyYWcsIChwdHIgKyAyKSAtIGZyYWctPmZyX2xpdGVyYWwsIDQsIHRvX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JICAgICAgIDAsIE5PX1JFTE9DKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDIpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4NjBmZiwgMik7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDIsICh2YWx1ZVQpIG9mZnNldCwgNCk7Ci0gICAgfQotfQotCi0jZW5kaWYKLQotLyogRGlmZmVyZW50IHZhbHVlcyBvZiBPSyB0ZWxsIHdoYXQgaXRzIE9LIHRvIHJldHVybi4gIFRoaW5ncyB0aGF0Ci0gICBhcmVuJ3QgT0sgYXJlIGFuIGVycm9yICh3aGF0IGEgc2hvY2ssIG5vPykKLQotICAgMDogIEV2ZXJ5dGhpbmcgaXMgT0sKLSAgIDEwOiAgQWJzb2x1dGUgMTo4CW9ubHkKLSAgIDIwOiAgQWJzb2x1dGUgMDo3CW9ubHkKLSAgIDMwOiAgYWJzb2x1dGUgMDoxNQlvbmx5Ci0gICA0MDogIEFic29sdXRlIDA6MzEJb25seQotICAgNTA6ICBhYnNvbHV0ZSAwOjEyNwlvbmx5Ci0gICA1NTogIGFic29sdXRlIC02NDo2MyAgICBvbmx5Ci0gICA2MDogIGFic29sdXRlIC0xMjg6MTI3CW9ubHkKLSAgIDcwOiAgYWJzb2x1dGUgMDo0MDk1CW9ubHkKLSAgIDgwOiAgTm8gYmlnbnVtcwotCi0gICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfbnVtIChleHAsIG9rKQotICAgICBzdHJ1Y3QgbTY4a19leHAgKmV4cDsKLSAgICAgaW50IG9rOwotewotICBpZiAoZXhwLT5leHAuWF9vcCA9PSBPX2Fic2VudCkKLSAgICB7Ci0gICAgICAvKiBEbyB0aGUgc2FtZSB0aGluZyB0aGUgVkFYIGFzbSBkb2VzICovCi0gICAgICBvcCAoZXhwKSA9IE9fY29uc3RhbnQ7Ci0gICAgICBhZGRzIChleHApID0gMDsKLSAgICAgIHN1YnMgKGV4cCkgPSAwOwotICAgICAgb2ZmcyAoZXhwKSA9IDA7Ci0gICAgICBpZiAob2sgPT0gMTApCi0JewotCSAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2U6IGRlZmF1bHRpbmcgdG8gMSIpKTsKLQkgIG9mZnMgKGV4cCkgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGV4cC0+ZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9rKQotCXsKLQljYXNlIDEwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAxIHx8IG9mZnMgKGV4cCkgPiA4KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2U6IGRlZmF1bHRpbmcgdG8gMSIpKTsKLQkgICAgICBvZmZzIChleHApID0gMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAyMDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gNykKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgMzA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDAgfHwgb2ZmcyAoZXhwKSA+IDE1KQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSA0MDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gMzIpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDUwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiAxMjcpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDU1OgotCSAgaWYgKG9mZnMgKGV4cCkgPCAtNjQgfHwgb2ZmcyAoZXhwKSA+IDYzKQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSA2MDoKLQkgIGlmIChvZmZzIChleHApIDwgLTEyOCB8fCBvZmZzIChleHApID4gMTI3KQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSA3MDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gNDA5NSkKLQkgICAgewotCSAgICBvdXRyYW5nZToKLQkgICAgICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAwIikpOwotCSAgICAgIG9mZnMgKGV4cCkgPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZXhwLT5leHAuWF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICBpZiAob2ZmcyAoZXhwKSA8PSAwCS8qIGZsb251bSAqLwotCSAgJiYgKG9rID09IDgwCQkvKiBubyBiaWdudW1zICovCi0JICAgICAgfHwgKG9rID4gMTAJLyogc21hbGwtaW50IHJhbmdlcyBpbmNsdWRpbmcgMCBvayAqLwotCQkgIC8qIElmIHdlIGhhdmUgYSBmbG9udW0gemVybywgYSB6ZXJvIGludGVnZXIgc2hvdWxkCi0JCSAgICAgZG8gYXMgd2VsbCAoZS5nLiwgaW4gbW92ZXEpLiAgKi8KLQkJICAmJiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5leHBvbmVudCA9PSAwCi0JCSAgJiYgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93WzBdID09IDApKSkKLQl7Ci0JICAvKiBIQUNLISBUdXJuIGl0IGludG8gYSBsb25nICovCi0JICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s2XTsKLQotCSAgZ2VuX3RvX3dvcmRzICh3b3JkcywgMiwgOEwpOwkvKiBUaGVzZSBudW1iZXJzIGFyZSBtYWdpYyEgKi8KLQkgIG9wIChleHApID0gT19jb25zdGFudDsKLQkgIGFkZHMgKGV4cCkgPSAwOwotCSAgc3VicyAoZXhwKSA9IDA7Ci0JICBvZmZzIChleHApID0gd29yZHNbMV0gfCAod29yZHNbMF0gPDwgMTYpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9rICE9IDApCi0JewotCSAgb3AgKGV4cCkgPSBPX2NvbnN0YW50OwotCSAgYWRkcyAoZXhwKSA9IDA7Ci0JICBzdWJzIChleHApID0gMDsKLQkgIG9mZnMgKGV4cCkgPSAob2sgPT0gMTApID8gMSA6IDA7Ci0JICBhc193YXJuIChfKCJDYW4ndCBkZWFsIHdpdGggZXhwcmVzc2lvbjsgZGVmYXVsdGluZyB0byAlbGQiKSwKLQkJICAgb2ZmcyAoZXhwKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvayA+PSAxMCAmJiBvayA8PSA3MCkKLQl7Ci0JICBvcCAoZXhwKSA9IE9fY29uc3RhbnQ7Ci0JICBhZGRzIChleHApID0gMDsKLQkgIHN1YnMgKGV4cCkgPSAwOwotCSAgb2ZmcyAoZXhwKSA9IChvayA9PSAxMCkgPyAxIDogMDsKLQkgIGFzX3dhcm4gKF8oIkNhbid0IGRlYWwgd2l0aCBleHByZXNzaW9uOyBkZWZhdWx0aW5nIHRvICVsZCIpLAotCQkgICBvZmZzIChleHApKTsKLQl9Ci0gICAgfQotCi0gIGlmIChleHAtPnNpemUgIT0gU0laRV9VTlNQRUMpCi0gICAgewotICAgICAgc3dpdGNoIChleHAtPnNpemUpCi0JewotCWNhc2UgU0laRV9VTlNQRUM6Ci0JY2FzZSBTSVpFX0xPTkc6Ci0JICBicmVhazsKLQljYXNlIFNJWkVfQllURToKLQkgIGlmICghaXNieXRlIChvZmZzIChleHApKSkKLQkgICAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBCWVRFIikpOwotCSAgYnJlYWs7Ci0JY2FzZSBTSVpFX1dPUkQ6Ci0JICBpZiAoIWlzd29yZCAob2ZmcyAoZXhwKSkpCi0JICAgIGFzX3dhcm4gKF8oImV4cHJlc3Npb24gZG9lc24ndCBmaXQgaW4gV09SRCIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnMgKGV4cCk7Ci19Ci0KLS8qIFRoZXNlIGFyZSB0aGUgYmFjay1lbmRzIGZvciB0aGUgdmFyaW91cyBtYWNoaW5lIGRlcGVuZGVudCBwc2V1ZG8tb3BzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZGF0YTEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19kYXRhMiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgMik7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFdlIGRvbid0IHN1cHBvcnQgcHV0dGluZyBmcmFncyBpbiB0aGUgQlNTIHNlZ21lbnQsIHdlIGZha2UgaXQKLSAgICAgYnkgbWFya2luZyBpbl9ic3MsIHRoZW4gbG9va2luZyBhdCBzX3NraXAgZm9yIGNsdWVzLiAgKi8KLQotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2V2ZW4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgcmVnaXN0ZXIgbG9uZyB0ZW1wX2ZpbGw7Ci0KLSAgdGVtcCA9IDE7CQkJLyogSkYgc2hvdWxkIGJlIDI/ICovCi0gIHRlbXBfZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoIW5lZWRfcGFzc18yKQkJLyogTmV2ZXIgbWFrZSBmcmFnIGlmIGV4cGVjdCBleHRyYSBwYXNzLiAqLwotICAgIGZyYWdfYWxpZ24gKHRlbXAsIChpbnQpIHRlbXBfZmlsbCwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIHRlbXApOwotfQotCi1zdGF0aWMgdm9pZAotc19wcm9jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBzZXVkby1vcHMgaGFuZGxlZCBmb3IgTVJJIGNvbXBhdGliaWxpdHkuICAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gaWYgdGhlIGFyZ3VtZW50IGlzIGEgY29uZGl0aW9uYWwKLSAgIHBzZXVkby1vcC4gIFRoaXMgaXMgY2FsbGVkIHdoZW4gY2hlY2tpbmcgd2hldGhlciBhIHBlbmRpbmcKLSAgIGFsaWdubWVudCBpcyBuZWVkZWQuICAqLwotCi1pbnQKLW02OGtfY29uZGl0aW9uYWxfcHNldWRvb3AgKHBvcCkKLSAgICAgcHNldWRvX3R5cGVTICpwb3A7Ci17Ci0gIHJldHVybiAocG9wLT5wb2NfaGFuZGxlciA9PSBzX21yaV9pZgotCSAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX21yaV9lbHNlKTsKLX0KLQotLyogSGFuZGxlIGFuIE1SSSBzdHlsZSBjaGlwIHNwZWNpZmljYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotbXJpX2NoaXAgKCkKLXsKLSAgY2hhciAqczsKLSAgY2hhciBjOwotICBpbnQgaTsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAvKiBXZSBjYW4ndCB1c2UgZ2V0X3N5bWJvbF9lbmQgc2luY2UgdGhlIHByb2Nlc3NvciBuYW1lcyBhcmUgbm90IHByb3BlcgotICAgICBzeW1ib2xzLiAgKi8KLSAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykpCi0gICAgOwotICAqLS1pbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQotICAgIGlmIChzdHJjYXNlY21wIChzLCBhcmNoc1tpXS5uYW1lKSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIGlmIChpID49IG5fYXJjaHMpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIlczogdW5yZWNvZ25pemVkIHByb2Nlc3NvciBuYW1lIiksIHMpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy8nKQotICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlID0gMDsKLSAgZWxzZQotICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlICY9IG02ODg4MSB8IG02ODg1MTsKLSAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gYXJjaHNbaV0uYXJjaDsKLQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLycpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgLyogV2UgY2FuJ3QgdXNlIGdldF9zeW1ib2xfZW5kIHNpbmNlIHRoZSBwcm9jZXNzb3IgbmFtZXMgYXJlIG5vdAotCSBwcm9wZXIgc3ltYm9scy4gICovCi0gICAgICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKSkKLQk7Ci0gICAgICAqLS1pbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICAgICAgaWYgKHN0cmNtcCAocywgIjY4ODgxIikgPT0gMCkKLQljdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4ODE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICI2ODg1MSIpID09IDApCi0JY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODUxOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSBpbmZvIGFib3V0IGF2YWlsYWJsZSBjb250cm9sIHJlZ2lzdGVycy4gICovCi0gIHNlbGVjdF9jb250cm9sX3JlZ3MgKCk7Ci19Ci0KLS8qIFRoZSBNUkkgQ0hJUCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19jaGlwIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLSAgbXJpX2NoaXAgKCk7Ci0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIE1SSSBGT1BUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2ZvcHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJJRD0iLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGludCB0ZW1wOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICh0ZW1wIDwgMCB8fCB0ZW1wID4gNykKLQlhc19iYWQgKF8oImJhZCBjb3Byb2Nlc3NvciBpZCIpKTsKLSAgICAgIGVsc2UKLQltNjhrX2Zsb2F0X2NvcG51bSA9IENPUDAgKyB0ZW1wOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5yZWNvZ25pemVkIGZvcHQgb3B0aW9uIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhhbmRsZSB0aGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdHJ1Y3Qgb3B0X2FjdGlvbgotewotICAvKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBJZiB0aGlzIGlzIG5vdCBOVUxMLCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbi4gIFRoZSBmaXJzdCBhcmd1bWVudAotICAgICBpcyB0aGUgQVJHIGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlLCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzCi0gICAgIHdoZXRoZXIgdGhlIG9wdGlvbiB3YXMgbmVnYXRlZC4gICovCi0gIHZvaWQgKCpwZm4pIFBBUkFNUyAoKGludCBhcmcsIGludCBvbikpOwotCi0gIC8qIElmIHRoaXMgaXMgbm90IE5VTEwsIGFuZCB0aGUgUEZOIGZpZWxkIGlzIE5VTEwsIHNldCB0aGUgdmFyaWFibGUKLSAgICAgdGhpcyBwb2ludHMgdG8uICBTZXQgaXQgdG8gdGhlIEFSRyBmaWVsZCBpZiB0aGUgb3B0aW9uIHdhcyBub3QKLSAgICAgbmVnYXRlZCwgYW5kIHRoZSBOT1RBUkcgZmllbGQgb3RoZXJ3aXNlLiAgKi8KLSAgaW50ICpwdmFyOwotCi0gIC8qIFRoZSB2YWx1ZSB0byBwYXNzIHRvIFBGTiBvciB0byBhc3NpZ24gdG8gKlBWQVIuICAqLwotICBpbnQgYXJnOwotCi0gIC8qIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gKlBWQVIgaWYgdGhlIG9wdGlvbiBpcyBuZWdhdGVkLiAgSWYgUEZOIGlzCi0gICAgIE5VTEwsIGFuZCBQVkFSIGlzIG5vdCBOVUxMLCBhbmQgQVJHIGFuZCBOT1RBUkcgYXJlIHRoZSBzYW1lLCB0aGVuCi0gICAgIHRoZSBvcHRpb24gbWF5IG5vdCBiZSBuZWdhdGVkLiAgKi8KLSAgaW50IG5vdGFyZzsKLX07Ci0KLS8qIFRoZSB0YWJsZSB1c2VkIHRvIGhhbmRsZSB0aGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZCBza2lwX3RvX2NvbW1hIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcHRfbmVzdCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3B0X2NoaXAgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9wdF9saXN0IFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcHRfbGlzdF9zeW1ib2xzIFBBUkFNUyAoKGludCwgaW50KSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0X2FjdGlvbiBvcHRfdGFibGVbXSA9Ci17Ci0gIHsgImFic3BjYWRkIiwgMCwgJm02OGtfYWJzcGNhZGQsIDEsIDAgfSwKLQotICAvKiBXZSBkbyByZWxheGluZywgc28gdGhlcmUgaXMgbGl0dGxlIHVzZSBmb3IgdGhlc2Ugb3B0aW9ucy4gICovCi0gIHsgImIiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImJycyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiYnJiIiwgMCwgMCwgMCwgMCB9LAotICB7ICJicmwiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImJydyIsIDAsIDAsIDAsIDAgfSwKLQotICB7ICJjIiwgMCwgMCwgMCwgMCB9LAotICB7ICJjZXgiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImNhc2UiLCAwLCAmc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSwgMSwgMCB9LAotICB7ICJjbCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiY3JlIiwgMCwgMCwgMCwgMCB9LAotICB7ICJkIiwgMCwgJmZsYWdfa2VlcF9sb2NhbHMsIDEsIDAgfSwKLSAgeyAiZSIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiZiIsIDAsICZmbGFnX3Nob3J0X3JlZnMsIDEsIDAgfSwKLSAgeyAiZnJzIiwgMCwgJmZsYWdfc2hvcnRfcmVmcywgMSwgMCB9LAotICB7ICJmcmwiLCAwLCAmZmxhZ19zaG9ydF9yZWZzLCAwLCAxIH0sCi0gIHsgImciLCAwLCAwLCAwLCAwIH0sCi0gIHsgImkiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm0iLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm1leCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAibWMiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm1kIiwgMCwgMCwgMCwgMCB9LAotICB7ICJuZXN0Iiwgb3B0X25lc3QsIDAsIDAsIDAgfSwKLSAgeyAibmV4dCIsIHNraXBfdG9fY29tbWEsIDAsIDAsIDAgfSwKLSAgeyAibyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAib2xkIiwgMCwgMCwgMCwgMCB9LAotICB7ICJvcCIsIHNraXBfdG9fY29tbWEsIDAsIDAsIDAgfSwKLSAgeyAicGNvIiwgMCwgMCwgMCwgMCB9LAotICB7ICJwIiwgb3B0X2NoaXAsIDAsIDAsIDAgfSwKLSAgeyAicGNyIiwgMCwgMCwgMCwgMCB9LAotICB7ICJwY3MiLCAwLCAwLCAwLCAwIH0sCi0gIHsgInIiLCAwLCAwLCAwLCAwIH0sCi0gIHsgInF1aWNrIiwgMCwgJm02OGtfcXVpY2ssIDEsIDAgfSwKLSAgeyAicmVsMzIiLCAwLCAmbTY4a19yZWwzMiwgMSwgMCB9LAotICB7ICJzIiwgb3B0X2xpc3QsIDAsIDAsIDAgfSwKLSAgeyAidCIsIG9wdF9saXN0X3N5bWJvbHMsIDAsIDAsIDAgfSwKLSAgeyAidyIsIDAsICZmbGFnX25vX3dhcm5pbmdzLCAwLCAxIH0sCi0gIHsgIngiLCAwLCAwLCAwLCAwIH0KLX07Ci0KLSNkZWZpbmUgT1BUQ09VTlQgKHNpemVvZiBvcHRfdGFibGUgLyBzaXplb2Ygb3B0X3RhYmxlWzBdKQotCi0vKiBUaGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19vcHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBkbwotICAgIHsKLSAgICAgIGludCB0OwotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgYzsKLSAgICAgIGludCBpOwotICAgICAgY29uc3Qgc3RydWN0IG9wdF9hY3Rpb24gKm87Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgdCA9IDE7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB0ID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiTk8iLCAyKSA9PSAwKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgdCA9IDA7Ci0JfQotCi0gICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgICBmb3IgKGkgPSAwLCBvID0gb3B0X3RhYmxlOyBpIDwgT1BUQ09VTlQ7IGkrKywgbysrKQotCXsKLQkgIGlmIChzdHJjYXNlY21wIChzLCBvLT5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKG8tPnBmbikKLQkJewotCQkgIC8qIFJlc3RvcmUgaW5wdXRfbGluZV9wb2ludGVyIG5vdyBpbiBjYXNlIHRoZSBvcHRpb24KLQkJICAgICB0YWtlcyBhcmd1bWVudHMuICAqLwotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICgqby0+cGZuKSAoby0+YXJnLCB0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG8tPnB2YXIgIT0gTlVMTCkKLQkJewotCQkgIGlmICghIHQgJiYgby0+YXJnID09IG8tPm5vdGFyZykKLQkJICAgIGFzX2JhZCAoXygib3B0aW9uIGAlcycgbWF5IG5vdCBiZSBuZWdhdGVkIiksIHMpOwotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICpvLT5wdmFyID0gdCA/IG8tPmFyZyA6IG8tPm5vdGFyZzsKLQkJfQotCSAgICAgIGVsc2UKLQkJKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoaSA+PSBPUFRDT1VOVCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wdGlvbiBgJXMnIG5vdCByZWNvZ25pemVkIiksIHMpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIC8qIE1vdmUgYmFjayB0byB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIuICAqLwotICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogU2tpcCBhaGVhZCB0byBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciBPUFQgb3B0aW9ucyB3aGljaCB3ZSBkbwotICAgbm90IHN1cHBvciB0YW5kIHdoaWNoIHRha2UgYXJndW1lbnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNraXBfdG9fY29tbWEgKGFyZywgb24pCi0gICAgIGludCBhcmcgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJwotCSAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotLyogSGFuZGxlIHRoZSBPUFQgTkVTVD1kZXB0aCBvcHRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb3B0X25lc3QgKGFyZywgb24pCi0gICAgIGludCBhcmcgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc9JykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCBmb3JtYXQgb2YgT1BUIE5FU1Q9ZGVwdGgiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBtYXhfbWFjcm9fbmVzdCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE9QVCBQPWNoaXAgb3B0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9wdF9jaGlwIChhcmcsIG9uKQotICAgICBpbnQgYXJnIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvbiBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPScpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBqdXN0IE9QVCBQLCB3aGljaCB3ZSBkbyBub3Qgc3VwcG9ydC4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBtcmlfY2hpcCAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBPUFQgUyBvcHRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb3B0X2xpc3QgKGFyZywgb24pCi0gICAgIGludCBhcmcgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9uOwotewotICBsaXN0aW5nX2xpc3QgKG9uKTsKLX0KLQotLyogSGFuZGxlIHRoZSBPUFQgVCBvcHRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb3B0X2xpc3Rfc3ltYm9scyAoYXJnLCBvbikKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgb247Ci17Ci0gIGlmIChvbikKLSAgICBsaXN0aW5nIHw9IExJU1RJTkdfU1lNQk9MUzsKLSAgZWxzZQotICAgIGxpc3RpbmcgJj1+IExJU1RJTkdfU1lNQk9MUzsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgUkVHIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3JlZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBjOwotICBzdHJ1Y3QgbTY4a19vcCByb3A7Ci0gIGludCBtYXNrOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAobGluZV9sYWJlbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBsYWJlbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikKLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLQkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSBSRUdJU1RFUl9QUkVGSVgKLSNlbmRpZgotCSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICcvJwotCSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCi0gIGlmIChtNjhrX2lwX29wIChzLCAmcm9wKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChyb3AuZXJyb3IgPT0gTlVMTCkKLQlhc19iYWQgKF8oImJhZCByZWdpc3RlciBsaXN0IikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIGxpc3Q6ICVzIiksIHJvcC5lcnJvcik7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmIChyb3AubW9kZSA9PSBSRUdMU1QpCi0gICAgbWFzayA9IHJvcC5tYXNrOwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBEUkVHKQotICAgIG1hc2sgPSAxIDw8IChyb3AucmVnIC0gREFUQTApOwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBBUkVHKQotICAgIG1hc2sgPSAxIDw8IChyb3AucmVnIC0gQUREUjAgKyA4KTsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gRlBSRUcpCi0gICAgbWFzayA9IDEgPDwgKHJvcC5yZWcgLSBGUDAgKyAxNik7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IENPTlRST0wKLQkgICAmJiByb3AucmVnID09IEZQSSkKLSAgICBtYXNrID0gMSA8PCAyNDsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQ09OVFJPTAotCSAgICYmIHJvcC5yZWcgPT0gRlBTKQotICAgIG1hc2sgPSAxIDw8IDI1OwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBDT05UUk9MCi0JICAgJiYgcm9wLnJlZyA9PSBGUEMpCi0gICAgbWFzayA9IDEgPDwgMjY7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCByZWdpc3RlciBsaXN0IikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU19TRVRfU0VHTUVOVCAobGluZV9sYWJlbCwgcmVnX3NlY3Rpb24pOwotICBTX1NFVF9WQUxVRSAobGluZV9sYWJlbCwgfm1hc2spOwotICBzeW1ib2xfc2V0X2ZyYWcgKGxpbmVfbGFiZWwsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHRoZSBNUkkgU0FWRSBhbmQgUkVTVE9SRSBwc2V1ZG8tb3BzLiAgKi8KLQotc3RydWN0IHNhdmVfb3B0cwotewotICBzdHJ1Y3Qgc2F2ZV9vcHRzICpuZXh0OwotICBpbnQgYWJzcGNhZGQ7Ci0gIGludCBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlOwotICBpbnQga2VlcF9sb2NhbHM7Ci0gIGludCBzaG9ydF9yZWZzOwotICBpbnQgYXJjaGl0ZWN0dXJlOwotICBpbnQgcXVpY2s7Ci0gIGludCByZWwzMjsKLSAgaW50IGxpc3Rpbmc7Ci0gIGludCBub193YXJuaW5nczsKLSAgLyogRklYTUU6IFdlIGRvbid0IHNhdmUgT1BUIFMuICAqLwotfTsKLQotLyogVGhpcyB2YXJpYWJsZSBob2xkcyB0aGUgc3RhY2sgb2Ygc2F2ZWQgb3B0aW9ucy4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc2F2ZV9vcHRzICpzYXZlX3N0YWNrOwotCi0vKiBUaGUgTVJJIFNBVkUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfc2F2ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBzYXZlX29wdHMgKnM7Ci0KLSAgcyA9IChzdHJ1Y3Qgc2F2ZV9vcHRzICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNhdmVfb3B0cykpOwotICBzLT5hYnNwY2FkZCA9IG02OGtfYWJzcGNhZGQ7Ci0gIHMtPnN5bWJvbHNfY2FzZV9zZW5zaXRpdmUgPSBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlOwotICBzLT5rZWVwX2xvY2FscyA9IGZsYWdfa2VlcF9sb2NhbHM7Ci0gIHMtPnNob3J0X3JlZnMgPSBmbGFnX3Nob3J0X3JlZnM7Ci0gIHMtPmFyY2hpdGVjdHVyZSA9IGN1cnJlbnRfYXJjaGl0ZWN0dXJlOwotICBzLT5xdWljayA9IG02OGtfcXVpY2s7Ci0gIHMtPnJlbDMyID0gbTY4a19yZWwzMjsKLSAgcy0+bGlzdGluZyA9IGxpc3Rpbmc7Ci0gIHMtPm5vX3dhcm5pbmdzID0gZmxhZ19ub193YXJuaW5nczsKLQotICBzLT5uZXh0ID0gc2F2ZV9zdGFjazsKLSAgc2F2ZV9zdGFjayA9IHM7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIE1SSSBSRVNUT1JFIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3Jlc3RvcmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3Qgc2F2ZV9vcHRzICpzOwotCi0gIGlmIChzYXZlX3N0YWNrID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJyZXN0b3JlIHdpdGhvdXQgc2F2ZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHMgPSBzYXZlX3N0YWNrOwotICBzYXZlX3N0YWNrID0gcy0+bmV4dDsKLQotICBtNjhrX2Fic3BjYWRkID0gcy0+YWJzcGNhZGQ7Ci0gIHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUgPSBzLT5zeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlOwotICBmbGFnX2tlZXBfbG9jYWxzID0gcy0+a2VlcF9sb2NhbHM7Ci0gIGZsYWdfc2hvcnRfcmVmcyA9IHMtPnNob3J0X3JlZnM7Ci0gIGN1cnJlbnRfYXJjaGl0ZWN0dXJlID0gcy0+YXJjaGl0ZWN0dXJlOwotICBtNjhrX3F1aWNrID0gcy0+cXVpY2s7Ci0gIG02OGtfcmVsMzIgPSBzLT5yZWwzMjsKLSAgbGlzdGluZyA9IHMtPmxpc3Rpbmc7Ci0gIGZsYWdfbm9fd2FybmluZ3MgPSBzLT5ub193YXJuaW5nczsKLQotICBmcmVlIChzKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUeXBlcyBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLwotCi1lbnVtIG1yaV9jb250cm9sX3R5cGUKLXsKLSAgbXJpX2ZvciwKLSAgbXJpX2lmLAotICBtcmlfcmVwZWF0LAotICBtcmlfd2hpbGUKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RhY2sgdGhlIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wKLSAgIGRpcmVjdGl2ZXMuICAqLwotCi1zdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbwotewotICAvKiBUaGUgZGlyZWN0aXZlIHdpdGhpbiB3aGljaCB0aGlzIG9uZSBpcyBlbmNsb3NlZC4gICovCi0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpvdXRlcjsKLQotICAvKiBUaGUgdHlwZSBvZiBkaXJlY3RpdmUuICAqLwotICBlbnVtIG1yaV9jb250cm9sX3R5cGUgdHlwZTsKLQotICAvKiBXaGV0aGVyIGFuIEVMU0UgaGFzIGJlZW4gaW4gYW4gSUYuICAqLwotICBpbnQgZWxzZV9zZWVuOwotCi0gIC8qIFRoZSBhZGQgb3Igc3ViIHN0YXRlbWVudCBhdCB0aGUgZW5kIG9mIGEgRk9SLiAgKi8KLSAgY2hhciAqaW5jcjsKLQotICAvKiBUaGUgbGFiZWwgb2YgdGhlIHRvcCBvZiBhIEZPUiBvciBSRVBFQVQgbG9vcC4gICovCi0gIGNoYXIgKnRvcDsKLQotICAvKiBUaGUgbGFiZWwgdG8ganVtcCB0byBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLCBvciB0aGUgZWxzZQotICAgICBleHByZXNzaW9uIG9mIGEgY29uZGl0aW9uYWwuICAqLwotICBjaGFyICpuZXh0OwotCi0gIC8qIFRoZSBsYWJlbCB0byBqdW1wIHRvIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgb3IgdGhlIGxhYmVsIHBhc3QKLSAgICAgdGhlIGVuZCBvZiBhIGNvbmRpdGlvbmFsLiAgKi8KLSAgY2hhciAqYm90dG9tOwotfTsKLQotLyogVGhlIHN0YWNrIG9mIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbXJpX2NvbnRyb2xfc3RhY2s7Ci0KLS8qIFRoZSBjdXJyZW50IE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIGluZGV4IG51bWJlciwgdXNlZCB0bwotICAgZ2VuZXJhdGUgbGFiZWwgbmFtZXMuICAqLwotCi1zdGF0aWMgaW50IG1yaV9jb250cm9sX2luZGV4OwotCi0vKiBTb21lIGZ1bmN0aW9uIHByb3RvdHlwZXMuICAqLwotCi1zdGF0aWMgdm9pZCBtcmlfYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgY2hhciAqbXJpX2NvbnRyb2xfbGFiZWwgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpwdXNoX21yaV9jb250cm9sCi0gIFBBUkFNUyAoKGVudW0gbXJpX2NvbnRyb2xfdHlwZSkpOwotc3RhdGljIHZvaWQgcG9wX21yaV9jb250cm9sIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcGFyc2VfbXJpX2NvbmRpdGlvbiBQQVJBTVMgKChpbnQgKikpOwotc3RhdGljIGludCBwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kCi0gIFBBUkFNUyAoKGludCAqLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqLCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHN3YXBfbXJpX2NvbmRpdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgcmV2ZXJzZV9tcmlfY29uZGl0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZAotICBQQVJBTVMgKChpbnQsIGludCwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24KLSAgUEFSQU1TICgoY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotLyogQXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gZm9yIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlLiAgKi8KLQotc3RhdGljIHZvaWQKLW1yaV9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgLyogbWRfYXNzZW1ibGUgZXhwZWN0cyB0aGUgb3Bjb2RlIHRvIGJlIGluIGxvd2VyIGNhc2UuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICcgJyAmJiAqcyAhPSAnXDAnOyBzKyspCi0gICAgewotICAgICAgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JKnMgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMpOwotICAgIH0KLQotICBtZF9hc3NlbWJsZSAoc3RyKTsKLX0KLQotLyogR2VuZXJhdGUgYSBuZXcgTVJJIGxhYmVsIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUgbGFiZWwgbmFtZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLW1yaV9jb250cm9sX2xhYmVsICgpCi17Ci0gIGNoYXIgKm47Ci0KLSAgbiA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgc3ByaW50ZiAobiwgIiVzbWMlZCIsIEZBS0VfTEFCRUxfTkFNRSwgbXJpX2NvbnRyb2xfaW5kZXgpOwotICArK21yaV9jb250cm9sX2luZGV4OwotICByZXR1cm4gbjsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICoKLXB1c2hfbXJpX2NvbnRyb2wgKHR5cGUpCi0gICAgIGVudW0gbXJpX2NvbnRyb2xfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICBuID0gKHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG1yaV9jb250cm9sX2luZm8pKTsKLQotICBuLT50eXBlID0gdHlwZTsKLSAgbi0+ZWxzZV9zZWVuID0gMDsKLSAgaWYgKHR5cGUgPT0gbXJpX2lmIHx8IHR5cGUgPT0gbXJpX3doaWxlKQotICAgIG4tPnRvcCA9IE5VTEw7Ci0gIGVsc2UKLSAgICBuLT50b3AgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLSAgbi0+bmV4dCA9IG1yaV9jb250cm9sX2xhYmVsICgpOwotICBuLT5ib3R0b20gPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLQotICBuLT5vdXRlciA9IG1yaV9jb250cm9sX3N0YWNrOwotICBtcmlfY29udHJvbF9zdGFjayA9IG47Ci0KLSAgcmV0dXJuIG47Ci19Ci0KLS8qIFBvcCBvZmYgdGhlIHN0YWNrIG9mIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wb3BfbXJpX2NvbnRyb2wgKCkKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgbiA9IG1yaV9jb250cm9sX3N0YWNrOwotICBtcmlfY29udHJvbF9zdGFjayA9IG4tPm91dGVyOwotICBpZiAobi0+dG9wICE9IE5VTEwpCi0gICAgZnJlZSAobi0+dG9wKTsKLSAgZnJlZSAobi0+bmV4dCk7Ci0gIGZyZWUgKG4tPmJvdHRvbSk7Ci0gIGZyZWUgKG4pOwotfQotCi0vKiBSZWNvZ25pemUgYSBjb25kaXRpb24gY29kZSBpbiBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9tcmlfY29uZGl0aW9uIChwY2MpCi0gICAgIGludCAqcGNjOwotewotICBjaGFyIGMxLCBjMjsKLQotICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc8Jyk7Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMxID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICBjMiA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmIChpc3VwcGVyIChjMSkpCi0gICAgYzEgPSB0b2xvd2VyIChjMSk7Ci0gIGlmIChpc3VwcGVyIChjMikpCi0gICAgYzIgPSB0b2xvd2VyIChjMik7Ci0KLSAgKnBjYyA9IChjMSA8PCA4KSB8IGMyOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQYXJzZSBhIHNpbmdsZSBvcGVyYW5kIGluIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKHBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwgcmlnaHRzdG9wKQotICAgICBpbnQgKnBjYzsKLSAgICAgY2hhciAqKmxlZnRzdGFydDsKLSAgICAgY2hhciAqKmxlZnRzdG9wOwotICAgICBjaGFyICoqcmlnaHRzdGFydDsKLSAgICAgY2hhciAqKnJpZ2h0c3RvcDsKLXsKLSAgY2hhciAqczsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgKnBjYyA9IC0xOwotICAqbGVmdHN0YXJ0ID0gTlVMTDsKLSAgKmxlZnRzdG9wID0gTlVMTDsKLSAgKnJpZ2h0c3RhcnQgPSBOVUxMOwotICAqcmlnaHRzdG9wID0gTlVMTDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPCcpCi0gICAgewotICAgICAgLyogSXQncyBqdXN0IGEgY29uZGl0aW9uIGNvZGUuICAqLwotICAgICAgcmV0dXJuIHBhcnNlX21yaV9jb25kaXRpb24gKHBjYyk7Ci0gICAgfQotCi0gIC8qIExvb2sgYWhlYWQgZm9yIHRoZSBjb25kaXRpb24gY29kZS4gICovCi0gIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsgKnMgIT0gJ1wwJzsgKytzKQotICAgIHsKLSAgICAgIGlmICgqcyA9PSAnPCcgJiYgc1sxXSAhPSAnXDAnICYmIHNbMl0gIT0gJ1wwJyAmJiBzWzNdID09ICc+JykKLQlicmVhazsKLSAgICB9Ci0gIGlmICgqcyA9PSAnXDAnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBjb25kaXRpb24gY29kZSBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICpsZWZ0c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpsZWZ0c3RvcCA9IHM7Ci0gIGlmICgqbGVmdHN0b3AgPiAqbGVmdHN0YXJ0Ci0gICAgICAmJiAoKCpsZWZ0c3RvcClbLTFdID09ICcgJyB8fCAoKmxlZnRzdG9wKVstMV0gPT0gJ1x0JykpCi0gICAgLS0qbGVmdHN0b3A7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgaWYgKCEgcGFyc2VfbXJpX2NvbmRpdGlvbiAocGNjKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBMb29rIGFoZWFkIGZvciBBTkQgb3IgT1Igb3IgZW5kIG9mIGxpbmUuICAqLwotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICpzICE9ICdcMCc7ICsrcykKLSAgICB7Ci0gICAgICBpZiAoKHN0cm5jYXNlY21wIChzLCAiQU5EIiwgMykgPT0gMAotCSAgICYmIChzWzNdID09ICcuJyB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoc1szXSkpKQotCSAgfHwgKHN0cm5jYXNlY21wIChzLCAiT1IiLCAyKSA9PSAwCi0JICAgICAgJiYgKHNbMl0gPT0gJy4nIHx8ICEgaXNfcGFydF9vZl9uYW1lIChzWzJdKSkpKQotCWJyZWFrOwotICAgIH0KLQotICAqcmlnaHRzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnJpZ2h0c3RvcCA9IHM7Ci0gIGlmICgqcmlnaHRzdG9wID4gKnJpZ2h0c3RhcnQKLSAgICAgICYmICgoKnJpZ2h0c3RvcClbLTFdID09ICcgJyB8fCAoKnJpZ2h0c3RvcClbLTFdID09ICdcdCcpKQotICAgIC0tKnJpZ2h0c3RvcDsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCi0gIHJldHVybiAxOwotfQotCi0jZGVmaW5lIE1DQyhiMSwgYjIpICgoKGIxKSA8PCA4KSB8IChiMikpCi0KLS8qIFN3YXAgdGhlIHNlbnNlIG9mIGEgY29uZGl0aW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBjb25kaXRpb24gc28gdGhhdAotICAgaXQgZ2VuZXJhdGVzIHRoZSBzYW1lIHJlc3VsdCB3aGVuIHRoZSBvcGVyYW5kcyBhcmUgc3dhcHBlZC4gICovCi0KLXN0YXRpYyBpbnQKLXN3YXBfbXJpX2NvbmRpdGlvbiAoY2MpCi0gICAgIGludCBjYzsKLXsKLSAgc3dpdGNoIChjYykKLSAgICB7Ci0gICAgY2FzZSBNQ0MgKCdoJywgJ2knKTogcmV0dXJuIE1DQyAoJ2MnLCAncycpOwotICAgIGNhc2UgTUNDICgnbCcsICdzJyk6IHJldHVybiBNQ0MgKCdjJywgJ2MnKTsKLSAgICBjYXNlIE1DQyAoJ2MnLCAnYycpOiByZXR1cm4gTUNDICgnbCcsICdzJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ3MnKTogcmV0dXJuIE1DQyAoJ2gnLCAnaScpOwotICAgIGNhc2UgTUNDICgncCcsICdsJyk6IHJldHVybiBNQ0MgKCdtJywgJ2knKTsKLSAgICBjYXNlIE1DQyAoJ20nLCAnaScpOiByZXR1cm4gTUNDICgncCcsICdsJyk7Ci0gICAgY2FzZSBNQ0MgKCdnJywgJ2UnKTogcmV0dXJuIE1DQyAoJ2wnLCAnZScpOwotICAgIGNhc2UgTUNDICgnbCcsICd0Jyk6IHJldHVybiBNQ0MgKCdnJywgJ3QnKTsKLSAgICBjYXNlIE1DQyAoJ2cnLCAndCcpOiByZXR1cm4gTUNDICgnbCcsICd0Jyk7Ci0gICAgY2FzZSBNQ0MgKCdsJywgJ2UnKTogcmV0dXJuIE1DQyAoJ2cnLCAnZScpOwotICAgIH0KLSAgcmV0dXJuIGNjOwotfQotCi0vKiBSZXZlcnNlIHRoZSBzZW5zZSBvZiBhIGNvbmRpdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXJldmVyc2VfbXJpX2NvbmRpdGlvbiAoY2MpCi0gICAgIGludCBjYzsKLXsKLSAgc3dpdGNoIChjYykKLSAgICB7Ci0gICAgY2FzZSBNQ0MgKCdoJywgJ2knKTogcmV0dXJuIE1DQyAoJ2wnLCAncycpOwotICAgIGNhc2UgTUNDICgnbCcsICdzJyk6IHJldHVybiBNQ0MgKCdoJywgJ2knKTsKLSAgICBjYXNlIE1DQyAoJ2MnLCAnYycpOiByZXR1cm4gTUNDICgnYycsICdzJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ3MnKTogcmV0dXJuIE1DQyAoJ2MnLCAnYycpOwotICAgIGNhc2UgTUNDICgnbicsICdlJyk6IHJldHVybiBNQ0MgKCdlJywgJ3EnKTsKLSAgICBjYXNlIE1DQyAoJ2UnLCAncScpOiByZXR1cm4gTUNDICgnbicsICdlJyk7Ci0gICAgY2FzZSBNQ0MgKCd2JywgJ2MnKTogcmV0dXJuIE1DQyAoJ3YnLCAncycpOwotICAgIGNhc2UgTUNDICgndicsICdzJyk6IHJldHVybiBNQ0MgKCd2JywgJ2MnKTsKLSAgICBjYXNlIE1DQyAoJ3AnLCAnbCcpOiByZXR1cm4gTUNDICgnbScsICdpJyk7Ci0gICAgY2FzZSBNQ0MgKCdtJywgJ2knKTogcmV0dXJuIE1DQyAoJ3AnLCAnbCcpOwotICAgIGNhc2UgTUNDICgnZycsICdlJyk6IHJldHVybiBNQ0MgKCdsJywgJ3QnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAndCcpOiByZXR1cm4gTUNDICgnZycsICdlJyk7Ci0gICAgY2FzZSBNQ0MgKCdnJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2wnLCAnZScpOwotICAgIGNhc2UgTUNDICgnbCcsICdlJyk6IHJldHVybiBNQ0MgKCdnJywgJ3QnKTsKLSAgICB9Ci0gIHJldHVybiBjYzsKLX0KLQotLyogQnVpbGQgYW4gTVJJIHN0cnVjdHVyZWQgY29udHJvbCBleHByZXNzaW9uLiAgVGhpcyBnZW5lcmF0ZXMgdGVzdAotICAgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuICBJdCBnb2VzIHRvIFRSVUVMQUIgaWYgdGhlIGNvbmRpdGlvbiBpcwotICAgdHJ1ZSwgYW5kIHRvIEZBTFNFTEFCIGlmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuICBFeGFjdGx5IG9uZSBvZgotICAgVFJVRUxBQiBhbmQgRkFMU0VMQUIgd2lsbCBiZSBOVUxMLCBtZWFuaW5nIHRvIGZhbGwgdGhyb3VnaC4gIFFVQUwKLSAgIGlzIHRoZSBzaXplIHF1YWxpZmllciBmb3IgdGhlIGV4cHJlc3Npb24uICBFWFRFTlQgaXMgdGhlIHNpemUgdG8KLSAgIHVzZSBmb3IgdGhlIGJyYW5jaC4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCSAgIHJpZ2h0c3RvcCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCkKLSAgICAgaW50IHF1YWw7Ci0gICAgIGludCBjYzsKLSAgICAgY2hhciAqbGVmdHN0YXJ0OwotICAgICBjaGFyICpsZWZ0c3RvcDsKLSAgICAgY2hhciAqcmlnaHRzdGFydDsKLSAgICAgY2hhciAqcmlnaHRzdG9wOwotICAgICBjb25zdCBjaGFyICp0cnVlbGFiOwotICAgICBjb25zdCBjaGFyICpmYWxzZWxhYjsKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgY2hhciAqYnVmOwotICBjaGFyICpzOwotCi0gIGlmIChsZWZ0c3RhcnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbTY4a19vcCBsZWZ0b3AsIHJpZ2h0b3A7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIC8qIFN3YXAgdGhlIGNvbXBhcmUgb3BlcmFuZHMsIGlmIG5lY2Vzc2FyeSwgdG8gcHJvZHVjZSBhIGxlZ2FsCi0JIG02OGsgY29tcGFyZSBpbnN0cnVjdGlvbi4gIENvbXBhcmluZyBhIHJlZ2lzdGVyIG9wZXJhbmQgd2l0aAotCSBhIG5vbi1yZWdpc3RlciBvcGVyYW5kIHJlcXVpcmVzIHRoZSByZWdpc3RlciB0byBiZSBvbiB0aGUKLQkgcmlnaHQgKGNtcCwgY21wYSkuICBDb21wYXJpbmcgYW4gaW1tZWRpYXRlIHZhbHVlIHdpdGgKLQkgYW55dGhpbmcgcmVxdWlyZXMgdGhlIGltbWVkaWF0ZSB2YWx1ZSB0byBiZSBvbiB0aGUgbGVmdAotCSAoY21waSkuICAqLwotCi0gICAgICBjID0gKmxlZnRzdG9wOwotICAgICAgKmxlZnRzdG9wID0gJ1wwJzsKLSAgICAgICh2b2lkKSBtNjhrX2lwX29wIChsZWZ0c3RhcnQsICZsZWZ0b3ApOwotICAgICAgKmxlZnRzdG9wID0gYzsKLQotICAgICAgYyA9ICpyaWdodHN0b3A7Ci0gICAgICAqcmlnaHRzdG9wID0gJ1wwJzsKLSAgICAgICh2b2lkKSBtNjhrX2lwX29wIChyaWdodHN0YXJ0LCAmcmlnaHRvcCk7Ci0gICAgICAqcmlnaHRzdG9wID0gYzsKLQotICAgICAgaWYgKHJpZ2h0b3AubW9kZSA9PSBJTU1FRAotCSAgfHwgKChsZWZ0b3AubW9kZSA9PSBEUkVHIHx8IGxlZnRvcC5tb2RlID09IEFSRUcpCi0JICAgICAgJiYgKHJpZ2h0b3AubW9kZSAhPSBEUkVHICYmIHJpZ2h0b3AubW9kZSAhPSBBUkVHKSkpCi0JewotCSAgY2hhciAqdGVtcDsKLQotCSAgY2MgPSBzd2FwX21yaV9jb25kaXRpb24gKGNjKTsKLQkgIHRlbXAgPSBsZWZ0c3RhcnQ7Ci0JICBsZWZ0c3RhcnQgPSByaWdodHN0YXJ0OwotCSAgcmlnaHRzdGFydCA9IHRlbXA7Ci0JICB0ZW1wID0gbGVmdHN0b3A7Ci0JICBsZWZ0c3RvcCA9IHJpZ2h0c3RvcDsKLQkgIHJpZ2h0c3RvcCA9IHRlbXA7Ci0JfQotICAgIH0KLQotICBpZiAodHJ1ZWxhYiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNjID0gcmV2ZXJzZV9tcmlfY29uZGl0aW9uIChjYyk7Ci0gICAgICB0cnVlbGFiID0gZmFsc2VsYWI7Ci0gICAgfQotICAgICAgCi0gIGlmIChsZWZ0c3RhcnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgyMAotCQkJICAgICAgKyAobGVmdHN0b3AgLSBsZWZ0c3RhcnQpCi0JCQkgICAgICArIChyaWdodHN0b3AgLSByaWdodHN0YXJ0KSk7Ci0gICAgICBzID0gYnVmOwotICAgICAgKnMrKyA9ICdjJzsKLSAgICAgICpzKysgPSAnbSc7Ci0gICAgICAqcysrID0gJ3AnOwotICAgICAgaWYgKHF1YWwgIT0gJ1wwJykKLQkqcysrID0gcXVhbDsKLSAgICAgICpzKysgPSAnICc7Ci0gICAgICBtZW1jcHkgKHMsIGxlZnRzdGFydCwgbGVmdHN0b3AgLSBsZWZ0c3RhcnQpOwotICAgICAgcyArPSBsZWZ0c3RvcCAtIGxlZnRzdGFydDsKLSAgICAgICpzKysgPSAnLCc7Ci0gICAgICBtZW1jcHkgKHMsIHJpZ2h0c3RhcnQsIHJpZ2h0c3RvcCAtIHJpZ2h0c3RhcnQpOwotICAgICAgcyArPSByaWdodHN0b3AgLSByaWdodHN0YXJ0OwotICAgICAgKnMgPSAnXDAnOwotICAgICAgbXJpX2Fzc2VtYmxlIChidWYpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICB9Ci0gICAgICAKLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKHRydWVsYWIpKTsKLSAgcyA9IGJ1ZjsKLSAgKnMrKyA9ICdiJzsKLSAgKnMrKyA9IGNjID4+IDg7Ci0gICpzKysgPSBjYyAmIDB4ZmY7Ci0gIGlmIChleHRlbnQgIT0gJ1wwJykKLSAgICAqcysrID0gZXh0ZW50OwotICAqcysrID0gJyAnOwotICBzdHJjcHkgKHMsIHRydWVsYWIpOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gIGZyZWUgKGJ1Zik7Ci19Ci0KLS8qIFBhcnNlIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZXhwcmVzc2lvbi4gIFRoaXMgZ2VuZXJhdGVzIHRlc3QKLSAgIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgU1RPUCBpcyB3aGVyZSB0aGUgZXhwcmVzc2lvbiBlbmRzLiAgSXQKLSAgIGdvZXMgdG8gVFJVRUxBQiBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIGFuZCB0byBGQUxTRUxBQiBpZiB0aGUKLSAgIGNvbmRpdGlvbiBpcyBmYWxzZS4gIEV4YWN0bHkgb25lIG9mIFRSVUVMQUIgYW5kIEZBTFNFTEFCIHdpbGwgYmUKLSAgIE5VTEwsIG1lYW5pbmcgdG8gZmFsbCB0aHJvdWdoLiAgUVVBTCBpcyB0aGUgc2l6ZSBxdWFsaWZpZXIgZm9yIHRoZQotICAgZXhwcmVzc2lvbi4gIEVYVEVOVCBpcyB0aGUgc2l6ZSB0byB1c2UgZm9yIHRoZSBicmFuY2guICAqLwotCi1zdGF0aWMgdm9pZAotcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAoc3RvcCwgcXVhbCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCkKLSAgICAgY2hhciAqc3RvcDsKLSAgICAgaW50IHF1YWw7Ci0gICAgIGNvbnN0IGNoYXIgKnRydWVsYWI7Ci0gICAgIGNvbnN0IGNoYXIgKmZhbHNlbGFiOwotICAgICBpbnQgZXh0ZW50OwotewotICBpbnQgYzsKLSAgaW50IGNjOwotICBjaGFyICpsZWZ0c3RhcnQ7Ci0gIGNoYXIgKmxlZnRzdG9wOwotICBjaGFyICpyaWdodHN0YXJ0OwotICBjaGFyICpyaWdodHN0b3A7Ci0KLSAgYyA9ICpzdG9wOwotICAqc3RvcCA9ICdcMCc7Ci0KLSAgaWYgKCEgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCAoJmNjLCAmbGVmdHN0YXJ0LCAmbGVmdHN0b3AsCi0JCQkJICAgJnJpZ2h0c3RhcnQsICZyaWdodHN0b3ApKQotICAgIHsKLSAgICAgICpzdG9wID0gYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJBTkQiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZsYWI7Ci0KLSAgICAgIGlmIChmYWxzZWxhYiAhPSBOVUxMKQotCWZsYWIgPSBmYWxzZWxhYjsKLSAgICAgIGVsc2UKLQlmbGFiID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0KLSAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJCSByaWdodHN0b3AsIChjb25zdCBjaGFyICopIE5VTEwsIGZsYWIsIGV4dGVudCk7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJy4nCi0JICB8fCBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1wwJykKLQlxdWFsID0gJ1wwJzsKLSAgICAgIGVsc2UKLQl7Ci0JICBxdWFsID0gaW5wdXRfbGluZV9wb2ludGVyWzFdOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JfQotCi0gICAgICBpZiAoISBwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kICgmY2MsICZsZWZ0c3RhcnQsICZsZWZ0c3RvcCwKLQkJCQkgICAgICAgJnJpZ2h0c3RhcnQsICZyaWdodHN0b3ApKQotCXsKLQkgICpzdG9wID0gYzsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJCSByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpOwotCi0gICAgICBpZiAoZmFsc2VsYWIgPT0gTlVMTCkKLQljb2xvbiAoZmxhYik7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiT1IiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnRsYWI7Ci0KLSAgICAgIGlmICh0cnVlbGFiICE9IE5VTEwpCi0JdGxhYiA9IHRydWVsYWI7Ci0gICAgICBlbHNlCi0JdGxhYiA9IG1yaV9jb250cm9sX2xhYmVsICgpOwotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCB0bGFiLCAoY29uc3QgY2hhciAqKSBOVUxMLCBleHRlbnQpOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcuJwotCSAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcMCcpCi0JcXVhbCA9ICdcMCc7Ci0gICAgICBlbHNlCi0JewotCSAgcXVhbCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCX0KLQotICAgICAgaWYgKCEgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCAoJmNjLCAmbGVmdHN0YXJ0LCAmbGVmdHN0b3AsCi0JCQkJICAgICAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKLQl7Ci0JICAqc3RvcCA9IGM7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCB0cnVlbGFiLCBmYWxzZWxhYiwgZXh0ZW50KTsKLQotICAgICAgaWYgKHRydWVsYWIgPT0gTlVMTCkKLQljb2xvbiAodGxhYik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCk7Ci0gICAgfQotCi0gICpzdG9wID0gYzsKLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlciAhPSBzdG9wKQotICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiKSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIElGIHBzZXVkby1vcC4gIFRoaXMgbWF5IGJlIGEgc3RydWN0dXJlZCBjb250cm9sCi0gICBkaXJlY3RpdmUsIG9yIGl0IG1heSBiZSBhIHJlZ3VsYXIgYXNzZW1ibGVyIGNvbmRpdGlvbmFsLCBkZXBlbmRpbmcKLSAgIG9uIGl0cyBvcGVyYW5kcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9pZiAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBjOwotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICAvKiBBIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUgbXVzdCBlbmQgd2l0aCBUSEVOIHdpdGggYW4KLSAgICAgb3B0aW9uYWwgcXVhbGlmaWVyLiAgKi8KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXQotCSAmJiAoISBmbGFnX21yaSB8fCAqcyAhPSAnKicpKQotICAgICsrczsKLSAgLS1zOwotICB3aGlsZSAocyA+IGlucHV0X2xpbmVfcG9pbnRlciAmJiAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpKQotICAgIC0tczsKLQotICBpZiAocyAtIGlucHV0X2xpbmVfcG9pbnRlciA+IDEKLSAgICAgICYmIHNbLTFdID09ICcuJykKLSAgICBzIC09IDI7Ci0KLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPCAzCi0gICAgICB8fCBzdHJuY2FzZWNtcCAocyAtIDMsICJUSEVOIiwgNCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAocXVhbCAhPSAnXDAnKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyB0aGVuIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIEl0J3MgYSBjb25kaXRpb25hbC4gICovCi0gICAgICBzX2lmIChPX25lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogU2luY2UgdGhpcyBtaWdodCBiZSBhIGNvbmRpdGlvbmFsIGlmLCB0aGlzIHBzZXVkby1vcCB3aWxsIGJlCi0gICAgIGNhbGxlZCBldmVuIGlmIHdlIGFyZSBzdXBwb3J0ZWQgdG8gYmUgaWdub3JpbmcgaW5wdXQuICBEb3VibGUKLSAgICAgY2hlY2sgbm93LiAgQ2xvYmJlciAqaW5wdXRfbGluZV9wb2ludGVyIHNvIHRoYXQgaWdub3JlX2lucHV0Ci0gICAgIHRoaW5rcyB0aGF0IHRoaXMgaXMgbm90IGEgc3BlY2lhbCBwc2V1ZG8tb3AuICAqLwotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIGlmIChpZ25vcmVfaW5wdXQgKCkpCi0gICAgewotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV9pZik7Ci0KLSAgcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAocyAtIDMsIHF1YWwsIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJbi0+bmV4dCwgc1sxXSA9PSAnLicgPyBzWzJdIDogJ1wwJyk7Ci0KLSAgaWYgKHNbMV0gPT0gJy4nKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAzOwotICBlbHNlCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gcyArIDE7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgZWxzZSBwc2V1ZG8tb3AuICBJZiB3ZSBhcmUgY3VycmVudGx5IGRvaW5nIGFuIE1SSQotICAgc3RydWN0dXJlZCBJRiwgYXNzb2NpYXRlIHRoZSBFTFNFIHdpdGggdGhlIElGLiAgT3RoZXJ3aXNlLCBhc3N1bWUKLSAgIGl0IGlzIGEgY29uZGl0aW9uYWwgZWxzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbHNlIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBxWzJdOwotCi0gIGlmIChxdWFsID09ICdcMCcKLSAgICAgICYmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0JICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfaWYKLQkgIHx8IG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4pKQotICAgIHsKLSAgICAgIHNfZWxzZSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgaWYgKGlnbm9yZV9pbnB1dCAoKSkKLSAgICB7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+ZWxzZV9zZWVuKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZWxzZSB3aXRob3V0IG1hdGNoaW5nIGlmIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbXJpX2NvbnRyb2xfc3RhY2stPmVsc2Vfc2VlbiA9IDE7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pKTsKLSAgcVswXSA9IHF1YWw7Ci0gIHFbMV0gPSAnXDAnOwotICBzcHJpbnRmIChidWYsICJicmElcyAlcyIsIHEsIG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gIGZyZWUgKGJ1Zik7Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBFTkRJIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbmRpIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9pZikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImVuZGkgd2l0aG91dCBtYXRjaGluZyBpZiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGlnbm9yZV9pbnB1dCB3aWxsIG5vdCByZXR1cm4gdHJ1ZSBmb3IgRU5ESSwgc28gd2UgZG9uJ3QgbmVlZCB0bwotICAgICB3b3JyeSBhYm91dCBjaGVja2luZyBpdCBhZ2FpbiBoZXJlLiAgKi8KLQotICBpZiAoISBtcmlfY29udHJvbF9zdGFjay0+ZWxzZV9zZWVuKQotICAgIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgQlJFQUsgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2JyZWFrIChleHRlbnQpCi0gICAgIGludCBleHRlbnQ7Ci17Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotICBjaGFyICpidWY7Ci0gIGNoYXIgZXhbMl07Ci0KLSAgbiA9IG1yaV9jb250cm9sX3N0YWNrOwotICB3aGlsZSAobiAhPSBOVUxMCi0JICYmIG4tPnR5cGUgIT0gbXJpX2ZvcgotCSAmJiBuLT50eXBlICE9IG1yaV9yZXBlYXQKLQkgJiYgbi0+dHlwZSAhPSBtcmlfd2hpbGUpCi0gICAgbiA9IG4tPm91dGVyOwotICBpZiAobiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYnJlYWsgb3V0c2lkZSBvZiBzdHJ1Y3R1cmVkIGxvb3AiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgyMCArIHN0cmxlbiAobi0+Ym90dG9tKSk7Ci0gIGV4WzBdID0gZXh0ZW50OwotICBleFsxXSA9ICdcMCc7Ci0gIHNwcmludGYgKGJ1ZiwgImJyYSVzICVzIiwgZXgsIG4tPmJvdHRvbSk7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgZnJlZSAoYnVmKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBORVhUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9uZXh0IChleHRlbnQpCi0gICAgIGludCBleHRlbnQ7Ci17Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotICBjaGFyICpidWY7Ci0gIGNoYXIgZXhbMl07Ci0KLSAgbiA9IG1yaV9jb250cm9sX3N0YWNrOwotICB3aGlsZSAobiAhPSBOVUxMCi0JICYmIG4tPnR5cGUgIT0gbXJpX2ZvcgotCSAmJiBuLT50eXBlICE9IG1yaV9yZXBlYXQKLQkgJiYgbi0+dHlwZSAhPSBtcmlfd2hpbGUpCi0gICAgbiA9IG4tPm91dGVyOwotICBpZiAobiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibmV4dCBvdXRzaWRlIG9mIHN0cnVjdHVyZWQgbG9vcCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChuLT5uZXh0KSk7Ci0gIGV4WzBdID0gZXh0ZW50OwotICBleFsxXSA9ICdcMCc7Ci0gIHNwcmludGYgKGJ1ZiwgImJyYSVzICVzIiwgZXgsIG4tPm5leHQpOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gIGZyZWUgKGJ1Zik7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgRk9SIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9mb3IgKHF1YWwpCi0gICAgIGludCBxdWFsOwotewotICBjb25zdCBjaGFyICp2YXJzdGFydCwgKnZhcnN0b3A7Ci0gIGNvbnN0IGNoYXIgKmluaXRzdGFydCwgKmluaXRzdG9wOwotICBjb25zdCBjaGFyICplbmRzdGFydCwgKmVuZHN0b3A7Ci0gIGNvbnN0IGNoYXIgKmJ5c3RhcnQsICpieXN0b3A7Ci0gIGludCB1cDsKLSAgaW50IGJ5OwotICBpbnQgZXh0ZW50OwotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLSAgY2hhciAqYnVmOwotICBjaGFyICpzOwotICBjaGFyIGV4WzJdOwotCi0gIC8qIFRoZSBzeW50YXggaXMKLSAgICAgICBGT1IucSB2YXIgPSBpbml0IHsgVE8gfCBET1dOVE8gfSBlbmQgWyBCWSBieSBdIERPLmUKLSAgICAgKi8KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIHZhcnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIExvb2sgZm9yIHRoZSAnPScuICAqLwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0KLQkgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPScpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc9JykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgPSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZhcnN0b3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmICh2YXJzdG9wID4gdmFyc3RhcnQKLSAgICAgICYmICh2YXJzdG9wWy0xXSA9PSAnICcgfHwgdmFyc3RvcFstMV0gPT0gJ1x0JykpCi0gICAgLS12YXJzdG9wOwotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGluaXRzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAvKiBMb29rIGZvciBUTyBvciBET1dOVE8uICAqLwotICB1cCA9IDE7Ci0gIGluaXRzdG9wID0gTlVMTDsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiVE8iLCAyKSA9PSAwCi0JICAmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkKLQl7Ci0JICBpbml0c3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJET1dOVE8iLCA2KSA9PSAwCi0JICAmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzZdKSkKLQl7Ci0JICBpbml0c3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHVwID0gMDsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotCSAgYnJlYWs7Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBpZiAoaW5pdHN0b3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdG8gb3IgZG93bnRvIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChpbml0c3RvcCA+IGluaXRzdGFydAotICAgICAgJiYgKGluaXRzdG9wWy0xXSA9PSAnICcgfHwgaW5pdHN0b3BbLTFdID09ICdcdCcpKQotICAgIC0taW5pdHN0b3A7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBlbmRzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAvKiBMb29rIGZvciBCWSBvciBETy4gICovCi0gIGJ5ID0gMDsKLSAgZW5kc3RvcCA9IE5VTEw7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkJZIiwgMikgPT0gMAotCSAgJiYgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlclsyXSkpCi0JewotCSAgZW5kc3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGJ5ID0gMTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJETyIsIDIpID09IDAKLQkgICYmIChpbnB1dF9saW5lX3BvaW50ZXJbMl0gPT0gJy4nCi0JICAgICAgfHwgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlclsyXSkpKQotCXsKLQkgIGVuZHN0b3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgaWYgKGVuZHN0b3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZG8iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKGVuZHN0b3AgPiBlbmRzdGFydAotICAgICAgJiYgKGVuZHN0b3BbLTFdID09ICcgJyB8fCBlbmRzdG9wWy0xXSA9PSAnXHQnKSkKLSAgICAtLWVuZHN0b3A7Ci0KLSAgaWYgKCEgYnkpCi0gICAgewotICAgICAgYnlzdGFydCA9ICIjMSI7Ci0gICAgICBieXN0b3AgPSBieXN0YXJ0ICsgMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBieXN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICAvKiBMb29rIGZvciBETy4gICovCi0gICAgICBieXN0b3AgPSBOVUxMOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCXsKLQkgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiRE8iLCAyKSA9PSAwCi0JICAgICAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsyXSA9PSAnLicKLQkJICB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkpCi0JICAgIHsKLQkgICAgICBieXN0b3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICAgIGlmIChieXN0b3AgPT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgZG8iKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChieXN0b3AgPiBieXN0YXJ0Ci0JICAmJiAoYnlzdG9wWy0xXSA9PSAnICcgfHwgYnlzdG9wWy0xXSA9PSAnXHQnKSkKLQktLWJ5c3RvcDsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJy4nKQotICAgIGV4dGVudCA9ICdcMCc7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRlbnQgPSBpbnB1dF9saW5lX3BvaW50ZXJbMV07Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICB9Ci0KLSAgLyogV2UgaGF2ZSBmdWxseSBwYXJzZWQgdGhlIEZPUiBvcGVyYW5kcy4gIE5vdyBidWlsZCB0aGUgbG9vcC4gICovCi0KLSAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV9mb3IpOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDUwICsgKGlucHV0X2xpbmVfcG9pbnRlciAtIHZhcnN0YXJ0KSk7Ci0KLSAgLyogbW92ZSBpbml0LHZhciAqLwotICBzID0gYnVmOwotICAqcysrID0gJ20nOwotICAqcysrID0gJ28nOwotICAqcysrID0gJ3YnOwotICAqcysrID0gJ2UnOwotICBpZiAocXVhbCAhPSAnXDAnKQotICAgICpzKysgPSBxdWFsOwotICAqcysrID0gJyAnOwotICBtZW1jcHkgKHMsIGluaXRzdGFydCwgaW5pdHN0b3AgLSBpbml0c3RhcnQpOwotICBzICs9IGluaXRzdG9wIC0gaW5pdHN0YXJ0OwotICAqcysrID0gJywnOwotICBtZW1jcHkgKHMsIHZhcnN0YXJ0LCB2YXJzdG9wIC0gdmFyc3RhcnQpOwotICBzICs9IHZhcnN0b3AgLSB2YXJzdGFydDsKLSAgKnMgPSAnXDAnOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0KLSAgY29sb24gKG4tPnRvcCk7Ci0KLSAgLyogY21wIGVuZCx2YXIgKi8KLSAgcyA9IGJ1ZjsKLSAgKnMrKyA9ICdjJzsKLSAgKnMrKyA9ICdtJzsKLSAgKnMrKyA9ICdwJzsKLSAgaWYgKHF1YWwgIT0gJ1wwJykKLSAgICAqcysrID0gcXVhbDsKLSAgKnMrKyA9ICcgJzsKLSAgbWVtY3B5IChzLCBlbmRzdGFydCwgZW5kc3RvcCAtIGVuZHN0YXJ0KTsKLSAgcyArPSBlbmRzdG9wIC0gZW5kc3RhcnQ7Ci0gICpzKysgPSAnLCc7Ci0gIG1lbWNweSAocywgdmFyc3RhcnQsIHZhcnN0b3AgLSB2YXJzdGFydCk7Ci0gIHMgKz0gdmFyc3RvcCAtIHZhcnN0YXJ0OwotICAqcyA9ICdcMCc7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLQotICAvKiBiY2MgYm90dG9tICovCi0gIGV4WzBdID0gZXh0ZW50OwotICBleFsxXSA9ICdcMCc7Ci0gIGlmICh1cCkKLSAgICBzcHJpbnRmIChidWYsICJibHQlcyAlcyIsIGV4LCBuLT5ib3R0b20pOwotICBlbHNlCi0gICAgc3ByaW50ZiAoYnVmLCAiYmd0JXMgJXMiLCBleCwgbi0+Ym90dG9tKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotCi0gIC8qIFB1dCB0b2dldGhlciB0aGUgYWRkIG9yIHN1YiBpbnN0cnVjdGlvbiB1c2VkIGJ5IEVOREYuICAqLwotICBzID0gYnVmOwotICBpZiAodXApCi0gICAgc3RyY3B5IChzLCAiYWRkIik7Ci0gIGVsc2UKLSAgICBzdHJjcHkgKHMsICJzdWIiKTsKLSAgcyArPSAzOwotICBpZiAocXVhbCAhPSAnXDAnKQotICAgICpzKysgPSBxdWFsOwotICAqcysrID0gJyAnOwotICBtZW1jcHkgKHMsIGJ5c3RhcnQsIGJ5c3RvcCAtIGJ5c3RhcnQpOwotICBzICs9IGJ5c3RvcCAtIGJ5c3RhcnQ7Ci0gICpzKysgPSAnLCc7Ci0gIG1lbWNweSAocywgdmFyc3RhcnQsIHZhcnN0b3AgLSB2YXJzdGFydCk7Ci0gIHMgKz0gdmFyc3RvcCAtIHZhcnN0YXJ0OwotICAqcyA9ICdcMCc7Ci0gIG4tPmluY3IgPSBidWY7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgRU5ERiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZW5kZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfZm9yKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZW5kZiB3aXRob3V0IGZvciIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0KLSAgbXJpX2Fzc2VtYmxlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7Ci0KLSAgc3ByaW50ZiAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IsICJicmEgJXMiLCBtcmlfY29udHJvbF9zdGFjay0+dG9wKTsKLSAgbXJpX2Fzc2VtYmxlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7Ci0KLSAgZnJlZSAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgUkVQRUFUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9yZXBlYXQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICBuID0gcHVzaF9tcmlfY29udHJvbCAobXJpX3JlcGVhdCk7Ci0gIGNvbG9uIChuLT50b3ApOwotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgVU5USUwgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX3VudGlsIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgY2hhciAqczsKLQotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX3JlcGVhdCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVudGlsIHdpdGhvdXQgcmVwZWF0IikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLQotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXTsgcysrKQotICAgIDsKLQotICBwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uIChzLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCW1yaV9jb250cm9sX3N0YWNrLT50b3AsICdcMCcpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCi0gIHBvcF9tcmlfY29udHJvbCAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBXSElMRSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfd2hpbGUgKHF1YWwpCi0gICAgIGludCBxdWFsOwotewotICBjaGFyICpzOwotCi0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10KLQkgJiYgKCEgZmxhZ19tcmkgfHwgKnMgIT0gJyonKSkKLSAgICBzKys7Ci0gIC0tczsKLSAgd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKQotICAgIC0tczsKLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPiAxCi0gICAgICAmJiBzWy0xXSA9PSAnLicpCi0gICAgcyAtPSAyOwotICBpZiAocyAtIGlucHV0X2xpbmVfcG9pbnRlciA8IDIKLSAgICAgIHx8IHN0cm5jYXNlY21wIChzIC0gMSwgIkRPIiwgMikgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZG8iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuID0gcHVzaF9tcmlfY29udHJvbCAobXJpX3doaWxlKTsKLQotICBjb2xvbiAobi0+bmV4dCk7Ci0KLSAgcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAocyAtIDEsIHF1YWwsIChjb25zdCBjaGFyICopIE5VTEwsIG4tPmJvdHRvbSwKLQkJCQlzWzFdID09ICcuJyA/IHNbMl0gOiAnXDAnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzICsgMTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIEVORFcgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2VuZHcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpidWY7Ci0KLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV93aGlsZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImVuZHcgd2l0aG91dCB3aGlsZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCkpOwotICBzcHJpbnRmIChidWYsICJicmEgJXMiLCBtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgZnJlZSAoYnVmKTsKLQotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSk7Ci0KLSAgcG9wX21yaV9jb250cm9sICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKgotICogbWRfcGFyc2Vfb3B0aW9uCi0gKglJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICoJU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgVGhlc2UgYXJlOgotICoKLSAqCS1bQV1tW2NdNjgwMDAsIC1bQV1tW2NdNjgwMDgsIC1bQV1tW2NdNjgwMTAsIC1bQV1tW2NdNjgwMjAsIC1bQV1tW2NdNjgwMzAsIC1bQV1tW2NdNjgwNDAKLSAqCS1bQV1tW2NdNjg4ODEsIC1bQV1tW2NdNjg4ODIsIC1bQV1tW2NdNjg4NTEKLSAqCQlTZWxlY3QgdGhlIGFyY2hpdGVjdHVyZS4gIEluc3RydWN0aW9ucyBvciBmZWF0dXJlcyBub3QKLSAqCQlzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGFyY2hpdGVjdHVyZSBjYXVzZSBmYXRhbAotICoJCWVycm9ycy4gIE1vcmUgdGhhbiBvbmUgbWF5IGJlIHNwZWNpZmllZC4gIFRoZSBkZWZhdWx0IGlzCi0gKgkJLW02ODAyMCAtbTY4ODUxIC1tNjg4ODEuICBOb3RlIHRoYXQgLW02ODAwOCBpcyBhIHN5bm9ueW0KLSAqCQlmb3IgLW02ODAwMCwgYW5kIC1tNjg4ODIgaXMgYSBzeW5vbnltIGZvciAtbTY4ODgxLgotICoJLVtBXW1bY11uby02ODg1MSwgLVtBXW1bY11uby02ODg4MQotICoJCURvbid0IGFjY2VwdCA2ODg/MSBpbnN0cnVjdGlvbnMuICAoVGhlICJjIiBpcyBraW5kIG9mIHNpbGx5LAotICoJCXNvIGRvbid0IHVzZSBvciBkb2N1bWVudCBpdCwgYnV0IHRoYXQncyB0aGUgd2F5IHRoZSBwYXJzaW5nCi0gKgkJd29ya3MpLgotICoKLSAqCS1waWMJSW5kaWNhdGVzIFBJQy4KLSAqCS1rCUluZGljYXRlcyBQSUMuICAoU3VuIDMgb25seS4pCi0gKgotICoJLS1iaXR3aXNlLW9yCi0gKgkJUGVybWl0IGB8JyB0byBiZSB1c2VkIGluIGV4cHJlc3Npb25zLgotICoKLSAqLwotCi0jaWZkZWYgT0JKX0VMRgotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImxTQTptOmtROlYiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJsU0E6bTprIjsKLSNlbmRpZgotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl9QSUMgKE9QVElPTl9NRF9CQVNFKQotICB7InBpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUElDfSwKLSNkZWZpbmUgT1BUSU9OX1JFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7InJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbCIsIG5vX2FyZ3VtZW50LCBOVUxMLAotICAgICBPUFRJT05fUkVHSVNURVJfUFJFRklYX09QVElPTkFMfSwKLSNkZWZpbmUgT1BUSU9OX0JJVFdJU0VfT1IgKE9QVElPTl9NRF9CQVNFICsgMikKLSAgeyJiaXR3aXNlLW9yIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CSVRXSVNFX09SfSwKLSNkZWZpbmUgT1BUSU9OX0JBU0VfU0laRV9ERUZBVUxUXzE2IChPUFRJT05fTURfQkFTRSArIDMpCi0gIHsiYmFzZS1zaXplLWRlZmF1bHQtMTYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JBU0VfU0laRV9ERUZBVUxUXzE2fSwKLSNkZWZpbmUgT1BUSU9OX0JBU0VfU0laRV9ERUZBVUxUXzMyIChPUFRJT05fTURfQkFTRSArIDQpCi0gIHsiYmFzZS1zaXplLWRlZmF1bHQtMzIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JBU0VfU0laRV9ERUZBVUxUXzMyfSwKLSNkZWZpbmUgT1BUSU9OX0RJU1BfU0laRV9ERUZBVUxUXzE2IChPUFRJT05fTURfQkFTRSArIDUpCi0gIHsiZGlzcC1zaXplLWRlZmF1bHQtMTYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RJU1BfU0laRV9ERUZBVUxUXzE2fSwKLSNkZWZpbmUgT1BUSU9OX0RJU1BfU0laRV9ERUZBVUxUXzMyIChPUFRJT05fTURfQkFTRSArIDYpCi0gIHsiZGlzcC1zaXplLWRlZmF1bHQtMzIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RJU1BfU0laRV9ERUZBVUxUXzMyfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdsJzoJCQkvKiAtbCBtZWFucyBrZWVwIGV4dGVybmFsIHRvIDIgYml0IG9mZnNldAotCQkJCSAgIHJhdGhlciB0aGFuIDE2IGJpdCBvbmUgKi8KLSAgICAgIGZsYWdfc2hvcnRfcmVmcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgkJCS8qIC1TIG1lYW5zIHRoYXQgamJzcidzIGFsd2F5cyB0dXJuIGludG8KLQkJCQkgICBqc3Incy4gICovCi0gICAgICBmbGFnX2xvbmdfanVtcHMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdBJzoKLSAgICAgIGlmICgqYXJnID09ICdtJykKLSAJYXJnKys7Ci0gICAgICAvKiBpbnRlbnRpb25hbCBmYWxsLXRocm91Z2ggKi8KLSAgICBjYXNlICdtJzoKLQotICAgICAgaWYgKGFyZ1swXSA9PSAnbicgJiYgYXJnWzFdID09ICdvJyAmJiBhcmdbMl0gPT0gJy0nKQotCXsKLQkgIGludCBpOwotCSAgdW5zaWduZWQgbG9uZyBhcmNoOwotCSAgY29uc3QgY2hhciAqb2FyZyA9IGFyZzsKLQotCSAgYXJnICs9IDM7Ci0JICBpZiAoKmFyZyA9PSAnbScpCi0JICAgIHsKLQkgICAgICBhcmcrKzsKLQkgICAgICBpZiAoYXJnWzBdID09ICdjJyAmJiBhcmdbMV0gPT0gJzYnKQotCQlhcmcrKzsKLQkgICAgfQotCSAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKLQkgICAgaWYgKCFzdHJjbXAgKGFyZywgYXJjaHNbaV0ubmFtZSkpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoaSA9PSBuX2FyY2hzKQotCSAgICB7Ci0JICAgIHVua25vd246Ci0JICAgICAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgb3B0aW9uIGAlcyciKSwgb2FyZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIGFyY2ggPSBhcmNoc1tpXS5hcmNoOwotCSAgaWYgKGFyY2ggPT0gbTY4ODgxKQotCSAgICBub182ODg4MSA9IDE7Ci0JICBlbHNlIGlmIChhcmNoID09IG02ODg1MSkKLQkgICAgbm9fNjg4NTEgPSAxOwotCSAgZWxzZQotCSAgICBnb3RvIHVua25vd247Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoYXJnWzBdID09ICdjJyAmJiBhcmdbMV0gPT0gJzYnKQotCSAgICBhcmcrKzsKLQotCSAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKLQkgICAgaWYgKCFzdHJjbXAgKGFyZywgYXJjaHNbaV0ubmFtZSkpCi0JICAgICAgewotCQl1bnNpZ25lZCBsb25nIGFyY2ggPSBhcmNoc1tpXS5hcmNoOwotCQlpZiAoY3B1X29mX2FyY2ggKGFyY2gpKQotCQkgIC8qIEl0J3MgYSBjcHUgc3BlYy4gICovCi0JCSAgewotCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgJj0gfm02ODAwMHVwOwotCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gYXJjaDsKLQkJICB9Ci0JCWVsc2UgaWYgKGFyY2ggPT0gbTY4ODgxKQotCQkgIHsKLQkJICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg4MTsKLQkJICAgIG5vXzY4ODgxID0gMDsKLQkJICB9Ci0JCWVsc2UgaWYgKGFyY2ggPT0gbTY4ODUxKQotCQkgIHsKLQkJICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg1MTsKLQkJICAgIG5vXzY4ODUxID0gMDsKLQkJICB9Ci0JCWVsc2UKLQkJICAvKiA/Pz8gKi8KLQkJICBhYm9ydCAoKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgaWYgKGkgPT0gbl9hcmNocykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygidW5yZWNvZ25pemVkIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGAlcyciKSwgYXJnKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUElDOgotICAgIGNhc2UgJ2snOgotICAgICAgZmxhZ193YW50X3BpYyA9IDE7Ci0gICAgICBicmVhazsJCQkvKiAtcGljLCBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlICovCi0KLSAgICBjYXNlIE9QVElPTl9SRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUw6Ci0gICAgICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSAxOwotICAgICAgcmVnX3ByZWZpeF9vcHRpb25hbF9zZWVuID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtVjogU1ZSNCBhcmd1bWVudCB0byBwcmludCB2ZXJzaW9uIElELiAgKi8KLSAgICBjYXNlICdWJzoKLSAgICAgIHByaW50X3ZlcnNpb25faWQgKCk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogLVF5LCAtUW46IFNWUjQgYXJndW1lbnRzIGNvbnRyb2xsaW5nIHdoZXRoZXIgYSAuY29tbWVudCBzZWN0aW9uCi0JIHNob3VsZCBiZSBlbWl0dGVkIG9yIG5vdC4gIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICAgIGNhc2UgJ1EnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9CSVRXSVNFX09SOgotICAgICAgewotCWNoYXIgKm4sICp0OwotCWNvbnN0IGNoYXIgKnM7Ci0KLQluID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChtNjhrX2NvbW1lbnRfY2hhcnMpICsgMSk7Ci0JdCA9IG47Ci0JZm9yIChzID0gbTY4a19jb21tZW50X2NoYXJzOyAqcyAhPSAnXDAnOyBzKyspCi0JICBpZiAoKnMgIT0gJ3wnKQotCSAgICAqdCsrID0gKnM7Ci0JKnQgPSAnXDAnOwotCW02OGtfY29tbWVudF9jaGFycyA9IG47Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfU0laRV9ERUZBVUxUXzE2OgotICAgICAgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0ID0gU0laRV9XT1JEOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9CQVNFX1NJWkVfREVGQVVMVF8zMjoKLSAgICAgIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCA9IFNJWkVfTE9ORzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMTY6Ci0gICAgICBtNjhrX3JlbDMyID0gMDsKLSAgICAgIG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMzI6Ci0gICAgICBtNjhrX3JlbDMyID0gMTsKLSAgICAgIG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi02ODBYMCBvcHRpb25zOlxuXAotLWwJCQl1c2UgMSB3b3JkIGZvciByZWZzIHRvIHVuZGVmaW5lZCBzeW1ib2xzIFtkZWZhdWx0IDJdXG5cCi0tbTY4MDAwIHwgLW02ODAwOCB8IC1tNjgwMTAgfCAtbTY4MDIwIHwgLW02ODAzMCB8IC1tNjgwNDAgfCAtbTY4MDYwXG5cCi0gfCAtbTY4MzAyIHwgLW02ODMzMSB8IC1tNjgzMzIgfCAtbTY4MzMzIHwgLW02ODM0MCB8IC1tNjgzNjBcblwKLSB8IC1tY3B1MzIgfCAtbTUyMDBcblwKLQkJCXNwZWNpZnkgdmFyaWFudCBvZiA2ODBYMCBhcmNoaXRlY3R1cmUgW2RlZmF1bHQgNjgwMjBdXG5cCi0tbTY4ODgxIHwgLW02ODg4MiB8IC1tbm8tNjg4ODEgfCAtbW5vLTY4ODgyXG5cCi0JCQl0YXJnZXQgaGFzL2xhY2tzIGZsb2F0aW5nLXBvaW50IGNvcHJvY2Vzc29yXG5cCi0JCQlbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwLCA2ODAzMCwgYW5kIGNwdTMyXVxuIikpOwotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLW02ODg1MSB8IC1tbm8tNjg4NTFcblwKLQkJCXRhcmdldCBoYXMvbGFja3MgbWVtb3J5LW1hbmFnZW1lbnQgdW5pdCBjb3Byb2Nlc3NvclxuXAotCQkJW2RlZmF1bHQgeWVzIGZvciA2ODAyMCBhbmQgdXBdXG5cCi0tcGljLCAtawkJZ2VuZXJhdGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuXAotLVMJCQl0dXJuIGpic3IgaW50byBqc3JcblwKLS0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsXG5cCi0JCQlyZWNvZ25pemUgcmVnaXN0ZXIgbmFtZXMgd2l0aG91dCBwcmVmaXggY2hhcmFjdGVyXG5cCi0tLWJpdHdpc2Utb3IJCWRvIG5vdCB0cmVhdCBgfCcgYXMgYSBjb21tZW50IGNoYXJhY3RlclxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS0tYmFzZS1zaXplLWRlZmF1bHQtMTYJYmFzZSByZWcgd2l0aG91dCBzaXplIGlzIDE2IGJpdHNcblwKLS0tYmFzZS1zaXplLWRlZmF1bHQtMzIJYmFzZSByZWcgd2l0aG91dCBzaXplIGlzIDMyIGJpdHMgKGRlZmF1bHQpXG5cCi0tLWRpc3Atc2l6ZS1kZWZhdWx0LTE2CWRpc3BsYWNlbWVudCB3aXRoIHVua25vd24gc2l6ZSBpcyAxNiBiaXRzXG5cCi0tLWRpc3Atc2l6ZS1kZWZhdWx0LTMyCWRpc3BsYWNlbWVudCB3aXRoIHVua25vd24gc2l6ZSBpcyAzMiBiaXRzIChkZWZhdWx0KVxuIikpOwotfQotDAotI2lmZGVmIFRFU1QyCi0KLS8qIFRFU1QyOiAgVGVzdCBtZF9hc3NlbWJsZSgpICovCi0vKiBXYXJuaW5nLCB0aGlzIHJvdXRpbmUgcHJvYmFibHkgZG9lc24ndCB3b3JrIGFueW1vcmUgKi8KLQotbWFpbiAoKQotewotICBzdHJ1Y3QgbTY4a19pdCB0aGVfaW5zOwotICBjaGFyIGJ1ZlsxMjBdOwotICBjaGFyICpjcDsKLSAgaW50IG47Ci0KLSAgbTY4a19pcF9iZWdpbiAoKTsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpZiAoIWdldHMgKGJ1ZikgfHwgISpidWYpCi0JYnJlYWs7Ci0gICAgICBpZiAoYnVmWzBdID09ICd8JyB8fCBidWZbMV0gPT0gJy4nKQotCWNvbnRpbnVlOwotICAgICAgZm9yIChjcCA9IGJ1ZjsgKmNwOyBjcCsrKQotCWlmICgqY3AgPT0gJ1x0JykKLQkgICpjcCA9ICcgJzsKLSAgICAgIGlmIChpc19sYWJlbCAoYnVmKSkKLQljb250aW51ZTsKLSAgICAgIG1lbXNldCAoJnRoZV9pbnMsICdcMCcsIHNpemVvZiAodGhlX2lucykpOwotICAgICAgbTY4a19pcCAoJnRoZV9pbnMsIGJ1Zik7Ci0gICAgICBpZiAodGhlX2lucy5lcnJvcikKLQl7Ci0JICBwcmludGYgKF8oIkVycm9yICVzIGluICVzXG4iKSwgdGhlX2lucy5lcnJvciwgYnVmKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmIChfKCJPcGNvZGUoJWQuJXMpOiAiKSwgdGhlX2lucy5udW1vLCB0aGVfaW5zLmFyZ3MpOwotCSAgZm9yIChuID0gMDsgbiA8IHRoZV9pbnMubnVtbzsgbisrKQotCSAgICBwcmludGYgKCIgMHgleCIsIHRoZV9pbnMub3Bjb2RlW25dICYgMHhmZmZmKTsKLQkgIHByaW50ZiAoIiAgICAiKTsKLQkgIHByaW50X3RoZV9pbnNuICgmdGhlX2lucy5vcGNvZGVbMF0sIHN0ZG91dCk7Ci0JICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0JfQotICAgICAgZm9yIChuID0gMDsgbiA8IHN0cmxlbiAodGhlX2lucy5hcmdzKSAvIDI7IG4rKykKLQl7Ci0JICBpZiAodGhlX2lucy5vcGVyYW5kc1tuXS5lcnJvcikKLQkgICAgewotCSAgICAgIHByaW50ZiAoIm9wJWQgRXJyb3IgJXMgaW4gJXNcbiIsIG4sIHRoZV9pbnMub3BlcmFuZHNbbl0uZXJyb3IsIGJ1Zik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIHByaW50ZiAoIm1vZGUgJWQsIHJlZyAlZCwgIiwgdGhlX2lucy5vcGVyYW5kc1tuXS5tb2RlLCB0aGVfaW5zLm9wZXJhbmRzW25dLnJlZyk7Ci0JICBpZiAodGhlX2lucy5vcGVyYW5kc1tuXS5iX2NvbnN0KQotCSAgICBwcmludGYgKCJDb25zdGFudDogJyUuKnMnLCAiLCAxICsgdGhlX2lucy5vcGVyYW5kc1tuXS5lX2NvbnN0IC0gdGhlX2lucy5vcGVyYW5kc1tuXS5iX2NvbnN0LCB0aGVfaW5zLm9wZXJhbmRzW25dLmJfY29uc3QpOwotCSAgcHJpbnRmICgiaXJlZyAlZCwgaXNpeiAlZCwgaW11bCAlZCwgIiwgdGhlX2lucy5vcGVyYW5kc1tuXS5pcmVnLCB0aGVfaW5zLm9wZXJhbmRzW25dLmlzaXosIHRoZV9pbnMub3BlcmFuZHNbbl0uaW11bCk7Ci0JICBpZiAodGhlX2lucy5vcGVyYW5kc1tuXS5iX2lhZGQpCi0JICAgIHByaW50ZiAoIklhZGQ6ICclLipzJywiLCAxICsgdGhlX2lucy5vcGVyYW5kc1tuXS5lX2lhZGQgLSB0aGVfaW5zLm9wZXJhbmRzW25dLmJfaWFkZCwgdGhlX2lucy5vcGVyYW5kc1tuXS5iX2lhZGQpOwotCSAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOwotCX0KLSAgICB9Ci0gIG02OGtfaXBfZW5kICgpOwotICByZXR1cm4gMDsKLX0KLQotaXNfbGFiZWwgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0gIHdoaWxlICgqc3RyICYmICpzdHIgIT0gJyAnKQotICAgIHN0cisrOwotICBpZiAoc3RyWy0xXSA9PSAnOicgfHwgc3RyWzFdID09ICc9JykKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi0vKiBQb3NzaWJsZSBzdGF0ZXMgZm9yIHJlbGF4YXRpb246Ci0KLSAgIDAgMAlicmFuY2ggb2Zmc2V0CWJ5dGUJKGJyYSwgZXRjKQotICAgMCAxCQkJd29yZAotICAgMCAyCQkJbG9uZwotCi0gICAxIDAJaW5kZXhlZCBvZmZzZXRzCWJ5dGUJYTBAKDMyLGQ0Onc6MSkgZXRjCi0gICAxIDEJCQl3b3JkCi0gICAxIDIJCQlsb25nCi0KLSAgIDIgMAl0d28tb2Zmc2V0IGluZGV4IHdvcmQtd29yZCBhMEAoMzIsZDQpQCg0NSkgZXRjCi0gICAyIDEJCQl3b3JkLWxvbmcKLSAgIDIgMgkJCWxvbmctd29yZAotICAgMiAzCQkJbG9uZy1sb25nCi0KLSAgICovCi0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBGb3IgYS5vdXQsIGZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4gIElmIHdlIGRvbid0IGRvCi0gICAgIHRoaXMsIEJGRCB3aWxsIGFsaWduIGl0IGZvciB1cywgYnV0IGl0IHdpbGwgbm90IHdyaXRlIG91dCB0aGUKLSAgICAgZmluYWwgYnl0ZXMgb2YgdGhlIHNlY3Rpb24uICBUaGlzIG1heSBiZSBhIGJ1ZyBpbiBCRkQsIGJ1dCBpdCBpcwotICAgICBlYXNpZXIgdG8gZml4IGl0IGhlcmUgc2luY2UgdGhhdCBpcyBob3cgdGhlIG90aGVyIGEub3V0IHRhcmdldHMKLSAgICAgd29yay4gICovCi0gIGludCBhbGlnbjsKLQotICBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIHNpemUgPSAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgodmFsdWVUKSAtMSA8PCBhbGlnbikpOwotI2VuZGlmCi0jZW5kaWYKLQotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIDY4aywgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGV4dGVuc2lvbgotICAgd29yZC4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3NlcyBvZiB0aGUgb2Zmc2V0IGFuZCB0aGUKLSAgIGZpcnN0IGV4dGVuc2lvbiB3b3JkIGlzIHN0b3JlZCBpbiBmeF9wY3JlbF9hZGp1c3QuICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpbnQgYWRqdXN0OwotCi0gIC8qIEJlY2F1c2UgZnhfcGNyZWxfYWRqdXN0IGlzIGEgY2hhciwgYW5kIG1heSBiZSB1bnNpZ25lZCwgd2Ugc3RvcmUKLSAgICAgLTEgYXMgNjQuICAqLwotICBhZGp1c3QgPSBmaXhQLT5meF9wY3JlbF9hZGp1c3Q7Ci0gIGlmIChhZGp1c3QgPT0gNjQpCi0gICAgYWRqdXN0ID0gLTE7Ci0gIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSBhZGp1c3Q7Ci19Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIE9CSl9DT0ZGCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChpZ25vcmUpCi0gICAgIHN5bWJvbFMgKmlnbm9yZTsKLXsKLX0KLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgc3dpdGNoIChmcmFnLT5mcl9zdWJ0eXBlICYgMHgzKQotICAgIHsKLSAgICBjYXNlIEJZVEU6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIFNIT1JUOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBMT05HOgotICAgICAgcmV0dXJuIDQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLXZvaWQgbTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZygpCi17Ci0gICAvKiBTZXQgZmlsZS1zcGVjaWZpYyBmbGFncyBpZiB0aGlzIGlzIGEgY3B1MzIgcHJvY2Vzc29yICovCi0gICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIGNwdTMyKQotICAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX0NQVTMyOwotfQotI2VuZGlmCi0vKiBlbmQgb2YgdGMtbTY4ay5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW02OGsuaCBiL2dhcy9jb25maWcvdGMtbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RhZjVlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1tNjhrLmgKLSAgIENvcHlyaWdodCAoQykgMTk4NywgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19NNjhLIDEKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgVEVfU1VOMwotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1zdW5vcy1iaWciCi0jZW5kaWYKLSNpZmRlZiBURV9OZXRCU0QKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtbTY4ay1uZXRic2QiCi0jZW5kaWYKLSNpZmRlZiBURV9MSU5VWAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1tNjhrLWxpbnV4IgotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtemVyby1iaWciCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1tNjhrIgotI2VuZGlmCi0KLSNpZmRlZiBURV9BUE9MTE8KLSNkZWZpbmUgQ09GRl9NQUdJQwkJQVBPTExPTTY4S01BR0lDCi0jZGVmaW5lIENPRkZfQU9VVEhEUl9NQUdJQwlBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUgotI3VuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZW5kaWYKLQotI2lmZGVmIFRFX0xZTlgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1seW54IgotI2VuZGlmCi0jaWZkZWYgVEVfQVVYCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJjb2ZmLW02OGstYXV4IgotI2VuZGlmCi0jaWZkZWYgVEVfREVMVEEKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1zeXN2IgotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9NQUdJQwotI2RlZmluZSBDT0ZGX01BR0lDIE1DNjhNQUdJQwotI2VuZGlmCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX202OGsgLyogZm9yIG5vbi1CRkRfQVNTRU1CTEVSICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX202OGsgLyogQkZEX0FTU0VNQkxFUiAqLwotI2RlZmluZSBDT0ZGX0ZMQUdTIEZfQVIzMlcKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCh4KS0+ZnhfYWRkc3l8fCh4KS0+Znhfc3Vic3kpCi0KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgUEFSQU1TICgoc3RydWN0IGZyYWcgKikpOwotI2lmZGVmIFRFX1NVTjMKLS8qIFRoaXMgdmFyaWFibGUgY29udGFpbnMgdGhlIHZhbHVlIHRvIHdyaXRlIG91dCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICB0aGUgYS5vdXQgZmlsZS4gIFRoZSAyPDwxNiBtZWFucyB0aGF0IHRoaXMgaXMgYSA2ODAyMCBmaWxlIGluc3RlYWQKLSAgIG9mIGFuIG9sZC1zdHlsZSA2ODAwMCBmaWxlICovCi0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICgyPDwxNnxPTUFHSUMpOwkvKiBNYWdpYyBieXRlIGZvciBmaWxlIGhlYWRlciAqLwotI2VuZGlmIC8qIFRFX1NVTjMgKi8KLQotI2lmbmRlZiBBT1VUX01BQ0hUWVBFCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgbTY4a19hb3V0X21hY2h0eXBlCi1leHRlcm4gaW50IG02OGtfYW91dF9tYWNodHlwZTsKLSNlbmRpZgotCi0jZGVmaW5lIHRjX2NvbW1lbnRfY2hhcnMgbTY4a19jb21tZW50X2NoYXJzCi1leHRlcm4gY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzOwotCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLQotI2RlZmluZSBMSVNUSU5HX1dPUkRfU0laRSAyCS8qIEEgd29yZCBpcyAyIGJ5dGVzICovCi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIIDIJLyogT25lIHdvcmQgb24gdGhlIGZpcnN0IGxpbmUgKi8KLSNkZWZpbmUgTElTVElOR19MSFNfV0lEVEhfU0VDT05EIDIJLyogT25lIHdvcmQgb24gdGhlIHNlY29uZCBsaW5lICovCi0jZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMgNC8qIEFuZCA0IGxpbmVzIG1heCAqLwotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiNjhLIEdBUyAiCi0KLSNpZm5kZWYgUkVHSVNURVJfUFJFRklYCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWCAnJScKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCkKLSNpZiBkZWZpbmVkIChNNjhLQ09GRikgfHwgZGVmaW5lZCAoT0JKX0VMRikKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAobmFtZVswXSA9PSAnLicgXAotCQkJICAgJiYgKG5hbWVbMV0gPT0gJ0wnIHx8IG5hbWVbMV0gPT0gJy4nKSkKLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYX09QVElPTkFMIDAKLSNlbHNlIC8qICEgKENPRkYgfHwgRUxGKSAqLwotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQotI2VuZGlmIC8qICEgKENPRkYgfHwgRUxGKSAqLwotI2VuZGlmIC8qIG5vdCBkZWYgUkVHSVNURVJfUFJFRklYIGFuZCBub3QgZGVmIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCAqLwotCi0jaWZkZWYgVEVfREVMVEEKLS8qIE9uIHRoZSBEZWx0YSwgYCUnIGNhbiBvY2N1ciB3aXRoaW4gYSBsYWJlbCBuYW1lLCBidXQgbm90IGFzIHRoZQotICAgaW5pdGlhbCBjaGFyYWN0ZXIuICAqLwotI2RlZmluZSBMRVhfUENUIExFWF9OQU1FCi0vKiBPbiB0aGUgRGVsdGEsIGB+JyBjYW4gc3RhcnQgYSBsYWJlbCBuYW1lLCBidXQgaXMgY29udmVydGVkIHRvICcuJy4gKi8KLSNkZWZpbmUgTEVYX1RJTERFIExFWF9CRUdJTl9OQU1FCi0jZGVmaW5lIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZShzKSAoKCoocykgPT0gJ34nID8gKihzKSA9ICcuJyA6ICcuJyksIHMpCi0vKiBPbiB0aGUgRGVsdGEsIGRvdHMgYXJlIG5vdCByZXF1aXJlZCBiZWZvcmUgcHNldWRvLW9wcy4gICovCi0jZGVmaW5lIE5PX1BTRVVET19ET1QgMQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jdW5kZWYgTE9DQUxfTEFCRUwKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgXAotICAobmFtZVswXSA9PSAnLicgfHwgKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyUnKSkKLSNlbmRpZgotI2VuZGlmCi0KLWV4dGVybiB2b2lkIG02OGtfbXJpX21vZGVfY2hhbmdlIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBNUklfTU9ERV9DSEFOR0UoaSkgbTY4a19tcmlfbW9kZV9jaGFuZ2UgKGkpCi0KLWV4dGVybiBpbnQgbTY4a19jb25kaXRpb25hbF9wc2V1ZG9vcCBQQVJBTVMgKChwc2V1ZG9fdHlwZVMgKikpOwotI2RlZmluZSB0Y19jb25kaXRpb25hbF9wc2V1ZG9vcChwb3ApIG02OGtfY29uZGl0aW9uYWxfcHNldWRvb3AgKHBvcCkKLQotZXh0ZXJuIHZvaWQgbTY4a19mcm9iX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgbTY4a19mcm9iX2xhYmVsIChzeW0pCi0KLWV4dGVybiB2b2lkIG02OGtfZmx1c2hfcGVuZGluZ19vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCgpIG02OGtfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCkKLQotZXh0ZXJuIHZvaWQgbTY4a19mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0scHVudCkJCQkJXAotZG8JCQkJCQkJCVwKLSAgewkJCQkJCQkJXAotICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IHJlZ19zZWN0aW9uKQkJCVwKLSAgICAgIHB1bnQgPSAxOwkJCQkJCQlcCi0gICAgbTY4a19mcm9iX3N5bWJvbCAoc3ltKTsJCQkJCVwKLSAgfQkJCQkJCQkJXAotd2hpbGUgKDApCi0KLSNkZWZpbmUgTk9fUkVMT0MgQkZEX1JFTE9DX05PTkUKLQotI2lmZGVmIE9CSl9FTEYKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbCBvYmplY3QKLSAgIGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICBUcnVlIGlmIHdlCi0gICBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZyB0aGUgLm8gZmlsZS4gIElmCi0gICB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLCB0aGVuIHRoZSBhc3NlbWJsZXIKLSAgIHNob3VsZCBuZXZlciBkbyB0aGUgcmVsb2NhdGlvbi4gICovCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkJCQlcCi0JKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMCQkJXAotCSB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQlcCi0JICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KQkJXAotCSAgICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQlcCi0JICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShYKSB0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKFgpCi1leHRlcm4gaW50IHRjX202OGtfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nIG02OGtfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcKLWV4dGVybiB2b2lkIG02OGtfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVgpCQkJXAotCSgoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAlcCi0JIHx8IChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNkZWZpbmUgdGNfZnJvYl9jb2ZmX3N5bWJvbChzeW0pIG02OGtfZnJvYl9zeW1ib2wgKHN5bSkKLQotI2RlZmluZSBOT19SRUxPQyAwCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2RlZmluZSBESUZGX0VYUFJfT0sKLQotZXh0ZXJuIHZvaWQgbTY4a19pbml0X2FmdGVyX2FyZ3MgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MgbTY4a19pbml0X2FmdGVyX2FyZ3MKLQotZXh0ZXJuIGludCBtNjhrX3BhcnNlX2xvbmdfb3B0aW9uIFBBUkFNUyAoKGNoYXIgKikpOwotI2RlZmluZSBtZF9wYXJzZV9sb25nX29wdGlvbiBtNjhrX3BhcnNlX2xvbmdfb3B0aW9uCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jZGVmaW5lIFRBUkdFVF9XT1JEX1NJWkUgMzIKLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi1leHRlcm4gc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKiBDb3BpZWQgZnJvbSB3cml0ZS5jICovCi0vKiBUaGlzIHdhcyBmb3JtZXJseSBjYWxsZWQgTTY4S19BSU1fS0xVREdFLiAgKi8KLSNkZWZpbmUgbWRfcHJlcGFyZV9yZWxheF9zY2FuKGZyYWdQLCBhZGRyZXNzLCBhaW0sIHRoaXNfc3RhdGUsIHRoaXNfdHlwZSkgXAotICBpZiAoYWltPT0wICYmIHRoaXNfc3RhdGU9PSA0KSB7IC8qIGhhcmQgZW5jb2RlZCBmcm9tIHRjLW02OGsuYyAqLyBcCi0gICAgYWltPXRoaXNfdHlwZS0+cmx4X2ZvcndhcmQrMTsgLyogRm9yY2UgcmVsYXhhdGlvbiBpbnRvIHdvcmQgbW9kZSAqLyBcCi0gIH0KLQotLyogZW5kIG9mIHRjLW02OGsuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tODhrLmMgYi9nYXMvY29uZmlnL3RjLW04OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3NDYwYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NTIgKzAsMCBAQAotLyogbTg4ay5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIE1vdG9yb2xhIDg4MDAwCi0gICBDb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZiBCdWZmYWxvIFVuaXZlcnNpdHkKLSAgIGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm04OGstb3Bjb2RlLmgiCi0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgdmFsOwotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjcl9yZWdzW10gPQotewotICB7IlBJRCIsIDB9LAotICB7IlBTUiIsIDF9LAotICB7IkVQU1IiLCAyfSwKLSAgeyJTU0JSIiwgM30sCi0gIHsiU1hJUCIsIDR9LAotICB7IlNOSVAiLCA1fSwKLSAgeyJTRklQIiwgNn0sCi0gIHsiVkJSIiwgN30sCi0gIHsiRE1UMCIsIDh9LAotICB7IkRNRDAiLCA5fSwKLSAgeyJETUEwIiwgMTB9LAotICB7IkRNVDEiLCAxMX0sCi0gIHsiRE1EMSIsIDEyfSwKLSAgeyJETUExIiwgMTN9LAotICB7IkRNVDIiLCAxNH0sCi0gIHsiRE1EMiIsIDE1fSwKLSAgeyJETUEyIiwgMTZ9LAotICB7IlNSMCIsIDE3fSwKLSAgeyJTUjEiLCAxOH0sCi0gIHsiU1IyIiwgMTl9LAotICB7IlNSMyIsIDIwfSwKLQotICB7TlVMTCwgMH0sCi19OwotCi1zdHJ1Y3QgZmllbGRfdmFsX2Fzc29jIGZjcl9yZWdzW10gPQotewotICB7IkZQRUNSIiwgMH0sCi0gIHsiRlBIUzEiLCAxfSwKLSAgeyJGUExTMSIsIDJ9LAotICB7IkZQSFMyIiwgM30sCi0gIHsiRlBMUzIiLCA0fSwKLSAgeyJGUFBUIiwgNX0sCi0gIHsiRlBSSCIsIDZ9LAotICB7IkZQUkwiLCA3fSwKLSAgeyJGUElUIiwgOH0sCi0KLSAgeyJGUFNSIiwgNjJ9LAotICB7IkZQQ1IiLCA2M30sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjbXBzbG90W10gPQotewotLyogSW50ZWdlcglGbG9hdGluZyBwb2ludCAqLwotICB7Im5jIiwgMH0sCi0gIHsiY3AiLCAxfSwKLSAgeyJlcSIsIDJ9LAotICB7Im5lIiwgM30sCi0gIHsiZ3QiLCA0fSwKLSAgeyJsZSIsIDV9LAotICB7Imx0IiwgNn0sCi0gIHsiZ2UiLCA3fSwKLSAgeyJoaSIsIDh9LAl7Im91IiwgOH0sCi0gIHsibHMiLCA5fSwJeyJpYiIsIDl9LAotICB7ImxvIiwgMTB9LAl7ImluIiwgMTB9LAotICB7ImhzIiwgMTF9LAl7Im9iIiwgMTF9LAotICB7ImJlIiwgMTJ9LAl7InVlIiwgMTJ9LAotICB7Im5iIiwgMTN9LAl7ImxnIiwgMTN9LAotICB7ImhlIiwgMTR9LAl7InVnIiwgMTR9LAotICB7Im5oIiwgMTV9LAl7InVsZSIsIDE1fSwKLQkJeyJ1bCIsIDE2fSwKLQkJeyJ1Z2UiLCAxN30sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjbmRtc2tbXSA9Ci17Ci0gIHsiZ3QwIiwgMX0sCi0gIHsiZXEwIiwgMn0sCi0gIHsiZ2UwIiwgM30sCi0gIHsibHQwIiwgMTJ9LAotICB7Im5lMCIsIDEzfSwKLSAgeyJsZTAiLCAxNH0sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IG04OGtfaW5zbgotewotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBlbnVtIHJlbG9jX3R5cGUgcmVsb2M7Ci19OwotCi1zdGF0aWMgY2hhciAqZ2V0X2JmIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldF9jbXAgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2NuZCBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKLXN0YXRpYyBjaGFyICpnZXRfY3IgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICpyZWdub3ApKTsKLXN0YXRpYyBjaGFyICpnZXRfZmNyIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqcmVnbm9wKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2ltbTE2IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X282IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldF9yZWcgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICpyZWdub3AsIGludCByZWdfcHJlZml4KSk7Ci1zdGF0aWMgY2hhciAqZ2V0X3ZlYzkgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0dmFsIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCBpbnQgKnZhbHApKTsKLQotc3RhdGljIGNoYXIgKmdldF9wY3IgUEFSQU1TICgoY2hhciAqcGFyYW0sIHN0cnVjdCBtODhrX2luc24gKmluc24sCi0JCSAgICAgIGVudW0gcmVsb2NfdHlwZSByZWxvYykpOwotCi1zdGF0aWMgaW50IGNhbGNvcCBQQVJBTVMgKChzdHJ1Y3QgbTg4a19vcGNvZGUgKmZvcm1hdCwKLQkJCSAgIGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuKSk7Ci0KLQotZXh0ZXJuIGNoYXIgKm15bmFtZTsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotLyogVGhlc2UgYml0cyBzaG91bGQgYmUgdHVybmVkIG9mZiBpbiB0aGUgZmlyc3QgYWRkcmVzcyBvZiBldmVyeSBzZWdtZW50ICovCi1pbnQgbWRfc2VnX2FsaWduID0gNzsKLQotLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKLSAgIGFub3RoZXIgY29tbWVudCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIGFzIGluIDBmMTIzLjQ1NiAqLwotLyogb3IgICAgMEgxLjIzNEUtMTIgKHNlZSBleHAgY2hhcnMgYWJvdmUpICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREZkYiOwotCi1leHRlcm4gdm9pZCBmbG9hdF9jb25zICgpLCBjb25zICgpLCBzX2dsb2JsICgpLCBzX3NwYWNlICgpLAotICBzX3NldCAoKSwgc19sY29tbSAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDR9LAotICB7ImRlZiIsIHNfc2V0LCAwfSwKLSAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsiaGFsZiIsIGNvbnMsIDJ9LAotICB7ImJzcyIsIHNfbGNvbW0sIDF9LAotICB7InN0cmluZyIsIHN0cmluZ2VyLCAwfSwKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIC8qIEZvcmNlIHNldCB0byBiZSB0cmVhdGVkIGFzIGFuIGluc3RydWN0aW9uLiAgKi8KLSAgeyJzZXQiLCBOVUxMLCAwfSwKLSAgeyIuc2V0Iiwgc19zZXQsIDB9LAotICB7MH0KLX07Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBpID0gMDsKLQotICAvKiBpbml0aWFsaXplIGhhc2ggdGFibGUgKi8KLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogbG9vcCB1bnRpbCB5b3Ugc2VlIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KLQotICB3aGlsZSAoKm04OGtfb3Bjb2Rlc1tpXS5uYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUgPSBtODhrX29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgLyogaGFzaCBlYWNoIG1uZW1vbmljIGFuZCByZWNvcmQgaXRzIHBvc2l0aW9uICovCi0KLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAmbTg4a19vcGNvZGVzW2ldKTsKLQotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCWFzX2ZhdGFsIChfKCJDYW4ndCBoYXNoIGluc3RydWN0aW9uICclcyc6JXMiKSwKLQkJICBtODhrX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLQotICAgICAgLyogc2tpcCB0byBuZXh0IHVuaXF1ZSBtbmVtb25pYyBvciBlbmQgb2YgbGlzdCAqLwotCi0gICAgICBmb3IgKGkrKzsgIXN0cmNtcCAobTg4a19vcGNvZGVzW2ldLm5hbWUsIG5hbWUpOyBpKyspCi0JOwotICAgIH0KLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi12b2lkCi1tZF9hc3NlbWJsZSAob3ApCi0gICAgIGNoYXIgKm9wOwotewotICBjaGFyICpwYXJhbSwgKnRoaXNmcmFnOwotICBjaGFyIGM7Ci0gIHN0cnVjdCBtODhrX29wY29kZSAqZm9ybWF0OwotICBzdHJ1Y3QgbTg4a19pbnNuIGluc247Ci0KLSAgYXNzZXJ0IChvcCk7Ci0KLSAgLyogc2tpcCBvdmVyIGluc3RydWN0aW9uIHRvIGZpbmQgcGFyYW1ldGVycyAqLwotCi0gIGZvciAocGFyYW0gPSBvcDsgKnBhcmFtICE9IDAgJiYgIWlzc3BhY2UgKCpwYXJhbSk7IHBhcmFtKyspCi0gICAgOwotICBjID0gKnBhcmFtOwotICAqcGFyYW0rKyA9ICdcMCc7Ci0KLSAgLyogdHJ5IHRvIGZpbmQgdGhlIGluc3RydWN0aW9uIGluIHRoZSBoYXNoIHRhYmxlICovCi0KLSAgaWYgKChmb3JtYXQgPSAoc3RydWN0IG04OGtfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgb3ApKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBtbmVtb25pYyAnJXMnIiksIG9wKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogdHJ5IHBhcnNpbmcgdGhpcyBpbnN0cnVjdGlvbiBpbnRvIGluc24gKi8KLQotICBpbnNuLmV4cC5YX2FkZF9zeW1ib2wgPSAwOwotICBpbnNuLmV4cC5YX29wX3N5bWJvbCA9IDA7Ci0gIGluc24uZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gIGluc24uZXhwLlhfb3AgPSBPX2lsbGVnYWw7Ci0gIGluc24ucmVsb2MgPSBOT19SRUxPQzsKLQotICB3aGlsZSAoIWNhbGNvcCAoZm9ybWF0LCBwYXJhbSwgJmluc24pKQotICAgIHsKLSAgICAgIC8qIGlmIGl0IGRvZXNuJ3QgcGFyc2UgdHJ5IHRoZSBuZXh0IGluc3RydWN0aW9uICovCi0KLSAgICAgIGlmICghc3RyY21wIChmb3JtYXRbMF0ubmFtZSwgZm9ybWF0WzFdLm5hbWUpKQotCWZvcm1hdCsrOwotICAgICAgZWxzZQotCXsKLQkgIGFzX2ZhdGFsIChfKCJQYXJhbWV0ZXIgc3ludGF4IGVycm9yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogZ3JvdyB0aGUgY3VycmVudCBmcmFnIGFuZCBwbG9wIGluIHRoZSBvcGNvZGUgKi8KLQotICB0aGlzZnJhZyA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAodGhpc2ZyYWcsIGluc24ub3Bjb2RlLCA0KTsKLQotICAvKiBpZiB0aGlzIGluc3RydWN0aW9uIHJlcXVpcmVzIGxhYmVscyBtYXJrIGl0IGZvciBsYXRlciAqLwotCi0gIHN3aXRjaCAoaW5zbi5yZWxvYykKLSAgICB7Ci0gICAgY2FzZSBOT19SRUxPQzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19MTzE2OgotICAgIGNhc2UgUkVMT0NfSEkxNjoKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIDIsCi0JCSAgIDIsCi0JCSAgICZpbnNuLmV4cCwKLQkJICAgMCwKLQkJICAgaW5zbi5yZWxvYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfSVcxNjoKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgNCwKLQkJICAgJmluc24uZXhwLAotCQkgICAwLAotCQkgICBpbnNuLnJlbG9jKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzE2OgotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICB0aGlzZnJhZyAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgMiwKLQkJICAgMiwKLQkJICAgJmluc24uZXhwLAotCQkgICAxLAotCQkgICBpbnNuLnJlbG9jKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzI2OgotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICB0aGlzZnJhZyAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICA0LAotCQkgICAmaW5zbi5leHAsCi0JCSAgIDEsCi0JCSAgIGluc24ucmVsb2MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gcmVsb2NhdGlvbiB0eXBlIikpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1jYWxjb3AgKGZvcm1hdCwgcGFyYW0sIGluc24pCi0gICAgIHN0cnVjdCBtODhrX29wY29kZSAqZm9ybWF0OwotICAgICBjaGFyICpwYXJhbTsKLSAgICAgc3RydWN0IG04OGtfaW5zbiAqaW5zbjsKLXsKLSAgY2hhciAqZm10ID0gZm9ybWF0LT5vcF9zcGVjOwotICBpbnQgZjsKLSAgdW5zaWduZWQgdmFsOwotICB1bnNpZ25lZCBvcGNvZGU7Ci0gIGludCByZWdfcHJlZml4ID0gJ3InOwotCi0gIGluc24tPm9wY29kZSA9IGZvcm1hdC0+b3Bjb2RlOwotICBvcGNvZGUgPSAwOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKHBhcmFtID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBmID0gKmZtdCsrOwotICAgICAgc3dpdGNoIChmKQotCXsKLQljYXNlIDA6Ci0JICBpbnNuLT5vcGNvZGUgfD0gb3Bjb2RlOwotCSAgcmV0dXJuICgqcGFyYW0gPT0gMCB8fCAqcGFyYW0gPT0gJ1xuJyk7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKGYgIT0gKnBhcmFtKyspCi0JICAgIHJldHVybiAwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdkJzoKLQkgIHBhcmFtID0gZ2V0X3JlZyAocGFyYW0sICZ2YWwsIHJlZ19wcmVmaXgpOwotCSAgcmVnX3ByZWZpeCA9ICdyJzsKLQkgIG9wY29kZSB8PSB2YWwgPDwgMjE7Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCSAgcGFyYW0gPSBnZXRfbzYgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSAoKHZhbCA+PiAyKSA8PCA3KTsKLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6Ci0JICByZWdfcHJlZml4ID0gJ3gnOwotCSAgYnJlYWs7Ci0KLQljYXNlICcxJzoKLQkgIHBhcmFtID0gZ2V0X3JlZyAocGFyYW0sICZ2YWwsIHJlZ19wcmVmaXgpOwotCSAgcmVnX3ByZWZpeCA9ICdyJzsKLQkgIG9wY29kZSB8PSB2YWwgPDwgMTY7Ci0JICBicmVhazsKLQotCWNhc2UgJzInOgotCSAgcGFyYW0gPSBnZXRfcmVnIChwYXJhbSwgJnZhbCwgcmVnX3ByZWZpeCk7Ci0JICByZWdfcHJlZml4ID0gJ3InOwotCSAgb3Bjb2RlIHw9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMyc6Ci0JICBwYXJhbSA9IGdldF9yZWcgKHBhcmFtLCAmdmFsLCAncicpOwotCSAgb3Bjb2RlIHw9ICh2YWwgPDwgMTYpIHwgdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoKLQkgIHBhcmFtID0gZ2V0X2ltbTE2IChwYXJhbSwgaW5zbik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2InOgotCSAgcGFyYW0gPSBnZXRfYmYgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJ3AnOgotCSAgcGFyYW0gPSBnZXRfcGNyIChwYXJhbSwgaW5zbiwgUkVMT0NfUEMxNik7Ci0JICBicmVhazsKLQotCWNhc2UgJ1AnOgotCSAgcGFyYW0gPSBnZXRfcGNyIChwYXJhbSwgaW5zbiwgUkVMT0NfUEMyNik7Ci0JICBicmVhazsKLQotCWNhc2UgJ0InOgotCSAgcGFyYW0gPSBnZXRfY21wIChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICdNJzoKLQkgIHBhcmFtID0gZ2V0X2NuZCAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYyc6Ci0JICBwYXJhbSA9IGdldF9jciAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbCA8PCA1OwotCSAgYnJlYWs7Ci0KLQljYXNlICdmJzoKLQkgIHBhcmFtID0gZ2V0X2ZjciAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbCA8PCA1OwotCSAgYnJlYWs7Ci0KLQljYXNlICdWJzoKLQkgIHBhcmFtID0gZ2V0X3ZlYzkgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJz8nOgotCSAgLyogSGF2aW5nIHRoaXMgaGVyZSByZXBlYXRzIHRoZSB3YXJuaW5nIHNvbXRpbWVzLgotCSAgIEJ1dCBjYW4ndCB3ZSBzdGFuZCB0aGF0PyAgKi8KLQkgIGFzX3dhcm4gKF8oIlVzZSBvZiBvYnNvbGV0ZSBpbnN0cnVjdGlvbiIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW1hdGNoX25hbWUgKHBhcmFtLCBhc3NvY190YWIsIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICBzdHJ1Y3QgZmllbGRfdmFsX2Fzc29jICphc3NvY190YWI7Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICBpbnQgaTsKLSAgY2hhciAqbmFtZTsKLSAgaW50IG5hbWVfbGVuOwotCi0gIGZvciAoaSA9IDA7OyBpKyspCi0gICAgewotICAgICAgbmFtZSA9IGFzc29jX3RhYltpXS5uYW1lOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIG5hbWVfbGVuID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmICghc3RybmNtcCAocGFyYW0sIG5hbWUsIG5hbWVfbGVuKSkKLQl7Ci0JICAqdmFscCA9IGFzc29jX3RhYltpXS52YWw7Ci0JICByZXR1cm4gcGFyYW0gKyBuYW1lX2xlbjsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfcmVnIChwYXJhbSwgcmVnbm9wLCByZWdfcHJlZml4KQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnJlZ25vcDsKLSAgICAgaW50IHJlZ19wcmVmaXg7Ci17Ci0gIHVuc2lnbmVkIGM7Ci0gIHVuc2lnbmVkIHJlZ25vOwotCi0gIGMgPSAqcGFyYW0rKzsKLSAgaWYgKGMgPT0gcmVnX3ByZWZpeCkKLSAgICB7Ci0gICAgICByZWdubyA9ICpwYXJhbSsrIC0gJzAnOwotICAgICAgaWYgKHJlZ25vIDwgMTApCi0JewotCSAgaWYgKHJlZ25vID09IDApCi0JICAgIHsKLQkgICAgICAqcmVnbm9wID0gMDsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQkgIGMgPSAqcGFyYW0gLSAnMCc7Ci0JICBpZiAoYyA8IDEwKQotCSAgICB7Ci0JICAgICAgcmVnbm8gPSByZWdubyAqIDEwICsgYzsKLQkgICAgICBpZiAoYyA8IDMyKQotCQl7Ci0JCSAgKnJlZ25vcCA9IHJlZ25vOwotCQkgIHJldHVybiBwYXJhbSArIDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IHJlZ25vOwotCSAgICAgIHJldHVybiBwYXJhbTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoYyA9PSAncycgJiYgcGFyYW1bMF0gPT0gJ3AnKQotICAgIHsKLSAgICAgICpyZWdub3AgPSAzMTsKLSAgICAgIHJldHVybiBwYXJhbSArIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfaW1tMTYgKHBhcmFtLCBpbnNuKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgc3RydWN0IG04OGtfaW5zbiAqaW5zbjsKLXsKLSAgZW51bSByZWxvY190eXBlIHJlbG9jID0gTk9fUkVMT0M7Ci0gIHVuc2lnbmVkIGludCB2YWw7Ci0gIGNoYXIgKnNhdmVfcHRyOwotCi0gIGlmICghc3RybmNtcCAocGFyYW0sICJoaTE2IiwgNCkgJiYgIWlzYWxudW0gKHBhcmFtWzRdKSkKLSAgICB7Ci0gICAgICByZWxvYyA9IFJFTE9DX0hJMTY7Ci0gICAgICBwYXJhbSArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cm5jbXAgKHBhcmFtLCAibG8xNiIsIDQpICYmICFpc2FsbnVtIChwYXJhbVs0XSkpCi0gICAgewotICAgICAgcmVsb2MgPSBSRUxPQ19MTzE2OwotICAgICAgcGFyYW0gKz0gNDsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJuY21wIChwYXJhbSwgIml3MTYiLCA0KSAmJiAhaXNhbG51bSAocGFyYW1bNF0pKQotICAgIHsKLSAgICAgIHJlbG9jID0gUkVMT0NfSVcxNjsKLSAgICAgIHBhcmFtICs9IDQ7Ci0gICAgfQotCi0gIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgZXhwcmVzc2lvbiAoJmluc24tPmV4cCk7Ci0gIHBhcmFtID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLQotICB2YWwgPSBpbnNuLT5leHAuWF9hZGRfbnVtYmVyOwotCi0gIGlmIChpbnNuLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIC8qIEluc2VydCB0aGUgdmFsdWUgbm93LCBhbmQgcmVzZXQgcmVsb2MgdG8gTk9fUkVMT0MuICAqLwotICAgICAgaWYgKHJlbG9jID09IE5PX1JFTE9DKQotCXsKLQkgIC8qIFdhcm4gYWJvdXQgdG9vIGJpZyBleHByZXNzaW9ucyBpZiBub3Qgc3Vycm91bmRlZCBieSB4eDE2LiAgKi8KLQkgIGlmICh2YWwgPiAweGZmZmYpCi0JICAgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDE2IGJpdHMiKSk7Ci0JfQotCi0gICAgICBpZiAocmVsb2MgPT0gUkVMT0NfSEkxNikKLQl2YWwgPj49IDE2OwotCi0gICAgICBpbnNuLT5vcGNvZGUgfD0gdmFsICYgMHhmZmZmOwotICAgICAgcmVsb2MgPSBOT19SRUxPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jID09IE5PX1JFTE9DKQotICAgIC8qIFdlIGFjY2VwdCBhIHN5bWJvbCBldmVuIHdpdGhvdXQgbG8xNiwgaGkxNiwgZXRjLCBhbmQgYXNzdW1lCi0gICAgICAgbG8xNiB3YXMgaW50ZW5kZWQuICAqLwotICAgIHJlbG9jID0gUkVMT0NfTE8xNjsKLQotICBpbnNuLT5yZWxvYyA9IHJlbG9jOwotCi0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3BjciAocGFyYW0sIGluc24sIHJlbG9jKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgc3RydWN0IG04OGtfaW5zbiAqaW5zbjsKLSAgICAgZW51bSByZWxvY190eXBlIHJlbG9jOwotewotICBjaGFyICpzYXZlcHRyLCAqc2F2ZXBhcmFtOwotCi0gIHNhdmVwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotCi0gIGV4cHJlc3Npb24gKCZpbnNuLT5leHApOwotCi0gIHNhdmVwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZXB0cjsKLQotICAvKiBCb3RjaDogV2Ugc2hvdWxkIHJlbG9jYXRlIG5vdyBpZiBPX2NvbnN0YW50LiAgKi8KLSAgaW5zbi0+cmVsb2MgPSByZWxvYzsKLQotICByZXR1cm4gc2F2ZXBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfY21wIChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICB1bnNpZ25lZCBpbnQgdmFsOwotICBjaGFyICpzYXZlX3B0cjsKLQotICBzYXZlX3B0ciA9IHBhcmFtOwotCi0gIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGNtcHNsb3QsIHZhbHApOwotICB2YWwgPSAqdmFscDsKLQotICBpZiAocGFyYW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwYXJhbSA9IHNhdmVfcHRyOwotCi0gICAgICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICAgICAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotCi0gICAgICBpZiAodmFsID49IDMyKQotCXsKLQkgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDUgYml0cyIpKTsKLQkgIHZhbCAlPSAzMjsKLQl9Ci0gICAgfQotCi0gICp2YWxwID0gdmFsIDw8IDIxOwotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9jbmQgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnZhbHA7Ci17Ci0gIHVuc2lnbmVkIGludCB2YWw7Ci0KLSAgaWYgKGlzZGlnaXQgKCpwYXJhbSkpCi0gICAgewotICAgICAgcGFyYW0gPSBnZXR2YWwgKHBhcmFtLCAmdmFsKTsKLQotICAgICAgaWYgKHZhbCA+PSAzMikKLQl7Ci0JICBhc193YXJuIChfKCJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA1IGJpdHMiKSk7Ci0JICB2YWwgJT0gMzI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyICgqcGFyYW0pKQotCSpwYXJhbSA9IHRvbG93ZXIgKCpwYXJhbSk7Ci0KLSAgICAgIGlmIChpc3VwcGVyIChwYXJhbVsxXSkpCi0JcGFyYW1bMV0gPSB0b2xvd2VyIChwYXJhbVsxXSk7Ci0KLSAgICAgIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGNuZG1zaywgdmFscCk7Ci0KLSAgICAgIGlmIChwYXJhbSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICB2YWwgPSAqdmFscDsKLSAgICB9Ci0KLSAgKnZhbHAgPSB2YWwgPDwgMjE7Ci0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2JmMiAocGFyYW0sIGJjKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgaW50IGJjOwotewotICBpbnQgZGVwdGggPSAwOwotICBpbnQgYzsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGMgPSAqcGFyYW07Ci0gICAgICBpZiAoYyA9PSAwKQotCXJldHVybiBwYXJhbTsKLSAgICAgIGVsc2UgaWYgKGMgPT0gJygnKQotCWRlcHRoKys7Ci0gICAgICBlbHNlIGlmIChjID09ICcpJykKLQlkZXB0aC0tOwotICAgICAgZWxzZSBpZiAoYyA9PSBiYyAmJiBkZXB0aCA8PSAwKQotCXJldHVybiBwYXJhbTsKLSAgICAgIHBhcmFtKys7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfYmZfb2Zmc2V0X2V4cHJlc3Npb24gKHBhcmFtLCBvZmZzZXRwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKm9mZnNldHA7Ci17Ci0gIHVuc2lnbmVkIG9mZnNldDsKLQotICBpZiAoaXNhbHBoYSAocGFyYW1bMF0pKQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyIChwYXJhbVswXSkpCi0JcGFyYW1bMF0gPSB0b2xvd2VyIChwYXJhbVswXSk7Ci0gICAgICBpZiAoaXN1cHBlciAocGFyYW1bMV0pKQotCXBhcmFtWzFdID0gdG9sb3dlciAocGFyYW1bMV0pOwotCi0gICAgICBwYXJhbSA9IG1hdGNoX25hbWUgKHBhcmFtLCBjbXBzbG90LCBvZmZzZXRwKTsKLQotICAgICAgcmV0dXJuIHBhcmFtOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICAgICAgb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgKm9mZnNldHAgPSBvZmZzZXQ7Ci0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2JmIChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICB1bnNpZ25lZCBvZmZzZXQgPSAwOwotICB1bnNpZ25lZCB3aWR0aCA9IDA7Ci0gIGNoYXIgKnhwOwotICBjaGFyICpzYXZlX3B0cjsKLQotICB4cCA9IGdldF9iZjIgKHBhcmFtLCAnPCcpOwotCi0gIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgaWYgKCp4cCA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdlIGRpZCBub3QgZmluZCAnPCcuICBXZSBoYXZlIGFuIG9mZnNldCAod2lkdGggaW1wbGljaXRseSAzMikuICAqLwotICAgICAgcGFyYW0gPSBnZXRfYmZfb2Zmc2V0X2V4cHJlc3Npb24gKHBhcmFtLCAmb2Zmc2V0KTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotICAgICAgaWYgKHBhcmFtID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnhwKysgPSAwOwkJLyogT3ZlcndyaXRlIHRoZSAnPCcgKi8KLSAgICAgIHBhcmFtID0gZ2V0X2JmMiAoeHAsICc+Jyk7Ci0gICAgICBpZiAoKnBhcmFtID09IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgICAqcGFyYW0rKyA9IDA7CQkvKiBPdmVyd3JpdGUgdGhlICc+JyAqLwotCi0gICAgICB3aWR0aCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgeHAgPSBnZXRfYmZfb2Zmc2V0X2V4cHJlc3Npb24gKHhwLCAmb2Zmc2V0KTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotCi0gICAgICBpZiAoeHAgKyAxICE9IHBhcmFtKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAqdmFscCA9ICgod2lkdGggJSAzMikgPDwgNSkgfCAob2Zmc2V0ICUgMzIpOwotCi0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2NyIChwYXJhbSwgcmVnbm9wKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnJlZ25vcDsKLXsKLSAgdW5zaWduZWQgcmVnbm87Ci0gIHVuc2lnbmVkIGM7Ci0KLSAgaWYgKCFzdHJuY21wIChwYXJhbSwgImNyIiwgMikpCi0gICAgewotICAgICAgcGFyYW0gKz0gMjsKLQotICAgICAgcmVnbm8gPSAqcGFyYW0rKyAtICcwJzsKLSAgICAgIGlmIChyZWdubyA8IDEwKQotCXsKLQkgIGlmIChyZWdubyA9PSAwKQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IDA7Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JICBjID0gKnBhcmFtIC0gJzAnOwotCSAgaWYgKGMgPCAxMCkKLQkgICAgewotCSAgICAgIHJlZ25vID0gcmVnbm8gKiAxMCArIGM7Ci0JICAgICAgaWYgKGMgPCA2NCkKLQkJewotCQkgICpyZWdub3AgPSByZWdubzsKLQkJICByZXR1cm4gcGFyYW0gKyAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICpyZWdub3AgPSByZWdubzsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgY3JfcmVncywgcmVnbm9wKTsKLQotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9mY3IgKHBhcmFtLCByZWdub3ApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqcmVnbm9wOwotewotICB1bnNpZ25lZCByZWdubzsKLSAgdW5zaWduZWQgYzsKLQotICBpZiAoIXN0cm5jbXAgKHBhcmFtLCAiZmNyIiwgMykpCi0gICAgewotICAgICAgcGFyYW0gKz0gMzsKLQotICAgICAgcmVnbm8gPSAqcGFyYW0rKyAtICcwJzsKLSAgICAgIGlmIChyZWdubyA8IDEwKQotCXsKLQkgIGlmIChyZWdubyA9PSAwKQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IDA7Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JICBjID0gKnBhcmFtIC0gJzAnOwotCSAgaWYgKGMgPCAxMCkKLQkgICAgewotCSAgICAgIHJlZ25vID0gcmVnbm8gKiAxMCArIGM7Ci0JICAgICAgaWYgKGMgPCA2NCkKLQkJewotCQkgICpyZWdub3AgPSByZWdubzsKLQkJICByZXR1cm4gcGFyYW0gKyAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICpyZWdub3AgPSByZWdubzsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgZmNyX3JlZ3MsIHJlZ25vcCk7Ci0KLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfdmVjOSAocGFyYW0sIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgdW5zaWduZWQgdmFsOwotICBjaGFyICpzYXZlX3B0cjsKLQotICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0gIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9wdHI7Ci0KLSAgaWYgKHZhbCA+PSAxIDw8IDkpCi0gICAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gOSBiaXRzIikpOwotCi0gICp2YWxwID0gdmFsICUgKDEgPDwgOSk7Ci0KLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfbzYgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnZhbHA7Ci17Ci0gIHVuc2lnbmVkIHZhbDsKLSAgY2hhciAqc2F2ZV9wdHI7Ci0KLSAgc2F2ZV9wdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotCi0gIGlmICh2YWwgJiAweDMpCi0gICAgYXNfd2FybiAoXygiUmVtb3ZlZCBsb3dlciAyIGJpdHMgb2YgZXhwcmVzc2lvbiIpKTsKLQotICAqdmFscCA9IHZhbDsKLQotICByZXR1cm4ocGFyYW0pOwotfQotCi0jZGVmaW5lIGhleHZhbCh6KSBcCi0gIChpc2RpZ2l0ICh6KSA/ICh6KSAtICcwJyA6CQkJCQkJXAotICAgaXNsb3dlciAoeikgPyAoeikgLSAnYScgKyAxMCA6IAkJCQkJXAotICAgaXN1cHBlciAoeikgPyAoeikgLSAnQScgKyAxMCA6IC0xKQotCi1zdGF0aWMgY2hhciAqCi1nZXR2YWwgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgaW50ICp2YWxwOwotewotICB1bnNpZ25lZCBpbnQgdmFsID0gMDsKLSAgdW5zaWduZWQgaW50IGM7Ci0KLSAgYyA9ICpwYXJhbSsrOwotICBpZiAoYyA9PSAnMCcpCi0gICAgewotICAgICAgYyA9ICpwYXJhbSsrOwotICAgICAgaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKQotCXsKLQkgIGMgPSAqcGFyYW0rKzsKLQkgIGMgPSBoZXh2YWwgKGMpOwotCSAgd2hpbGUgKGMgPCAxNikKLQkgICAgewotCSAgICAgIHZhbCA9IHZhbCAqIDE2ICsgYzsKLQkgICAgICBjID0gKnBhcmFtKys7Ci0JICAgICAgYyA9IGhleHZhbCAoYyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYyAtPSAnMCc7Ci0JICB3aGlsZSAoYyA8IDgpCi0JICAgIHsKLQkgICAgICB2YWwgPSB2YWwgKiA4ICsgYzsKLQkgICAgICBjID0gKnBhcmFtKysgLSAnMCc7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYyAtPSAnMCc7Ci0gICAgICB3aGlsZSAoYyA8IDEwKQotCXsKLQkgIHZhbCA9IHZhbCAqIDEwICsgYzsKLQkgIGMgPSAqcGFyYW0rKyAtICcwJzsKLQl9Ci0gICAgfQotCi0gICp2YWxwID0gdmFsOwotICByZXR1cm4gcGFyYW0gLSAxOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuYnl0ZXMpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG5ieXRlcyk7Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgcm91dGluZSBpcyBuZXZlciBjYWxsZWQuICBXaGF0IGlzIGl0IGZvcj8KLSAgIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0IDEzIEp1bCAxOTkzICovCi0KLXZvaWQKLW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuYnl0ZXMsIGZpeFAsIHNlZ190eXBlKQotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci0gICAgIGludCBuYnl0ZXM7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGludCBzZWdfdHlwZTsKLXsKLSAgaWYgKHNlZ190eXBlICE9IE5fVEVYVCB8fCBmaXhQLT5meF9yX3R5cGUgPT0gTk9fUkVMT0MpCi0gICAgewotICAgICAgc3dpdGNoIChuYnl0ZXMpCi0JewotCWNhc2UgNDoKLQkgICpidWYrKyA9IHZhbCA+PiAyNDsKLQkgICpidWYrKyA9IHZhbCA+PiAxNjsKLQljYXNlIDI6Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQljYXNlIDE6Ci0JICAqYnVmID0gdmFsOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ19JVzE2OgotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfTE8xNjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzFdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0hJMTY6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMjQ7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIHZhbCArPSA0OwotICAgICAgYnVmWzBdID0gdmFsID4+IDEwOwotICAgICAgYnVmWzFdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIHZhbCArPSA0OwotICAgICAgYnVmWzBdIHw9ICh2YWwgPj4gMjYpICYgMHgwMzsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxODsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJ1ZlszXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DXzMyOgotICAgICAgYnVmWzBdID0gdmFsID4+IDI0OwotICAgICAgYnVmWzFdID0gdmFsID4+IDE2OwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiQmFkIHJlbG9jYXRpb24gdHlwZSIpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuYnl0ZXMpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IHZhbDsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgYXNfZmF0YWwgKF8oIm1kX251bWJlcl90b19kaXNwIG5vdCBkZWZpbmVkIikpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuYnl0ZXMpOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9fZmllbGQgKGJ1ZiwgdmFsLCBuYnl0ZXMpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IHZhbDsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgYXNfZmF0YWwgKF8oIm1kX251bWJlcl90b19maWVsZCBub3QgZGVmaW5lZCIpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbmJ5dGVzKTsKLX0KLQotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDQ7Ci0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgcHRyWzBdID0gKGNoYXIpIDB4YzA7Ci0gIHB0clsxXSA9IDB4MDA7Ci0gIHB0clsyXSA9IDB4MDA7Ci0gIHB0clszXSA9IDB4MDA7Ci0gIGZpeF9uZXcgKGZyYWcsCi0JICAgcHRyIC0gZnJhZy0+ZnJfbGl0ZXJhbCwKLQkgICA0LAotCSAgIHRvX3N5bWJvbCwKLQkgICAob2Zmc2V0VCkgMCwKLQkgICAwLAotCSAgIFJFTE9DX1BDMjYpOwkJLyogQm90Y2g6IFNob3VsZG4ndCB0aGlzIGJlIFJFTE9DX1BDMTY/ICovCi19Ci0KLWludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDQ7Ci0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICBwdHJbMF0gPSAoY2hhcikgMHhjMDsKLSAgcHRyWzFdID0gMHgwMDsKLSAgcHRyWzJdID0gMHgwMDsKLSAgcHRyWzNdID0gMHgwMDsKLSAgZml4X25ldyAoZnJhZywKLQkgICBwdHIgLSBmcmFnLT5mcl9saXRlcmFsLAotCSAgIDQsCi0JICAgdG9fc3ltYm9sLAotCSAgIChvZmZzZXRUKSAwLAotCSAgIDAsCi0JICAgUkVMT0NfUEMyNik7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIGFzX2ZhdGFsIChfKCJSZWxheGF0aW9uIHNob3VsZCBuZXZlciBvY2N1ciIpKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLSNpZiAwCi0KLS8qIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0aGlzIHJvdXRpbmUgaXMgbmV2ZXIgY2FsbGVkLiAgV2hhdCBpcyBpdAotICAgZG9pbmcgaGVyZT8KLSAgIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0IDEzIEp1bCAxOTkzICovCi0KLQotLyoKLSAqIFJpc2MgcmVsb2NhdGlvbnMgYXJlIGNvbXBsZXRlbHkgZGlmZmVyZW50LCBzbyBpdCBuZWVkcwotICogdGhpcyBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lIHRvIGVtaXQgdGhlbS4KLSAqLwotdm9pZAotZW1pdF9yZWxvY2F0aW9ucyAoZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBzdHJ1Y3QgcmVsb2NfaW5mb19tODhrIHJpOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBleHRlcm4gY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsKLQotICBiemVybyAoKGNoYXIgKikgJnJpLCBzaXplb2YgKHJpKSk7Ci0gIGZvciAoOyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZml4UC0+Znhfcl90eXBlID49IE5PX1JFTE9DKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgImZpeFAtPmZ4X3JfdHlwZSA9ICVkXG4iLCBmaXhQLT5meF9yX3R5cGUpOwotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBpZiAoKHN5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSkgIT0gTlVMTCkKLQl7Ci0JICByaS5yX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsKLQkgICAgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLQkgIGlmICgoc3ltYm9sUC0+c3lfdHlwZSAmIE5fVFlQRSkgPT0gTl9VTkRGKQotCSAgICB7Ci0JICAgICAgcmkucl9leHRlcm4gPSAxOwotCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gc3ltYm9sUC0+c3lfbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByaS5yX2V4dGVybiA9IDA7Ci0JICAgICAgcmkucl9zeW1ib2xudW0gPSBzeW1ib2xQLT5zeV90eXBlICYgTl9UWVBFOwotCSAgICB9Ci0JICBpZiAoc3ltYm9sUCAmJiBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgPSBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9hZGRyZXNzOwotCSAgICB9Ci0JICByaS5yX3R5cGUgPSBmaXhQLT5meF9yX3R5cGU7Ci0JICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCAtPSByaS5yX2FkZHJlc3M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCSAgICB9Ci0KLQkgIGFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIChjaGFyICopICZyaSwgc2l6ZW9mIChyaSkpOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLSNpZiAwCi0KLS8qIFRoaXMgcm91dGluZSBjYW4gYmUgc3Vic3VtZWQgYnkgc19sY29tbSBpbiByZWFkLmMuCi0gICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCAxMyBKdWwgMTk5MyAqLwotCi0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoKQotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBic3NfYWxpZ247Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgYnNzX2FsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgYnNzX2FsaWduID0gMDsKLQotICBpZiAoIVNfSVNfREVGSU5FRChzeW1ib2xQKQotICAgICAgfHwgU19HRVRfU0VHTUVOVChzeW1ib2xQKSA9PSBTRUdfQlNTKQotICAgIHsKLSAgICAgIGlmICghIG5lZWRfcGFzc18yKQotCXsKLQkgIGNoYXIgKnA7Ci0JICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLQkgIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0JICBzdWJzZWdfc2V0IChTRUdfQlNTLCAxKTsgLyogc3dpdGNoIHRvIGJzcwkqLwotCi0JICBpZiAoYnNzX2FsaWduKQotCSAgICBmcmFnX2FsaWduIChic3NfYWxpZ24sIDAsIDApOwotCi0JICAvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZyAqLwotCSAgaWYgKHN5bWJvbFAtPnN5X3R5cGUgPT0gTl9CU1MgJiYgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSAhPSBOVUxMKQotCSAgICBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSBOVUxMOwotCi0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCi0JCQkob2Zmc2V0VCkgdGVtcCwgKGNoYXIgKikwKTsKLQkgICpwID0gMDsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIFNFR19CU1MpOwotCi0JICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgJXMuIiksIG5hbWUpOwotICAgIH0KLQotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotI2lmZGVmIE04OEtDT0ZGCi0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIGlmIHdlIGFyZSBsaW5raW5nIHdpdGggb2JqLWNvZmZiZmQuYy4KLSAgIFRoYXQgZmlsZSBtYXkgYmUgcmVwbGFjZWQgYnkgYSBtb3JlIEJGRCBvcmllbnRlZCB2ZXJzaW9uIGF0IHNvbWUKLSAgIHBvaW50LiAgSWYgdGhhdCBoYXBwZW5zLCB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHJleGFtaW5lZC4KLQotICAgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIDEzIEp1bHkgMTk5My4gICovCi0KLS8qIEdpdmVuIGEgZml4UyBzdHJ1Y3R1cmUgKGNyZWF0ZWQgYnkgYSBjYWxsIHRvIGZpeF9uZXcsIGFib3ZlKSwKLSAgIHJldHVybiB0aGUgQkZEIHJlbG9jYXRpb24gdHlwZSB0byB1c2UgZm9yIGl0LiAgKi8KLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ19MTzE2OgotICAgICAgcmV0dXJuIFJfTFZSVDE2OwotICAgIGNhc2UgUkVMT0NfSEkxNjoKLSAgICAgIHJldHVybiBSX0hWUlQxNjsKLSAgICBjYXNlIFJFTE9DX1BDMTY6Ci0gICAgICByZXR1cm4gUl9QQ1IxNkw7Ci0gICAgY2FzZSBSRUxPQ19QQzI2OgotICAgICAgcmV0dXJuIFJfUENSMjZMOwotICAgIGNhc2UgUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gUl9WUlQzMjsKLSAgICBjYXNlIFJFTE9DX0lXMTY6Ci0gICAgICByZXR1cm4gUl9WUlQxNjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBBcHBseSBhIGZpeFMgdG8gdGhlIG9iamVjdCBmaWxlLiAgU2luY2UgQ09GRiBkb2VzIG5vdCB1c2UgYWRkZW5kcwotICAgaW4gcmVsb2NzLCB0aGUgYWRkZW5kIGlzIGFjdHVhbGx5IHN0b3JlZCBkaXJlY3RseSBpbiB0aGUgb2JqZWN0Ci0gICBmaWxlIGl0c2VsZi4gICovCi0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4cCwgdmFsKQotICAgICBmaXhTICpmaXhwOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmOwotCi0gIGJ1ZiA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLSAgZml4cC0+Znhfb2Zmc2V0ID0gMDsKLQotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ19JVzE2OgotICAgICAgZml4cC0+Znhfb2Zmc2V0ID0gdmFsID4+IDE2OwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfTE8xNjoKLSAgICAgIGZpeHAtPmZ4X29mZnNldCA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzFdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0hJMTY6Ci0gICAgICBmaXhwLT5meF9vZmZzZXQgPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlsxXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzE2OgotICAgICAgYnVmWzBdID0gdmFsID4+IDEwOwotICAgICAgYnVmWzFdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIGJ1ZlswXSB8PSAodmFsID4+IDI2KSAmIDB4MDM7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTg7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gMTA7Ci0gICAgICBidWZbM10gPSB2YWwgPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBXaGVyZSBhIFBDIHJlbGF0aXZlIG9mZnNldCBpcyBjYWxjdWxhdGVkIGZyb20uICBPbiB0aGUgbTg4ayB0aGV5Ci0gICBhcmUgY2FsY3VsYXRlZCBmcm9tIGp1c3QgYWZ0ZXIgdGhlIGluc3RydWN0aW9uLiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmUgLSAyOwotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogV2hlbiB3ZSBhbGlnbiB0aGUgLmluaXQgc2VjdGlvbiwgaW5zZXJ0IHRoZSBjb3JyZWN0IE5PUCBwYXR0ZXJuLiAgKi8KLQotaW50Ci1tODhrX2RvX2FsaWduIChuLCBmaWxsLCBtYXgsIGxlbikKLSAgICAgaW50IG47Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGw7Ci0gICAgIGludCBsZW47Ci0gICAgIGludCBtYXg7Ci17Ci0gIGlmIChmaWxsID09IE5VTEwKLSAgICAgICYmIHN0cmNtcCAob2JqX3NlZ21lbnRfbmFtZSAobm93X3NlZyksICIuaW5pdCIpID09IDApCi0gICAgewotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9wX3BhdHRlcm5bXSA9IHsgMHhmNCwgMHgwMCwgMHg1OCwgMHgwMCB9OwotICAgICAgZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBub3BfcGF0dGVybiwgc2l6ZW9mIChub3BfcGF0dGVybiksIG1heCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogTTg4S0NPRkYgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTg4ay5oIGIvZ2FzL2NvbmZpZy90Yy1tODhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDY5YzguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tODhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogbTg4ay5oIC0tIEFzc2VtYmxlciBmb3IgdGhlIE1vdG9yb2xhIDg4MDAwCi0gICBDb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZiBCdWZmYWxvIFVuaXZlcnNpdHkKLSAgIGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19NODhLCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWZkZWYgTTg4S0NPRkYKLSNkZWZpbmUgQ09GRl9NQUdJQyBNQzg4T01BR0lDCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX204OGsKLSNkZWZpbmUgQ09GRl9GTEFHUyBGX0FSMzJXCi0jZW5kaWYKLQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotI2RlZmluZSBUQ19LRUVQX0ZYX09GRlNFVAotI2RlZmluZSBUQ19DT05TX1JFTE9DIFJFTE9DXzMyCi0KLS8qIGRpZmZlcmVudCB0eXBlIG9mIHJlbG9jYXRpb24gYXZhaWxhYmxlIGluIHRoZSBtODhrICovCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSRUxPQ19MTzE2LAkJCS8qIGxvMTYoc3ltKSAqLwotICBSRUxPQ19ISTE2LAkJCS8qIGhpMTYoc3ltKSAqLwotICBSRUxPQ19QQzE2LAkJCS8qIGJiMCwgYmIxLCBiY25kICovCi0gIFJFTE9DX1BDMjYsCQkJLyogYnIsIGJzciAqLwotICBSRUxPQ18zMiwJCQkvKiBqdW1wIHRhYmxlcywgZXRjICovCi0gIFJFTE9DX0lXMTYsCQkJLyogZ2xvYmFsIGFjY2VzcyB0aHJvdWdoIGxpbmtlciByZWdzIDI4ICovCi0gIE5PX1JFTE9DCi19OwotCi1zdHJ1Y3QgcmVsb2NfaW5mb19tODhrCi17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHJfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgdW5zaWduZWQgaW50IHJfcGFkOjM7Ci0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU6NDsKLSAgbG9uZyBpbnQgcl9hZGRlbmQ7Ci19OwotCi0jZGVmaW5lIHJlbG9jYXRpb25faW5mbyByZWxvY19pbmZvX204OGsKLQotLyogVGhlIG04OGsgdXNlcyAnQCcgdG8gc3RhcnQgbG9jYWwgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTEVYX0FUIChMRVhfQkVHSU5fTkFNRSB8IExFWF9OQU1FKQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgXAotICAoKG5hbWVbMF0gPT0nQCcgJiYgKG5hbWUgWzFdID09ICdMJyB8fCBuYW1lIFsxXSA9PSAnLicpKSBcCi0gICB8fCAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnMCcgJiYgbmFtZVsyXSA9PSAnXDAwMScpKQotI2VuZGlmCi0KLS8qIFRoZSBtODhrIHVzZXMgcHNldWRvLW9wcyB3aXRoIG5vIGxlYWRpbmcgcGVyaW9kLiAgKi8KLSNkZWZpbmUgTk9fUFNFVURPX0RPVCAxCi0KLS8qIERvbid0IHdhcm4gb24gd29yZCBvdmVyZmxvdzsgaXQgaGFwcGVucyBvbiAlaGkgcmVsb2NzLiAgKi8KLSN1bmRlZiBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0KLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKGIscyxmKQkJe2FzX2ZhdGFsIChfKCJtODhrIGNvbnZlcnRfZnJhZ1xuIikpO30KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB1bmRlZmluZWQgc3ltYm9scy4gICovCi0jZGVmaW5lIG1kX3VuZGVmaW5lZF9zeW1ib2wocykgMAotCi0vKiBXZSBoYXZlIG5vIHNwZWNpYWwgb3BlcmFuZCBoYW5kbGluZy4gICovCi0jZGVmaW5lIG1kX29wZXJhbmQoZSkKLQotI2lmZGVmIE04OEtDT0ZGCi0KLS8qIFdoZXRoZXIgYSByZWxvYyBzaG91bGQgYmUgb3V0cHV0LiAgKi8KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoZml4cCkgKChmaXhwKS0+ZnhfYWRkc3kgIT0gTlVMTCkKLQotLyogR2V0IHRoZSBCRkQgcmVsb2MgdHlwZSB0byB1c2UgZm9yIGEgZ2FzIGZpeFMgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4cCkgdGNfY29mZl9maXgycnR5cGUgKGZpeHApCi0KLS8qIE5vIHNwZWNpYWwgaG9vayBuZWVkZWQgZm9yIHN5bWJvbHMuICAqLwotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2socykKLQotLyogQWxpZ24gc2VjdGlvbnMgdG8gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotI2lmbmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikJKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQotI2VuZGlmCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykJbWF4IChzZWN0aW9uX2FsaWdubWVudFsoaW50KSAoU0VHKV0sIDQpCi0KLS8qIFdlIHVzZSBhIHNwZWNpYWwgYWxpZ25tZW50IGZ1bmN0aW9uIHRvIGluc2VydCB0aGUgY29ycmVjdCBub3AKLSAgIHBhdHRlcm4gaW4gLmluaXQuICAqLwotZXh0ZXJuIGludCBtODhrX2RvX2FsaWduIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotI2RlZmluZSBtZF9kb19hbGlnbihuLGZpbGwsbGVuLG1heCxsKSBpZiAobTg4a19kb19hbGlnbihuLGZpbGwsbWF4LGxlbikpIGdvdG8gbAotCi0jZW5kaWYgLyogTTg4S0NPRkYgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbWNvcmUuYyBiL2dhcy9jb25maWcvdGMtbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3MmYwMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDY0ICswLDAgQEAKLS8qIHRjLW1jb3JlLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgTSpDb3JlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAiLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgT0JKX0VMRgotI2luY2x1ZGUgImVsZi9tY29yZS5oIgotI2VuZGlmCi0KLSNpZm5kZWYgc3RyZXEKLSNkZWZpbmUgc3RyZXEoYSxiKSAoc3RyY21wIChhLCBiKSA9PSAwKQotI2VuZGlmCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBkdW1iIGNvbXBpbGVycy4gICovCi1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfbGl0ZXJhbHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3N0cmluZ2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9maWxsICAgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50ICAgIGxvZzIgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX3JlZyAgICBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkICopKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfY3JlZyAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKikpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9leHAgICAgUEFSQU1TICgoY2hhciAqLCBleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX3J0ICAgICBQQVJBTVMgKChjaGFyICosIGNoYXIgKiosIGludCwgZXhwcmVzc2lvblMgKikpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9pbW0gICAgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfbWVtICAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKiwgdW5zaWduZWQgKiwgdW5zaWduZWQpKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfcHNybW9kIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKikpOwotc3RhdGljIHZvaWQgICBtYWtlX25hbWUgUEFSQU1TICgoY2hhciAqLCBjaGFyICosIGludCkpOwotc3RhdGljIGludCAgICBlbnRlcl9saXRlcmFsIFBBUkFNUyAoKGV4cHJlc3Npb25TICosIGludCkpOwotc3RhdGljIHZvaWQgICBkdW1wX2xpdGVyYWxzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBjaGVja19saXRlcmFscyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zX3RleHQgICAgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfZGF0YSAgICBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfc19zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zX2JzcyAgICAgUEFSQU1TICgoaW50KSk7Ci0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgICBtY29yZV9zX2NvbW0gICAgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotLyogU2V2ZXJhbCBwbGFjZXMgaW4gdGhpcyBmaWxlIGluc2VydCByYXcgaW5zdHJ1Y3Rpb25zIGludG8gdGhlCi0gICBvYmplY3QuIFRoZXkgc2hvdWxkIHVzZSBNQ09SRV9JTlNUX1hYWCBtYWNyb3MgdG8gZ2V0IHRoZSBvcGNvZGVzCi0gICBhbmQgdGhlbiB1c2UgdGhlc2UgdHdvIG1hY3JvcyB0byBjcmFjayB0aGUgTUNPUkVfSU5TVCB2YWx1ZSBpbnRvCi0gICB0aGUgYXBwcm9wcmlhdGUgYnl0ZSB2YWx1ZXMuICAqLwotI2RlZmluZQlJTlNUX0JZVEUwKHgpICAodGFyZ2V0X2JpZ19lbmRpYW4gPyAoKCh4KSA+PiA4KSAmIDB4RkYpIDogKCh4KSAmIDB4RkYpKQotI2RlZmluZQlJTlNUX0JZVEUxKHgpICAodGFyZ2V0X2JpZ19lbmRpYW4gPyAoKHgpICYgMHhGRikgOiAoKCh4KSA+PiA4KSAmIDB4RkYpKQotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjLyI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMvIjsKLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwotCi1zdGF0aWMgaW50IGRvX2pzcmkyYnNyID0gMDsJLyogY2hhbmdlIGhlcmUgZnJvbSAxIGJ5IENydWVzcyAxOSBBdWd1c3QgOTcgKi8KLXN0YXRpYyBpbnQgc2lmaWx0ZXJfbW9kZSA9IDA7Ci0KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLSNkZWZpbmUgQyh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKLSNkZWZpbmUgR0VUX1dIQVQoeCkgICAgKCh4ID4+IDIpKQotCi0vKiBUaGVzZSBhcmUgdGhlIHR3byB0eXBlcyBvZiByZWxheGFibGUgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgQ09ORF9KVU1QICAxCi0jZGVmaW5lIFVOQ0RfSlVNUCAgMgotCi0jZGVmaW5lIFVOREVGX0RJU1AgICAgICAwCi0jZGVmaW5lIENPTkQxMiAgICAgICAgICAxCi0jZGVmaW5lIENPTkQzMiAgICAgICAgICAyCi0jZGVmaW5lIFVOQ0QxMiAgICAgICAgICAxCi0jZGVmaW5lIFVOQ0QzMiAgICAgICAgICAyCi0jZGVmaW5lIFVOREVGX1dPUkRfRElTUCA0Ci0jZGVmaW5lIEVORCAgICAgICAgICAgICA1Ci0KLSNkZWZpbmUgQzEyX0xFTgkgICAgICAgIDIKLSNkZWZpbmUgQzMyX0xFTgkgICAgICAgMTAJLyogYWxsb3cgZm9yIGFsaWduICovCi0jZGVmaW5lIFUxMl9MRU4JICAgICAgICAyCi0jZGVmaW5lIFUzMl9MRU4JICAgICAgICA4CS8qIGFsbG93IGZvciBhbGlnbiAqLwotCi10eXBlZGVmIGVudW0KLXsKLSAgTTIxMCwKLSAgTTM0MAotfQotY3B1X3R5cGU7Ci0KLWNwdV90eXBlIGNwdSA9IE0zNDA7Ci0KLS8qIEluaXRpYWxpemUgdGhlIHJlbGF4IHRhYmxlICovCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDA6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiAxOiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogMjogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDM6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiA0OiB1bnVzZWQgKi8gIAoteyAyMDQ4LCAtMjA0NiwgQzEyX0xFTiwgQyhDT05EX0pVTVAsIENPTkQzMikgfSwJLyogNTogQyhDT05EX0pVTVAsIENPTkQxMikgKi8KLXsgICAgMCwgICAgIDAsIEMzMl9MRU4sIDAgfSwJCQkvKiA2OiBDKENPTkRfSlVNUCwgQ09ORDMyKSAqLwoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogNzogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDg6IHVudXNlZCAqLyAgCi17IDIwNDgsIC0yMDQ2LCBVMTJfTEVOLCBDKFVOQ0RfSlVNUCwgVU5DRDMyKSB9LAkvKiA5OiBDKFVOQ0RfSlVNUCwgVU5DRDEyKSAqLwoteyAgICAwLCAgICAgMCwgVTMyX0xFTiwgMCB9LAkJCS8qMTA6IEMoVU5DRF9KVU1QLCBVTkNEMzIpICovCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKjExOiB1bnVzZWQgKi8gIAoteyAgICAwLCAgICAgMCwJICAgICAwLCAwIH0JCQkvKjEyOiB1bnVzZWQgKi8gIAotfTsKLQotLyogTElURVJBTCBQT09MIERBVEEgU1RSVUNUVVJFUyAqLwotc3RydWN0IGxpdGVyYWwKLXsKLSAgdW5zaWduZWQgc2hvcnQgIHJlZmNudDsKLSAgdW5zaWduZWQgY2hhcgkgIGlzcGNyZWw7Ci0gIHVuc2lnbmVkIGNoYXIJICB1bnVzZWQ7Ci0gIGV4cHJlc3Npb25TCSAgZTsKLX07Ci0KLSNkZWZpbmUgTUFYX1BPT0xfU0laRQkoMTAyNC80KQotc3RhdGljIHN0cnVjdCBsaXRlcmFsIGxpdHBvb2wgW01BWF9QT09MX1NJWkVdOwotc3RhdGljIHVuc2lnbmVkIHBvb2xzaXplOwotc3RhdGljIHVuc2lnbmVkIHBvb2xudW1iZXI7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwb29sc3BhbjsKLQotLyogU1BBTlBBTklDOiB0aGUgcG9pbnQgYXQgd2hpY2ggd2UgZ2V0IHRvbyBzY2FyZWQgYW5kIGZvcmNlIGEgZHVtcAotICAgb2YgdGhlIGxpdGVyYWwgcG9vbCwgYW5kIHBlcmhhcHMgcHV0IGEgYnJhbmNoIGluIHBsYWNlLgotICAgQ2FsY3VsYXRlZCBhczoKLSAgCQkgMTAyNAlzcGFuIG9mIGxydy9qbXBpL2pzcmkgaW5zbiAoYWN0dWFsbHkgc3BhbisxKQotICAJCS0yCXBvc3NpYmxlIGFsaWdubWVudCBhdCB0aGUgaW5zbi4KLSAgCQktMglwb3NzaWJsZSBhbGlnbm1lbnQgdG8gZ2V0IHRoZSB0YWJsZSBhbGlnbmVkLgotICAJCS0yCWFuIGluc2VydGVkIGJyYW5jaCBhcm91bmQgdGhlIHRhYmxlLgotICAJICAgICA9PSAxMDE4Ci0gICBhdCAxMDE4LCB3ZSBtaWdodCBiZSBpbiB0cm91YmxlLgotICAgLS0gc28gd2UgaGF2ZSB0byBiZSBzbWFsbGVyIHRoYW4gMTAxOCBhbmQgc2luY2Ugd2UgZGVhbCB3aXRoIDItYnl0ZQotICAgaW5zdHJ1Y3Rpb25zLCB0aGUgbmV4dCBnb29kIGNob2ljZSBpcyAxMDE2LgotICAgLS0gTm90ZSB3ZSBoYXZlIGEgdGVzdCBjYXNlIHRoYXQgZmFpbHMgd2hlbiB3ZSd2ZSBnb3QgMTAxOCBoZXJlLiAgKi8KLSNkZWZpbmUgU1BBTlBBTklDCSgxMDE2KQkJLyogMTAyNCAtIDEgZW50cnkgLSAyIGJ5dGUgcm91bmRpbmcgKi8KLSNkZWZpbmUgU1BBTkNMT1NFCSg5MDApCi0jZGVmaW5lIFNQQU5FWElUCSg2MDApCi1zdGF0aWMgc3ltYm9sUyAqIHBvb2xzeW07CQkvKiBsYWJlbCBmb3IgY3VycmVudCBwb29sICovCi1zdGF0aWMgY2hhciBwb29sbmFtZVs4XTsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgICBQc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgICBGdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiZXhwb3J0IiwgICBzX2dsb2JsLCAgICAgICAgICAwIH0sCi0gIHsgImltcG9ydCIsICAgc19pZ25vcmUsICAgICAgICAgMCB9LAotICB7ICJsaXRlcmFscyIsIG1jb3JlX3NfbGl0ZXJhbHMsIDAgfSwKLSAgeyAicGFnZSIsICAgICBsaXN0aW5nX2VqZWN0LCAgICAwIH0sCi0KLSAgLyogVGhlIGZvbGxvd2luZyBhcmUgdG8gaW50ZXJjZXB0IHRoZSBwbGFjZW1lbnQgb2YgZGF0YSBpbnRvIHRoZSB0ZXh0Ci0gICAgIHNlY3Rpb24gKGVnIGFkZHJlc3NlcyBmb3IgYSBzd2l0Y2ggdGFibGUpLCBzbyB0aGF0IHRoZSBzcGFjZSB0aGV5Ci0gICAgIG9jY3VweSBjYW4gYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gZGVjaWRpbmcgd2hldGhlciBvciBub3QgdG8KLSAgICAgZHVtcCB0aGUgY3VycmVudCBsaXRlcmFsIHBvb2wuCi0gICAgIFhYWCAtIGN1cnJlbnRseSB3ZSBkbyBub3QgY29wZSB3aXRoIHRoZSAuc3BhY2UgYW5kIC5kY2IuZCBkaXJlY3RpdmVzLiAgKi8KLSAgeyAiYXNjaWkiLCAgICBtY29yZV9zdHJpbmdlciwgICAgICAgMCB9LAotICB7ICJhc2NpeiIsICAgIG1jb3JlX3N0cmluZ2VyLCAgICAgICAxIH0sCi0gIHsgImJ5dGUiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDEgfSwKLSAgeyAiZGMiLCAgICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotICB7ICJkYy5iIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAxIH0sCi0gIHsgImRjLmQiLCAgICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2QnfSwKLSAgeyAiZGMubCIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgNCB9LAotICB7ICJkYy5zIiwgICAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdmJ30sCi0gIHsgImRjLnciLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKLSAgeyAiZGMueCIsICAgICBtY29yZV9mbG9hdF9jb25zLCAgICAneCd9LAotICB7ICJkb3VibGUiLCAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdkJ30sCi0gIHsgImZsb2F0IiwgICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2YnfSwKLSAgeyAiaHdvcmQiLCAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotICB7ICJpbnQiLCAgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICA0IH0sCi0gIHsgImxvbmciLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDQgfSwKLSAgeyAib2N0YSIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAxNiB9LAotICB7ICJxdWFkIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICA4IH0sCi0gIHsgInNob3J0IiwgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKLSAgeyAic2luZ2xlIiwgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZid9LAotICB7ICJzdHJpbmciLCAgIG1jb3JlX3N0cmluZ2VyLCAgICAgICAxIH0sCi0gIHsgIndvcmQiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKLSAgeyAiZmlsbCIsICAgICBtY29yZV9maWxsLCAgICAgICAgICAgMCB9LAotCi0gIC8qIEFsbG93IGZvciB0aGUgZWZmZWN0IG9mIHNlY3Rpb24gY2hhbmdlcy4gICovCi0gIHsgInRleHQiLCAgICAgIG1jb3JlX3NfdGV4dCwgICAgMCB9LAotICB7ICJkYXRhIiwgICAgICBtY29yZV9zX2RhdGEsICAgIDAgfSwKLSAgeyAiYnNzIiwgICAgICAgbWNvcmVfc19ic3MsICAgICAxIH0sCi0jaWZkZWYgT0JKX0VGCi0gIHsgImNvbW0iLCAgICAgIG1jb3JlX3NfY29tbSwgICAgMCB9LAotI2VuZGlmCi0gIHsgInNlY3Rpb24iLCAgIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0aW9uLnMiLCBtY29yZV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdCIsICAgICAgbWNvcmVfc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QucyIsICAgIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAotICAKLSAgeyAwLCAgICAgICAgICAwLCAgICAgICAgICAgICAgICAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zX2xpdGVyYWxzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1tY29yZV9jb25zIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICogcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ICAgIGNvbW1hcyA9IDE7Ci0gICAgICAKLSAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIG9uIHRoZSBsaW5lLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCi0JY29tbWFzICs9ICogcHRyICsrID09ICcsJzsKLSAgICAgIAotICAgICAgcG9vbHNwYW4gKz0gbmJ5dGVzICogY29tbWFzOwotICAgIH0KLSAgCi0gIGNvbnMgKG5ieXRlcyk7Ci0KLSAgLyogSW4gdGhlb3J5IHdlIG91Z2h0IHRvIGNhbGwgY2hlY2tfbGl0ZXJhbHMgKDIsMCkgaGVyZSBpbiBjYXNlCi0gICAgIHdlIG5lZWQgdG8gZHVtcCB0aGUgbGl0ZXJhbCB0YWJsZS4gIFdlIGNhbm5vdCBkbyB0aGlzIGhvd2V2ZXIsCi0gICAgIGFzIHRoZSBkaXJlY3RpdmVzIHRoYXQgd2UgYXJlIGludGVyY2VwdGluZyBtYXkgYmUgYmVpbmcgdXNlZAotICAgICB0byBidWlsZCBhIHN3aXRjaCB0YWJsZSwgYW5kIHdlIG11c3Qgbm90IGludGVyZmVyZSB3aXRoIGl0cwotICAgICBjb250ZW50cy4gIEluc3RlYWQgd2UgY3Jvc3Mgb3VyIGZpbmdlcnMgYW5kIHByYXkuLi4gKi8KLX0KLQotc3RhdGljIHZvaWQKLW1jb3JlX2Zsb2F0X2NvbnMgKGZsb2F0X3R5cGUpCi0gICAgIGludCBmbG9hdF90eXBlOwotewotICBpZiAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pCi0gICAgewotICAgICAgY2hhciAqIHB0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGludCAgICBjb21tYXMgPSAxOwotCi0jaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLSNlcnJvciBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBub3QgaGFuZGxlZAotI2VuZGlmCi0gICAgICAKLSAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIG9uIHRoZSBsaW5lLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCi0JY29tbWFzICs9ICogcHRyICsrID09ICcsJzsKLQotICAgICAgLyogV2Ugd291bGQgbGlrZSB0byBjb21wdXRlICJoZXhfZmxvYXQgKGZsb2F0X3R5cGUpICogY29tbWFzIgotCSBidXQgaGV4X2Zsb2F0IGlzIG5vdCBleHBvcnRlZCBmcm9tIHJlYWQuYyAgKi8KLSAgICAgIGZsb2F0X3R5cGUgPT0gJ2YnID8gNCA6IChmbG9hdF90eXBlID09ICdkJyA/IDggOiAxMik7Ci0gICAgICBwb29sc3BhbiArPSBmbG9hdF90eXBlICogY29tbWFzOwotICAgIH0KLQotICBmbG9hdF9jb25zIChmbG9hdF90eXBlKTsKLSAgCi0gIC8qIFNlZSB0aGUgY29tbWVudCBpbiBtY29yZV9jb25zICgpIGFib3V0IGNhbGxpbmcgY2hlY2tfbGl0ZXJhbHMuCi0gICAgIEl0IGlzIHVubGlrZWx5IHRoYXQgYSBzd2l0Y2ggdGFibGUgd2lsbCBiZSBjb25zdHJ1Y3RlZCB1c2luZwotICAgICBmbG9hdGluZyBwb2ludCB2YWx1ZXMsIGJ1dCBpdCBpcyBzdGlsbCBsaWtlbHkgdGhhdCBhbiBpbmRleGVkCi0gICAgIHRhYmxlIG9mIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBpcyBiZWluZyBjcmVhdGVkIGJ5IHRoZXNlCi0gICAgIGRpcmVjdGl2ZXMsIHNvIGFnYWluIHdlIG11c3Qgbm90IGludGVyZmVyZSB3aXRoIHRoZWlyIHBsYWNlbWVudC4gICovCi19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zdHJpbmdlciAoYXBwZW5kX3plcm8pCi0gICAgIGludCBhcHBlbmRfemVybzsKLXsKLSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGNoYXIgKiBwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAKLSAgICAgIC8qIEluIHRoZW9yeSB3ZSBzaG91bGQgY29tcHV0ZSBob3cgbWFueSBieXRlcyBhcmUgZ29pbmcgdG8KLQkgYmUgb2NjdXBpZWQgYnkgdGhlIHN0cmluZyhzKSBhbmQgYWRkIHRoaXMgdG8gdGhlIHBvb2xzcGFuLgotCSBUbyBrZWVwIHRoaW5ncyBzaW1wbGUgaG93ZXZlciwgd2UganVzdCBhZGQgdGhlIG51bWJlciBvZgotCSBieXRlcyBsZWZ0IG9uIHRoZSBjdXJyZW50IGxpbmUuICBUaGlzIHdpbGwgYmUgYW4gb3Zlci0KLQkgZXN0aW1hdGUsIHdoaWNoIGlzIE9LLCBhbmQgYXV0b21hdGljYWxseSBhbGxvd3MgZm9yIHRoZQotCSBhcHBlbmRpbmcgYSB6ZXJvIGJ5dGUsIHNpbmNlIHRoZSByZWFsIHN0cmluZyhzKSBpcy9hcmUKLQkgcmVxdWlyZWQgdG8gYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3Rlcy4gICovCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZSBbKiBwdHJdKQotCXB0ciArKzsKLQotICAgICAgcG9vbHNwYW4gKz0gcHRyIC0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgCi0gIHN0cmluZ2VyIChhcHBlbmRfemVybyk7Ci0KLSAgLyogV2UgY2FsbCBjaGVja19saXRlcmFscyBoZXJlIGluIGNhc2UgYSBsYXJnZSBudW1iZXIgb2Ygc3RyaW5ncyBhcmUKLSAgICAgYmVpbmcgcGxhY2VkIGludG8gdGhlIHRleHQgc2VjdGlvbiB3aXRoIGEgc2VxdWVuY2Ugb2Ygc3RyaW5nZXIKLSAgICAgZGlyZWN0aXZlcy4gIEluIHRoZW9yeSB3ZSBjb3VsZCBiZSB1cHNldHRpbmcgc29tZXRoaW5nIGlmIHRoZXNlCi0gICAgIHN0cmluZ3MgYXJlIGFjdHVhbGx5IGluIGFuIGluZGV4ZWQgdGFibGUgaW5zdGVhZCBvZiByZWZlcmVuY2VkIGJ5Ci0gICAgIGluZGl2aWR1YWwgbGFiZWxzLiAgTGV0IHVzIGhvcGUgdGhhdCB0aGF0IG5ldmVyIGhhcHBlbnMuICAqLwotICBjaGVja19saXRlcmFscyAoMiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9maWxsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICogc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ICAgIHNpemUgPSAxOwotICAgICAgaW50ICAgIHJlcGVhdDsKLQotICAgICAgcmVwZWF0ID0gYXRvaSAoc3RyKTsKLSAgICAgIAotICAgICAgLyogTG9vayB0byBzZWUgaWYgYSBzaXplIGhhcyBiZWVuIHNwZWNpZmllZC4gICovCi0gICAgICB3aGlsZSAoKnN0ciAhPSAnXG4nICYmICpzdHIgIT0gMCAmJiAqc3RyICE9ICcsJykKLQkrKyBzdHI7Ci0gICAgICAKLSAgICAgIGlmICgqIHN0ciA9PSAnLCcpCi0JewotCSAgc2l6ZSA9IGF0b2kgKHN0ciArIDEpOwotCi0JICBpZiAoc2l6ZSA+IDgpCi0JICAgIHNpemUgPSA4OwotCSAgZWxzZSBpZiAoc2l6ZSA8IDApCi0JICAgIHNpemUgPSAwOwotCX0KLQotICAgICAgcG9vbHNwYW4gKz0gc2l6ZSAqIHJlcGVhdDsKLSAgICB9Ci0gIAotICBzX2ZpbGwgKHVudXNlZCk7Ci0KLSAgY2hlY2tfbGl0ZXJhbHMgKDIsIDApOwotfQotCi0vKiBIYW5kbGUgdGhlIHNlY3Rpb24gY2hhbmdpbmcgcHNldWRvLW9wcy4gIFRoZXNlIGNhbGwgdGhyb3VnaCB0byB0aGUKLSAgIG5vcm1hbCBpbXBsZW1lbnRhdGlvbnMsIGJ1dCB0aGV5IGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBmaXJzdC4gICovCi1zdGF0aWMgdm9pZAotbWNvcmVfc190ZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSNpZmRlZiBPQkpfRUxGCi0gIG9ial9lbGZfdGV4dCAoaWdub3JlKTsKLSNlbHNlCi0gIHNfdGV4dCAoaWdub3JlKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc19kYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSNpZmRlZiBPQkpfRUxGCi0gIG9ial9lbGZfZGF0YSAoaWdub3JlKTsKLSNlbHNlCi0gIHNfZGF0YSAoaWdub3JlKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc19zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFNjYW4gZm9yd2FyZHMgdG8gZmluZCB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbi4gIElmIHRoZSBzZWN0aW9uCi0gICAgIGJlaW5nIHN3aXRjaGVkIHRvIGlzICIubGluZSIgdGhlbiB0aGlzIGlzIGEgRFdBUkYxIGRlYnVnIHNlY3Rpb24KLSAgICAgd2hpY2ggaXMgYXJiaXRhcmlseSBwbGFjZWQgaW5zaWRlIGdlbmVyYXRlZCBjb2RlLiAgSW4gdGhpcyBjYXNlCi0gICAgIGRvIG5vdCBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgYmVjYXVzZSBpdCBpcyBhKSBpbmVmZmljaWVudCBhbmQKLSAgICAgYikgd291bGQgcmVxdWlyZSB0aGUgZ2VuZXJhdGlvbiBvZiBleHRyYSBjb2RlIHRvIGp1bXAgYXJvdW5kIHRoZQotICAgICBwb29sLiAgKi8KLSAgY2hhciAqIGlscCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICB3aGlsZSAoKmlscCAhPSAwICYmIGlzc3BhY2UoKmlscCkpCi0gICAgKysgaWxwOwotCi0gIGlmIChzdHJuY21wIChpbHAsICIubGluZSIsIDUpID09IDAKLSAgICAgICYmIChpc3NwYWNlIChpbHBbNV0pIHx8ICppbHAgPT0gJ1xuJyB8fCAqaWxwID09ICdccicpKQotICAgIDsKLSAgZWxzZQotICAgIGR1bXBfbGl0ZXJhbHMgKDApOwotCi0jaWZkZWYgT0JKX0VMRgotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfQ09GRgotICBvYmpfY29mZl9zZWN0aW9uIChpZ25vcmUpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zX2JzcyAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIAotICBzX2xjb21tX2J5dGVzIChuZWVkc19hbGlnbik7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZAotbWNvcmVfc19jb21tIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgCi0gIG9ial9lbGZfY29tbW9uIChuZWVkc19hbGlnbik7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMuICAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgbWNvcmVfb3Bjb2RlX2luZm8gKiBvcGNvZGU7Ci0gIGNoYXIgKiBwcmV2X25hbWUgPSAiIjsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChvcGNvZGUgPSBtY29yZV90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUgKyspCi0gICAgewotICAgICAgaWYgKHN0cmVxIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCi0JewotCSAgLyogTWFrZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHBvaW50IHRvIHRoZSBzYW1lCi0JICAgICBzdHJpbmcuICAqLwotCSAgb3Bjb2RlLT5uYW1lID0gcHJldl9uYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX207Ci1zdGF0aWMgaW50IHJlZ19uOwotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotCi0vKiBHZXQgYSBsb2cyKHZhbCkuICAqLwotc3RhdGljIGludAotbG9nMiAodmFsKQotICAgIHVuc2lnbmVkIGludCB2YWw7Ci17Ci0gICAgaW50IGxvZyA9IC0xOwotICAgIHdoaWxlICh2YWwgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgbG9nICsrOwotICAgICAgICB2YWwgPj49IDE7Ci0gICAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGxvZzsKLX0KLQotLyogVHJ5IHRvIHBhcnNlIGEgcmVnIG5hbWUuICAqLwotc3RhdGljIGNoYXIgKgotcGFyc2VfcmVnIChzLCByZWcpCi0gICAgIGNoYXIgKiBzOwotICAgICB1bnNpZ25lZCAqIHJlZzsKLXsKLSAgLyogU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0gICAgKysgczsKLSAgCi0gIGlmICh0b2xvd2VyIChzWzBdKSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNbMV0gPT0gJzEnICYmIHNbMl0gPj0gJzAnICYmIHNbMl0gPD0gJzUnKQotCXsKLQkgICpyZWcgPSAxMCArIHNbMl0gLSAnMCc7Ci0JICByZXR1cm4gcyArIDM7Ci0JfQotICAgICAgCi0gICAgICBpZiAoc1sxXSA+PSAnMCcgJiYgc1sxXSA8PSAnOScpCi0JewotCSAgKnJlZyA9IHNbMV0gLSAnMCc7Ci0JICByZXR1cm4gcyArIDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoICAgdG9sb3dlciAoc1swXSkgPT0gJ3MnCi0JICAgJiYgdG9sb3dlciAoc1sxXSkgPT0gJ3AnCi0JICAgJiYgISBpc2FsbnVtIChzWzJdKSkKLSAgICB7Ci0gICAgICAqIHJlZyA9IDA7Ci0gICAgICByZXR1cm4gcyArIDI7Ci0gICAgfQotICAKLSAgYXNfYmFkIChfKCJyZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciKSwgcyk7Ci0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgc3RydWN0IENyZWdzCi17Ci0gIGNoYXIgKiBuYW1lOwotICB1bnNpZ25lZCBpbnQgY3JudW07Ci19Ci1jcmVnc1tdID0KLXsKLSAgeyAicHNyIiwJIDB9LAotICB7ICJ2YnIiLAkgMX0sCi0gIHsgImVwc3IiLAkgMn0sCi0gIHsgImZwc3IiLAkgM30sCi0gIHsgImVwYyIsCSA0fSwKLSAgeyAiZnBjIiwJIDV9LAotICB7ICJzczAiLAkgNn0sCi0gIHsgInNzMSIsCSA3fSwKLSAgeyAic3MyIiwJIDh9LAotICB7ICJzczMiLAkgOX0sCi0gIHsgInNzNCIsCTEwfSwKLSAgeyAiZ2NyIiwJMTF9LAotICB7ICJnc3IiLAkxMn0sCi0gIHsgIiIsCQkgMH0KLX07Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX2NyZWcgKHMsIHJlZykKLSAgICAgY2hhciAqIHM7Ci0gICAgIHVuc2lnbmVkICogcmVnOwotewotICBpbnQgaTsKLQotICAvKiBTdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLSAgICArK3M7Ci0gIAotICBpZiAoKHRvbG93ZXIgKHNbMF0pID09ICdjJyAmJiB0b2xvd2VyIChzWzFdKSA9PSAncicpKQotICAgIHsKLSAgICAgIGlmIChzWzJdID09ICczJyAmJiBzWzNdID49ICcwJyAmJiBzWzNdIDw9ICcxJykKLQl7Ci0JICAqcmVnID0gMzAgKyBzWzNdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyA0OwotCX0KLSAgICAgIAotICAgICAgaWYgKHNbMl0gPT0gJzInICYmIHNbM10gPj0gJzAnICYmIHNbM10gPD0gJzknKQotCXsKLQkgICpyZWcgPSAyMCArIHNbM10gLSAnMCc7Ci0JICByZXR1cm4gcyArIDQ7Ci0JfQotICAgICAgCi0gICAgICBpZiAoc1syXSA9PSAnMScgJiYgc1szXSA+PSAnMCcgJiYgc1szXSA8PSAnOScpCi0JewotCSAgKnJlZyA9IDEwICsgc1szXSAtICcwJzsKLQkgIHJldHVybiBzICsgNDsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChzWzJdID49ICcwJyAmJiBzWzJdIDw9ICc5JykKLQl7Ci0JICAqcmVnID0gc1syXSAtICcwJzsKLQkgIHJldHVybiBzICsgMzsKLQl9Ci0gICAgfQotICAKLSAgLyogTG9vayBhdCBhbHRlcm5hdGUgY3JlZyBuYW1lcyBiZWZvcmUgZ2l2aW5nIGVycm9yLiAgKi8KLSAgZm9yIChpID0gMDsgY3JlZ3NbaV0ubmFtZVswXSAhPSAnXDAnOyBpKyspCi0gICAgewotICAgICAgY2hhciBidWYgWzEwXTsKLSAgICAgIGludCAgbGVuZ3RoOwotICAgICAgaW50ICBqOwotICAgICAgCi0gICAgICBsZW5ndGggPSBzdHJsZW4gKGNyZWdzW2ldLm5hbWUpOwotICAgICAgCi0gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspCi0JYnVmW2pdID0gdG9sb3dlciAoc1tqXSk7Ci0gICAgICAKLSAgICAgIGlmIChzdHJuY21wIChjcmVnc1tpXS5uYW1lLCBidWYsIGxlbmd0aCkgPT0gMCkKLQl7Ci0JICAqcmVnID0gY3JlZ3NbaV0uY3JudW07Ci0JICByZXR1cm4gcyArIGxlbmd0aDsKLQl9Ci0gICAgfQotICAKLSAgYXNfYmFkIChfKCJjb250cm9sIHJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIpLCBzKTsKLSAgCi0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9wc3Jtb2QgKHMsIHJlZykKLSAgY2hhciAqICAgICBzOwotICB1bnNpZ25lZCAqIHJlZzsKLXsKLSAgaW50ICBpOwotICBjaGFyIGJ1ZlsxMF07Ci0gIHN0YXRpYyBzdHJ1Y3QgcHNybW9kcwotICB7Ci0gICAgY2hhciAqICAgICAgIG5hbWU7Ci0gICAgdW5zaWduZWQgaW50IHZhbHVlOwotICB9Ci0gIHBzcm1vZHNbXSA9Ci0gIHsKLSAgICB7ICJpZSIsIDEgfSwKLSAgICB7ICJmZSIsIDIgfSwKLSAgICB7ICJlZSIsIDQgfSwKLSAgICB7ICJhZiIsIDggfQkvKiBSZWFsbHkgMCBhbmQgbm9uLWNvbWJpbmFibGUuICAqLwotICB9OwotICAKLSAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICBidWZbaV0gPSBpc2FzY2lpIChzW2ldKSA/IHRvbG93ZXIgKHNbaV0pIDogMDsKLSAgCi0gIGZvciAoaSA9IHNpemVvZiAocHNybW9kcykgLyBzaXplb2YgKHBzcm1vZHNbMF0pOyBpLS07KQotICAgIHsKLSAgICAgIGlmICghIHN0cm5jbXAgKHBzcm1vZHNbaV0ubmFtZSwgYnVmLCAyKSkKLQl7Ci0gICAgICAgICAgKiByZWcgPSBwc3Jtb2RzW2ldLnZhbHVlOwotCSAgCi0gICAgICAgICAgcmV0dXJuIHMgKyAyOwotCX0KLSAgICB9Ci0gIAotICBhc19iYWQgKF8oImJhZC9taXNzaW5nIHBzciBzcGVjaWZpZXIiKSk7Ci0gIAotICAqIHJlZyA9IDA7Ci0gIAotICByZXR1cm4gczsKLX0KLQotc3RhdGljIGNoYXIgKgotcGFyc2VfZXhwIChzLCBlKQotICAgICBjaGFyICogczsKLSAgICAgZXhwcmVzc2lvblMgKiBlOwotewotICBjaGFyICogc2F2ZTsKLSAgY2hhciAqIG5ldzsKLQotICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLSAgICArKyBzOwotICAKLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQotICBleHByZXNzaW9uIChlKTsKLSAgCi0gIGlmIChlLT5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICAKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICAKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfbmFtZSAocywgcCwgbikKLSAgICAgY2hhciAqIHM7Ci0gICAgIGNoYXIgKiBwOwotICAgICBpbnQgbjsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0KLSAgc1swXSA9IHBbMF07Ci0gIHNbMV0gPSBwWzFdOwotICBzWzJdID0gcFsyXTsKLSAgc1szXSA9IGhleFsobiA+PiAxMikgJiAweEZdOwotICBzWzRdID0gaGV4WyhuID4+ICA4KSAmIDB4Rl07Ci0gIHNbNV0gPSBoZXhbKG4gPj4gIDQpICYgMHhGXTsKLSAgc1s2XSA9IGhleFsobikgICAgICAgJiAweEZdOwotICBzWzddID0gMDsKLX0KLQotI2RlZmluZSBQT09MX0VORF9MQUJFTCAgICIuTEUiCi0jZGVmaW5lIFBPT0xfU1RBUlRfTEFCRUwgIi5MUyIKLQotc3RhdGljIHZvaWQKLWR1bXBfbGl0ZXJhbHMgKGlzZm9yY2UpCi0gICAgIGludCBpc2ZvcmNlOwotewotICBpbnQgaTsKLSAgc3RydWN0IGxpdGVyYWwgKiBwOwotICBzeW1ib2xTICogYnJhcnN5bTsKLSAgCi0gIGlmIChwb29sc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBNdXN0IHdlIGJyYW5jaCBhcm91bmQgdGhlIGxpdGVyYWwgdGFibGU/ICovCi0gIGlmIChpc2ZvcmNlKQotICAgIHsKLSAgICAgIGNoYXIgKiBvdXRwdXQ7Ci0gICAgICBjaGFyIGJyYXJuYW1lWzhdOwotICAgICAgCi0gICAgICBtYWtlX25hbWUgKGJyYXJuYW1lLCBQT09MX0VORF9MQUJFTCwgcG9vbG51bWJlcik7Ci0gICAgICAKLSAgICAgIGJyYXJzeW0gPSBzeW1ib2xfbWFrZSAoYnJhcm5hbWUpOwotICAgICAgCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChicmFyc3ltKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGgsCi0JCQkgQyAoVU5DRF9KVU1QLCAwKSwgYnJhcnN5bSwgMCwgMCk7Ci0gICAgICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0JSKTsJLyogYnIgLit4eHggKi8KLSAgICAgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKE1DT1JFX0lOU1RfQlIpOwotICAgIH0KLSAgICAgIAotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbiBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZCBhbmQgdGhhdAotICAgICB0aGUgbGl0ZXJhbCB0YWJsZSBpcyBhbGlnbmVkIHdpdGhpbiBpdC4gICovCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOwotICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLSAgCi0gIGNvbG9uIChTX0dFVF9OQU1FIChwb29sc3ltKSk7Ci0gIAotICBmb3IgKGkgPSAwLCBwID0gbGl0cG9vbDsgaSA8IHBvb2xzaXplOyBpKyssIHArKykKLSAgICBlbWl0X2V4cHIgKCYgcC0+ZSwgNCk7Ci0gIAotICBpZiAoaXNmb3JjZSkKLSAgICBjb2xvbiAoU19HRVRfTkFNRSAoYnJhcnN5bSkpOwotICAKLSAgIHBvb2xzaXplID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX2xpdGVyYWxzIChraW5kLCBvZmZzZXQpCi0gICAgIGludCBraW5kOwotICAgICBpbnQgb2Zmc2V0OwotewotICBwb29sc3BhbiArPSBvZmZzZXQ7Ci0gICAgCi0gIC8qIFNQQU5DTE9TRSBhbmQgU1BBTkVYSVQgYXJlIHNtYWxsZXIgbnVtYmVycyB0aGFuIFNQQU5QQU5JQy4KLSAgICAgU1BBTlBBTklDIG1lYW5zIHRoYXQgd2UgbXVzdCBkdW1wIG5vdy4KLSAgICAga2luZCA9PSAwIGlzIGFueSBvbGQgaW5zdHJ1Y3Rpb24uCi0gICAgIGtpbmQgID4gMCBtZWFucyB3ZSBqdXN0IGhhZCBhIGNvbnRyb2wgdHJhbnNmZXIgaW5zdHJ1Y3Rpb24uCi0gICAgIGtpbmQgPT0gMSBtZWFucyB3aXRoaW4gYSBmdW5jdGlvbgotICAgICBraW5kID09IDIgbWVhbnMgd2UganVzdCBsZWZ0IGEgZnVuY3Rpb24KLSAgICAKLSAgICAgVGhlIGR1bXBfbGl0ZXJhbHMgKDEpIGNhbGwgaW5zZXJ0cyBhIGJyYW5jaCBhcm91bmQgdGhlIHRhYmxlLCBzbwotICAgICB3ZSBmaXJzdCBsb29rIHRvIHNlZSBpZiBpdHMgYSBzaXR1YXRpb24gd2hlcmUgd2Ugd29uJ3QgaGF2ZSB0bwotICAgICBpbnNlcnQgYSBicmFuY2ggKGUuZy4sIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYW4gdW5jb25kaXRpb25hbAotICAgICBicmFuY2gpLgotICAgIAotICAgICBTUEFOUEFOSUMgaXMgdGhlIHBvaW50IHdoZXJlIHdlIG11c3QgZHVtcCBhIHNpbmdsZS1lbnRyeSBwb29sLgotICAgICBpdCBhY2NvdW50cyBmb3IgYWxpZ25tZW50cyBhbmQgYW4gaW5zZXJ0ZWQgYnJhbmNoLgotICAgICB0aGUgJ3Bvb2xzaXplKjInIGFjY291bnRzIGZvciB0aGUgc2NlbmFyaW8gd2hlcmUgd2UgZG86Ci0gICAgICAgbHJ3IHIxLGxpdDE7IGxydyByMixsaXQyOyBscncgcjMsbGl0MwotICAgICBOb3RlIHRoYXQgdGhlICdsaXQyJyByZWZlcmVuY2UgaXMgMiBieXRlcyBmdXJ0aGVyIGFsb25nCi0gICAgIGJ1dCB0aGUgbGl0ZXJhbCBpdCByZWZlcmVuY2VzIHdpbGwgYmUgNCBieXRlcyBmdXJ0aGVyIGFsb25nLAotICAgICBzbyB3ZSBtdXN0IGNvbnNpZGVyIHRoZSBwb29sc2l6ZSBpbnRvIHRoaXMgZXF1YXRpb24uCi0gICAgIFRoaXMgaXMgc2xpZ2h0bHkgb3Zlci1jYXV0aW91cywgYnV0IGd1YXJhbnRlZXMgdGhhdCB3ZSB3b24ndAotICAgICBwYW5pYyBiZWNhdXNlIGEgcmVsb2NhdGlvbiBpcyB0b28gZGlzdGFudC4gICovCi0gIAotICBpZiAocG9vbHNwYW4gPiBTUEFOQ0xPU0UgJiYga2luZCA+IDApCi0gICAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIGVsc2UgaWYgKHBvb2xzcGFuID4gU1BBTkVYSVQgJiYga2luZCA+IDEpCi0gICAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIGVsc2UgaWYgKHBvb2xzcGFuID49IChTUEFOUEFOSUMgLSBwb29sc2l6ZSAqIDIpKQotICAgIGR1bXBfbGl0ZXJhbHMgKDEpOwotfQotCi1zdGF0aWMgaW50Ci1lbnRlcl9saXRlcmFsIChlLCBpc3BjcmVsKQotICAgICBleHByZXNzaW9uUyAqIGU7Ci0gICAgIGludCBpc3BjcmVsOwotewotICBpbnQgaTsKLSAgc3RydWN0IGxpdGVyYWwgKiBwOwotCi0gIGlmIChwb29sc2l6ZSA+PSBNQVhfUE9PTF9TSVpFIC0gMikKLSAgICB7Ci0gICAgICAvKiBUaGUgbGl0ZXJhbCBwb29sIGlzIGFzIGZ1bGwgYXMgd2UgY2FuIGhhbmRsZS4gV2UgaGF2ZQotICAgICAgICAgdG8gYmUgMiBlbnRyaWVzIHNoeSBvZiB0aGUgMTAyNC80PTI1NiBlbnRyaWVzIGJlY2F1c2Ugd2UKLSAgICAgICAgIGhhdmUgdG8gYWxsb3cgZm9yIHRoZSBicmFuY2ggKDIgYnl0ZXMpIGFuZCB0aGUgYWxpZ25tZW50Ci0gICAgICAgICAoMiBieXRlcyBiZWZvcmUgdGhlIGZpcnN0IGluc24gcmVmZXJlbmNpbmcgdGhlIHBvb2wgYW5kCi0gICAgICAgICAyIGJ5dGVzIGJlZm9yZSB0aGUgcG9vbCBpdHNlbGYpID09IDYgYnl0ZXMsIHJvdW5kcyB1cAotICAgICAgICAgdG8gMiBlbnRyaWVzLiAgKi8gCi0gICAgICBkdW1wX2xpdGVyYWxzICgxKTsKLSAgICB9Ci0KLSAgaWYgKHBvb2xzaXplID09IDApCi0gICAgewotICAgICAgLyogQ3JlYXRlIG5ldyBsaXRlcmFsIHBvb2wuICAqLwotICAgICAgaWYgKCsrIHBvb2xudW1iZXIgPiAweEZGRkYpCi0JYXNfZmF0YWwgKF8oIm1vcmUgdGhhbiA2NUsgbGl0ZXJhbCBwb29scyIpKTsKLSAgICAgIAotICAgICAgbWFrZV9uYW1lIChwb29sbmFtZSwgUE9PTF9TVEFSVF9MQUJFTCwgcG9vbG51bWJlcik7Ci0gICAgICBwb29sc3ltID0gc3ltYm9sX21ha2UgKHBvb2xuYW1lKTsKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHBvb2xzeW0pOwotICAgICAgcG9vbHNwYW4gPSAwOwotICAgIH0KLSAgCi0gIC8qIFNlYXJjaCBwb29sIGZvciB2YWx1ZSBzbyB3ZSBkb24ndCBoYXZlIGR1cGxpY2F0ZXMuICAqLwotICBmb3IgKHAgPSBsaXRwb29sLCBpID0gMDsgaSA8IHBvb2xzaXplOyBpKyssIHArKykKLSAgICB7Ci0gICAgICBpZiAoZS0+WF9vcCA9PSBwLT5lLlhfb3AKLQkgICYmIGUtPlhfYWRkX3N5bWJvbCA9PSBwLT5lLlhfYWRkX3N5bWJvbAotCSAgJiYgZS0+WF9hZGRfbnVtYmVyID09IHAtPmUuWF9hZGRfbnVtYmVyCi0JICAmJiBpc3BjcmVsID09IHAtPmlzcGNyZWwpCi0JewotCSAgcC0+cmVmY250ICsrOwotCSAgcmV0dXJuIGk7Ci0JfQotICAgIH0KLQotICBwLT5yZWZjbnQgID0gMTsKLSAgcC0+aXNwY3JlbCA9IGlzcGNyZWw7Ci0gIHAtPmUgICAgICAgPSAqIGU7Ci0gIAotICBwb29sc2l6ZSArKzsKLQotICByZXR1cm4gaTsgICAKLX0KLQotLyogUGFyc2UgYSBsaXRlcmFsIHNwZWNpZmljYXRpb24uIC0tIGVpdGhlciBuZXcgb3Igb2xkIHN5bnRheC4KLSAgIG9sZCBzeW50YXg6IHRoZSB1c2VyIHN1cHBsaWVzIHRoZSBsYWJlbCBhbmQgcGxhY2VzIHRoZSBsaXRlcmFsLgotICAgbmV3IHN5bnRheDogd2UgcHV0IGl0IGludG8gdGhlIGxpdGVyYWwgcG9vbC4gICovCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9ydCAocywgb3V0cHV0cCwgaXNwY3JlbCwgZXApCi0gICAgIGNoYXIgKiBzOwotICAgICBjaGFyICoqIG91dHB1dHA7Ci0gICAgIGludCBpc3BjcmVsOwotICAgICBleHByZXNzaW9uUyAqIGVwOwotewotICBleHByZXNzaW9uUyBlOwotICBpbnQgbjsKLSAgCi0gIGlmIChlcCkKLSAgICAvKiBJbmRpY2F0ZSBub3RoaW5nIHRoZXJlLiAgKi8KLSAgICBlcC0+WF9vcCA9IE9fYWJzZW50OwotICAKLSAgaWYgKCpzID09ICdbJykKLSAgICB7Ci0gICAgICBzID0gcGFyc2VfZXhwIChzICsgMSwgJiBlKTsKLSAgICAgIAotICAgICAgaWYgKCpzID09ICddJykKLQlzKys7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJtaXNzaW5nICddJyIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzID0gcGFyc2VfZXhwIChzLCAmIGUpOwotICAgICAgCi0gICAgICBuID0gZW50ZXJfbGl0ZXJhbCAoJiBlLCBpc3BjcmVsKTsKLSAgICAgIAotICAgICAgaWYgKGVwKQotCSplcCA9IGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBwb29sIGVudHJ5LiAgKi8KLSAgICAgIGUuWF9vcCAgICAgICAgID0gT19zeW1ib2w7Ci0gICAgICBlLlhfYWRkX3N5bWJvbCA9IHBvb2xzeW07Ci0gICAgICBlLlhfYWRkX251bWJlciA9IG4gPDwgMjsKLSAgICB9Ci0gIAotICAqIG91dHB1dHAgPSBmcmFnX21vcmUgKDIpOwotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgKCpvdXRwdXRwKSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAyLCAmIGUsIDEsCi0JICAgICAgIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0KTsKLQotICByZXR1cm4gczsKLX0KLQotc3RhdGljIGNoYXIgKgotcGFyc2VfaW1tIChzLCB2YWwsIG1pbiwgbWF4KQotICAgICBjaGFyICogczsKLSAgICAgdW5zaWduZWQgKiB2YWw7Ci0gICAgIHVuc2lnbmVkIG1pbjsKLSAgICAgdW5zaWduZWQgbWF4OwotewotICBjaGFyICogbmV3OwotICBleHByZXNzaW9uUyBlOwotICAKLSAgbmV3ID0gcGFyc2VfZXhwIChzLCAmIGUpOwotICAKLSAgaWYgKGUuWF9vcCA9PSBPX2Fic2VudCkKLSAgICA7IC8qIEFuIGVycm9yIG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBlbWl0dGVkLiAgKi8KLSAgZWxzZSBpZiAoZS5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYSBjb25zdGFudCIpKTsKLSAgZWxzZSBpZiAoZS5YX2FkZF9udW1iZXIgPCBtaW4gfHwgZS5YX2FkZF9udW1iZXIgPiBtYXgpCi0gICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkLCBub3QgJWQiKSwKLQkgICAgbWluLCBtYXgsIGUuWF9hZGRfbnVtYmVyKTsKLQotICAqIHZhbCA9IGUuWF9hZGRfbnVtYmVyOwotICAKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNoYXIgKgotcGFyc2VfbWVtIChzLCByZWcsIG9mZiwgc2l6KQotICAgICBjaGFyICogczsKLSAgICAgdW5zaWduZWQgKiByZWc7Ci0gICAgIHVuc2lnbmVkICogb2ZmOwotICAgICB1bnNpZ25lZCBzaXo7Ci17Ci0gIGNoYXIgKiBuZXc7Ci0KLSAgKiBvZmYgPSAwOwotICAKLSAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0gICAgKysgczsKLSAgICAgIAotICBpZiAoKiBzID09ICcoJykKLSAgICB7Ci0gICAgICBzID0gcGFyc2VfcmVnIChzICsgMSwgcmVnKTsKLQotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0JKysgczsKLSAgICAgIAotICAgICAgaWYgKCogcyA9PSAnLCcpCi0JewotCSAgcyA9IHBhcnNlX2ltbSAocyArIDEsIG9mZiwgMCwgNjMpOwotCSAgCi0JICBpZiAoc2l6ID4gMSkKLQkgICAgewotCSAgICAgIGlmIChzaXogPiAyKQotCQl7Ci0JCSAgaWYgKCogb2ZmICYgMHgzKQotCQkgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IikpOwotCQkgIAotCQkgICogb2ZmID4+PSAyOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCogb2ZmICYgMHgxKQotCQkgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyIikpOwotCQkgIAotCQkgICogb2ZmID4+PSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIHMpKQotCSsrIHM7Ci0gICAgICAKLSAgICAgIGlmICgqIHMgPT0gJyknKQotCXMgKys7Ci0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkIChfKCJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIikpOwotICAKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBjaGFyICogb3Bfc3RhcnQ7Ci0gIGNoYXIgKiBvcF9lbmQ7Ci0gIG1jb3JlX29wY29kZV9pbmZvICogb3Bjb2RlOwotICBjaGFyICogb3V0cHV0OwotICBpbnQgbmxlbiA9IDA7Ci0gIHVuc2lnbmVkIHNob3J0IGluc3Q7Ci0gIHVuc2lnbmVkIHJlZzsKLSAgdW5zaWduZWQgb2ZmOwotICB1bnNpZ25lZCBpc2l6ZTsKLSAgZXhwcmVzc2lvblMgZTsKLSAgY2hhciBuYW1lWzIwXTsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0gICAgc3RyICsrOwotCi0gIC8qIEZpbmQgdGhlIG9wIGNvZGUgZW5kLiAgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9IHN0cjsKLSAgICAgICAqIG9wX2VuZCAmJiBubGVuIDwgMjAgJiYgIWlzX2VuZF9vZl9saW5lIFsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgICBuYW1lW25sZW5dID0gb3Bfc3RhcnRbbmxlbl07Ci0gICAgICBubGVuKys7Ci0gICAgfQotICAKLSAgbmFtZSBbbmxlbl0gPSAwOwotICAKLSAgaWYgKG5sZW4gPT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgb3Bjb2RlID0gKG1jb3JlX29wY29kZV9pbmZvICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSk7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpbnN0ID0gb3Bjb2RlLT5pbnN0OwotICBpc2l6ZSA9IDI7Ci0gIAotICBzd2l0Y2ggKG9wY29kZS0+b3BjbGFzcykKLSAgICB7Ci0gICAgY2FzZSBPMDoKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1Q6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAwLCAzKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPMToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpNUDoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgLyogSW4gYSBzaWZpbHRlciBtb2RlLCB3ZSBlbWl0IHRoaXMgaW5zbiAyIHRpbWVzLAotICAgICAgICAgZml4ZXMgcHJvYmxlbSBvZiBhbiBpbnRlcnJ1cHQgZHVyaW5nIGEgam1wLi4gKi8KLSAgICAgIGlmIChzaWZpbHRlcl9tb2RlKQotCXsKLQkgIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotCSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBKU1I6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIAotICAgICAgaWYgKHJlZyA9PSAxNSkKLQlhc19iYWQgKF8oImludmFsaWQgcmVnaXN0ZXI6IHIxNSBpbGxlZ2FsIikpOwotICAgICAgCi0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICAKLSAgICAgIGlmIChzaWZpbHRlcl9tb2RlKQotCXsKLQkgIC8qIFJlcGxhY2Ugd2l0aDogIGJzciAuKzIgOyBhZGRpIHIxNSw2OyBqbXAgcnggOyBqbXAgcnggKi8KLQkgIGluc3QgPSBNQ09SRV9JTlNUX0JTUjsJLyogd2l0aCAwIGRpc3BsYWNlbWVudCAqLwotCSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0JICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLQotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQkgIGluc3QgPSBNQ09SRV9JTlNUX0FEREk7Ci0JICBpbnN0IHw9IDE1OwkJCS8qIGFkZGkgcjE1LDYgKi8KLQkgIGluc3QgfD0gKDYgLSAxKSA8PCA0OwkJLyogb3ZlciB0aGUgam1wJ3MgKi8KLQkgIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotCSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0KLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0JICBpbnN0ID0gTUNPUkVfSU5TVF9KTVAgfCByZWc7Ci0JICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLQkgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotCi0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwkJLyogMm5kIGVtaXR0ZWQgaW4gZmFsbHRocnUgKi8KLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0M6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCpvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2NyZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1VTFNIOgotICAgICAgaWYgKGNwdSA9PSBNMjEwKQotCXsKLQkgIGFzX2JhZCAoXygiTTM0MCBzcGVjaWZpYyBvcGNvZGUgdXNlZCB3aGVuIGFzc2VtYmxpbmcgZm9yIE0yMTAiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBkcm9wIHRocm91Z2guLi4gKi8KLSAgICBjYXNlIE8yOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgWDE6CS8qIEhhbmRsZSBib3RoIHN5bnRheC0+IHh0cmItIHIxLHJ4IE9SIHh0cmItIHJ4ICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCS8qIHh0cmItIHIxLHJ4ICovCi0JewotCSAgaWYgKHJlZyAhPSAxKQotCSAgICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIHJlZ2lzdGVyIG11c3QgYmUgcjEiKSk7Ci0JICAKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCX0KLSAgICAgIAotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE8xUjE6ICAvKiBkaXYtIHJ4LHIxICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgIGlmIChyZWcgIT0gMSkKLQkgICAgYXNfYmFkIChfKCJzb3VyY2UgcmVnaXN0ZXIgbXVzdCBiZSByMSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9JOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzIpOwotCSAgaW5zdCB8PSAocmVnIC0gMSkgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9COgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMCwgMzEpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9CMjoJCS8qIGxpa2UgT0IsIGJ1dCBhcmcgaXMgMl5uIGluc3RlYWQgb2YgbiAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMSA8PCAzMSk7Ci0JICAvKiBGdXJ0aGVyIHJlc3RyaWN0IHRoZSBpbW1lZGlhdGUgdG8gYSBwb3dlciBvZiB0d28uICovCi0JICBpZiAoKHJlZyAmIChyZWcgLSAxKSkgPT0gMCkKLQkgICAgcmVnID0gbG9nMiAocmVnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlZyA9IDA7Ci0JICAgICAgYXNfYmFkIChfKCJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIikpOwotCSAgICB9Ci0JICBpbnN0IHw9IChyZWcpIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQlJhOgkvKiBTcGVjaWZpYyBmb3IgYmdlbmk6IGltbSBvZiAwLT42IHRyYW5zbGF0ZSB0byBtb3ZpLiAqLwotICAgIGNhc2UgT0JSYjoKLSAgICBjYXNlIE9CUmM6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAwLCAzMSk7Ci0JICAvKiBpbW1lZGlhdGUgdmFsdWVzIG9mIDAgLT4gNiB0cmFuc2xhdGUgdG8gbW92aSAqLwotCSAgaWYgKHJlZyA8PSA2KQotCSAgICB7Ci0JICAgICAgaW5zdCA9IChpbnN0ICYgMHhGKSB8IE1DT1JFX0lOU1RfQkdFTklfQUxUOwotCSAgICAgIHJlZyA9IDB4MSA8PCByZWc7Ci0JICAgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgYmdlbmkgdG8gbW92aSIpKTsKLQkgICAgfQotCSAgaW5zdCAmPSB+IDB4MDFmMDsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQlIyOgkvKiBsaWtlIE9CUiwgYnV0IGFyZyBpcyAyXm4gaW5zdGVhZCBvZiBuICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAxIDw8IDMxKTsKLQkgIAotCSAgLyogRnVydGhlciByZXN0cmljdCB0aGUgaW1tZWRpYXRlIHRvIGEgcG93ZXIgb2YgdHdvLiAgKi8KLQkgIGlmICgocmVnICYgKHJlZyAtIDEpKSA9PSAwKQotCSAgICByZWcgPSBsb2cyIChyZWcpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVnID0gMDsKLQkgICAgICBhc19iYWQgKF8oImltbWVkaWF0ZSBpcyBub3QgYSBwb3dlciBvZiB0d28iKSk7Ci0JICAgIH0KLQkgIAotCSAgLyogSW1tZWRpYXRlIHZhbHVlcyBvZiAwIC0+IDYgdHJhbnNsYXRlIHRvIG1vdmkuICovCi0JICBpZiAocmVnIDw9IDYpCi0JICAgIHsKLQkgICAgICBpbnN0ID0gKGluc3QgJiAweEYpIHwgTUNPUkVfSU5TVF9CR0VOSV9BTFQ7Ci0JICAgICAgcmVnID0gMHgxIDw8IHJlZzsKLQkgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyBtZ2VuaSB0byBtb3ZpIikpOwotCSAgICB9Ci0JICAKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPTWE6CS8qIFNwZWNpZmljIGZvciBibWFza2k6IGltbSAxLT43IHRyYW5zbGF0ZSB0byBtb3ZpLiAgKi8KLSAgICBjYXNlIE9NYjoKLSAgICBjYXNlIE9NYzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMyKTsKLQkgIAotCSAgLyogSW1tZWRpYXRlIHZhbHVlcyBvZiAxIC0+IDcgdHJhbnNsYXRlIHRvIG1vdmkuICovCi0JICBpZiAocmVnIDw9IDcpCi0JICAgIHsKLQkgICAgICBpbnN0ID0gKGluc3QgJiAweEYpIHwgTUNPUkVfSU5TVF9CTUFTS0lfQUxUOwotCSAgICAgIHJlZyA9ICgweDEgPDwgcmVnKSAtIDE7Ci0JICAgICAgaW5zdCB8PSByZWcgPDwgNDsKLQkgICAgICAKLQkgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyBibWFza2kgdG8gbW92aSIpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5zdCAmPSB+IDB4MDFGMDsKLQkgICAgICBpbnN0IHw9IChyZWcgJiAweDFGKSA8PCA0OwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMxKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJNzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDB4N0YpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIExTOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZyA8PCA4OwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBpbnQgc2l6ZTsKLQkgIAotCSAgaWYgKChpbnN0ICYgMHg2MDAwKSA9PSAwKQotCSAgICBzaXplID0gNDsKLQkgIGVsc2UgaWYgKChpbnN0ICYgMHg2MDAwKSA9PSAweDQwMDApCi0JICAgIHNpemUgPSAyOwotCSAgZWxzZSBpZiAoKGluc3QgJiAweDYwMDApID09IDB4MjAwMCkKLQkgICAgc2l6ZSA9IDE7Ci0JICAKLQkgIG9wX2VuZCA9IHBhcnNlX21lbSAob3BfZW5kICsgMSwgJiByZWcsICYgb2ZmLCBzaXplKTsKLQkgIAotCSAgaWYgKG9mZiA+IDE2KQotCSAgICBhc19iYWQgKF8oImRpc3BsYWNlbWVudCB0b28gbGFyZ2UgKCVkKSIpLCBvZmYpOwotCSAgZWxzZQotCSAgICBpbnN0IHw9IChyZWcpIHwgKG9mZiA8PCA0KTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIExSOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgPT0gMCB8fCByZWcgPT0gMTUpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyOiByMCBhbmQgcjE1IGlsbGVnYWwiKSk7Ci0gICAgICAKLSAgICAgIGluc3QgfD0gKHJlZyA8PCA4KTsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgLyogcGFyc2VfcnQgY2FsbHMgZnJhZ19tb3JlKCkgZm9yIHVzLiAgKi8KLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX3J0IChvcF9lbmQgKyAxLCAmIG91dHB1dCwgMCwgMCk7Ci0gICAgICAgICAgb3BfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwkJLyogc2F2ZSBpdHMgc3BhY2UgKi8KLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTEo6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9ydCAob3BfZW5kICsgMSwgJiBvdXRwdXQsIDEsIDApOwotICAgICAgLyogcGFyc2VfcnQoKSBjYWxscyBmcmFnX21vcmUoKSBmb3IgdXMuICAqLwotICAgICAgb3BfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJNOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgPT0gMCB8fCByZWcgPT0gMTUpCi0JYXNfYmFkIChfKCJiYWQgc3RhcnRpbmcgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaW52YWxpZCIpKTsKLSAgICAgIAotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJy0nKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgCi0JICBpZiAocmVnICE9IDE1KQotCSAgICBhc19iYWQgKF8oImVuZGluZyByZWdpc3RlciBtdXN0IGJlIHIxNSIpKTsKLQkgIAotCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JICAgICsrIG9wX2VuZDsKLQl9Ci0gICAgICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kICsrOwotCSAgCi0JICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkgICAgKysgb3BfZW5kOwotICAKLQkgIGlmICgqIG9wX2VuZCA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgICAgICAKLQkgICAgICBpZiAocmVnICE9IDApCi0JCWFzX2JhZCAoXygiYmFkIGJhc2UgcmVnaXN0ZXI6IG11c3QgYmUgcjAiKSk7Ci0JICAgICAgCi0JICAgICAgaWYgKCogb3BfZW5kID09ICcpJykKLQkJb3BfZW5kICsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiYmFzZSByZWdpc3RlciBleHBlY3RlZCIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJROgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICAKLSAgICAgIGlmIChyZWcgIT0gNCkKLQlhc19mYXRhbCAoXygiZmlyc3QgcmVnaXN0ZXIgbXVzdCBiZSByNCIpKTsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLScpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICAKLQkgIGlmIChyZWcgIT0gNykKLQkgICAgYXNfZmF0YWwgKF8oImxhc3QgcmVnaXN0ZXIgbXVzdCBiZSByNyIpKTsKLQkgIAotCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JICAgICsrIG9wX2VuZDsKLSAgCi0JICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCSAgICB7Ci0JICAgICAgb3BfZW5kICsrOwotCSAgICAgIAotCSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkJKysgb3BfZW5kOwotICAKLQkgICAgICBpZiAoKiBvcF9lbmQgPT0gJygnKQotCQl7Ci0JCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JCSAgCi0JCSAgaWYgKHJlZyA+PSA0ICYmIHJlZyA8PSA3KQotCQkgICAgYXNfZmF0YWwgKCJiYXNlIHJlZ2lzdGVyIGNhbm5vdCBiZSByNCwgcjUsIHI2LCBvciByNyIpOwotCQkgIAotCQkgIGluc3QgfD0gcmVnOwotCQkgIAotCQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkJICAgICsrIG9wX2VuZDsKLQkJICAKLQkJICBpZiAoKiBvcF9lbmQgPT0gJyknKQotCQkgICAgb3BfZW5kICsrOwotCQl9Ci0JICAgICAgZWxzZQotCQlhc19iYWQgKF8oImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInJlZy1yZWcgZXhwZWN0ZWQiKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQlI6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0gICAgICBvcF9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICAKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgb3V0cHV0LWZyYWdfbm93LT5mcl9saXRlcmFsLCAKLQkJICAgMiwgJiBlLCAxLCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJMOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZyA8PCA0OwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCSAgCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIG91dHB1dC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgCi0JCSAgICAgICAyLCAmIGUsIDEsIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSkM6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0gICAgICBvcF9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQzMildLnJseF9sZW5ndGgsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMTIpXS5ybHhfbGVuZ3RoLAotCQkJIEMgKENPTkRfSlVNUCwgMCksIGUuWF9hZGRfc3ltYm9sLCBlLlhfYWRkX251bWJlciwgMCk7Ci0gICAgICBpc2l6ZSA9IEMzMl9MRU47Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSlU6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9leHAgKG9wX2VuZCArIDEsICYgZSk7Ci0gICAgICBvcF9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QzMildLnJseF9sZW5ndGgsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMTIpXS5ybHhfbGVuZ3RoLAotCQkJIEMgKFVOQ0RfSlVNUCwgMCksIGUuWF9hZGRfc3ltYm9sLCBlLlhfYWRkX251bWJlciwgMCk7Ci0gICAgICBpc2l6ZSA9IFUzMl9MRU47Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSkw6Ci0gICAgICBpbnN0ID0gTUNPUkVfSU5TVF9KU1JJOwkJLyoganNyaSAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfcnQgKG9wX2VuZCArIDEsICYgb3V0cHV0LCAxLCAmIGUpOwotICAgICAgLyogcGFyc2VfcnQoKSBjYWxscyBmcmFnX21vcmUgZm9yIHVzLiAgKi8KLSAgICAgIG9wX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIAotICAgICAgLyogT25seSBkbyB0aGlzIGlmIHdlIGtub3cgaG93IHRvIGRvIGl0IC4uLiAqLwotICAgICAgaWYgKGUuWF9vcCAhPSBPX2Fic2VudCAmJiBkb19qc3JpMmJzcikKLQl7Ci0JICAvKiBMb29rIGF0IGFkZGluZyB0aGUgUl9QQ1JFTF9KU1JJTU0xMUJZMi4gICovCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIG91dHB1dC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgCi0JCSAgICAgICAyLCAmIGUsIDEsIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSU0k6CQkJCS8qIFNJLCBidXQgaW1tIGJlY29tZXMgMzItaW1tICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7Ci0JICAKLQkgIHJlZyA9IDMyIC0gcmVnOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIERPMjE6CQkJLyogTzIsIGR1cCByZCwgbGl0IG11c3QgYmUgMSAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIGluc3QgfD0gcmVnIDw8IDQ7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMxKTsKLQkgIAotCSAgaWYgKHJlZyAhPSAxKQotCSAgICBhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG11c3QgYmUgMSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNJYToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMxKTsKLQotCSAgaWYgKHJlZyA9PSAwKQotCSAgICBhc19iYWQgKF8oInplcm8gdXNlZCBhcyBpbW1lZGlhdGUgdmFsdWUiKSk7Ci0JICAKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFNSOgotICAgICAgaWYgKGNwdSA9PSBNMjEwKQotCXsKLQkgIGFzX2JhZCAoXygiTTM0MCBzcGVjaWZpYyBvcGNvZGUgdXNlZCB3aGVuIGFzc2VtYmxpbmcgZm9yIE0yMTAiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICAKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3Bzcm1vZCAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICAvKiBMb29rIGZvciBmdXJ0aGVyIHNlbGVjdG9ycy4gICovCi0gICAgICB3aGlsZSAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIHVuc2lnbmVkIHZhbHVlOwotCSAgICAKLQkgIG9wX2VuZCA9IHBhcnNlX3Bzcm1vZCAob3BfZW5kICsgMSwgJiB2YWx1ZSk7Ci0JICAKLQkgIGlmICh2YWx1ZSAmIHJlZykKLQkgICAgYXNfYmFkIChfKCJkdXBsaWNhdGVkIHBzciBiaXQgc3BlY2lmaWVyIikpOwotCSAgCi0JICByZWcgfD0gdmFsdWU7Ci0JfQotICAgICAgCi0gICAgICBpZiAocmVnID4gOCkKLQlhc19iYWQgKF8oImBhZicgbXVzdCBhcHBlYXIgYWxvbmUiKSk7Ci0JCi0gICAgICBpbnN0IHw9IChyZWcgJiAweDcpOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotIAotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oInVuaW1wbGVtZW50ZWQgb3Bjb2RlIFwiJXNcIiIpLCBuYW1lKTsKLSAgICB9Ci0KLSAgLyogRHJvcCB3aGl0ZXNwYWNlIGFmdGVyIGFsbCB0aGUgb3BlcmFuZHMgaGF2ZSBiZWVuIHBhcnNlZC4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0gICAgb3BfZW5kICsrOwotCi0gIC8qIEdpdmUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBpbnNuIGhhcyBtb3JlIG9wZXJhbmRzIHRoYW4gcmVxdWlyZWQuICovCi0gIGlmIChzdHJjbXAgKG9wX2VuZCwgb3Bjb2RlLT5uYW1lKSAmJiBzdHJjbXAgKG9wX2VuZCwgIiIpKQotICAgIGFzX3dhcm4gKF8oImlnbm9yaW5nIG9wZXJhbmRzOiAlcyAiKSwgb3BfZW5kKTsKLSAgCi0gIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLSAgCi0gIGNoZWNrX2xpdGVyYWxzIChvcGNvZGUtPnRyYW5zZmVyLCBpc2l6ZSk7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgICBjaGFyICogbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX21jb3JlX2VuZCAoKQotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLX0KLQotLyogVmFyaW91cyByb3V0aW5lcyB0byBraWxsIG9uZSBkYXkuICAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqIGxpdFA7Ci0gICAgIGludCAqIHNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBpbnQgICAgaTsKLSAgY2hhciAqIHQ7Ci0gIGNoYXIgKiBhdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9OVE9GKCkiKTsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgCi0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAKLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCi0JCQkgICAgICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotICAgICAgewotCW1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCi0JCQkgICAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCWxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgICB9Ci0gIAotICByZXR1cm4gMDsKLX0KLQwKLUNPTlNUIGNoYXIgKiBtZF9zaG9ydG9wdHMgPSAiIjsKLQotI2RlZmluZSBPUFRJT05fSlNSSTJCU1JfT04JKE9QVElPTl9NRF9CQVNFICsgMCkKLSNkZWZpbmUgT1BUSU9OX0pTUkkyQlNSX09GRgkoT1BUSU9OX01EX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fU0lGSUxURVJfT04JKE9QVElPTl9NRF9CQVNFICsgMikKLSNkZWZpbmUgT1BUSU9OX1NJRklMVEVSX09GRgkoT1BUSU9OX01EX0JBU0UgKyAzKQotI2RlZmluZSBPUFRJT05fQ1BVCQkoT1BUSU9OX01EX0JBU0UgKyA0KQotI2RlZmluZSBPUFRJT05fRUIJCShPUFRJT05fTURfQkFTRSArIDUpCi0jZGVmaW5lIE9QVElPTl9FTAkJKE9QVElPTl9NRF9CQVNFICsgNikKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSAgeyAibm8tanNyaTJic3IiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0pTUkkyQlNSX09GRn0sCi0gIHsgImpzcmkyYnNyIiwgICAgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9KU1JJMkJTUl9PTn0sCi0gIHsgInNpZmlsdGVyIiwgICAgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSUZJTFRFUl9PTn0sCi0gIHsgIm5vLXNpZmlsdGVyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSUZJTFRFUl9PRkZ9LAotICB7ICJjcHUiLCAgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ1BVfSwKLSAgeyAiRUIiLCAgICAgICAgICBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSAgeyAiRUwiLCAgICAgICAgICBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSAgeyBOVUxMLCAgICAgICAgICBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICogYXJnOwotewotICBpbnQgaTsKLSAgY2hhciAqIHA7Ci0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9DUFU6Ci0gICAgICBpZiAoc3RyZXEgKGFyZywgIjIxMCIpKQotCXsKLQkgIGNwdSA9IE0yMTA7Ci0JICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyZXEgKGFyZywgIjM0MCIpKQotCWNwdSA9IE0zNDA7Ci0gICAgICBlbHNlCi0gICAgICAgIGFzX3dhcm4gKF8oInVucmVjb2duaXNlZCBjcHUgdHlwZSAnJXMnIiksIGFyZyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BUSU9OX0VCOiB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7IGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0VMOiB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7IGNwdSA9IE0zNDA7IGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0pTUkkyQlNSX09OOiAgZG9fanNyaTJic3IgPSAxOyAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0pTUkkyQlNSX09GRjogZG9fanNyaTJic3IgPSAwOyAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NJRklMVEVSX09OOiAgc2lmaWx0ZXJfbW9kZSA9IDE7IGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NJRklMVEVSX09GRjogc2lmaWx0ZXJfbW9kZSA9IDA7IGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKiBzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotTUNPUkUgc3BlY2lmaWMgb3B0aW9uczpcblwKLSAgLXtuby19anNyaTJic3IJICB7ZGlzfWFibGUganNyaSB0byBic3IgdHJhbnNmb3JtYXRpb24gKGRlZjogZGlzKVxuXAotICAte25vLX1zaWZpbHRlcgkgIHtkaXN9YWJsZSBzaWxpY29uIGZpbHRlciBiZWhhdmlvciAoZGVmOiBkaXMpXG5cCi0gIC1jcHU9WzIxMHwzNDBdICAgICAgICAgIHNlbGVjdCBDUFUgdHlwZVxuXAotICAtRUIgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSAoZGVmYXVsdClcblwKLSAgLUVMICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW1cbiIpKTsKLX0KLQwKLWludCBtZF9zaG9ydF9qdW1wX3NpemU7Ci0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fTmRkciwgdG9fTmRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICogcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX05kZHI7Ci0gICAgIGFkZHJlc3NUIHRvX05kZHI7Ci0gICAgIGZyYWdTICogZnJhZzsKLSAgICAgc3ltYm9sUyAqIHRvX3N5bWJvbDsKLXsKLSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2s6IHNob3J0X2p1bXAiKSk7Ci19Ci0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9OZGRyLCB0b19OZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKiBwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fTmRkcjsKLSAgICAgYWRkcmVzc1QgdG9fTmRkcjsKLSAgICAgZnJhZ1MgKiBmcmFnOwotICAgICBzeW1ib2xTICogdG9fc3ltYm9sOwotewotICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjazogbG9uZ19qdW1wIikpOwotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgcmVsYXhpbmcsIGNoYW5nZSB0aGUgZnJhZ3Mgc28gdGhleSBrbm93IGhvdyBiaWcgdGhleSBhcmUuICAqLwotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWdUIHNlYzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKiBmcmFnUDsKLXsKLSAgdW5zaWduZWQgY2hhciAqIGJ1ZmZlcjsKLSAgaW50IHRhcmdfYWRkciA9IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArIGZyYWdQLT5mcl9vZmZzZXQ7Ci0gIAotICBidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKLSAgdGFyZ19hZGRyICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBDIChDT05EX0pVTVAsIENPTkQxMik6Ci0gICAgY2FzZSBDIChVTkNEX0pVTVAsIFVOQ0QxMik6Ci0gICAgICB7Ci0JLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQlpbnQgbmV4dF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzICsgMjsKLQl1bnNpZ25lZCBjaGFyIHQwOwotCWludCBkaXNwID0gdGFyZ19hZGRyIC0gbmV4dF9pbnN0OwotCQotCWlmIChkaXNwICYgMSkKLQkgIGFzX2JhZCAoXygib2RkIGRpc3BsYWNlbWVudCBhdCAleCIpLCBuZXh0X2luc3QgLSAyKTsKLQkKLQlkaXNwID4+PSAxOwotCQotCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCSAgewotCSAgICB0MCA9IGJ1ZmZlclsxXSAmIDB4Rjg7Ci0JCi0JICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyLCBkaXNwLCAyKTsKLQkKLQkgICAgYnVmZmVyWzFdID0gKGJ1ZmZlclsxXSAmIDB4MDcpIHwgdDA7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICB0MCA9IGJ1ZmZlclswXSAmIDB4Rjg7Ci0JCi0JICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyLCBkaXNwLCAyKTsKLQkKLQkgICAgYnVmZmVyWzBdID0gKGJ1ZmZlclswXSAmIDB4MDcpIHwgdDA7Ci0JICB9Ci0JCi0JZnJhZ1AtPmZyX2ZpeCArPSAyOwotCWZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDMyKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIHsKLQkvKiBBIGNvbmRpdGlvbmFsIGJyYW5jaCB3b250IGZpdCBpbnRvIDEyIGJpdHMgc286Ci0JICoJYiFjb25kCTFmCi0JICoJam1waQkwZgotCSAqCS5hbGlnbiAyCi0JICogMDoJLmxvbmcgZGlzcAotCSAqIDE6Ci0JICoKLQkgKiBpZiB0aGUgYiFjb25kIGlzIDQgYnl0ZSBhbGlnbmVkLCB0aGUgbGl0ZXJhbCB3aGljaCB3b3VsZAotCSAqIGdvIGF0IHgrNCB3aWxsIGFsc28gYmUgYWxpZ25lZC4KLQkgKi8KLQlpbnQgZmlyc3RfaW5zdCA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzczsKLQlpbnQgbmVlZHBhZCA9IChmaXJzdF9pbnN0ICYgMyk7Ci0KLQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkgIGJ1ZmZlclsxXSBePSAweDA4OwotCWVsc2UKLQkgIGJ1ZmZlclswXSBePSAweDA4OwkvKiBUb2dnbGUgVC9GIGJpdCAqLwotCi0JYnVmZmVyWzJdID0gSU5TVF9CWVRFMCAoTUNPUkVfSU5TVF9KTVBJKTsJLyogQnVpbGQgam1waSAqLwotCWJ1ZmZlclszXSA9IElOU1RfQllURTEgKE1DT1JFX0lOU1RfSk1QSSk7Ci0gCi0JaWYgKG5lZWRwYWQpCi0JICB7Ci0JICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCSAgICAgIHsKLQkJYnVmZmVyWzBdID0gNDsJLyogYnJhbmNoIG92ZXIgam1waSwgcGFkLCBhbmQgcHRyICovCi0JCWJ1ZmZlclsyXSA9IDE7CS8qIGptcGkgb2Zmc2V0IG9mIDEgZ2V0cyB0aGUgcG9pbnRlciAqLwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYnVmZmVyWzFdID0gNDsJLyogYnJhbmNoIG92ZXIgam1waSwgcGFkLCBhbmQgcHRyICovCi0JCWJ1ZmZlclszXSA9IDE7CS8qIGptcGkgb2Zmc2V0IG9mIDEgZ2V0cyB0aGUgcG9pbnRlciAqLwotCSAgICAgIH0KLQkgICAgCi0JICAgIGJ1ZmZlcls0XSA9IDA7CS8qIGFsaWdubWVudC9wYWQgKi8KLQkgICAgYnVmZmVyWzVdID0gMDsKLQkgICAgYnVmZmVyWzZdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCi0JICAgIGJ1ZmZlcls3XSA9IDA7Ci0JICAgIGJ1ZmZlcls4XSA9IDA7Ci0JICAgIGJ1ZmZlcls5XSA9IDA7Ci0JICAgIAotCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNiwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICAKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBDMzJfTEVOOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogU2VlIGNvbW1lbnQgYmVsb3cgYWJvdXQgdGhpcyBnaXZlbiBnYXMnIGxpbWl0YXRpb25zIGZvcgotCSAgICAgICBzaHJpbmtpbmcgdGhlIGZyYWdtZW50LiAnMycgaXMgdGhlIGFtb3VudCBvZiBjb2RlIHRoYXQKLQkgICAgICAgd2UgaW5zZXJ0ZWQgaGVyZSwgYnV0ICc0JyBpcyByaWdodCBmb3IgdGhlIHNwYWNlIHdlIHJlc2VydmVkCi0JICAgICAgIGZvciB0aGlzIGZyYWdtZW50LiAqLwotCSAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkgICAgICB7Ci0JCWJ1ZmZlclswXSA9IDM7CS8qIGJyYW5jaCBvdmVyIGptcGksIGFuZCBwdHIgKi8KLQkJYnVmZmVyWzJdID0gMDsJLyogam1waSBvZmZzZXQgb2YgMCBnZXRzIHRoZSBwb2ludGVyICovCi0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlidWZmZXJbMV0gPSAzOwkvKiBicmFuY2ggb3ZlciBqbXBpLCBhbmQgcHRyICovCi0JCWJ1ZmZlclszXSA9IDA7CS8qIGptcGkgb2Zmc2V0IG9mIDAgZ2V0cyB0aGUgcG9pbnRlciAqLwotCSAgICAgIH0KLQkgICAgCi0JICAgIGJ1ZmZlcls0XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLwotCSAgICBidWZmZXJbNV0gPSAwOwotCSAgICBidWZmZXJbNl0gPSAwOwotCSAgICBidWZmZXJbN10gPSAwOwotCSAgICAKLQkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcC4gICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IEMzMl9MRU47Ci0KLQkgICAgLyogRnJhZyBpcyBhY3R1YWxseSBzaG9ydGVyIChzZWUgdGhlIG90aGVyIHNpZGUgb2YgdGhpcyBpZmRlZikKLQkgICAgICAgYnV0IGdhcyBpc24ndCBwcmVwYXJlZCBmb3IgdGhhdC4gIFdlIGhhdmUgdG8gcmUtYWRqdXN0Ci0JICAgICAgIHRoZSBicmFuY2ggZGlzcGxhY2VtZW50IHNvIHRoYXQgaXQgZ29lcyBiZXlvbmQgdGhlIAotCSAgICAgICBmdWxsIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnQsIG5vdCBqdXN0IHdoYXQgd2UgYWN0dWFsbHkKLQkgICAgICAgZmlsbGVkIGluLiAgKi8KLQkgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgICAgYnVmZmVyWzBdID0gNDsJLyogam1waSwgcHRyLCBhbmQgdGhlICd0YWlsIHBhZCcgKi8KLQkgICAgZWxzZQotCSAgICAgIGJ1ZmZlclsxXSA9IDQ7CS8qIGptcGksIHB0ciwgYW5kIHRoZSAndGFpbCBwYWQnICovCi0JICB9Ci0JCi0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkNEMzIpOgotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgewotCS8qIEFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHdpbGwgbm90IGZpdCBpbiAxMiBiaXRzLCBtYWtlIGNvZGUgd2hpY2gKLQkgICBsb29rcyBsaWtlOgotCSAgCWptcGkJMGYKLQkgIAkuYWxpZ24gMgotCSAgICAgMDoJLmxvbmcgZGlzcAotCSAgIHdlIG5lZWQgYSBwYWQgaWYgImZpcnN0X2luc3QiIGlzIDQgYnl0ZSBhbGlnbmVkLgotCSAgIFtiZWNhdXNlIHRoZSBuYXR1cmFsIGxpdGVyYWwgcGxhY2UgaXMgeCArIDJdICAqLwotCWludCBmaXJzdF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOwotCWludCBuZWVkcGFkID0gIShmaXJzdF9pbnN0ICYgMyk7Ci0KLQlidWZmZXJbMF0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0pNUEkpOwkvKiBCdWlsZCBqbXBpICovCi0JYnVmZmVyWzFdID0gSU5TVF9CWVRFMSAoTUNPUkVfSU5TVF9KTVBJKTsKLQotCWlmIChuZWVkcGFkKQotCSAgewotCSAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkgICAgICBidWZmZXJbMF0gPSAxOwkvKiBqbXBpIG9mZnNldCBvZiAxIHNpbmNlIHBhZGRlZCAqLwotCSAgICBlbHNlCi0JICAgICAgYnVmZmVyWzFdID0gMTsJLyogam1waSBvZmZzZXQgb2YgMSBzaW5jZSBwYWRkZWQgKi8KLQkgICAgYnVmZmVyWzJdID0gMDsJLyogYWxpZ25tZW50ICovCi0JICAgIGJ1ZmZlclszXSA9IDA7Ci0JICAgIGJ1ZmZlcls0XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLwotCSAgICBidWZmZXJbNV0gPSAwOwotCSAgICBidWZmZXJbNl0gPSAwOwotCSAgICBidWZmZXJbN10gPSAwOwotCSAgICAKLQkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcC4gICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICAKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBVMzJfTEVOOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgICAgYnVmZmVyWzBdID0gMDsJLyogam1waSBvZmZzZXQgb2YgMCBpZiBubyBwYWQgKi8KLQkgICAgZWxzZQotCSAgICAgIGJ1ZmZlclsxXSA9IDA7CS8qIGptcGkgb2Zmc2V0IG9mIDAgaWYgbm8gcGFkICovCi0JICAgIGJ1ZmZlclsyXSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLwotCSAgICBidWZmZXJbM10gPSAwOwotCSAgICBidWZmZXJbNF0gPSAwOwotCSAgICBidWZmZXJbNV0gPSAwOwotCSAgICAKLQkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcC4gICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IFUzMl9MRU47Ci0JICB9Ci0KLQlmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogQXBwbGllcyB0aGUgZGVzaXJlZCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotICAgQWxzbyBzZXRzIHVwIGFkZGVuZHMgZm9yICdyZWxhJyB0eXBlIHJlbG9jYXRpb25zLiAgKi8KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFscCwgc2VnbWVudCkKLSAgICAgZml4UyAqICAgZml4UDsKLSAgICAgdmFsdWVUICogdmFscDsKLSAgICAgc2VnVCAgICAgc2VnbWVudDsKLXsKLSAgY2hhciAqICAgICAgIGJ1ZiAgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGNoYXIgKiAgICAgICBmaWxlID0gZml4UC0+ZnhfZmlsZSA/IGZpeFAtPmZ4X2ZpbGUgOiBfKCJ1bmtub3duIik7Ci0gIGNvbnN0IGNoYXIgKiBzeW1uYW1lOwotICAvKiBOb3RlOiB1c2Ugb2Zmc2V0VCBiZWNhdXNlIGl0IGlzIHNpZ25lZCwgdmFsdWVUIGlzIHVuc2lnbmVkLiAgKi8KLSAgb2Zmc2V0VCAgICAgIHZhbCAgPSAob2Zmc2V0VCkgKiB2YWxwOyAKLSAgCi0gIHN5bW5hbWUgPSBmaXhQLT5meF9hZGRzeSA/IFNfR0VUX05BTUUgKGZpeFAtPmZ4X2FkZHN5KSA6IF8oIjx1bmtub3duPiIpOwotICAvKiBTYXZlIHRoaXMgZm9yIHRoZSBhZGRlbmQgaW4gdGhlIHJlbG9jYXRpb24gcmVjb3JkLiAgKi8KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwotCi0gIC8qIElmIHRoZSBmaXggaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQsIG9yIG5vdAotICAgICBpbiB0aGUgc2FtZSBzZWdtZW50IGFzIHRoZSBmaXgsIHdlIGNhbm5vdCByZXNvbHZlIGl0IGhlcmUuICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgKCAgICEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnbWVudCkpKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIEZvciBFTEYgd2UgY2FuIGp1c3QgcmV0dXJuIGFuZCBsZXQgdGhlIHJlbG9jIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQKLQkgdGFrZSBjYXJlIG9mIGV2ZXJ5dGhpbmcuICBGb3IgQ09GRiB3ZSBzdGlsbCBoYXZlIHRvIGluc2VydCAndmFsJwotCSBpbnRvIHRoZSBpbnNuIHNpbmNlIHRoZSBhZGRlbmQgZmllbGQgd2lsbCBiZSBpZ25vcmVkLiAgKi8KLSAgICAgIHJldHVybiAwOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0gIAotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTI6ICAgICAvKiBzZWNvbmQgYnl0ZSBvZiAyIGJ5dGUgb3Bjb2RlICovCi0gICAgICBpZiAoKHZhbCAmIDEpICE9IDApCi0JYXNfYmFkX3doZXJlIChmaWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJvZGQgZGlzdGFuY2UgYnJhbmNoICgweCV4IGJ5dGVzKSIpLCB2YWwpOwotICAgICAgdmFsIC89IDI7Ci0gICAgICBpZiAoKCh2YWwgJiB+MHgzZmYpICE9IDApICYmICgodmFsIHwgMHgzZmYpICE9IC0xKSkKLQlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oInBjcmVsIGZvciBicmFuY2ggdG8gJXMgdG9vIGZhciAoMHgleCkiKSwKLQkJICAgICAgc3ltbmFtZSwgdmFsKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQl7Ci0JICBidWZbMF0gfD0gKCh2YWwgPj4gOCkgJiAweDcpOwotCSAgYnVmWzFdIHw9ICh2YWwgJiAweGZmKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdIHw9ICgodmFsID4+IDgpICYgMHg3KTsKLQkgIGJ1ZlsxXSB8PSAodmFsICYgMHhmZik7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0OgkvKiBsb3dlciA4IGJpdHMgb2YgMiBieXRlIG9wY29kZSAqLwotICAgICAgdmFsICs9IDM7Ci0gICAgICB2YWwgLz0gNDsKLSAgICAgIGlmICh2YWwgJiB+MHhmZikKLQlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oInBjcmVsIGZvciBscncvam1waS9qc3JpIHRvICVzIHRvbyBmYXIgKDB4JXgpIiksCi0JCSAgICAgIHN5bW5hbWUsIHZhbCk7Ci0gICAgICBlbHNlIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWJ1ZlswXSB8PSAodmFsICYgMHhmZik7Ci0gICAgICBlbHNlCi0JYnVmWzFdIHw9ICh2YWwgJiAweGZmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMjoJLyogbG9vcHQgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlmICgodmFsIDwgLTMyKSB8fCAodmFsID4gLTIpKQotCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygicGNyZWwgZm9yIGxvb3B0IHRvbyBmYXIgKDB4JXgpIiksIHZhbCk7Ci0gICAgICB2YWwgLz0gMjsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWJ1ZlswXSB8PSAodmFsICYgMHhmKTsKLSAgICAgIGVsc2UKLQlidWZbMV0gfD0gKHZhbCAmIDB4Zik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjoKLSAgICAgIC8qIENvbmRpdGlvbmFsIGxpbmtlciBtYXAganNyaSB0byBic3IuICAqLwotICAgICAgLyogSWYgaXRzIGEgbG9jYWwgdGFyZ2V0IGFuZCBjbG9zZSBlbm91Z2gsIGZpeCBpdC4gCi0gICAgICAgICBOQjogPj0gLTJrIGZvciBiYWNrd2FyZHMgYnNyOyA8IDJrIGZvciBmb3J3YXJkcy4uLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwICYmIHZhbCA+PSAtMjA0OCAgJiYgdmFsIDwgMjA0OCkKLQl7Ci0JICBsb25nIG52YWwgPSAodmFsIC8gMikgJiAweDdmZjsKLQkgIG52YWwgfD0gTUNPUkVfSU5TVF9CU1I7Ci0JICAKLQkgIC8qIFJFUExBQ0UgdGhlIGluc3RydWN0aW9uLCBkb24ndCBqdXN0IG1vZGlmeSBpdC4gICovCi0JICBidWZbMF0gPSBJTlNUX0JZVEUwIChudmFsKTsKLQkgIGJ1ZlsxXSA9IElOU1RfQllURTEgKG52YWwpOwotCX0KLSAgICAgIGVsc2UKLQlmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQl7Ci0JICAvKiBJZiB0aGUgZml4IGlzIGFuIGFic29sdXRlIHJlbG9jIGJhc2VkIG9uIGEgc3ltYm9sJ3MKLQkgICAgIGFkZHJlc3MsIHRoZW4gaXQgY2Fubm90IGJlIHJlc29sdmVkIHVudGlsIHRoZSBmaW5hbCBsaW5rLiAgKi8KLQkgIGZpeFAtPmZ4X2RvbmUgPSAwOwotCX0KLSNpZmRlZiBPQkpfRUxGICAgICAgCi0gICAgICBlbHNlCi0jZW5kaWYKLQl7Ci0JICBpZiAoZml4UC0+Znhfc2l6ZSA9PSA0KQotCSAgICA7Ci0JICBlbHNlIGlmIChmaXhQLT5meF9zaXplID09IDIgJiYgdmFsID49IC0zMjc2OCAmJiB2YWwgPD0gMzI3NjcpCi0JICAgIDsKLQkgIGVsc2UgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSAmJiB2YWwgPj0gLTI1NiAmJiB2YWwgPD0gMjU1KQotCSAgICA7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAwOyAvKiBSZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4gICovCi19Ci0KLXZvaWQKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICAvKiBJZ25vcmUgbGVhZGluZyBoYXNoIHN5bWJvbCwgaWYgcG9yZXNlbnQuICAqLwotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICB9Ci19Ci0KLWludCBtZF9sb25nX2p1bXBfc2l6ZTsKLQotLyogQ2FsbGVkIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbiwgcmV0dXJuIHRoZSBsZW5ndGgKLSAgIGJ5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvIHJlYWNoIGl0J3MgZGVzdGluYXRpb24uICAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKiBmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkRFRl9ESVNQKToKLSAgICAgIC8qIFVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duLiAgKi8KLSAgICAgIGlmICghZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ0RfSlVNUCwgVU5DRDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DRF9KVU1QLCBVTkNEMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNEX0pVTVAsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMzIpXS5ybHhfbGVuZ3RoOwotCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIAotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9ESVNQKToKLSAgICAgIC8qIFVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duLiAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCi0JICAgICBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKENPTkRfSlVNUCwgQ09ORDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZy4gICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKENPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQzMildLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMzIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBrbm93IHRoZSBhYnMgdmFsdWUuICAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChDT05EX0pVTVAsIENPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMTIpXS5ybHhfbGVuZ3RoOwotCX0KLQotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgcmV0dXJuIGZyYWdQLT5mcl92YXI7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlci4gICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKiBwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHN3aXRjaCAobmJ5dGVzKQotICAgICAgewotICAgICAgY2FzZSA0OiBwdHJbM10gPSAodXNlID4+IDI0KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzOiBwdHJbMl0gPSAodXNlID4+IDE2KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyOiBwdHJbMV0gPSAodXNlID4+ICA4KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxOiBwdHJbMF0gPSAodXNlID4+ICAwKSAmIDB4ZmY7ICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgICB9Ci0gIGVsc2UKLSAgICBzd2l0Y2ggKG5ieXRlcykKLSAgICAgIHsKLSAgICAgIGNhc2UgNDogKnB0cisrID0gKHVzZSA+PiAyNCkgJiAweGZmOyAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMzogKnB0cisrID0gKHVzZSA+PiAxNikgJiAweGZmOyAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMjogKnB0cisrID0gKHVzZSA+PiAgOCkgJiAweGZmOyAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgMTogKnB0cisrID0gKHVzZSA+PiAgMCkgJiAweGZmOyAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgICAgfQotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gc2l6ZTsJCQkvKiBCeXRlIGFsaWdubWVudCBpcyBmaW5lICovCi19Ci0KLQotLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAotICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4gICovCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqIGZpeHA7Ci0gICAgIHNlZ1Qgc2VjOwotewotI2lmZGVmIE9CSl9FTEYKLSAgLyogSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgb3IgZGVmaW5lZCBpbiBhbm90aGVyIHNlY3Rpb24KLSAgICAgd2UgbGVhdmUgdGhlIGFkZCBudW1iZXIgYWxvbmUgZm9yIHRoZSBsaW5rZXIgdG8gZml4IGl0IGxhdGVyLgotICAgICBPbmx5IGFjY291bnQgZm9yIHRoZSBQQyBwcmUtYnVtcCAod2hpY2ggaXMgMiBieXRlcyBvbiB0aGUgTUNvcmUpLiAqLwotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKLQkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjKSkpCi0gICAgICAKLSAgewotICAgIGFzc2VydCAoZml4cC0+Znhfc2l6ZSA9PSAyKTsJLyogbXVzdCBiZSBhbiBpbnNuICovCi0gICAgcmV0dXJuIGZpeHAtPmZ4X3NpemU7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIFRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnb2luZyB0byByZXNvbHZlIHRoaW5ncy4uLiAqLwotICByZXR1cm4gIGZpeHAtPmZ4X3NpemUgKyBmaXhwLT5meF93aGVyZSArIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLSNkZWZpbmUgRihTWixQQ1JFTCkJCSgoKFNaKSA8PCAxKSArIChQQ1JFTCkpCi0jZGVmaW5lIE1BUChTWixQQ1JFTCxUWVBFKQljYXNlIEYgKFNaLCBQQ1JFTCk6IGNvZGUgPSAoVFlQRSk7IGJyZWFrCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIGZpeFMgKiBmaXhwOwotewotICBhcmVsZW50ICogcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLSAgaW50IGhhbmRsZWQgPSAwOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICAgIC8qIFRoZXNlIGNvbmZ1c2UgdGhlIHNpemUvcGNyZWwgbWFjcm8gYXBwcm9hY2guICovCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNDoKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOiAgICAgIAotICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBzd2l0Y2ggKEYgKGZpeHAtPmZ4X3NpemUsIGZpeHAtPmZ4X3BjcmVsKSkKLSAgICAgICAgewotICAgICAgICAgIE1BUCAoMSwgMCwgQkZEX1JFTE9DXzgpOwotICAgICAgICAgIE1BUCAoMiwgMCwgQkZEX1JFTE9DXzE2KTsKLSAgICAgICAgICBNQVAgKDQsIDAsIEJGRF9SRUxPQ18zMik7Ci0gICAgICAgICAgTUFQICgxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICAgICAgTUFQICgyLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgICAgIE1BUCAoNCwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgICAgZGVmYXVsdDoKLQkgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICAgICAgYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgJXNyZWxvY2F0aW9uIiksCi0JCSAgZml4cC0+Znhfc2l6ZSwKLQkgICAgICAgICAgZml4cC0+ZnhfcGNyZWwgPyBfKCJwYy1yZWxhdGl2ZSIpIDogIiIpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICAvKiBBbHdheXMgcGFzcyB0aGUgYWRkZW5kIGFsb25nISAgKi8KLSAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0KLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgCi0gIGlmIChyZWwtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICBfKCJDYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIpLAotICAgICAgICAgICAgICAgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgCi0gICAgICAvKiBTZXQgaG93dG8gdG8gYSBnYXJiYWdlIHZhbHVlIHNvIHRoYXQgd2UgY2FuIGtlZXAgZ29pbmcuICAqLwotICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfMzIpOwotICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvICE9IE5VTEwpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQotCi0jaWZkZWYgT0JKX0VMRgotLyogU2VlIHdoZXRoZXIgd2UgbmVlZCB0byBmb3JjZSBhIHJlbG9jYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuCi0gICBUaGlzIGlzIHVzZWQgdG8gZm9yY2Ugb3V0IHN3aXRjaCBhbmQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2hlbgotICAgcmVsYXhpbmcuICAqLwotaW50Ci1tY29yZV9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKiBmaXg7Ci17Ci0gIGlmICggICBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLSAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19SVkEpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBmaXggY2FuIGJlIGhhbmRsZWQgYnkgR0FTLCBmYWxzZSBpZiBpdCBtdXN0Ci0gICBiZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbGlua2VyLiAgKi8KLWJvb2xlYW4KLW1jb3JlX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcy4gICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1jb3JlLmggYi9nYXMvY29uZmlnL3RjLW1jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYTI5YWIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1tY29yZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZglUQ19NQ09SRQotI2RlZmluZSBUQ19NQ09SRSAxCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBNQ09SRSBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9BUkNICWJmZF9hcmNoX21jb3JlCi0vKiBVc2VkIHRvIGluaXRpYWxpc2UgdGFyZ2V0X2JpZ19lbmRpYW4uICAqLwotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLS8qIERvbid0IHdyaXRlIG91dCByZWxvY3MgZm9yIHBjcmVsIHN0dWZmLiAgKi8KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCgoeCktPmZ4X2FkZHN5IHx8ICh4KS0+Znhfc3Vic3kpICYmIFwKLQkJCSAgICh4KS0+Znhfcl90eXBlIDwgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQpCi0KLSNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKLQotI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUoYSxiLGMpIHRjX3JlbG9jX21hbmdsZSAoYSwgYiwgYykKLQotLyogU29tZSBwc2V1ZG8tb3Agc2VtYW50aWMgZXh0ZW5zaW9ucy4gICovCi0jZGVmaW5lCVBTRVVET19MQ09NTV9PUFRJT05BTF9BTElHTgotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICAgICAgICAJIk0uQ09SRSBHQVMgVmVyc2lvbiAyLjkuNCIKLSNkZWZpbmUgTElTVElOR19MSFNfQ09OVF9MSU5FUwk0Ci0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUJMQotI2RlZmluZSBDT0ZGX0ZMQUdTIAkxCi0KLS8qIFdlIHdhbnQgbG9jYWwgbGFiZWwgc3VwcG9ydC4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0gICAgIAotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCi0gIAotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLSNkZWZpbmUgbWRfZW5kCW1kX21jb3JlX2VuZAotCi0vKiBXYW50IHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uIHRvby4uLiAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gKEZJWFAsIFNFQykKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzICAvKiBXZSB3YW50IHRoZSBzZWdtZW50IGFzIHdlbGwuICAqLwotCi0KLQotI2lmZGVmICBPQkpfQ09GRgotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJKHRhcmdldF9iaWdfZW5kaWFuID8gInBlLW1jb3JlLWJpZyIgOiAicGUtbWNvcmUtbGl0dGxlIikKLQotc3RydWN0IG1jb3JlX3RjX3N5Ci17Ci0gIGludCBzeV9mbGFnczsKLX07Ci0KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSBzdHJ1Y3QgbWNvcmVfdGNfc3kKLQotIyBpZiBkZWZpbmVkIFRFX1BFCi0jICBkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTih4KSAoKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1JWQSkKLSMgZW5kaWYKLQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLQotI2lmZGVmIE9CSl9FTEYKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJlbGYzMi1tY29yZS1iaWciIDogImVsZjMyLW1jb3JlLWxpdHRsZSIpCi0KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuY3RvcnMiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5kdG9ycyIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLS8qIE90aGVyIHNwZWNpYWwgc2VjdGlvbnMgbm90IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyOiAucmVnaW5mbywKLSAgIC5saWJsaXN0LCAuY29uZmxpY3QsIC5ncHRhYiwgLmdvdCwgLmR5bmFtaWMsIC5yZWwuZHluLiAgKi8KLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBlbWl0IHZhcmlvdXMgcmVsb2NzIHdlIG90aGVyd2lzZSB3b3VsZG4ndC4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBtY29yZV9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IG1jb3JlX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIG1jb3JlX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotZXh0ZXJuIGJvb2xlYW4gbWNvcmVfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotIyBlcnJvciBObyB0YXJnZXQgZm9ybWF0IHNwZWNpZmllZC4KLSNlbmRpZgotCi0jaW5jbHVkZSAid3JpdGUuaCIgICAgICAgIC8qIEZvciBkZWZpbml0aW9uIG9mIGZpeFMgKi8KLSAgCi1leHRlcm4gdm9pZCAgICAgIG1kX2JlZ2luICAgICAgICAgICAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9hc3NlbWJsZSAgICAgICAgIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHN5bWJvbFMgKiBtZF91bmRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9tY29yZV9lbmQgICAgICAgIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBjaGFyICogICAgbWRfYXRvZiAgICAgICAgICAgICBQQVJBTVMgKChpbnQsIGNoYXIgKiwgaW50ICopKTsKLWV4dGVybiBpbnQgICAgICAgbWRfcGFyc2Vfb3B0aW9uICAgICBQQVJBTVMgKChpbnQsIGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9zaG93X3VzYWdlICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9jcmVhdGVfc2hvcnRfanVtcCAKLSAgUEFSQU1TICgoY2hhciAqLCBhZGRyZXNzVCwgYWRkcmVzc1QsIGZyYWdTICosIHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9jcmVhdGVfbG9uZ19qdW1wCi0gIFBBUkFNUyAoKGNoYXIgKiwgYWRkcmVzc1QsIGFkZHJlc3NULCBmcmFnUyAqLCBzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkICAgICAgbWRfY29udmVydF9mcmFnICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlZ1QsIGZyYWdTICopKTsKLWV4dGVybiBpbnQgICAgICAgbWRfYXBwbHlfZml4MyAgICAgICAgICAgICAgICAgUEFSQU1TICgoZml4UyAqLCB2YWx1ZVQgKiwgc2VnVCkpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9vcGVyYW5kICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1leHRlcm4gaW50ICAgICAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFBBUkFNUyAoKGZyYWdTICosIHNlZ1QpKTsKLWV4dGVybiB2b2lkICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICAgICAgICAgICAgUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCkpOwotZXh0ZXJuIHZhbHVlVCAgICBtZF9zZWN0aW9uX2FsaWduICAgICAgICAgICAgICBQQVJBTVMgKChzZWdULCB2YWx1ZVQpKTsKLWV4dGVybiBsb25nICAgICAgbWRfcGNyZWxfZnJvbV9zZWN0aW9uICAgICAgICAgUEFSQU1TICgoZml4UyAqLCBzZWdUKSk7Ci1leHRlcm4gYXJlbGVudCAqIHRjX2dlbl9yZWxvYyAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGFzZWN0aW9uICosIGZpeFMgKikpOwotCi0jZW5kaWYgLyogVENfTUNPUkUgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbWlwcy5jIGIvZ2FzL2NvbmZpZy90Yy1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYWY4OWQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkzNSArMCwwIEBACi0vKiB0Yy1taXBzLmMgLS0gYXNzZW1ibGUgY29kZSBmb3IgYSBNSVBTIGNoaXAuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBPU0YgYW5kIFJhbHBoIENhbXBiZWxsLgotICAgV3JpdHRlbiBieSBLZWl0aCBLbm93bGVzIGFuZCBSYWxwaCBDYW1wYmVsbCwgd29ya2luZyBpbmRlcGVuZGVudGx5LgotICAgTW9kaWZpZWQgZm9yIEVDT0ZGIGFuZCBSNDAwMCBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3Igb2YgQ3lnbnVzCi0gICBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBVU0VfU1REQVJHCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLSNpZmRlZiBVU0VfVkFSQVJHUwotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLSNpbmNsdWRlICJpdGJsLW9wcy5oIgotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgREJHKHgpIHByaW50ZiB4Ci0jZWxzZQotI2RlZmluZSBEQkcoeCkKLSNlbmRpZgotCi0jaWZkZWYgT0JKX01BWUJFX0VMRgotLyogQ2xlYW4gdXAgbmFtZXNwYWNlIHNvIHdlIGNhbiBpbmNsdWRlIG9iai1lbGYuaCB0b28uICAqLwotc3RhdGljIGludCBtaXBzX291dHB1dF9mbGF2b3IgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBtaXBzX291dHB1dF9mbGF2b3IgKCkgeyByZXR1cm4gT1VUUFVUX0ZMQVZPUjsgfQotI3VuZGVmIE9CSl9QUk9DRVNTX1NUQUIKLSN1bmRlZiBPVVRQVVRfRkxBVk9SCi0jdW5kZWYgU19HRVRfQUxJR04KLSN1bmRlZiBTX0dFVF9TSVpFCi0jdW5kZWYgU19TRVRfQUxJR04KLSN1bmRlZiBTX1NFVF9TSVpFCi0jdW5kZWYgb2JqX2Zyb2JfZmlsZQotI3VuZGVmIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi0jdW5kZWYgb2JqX2Zyb2Jfc3ltYm9sCi0jdW5kZWYgb2JqX3BvcF9pbnNlcnQKLSN1bmRlZiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLSN1bmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotCi0jaW5jbHVkZSAib2JqLWVsZi5oIgotLyogRml4IGFueSBvZiB0aGVtIHRoYXQgd2UgYWN0dWFsbHkgY2FyZSBhYm91dC4gICovCi0jdW5kZWYgT1VUUFVUX0ZMQVZPUgotI2RlZmluZSBPVVRQVVRfRkxBVk9SIG1pcHNfb3V0cHV0X2ZsYXZvcigpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLSNlbmRpZgotCi0jaWZuZGVmIEVDT0ZGX0RFQlVHR0lORwotI2RlZmluZSBOT19FQ09GRl9ERUJVR0dJTkcKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi1zdGF0aWMgY2hhciAqbWlwc19yZWdtYXNrX2ZyYWc7Ci0jZW5kaWYKLQotI2RlZmluZSBBVCAgMQotI2RlZmluZSBUUkVHIDI0Ci0jZGVmaW5lIFBJQ19DQUxMX1JFRyAyNQotI2RlZmluZSBLVDAgMjYKLSNkZWZpbmUgS1QxIDI3Ci0jZGVmaW5lIEdQICAyOAotI2RlZmluZSBTUCAgMjkKLSNkZWZpbmUgRlAgIDMwCi0jZGVmaW5lIFJBICAzMQotCi0jZGVmaW5lIElMTEVHQUxfUkVHICgzMikKLQotLyogQWxsb3cgb3ZlcnJpZGUgb2Ygc3RhbmRhcmQgbGl0dGxlLWVuZGlhbiBFQ09GRiBmb3JtYXQuICAqLwotCi0jaWZuZGVmIEVDT0ZGX0xJVFRMRV9GT1JNQVQKLSNkZWZpbmUgRUNPRkZfTElUVExFX0ZPUk1BVCAiZWNvZmYtbGl0dGxlbWlwcyIKLSNlbmRpZgotCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiAxIGlzIHdlIHNob3VsZCB1c2UgdGhlIDY0IGJpdCBNSVBTIEVMRiBBQkksIDAgaWYgd2Ugc2hvdWxkIHVzZSB0aGUKLSAgIDMyIGJpdCBBQkkuICBUaGlzIGhhcyBubyBtZWFuaW5nIGZvciBFQ09GRi4KLSAgIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBpcyBhbHdheXMgMzIgYml0LCBldmVuIGlmICJjb25maWd1cmVkIiBmb3IKLSAgIDY0IGJpdCBbZS5nLiAtLXRhcmdldD1taXBzNjQtZWxmXS4gICovCi1zdGF0aWMgaW50IG1pcHNfNjQ7Ci0KLS8qIFRoZSBkZWZhdWx0IHRhcmdldCBmb3JtYXQgdG8gdXNlLiAgKi8KLWNvbnN0IGNoYXIgKgotbWlwc190YXJnZXRfZm9ybWF0ICgpCi17Ci0gIHN3aXRjaCAoT1VUUFVUX0ZMQVZPUikKLSAgICB7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cjoKLSAgICAgIHJldHVybiB0YXJnZXRfYmlnX2VuZGlhbiA/ICJhLm91dC1taXBzLWJpZyIgOiAiYS5vdXQtbWlwcy1saXR0bGUiOwotICAgIGNhc2UgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyOgotICAgICAgcmV0dXJuIHRhcmdldF9iaWdfZW5kaWFuID8gImVjb2ZmLWJpZ21pcHMiIDogRUNPRkZfTElUVExFX0ZPUk1BVDsKLSAgICBjYXNlIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyOgotICAgICAgcmV0dXJuICJwZS1taXBzIjsKLSAgICBjYXNlIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gKHRhcmdldF9iaWdfZW5kaWFuCi0JICAgICAgPyAobWlwc182NCA/ICJlbGY2NC1iaWdtaXBzIiA6ICJlbGYzMi1iaWdtaXBzIikKLQkgICAgICA6IChtaXBzXzY0ID8gImVsZjY0LWxpdHRsZW1pcHMiIDogImVsZjMyLWxpdHRsZW1pcHMiKSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vKiBUaGUgbmFtZSBvZiB0aGUgcmVhZG9ubHkgZGF0YSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgUkRBVEFfU0VDVElPTl9OQU1FIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyIFwKLQkJCSAgICA/ICIuZGF0YSIgXAotCQkJICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIgXAotCQkJICAgID8gIi5yZGF0YSIgXAotCQkJICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciBcCi0JCQkgICAgPyAiLnJkYXRhIiBcCi0JCQkgICAgOiBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIgXAotCQkJICAgID8gIi5yb2RhdGEiIFwKLQkJCSAgICA6IChhYm9ydCAoKSwgIiIpKQotCi0vKiBUaGlzIGlzIHRoZSBzZXQgb2Ygb3B0aW9ucyB3aGljaCBtYXkgYmUgbW9kaWZpZWQgYnkgdGhlIC5zZXQKLSAgIHBzZXVkby1vcC4gIFdlIHVzZSBhIHN0cnVjdCBzbyB0aGF0IC5zZXQgcHVzaCBhbmQgLnNldCBwb3AgYXJlIG1vcmUKLSAgIHJlbGlhYmxlLiAgKi8KLQotc3RydWN0IG1pcHNfc2V0X29wdGlvbnMKLXsKLSAgLyogTUlQUyBJU0EgKEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUpIGxldmVsLiAgVGhpcyBpcyBzZXQgdG8gLTEKLSAgICAgaWYgaXQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiAgQ2hhbmdlZCBieSBgLnNldCBtaXBzTicsIGFuZCB0aGUKLSAgICAgLW1pcHNOIGNvbW1hbmQgbGluZSBvcHRpb24sIGFuZCB0aGUgZGVmYXVsdCBDUFUuICAqLwotICBpbnQgaXNhOwotICAvKiBXaGV0aGVyIHdlIGFyZSBhc3NlbWJsaW5nIGZvciB0aGUgbWlwczE2IHByb2Nlc3Nvci4gIDAgaWYgd2UgYXJlCi0gICAgIG5vdCwgMSBpZiB3ZSBhcmUsIGFuZCAtMSBpZiB0aGUgdmFsdWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLgotICAgICBDaGFuZ2VkIGJ5IGAuc2V0IG1pcHMxNicgYW5kIGAuc2V0IG5vbWlwczE2JywgYW5kIHRoZSAtbWlwczE2IGFuZAotICAgICAtbm9taXBzMTYgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFuZCB0aGUgZGVmYXVsdCBDUFUuICAqLwotICBpbnQgbWlwczE2OwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IHJlb3JkZXIgaW5zdHJ1Y3Rpb25zLiAgQ2hhbmdlZCBieSBgLnNldAotICAgICByZW9yZGVyJyBhbmQgYC5zZXQgbm9yZW9yZGVyJy4gICovCi0gIGludCBub3Jlb3JkZXI7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3QgcGVybWl0IHRoZSAkYXQgKCQxKSByZWdpc3RlciB0byBiZSB1c2VkCi0gICAgIGluIGluc3RydWN0aW9ucy4gIENoYW5nZWQgYnkgYC5zZXQgYXQnIGFuZCBgLnNldCBub2F0Jy4gICovCi0gIGludCBub2F0OwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgd2FybiB3aGVuIGEgbWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kcyBpbnRvCi0gICAgIG1vcmUgdGhhbiBvbmUgbWFjaGluZSBpbnN0cnVjdGlvbi4gIENoYW5nZWQgYnkgYC5zZXQgbm9tYWNybycgYW5kCi0gICAgIGAuc2V0IG1hY3JvJy4gICovCi0gIGludCB3YXJuX2Fib3V0X21hY3JvczsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBtb3ZlIGluc3RydWN0aW9ucy4gIENoYW5nZWQgYnkgYC5zZXQKLSAgICAgbW92ZScsIGAuc2V0IHZvbGF0aWxlJywgYC5zZXQgbm9tb3ZlJywgYW5kIGAuc2V0IG5vdm9sYXRpbGUnLiAgKi8KLSAgaW50IG5vbW92ZTsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBvcHRpbWl6ZSBicmFuY2hlcyBieSBtb3ZpbmcgdGhlIHRhcmdldAotICAgICBvZiB0aGUgYnJhbmNoIGludG8gdGhlIGRlbGF5IHNsb3QuICBBY3R1YWxseSwgd2UgZG9uJ3QgcGVyZm9ybQotICAgICB0aGlzIG9wdGltaXphdGlvbiBhbnlob3cuICBDaGFuZ2VkIGJ5IGAuc2V0IGJvcHQnIGFuZCBgLnNldAotICAgICBub2JvcHQnLiAgKi8KLSAgaW50IG5vYm9wdDsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBhdXRvZXh0ZW5kIG1pcHMxNiBpbnN0cnVjdGlvbnMuCi0gICAgIENoYW5nZWQgYnkgYC5zZXQgYXV0b2V4dGVuZCcgYW5kIGAuc2V0IG5vYXV0b2V4dGVuZCcuICAqLwotICBpbnQgbm9hdXRvZXh0ZW5kOwotfTsKLQotLyogVGhpcyBpcyB0aGUgc3RydWN0IHdlIHVzZSB0byBob2xkIHRoZSBjdXJyZW50IHNldCBvZiBvcHRpb25zLiAgTm90ZQotICAgdGhhdCB3ZSBtdXN0IHNldCB0aGUgaXNhIGFuZCBtaXBzMTYgZmllbGRzIHRvIC0xIHRvIGluZGljYXRlIHRoYXQKLSAgIHRoZXkgaGF2ZSBub3QgYmVlbiBpbml0aWFsaXplZC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19zZXRfb3B0aW9ucyBtaXBzX29wdHMgPSB7IC0xLCAtMSB9OwotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBtYXNrcyBvZiByZWdpc3RlcnMgdXNlZC4KLSAgIFRoZSBvYmplY3QgZm9ybWF0IGNvZGUgcmVhZHMgdGhlbSBhbmQgcHV0cyB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZQotICAgcGxhY2UuICAqLwotdW5zaWduZWQgbG9uZyBtaXBzX2dwcm1hc2s7Ci11bnNpZ25lZCBsb25nIG1pcHNfY3BybWFza1s0XTsKLQotLyogTUlQUyBJU0Egd2UgYXJlIHVzaW5nIGZvciB0aGlzIG91dHB1dCBmaWxlLiAgKi8KLXN0YXRpYyBpbnQgZmlsZV9taXBzX2lzYTsKLQotLyogVGhlIENQVSB0eXBlIGFzIGEgbnVtYmVyOiAyMDAwLCAzMDAwLCA0MDAwLCA0NDAwLCBldGMuICAqLwotc3RhdGljIGludCBtaXBzX2NwdSA9IC0xOwotCi0vKiBUaGUgYXJndW1lbnQgb2YgdGhlIC1tYWJpPSBmbGFnLiAqLwotc3RhdGljIGNoYXIqIG1pcHNfYWJpX3N0cmluZyA9IDA7Ci0KLS8qIFdldGhlciB3ZSBzaG91bGQgbWFyayB0aGUgZmlsZSBFQUJJNjQgb3IgRUFCSTMyLiAqLwotc3RhdGljIGludCBtaXBzX2VhYmk2NCA9IDA7Ci0KLS8qIElmIHRoZXkgYXNrZWQgZm9yIG1pcHMxIG9yIG1pcHMyIGFuZCBhIGNwdSB0aGF0IGlzCi0gICBtaXBzMyBvciBncmVhdGVyLCB0aGVuIG1hcmsgdGhlIG9iamVjdCBmaWxlIDMyQklUTU9ERS4gKi8KLXN0YXRpYyBpbnQgbWlwc18zMmJpdG1vZGUgPSAwOwotCi0vKiBUcnVlIGlmIC1tZ3AzMiB3YXMgcGFzc2VkLiAqLwotc3RhdGljIGludCBtaXBzX2dwMzIgPSAwOwotCi0vKiBTb21lIElTQSdzIGhhdmUgZGVsYXkgc2xvdHMgZm9yIGluc3RydWN0aW9ucyB3aGljaCByZWFkIG9yIHdyaXRlCi0gICBmcm9tIGEgY29wcm9jZXNzb3IgKGVnLiBtaXBzMS1taXBzMyk7IHNvbWUgZG9uJ3QgKGVnIG1pcHM0KS4KLSAgIFJldHVybiB0cnVlIGlmIGluc3RydWN0aW9ucyBtYXJrZWQgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSwgCi0gICBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZLCBvciBJTlNOX1dSSVRFX0NPTkRfQ09ERSBhY3R1YWxseSBoYXZlIGEKLSAgIGRlbGF5IHNsb3QgaW4gdGhpcyBJU0EuICBUaGUgdXNlcyBvZiB0aGlzIG1hY3JvIGFzc3VtZSB0aGF0IGFueQotICAgSVNBIHRoYXQgaGFzIGRlbGF5IHNsb3RzIGZvciBvbmUgb2YgdGhlc2UsIGhhcyB0aGVtIGZvciBhbGwuICBUaGV5Ci0gICBhbHNvIGFzc3VtZSB0aGF0IElTQXMgd2hpY2ggZG9uJ3QgaGF2ZSBkZWxheXMgZm9yIHRoZXNlIGluc25zLCBkb24ndAotICAgaGF2ZSBkZWxheXMgZm9yIHRoZSBJTlNOX0xPQURfTUVNT1JZX0RFTEFZIGluc3RydWN0aW9ucyBlaXRoZXIuICovCi0jZGVmaW5lIElTQV9IQVNfQ09QUk9DX0RFTEFZUyhJU0EpICggICAgICAgIFwKLSAgIChJU0EpID09IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgfHwgKElTQSkgPT0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB8fCAoSVNBKSA9PSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICkKLQotLyogIFJldHVybiB0cnVlIGlmIElTQSBzdXBwb3J0cyA2NCBiaXQgZ3AgcmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zLiAqLwotI2RlZmluZSBJU0FfSEFTXzY0QklUX1JFR1MoSVNBKSAoICAgIFwKLSAgIChJU0EpID09IDMgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB8fCAoSVNBKSA9PSA0ICAgICAgICAgICAgICAgICAgICAgXAotICAgKQotCi0vKiBXaGV0aGVyIHRoZSBwcm9jZXNzb3IgdXNlcyBoYXJkd2FyZSBpbnRlcmxvY2tzIHRvIHByb3RlY3QgCi0gICByZWFkcyBmcm9tIHRoZSBISSBhbmQgTE8gcmVnaXN0ZXJzLCBhbmQgdGh1cyBkb2VzIG5vdAotICAgcmVxdWlyZSBub3BzIHRvIGJlIGluc2VydGVkLgotCi0gICBGSVhNRTogR0NDIG1ha2VzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiAtbWNwdT1GT08gYW5kIC1tRk9POgotICAgLW1jcHU9Rk9PIHNjaGVkdWxlcyBmb3IgRk9PLCBidXQgc3RpbGwgcHJvZHVjZXMgY29kZSB0aGF0IG1lZXRzIHRoZQotICAgcmVxdWlyZW1lbnRzIG9mIE1JUFMgSVNBIEkuICBGb3IgZXhhbXBsZSwgaXQgd29uJ3QgZ2VuZXJhdGUgYW55Ci0gICBGT08tc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLCBhbmQgaXQgd2lsbCBzdGlsbCBhc3N1bWUgdGhhdCBhbnkKLSAgIHNjaGVkdWxpbmcgaGF6YXJkcyBkZXNjcmliZWQgaW4gTUlQUyBJU0EgSSBhcmUgdGhlcmUsIGV2ZW4gaWYgRk9PCi0gICBoYXMgaW50ZXJsb2Nrcy4gIC1tRk9PIGdpdmVzIEdDQyBwZXJtaXNzaW9uIHRvIGdlbmVyYXRlIGNvZGUgdGhhdAotICAgd2lsbCBvbmx5IHJ1biBvbiBhIEZPTzsgaXQgd2lsbCBnZW5lcmF0ZSBGT08tc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLAotICAgYW5kIGFzc3VtZSBpbnRlcmxvY2tzIHByb3ZpZGVkIGJ5IGEgRk9PLgotCi0gICBIb3dldmVyLCBHQVMgY3VycmVudGx5IGRvZXNuJ3QgbWFrZSB0aGlzIGRpc3RpbmN0aW9uOyBiZWZvcmUgSmFuIDI4Ci0gICAxOTk5LCBHQVMncyAtbWNwdT1GT08gaW1wbGllZCAtbUZPTywgd2hpY2ggdmlvbGF0ZXMgR0NDJ3MKLSAgIGFzc3VtcHRpb25zLiAgVGhlIEdDQyBkcml2ZXIgcGFzc2VzIHRoZXNlIGZsYWdzIHRocm91Z2ggdG8gR0FTLCBzbwotICAgaWYgR0FTIGFjdHVhbGx5IGRvZXMgYW55dGhpbmcgdGhhdCBkb2Vzbid0IG1lZXQgTUlQUyBJU0EgSSB3aXRoCi0gICAtbUZPTywgdGhlbiBHQ0MncyAtbWNwdT1GT08gZmxhZyBpc24ndCBnb2luZyB0byB3b3JrLgotCi0gICBBbmQgZnVydGhlcm1vcmUsIGl0IGRpZCBub3QgYXNzdW1lIHRoYXQgLW1GT08gaW1wbGllZCAtbWNwdT1GT08sCi0gICB3aGljaCBzZWVtcyBzZW5zZWxlc3MgLS0tIHdoeSBnZW5lcmF0ZSBjb2RlIHdoaWNoIHdpbGwgb25seSBydW4gb24KLSAgIGEgRk9PLCBidXQgc2NoZWR1bGUgZm9yIHNvbWV0aGluZyBlbHNlPwotCi0gICBTbyBub3csIGF0IGxlYXN0LCAtbWNwdT1GT08gYW5kIC1tRk9PIGFyZSBleGFjdGx5IGVxdWl2YWxlbnQuCi0KLSAgIC0tIEppbSBCbGFuZHkgPGppbWJAY3lnbnVzLmNvbT4gKi8KLQotI2RlZmluZSBoaWxvX2ludGVybG9ja3MgKG1pcHNfY3B1ID09IDQwMTAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKQotCi0vKiBXaGV0aGVyIHRoZSBwcm9jZXNzb3IgdXNlcyBoYXJkd2FyZSBpbnRlcmxvY2tzIHRvIHByb3RlY3QgcmVhZHMKLSAgIGZyb20gdGhlIEdQUnMsIGFuZCB0aHVzIGRvZXMgbm90IHJlcXVpcmUgbm9wcyB0byBiZSBpbnNlcnRlZC4gICovCi0jZGVmaW5lIGdwcl9pbnRlcmxvY2tzIFwKLSAgKG1pcHNfb3B0cy5pc2EgIT0gMSAgXAotICAgfHwgbWlwc19jcHUgPT0gMzkwMCkKLQotLyogQXMgd2l0aCBvdGhlciAiaW50ZXJsb2NrcyIgdGhpcyBpcyB1c2VkIGJ5IGhhcmR3YXJlIHRoYXQgaGFzIEZQCi0gICAoY28tcHJvY2Vzc29yKSBpbnRlcmxvY2tzLiAgKi8KLS8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSNkZWZpbmUgY29wX2ludGVybG9ja3MgKG1pcHNfY3B1ID09IDQzMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJKQotCi0vKiBJcyB0aGlzIGEgbWZoaSBvciBtZmxvIGluc3RydWN0aW9uPyAgKi8KLSNkZWZpbmUgTUZfSElMT19JTlNOKFBJTkZPKSBcCi0gICAgICAgICAgKChQSU5GTyAmIElOU05fUkVBRF9ISSkgfHwgKFBJTkZPICYgSU5TTl9SRUFEX0xPKSkKLQotLyogTUlQUyBQSUMgbGV2ZWwuICAqLwotCi1lbnVtIG1pcHNfcGljX2xldmVsCi17Ci0gIC8qIERvIG5vdCBnZW5lcmF0ZSBQSUMgY29kZS4gICovCi0gIE5PX1BJQywKLQotICAvKiBHZW5lcmF0ZSBQSUMgY29kZSBhcyBpbiBJcml4IDQuICBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCwgYW5kIEknbQotICAgICBub3Qgc3VyZSB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiAgKi8KLSAgSVJJWDRfUElDLAotCi0gIC8qIEdlbmVyYXRlIFBJQyBjb2RlIGFzIGluIHRoZSBTVlI0IE1JUFMgQUJJLiAgKi8KLSAgU1ZSNF9QSUMsCi0KLSAgLyogR2VuZXJhdGUgUElDIGNvZGUgd2l0aG91dCB1c2luZyBhIGdsb2JhbCBvZmZzZXQgdGFibGU6IHRoZSBkYXRhCi0gICAgIHNlZ21lbnQgaGFzIGEgbWF4aW11bSBzaXplIG9mIDY0SywgYWxsIGRhdGEgcmVmZXJlbmNlcyBhcmUgb2ZmCi0gICAgIHRoZSAkZ3AgcmVnaXN0ZXIsIGFuZCBhbGwgdGV4dCByZWZlcmVuY2VzIGFyZSBQQyByZWxhdGl2ZS4gIFRoaXMKLSAgICAgaXMgdXNlZCBvbiBzb21lIGVtYmVkZGVkIHN5c3RlbXMuICAqLwotICBFTUJFRERFRF9QSUMKLX07Ci0KLXN0YXRpYyBlbnVtIG1pcHNfcGljX2xldmVsIG1pcHNfcGljOwotCi0vKiAxIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSAzMiBiaXQgb2Zmc2V0cyBmcm9tIHRoZSBHUCByZWdpc3RlciBpbgotICAgU1ZSNF9QSUMgbW9kZS4gIEN1cnJlbnRseSBoYXMgbm8gbWVhbmluZyBpbiBvdGhlciBtb2Rlcy4gICovCi1zdGF0aWMgaW50IG1pcHNfYmlnX2dvdDsKLQotLyogMSBpZiB0cmFwIGluc3RydWN0aW9ucyBzaG91bGQgdXNlZCBmb3Igb3ZlcmZsb3cgcmF0aGVyIHRoYW4gYnJlYWsKLSAgIGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgaW50IG1pcHNfdHJhcDsKLQotLyogTm9uLXplcm8gaWYgYW55IC5zZXQgbm9yZW9yZGVyIGRpcmVjdGl2ZXMgd2VyZSB1c2VkLiAgKi8KLQotc3RhdGljIGludCBtaXBzX2FueV9ub3Jlb3JkZXI7Ci0KLS8qIE5vbi16ZXJvIGlmIG5vcHMgc2hvdWxkIGJlIGluc2VydGVkIHdoZW4gdGhlIHJlZ2lzdGVyIHJlZmVyZW5jZWQgaW4KLSAgIGFuIG1maGkvbWZsbyBpbnN0cnVjdGlvbiBpcyByZWFkIGluIHRoZSBuZXh0IHR3byBpbnN0cnVjdGlvbnMuICAqLwotc3RhdGljIGludCBtaXBzXzcwMDBfaGlsb19maXg7Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBzbWFsbCBkYXRhIHNlY3Rpb24uICAqLwotc3RhdGljIGludCBnX3N3aXRjaF92YWx1ZSA9IDg7Ci0vKiBXaGV0aGVyIHRoZSAtRyBvcHRpb24gd2FzIHVzZWQuICAqLwotc3RhdGljIGludCBnX3N3aXRjaF9zZWVuID0gMDsKLQotI2RlZmluZSBOX1JNQVNLIDB4YzQKLSNkZWZpbmUgTl9WRlAgICAweGQ0Ci0KLS8qIElmIHdlIGNhbiBkZXRlcm1pbmUgaW4gYWR2YW5jZSB0aGF0IEdQIG9wdGltaXphdGlvbiB3b24ndCBiZQotICAgcG9zc2libGUsIHdlIGNhbiBza2lwIHRoZSByZWxheGF0aW9uIHN0dWZmIHRoYXQgdHJpZXMgdG8gcHJvZHVjZQotICAgR1AtcmVsYXRpdmUgcmVmZXJlbmNlcy4gIFRoaXMgbWFrZXMgZGVsYXkgc2xvdCBvcHRpbWl6YXRpb24gd29yawotICAgYmV0dGVyLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IHByb3ZpZGUgYSBndWVzcywgYnV0IGl0IHNlZW1zIHRvIHdvcmsgZm9yCi0gICBnY2Mgb3V0cHV0LiAgSXQgbmVlZHMgdG8gZ3Vlc3MgcmlnaHQgZm9yIGdjYywgb3RoZXJ3aXNlIGdjYwotICAgd2lsbCBwdXQgd2hhdCBpdCB0aGlua3MgaXMgYSBHUC1yZWxhdGl2ZSBpbnN0cnVjdGlvbiBpbiBhIGJyYW5jaAotICAgZGVsYXkgc2xvdC4KLQotICAgSSBkb24ndCBrbm93IGlmIGEgZml4IGlzIG5lZWRlZCBmb3IgdGhlIFNWUjRfUElDIG1vZGUuICBJJ3ZlIG9ubHkKLSAgIGZpeGVkIGl0IGZvciB0aGUgbm9uLVBJQyBtb2RlLiAgS1IgOTUvMDQvMDcgICovCi1zdGF0aWMgaW50IG5vcGljX25lZWRfcmVsYXggUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLQotLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOwotCi0vKiBUaGUgb3Bjb2RlIGhhc2ggdGFibGUgd2UgdXNlIGZvciB0aGUgbWlwczE2LiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptaXBzMTZfb3BfaGFzaCA9IE5VTEw7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBDIHN0eWxlIGNvbW1lbnRzIGFyZSBhbHdheXMgc3VwcG9ydGVkLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgbWFjaGluZSBzcGVjaWZpYyBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXJzLiAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuCi0gKi8KLQotc3RhdGljIGNoYXIgKmluc25fZXJyb3I7Ci0KLXN0YXRpYyBpbnQgYXV0b19hbGlnbiA9IDE7Ci0KLS8qIFdoZW4gb3V0cHV0dGluZyBTVlI0IFBJQyBjb2RlLCB0aGUgYXNzZW1ibGVyIG5lZWRzIHRvIGtub3cgdGhlCi0gICBvZmZzZXQgaW4gdGhlIHN0YWNrIGZyYW1lIGZyb20gd2hpY2ggdG8gcmVzdG9yZSB0aGUgJGdwIHJlZ2lzdGVyLgotICAgVGhpcyBpcyBzZXQgYnkgdGhlIC5jcHJlc3RvcmUgcHNldWRvLW9wLCBhbmQgc2F2ZWQgaW4gdGhpcwotICAgdmFyaWFibGUuICAqLwotc3RhdGljIG9mZnNldFQgbWlwc19jcHJlc3RvcmVfb2Zmc2V0ID0gLTE7Ci0KLS8qIFRoaXMgaXMgdGhlIHJlZ2lzdGVyIHdoaWNoIGhvbGRzIHRoZSBzdGFjayBmcmFtZSwgYXMgc2V0IGJ5IHRoZQotICAgLmZyYW1lIHBzZXVkby1vcC4gIFRoaXMgaXMgbmVlZGVkIHRvIGltcGxlbWVudCAuY3ByZXN0b3JlLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19mcmFtZV9yZWcgPSBTUDsKLQotLyogVG8gb3V0cHV0IE5PUCBpbnN0cnVjdGlvbnMgY29ycmVjdGx5LCB3ZSBuZWVkIHRvIGtlZXAgaW5mb3JtYXRpb24KLSAgIGFib3V0IHRoZSBwcmV2aW91cyB0d28gaW5zdHJ1Y3Rpb25zLiAgKi8KLQotLyogV2hldGhlciB3ZSBhcmUgb3B0aW1pemluZy4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIDIgbWVhbnMgdG8gcmVtb3ZlCi0gICB1bm5lZWRlZCBOT1BzIGFuZCBzd2FwIGJyYW5jaCBpbnN0cnVjdGlvbnMgd2hlbiBwb3NzaWJsZS4gIEEgdmFsdWUKLSAgIG9mIDEgbWVhbnMgdG8gbm90IHN3YXAgYnJhbmNoZXMuICBBIHZhbHVlIG9mIDAgbWVhbnMgdG8gYWx3YXlzCi0gICBpbnNlcnQgTk9Qcy4gICovCi1zdGF0aWMgaW50IG1pcHNfb3B0aW1pemUgPSAyOwotCi0vKiBEZWJ1Z2dpbmcgbGV2ZWwuICAtZyBzZXRzIHRoaXMgdG8gMi4gIC1nTiBzZXRzIHRoaXMgdG8gTi4gIC1nMCBpcwotICAgZXF1aXZhbGVudCB0byBzZWVpbmcgbm8gLWcgb3B0aW9uIGF0IGFsbC4gICovCi1zdGF0aWMgaW50IG1pcHNfZGVidWcgPSAwOwotCi0vKiBUaGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHN0cnVjdCBtaXBzX2NsX2luc24gcHJldl9pbnNuOwotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIHByZXZfaW5zbi4gICovCi1zdGF0aWMgc3RydWN0IG1pcHNfY2xfaW5zbiBwcmV2X3ByZXZfaW5zbjsKLQotLyogSWYgd2UgZG9uJ3Qgd2FudCBpbmZvcm1hdGlvbiBmb3IgcHJldl9pbnNuIG9yIHByZXZfcHJldl9pbnNuLCB3ZQotICAgcG9pbnQgdGhlIGluc25fbW8gZmllbGQgYXQgdGhpcyBkdW1teSBpbnRlZ2VyLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgZHVtbXlfb3Bjb2RlID0geyAwIH07Ci0KLS8qIE5vbi16ZXJvIGlmIHByZXZfaW5zbiBpcyB2YWxpZC4gICovCi1zdGF0aWMgaW50IHByZXZfaW5zbl92YWxpZDsKLQotLyogVGhlIGZyYWcgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgc3RydWN0IGZyYWcgKnByZXZfaW5zbl9mcmFnOwotCi0vKiBUaGUgb2Zmc2V0IGludG8gcHJldl9pbnNuX2ZyYWcgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgbG9uZyBwcmV2X2luc25fd2hlcmU7Ci0KLS8qIFRoZSByZWxvYyB0eXBlIGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24sIGlmIGFueS4gICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHByZXZfaW5zbl9yZWxvY190eXBlOwotCi0vKiBUaGUgcmVsb2MgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgaWYgYW55LiAgKi8KLXN0YXRpYyBmaXhTICpwcmV2X2luc25fZml4cDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIGRlbGF5IHNsb3QuICAqLwotc3RhdGljIGludCBwcmV2X2luc25faXNfZGVsYXlfc2xvdDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIC5zZXQgbm9yZW9yZGVyLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9pbnNuX3VucmVvcmRlcmVkOwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gdXNlcyBhbiBleHRlbmQgb3Bjb2RlIChpZgotICAgbWlwczE2KS4gICovCi1zdGF0aWMgaW50IHByZXZfaW5zbl9leHRlbmRlZDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIC5zZXQKLSAgIG5vcmVvcmRlci4gICovCi1zdGF0aWMgaW50IHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkOwotCi0vKiBJZiB0aGlzIGlzIHNldCwgaXQgcG9pbnRzIHRvIGEgZnJhZyBob2xkaW5nIG5vcCBpbnN0cnVjdGlvbnMgd2hpY2gKLSAgIHdlcmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBzdGFydCBvZiBhIG5vcmVvcmRlciBzZWN0aW9uLiAgSWYgdGhvc2UKLSAgIG5vcHMgdHVybiBvdXQgdG8gYmUgdW5uZWNlc3NhcnksIHRoZSBzaXplIG9mIHRoZSBmcmFnIGNhbiBiZQotICAgZGVjcmVhc2VkLiAgKi8KLXN0YXRpYyBmcmFnUyAqcHJldl9ub3BfZnJhZzsKLQotLyogVGhlIG51bWJlciBvZiBub3AgaW5zdHJ1Y3Rpb25zIHdlIGNyZWF0ZWQgaW4gcHJldl9ub3BfZnJhZy4gICovCi1zdGF0aWMgaW50IHByZXZfbm9wX2ZyYWdfaG9sZHM7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygbm9wIGluc3RydWN0aW9ucyB0aGF0IHdlIGtub3cgd2UgbmVlZCBpbgotICAgcHJldl9ub3BfZnJhZy4gKi8KLXN0YXRpYyBpbnQgcHJldl9ub3BfZnJhZ19yZXF1aXJlZDsKLQotLyogVGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgd2UndmUgc2VlbiBzaW5jZSBwcmV2X25vcF9mcmFnLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9ub3BfZnJhZ19zaW5jZTsKLQotLyogRm9yIEVDT0ZGIGFuZCBFTEYsIHJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBhcmUgZG9uZSBpbiB0d28KLSAgIHBhcnRzLCB3aXRoIGEgSEkgcmVsb2NhdGlvbiBhbmQgYSBMTyByZWxvY2F0aW9uLiAgRWFjaCByZWxvY2F0aW9uCi0gICBoYXMgb25seSAxNiBiaXRzIG9mIHNwYWNlIHRvIHN0b3JlIGFuIGFkZGVuZC4gIFRoaXMgbWVhbnMgdGhhdCBpbgotICAgb3JkZXIgZm9yIHRoZSBsaW5rZXIgdG8gaGFuZGxlIGNhcnJpZXMgY29ycmVjdGx5LCBpdCBtdXN0IGJlIGFibGUKLSAgIHRvIGxvY2F0ZSBib3RoIHRoZSBISSBhbmQgdGhlIExPIHJlbG9jYXRpb24uICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICByZWxvY2F0aW9ucyBtdXN0IGFwcGVhciBpbiBvcmRlciBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZS4KLQotICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoaXMsIHdlIGtlZXAgdHJhY2sgb2YgZWFjaCB1bm1hdGNoZWQgSEkKLSAgIHJlbG9jYXRpb24uICBXZSB0aGVuIHNvcnQgdGhlbSBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgTE8gcmVsb2NhdGlvbi4gKi8KLQotc3RydWN0IG1pcHNfaGlfZml4dXAKLXsKLSAgLyogTmV4dCBISSBmaXh1cC4gICovCi0gIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICpuZXh0OwotICAvKiBUaGlzIGZpeHVwLiAgKi8KLSAgZml4UyAqZml4cDsKLSAgLyogVGhlIHNlY3Rpb24gdGhpcyBmaXh1cCBpcyBpbi4gICovCi0gIHNlZ1Qgc2VnOwotfTsKLQotLyogVGhlIGxpc3Qgb2YgdW5tYXRjaGVkIEhJIHJlbG9jcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaV9maXh1cCAqbWlwc19oaV9maXh1cF9saXN0OwotCi0vKiBNYXAgbm9ybWFsIE1JUFMgcmVnaXN0ZXIgbnVtYmVycyB0byBtaXBzMTYgcmVnaXN0ZXIgbnVtYmVycy4gICovCi0KLSNkZWZpbmUgWCBJTExFR0FMX1JFRwotc3RhdGljIGNvbnN0IGludCBtaXBzMzJfdG9fMTZfcmVnX21hcFtdID0KLXsKLSAgWCwgWCwgMiwgMywgNCwgNSwgNiwgNywKLSAgWCwgWCwgWCwgWCwgWCwgWCwgWCwgWCwKLSAgMCwgMSwgWCwgWCwgWCwgWCwgWCwgWCwKLSAgWCwgWCwgWCwgWCwgWCwgWCwgWCwgWAotfTsKLSN1bmRlZiBYCi0KLS8qIE1hcCBtaXBzMTYgcmVnaXN0ZXIgbnVtYmVycyB0byBub3JtYWwgTUlQUyByZWdpc3RlciBudW1iZXJzLiAgKi8KLQotc3RhdGljIGNvbnN0IGludCBtaXBzMTZfdG9fMzJfcmVnX21hcFtdID0KLXsKLSAgMTYsIDE3LCAyLCAzLCA0LCA1LCA2LCA3Ci19OwotDAotLyogU2luY2UgdGhlIE1JUFMgZG9lcyBub3QgaGF2ZSBtdWx0aXBsZSBmb3JtcyBvZiBQQyByZWxhdGl2ZQotICAgaW5zdHJ1Y3Rpb25zLCB3ZSBkbyBub3QgaGF2ZSB0byBkbyByZWxheGluZyBhcyBpcyBkb25lIG9uIG90aGVyCi0gICBwbGF0Zm9ybXMuICBIb3dldmVyLCB3ZSBkbyBoYXZlIHRvIGhhbmRsZSBHUCByZWxhdGl2ZSBhZGRyZXNzaW5nCi0gICBjb3JyZWN0bHksIHdoaWNoIHR1cm5zIG91dCB0byBiZSBhIHNpbWlsYXIgcHJvYmxlbS4KLQotICAgRXZlcnkgbWFjcm8gdGhhdCByZWZlcnMgdG8gYSBzeW1ib2wgY2FuIG9jY3VyIGluIChhdCBsZWFzdCkgdHdvCi0gICBmb3Jtcywgb25lIHdpdGggR1AgcmVsYXRpdmUgYWRkcmVzc2luZyBhbmQgb25lIHdpdGhvdXQuICBGb3IKLSAgIGV4YW1wbGUsIGxvYWRpbmcgYSBnbG9iYWwgdmFyaWFibGUgaW50byBhIHJlZ2lzdGVyIGdlbmVyYWxseSB1c2VzCi0gICBhIG1hY3JvIGluc3RydWN0aW9uIGxpa2UgdGhpczoKLSAgICAgbHcgJDQsaQotICAgSWYgaSBjYW4gYmUgYWRkcmVzc2VkIG9mZiB0aGUgR1AgcmVnaXN0ZXIgKHRoaXMgaXMgdHJ1ZSBpZiBpdCBpcyBpbgotICAgdGhlIC5zYnNzIG9yIC5zZGF0YSBzZWN0aW9uLCBvciBpZiBpdCBpcyBrbm93biB0byBiZSBzbWFsbGVyIHRoYW4KLSAgIHRoZSAtRyBhcmd1bWVudCkgdGhpcyB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb246Ci0gICAgIGx3ICQ0LGkoJGdwKQotICAgVGhpcyBpbnN0cnVjdGlvbiB3aWxsIHVzZSBhIEdQUkVMIHJlbG9jLiAgSWYgaSBjYW4gbm90IGJlIGFkZHJlc3NlZAotICAgb2ZmIHRoZSBHUCByZWdpc3RlciwgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB3aWxsIGJlIHVzZWQ6Ci0gICAgIGx1aSAkYXQsaQotICAgICBsdyAkNCxpKCRhdCkKLSAgIEluIHRoaXMgY2FzZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd2lsbCBoYXZlIGEgSEkxNiByZWxvYywgYW5kIHRoZQotICAgc2Vjb25kIHJlbG9jIHdpbGwgaGF2ZSBhIExPMTYgcmVsb2MuICBCb3RoIHJlbG9jcyB3aWxsIGJlIGFnYWluc3QKLSAgIHRoZSBzeW1ib2wgaS4KLQotICAgVGhlIGlzc3VlIGhlcmUgaXMgdGhhdCB3ZSBtYXkgbm90IGtub3cgd2hldGhlciBpIGlzIEdQIGFkZHJlc3NhYmxlCi0gICB1bnRpbCBhZnRlciB3ZSBzZWUgdGhlIGluc3RydWN0aW9uIHRoYXQgdXNlcyBpdC4gIFRoZXJlZm9yZSwgd2UKLSAgIHdhbnQgdG8gYmUgYWJsZSB0byBjaG9vc2UgdGhlIGZpbmFsIGluc3RydWN0aW9uIHNlcXVlbmNlIG9ubHkgYXQKLSAgIHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSB3YXkgb3RoZXIKLSAgIHBsYXRmb3JtcyBjaG9vc2UgdGhlIHNpemUgb2YgYSBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiBvbmx5IGF0IHRoZQotICAgZW5kIG9mIGFzc2VtYmx5LgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSB3ZSBkbyBub3QgdXNlIEdQCi0gICBhZGRyZXNzaW5nIGluIHF1aXRlIHRoZSBzYW1lIHdheSwgYnV0IHRoZSBpc3N1ZSBzdGlsbCBhcmlzZXMgYXMKLSAgIGV4dGVybmFsIHN5bWJvbHMgYW5kIGxvY2FsIHN5bWJvbHMgbXVzdCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LgotCi0gICBXZSBoYW5kbGUgdGhlc2UgaXNzdWVzIGJ5IGFjdHVhbGx5IGdlbmVyYXRpbmcgYm90aCBwb3NzaWJsZQotICAgaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzLiAgVGhlIGxvbmdlciBvbmUgaXMgcHV0IGluIGEgZnJhZ192YXIgd2l0aAotICAgdHlwZSByc19tYWNoaW5lX2RlcGVuZGVudC4gIFdlIGVuY29kZSB3aGF0IHRvIGRvIHdpdGggdGhlIGZyYWcgaW4KLSAgIHRoZSBzdWJ0eXBlIGZpZWxkLiAgV2UgZW5jb2RlICgxKSB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIGJ5dGVzIHRvCi0gICByZXBsYWNlLCAoMikgdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgdG8gdXNlLCAoMykgdGhlIG9mZnNldCBmcm9tCi0gICB0aGUgc3RhcnQgb2YgdGhlIGV4aXN0aW5nIGJ5dGVzIHRvIHRoZSBmaXJzdCByZWxvYyB3ZSBtdXN0IGdlbmVyYXRlCi0gICAodGhhdCBpcywgdGhlIG9mZnNldCBpcyBhcHBsaWVkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBleGlzdGluZwotICAgYnl0ZXMgYWZ0ZXIgdGhleSBhcmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBieXRlcywgaWYgYW55KSwgKDQpIHRoZQotICAgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBleGlzdGluZyBieXRlcyB0byB0aGUgc2Vjb25kIHJlbG9jLAotICAgKDUpIHdoZXRoZXIgYSB0aGlyZCByZWxvYyBpcyBuZWVkZWQgKHRoZSB0aGlyZCByZWxvYyBpcyBhbHdheXMgZm91cgotICAgYnl0ZXMgYWZ0ZXIgdGhlIHNlY29uZCByZWxvYyksIGFuZCAoNikgd2hldGhlciB0byB3YXJuIGlmIHRoaXMKLSAgIHZhcmlhbnQgaXMgdXNlZCAodGhpcyBpcyBzb21ldGltZXMgbmVlZGVkIGlmIC5zZXQgbm9tYWNybyBvciAuc2V0Ci0gICBub2F0IGlzIGluIGVmZmVjdCkuICBBbGwgdGhlc2UgbnVtYmVycyBhcmUgcmVhc29uYWJseSBzbWFsbC4KLQotICAgR2VuZXJhdGluZyB0d28gaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzIG11c3QgYmUgaGFuZGxlZCBjYXJlZnVsbHkgdG8KLSAgIGVuc3VyZSB0aGF0IGRlbGF5IHNsb3RzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4gIEZvcnR1bmF0ZWx5LCB0aGVyZQotICAgYXJlIGEgbGltaXRlZCBudW1iZXIgb2YgY2FzZXMuICBXaGVuIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24KLSAgIHNlcXVlbmNlIGlzIGdlbmVyYXRlZCwgYXBwZW5kX2luc24gaXMgZGlyZWN0ZWQgdG8gbWFpbnRhaW4gdGhlCi0gICBleGlzdGluZyBkZWxheSBzbG90IGluZm9ybWF0aW9uLCBzbyBpdCBjb250aW51ZXMgdG8gYXBwbHkgdG8gYW55Ci0gICBjb2RlIGFmdGVyIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UuICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICBzZWNvbmQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgbXVzdCBub3QgaW1wb3NlIGFueSByZXF1aXJlbWVudHMgbm90Ci0gICByZXF1aXJlZCBieSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UuCi0KLSAgIFRoZXNlIHZhcmlhbnQgZnJhZ3MgYXJlIHRoZW4gaGFuZGxlZCBpbiBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZQotICAgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlLiAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggcmV0dXJucwotICAgdGhlIGZpbmFsIHNpemUgb2YgdGhlIGZyYWcuICBtZF9jb252ZXJ0X2ZyYWcgc2V0cyB1cCB0aGUgZmluYWwgZm9ybQotICAgb2YgdGhlIGZyYWcuICB0Y19nZW5fcmVsb2MgYWRqdXN0IHRoZSBmaXJzdCByZWxvYyBhbmQgYWRkcyBhIHNlY29uZAotICAgb25lIGlmIG5lZWRlZC4gICovCi0jZGVmaW5lIFJFTEFYX0VOQ09ERShvbGQsIG5ldywgcmVsb2MxLCByZWxvYzIsIHJlbG9jMywgd2FybikgXAotICAoKHJlbGF4X3N1YnN0YXRlVCkgXAotICAgKCgob2xkKSA8PCAyMykgXAotICAgIHwgKChuZXcpIDw8IDE2KSBcCi0gICAgfCAoKChyZWxvYzEpICsgNjQpIDw8IDkpIFwKLSAgICB8ICgoKHJlbG9jMikgKyA2NCkgPDwgMikgXAotICAgIHwgKChyZWxvYzMpID8gKDEgPDwgMSkgOiAwKSBcCi0gICAgfCAoKHdhcm4pID8gMSA6IDApKSkKLSNkZWZpbmUgUkVMQVhfT0xEKGkpICgoKGkpID4+IDIzKSAmIDB4N2YpCi0jZGVmaW5lIFJFTEFYX05FVyhpKSAoKChpKSA+PiAxNikgJiAweDdmKQotI2RlZmluZSBSRUxBWF9SRUxPQzEoaSkgKChiZmRfdm1hKSgoKGkpID4+IDkpICYgMHg3ZikgLSA2NCkKLSNkZWZpbmUgUkVMQVhfUkVMT0MyKGkpICgoYmZkX3ZtYSkoKChpKSA+PiAyKSAmIDB4N2YpIC0gNjQpCi0jZGVmaW5lIFJFTEFYX1JFTE9DMyhpKSAoKChpKSA+PiAxKSAmIDEpCi0jZGVmaW5lIFJFTEFYX1dBUk4oaSkgKChpKSAmIDEpCi0KLS8qIEZvciBtaXBzMTYgY29kZSwgd2UgdXNlIGFuIGVudGlyZWx5IGRpZmZlcmVudCBmb3JtIG9mIHJlbGF4YXRpb24uCi0gICBtaXBzMTYgc3VwcG9ydHMgdHdvIHZlcnNpb25zIG9mIG1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIHRha2UKLSAgIGltbWVkaWF0ZSB2YWx1ZXM6IGEgc21hbGwgb25lIHdoaWNoIHRha2VzIHNvbWUgc21hbGwgdmFsdWUsIGFuZCBhCi0gICBsYXJnZXIgb25lIHdoaWNoIHRha2VzIGEgMTYgYml0IHZhbHVlLiAgU2luY2UgYnJhbmNoZXMgYWxzbyBmb2xsb3cKLSAgIHRoaXMgcGF0dGVybiwgcmVsYXhpbmcgdGhlc2UgdmFsdWVzIGlzIHJlcXVpcmVkLgotCi0gICBXZSBjYW4gYXNzZW1ibGUgYm90aCBtaXBzMTYgYW5kIG5vcm1hbCBNSVBTIGNvZGUgaW4gYSBzaW5nbGUKLSAgIG9iamVjdC4gIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBzdXBwb3J0IHRoaXMgdHlwZSBvZiByZWxheGF0aW9uIGF0Ci0gICB0aGUgc2FtZSB0aW1lIHRoYXQgd2Ugc3VwcG9ydCB0aGUgcmVsYXhhdGlvbiBkZXNjcmliZWQgYWJvdmUuICBXZQotICAgdXNlIHRoZSBoaWdoIGJpdCBvZiB0aGUgc3VidHlwZSBmaWVsZCB0byBkaXN0aW5ndWlzaCB0aGVzZSBjYXNlcy4KLQotICAgVGhlIGluZm9ybWF0aW9uIHdlIHN0b3JlIGZvciB0aGlzIHR5cGUgb2YgcmVsYXhhdGlvbiBpcyB0aGUKLSAgIGFyZ3VtZW50IGNvZGUgZm91bmQgaW4gdGhlIG9wY29kZSBmaWxlIGZvciB0aGlzIHJlbG9jYXRpb24sIHdoZXRoZXIKLSAgIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGEgc21hbGwgb3IgZXh0ZW5kZWQgZm9ybSwgYW5kIHdoZXRoZXIKLSAgIHRoZSByZWxvY2F0aW9uIGlzIGluIGEganVtcCBvciBqYWwgZGVsYXkgc2xvdC4gIFRoYXQgdGVsbHMgdXMgdGhlCi0gICBzaXplIG9mIHRoZSB2YWx1ZSwgYW5kIGhvdyBpdCBzaG91bGQgYmUgc3RvcmVkLiAgV2UgYWxzbyBzdG9yZQotICAgd2hldGhlciB0aGUgZnJhZ21lbnQgaXMgY29uc2lkZXJlZCB0byBiZSBleHRlbmRlZCBvciBub3QuICBXZSBhbHNvCi0gICBzdG9yZSB3aGV0aGVyIHRoaXMgaXMga25vd24gdG8gYmUgYSBicmFuY2ggdG8gYSBkaWZmZXJlbnQgc2VjdGlvbiwKLSAgIHdoZXRoZXIgd2UgaGF2ZSB0cmllZCB0byByZWxheCB0aGlzIGZyYWcgeWV0LCBhbmQgd2hldGhlciB3ZSBoYXZlCi0gICBldmVyIGV4dGVuZGVkIGEgUEMgcmVsYXRpdmUgZnJhZ21lbnQgYmVjYXVzZSBvZiBhIHNoaWZ0IGNvdW50LiAgKi8KLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0VOQ09ERSh0eXBlLCBzbWFsbCwgZXh0LCBkc2xvdCwgamFsX2RzbG90KQlcCi0gICgweDgwMDAwMDAwCQkJCQkJCVwKLSAgIHwgKCh0eXBlKSAmIDB4ZmYpCQkJCQkJXAotICAgfCAoKHNtYWxsKSA/IDB4MTAwIDogMCkJCQkJCVwKLSAgIHwgKChleHQpID8gMHgyMDAgOiAwKQkJCQkJXAotICAgfCAoKGRzbG90KSA/IDB4NDAwIDogMCkJCQkJCVwKLSAgIHwgKChqYWxfZHNsb3QpID8gMHg4MDAgOiAwKSkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1AoaSkgKCgoaSkgJiAweDgwMDAwMDAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfVFlQRShpKSAoKGkpICYgMHhmZikKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1VTRVJfU01BTEwoaSkgKCgoaSkgJiAweDEwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1VTRVJfRVhUKGkpICgoKGkpICYgMHgyMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9EU0xPVChpKSAoKChpKSAmIDB4NDAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfSkFMX0RTTE9UKGkpICgoKGkpICYgMHg4MDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9FWFRFTkRFRChpKSAoKChpKSAmIDB4MTAwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X01BUktfRVhURU5ERUQoaSkgKChpKSB8IDB4MTAwMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEKGkpICgoaSkgJn4gMHgxMDAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfTE9OR19CUkFOQ0goaSkgKCgoaSkgJiAweDIwMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIKGkpICgoaSkgfCAweDIwMDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9DTEVBUl9MT05HX0JSQU5DSChpKSAoKGkpICZ+IDB4MjAwMCkKLQwKLS8qIFByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSNkZWZpbmUgaW50ZXJuYWxFcnJvcigpIFwKLSAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgRXJyb3IsIGxpbmUgJWQsICVzIiksIF9fTElORV9fLCBfX0ZJTEVfXykKLSNlbHNlCi0jZGVmaW5lIGludGVybmFsRXJyb3IoKSBhc19mYXRhbCAoXygiTUlQUyBpbnRlcm5hbCBFcnJvciIpKTsKLSNlbmRpZgotCi1lbnVtIG1pcHNfcmVnY2xhc3MgeyBNSVBTX0dSX1JFRywgTUlQU19GUF9SRUcsIE1JUFMxNl9SRUcgfTsKLQotc3RhdGljIGludCBpbnNuX3VzZXNfcmVnIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKmlwLAotCQkJCSAgdW5zaWduZWQgaW50IHJlZywgZW51bSBtaXBzX3JlZ2NsYXNzIGNsYXNzKSk7Ci1zdGF0aWMgaW50IHJlZ19uZWVkc19kZWxheSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1pcHMxNl9tYXJrX2xhYmVscyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBhcHBlbmRfaW5zbiBQQVJBTVMgKChjaGFyICpwbGFjZSwKLQkJCQkgc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwLAotCQkJCSBleHByZXNzaW9uUyAqIHAsCi0JCQkJIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByLAotCQkJCSBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX25vX3ByZXZfaW5zbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1pcHNfZW1pdF9kZWxheXMgUEFSQU1TICgoYm9vbGVhbikpOwotI2lmZGVmIFVTRV9TVERBUkcKLXN0YXRpYyB2b2lkIG1hY3JvX2J1aWxkIFBBUkFNUyAoKGNoYXIgKnBsYWNlLCBpbnQgKmNvdW50ZXIsIGV4cHJlc3Npb25TICogZXAsCi0JCQkJIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmZtdCwKLQkJCQkgLi4uKSk7Ci0jZWxzZQotc3RhdGljIHZvaWQgbWFjcm9fYnVpbGQgKCk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIG1pcHMxNl9tYWNyb19idWlsZCBQQVJBTVMgKChjaGFyICosIGludCAqLCBleHByZXNzaW9uUyAqLAotCQkJCQljb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJdmFfbGlzdCkpOwotc3RhdGljIHZvaWQgbWFjcm9fYnVpbGRfbHVpIFBBUkFNUyAoKGNoYXIgKnBsYWNlLCBpbnQgKmNvdW50ZXIsCi0JCQkJICAgICBleHByZXNzaW9uUyAqIGVwLCBpbnQgcmVnbnVtKSk7Ci1zdGF0aWMgdm9pZCBzZXRfYXQgUEFSQU1TICgoaW50ICpjb3VudGVyLCBpbnQgcmVnLCBpbnQgdW5zaWduZWRwKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19hYnNvbHV0ZV9leHByIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCwKLQkJCQkJIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIGxvYWRfcmVnaXN0ZXIgUEFSQU1TICgoaW50ICosIGludCwgZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBsb2FkX2FkZHJlc3MgUEFSQU1TICgoaW50ICpjb3VudGVyLCBpbnQgcmVnLCBleHByZXNzaW9uUyAqZXApKTsKLXN0YXRpYyB2b2lkIG1hY3JvIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotc3RhdGljIHZvaWQgbWlwczE2X21hY3JvIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotI2lmZGVmIExPU0lOR19DT01QSUxFUgotc3RhdGljIHZvaWQgbWFjcm8yIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBtaXBzX2lwIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci1zdGF0aWMgdm9pZCBtaXBzMTZfaXAgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXApKTsKLXN0YXRpYyB2b2lkIG1pcHMxNl9pbW1lZCBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgaW50LCBvZmZzZXRULCBib29sZWFuLAotCQkJCSAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgbG9uZyAqLAotCQkJCSAgYm9vbGVhbiAqLCB1bnNpZ25lZCBzaG9ydCAqKSk7Ci1zdGF0aWMgaW50IG15X2dldFNtYWxsRXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqIGVwLCBjaGFyICpzdHIpKTsKLXN0YXRpYyB2b2lkIG15X2dldEV4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiBlcCwgY2hhciAqc3RyKSk7Ci1zdGF0aWMgc3ltYm9sUyAqZ2V0X3N5bWJvbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2FsaWduIFBBUkFNUyAoKGludCB0bywgaW50IGZpbGwsIHN5bWJvbFMgKmxhYmVsKSk7Ci1zdGF0aWMgdm9pZCBzX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jaGFuZ2Vfc2VjIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX2dsb2JsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19vcHRpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNzZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FiaWNhbGxzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jcGxvYWQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NwcmVzdG9yZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZ3B3b3JkIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jcGFkZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfaW5zbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1kX29ial9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBtZF9vYmpfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBsb25nIGdldF9udW1iZXIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc19taXBzX2VudCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19lbmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfZnJhbWUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfbWFzayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19zdGFiIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX3dlYWtleHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2ZpbGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IG1pcHMxNl9leHRlbmRlZF9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGFzZWN0aW9uICosIGxvbmcpKTsKLQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX21pcHNfaW5zbiBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKikpOwotDAotLyogUHNldWRvLW9wIHRhYmxlLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rCi0gICBzaG91bGQgYmUgZGVmaW5lZCBoZXJlLCBidXQgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZDogLmFsaWFzLAotICAgLmdhbGl2ZSwgLmdqYWxkZWYsIC5nanJsaXZlLCAubGl2ZXJlZywgLm5vYWxpYXMuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sgYXJlCi0gICBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmVpbmcgZ2VuZXJhdGVkLCBhbmQKLSAgIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHRoZSBvYmplY3QgZm9ybWF0OiAuYWVudCwgLmJlZ2luLCAuYmVuZCwKLSAgIC5iZ25iLCAuZW5kLCAuZW5kYiwgLmVudCwgLmZtYXNrLCAuZnJhbWUsIC5sb2MsIC5tYXNrLCAudmVyc3RhbXAsCi0gICAudnJlZy4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKLSAgIG5vdCBNSVBTIENQVSBzcGVjaWZpYywgYnV0IGFyZSBhbHNvIG5vdCBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUKLSAgIGZvcm1hdC4gIFRoaXMgZmlsZSBpcyBwcm9iYWJseSB0aGUgYmVzdCBwbGFjZSB0byBkZWZpbmUgdGhlbSwgYnV0Ci0gICB0aGV5IGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZDogLmFzbTAsIC5lbmRyLCAubGFiLCAucmVwZWF0LAotICAgLnN0cnVjdC4gICovCi0KLXN0YXRpYyBjb25zdCBwc2V1ZG9fdHlwZVMgbWlwc19wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gLyogTUlQUyBzcGVjaWZpYyBwc2V1ZG8tb3BzLiAgKi8KLSAgeyJvcHRpb24iLCBzX29wdGlvbiwgMH0sCi0gIHsic2V0Iiwgc19taXBzc2V0LCAwfSwKLSAgeyJyZGF0YSIsIHNfY2hhbmdlX3NlYywgJ3InfSwKLSAgeyJzZGF0YSIsIHNfY2hhbmdlX3NlYywgJ3MnfSwKLSAgeyJsaXZlcmVnIiwgc19pZ25vcmUsIDB9LAotICB7ImFiaWNhbGxzIiwgc19hYmljYWxscywgMH0sCi0gIHsiY3Bsb2FkIiwgc19jcGxvYWQsIDB9LAotICB7ImNwcmVzdG9yZSIsIHNfY3ByZXN0b3JlLCAwfSwKLSAgeyJncHdvcmQiLCBzX2dwd29yZCwgMH0sCi0gIHsiY3BhZGQiLCBzX2NwYWRkLCAwfSwKLSAgeyJpbnNuIiwgc19pbnNuLCAwfSwKLQotIC8qIFJlbGF0aXZlbHkgZ2VuZXJpYyBwc2V1ZG8tb3BzIHRoYXQgaGFwcGVuIHRvIGJlIHVzZWQgb24gTUlQUwotICAgICBjaGlwcy4gICovCi0gIHsiYXNjaWl6Iiwgc3RyaW5nZXIsIDF9LAotICB7ImJzcyIsIHNfY2hhbmdlX3NlYywgJ2InfSwKLSAgeyJlcnIiLCBzX2VyciwgMH0sCi0gIHsiaGFsZiIsIHNfY29ucywgMX0sCi0gIHsiZHdvcmQiLCBzX2NvbnMsIDN9LAotICB7IndlYWtleHQiLCBzX21pcHNfd2Vha2V4dCwgMH0sCi0KLSAvKiBUaGVzZSBwc2V1ZG8tb3BzIGFyZSBkZWZpbmVkIGluIHJlYWQuYywgYnV0IG11c3QgYmUgb3ZlcnJpZGRlbgotICAgICBoZXJlIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuICAqLwotICB7ImFsaWduIiwgc19hbGlnbiwgMH0sCi0gIHsiYnl0ZSIsIHNfY29ucywgMH0sCi0gIHsiZGF0YSIsIHNfY2hhbmdlX3NlYywgJ2QnfSwKLSAgeyJkb3VibGUiLCBzX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmxvYXQiLCBzX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsiZ2xvYmwiLCBzX21pcHNfZ2xvYmwsIDB9LAotICB7Imdsb2JhbCIsIHNfbWlwc19nbG9ibCwgMH0sCi0gIHsiaHdvcmQiLCBzX2NvbnMsIDF9LAotICB7ImludCIsIHNfY29ucywgMn0sCi0gIHsibG9uZyIsIHNfY29ucywgMn0sCi0gIHsib2N0YSIsIHNfY29ucywgNH0sCi0gIHsicXVhZCIsIHNfY29ucywgM30sCi0gIHsic2hvcnQiLCBzX2NvbnMsIDF9LAotICB7InNpbmdsZSIsIHNfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJzdGFibiIsIHNfbWlwc19zdGFiLCAnbid9LAotICB7InRleHQiLCBzX2NoYW5nZV9zZWMsICd0J30sCi0gIHsid29yZCIsIHNfY29ucywgMn0sCi0gIHsgMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBtaXBzX25vbmVjb2ZmX3BzZXVkb190YWJsZVtdID0gewotIC8qIFRoZXNlIHBzZXVkby1vcHMgc2hvdWxkIGJlIGRlZmluZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4KLSAgICBIb3dldmVyLCBhLm91dCBkb2Vzbid0IHN1cHBvcnQgdGhlbSwgc28gd2UgaGF2ZSB2ZXJzaW9ucyBoZXJlLiAgKi8KLSAgeyJhZW50Iiwgc19taXBzX2VudCwgMX0sCi0gIHsiYmduYiIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbmQiLCBzX21pcHNfZW5kLCAwfSwKLSAgeyJlbmRiIiwgc19pZ25vcmUsIDB9LAotICB7ImVudCIsIHNfbWlwc19lbnQsIDB9LAotICB7ImZpbGUiLCBzX2ZpbGUsIDB9LAotICB7ImZtYXNrIiwgc19taXBzX21hc2ssICdGJ30sCi0gIHsiZnJhbWUiLCBzX21pcHNfZnJhbWUsIDB9LAotICB7ImxvYyIsIHNfaWdub3JlLCAwfSwKLSAgeyJtYXNrIiwgc19taXBzX21hc2ssICdSJ30sCi0gIHsidmVyc3RhbXAiLCBzX2lnbm9yZSwgMH0sCi0gIHsgMCB9LAotfTsKLQotZXh0ZXJuIHZvaWQgcG9wX2luc2VydCBQQVJBTVMgKChjb25zdCBwc2V1ZG9fdHlwZVMgKikpOwotCi12b2lkCi1taXBzX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAobWlwc19wc2V1ZG9fdGFibGUpOwotICBpZiAoISBFQ09GRl9ERUJVR0dJTkcpCi0gICAgcG9wX2luc2VydCAobWlwc19ub25lY29mZl9wc2V1ZG9fdGFibGUpOwotfQotDAotLyogU3ltYm9scyBsYWJlbGxpbmcgdGhlIGN1cnJlbnQgaW5zbi4gICovCi0KLXN0cnVjdCBpbnNuX2xhYmVsX2xpc3QKLXsKLSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbmV4dDsKLSAgc3ltYm9sUyAqbGFiZWw7Ci19OwotCi1zdGF0aWMgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqaW5zbl9sYWJlbHM7Ci1zdGF0aWMgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqZnJlZV9pbnNuX2xhYmVsczsKLQotc3RhdGljIHZvaWQgbWlwc19jbGVhcl9pbnNuX2xhYmVscyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKQotewotICByZWdpc3RlciBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICoqcGw7Ci0KLSAgZm9yIChwbCA9ICZmcmVlX2luc25fbGFiZWxzOyAqcGwgIT0gTlVMTDsgcGwgPSAmKCpwbCktPm5leHQpCi0gICAgOwotICAqcGwgPSBpbnNuX2xhYmVsczsKLSAgaW5zbl9sYWJlbHMgPSBOVUxMOwotfQotDAotc3RhdGljIGNoYXIgKmV4cHJfZW5kOwotCi0vKiBFeHByZXNzaW9ucyB3aGljaCBhcHBlYXIgaW4gaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgYXJlIHNldCBieQotICAgbWlwc19pcC4gICovCi0KLXN0YXRpYyBleHByZXNzaW9uUyBpbW1fZXhwcjsKLXN0YXRpYyBleHByZXNzaW9uUyBvZmZzZXRfZXhwcjsKLQotLyogUmVsb2NzIGFzc29jaWF0ZWQgd2l0aCBpbW1fZXhwciBhbmQgb2Zmc2V0X2V4cHIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGltbV9yZWxvYzsKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgb2Zmc2V0X3JlbG9jOwotCi0vKiBUaGlzIGlzIHNldCBieSBtaXBzX2lwIGlmIGltbV9yZWxvYyBpcyBhbiB1bm1hdGNoZWQgSEkxNl9TIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gaW1tX3VubWF0Y2hlZF9oaTsKLQotLyogVGhlc2UgYXJlIHNldCBieSBtaXBzMTZfaXAgaWYgYW4gZXhwbGljaXQgZXh0ZW5zaW9uIGlzIHVzZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBtaXBzMTZfc21hbGwsIG1pcHMxNl9leHQ7Ci0KLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotLyogVGhlIHBkciBzZWdtZW50IGZvciBwZXIgcHJvY2VkdXJlIGZyYW1lL3JlZ21hc2sgaW5mbyAqLwotCi1zdGF0aWMgc2VnVCBwZHJfc2VnOwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gKiBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4KLSAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgYm9vbGVhbiBvayA9IGZhbHNlOwotICByZWdpc3RlciBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0gIGNvbnN0IGNoYXIgKmNwdTsKLSAgY2hhciAqYSA9IE5VTEw7Ci0gIGludCBicm9rZW4gPSAwOwotICBpbnQgbWlwc19pc2FfZnJvbV9jcHU7Ci0KLSAgLyogR1AgcmVsYXRpdmUgc3R1ZmYgbm90IHdvcmtpbmcgZm9yIFBFICovCi0gIGlmIChzdHJuY21wIChUQVJHRVRfT1MsICJwZSIsIDIpID09IDAKLSAgICAgICYmIGdfc3dpdGNoX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgaWYgKGdfc3dpdGNoX3NlZW4pCi0JYXNfYmFkIChfKCItRyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29uZmlndXJhdGlvbi4iKSk7Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IDA7Ci0gICAgfQotCi0gIGNwdSA9IFRBUkdFVF9DUFU7Ci0gIGlmIChzdHJjbXAgKGNwdSArIChzaXplb2YgVEFSR0VUX0NQVSkgLSAzLCAiZWwiKSA9PSAwKQotICAgIHsKLSAgICAgIGEgPSB4bWFsbG9jIChzaXplb2YgVEFSR0VUX0NQVSk7Ci0gICAgICBzdHJjcHkgKGEsIFRBUkdFVF9DUFUpOwotICAgICAgYVsoc2l6ZW9mIFRBUkdFVF9DUFUpIC0gM10gPSAnXDAnOwotICAgICAgY3B1ID0gYTsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfY3B1IDwgMCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbWlwc19jcHUgYmFzZWQgb24gVEFSR0VUX0NQVSwgdW5sZXNzIFRBUkdFVF9DUFUgaXMKLSAgICAgICAgIGp1c3QgdGhlIGdlbmVyaWMgJ21pcHMnLCBpbiB3aGljaCBjYXNlIHNldCBtaXBzX2NwdSBiYXNlZAotICAgICAgICAgb24gdGhlIGdpdmVuIElTQSwgaWYgYW55LiAqLwotCi0gICAgICBpZiAoc3RyY21wIChjcHUsICJtaXBzIikgPT0gMCkKLSAgICAgICAgewotCSAgaWYgKG1pcHNfb3B0cy5pc2EgPCAwKQotCSAgICBtaXBzX2NwdSA9IDMwMDA7ICAgCi0KLQkgIGVsc2UgaWYgKG1pcHNfb3B0cy5pc2EgPT0gMikKLSAgICAgICAgICAgIG1pcHNfY3B1ID0gNjAwMDsKLQotICAgICAgICAgIGVsc2UgaWYgKG1pcHNfb3B0cy5pc2EgPT0gMykKLSAgICAgICAgICAgIG1pcHNfY3B1ID0gNDAwMDsKLQotICAgICAgICAgIGVsc2UgaWYgKG1pcHNfb3B0cy5pc2EgPT0gNCkKLSAgICAgICAgICAgIG1pcHNfY3B1ID0gODAwMDsKLQotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICBtaXBzX2NwdSA9IDMwMDA7Ci0gICAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyMzkwMCIpID09IDAKLSAgICAgICAgICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwc3R4MzkiKSA9PSAwCi0gICAgICAgICAgICAgICApCi0gICAgICAgIG1pcHNfY3B1ID0gMzkwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNjAwMCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzMiIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNjAwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjQiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAicjQwMDAiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczMiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQwMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjQ0MDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQ0MDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0b3Jpb24iKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAicjQ2MDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQ2MDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjQ2NTAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQ2NTA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0dnI0MzAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MzAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NHZyNDExMSIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDExMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjR2cjQxMDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQxMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjQwMTAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQwMTA7Ci0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNTAwMCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzNjR2cjUwMDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDUwMDA7Ci0KLQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI4MDAwIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHM0IikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA4MDAwOwotICAgICAgCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInIxMDAwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gMTAwMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczE2IikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSAwOyAvKiBGSVhNRSAqLwotCi0gICAgICBlbHNlCi0gICAgICAgIG1pcHNfY3B1ID0gMzAwMDsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfY3B1ID09IDMwMDAKLSAgICAgIHx8IG1pcHNfY3B1ID09IDM5MDApCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSAxOwotCi0gIGVsc2UgaWYgKG1pcHNfY3B1ID09IDYwMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0MDEwKQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gMjsKLQotICBlbHNlIGlmIChtaXBzX2NwdSA9PSA0MDAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDEwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQxMTEKLQkgICB8fCBtaXBzX2NwdSA9PSA0NDAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDMwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQ2MDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0NjUwKQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gMzsKLQotICBlbHNlIGlmIChtaXBzX2NwdSA9PSA1MDAwCi0JICAgfHwgbWlwc19jcHUgPT0gODAwMAotICAgICAgICAgICAgICAgfHwgbWlwc19jcHUgPT0gMTAwMDApCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSA0OwotCi0gIGVsc2UKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IC0xOwotCi0gIGlmIChtaXBzX29wdHMuaXNhID09IC0xKQotICAgIHsKLSAgICAgIGlmIChtaXBzX2lzYV9mcm9tX2NwdSAhPSAtMSkKLQltaXBzX29wdHMuaXNhID0gbWlwc19pc2FfZnJvbV9jcHU7Ci0gICAgICBlbHNlCi0JbWlwc19vcHRzLmlzYSA9IDE7Ci0gICAgfQotCi0gIGlmIChtaXBzX29wdHMubWlwczE2IDwgMCkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgIm1pcHMxNiIsIHNpemVvZiAibWlwczE2IiAtIDEpID09IDApCi0JbWlwc19vcHRzLm1pcHMxNiA9IDE7Ci0gICAgICBlbHNlCi0JbWlwc19vcHRzLm1pcHMxNiA9IDA7Ci0gICAgfQotCi0gIC8qIEVuZCBvZiBUQVJHRVRfQ1BVIHByb2Nlc3NpbmcsIGdldCByaWQgb2YgbWFsbG9jZWQgbWVtb3J5Ci0gICAgIGlmIG5lY2Vzc2FyeS4gKi8KLSAgY3B1ID0gTlVMTDsKLSAgaWYgKGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgZnJlZSAoYSk7Ci0gICAgYSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChtaXBzX29wdHMuaXNhID09IDEgJiYgbWlwc190cmFwKQotICAgIGFzX2JhZCAoXygidHJhcCBleGNlcHRpb24gbm90IHN1cHBvcnRlZCBhdCBJU0EgMSIpKTsKLQotICAvKiBTZXQgdGhlIEVBQkkga2luZCBiYXNlZCBvbiB0aGUgSVNBIGJlZm9yZSB0aGUgdXNlciBnZXRzCi0gICAgIHRvIGNoYW5nZSB0aGUgSVNBIHdpdGggZGlyZWN0aXZlcy4gIFRoaXMgaXNuJ3QgcmVhbGx5Ci0gICAgIHRoZSBiZXN0LCBidXQgdGhlbiBuZWl0aGVyIGlzIGJhc2luZyB0aGUgYWJpIG9uIHRoZSBpc2EuICovICAgICAKLSAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkKLSAgICAgICYmIG1pcHNfYWJpX3N0cmluZwotICAgICAgJiYgMCA9PSBzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywiZWFiaSIpKQotICAgIG1pcHNfZWFiaTY0ID0gMTsKLQotICBpZiAobWlwc19jcHUgIT0gMCAmJiBtaXBzX2NwdSAhPSAtMSkKLSAgICB7Ci0gICAgICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIG1pcHNfY3B1KTsKLSAgICAgIAotICAgICAgLyogSWYgdGhleSBhc2tlZCBmb3IgbWlwczEgb3IgbWlwczIgYW5kIGEgY3B1IHRoYXQgaXMKLQkgbWlwczMgb3IgZ3JlYXRlciwgdGhlbiBtYXJrIHRoZSBvYmplY3QgZmlsZSAzMkJJVE1PREUuICovCi0gICAgICBpZiAobWlwc19pc2FfZnJvbV9jcHUgIT0gLTEKLQkgICYmICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSAKLQkgICYmIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19pc2FfZnJvbV9jcHUpKQotCW1pcHNfMzJiaXRtb2RlID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG1pcHNfb3B0cy5pc2EpCi0JewotCWNhc2UgMToKLQkgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgMzAwMCk7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDYwMDApOwotCSAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCA0MDAwKTsKLQkgIGJyZWFrOwotCWNhc2UgNDoKLQkgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgODAwMCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmICghIG9rKQotICAgIGFzX3dhcm4gKF8oIkNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIGZpbGVfbWlwc19pc2EgPSBtaXBzX29wdHMuaXNhOwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNT1BDT0RFUzspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1pcHNfb3Bjb2Rlc1tpXS5uYW1lOwotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgKFBUUikgJm1pcHNfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiksCi0JCSAgIG1pcHNfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgLyogUHJvYmFibHkgYSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtPyAgR2l2ZSB1cCBub3cuICAqLwotCSAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCX0KLSAgICAgIGRvCi0JewotCSAgaWYgKG1pcHNfb3Bjb2Rlc1tpXS5waW5mbyAhPSBJTlNOX01BQ1JPKQotCSAgICB7Ci0JICAgICAgaWYgKCF2YWxpZGF0ZV9taXBzX2luc24gKCZtaXBzX29wY29kZXNbaV0pKQotCQlicm9rZW4gPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKChpIDwgTlVNT1BDT0RFUykgJiYgIXN0cmNtcCAobWlwc19vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKTsKLSAgICB9Ci0KLSAgbWlwczE2X29wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBpID0gMDsKLSAgd2hpbGUgKGkgPCBiZmRfbWlwczE2X251bV9vcGNvZGVzKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtaXBzMTZfb3Bjb2Rlc1tpXS5uYW1lOwotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAobWlwczE2X29wX2hhc2gsIG5hbWUsIChQVFIpICZtaXBzMTZfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JYXNfZmF0YWwgKF8oImludGVybmFsOiBjYW4ndCBoYXNoIGAlcyc6ICVzIiksCi0JCSAgbWlwczE2X29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLSAgICAgIGRvCi0JewotCSAgaWYgKG1pcHMxNl9vcGNvZGVzW2ldLnBpbmZvICE9IElOU05fTUFDUk8KLQkgICAgICAmJiAoKG1pcHMxNl9vcGNvZGVzW2ldLm1hdGNoICYgbWlwczE2X29wY29kZXNbaV0ubWFzaykKLQkJICAhPSBtaXBzMTZfb3Bjb2Rlc1tpXS5tYXRjaCkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBiYWQgbWlwczE2IG9wY29kZTogJXMgJXNcbiIpLAotCQkgICAgICAgbWlwczE2X29wY29kZXNbaV0ubmFtZSwgbWlwczE2X29wY29kZXNbaV0uYXJncyk7Ci0JICAgICAgYnJva2VuID0gMTsKLQkgICAgfQotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChpIDwgYmZkX21pcHMxNl9udW1fb3Bjb2RlcwotCSAgICAgJiYgc3RyY21wIChtaXBzMTZfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSA9PSAwKTsKLSAgICB9Ci0KLSAgaWYgKGJyb2tlbikKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgLyogV2UgYWRkIGFsbCB0aGUgZ2VuZXJhbCByZWdpc3RlciBuYW1lcyB0byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcwotICAgICBoZWxwcyB1cyBkZXRlY3QgaW52YWxpZCB1c2VzIG9mIHRoZW0uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGJ1Zls1XTsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiJCVkIiwgaSk7Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChidWYsIHJlZ19zZWN0aW9uLCBpLAotCQkJCSAgICAgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgICB9Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkZnAiLCByZWdfc2VjdGlvbiwgRlAsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkc3AiLCByZWdfc2VjdGlvbiwgU1AsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkZ3AiLCByZWdfc2VjdGlvbiwgR1AsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkYXQiLCByZWdfc2VjdGlvbiwgQVQsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIka3QwIiwgcmVnX3NlY3Rpb24sIEtUMCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRrdDEiLCByZWdfc2VjdGlvbiwgS1QxLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJHBjIiwgcmVnX3NlY3Rpb24sIC0xLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotCi0gIG1pcHNfbm9fcHJldl9pbnNuIChmYWxzZSk7Ci0KLSAgbWlwc19ncHJtYXNrID0gMDsKLSAgbWlwc19jcHJtYXNrWzBdID0gMDsKLSAgbWlwc19jcHJtYXNrWzFdID0gMDsKLSAgbWlwc19jcHJtYXNrWzJdID0gMDsKLSAgbWlwc19jcHJtYXNrWzNdID0gMDsKLQotICAvKiBzZXQgdGhlIGRlZmF1bHQgYWxpZ25tZW50IGZvciB0aGUgdGV4dCBzZWN0aW9uICgyKioyKSAqLwotICByZWNvcmRfYWxpZ25tZW50ICh0ZXh0X3NlY3Rpb24sIDIpOwotCi0gIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotICAgIGJmZF9zZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0LCBnX3N3aXRjaF92YWx1ZSk7Ci0KLSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICAvKiBPbiBhIG5hdGl2ZSBzeXN0ZW0sIHNlY3Rpb25zIG11c3QgYmUgYWxpZ25lZCB0byAxNiBieXRlCi0JIGJvdW5kYXJpZXMuICBXaGVuIGNvbmZpZ3VyZWQgZm9yIGFuIGVtYmVkZGVkIEVMRiB0YXJnZXQsIHdlCi0JIGRvbid0IGJvdGhlci4gICovCi0gICAgICBpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCXsKLQkgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHRleHRfc2VjdGlvbiwgNCk7Ci0JICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24sIDQpOwotCSAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgYnNzX3NlY3Rpb24sIDQpOwotCX0KLQotICAgICAgLyogQ3JlYXRlIGEgLnJlZ2luZm8gc2VjdGlvbiBmb3IgcmVnaXN0ZXIgbWFza3MgYW5kIGEgLm1kZWJ1ZwotCSBzZWN0aW9uIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgewotCXNlZ1Qgc2VnOwotCXN1YnNlZ1Qgc3Vic2VnOwotCWZsYWd3b3JkIGZsYWdzOwotCXNlZ1Qgc2VjOwotCi0Jc2VnID0gbm93X3NlZzsKLQlzdWJzZWcgPSBub3dfc3Vic2VnOwotCi0JLyogVGhlIEFCSSBzYXlzIHRoaXMgc2VjdGlvbiBzaG91bGQgYmUgbG9hZGVkIHNvIHRoYXQgdGhlCi0JICAgcnVubmluZyBwcm9ncmFtIGNhbiBhY2Nlc3MgaXQuICBIb3dldmVyLCB3ZSBkb24ndCBsb2FkIGl0Ci0JICAgaWYgd2UgYXJlIGNvbmZpZ3VyZWQgZm9yIGFuIGVtYmVkZGVkIHRhcmdldCAqLwotCWZsYWdzID0gU0VDX1JFQURPTkxZIHwgU0VDX0RBVEE7Ci0JaWYgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKLQkgIGZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCi0JaWYgKCEgbWlwc182NCkKLQkgIHsKLQkgICAgc2VjID0gc3Vic2VnX25ldyAoIi5yZWdpbmZvIiwgKHN1YnNlZ1QpIDApOwotCi0KLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VjLCAyKTsKLQkKLSNpZmRlZiBPQkpfRUxGCi0JICAgIG1pcHNfcmVnbWFza19mcmFnID0gZnJhZ19tb3JlIChzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLSNlbmRpZgotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogVGhlIDY0LWJpdCBBQkkgdXNlcyBhIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiByYXRoZXIgdGhhbgotICAgICAgICAgICAgICAgLnJlZ2luZm8gc2VjdGlvbi4gICovCi0JICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIuTUlQUy5vcHRpb25zIiwgKHN1YnNlZ1QpIDApOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywgZmxhZ3MpOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWMsIDMpOwotCi0jaWZkZWYgT0JKX0VMRgotCSAgICAvKiBTZXQgdXAgdGhlIG9wdGlvbiBoZWFkZXIuICAqLwotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX09wdGlvbnMgb3B0aGRyOwotCSAgICAgIGNoYXIgKmY7Ci0KLQkgICAgICBvcHRoZHIua2luZCA9IE9ES19SRUdJTkZPOwotCSAgICAgIG9wdGhkci5zaXplID0gKHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpCi0JCQkgICAgICsgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0JICAgICAgb3B0aGRyLnNlY3Rpb24gPSAwOwotCSAgICAgIG9wdGhkci5pbmZvID0gMDsKLQkgICAgICBmID0gZnJhZ19tb3JlIChzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSk7Ci0JICAgICAgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19vdXQgKHN0ZG91dHB1dCwgJm9wdGhkciwKLQkJCQkJICAgICAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgZik7Ci0KLQkgICAgICBtaXBzX3JlZ21hc2tfZnJhZyA9IGZyYWdfbW9yZSAoc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0JICAgIH0KLSNlbmRpZgotCSAgfQotCi0JaWYgKEVDT0ZGX0RFQlVHR0lORykKLQkgIHsKLQkgICAgc2VjID0gc3Vic2VnX25ldyAoIi5tZGVidWciLCAoc3Vic2VnVCkgMCk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQkgIFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkpOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWMsIDIpOwotCSAgfQotCi0jaWZkZWYgTUlQU19TVEFCU19FTEYKLQlwZHJfc2VnID0gc3Vic2VnX25ldyAoIi5wZHIiLCAoc3Vic2VnVCkgMCk7Ci0JKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBwZHJfc2VnLAotCQkJICAgICBTRUNfUkVBRE9OTFkgfCBTRUNfUkVMT0MgfCBTRUNfREVCVUdHSU5HKTsKLQkodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBwZHJfc2VnLCAyKTsKLSNlbmRpZgotCi0Jc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotICAgICAgfQotICAgIH0KLQotICBpZiAoISBFQ09GRl9ERUJVR0dJTkcpCi0gICAgbWRfb2JqX2JlZ2luICgpOwotfQotCi12b2lkCi1tZF9taXBzX2VuZCAoKQotewotICBpZiAoISBFQ09GRl9ERUJVR0dJTkcpCi0gICAgbWRfb2JqX2VuZCAoKTsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBzdHJ1Y3QgbWlwc19jbF9pbnNuIGluc247Ci0KLSAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotICBpbW1fdW5tYXRjaGVkX2hpID0gZmFsc2U7Ci0gIG9mZnNldF9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQotICBpZiAobWlwc19vcHRzLm1pcHMxNikKLSAgICBtaXBzMTZfaXAgKHN0ciwgJmluc24pOwotICBlbHNlCi0gICAgewotICAgICAgbWlwc19pcCAoc3RyLCAmaW5zbik7Ci0gICAgICBEQkcoKF8oInJldHVybmVkIGZyb20gbWlwc19pcCglcykgaW5zbl9vcGNvZGUgPSAweCV4XG4iKSwgCi0JCXN0ciwgaW5zbi5pbnNuX29wY29kZSkpOwotICAgIH0KLQotICBpZiAoaW5zbl9lcnJvcikKLSAgICB7Ci0gICAgICBhc19iYWQgKCIlcyBgJXMnIiwgaW5zbl9lcnJvciwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc24uaW5zbl9tby0+cGluZm8gPT0gSU5TTl9NQUNSTykKLSAgICB7Ci0gICAgICBpZiAobWlwc19vcHRzLm1pcHMxNikKLQltaXBzMTZfbWFjcm8gKCZpbnNuKTsKLSAgICAgIGVsc2UKLQltYWNybyAoJmluc24pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fYWJzZW50KQotCWFwcGVuZF9pbnNuICgoY2hhciAqKSBOVUxMLCAmaW5zbiwgJmltbV9leHByLCBpbW1fcmVsb2MsCi0JCSAgICAgaW1tX3VubWF0Y2hlZF9oaSk7Ci0gICAgICBlbHNlIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fYWJzZW50KQotCWFwcGVuZF9pbnNuICgoY2hhciAqKSBOVUxMLCAmaW5zbiwgJm9mZnNldF9leHByLCBvZmZzZXRfcmVsb2MsIGZhbHNlKTsKLSAgICAgIGVsc2UKLQlhcHBlbmRfaW5zbiAoKGNoYXIgKikgTlVMTCwgJmluc24sIE5VTEwsIEJGRF9SRUxPQ19VTlVTRUQsIGZhbHNlKTsKLSAgICB9Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGluc3RydWN0aW9uIElQIHJlYWRzIHJlZ2lzdGVyIFJFRy4gIENMQVNTIGlzIHRoZSB0eXBlCi0gICBvZiByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBpbnQKLWluc25fdXNlc19yZWcgKGlwLCByZWcsIGNsYXNzKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLSAgICAgZW51bSBtaXBzX3JlZ2NsYXNzIGNsYXNzOwotewotICBpZiAoY2xhc3MgPT0gTUlQUzE2X1JFRykKLSAgICB7Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5taXBzMTYpOwotICAgICAgcmVnID0gbWlwczE2X3RvXzMyX3JlZ19tYXBbcmVnXTsKLSAgICAgIGNsYXNzID0gTUlQU19HUl9SRUc7Ci0gICAgfQotCi0gIC8qIERvbid0IHJlcG9ydCBvbiBnZW5lcmFsIHJlZ2lzdGVyIDAsIHNpbmNlIGl0IG5ldmVyIGNoYW5nZXMuICAqLwotICBpZiAoY2xhc3MgPT0gTUlQU19HUl9SRUcgJiYgcmVnID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGNsYXNzID09IE1JUFNfRlBfUkVHKQotICAgIHsKLSAgICAgIGFzc2VydCAoISBtaXBzX29wdHMubWlwczE2KTsKLSAgICAgIC8qIElmIHdlIGFyZSBjYWxsZWQgd2l0aCBlaXRoZXIgJGYwIG9yICRmMSwgd2UgbXVzdCBjaGVjayAkZjAuCi0JIFRoaXMgaXMgbm90IG9wdGltYWwsIGJlY2F1c2UgaXQgd2lsbCBpbnRyb2R1Y2UgYW4gdW5uZWNlc3NhcnkKLQkgTk9QIGJldHdlZW4gImx3YzEgJGYwIiBhbmQgInN3YzEgJGYxIi4gIFRvIGZpeCB0aGlzIHdlIHdvdWxkCi0JIG5lZWQgdG8gZGlzdGluZ3Vpc2ggcmVhZGluZyBib3RoICRmMCBhbmQgJGYxIG9yIGp1c3Qgb25lIG9mCi0JIHRoZW0uICBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGUgb3RoZXIgd2F5LAotCSBiZWNhdXNlIHRoZXJlIGlzIG5vIGluc3RydWN0aW9uIHRoYXQgc2V0cyBib3RoICRmMCBhbmQgJGYxCi0JIGFuZCByZXF1aXJlcyBhIGRlbGF5LiAgKi8KLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0ZQUl9TKQotCSAgJiYgKCgoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GUykgJiBPUF9NQVNLX0ZTKSAmfih1bnNpZ25lZCkxKQotCSAgICAgID09IChyZWcgJn4gKHVuc2lnbmVkKSAxKSkpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9GUFJfVCkKLQkgICYmICgoKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlQpICYgT1BfTUFTS19GVCkgJn4odW5zaWduZWQpMSkKLQkgICAgICA9PSAocmVnICZ+ICh1bnNpZ25lZCkgMSkpKQotCXJldHVybiAxOwotICAgIH0KLSAgZWxzZSBpZiAoISBtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0dQUl9TKQotCSAgJiYgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUlMpICYgT1BfTUFTS19SUykgPT0gcmVnKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfR1BSX1QpCi0JICAmJiAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKSA9PSByZWcpCi0JcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1gpCi0JICAmJiAobWlwczE2X3RvXzMyX3JlZ19tYXBbKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlgpCi0JCQkJICAgICYgTUlQUzE2T1BfTUFTS19SWCldCi0JICAgICAgPT0gcmVnKSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9ZKQotCSAgJiYgKG1pcHMxNl90b18zMl9yZWdfbWFwWygoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JZKQotCQkJCSAgICAmIE1JUFMxNk9QX01BU0tfUlkpXQotCSAgICAgID09IHJlZykpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWikKLQkgICYmIChtaXBzMTZfdG9fMzJfcmVnX21hcFsoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9NT1ZFMzJaKQotCQkJCSAgICAmIE1JUFMxNk9QX01BU0tfTU9WRTMyWildCi0JICAgICAgPT0gcmVnKSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9UKSAmJiByZWcgPT0gVFJFRykKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9TUCkgJiYgcmVnID09IFNQKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEXzMxKSAmJiByZWcgPT0gUkEpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfR1BSX1gpCi0JICAmJiAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SRUdSMzIpCi0JICAgICAgJiBNSVBTMTZPUF9NQVNLX1JFR1IzMikgPT0gcmVnKQotCXJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgbW9kaWZ5aW5nIGEgcmVnaXN0ZXIgcmVxdWlyZXMgYQotICAgZGVsYXkuICAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmVlZHNfZGVsYXkgKHJlZykKLSAgICAgaW50IHJlZzsKLXsKLSAgdW5zaWduZWQgbG9uZyBwcmV2X3BpbmZvOwotCi0gIHByZXZfcGluZm8gPSBwcmV2X2luc24uaW5zbl9tby0+cGluZm87Ci0gIGlmICghIG1pcHNfb3B0cy5ub3Jlb3JkZXIKLSAgICAgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLSAgICAgICYmICgocHJldl9waW5mbyAmIElOU05fTE9BRF9DT1BST0NfREVMQVkpCi0JICB8fCAoISBncHJfaW50ZXJsb2NrcwotCSAgICAgICYmIChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpKSkKLSAgICB7Ci0gICAgICAvKiBBIGxvYWQgZnJvbSBhIGNvcHJvY2Vzc29yIG9yIGZyb20gbWVtb3J5LiAgQWxsIGxvYWQKLQkgZGVsYXlzIGRlbGF5IHRoZSB1c2Ugb2YgZ2VuZXJhbCByZWdpc3RlciBydCBmb3Igb25lCi0JIGluc3RydWN0aW9uIG9uIHRoZSByMzAwMC4gIFRoZSByNjAwMCBhbmQgcjQwMDAgdXNlCi0JIGludGVybG9ja3MuICAqLwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAga25vdyAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX1QpOwotICAgICAgaWYgKHJlZyA9PSAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKSkKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE1hcmsgaW5zdHJ1Y3Rpb24gbGFiZWxzIGluIG1pcHMxNiBtb2RlLiAgVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgdG8KLSAgIGhhbmRsZSB0aGVtIHNwZWNpYWxseSwgc3VjaCBhcyBnZW5lcmF0aW5nIGphbHggaW5zdHJ1Y3Rpb25zIHdoZW4KLSAgIG5lZWRlZC4gIFdlIGFsc28gbWFrZSB0aGVtIG9kZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBhc3NlbWJseSwgaW4KLSAgIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSByaWdodCBzb3J0IG9mIGNvZGUuICBXZSB3aWxsIG1ha2UgdGhlbSBldmVuCi0gICBpbiB0aGUgYWRqdXN0X3N5bXRhYiByb3V0aW5lLCB3aGlsZSBsZWF2aW5nIHRoZW0gbWFya2VkLiAgVGhpcyBpcwotICAgY29udmVuaWVudCBmb3IgdGhlIGRlYnVnZ2VyIGFuZCB0aGUgZGlzYXNzZW1ibGVyLiAgVGhlIGxpbmtlciBrbm93cwotICAgdG8gbWFrZSB0aGVtIG9kZCBhZ2Fpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzMTZfbWFya19sYWJlbHMgKCkKLXsKLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0gICAgewotICAgICAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotICAgICAgZm9yIChsID0gaW5zbl9sYWJlbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JewotI2lmZGVmIE9CSl9FTEYKLQkgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIFNfU0VUX09USEVSIChsLT5sYWJlbCwgU1RPX01JUFMxNik7Ci0jZW5kaWYKLQkgIGlmICgoU19HRVRfVkFMVUUgKGwtPmxhYmVsKSAmIDEpID09IDApCi0JICAgIFNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgU19HRVRfVkFMVUUgKGwtPmxhYmVsKSArIDEpOwotCX0KLSAgICB9Ci19Ci0KLS8qIE91dHB1dCBhbiBpbnN0cnVjdGlvbi4gIFBMQUNFIGlzIHdoZXJlIHRvIHB1dCB0aGUgaW5zdHJ1Y3Rpb247IGlmCi0gICBpdCBpcyBOVUxMLCB0aGlzIHVzZXMgZnJhZ19tb3JlIHRvIGdldCByb29tLiAgSVAgaXMgdGhlIGluc3RydWN0aW9uCi0gICBpbmZvcm1hdGlvbi4gIEFERFJFU1NfRVhQUiBpcyBhbiBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZQotICAgdXNlZCB3aXRoIFJFTE9DX1RZUEUuICAqLwotCi1zdGF0aWMgdm9pZAotYXBwZW5kX2luc24gKHBsYWNlLCBpcCwgYWRkcmVzc19leHByLCByZWxvY190eXBlLCB1bm1hdGNoZWRfaGkpCi0gICAgIGNoYXIgKnBsYWNlOwotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLSAgICAgZXhwcmVzc2lvblMgKmFkZHJlc3NfZXhwcjsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7Ci0gICAgIGJvb2xlYW4gdW5tYXRjaGVkX2hpOwotewotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHByZXZfcGluZm8sIHBpbmZvOwotICBjaGFyICpmOwotICBmaXhTICpmaXhwOwotICBpbnQgbm9wcyA9IDA7Ci0KLSAgLyogTWFyayBpbnN0cnVjdGlvbiBsYWJlbHMgaW4gbWlwczE2IG1vZGUuICAqLwotICBpZiAobWlwc19vcHRzLm1pcHMxNikKLSAgICBtaXBzMTZfbWFya19sYWJlbHMgKCk7Ci0KLSAgcHJldl9waW5mbyA9IHByZXZfaW5zbi5pbnNuX21vLT5waW5mbzsKLSAgcGluZm8gPSBpcC0+aW5zbl9tby0+cGluZm87Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwgJiYgKCEgbWlwc19vcHRzLm5vcmVvcmRlciB8fCBwcmV2X25vcF9mcmFnICE9IE5VTEwpKQotICAgIHsKLSAgICAgIGludCBwcmV2X3ByZXZfbm9wOwotCi0gICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zbiByZXF1aXJlZCBhbnkgZGVsYXkgc2xvdHMsIHNlZSBpZiB3ZSBuZWVkCi0JIHRvIGluc2VydCBhIE5PUCBvciB0d28uICBUaGVyZSBhcmUgZWlnaHQga2luZHMgb2YgcG9zc2libGUKLQkgaGF6YXJkcywgb2Ygd2hpY2ggYW4gaW5zdHJ1Y3Rpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgdHlwZS4KLQkgKDEpIGEgbG9hZCBmcm9tIG1lbW9yeSBkZWxheQotCSAoMikgYSBsb2FkIGZyb20gYSBjb3Byb2Nlc3NvciBkZWxheQotCSAoMykgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggZGVsYXkKLQkgKDQpIGEgY29uZGl0aW9uYWwgYnJhbmNoIGRlbGF5Ci0JICg1KSBhIG1vdmUgdG8gY29wcm9jZXNzb3IgcmVnaXN0ZXIgZGVsYXkKLQkgKDYpIGEgbG9hZCBjb3Byb2Nlc3NvciByZWdpc3RlciBmcm9tIG1lbW9yeSBkZWxheQotCSAoNykgYSBjb3Byb2Nlc3NvciBjb25kaXRpb24gY29kZSBkZWxheQotCSAoOCkgYSBISS9MTyBzcGVjaWFsIHJlZ2lzdGVyIGRlbGF5Ci0KLQkgVGhlcmUgYXJlIGEgbG90IG9mIG9wdGltaXphdGlvbnMgd2UgY291bGQgZG8gdGhhdCB3ZSBkb24ndC4KLQkgSW4gcGFydGljdWxhciwgd2UgZG8gbm90LCBpbiBnZW5lcmFsLCByZW9yZGVyIGluc3RydWN0aW9ucy4KLQkgSWYgeW91IHVzZSBnY2Mgd2l0aCBvcHRpbWl6YXRpb24sIGl0IHdpbGwgcmVvcmRlcgotCSBpbnN0cnVjdGlvbnMgYW5kIGdlbmVyYWxseSBkbyBtdWNoIG1vcmUgb3B0aW1pemF0aW9uIHRoZW4gd2UKLQkgZG8gaGVyZTsgcmVwZWF0aW5nIGFsbCB0aGF0IHdvcmsgaW4gdGhlIGFzc2VtYmxlciB3b3VsZCBvbmx5Ci0JIGJlbmVmaXQgaGFuZCB3cml0dGVuIGFzc2VtYmx5IGNvZGUsIGFuZCBkb2VzIG5vdCBzZWVtIHdvcnRoCi0JIGl0LiAgKi8KLQotICAgICAgLyogVGhpcyBpcyBob3cgYSBOT1AgaXMgZW1pdHRlZC4gICovCi0jZGVmaW5lIGVtaXRfbm9wKCkJCQkJCVwKLSAgKG1pcHNfb3B0cy5taXBzMTYJCQkJCVwKLSAgID8gbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnX21vcmUgKDIpLCAweDY1MDAsIDIpCVwKLSAgIDogbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnX21vcmUgKDQpLCAwLCA0KSkKLQotICAgICAgLyogVGhlIHByZXZpb3VzIGluc24gbWlnaHQgcmVxdWlyZSBhIGRlbGF5IHNsb3QsIGRlcGVuZGluZyB1cG9uCi0JIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBpbnNuLiAgKi8KLSAgICAgIGlmICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkgICYmICgoKHByZXZfcGluZm8gJiBJTlNOX0xPQURfQ09QUk9DX0RFTEFZKQotICAgICAgICAgICAgICAgJiYgISBjb3BfaW50ZXJsb2NrcykKLQkgICAgICB8fCAoISBncHJfaW50ZXJsb2NrcwotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpKSkKLQl7Ci0JICAvKiBBIGxvYWQgZnJvbSBhIGNvcHJvY2Vzc29yIG9yIGZyb20gbWVtb3J5LiAgQWxsIGxvYWQKLQkgICAgIGRlbGF5cyBkZWxheSB0aGUgdXNlIG9mIGdlbmVyYWwgcmVnaXN0ZXIgcnQgZm9yIG9uZQotCSAgICAgaW5zdHJ1Y3Rpb24gb24gdGhlIHIzMDAwLiAgVGhlIHI2MDAwIGFuZCByNDAwMCB1c2UKLQkgICAgIGludGVybG9ja3MuICAqLwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIGtub3cgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKTsKLQkgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkgICAgICB8fCBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCQkgJiBPUF9NQVNLX1JUKSwKLQkJCQlNSVBTX0dSX1JFRykpCi0JICAgICsrbm9wczsKLQl9Ci0gICAgICBlbHNlIGlmICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAgJiYgSVNBX0hBU19DT1BST0NfREVMQVlTIChtaXBzX29wdHMuaXNhKQotCSAgICAgICAmJiAoKChwcmV2X3BpbmZvICYgSU5TTl9DT1BST0NfTU9WRV9ERUxBWSkKLSAgICAgICAgICAgICAgICAgICAgJiYgISBjb3BfaW50ZXJsb2NrcykKLQkJICAgfHwgKG1pcHNfb3B0cy5pc2EgPT0gMQotCQkgICAgICAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkpKSkpCi0JewotCSAgLyogQSBnZW5lcmljIGNvcHJvY2Vzc29yIGRlbGF5LiAgVGhlIHByZXZpb3VzIGluc3RydWN0aW9uCi0JICAgICBtb2RpZmllZCBhIGNvcHJvY2Vzc29yIGdlbmVyYWwgb3IgY29udHJvbCByZWdpc3Rlci4gIElmCi0JICAgICBpdCBtb2RpZmllZCBhIGNvbnRyb2wgcmVnaXN0ZXIsIHdlIG5lZWQgdG8gYXZvaWQgYW55Ci0JICAgICBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiAodGhpcyBpcyBwcm9iYWJseSBub3QgYWx3YXlzCi0JICAgICByZXF1aXJlZCwgYnV0IGl0IHNvbWV0aW1lcyBpcykuICBJZiBpdCBtb2RpZmllZCBhIGdlbmVyYWwKLQkgICAgIHJlZ2lzdGVyLCB3ZSBhdm9pZCB1c2luZyB0aGF0IHJlZ2lzdGVyLgotCi0JICAgICBPbiB0aGUgcjYwMDAgYW5kIHI0MDAwIGxvYWRpbmcgYSBjb3Byb2Nlc3NvciByZWdpc3RlcgotCSAgICAgZnJvbSBtZW1vcnkgaXMgaW50ZXJsb2NrZWQsIGFuZCBkb2VzIG5vdCByZXF1aXJlIGEgZGVsYXkuCi0KLQkgICAgIFRoaXMgY2FzZSBpcyBub3QgaGFuZGxlZCB2ZXJ5IHdlbGwuICBUaGVyZSBpcyBubyBzcGVjaWFsCi0JICAgICBrbm93bGVkZ2Ugb2YgQ1AwIGhhbmRsaW5nLCBhbmQgdGhlIGNvcHJvY2Vzc29ycyBvdGhlcgotCSAgICAgdGhhbiB0aGUgZmxvYXRpbmcgcG9pbnQgdW5pdCBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgYXQKLQkgICAgIGFsbC4gICovCi0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiBGSVhNRSEKLSAgICAgICAgICAgICBOZWVkIHRvIG1vZGlmeSB0aGlzIHRvIGluY2x1ZGUga25vd2xlZGdlIGFib3V0IAotICAgICAgICAgICAgIHVzZXIgc3BlY2lmaWVkIGRlbGF5cyEgICovCi0JICBpZiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfRlBSX1QpCi0JICAgIHsKLQkgICAgICBpZiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JCSAgfHwgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX0ZUKQotCQkJCSAgICAgJiBPUF9NQVNLX0ZUKSwKLQkJCQkgICAgTUlQU19GUF9SRUcpKQotCQkrK25vcHM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0ZQUl9TKQotCSAgICB7Ci0JICAgICAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8IGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9GUykKLQkJCQkgICAgICYgT1BfTUFTS19GUyksCi0JCQkJICAgIE1JUFNfRlBfUkVHKSkKLQkJKytub3BzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBrbm93IGV4YWN0bHkgd2hhdCB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KLQkJIGRvZXMuICBJZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB1c2VzIGEgY29wcm9jZXNzb3IKLQkJIHJlZ2lzdGVyLCB3ZSBtdXN0IGluc2VydCBhIE5PUC4gIElmIHByZXZpb3VzCi0JCSBpbnN0cnVjdGlvbiBtYXkgc2V0IHRoZSBjb25kaXRpb24gY29kZXMsIGFuZCB0aGUKLQkJIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gdXNlcyB0aGVtLCB3ZSBtdXN0IGluc2VydCB0d28KLQkJIE5PUFMuICAqLwotICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICAgICAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8ICgocHJldl9waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKQotCQkgICAgICAmJiAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkpCi0JCW5vcHMgKz0gMjsKLQkgICAgICBlbHNlIGlmIChwaW5mbyAmIElOU05fQ09QKQotCQkrK25vcHM7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAgJiYgSVNBX0hBU19DT1BST0NfREVMQVlTIChtaXBzX29wdHMuaXNhKQotCSAgICAgICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKQotICAgICAgICAgICAgICAgJiYgISBjb3BfaW50ZXJsb2NrcykKLQl7Ci0JICAvKiBUaGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gc2V0cyB0aGUgY29wcm9jZXNzb3IgY29uZGl0aW9uCi0JICAgICBjb2RlcywgYnV0IGRvZXMgbm90IHJlcXVpcmUgYSBnZW5lcmFsIGNvcHJvY2Vzc29yIGRlbGF5Ci0JICAgICAodGhpcyBtZWFucyBpdCBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbXBhcmlzb24KLQkgICAgIGluc3RydWN0aW9uKS4gIElmIHRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgY29uZGl0aW9uCi0JICAgICBjb2Rlcywgd2UgbmVlZCB0byBpbnNlcnQgYSBzaW5nbGUgTk9QLiAgKi8KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBpZiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JICAgICAgfHwgKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkpCi0JICAgICsrbm9wczsKLQl9Ci0KLSAgICAgIC8qIElmIHdlJ3JlIGZpeGluZyB1cCBtZmhpL21mbG8gZm9yIHRoZSByNzAwMCBhbmQgdGhlCi0JIHByZXZpb3VzIGluc24gd2FzIGFuIG1maGkvbWZsbyBhbmQgdGhlIGN1cnJlbnQgaW5zbgotCSByZWFkcyB0aGUgcmVnaXN0ZXIgdGhhdCB0aGUgbWZoaS9tZmxvIHdyb3RlIHRvLCB0aGVuCi0JIGluc2VydCB0d28gbm9wcy4gICovCi0KLSAgICAgIGVsc2UgaWYgKG1pcHNfNzAwMF9oaWxvX2ZpeAotCSAgICAgICAmJiBNRl9ISUxPX0lOU04gKHByZXZfcGluZm8pCi0JICAgICAgICYmIGluc25fdXNlc19yZWcgKGlwLCAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgT1BfTUFTS19SRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVBTX0dSX1JFRykpCi0KLQl7Ci0JICBub3BzICs9IDI7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSdyZSBmaXhpbmcgdXAgbWZoaS9tZmxvIGZvciB0aGUgcjcwMDAgYW5kIHRoZQotCSAybmQgcHJldmlvdXMgaW5zbiB3YXMgYW4gbWZoaS9tZmxvIGFuZCB0aGUgY3VycmVudCBpbnNuCi0JIHJlYWRzIHRoZSByZWdpc3RlciB0aGF0IHRoZSBtZmhpL21mbG8gd3JvdGUgdG8sIHRoZW4KLQkgaW5zZXJ0IG9uZSBub3AuICAqLwotCi0gICAgICBlbHNlIGlmIChtaXBzXzcwMDBfaGlsb19maXgKLQkgICAgICAgJiYgTUZfSElMT19JTlNOIChwcmV2X3ByZXZfaW5zbi5pbnNuX29wY29kZSkKLQkgICAgICAgJiYgaW5zbl91c2VzX3JlZyAoaXAsICgocHJldl9wcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIE9QX01BU0tfUkQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlQU19HUl9SRUcpKQotICAgICAKLQl7Ci0JICBub3BzICs9IDE7Ci0JfQotIAotICAgICAgZWxzZSBpZiAocHJldl9waW5mbyAmIElOU05fUkVBRF9MTykKLQl7Ci0JICAvKiBUaGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gcmVhZHMgdGhlIExPIHJlZ2lzdGVyOyBpZiB0aGUKLQkgICAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd3JpdGVzIHRvIHRoZSBMTyByZWdpc3Rlciwgd2UgbXVzdAotCSAgICAgaW5zZXJ0IHR3byBOT1BTLiAgU29tZSBuZXdlciBwcm9jZXNzb3JzIGhhdmUgaW50ZXJsb2Nrcy4gCi0JICAgICBBbHNvIHRoZSB0eDM5J3MgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBleGVjdHV0ZWQgCi0gICAgICAgICAgICAgaW1tZWRpYXRseSBhZnRlciBhIHJlYWQgZnJvbSBISS9MTyAod2l0aG91dCB0aGUgZGVsYXkpLAotICAgICAgICAgICAgIHRob3VnaCB0aGUgdHgzOSdzIGRpdmlkZSBpbnNucyBzdGlsbCBkbyByZXF1aXJlIHRoZSAKLQkgICAgIGRlbGF5LiAqLwotCSAgaWYgKCEgKGhpbG9faW50ZXJsb2NrcwotCQkgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpCi0JICAgICAgJiYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8IChwaW5mbyAmIElOU05fV1JJVEVfTE8pKSkKLQkgICAgbm9wcyArPSAyOwotCSAgLyogTW9zdCBtaXBzMTYgYnJhbmNoIGluc25zIGRvbid0IGhhdmUgYSBkZWxheSBzbG90LgotCSAgICAgSWYgYSByZWFkIGZyb20gTE8gaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBicmFuY2gKLQkgICAgIHRvIGEgd3JpdGUgdG8gTE8gd2UgaGF2ZSBhIHJlYWQgZm9sbG93ZWQgYnkgYSB3cml0ZQotCSAgICAgbGVzcyB0aGFuIDIgaW5zbnMgYXdheS4gIFdlIGFzc3VtZSB0aGUgdGFyZ2V0IG9mCi0JICAgICBhIGJyYW5jaCBtaWdodCBiZSBhIHdyaXRlIHRvIExPLCBhbmQgaW5zZXJ0IGEgbm9wCi0JICAgICBiZXR3ZWVuIGEgcmVhZCBhbmQgYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGJyYW5jaC4gKi8KLQkgIGVsc2UgaWYgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAgJiYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgICAgICAgfHwgKHBpbmZvICYgTUlQUzE2X0lOU05fQlJBTkNIKSkpCi0JICAgIG5vcHMgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JewotCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHJlYWRzIHRoZSBISSByZWdpc3RlcjsgaWYgdGhlCi0JICAgICBjdXJyZW50IGluc3RydWN0aW9uIHdyaXRlcyB0byB0aGUgSEkgcmVnaXN0ZXIsIHdlIG11c3QKLQkgICAgIGluc2VydCBhIE5PUC4gIFNvbWUgbmV3ZXIgcHJvY2Vzc29ycyBoYXZlIGludGVybG9ja3MuCi0JICAgICBBbHNvIHRoZSBub3RlIHR4MzkncyBtdWx0aXBseSBhYm92ZS4gKi8KLQkgIGlmICghIChoaWxvX2ludGVybG9ja3MKLQkJIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKQotCSAgICAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCAocGluZm8gJiBJTlNOX1dSSVRFX0hJKSkpCi0JICAgIG5vcHMgKz0gMjsKLQkgIC8qIE1vc3QgbWlwczE2IGJyYW5jaCBpbnNucyBkb24ndCBoYXZlIGEgZGVsYXkgc2xvdC4KLQkgICAgIElmIGEgcmVhZCBmcm9tIEhJIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgYnJhbmNoCi0JICAgICB0byBhIHdyaXRlIHRvIEhJIHdlIGhhdmUgYSByZWFkIGZvbGxvd2VkIGJ5IGEgd3JpdGUKLQkgICAgIGxlc3MgdGhhbiAyIGluc25zIGF3YXkuICBXZSBhc3N1bWUgdGhlIHRhcmdldCBvZgotCSAgICAgYSBicmFuY2ggbWlnaHQgYmUgYSB3cml0ZSB0byBISSwgYW5kIGluc2VydCBhIG5vcAotCSAgICAgYmV0d2VlbiBhIHJlYWQgYW5kIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBicmFuY2guICovCi0JICBlbHNlIGlmIChtaXBzX29wdHMubWlwczE2Ci0JCSAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICAgICAgIHx8IChwaW5mbyAmIE1JUFMxNl9JTlNOX0JSQU5DSCkpKQotCSAgICBub3BzICs9IDE7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgbm9yZW9yZGVyIHNlY3Rpb24sIHRoZW4KLSAgICAgICAgIHdlIGRvbid0IHdhbnQgdG8gaW5zZXJ0IHRoZSBub3AgYWZ0ZXIgYWxsLiAgKi8KLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGlmIChwcmV2X2luc25fdW5yZW9yZGVyZWQpCi0Jbm9wcyA9IDA7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSB0d28gY2FzZXMgd2hpY2ggcmVxdWlyZSB0d28gaW50ZXJ2ZW5pbmcKLQkgaW5zdHJ1Y3Rpb25zOiAxKSBzZXR0aW5nIHRoZSBjb25kaXRpb24gY29kZXMgdXNpbmcgYSBtb3ZlIHRvCi0JIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgZ2VuZXJhbCBjb3Byb2Nlc3NvcgotCSBkZWxheSBhbmQgdGhlbiByZWFkaW5nIHRoZSBjb25kaXRpb24gY29kZXMgMikgcmVhZGluZyB0aGUgSEkKLQkgb3IgTE8gcmVnaXN0ZXIgYW5kIHRoZW4gd3JpdGluZyB0byBpdCAoZXhjZXB0IG9uIHByb2Nlc3NvcnMKLQkgd2hpY2ggaGF2ZSBpbnRlcmxvY2tzKS4gIElmIHdlIGFyZSBub3QgYWxyZWFkeSBlbWl0dGluZyBhIE5PUAotCSBpbnN0cnVjdGlvbiwgd2UgbXVzdCBjaGVjayBmb3IgdGhlc2UgY2FzZXMgY29tcGFyZWQgdG8gdGhlCi0JIGluc3RydWN0aW9uIHByZXZpb3VzIHRvIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkgICAmJiAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZKQotCSAgICYmIChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKQotCSAgICYmIChwaW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpCi0JICAgJiYgISBjb3BfaW50ZXJsb2NrcykKLQkgIHx8ICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfTE8pCi0JICAgICAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9MTykKLQkgICAgICAmJiAhIChoaWxvX2ludGVybG9ja3MKLQkJICAgIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKSkKLQkgIHx8ICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JICAgICAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9ISSkKLQkgICAgICAmJiAhIChoaWxvX2ludGVybG9ja3MKLQkJICAgIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKSkpCi0JcHJldl9wcmV2X25vcCA9IDE7Ci0gICAgICBlbHNlCi0JcHJldl9wcmV2X25vcCA9IDA7Ci0KLSAgICAgIGlmIChwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCkKLQlwcmV2X3ByZXZfbm9wID0gMDsKLQotICAgICAgaWYgKHByZXZfcHJldl9ub3AgJiYgbm9wcyA9PSAwKQotCSsrbm9wczsKLQotICAgICAgLyogSWYgd2UgYXJlIGJlaW5nIGdpdmVuIGEgbm9wIGluc3RydWN0aW9uLCBkb24ndCBib3RoZXIgd2l0aAotCSBvbmUgb2YgdGhlIG5vcHMgd2Ugd291bGQgb3RoZXJ3aXNlIG91dHB1dC4gIFRoaXMgd2lsbCBvbmx5Ci0JIGhhcHBlbiB3aGVuIGEgbm9wIGluc3RydWN0aW9uIGlzIHVzZWQgd2l0aCBtaXBzX29wdGltaXplIHNldAotCSB0byAwLiAgKi8KLSAgICAgIGlmIChub3BzID4gMAotCSAgJiYgISBtaXBzX29wdHMubm9yZW9yZGVyCi0JICAmJiBpcC0+aW5zbl9vcGNvZGUgPT0gKG1pcHNfb3B0cy5taXBzMTYgPyAweDY1MDAgOiAwKSkKLQktLW5vcHM7Ci0KLSAgICAgIC8qIE5vdyBlbWl0IHRoZSByaWdodCBudW1iZXIgb2YgTk9QIGluc3RydWN0aW9ucy4gICovCi0gICAgICBpZiAobm9wcyA+IDAgJiYgISBtaXBzX29wdHMubm9yZW9yZGVyKQotCXsKLQkgIGZyYWdTICpvbGRfZnJhZzsKLQkgIHVuc2lnbmVkIGxvbmcgb2xkX2ZyYWdfb2Zmc2V0OwotCSAgaW50IGk7Ci0JICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOwotCi0JICBvbGRfZnJhZyA9IGZyYWdfbm93OwotCSAgb2xkX2ZyYWdfb2Zmc2V0ID0gZnJhZ19ub3dfZml4ICgpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgbm9wczsgaSsrKQotCSAgICBlbWl0X25vcCAoKTsKLQotCSAgaWYgKGxpc3RpbmcpCi0JICAgIHsKLQkgICAgICBsaXN0aW5nX3ByZXZfbGluZSAoKTsKLQkgICAgICAvKiBXZSBtYXkgYmUgYXQgdGhlIHN0YXJ0IG9mIGEgdmFyaWFudCBmcmFnLiAgSW4gY2FzZSB3ZQotICAgICAgICAgICAgICAgICBhcmUsIG1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIHRoZSBmcmFnCi0gICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBmcmFncyBjcmVhdGVkIGJ5IGxpc3RpbmdfcHJldl9saW5lLiAgVGhlCi0gICAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIGZyYWdfZ3JvdyBoZXJlIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UKLSAgICAgICAgICAgICAgICAgYXMgdGhlIGFyZ3VtZW50IHRvIGFsbCBvdGhlciBjYWxscyB0byBmcmFnX2dyb3cgaW4KLSAgICAgICAgICAgICAgICAgdGhpcyBmaWxlLiAgV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBiZWluZyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgbWlkZGxlIG9mIGEgdmFyaWFudCBmcmFnLCBiZWNhdXNlIHRoZSB2YXJpYW50cyBpbnNlcnQKLSAgICAgICAgICAgICAgICAgYWxsIG5lZWRlZCBub3AgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuICAqLwotCSAgICAgIGZyYWdfZ3JvdyAoNDApOwotCSAgICB9Ci0KLQkgIGZvciAobCA9IGluc25fbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNzZXJ0IChTX0dFVF9TRUdNRU5UIChsLT5sYWJlbCkgPT0gbm93X3NlZyk7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChsLT5sYWJlbCwgZnJhZ19ub3cpOwotCSAgICAgIFNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkgICAgICAvKiBtaXBzMTYgdGV4dCBsYWJlbHMgYXJlIHN0b3JlZCBhcyBvZGQuICAqLwotCSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2KQotCQlTX1NFVF9WQUxVRSAobC0+bGFiZWwsIFNfR0VUX1ZBTFVFIChsLT5sYWJlbCkgKyAxKTsKLQkgICAgfQotCi0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotCSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLQkgICAgZWNvZmZfZml4X2xvYyAob2xkX2ZyYWcsIG9sZF9mcmFnX29mZnNldCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlIGlmIChwcmV2X25vcF9mcmFnICE9IE5VTEwpCi0JewotCSAgLyogV2UgaGF2ZSBhIGZyYWcgaG9sZGluZyBub3BzIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZS4gIElmCi0gICAgICAgICAgICAgd2UgZG9uJ3QgbmVlZCBhbnkgbm9wcywgd2UgY2FuIGRlY3JlYXNlIHRoZSBzaXplIG9mCi0gICAgICAgICAgICAgcHJldl9ub3BfZnJhZyBieSB0aGUgc2l6ZSBvZiBvbmUgaW5zdHJ1Y3Rpb24uICBJZiB3ZSBkbwotICAgICAgICAgICAgIG5lZWQgc29tZSBub3BzLCB3ZSBjb3VudCB0aGVtIGluIHByZXZfbm9wc19yZXF1aXJlZC4gKi8KLQkgIGlmIChwcmV2X25vcF9mcmFnX3NpbmNlID09IDApCi0JICAgIHsKLQkgICAgICBpZiAobm9wcyA9PSAwKQotCQl7Ci0JCSAgcHJldl9ub3BfZnJhZy0+ZnJfZml4IC09IG1pcHNfb3B0cy5taXBzMTYgPyAyIDogNDsKLQkJICAtLXByZXZfbm9wX2ZyYWdfaG9sZHM7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXByZXZfbm9wX2ZyYWdfcmVxdWlyZWQgKz0gbm9wczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHByZXZfcHJldl9ub3AgPT0gMCkKLQkJewotCQkgIHByZXZfbm9wX2ZyYWctPmZyX2ZpeCAtPSBtaXBzX29wdHMubWlwczE2ID8gMiA6IDQ7Ci0JCSAgLS1wcmV2X25vcF9mcmFnX2hvbGRzOwotCQl9Ci0JICAgICAgZWxzZQotCQkrK3ByZXZfbm9wX2ZyYWdfcmVxdWlyZWQ7Ci0JICAgIH0KLQotCSAgaWYgKHByZXZfbm9wX2ZyYWdfaG9sZHMgPD0gcHJldl9ub3BfZnJhZ19yZXF1aXJlZCkKLQkgICAgcHJldl9ub3BfZnJhZyA9IE5VTEw7Ci0KLQkgICsrcHJldl9ub3BfZnJhZ19zaW5jZTsKLQotCSAgLyogU2FuaXR5IGNoZWNrOiBieSB0aGUgdGltZSB3ZSByZWFjaCB0aGUgc2Vjb25kIGluc3RydWN0aW9uCi0gICAgICAgICAgICAgYWZ0ZXIgcHJldl9ub3BfZnJhZywgd2Ugc2hvdWxkIGhhdmUgdXNlZCB1cCBhbGwgdGhlIG5vcHMKLSAgICAgICAgICAgICBvbmUgd2F5IG9yIGFub3RoZXIuICAqLwotCSAgYXNzZXJ0IChwcmV2X25vcF9mcmFnX3NpbmNlIDw9IDEgfHwgcHJldl9ub3BfZnJhZyA9PSBOVUxMKTsKLQl9Ci0gICAgfQotCi0gIGlmIChyZWxvY190eXBlID4gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIHNldCB1cCBhIHZhcmlhbnQgZnJhZy4gICovCi0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5taXBzMTYgJiYgYWRkcmVzc19leHByICE9IE5VTEwpOwotICAgICAgZiA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMCwKLQkJICAgIFJFTEFYX01JUFMxNl9FTkNPREUgKHJlbG9jX3R5cGUgLSBCRkRfUkVMT0NfVU5VU0VELAotCQkJCQkgbWlwczE2X3NtYWxsLCBtaXBzMTZfZXh0LAotCQkJCQkgKHByZXZfcGluZm8KLQkJCQkJICAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSksCi0JCQkJCSAocHJldl9pbnNuX3JlbG9jX3R5cGUKLQkJCQkJICA9PSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkpLAotCQkgICAgbWFrZV9leHByX3N5bWJvbCAoYWRkcmVzc19leHByKSwgKG9mZnNldFQpIDAsCi0JCSAgICAoY2hhciAqKSBOVUxMKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHBsYWNlICE9IE5VTEwpCi0gICAgZiA9IHBsYWNlOwotICBlbHNlIGlmIChtaXBzX29wdHMubWlwczE2Ci0JICAgJiYgISBpcC0+dXNlX2V4dGVuZAotCSAgICYmIHJlbG9jX3R5cGUgIT0gQkZEX1JFTE9DX01JUFMxNl9KTVApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIHRvIHN3YXAgdGhpcyBpbnN0cnVjdGlvbiB3aXRoCi0gICAgICAgICBhIGZvbGxvd2luZyBqdW1wIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGZyYWdfZ3JvdyAoNik7Ci0gICAgICBmID0gZnJhZ19tb3JlICgyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobWlwc19vcHRzLm1pcHMxNgotCSAgJiYgbWlwc19vcHRzLm5vcmVvcmRlcgotCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpICE9IDApCi0JYXNfd2FybiAoXygiZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIpKTsKLQotICAgICAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gICAgfQotCi0gIGZpeHAgPSBOVUxMOwotICBpZiAoYWRkcmVzc19leHByICE9IE5VTEwgJiYgcmVsb2NfdHlwZSA8IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaWYgKGFkZHJlc3NfZXhwci0+WF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHN3aXRjaCAocmVsb2NfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweGZmZmY7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0JICAgICAgaWYgKChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDMpICE9IDApCi0JCWFzX2JhZCAoXygianVtcCB0byBtaXNhbGlnbmVkIGFkZHJlc3MgKDB4JWx4KSIpLAotCQkJKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyKTsKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gKGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyID4+IDIpICYgMHgzZmZmZmZmOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9KTVA6Ci0JICAgICAgaWYgKChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDMpICE9IDApCi0JCWFzX2JhZCAoXygianVtcCB0byBtaXNhbGlnbmVkIGFkZHJlc3MgKDB4JWx4KSIpLAotCQkJKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyKTsKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0KLQkJKCgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweDdjMDAwMCkgPDwgMykKLQkJIHwgKChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDB4ZjgwMDAwMCkgPj4gNykKLQkJIHwgKChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDB4M2ZmZmMpID4+IDIpKTsKLQkgICAgICBicmVhazsKLQotCi0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotCSAgICAgIGdvdG8gbmVlZF9yZWxvYzsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCW5lZWRfcmVsb2M6Ci0JICAvKiBEb24ndCBnZW5lcmF0ZSBhIHJlbG9jIGlmIHdlIGFyZSB3cml0aW5nIGludG8gYSB2YXJpYW50Ci0JICAgICBmcmFnLiAgKi8KLQkgIGlmIChwbGFjZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZml4cCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQkJCSAgYWRkcmVzc19leHByLAotCQkJCSAgcmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfMTZfUENSRUxfUzIsCi0JCQkJICByZWxvY190eXBlKTsKLQkgICAgICBpZiAodW5tYXRjaGVkX2hpKQotCQl7Ci0JCSAgc3RydWN0IG1pcHNfaGlfZml4dXAgKmhpX2ZpeHVwOwotCi0JCSAgYXNzZXJ0IChyZWxvY190eXBlID09IEJGRF9SRUxPQ19ISTE2X1MpOwotCQkgIGhpX2ZpeHVwID0gKChzdHJ1Y3QgbWlwc19oaV9maXh1cCAqKQotCQkJICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbWlwc19oaV9maXh1cCkpKTsKLQkJICBoaV9maXh1cC0+Zml4cCA9IGZpeHA7Ci0JCSAgaGlfZml4dXAtPnNlZyA9IG5vd19zZWc7Ci0JCSAgaGlfZml4dXAtPm5leHQgPSBtaXBzX2hpX2ZpeHVwX2xpc3Q7Ci0JCSAgbWlwc19oaV9maXh1cF9saXN0ID0gaGlfZml4dXA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKCEgbWlwc19vcHRzLm1pcHMxNikKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGlwLT5pbnNuX29wY29kZSwgNCk7Ci0gIGVsc2UgaWYgKHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DX01JUFMxNl9KTVApCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpcC0+aW5zbl9vcGNvZGUgPj4gMTYsIDIpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgMiwgaXAtPmluc25fb3Bjb2RlICYgMHhmZmZmLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXAtPnVzZV9leHRlbmQpCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCAweGYwMDAgfCBpcC0+ZXh0ZW5kLCAyKTsKLQkgIGYgKz0gMjsKLQl9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGlwLT5pbnNuX29wY29kZSwgMik7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgcmVnaXN0ZXIgbWFzayBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCi0gICAgewotICAgICAgaWYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKTsKLSAgICAgIGlmICgocGluZm8gJiAoSU5TTl9XUklURV9HUFJfVCB8IElOU05fUkVBRF9HUFJfVCkpICE9IDApCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCk7Ci0gICAgICBpZiAocGluZm8gJiBJTlNOX1JFQURfR1BSX1MpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUlMpICYgT1BfTUFTS19SUyk7Ci0gICAgICBpZiAocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAzMTsKLSAgICAgIGlmIChwaW5mbyAmIElOU05fV1JJVEVfRlBSX0QpCi0JbWlwc19jcHJtYXNrWzFdIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRkQpICYgT1BfTUFTS19GRCk7Ci0gICAgICBpZiAoKHBpbmZvICYgKElOU05fV1JJVEVfRlBSX1MgfCBJTlNOX1JFQURfRlBSX1MpKSAhPSAwKQotCW1pcHNfY3BybWFza1sxXSB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZTKSAmIE9QX01BU0tfRlMpOwotICAgICAgaWYgKChwaW5mbyAmIChJTlNOX1dSSVRFX0ZQUl9UIHwgSU5TTl9SRUFEX0ZQUl9UKSkgIT0gMCkKLQltaXBzX2Nwcm1hc2tbMV0gfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GVCkgJiBPUF9NQVNLX0ZUKTsKLSAgICAgIGlmICgocGluZm8gJiBJTlNOX1JFQURfRlBSX1IpICE9IDApCi0JbWlwc19jcHJtYXNrWzFdIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlIpICYgT1BfTUFTS19GUik7Ci0gICAgICBpZiAocGluZm8gJiBJTlNOX0NPUCkKLQl7Ci0JICAvKiBXZSBkb24ndCBrZWVwIGVub3VnaCBpbmZvcm1hdGlvbiB0byBzb3J0IHRoZXNlIGNhc2VzIG91dC4gCi0JICAgICBUaGUgaXRibCBzdXBwb3J0IGRvZXMga2VlcCB0aGlzIGluZm9ybWF0aW9uIGhvd2V2ZXIsIGFsdGhvdWdoIAotCSAgICAgd2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgaXRibCBmcHJtYXRzIGFzIHBhcnQgb2YgdGhlIGNvcCAKLQkgICAgIGluc3RydWN0aW9uLiAgTWF5IHdhbnQgdG8gYWRkIHRoaXMgc3VwcG9ydCBpbiB0aGUgZnV0dXJlLiAqLwotCX0KLSAgICAgIC8qIE5ldmVyIHNldCB0aGUgYml0IGZvciAkMCwgd2hpY2ggaXMgYWx3YXlzIHplcm8uICAqLwotICAgICAgbWlwc19ncHJtYXNrICY9fiAxIDw8IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBpbmZvICYgKE1JUFMxNl9JTlNOX1dSSVRFX1ggfCBNSVBTMTZfSU5TTl9SRUFEX1gpKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JYKQotCQkJICAgICAgJiBNSVBTMTZPUF9NQVNLX1JYKTsKLSAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9ZIHwgTUlQUzE2X0lOU05fUkVBRF9ZKSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWSkKLQkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SWSk7Ci0gICAgICBpZiAocGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9aKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JaKQotCQkJICAgICAgJiBNSVBTMTZPUF9NQVNLX1JaKTsKLSAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9UIHwgTUlQUzE2X0lOU05fUkVBRF9UKSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCBUUkVHOwotICAgICAgaWYgKHBpbmZvICYgKE1JUFMxNl9JTlNOX1dSSVRFX1NQIHwgTUlQUzE2X0lOU05fUkVBRF9TUCkpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgU1A7Ci0gICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfMzEgfCBNSVBTMTZfSU5TTl9SRUFEXzMxKSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCBSQTsKLSAgICAgIGlmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8IE1JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSIChpcC0+aW5zbl9vcGNvZGUpOwotICAgICAgaWYgKHBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9aKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX01PVkUzMlopCi0JCQkgICAgICAmIE1JUFMxNk9QX01BU0tfTU9WRTMyWik7Ci0gICAgICBpZiAocGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX0dQUl9YKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JFR1IzMikKLQkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SRUdSMzIpOwotICAgIH0KLQotICBpZiAocGxhY2UgPT0gTlVMTCAmJiAhIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0gICAgewotICAgICAgLyogRmlsbGluZyB0aGUgYnJhbmNoIGRlbGF5IHNsb3QgaXMgbW9yZSBjb21wbGV4LiAgV2UgdHJ5IHRvCi0JIHN3aXRjaCB0aGUgYnJhbmNoIHdpdGggdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCB3aGljaCB3ZSBjYW4KLQkgZG8gaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGRvZXMgbm90IHNldCB1cCBhIGNvbmRpdGlvbgotCSB0aGF0IHRoZSBicmFuY2ggdGVzdHMgYW5kIGlmIHRoZSBicmFuY2ggaXMgbm90IGl0c2VsZiB0aGUKLQkgdGFyZ2V0IG9mIGFueSBicmFuY2guICAqLwotICAgICAgaWYgKChwaW5mbyAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSkKLQkgIHx8IChwaW5mbyAmIElOU05fQ09ORF9CUkFOQ0hfREVMQVkpKQotCXsKLQkgIGlmIChtaXBzX29wdGltaXplIDwgMgotCSAgICAgIC8qIElmIHdlIGhhdmUgc2VlbiAuc2V0IHZvbGF0aWxlIG9yIC5zZXQgbm9tb3ZlLCBkb24ndAotCQkgb3B0aW1pemUuICAqLwotCSAgICAgIHx8IG1pcHNfb3B0cy5ub21vdmUgIT0gMAotCSAgICAgIC8qIElmIHdlIGhhZCB0byBlbWl0IGFueSBOT1AgaW5zdHJ1Y3Rpb25zLCB0aGVuIHdlCi0JCSBhbHJlYWR5IGtub3cgd2UgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICB8fCBub3BzICE9IDAKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBldmVuIGtub3cgdGhlIHByZXZpb3VzIGluc24sIHdlIGNhbiBub3QKLQkJIHN3YXAuICovCi0JICAgICAgfHwgISBwcmV2X2luc25fdmFsaWQKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zbiBpcyBhbHJlYWR5IGluIGEgYnJhbmNoIGRlbGF5Ci0JCSBzbG90LCB0aGVuIHdlIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgcHJldmlvdXMgaW5zbiB3YXMgaW4gYSAuc2V0Ci0JCSBub3Jlb3JkZXIsIHdlIGNhbid0IHN3YXAuICBBY3R1YWxseSwgdGhlIE1JUFMKLQkJIGFzc2VtYmxlciB3aWxsIHN3YXAgaW4gdGhpcyBzaXR1YXRpb24uICBIb3dldmVyLCBnY2MKLQkJIGNvbmZpZ3VyZWQgLXdpdGgtZ251LWFzIHdpbGwgZ2VuZXJhdGUgY29kZSBsaWtlCi0JCSAgIC5zZXQgbm9yZW9yZGVyCi0JCSAgIGx3CSQ0LFhYWAotCQkgICAuc2V0CXJlb3JkZXIKLQkJICAgSU5TTgotCQkgICBibmUJJDQsJDAsZm9vCi0JCSBpbiB3aGljaCB3ZSBjYW4gbm90IHN3YXAgdGhlIGJuZSBhbmQgSU5TTi4gIElmIGdjYyBpcwotCQkgbm90IGNvbmZpZ3VyZWQgLXdpdGgtZ251LWFzLCBpdCBkb2VzIG5vdCBvdXRwdXQgdGhlCi0JCSAuc2V0IHBzZXVkby1vcHMuICBXZSBkb24ndCBoYXZlIHRvIGNoZWNrCi0JCSBwcmV2X2luc25fdW5yZW9yZGVyZWQsIGJlY2F1c2UgcHJldl9pbnNuX3ZhbGlkIHdpbGwKLQkJIGJlIDAgaW4gdGhhdCBjYXNlLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UKLQkJIHByZXZfcHJldl9pbnNuX3ZhbGlkLCBiZWNhdXNlIHdlIGRvIHdhbnQgdG8gYmUgYWJsZQotCQkgdG8gc3dhcCBhdCB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbi4gICovCi0JICAgICAgfHwgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIGlzIGl0c2VsZiB0aGUgdGFyZ2V0IG9mIGEgYnJhbmNoLCB3ZQotCQkgY2FuIG5vdCBzd2FwLiAgV2UgY2hlYXQgb24gdGhpczsgYWxsIHdlIGNoZWNrIGZvciBpcwotCQkgd2hldGhlciB0aGVyZSBpcyBhIGxhYmVsIG9uIHRoaXMgaW5zdHJ1Y3Rpb24uICBJZgotCQkgdGhlcmUgYXJlIGFueSBicmFuY2hlcyB0byBhbnl0aGluZyBvdGhlciB0aGFuIGEKLQkJIGxhYmVsLCB1c2VycyBtdXN0IHVzZSAuc2V0IG5vcmVvcmRlci4gICovCi0JICAgICAgfHwgaW5zbl9sYWJlbHMgIT0gTlVMTAotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBpbiBhIHZhcmlhbnQgZnJhZywgd2UKLQkJIGNhbiBub3QgZG8gdGhlIHN3YXAuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIHRoZQotCQkgbWlwczE2LCB3aGljaCB1c2VzIHZhcmlhbnQgZnJhZ3MgZm9yIGRpZmZlcmVudAotCQkgcHVycG9zZXMuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBwcmV2X2luc25fZnJhZy0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudCkKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIHJlYWRzIHRoZSBjb25kaXRpb24gY29kZXMsIHdlIGRvbid0Ci0JCSBldmVuIHRyeSB0byBzd2FwLCBiZWNhdXNlIGluIHRoZSBzZXF1ZW5jZQotCQkgICBjdGMxICRYLCQzMQotCQkgICBJTlNOCi0JCSAgIElOU04KLQkJICAgYmMxdCBMQUJFTAotCQkgd2UgY2FuIG5vdCBzd2FwLCBhbmQgSSBkb24ndCBmZWVsIGxpa2UgaGFuZGxpbmcgdGhhdAotCQkgY2FzZS4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkJICAmJiAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkKLQkgICAgICAvKiBXZSBjYW4gbm90IHN3YXAgd2l0aCBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlcXVpcmVzIGEKLQkJIGRlbGF5IHNsb3QsIGJlY2FzZSB0aGUgdGFyZ2V0IG9mIHRoZSBicmFuY2ggbWlnaHQKLQkJIGludGVyZmVyZSB3aXRoIHRoYXQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JCSAgJiYgKHByZXZfcGluZm8KLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCQkgICAgICAmIChJTlNOX0xPQURfQ09QUk9DX0RFTEFZCi0JCQkgfCBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZCi0JCQkgfCBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpKQotCSAgICAgIHx8ICghIChoaWxvX2ludGVybG9ja3MKLQkJICAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkKLQkJICAmJiAocHJldl9waW5mbwotCQkgICAgICAmIChJTlNOX1JFQURfTE8KLQkJCSB8IElOU05fUkVBRF9ISSkpKQotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAhIGdwcl9pbnRlcmxvY2tzCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgbWlwc19vcHRzLmlzYSA9PSAxCi0gICAgICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkpKQotCSAgICAgIC8qIFdlIGNhbiBub3Qgc3dhcCB3aXRoIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICB8fCAocHJldl9waW5mbwotCQkgICYgKElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotCQkgICAgIHwgSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotCQkgICAgIHwgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkpKQotCSAgICAgIC8qIFdlIGRvIG5vdCBzd2FwIHdpdGggYSB0cmFwIGluc3RydWN0aW9uLCBzaW5jZSBpdAotCQkgY29tcGxpY2F0ZXMgdHJhcCBoYW5kbGVycyB0byBoYXZlIHRoZSB0cmFwCi0JCSBpbnN0cnVjdGlvbiBiZSBpbiBhIGRlbGF5IHNsb3QuICAqLwotCSAgICAgIHx8IChwcmV2X3BpbmZvICYgSU5TTl9UUkFQKQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggcmVhZHMgYSByZWdpc3RlciB0aGF0IHRoZSBwcmV2aW91cwotCQkgaW5zdHJ1Y3Rpb24gc2V0cywgd2UgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKQotCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCQkgICAgICYgT1BfTUFTS19SVCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkKLQkJCQkgICAgICYgT1BfTUFTS19SRCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmICgoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9YKQotCQkgICAgICAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJCSAoKHByZXZfaW5zbi5pbnNuX29wY29kZQotCQkJCQkgICA+PiBNSVBTMTZPUF9TSF9SWCkKLQkJCQkJICAmIE1JUFMxNk9QX01BU0tfUlgpLAotCQkJCQkgTUlQUzE2X1JFRykpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1kpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUKLQkJCQkJICAgICAgPj4gTUlQUzE2T1BfU0hfUlkpCi0JCQkJCSAgICAgJiBNSVBTMTZPUF9NQVNLX1JZKSwKLQkJCQkJICAgIE1JUFMxNl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9aKQotCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlCi0JCQkJCSAgICAgID4+IE1JUFMxNk9QX1NIX1JaKQotCQkJCQkgICAgICYgTUlQUzE2T1BfTUFTS19SWiksCi0JCQkJCSAgICBNSVBTMTZfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfVCkKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsIFRSRUcsIE1JUFNfR1JfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLCBSQSwgTUlQU19HUl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9HUFJfWSkKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJCSAgICBNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAocHJldl9pbnNuLgotCQkJCQkJCQkgICAgIGluc25fb3Bjb2RlKSwKLQkJCQkJICAgIE1JUFNfR1JfUkVHKSkpKQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggd3JpdGVzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKLQkJIGluc3RydWN0aW9uIHNldHMsIHdlIGNhbiBub3Qgc3dhcCAod2Uga25vdyB0aGF0Ci0JCSBicmFuY2hlcyB3cml0ZSBvbmx5IHRvIFJEIG9yIHRvICQzMSkuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX1QpCi0JCSAgJiYgKCgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICAgICAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpCi0JCQkgICA9PSAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKSkpCi0JCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKLQkJCSAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQotCQkJICAgICAgICYgT1BfTUFTS19SVCkKLQkJCSAgICAgID09IDMxKSkpKQotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JCSAgJiYgKCgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICAgICAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpCi0JCQkgICA9PSAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKSkpCi0JCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKLQkJCSAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKQotCQkJICAgICAgICYgT1BfTUFTS19SRCkKLQkJCSAgICAgID09IDMxKSkpKQotCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCSAgJiYgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZKQotCQkJICAmJiAoTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIgKHByZXZfaW5zbi5pbnNuX29wY29kZSkKLQkJCSAgICAgID09IFJBKSkpKQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggd3JpdGVzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKLQkJIGluc3RydWN0aW9uIHJlYWRzLCB3ZSBjYW4gbm90IHN3YXAgKHdlIGtub3cgdGhhdAotCQkgYnJhbmNoZXMgb25seSB3cml0ZSB0byBSRCBvciB0byAkMzEpLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAmJiBpbnNuX3VzZXNfcmVnICgmcHJldl9pbnNuLAotCQkJCSAgICAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkKLQkJCQkgICAgICYgT1BfTUFTS19SRCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoJnByZXZfaW5zbiwgMzEsIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFXzMxKQotCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sIFJBLCBNSVBTX0dSX1JFRykpCi0JICAgICAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHRoZSBicmFuY2gKLQkJIG1pZ2h0IGJlIGV4cGFuZGVkIGludG8gYSBzZXF1ZW5jZSB3aGljaCB1c2VzICRhdCwgc28KLQkJIHdlIGNhbid0IHN3YXAgd2l0aCBhbiBpbnN0cnVjdGlvbiB3aGljaCByZWFkcyBpdC4gICovCi0JICAgICAgfHwgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sIEFULCBNSVBTX0dSX1JFRykpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIHByZXZpb3VzIGluc3RydWN0aW9uIGhhcyBhIGxvYWQKLQkJIGRlbGF5LCBhbmQgc2V0cyBhIHJlZ2lzdGVyIHRoYXQgdGhlIGJyYW5jaCByZWFkcywgd2UKLQkJIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCQkgICYmICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX0xPQURfQ09QUk9DX0RFTEFZKQotCQkgICAgICB8fCAoISBncHJfaW50ZXJsb2NrcwotCQkJICAmJiAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8KLQkJCSAgICAgICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpKQotCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfcHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQotCQkJCSAgICAgJiBPUF9NQVNLX1JUKSwKLQkJCQkgICAgTUlQU19HUl9SRUcpKQotCSAgICAgIC8qIElmIG9uZSBpbnN0cnVjdGlvbiBzZXRzIGEgY29uZGl0aW9uIGNvZGUgYW5kIHRoZQotICAgICAgICAgICAgICAgICBvdGhlciBvbmUgdXNlcyBhIGNvbmRpdGlvbiBjb2RlLCB3ZSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKQotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQotCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBQQywgd2UgY2FuIG5vdAotICAgICAgICAgICAgICAgICBzd2FwLiAgKi8KLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9QQykpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBleHRlbmRlZCwgd2UgY2FuIG5vdAotICAgICAgICAgICAgICAgICBzd2FwLiAgKi8KLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNiAmJiBwcmV2X2luc25fZXh0ZW5kZWQpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGhhZCBhIGZpeHVwIGluIG1pcHMxNgotICAgICAgICAgICAgICAgICBtb2RlLCB3ZSBjYW4gbm90IHN3YXAuICBUaGlzIG5vcm1hbGx5IG1lYW5zIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhIDQgYnl0ZSBicmFuY2ggYW55aG93LiAgKi8KLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNiAmJiBwcmV2X2luc25fZml4cCkKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBzeW5jLCBzeW5jLmwsIG9yIAotCQkgc3luYy5wLCB3ZSBjYW4gbm90IHN3YXAuICovCi0JICAgICAgfHwgKHByZXZfcGluZm8gJiBJTlNOX1NZTkMpKQotCSAgICB7Ci0JICAgICAgLyogV2UgY291bGQgZG8gZXZlbiBiZXR0ZXIgZm9yIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgdG8KLQkJIHBvcnRpb25zIG9mIHRoaXMgb2JqZWN0IGZpbGU7IHdlIGNvdWxkIHBpY2sgdXAgdGhlCi0JCSBpbnN0cnVjdGlvbiBhdCB0aGUgZGVzdGluYXRpb24sIHB1dCBpdCBpbiB0aGUgZGVsYXkKLQkJIHNsb3QsIGFuZCBidW1wIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzLiAgKi8KLQkgICAgICBlbWl0X25vcCAoKTsKLQkgICAgICAvKiBVcGRhdGUgdGhlIHByZXZpb3VzIGluc24gaW5mb3JtYXRpb24uICAqLwotCSAgICAgIHByZXZfcHJldl9pbnNuID0gKmlwOwotCSAgICAgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSXQgbG9va3MgbGlrZSB3ZSBjYW4gYWN0dWFsbHkgZG8gdGhlIHN3YXAuICAqLwotCSAgICAgIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCi0JCXsKLQkJICBjaGFyICpwcmV2X2Y7Ci0JCSAgY2hhciB0ZW1wWzRdOwotCi0JCSAgcHJldl9mID0gcHJldl9pbnNuX2ZyYWctPmZyX2xpdGVyYWwgKyBwcmV2X2luc25fd2hlcmU7Ci0JCSAgbWVtY3B5ICh0ZW1wLCBwcmV2X2YsIDQpOwotCQkgIG1lbWNweSAocHJldl9mLCBmLCA0KTsKLQkJICBtZW1jcHkgKGYsIHRlbXAsIDQpOwotCQkgIGlmIChwcmV2X2luc25fZml4cCkKLQkJICAgIHsKLQkJICAgICAgcHJldl9pbnNuX2ZpeHAtPmZ4X2ZyYWcgPSBmcmFnX25vdzsKLQkJICAgICAgcHJldl9pbnNuX2ZpeHAtPmZ4X3doZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOwotCQkgICAgfQotCQkgIGlmIChmaXhwKQotCQkgICAgewotCQkgICAgICBmaXhwLT5meF9mcmFnID0gcHJldl9pbnNuX2ZyYWc7Ci0JCSAgICAgIGZpeHAtPmZ4X3doZXJlID0gcHJldl9pbnNuX3doZXJlOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqcHJldl9mOwotCQkgIGNoYXIgdGVtcFsyXTsKLQotCQkgIGFzc2VydCAocHJldl9pbnNuX2ZpeHAgPT0gTlVMTCk7Ci0JCSAgcHJldl9mID0gcHJldl9pbnNuX2ZyYWctPmZyX2xpdGVyYWwgKyBwcmV2X2luc25fd2hlcmU7Ci0JCSAgbWVtY3B5ICh0ZW1wLCBwcmV2X2YsIDIpOwotCQkgIG1lbWNweSAocHJldl9mLCBmLCAyKTsKLQkJICBpZiAocmVsb2NfdHlwZSAhPSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkKLQkJICAgIHsKLQkJICAgICAgYXNzZXJ0IChyZWxvY190eXBlID09IEJGRF9SRUxPQ19VTlVTRUQpOwotCQkgICAgICBtZW1jcHkgKGYsIHRlbXAsIDIpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5IChmLCBmICsgMiwgMik7Ci0JCSAgICAgIG1lbWNweSAoZiArIDIsIHRlbXAsIDIpOwotCQkgICAgfQotCQkgIGlmIChmaXhwKQotCQkgICAgewotCQkgICAgICBmaXhwLT5meF9mcmFnID0gcHJldl9pbnNuX2ZyYWc7Ci0JCSAgICAgIGZpeHAtPmZ4X3doZXJlID0gcHJldl9pbnNuX3doZXJlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBVcGRhdGUgdGhlIHByZXZpb3VzIGluc24gaW5mb3JtYXRpb247IGxlYXZlIHByZXZfaW5zbgotCQkgdW5jaGFuZ2VkLiAgKi8KLQkgICAgICBwcmV2X3ByZXZfaW5zbiA9ICppcDsKLQkgICAgfQotCSAgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QgPSAxOwotCi0JICAvKiBJZiB0aGF0IHdhcyBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgZm9yZ2V0IHRoZSBwcmV2aW91cwotCSAgICAgaW5zbiBpbmZvcm1hdGlvbi4gICovCi0JICBpZiAocGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpCi0JICAgIHsKLQkgICAgICBwcmV2X3ByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgICAgICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICAgIH0KLQotCSAgcHJldl9pbnNuX2ZpeHAgPSBOVUxMOwotCSAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgcHJldl9pbnNuX2V4dGVuZGVkID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChwaW5mbyAmIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZKQotCXsKLQkgIC8qIFdlIGRvbid0IHlldCBvcHRpbWl6ZSBhIGJyYW5jaCBsaWtlbHkuICBXaGF0IHdlIHNob3VsZCBkbwotCSAgICAgaXMgbG9vayBhdCB0aGUgdGFyZ2V0LCBjb3B5IHRoZSBpbnN0cnVjdGlvbiBmb3VuZCB0aGVyZQotCSAgICAgaW50byB0aGUgZGVsYXkgc2xvdCwgYW5kIGluY3JlbWVudCB0aGUgYnJhbmNoIHRvIGp1bXAgdG8KLQkgICAgIHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLQkgIGVtaXRfbm9wICgpOwotCSAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uLiAgKi8KLQkgIHByZXZfcHJldl9pbnNuID0gKmlwOwotCSAgcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotCSAgcHJldl9pbnNuX2ZpeHAgPSBOVUxMOwotCSAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgcHJldl9pbnNuX2V4dGVuZGVkID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uLiAgKi8KLQkgIGlmIChub3BzID4gMCkKLQkgICAgcHJldl9wcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICBlbHNlCi0JICAgIHByZXZfcHJldl9pbnNuID0gcHJldl9pbnNuOwotCSAgcHJldl9pbnNuID0gKmlwOwotCi0JICAvKiBBbnkgdGltZSB3ZSBzZWUgYSBicmFuY2gsIHdlIGFsd2F5cyBmaWxsIHRoZSBkZWxheSBzbG90Ci0JICAgICBpbW1lZGlhdGVseTsgc2luY2UgdGhpcyBpbnNuIGlzIG5vdCBhIGJyYW5jaCwgd2Uga25vdyBpdAotCSAgICAgaXMgbm90IGluIGEgZGVsYXkgc2xvdC4gICovCi0JICBwcmV2X2luc25faXNfZGVsYXlfc2xvdCA9IDA7Ci0KLQkgIHByZXZfaW5zbl9maXhwID0gZml4cDsKLQkgIHByZXZfaW5zbl9yZWxvY190eXBlID0gcmVsb2NfdHlwZTsKLQkgIGlmIChtaXBzX29wdHMubWlwczE2KQotCSAgICBwcmV2X2luc25fZXh0ZW5kZWQgPSAoaXAtPnVzZV9leHRlbmQKLQkJCQkgIHx8IHJlbG9jX3R5cGUgPiBCRkRfUkVMT0NfVU5VU0VEKTsKLQl9Ci0KLSAgICAgIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkID0gcHJldl9pbnNuX3VucmVvcmRlcmVkOwotICAgICAgcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMDsKLSAgICAgIHByZXZfaW5zbl9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBwcmV2X2luc25fd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7Ci0gICAgICBwcmV2X2luc25fdmFsaWQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIHJlY29yZCBhIGJpdCBvZiBpbmZvcm1hdGlvbiBldmVuIHdoZW4gd2UgYXJlIG5vdAotICAgICAgICAgcmVvcmRlcmluZywgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBiYXNlIGFkZHJlc3MgZm9yIG1pcHMxNgotICAgICAgICAgUEMgcmVsYXRpdmUgcmVsb2NzLiAgKi8KLSAgICAgIHByZXZfcHJldl9pbnNuID0gcHJldl9pbnNuOwotICAgICAgcHJldl9pbnNuID0gKmlwOwotICAgICAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSByZWxvY190eXBlOwotICAgICAgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQgPSBwcmV2X2luc25fdW5yZW9yZGVyZWQ7Ci0gICAgICBwcmV2X2luc25fdW5yZW9yZGVyZWQgPSAxOwotICAgIH0KLQotICAvKiBXZSBqdXN0IG91dHB1dCBhbiBpbnNuLCBzbyB0aGUgbmV4dCBvbmUgZG9lc24ndCBoYXZlIGEgbGFiZWwuICAqLwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotCi0gIC8qIFdlIG11c3QgZW5zdXJlIHRoYXQgYSBmaXh1cCBhc3NvY2lhdGVkIHdpdGggYW4gdW5tYXRjaGVkICVoaQotICAgICByZWxvYyBkb2VzIG5vdCBiZWNvbWUgYSB2YXJpYW50IGZyYWcuICBPdGhlcndpc2UsIHRoZQotICAgICByZWFycmFuZ2VtZW50IG9mICVoaSByZWxvY3MgaW4gZnJvYl9maWxlIG1heSBjb25mdXNlCi0gICAgIHRjX2dlbl9yZWxvYy4gICovCi0gIGlmICh1bm1hdGNoZWRfaGkpCi0gICAgewotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25ldyAoMCk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGZvcmdldHMgdGhhdCB0aGVyZSB3YXMgYW55IHByZXZpb3VzIGluc3RydWN0aW9uIG9yCi0gICBsYWJlbC4gIElmIFBSRVNFUlZFIGlzIG5vbi16ZXJvLCBpdCByZW1lbWJlcnMgZW5vdWdoIGluZm9ybWF0aW9uIHRvCi0gICBrbm93IHdoZXRoZXIgbm9wcyBhcmUgbmVlZGVkIGJlZm9yZSBhIG5vcmVvcmRlciBzZWN0aW9uLiAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19ub19wcmV2X2luc24gKHByZXNlcnZlKQotICAgICBpbnQgcHJlc2VydmU7Ci17Ci0gIGlmICghIHByZXNlcnZlKQotICAgIHsKLSAgICAgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLSAgICAgIHByZXZfcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotICAgICAgcHJldl9ub3BfZnJhZyA9IE5VTEw7Ci0gICAgICBwcmV2X25vcF9mcmFnX2hvbGRzID0gMDsKLSAgICAgIHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQgPSAwOwotICAgICAgcHJldl9ub3BfZnJhZ19zaW5jZSA9IDA7Ci0gICAgfQotICBwcmV2X2luc25fdmFsaWQgPSAwOwotICBwcmV2X2luc25faXNfZGVsYXlfc2xvdCA9IDA7Ci0gIHByZXZfaW5zbl91bnJlb3JkZXJlZCA9IDA7Ci0gIHByZXZfaW5zbl9leHRlbmRlZCA9IDA7Ci0gIHByZXZfaW5zbl9yZWxvY190eXBlID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQgPSAwOwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW5ldmVyIHdlIHR1cm4gb24gbm9yZW9yZGVyIG9yIGVtaXQKLSAgIHNvbWV0aGluZyBvdGhlciB0aGFuIGluc3RydWN0aW9ucy4gIEl0IGluc2VydHMgYW55IE5PUFMgd2hpY2ggbWlnaHQKLSAgIGJlIG5lZWRlZCBieSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24sIGFuZCBjbGVhcnMgdGhlIGluZm9ybWF0aW9uCi0gICBrZXB0IGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb25zLiAgVGhlIElOU05TIHBhcmFtZXRlciBpcyB0cnVlIGlmCi0gICBpbnN0cnVjdGlvbnMgYXJlIHRvIGZvbGxvdy4gKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZW1pdF9kZWxheXMgKGluc25zKQotICAgICBib29sZWFuIGluc25zOwotewotICBpZiAoISBtaXBzX29wdHMubm9yZW9yZGVyKQotICAgIHsKLSAgICAgIGludCBub3BzOwotCi0gICAgICBub3BzID0gMDsKLSAgICAgIGlmICgoISBtaXBzX29wdHMubWlwczE2Ci0JICAgJiYgSVNBX0hBU19DT1BST0NfREVMQVlTIChtaXBzX29wdHMuaXNhKQotCSAgICYmICghIGNvcF9pbnRlcmxvY2tzCi0gICAgICAgICAgICAgICAmJiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvCi0gICAgICAgICAgICAgICAgICAgJiAoSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQotICAgICAgICAgICAgICAgICAgICAgIHwgSU5TTl9DT1BST0NfTU9WRV9ERUxBWQotICAgICAgICAgICAgICAgICAgICAgIHwgSU5TTl9XUklURV9DT05EX0NPREUpKSkpCi0JICB8fCAoISBoaWxvX2ludGVybG9ja3MKLQkgICAgICAmJiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvCi0JCSAgJiAoSU5TTl9SRUFEX0xPCi0JCSAgICAgfCBJTlNOX1JFQURfSEkpKSkKLQkgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAmJiAhIGdwcl9pbnRlcmxvY2tzCi0JICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAKLSAgICAgICAgICAgICAgICAgICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpCi0JICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgJiYgbWlwc19vcHRzLmlzYSA9PSAxCi0JICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbwotCQkgICYgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZKSkpCi0JewotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgICsrbm9wczsKLQkgIGlmICgoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkgICAgICAgJiYgKCEgY29wX2ludGVybG9ja3MKLSAgICAgICAgICAgICAgICAgICAmJiBwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpCi0JICAgICAgfHwgKCEgaGlsb19pbnRlcmxvY2tzCi0JCSAgJiYgKChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JCSAgICAgIHx8IChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfTE8pKSkpCi0JICAgICsrbm9wczsKLQotCSAgaWYgKHByZXZfaW5zbl91bnJlb3JkZXJlZCkKLQkgICAgbm9wcyA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCQkmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JCSYmICghIGNvcF9pbnRlcmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICYmIHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQotCSAgICAgICB8fCAoISBoaWxvX2ludGVybG9ja3MKLQkJICAgJiYgKChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9ISSkKLQkJICAgICAgIHx8IChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9MTykpKSkKLQl7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgaWYgKCEgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpCi0JICAgICsrbm9wczsKLQl9Ci0KLSAgICAgIGlmIChub3BzID4gMCkKLQl7Ci0JICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOwotCi0JICBpZiAoaW5zbnMpCi0JICAgIHsKLQkgICAgICAvKiBSZWNvcmQgdGhlIGZyYWcgd2hpY2ggaG9sZHMgdGhlIG5vcCBpbnN0cnVjdGlvbnMsIHNvCi0gICAgICAgICAgICAgICAgIHRoYXQgd2UgY2FuIHJlbW92ZSB0aGVtIGlmIHdlIGRvbid0IG5lZWQgdGhlbS4gICovCi0JICAgICAgZnJhZ19ncm93IChtaXBzX29wdHMubWlwczE2ID8gbm9wcyAqIDIgOiBub3BzICogNCk7Ci0JICAgICAgcHJldl9ub3BfZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIHByZXZfbm9wX2ZyYWdfaG9sZHMgPSBub3BzOwotCSAgICAgIHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQgPSAwOwotCSAgICAgIHByZXZfbm9wX2ZyYWdfc2luY2UgPSAwOwotCSAgICB9Ci0KLQkgIGZvciAoOyBub3BzID4gMDsgLS1ub3BzKQotCSAgICBlbWl0X25vcCAoKTsKLQotCSAgaWYgKGluc25zKQotCSAgICB7Ci0JICAgICAgLyogTW92ZSBvbiB0byBhIG5ldyBmcmFnLCBzbyB0aGF0IGl0IGlzIHNhZmUgdG8gc2ltcGx5Ci0gICAgICAgICAgICAgICAgIGRlY3JlYXNlIHRoZSBzaXplIG9mIHByZXZfbm9wX2ZyYWcuICovCi0JICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0JICAgICAgZnJhZ19uZXcgKDApOwotCSAgICB9Ci0KLQkgIGZvciAobCA9IGluc25fbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNzZXJ0IChTX0dFVF9TRUdNRU5UIChsLT5sYWJlbCkgPT0gbm93X3NlZyk7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChsLT5sYWJlbCwgZnJhZ19ub3cpOwotCSAgICAgIFNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkgICAgICAvKiBtaXBzMTYgdGV4dCBsYWJlbHMgYXJlIHN0b3JlZCBhcyBvZGQuICAqLwotCSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2KQotCQlTX1NFVF9WQUxVRSAobC0+bGFiZWwsIFNfR0VUX1ZBTFVFIChsLT5sYWJlbCkgKyAxKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTWFyayBpbnN0cnVjdGlvbiBsYWJlbHMgaW4gbWlwczE2IG1vZGUuICAqLwotICBpZiAobWlwc19vcHRzLm1pcHMxNiAmJiBpbnNucykKLSAgICBtaXBzMTZfbWFya19sYWJlbHMgKCk7Ci0KLSAgbWlwc19ub19wcmV2X2luc24gKGluc25zKTsKLX0KLQotLyogQnVpbGQgYW4gaW5zdHJ1Y3Rpb24gY3JlYXRlZCBieSBhIG1hY3JvIGV4cGFuc2lvbi4gIFRoaXMgaXMgcGFzc2VkCi0gICBhIHBvaW50ZXIgdG8gdGhlIGNvdW50IG9mIGluc3RydWN0aW9ucyBjcmVhdGVkIHNvIGZhciwgYW4KLSAgIGV4cHJlc3Npb24sIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBidWlsZCwgYW4gb3BlcmFuZCBmb3JtYXQKLSAgIHN0cmluZywgYW5kIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzLiAgKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXN0YXRpYyB2b2lkCi1tYWNyb19idWlsZCAoY2hhciAqcGxhY2UsCi0JICAgICBpbnQgKmNvdW50ZXIsCi0JICAgICBleHByZXNzaW9uUyAqIGVwLAotCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkgICAgIGNvbnN0IGNoYXIgKmZtdCwKLQkgICAgIC4uLikKLSNlbHNlCi1zdGF0aWMgdm9pZAotbWFjcm9fYnVpbGQgKHBsYWNlLCBjb3VudGVyLCBlcCwgbmFtZSwgZm10LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqcGxhY2U7Ci0gICAgIGludCAqY291bnRlcjsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHN0cnVjdCBtaXBzX2NsX2luc24gaW5zbjsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0gIHZhX2xpc3QgYXJnczsKLQotI2lmZGVmIFVTRV9TVERBUkcKLSAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLQotICAvKgotICAgKiBJZiB0aGUgbWFjcm8gaXMgYWJvdXQgdG8gZXhwYW5kIGludG8gYSBzZWNvbmQgaW5zdHJ1Y3Rpb24sCi0gICAqIHByaW50IGEgd2FybmluZyBpZiBuZWVkZWQuIFdlIG5lZWQgdG8gcGFzcyBpcCBhcyBhIHBhcmFtZXRlcgotICAgKiB0byBnZW5lcmF0ZSBhIGJldHRlciB3YXJuaW5nIG1lc3NhZ2UgaGVyZS4uLgotICAgKi8KLSAgaWYgKG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyAmJiBwbGFjZSA9PSBOVUxMICYmICpjb3VudGVyID09IDEpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMiKSk7Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgKmNvdW50ZXIgKz0gMTsJCS8qIGJ1bXAgaW5zdHJ1Y3Rpb24gY291bnRlciAqLwotCi0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIG1pcHMxNl9tYWNyb19idWlsZCAocGxhY2UsIGNvdW50ZXIsIGVwLCBuYW1lLCBmbXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gIGluc24uaW5zbl9tbyA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKLSAgYXNzZXJ0IChpbnNuLmluc25fbW8pOwotICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLQotICAvKiBTZWFyY2ggdW50aWwgd2UgZ2V0IGEgbWF0Y2ggZm9yIE5BTUUuICAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChmbXQsIGluc24uaW5zbl9tby0+YXJncykgPT0gMAotCSAgJiYgaW5zbi5pbnNuX21vLT5waW5mbyAhPSBJTlNOX01BQ1JPCi0JICAmJiBPUENPREVfSVNfTUVNQkVSIChpbnNuLmluc25fbW8sIG1pcHNfb3B0cy5pc2EsIG1pcHNfY3B1LCAKLQkJCSAgICAgICBtaXBzX2dwMzIpCi0JICAmJiAobWlwc19jcHUgIT0gNDY1MCB8fCAoaW5zbi5pbnNuX21vLT5waW5mbyAmIEZQX0QpID09IDApKQotCWJyZWFrOwotCi0gICAgICArK2luc24uaW5zbl9tbzsKLSAgICAgIGFzc2VydCAoaW5zbi5pbnNuX21vLT5uYW1lKTsKLSAgICAgIGFzc2VydCAoc3RyY21wIChuYW1lLCBpbnNuLmluc25fbW8tPm5hbWUpID09IDApOwotICAgIH0KLQotICBpbnNuLmluc25fb3Bjb2RlID0gaW5zbi5pbnNuX21vLT5tYXRjaDsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpmbXQrKykKLQl7Ci0JY2FzZSAnXDAnOgotCSAgYnJlYWs7Ci0KLQljYXNlICcsJzoKLQljYXNlICcoJzoKLQljYXNlICcpJzoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAndCc6Ci0JY2FzZSAndyc6Ci0JY2FzZSAnRSc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAxNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYyc6Ci0JY2FzZSAnVCc6Ci0JY2FzZSAnVyc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAxNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnZCc6Ci0JY2FzZSAnRyc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAxMTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnVic6Ci0JY2FzZSAnUyc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAxMTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAneic6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJzwnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnRCc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCA2OwotCSAgY29udGludWU7Ci0KLQljYXNlICdCJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3EnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYic6Ci0JY2FzZSAncyc6Ci0JY2FzZSAncic6Ci0JY2FzZSAndic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCAyMTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnaSc6Ci0JY2FzZSAnaic6Ci0JY2FzZSAnbyc6Ci0JICByID0gKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgdmFfYXJnIChhcmdzLCBpbnQpOwotCSAgYXNzZXJ0IChyID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMCi0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMCi0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTE8xNgotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfR09UMTYKLQkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0NBTEwxNgotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfR09UX0xPMTYKLQkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNgotCQkgIHx8IChlcC0+WF9vcCA9PSBPX3N1YnRyYWN0Ci0JCSAgICAgICYmIHIgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAndSc6Ci0JICByID0gKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgdmFfYXJnIChhcmdzLCBpbnQpOwotCSAgYXNzZXJ0IChlcCAhPSBOVUxMCi0JCSAgJiYgKGVwLT5YX29wID09IE9fY29uc3RhbnQKLQkJICAgICAgfHwgKGVwLT5YX29wID09IE9fc3ltYm9sCi0JCQkgICYmIChyID09IEJGRF9SRUxPQ19ISTE2X1MKLQkJCSAgICAgIHx8IHIgPT0gQkZEX1JFTE9DX0hJMTYKLQkJCSAgICAgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLQkJCSAgICAgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2KSkKLQkJICAgICAgfHwgKGVwLT5YX29wID09IE9fc3VidHJhY3QKLQkJCSAgJiYgciA9PSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TKSkpOwotCSAgaWYgKGVwLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpbnNuLmluc25fb3Bjb2RlIHw9IChlcC0+WF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQkgICAgICBlcCA9IE5VTEw7Ci0JICAgICAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAncCc6Ci0JICBhc3NlcnQgKGVwICE9IE5VTEwpOwotCSAgLyoKLQkgICAqIFRoaXMgYWxsb3dzIG1hY3JvKCkgdG8gcGFzcyBhbiBpbW1lZGlhdGUgZXhwcmVzc2lvbiBmb3IKLQkgICAqIGNyZWF0aW5nIHNob3J0IGJyYW5jaGVzIHdpdGhvdXQgY3JlYXRpbmcgYSBzeW1ib2wuCi0JICAgKiBOb3RlIHRoYXQgdGhlIGV4cHJlc3Npb24gc3RpbGwgbWlnaHQgY29tZSBmcm9tIHRoZSBhc3NlbWJseQotCSAgICogaW5wdXQsIGluIHdoaWNoIGNhc2UgdGhlIHZhbHVlIGlzIG5vdCBjaGVja2VkIGZvciByYW5nZSBub3IKLQkgICAqIGlzIGEgcmVsb2NhdGlvbiBlbnRyeSBnZW5lcmF0ZWQgKHl1Y2spLgotCSAgICovCi0JICBpZiAoZXAtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGluc24uaW5zbl9vcGNvZGUgfD0gKGVwLT5YX2FkZF9udW1iZXIgPj4gMikgJiAweGZmZmY7Ci0JICAgICAgZXAgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHIgPSBCRkRfUkVMT0NfMTZfUENSRUxfUzI7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2EnOgotCSAgYXNzZXJ0IChlcCAhPSBOVUxMKTsKLQkgIHIgPSBCRkRfUkVMT0NfTUlQU19KTVA7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ0MnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOwotCSAgY29udGludWU7Ci0KLQlkZWZhdWx0OgotCSAgaW50ZXJuYWxFcnJvciAoKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIGFzc2VydCAociA9PSBCRkRfUkVMT0NfVU5VU0VEID8gZXAgPT0gTlVMTCA6IGVwICE9IE5VTEwpOwotCi0gIGFwcGVuZF9pbnNuIChwbGFjZSwgJmluc24sIGVwLCByLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1taXBzMTZfbWFjcm9fYnVpbGQgKHBsYWNlLCBjb3VudGVyLCBlcCwgbmFtZSwgZm10LCBhcmdzKQotICAgICBjaGFyICpwbGFjZTsKLSAgICAgaW50ICpjb3VudGVyOwotICAgICBleHByZXNzaW9uUyAqZXA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmZtdDsKLSAgICAgdmFfbGlzdCBhcmdzOwotewotICBzdHJ1Y3QgbWlwc19jbF9pbnNuIGluc247Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotCi0gIHIgPSBCRkRfUkVMT0NfVU5VU0VEOwotICBpbnNuLmluc25fbW8gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAobWlwczE2X29wX2hhc2gsIG5hbWUpOwotICBhc3NlcnQgKGluc24uaW5zbl9tbyk7Ci0gIGFzc2VydCAoc3RyY21wIChuYW1lLCBpbnNuLmluc25fbW8tPm5hbWUpID09IDApOwotCi0gIHdoaWxlIChzdHJjbXAgKGZtdCwgaW5zbi5pbnNuX21vLT5hcmdzKSAhPSAwCi0JIHx8IGluc24uaW5zbl9tby0+cGluZm8gPT0gSU5TTl9NQUNSTykKLSAgICB7Ci0gICAgICArK2luc24uaW5zbl9tbzsKLSAgICAgIGFzc2VydCAoaW5zbi5pbnNuX21vLT5uYW1lKTsKLSAgICAgIGFzc2VydCAoc3RyY21wIChuYW1lLCBpbnNuLmluc25fbW8tPm5hbWUpID09IDApOwotICAgIH0KLQotICBpbnNuLmluc25fb3Bjb2RlID0gaW5zbi5pbnNuX21vLT5tYXRjaDsKLSAgaW5zbi51c2VfZXh0ZW5kID0gZmFsc2U7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpbnQgYzsKLQotICAgICAgYyA9ICpmbXQrKzsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnXDAnOgotCSAgYnJlYWs7Ci0KLQljYXNlICcsJzoKLQljYXNlICcoJzoKLQljYXNlICcpJzoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAneSc6Ci0JY2FzZSAndyc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9SWTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAneCc6Ci0JY2FzZSAndic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9SWDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAneic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9SWjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnWic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9NT1ZFMzJaOwotCSAgY29udGludWU7Ci0KLQljYXNlICcwJzoKLQljYXNlICdTJzoKLQljYXNlICdQJzoKLQljYXNlICdSJzoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnWCc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9SRUdSMzI7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1knOgotCSAgewotCSAgICBpbnQgcmVnbm87Ci0KLQkgICAgcmVnbm8gPSB2YV9hcmcgKGFyZ3MsIGludCk7Ci0JICAgIHJlZ25vID0gKChyZWdubyAmIDcpIDw8IDIpIHwgKChyZWdubyAmIDB4MTgpID4+IDMpOwotCSAgICBpbnNuLmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JFRzMyUjsKLQkgIH0KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnPCc6Ci0JY2FzZSAnPic6Ci0JY2FzZSAnNCc6Ci0JY2FzZSAnNSc6Ci0JY2FzZSAnSCc6Ci0JY2FzZSAnVyc6Ci0JY2FzZSAnRCc6Ci0JY2FzZSAnaic6Ci0JY2FzZSAnOCc6Ci0JY2FzZSAnVic6Ci0JY2FzZSAnQyc6Ci0JY2FzZSAnVSc6Ci0JY2FzZSAnayc6Ci0JY2FzZSAnSyc6Ci0JY2FzZSAncCc6Ci0JY2FzZSAncSc6Ci0JICB7Ci0JICAgIGFzc2VydCAoZXAgIT0gTlVMTCk7Ci0KLQkgICAgaWYgKGVwLT5YX29wICE9IE9fY29uc3RhbnQpCi0JICAgICAgciA9IEJGRF9SRUxPQ19VTlVTRUQgKyBjOwotCSAgICBlbHNlCi0JICAgICAgewotCQltaXBzMTZfaW1tZWQgKChjaGFyICopIE5VTEwsIDAsIGMsIGVwLT5YX2FkZF9udW1iZXIsIGZhbHNlLAotCQkJICAgICAgZmFsc2UsIGZhbHNlLCAmaW5zbi5pbnNuX29wY29kZSwKLQkJCSAgICAgICZpbnNuLnVzZV9leHRlbmQsICZpbnNuLmV4dGVuZCk7Ci0JCWVwID0gTlVMTDsKLQkJciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgICAgfQotCSAgfQotCSAgY29udGludWU7Ci0KLQljYXNlICc2JzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX0lNTTY7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBhc3NlcnQgKHIgPT0gQkZEX1JFTE9DX1VOVVNFRCA/IGVwID09IE5VTEwgOiBlcCAhPSBOVUxMKTsKLQotICBhcHBlbmRfaW5zbiAocGxhY2UsICZpbnNuLCBlcCwgciwgZmFsc2UpOwotfQotCi0vKgotICogR2VuZXJhdGUgYSAibHVpIiBpbnN0cnVjdGlvbi4KLSAqLwotc3RhdGljIHZvaWQKLW1hY3JvX2J1aWxkX2x1aSAocGxhY2UsIGNvdW50ZXIsIGVwLCByZWdudW0pCi0gICAgIGNoYXIgKnBsYWNlOwotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgZXhwcmVzc2lvblMgaGlnaF9leHByOwotICBzdHJ1Y3QgbWlwc19jbF9pbnNuIGluc247Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICBDT05TVCBjaGFyICpuYW1lID0gImx1aSI7Ci0gIENPTlNUIGNoYXIgKmZtdCA9ICJ0LHUiOwotCi0gIGFzc2VydCAoISBtaXBzX29wdHMubWlwczE2KTsKLQotICBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICBoaWdoX2V4cHIgPSAqZXA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoaWdoX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBoaWdoX2V4cHIuWF9hZGRfbnVtYmVyID0gZXAtPlhfYWRkX251bWJlcjsKLSAgICB9Ci0KLSAgaWYgKGhpZ2hfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgLyogd2UgY2FuIGNvbXB1dGUgdGhlIGluc3RydWN0aW9uIG5vdyB3aXRob3V0IGEgcmVsb2NhdGlvbiBlbnRyeSAqLwotICAgICAgaWYgKGhpZ2hfZXhwci5YX2FkZF9udW1iZXIgJiAweDgwMDApCi0JaGlnaF9leHByLlhfYWRkX251bWJlciArPSAweDEwMDAwOwotICAgICAgaGlnaF9leHByLlhfYWRkX251bWJlciA9Ci0JKCh1bnNpZ25lZCBsb25nKSBoaWdoX2V4cHIuWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLSAgICAgIHIgPSBCRkRfUkVMT0NfVU5VU0VEOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoZXAtPlhfb3AgPT0gT19zeW1ib2wpOwotICAgICAgLyogX2dwX2Rpc3AgaXMgYSBzcGVjaWFsIGNhc2UsIHVzZWQgZnJvbSBzX2NwbG9hZC4gICovCi0gICAgICBhc3NlcnQgKG1pcHNfcGljID09IE5PX1BJQwotCSAgICAgIHx8IHN0cmNtcCAoU19HRVRfTkFNRSAoZXAtPlhfYWRkX3N5bWJvbCksICJfZ3BfZGlzcCIpID09IDApOwotICAgICAgciA9IEJGRF9SRUxPQ19ISTE2X1M7Ci0gICAgfQotCi0gIC8qCi0gICAqIElmIHRoZSBtYWNybyBpcyBhYm91dCB0byBleHBhbmQgaW50byBhIHNlY29uZCBpbnN0cnVjdGlvbiwKLSAgICogcHJpbnQgYSB3YXJuaW5nIGlmIG5lZWRlZC4gV2UgbmVlZCB0byBwYXNzIGlwIGFzIGEgcGFyYW1ldGVyCi0gICAqIHRvIGdlbmVyYXRlIGEgYmV0dGVyIHdhcm5pbmcgbWVzc2FnZSBoZXJlLi4uCi0gICAqLwotICBpZiAobWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zICYmIHBsYWNlID09IE5VTEwgJiYgKmNvdW50ZXIgPT0gMSkKLSAgICBhc193YXJuIChfKCJNYWNybyBpbnN0cnVjdGlvbiBleHBhbmRlZCBpbnRvIG11bHRpcGxlIGluc3RydWN0aW9ucyIpKTsKLQotICBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICAqY291bnRlciArPSAxOwkJLyogYnVtcCBpbnN0cnVjdGlvbiBjb3VudGVyICovCi0KLSAgaW5zbi5pbnNuX21vID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG5hbWUpOwotICBhc3NlcnQgKGluc24uaW5zbl9tbyk7Ci0gIGFzc2VydCAoc3RyY21wIChuYW1lLCBpbnNuLmluc25fbW8tPm5hbWUpID09IDApOwotICBhc3NlcnQgKHN0cmNtcCAoZm10LCBpbnNuLmluc25fbW8tPmFyZ3MpID09IDApOwotCi0gIGluc24uaW5zbl9vcGNvZGUgPSBpbnNuLmluc25fbW8tPm1hdGNoIHwgKHJlZ251bSA8PCBPUF9TSF9SVCk7Ci0gIGlmIChyID09IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaW5zbi5pbnNuX29wY29kZSB8PSBoaWdoX2V4cHIuWF9hZGRfbnVtYmVyOwotICAgICAgYXBwZW5kX2luc24gKHBsYWNlLCAmaW5zbiwgTlVMTCwgciwgZmFsc2UpOwotICAgIH0KLSAgZWxzZQotICAgIGFwcGVuZF9pbnNuIChwbGFjZSwgJmluc24sICZoaWdoX2V4cHIsIHIsIGZhbHNlKTsKLX0KLQotLyoJCQlzZXRfYXQoKQotICogR2VuZXJhdGVzIGNvZGUgdG8gc2V0IHRoZSAkYXQgcmVnaXN0ZXIgdG8gdHJ1ZSAob25lKQotICogaWYgcmVnIGlzIGxlc3MgdGhhbiB0aGUgaW1tZWRpYXRlIGV4cHJlc3Npb24uCi0gKi8KLXN0YXRpYyB2b2lkCi1zZXRfYXQgKGNvdW50ZXIsIHJlZywgdW5zaWduZWRwKQotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGludCByZWc7Ci0gICAgIGludCB1bnNpZ25lZHA7Ci17Ci0gIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLSAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0gICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0gICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZpbW1fZXhwciwKLQkJIHVuc2lnbmVkcCA/ICJzbHRpdSIgOiAic2x0aSIsCi0JCSAidCxyLGoiLCBBVCwgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb2FkX3JlZ2lzdGVyIChjb3VudGVyLCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLAotCQkgICB1bnNpZ25lZHAgPyAic2x0dSIgOiAic2x0IiwKLQkJICAgImQsdix0IiwgQVQsIHJlZywgQVQpOwotICAgIH0KLX0KLQotLyogV2FybiBpZiBhbiBleHByZXNzaW9uIGlzIG5vdCBhIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCBleCkKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci0gICAgIGV4cHJlc3Npb25TICpleDsKLXsKLSAgaWYgKGV4LT5YX29wID09IE9fYmlnKQotICAgIGFzX2JhZCAoXygidW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gIGVsc2UgaWYgKGV4LT5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgYXNfYmFkIChfKCJJbnN0cnVjdGlvbiAlcyByZXF1aXJlcyBhYnNvbHV0ZSBleHByZXNzaW9uIiksIGlwLT5pbnNuX21vLT5uYW1lKTsKLX0KLQotLyogQ291bnQgdGhlIGxlYWRpbmcgemVyb2VzIGJ5IHBlcmZvcm1pbmcgYSBiaW5hcnkgY2hvcC4gVGhpcyBpcyBhCi0gICBidWxreSBiaXQgb2Ygc291cmNlLCBidXQgcGVyZm9ybWFuY2UgaXMgYSBMT1QgYmV0dGVyIGZvciB0aGUKLSAgIG1ham9yaXR5IG9mIHZhbHVlcyB0aGFuIGEgc2ltcGxlIGxvb3AgdG8gY291bnQgdGhlIGJpdHM6Ci0gICAgICAgZm9yIChsY250ID0gMDsgKGxjbnQgPCAzMik7IGxjbnQrKykKLSAgICAgICAgIGlmICgodikgJiAoMSA8PCAoMzEgLSBsY250KSkpCi0gICAgICAgICAgIGJyZWFrOwotICBIb3dldmVyIGl0IGlzIG5vdCBjb2RlIHNpemUgZnJpZW5kbHksIGFuZCB0aGUgZ2FpbiB3aWxsIGRyb3AgYSBiaXQKLSAgb24gY2VydGFpbiBjYWNoZWQgc3lzdGVtcy4KLSovCi0jZGVmaW5lIENPVU5UX1RPUF9aRVJPRVModikgICAgICAgICAgICAgXAotICAoKCh2KSAmIH4weGZmZmYpID09IDAgICAgICAgICAgICAgICAgIFwKLSAgID8gKCh2KSAmIH4weGZmKSA9PSAwICAgICAgICAgICAgICAgICBcCi0gICAgID8gKCh2KSAmIH4weGYpID09IDAgICAgICAgICAgICAgICAgXAotICAgICAgID8gKCh2KSAmIH4weDMpID09IDAgICAgICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDEpID09IDAgICAgICAgICAgICBcCi0gICAgICAgICAgID8gISh2KSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgID8gMzIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICA6IDMxICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMzAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4NykgPT0gMCAgICAgICAgICAgIFwKLSAgICAgICAgICAgPyAyOSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMjggICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIDogKCh2KSAmIH4weDNmKSA9PSAwICAgICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmKSA9PSAwICAgICAgICAgICBcCi0gICAgICAgICAgID8gMjcgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDI2ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmKSA9PSAwICAgICAgICAgICBcCi0gICAgICAgICAgID8gMjUgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDI0ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgOiAoKHYpICYgfjB4ZmZmKSA9PSAwICAgICAgICAgICAgICBcCi0gICAgICAgPyAoKHYpICYgfjB4M2ZmKSA9PSAwICAgICAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWZmKSA9PSAwICAgICAgICAgIFwKLSAgICAgICAgICAgPyAyMyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMjIgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2ZmKSA9PSAwICAgICAgICAgIFwKLSAgICAgICAgICAgPyAyMSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMjAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIDogKCh2KSAmIH4weDNmZmYpID09IDAgICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZmYpID09IDAgICAgICAgICBcCi0gICAgICAgICAgID8gMTkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDE4ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZmYpID09IDAgICAgICAgICBcCi0gICAgICAgICAgID8gMTcgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDE2ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIDogKCh2KSAmIH4weGZmZmZmZikgPT0gMCAgICAgICAgICAgICBcCi0gICAgID8gKCh2KSAmIH4weGZmZmZmKSA9PSAwICAgICAgICAgICAgXAotICAgICAgID8gKCh2KSAmIH4weDNmZmZmKSA9PSAwICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZmZmKSA9PSAwICAgICAgICBcCi0gICAgICAgICAgID8gMTUgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDE0ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZmZmKSA9PSAwICAgICAgICBcCi0gICAgICAgICAgID8gMTMgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDEyICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICA6ICgodikgJiB+MHgzZmZmZmYpID09IDAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmZmYpID09IDAgICAgICAgXAotICAgICAgICAgICA/IDExICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxMCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmZmYpID09IDAgICAgICAgXAotICAgICAgICAgICA/IDkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiA4ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIDogKCh2KSAmIH4weGZmZmZmZmYpID09IDAgICAgICAgICAgXAotICAgICAgID8gKCh2KSAmIH4weDNmZmZmZmYpID09IDAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZmZmZmYpID09IDAgICAgICBcCi0gICAgICAgICAgID8gNyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZmZmZmYpID09IDAgICAgICBcCi0gICAgICAgICAgID8gNSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDQgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICA6ICgodikgJiB+MHgzZmZmZmZmZikgPT0gMCAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmZmZmZikgPT0gMCAgICAgXAotICAgICAgICAgICA/IDMgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmZmZmZikgPT0gMCAgICAgXAotICAgICAgICAgICA/IDEgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAwKQotCi0vKgkJCWxvYWRfcmVnaXN0ZXIoKQotICogIFRoaXMgcm91dGluZSBnZW5lcmF0ZXMgdGhlIGxlYXN0IG51bWJlciBvZiBpbnN0cnVjdGlvbnMgbmVjY2Vzc2FyeSB0byBsb2FkCi0gKiAgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1sb2FkX3JlZ2lzdGVyIChjb3VudGVyLCByZWcsIGVwLCBkYmwpCi0gICAgIGludCAqY291bnRlcjsKLSAgICAgaW50IHJlZzsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBpbnQgZGJsOwotewotICBpbnQgZnJlZzsKLSAgZXhwcmVzc2lvblMgaGkzMiwgbG8zMjsKLQotICBpZiAoZXAtPlhfb3AgIT0gT19iaWcpCi0gICAgewotICAgICAgYXNzZXJ0IChlcC0+WF9vcCA9PSBPX2NvbnN0YW50KTsKLSAgICAgIGlmIChlcC0+WF9hZGRfbnVtYmVyIDwgMHg4MDAwCi0JICAmJiAoZXAtPlhfYWRkX251bWJlciA+PSAwCi0JICAgICAgfHwgKGVwLT5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCQkgICYmICghIGRibAotCQkgICAgICB8fCAhIGVwLT5YX3Vuc2lnbmVkCi0JCSAgICAgIHx8IHNpemVvZiAoZXAtPlhfYWRkX251bWJlcikgPiA0KSkpKQotCXsKLQkgIC8qIFdlIGNhbiBoYW5kbGUgMTYgYml0IHNpZ25lZCB2YWx1ZXMgd2l0aCBhbiBhZGRpdSB0bwotCSAgICAgJHplcm8uICBObyBuZWVkIHRvIGV2ZXIgdXNlIGRhZGRpdSBoZXJlLCBzaW5jZSAkemVybyBhbmQKLQkgICAgIHRoZSByZXN1bHQgYXJlIGFsd2F5cyBjb3JyZWN0IGluIDMyIGJpdCBtb2RlLiAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgImFkZGl1IiwgInQscixqIiwgcmVnLCAwLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKGVwLT5YX2FkZF9udW1iZXIgPj0gMCAmJiBlcC0+WF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICAvKiBXZSBjYW4gaGFuZGxlIDE2IGJpdCB1bnNpZ25lZCB2YWx1ZXMgd2l0aCBhbiBvcmkgdG8KLSAgICAgICAgICAgICAkemVyby4gICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJvcmkiLCAidCxyLGkiLCByZWcsIDAsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoKCgoZXAtPlhfYWRkX251bWJlciAmfiAob2Zmc2V0VCkgMHg3ZmZmZmZmZikgPT0gMAotCQkgfHwgKChlcC0+WF9hZGRfbnVtYmVyICZ+IChvZmZzZXRUKSAweDdmZmZmZmZmKQotCQkgICAgID09IH4gKG9mZnNldFQpIDB4N2ZmZmZmZmYpKQotCQkmJiAoISBkYmwKLQkJICAgIHx8ICEgZXAtPlhfdW5zaWduZWQKLQkJICAgIHx8IHNpemVvZiAoZXAtPlhfYWRkX251bWJlcikgPiA0Ci0JCSAgICB8fCAoZXAtPlhfYWRkX251bWJlciAmIDB4ODAwMDAwMDApID09IDApKQotCSAgICAgICB8fCAoKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSB8fCAhIGRibCkKLQkJICAgJiYgKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpID09IDApCi0JICAgICAgIHx8ICghIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkKLQkJICAgJiYgISBkYmwKLQkJICAgJiYgKChlcC0+WF9hZGRfbnVtYmVyICZ+IChvZmZzZXRUKSAweGZmZmZmZmZmKQotCQkgICAgICAgPT0gfiAob2Zmc2V0VCkgMHhmZmZmZmZmZikpKQotCXsKLQkgIC8qIDMyIGJpdCB2YWx1ZXMgcmVxdWlyZSBhbiBsdWkuICAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAibHVpIiwgInQsdSIsIHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19ISTE2KTsKLQkgIGlmICgoZXAtPlhfYWRkX251bWJlciAmIDB4ZmZmZikgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAib3JpIiwgInQscixpIiwgcmVnLCByZWcsCi0JCQkgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIGlzIGxhcmdlciB0aGFuIDMyIGJpdHMuICAqLwotCi0gIGlmICghIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJOdW1iZXIgbGFyZ2VyIHRoYW4gMzIgYml0cyIpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgImFkZGl1IiwgInQscixqIiwgcmVnLCAwLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChlcC0+WF9vcCAhPSBPX2JpZykKLSAgICB7Ci0gICAgICBoaTMyID0gKmVwOwotICAgICAgaGkzMi5YX2FkZF9udW1iZXIgPSAodmFsdWVUKSBoaTMyLlhfYWRkX251bWJlciA+PiAxNjsKLSAgICAgIGhpMzIuWF9hZGRfbnVtYmVyID0gKHZhbHVlVCkgaGkzMi5YX2FkZF9udW1iZXIgPj4gMTY7Ci0gICAgICBoaTMyLlhfYWRkX251bWJlciAmPSAweGZmZmZmZmZmOwotICAgICAgbG8zMiA9ICplcDsKLSAgICAgIGxvMzIuWF9hZGRfbnVtYmVyICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNzZXJ0IChlcC0+WF9hZGRfbnVtYmVyID4gMik7Ci0gICAgICBpZiAoZXAtPlhfYWRkX251bWJlciA9PSAzKQotCWdlbmVyaWNfYmlnbnVtWzNdID0gMDsKLSAgICAgIGVsc2UgaWYgKGVwLT5YX2FkZF9udW1iZXIgPiA0KQotCWFzX2JhZCAoXygiTnVtYmVyIGxhcmdlciB0aGFuIDY0IGJpdHMiKSk7Ci0gICAgICBsbzMyLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgbG8zMi5YX2FkZF9udW1iZXIgPSBnZW5lcmljX2JpZ251bVswXSArIChnZW5lcmljX2JpZ251bVsxXSA8PCAxNik7Ci0gICAgICBoaTMyLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgaGkzMi5YX2FkZF9udW1iZXIgPSBnZW5lcmljX2JpZ251bVsyXSArIChnZW5lcmljX2JpZ251bVszXSA8PCAxNik7Ci0gICAgfQotCi0gIGlmIChoaTMyLlhfYWRkX251bWJlciA9PSAwKQotICAgIGZyZWcgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgaW50IHNoaWZ0LCBiaXQ7Ci0gICAgICB1bnNpZ25lZCBsb25nIGhpLCBsbzsKLQotICAgICAgaWYgKGhpMzIuWF9hZGRfbnVtYmVyID09IDB4ZmZmZmZmZmYpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmODAwMCkgPT0gMHhmZmZmODAwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAiYWRkaXUiLCAidCxyLGoiLAotCQkJICAgcmVnLCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobG8zMi5YX2FkZF9udW1iZXIgJiAweDgwMDAwMDAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJsdWkiLCAidCx1IiwgcmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOwotCSAgICAgIGlmIChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZikKLQkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAib3JpIiwgInQscixpIiwKLQkJCSAgICAgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qIENoZWNrIGZvciAxNmJpdCBzaGlmdGVkIGNvbnN0YW50LiAgV2Uga25vdyB0aGF0IGhpMzIgaXMKLSAgICAgICAgIG5vbi16ZXJvLCBzbyBzdGFydCB0aGUgbWFzayBvbiB0aGUgZmlyc3QgYml0IG9mIHRoZSBoaTMyCi0gICAgICAgICB2YWx1ZS4gICovCi0gICAgICBzaGlmdCA9IDE3OwotICAgICAgZG8KLSAgICAgICB7Ci0JIHVuc2lnbmVkIGxvbmcgaGltYXNrLCBsb21hc2s7Ci0KLQkgaWYgKHNoaWZ0IDwgMzIpCi0JICAgewotCSAgICAgaGltYXNrID0gMHhmZmZmID4+ICgzMiAtIHNoaWZ0KTsKLQkgICAgIGxvbWFzayA9ICgweGZmZmYgPDwgc2hpZnQpICYgMHhmZmZmZmZmZjsKLQkgICB9Ci0JIGVsc2UKLQkgICB7Ci0JICAgICBoaW1hc2sgPSAweGZmZmYgPDwgKHNoaWZ0IC0gMzIpOwotCSAgICAgbG9tYXNrID0gMDsKLQkgICB9Ci0JIGlmICgoaGkzMi5YX2FkZF9udW1iZXIgJiB+IChvZmZzZXRUKSBoaW1hc2spID09IDAKLQkgICAgICYmIChsbzMyLlhfYWRkX251bWJlciAmIH4gKG9mZnNldFQpIGxvbWFzaykgPT0gMCkKLQkgICB7Ci0JICAgICBleHByZXNzaW9uUyB0bXA7Ci0KLQkgICAgIHRtcC5YX29wID0gT19jb25zdGFudDsKLQkgICAgIGlmIChzaGlmdCA8IDMyKQotCSAgICAgICB0bXAuWF9hZGRfbnVtYmVyID0gKChoaTMyLlhfYWRkX251bWJlciA8PCAoMzIgLSBzaGlmdCkpCi0JCQkJICAgfCAobG8zMi5YX2FkZF9udW1iZXIgPj4gc2hpZnQpKTsKLQkgICAgIGVsc2UKLQkgICAgICAgdG1wLlhfYWRkX251bWJlciA9IGhpMzIuWF9hZGRfbnVtYmVyID4+IChzaGlmdCAtIDMyKTsKLQkgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmdG1wLCAib3JpIiwgInQscixpIiwgcmVnLCAwLAotCQkJICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwKLQkJCSAgKHNoaWZ0ID49IDMyKSA/ICJkc2xsMzIiIDogImRzbGwiLAotCQkJICAiZCx3LDwiLCByZWcsIHJlZywKLQkJCSAgKHNoaWZ0ID49IDMyKSA/IHNoaWZ0IC0gMzIgOiBzaGlmdCk7Ci0JICAgICByZXR1cm47Ci0JICAgfQotICAgICAgICAgc2hpZnQrKzsKLSAgICAgICB9IHdoaWxlIChzaGlmdCA8PSAoNjQgLSAxNikpOwotCi0gICAgICAvKiBGaW5kIHRoZSBiaXQgbnVtYmVyIG9mIHRoZSBsb3dlc3Qgb25lIGJpdCwgYW5kIHN0b3JlIHRoZQotICAgICAgICAgc2hpZnRlZCB2YWx1ZSBpbiBoaS9sby4gICovCi0gICAgICBoaSA9ICh1bnNpZ25lZCBsb25nKSAoaGkzMi5YX2FkZF9udW1iZXIgJiAweGZmZmZmZmZmKTsKLSAgICAgIGxvID0gKHVuc2lnbmVkIGxvbmcpIChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZmZmZmYpOwotICAgICAgaWYgKGxvICE9IDApCi0JewotCSAgYml0ID0gMDsKLQkgIHdoaWxlICgobG8gJiAxKSA9PSAwKQotCSAgICB7Ci0JICAgICAgbG8gPj49IDE7Ci0JICAgICAgKytiaXQ7Ci0JICAgIH0KLQkgIGxvIHw9IChoaSAmICgoKHVuc2lnbmVkIGxvbmcpIDEgPDwgYml0KSAtIDEpKSA8PCAoMzIgLSBiaXQpOwotCSAgaGkgPj49IGJpdDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYml0ID0gMzI7Ci0JICB3aGlsZSAoKGhpICYgMSkgPT0gMCkKLQkgICAgewotCSAgICAgIGhpID4+PSAxOwotCSAgICAgICsrYml0OwotCSAgICB9Ci0JICBsbyA9IGhpOwotCSAgaGkgPSAwOwotCX0KLQotICAgICAgLyogT3B0aW1pemUgaWYgdGhlIHNoaWZ0ZWQgdmFsdWUgaXMgYSAocG93ZXIgb2YgMikgLSAxLiAgKi8KLSAgICAgIGlmICgoaGkgPT0gMCAmJiAoKGxvICsgMSkgJiBsbykgPT0gMCkKLQkgIHx8IChsbyA9PSAweGZmZmZmZmZmICYmICgoaGkgKyAxKSAmIGhpKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgIHNoaWZ0ID0gQ09VTlRfVE9QX1pFUk9FUyAoKHVuc2lnbmVkIGludCkgaGkzMi5YX2FkZF9udW1iZXIpOwotCSAgaWYgKHNoaWZ0ICE9IDApCi0gICAgICAgICAgICB7Ci0JICAgICAgZXhwcmVzc2lvblMgdG1wOwotCi0JICAgICAgLyogVGhpcyBpbnN0cnVjdGlvbiB3aWxsIHNldCB0aGUgcmVnaXN0ZXIgdG8gYmUgYWxsCi0gICAgICAgICAgICAgICAgIG9uZXMuICAqLwotICAgICAgICAgICAgICB0bXAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICAgICAgICAgIHRtcC5YX2FkZF9udW1iZXIgPSAob2Zmc2V0VCkgLTE7Ci0gICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmdG1wLCAiYWRkaXUiLCAidCxyLGoiLAotCQkJICAgcmVnLCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICAgICAgICAgIGlmIChiaXQgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBiaXQgKz0gc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0ID49IDMyKSA/ICJkc2xsMzIiIDogImRzbGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkLHcsPCIsIHJlZywgcmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgPj0gMzIpID8gYml0IC0gMzIgOiBiaXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCi0JCQkgICAoc2hpZnQgPj0gMzIpID8gImRzcmwzMiIgOiAiZHNybCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZCx3LDwiLCByZWcsIHJlZywKLQkJCSAgIChzaGlmdCA+PSAzMikgPyBzaGlmdCAtIDMyIDogc2hpZnQpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgLyogU2lnbiBleHRlbmQgaGkzMiBiZWZvcmUgY2FsbGluZyBsb2FkX3JlZ2lzdGVyLCBiZWNhdXNlIHdlIGNhbgotICAgICAgICAgZ2VuZXJhbGx5IGdldCBiZXR0ZXIgY29kZSB3aGVuIHdlIGxvYWQgYSBzaWduIGV4dGVuZGVkIHZhbHVlLiAgKi8KLSAgICAgIGlmICgoaGkzMi5YX2FkZF9udW1iZXIgJiAweDgwMDAwMDAwKSAhPSAwKQotCWhpMzIuWF9hZGRfbnVtYmVyIHw9IH4gKG9mZnNldFQpIDB4ZmZmZmZmZmY7Ci0gICAgICBsb2FkX3JlZ2lzdGVyIChjb3VudGVyLCByZWcsICZoaTMyLCAwKTsKLSAgICAgIGZyZWcgPSByZWc7Ci0gICAgfQotICBpZiAoKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmMDAwMCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZnJlZyAhPSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLCAiZHNsbDMyIiwgImQsdyw8IiwgcmVnLAotCQkgICAgICAgZnJlZywgMCk7Ci0JICBmcmVnID0gcmVnOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBtaWQxNjsKLQotICAgICAgaWYgKChmcmVnID09IDApICYmIChsbzMyLlhfYWRkX251bWJlciA9PSAweGZmZmZmZmZmKSkKLSAgICAgICAgewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAibHVpIiwgInQsdSIsIHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19ISTE2KTsKLSAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwgImRzcmwzMiIsICJkLHcsPCIsIHJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgcmVnLCAwKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgaWYgKGZyZWcgIT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwgImRzbGwiLCAiZCx3LDwiLCByZWcsCi0JCSAgICAgICBmcmVnLCAxNik7Ci0JICBmcmVnID0gcmVnOwotCX0KLSAgICAgIG1pZDE2ID0gbG8zMjsKLSAgICAgIG1pZDE2LlhfYWRkX251bWJlciA+Pj0gMTY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJm1pZDE2LCAib3JpIiwgInQscixpIiwgcmVnLAotCQkgICBmcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwgImRzbGwiLCAiZCx3LDwiLCByZWcsCi0JCSAgIHJlZywgMTYpOwotICAgICAgZnJlZyA9IHJlZzsKLSAgICB9Ci0gIGlmICgobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmYpICE9IDApCi0gICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAib3JpIiwgInQscixpIiwgcmVnLCBmcmVnLAotCQkgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotfQotCi0vKiBMb2FkIGFuIGFkZHJlc3MgaW50byBhIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWxvYWRfYWRkcmVzcyAoY291bnRlciwgcmVnLCBlcCkKLSAgICAgaW50ICpjb3VudGVyOwotICAgICBpbnQgcmVnOwotICAgICBleHByZXNzaW9uUyAqZXA7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKGVwLT5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgICYmIGVwLT5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLSAgICAgIGVwLT5YX29wID0gT19jb25zdGFudDsKLSAgICB9Ci0KLSAgaWYgKGVwLT5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgbG9hZF9yZWdpc3RlciAoY291bnRlciwgcmVnLCBlcCwgMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgIGFkZGl1CSRyZWcsJGdwLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgbHVpCQkkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0hJMTZfUykKLQkgICBhZGRpdQkkcmVnLCRyZWcsPHN5bT4JCShCRkRfUkVMT0NfTE8xNikKLQkgSWYgd2UgaGF2ZSBhbiBhZGRlbmQsIHdlIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBmb3JtLiAgKi8KLSAgICAgIGlmICgodmFsdWVUKSBlcC0+WF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLSAgICAgICAgICB8fCBub3BpY19uZWVkX3JlbGF4IChlcC0+WF9hZGRfc3ltYm9sLCAxKSkKLQlwID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBmcmFnX2dyb3cgKDIwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAwLAotCQkJUkVMQVhfRU5DT0RFICg0LCA4LCAwLCA0LCAwLAotCQkJCSAgICAgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCi0JCQllcC0+WF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7Ci0JfQotICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCBjb3VudGVyLCBlcCwgcmVnKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JcCArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgfQotICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyAmJiAhIG1pcHNfYmlnX2dvdCkKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBleDsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICBsdwkJJHJlZyw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgbHcJCSRyZWcsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgIG5vcAotCSAgIGFkZGl1CSRyZWcsJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19MTzE2KQotCSBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCBpdCBtdXN0IGJlIGFkZGVkIGluIGFmdGVyLiAgKi8KLSAgICAgIGV4LlhfYWRkX251bWJlciA9IGVwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBlcC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGZyYWdfZ3JvdyAoMjApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgInQsbyhiKSIsIHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsCi0JCSAgICBSRUxBWF9FTkNPREUgKDAsIDQsIC04LCAwLCAwLCBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAotCQkgICAgZXAtPlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOwotICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBpZiAoZXguWF9hZGRfbnVtYmVyICE9IDApCi0JewotCSAgaWYgKGV4LlhfYWRkX251bWJlciA8IC0weDgwMDAgfHwgZXguWF9hZGRfbnVtYmVyID49IDB4ODAwMCkKLQkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7Ci0JICBleC5YX29wID0gT19jb25zdGFudDsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmZXgsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIGV4OwotICAgICAgaW50IG9mZjsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgbGFyZ2UgR09UIGNhc2UuICBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuCi0JIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgIGx1aQkJJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgIGFkZHUJCSRyZWcsJHJlZywkZ3AKLQkgICBsdwkJJHJlZyw8c3ltPigkcmVnKQkoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCi0JIE90aGVyd2lzZSwgZm9yIGEgcmVmZXJlbmNlIHRvIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgbHcJCSRyZWcsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgIG5vcAotCSAgIGFkZGl1CSRyZWcsJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19MTzE2KQotCSBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCBpdCBtdXN0IGJlIGFkZGVkIGluIGFmdGVyLiAgKi8KLSAgICAgIGV4LlhfYWRkX251bWJlciA9IGVwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBlcC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQlvZmYgPSA0OwotICAgICAgZWxzZQotCW9mZiA9IDA7Ci0gICAgICBmcmFnX2dyb3cgKDMyKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgImx1aSIsICJ0LHUiLCByZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgImQsdix0IiwgcmVnLCByZWcsIEdQKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgPyAibHciIDogImxkIiksCi0JCSAgICJ0LG8oYikiLCByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LCByZWcpOwotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBvZmYsIDAsCi0JCSAgICBSRUxBWF9FTkNPREUgKDEyLCAxMiArIG9mZiwgb2ZmLCA4ICsgb2ZmLCAwLAotCQkJCSAgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zKSwKLQkJICAgIGVwLT5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgIGlmIChvZmYgPiAwKQotCXsKLQkgIC8qIFdlIG5lZWQgYSBub3AgYmVmb3JlIGxvYWRpbmcgZnJvbSAkZ3AuICBUaGlzIHNwZWNpYWwKLSAgICAgICAgICAgICBjaGVjayBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBsdWkgd2hpY2ggc3RhcnRzIHRoZSBtYWluCi0gICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gc3RyZWFtIGRvZXMgbm90IHJlZmVyIHRvICRncCwgYW5kIHNvIHdpbGwgbm90Ci0gICAgICAgICAgICAgaW5zZXJ0IHRoZSBub3Agd2hpY2ggbWF5IGJlIHJlcXVpcmVkLiAgKi8KLQkgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgKz0gNDsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAidCxvKGIpIiwgcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotICAgICAgcCArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgcCArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBpZiAoZXguWF9hZGRfbnVtYmVyICE9IDApCi0JewotCSAgaWYgKGV4LlhfYWRkX251bWJlciA8IC0weDgwMDAgfHwgZXguWF9hZGRfbnVtYmVyID49IDB4ODAwMCkKLQkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7Ci0JICBleC5YX29wID0gT19jb25zdGFudDsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmZXgsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0gICAgewotICAgICAgLyogV2UgYWx3YXlzIGRvCi0JICAgYWRkaXUJJHJlZywkZ3AsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgKi8KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAidCxyLGoiLCByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci19Ci0KLS8qCi0gKgkJCUJ1aWxkIG1hY3JvcwotICogICBUaGlzIHJvdXRpbmUgaW1wbGVtZW50cyB0aGUgc2VlbWluZ2x5IGVuZGxlc3MgbWFjcm8gb3Igc3ludGhlc2l6ZWQKLSAqIGluc3RydWN0aW9ucyBhbmQgYWRkcmVzc2luZyBtb2RlcyBpbiB0aGUgbWlwcyBhc3NlbWJseSBsYW5ndWFnZS4gTWFueQotICogb2YgdGhlc2UgbWFjcm9zIGFyZSBzaW1wbGUgYW5kIGFyZSBzaW1pbGFyIHRvIGVhY2ggb3RoZXIuIFRoZXNlIGNvdWxkCi0gKiBwcm9iYWJseSBiZSBoYW5kbGVkIGJ5IHNvbWUga2luZCBvZiB0YWJsZSBvciBncmFtbWVyIGFwcm9hY2ggaW5zdGVhZCBvZgotICogdGhpcyB2ZXJib3NlIG1ldGhvZC4gT3RoZXJzIGFyZSBub3Qgc2ltcGxlIG1hY3JvcyBidXQgYXJlIG1vcmUgbGlrZQotICogb3B0aW1pemluZyBjb2RlIGdlbmVyYXRpb24uCi0gKiAgIE9uZSBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb24gaXMgd2hlbiBzZXZlcmFsIHN0b3JlIG1hY3JvcyBhcHBlYXIKLSAqIGNvbnNlY3V0aXZseSB0aGF0IHdvdWxkIGxvYWQgQVQgd2l0aCB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgc2FtZSBhZGRyZXNzLgotICogVGhlIGVuc3VpbmcgbG9hZCB1cHBlciBpbnN0cnVjdGlvbnMgYXJlIG9tbWl0ZWQuIFRoaXMgaW1wbGllcyBzb21lIGtpbmQKLSAqIG9mIGdsb2JhbCBvcHRpbWl6YXRpb24uIFdlIGN1cnJlbnRseSBvbmx5IG9wdGltaXplIHdpdGhpbiBhIHNpbmdsZSBtYWNyby4KLSAqICAgRm9yIG1hbnkgb2YgdGhlIGxvYWQgYW5kIHN0b3JlIG1hY3JvcyBpZiB0aGUgYWRkcmVzcyBpcyBzcGVjaWZpZWQgYXMgYQotICogY29uc3RhbnQgZXhwcmVzc2lvbiBpbiB0aGUgZmlyc3QgNjRrIG9mIG1lbW9yeSAoaWUgbGQgJDIsMHg0MDAwYykgd2UKLSAqIGZpcnN0IGxvYWQgcmVnaXN0ZXIgJ2F0JyB3aXRoIHplcm8gYW5kIHVzZSBpdCBhcyB0aGUgYmFzZSByZWdpc3Rlci4gVGhlCi0gKiBtaXBzIGFzc2VtYmxlciBzaW1wbHkgdXNlcyByZWdpc3RlciAkemVyby4gSnVzdCBvbmUgdGlueSBvcHRpbWl6YXRpb24KLSAqIHdlJ3JlIG1pc3NpbmcuCi0gKi8KLXN0YXRpYyB2b2lkCi1tYWNybyAoaXApCi0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotewotICByZWdpc3RlciBpbnQgdHJlZywgc3JlZywgZHJlZywgYnJlZzsKLSAgaW50IHRlbXByZWc7Ci0gIGludCBtYXNrOwotICBpbnQgaWNudCA9IDA7Ci0gIGludCB1c2VkX2F0OwotICBleHByZXNzaW9uUyBleHByMTsKLSAgY29uc3QgY2hhciAqczsKLSAgY29uc3QgY2hhciAqczI7Ci0gIGNvbnN0IGNoYXIgKmZtdDsKLSAgaW50IGxpa2VseSA9IDA7Ci0gIGludCBkYmwgPSAwOwotICBpbnQgY29wcm9jID0gMDsKLSAgaW50IGxyID0gMDsKLSAgaW50IGltbSA9IDA7Ci0gIG9mZnNldFQgbWF4bnVtOwotICBpbnQgb2ZmOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKLSAgY2hhciAqcDsKLSAgaW50IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQotICBhc3NlcnQgKCEgbWlwc19vcHRzLm1pcHMxNik7Ci0KLSAgdHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMTYpICYgMHgxZjsKLSAgZHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMTEpICYgMHgxZjsKLSAgc3JlZyA9IGJyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDIxKSAmIDB4MWY7Ci0gIG1hc2sgPSBpcC0+aW5zbl9tby0+bWFzazsKLQotICBleHByMS5YX29wID0gT19jb25zdGFudDsKLSAgZXhwcjEuWF9vcF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotCi0gIHN3aXRjaCAobWFzaykKLSAgICB7Ci0gICAgY2FzZSBNX0RBQlM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9BQlM6Ci0gICAgICAvKiBiZ2V6ICRhMCwuKzEyCi0JIG1vdmUgdjAsJGEwCi0JIHN1YiB2MCwkemVybywkYTAKLQkgKi8KLQotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotCi0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJiZ2V6IiwgInMscCIsIHNyZWcpOwotICAgICAgaWYgKGRyZWcgPT0gc3JlZykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7Ci0gICAgICBlbHNlCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLCBzcmVnLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzdWIiIDogInN1YiIsCi0JCSAgICJkLHYsdCIsIGRyZWcsIDAsIHNyZWcpOwotCi0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fQUREX0k6Ci0gICAgICBzID0gImFkZGkiOwotICAgICAgczIgPSAiYWRkIjsKLSAgICAgIGdvdG8gZG9fYWRkaTsKLSAgICBjYXNlIE1fQUREVV9JOgotICAgICAgcyA9ICJhZGRpdSI7Ci0gICAgICBzMiA9ICJhZGR1IjsKLSAgICAgIGdvdG8gZG9fYWRkaTsKLSAgICBjYXNlIE1fREFERF9JOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGFkZGkiOwotICAgICAgczIgPSAiZGFkZCI7Ci0gICAgICBnb3RvIGRvX2FkZGk7Ci0gICAgY2FzZSBNX0RBRERVX0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkYWRkaXUiOwotICAgICAgczIgPSAiZGFkZHUiOwotICAgIGRvX2FkZGk6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCBzLCAidCxyLGoiLCB0cmVnLCBzcmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQsdix0IiwgdHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQU5EX0k6Ci0gICAgICBzID0gImFuZGkiOwotICAgICAgczIgPSAiYW5kIjsKLSAgICAgIGdvdG8gZG9fYml0OwotICAgIGNhc2UgTV9PUl9JOgotICAgICAgcyA9ICJvcmkiOwotICAgICAgczIgPSAib3IiOwotICAgICAgZ290byBkb19iaXQ7Ci0gICAgY2FzZSBNX05PUl9JOgotICAgICAgcyA9ICIiOwotICAgICAgczIgPSAibm9yIjsKLSAgICAgIGdvdG8gZG9fYml0OwotICAgIGNhc2UgTV9YT1JfSToKLSAgICAgIHMgPSAieG9yaSI7Ci0gICAgICBzMiA9ICJ4b3IiOwotICAgIGRvX2JpdDoKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDEwMDAwKQotCXsKLQkgIGlmIChtYXNrICE9IE1fTk9SX0kpCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCBzLCAidCxyLGkiLCB0cmVnLAotCQkJIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAib3JpIiwgInQscixpIiwKLQkJCSAgIHRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3IiLCAiZCx2LHQiLAotCQkJICAgdHJlZywgdHJlZywgMCk7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJkLHYsdCIsIHRyZWcsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JFUV9JOgotICAgICAgcyA9ICJiZXEiOwotICAgICAgZ290byBiZXFfaTsKLSAgICBjYXNlIE1fQkVRTF9JOgotICAgICAgcyA9ICJiZXFsIjsKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgICBnb3RvIGJlcV9pOwotICAgIGNhc2UgTV9CTkVfSToKLSAgICAgIHMgPSAiYm5lIjsKLSAgICAgIGdvdG8gYmVxX2k7Ci0gICAgY2FzZSBNX0JORUxfSToKLSAgICAgIHMgPSAiYm5lbCI7Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGJlcV9pOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInMsdCxwIiwgc3JlZywKLQkJICAgICAgIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAicyx0LHAiLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR0VMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdFOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ2V6bCIgOiAiYmdleiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibGV6bCIgOiAiYmxleiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR1RMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR1RfSToKLSAgICAgIC8qIGNoZWNrIGZvciA+IG1heCBpbnRlZ2VyICovCi0gICAgICBtYXhudW0gPSAweDdmZmZmZmZmOwotICAgICAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkgJiYgc2l6ZW9mIChtYXhudW0pID4gNCkKLQl7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQkgIG1heG51bSA8PD0gMTY7Ci0JICBtYXhudW0gfD0gMHhmZmZmOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSBtYXhudW0KLQkgICYmICghIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkgfHwgc2l6ZW9mIChtYXhudW0pID4gNCkpCi0JewotCWRvX2ZhbHNlOgotCSAgLyogcmVzdWx0IGlzIGFsd2F5cyBmYWxzZSAqLwotCSAgaWYgKCEgbGlrZWx5KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiQnJhbmNoICVzIGlzIGFsd2F5cyBmYWxzZSAobm9wKSIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJCcmFuY2ggbGlrZWx5ICVzIGlzIGFsd2F5cyBmYWxzZSIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJibmVsIiwKLQkJCSAgICJzLHQscCIsIDAsIDApOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CR0VfSToKLSAgICBjYXNlIE1fQkdFTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CR0VMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmdlemwiIDogImJnZXoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmd0emwiIDogImJndHoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1heG51bSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSAmJiBzaXplb2YgKG1heG51bSkgPiA0KQotCXsKLQkgIG1heG51bSA8PD0gMTY7Ci0JICBtYXhudW0gfD0gMHhmZmZmOwotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JfQotICAgICAgbWF4bnVtID0gLSBtYXhudW0gLSAxOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw9IG1heG51bQotCSAgJiYgKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSB8fCBzaXplb2YgKG1heG51bSkgPiA0KSkKLQl7Ci0JZG9fdHJ1ZToKLQkgIC8qIHJlc3VsdCBpcyBhbHdheXMgdHJ1ZSAqLwotCSAgYXNfd2FybiAoXygiQnJhbmNoICVzIGlzIGFsd2F5cyB0cnVlIiksIGlwLT5pbnNuX21vLT5uYW1lKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiYiIsICJwIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc2V0X2F0ICgmaWNudCwgc3JlZywgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHRVVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdFVToKLSAgICAgIGlmICh0cmVnID09IDApCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAgICAgInMsdCxwIiwgMCwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIEFULCBzcmVnLAotCQkgICB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkdUVUxfSToKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHVFVfSToKLSAgICAgIGlmIChzcmVnID09IDAKLQkgIHx8ICghIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkKLQkgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikpCi0JZ290byBkb19mYWxzZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlcisrOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIE1fQkdFVV9JOgotICAgIGNhc2UgTV9CR0VVTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CR0VVTF9JKQotCWxpa2VseSA9IDE7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR1RMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdUOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ3R6bCIgOiAiYmd0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibHR6bCIgOiAiYmx0eiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR1RVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHVFU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCWdvdG8gZG9fZmFsc2U7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHRyZWcsCi0JCSAgIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxFOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibGV6bCIgOiAiYmxleiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ2V6bCIgOiAiYmdleiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTEVfSToKLSAgICAgIG1heG51bSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSAmJiBzaXplb2YgKG1heG51bSkgPiA0KQotCXsKLQkgIG1heG51bSA8PD0gMTY7Ci0JICBtYXhudW0gfD0gMHhmZmZmOwotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IG1heG51bQotCSAgJiYgKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSB8fCBzaXplb2YgKG1heG51bSkgPiA0KSkKLQlnb3RvIGRvX3RydWU7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIrKzsKLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBNX0JMVF9JOgotICAgIGNhc2UgTV9CTFRMX0k6Ci0gICAgICBpZiAobWFzayA9PSBNX0JMVExfSSkKLQlsaWtlbHkgPSAxOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibHR6bCIgOiAiYmx0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibGV6bCIgOiAiYmxleiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc2V0X2F0ICgmaWNudCwgc3JlZywgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMRVVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxFVToKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JZ290byBkb190cnVlOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIEFULCB0cmVnLAotCQkgICBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkxFVUxfSToKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMRVVfSToKLSAgICAgIGlmIChzcmVnID09IDAKLQkgIHx8ICghIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkKLQkgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikpCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CTFRVX0k6Ci0gICAgY2FzZSBNX0JMVFVMX0k6Ci0gICAgICBpZiAobWFzayA9PSBNX0JMVFVMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JZ290byBkb19mYWxzZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTFRMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxUOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibHR6bCIgOiAiYmx0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ3R6bCIgOiAiYmd0eiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTFRVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMVFU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCWdvdG8gZG9fZmFsc2U7Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICAgICAicyx0LHAiLCAwLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHNyZWcsCi0JCSAgIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ERElWXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9ESVZfMzoKLSAgICAgIHMgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdjM7Ci0gICAgY2FzZSBNX0RSRU1fMzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX1JFTV8zOgotICAgICAgcyA9ICJtZmhpIjsKLSAgICBkb19kaXYzOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJEaXZpZGUgYnkgemVyby4iKSk7Ci0JICBpZiAobWlwc190cmFwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgMCwgMCk7Ci0JICBlbHNlCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgaWYgKG1pcHNfdHJhcCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgdHJlZywgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgICAgICBkYmwgPyAiZGRpdiIgOiAiZGl2IiwKLQkJICAgICAgICJ6LHMsdCIsIHNyZWcsIHRyZWcpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgICAgIGRibCA/ICJkZGl2IiA6ICJkaXYiLAotCQkgICAgICAgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA3KTsKLQl9Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAtMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCi0JCSAgICJ0LHIsaiIsIEFULCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSBtaXBzX3RyYXAgPyAoZGJsID8gMTIgOiA4KSA6IChkYmwgPyAyMCA6IDE2KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgdHJlZywgQVQpOwotICAgICAgaWYgKGRibCkKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJkYWRkaXUiLCAidCxyLGoiLCBBVCwgMCwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImRzbGwzMiIsICJkLHcsPCIsIEFULCBBVCwKLQkJICAgICAgIDMxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMHg4MDAwMDAwMDsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAibHVpIiwgInQsdSIsIEFULAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOwotCX0KLSAgICAgIGlmIChtaXBzX3RyYXApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIHNyZWcsIEFUKTsKLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCBzcmVnLCBBVCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7Ci0KLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA2KTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkIiwgZHJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ESVZfM0k6Ci0gICAgICBzID0gImRpdiI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRElWVV8zSToKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fUkVNXzNJOgotICAgICAgcyA9ICJkaXYiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX1JFTVVfM0k6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX0RESVZfM0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkZGl2IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9ERElWVV8zSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9EUkVNXzNJOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGRpdiI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRFJFTVVfM0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICBkb19kaXZpOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJEaXZpZGUgYnkgemVyby4iKSk7Ci0JICBpZiAobWlwc190cmFwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgMCwgMCk7Ci0JICBlbHNlCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgaWYgKHN0cmNtcCAoczIsICJtZmxvIikgPT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLAotCQkJIHNyZWcpOwotCSAgZWxzZQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAtMQotCSAgJiYgc1tzdHJsZW4gKHMpIC0gMV0gIT0gJ3UnKQotCXsKLQkgIGlmIChzdHJjbXAgKHMyLCAibWZsbyIpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoZGJsKQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJkbmVnIiwgImQsdyIsIGRyZWcsCi0JCQkgICAgIHNyZWcpOwotCSAgICAgIGVsc2UKLQkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibmVnIiwgImQsdyIsIGRyZWcsCi0JCQkgICAgIHNyZWcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInoscyx0Iiwgc3JlZywgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQiLCBkcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RJVlVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX1JFTVVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RESVZVXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZ1MzsKLSAgICBjYXNlIE1fRFJFTVVfMzoKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgZG9fZGl2dTM6Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAobWlwc190cmFwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0JICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KLQkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KLQkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgdHJlZywgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ6LHMsdCIsIHNyZWcsIHRyZWcpOwotCi0JICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KLQkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KLQkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJkIiwgZHJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRExBX0FCOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTEFfQUI6Ci0gICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIGludG8gYSByZWdpc3Rlci4gIElmIGJyZWcgaXMgbm90Ci0JIHplcm8sIHdlIHRoZW4gYWRkIGEgYmFzZSByZWdpc3RlciB0byBpdC4gICovCi0KLSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSwgd2UgcGVybWl0IGV4cHJlc3Npb25zIG9mCi0JIHRoZSBmb3JtCi0JICAgbGEJJDQsZm9vLWJhcgotCSB3aGVyZSBiYXIgaXMgYW4gYWRkcmVzcyBpbiB0aGUgY3VycmVudCBzZWN0aW9uLiAgVGhlc2UgYXJlIHVzZWQKLQkgd2hlbiBnZXR0aW5nIHRoZSBhZGRyZXNzZXMgb2YgZnVuY3Rpb25zLiAgV2UgZG9uJ3QgcGVybWl0Ci0JIFhfYWRkX251bWJlciB0byBiZSBub24temVybywgYmVjYXVzZSBpZiB0aGUgc3ltYm9sIGlzCi0JIGV4dGVybmFsIHRoZSByZWxheGluZyBjb2RlIG5lZWRzIHRvIGtub3cgdGhhdCBhbnkgYWRkZW5kIGlzCi0JIHB1cmVseSB0aGUgb2Zmc2V0IHRvIFhfb3Bfc3ltYm9sLiAgKi8KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLQkgICYmIG9mZnNldF9leHByLlhfb3AgPT0gT19zdWJ0cmFjdAotCSAgJiYgKHN5bWJvbF9jb25zdGFudF9wIChvZmZzZXRfZXhwci5YX29wX3N5bWJvbCkKLQkgICAgICA/IFNfR0VUX1NFR01FTlQgKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKSA9PSBub3dfc2VnCi0JICAgICAgOiAoc3ltYm9sX2VxdWF0ZWRfcCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCi0JCSAmJiAoU19HRVRfU0VHTUVOVAotCQkgICAgIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKQotCQkgICAgICAtPlhfYWRkX3N5bWJvbCkKLQkJICAgICA9PSBub3dfc2VnKSkpCi0JICAmJiBicmVnID09IDAKLQkgICYmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMAotCSAgICAgIHx8IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKLQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdHJlZywgdHJlZywgKGludCkgQkZEX1JFTE9DX1BDUkVMX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgIT0gT19zeW1ib2wKLQkgICYmIG9mZnNldF9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQl7Ci0JICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICBvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQl9Ci0KLSAgICAgIGlmICh0cmVnID09IGJyZWcpCi0JewotCSAgdGVtcHJlZyA9IEFUOwotCSAgdXNlZF9hdCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRlbXByZWcgPSB0cmVnOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotCi0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCWxvYWRfcmVnaXN0ZXIgKCZpY250LCB0ZW1wcmVnLCAmb2Zmc2V0X2V4cHIsIGRibCk7Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJGdwLDxzeW0+CShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHdlIGhhdmUgYSBjb25zdGFudCwgd2UgbmVlZCB0d28gaW5zdHJ1Y3Rpb25zIGFueWhvdywKLQkgICAgIHNvIHdlIG1heSBhcyB3ZWxsIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBmb3JtLiAgKi8KLQkgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotCSAgICAgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCi0JICAgIHAgPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnJhZ19ncm93ICgyMCk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoNCwgOCwgMCwgNCwgMCwKLQkJCQkJICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgdGVtcHJlZyk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyAmJiAhIG1pcHNfYmlnX2dvdCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIHRoZXJlCi0JICAgICBpcyBubyBjb25zdGFudCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQotCSAgICAgSWYgd2UgaGF2ZSBhIHNtYWxsIGNvbnN0YW50LCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bwotCSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPGNvbnN0YW50PgotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50IHRoZSBzYW1lIGluc3RydWN0aW9uCi0JICAgICBzZXF1ZW5jZSwgYnV0IHdlIG91dHB1dCBhIEJGRF9SRUxPQ19MTzE2IHJlbG9jIG9uIHRoZQotCSAgICAgYWRkaXUgaW5zdHJ1Y3Rpb24uCi0KLQkgICAgIElmIHdlIGhhdmUgYSBsYXJnZSBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbHVpCSRhdCw8aGljb25zdGFudD4KLQkgICAgICAgYWRkaXUJJGF0LCRhdCw8bG9jb25zdGFudD4KLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYXQKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudCB0aGUgc2FtZSBpbnN0cnVjdGlvbgotCSAgICAgc2VxdWVuY2UsIGJ1dCB3ZSBvdXRwdXQgYSBCRkRfUkVMT0NfTE8xNiByZWxvYyBvbiB0aGUKLQkgICAgIGFkZGl1IGluc3RydWN0aW9uLiAgKi8KLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBmcmFnX2dyb3cgKDMyKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgZGJsID8gImxkIiA6ICJsdyIsCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGludCBvZmY7Ci0KLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQlvZmYgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlJ3JlIGdvaW5nIHRvIHB1dCBpbiBhbiBhZGR1IGluc3RydWN0aW9uIHVzaW5nCi0JCSAgICAgdGVtcHJlZywgc28gd2UgbWF5IGFzIHdlbGwgaW5zZXJ0IHRoZSBub3AgcmlnaHQKLQkJICAgICBub3cuICAqLwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBvZmYgPSA0OwotCQl9Ci0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCAtIG9mZiwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDAsIDggLSBvZmYsIC00IC0gb2ZmLCA0IC0gb2ZmLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQl7Ci0JCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkJICBwICs9IDQ7Ci0JCX0KLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIC8qIEZJWE1FOiBJZiBicmVnID09IDAsIGFuZCB0aGUgbmV4dCBpbnN0cnVjdGlvbiB1c2VzCi0JCSAkdGVtcHJlZywgdGhlbiBpZiB0aGlzIHZhcmlhbnQgY2FzZSBpcyB1c2VkIGFuIGV4dHJhCi0JCSBub3Agd2lsbCBiZSBnZW5lcmF0ZWQuICAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChleHByMS5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCQkgICAmJiBleHByMS5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgIm5vcCIsICIiKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgICh2b2lkKSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDAsIDAsCi0JCQkgICAgICAgUkVMQVhfRU5DT0RFICgwLCAwLCAtMTIsIC00LCAwLCAwKSwKLQkJCSAgICAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgICAgIChjaGFyICopIE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgb2ZmMTsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBnb2luZyB0byBhZGQgaW4gYSBiYXNlIHJlZ2lzdGVyLCBhbmQgdGhlCi0JCSB0YXJnZXQgcmVnaXN0ZXIgYW5kIHRoZSBiYXNlIHJlZ2lzdGVyIGFyZSB0aGUgc2FtZSwKLQkJIHRoZW4gd2UgYXJlIHVzaW5nIEFUIGFzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiAgU2luY2UKLQkJIHdlIHdhbnQgdG8gbG9hZCB0aGUgY29uc3RhbnQgaW50byBBVCwgd2UgYWRkIG91cgotCQkgY3VycmVudCBBVCAoZnJvbSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSkgYW5kIHRoZQotCQkgcmVnaXN0ZXIgaW50byB0aGUgcmVnaXN0ZXIgbm93LCBhbmQgcHJldGVuZCB3ZSB3ZXJlCi0JCSBub3QgdXNpbmcgYSBiYXNlIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoYnJlZyAhPSB0cmVnKQotCQlvZmYxID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICJub3AiLCAiIik7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgdHJlZywgQVQsIGJyZWcpOwotCQkgIGJyZWcgPSAwOwotCQkgIHRlbXByZWcgPSB0cmVnOwotCQkgIG9mZjEgPSAtODsKLQkJfQotCi0JICAgICAgLyogU2V0IG1pcHNfb3B0aW1pemUgYXJvdW5kIHRoZSBsdWkgaW5zdHJ1Y3Rpb24gdG8gYXZvaWQKLQkJIGluc2VydGluZyBhbiB1bm5lY2Vzc2FyeSBub3AgYWZ0ZXIgdGhlIGx3LiAgKi8KLQkgICAgICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSAyOwotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgQVQpOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0KLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgQVQsIEFULCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIEFUKTsKLQkgICAgICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAwLCAwLAotCQkJICAgICAgIFJFTEFYX0VOQ09ERSAoMCwgMCwgLTE2ICsgb2ZmMSwgLTgsIDAsIDApLAotCQkJICAgICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgICAgdXNlZF9hdCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpbnQgZ3BkZWw7Ci0KLQkgIC8qIFRoaXMgaXMgdGhlIGxhcmdlIEdPVCBjYXNlLiAgSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbgotCSAgICAgZXh0ZXJuYWwgc3ltYm9sLCBhbmQgdGhlcmUgaXMgbm8gY29uc3RhbnQsIHdlIHdhbnQKLQkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCi0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGdwCi0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCR0ZW1wcmVnKSAoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCi0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0KLQkgICAgIElmIHdlIGhhdmUgYSBzbWFsbCBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxjb25zdGFudD4KLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxjb25zdGFudD4gKEJGRF9SRUxPQ19MTzE2KQotCi0JICAgICBJZiB3ZSBoYXZlIGEgbGFyZ2UgY29uc3RhbnQsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCi0JICAgICBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCi0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGdwCi0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCR0ZW1wcmVnKSAoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCi0JICAgICAgIGx1aQkkYXQsPGhpY29uc3RhbnQ+Ci0JICAgICAgIGFkZGl1CSRhdCwkYXQsPGxvY29uc3RhbnQ+Ci0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGF0Ci0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIGx1aQkkYXQsPGhpY29uc3RhbnQ+Ci0JICAgICAgIGFkZGl1CSRhdCwkYXQsPGxvY29uc3RhbnQ+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYXQKLQkgICAgICovCi0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgZnJhZ19ncm93ICg1Mik7Ci0JICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0JICAgIGdwZGVsID0gNDsKLQkgIGVsc2UKLQkgICAgZ3BkZWwgPSAwOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKLQkJICAgICAgIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgR1ApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBkYmwgPyAibGQiIDogImx3IiwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwKLQkJICAgICAgIHRlbXByZWcpOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA9PSAwKQotCSAgICB7Ci0JICAgICAgaW50IG9mZjsKLQotCSAgICAgIGlmIChicmVnID09IDApCi0JCW9mZiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UncmUgZ29pbmcgdG8gcHV0IGluIGFuIGFkZHUgaW5zdHJ1Y3Rpb24gdXNpbmcKLQkJICAgICB0ZW1wcmVnLCBzbyB3ZSBtYXkgYXMgd2VsbCBpbnNlcnQgdGhlIG5vcCByaWdodAotCQkgICAgIG5vdy4gICovCi0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAibm9wIiwgIiIpOwotCQkgIG9mZiA9IDQ7Ci0JCX0KLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgxMiArIG9mZiwgMTIgKyBncGRlbCwgZ3BkZWwsCi0JCQkJCSAgOCArIGdwZGVsLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkJICAgJiYgZXhwcjEuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICJub3AiLCAiIik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgyMCwgMTIgKyBncGRlbCwgZ3BkZWwsIDggKyBncGRlbCwgMCwKLQkJCQkJICAoYnJlZyA9PSAwCi0JCQkJCSAgID8gbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgIDogMCkpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBhZGosIGRyZWc7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gYWRkIGluIGEgYmFzZSByZWdpc3RlciwgYW5kIHRoZQotCQkgdGFyZ2V0IHJlZ2lzdGVyIGFuZCB0aGUgYmFzZSByZWdpc3RlciBhcmUgdGhlIHNhbWUsCi0JCSB0aGVuIHdlIGFyZSB1c2luZyBBVCBhcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gIFNpbmNlCi0JCSB3ZSB3YW50IHRvIGxvYWQgdGhlIGNvbnN0YW50IGludG8gQVQsIHdlIGFkZCBvdXIKLQkJIGN1cnJlbnQgQVQgKGZyb20gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUpIGFuZCB0aGUKLQkJIHJlZ2lzdGVyIGludG8gdGhlIHJlZ2lzdGVyIG5vdywgYW5kIHByZXRlbmQgd2Ugd2VyZQotCQkgbm90IHVzaW5nIGEgYmFzZSByZWdpc3Rlci4gICovCi0JICAgICAgaWYgKGJyZWcgIT0gdHJlZykKLQkJewotCQkgIGFkaiA9IDA7Ci0JCSAgZHJlZyA9IHRlbXByZWc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc3NlcnQgKHRlbXByZWcgPT0gQVQpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICAgICAiZCx2LHQiLCB0cmVnLCBBVCwgYnJlZyk7Ci0JCSAgZHJlZyA9IHRyZWc7Ci0JCSAgYWRqID0gODsKLQkJfQotCi0JICAgICAgLyogU2V0IG1pcHNfb3B0aW1pemUgYXJvdW5kIHRoZSBsdWkgaW5zdHJ1Y3Rpb24gdG8gYXZvaWQKLQkJIGluc2VydGluZyBhbiB1bm5lY2Vzc2FyeSBub3AgYWZ0ZXIgdGhlIGx3LiAgKi8KLQkgICAgICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSAyOwotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgQVQpOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0KLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgQVQsIEFULCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDE2ICsgZ3BkZWwgKyBhZGosIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgyNCArIGFkaiwgMTYgKyBncGRlbCArIGFkaiwgZ3BkZWwsCi0JCQkJCSAgOCArIGdwZGVsLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQotCSAgICAgIHVzZWRfYXQgPSAxOwotCSAgICB9Ci0KLQkgIGlmIChncGRlbCA+IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyAkZ3AsIGJ1dAotICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb24gdGhlIG1haW4gc3RyZWFtIGRvZXMgbm90LiAgKi8KLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBkYmwgPyAibGQiIDogImx3IiwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAgICAgJiYgZXhwcjEuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgICAgICAvKiBGSVhNRTogSWYgYWRkX251bWJlciBpcyAwLCBhbmQgdGhlcmUgd2FzIG5vIGJhc2UKLSAgICAgICAgICAgICAgICAgcmVnaXN0ZXIsIHRoZSBleHRlcm5hbCBzeW1ib2wgY2FzZSBlbmRlZCB3aXRoIGEgbG9hZCwKLSAgICAgICAgICAgICAgICAgc28gaWYgdGhlIHN5bWJvbCB0dXJucyBvdXQgdG8gbm90IGJlIGV4dGVybmFsLCBhbmQKLSAgICAgICAgICAgICAgICAgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdXNlcyB0ZW1wcmVnLCBhbiB1bm5lY2Vzc2FyeSBub3AKLSAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbnNlcnRlZC4gICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChicmVnID09IHRyZWcpCi0JCXsKLQkJICAvKiBXZSBtdXN0IGFkZCBpbiB0aGUgYmFzZSByZWdpc3RlciBub3csIGFzIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgc3ltYm9sIGNhc2UuICAqLwotCQkgIGFzc2VydCAodGVtcHJlZyA9PSBBVCk7Ci0JCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkJICBwICs9IDQ7Ci0JCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgdHJlZywgQVQsIGJyZWcpOwotCQkgIHAgKz0gNDsKLQkJICB0ZW1wcmVnID0gdHJlZzsKLQkJICAvKiBXZSBzZXQgYnJlZyB0byAwIGJlY2F1c2Ugd2UgaGF2ZSBhcnJhbmdlZCB0byBhZGQKLSAgICAgICAgICAgICAgICAgICAgIGl0IGluIGluIGJvdGggY2FzZXMuICAqLwotCQkgIGJyZWcgPSAwOwotCQl9Ci0KLQkgICAgICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmZXhwcjEsIEFUKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIEFULCBBVCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgQVQpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBXZSB1c2UKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJGdwLDxzeW0+CShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgImQsdix0IiwgdHJlZywgdGVtcHJlZywgYnJlZyk7Ci0KLSAgICAgIGlmICghIHVzZWRfYXQpCi0JcmV0dXJuOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9KX0E6Ci0gICAgICAvKiBUaGUgaiBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIHVzZWQgaW4gUElDIGNvZGUsIHNpbmNlIGl0Ci0JIHJlcXVpcmVzIGFuIGFic29sdXRlIGFkZHJlc3MuICBXZSBjb252ZXJ0IGl0IHRvIGEgYgotCSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiaiIsICJhIik7Ci0gICAgICBlbHNlCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJiIiwgInAiKTsKLSAgICAgIHJldHVybjsKLQotICAgICAgLyogVGhlIGphbCBpbnN0cnVjdGlvbnMgbXVzdCBiZSBoYW5kbGVkIGFzIG1hY3JvcyBiZWNhdXNlIHdoZW4KLQkgZ2VuZXJhdGluZyBQSUMgY29kZSB0aGV5IGV4cGFuZCB0byBtdWx0aS1pbnN0cnVjdGlvbgotCSBzZXF1ZW5jZXMuICBOb3JtYWxseSB0aGV5IGFyZSBzaW1wbGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICBjYXNlIE1fSkFMXzE6Ci0gICAgICBkcmVnID0gUkE7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgTV9KQUxfMjoKLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKLQkgIHx8IG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiamFsciIsCi0JCSAgICAgImQscyIsIGRyZWcsIHNyZWcpOwotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaWYgKHNyZWcgIT0gUElDX0NBTExfUkVHKQotCSAgICBhc193YXJuIChfKCJNSVBTIFBJQyBjYWxsIHRvIHJlZ2lzdGVyIG90aGVyIHRoYW4gJDI1IikpOwotICAgICAgCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiamFsciIsCi0JCSAgICAgICAiZCxzIiwgZHJlZywgc3JlZyk7Ci0JICBpZiAobWlwc19jcHJlc3RvcmVfb2Zmc2V0IDwgMCkKLQkgICAgYXNfd2FybiAoXygiTm8gLmNwcmVzdG9yZSBwc2V1ZG8tb3AgdXNlZCBpbiBQSUMgY29kZSIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IG1pcHNfY3ByZXN0b3JlX29mZnNldDsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAibHciIDogImxkIiksCi0JCQkgICAidCxvKGIpIiwgR1AsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBtaXBzX2ZyYW1lX3JlZyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9KQUxfQToKLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJqYWwiLCAiYSIpOwotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCB3ZSBhcmUKLQkgICAgIHVzaW5nIGEgc21hbGwgR09ULCB3ZSB3YW50Ci0JICAgICAgIGx3CSQyNSw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfQ0FMTDE2KQotCSAgICAgICBub3AKLQkgICAgICAgamFscgkkMjUKLQkgICAgICAgbm9wCi0JICAgICAgIGx3CSRncCxjcHJlc3RvcmUoJHNwKQotCSAgICAgVGhlIGNwcmVzdG9yZSB2YWx1ZSBpcyBzZXQgdXNpbmcgdGhlIC5jcHJlc3RvcmUKLQkgICAgIHBzZXVkby1vcC4gIElmIHdlIGFyZSB1c2luZyBhIGJpZyBHT1QsIHdlIHdhbnQKLQkgICAgICAgbHVpCSQyNSw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNikKLQkgICAgICAgYWRkdQkkMjUsJDI1LCRncAotCSAgICAgICBsdwkkMjUsPHN5bT4oJDI1KQkJKEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNikKLQkgICAgICAgbm9wCi0JICAgICAgIGphbHIJJDI1Ci0JICAgICAgIG5vcAotCSAgICAgICBsdwkkZ3AsY3ByZXN0b3JlKCRzcCkKLQkgICAgIElmIHRoZSBzeW1ib2wgaXMgbm90IGV4dGVybmFsLCB3ZSB3YW50Ci0JICAgICAgIGx3CSQyNSw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkMjUsJDI1LDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIGphbHIJJDI1Ci0JICAgICAgIG5vcAotCSAgICAgICBsdyAkZ3AsY3ByZXN0b3JlKCRzcCkgKi8KLQkgIGZyYWdfZ3JvdyAoNDApOwotCSAgaWYgKCEgbWlwc19iaWdfZ290KQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkJICAgInQsbyhiKSIsIFBJQ19DQUxMX1JFRywKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0NBTEwxNiwgR1ApOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibm9wIiwgIiIpOwotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgwLCA0LCAtOCwgMCwgMCwgMCksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGdwZGVsOwotCi0JICAgICAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCQlncGRlbCA9IDQ7Ci0JICAgICAgZWxzZQotCQlncGRlbCA9IDA7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKLQkJCSAgIFBJQ19DQUxMX1JFRywgKGludCkgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2KTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgUElDX0NBTExfUkVHLCBQSUNfQ0FMTF9SRUcsIEdQKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAibHciIDogImxkIiksCi0JCQkgICAidCxvKGIpIiwgUElDX0NBTExfUkVHLAotCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBQSUNfQ0FMTF9SRUcpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibm9wIiwgIiIpOwotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgxNiwgMTIgKyBncGRlbCwgZ3BkZWwsIDggKyBncGRlbCwKLQkJCQkJICAwLCAwKSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCSAgICAgIGlmIChncGRlbCA+IDApCi0JCXsKLQkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCQkgIHAgKz0gNDsKLQkJfQotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBQSUNfQ0FMTF9SRUcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQkJCSAgIAotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBQSUNfQ0FMTF9SRUcsIFBJQ19DQUxMX1JFRywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAiamFsciIsICJzIiwgUElDX0NBTExfUkVHKTsKLQkgIGlmIChtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPCAwKQotCSAgICBhc193YXJuIChfKCJObyAuY3ByZXN0b3JlIHBzZXVkby1vcCB1c2VkIGluIFBJQyBjb2RlIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICJub3AiLCAiIik7Ci0JICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBHUCwgKGludCkgQkZEX1JFTE9DX0xPMTYsCi0JCQkgICBtaXBzX2ZyYW1lX3JlZyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJiYWwiLCAicCIpOwotCSAgLyogVGhlIGxpbmtlciBtYXkgZXhwYW5kIHRoZSBjYWxsIHRvIGEgbG9uZ2VyIHNlcXVlbmNlIHdoaWNoCi0JICAgICB1c2VzICRhdCwgc28gd2UgbXVzdCBicmVhayByYXRoZXIgdGhhbiByZXR1cm4uICAqLwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fTEJfQUI6Ci0gICAgICBzID0gImxiIjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xCVV9BQjoKLSAgICAgIHMgPSAibGJ1IjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xIX0FCOgotICAgICAgcyA9ICJsaCI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MSFVfQUI6Ci0gICAgICBzID0gImxodSI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV19BQjoKLSAgICAgIHMgPSAibHciOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdDMF9BQjoKLSAgICAgIHMgPSAibHdjMCI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdDMV9BQjoKLSAgICAgIHMgPSAibHdjMSI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdDMl9BQjoKLSAgICAgIHMgPSAibHdjMiI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdDM19BQjoKLSAgICAgIHMgPSAibHdjMyI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdMX0FCOgotICAgICAgcyA9ICJsd2wiOwotICAgICAgbHIgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdSX0FCOgotICAgICAgcyA9ICJsd3IiOwotICAgICAgbHIgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTERDMV9BQjoKLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgcyA9ICJsZGMxIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MREMyX0FCOgotICAgICAgcyA9ICJsZGMyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MREMzX0FCOgotICAgICAgcyA9ICJsZGMzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MRExfQUI6Ci0gICAgICBzID0gImxkbCI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MRFJfQUI6Ci0gICAgICBzID0gImxkciI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MTF9BQjoKLSAgICAgIHMgPSAibGwiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTExEX0FCOgotICAgICAgcyA9ICJsbGQiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdVX0FCOgotICAgICAgcyA9ICJsd3UiOwotICAgIGxkOgotICAgICAgaWYgKGJyZWcgPT0gdHJlZyB8fCBjb3Byb2MgfHwgbHIpCi0JewotCSAgdGVtcHJlZyA9IEFUOwotCSAgdXNlZF9hdCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRlbXByZWcgPSB0cmVnOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZ290byBsZF9zdDsKLSAgICBjYXNlIE1fU0JfQUI6Ci0gICAgICBzID0gInNiIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NIX0FCOgotICAgICAgcyA9ICJzaCI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV19BQjoKLSAgICAgIHMgPSAic3ciOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dDMF9BQjoKLSAgICAgIHMgPSAic3djMCI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dDMV9BQjoKLSAgICAgIHMgPSAic3djMSI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dDMl9BQjoKLSAgICAgIHMgPSAic3djMiI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dDM19BQjoKLSAgICAgIHMgPSAic3djMyI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dMX0FCOgotICAgICAgcyA9ICJzd2wiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dSX0FCOgotICAgICAgcyA9ICJzd3IiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0NfQUI6Ci0gICAgICBzID0gInNjIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NDRF9BQjoKLSAgICAgIHMgPSAic2NkIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NEQzFfQUI6Ci0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHMgPSAic2RjMSI7Ci0gICAgICBjb3Byb2MgPSAxOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RDMl9BQjoKLSAgICAgIHMgPSAic2RjMiI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RDM19BQjoKLSAgICAgIHMgPSAic2RjMyI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RMX0FCOgotICAgICAgcyA9ICJzZGwiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RSX0FCOgotICAgICAgcyA9ICJzZHIiOwotICAgIHN0OgotICAgICAgdGVtcHJlZyA9IEFUOwotICAgICAgdXNlZF9hdCA9IDE7Ci0gICAgbGRfc3Q6Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBpZiAobWFzayA9PSBNX0xXQzFfQUIKLQkgIHx8IG1hc2sgPT0gTV9TV0MxX0FCCi0JICB8fCBtYXNrID09IE1fTERDMV9BQgotCSAgfHwgbWFzayA9PSBNX1NEQzFfQUIKLQkgIHx8IG1hc2sgPT0gTV9MX0RBQgotCSAgfHwgbWFzayA9PSBNX1NfREFCKQotCWZtdCA9ICJULG8oYikiOwotICAgICAgZWxzZSBpZiAoY29wcm9jKQotCWZtdCA9ICJFLG8oYikiOwotICAgICAgZWxzZQotCWZtdCA9ICJ0LG8oYikiOwotCi0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50Ci0JICAmJiBvZmZzZXRfZXhwci5YX29wICE9IE9fc3ltYm9sKQotCXsKLQkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCX0KLQotICAgICAgLyogQSBjb25zdGFudCBleHByZXNzaW9uIGluIFBJQyBjb2RlIGNhbiBiZSBoYW5kbGVkIGp1c3QgYXMgaXQKLQkgaXMgaW4gbm9uIFBJQyBjb2RlLiAgKi8KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKLQkgIHx8IG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgR1AgcmVsYXRpdmUgc3ltYm9sLCBhbmQgdGhlcmUKLQkgICAgIGlzIG5vIGJhc2UgcmVnaXN0ZXIsIHdlIHdhbnQKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCR0ZW1wcmVnKQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB3ZSBoYXZlIGEgY29uc3RhbnQsIHdlIG5lZWQgdHdvIGluc3RydWN0aW9ucyBhbnlob3csCi0JICAgICBzbyB3ZSBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgZm9ybS4KLQotCSAgICAgSWYgd2UgaGF2ZSBhIGJhc2UgcmVnaXN0ZXIsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEKLQkgICAgIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCRicmVnLCRncAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCR0ZW1wcmVnKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRicmVnCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgIFdpdGggYSBjb25zdGFudCB3ZSBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgY2FzZS4gICovCi0JICBpZiAoYnJlZyA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCh2YWx1ZVQpIG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0JCSAgfHwgbm9waWNfbmVlZF9yZWxheCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAxKSkKLQkJcCA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZnJhZ19ncm93ICgyMCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgR1ApOwotCQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDAsCi0JCQkJUkVMQVhfRU5DT0RFICg0LCA4LCAwLCA0LCAwLAotCQkJCQkgICAgICAobWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgICAgICB8fCAodXNlZF9hdAotCQkJCQkJICAgJiYgbWlwc19vcHRzLm5vYXQpKSksCi0JCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCQkoY2hhciAqKSBOVUxMKTsKLQkJICB1c2VkX2F0ID0gMDsKLQkJfQotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgdGVtcHJlZyk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsIHRyZWcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotCQkgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCi0JCXAgPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGZyYWdfZ3JvdyAoMjgpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRlbXByZWcsIGJyZWcsIEdQKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkJICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiwgMCwKLQkJCQlSRUxBWF9FTkNPREUgKDgsIDEyLCAwLCA4LCAwLCAwKSwKLQkJCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJCShjaGFyICopIE5VTEwpOwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCB0ZW1wcmVnKTsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQlwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIGJyZWcpOwotCSAgICAgIGlmIChwICE9IE5VTEwpCi0JCXAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LCB0cmVnLAotCQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIHRlbXByZWcpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJHRlbXByZWcpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSBhZGQgaXQgdG8gJHRlbXByZWcgYmVmb3JlCi0JICAgICB0aGUgPG9wPi4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIHdlIHN0aWNrIGl0IGluIHRoZQotCSAgICAgPG9wPiBpbnN0cnVjdGlvbi4gIFdlIGRvbid0IGhhbmRsZSBjb25zdGFudHMgbGFyZ2VyIHRoYW4KLQkgICAgIDE2IGJpdHMsIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgdG8gbG9hZCB0aGUgdXBwZXIgMTYgYml0cwotCSAgICAgKGFjdHVhbGx5LCB3ZSBjb3VsZCBoYW5kbGUgdGhlbSBmb3IgdGhlIHN1YnNldCBvZiBjYXNlcwotCSAgICAgaW4gd2hpY2ggd2UgYXJlIG5vdCB1c2luZyAkYXQpLiAgKi8KLQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKLQkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGZyYWdfZ3JvdyAoMjApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAwLCAKLQkJCVJFTEFYX0VOQ09ERSAoMCwgNCwgLTgsIDAsIDAsIDApLAotCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCShjaGFyICopIE5VTEwpOwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBicmVnKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsIHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaW50IGdwZGVsOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIDxvcD4JJHRyZWcsMCgkdGVtcHJlZykKLQkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3Rlciwgd2UgYWRkIGl0IHRvICR0ZW1wcmVnIGJlZm9yZQotCSAgICAgdGhlIDxvcD4uICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCB3ZSBzdGljayBpdCBpbiB0aGUKLQkgICAgIDxvcD4gaW5zdHJ1Y3Rpb24uICBXZSBkb24ndCBoYW5kbGUgY29uc3RhbnRzIGxhcmdlciB0aGFuCi0JICAgICAxNiBiaXRzLCBiZWNhdXNlIHdlIGhhdmUgbm8gd2F5IHRvIGxvYWQgdGhlIHVwcGVyIDE2IGJpdHMKLQkgICAgIChhY3R1YWxseSwgd2UgY291bGQgaGFuZGxlIHRoZW0gZm9yIHRoZSBzdWJzZXQgb2YgY2FzZXMKLQkgICAgIGluIHdoaWNoIHdlIGFyZSBub3QgdXNpbmcgJGF0KS4gICovCi0JICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wpOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCkKLQkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7Ci0JICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0JICAgIGdwZGVsID0gNDsKLQkgIGVsc2UKLQkgICAgZ3BkZWwgPSAwOwotCSAgZnJhZ19ncm93ICgzNik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgR1ApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsCi0JCSAgICAgICB0ZW1wcmVnKTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQlSRUxBWF9FTkNPREUgKDEyLCAxMiArIGdwZGVsLCBncGRlbCwgOCArIGdwZGVsLCAwLCAwKSwKLQkJCW9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOwotCSAgaWYgKGdwZGVsID4gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgKz0gNDsKLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgYnJlZyk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LCB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIHRlbXByZWcpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBJZiB0aGVyZSBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB3YW50Ci0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIsIHdlIHdhbnQKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkYnJlZywkZ3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkdGVtcHJlZykJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgKi8KLQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBpZiAoYnJlZyA9PSAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBHUCk7Ci0JICAgICAgdXNlZF9hdCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCB0ZW1wcmVnLCBicmVnLCBHUCk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKCEgdXNlZF9hdCkKLQlyZXR1cm47Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0xJOgotICAgIGNhc2UgTV9MSV9TOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRExJOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fTElfU1M6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sCi0JCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQKLQkJCQkJICAgKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCkpLAotCQkJICAgICAiLmxpdDQiKSA9PSAwCi0JCSAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsd2MxIiwgIlQsbyhiKSIsCi0JCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBHUCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgY2FzZSBNX0xJX0Q6Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGEgY29uc3RhbnQgaW4gSU1NX0VYUFIsIHRoZW4gaW4gbWlwczMgbW9kZSBpdCBpcwotICAgICAgICAgdGhlIGVudGlyZSB2YWx1ZSwgYW5kIGluIG1pcHMxIG1vZGUgaXQgaXMgdGhlIGhpZ2ggb3JkZXIgMzIKLSAgICAgICAgIGJpdHMgb2YgdGhlIHZhbHVlIGFuZCB0aGUgbG93IG9yZGVyIDMyIGJpdHMgYXJlIGVpdGhlciB6ZXJvCi0gICAgICAgICBvciBpbiBvZmZzZXRfZXhwci4gICovCi0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50IHx8IGltbV9leHByLlhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCB0cmVnLCAmaW1tX2V4cHIsIDEpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGhyZWcsIGxyZWc7Ci0KLQkgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JCXsKLQkJICBocmVnID0gdHJlZzsKLQkJICBscmVnID0gdHJlZyArIDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBocmVnID0gdHJlZyArIDE7Ci0JCSAgbHJlZyA9IHRyZWc7Ci0JCX0KLQotCSAgICAgIGlmIChocmVnIDw9IDMxKQotCQlsb2FkX3JlZ2lzdGVyICgmaWNudCwgaHJlZywgJmltbV9leHByLCAwKTsKLQkgICAgICBpZiAobHJlZyA8PSAzMSkKLQkJewotCQkgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fYWJzZW50KQotCQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLAotCQkJCSBscmVnLCAwKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KTsKLQkJICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIGxyZWcsICZvZmZzZXRfZXhwciwgMCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogV2Uga25vdyB0aGF0IHN5bSBpcyBpbiB0aGUgLnJkYXRhIHNlY3Rpb24uICBGaXJzdCB3ZSBnZXQgdGhlCi0JIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGFkZHJlc3MuICAqLwotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLQl7Ci0JICAvKiBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGZvciBhIDY0IGJpdCBhZGRyZXNzLiAgKi8KLQkgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgQVQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBGb3IgZW1iZWRkZWQgUElDIHdlIHBpY2sgdXAgdGhlIGVudGlyZSBhZGRyZXNzIG9mZiAkZ3AgaW4KLQkgICAgIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIEFULCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQkKLSAgICAgIC8qIE5vdyB3ZSBsb2FkIHRoZSByZWdpc3RlcihzKS4gICovCi0gICAgICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkIiwgInQsbyhiKSIsCi0JCSAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3IiwgInQsbyhiKSIsCi0JCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgaWYgKHRyZWcgIT0gMzEpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogSG93IGluIHRoZSB3b3JsZCBkbyB3ZSBkZWFsIHdpdGggdGhlIHBvc3NpYmxlCi0JCSBvdmVyZmxvdyBoZXJlPyAgKi8KLQkgICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3IiwgInQsbyhiKSIsCi0JCQkgICB0cmVnICsgMSwgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogVG8gYXZvaWQgY29uZnVzaW9uIGluIHRjX2dlbl9yZWxvYywgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGlzCi0JIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4gICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbmV3ICgwKTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fTElfREQ6Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGEgY29uc3RhbnQgaW4gSU1NX0VYUFIsIHRoZW4gaW4gbWlwczMgbW9kZSBpdCBpcwotICAgICAgICAgdGhlIGVudGlyZSB2YWx1ZSwgYW5kIGluIG1pcHMxIG1vZGUgaXQgaXMgdGhlIGhpZ2ggb3JkZXIgMzIKLSAgICAgICAgIGJpdHMgb2YgdGhlIHZhbHVlIGFuZCB0aGUgbG93IG9yZGVyIDMyIGJpdHMgYXJlIGVpdGhlciB6ZXJvCi0gICAgICAgICBvciBpbiBvZmZzZXRfZXhwci4gICovCi0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50IHx8IGltbV9leHByLlhfb3AgPT0gT19iaWcpCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpOwotCSAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgImRtdGMxIiwgInQsUyIsIEFULCB0cmVnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyArIDEpOwotCSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fYWJzZW50KQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAibXRjMSIsICJ0LEciLCAwLCB0cmVnKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCk7Ci0JCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIsIDApOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm10YzEiLCAidCxHIiwgQVQsIHRyZWcpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sCi0JICAgICAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApOwotICAgICAgcyA9IHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sKSk7Ci0gICAgICBpZiAoc3RyY21wIChzLCAiLmxpdDgiKSA9PSAwKQotCXsKLQkgIGlmIChtaXBzX29wdHMuaXNhICE9IDEpCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkYzEiLAotCQkJICAgIlQsbyhiKSIsIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIEdQKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGJyZWcgPSBHUDsKLQkgIHIgPSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMOwotCSAgZ290byBkb2I7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzc2VydCAoc3RyY21wIChzLCBSREFUQV9TRUNUSU9OX05BTUUpID09IDApOwotCSAgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgPyAibHciIDogImxkIiksCi0JCQkgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFRoaXMgd29uJ3Qgd29yayBmb3IgYSA2NCBiaXQgYWRkcmVzcy4gICovCi0JICAgICAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBBVCk7Ci0JICAgIH0KLQkgICAgICAKLQkgIGlmIChtaXBzX29wdHMuaXNhICE9IDEpCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkYzEiLAotCQkJICAgIlQsbyhiKSIsIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0KLQkgICAgICAvKiBUbyBhdm9pZCBjb25mdXNpb24gaW4gdGNfZ2VuX3JlbG9jLCB3ZSBtdXN0IGVuc3VyZQotCQkgdGhhdCB0aGlzIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4gICovCi0JICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0JICAgICAgZnJhZ19uZXcgKDApOwotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWcgPSBBVDsKLQkgIHIgPSBCRkRfUkVMT0NfTE8xNjsKLQkgIGdvdG8gZG9iOwotCX0KLQotICAgIGNhc2UgTV9MX0RPQjoKLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgLyogRXZlbiBvbiBhIGJpZyBlbmRpYW4gbWFjaGluZSAkZm4gY29tZXMgYmVmb3JlICRmbisxLiAgV2UgaGF2ZQotCSB0byBhZGp1c3Qgd2hlbiBsb2FkaW5nIGZyb20gbWVtb3J5LiAgKi8KLSAgICAgIHIgPSBCRkRfUkVMT0NfTE8xNjsKLSAgICBkb2I6Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPT0gMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3YzEiLCAiVCxvKGIpIiwKLQkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgIChpbnQpIHIsIGJyZWcpOwotICAgICAgLyogRklYTUU6IEEgcG9zc2libGUgb3ZlcmZsb3cgd2hpY2ggSSBkb24ndCBrbm93IGhvdyB0byBkZWFsCi0JIHdpdGguICAqLwotICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3YzEiLCAiVCxvKGIpIiwKLQkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgIChpbnQpIHIsIGJyZWcpOwotCi0gICAgICAvKiBUbyBhdm9pZCBjb25mdXNpb24gaW4gdGNfZ2VuX3JlbG9jLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoaXMKLQkgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotCi0gICAgICBpZiAoYnJlZyAhPSBBVCkKLQlyZXR1cm47Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9MX0RBQjoKLSAgICAgIC8qCi0gICAgICAgKiBUaGUgTUlQUyBhc3NlbWJsZXIgc2VlbXMgdG8gY2hlY2sgZm9yIFhfYWRkX251bWJlciBub3QKLSAgICAgICAqIGJlaW5nIGRvdWJsZSBhbGlnbmVkIGFuZCBnZW5lcmF0aW5nOgotICAgICAgICoJbHVpCWF0LCVoaShmb28rMSkKLSAgICAgICAqCWFkZHUJYXQsYXQsdjEKLSAgICAgICAqCWFkZGl1CWF0LGF0LCVsbyhmb28rMSkKLSAgICAgICAqCWx3YzEJZjIsMChhdCkKLSAgICAgICAqCWx3YzEJZjMsNChhdCkKLSAgICAgICAqIEJ1dCwgdGhlIHJlc3VsdGluZyBhZGRyZXNzIGlzIHRoZSBzYW1lIGFmdGVyIHJlbG9jYXRpb24gc28gd2h5Ci0gICAgICAgKiBnZW5lcmF0ZSB0aGUgZXh0cmEgaW5zdHJ1Y3Rpb24/Ci0gICAgICAgKi8KLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGlmIChtaXBzX29wdHMuaXNhICE9IDEpCi0JewotCSAgcyA9ICJsZGMxIjsKLQkgIGdvdG8gbGQ7Ci0JfQotCi0gICAgICBzID0gImx3YzEiOwotICAgICAgZm10ID0gIlQsbyhiKSI7Ci0gICAgICBnb3RvIGxkZF9zdGQ7Ci0KLSAgICBjYXNlIE1fU19EQUI6Ci0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgIT0gMSkKLQl7Ci0JICBzID0gInNkYzEiOwotCSAgZ290byBzdDsKLQl9Ci0KLSAgICAgIHMgPSAic3djMSI7Ci0gICAgICBmbXQgPSAiVCxvKGIpIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkZF9zdGQ7Ci0KLSAgICBjYXNlIE1fTERfQUI6Ci0gICAgICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQl7Ci0JICBzID0gImxkIjsKLQkgIGdvdG8gbGQ7Ci0JfQotCi0gICAgICBzID0gImx3IjsKLSAgICAgIGZtdCA9ICJ0LG8oYikiOwotICAgICAgZ290byBsZGRfc3RkOwotCi0gICAgY2FzZSBNX1NEX0FCOgotICAgICAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JewotCSAgcyA9ICJzZCI7Ci0JICBnb3RvIHN0OwotCX0KLQotICAgICAgcyA9ICJzdyI7Ci0gICAgICBmbXQgPSAidCxvKGIpIjsKLQotICAgIGxkZF9zdGQ6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX3N5bWJvbAotCSAgJiYgb2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCX0KLQotICAgICAgLyogRXZlbiBvbiBhIGJpZyBlbmRpYW4gbWFjaGluZSAkZm4gY29tZXMgYmVmb3JlICRmbisxLiAgV2UgaGF2ZQotCSB0byBhZGp1c3Qgd2hlbiBsb2FkaW5nIGZyb20gbWVtb3J5LiAgV2Ugc2V0IGNvcHJvYyBpZiB3ZSBtdXN0Ci0JIGxvYWQgJGZuKzEgZmlyc3QuICAqLwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JY29wcm9jID0gMDsKLQotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgfHwgb2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB3ZSBoYXZlIGEgYmFzZSByZWdpc3Rlciwgd2UgdXNlIHRoaXMKLQkgICAgICAgYWRkdQkkYXQsJGJyZWcsJGdwCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgSWYgdGhpcyBpcyBub3QgYSBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHVpCSRhdCw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSBhZGQgaXQgdG8gJGF0IGFmdGVyIHRoZQotCSAgICAgbHVpIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgd2UgYWx3YXlzIHVzZQotCSAgICAgdGhlIGxhc3QgY2FzZS4gICovCi0JICBpZiAoKHZhbHVlVCkgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLQkgICAgICB8fCBub3BpY19uZWVkX3JlbGF4IChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIDEpKQotCSAgICB7Ci0JICAgICAgcCA9IE5VTEw7Ci0JICAgICAgdXNlZF9hdCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBvZmY7Ci0KLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQl7Ci0JCSAgZnJhZ19ncm93ICgyOCk7Ci0JCSAgdGVtcHJlZyA9IEdQOwotCQkgIG9mZiA9IDA7Ci0JCSAgdXNlZF9hdCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcmFnX2dyb3cgKDM2KTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICAgICAiZCx2LHQiLCBBVCwgYnJlZywgR1ApOwotCQkgIHRlbXByZWcgPSBBVDsKLQkJICBvZmYgPSA0OwotCQkgIHVzZWRfYXQgPSAxOwotCQl9Ci0KLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCQkgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgICAgICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbgotICAgICAgICAgICAgICAgICB1bmRlc2lyZWQgbm9wLiAgKi8KLQkgICAgICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgICAgICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCi0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBvZmYsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICg4ICsgb2ZmLCAxMiArIG9mZiwgMCwgNCArIG9mZiwgMSwKLQkJCQkJICB1c2VkX2F0ICYmIG1pcHNfb3B0cy5ub2F0KSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCi0JICAgICAgLyogV2UganVzdCBnZW5lcmF0ZWQgdHdvIHJlbG9jcy4gIFdoZW4gdGNfZ2VuX3JlbG9jCi0JCSBoYW5kbGVzIHRoaXMgY2FzZSwgaXQgd2lsbCBza2lwIHRoZSBmaXJzdCByZWxvYyBhbmQKLQkJIGhhbmRsZSB0aGUgc2Vjb25kLiAgVGhlIHNlY29uZCByZWxvYyBhbHJlYWR5IGhhcyBhbgotCQkgZXh0cmEgYWRkZW5kIG9mIDQsIHdoaWNoIHdlIGFkZGVkIGFib3ZlLiAgV2UgbXVzdAotCQkgc3VidHJhY3QgaXQgb3V0LCBhbmQgdGhlbiBzdWJ0cmFjdCBhbm90aGVyIDQgdG8gbWFrZQotCQkgdGhlIGZpcnN0IHJlbG9jIGNvbWUgb3V0IHJpZ2h0LiAgVGhlIHNlY29uZCByZWxvYwotCQkgd2lsbCBjb21lIG91dCByaWdodCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBhZGQgNCB0bwotCQkgb2Zmc2V0X2V4cHIgd2hlbiB3ZSBidWlsZCBpdHMgaW5zdHJ1Y3Rpb24gYmVsb3cuCi0KLQkJIElmIHdlIGhhdmUgYSBzeW1ib2wsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlCi0JCSB0aGUgb2Zmc2V0LCBiZWNhdXNlIGl0IHdpbGwgd2luZCB1cCBiZWluZyBpbmNsdWRlZAotCQkgd2hlbiB3ZSBnZW5lcmF0ZSB0aGUgcmVsb2MuICAqLwotCi0JICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IDg7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gLTQ7Ci0JCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCX0KLQkgICAgfQotCSAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBBVCk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIEFULCBicmVnLCBBVCk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICB9Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICAvKiBGSVhNRTogSG93IGRvIHdlIGhhbmRsZSBvdmVyZmxvdyBoZXJlPyAgKi8KLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCX0JICAKLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQotCXsKLQkgIGludCBvZmY7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSRhdCw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJGF0KQotCSAgICAgICA8b3A+CSR0cmVnKzEsNCgkYXQpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkYXQsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIgd2UgYWRkIGl0IHRvICRhdCBiZWZvcmUgdGhlCi0JICAgICBsd2MxIGluc3RydWN0aW9ucy4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQgd2UgaW5jbHVkZSBpdAotCSAgICAgaW4gdGhlIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgIHVzZWRfYXQgPSAxOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIDQpCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgb2ZmID0gMDsKLQkgIGVsc2UKLQkgICAgb2ZmID0gNDsKLQkgIGZyYWdfZ3JvdyAoMjQgKyBvZmYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCBBVCwgYnJlZywgQVQpOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuIHVuZGVzaXJlZAotICAgICAgICAgICAgIG5vcC4gICovCi0JICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCi0JICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAwLCAwLAotCQkJICAgUkVMQVhfRU5DT0RFICgwLCAwLCAtMTYgLSBvZmYsIC04LCAxLCAwKSwKLQkJCSAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAoY2hhciAqKSBOVUxMKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpbnQgZ3BkZWwsIG9mZjsKLQotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHVpCSRhdCw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSRhdCwkYXQsJGdwCi0JICAgICAgIGx3CSRhdCw8c3ltPigkYXQpCQkoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJGF0KQotCSAgICAgICA8b3A+CSR0cmVnKzEsNCgkYXQpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkYXQsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIgd2UgYWRkIGl0IHRvICRhdCBiZWZvcmUgdGhlCi0JICAgICBsd2MxIGluc3RydWN0aW9ucy4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQgd2UgaW5jbHVkZSBpdAotCSAgICAgaW4gdGhlIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgIHVzZWRfYXQgPSAxOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIDQpCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCSAgICBncGRlbCA9IDQ7Ci0JICBlbHNlCi0JICAgIGdwZGVsID0gMDsKLQkgIGlmIChicmVnID09IDApCi0JICAgIG9mZiA9IDA7Ci0JICBlbHNlCi0JICAgIG9mZiA9IDQ7Ci0JICBmcmFnX2dyb3cgKDU2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCSAgICAgICBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICAgImQsdix0IiwgQVQsIEFULCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIEFUKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICJkLHYsdCIsIEFULCBicmVnLCBBVCk7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgKz0gNDsKLQotCSAgLyogU2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0byBhdm9pZCBpbnNlcnRpbmcgYW4gdW5kZXNpcmVkCi0gICAgICAgICAgICAgbm9wLiAgKi8KLQkgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICBtaXBzX29wdGltaXplID0gMjsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgLT0gNDsKLQotCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTYgKyBncGRlbCArIG9mZiwgMCwKLQkJCVJFTEFYX0VOQ09ERSAoMjQgKyBvZmYsIDE2ICsgZ3BkZWwgKyBvZmYsIGdwZGVsLAotCQkJCSAgICAgIDggKyBncGRlbCArIG9mZiwgMSwgMCksCi0JCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJKGNoYXIgKikgTlVMTCk7Ci0JICBpZiAoZ3BkZWwgPiAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgIH0KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgKz0gNDsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgQVQsIGJyZWcsIEFUKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgIH0KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIHAgKz0gNDsKLQkgIGV4cHIxLlhfYWRkX251bWJlciArPSA0OwotCi0JICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbiB1bmRlc2lyZWQKLSAgICAgICAgICAgICBub3AuICAqLwotCSAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgIG1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgLyogSWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2UgdXNlCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgSWYgd2UgaGF2ZSBhIGJhc2UgcmVnaXN0ZXIsIHdlIHVzZQotCSAgICAgICBhZGR1CSRhdCwkYnJlZywkZ3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAqLwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgewotCSAgICAgIHRlbXByZWcgPSBHUDsKLQkgICAgICB1c2VkX2F0ID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIEFULCBicmVnLCBHUCk7Ci0JICAgICAgdGVtcHJlZyA9IEFUOwotCSAgICAgIHVzZWRfYXQgPSAxOwotCSAgICB9Ci0KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmICghIHVzZWRfYXQpCi0JcmV0dXJuOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9MRF9PQjoKLSAgICAgIHMgPSAibHciOwotICAgICAgZ290byBzZF9vYjsKLSAgICBjYXNlIE1fU0RfT0I6Ci0gICAgICBzID0gInN3IjsKLSAgICBzZF9vYjoKLSAgICAgIGFzc2VydCAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMiAKLQkgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZyArIDEsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgLyogTmV3IGNvZGUgYWRkZWQgdG8gc3VwcG9ydCBDT1BaIGluc3RydWN0aW9ucy4KLSAgICAgIFRoaXMgY29kZSBidWlsZHMgdGFibGUgZW50cmllcyBvdXQgb2YgdGhlIG1hY3JvcyBpbiBtaXBfb3Bjb2Rlcy4KLSAgICAgIFI0MDAwIHVzZXMgaW50ZXJsb2NrcyB0byBoYW5kbGUgY29wcm9jIGRlbGF5cy4KLSAgICAgIE90aGVyIGNoaXBzIChsaWtlIHRoZSBSMzAwMCkgcmVxdWlyZSBub3BzIHRvIGJlIGluc2VydGVkIGZvciBkZWxheXMuCi0KLSAgICAgIEZJWE1FOiBDdXJyZW50bHksIHdlIHJlcXVpcmUgdGhhdCB0aGUgdXNlciBoYW5kbGUgZGVsYXlzLgotICAgICAgSW4gb3JkZXIgdG8gZmlsbCBkZWxheSBzbG90cyBmb3Igbm9uLWludGVybG9ja2VkIGNoaXBzLAotICAgICAgd2UgbXVzdCBoYXZlIGEgd2F5IHRvIHNwZWNpZnkgZGVsYXlzIGJhc2VkIG9uIHRoZSBjb3Byb2Nlc3Nvci4KLSAgICAgIEVnLiA0IGN5Y2xlcyBpZiBsb2FkIGNvcHJvYyByZWcgZnJvbSBtZW1vcnksIDEgaWYgaW4gY2FjaGUsIGV0Yy4KLSAgICAgIFdoYXQgYXJlIHRoZSBzaWRlLWVmZmVjdHMgb2YgdGhlIGNvcCBpbnN0cnVjdGlvbj8KLSAgICAgIFdoYXQgY2FjaGUgc3VwcG9ydCBtaWdodCB3ZSBoYXZlIGFuZCB3aGF0IGFyZSBpdHMgZWZmZWN0cz8KLSAgICAgIEJvdGggY29wcm9jZXNzb3IgJiBtZW1vcnkgcmVxdWlyZSBkZWxheXMuIGhvdyBsb25nPz8/Ci0gICAgICBXaGF0IHJlZ2lzdGVycyBhcmUgcmVhZC9zZXQvbW9kaWZpZWQ/IAotCi0gICAgICBJZiBhbiBpdGJsIGlzIHByb3ZpZGVkIHRvIGludGVycHJldCBjb3AgaW5zdHJ1Y3Rpb25zLAotICAgICAgdGhpcyBrbm93bGVkZ2UgY2FuIGJlIGVuY29kZWQgaW4gdGhlIGl0Ymwgc3BlYy4gKi8KLQotICAgIGNhc2UgTV9DT1AwOgotICAgICAgcyA9ICJjMCI7Ci0gICAgICBnb3RvIGNvcHo7Ci0gICAgY2FzZSBNX0NPUDE6Ci0gICAgICBzID0gImMxIjsKLSAgICAgIGdvdG8gY29wejsKLSAgICBjYXNlIE1fQ09QMjoKLSAgICAgIHMgPSAiYzIiOwotICAgICAgZ290byBjb3B6OwotICAgIGNhc2UgTV9DT1AzOgotICAgICAgcyA9ICJjMyI7Ci0gICAgY29wejoKLSAgICAgIC8qIEZvciBub3cgd2UganVzdCBkbyBDIChzYW1lIGFzIEN6KS4gIFRoZSBwYXJhbWV0ZXIgd2lsbCBiZQotICAgICAgICAgc3RvcmVkIGluIGluc25fb3Bjb2RlIGJ5IG1pcHNfaXAuICAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgcywgIkMiLAotCQkgICBpcC0+aW5zbl9vcGNvZGUpOwotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgTE9TSU5HX0NPTVBJTEVSCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRyeSBhbmQgc2VlIGlmIHRoaXMgaXMgYSBuZXcgaXRibCBpbnN0cnVjdGlvbi4KLSAgICAgICAgIFRoaXMgY29kZSBidWlsZHMgdGFibGUgZW50cmllcyBvdXQgb2YgdGhlIG1hY3JvcyBpbiBtaXBfb3Bjb2Rlcy4KLSAgICAgICAgIEZJWE1FOiBGb3Igbm93IHdlIGp1c3QgYXNzZW1ibGUgdGhlIGV4cHJlc3Npb24gYW5kIHBhc3MgaXQncwotICAgICAgICAgdmFsdWUgYWxvbmcgYXMgYSAzMi1iaXQgaW1tZWRpYXRlLgotICAgICAgICAgV2UgbWF5IHdhbnQgdG8gaGF2ZSB0aGUgYXNzZW1ibGVyIGFzc2VtYmxlIHRoaXMgdmFsdWUsIAotICAgICAgICAgc28gdGhhdCB3ZSBnYWluIHRoZSBhc3NlbWJsZXIncyBrbm93bGVkZ2Ugb2YgZGVsYXkgc2xvdHMsCi0gICAgICAgICBzeW1ib2xzLCBldGMuCi0gICAgICAgICBXb3VsZCBpdCBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgbWFzayAoaWQpIGhlcmU/ICovCi0gICAgICBpZiAoaXRibF9oYXZlX2VudHJpZXMgCi0JICAmJiAoaW1tZWRfZXhwciA9IGl0YmxfYXNzZW1ibGUgKGlwLT5pbnNuX21vLT5uYW1lLCAiIikpKQotICAgICAgICB7Ci0JICBzID0gaXAtPmluc25fbW8tPm5hbWU7Ci0JICBzMiA9ICJjb3AzIjsKLQkgIGNvcHJvYyA9IElUQkxfREVDT0RFX1BOVU0gKGltbWVkX2V4cHIpOzsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbWVkX2V4cHIsIHMsICJDIik7Ci0JICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIG1hY3JvMiAoaXApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG1pcHNfb3B0cy5ub2F0KQotICAgIGFzX3dhcm4gKF8oIk1hY3JvIHVzZWQgJGF0IGFmdGVyIFwiLnNldCBub2F0XCIiKSk7Ci19Ci0gICAgICAgICAgCi1zdGF0aWMgdm9pZAotbWFjcm8yIChpcCkKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci17Ci0gIHJlZ2lzdGVyIGludCB0cmVnLCBzcmVnLCBkcmVnLCBicmVnOwotICBpbnQgdGVtcHJlZzsKLSAgaW50IG1hc2s7Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHVzZWRfYXQ7Ci0gIGV4cHJlc3Npb25TIGV4cHIxOwotICBjb25zdCBjaGFyICpzOwotICBjb25zdCBjaGFyICpzMjsKLSAgY29uc3QgY2hhciAqZm10OwotICBpbnQgbGlrZWx5ID0gMDsKLSAgaW50IGRibCA9IDA7Ci0gIGludCBjb3Byb2MgPSAwOwotICBpbnQgbHIgPSAwOwotICBpbnQgaW1tID0gMDsKLSAgaW50IG9mZjsKLSAgb2Zmc2V0VCBtYXhudW07Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICBjaGFyICpwOwotICAgICAgICAgIAotICB0cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxNikgJiAweDFmOwotICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxMSkgJiAweDFmOwotICBzcmVnID0gYnJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMjEpICYgMHgxZjsKLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotICAgICAgICAgIAotICBleHByMS5YX29wID0gT19jb25zdGFudDsKLSAgZXhwcjEuWF9vcF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgICAgIAotICBzd2l0Y2ggKG1hc2spCi0gICAgewotI2VuZGlmIC8qIExPU0lOR19DT01QSUxFUiAqLwotCi0gICAgY2FzZSBNX0RNVUw6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUw6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgInMsdCIsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRE1VTF9JOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMX0k6Ci0gICAgICAvKiBUaGUgTUlQUyBhc3NlbWJsZXIgc29tZSB0aW1lcyBnZW5lcmF0ZXMgc2hpZnRzIGFuZCBhZGRzLiAgSSdtCi0JIG5vdCB0cnlpbmcgdG8gYmUgdGhhdCBmYW5jeS4gR0NDIHNob3VsZCBkbyB0aGlzIGZvciB1cwotCSBhbnl3YXkuICAqLwotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdCIgOiAibXVsdCIsCi0JCSAgICJzLHQiLCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RNVUxPX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPX0k6Ci0gICAgICBpbW0gPSAxOwotICAgICAgZ290byBkb19tdWxvOwotCi0gICAgY2FzZSBNX0RNVUxPOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMTzoKLSAgICBkb19tdWxvOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgaWYgKGltbSkKLQlsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0IiA6ICJtdWx0IiwKLQkJICAgInMsdCIsIHNyZWcsIGltbSA/IEFUIDogdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzcmEzMiIgOiAic3JhIiwKLQkJICAgImQsdyw8IiwgZHJlZywgZHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZoaSIsICJkIiwgQVQpOwotICAgICAgaWYgKG1pcHNfdHJhcCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0bmUiLCAicyx0IiwgZHJlZywgQVQpOwotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJlcSIsICJzLHQscCIsIGRyZWcsIEFUKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDYpOwotCX0KLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRE1VTE9VX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPVV9JOgotICAgICAgaW1tID0gMTsKLSAgICAgIGdvdG8gZG9fbXVsb3U7Ci0KLSAgICBjYXNlIE1fRE1VTE9VOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMT1U6Ci0gICAgZG9fbXVsb3U6Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAoaW1tKQotCWxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZG11bHR1IiA6ICJtdWx0dSIsCi0JCSAgICJzLHQiLCBzcmVnLCBpbW0gPyBBVCA6IHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZoaSIsICJkIiwgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICBpZiAobWlwc190cmFwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRuZSIsICJzLHQiLCBBVCwgMCk7Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYmVxIiwgInMsdCxwIiwgQVQsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNik7Ci0JfQotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fUk9MOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3VidSIsICJkLHYsdCIsIEFULCAwLCB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybHYiLCAiZCx0LHMiLCBBVCwgc3JlZywgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsdiIsICJkLHQscyIsIGRyZWcsIHNyZWcsCi0JCSAgIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST0xfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJyb3RhdGUgY291bnQgdG9vIGxhcmdlIikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgQVQsIHNyZWcsCi0JCSAgIChpbnQpIChpbW1fZXhwci5YX2FkZF9udW1iZXIgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBkcmVnLCBzcmVnLAotCQkgICAoaW50KSAoKDAgLSBpbW1fZXhwci5YX2FkZF9udW1iZXIpICYgMHgxZikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST1I6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzdWJ1IiwgImQsdix0IiwgQVQsIDAsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsdiIsICJkLHQscyIsIEFULCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmx2IiwgImQsdCxzIiwgZHJlZywgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JPUl9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oInJvdGF0ZSBjb3VudCB0b28gbGFyZ2UiKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBBVCwgc3JlZywKLQkJICAgKGludCkgKGltbV9leHByLlhfYWRkX251bWJlciAmIDB4MWYpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIGRyZWcsIHNyZWcsCi0JCSAgIChpbnQpICgoMCAtIGltbV9leHByLlhfYWRkX251bWJlcikgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NfRE9COgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPT0gMSk7Ci0gICAgICAvKiBFdmVuIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lICRmbiBjb21lcyBiZWZvcmUgJGZuKzEuICBXZSBoYXZlCi0JIHRvIGFkanVzdCB3aGVuIHN0b3JpbmcgdG8gbWVtb3J5LiAgKi8KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic3djMSIsICJULG8oYikiLAotCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInN3YzEiLCAiVCxvKGIpIiwKLQkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TRVE6Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAotCQkgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGVsc2UgaWYgKHRyZWcgPT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKLQkJICAgICBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBlbHNlCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAieG9yIiwgImQsdix0IiwgZHJlZywKLQkJICAgICAgIHNyZWcsIHRyZWcpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsCi0JCSAgICAgICBkcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JfQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NFUV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKLQkJICAgICAgIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkluc3RydWN0aW9uICVzOiByZXN1bHQgaXMgYWx3YXlzIGZhbHNlIiksCi0JCSAgIGlwLT5pbnNuX21vLT5uYW1lKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJ4b3JpIiwgInQscixpIiwgZHJlZywKLQkJICAgICAgIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAieG9yIiwgImQsdix0IiwgZHJlZywKLQkJICAgICAgIHNyZWcsIEFUKTsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBpZiAodXNlZF9hdCkKLQlicmVhazsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TR0U6CQkvKiBzcmVnID49IHRyZWcgPD09PiBub3QgKHNyZWcgPCB0cmVnKSAqLwotICAgICAgcyA9ICJzbHQiOwotICAgICAgZ290byBzZ2U7Ci0gICAgY2FzZSBNX1NHRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgIHNnZToKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0dFX0k6CQkvKiBzcmVnID49IEkgPD09PiBub3QgKHNyZWcgPCBJKSAqLwotICAgIGNhc2UgTV9TR0VVX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgbWFzayA9PSBNX1NHRV9JID8gInNsdGkiIDogInNsdGl1IiwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgICAgICBtYXNrID09IE1fU0dFX0kgPyAic2x0IiA6ICJzbHR1IiwKLQkJICAgICAgICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsIGRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmICh1c2VkX2F0KQotCWJyZWFrOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NHVDoJCS8qIHNyZWcgPiB0cmVnICA8PT0+ICB0cmVnIDwgc3JlZyAqLwotICAgICAgcyA9ICJzbHQiOwotICAgICAgZ290byBzZ3Q7Ci0gICAgY2FzZSBNX1NHVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgIHNndDoKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgdHJlZywgc3JlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0dUX0k6CQkvKiBzcmVnID4gSSAgPD09PiAgSSA8IHNyZWcgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2d0aTsKLSAgICBjYXNlIE1fU0dUVV9JOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzZ3RpOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCBBVCwgc3JlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTEU6CQkvKiBzcmVnIDw9IHRyZWcgIDw9PT4gIHRyZWcgPj0gc3JlZyAgPD09PiAgbm90ICh0cmVnIDwgc3JlZykgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2xlOwotICAgIGNhc2UgTV9TTEVVOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzbGU6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIHRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NMRV9JOgkJLyogc3JlZyA8PSBJIDw9PT4gSSA+PSBzcmVnIDw9PT4gbm90IChJIDwgc3JlZykgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2xlaTsKLSAgICBjYXNlIE1fU0xFVV9JOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzbGVpOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCBBVCwgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTFRfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJzbHRpIiwgInQscixqIiwKLQkJICAgICAgIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBkcmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTFRVX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAic2x0aXUiLCAidCxyLGoiLAotCQkgICAgICAgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCBzcmVnLAotCQkgICBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTkU6Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgIHRyZWcpOwotICAgICAgZWxzZSBpZiAodHJlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgIHNyZWcpOwotICAgICAgZWxzZQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInhvciIsICJkLHYsdCIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCB0cmVnKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgICAgZHJlZyk7Ci0JfQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NORV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwKLQkJICAgICAgIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgdHJ1ZSIpLAotCQkgICBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJ4b3JpIiwgInQscixpIiwKLQkJICAgICAgIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAotCQkgICAgICAgc3JlZywgQVQpOwotCSAgdXNlZF9hdCA9IDE7Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsIGRyZWcpOwotICAgICAgaWYgKHVzZWRfYXQpCi0JYnJlYWs7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRFNVQl9JOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fU1VCX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPD0gMHg4MDAwKQotCXsKLQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKLQkJICAgICAgIGRibCA/ICJkYWRkaSIgOiAiYWRkaSIsCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkc3ViIiA6ICJzdWIiLAotCQkgICAiZCx2LHQiLCBkcmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9EU1VCVV9JOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fU1VCVV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw9IDB4ODAwMCkKLQl7Ci0JICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgICAgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkc3VidSIgOiAic3VidSIsCi0JCSAgICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1RFUV9JOgotICAgICAgcyA9ICJ0ZXEiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UR0VfSToKLSAgICAgIHMgPSAidGdlIjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVEdFVV9JOgotICAgICAgcyA9ICJ0Z2V1IjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVExUX0k6Ci0gICAgICBzID0gInRsdCI7Ci0gICAgICBnb3RvIHRyYXA7Ci0gICAgY2FzZSBNX1RMVFVfSToKLSAgICAgIHMgPSAidGx0dSI7Ci0gICAgICBnb3RvIHRyYXA7Ci0gICAgY2FzZSBNX1RORV9JOgotICAgICAgcyA9ICJ0bmUiOwotICAgIHRyYXA6Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJzLHQiLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9UUlVOQ1dEOgotICAgIGNhc2UgTV9UUlVOQ1dTOgotICAgICAgYXNzZXJ0IChtaXBzX29wdHMuaXNhID09IDEpOwotICAgICAgc3JlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMTEpICYgMHgxZjsJLyogZmxvYXRpbmcgcmVnICovCi0gICAgICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAwNikgJiAweDFmOwkvKiBmbG9hdGluZyByZWcgKi8KLQotICAgICAgLyoKLSAgICAgICAqIElzIHRoZSBkb3VibGUgY2ZjMSBpbnN0cnVjdGlvbiBhIGJ1ZyBpbiB0aGUgbWlwcyBhc3NlbWJsZXI7Ci0gICAgICAgKiBvciBpcyB0aGVyZSBhIHJlYXNvbiBmb3IgaXQ/Ci0gICAgICAgKi8KLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImNmYzEiLCAidCxHIiwgdHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiY2ZjMSIsICJ0LEciLCB0cmVnLCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAzOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJvcmkiLCAidCxyLGkiLCBBVCwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIEFULCBBVCwKLQkJICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJjdGMxIiwgInQsRyIsIEFULCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JICAgICAgbWFzayA9PSBNX1RSVU5DV0QgPyAiY3Z0LncuZCIgOiAiY3Z0LncucyIsICJELFMiLCBkcmVnLCBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImN0YzEiLCAidCxHIiwgdHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVUxIOgotICAgICAgcyA9ICJsYiI7Ci0gICAgICBnb3RvIHVsaDsKLSAgICBjYXNlIE1fVUxIVToKLSAgICAgIHMgPSAibGJ1IjsKLSAgICB1bGg6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4N2ZmZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICAvKiBhdm9pZCBsb2FkIGRlbGF5ICovCi0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IDE7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxidSIsICJ0LG8oYikiLCBBVCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgdHJlZywgdHJlZywgOCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIHRyZWcsIHRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VMRDoKLSAgICAgIHMgPSAibGRsIjsKLSAgICAgIHMyID0gImxkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1bHc7Ci0gICAgY2FzZSBNX1VMVzoKLSAgICAgIHMgPSAibHdsIjsKLSAgICAgIHMyID0gImx3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVsdzoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gb2ZmKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdmVyZmxvdyIpKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSBvZmY7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9VTERfQToKLSAgICAgIHMgPSAibGRsIjsKLSAgICAgIHMyID0gImxkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1bHdhOwotICAgIGNhc2UgTV9VTFdfQToKLSAgICAgIHMgPSAibHdsIjsKLSAgICAgIHMyID0gImx3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVsd2E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VTEhfQToKLSAgICBjYXNlIE1fVUxIVV9BOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgImQsdix0IiwgQVQsIEFULCBicmVnKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCSAgIG1hc2sgPT0gTV9VTEhfQSA/ICJsYiIgOiAibGJ1IiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJsYnUiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCB0cmVnLAotCQkgICB0cmVnLCA4KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgdHJlZywKLQkJICAgdHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVVNIOgotICAgICAgaWYgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDdmZmYpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG92ZXJmbG93IikpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJzYiIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBBVCwgdHJlZywgOCk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IDE7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInNiIiwgInQsbyhiKSIsIEFULAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VU0Q6Ci0gICAgICBzID0gInNkbCI7Ci0gICAgICBzMiA9ICJzZHIiOwotICAgICAgb2ZmID0gNzsKLSAgICAgIGdvdG8gdXN3OwotICAgIGNhc2UgTV9VU1c6Ci0gICAgICBzID0gInN3bCI7Ci0gICAgICBzMiA9ICJzd3IiOwotICAgICAgb2ZmID0gMzsKLSAgICB1c3c6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIG9mZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gb2ZmOwotICAgICAgZWxzZQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fVVNEX0E6Ci0gICAgICBzID0gInNkbCI7Ci0gICAgICBzMiA9ICJzZHIiOwotICAgICAgb2ZmID0gNzsKLSAgICAgIGdvdG8gdXN3YTsKLSAgICBjYXNlIE1fVVNXX0E6Ci0gICAgICBzID0gInN3bCI7Ci0gICAgICBzMiA9ICJzd3IiOwotICAgICAgb2ZmID0gMzsKLSAgICB1c3dhOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgImQsdix0IiwgQVQsIEFULCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgczIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVVNIX0E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2IiLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIHRyZWcsCi0JCSAgIHRyZWcsIDgpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzYiIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJsYnUiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCB0cmVnLAotCQkgICB0cmVnLCA4KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgdHJlZywKLQkJICAgdHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogRklYTUU6IENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIHRoZSBpdGJsIG1hY3Jvcywgc2luY2UgdGhleQotCSBhcmUgYWRkZWQgZHluYW1pY2FsbHkuICovCi0gICAgICBhc19iYWQgKF8oIk1hY3JvICVzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSwgaXAtPmluc25fbW8tPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBpZiAobWlwc19vcHRzLm5vYXQpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gdXNlZCAkYXQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiIpKTsKLX0KLQotLyogSW1wbGVtZW50IG1hY3JvcyBpbiBtaXBzMTYgbW9kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzMTZfbWFjcm8gKGlwKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgaW50IG1hc2s7Ci0gIGludCB4cmVnLCB5cmVnLCB6cmVnLCB0bXA7Ci0gIGludCBpY250OwotICBleHByZXNzaW9uUyBleHByMTsKLSAgaW50IGRibDsKLSAgY29uc3QgY2hhciAqcywgKnMyLCAqczM7Ci0KLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotCi0gIHhyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7Ci0gIHlyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JZKSAmIE1JUFMxNk9QX01BU0tfUlk7Ci0gIHpyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7Ci0KLSAgaWNudCA9IDA7Ci0KLSAgZXhwcjEuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4cHIxLlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLQotICBkYmwgPSAwOwotCi0gIHN3aXRjaCAobWFzaykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0KLSAgICBjYXNlIE1fRERJVl8zOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fRElWXzM6Ci0gICAgICBzID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXYzOwotICAgIGNhc2UgTV9EUkVNXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9SRU1fMzoKLSAgICAgIHMgPSAibWZoaSI7Ci0gICAgZG9fZGl2MzoKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRkaXYiIDogImRpdiIsCi0JCSAgICIwLHgseSIsIHhyZWcsIHlyZWcpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5leiIsICJ4LHAiLCB5cmVnKTsKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICI2IiwgNyk7Ci0gICAgICAKLSAgICAgIC8qIEZJWE1FOiBUaGUgbm9ybWFsIGNvZGUgY2hlY2tzIGZvciBvZiAtMSAvIC0weDgwMDAwMDAwIGhlcmUsCi0gICAgICAgICBzaW5jZSB0aGF0IGNhdXNlcyBhbiBvdmVyZmxvdy4gIFdlIHNob3VsZCBkbyB0aGF0IGFzIHdlbGwsCi0gICAgICAgICBidXQgSSBkb24ndCBzZWUgaG93IHRvIGRvIHRoZSBjb21wYXJpc29ucyB3aXRob3V0IGEgdGVtcG9yYXJ5Ci0gICAgICAgICByZWdpc3Rlci4gICovCi0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ4IiwgenJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ESVZVXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9SRU1VXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9ERElWVV8zOgotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RSRU1VXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgIGRvX2RpdnUzOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiMCx4LHkiLCB4cmVnLCB5cmVnKTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZXoiLCAieCxwIiwgeXJlZyk7Ci0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiNiIsIDcpOwotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgIngiLCB6cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RNVUw6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUw6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgIngseSIsIHhyZWcsIHlyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJ4IiwgenJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRFNVQlVfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBnb3RvIGRvX3N1YnU7Ci0gICAgY2FzZSBNX1NVQlVfSToKLSAgICBkb19zdWJ1OgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCi0JCSAgICJ5LHgsNCIsIHlyZWcsIHhyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU1VCVV9JXzI6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJhZGRpdSIsCi0JCSAgICJ4LGsiLCB4cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RTVUJVX0lfMjoKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgImRhZGRpdSIsCi0JCSAgICJ5LGoiLCB5cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JFUToKLSAgICAgIHMgPSAiY21wIjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoOwotICAgIGNhc2UgTV9CTkU6Ci0gICAgICBzID0gImNtcCI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxUOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JMVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JMRToKLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIGdvdG8gZG9fcmV2ZXJzZV9icmFuY2g7Ci0gICAgY2FzZSBNX0JMRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19yZXZlcnNlX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdFOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JHRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JHVDoKLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIGdvdG8gZG9fcmV2ZXJzZV9icmFuY2g7Ci0gICAgY2FzZSBNX0JHVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRuZXoiOwotCi0gICAgZG9fcmV2ZXJzZV9icmFuY2g6Ci0gICAgICB0bXAgPSB4cmVnOwotICAgICAgeHJlZyA9IHlyZWc7Ci0gICAgICB5cmVnID0gdG1wOwotCi0gICAgZG9fYnJhbmNoOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgcywgIngseSIsCi0JCSAgIHhyZWcsIHlyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMyLCAicCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkVRX0k6Ci0gICAgICBzID0gImNtcGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCxVIjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JORV9JOgotICAgICAgcyA9ICJjbXBpIjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsVSI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTFRfSToKLSAgICAgIHMgPSAic2x0aSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkxUVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkxFX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYWRkb25lX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTEVVX0k6Ci0gICAgICBzID0gInNsdGl1IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2FkZG9uZV9icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdFX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JHRVVfSToKLSAgICAgIHMgPSAic2x0aXUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JHVF9JOgotICAgICAgcyA9ICJzbHRpIjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2FkZG9uZV9icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdUVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotCi0gICAgZG9fYWRkb25lX2JyYW5jaF9pOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgKytpbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0KLSAgICBkb19icmFuY2hfaToKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCBzLCBzMywgeHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJwIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9BQlM6Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpIiwgIngsOCIsICB5cmVnKTsKLSAgICAgIGlmICh4cmVnICE9IHlyZWcpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAibW92ZSIsICJ5LFgiLCB4cmVnLCB5cmVnKTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJ0ZXF6IiwgInAiKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICJuZWciLCAieCx3IiwgeHJlZywgeHJlZyk7Ci0gICAgfQotfQotCi0vKiBGb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcsIHZlcmlmeSB0aGF0IGFsbCBiaXRzIGFyZSBzcGVjaWZpZWQgZWl0aGVyCi0gICBieSB0aGUgbWF0Y2gvbWFzayBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiBkZWZpbml0aW9uLCBvciBieSB0aGUKLSAgIG9wZXJhbmQgbGlzdC4gICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9taXBzX2luc24gKG9wYykKLSAgICAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKnAgPSBvcGMtPmFyZ3M7Ci0gIGNoYXIgYzsKLSAgdW5zaWduZWQgbG9uZyB1c2VkX2JpdHMgPSBvcGMtPm1hc2s7Ci0KLSAgaWYgKCh1c2VkX2JpdHMgJiBvcGMtPm1hdGNoKSAhPSBvcGMtPm1hdGNoKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAobWFzayBlcnJvcik6ICVzICVzIiksCi0JICAgICAgb3BjLT5uYW1lLCBvcGMtPmFyZ3MpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2RlZmluZSBVU0VfQklUUyhtYXNrLHNoaWZ0KQkodXNlZF9iaXRzIHw9ICgobWFzaykgPDwgKHNoaWZ0KSkpCi0gIHdoaWxlICgqcCkKLSAgICBzd2l0Y2ggKGMgPSAqcCsrKQotICAgICAgewotICAgICAgY2FzZSAnLCc6IGJyZWFrOwotICAgICAgY2FzZSAnKCc6IGJyZWFrOwotICAgICAgY2FzZSAnKSc6IGJyZWFrOwotICAgICAgY2FzZSAnPCc6IFVTRV9CSVRTIChPUF9NQVNLX1NIQU1ULAlPUF9TSF9TSEFNVCk7CWJyZWFrOwotICAgICAgY2FzZSAnPic6CVVTRV9CSVRTIChPUF9NQVNLX1NIQU1ULAlPUF9TSF9TSEFNVCk7CWJyZWFrOwotICAgICAgY2FzZSAnQSc6IGJyZWFrOwotICAgICAgY2FzZSAnQic6CVVTRV9CSVRTIChPUF9NQVNLX1NZU0NBTEwsCU9QX1NIX1NZU0NBTEwpOwlicmVhazsKLSAgICAgIGNhc2UgJ0MnOglVU0VfQklUUyAoT1BfTUFTS19DT1BaLAkJT1BfU0hfQ09QWik7CWJyZWFrOwotICAgICAgY2FzZSAnRCc6CVVTRV9CSVRTIChPUF9NQVNLX0ZELAkJT1BfU0hfRkQpOwlicmVhazsKLSAgICAgIGNhc2UgJ0UnOglVU0VfQklUUyAoT1BfTUFTS19SVCwJCU9QX1NIX1JUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdGJzogYnJlYWs7Ci0gICAgICBjYXNlICdHJzoJVVNFX0JJVFMgKE9QX01BU0tfUkQsCQlPUF9TSF9SRCk7CWJyZWFrOwotICAgICAgY2FzZSAnSSc6IGJyZWFrOwotICAgICAgY2FzZSAnTCc6IGJyZWFrOwotICAgICAgY2FzZSAnTSc6CVVTRV9CSVRTIChPUF9NQVNLX0NDQywJCU9QX1NIX0NDQyk7CWJyZWFrOwotICAgICAgY2FzZSAnTic6CVVTRV9CSVRTIChPUF9NQVNLX0JDQywJCU9QX1NIX0JDQyk7CWJyZWFrOwotICAgICAgY2FzZSAnUic6CVVTRV9CSVRTIChPUF9NQVNLX0ZSLAkJT1BfU0hfRlIpOwlicmVhazsKLSAgICAgIGNhc2UgJ1MnOglVU0VfQklUUyAoT1BfTUFTS19GUywJCU9QX1NIX0ZTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdUJzoJVVNFX0JJVFMgKE9QX01BU0tfRlQsCQlPUF9TSF9GVCk7CWJyZWFrOwotICAgICAgY2FzZSAnVic6CVVTRV9CSVRTIChPUF9NQVNLX0ZTLAkJT1BfU0hfRlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ1cnOglVU0VfQklUUyAoT1BfTUFTS19GVCwJCU9QX1NIX0ZUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdhJzoJVVNFX0JJVFMgKE9QX01BU0tfVEFSR0VULAlPUF9TSF9UQVJHRVQpOwlicmVhazsKLSAgICAgIGNhc2UgJ2InOglVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdjJzoJVVNFX0JJVFMgKE9QX01BU0tfQ09ERSwJCU9QX1NIX0NPREUpOwlicmVhazsKLSAgICAgIGNhc2UgJ2QnOglVU0VfQklUUyAoT1BfTUFTS19SRCwJCU9QX1NIX1JEKTsJYnJlYWs7Ci0gICAgICBjYXNlICdmJzogYnJlYWs7Ci0gICAgICBjYXNlICdoJzoJVVNFX0JJVFMgKE9QX01BU0tfUFJFRlgsCU9QX1NIX1BSRUZYKTsJYnJlYWs7Ci0gICAgICBjYXNlICdpJzoJVVNFX0JJVFMgKE9QX01BU0tfSU1NRURJQVRFLAlPUF9TSF9JTU1FRElBVEUpOyBicmVhazsKLSAgICAgIGNhc2UgJ2onOglVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ2snOglVU0VfQklUUyAoT1BfTUFTS19DQUNIRSwJT1BfU0hfQ0FDSEUpOwlicmVhazsKLSAgICAgIGNhc2UgJ2wnOiBicmVhazsKLSAgICAgIGNhc2UgJ28nOiBVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ3AnOglVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ3EnOglVU0VfQklUUyAoT1BfTUFTS19DT0RFMiwJT1BfU0hfQ09ERTIpOwlicmVhazsKLSAgICAgIGNhc2UgJ3InOiBVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdzJzoJVVNFX0JJVFMgKE9QX01BU0tfUlMsCQlPUF9TSF9SUyk7CWJyZWFrOwotICAgICAgY2FzZSAndCc6CVVTRV9CSVRTIChPUF9NQVNLX1JULAkJT1BfU0hfUlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ3UnOglVU0VfQklUUyAoT1BfTUFTS19JTU1FRElBVEUsCU9QX1NIX0lNTUVESUFURSk7IGJyZWFrOwotICAgICAgY2FzZSAndic6CVVTRV9CSVRTIChPUF9NQVNLX1JTLAkJT1BfU0hfUlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ3cnOglVU0VfQklUUyAoT1BfTUFTS19SVCwJCU9QX1NIX1JUKTsJYnJlYWs7Ci0gICAgICBjYXNlICd4JzogYnJlYWs7Ci0gICAgICBjYXNlICd6JzogYnJlYWs7Ci0gICAgICBjYXNlICdQJzogVVNFX0JJVFMgKE9QX01BU0tfUEVSRlJFRywJT1BfU0hfUEVSRlJFRyk7CWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlhc19iYWQgKF8oImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKHVua25vd24gb3BlcmFuZCB0eXBlIGAlYycpOiAlcyAlcyIpLAotCQljLCBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0jdW5kZWYgVVNFX0JJVFMKLSAgaWYgKHVzZWRfYml0cyAhPSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAoYml0cyAweCVseCB1bmRlZmluZWQpOiAlcyAlcyIpLAotCSAgICAgIH51c2VkX2JpdHMgJiAweGZmZmZmZmZmLCBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgYXNzZW1ibGVzIGFuIGluc3RydWN0aW9uIGludG8gaXRzIGJpbmFyeSBmb3JtYXQuICBBcyBhCi0gICBzaWRlIGVmZmVjdCwgaXQgc2V0cyBvbmUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZXMgaW1tX3JlbG9jIG9yCi0gICBvZmZzZXRfcmVsb2MgdG8gdGhlIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBkbyBpZiBvbmUgb2YgdGhlIG9wZXJhbmRzCi0gICBpcyBhbiBhZGRyZXNzIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19pcCAoc3RyLCBpcCkKLSAgICAgY2hhciAqc3RyOwotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY2hhciBjOwotICBzdHJ1Y3QgbWlwc19vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NTdGFydDsKLSAgdW5zaWduZWQgaW50IHJlZ25vOwotICB1bnNpZ25lZCBpbnQgbGFzdHJlZ25vID0gMDsKLSAgY2hhciAqc19yZXNldDsKLSAgY2hhciBzYXZlX2MgPSAwOwotICBpbnQgZnVsbF9vcGNvZGVfbWF0Y2ggPSAxOwotCi0gIGluc25fZXJyb3IgPSBOVUxMOwotCi0gIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBhICcuJywgd2UgZmlyc3QgdHJ5IHRvIG1hdGNoIGFuIGluc3RydWN0aW9uCi0gICAgIGluY2x1ZGluZyB0aGUgJy4nLiAgVGhlbiB3ZSB0cnkgYWdhaW4gd2l0aG91dCB0aGUgJy4nLiAgKi8KLSAgaW5zbiA9IE5VTEw7Ci0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotICAgIGNvbnRpbnVlOwotCi0gIC8qIElmIHdlIHN0b3BwZWQgb24gd2hpdGVzcGFjZSwgdGhlbiByZXBsYWNlIHRoZSB3aGl0ZXNwYWNlIHdpdGggbnVsbCBmb3IKLSAgICAgdGhlIGNhbGwgdG8gaGFzaF9maW5kLiAgU2F2ZSB0aGUgY2hhcmFjdGVyIHdlIHJlcGxhY2VkIGp1c3QgaW4gY2FzZSB3ZQotICAgICBoYXZlIHRvIHJlLXBhcnNlIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotICAgIHsKLSAgICAgIHNhdmVfYyA9ICpzOwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgfQotCQotICBpbnNuID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cik7Ci0KLSAgLyogSWYgd2UgZGlkbid0IGZpbmQgdGhlIGluc3RydWN0aW9uIGluIHRoZSBvcGNvZGUgdGFibGUsIHRyeSBhZ2FpbiwgYnV0Ci0gICAgIHRoaXMgdGltZSB3aXRoIGp1c3QgdGhlIGluc3RydWN0aW9uIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZyB0aGUKLSAgICAgZmlyc3QgJy4nLiAgKi8KLSAgaWYgKGluc24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZXN0b3JlIHRoZSBjaGFyYWN0ZXIgd2Ugb3ZlcndyaXRlIGFib3ZlIChpZiBhbnkpLiAgKi8gCi0gICAgICBpZiAoc2F2ZV9jKQotCSooLS1zKSA9IHNhdmVfYzsKLQotICAgICAgLyogU2NhbiB1cCB0byB0aGUgZmlyc3QgJy4nIG9yIHdoaXRlc3BhY2UuICAqLwotICAgICAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICpzICE9ICcuJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBkaWQgbm90IGZpbmQgYSAnLicsIHRoZW4gd2UgY2FuIHF1aXQgbm93LiAgKi8KLSAgICAgIGlmICgqcyAhPSAnLicpCi0JewotCSAgaW5zbl9lcnJvciA9ICJ1bnJlY29nbml6ZWQgb3Bjb2RlIjsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIExvb2t1cCB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBpZiAoKGluc24gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLQl7Ci0JICBpbnNuX2Vycm9yID0gInVucmVjb2duaXplZCBvcGNvZGUiOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgZnVsbF9vcGNvZGVfbWF0Y2ggPSAwOwotICAgIH0KLQotICBhcmdzU3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIGFzc2VydCAoc3RyY21wIChpbnNuLT5uYW1lLCBzdHIpID09IDApOwotCi0gICAgICBpZiAoT1BDT0RFX0lTX01FTUJFUiAoaW5zbiwgbWlwc19vcHRzLmlzYSwgbWlwc19jcHUsIG1pcHNfZ3AzMikpCi0Jb2sgPSB0cnVlOwotICAgICAgZWxzZSAKLQlvayA9IGZhbHNlOwotICAgICAgCi0gICAgICBpZiAoaW5zbi0+cGluZm8gIT0gSU5TTl9NQUNSTykKLQl7Ci0JICBpZiAobWlwc19jcHUgPT0gNDY1MCAmJiAoaW5zbi0+cGluZm8gJiBGUF9EKSAhPSAwKQotCSAgICBvayA9IGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgb2spCi0JewotCSAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXQotCSAgICAgICYmIHN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQkgICAgICBzcHJpbnRmIChidWYsIAotCQkgICAgICAgXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3I6ICVkIChNSVBTJWQpIiksCi0JCSAgICAgICBtaXBzX2NwdSwgbWlwc19vcHRzLmlzYSk7Ci0JCSAgICAgICAKLQkgICAgICBpbnNuX2Vycm9yID0gYnVmOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaXAtPmluc25fbW8gPSBpbnNuOwotICAgICAgaXAtPmluc25fb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotCXsKLQkgIGlmICgqcyA9PSAnICcpCi0JICAgICsrczsKLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnXDAnOgkJLyogZW5kIG9mIGFyZ3MgKi8KLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJywnOgotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBzLS07Ci0JICAgICAgc3dpdGNoICgqKythcmdzKQotCQl7Ci0JCWNhc2UgJ3InOgotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDIxOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ3cnOgotCQljYXNlICdXJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDE2OwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ1YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcoJzoKLQkgICAgICAvKiBIYW5kbGUgb3B0aW9uYWwgYmFzZSByZWdpc3Rlci4KLQkJIEVpdGhlciB0aGUgYmFzZSByZWdpc3RlciBpcyBvbWl0dGVkIG9yCi0JCSB3ZSBtdXN0IGhhdmUgYSBsZWZ0IHBhcmVuLiAqLwotCSAgICAgIC8qIFRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBuZXh0IG9wZXJhbmQgc3BlY2lmaWVyCi0JCSBpcyBhIGJhc2UgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4gICovCi0JICAgICAgYXNzZXJ0IChhcmdzWzFdID09ICdiJyB8fCBhcmdzWzFdID09ICc1JwotCQkgICAgICB8fCBhcmdzWzFdID09ICctJyB8fCBhcmdzWzFdID09ICc0Jyk7Ci0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXJldHVybjsKLQotCSAgICBjYXNlICcpJzoJCS8qIHRoZXNlIG11c3QgbWF0Y2ggZXhhY3RseSAqLwotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc8JzoJCS8qIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0ICovCi0JICAgICAgLyoKLQkgICAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIG1hbnVhbCwgaWYgdGhlIHNoaWZ0IGFtb3VudCBpcyBncmVhdGVyCi0JICAgICAgICogdGhhbiAzMSBvciBsZXNzIHRoYW4gMCB0aGUgdGhlIHNoaWZ0IGFtb3VudCBzaG91bGQgYmUKLQkgICAgICAgKiBtb2QgMzIuIEluIHJlYWxpdHkgdGhlIG1pcHMgYXNzZW1ibGVyIGlzc3VlcyBhbiBlcnJvci4KLQkgICAgICAgKiBXZSBpc3N1ZSBhIHdhcm5pbmcgYW5kIG1hc2sgb3V0IGFsbCBidXQgdGhlIGxvdyA1IGJpdHMuCi0JICAgICAgICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDMxKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSW1wcm9wZXIgc2hpZnQgYW1vdW50ICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBpbW1fZXhwci5YX2FkZF9udW1iZXIgJiAweDFmOwotCQl9Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCA2OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnPic6CQkvKiBzaGlmdCBhbW91bnQgbWludXMgMzIgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMzIKLQkJICB8fCAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gNjMpCi0JCWJyZWFrOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIC0gMzIpIDw8IDY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCi0JICAgIGNhc2UgJ2snOgkJLyogY2FjaGUgY29kZSAqLwotCSAgICBjYXNlICdoJzoJCS8qIHByZWZ4IGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gMzEpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbnZhbGlkIHZhbHVlIGZvciBgJXMnICglbHUpIiksCi0JCQkgICBpcC0+aW5zbl9tby0+bmFtZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDFmOwotCQl9Ci0JICAgICAgaWYgKCphcmdzID09ICdrJykKLQkJaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCBPUF9TSF9DQUNIRTsKLQkgICAgICBlbHNlCi0JCWlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgT1BfU0hfUFJFRlg7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdjJzoJCS8qIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQpIGltbV9leHByLlhfYWRkX251bWJlciA+IDEwMjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbGxlZ2FsIGJyZWFrIGNvZGUgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgMTY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdxJzoJCS8qIGxvd2VyIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQpIGltbV9leHByLlhfYWRkX251bWJlciA+IDEwMjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbGxlZ2FsIGxvd2VyIGJyZWFrIGNvZGUgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ0InOgkJLyogc3lzY2FsbCBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAweGZmZmZmKQotCQlhc193YXJuIChfKCJJbGxlZ2FsIHN5c2NhbGwgY29kZSAoJWxkKSIpLAotCQkJIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBjYXNlICdDJzogICAgICAgICAgIC8qIENvcHJvY2Vzc29yIGNvZGUgKi8KLSAgICAgICAgICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLSAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gKDE8PDI1KSkKLQkJewotICAgICAgICAgICAgICAgICAgYXNfd2FybiAoXygiQ29wcm9jY2Vzb3IgY29kZSA+IDI1IGJpdHMgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotICAgICAgICAgICAgICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9ICgoMTw8MjUpIC0gMSk7Ci0JCX0KLSAgICAgICAgICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgICAgICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICAgICAgICAgICAgICBzID0gZXhwcl9lbmQ7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ1AnOgkJLyogUGVyZm9ybWFuY2UgcmVnaXN0ZXIgKi8KLSAgICAgICAgICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLSAgICAgICAgICAgICAgaWYgKGltbV9leHByLlhfYWRkX251bWJlciAhPSAwICYmIGltbV9leHByLlhfYWRkX251bWJlciAhPSAxKQotCQl7Ci0gICAgICAgICAgICAgICAgICBhc193YXJuIChfKCJJbnZhbGlkYXRlIHBlcmZvcm1hbmNlIHJlZ3N0ZXIgKCVsZCkiKSwKLQkJCSAgIChsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotICAgICAgICAgICAgICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDE7Ci0JCX0KLSAgICAgICAgICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IChpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgMSk7Ci0gICAgICAgICAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgICAgICAgICAgcyA9IGV4cHJfZW5kOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdiJzoJCS8qIGJhc2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnZCc6CQkvKiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotCSAgICBjYXNlICdzJzoJCS8qIHNvdXJjZSByZWdpc3RlciAqLwotCSAgICBjYXNlICd0JzoJCS8qIHRhcmdldCByZWdpc3RlciAqLwotCSAgICBjYXNlICdyJzoJCS8qIGJvdGggdGFyZ2V0IGFuZCBzb3VyY2UgKi8KLQkgICAgY2FzZSAndic6CQkvKiBib3RoIGRlc3QgYW5kIHNvdXJjZSAqLwotCSAgICBjYXNlICd3JzoJCS8qIGJvdGggZGVzdCBhbmQgdGFyZ2V0ICovCi0JICAgIGNhc2UgJ0UnOgkJLyogY29wcm9jZXNzb3IgdGFyZ2V0IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ0cnOgkJLyogY29wcm9jZXNzb3IgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAneCc6CQkvKiBpZ25vcmUgcmVnaXN0ZXIgbmFtZSAqLwotCSAgICBjYXNlICd6JzoJCS8qIG11c3QgYmUgemVybyByZWdpc3RlciAqLwotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChzWzBdID09ICckJykKLQkJewotCi0JCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzWzFdKSkKLQkJICAgIHsKLQkJICAgICAgKytzOwotCQkgICAgICByZWdubyA9IDA7Ci0JCSAgICAgIGRvCi0JCQl7Ci0JCQkgIHJlZ25vICo9IDEwOwotCQkJICByZWdubyArPSAqcyAtICcwJzsKLQkJCSAgKytzOwotCQkJfQotCQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0JCSAgICAgIGlmIChyZWdubyA+IDMxKQotCQkJYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAoJWQpIiksIHJlZ25vKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqYXJncyA9PSAnRScgfHwgKmFyZ3MgPT0gJ0cnKQotCQkgICAgZ290byBub3RyZWc7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoc1sxXSA9PSAnZicgJiYgc1syXSA9PSAncCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBGUDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAncycgJiYgc1syXSA9PSAncCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBTUDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnZycgJiYgc1syXSA9PSAncCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBHUDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnYScgJiYgc1syXSA9PSAndCcpCi0JCQl7Ci0JCQkgIHMgKz0gMzsKLQkJCSAgcmVnbm8gPSBBVDsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnaycgJiYgc1syXSA9PSAndCcgJiYgc1szXSA9PSAnMCcpCi0JCQl7Ci0JCQkgIHMgKz0gNDsKLQkJCSAgcmVnbm8gPSBLVDA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzEnKQotCQkJewotCQkJICBzICs9IDQ7Ci0JCQkgIHJlZ25vID0gS1QxOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChpdGJsX2hhdmVfZW50cmllcykKLQkJCXsKLQkJCSAgY2hhciAqcCwgKm47Ci0JCQkgIHVuc2lnbmVkIGxvbmcgcjsKLQotCQkJICBwID0gcyArIDE7IAkvKiBhZHZhbmNlIHBhc3QgJyQnICovCi0JCQkgIG4gPSBpdGJsX2dldF9maWVsZCAoJnApOyAgLyogbiBpcyBuYW1lICovCi0KLQkJCSAgLyogU2VlIGlmIHRoaXMgaXMgYSByZWdpc3RlciBkZWZpbmVkIGluIGFuCi0JCQkgICAgIGl0YmwgZW50cnkuICAqLwotCQkJICBpZiAoaXRibF9nZXRfcmVnX3ZhbCAobiwgJnIpKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIEdldF9maWVsZCBhZHZhbmNlcyB0byB0aGUgc3RhcnQgb2YKLQkJCQkgdGhlIG5leHQgZmllbGQsIHNvIHdlIG5lZWQgdG8gYmFjawotCQkJCSByYWNrIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgZmllbGQuICAqLwotCQkJICAgICAgaWYgKHApIAotCQkJCXMgPSBwIC0gMTsKLQkJCSAgICAgIGVsc2UgCi0JCQkJcyA9IHN0cmNociAocywgJ1wwJyk7Ci0JCQkgICAgICByZWdubyA9IHI7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgZ290byBub3RyZWc7Ci0JCQkgIH0KLQkJICAgICAgZWxzZQotCQkJZ290byBub3RyZWc7Ci0JCSAgICB9Ci0JCSAgaWYgKHJlZ25vID09IEFUCi0JCSAgICAgICYmICEgbWlwc19vcHRzLm5vYXQKLQkJICAgICAgJiYgKmFyZ3MgIT0gJ0UnCi0JCSAgICAgICYmICphcmdzICE9ICdHJykKLQkJICAgIGFzX3dhcm4gKF8oIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkJICBjID0gKmFyZ3M7Ci0JCSAgaWYgKCpzID09ICcgJykKLQkJICAgIHMrKzsKLQkJICBpZiAoYXJnc1sxXSAhPSAqcykKLQkJICAgIHsKLQkJICAgICAgaWYgKGMgPT0gJ3InIHx8IGMgPT0gJ3YnIHx8IGMgPT0gJ3cnKQotCQkJewotCQkJICByZWdubyA9IGxhc3RyZWdubzsKLQkJCSAgcyA9IHNfcmVzZXQ7Ci0JCQkgIGFyZ3MrKzsKLQkJCX0KLQkJICAgIH0KLQkJICAvKiAneicgb25seSBtYXRjaGVzICQwLiAgKi8KLQkJICBpZiAoYyA9PSAneicgJiYgcmVnbm8gIT0gMCkKLQkJICAgIGJyZWFrOwotCi0JLyogTm93IHRoYXQgd2UgaGF2ZSBhc3NlbWJsZWQgb25lIG9wZXJhbmQsIHdlIHVzZSB0aGUgYXJncyBzdHJpbmcgCi0JICogdG8gZmlndXJlIG91dCB3aGVyZSBpdCBnb2VzIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQkJICBzd2l0Y2ggKGMpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdyJzoKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgY2FzZSAndic6Ci0JCSAgICBjYXNlICdiJzoKLQkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDIxOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgY2FzZSAnRyc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd3JzoKLQkJICAgIGNhc2UgJ3QnOgotCQkgICAgY2FzZSAnRSc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxNjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd4JzoKLQkJICAgICAgLyogVGhpcyBjYXNlIGV4aXN0cyBiZWNhdXNlIG9uIHRoZSByMzAwMCB0cnVuYwotCQkJIGV4cGFuZHMgaW50byBhIG1hY3JvIHdoaWNoIHJlcXVpcmVzIGEgZ3AKLQkJCSByZWdpc3Rlci4gIE9uIHRoZSByNjAwMCBvciByNDAwMCBpdCBpcwotCQkJIGFzc2VtYmxlZCBpbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uIHdoaWNoCi0JCQkgaWdub3JlcyB0aGUgcmVnaXN0ZXIuICBUaHVzIHRoZSBpbnNuIHZlcnNpb24KLQkJCSBpcyBNSVBTX0lTQTIgYW5kIHVzZXMgJ3gnLCBhbmQgdGhlIG1hY3JvCi0JCQkgdmVyc2lvbiBpcyBNSVBTX0lTQTEgYW5kIHVzZXMgJ3QnLiAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd6JzoKLQkJICAgICAgLyogVGhpcyBjYXNlIGlzIGZvciB0aGUgZGl2IGluc3RydWN0aW9uLCB3aGljaAotCQkJIGFjdHMgZGlmZmVyZW50bHkgaWYgdGhlIGRlc3RpbmF0aW9uIGFyZ3VtZW50Ci0JCQkgaXMgJDAuICBUaGlzIG9ubHkgbWF0Y2hlcyAkMCwgYW5kIGlzIGNoZWNrZWQKLQkJCSBvdXRzaWRlIHRoZSBzd2l0Y2guICAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ0QnOgotCQkgICAgICAvKiBJdGJsIG9wZXJhbmQ7IG5vdCB5ZXQgaW1wbGVtZW50ZWQuIEZJWE1FID8/ICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgICAvKiBXaGF0IGFib3V0IGFsbCBvdGhlciBvcGVyYW5kcyBsaWtlICdpJywgd2hpY2gKLQkJCSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBvcGNvZGUgdGFibGU/ICovCi0JCSAgICB9Ci0JCSAgbGFzdHJlZ25vID0gcmVnbm87Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgbm90cmVnOgotCSAgICAgIHN3aXRjaCAoKmFyZ3MrKykKLQkJewotCQljYXNlICdyJzoKLQkJY2FzZSAndic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAyMTsKLQkJICBjb250aW51ZTsKLQkJY2FzZSAndyc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxNjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0QnOgkJLyogZmxvYXRpbmcgcG9pbnQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnUyc6CQkvKiBmbG9hdGluZyBwb2ludCBzb3VyY2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnVCc6CQkvKiBmbG9hdGluZyBwb2ludCB0YXJnZXQgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnUic6CQkvKiBmbG9hdGluZyBwb2ludCBzb3VyY2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnVic6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIHNfcmVzZXQgPSBzOwotCSAgICAgIGlmIChzWzBdID09ICckJyAmJiBzWzFdID09ICdmJyAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc1syXSkpCi0JCXsKLQkJICBzICs9IDI7Ci0JCSAgcmVnbm8gPSAwOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIHJlZ25vICo9IDEwOwotCQkgICAgICByZWdubyArPSAqcyAtICcwJzsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKTsKLQotCQkgIGlmIChyZWdubyA+IDMxKQotCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIGZsb2F0IHJlZ2lzdGVyIG51bWJlciAoJWQpIiksIHJlZ25vKTsKLQotCQkgIGlmICgocmVnbm8gJiAxKSAhPSAwCi0JCSAgICAgICYmICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKQotCQkgICAgICAmJiAhIChzdHJjbXAgKHN0ciwgIm10YzEiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJtZmMxIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAibHdjMSIpID09IDAKLQkJCSAgICB8fCBzdHJjbXAgKHN0ciwgInN3YzEiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJsLnMiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJzLnMiKSA9PSAwKSkKLQkJICAgIGFzX3dhcm4gKF8oIkZsb2F0IHJlZ2lzdGVyIHNob3VsZCBiZSBldmVuLCB3YXMgJWQiKSwKLQkJCSAgICAgcmVnbm8pOwotCi0JCSAgYyA9ICphcmdzOwotCQkgIGlmICgqcyA9PSAnICcpCi0JCSAgICBzKys7Ci0JCSAgaWYgKGFyZ3NbMV0gIT0gKnMpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjID09ICdWJyB8fCBjID09ICdXJykKLQkJCXsKLQkJCSAgcmVnbm8gPSBsYXN0cmVnbm87Ci0JCQkgIHMgPSBzX3Jlc2V0OwotCQkJICBhcmdzKys7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgc3dpdGNoIChjKQotCQkgICAgewotCQkgICAgY2FzZSAnRCc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCA2OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1YnOgotCQkgICAgY2FzZSAnUyc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdXJzoKLQkJICAgIGNhc2UgJ1QnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTY7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUic6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAyMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgbGFzdHJlZ25vID0gcmVnbm87Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCi0JICAgICAgc3dpdGNoICgqYXJncysrKQotCQl7Ci0JCWNhc2UgJ1YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTE7Ci0JCSAgY29udGludWU7Ci0JCWNhc2UgJ1cnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTY7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdJJzoKLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fYmlnCi0JCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlpbnNuX2Vycm9yID0gXygiYWJzb2x1dGUgZXhwcmVzc2lvbiByZXF1aXJlZCIpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdBJzoKLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ18zMjsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnRic6Ci0JICAgIGNhc2UgJ0wnOgotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnbCc6Ci0JICAgICAgewotCQlpbnQgZjY0OwotCQljaGFyICpzYXZlX2luOwotCQljaGFyICplcnI7Ci0JCXVuc2lnbmVkIGNoYXIgdGVtcFs4XTsKLQkJaW50IGxlbjsKLQkJdW5zaWduZWQgaW50IGxlbmd0aDsKLQkJc2VnVCBzZWc7Ci0JCXN1YnNlZ1Qgc3Vic2VnOwotCQljaGFyICpwOwotCi0JCS8qIFRoZXNlIG9ubHkgYXBwZWFyIGFzIHRoZSBsYXN0IG9wZXJhbmQgaW4gYW4KLQkJICAgaW5zdHJ1Y3Rpb24sIGFuZCBldmVyeSBpbnN0cnVjdGlvbiB0aGF0IGFjY2VwdHMKLQkJICAgdGhlbSBpbiBhbnkgdmFyaWFudCBhY2NlcHRzIHRoZW0gaW4gYWxsIHZhcmlhbnRzLgotCQkgICBUaGlzIG1lYW5zIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYmFja2luZyBvdXQKLQkJICAgYW55IGNoYW5nZXMgaWYgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoLgotCi0JCSAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyB0aGUgc2l6ZSBvZiB0aGUKLQkJICAgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgYW5kIHdoZXJlIGl0IGdvZXMuICBGb3IgJ0YnCi0JCSAgIGFuZCAnTCcgdGhlIGNvbnN0YW50IGlzIDY0IGJpdHM7IGZvciAnZicgYW5kICdsJyBpdAotCQkgICBpcyAzMiBiaXRzLiAgV2hlcmUgdGhlIGNvbnN0YW50IGlzIHBsYWNlZCBpcyBiYXNlZAotCQkgICBvbiBob3cgdGhlIE1JUFMgYXNzZW1ibGVyIGRvZXMgdGhpbmdzOgotCQkgICAgRiAtLSAucmRhdGEKLQkJICAgIEwgLS0gLmxpdDgKLQkJICAgIGYgLS0gaW1tZWRpYXRlIHZhbHVlCi0JCSAgICBsIC0tIC5saXQ0Ci0KLQkJICAgIFRoZSAubGl0NCBhbmQgLmxpdDggc2VjdGlvbnMgYXJlIG9ubHkgdXNlZCBpZgotCQkgICAgcGVybWl0dGVkIGJ5IHRoZSAtRyBhcmd1bWVudC4KLQotCQkgICAgV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlLCB3ZSB1c2UgdGhlCi0JCSAgICAubGl0OCBzZWN0aW9uIGJ1dCBub3QgdGhlIC5saXQ0IHNlY3Rpb24gKHdlIGNhbiBkbwotCQkgICAgLmxpdDQgaW5saW5lIGVhc2lseTsgd2UgbmVlZCB0byBwdXQgLmxpdDgKLQkJICAgIHNvbWV3aGVyZSBpbiB0aGUgZGF0YSBzZWdtZW50LCBhbmQgdXNpbmcgLmxpdDgKLQkJICAgIHBlcm1pdHMgdGhlIGxpbmtlciB0byBldmVudHVhbGx5IGNvbWJpbmUgaWRlbnRpY2FsCi0JCSAgICAubGl0OCBlbnRyaWVzKS4gICovCi0KLQkJZjY0ID0gKmFyZ3MgPT0gJ0YnIHx8ICphcmdzID09ICdMJzsKLQotCQlzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQlpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCQllcnIgPSBtZF9hdG9mIChmNjQgPyAnZCcgOiAnZicsIChjaGFyICopIHRlbXAsICZsZW4pOwotCQlsZW5ndGggPSBsZW47Ci0JCXMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCWlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0JCWlmIChlcnIgIT0gTlVMTCAmJiAqZXJyICE9ICdcMCcpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJCYWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQ6ICVzIiksIGVycik7Ci0JCSAgICBtZW1zZXQgKHRlbXAsICdcMCcsIHNpemVvZiB0ZW1wKTsKLQkJICAgIGxlbmd0aCA9IGY2NCA/IDggOiA0OwotCQkgIH0KLQotCQlhc3NlcnQgKGxlbmd0aCA9PSAoZjY0ID8gOCA6IDQpKTsKLQotCQlpZiAoKmFyZ3MgPT0gJ2YnCi0JCSAgICB8fCAoKmFyZ3MgPT0gJ2wnCi0JCQkmJiAoISBVU0VfR0xPQkFMX1BPSU5URVJfT1BUCi0JCQkgICAgfHwgbWlwc19waWMgPT0gRU1CRURERURfUElDCi0JCQkgICAgfHwgZ19zd2l0Y2hfdmFsdWUgPCA0Ci0JCQkgICAgfHwgKHRlbXBbMF0gPT0gMCAmJiB0ZW1wWzFdID09IDApCi0JCQkgICAgfHwgKHRlbXBbMl0gPT0gMCAmJiB0ZW1wWzNdID09IDApKSkpCi0JCSAgewotCQkgICAgaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCSAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkJICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGwzMiAodGVtcCk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRiMzIgKHRlbXApOwotCQkgIH0KLQkJZWxzZSBpZiAobGVuZ3RoID4gNAotCQkJICYmICgodGVtcFswXSA9PSAwICYmIHRlbXBbMV0gPT0gMCkKLQkJCSAgICAgfHwgKHRlbXBbMl0gPT0gMCAmJiB0ZW1wWzNdID09IDApKQotCQkJICYmICgodGVtcFs0XSA9PSAwICYmIHRlbXBbNV0gPT0gMCkKLQkJCSAgICAgfHwgKHRlbXBbNl0gPT0gMCAmJiB0ZW1wWzddID09IDApKSkKLQkJICB7Ci0JCSAgICAvKiBUaGUgdmFsdWUgaXMgc2ltcGxlIGVub3VnaCB0byBsb2FkIHdpdGggYQotICAgICAgICAgICAgICAgICAgICAgICBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zLiAgSW4gbWlwczEgbW9kZSwgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgIGltbV9leHByIHRvIHRoZSBoaWdoIG9yZGVyIDMyIGJpdHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF9leHByIHRvIHRoZSBsb3cgb3JkZXIgMzIgYml0cy4KLSAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBzZXQgaW1tX2V4cHIgdG8gdGhlIGVudGlyZSA2NCBiaXQKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQuICAqLwotCQkgICAgaWYgKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgewotCQkJaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkJICB7Ci0JCQkgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGwzMiAodGVtcCArIDQpOwotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRsMzIgKHRlbXApOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0YjMyICh0ZW1wKTsKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0YjMyICh0ZW1wICsgNCk7Ci0JCQkgIH0KLQkJCWlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQkJCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzaXplb2YgKGltbV9leHByLlhfYWRkX251bWJlcikgPiA0KQotCQkgICAgICB7Ci0JCQlpbW1fZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0bDY0ICh0ZW1wKTsKLQkJCWVsc2UKLQkJCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGI2NCAodGVtcCk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaW1tX2V4cHIuWF9vcCA9IE9fYmlnOwotCQkJaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gNDsKLQkJCWlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCQkJICB7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMF0gPSBiZmRfZ2V0bDE2ICh0ZW1wKTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVsxXSA9IGJmZF9nZXRsMTYgKHRlbXAgKyAyKTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVsyXSA9IGJmZF9nZXRsMTYgKHRlbXAgKyA0KTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVszXSA9IGJmZF9nZXRsMTYgKHRlbXAgKyA2KTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMF0gPSBiZmRfZ2V0YjE2ICh0ZW1wICsgNik7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMV0gPSBiZmRfZ2V0YjE2ICh0ZW1wICsgNCk7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMl0gPSBiZmRfZ2V0YjE2ICh0ZW1wICsgMik7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bM10gPSBiZmRfZ2V0YjE2ICh0ZW1wKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmV3bmFtZTsKLQkJICAgIHNlZ1QgbmV3X3NlZzsKLQotCQkgICAgLyogU3dpdGNoIHRvIHRoZSByaWdodCBzZWN0aW9uLiAgKi8KLQkJICAgIHNlZyA9IG5vd19zZWc7Ci0JCSAgICBzdWJzZWcgPSBub3dfc3Vic2VnOwotCQkgICAgc3dpdGNoICgqYXJncykKLQkJICAgICAgewotCQkgICAgICBkZWZhdWx0OiAvKiB1bnVzZWQgZGVmYXVsdCBjYXNlIGF2b2lkcyB3YXJuaW5ncy4gICovCi0JCSAgICAgIGNhc2UgJ0wnOgotCQkJbmV3bmFtZSA9IFJEQVRBX1NFQ1RJT05fTkFNRTsKLQkJCWlmICgoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCAmJiBnX3N3aXRjaF92YWx1ZSA+PSA4KQotCQkJICAgIHx8IG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQkJCSAgbmV3bmFtZSA9ICIubGl0OCI7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnRic6Ci0JCQlpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotCQkJICBuZXduYW1lID0gIi5saXQ4IjsKLQkJCWVsc2UKLQkJCSAgbmV3bmFtZSA9IFJEQVRBX1NFQ1RJT05fTkFNRTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdsJzoKLQkJCWFzc2VydCAoIVVTRV9HTE9CQUxfUE9JTlRFUl9PUFQKLQkJCQl8fCBnX3N3aXRjaF92YWx1ZSA+PSA0KTsKLQkJCW5ld25hbWUgPSAiLmxpdDQiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIG5ld19zZWcgPSBzdWJzZWdfbmV3IChuZXduYW1lLCAoc3Vic2VnVCkgMCk7Ci0JCSAgICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbmV3X3NlZywKLQkJCQkJICAgICAoU0VDX0FMTE9DCi0JCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgfCBTRUNfREFUQSkpOwotCQkgICAgZnJhZ19hbGlnbiAoKmFyZ3MgPT0gJ2wnID8gMiA6IDMsIDAsIDApOwotCQkgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkJJiYgc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCQkgICAgICByZWNvcmRfYWxpZ25tZW50IChuZXdfc2VnLCA0KTsKLQkJICAgIGVsc2UKLQkJICAgICAgcmVjb3JkX2FsaWdubWVudCAobmV3X3NlZywgKmFyZ3MgPT0gJ2wnID8gMiA6IDMpOwotCQkgICAgaWYgKHNlZyA9PSBub3dfc2VnKQotCQkgICAgICBhc19iYWQgKF8oIkNhbid0IHVzZSBmbG9hdGluZyBwb2ludCBpbnNuIGluIHRoaXMgc2VjdGlvbiIpKTsKLQotCQkgICAgLyogU2V0IHRoZSBhcmd1bWVudCB0byB0aGUgY3VycmVudCBhZGRyZXNzIGluIHRoZQotCQkgICAgICAgc2VjdGlvbi4gICovCi0JCSAgICBvZmZzZXRfZXhwci5YX29wID0gT19zeW1ib2w7Ci0JCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wgPQotCQkgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwgZnJhZ19ub3cpOwotCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQotCQkgICAgLyogUHV0IHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgaW50byB0aGUgc2VjdGlvbi4gICovCi0JCSAgICBwID0gZnJhZ19tb3JlICgoaW50KSBsZW5ndGgpOwotCQkgICAgbWVtY3B5IChwLCB0ZW1wLCBsZW5ndGgpOwotCi0JCSAgICAvKiBTd2l0Y2ggYmFjayB0byB0aGUgb3JpZ2luYWwgc2VjdGlvbi4gICovCi0JCSAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdpJzoJCS8qIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLQkgICAgY2FzZSAnaic6CQkvKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqLwotCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19MTzE2OwotCSAgICAgIGMgPSBteV9nZXRTbWFsbEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgaWYgKGMgIT0gJ1wwJykKLQkJewotCQkgIGlmIChjICE9ICdsJykKLQkJICAgIHsKLQkJICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJCWltbV9leHByLlhfYWRkX251bWJlciA9Ci0JCQkgIChpbW1fZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQkgICAgICBlbHNlIGlmIChjID09ICdoJykKLQkJCXsKLQkJCSAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0hJMTZfUzsKLQkJCSAgaW1tX3VubWF0Y2hlZF9oaSA9IHRydWU7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweGZmZmY7Ci0JCX0KLQkgICAgICBpZiAoKmFyZ3MgPT0gJ2knKQotCQl7Ci0JCSAgaWYgKChjID09ICdcMCcgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgICB8fCAoKGltbV9leHByLlhfYWRkX251bWJlciA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGltbV9leHByLlhfYWRkX251bWJlciA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpKQotCQkgICAgewotCQkgICAgICBpZiAoaW5zbiArIDEgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdICYmCi0JCQkgICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpCi0JCQlicmVhazsKLQkJICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAmJiBpbW1fZXhwci5YX29wICE9IE9fYmlnKQotCQkJaW5zbl9lcnJvciA9IF8oImFic29sdXRlIGV4cHJlc3Npb24gcmVxdWlyZWQiKTsKLQkJICAgICAgZWxzZQotCQkJYXNfYmFkIChfKCIxNiBiaXQgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgMC4uNjU1MzUiKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnQgbW9yZTsKLQkJICBvZmZzZXRUIG1heDsKLQotCQkgIC8qIFRoZSB1cHBlciBib3VuZCBzaG91bGQgYmUgMHg4MDAwLCBidXQKLQkJICAgICB1bmZvcnR1bmF0ZWx5IHRoZSBNSVBTIGFzc2VtYmxlciBhY2NlcHRzIG51bWJlcnMKLQkJICAgICBmcm9tIDB4ODAwMCB0byAweGZmZmYgYW5kIHNpZ24gZXh0ZW5kcyB0aGVtLCBhbmQKLQkJICAgICB3ZSB3YW50IHRvIGJlIGNvbXBhdGlibGUuICBXZSBvbmx5IHBlcm1pdCB0aGlzCi0JCSAgICAgZXh0ZW5kZWQgcmFuZ2UgZm9yIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90Ci0JCSAgICAgcHJvdmlkZSBhbnkgZnVydGhlciBhbHRlcm5hdGVzLCBzaW5jZSB0aG9zZQotCQkgICAgIGFsdGVybmF0ZXMgbWF5IGhhbmRsZSBvdGhlciBjYXNlcy4gIFBlb3BsZSBzaG91bGQKLQkJICAgICB1c2UgdGhlIG51bWJlcnMgdGhleSBtZWFuLCByYXRoZXIgdGhhbiByZWx5aW5nIG9uCi0JCSAgICAgYSBteXN0ZXJpb3VzIHNpZ24gZXh0ZW5zaW9uLiAgKi8KLQkJICBtb3JlID0gKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXSAmJgotCQkJICBzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkgPT0gMCk7Ci0JCSAgaWYgKG1vcmUpCi0JCSAgICBtYXggPSAweDgwMDA7Ci0JCSAgZWxzZQotCQkgICAgbWF4ID0gMHgxMDAwMDsKLQkJICBpZiAoKGMgPT0gJ1wwJyAmJiBpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICAgIHx8ICgoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IG1heCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgICB8fCAobW9yZQotCQkJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwCi0JCQkgICYmIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkKLQkJCSAgJiYgaW1tX2V4cHIuWF91bnNpZ25lZAotCQkJICAmJiBzaXplb2YgKGltbV9leHByLlhfYWRkX251bWJlcikgPD0gNCkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChtb3JlKQotCQkJYnJlYWs7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2JpZykKLQkJCWluc25fZXJyb3IgPSBfKCJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIik7Ci0JCSAgICAgIGVsc2UKLQkJCWFzX2JhZCAoXygiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIC0zMjc2OC4uMzI3NjciKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnbyc6CQkvKiAxNiBiaXQgb2Zmc2V0ICovCi0JICAgICAgYyA9IG15X2dldFNtYWxsRXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQotCSAgICAgIC8qIElmIHRoaXMgdmFsdWUgd29uJ3QgZml0IGludG8gYSAxNiBiaXQgb2Zmc2V0LCB0aGVuIGdvCi0JCSBmaW5kIGEgbWFjcm8gdGhhdCB3aWxsIGdlbmVyYXRlIHRoZSAzMiBiaXQgb2Zmc2V0Ci0JCSBjb2RlIHBhdHRlcm4uICBBcyBhIHNwZWNpYWwgaGFjaywgd2UgYWNjZXB0IHRoZQotCQkgZGlmZmVyZW5jZSBvZiB0d28gbG9jYWwgc3ltYm9scyBhcyBhIGNvbnN0YW50LiAgVGhpcwotCQkgaXMgcmVxdWlyZWQgdG8gc3VwcG9zZSBlbWJlZGRlZCBQSUMgc3dpdGNoZXMsIHdoaWNoCi0JCSB1c2UgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggbG9va3MgbGlrZQotCQkgICAgIGx3ICQ0LCRMMTItJExTMTIoJDQpCi0JCSBUaGUgcHJvYmxlbSB3aXRoIGhhbmRsaW5nIHRoaXMgaW4gYSBtb3JlIGdlbmVyYWwKLQkJIGZhc2hpb24gaXMgdGhhdCB0aGUgbWFjcm8gZnVuY3Rpb24gZG9lc24ndCBleHBlY3QgdG8KLQkJIHNlZSBhbnl0aGluZyB3aGljaCBjYW4gYmUgaGFuZGxlZCBpbiBhIHNpbmdsZQotCQkgY29uc3RhbnQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChjID09IDAKLQkJICAmJiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCSAgICAgIHx8IG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDgwMDAKLQkJICAgICAgfHwgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCkKLQkJICAmJiAobWlwc19waWMgIT0gRU1CRURERURfUElDCi0JCSAgICAgIHx8IG9mZnNldF9leHByLlhfb3AgIT0gT19zdWJ0cmFjdAotCQkgICAgICB8fCAoU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCi0JCQkgICE9IG5vd19zZWcpKSkKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoYyA9PSAnaCcgfHwgYyA9PSAnSCcpCi0JCXsKLQkJICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgYnJlYWs7Ci0JCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0KLQkJICAgIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQl9Ci0JICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX0xPMTY7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3AnOgkJLyogcGMgcmVsYXRpdmUgb2Zmc2V0ICovCi0JICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyOwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3UnOgkJLyogdXBwZXIgMTYgYml0cyAqLwotCSAgICAgIGMgPSBteV9nZXRTbWFsbEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0xPMTY7Ci0JICAgICAgaWYgKGMpCi0JCXsKLQkJICBpZiAoYyAhPSAnbCcpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCQlpbW1fZXhwci5YX2FkZF9udW1iZXIgPQotCQkJICAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQkJICAgICAgZWxzZSBpZiAoYyA9PSAnaCcpCi0JCQl7Ci0JCQkgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2X1M7Ci0JCQkgIGltbV91bm1hdGNoZWRfaGkgPSB0cnVlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlpbW1fcmVsb2MgPSBCRkRfUkVMT0NfSEkxNjsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHhmZmZmOwotCQl9Ci0JICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCQkgICYmIChpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwCi0JCSAgICAgIHx8IGltbV9leHByLlhfYWRkX251bWJlciA+PSAweDEwMDAwKSkKLQkJYXNfYmFkIChfKCJsdWkgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgMC4uNjU1MzUiKSk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2EnOgkJLyogMjYgYml0IGFkZHJlc3MgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfTUlQU19KTVA7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnTic6CQkvKiAzIGJpdCBicmFuY2ggY29uZGl0aW9uIGNvZGUgKi8KLQkgICAgY2FzZSAnTSc6CQkvKiAzIGJpdCBjb21wYXJlIGNvbmRpdGlvbiBjb2RlICovCi0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIkZmNjIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIHJlZ25vID0gMDsKLQkgICAgICBkbwotCQl7Ci0JCSAgcmVnbm8gKj0gMTA7Ci0JCSAgcmVnbm8gKz0gKnMgLSAnMCc7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpOwotCSAgICAgIGlmIChyZWdubyA+IDcpCi0JCWFzX2JhZCAoXygiaW52YWxpZCBjb25kaXRpb24gY29kZSByZWdpc3RlciAkZmNjJWQiKSwgcmVnbm8pOwotCSAgICAgIGlmICgqYXJncyA9PSAnTicpCi0JCWlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBPUF9TSF9CQ0M7Ci0JICAgICAgZWxzZQotCQlpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgT1BfU0hfQ0NDOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZCAoXygiYmFkIGNoYXIgPSAnJWMnXG4iKSwgKmFyZ3MpOwotCSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICAqLwotICAgICAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXSAmJgotCSAgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkKLQl7Ci0JICArK2luc247Ci0JICBzID0gYXJnc1N0YXJ0OwotCSAgY29udGludWU7Ci0JfQotICAgICAgaW5zbl9lcnJvciA9IF8oImlsbGVnYWwgb3BlcmFuZHMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBhc3NlbWJsZXMgYW4gaW5zdHJ1Y3Rpb24gaW50byBpdHMgYmluYXJ5IGZvcm1hdCB3aGVuCi0gICBhc3NlbWJsaW5nIGZvciB0aGUgbWlwczE2LiAgQXMgYSBzaWRlIGVmZmVjdCwgaXQgc2V0cyBvbmUgb2YgdGhlCi0gICBnbG9iYWwgdmFyaWFibGVzIGltbV9yZWxvYyBvciBvZmZzZXRfcmVsb2MgdG8gdGhlIHR5cGUgb2YKLSAgIHJlbG9jYXRpb24gdG8gZG8gaWYgb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBhbiBhZGRyZXNzIGV4cHJlc3Npb24uCi0gICBJdCBhbHNvIHNldHMgbWlwczE2X3NtYWxsIGFuZCBtaXBzMTZfZXh0IGlmIHRoZSB1c2VyIGV4cGxpY2l0bHkKLSAgIHJlcXVlc3RlZCBhIHNtYWxsIG9yIGV4dGVuZGVkIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9pcCAoc3RyLCBpcCkKLSAgICAgY2hhciAqc3RyOwotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgc3RydWN0IG1pcHNfb3Bjb2RlICppbnNuOwotICBjaGFyICphcmdzc3RhcnQ7Ci0gIHVuc2lnbmVkIGludCByZWdubzsKLSAgdW5zaWduZWQgaW50IGxhc3RyZWdubyA9IDA7Ci0gIGNoYXIgKnNfcmVzZXQ7Ci0KLSAgaW5zbl9lcnJvciA9IE5VTEw7Ci0KLSAgbWlwczE2X3NtYWxsID0gZmFsc2U7Ci0gIG1pcHMxNl9leHQgPSBmYWxzZTsKLQotICBmb3IgKHMgPSBzdHI7IGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcyk7ICsrcykKLSAgICA7Ci0gIHN3aXRjaCAoKnMpCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnICc6Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLic6Ci0gICAgICBpZiAoc1sxXSA9PSAndCcgJiYgc1syXSA9PSAnICcpCi0JewotCSAgKnMgPSAnXDAnOwotCSAgbWlwczE2X3NtYWxsID0gdHJ1ZTsKLQkgIHMgKz0gMzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2UnICYmIHNbMl0gPT0gJyAnKQotCXsKLQkgICpzID0gJ1wwJzsKLQkgIG1pcHMxNl9leHQgPSB0cnVlOwotCSAgcyArPSAzOwotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgaW5zbl9lcnJvciA9IF8oInVua25vd24gb3Bjb2RlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChtaXBzX29wdHMubm9hdXRvZXh0ZW5kICYmICEgbWlwczE2X2V4dCkKLSAgICBtaXBzMTZfc21hbGwgPSB0cnVlOwotCi0gIGlmICgoaW5zbiA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChtaXBzMTZfb3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnNuX2Vycm9yID0gXygidW5yZWNvZ25pemVkIG9wY29kZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhcmdzc3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGFzc2VydCAoc3RyY21wIChpbnNuLT5uYW1lLCBzdHIpID09IDApOwotCi0gICAgICBpcC0+aW5zbl9tbyA9IGluc247Ci0gICAgICBpcC0+aW5zbl9vcGNvZGUgPSBpbnNuLT5tYXRjaDsKLSAgICAgIGlwLT51c2VfZXh0ZW5kID0gZmFsc2U7Ci0gICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotICAgICAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7IDE7ICsrYXJncykKLQl7Ci0JICBpbnQgYzsKLQotCSAgaWYgKCpzID09ICcgJykKLQkgICAgKytzOwotCi0JICAvKiBJbiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQgd2UgY2FsbCBicmVhayBpZiB3ZSBkaWQgbm90IGZpbmQKLSAgICAgICAgICAgICBhIG1hdGNoLCBjb250aW51ZSBpZiB3ZSBkaWQgZmluZCBhIG1hdGNoLCBvciByZXR1cm4gaWYgd2UKLSAgICAgICAgICAgICBhcmUgZG9uZS4gICovCi0KLQkgIGMgPSAqYXJnczsKLQkgIHN3aXRjaCAoYykKLQkgICAgewotCSAgICBjYXNlICdcMCc6Ci0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXsKLQkJICAvKiBTdHVmZiB0aGUgaW1tZWRpYXRlIHZhbHVlIGluIG5vdywgaWYgd2UgY2FuLiAgKi8KLQkJICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICAgICYmIGltbV9yZWxvYyA+IEJGRF9SRUxPQ19VTlVTRUQKLQkJICAgICAgJiYgaW5zbi0+cGluZm8gIT0gSU5TTl9NQUNSTykKLQkJICAgIHsKLQkJICAgICAgbWlwczE2X2ltbWVkICgoY2hhciAqKSBOVUxMLCAwLAotCQkJCSAgICBpbW1fcmVsb2MgLSBCRkRfUkVMT0NfVU5VU0VELAotCQkJCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIsIHRydWUsIG1pcHMxNl9zbWFsbCwKLQkJCQkgICAgbWlwczE2X2V4dCwgJmlwLT5pbnNuX29wY29kZSwKLQkJCQkgICAgJmlwLT51c2VfZXh0ZW5kLCAmaXAtPmV4dGVuZCk7Ci0JCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkJICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkJICAgIH0KLQotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJywnOgotCSAgICAgIGlmICgqcysrID09IGMpCi0JCWNvbnRpbnVlOwotCSAgICAgIHMtLTsKLQkgICAgICBzd2l0Y2ggKCorK2FyZ3MpCi0JCXsKLQkJY2FzZSAndic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCBNSVBTMTZPUF9TSF9SWDsKLQkJICBjb250aW51ZTsKLQkJY2FzZSAndyc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCBNSVBTMTZPUF9TSF9SWTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJygnOgotCSAgICBjYXNlICcpJzoKLQkgICAgICBpZiAoKnMrKyA9PSBjKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd2JzoKLQkgICAgY2FzZSAndyc6Ci0JICAgICAgaWYgKHNbMF0gIT0gJyQnKQotCQl7Ci0JCSAgaWYgKGMgPT0gJ3YnKQotCQkgICAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCBNSVBTMTZPUF9TSF9SWDsKLQkJICBlbHNlCi0JCSAgICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JZOwotCQkgICsrYXJnczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2UgJ3gnOgotCSAgICBjYXNlICd5JzoKLQkgICAgY2FzZSAneic6Ci0JICAgIGNhc2UgJ1onOgotCSAgICBjYXNlICcwJzoKLQkgICAgY2FzZSAnUyc6Ci0JICAgIGNhc2UgJ1InOgotCSAgICBjYXNlICdYJzoKLQkgICAgY2FzZSAnWSc6Ci0JICAgICAgaWYgKHNbMF0gIT0gJyQnKQotCQlicmVhazsKLQkgICAgICBzX3Jlc2V0ID0gczsKLQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNbMV0pKQotCQl7Ci0JCSAgKytzOwotCQkgIHJlZ25vID0gMDsKLQkJICBkbwotCQkgICAgewotCQkgICAgICByZWdubyAqPSAxMDsKLQkJICAgICAgcmVnbm8gKz0gKnMgLSAnMCc7Ci0JCSAgICAgICsrczsKLQkJICAgIH0KLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0JCSAgaWYgKHJlZ25vID4gMzEpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCByZWdpc3RlciBudW1iZXIgKCVkKSIpLCByZWdubyk7Ci0JCSAgICAgIHJlZ25vID0gMjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChzWzFdID09ICdmJyAmJiBzWzJdID09ICdwJykKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICByZWdubyA9IEZQOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ3MnICYmIHNbMl0gPT0gJ3AnKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIHJlZ25vID0gU1A7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnZycgJiYgc1syXSA9PSAncCcpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgICAgcmVnbm8gPSBHUDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzWzFdID09ICdhJyAmJiBzWzJdID09ICd0JykKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICByZWdubyA9IEFUOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzAnKQotCQkgICAgewotCQkgICAgICBzICs9IDQ7Ci0JCSAgICAgIHJlZ25vID0gS1QwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzEnKQotCQkgICAgewotCQkgICAgICBzICs9IDQ7Ci0JCSAgICAgIHJlZ25vID0gS1QxOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQkrK3M7Ci0JICAgICAgaWYgKGFyZ3NbMV0gIT0gKnMpCi0JCXsKLQkJICBpZiAoYyA9PSAndicgfHwgYyA9PSAndycpCi0JCSAgICB7Ci0JCSAgICAgIHJlZ25vID0gbWlwczE2X3RvXzMyX3JlZ19tYXBbbGFzdHJlZ25vXTsKLQkJICAgICAgcyA9IHNfcmVzZXQ7Ci0JCSAgICAgIGFyZ3MrKzsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3dpdGNoIChjKQotCQl7Ci0JCWNhc2UgJ3gnOgotCQljYXNlICd5JzoKLQkJY2FzZSAneic6Ci0JCWNhc2UgJ3YnOgotCQljYXNlICd3JzoKLQkJY2FzZSAnWic6Ci0JCSAgcmVnbm8gPSBtaXBzMzJfdG9fMTZfcmVnX21hcFtyZWdub107Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnMCc6Ci0JCSAgaWYgKHJlZ25vICE9IDApCi0JCSAgICByZWdubyA9IElMTEVHQUxfUkVHOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1MnOgotCQkgIGlmIChyZWdubyAhPSBTUCkKLQkJICAgIHJlZ25vID0gSUxMRUdBTF9SRUc7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUic6Ci0JCSAgaWYgKHJlZ25vICE9IFJBKQotCQkgICAgcmVnbm8gPSBJTExFR0FMX1JFRzsKLQkJICBicmVhazsKLQotCQljYXNlICdYJzoKLQkJY2FzZSAnWSc6Ci0JCSAgaWYgKHJlZ25vID09IEFUICYmICEgbWlwc19vcHRzLm5vYXQpCi0JCSAgICBhc193YXJuIChfKCJ1c2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBpbnRlcm5hbEVycm9yICgpOwotCQl9Ci0KLQkgICAgICBpZiAocmVnbm8gPT0gSUxMRUdBTF9SRUcpCi0JCWJyZWFrOwotCi0JICAgICAgc3dpdGNoIChjKQotCQl7Ci0JCWNhc2UgJ3gnOgotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUlg7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3knOgotCQljYXNlICd3JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUlk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3onOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SWjsKLQkJICBicmVhazsKLQkJY2FzZSAnWic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX01PVkUzMlo7Ci0JCWNhc2UgJzAnOgotCQljYXNlICdTJzoKLQkJY2FzZSAnUic6Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1gnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SRUdSMzI7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1knOgotCQkgIHJlZ25vID0gKChyZWdubyAmIDcpIDw8IDIpIHwgKChyZWdubyAmIDB4MTgpID4+IDMpOwotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SRUczMlI7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgaW50ZXJuYWxFcnJvciAoKTsKLQkJfQotCi0JICAgICAgbGFzdHJlZ25vID0gcmVnbm87Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIkcGMiLCAzKSA9PSAwKQotCQl7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnPCc6Ci0JICAgIGNhc2UgJz4nOgotCSAgICBjYXNlICdbJzoKLQkgICAgY2FzZSAnXSc6Ci0JICAgIGNhc2UgJzQnOgotCSAgICBjYXNlICc1JzoKLQkgICAgY2FzZSAnSCc6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICBjYXNlICdEJzoKLQkgICAgY2FzZSAnaic6Ci0JICAgIGNhc2UgJzgnOgotCSAgICBjYXNlICdWJzoKLQkgICAgY2FzZSAnQyc6Ci0JICAgIGNhc2UgJ1UnOgotCSAgICBjYXNlICdrJzoKLQkgICAgY2FzZSAnSyc6Ci0JICAgICAgaWYgKHNbMF0gPT0gJyUnCi0JCSAgJiYgc3RybmNtcCAocyArIDEsICJncHJlbCgiLCBzaXplb2YgImdwcmVsKCIgLSAxKSA9PSAwKQotCQl7Ci0JCSAgLyogVGhpcyBpcyAlZ3ByZWwoU1lNQk9MKS4gIFdlIG5lZWQgdG8gcmVhZCBTWU1CT0wsCi0gICAgICAgICAgICAgICAgICAgICBhbmQgZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIHJlbG9jLiAgSWYgdGhlIHRleHQKLSAgICAgICAgICAgICAgICAgICAgIGluc2lkZSAlZ3ByZWwgaXMgbm90IGEgc3ltYm9sIG5hbWUgd2l0aCBhbgotICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgb2Zmc2V0LCB0aGVuIHdlIGdlbmVyYXRlIGEgbm9ybWFsIHJlbG9jCi0gICAgICAgICAgICAgICAgICAgICBhbmQgd2lsbCBwcm9iYWJseSBmYWlsIGxhdGVyLiAgKi8KLQkJICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMgKyBzaXplb2YgIiVncHJlbCIgLSAxKTsKLQkJICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX3N5bWJvbCkKLQkJICAgIHsKLQkJICAgICAgbWlwczE2X2V4dCA9IHRydWU7Ci0JCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19NSVBTMTZfR1BSRUw7Ci0JCSAgICAgIHMgPSBleHByX2VuZDsKLQkJICAgICAgaXAtPnVzZV9leHRlbmQgPSB0cnVlOwotCQkgICAgICBpcC0+ZXh0ZW5kID0gMDsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBKdXN0IHBpY2sgdXAgYSBub3JtYWwgZXhwcmVzc2lvbi4gICovCi0JCSAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkJfQotCi0JICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19yZWdpc3RlcikKLQkJewotCQkgIC8qIFdoYXQgd2UgdGhvdWdodCB3YXMgYW4gZXhwcmVzc2lvbiB0dXJuZWQgb3V0IHRvCi0gICAgICAgICAgICAgICAgICAgICBiZSBhIHJlZ2lzdGVyLiAgKi8KLQotCQkgIGlmIChzWzBdID09ICcoJyAmJiBhcmdzWzFdID09ICcoJykKLQkJICAgIHsKLQkJICAgICAgLyogSXQgbG9va3MgbGlrZSB0aGUgZXhwcmVzc2lvbiB3YXMgb21pdHRlZAotCQkJIGJlZm9yZSBhIHJlZ2lzdGVyIGluZGlyZWN0aW9uLCB3aGljaCBtZWFucwotCQkJIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgaW1wbGljaXRseSB6ZXJvLiAgV2UKLQkJCSBzdGlsbCBzZXQgdXAgaW1tX2V4cHIsIHNvIHRoYXQgd2UgaGFuZGxlCi0JCQkgZXhwbGljaXQgZXh0ZW5zaW9ucyBjb3JyZWN0bHkuICAqLwotCQkgICAgICBpbW1fZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkJICAgICAgaW1tX3JlbG9jID0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCArIGM7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCi0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gcmVsYXggdGhpcyBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaW1tX3JlbG9jID0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCArIGM7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3AnOgotCSAgICBjYXNlICdxJzoKLQkgICAgY2FzZSAnQSc6Ci0JICAgIGNhc2UgJ0InOgotCSAgICBjYXNlICdFJzoKLQkgICAgICAvKiBXZSB1c2Ugb2Zmc2V0X3JlbG9jIHJhdGhlciB0aGFuIGltbV9yZWxvYyBmb3IgdGhlIFBDCi0gICAgICAgICAgICAgICAgIHJlbGF0aXZlIG9wZXJhbmRzLiAgVGhpcyBsZXRzIG1hY3JvcyB3aXRoIGJvdGgKLSAgICAgICAgICAgICAgICAgaW1tZWRpYXRlIGFuZCBhZGRyZXNzIG9wZXJhbmRzIHdvcmsgY29ycmVjdGx5LiAgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCi0JICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19yZWdpc3RlcikKLQkJYnJlYWs7Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIHJlbGF4IHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIG9mZnNldF9yZWxvYyA9IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQgKyBjOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICc2JzoJCS8qIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gNjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbnZhbGlkIHZhbHVlIGZvciBgJXMnICglbHUpIiksCi0JCQkgICBpcC0+aW5zbl9tby0+bmFtZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmOwotCQl9Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCBNSVBTMTZPUF9TSF9JTU02OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYSc6CQkvKiAyNiBiaXQgYWRkcmVzcyAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19NSVBTMTZfSk1QOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSA8PD0gMTY7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnbCc6CQkvKiByZWdpc3RlciBsaXN0IGZvciBlbnRyeSBtYWNybyAqLwotCSAgICBjYXNlICdMJzoJCS8qIHJlZ2lzdGVyIGxpc3QgZm9yIGV4aXQgbWFjcm8gKi8KLQkgICAgICB7Ci0JCWludCBtYXNrOwotCi0JCWlmIChjID09ICdsJykKLQkJICBtYXNrID0gMDsKLQkJZWxzZQotCQkgIG1hc2sgPSA3IDw8IDM7Ci0JCXdoaWxlICgqcyAhPSAnXDAnKQotCQkgIHsKLQkJICAgIGludCBmcmVnLCByZWcxLCByZWcyOwotCi0JCSAgICB3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICcsJykKLQkJICAgICAgKytzOwotCQkgICAgaWYgKCpzICE9ICckJykKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJjYW4ndCBwYXJzZSByZWdpc3RlciBsaXN0IikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgICsrczsKLQkJICAgIGlmICgqcyAhPSAnZicpCi0JCSAgICAgIGZyZWcgPSAwOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlmcmVnID0gMTsKLQkJCSsrczsKLQkJICAgICAgfQotCQkgICAgcmVnMSA9IDA7Ci0JCSAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgICAgewotCQkJcmVnMSAqPSAxMDsKLQkJCXJlZzEgKz0gKnMgLSAnMCc7Ci0JCQkrK3M7Ci0JCSAgICAgIH0KLQkJICAgIGlmICgqcyA9PSAnICcpCi0JCSAgICAgICsrczsKLQkJICAgIGlmICgqcyAhPSAnLScpCi0JCSAgICAgIHJlZzIgPSByZWcxOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkrK3M7Ci0JCQlpZiAoKnMgIT0gJyQnKQotCQkJICBicmVhazsKLQkJCSsrczsKLQkJCWlmIChmcmVnKQotCQkJICB7Ci0JCQkgICAgaWYgKCpzID09ICdmJykKLQkJCSAgICAgICsrczsKLQkJCSAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkJYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QiKSk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCXJlZzIgPSAwOwotCQkJd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCQkgIHsKLQkJCSAgICByZWcyICo9IDEwOwotCQkJICAgIHJlZzIgKz0gKnMgLSAnMCc7Ci0JCQkgICAgKytzOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGlmIChmcmVnICYmIHJlZzEgPT0gMCAmJiByZWcyID09IDAgJiYgYyA9PSAnTCcpCi0JCSAgICAgIHsKLQkJCW1hc2sgJj0gfiAoNyA8PCAzKTsKLQkJCW1hc2sgfD0gNSA8PCAzOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChmcmVnICYmIHJlZzEgPT0gMCAmJiByZWcyID09IDEgJiYgYyA9PSAnTCcpCi0JCSAgICAgIHsKLQkJCW1hc2sgJj0gfiAoNyA8PCAzKTsKLQkJCW1hc2sgfD0gNiA8PCAzOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChyZWcxID09IDQgJiYgcmVnMiA+PSA0ICYmIHJlZzIgPD0gNyAmJiBjICE9ICdMJykKLQkJICAgICAgbWFzayB8PSAocmVnMiAtIDMpIDw8IDM7Ci0JCSAgICBlbHNlIGlmIChyZWcxID09IDE2ICYmIHJlZzIgPj0gMTYgJiYgcmVnMiA8PSAxNykKLQkJICAgICAgbWFzayB8PSAocmVnMiAtIDE1KSA8PCAxOwotCQkgICAgZWxzZSBpZiAocmVnMSA9PSAzMSAmJiByZWcyID09IDMxKQotCQkgICAgICBtYXNrIHw9IDE7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiaW52YWxpZCByZWdpc3RlciBsaXN0IikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCS8qIFRoZSBtYXNrIGlzIGZpbGxlZCBpbiBpbiB0aGUgb3Bjb2RlIHRhYmxlIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICBiZW5lZml0IG9mIHRoZSBkaXNhc3NlbWJsZXIuICBXZSByZW1vdmUgaXQgYmVmb3JlCi0gICAgICAgICAgICAgICAgICAgYXBwbHlpbmcgdGhlIGFjdHVhbCBtYXNrLiAgKi8KLQkJaXAtPmluc25fb3Bjb2RlICY9IH4gKCg3IDw8IDMpIDw8IE1JUFMxNk9QX1NIX0lNTTYpOwotCQlpcC0+aW5zbl9vcGNvZGUgfD0gbWFzayA8PCBNSVBTMTZPUF9TSF9JTU02OwotCSAgICAgIH0KLQkgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnZSc6CQkvKiBleHRlbmQgY29kZSAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAweDdmZikKLQkJewotCQkgIGFzX3dhcm4gKF8oIkludmFsaWQgdmFsdWUgZm9yIGAlcycgKCVsdSkiKSwKLQkJCSAgIGlwLT5pbnNuX21vLT5uYW1lLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlcik7Ci0JCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDB4N2ZmOwotCQl9Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlcjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaW50ZXJuYWxFcnJvciAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBBcmdzIGRvbid0IG1hdGNoLiAgKi8KLSAgICAgIGlmIChpbnNuICsgMSA8ICZtaXBzMTZfb3Bjb2Rlc1tiZmRfbWlwczE2X251bV9vcGNvZGVzXSAmJgotCSAgc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpID09IDApCi0JewotCSAgKytpbnNuOwotCSAgcyA9IGFyZ3NzdGFydDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaW5zbl9lcnJvciA9IF8oImlsbGVnYWwgb3BlcmFuZHMiKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gd2Uga25vdyBhYm91dCBhIG1pcHMxNiBpbW1lZGlhdGUKLSAgIGFyZ3VtZW50IHR5cGUuICAqLwotCi1zdHJ1Y3QgbWlwczE2X2ltbWVkX29wZXJhbmQKLXsKLSAgLyogVGhlIHR5cGUgY29kZSB1c2VkIGluIHRoZSBhcmd1bWVudCBzdHJpbmcgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIGludCB0eXBlOwotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHNob3J0IGZvcm0gb2YgdGhlIG9wY29kZS4gICovCi0gIGludCBuYml0czsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBleHRlbmRlZCBmb3JtIG9mIHRoZSBvcGNvZGUuICAqLwotICBpbnQgZXh0Yml0czsKLSAgLyogVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2hvcnQgZm9ybSBpcyBzaGlmdGVkIHdoZW4gaXQgaXMgdXNlZDsKLSAgICAgZm9yIGV4YW1wbGUsIHRoZSBzdyBpbnN0cnVjdGlvbiBoYXMgYSBzaGlmdCBjb3VudCBvZiAyLiAgKi8KLSAgaW50IHNoaWZ0OwotICAvKiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzaG9ydCBmb3JtIGlzIHNoaWZ0ZWQgd2hlbiBpdCBpcyBzdG9yZWQKLSAgICAgaW50byB0aGUgaW5zdHJ1Y3Rpb24gY29kZS4gICovCi0gIGludCBvcF9zaGlmdDsKLSAgLyogTm9uLXplcm8gaWYgdGhlIHNob3J0IGZvcm0gaXMgdW5zaWduZWQuICAqLwotICBpbnQgdW5zcDsKLSAgLyogTm9uLXplcm8gaWYgdGhlIGV4dGVuZGVkIGZvcm0gaXMgdW5zaWduZWQuICAqLwotICBpbnQgZXh0dTsKLSAgLyogTm9uLXplcm8gaWYgdGhlIHZhbHVlIGlzIFBDIHJlbGF0aXZlLiAgKi8KLSAgaW50IHBjcmVsOwotfTsKLQotLyogVGhlIG1pcHMxNiBpbW1lZGlhdGUgb3BlcmFuZCB0eXBlcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwczE2X2ltbWVkX29wZXJhbmQgbWlwczE2X2ltbWVkX29wZXJhbmRzW10gPQotewotICB7ICc8JywgIDMsICA1LCAwLCBNSVBTMTZPUF9TSF9SWiwgICAxLCAxLCAwIH0sCi0gIHsgJz4nLCAgMywgIDUsIDAsIE1JUFMxNk9QX1NIX1JYLCAgIDEsIDEsIDAgfSwKLSAgeyAnWycsICAzLCAgNiwgMCwgTUlQUzE2T1BfU0hfUlosICAgMSwgMSwgMCB9LAotICB7ICddJywgIDMsICA2LCAwLCBNSVBTMTZPUF9TSF9SWCwgICAxLCAxLCAwIH0sCi0gIHsgJzQnLCAgNCwgMTUsIDAsIE1JUFMxNk9QX1NIX0lNTTQsIDAsIDAsIDAgfSwKLSAgeyAnNScsICA1LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMCB9LAotICB7ICdIJywgIDUsIDE2LCAxLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAwIH0sCi0gIHsgJ1cnLCAgNSwgMTYsIDIsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDAgfSwKLSAgeyAnRCcsICA1LCAxNiwgMywgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMCB9LAotICB7ICdqJywgIDUsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU01LCAwLCAwLCAwIH0sCi0gIHsgJzgnLCAgOCwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDAsIDAgfSwKLSAgeyAnVicsICA4LCAxNiwgMiwgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMCwgMCB9LAotICB7ICdDJywgIDgsIDE2LCAzLCBNSVBTMTZPUF9TSF9JTU04LCAxLCAwLCAwIH0sCi0gIHsgJ1UnLCAgOCwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDEsIDAgfSwKLSAgeyAnaycsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMCwgMCwgMCB9LAotICB7ICdLJywgIDgsIDE2LCAzLCBNSVBTMTZPUF9TSF9JTU04LCAwLCAwLCAwIH0sCi0gIHsgJ3AnLCAgOCwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTgsIDAsIDAsIDEgfSwKLSAgeyAncScsIDExLCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMCwgMCwgMSB9LAotICB7ICdBJywgIDgsIDE2LCAyLCBNSVBTMTZPUF9TSF9JTU04LCAxLCAwLCAxIH0sCi0gIHsgJ0InLCAgNSwgMTYsIDMsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDEgfSwKLSAgeyAnRScsICA1LCAxNiwgMiwgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMSB9Ci19OwotCi0jZGVmaW5lIE1JUFMxNl9OVU1fSU1NRUQgXAotICAoc2l6ZW9mIG1pcHMxNl9pbW1lZF9vcGVyYW5kcyAvIHNpemVvZiBtaXBzMTZfaW1tZWRfb3BlcmFuZHNbMF0pCi0KLS8qIEhhbmRsZSBhIG1pcHMxNiBpbnN0cnVjdGlvbiB3aXRoIGFuIGltbWVkaWF0ZSB2YWx1ZS4gIFRoaXMgb3IncyB0aGUKLSAgIHNtYWxsIGltbWVkaWF0ZSB2YWx1ZSBpbnRvICpJTlNOLiAgSXQgc2V0cyAqVVNFX0VYVEVORCB0byBpbmRpY2F0ZQotICAgd2hldGhlciBhbiBleHRlbmRlZCB2YWx1ZSBpcyBuZWVkZWQ7IGlmIG9uZSBpcyBuZWVkZWQsIGl0IHNldHMKLSAgICpFWFRFTkQgdG8gdGhlIHZhbHVlLiAgVGhlIGFyZ3VtZW50IHR5cGUgaXMgVFlQRS4gIFRoZSB2YWx1ZSBpcyBWQUwuCi0gICBJZiBTTUFMTCBpcyB0cnVlLCBhbiB1bmV4dGVuZGVkIG9wY29kZSB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQuCi0gICBJZiBFWFQgaXMgdHJ1ZSwgYW4gZXh0ZW5kZWQgb3Bjb2RlIHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gIElmCi0gICBXQVJOIGlzIHRydWUsIHdhcm4gaWYgRVhUIGRvZXMgbm90IG1hdGNoIHJlYWxpdHkuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwczE2X2ltbWVkIChmaWxlLCBsaW5lLCB0eXBlLCB2YWwsIHdhcm4sIHNtYWxsLCBleHQsIGluc24sIHVzZV9leHRlbmQsCi0JICAgICAgZXh0ZW5kKQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgaW50IHR5cGU7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBib29sZWFuIHdhcm47Ci0gICAgIGJvb2xlYW4gc21hbGw7Ci0gICAgIGJvb2xlYW4gZXh0OwotICAgICB1bnNpZ25lZCBsb25nICppbnNuOwotICAgICBib29sZWFuICp1c2VfZXh0ZW5kOwotICAgICB1bnNpZ25lZCBzaG9ydCAqZXh0ZW5kOwotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWlwczE2X2ltbWVkX29wZXJhbmQgKm9wOwotICBpbnQgbWludGlueSwgbWF4dGlueTsKLSAgYm9vbGVhbiBuZWVkZXh0OwotCi0gIG9wID0gbWlwczE2X2ltbWVkX29wZXJhbmRzOwotICB3aGlsZSAob3AtPnR5cGUgIT0gdHlwZSkKLSAgICB7Ci0gICAgICArK29wOwotICAgICAgYXNzZXJ0IChvcCA8IG1pcHMxNl9pbW1lZF9vcGVyYW5kcyArIE1JUFMxNl9OVU1fSU1NRUQpOwotICAgIH0KLQotICBpZiAob3AtPnVuc3ApCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gJzwnIHx8IHR5cGUgPT0gJz4nIHx8IHR5cGUgPT0gJ1snIHx8IHR5cGUgPT0gJ10nKQotCXsKLQkgIG1pbnRpbnkgPSAxOwotCSAgbWF4dGlueSA9IDEgPDwgb3AtPm5iaXRzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW50aW55ID0gMDsKLQkgIG1heHRpbnkgPSAoMSA8PCBvcC0+bmJpdHMpIC0gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWludGlueSA9IC0gKDEgPDwgKG9wLT5uYml0cyAtIDEpKTsKLSAgICAgIG1heHRpbnkgPSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpIC0gMTsKLSAgICB9Ci0KLSAgLyogQnJhbmNoIG9mZnNldHMgaGF2ZSBhbiBpbXBsaWNpdCAwIGluIHRoZSBsb3dlc3QgYml0LiAgKi8KLSAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotICAgIHZhbCAvPSAyOwotCi0gIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMAotICAgICAgfHwgdmFsIDwgKG1pbnRpbnkgPDwgb3AtPnNoaWZ0KQotICAgICAgfHwgdmFsID4gKG1heHRpbnkgPDwgb3AtPnNoaWZ0KSkKLSAgICBuZWVkZXh0ID0gdHJ1ZTsKLSAgZWxzZQotICAgIG5lZWRleHQgPSBmYWxzZTsKLQotICBpZiAod2FybiAmJiBleHQgJiYgISBuZWVkZXh0KQotICAgIGFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIF8oImV4dGVuZGVkIG9wZXJhbmQgcmVxdWVzdGVkIGJ1dCBub3QgcmVxdWlyZWQiKSk7Ci0gIGlmIChzbWFsbCAmJiBuZWVkZXh0KQotICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygiaW52YWxpZCB1bmV4dGVuZGVkIG9wZXJhbmQgdmFsdWUiKSk7Ci0KLSAgaWYgKHNtYWxsIHx8ICghIGV4dCAmJiAhIG5lZWRleHQpKQotICAgIHsKLSAgICAgIGludCBpbnNudmFsOwotCi0gICAgICAqdXNlX2V4dGVuZCA9IGZhbHNlOwotICAgICAgaW5zbnZhbCA9ICgodmFsID4+IG9wLT5zaGlmdCkgJiAoKDEgPDwgb3AtPm5iaXRzKSAtIDEpKTsKLSAgICAgIGluc252YWwgPDw9IG9wLT5vcF9zaGlmdDsKLSAgICAgICppbnNuIHw9IGluc252YWw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBtaW5leHQsIG1heGV4dDsKLSAgICAgIGludCBleHR2YWw7Ci0KLSAgICAgIGlmIChvcC0+ZXh0dSkKLQl7Ci0JICBtaW5leHQgPSAwOwotCSAgbWF4ZXh0ID0gKDEgPDwgb3AtPmV4dGJpdHMpIC0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWluZXh0ID0gLSAoMSA8PCAob3AtPmV4dGJpdHMgLSAxKSk7Ci0JICBtYXhleHQgPSAoMSA8PCAob3AtPmV4dGJpdHMgLSAxKSkgLSAxOwotCX0KLSAgICAgIGlmICh2YWwgPCBtaW5leHQgfHwgdmFsID4gbWF4ZXh0KQotCWFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwKLQkJICAgICAgXygib3BlcmFuZCB2YWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIGluc3RydWN0aW9uIikpOwotCi0gICAgICAqdXNlX2V4dGVuZCA9IHRydWU7Ci0gICAgICBpZiAob3AtPmV4dGJpdHMgPT0gMTYpCi0JewotCSAgZXh0dmFsID0gKCh2YWwgPj4gMTEpICYgMHgxZikgfCAodmFsICYgMHg3ZTApOwotCSAgdmFsICY9IDB4MWY7Ci0JfQotICAgICAgZWxzZSBpZiAob3AtPmV4dGJpdHMgPT0gMTUpCi0JewotCSAgZXh0dmFsID0gKCh2YWwgPj4gMTEpICYgMHhmKSB8ICh2YWwgJiAweDdmMCk7Ci0JICB2YWwgJj0gMHhmOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHR2YWwgPSAoKHZhbCAmIDB4MWYpIDw8IDYpIHwgKHZhbCAmIDB4MjApOwotCSAgdmFsID0gMDsKLQl9Ci0KLSAgICAgICpleHRlbmQgPSAodW5zaWduZWQgc2hvcnQpIGV4dHZhbDsKLSAgICAgICppbnNuIHw9IHZhbDsKLSAgICB9Ci19Ci0MCi0jZGVmaW5lIExQICcoJwotI2RlZmluZSBSUCAnKScKLQotc3RhdGljIGludAotbXlfZ2V0U21hbGxFeHByZXNzaW9uIChlcCwgc3RyKQotICAgICBleHByZXNzaW9uUyAqZXA7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqc3A7Ci0gIGludCBjID0gMDsKLQotICBpZiAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0gIGlmICgqc3RyID09IExQCi0gICAgICB8fCAoKnN0ciA9PSAnJScgJiYKLQkgICgoc3RyWzFdID09ICdoJyAmJiBzdHJbMl0gPT0gJ2knKQotCSAgIHx8IChzdHJbMV0gPT0gJ0gnICYmIHN0clsyXSA9PSAnSScpCi0JICAgfHwgKHN0clsxXSA9PSAnbCcgJiYgc3RyWzJdID09ICdvJykpCi0JICAmJiBzdHJbM10gPT0gTFApKQotICAgIHsKLSAgICAgIGlmICgqc3RyID09IExQKQotCWMgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGMgPSBzdHJbMV07Ci0JICBzdHIgKz0gMzsKLQl9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBBIHNtYWxsIGV4cHJlc3Npb24gbWF5IGJlIGZvbGxvd2VkIGJ5IGEgYmFzZSByZWdpc3Rlci4KLSAgICAgICAqIFNjYW4gdG8gdGhlIGVuZCBvZiB0aGlzIG9wZXJhbmQsIGFuZCB0aGVuIGJhY2sgb3ZlciBhIHBvc3NpYmxlCi0gICAgICAgKiBiYXNlIHJlZ2lzdGVyLiAgVGhlbiBzY2FuIHRoZSBzbWFsbCBleHByZXNzaW9uIHVwIHRvIHRoYXQKLSAgICAgICAqIHBvaW50LiAgKEJhc2VkIG9uIGNvZGUgaW4gc3BhcmMuYy4uLikKLSAgICAgICAqLwotICAgICAgZm9yIChzcCA9IHN0cjsgKnNwICYmICpzcCAhPSAnLCc7IHNwKyspCi0JOwotICAgICAgaWYgKHNwIC0gNCA+PSBzdHIgJiYgc3BbLTFdID09IFJQKQotCXsKLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc3BbLTJdKSkKLQkgICAgewotCSAgICAgIGZvciAoc3AgLT0gMzsgc3AgPj0gc3RyICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqc3ApOyBzcC0tKQotCQk7Ci0JICAgICAgaWYgKCpzcCA9PSAnJCcgJiYgc3AgPiBzdHIgJiYgc3BbLTFdID09IExQKQotCQl7Ci0JCSAgc3AtLTsKLQkJICBnb3RvIGRvX2l0OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNwIC0gNSA+PSBzdHIKLQkJICAgJiYgc3BbLTVdID09IExQCi0JCSAgICYmIHNwWy00XSA9PSAnJCcKLQkJICAgJiYgKChzcFstM10gPT0gJ2YnICYmIHNwWy0yXSA9PSAncCcpCi0JCSAgICAgICB8fCAoc3BbLTNdID09ICdzJyAmJiBzcFstMl0gPT0gJ3AnKQotCQkgICAgICAgfHwgKHNwWy0zXSA9PSAnZycgJiYgc3BbLTJdID09ICdwJykKLQkJICAgICAgIHx8IChzcFstM10gPT0gJ2EnICYmIHNwWy0yXSA9PSAndCcpKSkKLQkgICAgewotCSAgICAgIHNwIC09IDU7Ci0JICAgIGRvX2l0OgotCSAgICAgIGlmIChzcCA9PSBzdHIpCi0JCXsKLQkJICAvKiBubyBleHByZXNzaW9uIG1lYW5zIHplcm8gb2Zmc2V0ICovCi0JCSAgaWYgKGMpCi0JCSAgICB7Ci0JCSAgICAgIC8qICV4eChyZWcpIGlzIGFuIGVycm9yICovCi0JCSAgICAgIGVwLT5YX29wID0gT19hYnNlbnQ7Ci0JCSAgICAgIGV4cHJfZW5kID0gc3RyIC0gMzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGVwLT5YX29wID0gT19jb25zdGFudDsKLQkJICAgICAgZXhwcl9lbmQgPSBzcDsKLQkJICAgIH0KLQkJICBlcC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLQkJICBlcC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCQkgIGVwLT5YX2FkZF9udW1iZXIgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKnNwID0gJ1wwJzsKLQkJICBteV9nZXRFeHByZXNzaW9uIChlcCwgc3RyKTsKLQkJICAqc3AgPSBMUDsKLQkJfQotCSAgICAgIHJldHVybiBjOwotCSAgICB9Ci0JfQotICAgIH0KLSAgbXlfZ2V0RXhwcmVzc2lvbiAoZXAsIHN0cik7Ci0gIHJldHVybiBjOwkJCS8qID0+ICVoaSBvciAlbG8gZW5jb3VudGVyZWQgKi8KLX0KLQotc3RhdGljIHZvaWQKLW15X2dldEV4cHJlc3Npb24gKGVwLCBzdHIpCi0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzYXZlX2luOwotCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgZXhwcmVzc2lvbiAoZXApOwotICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLQotICAvKiBJZiB3ZSBhcmUgaW4gbWlwczE2IG1vZGUsIGFuZCB0aGlzIGlzIGFuIGV4cHJlc3Npb24gYmFzZWQgb24gYC4nLAotICAgICB0aGVuIHdlIGJ1bXAgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYnkgMSBzaW5jZSB0aGF0IGlzIGhvdyBvdGhlcgotICAgICB0ZXh0IHN5bWJvbHMgYXJlIGhhbmRsZWQuICBXZSBkb24ndCBib3RoZXIgdG8gaGFuZGxlIGNvbXBsZXgKLSAgICAgZXhwcmVzc2lvbnMsIGp1c3QgYC4nIHBsdXMgb3IgbWludXMgYSBjb25zdGFudC4gICovCi0gIGlmIChtaXBzX29wdHMubWlwczE2Ci0gICAgICAmJiBlcC0+WF9vcCA9PSBPX3N5bWJvbAotICAgICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChlcC0+WF9hZGRfc3ltYm9sKSwgRkFLRV9MQUJFTF9OQU1FKSA9PSAwCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChlcC0+WF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnCi0gICAgICAmJiBzeW1ib2xfZ2V0X2ZyYWcgKGVwLT5YX2FkZF9zeW1ib2wpID09IGZyYWdfbm93Ci0gICAgICAmJiBzeW1ib2xfY29uc3RhbnRfcCAoZXAtPlhfYWRkX3N5bWJvbCkKLSAgICAgICYmIFNfR0VUX1ZBTFVFIChlcC0+WF9hZGRfc3ltYm9sKSA9PSBmcmFnX25vd19maXggKCkpCi0gICAgU19TRVRfVkFMVUUgKGVwLT5YX2FkZF9zeW1ib2wsIFNfR0VUX1ZBTFVFIChlcC0+WF9hZGRfc3ltYm9sKSArIDEpOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiAyOwotCi0gIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiTzo6Zzo6RzoiOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl9NSVBTMSAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7Im1pcHMwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSVBTMX0sCi0gIHsibWlwczEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMxfSwKLSNkZWZpbmUgT1BUSU9OX01JUFMyIChPUFRJT05fTURfQkFTRSArIDIpCi0gIHsibWlwczIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMyfSwKLSNkZWZpbmUgT1BUSU9OX01JUFMzIChPUFRJT05fTURfQkFTRSArIDMpCi0gIHsibWlwczMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMzfSwKLSNkZWZpbmUgT1BUSU9OX01JUFM0IChPUFRJT05fTURfQkFTRSArIDQpCi0gIHsibWlwczQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFM0fSwKLSNkZWZpbmUgT1BUSU9OX01DUFUgKE9QVElPTl9NRF9CQVNFICsgNSkKLSAgeyJtY3B1IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQ1BVfSwKLSNkZWZpbmUgT1BUSU9OX01FTUJFRERFRF9QSUMgKE9QVElPTl9NRF9CQVNFICsgNikKLSAgeyJtZW1iZWRkZWQtcGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NRU1CRURERURfUElDfSwKLSNkZWZpbmUgT1BUSU9OX1RSQVAgKE9QVElPTl9NRF9CQVNFICsgOSkKLSAgeyJ0cmFwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFQfSwKLSAgeyJuby1icmVhayIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBUH0sCi0jZGVmaW5lIE9QVElPTl9CUkVBSyAoT1BUSU9OX01EX0JBU0UgKyAxMCkKLSAgeyJicmVhayIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQlJFQUt9LAotICB7Im5vLXRyYXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JSRUFLfSwKLSNkZWZpbmUgT1BUSU9OX0VCIChPUFRJT05fTURfQkFTRSArIDExKQotICB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FQn0sCi0jZGVmaW5lIE9QVElPTl9FTCAoT1BUSU9OX01EX0JBU0UgKyAxMikKLSAgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUx9LAotI2RlZmluZSBPUFRJT05fTTQ2NTAgKE9QVElPTl9NRF9CQVNFICsgMTMpCi0gIHsibTQ2NTAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX000NjUwfSwKLSNkZWZpbmUgT1BUSU9OX05PX000NjUwIChPUFRJT05fTURfQkFTRSArIDE0KQotICB7Im5vLW00NjUwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NNDY1MH0sCi0jZGVmaW5lIE9QVElPTl9NNDAxMCAoT1BUSU9OX01EX0JBU0UgKyAxNSkKLSAgeyJtNDAxMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTQwMTB9LAotI2RlZmluZSBPUFRJT05fTk9fTTQwMTAgKE9QVElPTl9NRF9CQVNFICsgMTYpCi0gIHsibm8tbTQwMTAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX000MDEwfSwKLSNkZWZpbmUgT1BUSU9OX000MTAwIChPUFRJT05fTURfQkFTRSArIDE3KQotICB7Im00MTAwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NNDEwMH0sCi0jZGVmaW5lIE9QVElPTl9OT19NNDEwMCAoT1BUSU9OX01EX0JBU0UgKyAxOCkKLSAgeyJuby1tNDEwMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTTQxMDB9LAotI2RlZmluZSBPUFRJT05fTUlQUzE2IChPUFRJT05fTURfQkFTRSArIDIyKQotICB7Im1pcHMxNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzE2fSwKLSNkZWZpbmUgT1BUSU9OX05PX01JUFMxNiAoT1BUSU9OX01EX0JBU0UgKyAyMykKLSAgeyJuby1taXBzMTYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX01JUFMxNn0sCi0jZGVmaW5lIE9QVElPTl9NMzkwMCAoT1BUSU9OX01EX0JBU0UgKyAyNikKLSAgeyJtMzkwMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTM5MDB9LAotI2RlZmluZSBPUFRJT05fTk9fTTM5MDAgKE9QVElPTl9NRF9CQVNFICsgMjcpCi0gIHsibm8tbTM5MDAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX00zOTAwfSwKLQotCi0jZGVmaW5lIE9QVElPTl9NQUJJIChPUFRJT05fTURfQkFTRSArIDM4KQotICB7Im1hYmkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BQkl9LAotCi0jZGVmaW5lIE9QVElPTl9NNzAwMF9ISUxPX0ZJWCAoT1BUSU9OX01EX0JBU0UgKyAzOSkKLSAgeyJtZml4NzAwMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTcwMDBfSElMT19GSVh9LAotI2RlZmluZSBPUFRJT05fTk9fTTcwMDBfSElMT19GSVggKE9QVElPTl9NRF9CQVNFICsgNDApCi0gIHsibm8tZml4LTcwMDAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX003MDAwX0hJTE9fRklYfSwKLQotI2RlZmluZSBPUFRJT05fQ0FMTF9TSEFSRUQgKE9QVElPTl9NRF9CQVNFICsgNykKLSNkZWZpbmUgT1BUSU9OX05PTl9TSEFSRUQgKE9QVElPTl9NRF9CQVNFICsgOCkKLSNkZWZpbmUgT1BUSU9OX1hHT1QgKE9QVElPTl9NRF9CQVNFICsgMTkpCi0jZGVmaW5lIE9QVElPTl8zMiAoT1BUSU9OX01EX0JBU0UgKyAyMCkKLSNkZWZpbmUgT1BUSU9OXzY0IChPUFRJT05fTURfQkFTRSArIDIxKQotI2lmZGVmIE9CSl9FTEYKLSAgeyJLUElDIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gIHsieGdvdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fWEdPVH0sCi0gIHsiY2FsbF9zaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgeyJub25fc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgeyIzMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fMzJ9LAotICB7IjY0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl82NH0sCi0jZW5kaWYKLQotI2RlZmluZSBPUFRJT05fR1AzMiAoT1BUSU9OX01EX0JBU0UgKyA0MSkKLSNkZWZpbmUgT1BUSU9OX0dQNjQgKE9QVElPTl9NRF9CQVNFICsgNDIpCi0gIHsibWdwMzIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dQMzJ9LAotICB7Im1ncDY0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9HUDY0fSwKLQotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX1RSQVA6Ci0gICAgICBtaXBzX3RyYXAgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9CUkVBSzoKLSAgICAgIG1pcHNfdHJhcCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VCOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FTDoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTyc6Ci0gICAgICBpZiAoYXJnICYmIGFyZ1sxXSA9PSAnMCcpCi0JbWlwc19vcHRpbWl6ZSA9IDE7Ci0gICAgICBlbHNlCi0JbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2cnOgotICAgICAgaWYgKGFyZyA9PSBOVUxMKQotCW1pcHNfZGVidWcgPSAyOwotICAgICAgZWxzZQotCW1pcHNfZGVidWcgPSBhdG9pIChhcmcpOwotICAgICAgLyogV2hlbiB0aGUgTUlQUyBhc3NlbWJsZXIgc2VlcyAtZyBvciAtZzIsIGl0IGRvZXMgbm90IGRvCi0gICAgICAgICBvcHRpbWl6YXRpb25zIHdoaWNoIGxpbWl0IGZ1bGwgc3ltYm9saWMgZGVidWdnaW5nLiAgV2UgdGFrZQotICAgICAgICAgdGhhdCB0byBiZSBlcXVpdmFsZW50IHRvIC1PMC4gICovCi0gICAgICBpZiAobWlwc19kZWJ1ZyA9PSAyKQotCW1pcHNfb3B0aW1pemUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NSVBTMToKLSAgICAgIG1pcHNfb3B0cy5pc2EgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NSVBTMjoKLSAgICAgIG1pcHNfb3B0cy5pc2EgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NSVBTMzoKLSAgICAgIG1pcHNfb3B0cy5pc2EgPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NSVBTNDoKLSAgICAgIG1pcHNfb3B0cy5pc2EgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NQ1BVOgotICAgICAgewotCWNoYXIgKnA7Ci0KLQkvKiBJZGVudGlmeSB0aGUgcHJvY2Vzc29yIHR5cGUgKi8KLQlwID0gYXJnOwotCWlmIChzdHJjbXAgKHAsICJkZWZhdWx0IikgPT0gMAotCSAgICB8fCBzdHJjbXAgKHAsICJERUZBVUxUIikgPT0gMCkKLQkgIG1pcHNfY3B1ID0gLTE7Ci0JZWxzZQotCSAgewotCSAgICBpbnQgc3YgPSAwOwotCi0JICAgIC8qIFdlIG5lZWQgdG8gY29wZSB3aXRoIHRoZSB2YXJpb3VzICJ2ciIgcHJlZml4ZXMgZm9yIHRoZSA0MzAwCi0JICAgICAgIHByb2Nlc3Nvci4gICovCi0JICAgIGlmICgqcCA9PSAndicgfHwgKnAgPT0gJ1YnKQotCSAgICAgIHsKLQkJc3YgPSAxOwotCQlwKys7Ci0JICAgICAgfQotCi0JICAgIGlmICgqcCA9PSAncicgfHwgKnAgPT0gJ1InKQotCSAgICAgIHArKzsKLQotCSAgICBtaXBzX2NwdSA9IC0xOwotCSAgICBzd2l0Y2ggKCpwKQotCSAgICAgIHsKLQkgICAgICBjYXNlICcxJzoKLQkJaWYgKHN0cmNtcCAocCwgIjEwMDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiMTBrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiMTBLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDEwMDAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzInOgotCQlpZiAoc3RyY21wIChwLCAiMjAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjJrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiMksiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gMjAwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICczJzoKLQkJaWYgKHN0cmNtcCAocCwgIjMwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICIzayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjNLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDMwMDA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChwLCAiMzkwMCIpID09IDApCi0gICAgICAgICAgICAgICAgICBtaXBzX2NwdSA9IDM5MDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNCc6Ci0JCWlmIChzdHJjbXAgKHAsICI0MDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNGsiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI0SyIpID09IDApCi0JCSAgbWlwc19jcHUgPSA0MDAwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0MTAwIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSA0MTAwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0MTExIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSA0MTExOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0MzAwIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDQzMDA7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQ0MDAiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNDQwMDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDYwMCIpID09IDApCi0JCSAgbWlwc19jcHUgPSA0NjAwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0NjUwIikgPT0gMCkKLQkJICAgIG1pcHNfY3B1ID0gNDY1MDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDAxMCIpID09IDApCi0gICAgICAgICAgICAgICAgICBtaXBzX2NwdSA9IDQwMTA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNSc6Ci0JCWlmIChzdHJjbXAgKHAsICI1MDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNWsiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI1SyIpID09IDApCi0JCSAgbWlwc19jcHUgPSA1MDAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzYnOgotCQlpZiAoc3RyY21wIChwLCAiNjAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjZrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNksiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNjAwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICc4JzoKLQkJaWYgKHN0cmNtcCAocCwgIjgwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI4ayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjhLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDgwMDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnbyc6Ci0JCWlmIChzdHJjbXAgKHAsICJvcmlvbiIpID09IDApCi0JCSAgbWlwc19jcHUgPSA0NjAwOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKHN2Ci0JCSYmIChtaXBzX2NwdSAhPSA0MzAwCi0JCSAgICAmJiBtaXBzX2NwdSAhPSA0MTAwCi0JCSAgICAmJiBtaXBzX2NwdSAhPSA0MTExCi0JCSAgICAmJiBtaXBzX2NwdSAhPSA1MDAwKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiaWdub3JpbmcgaW52YWxpZCBsZWFkaW5nICd2JyBpbiAtbWNwdT0lcyBzd2l0Y2giKSwgYXJnKTsKLQkJcmV0dXJuIDA7Ci0JICAgICAgfQotCi0JICAgIGlmIChtaXBzX2NwdSA9PSAtMSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgLW1jcHU9JXMiKSwgYXJnKTsKLQkJcmV0dXJuIDA7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NNDY1MDoKLSAgICAgIG1pcHNfY3B1ID0gNDY1MDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fTTQ2NTA6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX000MDEwOgotICAgICAgbWlwc19jcHUgPSA0MDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19NNDAxMDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTTQxMDA6Ci0gICAgICBtaXBzX2NwdSA9IDQxMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PX000MTAwOgotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgT1BUSU9OX00zOTAwOgotICAgICAgbWlwc19jcHUgPSAzOTAwOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9QVElPTl9OT19NMzkwMDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUlQUzE2OgotICAgICAgbWlwc19vcHRzLm1pcHMxNiA9IDE7Ci0gICAgICBtaXBzX25vX3ByZXZfaW5zbiAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19NSVBTMTY6Ci0gICAgICBtaXBzX29wdHMubWlwczE2ID0gMDsKLSAgICAgIG1pcHNfbm9fcHJldl9pbnNuIChmYWxzZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01FTUJFRERFRF9QSUM6Ci0gICAgICBtaXBzX3BpYyA9IEVNQkVEREVEX1BJQzsKLSAgICAgIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUICYmIGdfc3dpdGNoX3NlZW4pCi0JewotCSAgYXNfYmFkIChfKCItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBlbWJlZGRlZCBQSUMgY29kZSIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGdfc3dpdGNoX3ZhbHVlID0gMHg3ZmZmZmZmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgRUxGIGNvZGUsIHdlIHBlcm1pdCAtS1BJQyBhbmQgLWNhbGxfc2hhcmVkIHRvCi0JIHNlbGVjdCBTVlI0X1BJQywgYW5kIC1ub25fc2hhcmVkIHRvIHNlbGVjdCBubyBQSUMuICBUaGlzIGlzCi0JIGludGVuZGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJcml4IDUuICAqLwotICAgIGNhc2UgT1BUSU9OX0NBTExfU0hBUkVEOgotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBhc19iYWQgKF8oIi1jYWxsX3NoYXJlZCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgRUxGIGZvcm1hdCIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIG1pcHNfcGljID0gU1ZSNF9QSUM7Ci0gICAgICBpZiAoZ19zd2l0Y2hfc2VlbiAmJiBnX3N3aXRjaF92YWx1ZSAhPSAwKQotCXsKLQkgIGFzX2JhZCAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBQSUMgY29kZSIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGdfc3dpdGNoX3ZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9OX1NIQVJFRDoKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgYXNfYmFkIChfKCItbm9uX3NoYXJlZCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgRUxGIGZvcm1hdCIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIG1pcHNfcGljID0gTk9fUElDOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoZSAteGdvdCBvcHRpb24gdGVsbHMgdGhlIGFzc2VtYmxlciB0byB1c2UgMzIgb2Zmc2V0cyB3aGVuCi0gICAgICAgICBhY2Nlc3NpbmcgdGhlIGdvdCBpbiBTVlI0X1BJQyBtb2RlLiAgSXQgaXMgZm9yIElyaXgKLSAgICAgICAgIGNvbXBhdGliaWxpdHkuICAqLwotICAgIGNhc2UgT1BUSU9OX1hHT1Q6Ci0gICAgICBtaXBzX2JpZ19nb3QgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgIGlmICghIFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCi0JewotCSAgYXNfYmFkIChfKCItRyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyB8fCBtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgYXNfYmFkIChfKCItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBTVlI0IG9yIGVtYmVkZGVkIFBJQyBjb2RlIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZQotCWdfc3dpdGNoX3ZhbHVlID0gYXRvaSAoYXJnKTsKLSAgICAgIGdfc3dpdGNoX3NlZW4gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoZSAtMzIgYW5kIC02NCBvcHRpb25zIHRlbGwgdGhlIGFzc2VtYmxlciB0byBvdXRwdXQgdGhlIDMyCi0gICAgICAgICBiaXQgb3IgdGhlIDY0IGJpdCBNSVBTIEVMRiBmb3JtYXQuICAqLwotICAgIGNhc2UgT1BUSU9OXzMyOgotICAgICAgbWlwc182NCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OXzY0OgotICAgICAgewotCWNvbnN0IGNoYXIgKipsaXN0LCAqKmw7Ci0KLQlsaXN0ID0gYmZkX3RhcmdldF9saXN0ICgpOwotCWZvciAobCA9IGxpc3Q7ICpsICE9IE5VTEw7IGwrKykKLQkgIGlmIChzdHJjbXAgKCpsLCAiZWxmNjQtYmlnbWlwcyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKCpsLCAiZWxmNjQtbGl0dGxlbWlwcyIpID09IDApCi0JICAgIGJyZWFrOwotCWlmICgqbCA9PSBOVUxMKQotCSAgYXNfZmF0YWwgKF8oIk5vIGNvbXBpbGVkIGluIHN1cHBvcnQgZm9yIDY0IGJpdCBvYmplY3QgZmlsZSBmb3JtYXQiKSk7Ci0JZnJlZSAobGlzdCk7Ci0JbWlwc182NCA9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0dQMzI6Ci0gICAgICBtaXBzX2dwMzIgPSAxOwotICAgICAgbWlwc182NCA9IDA7Ci0KLSAgICAgIC8qIFdlIGRlbGliZXJhdGVseSBkb24ndCBhbGxvdyAiLWdwMzIiIHRvIHNldCB0aGUgTUlQU18zMkJJVE1PREUKLQkgZmxhZyBpbiBvYmplY3QgZmlsZXMgYmVjYXVzZSB0byBkbyBzbyB3b3VsZCBtYWtlIGl0Ci0JIGltcG9zc2libGUgdG8gbGluayB3aXRoIGxpYnJhcmllcyBjb21waWxlZCB3aXRob3V0ICItZ3AzMiIuCi0JIFRoaXMgaXMgdW5uZWNlc3NhcmlseSByZXN0cmljdGl2ZS4gIAotCi0JIFdlIGNvdWxkIHNvbHZlIHRoaXMgcHJvYmxlbSBieSBhZGRpbmcgIi1ncDMyIiBtdWx0aWxpYnMgdG8KLQkgZ2NjLCBidXQgdG8gc2V0IHRoaXMgZmxhZyBiZWZvcmUgZ2NjIGlzIGJ1aWx0IHdpdGggc3VjaAotCSBtdWx0aWxpYnMgd2lsbCBicmVhayB0b28gbWFueSBzeXN0ZW1zLiAqLwotCi0vKiAgICBtaXBzXzMyYml0bW9kZSA9IDE7ICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0dQNjQ6Ci0gICAgICBtaXBzX2dwMzIgPSAwOwotICAgICAgbWlwc182NCA9IDE7Ci0vKiAgICBtaXBzXzMyYml0bW9kZSA9IDA7ICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01BQkk6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsIjMyIikgPT0gMAotCSAgfHwgc3RyY21wIChhcmcsIm4zMiIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCI2NCIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCJvNjQiKSA9PSAwCi0JICB8fCBzdHJjbXAgKGFyZywiZWFiaSIpID09IDApCi0JbWlwc19hYmlfc3RyaW5nID0gYXJnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NNzAwMF9ISUxPX0ZJWDoKLSAgICAgIG1pcHNfNzAwMF9oaWxvX2ZpeCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PX003MDAwX0hJTE9fRklYOgotICAgICAgbWlwc183MDAwX2hpbG9fZml4ID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNob3cgKHN0cmVhbSwgc3RyaW5nLCBjb2xfcCwgZmlyc3RfcCkKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGludCAqY29sX3A7Ci0gICAgIGludCAqZmlyc3RfcDsKLXsKLSAgaWYgKCpmaXJzdF9wKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0cmVhbSwgIiUyNHMiLCAiIik7Ci0gICAgICAqY29sX3AgPSAyNDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdHJlYW0sICIsICIpOwotICAgICAgKmNvbF9wICs9IDI7Ci0gICAgfQotCi0gIGlmICgqY29sX3AgKyBzdHJsZW4gKHN0cmluZykgPiA3MikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdHJlYW0sICJcbiUyNHMiLCAiIik7Ci0gICAgICAqY29sX3AgPSAyNDsKLSAgICB9Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCAiJXMiLCBzdHJpbmcpOwotICAqY29sX3AgKz0gc3RybGVuIChzdHJpbmcpOwotCi0gICpmaXJzdF9wID0gMDsKLX0KLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgaW50IGNvbHVtbiwgZmlyc3Q7Ci0KLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLU1JUFMgb3B0aW9uczpcblwKLS1tZW1iZWRkZWQtcGljCQlnZW5lcmF0ZSBlbWJlZGRlZCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCi0tRUIJCQlnZW5lcmF0ZSBiaWcgZW5kaWFuIG91dHB1dFxuXAotLUVMCQkJZ2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBvdXRwdXRcblwKLS1nLCAtZzIJCQlkbyBub3QgcmVtb3ZlIHVuZWVkZWQgTk9QcyBvciBzd2FwIGJyYW5jaGVzXG5cCi0tRyBOVU0JCQlhbGxvdyByZWZlcmVuY2luZyBvYmplY3RzIHVwIHRvIE5VTSBieXRlc1xuXAotCQkJaW1wbGljaXRseSB3aXRoIHRoZSBncCByZWdpc3RlciBbZGVmYXVsdCA4XVxuIikpOwotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLW1pcHMxCQkJZ2VuZXJhdGUgTUlQUyBJU0EgSSBpbnN0cnVjdGlvbnNcblwKLS1taXBzMgkJCWdlbmVyYXRlIE1JUFMgSVNBIElJIGluc3RydWN0aW9uc1xuXAotLW1pcHMzCQkJZ2VuZXJhdGUgTUlQUyBJU0EgSUlJIGluc3RydWN0aW9uc1xuXAotLW1pcHM0CQkJZ2VuZXJhdGUgTUlQUyBJU0EgSVYgaW5zdHJ1Y3Rpb25zXG5cCi0tbWNwdT1DUFUJCWdlbmVyYXRlIGNvZGUgZm9yIENQVSwgd2hlcmUgQ1BVIGlzIG9uZSBvZjpcbiIpKTsKLQotICBmaXJzdCA9IDE7Ci0KLSAgc2hvdyAoc3RyZWFtLCAiMjAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjMwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICIzOTAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQwMTAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MTAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDExMSIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQzMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0NDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDYwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQ2NTAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI1MDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNjAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjgwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICIxMDAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIGZwdXRjICgnXG4nLCBzdHJlYW0pOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLW1DUFUJCQllcXVpdmFsZW50IHRvIC1tY3B1PUNQVS5cblwKLS1uby1tQ1BVCQlkb24ndCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIENQVS5cblwKLQkJCUZvciAtbUNQVSBhbmQgLW5vLW1DUFUsIENQVSBtdXN0IGJlIG9uZSBvZjpcbiIpKTsKLQotICBmaXJzdCA9IDE7Ci0KLSAgc2hvdyAoc3RyZWFtLCAiMzkwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQwMTAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MTAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDY1MCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIGZwdXRjICgnXG4nLCBzdHJlYW0pOwotCi0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tbWlwczE2CQkJZ2VuZXJhdGUgbWlwczE2IGluc3RydWN0aW9uc1xuXAotLW5vLW1pcHMxNgkJZG8gbm90IGdlbmVyYXRlIG1pcHMxNiBpbnN0cnVjdGlvbnNcbiIpKTsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1PMAkJCXJlbW92ZSB1bm5lZWRlZCBOT1BzLCBkbyBub3Qgc3dhcCBicmFuY2hlc1xuXAotLU8JCQlyZW1vdmUgdW5uZWVkZWQgTk9QcyBhbmQgc3dhcCBicmFuY2hlc1xuXAotLS10cmFwLCAtLW5vLWJyZWFrCXRyYXAgZXhjZXB0aW9uIG9uIGRpdiBieSAwIGFuZCBtdWx0IG92ZXJmbG93XG5cCi0tLWJyZWFrLCAtLW5vLXRyYXAJYnJlYWsgZXhjZXB0aW9uIG9uIGRpdiBieSAwIGFuZCBtdWx0IG92ZXJmbG93XG4iKSk7Ci0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLUtQSUMsIC1jYWxsX3NoYXJlZAlnZW5lcmF0ZSBTVlI0IHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcblwKLS1ub25fc2hhcmVkCQlkbyBub3QgZ2VuZXJhdGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuXAotLXhnb3QJCQlhc3N1bWUgYSAzMiBiaXQgR09UXG5cCi0tMzIJCQljcmVhdGUgMzIgYml0IG9iamVjdCBmaWxlIChkZWZhdWx0KVxuXAotLTY0CQkJY3JlYXRlIDY0IGJpdCBvYmplY3QgZmlsZVxuIikpOwotI2VuZGlmCi19Ci0MCi12b2lkCi1taXBzX2luaXRfYWZ0ZXJfYXJncyAoKQotewotICAvKiBpbml0aWFsaXplIG9wY29kZXMgKi8KLSAgYmZkX21pcHNfbnVtX29wY29kZXMgPSBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzOwotICBtaXBzX29wY29kZXMgPSAoc3RydWN0IG1pcHNfb3Bjb2RlKikgbWlwc19idWlsdGluX29wY29kZXM7Ci19Ci0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0gICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAhIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgbWFrZXMgYSBicmFuY2ggdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCBiZSBhIGJyYW5jaCB0byB0aGUKLQkgY3VycmVudCBsb2NhdGlvbi4gICovCi0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgLyogcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWxheSBzbG90ICovCi0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSBlbWl0X2V4cHIgdmlhIFRDX0NPTlNfRklYX05FVyB3aGVuIGNyZWF0aW5nIGEKLSAgIHJlbG9jIGZvciBhIGNvbnMuICBXZSBjb3VsZCB1c2UgdGhlIGRlZmluaXRpb24gdGhlcmUsIGV4Y2VwdCB0aGF0Ci0gICB3ZSB3YW50IHRvIGhhbmRsZSA2NCBiaXQgcmVsb2NzIHNwZWNpYWxseS4gICovCi0KLXZvaWQKLWNvbnNfZml4X25ld19taXBzIChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0jaWZuZGVmIE9CSl9FTEYKLSAgLyogSWYgd2UgYXJlIGFzc2VtYmxpbmcgaW4gMzIgYml0IG1vZGUsIHR1cm4gYW4gOCBieXRlIHJlbG9jIGludG8gYQotICAgICA0IGJ5dGUgcmVsb2MuICAqLwotICBpZiAobmJ5dGVzID09IDggJiYgISBtaXBzXzY0KQotICAgIHsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQl3aGVyZSArPSA0OwotICAgICAgbmJ5dGVzID0gNDsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobmJ5dGVzICE9IDIgJiYgbmJ5dGVzICE9IDQgJiYgbmJ5dGVzICE9IDgpCi0gICAgYXNfYmFkIChfKCJVbnN1cHBvcnRlZCByZWxvYyBzaXplICVkIiksIG5ieXRlcyk7Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCB3aGVyZSwgKGludCkgbmJ5dGVzLCBleHAsIDAsCi0JICAgICAgIChuYnl0ZXMgPT0gMgotCQk/IEJGRF9SRUxPQ18xNgotCQk6IChuYnl0ZXMgPT0gNCA/IEJGRF9SRUxPQ18zMiA6IEJGRF9SRUxPQ182NCkpKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBzeW1ib2wgdGFibGUgaXMgcHJvY2Vzc2VkLiAgSW4gb3JkZXIgdG8KLSAgIHdvcmsgd2l0aCBnY2Mgd2hlbiB1c2luZyBtaXBzLXRmaWxlLCB3ZSBtdXN0IGtlZXAgYWxsIGxvY2FsIGxhYmVscy4KLSAgIEhvd2V2ZXIsIGluIG90aGVyIGNhc2VzLCB3ZSB3YW50IHRvIGRpc2NhcmQgdGhlbS4gIElmIHdlIHdlcmUKLSAgIGNhbGxlZCB3aXRoIC1nLCBidXQgd2UgZGlkbid0IHNlZSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpdCBtYXkKLSAgIG1lYW4gdGhhdCBnY2MgaXMgc211Z2dsaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0aHJvdWdoIHRvCi0gICBtaXBzLXRmaWxlLCBpbiB3aGljaCBjYXNlIHdlIG11c3QgZ2VuZXJhdGUgYWxsIGxvY2FsIGxhYmVscy4gICovCi0KLXZvaWQKLW1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCkKLXsKLSNpZm5kZWYgTk9fRUNPRkZfREVCVUdHSU5HCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcKLSAgICAgICYmIG1pcHNfZGVidWcgIT0gMAotICAgICAgJiYgISBlY29mZl9kZWJ1Z2dpbmdfc2VlbikKLSAgICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKLSNlbmRpZgotfQotCi0vKiBTb3J0IGFueSB1bm1hdGNoZWQgSEkxNl9TIHJlbG9jcyBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZQotICAgdGhlIGNvcnJlc3BvbmRpbmcgTE8gcmVsb2MuICBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgbWRfYXBwbHlfZml4IGFuZAotICAgdGNfZ2VuX3JlbG9jLiAgVW5tYXRjaGVkIEhJMTZfUyByZWxvY3MgY2FuIG9ubHkgYmUgZ2VuZXJhdGVkIGJ5Ci0gICBleHBsaWNpdCB1c2Ugb2YgdGhlICVoaSBtb2RpZmllci4gICovCi0KLXZvaWQKLW1pcHNfZnJvYl9maWxlICgpCi17Ci0gIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICpsOwotCi0gIGZvciAobCA9IG1pcHNfaGlfZml4dXBfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgICAgIGludCBwYXNzOwotCi0gICAgICBhc3NlcnQgKGwtPmZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfSEkxNl9TKTsKLQotICAgICAgLyogQ2hlY2sgcXVpY2tseSB3aGV0aGVyIHRoZSBuZXh0IGZpeHVwIGhhcHBlbnMgdG8gYmUgYSBtYXRjaGluZwotICAgICAgICAgJWxvLiAgKi8KLSAgICAgIGlmIChsLT5maXhwLT5meF9uZXh0ICE9IE5VTEwKLQkgICYmIGwtPmZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTE8xNgotCSAgJiYgbC0+Zml4cC0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+ZnhfYWRkc3kKLQkgICYmIGwtPmZpeHAtPmZ4X29mZnNldCA9PSBsLT5maXhwLT5meF9uZXh0LT5meF9vZmZzZXQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgZml4dXBzIGZvciB0aGlzIHNlZ21lbnQgZm9yIGEgbWF0Y2hpbmcgJWxvLgotICAgICAgICAgV2hlbiB3ZSBmaW5kIG9uZSwgbW92ZSB0aGUgJWhpIGp1c3QgaW4gZnJvbnQgb2YgaXQuICBXZSBkbwotICAgICAgICAgdGhpcyBpbiB0d28gcGFzc2VzLiAgSW4gdGhlIGZpcnN0IHBhc3MsIHdlIHRyeSB0byBmaW5kIGEKLSAgICAgICAgIHVuaXF1ZSAlbG8uICBJbiB0aGUgc2Vjb25kIHBhc3MsIHdlIHBlcm1pdCBtdWx0aXBsZSAlaGkKLSAgICAgICAgIHJlbG9jcyBmb3IgYSBzaW5nbGUgJWxvICh0aGlzIGlzIGEgR05VIGV4dGVuc2lvbikuICAqLwotICAgICAgc2VnaW5mbyA9IHNlZ19pbmZvIChsLT5zZWcpOwotICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykKLQl7Ci0JICBmaXhTICpmLCAqcHJldjsKLQotCSAgcHJldiA9IE5VTEw7Ci0JICBmb3IgKGYgPSBzZWdpbmZvLT5maXhfcm9vdDsgZiAhPSBOVUxMOyBmID0gZi0+ZnhfbmV4dCkKLQkgICAgewotCSAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhICVsbyBmaXh1cCB3aGljaCBtYXRjaGVzIGwtPmZpeHAuICAqLwotCSAgICAgIGlmIChmLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0xPMTYKLQkJICAmJiBmLT5meF9hZGRzeSA9PSBsLT5maXhwLT5meF9hZGRzeQotCQkgICYmIGYtPmZ4X29mZnNldCA9PSBsLT5maXhwLT5meF9vZmZzZXQKLQkJICAmJiAocGFzcyA9PSAxCi0JCSAgICAgIHx8IHByZXYgPT0gTlVMTAotCQkgICAgICB8fCBwcmV2LT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfUwotCQkgICAgICB8fCBwcmV2LT5meF9hZGRzeSAhPSBmLT5meF9hZGRzeQotCQkgICAgICB8fCBwcmV2LT5meF9vZmZzZXQgIT0gIGYtPmZ4X29mZnNldCkpCi0JCXsKLQkJICBmaXhTICoqcGY7Ci0KLQkJICAvKiBNb3ZlIGwtPmZpeHAgYmVmb3JlIGYuICAqLwotCQkgIGZvciAocGYgPSAmc2VnaW5mby0+Zml4X3Jvb3Q7Ci0JCSAgICAgICAqcGYgIT0gbC0+Zml4cDsKLQkJICAgICAgIHBmID0gJigqcGYpLT5meF9uZXh0KQotCQkgICAgYXNzZXJ0ICgqcGYgIT0gTlVMTCk7Ci0KLQkJICAqcGYgPSBsLT5maXhwLT5meF9uZXh0OwotCi0JCSAgbC0+Zml4cC0+ZnhfbmV4dCA9IGY7Ci0JCSAgaWYgKHByZXYgPT0gTlVMTCkKLQkJICAgIHNlZ2luZm8tPmZpeF9yb290ID0gbC0+Zml4cDsKLQkJICBlbHNlCi0JCSAgICBwcmV2LT5meF9uZXh0ID0gbC0+Zml4cDsKLQotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBwcmV2ID0gZjsKLQkgICAgfQotCi0JICBpZiAoZiAhPSBOVUxMKQotCSAgICBicmVhazsKLQotI2lmIDAgLyogR0NDIGNvZGUgbW90aW9uIHBsdXMgaW5jb21wbGV0ZSBkZWFkIGNvZGUgZWxpbWluYXRpb24KLQkgY2FuIGxlYXZlIGEgJWhpIHdpdGhvdXQgYSAlbG8uICAqLwotCSAgaWYgKHBhc3MgPT0gMSkKLQkgICAgYXNfd2Fybl93aGVyZSAobC0+Zml4cC0+ZnhfZmlsZSwgbC0+Zml4cC0+ZnhfbGluZSwKLQkJCSAgIF8oIlVubWF0Y2hlZCAlJWhpIHJlbG9jIikpOwotI2VuZGlmCi0JfQotICAgIH0KLX0KLQotLyogV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlIHdlIG5lZWQgdG8gdXNlIGEgc3BlY2lhbAotICAgcmVsb2NhdGlvbiB0byByZXByZXNlbnQgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlIC50ZXh0Ci0gICBzZWN0aW9uIChzd2l0Y2ggdGFibGVzIHVzZSBhIGRpZmZlcmVuY2Ugb2YgdGhpcyBzb3J0KS4gIFNlZQotICAgaW5jbHVkZS9jb2ZmL21pcHMuaCBmb3IgZGV0YWlscy4gIFRoaXMgbWFjcm8gY2hlY2tzIHdoZXRoZXIgdGhpcwotICAgZml4dXAgcmVxdWlyZXMgdGhlIHNwZWNpYWwgcmVsb2MuICAqLwotI2RlZmluZSBTV0lUQ0hfVEFCTEUoZml4cCkgXAotICAoKGZpeHApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyIFwKLSAgICYmIE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91ciBcCi0gICAmJiAoZml4cCktPmZ4X2FkZHN5ICE9IE5VTEwgXAotICAgJiYgKGZpeHApLT5meF9zdWJzeSAhPSBOVUxMIFwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXhwKS0+ZnhfYWRkc3kpID09IHRleHRfc2VjdGlvbiBcCi0gICAmJiBTX0dFVF9TRUdNRU5UICgoZml4cCktPmZ4X3N1YnN5KSA9PSB0ZXh0X3NlY3Rpb24pCi0KLS8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSB3ZSBtdXN0IGtlZXAgYWxsIFBDIHJlbGF0aXZlCi0gICByZWxvY2F0aW9ucywgaW4gY2FzZSB0aGUgbGlua2VyIGhhcyB0byByZWxheCBhIGNhbGwuICBXZSBhbHNvIG5lZWQKLSAgIHRvIGtlZXAgcmVsb2NhdGlvbnMgZm9yIHN3aXRjaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotLypBUkdTVVNFRCovCi1pbnQKLW1pcHNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAobWlwc19waWMgPT0gRU1CRURERURfUElDCi0JICAmJiAoZml4cC0+ZnhfcGNyZWwKLQkgICAgICB8fCBTV0lUQ0hfVEFCTEUgKGZpeHApCi0JICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MKLQkgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpKTsKLX0KLQotLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsdWVQKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHVlUDsKLXsKLSAgdW5zaWduZWQgY2hhciAqYnVmOwotICBsb25nIGluc24sIHZhbHVlOwotCi0gIGFzc2VydCAoZml4UC0+Znhfc2l6ZSA9PSA0Ci0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2Ci0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzY0Ci0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0JICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSk7Ci0KLSAgdmFsdWUgPSAqdmFsdWVQOwotCi0gIC8qIElmIHdlIGFyZW4ndCBhZGp1c3RpbmcgdGhpcyBmaXh1cCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uCi0gICAgIHN5bWJvbCwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMICYmIE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgaWYgKFNfR0VUX09USEVSIChmaXhQLT5meF9hZGRzeSkgPT0gU1RPX01JUFMxNiAKLSAgICAgICAgfHwgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICAgfHwgKHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgICAgICAgJiYgKCgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICAgICAgICAgICAgICAgICYgU0VDX0xJTktfT05DRSkgIT0gMCkKLSAgICAgICAgICAgICAgICB8fCAhc3RybmNtcCAoc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmdudS5saW5rb25jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIi5nbnUubGlua29uY2UiKSAtIDEpKSkpCi0KLSAgICAgIHsKLSAgICAgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgICAgaWYgKHZhbHVlICE9IDAgJiYgISBmaXhQLT5meF9wY3JlbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJbiB0aGlzIGNhc2UsIHRoZSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHJvdXRpbmUgd2lsbAotICAgICAgICAgICAgICAgaW5jb3JyZWN0bHkgYWRkIHRoZSBzeW1ib2wgdmFsdWUgYmFjayBpbi4gIFdlIGp1c3Qgd2FudAotICAgICAgICAgICAgICAgdGhlIGFkZGVuZCB0byBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLiAgCi0JICAgICAgIEZJWE1FOiBJZiB0aGlzIG1ha2VzIFZBTFVFIHplcm8sIHdlJ3JlIHRvYXN0LiAgKi8KLSAgICAgICAgICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCB1c2luZyB0cmlhbCBhbmQgZXJyb3IgYW5kIHNvIGlzCi0JIGZyYWdpbGUgYW5kIG5vdCB0cnVzdHdvcnRoeS4gIElmIHlvdSBjaGFuZ2UgaXQsIHlvdSBzaG91bGQKLQkgcmVydW4gdGhlIGVsZi1yZWwsIGVsZi1yZWwyLCBhbmQgZW1waWMgdGVzdGNhc2VzIGFuZCBlbnN1cmUKLQkgdGhleSBzdGlsbCBwYXNzLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCB8fCBmaXhQLT5meF9zdWJzeSAhPSBOVUxMKQotCXsKLQkgIHZhbHVlICs9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKLQotCSAgLyogQkZEJ3MgUkVMIGhhbmRsaW5nLCBmb3IgTUlQUywgaXMgX3ZlcnlfIHdlaXJkLgotCSAgICAgVGhpcyBnaXZlcyB0aGUgcmlnaHQgcmVzdWx0cywgYnV0IGl0IGNhbid0IHBvc3NpYmx5Ci0JICAgICBiZSB0aGUgd2F5IHRoaW5ncyBhcmUgc3VwcG9zZWQgdG8gd29yay4gICovCi0JICBpZiAoZml4UC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18xNl9QQ1JFTF9TMgotCSAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgdmFsdWUgKz0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIHRjX2dlbl9yZWxvYyAqLwotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMICYmICEgZml4UC0+ZnhfcGNyZWwpCi0gICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfSk1QOgotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMOgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTDE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR09UMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HUFJFTDMyOgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR09UX0hJMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUw6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJJbnZhbGlkIFBDIHJlbGF0aXZlIHJlbG9jIikpOwotICAgICAgLyogTm90aGluZyBuZWVkZWQgdG8gZG8uIFRoZSB2YWx1ZSBjb21lcyBmcm9tIHRoZSByZWxvYyBlbnRyeSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfSk1QOgotICAgICAgLyogV2UgY3VycmVudGx5IGFsd2F5cyBnZW5lcmF0ZSBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wsIHdoaWNoCi0gICAgICAgICBtZWFucyB0aGF0IHdlIGRvbid0IHdhbnQgYW4gYWRkZW5kIGV2ZW4gaWYgdGhlIHN5bWJvbCBpcwotICAgICAgICAgZGVmaW5lZC4gICovCi0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0gICAgICAvKiBUaGUgYWRkZW5kIGZvciB0aGlzIGlzIHRyaWNreSBpZiBpdCBpcyBpbnRlcm5hbCwgc28gd2UganVzdAotCSBkbyBldmVyeXRoaW5nIGhlcmUgcmF0aGVyIHRoYW4gaW4gYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyIAotCSAgJiYgIWZpeFAtPmZ4X2RvbmUKLQkgICYmIHZhbHVlICE9IDApCi0JYnJlYWs7Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kKLQkgICYmIChzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQl7Ci0JICAvKiBGb3IgYW4gZXh0ZXJuYWwgc3ltYm9sIGFkanVzdCBieSB0aGUgYWRkcmVzcyB0byBtYWtlIGl0Ci0JICAgICBwY3JlbF9vZmZzZXQuICBXZSB1c2UgdGhlIGFkZHJlc3Mgb2YgdGhlIFJFTExPIHJlbG9jCi0JICAgICB3aGljaCBmb2xsb3dzIHRoaXMgb25lLiAgKi8KLQkgIHZhbHVlICs9IChmaXhQLT5meF9uZXh0LT5meF9mcmFnLT5mcl9hZGRyZXNzCi0JCSAgICArIGZpeFAtPmZ4X25leHQtPmZ4X3doZXJlKTsKLQl9Ci0gICAgICBpZiAodmFsdWUgJiAweDgwMDApCi0JdmFsdWUgKz0gMHgxMDAwMDsKLSAgICAgIHZhbHVlID4+PSAxNjsKLSAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlidWYgKz0gMjsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0xPMTY6Ci0gICAgICAvKiBUaGUgYWRkZW5kIGZvciB0aGlzIGlzIHRyaWNreSBpZiBpdCBpcyBpbnRlcm5hbCwgc28gd2UganVzdAotCSBkbyBldmVyeXRoaW5nIGhlcmUgcmF0aGVyIHRoYW4gaW4gYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyIAotCSAgJiYgIWZpeFAtPmZ4X2RvbmUKLQkgICYmIHZhbHVlICE9IDApCi0JYnJlYWs7Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kKLQkgICYmIChzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQl2YWx1ZSArPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYnVmICs9IDI7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICAgIC8qIFRoaXMgaXMgaGFuZGxlZCBsaWtlIEJGRF9SRUxPQ18zMiwgYnV0IHdlIG91dHB1dCBhIHNpZ24KLSAgICAgICAgIGV4dGVuZGVkIHZhbHVlIGlmIHdlIGFyZSBvbmx5IDMyIGJpdHMuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUKLQkgIHx8IChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMgJiYgU1dJVENIX1RBQkxFIChmaXhQKSkpCi0JewotCSAgaWYgKDggPD0gc2l6ZW9mICh2YWx1ZVQpKQotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCQl2YWx1ZSwgOCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsb25nIHcxLCB3MjsKLQkgICAgICBsb25nIGhpdjsKLQotCSAgICAgIHcxID0gdzIgPSBmaXhQLT5meF93aGVyZTsKLQkgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JCXcxICs9IDQ7Ci0JICAgICAgZWxzZQotCQl3MiArPSA0OwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIHcxLCB2YWx1ZSwgNCk7Ci0JICAgICAgaWYgKCh2YWx1ZSAmIDB4ODAwMDAwMDApICE9IDApCi0JCWhpdiA9IDB4ZmZmZmZmZmY7Ci0JICAgICAgZWxzZQotCQloaXYgPSAwOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIHcyLCBoaXYsIDQpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICAvKiBJZiB3ZSBhcmUgZGVsZXRpbmcgdGhpcyByZWxvYyBlbnRyeSwgd2UgbXVzdCBmaWxsIGluIHRoZQotCSB2YWx1ZSBub3cuICBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgaGF2ZSBhIC53b3JkIHdoaWNoIGlzIG5vdAotCSByZXNvbHZlZCB3aGVuIGl0IGFwcGVhcnMgYnV0IGlzIGxhdGVyIGRlZmluZWQuICBXZSBhbHNvIG5lZWQKLQkgdG8gZmlsbCBpbiB0aGUgdmFsdWUgaWYgdGhpcyBpcyBhbiBlbWJlZGRlZCBQSUMgc3dpdGNoIHRhYmxlCi0JIGVudHJ5LiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lCi0JICB8fCAobWlwc19waWMgPT0gRU1CRURERURfUElDICYmIFNXSVRDSF9UQUJMRSAoZml4UCkpKQotCW1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgIHZhbHVlLCA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICAvKiBJZiB3ZSBhcmUgZGVsZXRpbmcgdGhpcyByZWxvYyBlbnRyeSwgd2UgbXVzdCBmaWxsIGluIHRoZQotICAgICAgICAgdmFsdWUgbm93LiAgKi8KLSAgICAgIGFzc2VydCAoZml4UC0+Znhfc2l6ZSA9PSAyKTsKLSAgICAgIGlmIChmaXhQLT5meF9kb25lKQotCW1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgIHZhbHVlLCAyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIC8qIFdoZW4gaGFuZGxpbmcgYW4gZW1iZWRkZWQgUElDIHN3aXRjaCBzdGF0ZW1lbnQsIHdlIGNhbiB3aW5kCi0JIHVwIGRlbGV0aW5nIGEgTE8xNiByZWxvYy4gIFNlZSB0aGUgJ28nIGNhc2UgaW4gbWlwc19pcC4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKLQl7Ci0JICBpZiAodmFsdWUgPCAtMHg4MDAwIHx8IHZhbHVlID4gMHg3ZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0JICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgIGJ1ZiArPSAyOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgLyoKLSAgICAgICAqIFdlIG5lZWQgdG8gc2F2ZSB0aGUgYml0cyBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2luY2UgZml4dXBfc2VnbWVudCgpCi0gICAgICAgKiBtaWdodCBiZSBkZWxldGluZyB0aGUgcmVsb2NhdGlvbiBlbnRyeSAoaS5lLiwgYSBicmFuY2ggd2l0aGluCi0gICAgICAgKiB0aGUgY3VycmVudCBzZWdtZW50KS4KLSAgICAgICAqLwotICAgICAgaWYgKCh2YWx1ZSAmIDB4MykgIT0gMCkKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkJyYW5jaCB0byBvZGQgYWRkcmVzcyAoJWx4KSIpLCB2YWx1ZSk7Ci0KLSAgICAgIGlmICghZml4UC0+ZnhfZG9uZSAmJiB2YWx1ZSAhPSAwKQotCWJyZWFrOwotICAgICAgLyogSWYgJ3ZhbHVlJyBpcyB6ZXJvLCB0aGUgcmVtYWluaW5nIHJlbG9jIGNvZGUgd29uJ3QgYWN0dWFsbHkKLQkgZG8gdGhlIHN0b3JlLCBzbyBpdCBtdXN0IGJlIGRvbmUgaGVyZS4gIFRoaXMgaXMgcHJvYmFibHkKLQkgYSBidWcgc29tZXdoZXJlLiAgKi8KLSAgICAgIGlmICghZml4UC0+ZnhfZG9uZSkKLQl2YWx1ZSAtPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICAKLSAgICAgIHZhbHVlID4+PSAyOwotCi0gICAgICAvKiB1cGRhdGUgb2xkIGluc3RydWN0aW9uIGRhdGEgKi8KLSAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIChmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWluc24gPSAoYnVmWzBdIDw8IDI0KSB8IChidWZbMV0gPDwgMTYpIHwgKGJ1ZlsyXSA8PCA4KSB8IGJ1ZlszXTsKLSAgICAgIGVsc2UKLQlpbnNuID0gKGJ1ZlszXSA8PCAyNCkgfCAoYnVmWzJdIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMF07Ci0KLSAgICAgIGlmICh2YWx1ZSA+PSAtMHg4MDAwICYmIHZhbHVlIDwgMHg4MDAwKQotCWluc24gfD0gdmFsdWUgJiAweGZmZmY7Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlIGJyYW5jaCBvZmZzZXQgaXMgdG9vIGxhcmdlLiAgSWYgdGhpcyBpcyBhbgotICAgICAgICAgICAgIHVuY29uZGl0aW9uYWwgYnJhbmNoLCBhbmQgd2UgYXJlIG5vdCBnZW5lcmF0aW5nIFBJQyBjb2RlLAotICAgICAgICAgICAgIHdlIGNhbiBjb252ZXJ0IGl0IHRvIGFuIGFic29sdXRlIGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotCSAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgICAgICYmIGZpeFAtPmZ4X2RvbmUKLQkgICAgICAmJiBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzID49IHRleHRfc2VjdGlvbi0+dm1hCi0JICAgICAgJiYgKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJICA8IHRleHRfc2VjdGlvbi0+dm1hICsgdGV4dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgICAgJiYgKChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHgxMDAwMDAwMAkgLyogYmVxICQwLCQwICovCi0JCSAgfHwgKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDA0MDEwMDAwCSAvKiBiZ2V6ICQwICovCi0JCSAgfHwgKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDA0MTEwMDAwKSkgLyogYmdlemFsICQwICovCi0JICAgIHsKLQkgICAgICBpZiAoKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDA0MTEwMDAwKQkgLyogYmdlemFsICQwICovCi0JCWluc24gPSAweDBjMDAwMDAwOwkvKiBqYWwgKi8KLQkgICAgICBlbHNlCi0JCWluc24gPSAweDA4MDAwMDAwOwkvKiBqICovCi0JICAgICAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX01JUFNfSk1QOwotCSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKHRleHRfc2VjdGlvbik7Ci0JICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gKHZhbHVlIDw8IDIpICsgbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FLiAgSXQgd291bGQgYmUgcG9zc2libGUgaW4gcHJpbmNpcGxlIHRvIGhhbmRsZQotICAgICAgICAgICAgICAgICBjb25kaXRpb25hbCBicmFuY2hlcyB3aGljaCBvdmVyZmxvdy4gIFRoZXkgY291bGQgYmUKLSAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgaW50byBhIGJyYW5jaCBhcm91bmQgYSBqdW1wLiAgVGhpcyB3b3VsZAotICAgICAgICAgICAgICAgICByZXF1aXJlIHNldHRpbmcgdXAgdmFyaWFudCBmcmFncyBmb3IgZWFjaCBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgYnJhbmNoIHR5cGUuICBUaGUgbmF0aXZlIE1JUFMgYXNzZW1ibGVyIGF0dGVtcHRzIHRvCi0gICAgICAgICAgICAgICAgIGhhbmRsZSB0aGVzZSBjYXNlcywgYnV0IGl0IGFwcGVhcnMgdG8gZG8gaXQKLSAgICAgICAgICAgICAgICAgaW5jb3JyZWN0bHkuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOwotCSAgICB9Ci0JfQotCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopIGJ1ZiwgKHZhbHVlVCkgaW5zbiwgNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kKLSAgICAgICAgICAmJiAhU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICAgICAmJiAhU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgICAgIFNfU0VUX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpbnRlcm5hbEVycm9yICgpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotI2lmIDAKLXZvaWQKLXByaW50SW5zbiAob2MpCi0gICAgIHVuc2lnbmVkIGxvbmcgb2M7Ci17Ci0gIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqcDsKLSAgaW50IHRyZWcsIHNyZWcsIGRyZWcsIHNoYW10OwotICBzaG9ydCBpbW07Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1PUENPREVTOyArK2kpCi0gICAgewotICAgICAgcCA9ICZtaXBzX29wY29kZXNbaV07Ci0gICAgICBpZiAoKChvYyAmIHAtPm1hc2spID09IHAtPm1hdGNoKSAmJiAocC0+cGluZm8gIT0gSU5TTl9NQUNSTykpCi0JewotCSAgcHJpbnRmICgiJTA4bHggJXNcdCIsIG9jLCBwLT5uYW1lKTsKLQkgIHRyZWcgPSAob2MgPj4gMTYpICYgMHgxZjsKLQkgIHNyZWcgPSAob2MgPj4gMjEpICYgMHgxZjsKLQkgIGRyZWcgPSAob2MgPj4gMTEpICYgMHgxZjsKLQkgIHNoYW10ID0gKG9jID4+IDYpICYgMHgxZjsKLQkgIGltbSA9IG9jOwotCSAgZm9yIChhcmdzID0gcC0+YXJnczs7ICsrYXJncykKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKmFyZ3MpCi0JCXsKLQkJY2FzZSAnXDAnOgotCQkgIHByaW50ZiAoIlxuIik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnLCc6Ci0JCWNhc2UgJygnOgotCQljYXNlICcpJzoKLQkJICBwcmludGYgKCIlYyIsICphcmdzKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdyJzoKLQkJICBhc3NlcnQgKHRyZWcgPT0gc3JlZyk7Ci0JCSAgcHJpbnRmICgiJCVkLCQlZCIsIHRyZWcsIHNyZWcpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2QnOgotCQljYXNlICdHJzoKLQkJICBwcmludGYgKCIkJWQiLCBkcmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICd0JzoKLQkJY2FzZSAnRSc6Ci0JCSAgcHJpbnRmICgiJCVkIiwgdHJlZyk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnayc6Ci0JCSAgcHJpbnRmICgiMHgleCIsIHRyZWcpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2InOgotCQljYXNlICdzJzoKLQkJICBwcmludGYgKCIkJWQiLCBzcmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdhJzoKLQkJICBwcmludGYgKCIweCUwOGx4Iiwgb2MgJiAweDFmZmZmZmYpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2knOgotCQljYXNlICdqJzoKLQkJY2FzZSAnbyc6Ci0JCWNhc2UgJ3UnOgotCQkgIHByaW50ZiAoIiVkIiwgaW1tKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICc8JzoKLQkJY2FzZSAnPic6Ci0JCSAgcHJpbnRmICgiJCVkIiwgc2hhbXQpOwotCQkgIGNvbnRpbnVlOwotCi0JCWRlZmF1bHQ6Ci0JCSAgaW50ZXJuYWxFcnJvciAoKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgcHJpbnRmIChfKCIlMDhseCAgVU5ERUZJTkVEXG4iKSwgb2MpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzeW1ib2xTICoKLWdldF9zeW1ib2wgKCkKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKm5hbWU7Ci0gIHN5bWJvbFMgKnA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gKHN5bWJvbFMgKikgc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICByZXR1cm4gcDsKLX0KLQotLyogQWxpZ24gdGhlIGN1cnJlbnQgZnJhZyB0byBhIGdpdmVuIHBvd2VyIG9mIHR3by4gIFRoZSBNSVBTIGFzc2VtYmxlcgotICAgYWxzbyBhdXRvbWF0aWNhbGx5IGFkanVzdHMgYW55IHByZWNlZGluZyBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2FsaWduICh0bywgZmlsbCwgbGFiZWwpCi0gICAgIGludCB0bzsKLSAgICAgaW50IGZpbGw7Ci0gICAgIHN5bWJvbFMgKmxhYmVsOwotewotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0gIGZyYWdfYWxpZ24gKHRvLCBmaWxsLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgdG8pOwotICBpZiAobGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGFiZWwsIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1ZBTFVFIChsYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICB9Ci19Ci0KLS8qIEFsaWduIHRvIGEgZ2l2ZW4gcG93ZXIgb2YgdHdvLiAgLmFsaWduIDAgdHVybnMgb2ZmIHRoZSBhdXRvbWF0aWMKLSAgIGFsaWdubWVudCB1c2VkIGJ5IHRoZSBkYXRhIGNyZWF0aW5nIHBzZXVkby1vcHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbGlnbiAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLSAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7Ci0KLSAgLyoKLQotICAgIG8gIE5vdGUgdGhhdCB0aGUgYXNzZW1ibGVyIHB1bGxzIGRvd24gYW55IGltbWVkaWF0ZWx5IHByZWNlZWRpbmcgbGFiZWwKLSAgICAgICB0byB0aGUgYWxpZ25lZCBhZGRyZXNzLgotICAgIG8gIEl0J3Mgbm90IGRvY3VtZW50ZWQgYnV0IGF1dG8gYWxpZ25tZW50IGlzIHJlaW5zdGF0ZWQgYnkKLSAgICAgICBhIC5hbGlnbiBwc2V1ZG8gaW5zdHJ1Y3Rpb24uCi0gICAgbyAgTm90ZSBhbHNvIHRoYXQgYWZ0ZXIgYXV0byBhbGlnbm1lbnQgaXMgdHVybmVkIG9mZiB0aGUgbWlwcyBhc3NlbWJsZXIKLSAgICAgICBpc3N1ZXMgYW4gZXJyb3Igb24gYXR0ZW1wdCB0byBhc3NlbWJsZSBhbiBpbXByb3Blcmx5IGFsaWduZWQgZGF0YSBpdGVtLgotICAgICAgIFdlIGRvbid0LgotCi0gICAgKi8KLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICh0ZW1wID4gbWF4X2FsaWdubWVudCkKLSAgICBhc19iYWQgKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkLiIpLCB0ZW1wID0gbWF4X2FsaWdubWVudCk7Ci0gIGVsc2UgaWYgKHRlbXAgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkLiIpKTsKLSAgICAgIHRlbXAgPSAwOwotICAgIH0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgdGVtcF9maWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgdGVtcF9maWxsID0gMDsKLSAgaWYgKHRlbXApCi0gICAgewotICAgICAgYXV0b19hbGlnbiA9IDE7Ci0gICAgICBtaXBzX2FsaWduICh0ZW1wLCAoaW50KSB0ZW1wX2ZpbGwsCi0JCSAgaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGF1dG9fYWxpZ24gPSAwOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1taXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi17Ci0gIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfY2hhbmdlX3NlYyAoc2VjKQotICAgICBpbnQgc2VjOwotewotICBzZWdUIHNlZzsKLQotICAvKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHdlIG9ubHkgdXNlIHRoZSAudGV4dCwgLmxpdDgsCi0gICAgIC5zZGF0YSBhbmQgLnNic3Mgc2VjdGlvbnMuICBXZSBjaGFuZ2UgdGhlIC5kYXRhIGFuZCAucmRhdGEKLSAgICAgcHNldWRvLW9wcyB0byB1c2UgLnNkYXRhLiAgKi8KLSAgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotICAgICAgJiYgKHNlYyA9PSAnZCcgfHwgc2VjID09ICdyJykpCi0gICAgc2VjID0gJ3MnOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBUaGUgRUxGIGJhY2tlbmQgbmVlZHMgdG8ga25vdyB0aGF0IHdlIGFyZSBjaGFuZ2luZyBzZWN0aW9ucywgc28KLSAgICAgdGhhdCAucHJldmlvdXMgd29ya3MgY29ycmVjdGx5LiAgV2UgY291bGQgZG8gc29tZXRoaW5nIGxpa2UgY2hlY2sKLSAgICAgZm9yIGEgb2JqX3NlY3Rpb25fY2hhbmdlX2hvb2sgbWFjcm8sIGJ1dCB0aGF0IG1pZ2h0IGJlIGNvbmZ1c2luZwotICAgICBhcyBpdCB3b3VsZCBub3QgYmUgYXBwcm9wcmlhdGUgdG8gdXNlIGl0IGluIHRoZSBzZWN0aW9uIGNoYW5naW5nCi0gICAgIGZ1bmN0aW9ucyBpbiByZWFkLmMsIHNpbmNlIG9iai1lbGYuYyBpbnRlcmNlcHRzIHRob3NlLiAgRklYTUU6Ci0gICAgIFRoaXMgc2hvdWxkIGJlIGNsZWFuZXIsIHNvbWVob3cuICAqLwotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7Ci0jZW5kaWYKLQotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0gIHN3aXRjaCAoc2VjKQotICAgIHsKLSAgICBjYXNlICd0JzoKLSAgICAgIHNfdGV4dCAoMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLQl7Ci0JICBzZWcgPSBzdWJzZWdfbmV3IChSREFUQV9TRUNUSU9OX05BTUUsCi0JCQkgICAgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQkgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnLAotCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgfCBTRUNfREFUQSkpOwotCSAgICAgIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCi0JCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCA0KTsKLQkgICAgfQotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJObyByZWFkIG9ubHkgZGF0YSBzZWN0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCi0JewotCSAgc2VnID0gc3Vic2VnX25ldyAoIi5zZGF0YSIsIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0JICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCQkgICAgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkJICAgICB8IFNFQ19EQVRBKTsKLQkgICAgICBpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgNCk7Ci0JICAgIH0KLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJHbG9iYWwgcG9pbnRlcnMgbm90IHN1cHBvcnRlZDsgcmVjb21waWxlIC1HIDAiKSk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgYXV0b19hbGlnbiA9IDE7Ci19Ci0KLXZvaWQKLW1pcHNfZW5hYmxlX2F1dG9fYWxpZ24gKCkKLXsKLSAgYXV0b19hbGlnbiA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NvbnMgKGxvZ19zaXplKQotICAgICBpbnQgbG9nX3NpemU7Ci17Ci0gIHN5bWJvbFMgKmxhYmVsOwotCi0gIGxhYmVsID0gaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEw7Ci0gIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKLSAgaWYgKGxvZ19zaXplID4gMCAmJiBhdXRvX2FsaWduKQotICAgIG1pcHNfYWxpZ24gKGxvZ19zaXplLCAwLCBsYWJlbCk7Ci0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci0gIGNvbnMgKDEgPDwgbG9nX3NpemUpOwotfQotCi1zdGF0aWMgdm9pZAotc19mbG9hdF9jb25zICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgc3ltYm9sUyAqbGFiZWw7Ci0KLSAgbGFiZWwgPSBpbnNuX2xhYmVscyAhPSBOVUxMID8gaW5zbl9sYWJlbHMtPmxhYmVsIDogTlVMTDsKLQotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0KLSAgaWYgKGF1dG9fYWxpZ24pCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gJ2QnKQotCW1pcHNfYWxpZ24gKDMsIDAsIGxhYmVsKTsKLSAgICAgIGVsc2UKLQltaXBzX2FsaWduICgyLCAwLCBsYWJlbCk7Ci0gICAgfQotCi0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci0KLSAgZmxvYXRfY29ucyAodHlwZSk7Ci19Ci0KLS8qIEhhbmRsZSAuZ2xvYmwuICBXZSBuZWVkIHRvIG92ZXJyaWRlIGl0IGJlY2F1c2Ugb24gSXJpeCA1IHlvdSBhcmUKLSAgIHBlcm1pdHRlZCB0byBzYXkKLSAgICAgICAuZ2xvYmwgZm9vIC50ZXh0Ci0gICB3aGVyZSBmb28gaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgdG8gbWVhbiB0aGF0IGZvbyBzaG91bGQgYmUKLSAgIGNvbnNpZGVyZWQgdG8gYmUgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZ2xvYmwgKHgpCi0gICAgIGludCB4OwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZmxhZ3dvcmQgZmxhZzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBPbiBJcml4IDUsIGV2ZXJ5IGdsb2JhbCBzeW1ib2wgdGhhdCBpcyBub3QgZXhwbGljaXRseSBsYWJlbGxlZCBhcwotICAgICBiZWluZyBhIGZ1bmN0aW9uIGlzIGFwcGFyZW50bHkgbGFiZWxsZWQgYXMgYmVpbmcgYW4gb2JqZWN0LiAgKi8KLSAgZmxhZyA9IEJTRl9PQkpFQ1Q7Ci0KLSAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGNoYXIgKnNlY25hbWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBzZWNuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgc2VjbmFtZSk7Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JYXNfYmFkIChfKCIlczogbm8gc3VjaCBzZWN0aW9uIiksIHNlY25hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCWZsYWcgPSBCU0ZfRlVOQ1RJT047Ci0gICAgfQotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gZmxhZzsKLQotICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX29wdGlvbiAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGNoYXIgKm9wdDsKLSAgY2hhciBjOwotCi0gIG9wdCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmICgqb3B0ID09ICdPJykKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogV2hhdCBkb2VzIHRoaXMgbWVhbj8gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChvcHQsICJwaWMiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBpID0gYXRvaSAob3B0ICsgMyk7Ci0gICAgICBpZiAoaSA9PSAwKQotCW1pcHNfcGljID0gTk9fUElDOwotICAgICAgZWxzZSBpZiAoaSA9PSAyKQotCW1pcHNfcGljID0gU1ZSNF9QSUM7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCIub3B0aW9uIHBpYyVkIG5vdCBzdXBwb3J0ZWQiKSwgaSk7Ci0KLSAgICAgIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUICYmIG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIGlmIChnX3N3aXRjaF9zZWVuICYmIGdfc3dpdGNoX3ZhbHVlICE9IDApCi0JICAgIGFzX3dhcm4gKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiKSk7Ci0JICBnX3N3aXRjaF92YWx1ZSA9IDA7Ci0JICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgMCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBvcHRpb24gXCIlc1wiIiksIG9wdCk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIHN0YWNrIG9mIC5zZXQgdmFsdWVzLiAgKi8KLQotc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrCi17Ci0gIHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqbmV4dDsKLSAgc3RydWN0IG1pcHNfc2V0X29wdGlvbnMgb3B0aW9uczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKm1pcHNfb3B0c19zdGFjazsKLQotLyogSGFuZGxlIHRoZSAuc2V0IHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNzZXQgKHgpCi0gICAgIGludCB4OwotewotICBjaGFyICpuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyLCBjaDsKLQotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgY2ggPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotICBpZiAoc3RyY21wIChuYW1lLCAicmVvcmRlciIpID09IDApCi0gICAgewotICAgICAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIgJiYgcHJldl9ub3BfZnJhZyAhPSBOVUxMKQotCXsKLQkgIC8qIElmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBub3BzLCB3ZSBjYW4gZGlzY2FyZCB0aGVtLiAgVGhlCi0JICAgICB1c3VhbCBub3AgaGFuZGxpbmcgd2lsbCBpbnNlcnQgYW55IHRoYXQgYXJlIHN0aWxsCi0JICAgICBuZWVkZWQuICovCi0JICBwcmV2X25vcF9mcmFnLT5mcl9maXggLT0gKHByZXZfbm9wX2ZyYWdfaG9sZHMKLQkJCQkgICAgKiAobWlwc19vcHRzLm1pcHMxNiA/IDIgOiA0KSk7Ci0JICBwcmV2X25vcF9mcmFnID0gTlVMTDsKLQl9Ci0gICAgICBtaXBzX29wdHMubm9yZW9yZGVyID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vcmVvcmRlciIpID09IDApCi0gICAgewotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICBtaXBzX29wdHMubm9yZW9yZGVyID0gMTsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhdCIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vYXQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9hdCIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vYXQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWFjcm8iKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub21hY3JvIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWlwc19vcHRzLm5vcmVvcmRlciA9PSAwKQotCWFzX2JhZCAoXygiYG5vcmVvcmRlcicgbXVzdCBiZSBzZXQgYmVmb3JlIGBub21hY3JvJyIpKTsKLSAgICAgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb3ZlIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICJub3ZvbGF0aWxlIikgPT0gMCkKLSAgICB7Ci0gICAgICBtaXBzX29wdHMubm9tb3ZlID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vbW92ZSIpID09IDAgfHwgc3RyY21wIChuYW1lLCAidm9sYXRpbGUiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub21vdmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYm9wdCIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vYm9wdCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub2JvcHQiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub2JvcHQgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWlwczE2IikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIk1JUFMtMTYiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5taXBzMTYgPSAxOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub21pcHMxNiIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICJub01JUFMtMTYiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5taXBzMTYgPSAwOwotICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAibWlwcyIsIDQpID09IDApCi0gICAgewotICAgICAgaW50IGlzYTsKLQotICAgICAgLyogUGVybWl0IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgSVNBIG9uIHRoZSBmbHkuICBOZWVkbGVzcyB0bwotCSBzYXksIG1pc3VzZSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcy4gICovCi0gICAgICBpc2EgPSBhdG9pIChuYW1lICsgNCk7Ci0gICAgICBpZiAoaXNhID09IDApCi0JbWlwc19vcHRzLmlzYSA9IGZpbGVfbWlwc19pc2E7Ci0gICAgICBlbHNlIGlmIChpc2EgPCAxIHx8IGlzYSA+IDQpCi0JYXNfYmFkIChfKCJ1bmtub3duIElTQSBsZXZlbCIpKTsKLSAgICAgIGVsc2UKLQltaXBzX29wdHMuaXNhID0gaXNhOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0b2V4dGVuZCIpID09IDApCi0gICAgbWlwc19vcHRzLm5vYXV0b2V4dGVuZCA9IDA7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vYXV0b2V4dGVuZCIpID09IDApCi0gICAgbWlwc19vcHRzLm5vYXV0b2V4dGVuZCA9IDE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInB1c2giKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqczsKLQotICAgICAgcyA9IChzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpzKTsKLSAgICAgIHMtPm5leHQgPSBtaXBzX29wdHNfc3RhY2s7Ci0gICAgICBzLT5vcHRpb25zID0gbWlwc19vcHRzOwotICAgICAgbWlwc19vcHRzX3N0YWNrID0gczsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInBvcCIpID09IDApCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrICpzOwotCi0gICAgICBzID0gbWlwc19vcHRzX3N0YWNrOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlhc19iYWQgKF8oIi5zZXQgcG9wIHdpdGggbm8gLnNldCBwdXNoIikpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIHdlJ3JlIGNoYW5naW5nIHRoZSByZW9yZGVyIG1vZGUgd2UgbmVlZCB0byBoYW5kbGUKLSAgICAgICAgICAgICBkZWxheSBzbG90cyBjb3JyZWN0bHkuICAqLwotCSAgaWYgKHMtPm9wdGlvbnMubm9yZW9yZGVyICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcikKLQkgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0JICBlbHNlIGlmICghIHMtPm9wdGlvbnMubm9yZW9yZGVyICYmIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAocHJldl9ub3BfZnJhZyAhPSBOVUxMKQotCQl7Ci0JCSAgcHJldl9ub3BfZnJhZy0+ZnJfZml4IC09IChwcmV2X25vcF9mcmFnX2hvbGRzCi0JCQkJCSAgICAqIChtaXBzX29wdHMubWlwczE2ID8gMiA6IDQpKTsKLQkJICBwcmV2X25vcF9mcmFnID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgIG1pcHNfb3B0cyA9IHMtPm9wdGlvbnM7Ci0JICBtaXBzX29wdHNfc3RhY2sgPSBzLT5uZXh0OwotCSAgZnJlZSAocyk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlRyaWVkIHRvIHNldCB1bnJlY29nbml6ZWQgc3ltYm9sOiAlc1xuIiksIG5hbWUpOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGNoOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hYmljYWxscyBwc2V1ZG8tb3AuICBJIGJlbGlldmUgdGhpcyBpcyBlcXVpdmFsZW50IHRvCi0gICAub3B0aW9uIHBpYzIuICBJdCBtZWFucyB0byBnZW5lcmF0ZSBTVlI0IFBJQyBjYWxscy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FiaWNhbGxzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG1pcHNfcGljID0gU1ZSNF9QSUM7Ci0gIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotICAgIHsKLSAgICAgIGlmIChnX3N3aXRjaF9zZWVuICYmIGdfc3dpdGNoX3ZhbHVlICE9IDApCi0JYXNfd2FybiAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBQSUMgY29kZSIpKTsKLSAgICAgIGdfc3dpdGNoX3ZhbHVlID0gMDsKLSAgICB9Ci0gIGJmZF9zZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0LCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuY3Bsb2FkIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgU1ZSNAotICAgUElDIGNvZGUuICBJdCBzZXRzIHRoZSAkZ3AgcmVnaXN0ZXIgZm9yIHRoZSBmdW5jdGlvbiBiYXNlZCBvbiB0aGUKLSAgIGZ1bmN0aW9uIGFkZHJlc3MsIHdoaWNoIGlzIGluIHRoZSByZWdpc3RlciBuYW1lZCBpbiB0aGUgYXJndW1lbnQuCi0gICBUaGlzIHVzZXMgYSByZWxvY2F0aW9uIGFnYWluc3QgX2dwX2Rpc3AsIHdoaWNoIGlzIGhhbmRsZWQgc3BlY2lhbGx5Ci0gICBieSB0aGUgbGlua2VyLiAgVGhlIHJlc3VsdCBpczoKLQlsdWkJJGdwLCVoaShfZ3BfZGlzcCkKLQlhZGRpdQkkZ3AsJGdwLCVsbyhfZ3BfZGlzcCkKLQlhZGR1CSRncCwkZ3AsLmNwbG9hZCBhcmd1bWVudAotICAgVGhlIC5jcGxvYWQgYXJndW1lbnQgaXMgbm9ybWFsbHkgJDI1ID09ICR0OS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2NwbG9hZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleDsKLSAgaW50IGljbnQgPSAwOwotCi0gIC8qIElmIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBTVlI0IFBJQyBjb2RlLCAuY3Bsb2FkIGlzIGlnbm9yZWQuICAqLwotICBpZiAobWlwc19waWMgIT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgc19pZ25vcmUgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiAuY3Bsb2FkIHNob3VsZCBiZSBhIGluIC5zZXQgbm9yZW9yZGVyIHNlY3Rpb24uICAqLwotICBpZiAobWlwc19vcHRzLm5vcmVvcmRlciA9PSAwKQotICAgIGFzX3dhcm4gKF8oIi5jcGxvYWQgbm90IGluIG5vcmVvcmRlciBzZWN0aW9uIikpOwotCi0gIGV4Llhfb3AgPSBPX3N5bWJvbDsKLSAgZXguWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoIl9ncF9kaXNwIik7Ci0gIGV4Llhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXguWF9hZGRfbnVtYmVyID0gMDsKLQotICAvKiBJbiBFTEYsIHRoaXMgc3ltYm9sIGlzIGltcGxpY2l0bHkgYW4gU1RUX09CSkVDVCBzeW1ib2wuICAqLwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoZXguWF9hZGRfc3ltYm9sKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQotICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmZXgsIEdQKTsKLSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXgsICJhZGRpdSIsICJ0LHIsaiIsIEdQLCBHUCwKLQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCi0gIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJhZGR1IiwgImQsdix0IiwKLQkgICAgICAgR1AsIEdQLCB0Y19nZXRfcmVnaXN0ZXIgKDApKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5jcHJlc3RvcmUgcHNldWRvLW9wLiAgVGhpcyBzdG9yZXMgJGdwIGludG8gYSBnaXZlbgotICAgb2Zmc2V0IGZyb20gJHNwLiAgVGhlIG9mZnNldCBpcyByZW1lbWJlcmVkLCBhbmQgYWZ0ZXIgbWFraW5nIGEgUElDCi0gICBjYWxsICRncCBpcyByZXN0b3JlZCBmcm9tIHRoYXQgbG9jYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc19jcHJlc3RvcmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXg7Ci0gIGludCBpY250ID0gMDsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZSwgLmNwcmVzdG9yZSBpcyBpZ25vcmVkLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfaWdub3JlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbWlwc19jcHJlc3RvcmVfb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZXguWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gIGV4Llhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXguWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OwotCi0gIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4LAotCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJPyAic3ciIDogInNkIiksCi0JICAgICAgICJ0LG8oYikiLCBHUCwgKGludCkgQkZEX1JFTE9DX0xPMTYsIFNQKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5ncHdvcmQgcHNldWRvLW9wLiAgVGhpcyBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBQSUMKLSAgIGNvZGUuICBJdCBnZW5lcmF0ZXMgYSAzMiBiaXQgR1AgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotc19ncHdvcmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqbGFiZWw7Ci0gIGV4cHJlc3Npb25TIGV4OwotICBjaGFyICpwOwotCi0gIC8qIFdoZW4gbm90IGdlbmVyYXRpbmcgUElDIGNvZGUsIHRoaXMgaXMgdHJlYXRlZCBhcyAud29yZC4gICovCi0gIGlmIChtaXBzX3BpYyAhPSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzX2NvbnMgKDIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsYWJlbCA9IGluc25fbGFiZWxzICE9IE5VTEwgPyBpbnNuX2xhYmVscy0+bGFiZWwgOiBOVUxMOwotICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgaWYgKGF1dG9fYWxpZ24pCi0gICAgbWlwc19hbGlnbiAoMiwgMCwgbGFiZWwpOwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotCi0gIGV4cHJlc3Npb24gKCZleCk7Ci0KLSAgaWYgKGV4Llhfb3AgIT0gT19zeW1ib2wgfHwgZXguWF9hZGRfbnVtYmVyICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnN1cHBvcnRlZCB1c2Ugb2YgLmdwd29yZCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIDAsIDQpOwotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwgJmV4LCAwLAotCSAgICAgICBCRkRfUkVMT0NfTUlQU19HUFJFTDMyKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5jcGFkZCBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggc3dpdGNoCi0gICB0YWJsZXMgaW4gU1ZSNCBQSUMgY29kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2NwYWRkIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHJlZzsKLQotICAvKiBUaGlzIGlzIGlnbm9yZWQgd2hlbiBub3QgZ2VuZXJhdGluZyBTVlI0IFBJQyBjb2RlLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfaWdub3JlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogQWRkICRncCB0byB0aGUgcmVnaXN0ZXIgbmFtZWQgYXMgYW4gYXJndW1lbnQuICAqLwotICByZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOwotICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkgICAgICAgImQsdix0IiwgcmVnLCByZWcsIEdQKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOyAgCi19Ci0KLS8qIEhhbmRsZSB0aGUgLmluc24gcHNldWRvLW9wLiAgVGhpcyBtYXJrcyBpbnN0cnVjdGlvbiBsYWJlbHMgaW4KLSAgIG1pcHMxNiBtb2RlLiAgVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgdG8gaGFuZGxlIHRoZW0gc3BlY2lhbGx5LAotICAgc3VjaCBhcyBnZW5lcmF0aW5nIGphbHggaW5zdHJ1Y3Rpb25zIHdoZW4gbmVlZGVkLiAgV2UgYWxzbyBtYWtlCi0gICB0aGVtIG9kZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBhc3NlbWJseSwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlCi0gICByaWdodCBzb3J0IG9mIGNvZGUuICBXZSB3aWxsIG1ha2UgdGhlbSBldmVuIGluIHRoZSBhZGp1c3Rfc3ltdGFiCi0gICByb3V0aW5lLCB3aGlsZSBsZWF2aW5nIHRoZW0gbWFya2VkLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciB0aGUKLSAgIGRlYnVnZ2VyIGFuZCB0aGUgZGlzYXNzZW1ibGVyLiAgVGhlIGxpbmtlciBrbm93cyB0byBtYWtlIHRoZW0gb2RkCi0gICBhZ2Fpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2luc24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5zdGFibiBkaXJlY3RpdmUuICBXZSBuZWVkIHRoZXNlIGluIG9yZGVyIHRvIG1hcmsgYSBsYWJlbAotICAgYXMgYmVpbmcgYSBtaXBzMTYgdGV4dCBsYWJlbCBjb3JyZWN0bHkuICBTb21ldGltZXMgdGhlIGNvbXBpbGVyCi0gICB3aWxsIGVtaXQgYSBsYWJlbCwgZm9sbG93ZWQgYnkgYSAuc3RhYm4sIGFuZCB0aGVuIHN3aXRjaCBzZWN0aW9ucy4KLSAgIElmIHRoZSBsYWJlbCBhbmQgLnN0YWJuIGFyZSBpbiBtaXBzMTYgbW9kZSwgdGhlbiB0aGUgbGFiZWwgaXMKLSAgIHJlYWxseSBhIG1pcHMxNiB0ZXh0IGxhYmVsLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc19zdGFiICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gJ24nICYmIG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIHNfc3RhYiAodHlwZSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLndlYWtleHQgcHNldWRvLW9wIGFzIGRlZmluZWQgaW4gS2FuZSBhbmQgSGVpbnJpY2guCi0gKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc193ZWFrZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCXsKLQkgIGFzX2JhZCAoIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIGAlcycuIiwKLQkJICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIAotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCX0KLSAgICAgIAotICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgYXNfYmFkICgiYmFkIC53ZWFrZXh0IGRpcmVjdGl2ZSIpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltYm9sUCwgJmV4cCk7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFBhcnNlIGEgcmVnaXN0ZXIgc3RyaW5nIGludG8gYSBudW1iZXIuICBDYWxsZWQgZnJvbSB0aGUgRUNPRkYgY29kZQotICAgdG8gcGFyc2UgLmZyYW1lLiAgVGhlIGFyZ3VtZW50IGlzIG5vbi16ZXJvIGlmIHRoaXMgaXMgdGhlIGZyYW1lCi0gICByZWdpc3Rlciwgc28gdGhhdCB3ZSBjYW4gcmVjb3JkIGl0IGluIG1pcHNfZnJhbWVfcmVnLiAgKi8KLQotaW50Ci10Y19nZXRfcmVnaXN0ZXIgKGZyYW1lKQotICAgICBpbnQgZnJhbWU7Ci17Ci0gIGludCByZWc7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICckJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJleHBlY3RlZCBgJCciKSk7Ci0gICAgICByZWcgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIHsKLSAgICAgIHJlZyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKHJlZyA8IDAgfHwgcmVnID49IDMyKQotCXsKLQkgIGFzX3dhcm4gKF8oIkJhZCByZWdpc3RlciBudW1iZXIiKSk7Ci0JICByZWcgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZnAiLCAyKSA9PSAwKQotCXJlZyA9IEZQOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic3AiLCAyKSA9PSAwKQotCXJlZyA9IFNQOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZ3AiLCAyKSA9PSAwKQotCXJlZyA9IEdQOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYXQiLCAyKSA9PSAwKQotCXJlZyA9IEFUOwotICAgICAgZWxzZQotCXsKLQkgIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCByZWdpc3RlciBuYW1lIikpOwotCSAgcmVnID0gMDsKLQl9Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICB9Ci0gIGlmIChmcmFtZSkKLSAgICBtaXBzX2ZyYW1lX3JlZyA9IHJlZyAhPSAwID8gcmVnIDogU1A7Ci0gIHJldHVybiByZWc7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBXZSBkb24ndCBuZWVkIHRvIGFsaWduIEVMRiBzZWN0aW9ucyB0byB0aGUgZnVsbCBhbGlnbm1lbnQuCi0gICAgIEhvd2V2ZXIsIElyaXggNSBtYXkgcHJlZmVyIHRoYXQgd2UgYWxpZ24gdGhlbSBhdCBsZWFzdCB0byBhIDE2Ci0gICAgIGJ5dGUgYm91bmRhcnkuICBXZSBkb24ndCBib3RoZXIgdG8gYWxpZ24gdGhlIHNlY3Rpb25zIGlmIHdlIGFyZQotICAgICB0YXJnZXRlZCBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLiAgKi8KLSAgaWYgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgPT0gMCkKLSAgICByZXR1cm4gYWRkcjsKLSAgaWYgKGFsaWduID4gNCkKLSAgICBhbGlnbiA9IDQ7Ci0jZW5kaWYKLQotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotLyogVXRpbGl0eSByb3V0aW5lLCBjYWxsZWQgZnJvbSBhYm92ZSBhcyB3ZWxsLiAgSWYgY2FsbGVkIHdoaWxlIHRoZQotICAgaW5wdXQgZmlsZSBpcyBzdGlsbCBiZWluZyByZWFkLCBpdCdzIG9ubHkgYW4gYXBwcm94aW1hdGlvbi4gIChGb3IKLSAgIGV4YW1wbGUsIGEgc3ltYm9sIG1heSBsYXRlciBiZWNvbWUgZGVmaW5lZCB3aGljaCBhcHBlYXJlZCB0byBiZQotICAgdW5kZWZpbmVkIGVhcmxpZXIuKSAgKi8KLQotc3RhdGljIGludAotbm9waWNfbmVlZF9yZWxheCAoc3ltLCBiZWZvcmVfcmVsYXhpbmcpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50IGJlZm9yZV9yZWxheGluZzsKLXsKLSAgaWYgKHN5bSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWU7Ci0gICAgICBpbnQgY2hhbmdlOwotCi0gICAgICAvKiBGaW5kIG91dCB3aGV0aGVyIHRoaXMgc3ltYm9sIGNhbiBiZSByZWZlcmVuY2VkIG9mZiB0aGUgR1AKLQkgcmVnaXN0ZXIuICBJdCBjYW4gYmUgaWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSAtRyBzaXplIG9yIGlmCi0JIGl0IGlzIGluIHRoZSAuc2RhdGEgb3IgLnNic3Mgc2VjdGlvbi4gIENlcnRhaW4gc3ltYm9scyBjYW4KLQkgbm90IGJlIHJlZmVyZW5jZWQgb2ZmIHRoZSBHUCwgYWx0aG91Z2ggaXQgYXBwZWFycyBhcyB0aG91Z2gKLQkgdGhleSBjYW4uICAqLwotICAgICAgc3ltbmFtZSA9IFNfR0VUX05BTUUgKHN5bSk7Ci0gICAgICBpZiAoc3ltbmFtZSAhPSAoY29uc3QgY2hhciAqKSBOVUxMCi0JICAmJiAoc3RyY21wIChzeW1uYW1lLCAiZXByb2wiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiZXRleHQiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2dwIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgImVkYXRhIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9mYnNzIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9mZGF0YSIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZnRleHQiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiZW5kIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9ncF9kaXNwIikgPT0gMCkpCi0JY2hhbmdlID0gMTsKLSAgICAgIGVsc2UgaWYgKCghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkKLQkgICAgICAgJiYgKDAKLSNpZm5kZWYgTk9fRUNPRkZfREVCVUdHSU5HCi0JCSAgIHx8IChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfZXh0ZXJuX3NpemUgIT0gMAotCQkgICAgICAgJiYgKHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9leHRlcm5fc2l6ZQotCQkJICAgPD0gZ19zd2l0Y2hfdmFsdWUpKQotI2VuZGlmCi0JCSAgIC8qIFdlIG11c3QgZGVmZXIgdGhpcyBkZWNpc2lvbiB1bnRpbCBhZnRlciB0aGUgd2hvbGUKLQkJICAgICAgZmlsZSBoYXMgYmVlbiByZWFkLCBzaW5jZSB0aGVyZSBtaWdodCBiZSBhIC5leHRlcm4KLQkJICAgICAgYWZ0ZXIgdGhlIGZpcnN0IHVzZSBvZiB0aGlzIHN5bWJvbC4gICovCi0JCSAgIHx8IChiZWZvcmVfcmVsYXhpbmcKLSNpZm5kZWYgTk9fRUNPRkZfREVCVUdHSU5HCi0JCSAgICAgICAmJiBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfZXh0ZXJuX3NpemUgPT0gMAotI2VuZGlmCi0JCSAgICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA9PSAwKQotCQkgICB8fCAoU19HRVRfVkFMVUUgKHN5bSkgIT0gMAotCQkgICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPD0gZ19zd2l0Y2hfdmFsdWUpKSkKLQljaGFuZ2UgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0KLQkgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN5bSkpOwotCSAgYXNzZXJ0IChzdHJjbXAgKHNlZ25hbWUsICIubGl0OCIpICE9IDAKLQkJICAmJiBzdHJjbXAgKHNlZ25hbWUsICIubGl0NCIpICE9IDApOwotCSAgY2hhbmdlID0gKHN0cmNtcCAoc2VnbmFtZSwgIi5zZGF0YSIpICE9IDAKLQkJICAgICYmIHN0cmNtcCAoc2VnbmFtZSwgIi5zYnNzIikgIT0gMAotCQkgICAgJiYgc3RybmNtcCAoc2VnbmFtZSwgIi5zZGF0YS4iLCA3KSAhPSAwCi0JCSAgICAmJiBzdHJuY21wIChzZWduYW1lLCAiLmdudS5saW5rb25jZS5zLiIsIDE2KSAhPSAwKTsKLQl9Ci0gICAgICByZXR1cm4gY2hhbmdlOwotICAgIH0KLSAgZWxzZQotICAgIC8qIFdlIGFyZSBub3Qgb3B0aW1pemluZyBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotLyogR2l2ZW4gYSBtaXBzMTYgdmFyaWFudCBmcmFnIEZSQUdQLCByZXR1cm4gbm9uLXplcm8gaWYgaXQgbmVlZHMgYW4KLSAgIGV4dGVuZGVkIG9wY29kZS4gIFNFQyBpcyB0aGUgc2VjdGlvbiB0aGUgZnJhZyBpcyBpbi4gICovCi0KLXN0YXRpYyBpbnQKLW1pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgc2VjLCBzdHJldGNoKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGxvbmcgc3RyZXRjaDsKLXsKLSAgaW50IHR5cGU7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCAqb3A7Ci0gIG9mZnNldFQgdmFsOwotICBpbnQgbWludGlueSwgbWF4dGlueTsKLSAgc2VnVCBzeW1zZWM7Ci0KLSAgaWYgKFJFTEFYX01JUFMxNl9VU0VSX1NNQUxMIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChSRUxBWF9NSVBTMTZfVVNFUl9FWFQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLSAgICByZXR1cm4gMTsKLQotICB0eXBlID0gUkVMQVhfTUlQUzE2X1RZUEUgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgb3AgPSBtaXBzMTZfaW1tZWRfb3BlcmFuZHM7Ci0gIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQotICAgIHsKLSAgICAgICsrb3A7Ci0gICAgICBhc3NlcnQgKG9wIDwgbWlwczE2X2ltbWVkX29wZXJhbmRzICsgTUlQUzE2X05VTV9JTU1FRCk7Ci0gICAgfQotCi0gIGlmIChvcC0+dW5zcCkKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCi0JewotCSAgbWludGlueSA9IDE7Ci0JICBtYXh0aW55ID0gMSA8PCBvcC0+bmJpdHM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1pbnRpbnkgPSAwOwotCSAgbWF4dGlueSA9ICgxIDw8IG9wLT5uYml0cykgLSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtaW50aW55ID0gLSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpOwotICAgICAgbWF4dGlueSA9ICgxIDw8IChvcC0+bmJpdHMgLSAxKSkgLSAxOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBhbHdheXMgY2FsbCBTX0dFVF9WQUxVRSBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgbG9jayBpbiBhIHBhcnRpY3VsYXIgZnJhZyBhZGRyZXNzLiAgKi8KLSAgaWYgKHN5bWJvbF9jb25zdGFudF9wIChmcmFncC0+ZnJfc3ltYm9sKSkKLSAgICB7Ci0gICAgICB2YWwgPSAoU19HRVRfVkFMVUUgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICAgICArIHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3MpOwotICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCk7Ci0gICAgfQotICBlbHNlIGlmIChzeW1ib2xfZXF1YXRlZF9wIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgICYmIChzeW1ib2xfY29uc3RhbnRfcAotCSAgICAgICAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChmcmFncC0+ZnJfc3ltYm9sKS0+WF9hZGRfc3ltYm9sKSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqZXFzeW07Ci0KLSAgICAgIGVxc3ltID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChmcmFncC0+ZnJfc3ltYm9sKS0+WF9hZGRfc3ltYm9sOwotICAgICAgdmFsID0gKFNfR0VUX1ZBTFVFIChlcXN5bSkKLQkgICAgICsgc3ltYm9sX2dldF9mcmFnIChlcXN5bSktPmZyX2FkZHJlc3MKLQkgICAgICsgc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChmcmFncC0+ZnJfc3ltYm9sKS0+WF9hZGRfbnVtYmVyCi0JICAgICArIHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3MpOwotICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoZXFzeW0pOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAxOwotCi0gIGlmIChvcC0+cGNyZWwpCi0gICAgewotICAgICAgYWRkcmVzc1QgYWRkcjsKLQotICAgICAgLyogV2Ugd29uJ3QgaGF2ZSB0aGUgc2VjdGlvbiB3aGVuIHdlIGFyZSBjYWxsZWQgZnJvbQotICAgICAgICAgbWlwc19yZWxheF9mcmFnLiAgSG93ZXZlciwgd2Ugd2lsbCBhbHdheXMgaGF2ZSBiZWVuIGNhbGxlZAotICAgICAgICAgZnJvbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBmaXJzdC4gIElmIHRoaXMgaXMgYQotICAgICAgICAgYnJhbmNoIHRvIGEgZGlmZmVyZW50IHNlY3Rpb24sIHdlIG1hcmsgaXQgYXMgc3VjaC4gIElmIFNFQyBpcwotICAgICAgICAgTlVMTCwgYW5kIHRoZSBmcmFnIGlzIG5vdCBtYXJrZWQsIHRoZW4gaXQgbXVzdCBiZSBhIGJyYW5jaCB0bwotICAgICAgICAgdGhlIHNhbWUgc2VjdGlvbi4gICovCi0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JewotCSAgaWYgKFJFTEFYX01JUFMxNl9MT05HX0JSQU5DSCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHN5bXNlYyAhPSBzZWMpCi0JICAgIHsKLQkgICAgICBmcmFncC0+ZnJfc3VidHlwZSA9Ci0JCVJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0KLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHN1cHBvcnQgdGhpcywgYW5kIGxldCB0aGUgbGlua2VyCi0gICAgICAgICAgICAgICAgIGNhdGNoIGJyYW5jaGVzIGFuZCBsb2FkcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLAotCQkJICAgIF8oInVuc3VwcG9ydGVkIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSB0byBkaWZmZXJlbnQgc2VjdGlvbiIpKTsKLQotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJbiB0aGlzIGNhc2UsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGUgc3ltYm9sIGZyYWdtZW50IGlzIGluCi0JIHRoZSBzYW1lIHNlY3Rpb24uICBJZiB0aGUgZnJfYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGZyYWdtZW50Ci0JIGlzIGdyZWF0ZXIgdGhlbiB0aGUgYWRkcmVzcyBvZiB0aGlzIGZyYWdtZW50IHdlIHdhbnQgdG8gYWRkCi0JIGluIFNUUkVUQ0ggaW4gb3JkZXIgdG8gZ2V0IGEgYmV0dGVyIGVzdGltYXRlIG9mIHRoZSBhZGRyZXNzLgotCSBUaGlzIHBhcnRpY3VsYXJseSBtYXR0ZXJzIGJlY2F1c2Ugb2YgdGhlIHNoaWZ0IGJpdHMuICAqLwotICAgICAgaWYgKHN0cmV0Y2ggIT0gMAotCSAgJiYgKHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3MKLQkgICAgICA+PSBmcmFncC0+ZnJfYWRkcmVzcykpCi0JewotCSAgZnJhZ1MgKmY7Ci0KLQkgIC8qIEFkanVzdCBzdHJldGNoIGZvciBhbnkgYWxpZ25tZW50IGZyYWcuICBOb3RlIHRoYXQgaWYgaGF2ZQotICAgICAgICAgICAgIGJlZW4gZXhwYW5kaW5nIHRoZSBlYXJsaWVyIGNvZGUsIHRoZSBzeW1ib2wgbWF5IGJlCi0gICAgICAgICAgICAgZGVmaW5lZCBpbiB3aGF0IGFwcGVhcnMgdG8gYmUgYW4gZWFybGllciBmcmFnLiAgRklYTUU6Ci0gICAgICAgICAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSB0aGUgZnJfc3VidHlwZSBmaWVsZCwgd2hpY2ggc3BlY2lmaWVzCi0gICAgICAgICAgICAgYSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBza2lwIHdoZW4gZG9pbmcgYW4KLSAgICAgICAgICAgICBhbGlnbm1lbnQuICAqLwotCSAgZm9yIChmID0gZnJhZ3A7Ci0JICAgICAgIGYgIT0gTlVMTCAmJiBmICE9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCk7Ci0JICAgICAgIGYgPSBmLT5mcl9uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKGYtPmZyX3R5cGUgPT0gcnNfYWxpZ24gfHwgZi0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlKQotCQl7Ci0JCSAgaWYgKHN0cmV0Y2ggPCAwKQotCQkgICAgc3RyZXRjaCA9IC0gKCgtIHN0cmV0Y2gpCi0JCQkJICYgfiAoKDEgPDwgKGludCkgZi0+ZnJfb2Zmc2V0KSAtIDEpKTsKLQkJICBlbHNlCi0JCSAgICBzdHJldGNoICY9IH4gKCgxIDw8IChpbnQpIGYtPmZyX29mZnNldCkgLSAxKTsKLQkJICBpZiAoc3RyZXRjaCA9PSAwKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGYgIT0gTlVMTCkKLQkgICAgdmFsICs9IHN0cmV0Y2g7Ci0JfQotCi0gICAgICBhZGRyID0gZnJhZ3AtPmZyX2FkZHJlc3MgKyBmcmFncC0+ZnJfZml4OwotCi0gICAgICAvKiBUaGUgYmFzZSBhZGRyZXNzIHJ1bGVzIGFyZSBjb21wbGljYXRlZC4gIFRoZSBiYXNlIGFkZHJlc3Mgb2YKLSAgICAgICAgIGEgYnJhbmNoIGlzIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uICBUaGUgYmFzZSBhZGRyZXNzIG9mIGEKLSAgICAgICAgIFBDIHJlbGF0aXZlIGxvYWQgb3IgYWRkIGlzIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYsIGJ1dCBpZiBpdAotICAgICAgICAgaXMgaW4gYSBkZWxheSBzbG90IChpbiB3aGljaCBjYXNlIGl0IGNhbiBub3QgYmUgZXh0ZW5kZWQpIHVzZQotICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIHdob3NlIGRlbGF5IHNsb3QgaXQgaXMgaW4uICAqLwotICAgICAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotCXsKLQkgIGFkZHIgKz0gMjsKLQotCSAgLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3N1bWluZyB0aGF0IHRoaXMgZnJhZyBzaG91bGQgYmUKLQkgICAgIGV4dGVuZGVkLCB0aGVuLCB0aGUgY3VycmVudCBhZGRyZXNzIGlzIHR3byBieXRlcwotCSAgICAgaGlnaGVyLiAqLwotCSAgaWYgKFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICBhZGRyICs9IDI7Ci0KLQkgIC8qIElnbm9yZSB0aGUgbG93IGJpdCBpbiB0aGUgdGFyZ2V0LCBzaW5jZSBpdCB3aWxsIGJlIHNldAotICAgICAgICAgICAgIGZvciBhIHRleHQgbGFiZWwuICAqLwotCSAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCSAgICAtLXZhbDsKLQl9Ci0gICAgICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfSkFMX0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JYWRkciAtPSA0OwotICAgICAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JYWRkciAtPSAyOwotCi0gICAgICB2YWwgLT0gYWRkciAmIH4gKCgxIDw8IG9wLT5zaGlmdCkgLSAxKTsKLQotICAgICAgLyogQnJhbmNoIG9mZnNldHMgaGF2ZSBhbiBpbXBsaWNpdCAwIGluIHRoZSBsb3dlc3QgYml0LiAgKi8KLSAgICAgIGlmICh0eXBlID09ICdwJyB8fCB0eXBlID09ICdxJykKLQl2YWwgLz0gMjsKLQotICAgICAgLyogSWYgYW55IG9mIHRoZSBzaGlmdGVkIGJpdHMgYXJlIHNldCwgd2UgbXVzdCB1c2UgYW4gZXh0ZW5kZWQKLSAgICAgICAgIG9wY29kZS4gIElmIHRoZSBhZGRyZXNzIGRlcGVuZHMgb24gdGhlIHNpemUgb2YgdGhpcwotICAgICAgICAgaW5zdHJ1Y3Rpb24sIHRoaXMgY2FuIGxlYWQgdG8gYSBsb29wLCBzbyB3ZSBhcnJhbmdlIHRvIGFsd2F5cwotICAgICAgICAgdXNlIGFuIGV4dGVuZGVkIG9wY29kZS4gIFdlIG9ubHkgY2hlY2sgdGhpcyB3aGVuIHdlIGFyZSBpbgotICAgICAgICAgdGhlIG1haW4gcmVsYXhhdGlvbiBsb29wLCB3aGVuIFNFQyBpcyBOVUxMLiAgKi8KLSAgICAgIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMCAmJiBzZWMgPT0gTlVMTCkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9Ci0JICAgIFJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBhYm91dCB0byBtYXJrIGEgZnJhZyBhcyBleHRlbmRlZCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICAgICAgaXMgcHJlY2lzZWx5IG1heHRpbnkgKyAxLCB0aGVuIHRoZXJlIGlzIGEgY2hhbmNlIG9mIGFuCi0gICAgICAgICBpbmZpbml0ZSBsb29wIGFzIGluIHRoZSBmb2xsb3dpbmcgY29kZToKLQkgICAgIGxhCSQ0LGZvbwotCSAgICAgLnNraXAJMTAyMAotCSAgICAgLmFsaWduCTIKLQkgICBmb286Ci0JIEluIHRoaXMgY2FzZSB3aGVuIHRoZSBsYSBpcyBleHRlbmRlZCwgZm9vIGlzIDB4M2ZjIGJ5dGVzCi0JIGF3YXksIHNvIHRoZSBsYSBjYW4gYmUgc2hydW5rLCBidXQgdGhlbiBmb28gaXMgMHg0MDAgYXdheSwgc28KLQkgdGhlIGxhIG11c3QgYmUgZXh0ZW5kZWQuICBUbyBhdm9pZCB0aGlzIGxvb3AsIHdlIG1hcmsgdGhlCi0JIGZyYWcgYXMgZXh0ZW5kZWQgaWYgaXQgd2FzIHNtYWxsLCBhbmQgaXMgYWJvdXQgdG8gYmVjb21lCi0JIGV4dGVuZGVkIHdpdGggYSB2YWx1ZSBvZiBtYXh0aW55ICsgMS4gICovCi0gICAgICBpZiAodmFsID09ICgobWF4dGlueSArIDEpIDw8IG9wLT5zaGlmdCkKLQkgICYmICEgUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkKLQkgICYmIHNlYyA9PSBOVUxMKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0KLQkgICAgUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0ggKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN5bXNlYyAhPSBhYnNvbHV0ZV9zZWN0aW9uICYmIHNlYyAhPSBOVUxMKQotICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLCBfKCJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIikpOwotCi0gIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMAotICAgICAgfHwgdmFsIDwgKG1pbnRpbnkgPDwgb3AtPnNoaWZ0KQotICAgICAgfHwgdmFsID4gKG1heHRpbnkgPDwgb3AtPnNoaWZ0KSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhIGZyYWcgYmVmb3JlIHJlbGF4aW5nLiAgVW5sZXNzIHRoaXMgaXMgdGhlCi0gICBtaXBzMTYsIHdlIGFyZSBub3QgcmVhbGx5IHJlbGF4aW5nIGhlcmUsIGFuZCB0aGUgZmluYWwgc2l6ZSBpcwotICAgZW5jb2RlZCBpbiB0aGUgc3VidHlwZSBpbmZvcm1hdGlvbi4gIEZvciB0aGUgbWlwczE2LCB3ZSBoYXZlIHRvCi0gICBkZWNpZGUgd2hldGhlciB3ZSBhcmUgdXNpbmcgYW4gZXh0ZW5kZWQgb3Bjb2RlIG9yIG5vdC4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZ3R5cGUpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlZ3R5cGU7Ci17Ci0gIGludCBjaGFuZ2U7Ci0KLSAgaWYgKFJFTEFYX01JUFMxNl9QIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgewotICAgICAgaWYgKG1pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgc2VndHlwZSwgMCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSBSRUxBWF9NSVBTMTZfTUFSS19FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotCSAgcmV0dXJuIDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgfQotCi0gIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0gICAgewotICAgICAgY2hhbmdlID0gbm9waWNfbmVlZF9yZWxheCAoZnJhZ3AtPmZyX3N5bWJvbCwgMCk7Ci0gICAgfQotICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc3ltc2VjOwotCi0gICAgICBzeW0gPSBmcmFncC0+ZnJfc3ltYm9sOwotCi0gICAgICAvKiBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzeW1ib2wgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbC4gICovCi0gICAgICB3aGlsZSAoc3ltYm9sX2VxdWF0ZWRfcCAoc3ltKQotCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQl7Ci0JICBzeW1ib2xTICpuOwotCi0JICAvKiBJdCdzIHBvc3NpYmxlIHRvIGdldCBhIGxvb3AgaGVyZSBpbiBhIGJhZGx5IHdyaXR0ZW4KLSAgICAgICAgICAgICBwcm9ncmFtLiAgKi8KLQkgIG4gPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX3N5bWJvbDsKLQkgIGlmIChuID09IHN5bSkKLQkgICAgYnJlYWs7Ci0JICBzeW0gPSBuOwotCX0KLQotICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotICAgICAgLyogVGhpcyBtdXN0IGR1cGxpY2F0ZSB0aGUgdGVzdCBpbiBhZGp1c3RfcmVsb2Nfc3ltcy4gICovCi0gICAgICBjaGFuZ2UgPSAoc3ltc2VjICE9ICZiZmRfdW5kX3NlY3Rpb24KLQkJJiYgc3ltc2VjICE9ICZiZmRfYWJzX3NlY3Rpb24KLQkJJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNlYykpOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIGlmIChjaGFuZ2UpCi0gICAgewotICAgICAgLyogUmVjb3JkIHRoZSBvZmZzZXQgdG8gdGhlIGZpcnN0IHJlbG9jIGluIHRoZSBmcl9vcGNvZGUgZmllbGQuCi0JIFRoaXMgbGV0cyBtZF9jb252ZXJ0X2ZyYWcgYW5kIHRjX2dlbl9yZWxvYyBrbm93IHRoYXQgdGhlIGNvZGUKLQkgbXVzdCBiZSBleHBhbmRlZC4gICovCi0gICAgICBmcmFncC0+ZnJfb3Bjb2RlID0gKGZyYWdwLT5mcl9saXRlcmFsCi0JCQkgICsgZnJhZ3AtPmZyX2ZpeAotCQkJICAtIFJFTEFYX09MRCAoZnJhZ3AtPmZyX3N1YnR5cGUpCi0JCQkgICsgUkVMQVhfUkVMT0MxIChmcmFncC0+ZnJfc3VidHlwZSkpOwotICAgICAgLyogRklYTUU6IFRoaXMgcmVhbGx5IG5lZWRzIGFzX3dhcm5fd2hlcmUuICAqLwotICAgICAgaWYgKFJFTEFYX1dBUk4gKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlhc193YXJuIChfKCJBVCB1c2VkIGFmdGVyIFwiLnNldCBub2F0XCIgb3IgbWFjcm8gdXNlZCBhZnRlciBcIi5zZXQgbm9tYWNyb1wiIikpOwotICAgIH0KLQotICBpZiAoISBjaGFuZ2UpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gUkVMQVhfTkVXIChmcmFncC0+ZnJfc3VidHlwZSkgLSBSRUxBWF9PTEQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wKLSAgIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLiAgRG9uJ3QgYWRqdXN0Ci0gICBNSVBTMTYganVtcCByZWxvY2F0aW9ucywgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZm9ybWF0Ci0gICBvZiB0aGUgb2Zmc2V0IGluIHRoZSAubyBmaWxlLiAgRG9uJ3QgYWRqdXN0IHJlbG9jYXRpb25zIGFnYWluc3QKLSAgIG1pcHMxNiBzeW1ib2xzLCBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIGZpbmQgdGhlbSBpZiBpdCBuZWVkcyB0byBzZXQKLSAgIHVwIGEgc3R1Yi4gICovCi0KLWludAotbWlwc19maXhfYWRqdXN0YWJsZSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIFNfR0VUX09USEVSIChmaXhwLT5meF9hZGRzeSkgPT0gU1RPX01JUFMxNgotICAgICAgJiYgZml4cC0+Znhfc3Vic3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICByZXR1cm4gMTsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICAqLwotCi1hcmVsZW50ICoqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhwOwotewotICBzdGF0aWMgYXJlbGVudCAqcmV0dmFsWzRdOwotICBhcmVsZW50ICpyZWxvYzsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgcmVsb2MgPSByZXR2YWxbMF0gPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmV0dmFsWzFdID0gTlVMTDsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLSAgICAgICYmIFNXSVRDSF9UQUJMRSAoZml4cCkpCi0gICAgewotICAgICAgLyogRm9yIGEgc3dpdGNoIHRhYmxlIGVudHJ5IHdlIHVzZSBhIHNwZWNpYWwgcmVsb2MuICBUaGUgYWRkZW5kCi0JIGlzIGFjdHVhbGx5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIHRoZQotCSBzdWJ0cmFoZW5kLiAgKi8KLSAgICAgIHJlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkcmVzcyAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JYXNfZmF0YWwgKF8oIkRvdWJsZSBjaGVjayBmeF9yX3R5cGUgaW4gdGMtbWlwcy5jOnRjX2dlbl9yZWxvYyIpKTsKLSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19HUFJFTDMyOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwgPT0gMCB8fCBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZSBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9MTzE2KQotICAgIHsKLSAgICAgIC8qIFdlIHVzZSBhIHNwZWNpYWwgYWRkZW5kIGZvciBhbiBpbnRlcm5hbCBSRUxMTyByZWxvYy4gICovCi0gICAgICBpZiAoc3ltYm9sX3NlY3Rpb25fcCAoZml4cC0+ZnhfYWRkc3kpKQotCXJlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkcmVzcyAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBlbHNlCi0JcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlciArIHJlbG9jLT5hZGRyZXNzOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MpCi0gICAgewotICAgICAgYXNzZXJ0IChmaXhwLT5meF9uZXh0ICE9IE5VTEwKLQkgICAgICAmJiBmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpOwotICAgICAgLyogV2UgdXNlIGEgc3BlY2lhbCBhZGRlbmQgZm9yIGFuIGludGVybmFsIFJFTEhJIHJlbG9jLiAgVGhlCi0JIHJlbG9jIGlzIHJlbGF0aXZlIHRvIHRoZSBSRUxMTzsgYWRqdXN0IHRoZSBhZGRlbmQKLQkgYWNjb3JkaW5nbHkuICAqLwotICAgICAgaWYgKHN5bWJvbF9zZWN0aW9uX3AgKGZpeHAtPmZ4X2FkZHN5KSkKLQlyZWxvYy0+YWRkZW5kID0gKGZpeHAtPmZ4X25leHQtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJCSArIGZpeHAtPmZ4X25leHQtPmZ4X3doZXJlCi0JCQkgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpKTsKLSAgICAgIGVsc2UKLQlyZWxvYy0+YWRkZW5kID0gKGZpeHAtPmZ4X2FkZG51bWJlcgotCQkJICsgZml4cC0+ZnhfbmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkJICsgZml4cC0+ZnhfbmV4dC0+Znhfd2hlcmUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotCS8qIEEgZ3J1ZXNvbWUgaGFjayB3aGljaCBpcyBhIHJlc3VsdCBvZiB0aGUgZ3J1ZXNvbWUgZ2FzIHJlbG9jCi0JICAgaGFuZGxpbmcuICAqLwotCXJlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkcmVzczsKLSAgICAgIGVsc2UKLQlyZWxvYy0+YWRkZW5kID0gLXJlbG9jLT5hZGRyZXNzOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgdmFyaWFudCBmcmFnLCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nCi0gICAgIHJlbG9jIGFuZCBnZW5lcmF0ZSBhIG5ldyBvbmUuICAqLwotICBpZiAoZml4cC0+ZnhfZnJhZy0+ZnJfb3Bjb2RlICE9IE5VTEwKLSAgICAgICYmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1QxNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTEwxNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2Ci0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR09UX0xPMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYpKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbG9jMjsKLQotICAgICAgYXNzZXJ0ICghIFJFTEFYX01JUFMxNl9QIChmaXhwLT5meF9mcmFnLT5mcl9zdWJ0eXBlKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IHJlbG9jIGluIHRoaXMgZnJhZywgdGhlbiB3ZSBoYXZlIHR3bwotCSBHUFJFTCByZWxvY3MsIG9yIGEgR09UX0hJMTYvR09UX0xPMTYgcGFpciwgb3IgYQotCSBDQUxMX0hJMTYvQ0FMTF9MTzE2LCBib3RoIG9mIHdoaWNoIGFyZSBiZWluZyByZXBsYWNlZC4gIExldAotCSB0aGUgc2Vjb25kIG9uZSBoYW5kbGUgYWxsIG9mIHRoZW0uICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X25leHQgIT0gTlVMTAotCSAgJiYgZml4cC0+ZnhfZnJhZyA9PSBmaXhwLT5meF9uZXh0LT5meF9mcmFnKQotCXsKLQkgIGFzc2VydCAoKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTAotCQkgICAmJiBmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JCSAgfHwgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNgotCQkgICAgICAmJiAoZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlCi0JCQkgID09IEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KSkKLQkJICB8fCAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNgotCQkgICAgICAmJiAoZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlCi0JCQkgID09IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNikpKTsKLQkgIHJldHZhbFswXSA9IE5VTEw7Ci0JICByZXR1cm4gcmV0dmFsOwotCX0KLQotICAgICAgZml4cC0+Znhfd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9vcGNvZGUgLSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICAgICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICByZWxvYzIgPSByZXR2YWxbMV0gPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgICAgIHJldHZhbFsyXSA9IE5VTEw7Ci0gICAgICByZWxvYzItPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICAqcmVsb2MyLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvYzItPmFkZHJlc3MgPSAocmVsb2MtPmFkZHJlc3MKLQkJCSArIChSRUxBWF9SRUxPQzIgKGZpeHAtPmZ4X2ZyYWctPmZyX3N1YnR5cGUpCi0JCQkgICAgLSBSRUxBWF9SRUxPQzEgKGZpeHAtPmZ4X2ZyYWctPmZyX3N1YnR5cGUpKSk7Ci0gICAgICByZWxvYzItPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgICAgIHJlbG9jMi0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgYXNzZXJ0IChyZWxvYzItPmhvd3RvICE9IE5VTEwpOwotCi0gICAgICBpZiAoUkVMQVhfUkVMT0MzIChmaXhwLT5meF9mcmFnLT5mcl9zdWJ0eXBlKSkKLQl7Ci0JICBhcmVsZW50ICpyZWxvYzM7Ci0KLQkgIHJlbG9jMyA9IHJldHZhbFsyXSA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCSAgcmV0dmFsWzNdID0gTlVMTDsKLQkgICpyZWxvYzMgPSAqcmVsb2MyOwotCSAgcmVsb2MzLT5hZGRyZXNzICs9IDQ7Ci0JfQotCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCXsKLQkgIGFzc2VydCAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLQkgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19ISTE2X1M7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1QxNjoKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR09UX0xPMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2OgotCSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19NSVBTX0dPVDE2OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLQotICAvKiBTaW5jZSBNSVBTIEVMRiB1c2VzIFJlbCBpbnN0ZWFkIG9mIFJlbGEsIGVuY29kZSB0aGUgdnRhYmxlIGVudHJ5Ci0gICAgIHRvIGJlIHVzZWQgaW4gdGhlIHJlbG9jYXRpb24ncyBzZWN0aW9uIG9mZnNldC4gICovCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICB7Ci0gICAgICByZWxvYy0+YWRkcmVzcyA9IHJlbG9jLT5hZGRlbmQ7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgLyogU2luY2UgRElGRl9FWFBSX09LIGlzIGRlZmluZWQgaW4gdGMtbWlwcy5oLCBpdCBpcyBwb3NzaWJsZSB0aGF0Ci0gICAgIGZpeHVwX3NlZ21lbnQgY29udmVydGVkIGEgbm9uLVBDIHJlbGF0aXZlIHJlbG9jIGludG8gYSBQQwotICAgICByZWxhdGl2ZSByZWxvYy4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIHJlbG9jCi0gICAgIGNvZGUuICAqLwotICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgc3dpdGNoIChjb2RlKQotCXsKLQljYXNlIEJGRF9SRUxPQ184OgotCSAgY29kZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfMTY6Ci0JICBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfNjQ6Ci0JICBjb2RlID0gQkZEX1JFTE9DXzY0X1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ182NF9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKLQljYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0JY2FzZSBCRkRfUkVMT0NfUENSRUxfTE8xNjoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQlfKCJDYW5ub3QgbWFrZSAlcyByZWxvY2F0aW9uIFBDIHJlbGF0aXZlIiksCi0JCQliZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotCX0KLSAgICB9Ci0KLSAgLyogVG8gc3VwcG9ydCBhIFBDIHJlbGF0aXZlIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZQotICAgICBmb3IgRUNPRkYsIHdlIHVzZSBhIEN5Z251cyBleHRlbnNpb24uICBXZSBjaGVjayBmb3IgdGhhdCBoZXJlIHRvCi0gICAgIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGxldCBzdWNoIGEgcmVsb2MgZXNjYXBlIG5vcm1hbGx5LiAgKi8KLSAgaWYgKChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgIHx8IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICAgICYmIGNvZGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyCi0gICAgICAmJiBtaXBzX3BpYyAhPSBFTUJFRERFRF9QSUMpCi0gICAgcmVsb2MtPmhvd3RvID0gTlVMTDsKLSAgZWxzZQotICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLQotICBpZiAocmVsb2MtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIHJldHZhbFswXSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qIFJlbGF4IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gIFRoaXMgcmV0dXJucyB0aGUgYW1vdW50IGJ5IHdoaWNoCi0gICB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBmcmFnIHNob3VsZCBjaGFuZ2UuICAqLwotCi1pbnQKLW1pcHNfcmVsYXhfZnJhZyAoZnJhZ3AsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgbG9uZyBzdHJldGNoOwotewotICBpZiAoISBSRUxBWF9NSVBTMTZfUCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHJldHVybiAwOwotCi0gIGlmIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyAoZnJhZ3AsIChhc2VjdGlvbiAqKSBOVUxMLCBzdHJldGNoKSkKLSAgICB7Ci0gICAgICBpZiAoUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JcmV0dXJuIDA7Ci0gICAgICBmcmFncC0+ZnJfc3VidHlwZSA9IFJFTEFYX01JUFMxNl9NQVJLX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlyZXR1cm4gMDsKLSAgICAgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICByZXR1cm4gLTI7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBDb252ZXJ0IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgYXNlYywgZnJhZ3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBhc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGludCBvbGQsIG5ldzsKLSAgY2hhciAqZml4cHRyOwotCi0gIGlmIChSRUxBWF9NSVBTMTZfUCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotICAgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHMxNl9pbW1lZF9vcGVyYW5kICpvcDsKLSAgICAgIGJvb2xlYW4gc21hbGwsIGV4dDsKLSAgICAgIG9mZnNldFQgdmFsOwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGV4dGVuZDsKLQotICAgICAgdHlwZSA9IFJFTEFYX01JUFMxNl9UWVBFIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICBvcCA9IG1pcHMxNl9pbW1lZF9vcGVyYW5kczsKLSAgICAgIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQotCSsrb3A7Ci0KLSAgICAgIGlmIChSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQl7Ci0JICBzbWFsbCA9IGZhbHNlOwotCSAgZXh0ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc21hbGwgPSB0cnVlOwotCSAgZXh0ID0gZmFsc2U7Ci0JfQotCi0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZnJhZ3AtPmZyX3N5bWJvbCwgMSk7Ci0gICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoZnJhZ3AtPmZyX3N5bWJvbCk7Ci0gICAgICBpZiAob3AtPnBjcmVsKQotCXsKLQkgIGFkZHJlc3NUIGFkZHI7Ci0KLQkgIGFkZHIgPSBmcmFncC0+ZnJfYWRkcmVzcyArIGZyYWdwLT5mcl9maXg7Ci0KLQkgIC8qIFRoZSBydWxlcyBmb3IgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jIGFyZQotICAgICAgICAgICAgIGNvbXBsaWNhdGVkOyBzZWUgbWlwczE2X2V4dGVuZGVkX2ZyYWcuICAqLwotCSAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotCSAgICB7Ci0JICAgICAgYWRkciArPSAyOwotCSAgICAgIGlmIChleHQpCi0JCWFkZHIgKz0gMjsKLQkgICAgICAvKiBJZ25vcmUgdGhlIGxvdyBiaXQgaW4gdGhlIHRhcmdldCwgc2luY2UgaXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICBzZXQgZm9yIGEgdGV4dCBsYWJlbC4gICovCi0JICAgICAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCQktLXZhbDsKLQkgICAgfQotCSAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICBhZGRyIC09IDQ7Ci0JICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQkgICAgYWRkciAtPSAyOwotCi0JICBhZGRyICY9IH4gKGFkZHJlc3NUKSAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpOwotCSAgdmFsIC09IGFkZHI7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiB3aW5kcyB1cCB3aXRoIHRoZSBhbGlnbm1lbnQgd2UgaGF2ZQotICAgICAgICAgICAgIGFzc3VtZWQuICAqLwotCSAgaWYgKG9wLT5zaGlmdCA+IDApCi0JICAgIHJlY29yZF9hbGlnbm1lbnQgKGFzZWMsIG9wLT5zaGlmdCk7Ci0JfQotCi0gICAgICBpZiAoZXh0Ci0JICAmJiAoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpCi0JICAgICAgfHwgUkVMQVhfTUlQUzE2X0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpKQotCWFzX3dhcm5fd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwKLQkJICAgICAgIF8oImV4dGVuZGVkIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiKSk7Ci0KLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSAoZnJhZ3AtPmZyX2xpdGVyYWwgKyBmcmFncC0+ZnJfZml4KTsKLQotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWluc24gPSBiZmRfZ2V0YjE2IChidWYpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDE2IChidWYpOwotCi0gICAgICBtaXBzMTZfaW1tZWQgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwgdHlwZSwgdmFsLAotCQkgICAgUkVMQVhfTUlQUzE2X1VTRVJfRVhUIChmcmFncC0+ZnJfc3VidHlwZSksCi0JCSAgICBzbWFsbCwgZXh0LCAmaW5zbiwgJnVzZV9leHRlbmQsICZleHRlbmQpOwotCi0gICAgICBpZiAodXNlX2V4dGVuZCkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgMHhmMDAwIHwgZXh0ZW5kLCAyKTsKLQkgIGZyYWdwLT5mcl9maXggKz0gMjsKLQkgIGJ1ZiArPSAyOwotCX0KLQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIGluc24sIDIpOwotICAgICAgZnJhZ3AtPmZyX2ZpeCArPSAyOwotICAgICAgYnVmICs9IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGZyYWdwLT5mcl9vcGNvZGUgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICAgIG9sZCA9IFJFTEFYX09MRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotICAgICAgbmV3ID0gUkVMQVhfTkVXIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICBmaXhwdHIgPSBmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXg7Ci0KLSAgICAgIGlmIChuZXcgPiAwKQotCW1lbWNweSAoZml4cHRyIC0gb2xkLCBmaXhwdHIsIG5ldyk7Ci0KLSAgICAgIGZyYWdwLT5mcl9maXggKz0gbmV3IC0gb2xkOwotICAgIH0KLX0KLQotI2lmZGVmIE9CSl9FTEYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHJlbG9jcyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotICAgV2UndmUgYmVlbiBzdG9yaW5nIG1pcHMxNiB0ZXh0IGxhYmVscyBhcyBvZGQuICBIZXJlIHdlIGNvbnZlcnQgdGhlbQotICAgYmFjayB0byBldmVuIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIGRlYnVnZ2VyLiAgKi8KLQotdm9pZAotbWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpCi17Ci0gIGFzeW1ib2wgKipzeW1zOwotICB1bnNpZ25lZCBpbnQgY291bnQsIGk7Ci0KLSAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm47Ci0KLSAgc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoc3Rkb3V0cHV0KTsKLSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChzdGRvdXRwdXQpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltcysrKQotICAgIHsKLSAgICAgIGlmIChlbGZfc3ltYm9sICgqc3ltcyktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIgPT0gU1RPX01JUFMxNgotCSAgJiYgKCgqc3ltcyktPnZhbHVlICYgMSkgIT0gMCkKLQl7Ci0JICAoKnN5bXMpLT52YWx1ZSAmPSB+MTsKLQkgIC8qIElmIHRoZSBzeW1ib2wgaGFzIGFuIG9kZCBzaXplLCBpdCB3YXMgcHJvYmFibHkgY29tcHV0ZWQKLQkgICAgIGluY29ycmVjdGx5LCBzbyBhZGp1c3QgdGhhdCBhcyB3ZWxsLiAgKi8KLQkgIGlmICgoZWxmX3N5bWJvbCAoKnN5bXMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgJiAxKSAhPSAwKQotCSAgICArK2VsZl9zeW1ib2wgKCpzeW1zKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIGxhYmVsIGlzIGRlZmluZWQuICBJdCBpcyB1c2VkCi0gICB3aGVuIGhhbmRsaW5nIGJyYW5jaCBkZWxheXM7IGlmIGEgYnJhbmNoIGhhcyBhIGxhYmVsLCB3ZSBhc3N1bWUgd2UKLSAgIGNhbiBub3QgbW92ZSBpdC4gICovCi0KLXZvaWQKLW1pcHNfZGVmaW5lX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotICBpZiAoZnJlZV9pbnNuX2xhYmVscyA9PSBOVUxMKQotICAgIGwgPSAoc3RydWN0IGluc25fbGFiZWxfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKmwpOwotICBlbHNlCi0gICAgewotICAgICAgbCA9IGZyZWVfaW5zbl9sYWJlbHM7Ci0gICAgICBmcmVlX2luc25fbGFiZWxzID0gbC0+bmV4dDsKLSAgICB9Ci0KLSAgbC0+bGFiZWwgPSBzeW07Ci0gIGwtPm5leHQgPSBpbnNuX2xhYmVsczsKLSAgaW5zbl9sYWJlbHMgPSBsOwotfQotDAotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0KLS8qIFNvbWUgc3BlY2lhbCBwcm9jZXNzaW5nIGZvciBhIE1JUFMgRUxGIGZpbGUuICAqLwotCi12b2lkCi1taXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nICgpCi17Ci0gIC8qIFdyaXRlIG91dCB0aGUgcmVnaXN0ZXIgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBtaXBzXzY0KQotICAgIHsKLSAgICAgIEVsZjMyX1JlZ0luZm8gczsKLQotICAgICAgcy5yaV9ncHJtYXNrID0gbWlwc19ncHJtYXNrOwotICAgICAgcy5yaV9jcHJtYXNrWzBdID0gbWlwc19jcHJtYXNrWzBdOwotICAgICAgcy5yaV9jcHJtYXNrWzFdID0gbWlwc19jcHJtYXNrWzFdOwotICAgICAgcy5yaV9jcHJtYXNrWzJdID0gbWlwc19jcHJtYXNrWzJdOwotICAgICAgcy5yaV9jcHJtYXNrWzNdID0gbWlwc19jcHJtYXNrWzNdOwotICAgICAgLyogVGhlIGdwX3ZhbHVlIGZpZWxkIGlzIHNldCBieSB0aGUgTUlQUyBFTEYgYmFja2VuZC4gICovCi0KLSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKHN0ZG91dHB1dCwgJnMsCi0JCQkJICAgICAgICgoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkJCQltaXBzX3JlZ21hc2tfZnJhZykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gczsKLQotICAgICAgcy5yaV9ncHJtYXNrID0gbWlwc19ncHJtYXNrOwotICAgICAgcy5yaV9wYWQgPSAwOwotICAgICAgcy5yaV9jcHJtYXNrWzBdID0gbWlwc19jcHJtYXNrWzBdOwotICAgICAgcy5yaV9jcHJtYXNrWzFdID0gbWlwc19jcHJtYXNrWzFdOwotICAgICAgcy5yaV9jcHJtYXNrWzJdID0gbWlwc19jcHJtYXNrWzJdOwotICAgICAgcy5yaV9jcHJtYXNrWzNdID0gbWlwc19jcHJtYXNrWzNdOwotICAgICAgLyogVGhlIGdwX3ZhbHVlIGZpZWxkIGlzIHNldCBieSB0aGUgTUlQUyBFTEYgYmFja2VuZC4gICovCi0KLSAgICAgIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQgKHN0ZG91dHB1dCwgJnMsCi0JCQkJICAgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkJCQltaXBzX3JlZ21hc2tfZnJhZykpOwotICAgIH0KLQotICAvKiBTZXQgdGhlIE1JUFMgRUxGIGZsYWcgYml0cy4gIEZJWE1FOiBUaGVyZSBzaG91bGQgcHJvYmFibHkgYmUgc29tZQotICAgICBzb3J0IG9mIEJGRCBpbnRlcmZhY2UgZm9yIHRoaXMuICAqLwotICBpZiAobWlwc19hbnlfbm9yZW9yZGVyKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfTUlQU19OT1JFT1JERVI7Ci0gIGlmIChtaXBzX3BpYyAhPSBOT19QSUMpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9NSVBTX1BJQzsKLQotICAvKiBTZXQgdGhlIE1JUFMgRUxGIEFCSSBmbGFncy4gKi8KLSAgaWYgKG1pcHNfYWJpX3N0cmluZyA9PSAwKQotICAgIDsKLSAgZWxzZSBpZiAoc3RyY21wIChtaXBzX2FiaV9zdHJpbmcsIjMyIikgPT0gMCkKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfTzMyOwotICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywibzY0IikgPT0gMCkKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfTzY0OwotICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywiZWFiaSIpID09IDApCi0gICAgewotICAgICAgaWYgKG1pcHNfZWFiaTY0KQotCWVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRV9NSVBTX0FCSV9FQUJJNjQ7Ci0gICAgICBlbHNlCi0JZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFX01JUFNfQUJJX0VBQkkzMjsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfMzJiaXRtb2RlKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfTUlQU18zMkJJVE1PREU7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfRUxGIHx8IE9CSl9NQVlCRV9FTEYgKi8KLQwKLXR5cGVkZWYgc3RydWN0IHByb2MKLSAgewotICAgIHN5bWJvbFMgKmlzeW07Ci0gICAgdW5zaWduZWQgbG9uZyByZWdfbWFzazsKLSAgICB1bnNpZ25lZCBsb25nIHJlZ19vZmZzZXQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmcHJlZ19tYXNrOwotICAgIHVuc2lnbmVkIGxvbmcgZnByZWdfb2Zmc2V0OwotICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfb2Zmc2V0OwotICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfcmVnOwotICAgIHVuc2lnbmVkIGxvbmcgcGNfcmVnOwotICB9Ci1wcm9jUzsKLQotc3RhdGljIHByb2NTIGN1cl9wcm9jOwotc3RhdGljIHByb2NTICpjdXJfcHJvY19wdHI7Ci1zdGF0aWMgaW50IG51bXByb2NzOwotCi0vKiBXaGVuIHdlIGFsaWduIGNvZGUgaW4gdGhlIC50ZXh0IHNlY3Rpb24gb2YgbWlwczE2LCB1c2UgdGhlIGNvcnJlY3QgdHdvCi0gICBieXRlIG5vcCBwYXR0ZXJuIG9mIDB4NjUwMCAobW92ZSAkMCwkMCkgKi8KLQotaW50Ci1taXBzX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKLSAgICAgaW50IG47Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGw7Ci0gICAgIGludCBsZW47Ci0gICAgIGludCBtYXg7Ci17Ci0gIGlmIChmaWxsID09IE5VTEwKLSAgICAgICYmIHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpCi0gICAgICAmJiBuID4gMQotICAgICAgJiYgbWlwc19vcHRzLm1pcHMxNikKLSAgICB7Ci0gICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiZV9ub3BbXSA9IHsgMHg2NSwgMHgwMCB9OwotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGVfbm9wW10gPSB7IDB4MDAsIDB4NjUgfTsKLQotICAgICAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0KLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICAgIAlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGJlX25vcCwgMiwgbWF4KTsgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIAlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGxlX25vcCwgMiwgbWF4KTsgICAgICAKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLW1kX29ial9iZWdpbiAoKQotewotfQotCi1zdGF0aWMgdm9pZAotbWRfb2JqX2VuZCAoKQotewotICAvKiBjaGVjayBmb3IgcHJlbWF0dXJlIGVuZCwgbmVzdGluZyBlcnJvcnMsIGV0YyAqLwotICBpZiAoY3VyX3Byb2NfcHRyKQotICAgIGFzX3dhcm4gKF8oIm1pc3NpbmcgYC5lbmQnIGF0IGVuZCBvZiBhc3NlbWJseSIpKTsKLX0KLQotc3RhdGljIGxvbmcKLWdldF9udW1iZXIgKCkKLXsKLSAgaW50IG5lZ2F0aXZlID0gMDsKLSAgbG9uZyB2YWwgPSAwOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIG5lZ2F0aXZlID0gMTsKLSAgICB9Ci0gIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgc2ltcGxlIG51bWJlci4iKSk7Ci0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnKQotICAgIHsKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ3gnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgd2hpbGUgKGlzeGRpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JICAgIHsKLQkgICAgICB2YWwgPDw9IDQ7Ci0JICAgICAgdmFsIHw9IGhleF92YWx1ZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKLQkgICAgfQotCSAgcmV0dXJuIG5lZ2F0aXZlID8gLXZhbCA6IHZhbDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotCSAgICB7Ci0JICAgICAgdmFsIDw8PSAzOwotCSAgICAgIHZhbCB8PSAqaW5wdXRfbGluZV9wb2ludGVyKysgLSAnMCc7Ci0JICAgIH0KLQkgIHJldHVybiBuZWdhdGl2ZSA/IC12YWwgOiB2YWw7Ci0JfQotICAgIH0KLSAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJWMnIDB4JTAyeFxuIiksCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciwgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBhc193YXJuIChfKCJJbnZhbGlkIG51bWJlciIpKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgdmFsICo9IDEwOwotICAgICAgdmFsICs9ICppbnB1dF9saW5lX3BvaW50ZXIrKyAtICcwJzsKLSAgICB9Ci0gIHJldHVybiBuZWdhdGl2ZSA/IC12YWwgOiB2YWw7Ci19Ci0KLS8qIFRoZSAuZmlsZSBkaXJlY3RpdmU7IGp1c3QgbGlrZSB0aGUgdXN1YWwgLmZpbGUgZGlyZWN0aXZlLCBidXQgdGhlcmUKLSAgIGlzIGFuIGluaXRpYWwgbnVtYmVyIHdoaWNoIGlzIHRoZSBFQ09GRiBmaWxlIGluZGV4LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZmlsZSAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGludCBsaW5lOwotCi0gIGxpbmUgPSBnZXRfbnVtYmVyICgpOwotICBzX2FwcF9maWxlICgwKTsKLX0KLQotCi0vKiBUaGUgLmVuZCBkaXJlY3RpdmUuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX2VuZCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHN5bWJvbFMgKnA7Ci0gIGludCBtYXliZV90ZXh0OwotCi0gIGlmICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIHAgPSBnZXRfc3ltYm9sICgpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwID0gTlVMTDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLSAgICBtYXliZV90ZXh0ID0gMTsKLSAgZWxzZQotICAgIG1heWJlX3RleHQgPSAwOwotI2Vsc2UKLSAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCi0gICAgbWF5YmVfdGV4dCA9IDE7Ci0gIGVsc2UKLSAgICBtYXliZV90ZXh0ID0gMDsKLSNlbmRpZgotCi0gIGlmICghbWF5YmVfdGV4dCkKLSAgICBhc193YXJuIChfKCIuZW5kIG5vdCBpbiB0ZXh0IHNlY3Rpb24iKSk7Ci0KLSAgaWYgKCFjdXJfcHJvY19wdHIpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZS4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzc2VydCAoU19HRVRfTkFNRSAocCkpOwotICAgICAgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAocCksIFNfR0VUX05BTUUgKGN1cl9wcm9jX3B0ci0+aXN5bSkpKQotCWFzX3dhcm4gKF8oIi5lbmQgc3ltYm9sIGRvZXMgbm90IG1hdGNoIC5lbnQgc3ltYm9sLiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSBtaXNzaW5nIG9yIHVua25vd24gc3ltYm9sIikpOwotCi0jaWZkZWYgTUlQU19TVEFCU19FTEYKLSAgewotICAgIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgICBzdWJzZWdUIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgZnJhZ1MgKnNhdmVkX2ZyYWcgPSBmcmFnX25vdzsKLSAgICB2YWx1ZVQgZG90OwotICAgIHNlZ1Qgc2VnOwotICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICBjaGFyICpmcmFncDsKLQotICAgIGRvdCA9IGZyYWdfbm93X2ZpeCAoKTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gICAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAgIGFzc2VydCAocGRyX3NlZyk7Ci0gICAgc3Vic2VnX3NldCAocGRyX3NlZywgMCk7Ci0KLSAgICAvKiBXcml0ZSB0aGUgc3ltYm9sICovCi0gICAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICBleHAuWF9hZGRfc3ltYm9sID0gcDsKLSAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICBlbWl0X2V4cHIgKCZleHAsIDQpOwotCi0gICAgZnJhZ3AgPSBmcmFnX21vcmUgKDcqNCk7Ci0KLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwLCAgICAgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5yZWdfbWFzaywgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArIDQsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+cmVnX29mZnNldCwgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArIDgsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnByZWdfbWFzaywgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMTIsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnByZWdfb2Zmc2V0LCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsxNiwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcmFtZV9vZmZzZXQsIDQpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKzIwLCAodmFsdWVUKSBjdXJfcHJvY19wdHItPmZyYW1lX3JlZywgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMjQsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+cGNfcmVnLCA0KTsKLQotICAgIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKLSAgfQotI2VuZGlmCi0KLSAgY3VyX3Byb2NfcHRyID0gTlVMTDsKLX0KLQotLyogVGhlIC5hZW50IGFuZCAuZW50IGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX2VudCAoYWVudCkKLSAgICAgaW50IGFlbnQ7Ci17Ci0gIGludCBudW1iZXIgPSAwOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgbWF5YmVfdGV4dDsKLQotICBzeW1ib2xQID0gZ2V0X3N5bWJvbCAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgIG51bWJlciA9IGdldF9udW1iZXIgKCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpICYgU0VDX0NPREUpICE9IDApCi0gICAgbWF5YmVfdGV4dCA9IDE7Ci0gIGVsc2UKLSAgICBtYXliZV90ZXh0ID0gMDsKLSNlbHNlCi0gIGlmIChub3dfc2VnICE9IGRhdGFfc2VjdGlvbiAmJiBub3dfc2VnICE9IGJzc19zZWN0aW9uKQotICAgIG1heWJlX3RleHQgPSAxOwotICBlbHNlCi0gICAgbWF5YmVfdGV4dCA9IDA7Ci0jZW5kaWYKLQotICBpZiAoIW1heWJlX3RleHQpCi0gICAgYXNfd2FybiAoXygiLmVudCBvciAuYWVudCBub3QgaW4gdGV4dCBzZWN0aW9uLiIpKTsKLQotICBpZiAoIWFlbnQgJiYgY3VyX3Byb2NfcHRyKQotICAgIGFzX3dhcm4gKF8oIm1pc3NpbmcgYC5lbmQnIikpOwotCi0gIGlmICghYWVudCkKLSAgICB7Ci0gICAgICBjdXJfcHJvY19wdHIgPSAmY3VyX3Byb2M7Ci0gICAgICBtZW1zZXQgKGN1cl9wcm9jX3B0ciwgJ1wwJywgc2l6ZW9mIChwcm9jUykpOwotCi0gICAgICBjdXJfcHJvY19wdHItPmlzeW0gPSBzeW1ib2xQOwotCi0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQotICAgICAgbnVtcHJvY3MrKzsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5mcmFtZSBkaXJlY3RpdmUuIElmIHRoZSBtZGVidWcgc2VjdGlvbiBpcyBwcmVzZW50IChJUklYIDUgbmF0aXZlKQotICAgdGhlbiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZnJhbWUpIGlzIHVzZWQuIEZvciBlbWJlZGRlZCB0YXJnZXRzLCAKLSAgIHNfbWlwc19mcmFtZSBpcyB1c2VkIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgUERSIGluZm9ybWF0aW9uIGNvcnJlY3RseS4KLSAgIFdlIGNhbid0IHVzZSB0aGUgZWNvZmYgcm91dGluZXMgYmVjYXVzZSB0aGV5IG1ha2UgcmVmZXJlbmNlIHRvIHRoZSBlY29mZiAKLSAgIHN5bWJvbCB0YWJsZSAoaW4gdGhlIG1kZWJ1ZyBzZWN0aW9uKS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZnJhbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotCi0gIGxvbmcgdmFsOwotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gIChwcm9jUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5mcmFtZSBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPmZyYW1lX3JlZyA9IHRjX2dldF9yZWdpc3RlciAoMSk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJwotICAgICAgfHwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZyYW1lIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5mcmFtZV9vZmZzZXQgPSB2YWw7Ci0gIGN1cl9wcm9jX3B0ci0+cGNfcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgwKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotI2Vsc2UKLSAgc19pZ25vcmUgKGlnbm9yZSk7Ci0jZW5kaWYgLyogTUlQU19TVEFCU19FTEYgKi8KLX0KLQotLyogVGhlIC5mbWFzayBhbmQgLm1hc2sgZGlyZWN0aXZlcy4gSWYgdGhlIG1kZWJ1ZyBzZWN0aW9uIGlzIHByZXNlbnQgCi0gICAoSVJJWCA1IG5hdGl2ZSkgdGhlbiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfbWFzaykgaXMgdXNlZC4gRm9yIAotICAgZW1iZWRkZWQgdGFyZ2V0cywgc19taXBzX21hc2sgaXMgdXNlZCBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIFBEUgotICAgaW5mb3JtYXRpb24gY29ycmVjdGx5LiBXZSBjYW4ndCB1c2UgdGhlIGVjb2ZmIHJvdXRpbmVzIGJlY2F1c2UgdGhleSAKLSAgIG1ha2UgcmVmZXJlbmNlIHRvIHRoZSBlY29mZiBzeW1ib2wgdGFibGUgKGluIHRoZSBtZGVidWcgc2VjdGlvbikuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX21hc2sgKHJlZ190eXBlKQotICAgICBjaGFyIHJlZ190eXBlOwotewotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0gIGxvbmcgbWFzaywgb2ZmOwotICAKLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY1MgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubWFzay8uZm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmbWFzaykgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAubWFzay8uZm1hc2sgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBvZmYgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBpZiAocmVnX3R5cGUgPT0gJ0YnKQotICAgIHsKLSAgICAgIGN1cl9wcm9jX3B0ci0+ZnByZWdfbWFzayA9IG1hc2s7Ci0gICAgICBjdXJfcHJvY19wdHItPmZwcmVnX29mZnNldCA9IG9mZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjdXJfcHJvY19wdHItPnJlZ19tYXNrID0gbWFzazsKLSAgICAgIGN1cl9wcm9jX3B0ci0+cmVnX29mZnNldCA9IG9mZjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSNlbHNlCi0gIHNfaWdub3JlIChyZWdfdHlwZSk7Ci0jZW5kaWYgLyogTUlQU19TVEFCU19FTEYgKi8KLX0KLQotLyogVGhlIC5sb2MgZGlyZWN0aXZlLiAgKi8KLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1zX2xvYyAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBsaW5lbm87Ci0gIGludCBhZGRyb2ZmOwotCi0gIGFzc2VydCAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pOwotCi0gIGxpbmVubyA9IGdldF9udW1iZXIgKCk7Ci0gIGFkZHJvZmYgPSBmcmFnX25vd19maXggKCk7Ci0KLSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKCIiLCBOX1NMSU5FLCBhZGRyb2ZmLCBmcmFnX25vdyk7Ci0gIFNfU0VUX1RZUEUgKHN5bWJvbFAsIE5fU0xJTkUpOwotICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX0RFU0MgKHN5bWJvbFAsIGxpbmVubyk7Ci0gIHN5bWJvbFAtPnN5X3NlZ21lbnQgPSBub3dfc2VnOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1pcHMuaCBiL2dhcy9jb25maWcvdGMtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA4Yjc1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qIHRjLW1pcHMuaCAtLSBoZWFkZXIgZmlsZSBmb3IgdGMtbWlwcy5jLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBPU0YgYW5kIFJhbHBoIENhbXBiZWxsLgotICAgV3JpdHRlbiBieSBLZWl0aCBLbm93bGVzIGFuZCBSYWxwaCBDYW1wYmVsbCwgd29ya2luZyBpbmRlcGVuZGVudGx5LgotICAgTW9kaWZpZWQgZm9yIEVDT0ZGIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFRDX01JUFMKLQotI2RlZmluZSBUQ19NSVBTCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmcmFnOwotc3RydWN0IGV4cHJlc3Npb25TOwotI2VuZGlmCi0KLS8qIERlZmF1bHQgdG8gYmlnIGVuZGlhbi4gICovCi0jaWZuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCQkxCi0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9taXBzCi0KLSNkZWZpbmUgT05MWV9TVEFOREFSRF9FU0NBUEVTCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQJMQotI2RlZmluZSBPTERfRkxPQVRfUkVBRFMKLSNkZWZpbmUgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLSNkZWZpbmUgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi0jZGVmaW5lIE1BWF9SRUxPQ19FWFBBTlNJT04gMwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBNYXhpbXVtIHN5bWJvbCBvZmZzZXQgdGhhdCBjYW4gYmUgZW5jb2RlZCBpbiBhIEJGRF9SRUxPQ19NSVBTX0dQUkVMCi0gICByZWxvY2F0aW9uOiAqLwotI2RlZmluZSBNQVhfR1BSRUxfT0ZGU0VUICgweDdGRjQpCi0KLSNkZWZpbmUgbWRfcmVsYXhfZnJhZyhmcmFncCwgc3RyZXRjaCkgbWlwc19yZWxheF9mcmFnKGZyYWdwLCBzdHJldGNoKQotZXh0ZXJuIGludCBtaXBzX3JlbGF4X2ZyYWcgUEFSQU1TICgoc3RydWN0IGZyYWcgKiwgbG9uZykpOwotCi0jZGVmaW5lIG1kX3VuZGVmaW5lZF9zeW1ib2wobmFtZSkJKDApCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGludCBtaXBzX2RvX2FsaWduIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotI2RlZmluZSBtZF9kb19hbGlnbihuLGZpbGwsbGVuLG1heCxsKSBpZiAobWlwc19kb19hbGlnbiAobixmaWxsLGxlbixtYXgpKSBnb3RvIGwKLQotLyogV2UgcGVybWl0IFBDIHJlbGF0aXZlIGRpZmZlcmVuY2UgZXhwcmVzc2lvbnMgd2hlbiBnZW5lcmF0aW5nCi0gICBlbWJlZGRlZCBQSUMgY29kZS4gICovCi0jZGVmaW5lIERJRkZfRVhQUl9PSwotCi0vKiBUZWxsIGFzc2VtYmxlciB0aGF0IHdlIGhhdmUgYW4gaXRibF9taXBzLmggaGVhZGVyIGZpbGUgdG8gaW5jbHVkZS4gKi8KLSNkZWZpbmUgSEFWRV9JVEJMX0NQVQotCi0vKiBUaGUgZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0IGZvcm1hdCBtYXkgY2hhbmdlIGJhc2VkIG9uIGNvbW1hbmQKLSAgIGxpbmUgYXJndW1lbnRzLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCBtaXBzX3RhcmdldF9mb3JtYXQoKQotZXh0ZXJuIGNvbnN0IGNoYXIgKm1pcHNfdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0cnVjdCBtaXBzX2NsX2luc24KLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuX29wY29kZTsKLSAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICppbnNuX21vOwotICAvKiBUaGUgbmV4dCB0d28gZmllbGRzIGFyZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBtaXBzMTYgY29kZS4gICovCi0gIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgdW5zaWduZWQgc2hvcnQgZXh0ZW5kOwotfTsKLQotZXh0ZXJuIGludCB0Y19nZXRfcmVnaXN0ZXIgUEFSQU1TICgoaW50IGZyYW1lKSk7Ci0KLSNkZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzKCkgbWlwc19pbml0X2FmdGVyX2FyZ3MoKQotZXh0ZXJuIHZvaWQgbWlwc19pbml0X2FmdGVyX2FyZ3MgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIG1kX3BhcnNlX2xvbmdfb3B0aW9uKGFyZykgbWlwc19wYXJzZV9sb25nX29wdGlvbiAoYXJnKQotZXh0ZXJuIGludCBtaXBzX3BhcnNlX2xvbmdfb3B0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBtaXBzX2RlZmluZV9sYWJlbCAoc3ltKQotZXh0ZXJuIHZvaWQgbWlwc19kZWZpbmVfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNkZWZpbmUgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QoKSBtaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpCi1leHRlcm4gdm9pZCBtaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSB0Y19mcm9iX2ZpbGUoKSBtaXBzX2Zyb2JfZmlsZSAoKQotZXh0ZXJuIHZvaWQgbWlwc19mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLSNkZWZpbmUgdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBtaXBzX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLWV4dGVybiB2b2lkIG1pcHNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X21pcHMKLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19taXBzCi0gIFBBUkFNUyAoKHN0cnVjdCBmcmFnICosIGludCwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgZXhwcmVzc2lvblMgKikpOwotCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKGZpeHApIG1pcHNfZml4X2FkanVzdGFibGUgKGZpeHApCi1leHRlcm4gaW50IG1pcHNfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSB3ZSBtdXN0IGtlZXAgUEMgcmVsYXRpdmUKLSAgIHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSBtaXBzX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi1leHRlcm4gaW50IG1pcHNfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogbWRfYXBwbHlfZml4IHNldHMgZnhfZG9uZSBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBUQ19IQU5ETEVfRlhfRE9ORSAxCi0KLS8qIFJlZ2lzdGVyIG1hc2sgdmFyaWFibGVzLiAgVGhlc2UgYXJlIHNldCBieSB0aGUgTUlQUyBhc3NlbWJseSBjb2RlCi0gICBhbmQgdXNlZCBieSBFQ09GRiBhbmQgcG9zc2libHkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4gICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBtaXBzX2dwcm1hc2s7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBtaXBzX2Nwcm1hc2tbNF07Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotCi0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nIG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcKLWV4dGVybiB2b2lkIG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLnNkYXRhIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCi0gIHsgIi5zYnNzIiwJU0hUX05PQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX01JUFNfR1BSRUwJfSwgXAotICB7ICIubGl0NCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX01JUFNfR1BSRUwJfSwgXAotICB7ICIubGl0OCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX01JUFNfR1BSRUwJfSwgXAotICB7ICIudWNvZGUiLAlTSFRfTUlQU19VQ09ERSwJMAkJCQkJfSwgXAotICB7ICIubWRlYnVnIiwJU0hUX01JUFNfREVCVUcsCTAJCQkJCX0sCi0vKiBPdGhlciBzcGVjaWFsIHNlY3Rpb25zIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlcjogLnJlZ2luZm8sCi0gICAubGlibGlzdCwgLmNvbmZsaWN0LCAuZ3B0YWIsIC5nb3QsIC5keW5hbWljLCAucmVsLmR5bi4gICovCi0KLSNlbmRpZgotCi1leHRlcm4gdm9pZCBtZF9taXBzX2VuZCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2VuZCgpCW1kX21pcHNfZW5kKCkKLQotI2RlZmluZSBVU0VfR0xPQkFMX1BPSU5URVJfT1BUCShPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciBcCi0JCQkJIHx8IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIgXAotCQkJCSB8fCBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0KLWV4dGVybiB2b2lkIG1pcHNfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX3BvcF9pbnNlcnQoKQkJbWlwc19wb3BfaW5zZXJ0KCkKLQotZXh0ZXJuIHZvaWQgbWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQKLQotZXh0ZXJuIHZvaWQgbWlwc19lbmFibGVfYXV0b19hbGlnbiBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCkJbWlwc19lbmFibGVfYXV0b19hbGlnbigpCi0KLSNlbmRpZiAvKiBUQ19NSVBTICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuYyBiL2dhcy9jb25maWcvdGMtbW4xMDIwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRmN2JmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxNCArMCwwIEBACi0vKiB0Yy1tbjEwMjAwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMjAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAyMDAuaCIKLQwKLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCByZWdfbmFtZQotewotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgdmFsdWU7Ci19OwotCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQwKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9IHsKLSAgLyogYkNDIHJlbGF4aW5nICovCi0gIHsweDgxLCAtMHg3ZSwgMiwgMX0sCi0gIHsweDgwMDQsIC0weDdmZmIsIDUsIDJ9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgNywgMH0sCi0gIC8qIGJDQ3ggcmVsYXhpbmcgKi8KLSAgezB4ODEsIC0weDdlLCAzLCA0fSwKLSAgezB4ODAwNCwgLTB4N2ZmYiwgNiwgNX0sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA4LCAwfSwKLSAgLyoganNyIHJlbGF4aW5nICovCi0gIHsweDgwMDQsIC0weDdmZmIsIDMsIDd9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgNSwgMH0sCi0gIC8qIGptcCByZWxheGluZyAqLwotICB7MHg4MSwgLTB4N2UsIDIsIDl9LAotICB7MHg4MDA0LCAtMHg3ZmZiLCAzLCAxMH0sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA1LCAwfSwKLQotfTsKLS8qIGxvY2FsIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKiwKLQkJCQkJICAgIG9mZnNldFQsIGNoYXIgKiwgdW5zaWduZWQsCi0JCQkJCSAgICB1bnNpZ25lZCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hlY2tfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqLAotCQkJCQkgICAgb2Zmc2V0VCkpOwotc3RhdGljIGludCByZWdfbmFtZV9zZWFyY2ggUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlZ19uYW1lICosIGludCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkYXRhX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBhZGRyZXNzX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBvdGhlcl9yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotCi0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3QgbW4xMDIwMF9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19Owotc3RydWN0IG1uMTAyMDBfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci1zdGF0aWMgaW50IGZjOwotDAotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7IAotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7IE5VTEwsICAgICAgIE5VTEwsICAgICAgICAgICAwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptbjEwMjAwX2hhc2g7Ci0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgZGF0YV9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImQwIiwgMCB9LAotICB7ICJkMSIsIDEgfSwKLSAgeyAiZDIiLCAyIH0sCi0gIHsgImQzIiwgMyB9LAotfTsKLSNkZWZpbmUgREFUQV9SRUdfTkFNRV9DTlQJKHNpemVvZihkYXRhX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBhZGRyZXNzX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCAwIH0sCi0gIHsgImExIiwgMSB9LAotICB7ICJhMiIsIDIgfSwKLSAgeyAiYTMiLCAzIH0sCi19OwotI2RlZmluZSBBRERSRVNTX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGFkZHJlc3NfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIG90aGVyX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAibWRyIiwgMCB9LAotICB7ICJwc3ciLCAwIH0sCi19OwotI2RlZmluZSBPVEhFUl9SRUdfTkFNRV9DTlQJKHNpemVvZihvdGhlcl9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUKLSAgIHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAocmVncywgcmVnY291bnQsIG5hbWUpCi0gICAgIGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqcmVnczsKLSAgICAgaW50IHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UgCi0JICByZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWRhdGFfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoZGF0YV9yZWdpc3RlcnMsIERBVEFfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1hZGRyZXNzX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGFkZHJlc3NfcmVnaXN0ZXJzLCBBRERSRVNTX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotb3RoZXJfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAob3RoZXJfcmVnaXN0ZXJzLCBPVEhFUl9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiTU4xMDIwMCBvcHRpb25zOlxuXAotbm9uZSB5ZXRcbiIpKTsKLX0gCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICBpbnQgdHlwZTsKLSAgY2hhciAqbGl0cDsKLSAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZXAgPSBwcmVjICogMjsKLQotICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0gICAgICBsaXRwICs9IDI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhYmVsX2NvdW50ID0gMDsKLSAgY2hhciBidWZbNDBdOwotCi0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxKQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlOToKLQkgIG9wY29kZSA9IDB4ZTg7Ci0JICBicmVhazsKLQljYXNlIDB4ZTA6Ci0JICBvcGNvZGUgPSAweGUyOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgb3Bjb2RlID0gMHhlMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMzoKLQkgIG9wY29kZSA9IDB4ZTE7Ci0JICBicmVhazsKLQljYXNlIDB4ZTE6Ci0JICBvcGNvZGUgPSAweGUzOwotCSAgYnJlYWs7Ci0JY2FzZSAweGU0OgotCSAgb3Bjb2RlID0gMHhlNjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNjoKLQkgIG9wY29kZSA9IDB4ZTQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZTc6Ci0JICBvcGNvZGUgPSAweGU1OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU1OgotCSAgb3Bjb2RlID0gMHhlNzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4ZmM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDMsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMDoKLQkgIG9wY29kZSA9IDB4ZTI7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBvcGNvZGUgPSAweGUwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUzOgotCSAgb3Bjb2RlID0gMHhlMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMToKLQkgIG9wY29kZSA9IDB4ZTM7Ci0JICBicmVhazsKLQljYXNlIDB4ZTQ6Ci0JICBvcGNvZGUgPSAweGU2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU2OgotCSAgb3Bjb2RlID0gMHhlNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNzoKLQkgIG9wY29kZSA9IDB4ZTU7Ci0JICBicmVhazsKLQljYXNlIDB4ZTU6Ci0JICBvcGNvZGUgPSAweGU3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDJdID0gMHhmNDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhlMDsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzI0X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA3OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNCkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZmM6Ci0JICBvcGNvZGUgPSAweGZkOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZkOgotCSAgb3Bjb2RlID0gMHhmYzsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZToKLQkgIG9wY29kZSA9IDB4ZmY7Ci0JICBicmVhazsKLQljYXNlIDB4ZmY6Ci0JICBvcGNvZGUgPSAweGZlOwotCWNhc2UgMHhlODoKLQkgIG9wY29kZSA9IDB4ZTk7Ci0JICBicmVhazsKLQljYXNlIDB4ZTk6Ci0JICBvcGNvZGUgPSAweGU4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGUwOgotCSAgb3Bjb2RlID0gMHhlMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMjoKLQkgIG9wY29kZSA9IDB4ZTA7Ci0JICBicmVhazsKLQljYXNlIDB4ZTM6Ci0JICBvcGNvZGUgPSAweGUxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUxOgotCSAgb3Bjb2RlID0gMHhlMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNDoKLQkgIG9wY29kZSA9IDB4ZTY7Ci0JICBicmVhazsKLQljYXNlIDB4ZTY6Ci0JICBvcGNvZGUgPSAweGU0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU3OgotCSAgb3Bjb2RlID0gMHhlNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNToKLQkgIG9wY29kZSA9IDB4ZTc7Ci0JICBicmVhazsKLQljYXNlIDB4ZWM6Ci0JICBvcGNvZGUgPSAweGVkOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVkOgotCSAgb3Bjb2RlID0gMHhlYzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZToKLQkgIG9wY29kZSA9IDB4ZWY7Ci0JICBicmVhazsKLQljYXNlIDB4ZWY6Ci0JICBvcGNvZGUgPSAweGVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4ZmM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDUpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGZjOgotCSAgb3Bjb2RlID0gMHhmZDsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZDoKLQkgIG9wY29kZSA9IDB4ZmM7Ci0JICBicmVhazsKLQljYXNlIDB4ZmU6Ci0JICBvcGNvZGUgPSAweGZmOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZmOgotCSAgb3Bjb2RlID0gMHhmZTsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMDoKLQkgIG9wY29kZSA9IDB4ZTI7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBvcGNvZGUgPSAweGUwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUzOgotCSAgb3Bjb2RlID0gMHhlMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMToKLQkgIG9wY29kZSA9IDB4ZTM7Ci0JICBicmVhazsKLQljYXNlIDB4ZTQ6Ci0JICBvcGNvZGUgPSAweGU2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU2OgotCSAgb3Bjb2RlID0gMHhlNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNzoKLQkgIG9wY29kZSA9IDB4ZTU7Ci0JICBicmVhazsKLQljYXNlIDB4ZTU6Ci0JICBvcGNvZGUgPSAweGU3OwotCSAgYnJlYWs7Ci0JY2FzZSAweGVjOgotCSAgb3Bjb2RlID0gMHhlZDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZDoKLQkgIG9wY29kZSA9IDB4ZWM7Ci0JICBicmVhazsKLQljYXNlIDB4ZWU6Ci0JICBvcGNvZGUgPSAweGVmOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVmOgotCSAgb3Bjb2RlID0gMHhlZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNF0gPSAweGUwOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA1LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMjRfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDg7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA2KQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNykKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGUxOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18yNF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbZnJhZ1AtPmZyX2ZpeF0gPSAweGVhOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDkpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmYzsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMCkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGUwOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18yNF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpvcDsKLQotICBtbjEwMjAwX2hhc2ggPSBoYXNoX25ldygpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIE1OMTAyMDAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIG9wID0gbW4xMDIwMF9vcGNvZGVzOwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcC0+bmFtZSkpIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG1uMTAyMDBfaGFzaCwgb3AtPm5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGJvdGggYSBzaW1wbGlmaWNhdGlvbiAod2UgZG9uJ3QgaGF2ZSB0byB3cml0ZSBtZF9hcHBseV9maXgpCi0gICAgIGFuZCBzdXBwb3J0IGZvciBmdXR1cmUgb3B0aW1pemF0aW9ucyAoYnJhbmNoIHNob3J0ZW5pbmcgYW5kIHNpbWlsYXIKLSAgICAgc3R1ZmYgaW4gdGhlIGxpbmtlci4gICovCi0gIGxpbmtyZWxheCA9IDE7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpIAotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3Bjb2RlOwotICBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm5leHRfb3Bjb2RlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLSAgaW50IG5leHRfb3BpbmRleCwgcmVsYXhhYmxlOwotICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbiwgc2l6ZSA9IDA7Ci0gIGNoYXIgKmY7Ci0gIGludCBpOwotICBpbnQgbWF0Y2g7Ci0KLSAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgISBpc3NwYWNlICgqcyk7IHMrKykKLSAgICA7Ci0gIGlmICgqcyAhPSAnXDAnKQotICAgICpzKysgPSAnXDAnOwotCi0gIC8qIGZpbmQgdGhlIGZpcnN0IG9wY29kZSB3aXRoIHRoZSBwcm9wZXIgbmFtZSAqLwotICBvcGNvZGUgPSAoc3RydWN0IG1uMTAyMDBfb3Bjb2RlICopaGFzaF9maW5kIChtbjEwMjAwX2hhc2gsIHN0cik7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3RyID0gczsKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICBmb3IoOzspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKLSAgICAgIGludCBvcF9pZHg7Ci0gICAgICBjaGFyICpob2xkOwotICAgICAgaW50IGV4dHJhX3NoaWZ0ID0gMDsKLQotICAgICAgcmVsYXhhYmxlID0gMDsKLSAgICAgIGZjID0gMDsKLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0gICAgICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgZm9yIChvcF9pZHggPSAxLCBvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7Ci0JICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgb3BpbmRleF9wdHIrKywgb3BfaWR4KyspCi0JewotCSAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLQkgIGV4cHJlc3Npb25TIGV4OwotCi0JICBpZiAobmV4dF9vcGluZGV4ID09IDApCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICZtbjEwMjAwX29wZXJhbmRzW25leHRfb3BpbmRleF07Ci0JICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLQkgICAgfQotCi0JICBlcnJtc2cgPSBOVUxMOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcpCi0JICAgICsrc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUkVMQVgpCi0JICAgIHJlbGF4YWJsZSA9IDE7Ci0KLQkgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gKi8KLQkgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQVJFTikKLQkgICAgewotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcoJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICAvKiBTZWUgaWYgd2UgY2FuIG1hdGNoIHRoZSBvcGVyYW5kcy4gICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9EUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9BUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QU1cpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjbXAgKHN0YXJ0LCAicHN3IikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9NRFIpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjbXAgKHN0YXJ0LCAibWRyIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWRkcmVzc19yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG90aGVyX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnN0ciA9PSAnKScgfHwgKnN0ciA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4KTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKGV4Llhfb3ApIAotCSAgICB7Ci0JICAgIGNhc2UgT19pbGxlZ2FsOgotCSAgICAgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIGNhc2UgT19hYnNlbnQ6Ci0JICAgICAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgY2FzZSBPX3JlZ2lzdGVyOgotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MKLSAgICAgICAgICAgICAgICAgICAmIChNTjEwMjAwX09QRVJBTkRfRFJFRyB8IE1OMTAyMDBfT1BFUkFORF9BUkVHKSkgPT0gMCkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JCQotCSAgICAgIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNSkKLQkJZXh0cmFfc2hpZnQgPSA4OwotCSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8zIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF82Ci0JCSAgICAgICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNykKLQkJZXh0cmFfc2hpZnQgPSAxNjsKLQkgICAgICBlbHNlCi0JCWV4dHJhX3NoaWZ0ID0gMDsKLQkgICAgICAKLQkgICAgICBtbjEwMjAwX2luc2VydF9vcGVyYW5kICgmaW5zbiwgJmV4dGVuc2lvbiwgb3BlcmFuZCwKLQkJCQkgICAgICBleC5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwsCi0JCQkJICAgICAgMCwgZXh0cmFfc2hpZnQpOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBPX2NvbnN0YW50OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIGFuZCBpdCBkb2Vzbid0Ci0JCSBmaXQgaW50byB0aGUgYWxsb2NhdGVkIGJpdGZpZWxkIGZvciB0aGlzIGluc24sCi0JCSB0aGVuIHByb21vdGUgaXQgKGllIHRoaXMgb3Bjb2RlIGRvZXMgbm90IG1hdGNoKS4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzCi0JCSAgJiAoTU4xMDIwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMjAwX09QRVJBTkRfUkVMQVgpCi0JCSAgJiYgISBjaGVja19vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotCQkJCSAgICAgIGV4LlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCwKLQkJCQkgICAgICAwLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIHRoZW4gdGhpcyBvcGNvZGUgZGlkbid0Ci0JCSBtYXRjaCBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIGl0IG5lZWRlZCBwcm9tb3Rpb24hICAqLwotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgICAgICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCQlhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCSAgICAgIGZpeHVwc1tmY10uZXhwID0gZXg7Ci0JICAgICAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotCSAgICAgIGZpeHVwc1tmY10ucmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgICsrZmM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQota2VlcF9nb2luZzoKLQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJykKLQkgICAgKytzdHI7Ci0KLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSB1c2VkIGFsbCB0aGUgb3BlcmFuZHMhICAqLwotICAgICAgaWYgKCpzdHIgIT0gJywnKQotCW1hdGNoID0gMTsKLQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0gICAgICAgIHsKLQkgIG5leHRfb3Bjb2RlID0gb3Bjb2RlICsgMTsKLQkgIGlmICghc3RyY21wKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpKQotCSAgICB7Ci0JICAgICAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIAotCSAgYXNfYmFkICgiJXMiLCBlcnJtc2cpOwotCSAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgICAKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlmICgqc3RyICE9ICdcMCcpCi0gICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMSkKLSAgICBzaXplID0gMTsKLSAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzIgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzQpCi0gICAgc2l6ZSA9IDI7Ci0gIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8zIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF81KQotICAgIHNpemUgPSAzOwotICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNikKLSAgICBzaXplID0gNDsKLSAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzcpCi0gICAgc2l6ZSA9IDU7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgICAgICAgIAotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLQotICBpZiAocmVsYXhhYmxlICYmIGZjID4gMCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLQotICAgICAgLyogYkNDICovCi0gICAgICBpZiAoc2l6ZSA9PSAyICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmMwMDAwKQotCXsKLQkgIC8qIEhhbmRsZSBicmEgc3BlY2lhbGx5LiAgQmFzaWNhbGx5IHRyZWF0IGl0IGxpa2Ugam1wIHNvCi0JICAgICB0aGF0IHdlIGF1dG9tYXRpY2FsbHkgaGFuZGxlIDgsIDE2IGFuZCAzMiBiaXQgb2Zmc2V0cwotCSAgICAgY29ycmVjdGx5IGFzIHdlbGwgYXMganVtcHMgdG8gYW4gdW5kZWZpbmVkIGFkZHJlc3MuCi0KLQkgICAgIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdCB0cmVhdCBpdCBsaWtlIG90aGVyIGJDQwotCSAgICAgaW5zdHJ1Y3Rpb25zIHNpbmNlIHRoZSBsb25nIGZvcm1zIG9mIGJyYSBpcyBkaWZmZXJlbnQKLQkgICAgIGZyb20gb3RoZXIgYkNDIGluc3RydWN0aW9ucy4gICovCi0gICAgICAgICAgaWYgKG9wY29kZS0+b3Bjb2RlID09IDB4ZWEwMCkKLSAgICAgICAgICAgIHR5cGUgPSA4OwotCSAgZWxzZQotCSAgICB0eXBlID0gMDsKLQl9Ci0gICAgICAvKiBqc3IgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gMyAmJiBvcGNvZGUtPm9wY29kZSA9PSAweGZkMDAwMCkKLQl0eXBlID0gNjsKLSAgICAgIC8qIGptcCAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAzICYmIG9wY29kZS0+b3Bjb2RlID09IDB4ZmMwMDAwKQotCXR5cGUgPSA4OwotICAgICAgLyogYkNDeCAqLwotICAgICAgZWxzZQotCXR5cGUgPSAzOwotCi0gICAgICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCA4IC0gc2l6ZSwgdHlwZSwKLQkJICAgIGZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAotCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCi0JCSAgICAoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKLSAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIHNpemUpOwotICAgICAgaWYgKDggLSBzaXplID4gNCkKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgc2l6ZSwgMCwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgc2l6ZSArIDQsIDAsIDggLSBzaXplIC0gNCk7Ci0JfQotICAgICAgZWxzZQotCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyBzaXplLCAwLCA4IC0gc2l6ZSk7Ci0gICAgfQotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBmID0gZnJhZ19tb3JlIChzaXplKTsKLQotICAgICAgLyogT2gsIHdoYXQgYSBtZXNzLiAgVGhlIGluc3RydWN0aW9uIGlzIGluIGJpZyBlbmRpYW4gZm9ybWF0LCBidXQKLQkgMTYgYW5kIDI0Yml0IGltbWVkaWF0ZXMgYXJlIGxpdHRsZSBlbmRpYW4hICAqLwotICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8zKQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIGluc24gJiAweGZmZmYsIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF82KQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgaW5zbiAmIDB4ZmZmZiwgMik7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzcpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCBpbnNuICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyA0LCBleHRlbnNpb24gJiAweGZmLCAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSA+IDQgPyA0IDogc2l6ZSk7Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotCi0JICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOwotCSAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICB7Ci0JICAgICAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG87Ci0JICAgICAgaW50IHNpemU7Ci0JICAgICAgaW50IG9mZnNldDsKLQkgICAgICBmaXhTICpmaXhQOwotCi0JICAgICAgcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgICAgIGlmICghcmVsb2NfaG93dG8pCi0JCWFib3J0KCk7Ci0JICAKLQkgICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7Ci0KLQkgICAgICBpZiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpCi0JCWFib3J0KCk7Ci0KLQkgICAgICBvZmZzZXQgPSA0IC0gc2l6ZTsKLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICBzaXplLAotCQkJCSAgJmZpeHVwc1tpXS5leHAsIAotCQkJCSAgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCSAgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgICAgIC8qIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQKLQkJIGluc3RydWN0aW9uLCBub3QgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChyZWxvY19ob3d0by0+cGNfcmVsYXRpdmUpCi0JCWZpeFAtPmZ4X29mZnNldCArPSBzaXplOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgcmVsb2MsIHBjcmVsLCByZWxvY19zaXplLCBvZmZzZXQ7Ci0JICAgICAgZml4UyAqZml4UDsKLQotCSAgICAgIHJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0JICAgICAgLyogSG93IGJpZyBpcyB0aGUgcmVsb2M/ICBSZW1lbWJlciBTUExJVCByZWxvY3MgYXJlCi0JCSBpbXBsaWNpdGx5IDMyYml0cy4gICovCi0JICAgICAgcmVsb2Nfc2l6ZSA9IG9wZXJhbmQtPmJpdHM7Ci0KLQkgICAgICBvZmZzZXQgPSBzaXplIC0gcmVsb2Nfc2l6ZSAvIDg7Ci0KLQkgICAgICAvKiBJcyB0aGUgcmVsb2MgcGMtcmVsYXRpdmU/ICAqLwotCSAgICAgIHBjcmVsID0gKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BDUkVMKSAhPSAwOwotCi0KLQkgICAgICAvKiBDaG9vc2UgYSBwcm9wZXIgQkZEIHJlbG9jYXRpb24gdHlwZS4gICovCi0JICAgICAgaWYgKHBjcmVsKQotCQl7Ci0JCSAgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAyNCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzI0X1BDUkVMOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJlbG9jX3NpemUgPT0gMzIpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18zMjsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMTY7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfODsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDI0KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMjQ7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIC8qIENvbnZlcnQgdGhlIHNpemUgb2YgdGhlIHJlbG9jIGludG8gd2hhdCBmaXhfbmV3X2V4cCB3YW50cy4gICovCi0JICAgICAgcmVsb2Nfc2l6ZSA9IHJlbG9jX3NpemUgLyA4OwotCSAgICAgIGlmIChyZWxvY19zaXplID09IDgpCi0JCXJlbG9jX3NpemUgPSAwOwotCSAgICAgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCXJlbG9jX3NpemUgPSAxOwotCSAgICAgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMzIgfHwgcmVsb2Nfc2l6ZSA9PSAyNCkKLQkJcmVsb2Nfc2l6ZSA9IDI7Ci0KLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICByZWxvY19zaXplLCAmZml4dXBzW2ldLmV4cCwgcGNyZWwsCi0JCQkJICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgcmVsb2MpKTsKLQotCSAgICAgIC8qIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQKLQkJIGluc3RydWN0aW9uLCBub3QgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChwY3JlbCkKLQkJZml4UC0+Znhfb2Zmc2V0ICs9IHNpemU7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICYmIGZpeHAtPmZ4X3N1YnN5KQotICAgIHsKLSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkiRGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmYmZkX2Fic19zeW1ib2w7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gKFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkJICAgICAgIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KSArIGZpeHAtPmZ4X29mZnNldCk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICAgIH0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHJldHVybiAyOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICByZXR1cm4gMzsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDYpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA3OwotCSAgcmV0dXJuIDU7Ci0JfQotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gOCkKLSAgICB7Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSAxMDsKLQkgIHJldHVybiA1OwotCX0KLSAgICAgIHJldHVybiAyOwotICAgIH0KLX0gCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2lmIDAKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwgJiYgISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotI2VuZGlmCi19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHZhbHVlVCAqdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgLyogV2Ugc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUgYmVjYXVzZSBsaW5rcmVsYXggaXMgbm9uemVyby4gICovCi0gIGFib3J0ICgpOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCAoaW5zbnAsIGV4dGVuc2lvbnAsIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSwgc2hpZnQpCi0gICAgIHVuc2lnbmVkIGxvbmcgKmluc25wOwotICAgICB1bnNpZ25lZCBsb25nICpleHRlbnNpb25wOwotICAgICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIHVuc2lnbmVkIGludCBzaGlmdDsKLXsKLSAgLyogTm8gbmVlZCB0byBjaGVjayAyNCBvciAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA8IDI0Ci0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSykgPT0gMCkKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBtYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCX0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLSAgICAgICAgICBtaW4gPSAwOwotICAgICAgICB9Ci0KLSAgICAgIHRlc3QgPSB2YWw7Ci0KLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotICAgICAgICB7Ci0gICAgICAgICAgY29uc3QgY2hhciAqZXJyID0KLSAgICAgICAgICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLSAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICAgICAgc3ByaW50X3ZhbHVlIChidWYsIHRlc3QpOwotICAgICAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0gICAgICAgICAgICBhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCkgPT0gMCkKLSAgICB7Ci0gICAgICAqaW5zbnAgfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JCSA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCkpOwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEKSAhPSAwKQotCSppbnNucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJICAgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQgKyAyKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKmV4dGVuc2lvbnAgfD0gKHZhbCA+PiAxNikgJiAweGZmOwotICAgICAgKmluc25wIHw9IHZhbCAmIDB4ZmZmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1jaGVja19vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCB2YWwpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci17Ci0gIC8qIE5vIG5lZWQgdG8gY2hlY2sgMjRiaXQgb3IgMzJiaXQgb3BlcmFuZHMgZm9yIGEgYml0LiAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPCAyNAotICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0spID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0gICAgICAgICAgbWluID0gMDsKLSAgICAgICAgfQotCi0gICAgICB0ZXN0ID0gdmFsOwotCi0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQlyZXR1cm4gMDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmggYi9nYXMvY29uZmlnL3RjLW1uMTAyMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzZTU2OS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIHRjLW1uMTAyMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtbW4xMDIwMC5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfTU4xMDIwMAotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIE1OMTAyMDAgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbW4xMDIwMAotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLW1uMTAyMDAiCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotLyogRG9uJ3QgYm90aGVyIHRvIGFkanVzdCByZWxvY3MuICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpIDAKLQotLyogV2UgZG8gcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBhcyB3ZWxsIGFzIHRoZSBsaW5rZXIuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmMgYi9nYXMvY29uZmlnL3RjLW1uMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwNzZmNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OTYgKzAsMCBAQAotLyogdGMtbW4xMDMwMC5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTWF0c3VzaGl0YSAxMDMwMAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiCi0MCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcmVnX25hbWUKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IHZhbHVlOwotfTsKLQotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIAotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGQxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0MCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPSB7Ci0gIC8qIGJDQyByZWxheGluZyAqLwotICB7MHg3ZiwgLTB4ODAsIDIsIDF9LAotICB7MHg3ZmZmLCAtMHg4MDAwLCA1LCAyfSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA3LCAwfSwKLQotICAvKiBiQ0MgcmVsYXhpbmcgKHVuY29tbW9uIGNhc2VzKSAqLwotICB7MHg3ZiwgLTB4ODAsIDMsIDR9LAotICB7MHg3ZmZmLCAtMHg4MDAwLCA2LCA1fSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA4LCAwfSwKLQotICAvKiBjYWxsIHJlbGF4aW5nICovCi0gIHsweDdmZmYsIC0weDgwMDAsIDUsIDd9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDcsIDB9LAotCi0gIC8qIGNhbGxzIHJlbGF4aW5nICovCi0gIHsweDdmZmYsIC0weDgwMDAsIDQsIDl9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDYsIDB9LAotCi0gIC8qIGptcCByZWxheGluZyAqLwotICB7MHg3ZiwgLTB4ODAsIDIsIDExfSwKLSAgezB4N2ZmZiwgLTB4ODAwMCwgMywgMTJ9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDUsIDB9LAotCi19OwotCi0vKiBsb2NhbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICosCi0JCQkJCSAgICBvZmZzZXRULCBjaGFyICosIHVuc2lnbmVkLAotCQkJCQkgICAgdW5zaWduZWQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoZWNrX29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgbG9uZywKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKiwKLQkJCQkJICAgIG9mZnNldFQpKTsKLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGF0YV9yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGJvb2xlYW4gYWRkcmVzc19yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGJvb2xlYW4gb3RoZXJfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyB2b2lkIHNldF9hcmNoX21hY2ggUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBpbnQgY3VycmVudF9tYWNoaW5lOwotCi0vKiBmaXh1cHMgKi8KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotc3RydWN0IG1uMTAzMDBfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgb3BpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLXN0cnVjdCBtbjEwMzAwX2ZpeHVwIGZpeHVwc1tNQVhfSU5TTl9GSVhVUFNdOwotc3RhdGljIGludCBmYzsKLQotLyogV2UgbXVzdCBzdG9yZSB0aGUgdmFsdWUgb2YgZWFjaCByZWdpc3RlciBvcGVyYW5kIHNvIHRoYXQgd2UgY2FuCi0gICB2ZXJpZnkgdGhhdCBjZXJ0YWluIHJlZ2lzdGVycyBkbyBub3QgbWF0Y2guICAqLwotaW50IG1uMTAzMDBfcmVnX29wZXJhbmRzW01OMTAzMDBfTUFYX09QRVJBTkRTXTsKLQwKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiYW0zMCIsCXNldF9hcmNoX21hY2gsCQkzMDAgfSwKLSAgeyAiYW0zMyIsCXNldF9hcmNoX21hY2gsCQkzMzAgfSwKLSAgeyAibW4xMDMwMCIsCXNldF9hcmNoX21hY2gsCQkzMDAgfSwKLSAge05VTEwsIDAsIDB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqbW4xMDMwMF9oYXNoOwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGRhdGFfcmVnaXN0ZXJzW10gPQotewotICB7ICJkMCIsIDAgfSwKLSAgeyAiZDEiLCAxIH0sCi0gIHsgImQyIiwgMiB9LAotICB7ICJkMyIsIDMgfSwKLX07Ci0jZGVmaW5lIERBVEFfUkVHX05BTUVfQ05UCShzaXplb2YoZGF0YV9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgYWRkcmVzc19yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgMCB9LAotICB7ICJhMSIsIDEgfSwKLSAgeyAiYTIiLCAyIH0sCi0gIHsgImEzIiwgMyB9LAotfTsKLSNkZWZpbmUgQUREUkVTU19SRUdfTkFNRV9DTlQJKHNpemVvZihhZGRyZXNzX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSByX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCA4IH0sCi0gIHsgImExIiwgOSB9LAotICB7ICJhMiIsIDEwIH0sCi0gIHsgImEzIiwgMTEgfSwKLSAgeyAiZDAiLCAxMiB9LAotICB7ICJkMSIsIDEzIH0sCi0gIHsgImQyIiwgMTQgfSwKLSAgeyAiZDMiLCAxNSB9LAotICB7ICJlMCIsIDAgfSwKLSAgeyAiZTEiLCAxIH0sCi0gIHsgImUxMCIsIDEwIH0sCi0gIHsgImUxMSIsIDExIH0sCi0gIHsgImUxMiIsIDEyIH0sCi0gIHsgImUxMyIsIDEzIH0sCi0gIHsgImUxNCIsIDE0IH0sCi0gIHsgImUxNSIsIDE1IH0sCi0gIHsgImUyIiwgMiB9LAotICB7ICJlMyIsIDMgfSwKLSAgeyAiZTQiLCA0IH0sCi0gIHsgImU1IiwgNSB9LAotICB7ICJlNiIsIDYgfSwKLSAgeyAiZTciLCA3IH0sCi0gIHsgImU4IiwgOCB9LAotICB7ICJlOSIsIDkgfSwKLSAgeyAicjAiLCAwIH0sCi0gIHsgInIxIiwgMSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJyMiIsIDIgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi19OwotI2RlZmluZSBSX1JFR19OQU1FX0NOVAkoc2l6ZW9mKHJfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHhyX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAibWNyaCIsIDIgfSwKLSAgeyAibWNybCIsIDMgfSwKLSAgeyAibWN2ZiIsIDQgfSwKLSAgeyAibWRycSIsIDEgfSwKLSAgeyAic3AiLCAwIH0sCi0gIHsgInhyMCIsIDAgfSwKLSAgeyAieHIxIiwgMSB9LAotICB7ICJ4cjEwIiwgMTAgfSwKLSAgeyAieHIxMSIsIDExIH0sCi0gIHsgInhyMTIiLCAxMiB9LAotICB7ICJ4cjEzIiwgMTMgfSwKLSAgeyAieHIxNCIsIDE0IH0sCi0gIHsgInhyMTUiLCAxNSB9LAotICB7ICJ4cjIiLCAyIH0sCi0gIHsgInhyMyIsIDMgfSwKLSAgeyAieHI0IiwgNCB9LAotICB7ICJ4cjUiLCA1IH0sCi0gIHsgInhyNiIsIDYgfSwKLSAgeyAieHI3IiwgNyB9LAotICB7ICJ4cjgiLCA4IH0sCi0gIHsgInhyOSIsIDkgfSwKLX07Ci0jZGVmaW5lIFhSX1JFR19OQU1FX0NOVAkoc2l6ZW9mKHhyX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIG90aGVyX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAibWRyIiwgMCB9LAotICB7ICJwc3ciLCAwIH0sCi0gIHsgInNwIiwgMCB9LAotfTsKLSNkZWZpbmUgT1RIRVJfUkVHX05BTUVfQ05UCShzaXplb2Yob3RoZXJfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIHRhYmxlCi0gICB0byBzZWUgaWYgIm5hbWUiIGlzIGEgdmFsaWQgcmVnaXRlciBuYW1lLiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIKLSAgIG51bWJlciBmcm9tIHRoZSBhcnJheSBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLiAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKHJlZ3MsIHJlZ2NvdW50LCBuYW1lKQotICAgICBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKnJlZ3M7Ci0gICAgIGludCByZWdjb3VudDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdjb3VudCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcmVnc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlIAotCSAgcmV0dXJuIHJlZ3NbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0gIHJldHVybiAtMTsKLX0KLQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1yX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHJfcmVnaXN0ZXJzLCBSX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgoteHJfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoeHJfcmVnaXN0ZXJzLCBYUl9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWRhdGFfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoZGF0YV9yZWdpc3RlcnMsIERBVEFfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1hZGRyZXNzX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGFkZHJlc3NfcmVnaXN0ZXJzLCBBRERSRVNTX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotb3RoZXJfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAob3RoZXJfcmVnaXN0ZXJzLCBPVEhFUl9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiTU4xMDMwMCBvcHRpb25zOlxuXAotbm9uZSB5ZXRcbiIpKTsKLX0gCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICBpbnQgdHlwZTsKLSAgY2hhciAqbGl0cDsKLSAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuICJiYWQgY2FsbCB0byBtZF9hdG9mIjsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZXAgPSBwcmVjICogMjsKLQotICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0gICAgICBsaXRwICs9IDI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhYmVsX2NvdW50ID0gMDsKLSAgY2hhciBidWZbNDBdOwotCi0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMSkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhjODoKLQkgIG9wY29kZSA9IDB4Yzk7Ci0JICBicmVhazsKLQljYXNlIDB4Yzk6Ci0JICBvcGNvZGUgPSAweGM4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGMwOgotCSAgb3Bjb2RlID0gMHhjMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMjoKLQkgIG9wY29kZSA9IDB4YzA7Ci0JICBicmVhazsKLQljYXNlIDB4YzM6Ci0JICBvcGNvZGUgPSAweGMxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMxOgotCSAgb3Bjb2RlID0gMHhjMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNDoKLQkgIG9wY29kZSA9IDB4YzY7Ci0JICBicmVhazsKLQljYXNlIDB4YzY6Ci0JICBvcGNvZGUgPSAweGM0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM3OgotCSAgb3Bjb2RlID0gMHhjNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNToKLQkgIG9wY29kZSA9IDB4Yzc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDJdID0gMHhjYzsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMywgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4Yzg6Ci0JICBvcGNvZGUgPSAweGM5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM5OgotCSAgb3Bjb2RlID0gMHhjODsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMDoKLQkgIG9wY29kZSA9IDB4YzI7Ci0JICBicmVhazsKLQljYXNlIDB4YzI6Ci0JICBvcGNvZGUgPSAweGMwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMzOgotCSAgb3Bjb2RlID0gMHhjMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMToKLQkgIG9wY29kZSA9IDB4YzM7Ci0JICBicmVhazsKLQljYXNlIDB4YzQ6Ci0JICBvcGNvZGUgPSAweGM2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM2OgotCSAgb3Bjb2RlID0gMHhjNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNzoKLQkgIG9wY29kZSA9IDB4YzU7Ci0JICBicmVhazsKLQljYXNlIDB4YzU6Ci0JICBvcGNvZGUgPSAweGM3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4ZGM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDMsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDc7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNCkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYToKLQkgIG9wY29kZSA9IDB4ZWI7Ci0JICBicmVhazsKLQljYXNlIDB4ZWI6Ci0JICBvcGNvZGUgPSAweGVhOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGNjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNSkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGVhOgotCSAgb3Bjb2RlID0gMHhlYjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYjoKLQkgIG9wY29kZSA9IDB4ZWE7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4ZGM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDg7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA2KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4Y2Q7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA3KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZGQ7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyA1XSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNl0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyA0XTsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA3OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOCkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGZhOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGZmOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOSkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGZjOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGZmOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMCkKLSAgICB7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtmcmFnUC0+ZnJfZml4XSA9IDB4Y2E7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDExKQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4Y2M7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEyKQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZGM7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcDsKLQotICBtbjEwMzAwX2hhc2ggPSBoYXNoX25ldygpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIE1OMTAzMDAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIG9wID0gbW4xMDMwMF9vcGNvZGVzOwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcC0+bmFtZSkpIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG1uMTAzMDBfaGFzaCwgb3AtPm5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGJvdGggYSBzaW1wbGlmaWNhdGlvbiAod2UgZG9uJ3QgaGF2ZSB0byB3cml0ZSBtZF9hcHBseV9maXgpCi0gICAgIGFuZCBzdXBwb3J0IGZvciBmdXR1cmUgb3B0aW1pemF0aW9ucyAoYnJhbmNoIHNob3J0ZW5pbmcgYW5kIHNpbWlsYXIKLSAgICAgc3R1ZmYgaW4gdGhlIGxpbmtlcikuICAqLwotICBsaW5rcmVsYXggPSAxOwotCi0gIC8qIFNldCB0aGUgZGVmYXVsdCBtYWNoaW5lIHR5cGUuICAqLwotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21uMTAzMDAsIDMwMCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgY3VycmVudF9tYWNoaW5lID0gMzAwOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKSAKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKm9wY29kZTsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpuZXh0X29wY29kZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0gIGludCBuZXh0X29waW5kZXgsIHJlbGF4YWJsZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb24sIHNpemUgPSAwOwotICBjaGFyICpmOwotICBpbnQgaTsKLSAgaW50IG1hdGNoOwotCi0gIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICEgaXNzcGFjZSAoKnMpOyBzKyspCi0gICAgOwotICBpZiAoKnMgIT0gJ1wwJykKLSAgICAqcysrID0gJ1wwJzsKLQotICAvKiBmaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUgKi8KLSAgb3Bjb2RlID0gKHN0cnVjdCBtbjEwMzAwX29wY29kZSAqKWhhc2hfZmluZCAobW4xMDMwMF9oYXNoLCBzdHIpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ciA9IHM7Ci0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgZm9yKDs7KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICAgIGludCBvcF9pZHg7Ci0gICAgICBjaGFyICpob2xkOwotICAgICAgaW50IGV4dHJhX3NoaWZ0ID0gMDsKLQotCi0gICAgICBlcnJtc2cgPSBfKCJJbnZhbGlkIG9wY29kZS9vcGVyYW5kcyIpOwotCi0gICAgICAvKiBSZXNldCB0aGUgYXJyYXkgb2YgcmVnaXN0ZXIgb3BlcmFuZHMuICAqLwotICAgICAgbWVtc2V0IChtbjEwMzAwX3JlZ19vcGVyYW5kcywgLTEsIHNpemVvZiAobW4xMDMwMF9yZWdfb3BlcmFuZHMpKTsKLQotICAgICAgcmVsYXhhYmxlID0gMDsKLSAgICAgIGZjID0gMDsKLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0gICAgICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0gICAgICBleHRlbnNpb24gPSAwOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBtYWNoaW5lCi0JIHRoZW4gaXQgY2FuIG5vdCBwb3NzaWJseSBtYXRjaC4gICovCi0gICAgICBpZiAob3Bjb2RlLT5tYWNoaW5lCi0JICAmJiAob3Bjb2RlLT5tYWNoaW5lICE9IGN1cnJlbnRfbWFjaGluZSkpCi0JZ290byBlcnJvcjsKLQotICAgICAgZm9yIChvcF9pZHggPSAxLCBvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7Ci0JICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgb3BpbmRleF9wdHIrKywgb3BfaWR4KyspCi0JewotCSAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqb3BlcmFuZDsKLQkgIGV4cHJlc3Npb25TIGV4OwotCi0JICBpZiAobmV4dF9vcGluZGV4ID09IDApCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzW25leHRfb3BpbmRleF07Ci0JICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLQkgICAgfQotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcpCi0JICAgICsrc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVMQVgpCi0JICAgIHJlbGF4YWJsZSA9IDE7Ci0KLQkgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gKi8KLQkgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQVJFTikKLQkgICAgewotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcoJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICAvKiBTZWUgaWYgd2UgY2FuIG1hdGNoIHRoZSBvcGVyYW5kcy4gICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9EUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9BUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUCkKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAic3AiKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JSRUcpCi0JICAgIHsKLQkgICAgICBpZiAoIXJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1hSUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCF4cl9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfVVNQKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJ1c3AiKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NTUCkKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAic3NwIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NU1ApCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgIm1zcCIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEMpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgInBjIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9FUFNXKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJlcHN3IikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QTFVTKQotCSAgICB7Ci0JICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJysnKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BTVykKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAicHN3IikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NRFIpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgIm1kciIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOwotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdbJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgICAvKiBFYXQgdGhlICdbJy4gICovCi0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAKLQkgICAgICAvKiBXZSB1c2VkIHRvIHJlamVjdCBhIG51bGwgcmVnaXN0ZXIgbGlzdCBoZXJlOyBob3dldmVyLAotCQkgd2UgYWNjZXB0IGl0IG5vdyBzbyB0aGUgY29tcGlsZXIgY2FuIGVtaXQgImNhbGwiIGluc3RydWN0aW9ucwotCQkgZm9yIGFsbCBjYWxscyB0byBuYW1lZCBmdW5jdGlvbnMuCi0KLQkJIFRoZSBsaW5rZXIgY2FuIHRoZW4gZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgYml0cyBmb3IgdGhlCi0JCSByZWdpc3RlciBsaXN0IGFuZCBzdGFjayBzaXplIG9yIGNoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24KLQkJIGludG8gYSAiY2FsbHMiIGlmIHVzaW5nICJjYWxsIiBpcyBub3QgcHJvZml0YWJsZS4gICovCi0JICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ10nKQotCQl7Ci0JCSAgY2hhciAqc3RhcnQ7Ci0JCSAgY2hhciBjOwotCi0JCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCQkgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLQkJICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkJICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJkMiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4ODA7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiZDMiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDQwOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgImEyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgyMDsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJhMyIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MTA7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAib3RoZXIiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDA4OwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChjdXJyZW50X21hY2hpbmUgPT0gMzMwCi0JCQkgICAmJiBzdHJjYXNlY21wIChzdGFydCwgImV4cmVnMCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MDQ7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGN1cnJlbnRfbWFjaGluZSA9PSAzMzAKLQkJCSAgICYmIHN0cmNhc2VjbXAgKHN0YXJ0LCAiZXhyZWcxIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgwMjsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoY3VycmVudF9tYWNoaW5lID09IDMzMAotCQkJICAgJiYgc3RyY2FzZWNtcCAoc3RhcnQsICJleG90aGVyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgwMTsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoY3VycmVudF9tYWNoaW5lID09IDMzMAotCQkJICAgJiYgc3RyY2FzZWNtcCAoc3RhcnQsICJhbGwiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweGZmOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgICAgIHN0ciA9IGhvbGQ7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgICAgICAgICAgbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0KLQkgICAgfQotCSAgZWxzZSBpZiAoZGF0YV9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmIChvdGhlcl9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmICh4cl9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpzdHIgPT0gJyknIHx8ICpzdHIgPT0gJygnKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb24gKCZleCk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChleC5YX29wKSAKLQkgICAgewotCSAgICBjYXNlIE9faWxsZWdhbDoKLQkgICAgICBlcnJtc2cgPSBfKCJpbGxlZ2FsIG9wZXJhbmQiKTsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICBjYXNlIE9fYWJzZW50OgotCSAgICAgIGVycm1zZyA9IF8oIm1pc3Npbmcgb3BlcmFuZCIpOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIGNhc2UgT19yZWdpc3RlcjoKLQkgICAgICB7Ci0JCWludCBtYXNrOwotCi0JCW1hc2sgPSBNTjEwMzAwX09QRVJBTkRfRFJFRyB8IE1OMTAzMDBfT1BFUkFORF9BUkVHOwotCQltYXNrIHw9IE1OMTAzMDBfT1BFUkFORF9SUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1hSUkVHOwotCQlpZiAoKG9wZXJhbmQtPmZsYWdzICYgbWFzaykgPT0gMCkKLQkJICB7Ci0JCSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgICAgc3RyID0gaG9sZDsKLQkJICAgIGdvdG8gZXJyb3I7Ci0JCSAgfQotCQkKLQkJaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzEpCi0JCSAgZXh0cmFfc2hpZnQgPSA4OwotCQllbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDQKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzYKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDUpCi0JCSAgZXh0cmFfc2hpZnQgPSAxNjsKLQkJZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q3KQotCQkgIGV4dHJhX3NoaWZ0ID0gODsKLQkJZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q4IHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EOSkKLQkJICBleHRyYV9zaGlmdCA9IDg7Ci0JCWVsc2UKLQkJICBleHRyYV9zaGlmdCA9IDA7Ci0JICAgICAgCi0JCW1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotCQkJCQlleC5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwsCi0JCQkJCTAsIGV4dHJhX3NoaWZ0KTsKLQotCi0JCS8qIEFuZCBub3RlIHRoZSByZWdpc3RlciBudW1iZXIgaW4gdGhlIHJlZ2lzdGVyIGFycmF5LiAgKi8KLQkJbW4xMDMwMF9yZWdfb3BlcmFuZHNbb3BfaWR4IC0gMV0gPSBleC5YX2FkZF9udW1iZXI7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0JICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgYW5kIGl0IGRvZXNuJ3QKLQkJIGZpdCBpbnRvIHRoZSBhbGxvY2F0ZWQgYml0ZmllbGQgZm9yIHRoaXMgaW5zbiwKLQkJIHRoZW4gcHJvbW90ZSBpdCAoaWUgdGhpcyBvcGNvZGUgZG9lcyBub3QgbWF0Y2gpLiAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MKLQkJICAmIChNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCkKLQkJICAmJiAhIGNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlcikpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCi0JCQkJICAgICAgZXguWF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMLAotCQkJCSAgICAgIDAsIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgdGhlbiB0aGlzIG9wY29kZSBkaWRuJ3QKLQkJIG1hdGNoIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgaXQgbmVlZGVkIHByb21vdGlvbiEgICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotCSAgICAgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JCWFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICAgICAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgICAgICBmaXh1cHNbZmNdLm9waW5kZXggPSAqb3BpbmRleF9wdHI7Ci0JICAgICAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgICAgKytmYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi1rZWVwX2dvaW5nOgotCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQotCSAgICArK3N0cjsKLQotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHdlIHVzZWQgYWxsIHRoZSBvcGVyYW5kcyEgICovCi0gICAgICBpZiAoKnN0ciAhPSAnLCcpCi0JbWF0Y2ggPSAxOwotCi0gICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGhhcyByZWdpc3RlcnMgdGhhdCBtdXN0IG5vdCBtYXRjaCwgdmVyaWZ5Ci0JIHRoYXQgdGhleSBkbyBpbmRlZWQgbm90IG1hdGNoLiAgKi8KLSAgICAgIGlmIChvcGNvZGUtPm5vX21hdGNoX29wZXJhbmRzKQotCXsKLQkgIGludCBpOwotCi0JICAvKiBMb29rIGF0IGVhY2ggb3BlcmFuZCB0byBzZWUgaWYgaXQncyBtYXJrZWQuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IE1OMTAzMDBfTUFYX09QRVJBTkRTOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoKDEgPDwgaSkgJiBvcGNvZGUtPm5vX21hdGNoX29wZXJhbmRzKQotCQl7Ci0JCSAgaW50IGo7Ci0KLQkJICAvKiBvcGVyYW5kIEkgaXMgbWFya2VkLiAgQ2hlY2sgdGhhdCBpdCBkb2VzIG5vdCBtYXRjaCBhbnkKLQkJICAgICBvcGVyYW5kcyA+IEkgd2hpY2ggYXJlIG1hcmtlZC4gICovCi0JCSAgZm9yIChqID0gaSArIDE7IGogPCBNTjEwMzAwX01BWF9PUEVSQU5EUzsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoKCgxIDw8IGopICYgb3Bjb2RlLT5ub19tYXRjaF9vcGVyYW5kcykKLQkJCSAgJiYgbW4xMDMwMF9yZWdfb3BlcmFuZHNbaV0gPT0gbW4xMDMwMF9yZWdfb3BlcmFuZHNbal0pCi0JCQl7Ci0JCQkgIGVycm1zZyA9IF8oIkludmFsaWQgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4iKTsKLQkJCSAgbWF0Y2ggPSAwOwotCQkJICBnb3RvIGVycm9yOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotICAgICAgICB7Ci0JICBuZXh0X29wY29kZSA9IG9wY29kZSArIDE7Ci0JICBpZiAoIXN0cmNtcChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQkgICAgewotCSAgICAgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAKLQkgIGFzX2JhZCAoIiVzIiwgZXJybXNnKTsKLQkgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciAhPSAnXDAnKQotICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMCkKLSAgICBzaXplID0gMTsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMCkKLSAgICBzaXplID0gMjsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSkKLSAgICBzaXplID0gMzsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q2KQotICAgIHNpemUgPSAzOwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDcgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QxMCkKLSAgICBzaXplID0gNDsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q4KQotICAgIHNpemUgPSA2OwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDkpCi0gICAgc2l6ZSA9IDc7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNCkKLSAgICBzaXplID0gNTsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2IHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENSkKLSAgICBzaXplID0gNzsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyKQotICAgIHNpemUgPSA0OwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDQpCi0gICAgc2l6ZSA9IDY7Ci0KLSAgaWYgKHJlbGF4YWJsZSAmJiBmYyA+IDApCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0KLSAgICAgIC8qIGJDQyAqLwotICAgICAgaWYgKHNpemUgPT0gMikKLQl7Ci0JICAvKiBIYW5kbGUgYnJhIHNwZWNpYWxseS4gIEJhc2ljYWxseSB0cmVhdCBpdCBsaWtlIGptcCBzbwotCSAgICAgdGhhdCB3ZSBhdXRvbWF0aWNhbGx5IGhhbmRsZSA4LCAxNiBhbmQgMzIgYml0IG9mZnNldHMKLQkgICAgIGNvcnJlY3RseSBhcyB3ZWxsIGFzIGp1bXBzIHRvIGFuIHVuZGVmaW5lZCBhZGRyZXNzLgotCi0JICAgICBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3QgdHJlYXQgaXQgbGlrZSBvdGhlciBiQ0MKLQkgICAgIGluc3RydWN0aW9ucyBzaW5jZSB0aGUgbG9uZyBmb3JtcyBvZiBicmEgaXMgZGlmZmVyZW50Ci0JICAgICBmcm9tIG90aGVyIGJDQyBpbnN0cnVjdGlvbnMuICAqLwotCSAgaWYgKG9wY29kZS0+b3Bjb2RlID09IDB4Y2EwMCkKLQkgICAgdHlwZSA9IDEwOwotCSAgZWxzZQotCSAgICB0eXBlID0gMDsKLQl9Ci0gICAgICAvKiBjYWxsICovCi0gICAgICBlbHNlIGlmIChzaXplID09IDUpCi0gICAgICAgIHR5cGUgPSA2OwotICAgICAgLyogY2FsbHMgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkKLQl0eXBlID0gODsKLSAgICAgIC8qIGptcCAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAzICYmIG9wY29kZS0+b3Bjb2RlID09IDB4Y2MwMDAwKQotCXR5cGUgPSAxMDsKLSAgICAgIC8qIGJDQyAodW5jb21tb24gY2FzZXMpICovCi0gICAgICBlbHNlCi0JdHlwZSA9IDM7Ci0KLSAgICAgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDggLSBzaXplLCB0eXBlLAotCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCi0JCSAgICBmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKLQkJICAgIChjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOwotICAgICAgCi0gICAgICAvKiBUaGlzIGlzIHByZXR0eSBob2tleS4gIFdlIGJhc2ljYWxseSBqdXN0IGNhcmUgYWJvdXQgdGhlCi0JIG9wY29kZSwgc28gd2UgaGF2ZSB0byB3cml0ZSBvdXQgdGhlIGZpcnN0IHdvcmQgYmlnIGVuZGlhbi4KLQotCSBUaGUgZXhjZXB0aW9uIGlzICJjYWxsIiwgd2hpY2ggaGFzIHR3byBvcGVyYW5kcyB0aGF0IHdlCi0JIGNhcmUgYWJvdXQuCi0KLQkgVGhlIGZpcnN0IG9wZXJhbmQgKHRoZSByZWdpc3RlciBsaXN0KSBoYXBwZW5zIHRvIGJlIGluIHRoZQotCSBmaXJzdCBpbnN0cnVjdGlvbiB3b3JkLCBhbmQgd2lsbCBiZSBpbiB0aGUgcmlnaHQgcGxhY2UgaWYKLQkgd2Ugb3V0cHV0IHRoZSBmaXJzdCB3b3JkIGluIGJpZyBlbmRpYW4gbW9kZS4KLQotCSBUaGUgc2Vjb25kIG9wZXJhbmQgKHN0YWNrIHNpemUpIGlzIGluIHRoZSBleHRlbnNpb24gd29yZCwKLQkgYW5kIHdlIHdhbnQgaXQgdG8gYXBwZWFyIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGV4dGVuc2lvbgotCSB3b3JkIChhcyBpdCBhcHBlYXJzIGluIG1lbW9yeSkuICBMdWNraWx5LCB3cml0aW5nIHRoZSBleHRlbnNpb24KLQkgd29yZCBpbiBiaWcgZW5kaWFuIGZvcm1hdCB3aWxsIGRvIHdoYXQgd2Ugd2FudC4gICovCi0gICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplID4gNCA/IDQgOiBzaXplKTsKLSAgICAgIGlmIChzaXplID4gOCkKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNCwgZXh0ZW5zaW9uLCA0KTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA4LCAwLCBzaXplIC0gOCk7Ci0JfQotICAgICAgZWxzZSBpZiAoc2l6ZSA+IDQpCi0JbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiwgc2l6ZSAtIDQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZiA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gYnl0ZXMgZm9yIHRoZSBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCBvcGNvZGUgZmllbGRzCi0JIGFyZSB3cml0dGVuIGJpZy1lbmRpYW4sIDE2ICYgMzJiaXQgaW1tZWRpYXRlcyBhcmUgd3JpdHRlbgotCSBsaXR0bGUgZW5kaWFuLiAgRWdhZC4gICovCi0gICAgICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MwCi0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzEKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMAotCSAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q2Ci0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDcKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMTAKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSkKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhkZjAwMDAKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhkZTAwMDApCi0JewotCSAgLyogQSBmb3JtYXQgUzIgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBfbm90XyAicmV0IiBhbmQgInJldGYiLiAgKi8KLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIGluc24gJiAweGZmZmYsIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMikKLQl7Ci0JICAvKiBUaGlzIG11c3QgYmUgYSByZXQgb3IgcmV0Ziwgd2hpY2ggaXMgd3JpdHRlbiBlbnRpcmVseSBpbgotCSAgICAgYmlnLWVuZGlhbiBmb3JtYXQuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgMyk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0Ci0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZGMwMDAwMDApCi0JewotCSAgLyogVGhpcyBtdXN0IGJlIGEgZm9ybWF0IFM0ICJjYWxsIiBpbnN0cnVjdGlvbi4gIFdoYXQgYSBwYWluLiAgKi8KLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IChpbnNuID4+IDgpICYgMHhmZmZmOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgMywgaW5zbiAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNCkKLQl7Ci0JICAvKiBUaGlzIG11c3QgYmUgYSBmb3JtYXQgUzQgImptcCIgaW5zdHJ1Y3Rpb24uICAqLwotCSAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZmZmZmYpIDw8IDgpIHwgKGV4dGVuc2lvbiAmIDB4ZmYpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgNCk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZmZmKSA8PCA4KQotCSAgICB8ICgoZXh0ZW5zaW9uID4+IDE2KSAmIDB4ZmYpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNSwgKGV4dGVuc2lvbiA+PiA4KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDYsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMgotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGZhZjgwMDAwCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmFmMDAwMDAKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhmYWY0MDAwMCkKLQl7Ci0JICAvKiBBIGZvcm1hdCBEMiBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgMTZiaXQgaW1tZWRpYXRlIGlzCi0JICAgICByZWFsbHkgYSBzaW5nbGUgMTZiaXQgdmFsdWUsIG5vdCB0d28gOGJpdCB2YWx1ZXMuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCBpbnNuICYgMHhmZmZmLCAyKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIpCi0JewotCSAgLyogQSBmb3JtYXQgRDIgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIDE2Yml0IGltbWVkaWF0ZQotCSAgICAgaXMgcmVhbGx5IHR3byA4Yml0IGltbWVkaWF0ZXMuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgNCk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpIHwgKGV4dGVuc2lvbiAmIDB4ZmZmZik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIHRlbXAsIDQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENSkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KQotCSAgICAJCQl8ICgoZXh0ZW5zaW9uID4+IDgpICYgMHhmZmZmKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgdGVtcCwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNiwgZXh0ZW5zaW9uICYgMHhmZiwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q4KQotCXsKLSAgICAgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmKSA8PCAxNikgfCAoZXh0ZW5zaW9uICYgMHhmZmZmKTsKLSAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiA4KSAmIDB4ZmZmZmZmLCAzKTsKLSAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgMywgKHRlbXAgJiAweGZmKSwgMSk7Ci0gICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDQsIHRlbXAgPj4gOCwgMik7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q5KQotCXsKLSAgICAgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmKSA8PCAyNCkgfCAoZXh0ZW5zaW9uICYgMHhmZmZmZmYpOwotICAgICAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDgpICYgMHhmZmZmZmYsIDMpOwotICAgICAgICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAzLCB0ZW1wLCA0KTsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhbnkgZml4dXBzLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBmYzsgaSsrKQotCXsKLQkgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQkgIG9wZXJhbmQgPSAmbW4xMDMwMF9vcGVyYW5kc1tmaXh1cHNbaV0ub3BpbmRleF07Ci0JICBpZiAoZml4dXBzW2ldLnJlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JICAgIHsKLQkgICAgICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0bzsKLQkgICAgICBpbnQgc2l6ZTsKLQkgICAgICBpbnQgb2Zmc2V0OwotCSAgICAgIGZpeFMgKmZpeFA7Ci0KLQkgICAgICByZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXh1cHNbaV0ucmVsb2MpOwotCi0JICAgICAgaWYgKCFyZWxvY19ob3d0bykKLQkJYWJvcnQoKTsKLQkgIAotCSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgICAgIGlmIChzaXplIDwgMSB8fCBzaXplID4gNCkKLQkJYWJvcnQoKTsKLQotCSAgICAgIG9mZnNldCA9IDQgLSBzaXplOwotCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKLQkJCQkgIHNpemUsICZmaXh1cHNbaV0uZXhwLAotCQkJCSAgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCSAgZml4dXBzW2ldLnJlbG9jKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IHJlbG9jLCBwY3JlbCwgcmVsb2Nfc2l6ZSwgb2Zmc2V0OwotCSAgICAgIGZpeFMgKmZpeFA7Ci0KLQkgICAgICByZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotCSAgICAgIC8qIEhvdyBiaWcgaXMgdGhlIHJlbG9jPyAgUmVtZW1iZXIgU1BMSVQgcmVsb2NzIGFyZQotCQkgaW1wbGljaXRseSAzMmJpdHMuICAqLwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCi0JCXJlbG9jX3NpemUgPSAzMjsKLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfMjRCSVQpICE9IDApCi0JCXJlbG9jX3NpemUgPSAyNDsKLQkgICAgICBlbHNlCi0JCXJlbG9jX3NpemUgPSBvcGVyYW5kLT5iaXRzOwotCi0JICAgICAgLyogSXMgdGhlIHJlbG9jIHBjLXJlbGF0aXZlPyAgKi8KLQkgICAgICBwY3JlbCA9IChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCkgIT0gMDsKLQotCSAgICAgIC8qIEdyb3NzLiAgVGhpcyBkaXNndXN0aW5nIGhhY2sgaXMgdG8gbWFrZSBzdXJlIHdlCi0JCSBnZXQgdGhlIHJpZ2h0IG9mZnNldCBmb3IgdGhlIDE2LzMyIGJpdCByZWxvYyBpbiAKLQkJICJjYWxsIiBpbnN0cnVjdGlvbnMuICBCYXNpY2FsbHkgdGhleSdyZSBhIHBhaW4KLQkJIGJlY2F1c2UgdGhlIHJlbG9jIGlzbid0IGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoKHNpemUgPT0gNSB8fCBzaXplID09IDcpCi0JCSAgJiYgKCgoaW5zbiA+PiAyNCkgJiAweGZmKSA9PSAweGNkCi0JCSAgICAgIHx8ICgoaW5zbiA+PiAyNCkgJiAweGZmKSA9PSAweGRkKSkKLQkJc2l6ZSAtPSAyOwotCi0JICAgICAgLyogU2ltaWxhcmx5IGZvciBjZXJ0YWluIGJpdCBpbnN0cnVjdGlvbnMgd2hpY2ggZG9uJ3QKLQkJIGhhdiB0aGVpciAzMmJpdCByZWxvYyBhdCB0aGUgdGFpbCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChzaXplID09IDcKLQkJICAmJiAoKChpbnNuID4+IDE2KSAmIDB4ZmZmZikgPT0gMHhmZTAwCi0JCSAgICAgIHx8ICgoaW5zbiA+PiAxNikgJiAweGZmZmYpID09IDB4ZmUwMQotCQkgICAgICB8fCAoKGluc24gPj4gMTYpICYgMHhmZmZmKSA9PSAweGZlMDIpKQotCQlzaXplIC09IDE7Ci0JCi0JICAgICAgb2Zmc2V0ID0gc2l6ZSAtIHJlbG9jX3NpemUgLyA4OwotCi0JICAgICAgLyogQ2hvb3NlIGEgcHJvcGVyIEJGRCByZWxvY2F0aW9uIHR5cGUuICAqLwotCSAgICAgIGlmIChwY3JlbCkKLQkJewotCQkgIGlmIChyZWxvY19zaXplID09IDMyKQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzMyOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18xNjsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDgpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ184OwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICAvKiBDb252ZXJ0IHRoZSBzaXplIG9mIHRoZSByZWxvYyBpbnRvIHdoYXQgZml4X25ld19leHAgd2FudHMuICAqLwotCSAgICAgIHJlbG9jX3NpemUgPSByZWxvY19zaXplIC8gODsKLQkgICAgICBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQlyZWxvY19zaXplID0gMDsKLQkgICAgICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQlyZWxvY19zaXplID0gMTsKLQkgICAgICBlbHNlIGlmIChyZWxvY19zaXplID09IDMyKQotCQlyZWxvY19zaXplID0gMjsKLQotCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKLQkJCQkgIHJlbG9jX3NpemUsICZmaXh1cHNbaV0uZXhwLCBwY3JlbCwKLQkJCQkgICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSByZWxvYykpOwotCi0JICAgICAgaWYgKHBjcmVsKQotCQlmaXhQLT5meF9vZmZzZXQgKz0gb2Zmc2V0OwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi0vKiBpZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICAoaW50KWZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSAmJiBmaXhwLT5meF9zdWJzeSkKLSAgICB7Ci0gICAgCi0gICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJIkRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgaXMgbm90IHN1cHBvcnRlZCIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmYmZkX2Fic19zeW1ib2w7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gKFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkJICAgICAgIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KSArIGZpeHAtPmZ4X29mZnNldCk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YoIGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICAgIH0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHJldHVybiAyOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICByZXR1cm4gMzsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDYpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA3OwotCSAgcmV0dXJuIDc7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiA1OwotICAgIH0KLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA5OwotCSAgcmV0dXJuIDY7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiA0OwotICAgIH0KLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDEwKQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgfHwgc2VnICE9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gMTI7Ci0JICByZXR1cm4gNTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDI7Ci0gICAgfQotfSAKLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jaWYgMAotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTCAmJiAhIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0jZW5kaWYKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKiBXZSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZSBiZWNhdXNlIGxpbmtyZWxheCBpcyBub256ZXJvLiAgKi8KLSAgYWJvcnQgKCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMzAwX2luc2VydF9vcGVyYW5kIChpbnNucCwgZXh0ZW5zaW9ucCwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lLCBzaGlmdCkKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmV4dGVuc2lvbnA7Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNoaWZ0OwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gIE5vdGUgdGhhdAotICAgICBNTjEwMzAwX09QRVJBTkRfU1BMSVQgaXMgYW4gaW1wbGljaXQgMzJiaXQgb3BlcmFuZC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyCi0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLSAgICAgIGludCBiaXRzOwotCi0gICAgICBiaXRzID0gb3BlcmFuZC0+Yml0czsKLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkKLQliaXRzID0gMjQ7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgdGVzdCA9IHZhbDsKLQotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyICplcnIgPQotICAgICAgICAgICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpOwotICAgICAgICAgIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgICAgICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0gICAgICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICAgICAgICAgIGFzX3dhcm4gKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLSAgICAgICAgfQotICAgIH0KLQotICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSAhPSAwKQotICAgIHsKLSAgICAgICppbnNucCB8PSAodmFsID4+ICgzMiAtIG9wZXJhbmQtPmJpdHMpKSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotICAgICAgKmV4dGVuc2lvbnAgfD0gKCh2YWwgJiAoKDEgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpIC0gMSkpCi0JCSAgICAgIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkgIT0gMCkKLSAgICB7Ci0gICAgICAqaW5zbnAgfD0gKHZhbCA+PiAoMjQgLSBvcGVyYW5kLT5iaXRzKSkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLSAgICAgICpleHRlbnNpb25wIHw9ICgodmFsICYgKCgxIDw8ICgyNCAtIG9wZXJhbmQtPmJpdHMpKSAtIDEpKQotCQkgICAgICA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQpID09IDApCi0gICAgewotICAgICAgKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQpKTsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCkgIT0gMCkKLQkqaW5zbnAgfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JCSAgIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0ICsgb3BlcmFuZC0+Yml0cykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpleHRlbnNpb25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgICAgICA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCkpOwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEKSAhPSAwKQotCSpleHRlbnNpb25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkJPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQgKyBvcGVyYW5kLT5iaXRzKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotY2hlY2tfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gIE5vdGUgdGhhdAotICAgICBNTjEwMzAwX09QRVJBTkRfU1BMSVQgaXMgYW4gaW1wbGljaXQgMzJiaXQgb3BlcmFuZC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyCi0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLSAgICAgIGludCBiaXRzOwotCi0gICAgICBiaXRzID0gb3BlcmFuZC0+Yml0czsKLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkKLQliaXRzID0gMjQ7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgdGVzdCA9IHZhbDsKLQotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0JcmV0dXJuIDA7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9hcmNoX21hY2ggKG1hY2gpCi0gICAgIGludCBtYWNoOwotewotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21uMTAzMDAsIG1hY2gpKQotICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIGN1cnJlbnRfbWFjaGluZSA9IG1hY2g7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuaCBiL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmNiMjI3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogdGMtbW4xMDMwMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1tbjEwMzAwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19NTjEwMzAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgTU4xMDMwMCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tbjEwMzAwCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbW4xMDMwMCIKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0vKiBEb24ndCBib3RoZXIgdG8gYWRqdXN0IHJlbG9jcy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkgMAotCi0vKiBXZSBkbyByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGFzIHdlbGwgYXMgdGhlIGxpbmtlci4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1uczMyay5jIGIvZ2FzL2NvbmZpZy90Yy1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWYxNDY3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbnMzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMzAgKzAsMCBAQAotLyogbnMzMmsuYyAgLS0gQXNzZW1ibGUgb24gdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgMzJrIHNlcmllcwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qI2RlZmluZSBTSE9XX05VTSAxKi8vKiB1bmNvbW1lbnQgZm9yIGRlYnVnZ2luZyAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvcGNvZGUvbnMzMmsuaCIKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogTWFjcm9zICovCi0jZGVmaW5lIElJRl9FTlRSSUVTIDEzCQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBpaWYgKi8KLSNkZWZpbmUgUFJJVkFURV9TSVpFIDI1NgkvKiBzaXplIG9mIG15IGdhcmJhZ2UgbWVtb3J5ICovCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgREVGQVVMVAktMQkJLyogYWRkcl9tb2RlIHJldHVybnMgdGhpcyB2YWx1ZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWluIGNvbnN0YW50IG9yIGxhYmVsIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY291bnRlcmVkICovCi0KLSNkZWZpbmUgSUlGKHB0cixhMSxjMSxlMSxnMSxpMSxrMSxtMSxvMSxxMSxzMSx1MSkJXAotICAgIGlpZi5paWZQW3B0cl0udHlwZT0gYTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnNpemU9IGMxOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5vYmplY3Q9IGUxOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5vYmplY3RfYWRqdXN0PSBnMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5wY3JlbD0gaTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnBjcmVsX2FkanVzdD0gazE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0uaW1fZGlzcD0gbTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnJlbGF4X3N1YnN0YXRlPSBvMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5iaXRfZml4UD0gcTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLmFkZHJfbW9kZT0gczE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0uYnNyPSB1MTsKLQotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotI2RlZmluZSBMSU5FX0NPTU1FTlRfQ0hBUlMgInwiCi0jZGVmaW5lIEFCU09MVVRFX1BSRUZJWCAnQCcKLSNkZWZpbmUgSU1NRURJQVRFX1BSRUZJWCAnIycKLSNlbmRpZgotCi0jaWZuZGVmIExJTkVfQ09NTUVOVF9DSEFSUwotI2RlZmluZSBMSU5FX0NPTU1FTlRfQ0hBUlMgIiMiCi0jZW5kaWYKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gTElORV9DT01NRU5UX0NIQVJTOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0jaWYgIWRlZmluZWQoQUJTT0xVVEVfUFJFRklYKSAmJiAhZGVmaW5lZChJTU1FRElBVEVfUFJFRklYKQotI2RlZmluZSBBQlNPTFVURV9QUkVGSVggJ0AnCS8qIE9uZSBvciB0aGUgb3RoZXIgTVVTVCBiZSBkZWZpbmVkICovCi0jZW5kaWYKLQotc3RydWN0IGFkZHJfbW9kZQotICB7Ci0gICAgY2hhciBtb2RlOwkJCS8qIGFkZHJlc3NpbmcgbW9kZSBvZiBvcGVyYW5kICgwLTMxKSAqLwotICAgIGNoYXIgc2NhbGVkX21vZGU7CQkvKiBtb2RlIGNvbWJpbmVkIHdpdGggc2NhbGVkIG1vZGUgKi8KLSAgICBjaGFyIHNjYWxlZF9yZWc7CQkvKiByZWdpc3RlciB1c2VkIGluIHNjYWxlZCsxICgxLTgpICovCi0gICAgY2hhciBmbG9hdF9mbGFnOwkJLyogc2V0IGlmIFIwLi5SNyB3YXMgRjAuLkY3IGllIGEKLQkJCQkgICBmbG9hdGluZy1wb2ludC1yZWdpc3RlciAqLwotICAgIGNoYXIgYW1fc2l6ZTsJCS8qIGVzdGltYXRlZCBtYXggc2l6ZSBvZiBnZW5lcmFsIGFkZHItbW9kZQotCQkJCSAgIHBhcnRzICovCi0gICAgY2hhciBpbV9kaXNwOwkJLyogaWYgaW1fZGlzcD09MSB3ZSBoYXZlIGEgZGlzcGxhY2VtZW50ICovCi0gICAgY2hhciBwY3JlbDsJCQkvKiAxIGlmIHBjcmVsLCB0aGlzIGlzIHJlYWxseSByZWR1bmRhbnQgaW5mbyAqLwotICAgIGNoYXIgZGlzcF9zdWZmaXhbMl07CS8qIGxlbmd0aCBvZiBkaXNwbGFjZW1lbnQocyksIDA9dW5kZWZpbmVkICovCi0gICAgY2hhciAqZGlzcFsyXTsJCS8qIHBvaW50ZXIocykgYXQgZGlzcGxhY2VtZW50KHMpCi0JCQkJICAgb3IgaW1tZWRpYXRlcyhzKSAgICAgKGFzY2lpKSAqLwotICAgIGNoYXIgaW5kZXhfYnl0ZTsJCS8qIGluZGV4IGJ5dGUgKi8KLSAgfTsKLXR5cGVkZWYgc3RydWN0IGFkZHJfbW9kZSBhZGRyX21vZGVTOwotCi0KLWNoYXIgKmZyZWVwdHIsICpmcmVlcHRyX3N0YXRpYzsJLyogcG9pbnRzIGF0IHNvbWUgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgKi8KLXN0cnVjdCBoYXNoX2NvbnRyb2wgKmluc3RfaGFzaF9oYW5kbGU7Ci0KLXN0cnVjdCBuczMya19vcGNvZGUgKmRlc2M7CS8qIHBvaW50ZXIgYXQgZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24gKi8KLWFkZHJfbW9kZVMgYWRkcl9tb2RlUDsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmZCI7CS8qIHdlIGRvbid0IHdhbnQgdG8gc3VwcG9ydCBsb3dlcmNhc2UsIGRvIHdlICovCi0KLS8qIFVQUEVSQ0FTRSBkZW5vdGVzIGxpdmUgbmFtZXMgd2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBidWlsdCwgSUlGIGlzCi0gKiB1c2VkIGFzIGFuIGludGVybWVkaWF0ZSBmb3JtIHRvIHN0b3JlIHRoZSBhY3R1YWwgcGFydHMgb2YgdGhlCi0gKiBpbnN0cnVjdGlvbi4gQSBuczMyayBtYWNoaW5lIGluc3RydWN0aW9uIGNhbiBiZSBkaXZpZGVkIGludG8gYQotICogY291cGxlIG9mIHN1YiBQQVJUcy4gV2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBhc3NlbWJsZWQgdGhlCi0gKiBhcHByb3ByaWF0ZSBQQVJUIGdldCBhbiBhc3NpZ25tZW50LiBXaGVuIGFuIElJRiBoYXMgYmVlbiBjb21wbGV0ZWQKLSAqIGl0IGlzIGNvbnZlcnRlZCB0byBhIEZSQUdtZW50IGFzIHNwZWNpZmllZCBpbiBBUy5IICovCi0KLS8qIGludGVybmFsIHN0cnVjdHMgKi8KLXN0cnVjdCBuczMya19vcHRpb24KLSAgewotICAgIGNoYXIgKnBhdHRlcm47Ci0gICAgdW5zaWduZWQgbG9uZyBvcjsKLSAgICB1bnNpZ25lZCBsb25nIGFuZDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGludCB0eXBlOwkJCS8qIGhvdyB0byBpbnRlcnByZXQgb2JqZWN0ICovCi0gICAgaW50IHNpemU7CQkJLyogRXN0aW1hdGVkIG1heCBzaXplIG9mIG9iamVjdCAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2JqZWN0OwkvKiBiaW5hcnkgZGF0YSAqLwotICAgIGludCBvYmplY3RfYWRqdXN0OwkJLyogbnVtYmVyIGFkZGVkIHRvIG9iamVjdCAqLwotICAgIGludCBwY3JlbDsJCQkvKiBUcnVlIGlmIG9iamVjdCBpcyBwY3JlbCAqLwotICAgIGludCBwY3JlbF9hZGp1c3Q7CQkvKiBsZW5ndGggaW4gYnl0ZXMgZnJvbSB0aGUKLQkJCQkJICAgaW5zdHJ1Y3Rpb24gc3RhcnQgdG8gdGhlCi0JCQkJCSAgIGRpc3BsYWNlbWVudCAqLwotICAgIGludCBpbV9kaXNwOwkJLyogVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZGlzcGxhY2VtZW50ICovCi0gICAgcmVsYXhfc3Vic3RhdGVUIHJlbGF4X3N1YnN0YXRlOwkvKiBJbml0aWFsIHJlbGF4c3Vic3RhdGUgKi8KLSAgICBiaXRfZml4UyAqYml0X2ZpeFA7CQkvKiBQb2ludGVyIGF0IGJpdF9maXggc3RydWN0ICovCi0gICAgaW50IGFkZHJfbW9kZTsJCS8qIFdoYXQgYWRkcm1vZGUgZG8gd2UgYXNzb2NpYXRlIHdpdGggdGhpcwotCQkJCSAgIGlpZi1lbnRyeSAqLwotICAgIGNoYXIgYnNyOwkJCS8qIFNlcXVlbnQgaGFjayAqLwotICB9IGlpZl9lbnRyeVQ7CQkJLyogSW50ZXJuYWwgSW5zdHJ1Y3Rpb24gRm9ybWF0ICovCi0KLXN0cnVjdCBpbnRfaW5zX2Zvcm0KLSAgewotICAgIGludCBpbnN0cl9zaXplOwkJLyogTWF4IHNpemUgb2YgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuICovCi0gICAgaWlmX2VudHJ5VCBpaWZQW0lJRl9FTlRSSUVTICsgMV07Ci0gIH07Ci1zdHJ1Y3QgaW50X2luc19mb3JtIGlpZjsKLWV4cHJlc3Npb25TIGV4cHJQOwotY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotLyogZGVzY3JpcHRpb24gb2YgdGhlIFBBUlRzIGluIElJRgotICpvYmplY3Rbbl06Ci0gKiAwCXRvdGFsIGxlbmd0aCBpbiBieXRlcyBvZiBlbnRyaWVzIGluIGlpZgotICogMQlvcGNvZGUKLSAqIDIJaW5kZXhfYnl0ZV9hCi0gKiAzCWluZGV4X2J5dGVfYgotICogNAlkaXNwX2FfMQotICogNQlkaXNwX2FfMgotICogNglkaXNwX2JfMQotICogNwlkaXNwX2JfMgotICogOAlpbW1fYQotICogOQlpbW1fYgotICogMTAJaW1wbGllZDEKLSAqIDExCWltcGxpZWQyCi0gKgotICogRm9yIGV2ZXJ5IGVudHJ5IHRoZXJlIGlzIGEgZGF0YWxlbmd0aCBpbiBieXRlcy4gVGhpcyBpcyBzdG9yZWQgaW4gc2l6ZVtuXS4KLSAqCSAwLAl0aGUgb2JqZWN0bGVuZ3RoIGlzIG5vdCBleHBsaWNpdGx5IGdpdmVuIGJ5IHRoZSBpbnN0cnVjdGlvbgotICoJCWFuZCB0aGUgb3BlcmFuZCBpcyB1bmRlZmluZWQuIFRoaXMgaXMgYSBjYXNlIGZvciByZWxheGF0aW9uLgotICoJCVJlc2VydmUgNCBieXRlcyBmb3IgdGhlIGZpbmFsIG9iamVjdC4KLSAqCi0gKgkgMSwJdGhlIGVudHJ5IGNvbnRhaW5zIG9uZSBieXRlCi0gKgkgMiwJdGhlIGVudHJ5IGNvbnRhaW5zIHR3byBieXRlcwotICoJIDMsCXRoZSBlbnRyeSBjb250YWlucyB0aHJlZSBieXRlcwotICoJIDQsCXRoZSBlbnRyeSBjb250YWlucyBmb3VyIGJ5dGVzCi0gKglldGMKLSAqCi0gKiBGdXJ0aGVybW9yZSwgZXZlcnkgZW50cnkgaGFzIGEgZGF0YSB0eXBlIGlkZW50aWZpZXIgaW4gdHlwZVtuXS4KLSAqCi0gKiAJIDAsCXRoZSBlbnRyeSBpcyB2b2lkLCBpZ25vcmUgaXQuCi0gKiAJIDEsCXRoZSBlbnRyeSBpcyBhIGJpbmFyeSBudW1iZXIuCi0gKgkgMiwJdGhlIGVudHJ5IGlzIGEgcG9pbnRlciBhdCBhbiBleHByZXNzaW9uLgotICoJCVdoZXJlIGV4cHJlc3Npb24gbWF5IGJlIGFzIHNpbXBsZSBhcyBhIHNpbmdsZSAnMScsCi0gKgkJYW5kIGFzIGNvbXBsaWNhdGVkIGFzICBmb28tYmFyKzEyLAotICogCQlmb28gYW5kIGJhciBtYXkgYmUgdW5kZWZpbmVkIGJ1dCBzdWZmaXhlZCBieSA6e2J8d3xkfSB0bwotICoJCWNvbnRyb2wgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0LgotICoKLSAqCSAzLAl0aGUgZW50cnkgaXMgYSBwb2ludGVyIGF0IGEgYmlnbnVtIHN0cnVjdAotICoKLSAqCi0gKiBUaGUgbG93LW9yZGVyLWJ5dGUgY29yZXNwb25kcyB0byBsb3cgcGh5c2ljYWwgbWVtb3J5LgotICogT2J2aW91c2x5IGEgRlJBR21lbnQgbXVzdCBiZSBjcmVhdGVkIGZvciBlYWNoIHZhbGlkIGRpc3AgaW4gUEFSVCB3aG9zZQotICogZGF0YWxlbmd0aCBpcyB1bmRlZmluZWQgKHRvIGJhZCkgLgotICogVGhlIGNhc2Ugd2hlcmUganVzdCB0aGUgZXhwcmVzc2lvbiBpcyB1bmRlZmluZWQgaXMgbGVzcyBzZXZlcmUgYW5kIGlzCi0gKiBoYW5kbGVkIGJ5IGZpeC4gSGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvYmplY3RmaWxlIGlzIGtub3duLgotICogV2l0aCB0aGlzIHJlcHJlc2VudGF0aW9uIHdlIHNpbXBsaWZ5IHRoZSBhc3NlbWJseSBhbmQgc2VwYXJhdGVzIHRoZQotICogbWFjaGluZSBkZXBlbmRlbnQvaW5kZXBlbmRlbnQgcGFydHMgaW4gYSBtb3JlIGNsZWFuIHdheSAoc2FpZCBPRSkKLSAqLwotDAotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQxW10gPQkJLyogcmVzdG9yZSwgZXhpdCAqLwotewotICB7InIwIiwgMHg4MCwgMHhmZn0sCi0gIHsicjEiLCAweDQwLCAweGZmfSwKLSAgeyJyMiIsIDB4MjAsIDB4ZmZ9LAotICB7InIzIiwgMHgxMCwgMHhmZn0sCi0gIHsicjQiLCAweDA4LCAweGZmfSwKLSAgeyJyNSIsIDB4MDQsIDB4ZmZ9LAotICB7InI2IiwgMHgwMiwgMHhmZn0sCi0gIHsicjciLCAweDAxLCAweGZmfSwKLSAgezAsIDB4MDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQyW10gPQkJLyogc2F2ZSwgZW50ZXIgKi8KLXsKLSAgeyJyMCIsIDB4MDEsIDB4ZmZ9LAotICB7InIxIiwgMHgwMiwgMHhmZn0sCi0gIHsicjIiLCAweDA0LCAweGZmfSwKLSAgeyJyMyIsIDB4MDgsIDB4ZmZ9LAotICB7InI0IiwgMHgxMCwgMHhmZn0sCi0gIHsicjUiLCAweDIwLCAweGZmfSwKLSAgeyJyNiIsIDB4NDAsIDB4ZmZ9LAotICB7InI3IiwgMHg4MCwgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0M1tdID0JCS8qIHNldGNmZyAqLwotewotICB7ImMiLCAweDgsIDB4ZmZ9LAotICB7Im0iLCAweDQsIDB4ZmZ9LAotICB7ImYiLCAweDIsIDB4ZmZ9LAotICB7ImkiLCAweDEsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0NFtdID0JCS8qIGNpbnYgKi8KLXsKLSAgeyJhIiwgMHg0LCAweGZmfSwKLSAgeyJpIiwgMHgyLCAweGZmfSwKLSAgeyJkIiwgMHgxLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDVbXSA9CQkvKiBzdHJpbmcgaW5zdCAqLwotewotICB7ImIiLCAweDIsIDB4ZmZ9LAotICB7InUiLCAweGMsIDB4ZmZ9LAotICB7InciLCAweDQsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0NltdID0JCS8qIHBsYWluIHJlZyBleHQsY3Z0cCBldGMgKi8KLXsKLSAgeyJyMCIsIDB4MDAsIDB4ZmZ9LAotICB7InIxIiwgMHgwMSwgMHhmZn0sCi0gIHsicjIiLCAweDAyLCAweGZmfSwKLSAgeyJyMyIsIDB4MDMsIDB4ZmZ9LAotICB7InI0IiwgMHgwNCwgMHhmZn0sCi0gIHsicjUiLCAweDA1LCAweGZmfSwKLSAgeyJyNiIsIDB4MDYsIDB4ZmZ9LAotICB7InI3IiwgMHgwNywgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLQotI2lmICFkZWZpbmVkKE5TMzIwMzIpICYmICFkZWZpbmVkKE5TMzI1MzIpCi0jZGVmaW5lIE5TMzI1MzIKLSNlbmRpZgotCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uIGNwdXJlZ181MzJbXSA9CS8qIGxwciBzcHIgKi8KLXsKLSAgeyJ1cyIsIDB4MCwgMHhmZn0sCi0gIHsiZGNyIiwgMHgxLCAweGZmfSwKLSAgeyJicGMiLCAweDIsIDB4ZmZ9LAotICB7ImRzciIsIDB4MywgMHhmZn0sCi0gIHsiY2FyIiwgMHg0LCAweGZmfSwKLSAgeyJmcCIsIDB4OCwgMHhmZn0sCi0gIHsic3AiLCAweDksIDB4ZmZ9LAotICB7InNiIiwgMHhhLCAweGZmfSwKLSAgeyJ1c3AiLCAweGIsIDB4ZmZ9LAotICB7ImNmZyIsIDB4YywgMHhmZn0sCi0gIHsicHNyIiwgMHhkLCAweGZmfSwKLSAgeyJpbnRiYXNlIiwgMHhlLCAweGZmfSwKLSAgeyJtb2QiLCAweGYsIDB4ZmZ9LAotICB7MCwgMHgwMCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG1tdXJlZ181MzJbXSA9CS8qIGxtciBzbXIgKi8KLXsKLSAgeyJtY3IiLCAweDksIDB4ZmZ9LAotICB7Im1zciIsIDB4YSwgMHhmZn0sCi0gIHsidGVhciIsIDB4YiwgMHhmZn0sCi0gIHsicHRiMCIsIDB4YywgMHhmZn0sCi0gIHsicHRiMSIsIDB4ZCwgMHhmZn0sCi0gIHsiaXZhcjAiLCAweGUsIDB4ZmZ9LAotICB7Iml2YXIxIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci0KLXN0cnVjdCBuczMya19vcHRpb24gY3B1cmVnXzAzMltdID0JLyogbHByIHNwciAqLwotewotICB7InVwc3IiLCAweDAsIDB4ZmZ9LAotICB7ImZwIiwgMHg4LCAweGZmfSwKLSAgeyJzcCIsIDB4OSwgMHhmZn0sCi0gIHsic2IiLCAweGEsIDB4ZmZ9LAotICB7InBzciIsIDB4ZCwgMHhmZn0sCi0gIHsiaW50YmFzZSIsIDB4ZSwgMHhmZn0sCi0gIHsibW9kIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG1tdXJlZ18wMzJbXSA9CS8qIGxtciBzbXIgKi8KLXsKLSAgeyJicHIwIiwgMHgwLCAweGZmfSwKLSAgeyJicHIxIiwgMHgxLCAweGZmfSwKLSAgeyJwZjAiLCAweDQsIDB4ZmZ9LAotICB7InBmMSIsIDB4NSwgMHhmZn0sCi0gIHsic2MiLCAweDgsIDB4ZmZ9LAotICB7Im1zciIsIDB4YSwgMHhmZn0sCi0gIHsiYmNudCIsIDB4YiwgMHhmZn0sCi0gIHsicHRiMCIsIDB4YywgMHhmZn0sCi0gIHsicHRiMSIsIDB4ZCwgMHhmZn0sCi0gIHsiZWlhIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci0KLSNpZiBkZWZpbmVkKE5TMzI1MzIpCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uICpjcHVyZWcgPSBjcHVyZWdfNTMyOwotc3RydWN0IG5zMzJrX29wdGlvbiAqbW11cmVnID0gbW11cmVnXzUzMjsKLSNlbHNlCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uICpjcHVyZWcgPSBjcHVyZWdfMDMyOwotc3RydWN0IG5zMzJrX29wdGlvbiAqbW11cmVnID0gbW11cmVnXzAzMjsKLSNlbmRpZgotDAotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewkJCQkJLyogc28gZmFyIGVtcHR5ICovCi0gIHswLCAwLCAwfQotfTsKLQotI2RlZmluZSBJTkQoeCx5KQkoKCh4KTw8MikrKHkpKQotCi0vKiB0aG9zZSBhcmUgaW5kZXgncyB0byByZWxheCBncm91cHMgaW4gbWRfcmVsYXhfdGFibGUgaWUgaXQgbXVzdCBiZQotICAgbXVsdGlwbGllZCBieSA0IHRvIHBvaW50IGF0IGEgZ3JvdXAgc3RhcnQuIFZpeiBJTkQoeCx5KSBTZSBmdW5jdGlvbgotICAgcmVsYXhfc2VnbWVudCBpbiB3cml0ZS5jIGZvciBtb3JlIGluZm8gKi8KLQotI2RlZmluZSBCUkFOQ0gJCTEKLSNkZWZpbmUgUENSRUwJCTIKLQotLyogdGhvc2UgYXJlIGluZGV4J3MgdG8gZW50cmllcyBpbiBhIHJlbGF4IGdyb3VwICovCi0KLSNkZWZpbmUgQllURQkJMAotI2RlZmluZSBXT1JECQkxCi0jZGVmaW5lIERPVUJMRQkJMgotI2RlZmluZSBVTkRFRiAgICAgICAgICAgMwotLyogVGhvc2UgbGltaXRzIGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRpc3BsYWNlbWVudCBzdGFydCBpbiBtZW1vcnkuCi0gICBUaGUgbnMzMmsgdXNlcyB0aGUgYmVnaW5pbmcgb2YgdGhlIGluc3RydWN0aW9uIGFzIGRpc3BsYWNlbWVudAotICAgYmFzZS4gIFRoaXMgdHlwZSBvZiBkaXNwbGFjZW1lbnRzIGNvdWxkIGJlIGhhbmRsZWQgaGVyZSBieSBtb3ZpbmcKLSAgIHRoZSBsaW1pdCB3aW5kb3cgdXAgb3IgZG93bi4gSSBjaG9vc2UgdG8gdXNlIGFuIGludGVybmFsCi0gICBkaXNwbGFjZW1lbnQgYmFzZS1hZGp1c3QgYXMgdGhlcmUgYXJlIG90aGVyIHJvdXRpbmVzIHRoYXQgbXVzdAotICAgY29uc2lkZXIgdGhpcy4gQWxzbywgYXMgd2UgaGF2ZSB0d28gdmFyaW91cyBvZmZzZXQtYWRqdXN0cyBpbiB0aGUKLSAgIG5zMzJrIChhY2IgdmVyc3VzIGJyL2Jycy9qc3IvYmNvbmQpLCB0d28gc2V0IG9mIGxpbWl0cyB3b3VsZCBoYXZlCi0gICBoYWQgdG8gYmUgdXNlZC4gIE5vdyB3ZSBkb250IGhhdmUgdG8gdGhpbmsgYWJvdXQgdGhhdC4gKi8KLQotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsoNjMpLCAoLTY0KSwgMSwgSU5EIChCUkFOQ0gsIFdPUkQpfSwKLSAgeyg4MTkyKSwgKC04MTkyKSwgMiwgSU5EIChCUkFOQ0gsIERPVUJMRSl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfQotfTsKLQotLyogQXJyYXkgdXNlZCB0byB0ZXN0IGlmIG1vZGUgY29udGFpbnMgZGlzcGxhY2VtZW50cy4KLSAgIFZhbHVlIGlzIHRydWUgaWYgbW9kZSBjb250YWlucyBkaXNwbGFjZW1lbnQuICovCi0KLWNoYXIgZGlzcF90ZXN0W10gPQotezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLAotIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OwotCi0vKiBBcnJheSB1c2VkIHRvIGNhbGN1bGF0ZSBtYXggc2l6ZSBvZiBkaXNwbGFjZW1lbnRzICovCi0KLWNoYXIgZGlzcF9zaXplW10gPQotezQsIDEsIDIsIDAsIDR9OwotDAotc3RhdGljIHZvaWQgZXZhbHVhdGVfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqIHJlc3VsdFAsIGNoYXIgKnB0cikpOwotc3RhdGljIHZvaWQgbWRfbnVtYmVyX3RvX2Rpc3AgUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIHZhbCwgaW50IG4pKTsKLXN0YXRpYyB2b2lkIG1kX251bWJlcl90b19pbW0gUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIHZhbCwgaW50IG4pKTsKLQotLyogUGFyc2VzIGEgZ2VuZXJhbCBvcGVyYW5kIGludG8gYW4gYWRkcmVzc2luZ21vZGUgc3RydWN0Ci0KLSAgIGluOiAgcG9pbnRlciBhdCBvcGVyYW5kIGluIGFzY2lpIGZvcm0KLSAgIHBvaW50ZXIgYXQgYWRkcl9tb2RlIHN0cnVjdCBmb3IgcmVzdWx0Ci0gICB0aGUgbGV2ZWwgb2YgcmVjdXJzaW9uLiAoYWx3YXlzIDAgb3IgMSkKLQotICAgb3V0OiBkYXRhIGluIGFkZHJfbW9kZSBzdHJ1Y3QKLSAgICovCi1pbnQKLWFkZHJfbW9kZSAob3BlcmFuZCwgYWRkcl9tb2RlUCwgcmVjdXJzaXZlX2xldmVsKQotICAgICBjaGFyICpvcGVyYW5kOwotICAgICByZWdpc3RlciBhZGRyX21vZGVTICphZGRyX21vZGVQOwotICAgICBpbnQgcmVjdXJzaXZlX2xldmVsOwotewotICByZWdpc3RlciBjaGFyICpzdHI7Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciBpbnQgc3RybDsKLSAgcmVnaXN0ZXIgaW50IG1vZGU7Ci0gIGludCBqOwotICBtb2RlID0gREVGQVVMVDsJCS8qIGRlZmF1bHQgKi8KLSAgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPSAwOwkvKiB3aHkgbm90ICovCi0gIGFkZHJfbW9kZVAtPnNjYWxlZF9yZWcgPSAwOwkvKiBpZiAwLCBub3Qgc2NhbGVkIGluZGV4ICovCi0gIGFkZHJfbW9kZVAtPmZsb2F0X2ZsYWcgPSAwOwotICBhZGRyX21vZGVQLT5hbV9zaXplID0gMDsKLSAgYWRkcl9tb2RlUC0+aW1fZGlzcCA9IDA7Ci0gIGFkZHJfbW9kZVAtPnBjcmVsID0gMDsJLyogbm90IHNldCBpbiB0aGlzIGZ1bmN0aW9uICovCi0gIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4WzBdID0gMDsKLSAgYWRkcl9tb2RlUC0+ZGlzcF9zdWZmaXhbMV0gPSAwOwotICBhZGRyX21vZGVQLT5kaXNwWzBdID0gTlVMTDsKLSAgYWRkcl9tb2RlUC0+ZGlzcFsxXSA9IE5VTEw7Ci0gIHN0ciA9IG9wZXJhbmQ7Ci0gIGlmIChzdHJbMF0gPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0JCQkJLyogd2UgZG9uJ3Qgd2FudCB0aGlzICovCi0gIHN0cmwgPSBzdHJsZW4gKHN0cik7Ci0gIHN3aXRjaCAoc3RyWzBdKQotICAgIHsKLSAgICAgIC8qIHRoZSBmb2xsb3dpbmcgdGhyZWUgY2FzZSBzdGF0ZW1lbnRzIGNvbnRyb2xzIHRoZSBtb2RlLWNoYXJzCi0JIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGVkIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGVtICovCi0jaWZkZWYgQUJTT0xVVEVfUFJFRklYCi0gICAgY2FzZSBBQlNPTFVURV9QUkVGSVg6Ci0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSA9PSAnXScpCi0JYnJlYWs7Ci0gICAgICBhZGRyX21vZGVQLT5tb2RlID0gMjE7CS8qIGFic29sdXRlICovCi0gICAgICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgMTsKLSAgICAgIHJldHVybiAoLTEpOwotI2VuZGlmCi0jaWZkZWYgSU1NRURJQVRFX1BSRUZJWAotICAgIGNhc2UgSU1NRURJQVRFX1BSRUZJWDoKLSAgICAgIGlmIChzdHJbc3RybCAtIDFdID09ICddJykKLQlicmVhazsKLSAgICAgIGFkZHJfbW9kZVAtPm1vZGUgPSAyMDsJLyogaW1tZWRpYXRlICovCi0gICAgICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgMTsKLSAgICAgIHJldHVybiAoLTEpOwotI2VuZGlmCi0gICAgY2FzZSAnLic6Ci0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSAhPSAnXScpCi0JewotCSAgc3dpdGNoIChzdHJbMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnLSc6Ci0JICAgIGNhc2UgJysnOgotCSAgICAgIGlmIChzdHJbMl0gIT0gJ1wwMDAnKQotCQl7Ci0JCSAgYWRkcl9tb2RlUC0+bW9kZSA9IDI3OwkvKiBwYy1yZWxhdGl2ICovCi0JCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIDI7Ci0JCSAgcmV0dXJuICgtMSk7Ci0JCX0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc193YXJuIChfKCJJbnZhbGlkIHN5bnRheCBpbiBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUiKSk7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2UnOgotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gIT0gJ10nKQotCXsKLQkgIGlmICgoIXN0cm5jbXAgKHN0ciwgImV4dCgiLCA0KSkgJiYgc3RybCA+IDcpCi0JICAgIHsJCQkJLyogZXh0ZXJuYWwgKi8KLQkgICAgICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgNDsKLQkgICAgICBpID0gMDsKLQkgICAgICBqID0gMjsKLQkgICAgICBkbwotCQl7CQkJLyogZGlzcFswXSdzIHRlcm1pbmF0aW9uIHBvaW50ICovCi0JCSAgaiArPSAxOwotCQkgIGlmIChzdHJbal0gPT0gJygnKQotCQkgICAgaSsrOwotCQkgIGlmIChzdHJbal0gPT0gJyknKQotCQkgICAgaS0tOwotCQl9Ci0JICAgICAgd2hpbGUgKGogPCBzdHJsICYmIGkgIT0gMCk7Ci0JICAgICAgaWYgKGkgIT0gMCB8fCAhKHN0cltqICsgMV0gPT0gJy0nIHx8IHN0cltqICsgMV0gPT0gJysnKSkKLQkJewotCQkgIGFzX3dhcm4gKF8oIkludmFsaWQgc3ludGF4IGluIEV4dGVybmFsIGFkZHJlc3NpbmcgbW9kZSIpKTsKLQkJICByZXR1cm4gKDApOwotCQl9Ci0JICAgICAgc3RyW2pdID0gJ1wwMDAnOwkJLyogbnVsbCB0ZXJtaW5hdGUgZGlzcFswXSAqLwotCSAgICAgIGFkZHJfbW9kZVAtPmRpc3BbMV0gPSBzdHIgKyBqICsgMjsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gMjI7Ci0JICAgICAgcmV0dXJuICgtMSk7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OjsKLSAgICB9Ci0gIHN0cmwgPSBzdHJsZW4gKHN0cik7Ci0gIHN3aXRjaCAoc3RybCkKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgc3dpdGNoIChzdHJbMF0pCi0JewotCWNhc2UgJ2YnOgotCSAgYWRkcl9tb2RlUC0+ZmxvYXRfZmxhZyA9IDE7Ci0JY2FzZSAncic6Ci0JICBpZiAoc3RyWzFdID49ICcwJyAmJiBzdHJbMV0gPCAnOCcpCi0JICAgIHsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gc3RyWzFdIC0gJzAnOwotCSAgICAgIHJldHVybiAoLTEpOwotCSAgICB9Ci0JfQotICAgIGNhc2UgMzoKLSAgICAgIGlmICghc3RybmNtcCAoc3RyLCAidG9zIiwgMykpCi0JewotCSAgYWRkcl9tb2RlUC0+bW9kZSA9IDIzOwkvKiBUb3BPZlN0YWNrICovCi0JICByZXR1cm4gKC0xKTsKLQl9Ci0gICAgZGVmYXVsdDo7Ci0gICAgfQotICBpZiAoc3RybCA+IDQpCi0gICAgewotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gPT0gJyknKQotCXsKLQkgIGlmIChzdHJbc3RybCAtIDJdID09ICcpJykKLQkgICAgewotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNV0sICIoZnAiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAxNjsJCS8qIE1lbW9yeSBSZWxhdGl2ZSAqLwotCQl9Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA1XSwgIihzcCIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDE3OwotCQl9Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA1XSwgIihzYiIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDE4OwotCQl9Ci0JICAgICAgaWYgKG1vZGUgIT0gREVGQVVMVCkKLQkJewkJCS8qIG1lbW9yeSByZWxhdGl2ZSAqLwotCQkgIGFkZHJfbW9kZVAtPm1vZGUgPSBtb2RlOwotCQkgIGogPSBzdHJsIC0gNTsJCS8qIHRlbXAgZm9yIGVuZCBvZiBkaXNwWzBdICovCi0JCSAgaSA9IDA7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgc3RybCAtPSAxOwotCQkgICAgICBpZiAoc3RyW3N0cmxdID09ICcpJykKLQkJCWkrKzsKLQkJICAgICAgaWYgKHN0cltzdHJsXSA9PSAnKCcpCi0JCQlpLS07Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKHN0cmwgPiAtMSAmJiBpICE9IDApOwotCQkgIGlmIChpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgc3ludGF4IGluIE1lbW9yeSBSZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUiKSk7Ci0JCSAgICAgIHJldHVybiAoMCk7Ci0JCSAgICB9Ci0JCSAgYWRkcl9tb2RlUC0+ZGlzcFsxXSA9IHN0cjsKLQkJICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgc3RybCArIDE7Ci0JCSAgc3RyW2pdID0gJ1wwMDAnOwkvKiBudWxsIHRlcm1pbmF0ZSBkaXNwWzBdICovCi0JCSAgc3RyW3N0cmxdID0gJ1wwMDAnOwkvKiBudWxsIHRlcm1pbmF0ZSBkaXNwWzFdICovCi0JCSAgcmV0dXJuICgtMSk7Ci0JCX0KLQkgICAgfQotCSAgc3dpdGNoIChzdHJbc3RybCAtIDNdKQotCSAgICB7Ci0JICAgIGNhc2UgJ3InOgotCSAgICBjYXNlICdSJzoKLQkgICAgICBpZiAoc3RyW3N0cmwgLSAyXSA+PSAnMCcKLQkJICAmJiBzdHJbc3RybCAtIDJdIDwgJzgnCi0JCSAgJiYgc3RyW3N0cmwgLSA0XSA9PSAnKCcpCi0JCXsKLQkJICBhZGRyX21vZGVQLT5tb2RlID0gc3RyW3N0cmwgLSAyXSAtICcwJyArIDg7Ci0JCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0cjsKLQkJICBzdHJbc3RybCAtIDRdID0gMDsKLQkJICByZXR1cm4gKC0xKTsJCS8qIHJlZyByZWwgKi8KLQkJfQotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIoZnAiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNDsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIoc3AiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNTsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIoc2IiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNjsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIocGMiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNzsKLQkJfQotCSAgICAgIGlmIChtb2RlICE9IERFRkFVTFQpCi0JCXsKLQkJICBhZGRyX21vZGVQLT5tb2RlID0gbW9kZTsKLQkJICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyOwotCQkgIHN0cltzdHJsIC0gNF0gPSAnXDAnOwotCQkgIHJldHVybiAoLTEpOwkJLyogbWVtb3J5IHNwYWNlICovCi0JCX0KLQkgICAgfQotCX0KLSAgICAgIC8qIG5vIHRyYWlsaW5nICcpJyBkbyB3ZSBoYXZlIGEgJ10nID8gKi8KLSAgICAgIGlmIChzdHJbc3RybCAtIDFdID09ICddJykKLQl7Ci0JICBzd2l0Y2ggKHN0cltzdHJsIC0gMl0pCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgbW9kZSA9IDI4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd3JzoKLQkgICAgICBtb2RlID0gMjk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIG1vZGUgPSAzMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncSc6Ci0JICAgICAgbW9kZSA9IDMxOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OjsKLQkgICAgICBhc193YXJuIChfKCJJbnZhbGlkIHNjYWxlZC1pbmRleGVkIG1vZGUsIHVzZSAoYix3LGQscSkiKSk7Ci0JICAgICAgaWYgKHN0cltzdHJsIC0gM10gIT0gJzonIHx8IHN0cltzdHJsIC0gNl0gIT0gJ1snCi0JCSAgfHwgc3RyW3N0cmwgLSA1XSA9PSAncicgfHwgc3RyW3N0cmwgLSA0XSA8ICcwJwotCQkgIHx8IHN0cltzdHJsIC0gNF0gPiAnNycpCi0JCXsKLQkJICBhc193YXJuIChfKCJTeW50YXggaW4gc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIFtSbjptXSB3aGVyZSBuPVswLi43XSBtPXtiLHcsZCxxfSIpKTsKLQkJfQotCSAgICB9IC8qIHNjYWxlZCBpbmRleCAqLwotCSAgewotCSAgICBpZiAocmVjdXJzaXZlX2xldmVsID4gMCkKLQkgICAgICB7Ci0JCWFzX3dhcm4gKF8oIlNjYWxlZC1pbmRleGVkIGFkZHJlc3NpbmcgbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZC1pbmRleCIpKTsKLQkJcmV0dXJuICgwKTsKLQkgICAgICB9Ci0JICAgIGFkZHJfbW9kZVAtPmFtX3NpemUgKz0gMTsJLyogc2NhbGVkIGluZGV4IGJ5dGUgKi8KLQkgICAgaiA9IHN0cltzdHJsIC0gNF0gLSAnMCc7CS8qIHN0b3JlIHRlbXBvcmFyeSAqLwotCSAgICBzdHJbc3RybCAtIDZdID0gJ1wwMDAnOwkvKiBudWxsdGVybWluYXRlIGZvciByZWN1cnNpdmUgY2FsbCAqLwotCSAgICBpID0gYWRkcl9tb2RlIChzdHIsIGFkZHJfbW9kZVAsIDEpOwotCSAgICBpZiAoIWkgfHwgYWRkcl9tb2RlUC0+bW9kZSA9PSAyMCkKLQkgICAgICB7Ci0JCWFzX3dhcm4gKF8oIkludmFsaWQgb3IgaWxsZWdhbCBhZGRyZXNzaW5nIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQtaW5kZXgiKSk7Ci0JCXJldHVybiAoMCk7Ci0JICAgICAgfQotCSAgICBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9IGFkZHJfbW9kZVAtPm1vZGU7CS8qIHN0b3JlIHRoZSBpbmZlcmlvcgotCQkJCQkJCSAgIG1vZGUgKi8KLQkgICAgYWRkcl9tb2RlUC0+bW9kZSA9IG1vZGU7Ci0JICAgIGFkZHJfbW9kZVAtPnNjYWxlZF9yZWcgPSBqICsgMTsKLQkgICAgcmV0dXJuICgtMSk7Ci0JICB9Ci0JfQotICAgIH0KLSAgYWRkcl9tb2RlUC0+bW9kZSA9IERFRkFVTFQ7CS8qIGRlZmF1bHQgdG8gd2hhdGV2ZXIgKi8KLSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0cjsKLSAgcmV0dXJuICgtMSk7Ci19Ci0MCi0vKiBwdHIgcG9pbnRzIGF0IHN0cmluZyBhZGRyX21vZGVQIHBvaW50cyBhdCBzdHJ1Y3Qgd2l0aCByZXN1bHQgVGhpcwotICAgcm91dGluZSBjYWxscyBhZGRyX21vZGUgdG8gZGV0ZXJtaW5lIHRoZSBnZW5lcmFsIGFkZHIubW9kZSBvZiB0aGUKLSAgIG9wZXJhbmQuIFdoZW4gdGhpcyBpcyByZWFkeSBpdCBwYXJzZXMgdGhlIGRpc3BsYWNlbWVudHMgZm9yIHNpemUKLSAgIHNwZWNpZnlpbmcgc3VmZml4ZXMgYW5kIGRldGVybWluZXMgc2l6ZSBvZiBpbW1lZGlhdGUgbW9kZSB2aWEKLSAgIG5zMzJrLW9wY29kZS4gIEFsc28gYnVpbGRzIGluZGV4IGJ5dGVzIGlmIG5lZWRlZC4gICovCi1pbnQKLWdldF9hZGRyX21vZGUgKHB0ciwgYWRkcl9tb2RlUCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyX21vZGVTICphZGRyX21vZGVQOwotewotICBpbnQgdG1wOwotICBhZGRyX21vZGUgKHB0ciwgYWRkcl9tb2RlUCwgMCk7Ci0gIGlmIChhZGRyX21vZGVQLT5tb2RlID09IERFRkFVTFQgfHwgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPT0gLTEpCi0gICAgewotICAgICAgLyogcmVzb2x2ZSBhbWJpZ2lvdXMgb3BlcmFuZHMsIHRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZgotCSBvbmUgdXNlcyBzdGFuZGFyZCBOU0Mgb3BlcmFuZCBzeW50YXguIEJ1dCB0aGUgc2VxdWVudAotCSBjb21waWxlciBkb2Vzbid0ISEhICBUaGlzIGZpbmRzIGEgcHJvcGVyIGFkZHJlc3NpbmdpbmcgbW9kZQotCSBpZiBpdCBpcyBpbXBsaWNpdGx5IHN0YXRlZC4gU2VlIG5zMzJrLW9wY29kZS5oICovCi0gICAgICAodm9pZCkgZXZhbHVhdGVfZXhwciAoJmV4cHJQLCBwdHIpOyAvKiB0aGlzIGNhbGwgdGFrZXMgdGltZSBTaWdoISAqLwotICAgICAgaWYgKGFkZHJfbW9kZVAtPm1vZGUgPT0gREVGQVVMVCkKLQl7Ci0JICBpZiAoZXhwclAuWF9hZGRfc3ltYm9sIHx8IGV4cHJQLlhfb3Bfc3ltYm9sKQotCSAgICB7Ci0JICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IGRlc2MtPmRlZmF1bHRfbW9kZWw7IC8qIHdlIGhhdmUgYSBsYWJlbCAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gZGVzYy0+ZGVmYXVsdF9tb2RlYzsgLyogd2UgaGF2ZSBhIGNvbnN0YW50ICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGV4cHJQLlhfYWRkX3N5bWJvbCB8fCBleHByUC5YX29wX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID0gZGVzYy0+ZGVmYXVsdF9tb2RlbDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPSBkZXNjLT5kZWZhdWx0X21vZGVjOwotCSAgICB9Ci0JfQotICAgICAgLyogbXVzdCBwdXQgdGhpcyBtZXNzIGRvd24gaW4gYWRkcl9tb2RlIHRvIGhhbmRsZSB0aGUgc2NhbGVkCi0gICAgICAgICBjYXNlIGJldHRlciAqLwotICAgIH0KLSAgLyogSXQgYXBwZWFycyBhcyB0aGUgc2VxdWVudCBjb21waWxlciB3YW50cyBhbiBhYnNvbHV0ZSB3aGVuIHdlIGhhdmUKLSAgICAgYSBsYWJlbCB3aXRob3V0IEAuIENvbnN0YW50cyBiZWNvbWVzIGltbWVkaWF0ZXMgYmVzaWRlcyB0aGUgYWRkcgotICAgICBjYXNlLiAgVGhpbmsgaXQgZG9lcyBzbyB3aXRoIGxvY2FsIGxhYmVscyB0b28sIG5vdCBvcHRpbXVtLCBwY3JlbAotICAgICBpcyBiZXR0ZXIuICBXaGVuIEkgaGF2ZSB0aW1lIEkgd2lsbCBtYWtlIGdhcyBjaGVjayB0aGlzIGFuZAotICAgICBzZWxlY3QgcGNyZWwgd2hlbiBwb3NzaWJsZSBBY3R1YWxseSB0aGF0IGlzIHRyaXZpYWwuICAqLwotICBpZiAodG1wID0gYWRkcl9tb2RlUC0+c2NhbGVkX3JlZykKLSAgICB7CQkJCS8qIGJ1aWxkIGluZGV4Ynl0ZSAqLwotICAgICAgdG1wLS07CQkJLyogcmVtZW1iZXIgcmVnbnVtYmVyIGNvbWVzIGluY3JlbWVudGVkIGZvcgotCQkJCSAgIGZsYWdwdXJwb3NlICovCi0gICAgICB0bXAgfD0gYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPDwgMzsKLSAgICAgIGFkZHJfbW9kZVAtPmluZGV4X2J5dGUgPSAoY2hhcikgdG1wOwotICAgICAgYWRkcl9tb2RlUC0+YW1fc2l6ZSArPSAxOwotICAgIH0KLSAgaWYgKGRpc3BfdGVzdFthZGRyX21vZGVQLT5tb2RlXSkKLSAgICB7CQkJCS8qIHRoZXJlIHdhcyBhIGRpc3BsYWNlbWVudCwgcHJvYmUgZm9yIGxlbmd0aAotCQkJCSAgIHNwZWNpZnlpbmcgc3VmZml4ICovCi0gICAgICB7Ci0JcmVnaXN0ZXIgY2hhciBjOwotCXJlZ2lzdGVyIGNoYXIgc3VmZml4OwotCXJlZ2lzdGVyIGNoYXIgc3VmZml4X3N1YjsKLQlyZWdpc3RlciBpbnQgaTsKLQlyZWdpc3RlciBjaGFyICp0b1A7Ci0JcmVnaXN0ZXIgY2hhciAqZnJvbVA7Ci0KLQlhZGRyX21vZGVQLT5wY3JlbCA9IDA7Ci0JaWYgKGRpc3BfdGVzdFthZGRyX21vZGVQLT5tb2RlXSkKLQkgIHsJCQkvKiB0aGVyZSBpcyBhIGRpc3BsYWNlbWVudCAqLwotCSAgICBpZiAoYWRkcl9tb2RlUC0+bW9kZSA9PSAyNyB8fCBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9PSAyNykKLQkgICAgICB7CQkJLyogZG8gd2UgaGF2ZSBwY3JlbC4gbW9kZSAqLwotCQlhZGRyX21vZGVQLT5wY3JlbCA9IDE7Ci0JICAgICAgfQotCSAgICBhZGRyX21vZGVQLT5pbV9kaXNwID0gMTsKLQkgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLQkgICAgICB7Ci0JCXN1ZmZpeF9zdWIgPSBzdWZmaXggPSAwOwotCQlpZiAodG9QID0gYWRkcl9tb2RlUC0+ZGlzcFtpXSkKLQkJICB7CQkvKiBzdWZmaXggb2YgZXhwcmVzc2lvbiwgdGhlIGxhcmdlc3Qgc2l6ZQotCQkJCSAgIHJ1bGVzICovCi0JCSAgICBmcm9tUCA9IHRvUDsKLQkJICAgIHdoaWxlIChjID0gKmZyb21QKyspCi0JCSAgICAgIHsKLQkJCSp0b1ArKyA9IGM7Ci0JCQlpZiAoYyA9PSAnOicpCi0JCQkgIHsKLQkJCSAgICBzd2l0Y2ggKCpmcm9tUCkKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgJ1wwJzoKLQkJCQlhc193YXJuIChfKCJQcmVtYXR1cmUgZW5kIG9mIHN1ZmZpeCAtLSBEZWZhdWx0aW5nIHRvIGQiKSk7Ci0JCQkJc3VmZml4ID0gNDsKLQkJCQljb250aW51ZTsKLQkJCSAgICAgIGNhc2UgJ2InOgotCQkJCXN1ZmZpeF9zdWIgPSAxOwotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAndyc6Ci0JCQkJc3VmZml4X3N1YiA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlICdkJzoKLQkJCQlzdWZmaXhfc3ViID0gNDsKLQkJCQlicmVhazsKLQkJCSAgICAgIGRlZmF1bHQ6Ci0JCQkJYXNfd2FybiAoXygiQmFkIHN1ZmZpeCBhZnRlciAnOicgdXNlIHtifHd8ZH0gRGVmYXVsdGluZyB0byBkIikpOwotCQkJCXN1ZmZpeCA9IDQ7Ci0JCQkgICAgICB9Ci0JCQkgICAgZnJvbVArKzsKLQkJCSAgICB0b1AtLTsJLyogU28gd2Ugd3JpdGUgb3ZlciB0aGUgJzonICovCi0JCQkgICAgaWYgKHN1ZmZpeCA8IHN1ZmZpeF9zdWIpCi0JCQkgICAgICBzdWZmaXggPSBzdWZmaXhfc3ViOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgICp0b1AgPSAnXDAnOy8qIHRlcm1pbmF0ZSBwcm9wZXJseSAqLwotCQkgICAgYWRkcl9tb2RlUC0+ZGlzcF9zdWZmaXhbaV0gPSBzdWZmaXg7Ci0JCSAgICBhZGRyX21vZGVQLT5hbV9zaXplICs9IHN1ZmZpeCA/IHN1ZmZpeCA6IDQ7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYWRkcl9tb2RlUC0+bW9kZSA9PSAyMCkKLQl7CQkJLyogbG9vayBpbiBuczMya19vcGNvZGUgZm9yIHNpemUgKi8KLQkgIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4WzBdID0gYWRkcl9tb2RlUC0+YW1fc2l6ZSA9IGRlc2MtPmltX3NpemU7Ci0JICBhZGRyX21vZGVQLT5pbV9kaXNwID0gMDsKLQl9Ci0gICAgfQotICByZXR1cm4gYWRkcl9tb2RlUC0+bW9kZTsKLX0KLQotCi0vKiByZWFkIGFuIG9wdGlvbmxpc3QgKi8KLXZvaWQKLW9wdGxpc3QgKHN0ciwgb3B0aW9uUCwgZGVmYXVsdF9tYXApCi0gICAgIGNoYXIgKnN0cjsJCQkvKiB0aGUgc3RyaW5nIHRvIGV4dHJhY3Qgb3B0aW9ucyBmcm9tICovCi0gICAgIHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7CS8qIGhvdyB0byBzZWFyY2ggdGhlIHN0cmluZyAqLwotICAgICB1bnNpZ25lZCBsb25nICpkZWZhdWx0X21hcDsJLyogZGVmYXVsdCBwYXR0ZXJuIGFuZCBvdXRwdXQgKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGksIGosIGssIHN0cmxlbjEsIHN0cmxlbjI7Ci0gIHJlZ2lzdGVyIGNoYXIgKnBhdHRlcm5QLCAqc3RyUDsKLSAgc3RybGVuMSA9IHN0cmxlbiAoc3RyKTsKLSAgaWYgKHN0cmxlbjEgPCAxKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJWZXJ5IHNob3J0IGluc3RyIHRvIG9wdGlvbiwgaWUgeW91IGNhbid0IGRvIGl0IG9uIGEgTlVMTHN0ciIpKTsKLSAgICB9Ci0gIGZvciAoaSA9IDA7IG9wdGlvblBbaV0ucGF0dGVybiAhPSAwOyBpKyspCi0gICAgewotICAgICAgc3RybGVuMiA9IHN0cmxlbiAob3B0aW9uUFtpXS5wYXR0ZXJuKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJsZW4xOyBqKyspCi0JewotCSAgcGF0dGVyblAgPSBvcHRpb25QW2ldLnBhdHRlcm47Ci0JICBzdHJQID0gJnN0cltqXTsKLQkgIGZvciAoayA9IDA7IGsgPCBzdHJsZW4yOyBrKyspCi0JICAgIHsKLQkgICAgICBpZiAoKihzdHJQKyspICE9ICoocGF0dGVyblArKykpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoayA9PSBzdHJsZW4yKQotCSAgICB7CQkJLyogbWF0Y2ggKi8KLQkgICAgICAqZGVmYXVsdF9tYXAgfD0gb3B0aW9uUFtpXS5vcjsKLQkgICAgICAqZGVmYXVsdF9tYXAgJj0gb3B0aW9uUFtpXS5hbmQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBzZWFyY2ggc3RydWN0IGZvciBzeW1ib2xzCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBzaG9ydCBpbnRlZ2VyIGZvcm0gb2YgcmVnIG5hbWVzIGluCi0gICB0aGUgaW5zdHJ1Y3Rpb25zIGxtciwgc21yLCBscHIsIHNwciByZXR1cm4gdHJ1ZSBpZiBzdHIgaXMgZm91bmQgaW4KLSAgIGxpc3QgKi8KLQotaW50Ci1saXN0X3NlYXJjaCAoc3RyLCBvcHRpb25QLCBkZWZhdWx0X21hcCkKLSAgICAgY2hhciAqc3RyOwkJCQkvKiB0aGUgc3RyaW5nIHRvIG1hdGNoICovCi0gICAgIHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7CS8qIGxpc3QgdG8gc2VhcmNoICovCi0gICAgIHVuc2lnbmVkIGxvbmcgKmRlZmF1bHRfbWFwOwkvKiBkZWZhdWx0IHBhdHRlcm4gYW5kIG91dHB1dCAqLwotewotICByZWdpc3RlciBpbnQgaTsKLSAgZm9yIChpID0gMDsgb3B0aW9uUFtpXS5wYXR0ZXJuICE9IDA7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXN0cm5jbXAgKG9wdGlvblBbaV0ucGF0dGVybiwgc3RyLCAyMCkpCi0JewkJCQkvKiB1c2Ugc3RybmNtcCB0byBiZSBzYWZlICovCi0JICAqZGVmYXVsdF9tYXAgfD0gb3B0aW9uUFtpXS5vcjsKLQkgICpkZWZhdWx0X21hcCAmPSBvcHRpb25QW2ldLmFuZDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBhc193YXJuIChfKCJObyBzdWNoIGVudHJ5IGluIGxpc3QuIChjcHUvbW11IHJlZ2lzdGVyKSIpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ldmFsdWF0ZV9leHByIChyZXN1bHRQLCBwdHIpCi0gICAgIGV4cHJlc3Npb25TICpyZXN1bHRQOwotICAgICBjaGFyICpwdHI7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnRtcF9saW5lOwotCi0gIHRtcF9saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwdHI7Ci0gIGV4cHJlc3Npb24gKCZleHByUCk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHRtcF9saW5lOwotfQotDAotLyogQ29udmVydCBvcGVyYW5kcyB0byBpaWYtZm9ybWF0IGFuZCBhZGRzIGJpdGZpZWxkcyB0byB0aGUgb3Bjb2RlLgotICAgT3BlcmFuZHMgYXJlIHBhcnNlZCBpbiBzdWNoIGFuIG9yZGVyIHRoYXQgdGhlIG9wY29kZSBpcyB1cGRhdGVkIGZyb20KLSAgIGl0cyBtb3N0IHNpZ25pZmljYW50IGJpdCwgdGhhdCBpcyB3aGVuIHRoZSBvcGVyYW5kIG5lZWQgdG8gYWx0ZXIgdGhlCi0gICBvcGNvZGUuCi0gICBCZSBjYXJlZnVsbCBub3QgdG8gcHV0IHRvIG9iamVjdHMgaW4gdGhlIHNhbWUgaWlmLXNsb3QuCi0gICAqLwotCi12b2lkCi1lbmNvZGVfb3BlcmFuZCAoYXJnYywgYXJndiwgb3BlcmFuZHNQLCBzdWZmaXhQLCBpbV9zaXplLCBvcGNvZGVfYml0X3B0cikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotICAgICBjaGFyICpvcGVyYW5kc1A7Ci0gICAgIGNoYXIgKnN1ZmZpeFA7Ci0gICAgIGNoYXIgaW1fc2l6ZTsKLSAgICAgY2hhciBvcGNvZGVfYml0X3B0cjsKLXsKLSAgcmVnaXN0ZXIgaW50IGksIGo7Ci0gIGNoYXIgZDsKLSAgaW50IHBjcmVsLCB0bXAsIGIsIGxvb3AsIHBjcmVsX2FkanVzdDsKLSAgZm9yIChsb29wID0gMDsgbG9vcCA8IGFyZ2M7IGxvb3ArKykKLSAgICB7Ci0gICAgICBpID0gb3BlcmFuZHNQW2xvb3AgPDwgMV0gLSAnMSc7CS8qIHdoYXQgb3BlcmFuZCBhcmUgd2Ugc3VwcG9zZWQKLQkJCQkJICAgdG8gd29yayBvbiAqLwotICAgICAgaWYgKGkgPiAzKQotCWFzX2ZhdGFsIChfKCJJbnRlcm5hbCBjb25zaXN0ZW5jeSBlcnJvci4gIGNoZWNrIG5zMzJrLW9wY29kZS5oIikpOwotICAgICAgcGNyZWwgPSAwOwotICAgICAgcGNyZWxfYWRqdXN0ID0gMDsKLSAgICAgIHRtcCA9IDA7Ci0gICAgICBzd2l0Y2ggKChkID0gb3BlcmFuZHNQWyhsb29wIDw8IDEpICsgMV0pKQotCXsKLQljYXNlICdmJzoJCS8qIG9wZXJhbmQgb2Ygc2ZzciB0dXJucyBvdXQgdG8gYmUgYSBuYXN0eQotCQkJCSAgIHNwZWNpYWxjYXNlICovCi0JICBvcGNvZGVfYml0X3B0ciAtPSA1OwotCWNhc2UgJ1onOgkJLyogZmxvYXQgbm90IGltbWVkaWF0ZSAqLwotCWNhc2UgJ0YnOgkJLyogMzIgYml0IGZsb2F0CWdlbmVyYWwgZm9ybSAqLwotCWNhc2UgJ0wnOgkJLyogNjQgYml0IGZsb2F0CSovCi0JY2FzZSAnSSc6CQkvKiBpbnRlZ2VyIG5vdCBpbW1lZGlhdGUgKi8KLQljYXNlICdCJzoJCS8qIGJ5dGUJICovCi0JY2FzZSAnVyc6CQkvKiB3b3JkCSAqLwotCWNhc2UgJ0QnOgkJLyogZG91YmxlLXdvcmQJKi8KLQljYXNlICdBJzoJCS8qIGRvdWJsZS13b3JkCWdlbi1hZGRyZXNzLWZvcm0gaWUgbm8gcmVncwotCQkJCSAgIGFsbG93ZWQgKi8KLQkgIGdldF9hZGRyX21vZGUgKGFyZ3ZbaV0sICZhZGRyX21vZGVQKTsKLQkgIGlmKChhZGRyX21vZGVQLm1vZGUgPT0gMjApICYmCi0JICAgICAoZCA9PSAnSScgfHwgZCA9PSAnWicgfHwgZCA9PSAnQScpKSB7Ci0JICAgIGFzX2ZhdGFsKGQgPT0gJ0EnPyBfKCJBZGRyZXNzIG9mIGltbWVkaWF0ZSBvcGVyYW5kIik6Ci0JCSAgICAgXygiSW52YWxpZCBpbW1lZGlhdGUgd3JpdGUgb3BlcmFuZC4iKSk7Ci0JICB9Ci0KLQkgIGlmIChvcGNvZGVfYml0X3B0ciA9PSBkZXNjLT5vcGNvZGVfc2l6ZSkKLQkgICAgYiA9IDQ7Ci0JICBlbHNlCi0JICAgIGIgPSA2OwotCSAgZm9yIChqID0gYjsgaiA8IChiICsgMik7IGorKykKLQkgICAgewotCSAgICAgIGlmIChhZGRyX21vZGVQLmRpc3BbaiAtIGJdKQotCQl7Ci0JCSAgSUlGIChqLAotCQkgICAgICAgMiwKLQkJICAgICAgIGFkZHJfbW9kZVAuZGlzcF9zdWZmaXhbaiAtIGJdLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHJfbW9kZVAuZGlzcFtqIC0gYl0sCi0JCSAgICAgICAwLAotCQkgICAgICAgYWRkcl9tb2RlUC5wY3JlbCwKLQkJICAgICAgIGlpZi5pbnN0cl9zaXplLAotCQkgICAgICAgYWRkcl9tb2RlUC5pbV9kaXNwLAotCQkgICAgICAgSU5EIChCUkFOQ0gsIEJZVEUpLAotCQkgICAgICAgTlVMTCwKLQkJICAgICAgIChhZGRyX21vZGVQLnNjYWxlZF9yZWcgPyBhZGRyX21vZGVQLnNjYWxlZF9tb2RlCi0JCQk6IGFkZHJfbW9kZVAubW9kZSksCi0JCSAgICAgICAwKTsKLQkJfQotCSAgICB9Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA1OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9ICgobG9uZykgYWRkcl9tb2RlUC5tb2RlKSA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGlmIChhZGRyX21vZGVQLnNjYWxlZF9yZWcpCi0JICAgIHsKLQkgICAgICBqID0gYiAvIDI7Ci0JICAgICAgSUlGIChqLCAxLCAxLCAodW5zaWduZWQgbG9uZykgYWRkcl9tb2RlUC5pbmRleF9ieXRlLAotCQkgICAwLCAwLCAwLCAwLCAwLCBOVUxMLCAtMSwgMCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2InOgkJLyogbXVsdGlwbGUgaW5zdHJ1Y3Rpb24gZGlzcCAqLwotCSAgZnJlZXB0cisrOwkJLyogT1ZFOnRoaXMgaXMgYW4gdXNlZnVsIGhhY2sgKi8KLQkgIHNwcmludGYgKGZyZWVwdHIsICIoKCVzLTEpKiVkKVwwMDAiLCBhcmd2W2ldLCBkZXNjLT5pbV9zaXplKTsKLQkgIGFyZ3ZbaV0gPSBmcmVlcHRyOwotCSAgcGNyZWwgLT0gMTsJCS8qIG1ha2UgcGNyZWwgMCBpbnNwaXRlIG9mIHdoYXQgY2FzZSAncCc6Ci0JCQkJICAgd2FudHMgKi8KLQkgIC8qIGZhbGwgdGhydSAqLwotCWNhc2UgJ3AnOgkJLyogZGlzcGxhY2VtZW50IC0gcGMgcmVsYXRpdmUgYWRkcmVzc2luZyAqLwotCSAgcGNyZWwgKz0gMTsKLQkgIC8qIGZhbGwgdGhydSAqLwotCWNhc2UgJ2QnOgkJLyogZGlzcGxhY2VtZW50ICovCi0JICBpaWYuaW5zdHJfc2l6ZSArPSBzdWZmaXhQW2ldID8gc3VmZml4UFtpXSA6IDQ7Ci0JICBJSUYgKDEyLCAyLCBzdWZmaXhQW2ldLCAodW5zaWduZWQgbG9uZykgYXJndltpXSwgMCwKLQkgICAgICAgcGNyZWwsIHBjcmVsX2FkanVzdCwgMSwgSU5EIChCUkFOQ0gsIEJZVEUpLCBOVUxMLCAtMSwgMCk7Ci0JICBicmVhazsKLQljYXNlICdIJzoJCS8qIHNlcXVlbnQtaGFjazogdGhlIGxpbmtlciB3YW50cyBhIGJpdCBzZXQKLQkJCQkgICB3aGVuIGJzciAqLwotCSAgcGNyZWwgPSAxOwotCSAgaWlmLmluc3RyX3NpemUgKz0gc3VmZml4UFtpXSA/IHN1ZmZpeFBbaV0gOiA0OwotCSAgSUlGICgxMiwgMiwgc3VmZml4UFtpXSwgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sIDAsCi0JICAgICAgIHBjcmVsLCBwY3JlbF9hZGp1c3QsIDEsIElORCAoQlJBTkNILCBCWVRFKSwgTlVMTCwgLTEsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6CQkvKiBxdWljayAqLwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKLQkgIElJRiAoMTEsIDIsIDQyLCAodW5zaWduZWQgbG9uZykgYXJndltpXSwgMCwgMCwgMCwgMCwgMCwKLQkgICAgICAgYml0X2ZpeF9uZXcgKDQsIG9wY29kZV9iaXRfcHRyLCAtOCwgNywgMCwgMSwgMCksIC0xLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgkJLyogcmVnaXN0ZXIgbnVtYmVyICgzIGJpdHMpICovCi0JICBsaXN0X3NlYXJjaCAoYXJndltpXSwgb3B0NiwgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSAzOwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgkJLyogc2V0Y2ZnIGluc3RydWN0aW9uIG9wdGlvbnNsaXN0ICovCi0JICBvcHRsaXN0IChhcmd2W2ldLCBvcHQzLCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IDE1OwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6CQkvKiBjaW52IGluc3RydWN0aW9uIG9wdGlvbnNsaXN0ICovCi0JICBvcHRsaXN0IChhcmd2W2ldLCBvcHQ0LCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IDE1OyAvKiBpbnNlcnQgdGhlIHJlZ3R5cGUgaW4gb3Bjb2RlICovCi0JICBicmVhazsKLQljYXNlICdTJzoJCS8qIHN0cmluZ2luc3RydWN0aW9uIG9wdGlvbnNsaXN0ICovCi0JICBvcHRsaXN0IChhcmd2W2ldLCBvcHQ1LCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IDE1OwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JY2FzZSAnVSc6CQkvKiByZWdpc3Rlcmxpc3QgKi8KLQkgIElJRiAoMTAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIE5VTEwsIC0xLCAwKTsKLQkgIHN3aXRjaCAob3BlcmFuZHNQWyhpIDw8IDEpICsgMV0pCi0JICAgIHsKLQkgICAgY2FzZSAndSc6CQkvKiByZXN0b3JlLCBleGl0ICovCi0JICAgICAgb3B0bGlzdCAoYXJndltpXSwgb3B0MSwgJmlpZi5paWZQWzEwXS5vYmplY3QpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdVJzoJCS8qIHNhdmUsZW50ZXIgKi8KLQkgICAgICBvcHRsaXN0IChhcmd2W2ldLCBvcHQyLCAmaWlmLmlpZlBbMTBdLm9iamVjdCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlpZi5pbnN0cl9zaXplICs9IDE7Ci0JICBicmVhazsKLQljYXNlICdNJzoJCS8qIG1tdSByZWdpc3RlciAqLwotCSAgbGlzdF9zZWFyY2ggKGFyZ3ZbaV0sIG1tdXJlZywgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgkJLyogY3B1IHJlZ2lzdGVyICAqLwotCSAgbGlzdF9zZWFyY2ggKGFyZ3ZbaV0sIGNwdXJlZywgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgkJLyogaW5zcyBleHRzICovCi0JICBpaWYuaW5zdHJfc2l6ZSArPSAxOwkvKiAxIGJ5dGUgaXMgYWxsb2NhdGVkIGFmdGVyIHRoZSBvcGNvZGUgKi8KLQkgIElJRiAoMTAsIDIsIDEsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBhcmd2W2ldLAkvKiBpIGFsd2F5cyAyIGhlcmUgKi8KLQkgICAgICAgMCwgMCwgMCwgMCwgMCwKLQkgICAgICAgYml0X2ZpeF9uZXcgKDMsIDUsIDAsIDcsIDAsIDAsIDApLCAvKiBhIGJpdF9maXggaXMgdGFyZ2V0ZWQgdG8KLQkJCQkJCSAgICAgdGhlIGJ5dGUgKi8KLQkgICAgICAgLTEsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICBJSUYgKDExLCAyLCA0MiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sCS8qIGkgYWx3YXlzIDMgaGVyZSAqLwotCSAgICAgICAwLCAwLCAwLCAwLCAwLAotCSAgICAgICBiaXRfZml4X25ldyAoNSwgMCwgMSwgMzIsIC0xLCAwLCAtMSksIC0xLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgaWlmLmluc3RyX3NpemUgKz0gMTsKLQkgIGIgPSAyICsgaTsJCS8qIHB1dCB0aGUgZXh0ZW5zaW9uIGJ5dGUgYWZ0ZXIgb3Bjb2RlICovCi0JICBJSUYgKGIsIDIsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19mYXRhbCAoXygiQmFkIG9wY29kZS10YWJsZS1vcHRpb24sIGNoZWNrIGluIGZpbGUgbnMzMmstb3Bjb2RlLmgiKSk7Ci0JfQotICAgIH0KLX0KLQwKLS8qIGluOiAgaW5zdHJ1Y3Rpb24gbGluZQotICAgb3V0OiBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgaW5zdHJ1Y3Rpb24KLSAgIHRoYXQgaGFzIGJlZW4gcHJlcGFyZWQgZm9yIGRpcmVjdCBjb252ZXJzaW9uIHRvIGZyYWdtZW50KHMpIGFuZAotICAgZml4ZXMgaW4gYSBzeXN0ZW1hdGljYWwgZmFzaGlvbgotICAgUmV0dXJuLXZhbHVlID0gcmVjdXJzaXZlX2xldmVsCi0gICAqLwotLyogYnVpbGQgaWlmIG9mIG9uZSBhc3NlbWJseSB0ZXh0IGxpbmUgKi8KLWludAotcGFyc2UgKGxpbmUsIHJlY3Vyc2l2ZV9sZXZlbCkKLSAgICAgY2hhciAqbGluZTsKLSAgICAgaW50IHJlY3Vyc2l2ZV9sZXZlbDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbGluZXB0ciwgYywgc3VmZml4X3NlcGFyYXRvcjsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGludCBhcmdjLCBhcmdfdHlwZTsKLSAgY2hhciBzcXIsIHNlcDsKLSAgY2hhciBzdWZmaXhbTUFYX0FSR1NdLCAqYXJndltNQVhfQVJHU107CS8qIG5vIG1vcmUgdGhhbiA0IG9wZXJhbmRzICovCi0gIGlmIChyZWN1cnNpdmVfbGV2ZWwgPD0gMCkKLSAgICB7CQkJCS8qIGNhbGxlZCBmcm9tIG1kX2Fzc2VtYmxlICovCi0gICAgICBmb3IgKGxpbmVwdHIgPSBsaW5lOyAoKmxpbmVwdHIpICE9ICdcMCcgJiYgKCpsaW5lcHRyKSAhPSAnICc7IGxpbmVwdHIrKyk7Ci0gICAgICBjID0gKmxpbmVwdHI7Ci0gICAgICAqbGluZXB0ciA9ICdcMCc7Ci0gICAgICBpZiAoIShkZXNjID0gKHN0cnVjdCBuczMya19vcGNvZGUgKikgaGFzaF9maW5kIChpbnN0X2hhc2hfaGFuZGxlLCBsaW5lKSkpCi0JewotCSAgYXNfZmF0YWwgKF8oIk5vIHN1Y2ggb3Bjb2RlIikpOwotCX0KLSAgICAgICpsaW5lcHRyID0gYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsaW5lcHRyID0gbGluZTsKLSAgICB9Ci0gIGFyZ2MgPSAwOwotICBpZiAoKmRlc2MtPm9wZXJhbmRzKQotICAgIHsKLSAgICAgIGlmICgqbGluZXB0cisrICE9ICdcMCcpCi0JewotCSAgc3FyID0gJ1snOwotCSAgc2VwID0gJywnOwotCSAgd2hpbGUgKCpsaW5lcHRyICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAoZGVzYy0+b3BlcmFuZHNbYXJnYyA8PCAxXSkKLQkJewotCQkgIHN1ZmZpeFthcmdjXSA9IDA7Ci0JCSAgYXJnX3R5cGUgPSBkZXNjLT5vcGVyYW5kc1soYXJnYyA8PCAxKSArIDFdOwotCQkgIHN3aXRjaCAoYXJnX3R5cGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgY2FzZSAncCc6Ci0JCSAgICBjYXNlICdIJzoJLyogdGhlIG9wZXJhbmQgaXMgc3VwcG9zZWQgdG8gYmUgYQotCQkJCSAgIGRpc3BsYWNlbWVudCAqLwotCQkgICAgICAvKiBIYWNrd2FybmluZzogZG8gbm90IGZvcmdldCB0byB1cGRhdGUgdGhlIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlcyBhYm92ZSB3aGVuIGVkaXRpbmcgbnMzMmstb3Bjb2RlLmggKi8KLQkJICAgICAgc3VmZml4X3NlcGFyYXRvciA9ICc6JzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBzdWZmaXhfc2VwYXJhdG9yID0gJ1wyNTUnOyAvKiBpZiB0aGlzIGNoYXIgb2NjdXJzIHdlCi0JCQkJCQkgICAgbG9vc2UgKi8KLQkJICAgIH0KLQkJICBzdWZmaXhbYXJnY10gPSAwOyAvKiAwIHdoZW4gbm8gJzonIGlzIGVuY291bnRlcmVkICovCi0JCSAgYXJndlthcmdjXSA9IGZyZWVwdHI7Ci0JCSAgKmZyZWVwdHIgPSAnXDAnOwotCQkgIHdoaWxlICgoYyA9ICpsaW5lcHRyKSAhPSAnXDAnICYmIGMgIT0gc2VwKQotCQkgICAgewotCQkgICAgICBpZiAoYyA9PSBzcXIpCi0JCQl7Ci0JCQkgIGlmIChzcXIgPT0gJ1snKQotCQkJICAgIHsKLQkJCSAgICAgIHNxciA9ICddJzsKLQkJCSAgICAgIHNlcCA9ICdcMCc7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgc3FyID0gJ1snOwotCQkJICAgICAgc2VwID0gJywnOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgaWYgKGMgPT0gc3VmZml4X3NlcGFyYXRvcikKLQkJCXsJLyogJzonIC0gbGFiZWwvc3VmZml4IHNlcGFyYXRvciAqLwotCQkJICBzd2l0Y2ggKGxpbmVwdHJbMV0pCi0JCQkgICAgewotCQkJICAgIGNhc2UgJ2InOgotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgJ3cnOgotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gMjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgJ2QnOgotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gNDsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkgICAgICBhc193YXJuIChfKCJCYWQgc3VmZml4LCBkZWZhdWx0aW5nIHRvIGQiKSk7Ci0JCQkgICAgICBzdWZmaXhbYXJnY10gPSA0OwotCQkJICAgICAgaWYgKGxpbmVwdHJbMV0gPT0gJ1wwJyB8fCBsaW5lcHRyWzFdID09IHNlcCkKLQkJCQl7Ci0JCQkJICBsaW5lcHRyICs9IDE7Ci0JCQkJICBjb250aW51ZTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICBsaW5lcHRyICs9IDI7Ci0JCQkgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgICAqZnJlZXB0cisrID0gYzsKLQkJICAgICAgbGluZXB0cisrOwotCQkgICAgfQotCQkgICpmcmVlcHRyKysgPSAnXDAnOwotCQkgIGFyZ2MgKz0gMTsKLQkJICBpZiAoKmxpbmVwdHIgPT0gJ1wwJykKLQkJICAgIGNvbnRpbnVlOwotCQkgIGxpbmVwdHIgKz0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2ZhdGFsIChfKCJUb28gbWFueSBvcGVyYW5kcyBwYXNzZWQgdG8gaW5zdHJ1Y3Rpb24iKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChhcmdjICE9IHN0cmxlbiAoZGVzYy0+b3BlcmFuZHMpIC8gMikKLSAgICB7Ci0gICAgICBpZiAoc3RybGVuIChkZXNjLT5kZWZhdWx0X2FyZ3MpKQotCXsJCQkvKiB3ZSBjYW4gYXBwbHkgZGVmYXVsdCwgZG9udCBnb29mICovCi0JICBpZiAocGFyc2UgKGRlc2MtPmRlZmF1bHRfYXJncywgMSkgIT0gMSkKLQkgICAgewkJCS8qIGNoZWNrIGVycm9yIGluIGRlZmF1bHQgKi8KLQkgICAgICBhc19mYXRhbCAoXygiV3JvbmcgbnVtYmVycyBvZiBvcGVyYW5kcyBpbiBkZWZhdWx0LCBjaGVjayBuczMyay1vcGNvZGVzLmgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfZmF0YWwgKF8oIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyIpKTsKLQl9Ci0KLSAgICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBJSUZfRU5UUklFUzsgaSsrKQotICAgIHsKLSAgICAgIGlpZi5paWZQW2ldLnR5cGUgPSAwOwkvKiBtYXJrIGFsbCBlbnRyaWVzIGFzIHZvaWQqLwotICAgIH0KLQotICAvKiBidWlsZCBvcGNvZGUgaWlmLWVudHJ5ICovCi0gIGlpZi5pbnN0cl9zaXplID0gZGVzYy0+b3Bjb2RlX3NpemUgLyA4OwotICBJSUYgKDEsIDEsIGlpZi5pbnN0cl9zaXplLCBkZXNjLT5vcGNvZGVfc2VlZCwgMCwgMCwgMCwgMCwgMCwgMCwgLTEsIDApOwotCi0gIC8qIHRoaXMgY2FsbCBlbmNvZGVzIG9wZXJhbmRzIHRvIGlpZiBmb3JtYXQgKi8KLSAgaWYgKGFyZ2MpCi0gICAgewotICAgICAgZW5jb2RlX29wZXJhbmQgKGFyZ2MsCi0JCSAgICAgIGFyZ3YsCi0JCSAgICAgICZkZXNjLT5vcGVyYW5kc1swXSwKLQkJICAgICAgJnN1ZmZpeFswXSwKLQkJICAgICAgZGVzYy0+aW1fc2l6ZSwKLQkJICAgICAgZGVzYy0+b3Bjb2RlX3NpemUpOwotICAgIH0KLSAgcmV0dXJuIHJlY3Vyc2l2ZV9sZXZlbDsKLX0KLQwKLQotLyogQ29udmVydCBpaWYgdG8gZnJhZ21lbnRzLiAgRnJvbSB0aGlzIHBvaW50IHdlIHN0YXJ0IHRvIGRyaWJibGUgd2l0aAotICogZnVuY3Rpb25zIGluIG90aGVyIGZpbGVzIHRoYW4gdGhpcyBvbmUuKEV4Y2VwdCBoYXNoLmMpIFNvLCBpZiBpdCdzCi0gKiBwb3NzaWJsZSB0byBtYWtlIGFuIGlpZiBmb3IgYW4gb3RoZXIgQ1BVLCB5b3UgZG9uJ3QgbmVlZCB0byBrbm93Ci0gKiB3aGF0IGZyYWdzLCByZWxheCwgb2JzdGFja3MsIGV0YyBpcyBpbiBvcmRlciB0byBwb3J0IHRoaXMKLSAqIGFzc2VtYmxlci4gWW91IG9ubHkgbmVlZCB0byBrbm93IGlmIGl0J3MgcG9zc2libGUgdG8gcmVkdWNlIHlvdXIKLSAqIGNwdS1pbnN0cnVjdGlvbiB0byBpaWYtZm9ybWF0ICh0YWtlcyBzb21lIHdvcmspIGFuZCBhZG9wdCB0aGUgb3RoZXIKLSAqIG1kXz8gcGFydHMgYWNjb3JkaW5nIHRvIGdpdmVuIGluc3RydWN0aW9ucyBOb3RlIHRoYXQgaWlmIHdhcwotICogaW52ZW50ZWQgZm9yIHRoZSBjbGVhbiBuczMya2BzIGFyY2hpdGVjdXJlLgotICovCi0KLS8qIEdBUyBmb3IgdGhlIG5zMzJrIGhhcyBhIHByb2JsZW0uIFBDIHJlbGF0aXZlIGRpc3BsYWNlbWVudHMgYXJlCi0gKiByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb3Bjb2RlLCBub3QgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gKiBvcGVyYW5kLiBXZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBvcGVyYW5kCi0gKiBhbmQgdGhlIG9wY29kZSBpbiBwY3JlbF9hZGp1c3QgZm9yIGVhY2ggZnJhZyBhbmQgZWFjaCBmaXguIEhvd2V2ZXIsCi0gKiB3ZSBnZXQgaW50byB0cm91YmxlIHdoZXJlIHRoZXJlIGFyZSB0d28gb3IgbW9yZSBwYy1yZWxhdGl2ZQotICogb3BlcmFuZHMgYW5kIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBvbmUgY2FuJ3QgYmUgZGV0ZXJtaW5lZC4gVGhlbiBpbgotICogdGhlIHJlbGF4IHBoYXNlLCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3Qgb3BlcmFuZCB3aWxsIGNoYW5nZSBhbmQKLSAqIHBjcmVsX2FkanVzdCB3aWxsIG5vIGxvbmdlciBiZSBjb3JyZWN0LiAgVGhlIGN1cnJlbnQgc29sdXRpb24gaXMKLSAqIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBmcmFnIHdpdGggdGhlIG9wY29kZSBpbiBpdCBhbmQgdGhlIG9mZnNldCBpbgotICogdGhhdCBmcmFnIGZvciBlYWNoIGZyYWcgYW5kIGVhY2ggZml4LiBUaGVuLCB3aGVuIG5lZWRlZCwgd2UgY2FuCi0gKiBhbHdheXMgZmlndXJlIG91dCBob3cgZmFyIGl0IGlzIGJldHdlZW4gdGhlIG9wY29kZSBhbmQgdGhlIHBjcmVsCi0gKiBvYmplY3QuICBTZWUgYWxzbyBtZF9wY3JlbF9hZGp1c3QgYW5kIG1kX2ZpeF9wY3JlbF9hZGp1c3QuICBGb3IKLSAqIG9iamVjdHMgbm90IHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBwb2ludGVyIHRvIHRoZSBvcGNvZGUgZnJhZwotICogaXMgYWx3YXlzIHplcm8uICAqLwotCi12b2lkCi1jb252ZXJ0X2lpZiAoKQotewotICBpbnQgaTsKLSAgYml0X2ZpeFMgKmo7Ci0gIGZyYWdTICppbnN0X2ZyYWc7Ci0gIHVuc2lnbmVkIGludCBpbnN0X29mZnNldDsKLSAgY2hhciAqaW5zdF9vcGNvZGU7Ci0gIGNoYXIgKm1lbVA7Ci0gIGludCBsOwotICBpbnQgazsKLSAgY2hhciB0eXBlOwotICBjaGFyIHNpemUgPSAwOwotICBpbnQgc2l6ZV9zb19mYXI7Ci0KLSAgbWVtUCA9IGZyYWdfbW9yZSAoMCk7Ci0gIGluc3Rfb3Bjb2RlID0gbWVtUDsKLSAgaW5zdF9vZmZzZXQgPSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKTsKLSAgaW5zdF9mcmFnID0gZnJhZ19ub3c7Ci0KLSAgZm9yIChpID0gMDsgaSA8IElJRl9FTlRSSUVTOyBpKyspCi0gICAgewotICAgICAgaWYgKHR5cGUgPSBpaWYuaWlmUFtpXS50eXBlKQotCXsJCQkvKiB0aGUgb2JqZWN0IGV4aXN0LCBzbyBoYW5kbGUgaXQgKi8KLQkgIHN3aXRjaCAoc2l6ZSA9IGlpZi5paWZQW2ldLnNpemUpCi0JICAgIHsKLQkgICAgY2FzZSA0MjoKLQkgICAgICBzaXplID0gMDsJCS8qIGl0J3MgYSBiaXRmaXggdGhhdCBvcGVyYXRlcyBvbiBhbiBleGlzdGluZwotCQkJCSAgIG9iamVjdCovCi0JICAgICAgaWYgKGlpZi5paWZQW2ldLmJpdF9maXhQLT5meF9iaXRfYmFzZSkKLQkJewkJLyogZXhwYW5kIGZ4X2JpdF9iYXNlIHRvIHBvaW50IGF0IG9wY29kZSAqLwotCQkgIGlpZi5paWZQW2ldLmJpdF9maXhQLT5meF9iaXRfYmFzZSA9IChsb25nKSBpbnN0X29wY29kZTsKLQkJfQotCSAgICBjYXNlIDg6CQkvKiBiaWdudW0gb3IgZG91YmxlZmxvYXQgKi8KLQkgICAgY2FzZSAxOgotCSAgICBjYXNlIDI6Ci0JICAgIGNhc2UgMzoKLQkgICAgY2FzZSA0OgkJLyogdGhlIGZpbmFsIHNpemUgaW4gb2JqZWN0bWVtb3J5IGlzIGtub3duICovCi0JICAgICAgbWVtUCA9IGZyYWdfbW9yZShzaXplKTsKLQkgICAgICBqID0gaWlmLmlpZlBbaV0uYml0X2ZpeFA7Ci0JICAgICAgc3dpdGNoICh0eXBlKQotCQl7Ci0JCWNhc2UgMToJLyogdGhlIG9iamVjdCBpcyBwdXJlIGJpbmFyeSAqLwotCQkgIGlmIChqIHx8IGlpZi5paWZQW2ldLnBjcmVsKQotCQkgICAgewotCQkgICAgICBmaXhfbmV3X25zMzJrIChmcmFnX25vdywKLQkJCQkgICAgIChsb25nKSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwKLQkJCQkgICAgIHNpemUsCi0JCQkJICAgICAwLAotCQkJCSAgICAgaWlmLmlpZlBbaV0ub2JqZWN0LAotCQkJCSAgICAgaWlmLmlpZlBbaV0ucGNyZWwsCi0JCQkJICAgICBpaWYuaWlmUFtpXS5pbV9kaXNwLAotCQkJCSAgICAgaiwKLQkJCQkgICAgIGlpZi5paWZQW2ldLmJzciwJLyogc2VxdWVudCBoYWNrICovCi0JCQkJICAgICBpbnN0X2ZyYWcsIGluc3Rfb2Zmc2V0KTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7CQkvKiBnb29kLCBqdXN0IHB1dCB0aGVtIGJ5dGVzIG91dCAqLwotCQkgICAgICBzd2l0Y2ggKGlpZi5paWZQW2ldLmltX2Rpc3ApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIG1kX251bWJlcl90b19jaGFycyAobWVtUCwgaWlmLmlpZlBbaV0ub2JqZWN0LCBzaXplKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkgIG1kX251bWJlcl90b19kaXNwIChtZW1QLCBpaWYuaWlmUFtpXS5vYmplY3QsIHNpemUpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGFzX2ZhdGFsIChfKCJpaWYgY29udmVydCBpbnRlcm5hbCBwY3JlbC9iaW5hcnkiKSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjoKLQkJICAvKiB0aGUgb2JqZWN0IGlzIGEgcG9pbnRlciBhdCBhbiBleHByZXNzaW9uLCBzbwotICAgICAgICAgICAgICAgICAgICAgdW5wYWNrIGl0LCBub3RlIHRoYXQgYmlnbnVtcyBtYXkgcmVzdWx0IGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uICovCi0JCSAgZXZhbHVhdGVfZXhwciAoJmV4cHJQLCAoY2hhciAqKSBpaWYuaWlmUFtpXS5vYmplY3QpOwotCQkgIGlmIChleHByUC5YX29wID09IE9fYmlnIHx8IHNpemUgPT0gOCkKLQkJICAgIHsKLQkJICAgICAgaWYgKChrID0gZXhwclAuWF9hZGRfbnVtYmVyKSA+IDApCi0JCQl7Ci0JCQkgIC8qIHdlIGhhdmUgYSBiaWdudW0gaWUgYSBxdWFkLiBUaGlzIGNhbiBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHBlbnMgaW4gYSBsb25nIHN1ZmZpeGVkIGluc3RydWN0aW9uICovCi0JCQkgIGlmIChrICogMiA+IHNpemUpCi0JCQkgICAgYXNfd2FybiAoXygiQmlnbnVtIHRvbyBiaWcgZm9yIGxvbmciKSk7Ci0JCQkgIGlmIChrID09IDMpCi0JCQkgICAgbWVtUCArPSAyOwotCQkJICBmb3IgKGwgPSAwOyBrID4gMDsgay0tLCBsICs9IDIpCi0JCQkgICAgewotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChtZW1QICsgbCwKLQkJCQkJCSAgZ2VuZXJpY19iaWdudW1bbCA+PiAxXSwKLQkJCQkJCSAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewkvKiBmbG9udW0gKi8KLQkJCSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0KLQkJCSAgc3dpdGNoIChzaXplKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIDQ6Ci0JCQkgICAgICBnZW5fdG9fd29yZHMgKHdvcmRzLCAyLCA4KTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAsIChsb25nKSB3b3Jkc1swXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAgKyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSwKLQkJCQkJCShsb25nKSB3b3Jkc1sxXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgODoKLQkJCSAgICAgIGdlbl90b193b3JkcyAod29yZHMsIDQsIDExKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAsIChsb25nKSB3b3Jkc1swXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAgKyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSwKLQkJCQkJCShsb25nKSB3b3Jkc1sxXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKChtZW1QICsgMgotCQkJCQkJICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpLAotCQkJCQkJKGxvbmcpIHdvcmRzWzJdLAotCQkJCQkJc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2ltbSAoKG1lbVAgKyAzCi0JCQkJCQkgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSksCi0JCQkJCQkobG9uZykgd29yZHNbM10sCi0JCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGlmIChqIHx8Ci0JCSAgICAgIGV4cHJQLlhfYWRkX3N5bWJvbCB8fAotCQkgICAgICBleHByUC5YX29wX3N5bWJvbCB8fAotCQkgICAgICBpaWYuaWlmUFtpXS5wY3JlbCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGV4cHJlc3Npb24gd2FzIHVuZGVmaW5lZCBkdWUgdG8gYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgbGFiZWwuIENyZWF0ZSBhIGZpeCBzbyB3ZSBjYW4gZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9iamVjdCBsYXRlci4gKi8KLQkJICAgICAgZXhwclAuWF9hZGRfbnVtYmVyICs9IGlpZi5paWZQW2ldLm9iamVjdF9hZGp1c3Q7Ci0JCSAgICAgIGZpeF9uZXdfbnMzMmtfZXhwIChmcmFnX25vdywKLQkJCQkJIChsb25nKSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwKLQkJCQkJIHNpemUsCi0JCQkJCSAmZXhwclAsCi0JCQkJCSBpaWYuaWlmUFtpXS5wY3JlbCwKLQkJCQkJIGlpZi5paWZQW2ldLmltX2Rpc3AsCi0JCQkJCSBqLAotCQkJCQkgaWlmLmlpZlBbaV0uYnNyLAotCQkJCQkgaW5zdF9mcmFnLCBpbnN0X29mZnNldCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBnb29kLCBqdXN0IHB1dCB0aGVtIGJ5dGVzIG91dCAqLwotCQkgICAgICBzd2l0Y2ggKGlpZi5paWZQW2ldLmltX2Rpc3ApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIG1kX251bWJlcl90b19pbW0gKG1lbVAsIGV4cHJQLlhfYWRkX251bWJlciwgc2l6ZSk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAxOgotCQkJICBtZF9udW1iZXJfdG9fZGlzcCAobWVtUCwgZXhwclAuWF9hZGRfbnVtYmVyLCBzaXplKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBhc19mYXRhbCAoXygiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvcG9pbnRlciIpKTsKLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IgaW4gaWlmLmlpZlBbbl0udHlwZSIpKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDA6Ci0JICAgICAgLyogVG8gYmFkLCB0aGUgb2JqZWN0IG1heSBiZSB1bmRlZmluZWQgYXMgZmFyIGFzIGl0cwotCQkgZmluYWwgbnNpemUgaW4gb2JqZWN0IG1lbW9yeSBpcyBjb25jZXJuZWQuICBUaGUgc2l6ZQotCQkgb2YgdGhlIG9iamVjdCBpbiBvYmplY3RtZW1vcnkgaXMgbm90IGV4cGxpY2l0bHkKLQkJIGdpdmVuLiAgSWYgdGhlIG9iamVjdCBpcyBkZWZpbmVkIGl0cyBsZW5ndGggY2FuIGJlCi0JCSBkZXRlcm1pbmVkIGFuZCBhIGZpeCBjYW4gcmVwbGFjZSB0aGUgZnJhZy4gKi8KLQkgICAgICB7Ci0JCWV2YWx1YXRlX2V4cHIgKCZleHByUCwgKGNoYXIgKikgaWlmLmlpZlBbaV0ub2JqZWN0KTsKLQkJaWYgKChleHByUC5YX2FkZF9zeW1ib2wgfHwgZXhwclAuWF9vcF9zeW1ib2wpICYmCi0JCSAgICAhaWlmLmlpZlBbaV0ucGNyZWwpCi0JCSAgewotCQkgICAgLyogU2l6ZSBpcyB1bmtub3duIHVudGlsIGxpbmsgdGltZSBzbyBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGFsbG93IDQgYnl0ZXMuICovCi0JCSAgICBzaXplID0gNDsKLQkJICAgIG1lbVAgPSBmcmFnX21vcmUoc2l6ZSk7Ci0JCSAgICBmaXhfbmV3X25zMzJrX2V4cCAoZnJhZ19ub3csCi0JCQkJICAgICAgIChsb25nKSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwKLQkJCQkgICAgICAgc2l6ZSwKLQkJCQkgICAgICAgJmV4cHJQLAotCQkJCSAgICAgICAwLCAvKiBuZXZlciBpaWYuaWlmUFtpXS5wY3JlbCwgKi8KLQkJCQkgICAgICAgMSwgLyogYWx3YXlzIGlpZi5paWZQW2ldLmltX2Rpc3AgKi8KLQkJCQkgICAgICAgKGJpdF9maXhTICopIDAsIDAsCi0JCQkJICAgICAgIGluc3RfZnJhZywKLQkJCQkgICAgICAgaW5zdF9vZmZzZXQpOwotCQkgICAgYnJlYWs7CQkvKiBleGl0IHRoaXMgYWJzb2x1dGUgaGFjayAqLwotCQkgIH0KLQotCQlpZiAoZXhwclAuWF9hZGRfc3ltYm9sIHx8IGV4cHJQLlhfb3Bfc3ltYm9sKQotCQkgIHsJCQkvKiBmcmFnIGl0ICovCi0JCSAgICBpZiAoZXhwclAuWF9vcF9zeW1ib2wpCi0JCSAgICAgIHsJCQkvKiBXZSBjYW50IHJlbGF4IHRoaXMgY2FzZSAqLwotCQkJYXNfZmF0YWwgKF8oIkNhbid0IHJlbGF4IGRpZmZlcmVuY2UiKSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCi0JCQkvKiBTaXplIGlzIG5vdCBpbXBvcnRhbnQuIFRoaXMgZ2V0cyBmaXhlZCBieSByZWxheCwKLQkJCSAqIGJ1dCB3ZSBhc3N1bWUgMCBpbiB3aGF0IGZvbGxvd3MKLQkJCSAqLwotCQkJbWVtUCA9IGZyYWdfbW9yZSg0KTsgLyogTWF4IHNpemUgKi8KLQkJCXNpemUgPSAwOwotCi0JCQl7Ci0JCQkgIGZyYWdTICpvbGRfZnJhZyA9IGZyYWdfbm93OwotCQkJICBmcmFnX3ZhcmlhbnQgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJCQk0LCAvKiBNYXggc2l6ZSAqLwotCQkJCQkwLCAvKiBzaXplICovCi0JCQkJCUlORCAoQlJBTkNILCBVTkRFRiksIC8qIGV4cGVjdGluZyB0aGUgd29yc3QgKi8KLQkJCQkJZXhwclAuWF9hZGRfc3ltYm9sLAotCQkJCQlleHByUC5YX2FkZF9udW1iZXIsCi0JCQkJCWluc3Rfb3Bjb2RlKTsKLQkJCSAgZnJhZ19vcGNvZGVfZnJhZyhvbGRfZnJhZykgPSBpbnN0X2ZyYWc7Ci0JCQkgIGZyYWdfb3Bjb2RlX29mZnNldChvbGRfZnJhZykgPSBpbnN0X29mZnNldDsKLQkJCSAgZnJhZ19ic3Iob2xkX2ZyYWcpID0gaWlmLmlpZlBbaV0uYnNyOwotCQkJfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogVGhpcyBkdXBsaWNhdGVzIGNvZGUgaW4gbWRfbnVtYmVyX3RvX2Rpc3AgKi8KLQkJICAgIGlmICgtNjQgPD0gZXhwclAuWF9hZGRfbnVtYmVyICYmIGV4cHJQLlhfYWRkX251bWJlciA8PSA2MykKLQkJICAgICAgewotCQkJc2l6ZSA9IDE7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaWYgKC04MTkyIDw9IGV4cHJQLlhfYWRkX251bWJlcgotCQkJICAgICYmIGV4cHJQLlhfYWRkX251bWJlciA8PSA4MTkxKQotCQkJICB7Ci0JCQkgICAgc2l6ZSA9IDI7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGlmICgtMHgyMDAwMDAwMDw9ZXhwclAuWF9hZGRfbnVtYmVyICYmCi0JCQkJZXhwclAuWF9hZGRfbnVtYmVyPD0weDFmZmZmZmZmKQotCQkJICAgICAgewotCQkJCXNpemUgPSA0OwotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQlhc193YXJuIChfKCJEaXNwbGFjZW1lbnQgdG8gbGFyZ2UgZm9yIDpkIikpOwotCQkJCXNpemUgPSA0OwotCQkJICAgICAgfQotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIG1lbVAgPSBmcmFnX21vcmUoc2l6ZSk7Ci0JCSAgICBtZF9udW1iZXJfdG9fZGlzcCAobWVtUCwgZXhwclAuWF9hZGRfbnVtYmVyLCBzaXplKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBsb2dpYyBlcnJvciBpbiBpaWYuaWlmUFtdLnR5cGUiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotDAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIFRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgcmVhbGx5IGJlIGluIHRoZSBiZmQgbGlicmFyeSAqLwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotcmVsb2MgKGludCBzaXplLCBpbnQgcGNyZWwsIGludCB0eXBlKQotewotICBpbnQgbGVuZ3RoLCBpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jc1tdID0gewotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fOCwKLSAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2LAotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsCi0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMLAotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwKLQotICAgIC8qIG5zMzJrIGRpc3BsYWNlbWVudHMgKi8KLSAgICBCRkRfUkVMT0NfTlMzMktfRElTUF84LAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsCi0KLSAgICAvKiBOb3JtYWwgMidzIGNvbXBsZW1lbnQgKi8KLSAgICBCRkRfUkVMT0NfOCwKLSAgICBCRkRfUkVMT0NfMTYsCi0gICAgQkZEX1JFTE9DXzMyLAotICAgIEJGRF9SRUxPQ184X1BDUkVMLAotICAgIEJGRF9SRUxPQ18xNl9QQ1JFTCwKLSAgICBCRkRfUkVMT0NfMzJfUENSRUwKLSAgICB9OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGxlbmd0aCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgbGVuZ3RoID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBsZW5ndGggPSAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgaW5kZXggPSBsZW5ndGggKyAzICogcGNyZWwgKyA2ICogdHlwZTsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplb2YocmVsb2NzKS9zaXplb2YocmVsb2NzWzBdKSkKLSAgICByZXR1cm4gcmVsb2NzW2luZGV4XTsKLSAgaWYgKHBjcmVsKQotICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIHN0b3JhZ2UgdHlwZSAlZCIpLAotCSAgICBzaXplLCB0eXBlKTsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24gZm9yIHN0b3JhZ2UgdHlwZSAlZCIpLAotCSAgICBzaXplLCB0eXBlKTsKLSAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOwotCi19Ci0KLSNlbmRpZgotCi12b2lkCi1tZF9hc3NlbWJsZSAobGluZSkKLSAgICAgY2hhciAqbGluZTsKLXsKLSAgZnJlZXB0ciA9IGZyZWVwdHJfc3RhdGljOwotICBwYXJzZSAobGluZSwgMCk7CQkvKiBleHBsb2RlIGxpbmUgdG8gbW9yZSBmaXggZm9ybSBpbiBpaWYgKi8KLSAgY29udmVydF9paWYgKCk7CQkvKiBjb252ZXJ0IGlpZiB0byBmcmFncywgZml4J3MgZXRjICovCi0jaWZkZWYgU0hPV19OVU0KLSAgcHJpbnRmICgiIFx0XHRcdCVzXG4iLCBsaW5lKTsKLSNlbmRpZgotfQotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIC8qIGJ1aWxkIGEgaGFzaHRhYmxlIG9mIHRoZSBpbnN0cnVjdGlvbnMgKi8KLSAgY29uc3Qgc3RydWN0IG5zMzJrX29wY29kZSAqcHRyOwotICBjb25zdCBjaGFyICpzdGF0OwotICBpbnN0X2hhc2hfaGFuZGxlID0gaGFzaF9uZXcgKCk7Ci0gIGZvciAocHRyID0gbnMzMmtfb3Bjb2RlczsgcHRyIDwgZW5kb3A7IHB0cisrKQotICAgIHsKLSAgICAgIGlmICgoc3RhdCA9IGhhc2hfaW5zZXJ0IChpbnN0X2hhc2hfaGFuZGxlLCBwdHItPm5hbWUsIChjaGFyICopIHB0cikpKQotCXsKLQkgIGFzX2ZhdGFsIChfKCJDYW4ndCBoYXNoICVzOiAlcyIpLCBwdHItPm5hbWUsIHN0YXQpOwkvKmZhdGFsKi8KLQl9Ci0gICAgfQotICBmcmVlcHRyX3N0YXRpYyA9IChjaGFyICopIG1hbGxvYyAoUFJJVkFURV9TSVpFKTsgLyogc29tZSBwcml2YXRlIHNwYWNlCi0JCQkJCQkgICAgICBwbGVhc2UhICovCi19Ci0KLS8qIE11c3QgYmUgZXF1YWwgdG8gTUFYX1BSRUNJU09OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgbGl0UCBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIGVtaXQgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzLiAgVGhlIG51bWJlciBvZgotICAgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCotLXdvcmRQKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotDAotLyogQ29udmVydCBudW1iZXIgdG8gY2hhcnMgaW4gY29ycmVjdCBvcmRlciAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLQotLyogVGhpcyBpcyBhIHZhcmlhbnQgb2YgbWRfbnVtYmVyc190b19jaGFycy4gVGhlIHJlYXNvbiBmb3IgaXRzJwotICAgZXhpc3RlbmNlIGlzIHRoZSBmYWN0IHRoYXQgbnMzMmsgdXNlcyBIdWZmbWFuIGNvZGVkCi0gICBkaXNwbGFjZW1lbnRzLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgYml0IG9yZGVyIGlzIHJldmVyc2VkIGluCi0gICBkaXNwbGFjZW1lbnRzIGFuZCB0aGF0IHRoZXkgYXJlIHByZWZpeGVkIHdpdGggYSBzaXplLXRhZy4KLQotICAgYmluYXJ5OiBtc2IgLT4gbHNiCi0gICAweHh4eHh4eAkJCQlieXRlCi0gICAxMHh4eHh4eCB4eHh4eHh4eAkJCXdvcmQKLSAgIDExeHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4CWRvdWJsZSB3b3JkCi0KLSAgIFRoaXMgbXVzdCBiZSB0YWtlbiBjYXJlIG9mIGFuZCB3ZSBkbyBpdCBoZXJlISAgKi8KLXN0YXRpYyB2b2lkCi1tZF9udW1iZXJfdG9fZGlzcCAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGNoYXIgbjsKLXsKLSAgc3dpdGNoIChuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAodmFsIDwgLTY0IHx8IHZhbCA+IDYzKQotCWFzX3dhcm4gKF8oIkJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZS4gIGxpbmUgbnVtYmVyIG5vdCB2YWxpZCIpKTsKLSAgICAgIHZhbCAmPSAweDdmOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHZhbCA8IC04MTkyIHx8IHZhbCA+IDgxOTEpCi0JYXNfd2FybiAoXygiV29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlLiAgbGluZSBudW1iZXIgbm90IHZhbGlkIikpOwotICAgICAgdmFsICY9IDB4M2ZmZjsKLSAgICAgIHZhbCB8PSAweDgwMDA7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiA4ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAodmFsIDwgLTB4MjAwMDAwMDAgfHwgdmFsID49IDB4MjAwMDAwMDApCi0JYXNfd2FybiAoXygiRG91YmxlIHdvcmQgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIpKTsKLSAgICAgIHZhbCB8PSAweGMwMDAwMDAwOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMjQgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiAxNiAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDggJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IuICBsaW5lICVzLCBmaWxlIFwiJXNcIiIpLAotCQlfX0xJTkVfXywgX19GSUxFX18pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBjaGFyIG47Ci17Ci0gIHN3aXRjaCAobikKLSAgICB7Ci0gICAgY2FzZSAxOgotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gOCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMjQgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiAxNiAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDggJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IuIGxpbmUgJXMsIGZpbGUgXCIlc1wiIiksCi0JCV9fTElORV9fLCBfX0ZJTEVfXyk7Ci0gICAgfQotfQotCi0KLS8qIGZhc3QgYml0ZmlkZGxpbmcgc3VwcG9ydCAqLwotLyogbWFzayB1c2VkIHRvIHplcm8gYml0ZmllbGQgYmVmb3JlIG9yaW5nIGluIHRoZSB0cnVlIGZpZWxkICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxfbWFza1tdID0KLXsKLSAgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZSwgMHhmZmZmZmZmYywgMHhmZmZmZmZmOCwKLSAgMHhmZmZmZmZmMCwgMHhmZmZmZmZlMCwgMHhmZmZmZmZjMCwgMHhmZmZmZmY4MCwKLSAgMHhmZmZmZmYwMCwgMHhmZmZmZmUwMCwgMHhmZmZmZmMwMCwgMHhmZmZmZjgwMCwKLSAgMHhmZmZmZjAwMCwgMHhmZmZmZTAwMCwgMHhmZmZmYzAwMCwgMHhmZmZmODAwMCwKLSAgMHhmZmZmMDAwMCwgMHhmZmZlMDAwMCwgMHhmZmZjMDAwMCwgMHhmZmY4MDAwMCwKLSAgMHhmZmYwMDAwMCwgMHhmZmUwMDAwMCwgMHhmZmMwMDAwMCwgMHhmZjgwMDAwMCwKLSAgMHhmZjAwMDAwMCwgMHhmZTAwMDAwMCwgMHhmYzAwMDAwMCwgMHhmODAwMDAwMCwKLSAgMHhmMDAwMDAwMCwgMHhlMDAwMDAwMCwgMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwKLX07Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyByX21hc2tbXSA9Ci17Ci0gIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDcsCi0gIDB4MDAwMDAwMGYsIDB4MDAwMDAwMWYsIDB4MDAwMDAwM2YsIDB4MDAwMDAwN2YsCi0gIDB4MDAwMDAwZmYsIDB4MDAwMDAxZmYsIDB4MDAwMDAzZmYsIDB4MDAwMDA3ZmYsCi0gIDB4MDAwMDBmZmYsIDB4MDAwMDFmZmYsIDB4MDAwMDNmZmYsIDB4MDAwMDdmZmYsCi0gIDB4MDAwMGZmZmYsIDB4MDAwMWZmZmYsIDB4MDAwM2ZmZmYsIDB4MDAwN2ZmZmYsCi0gIDB4MDAwZmZmZmYsIDB4MDAxZmZmZmYsIDB4MDAzZmZmZmYsIDB4MDA3ZmZmZmYsCi0gIDB4MDBmZmZmZmYsIDB4MDFmZmZmZmYsIDB4MDNmZmZmZmYsIDB4MDdmZmZmZmYsCi0gIDB4MGZmZmZmZmYsIDB4MWZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4N2ZmZmZmZmYsCi19OwotI2RlZmluZSBNQVNLX0JJVFMgMzEKLS8qIEluc2VydCBiaXRmaWVsZCBkZXNjcmliZWQgYnkgZmllbGRfcHRyIGFuZCB2YWwgYXQgYnVmCi0gICBUaGlzIHJvdXRpbmUgaXMgd3JpdHRlbiBmb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBmaXJzdCA0IGJ5dGVzIHBvaW50ZWQKLSAgIHRvIGJ5IGJ1ZiwgdG8geWllbGQgc3BlZWQuCi0gICBUaGUgaWZkZWYgc3R1ZmYgaXMgZm9yIHNlbGVjdGlvbiBiZXR3ZWVuIGEgbnMzMmstZGVwZW5kZW50IHJvdXRpbmUKLSAgIGFuZCBhIGdlbmVyYWwgdmVyc2lvbi4gKE15IGFkdmljZTogdXNlIHRoZSBnZW5lcmFsIHZlcnNpb24hKQotICAgKi8KLQotc3RhdGljIHZvaWQKLW1kX251bWJlcl90b19maWVsZCAoYnVmLCB2YWwsIGZpZWxkX3B0cikKLSAgICAgcmVnaXN0ZXIgY2hhciAqYnVmOwotICAgICByZWdpc3RlciBsb25nIHZhbDsKLSAgICAgcmVnaXN0ZXIgYml0X2ZpeFMgKmZpZWxkX3B0cjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBvYmplY3Q7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgLyogZGVmaW5lIEVORElBTiBvbiBhIG5zMzJrIG1hY2hpbmUgKi8KLSNpZmRlZiBFTkRJQU4KLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqbWVtX3B0cjsKLSNlbHNlCi0gIHJlZ2lzdGVyIGNoYXIgKm1lbV9wdHI7Ci0jZW5kaWYKLSAgaWYgKGZpZWxkX3B0ci0+ZnhfYml0X21pbiA8PSB2YWwgJiYgdmFsIDw9IGZpZWxkX3B0ci0+ZnhfYml0X21heCkKLSAgICB7Ci0jaWZkZWYgRU5ESUFOCi0gICAgICBpZiAoZmllbGRfcHRyLT5meF9iaXRfYmFzZSkKLQl7CQkJLyogb3ZlcnJpZGUgYnVmICovCi0JICBtZW1fcHRyID0gKHVuc2lnbmVkIGxvbmcgKikgZmllbGRfcHRyLT5meF9iaXRfYmFzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtX3B0ciA9ICh1bnNpZ25lZCBsb25nICopIGJ1ZjsKLQl9Ci0gICAgICBtZW1fcHRyID0gKCh1bnNpZ25lZCBsb25nICopCi0JCSAoKGNoYXIgKikgbWVtX3B0ciArIGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2VfYWRqKSk7Ci0jZWxzZQotICAgICAgaWYgKGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2UpCi0JewkJCS8qIG92ZXJyaWRlIGJ1ZiAqLwotCSAgbWVtX3B0ciA9IChjaGFyICopIGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbV9wdHIgPSBidWY7Ci0JfQotICAgICAgbWVtX3B0ciArPSBmaWVsZF9wdHItPmZ4X2JpdF9iYXNlX2FkajsKLSNlbmRpZgotI2lmZGVmIEVORElBTgkJCS8qIHdlIGhhdmUgYSBuaWNlIG5zMzJrIG1hY2hpbmUgd2l0aCBsb3dieXRlCi0JCQkJICAgYXQgbG93LXBoeXNpY2FsIG1lbSAqLwotICAgICAgb2JqZWN0ID0gKm1lbV9wdHI7CS8qIGdldCBzb21lIGJ5dGVzICovCi0jZWxzZSAvKiBPVkUgR29vZiEgdGhlIG1hY2hpbmUgaXMgYSBtNjhrIG9yIGRpdG8gKi8KLSAgICAgIC8qIFRoYXQgdGFrZXMgbW9yZSBieXRlIGZpZGRsaW5nICovCi0gICAgICBvYmplY3QgPSAwOwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbM10gJiAweGZmOwotICAgICAgb2JqZWN0IDw8PSA4OwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbMl0gJiAweGZmOwotICAgICAgb2JqZWN0IDw8PSA4OwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbMV0gJiAweGZmOwotICAgICAgb2JqZWN0IDw8PSA4OwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbMF0gJiAweGZmOwotI2VuZGlmCi0gICAgICBtYXNrID0gMDsKLSAgICAgIG1hc2sgfD0gKHJfbWFza1tmaWVsZF9wdHItPmZ4X2JpdF9vZmZzZXRdKTsKLSAgICAgIG1hc2sgfD0gKGxfbWFza1tmaWVsZF9wdHItPmZ4X2JpdF9vZmZzZXQgKyBmaWVsZF9wdHItPmZ4X2JpdF9zaXplXSk7Ci0gICAgICBvYmplY3QgJj0gbWFzazsKLSAgICAgIHZhbCArPSBmaWVsZF9wdHItPmZ4X2JpdF9hZGQ7Ci0gICAgICBvYmplY3QgfD0gKCh2YWwgPDwgZmllbGRfcHRyLT5meF9iaXRfb2Zmc2V0KSAmIChtYXNrIF4gMHhmZmZmZmZmZikpOwotI2lmZGVmIEVORElBTgotICAgICAgKm1lbV9wdHIgPSBvYmplY3Q7Ci0jZWxzZQotICAgICAgbWVtX3B0clswXSA9IChjaGFyKSBvYmplY3Q7Ci0gICAgICBvYmplY3QgPj49IDg7Ci0gICAgICBtZW1fcHRyWzFdID0gKGNoYXIpIG9iamVjdDsKLSAgICAgIG9iamVjdCA+Pj0gODsKLSAgICAgIG1lbV9wdHJbMl0gPSAoY2hhcikgb2JqZWN0OwotICAgICAgb2JqZWN0ID4+PSA4OwotICAgICAgbWVtX3B0clszXSA9IChjaGFyKSBvYmplY3Q7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCaXQgZmllbGQgb3V0IG9mIHJhbmdlIikpOwotICAgIH0KLX0KLQotaW50IG1kX3BjcmVsX2FkanVzdCAoZnJhZ1MgKmZyYWdQKQotewotICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0gIGFkZHJlc3NUIG9wY29kZV9hZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICBvcGNvZGVfZnJhZyA9IGZyYWdfb3Bjb2RlX2ZyYWcoZnJhZ1ApOwotICBpZiAob3Bjb2RlX2ZyYWcgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgb2Zmc2V0ID0gZnJhZ19vcGNvZGVfb2Zmc2V0KGZyYWdQKTsKLSAgb3Bjb2RlX2FkZHJlc3MgPSBvZmZzZXQgKyBvcGNvZGVfZnJhZy0+ZnJfYWRkcmVzczsKLSAgcmV0dXJuIGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIG9wY29kZV9hZGRyZXNzOwotfQotCi1pbnQgbWRfZml4X3BjcmVsX2FkanVzdCAoZml4UyAqZml4UCkKLXsKLSAgZnJhZ1MgKmZyYWdQID0gZml4UC0+ZnhfZnJhZzsKLSAgZnJhZ1MgKm9wY29kZV9mcmFnOwotICBhZGRyZXNzVCBvcGNvZGVfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgb3Bjb2RlX2ZyYWcgPSBmaXhfb3Bjb2RlX2ZyYWcoZml4UCk7Ci0gIGlmIChvcGNvZGVfZnJhZyA9PSAwKQotICAgIHJldHVybiAwOwotICBvZmZzZXQgPSBmaXhfb3Bjb2RlX29mZnNldChmaXhQKTsKLSAgb3Bjb2RlX2FkZHJlc3MgPSBvZmZzZXQgKyBvcGNvZGVfZnJhZy0+ZnJfYWRkcmVzczsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIG9wY29kZV9hZGRyZXNzOwotfQotCi0vKiBBcHBseSBhIGZpeFMgKGZpeHVwIG9mIGFuIGluc3RydWN0aW9uIG9yIGRhdGEgdGhhdCB3ZSBkaWRuJ3QgaGF2ZQotICAgZW5vdWdoIGluZm8gdG8gY29tcGxldGUgaW1tZWRpYXRlbHkpIHRvIHRoZSBkYXRhIGluIGEgZnJhZy4KLQotICAgT24gdGhlIG5zMzJrLCBldmVyeXRoaW5nIGlzIGluIGEgZGlmZmVyZW50IGZvcm1hdCwgc28gd2UgaGF2ZSBicm9rZW4KLSAgIG91dCBzZXBhcmF0ZSBmdW5jdGlvbnMgZm9yIGVhY2gga2luZCBvZiB0aGluZyB3ZSBjb3VsZCBiZSBmaXhpbmcuCi0gICBUaGV5IGFsbCBnZXQgY2FsbGVkIGZyb20gaGVyZS4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotI2Vsc2UKLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLSNlbmRpZgotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgbG9uZyB2YWwgPSAqdmFscDsKLSNlbmRpZgotICBmcmFnUyAqZnJhZ1AgPSBmaXhQLT5meF9mcmFnOwotCi0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBpZiAoZml4X2JpdF9maXhQKGZpeFApKQotICAgIHsJCQkJLyogQml0ZmllbGRzIHRvIGZpeCwgc2lnaCAqLwotICAgICAgbWRfbnVtYmVyX3RvX2ZpZWxkIChidWYsIHZhbCwgZml4X2JpdF9maXhQKGZpeFApKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzd2l0Y2ggKGZpeF9pbV9kaXNwKGZpeFApKQotICAgICAgewotCi0gICAgICBjYXNlIDA6CQkJLyogSW1tZWRpYXRlIGZpZWxkICovCi0JbWRfbnVtYmVyX3RvX2ltbSAoYnVmLCB2YWwsIGZpeFAtPmZ4X3NpemUpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIDE6CQkJLyogRGlzcGxhY2VtZW50IGZpZWxkICovCi0JLyogQ2FsY3VsYXRlIG9mZnNldCAqLwotCXsKLQltZF9udW1iZXJfdG9fZGlzcCAoYnVmLAotCQkJICAgKGZpeFAtPmZ4X3BjcmVsID8gdmFsICsgbWRfZml4X3BjcmVsX2FkanVzdChmaXhQKQotCQkJICAgIDogdmFsKSwgZml4UC0+Znhfc2l6ZSk7Ci0JfQotCWJyZWFrOwotCi0gICAgICBjYXNlIDI6CQkJLyogUG9pbnRlciBpbiBhIGRhdGEgb2JqZWN0ICovCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0jaWZkZWYgQlNEX0FTU0VNQkxFUgotICByZXR1cm4gMTsKLSNlbmRpZgotfQotDAotLyogQ29udmVydCBhIHJlbGF4ZWQgZGlzcGxhY2VtZW50IHRvIGRpdHRvIGluIGZpbmFsIG91dHB1dCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VjLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0jZWxzZQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0jZW5kaWYKLXsKLSAgbG9uZyBkaXNwOwotICBsb25nIGV4dCA9IDA7Ci0KLSAgLyogQWRkcmVzcyBpbiBnYXMgY29yZSBvZiB0aGUgcGxhY2UgdG8gc3RvcmUgdGhlIGRpc3BsYWNlbWVudC4gICovCi0gIHJlZ2lzdGVyIGNoYXIgKmJ1ZmZlcl9hZGRyZXNzID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsOwotICAvKiBBZGRyZXNzIGluIG9iamVjdCBjb2RlIG9mIHRoZSBkaXNwbGFjZW1lbnQuICAqLwotICBpbnQgb2JqZWN0X2FkZHJlc3M7Ci0KLSAgZnJhZ1MgKm9wY29kZV9mcmFnOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgSU5EIChCUkFOQ0gsIEJZVEUpOgotICAgICAgZXh0ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU5EIChCUkFOQ0gsIFdPUkQpOgotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU5EIChCUkFOQ0gsIERPVUJMRSk6Ci0gICAgICBleHQgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmKGV4dCA9PSAwKQotICAgIHJldHVybjsKLQotICBrbm93IChmcmFnUC0+ZnJfc3ltYm9sKTsKLQotICBvYmplY3RfYWRkcmVzcyA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzczsKLSAgLyogVGhlIGRpc3BsYWNlbWVudCBvZiB0aGUgYWRkcmVzcywgZnJvbSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLSAgZGlzcCA9IChTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0KSAtIG9iamVjdF9hZGRyZXNzOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZGlzcCArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0gIGRpc3AgKz0gbWRfcGNyZWxfYWRqdXN0KGZyYWdQKTsKLQotICBtZF9udW1iZXJfdG9fZGlzcCAoYnVmZmVyX2FkZHJlc3MsIChsb25nKSBkaXNwLCAoaW50KSBleHQpOwotICBmcmFnUC0+ZnJfZml4ICs9IGV4dDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlc3RpbWF0ZWQgc2l6ZSBhIHZhcmlhYmxlIG9iamVjdCB3aWxsIG9jY3VweSwKLSAgIG9uZSBjYW4gc2F5IHRoYXQgd2UgdHJpZXMgdG8gZ3Vlc3MgdGhlIHNpemUgb2YgdGhlIG9iamVjdHMgYmVmb3JlIHdlCi0gICBhY3R1YWxseSBrbm93IGl0ICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgaW50IG9sZF9maXg7Ci0gIG9sZF9maXggPSBmcmFnUC0+ZnJfZml4OwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIElORCAoQlJBTkNILCBVTkRFRik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudCkKLQl7Ci0JICAvKiB0aGUgc3ltYm9sIGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gSU5EIChCUkFOQ0gsIEJZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiB3ZSBkb24ndCByZWxheCBzeW1ib2xzIGRlZmluZWQgaW4gYW4gb3RoZXIgc2VnbWVudCB0aGUKLQkgICAgIHRoaW5nIHRvIGRvIGlzIHRvIGFzc3VtZSB0aGUgb2JqZWN0IHdpbGwgb2NjdXB5IDQgYnl0ZXMgKi8KLQkgIGZpeF9uZXdfbnMzMmsgKGZyYWdQLAotCQkJIChpbnQpIChmcmFnUC0+ZnJfZml4KSwKLQkJCSA0LAotCQkJIGZyYWdQLT5mcl9zeW1ib2wsCi0JCQkgZnJhZ1AtPmZyX29mZnNldCwKLQkJCSAxLAotCQkJIDEsCi0JCQkgMCwKLQkJCSBmcmFnX2JzcihmcmFnUCksIC8qc2VxdWVudCBoYWNrICovCi0JCQkgZnJhZ19vcGNvZGVfZnJhZyhmcmFnUCksCi0JCQkgZnJhZ19vcGNvZGVfb2Zmc2V0KGZyYWdQKSk7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICAvKiBmcmFnUC0+ZnJfb3Bjb2RlWzFdPTB4ZmY7ICovCi0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQkgIGJyZWFrOwotCX0KLSAgICBjYXNlIElORCAoQlJBTkNILCBCWVRFKToKLSAgICAgIGZyYWdQLT5mcl92YXIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9maXg7Ci19Ci0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOwotaW50IG1kX2xvbmdfanVtcF9zaXplID0gNTsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIGZyb21fYWRkcjsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4RUEsIDEpOwotICBtZF9udW1iZXJfdG9fZGlzcCAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCAyKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIGZyb21fYWRkcjsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4RUEsIDEpOwotICBtZF9udW1iZXJfdG9fZGlzcCAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJtOiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICBpZiAoIXN0cmNtcCAoYXJnLCAiMzIwMzIiKSkKLQl7Ci0JICBjcHVyZWcgPSBjcHVyZWdfMDMyOwotCSAgbW11cmVnID0gbW11cmVnXzAzMjsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICIzMjUzMiIpKQotCXsKLQkgIGNwdXJlZyA9IGNwdXJlZ181MzI7Ci0JICBtbXVyZWcgPSBtbXVyZWdfNTMyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIG9wdGlvbiAtbSVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotTlMzMksgb3B0aW9uczpcblwKLS1tMzIwMzIgfCAtbTMyNTMyCXNlbGVjdCB2YXJpYW50IG9mIE5TMzJLIGFyY2hpdGVjdHVyZVxuIikpOwotfQotCi0MCi0vKgotICoJCQliaXRfZml4X25ldygpCi0gKgotICogQ3JlYXRlIGEgYml0X2ZpeFMgaW4gb2JzdGFjayAnbm90ZXMnLgotICogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwcm9maWxlIHRoZSBub3JtYWwgZml4LiBJZiB0aGUgYml0X2ZpeFAgaXMgYQotICogdmFsaWQgcG9pbnRlciAobm90IE5VTEwpIHRoZSBiaXRfZml4IGRhdGEgd2lsbCBiZSB1c2VkIHRvIGZvcm1hdCB0aGUgZml4LgotICovCi1iaXRfZml4UyAqCi1iaXRfZml4X25ldyAoc2l6ZSwgb2Zmc2V0LCBtaW4sIG1heCwgYWRkLCBiYXNlX3R5cGUsIGJhc2VfYWRqKQotICAgICBjaGFyIHNpemU7CQkJLyogTGVuZ3RoIG9mIGJpdGZpZWxkCQkqLwotICAgICBjaGFyIG9mZnNldDsJCS8qIEJpdCBvZmZzZXQgdG8gYml0ZmllbGQJKi8KLSAgICAgbG9uZyBtaW47CQkJLyogU2lnbmV4dGVuZGVkIG1pbiBmb3IgYml0ZmllbGQgKi8KLSAgICAgbG9uZyBtYXg7CQkJLyogU2lnbmV4dGVuZGVkIG1heCBmb3IgYml0ZmllbGQgKi8KLSAgICAgbG9uZyBhZGQ7CQkJLyogQWRkIG1hc2ssIHVzZWQgZm9yIGh1ZmZtYW4gcHJlZml4ICovCi0gICAgIGxvbmcgYmFzZV90eXBlOwkJLyogMCBvciAxLCBpZiAxIGl0J3MgZXhwbG9kZWQgdG8gb3Bjb2RlIHB0ciAqLwotICAgICBsb25nIGJhc2VfYWRqOwotewotICByZWdpc3RlciBiaXRfZml4UyAqYml0X2ZpeFA7Ci0KLSAgYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKGJpdF9maXhTKSk7Ci0KLSAgYml0X2ZpeFAtPmZ4X2JpdF9zaXplID0gc2l6ZTsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGJpdF9maXhQLT5meF9iaXRfYmFzZSA9IGJhc2VfdHlwZTsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9iYXNlX2FkaiA9IGJhc2VfYWRqOwotICBiaXRfZml4UC0+ZnhfYml0X21heCA9IG1heDsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9taW4gPSBtaW47Ci0gIGJpdF9maXhQLT5meF9iaXRfYWRkID0gYWRkOwotCi0gIHJldHVybiAoYml0X2ZpeFApOwotfQotCi12b2lkCi1maXhfbmV3X25zMzJrIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwKLQkgICAgICAgaW1fZGlzcCwgYml0X2ZpeFAsIGJzciwgb3Bjb2RlX2ZyYWcsIG9wY29kZV9vZmZzZXQpCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiAgb3IgNCB1c3VhbGx5LiAqLwotICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwkvKiBYX2FkZF9zeW1ib2wuICovCi0gICAgIGxvbmcgb2Zmc2V0OwkJLyogWF9hZGRfbnVtYmVyLiAqLwotICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICAgICBjaGFyIGltX2Rpc3A7CQkvKiB0cnVlIGlmIHRoZSB2YWx1ZSB0byB3cml0ZSBpcyBhCi0JCQkJICAgZGlzcGxhY2VtZW50ICovCi0gICAgIGJpdF9maXhTICpiaXRfZml4UDsJLyogcG9pbnRlciBhdCBzdHJ1Y3Qgb2YgYml0X2ZpeCdzLCBpZ25vcmVkIGlmCi0JCQkJICAgTlVMTCAqLwotICAgICBjaGFyIGJzcjsJCQkvKiBzZXF1ZW50LWxpbmtlci1oYWNrOiAxIHdoZW4gcmVsb2NvYmplY3QgaXMKLQkJCQkgICBhIGJzciAqLwotICAgICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0gICAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0OwotCi17Ci0gIGZpeFMgKmZpeFAgPSBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwKLQkJCW9mZnNldCwgcGNyZWwsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJYml0X2ZpeFA/IE5PX1JFTE9DOiByZWxvYyhzaXplLCBwY3JlbCwgaW1fZGlzcCkKLSNlbHNlCi0JCQlOT19SRUxPQwotI2VuZGlmCi0JCQkpOwotCi0gIGZpeF9vcGNvZGVfZnJhZyhmaXhQKSA9IG9wY29kZV9mcmFnOwotICBmaXhfb3Bjb2RlX29mZnNldChmaXhQKSA9IG9wY29kZV9vZmZzZXQ7Ci0gIGZpeF9pbV9kaXNwKGZpeFApID0gaW1fZGlzcDsKLSAgZml4X2JzcihmaXhQKSA9IGJzcjsKLSAgZml4X2JpdF9maXhQKGZpeFApID0gYml0X2ZpeFA7Ci19CQkJCS8qIGZpeF9uZXdfbnMzMmsoKSAqLwotCi12b2lkCi1maXhfbmV3X25zMzJrX2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsCi0JCSAgIGltX2Rpc3AsIGJpdF9maXhQLCBic3IsIG9wY29kZV9mcmFnLCBvcGNvZGVfb2Zmc2V0KQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIgIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgZXhwcmVzc2lvblMgKmV4cDsJCS8qIEV4cHJlc3Npb24uICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gICAgIGNoYXIgaW1fZGlzcDsJCS8qIHRydWUgaWYgdGhlIHZhbHVlIHRvIHdyaXRlIGlzIGEKLQkJCQkgICBkaXNwbGFjZW1lbnQgKi8KLSAgICAgYml0X2ZpeFMgKmJpdF9maXhQOwkvKiBwb2ludGVyIGF0IHN0cnVjdCBvZiBiaXRfZml4J3MsIGlnbm9yZWQgaWYKLQkJCQkgICBOVUxMICovCi0gICAgIGNoYXIgYnNyOwkJCS8qIHNlcXVlbnQtbGlua2VyLWhhY2s6IDEgd2hlbiByZWxvY29iamVjdCBpcwotCQkJCSAgIGEgYnNyICovCi0gICAgIGZyYWdTICpvcGNvZGVfZnJhZzsKLSAgICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQ7Ci17Ci0gIGZpeFMgKmZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJICAgIGJpdF9maXhQPyBOT19SRUxPQzogcmVsb2Moc2l6ZSwgcGNyZWwsIGltX2Rpc3ApCi0jZWxzZQotCQkJICAgIE5PX1JFTE9DCi0jZW5kaWYKLQkJCSAgICApOwotCi0gIGZpeF9vcGNvZGVfZnJhZyhmaXhQKSA9IG9wY29kZV9mcmFnOwotICBmaXhfb3Bjb2RlX29mZnNldChmaXhQKSA9IG9wY29kZV9vZmZzZXQ7Ci0gIGZpeF9pbV9kaXNwKGZpeFApID0gaW1fZGlzcDsKLSAgZml4X2JzcihmaXhQKSA9IGJzcjsKLSAgZml4X2JpdF9maXhQKGZpeFApID0gYml0X2ZpeFA7Ci19CQkJCS8qIGZpeF9uZXdfbnMzMmsoKSAqLwotCi0vKiBUaGlzIGlzIFRDX0NPTlNfRklYX05FVywgY2FsbGVkIGJ5IGVtaXRfZXhwciBpbiByZWFkLmMuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfbnMzMmsgKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiAgb3IgNCB1c3VhbGx5LiAqLwotICAgICBleHByZXNzaW9uUyAqZXhwOwkJLyogRXhwcmVzc2lvbi4gKi8KLXsKLSAgZml4X25ld19uczMya19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsCi0JCSAgICAgMCwgMiwgMCwgMCwgMCwgMCk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/ICBPbiB0aGUKLSAgIG5zMzJrLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBsb25nIHJlczsKLSAgcmVzID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotICBpZiAoZnJhZ19ic3IoZml4UC0+ZnhfZnJhZykpCi0gICAgcmVzICs9IDB4MTIJCQkvKiBGT08gS2x1ZGdlIGFsZXJ0ISAqLwotI2VuZGlmCi0gICAgICByZXR1cm4gcmVzOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgY29kZSA9IHJlbG9jKGZpeHAtPmZ4X3NpemUsIGZpeHAtPmZ4X3BjcmVsLCBmaXhfaW1fZGlzcChmaXhwKSk7Ci0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbC0+YWRkZW5kID0gMDsKLQotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAoIXJlbC0+aG93dG8pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9IF8oIjx1bmtub3duPiIpOwotICAgICAgYXNfZmF0YWwgKF8oIkNhbm5vdCBmaW5kIHJlbG9jYXRpb24gdHlwZSBmb3Igc3ltYm9sICVzLCBjb2RlICVkIiksCi0JCW5hbWUsIChpbnQpIGNvZGUpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgT0JKX0FPVVQKLXZvaWQKLWNvbnNfZml4X25ld19uczMyayAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3RydWN0IGZpeCAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIC8qCi0gICAqIEluOiBsZW5ndGggb2YgcmVsb2NhdGlvbiAob3Igb2YgYWRkcmVzcykgaW4gY2hhcnM6IDEsIDIgb3IgNC4KLSAgICogT3V0OiBHTlUgTEQgcmVsb2NhdGlvbiBsZW5ndGggY29kZTogMCwgMSwgb3IgMi4KLSAgICovCi0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotICAgICAgIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAotCQkgICAgICA0KTsKLQotICByX3N5bWJvbG51bSA9IChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCQkgPyBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkKLQkJIDogZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcik7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSArIDQsCi0JCSAgICAgICgobG9uZykgKHJfc3ltYm9sbnVtKQotCQkgICAgICAgfCAobG9uZykgKGZpeFAtPmZ4X3BjcmVsIDw8IDI0KQotCQkgICAgICAgfCAobG9uZykgKG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXSA8PCAyNSkKLQkJICAgICAgIHwgKGxvbmcpICgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKSA8PCAyNykKLQkJICAgICAgIHwgKGxvbmcpIChmaXhfYnNyKGZpeFApIDw8IDI4KQotCQkgICAgICAgfCAobG9uZykgKGZpeF9pbV9kaXNwKGZpeFApIDw8IDI5KSksCi0JCSAgICAgIDQpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLSNlbmRpZiAvKiBCRkRfQVNTTUVCTEVSICovCi0KLS8qIGVuZCBvZiB0Yy1uczMyay5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW5zMzJrLmggYi9nYXMvY29uZmlnL3RjLW5zMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Yzg2ZWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1uczMyay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qIHRjLW5zMzJrLmggLS0gT3Bjb2RlIHRhYmxlIGZvciBOYXRpb25hbCBTZW1pIDMyayBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX05TMzJLCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4JMAotCi0jZGVmaW5lIFRDX1BDUkVMX0FESlVTVChGKSBtZF9wY3JlbF9hZGp1c3QoRikKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTk9fUkVMT0MgQkZEX1JFTE9DX05PTkUKLQotI2RlZmluZSBUQVJHRVRfQVJDSAkJYmZkX2FyY2hfbnMzMmsKLQotI2lmbmRlZiBUQVJHRVRfRk9STUFUCQkvKiBNYXliZSBkZWZpbmVkIGluIHRlLSouaCAqLwotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtcGM1MzItbWFjaCIKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgTk9fUkVMT0MgMAotI2VuZGlmCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgImJpdF9maXguaCIKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0KLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZGVmaW5lIERFRl9NT0RFTCAyMQotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVDCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVMCi0jZGVmaW5lIERFRl9NT0RFTCAyMAotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0FSR1MgNAotI2RlZmluZSBBUkdfTEVOIDUwCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19uczMyawotZXh0ZXJuIHZvaWQgZml4X25ld19uczMya19leHAgUEFSQU1TKChmcmFnUyAqZnJhZywKLQkJCQkgICBpbnQgd2hlcmUsCi0JCQkJICAgaW50IHNpemUsCi0JCQkJICAgZXhwcmVzc2lvblMgKmV4cCwKLQkJCQkgICBpbnQgcGNyZWwsCi0JCQkJICAgaW50IGltX2Rpc3AsCi0JCQkJICAgYml0X2ZpeFMgKmJpdF9maXhQLAkvKiByZWFsbHkgYml0X2ZpeFMgKi8KLQkJCQkgICBpbnQgYnNyLAotCQkJCSAgIGZyYWdTICpvcGNvZGVfZnJhZywKLQkJCQkgICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldCkpOwotCi0KLWV4dGVybiB2b2lkIGZpeF9uZXdfbnMzMmsgUEFSQU1TICgoZnJhZ1MgKmZyYWcsCi0JCQkJICAgaW50IHdoZXJlLAotCQkJCSAgIGludCBzaXplLAotCQkJCSAgIHN5bWJvbFMgKmFkZF9zeW1ib2wsCi0JCQkJICAgbG9uZyBvZmZzZXQsCi0JCQkJICAgaW50IHBjcmVsLAotCQkJCSAgIGludCBpbV9kaXNwLAotCQkJCSAgIGJpdF9maXhTICpiaXRfZml4UCwJLyogcmVhbGx5IGJpdF9maXhTICovCi0JCQkJICAgaW50IGJzciwKLQkJCQkgICBmcmFnUyAqb3Bjb2RlX2ZyYWcsCi0JCQkJICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQpKTsKLQotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X25zMzJrIFBBUkFNUyAoKGZyYWdTICpmcmFnLAotCQkJCQlpbnQgd2hlcmUsCi0JCQkJCWludCBzaXplLAotCQkJCQlleHByZXNzaW9uUyAqZXhwKSk7Ci0KLS8qIHRoZSBOUzMyeDMyIGhhcyBhIG5vbiAwIG5vcCBpbnN0cnVjdGlvbiB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhbGlnbnMgKi8KLSNkZWZpbmUgTk9QX09QQ09ERSAweGEyCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0jZGVmaW5lIFRDX0ZSQUdfVFlQRQkJCQlcCi1zdHJ1Y3QgewkJCQkJXAotICBmcmFnUyAqZnJfb3Bjb2RlX2ZyYWdQOwkJCVwKLSAgdW5zaWduZWQgaW50IGZyX29wY29kZV9vZmZzZXQ7CQlcCi0gIGNoYXIgZnJfYnNyOwkJCQkJXAotfQotCi0jZGVmaW5lIFRDX0ZSQUdfSU5JVChYKQkJCQlcCi0gIGRvCQkJCQkJXAotICAgICB7CQkJCQkJXAotICAgICAgIGZyYWdfb3Bjb2RlX2ZyYWcgKFgpID0gTlVMTDsJCVwKLSAgICAgICBmcmFnX29wY29kZV9vZmZzZXQgKFgpID0gMDsJCVwKLSAgICAgICBmcmFnX2JzciAoWCkgPSAwOwkJCQlcCi0gICAgIH0JCQkJCQlcCi0gIHdoaWxlKDApCi0KLS8qIEFjY2Vzc29yIG1hY3JvcyBmb3IgdGhpbmdzIHdoaWNoIG1heSBtb3ZlIGFyb3VuZCAqLwotI2RlZmluZSBmcmFnX29wY29kZV9mcmFnKFgpICAgKFgpLT50Y19mcmFnX2RhdGEuZnJfb3Bjb2RlX2ZyYWdQCi0jZGVmaW5lIGZyYWdfb3Bjb2RlX29mZnNldChYKSAoWCktPnRjX2ZyYWdfZGF0YS5mcl9vcGNvZGVfb2Zmc2V0Ci0jZGVmaW5lIGZyYWdfYnNyKFgpICAgICAgICAgICAoWCktPnRjX2ZyYWdfZGF0YS5mcl9ic3IKLQotI2RlZmluZSBUQ19GSVhfVFlQRQkJCQlcCi1zdHJ1Y3QJCQkJCQlcCi17CQkJCQkJXAotICBmcmFnUyAqb3Bjb2RlX2ZyYWdQOwkJCQlcCi0gIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0OwkJCVwKLSAgdW5zaWduZWQgaW50IGJzciA6IDE7CQkJCVwKLX0KLQotLyogQWNjZXNzb3IgbWFjcm9zIGZvciB0aGluZ3Mgd2hpY2ggbWF5IG1vdmUgYXJvdW5kLgotICAgU2VlIGNvbW1lbnRzIGluIHdyaXRlLmguICAqLwotI2RlZmluZSBmaXhfaW1fZGlzcChYKSAgICAgICAoWCktPmZ4X2ltX2Rpc3AKLSNkZWZpbmUgZml4X2JpdF9maXhQKFgpICAgICAgKFgpLT5meF9iaXRfZml4UAotI2RlZmluZSBmaXhfb3Bjb2RlX2ZyYWcoWCkgICAoWCktPnRjX2ZpeF9kYXRhLm9wY29kZV9mcmFnUAotI2RlZmluZSBmaXhfb3Bjb2RlX29mZnNldChYKSAoWCktPnRjX2ZpeF9kYXRhLm9wY29kZV9vZmZzZXQKLSNkZWZpbmUgZml4X2JzcihYKSAgICAgICAgICAgKFgpLT50Y19maXhfZGF0YS5ic3IKLQotI2RlZmluZSBUQ19JTklUX0ZJWF9EQVRBKFgpCQkJXAotICBkbwkJCQkJCVwKLSAgICAgewkJCQkJCVwKLSAgICAgICBmaXhfb3Bjb2RlX2ZyYWcoWCkgPSBOVUxMOwkJXAotICAgICAgIGZpeF9vcGNvZGVfb2Zmc2V0KFgpID0gMDsJCVwKLSAgICAgICBmaXhfYnNyKFgpID0gMDsJCQkJXAotICAgICB9CQkJCQkJXAotICB3aGlsZSgwKQotCi0jZGVmaW5lIFRDX0ZJWF9EQVRBX1BSSU5UKEZJTEUsIEZJWFApCQkJCQlcCi0gIGRvCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBmcHJpbnRmKChGSUxFKSwgIm9wY29kZV9mcmFnPSVsZCwgb3BlcmFuZCBvZmZzZXQ9JWQsIGJzcj0lZFxuIiwJXAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBmaXhfb3Bjb2RlX2ZyYWcgKEZJWFApLAkJCVwKLQkgICAgICBmaXhfb3Bjb2RlX29mZnNldCAoRklYUCksCQkJCQlcCi0JICAgICAgZml4X2JzciAoRklYUCkpOwkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1wai5jIGIvZ2FzL2NvbmZpZy90Yy1wai5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjgwMzA5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtcGouYworKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKi0KLSAgIHRjLXBqLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgUGljbyBKYXZhCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBUcmFuc21ldGEsIHNhY0Bwb2JveC5jb20gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3BqLmgiCi0KLQotZXh0ZXJuIGNvbnN0IHBqX29wY19pbmZvX3QgcGpfb3BjX2luZm9bNTEyXTsKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIS8iOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIvISMiOwotCi1zdGF0aWMgaW50IHBlbmRpbmdfcmVsb2M7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsKLQkJCQkJCQotCi1zdGF0aWMgdm9pZAotbGl0dGxlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotfQotCi1zdGF0aWMgdm9pZAotYmlnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotfQotCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9IHsKLSAgeyJtbCIsICAgIGxpdHRsZSwgMH0sCi0gIHsibWIiLCAgICBiaWcsICAgIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLQotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLXZvaWQKLW1kX29wZXJhbmQgKG9wKQotICAgICBleHByZXNzaW9uUyAqb3A7Ci17Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIlaGkxNiIsIDUpID09IDApCi0gICAgewotICAgICAgaWYgKHBlbmRpbmdfcmVsb2MpCi0JYXNfYmFkIChfICgiY29uZnVzaW5nIHJlbG9jYXRpb24gZXhwcmVzc2lvbnMiKSk7Ci0gICAgICBwZW5kaW5nX3JlbG9jID0gQkZEX1JFTE9DX1BKX0NPREVfSEkxNjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotICAgICAgZXhwcmVzc2lvbiAob3ApOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIiVsbzE2IiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocGVuZGluZ19yZWxvYykKLQlhc19iYWQgKF8gKCJjb25mdXNpbmcgcmVsb2NhdGlvbiBleHByZXNzaW9ucyIpKTsKLSAgICAgIHBlbmRpbmdfcmVsb2MgPSBCRkRfUkVMT0NfUEpfQ09ERV9MTzE2OwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBleHByZXNzaW9uIChvcCk7Ci0gICAgfQotfQotCi0vKiBQYXJzZSBhbiBleHByZXNzaW9uIGFuZCB0aGVuIHJlc3RvcmUgdGhlIGlucHV0IGxpbmUgcG9pbnRlci4gKi8KLQotc3RhdGljIGNoYXIgKgotcGFyc2VfZXhwX3NhdmVfaWxwIChzLCBvcCkKLSAgICAgY2hhciAqczsKLSAgICAgZXhwcmVzc2lvblMgKm9wOwotewotICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICBleHByZXNzaW9uIChvcCk7Ci0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBzOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSBlbWl0X2V4cHIgdmlhIFRDX0NPTlNfRklYX05FVyB3aGVuIGNyZWF0aW5nIGEKLSAgIHJlbG9jIGZvciBhIGNvbnMuICBXZSBjb3VsZCB1c2UgdGhlIGRlZmluaXRpb24gdGhlcmUsIGV4Y2VwdCB0aGF0Ci0gICB3ZSB3YW50IHRvIGhhbmRsZSBtYWdpYyBwZW5kaW5nIHJlbG9jIGV4cHJlc3Npb25zIHNwZWNpYWxseS4gICovCi0KLXZvaWQKLXBqX2NvbnNfZml4X25ld19waiAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICBpbnQgbmJ5dGVzOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBzdGF0aWMgaW50IHJ2WzVdWzJdID0gCi0gIHsgeyAwLCAwIH0sCi0gICAgeyBCRkRfUkVMT0NfOCwgQkZEX1JFTE9DXzggfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX0RJUjE2LCBCRkRfUkVMT0NfMTYgfSwKLSAgICB7IDAsIDAgfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyLCBCRkRfUkVMT0NfMzIgfX07Ci0KLSAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCwgMCwgCi0JICAgICAgIHBlbmRpbmdfcmVsb2MgPyBwZW5kaW5nX3JlbG9jCi0JICAgICAgIDogcnYgW25ieXRlc11bKG5vd19zZWctPmZsYWdzICYgU0VDX0NPREUpID8gMCA6IDFdKTsKLQotICBwZW5kaW5nX3JlbG9jID0gMDsKLX0KLQotCi0vKiBUdXJuIGEgcmVsb2MgZGVzY3JpcHRpb24gY2hhcmFjdGVyIGZyb20gdGhlIHBqLW9wYy5oIHRhYmxlIGludG8KLSAgIGNvZGUgd2hpY2ggQkZEIGNhbiBoYW5kbGUuICovCi0KLXN0YXRpYyBpbnQKLWNfdG9fciAoeCkKLSAgICAgY2hhciB4OwotewotICBzd2l0Y2ggKHgpCi0gICAgewotICAgIGNhc2UgT19SODoKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfOF9QQ1JFTDsKLSAgICBjYXNlIE9fVTg6Ci0gICAgY2FzZSBPXzg6Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzg7Ci0gICAgY2FzZSBPX1IxNjoKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNjsKLSAgICBjYXNlIE9fVTE2OgotICAgIGNhc2UgT18xNjoKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNjsKLSAgICBjYXNlIE9fUjMyOgotICAgICAgcmV0dXJuIEJGRF9SRUxPQ19QSl9DT0RFX1JFTDMyOwotICAgIGNhc2UgT18zMjoKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfUEpfQ09ERV9ESVIzMjsKLSAgICB9Ci0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotCi0KLQotLyogSGFuZGxlciBmb3IgdGhlIGlwdXNoIGZha2Ugb3Bjb2RlLAotICAgdHVybnMgaXB1c2ggPGZvbz4gaW50byBzaXB1c2ggbG8xNjxmb28+LCBzZXRoaSBoaTE2PGZvbz4uICovCi0KLXN0YXRpYyB2b2lkCi1pcHVzaF9jb2RlIChvcGNvZGUsIHN0cikKLSAgICAgcGpfb3BjX2luZm9fdCAqb3Bjb2RlIEFUVFJJQlVURV9VTlVTRUQ7IAotICAgICBjaGFyICpzdHI7Ci17Ci0gIGludCBtb2QgPSAwOwotICBjaGFyICpiID0gZnJhZ19tb3JlICg2KTsKLSAgZXhwcmVzc2lvblMgYXJnOwotICBiWzBdID0gMHgxMTsKLSAgYlszXSA9IDB4ZWQ7Ci0gIHBhcnNlX2V4cF9zYXZlX2lscCAoc3RyICsgMSwgJmFyZywgJm1vZCk7Ci0gIGlmIChtb2QpCi0gICAgYXNfYmFkIChfICgiY2FuJ3QgaGF2ZSByZWxvY2F0aW9uIGZvciBpcHVzaCIpKTsKLQotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgYiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgMSwgMiwgCi0JICAgICAgICZhcmcsICAwLCBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNik7Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgYiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgNCwgMiwKLQkgICAgICAgJmFyZywgIDAsIEJGRF9SRUxPQ19QSl9DT0RFX0hJMTYpOwotfQotCi0vKiBJbnNlcnQgbmFtZXMgaW50byB0aGUgb3Bjb2RlIHRhYmxlIHdoaWNoIGFyZSByZWFsbHkgbWluaSBtYWNyb3MsCi0gICBub3Qgb3Bjb2Rlcy4gIFRoZSBmYWtlbmVzcyBpcyBpbmlkaWNhdGVkIHdpdGggYW4gb3Bjb2RlIG9mIC0xLiAqLwotCi1zdGF0aWMgdm9pZAotICAgICBmYWtlX29wY29kZSAobmFtZSwgZnVuYykgY29uc3QgY2hhciAqCi0gICAgICAgbmFtZTsKLSAgICAgdm9pZCAoKmZ1bmMpICgpOwotewotICBwal9vcGNfaW5mb190ICpmYWtlID0gKHBqX29wY19pbmZvX3QgKikgeG1hbGxvYyAoc2l6ZW9mIChwal9vcGNfaW5mb190KSk7Ci0KLSAgZmFrZS0+b3Bjb2RlID0gLTE7Ci0gIGZha2UtPm9wY29kZV9uZXh0ID0gLTE7Ci0gIGZha2UtPm5hbWUgPSAoY29uc3QgY2hhciAqKSBmdW5jOwotICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSwgKGNoYXIgKikgZmFrZSk7Ci19Ci0KLQotLyogRW50ZXIgYW5vdGhlciBlbnRyeSBpbnRvIHRoZSBvcGNvZGUgaGFzaCB0YWJsZSBzbyB0aGUgc2FtZSBvcGNvZGUKLSAgIGNhbiBoYXZlIGFub3RoZXIgbmFtZS4gKi8KLXN0YXRpYyB2b2lkCi0gICAgIGFsaWFzIChuZXcsIG9sZCkgY29uc3QgY2hhciAqCi0gICAgICAgbmV3OwotICAgICBjb25zdCBjaGFyICpvbGQ7Ci17Ci0gIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBuZXcsCi0JICAgICAgIChjaGFyICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb2xkKSk7Ci19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNldHMKLSAgIHVwIHRoZSBoYXNoIHRhYmxlIHdpdGggYWxsIHRoZSBvcGNvZGVzIGluIGl0LCBhbmQgYWxzbyBpbml0aWFsaXplcwotICAgc29tZSBhbGlhc2VzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4gKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgcGpfb3BjX2luZm9fdCAqb3Bjb2RlOwotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IHBqX29wY19pbmZvOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0KLSAgLyogSW5zZXJ0IHRoZSBvbmx5IGZha2Ugb3Bjb2RlLiAqLwotICBmYWtlX29wY29kZSAoImlwdXNoIiwgaXB1c2hfY29kZSk7Ci0KLSAgLyogQWRkIHNvbWUgYWxpYXNlcyBmb3Igb3Bjb2RlIG5hbWVzLiAqLwotICBhbGlhcyAoImlmZXFfcyIsICJpZmVxIik7Ci0gIGFsaWFzICgiaWZuZV9zIiwgImlmbmUiKTsKLSAgYWxpYXMgKCJpZl9pY21wZ2VfcyIsICJpZl9pY21wZ2UiKTsKLSAgYWxpYXMgKCJpZl9pY21wbmVfcyIsICJpZl9pY21wbmUiKTsKLSAgYWxpYXMgKCJpZl9pY21wZXFfcyIsICJpZl9pY21wZXEiKTsKLSAgYWxpYXMgKCJpZl9pY21wZ3RfcyIsICJpZl9pY21wZ3QiKTsKLSAgYWxpYXMgKCJnb3RvX3MiLCAiZ290byIpOwotCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCAwKTsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX3N0YXJ0OwotICB1bnNpZ25lZCBjaGFyICpvcF9lbmQ7Ci0KLSAgLy8gIHBqX29wZXJhbl9pbmZvIG9wZXJhbmRbM107Ci0gIHBqX29wY19pbmZvX3QgKm9wY29kZTsKLSAgY2hhciAqb3V0cHV0OwotICBpbnQgaWR4ID0gMDsKLSAgY2hhciBwZW5kOwotCi0gIGludCBubGVuID0gMDsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopIChzdHIpOwotICAgICAgICpvcF9lbmQgJiYgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKSAKLSAgICBubGVuKys7Ci0KLSAgcGVuZCA9ICpvcF9lbmQ7Ci0gICpvcF9lbmQgPSAwOwotCi0gIGlmIChubGVuID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfICgiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLQotICBvcGNvZGUgPSAocGpfb3BjX2luZm9fdCAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wX3N0YXJ0KTsKLSAgKm9wX2VuZCA9IHBlbmQ7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXyAoInVua25vd24gb3Bjb2RlICVzIiksIG9wX3N0YXJ0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG9wY29kZS0+b3Bjb2RlID09IC0xKQotICAgIHsKLSAgICAgIC8qIEl0J3MgYSBmYWtlIG9wY29kZS4uIGRpZyBvdXQgdGhlIGFyZ3MgYW5kIHByZXRlbmQgdGhhdCB3YXMKLSAgICAgICAgIHdoYXQgd2Ugd2VyZSBwYXNzZWQgKi8KLSAgICAgICgodm9pZCAoKikoKSkgb3Bjb2RlLT5uYW1lKSAob3Bjb2RlLCBvcF9lbmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBhbjsKLQotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlIChvcGNvZGUtPmxlbik7Ci0gICAgICBvdXRwdXRbaWR4KytdID0gb3Bjb2RlLT5vcGNvZGU7Ci0KLSAgICAgIGlmIChvcGNvZGUtPm9wY29kZV9uZXh0ICE9IC0xKQotCW91dHB1dFtpZHgrK10gPSBvcGNvZGUtPm9wY29kZV9uZXh0OwotCi0gICAgICBmb3IgKGFuID0gMDsgb3Bjb2RlLT5hcmdbYW5dOyBhbisrKQotCXsKLQkgIGV4cHJlc3Npb25TIGFyZzsKLQotCSAgaWYgKCpvcF9lbmQgPT0gJywnICYmIGFuICE9IDApCi0JICAgIG9wX2VuZCsrOwotCi0JICBpZiAoKm9wX2VuZCA9PSAwKQotCSAgICBhc19iYWQgKCJleHBlY3RlZCBleHByZXNzc2lvbiIpOwotCi0JICBvcF9lbmQgPSBwYXJzZV9leHBfc2F2ZV9pbHAgKG9wX2VuZCwgJmFyZyk7Ci0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgCi0JCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIGlkeCwKLQkJICAgICAgIEFTSVpFIChvcGNvZGUtPmFyZ1thbl0pLAotCQkgICAgICAgJmFyZywKLQkJICAgICAgIFBDUkVMIChvcGNvZGUtPmFyZ1thbl0pLCAKLQkJICAgICAgIHBlbmRpbmdfcmVsb2MgPyBwZW5kaW5nX3JlbG9jIDogY190b19yIChvcGNvZGUtPmFyZ1thbl0pKTsKLQotCSAgaWR4ICs9IEFTSVpFIChvcGNvZGUtPmFyZ1thbl0pOwotCSAgcGVuZGluZ19yZWxvYyA9IDA7Ci0JfQotCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKm9wX2VuZCkpCi0Jb3BfZW5kKys7Ci0KLSAgICAgIGlmICgqb3BfZW5kICE9IDApCi0JYXNfd2FybiAoImV4dHJhIHN0dWZmIG9uIGxpbmUgaWdub3JlZCIpOwotCi0gICAgfQotCi0gIGlmIChwZW5kaW5nX3JlbG9jKQotICAgIGFzX2JhZCAoIlNvbWV0aGluZyBmb3Jnb3QgdG8gY2xlYW4gdXBcbiIpOwotCi19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfICgiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogMjsKLQotICBpZiAoIXRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotDAotCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotCi0jZGVmaW5lIE9QVElPTl9MSVRUTEUgKE9QVElPTl9NRF9CQVNFKQotI2RlZmluZSBPUFRJT05fQklHICAgIChPUFRJT05fTElUVExFICsgMSkKLQotICB7ImxpdHRsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFfSwKLSAgeyJiaWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JJR30sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnIEFUVFJJQlVURV9VTlVTRUQ7IAotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX0xJVFRMRToKLSAgICAgIGxpdHRsZSAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0JJRzoKLSAgICAgIGJpZyAoKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfICgiXAotUEogb3B0aW9uczpcblwKLS1saXR0bGUJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcblwKLS1iaWcJCQlnZW5lcmF0ZSBiaWcgZW5kaWFuIGNvZGVcbiIpKTsKLX0KLQotCi0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGxvbmcgdmFsID0gKnZhbHA7Ci0gIGxvbmcgbWF4LCBtaW47Ci0gIGludCBzaGlmdDsKLQotCi0gIC8qIGFkanVzdF9yZWxvY19zeW1zIHdvbid0IGNvbnZlcnQgYSByZWxvYyBhZ2FpbnN0IGEgd2VhayBzeW1ib2wKLSAgICAgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLCBidXQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsCi0gICAgIHNjcmV3IHVwIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgc28gd2UgaGF2ZSB0byBhZGp1c3QgdmFsIGhlcmUKLSAgICAgdG8gYXZvaWQgdGhlIHNjcmV3IHVwIGxhdGVyLiAgKi8KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCAmJiBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB2YWwgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLQotICBtYXggPSBtaW4gPSAwOwotICBzaGlmdCA9IDA7Ci0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNjoKLSAgICAgIGlmICh2YWwgPCAtMHg4MDAwIHx8IHZhbCA+PSAweDdmZmYpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfICgicGNyZWwgdG9vIGZhciIpKTsKLSAgICAgIGJ1ZlswXSB8PSAodmFsID4+IDgpICYgMHhmZjsKLSAgICAgIGJ1ZlsxXSA9IHZhbCAmIDB4ZmY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1BKX0NPREVfSEkxNjoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAyNDsKLSAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbCAmIDB4ZmZmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19QSl9DT0RFX0xPMTY6Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gODsKLSAgICAgICpidWYrKyA9IHZhbCA+PiAwOwotCi0gICAgICBtYXggPSAweGZmZmY7Ci0gICAgICBtaW4gPSAtMHhmZmZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgbWF4ID0gMHhmZjsKLSAgICAgIG1pbiA9IC0weGZmOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyOgotICAgICAgKmJ1ZisrID0gdmFsID4+IDI0OwotICAgICAgKmJ1ZisrID0gdmFsID4+IDE2OwotICAgICAgKmJ1ZisrID0gdmFsID4+IDg7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDI0OwotCSAgKmJ1ZisrID0gdmFsID4+IDE2OwotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgICpidWYrKyA9IHZhbCA+PiAwOwotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0JICAqYnVmKysgPSB2YWwgPj4gMjQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQl7Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQkgICpidWYrKyA9IHZhbCA+PiAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQkgICpidWYrKyA9IHZhbCA+PiA4OwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChtYXggIT0gMCAmJiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkpCi0gICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfICgib2Zmc2V0IG91dCBvZiByYW5nZSIpKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyLiAgQWx3YXlzIHB1dCB2YWx1ZXMgaW4gYW4KLSAgIGV4ZWN1dGFibGUgc2VjdGlvbiBpbnRvIGJpZyBlbmRpYW4gb3JkZXIuICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKLSAgICAgY2hhciAqcHRyOwotICAgICB2YWx1ZVQgdXNlOwotICAgICBpbnQgbmJ5dGVzOwotewotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4gfHwgbm93X3NlZy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotCi0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWw7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7Ci0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgcl90eXBlID0gZml4cC0+Znhfcl90eXBlOwotICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByX3R5cGUpOwotCi0gIGlmIChyZWwtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXyAoIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocl90eXBlKSk7Ci0gICAgICAvKiBTZXQgaG93dG8gdG8gYSBnYXJiYWdlIHZhbHVlIHNvIHRoYXQgd2UgY2FuIGtlZXAgZ29pbmcuICAqLwotICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfMzIpOwotICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvICE9IE5VTEwpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1wai5oIGIvZ2FzL2NvbmZpZy90Yy1wai5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmJmN2I3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtcGouaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qLVRoaXMgZmlsZSBpcyB0Yy1wai5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgVHJhbnNtZXRhLCBzYWNAcG9ib3guY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4sIG9mIFRyYW5zbWV0YS4gc2FjQHBvYm94LmNvbS4gKi8KLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX3BqCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImVsZjMyLXBqIiA6ICJlbGYzMi1wamwiKQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAgICAgICAgICAgICAgICAgICAgCQkJCVwKLSAgKHRhcmdldF9iaWdfZW5kaWFuICAgICAgICAgICAgICAgICAgICAgIAkJCQlcCi0gICA/ICJQaWNvIEphdmEgR0FTIEJpZyBFbmRpYW4iICAgICAgICAgICAJCQkJXAotICAgOiAiUGljbyBKYXZhIEdBUyBMaXR0bGUgRW5kaWFuIikKLQotCi12b2lkIHBqX2NvbnNfZml4X25ld19waiBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBpbnQsIGludCwgZXhwcmVzc2lvblMgKikpOwotYXJlbGVudCAqdGNfZ2VuX3JlbG9jIFBBUkFNUygoYXNlY3Rpb24gKnNlY3Rpb24sIHN0cnVjdCBmaXggKmZpeHApKTsKLQotI2RlZmluZSBtZF9zZWN0aW9uX2FsaWduKFNFR01FTlQsIFNJWkUpICAgICAoU0laRSkKLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKEIsIFMsIEYpICAgICAgICAgICAgKGFzX2ZhdGFsIChfKCJjb252ZXJ0X2ZyYWdcbiIpKSwgMCkKLSNkZWZpbmUgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoQSwgQikgKGFzX2ZhdGFsIChfKCJlc3RpbWF0ZSBzaXplXG4iKSksMCkKLSNkZWZpbmUgbWRfdW5kZWZpbmVkX3N5bWJvbChOQU1FKSAgICAgICAgICAgMAotCi0vKiBQQyByZWxhdGl2ZSBvcGVyYW5kcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBvcGNvZGUsIGFuZCB0aGUgb3BlcmFuZAotICAgaXMgYWx3YXlzIG9uZSBieXRlIGludG8gdGhlIG9wY29kZS4gKi8KLQotI2RlZmluZSBtZF9wY3JlbF9mcm9tKEZJWFApIAkJCQkJCVwKLQkoKEZJWFApLT5meF93aGVyZSArIChGSVhQKS0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIDEpCi0KLQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcoRlJBRywgV0hFUkUsIE5CWVRFUywgRVhQKSBcCi0JcGpfY29uc19maXhfbmV3X3BqKEZSQUcsIFdIRVJFLCBOQllURVMsIEVYUCkKLQotLyogQWx3YXlzIGxlYXZlIHZ0YWJsZSByZWxvY3MgdW50b3VjaGVkIGluIHRoZSBvdXRwdXQuICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICAgICAgICAgICgoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCAgICAgICAgICAgCVwKLQkgICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKEZJWCkgCQkJCQlcCi0gICAgICAgICAgKCEgKChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUICAgICAgICAgCVwKLQkgICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpKQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1wcGMuYyBiL2dhcy9jb25maWcvdGMtcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NWE1MzUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMjYgKzAsMCBAQAotLyogdGMtcHBjLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBQb3dlclBDIG9yIFBPV0VSIChSUy82MDAwKQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvcHBjLmgiCi0KLSNpZmRlZiBPQkpfRUxGCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBhc3NlbWJsZXIgZm9yIHRoZSBQb3dlclBDIG9yIFBPV0VSIChSUy82MDAwKSBjaGlwcy4gICovCi0KLS8qIFRlbGwgdGhlIG1haW4gY29kZSB3aGF0IHRoZSBlbmRpYW5uZXNzIGlzLiAgKi8KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLS8qIFdoZXRoZXIgb3Igbm90LCB3ZSd2ZSBzZXQgdGFyZ2V0X2JpZ19lbmRpYW4uICAqLwotc3RhdGljIGludCBzZXRfdGFyZ2V0X2VuZGlhbiA9IDA7Ci0KLS8qIFdoZXRoZXIgdG8gdXNlIHVzZXIgZnJpZW5kbHkgcmVnaXN0ZXIgbmFtZXMuICAqLwotI2lmbmRlZiBUQVJHRVRfUkVHX05BTUVTX1AKLSNpZmRlZiBURV9QRQotI2RlZmluZSBUQVJHRVRfUkVHX05BTUVTX1AgdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgVEFSR0VUX1JFR19OQU1FU19QIGZhbHNlCi0jZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiByZWdfbmFtZXNfcCA9IFRBUkdFVF9SRUdfTkFNRVNfUDsKLQotc3RhdGljIGJvb2xlYW4gcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcGNfc2V0X2NwdSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwcGNfaW5zZXJ0X29wZXJhbmQKLSAgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnNuLCBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kLAotCSAgIG9mZnNldFQgdmFsLCBjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSkpOwotc3RhdGljIHZvaWQgcHBjX21hY3JvIFBBUkFNUyAoKGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvKSk7Ci1zdGF0aWMgdm9pZCBwcGNfYnl0ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgcHBjX2lzX3RvY19zeW0gUEFSQU1TICgoc3ltYm9sUyAqc3ltKSk7Ci1zdGF0aWMgdm9pZCBwcGNfdGMgUEFSQU1TICgoaW50KSk7Ci0KLSNpZmRlZiBPQkpfWENPRkYKLXN0YXRpYyB2b2lkIHBwY19jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2JiIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2JjIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2JmIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2JpZWkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWYgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZXMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfY3NlY3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfY2hhbmdlX2NzZWN0IFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgcHBjX2Z1bmN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2V4dGVybiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19sZ2xvYmwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19uYW1lZF9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3N0YWJ4IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3JlbmFtZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY190b2MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfeGNvZmZfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY192Ynl0ZSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBwcGNfZWxmX3N1ZmZpeCBQQVJBTVMgKChjaGFyICoqLCBleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX3JkYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl9sY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfdmFsaWRhdGVfZml4IFBBUkFNUyAoKGZpeFMgKiwgc2VnVCkpOwotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotc3RhdGljIHZvaWQgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotc3RhdGljIHZvaWQgcHBjX3ByZXZpb3VzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BkYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3lkYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3JlbGRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcmRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfdWFsb25nIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3pub3AgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGVfY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19wZV9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BlX2Z1bmN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BlX3RvY2QgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQwKLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbAotICAgdGFyZ2V0cy4gICovCi0KLSNpZmRlZiBPQkpfRUxGCi0vKiBUaGlzIHN0cmluZyBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwuICBUaGUgbWFjcm8KLSAgIHRjX2NvbW1lbnRfY2hhcnMgcG9pbnRzIHRvIHRoaXMuICBXZSB1c2UgdGhpcywgcmF0aGVyIHRoYW4gdGhlCi0gICB1c3VhbCBjb21tZW50X2NoYXJzLCBzbyB0aGF0IHdlIGNhbiBzd2l0Y2ggZm9yIFNvbGFyaXMgY29udmVudGlvbnMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgcHBjX3NvbGFyaXNfY29tbWVudF9jaGFyc1tdID0gIiMhIjsKLXN0YXRpYyBjb25zdCBjaGFyIHBwY19lYWJpX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotI2lmZGVmIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQKLWNvbnN0IGNoYXIgKnBwY19jb21tZW50X2NoYXJzID0gcHBjX3NvbGFyaXNfY29tbWVudF9jaGFyczsKLSNlbHNlCi1jb25zdCBjaGFyICpwcGNfY29tbWVudF9jaGFycyA9IHBwY19lYWJpX2NvbW1lbnRfY2hhcnM7Ci0jZW5kaWYKLSNlbHNlCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLSNlbmRpZgotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEKLSAgIHNpbmdsZSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQwKLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgLyogUHNldWRvLW9wcyB3aGljaCBtdXN0IGJlIG92ZXJyaWRkZW4uICAqLwotICB7ICJieXRlIiwJcHBjX2J5dGUsCTAgfSwKLQotI2lmZGVmIE9CSl9YQ09GRgotICAvKiBQc2V1ZG8tb3BzIHNwZWNpZmljIHRvIHRoZSBSUy82MDAwIFhDT0ZGIGZvcm1hdC4gIFNvbWUgb2YgdGhlc2UKLSAgICAgbGVnaXRpbWF0ZWx5IGJlbG9uZyBpbiB0aGUgb2JqLSouYyBmaWxlLiAgSG93ZXZlciwgWENPRkYgaXMgYmFzZWQKLSAgICAgb24gQ09GRiwgYW5kIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIHRoZSBSUy82MDAwLiAgV2UganVzdCB1c2UKLSAgICAgb2JqLWNvZmYuYywgYW5kIGFkZCB3aGF0IHdlIG5lZWQgaGVyZS4gICovCi0gIHsgImNvbW0iLAlwcGNfY29tbSwJMCB9LAotICB7ICJsY29tbSIsCXBwY19jb21tLAkxIH0sCi0gIHsgImJiIiwJcHBjX2JiLAkJMCB9LAotICB7ICJiYyIsCXBwY19iYywJCTAgfSwKLSAgeyAiYmYiLAlwcGNfYmYsCQkwIH0sCi0gIHsgImJpIiwJcHBjX2JpZWksCTAgfSwKLSAgeyAiYnMiLAlwcGNfYnMsCQkwIH0sCi0gIHsgImNzZWN0IiwJcHBjX2NzZWN0LAkwIH0sCi0gIHsgImRhdGEiLAlwcGNfc2VjdGlvbiwJJ2QnIH0sCi0gIHsgImViIiwJcHBjX2ViLAkJMCB9LAotICB7ICJlYyIsCXBwY19lYywJCTAgfSwKLSAgeyAiZWYiLAlwcGNfZWYsCQkwIH0sCi0gIHsgImVpIiwJcHBjX2JpZWksCTEgfSwKLSAgeyAiZXMiLAlwcGNfZXMsCQkwIH0sCi0gIHsgImV4dGVybiIsCXBwY19leHRlcm4sCTAgfSwKLSAgeyAiZnVuY3Rpb24iLAlwcGNfZnVuY3Rpb24sCTAgfSwKLSAgeyAibGdsb2JsIiwJcHBjX2xnbG9ibCwJMCB9LAotICB7ICJyZW5hbWUiLAlwcGNfcmVuYW1lLAkwIH0sCi0gIHsgInNlY3Rpb24iLAlwcGNfbmFtZWRfc2VjdGlvbiwgMCB9LAotICB7ICJzdGFieCIsCXBwY19zdGFieCwJMCB9LAotICB7ICJ0ZXh0IiwJcHBjX3NlY3Rpb24sCSd0JyB9LAotICB7ICJ0b2MiLAlwcGNfdG9jLAkwIH0sCi0gIHsgImxvbmciLAlwcGNfeGNvZmZfY29ucywJMiB9LAotICB7ICJ3b3JkIiwJcHBjX3hjb2ZmX2NvbnMsCTEgfSwKLSAgeyAic2hvcnQiLAlwcGNfeGNvZmZfY29ucywJMSB9LAotICB7ICJ2Ynl0ZSIsICAgIHBwY192Ynl0ZSwJMCB9LAotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0gIHsgImxvbmciLAlwcGNfZWxmX2NvbnMsCTQgfSwKLSAgeyAid29yZCIsCXBwY19lbGZfY29ucywJMiB9LAotICB7ICJzaG9ydCIsCXBwY19lbGZfY29ucywJMiB9LAotICB7ICJyZGF0YSIsCXBwY19lbGZfcmRhdGEsCTAgfSwKLSAgeyAicm9kYXRhIiwJcHBjX2VsZl9yZGF0YSwJMCB9LAotICB7ICJsY29tbSIsCXBwY19lbGZfbGNvbW0sCTAgfSwKLSNlbmRpZgotCi0jaWZkZWYgVEVfUEUKLSAgLyogUHNldWRvLW9wcyBzcGVjaWZpYyB0byB0aGUgV2luZG93cyBOVCBQb3dlclBDIFBFIChjb2ZmKSBmb3JtYXQgKi8KLSAgeyAicHJldmlvdXMiLCBwcGNfcHJldmlvdXMsICAgMCB9LAotICB7ICJwZGF0YSIsICAgIHBwY19wZGF0YSwgICAgICAwIH0sCi0gIHsgInlkYXRhIiwgICAgcHBjX3lkYXRhLCAgICAgIDAgfSwKLSAgeyAicmVsZGF0YSIsICBwcGNfcmVsZGF0YSwgICAgMCB9LAotICB7ICJyZGF0YSIsICAgIHBwY19yZGF0YSwgICAgICAwIH0sCi0gIHsgInVhbG9uZyIsICAgcHBjX3VhbG9uZywgICAgIDAgfSwKLSAgeyAiem5vcCIsICAgICBwcGNfem5vcCwgICAgICAgMCB9LAotICB7ICJjb21tIiwJcHBjX3BlX2NvbW0sCTAgfSwKLSAgeyAibGNvbW0iLAlwcGNfcGVfY29tbSwJMSB9LAotICB7ICJzZWN0aW9uIiwgIHBwY19wZV9zZWN0aW9uLCAwIH0sCi0gIHsgImZ1bmN0aW9uIiwJcHBjX3BlX2Z1bmN0aW9uLDAgfSwKLSAgeyAidG9jZCIsICAgICBwcGNfcGVfdG9jZCwgICAgMCB9LAotI2VuZGlmCi0KLSAgLyogVGhpcyBwc2V1ZG8tb3AgaXMgdXNlZCBldmVuIHdoZW4gbm90IGdlbmVyYXRpbmcgWENPRkYgb3V0cHV0LiAgKi8KLSAgeyAidGMiLAlwcGNfdGMsCQkwIH0sCi0KLSAgeyBOVUxMLAlOVUxMLAkJMCB9Ci19OwotCi0MCi0vKiBQcmVkZWZpbmVkIHJlZ2lzdGVyIG5hbWVzIGlmIC1tcmVnbmFtZXMgKG9yIGRlZmF1bHQgZm9yIFdpbmRvd3MgTlQpLiAgKi8KLS8qIEluIGdlbmVyYWwsIHRoZXJlIGFyZSBsb3RzIG9mIHRoZW0sIGluIGFuIGF0dGVtcHQgdG8gYmUgY29tcGF0aWJsZSAqLwotLyogd2l0aCBhIG51bWJlciBvZiBvdGhlciBXaW5kb3dzIE5UIGFzc2VtYmxlcnMuICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCBwZF9yZWcKLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IHZhbHVlOwotICB9OwotCi0vKiBMaXN0IG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBwcmUtZGVmaW5lZDoKLQotICAgRWFjaCBnZW5lcmFsIHJlZ2lzdGVyIGhhcyBwcmVkZWZpbmVkIG5hbWVzIG9mIHRoZSBmb3JtOgotICAgMS4gcjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLSAgIDIuIHIuPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotCi0KLSAgIEVhY2ggZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaGFzIHByZWRlZmluZWQgbmFtZXMgb2YgdGhlIGZvcm06Ci0gICAxLiBmPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotICAgMi4gZi48cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0KLSAgIEVhY2ggY29uZGl0aW9uIHJlZ2lzdGVyIGhhcyBwcmVkZWZpbmVkIG5hbWVzIG9mIHRoZSBmb3JtOgotICAgMS4gY3I8cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0gICAyLiBjci48cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0KLSAgIFRoZXJlIGFyZSBpbmRpdmlkdWFsIHJlZ2lzdGVycyBhcyB3ZWxsOgotICAgc3Agb3Igci5zcCAgICAgaGFzIHRoZSB2YWx1ZSAxCi0gICBydG9jIG9yIHIudG9jICBoYXMgdGhlIHZhbHVlIDIKLSAgIGZwc2NyICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMAotICAgeGVyICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAxCi0gICBsciAgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDgKLSAgIGN0ciAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgOQotICAgcG1yICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAwCi0gICBkYXIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDE5Ci0gICBkc2lzciAgICAgICAgICBoYXMgdGhlIHZhbHVlIDE4Ci0gICBkZWMgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDIyCi0gICBzZHIxICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDI1Ci0gICBzcnIwICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDI2Ci0gICBzcnIxICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDI3Ci0KLSAgIFRoZSB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImNyLjAiLCAwIH0sICAgIC8qIENvbmRpdGlvbiBSZWdpc3RlcnMgKi8KLSAgeyAiY3IuMSIsIDEgfSwKLSAgeyAiY3IuMiIsIDIgfSwKLSAgeyAiY3IuMyIsIDMgfSwKLSAgeyAiY3IuNCIsIDQgfSwKLSAgeyAiY3IuNSIsIDUgfSwKLSAgeyAiY3IuNiIsIDYgfSwKLSAgeyAiY3IuNyIsIDcgfSwKLQotICB7ICJjcjAiLCAwIH0sCi0gIHsgImNyMSIsIDEgfSwKLSAgeyAiY3IyIiwgMiB9LAotICB7ICJjcjMiLCAzIH0sCi0gIHsgImNyNCIsIDQgfSwKLSAgeyAiY3I1IiwgNSB9LAotICB7ICJjcjYiLCA2IH0sCi0gIHsgImNyNyIsIDcgfSwKLQotICB7ICJjdHIiLCA5IH0sCi0KLSAgeyAiZGFyIiwgMTkgfSwgICAgLyogRGF0YSBBY2Nlc3MgUmVnaXN0ZXIgKi8KLSAgeyAiZGVjIiwgMjIgfSwgICAgLyogRGVjcmVtZW50ZXIgKi8KLSAgeyAiZHNpc3IiLCAxOCB9LCAgLyogRGF0YSBTdG9yYWdlIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLQotICB7ICJmLjAiLCAwIH0sICAgICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KLSAgeyAiZi4xIiwgMSB9LCAKLSAgeyAiZi4xMCIsIDEwIH0sIAotICB7ICJmLjExIiwgMTEgfSwgCi0gIHsgImYuMTIiLCAxMiB9LCAKLSAgeyAiZi4xMyIsIDEzIH0sIAotICB7ICJmLjE0IiwgMTQgfSwgCi0gIHsgImYuMTUiLCAxNSB9LCAKLSAgeyAiZi4xNiIsIDE2IH0sIAotICB7ICJmLjE3IiwgMTcgfSwgCi0gIHsgImYuMTgiLCAxOCB9LCAKLSAgeyAiZi4xOSIsIDE5IH0sIAotICB7ICJmLjIiLCAyIH0sIAotICB7ICJmLjIwIiwgMjAgfSwgCi0gIHsgImYuMjEiLCAyMSB9LCAKLSAgeyAiZi4yMiIsIDIyIH0sIAotICB7ICJmLjIzIiwgMjMgfSwgCi0gIHsgImYuMjQiLCAyNCB9LCAKLSAgeyAiZi4yNSIsIDI1IH0sIAotICB7ICJmLjI2IiwgMjYgfSwgCi0gIHsgImYuMjciLCAyNyB9LCAKLSAgeyAiZi4yOCIsIDI4IH0sIAotICB7ICJmLjI5IiwgMjkgfSwgCi0gIHsgImYuMyIsIDMgfSwgCi0gIHsgImYuMzAiLCAzMCB9LAotICB7ICJmLjMxIiwgMzEgfSwKLSAgeyAiZi40IiwgNCB9LCAKLSAgeyAiZi41IiwgNSB9LCAKLSAgeyAiZi42IiwgNiB9LCAKLSAgeyAiZi43IiwgNyB9LCAKLSAgeyAiZi44IiwgOCB9LCAKLSAgeyAiZi45IiwgOSB9LCAKLQotICB7ICJmMCIsIDAgfSwgCi0gIHsgImYxIiwgMSB9LCAKLSAgeyAiZjEwIiwgMTAgfSwgCi0gIHsgImYxMSIsIDExIH0sIAotICB7ICJmMTIiLCAxMiB9LCAKLSAgeyAiZjEzIiwgMTMgfSwgCi0gIHsgImYxNCIsIDE0IH0sIAotICB7ICJmMTUiLCAxNSB9LCAKLSAgeyAiZjE2IiwgMTYgfSwgCi0gIHsgImYxNyIsIDE3IH0sIAotICB7ICJmMTgiLCAxOCB9LCAKLSAgeyAiZjE5IiwgMTkgfSwgCi0gIHsgImYyIiwgMiB9LCAKLSAgeyAiZjIwIiwgMjAgfSwgCi0gIHsgImYyMSIsIDIxIH0sIAotICB7ICJmMjIiLCAyMiB9LCAKLSAgeyAiZjIzIiwgMjMgfSwgCi0gIHsgImYyNCIsIDI0IH0sIAotICB7ICJmMjUiLCAyNSB9LCAKLSAgeyAiZjI2IiwgMjYgfSwgCi0gIHsgImYyNyIsIDI3IH0sIAotICB7ICJmMjgiLCAyOCB9LCAKLSAgeyAiZjI5IiwgMjkgfSwgCi0gIHsgImYzIiwgMyB9LCAKLSAgeyAiZjMwIiwgMzAgfSwKLSAgeyAiZjMxIiwgMzEgfSwKLSAgeyAiZjQiLCA0IH0sIAotICB7ICJmNSIsIDUgfSwgCi0gIHsgImY2IiwgNiB9LCAKLSAgeyAiZjciLCA3IH0sIAotICB7ICJmOCIsIDggfSwgCi0gIHsgImY5IiwgOSB9LCAKLQotICB7ICJmcHNjciIsIDAgfSwKLQotICB7ICJsciIsIDggfSwgICAgIC8qIExpbmsgUmVnaXN0ZXIgKi8KLQotICB7ICJwbXIiLCAwIH0sCi0KLSAgeyAici4wIiwgMCB9LCAgICAvKiBHZW5lcmFsIFB1cnBvc2UgUmVnaXN0ZXJzICovCi0gIHsgInIuMSIsIDEgfSwKLSAgeyAici4xMCIsIDEwIH0sCi0gIHsgInIuMTEiLCAxMSB9LAotICB7ICJyLjEyIiwgMTIgfSwKLSAgeyAici4xMyIsIDEzIH0sCi0gIHsgInIuMTQiLCAxNCB9LAotICB7ICJyLjE1IiwgMTUgfSwKLSAgeyAici4xNiIsIDE2IH0sCi0gIHsgInIuMTciLCAxNyB9LAotICB7ICJyLjE4IiwgMTggfSwKLSAgeyAici4xOSIsIDE5IH0sCi0gIHsgInIuMiIsIDIgfSwKLSAgeyAici4yMCIsIDIwIH0sCi0gIHsgInIuMjEiLCAyMSB9LAotICB7ICJyLjIyIiwgMjIgfSwKLSAgeyAici4yMyIsIDIzIH0sCi0gIHsgInIuMjQiLCAyNCB9LAotICB7ICJyLjI1IiwgMjUgfSwKLSAgeyAici4yNiIsIDI2IH0sCi0gIHsgInIuMjciLCAyNyB9LAotICB7ICJyLjI4IiwgMjggfSwKLSAgeyAici4yOSIsIDI5IH0sCi0gIHsgInIuMyIsIDMgfSwKLSAgeyAici4zMCIsIDMwIH0sCi0gIHsgInIuMzEiLCAzMSB9LAotICB7ICJyLjQiLCA0IH0sCi0gIHsgInIuNSIsIDUgfSwKLSAgeyAici42IiwgNiB9LAotICB7ICJyLjciLCA3IH0sCi0gIHsgInIuOCIsIDggfSwKLSAgeyAici45IiwgOSB9LAotCi0gIHsgInIuc3AiLCAxIH0sICAgLyogU3RhY2sgUG9pbnRlciAqLwotCi0gIHsgInIudG9jIiwgMiB9LCAgLyogUG9pbnRlciB0byB0aGUgdGFibGUgb2YgY29udGVudHMgKi8KLQotICB7ICJyMCIsIDAgfSwgICAgIC8qIE1vcmUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwotICB7ICJyMSIsIDEgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAicjE2IiwgMTYgfSwKLSAgeyAicjE3IiwgMTcgfSwKLSAgeyAicjE4IiwgMTggfSwKLSAgeyAicjE5IiwgMTkgfSwKLSAgeyAicjIiLCAyIH0sCi0gIHsgInIyMCIsIDIwIH0sCi0gIHsgInIyMSIsIDIxIH0sCi0gIHsgInIyMiIsIDIyIH0sCi0gIHsgInIyMyIsIDIzIH0sCi0gIHsgInIyNCIsIDI0IH0sCi0gIHsgInIyNSIsIDI1IH0sCi0gIHsgInIyNiIsIDI2IH0sCi0gIHsgInIyNyIsIDI3IH0sCi0gIHsgInIyOCIsIDI4IH0sCi0gIHsgInIyOSIsIDI5IH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyMzAiLCAzMCB9LAotICB7ICJyMzEiLCAzMSB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotCi0gIHsgInJ0b2MiLCAyIH0sICAvKiBUYWJsZSBvZiBjb250ZW50cyAqLwotCi0gIHsgInNkcjEiLCAyNSB9LCAvKiBTdG9yYWdlIERlc2NyaXB0aW9uIFJlZ2lzdGVyIDEgKi8KLQotICB7ICJzcCIsIDEgfSwKLQotICB7ICJzcnIwIiwgMjYgfSwgLyogTWFjaGluZSBTdGF0dXMgU2F2ZS9SZXN0b3JlIFJlZ2lzdGVyIDAgKi8KLSAgeyAic3JyMSIsIDI3IH0sIC8qIE1hY2hpbmUgU3RhdHVzIFNhdmUvUmVzdG9yZSBSZWdpc3RlciAxICovCi0KLSAgeyAieGVyIiwgMSB9LAotCi19OwotCi0jZGVmaW5lIFJFR19OQU1FX0NOVAkoc2l6ZW9mKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHBkX3JlZykpCi0KLS8qIEdpdmVuIE5BTUUsIGZpbmQgdGhlIHJlZ2lzdGVyIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhhdCBuYW1lLCByZXR1cm4KLSAgIHRoZSBpbnRlZ2VyIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciAtMSBvbiBmYWlsdXJlLiAgKi8KLQotc3RhdGljIGludCByZWdfbmFtZV9zZWFyY2gKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHBkX3JlZyAqLCBpbnQsIGNvbnN0IGNoYXIgKiBuYW1lKSk7Ci0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAocmVncywgcmVnY291bnQsIG5hbWUpCi0gICAgIGNvbnN0IHN0cnVjdCBwZF9yZWcgKnJlZ3M7Ci0gICAgIGludCByZWdjb3VudDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdjb3VudCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcmVnc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHJlZ3NbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0vKgotICogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46CUlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6CUEgZXhwcmVzc2lvblMuCi0gKiAgICAgIFRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKiAgICAgIFhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4gaXRzCi0gKiAgICAgIG9yaWdpbmFsIHN0YXRlLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmIChuYW1lWzBdID09ICclJyAmJiBpc2FscGhhIChuYW1lWzFdKSkKLSAgICBuYW1lID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgZWxzZSBpZiAoIXJlZ19uYW1lc19wIHx8ICFpc2FscGhhIChuYW1lWzBdKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMsIFJFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0gICAgICAKLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggc3ltYm9sIHNlZW4gaW4gYW4gZXhwcmVzc2lvbi4gIEl0Ci0gICBoYW5kbGVzIHRoZSBzcGVjaWFsIHBhcnNpbmcgd2hpY2ggUG93ZXJQQyBhc3NlbWJsZXJzIGFyZSBzdXBwb3NlZAotICAgdG8gdXNlIGZvciBjb25kaXRpb24gY29kZXMuICAqLwotCi0vKiBXaGV0aGVyIHRvIGRvIHRoZSBzcGVjaWFsIHBhcnNpbmcuICAqLwotc3RhdGljIGJvb2xlYW4gY3Jfb3BlcmFuZDsKLQotLyogTmFtZXMgdG8gcmVjb2duaXplIGluIGEgY29uZGl0aW9uIGNvZGUuICBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBkX3JlZyBjcl9uYW1lc1tdID0KLXsKLSAgeyAiY3IwIiwgMCB9LAotICB7ICJjcjEiLCAxIH0sCi0gIHsgImNyMiIsIDIgfSwKLSAgeyAiY3IzIiwgMyB9LAotICB7ICJjcjQiLCA0IH0sCi0gIHsgImNyNSIsIDUgfSwKLSAgeyAiY3I2IiwgNiB9LAotICB7ICJjcjciLCA3IH0sCi0gIHsgImVxIiwgMiB9LAotICB7ICJndCIsIDEgfSwKLSAgeyAibHQiLCAwIH0sCi0gIHsgInNvIiwgMyB9LAotICB7ICJ1biIsIDMgfQotfTsKLQotLyogUGFyc2luZyBmdW5jdGlvbi4gIFRoaXMgcmV0dXJucyBub24temVybyBpZiBpdCByZWNvZ25pemVkIGFuCi0gICBleHByZXNzaW9uLiAgKi8KLQotaW50Ci1wcGNfcGFyc2VfbmFtZSAobmFtZSwgZXhwcikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cHI7Ci17Ci0gIGludCB2YWw7Ci0KLSAgaWYgKCEgY3Jfb3BlcmFuZCkKLSAgICByZXR1cm4gMDsKLQotICB2YWwgPSByZWdfbmFtZV9zZWFyY2ggKGNyX25hbWVzLCBzaXplb2YgY3JfbmFtZXMgLyBzaXplb2YgY3JfbmFtZXNbMF0sCi0JCQkgbmFtZSk7Ci0gIGlmICh2YWwgPCAwKQotICAgIHJldHVybiAwOwotCi0gIGV4cHItPlhfb3AgPSBPX2NvbnN0YW50OwotICBleHByLT5YX2FkZF9udW1iZXIgPSB2YWw7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0MCi0vKiBMb2NhbCB2YXJpYWJsZXMuICAqLwotCi0vKiBUaGUgdHlwZSBvZiBwcm9jZXNzb3Igd2UgYXJlIGFzc2VtYmxpbmcgZm9yLiAgVGhpcyBpcyBvbmUgb3IgbW9yZQotICAgb2YgdGhlIFBQQ19PUENPREUgZmxhZ3MgZGVmaW5lZCBpbiBvcGNvZGUvcHBjLmguICAqLwotc3RhdGljIGludCBwcGNfY3B1ID0gMDsKLQotLyogVGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvciB3ZSBhcmUgYXNzZW1ibGluZyBmb3IuICBUaGlzIGlzIGVpdGhlcgotICAgUFBDX09QQ09ERV8zMiBvciBQUENfT1BDT0RFXzY0LiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBwY19zaXplID0gUFBDX09QQ09ERV8zMjsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnBwY19oYXNoOwotCi0vKiBNYWNybyBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwcGNfbWFjcm9faGFzaDsKLQotI2lmZGVmIE9CSl9FTEYKLS8qIFdoYXQgdHlwZSBvZiBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIHVzZSAqLwotc3RhdGljIGVudW0geyBTSExJQl9OT05FLCBTSExJQl9QSUMsIFNISUxCX01SRUxPQ0FUQUJMRSB9IHNobGliID0gU0hMSUJfTk9ORTsKLQotLyogRmxhZ3MgdG8gc2V0IGluIHRoZSBlbGYgaGVhZGVyICovCi1zdGF0aWMgZmxhZ3dvcmQgcHBjX2ZsYWdzID0gMDsKLQotLyogV2hldGhlciB0aGlzIGlzIFNvbGFyaXMgb3Igbm90LiAgKi8KLSNpZmRlZiBUQVJHRVRfU09MQVJJU19DT01NRU5UCi0jZGVmaW5lIFNPTEFSSVNfUCB0cnVlCi0jZWxzZQotI2RlZmluZSBTT0xBUklTX1AgZmFsc2UKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBtc29sYXJpcyA9IFNPTEFSSVNfUDsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX1hDT0ZGCi0KLS8qIFRoZSBSUy82MDAwIGFzc2VtYmxlciB1c2VzIHRoZSAuY3NlY3QgcHNldWRvLW9wIHRvIGdlbmVyYXRlIGNvZGUKLSAgIHVzaW5nIGEgYnVuY2ggb2YgZGlmZmVyZW50IHNlY3Rpb25zLiAgVGhlc2UgYXNzZW1ibGVyIHNlY3Rpb25zLAotICAgaG93ZXZlciwgYXJlIGFsbCBlbmNvbXBhc3NlZCB3aXRoaW4gdGhlIC50ZXh0IG9yIC5kYXRhIHNlY3Rpb25zIG9mCi0gICB0aGUgZmluYWwgb3V0cHV0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBieSB1c2luZyBkaWZmZXJlbnQKLSAgIHN1YnNlZ21lbnRzIHdpdGhpbiB0aGVzZSBtYWluIHNlZ21lbnRzLiAgKi8KLQotLyogTmV4dCBzdWJzZWdtZW50IHRvIGFsbG9jYXRlIHdpdGhpbiB0aGUgLnRleHQgc2VnbWVudC4gICovCi1zdGF0aWMgc3Vic2VnVCBwcGNfdGV4dF9zdWJzZWdtZW50ID0gMjsKLQotLyogTGlua2VkIGxpc3Qgb2YgY3NlY3RzIGluIHRoZSB0ZXh0IHNlY3Rpb24uICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY190ZXh0X2NzZWN0czsKLQotLyogTmV4dCBzdWJzZWdtZW50IHRvIGFsbG9jYXRlIHdpdGhpbiB0aGUgLmRhdGEgc2VnbWVudC4gICovCi1zdGF0aWMgc3Vic2VnVCBwcGNfZGF0YV9zdWJzZWdtZW50ID0gMjsKLQotLyogTGlua2VkIGxpc3Qgb2YgY3NlY3RzIGluIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY19kYXRhX2NzZWN0czsKLQotLyogVGhlIGN1cnJlbnQgY3NlY3QuICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY19jdXJyZW50X2NzZWN0OwotCi0vKiBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgdXNlcyBhIFRPQyB3aGljaCBob2xkcyBhZGRyZXNzZXMgb2YgZnVuY3Rpb25zCi0gICBhbmQgdmFyaWFibGVzLiAgU3ltYm9scyBhcmUgcHV0IGluIHRoZSBUT0Mgd2l0aCB0aGUgLnRjIHBzZXVkby1vcC4KLSAgIEEgc3BlY2lhbCByZWxvY2F0aW9uIGlzIHVzZWQgd2hlbiBhY2Nlc3NpbmcgVE9DIGVudHJpZXMuICBXZSBoYW5kbGUKLSAgIHRoZSBUT0MgYXMgYSBzdWJzZWdtZW50IHdpdGhpbiB0aGUgLmRhdGEgc2VnbWVudC4gIFdlIHNldCBpdCB1cCBpZgotICAgd2Ugc2VlIGEgLnRvYyBwc2V1ZG8tb3AsIGFuZCBzYXZlIHRoZSBjc2VjdCBzeW1ib2wgaGVyZS4gICovCi1zdGF0aWMgc3ltYm9sUyAqcHBjX3RvY19jc2VjdDsKLQotLyogVGhlIGZpcnN0IGZyYWcgaW4gdGhlIFRPQyBzdWJzZWdtZW50LiAgKi8KLXN0YXRpYyBmcmFnUyAqcHBjX3RvY19mcmFnOwotCi0vKiBUaGUgZmlyc3QgZnJhZyBpbiB0aGUgZmlyc3Qgc3Vic2VnbWVudCBhZnRlciB0aGUgVE9DIGluIHRoZSAuZGF0YQotICAgc2VnbWVudC4gIE5VTEwgaWYgdGhlcmUgYXJlIG5vIHN1YnNlZ21lbnRzIGFmdGVyIHRoZSBUT0MuICAqLwotc3RhdGljIGZyYWdTICpwcGNfYWZ0ZXJfdG9jX2ZyYWc7Ci0KLS8qIFRoZSBjdXJyZW50IHN0YXRpYyBibG9jay4gICovCi1zdGF0aWMgc3ltYm9sUyAqcHBjX2N1cnJlbnRfYmxvY2s7Ci0KLS8qIFRoZSBDT0ZGIGRlYnVnZ2luZyBzZWN0aW9uOyBzZXQgYnkgbWRfYmVnaW4uICBUaGlzIGlzIG5vdCB0aGUKLSAgIC5kZWJ1ZyBzZWN0aW9uLCBidXQgaXMgaW5zdGVhZCB0aGUgc2VjcmV0IEJGRCBzZWN0aW9uIHdoaWNoIHdpbGwKLSAgIGNhdXNlIEJGRCB0byBzZXQgdGhlIHNlY3Rpb24gbnVtYmVyIG9mIGEgc3ltYm9sIHRvIE5fREVCVUcuICAqLwotc3RhdGljIGFzZWN0aW9uICpwcGNfY29mZl9kZWJ1Z19zZWN0aW9uOwotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0KLSNpZmRlZiBURV9QRQotCi0vKiBWYXJpb3VzIHNlY3Rpb25zIHRoYXQgd2UgbmVlZCBmb3IgUEUgY29mZiBzdXBwb3J0LiAgKi8KLXN0YXRpYyBzZWdUIHlkYXRhX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBwZGF0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgcmVsZGF0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgcmRhdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHRvY2RhdGFfc2VjdGlvbjsKLQotLyogVGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgdGhlIHByZXZpb3VzIHNlY3Rpb24uIFNlZSBwcGNfcHJldmlvdXMuICovCi1zdGF0aWMgc2VnVCBwcGNfcHJldmlvdXNfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHBwY19jdXJyZW50X3NlY3Rpb247Ci0KLSNlbmRpZiAvKiBURV9QRSAqLwotCi0jaWZkZWYgT0JKX0VMRgotc3ltYm9sUyAqR09UX3N5bWJvbDsJCS8qIFByZS1kZWZpbmVkICJfR0xPQkFMX09GRlNFVF9UQUJMRSIgKi8KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0MCi0jaWZkZWYgT0JKX0VMRgotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImI6bDp1c206SzpWUToiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJ1bToiOwotI2VuZGlmCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAndSc6Ci0gICAgICAvKiAtdSBtZWFucyB0aGF0IGFueSB1bmRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgdHJlYXRlZCBhcwotCSBleHRlcm5hbCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIGdhcyBhbnlob3cuICAqLwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSAnbCc6Ci0gICAgICAvKiBTb2xhcmlzIGFzIHRha2VzIC1sZSAocHJlc3VtYWJseSBmb3IgbGl0dGxlIGVuZGlhbikuICBGb3IgY29tcGxldGVuZXNzCi0gICAgICAgICBzYWtlLCByZWNvZ25pemUgLWJlIGFsc28uICAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiZSIpID09IDApCi0JewotCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzoKLSAgICAgIGlmIChzdHJjbXAgKGFyZywgImUiKSA9PSAwKQotCXsKLQkgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLQkgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSyc6Ci0gICAgICAvKiBSZWNvZ25pemUgLUsgUElDICovCi0gICAgICBpZiAoc3RyY21wIChhcmcsICJQSUMiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAicGljIikgPT0gMCkKLQl7Ci0JICBzaGxpYiA9IFNITElCX1BJQzsKLQkgIHBwY19mbGFncyB8PSBFRl9QUENfUkVMT0NBVEFCTEVfTElCOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgJ20nOgotICAgICAgLyogLW1wd3J4IGFuZCAtbXB3cjIgbWVhbiB0byBhc3NlbWJsZSBmb3IgdGhlIElCTSBQT1dFUi8yCi0gICAgICAgICAoUklPUzIpLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGFyZywgInB3cngiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAicHdyMiIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMjsKLSAgICAgIC8qIC1tcHdyIG1lYW5zIHRvIGFzc2VtYmxlIGZvciB0aGUgSUJNIFBPV0VSIChSSU9TMSkuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwd3IiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSOwotICAgICAgLyogLW02MDEgbWVhbnMgdG8gYXNzZW1ibGUgZm9yIHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMSwgd2hpY2ggaW5jbHVkZXMKLSAgICAgICAgIGluc3RydWN0aW9ucyB0aGF0IGFyZSBob2xkb3ZlcnMgZnJvbSB0aGUgUG93ZXIuICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIjYwMSIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDE7Ci0gICAgICAvKiAtbXBwYywgLW1wcGMzMiwgLW02MDMsIGFuZCAtbTYwNCBtZWFuIHRvIGFzc2VtYmxlIGZvciB0aGUKLSAgICAgICAgIE1vdG9yb2xhIFBvd2VyUEMgNjAzLzYwNC4gICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInBwYyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChhcmcsICJwcGMzMiIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChhcmcsICI0MDMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAiNjAzIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjYwNCIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDOwotICAgICAgLyogLW1wcGM2NCBhbmQgLW02MjAgbWVhbiB0byBhc3NlbWJsZSBmb3IgdGhlIDY0LWJpdCBQb3dlclBDCi0gICAgICAgICA2MjAuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwcGM2NCIpID09IDAgfHwgc3RyY21wIChhcmcsICI2MjAiKSA9PSAwKQotCXsKLQkgIHBwY19jcHUgPSBQUENfT1BDT0RFX1BQQzsKLQkgIHBwY19zaXplID0gUFBDX09QQ09ERV82NDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInBwYzY0YnJpZGdlIikgPT0gMCkKLQl7Ci0JICBwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzY0X0JSSURHRTsKLQkgIHBwY19zaXplID0gUFBDX09QQ09ERV82NDsKLQl9Ci0gICAgICAvKiAtbWNvbSBtZWFucyBhc3NlbWJsZSBmb3IgdGhlIGNvbW1vbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiBQb3dlcgotCSBhbmQgUG93ZXJQQy4gIEF0IHByZXNlbnQsIHdlIGp1c3QgYWxsb3cgdGhlIHVuaW9uLCByYXRoZXIKLQkgdGhhbiB0aGUgaW50ZXJzZWN0aW9uLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiY29tIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9DT01NT047Ci0gICAgICAvKiAtbWFueSBtZWFucyB0byBhc3NlbWJsZSBmb3IgYW55IGFyY2hpdGVjdHVyZSAoUFdSL1BXUlgvUFBDKS4gICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImFueSIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfQU5ZOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlZ25hbWVzIikgPT0gMCkKLQlyZWdfbmFtZXNfcCA9IHRydWU7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8tcmVnbmFtZXMiKSA9PSAwKQotCXJlZ19uYW1lc19wID0gZmFsc2U7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICAvKiAtbXJlbG9jYXRhYmxlLy1tcmVsb2NhdGFibGUtbGliIC0tIHdhcm4gYWJvdXQgaW5pdGlhbGl6YXRpb25zIHRoYXQgcmVxdWlyZSByZWxvY2F0aW9uICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlbG9jYXRhYmxlIikgPT0gMCkKLQl7Ci0JICBzaGxpYiA9IFNISUxCX01SRUxPQ0FUQUJMRTsKLQkgIHBwY19mbGFncyB8PSBFRl9QUENfUkVMT0NBVEFCTEU7Ci0JfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlbG9jYXRhYmxlLWxpYiIpID09IDApCi0JewotCSAgc2hsaWIgPSBTSElMQl9NUkVMT0NBVEFCTEU7Ci0JICBwcGNfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFX0xJQjsKLQl9Ci0KLSAgICAgIC8qIC1tZW1iLCBzZXQgZW1iZWRkZWQgYml0ICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImVtYiIpID09IDApCi0JcHBjX2ZsYWdzIHw9IEVGX1BQQ19FTUI7Ci0KLSAgICAgIC8qIC1tbGl0dGxlLy1tYmlnIHNldCB0aGUgZW5kaWFuZXNzICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImxpdHRsZSIpID09IDAgfHwgc3RyY21wIChhcmcsICJsaXR0bGUtZW5kaWFuIikgPT0gMCkKLQl7Ci0JICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0JICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7Ci0JfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImJpZyIpID09IDAgfHwgc3RyY21wIChhcmcsICJiaWctZW5kaWFuIikgPT0gMCkKLQl7Ci0JICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0JICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7Ci0JfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInNvbGFyaXMiKSA9PSAwKQotCXsKLQkgIG1zb2xhcmlzID0gdHJ1ZTsKLQkgIHBwY19jb21tZW50X2NoYXJzID0gcHBjX3NvbGFyaXNfY29tbWVudF9jaGFyczsKLQl9Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8tc29sYXJpcyIpID09IDApCi0JewotCSAgbXNvbGFyaXMgPSBmYWxzZTsKLQkgIHBwY19jb21tZW50X2NoYXJzID0gcHBjX2VhYmlfY29tbWVudF9jaGFyczsKLQl9Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgc3dpdGNoIC1tJXMiKSwgYXJnKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogLVY6IFNWUjQgYXJndW1lbnQgdG8gcHJpbnQgdmVyc2lvbiBJRC4gICovCi0gICAgY2FzZSAnVic6Ci0gICAgICBwcmludF92ZXJzaW9uX2lkICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1ReSwgLVFuOiBTVlI0IGFyZ3VtZW50cyBjb250cm9sbGluZyB3aGV0aGVyIGEgLmNvbW1lbnQgc2VjdGlvbgotCSBzaG91bGQgYmUgZW1pdHRlZCBvciBub3QuICBGSVhNRTogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgICBjYXNlICdRJzoKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBTb2xhcmlzIHRha2VzIC1zIHRvIHNwZWNpZnkgdGhhdCAuc3RhYnMgZ28gaW4gYSAuc3RhYnMgc2VjdGlvbiwKLQkgcmF0aGVyIHRoYW4gLnN0YWJzLmV4Y2wsIHdoaWNoIGlzIGlnbm9yZWQgYnkgdGhlIGxpbmtlci4KLQkgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAncyc6Ci0gICAgICBpZiAoYXJnKQotCXJldHVybiAwOwotCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1Qb3dlclBDIG9wdGlvbnM6XG5cCi0tdQkJCWlnbm9yZWRcblwKLS1tcHdyeCwgLW1wd3IyCQlnZW5lcmF0ZSBjb2RlIGZvciBJQk0gUE9XRVIvMiAoUklPUzIpXG5cCi0tbXB3cgkJCWdlbmVyYXRlIGNvZGUgZm9yIElCTSBQT1dFUiAoUklPUzEpXG5cCi0tbTYwMQkJCWdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjAxXG5cCi0tbXBwYywgLW1wcGMzMiwgLW00MDMsIC1tNjAzLCAtbTYwNFxuXAotCQkJZ2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MDMvNjA0XG5cCi0tbXBwYzY0LCAtbTYyMAkJZ2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MjBcblwKLS1tcHBjNjRicmlkZ2UJCWdlbmVyYXRlIGNvZGUgZm9yIFBvd2VyUEMgNjQsIGluY2x1ZGluZyBicmlkZ2UgaW5zbnNcblwKLS1tY29tCQkJZ2VuZXJhdGUgY29kZSBQb3dlci9Qb3dlclBDIGNvbW1vbiBpbnN0cnVjdGlvbnNcblwKLS1tYW55CQkJZ2VuZXJhdGUgY29kZSBmb3IgYW55IGFyY2hpdGVjdHVyZSAoUFdSL1BXUlgvUFBDKVxuXAotLW1yZWduYW1lcwkJQWxsb3cgc3ltYm9saWMgbmFtZXMgZm9yIHJlZ2lzdGVyc1xuXAotLW1uby1yZWduYW1lcwkJRG8gbm90IGFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcbiIpKTsKLSNpZmRlZiBPQkpfRUxGCi0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tbXJlbG9jYXRhYmxlCQlzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUgb3B0aW9uXG5cCi0tbXJlbG9jYXRhYmxlLWxpYglzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUtbGliIG9wdGlvblxuXAotLW1lbWIJCQlzZXQgUFBDX0VNQiBiaXQgaW4gRUxGIGZsYWdzXG5cCi0tbWxpdHRsZSwgLW1saXR0bGUtZW5kaWFuXG5cCi0JCQlnZW5lcmF0ZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZVxuXAotLW1iaWcsIC1tYmlnLWVuZGlhbglnZW5lcmF0ZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZVxuXAotLW1zb2xhcmlzCQlnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG5cCi0tbW5vLXNvbGFyaXMJCWRvIG5vdCBnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG5cCi0tVgkJCXByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlclxuXAotLVF5LCAtUW4JCWlnbm9yZWRcbiIpKTsKLSNlbmRpZgotfQotDAotLyogU2V0IHBwY19jcHUgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19zZXRfY3B1ICgpCi17Ci0gIGNvbnN0IGNoYXIgKmRlZmF1bHRfb3MgID0gVEFSR0VUX09TOwotICBjb25zdCBjaGFyICpkZWZhdWx0X2NwdSA9IFRBUkdFVF9DUFU7Ci0KLSAgaWYgKHBwY19jcHUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAoZGVmYXVsdF9vcywgImFpeCIsIDMpID09IDAKLQkgICYmIGRlZmF1bHRfb3NbM10gPj0gJzQnICYmIGRlZmF1bHRfb3NbM10gPD0gJzknKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX0NPTU1PTjsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGRlZmF1bHRfb3MsICJhaXgzIiwgNCkgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJyczYwMDAiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjbGUiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BQQzsKLSAgICAgIGVsc2UKLQlhc19mYXRhbCAoXygiVW5rbm93biBkZWZhdWx0IGNwdSA9ICVzLCBvcyA9ICVzIiksIGRlZmF1bHRfY3B1LCBkZWZhdWx0X29zKTsKLSAgICB9Ci19Ci0KLS8qIEZpZ3VyZSBvdXQgdGhlIEJGRCBhcmNoaXRlY3R1cmUgdG8gdXNlLiAgKi8KLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi1wcGNfYXJjaCAoKQotewotICBjb25zdCBjaGFyICpkZWZhdWx0X2NwdSA9IFRBUkdFVF9DUFU7Ci0gIHBwY19zZXRfY3B1ICgpOwotCi0gIGlmICgocHBjX2NwdSAmIFBQQ19PUENPREVfUFBDKSAhPSAwKQotICAgIHJldHVybiBiZmRfYXJjaF9wb3dlcnBjOwotICBlbHNlIGlmICgocHBjX2NwdSAmIFBQQ19PUENPREVfUE9XRVIpICE9IDApCi0gICAgcmV0dXJuIGJmZF9hcmNoX3JzNjAwMDsKLSAgZWxzZSBpZiAoKHBwY19jcHUgJiAoUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWSkpICE9IDApCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJyczYwMDAiKSA9PSAwKQotCXJldHVybiBiZmRfYXJjaF9yczYwMDA7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicG93ZXJwYyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGNsZSIpID09IDApCi0JcmV0dXJuIGJmZF9hcmNoX3Bvd2VycGM7Ci0gICAgfQotCi0gIGFzX2ZhdGFsIChfKCJOZWl0aGVyIFBvd2VyIG5vciBQb3dlclBDIG9wY29kZXMgd2VyZSBzZWxlY3RlZC4iKSk7Ci0gIHJldHVybiBiZmRfYXJjaF91bmtub3duOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzIHVwLiAgSXQgaXMgY2FsbGVkCi0gICBhZnRlciB0aGUgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkIGFuZCB0aGUgb3V0cHV0IGZpbGUgaGFzIGJlZW4KLSAgIG9wZW5lZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3A7Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3BfZW5kOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm87Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNyb19lbmQ7Ci0gIGJvb2xlYW4gZHVwX2luc24gPSBmYWxzZTsKLQotICBwcGNfc2V0X2NwdSAoKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogU2V0IHRoZSBFTEYgZmxhZ3MgaWYgZGVzaXJlZC4gKi8KLSAgaWYgKHBwY19mbGFncyAmJiAhbXNvbGFyaXMpCi0gICAgYmZkX3NldF9wcml2YXRlX2ZsYWdzIChzdGRvdXRwdXQsIHBwY19mbGFncyk7Ci0jZW5kaWYKLQotICAvKiBJbnNlcnQgdGhlIG9wY29kZXMgaW50byBhIGhhc2ggdGFibGUuICAqLwotICBwcGNfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIG9wX2VuZCA9IHBvd2VycGNfb3Bjb2RlcyArIHBvd2VycGNfbnVtX29wY29kZXM7Ci0gIGZvciAob3AgPSBwb3dlcnBjX29wY29kZXM7IG9wIDwgb3BfZW5kOyBvcCsrKQotICAgIHsKLSAgICAgIGtub3cgKChvcC0+b3Bjb2RlICYgb3AtPm1hc2spID09IG9wLT5vcGNvZGUpOwotCi0gICAgICBpZiAoKG9wLT5mbGFncyAmIHBwY19jcHUpICE9IDAKLQkgICYmICgob3AtPmZsYWdzICYgKFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFXzY0KSkgPT0gMAotCSAgICAgIHx8IChvcC0+ZmxhZ3MgJiAoUFBDX09QQ09ERV8zMiB8IFBQQ19PUENPREVfNjQpKSA9PSBwcGNfc2l6ZQotCSAgICAgIHx8IChwcGNfY3B1ICYgUFBDX09QQ09ERV82NF9CUklER0UpICE9IDApKQotCXsKLQkgIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotCSAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKHBwY19oYXNoLCBvcC0+bmFtZSwgKFBUUikgb3ApOwotCSAgaWYgKHJldHZhbCAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSWdub3JlIFBvd2VyIGR1cGxpY2F0ZXMgZm9yIC1tNjAxICovCi0JICAgICAgaWYgKChwcGNfY3B1ICYgUFBDX09QQ09ERV82MDEpICE9IDAKLQkJICAmJiAob3AtPmZsYWdzICYgUFBDX09QQ09ERV9QT1dFUikgIT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBhc19iYWQgKF8oIkludGVybmFsIGFzc2VtYmxlciBlcnJvciBmb3IgaW5zdHJ1Y3Rpb24gJXMiKSwgb3AtPm5hbWUpOwotCSAgICAgIGR1cF9pbnNuID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSW5zZXJ0IHRoZSBtYWNyb3MgaW50byBhIGhhc2ggdGFibGUuICAqLwotICBwcGNfbWFjcm9faGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIG1hY3JvX2VuZCA9IHBvd2VycGNfbWFjcm9zICsgcG93ZXJwY19udW1fbWFjcm9zOwotICBmb3IgKG1hY3JvID0gcG93ZXJwY19tYWNyb3M7IG1hY3JvIDwgbWFjcm9fZW5kOyBtYWNybysrKQotICAgIHsKLSAgICAgIGlmICgobWFjcm8tPmZsYWdzICYgcHBjX2NwdSkgIT0gMCkKLQl7Ci0JICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLQkgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChwcGNfbWFjcm9faGFzaCwgbWFjcm8tPm5hbWUsIChQVFIpIG1hY3JvKTsKLQkgIGlmIChyZXR2YWwgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgYXNzZW1ibGVyIGVycm9yIGZvciBtYWNybyAlcyIpLCBtYWNyby0+bmFtZSk7Ci0JICAgICAgZHVwX2luc24gPSB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZHVwX2luc24pCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogVGVsbCB0aGUgbWFpbiBjb2RlIHdoYXQgdGhlIGVuZGlhbm5lc3MgaXMgaWYgaXQgaXMgbm90IG92ZXJpZGRlbiBieSB0aGUgdXNlci4gICovCi0gIGlmICghc2V0X3RhcmdldF9lbmRpYW4pCi0gICAgewotICAgICAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSBQUENfQklHX0VORElBTjsKLSAgICB9Ci0KLSNpZmRlZiBPQkpfWENPRkYKLSAgcHBjX2NvZmZfZGVidWdfc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoc3Rkb3V0cHV0LCBOX0RFQlVHKTsKLQotICAvKiBDcmVhdGUgZHVtbXkgc3ltYm9scyB0byBzZXJ2ZSBhcyBpbml0aWFsIGNzZWN0cy4gIFRoaXMgZm9yY2VzIHRoZQotICAgICB0ZXh0IGNzZWN0cyB0byBwcmVjZWRlIHRoZSBkYXRhIGNzZWN0cy4gIFRoZXNlIHN5bWJvbHMgd2lsbCBub3QKLSAgICAgYmUgb3V0cHV0LiAgKi8KLSAgcHBjX3RleHRfY3NlY3RzID0gc3ltYm9sX21ha2UgKCJkdW1teVwwMDEiKTsKLSAgc3ltYm9sX2dldF90YyAocHBjX3RleHRfY3NlY3RzKS0+d2l0aGluID0gcHBjX3RleHRfY3NlY3RzOwotICBwcGNfZGF0YV9jc2VjdHMgPSBzeW1ib2xfbWFrZSAoImR1bW15XDAwMSIpOwotICBzeW1ib2xfZ2V0X3RjIChwcGNfZGF0YV9jc2VjdHMpLT53aXRoaW4gPSBwcGNfZGF0YV9jc2VjdHM7Ci0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi0KLSAgcHBjX2N1cnJlbnRfc2VjdGlvbiA9IHRleHRfc2VjdGlvbjsKLSAgcHBjX3ByZXZpb3VzX3NlY3Rpb24gPSAwOyAgCi0KLSNlbmRpZgotfQotCi0vKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXBwY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLXsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gMzIpCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTk9QVCkgIT0gMCkKLQkgICAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgZWxzZQotCSAgICBtYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCi0JICBpZiAocHBjX3NpemUgPT0gUFBDX09QQ09ERV8zMikKLQkgICAgewotCSAgICAgIC8qIFNvbWUgcGVvcGxlIHdyaXRlIDMyIGJpdCBoZXggY29uc3RhbnRzIHdpdGggdGhlIHNpZ24KLQkJIGV4dGVuc2lvbiBkb25lIGJ5IGhhbmQuICBUaGlzIHNob3VsZG4ndCByZWFsbHkgYmUKLQkJIHZhbGlkLCBidXQsIHRvIHBlcm1pdCB0aGlzIGNvZGUgdG8gYXNzZW1ibGUgb24gYSA2NAotCQkgYml0IGhvc3QsIHdlIHNpZ24gZXh0ZW5kIHRoZSAzMiBiaXQgdmFsdWUuICAqLwotCSAgICAgIGlmICh2YWwgPiAwCi0JCSAgJiYgKHZhbCAmIChvZmZzZXRUKSAweDgwMDAwMDAwKSAhPSAwCi0JCSAgJiYgKHZhbCAmIChvZmZzZXRUKSAweGZmZmZmZmZmKSA9PSB2YWwpCi0JCXsKLQkJICB2YWwgLT0gMHg4MDAwMDAwMDsKLQkJICB2YWwgLT0gMHg4MDAwMDAwMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIG1pbiA9IDA7Ci0JfQotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfTkVHQVRJVkUpICE9IDApCi0JdGVzdCA9IC0gdmFsOwotICAgICAgZWxzZQotCXRlc3QgPSB2YWw7Ci0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQl7Ci0JICBjb25zdCBjaGFyICplcnIgPQotCSAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0JICBjaGFyIGJ1ZlsxMDBdOwotCi0JICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0JICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCSAgICBhc19iYWQgKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICBlbHNlCi0JICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLQl9Ci0gICAgfQotCi0gIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gICAgICBlcnJtc2cgPSBOVUxMOwotICAgICAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgKGxvbmcpIHZhbCwgJmVycm1zZyk7Ci0gICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JYXNfYmFkIChlcnJtc2cpOwotICAgIH0KLSAgZWxzZQotICAgIGluc24gfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JICAgICA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQwKLSNpZmRlZiBPQkpfRUxGCi0vKiBQYXJzZSBAZ290LCBldGMuIGFuZCByZXR1cm4gdGhlIGRlc2lyZWQgcmVsb2NhdGlvbi4gICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1wcGNfZWxmX3N1ZmZpeCAoc3RyX3AsIGV4cF9wKQotICAgICBjaGFyICoqc3RyX3A7Ci0gICAgIGV4cHJlc3Npb25TICpleHBfcDsKLXsKLSAgc3RydWN0IG1hcF9iZmQgewotICAgIGNoYXIgKnN0cmluZzsKLSAgICBpbnQgbGVuZ3RoOwotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgfTsKLQotICBjaGFyIGlkZW50WzIwXTsKLSAgY2hhciAqc3RyID0gKnN0cl9wOwotICBjaGFyICpzdHIyOwotICBpbnQgY2g7Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBtYXBfYmZkICpwdHI7Ci0KLSNkZWZpbmUgTUFQKHN0cixyZWxvYykgeyBzdHIsIHNpemVvZihzdHIpLTEsIHJlbG9jIH0KLQotICBzdGF0aWMgc3RydWN0IG1hcF9iZmQgbWFwcGluZ1tdID0gewotICAgIE1BUCAoImwiLAkJQkZEX1JFTE9DX0xPMTYpLAotICAgIE1BUCAoImgiLAkJQkZEX1JFTE9DX0hJMTYpLAotICAgIE1BUCAoImhhIiwJCUJGRF9SRUxPQ19ISTE2X1MpLAotICAgIE1BUCAoImJydGFrZW4iLAlCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOKSwKLSAgICBNQVAgKCJicm50YWtlbiIsCUJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOKSwKLSAgICBNQVAgKCJnb3QiLAkJQkZEX1JFTE9DXzE2X0dPVE9GRiksCi0gICAgTUFQICgiZ290QGwiLAlCRkRfUkVMT0NfTE8xNl9HT1RPRkYpLAotICAgIE1BUCAoImdvdEBoIiwJQkZEX1JFTE9DX0hJMTZfR09UT0ZGKSwKLSAgICBNQVAgKCJnb3RAaGEiLAlCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiksCi0gICAgTUFQICgiZml4dXAiLAlCRkRfUkVMT0NfQ1RPUiksCQkvKiB3YXJuaW5ncyB3aXRoIC1tcmVsb2NhdGFibGUgKi8KLSAgICBNQVAgKCJwbHQiLAkJQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCksCi0gICAgTUFQICgicGx0cmVsMjQiLAlCRkRfUkVMT0NfMjRfUExUX1BDUkVMKSwKLSAgICBNQVAgKCJjb3B5IiwJQkZEX1JFTE9DX1BQQ19DT1BZKSwKLSAgICBNQVAgKCJnbG9iZGF0IiwJQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCksCi0gICAgTUFQICgibG9jYWwyNHBjIiwJQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMpLAotICAgIE1BUCAoImxvY2FsIiwJQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMpLAotICAgIE1BUCAoInBsdHJlbCIsCUJGRF9SRUxPQ18zMl9QTFRfUENSRUwpLAotICAgIE1BUCAoInBsdEBsIiwJQkZEX1JFTE9DX0xPMTZfUExUT0ZGKSwKLSAgICBNQVAgKCJwbHRAaCIsCUJGRF9SRUxPQ19ISTE2X1BMVE9GRiksCi0gICAgTUFQICgicGx0QGhhIiwJQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYpLAotICAgIE1BUCAoInNkYXJlbCIsCUJGRF9SRUxPQ19HUFJFTDE2KSwKLSAgICBNQVAgKCJzZWN0b2ZmIiwJQkZEX1JFTE9DXzMyX0JBU0VSRUwpLAotICAgIE1BUCAoInNlY3RvZmZAbCIsCUJGRF9SRUxPQ19MTzE2X0JBU0VSRUwpLAotICAgIE1BUCAoInNlY3RvZmZAaCIsCUJGRF9SRUxPQ19ISTE2X0JBU0VSRUwpLAotICAgIE1BUCAoInNlY3RvZmZAaGEiLAlCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwpLAotICAgIE1BUCAoIm5hZGRyIiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiksCi0gICAgTUFQICgibmFkZHIxNiIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYpLAotICAgIE1BUCAoIm5hZGRyQGwiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPKSwKLSAgICBNQVAgKCJuYWRkckBoIiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSksCi0gICAgTUFQICgibmFkZHJAaGEiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBKSwKLSAgICBNQVAgKCJzZGFpMTYiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTYpLAotICAgIE1BUCAoInNkYTJyZWwiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMKSwKLSAgICBNQVAgKCJzZGEyaTE2IiwJQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNiksCi0gICAgTUFQICgic2RhMjEiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREEyMSksCi0gICAgTUFQICgibXJrcmVmIiwJQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGKSwKLSAgICBNQVAgKCJyZWxzZWN0IiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYpLAotICAgIE1BUCAoInJlbHNlY3RAbCIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPKSwKLSAgICBNQVAgKCJyZWxzZWN0QGgiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISSksCi0gICAgTUFQICgicmVsc2VjdEBoYSIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBKSwKLSAgICBNQVAgKCJiaXRmbGQiLAlCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxEKSwKLSAgICBNQVAgKCJyZWxzZGEiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEpLAotICAgIE1BUCAoInhnb3QiLAlCRkRfUkVMT0NfUFBDX1RPQzE2KSwKLQotICAgIHsgKGNoYXIgKikwLAkwLAlCRkRfUkVMT0NfVU5VU0VEIH0KLSAgfTsKLQotICBpZiAoKnN0cisrICE9ICdAJykKLSAgICByZXR1cm4gQkZEX1JFTE9DX1VOVVNFRDsKLQotICBmb3IgKGNoID0gKnN0ciwgc3RyMiA9IGlkZW50OwotICAgICAgIChzdHIyIDwgaWRlbnQgKyBzaXplb2YgKGlkZW50KSAtIDEKLQkmJiAoaXNhbG51bSAoY2gpIHx8IGNoID09ICdAJykpOwotICAgICAgIGNoID0gKisrc3RyKQotICAgIHsKLSAgICAgICpzdHIyKysgPSAoaXNsb3dlciAoY2gpKSA/IGNoIDogdG9sb3dlciAoY2gpOwotICAgIH0KLQotICAqc3RyMiA9ICdcMCc7Ci0gIGxlbiA9IHN0cjIgLSBpZGVudDsKLQotICBjaCA9IGlkZW50WzBdOwotICBmb3IgKHB0ciA9ICZtYXBwaW5nWzBdOyBwdHItPmxlbmd0aCA+IDA7IHB0cisrKQotICAgIGlmIChjaCA9PSBwdHItPnN0cmluZ1swXQotCSYmIGxlbiA9PSBwdHItPmxlbmd0aAotCSYmIG1lbWNtcCAoaWRlbnQsIHB0ci0+c3RyaW5nLCBwdHItPmxlbmd0aCkgPT0gMCkKLSAgICAgIHsKLQlpZiAoZXhwX3AtPlhfYWRkX251bWJlciAhPSAwCi0JICAgICYmIChwdHItPnJlbG9jID09IEJGRF9SRUxPQ18xNl9HT1RPRkYKLQkJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLQkJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfSEkxNl9HT1RPRkYKLQkJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRikpCi0JICBhc193YXJuIChfKCJpZGVudGlmaWVyK2NvbnN0YW50QGdvdCBtZWFucyBpZGVudGlmaWVyQGdvdCtjb25zdGFudCIpKTsKLQotCS8qIE5vdyBjaGVjayBmb3IgaWRlbnRpZmllckBzdWZmaXgrY29uc3RhbnQgKi8KLQlpZiAoKnN0ciA9PSAnLScgfHwgKnN0ciA9PSAnKycpCi0JICB7Ci0JICAgIGNoYXIgKm9yaWdfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgZXhwcmVzc2lvblMgbmV3X2V4cDsKLQotCSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0JICAgIGV4cHJlc3Npb24gKCZuZXdfZXhwKTsKLQkgICAgaWYgKG5ld19leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICAgIHsKLQkJZXhwX3AtPlhfYWRkX251bWJlciArPSBuZXdfZXhwLlhfYWRkX251bWJlcjsKLQkJc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIH0KLQotCSAgICBpZiAoJmlucHV0X2xpbmVfcG9pbnRlciAhPSBzdHJfcCkKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcmlnX2xpbmU7Ci0JICB9Ci0KLQkqc3RyX3AgPSBzdHI7Ci0JcmV0dXJuIHB0ci0+cmVsb2M7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIEJGRF9SRUxPQ19VTlVTRUQ7Ci19Ci0KLS8qIExpa2Ugbm9ybWFsIC5sb25nLy5zaG9ydC8ud29yZCwgZXhjZXB0IHN1cHBvcnQgQGdvdCwgZXRjLiAqLwotLyogY2xvYmJlcnMgaW5wdXRfbGluZV9wb2ludGVyLCBjaGVja3MgKi8KLS8qIGVuZC1vZi1saW5lLiAqLwotc3RhdGljIHZvaWQKLXBwY19lbGZfY29ucyAobmJ5dGVzKQotICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOwkvKiAxPS5ieXRlLCAyPS53b3JkLCA0PS5sb25nICovCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRvCi0gICAgewotICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wKLQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ0AnCi0JICAmJiAocmVsb2MgPSBwcGNfZWxmX3N1ZmZpeCAoJmlucHV0X2xpbmVfcG9pbnRlciwgJmV4cCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JewotCSAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgcmVsb2MpOwotCSAgaW50IHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgaWYgKHNpemUgPiBuYnl0ZXMpCi0JICAgIGFzX2JhZCAoXygiJXMgcmVsb2NhdGlvbnMgZG8gbm90IGZpdCBpbiAlZCBieXRlc1xuIiksIHJlbG9jX2hvd3RvLT5uYW1lLCBuYnl0ZXMpOwotCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWdpc3RlciBjaGFyICpwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOwotCSAgICAgIGludCBvZmZzZXQgPSBuYnl0ZXMgLSBzaXplOwotCi0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsIHNpemUsICZleHAsIDAsIHJlbG9jKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQllbWl0X2V4cHIgKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyLS07CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBTb2xhcmlzIHBzZWR1byBvcCB0byBjaGFuZ2UgdG8gdGhlIC5yb2RhdGEgc2VjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotcHBjX2VsZl9yZGF0YSAoeHh4KQotICAgICBpbnQgeHh4OwotewotICBjaGFyICpzYXZlX2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN0YXRpYyBjaGFyIHNlY3Rpb25bXSA9ICIucm9kYXRhXG4iOwotCi0gIC8qIEp1c3QgcHJldGVuZCB0aGlzIGlzIC5zZWN0aW9uIC5yb2RhdGEgKi8KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2VjdGlvbjsKLSAgb2JqX2VsZl9zZWN0aW9uICh4eHgpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfbGluZTsKLX0KLQotLyogUHNldWRvIG9wIHRvIG1ha2UgZmlsZSBzY29wZSBic3MgaXRlbXMgKi8KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2xjb21tKHh4eCkKLSAgICAgaW50IHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIG9mZnNldFQgc2l6ZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgb2Zmc2V0VCBhbGlnbjsKLSAgc2VnVCBvbGRfc2VjOwotICBpbnQgb2xkX3N1YnNlYzsKLSAgY2hhciAqcGZyYWc7Ci0gIGludCBhbGlnbjI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKChzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSBzaXplKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAubGNvbW0gaXMgdGhlIGFsaWdubWVudC4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBhbGlnbiA9IDg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoYWxpZ24gPD0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOwotCSAgYWxpZ24gPSA4OwotCX0KLSAgICB9Ci0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLQotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJMZW5ndGggb2YgLmxjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCSAgICAgIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JICAgICAgKGxvbmcpIHNpemUpOwotCi0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBhbGxvY2F0ZV9ic3M6ICovCi0gIG9sZF9zZWMgPSBub3dfc2VnOwotICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgaWYgKGFsaWduKQotICAgIHsKLSAgICAgIC8qIGNvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudCAqLwotICAgICAgZm9yIChhbGlnbjIgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKythbGlnbjIpOwotICAgICAgaWYgKGFsaWduICE9IDEpCi0JewotCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhbGlnbjIgPSAwOwotCi0gIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbjIpOwotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0gIGlmIChhbGlnbjIpCi0gICAgZnJhZ19hbGlnbiAoYWxpZ24yLCAwLCAwKTsKLSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsIHNpemUsCi0JCSAgICAoY2hhciAqKSAwKTsKLSAgKnBmcmFnID0gMDsKLSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFZhbGlkYXRlIGFueSByZWxvY2F0aW9ucyBlbWl0dGVkIGZvciAtbXJlbG9jYXRhYmxlLCBwb3NzaWJseSBhZGRpbmcKLSAgIGZpeHVwcyBmb3Igd29yZCByZWxvY2F0aW9ucyBpbiB3cml0YWJsZSBzZWdtZW50cywgc28gd2UgY2FuIGFkanVzdAotICAgdGhlbSBhdCBydW50aW1lLiAgKi8KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX3ZhbGlkYXRlX2ZpeCAoZml4cCwgc2VnKQotICAgICBmaXhTICpmaXhwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgaWYgKGZpeHAtPmZ4X2RvbmUgfHwgZml4cC0+ZnhfcGNyZWwpCi0gICAgcmV0dXJuOwotCi0gIHN3aXRjaCAoc2hsaWIpCi0gICAgewotICAgIGNhc2UgU0hMSUJfTk9ORToKLSAgICBjYXNlIFNITElCX1BJQzoKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgU0hJTEJfTVJFTE9DQVRBQkxFOgotICAgICAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA8PSBCRkRfUkVMT0NfVU5VU0VECi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzE2X0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19MTzE2X0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyX0JBU0VSRUwKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTE8xNl9CQVNFUkVMCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfQkFTRVJFTAotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZ290MiIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmR0b3JzIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuY3RvcnMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5maXh1cCIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLnN0YWIiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5nY2NfZXhjZXB0X3RhYmxlIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZWhfZnJhbWUiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5leF9zaGFyZWQiKSAhPSAwKQotCXsKLQkgIGlmICgoc2VnLT5mbGFncyAmIChTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSkpICE9IDAKLQkgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0NUT1IpCi0JICAgIHsKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiUmVsb2NhdGlvbiBjYW5ub3QgYmUgZG9uZSB3aGVuIHVzaW5nIC1tcmVsb2NhdGFibGUiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQwKLSNpZmRlZiBURV9QRQotCi0vKgotICogU3VtbWFyeSBvZiBwYXJzZV90b2NfZW50cnkoKS4KLSAqCi0gKiBpbjoJSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byB0aGUgJ1snIGluIG9uZSBvZjoKLSAqCi0gKiAgICAgICAgW3RvY10gW3RvY3ZdIFt0b2MzMl0gW3RvYzY0XQotICoKLSAqICAgICAgQW55dGhpbmcgZWxzZSBpcyBhbiBlcnJvciBvZiBvbmUga2luZCBvciBhbm90aGVyLgotICoKLSAqIG91dDoJCi0gKiAgIHJldHVybiB2YWx1ZTogc3VjY2VzcyBvciBmYWlsdXJlCi0gKiAgIHRvY19raW5kOiAgICAga2luZCBvZiB0b2MgcmVmZXJlbmNlCi0gKiAgIGlucHV0X2xpbmVfcG9pbnRlcjoKLSAqICAgICBzdWNjZXNzOiBmaXJzdCBjaGFyIGFmdGVyIHRoZSAnXScKLSAqICAgICBmYWlsdXJlOiB1bmNoYW5nZWQKLSAqCi0gKiBzZXR0aW5nczoKLSAqCi0gKiAgICAgW3RvY10gICAtIHJ2ID09IHN1Y2Nlc3MsIHRvY19raW5kID0gZGVmYXVsdF90b2MKLSAqICAgICBbdG9jdl0gIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBkYXRhX2luX3RvYwotICogICAgIFt0b2MzMl0gLSBydiA9PSBzdWNjZXNzLCB0b2Nfa2luZCA9IG11c3RfYmVfMzIKLSAqICAgICBbdG9jNjRdIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBtdXN0X2JlXzY0Ci0gKgotICovCi0KLWVudW0gdG9jX3NpemVfcXVhbGlmaWVyIAoteyAKLSAgZGVmYXVsdF90b2MsIC8qIFRoZSB0b2MgY2VsbCBjb25zdHJ1Y3RlZCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IHNpemUgKi8KLSAgZGF0YV9pbl90b2MsIC8qIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIGEgdG9jIGNlbGwgICAgICAgICAgICAgICAgICAgKi8KLSAgbXVzdF9iZV8zMiwgIC8qIFRoZSB0b2MgY2VsbCBjb25zdHJ1Y3RlZCBtdXN0IGJlIDMyIGJpdHMgd2lkZSAgICAgICAgICAgICAgKi8KLSAgbXVzdF9iZV82NCAgIC8qIFRoZSB0b2MgY2VsbCBjb25zdHJ1Y3RlZCBtdXN0IGJlIDY0IGJpdHMgd2lkZSAgICAgICAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX3RvY19lbnRyeSh0b2Nfa2luZCkKLSAgICAgZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgKnRvY19raW5kOwotewotICBjaGFyICpzdGFydDsKLSAgY2hhciAqdG9jX3NwZWM7Ci0gIGNoYXIgYzsKLSAgZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgdDsKLQotICAvKiBzYXZlIHRoZSBpbnB1dF9saW5lX3BvaW50ZXIgKi8KLSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogc2tpcCBvdmVyIHRoZSAnWycgLCBhbmQgd2hpdGVzcGFjZSAqLwotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICAKLSAgLyogZmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgdG9jX3NwZWMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jIikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IGRlZmF1bHRfdG9jOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jdiIpID09IDApIAotICAgIHsKLSAgICAgIHQgPSBkYXRhX2luX3RvYzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCh0b2Nfc3BlYywgInRvYzMyIikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IG11c3RfYmVfMzI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAodG9jX3NwZWMsICJ0b2M2NCIpID09IDApIAotICAgIHsKLSAgICAgIHQgPSBtdXN0X2JlXzY0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yOiBpbnZhbGlkIHRvYyBzcGVjaWZpZXIgYCVzJyIpLCB0b2Nfc3BlYyk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogbm93IGZpbmQgdGhlICddJyAqLwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkgICAgIC8qIGxlYWRpbmcgd2hpdGVzcGFjZSBjb3VsZCBiZSB0aGVyZS4gKi8KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsgLyogaW5wdXRfbGluZV9wb2ludGVyLT5wYXN0IGNoYXIgaW4gYy4gKi8KLQotICBpZiAoYyAhPSAnXScpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3I6IGV4cGVjdGVkIGBdJywgZm91bmQgIGAlYyciKSwgYyk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgKnRvY19raW5kID0gdDsgICAgICAgICAgICAgLyogc2V0IHJldHVybiB2YWx1ZSAqLwotICByZXR1cm4gMTsKLX0KLSNlbmRpZgotDAotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFdlIGNhbid0IHNpbXBseSBnZW5lcmF0ZSB0aGVtIGFzCi0gICB3ZSBnbywgYmVjYXVzZSB0aGF0IHdvdWxkIHJlcXVpcmUgdXMgdG8gZmlyc3QgY3JlYXRlIHRoZSBmcmFnLCBhbmQKLSAgIHRoYXQgd291bGQgc2NyZXcgdXAgcmVmZXJlbmNlcyB0byBgYC4nJy4gICovCi0KLXN0cnVjdCBwcGNfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgb3BpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLSAgaW50IHNraXBfb3B0aW9uYWw7Ci0gIGludCBuZWVkX3BhcmVuOwotICBpbnQgbmV4dF9vcGluZGV4OwotICBzdHJ1Y3QgcHBjX2ZpeHVwIGZpeHVwc1tNQVhfSU5TTl9GSVhVUFNdOwotICBpbnQgZmM7Ci0gIGNoYXIgKmY7Ci0gIGludCBpOwotI2lmZGVmIE9CSl9FTEYKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotI2VuZGlmCi0KLSAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgISBpc3NwYWNlICgqcyk7IHMrKykKLSAgICA7Ci0gIGlmICgqcyAhPSAnXDAnKQotICAgICpzKysgPSAnXDAnOwotCi0gIC8qIExvb2sgdXAgdGhlIG9wY29kZSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKikgaGFzaF9maW5kIChwcGNfaGFzaCwgc3RyKTsKLSAgaWYgKG9wY29kZSA9PSAoY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICopIE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOwotCi0gICAgICBtYWNybyA9IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqKSBoYXNoX2ZpbmQgKHBwY19tYWNyb19oYXNoLCBzdHIpOwotICAgICAgaWYgKG1hY3JvID09IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqKSBOVUxMKQotCWFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgZWxzZQotCXBwY19tYWNybyAocywgbWFjcm8pOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLQotICBzdHIgPSBzOwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgLyogUG93ZXJQQyBvcGVyYW5kcyBhcmUganVzdCBleHByZXNzaW9ucy4gIFRoZSBvbmx5IHJlYWwgaXNzdWUgaXMKLSAgICAgdGhhdCBhIGZldyBvcGVyYW5kIHR5cGVzIGFyZSBvcHRpb25hbC4gIEFsbCBjYXNlcyB3aGljaCBtaWdodCB1c2UKLSAgICAgYW4gb3B0aW9uYWwgb3BlcmFuZCBzZXBhcmF0ZSB0aGUgb3BlcmFuZHMgb25seSB3aXRoIGNvbW1hcyAoaW4KLSAgICAgc29tZSBjYXNlcyBwYXJlbnRoZXNlcyBhcmUgdXNlZCwgYXMgaW4gYGBsd3ogMSwwKDEpJycgYnV0IHN1Y2gKLSAgICAgY2FzZXMgbmV2ZXIgaGF2ZSBvcHRpb25hbCBvcGVyYW5kcykuICBUaGVyZSBpcyBuZXZlciBtb3JlIHRoYW4KLSAgICAgb25lIG9wdGlvbmFsIG9wZXJhbmQgZm9yIGFuIGluc3RydWN0aW9uLiAgU28sIGJlZm9yZSB3ZSBzdGFydAotICAgICBzZXJpb3VzbHkgcGFyc2luZyB0aGUgb3BlcmFuZHMsIHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFuCi0gICAgIG9wdGlvbmFsIG9wZXJhbmQsIGFuZCwgaWYgd2UgZG8sIHdlIGNvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIHRvCi0gICAgIHNlZSB3aGV0aGVyIHRoZSBvcGVyYW5kIHNob3VsZCBiZSBvbWl0dGVkLiAgKi8KLSAgc2tpcF9vcHRpb25hbCA9IDA7Ci0gIGZvciAob3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleF9wdHIgIT0gMDsgb3BpbmRleF9wdHIrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotCi0gICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9PUFRJT05BTCkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgb3Bjb3VudDsKLQotCSAgLyogVGhlcmUgaXMgYW4gb3B0aW9uYWwgb3BlcmFuZC4gIENvdW50IHRoZSBudW1iZXIgb2YKLQkgICAgIGNvbW1hcyBpbiB0aGUgaW5wdXQgbGluZS4gICovCi0JICBpZiAoKnN0ciA9PSAnXDAnKQotCSAgICBvcGNvdW50ID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wY291bnQgPSAxOwotCSAgICAgIHMgPSBzdHI7Ci0JICAgICAgd2hpbGUgKChzID0gc3RyY2hyIChzLCAnLCcpKSAhPSAoY2hhciAqKSBOVUxMKQotCQl7Ci0JCSAgKytvcGNvdW50OwotCQkgICsrczsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIElmIHRoZXJlIGFyZSBmZXdlciBvcGVyYW5kcyBpbiB0aGUgbGluZSB0aGVuIGFyZSBjYWxsZWQKLQkgICAgIGZvciBieSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHdhbnQgdG8gc2tpcCB0aGUgb3B0aW9uYWwKLQkgICAgIG9wZXJhbmQuICAqLwotCSAgaWYgKG9wY291bnQgPCBzdHJsZW4gKG9wY29kZS0+b3BlcmFuZHMpKQotCSAgICBza2lwX29wdGlvbmFsID0gMTsKLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBHYXRoZXIgdGhlIG9wZXJhbmRzLiAgKi8KLSAgbmVlZF9wYXJlbiA9IDA7Ci0gIG5leHRfb3BpbmRleCA9IDA7Ci0gIGZjID0gMDsKLSAgZm9yIChvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4X3B0ciAhPSAwOyBvcGluZGV4X3B0cisrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgICBjaGFyICpob2xkOwotICAgICAgZXhwcmVzc2lvblMgZXg7Ci0gICAgICBjaGFyIGVuZGM7Ci0KLSAgICAgIGlmIChuZXh0X29waW5kZXggPT0gMCkKLQlvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbbmV4dF9vcGluZGV4XTsKLQkgIG5leHRfb3BpbmRleCA9IDA7Ci0JfQotCi0gICAgICBlcnJtc2cgPSBOVUxMOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgZmFrZSBvcGVyYW5kLCB0aGVuIHdlIGRvIG5vdCBleHBlY3QgYW55dGhpbmcKLQkgZnJvbSB0aGUgaW5wdXQuICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZBS0UpICE9IDApCi0JewotCSAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgMEwsICZlcnJtc2cpOwotCSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCSAgICBhc19iYWQgKGVycm1zZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gb3B0aW9uYWwgb3BlcmFuZCwgYW5kIHdlIGFyZSBza2lwcGluZyBpdCwganVzdAotCSBpbnNlcnQgYSB6ZXJvLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9PUFRJT05BTCkgIT0gMAotCSAgJiYgc2tpcF9vcHRpb25hbCkKLQl7Ci0JICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotCSAgICB7Ci0JICAgICAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgMEwsICZlcnJtc2cpOwotCSAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkJYXNfYmFkIChlcnJtc2cpOwotCSAgICB9Ci0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfTkVYVCkgIT0gMCkKLQkgICAgbmV4dF9vcGluZGV4ID0gKm9waW5kZXhfcHRyICsgMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2F0aGVyIHRoZSBvcGVyYW5kLiAgKi8KLSAgICAgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSNpZmRlZiBURV9QRQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1snKSAKLQl7Ci0JICAvKiBXZSBhcmUgZXhwZWN0aW5nIHNvbWV0aGluZyBsaWtlIHRoZSBzZWNvbmQgYXJndW1lbnQgaGVyZToKLQotCSAgICAgICAgbHd6IHI0LFt0b2NdLkdTLjAuc3RhdGljX2ludChydG9jKQotICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KLQkgICAgIFRoZSBhcmd1bWVudCBmb2xsb3dpbmcgdGhlIGBdJyBtdXN0IGJlIGEgc3ltYm9sIG5hbWUsIGFuZCB0aGUgCi0gICAgICAgICAgICAgcmVnaXN0ZXIgbXVzdCBiZSB0aGUgdG9jIHJlZ2lzdGVyOiAncnRvYycgb3IgJzInCi0KLQkgICAgIFRoZSBlZmZlY3QgaXMgdG8gMCBhcyB0aGUgZGlzcGxhY2VtZW50IGZpZWxkCi0JICAgICBpbiB0aGUgaW5zdHJ1Y3Rpb24sIGFuZCBpc3N1ZSBhbiBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2IChvcgotCSAgICAgdGhlIGFwcHJvcHJpYXRlIHZhcmlhdGlvbikgcmVsb2MgYWdhaW5zdCBpdCBiYXNlZCBvbiB0aGUgc3ltYm9sLgotCSAgICAgVGhlIGxpbmtlciB3aWxsIGJ1aWxkIHRoZSB0b2MsIGFuZCBpbnNlcnQgdGhlIHJlc29sdmVkIHRvYyBvZmZzZXQuCi0KLQkgICAgIE5vdGU6Ci0JICAgICBvIFRoZSBzaXplIG9mIHRoZSB0b2MgZW50cnkgaXMgY3VycmVudGx5IGFzc3VtZWQgdG8gYmUKLQkgICAgICAgMzIgYml0cy4gVGhpcyBzaG91bGQgbm90IGJlIGFzc3VtZWQgdG8gYmUgYSBoYXJkIGNvZGVkCi0JICAgICAgIG51bWJlci4KLQkgICAgIG8gSW4gYW4gZWZmb3J0IHRvIGNvcGUgd2l0aCBhIGNoYW5nZSBmcm9tIDMyIHRvIDY0IGJpdHMsCi0JICAgICAgIHRoZXJlIGFyZSBhbHNvIHRvYyBlbnRyaWVzIHRoYXQgYXJlIHNwZWNpZmllZCB0byBiZQotCSAgICAgICBlaXRoZXIgMzIgb3IgNjQgYml0czoKLSAgICAgICAgICAgICAgICAgbHd6IHI0LFt0b2MzMl0uR1MuMC5zdGF0aWNfaW50KHJ0b2MpCi0JICAgICAgICAgbHd6IHI0LFt0b2M2NF0uR1MuMC5zdGF0aWNfaW50KHJ0b2MpCi0JICAgICAgIFRoZXNlIGRlbWFuZCB0b2MgZW50cmllcyBvZiB0aGUgc3BlY2lmaWVkIHNpemUsIGFuZCB0aGUKLQkgICAgICAgaW5zdHJ1Y3Rpb24gcHJvYmFibHkgcmVxdWlyZXMgaXQuCi0gICAgICAgICAgKi8KLQotCSAgaW50IHZhbGlkX3RvYzsKLQkgIGVudW0gdG9jX3NpemVfcXVhbGlmaWVyIHRvY19raW5kOwotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHRvY19yZWxvYzsKLQotCSAgLyogZ28gcGFyc2Ugb2ZmIHRoZSBbdG9jWFhdIHBhcnQgKi8KLQkgIHZhbGlkX3RvYyA9IHBhcnNlX3RvY19lbnRyeSgmdG9jX2tpbmQpOwotCi0JICBpZiAoIXZhbGlkX3RvYykgCi0JICAgIHsKLQkgICAgICAvKiBOb3RlOiBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkLiAgICAgKi8KLQkgICAgICAvKiBGSVhNRTogd2hhdCBzb3J0IG9mIHJlY292ZXJ5IHNob3VsZCB3ZSBkbz8gKi8KLQkgICAgICAvKiAgICAgICAgZGVtYW5kX3Jlc3Rfb2ZfbGluZSgpOyByZXR1cm47ID8gICAgKi8KLQkgICAgfQotCi0JICAvKiBOb3cgZ2V0IHRoZSBzeW1ib2wgZm9sbG93aW5nIHRoZSAnXScgKi8KLQkgIGV4cHJlc3Npb24oJmV4KTsKLQotCSAgc3dpdGNoICh0b2Nfa2luZCkKLQkgICAgewotCSAgICBjYXNlIGRlZmF1bHRfdG9jOgotCSAgICAgIC8qIEluIHRoaXMgY2FzZSwgd2UgbWF5IG5vdCBoYXZlIHNlZW4gdGhlIHN5bWJvbCB5ZXQsIHNpbmNlICAqLwotCSAgICAgIC8qIGl0IGlzIGFsbG93ZWQgdG8gYXBwZWFyIG9uIGEgLmV4dGVybiBvciAuZ2xvYmwgb3IganVzdCBiZSAqLwotCSAgICAgIC8qIGEgbGFiZWwgaW4gdGhlIC5kYXRhIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIHRvY19yZWxvYyA9IEJGRF9SRUxPQ19QUENfVE9DMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZGF0YV9pbl90b2M6Ci0JICAgICAgLyogMS4gVGhlIHN5bWJvbCBtdXN0IGJlIGRlZmluZWQgYW5kIGVpdGhlciBpbiB0aGUgdG9jICAgICAgICAqLwotCSAgICAgIC8qICAgIHNlY3Rpb24sIG9yIGEgZ2xvYmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICAvKiAyLiBUaGUgcmVsb2MgZ2VuZXJhdGVkIG11c3QgaGF2ZSB0aGUgVE9DREVGTiBmbGFnIHNldCBpbiAgICovCi0JICAgICAgLyogICAgdXBwZXIgYml0IG1lc3Mgb2YgdGhlIHJlbG9jIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIC8qIEZJWE1FOiBJdCdzIGEgbGl0dGxlIGNvbmZ1c2luZyB3aGF0IHRoZSB0b2N2IHF1YWxpZmllciBjYW4gKi8KLQkgICAgICAvKiAgICAgICAgYmUgdXNlZCBmb3IuIEF0IHRoZSB2ZXJ5IGxlYXN0LCBJJ3ZlIHNlZW4gdGhyZWUgICAgICovCi0JICAgICAgLyogICAgICAgIHVzZXMsIG9ubHkgb25lIG9mIHdoaWNoIEknbSBzdXJlIEkgY2FuIGV4cGxhaW4uICAgICAqLwotCSAgICAgIGlmIChleC5YX29wID09IE9fc3ltYm9sKSAKLQkJewkJICAKLQkJICBhc3NlcnQgKGV4LlhfYWRkX3N5bWJvbCAhPSBOVUxMKTsKLQkJICBpZiAoc3ltYm9sX2dldF9iZmRzeW0gKGV4LlhfYWRkX3N5bWJvbCktPnNlY3Rpb24KLQkJICAgICAgIT0gdG9jZGF0YV9zZWN0aW9uKQotCQkgICAgewotCQkgICAgICBhc19iYWQoXygiW3RvY3ZdIHN5bWJvbCBpcyBub3QgYSB0b2Mgc3ltYm9sIikpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfUFBDX1RPQzE2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIG11c3RfYmVfMzI6Ci0JICAgICAgLyogRklYTUU6IHRoZXNlIG5leHQgdHdvIHNwZWNpZmljYWxseSBzcGVjaWZ5IDMyLzY0IGJpdCB0b2MgICAqLwotCSAgICAgIC8qICAgICAgICBlbnRyaWVzLiBXZSBkb24ndCBzdXBwb3J0IHRoZW0gdG9kYXkuIElzIHRoaXMgdGhlICAgKi8KLQkgICAgICAvKiAgICAgICAgcmlnaHQgd2F5IHRvIHNheSB0aGF0PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgdG9jX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgICAgICBhc19iYWQgKF8oIlVuaW1wbGVtZW50ZWQgdG9jMzIgZXhwcmVzc2lvbiBtb2RpZmllciIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBtdXN0X2JlXzY0OgotCSAgICAgIC8qIEZJWE1FOiBzZWUgYWJvdmUgKi8KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgIGFzX2JhZCAoXygiVW5pbXBsZW1lbnRlZCB0b2M2NCBleHByZXNzaW9uIG1vZGlmaWVyIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYoc3RkZXJyLCAKLQkJICAgICAgXygiVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgWyVkXSBmcm9tIHBhcnNlX3RvY19lbnRyeSFcbiIpLAotCQkgICAgICB0b2Nfa2luZCk7Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICBmaXh1cHNbZmNdLnJlbG9jID0gdG9jX3JlbG9jOwotCSAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgIGZpeHVwc1tmY10ub3BpbmRleCA9ICpvcGluZGV4X3B0cjsKLQkgICsrZmM7Ci0KLSAgICAgICAgICAvKiBPay4gV2UndmUgc2V0IHVwIHRoZSBmaXh1cCBmb3IgdGhlIGluc3RydWN0aW9uLiBOb3cgbWFrZSBpdAotCSAgICAgbG9vayBsaWtlIHRoZSBjb25zdGFudCAwIHdhcyBmb3VuZCBoZXJlICovCi0JICBleC5YX3Vuc2lnbmVkID0gMTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXguWF9hZGRfbnVtYmVyID0gMDsKLQkgIGV4LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICBleC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBlbHNlCi0jZW5kaWYJCS8qIFRFX1BFICovCi0JewotCSAgaWYgKCEgcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9DUikgIT0gMCkKLQkJY3Jfb3BlcmFuZCA9IHRydWU7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4KTsKLQkgICAgICBjcl9vcGVyYW5kID0gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLSAgICAgIGlmIChleC5YX29wID09IE9faWxsZWdhbCkKLQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLSAgICAgIGVsc2UgaWYgKGV4Llhfb3AgPT0gT19hYnNlbnQpCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gICAgICBlbHNlIGlmIChleC5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgaW5zbiA9IHBwY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyLAotCQkJCSAgICAgKGNoYXIgKikgTlVMTCwgMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoZXguWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLSNpZmRlZiBPQkpfRUxGCi0JICAvKiBBbGxvdyBASEEsIEBMLCBASCBvbiBjb25zdGFudHMuICovCi0JICBjaGFyICpvcmlnX3N0ciA9IHN0cjsKLQotCSAgaWYgKChyZWxvYyA9IHBwY19lbGZfc3VmZml4ICgmc3RyLCAmZXgpKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICBzd2l0Y2ggKHJlbG9jKQotCSAgICAgIHsKLQkgICAgICBkZWZhdWx0OgotCQlzdHIgPSBvcmlnX3N0cjsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCQkvKiBYX3Vuc2lnbmVkIGlzIHRoZSBkZWZhdWx0LCBzbyBpZiB0aGUgdXNlciBoYXMgZG9uZQotICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyB3aGljaCBjbGVhcmVkIGl0LCB3ZSBhbHdheXMgcHJvZHVjZSBhCi0gICAgICAgICAgICAgICAgICAgc2lnbmVkIHZhbHVlLiAgKi8KLQkJaWYgKGV4LlhfdW5zaWduZWQKLQkJICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgPT0gMCkKLQkJICBleC5YX2FkZF9udW1iZXIgJj0gMHhmZmZmOwotCQllbHNlCi0JCSAgZXguWF9hZGRfbnVtYmVyID0gKCgoZXguWF9hZGRfbnVtYmVyICYgMHhmZmZmKQotCQkJCSAgICAgIF4gMHg4MDAwKQotCQkJCSAgICAgLSAweDgwMDApOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JCWV4LlhfYWRkX251bWJlciA9IChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkJZXguWF9hZGRfbnVtYmVyID0gKCgoKGV4LlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmYpCi0JCQkJICAgICsgKChleC5YX2FkZF9udW1iZXIgPj4gMTUpICYgMSkpCi0JCQkJICAgJiAweGZmZmYpOwotCQlicmVhazsKLQkgICAgICB9Ci0jZW5kaWYKLQkgIGluc24gPSBwcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKLQkJCQkgICAgIChjaGFyICopIE5VTEwsIDApOwotCX0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICgocmVsb2MgPSBwcGNfZWxmX3N1ZmZpeCAoJnN0ciwgJmV4KSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQl7Ci0JICAvKiBGb3IgdGhlIGFic291bHRlIGZvcm1zIG9mIGJyYW5jaHMsIGNvbnZlcnQgdGhlIFBDIHJlbGF0aXZlIGZvcm0gYmFjayBpbnRvCi0JICAgICB0aGUgYWJzb2x1dGUuICAqLwotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyZWxvYykKLQkJewotCQljYXNlIEJGRF9SRUxPQ19QUENfQjI2OgotCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTI2OwotCQkgIGJyZWFrOwotCQljYXNlIEJGRF9SRUxPQ19QUENfQjE2OgotCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTE2OwotCQkgIGJyZWFrOwotCQljYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU46Ci0JCSAgcmVsb2MgPSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTjsKLQkJICBicmVhazsKLQkJY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTjoKLQkJICByZWxvYyA9IEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTjsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gMDsKLQkgIGZpeHVwc1tmY10ucmVsb2MgPSByZWxvYzsKLQkgICsrZmM7Ci0JfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotCSAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICArK2ZjOwotCX0KLQotICAgICAgaWYgKG5lZWRfcGFyZW4pCi0JewotCSAgZW5kYyA9ICcpJzsKLQkgIG5lZWRfcGFyZW4gPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMCkKLQl7Ci0JICBlbmRjID0gJygnOwotCSAgbmVlZF9wYXJlbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCWVuZGMgPSAnLCc7Ci0KLSAgICAgIC8qIFRoZSBjYWxsIHRvIGV4cHJlc3Npb24gc2hvdWxkIGhhdmUgYWR2YW5jZWQgc3RyIHBhc3QgYW55Ci0JIHdoaXRlc3BhY2UuICAqLwotICAgICAgaWYgKCpzdHIgIT0gZW5kYwotCSAgJiYgKGVuZGMgIT0gJywnIHx8ICpzdHIgIT0gJ1wwJykpCi0JewotCSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3I7IGZvdW5kIGAlYycgYnV0IGV4cGVjdGVkIGAlYyciKSwgKnN0ciwgZW5kYyk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICgqc3RyICE9ICdcMCcpCi0JKytzdHI7Ci0gICAgfQotCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciAhPSAnXDAnKQotICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBmID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKLQotICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwgYnV0IGluc3RlYWQganVzdCB1c2UgdGhlCi0gICAgIEJGRF9SRUxPQ19VTlVTRUQgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkKLSAgICAgaGFuZGxlIGZpeHVwcyBmb3IgYW55IG9wZXJhbmQgdHlwZSwgYWx0aG91Z2ggdGhhdCBpcyBhZG1pdHRlZGx5Ci0gICAgIG5vdCBhIHZlcnkgZXhjaXRpbmcgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbgotICAgICBtZF9hcHBseV9maXguICAqLwotICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotCi0gICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOwotICAgICAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCXsKLQkgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHVwc1tpXS5yZWxvYyk7Ci0JICBpbnQgc2l6ZTsKLQkgIGludCBvZmZzZXQ7Ci0JICBmaXhTICpmaXhQOwotCi0JICBpZiAoIXJlbG9jX2hvd3RvKQotCSAgICBhYm9ydCAoKTsKLQotCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCSAgb2Zmc2V0ID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAoNCAtIHNpemUpIDogMDsKLQotCSAgaWYgKHNpemUgPCAxIHx8IHNpemUgPiA0KQotCSAgICBhYm9ydCgpOwotCi0JICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsIHNpemUsCi0JCQkgICAgICAmZml4dXBzW2ldLmV4cCwgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJICAgICAgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgLyogVHVybiBvZmYgY29tcGxhaW50cyB0aGF0IHRoZSBhZGRlbmQgaXMgdG9vIGxhcmdlIGZvciB0aGluZ3MgbGlrZQotCSAgICAgZm9vKzEwMDAwMEBoYS4gICovCi0JICBzd2l0Y2ggKGZpeHVwc1tpXS5yZWxvYykKLQkgICAgewotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCSAgICAgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJICAgICAmZml4dXBzW2ldLmV4cCwKLQkJICAgICAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9SRUxBVElWRSkgIT0gMCwKLQkJICAgICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkKLQkJICAgICAgIChmaXh1cHNbaV0ub3BpbmRleCArIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpKSk7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgYSBtYWNyby4gIEdhdGhlciBhbGwgdGhlIG9wZXJhbmRzLCB0cmFuc2Zvcm0gdGhlbSBhcwotICAgZGVzY3JpYmVkIGJ5IHRoZSBtYWNybywgYW5kIGNhbGwgbWRfYXNzZW1ibGUgcmVjdXJzaXZlbHkuICBBbGwgdGhlCi0gICBvcGVyYW5kcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hczsgd2UgZG9uJ3QgYWNjZXB0IHBhcmVudGhlc2VzCi0gICBhcm91bmQgb3BlcmFuZHMgaGVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfbWFjcm8gKHN0ciwgbWFjcm8pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOwotewotICBjaGFyICpvcGVyYW5kc1sxMF07Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgY2hhciAqczsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY29uc3QgY2hhciAqZm9ybWF0OwotICBpbnQgYXJnOwotICBjaGFyICpzZW5kOwotICBjaGFyICpjb21wbGV0ZTsKLQotICAvKiBHYXRoZXIgdGhlIHVzZXJzIG9wZXJhbmRzIGludG8gdGhlIG9wZXJhbmRzIGFycmF5LiAgKi8KLSAgY291bnQgPSAwOwotICBzID0gc3RyOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoY291bnQgPj0gc2l6ZW9mIG9wZXJhbmRzIC8gc2l6ZW9mIG9wZXJhbmRzWzBdKQotCWJyZWFrOwotICAgICAgb3BlcmFuZHNbY291bnQrK10gPSBzOwotICAgICAgcyA9IHN0cmNociAocywgJywnKTsKLSAgICAgIGlmIChzID09IChjaGFyICopIE5VTEwpCi0JYnJlYWs7Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICB9ICAKLQotICBpZiAoY291bnQgIT0gbWFjcm8tPm9wZXJhbmRzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygid3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXb3JrIG91dCBob3cgbGFyZ2UgdGhlIHN0cmluZyBtdXN0IGJlICh0aGUgc2l6ZSBpcyB1bmJvdW5kZWQKLSAgICAgYmVjYXVzZSBpdCBpbmNsdWRlcyB1c2VyIGlucHV0KS4gICovCi0gIGxlbiA9IDA7Ci0gIGZvcm1hdCA9IG1hY3JvLT5mb3JtYXQ7Ci0gIHdoaWxlICgqZm9ybWF0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCpmb3JtYXQgIT0gJyUnKQotCXsKLQkgICsrbGVuOwotCSAgKytmb3JtYXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFyZyA9IHN0cnRvbCAoZm9ybWF0ICsgMSwgJnNlbmQsIDEwKTsKLQkgIGtub3cgKHNlbmQgIT0gZm9ybWF0ICYmIGFyZyA+PSAwICYmIGFyZyA8IGNvdW50KTsKLQkgIGxlbiArPSBzdHJsZW4gKG9wZXJhbmRzW2FyZ10pOwotCSAgZm9ybWF0ID0gc2VuZDsKLQl9Ci0gICAgfQotCi0gIC8qIFB1dCB0aGUgc3RyaW5nIHRvZ2V0aGVyLiAgKi8KLSAgY29tcGxldGUgPSBzID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKLSAgZm9ybWF0ID0gbWFjcm8tPmZvcm1hdDsKLSAgd2hpbGUgKCpmb3JtYXQgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoKmZvcm1hdCAhPSAnJScpCi0JKnMrKyA9ICpmb3JtYXQrKzsKLSAgICAgIGVsc2UKLQl7Ci0JICBhcmcgPSBzdHJ0b2wgKGZvcm1hdCArIDEsICZzZW5kLCAxMCk7Ci0JICBzdHJjcHkgKHMsIG9wZXJhbmRzW2FyZ10pOwotCSAgcyArPSBzdHJsZW4gKHMpOwotCSAgZm9ybWF0ID0gc2VuZDsKLQl9Ci0gICAgfQotICAqcyA9ICdcMCc7Ci0KLSAgLyogQXNzZW1ibGUgdGhlIGNvbnN0cnVjdGVkIGluc3RydWN0aW9uLiAgKi8KLSAgbWRfYXNzZW1ibGUgKGNvbXBsZXRlKTsKLX0gIAotDAotI2lmZGVmIE9CSl9FTEYKLS8qIEZvciBFTEYsIGFkZCBzdXBwb3J0IGZvciBTSEZfRVhDTFVERSBhbmQgU0hUX09SREVSRUQgKi8KLQotaW50Ci1wcGNfc2VjdGlvbl9sZXR0ZXIgKGxldHRlciwgcHRyX21zZykKLSAgICAgaW50IGxldHRlcjsKLSAgICAgY2hhciAqKnB0cl9tc2c7Ci17Ci0gIGlmIChsZXR0ZXIgPT0gJ2UnKQotICAgIHJldHVybiBTSEZfRVhDTFVERTsKLQotICAqcHRyX21zZyA9IF8oIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmU6IHdhbnQgYSx3LHgsZSBpbiBzdHJpbmciKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotcHBjX3NlY3Rpb25fd29yZCAoc3RyLCBsZW4pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc2l6ZV90IGxlbjsKLXsKLSAgaWYgKGxlbiA9PSA3ICYmIHN0cm5jbXAgKHN0ciwgImV4Y2x1ZGUiLCA3KSA9PSAwKQotICAgIHJldHVybiBTSEZfRVhDTFVERTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotcHBjX3NlY3Rpb25fdHlwZSAoc3RyLCBsZW4pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc2l6ZV90IGxlbjsKLXsKLSAgaWYgKGxlbiA9PSA3ICYmIHN0cm5jbXAgKHN0ciwgIm9yZGVyZWQiLCA3KSA9PSAwKQotICAgIHJldHVybiBTSFRfT1JERVJFRDsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludAotcHBjX3NlY3Rpb25fZmxhZ3MgKGZsYWdzLCBhdHRyLCB0eXBlKQotICAgICBpbnQgZmxhZ3M7Ci0gICAgIGludCBhdHRyOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gU0hUX09SREVSRUQpCi0gICAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfU09SVF9FTlRSSUVTOwotCi0gIGlmIChhdHRyICYgU0hGX0VYQ0xVREUpCi0gICAgZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgcmV0dXJuIGZsYWdzOwotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotDAotLyogUHNldWRvLW9wIGhhbmRsaW5nLiAgKi8KLQotLyogVGhlIC5ieXRlIHBzZXVkby1vcC4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgbm9ybWFsIC5ieXRlCi0gICBwc2V1ZG8tb3AsIGJ1dCBpdCBjYW4gYWxzbyB0YWtlIGEgc2luZ2xlIEFTQ0lJIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYnl0ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcIicpCi0gICAgewotICAgICAgY29ucyAoMSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEdhdGhlciBjaGFyYWN0ZXJzLiAgQSByZWFsIGRvdWJsZSBxdW90ZSBpcyBkb3VibGVkLiAgVW51c3VhbAotICAgICBjaGFyYWN0ZXJzIGFyZSBub3QgcGVybWl0dGVkLiAgKi8KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgYzsKLQotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICAgICAgaWYgKGMgPT0gJ1wiJykKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCInKQotCSAgICBicmVhazsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLQotICAgICAgRlJBR19BUFBFTkRfMV9DSEFSIChjKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLSNpZmRlZiBPQkpfWENPRkYKLQotLyogWENPRkYgc3BlY2lmaWMgcHNldWRvLW9wIGhhbmRsaW5nLiAgKi8KLQotLyogVGhpcyBpcyBzZXQgaWYgd2UgYXJlIGNyZWF0aW5nIGEgLnN0YWJ4IHN5bWJvbCwgc2luY2Ugd2UgZG9uJ3Qgd2FudAotICAgdG8gaGFuZGxlIHN5bWJvbCBzdWZmaXhlcyBmb3Igc3VjaCBzeW1ib2xzLiAgKi8KLXN0YXRpYyBib29sZWFuIHBwY19zdGFiX3N5bWJvbDsKLQotLyogVGhlIC5jb21tIGFuZCAubGNvbW0gcHNldWRvLW9wcyBmb3IgWENPRkYuICBYQ09GRiBwdXRzIGNvbW1vbgotICAgc3ltYm9scyBpbiB0aGUgLmJzcyBzZWdtZW50IGFzIHRob3VnaCB0aGV5IHdlcmUgbG9jYWwgY29tbW9uCi0gICBzeW1ib2xzLCBhbmQgdXNlcyBhIGRpZmZlcmVudCBzbWNsYXMuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2NvbW0gKGxjb21tKQotICAgICBpbnQgbGNvbW07Ci17Ci0gIGFzZWN0aW9uICpjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0gIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIGNoYXIgKmVuZF9uYW1lOwotICBvZmZzZXRUIHNpemU7Ci0gIG9mZnNldFQgYWxpZ247Ci0gIHN5bWJvbFMgKmxjb21tX3N5bSA9IE5VTEw7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgY2hhciAqcGZyYWc7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbmRfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmVuZF9uYW1lID0gZW5kYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHNpemUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoc2l6ZSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJuZWdhdGl2ZSBzaXplIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCEgbGNvbW0pCi0gICAgewotICAgICAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5jb21tIGlzIHRoZSBhbGlnbm1lbnQuICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCWFsaWduID0gMzsKLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBpZiAoYWxpZ24gPD0gMCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImlnbm9yaW5nIGJhZCBhbGlnbm1lbnQiKSk7Ci0JICAgICAgYWxpZ24gPSAzOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmxjb21tX25hbWU7Ci0gICAgICBjaGFyIGxjb21tX2VuZGM7Ci0KLSAgICAgIGlmIChzaXplIDw9IDEpCi0JYWxpZ24gPSAwOwotICAgICAgZWxzZSBpZiAoc2l6ZSA8PSAyKQotCWFsaWduID0gMTsKLSAgICAgIGVsc2UgaWYgKHNpemUgPD0gNCkKLQlhbGlnbiA9IDI7Ci0gICAgICBlbHNlCi0JYWxpZ24gPSAzOwotCi0gICAgICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gLmxjb21tIGFwcGVhcnMgdG8gYmUgdGhlIHJlYWwgbG9jYWwKLQkgY29tbW9uIHN5bWJvbCB0byBjcmVhdGUuICBSZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgbmFtZWQgaW4KLQkgdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSB0dXJuZWQgaW50byByZWZlcmVuY2VzIHRvIHRoZSB0aGlyZAotCSBhcmd1bWVudC4gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JewotCSAgYXNfYmFkIChfKCJtaXNzaW5nIHJlYWwgc3ltYm9sIG5hbWUiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICBsY29tbV9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbGNvbW1fZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgCi0gICAgICBsY29tbV9zeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChsY29tbV9uYW1lKTsKLQotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGxjb21tX2VuZGM7Ci0gICAgfQotCi0gICplbmRfbmFtZSA9ICdcMCc7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqZW5kX25hbWUgPSBlbmRjOwotCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bSkKLSAgICAgIHx8IFNfR0VUX1ZBTFVFIChzeW0pICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgCi0gIGlmICghIGxjb21tCi0gICAgICB8fCAhIFNfSVNfREVGSU5FRCAobGNvbW1fc3ltKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpkZWZfc3ltOwotICAgICAgb2Zmc2V0VCBkZWZfc2l6ZTsKLQotICAgICAgaWYgKCEgbGNvbW0pCi0JewotCSAgZGVmX3N5bSA9IHN5bTsKLQkgIGRlZl9zaXplID0gc2l6ZTsKLQkgIFNfU0VUX0VYVEVSTkFMIChzeW0pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xfZ2V0X3RjIChsY29tbV9zeW0pLT5vdXRwdXQgPSAxOwotCSAgZGVmX3N5bSA9IGxjb21tX3N5bTsKLQkgIGRlZl9zaXplID0gMDsKLQl9Ci0KLSAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAxKTsKLSAgICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLSAgCi0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKGRlZl9zeW0sIGZyYWdfbm93KTsKLSAgICAgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgZGVmX3N5bSwKLQkJCWRlZl9zaXplLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgICpwZnJhZyA9IDA7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltLCBic3Nfc2VjdGlvbik7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChkZWZfc3ltKS0+YWxpZ24gPSBhbGlnbjsKLSAgICB9Ci0gIGVsc2UgaWYgKGxjb21tKQotICAgIHsKLSAgICAgIC8qIEFsaWduIHRoZSBzaXplIG9mIGxjb21tX3N5bS4gICovCi0gICAgICBzeW1ib2xfZ2V0X2ZyYWcgKGxjb21tX3N5bSktPmZyX29mZnNldCA9Ci0JKChzeW1ib2xfZ2V0X2ZyYWcgKGxjb21tX3N5bSktPmZyX29mZnNldCArICgxIDw8IGFsaWduKSAtIDEpCi0JICZ+ICgoMSA8PCBhbGlnbikgLSAxKSk7Ci0gICAgICBpZiAoYWxpZ24gPiBzeW1ib2xfZ2V0X3RjIChsY29tbV9zeW0pLT5hbGlnbikKLQlzeW1ib2xfZ2V0X3RjIChsY29tbV9zeW0pLT5hbGlnbiA9IGFsaWduOwotICAgIH0KLQotICBpZiAobGNvbW0pCi0gICAgewotICAgICAgLyogTWFrZSBzeW0gYW4gb2Zmc2V0IGZyb20gbGNvbW1fc3ltLiAgKi8KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bSwgYnNzX3NlY3Rpb24pOwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW0sIHN5bWJvbF9nZXRfZnJhZyAobGNvbW1fc3ltKSk7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltLCBzeW1ib2xfZ2V0X2ZyYWcgKGxjb21tX3N5bSktPmZyX29mZnNldCk7Ci0gICAgICBzeW1ib2xfZ2V0X2ZyYWcgKGxjb21tX3N5bSktPmZyX29mZnNldCArPSBzaXplOwotICAgIH0KLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuY3NlY3QgcHNldWRvLW9wLiAgVGhpcyBzd2l0Y2hlcyB1cyBpbnRvIGEgZGlmZmVyZW50Ci0gICBzdWJzZWdtZW50LiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgc3ltYm9sIHdob3NlIHZhbHVlIGlzIHRoZQotICAgc3RhcnQgb2YgdGhlIC5jc2VjdC4gIEluIENPRkYsIGNzZWN0IHN5bWJvbHMgZ2V0IHNwZWNpYWwgYXV4Ci0gICBlbnRyaWVzIGRlZmluZWQgYnkgdGhlIHhfY3NlY3QgZmllbGQgb2YgdW5pb24gaW50ZXJuYWxfYXV4ZW50LiAgVGhlCi0gICBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGFsaWdubWVudCAodGhlIGRlZmF1bHQgaXMgMikuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2NzZWN0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIGlmIChTX0dFVF9OQU1FIChzeW0pWzBdID09ICdcMCcpCi0gICAgewotICAgICAgLyogQW4gdW5uYW1lZCBjc2VjdCBpcyBhc3N1bWVkIHRvIGJlIFtQUl0uICAqLwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPSBYTUNfUFI7Ci0gICAgfQotCi0gIHBwY19jaGFuZ2VfY3NlY3QgKHN5bSk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+YWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogQ2hhbmdlIHRvIGEgZGlmZmVyZW50IGNzZWN0LiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19jaGFuZ2VfY3NlY3QgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAoU19JU19ERUZJTkVEIChzeW0pKQotICAgIHN1YnNlZ19zZXQgKFNfR0VUX1NFR01FTlQgKHN5bSksIHN5bWJvbF9nZXRfdGMgKHN5bSktPnN1YnNlZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xTICoqbGlzdF9wdHI7Ci0gICAgICBpbnQgYWZ0ZXJfdG9jOwotICAgICAgaW50IGhvbGRfY2h1bmtzaXplOwotICAgICAgc3ltYm9sUyAqbGlzdDsKLQotICAgICAgLyogVGhpcyBpcyBhIG5ldyBjc2VjdC4gIFdlIG5lZWQgdG8gbG9vayBhdCB0aGUgc3ltYm9sIGNsYXNzIHRvCi0JIGZpZ3VyZSBvdXQgd2hldGhlciBpdCBzaG91bGQgZ28gaW4gdGhlIHRleHQgc2VjdGlvbiBvciB0aGUKLQkgZGF0YSBzZWN0aW9uLiAgKi8KLSAgICAgIGFmdGVyX3RvYyA9IDA7Ci0gICAgICBzd2l0Y2ggKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzKQotCXsKLQljYXNlIFhNQ19QUjoKLQljYXNlIFhNQ19STzoKLQljYXNlIFhNQ19EQjoKLQljYXNlIFhNQ19HTDoKLQljYXNlIFhNQ19YTzoKLQljYXNlIFhNQ19TVjoKLQljYXNlIFhNQ19USToKLQljYXNlIFhNQ19UQjoKLQkgIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLQkgIHN5bWJvbF9nZXRfdGMgKHN5bSktPnN1YnNlZyA9IHBwY190ZXh0X3N1YnNlZ21lbnQ7Ci0JICArK3BwY190ZXh0X3N1YnNlZ21lbnQ7Ci0JICBsaXN0X3B0ciA9ICZwcGNfdGV4dF9jc2VjdHM7Ci0JICBicmVhazsKLQljYXNlIFhNQ19SVzoKLQljYXNlIFhNQ19UQzA6Ci0JY2FzZSBYTUNfVEM6Ci0JY2FzZSBYTUNfRFM6Ci0JY2FzZSBYTUNfVUE6Ci0JY2FzZSBYTUNfQlM6Ci0JY2FzZSBYTUNfVUM6Ci0JICBpZiAocHBjX3RvY19jc2VjdCAhPSBOVUxMCi0JICAgICAgJiYgKHN5bWJvbF9nZXRfdGMgKHBwY190b2NfY3NlY3QpLT5zdWJzZWcgKyAxCi0JCSAgPT0gcHBjX2RhdGFfc3Vic2VnbWVudCkpCi0JICAgIGFmdGVyX3RvYyA9IDE7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW0sIGRhdGFfc2VjdGlvbik7Ci0JICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5zdWJzZWcgPSBwcGNfZGF0YV9zdWJzZWdtZW50OwotCSAgKytwcGNfZGF0YV9zdWJzZWdtZW50OwotCSAgbGlzdF9wdHIgPSAmcHBjX2RhdGFfY3NlY3RzOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogV2Ugc2V0IHRoZSBvYnN0YWNrIGNodW5rIHNpemUgdG8gYSBzbWFsbCB2YWx1ZSBiZWZvcmUKLSAgICAgICAgIGNoYW5naW5nIHN1YnNlZ21lbnRzLCBzbyB0aGF0IHdlIGRvbid0IHVzZSBhIGxvdCBvZiBtZW1vcnkKLSAgICAgICAgIHNwYWNlIGZvciB3aGF0IG1heSBiZSBhIHNtYWxsIHNlY3Rpb24uICAqLwotICAgICAgaG9sZF9jaHVua3NpemUgPSBjaHVua3NpemU7Ci0gICAgICBjaHVua3NpemUgPSA2NDsKLQotICAgICAgc3Vic2VnX25ldyAoc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW0pKSwKLQkJICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5zdWJzZWcpOwotCi0gICAgICBjaHVua3NpemUgPSBob2xkX2NodW5rc2l6ZTsKLQotICAgICAgaWYgKGFmdGVyX3RvYykKLQlwcGNfYWZ0ZXJfdG9jX2ZyYWcgPSBmcmFnX25vdzsKLQotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0KLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmFsaWduID0gMjsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW4gPSBzeW07Ci0JICAKLSAgICAgIGZvciAobGlzdCA9ICpsaXN0X3B0cjsKLQkgICBzeW1ib2xfZ2V0X3RjIChsaXN0KS0+bmV4dCAhPSAoc3ltYm9sUyAqKSBOVUxMOwotCSAgIGxpc3QgPSBzeW1ib2xfZ2V0X3RjIChsaXN0KS0+bmV4dCkKLQk7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChsaXN0KS0+bmV4dCA9IHN5bTsKLQkgIAotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bSwgc3ltYm9sX2dldF90YyAobGlzdCktPndpdGhpbiwgJnN5bWJvbF9yb290UCwKLQkJICAgICAmc3ltYm9sX2xhc3RQKTsKLSAgICB9Ci0KLSAgcHBjX2N1cnJlbnRfY3NlY3QgPSBzeW07Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgLnRleHQgYW5kIC5kYXRhIHBzZXVkby1vcHMuICBUaGVzZQotICAgcHNldWRvLW9wcyBhcmVuJ3QgcmVhbGx5IHVzZWQgYnkgWENPRkY7IHdlIGltcGxlbWVudCB0aGVtIGZvciB0aGUKLSAgIGNvbnZlbmllbmNlIG9mIHBlb3BsZSB3aG8gYXJlbid0IHVzZWQgdG8gWENPRkYuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3NlY3Rpb24gKHR5cGUpCi0gICAgIGludCB0eXBlOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzeW1ib2xTICpzeW07Ci0KLSAgaWYgKHR5cGUgPT0gJ3QnKQotICAgIG5hbWUgPSAiLnRleHRbUFJdIjsKLSAgZWxzZSBpZiAodHlwZSA9PSAnZCcpCi0gICAgbmFtZSA9ICIuZGF0YVtSV10iOwotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgcHBjX2NoYW5nZV9jc2VjdCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgaXMgbW9zdGx5IHRvCi0gICBnaXZlIGFuIGVycm9yLCBzaW5jZSBYQ09GRiBvbmx5IHN1cHBvcnRzIC50ZXh0LCAuZGF0YSBhbmQgLmJzcywgYnV0Ci0gICB3ZSBkbyBwZXJtaXQgdGhlIHVzZXIgdG8gbmFtZSB0aGUgdGV4dCBvciBkYXRhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX25hbWVkX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqdXNlcl9uYW1lOwotICBjb25zdCBjaGFyICpyZWFsX25hbWU7Ci0gIGNoYXIgYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHVzZXJfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmIChzdHJjbXAgKHVzZXJfbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICByZWFsX25hbWUgPSAiLnRleHRbUFJdIjsKLSAgZWxzZSBpZiAoc3RyY21wICh1c2VyX25hbWUsICIuZGF0YSIpID09IDApCi0gICAgcmVhbF9uYW1lID0gIi5kYXRhW1JXXSI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlRoZSBYQ09GRiBmaWxlIGZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBzZWN0aW9ucyIpKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAocmVhbF9uYW1lKTsKLQotICBwcGNfY2hhbmdlX2NzZWN0IChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZXh0ZXJuIHBzZXVkby1vcC4gIFdlIGNyZWF0ZSBhbiB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19leHRlcm4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAodm9pZCkgc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5sZ2xvYmwgcHNldWRvLW9wLiAgS2VlcCB0aGUgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2xnbG9ibCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLnJlbmFtZSBwc2V1ZG8tb3AuICBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgY2FuIHJlbmFtZSBzeW1ib2xzLAotICAgYWx0aG91Z2ggSSBkb24ndCBrbm93IHdoeSBpdCBib3RoZXJzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19yZW5hbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBzeW1ib2xTICpzeW07Ci0gIGludCBsZW47Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgcmVuYW1lIHN0cmluZyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5zdGFieCBwc2V1ZG8tb3AuICBUaGlzIGlzIHNpbWlsYXIgdG8gYSBub3JtYWwgLnN0YWJzCi0gICBwc2V1ZG8tb3AsIGJ1dCBzbGlnaHRseSBkaWZmZXJlbnQuICBBIHNhbXBsZSBpcwotICAgICAgIC5zdGFieCAibWFpbjpGLTEiLC5tYWluLDE0MiwwCi0gICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHN5bWJvbCBuYW1lIHRvIGNyZWF0ZS4gIFRoZSBzZWNvbmQgaXMgdGhlCi0gICB2YWx1ZSwgYW5kIHRoZSB0aGlyZCBpcyB0aGUgc3RvcmFnZSBjbGFzcy4gIFRoZSBmb3VydGggc2VlbXMgdG8gYmUKLSAgIGFsd2F5cyB6ZXJvLCBhbmQgSSBhbSBhc3N1bWluZyBpdCBpcyB0aGUgdHlwZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfc3RhYnggKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGxlbjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHZhbHVlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgcHBjX3N0YWJfc3ltYm9sID0gdHJ1ZTsKLSAgc3ltID0gc3ltYm9sX21ha2UgKG5hbWUpOwotICBwcGNfc3RhYl9zeW1ib2wgPSBmYWxzZTsKLQotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUgPSBuYW1lOwotCi0gICh2b2lkKSBleHByZXNzaW9uICgmZXhwKTsKLQotICBzd2l0Y2ggKGV4cC5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICBjYXNlIE9fYWJzZW50OgotICAgIGNhc2UgT19iaWc6Ci0gICAgICBhc19iYWQgKF8oImlsbGVnYWwgLnN0YWJ4IGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBleHAuWF9hZGRfbnVtYmVyKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCXN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltLCAmZXhwKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBTX1NFVF9WQUxVRSAoc3ltLAotCQkgICAgICAgZXhwLlhfYWRkX251bWJlciArIFNfR0VUX1ZBTFVFIChleHAuWF9hZGRfc3ltYm9sKSk7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgc3ltYm9sX2dldF9mcmFnIChleHAuWF9hZGRfc3ltYm9sKSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhlIHZhbHVlIGlzIHNvbWUgY29tcGxleCBleHByZXNzaW9uLiAgVGhpcyB3aWxsIHByb2JhYmx5Ci0gICAgICAgICBmYWlsIGF0IHNvbWUgbGF0ZXIgcG9pbnQsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IHRoZSByaWdodAotICAgICAgICAgdGhpbmcgdG8gZG8gaGVyZS4gICovCi0gICAgICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSwgJmV4cCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgU19TRVRfU0VHTUVOVCAoc3ltLCBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBjbGFzcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdHlwZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNfU0VUX0RBVEFfVFlQRSAoc3ltLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX1NUU1lNKQotICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPndpdGhpbiA9IHBwY19jdXJyZW50X2Jsb2NrOwotCi0gIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbAotICAgICAgfHwgISBTX0lTX0VYVEVSTkFMIChleHAuWF9hZGRfc3ltYm9sKQotICAgICAgfHwgU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkgIT0gYnNzX3NlY3Rpb24pCi0gICAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoc3ltLCBleHAuWF9hZGRfc3ltYm9sLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIGlmIChzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPndpdGhpbiA9PSBleHAuWF9hZGRfc3ltYm9sKQotCXN5bWJvbF9nZXRfdGMgKHBwY19jdXJyZW50X2NzZWN0KS0+d2l0aGluID0gc3ltOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmZ1bmN0aW9uIHBzZXVkby1vcC4gIFRoaXMgdGFrZXMgc2V2ZXJhbCBhcmd1bWVudHMuICBUaGUgZmlyc3QKLSAgIGFyZ3VtZW50IHNlZW1zIHRvIGJlIHRoZSBleHRlcm5hbCBuYW1lIG9mIHRoZSBzeW1ib2wuICBUaGUgc2Vjb25kCi0gICBhcmdtZW50IHNlZW1zIHRvIGJlIHRoZSBsYWJlbCBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gIGdjYwotICAgdXNlcyB0aGUgc2FtZSBuYW1lIGZvciBib3RoLiAgSSBoYXZlIG5vIGlkZWEgd2hhdCB0aGUgdGhpcmQgYW5kCi0gICBmb3VydGggYXJndW1lbnRzIGFyZSBtZWFudCB0byBiZS4gIFRoZSBvcHRpb25hbCBmaWZ0aCBhcmd1bWVudCBpcwotICAgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHNpemUgb2YgdGhlIGZ1bmN0aW9uLiAgSW4gQ09GRiB0aGlzIHN5bWJvbAotICAgZ2V0cyBhbiBhdXggZW50cnkgbGlrZSB0aGF0IHVzZWQgZm9yIGEgY3NlY3QuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2Z1bmN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgY2hhciAqczsKLSAgc3ltYm9sUyAqZXh0X3N5bTsKLSAgc3ltYm9sUyAqbGFiX3N5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyogSWdub3JlIGFueSBbUFJdIHN1ZmZpeC4gICovCi0gIG5hbWUgPSBwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChuYW1lKTsKLSAgcyA9IHN0cmNociAobmFtZSwgJ1snKTsKLSAgaWYgKHMgIT0gKGNoYXIgKikgTlVMTAotICAgICAgJiYgc3RyY21wIChzICsgMSwgIlBSXSIpID09IDApCi0gICAgKnMgPSAnXDAnOwotCi0gIGV4dF9zeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHN5bWJvbCBuYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBsYWJfc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgaWYgKGV4dF9zeW0gIT0gbGFiX3N5bSkKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBleHA7Ci0KLSAgICAgIGV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgICBleHAuWF9hZGRfc3ltYm9sID0gbGFiX3N5bTsKLSAgICAgIGV4cC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGV4cC5YX3Vuc2lnbmVkID0gMDsKLSAgICAgIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoZXh0X3N5bSwgJmV4cCk7Ci0gICAgfQotCi0gIGlmIChzeW1ib2xfZ2V0X3RjIChleHRfc3ltKS0+Y2xhc3MgPT0gLTEpCi0gICAgc3ltYm9sX2dldF90YyAoZXh0X3N5bSktPmNsYXNzID0gWE1DX1BSOwotICBzeW1ib2xfZ2V0X3RjIChleHRfc3ltKS0+b3V0cHV0ID0gMTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgaWdub3JlOwotCi0gICAgICAvKiBJZ25vcmUgdGhlIHRoaXJkIGFyZ3VtZW50LiAgKi8KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZXhwcmVzc2lvbiAoJmlnbm9yZSk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JewotCSAgLyogSWdub3JlIHRoZSBmb3VydGggYXJndW1lbnQuICAqLwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBleHByZXNzaW9uICgmaWdub3JlKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQkgICAgewotCSAgICAgIC8qIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgZnVuY3Rpb24gc2l6ZS4gICovCi0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgc3ltYm9sX2dldF90YyAoZXh0X3N5bSktPnNpemUgPSBzeW1ib2xfbmV3ICgiTDBcMDAxIiwKLQkJCQkJCQkgIGFic29sdXRlX3NlY3Rpb24sCi0JCQkJCQkJICAodmFsdWVUKSAwLAotCQkJCQkJCSAgJnplcm9fYWRkcmVzc19mcmFnKTsKLQkgICAgICBwc2V1ZG9fc2V0IChzeW1ib2xfZ2V0X3RjIChleHRfc3ltKS0+c2l6ZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIFNfU0VUX0RBVEFfVFlQRSAoZXh0X3N5bSwgRFRfRkNOIDw8IE5fQlRTSEZUKTsKLSAgU0ZfU0VUX0ZVTkNUSU9OIChleHRfc3ltKTsKLSAgU0ZfU0VUX1BST0NFU1MgKGV4dF9zeW0pOwotICBjb2ZmX2FkZF9saW5lc3ltIChleHRfc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmJmIHBzZXVkby1vcC4gIFRoaXMgaXMganVzdCBsaWtlIGEgQ09GRiBDX0ZDTiBzeW1ib2wgbmFtZWQKLSAgICIuYmYiLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19iZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0KLSAgc3ltID0gc3ltYm9sX21ha2UgKCIuYmYiKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOwotICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgZnJhZ19ub3cpOwotICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfRkNOKTsKLQotICBjb2ZmX2xpbmVfYmFzZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoc3ltLCBjb2ZmX2xpbmVfYmFzZSk7Ci0KLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmVmIHBzZXVkby1vcC4gIFRoaXMgaXMganVzdCBsaWtlIGEgQ09GRiBDX0ZDTiBzeW1ib2wgbmFtZWQKLSAgICIuZWYiLCBleGNlcHQgdGhhdCB0aGUgbGluZSBudW1iZXIgaXMgYWJzb2x1dGUsIG5vdCByZWxhdGl2ZSB0byB0aGUKLSAgIG1vc3QgcmVjZW50ICIuYmYiIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmVmIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0ZDTik7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoc3ltLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5iaSBhbmQgLmVpIHBzZXVkby1vcHMuICBUaGVzZSB0YWtlIGEgc3RyaW5nIGFyZ3VtZW50IGFuZAotICAgZ2VuZXJhdGVzIGEgQ19CSU5DTCBvciBDX0VJTkNMIHN5bWJvbCwgd2hpY2ggZ29lcyBhdCB0aGUgc3RhcnQgb2YKLSAgIHRoZSBzeW1ib2wgbGlzdC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYmllaSAoZWkpCi0gICAgIGludCBlaTsKLXsKLSAgc3RhdGljIHN5bWJvbFMgKmxhc3RfYmllaTsKLQotICBjaGFyICpuYW1lOwotICBpbnQgbGVuOwotICBzeW1ib2xTICpzeW07Ci0gIHN5bWJvbFMgKmxvb2s7Ci0KLSAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlc2Ugc3ltYm9scyBpcyBhY3R1YWxseSBmaWxlIG9mZnNldC4gIEhlcmUgd2Ugc2V0Ci0gICAgIHRoZSB2YWx1ZSB0byB0aGUgaW5kZXggaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcy4gIEluCi0gICAgIHBwY19mcm9iX3N5bWJvbHMgd2Ugc2V0IHRoZSBmaXhfbGluZSBmaWVsZCwgd2hpY2ggd2lsbCBjYXVzZSBCRkQKLSAgICAgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQotICBzeW0gPSBzeW1ib2xfbWFrZSAobmFtZSk7Ci0gIC8qIG9iai1jb2ZmLmMgY3VycmVudGx5IG9ubHkgaGFuZGxlcyBsaW5lIG51bWJlcnMgY29ycmVjdGx5IGluIHRoZQotICAgICAudGV4dCBzZWN0aW9uLiAgKi8KLSAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOwotICBTX1NFVF9WQUxVRSAoc3ltLCBjb2ZmX25fbGluZV9ub3MpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIGVpID8gQ19FSU5DTCA6IENfQklOQ0wpOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotICAKLSAgZm9yIChsb29rID0gbGFzdF9iaWVpID8gbGFzdF9iaWVpIDogc3ltYm9sX3Jvb3RQOwotICAgICAgIChsb29rICE9IChzeW1ib2xTICopIE5VTEwKLQkmJiAoU19HRVRfU1RPUkFHRV9DTEFTUyAobG9vaykgPT0gQ19GSUxFCi0JICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGxvb2spID09IENfQklOQ0wKLQkgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAobG9vaykgPT0gQ19FSU5DTCkpOwotICAgICAgIGxvb2sgPSBzeW1ib2xfbmV4dCAobG9vaykpCi0gICAgOwotICBpZiAobG9vayAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW0sIGxvb2ssICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgbGFzdF9iaWVpID0gc3ltOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmJzIHBzZXVkby1vcC4gIFRoaXMgZ2VuZXJhdGVzIGEgQ19CU1RBVCBzeW1ib2wgbmFtZWQgIi5icyIuCi0gICBUaGVyZSBpcyBvbmUgYXJndW1lbnQsIHdoaWNoIGlzIGEgY3NlY3Qgc3ltYm9sLiAgVGhlIHZhbHVlIG9mIHRoZQotICAgLmJzIHN5bWJvbCBpcyB0aGUgaW5kZXggb2YgdGhpcyBjc2VjdCBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2JzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqY3NlY3Q7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBpZiAocHBjX2N1cnJlbnRfYmxvY2sgIT0gTlVMTCkKLSAgICBhc19iYWQgKF8oIm5lc3RlZCAuYnMgYmxvY2tzIikpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBjc2VjdCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmJzIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgbm93X3NlZyk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19CU1RBVCk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPndpdGhpbiA9IGNzZWN0OwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIHBwY19jdXJyZW50X2Jsb2NrID0gc3ltOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZXMgcHNldWRvLW9wLiAgR2VuZXJhdGUgYSBDX0VTVEFSVCBzeW1ib2wgbmFtZWQgLmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19lcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0KLSAgaWYgKHBwY19jdXJyZW50X2Jsb2NrID09IE5VTEwpCi0gICAgYXNfYmFkIChfKCIuZXMgd2l0aG91dCBwcmVjZWRpbmcgLmJzIikpOwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlICgiLmVzIik7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgbm93X3NlZyk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19FU1RBVCk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIHBwY19jdXJyZW50X2Jsb2NrID0gTlVMTDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmJiIHBzZXVkby1vcC4gIEdlbmVyYXRlIGEgQ19CTE9DSyBzeW1ib2wgbmFtZWQgLmJiLCB3aXRoIGEKLSAgIGxpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19iYiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0KLSAgc3ltID0gc3ltYm9sX21ha2UgKCIuYmIiKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOwotICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgZnJhZ19ub3cpOwotICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfQkxPQ0spOwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoc3ltLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBTRl9TRVRfUFJPQ0VTUyAoc3ltKTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmViIHBzZXVkby1vcC4gIEdlbmVyYXRlIGEgQ19CTE9DSyBzeW1ib2wgbmFtZWQgLmViLCB3aXRoIGEKLSAgIGxpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19lYiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0KLSAgc3ltID0gc3ltYm9sX21ha2UgKCIuZWIiKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOwotICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgZnJhZ19ub3cpOwotICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfQkxPQ0spOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIFNGX1NFVF9QUk9DRVNTIChzeW0pOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuYmMgcHNldWRvLW9wLiAgVGhpcyBqdXN0IGNyZWF0ZXMgYSBDX0JDT01NIHN5bWJvbCB3aXRoIGEKLSAgIHNwZWNpZmllZCBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19iYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgbGVuOwotICBzeW1ib2xTICpzeW07Ci0KLSAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLSAgc3ltID0gc3ltYm9sX21ha2UgKG5hbWUpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24pOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0JDT01NKTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgMCk7Ci0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5lYyBwc2V1ZG8tb3AuICBUaGlzIGp1c3QgY3JlYXRlcyBhIENfRUNPTU0gc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19lYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0KLSAgc3ltID0gc3ltYm9sX21ha2UgKCIuZWMiKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19FQ09NTSk7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIDApOwotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAudG9jIHBzZXVkby1vcC4gIFN3aXRjaCB0byB0aGUgLnRvYyBzdWJzZWdtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY190b2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHBwY190b2NfY3NlY3QgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIHN5bWJvbF9nZXRfdGMgKHBwY190b2NfY3NlY3QpLT5zdWJzZWcpOwotICBlbHNlCi0gICAgewotICAgICAgc3Vic2VnVCBzdWJzZWc7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBzeW1ib2xTICpsaXN0OwotICAgIAotICAgICAgc3Vic2VnID0gcHBjX2RhdGFfc3Vic2VnbWVudDsKLSAgICAgICsrcHBjX2RhdGFfc3Vic2VnbWVudDsKLQotICAgICAgc3Vic2VnX25ldyAoc2VnbWVudF9uYW1lIChkYXRhX3NlY3Rpb24pLCBzdWJzZWcpOwotICAgICAgcHBjX3RvY19mcmFnID0gZnJhZ19ub3c7Ci0KLSAgICAgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKCJUT0NbVEMwXSIpOwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW0sIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bSwgZGF0YV9zZWN0aW9uKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5zdWJzZWcgPSBzdWJzZWc7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+d2l0aGluID0gc3ltOwotCi0gICAgICBwcGNfdG9jX2NzZWN0ID0gc3ltOwotCSAgCi0gICAgICBmb3IgKGxpc3QgPSBwcGNfZGF0YV9jc2VjdHM7Ci0JICAgc3ltYm9sX2dldF90YyAobGlzdCktPm5leHQgIT0gKHN5bWJvbFMgKikgTlVMTDsKLQkgICBsaXN0ID0gc3ltYm9sX2dldF90YyAobGlzdCktPm5leHQpCi0JOwotICAgICAgc3ltYm9sX2dldF90YyAobGlzdCktPm5leHQgPSBzeW07Ci0KLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChzeW0sIHN5bWJvbF9nZXRfdGMgKGxpc3QpLT53aXRoaW4sICZzeW1ib2xfcm9vdFAsCi0JCSAgICAgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQotCi0gIHBwY19jdXJyZW50X2NzZWN0ID0gcHBjX3RvY19jc2VjdDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgQUlYIGFzc2VtYmxlciBhdXRvbWF0aWNhbGx5IGFsaWducyB0aGUgb3BlcmFuZHMgb2YgYSAubG9uZyBvcgotICAgLnNob3J0IHBzZXVkby1vcCwgYW5kIHdlIHdhbnQgdG8gYmUgY29tcGF0aWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfeGNvZmZfY29ucyAobG9nX3NpemUpCi0gICAgIGludCBsb2dfc2l6ZTsKLXsKLSAgZnJhZ19hbGlnbiAobG9nX3NpemUsIDAsIDApOwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBsb2dfc2l6ZSk7Ci0gIGNvbnMgKDEgPDwgbG9nX3NpemUpOwotfQotCi1zdGF0aWMgdm9pZAotcHBjX3ZieXRlIChkdW1teSkKLSAgICAgaW50IGR1bW15OwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBieXRlX2NvdW50OwotCi0gICh2b2lkKSBleHByZXNzaW9uICgmZXhwKTsKLQotICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm5vbi1jb25zdGFudCBieXRlIGNvdW50IikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBieXRlX2NvdW50ID0gZXhwLlhfYWRkX251bWJlcjsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHZhbHVlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgY29ucyAoYnl0ZV9jb3VudCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfWENPRkYgKi8KLQwKLS8qIFRoZSAudGMgcHNldWRvLW9wLiAgVGhpcyBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBlaXRoZXIgWENPRkYgb3IKLSAgIEVMRi4gIFRoaXMgdGFrZXMgdHdvIG9yIG1vcmUgYXJndW1lbnRzLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgWENPRkYgb3V0cHV0LCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIG5hbWUgdG8KLSAgIGdpdmUgdG8gdGhpcyBsb2NhdGlvbiBpbiB0aGUgdG9jOyB0aGlzIHdpbGwgYmUgYSBzeW1ib2wgd2l0aCBjbGFzcwotICAgVEMuICBUaGUgcmVzdCBvZiB0aGUgYXJndW1lbnRzIGFyZSA0IGJ5dGUgdmFsdWVzIHRvIGFjdHVhbGx5IHB1dCBhdAotICAgdGhpcyBsb2NhdGlvbiBpbiB0aGUgVE9DOyBvZnRlbiB0aGVyZSBpcyBqdXN0IG9uZSBtb3JlIGFyZ3VtZW50LCBhCi0gICByZWxvY2F0ZWFibGUgc3ltYm9sIHJlZmVyZW5jZS4KLQotICAgV2hlbiBub3QgZ2VuZXJhdGluZyBYQ09GRiBvdXRwdXQsIHRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lLCBidXQKLSAgIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBzaW1wbHkgaWdub3JlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfdGMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIE9CSl9YQ09GRgotCi0gIC8qIERlZmluZSB0aGUgVE9DIHN5bWJvbCBuYW1lLiAgKi8KLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgY2hhciBlbmRjOwotICAgIHN5bWJvbFMgKnN5bTsKLQotICAgIGlmIChwcGNfdG9jX2NzZWN0ID09IChzeW1ib2xTICopIE5VTEwKLQl8fCBwcGNfdG9jX2NzZWN0ICE9IHBwY19jdXJyZW50X2NzZWN0KQotICAgICAgewotCWFzX2JhZCAoXygiLnRjIG5vdCBpbiAudG9jIHNlY3Rpb24iKSk7Ci0JaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgICBpZiAoU19JU19ERUZJTkVEIChzeW0pKQotICAgICAgewotCXN5bWJvbFMgKmxhYmVsOwotCi0JbGFiZWwgPSBzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPndpdGhpbjsKLQlpZiAoc3ltYm9sX2dldF90YyAobGFiZWwpLT5jbGFzcyAhPSBYTUNfVEMwKQotCSAgewotCSAgICBhc19iYWQgKF8oIi50YyB3aXRoIG5vIGxhYmVsIikpOwotCSAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICByZXR1cm47Ci0JICB9Ci0KLQlTX1NFVF9TRUdNRU5UIChsYWJlbCwgU19HRVRfU0VHTUVOVCAoc3ltKSk7Ci0Jc3ltYm9sX3NldF9mcmFnIChsYWJlbCwgc3ltYm9sX2dldF9mcmFnIChzeW0pKTsKLQlTX1NFVF9WQUxVRSAobGFiZWwsIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQotCXdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0JcmV0dXJuOwotICAgICAgfQotCi0gICAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKTsKLSAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgZnJhZ19ub3cpOwotICAgIFNfU0VUX1ZBTFVFIChzeW0sICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPSBYTUNfVEM7Ci0gICAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICAgIHBwY19mcm9iX2xhYmVsIChzeW0pOwotICB9Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoT0JKX1hDT0ZGKSAqLwotCi0gIC8qIFNraXAgdGhlIFRPQyBzeW1ib2wgbmFtZS4gICovCi0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1snCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ10nCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ3snCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ30nKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIEFsaWduIHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOwotCi0jZW5kaWYgLyogISBkZWZpbmVkIChPQkpfWENPRkYpICovCi0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGNvbnMgKDQpOwotICAgIH0KLX0KLQwKLSNpZmRlZiBURV9QRQotCi0vKiBQc2V1ZG8tb3BzIHNwZWNpZmljIHRvIHRoZSBXaW5kb3dzIE5UIFBvd2VyUEMgUEUgKGNvZmYpIGZvcm1hdCAqLwotCi0vKiBTZXQgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotcHBjX3NldF9jdXJyZW50X3NlY3Rpb24gKG5ldykKLSAgICAgc2VnVCBuZXc7Ci17Ci0gIHBwY19wcmV2aW91c19zZWN0aW9uID0gcHBjX2N1cnJlbnRfc2VjdGlvbjsKLSAgcHBjX2N1cnJlbnRfc2VjdGlvbiA9IG5ldzsKLX0KLQotLyogcHNldWRvLW9wOiAucHJldmlvdXMKLSAgIGJlaGF2aW91cjogdG9nZ2xlcyB0aGUgY3VycmVudCBzZWN0aW9uIHdpdGggdGhlIHByZXZpb3VzIHNlY3Rpb24uCi0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgIk5vIHByZXZpb3VzIHNlY3Rpb24iCi0qLwotc3RhdGljIHZvaWQKLXBwY19wcmV2aW91cyhpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnRtcDsKLQotICBpZiAocHBjX3ByZXZpb3VzX3NlY3Rpb24gPT0gTlVMTCkgCi0gICAgewotICAgICAgYXNfd2FybihfKCJObyBwcmV2aW91cyBzZWN0aW9uIHRvIHJldHVybiB0by4gRGlyZWN0aXZlIGlnbm9yZWQuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdWJzZWdfc2V0KHBwY19wcmV2aW91c19zZWN0aW9uLCAwKTsKLQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihwcGNfcHJldmlvdXNfc2VjdGlvbik7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnBkYXRhCi0gICBiZWhhdmlvdXI6IHByZWRlZmluZWQgcmVhZCBvbmx5IGRhdGEgc2VjdGlvbgotICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkCi0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgTm9uZQotICAgaW5pdGlhbDogICAuc2VjdGlvbiAucGRhdGEgImFkcjMiCi0gICAgICAgICAgICAgIGEgLSBkb24ndCBrbm93IC0tIG1heWJlIGEgbWlzcHJpbnQKLQkgICAgICBkIC0gaW5pdGlhbGl6ZWQgZGF0YQotCSAgICAgIHIgLSByZWFkYWJsZQotCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDQgYnl0ZSBib3VuZGFyeSkKLQotICAgY29tbWVudGFyeToKLSAgIFRhZyBpbmRleCB0YWJsZXMgKGFsc28ga25vd24gYXMgdGhlIGZ1bmN0aW9uIHRhYmxlKSBmb3IgZXhjZXB0aW9uCi0gICBoYW5kbGluZywgZGVidWdnaW5nLCBldGMuCi0KLSovCi1zdGF0aWMgdm9pZAotcHBjX3BkYXRhKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHBkYXRhX3NlY3Rpb24gPT0gMCkgCi0gICAgewotICAgICAgcGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIucGRhdGEiLCAwKTsKLSAgICAgIAotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHBkYXRhX3NlY3Rpb24sCi0JCQkgICAgIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKLSAgICAgIAotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBwZGF0YV9zZWN0aW9uLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldygiLnBkYXRhIiwgMCk7Ci0gICAgfQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihwZGF0YV9zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAueWRhdGEKLSAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIG9ubHkgZGF0YSBzZWN0aW9uCi0gICAgICAgICAgICAgIGRvdWJsZSB3b3JkIGFsaWduZWQKLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0gICBpbml0aWFsOiAgIC5zZWN0aW9uIC55ZGF0YSAiZHJ3MyIKLSAgICAgICAgICAgICAgYSAtIGRvbid0IGtub3cgLS0gbWF5YmUgYSBtaXNwcmludAotCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCi0JICAgICAgciAtIHJlYWRhYmxlCi0JICAgICAgMyAtIGRvdWJsZSB3b3JkIGFsaWduZWQgKHRoYXQgd291bGQgYmUgNCBieXRlIGJvdW5kYXJ5KQotICAgY29tbWVudGFyeToKLSAgIFRhZyB0YWJsZXMgKGFsc28ga25vd24gYXMgdGhlIHNjb3BlIHRhYmxlKSBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nLAotICAgZGVidWdnaW5nLCBldGMuCi0qLwotc3RhdGljIHZvaWQKLXBwY195ZGF0YShpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICh5ZGF0YV9zZWN0aW9uID09IDApIAotICAgIHsKLSAgICAgIHlkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnlkYXRhIiwgMCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgeWRhdGFfc2VjdGlvbiwKLQkJCSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKLQotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCB5ZGF0YV9zZWN0aW9uLCAzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5ZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi55ZGF0YSIsIDApOwotICAgIH0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24oeWRhdGFfc2VjdGlvbik7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnJlbGRhdGEKLSAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIHdyaXRlIGRhdGEgc2VjdGlvbgotICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkICg0LWJ5dGUpCi0JICAgICAgRklYTUU6IHJlbG9jYXRpb24gaXMgYXBwbGllZCB0byBpdAotCSAgICAgIEZJWE1FOiB3aGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCAuZGF0YT8KLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0gICBpbml0aWFsOiAgIC5zZWN0aW9uIC5yZWxkYXRhICJkcnczIgotCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCi0JICAgICAgciAtIHJlYWRhYmxlCi0JICAgICAgdyAtIHdyaXRlYWJsZQotCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDggYnl0ZSBib3VuZGFyeSkKLQotICAgY29tbWVudGFyeToKLSAgIExpa2UgLmRhdGEsIGJ1dCBpbnRlbmRlZCB0byBob2xkIGRhdGEgc3ViamVjdCB0byByZWxvY2F0aW9uLCBzdWNoIGFzCi0gICBmdW5jdGlvbiBkZXNjcmlwdG9ycywgZXRjLgotKi8KLXN0YXRpYyB2b2lkCi1wcGNfcmVsZGF0YShpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChyZWxkYXRhX3NlY3Rpb24gPT0gMCkKLSAgICB7Ci0gICAgICByZWxkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJlbGRhdGEiLCAwKTsKLQotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHJlbGRhdGFfc2VjdGlvbiwKLQkJCSAgICAgKCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAKLQkJCSAgICAgIHwgU0VDX0RBVEEgKSk7Ci0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgcmVsZGF0YV9zZWN0aW9uLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJlbGRhdGEiLCAwKTsKLSAgICB9Ci0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHJlbGRhdGFfc2VjdGlvbik7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnJkYXRhCi0gICBiZWhhdmlvdXI6IHByZWRlZmluZWQgcmVhZCBvbmx5IGRhdGEgc2VjdGlvbgotICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkCi0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgTm9uZQotICAgaW5pdGlhbDogICAuc2VjdGlvbiAucmRhdGEgImRyMyIKLQkgICAgICBkIC0gaW5pdGlhbGl6ZWQgZGF0YQotCSAgICAgIHIgLSByZWFkYWJsZQotCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDQgYnl0ZSBib3VuZGFyeSkKLSovCi1zdGF0aWMgdm9pZAotcHBjX3JkYXRhKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHJkYXRhX3NlY3Rpb24gPT0gMCkKLSAgICB7Ci0gICAgICByZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHJkYXRhX3NlY3Rpb24sCi0JCQkgICAgIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKLQotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCByZGF0YV9zZWN0aW9uLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOwotICAgIH0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24ocmRhdGFfc2VjdGlvbik7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnVhbG9uZwotICAgYmVoYXZpb3VyOiBtdWNoIGxpa2UgLmludCwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgbm8gYWxpZ25tZW50IGlzIAotICAgICAgICAgICAgICBwZXJmb3JtZWQuCi0JICAgICAgRklYTUU6IHRlc3QgdGhlIGFsaWdubWVudCBzdGF0ZW1lbnQKLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0qLwotc3RhdGljIHZvaWQKLXBwY191YWxvbmcoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiB0cnkgZm9yIGxvbmcgKi8KLSAgY29ucyAoIDQgKTsKLX0KLQotLyogcHNldWRvLW9wOiAuem5vcCAgPHN5bWJvbCBuYW1lPgotICAgYmVoYXZpb3VyOiBJc3N1ZSBhIG5vcCBpbnN0cnVjdGlvbgotICAgICAgICAgICAgICBJc3N1ZSBhIElNQUdFX1JFTF9QUENfSUZHTFVFIHJlbG9jYXRpb24gYWdhaW5zdCBpdCwgdXNpbmcKLQkgICAgICB0aGUgc3VwcGxpZWQgc3ltYm9sIG5hbWUuCi0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgTWlzc2luZyBzeW1ib2wgbmFtZQotKi8KLXN0YXRpYyB2b2lkCi1wcGNfem5vcChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGU7Ci0gIGV4cHJlc3Npb25TIGV4OwotICBjaGFyICpmOwotCi0gIHN5bWJvbFMgKnN5bTsKLQotICAvKiBTdHJpcCBvdXQgdGhlIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBleHA7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHN5bWJvbF9uYW1lICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgc3ltYm9sX25hbWUpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBMb29rIHVwIHRoZSBvcGNvZGUgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICBvcGNvZGUgPSAoY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICopIGhhc2hfZmluZCAocHBjX2hhc2gsICJub3AiKTsKLQotICAvKiBzdGljayBpbiB0aGUgbm9wICovCi0gIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0gIGZpeF9uZXcgKGZyYWdfbm93LAotCSAgIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkgICA0LAotCSAgIHN5bSwKLQkgICAwLAotCSAgIDAsCi0JICAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCk7Ci0KLX0KLQotLyogcHNldWRvLW9wOiAKLSAgIGJlaGF2aW91cjogCi0gICBlcnJvcnM6ICAgIAotICAgd2FybmluZ3M6ICAKLSovCi1zdGF0aWMgdm9pZAotcHBjX3BlX2NvbW0obGNvbW0pCi0gICAgIGludCBsY29tbTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBvZmZzZXRUIHRlbXA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIG9mZnNldFQgYWxpZ247Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICghIGxjb21tKQotICAgIHsKLSAgICAgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAuY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQlhbGlnbiA9IDM7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKGFsaWduIDw9IDApCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOwotCSAgICAgIGFsaWduID0gMzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSB0ZW1wKQotCWFzX2JhZCAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkJKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwKLQkJKGxvbmcpIHRlbXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSB0ZW1wKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyoKLSAqIGltcGxlbWVudCB0aGUgLnNlY3Rpb24gcHNldWRvIG9wOgotICoJLnNlY3Rpb24gbmFtZSB7LCAiZmxhZ3MifQotICogICAgICAgICAgICAgICAgXiAgICAgICAgIF4KLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICArLS0tIG9wdGlvbmFsIGZsYWdzOiAnYicgZm9yIGJzcwotICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJyBmb3IgaW5mbwotICogICAgICAgICAgICAgICAgKy0tIHNlY3Rpb24gbmFtZSAgICAgICAgICAgICAgICdsJyBmb3IgbGliCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nIGZvciBub2xvYWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycgZm9yIG92ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycgZm9yIGRhdGEKLSAqCQkJCQkJICdkJyAoYXBwYXJlbnRseSBtODhrIGZvciBkYXRhKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JyBmb3IgdGV4dAotICogQnV0IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBxdW90ZWQgc3RyaW5nLCB0cmVhdCBpdCBhcyBhCi0gKiBzdWJzZWdtZW50IG51bWJlci4KLSAqCi0gKiBGSVhNRTogdGhpcyBpcyBhIGNvcHkgb2YgdGhlIHNlY3Rpb24gcHJvY2Vzc2luZyBmcm9tIG9iai1jb2ZmLmMsIHdpdGgKLSAqIGFkZGl0aW9ucy9jaGFuZ2VzIGZvciB0aGUgbW90by1wYXMgYXNzZW1ibGVyIHN1cHBvcnQuIFRoZXJlIGFyZSB0aHJlZQotICogY2F0ZWdvcmllczoKLSAqCi0gKiBGSVhNRTogSSBqdXN0IG5vdGljZWQgdGhpcy4gVGhpcyBkb2Vzbid0IHdvcmsgYXQgYWxsIHJlYWxseS4gSXQgaXQgCi0gKiAgICAgICAgc2V0dGluZyBiaXRzIHRoYXQgYmZkIHByb2JhYmx5IG5laXRoZXIgdW5kZXJzdGFuZHMgb3IgdXNlcy4gVGhlCi0gKiAgICAgICAgY29ycmVjdCBhcHByb2FjaCAoPykgd2lsbCBoYXZlIHRvIGluY29ycG9yYXRlIGV4dHJhIGZpZWxkcyBhdHRhY2hlZAotICogICAgICAgIHRvIHRoZSBzZWN0aW9uIHRvIGhvbGQgdGhlIHN5c3RlbSBzcGVjaWZpYyBzdHVmZi4gKGtyaykKLSAqCi0gKiBTZWN0aW9uIENvbnRlbnRzOgotICogJ2EnIC0gdW5rbm93biAtIHJlZmVycmVkIHRvIGluIGRvY3VtZW50YXRpb24sIGJ1dCBubyBkZWZpbml0aW9uIHN1cHBsaWVkCi0gKiAnYycgLSBzZWN0aW9uIGhhcyBjb2RlCi0gKiAnZCcgLSBzZWN0aW9uIGhhcyBpbml0aWFsaXplZCBkYXRhCi0gKiAndScgLSBzZWN0aW9uIGhhcyB1bmluaXRpYWxpemVkIGRhdGEKLSAqICdpJyAtIHNlY3Rpb24gY29udGFpbnMgZGlyZWN0aXZlcyAoaW5mbykKLSAqICduJyAtIHNlY3Rpb24gY2FuIGJlIGRpc2NhcmRlZAotICogJ1InIC0gcmVtb3ZlIHNlY3Rpb24gYXQgbGluayB0aW1lCi0gKgotICogU2VjdGlvbiBQcm90ZWN0aW9uOgotICogJ3InIC0gc2VjdGlvbiBpcyByZWFkYWJsZQotICogJ3cnIC0gc2VjdGlvbiBpcyB3cml0ZWFibGUKLSAqICd4JyAtIHNlY3Rpb24gaXMgZXhlY3V0YWJsZQotICogJ3MnIC0gc2VjdGlvbiBpcyBzaGFyYWJsZQotICoKLSAqIFNlY3Rpb24gQWxpZ25tZW50OgotICogJzAnIC0gYWxpZ24gdG8gYnl0ZSBib3VuZGFyeQotICogJzEnIC0gYWxpZ24gdG8gaGFsZndvcmQgdW5kYXJ5Ci0gKiAnMicgLSBhbGlnbiB0byB3b3JkIGJvdW5kYXJ5Ci0gKiAnMycgLSBhbGlnbiB0byBkb3VibGV3b3JkIGJvdW5kYXJ5Ci0gKiAnNCcgLSBhbGlnbiB0byBxdWFkd29yZCBib3VuZGFyeQotICogJzUnIC0gYWxpZ24gdG8gMzIgYnl0ZSBib3VuZGFyeQotICogJzYnIC0gYWxpZ24gdG8gNjQgYnl0ZSBib3VuZGFyeQotICoKLSAqLwotCi12b2lkCi1wcGNfcGVfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGV4cDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHNlZ1Qgc2VjOwotICBpbnQgYWxpZ247Ci0KLSAgc2VjdGlvbl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHNlY3Rpb25fbmFtZSArIDEpOwotICBzdHJjcHkgKG5hbWUsIHNlY3Rpb25fbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGV4cCA9IDA7Ci0gIGZsYWdzID0gU0VDX05PX0ZMQUdTOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkMiIpID09IDApCi0gICAgewotICAgICAgYWxpZ24gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDMiKSA9PSAwKQotICAgIHsKLSAgICAgIGFsaWduID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pZGF0YSQ0IikgPT0gMCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkNSIpID09IDApCi0gICAgewotICAgICAgYWxpZ24gPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDYiKSA9PSAwKQotICAgIHsKLSAgICAgIGFsaWduID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhbGlnbiA9IDQ7IC8qIGRlZmF1bHQgYWxpZ25tZW50IHRvIDE2IGJ5dGUgYm91bmRhcnkgKi8KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKLQkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCQl7Ci0JCSAgLyogU2VjdGlvbiBDb250ZW50cyAqLwotCQljYXNlICdhJzogLyogdW5rbm93biAqLwotCQkgIGFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgc2VjdGlvbiBhdHRyaWJ1dGUgLS0gJ2EnIikpOwotCQkgIGJyZWFrOwotCQljYXNlICdjJzogLyogY29kZSBzZWN0aW9uICovCi0JCSAgZmxhZ3MgfD0gU0VDX0NPREU7IAotCQkgIGJyZWFrOwotCQljYXNlICdkJzogLyogc2VjdGlvbiBoYXMgaW5pdGlhbGl6ZWQgZGF0YSAqLwotCQkgIGZsYWdzIHw9IFNFQ19EQVRBOwotCQkgIGJyZWFrOwotCQljYXNlICd1JzogLyogc2VjdGlvbiBoYXMgdW5pbml0aWFsaXplZCBkYXRhICovCi0JCSAgLyogRklYTUU6IFRoaXMgaXMgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEKLQkJICAgICBpbiB3aW5udC5oICovCi0JCSAgZmxhZ3MgfD0gU0VDX1JPTTsKLQkJICBicmVhazsKLQkJY2FzZSAnaSc6IC8qIHNlY3Rpb24gY29udGFpbnMgZGlyZWN0aXZlcyAoaW5mbykgKi8KLQkJICAvKiBGSVhNRTogVGhpcyBpcyBJTUFHRV9TQ05fTE5LX0lORk8KLQkJICAgICBpbiB3aW5udC5oICovCi0JCSAgZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQkJICBicmVhazsKLQkJY2FzZSAnbic6IC8qIHNlY3Rpb24gY2FuIGJlIGRpc2NhcmRlZCAqLwotCQkgIGZsYWdzICY9fiBTRUNfTE9BRDsgCi0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1InOiAvKiBSZW1vdmUgc2VjdGlvbiBhdCBsaW5rIHRpbWUgKi8KLQkJICBmbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLQkJICBicmVhazsKLQotCQkgIC8qIFNlY3Rpb24gUHJvdGVjdGlvbiAqLwotCQljYXNlICdyJzogLyogc2VjdGlvbiBpcyByZWFkYWJsZSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRDsKLQkJICBicmVhazsKLQkJY2FzZSAndyc6IC8qIHNlY3Rpb24gaXMgd3JpdGVhYmxlICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9XUklURTsKLQkJICBicmVhazsKLQkJY2FzZSAneCc6IC8qIHNlY3Rpb24gaXMgZXhlY3V0YWJsZSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fRVhFQ1VURTsKLQkJICBicmVhazsKLQkJY2FzZSAncyc6IC8qIHNlY3Rpb24gaXMgc2hhcmFibGUgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1NIQVJFRDsKLQkJICBicmVhazsKLQotCQkgIC8qIFNlY3Rpb24gQWxpZ25tZW50ICovCi0JCWNhc2UgJzAnOiAvKiBhbGlnbiB0byBieXRlIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzFCWVRFUzsKLQkJICBhbGlnbiA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzEnOiAgLyogYWxpZ24gdG8gaGFsZndvcmQgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMkJZVEVTOwotCQkgIGFsaWduID0gMTsKLQkJICBicmVhazsKLQkJY2FzZSAnMic6ICAvKiBhbGlnbiB0byB3b3JkIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzRCWVRFUzsKLQkJICBhbGlnbiA9IDI7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzMnOiAgLyogYWxpZ24gdG8gZG91Ymxld29yZCBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl84QllURVM7Ci0JCSAgYWxpZ24gPSAzOwotCQkgIGJyZWFrOwotCQljYXNlICc0JzogIC8qIGFsaWduIHRvIHF1YWR3b3JkIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzE2QllURVM7Ci0JCSAgYWxpZ24gPSA0OwotCQkgIGJyZWFrOwotCQljYXNlICc1JzogIC8qIGFsaWduIHRvIDMyIGJ5dGUgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUzsKLQkJICBhbGlnbiA9IDU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzYnOiAgLyogYWxpZ24gdG8gNjQgYnl0ZSBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl82NEJZVEVTOwotCQkgIGFsaWduID0gNjsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGFzX2JhZChfKCJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSAgc2VjID0gc3Vic2VnX25ldyAobmFtZSwgKHN1YnNlZ1QpIGV4cCk7Ci0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24oc2VjKTsKLQotICBpZiAoZmxhZ3MgIT0gU0VDX05PX0ZMQUdTKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKSkKLQlhc19iYWQgKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiKSwKLQkJYmZkX3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBzZWMpLAotCQliZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgfQotCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoc3Rkb3V0cHV0LCBzZWMsIGFsaWduKTsKLQotfQotCi1zdGF0aWMgdm9pZAotcHBjX3BlX2Z1bmN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqZXh0X3N5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgZXh0X3N5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIFNfU0VUX0RBVEFfVFlQRSAoZXh0X3N5bSwgRFRfRkNOIDw8IE5fQlRTSEZUKTsKLSAgU0ZfU0VUX0ZVTkNUSU9OIChleHRfc3ltKTsKLSAgU0ZfU0VUX1BST0NFU1MgKGV4dF9zeW0pOwotICBjb2ZmX2FkZF9saW5lc3ltIChleHRfc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotcHBjX3BlX3RvY2QgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHRvY2RhdGFfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIHRvY2RhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIudG9jZCIsIDApOwotICAgICAgLyogRklYTUU6IHNlY3Rpb24gZmxhZ3Mgd29uJ3Qgd29yayAqLwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHRvY2RhdGFfc2VjdGlvbiwKLQkJCSAgICAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkgICAgICB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBICkpOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHRvY2RhdGFfc2VjdGlvbiwgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIudG9jZCIsIDApOwotICAgIH0KLQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbih0b2NkYXRhX3NlY3Rpb24pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIERvbid0IGFkanVzdCBUT0MgcmVsb2NzIHRvIHVzZSB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCi1pbnQKLXBwY19wZV9maXhfYWRqdXN0YWJsZSAoZml4KQotICAgICBmaXhTICpmaXg7Ci17Ci0gIHJldHVybiBmaXgtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfUFBDX1RPQzE2OwotfQotCi0jZW5kaWYKLQwKLSNpZmRlZiBPQkpfWENPRkYKLQotLyogWENPRkYgc3BlY2lmaWMgc3ltYm9sIGFuZCBmaWxlIGhhbmRsaW5nLiAgKi8KLQotLyogQ2Fub25pY2FsaXplIHRoZSBzeW1ib2wgbmFtZS4gIFdlIHVzZSB0aGUgdG8gZm9yY2UgdGhlIHN1ZmZpeCwgaWYKLSAgIGFueSwgdG8gdXNlIHNxdWFyZSBicmFja2V0cywgYW5kIHRvIGJlIGluIHVwcGVyIGNhc2UuICAqLwotCi1jaGFyICoKLXBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKHBwY19zdGFiX3N5bWJvbCkKLSAgICByZXR1cm4gbmFtZTsKLQotICBmb3IgKHMgPSBuYW1lOyAqcyAhPSAnXDAnICYmICpzICE9ICd7JyAmJiAqcyAhPSAnWyc7IHMrKykKLSAgICA7Ci0gIGlmICgqcyAhPSAnXDAnKQotICAgIHsKLSAgICAgIGNoYXIgYnJhYzsKLQotICAgICAgaWYgKCpzID09ICdbJykKLQlicmFjID0gJ10nOwotICAgICAgZWxzZQotCXsKLQkgICpzID0gJ1snOwotCSAgYnJhYyA9ICd9JzsKLQl9Ci0KLSAgICAgIGZvciAocysrOyAqcyAhPSAnXDAnICYmICpzICE9IGJyYWM7IHMrKykKLQlpZiAoaXNsb3dlciAoKnMpKQotCSAgKnMgPSB0b3VwcGVyICgqcyk7Ci0KLSAgICAgIGlmICgqcyA9PSAnXDAnIHx8IHNbMV0gIT0gJ1wwJykKLQlhc19iYWQgKF8oImJhZCBzeW1ib2wgc3VmZml4IikpOwotCi0gICAgICAqcyA9ICddJzsKLSAgICB9Ci0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLS8qIFNldCB0aGUgY2xhc3Mgb2YgYSBzeW1ib2wgYmFzZWQgb24gdGhlIHN1ZmZpeCwgaWYgYW55LiAgVGhpcyBpcwotICAgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IHN5bWJvbCBpcyBjcmVhdGVkLiAgKi8KLQotdm9pZAotcHBjX3N5bWJvbF9uZXdfaG9vayAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN0cnVjdCBwcGNfdGNfc3kgKnRjOwotICBjb25zdCBjaGFyICpzOwotCi0gIHRjID0gc3ltYm9sX2dldF90YyAoc3ltKTsKLSAgdGMtPm5leHQgPSBOVUxMOwotICB0Yy0+b3V0cHV0ID0gMDsKLSAgdGMtPmNsYXNzID0gLTE7Ci0gIHRjLT5yZWFsX25hbWUgPSBOVUxMOwotICB0Yy0+c3Vic2VnID0gMDsKLSAgdGMtPmFsaWduID0gMDsKLSAgdGMtPnNpemUgPSBOVUxMOwotICB0Yy0+d2l0aGluID0gTlVMTDsKLQotICBpZiAocHBjX3N0YWJfc3ltYm9sKQotICAgIHJldHVybjsKLQotICBzID0gc3RyY2hyIChTX0dFVF9OQU1FIChzeW0pLCAnWycpOwotICBpZiAocyA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGlzIG5vIHN1ZmZpeC4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsrczsKLQotICBzd2l0Y2ggKHNbMF0pCi0gICAgewotICAgIGNhc2UgJ0InOgotICAgICAgaWYgKHN0cmNtcCAocywgIkJTXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX0JTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiREJdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfREI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICJEU10iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19EUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0cnOgotICAgICAgaWYgKHN0cmNtcCAocywgIkdMXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX0dMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiUFJdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfUFI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdSJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJST10iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19STzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlJXXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1JXOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiU1ZdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfU1Y7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdUJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJUQ10iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19UQzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlRJXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1RJOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiVEJdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfVEI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICJUQzBdIikgPT0gMCB8fCBzdHJjbXAgKHMsICJUMF0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19UQzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdVJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJVQV0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19VQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlVDXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1VDOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiWE9dIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfWE87Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHRjLT5jbGFzcyA9PSAtMSkKLSAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCBzeW1ib2wgc3VmZml4IikpOwotfQotCi0vKiBTZXQgdGhlIGNsYXNzIG9mIGEgbGFiZWwgYmFzZWQgb24gd2hlcmUgaXQgaXMgZGVmaW5lZC4gIFRoaXMKLSAgIGhhbmRsZXMgc3ltYm9scyB3aXRob3V0IHN1ZmZpeGVzLiAgQWxzbywgbW92ZSB0aGUgc3ltYm9sIHNvIHRoYXQgaXQKLSAgIGZvbGxvd3MgdGhlIGNzZWN0IHN5bWJvbC4gICovCi0KLXZvaWQKLXBwY19mcm9iX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKHBwY19jdXJyZW50X2NzZWN0ICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IC0xKQotCXN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gc3ltYm9sX2dldF90YyAocHBjX2N1cnJlbnRfY3NlY3QpLT5jbGFzczsKLQotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bSwgc3ltYm9sX2dldF90YyAocHBjX2N1cnJlbnRfY3NlY3QpLT53aXRoaW4sCi0JCSAgICAgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPndpdGhpbiA9IHN5bTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IGJ5IHBwY19mcm9iX3N5bWJvbCBpZiBhbnkgYWJzb2x1dGUgc3ltYm9scyBhcmUKLSAgIHNlZW4uICBJdCB0ZWxscyBwcGNfYWRqdXN0X3N5bXRhYiB3aGV0aGVyIGl0IG5lZWRzIHRvIGxvb2sgdGhyb3VnaAotICAgdGhlIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBwcGNfc2F3X2FiczsKLQotLyogQ2hhbmdlIHRoZSBuYW1lIG9mIGEgc3ltYm9sIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgU2V0IHRoZQotICAgcmVhbCBuYW1lIGlmIHRoZSAucmVuYW1lIHBzZXVkby1vcCB3YXMgdXNlZC4gIE90aGVyd2lzZSwgcmVtb3ZlIGFueQotICAgY2xhc3Mgc3VmZml4LiAgUmV0dXJuIDEgaWYgdGhlIHN5bWJvbCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZQotICAgc3ltYm9sIHRhYmxlLiAgKi8KLQotaW50Ci1wcGNfZnJvYl9zeW1ib2wgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBzdGF0aWMgc3ltYm9sUyAqcHBjX2xhc3RfZnVuY3Rpb247Ci0gIHN0YXRpYyBzeW1ib2xTICpzZXRfZW5kOwotCi0gIC8qIERpc2NhcmQgc3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBzeW1ib2wKLSAgICAgdGFibGUuICAqLwotICBpZiAoISBzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChzeW0pCi0gICAgICAmJiAoKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAotCSAgfHwgKCEgU19JU19FWFRFUk5BTCAoc3ltKQotCSAgICAgICYmICEgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0Ci0JICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0ZJTEUpKSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgU19TRVRfTkFNRSAoc3ltLCBzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUpOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0KLSAgICAgIG5hbWUgPSBTX0dFVF9OQU1FIChzeW0pOwotICAgICAgcyA9IHN0cmNociAobmFtZSwgJ1snKTsKLSAgICAgIGlmIChzICE9IChjaGFyICopIE5VTEwpCi0JewotCSAgdW5zaWduZWQgaW50IGxlbjsKLQkgIGNoYXIgKnNuZXc7Ci0KLQkgIGxlbiA9IHMgLSBuYW1lOwotCSAgc25ldyA9IHhtYWxsb2MgKGxlbiArIDEpOwotCSAgbWVtY3B5IChzbmV3LCBuYW1lLCBsZW4pOwotCSAgc25ld1tsZW5dID0gJ1wwJzsKLQotCSAgU19TRVRfTkFNRSAoc3ltLCBzbmV3KTsKLQl9Ci0gICAgfQotCi0gIGlmIChzZXRfZW5kICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgU0FfU0VUX1NZTV9FTkRORFggKHNldF9lbmQsIHN5bSk7Ci0gICAgICBzZXRfZW5kID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKFNGX0dFVF9GVU5DVElPTiAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAocHBjX2xhc3RfZnVuY3Rpb24gIT0gKHN5bWJvbFMgKikgTlVMTCkKLQlhc19iYWQgKF8oInR3byAuZnVuY3Rpb24gcHNldWRvLW9wcyB3aXRoIG5vIGludGVydmVuaW5nIC5lZiIpKTsKLSAgICAgIHBwY19sYXN0X2Z1bmN0aW9uID0gc3ltOwotICAgICAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPnNpemUgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sX2dldF90YyAoc3ltKS0+c2l6ZSwgMSk7Ci0JICBTQV9TRVRfU1lNX0ZTSVpFIChzeW0sCi0JCQkgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5zaXplKSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0ZDTgotCSAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltKSwgIi5lZiIpID09IDApCi0gICAgewotICAgICAgaWYgKHBwY19sYXN0X2Z1bmN0aW9uID09IChzeW1ib2xTICopIE5VTEwpCi0JYXNfYmFkIChfKCIuZWYgd2l0aCBubyBwcmVjZWRpbmcgLmZ1bmN0aW9uIikpOwotICAgICAgZWxzZQotCXsKLQkgIHNldF9lbmQgPSBwcGNfbGFzdF9mdW5jdGlvbjsKLQkgIHBwY19sYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQotCSAgLyogV2UgZG9uJ3QgaGF2ZSBhIENfRUZDTiBzeW1ib2wsIGJ1dCB3ZSBuZWVkIHRvIGZvcmNlIHRoZQotCSAgICAgQ09GRiBiYWNrZW5kIHRvIGJlbGlldmUgdGhhdCBpdCBoYXMgc2VlbiBvbmUuICAqLwotCSAgY29mZl9sYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGlmICghIFNfSVNfRVhURVJOQUwgKHN5bSkKLSAgICAgICYmIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19GSUxFCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfRkNOCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfQkxPQ0sKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19CU1RBVAotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0VTVEFUCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfQklOQ0wKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19FSU5DTAotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ltKSAhPSBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uKQotICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19ISURFWFQpOwotCi0gIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfSElERVhUKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphOwotCi0gICAgICAvKiBDcmVhdGUgYSBjc2VjdCBhdXguICAqLwotICAgICAgaSA9IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSk7Ci0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIGkgKyAxKTsKLSAgICAgIGEgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbaSArIDFdLnUuYXV4ZW50OwotICAgICAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IFhNQ19UQzApCi0JewotCSAgLyogVGhpcyBpcyB0aGUgVE9DIHRhYmxlLiAgKi8KLQkgIGtub3cgKHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltKSwgIlRPQyIpID09IDApOwotCSAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gMDsKLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9ICgyIDw8IDMpIHwgWFRZX1NEOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPnN1YnNlZyAhPSAwKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBjc2VjdCBzeW1ib2wuICB4X3NjbmxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUKLQkgICAgIGNzZWN0LiAgKi8KLQkgIGlmIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5uZXh0ID09IChzeW1ib2xTICopIE5VTEwpCi0JICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsCi0JCQkJCQkgICAgICAgU19HRVRfU0VHTUVOVCAoc3ltKSkKLQkJCQkgICAgIC0gU19HRVRfVkFMVUUgKHN5bSkpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbF9nZXRfdGMgKHN5bSktPm5leHQsIDEpOwotCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChTX0dFVF9WQUxVRSAoc3ltYm9sX2dldF90YyAoc3ltKS0+bmV4dCkKLQkJCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICAgIH0KLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9IChzeW1ib2xfZ2V0X3RjIChzeW0pLT5hbGlnbiA8PCAzKSB8IFhUWV9TRDsKLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IGJzc19zZWN0aW9uKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgKi8KLQkgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IHN5bWJvbF9nZXRfZnJhZyAoc3ltKS0+ZnJfb2Zmc2V0OwotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKHN5bWJvbF9nZXRfdGMgKHN5bSktPmFsaWduIDw8IDMpIHwgWFRZX0NNOwotCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bSkpCi0JICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gWE1DX1JXOwotCSAgZWxzZQotCSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5jbGFzcyA9IFhNQ19CUzsKLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IGFic29sdXRlX3NlY3Rpb24pCi0JewotCSAgLyogVGhpcyBpcyBhbiBhYnNvbHV0ZSBzeW1ib2wuICBUaGUgY3NlY3Qgd2lsbCBiZSBjcmVhdGVkIGJ5Ci0gICAgICAgICAgICAgcHBjX2FkanVzdF9zeW10YWIuICAqLwotCSAgcHBjX3Nhd19hYnMgPSB0cnVlOwotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gWFRZX0xEOwotCSAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IC0xKQotCSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5jbGFzcyA9IFhNQ19YTzsKLQl9Ci0gICAgICBlbHNlIGlmICghIFNfSVNfREVGSU5FRCAoc3ltKSkKLQl7Ci0JICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAwOwotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gWFRZX0VSOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IFhNQ19UQykKLQl7Ci0JICBzeW1ib2xTICpuZXh0OwotCi0JICAvKiBUaGlzIGlzIGEgVE9DIGRlZmluaXRpb24uICB4X3NjbmxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUKLQkgICAgIFRPQyBlbnRyeS4gICovCi0JICBuZXh0ID0gc3ltYm9sX25leHQgKHN5bSk7Ci0JICB3aGlsZSAoc3ltYm9sX2dldF90YyAobmV4dCktPmNsYXNzID09IFhNQ19UQzApCi0JICAgIG5leHQgPSBzeW1ib2xfbmV4dCAobmV4dCk7Ci0JICBpZiAobmV4dCA9PSAoc3ltYm9sUyAqKSBOVUxMCi0JICAgICAgfHwgc3ltYm9sX2dldF90YyAobmV4dCktPmNsYXNzICE9IFhNQ19UQykKLQkgICAgewotCSAgICAgIGlmIChwcGNfYWZ0ZXJfdG9jX2ZyYWcgPT0gKGZyYWdTICopIE5VTEwpCi0JCWEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsCi0JCQkJCQkJICAgZGF0YV9zZWN0aW9uKQotCQkJCQkgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICAgICAgZWxzZQotCQlhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAocHBjX2FmdGVyX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0JCQkJCSAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKG5leHQsIDEpOwotCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChTX0dFVF9WQUxVRSAobmV4dCkKLQkJCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICAgIH0KLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9ICgyIDw8IDMpIHwgWFRZX1NEOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpjc2VjdDsKLQotCSAgLyogVGhpcyBpcyBhIG5vcm1hbCBzeW1ib2wgZGVmaW5pdGlvbi4gIHhfc2NubGVuIGlzIHRoZQotCSAgICAgc3ltYm9sIGluZGV4IG9mIHRoZSBjb250YWluaW5nIGNzZWN0LiAgKi8KLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IHRleHRfc2VjdGlvbikKLQkgICAgY3NlY3QgPSBwcGNfdGV4dF9jc2VjdHM7Ci0JICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IGRhdGFfc2VjdGlvbikKLQkgICAgY3NlY3QgPSBwcGNfZGF0YV9jc2VjdHM7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCi0JICAvKiBTa2lwIHRoZSBpbml0aWFsIGR1bW15IHN5bWJvbC4gICovCi0JICBjc2VjdCA9IHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dDsKLQotCSAgaWYgKGNzZWN0ID09IChzeW1ib2xTICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJ3YXJuaW5nOiBzeW1ib2wgJXMgaGFzIG5vIGNzZWN0IiksIFNfR0VUX05BTUUgKHN5bSkpOwotCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdoaWxlIChzeW1ib2xfZ2V0X3RjIChjc2VjdCktPm5leHQgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQkJewotCQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xfZ2V0X3RjIChjc2VjdCktPm5leHQsIDEpOwotCQkgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0KQotCQkgICAgICA+IFNfR0VUX1ZBTFVFIChzeW0pKQotCQkgICAgYnJlYWs7Ci0JCSAgY3NlY3QgPSBzeW1ib2xfZ2V0X3RjIChjc2VjdCktPm5leHQ7Ci0JCX0KLQotCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ucCA9Ci0JCWNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChjc2VjdCkpLT5uYXRpdmU7Ci0JICAgICAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbaSArIDFdLmZpeF9zY25sZW4gPQotCQkxOwotCSAgICB9Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfTEQ7Ci0JfQotCQotICAgICAgYS0+eF9jc2VjdC54X3Bhcm1oYXNoID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbmhhc2ggPSAwOwotICAgICAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IC0xKQotCWEtPnhfY3NlY3QueF9zbWNsYXMgPSBYTUNfUFI7Ci0gICAgICBlbHNlCi0JYS0+eF9jc2VjdC54X3NtY2xhcyA9IHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzOwotICAgICAgYS0+eF9jc2VjdC54X3N0YWIgPSAwOwotICAgICAgYS0+eF9jc2VjdC54X3Nuc3RhYiA9IDA7Ci0KLSAgICAgIC8qIERvbid0IGxldCB0aGUgQ09GRiBiYWNrZW5kIHJlc29ydCB0aGVzZSBzeW1ib2xzLiAgKi8KLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORDsKLSAgICB9Ci0gIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19CU1RBVCkKLSAgICB7Ci0gICAgICAvKiBXZSB3YW50IHRoZSB2YWx1ZSB0byBiZSB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZSByZWZlcmVuY2VkCi0JIGNzZWN0IHN5bWJvbC4gIEJGRCB3aWxsIGRvIHRoYXQgZm9yIHVzIGlmIHdlIHNldCB0aGUgcmlnaHQKLQkgZmxhZ3MuICAqLwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwKLQkJICAgKCh2YWx1ZVQpCi0JCSAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bQotCQkJCShzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW4pKS0+bmF0aXZlKSk7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+Zml4X3ZhbHVlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19TVFNZTSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpibG9jazsKLSAgICAgIHN5bWJvbFMgKmNzZWN0OwotCi0gICAgICAvKiBUaGUgdmFsdWUgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBlbmNsb3NpbmcgY3NlY3QuICAqLwotICAgICAgYmxvY2sgPSBzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW47Ci0gICAgICBjc2VjdCA9IHN5bWJvbF9nZXRfdGMgKGJsb2NrKS0+d2l0aGluOwotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGNzZWN0LCAxKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIFNfR0VUX1ZBTFVFIChzeW0pIC0gU19HRVRfVkFMVUUgKGNzZWN0KSk7Ci0gICAgfQotICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfQklOQ0wKLQkgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRUlOQ0wpCi0gICAgewotICAgICAgLyogV2Ugd2FudCB0aGUgdmFsdWUgdG8gYmUgYSBmaWxlIG9mZnNldCBpbnRvIHRoZSBsaW5lIG51bWJlcnMuCi0gICAgICAgICBCRkQgd2lsbCBkbyB0aGF0IGZvciB1cyBpZiB3ZSBzZXQgdGhlIHJpZ2h0IGZsYWdzLiAgV2UgaGF2ZQotICAgICAgICAgYWxyZWFkeSBzZXQgdGhlIHZhbHVlIGNvcnJlY3RseS4gICovCi0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+Zml4X2xpbmUgPSAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogQWRqdXN0IHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIGNyZWF0ZXMgY3NlY3Qgc3ltYm9scyBmb3IgYWxsCi0gICBhYnNvbHV0ZSBzeW1ib2xzLiAgKi8KLQotdm9pZAotcHBjX2FkanVzdF9zeW10YWIgKCkKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIGlmICghIHBwY19zYXdfYWJzKQotICAgIHJldHVybjsKLQotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmNzZWN0OwotICAgICAgaW50IGk7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmE7Ci0KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pICE9IGFic29sdXRlX3NlY3Rpb24pCi0JY29udGludWU7Ci0KLSAgICAgIGNzZWN0ID0gc3ltYm9sX2NyZWF0ZSAoIi5hYnNbWE9dIiwgYWJzb2x1dGVfc2VjdGlvbiwKLQkJCSAgICAgU19HRVRfVkFMVUUgKHN5bSksICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoY3NlY3QpLT52YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW0pOwotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoY3NlY3QsIENfSElERVhUKTsKLSAgICAgIGkgPSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChjc2VjdCk7Ci0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChjc2VjdCwgaSArIDEpOwotICAgICAgYSA9ICZjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoY3NlY3QpKS0+bmF0aXZlW2kgKyAxXS51LmF1eGVudDsKLSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfU0Q7Ci0gICAgICBhLT54X2NzZWN0LnhfcGFybWhhc2ggPSAwOwotICAgICAgYS0+eF9jc2VjdC54X3NuaGFzaCA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc21jbGFzID0gWE1DX1hPOwotICAgICAgYS0+eF9jc2VjdC54X3N0YWIgPSAwOwotICAgICAgYS0+eF9jc2VjdC54X3Nuc3RhYiA9IDA7Ci0KLSAgICAgIHN5bWJvbF9pbnNlcnQgKGNzZWN0LCBzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gICAgICBpID0gU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltKTsKLSAgICAgIGEgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbaV0udS5hdXhlbnQ7Ci0gICAgICBhLT54X2NzZWN0Lnhfc2NubGVuLnAgPSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoY3NlY3QpKS0+bmF0aXZlOwotICAgICAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbaV0uZml4X3NjbmxlbiA9IDE7Ci0gICAgfQotCi0gIHBwY19zYXdfYWJzID0gZmFsc2U7Ci19Ci0KLS8qIFNldCB0aGUgVk1BIGZvciBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBvbiBhbGwgdGhlIHNlY3Rpb25zIGluCi0gICB0dXJuLiAgKi8KLQotdm9pZAotcHBjX2Zyb2Jfc2VjdGlvbiAoc2VjKQotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBzdGF0aWMgYmZkX3NpemVfdHlwZSB2bWEgPSAwOwotCi0gIGJmZF9zZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgc2VjLCB2bWEpOwotICB2bWEgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBzZWMpOwotfQotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0MCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0cC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVwIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRwLCBzaXplcCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdHA7Ci0gICAgIGludCAqc2l6ZXA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVwID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplcCA9IHByZWMgKiAyOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0cCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRwICs9IDI7Ci0JfQotICAgIH0KLSAgICAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgZW5kaWFubmVzcy4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIEFsaWduIGEgc2VjdGlvbiAoSSBkb24ndCBrbm93IHdoeSB0aGlzIGlzIG1hY2hpbmUgZGVwZW5kZW50KS4gICovCi0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotCi0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0vKiBXZSBkb24ndCBoYXZlIGFueSBmb3JtIG9mIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAwOwotfQotCi0vKiBDb252ZXJ0IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gIFdlIG5ldmVyIGdlbmVyYXRlIHRoZXNlLiAgKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmcmFnUyAqZnJhZ3AgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWMpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHNlZ1Qgc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLSNpZmRlZiBPQkpfWENPRkYKLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgYSBmaXh1cCBzaG91bGQgYmUgYWRqdXN0ZWQgdG8gdXNlIGEKLSAgIHNlY3Rpb24gc3ltYm9sLiAgV2UgdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIGEgZml4dXAgYWdhaW5zdAotICAgYSBzeW1ib2wgaW4gdGhlIFRPQyBzdWJzZWdtZW50IGludG8gYSByZWxvYyBhZ2FpbnN0IHRoZQotICAgY29ycmVzcG9uZGluZyAudGMgc3ltYm9sLiAgKi8KLQotaW50Ci1wcGNfZml4X2FkanVzdGFibGUgKGZpeCkKLSAgICAgZml4UyAqZml4OwotewotICB2YWx1ZVQgdmFsOwotCi0gIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmaXgtPmZ4X2FkZHN5LCAxKTsKLSAgdmFsID0gU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpOwotICBpZiAocHBjX3RvY19jc2VjdCAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiBmaXgtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmIGZpeC0+ZnhfYWRkc3kgIT0gcHBjX3RvY19jc2VjdAotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgPT0gZGF0YV9zZWN0aW9uCi0gICAgICAmJiB2YWwgPj0gcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0gICAgICAmJiAocHBjX2FmdGVyX3RvY19mcmFnID09IChmcmFnUyAqKSBOVUxMCi0JICB8fCB2YWwgPCBwcGNfYWZ0ZXJfdG9jX2ZyYWctPmZyX2FkZHJlc3MpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5OwotCi0gICAgICBmb3IgKHN5ID0gc3ltYm9sX25leHQgKHBwY190b2NfY3NlY3QpOwotCSAgIHN5ICE9IChzeW1ib2xTICopIE5VTEw7Ci0JICAgc3kgPSBzeW1ib2xfbmV4dCAoc3kpKQotCXsKLQkgIGlmIChzeW1ib2xfZ2V0X3RjIChzeSktPmNsYXNzID09IFhNQ19UQzApCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5KS0+Y2xhc3MgIT0gWE1DX1RDKQotCSAgICBicmVhazsKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeSwgMSk7Ci0JICBpZiAodmFsID09IFNfR0VUX1ZBTFVFIChzeSkpCi0JICAgIHsKLQkgICAgICBmaXgtPmZ4X2FkZHN5ID0gc3k7Ci0JICAgICAgZml4LT5meF9hZGRudW1iZXIgPSB2YWwgLSBwcGNfdG9jX2ZyYWctPmZyX2FkZHJlc3M7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGFzX2JhZF93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCSAgICBfKCJzeW1ib2wgaW4gLnRvYyBkb2VzIG5vdCBtYXRjaCBhbnkgLnRjIikpOwotICAgIH0KLQotICAvKiBQb3NzaWJseSBhZGp1c3QgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QgdGhlIGNzZWN0LiAgKi8KLSAgaWYgKGZpeC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPnN1YnNlZyA9PSAwCi0gICAgICAmJiBzeW1ib2xfZ2V0X3RjIChmaXgtPmZ4X2FkZHN5KS0+Y2xhc3MgIT0gWE1DX1RDMAotICAgICAgJiYgc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPmNsYXNzICE9IFhNQ19UQwotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgIT0gYnNzX3NlY3Rpb24KLSAgICAgIC8qIERvbid0IGFkanVzdCBpZiB0aGlzIGlzIGEgcmVsb2MgaW4gdGhlIHRvYyBzZWN0aW9uLiAgKi8KLSAgICAgICYmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSAhPSBkYXRhX3NlY3Rpb24KLQkgIHx8IHBwY190b2NfY3NlY3QgPT0gTlVMTAotCSAgfHwgdmFsIDwgcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0JICB8fCAocHBjX2FmdGVyX3RvY19mcmFnICE9IE5VTEwKLQkgICAgICAmJiB2YWwgPj0gcHBjX2FmdGVyX3RvY19mcmFnLT5mcl9hZGRyZXNzKSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqY3NlY3Q7Ci0KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSB0ZXh0X3NlY3Rpb24pCi0JY3NlY3QgPSBwcGNfdGV4dF9jc2VjdHM7Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSBkYXRhX3NlY3Rpb24pCi0JY3NlY3QgPSBwcGNfZGF0YV9jc2VjdHM7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qIFNraXAgdGhlIGluaXRpYWwgZHVtbXkgc3ltYm9sLiAgKi8KLSAgICAgIGNzZWN0ID0gc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0OwotCi0gICAgICBpZiAoY3NlY3QgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICB3aGlsZSAoc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0ICE9IChzeW1ib2xTICopIE5VTEwKLQkJICYmIChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dCktPmZyX2FkZHJlc3MKLQkJICAgICA8PSB2YWwpKQotCSAgICB7Ci0JICAgICAgLyogSWYgdGhlIGNzZWN0IGFkZHJlc3MgZXF1YWxzIHRoZSBzeW1ib2wgdmFsdWUsIHRoZW4gd2UKLSAgICAgICAgICAgICAgICAgaGF2ZSB0byBsb29rIHRocm91Z2ggdGhlIGZ1bGwgc3ltYm9sIHRhYmxlIHRvIHNlZQotICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoaXMgaXMgdGhlIGNzZWN0IHdlIHdhbnQuICBOb3RlIHRoYXQgd2Ugd2lsbAotICAgICAgICAgICAgICAgICBvbmx5IGdldCBoZXJlIGlmIHRoZSBjc2VjdCBoYXMgemVybyBsZW5ndGguICAqLwotCSAgICAgIGlmICgoc3ltYm9sX2dldF9mcmFnIChjc2VjdCktPmZyX2FkZHJlc3MgPT0gdmFsKQotCQkgICYmIFNfR0VUX1ZBTFVFIChjc2VjdCkgPT0gU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpKQotCQl7Ci0JCSAgc3ltYm9sUyAqc2NhbjsKLQotCQkgIGZvciAoc2NhbiA9IHN5bWJvbF9uZXh0IChjc2VjdCk7Ci0JCSAgICAgICBzY2FuICE9IE5VTEw7Ci0JCSAgICAgICBzY2FuID0gc3ltYm9sX25leHQgKHNjYW4pKQotCQkgICAgewotCQkgICAgICBpZiAoc3ltYm9sX2dldF90YyAoc2NhbiktPnN1YnNlZyAhPSAwKQotCQkJYnJlYWs7Ci0JCSAgICAgIGlmIChzY2FuID09IGZpeC0+ZnhfYWRkc3kpCi0JCQlicmVhazsKLQkJICAgIH0KLQotCQkgIC8qIElmIHdlIGZvdW5kIHRoZSBzeW1ib2wgYmVmb3JlIHRoZSBuZXh0IGNzZWN0Ci0gICAgICAgICAgICAgICAgICAgICBzeW1ib2wsIHRoZW4gdGhpcyBpcyB0aGUgY3NlY3Qgd2Ugd2FudC4gICovCi0JCSAgaWYgKHNjYW4gPT0gZml4LT5meF9hZGRzeSkKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBjc2VjdCA9IHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dDsKLQkgICAgfQotCi0JICBmaXgtPmZ4X29mZnNldCArPSAoU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpCi0JCQkgICAgIC0gc3ltYm9sX2dldF9mcmFnIChjc2VjdCktPmZyX2FkZHJlc3MpOwotCSAgZml4LT5meF9hZGRzeSA9IGNzZWN0OwotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0IGEgcmVsb2MgYWdhaW5zdCBhIC5sY29tbSBzeW1ib2wgdG8gYmUgYWdhaW5zdCB0aGUgYmFzZQotICAgICAubGNvbW0uICAqLwotICBpZiAoZml4LT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSBic3Nfc2VjdGlvbgotICAgICAgJiYgISBTX0lTX0VYVEVSTkFMIChmaXgtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sX2dldF9mcmFnIChmaXgtPmZ4X2FkZHN5KS0+ZnJfc3ltYm9sLCAxKTsKLSAgICAgIGZpeC0+Znhfb2Zmc2V0ICs9Ci0JKFNfR0VUX1ZBTFVFIChmaXgtPmZ4X2FkZHN5KQotCSAtIFNfR0VUX1ZBTFVFIChzeW1ib2xfZ2V0X2ZyYWcgKGZpeC0+ZnhfYWRkc3kpLT5mcl9zeW1ib2wpKTsKLSAgICAgIGZpeC0+ZnhfYWRkc3kgPSBzeW1ib2xfZ2V0X2ZyYWcgKGZpeC0+ZnhfYWRkc3kpLT5mcl9zeW1ib2w7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBBIHJlbG9jIGZyb20gb25lIGNzZWN0IHRvIGFub3RoZXIgbXVzdCBiZSBrZXB0LiAgVGhlIGFzc2VtYmxlcgotICAgd2lsbCwgb2YgY291cnNlLCBrZWVwIHJlbG9jcyBiZXR3ZWVuIHNlY3Rpb25zLCBhbmQgaXQgd2lsbCBrZWVwCi0gICBhYnNvbHV0ZSByZWxvY3MsIGJ1dCB3ZSBuZWVkIHRvIGZvcmNlIGl0IHRvIGtlZXAgUEMgcmVsYXRpdmUgcmVsb2NzCi0gICBiZXR3ZWVuIHR3byBjc2VjdHMgaW4gdGhlIHNhbWUgc2VjdGlvbi4gICovCi0KLWludAotcHBjX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLSAgICAgZml4UyAqZml4OwotewotICAvKiBBdCB0aGlzIHBvaW50IGZpeC0+ZnhfYWRkc3kgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0bwotICAgICBhIGNzZWN0IHN5bWJvbC4gIElmIHRoZSBjc2VjdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBmcmFnbWVudCwgdGhlbgotICAgICB3ZSBuZWVkIHRvIGZvcmNlIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgaWYgKGZpeC0+ZnhfcGNyZWwKLSAgICAgICYmIGZpeC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPnN1YnNlZyAhPSAwCi0gICAgICAmJiAoKHN5bWJvbF9nZXRfZnJhZyAoZml4LT5meF9hZGRzeSktPmZyX2FkZHJlc3MKLQkgICA+IGZpeC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcykKLQkgIHx8IChzeW1ib2xfZ2V0X3RjIChmaXgtPmZ4X2FkZHN5KS0+bmV4dCAhPSBOVUxMCi0JICAgICAgJiYgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPm5leHQpLT5mcl9hZGRyZXNzCi0JCSAgPD0gZml4LT5meF9mcmFnLT5mcl9hZGRyZXNzKSkpKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0KLS8qIFNlZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGluIHRoZSBUT0Mgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBwY19pc190b2Nfc3ltIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSNpZmRlZiBPQkpfWENPRkYKLSAgcmV0dXJuIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IFhNQ19UQzsKLSNlbHNlCi0gIHJldHVybiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSksICIuZ290IikgPT0gMDsKLSNlbmRpZgotfQotCi0vKiBBcHBseSBhIGZpeHVwIHRvIHRoZSBvYmplY3QgY29kZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBhbGwgdGhlCi0gICBmaXh1cHMgd2UgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsIHRvIGZpeF9uZXdfZXhwLCBhYm92ZS4gIEluIHRoZSBjYWxsCi0gICBhYm92ZSB3ZSB1c2VkIGEgcmVsb2MgY29kZSB3aGljaCB3YXMgdGhlIGxhcmdlc3QgbGVnYWwgcmVsb2MgY29kZQotICAgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIEhlcmUgd2UgdW5kbyB0aGF0IHRvIHJlY292ZXIgdGhlIG9wZXJhbmQKLSAgIGluZGV4LiAgQXQgdGhpcyBwb2ludCBhbGwgc3ltYm9sIHZhbHVlcyBzaG91bGQgYmUgZnVsbHkgcmVzb2x2ZWQsCi0gICBhbmQgd2UgYXR0ZW1wdCB0byBjb21wbGV0ZWx5IHJlc29sdmUgdGhlIHJlbG9jLiAgSWYgd2UgY2FuIG5vdCBkbwotICAgdGhhdCwgd2UgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHJlbG9jIGNvZGUgYW5kIHB1dCBpdCBiYWNrIGluIHRoZQotICAgZml4dXAuICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICpmaXhwOwotICAgICB2YWx1ZVQgKnZhbHVlcDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIHZhbHVlVCB2YWx1ZTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgdmFsdWUgPSAqdmFsdWVwOwotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBgKnZhbHVlcCcgbWF5IGNvbnRhaW4gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgb24gd2hpY2ggdGhlIHJlbG9jCi0JIHdpbGwgYmUgYmFzZWQ7IHdlIGhhdmUgdG8gcmVtb3ZlIGl0LiAgKi8KLSAgICAgIGlmIChzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChmaXhwLT5meF9hZGRzeSkKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkpKQotCXZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSk7Ci0KLSAgICAgIC8qIEZJWE1FOiBXaHkgJysnPyAgQmV0dGVyIHlldCwgd2hhdCBleGFjdGx5IGlzICcqdmFsdWVwJwotCSBzdXBwb3NlZCB0byBiZT8gIEkgdGhpbmsgdGhpcyBpcyByZWxhdGVkIHRvIHZhcmlvdXMgc2ltaWxhcgotCSBGSVhNRXMgaW4gdGMtaTM4Ni5jIGFuZCB0Yy1zcGFyYy5jLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl2YWx1ZSArPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotI2Vsc2UKLSAgLyogRklYTUUgRklYTUUgRklYTUU6IFRoZSB2YWx1ZSB3ZSBhcmUgcGFzc2VkIGluICp2YWx1ZXAgaW5jbHVkZXMKLSAgICAgdGhlIHN5bWJvbCB2YWx1ZXMuICBTaW5jZSB3ZSBhcmUgdXNpbmcgQkZEX0FTU0VNQkxFUiwgaWYgd2UgYXJlCi0gICAgIGRvaW5nIHRoaXMgcmVsb2NhdGlvbiB0aGUgY29kZSBpbiB3cml0ZS5jIGlzIGdvaW5nIHRvIGNhbGwKLSAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiwgd2hpY2ggaXMgYWxzbyBnb2luZyB0byB1c2UgdGhlIHN5bWJvbAotICAgICB2YWx1ZS4gIFRoYXQgbWVhbnMgdGhhdCBpZiB0aGUgcmVsb2MgaXMgZnVsbHkgcmVzb2x2ZWQgd2Ugd2FudCB0bwotICAgICB1c2UgKnZhbHVlcCBzaW5jZSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkLgotICAgICBIb3dldmVyLCBpZiB0aGUgcmVsb2MgaXMgbm90IGZ1bGx5IHJlc29sdmVkIHdlIGRvIG5vdCB3YW50IHRvIHVzZQotICAgICAqdmFsdWVwLCBhbmQgbXVzdCB1c2UgZnhfb2Zmc2V0IGluc3RlYWQuICBIb3dldmVyLCBpZiB0aGUgcmVsb2MKLSAgICAgaXMgUEMgcmVsYXRpdmUsIHdlIGRvIHdhbnQgdG8gdXNlICp2YWx1ZXAgc2luY2UgaXQgaW5jbHVkZXMgdGhlCi0gICAgIHJlc3VsdCBvZiBtZF9wY3JlbF9mcm9tLiAgVGhpcyBpcyBjb25mdXNpbmcuICAqLwotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICp2YWx1ZXA7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gZml4cC0+Znhfb2Zmc2V0OwotICAgICAgaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCi0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKChpbnQpIGZpeHAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGNoYXIgKndoZXJlOwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0gICAgICBvcGluZGV4ID0gKGludCkgZml4cC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLQotICAgICAgb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzW29waW5kZXhdOwotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gICAgICAvKiBJdCBhcHBlYXJzIHRoYXQgYW4gaW5zdHJ1Y3Rpb24gbGlrZQotCSAgICAgbCA5LExDLi4xKDMwKQotCSB3aGVuIExDLi4xIGlzIG5vdCBhIFRPQyBzeW1ib2wgZG9lcyBub3QgZ2VuZXJhdGUgYSByZWxvYy4gIEl0Ci0JIHVzZXMgdGhlIG9mZnNldCBvZiBMQy4uMSB3aXRoaW4gaXRzIGNzZWN0LiAgSG93ZXZlciwgLmxvbmcKLQkgTEMuLjEgd2lsbCBnZW5lcmF0ZSBhIHJlbG9jLiAgSSBjYW4ndCBmaW5kIGFueSBkb2N1bWVudGF0aW9uCi0JIG9uIGhvdyB0aGVzZSBjYXNlcyBhcmUgdG8gYmUgZGlzdGluZ3Vpc2hlZCwgc28gdGhpcyBpcyBhIHdpbGQKLQkgZ3Vlc3MuICBUaGVzZSBjYXNlcyBhcmUgZ2VuZXJhdGVkIGJ5IGdjYyAtbW1pbmltYWwtdG9jLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9QQVJFTlMpICE9IDAKLQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTYKLQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDAKLQkgICYmIG9wZXJhbmQtPmluc2VydCA9PSBOVUxMCi0JICAmJiBmaXhwLT5meF9hZGRzeSAhPSBOVUxMCi0JICAmJiBzeW1ib2xfZ2V0X3RjIChmaXhwLT5meF9hZGRzeSktPnN1YnNlZyAhPSAwCi0JICAmJiBzeW1ib2xfZ2V0X3RjIChmaXhwLT5meF9hZGRzeSktPmNsYXNzICE9IFhNQ19UQwotCSAgJiYgc3ltYm9sX2dldF90YyAoZml4cC0+ZnhfYWRkc3kpLT5jbGFzcyAhPSBYTUNfVEMwCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gYnNzX3NlY3Rpb24pCi0JewotCSAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0JICBmaXhwLT5meF9kb25lID0gMTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLQkgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0gICAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBpbnNuID0gcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAob2Zmc2V0VCkgdmFsdWUsCi0JCQkJIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JewotCSAgLyogTm90aGluZyBlbHNlIHRvIGRvIGhlcmUuICAqLwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24uCi0JIFdlIGFyZSBvbmx5IHByZXBhcmVkIHRvIHR1cm4gYSBmZXcgb2YgdGhlIG9wZXJhbmRzIGludG8KLQkgcmVsb2NzLgotCSBGSVhNRTogV2UgbmVlZCB0byBoYW5kbGUgdGhlIERTIGZpZWxkIGF0IHRoZSB2ZXJ5IGxlYXN0LgotCSBGSVhNRTogU2VsZWN0aW5nIHRoZSByZWxvYyB0eXBlIGlzIGEgYml0IGhhcGhhemFyZDsgcGVyaGFwcwotCSB0aGVyZSBzaG91bGQgYmUgYSBuZXcgZmllbGQgaW4gdGhlIG9wZXJhbmQgdGFibGUuICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1JFTEFUSVZFKSAhPSAwCi0JICAmJiBvcGVyYW5kLT5iaXRzID09IDI2Ci0JICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAwKQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19QUENfQjI2OwotICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDAKLQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTYKLQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CMTY7Ci0gICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5iaXRzID09IDI2Ci0JICAgICAgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CQTI2OwotICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQUJTT0xVVEUpICE9IDAKLQkgICAgICAgJiYgb3BlcmFuZC0+Yml0cyA9PSAxNgotCSAgICAgICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAwKQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19QUENfQkExNjsKLSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5iaXRzID09IDE2Ci0JICAgICAgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDAKLQkgICAgICAgJiYgb3BlcmFuZC0+aW5zZXJ0ID09IE5VTEwKLQkgICAgICAgJiYgZml4cC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICAgICAmJiBwcGNfaXNfdG9jX3N5bSAoZml4cC0+ZnhfYWRkc3kpKQotCXsKLQkgIGZpeHAtPmZ4X3NpemUgPSAyOwotCSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCSAgICBmaXhwLT5meF93aGVyZSArPSAyOwotCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19UT0MxNjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqc2ZpbGU7Ci0JICB1bnNpZ25lZCBpbnQgc2xpbmU7Ci0KLQkgIC8qIFVzZSBleHByX3N5bWJvbF93aGVyZSB0byBzZWUgaWYgdGhpcyBpcyBhbiBleHByZXNzaW9uCi0gICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgIGlmIChleHByX3N5bWJvbF93aGVyZSAoZml4cC0+ZnhfYWRkc3ksICZzZmlsZSwgJnNsaW5lKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICBfKCJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIHJlc29sdmVkIikpOwotCSAgZWxzZQotCSAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgIF8oInVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSIpKTsKLQkgIGZpeHAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBwcGNfZWxmX3ZhbGlkYXRlX2ZpeCAoZml4cCwgc2VnKTsKLSNlbmRpZgotICAgICAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzMyOgotCWNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkJCQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQljYXNlIEJGRF9SRUxPQ19SVkE6Ci0JY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfMzJfQkFTRVJFTDoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMzI6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCA0KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQljYXNlIEJGRF9SRUxPQ19HUFJFTDE2OgotCWNhc2UgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfTE8xNl9HT1RPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9HT1RPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19MTzE2X0JBU0VSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMOgotCWNhc2UgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNjoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE86Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQToKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNjoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2OgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTY6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTzoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEE6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREE6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX1RPQzE2OgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICB7Ci0JICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JCWFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICAgIF8oImNhbm5vdCBlbWl0IFBDIHJlbGF0aXZlICVzIHJlbG9jYXRpb24gYWdhaW5zdCAlcyIpLAotCQkJICAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSksCi0JCQkgICAgICBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOwotCSAgICAgIGVsc2UKLQkJYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgICAgXygiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiIpLAotCQkJICAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOwotCSAgICB9Ci0KLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDIpOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgY2FzZSBoYXBwZW5zIHdoZW4geW91IHdyaXRlLCBmb3IgZXhhbXBsZSwKLQkgICAgIGxpcyAlcjMsKEwxLUwyKUBoYQotCSAgICAgd2hlcmUgTDEgYW5kIEwyIGFyZSBkZWZpbmVkIGxhdGVyLiAgKi8KLQljYXNlIEJGRF9SRUxPQ19ISTE2OgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICBhYm9ydCAoKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUgPj4gMTYsIDIpOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICBhYm9ydCAoKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgKHZhbHVlICsgMHg4MDAwKSA+PiAxNiwgMik7Ci0JICBicmVhazsKLQotCSAgLyogQmVjYXVzZSBTREEyMSBtb2RpZmllcyB0aGUgcmVnaXN0ZXIgZmllbGQsIHRoZSBzaXplIGlzIHNldCB0byA0Ci0JICAgICBieXRlcywgcmF0aGVyIHRoYW4gMiwgc28gb2Zmc2V0IGl0IGhlcmUgYXBwcm9wcmlhdGVseSAqLwotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjE6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGFib3J0ICgpOwotCi0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZQotCQkJICAgICAgKyAoKHRhcmdldF9iaWdfZW5kaWFuKSA/IDIgOiAwKSwKLQkJCSAgICAgIHZhbHVlLCAyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfODoKLQkgIGlmIChmaXhwLT5meF9wY3JlbCkKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDEpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ18yNF9QTFRfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQzoKLQkgIGlmICghZml4cC0+ZnhfcGNyZWwgJiYgIWZpeHAtPmZ4X2RvbmUpCi0JICAgIGFib3J0ICgpOwotCi0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgIHsKLQkgICAgY2hhciAqd2hlcmU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgICAgCi0JICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0JICAgICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLwotCSAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLQkgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCSAgICAgIGluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICAgIGVsc2UKLQkgICAgICBpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCSAgICBpZiAoKHZhbHVlICYgMykgIT0gMCkKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygibXVzdCBicmFuY2ggdG8gYW4gYWRkcmVzcyBhIG11bHRpcGxlIG9mIDQiKSk7Ci0JICAgIGlmICgob2Zmc2V0VCkgdmFsdWUgPCAtMHg0MDAwMDAwMAotCQl8fCAob2Zmc2V0VCkgdmFsdWUgPj0gMHg0MDAwMDAwMCkKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiQGxvY2FsIG9yIEBwbHQgYnJhbmNoIGRlc3RpbmF0aW9uIGlzIHRvbyBmYXIgYXdheSwgJWxkIGJ5dGVzIiksCi0JCQkgICAgdmFsdWUpOwotCSAgICBpbnNuID0gaW5zbiB8ICh2YWx1ZSAmIDB4MDNmZmZmZmMpOwotCSAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQkgICAgZWxzZQotCSAgICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotCSAgZml4cC0+ZnhfZG9uZSA9IDA7Ci0JICBpZiAoZml4cC0+ZnhfYWRkc3kKLQkgICAgICAmJiAhU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICAmJiAhU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCi0JICAgIFNfU0VUX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotCSAgZml4cC0+ZnhfZG9uZSA9IDA7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBmcHJpbnRmKHN0ZGVyciwKLQkJICBfKCJHYXMgZmFpbHVyZSwgcmVsb2MgdmFsdWUgJWRcbiIpLCBmaXhwLT5meF9yX3R5cGUpOwotCSAgZmZsdXNoKHN0ZGVycik7Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VMRgotICBmaXhwLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsKLSNlbHNlCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1BQQ19UT0MxNikKLSAgICBmaXhwLT5meF9hZGRudW1iZXIgPSAwOwotICBlbHNlCi0gICAgewotI2lmZGVmIFRFX1BFCi0gICAgICBmaXhwLT5meF9hZGRudW1iZXIgPSAwOwotI2Vsc2UKLSAgICAgIC8qIFdlIHdhbnQgdG8gdXNlIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHNlZ21lbnQgb2YgdGhlCi0JIHN5bWJvbCwgbm90IHRoZSBhY3R1YWwgVk1BIG9mIHRoZSBzeW1ib2wuICAqLwotICAgICAgZml4cC0+ZnhfYWRkbnVtYmVyID0KLQktIGJmZF9nZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpKTsKLSNlbmRpZgotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiAxOwotfQotCi0vKiBHZW5lcmF0ZSBhIHJlbG9jIGZvciBhIGZpeHVwLiAgKi8KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJldHVybiByZWxvYzsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtcHBjLmggYi9nYXMvY29uZmlnL3RjLXBwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNhMjE1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtcHBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyogdGMtcHBjLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXBwYy5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19QUEMKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0vKiBTZXQgdGhlIGVuZGlhbm5lc3Mgd2UgYXJlIHVzaW5nLiAgRGVmYXVsdCB0byBiaWcgZW5kaWFuLiAgKi8KLSNpZm5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBQb3dlclBDIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIElmIE9CSl9DT0ZGIGlzIGRlZmluZWQsIGFuZCBURV9QRSBpcyBub3QgZGVmaW5lZCwgd2UgYXJlIGFzc2VtYmxpbmcKLSAgIFhDT0ZGIGZvciBBSVggb3IgUG93ZXJNYWMuICBJZiBURV9QRSBpcyBkZWZpbmVkLCB3ZSBhcmUgYXNzZW1ibGluZwotICAgQ09GRiBmb3IgV2luZG93cyBOVC4gICovCi0KLSNpZmRlZiBPQkpfQ09GRgotI2lmbmRlZiBURV9QRQotI2RlZmluZSBPQkpfWENPRkYKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIChwcGNfYXJjaCAoKSkKLWV4dGVybiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgcHBjX2FyY2ggUEFSQU1TICgodm9pZCkpOwotCi0vKiBXaGV0aGVyIG9yIG5vdCB0aGUgdGFyZ2V0IGlzIGJpZyBlbmRpYW4gKi8KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLS8qIFRoZSB0YXJnZXQgQkZEIGZvcm1hdC4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNpZmRlZiBURV9QRQotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJwZS1wb3dlcnBjIiA6ICJwZS1wb3dlcnBjbGUiKQotI2Vsc2UKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYWl4Y29mZi1yczYwMDAiCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBQb3dlck1hYyBoYXMgYSBCRkQgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gQUlYJ3MuICAqLwotI2lmZGVmIFRFX1BPV0VSTUFDCi0jaWZkZWYgVEFSR0VUX0ZPUk1BVAotI3VuZGVmIFRBUkdFVF9GT1JNQVQKLSNlbmRpZgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJ4Y29mZi1wb3dlcm1hYyIKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJlbGYzMi1wb3dlcnBjIiA6ICJlbGYzMi1wb3dlcnBjbGUiKQotI2VuZGlmCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiAkIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24uICAqLwotI2RlZmluZSBET0xMQVJfRE9UCi0KLS8qIFN0cmluZ3MgZG8gbm90IHVzZSBiYWNrc2xhc2ggZXNjYXBlcyB1bmRlciBDT0ZGLiAgKi8KLSNpZmRlZiBPQkpfQ09GRgotI2RlZmluZSBOT19TVFJJTkdfRVNDQVBFUwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLSNlbmRpZgotCi0jaWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgUFBDX0JJR19FTkRJQU4gMQotI2Vsc2UKLSNkZWZpbmUgUFBDX0JJR19FTkRJQU4gMAotI2VuZGlmCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogV2Ugc2V0IHRoZSBmeF9kb25lIGZpZWxkIGFwcHJvcHJpYXRlbHkgaW4gbWRfYXBwbHlfZml4LiAgKi8KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0MCi0jaWZkZWYgVEVfUEUKLQotLyogUXVlc3Rpb24gbWFya3MgYXJlIHBlcm1pdHRlZCBpbiBzeW1ib2wgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfUU0gMQotCi0vKiBEb24ndCBhZGp1c3QgVE9DIHJlbG9jcy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKGZpeHApIHBwY19wZV9maXhfYWRqdXN0YWJsZSAoZml4cCkKLWV4dGVybiBpbnQgcHBjX3BlX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBEZWNsYXJhdGlvbnMgbmVlZGVkIHdoZW4gZ2VuZXJhdGluZyBYQ09GRiBjb2RlLiAgWENPRkYgaXMgYW4KLSAgIGV4dGVuc2lvbiBvZiBDT0ZGLCB1c2VkIG9ubHkgb24gdGhlIFJTLzYwMDAuICBSYXRoZXIgdGhhbiBjcmVhdGUgYW4KLSAgIG9iai14Y29mZiwgd2UganVzdCB1c2Ugb2JqLWNvZmYsIGFuZCBoYW5kbGUgdGhlIGV4dGVuc2lvbnMgaGVyZSBpbgotICAgdGMtcHBjLiAgKi8KLQotLyogV2UgbmVlZCB0byBrZWVwIHNvbWUgaW5mb3JtYXRpb24gZm9yIHN5bWJvbHMuICAqLwotc3RydWN0IHBwY190Y19zeQotewotICAvKiBXZSBrZWVwIGEgZmV3IGxpbmtlZCBsaXN0cyBvZiBzeW1ib2xzLiAgKi8KLSAgc3ltYm9sUyAqbmV4dDsKLSAgLyogTm9uLXplcm8gaWYgdGhlIHN5bWJvbCBzaG91bGQgYmUgb3V0cHV0LiAgVGhlIFJTLzYwMDAgYXNzZW1ibGVyCi0gICAgIG9ubHkgb3V0cHV0cyBzeW1ib2xzIHRoYXQgYXJlIGV4dGVybmFsIG9yIGFyZSBtZW50aW9uZWQgaW4gYQotICAgICAuZ2xvYmwgb3IgLmxnbG9ibCBzdGF0ZW1lbnQuICAqLwotICBpbnQgb3V0cHV0OwotICAvKiBUaGUgc3ltYm9sIGNsYXNzLiAgKi8KLSAgaW50IGNsYXNzOwotICAvKiBUaGUgcmVhbCBuYW1lLCBpZiB0aGUgc3ltYm9sIHdhcyByZW5hbWVkLiAgKi8KLSAgY2hhciAqcmVhbF9uYW1lOwotICAvKiBGb3IgYSBjc2VjdCBzeW1ib2wsIHRoZSBzdWJzZWdtZW50IHdlIGFyZSB1c2luZy4gIFRoaXMgaXMgemVybwotICAgICBmb3Igc3ltYm9scyB0aGF0IGFyZSBub3QgY3NlY3RzLiAgKi8KLSAgc3Vic2VnVCBzdWJzZWc7Ci0gIC8qIEZvciBhIGNzZWN0IG9yIGNvbW1vbiBzeW1ib2wsIHRoZSBhbGlnbm1lbnQgdG8gdXNlLiAgKi8KLSAgaW50IGFsaWduOwotICAvKiBGb3IgYSBmdW5jdGlvbiBzeW1ib2wsIGEgc3ltYm9sIHdob3NlIHZhbHVlIGlzIHRoZSBzaXplLiAgVGhlCi0gICAgIGZpZWxkIGlzIE5VTEwgaWYgdGhlcmUgaXMgbm8gc2l6ZS4gICovCi0gIHN5bWJvbFMgKnNpemU7Ci0gIC8qIEZvciBhIGNzZWN0IHN5bWJvbCwgdGhlIGxhc3Qgc3ltYm9sIHdoaWNoIGhhcyBiZWVuIGRlZmluZWQgaW4KLSAgICAgdGhpcyBjc2VjdCwgb3IgTlVMTCBpZiBub25lIGhhdmUgYmVlbiBkZWZpbmVkIHNvIGZhci4gIEZvciBhIC5icwotICAgICBzeW1ib2wsIHRoZSByZWZlcmVuY2VkIGNzZWN0IHN5bWJvbC4gICovCi0gIHN5bWJvbFMgKndpdGhpbjsKLX07Ci0KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSBzdHJ1Y3QgcHBjX3RjX3N5Ci0KLS8qIFdlIG5lZWQgYW4gYWRkaXRpb25hbCBhdXhlbnQgZm9yIGZ1bmN0aW9uIHN5bWJvbHMuICAqLwotI2RlZmluZSBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUyAyCi0KLS8qIFNxdWFyZSBhbmQgY3VybHkgYnJhY2tldHMgYXJlIHBlcm1pdHRlZCBpbiBzeW1ib2wgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfQlIgMwotCi0vKiBDYW5vbmljYWxpemUgdGhlIHN5bWJvbCBuYW1lLiAgKi8KLSNkZWZpbmUgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKG5hbWUpIHBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpCi1leHRlcm4gY2hhciAqcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBQQVJBTVMgKChjaGFyICopKTsKLQotLyogR2V0IHRoZSBzeW1ib2wgY2xhc3MgZnJvbSB0aGUgbmFtZS4gICovCi0jZGVmaW5lIHRjX3N5bWJvbF9uZXdfaG9vayhzeW0pIHBwY19zeW1ib2xfbmV3X2hvb2sgKHN5bSkKLWV4dGVybiB2b2lkIHBwY19zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLS8qIFNldCB0aGUgc3ltYm9sIGNsYXNzIG9mIGEgbGFiZWwgYmFzZWQgb24gdGhlIGNzZWN0LiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIHBwY19mcm9iX2xhYmVsIChzeW0pCi1leHRlcm4gdm9pZCBwcGNfZnJvYl9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogVE9DIHJlbG9jcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoZml4cCkgcHBjX2ZpeF9hZGp1c3RhYmxlIChmaXhwKQotZXh0ZXJuIGludCBwcGNfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIEEgcmVsb2NhdGlvbiBmcm9tIG9uZSBjc2VjdCB0byBhbm90aGVyIG11c3QgYmUga2VwdC4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgcHBjX2ZvcmNlX3JlbG9jYXRpb24gKEZJWFApCi1leHRlcm4gaW50IHBwY19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBXZSBuZWVkIHRvIHNldCB0aGUgc2VjdGlvbiBWTUEuICAqLwotI2RlZmluZSB0Y19mcm9iX3NlY3Rpb24oc2VjKSBwcGNfZnJvYl9zZWN0aW9uIChzZWMpCi1leHRlcm4gdm9pZCBwcGNfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLQotLyogRmluaXNoIHVwIHRoZSBzeW1ib2wuICAqLwotI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0sIHB1bnQpIHB1bnQgPSBwcGNfZnJvYl9zeW1ib2wgKHN5bSkKLWV4dGVybiBpbnQgcHBjX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBGaW5pc2ggdXAgdGhlIGVudGlyZSBzeW10YWIuICAqLwotI2RlZmluZSB0Y19hZGp1c3Rfc3ltdGFiKCkgcHBjX2FkanVzdF9zeW10YWIgKCkKLWV4dGVybiB2b2lkIHBwY19hZGp1c3Rfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogTmljbGFzIEFuZGVyc3NvbiA8bmljYW5AaWRhLmxpdS5zZT4gc2F5cyB0aGlzIGlzIG5lZWRlZC4gICovCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgotCi0vKiBXZSBhbHNvIG5lZWQgdG8gY29weSwgaW4gcGFydGljdWxhciwgdGhlIGNsYXNzIG9mIHRoZSBzeW1ib2wsCi0gICBvdmVyIHdoYXQgb2JqLWNvZmYgd291bGQgb3RoZXJ3aXNlIGhhdmUgY29waWVkLiAgKi8KLSNkZWZpbmUgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMoZGVzdCxzcmMpCQkJXAotZG8gewkJCQkJCQkJXAotICBpZiAoU0ZfR0VUX0dFVF9TRUdNRU5UIChkZXN0KSkJCQkJXAotICAgIFNfU0VUX1NFR01FTlQgKGRlc3QsIFNfR0VUX1NFR01FTlQgKHNyYykpOwkJCVwKLSAgc3ltYm9sX2dldF90YyAoZGVzdCktPnNpemUgPSBzeW1ib2xfZ2V0X3RjIChzcmMpLT5zaXplOwlcCi0gIHN5bWJvbF9nZXRfdGMgKGRlc3QpLT5hbGlnbiA9IHN5bWJvbF9nZXRfdGMgKHNyYyktPmFsaWduOwlcCi0gIHN5bWJvbF9nZXRfdGMgKGRlc3QpLT5jbGFzcyA9IHN5bWJvbF9nZXRfdGMgKHNyYyktPmNsYXNzOwlcCi0gIHN5bWJvbF9nZXRfdGMgKGRlc3QpLT53aXRoaW4gPSBzeW1ib2xfZ2V0X3RjIChzcmMpLT53aXRoaW47CVwKLX0gd2hpbGUgKDApCi0KLQotI2VuZGlmIC8qIE9CSl9YQ09GRiAqLwotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBCcmFuY2ggcHJlZGljdGlvbiByZWxvY2F0aW9ucyBtdXN0IGZvcmNlIHJlbG9jYXRpb24sIGFzIG11c3QKLSAgIHRoZSB2dGFibGUgZGVzY3JpcHRpb24gcmVsb2NzLiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQkJCQkJXAotKChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4JCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTgkJCVwKLSB8fCAoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04oRklYUCxTRUMpCQkJCVwKLShUQ19GT1JDRV9SRUxPQ0FUSU9OIChGSVhQKQkJCQkJCVwKLSB8fCAoKEZJWFApLT5meF9hZGRzeSAmJiAhKEZJWFApLT5meF9zdWJzeQkJCQlcCi0gICAgICYmIFNfR0VUX1NFR01FTlQgKChGSVhQKS0+ZnhfYWRkc3kpICE9IFNFQykpCi0KLS8qIFN1cHBvcnQgZm9yIFNIRl9FWENMVURFIGFuZCBTSFRfT1JERVJFRCAqLwotZXh0ZXJuIGludCBwcGNfc2VjdGlvbl9sZXR0ZXIgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1leHRlcm4gaW50IHBwY19zZWN0aW9uX3R5cGUgUEFSQU1TICgoY2hhciAqLCBzaXplX3QpKTsKLWV4dGVybiBpbnQgcHBjX3NlY3Rpb25fd29yZCBQQVJBTVMgKChjaGFyICosIHNpemVfdCkpOwotZXh0ZXJuIGludCBwcGNfc2VjdGlvbl9mbGFncyBQQVJBTVMgKChpbnQsIGludCwgaW50KSk7Ci0KLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fbGV0dGVyKExFVFRFUiwgUFRSX01TRykJcHBjX3NlY3Rpb25fbGV0dGVyIChMRVRURVIsIFBUUl9NU0cpCi0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX3R5cGUoU1RSLCBMRU4pCQlwcGNfc2VjdGlvbl90eXBlIChTVFIsIExFTikKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fd29yZChTVFIsIExFTikJCXBwY19zZWN0aW9uX3dvcmQgKFNUUiwgTEVOKQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9mbGFncyhGTEFHUywgQVRUUiwgVFlQRSkJcHBjX3NlY3Rpb25fZmxhZ3MgKEZMQUdTLCBBVFRSLCBUWVBFKQotCi0vKiBBZGQgZXh0cmEgUFBDIHNlY3Rpb25zIC0tIE5vdGUsIGZvciBub3csIG1ha2UgLnNic3MyIGFuZCAuUFBDLkVNQi5zYnNzMCBhCi0gICBub3JtYWwgc2VjdGlvbiwgYW5kIG5vdCBhIGJzcyBzZWN0aW9uIHNvIHRoYXQgdGhlIGxpbmtlciBkb2Vzbid0IGNyYXRlcgotICAgd2hlbiB0cnlpbmcgdG8gbWFrZSBtb3JlIHRoYW4gMiBzZWN0aW9ucy4gICovCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLnRhZ3MiLAkJU0hUX09SREVSRUQsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5zZGF0YSIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5zYnNzIiwJCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5zZGF0YTIiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwgXAotICB7ICIuc2JzczIiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwgXAotICB7ICIuUFBDLkVNQi5zZGF0YTAiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5QUEMuRU1CLnNic3MwIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwKLQotI2RlZmluZSB0Y19jb21tZW50X2NoYXJzIHBwY19jb21tZW50X2NoYXJzCi1leHRlcm4gY29uc3QgY2hhciAqcHBjX2NvbW1lbnRfY2hhcnM7Ci0KLS8qIEtlZXAgcmVsb2NhdGlvbnMgcmVsYXRpdmUgdG8gdGhlIEdPVCwgb3Igbm9uLVBDIHJlbGF0aXZlLiAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpICAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKLSAgKChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzE2X0dPVE9GRiAgICAgICAgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19MTzE2X0dPVE9GRiAgICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9HT1RPRkYgICAgICAgICAJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19HUFJFTDE2ICAgICAgICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkJCQlcCi0gICAmJiAhIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJCQlcCi0gICAmJiAoKEZJWCktPmZ4X3BjcmVsCQkJCSAgICAgICAgCQlcCi0gICAgICAgfHwgKChGSVgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCQlcCi0JICAgJiYgKFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9zdWJzeSkJCQkJXAotCSAgICAgICA9PSBTX0dFVF9TRUdNRU5UICgoRklYKS0+ZnhfYWRkc3kpKSkJCQlcCi0gICAgICAgfHwgU19JU19MT0NBTCAoKEZJWCktPmZ4X2FkZHN5KSkpCi0KLS8qIFdlIG11c3QgbmV2ZXIgZXZlciB0cnkgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIHRvIGV4dGVybmFsbHkgdmlzaWJsZQotICAgc3ltYm9scyBpbiB0aGUgYXNzZW1ibGVyLCBiZWNhdXNlIHRoZSAubyBmaWxlIG1pZ2h0IGdvIGludG8gYSBzaGFyZWQKLSAgIGxpYnJhcnksIGFuZCBzb21lIG90aGVyIHNoYXJlZCBsaWJyYXJ5IG1pZ2h0IG92ZXJyaWRlIHRoYXQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMIFwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiBTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKQotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0vKiBjYWxsIG1kX2FwcGx5X2ZpeDMgd2l0aCBzZWdtZW50IGluc3RlYWQgb2YgbWRfYXBwbHlfZml4ICovCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpCi1leHRlcm4gbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7Ci0KLSNkZWZpbmUgbWRfcGFyc2VfbmFtZShuYW1lLCBleHApIHBwY19wYXJzZV9uYW1lIChuYW1lLCBleHApCi1leHRlcm4gaW50IHBwY19wYXJzZV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IGV4cHJlc3Npb25TICopKTsKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc2guYyBiL2dhcy9jb25maWcvdGMtc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwM2Y1Yi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDE1ICswLDAgQEAKLS8qIHRjLXNoLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEhpdGFjaGkgU3VwZXItSAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgIHNhY0BjeWdudXMuY29tCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgIm9wY29kZXMvc2gtb3BjLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvc2guaCIKLSNlbmRpZgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiISMiOwotCi1zdGF0aWMgdm9pZCBzX3VzZXMgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyB2b2lkIHNoX2NvdW50X3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgc2VnVCwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBzaF9mcm9iX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOwotCi12b2lkIGNvbnMgKCk7Ci12b2lkIHNfYWxpZ25fYnl0ZXMgKCk7Ci1zdGF0aWMgdm9pZCBzX3VhY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBzaF9vcGNvZGVfaW5mbyAqZmluZF9jb29rZWRfb3Bjb2RlIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGFzc2VtYmxlX3BwaSBQQVJBTVMgKChjaGFyICosIHNoX29wY29kZV9pbmZvICopKTsKLQotaW50IHNobCA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1saXR0bGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc2hsID0gMTsKLSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotfQotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImludCIsIGNvbnMsIDR9LAotICB7IndvcmQiLCBjb25zLCAyfSwKLSAgeyJmb3JtIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsibGl0dGxlIiwgbGl0dGxlLCAwfSwKLSAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCi0gIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAotICB7InVzZXMiLCBzX3VzZXMsIDB9LAotICB7InVhd29yZCIsIHNfdWFjb25zLCAyfSwKLSAgeyJ1YWxvbmciLCBzX3VhY29ucywgNH0sCi0gIHswLCAwLCAwfQotfTsKLQotLyppbnQgbWRfcmVsb2Nfc2l6ZTsgKi8KLQotaW50IHNoX3JlbGF4OwkJLyogc2V0IGlmIC1yZWxheCBzZWVuICovCi0KLS8qIFdoZXRoZXIgLXNtYWxsIHdhcyBzZWVuLiAgKi8KLQotaW50IHNoX3NtYWxsOwotCi0vKiBXaGV0aGVyIC1kc3Agd2FzIHNlZW4uICAqLwotCi1zdGF0aWMgaW50IHNoX2RzcDsKLQotLyogVGhlIGJpdCBtYXNrIG9mIGFyY2hpdGVjdHVyZXMgdGhhdCBjb3VsZAotICAgYWNjb21vZGF0ZSB0aGUgaW5zbnMgc2VlbiBzbyBmYXIuICAqLwotc3RhdGljIGludCB2YWxpZF9hcmNoOwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotCi0jZGVmaW5lIEpSRUcgMTQJCQkvKiBSZWdpc3RlciB1c2VkIGFzIGEgdGVtcCB3aGVuIHJlbGF4aW5nICovCi0jZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgNCkgKyAobGVuZ3RoKSkKLSNkZWZpbmUgR0VUX1dIQVQoeCkgKCh4Pj40KSkKLQotLyogVGhlc2UgYXJlIHRoZSB0aHJlZSB0eXBlcyBvZiByZWxheGFibGUgaW5zdHJjdGlvbiAqLwotI2RlZmluZSBDT05EX0pVTVAgMQotI2RlZmluZSBDT05EX0pVTVBfREVMQVkgMgotI2RlZmluZSBVTkNPTkRfSlVNUCAgMwotI2RlZmluZSBFTkQgNAotCi0jZGVmaW5lIFVOREVGX0RJU1AgMAotI2RlZmluZSBDT05EOCAgMQotI2RlZmluZSBDT05EMTIgMgotI2RlZmluZSBDT05EMzIgMwotI2RlZmluZSBVTkNPTkQxMiAxCi0jZGVmaW5lIFVOQ09ORDMyIDIKLSNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDQKLQotI2RlZmluZSBVTkNPTkQxMiAxCi0jZGVmaW5lIFVOQ09ORDMyIDIKLQotLyogQnJhbmNoIGRpc3BsYWNlbWVudHMgYXJlIGZyb20gdGhlIGFkZHJlc3Mgb2YgdGhlIGJyYW5jaCBwbHVzCi0gICBmb3VyLCB0aHVzIGFsbCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBoYXZlIDQgYWRkZWQgdG8gdGhlbS4gICovCi0jZGVmaW5lIENPTkQ4X0YgMjU4Ci0jZGVmaW5lIENPTkQ4X00gLTI1MgotI2RlZmluZSBDT05EOF9MRU5HVEggMgotCi0vKiBUaGVyZSBpcyBvbmUgZXh0cmEgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBicmFuY2gsIHNvIHdlIG11c3QgYWRkCi0gICB0d28gbW9yZSBieXRlcyB0byBhY2NvdW50IGZvciBpdC4gICovCi0jZGVmaW5lIENPTkQxMl9GIDQxMDAKLSNkZWZpbmUgQ09ORDEyX00gLTQwOTAKLSNkZWZpbmUgQ09ORDEyX0xFTkdUSCA2Ci0KLSNkZWZpbmUgQ09ORDEyX0RFTEFZX0xFTkdUSCA0Ci0KLS8qID8/PyBUaGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYXJlIHdyb25nLCBidXQgdGhpcyBkb2VzIG5vdCBtYXR0ZXIKLSAgIHNpbmNlIHRoaXMgcmVsb2NhdGlvbiB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAgKi8KLSNkZWZpbmUgQ09ORDMyX0YgKDE8PDMwKQotI2RlZmluZSBDT05EMzJfTSAtKDE8PDMwKQotI2RlZmluZSBDT05EMzJfTEVOR1RIIDE0Ci0KLSNkZWZpbmUgVU5DT05EMTJfRiA0MDk4Ci0jZGVmaW5lIFVOQ09ORDEyX00gLTQwOTIKLSNkZWZpbmUgVU5DT05EMTJfTEVOR1RIIDIKLQotLyogPz8/IFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhcmUgd3JvbmcsIGJ1dCB0aGlzIGRvZXMgbm90IG1hdHRlcgotICAgc2luY2UgdGhpcyByZWxvY2F0aW9uIHR5cGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICAqLwotI2RlZmluZSBVTkNPTkQzMl9GICgxPDwzMCkKLSNkZWZpbmUgVU5DT05EMzJfTSAtKDE8PDMwKQotI2RlZmluZSBVTkNPTkQzMl9MRU5HVEggMTQKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbQyAoRU5ELCAwKV0gPSB7Ci0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotCi0gIHsgMCB9LAotICAvKiBDIChDT05EX0pVTVAsIENPTkQ4KSAqLwotICB7IENPTkQ4X0YsIENPTkQ4X00sIENPTkQ4X0xFTkdUSCwgQyAoQ09ORF9KVU1QLCBDT05EMTIpIH0sCi0gIC8qIEMgKENPTkRfSlVNUCwgQ09ORDEyKSAqLwotICB7IENPTkQxMl9GLCBDT05EMTJfTSwgQ09ORDEyX0xFTkdUSCwgQyAoQ09ORF9KVU1QLCBDT05EMzIpLCB9LAotICAvKiBDIChDT05EX0pVTVAsIENPTkQzMikgKi8KLSAgeyBDT05EMzJfRiwgQ09ORDMyX00sIENPTkQzMl9MRU5HVEgsIDAsIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0KLSAgeyAwIH0sCi0gIC8qIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDgpICovCi0gIHsgQ09ORDhfRiwgQ09ORDhfTSwgQ09ORDhfTEVOR1RILCBDIChDT05EX0pVTVBfREVMQVksIENPTkQxMikgfSwKLSAgLyogQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTIpICovCi0gIHsgQ09ORDEyX0YsIENPTkQxMl9NLCBDT05EMTJfREVMQVlfTEVOR1RILCBDIChDT05EX0pVTVBfREVMQVksIENPTkQzMiksIH0sCi0gIC8qIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDMyKSAqLwotICB7IENPTkQzMl9GLCBDT05EMzJfTSwgQ09ORDMyX0xFTkdUSCwgMCwgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLQotICB7IDAgfSwKLSAgLyogQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKSAqLwotICB7IFVOQ09ORDEyX0YsIFVOQ09ORDEyX00sIFVOQ09ORDEyX0xFTkdUSCwgQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKSwgfSwKLSAgLyogQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKSAqLwotICB7IFVOQ09ORDMyX0YsIFVOQ09ORDMyX00sIFVOQ09ORDMyX0xFTkdUSCwgMCwgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMKLSAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgaW50IHRhcmdldF9hcmNoOwotCi0jaWZkZWYgVEVfUEUKLSAgLyogVGhlIFdpbkNFIE9TIG9ubHkgc3VwcG9ydHMgbGl0dGxlIGVuZGlhbiBleGVjdXRhYmxlcy4gICovCi0gIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLSNlbHNlCi0gIGlmICghIHNobCkKLSAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0jZW5kaWYKLQotICB0YXJnZXRfYXJjaCA9IGFyY2hfc2gxX3VwICYgfihzaF9kc3AgPyBhcmNoX3NoM2VfdXAgOiBhcmNoX3NoX2RzcF91cCk7Ci0gIHZhbGlkX2FyY2ggPSB0YXJnZXRfYXJjaDsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChvcGNvZGUgPSBzaF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCi0JewotCSAgaWYgKCEgKG9wY29kZS0+YXJjaCAmIHRhcmdldF9hcmNoKSkKLQkgICAgY29udGludWU7Ci0JICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBNYWtlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgcG9pbnQgdG8gdGhlIHNhbWUKLQkgICAgIHN0cmluZyAqLwotCSAgb3Bjb2RlLT5uYW1lID0gcHJldl9uYW1lOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX207Ci1zdGF0aWMgaW50IHJlZ19uOwotc3RhdGljIGludCByZWdfeCwgcmVnX3k7Ci1zdGF0aWMgaW50IHJlZ19lZmc7Ci1zdGF0aWMgaW50IHJlZ19iOwotCi1zdGF0aWMgZXhwcmVzc2lvblMgaW1tZWRpYXRlOwkvKiBhYnNvbHV0ZSBleHByZXNzaW9uICovCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBzaF9hcmdfdHlwZSB0eXBlOwotICAgIGludCByZWc7Ci0gIH0KLQotc2hfb3BlcmFuZF9pbmZvOwotCi0jZGVmaW5lIElERU5UX0NIQVIoYykgKGlzYWxudW0gKGMpIHx8IChjKSA9PSAnXycpCi0KLS8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KLXN0YXRpYyBpbnQKLXBhcnNlX3JlZyAoc3JjLCBtb2RlLCByZWcpCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgaW50ICptb2RlOwotICAgICBpbnQgKnJlZzsKLXsKLSAgLyogV2UgdXNlICEgSURFTlRfQ0hBUiBmb3IgdGhlIG5leHQgY2hhcmFjdGVyIGFmdGVyIHRoZSByZWdpc3RlciBuYW1lLCB0bwotICAgICBtYWtlIHN1cmUgdGhhdCB3ZSB3b24ndCBhY2NpZGVudGFsbHkgcmVjb2duaXplIGEgc3ltYm9sIG5hbWUgc3VjaCBhcwotICAgICAnc3JhbScgb3Igc3JfcmFtIGFzIGJlaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZWdpc3RlciAnc3InLiAgKi8KLQotICBpZiAoc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID09ICcxJykKLQl7Ci0JICBpZiAoc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzUnCi0JICAgICAgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gQV9SRUdfTjsKLQkgICAgICAqcmVnID0gMTAgKyBzcmNbMl0gLSAnMCc7Ci0JICAgICAgcmV0dXJuIDM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzknCi0JICAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotCXsKLQkgICptb2RlID0gQV9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzFdIC0gJzAnKTsKLQkgIHJldHVybiAyOwotCX0KLSAgICAgIGlmIChzcmNbMV0gPj0gJzAnICYmIHNyY1sxXSA8PSAnNycgJiYgc3RybmNtcCAoJnNyY1syXSwgIl9iYW5rIiwgNSkgPT0gMAotCSAgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzddKSkKLQl7Ci0JICAqbW9kZSA9IEFfUkVHX0I7Ci0JICAqcmVnICA9IChzcmNbMV0gLSAnMCcpOwotCSAgcmV0dXJuIDc7Ci0JfQotCi0gICAgICBpZiAoc3JjWzFdID09ICdlJyAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotCXsKLQkgICptb2RlID0gQV9SRTsKLQkgIHJldHVybiAyOwotCX0KLSAgICAgIGlmIChzcmNbMV0gPT0gJ3MnICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCi0JewotCSAgKm1vZGUgPSBBX1JTOwotCSAgcmV0dXJuIDI7Ci0JfQotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdhJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID09ICcwJykKLQl7Ci0JICBpZiAoISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gRFNQX1JFR19OOwotCSAgICAgICpyZWcgPSBBX0EwX05VTTsKLQkgICAgICByZXR1cm4gMjsKLQkgICAgfQotCSAgaWYgKHNyY1syXSA9PSAnZycgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gRFNQX1JFR19OOwotCSAgICAgICpyZWcgPSBBX0EwR19OVU07Ci0JICAgICAgcmV0dXJuIDM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjWzFdID09ICcxJykKLQl7Ci0JICBpZiAoISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gRFNQX1JFR19OOwotCSAgICAgICpyZWcgPSBBX0ExX05VTTsKLQkgICAgICByZXR1cm4gMjsKLQkgICAgfQotCSAgaWYgKHNyY1syXSA9PSAnZycgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gRFNQX1JFR19OOwotCSAgICAgICpyZWcgPSBBX0ExR19OVU07Ci0JICAgICAgcmV0dXJuIDM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzcmNbMV0gPT0gJ3gnICYmIHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICcxJwotCSAgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQl7Ci0JICAqbW9kZSA9IEFfUkVHX047Ci0JICAqcmVnID0gNCArIChzcmNbMV0gLSAnMCcpOwotCSAgcmV0dXJuIDM7Ci0JfQotICAgICAgaWYgKHNyY1sxXSA9PSAneScgJiYgc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzEnCi0JICAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotCXsKLQkgICptb2RlID0gQV9SRUdfTjsKLQkgICpyZWcgPSA2ICsgKHNyY1sxXSAtICcwJyk7Ci0JICByZXR1cm4gMzsKLQl9Ci0gICAgICBpZiAoc3JjWzFdID09ICdzJyAmJiBzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnMycKLQkgICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JewotCSAgaW50IG4gPSBzcmNbMV0gLSAnMCc7Ci0KLQkgICptb2RlID0gQV9SRUdfTjsKLQkgICpyZWcgPSBuIHwgKCh+biAmIDIpIDw8IDEpOwotCSAgcmV0dXJuIDM7Ci0JfQotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdpJyAmJiBzcmNbMV0gJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID09ICdzJykKLQl7Ci0JICAqbW9kZSA9IEFfUkVHX047Ci0JICAqcmVnID0gODsKLQkgIHJldHVybiAyOwotCX0KLSAgICAgIGlmIChzcmNbMV0gPT0gJ3gnKQotCXsKLQkgICptb2RlID0gQV9SRUdfTjsKLQkgICpyZWcgPSA4OwotCSAgcmV0dXJuIDI7Ci0JfQotICAgICAgaWYgKHNyY1sxXSA9PSAneScpCi0JewotCSAgKm1vZGUgPSBBX1JFR19OOwotCSAgKnJlZyA9IDk7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3gnICYmIHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICcxJwotICAgICAgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IERTUF9SRUdfTjsKLSAgICAgICpyZWcgPSBBX1gwX05VTSArIHNyY1sxXSAtICcwJzsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICd5JyAmJiBzcmNbMV0gPj0gJzAnICYmIHNyY1sxXSA8PSAnMScKLSAgICAgICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBEU1BfUkVHX047Ci0gICAgICAqcmVnID0gQV9ZMF9OVU0gKyBzcmNbMV0gLSAnMCc7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAnbScgJiYgc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzEnCi0gICAgICAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotICAgIHsKLSAgICAgICptb2RlID0gRFNQX1JFR19OOwotICAgICAgKnJlZyA9IHNyY1sxXSA9PSAnMCcgPyBBX00wX05VTSA6IEFfTTFfTlVNOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnCi0gICAgICAmJiBzcmNbMV0gPT0gJ3MnCi0gICAgICAmJiBzcmNbMl0gPT0gJ3InICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NTUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnICYmIHNyY1syXSA9PSAnYycKLSAgICAgICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NQQzsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ2cnICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NHUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdkJyAmJiBzcmNbMV0gPT0gJ3MnICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX0RTUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdkJyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX0RCUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3InICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NSOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfUkVHX047Ci0gICAgICAqcmVnID0gMTU7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncCcgJiYgc3JjWzFdID09ICdyJyAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9QUjsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAncCcgJiYgc3JjWzFdID09ICdjJyAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9ESVNQX1BDOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdnJyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX0dCUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAndicgJiYgc3JjWzFdID09ICdiJyAmJiBzcmNbMl0gPT0gJ3InCi0gICAgICAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9WQlI7Ci0gICAgICByZXR1cm4gMzsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAnbScgJiYgc3JjWzFdID09ICdhJyAmJiBzcmNbMl0gPT0gJ2MnCi0gICAgICAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotICAgIHsKLSAgICAgIGlmIChzcmNbM10gPT0gJ2wnKQotCXsKLQkgICptb2RlID0gQV9NQUNMOwotCSAgcmV0dXJuIDQ7Ci0JfQotICAgICAgaWYgKHNyY1szXSA9PSAnaCcpCi0JewotCSAgKm1vZGUgPSBBX01BQ0g7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdtJyAmJiBzcmNbMV0gPT0gJ28nICYmIHNyY1syXSA9PSAnZCcKLSAgICAgICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX01PRDsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzJdID09ICcxJykKLQl7Ci0JICBpZiAoc3JjWzNdID49ICcwJyAmJiBzcmNbM10gPD0gJzUnCi0JICAgICAgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzRdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gRl9SRUdfTjsKLQkgICAgICAqcmVnID0gMTAgKyBzcmNbM10gLSAnMCc7Ci0JICAgICAgcmV0dXJuIDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzknCi0JICAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotCXsKLQkgICptb2RlID0gRl9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzJdIC0gJzAnKTsKLQkgIHJldHVybiAzOwotCX0KLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ2QnICYmIHNyY1sxXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1syXSA9PSAnMScpCi0JewotCSAgaWYgKHNyY1szXSA+PSAnMCcgJiYgc3JjWzNdIDw9ICc0JyAmJiAhICgoc3JjWzNdIC0gJzAnKSAmIDEpCi0JICAgICAgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzRdKSkKLQkgICAgewotCSAgICAgICptb2RlID0gRF9SRUdfTjsKLQkgICAgICAqcmVnID0gMTAgKyBzcmNbM10gLSAnMCc7Ci0JICAgICAgcmV0dXJuIDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3JjWzJdID49ICcwJyAmJiBzcmNbMl0gPD0gJzgnICYmICEgKChzcmNbMl0gLSAnMCcpICYgMSkKLQkgICYmICEgSURFTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JewotCSAgKm1vZGUgPSBEX1JFR19OOwotCSAgKnJlZyA9IChzcmNbMl0gLSAnMCcpOwotCSAgcmV0dXJuIDM7Ci0JfQotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAneCcgJiYgc3JjWzFdID09ICdkJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzJdID09ICcxJykKLQl7Ci0JICBpZiAoc3JjWzNdID49ICcwJyAmJiBzcmNbM10gPD0gJzQnICYmICEgKChzcmNbM10gLSAnMCcpICYgMSkKLQkgICAgICAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBYX1JFR19OOwotCSAgICAgICpyZWcgPSAxMSArIHNyY1szXSAtICcwJzsKLQkgICAgICByZXR1cm4gNDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnOCcgJiYgISAoKHNyY1syXSAtICcwJykgJiAxKQotCSAgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQl7Ci0JICAqbW9kZSA9IFhfUkVHX047Ci0JICAqcmVnID0gKHNyY1syXSAtICcwJykgKyAxOwotCSAgcmV0dXJuIDM7Ci0JfQotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICd2JykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzJdID09ICcxJyYmIHNyY1szXSA9PSAnMicgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzRdKSkKLQl7Ci0JICAqbW9kZSA9IFZfUkVHX047Ci0JICAqcmVnID0gMTI7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgICBpZiAoKHNyY1syXSA9PSAnMCcgfHwgc3JjWzJdID09ICc0JyB8fCBzcmNbMl0gPT0gJzgnKQotCSAgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQl7Ci0JICAqbW9kZSA9IFZfUkVHX047Ci0JICAqcmVnID0gKHNyY1syXSAtICcwJyk7Ci0JICByZXR1cm4gMzsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3AnICYmIHNyY1syXSA9PSAndScgJiYgc3JjWzNdID09ICdsJwotICAgICAgJiYgISBJREVOVF9DSEFSICgodW5zaWduZWQgY2hhcikgc3JjWzRdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEZQVUxfTjsKLSAgICAgIHJldHVybiA0OwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3AnICYmIHNyY1syXSA9PSAncycgJiYgc3JjWzNdID09ICdjJwotICAgICAgJiYgc3JjWzRdID09ICdyJyAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbNV0pKQotICAgIHsKLSAgICAgICptb2RlID0gRlBTQ1JfTjsKLSAgICAgIHJldHVybiA1OwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICd4JyAmJiBzcmNbMV0gPT0gJ20nICYmIHNyY1syXSA9PSAndCcgJiYgc3JjWzNdID09ICdyJwotICAgICAgJiYgc3JjWzRdID09ICd4JyAmJiAhIElERU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSBzcmNbNV0pKQotICAgIHsKLSAgICAgICptb2RlID0gWE1UUlhfTTQ7Ci0gICAgICByZXR1cm4gNTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzeW1ib2xTICpkb3QoKQotewotICBjb25zdCBjaGFyICpmYWtlOwotCi0gIC8qIEpGOiAnLicgaXMgcHNldWRvIHN5bWJvbCB3aXRoIHZhbHVlIG9mIGN1cnJlbnQgbG9jYXRpb24KLSAgICAgaW4gY3VycmVudCBzZWdtZW50LiAgKi8KLSAgZmFrZSA9IEZBS0VfTEFCRUxfTkFNRTsKLSAgcmV0dXJuICBzeW1ib2xfbmV3IChmYWtlLAotCQkgICAgICBub3dfc2VnLAotCQkgICAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCSAgICAgIGZyYWdfbm93KTsKLQotfQotCi0KLXN0YXRpYwotY2hhciAqCi1wYXJzZV9leHAgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIGNoYXIgKnNhdmU7Ci0gIGNoYXIgKm5ldzsKLQotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICBleHByZXNzaW9uICgmaW1tZWRpYXRlKTsKLSAgaWYgKGltbWVkaWF0ZS5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLQotLyogVGhlIG1hbnkgZm9ybXMgb2Ygb3BlcmFuZDoKLQotICAgUm4gICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgZGlyZWN0Ci0gICBAUm4gICAgICAgICAgICAgICAgICBSZWdpc3RlciBpbmRpcmVjdAotICAgQFJuKyAgICAgICAgICAgICAgICAgQXV0b2luY3JlbWVudAotICAgQC1SbiAgICAgICAgICAgICAgICAgQXV0b2RlY3JlbWVudAotICAgQChkaXNwOjQsUm4pCi0gICBAKGRpc3A6OCxHQlIpCi0gICBAKGRpc3A6OCxQQykKLQotICAgQChSMCxSbikKLSAgIEAoUjAsR0JSKQotCi0gICBkaXNwOjgKLSAgIGRpc3A6MTIKLSAgICNpbW04Ci0gICBwciwgZ2JyLCB2YnIsIG1hY2wsIG1hY2gKLQotICovCi0KLXN0YXRpYwotY2hhciAqCi1wYXJzZV9hdCAoc3JjLCBvcCkKLSAgICAgY2hhciAqc3JjOwotICAgICBzaF9vcGVyYW5kX2luZm8gKm9wOwotewotICBpbnQgbGVuOwotICBpbnQgbW9kZTsKLSAgc3JjKys7Ci0gIGlmIChzcmNbMF0gPT0gJy0nKQotICAgIHsKLSAgICAgIC8qIE11c3QgYmUgcHJlZGVjcmVtZW50ICovCi0gICAgICBzcmMrKzsKLQotICAgICAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKLSAgICAgIGlmIChtb2RlICE9IEFfUkVHX04pCi0JYXNfYmFkIChfKCJpbGxlZ2FsIHJlZ2lzdGVyIGFmdGVyIEAtIikpOwotCi0gICAgICBvcC0+dHlwZSA9IEFfREVDX047Ci0gICAgICBzcmMgKz0gbGVuOwotICAgIH0KLSAgZWxzZSBpZiAoc3JjWzBdID09ICcoJykKLSAgICB7Ci0gICAgICAvKiBDb3VsZCBiZSBAKGRpc3AsIHJuKSwgQChkaXNwLCBnYnIpLCBAKGRpc3AsIHBjKSwgIEAocjAsIGdicikgb3IKLSAgICAgICAgIEAocjAsIHJuKSAqLwotICAgICAgc3JjKys7Ci0gICAgICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOwotICAgICAgaWYgKGxlbiAmJiBtb2RlID09IEFfUkVHX04pCi0JewotCSAgc3JjICs9IGxlbjsKLQkgIGlmIChvcC0+cmVnICE9IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIm11c3QgYmUgQChyMCwuLi4pIikpOwotCSAgICB9Ci0JICBpZiAoc3JjWzBdID09ICcsJykKLQkgICAgc3JjKys7Ci0JICAvKiBOb3cgY2FuIGJlIHJuIG9yIGdiciAqLwotCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKLQkgIGlmIChtb2RlID09IEFfR0JSKQotCSAgICB7Ci0JICAgICAgb3AtPnR5cGUgPSBBX1IwX0dCUjsKLQkgICAgfQotCSAgZWxzZSBpZiAobW9kZSA9PSBBX1JFR19OKQotCSAgICB7Ci0JICAgICAgb3AtPnR5cGUgPSBBX0lORF9SMF9SRUdfTjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gQChyMCwuLi4pIikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE11c3QgYmUgYW4gQChkaXNwLC4uIHRoaW5nKSAqLwotCSAgc3JjID0gcGFyc2VfZXhwIChzcmMpOwotCSAgaWYgKHNyY1swXSA9PSAnLCcpCi0JICAgIHNyYysrOwotCSAgLyogTm93IGNhbiBiZSBybiwgZ2JyIG9yIHBjICovCi0JICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZvcC0+cmVnKTsKLQkgIGlmIChsZW4pCi0JICAgIHsKLQkgICAgICBpZiAobW9kZSA9PSBBX1JFR19OKQotCQl7Ci0JCSAgb3AtPnR5cGUgPSBBX0RJU1BfUkVHX047Ci0JCX0KLQkgICAgICBlbHNlIGlmIChtb2RlID09IEFfR0JSKQotCQl7Ci0JCSAgb3AtPnR5cGUgPSBBX0RJU1BfR0JSOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobW9kZSA9PSBBX0RJU1BfUEMpCi0JCXsKLQkJICAvKiBUdXJuIGEgcGxhaW4gQCg0LHBjKSBpbnRvIEAoLis0LHBjKSAqLwotCQkgIGlmIChpbW1lZGlhdGUuWF9vcCA9PSBPX2NvbnN0YW50KSB7IAotCQkgICAgaW1tZWRpYXRlLlhfYWRkX3N5bWJvbCA9IGRvdCgpOwotCQkgICAgaW1tZWRpYXRlLlhfb3AgPSBPX3N5bWJvbDsKLQkJICB9Ci0JCSAgb3AtPnR5cGUgPSBBX0RJU1BfUEM7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBAKGRpc3AsW1JuLCBnYnIsIHBjXSkiKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gQChkaXNwLFtSbiwgZ2JyLCBwY10pIikpOwotCSAgICB9Ci0JfQotICAgICAgc3JjICs9IGxlbjsKLSAgICAgIGlmIChzcmNbMF0gIT0gJyknKQotCWFzX2JhZCAoXygiZXhwZWN0aW5nICkiKSk7Ci0gICAgICBlbHNlCi0Jc3JjKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3JjICs9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJihvcC0+cmVnKSk7Ci0gICAgICBpZiAobW9kZSAhPSBBX1JFR19OKQotCXsKLQkgIGFzX2JhZCAoXygiaWxsZWdhbCByZWdpc3RlciBhZnRlciBAIikpOwotCX0KLSAgICAgIGlmIChzcmNbMF0gPT0gJysnKQotCXsKLQkgIHNyYysrOwotCSAgaWYgKChzcmNbMF0gPT0gJ3InICYmIHNyY1sxXSA9PSAnOCcpCi0JICAgICAgfHwgKHNyY1swXSA9PSAnaScgJiYgKHNyY1sxXSA9PSAneCcgfHwgc3JjWzFdID09ICdzJykpKQotCSAgICB7Ci0JICAgICAgc3JjICs9IDI7Ci0JICAgICAgb3AtPnR5cGUgPSBBX1BNT0RfTjsKLQkgICAgfQotCSAgaWYgKChzcmNbMF0gPT0gJ3InICYmIHNyY1sxXSA9PSAnOScpCi0JICAgICAgfHwgKHNyY1swXSA9PSAnaScgJiYgc3JjWzFdID09ICd5JykpCi0JICAgIHsKLQkgICAgICBzcmMgKz0gMjsKLQkgICAgICBvcC0+dHlwZSA9IEFfUE1PRFlfTjsKLQkgICAgfQotCSAgZWxzZQotCSAgICBvcC0+dHlwZSA9IEFfSU5DX047Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wLT50eXBlID0gQV9JTkRfTjsKLQl9Ci0gICAgfQotICByZXR1cm4gc3JjOwotfQotCi1zdGF0aWMgdm9pZAotZ2V0X29wZXJhbmQgKHB0ciwgb3ApCi0gICAgIGNoYXIgKipwdHI7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3A7Ci17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGludCBtb2RlID0gLTE7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgaWYgKHNyY1swXSA9PSAnIycpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICAqcHRyID0gcGFyc2VfZXhwIChzcmMpOwotICAgICAgb3AtPnR5cGUgPSBBX0lNTTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZWxzZSBpZiAoc3JjWzBdID09ICdAJykKLSAgICB7Ci0gICAgICAqcHRyID0gcGFyc2VfYXQgKHNyYywgb3ApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKLSAgaWYgKGxlbikKLSAgICB7Ci0gICAgICAqcHRyID0gc3JjICsgbGVuOwotICAgICAgb3AtPnR5cGUgPSBtb2RlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE5vdCBhIHJlZywgdGhlIG9ubHkgdGhpbmcgbGVmdCBpcyBhIGRpc3BsYWNlbWVudCAqLwotICAgICAgKnB0ciA9IHBhcnNlX2V4cCAoc3JjKTsKLSAgICAgIG9wLT50eXBlID0gQV9ESVNQX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAoaW5mbywgYXJncywgb3BlcmFuZCkKLSAgICAgc2hfb3Bjb2RlX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKmFyZ3M7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLQotewotICBjaGFyICpwdHIgPSBhcmdzOwotICBpZiAoaW5mby0+YXJnWzBdKQotICAgIHsKLSAgICAgIC8qIFRoZSBwcmUtcHJvY2Vzc29yIHdpbGwgZWxpbWluYXRlIHdoaXRlc3BhY2UgaW4gZnJvbnQgb2YgJ0AnCi0JIGFmdGVyIHRoZSBmaXJzdCBhcmd1bWVudDsgd2UgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcwotCSBmcm9tIGFzc2VtYmxlX3BwaSwgc28gZG9uJ3QgaW5zaXN0IG9uIGZpbmRpbmcgd2hpdGVzcGFjZSBoZXJlLiAgKi8KLSAgICAgIGlmICgqcHRyID09ICcgJykKLQlwdHIrKzsKLQotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwKTsKLSAgICAgIGlmIChpbmZvLT5hcmdbMV0pCi0JewotCSAgaWYgKCpwdHIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgcHRyKys7Ci0JICAgIH0KLQkgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSk7Ci0JICBpZiAoaW5mby0+YXJnWzJdKQotCSAgICB7Ci0JICAgICAgaWYgKCpwdHIgPT0gJywnKQotCQl7Ci0JCSAgcHRyKys7Ci0JCX0KLQkgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvcGVyYW5kWzJdLnR5cGUgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wZXJhbmRbMV0udHlwZSA9IDA7Ci0JICBvcGVyYW5kWzJdLnR5cGUgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvcGVyYW5kWzBdLnR5cGUgPSAwOwotICAgICAgb3BlcmFuZFsxXS50eXBlID0gMDsKLSAgICAgIG9wZXJhbmRbMl0udHlwZSA9IDA7Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi0vKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKLSAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKLSAgIHByb3ZpZGVkCi0gKi8KLQotc3RhdGljCi1zaF9vcGNvZGVfaW5mbyAqCi1nZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZHMpCi0gICAgIHNoX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3BlcmFuZHM7Ci17Ci0gIHNoX29wY29kZV9pbmZvICp0aGlzX3RyeSA9IG9wY29kZTsKLSAgY2hhciAqbmFtZSA9IG9wY29kZS0+bmFtZTsKLSAgaW50IG4gPSAwOwotICB3aGlsZSAob3Bjb2RlLT5uYW1lKQotICAgIHsKLSAgICAgIHRoaXNfdHJ5ID0gb3Bjb2RlKys7Ci0gICAgICBpZiAodGhpc190cnktPm5hbWUgIT0gbmFtZSkKLQl7Ci0JICAvKiBXZSd2ZSBsb29rZWQgc28gZmFyIGRvd24gdGhlIHRhYmxlIHRoYXQgd2UndmUgcnVuIG91dCBvZgotCSAgICAgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgKi8KLQkgIHJldHVybiAwOwotCX0KLSAgICAgIC8qIGxvb2sgYXQgYm90aCBvcGVyYW5kcyBuZWVkZWQgYnkgdGhlIG9wY29kZXMgYW5kIHByb3ZpZGVkIGJ5Ci0gICAgICAgICB0aGUgdXNlciAtIHNpbmNlIGFuIGFyZyB0ZXN0IHdpbGwgb2Z0ZW4gZmFpbCBvbiB0aGUgc2FtZSBhcmcKLSAgICAgICAgIGFnYWluIGFuZCBhZ2Fpbiwgd2UnbGwgdHJ5IGFuZCB0ZXN0IHRoZSBsYXN0IGZhaWxpbmcgYXJnIHRoZQotICAgICAgICAgZmlyc3Qgb24gZWFjaCBvcGNvZGUgdHJ5ICovCi0KLSAgICAgIGZvciAobiA9IDA7IHRoaXNfdHJ5LT5hcmdbbl07IG4rKykKLQl7Ci0JICBzaF9vcGVyYW5kX2luZm8gKnVzZXIgPSBvcGVyYW5kcyArIG47Ci0JICBzaF9hcmdfdHlwZSBhcmcgPSB0aGlzX3RyeS0+YXJnW25dOwotCSAgc3dpdGNoIChhcmcpCi0JICAgIHsKLQkgICAgY2FzZSBBX0lNTToKLQkgICAgY2FzZSBBX0JESVNQMTI6Ci0JICAgIGNhc2UgQV9CRElTUDg6Ci0JICAgIGNhc2UgQV9ESVNQX0dCUjoKLQkgICAgY2FzZSBBX0RJU1BfUEM6Ci0JICAgIGNhc2UgQV9NQUNIOgotCSAgICBjYXNlIEFfUFI6Ci0JICAgIGNhc2UgQV9NQUNMOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZykKLQkJZ290byBmYWlsOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUjA6Ci0JICAgICAgLyogb3Bjb2RlIG5lZWRzIHIwICovCi0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gQV9SRUdfTiB8fCB1c2VyLT5yZWcgIT0gMCkKLQkJZ290byBmYWlsOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUjBfR0JSOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IEFfUjBfR0JSIHx8IHVzZXItPnJlZyAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRl9GUjA6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRl9SRUdfTiB8fCB1c2VyLT5yZWcgIT0gMCkKLQkJZ290byBmYWlsOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQV9SRUdfTjoKLQkgICAgY2FzZSBBX0lOQ19OOgotCSAgICBjYXNlIEFfREVDX046Ci0JICAgIGNhc2UgQV9JTkRfTjoKLQkgICAgY2FzZSBBX0lORF9SMF9SRUdfTjoKLQkgICAgY2FzZSBBX0RJU1BfUkVHX046Ci0JICAgIGNhc2UgRl9SRUdfTjoKLQkgICAgY2FzZSBEX1JFR19OOgotCSAgICBjYXNlIFhfUkVHX046Ci0JICAgIGNhc2UgVl9SRUdfTjoKLQkgICAgY2FzZSBGUFVMX046Ci0JICAgIGNhc2UgRlBTQ1JfTjoKLQkgICAgY2FzZSBBX1BNT0RfTjoKLQkgICAgY2FzZSBBX1BNT0RZX046Ci0JICAgIGNhc2UgRFNQX1JFR19OOgotCSAgICAgIC8qIE9wY29kZSBuZWVkcyBybiAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZykKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19uID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERYX1JFR19OOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IERfUkVHX04gJiYgdXNlci0+dHlwZSAhPSBYX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX24gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9HQlI6Ci0JICAgIGNhc2UgQV9TUjoKLQkgICAgY2FzZSBBX1ZCUjoKLQkgICAgY2FzZSBBX0RTUjoKLQkgICAgY2FzZSBBX01PRDoKLQkgICAgY2FzZSBBX1JFOgotCSAgICBjYXNlIEFfUlM6Ci0JICAgIGNhc2UgQV9TU1I6Ci0JICAgIGNhc2UgQV9TUEM6Ci0JICAgIGNhc2UgQV9TR1I6Ci0JICAgIGNhc2UgQV9EQlI6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQV9SRUdfQjoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcpCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfYiA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFfUkVHX006Ci0JICAgIGNhc2UgQV9JTkNfTToKLQkgICAgY2FzZSBBX0RFQ19NOgotCSAgICBjYXNlIEFfSU5EX006Ci0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX006Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19NOgotCSAgICBjYXNlIERTUF9SRUdfTToKLQkgICAgICAvKiBPcGNvZGUgbmVlZHMgcm4gKi8KLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcgLSBBX1JFR19NICsgQV9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19tID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFNQX1JFR19YOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IERTUF9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHN3aXRjaCAodXNlci0+cmVnKQotCQl7Ci0JCWNhc2UgQV9YMF9OVU06Ci0JCSAgcmVnX3ggPSAwOwotCQkgIGJyZWFrOwotCQljYXNlIEFfWDFfTlVNOgotCQkgIHJlZ194ID0gMTsKLQkJICBicmVhazsKLQkJY2FzZSBBX0EwX05VTToKLQkJICByZWdfeCA9IDI7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9BMV9OVU06Ci0JCSAgcmVnX3ggPSAzOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGdvdG8gZmFpbDsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFNQX1JFR19ZOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IERTUF9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHN3aXRjaCAodXNlci0+cmVnKQotCQl7Ci0JCWNhc2UgQV9ZMF9OVU06Ci0JCSAgcmVnX3kgPSAwOwotCQkgIGJyZWFrOwotCQljYXNlIEFfWTFfTlVNOgotCQkgIHJlZ195ID0gMTsKLQkJICBicmVhazsKLQkJY2FzZSBBX00wX05VTToKLQkJICByZWdfeSA9IDI7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9NMV9OVU06Ci0JCSAgcmVnX3kgPSAzOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGdvdG8gZmFpbDsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFNQX1JFR19FOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IERTUF9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHN3aXRjaCAodXNlci0+cmVnKQotCQl7Ci0JCWNhc2UgQV9YMF9OVU06Ci0JCSAgcmVnX2VmZyA9IDAgPDwgMTA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9YMV9OVU06Ci0JCSAgcmVnX2VmZyA9IDEgPDwgMTA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9ZMF9OVU06Ci0JCSAgcmVnX2VmZyA9IDIgPDwgMTA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9BMV9OVU06Ci0JCSAgcmVnX2VmZyA9IDMgPDwgMTA7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgZ290byBmYWlsOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEU1BfUkVHX0Y6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRFNQX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgc3dpdGNoICh1c2VyLT5yZWcpCi0JCXsKLQkJY2FzZSBBX1kwX05VTToKLQkJICByZWdfZWZnIHw9IDAgPDwgODsKLQkJICBicmVhazsKLQkJY2FzZSBBX1kxX05VTToKLQkJICByZWdfZWZnIHw9IDEgPDwgODsKLQkJICBicmVhazsKLQkJY2FzZSBBX1gwX05VTToKLQkJICByZWdfZWZnIHw9IDIgPDwgODsKLQkJICBicmVhazsKLQkJY2FzZSBBX0ExX05VTToKLQkJICByZWdfZWZnIHw9IDMgPDwgODsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBnb3RvIGZhaWw7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERTUF9SRUdfRzoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBEU1BfUkVHX04pCi0JCWdvdG8gZmFpbDsKLQkgICAgICBzd2l0Y2ggKHVzZXItPnJlZykKLQkJewotCQljYXNlIEFfTTBfTlVNOgotCQkgIHJlZ19lZmcgfD0gMCA8PCAyOwotCQkgIGJyZWFrOwotCQljYXNlIEFfTTFfTlVNOgotCQkgIHJlZ19lZmcgfD0gMSA8PCAyOwotCQkgIGJyZWFrOwotCQljYXNlIEFfQTBfTlVNOgotCQkgIHJlZ19lZmcgfD0gMiA8PCAyOwotCQkgIGJyZWFrOwotCQljYXNlIEFfQTFfTlVNOgotCQkgIHJlZ19lZmcgfD0gMyA8PCAyOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGdvdG8gZmFpbDsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQV9BMDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBEU1BfUkVHX04gfHwgdXNlci0+cmVnICE9IEFfQTBfTlVNKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9YMDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBEU1BfUkVHX04gfHwgdXNlci0+cmVnICE9IEFfWDBfTlVNKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9YMToKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBEU1BfUkVHX04gfHwgdXNlci0+cmVnICE9IEFfWDFfTlVNKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ZMDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBEU1BfUkVHX04gfHwgdXNlci0+cmVnICE9IEFfWTBfTlVNKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ZMToKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBEU1BfUkVHX04gfHwgdXNlci0+cmVnICE9IEFfWTFfTlVNKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBGX1JFR19NOgotCSAgICBjYXNlIERfUkVHX006Ci0JICAgIGNhc2UgWF9SRUdfTToKLQkgICAgY2FzZSBWX1JFR19NOgotCSAgICBjYXNlIEZQVUxfTToKLQkgICAgY2FzZSBGUFNDUl9NOgotCSAgICAgIC8qIE9wY29kZSBuZWVkcyBybiAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZyAtIEZfUkVHX00gKyBGX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX20gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFhfUkVHX006Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRF9SRUdfTiAmJiB1c2VyLT50eXBlICE9IFhfUkVHX04pCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfbSA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBYTVRSWF9NNDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBYTVRSWF9NNCkKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19tID0gNDsKLQkgICAgICBicmVhazsKLQkKLQkgICAgZGVmYXVsdDoKLQkgICAgICBwcmludGYgKF8oInVuaGFuZGxlZCAlZFxuIiksIGFyZyk7Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0JfQotICAgICAgaWYgKCAhKHZhbGlkX2FyY2ggJiB0aGlzX3RyeS0+YXJjaCkpCi0JZ290byBmYWlsOwotICAgICAgdmFsaWRfYXJjaCAmPSB0aGlzX3RyeS0+YXJjaDsKLSAgICAgIHJldHVybiB0aGlzX3RyeTsKLSAgICBmYWlsOjsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKLSAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7Ci0gICAgIGludCBsb3c7Ci0gICAgIGludCBoaWdoOwotewotICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIiksIGxvdywgaGlnaCk7Ci0gICAgfQotICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotfQotCi0KLXN0YXRpYyB2b2lkCi1pbnNlcnQgKHdoZXJlLCBob3csIHBjcmVsKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgaW50IGhvdzsKLSAgICAgaW50IHBjcmVsOwotewotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JICAgICAgIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JICAgICAgIDIsCi0JICAgICAgICZpbW1lZGlhdGUsCi0JICAgICAgIHBjcmVsLAotCSAgICAgICBob3cpOwotfQotCi1zdGF0aWMgdm9pZAotYnVpbGRfcmVsYXggKG9wY29kZSkKLSAgICAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLXsKLSAgaW50IGhpZ2hfYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMCA6IDE7Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1A4KQotICAgIHsKLSAgICAgIGludCB3aGF0ID0gKG9wY29kZS0+bmliYmxlc1sxXSAmIDQpID8gQ09ORF9KVU1QX0RFTEFZIDogQ09ORF9KVU1QOwotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQzMildLnJseF9sZW5ndGgsCi0JCSAgICBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGgsCi0JCSAgICBDICh3aGF0LCAwKSwKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9zeW1ib2wsCi0JCSAgICBpbW1lZGlhdGUuWF9hZGRfbnVtYmVyLAotCQkgICAgMCk7Ci0gICAgICBwW2hpZ2hfYnl0ZV0gPSAob3Bjb2RlLT5uaWJibGVzWzBdIDw8IDQpIHwgKG9wY29kZS0+bmliYmxlc1sxXSk7Ci0gICAgfQotICBlbHNlIGlmIChvcGNvZGUtPmFyZ1swXSA9PSBBX0JESVNQMTIpCi0gICAgewotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMildLnJseF9sZW5ndGgsCi0JCSAgICBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpXS5ybHhfbGVuZ3RoLAotCQkgICAgQyAoVU5DT05EX0pVTVAsIDApLAotCQkgICAgaW1tZWRpYXRlLlhfYWRkX3N5bWJvbCwKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9udW1iZXIsCi0JCSAgICAwKTsKLSAgICAgIHBbaGlnaF9ieXRlXSA9IChvcGNvZGUtPm5pYmJsZXNbMF0gPDwgNCk7Ci0gICAgfQotCi19Ci0KLS8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCi0gKi8KLXN0YXRpYyB2b2lkCi1idWlsZF9NeXRlcyAob3Bjb2RlLCBvcGVyYW5kKQotICAgICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICAgICBzaF9vcGVyYW5kX2luZm8gKm9wZXJhbmQ7Ci0KLXsKLSAgaW50IGluZGV4OwotICBjaGFyIG5idWZbNF07Ci0gIGNoYXIgKm91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gIGludCBsb3dfYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMSA6IDA7Ci0gIG5idWZbMF0gPSAwOwotICBuYnVmWzFdID0gMDsKLSAgbmJ1ZlsyXSA9IDA7Ci0gIG5idWZbM10gPSAwOwotCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspCi0gICAgewotICAgICAgc2hfbmliYmxlX3R5cGUgaSA9IG9wY29kZS0+bmliYmxlc1tpbmRleF07Ci0gICAgICBpZiAoaSA8IDE2KQotCXsKLQkgIG5idWZbaW5kZXhdID0gaTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgUkVHX046Ci0JICAgICAgbmJ1ZltpbmRleF0gPSByZWdfbjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRUdfTToKLQkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19tOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNEVF9SRUdfTjoKLQkgICAgICBpZiAocmVnX24gPCAyIHx8IHJlZ19uID4gNSkKLQkJYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyOiAnciVkJyIpLCByZWdfbik7Ci0JICAgICAgbmJ1ZltpbmRleF0gPSAocmVnX24gJiAzKSB8IDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX05NOgotCSAgICAgIG5idWZbaW5kZXhdID0gcmVnX24gfCAocmVnX20gPj4gMik7Ci0JICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJFR19COgotCSAgICAgIG5idWZbaW5kZXhdID0gcmVnX2IgfCAweDA4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1BfNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NNCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzRCWTQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTRCWTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV80QlkyOgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU00QlkyLCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NNCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzhCWTQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTThCWTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV84QlkyOgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU04QlkyLCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fODoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NOCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZMjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmIChfKCJmYWlsZWQgZm9yICVkXG4iKSwgaSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikgewotICAgIG91dHB1dFsxXSA9IChuYnVmWzBdIDw8IDQpIHwgKG5idWZbMV0pOwotICAgIG91dHB1dFswXSA9IChuYnVmWzJdIDw8IDQpIHwgKG5idWZbM10pOwotICB9Ci0gIGVsc2UgewotICAgIG91dHB1dFswXSA9IChuYnVmWzBdIDw8IDQpIHwgKG5idWZbMV0pOwotICAgIG91dHB1dFsxXSA9IChuYnVmWzJdIDw8IDQpIHwgKG5idWZbM10pOwotICB9Ci19Ci0KLS8qIEZpbmQgYW4gb3Bjb2RlIGF0IHRoZSBzdGFydCBvZiAqU1RSX1AgaW4gdGhlIGhhc2ggdGFibGUsIGFuZCBzZXQKLSAgICpTVFJfUCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYXN0IG9uZSByZWFkLiAgKi8KLQotc3RhdGljIHNoX29wY29kZV9pbmZvICoKLWZpbmRfY29va2VkX29wY29kZSAoc3RyX3ApCi0gICAgIGNoYXIgKipzdHJfcDsKLXsKLSAgY2hhciAqc3RyID0gKnN0cl9wOwotICB1bnNpZ25lZCBjaGFyICpvcF9zdGFydDsKLSAgdW5zaWduZWQgY2hhciAqb3BfZW5kOwotICBjaGFyIG5hbWVbMjBdOwotICBpbnQgbmxlbiA9IDA7Ci0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBGaW5kIHRoZSBvcCBjb2RlIGVuZC4KLSAgICAgVGhlIHByZS1wcm9jZXNzb3Igd2lsbCBlbGltaW5hdGUgd2hpdGVzcGFjZSBpbiBmcm9udCBvZgotICAgICBhbnkgJ0AnIGFmdGVyIHRoZSBmaXJzdCBhcmd1bWVudDsgd2UgbWF5IGJlIGNhbGxlZCBmcm9tCi0gICAgIGFzc2VtYmxlX3BwaSwgc28gdGhlIG9wY29kZSBtaWdodCBiZSB0ZXJtaW5hdGVkIGJ5IGFuICdAJy4gICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSAodW5zaWduZWQgY2hhciAqKSAoc3RyKTsKLSAgICAgICAqb3BfZW5kCi0gICAgICAgJiYgbmxlbiA8IDIwCi0gICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnICYmICpvcF9lbmQgIT0gJ0AnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG9wX3N0YXJ0W25sZW5dOwotCi0gICAgICAvKiBUaGUgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlIHdpbGwgY29udmVydCBDTVAvRVEgaW50byBjbXAvRVEKLQkgYmVjYXVzZSBpdCB0aGlua3MgdGhlICcvJyBpcyB0aGUgZW5kIG9mIHRoZSBzeW1ib2wuICBNb3Jlb3ZlciwKLQkgYWxsIGJ1dCB0aGUgZmlyc3Qgc3ViLWluc24gaXMgYSBwYXJhbGxlbCBwcm9jZXNzaW5nIGluc24gd29uJ3QKLQkgYmUgY2FwaXRhaWx6ZWQuICBJbnN0ZWFkIG9mIGhhY2tpbmcgdXAgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQKLQkgY29kZSwgd2UganVzdCBkZWFsIHdpdGggaXQgaGVyZS4gICovCi0gICAgICBjID0gaXN1cHBlciAoYykgPyB0b2xvd2VyIChjKSA6IGM7Ci0gICAgICBuYW1lW25sZW5dID0gYzsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0gIG5hbWVbbmxlbl0gPSAwOwotICAqc3RyX3AgPSBvcF9lbmQ7Ci0KLSAgaWYgKG5sZW4gPT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzaF9vcGNvZGVfaW5mbyAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG5hbWUpOwotfQotCi0vKiBBc3NlbWJsZSBhIHBhcmFsbGVsIHByb2Nlc3NpbmcgaW5zbi4gICovCi0jZGVmaW5lIEREVF9CQVNFIDB4ZjAwMCAvKiBCYXNlIHZhbHVlIGZvciBkb3VibGUgZGF0YSB0cmFuc2ZlciBpbnNucyAqLwotc3RhdGljIHZvaWQKLWFzc2VtYmxlX3BwaSAob3BfZW5kLCBvcGNvZGUpCi0gICAgIGNoYXIgKm9wX2VuZDsKLSAgICAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLXsKLSAgaW50IG1vdnggPSAwOwotICBpbnQgbW92eSA9IDA7Ci0gIGludCBjb25kID0gMDsKLSAgaW50IGZpZWxkX2IgPSAwOwotICBjaGFyICpvdXRwdXQ7Ci0gIGludCBtb3ZlX2NvZGU7Ci0KLSAgLyogU29tZSBpbnNuIGlnbm9yZSBvbmUgb3IgbW9yZSByZWdpc3RlciBmaWVsZHMsIGUuZy4gcHN0cyBtYWNobCxhMC4KLSAgICAgTWFrZSBzdXJlIHdlIGVuY29kZSBhIGRlZmluZWQgaW5zbiBwYXR0ZXJuLiAgKi8KLSAgcmVnX3ggPSAwOwotICByZWdfeSA9IDA7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBzaF9vcGVyYW5kX2luZm8gb3BlcmFuZFszXTsKLQotICAgICAgaWYgKG9wY29kZS0+YXJnWzBdICE9IEFfRU5EKQotCW9wX2VuZCA9IGdldF9vcGVyYW5kcyAob3Bjb2RlLCBvcF9lbmQsIG9wZXJhbmQpOwotICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQpOwotICAgICAgaWYgKG9wY29kZSA9PSAwKQotCXsKLQkgIC8qIENvdWxkbid0IGZpbmQgYW4gb3Bjb2RlIHdoaWNoIG1hdGNoZWQgdGhlIG9wZXJhbmRzICovCi0JICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMik7Ci0KLQkgIHdoZXJlWzBdID0gMHgwOwotCSAgd2hlcmVbMV0gPSAweDA7Ci0JICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAob3Bjb2RlLT5uaWJibGVzWzBdICE9IFBQSSkKLQlhc19iYWQgKF8oImluc24gY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBwYXJhbGxlbCBwcm9jZXNzaW5nIGluc24iKSk7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlLT5uaWJibGVzWzFdKQotCXsKLQotCWNhc2UgTk9QWDoKLQkgIGlmIChtb3Z4KQotCSAgICBhc19iYWQgKF8oIm11bHRpcGxlIG1vdnggc3BlY2lmaWNhdGlvbnMiKSk7Ci0JICBtb3Z4ID0gRERUX0JBU0U7Ci0JICBicmVhazsKLQljYXNlIE5PUFk6Ci0JICBpZiAobW92eSkKLQkgICAgYXNfYmFkIChfKCJtdWx0aXBsZSBtb3Z5IHNwZWNpZmljYXRpb25zIikpOwotCSAgbW92eSA9IEREVF9CQVNFOwotCSAgYnJlYWs7Ci0KLQljYXNlIE1PVlg6Ci0JICBpZiAobW92eCkKLQkgICAgYXNfYmFkIChfKCJtdWx0aXBsZSBtb3Z4IHNwZWNpZmljYXRpb25zIikpOwotCSAgaWYgKHJlZ19uIDwgNCB8fCByZWdfbiA+IDUpCi0JICAgIGFzX2JhZCAoXygiaW52YWxpZCBtb3Z4IGFkZHJlc3MgcmVnaXN0ZXIiKSk7Ci0JICBpZiAob3Bjb2RlLT5uaWJibGVzWzJdICYgOCkKLQkgICAgewotCSAgICAgIGlmIChyZWdfbSA9PSBBX0ExX05VTSkKLQkJbW92eCA9IDEgPDwgNzsKLQkgICAgICBlbHNlIGlmIChyZWdfbSAhPSBBX0EwX05VTSkKLQkJYXNfYmFkIChfKCJpbnZhbGlkIG1vdnggZHNwIHJlZ2lzdGVyIikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocmVnX3ggPiAxKQotCQlhc19iYWQgKF8oImludmFsaWQgbW92eCBkc3AgcmVnaXN0ZXIiKSk7Ci0JICAgICAgbW92eCA9IHJlZ194IDw8IDc7Ci0JICAgIH0KLQkgIG1vdnggKz0gKChyZWdfbiAtIDQpIDw8IDkpICsgKG9wY29kZS0+bmliYmxlc1syXSA8PCAyKSArIEREVF9CQVNFOwotCSAgYnJlYWs7Ci0KLQljYXNlIE1PVlk6Ci0JICBpZiAobW92eSkKLQkgICAgYXNfYmFkIChfKCJtdWx0aXBsZSBtb3Z5IHNwZWNpZmljYXRpb25zIikpOwotCSAgaWYgKG9wY29kZS0+bmliYmxlc1syXSAmIDgpCi0JICAgIHsKLQkgICAgICAvKiBCaXQgMyBpbiBuaWJibGVzWzJdIGlzIGludGVuZGVkIGZvciBiaXQgNCBvZiB0aGUgb3Bjb2RlLAotCQkgc28gYWRkIDggbW9yZS4gICovCi0JICAgICAgbW92eSA9IDg7Ci0JICAgICAgaWYgKHJlZ19tID09IEFfQTFfTlVNKQotCQltb3Z5ICs9IDEgPDwgNjsKLQkgICAgICBlbHNlIGlmIChyZWdfbSAhPSBBX0EwX05VTSkKLQkJYXNfYmFkIChfKCJpbnZhbGlkIG1vdnkgZHNwIHJlZ2lzdGVyIikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocmVnX3kgPiAxKQotCQlhc19iYWQgKF8oImludmFsaWQgbW92eSBkc3AgcmVnaXN0ZXIiKSk7Ci0JICAgICAgbW92eSA9IHJlZ195IDw8IDY7Ci0JICAgIH0KLQkgIGlmIChyZWdfbiA8IDYgfHwgcmVnX24gPiA3KQotCSAgICBhc19iYWQgKF8oImludmFsaWQgbW92eSBhZGRyZXNzIHJlZ2lzdGVyIikpOwotCSAgbW92eSArPSAoKHJlZ19uIC0gNikgPDwgOCkgKyBvcGNvZGUtPm5pYmJsZXNbMl0gKyBERFRfQkFTRTsKLQkgIGJyZWFrOwotCi0JY2FzZSBQU0g6Ci0JICBpZiAoaW1tZWRpYXRlLlhfb3AgIT0gT19jb25zdGFudCkKLQkgICAgYXNfYmFkIChfKCJkc3AgaW1tZWRpYXRlIHNoaWZ0IHZhbHVlIG5vdCBjb25zdGFudCIpKTsKLQkgIGZpZWxkX2IgPSAoKG9wY29kZS0+bmliYmxlc1syXSA8PCAxMikKLQkJICAgICB8IChpbW1lZGlhdGUuWF9hZGRfbnVtYmVyICYgMTI3KSA8PCA0Ci0JCSAgICAgfCByZWdfbik7Ci0JICBicmVhazsKLQljYXNlIFBQSTM6Ci0JICBpZiAoZmllbGRfYikKLQkgICAgYXNfYmFkIChfKCJtdWx0aXBsZSBwYXJhbGxlbCBwcm9jZXNzaW5nIHNwZWNpZmljYXRpb25zIikpOwotCSAgZmllbGRfYiA9ICgob3Bjb2RlLT5uaWJibGVzWzJdIDw8IDEyKSArIChvcGNvZGUtPm5pYmJsZXNbM10gPDwgOCkKLQkJICAgICArIChyZWdfeCA8PCA2KSArIChyZWdfeSA8PCA0KSArIHJlZ19uKTsKLQkgIGJyZWFrOwotCWNhc2UgUERDOgotCSAgaWYgKGNvbmQpCi0JICAgIGFzX2JhZCAoXygibXVsdGlwbGUgY29uZGl0aW9uIHNwZWNpZmljYXRpb25zIikpOwotCSAgY29uZCA9IG9wY29kZS0+bmliYmxlc1syXSA8PCA4OwotCSAgaWYgKCpvcF9lbmQpCi0JICAgIGdvdG8gc2tpcF9jb25kX2NoZWNrOwotCSAgYnJlYWs7Ci0JY2FzZSBQUElDOgotCSAgaWYgKGZpZWxkX2IpCi0JICAgIGFzX2JhZCAoXygibXVsdGlwbGUgcGFyYWxsZWwgcHJvY2Vzc2luZyBzcGVjaWZpY2F0aW9ucyIpKTsKLQkgIGZpZWxkX2IgPSAoKG9wY29kZS0+bmliYmxlc1syXSA8PCAxMikgKyAob3Bjb2RlLT5uaWJibGVzWzNdIDw8IDgpCi0JCSAgICAgKyBjb25kICsgKHJlZ194IDw8IDYpICsgKHJlZ195IDw8IDQpICsgcmVnX24pOwotCSAgY29uZCA9IDA7Ci0JICBicmVhazsKLQljYXNlIFBNVUw6Ci0JICBpZiAoZmllbGRfYikKLQkgICAgewotCSAgICAgIGlmICgoZmllbGRfYiAmIDB4ZWYwMCkgIT0gMHhhMTAwKQotCQlhc19iYWQgKF8oImluc24gY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggcG11bHMiKSk7Ci0JICAgICAgZmllbGRfYiAtPSAweDgxMDA7Ci0JICAgICAgc3dpdGNoIChmaWVsZF9iICYgMHhmKQotCQl7Ci0JCWNhc2UgQV9YMF9OVU06Ci0JCSAgZmllbGRfYiArPSAwIC0gQV9YMF9OVU07Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9ZMF9OVU06Ci0JCSAgZmllbGRfYiArPSAxIC0gQV9ZMF9OVU07Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9BMF9OVU06Ci0JCSAgZmllbGRfYiArPSAyIC0gQV9BMF9OVU07Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9BMV9OVU06Ci0JCSAgZmllbGRfYiArPSAzIC0gQV9BMV9OVU07Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkIChfKCJiYWQgcGFkZCAvIHBzdWIgcG11bHMgb3V0cHV0IG9wZXJhbmQiKSk7Ci0JCX0KLQkgICAgfQotCSAgZmllbGRfYiArPSAweDQwMDAgKyByZWdfZWZnOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGlmIChjb25kKQotCXsKLQkgIGFzX2JhZCAoXygiY29uZGl0aW9uIG5vdCBmb2xsb3dlZCBieSBjb25kaXRpb25hbGl6YWJsZSBpbnNuIikpOwotCSAgY29uZCA9IDA7Ci0JfQotICAgICAgaWYgKCEgKm9wX2VuZCkKLQlicmVhazsKLSAgICBza2lwX2NvbmRfY2hlY2s6Ci0gICAgICBvcGNvZGUgPSBmaW5kX2Nvb2tlZF9vcGNvZGUgKCZvcF9lbmQpOwotICAgICAgaWYgKG9wY29kZSA9PSBOVUxMKQotCXsKLQkgIChhc19iYWQKLQkgICAoXygidW5yZWNvZ25pemVkIGNoYXJhY3RlcnMgYXQgZW5kIG9mIHBhcmFsbGVsIHByb2Nlc3NpbmcgaW5zbiIpKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIG1vdmVfY29kZSA9IG1vdnggfCBtb3Z5OwotICBpZiAoZmllbGRfYikKLSAgICB7Ci0gICAgICAvKiBQYXJhbGxlbCBwcm9jZXNzaW5nIGluc24uICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBwcGlfY29kZSA9IChtb3Z4IHwgbW92eSB8IDB4ZjgwMCkgPDwgMTYgfCBmaWVsZF9iOwotCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDQpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgb3V0cHV0WzNdID0gcHBpX2NvZGUgPj4gODsKLQkgIG91dHB1dFsyXSA9IHBwaV9jb2RlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvdXRwdXRbMl0gPSBwcGlfY29kZSA+PiA4OwotCSAgb3V0cHV0WzNdID0gcHBpX2NvZGU7Ci0JfQotICAgICAgbW92ZV9jb2RlIHw9IDB4ZjgwMDsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBKdXN0IGEgZG91YmxlIGRhdGEgdHJhbnNmZXIuICAqLwotICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIG91dHB1dFsxXSA9IG1vdmVfY29kZSA+PiA4OwotICAgICAgb3V0cHV0WzBdID0gbW92ZV9jb2RlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG91dHB1dFswXSA9IG1vdmVfY29kZSA+PiA4OwotICAgICAgb3V0cHV0WzFdID0gbW92ZV9jb2RlOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKLSAgc2hfb3BlcmFuZF9pbmZvIG9wZXJhbmRbM107Ci0gIHNoX29wY29kZV9pbmZvICpvcGNvZGU7Ci0KLSAgb3Bjb2RlID0gZmluZF9jb29rZWRfb3Bjb2RlICgmc3RyKTsKLSAgb3BfZW5kID0gc3RyOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2hfcmVsYXgKLSAgICAgICYmICEgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlKQotICAgIHsKLSAgICAgIC8qIE91dHB1dCBhIENPREUgcmVsb2MgdG8gdGVsbCB0aGUgbGlua2VyIHRoYXQgdGhlIGZvbGxvd2luZwotICAgICAgICAgYnl0ZXMgYXJlIGluc3RydWN0aW9ucywgbm90IGRhdGEuICAqLwotICAgICAgZml4X25ldyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMiwgJmFic19zeW1ib2wsIDAsIDAsCi0JICAgICAgIEJGRF9SRUxPQ19TSF9DT0RFKTsKLSAgICAgIHNlZ19pbmZvIChub3dfc2VnKS0+dGNfc2VnbWVudF9pbmZvX2RhdGEuaW5fY29kZSA9IDE7Ci0gICAgfQotCi0gIGlmIChvcGNvZGUtPm5pYmJsZXNbMF0gPT0gUFBJKQotICAgIHsKLSAgICAgIGFzc2VtYmxlX3BwaSAob3BfZW5kLCBvcGNvZGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAob3Bjb2RlLT5hcmdbMF0gPT0gQV9CRElTUDEyCi0gICAgICB8fCBvcGNvZGUtPmFyZ1swXSA9PSBBX0JESVNQOCkKLSAgICB7Ci0gICAgICBwYXJzZV9leHAgKG9wX2VuZCArIDEpOwotICAgICAgYnVpbGRfcmVsYXggKG9wY29kZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9wY29kZS0+YXJnWzBdID09IEFfRU5EKQotCXsKLQkgIC8qIElnbm9yZSB0cmFpbGluZyB3aGl0ZXNwYWNlLiAgSWYgdGhlcmUgaXMgYW55LCBpdCBoYXMgYWxyZWFkeQotCSAgICAgYmVlbiBjb21wcmVzc2VkIHRvIGEgc2luZ2xlIHNwYWNlLiAgKi8KLQkgIGlmICgqb3BfZW5kID09ICcgJykKLQkgICAgb3BfZW5kKys7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wX2VuZCA9IGdldF9vcGVyYW5kcyAob3Bjb2RlLCBvcF9lbmQsIG9wZXJhbmQpOwotCX0KLSAgICAgIG9wY29kZSA9IGdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kKTsKLQotICAgICAgaWYgKG9wY29kZSA9PSAwKQotCXsKLQkgIC8qIENvdWxkbid0IGZpbmQgYW4gb3Bjb2RlIHdoaWNoIG1hdGNoZWQgdGhlIG9wZXJhbmRzICovCi0JICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMik7Ci0KLQkgIHdoZXJlWzBdID0gMHgwOwotCSAgd2hlcmVbMV0gPSAweDA7Ci0JICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmICgqb3BfZW5kKQotCWFzX2JhZCAoXygiZXhjZXNzIG9wZXJhbmRzOiAnJXMnIiksIG9wX2VuZCk7Ci0KLSAgICAgIGJ1aWxkX015dGVzIChvcGNvZGUsIG9wZXJhbmQpOwotICAgIH0KLQotfQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGVhY2ggdGltZSBhIGxhYmVsIGRlZmluaXRpb24gaXMgc2Vlbi4gIEl0Ci0gICBlbWl0cyBhIEJGRF9SRUxPQ19TSF9MQUJFTCByZWxvYyBpZiBuZWNlc3NhcnkuICAqLwotCi12b2lkCi1zaF9mcm9iX2xhYmVsICgpCi17Ci0gIHN0YXRpYyBmcmFnUyAqbGFzdF9sYWJlbF9mcmFnOwotICBzdGF0aWMgaW50IGxhc3RfbGFiZWxfb2Zmc2V0OwotCi0gIGlmIChzaF9yZWxheAotICAgICAgJiYgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlKQotICAgIHsKLSAgICAgIGludCBvZmZzZXQ7Ci0KLSAgICAgIG9mZnNldCA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgICAgIGlmIChmcmFnX25vdyAhPSBsYXN0X2xhYmVsX2ZyYWcKLQkgIHx8IG9mZnNldCAhPSBsYXN0X2xhYmVsX29mZnNldCkKLQl7CQotCSAgZml4X25ldyAoZnJhZ19ub3csIG9mZnNldCwgMiwgJmFic19zeW1ib2wsIDAsIDAsIEJGRF9SRUxPQ19TSF9MQUJFTCk7Ci0JICBsYXN0X2xhYmVsX2ZyYWcgPSBmcmFnX25vdzsKLQkgIGxhc3RfbGFiZWxfb2Zmc2V0ID0gb2Zmc2V0OwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIGlzIGFib3V0IHRvIG91dHB1dCBzb21lCi0gICBkYXRhLiAgSXQgZW1pdHMgYSBCRkRfUkVMT0NfU0hfREFUQSByZWxvYyBpZiBuZWNlc3NhcnkuICAqLwotCi12b2lkCi1zaF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKQotewotICBpZiAoc2hfcmVsYXgKLSAgICAgICYmIHNlZ19pbmZvIChub3dfc2VnKS0+dGNfc2VnbWVudF9pbmZvX2RhdGEuaW5fY29kZSkKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnX25vdywgZnJhZ19ub3dfZml4ICgpLCAyLCAmYWJzX3N5bWJvbCwgMCwgMCwKLQkgICAgICAgQkZEX1JFTE9DX1NIX0RBVEEpOwotICAgICAgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlID0gMDsKLSAgICB9Ci19Ci0KLXN5bWJvbFMgKgotREVGVU4gKG1kX3VuZGVmaW5lZF9zeW1ib2wsIChuYW1lKSwKLSAgICAgICBjaGFyICpuYW1lKQotewotICByZXR1cm4gMDsKLX0KLQotI2lmZGVmIE9CSl9DT0ZGCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotdm9pZAotREVGVU4gKHRjX2hlYWRlcnNfaG9vaywgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIpKTsKLX0KLQotI2VuZGlmCi0jZW5kaWYKLQotLyogVmFyaW91cyByb3V0aW5lcyB0byBraWxsIG9uZSBkYXkgKi8KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogMjsKLQotICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgICAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBIYW5kbGUgdGhlIC51c2VzIHBzZXVkby1vcC4gIFRoaXMgcHNldWRvLW9wIGlzIHVzZWQganVzdCBiZWZvcmUgYQotICAgY2FsbCBpbnN0cnVjdGlvbi4gIEl0IHJlZmVycyB0byBhIGxhYmVsIG9mIHRoZSBpbnN0cnVjdGlvbiB3aGljaAotICAgbG9hZHMgdGhlIHJlZ2lzdGVyIHdoaWNoIHRoZSBjYWxsIHVzZXMuICBXZSB1c2UgaXQgdG8gZ2VuZXJhdGUgYQotICAgc3BlY2lhbCByZWxvYyBmb3IgdGhlIGxpbmtlci4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3VzZXMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXg7Ci0KLSAgaWYgKCEgc2hfcmVsYXgpCi0gICAgYXNfd2FybiAoXygiLnVzZXMgcHNldWRvLW9wIHNlZW4gd2hlbiBub3QgcmVsYXhpbmciKSk7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4KTsKLQotICBpZiAoZXguWF9vcCAhPSBPX3N5bWJvbCB8fCBleC5YX2FkZF9udW1iZXIgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCAudXNlcyBmb3JtYXQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMiwgJmV4LCAxLCBCRkRfUkVMT0NfU0hfVVNFUyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotCi0jZGVmaW5lIE9QVElPTl9SRUxBWCAgKE9QVElPTl9NRF9CQVNFKQotI2RlZmluZSBPUFRJT05fTElUVExFIChPUFRJT05fTURfQkFTRSArIDEpCi0jZGVmaW5lIE9QVElPTl9TTUFMTCAoT1BUSU9OX0xJVFRMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9EU1AgKE9QVElPTl9TTUFMTCArIDEpCi0KLSAgeyJyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUkVMQVh9LAotICB7ImxpdHRsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFfSwKLSAgeyJzbWFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU01BTEx9LAotICB7ImRzcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFNQfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9SRUxBWDoKLSAgICAgIHNoX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTElUVExFOgotICAgICAgc2hsID0gMTsKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU01BTEw6Ci0gICAgICBzaF9zbWFsbCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0RTUDoKLSAgICAgIHNoX2RzcCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotU0ggb3B0aW9uczpcblwKLS1saXR0bGUJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcblwKLS1yZWxheAkJCWFsdGVyIGp1bXAgaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHNcblwKLS1zbWFsbAkJCWFsaWduIHNlY3Rpb25zIHRvIDQgYnl0ZSBib3VuZGFyaWVzLCBub3QgMTZcblwKLS1kc3AJCQllbmFibGUgc2gtZHNwIGluc25zLCBhbmQgZGlzYWJsZSBzaDNlIC8gc2g0IGluc25zLlxuIikpOwotfQotDAotdm9pZAotdGNfTm91dF9maXhfdG9fY2hhcnMgKCkKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX05vdXRfZml4X3RvX2NoYXJzIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGFyZ3VtZW50cyB0byBzaF9jb3VudF9yZWxvY3MgdGhyb3VnaAotICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RydWN0IHNoX2NvdW50X3JlbG9jcwotewotICAvKiBTeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLSAgc3ltYm9sUyAqc3ltOwotICAvKiBDb3VudCBvZiByZWxvY3MgZm91bmQuICAqLwotICBpbnQgY291bnQ7Ci19OwotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIGZpeHVwcyBpbiBhIHNlY3Rpb24gd2hpY2ggcmVmZXIgdG8gYSBwYXJ0aWN1bGFyCi0gICBzeW1ib2wuICBXaGVuIHVzaW5nIEJGRF9BU1NFTUJMRVIsIHRoaXMgaXMgY2FsbGVkIHZpYQotICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc2hfY291bnRfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzICppbmZvID0gKHN0cnVjdCBzaF9jb3VudF9yZWxvY3MgKikgZGF0YTsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gIHN5bWJvbFMgKnN5bTsKLSAgZml4UyAqZml4OwotCi0gIHNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgc3ltID0gaW5mby0+c3ltOwotICBmb3IgKGZpeCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXggIT0gTlVMTDsgZml4ID0gZml4LT5meF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChmaXgtPmZ4X2FkZHN5ID09IHN5bSkKLQl7Ci0JICArK2luZm8tPmNvdW50OwotCSAgZml4LT5meF90Y2JpdCA9IDE7Ci0JfQotICAgIH0KLX0KLQotLyogSGFuZGxlIHRoZSBjb3VudCByZWxvY3MgZm9yIGEgcGFydGljdWxhciBzZWN0aW9uLiAgV2hlbiB1c2luZwotICAgQkZEX0FTU0VNQkxFUiwgdGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNoX2Zyb2Jfc2VjdGlvbiAoYWJmZCwgc2VjLCBpZ25vcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIFBUUiBpZ25vcmU7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICBmaXhTICpmaXg7Ci0KLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBpZiAoc2VnaW5mbyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmb3IgKGZpeCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXggIT0gTlVMTDsgZml4ID0gZml4LT5meF9uZXh0KQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgZml4UyAqZnNjYW47Ci0gICAgICBzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzIGluZm87Ci0KLSAgICAgIGlmIChmaXgtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfU0hfVVNFUykKLQljb250aW51ZTsKLQotICAgICAgLyogVGhlIEJGRF9SRUxPQ19TSF9VU0VTIHJlbG9jIHNob3VsZCByZWZlciB0byBhIGRlZmluZWQgbG9jYWwKLQkgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24uICAqLwotICAgICAgc3ltID0gZml4LT5meF9hZGRzeTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTAotCSAgfHwgZml4LT5meF9zdWJzeSAhPSBOVUxMCi0JICB8fCBmaXgtPmZ4X2FkZG51bWJlciAhPSAwCi0JICB8fCBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHNlYwotI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgZGVmaW5lZCAoT0JKX0NPRkYpCi0JICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUCi0jZW5kaWYKLQkgIHx8IFNfSVNfRVhURVJOQUwgKHN5bSkpCi0JewotCSAgYXNfd2Fybl93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCQkgXygiLnVzZXMgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBmaXh1cHMgYWdhaW4sIHRoaXMgdGltZSBsb29raW5nIGZvciBvbmUKLQkgYXQgdGhlIHNhbWUgbG9jYXRpb24gYXMgc3ltLiAgKi8KLSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW0pOwotICAgICAgZm9yIChmc2NhbiA9IHNlZ2luZm8tPmZpeF9yb290OwotCSAgIGZzY2FuICE9IE5VTEw7Ci0JICAgZnNjYW4gPSBmc2Nhbi0+ZnhfbmV4dCkKLQlpZiAodmFsID09IGZzY2FuLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZnNjYW4tPmZ4X3doZXJlCi0JICAgICYmIGZzY2FuLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX0FMSUdOCi0JICAgICYmIGZzY2FuLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX0NPREUKLQkgICAgJiYgZnNjYW4tPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfU0hfREFUQQotCSAgICAmJiBmc2Nhbi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TSF9MQUJFTCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGZzY2FuID09IE5VTEwpCi0JewotCSAgYXNfd2Fybl93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCQkgXygiY2FuJ3QgZmluZCBmaXh1cCBwb2ludGVkIHRvIGJ5IC51c2VzIikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoZnNjYW4tPmZ4X3RjYml0KQotCXsKLQkgIC8qIFdlJ3ZlIGFscmVhZHkgZG9uZSB0aGlzIG9uZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIGZzY2FuIHNob3VsZCBhbHNvIGJlIGEgZml4dXAgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUKLQkgc2VjdGlvbi4gICovCi0gICAgICBzeW0gPSBmc2Nhbi0+ZnhfYWRkc3k7Ci0gICAgICBpZiAoc3ltID09IE5VTEwKLQkgIHx8IGZzY2FuLT5meF9zdWJzeSAhPSBOVUxMCi0JICB8fCBmc2Nhbi0+ZnhfYWRkbnVtYmVyICE9IDAKLQkgIHx8IFNfR0VUX1NFR01FTlQgKHN5bSkgIT0gc2VjCi0jaWYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiBkZWZpbmVkIChPQkpfQ09GRikKLQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FWFQKLSNlbmRpZgotCSAgfHwgU19JU19FWFRFUk5BTCAoc3ltKSkKLQl7Ci0JICBhc193YXJuX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+ZnhfbGluZSwKLQkJCSBfKCIudXNlcyB0YXJnZXQgZG9lcyBub3QgcmVmZXIgdG8gYSBsb2NhbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHdlIGxvb2sgdGhyb3VnaCBhbGwgdGhlIGZpeHVwcyBvZiBhbGwgdGhlIHNlY3Rpb25zLAotCSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGZpbmQgYSByZWZlcmVuY2UgdG8gc3ltLiAgKi8KLSAgICAgIGluZm8uc3ltID0gc3ltOwotICAgICAgaW5mby5jb3VudCA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHNoX2NvdW50X3JlbG9jcywgKFBUUikgJmluZm8pOwotI2Vsc2UKLSAgICAgIHsKLQlpbnQgaXNjYW47Ci0KLQlmb3IgKGlzY2FuID0gU0VHX0UwOyBpc2NhbiA8IFNFR19VTktOT1dOOyBpc2NhbisrKQotCSAgc2hfY291bnRfcmVsb2NzICgoYmZkICopIE5VTEwsIGlzY2FuLCAoUFRSKSAmaW5mbyk7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKGluZm8uY291bnQgPCAxKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBHZW5lcmF0ZSBhIEJGRF9SRUxPQ19TSF9DT1VOVCBmaXh1cCBhdCB0aGUgbG9jYXRpb24gb2Ygc3ltLgotCSBXZSBoYXZlIGFscmVhZHkgYWRqdXN0ZWQgdGhlIHZhbHVlIG9mIHN5bSB0byBpbmNsdWRlIHRoZQotCSBmcmFnbWVudCBhZGRyZXNzLCBzbyB3ZSB1bmRvIHRoYXQgYWRqdXN0bWVudCBoZXJlLiAgKi8KLSAgICAgIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gICAgICBmaXhfbmV3IChzeW1ib2xfZ2V0X2ZyYWcgKHN5bSksCi0JICAgICAgIFNfR0VUX1ZBTFVFIChzeW0pIC0gc3ltYm9sX2dldF9mcmFnIChzeW0pLT5mcl9hZGRyZXNzLAotCSAgICAgICA0LCAmYWJzX3N5bWJvbCwgaW5mby5jb3VudCwgMCwgQkZEX1JFTE9DX1NIX0NPVU5UKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gY29tcGxldGVkLAotICAgYnV0IGJlZm9yZSB0aGUgcmVsb2NzIG9yIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0LgotICAgSWYgd2UgaGF2ZSBzZWVuIGFueSAudXNlcyBwc2V1ZG8tb3BzLCB0aGV5IHBvaW50IHRvIGFuIGluc3RydWN0aW9uCi0gICB3aGljaCBsb2FkcyBhIHJlZ2lzdGVyIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gIFdlIGxvb2sKLSAgIHRocm91Z2ggdGhlIGZpeHVwcyB0byBmaW5kIHdoZXJlIHRoZSBmdW5jdGlvbiBhZGRyZXNzIGlzIGJlaW5nCi0gICBsb2FkZWQgZnJvbS4gIFdlIHRoZW4gZ2VuZXJhdGUgYSBDT1VOVCByZWxvYyBnaXZpbmcgdGhlIG51bWJlciBvZgotICAgdGltZXMgdGhhdCBmdW5jdGlvbiBhZGRyZXNzIGlzIHJlZmVycmVkIHRvLiAgVGhlIGxpbmtlciB1c2VzIHRoaXMKLSAgIGluZm9ybWF0aW9uIHdoZW4gZG9pbmcgcmVsYXhpbmcsIHRvIGRlY2lkZSB3aGVuIGl0IGNhbiBlbGltaW5hdGUKLSAgIHRoZSBzdG9yZWQgZnVuY3Rpb24gYWRkcmVzcyBlbnRpcmVseS4gICovCi0KLXZvaWQKLXNoX2Zyb2JfZmlsZSAoKQotewotICBpZiAoISBzaF9yZWxheCkKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBzaF9mcm9iX3NlY3Rpb24sIChQVFIpIE5VTEwpOwotI2Vsc2UKLSAgewotICAgIGludCBpc2VnOwotCi0gICAgZm9yIChpc2VnID0gU0VHX0UwOyBpc2VnIDwgU0VHX1VOS05PV047IGlzZWcrKykKLSAgICAgIHNoX2Zyb2Jfc2VjdGlvbiAoKGJmZCAqKSBOVUxMLCBpc2VnLCAoUFRSKSBOVUxMKTsKLSAgfQotI2VuZGlmCi19Ci0KLS8qIENhbGxlZCBhZnRlciByZWxheGluZy4gIFNldCB0aGUgY29ycmVjdCBzaXplcyBvZiB0aGUgZnJhZ21lbnRzLCBhbmQKLSAgIGNyZWF0ZSByZWxvY3Mgc28gdGhhdCBtZF9hcHBseV9maXggd2lsbCBmaWxsIGluIHRoZSBjb3JyZWN0IHZhbHVlcy4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZCAqaGVhZGVyczsKLSNlbHNlCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotI2VuZGlmCi0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGludCBkb25lcmVsYXggPSAwOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EOCk6Ci0gICAgY2FzZSBDIChDT05EX0pVTVBfREVMQVksIENPTkQ4KToKLSAgICAgIHN1YnNlZ19jaGFuZ2UgKHNlZywgMCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKToKLSAgICAgIHN1YnNlZ19jaGFuZ2UgKHNlZywgMCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMik6Ci0gICAgY2FzZSBDIChVTkNPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIGlmIChmcmFnUC0+ZnJfc3ltYm9sID09IE5VTEwpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IG92ZXJmbG93cyAxMi1iaXQgZmllbGQiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzKTsKLSAgICAgIGVsc2UgaWYgKFNfSVNfREVGSU5FRCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyAxMi1iaXQgZmllbGQiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzLAkJCi0JCVNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gdW5kZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgMTItYml0IGZpZWxkIiksCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcywJCQotCQlTX0dFVF9OQU1FIChmcmFnUC0+ZnJfc3ltYm9sKSk7Ci0KLSNpZiAwCQkJCS8qIFRoaXMgY29kZSB3b3JrcywgYnV0IGdlbmVyYXRlcyBwb29yIGNvZGUgYW5kIHRoZSBjb21waWxlcgotCQkJCSAgIHNob3VsZCBuZXZlciBwcm9kdWNlIGEgc2VxdWVuY2UgdGhhdCByZXF1aXJlcyBpdCB0byBiZSB1c2VkLiAgKi8KLQotICAgICAgLyogQSBqdW1wIHdvbnQgZml0IGluIDEyIGJpdHMsIG1ha2UgY29kZSB3aGljaCBsb29rcyBsaWtlCi0JIGJyYSBmb28KLQkgbW92LncgQCgwLCBQQyksIHIxNAotCSAubG9uZyBkaXNwCi0JIGZvbzogYnJhIEByMTQKLQkgKi8KLSAgICAgIGludCB0ID0gYnVmZmVyWzBdICYgMHgxMDsKLQotICAgICAgYnVmZmVyW2hpZ2hieXRlXSA9IDB4YTA7CS8qIGJyYW5jaCBvdmVyIG1vdmUgYW5kIGRpc3AgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlXSA9IDM7Ci0gICAgICBidWZmZXJbaGlnaGJ5dGUrMl0gPSAweGQwIHwgSlJFRzsJLyogQnVpbGQgbW92IGluc24gKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzJdID0gMHgwMDsKLQotICAgICAgYnVmZmVyW2hpZ2hieXRlKzRdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBqdW1wIGRpc3AgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzRdID0gMDsKLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSs2XSA9IDA7Ci0gICAgICBidWZmZXJbbG93Ynl0ZSs2XSA9IDA7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSs4XSA9IDB4NDAgfCBKUkVHOwkvKiBCdWlsZCBqbXAgQEpSRUcgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzhdID0gdCA/IDB4YiA6IDB4MmI7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSsxMF0gPSAweDIwOyAvKiBidWlsZCBub3AgKi8KLSAgICAgIGJ1ZmZlcltsb3dieXRlKzEwXSA9IDB4MGI7Ci0KLSAgICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLAotCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgNCwKLQkgICAgICAgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwKLQkgICAgICAgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gVU5DT05EMzJfTEVOR1RIOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBkb25lcmVsYXggPSAxOwotI2VuZGlmCi0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChDT05EX0pVTVAsIENPTkQxMik6Ci0gICAgY2FzZSBDIChDT05EX0pVTVBfREVMQVksIENPTkQxMik6Ci0gICAgICAvKiBBIGJjb25kIHdvbid0IGZpdCwgc28gdHVybiBpdCBpbnRvIGEgYiFjb25kOyBicmEgZGlzcDsgbm9wICovCi0gICAgICAvKiBJIGZvdW5kIHRoYXQgYSByZWxheCBmYWlsdXJlIGZvciBnY2MuYy10b3J0dXJlL2V4ZWN1dGUvOTMwNjI4LTEuYwotCSB3YXMgZHVlIHRvIGdhcyBpbmNvcnJlY3RseSByZWxheGluZyBhbiBvdXQtb2YtcmFuZ2UgY29uZGl0aW9uYWwKLQkgYnJhbmNoIHdpdGggZGVsYXkgc2xvdC4gIEl0IHR1cm5lZDoKLSAgICAgICAgICAgICAgICAgICAgIGJmLnMgICAgTDYgICAgICAgICAgICAgIChzbG90IG1vdi5sICAgcjEyLEAoNDQscjApKQotICAgICAgICAgaW50bzoKLSAgIAotMmM6ICA4ZiAwMSBhMCA4YiAgICAgYmYucyAgICAzMiA8X21haW4rMzI+ICAgKHNsb3QgYnJhICAgICAgIEw2KQotMzA6ICAwMCAwOSAgICAgICAgICAgbm9wCi0zMjogIDEwIGNiICAgICAgICAgICBtb3YubCAgIHIxMixAKDQ0LHIwKQotICAgICAgICAgVGhlcmVmb3JlLCBicmFuY2hlcyB3aXRoIGRlbGF5IHNsb3RzIGhhdmUgdG8gYmUgaGFuZGxlZAotCSBkaWZmZXJlbnRseSBmcm9tIG9uZXMgd2l0aG91dCBkZWxheSBzbG90cy4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyID0KLQkgICh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOwotCWludCBoaWdoYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMCA6IDE7Ci0JaW50IGxvd2J5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDEgOiAwOwotCWludCBkZWxheSA9IGZyYWdQLT5mcl9zdWJ0eXBlID09IEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDEyKTsKLQotCS8qIFRvZ2dsZSB0aGUgdHJ1ZS9mYWxzZSBiaXQgb2YgdGhlIGJjb25kLiAgKi8KLQlidWZmZXJbaGlnaGJ5dGVdIF49IDB4MjsKLQotCS8qIElmIHRoaXMgaXMgYSBkYWxheWVkIGJyYW5jaCwgd2UgbWF5IG5vdCBwdXQgdGhlIHRoZSBicmEgaW4gdGhlCi0JICAgc2xvdC4gIFNvIHdlIGNoYW5nZSBpdCB0byBhIG5vbi1kZWxheWVkIGJyYW5jaCwgbGlrZSB0aGF0OgotCSAgIGIhIGNvbmQgc2xvdF9sYWJlbDsgYnJhIGRpc3A7IHNsb3RfbGFiZWw6IHNsb3RfaW5zbgotCSAgID8/PyBXZSBzaG91bGQgdHJ5IGlmIHN3YXBwaW5nIHRoZSBjb25kaXRpb25hbCBicmFuY2ggYW5kCi0JICAgaXRzIGRlbGF5LXNsb3QgaW5zbiBhbHJlYWR5IG1ha2VzIHRoZSBicmFuY2ggcmVhY2guICAqLwotCi0JLyogQnVpbGQgYSByZWxvY2F0aW9uIHRvIHNpeCAvIGZvdXIgYnl0ZXMgZmFydGhlciBvbi4gICovCi0Jc3Vic2VnX2NoYW5nZSAoc2VnLCAwKTsKLQlmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JCSBzZWN0aW9uX3N5bWJvbCAoc2VnKSwKLSNlbHNlCi0JCSBzZWdfaW5mbyAoc2VnKS0+ZG90LAotI2VuZGlmCi0JCSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggKyAoZGVsYXkgPyA0IDogNiksCi0JCSAxLCBCRkRfUkVMT0NfU0hfUENESVNQOEJZMik7Ci0KLQkvKiBTZXQgdXAgYSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLQlidWZmZXJbaGlnaGJ5dGUgKyAyXSA9IDB4YTA7Ci0JYnVmZmVyW2xvd2J5dGUgKyAyXSA9IDA7Ci0JZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyKTsKLQotCWlmIChkZWxheSkKLQkgIHsKLQkgICAgYnVmZmVyW2hpZ2hieXRlXSAmPSB+MHg0OyAvKiBSZW1vdmVzIGRlbGF5IHNsb3QgZnJvbSBicmFuY2guICAqLwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBGaWxsIGluIGEgTk9QIGluc3RydWN0aW9uLiAgKi8KLQkgICAgYnVmZmVyW2hpZ2hieXRlICsgNF0gPSAweDA7Ci0JICAgIGJ1ZmZlcltsb3dieXRlICsgNF0gPSAweDk7Ci0KLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotCSAgfQotCWZyYWdQLT5mcl92YXIgPSAwOwotCWRvbmVyZWxheCA9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMzIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMzIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wgPT0gTlVMTCkKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgb3ZlcmZsb3dzIDgtYml0IGZpZWxkIiksIAotCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MpOwotICAgICAgZWxzZSBpZiAoU19JU19ERUZJTkVEIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDgtYml0IGZpZWxkICIpLAotCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MsCQkKLQkJU19HRVRfTkFNRSAoZnJhZ1AtPmZyX3N5bWJvbCkpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byB1bmRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzLAkJCi0JCVNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpKTsKLQotI2lmIDAJCQkJLyogVGhpcyBjb2RlIHdvcmtzLCBidXQgZ2VuZXJhdGVzIHBvb3IgY29kZSwgYW5kIHRoZSBjb21waWxlcgotCQkJCSAgIHNob3VsZCBuZXZlciBwcm9kdWNlIGEgc2VxdWVuY2UgdGhhdCByZXF1aXJlcyBpdCB0byBiZSB1c2VkLiAgKi8KLQotICAgICAgLyogQSBiY29uZCB3b24ndCBmaXQgYW5kIGl0IHdvbid0IGdvIGludG8gYSAxMiBiaXQKLQkgZGlzcGxhY2VtZW50IGVpdGhlciwgdGhlIGNvZGUgc2VxdWVuY2UgbG9va3MgbGlrZToKLQkgYiFjb25kIGZvb3AKLQkgbW92LncgQChuLCBQQyksIHIxNAotCSBqbXAgIEByMTQKLQkgbm9wCi0JIC5sb25nIHdoZXJlCi0JIGZvb3A6Ci0JICovCi0KLSAgICAgIGJ1ZmZlclswXSBePSAweDI7CQkvKiBUb2dnbGUgVC9GIGJpdCAqLwotI2RlZmluZSBKUkVHIDE0Ci0gICAgICBidWZmZXJbMV0gPSA1OwkJLyogYnJhbmNoIG92ZXIgbW92LCBqdW1wLCBub3AgYW5kIHB0ciAqLwotICAgICAgYnVmZmVyWzJdID0gMHhkMCB8IEpSRUc7CS8qIEJ1aWxkIG1vdiBpbnNuICovCi0gICAgICBidWZmZXJbM10gPSAweDI7Ci0gICAgICBidWZmZXJbNF0gPSAweDQwIHwgSlJFRzsJLyogQnVpbGQgam1wIEBKUkVHICovCi0gICAgICBidWZmZXJbNV0gPSAweDBiOwotICAgICAgYnVmZmVyWzZdID0gMHgyMDsJCS8qIGJ1aWxkIG5vcCAqLwotICAgICAgYnVmZmVyWzddID0gMHgwYjsKLSAgICAgIGJ1ZmZlcls4XSA9IDA7CQkvKiBzcGFjZSBmb3IgMzIgYml0IGp1bXAgZGlzcCAqLwotICAgICAgYnVmZmVyWzldID0gMDsKLSAgICAgIGJ1ZmZlclsxMF0gPSAwOwotICAgICAgYnVmZmVyWzExXSA9IDA7Ci0gICAgICBidWZmZXJbMTJdID0gMDsKLSAgICAgIGJ1ZmZlclsxM10gPSAwOwotICAgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcCAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsCi0JICAgICAgIGZyYWdQLT5mcl9maXggKyA4LAotCSAgICAgICA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLAotCSAgICAgICBCRkRfUkVMT0NfMzIpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBDT05EMzJfTEVOR1RIOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBkb25lcmVsYXggPSAxOwotI2VuZGlmCi0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZG9uZXJlbGF4ICYmICFzaF9yZWxheCkKLSAgICBhc193YXJuX3doZXJlIChmcmFnUC0+ZnJfZmlsZSwgZnJhZ1AtPmZyX2xpbmUsCi0JCSAgIF8oIm92ZXJmbG93IGluIGJyYW5jaCB0byAlczsgY29udmVydGVkIGludG8gbG9uZ2VyIGluc3RydWN0aW9uIHNlcXVlbmNlIiksCi0JCSAgIChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwKLQkJICAgID8gU19HRVRfTkFNRSAoZnJhZ1AtPmZyX3N5bWJvbCkKLQkJICAgIDogIiIpKTsKLX0KLQotdmFsdWVUCi1ERUZVTiAobWRfc2VjdGlvbl9hbGlnbiwgKHNlZywgc2l6ZSksCi0gICAgICAgc2VnVCBzZWcgQU5ECi0gICAgICAgdmFsdWVUIHNpemUpCi17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIE9CSl9FTEYKLSAgcmV0dXJuIHNpemU7Ci0jZWxzZSAvKiAhIE9CSl9FTEYgKi8KLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKSkgLSAxKQotCSAgJiAoLTEgPDwgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpKSk7Ci0jZW5kaWYgLyogISBPQkpfRUxGICovCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pIC0gMSkKLQkgICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLX0KLQotLyogVGhpcyBzdGF0aWMgdmFyaWFibGUgaXMgc2V0IGJ5IHNfdWFjb25zIHRvIHRlbGwgc2hfY29uc19hbGlnbiB0aGF0Ci0gICB0aGUgZXhwZXNzaW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgYWxpZ25lZC4gICovCi0KLXN0YXRpYyBpbnQgc2hfbm9fYWxpZ25fY29ucyA9IDA7Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgdW5hbGlnbmVkIHNwYWNlIGFsbG9jYXRpb24gcHNldWRvLW9wcywgc3VjaCBhcwotICAgLnVhd29yZC4gIC51YXdvcmQgaXMganVzdCBsaWtlIC53b3JkLCBidXQgdGhlIHZhbHVlIGRvZXMgbm90IG5lZWQKLSAgIHRvIGJlIGFsaWduZWQuICAqLwotCi1zdGF0aWMgdm9pZAotc191YWNvbnMgKGJ5dGVzKQotICAgICBpbnQgYnl0ZXM7Ci17Ci0gIC8qIFRlbGwgc2hfY29uc19hbGlnbiBub3QgdG8gYWxpZ24gdGhpcyB2YWx1ZS4gICovCi0gIHNoX25vX2FsaWduX2NvbnMgPSAxOwotICBjb25zIChieXRlcyk7Ci19Ci0KLS8qIElmIGEgLndvcmQsIGV0LiBhbC4sIHBzZXVkLW9wIGlzIHNlZW4sIHdhcm4gaWYgdGhlIHZhbHVlIGlzIG5vdAotICAgYWxpZ25lZCBjb3JyZWN0bHkuICBOb3RlIHRoYXQgdGhpcyBjYW4gY2F1c2Ugd2FybmluZ3MgdG8gYmUgaXNzdWVkCi0gICB3aGVuIGFzc2VtYmxpbmcgaW5pdGlhbGl6ZWQgc3RydWN0dXJlZCB3aGljaCB3ZXJlIGRlY2xhcmVkIHdpdGggdGhlCi0gICBwYWNrZWQgYXR0cmlidXRlLiAgRklYTUU6IFBlcmhhcHMgd2Ugc2hvdWxkIHJlcXVpcmUgYW4gb3B0aW9uIHRvCi0gICBlbmFibGUgdGhpcyB3YXJuaW5nPyAgKi8KLQotdm9pZAotc2hfY29uc19hbGlnbiAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBpbnQgbmFsaWduOwotICBjaGFyICpwOwotCi0gIGlmIChzaF9ub19hbGlnbl9jb25zKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gdW5hbGlnbmVkIHBzZXVkby1vcC4gICovCi0gICAgICBzaF9ub19hbGlnbl9jb25zID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFsaWduID0gMDsKLSAgd2hpbGUgKChuYnl0ZXMgJiAxKSA9PSAwKQotICAgIHsKLSAgICAgICsrbmFsaWduOwotICAgICAgbmJ5dGVzID4+PSAxOwotICAgIH0KLQotICBpZiAobmFsaWduID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKChhYnNfc2VjdGlvbl9vZmZzZXQgJiAoKDEgPDwgbmFsaWduKSAtIDEpKSAhPSAwKQotCWFzX3dhcm4gKF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkoc3ltYm9sUyAqKSBOVUxMLCAob2Zmc2V0VCkgbmFsaWduLCAoY2hhciAqKSBOVUxMKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuYWxpZ24pOwotfQotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIG91dHB1dCBhIHJlbG9jIGZvciBhbnkgLmFsaWduIGRpcmVjdGl2ZQotICAgdGhhdCByZXF1ZXN0cyBhbGlnbm1lbnQgdG8gYSBmb3VyIGJ5dGUgYm91bmRhcnkgb3IgbGFyZ2VyLiAgVGhpcyBpcwotICAgYWxzbyB3aGVyZSB3ZSBjaGVjayBmb3IgbWlzYWxpZ25lZCBkYXRhLiAgKi8KLQotdm9pZAotc2hfaGFuZGxlX2FsaWduIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgaWYgKHNoX3JlbGF4Ci0gICAgICAmJiBmcmFnLT5mcl90eXBlID09IHJzX2FsaWduCi0gICAgICAmJiBmcmFnLT5mcl9hZGRyZXNzICsgZnJhZy0+ZnJfZml4ID4gMAotICAgICAgJiYgZnJhZy0+ZnJfb2Zmc2V0ID4gMQotICAgICAgJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbikKLSAgICBmaXhfbmV3IChmcmFnLCBmcmFnLT5mcl9maXgsIDIsICZhYnNfc3ltYm9sLCBmcmFnLT5mcl9vZmZzZXQsIDAsCi0JICAgICBCRkRfUkVMT0NfU0hfQUxJR04pOwotCi0gIGlmIChmcmFnLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUKLSAgICAgICYmIGZyYWctPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnLT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfZml4ICE9IDApCi0gICAgYXNfd2Fybl93aGVyZSAoZnJhZy0+ZnJfZmlsZSwgZnJhZy0+ZnJfbGluZSwgXygibWlzYWxpZ25lZCBkYXRhIikpOwotfQotCi0vKiBUaGlzIG1hY3JvIGRlY2lkZXMgd2hldGhlciBhIHBhcnRpY3VsYXIgcmVsb2MgaXMgYW4gZW50cnkgaW4gYQotICAgc3dpdGNoIHRhYmxlLiAgSXQgaXMgdXNlZCB3aGVuIHJlbGF4aW5nLCBiZWNhdXNlIHRoZSBsaW5rZXIgbmVlZHMKLSAgIHRvIGtub3cgYWJvdXQgYWxsIHN1Y2ggZW50cmllcyBzbyB0aGF0IGl0IGNhbiBhZGp1c3QgdGhlbSBpZgotICAgbmVjZXNzYXJ5LiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgU1dJVENIX1RBQkxFX0NPTlMoZml4KSAoMCkKLSNlbHNlCi0jZGVmaW5lIFNXSVRDSF9UQUJMRV9DT05TKGZpeCkJCQkJXAotICAoKGZpeCktPmZ4X3JfdHlwZSA9PSAwCQkJCVwKLSAgICYmICgoZml4KS0+Znhfc2l6ZSA9PSAyCQkJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfc2l6ZSA9PSAxCQkJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfc2l6ZSA9PSA0KSkKLSNlbmRpZgotCi0jZGVmaW5lIFNXSVRDSF9UQUJMRShmaXgpCQkJCVwKLSAgKChmaXgpLT5meF9hZGRzeSAhPSBOVUxMCQkJCVwKLSAgICYmIChmaXgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCVwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXgpLT5meF9hZGRzeSkgPT0gdGV4dF9zZWN0aW9uCVwKLSAgICYmIFNfR0VUX1NFR01FTlQgKChmaXgpLT5meF9zdWJzeSkgPT0gdGV4dF9zZWN0aW9uCVwKLSAgICYmICgoZml4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMgkJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNgkJXAotICAgICAgIHx8IChmaXgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzgJCVwKLSAgICAgICB8fCBTV0lUQ0hfVEFCTEVfQ09OUyAoZml4KSkpCi0KLS8qIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gZm9yY2UgYSByZWxvY2F0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLgotICAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIG91dCBzd2l0Y2ggYW5kIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdoZW4KLSAgIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1zaF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKmZpeDsKLXsKLQotICBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIGlmICghIHNoX3JlbGF4KQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAoZml4LT5meF9wY3JlbAotCSAgfHwgU1dJVENIX1RBQkxFIChmaXgpCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQ09VTlQKLQkgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9BTElHTgotCSAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPREUKLQkgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9EQVRBCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfTEFCRUwpOwotfQotCi0jaWZkZWYgT0JKX0VMRgotYm9vbGVhbgotc2hfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICpmaXhQOwotewotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgc2hfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcoKQotewotICBpbnQgdmFsOwotCi0gIC8qIFNldCBmaWxlLXNwZWNpZmljIGZsYWdzIHRvIGluZGljYXRlIGlmIHRoaXMgY29kZSBuZWVkcwotICAgICBhIHByb2Nlc3NvciB3aXRoIHRoZSBzaC1kc3AgLyBzaDNlIElTQSB0byBleGVjdXRlLiAgKi8KLSAgaWYgKHZhbGlkX2FyY2ggJiBhcmNoX3NoMSkKLSAgICB2YWwgPSBFRl9TSDE7Ci0gIGVsc2UgaWYgKHZhbGlkX2FyY2ggJiBhcmNoX3NoMikKLSAgICB2YWwgPSBFRl9TSDI7Ci0gIGVsc2UgaWYgKHZhbGlkX2FyY2ggJiBhcmNoX3NoX2RzcCkKLSAgICB2YWwgPSBFRl9TSF9EU1A7Ci0gIGVsc2UgaWYgKHZhbGlkX2FyY2ggJiBhcmNoX3NoMykKLSAgICB2YWwgPSBFRl9TSDM7Ci0gIGVsc2UgaWYgKHZhbGlkX2FyY2ggJiBhcmNoX3NoM19kc3ApCi0gICAgdmFsID0gRUZfU0hfRFNQOwotICBlbHNlIGlmICh2YWxpZF9hcmNoICYgYXJjaF9zaDNlKQotICAgIHZhbCA9IEVGX1NIM0U7Ci0gIGVsc2UgaWYgKHZhbGlkX2FyY2ggJiBhcmNoX3NoNCkKLSAgICB2YWwgPSBFRl9TSDQ7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzICY9IH5FRl9TSF9NQUNIX01BU0s7Ci0gIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gdmFsOwotfQotI2VuZGlmCi0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHA7Ci0jZWxzZQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotI2VuZGlmCi17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgaW50IGxvd2J5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDEgOiAwOwotICBpbnQgaGlnaGJ5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDAgOiAxOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgbG9uZyB2YWwgPSAqdmFscDsKLSNlbmRpZgotICBsb25nIG1heCwgbWluOwotICBpbnQgc2hpZnQ7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIGFkanVzdF9yZWxvY19zeW1zIHdvbid0IGNvbnZlcnQgYSByZWxvYyBhZ2FpbnN0IGEgd2VhayBzeW1ib2wKLSAgICAgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLCBidXQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsCi0gICAgIHNjcmV3IHVwIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgc28gd2UgaGF2ZSB0byBhZGp1c3QgdmFsIGhlcmUKLSAgICAgdG8gYXZvaWQgdGhlIHNjcmV3IHVwIGxhdGVyLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmIFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHZhbCAtPSBTX0dFVF9WQUxVRSAgKGZpeFAtPmZ4X2FkZHN5KTsKLSNlbmRpZgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChmaXhQLT5meF9zaXplID09IDIpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzE2OwotICAgICAgZWxzZSBpZiAoZml4UC0+Znhfc2l6ZSA9PSA0KQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGVsc2UgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSkKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfODsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci0jZW5kaWYKLQotICBtYXggPSBtaW4gPSAwOwotICBzaGlmdCA9IDA7Ci0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU00OgotICAgICAgbWF4ID0gMHhmOwotICAgICAgKmJ1ZiA9ICgqYnVmICYgMHhmMCkgfCAodmFsICYgMHhmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfSU1NNEJZMjoKLSAgICAgIG1heCA9IDB4ZjsKLSAgICAgIHNoaWZ0ID0gMTsKLSAgICAgICpidWYgPSAoKmJ1ZiAmIDB4ZjApIHwgKCh2YWwgPj4gMSkgJiAweGYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU00Qlk0OgotICAgICAgbWF4ID0gMHhmOwotICAgICAgc2hpZnQgPSAyOwotICAgICAgKmJ1ZiA9ICgqYnVmICYgMHhmMCkgfCAoKHZhbCA+PiAyKSAmIDB4Zik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTThCWTI6Ci0gICAgICBtYXggPSAweGZmOwotICAgICAgc2hpZnQgPSAxOwotICAgICAgKmJ1ZiA9IHZhbCA+PiAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU04Qlk0OgotICAgICAgbWF4ID0gMHhmZjsKLSAgICAgIHNoaWZ0ID0gMjsKLSAgICAgICpidWYgPSB2YWwgPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU04OgotICAgICAgLyogU29tZXRpbWVzIHRoZSA4IGJpdCB2YWx1ZSBpcyBzaWduIGV4dGVuZGVkIChlLmcuLCBhZGQpIGFuZAotICAgICAgICAgc29tZXRpbWVzIGl0IGlzIG5vdCAoZS5nLiwgYW5kKS4gIFdlIHBlcm1pdCBhbnkgOCBiaXQgdmFsdWUuCi0gICAgICAgICBOb3RlIHRoYXQgYWRkaW5nIGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG1heSBpbnZhbGlkYXRlCi0gICAgICAgICByZWFzb25hYmxlIGxvb2tpbmcgYXNzZW1ibHkgY29kZSwgc3VjaCBhcyBgYGFuZCAtMHgxLHIwJycuICAqLwotICAgICAgbWF4ID0gMHhmZjsKLSAgICAgIG1pbiA9IC0gMHhmZjsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0OgotICAgICAgLyogVGhlIGxvd2VyIHR3byBiaXRzIG9mIHRoZSBQQyBhcmUgY2xlYXJlZCBiZWZvcmUgdGhlCi0gICAgICAgICBkaXNwbGFjZW1lbnQgaXMgYWRkZWQgaW4uICBXZSBjYW4gYXNzdW1lIHRoYXQgdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgICBpcyBvbiBhIDQgYnl0ZSBib3VuZGF5LiAgSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBhbHNvIG9uIGEgNAotICAgICAgICAgYnl0ZSBib3VuZGFyeSwgdGhlbiB3ZSB3YW50Ci0JICAgKHRhcmdldCAtIGhlcmUpIC8gNAotCSBhbmQgdGFyZ2V0IC0gaGVyZSBpcyBhIG11bHRpcGxlIG9mIDQuCi0JIE90aGVyd2lzZSwgd2UgYXJlIG9uIGEgMiBieXRlIGJvdW5kYXJ5LCBhbmQgd2Ugd2FudAotCSAgICh0YXJnZXQgLSAoaGVyZSAtIDIpKSAvIDQKLQkgYW5kIHRhcmdldCAtIGhlcmUgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gIENvbXB1dGluZwotCSAgICh0YXJnZXQgLSAoaGVyZSAtIDIpKSAvIDQgPT0gKHRhcmdldCAtIGhlcmUgKyAyKSAvIDQKLQkgd29ya3MgZm9yIGJvdGggY2FzZXMsIHNpbmNlIGluIHRoZSBmaXJzdCBjYXNlIHRoZSBhZGRpdGlvbiBvZgotCSAyIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgZGl2aXNpb24uICB0YXJnZXQgLSBoZXJlIGlzIGluIHRoZQotCSB2YXJpYWJsZSB2YWwuICAqLwotICAgICAgdmFsID0gKHZhbCArIDIpIC8gNDsKLSAgICAgIGlmICh2YWwgJiB+MHhmZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oInBjcmVsIHRvbyBmYXIiKSk7Ci0gICAgICBidWZbbG93Ynl0ZV0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMjoKLSAgICAgIHZhbCAvPSAyOwotICAgICAgaWYgKHZhbCAmIH4weGZmKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygicGNyZWwgdG9vIGZhciIpKTsKLSAgICAgIGJ1Zltsb3dieXRlXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfUENESVNQOEJZMjoKLSAgICAgIHZhbCAvPSAyOwotICAgICAgaWYgKHZhbCA8IC0weDgwIHx8IHZhbCA+IDB4N2YpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJwY3JlbCB0b28gZmFyIikpOwotICAgICAgYnVmW2xvd2J5dGVdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMjoKLSAgICAgIHZhbCAvPSAyOwotICAgICAgaWYgKHZhbCA8IC0weDgwMCB8fCB2YWwgPj0gMHg3ZmYpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJwY3JlbCB0b28gZmFyIikpOwotICAgICAgYnVmW2xvd2J5dGVdID0gdmFsICYgMHhmZjsKLSAgICAgIGJ1ZltoaWdoYnl0ZV0gfD0gKHZhbCA+PiA4KSAmIDB4ZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikgCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDA7Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQkgICpidWYrKyA9IHZhbCA+PiAxNjsKLQkgICpidWYrKyA9IHZhbCA+PiAyNDsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgICpidWYrKyA9IHZhbCA+PiAyNDsKLQkgICpidWYrKyA9IHZhbCA+PiAxNjsKLQkgICpidWYrKyA9IHZhbCA+PiA4OwotCSAgKmJ1ZisrID0gdmFsID4+IDA7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCXsKLQkgICpidWYrKyA9IHZhbCA+PiAwOwotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JfSAKLSAgICAgIGVsc2UgCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX1VTRVM6Ci0gICAgICAvKiBQYXNzIHRoZSB2YWx1ZSBpbnRvIHNoX2NvZmZfcmVsb2NfbWFuZ2xlLiAgKi8KLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfQ09VTlQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU0hfQUxJR046Ci0gICAgY2FzZSBCRkRfUkVMT0NfU0hfQ09ERToKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9EQVRBOgotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0xBQkVMOgotICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgcmV0dXJuIDA7Ci0jZWxzZQotICAgICAgcmV0dXJuOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChzaGlmdCAhPSAwKQotICAgIHsKLSAgICAgIGlmICgodmFsICYgKCgxIDw8IHNoaWZ0KSAtIDEpKSAhPSAwKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygibWlzYWxpZ25lZCBvZmZzZXQiKSk7Ci0gICAgICBpZiAodmFsID49IDApCi0JdmFsID4+PSBzaGlmdDsKLSAgICAgIGVsc2UKLQl2YWwgPSAoKHZhbCA+PiBzaGlmdCkKLQkgICAgICAgfCAoKGxvbmcpIC0xICYgfiAoKGxvbmcpIC0xID4+IHNoaWZ0KSkpOwotICAgIH0KLSAgaWYgKG1heCAhPSAwICYmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSkKLSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oIm9mZnNldCBvdXQgb2YgcmFuZ2UiKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLS8qIENhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24uICBSZXR1cm4gdGhlIGxlbmd0aAotICAgYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbi4gICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOREVGX0RJU1ApOgotICAgICAgLyogdXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24gKi8KLSAgICAgIGlmICghZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMzIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9ESVNQKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgVU5ERUZfRElTUCk6Ci0gICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0JICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCi0JICAgICBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIENPTkQ4KTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0JICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZyAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBVTkRFRl9XT1JEX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQzMildLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IHdoYXQgPSBHRVRfV0hBVCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotCSAgLyogV2Uga25vdyB0aGUgYWJzIHZhbHVlICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIENPTkQ4KTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGg7Ci0JfQotCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICpwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci19Ci0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgMjsKLX0KLQotI2lmZGVmIE9CSl9DT0ZGCi0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotLyogV2hlbiB3ZSBhbGlnbiB0aGUgLnRleHQgc2VjdGlvbiwgaW5zZXJ0IHRoZSBjb3JyZWN0IE5PUCBwYXR0ZXJuLiAgKi8KLQotaW50Ci1zaF9kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpCi0gICAgIGludCBuOwotICAgICBjb25zdCBjaGFyICpmaWxsOwotICAgICBpbnQgbGVuOwotICAgICBpbnQgbWF4OwotewotICBpZiAoZmlsbCA9PSBOVUxMCi0gICAgICAmJiBzdWJzZWdfdGV4dF9wIChub3dfc2VnKQotICAgICAgJiYgbiA+IDEpCi0gICAgewotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYmlnX25vcF9wYXR0ZXJuW10gPSB7IDB4MDAsIDB4MDkgfTsKLSAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGxpdHRsZV9ub3BfcGF0dGVybltdID0geyAweDA5LCAweDAwIH07Ci0KLSAgICAgIC8qIEZpcnN0IGFsaWduIHRvIGEgMiBieXRlIGJvdW5kYXJ5LCBpbiBjYXNlIHRoZXJlIGlzIGFuIG9kZAotICAgICAgICAgLmJ5dGUuICAqLwotICAgICAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBiaWdfbm9wX3BhdHRlcm4sIHNpemVvZiBiaWdfbm9wX3BhdHRlcm4sIG1heCk7Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBsaXR0bGVfbm9wX3BhdHRlcm4sIHNpemVvZiBsaXR0bGVfbm9wX3BhdHRlcm4sCi0JCQkgICAgbWF4KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgT0JKX0NPRkYKLQotLyogTWFwIEJGRCByZWxvY3MgdG8gU0ggQ09GRiByZWxvY3MuICAqLwotCi1zdHJ1Y3QgcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2M7Ci0gIGludCBzaF9yZWxvYzsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVsb2NfbWFwIGNvZmZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ18zMiwgUl9TSF9JTU0zMiB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9TSF9JTU0xNiB9LAotICB7IEJGRF9SRUxPQ184LCBSX1NIX0lNTTggfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENESVNQOEJZMiwgUl9TSF9QQ0RJU1A4QlkyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyLCBSX1NIX1BDRElTUCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU00LCBSX1NIX0lNTTQgfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NNEJZMiwgUl9TSF9JTU00QlkyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTTRCWTQsIFJfU0hfSU1NNEJZNCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU04LCBSX1NIX0lNTTggfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NOEJZMiwgUl9TSF9JTU04QlkyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTThCWTQsIFJfU0hfSU1NOEJZNCB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIsIFJfU0hfUENSRUxJTU04QlkyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCwgUl9TSF9QQ1JFTElNTThCWTQgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TSF9TV0lUQ0g4IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDE2IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLCBSX1NIX1NXSVRDSDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1VTRVMsIFJfU0hfVVNFUyB9LAotICB7IEJGRF9SRUxPQ19TSF9DT1VOVCwgUl9TSF9DT1VOVCB9LAotICB7IEJGRF9SRUxPQ19TSF9BTElHTiwgUl9TSF9BTElHTiB9LAotICB7IEJGRF9SRUxPQ19TSF9DT0RFLCBSX1NIX0NPREUgfSwKLSAgeyBCRkRfUkVMT0NfU0hfREFUQSwgUl9TSF9EQVRBIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0xBQkVMLCBSX1NIX0xBQkVMIH0sCi0gIHsgQkZEX1JFTE9DX1VOVVNFRCwgMCB9Ci19OwotCi0vKiBBZGp1c3QgYSByZWxvYyBmb3IgdGhlIFNILiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBnZW5lcmljIGNvZGUsCi0gICBidXQgZG9lcyBzb21lIG1pbm9yIHR3ZWFraW5nLiAgKi8KLQotdm9pZAotc2hfY29mZl9yZWxvY19tYW5nbGUgKHNlZywgZml4LCBpbnRyLCBwYWRkcikKLSAgICAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZzsKLSAgICAgZml4UyAqZml4OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludHI7Ci0gICAgIHVuc2lnbmVkIGludCBwYWRkcjsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0ciA9IGZpeC0+ZnhfYWRkc3k7Ci0gIHN5bWJvbFMgKmRvdDsKLQotICBpbnRyLT5yX3ZhZGRyID0gcGFkZHIgKyBmaXgtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXgtPmZ4X3doZXJlOwotCi0gIGlmICghIFNXSVRDSF9UQUJMRSAoZml4KSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcmVsb2NfbWFwICpybTsKLQotICAgICAgZm9yIChybSA9IGNvZmZfcmVsb2NfbWFwOyBybS0+YmZkX3JlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQ7IHJtKyspCi0JaWYgKHJtLT5iZmRfcmVsb2MgPT0gKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgZml4LT5meF9yX3R5cGUpCi0JICBicmVhazsKLSAgICAgIGlmIChybS0+YmZkX3JlbG9jID09IEJGRF9SRUxPQ19VTlVTRUQpCi0JYXNfYmFkX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+ZnhfbGluZSwKLQkJICAgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4LT5meF9yX3R5cGUpKTsKLSAgICAgIGludHItPnJfdHlwZSA9IHJtLT5zaF9yZWxvYzsKLSAgICAgIGludHItPnJfb2Zmc2V0ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBrbm93IChzaF9yZWxheCk7Ci0KLSAgICAgIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMTYpCi0JaW50ci0+cl90eXBlID0gUl9TSF9TV0lUQ0gxNjsKLSAgICAgIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184KQotCWludHItPnJfdHlwZSA9IFJfU0hfU1dJVENIODsKLSAgICAgIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMikKLQlpbnRyLT5yX3R5cGUgPSBSX1NIX1NXSVRDSDMyOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGb3IgYSBzd2l0Y2ggcmVsb2MsIHdlIHNldCByX29mZnNldCB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gICAgICAgICB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgdGhlIHN1YnRyYWhlbmQuICBXaGVuIHRoZSBsaW5rZXIgaXMKLSAgICAgICAgIGRvaW5nIHJlbGF4aW5nLCBpdCBjYW4gdXNlIHRoZSBkZXRlcm1pbmUgdGhlIHN0YXJ0aW5nIGFuZAotICAgICAgICAgZW5kaW5nIHBvaW50cyBvZiB0aGUgc3dpdGNoIGRpZmZlcmVuY2UgZXhwcmVzc2lvbi4gICovCi0gICAgICBpbnRyLT5yX29mZnNldCA9IGludHItPnJfdmFkZHIgLSBTX0dFVF9WQUxVRSAoZml4LT5meF9zdWJzeSk7Ci0gICAgfQotCi0gIC8qIFBDIHJlbGF0aXZlIHJlbG9jcyBhcmUgYWx3YXlzIGFnYWluc3QgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi0gIGlmIChzeW1ib2xfcHRyID09IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChmaXgtPmZ4X3JfdHlwZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyOgotCWNhc2UgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNDoKLQljYXNlIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyOgotCWNhc2UgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyOgotCWNhc2UgQkZEX1JFTE9DX1NIX1VTRVM6Ci0JICBzeW1ib2xfcHRyID0gc2VnLT5kb3Q7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX1VTRVMpCi0gICAgewotICAgICAgLyogV2UgY2FuJ3Qgc3RvcmUgdGhlIG9mZnNldCBpbiB0aGUgb2JqZWN0IGZpbGUsIHNpbmNlIHRoaXMKLQkgcmVsb2MgZG9lcyBub3QgdGFrZSB1cCBhbnkgc3BhY2UsIHNvIHdlIHN0b3JlIGl0IGluIHJfb2Zmc2V0LgotCSBUaGUgZnhfYWRkbnVtYmVyIGZpZWxkIHdhcyBzZXQgaW4gbWRfYXBwbHlfZml4LiAgKi8KLSAgICAgIGludHItPnJfb2Zmc2V0ID0gZml4LT5meF9hZGRudW1iZXI7Ci0gICAgfQotICBlbHNlIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQ09VTlQpCi0gICAgewotICAgICAgLyogV2UgY2FuJ3Qgc3RvcmUgdGhlIGNvdW50IGluIHRoZSBvYmplY3QgZmlsZSwgc2luY2UgdGhpcyByZWxvYwotICAgICAgICAgZG9lcyBub3QgdGFrZSB1cCBhbnkgc3BhY2UsIHNvIHdlIHN0b3JlIGl0IGluIHJfb2Zmc2V0LiAgVGhlCi0gICAgICAgICBmeF9vZmZzZXQgZmllbGQgd2FzIHNldCB3aGVuIHRoZSBmaXh1cCB3YXMgY3JlYXRlZCBpbgotICAgICAgICAgc2hfY29mZl9mcm9iX2ZpbGUuICAqLwotICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X29mZnNldDsKLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWx3YXlzIGFic29sdXRlLiAgKi8KLSAgICAgIHN5bWJvbF9wdHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0FMSUdOKQotICAgIHsKLSAgICAgIC8qIFN0b3JlIHRoZSBhbGlnbm1lbnQgaW4gdGhlIHJfb2Zmc2V0IGZpZWxkLiAgKi8KLSAgICAgIGludHItPnJfb2Zmc2V0ID0gZml4LT5meF9vZmZzZXQ7Ci0gICAgICAvKiBUaGlzIHJlbG9jIGlzIGFsd2F5cyBhYnNvbHV0ZS4gICovCi0gICAgICBzeW1ib2xfcHRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9DT0RFCi0JICAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0RBVEEKLQkgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfTEFCRUwpCi0gICAgewotICAgICAgLyogVGhlc2UgcmVsb2NzIGFyZSBhbHdheXMgYWJzb2x1dGUuICAqLwotICAgICAgc3ltYm9sX3B0ciA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFR1cm4gdGhlIHNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpbnRvIGFuIG9mZnNldC4gICovCi0gIGlmIChzeW1ib2xfcHRyICE9IE5VTEwpCi0gICAgewotICAgICAgZG90ID0gc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpXS5kb3Q7Ci0gICAgICBpZiAoZG90ICE9IE5VTEwpCi0JaW50ci0+cl9zeW1uZHggPSBkb3QtPnN5X251bWJlcjsKLSAgICAgIGVsc2UKLQlpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogQ3JlYXRlIGEgcmVsb2MuICAqLwotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsKLQotICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICByX3R5cGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0KLSAgaWYgKFNXSVRDSF9UQUJMRSAoZml4cCkpCi0gICAgewotICAgICAgcmVsLT5hZGRlbmQgPSByZWwtPmFkZHJlc3MgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotICAgICAgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfMTYpCi0Jcl90eXBlID0gQkZEX1JFTE9DX1NIX1NXSVRDSDE2OwotICAgICAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ184KQotCXJfdHlwZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotICAgICAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ18zMikKLQlyX3R5cGUgPSBCRkRfUkVMT0NfU0hfU1dJVENIMzI7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgfQotICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DX1NIX1VTRVMpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQ09VTlQpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQUxJR04pCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgICAgICAgfHwgcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgcl90eXBlKTsKLSAgaWYgKHJlbC0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJDYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKHJfdHlwZSkpOwotICAgICAgLyogU2V0IGhvd3RvIHRvIGEgZ2FyYmFnZSB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGFzc2VydCAocmVsLT5ob3d0byAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbDsKLX0KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc2guaCBiL2dhcy9jb25maWcvdGMtc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhYjhhOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLXNoLmgKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19TSAotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9zaAotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3Qgc2VnbWVudF9pbmZvX3N0cnVjdDsKLXN0cnVjdCBpbnRlcm5hbF9yZWxvYzsKLSNlbmRpZgotCi0vKiBXaGV0aGVyIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4gICovCi1leHRlcm4gaW50IHNobDsKLQotLyogV2hldGhlciAtcmVsYXggd2FzIHVzZWQuICAqLwotZXh0ZXJuIGludCBzaF9yZWxheDsKLQotLyogV2hldGhlciAtc21hbGwgd2FzIHVzZWQuICAqLwotZXh0ZXJuIGludCBzaF9zbWFsbDsKLQotLyogRG9uJ3QgdHJ5IHRvIGJyZWFrIHdvcmRzLiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBXZSByZXF1aXJlIC5sb25nLCBldC4gYWwuLCB0byBiZSBhbGlnbmVkIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIG1kX2NvbnNfYWxpZ24obmJ5dGVzKSBzaF9jb25zX2FsaWduIChuYnl0ZXMpCi1leHRlcm4gdm9pZCBzaF9jb25zX2FsaWduIFBBUkFNUyAoKGludCkpOwotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIHJlbG9jYXRpb25zIGZvciBhbGlnbm1lbnQKLSAgIGRpcmVjdGl2ZXMuICAqLwotI2RlZmluZSBIQU5ETEVfQUxJR04oZnJhZykgc2hfaGFuZGxlX2FsaWduIChmcmFnKQotZXh0ZXJuIHZvaWQgc2hfaGFuZGxlX2FsaWduIFBBUkFNUyAoKGZyYWdTICopKTsKLQotLyogV2UgbmVlZCB0byBmb3JjZSBvdXQgc29tZSByZWxvY2F0aW9ucyB3aGVuIHJlbGF4aW5nLiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIHNoX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLWV4dGVybiBpbnQgc2hfZm9yY2VfcmVsb2NhdGlvbiAoKTsKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIHNoX2ZpeF9hZGp1c3RhYmxlKGZpeFApCi1zdHJ1Y3QgZml4OwotZXh0ZXJuIGJvb2xlYW4gc2hfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSIChzaGwgPyAiSGl0YWNoaSBTdXBlci1IIEdBUyBMaXR0bGUgRW5kaWFuIiA6ICJIaXRhY2hpIFN1cGVyLUggR0FTIEJpZyBFbmRpYW4iKQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyogV2UgdXNlIGEgc3BlY2lhbCBhbGlnbm1lbnQgZnVuY3Rpb24gdG8gaW5zZXJ0IHRoZSBjb3JyZWN0IG5vcAotICAgcGF0dGVybi4gICovCi1leHRlcm4gaW50IHNoX2RvX2FsaWduIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotI2RlZmluZSBtZF9kb19hbGlnbihuLGZpbGwsbGVuLG1heCxsKSBpZiAoc2hfZG9fYWxpZ24gKG4sZmlsbCxsZW4sbWF4KSkgZ290byBsCi0KLS8qIFdlIHJlY29yZCwgZm9yIGVhY2ggc2VjdGlvbiwgd2hldGhlciB3ZSBoYXZlIG1vc3QgcmVjZW50bHkgb3V0cHV0IGEKLSAgIENPREUgcmVsb2Mgb3IgYSBEQVRBIHJlbG9jLiAgKi8KLXN0cnVjdCBzaF9zZWdtZW50X2luZm9fdHlwZQotewotICBpbnQgaW5fY29kZSA6IDE7Ci19OwotI2RlZmluZSBUQ19TRUdNRU5UX0lORk9fVFlQRSBzdHJ1Y3Qgc2hfc2VnbWVudF9pbmZvX3R5cGUKLQotLyogV2UgY2FsbCBhIHJvdXRpbmUgdG8gZW1pdCBhIHJlbG9jIGZvciBhIGxhYmVsLCBzbyB0aGF0IHRoZSBsaW5rZXIKLSAgIGNhbiBhbGlnbiBsb2FkcyBhbmQgc3RvcmVzIHdpdGhvdXQgY3Jvc3NpbmcgYSBsYWJlbC4gICovCi1leHRlcm4gdm9pZCBzaF9mcm9iX2xhYmVsIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIHNoX2Zyb2JfbGFiZWwgKCkKLQotLyogV2UgY2FsbCBhIHJvdXRpbmUgdG8gZmx1c2ggcGVuZGluZyBvdXRwdXQgaW4gb3JkZXIgdG8gb3V0cHV0IGEgREFUQQotICAgcmVsb2Mgd2hlbiByZXF1aXJlZC4gICovCi1leHRlcm4gdm9pZCBzaF9mbHVzaF9wZW5kaW5nX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KCkgc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCkKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3Qgc2hfZnJvYl9maWxlCi0jZWxzZQotI2RlZmluZSB0Y19mcm9iX2ZpbGUgc2hfZnJvYl9maWxlCi0jZW5kaWYKLWV4dGVybiB2b2lkIHNoX2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpZmRlZiBPQkpfQ09GRgotLyogQ09GRiBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCi0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4KSAoKGZpeCktPmZ4X3JfdHlwZSkKLQotI2RlZmluZSBCRkRfQVJDSCBUQVJHRVRfQVJDSAotCi0jZGVmaW5lIENPRkZfTUFHSUMgKHNobCA/IFNIX0FSQ0hfTUFHSUNfTElUVExFIDogU0hfQVJDSF9NQUdJQ19CSUcpCi0KLS8qIFdlIG5lZWQgdG8gd3JpdGUgb3V0IHJlbG9jcyB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbXBsZXRlZC4gICovCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKGZpeCkgKChmaXgpLT5meF9hZGRzeSAhPSBOVUxMKQotCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzZWcsIGZpeCwgaW50LCBwYWRkcikgXAotICBzaF9jb2ZmX3JlbG9jX21hbmdsZSAoKHNlZyksIChmaXgpLCAoaW50KSwgKHBhZGRyKSkKLWV4dGVybiB2b2lkIHNoX2NvZmZfcmVsb2NfbWFuZ2xlCi0gIFBBUkFNUyAoKHN0cnVjdCBzZWdtZW50X2luZm9fc3RydWN0ICosIHN0cnVjdCBmaXggKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgdW5zaWduZWQgaW50KSk7Ci0KLSNkZWZpbmUgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKGEpIDsgLyogbm90IHVzZWQgKi8KLQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCi0KLSNkZWZpbmUgVENfS0VFUF9GWF9PRkZTRVQgMQotCi0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcChmcmFnKQotZXh0ZXJuIGludCB0Y19jb2ZmX3NpemVtYWNoZGVwIFBBUkFNUyAoKGZyYWdTICopKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgU0VHX05BTUUoU0VHKSBzZWdtZW50X25hbWUgKFNFRykKLSNlbHNlCi0jZGVmaW5lIFNFR19OQU1FKFNFRykgb2JqX3NlZ21lbnRfbmFtZSAoU0VHKQotI2VuZGlmCi0KLS8qIFdlIGFsaWduIG1vc3Qgc2VjdGlvbnMgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LiAgKi8KLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKQkJCQlcCi0gIChzdHJuY21wIChTRUdfTkFNRSAoU0VHKSwgIi5zdGFic3RyIiwgOCkgPT0gMAkJXAotICAgPyAwCQkJCQkJCVwKLSAgIDogKChzdHJuY21wIChTRUdfTkFNRSAoU0VHKSwgIi5zdGFiIiwgNSkgPT0gMAlcCi0gICAgICAgfHwgc3RyY21wIChTRUdfTkFNRSAoU0VHKSwgIi5jdG9ycyIpID09IDAJXAotICAgICAgIHx8IHN0cmNtcCAoU0VHX05BTUUgKFNFRyksICIuZHRvcnMiKSA9PSAwKQlcCi0gICAgICA/IDIJCQkJCQlcCi0gICAgICA6IChzaF9zbWFsbCA/IDIgOiA0KSkpCi0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0jaWZkZWYgT0JKX0VMRgotLyogRUxGIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KLQotLyogV2hldGhlciBvciBub3QgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHNobCA/ICJlbGYzMi1zaGwiIDogImVsZjMyLXNoIikKLQotI2RlZmluZSBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBzaF9lbGZfZmluYWxfcHJvY2Vzc2luZwotZXh0ZXJuIHZvaWQgc2hfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0vKiBlbmQgb2YgdGMtc2guaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zcGFyYy5jIGIvZ2FzL2NvbmZpZy90Yy1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzA0OWQ2Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMTggKzAsMCBAQAotLyogdGMtc3BhcmMuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFNQQVJDCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLTk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKLSAgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvc3BhcmMuaCIKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHNwYXJjX2FyY2ggKmxvb2t1cF9hcmNoIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgaW5pdF9kZWZhdWx0X2FyY2ggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBzcGFyY19pcCBQQVJBTVMgKChjaGFyICosIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiopKTsKLXN0YXRpYyBpbnQgaW5fc2lnbmVkX3JhbmdlIFBBUkFNUyAoKGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGludCBpbl91bnNpZ25lZF9yYW5nZSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgaW50IGluX2JpdGZpZWxkX3JhbmdlIFBBUkFNUyAoKGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGludCBzcGFyY19mZnMgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBzeW50aGV0aXplX3NldHV3IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotc3RhdGljIHZvaWQgc3ludGhldGl6ZV9zZXRzdyBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICopKTsKLXN0YXRpYyB2b2lkIHN5bnRoZXRpemVfc2V0eCBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICopKTsKLXN0YXRpYyBiZmRfdm1hIEJTUiBQQVJBTVMgKChiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBpbnQgY21wX3JlZ19lbnRyeSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGludCBwYXJzZV9rZXl3b3JkX2FyZyBQQVJBTVMgKChpbnQgKCopIChjb25zdCBjaGFyICopLCBjaGFyICoqLCBpbnQgKikpOwotc3RhdGljIGludCBwYXJzZV9jb25zdF9leHByX2FyZyBQQVJBTVMgKChjaGFyICoqLCBpbnQgKikpOwotc3RhdGljIGludCBnZXRfZXhwcmVzc2lvbiBQQVJBTVMgKChjaGFyICpzdHIpKTsKLQotLyogRGVmYXVsdCBhcmNoaXRlY3R1cmUuICAqLwotLyogPz8/IFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBWOCwgYnV0IHNwYXJjbGl0ZSBzdXBwb3J0IHdhcyBhZGRlZAotICAgYnkgbWFraW5nIGl0IHRoZSBkZWZhdWx0LiAgR0NDIG5vdyBwYXNzZXMgLUFzcGFyY2xpdGUsIHNvIG1heWJlIHNvbWV0aW1lIGluCi0gICB0aGUgZnV0dXJlIHdlIGNhbiBzZXQgdGhpcyB0byBWOC4gICovCi0jaWZuZGVmIERFRkFVTFRfQVJDSAotI2RlZmluZSBERUZBVUxUX0FSQ0ggInNwYXJjbGl0ZSIKLSNlbmRpZgotc3RhdGljIGNoYXIgKmRlZmF1bHRfYXJjaCA9IERFRkFVTFRfQVJDSDsKLQotLyogTm9uLXplcm8gaWYgdGhlIGluaXRpYWwgdmFsdWVzIG9mIGBtYXhfYXJjaGl0ZWN0dXJlJyBhbmQgYHNwYXJjX2FyY2hfc2l6ZScKLSAgIGhhdmUgYmVlbiBzZXQuICAqLwotc3RhdGljIGludCBkZWZhdWx0X2luaXRfcDsKLQotLyogQ3VycmVudCBhcmNoaXRlY3R1cmUuICBXZSBkb24ndCBidW1wIHVwIHVubGVzcyBuZWNlc3NhcnkuICAqLwotc3RhdGljIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIGN1cnJlbnRfYXJjaGl0ZWN0dXJlID0gU1BBUkNfT1BDT0RFX0FSQ0hfVjY7Ci0KLS8qIFRoZSBtYXhpbXVtIGFyY2hpdGVjdHVyZSBsZXZlbCB3ZSBjYW4gYnVtcCB1cCB0by4KLSAgIEluIGEgMzIgYml0IGVudmlyb25tZW50LCBkb24ndCBhbGxvdyBidW1waW5nIHVwIHRvIHY5IGJ5IGRlZmF1bHQuCi0gICBUaGUgbmF0aXZlIGFzc2VtYmxlciB3b3JrcyB0aGlzIHdheS4gIFRoZSB1c2VyIGlzIHJlcXVpcmVkIHRvIHBhc3MKLSAgIGFuIGV4cGxpY2l0IGFyZ3VtZW50IGJlZm9yZSB3ZSdsbCBjcmVhdGUgdjkgb2JqZWN0IGZpbGVzLiAgSG93ZXZlciwgaWYKLSAgIHdlIGRvbid0IHNlZSBhbnkgdjkgaW5zbnMsIGEgdjhwbHVzIG9iamVjdCBmaWxlIGlzIG5vdCBjcmVhdGVkLiAgKi8KLXN0YXRpYyBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBtYXhfYXJjaGl0ZWN0dXJlOwotCi0vKiBFaXRoZXIgMzIgb3IgNjQsIHNlbGVjdHMgZmlsZSBmb3JtYXQuICAqLwotc3RhdGljIGludCBzcGFyY19hcmNoX3NpemU7Ci0vKiBJbml0aWFsIChkZWZhdWx0KSB2YWx1ZSwgcmVjb3JkZWQgc2VwYXJhdGVseSBpbiBjYXNlIGEgdXNlciBvcHRpb24KLSAgIGNoYW5nZXMgdGhlIHZhbHVlIGJlZm9yZSBtZF9zaG93X3VzYWdlIGlzIGNhbGxlZC4gICovCi1zdGF0aWMgaW50IGRlZmF1bHRfYXJjaF9zaXplOwotCi0jaWZkZWYgT0JKX0VMRgotLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2OSBtZW1vcnkgbW9kZWwuICBDdXJyZW50bHkgb25seSB1c2VkIGZvcgotICAgRUxGLiAgKi8KLXN0YXRpYyBlbnVtIHsgTU1fVFNPLCBNTV9QU08sIE1NX1JNTyB9IHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1JNTzsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGFyY2hpdGVjdHVyZV9yZXF1ZXN0ZWQ7Ci1zdGF0aWMgaW50IHdhcm5fb25fYnVtcDsKLQotLyogSWYgd2Fybl9vbl9idW1wIGFuZCB0aGUgbmVlZGVkIGFyY2hpdGVjdHVyZSBpcyBoaWdoZXIgdGhhbiB0aGlzCi0gICBhcmNoaXRlY3R1cmUsIGlzc3VlIGEgd2FybmluZy4gICovCi1zdGF0aWMgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmU7Ci0KLS8qIE5vbi16ZXJvIGlmIGFzIHNob3VsZCBnZW5lcmF0ZSBlcnJvciBpZiBhbiB1bmRlY2xhcmVkIGdbMjNdIHJlZ2lzdGVyCi0gICBoYXMgYmVlbiB1c2VkIGluIC02NC4gICovCi1zdGF0aWMgaW50IG5vX3VuZGVjbGFyZWRfcmVnczsKLQotLyogTm9uLXplcm8gaWYgd2UgYXJlIGdlbmVyYXRpbmcgUElDIGNvZGUuICAqLwotaW50IHNwYXJjX3BpY19jb2RlOwotCi0vKiBOb24temVybyBpZiB3ZSBzaG91bGQgZ2l2ZSBhbiBlcnJvciB3aGVuIG1pc2FsaWduZWQgZGF0YSBpcyBzZWVuLiAgKi8KLXN0YXRpYyBpbnQgZW5mb3JjZV9hbGlnbmVkX2RhdGE7Ci0KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLXN0YXRpYyBpbnQgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YTsKLQotLyogU3ltYm9scyBmb3IgZ2xvYmFsIHJlZ2lzdGVycyBvbiB2OS4gICovCi1zdGF0aWMgc3ltYm9sUyAqZ2xvYmFsc1s4XTsKLQotLyogVjkgYW5kIDg2eCBoYXZlIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBkYXRhLCBidXQgaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgYmlnCi0gICBlbmRpYW4uICBUaGUgc3BhcmNsZXQgaGFzIGJpLWVuZGlhbiBzdXBwb3J0IGJ1dCBib3RoIGRhdGEgYW5kIGluc25zIGhhdmUKLSAgIHRoZSBzYW1lIGVuZGlhbm5lc3MuICBHbG9iYWwgYHRhcmdldF9iaWdfZW5kaWFuJyBpcyB1c2VkIGZvciBkYXRhLgotICAgVGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIGZvciBpbnN0cnVjdGlvbnMuICAqLwotI2lmbmRlZiBJTlNOX0JJR19FTkRJQU4KLSNkZWZpbmUgSU5TTl9CSUdfRU5ESUFOICh0YXJnZXRfYmlnX2VuZGlhbiBcCi0JCQkgfHwgZGVmYXVsdF9hcmNoX3R5cGUgPT0gc3BhcmM4NnggXAotCQkJIHx8IFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotI2VuZGlmCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotCi1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNfc2VnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19yZXNlcnZlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jb21tb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2VtcHR5IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc191YWNvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX25jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19yZWdpc3RlciBQQVJBTVMgKChpbnQpKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAkvKiBEZWZhdWx0aW5nIGlzIGludmFsaWQgKDApICovCi0gIHsiY29tbW9uIiwgc19jb21tb24sIDB9LAotICB7ImVtcHR5Iiwgc19lbXB0eSwgMH0sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsiaGFsZiIsIGNvbnMsIDJ9LAotICB7Im53b3JkIiwgc19uY29ucywgMH0sCi0gIHsib3B0aW0iLCBzX2lnbm9yZSwgMH0sCi0gIHsicHJvYyIsIHNfcHJvYywgMH0sCi0gIHsicmVzZXJ2ZSIsIHNfcmVzZXJ2ZSwgMH0sCi0gIHsic2VnIiwgc19zZWcsIDB9LAotICB7InNraXAiLCBzX3NwYWNlLCAwfSwKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIHsieHdvcmQiLCBjb25zLCA4fSwKLSAgeyJ1YWhhbGYiLCBzX3VhY29ucywgMn0sCi0gIHsidWF3b3JkIiwgc191YWNvbnMsIDR9LAotICB7InVheHdvcmQiLCBzX3VhY29ucywgOH0sCi0jaWZkZWYgT0JKX0VMRgotICAvKiB0aGVzZSBhcmUgc3BlY2lmaWMgdG8gc3BhcmMvc3ZyNCAqLwotICB7IjJieXRlIiwgc191YWNvbnMsIDJ9LAotICB7IjRieXRlIiwgc191YWNvbnMsIDR9LAotICB7IjhieXRlIiwgc191YWNvbnMsIDh9LAotICB7InJlZ2lzdGVyIiwgc19yZWdpc3RlciwgMH0sCi0jZW5kaWYKLSAge05VTEwsIDAsIDB9LAotfTsKLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAxMjsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7CS8qIEpGIHJlbW92ZWQgJ3wnIGZyb20gY29tbWVudF9jaGFycyAqLwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgc3RhcnRlZCBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzCi0gICB3b3JrIGlmICcvJyBpc24ndCBvdGhlcndpc2UgZGVmaW5lZC4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi0jZGVmaW5lIGlzb2N0YWwoYykgICgodW5zaWduZWQpKChjKSAtICcwJykgPCAnOCcpCi0KLXN0cnVjdCBzcGFyY19pdAotICB7Ci0gICAgY2hhciAqZXJyb3I7Ci0gICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gICAgc3RydWN0IG5saXN0ICpubGlzdHA7Ci0gICAgZXhwcmVzc2lvblMgZXhwOwotICAgIGV4cHJlc3Npb25TIGV4cDI7Ci0gICAgaW50IHBjcmVsOwotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgfTsKLQotc3RydWN0IHNwYXJjX2l0IHRoZV9pbnNuLCBzZXRfaW5zbjsKLQotc3RhdGljIHZvaWQgb3V0cHV0X2luc24KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqLCBzdHJ1Y3Qgc3BhcmNfaXQgKikpOwotDAotLyogVGFibGUgb2YgYXJndW1lbnRzIHRvIC1BLgotICAgVGhlIHNwYXJjX29wY29kZV9hcmNoIHRhYmxlIGluIHNwYXJjLW9wYy5jIGlzIGluc3VmZmljaWVudCBhbmQgaW5jb3JyZWN0Ci0gICBmb3IgdGhpcyB1c2UuICBUaGF0IHRhYmxlIGlzIGZvciBvcGNvZGVzIG9ubHkuICBUaGlzIHRhYmxlIGlzIGZvciBvcGNvZGVzCi0gICBhbmQgZmlsZSBmb3JtYXRzLiAgKi8KLQotZW51bSBzcGFyY19hcmNoX3R5cGVzIHt2NiwgdjcsIHY4LCBzcGFyY2xldCwgc3BhcmNsaXRlLCBzcGFyYzg2eCwgdjhwbHVzLAotCQkgICAgICAgdjhwbHVzYSwgdjksIHY5YSwgdjlfNjR9OwotCi1zdGF0aWMgc3RydWN0IHNwYXJjX2FyY2ggewotICBjaGFyICpuYW1lOwotICBjaGFyICpvcGNvZGVfYXJjaDsKLSAgZW51bSBzcGFyY19hcmNoX3R5cGVzIGFyY2hfdHlwZTsKLSAgLyogRGVmYXVsdCB3b3JkIHNpemUsIGFzIHNwZWNpZmllZCBkdXJpbmcgY29uZmlndXJhdGlvbi4KLSAgICAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIGNhbid0IGJlIHVzZWQgdG8gc3BlY2lmeSBkZWZhdWx0IGFyY2hpdGVjdHVyZS4gICovCi0gIGludCBkZWZhdWx0X2FyY2hfc2l6ZTsKLSAgLyogQWxsb3dhYmxlIGFyZyB0byAtQT8gICovCi0gIGludCB1c2VyX29wdGlvbl9wOwotfSBzcGFyY19hcmNoX3RhYmxlW10gPSB7Ci0gIHsgInY2IiwgInY2IiwgdjYsIDAsIDEgfSwKLSAgeyAidjciLCAidjciLCB2NywgMCwgMSB9LAotICB7ICJ2OCIsICJ2OCIsIHY4LCAzMiwgMSB9LAotICB7ICJzcGFyY2xldCIsICJzcGFyY2xldCIsIHNwYXJjbGV0LCAzMiwgMSB9LAotICB7ICJzcGFyY2xpdGUiLCAic3BhcmNsaXRlIiwgc3BhcmNsaXRlLCAzMiwgMSB9LAotICB7ICJzcGFyYzg2eCIsICJzcGFyY2xpdGUiLCBzcGFyYzg2eCwgMzIsIDEgfSwKLSAgeyAidjhwbHVzIiwgInY5IiwgdjksIDAsIDEgfSwKLSAgeyAidjhwbHVzYSIsICJ2OWEiLCB2OSwgMCwgMSB9LAotICB7ICJ2OSIsICJ2OSIsIHY5LCAwLCAxIH0sCi0gIHsgInY5YSIsICJ2OWEiLCB2OSwgMCwgMSB9LAotICAvKiBUaGlzIGV4aXN0cyB0byBhbGxvdyBjb25maWd1cmUuaW4vTWFrZWZpbGUuaW4gdG8gcGFzcyBvbmUKLSAgICAgdmFsdWUgdG8gc3BlY2lmeSBib3RoIHRoZSBkZWZhdWx0IG1hY2hpbmUgYW5kIGRlZmF1bHQgd29yZCBzaXplLiAgKi8KLSAgeyAidjktNjQiLCAidjkiLCB2OSwgNjQsIDAgfSwKLSAgeyBOVUxMLCBOVUxMLCB2OCwgMCwgMCB9Ci19OwotCi0vKiBWYXJpYW50IG9mIGRlZmF1bHRfYXJjaCAqLwotc3RhdGljIGVudW0gc3BhcmNfYXJjaF90eXBlcyBkZWZhdWx0X2FyY2hfdHlwZTsKLQotc3RhdGljIHN0cnVjdCBzcGFyY19hcmNoICoKLWxvb2t1cF9hcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgc3BhcmNfYXJjaCAqc2E7Ci0KLSAgZm9yIChzYSA9ICZzcGFyY19hcmNoX3RhYmxlWzBdOyBzYS0+bmFtZSAhPSBOVUxMOyBzYSsrKQotICAgIGlmIChzdHJjbXAgKHNhLT5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIGlmIChzYS0+bmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gc2E7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgb3Bjb2RlIGFyY2ggYW5kIHdvcmQgc2l6ZSBmcm9tIHRoZSBkZWZhdWx0Ci0gICBhcmNoaXRlY3R1cmUgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1pbml0X2RlZmF1bHRfYXJjaCAoKQotewotICBzdHJ1Y3Qgc3BhcmNfYXJjaCAqc2EgPSBsb29rdXBfYXJjaCAoZGVmYXVsdF9hcmNoKTsKLQotICBpZiAoc2EgPT0gTlVMTAotICAgICAgfHwgc2EtPmRlZmF1bHRfYXJjaF9zaXplID09IDApCi0gICAgYXNfZmF0YWwgKF8oIkludmFsaWQgZGVmYXVsdCBhcmNoaXRlY3R1cmUsIGJyb2tlbiBhc3NlbWJsZXIuIikpOwotCi0gIG1heF9hcmNoaXRlY3R1cmUgPSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKHNhLT5vcGNvZGVfYXJjaCk7Ci0gIGlmIChtYXhfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX0JBRCkKLSAgICBhc19mYXRhbCAoXygiQmFkIG9wY29kZSB0YWJsZSwgYnJva2VuIGFzc2VtYmxlci4iKSk7Ci0gIGRlZmF1bHRfYXJjaF9zaXplID0gc3BhcmNfYXJjaF9zaXplID0gc2EtPmRlZmF1bHRfYXJjaF9zaXplOwotICBkZWZhdWx0X2luaXRfcCA9IDE7Ci0gIGRlZmF1bHRfYXJjaF90eXBlID0gc2EtPmFyY2hfdHlwZTsKLX0KLQotLyogQ2FsbGVkIGJ5IFRBUkdFVF9GT1JNQVQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX3RhcmdldF9mb3JtYXQgKCkKLXsKLSAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIHdlJ3JlIGNhbGxlZCwKLSAgICAgc28gaGFuZGxlIHRoYXQgbm93LiAgKi8KLSAgaWYgKCEgZGVmYXVsdF9pbml0X3ApCi0gICAgaW5pdF9kZWZhdWx0X2FyY2ggKCk7Ci0KLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIFRFX05ldEJTRAotICByZXR1cm4gImEub3V0LXNwYXJjLW5ldGJzZCI7Ci0jZWxzZQotI2lmZGVmIFRFX1NQQVJDQU9VVAotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgcmV0dXJuICJhLm91dC1zdW5vcy1iaWciOwotICBlbHNlIGlmIChkZWZhdWx0X2FyY2hfdHlwZSA9PSBzcGFyYzg2eCAmJiB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhKQotICAgIHJldHVybiAiYS5vdXQtc3Vub3MtYmlnIjsKLSAgZWxzZSByZXR1cm4gImEub3V0LXNwYXJjLWxpdHRsZSI7Ci0jZWxzZQotICByZXR1cm4gImEub3V0LXN1bm9zLWJpZyI7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQk9VVAotICByZXR1cm4gImIub3V0LmJpZyI7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9DT0ZGCi0jaWZkZWYgVEVfTFlOWAotICByZXR1cm4gImNvZmYtc3BhcmMtbHlueCI7Ci0jZWxzZQotICByZXR1cm4gImNvZmYtc3BhcmMiOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgcmV0dXJuIHNwYXJjX2FyY2hfc2l6ZSA9PSA2NCA/ICJlbGY2NC1zcGFyYyIgOiAiZWxmMzItc3BhcmMiOwotI2VuZGlmCi0KLSAgYWJvcnQgKCk7Ci19Ci0MCi0vKgotICogbWRfcGFyc2Vfb3B0aW9uCi0gKglJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICoJU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgVGhlc2UgYXJlOgotICoKLSAqCS1idW1wCi0gKgkJV2FybiBvbiBhcmNoaXRlY3R1cmUgYnVtcHMuICBTZWUgYWxzbyAtQS4KLSAqCi0gKgktQXY2LCAtQXY3LCAtQXY4LCAtQXNwYXJjbGl0ZSwgLUFzcGFyY2xldAotICoJCVN0YW5kYXJkIDMyIGJpdCBhcmNoaXRlY3R1cmVzLgotICoJLUF2OHBsdXMsIC1BdjhwbHVzYQotICoJCVNwYXJjNjQgaW4gYSAzMiBiaXQgd29ybGQuCi0gKgktQXY5LCAtQXY5YQotICoJCVNwYXJjNjQgaW4gZWl0aGVyIGEgMzIgb3IgNjQgYml0IHdvcmxkICgtMzIvLTY0IHNheXMgd2hpY2gpLgotICoJCVRoaXMgdXNlZCB0byBvbmx5IG1lYW4gNjQgYml0cywgYnV0IHByb3Blcmx5IHNwZWNpZnlpbmcgaXQKLSAqCQljb21wbGljYXRlZCBnY2MncyBBU01fU1BFQ3MsIHNvIG5vdyBvcGNvZGUgc2VsZWN0aW9uIGlzCi0gKgkJc3BlY2lmaWVkIG9ydGhvZ29uYWxseSB0byB3b3JkIHNpemUgKGV4Y2VwdCB3aGVuIHNwZWNpZnlpbmcKLSAqCQl0aGUgZGVmYXVsdCwgYnV0IHRoYXQgaXMgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsKS4KLSAqCS14YXJjaD12OHBsdXMsIC14YXJjaD12OHBsdXNhCi0gKgkJU2FtZSBhcyAtQXY4cGx1c3ssYX0sIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU3VuJ3MgYXNzZW1ibGVyLgotICoKLSAqCQlTZWxlY3QgdGhlIGFyY2hpdGVjdHVyZSBhbmQgcG9zc2libHkgdGhlIGZpbGUgZm9ybWF0LgotICoJCUluc3RydWN0aW9ucyBvciBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZAotICoJCWFyY2hpdGVjdHVyZSBjYXVzZSBmYXRhbCBlcnJvcnMuCi0gKgotICoJCVRoZSBkZWZhdWx0IGlzIHRvIHN0YXJ0IGF0IHY2LCBhbmQgYnVtcCB0aGUgYXJjaGl0ZWN0dXJlIHVwCi0gKgkJd2hlbmV2ZXIgYW4gaW5zdHJ1Y3Rpb24gaXMgc2VlbiBhdCBhIGhpZ2hlciBsZXZlbC4gIEluIDMyIGJpdAotICoJCWVudmlyb25tZW50cywgdjkgaXMgbm90IGJ1bXBlZCB1cCB0bywgdGhlIHVzZXIgbXVzdCBwYXNzCi0gKiAJCS1BdjhwbHVzeyxhfS4KLSAqCi0gKgkJSWYgLWJ1bXAgaXMgc3BlY2lmaWVkLCBhIHdhcm5pbmcgaXMgcHJpbnRpbmcgd2hlbiBidW1waW5nIHRvCi0gKgkJaGlnaGVyIGxldmVscy4KLSAqCi0gKgkJSWYgYW4gYXJjaGl0ZWN0dXJlIGlzIHNwZWNpZmllZCwgYWxsIGluc3RydWN0aW9ucyBtdXN0IG1hdGNoCi0gKgkJdGhhdCBhcmNoaXRlY3R1cmUuICBBbnkgaGlnaGVyIGxldmVsIGluc3RydWN0aW9ucyBhcmUgZmxhZ2dlZAotICoJCWFzIGVycm9ycy4gIE5vdGUgdGhhdCBpbiB0aGUgMzIgYml0IGVudmlyb25tZW50IHNwZWNpZnlpbmcKLSAqCQktQXY4cGx1cyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHY4cGx1cyBvYmplY3QgZmlsZSwgYQotICoJCXY5IGluc24gbXVzdCBiZSBzZWVuLgotICoKLSAqCQlJZiBib3RoIGFuIGFyY2hpdGVjdHVyZSBhbmQgLWJ1bXAgYXJlIHNwZWNpZmllZCwgdGhlCi0gKgkJYXJjaGl0ZWN0dXJlIHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIGxldmVsLCBidXQgYnVtcHMgYXJlCi0gKgkJd2FybmluZ3MuICBOb3RlIHRoYXQgd2UgY2FuJ3Qgc2V0IGBjdXJyZW50X2FyY2hpdGVjdHVyZScgdG8KLSAqCQl0aGUgcmVxdWVzdGVkIGxldmVsIGluIHRoaXMgY2FzZTogaW4gdGhlIDMyIGJpdCBlbnZpcm9ubWVudCwKLSAqCQl3ZSBzdGlsbCBtdXN0IGF2b2lkIGNyZWF0aW5nIHY4cGx1cyBvYmplY3QgZmlsZXMgdW5sZXNzIHY5Ci0gKiAJCWluc25zIGFyZSBzZWVuLgotICoKLSAqIE5vdGU6Ci0gKgkJQnVtcGluZyBiZXR3ZWVuIGluY29tcGF0aWJsZSBhcmNoaXRlY3R1cmVzIGlzIGFsd2F5cyBhbgotICoJCWVycm9yLiAgRm9yIGV4YW1wbGUsIGZyb20gc3BhcmNsaXRlIHRvIHY5LgotICovCi0KLSNpZmRlZiBPQkpfRUxGCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiQTpLOlZROnNxIjsKLSNlbHNlCi0jaWZkZWYgT0JKX0FPVVQKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOmsiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOiI7Ci0jZW5kaWYKLSNlbmRpZgotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fQlVNUCAoT1BUSU9OX01EX0JBU0UpCi0gIHsiYnVtcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQlVNUH0sCi0jZGVmaW5lIE9QVElPTl9TUEFSQyAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7InNwYXJjIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUEFSQ30sCi0jZGVmaW5lIE9QVElPTl9YQVJDSCAoT1BUSU9OX01EX0JBU0UgKyAyKQotICB7InhhcmNoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9YQVJDSH0sCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBPUFRJT05fMzIgKE9QVElPTl9NRF9CQVNFICsgMykKLSAgeyIzMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fMzJ9LAotI2RlZmluZSBPUFRJT05fNjQgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyI2NCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fNjR9LAotI2RlZmluZSBPUFRJT05fVFNPIChPUFRJT05fTURfQkFTRSArIDUpCi0gIHsiVFNPIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UU099LAotI2RlZmluZSBPUFRJT05fUFNPIChPUFRJT05fTURfQkFTRSArIDYpCi0gIHsiUFNPIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QU099LAotI2RlZmluZSBPUFRJT05fUk1PIChPUFRJT05fTURfQkFTRSArIDcpCi0gIHsiUk1PIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9STU99LAotI2VuZGlmCi0jaWZkZWYgU1BBUkNfQklFTkRJQU4KLSNkZWZpbmUgT1BUSU9OX0xJVFRMRV9FTkRJQU4gKE9QVElPTl9NRF9CQVNFICsgOCkKLSAgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFX0VORElBTn0sCi0jZGVmaW5lIE9QVElPTl9CSUdfRU5ESUFOIChPUFRJT05fTURfQkFTRSArIDkpCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JJR19FTkRJQU59LAotI2VuZGlmCi0jZGVmaW5lIE9QVElPTl9FTkZPUkNFX0FMSUdORURfREFUQSAoT1BUSU9OX01EX0JBU0UgKyAxMCkKLSAgeyJlbmZvcmNlLWFsaWduZWQtZGF0YSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5GT1JDRV9BTElHTkVEX0RBVEF9LAotI2RlZmluZSBPUFRJT05fTElUVExFX0VORElBTl9EQVRBIChPUFRJT05fTURfQkFTRSArIDExKQotICB7ImxpdHRsZS1lbmRpYW4tZGF0YSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFX0VORElBTl9EQVRBfSwKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIE9QVElPTl9OT19VTkRFQ0xBUkVEX1JFR1MgKE9QVElPTl9NRF9CQVNFICsgMTIpCi0gIHsibm8tdW5kZWNsYXJlZC1yZWdzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19VTkRFQ0xBUkVEX1JFR1N9LAotI2RlZmluZSBPUFRJT05fVU5ERUNMQVJFRF9SRUdTIChPUFRJT05fTURfQkFTRSArIDEzKQotICB7InVuZGVjbGFyZWQtcmVncyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVU5ERUNMQVJFRF9SRUdTfSwKLSNlbmRpZgotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICAvKiBXZSBkb24ndCBnZXQgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBhbnl0aGluZyBiZWZvcmUgd2UncmUgY2FsbGVkLAotICAgICBzbyBoYW5kbGUgdGhhdCBub3cuICAqLwotICBpZiAoISBkZWZhdWx0X2luaXRfcCkKLSAgICBpbml0X2RlZmF1bHRfYXJjaCAoKTsKLQotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX0JVTVA6Ci0gICAgICB3YXJuX29uX2J1bXAgPSAxOwotICAgICAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUgPSBTUEFSQ19PUENPREVfQVJDSF9WNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fWEFSQ0g6Ci0gICAgICAvKiBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU3VuJ3MgYXNzZW1ibGVyLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGFyZywgInY4cGx1cyIpICE9IDAKLQkgICYmIHN0cmNtcCAoYXJnLCAidjhwbHVzYSIpICE9IDApCi0JewotCSAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSAteGFyY2g9JXMiKSwgYXJnKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLSAgICBjYXNlICdBJzoKLSAgICAgIHsKLQlzdHJ1Y3Qgc3BhcmNfYXJjaCAqc2E7Ci0JZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgb3Bjb2RlX2FyY2g7Ci0KLQlzYSA9IGxvb2t1cF9hcmNoIChhcmcpOwotCWlmIChzYSA9PSBOVUxMCi0JICAgIHx8ICEgc2EtPnVzZXJfb3B0aW9uX3ApCi0JICB7Ci0JICAgIGFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgLUElcyIpLCBhcmcpOwotCSAgICByZXR1cm4gMDsKLQkgIH0KLQotCW9wY29kZV9hcmNoID0gc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoIChzYS0+b3Bjb2RlX2FyY2gpOwotCWlmIChvcGNvZGVfYXJjaCA9PSBTUEFSQ19PUENPREVfQVJDSF9CQUQpCi0JICBhc19mYXRhbCAoXygiQmFkIG9wY29kZSB0YWJsZSwgYnJva2VuIGFzc2VtYmxlci4iKSk7Ci0KLQltYXhfYXJjaGl0ZWN0dXJlID0gb3Bjb2RlX2FyY2g7Ci0JYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZCA9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1NQQVJDOgotICAgICAgLyogSWdub3JlIC1zcGFyYywgdXNlZCBieSBTdW5PUyBtYWtlIGRlZmF1bHQgLnMubyBydWxlLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRU5GT1JDRV9BTElHTkVEX0RBVEE6Ci0gICAgICBlbmZvcmNlX2FsaWduZWRfZGF0YSA9IDE7Ci0gICAgICBicmVhazsKLQotI2lmZGVmIFNQQVJDX0JJRU5ESUFOCi0gICAgY2FzZSBPUFRJT05fTElUVExFX0VORElBTjoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLSAgICAgIGlmIChkZWZhdWx0X2FyY2hfdHlwZSAhPSBzcGFyY2xldCkKLQlhc19mYXRhbCAoIlRoaXMgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgLUVMIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9MSVRUTEVfRU5ESUFOX0RBVEE6Ci0gICAgICB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhID0gMTsKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLSAgICAgIGlmIChkZWZhdWx0X2FyY2hfdHlwZSAhPSBzcGFyYzg2eAotCSAgJiYgZGVmYXVsdF9hcmNoX3R5cGUgIT0gdjkpCi0JYXNfZmF0YWwgKCJUaGlzIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IC0tbGl0dGxlLWVuZGlhbi1kYXRhIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9CSUdfRU5ESUFOOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9BT1VUCi0gICAgY2FzZSAnayc6Ci0gICAgICBzcGFyY19waWNfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgT1BUSU9OXzMyOgotICAgIGNhc2UgT1BUSU9OXzY0OgotICAgICAgewotCWNvbnN0IGNoYXIgKipsaXN0LCAqKmw7Ci0KLQlzcGFyY19hcmNoX3NpemUgPSBjID09IE9QVElPTl8zMiA/IDMyIDogNjQ7Ci0JbGlzdCA9IGJmZF90YXJnZXRfbGlzdCAoKTsKLQlmb3IgKGwgPSBsaXN0OyAqbCAhPSBOVUxMOyBsKyspCi0JICB7Ci0JICAgIGlmIChzcGFyY19hcmNoX3NpemUgPT0gMzIpCi0JICAgICAgewotCQlpZiAoc3RyY21wICgqbCwgImVsZjMyLXNwYXJjIikgPT0gMCkKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmIChzdHJjbXAgKCpsLCAiZWxmNjQtc3BhcmMiKSA9PSAwKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQlpZiAoKmwgPT0gTlVMTCkKLQkgIGFzX2ZhdGFsIChfKCJObyBjb21waWxlZCBpbiBzdXBwb3J0IGZvciAlZCBiaXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICBzcGFyY19hcmNoX3NpemUpOwotCWZyZWUgKGxpc3QpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9UU086Ci0gICAgICBzcGFyY19tZW1vcnlfbW9kZWwgPSBNTV9UU087Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BTTzoKLSAgICAgIHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1BTTzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUk1POgotICAgICAgc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fUk1POwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIHByaW50X3ZlcnNpb25faWQgKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1EnOgotICAgICAgLyogUXkgLSBkbyBlbWl0IC5jb21tZW50Ci0JIFFuIC0gZG8gbm90IGVtaXQgLmNvbW1lbnQgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgICAvKiB1c2UgLnN0YWIgaW5zdGVhZCBvZiAuc3RhYi5leGNsICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3EnOgotICAgICAgLyogcXVpY2sgLS0gbmF0aXZlIGFzc2VtYmxlciBkb2VzIGZld2VyIGNoZWNrcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdLJzoKLSAgICAgIGlmIChzdHJjbXAgKGFyZywgIlBJQyIpICE9IDApCi0JYXNfd2FybiAoXygiVW5yZWNvZ25pemVkIG9wdGlvbiBmb2xsb3dpbmcgLUsiKSk7Ci0gICAgICBlbHNlCi0Jc3BhcmNfcGljX2NvZGUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19VTkRFQ0xBUkVEX1JFR1M6Ci0gICAgICBub191bmRlY2xhcmVkX3JlZ3MgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9VTkRFQ0xBUkVEX1JFR1M6Ci0gICAgICBub191bmRlY2xhcmVkX3JlZ3MgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfYXJjaCAqYXJjaDsKLQotICAvKiBXZSBkb24ndCBnZXQgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBhbnl0aGluZyBiZWZvcmUgd2UncmUgY2FsbGVkLAotICAgICBzbyBoYW5kbGUgdGhhdCBub3cuICAqLwotICBpZiAoISBkZWZhdWx0X2luaXRfcCkKLSAgICBpbml0X2RlZmF1bHRfYXJjaCAoKTsKLQotICBmcHJpbnRmKHN0cmVhbSwgXygiU1BBUkMgb3B0aW9uczpcbiIpKTsKLSAgZm9yIChhcmNoID0gJnNwYXJjX2FyY2hfdGFibGVbMF07IGFyY2gtPm5hbWU7IGFyY2grKykKLSAgICB7Ci0gICAgICBpZiAoYXJjaCAhPSAmc3BhcmNfYXJjaF90YWJsZVswXSkKLQlmcHJpbnRmIChzdHJlYW0sICIgfCAiKTsKLSAgICAgIGlmIChhcmNoLT51c2VyX29wdGlvbl9wKQotCWZwcmludGYgKHN0cmVhbSwgIi1BJXMiLCBhcmNoLT5uYW1lKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXG4teGFyY2g9djhwbHVzIHwgLXhhcmNoPXY4cGx1c2FcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0JCQlzcGVjaWZ5IHZhcmlhbnQgb2YgU1BBUkMgYXJjaGl0ZWN0dXJlXG5cCi0tYnVtcAkJCXdhcm4gd2hlbiBhc3NlbWJsZXIgc3dpdGNoZXMgYXJjaGl0ZWN0dXJlc1xuXAotLXNwYXJjCQkJaWdub3JlZFxuXAotLS1lbmZvcmNlLWFsaWduZWQtZGF0YQlmb3JjZSAubG9uZywgZXRjLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHlcbiIpKTsKLSNpZmRlZiBPQkpfQU9VVAotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1rCQkJZ2VuZXJhdGUgUElDXG4iKSk7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLTMyCQkJY3JlYXRlIDMyIGJpdCBvYmplY3QgZmlsZVxuXAotLTY0CQkJY3JlYXRlIDY0IGJpdCBvYmplY3QgZmlsZVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLQkJCVtkZWZhdWx0IGlzICVkXVxuIiksIGRlZmF1bHRfYXJjaF9zaXplKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tVFNPCQkJdXNlIFRvdGFsIFN0b3JlIE9yZGVyaW5nXG5cCi0tUFNPCQkJdXNlIFBhcnRpYWwgU3RvcmUgT3JkZXJpbmdcblwKLS1STU8JCQl1c2UgUmVsYXhlZCBNZW1vcnkgT3JkZXJpbmdcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0JCQlbZGVmYXVsdCBpcyAlc11cbiIpLCAoZGVmYXVsdF9hcmNoX3NpemUgPT0gNjQpID8gIlJNTyIgOiAiVFNPIik7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLUtQSUMJCQlnZW5lcmF0ZSBQSUNcblwKLS1WCQkJcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG5cCi0tdW5kZWNsYXJlZC1yZWdzCWlnbm9yZSBhcHBsaWNhdGlvbiBnbG9iYWwgcmVnaXN0ZXIgdXNhZ2Ugd2l0aG91dFxuXAotCQkJYXBwcm9wcmlhdGUgLnJlZ2lzdGVyIGRpcmVjdGl2ZSAoZGVmYXVsdClcblwKLS1uby11bmRlY2xhcmVkLXJlZ3MJZm9yY2UgZXJyb3Igb24gYXBwbGljYXRpb24gZ2xvYmFsIHJlZ2lzdGVyIHVzYWdlXG5cCi0JCQl3aXRob3V0IGFwcHJvcHJpYXRlIC5yZWdpc3RlciBkaXJlY3RpdmVcblwKLS1xCQkJaWdub3JlZFxuXAotLVF5LCAtUW4JCWlnbm9yZWRcblwKLS1zCQkJaWdub3JlZFxuIikpOwotI2VuZGlmCi0jaWZkZWYgU1BBUkNfQklFTkRJQU4KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tRUwJCQlnZW5lcmF0ZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZVxuXAotLUVCCQkJZ2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcblwKLS0tbGl0dGxlLWVuZGlhbi1kYXRhCWdlbmVyYXRlIGNvZGUgZm9yIGEgbWFjaGluZSBoYXZpbmcgYmlnIGVuZGlhblxuXAotICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFuZCBsaXR0bGUgZW5kaWFuIGRhdGEuIikpOwotI2VuZGlmCi19Ci0MCi0vKiBuYXRpdmUgb3BlcmFuZCBzaXplIG9wY29kZSB0cmFuc2xhdGlvbiAqLwotc3RydWN0Ci0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGNoYXIgKm5hbWUzMjsKLSAgICBjaGFyICpuYW1lNjQ7Ci0gIH0gbmF0aXZlX29wX3RhYmxlW10gPQotewotICB7ImxkbiIsICJsZCIsICJsZHgifSwKLSAgeyJsZG5hIiwgImxkYSIsICJsZHhhIn0sCi0gIHsic3RuIiwgInN0IiwgInN0eCJ9LAotICB7InN0bmEiLCAic3RhIiwgInN0eGEifSwKLSAgeyJzbGxuIiwgInNsbCIsICJzbGx4In0sCi0gIHsic3JsbiIsICJzcmwiLCAic3JseCJ9LAotICB7InNyYW4iLCAic3JhIiwgInNyYXgifSwKLSAgeyJjYXNuIiwgImNhcyIsICJjYXN4In0sCi0gIHsiY2FzbmEiLCAiY2FzYSIsICJjYXN4YSJ9LAotICB7ImNscm4iLCAiY2xyIiwgImNscngifSwKLSAge05VTEwsIE5VTEwsIE5VTEx9LAotfTsKLQwKLS8qIHNwYXJjNjQgcHJpdmlsZWRnZWQgcmVnaXN0ZXJzICovCi0KLXN0cnVjdCBwcml2X3JlZ19lbnRyeQotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgcmVnbnVtOwotICB9OwotCi1zdHJ1Y3QgcHJpdl9yZWdfZW50cnkgcHJpdl9yZWdfdGFibGVbXSA9Ci17Ci0gIHsidHBjIiwgMH0sCi0gIHsidG5wYyIsIDF9LAotICB7InRzdGF0ZSIsIDJ9LAotICB7InR0IiwgM30sCi0gIHsidGljayIsIDR9LAotICB7InRiYSIsIDV9LAotICB7InBzdGF0ZSIsIDZ9LAotICB7InRsIiwgN30sCi0gIHsicGlsIiwgOH0sCi0gIHsiY3dwIiwgOX0sCi0gIHsiY2Fuc2F2ZSIsIDEwfSwKLSAgeyJjYW5yZXN0b3JlIiwgMTF9LAotICB7ImNsZWFud2luIiwgMTJ9LAotICB7Im90aGVyd2luIiwgMTN9LAotICB7IndzdGF0ZSIsIDE0fSwKLSAgeyJmcSIsIDE1fSwKLSAgeyJ2ZXIiLCAzMX0sCi0gIHsiIiwgLTF9LAkJCS8qIGVuZCBtYXJrZXIgKi8KLX07Ci0KLS8qIHY5YSBzcGVjaWZpYyBhc3JzICovCi0KLXN0cnVjdCBwcml2X3JlZ19lbnRyeSB2OWFfYXNyX3RhYmxlW10gPQotewotICB7InRpY2tfY21wciIsIDIzfSwKLSAgeyJzb2Z0aW50IiwgMjJ9LAotICB7InNldF9zb2Z0aW50IiwgMjB9LAotICB7InBpYyIsIDE3fSwKLSAgeyJwY3IiLCAxNn0sCi0gIHsiZ3NyIiwgMTl9LAotICB7ImRjciIsIDE4fSwKLSAgeyJjbGVhcl9zb2Z0aW50IiwgMjF9LAotICB7IiIsIC0xfSwJCQkvKiBlbmQgbWFya2VyICovCi19OwotCi1zdGF0aWMgaW50Ci1jbXBfcmVnX2VudHJ5IChwYXJnLCBxYXJnKQotICAgICBjb25zdCBQVFIgcGFyZzsKLSAgICAgY29uc3QgUFRSIHFhcmc7Ci17Ci0gIGNvbnN0IHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqcCA9IChjb25zdCBzdHJ1Y3QgcHJpdl9yZWdfZW50cnkgKikgcGFyZzsKLSAgY29uc3Qgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpxID0gKGNvbnN0IHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqKSBxYXJnOwotCi0gIHJldHVybiBzdHJjbXAgKHEtPm5hbWUsIHAtPm5hbWUpOwotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIGludCBsb3NlID0gMDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSBtZF9wYXJzZV9vcHRpb24KLSAgICAgaXMgY2FsbGVkLCBhbmQgaXQgbWF5IG5vdCBiZSBjYWxsZWQsIHNvIGhhbmRsZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uCi0gICAgIG5vdyBpZiBub3QgYWxyZWFkeSBkb25lLiAgKi8KLSAgaWYgKCEgZGVmYXVsdF9pbml0X3ApCi0gICAgaW5pdF9kZWZhdWx0X2FyY2ggKCk7Ci0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIHdoaWxlIChpIDwgKHVuc2lnbmVkIGludCkgc3BhcmNfbnVtX29wY29kZXMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHNwYXJjX29wY29kZXNbaV0ubmFtZTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAoUFRSKSAmc3BhcmNfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgYXNfYmFkIChfKCJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiksCi0JCSAgc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgICAgZG8KLQl7Ci0JICBpZiAoc3BhcmNfb3Bjb2Rlc1tpXS5tYXRjaCAmIHNwYXJjX29wY29kZXNbaV0ubG9zZSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iKSwKLQkJICAgICAgc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCBzcGFyY19vcGNvZGVzW2ldLmFyZ3MpOwotCSAgICAgIGxvc2UgPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGkgPCAodW5zaWduZWQgaW50KSBzcGFyY19udW1fb3Bjb2RlcwotCSAgICAgJiYgIXN0cmNtcCAoc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IG5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLSAgICAgIGNoYXIgKm5hbWUgPSBzcGFyY19hcmNoX3NpemUgPT0gMzIgPyBuYXRpdmVfb3BfdGFibGVbaV0ubmFtZTMyIDoKLQkJCW5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lNjQ7Ci0gICAgICBpbnNuID0gKHN0cnVjdCBzcGFyY19vcGNvZGUgKiloYXNoX2ZpbmQgKG9wX2hhc2gsIG5hbWUpOwotICAgICAgaWYgKGluc24gPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgZXJyb3I6IGNhbid0IGZpbmQgb3Bjb2RlIGAlcycgZm9yIGAlcydcbiIpLAotICAgICAgICAgIAkgIG5hbWUsIG5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lKTsKLSAgICAgICAgICBsb3NlID0gMTsKLSAgICAgICAgfQotICAgICAgZWxzZQotCXsKLQkgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYXRpdmVfb3BfdGFibGVbaV0ubmFtZSwgKFBUUikgaW5zbik7Ci0JICBpZiAocmV0dmFsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKLQkJICAgICAgc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgICAgIGxvc2UgPSAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgcXNvcnQgKHByaXZfcmVnX3RhYmxlLCBzaXplb2YgKHByaXZfcmVnX3RhYmxlKSAvIHNpemVvZiAocHJpdl9yZWdfdGFibGVbMF0pLAotCSBzaXplb2YgKHByaXZfcmVnX3RhYmxlWzBdKSwgY21wX3JlZ19lbnRyeSk7Ci0KLSAgLyogSWYgLWJ1bXAsIHJlY29yZCB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsIGF0IHdoaWNoIHdlIHN0YXJ0IGlzc3VpbmcKLSAgICAgd2FybmluZ3MuICBUaGUgYmVoYXZpb3VyIGlzIGRpZmZlcmVudCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIGFuCi0gICAgIGFyY2hpdGVjdHVyZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuICBJZiBpdCB3YXNuJ3QsIHdlIGlzc3VlIHdhcm5pbmdzCi0gICAgIGZvciBhbGwgdXB3YXJkcyBidW1wcy4gIElmIGl0IHdhcywgd2UgZG9uJ3Qgc3RhcnQgaXNzdWluZyB3YXJuaW5ncyB1bnRpbAotICAgICB3ZSBuZWVkIHRvIGJ1bXAgYmV5b25kIHRoZSByZXF1ZXN0ZWQgYXJjaGl0ZWN0dXJlIG9yIHdoZW4gd2UgYnVtcCBiZXR3ZWVuCi0gICAgIGNvbmZsaWN0aW5nIGFyY2hpdGVjdHVyZXMuICAqLwotCi0gIGlmICh3YXJuX29uX2J1bXAKLSAgICAgICYmIGFyY2hpdGVjdHVyZV9yZXF1ZXN0ZWQpCi0gICAgewotICAgICAgLyogYG1heF9hcmNoaXRlY3R1cmUnIHJlY29yZHMgdGhlIHJlcXVlc3RlZCBhcmNoaXRlY3R1cmUuCi0JIElzc3VlIHdhcm5pbmdzIGlmIHdlIGdvIGFib3ZlIGl0LiAgKi8KLSAgICAgIHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlID0gbWF4X2FyY2hpdGVjdHVyZTsKLQotICAgICAgLyogRmluZCB0aGUgaGlnaGVzdCBhcmNoaXRlY3R1cmUgbGV2ZWwgdGhhdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGgKLQkgdGhlIHJlcXVlc3RlZCBvbmUuICAqLwotICAgICAgZm9yIChtYXhfYXJjaGl0ZWN0dXJlID0gU1BBUkNfT1BDT0RFX0FSQ0hfTUFYOwotCSAgIG1heF9hcmNoaXRlY3R1cmUgPiB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZTsKLQkgICAtLW1heF9hcmNoaXRlY3R1cmUpCi0JaWYgKCEgU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1AgKG1heF9hcmNoaXRlY3R1cmUsCi0JCQkJICAgICAgIHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlKSkKLQkgIGJyZWFrOwotICAgIH0KLX0KLQotLyogQ2FsbGVkIGFmdGVyIGFsbCBhc3NlbWJseSBoYXMgYmVlbiBkb25lLiAgKi8KLQotdm9pZAotc3BhcmNfbWRfZW5kICgpCi17Ci0gIGlmIChzcGFyY19hcmNoX3NpemUgPT0gNjQpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfdjlhKTsKLSAgICAgIGVsc2UKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfdjkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfdjhwbHVzKTsKLSAgICAgIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSk7Ci0gICAgICBlbHNlIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpOwotICAgICAgZWxzZSBpZiAoZGVmYXVsdF9hcmNoX3R5cGUgPT0gc3BhcmM4NnggJiYgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgc3BhcmNsaXRlIGlzIHRyZWF0ZWQgbGlrZSBhIG5vcm1hbCBzcGFyYy4gIFBlcmhhcHMgaXQgc2hvdWxkbid0Ci0JICAgICBiZSBidXQgZm9yIG5vdyBpdCBpcyAoc2luY2UgdGhhdCdzIHRoZSB3YXkgaXQncyBhbHdheXMgYmVlbgotCSAgICAgdHJlYXRlZCkuICAqLwotCSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjKTsKLQl9Ci0gICAgfQotfQotDAotLyogUmV0dXJuIG5vbi16ZXJvIGlmIFZBTCBpcyBpbiB0aGUgcmFuZ2UgLShNQVgrMSkgdG8gTUFYLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWluX3NpZ25lZF9yYW5nZSAodmFsLCBtYXgpCi0gICAgIGJmZF9zaWduZWRfdm1hIHZhbCwgbWF4OwotewotICBpZiAobWF4IDw9IDApCi0gICAgYWJvcnQgKCk7Ci0gIC8qIFNpZ24tZXh0ZW5kIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcmNoaXRlY3R1cmUgd29yZCBzaXplLCBzbyB0aGF0Ci0gICAgIDB4ZmZmZmZmZmYgaXMgYWx3YXlzIGNvbnNpZGVyZWQgLTEgb24gc3BhcmMzMi4gICovCi0gIGlmIChzcGFyY19hcmNoX3NpemUgPT0gMzIpCi0gICAgewotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbiA9IChiZmRfc2lnbmVkX3ZtYSkxIDw8IDMxOwotICAgICAgdmFsID0gKCh2YWwgJiAweGZmZmZmZmZmKSBeIHNpZ24pIC0gc2lnbjsKLSAgICB9Ci0gIGlmICh2YWwgPiBtYXgpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICh2YWwgPCB+bWF4KQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIFZBTCBpcyBpbiB0aGUgcmFuZ2UgMCB0byBNQVguICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotaW5fdW5zaWduZWRfcmFuZ2UgKHZhbCwgbWF4KQotICAgICBiZmRfdm1hIHZhbCwgbWF4OwotewotICBpZiAodmFsID4gbWF4KQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIFZBTCBpcyBpbiB0aGUgcmFuZ2UgLShNQVgvMisxKSB0byBNQVguCi0gICAoZS5nLiAtMTUgdG8gKzMxKS4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1pbl9iaXRmaWVsZF9yYW5nZSAodmFsLCBtYXgpCi0gICAgIGJmZF9zaWduZWRfdm1hIHZhbCwgbWF4OwotewotICBpZiAobWF4IDw9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmICh2YWwgPiBtYXgpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICh2YWwgPCB+KG1heCA+PiAxKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXNwYXJjX2ZmcyAobWFzaykKLSAgICAgdW5zaWduZWQgaW50IG1hc2s7Ci17Ci0gIGludCBpOwotCi0gIGlmIChtYXNrID09IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoaSA9IDA7IChtYXNrICYgMSkgPT0gMDsgKytpKQotICAgIG1hc2sgPj49IDE7Ci0gIHJldHVybiBpOwotfQotCi0vKiBJbXBsZW1lbnQgYmlnIHNoaWZ0IHJpZ2h0LiAgKi8KLXN0YXRpYyBiZmRfdm1hCi1CU1IgKHZhbCwgYW1vdW50KQotICAgICBiZmRfdm1hIHZhbDsKLSAgICAgaW50IGFtb3VudDsKLXsKLSAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPD0gNCAmJiBhbW91bnQgPj0gMzIpCi0gICAgYXNfZmF0YWwgKF8oIlN1cHBvcnQgZm9yIDY0LWJpdCBhcml0aG1ldGljIG5vdCBjb21waWxlZCBpbi4iKSk7Ci0gIHJldHVybiB2YWwgPj4gYW1vdW50OwotfQotDAotLyogRm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBzcGFyY19pcCBhbmQgZ2V0X2V4cHJlc3Npb24uICAqLwotc3RhdGljIGNoYXIgKmV4cHJfZW5kOwotCi0vKiBWYWx1ZXMgZm9yIGBzcGVjaWFsX2Nhc2UnLgotICAgSW5zdHJ1Y3Rpb25zIHRoYXQgcmVxdWlyZSB3aWVyZCBoYW5kbGluZyBiZWNhdXNlIHRoZXkncmUgbG9uZ2VyIHRoYW4KLSAgIDQgYnl0ZXMuICAqLwotI2RlZmluZSBTUEVDSUFMX0NBU0VfTk9ORQkwCi0jZGVmaW5lCVNQRUNJQUxfQ0FTRV9TRVQJMQotI2RlZmluZSBTUEVDSUFMX0NBU0VfU0VUU1cJMgotI2RlZmluZSBTUEVDSUFMX0NBU0VfU0VUWAkzCi0vKiBGSVhNRTogc3BhcmMtb3BjLmMgZG9lc24ndCBoYXZlIG5lY2Vzc2FyeSAiUyIgdHJpZ2dlciB0byBlbmFibGUgdGhpcy4gICovCi0jZGVmaW5lCVNQRUNJQUxfQ0FTRV9GRElWCTQKLQotLyogQml0IG1hc2tzIG9mIHZhcmlvdXMgaW5zbnMuICAqLwotI2RlZmluZSBOT1BfSU5TTiAweDAxMDAwMDAwCi0jZGVmaW5lIE9SX0lOU04gMHg4MDEwMDAwMAotI2RlZmluZSBYT1JfSU5TTiAweDgwMTgwMDAwCi0jZGVmaW5lIEZNT1ZTX0lOU04gMHg4MUEwMDAyMAotI2RlZmluZSBTRVRISV9JTlNOIDB4MDEwMDAwMDAKLSNkZWZpbmUgU0xMWF9JTlNOIDB4ODEyODEwMDAKLSNkZWZpbmUgU1JBX0lOU04gMHg4MTM4MDAwMAotCi0vKiBUaGUgbGFzdCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKmxhc3RfaW5zbjsKLS8qIFRoZSBhc3NlbWJsZWQgb3Bjb2RlIG9mIGBsYXN0X2luc24nLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Rfb3Bjb2RlOwotDAotLyogSGFuZGxlIHRoZSBzZXQgYW5kIHNldHV3IHN5bnRoZXRpYyBpbnN0cnVjdGlvbnMuICAqLwotc3RhdGljIHZvaWQKLXN5bnRoZXRpemVfc2V0dXcgKGluc24pCi0gICAgIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKmluc247Ci17Ci0gIGludCBuZWVkX2hpMjJfcCA9IDA7Ci0gIGludCByZCA9ICh0aGVfaW5zbi5vcGNvZGUgJiBSRCAofjApKSA+PiAyNTsKLQotICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpZiAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkpCi0JewotCSAgaWYgKHNpemVvZihvZmZzZXRUKSA+IDQKLQkgICAgICAmJiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8IDAKLQkJICB8fCB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpKQotCSAgICBhc193YXJuIChfKCJzZXQ6IG51bWJlciBub3QgaW4gMC4uNDI5NDk2NzI5NSByYW5nZSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHNpemVvZihvZmZzZXRUKSA+IDQKLQkgICAgICAmJiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8IC0ob2Zmc2V0VCkgMHg4MDAwMDAwMAotCQkgIHx8IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPiAob2Zmc2V0VCkgMHhmZmZmZmZmZikpCi0JICAgIGFzX3dhcm4gKF8oInNldDogbnVtYmVyIG5vdCBpbiAtMjE0NzQ4MzY0OC4uNDI5NDk2NzI5NSByYW5nZSIpKTsKLQkgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPSAoaW50KXRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7Ci0JfQotICAgIH0KLQotICAvKiBTZWUgaWYgb3BlcmFuZCBpcyBhYnNvbHV0ZSBhbmQgc21hbGw7IHNraXAgc2V0aGkgaWYgc28uICAqLwotICBpZiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAoMSA8PCAxMikKLSAgICAgIHx8IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAtKDEgPDwgMTIpKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTRVRISV9JTlNOIHwgUkQgKHJkKQotCQkJIHwgKCh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID4+IDEwKQotCQkJICAgICYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQgPyAweDNmZmZmZiA6IDApKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9ICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQk/IEJGRF9SRUxPQ19ISTIyCi0JCQk6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgICAgbmVlZF9oaTIyX3AgPSAxOwotICAgIH0KLQotICAvKiBTZWUgaWYgb3BlcmFuZCBoYXMgbm8gbG93LW9yZGVyIGJpdHM7IHNraXAgT1IgaWYgc28uICAqLwotICBpZiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgKG5lZWRfaGkyMl9wICYmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICYgMHgzRkYpICE9IDApCi0gICAgICB8fCAhIG5lZWRfaGkyMl9wKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOIHwgKG5lZWRfaGkyMl9wID8gUlMxIChyZCkgOiAwKQotCQkJIHwgUkQgKHJkKSB8IElNTUVECi0JCQkgfCAodGhlX2luc24uZXhwLlhfYWRkX251bWJlcgotCQkJICAgICYgKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQgPyAwIDoKLQkJCSAgICAgICBuZWVkX2hpMjJfcCA/IDB4M2ZmIDogMHgxZmZmKSkpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJPyBCRkRfUkVMT0NfTE8xMAotCQkJOiBCRkRfUkVMT0NfTk9ORSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci19Ci0gICAgCi0vKiBIYW5kbGUgdGhlIHNldHN3IHN5bnRoZXRpYyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotc3ludGhldGl6ZV9zZXRzdyAoaW5zbikKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLXsKLSAgaW50IGxvdzMyLCByZCwgb3BjOwotCi0gIHJkID0gKHRoZV9pbnNuLm9wY29kZSAmIFJEICh+MCkpID4+IDI1OwotCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIHN5bnRoZXRpemVfc2V0dXcgKGluc24pOwotCi0gICAgICAvKiBOZWVkIHRvIHNpZ24gZXh0ZW5kIGl0LiAgKi8KLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTUkFfSU5TTiB8IFJTMSAocmQpIHwgUkQgKHJkKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzaXplb2Yob2Zmc2V0VCkgPiA0Ci0gICAgICAmJiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8IC0ob2Zmc2V0VCkgMHg4MDAwMDAwMAotCSAgfHwgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+IChvZmZzZXRUKSAweGZmZmZmZmZmKSkKLSAgICBhc193YXJuIChfKCJzZXRzdzogbnVtYmVyIG5vdCBpbiAtMjE0NzQ4MzY0OC4uNDI5NDk2NzI5NSByYW5nZSIpKTsKLQotICBsb3czMiA9IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7CQotCSAgICAgIAotICBpZiAobG93MzIgPj0gMCkKLSAgICB7Ci0gICAgICBzeW50aGV0aXplX3NldHV3IChpbnNuKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgb3BjID0gT1JfSU5TTjsKLSAgICAKLSAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgLyogU2VlIGlmIG9wZXJhbmQgaXMgYWJzb2x1dGUgYW5kIHNtYWxsOyBza2lwIHNldGhpIGlmIHNvLiAgKi8KLSAgaWYgKGxvdzMyIDwgLSgxIDw8IDEyKSkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0VUSElfSU5TTiB8IFJEIChyZCkKLQkJCSB8ICgoKH50aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyKSA+PiAxMCkgJiAweDNmZmZmZikpOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgICBsb3czMiA9IDB4MWMwMCB8IChsb3czMiAmIDB4M2ZmKTsKLSAgICAgIG9wYyA9IFJTMSAocmQpIHwgWE9SX0lOU047Ci0gICAgfQotCi0gIHRoZV9pbnNuLm9wY29kZSA9IChvcGMgfCBSRCAocmQpIHwgSU1NRUQKLQkJICAgICB8IChsb3czMiAmIDB4MWZmZikpOwotICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLX0KLQotLyogSGFuZGxlIHRoZSBzZXRzdyBzeW50aGV0aWMgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHZvaWQKLXN5bnRoZXRpemVfc2V0eCAoaW5zbikKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLXsKLSAgaW50IHVwcGVyMzIsIGxvd2VyMzI7Ci0gIGludCB0bXByZWcgPSAodGhlX2luc24ub3Bjb2RlICYgUlMxICh+MCkpID4+IDE0OwotICBpbnQgZHN0cmVnID0gKHRoZV9pbnNuLm9wY29kZSAmIFJEICh+MCkpID4+IDI1OwotICBpbnQgdXBwZXJfZHN0cmVnOwotICBpbnQgbmVlZF9oaDIyX3AgPSAwLCBuZWVkX2htMTBfcCA9IDAsIG5lZWRfaGkyMl9wID0gMCwgbmVlZF9sbzEwX3AgPSAwOwotICBpbnQgbmVlZF94b3IxMF9wID0gMDsKLSAgICAKLSNkZWZpbmUgU0lHTkVYVDMyKHgpICgoKCh4KSAmIDB4ZmZmZmZmZmYpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotICBsb3dlcjMyID0gU0lHTkVYVDMyICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyKTsKLSAgdXBwZXIzMiA9IFNJR05FWFQzMiAoQlNSICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyLCAzMikpOwotI3VuZGVmIFNJR05FWFQzMgotCi0gIHVwcGVyX2RzdHJlZyA9IHRtcHJlZzsKLSAgLyogVGhlIHRtcCByZWcgc2hvdWxkIG5vdCBiZSB0aGUgZHN0IHJlZy4gICovCi0gIGlmICh0bXByZWcgPT0gZHN0cmVnKQotICAgIGFzX3dhcm4gKF8oInNldHg6IHRlbXBvcmFyeSByZWdpc3RlciBzYW1lIGFzIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIikpOwotCi0gIC8qID8/PyBPYnZpb3VzbHkgdGhlcmUgYXJlIG90aGVyIG9wdGltaXphdGlvbnMgd2UgY2FuIGRvCi0gICAgIChlLmcuIHNldGhpK3NoaWZ0IGZvciAweDFmMDAwMDAwMCkgYW5kIHBlcmhhcHMgd2Ugc2hvdWxkbid0IGJlCi0gICAgIGRvaW5nIHNvbWUgb2YgdGhlc2UuICBMYXRlci4gIElmIHlvdSBkbyBjaGFuZ2UgdGhpbmdzLCB0cnkgdG8KLSAgICAgY2hhbmdlIGFsbCBvZiB0aGlzIHRvIGJlIHRhYmxlIGRyaXZlbiBhcyB3ZWxsLiAgKi8KLSAgLyogV2hhdCB0byBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIGlmIGl0J3MgY29uc3RhbnQuCi0gICAgIENvbXB1dGUgdGhhdCBmaXJzdCwgdGhlbiBvdXRwdXQgd2hhdCB3ZSd2ZSBkZWNpZGVkIHVwb24uICAqLwotICBpZiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDMyKQotCXsKLQkgIC8qIFdoZW4gYXJjaCBzaXplIGlzIDMyLCB3ZSB3YW50IHNldHggdG8gYmUgZXF1aXZhbGVudAotCSAgICAgdG8gc2V0dXcgZm9yIGFueXRoaW5nIGJ1dCBjb25zdGFudHMuICAqLwotCSAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciAmPSAweGZmZmZmZmZmOwotCSAgc3ludGhldGl6ZV9zZXR1dyAoaW5zbik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbmVlZF9oaDIyX3AgPSBuZWVkX2htMTBfcCA9IG5lZWRfaGkyMl9wID0gbmVlZF9sbzEwX3AgPSAxOwotICAgICAgbG93ZXIzMiA9IDA7IHVwcGVyMzIgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFJlc2V0IFhfYWRkX251bWJlciwgd2UndmUgZXh0cmFjdGVkIGl0IGFzIHVwcGVyMzIvbG93ZXIzMi4KLQkgT3RoZXJ3aXNlIGZpeHVwX3NlZ21lbnQgd2lsbCBjb21wbGFpbiBhYm91dCBub3QgYmVpbmcgYWJsZSB0bwotCSB3cml0ZSBhbiA4IGJ5dGUgbnVtYmVyIGluIGEgNCBieXRlIGZpZWxkLiAgKi8KLSAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgIAotICAgICAgLyogT25seSBuZWVkIGhoMjIgaWYgYG9yJyBpbnNuIGNhbid0IGhhbmRsZSBjb25zdGFudC4gICovCi0gICAgICBpZiAodXBwZXIzMiA8IC0oMSA8PCAxMikgfHwgdXBwZXIzMiA+PSAoMSA8PCAxMikpCi0JbmVlZF9oaDIyX3AgPSAxOwotICAgIAotICAgICAgLyogRG9lcyBib3R0b20gcGFydCAoYWZ0ZXIgc2V0aGkpIGhhdmUgYml0cz8gICovCi0gICAgICBpZiAoKG5lZWRfaGgyMl9wICYmICh1cHBlcjMyICYgMHgzZmYpICE9IDApCi0JICAvKiBObyBoaDIyLCBidXQgZG9lcyB1cHBlcjMyIHN0aWxsIGhhdmUgYml0cyB3ZSBjYW4ndCBzZXQKLQkgICAgIGZyb20gbG93ZXIzMj8gICovCi0JICB8fCAoISBuZWVkX2hoMjJfcCAmJiB1cHBlcjMyICE9IDAgJiYgdXBwZXIzMiAhPSAtMSkpCi0JbmVlZF9obTEwX3AgPSAxOwotICAgIAotICAgICAgLyogSWYgdGhlIGxvd2VyIGhhbGYgaXMgYWxsIHplcm8sIHdlIGJ1aWxkIHRoZSB1cHBlciBoYWxmIGRpcmVjdGx5Ci0JIGludG8gdGhlIGRzdCByZWcuICAqLwotICAgICAgaWYgKGxvd2VyMzIgIT0gMAotCSAgLyogTmVlZCBsb3dlciBoYWxmIGlmIG51bWJlciBpcyB6ZXJvIG9yIDB4ZmZmZmZmZmYwMDAwMDAwMC4gICovCi0JICB8fCAoISBuZWVkX2hoMjJfcCAmJiAhIG5lZWRfaG0xMF9wKSkKLQl7Ci0JICAvKiBObyBuZWVkIGZvciBzZXRoaSBpZiBgb3InIGluc24gY2FuIGhhbmRsZSBjb25zdGFudC4gICovCi0JICBpZiAobG93ZXIzMiA8IC0oMSA8PCAxMikgfHwgbG93ZXIzMiA+PSAoMSA8PCAxMikKLQkgICAgICAvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgdXNlIGEgbmVnYXRpdmUgY29uc3RhbnQgaW4gdGhlIGBvcicKLQkJIGluc24gdW5sZXNzIHRoZSB1cHBlciAzMiBiaXRzIGFyZSBhbGwgb25lcy4gICovCi0JICAgICAgfHwgKGxvd2VyMzIgPCAwICYmIHVwcGVyMzIgIT0gLTEpCi0JICAgICAgfHwgKGxvd2VyMzIgPj0gMCAmJiB1cHBlcjMyID09IC0xKSkKLQkgICAgbmVlZF9oaTIyX3AgPSAxOwotCQkgICAgICAKLQkgIGlmIChuZWVkX2hpMjJfcCAmJiB1cHBlcjMyID09IC0xKQotCSAgICBuZWVkX3hvcjEwX3AgPSAxOwotCi0JICAvKiBEb2VzIGJvdHRvbSBwYXJ0IChhZnRlciBzZXRoaSkgaGF2ZSBiaXRzPyAgKi8KLQkgIGVsc2UgaWYgKChuZWVkX2hpMjJfcCAmJiAobG93ZXIzMiAmIDB4M2ZmKSAhPSAwKQotCQkgICAvKiBObyBzZXRoaS4gICovCi0JCSAgIHx8ICghIG5lZWRfaGkyMl9wICYmIChsb3dlcjMyICYgMHgxZmZmKSAhPSAwKQotCQkgICAvKiBOZWVkIGBvcicgaWYgd2UgZGlkbid0IHNldCBhbnl0aGluZyBlbHNlLiAgKi8KLQkJICAgfHwgKCEgbmVlZF9oaTIyX3AgJiYgISBuZWVkX2hoMjJfcCAmJiAhIG5lZWRfaG0xMF9wKSkKLQkgICAgbmVlZF9sbzEwX3AgPSAxOwotCX0KLSAgICAgIGVsc2UKLQkvKiBPdXRwdXQgZGlyZWN0bHkgdG8gZHN0IHJlZyBpZiBsb3dlciAzMiBiaXRzIGFyZSBhbGwgemVyby4gICovCi0JdXBwZXJfZHN0cmVnID0gZHN0cmVnOwotICAgIH0KLSAgICAKLSAgaWYgKCF1cHBlcl9kc3RyZWcgJiYgZHN0cmVnKQotICAgIGFzX3dhcm4gKF8oInNldHg6IGlsbGVnYWwgdGVtcG9yYXJ5IHJlZ2lzdGVyIGcwIikpOwotCi0gIGlmIChuZWVkX2hoMjJfcCkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0VUSElfSU5TTiB8IFJEICh1cHBlcl9kc3RyZWcpCi0JCQkgfCAoKHVwcGVyMzIgPj4gMTApICYgMHgzZmZmZmYpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCT8gQkZEX1JFTE9DX1NQQVJDX0hIMjIgOiBCRkRfUkVMT0NfTk9ORSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci0gICAgCi0gIGlmIChuZWVkX2hpMjJfcCkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0VUSElfSU5TTiB8IFJEIChkc3RyZWcpCi0JCQkgfCAoKChuZWVkX3hvcjEwX3AgPyB+bG93ZXIzMiA6IGxvd2VyMzIpCi0JCQkgICAgPj4gMTApICYgMHgzZmZmZmYpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCT8gQkZEX1JFTE9DX1NQQVJDX0xNMjIgOiBCRkRfUkVMT0NfTk9ORSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci0KLSAgaWYgKG5lZWRfaG0xMF9wKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOCi0JCQkgfCAobmVlZF9oaDIyX3AgPyBSUzEgKHVwcGVyX2RzdHJlZykgOiAwKQotCQkJIHwgUkQgKHVwcGVyX2RzdHJlZykKLQkJCSB8IElNTUVECi0JCQkgfCAodXBwZXIzMiAmIChuZWVkX2hoMjJfcCA/IDB4M2ZmIDogMHgxZmZmKSkpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJPyBCRkRfUkVMT0NfU1BBUkNfSE0xMCA6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLSAgICAKLSAgaWYgKG5lZWRfbG8xMF9wKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBPbmUgbmljZSBvcHRpbWl6YXRpb24gdG8gZG8gaGVyZSBpcyB0byBPUiB0aGUgbG93IHBhcnQKLQkgd2l0aCB0aGUgaGlnaHBhcnQgaWYgaGkyMiBpc24ndCBuZWVkZWQgYW5kIHRoZSBsb3cgcGFydCBpcwotCSBwb3NpdGl2ZS4gICovCi0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoT1JfSU5TTiB8IChuZWVkX2hpMjJfcCA/IFJTMSAoZHN0cmVnKSA6IDApCi0JCQkgfCBSRCAoZHN0cmVnKQotCQkJIHwgSU1NRUQKLQkJCSB8IChsb3dlcjMyICYgKG5lZWRfaGkyMl9wID8gMHgzZmYgOiAweDFmZmYpKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9ICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQk/IEJGRF9SRUxPQ19MTzEwIDogQkZEX1JFTE9DX05PTkUpOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgfQotICAgIAotICAvKiBJZiB3ZSBuZWVkZWQgdG8gYnVpbGQgdGhlIHVwcGVyIHBhcnQsIHNoaWZ0IGl0IGludG8gcGxhY2UuICAqLwotICBpZiAobmVlZF9oaDIyX3AgfHwgbmVlZF9obTEwX3ApCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKFNMTFhfSU5TTiB8IFJTMSAodXBwZXJfZHN0cmVnKSB8IFJEICh1cHBlcl9kc3RyZWcpCi0JCQkgfCBJTU1FRCB8IDMyKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci0gICAgCi0gIC8qIFRvIGdldCAtMSBpbiB1cHBlcjMyLCB3ZSBkbyBzZXRoaSAlaGkofngpLCByOyB4b3IgciwgLTB4NDAwIHwgeCwgci4gICovCi0gIGlmIChuZWVkX3hvcjEwX3ApCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKFhPUl9JTlNOIHwgUlMxIChkc3RyZWcpIHwgUkQgKGRzdHJlZykgfCBJTU1FRAotCQkJIHwgMHgxYzAwIHwgKGxvd2VyMzIgJiAweDNmZikpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLQotICAvKiBJZiB3ZSBuZWVkZWQgdG8gYnVpbGQgYm90aCB1cHBlciBhbmQgbG93ZXIgcGFydHMsIE9SIHRoZW0gdG9nZXRoZXIuICAqLwotICBlbHNlIGlmICgobmVlZF9oaDIyX3AgfHwgbmVlZF9obTEwX3ApICYmIChuZWVkX2hpMjJfcCB8fCBuZWVkX2xvMTBfcCkpCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKE9SX0lOU04gfCBSUzEgKGRzdHJlZykgfCBSUzIgKHVwcGVyX2RzdHJlZykKLQkJCSB8IFJEIChkc3RyZWcpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci19Ci0MCi0vKiBNYWluIGVudHJ5IHBvaW50IHRvIGFzc2VtYmxlIG9uZSBpbnN0cnVjdGlvbi4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLSAgaW50IHNwZWNpYWxfY2FzZTsKLQotICBrbm93IChzdHIpOwotICBzcGVjaWFsX2Nhc2UgPSBzcGFyY19pcCAoc3RyLCAmaW5zbik7Ci0KLSAgLyogV2Ugd2FybiBhYm91dCBhdHRlbXB0cyB0byBwdXQgYSBmbG9hdGluZyBwb2ludCBicmFuY2ggaW4gYSBkZWxheSBzbG90LAotICAgICB1bmxlc3MgdGhlIGRlbGF5IHNsb3QgaGFzIGJlZW4gYW5udWxsZWQuICAqLwotICBpZiAoaW5zbiAhPSBOVUxMCi0gICAgICAmJiBsYXN0X2luc24gIT0gTlVMTAotICAgICAgJiYgKGluc24tPmZsYWdzICYgRl9GQlIpICE9IDAKLSAgICAgICYmIChsYXN0X2luc24tPmZsYWdzICYgRl9ERUxBWUVEKSAhPSAwCi0gICAgICAvKiA/Pz8gVGhpcyB0ZXN0IGlzbid0IGNvbXBsZXRlbHkgYWNjdXJhdGUuICBXZSBhc3N1bWUgYW55dGhpbmcgd2l0aAotCSBGX3tVTkJSLENPTkRCUixGQlJ9IHNldCBpcyBhbm51bGxhYmxlLiAgKi8KLSAgICAgICYmICgobGFzdF9pbnNuLT5mbGFncyAmIChGX1VOQlIgfCBGX0NPTkRCUiB8IEZfRkJSKSkgPT0gMAotCSAgfHwgKGxhc3Rfb3Bjb2RlICYgQU5OVUwpID09IDApKQotICAgIGFzX3dhcm4gKF8oIkZQIGJyYW5jaCBpbiBkZWxheSBzbG90IikpOwotCi0gIC8qIFNQQVJDIGJlZm9yZSB2OSByZXF1aXJlcyBhIG5vcCBpbnN0cnVjdGlvbiBiZXR3ZWVuIGEgZmxvYXRpbmcKLSAgICAgcG9pbnQgaW5zdHJ1Y3Rpb24gYW5kIGEgZmxvYXRpbmcgcG9pbnQgYnJhbmNoLiAgV2UgaW5zZXJ0IG9uZQotICAgICBhdXRvbWF0aWNhbGx5LCB3aXRoIGEgd2FybmluZy4gICovCi0gIGlmIChtYXhfYXJjaGl0ZWN0dXJlIDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjkKLSAgICAgICYmIGluc24gIT0gTlVMTAotICAgICAgJiYgbGFzdF9pbnNuICE9IE5VTEwKLSAgICAgICYmIChpbnNuLT5mbGFncyAmIEZfRkJSKSAhPSAwCi0gICAgICAmJiAobGFzdF9pbnNuLT5mbGFncyAmIEZfRkxPQVQpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IHNwYXJjX2l0IG5vcF9pbnNuOwotCi0gICAgICBub3BfaW5zbi5vcGNvZGUgPSBOT1BfSU5TTjsKLSAgICAgIG5vcF9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJm5vcF9pbnNuKTsKLSAgICAgIGFzX3dhcm4gKF8oIkZQIGJyYW5jaCBwcmVjZWRlZCBieSBGUCBpbnN0cnVjdGlvbjsgTk9QIGluc2VydGVkIikpOwotICAgIH0KLQotICBzd2l0Y2ggKHNwZWNpYWxfY2FzZSkKLSAgICB7Ci0gICAgY2FzZSBTUEVDSUFMX0NBU0VfTk9ORToKLSAgICAgIC8qIG5vcm1hbCBpbnNuICovCi0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTUEVDSUFMX0NBU0VfU0VUU1c6Ci0gICAgICBzeW50aGV0aXplX3NldHN3IChpbnNuKTsKLSAgICAgIGJyZWFrOwotCSAgCi0gICAgY2FzZSBTUEVDSUFMX0NBU0VfU0VUOgotICAgICAgc3ludGhldGl6ZV9zZXR1dyAoaW5zbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU1BFQ0lBTF9DQVNFX1NFVFg6Ci0gICAgICBzeW50aGV0aXplX3NldHggKGluc24pOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9GRElWOgotICAgICAgewotCWludCByZCA9ICh0aGVfaW5zbi5vcGNvZGUgPj4gMjUpICYgMHgxZjsKLSAgICAKLQlvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICAKLQkvKiBBY2NvcmRpbmcgdG8gaW5mb3JtYXRpb24gbGVha2VkIGZyb20gU3VuLCB0aGUgImZkaXYiIGluc3RydWN0aW9ucwotCSAgIG9uIGVhcmx5IFNQQVJDIG1hY2hpbmVzIHdvdWxkIHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMgc29tZXRpbWVzLgotCSAgIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGFkZCBhbiBmbW92cyBvZiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgdG8KLQkgICBpdHNlbGYganVzdCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIHdhcyB0cnVlIG9uIG1hY2hpbmVzCi0JICAgd2l0aCBXZWl0ZWsgMTE2NSBmbG9hdCBjaGlwcywgc3VjaCBhcyB0aGUgU3VuLTQvMjYwIGFuZCAvMjgwLiAqLwotCWFzc2VydCAodGhlX2luc24ucmVsb2MgPT0gQkZEX1JFTE9DX05PTkUpOwotCXRoZV9pbnNuLm9wY29kZSA9IEZNT1ZTX0lOU04gfCByZCB8IFJEIChyZCk7Ci0Jb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0JcmV0dXJuOwotICAgICAgfQotICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiZmFpbGVkIHNwZWNpYWwgY2FzZSBpbnNuIHNhbml0eSBjaGVjayIpKTsKLSAgICB9Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbWRfYXNzZW1ibGUgdG8gZG8gdGhlIGFjdHVhbCBwYXJzaW5nLiAgKi8KLQotc3RhdGljIGludAotc3BhcmNfaXAgKHN0ciwgcGluc24pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKnBpbnNuOwotewotICBjaGFyICplcnJvcl9tZXNzYWdlID0gIiI7Ci0gIGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGNoYXIgYzsKLSAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLSAgY2hhciAqYXJnc1N0YXJ0OwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgdW5zaWduZWQgaW50IG1hc2sgPSAwOwotICBpbnQgbWF0Y2ggPSAwOwotICBpbnQgY29tbWEgPSAwOwotICBpbnQgdjlfYXJnX3A7Ci0gIGludCBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfTk9ORTsKLQotICBzID0gc3RyOwotICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICB7Ci0gICAgICBkbwotCSsrczsKLSAgICAgIHdoaWxlIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMpIHx8IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpOwotICAgIH0KLQotICBzd2l0Y2ggKCpzKQotICAgIHsKLSAgICBjYXNlICdcMCc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJywnOgotICAgICAgY29tbWEgPSAxOwotCi0gICAgICAvKkZBTExUSFJPVUdIICovCi0KLSAgICBjYXNlICcgJzoKLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgfQotICBpbnNuID0gKHN0cnVjdCBzcGFyY19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpOwotICAqcGluc24gPSBpbnNuOwotICBpZiAoaW5zbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIHJldHVybiBzcGVjaWFsX2Nhc2U7Ci0gICAgfQotICBpZiAoY29tbWEpCi0gICAgewotICAgICAgKi0tcyA9ICcsJzsKLSAgICB9Ci0KLSAgYXJnc1N0YXJ0ID0gczsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBvcGNvZGUgPSBpbnNuLT5tYXRjaDsKLSAgICAgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotICAgICAgdjlfYXJnX3AgPSAwOwotCi0gICAgICAvKgotICAgICAgICogQnVpbGQgdGhlIG9wY29kZSwgY2hlY2tpbmcgYXMgd2UgZ28gdG8gbWFrZQotICAgICAgICogc3VyZSB0aGF0IHRoZSBvcGVyYW5kcyBtYXRjaAotICAgICAgICovCi0gICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotCXsKLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnSyc6Ci0JICAgICAgewotCQlpbnQga21hc2sgPSAwOwotCi0JCS8qIFBhcnNlIGEgc2VyaWVzIG9mIG1hc2tzLiAgKi8KLQkJaWYgKCpzID09ICcjJykKLQkJICB7Ci0JCSAgICB3aGlsZSAoKnMgPT0gJyMnKQotCQkgICAgICB7Ci0JCQlpbnQgbWFzazsKLQotCQkJaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9tZW1iYXIsICZzLAotCQkJCQkJICZtYXNrKSkKLQkJCSAgewotCQkJICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgbWVtYmFyIG1hc2sgbmFtZSIpOwotCQkJICAgIGdvdG8gZXJyb3I7Ci0JCQkgIH0KLQkJCWttYXNrIHw9IG1hc2s7Ci0JCQl3aGlsZSAoKnMgPT0gJyAnKSB7ICsrczsgY29udGludWU7IH0KLQkJCWlmICgqcyA9PSAnfCcgfHwgKnMgPT0gJysnKQotCQkJICArK3M7Ci0JCQl3aGlsZSAoKnMgPT0gJyAnKSB7ICsrczsgY29udGludWU7IH0KLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmICghIHBhcnNlX2NvbnN0X2V4cHJfYXJnICgmcywgJmttYXNrKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBtZW1iYXIgbWFzayBleHByZXNzaW9uIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgICBpZiAoa21hc2sgPCAwIHx8IGttYXNrID4gMTI3KQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIG1lbWJhciBtYXNrIG51bWJlciIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgIH0KLQotCQlvcGNvZGUgfD0gTUVNQkFSIChrbWFzayk7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICBjYXNlICcqJzoKLQkgICAgICB7Ci0JCWludCBmY24gPSAwOwotCi0JCS8qIFBhcnNlIGEgcHJlZmV0Y2ggZnVuY3Rpb24uICAqLwotCQlpZiAoKnMgPT0gJyMnKQotCQkgIHsKLQkJICAgIGlmICghIHBhcnNlX2tleXdvcmRfYXJnIChzcGFyY19lbmNvZGVfcHJlZmV0Y2gsICZzLCAmZmNuKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBuYW1lIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2VfY29uc3RfZXhwcl9hcmcgKCZzLCAmZmNuKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBleHByZXNzaW9uIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgICBpZiAoZmNuIDwgMCB8fCBmY24gPiAzMSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBudW1iZXIiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCW9wY29kZSB8PSBSRCAoZmNuKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGNhc2UgJyEnOgotCSAgICBjYXNlICc/JzoKLQkgICAgICAvKiBQYXJzZSBhIHNwYXJjNjQgcHJpdmlsZWdlZCByZWdpc3Rlci4gICovCi0JICAgICAgaWYgKCpzID09ICclJykKLQkJewotCQkgIHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqcCA9IHByaXZfcmVnX3RhYmxlOwotCQkgIHVuc2lnbmVkIGludCBsZW4gPSA5OTk5OTk5OyAvKiBpbml0IHRvIG1ha2UgZ2NjIGhhcHB5ICovCi0KLQkJICBzICs9IDE7Ci0JCSAgd2hpbGUgKHAtPm5hbWVbMF0gPiBzWzBdKQotCQkgICAgcCsrOwotCQkgIHdoaWxlIChwLT5uYW1lWzBdID09IHNbMF0pCi0JCSAgICB7Ci0JCSAgICAgIGxlbiA9IHN0cmxlbiAocC0+bmFtZSk7Ci0JCSAgICAgIGlmIChzdHJuY21wIChwLT5uYW1lLCBzLCBsZW4pID09IDApCi0JCQlicmVhazsKLQkJICAgICAgcCsrOwotCQkgICAgfQotCQkgIGlmIChwLT5uYW1lWzBdICE9IHNbMF0pCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHVucmVjb2duaXphYmxlIHByaXZpbGVnZWQgcmVnaXN0ZXIiKTsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQkJICBpZiAoKmFyZ3MgPT0gJz8nKQotCQkgICAgb3Bjb2RlIHw9IChwLT5yZWdudW0gPDwgMTQpOwotCQkgIGVsc2UKLQkJICAgIG9wY29kZSB8PSAocC0+cmVnbnVtIDw8IDI1KTsKLQkJICBzICs9IGxlbjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHVucmVjb2duaXphYmxlIHByaXZpbGVnZWQgcmVnaXN0ZXIiKTsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgY2FzZSAnXyc6Ci0JICAgIGNhc2UgJy8nOgotCSAgICAgIC8qIFBhcnNlIGEgdjlhIGFuY2lsbGFyeSBzdGF0ZSByZWdpc3Rlci4gICovCi0JICAgICAgaWYgKCpzID09ICclJykKLQkJewotCQkgIHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqcCA9IHY5YV9hc3JfdGFibGU7Ci0JCSAgdW5zaWduZWQgaW50IGxlbiA9IDk5OTk5OTk7IC8qIGluaXQgdG8gbWFrZSBnY2MgaGFwcHkgKi8KLQotCQkgIHMgKz0gMTsKLQkJICB3aGlsZSAocC0+bmFtZVswXSA+IHNbMF0pCi0JCSAgICBwKys7Ci0JCSAgd2hpbGUgKHAtPm5hbWVbMF0gPT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgbGVuID0gc3RybGVuIChwLT5uYW1lKTsKLQkJICAgICAgaWYgKHN0cm5jbXAgKHAtPm5hbWUsIHMsIGxlbikgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgICBwKys7Ci0JCSAgICB9Ci0JCSAgaWYgKHAtPm5hbWVbMF0gIT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogdW5yZWNvZ25pemFibGUgdjlhIGFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIGlmICgqYXJncyA9PSAnLycgJiYgKHAtPnJlZ251bSA9PSAyMCB8fCBwLT5yZWdudW0gPT0gMjEpKQotCQkgICAgewotCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiByZCBvbiB3cml0ZSBvbmx5IGFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQkJICAgICAgCi0JCSAgaWYgKCphcmdzID09ICcvJykKLQkJICAgIG9wY29kZSB8PSAocC0+cmVnbnVtIDw8IDE0KTsKLQkJICBlbHNlCi0JCSAgICBvcGNvZGUgfD0gKHAtPnJlZ251bSA8PCAyNSk7Ci0JCSAgcyArPSBsZW47Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBlcnJvcl9tZXNzYWdlID0gXygiOiB1bnJlY29nbml6YWJsZSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIik7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgIGNhc2UgJ00nOgotCSAgICBjYXNlICdtJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVhc3IiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCi0JCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgbnVtID0gMDsKLQotCQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJCXsKLQkJCSAgbnVtID0gbnVtICogMTAgKyAqcyAtICcwJzsKLQkJCSAgKytzOwotCQkJfQotCi0JCSAgICAgIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA+PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQkJCXsKLQkJCSAgaWYgKG51bSA8IDE2IHx8IDMxIDwgbnVtKQotCQkJICAgIHsKLQkJCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGFzciBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDE2IGFuZCAzMSIpOwotCQkJICAgICAgZ290byBlcnJvcjsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaWYgKG51bSA8IDAgfHwgMzEgPCBudW0pCi0JCQkgICAgewotCQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogYXNyIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzEiKTsKLQkJCSAgICAgIGdvdG8gZXJyb3I7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIG9wY29kZSB8PSAoKmFyZ3MgPT0gJ00nID8gUlMxIChudW0pIDogUkQgKG51bSkpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGV4cGVjdGluZyAlYXNyTiIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQl9IC8qIGlmICVhc3IgKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdJJzoKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ18xMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdqJzoKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ18xMDsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdYJzoKLQkgICAgICAvKiBWOCBzeXN0ZW1zIGRvbid0IHVuZGVyc3RhbmQgQkZEX1JFTE9DX1NQQVJDXzUuICAqLwotCSAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfNTsKLQkgICAgICBlbHNlCi0JCXRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDMTM7Ci0JICAgICAgLyogVGhlc2UgZmllbGRzIGFyZSB1bnNpZ25lZCwgYnV0IGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eSwKLQkJIGFsbG93IG5lZ2F0aXZlIHZhbHVlcyBhcyB3ZWxsLiAgKi8KLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdZJzoKLQkgICAgICAvKiBWOCBzeXN0ZW1zIGRvbid0IHVuZGVyc3RhbmQgQkZEX1JFTE9DX1NQQVJDXzYuICAqLwotCSAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfNjsKLQkgICAgICBlbHNlCi0JCXRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDMTM7Ci0JICAgICAgLyogVGhlc2UgZmllbGRzIGFyZSB1bnNpZ25lZCwgYnV0IGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eSwKLQkJIGFsbG93IG5lZ2F0aXZlIHZhbHVlcyBhcyB3ZWxsLiAgKi8KLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdrJzoKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IC8qIFJFTE9DX1dESVNQMl8xNCAqLyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNjsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnRyc6Ci0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOTsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnTic6Ci0JICAgICAgaWYgKCpzID09ICdwJyAmJiBzWzFdID09ICduJykKLQkJewotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1QnOgotCSAgICAgIGlmICgqcyA9PSAncCcgJiYgc1sxXSA9PSAndCcpCi0JCXsKLQkJICBzICs9IDI7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd6JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlaWNjIiwgNCkgPT0gMCkKLQkJewotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1onOgotCSAgICAgIGlmICgqcyA9PSAnICcpCi0JCXsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV4Y2MiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNic6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzAiLCA1KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA1OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzEiLCA1KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA1OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnOCc6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzIiLCA1KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA1OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnOSc6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzMiLCA1KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA1OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlcGMiLCAzKSA9PSAwKQotCQl7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIldGljayIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcMCc6CQkvKiBlbmQgb2YgYXJncyAqLwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQl7Ci0JCSAgbWF0Y2ggPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKyc6Ci0JICAgICAgaWYgKCpzID09ICcrJykKLQkJewotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmICgqcyA9PSAnLScpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1snOgkJLyogdGhlc2UgbXVzdCBtYXRjaCBleGFjdGx5ICovCi0JICAgIGNhc2UgJ10nOgotCSAgICBjYXNlICcsJzoKLQkgICAgY2FzZSAnICc6Ci0JICAgICAgaWYgKCpzKysgPT0gKmFyZ3MpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJyMnOgkJLyogbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgKi8KLQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKyspKQotCQl7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSAgICB7Ci0JCSAgICAgICsrczsKLQkJICAgIH0KLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0MnOgkJLyogY29wcm9jZXNzb3Igc3RhdGUgcmVnaXN0ZXIgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVjc3IiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnYic6CQkvKiBuZXh0IG9wZXJhbmQgaXMgYSBjb3Byb2Nlc3NvciByZWdpc3RlciAqLwotCSAgICBjYXNlICdjJzoKLQkgICAgY2FzZSAnRCc6Ci0JICAgICAgaWYgKCpzKysgPT0gJyUnICYmICpzKysgPT0gJ2MnICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCXsKLQkJICBtYXNrID0gKnMrKzsKLQkJICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgIHsKLQkJICAgICAgbWFzayA9IDEwICogKG1hc2sgLSAnMCcpICsgKCpzKysgLSAnMCcpOwotCQkgICAgICBpZiAobWFzayA+PSAzMikKLQkJCXsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBtYXNrIC09ICcwJzsKLQkJICAgIH0KLQkJICBzd2l0Y2ggKCphcmdzKQotCQkgICAgewotCi0JCSAgICBjYXNlICdiJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTQ7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdjJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2s7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdEJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjU7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAncic6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ08nOgotCSAgICBjYXNlICcxJzoKLQkgICAgY2FzZSAnMic6Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIGlmICgqcysrID09ICclJykKLQkJewotCQkgIHN3aXRjaCAoYyA9ICpzKyspCi0JCSAgICB7Ci0KLQkJICAgIGNhc2UgJ2YnOgkvKiBmcmFtZSBwb2ludGVyICovCi0JCSAgICAgIGlmICgqcysrID09ICdwJykKLQkJCXsKLQkJCSAgbWFzayA9IDB4MWU7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdnJzoJLyogZ2xvYmFsIHJlZ2lzdGVyICovCi0JCSAgICAgIGMgPSAqcysrOwotCQkgICAgICBpZiAoaXNvY3RhbCAoYykpCi0JCQl7Ci0JCQkgIG1hc2sgPSBjIC0gJzAnOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAnaSc6CS8qIGluIHJlZ2lzdGVyICovCi0JCSAgICAgIGMgPSAqcysrOwotCQkgICAgICBpZiAoaXNvY3RhbCAoYykpCi0JCQl7Ci0JCQkgIG1hc2sgPSBjIC0gJzAnICsgMjQ7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdsJzoJLyogbG9jYWwgcmVnaXN0ZXIgKi8KLQkJICAgICAgYyA9ICpzKys7Ci0JCSAgICAgIGlmIChpc29jdGFsIChjKSkKLQkJCXsKLQkJCSAgbWFzayA9IChjIC0gJzAnICsgMTYpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAnbyc6CS8qIG91dCByZWdpc3RlciAqLwotCQkgICAgICBjID0gKnMrKzsKLQkJICAgICAgaWYgKGlzb2N0YWwgKGMpKQotCQkJewotCQkJICBtYXNrID0gKGMgLSAnMCcgKyA4KTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ3MnOgkvKiBzdGFjayBwb2ludGVyICovCi0JCSAgICAgIGlmICgqcysrID09ICdwJykKLQkJCXsKLQkJCSAgbWFzayA9IDB4ZTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ3InOgkvKiBhbnkgcmVnaXN0ZXIgKi8KLQkJICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKGMgPSAqcysrKSkpCi0JCQl7Ci0JCQkgIGdvdG8gZXJyb3I7Ci0JCQl9Ci0JCSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0JCSAgICBjYXNlICcwJzoKLQkJICAgIGNhc2UgJzEnOgotCQkgICAgY2FzZSAnMic6Ci0JCSAgICBjYXNlICczJzoKLQkJICAgIGNhc2UgJzQnOgotCQkgICAgY2FzZSAnNSc6Ci0JCSAgICBjYXNlICc2JzoKLQkJICAgIGNhc2UgJzcnOgotCQkgICAgY2FzZSAnOCc6Ci0JCSAgICBjYXNlICc5JzoKLQkJICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCQl7Ci0JCQkgIGlmICgoYyA9IDEwICogKGMgLSAnMCcpICsgKCpzKysgLSAnMCcpKSA+PSAzMikKLQkJCSAgICB7Ci0JCQkgICAgICBnb3RvIGVycm9yOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBjIC09ICcwJzsKLQkJCX0KLQkJICAgICAgbWFzayA9IGM7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCi0JCSAgaWYgKChtYXNrICYgfjEpID09IDIgJiYgc3BhcmNfYXJjaF9zaXplID09IDY0Ci0JCSAgICAgICYmIG5vX3VuZGVjbGFyZWRfcmVncyAmJiAhIGdsb2JhbHMgW21hc2tdKQotCQkgICAgYXNfYmFkIChfKCJkZXRlY3RlZCBnbG9iYWwgcmVnaXN0ZXIgdXNlIG5vdCAiCi0JCQkgICAgICAiY292ZXJlZCBieSAucmVnaXN0ZXIgcHNldWRvLW9wIikpOwotCi0JCSAgLyogR290IHRoZSByZWdpc3Rlciwgbm93IGZpZ3VyZSBvdXQgd2hlcmUKLQkJICAgICBpdCBnb2VzIGluIHRoZSBvcGNvZGUuICAqLwotCQkgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICcxJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTQ7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICcyJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2s7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjU7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdyJzoKLQkJICAgICAgb3Bjb2RlIHw9IChtYXNrIDw8IDI1KSB8IChtYXNrIDw8IDE0KTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ08nOgotCQkgICAgICBvcGNvZGUgfD0gKG1hc2sgPDwgMjUpIHwgKG1hc2sgPDwgMCk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZSc6CQkvKiBuZXh0IG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotCSAgICBjYXNlICd2JzoKLQkgICAgY2FzZSAnVic6Ci0KLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ0InOgotCSAgICBjYXNlICdSJzoKLQotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnSCc6Ci0JICAgIGNhc2UgJ0onOgotCSAgICAgIHsKLQkJY2hhciBmb3JtYXQ7Ci0KLQkJaWYgKCpzKysgPT0gJyUnCi0JCSAgICAmJiAoKGZvcm1hdCA9ICpzKSA9PSAnZicpCi0JCSAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKisrcykpCi0JCSAgewotCQkgICAgZm9yIChtYXNrID0gMDsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotCQkgICAgICB7Ci0JCQltYXNrID0gMTAgKiBtYXNrICsgKCpzIC0gJzAnKTsKLQkJICAgICAgfQkJLyogcmVhZCB0aGUgbnVtYmVyICovCi0KLQkJICAgIGlmICgoKmFyZ3MgPT0gJ3YnCi0JCQkgfHwgKmFyZ3MgPT0gJ0InCi0JCQkgfHwgKmFyZ3MgPT0gJ0gnKQotCQkJJiYgKG1hc2sgJiAxKSkKLQkJICAgICAgewotCQkJYnJlYWs7Ci0JCSAgICAgIH0JCS8qIHJlZ2lzdGVyIG11c3QgYmUgZXZlbiBudW1iZXJlZCAqLwotCi0JCSAgICBpZiAoKCphcmdzID09ICdWJwotCQkJIHx8ICphcmdzID09ICdSJwotCQkJIHx8ICphcmdzID09ICdKJykKLQkJCSYmIChtYXNrICYgMykpCi0JCSAgICAgIHsKLQkJCWJyZWFrOwotCQkgICAgICB9CQkvKiByZWdpc3RlciBtdXN0IGJlIG11bHRpcGxlIG9mIDQgKi8KLQotCQkgICAgaWYgKG1hc2sgPj0gNjQpCi0JCSAgICAgIHsKLQkJCWlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJCSAgZXJyb3JfbWVzc2FnZSA9IF8oIjogVGhlcmUgYXJlIG9ubHkgNjQgZiByZWdpc3RlcnM7IFswLTYzXSIpOwotCQkJZWxzZQotCQkJICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSAzMiBmIHJlZ2lzdGVyczsgWzAtMzFdIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9CS8qIG9uIGVycm9yICovCi0JCSAgICBlbHNlIGlmIChtYXNrID49IDMyKQotCQkgICAgICB7Ci0JCQlpZiAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkpCi0JCQkgIHsKLQkJCSAgICB2OV9hcmdfcCA9IDE7Ci0JCQkgICAgbWFzayAtPSAzMTsJLyogd3JhcCBoaWdoIGJpdCAqLwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSAzMiBmIHJlZ2lzdGVyczsgWzAtMzFdIik7Ci0JCQkgICAgZ290byBlcnJvcjsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgYnJlYWs7Ci0JCSAgfQkvKiBpZiBub3QgYW4gJ2YnIHJlZ2lzdGVyLiAqLwotCi0JCXN3aXRjaCAoKmFyZ3MpCi0JCSAgewotCQkgIGNhc2UgJ3YnOgotCQkgIGNhc2UgJ1YnOgotCQkgIGNhc2UgJ2UnOgotCQkgICAgb3Bjb2RlIHw9IFJTMSAobWFzayk7Ci0JCSAgICBjb250aW51ZTsKLQotCi0JCSAgY2FzZSAnZic6Ci0JCSAgY2FzZSAnQic6Ci0JCSAgY2FzZSAnUic6Ci0JCSAgICBvcGNvZGUgfD0gUlMyIChtYXNrKTsKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgY2FzZSAnZyc6Ci0JCSAgY2FzZSAnSCc6Ci0JCSAgY2FzZSAnSic6Ci0JCSAgICBvcGNvZGUgfD0gUkQgKG1hc2spOwotCQkgICAgY29udGludWU7Ci0JCSAgfQkJLyogcGFjayBpdCBpbi4gKi8KLQotCQlrbm93ICgwKTsKLQkJYnJlYWs7Ci0JICAgICAgfQkJCS8qIGZsb2F0IGFyZyAqLwotCi0JICAgIGNhc2UgJ0YnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcwJzoJCS8qIDY0IGJpdCBpbW1lZGlhdGUgKHNldCwgc2V0c3csIHNldHggaW5zbikgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOyAvKiByZWxvYyBoYW5kbGVkIGVsc2V3aGVyZSAqLwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2wnOgkJLyogMjIgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDX1dESVNQMjI7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ0wnOgkJLyogMzAgYml0IGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdoJzoKLQkgICAgY2FzZSAnbic6CQkvKiAyMiBiaXQgaW1tZWRpYXRlICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMyMjsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdpJzoJCS8qIDEzIGJpdCBpbW1lZGlhdGUgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQzEzOwotCi0JICAgICAgLyogZmFsbHRocm91Z2ggKi8KLQotCSAgICBpbW1lZGlhdGU6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJcysrOwotCi0JICAgICAgewotCQljaGFyICpzMTsKLQkJY2hhciAqb3BfYXJnID0gTlVMTDsKLQkJZXhwcmVzc2lvblMgb3BfZXhwOwotCQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgb2xkX3JlbG9jID0gdGhlX2luc24ucmVsb2M7Ci0KLQkJLyogQ2hlY2sgZm9yICVoaSwgZXRjLiAgKi8KLQkJaWYgKCpzID09ICclJykKLQkJICB7Ci0JCSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IG9wcyB7Ci0JCSAgICAgIC8qIFRoZSBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gYXNzZW1ibGVyLiAgKi8KLQkJICAgICAgY2hhciAqbmFtZTsKLQkJICAgICAgLyogc3RybGVuIChuYW1lKSwgcHJlY29tcHV0ZWQgZm9yIHNwZWVkICovCi0JCSAgICAgIGludCBsZW47Ci0JCSAgICAgIC8qIFRoZSByZWxvYyB0aGlzIHBzZXVkby1vcCB0cmFuc2xhdGVzIHRvLiAgKi8KLQkJICAgICAgaW50IHJlbG9jOwotCQkgICAgICAvKiBOb24temVybyBpZiBmb3Igdjkgb25seS4gICovCi0JCSAgICAgIGludCB2OV9wOwotCQkgICAgICAvKiBOb24temVybyBpZiBjYW4gYmUgdXNlZCBpbiBwYy1yZWxhdGl2ZSBjb250ZXh0cy4gICovCi0JCSAgICAgIGludCBwY3JlbF9wOy8qRklYTUU6d2lwKi8KLQkJICAgIH0gb3BzW10gPSB7Ci0JCSAgICAgIC8qIGhpeC9sb3ggbXVzdCBhcHBlYXIgYmVmb3JlIGhpL2xvIHNvICVoaXggd29uJ3QgYmUKLQkJCSBtaXN0YWtlbiBmb3IgJWhpLiAgKi8KLQkJICAgICAgeyAiaGl4IiwgMywgQkZEX1JFTE9DX1NQQVJDX0hJWDIyLCAxLCAwIH0sCi0JCSAgICAgIHsgImxveCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19MT1gxMCwgMSwgMCB9LAotCQkgICAgICB7ICJoaSIsIDIsIEJGRF9SRUxPQ19ISTIyLCAwLCAxIH0sCi0JCSAgICAgIHsgImxvIiwgMiwgQkZEX1JFTE9DX0xPMTAsIDAsIDEgfSwKLQkJICAgICAgeyAiaGgiLCAyLCBCRkRfUkVMT0NfU1BBUkNfSEgyMiwgMSwgMSB9LAotCQkgICAgICB7ICJobSIsIDIsIEJGRF9SRUxPQ19TUEFSQ19ITTEwLCAxLCAxIH0sCi0JCSAgICAgIHsgImxtIiwgMiwgQkZEX1JFTE9DX1NQQVJDX0xNMjIsIDEsIDEgfSwKLQkJICAgICAgeyAiaDQ0IiwgMywgQkZEX1JFTE9DX1NQQVJDX0g0NCwgMSwgMCB9LAotCQkgICAgICB7ICJtNDQiLCAzLCBCRkRfUkVMT0NfU1BBUkNfTTQ0LCAxLCAwIH0sCi0JCSAgICAgIHsgImw0NCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19MNDQsIDEsIDAgfSwKLQkJICAgICAgeyAidWhpIiwgMywgQkZEX1JFTE9DX1NQQVJDX0hIMjIsIDEsIDAgfSwKLQkJICAgICAgeyAidWxvIiwgMywgQkZEX1JFTE9DX1NQQVJDX0hNMTAsIDEsIDAgfSwKLQkJICAgICAgeyBOVUxMIH0KLQkJICAgIH07Ci0JCSAgICBjb25zdCBzdHJ1Y3Qgb3BzICpvOwotICAKLQkJICAgIGZvciAobyA9IG9wczsgby0+bmFtZTsgbysrKQotCQkgICAgICBpZiAoc3RybmNtcCAocyArIDEsIG8tPm5hbWUsIG8tPmxlbikgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgaWYgKG8tPm5hbWUgPT0gTlVMTCkKLQkJICAgICAgYnJlYWs7Ci0JCSAgICAgIAotCQkgICAgaWYgKHNbby0+bGVuICsgMV0gIT0gJygnKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6ICUlJXMgcmVxdWlyZXMgYXJndW1lbnRzIGluICgpIiksIG8tPm5hbWUpOwotCQkJcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkJICAgICAgfQotCi0JCSAgICBvcF9hcmcgPSBvLT5uYW1lOwotCQkgICAgdGhlX2luc24ucmVsb2MgPSBvLT5yZWxvYzsKLQkJICAgIHMgKz0gby0+bGVuICsgMjsKLQkJICAgIHY5X2FyZ19wID0gby0+djlfcDsKLQkJICB9Ci0KLQkJLyogTm90ZSB0aGF0IGlmIHRoZSBnZXRfZXhwcmVzc2lvbigpIGZhaWxzLCB3ZSB3aWxsIHN0aWxsCi0JCSAgIGhhdmUgY3JlYXRlZCBVIGVudHJpZXMgaW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlCi0JCSAgICdzeW1ib2xzJyBpbiB0aGUgaW5wdXQgc3RyaW5nLiAgVHJ5IG5vdCB0byBjcmVhdGUgVQotCQkgICBzeW1ib2xzIGZvciByZWdpc3RlcnMsIGV0Yy4gICovCi0KLQkJLyogVGhpcyBzdHVmZiBjaGVja3MgdG8gc2VlIGlmIHRoZSBleHByZXNzaW9uIGVuZHMgaW4KLQkJICAgKyVyZWcuICBJZiBpdCBkb2VzLCBpdCByZW1vdmVzIHRoZSByZWdpc3RlciBmcm9tCi0JCSAgIHRoZSBleHByZXNzaW9uLCBhbmQgcmUtc2V0cyAncycgdG8gcG9pbnQgdG8gdGhlCi0JCSAgIHJpZ2h0IHBsYWNlLiAgKi8KLQotCQlpZiAob3BfYXJnKQotCQkgIHsKLQkJICAgIGludCBucGFyID0gMDsKLQotCQkgICAgZm9yIChzMSA9IHM7ICpzMSAmJiAqczEgIT0gJywnICYmICpzMSAhPSAnXSc7IHMxKyspCi0JCSAgICAgIGlmICgqczEgPT0gJygnKQotCQkJbnBhcisrOwotCQkgICAgICBlbHNlIGlmICgqczEgPT0gJyknKQotCQkJewotCQkJICBpZiAoIW5wYXIpCi0JCQkgICAgYnJlYWs7Ci0JCQkgIG5wYXItLTsKLQkJCX0KLQotCQkgICAgaWYgKCpzMSAhPSAnKScpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kczogJSUlcyByZXF1aXJlcyBhcmd1bWVudHMgaW4gKCkiKSwgb3BfYXJnKTsKLQkJCXJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JCSAgICAgIH0KLQkJICAgIAotCQkgICAgKnMxID0gJ1wwJzsKLQkJICAgICh2b2lkKSBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JCSAgICAqczEgPSAnKSc7Ci0JCSAgICBzID0gczEgKyAxOwotCQkgICAgaWYgKCpzID09ICcsJyB8fCAqcyA9PSAnXScgfHwgISpzKQotCQkgICAgICBjb250aW51ZTsKLQkJICAgIGlmICgqcyAhPSAnKycgJiYgKnMgIT0gJy0nKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6IENhbid0IGRvIGFyaXRobWV0aWNzIG90aGVyIHRoYW4gKyBhbmQgLSBpbnZvbHZpbmcgJSUlcygpIiksIG9wX2FyZyk7Ci0JCQlyZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkgICAgICB9Ci0JCSAgICAqczEgPSAnMCc7Ci0JCSAgICBzID0gczE7Ci0JCSAgICBvcF9leHAgPSB0aGVfaW5zbi5leHA7Ci0JCSAgICBtZW1zZXQgKCZ0aGVfaW5zbi5leHAsIDAsIHNpemVvZih0aGVfaW5zbi5leHApKTsKLQkJICB9Ci0KLQkJZm9yIChzMSA9IHM7ICpzMSAmJiAqczEgIT0gJywnICYmICpzMSAhPSAnXSc7IHMxKyspIDsKLQotCQlpZiAoczEgIT0gcyAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgczFbLTFdKSkKLQkJICB7Ci0JCSAgICBpZiAoczFbLTJdID09ICclJyAmJiBzMVstM10gPT0gJysnKQotCQkgICAgICBzMSAtPSAzOwotCQkgICAgZWxzZSBpZiAoc3RyY2hyICgiZ29saTAxMjM0NTY3ODkiLCBzMVstMl0pICYmIHMxWy0zXSA9PSAnJScgJiYgczFbLTRdID09ICcrJykKLQkJICAgICAgczEgLT0gNDsKLQkJICAgIGVsc2UKLQkJICAgICAgczEgPSBOVUxMOwotCQkgICAgaWYgKHMxKQotCQkgICAgICB7Ci0JCQkqczEgPSAnXDAnOwotCQkJaWYgKG9wX2FyZyAmJiBzMSA9PSBzICsgMSkKLQkJCSAgdGhlX2luc24uZXhwLlhfb3AgPSBPX2Fic2VudDsKLQkJCWVsc2UKLQkJCSAgKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkJCSpzMSA9ICcrJzsKLQkJCWlmIChvcF9hcmcpCi0JCQkgICpzID0gJyknOwotCQkJcyA9IHMxOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgczEgPSBOVUxMOwotCi0JCWlmICghczEpCi0JCSAgewotCQkgICAgKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkJICAgIGlmIChvcF9hcmcpCi0JCSAgICAgICpzID0gJyknOwotCQkgICAgcyA9IGV4cHJfZW5kOwotCQkgIH0KLQotCQlpZiAob3BfYXJnKQotCQkgIHsKLQkJICAgIHRoZV9pbnNuLmV4cDIgPSB0aGVfaW5zbi5leHA7Ci0JCSAgICB0aGVfaW5zbi5leHAgPSBvcF9leHA7Ci0JCSAgICBpZiAodGhlX2luc24uZXhwMi5YX29wID09IE9fYWJzZW50KQotCQkgICAgICB0aGVfaW5zbi5leHAyLlhfb3AgPSBPX2lsbGVnYWw7Ci0JCSAgICBlbHNlIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2Fic2VudCkKLQkJICAgICAgewotCQkJdGhlX2luc24uZXhwID0gdGhlX2luc24uZXhwMjsKLQkJCXRoZV9pbnNuLmV4cDIuWF9vcCA9IE9faWxsZWdhbDsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJdmFsdWVUIHZhbCA9IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7Ci0JCQlzd2l0Y2ggKHRoZV9pbnNuLnJlbG9jKQotCQkJICB7Ci0JCQkgIGRlZmF1bHQ6Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSEgyMjoKLQkJCSAgICB2YWwgPSBCU1IgKHZhbCwgMzIpOwotCQkJICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE0yMjoKLQkJCSAgY2FzZSBCRkRfUkVMT0NfSEkyMjoKLQkJCSAgICB2YWwgPSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hNMTA6Ci0JCQkgICAgdmFsID0gQlNSICh2YWwsIDMyKTsKLQkJCSAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0JCQkgICAgdmFsICY9IDB4M2ZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0g0NDoKLQkJCSAgICB2YWwgPj49IDIyOwotCQkJICAgIHZhbCAmPSAweDNmZmZmZjsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19NNDQ6Ci0JCQkgICAgdmFsID4+PSAxMjsKLQkJCSAgICB2YWwgJj0gMHgzZmY7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTDQ0OgotCQkJICAgIHZhbCAmPSAweGZmZjsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ISVgyMjoKLQkJCSAgICB2YWwgPSB+IHZhbDsKLQkJCSAgICB2YWwgPSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0xPWDEwOgotCQkJICAgIHZhbCA9ICh2YWwgJiAweDNmZikgfCAweDFjMDA7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCXRoZV9pbnNuLmV4cCA9IHRoZV9pbnNuLmV4cDI7Ci0JCQl0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICs9IHZhbDsKLQkJCXRoZV9pbnNuLmV4cDIuWF9vcCA9IE9faWxsZWdhbDsKLQkJCXRoZV9pbnNuLnJlbG9jID0gb2xkX3JlbG9jOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmICh0aGVfaW5zbi5leHAyLlhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzOiBDYW4ndCBhZGQgbm9uLWNvbnN0YW50IGV4cHJlc3Npb24gdG8gJSUlcygpIiksIG9wX2FyZyk7Ci0JCQlyZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWlmIChvbGRfcmVsb2MgIT0gQkZEX1JFTE9DX1NQQVJDMTMKLQkJCSAgICB8fCB0aGVfaW5zbi5yZWxvYyAhPSBCRkRfUkVMT0NfTE8xMAotCQkJICAgIHx8IHNwYXJjX2FyY2hfc2l6ZSAhPSA2NAotCQkJICAgIHx8IHNwYXJjX3BpY19jb2RlKQotCQkJICB7Ci0JCQkgICAgYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzOiBDYW4ndCBkbyBhcml0aG1ldGljcyBpbnZvbHZpbmcgJSUlcygpIG9mIGEgcmVsb2NhdGFibGUgc3ltYm9sIiksIG9wX2FyZyk7Ci0JCQkgICAgcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkJCSAgfQotCQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfT0xPMTA7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICAgIC8qIENoZWNrIGZvciBjb25zdGFudHMgdGhhdCBkb24ndCByZXF1aXJlIGVtaXR0aW5nIGEgcmVsb2MuICAqLwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgJiYgdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSAwCi0JCSAgJiYgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IDApCi0JCXsKLQkJICAvKiBGb3IgcGMtcmVsYXRpdmUgY2FsbCBpbnN0cnVjdGlvbnMsIHdlIHJlamVjdAotCQkgICAgIGNvbnN0YW50cyB0byBnZXQgYmV0dGVyIGNvZGUuICAqLwotCQkgIGlmICh0aGVfaW5zbi5wY3JlbAotCQkgICAgICAmJiB0aGVfaW5zbi5yZWxvYyA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIKLQkJICAgICAgJiYgaW5fc2lnbmVkX3JhbmdlICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyLCAweDNmZmYpKQotCQkgICAgewotCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBQQy1yZWxhdGl2ZSBvcGVyYW5kIGNhbid0IGJlIGEgY29uc3RhbnQiKTsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQotCQkgIC8qIENvbnN0YW50cyB0aGF0IHdvbid0IGZpdCBhcmUgY2hlY2tlZCBpbiBtZF9hcHBseV9maXgzCi0JCSAgICAgYW5kIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uCi0JCSAgICAgPz8/IEl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8gaW5zdGFsbCB0aGUgY29uc3RhbnRzCi0JCSAgICAgaW50byB0aGUgaW5zbiBoZXJlIGFuZCBzYXZlIGhhdmluZyB0byBjcmVhdGUgYSBmaXhTCi0JCSAgICAgZm9yIGVhY2ggb25lLiAgVGhlcmUgYWxyZWFkeSBleGlzdHMgY29kZSB0byBoYW5kbGUKLQkJICAgICBhbGwgdGhlIHZhcmlvdXMgY2FzZXMgKGUuZy4gaW4gbWRfYXBwbHlfZml4MyBhbmQKLQkJICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKSBzbyBkdXBsaWNhdGluZyBhbGwgdGhhdCBjb2RlCi0JCSAgICAgaGVyZSBpc24ndCByaWdodC4gICovCi0JCX0KLQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2EnOgotCSAgICAgIGlmICgqcysrID09ICdhJykKLQkJewotCQkgIG9wY29kZSB8PSBBTk5VTDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0EnOgotCSAgICAgIHsKLQkJaW50IGFzaSA9IDA7Ci0KLQkJLyogUGFyc2UgYW4gYXNpLiAgKi8KLQkJaWYgKCpzID09ICcjJykKLQkJICB7Ci0JCSAgICBpZiAoISBwYXJzZV9rZXl3b3JkX2FyZyAoc3BhcmNfZW5jb2RlX2FzaSwgJnMsICZhc2kpKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIEFTSSBuYW1lIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2VfY29uc3RfZXhwcl9hcmcgKCZzLCAmYXNpKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBBU0kgZXhwcmVzc2lvbiIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgICAgaWYgKGFzaSA8IDAgfHwgYXNpID4gMjU1KQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIEFTSSBudW1iZXIiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCW9wY29kZSB8PSBBU0kgKGFzaSk7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0JCQkvKiBhbHRlcm5hdGUgc3BhY2UgKi8KLQotCSAgICBjYXNlICdwJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVwc3IiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAncSc6CQkvKiBmbG9hdGluZyBwb2ludCBxdWV1ZSAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZxIiwgMykgPT0gMCkKLQkJewotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1EnOgkJLyogY29wcm9jZXNzb3IgcXVldWUgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVjcSIsIDMpID09IDApCi0JCXsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdTJzoKLQkgICAgICBpZiAoc3RyY21wIChzdHIsICJzZXQiKSA9PSAwCi0JCSAgfHwgc3RyY21wIChzdHIsICJzZXR1dyIpID09IDApCi0JCXsKLQkJICBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfU0VUOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChzdHIsICJzZXRzdyIpID09IDApCi0JCXsKLQkJICBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfU0VUU1c7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHN0ciwgInNldHgiKSA9PSAwKQotCQl7Ci0JCSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX1NFVFg7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChzdHIsICJmZGl2IiwgNCkgPT0gMCkKLQkJewotCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9GRElWOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnbyc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlYXNpIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3MnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZwcnMiLCA1KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDU7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnRSc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlY2NyIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3QnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXRiciIsIDQpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICd3JzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV3aW0iLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgewotCQljaGFyICpwdXNoID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQlleHByZXNzaW9uUyBlOwotCi0JCWlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0JCWV4cHJlc3Npb24gKCZlKTsKLQkJaWYgKGUuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgIHsKLQkJICAgIGludCBuID0gZS5YX2FkZF9udW1iZXI7Ci0JCSAgICBpZiAobiAhPSBlLlhfYWRkX251bWJlciB8fCAobiAmIH4weDFmZikgIT0gMCkKLQkJICAgICAgYXNfYmFkIChfKCJPUEYgaW1tZWRpYXRlIG9wZXJhbmQgb3V0IG9mIHJhbmdlICgwLTB4MWZmKSIpKTsKLQkJICAgIGVsc2UKLQkJICAgICAgb3Bjb2RlIHw9IGUuWF9hZGRfbnVtYmVyIDw8IDU7Ci0JCSAgfQotCQllbHNlCi0JCSAgYXNfYmFkIChfKCJub24taW1tZWRpYXRlIE9QRiBvcGVyYW5kLCBpZ25vcmVkIikpOwotCQlzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQlpbnB1dF9saW5lX3BvaW50ZXIgPSBwdXNoOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgY2FzZSAneSc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIleSIsIDIpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gMjsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICd1JzoKLQkgICAgY2FzZSAnVSc6Ci0JICAgICAgewotCQkvKiBQYXJzZSBhIHNwYXJjbGV0IGNwcmVnLiAgKi8KLQkJaW50IGNwcmVnOwotCQlpZiAoISBwYXJzZV9rZXl3b3JkX2FyZyAoc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnLCAmcywgJmNwcmVnKSkKLQkJICB7Ci0JCSAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIGNwcmVnIG5hbWUiKTsKLQkJICAgIGdvdG8gZXJyb3I7Ci0JCSAgfQotCQlvcGNvZGUgfD0gKCphcmdzID09ICdVJyA/IFJTMSAoY3ByZWcpIDogUkQgKGNwcmVnKSk7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLQkgICAgfQkJCS8qIHN3aXRjaCBvbiBhcmcgY29kZSAqLwotCi0JICAvKiBCcmVhayBvdXQgb2YgZm9yKCkgbG9vcC4gICovCi0JICBicmVhazsKLQl9CQkJLyogZm9yIGVhY2ggYXJnIHRoYXQgd2UgZXhwZWN0ICovCi0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotCXsKLQkgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICovCi0JICBpZiAoJmluc25bMV0gLSBzcGFyY19vcGNvZGVzIDwgc3BhcmNfbnVtX29wY29kZXMKLQkgICAgICAmJiAoaW5zbi0+bmFtZSA9PSBpbnNuWzFdLm5hbWUKLQkJICB8fCAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKSkKLQkgICAgewotCSAgICAgICsraW5zbjsKLQkgICAgICBzID0gYXJnc1N0YXJ0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHMlcyIpLCBlcnJvcl9tZXNzYWdlKTsKLQkgICAgICByZXR1cm4gc3BlY2lhbF9jYXNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGhhdmUgYSBtYXRjaC4gIE5vdyBzZWUgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBvay4gICovCi0JICBpbnQgbmVlZGVkX2FyY2hfbWFzayA9IGluc24tPmFyY2hpdGVjdHVyZTsKLQotCSAgaWYgKHY5X2FyZ19wKQotCSAgICB7Ci0JICAgICAgbmVlZGVkX2FyY2hfbWFzayAmPSB+ICgoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQkJCQkgICAgIHwgKDEgPDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKSk7Ci0JICAgICAgbmVlZGVkX2FyY2hfbWFzayB8PSAoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOSk7Ci0JICAgIH0KLQotCSAgaWYgKG5lZWRlZF9hcmNoX21hc2sgJiBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JICAgIDsgLyogb2sgKi8KLQkgIC8qIENhbiB3ZSBidW1wIHVwIHRoZSBhcmNoaXRlY3R1cmU/ICAqLwotCSAgZWxzZSBpZiAobmVlZGVkX2FyY2hfbWFzayAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKG1heF9hcmNoaXRlY3R1cmUpKQotCSAgICB7Ci0JICAgICAgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgbmVlZGVkX2FyY2hpdGVjdHVyZSA9Ci0JCXNwYXJjX2ZmcyAoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAobWF4X2FyY2hpdGVjdHVyZSkKLQkJCSAgICYgbmVlZGVkX2FyY2hfbWFzayk7Ci0KLQkgICAgICBhc3NlcnQgKG5lZWRlZF9hcmNoaXRlY3R1cmUgPD0gU1BBUkNfT1BDT0RFX0FSQ0hfTUFYKTsKLQkgICAgICBpZiAod2Fybl9vbl9idW1wCi0JCSAgJiYgbmVlZGVkX2FyY2hpdGVjdHVyZSA+IHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiYXJjaGl0ZWN0dXJlIGJ1bXBlZCBmcm9tIFwiJXNcIiB0byBcIiVzXCIgb24gXCIlc1wiIiksCi0JCQkgICBzcGFyY19vcGNvZGVfYXJjaHNbY3VycmVudF9hcmNoaXRlY3R1cmVdLm5hbWUsCi0JCQkgICBzcGFyY19vcGNvZGVfYXJjaHNbbmVlZGVkX2FyY2hpdGVjdHVyZV0ubmFtZSwKLQkJCSAgIHN0cik7Ci0JCSAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUgPSBuZWVkZWRfYXJjaGl0ZWN0dXJlOwotCQl9Ci0JICAgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgPSBuZWVkZWRfYXJjaGl0ZWN0dXJlOwotCSAgICB9Ci0JICAvKiBDb25mbGljdC4gICovCi0JICAvKiA/Pz8gVGhpcyBzZWVtcyB0byBiZSBhIGJpdCBmcmFnaWxlLiAgV2hhdCBpZiB0aGUgbmV4dCBlbnRyeSBpbgotCSAgICAgdGhlIG9wY29kZSB0YWJsZSBpcyB0aGUgb25lIHdlIHdhbnQgYW5kIGl0IGlzIHN1cHBvcnRlZD8KLQkgICAgIEl0IGlzIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIHRhYmxlIHRvZGF5IHNvIHRoYXQgdGhpcyBjYW4ndAotCSAgICAgaGFwcGVuIGJ1dCB3aGF0IGFib3V0IHRvbW9ycm93PyAgKi8KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBhcmNoLHByaW50ZWRfb25lX3AgPSAwOwotCSAgICAgIGNoYXIgKnA7Ci0JICAgICAgY2hhciByZXF1aXJlZF9hcmNoc1tTUEFSQ19PUENPREVfQVJDSF9NQVggKiAxNl07Ci0KLQkgICAgICAvKiBDcmVhdGUgYSBsaXN0IG9mIHRoZSBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCB0aGUgaW5zbi4gICovCi0JICAgICAgbmVlZGVkX2FyY2hfbWFzayAmPSB+IFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKG1heF9hcmNoaXRlY3R1cmUpOwotCSAgICAgIHAgPSByZXF1aXJlZF9hcmNoczsKLQkgICAgICBhcmNoID0gc3BhcmNfZmZzIChuZWVkZWRfYXJjaF9tYXNrKTsKLQkgICAgICB3aGlsZSAoKDEgPDwgYXJjaCkgPD0gbmVlZGVkX2FyY2hfbWFzaykKLQkJewotCQkgIGlmICgoMSA8PCBhcmNoKSAmIG5lZWRlZF9hcmNoX21hc2spCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwcmludGVkX29uZV9wKQotCQkJKnArKyA9ICd8JzsKLQkJICAgICAgc3RyY3B5IChwLCBzcGFyY19vcGNvZGVfYXJjaHNbYXJjaF0ubmFtZSk7Ci0JCSAgICAgIHAgKz0gc3RybGVuIChwKTsKLQkJICAgICAgcHJpbnRlZF9vbmVfcCA9IDE7Ci0JCSAgICB9Ci0JCSAgKythcmNoOwotCQl9Ci0KLQkgICAgICBhc19iYWQgKF8oIkFyY2hpdGVjdHVyZSBtaXNtYXRjaCBvbiBcIiVzXCIuIiksIHN0cik7Ci0JICAgICAgYXNfdHNrdHNrIChfKCIgKFJlcXVpcmVzICVzOyByZXF1ZXN0ZWQgYXJjaGl0ZWN0dXJlIGlzICVzLikiKSwKLQkJCSByZXF1aXJlZF9hcmNocywKLQkJCSBzcGFyY19vcGNvZGVfYXJjaHNbbWF4X2FyY2hpdGVjdHVyZV0ubmFtZSk7Ci0JICAgICAgcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkgICAgfQotCX0gLyogaWYgbm8gbWF0Y2ggKi8KLQotICAgICAgYnJlYWs7Ci0gICAgfSAvKiBmb3JldmVyIGxvb2tpbmcgZm9yIGEgbWF0Y2ggKi8KLQotICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7Ci0gIHJldHVybiBzcGVjaWFsX2Nhc2U7Ci19Ci0KLS8qIFBhcnNlIGFuIGFyZ3VtZW50IHRoYXQgY2FuIGJlIGV4cHJlc3NlZCBhcyBhIGtleXdvcmQuCi0gICAoZWc6ICNTdG9yZVN0b3JlIG9yICVjY2ZyKS4KLSAgIFRoZSByZXN1bHQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4KLSAgIElmIHN1Y2Nlc3NmdWwsIElOUFVUX1BPSU5URVIgaXMgdXBkYXRlZC4gICovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX2tleXdvcmRfYXJnIChsb29rdXBfZm4sIGlucHV0X3BvaW50ZXJQLCB2YWx1ZVApCi0gICAgIGludCAoKmxvb2t1cF9mbikgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0gICAgIGNoYXIgKippbnB1dF9wb2ludGVyUDsKLSAgICAgaW50ICp2YWx1ZVA7Ci17Ci0gIGludCB2YWx1ZTsKLSAgY2hhciBjLCAqcCwgKnE7Ci0KLSAgcCA9ICppbnB1dF9wb2ludGVyUDsKLSAgZm9yIChxID0gcCArICgqcCA9PSAnIycgfHwgKnAgPT0gJyUnKTsKLSAgICAgICBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnEpIHx8ICpxID09ICdfJzsKLSAgICAgICArK3EpCi0gICAgY29udGludWU7Ci0gIGMgPSAqcTsKLSAgKnEgPSAwOwotICB2YWx1ZSA9ICgqbG9va3VwX2ZuKSAocCk7Ci0gICpxID0gYzsKLSAgaWYgKHZhbHVlID09IC0xKQotICAgIHJldHVybiAwOwotICAqdmFsdWVQID0gdmFsdWU7Ci0gICppbnB1dF9wb2ludGVyUCA9IHE7Ci0gIHJldHVybiAxOwotfQotCi0vKiBQYXJzZSBhbiBhcmd1bWVudCB0aGF0IGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbi4KLSAgIFRoZSByZXN1bHQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX2NvbnN0X2V4cHJfYXJnIChpbnB1dF9wb2ludGVyUCwgdmFsdWVQKQotICAgICBjaGFyICoqaW5wdXRfcG9pbnRlclA7Ci0gICAgIGludCAqdmFsdWVQOwotewotICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gKmlucHV0X3BvaW50ZXJQOwotICAvKiBUaGUgbmV4dCBleHByZXNzaW9uIG1heSBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGNvbnN0YW50Ci0gICAgIChzYXkgaWYgd2UncmUgbm90IHByb2Nlc3NpbmcgdGhlIHJpZ2h0IHZhcmlhbnQgb2YgdGhlIGluc24pLgotICAgICBEb24ndCBjYWxsIGV4cHJlc3Npb24gdW5sZXNzIHdlJ3JlIHN1cmUgaXQgd2lsbCBzdWNjZWVkIGFzIGl0IHdpbGwKLSAgICAgc2lnbmFsIGFuIGVycm9yICh3aGljaCB3ZSB3YW50IHRvIGRlZmVyIHVudGlsIGxhdGVyKS4gICovCi0gIC8qIEZJWE1FOiBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gZGVmaW5lIG1kX29wZXJhbmQgYW5kIGhhdmUgaXQgcmVjb2duaXplCi0gICAgIHRoaW5ncyBsaWtlICVhc2ksIGV0Yy4gYnV0IGNvbnRpbnVpbmcgdGhhdCByb3V0ZSB0aHJvdWdoIHRvIHRoZSBlbmQKLSAgICAgaXMgYSBsb3Qgb2Ygd29yay4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICclJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgKmlucHV0X3BvaW50ZXJQID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICByZXR1cm4gMDsKLSAgKnZhbHVlUCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0gIHJldHVybiAxOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIHNwYXJjX2lwIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfZXhwcmVzc2lvbiAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0gIHNlZ1Qgc2VnOwotCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7Ci0gIGlmIChzZWcgIT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHRleHRfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IGRhdGFfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IGJzc19zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0gICAgewotICAgICAgdGhlX2luc24uZXJyb3IgPSBfKCJiYWQgc2VnbWVudCIpOwotICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbWRfYXNzZW1ibGUgdG8gb3V0cHV0IG9uZSBpbnNuLiAgKi8KLQotc3RhdGljIHZvaWQKLW91dHB1dF9pbnNuIChpbnNuLCB0aGVfaW5zbikKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLSAgICAgc3RydWN0IHNwYXJjX2l0ICp0aGVfaW5zbjsKLXsKLSAgY2hhciAqdG9QID0gZnJhZ19tb3JlICg0KTsKLQotICAvKiBwdXQgb3V0IHRoZSBvcGNvZGUgKi8KLSAgaWYgKElOU05fQklHX0VORElBTikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICh0b1AsICh2YWx1ZVQpIHRoZV9pbnNuLT5vcGNvZGUsIDQpOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAodG9QLCAodmFsdWVUKSB0aGVfaW5zbi0+b3Bjb2RlLCA0KTsKLQotICAvKiBwdXQgb3V0IHRoZSBzeW1ib2wtZGVwZW5kZW50IHN0dWZmICovCi0gIGlmICh0aGVfaW5zbi0+cmVsb2MgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgewotICAgICAgZml4UyAqZml4UCA9ICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCS8qIHdoaWNoIGZyYWcgKi8KLQkJCQkgKHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwJLyogd2hlcmUgKi8KLQkJCQkgNCwJCS8qIHNpemUgKi8KLQkJCQkgJnRoZV9pbnNuLT5leHAsCi0JCQkJIHRoZV9pbnNuLT5wY3JlbCwKLQkJCQkgdGhlX2luc24tPnJlbG9jKTsKLSAgICAgIC8qIFR1cm4gb2ZmIG92ZXJmbG93IGNoZWNraW5nIGluIGZpeHVwX3NlZ21lbnQuICBXZSdsbCBkbyBvdXIKLQkgb3duIG92ZXJmbG93IGNoZWNraW5nIGluIG1kX2FwcGx5X2ZpeDMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlCi0JIHRoZSBpbnNuIHNpemUgaXMgNCBhbmQgZml4dXBfc2VnbWVudCB3aWxsIHNpZ25hbCBhbiBvdmVyZmxvdyBmb3IKLQkgbGFyZ2UgOCBieXRlIHF1YW50aXRpZXMuICAqLwotICAgICAgZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotICAgICAgaWYgKHRoZV9pbnNuLT5yZWxvYyA9PSBCRkRfUkVMT0NfU1BBUkNfT0xPMTApCi0JZml4UC0+dGNfZml4X2RhdGEgPSB0aGVfaW5zbi0+ZXhwMi5YX2FkZF9udW1iZXI7Ci0gICAgfQotCi0gIGxhc3RfaW5zbiA9IGluc247Ci0gIGxhc3Rfb3Bjb2RlID0gdGhlX2luc24tPm9wY29kZTsKLX0KLQwKLS8qCi0gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBtZF9hdG9mIGluIG02OGsuYy4gIEkgdGhpbmsgdGhpcyBpcyByaWdodCwKLSAgYnV0IEknbSBub3Qgc3VyZS4KLQotICBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgaSxwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCSAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZSBpZiAodGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YQotCSAgICYmICgobiA9PSA0IHx8IG4gPT0gMikgJiYgfm5vd19zZWctPmZsYWdzICYgU0VDX0FMTE9DKSkKLSAgICAvKiBPdXRwdXQgZGVidWcgd29yZHMsIHdoaWNoIGFyZSBub3QgaW4gYWxsb2NhdGVkIHNlY3Rpb25zLCBhcyBiaWcgZW5kaWFuICovCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlIGlmICh0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhIHx8ICEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotDAotLyogQXBwbHkgYSBmaXhTIHRvIHRoZSBmcmFncywgbm93IHRoYXQgd2Uga25vdyB0aGUgdmFsdWUgaXQgb3VnaHQgdG8KLSAgIGhvbGQuICovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsdWUsIHNlZ21lbnQpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWU7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBvZmZzZXRUIHZhbDsKLSAgbG9uZyBpbnNuOwotCi0gIHZhbCA9ICp2YWx1ZTsKLQotICBhc3NlcnQgKGZpeFAtPmZ4X3JfdHlwZSA8IEJGRF9SRUxPQ19VTlVTRUQpOwotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIGVtaXRfcmVsb2MgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogRklYTUU6IFNQQVJDIEVMRiByZWxvY2F0aW9ucyBkb24ndCB1c2UgYW4gYWRkZW5kIGluIHRoZSBkYXRhCi0gICAgIGZpZWxkIGl0c2VsZi4gIFRoaXMgd2hvbGUgYXBwcm9hY2ggc2hvdWxkIGJlIHNvbWVob3cgY29tYmluZWQKLSAgICAgd2l0aCB0aGUgY2FsbHMgdG8gYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gIEFsc28sIHRoZSB2YWx1ZSBwYXNzZWQKLSAgICAgaW4gYnkgZml4dXBfc2VnbWVudCBpbmNsdWRlcyB0aGUgdmFsdWUgb2YgYSBkZWZpbmVkIHN5bWJvbC4gIFdlCi0gICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgdmFsdWUgb2YgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbC4gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChmaXhQLT5meF9hZGRzeSkKLQkgICYmIChTX0lTX0VYVEVSTkFMIChmaXhQLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IChzcGFyY19waWNfY29kZSAmJiAhIGZpeFAtPmZ4X3BjcmVsKQotCSAgICAgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnbWVudAotCQkgICYmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsCi0JCQkJCSAgICAgIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkKLQkJICAgICAgICYgU0VDX0xJTktfT05DRSkgIT0gMAotCQkgICAgICB8fCBzdHJuY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSksCi0JCQkJICAiLmdudS5saW5rb25jZSIsCi0JCQkJICBzaXplb2YgIi5nbnUubGlua29uY2UiIC0gMSkgPT0gMCkpKQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IGFic29sdXRlX3NlY3Rpb24KLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSB1bmRlZmluZWRfc2VjdGlvbgotCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkpCi0JZml4UC0+ZnhfYWRkbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBUaGlzIGlzIGEgaGFjay4gIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8KLSAgICAgaGFuZGxlIHRoaXMuICBQcm9iYWJseSBpbiB0ZXJtcyBvZiBob3d0byBmaWVsZHMsIG9uY2UKLSAgICAgd2UgY2FuIGxvb2sgYXQgdGhlc2UgZml4dXBzIGluIHRlcm1zIG9mIGhvd3Rvcy4gICovCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHZhbCArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0KLSNpZmRlZiBPQkpfQU9VVAotICAvKiBGSVhNRTogTW9yZSByaWRpY3Vsb3VzIGdhcyByZWxvYyBoYWNraW5nLiAgSWYgd2UgYXJlIGdvaW5nIHRvCi0gICAgIGdlbmVyYXRlIGEgcmVsb2MsIHRoZW4gd2UganVzdCB3YW50IHRvIGxldCB0aGUgcmVsb2MgYWRkZW5kIHNldAotICAgICB0aGUgdmFsdWUuICBXZSBkbyBub3Qgd2FudCB0byBhbHNvIHN0dWZmIHRoZSBhZGRlbmQgaW50byB0aGUKLSAgICAgb2JqZWN0IGZpbGUuICBJbmNsdWRpbmcgdGhlIGFkZGVuZCBpbiB0aGUgb2JqZWN0IGZpbGUgd29ya3Mgd2hlbgotICAgICBkb2luZyBhIHN0YXRpYyBsaW5rLCBiZWNhdXNlIHRoZSBsaW5rZXIgd2lsbCBpZ25vcmUgdGhlIG9iamVjdAotICAgICBmaWxlIGNvbnRlbnRzLiAgSG93ZXZlciwgdGhlIGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGlnbm9yZSB0aGUKLSAgICAgb2JqZWN0IGZpbGUgY29udGVudHMuICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgZml4UC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMikKLSAgICB2YWwgPSAwOwotCi0gIC8qIFdoZW4gZ2VuZXJhdGluZyBQSUMgY29kZSwgd2UgZG8gbm90IHdhbnQgYW4gYWRkZW5kIGZvciBhIHJlbG9jCi0gICAgIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wuICBXZSBhZGp1c3QgZnhfYWRkbnVtYmVyIHRvIGNhbmNlbCBvdXQgdGhlCi0gICAgIHZhbHVlIGFscmVhZHkgaW5jbHVkZWQgaW4gdmFsLCBhbmQgdG8gYWxzbyBjYW5jZWwgb3V0IHRoZQotICAgICBhZGp1c3RtZW50IHdoaWNoIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd2lsbCBjcmVhdGUuICAqLwotICBpZiAoc3BhcmNfcGljX2NvZGUKLSAgICAgICYmIGZpeFAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzJfUENSRUxfUzIKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmICEgU19JU19DT01NT04gKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgJiYgc3ltYm9sX3NlY3Rpb25fcCAoZml4UC0+ZnhfYWRkc3kpKQotICAgIGZpeFAtPmZ4X2FkZG51bWJlciAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLQotICAvKiBXaGVuIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG5lZWQgdG8gZmlkZGxlIHRvIGdldAotICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHRvIGRvIHRoZSByaWdodCB0aGluZyBmb3IgYSBQQyByZWxhdGl2ZQotICAgICByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBrZWVwLiAgKi8KLSAgaWYgKHNwYXJjX3BpY19jb2RlCi0gICAgICAmJiBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi0gICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiAoU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCi0JICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiAhIFNfSVNfQ09NTU9OIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgdmFsID0gMDsKLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBJZiB0aGlzIGlzIGEgZGF0YSByZWxvY2F0aW9uLCBqdXN0IG91dHB1dCBWQUwuICAqLwotCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIDIpOwotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMgotCSAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU1BBUkNfUkVWMzIpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgNCk7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzY0KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIDgpOwotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCAKLSAgICAgICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgewotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJdCdzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIGluc3RydWN0aW9uLiAgKi8KLQotICAgICAgaWYgKElOU05fQklHX0VORElBTikKLQlpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICAKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMjoKLQkgIHZhbCA9IHZhbCA+PiAyOwotCSAgLyogRklYTUU6IFRoaXMgaW5jcmVtZW50LWJ5LW9uZSBkZXNlcnZlcyBhIGNvbW1lbnQgb2Ygd2h5IGl0J3MKLQkgICAgIGJlaW5nIGRvbmUhICAqLwotCSAgaWYgKCEgc3BhcmNfcGljX2NvZGUKLQkgICAgICB8fCBmaXhQLT5meF9hZGRzeSA9PSBOVUxMCi0JICAgICAgfHwgc3ltYm9sX3NlY3Rpb25fcCAoZml4UC0+ZnhfYWRkc3kpKQotCSAgICArK3ZhbDsKLQkgIGluc24gfD0gdmFsICYgMHgzZmZmZmZmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfMTE6Ci0JICBpZiAoISBpbl9zaWduZWRfcmFuZ2UgKHZhbCwgMHg3ZmYpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9IHZhbCAmIDB4N2ZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ18xMDoKLQkgIGlmICghIGluX3NpZ25lZF9yYW5nZSAodmFsLCAweDNmZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHgzZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzc6Ci0JICBpZiAoISBpbl9iaXRmaWVsZF9yYW5nZSAodmFsLCAweDdmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDdmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ182OgotCSAgaWYgKCEgaW5fYml0ZmllbGRfcmFuZ2UgKHZhbCwgMHgzZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHgzZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfNToKLQkgIGlmICghIGluX2JpdGZpZWxkX3JhbmdlICh2YWwsIDB4MWYpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9IHZhbCAmIDB4MWY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTY6Ci0JICAvKiBGSVhNRTogc2ltcGxpZnkgKi8KLQkgIGlmICgoKHZhbCA+IDApICYmICh2YWwgJiB+MHgzZmZmYykpCi0JICAgICAgfHwgKCh2YWwgPCAwKSAmJiAofih2YWwgLSAxKSAmIH4weDNmZmZjKSkpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIC8qIEZJWE1FOiBUaGUgKzEgZGVzZXJ2ZXMgYSBjb21tZW50LiAgKi8KLQkgIHZhbCA9ICh2YWwgPj4gMikgKyAxOwotCSAgaW5zbiB8PSAoKHZhbCAmIDB4YzAwMCkgPDwgNikgfCAodmFsICYgMHgzZmZmKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOToKLQkgIC8qIEZJWE1FOiBzaW1wbGlmeSAqLwotCSAgaWYgKCgodmFsID4gMCkgJiYgKHZhbCAmIH4weDFmZmZmYykpCi0JICAgICAgfHwgKCh2YWwgPCAwKSAmJiAofih2YWwgLSAxKSAmIH4weDFmZmZmYykpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICAvKiBGSVhNRTogVGhlICsxIGRlc2VydmVzIGEgY29tbWVudC4gICovCi0JICB2YWwgPSAodmFsID4+IDIpICsgMTsKLQkgIGluc24gfD0gdmFsICYgMHg3ZmZmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfSEgyMjoKLQkgIHZhbCA9IEJTUiAodmFsLCAzMik7Ci0JICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE0yMjoKLQljYXNlIEJGRF9SRUxPQ19ISTIyOgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIGluc24gfD0gKHZhbCA+PiAxMCkgJiAweDNmZmZmZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IE5lZWQgY29tbWVudCBleHBsYWluaW5nIHdoeSB3ZSBkbyB0aGlzLiAgKi8KLQkgICAgICBpbnNuICY9IH4weGZmZmY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkMyMjoKLQkgIGlmICh2YWwgJiB+MHgwMDNmZmZmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSAodmFsICYgMHgzZmZmZmYpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19ITTEwOgotCSAgdmFsID0gQlNSICh2YWwsIDMyKTsKLQkgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQljYXNlIEJGRF9SRUxPQ19MTzEwOgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIGluc24gfD0gdmFsICYgMHgzZmY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBOZWVkIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgd2UgZG8gdGhpcy4gICovCi0JICAgICAgaW5zbiAmPSB+MHhmZjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19PTE8xMDoKLQkgIHZhbCAmPSAweDNmZjsKLQkgIHZhbCArPSBmaXhQLT50Y19maXhfZGF0YTsKLQkgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQzEzOgotCSAgaWYgKCEgaW5fc2lnbmVkX3JhbmdlICh2YWwsIDB4MWZmZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHgxZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyOgotCSAgdmFsID0gKHZhbCA+PiAyKSArIDE7Ci0JICAvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0JBU0UyMjoKLQkgIGluc24gfD0gdmFsICYgMHgzZmZmZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0g0NDoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHR2YWwgPSB2YWw7Ci0JICAgICAgdHZhbCA+Pj0gMjI7Ci0JICAgICAgaW5zbiB8PSB0dmFsICYgMHgzZmZmZmY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfTTQ0OgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgaW5zbiB8PSAodmFsID4+IDEyKSAmIDB4M2ZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19MNDQ6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICBpbnNuIHw9IHZhbCAmIDB4ZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19ISVgyMjoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIHsKLQkgICAgICB2YWwgXj0gfiAob2Zmc2V0VCkgMDsKLQkgICAgICBpbnNuIHw9ICh2YWwgPj4gMTApICYgMHgzZmZmZmY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE9YMTA6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICBpbnNuIHw9IDB4MWMwMCB8ICh2YWwgJiAweDNmZik7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX05PTkU6Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCV8oImJhZCBvciB1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiKSwKLQkJCWZpeFAtPmZ4X3JfdHlwZSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChJTlNOX0JJR19FTkRJQU4pCi0JYmZkX3B1dGIzMiAoaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyIChpbnNuLCAodW5zaWduZWQgY2hhciAqKSBidWYpOwotICAgIH0KLQotICAvKiBBcmUgd2UgZmluaXNoZWQgd2l0aCB0aGlzIHJlbG9jYXRpb24gbm93PyAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgIWZpeFAtPmZ4X3BjcmVsKQotICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKLSAgIGZvcm1hdC4gICovCi1hcmVsZW50ICoqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhwOwotewotICBzdGF0aWMgYXJlbGVudCAqcmVsb2NzWzNdOwotICBhcmVsZW50ICpyZWxvYzsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgcmVsb2NzWzBdID0gcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2NzWzFdID0gTlVMTDsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTIyOgotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUxfUzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkMxMzoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQzIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMzoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ181OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfNzoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ18xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ18xMToKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ISDIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hNMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE0yMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19QQ19ISDIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19INDQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTTQ0OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0w0NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ISVgyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MT1gxMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19SRVYzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19PTE8xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX0FPVVQpCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIFBJQyBjb2RlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgZGlmZmVyZW50Ci0gICAgIHNldCBvZiByZWxvY3MuICAqLwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBHT1RfTkFNRSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotI2Vsc2UKLSNkZWZpbmUgR09UX05BTUUgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZW5kaWYKLQotICAvKiBUaGlzIGNvZGUgbXVzdCBiZSBwYXJhbGxlbCB0byB0aGUgT0JKX0VMRiB0Y19maXhfYWRqdXN0YWJsZS4gICovCi0KLSAgaWYgKHNwYXJjX3BpY19jb2RlKQotICAgIHsKLSAgICAgIHN3aXRjaCAoY29kZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfMzJfUENSRUxfUzI6Ci0JICBpZiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IFNfSVNfQ09NTU9OIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX0VYVEVSTkFMIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KSkKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19XUExUMzA7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ19ISTIyOgotCSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSwgR09UX05BTUUpID09IDApCi0JICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfUEMyMjsKLQkgIGVsc2UKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19HT1QyMjsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0JICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpLCBHT1RfTkFNRSkgPT0gMCkKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19QQzEwOwotCSAgZWxzZQotCSAgICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX0dPVDEwOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfU1BBUkMxMzoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfR09UMTM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQU9VVCkgKi8KLQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfT0xPMTApCi0gICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ19MTzEwKTsKLSAgZWxzZQotICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiKSwKLQkJICAgIGZpeHAtPmZ4X3JfdHlwZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIHhmcmVlIChyZWxvYyk7Ci0gICAgICByZWxvY3NbMF0gPSBOVUxMOwotICAgICAgcmV0dXJuIHJlbG9jczsKLSAgICB9Ci0KLSAgLyogQEAgV2h5IGZ4X2FkZG51bWJlciBzb21ldGltZXMgYW5kIGZ4X29mZnNldCBvdGhlciB0aW1lcz8gICovCi0jaWZkZWYgT0JKX0FPVVQKLQotICBpZiAocmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSA9PSAwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzEwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzIyKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UgaWYgKHNwYXJjX3BpY19jb2RlCi0JICAgJiYgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgotCSAgICYmIGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAmJiAoU19JU19FWFRFUk5BTCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgICAgIHx8IFNfSVNfV0VBSyAoZml4cC0+ZnhfYWRkc3kpKQotCSAgICYmIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgJiYgISBTX0lTX0NPTU1PTiAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0IC0gcmVsb2MtPmFkZHJlc3M7Ci0KLSNlbHNlIC8qIGVsZiBvciBjb2ZmICovCi0KLSAgaWYgKHJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUgPT0gMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMxMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMyMikKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlIGlmIChzeW1ib2xfc2VjdGlvbl9wIChmaXhwLT5meF9hZGRzeSkpCi0gICAgcmVsb2MtPmFkZGVuZCA9IChzZWN0aW9uLT52bWEKLQkJICAgICArIGZpeHAtPmZ4X2FkZG51bWJlcgotCQkgICAgICsgbWRfcGNyZWxfZnJvbSAoZml4cCkpOwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSNlbmRpZgotCi0gIC8qIFdlIGV4cGFuZCBSX1NQQVJDX09MTzEwIHRvIFJfU1BBUkNfTE8xMCBhbmQgUl9TUEFSQ18xMwotICAgICBvbiB0aGUgc2FtZSBsb2NhdGlvbi4gICovCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19PTE8xMCkKLSAgICB7Ci0gICAgICByZWxvY3NbMV0gPSByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgcmVsb2NzWzJdID0gTlVMTDsKLQotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKSk7Ci0gICAgICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfU1BBUkMxMyk7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+dGNfZml4X2RhdGE7Ci0gICAgfQotCi0gIHJldHVybiByZWxvY3M7Ci19Ci0MCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19CQkJCS8qIG1kX3VuZGVmaW5lZF9zeW1ib2woKSAqLwotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0jaWZuZGVmIE9CSl9FTEYKLSAgLyogVGhpcyBpcyBub3QgcmlnaHQgZm9yIEVMRjsgYS5vdXQgd2FudHMgaXQsIGFuZCBDT0ZGIHdpbGwgZm9yY2UKLSAgICAgdGhlIGFsaWdubWVudCBhbnl3YXlzLiAgKi8KLSAgdmFsdWVUIGFsaWduID0gKCh2YWx1ZVQpIDEKLQkJICA8PCAodmFsdWVUKSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpKTsKLSAgdmFsdWVUIG5ld3NpemU7Ci0gIC8qIHR1cm4gYWxpZ25tZW50IHZhbHVlIGludG8gYSBtYXNrICovCi0gIGFsaWduLS07Ci0gIG5ld3NpemUgPSAoc2l6ZSArIGFsaWduKSAmIH5hbGlnbjsKLSAgcmV0dXJuIG5ld3NpemU7Ci0jZWxzZQotICByZXR1cm4gc2l6ZTsKLSNlbmRpZgotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgc3BhcmMsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cwotICAgaXRzIHNpemUuICBUaGlzIGdldHMgdXMgdG8gdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4KLSAgICg/Pz8gSXMgdGhpcyByaWdodD8gIEZJWE1FLVNPT04pICovCi1sb25nIAotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotICBpZiAoISBzcGFyY19waWNfY29kZQotICAgICAgfHwgZml4UC0+ZnhfYWRkc3kgPT0gTlVMTAotICAgICAgfHwgc3ltYm9sX3NlY3Rpb25fcCAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldCArPSBmaXhQLT5meF9zaXplOwotICByZXR1cm4gcmV0OwotfQotDAotLyogUmV0dXJuIGxvZzIgKFZBTFVFKSwgb3IgLTEgaWYgVkFMVUUgaXMgbm90IGFuIGV4YWN0IHBvc2l0aXZlIHBvd2VyCi0gICBvZiB0d28uICAqLwotCi1zdGF0aWMgaW50Ci1sb2cyICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICBpbnQgc2hpZnQ7Ci0KLSAgaWYgKHZhbHVlIDw9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoc2hpZnQgPSAwOyAodmFsdWUgJiAxKSA9PSAwOyB2YWx1ZSA+Pj0gMSkKLSAgICArK3NoaWZ0OwotCi0gIHJldHVybiAodmFsdWUgPT0gMSkgPyBzaGlmdCA6IC0xOwotfQotCi0vKgotICogc29ydCBvZiBsaWtlIHNfbGNvbW0KLSAqLwotCi0jaWZuZGVmIE9CSl9FTEYKLXN0YXRpYyBpbnQgbWF4X2FsaWdubWVudCA9IDE1OwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1zX3Jlc2VydmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqcDsKLSAgY2hhciBjOwotICBpbnQgYWxpZ247Ci0gIGludCBzaXplOwotICBpbnQgdGVtcDsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoKHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgc2l6ZSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogYmFkIGxlbmd0aCAqLwotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIixcImJzc1wiIiwgNikgIT0gMAotICAgICAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLFwiLmJzc1wiIiwgNykgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCAucmVzZXJ2ZSBzZWdtZW50IC0tIGV4cGVjdGVkIEJTUyBzZWdtZW50IikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzJdID09ICcuJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNzsKLSAgZWxzZQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyBhbGlnbm1lbnQiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYWxpZ24gPSAoaW50KSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotI2lmbmRlZiBPQkpfRUxGCi0gICAgICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotCXsKLQkgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLQkgIGFzX3dhcm4gKF8oImFsaWdubWVudCB0b28gbGFyZ2U7IGFzc3VtaW5nICVkIiksIGFsaWduKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGFsaWduIDwgMCkKLQl7Ci0JICBhc19iYWQgKF8oIm5lZ2F0aXZlIGFsaWdubWVudCIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoYWxpZ24gIT0gMCkKLQl7Ci0JICB0ZW1wID0gbG9nMiAoYWxpZ24pOwotCSAgaWYgKHRlbXAgPCAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBhbGlnbiA9IHRlbXA7Ci0JfQotCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotICAgIH0KLSAgZWxzZQotICAgIGFsaWduID0gMDsKLQotICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLSNpZmRlZiBPQkpfQU9VVAotICAgICAgJiYgU19HRVRfT1RIRVIgKHN5bWJvbFApID09IDAKLSAgICAgICYmIFNfR0VUX0RFU0MgKHN5bWJvbFApID09IDAKLSNlbmRpZgotICAgICAgKQotICAgIHsKLSAgICAgIGlmICghIG5lZWRfcGFzc18yKQotCXsKLQkgIGNoYXIgKnBmcmFnOwotCSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0JICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDEpOyAvKiBzd2l0Y2ggdG8gYnNzICovCi0KLQkgIGlmIChhbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOyAvKiBkbyBhbGlnbm1lbnQgKi8KLQotCSAgLyogZGV0YWNoIGZyb20gb2xkIGZyYWcgKi8KLQkgIGlmIChTX0dFVF9TRUdNRU5UKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotCSAgICBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSBOVUxMOwotCi0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkwLCBzeW1ib2xQLAotCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKTApOwotCSAgKnBmcmFnID0gMDsKLQotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotCi0JICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0jaWZkZWYgT0JKX0VMRgotCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybigiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sICVzIiwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0gICAgfQkJCQkvKiBpZiBub3QgcmVkZWZpbmluZyAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NvbW1vbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBzaXplOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCi0JewotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmbmRlZiBPQkpfRUxGCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGtub3cgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0gICAgewotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIGlmICh0ZW1wID4gbWF4X2FsaWdubWVudCkKLQl7Ci0JICB0ZW1wID0gbWF4X2FsaWdubWVudDsKLQkgIGFzX3dhcm4gKF8oImFsaWdubWVudCB0b28gbGFyZ2U7IGFzc3VtaW5nICVkIiksIHRlbXApOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAodGVtcCA8IDApCi0JewotCSAgYXNfYmFkIChfKCJuZWdhdGl2ZSBhbGlnbm1lbnQiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsKQotCXsKLQkgIHNlZ1Qgb2xkX3NlYzsKLQkgIGludCBvbGRfc3Vic2VjOwotCSAgY2hhciAqcDsKLQkgIGludCBhbGlnbjsKLQotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLQotCSAgaWYgKHRlbXAgPT0gMCkKLQkgICAgYWxpZ24gPSAwOwotCSAgZWxzZQotCSAgICBhbGlnbiA9IGxvZzIgKHRlbXApOwotCi0JICBpZiAoYWxpZ24gPCAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0JICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAotCQkJKG9mZnNldFQpIHNpemUsIChjaGFyICopIDApOwotCSAgKnAgPSAwOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotCSAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLQkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBPQkpfRUxGICovCi0JewotCWFsbG9jYXRlX2NvbW1vbjoKLQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLSNpZmRlZiBPQkpfRUxGCi0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSNlbmRpZgotCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2NvbV9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSB1c2UgdGhlIGRvdCwgc29tZSBkb24ndC4gIENhbiB3ZSBnZXQgc29tZSBjb25zaXN0ZW5jeT8/ICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJic3NcIiIsIDQpCi0JICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJkYXRhXCIiLCA1KSkKLQl7Ci0JICB3aGlsZSAoKi0taW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQkgICAgOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICBnb3RvIGJhZF9jb21tb25fc2VnbWVudDsKLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICciJykKLQk7Ci0gICAgICBnb3RvIGFsbG9jYXRlX2NvbW1vbjsKLSAgICB9Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLQotICB7Ci0gIGJhZF9jb21tb25fc2VnbWVudDoKLSAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQotICAgICAgcCsrOwotICAgIGMgPSAqcDsKLSAgICAqcCA9ICdcMCc7Ci0gICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICpwID0gYzsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVtcHR5IHBzZXVkby1vcC4gIFRoaXMgc3VwcmVzc2VzIHRoZSB3YXJuaW5ncyBhYm91dAotICAgaW52YWxpZCBkZWxheSBzbG90IHVzYWdlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZW1wdHkgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogVGhlIGVhc3kgd2F5IHRvIGltcGxlbWVudCBpcyB0byBqdXN0IGZvcmdldCBhYm91dCB0aGUgbGFzdAotICAgICBpbnN0cnVjdGlvbi4gICovCi0gIGxhc3RfaW5zbiA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3NlZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcInRleHRcIiIsIDYpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gICAgICBzX3RleHQgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIlwiZGF0YVwiIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJkYXRhMVwiIiwgNykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNzsKLSAgICAgIHNfZGF0YTEgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJic3NcIiIsIDUpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgMiBzZWdtZW50cyAtLSB0ZXh0IGFuZCBkYXRhIC0tIGZvciBub3csIHNvCi0JIHRoaW5ncyBpbiB0aGUgImJzcyBzZWdtZW50IiB3aWxsIGhhdmUgdG8gZ28gaW50byBkYXRhIGZvciBub3cuCi0JIFlvdSBjYW4gc3RpbGwgYWxsb2NhdGUgU0VHX0JTUyBzdHVmZiB3aXRoIC5sY29tbSBvciAucmVzZXJ2ZS4gKi8KLSAgICAgIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgMjU1KTsJLyogRklYTUUtU09NRURBWSAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYXNfYmFkIChfKCJVbmtub3duIHNlZ21lbnQgdHlwZSIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZGF0YTEgKCkKLXsKLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAxKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfcHJvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0vKiBUaGlzIHN0YXRpYyB2YXJpYWJsZSBpcyBzZXQgYnkgc191YWNvbnMgdG8gdGVsbCBzcGFyY19jb25zX2FsaWduCi0gICB0aGF0IHRoZSBleHBlc3Npb24gZG9lcyBub3QgbmVlZCB0byBiZSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIGludCBzcGFyY19ub19hbGlnbl9jb25zID0gMDsKLQotLyogVGhpcyBoYW5kbGVzIHRoZSB1bmFsaWduZWQgc3BhY2UgYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLCBzdWNoIGFzCi0gICAudWF3b3JkLiAgLnVhd29yZCBpcyBqdXN0IGxpa2UgLndvcmQsIGJ1dCB0aGUgdmFsdWUgZG9lcyBub3QgbmVlZAotICAgdG8gYmUgYWxpZ25lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3VhY29ucyAoYnl0ZXMpCi0gICAgIGludCBieXRlczsKLXsKLSAgLyogVGVsbCBzcGFyY19jb25zX2FsaWduIG5vdCB0byBhbGlnbiB0aGlzIHZhbHVlLiAgKi8KLSAgc3BhcmNfbm9fYWxpZ25fY29ucyA9IDE7Ci0gIGNvbnMgKGJ5dGVzKTsKLX0KLQotLyogVGhpcyBoYW5kbGVzIHRoZSBuYXRpdmUgd29yZCBhbGxvY2F0aW9uIHBzZXVkby1vcCAubndvcmQuCi0gICBGb3Igc3BhcmNfYXJjaF9zaXplIDMyIGl0IGlzIGVxdWl2YWxlbnQgdG8gLndvcmQsICBmb3IKLSAgIHNwYXJjX2FyY2hfc2l6ZSA2NCBpdCBpcyBlcXVpdmFsZW50IHRvIC54d29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX25jb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICBjb25zIChzcGFyY19hcmNoX3NpemUgPT0gMzIgPyA0IDogOCk7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBIYW5kbGUgdGhlIFNQQVJDIEVMRiAucmVnaXN0ZXIgcHNldWRvLW9wLiAgVGhpcyBzZXRzIHRoZSBiaW5kaW5nIG9mIGEKLSAgIGdsb2JhbCByZWdpc3Rlci4KLSAgIFRoZSBzeW50YXggaXM6Ci0gICAKLSAgIC5yZWdpc3RlciAlZ1syMzY3XSx7I3NjcmF0Y2h8c3ltYm9sbmFtZXwjaWdub3JlfQotICAgKi8KLQotc3RhdGljIHZvaWQKLXNfcmVnaXN0ZXIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciBjOwotICBpbnQgcmVnOwotICBpbnQgZmxhZ3M7Ci0gIGNvbnN0IGNoYXIgKnJlZ25hbWU7Ci0KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSAhPSAnJScKLSAgICAgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnZycKLSAgICAgIHx8ICgoaW5wdXRfbGluZV9wb2ludGVyWzJdICYgfjEpICE9ICcyJwotCSAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsyXSAmIH4xKSAhPSAnNicpCi0gICAgICB8fCBpbnB1dF9saW5lX3BvaW50ZXJbM10gIT0gJywnKQotICAgIGFzX2JhZCAoXygicmVnaXN0ZXIgc3ludGF4IGlzIC5yZWdpc3RlciAlJWdbMjM2N10seyNzY3JhdGNofHN5bWJvbG5hbWV8I2lnbm9yZX0iKSk7Ci0gIHJlZyA9IGlucHV0X2xpbmVfcG9pbnRlclsyXSAtICcwJzsKLSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmVnbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChzdHJjbXAgKHJlZ25hbWUsICJzY3JhdGNoIikgJiYgc3RyY21wIChyZWduYW1lLCAiaWdub3JlIikpCi0JYXNfYmFkIChfKCJyZWdpc3RlciBzeW50YXggaXMgLnJlZ2lzdGVyICUlZ1syMzY3XSx7I3NjcmF0Y2h8c3ltYm9sbmFtZXwjaWdub3JlfSIpKTsKLSAgICAgIGlmIChyZWduYW1lIFswXSA9PSAnaScpCi0JcmVnbmFtZSA9IE5VTEw7Ci0gICAgICBlbHNlCi0JcmVnbmFtZSA9ICIiOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgfQotICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDY0KQotICAgIHsKLSAgICAgIGlmIChnbG9iYWxzIFtyZWddKQotCXsKLQkgIGlmICgocmVnbmFtZSAmJiBnbG9iYWxzIFtyZWddICE9IChzeW1ib2xTICopMQotCSAgICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGdsb2JhbHMgW3JlZ10pLCByZWduYW1lKSkKLQkgICAgICB8fCAoKHJlZ25hbWUgIT0gTlVMTCkgXiAoZ2xvYmFscyBbcmVnXSAhPSAoc3ltYm9sUyAqKTEpKSkKLQkgICAgYXNfYmFkIChfKCJyZWRlZmluaXRpb24gb2YgZ2xvYmFsIHJlZ2lzdGVyIikpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmVnbmFtZSA9PSBOVUxMKQotCSAgICBnbG9iYWxzIFtyZWddID0gKHN5bWJvbFMgKikxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWduYW1lKQotCQl7Ci0JCSAgaWYgKHN5bWJvbF9maW5kIChyZWduYW1lKSkKLQkJICAgIGFzX2JhZCAoXygiUmVnaXN0ZXIgc3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZC4iKSwKLQkJCSAgICByZWduYW1lKTsKLQkJfQotCSAgICAgIGdsb2JhbHMgW3JlZ10gPSBzeW1ib2xfbWFrZSAocmVnbmFtZSk7Ci0JICAgICAgZmxhZ3MgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZ2xvYmFscyBbcmVnXSktPmZsYWdzOwotCSAgICAgIGlmICghICpyZWduYW1lKQotCQlmbGFncyA9IGZsYWdzICYgfihCU0ZfR0xPQkFMfEJTRl9MT0NBTHxCU0ZfV0VBSyk7Ci0JICAgICAgaWYgKCEgKGZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX0xPQ0FMfEJTRl9XRUFLKSkpCi0JCWZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0JICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKGdsb2JhbHMgW3JlZ10pLT5mbGFncyA9IGZsYWdzOwotCSAgICAgIFNfU0VUX1ZBTFVFIChnbG9iYWxzIFtyZWddLCAodmFsdWVUKXJlZyk7Ci0JICAgICAgU19TRVRfQUxJR04gKGdsb2JhbHMgW3JlZ10sIHJlZyk7Ci0JICAgICAgU19TRVRfU0laRSAoZ2xvYmFscyBbcmVnXSwgMCk7Ci0JICAgICAgLyogQWx0aG91Z2ggd2UgYWN0dWFsbHkgd2FudCB1bmRlZmluZWRfc2VjdGlvbiBoZXJlLAotCQkgd2UgaGF2ZSB0byB1c2UgYWJzb2x1dGVfc2VjdGlvbiwgYmVjYXVzZSBvdGhlcndpc2UKLQkJIGdlbmVyaWMgYXMgY29kZSB3aWxsIG1ha2UgaXQgYSBDT00gc2VjdGlvbi4KLQkJIFdlIGZpeCB0aGlzIHVwIGluIHNwYXJjX2FkanVzdF9zeW10YWIuICAqLwotCSAgICAgIFNfU0VUX1NFR01FTlQgKGdsb2JhbHMgW3JlZ10sIGFic29sdXRlX3NlY3Rpb24pOwotCSAgICAgIFNfU0VUX09USEVSIChnbG9iYWxzIFtyZWddLCAwKTsKLQkgICAgICBlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoZ2xvYmFscyBbcmVnXSkpCi0JCS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvID0KLQkJICBFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfUkVHSVNURVIpOwotCSAgICAgIGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChnbG9iYWxzIFtyZWddKSkKLQkJLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBBZGp1c3QgdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHNldCB1bmRlZmluZWQgc2VjdGlvbnMgZm9yIFNUVF9SRUdJU1RFUgotICAgc3ltYm9scyB3aGljaCBuZWVkIGl0LiAgKi8KLSAgIAotdm9pZAotc3BhcmNfYWRqdXN0X3N5bXRhYiAoKQotewotICBzeW1ib2xTICpzeW07Ci0gICAgIAotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChFTEZfU1RfVFlQRSAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpCi0JCSAgICAgICAtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykgIT0gU1RUX1JFR0lTVEVSKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoRUxGX1NUX1RZUEUgKGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKQotCQkgICAgICAgLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRikpCi0JY29udGludWU7Ci0KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bSwgdW5kZWZpbmVkX3NlY3Rpb24pOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKiBJZiB0aGUgLS1lbmZvcmNlLWFsaWduZWQtZGF0YSBvcHRpb24gaXMgdXNlZCwgd2UgcmVxdWlyZSAud29yZCwKLSAgIGV0LiBhbC4sIHRvIGJlIGFsaWduZWQgY29ycmVjdGx5LiAgV2UgZG8gaXQgYnkgc2V0dGluZyB1cCBhbgotICAgcnNfYWxpZ25fY29kZSBmcmFnLCBhbmQgY2hlY2tpbmcgaW4gSEFORExFX0FMSUdOIHRvIG1ha2Ugc3VyZSB0aGF0Ci0gICBubyB1bmV4cGVjdGVkIGFsaWdubWVudCB3YXMgaW50cm9kdWNlZC4KLQotICAgVGhlIFN1bk9TIGFuZCBTb2xhcmlzIG5hdGl2ZSBhc3NlbWJsZXJzIGVuZm9yY2UgYWxpZ25lZCBkYXRhIGJ5Ci0gICBkZWZhdWx0LiAgV2UgZG9uJ3Qgd2FudCB0byBkbyB0aGF0LCBiZWNhdXNlIGdjYyBjYW4gZGVsaWJlcmF0ZWx5Ci0gICBnZW5lcmF0ZSBtaXNhbGlnbmVkIGRhdGEgaWYgdGhlIHBhY2tlZCBhdHRyaWJ1dGUgaXMgdXNlZC4gIEluc3RlYWQsCi0gICB3ZSBwZXJtaXQgbWlzYWxpZ25lZCBkYXRhIGJ5IGRlZmF1bHQsIGFuZCBwZXJtaXQgdGhlIHVzZXIgdG8gc2V0IGFuCi0gICBvcHRpb24gdG8gY2hlY2sgZm9yIGl0LiAgKi8KLQotdm9pZAotc3BhcmNfY29uc19hbGlnbiAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBpbnQgbmFsaWduOwotICBjaGFyICpwOwotCi0gIC8qIE9ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgZW5mb3JjaW5nIGFsaWduZWQgZGF0YS4gICovCi0gIGlmICghIGVuZm9yY2VfYWxpZ25lZF9kYXRhKQotICAgIHJldHVybjsKLQotICBpZiAoc3BhcmNfbm9fYWxpZ25fY29ucykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIHVuYWxpZ25lZCBwc2V1ZG8tb3AuICAqLwotICAgICAgc3BhcmNfbm9fYWxpZ25fY29ucyA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbGlnbiA9IGxvZzIgKG5ieXRlcyk7Ci0gIGlmIChuYWxpZ24gPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgYXNzZXJ0IChuYWxpZ24gPiAwKTsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmICgoYWJzX3NlY3Rpb25fb2Zmc2V0ICYgKCgxIDw8IG5hbGlnbikgLSAxKSkgIT0gMCkKLQlhc19iYWQgKF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkoc3ltYm9sUyAqKSBOVUxMLCAob2Zmc2V0VCkgbmFsaWduLCAoY2hhciAqKSBOVUxMKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuYWxpZ24pOwotfQotCi0vKiBUaGlzIGlzIHdoZXJlIHdlIGRvIHRoZSB1bmV4cGVjdGVkIGFsaWdubWVudCBjaGVjay4KLSAgIFRoaXMgaXMgY2FsbGVkIGZyb20gSEFORExFX0FMSUdOIGluIHRjLXNwYXJjLmguICAqLwotCi12b2lkCi1zcGFyY19oYW5kbGVfYWxpZ24gKGZyYWdwKQotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGlmIChmcmFncC0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlICYmICFmcmFncC0+ZnJfc3VidHlwZQotICAgICAgJiYgZnJhZ3AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfYWRkcmVzcyAtIGZyYWdwLT5mcl9maXggIT0gMCkKLSAgICBhc19iYWRfd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwgXygibWlzYWxpZ25lZCBkYXRhIikpOwotICBpZiAoZnJhZ3AtPmZyX3R5cGUgPT0gcnNfYWxpZ25fY29kZSAmJiBmcmFncC0+ZnJfc3VidHlwZSA9PSAxMDI0KQotICAgIHsKLSAgICAgIGludCBjb3VudCA9IGZyYWdwLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ3AtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfZml4OwotICAgICAgCi0gICAgICBpZiAoY291bnQgPj0gNAotCSAgJiYgIShjb3VudCAmIDMpCi0JICAmJiBjb3VudCA8PSAxMDI0Ci0JICAmJiAhKChsb25nKShmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXgpICYgMykpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCAqcCA9ICh1bnNpZ25lZCAqKShmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXgpOwotICAgICAgICAgIGludCBpOwotICAgICAgICAgIAotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSA0LCBwKyspCi0gICAgICAgICAgICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotICAgICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICgoY2hhciAqKXAsIDB4MDEwMDAwMDAsIDQpOyAvKiBlbWl0IG5vcHMgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoKGNoYXIgKilwLCAweDEwMDAwMDAwLCA0KTsKLQotICAgICAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSAmJiBjb3VudCA+IDgpCi0gICAgICAgICAgICB7Ci0JICAgICAgY2hhciAqd2FkZHIgPSAmZnJhZ3AtPmZyX2xpdGVyYWxbZnJhZ3AtPmZyX2ZpeF07Ci0JICAgICAgdW5zaWduZWQgd3ZhbCA9ICgweDMwNjgwMDAwIHwgY291bnQgPj4gMik7IC8qIGJhLGEscHQgJXhjYywgMWYgKi8KLQkgICAgICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotCQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICh3YWRkciwgd3ZhbCwgNCk7Ci0JICAgICAgZWxzZQotCQludW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuICh3YWRkciwgd3ZhbCwgNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZnJhZ3AtPmZyX3ZhciA9IGNvdW50OwotICAgICAgICB9Ci0gICAgfQotfQotCi0jaWZkZWYgT0JKX0VMRgotLyogU29tZSBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGEgU3BhcmMgRUxGIGZpbGUuICAqLwotCi12b2lkCi1zcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyAoKQotewotICAvKiBTZXQgdGhlIFNwYXJjIEVMRiBmbGFnIGJpdHMuICBGSVhNRTogVGhlcmUgc2hvdWxkIHByb2JhYmx5IGJlIHNvbWUKLSAgICAgc29ydCBvZiBCRkQgaW50ZXJmYWNlIGZvciB0aGlzLiAgKi8KLSAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSA2NCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNwYXJjX21lbW9yeV9tb2RlbCkKLQl7Ci0JY2FzZSBNTV9STU86Ci0JICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDVjlfUk1POwotCSAgYnJlYWs7Ci0JY2FzZSBNTV9QU086Ci0JICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDVjlfUFNPOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID49IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfMzJQTFVTOwotICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfU1VOX1VTMTsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSBlbWl0X2V4cHIgdmlhIFRDX0NPTlNfRklYX05FVyB3aGVuIGNyZWF0aW5nIGEKLSAgIHJlbG9jIGZvciBhIGNvbnMuICBXZSBjb3VsZCB1c2UgdGhlIGRlZmluaXRpb24gdGhlcmUsIGV4Y2VwdCB0aGF0Ci0gICB3ZSB3YW50IHRvIGhhbmRsZSBsaXR0bGUgZW5kaWFuIHJlbG9jcyBzcGVjaWFsbHkuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfc3BhcmMgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0KLSAgciA9IChuYnl0ZXMgPT0gMSA/IEJGRF9SRUxPQ184IDoKLSAgICAgICAobmJ5dGVzID09IDIgPyBCRkRfUkVMT0NfMTYgOgotCShuYnl0ZXMgPT0gNCA/IEJGRF9SRUxPQ18zMiA6IEJGRF9SRUxPQ182NCkpKTsKLQotICBpZiAodGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSAmJiBuYnl0ZXMgPT0gNAotICAgICAgJiYgbm93X3NlZy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICAKLSAgICByID0gQkZEX1JFTE9DX1NQQVJDX1JFVjMyOwotICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIChpbnQpIG5ieXRlcywgZXhwLCAwLCByKTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLWludAotZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgIHN0cnVjdCBmaXggKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLSAKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zcGFyYy5oIGIvZ2FzL2NvbmZpZy90Yy1zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWZkYTIyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiB0Yy1zcGFyYy5oIC0gTWFjcm9zIGFuZCB0eXBlIGRlZmluZXMgZm9yIHRoZSBzcGFyYy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAtOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKLSAgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBUQ19TUEFSQwotI2RlZmluZSBUQ19TUEFSQyAxCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmcmFnOwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGB0YXJnZXRfYmlnX2VuZGlhbicuICAqLwotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9zcGFyYwotCi1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgc3BhcmNfdGFyZ2V0X2Zvcm1hdCAoKQotCi0jZGVmaW5lIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotI2RlZmluZSBNQVhfUkVMT0NfRVhQQU5TSU9OIDIKLQotI2lmIDAKLSNpZmRlZiBURV9TUEFSQ0FPVVQKLS8qIEJpLWVuZGlhbiBzdXBwb3J0IG1heSBldmVudHVhbGx5IGJlIHVuY29uZGl0aW9uYWwsIGJ1dCB1bnRpbCB0aGluZ3MgYXJlCi0gICB3b3JraW5nIHdlbGwgaXQncyBvbmx5IHByb3ZpZGVkIGZvciB0YXJnZXRzIHRoYXQgbmVlZCBpdC4gICovCi0jZGVmaW5lIFNQQVJDX0JJRU5ESUFOCi0jZW5kaWYKLSNlbmRpZgotLyogTWFrZSBpdCB1bmNvbmRpdGlvbmFsIGFuZCBjaGVjayBpZiAtRUwgaXMgdmFsaWQgYWZ0ZXIgb3B0aW9uIHBhcnNpbmcgKi8KLSNkZWZpbmUgU1BBUkNfQklFTkRJQU4KLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKGIscyxmKQkJe2FzX2ZhdGFsIChfKCJzcGFyYyBjb252ZXJ0X2ZyYWdcbiIpKTt9Ci0jZGVmaW5lIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KGYscykgXAotCQkJKGFzX2ZhdGFsKF8oImVzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGNhbGxlZCIpKSwxKQotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJTUEFSQyBHQVMgIgotCi1leHRlcm4gaW50IHNwYXJjX3BpY19jb2RlOwotCi0jZGVmaW5lIG1kX2RvX2FsaWduKG4sIGZpbGwsIGxlbiwgbWF4LCBhcm91bmQpCQkJCVwKLWlmICgobikgJiYgKG4pIDw9IDEwICYmICFuZWVkX3Bhc3NfMiAmJiAhKGZpbGwpCQkJCVwKLSAgICAmJiBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSkJCQkJCQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgY2hhciAqcDsJCQkJCQkJCVwKLSAgICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDEgPDwgbiwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMTAyNCwJXAotICAgICAgICAgICAgICAgICAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIChuKSwgKGNoYXIgKikgMCk7CQlcCi0gICAgKnAgPSAweDAwOwkJCQkJCQkJXAotICAgIGdvdG8gYXJvdW5kOwkJCQkJCQlcCi0gIH0KLQotLyogV2UgcmVxdWlyZSAud29yZCwgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgc3BhcmNfY29uc19hbGlnbiAobmJ5dGVzKQotZXh0ZXJuIHZvaWQgc3BhcmNfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgSEFORExFX0FMSUdOKGZyYWdwKSBzcGFyY19oYW5kbGVfYWxpZ24gKGZyYWdwKQotZXh0ZXJuIHZvaWQgc3BhcmNfaGFuZGxlX2FsaWduIFBBUkFNUyAoKHN0cnVjdCBmcmFnICopKTsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9BT1VUKQotCi0vKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsCi0gICBvYmplY3QgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4KLSAgIFRydWUgaWYgd2UgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcKLSAgIHRoZSAubyBmaWxlLgotCi0gICBJZiB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLCB0aGVuIHRoZQotICAgYS5vdXQgYXNzZW1ibGVyIHNob3VsZCBub3QgZG8gdGhlIHJlbG9jYXRpb24gaWYgZ2VuZXJhdGluZyBQSUMsIGFuZAotICAgdGhlIEVMRiBhc3NlbWJsZXIgc2hvdWxkIG5ldmVyIGRvIHRoZSByZWxvY2F0aW9uLiAgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgb2JqX3JlbG9jYXRlX2V4dGVybiAwCi0jZWxzZQotI2RlZmluZSBvYmpfcmVsb2NhdGVfZXh0ZXJuICghIHNwYXJjX3BpY19jb2RlKQotI2VuZGlmCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgKG9ial9yZWxvY2F0ZV9leHRlcm4gXAotICAgfHwgKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0jZW5kaWYKLQotLyogSSBrbm93IHRoYXQgImNhbGwgMCIgZmFpbHMgaW4gc3BhcmMtY29mZiBpZiB0aGlzIGRvZXNuJ3QgcmV0dXJuIDEuICBJCi0gICBkb24ndCBrbm93IGFib3V0IG90aGVyIHJlbG9jYXRpb24gdHlwZXMsIG9yIG90aGVyIGZvcm1hdHMsIHlldC4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQlcCi0JKChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiBcCi0JICYmICgoRklYUCktPmZ4X2FkZHN5ID09IDAgXAotCSAgICAgfHwgU19HRVRfU0VHTUVOVCAoKEZJWFApLT5meF9hZGRzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0jZGVmaW5lIFJFTE9DX1JFUVVJUkVTX1NZTUJPTAotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbihmaXhwKQotZXh0ZXJuIGludCBlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2lmZGVmIE9CSl9FTEYKLS8qIEtlZXAgcmVsb2NhdGlvbnMgYWdhaW5zdCBnbG9iYWwgc3ltYm9scy4gIERvbid0IHR1cm4gdGhlbSBpbnRvCi0gICByZWxvY2F0aW9ucyBhZ2FpbnN0IHNlY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMKLSAgIGxpbmtlciB0byBvcGVyYXRlIHByb3Blcmx5LiAgV2hlbiBnZW5lcmF0aW5nIFBJQywgd2UgbmVlZCB0byBrZWVwCi0gICBhbnkgbm9uIFBDIHJlbGF0aXZlIHJlbG9jLiAgVGhlIFBJQyBwYXJ0IG9mIHRoaXMgdGVzdCBtdXN0IGJlCi0gICBwYXJhbGxlbCB0byB0aGUgY29kZSBpbiB0Y19nZW5fcmVsb2Mgd2hpY2ggY29udmVydHMgcmVsb2NhdGlvbnMgdG8KLSAgIEdPVCByZWxvY2F0aW9ucy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkJCQkJCQlcCi0gICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAkJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQkJCVwKLSAgICYmICghIHNwYXJjX3BpY19jb2RlCQkJCQkJCVwKLSAgICAgICB8fCAoKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkyMgkJCQlcCi0JICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTE8xMAkJCVwKLQkgICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TUEFSQzEzCQkJXAotCSAgICYmICgoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgkJXAotCSAgICAgICB8fCAoU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCQkgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCQkgICAmJiAhIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0JCSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpKSkJCQlcCi0JICAgJiYgKChGSVgpLT5meF9wY3JlbAkJCQkJCVwKLQkgICAgICAgfHwgKChGSVgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCVwKLQkJICAgJiYgKFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9zdWJzeSkJCQlcCi0JCSAgICAgICA9PSBTX0dFVF9TRUdNRU5UICgoRklYKS0+ZnhfYWRkc3kpKSkJCVwKLQkgICAgICAgfHwgU19JU19MT0NBTCAoKEZJWCktPmZ4X2FkZHN5KSkpKSkKLQotLyogRmluaXNoIHVwIHRoZSBlbnRpcmUgc3ltdGFiLiAgKi8KLSNkZWZpbmUgdGNfYWRqdXN0X3N5bXRhYigpIHNwYXJjX2FkanVzdF9zeW10YWIgKCkKLWV4dGVybiB2b2lkIHNwYXJjX2FkanVzdF9zeW10YWIgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQU9VVAotLyogV2hlbiBnZW5lcmF0aW5nIFBJQyBjb2RlLCB3ZSBtdXN0IG5vdCBhZGp1c3QgYW55IHJlbG9jIHdoaWNoIHdpbGwKLSAgIHR1cm4gaW50byBhIHJlbG9jIGFnYWluc3QgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIG5vciBhbnkgcmVsb2MKLSAgIHdoaWNoIHdlIHdpbGwgbmVlZCBpZiBhIHN5bWJvbCBpcyBvdmVycmlkZGVuLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKQkJCQkJCVwKLSAgKCEgc3BhcmNfcGljX2NvZGUJCQkJCQkJXAotICAgfHwgKChGSVgpLT5meF9wY3JlbAkJCQkJCQlcCi0gICAgICAgJiYgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMCQkJCQlcCi0JICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLQkgICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkpKSkJCQlcCi0gICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNgkJCQkJXAotICAgfHwgKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzIpCi0jZW5kaWYKLQotI2RlZmluZSBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZwotZXh0ZXJuIHZvaWQgc3BhcmNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIHZvaWQgc3BhcmNfbWRfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZW5kKCkgc3BhcmNfbWRfZW5kICgpCi0KLSNlbmRpZgotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfc3BhcmMKLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19zcGFyYwotICBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBpbnQsIHVuc2lnbmVkIGludCwgc3RydWN0IGV4cHJlc3Npb25TICopKTsKLQotI2RlZmluZSBUQ19GSVhfVFlQRQl2YWx1ZVQKLQotI2RlZmluZSBUQ19JTklUX0ZJWF9EQVRBKFgpCQkJXAotICBkbwkJCQkJCVwKLSAgICAgewkJCQkJCVwKLSAgICAgICAoWCktPnRjX2ZpeF9kYXRhID0gMDsJCQlcCi0gICAgIH0JCQkJCQlcCi0gIHdoaWxlKDApCi0KLSNkZWZpbmUgVENfRklYX0RBVEFfUFJJTlQoRklMRSwgRklYUCkJCQkJCVwKLSAgZG8JCQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGZwcmludGYoKEZJTEUpLCAiYWRkZW5kMj0lbGRcbiIsICAgCQkJCVwKLQkgICAgICAodW5zaWduZWQgbG9uZykgKEZJWFApLT50Y19maXhfZGF0YSk7CQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIHdoaWxlKDApCi0KLS8qIGVuZCBvZiB0Yy1zcGFyYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRhaG9lLmMgYi9nYXMvY29uZmlnL3RjLXRhaG9lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YTc1MjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10YWhvZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyNyArMCwwIEBACi0vKiB0Yy10YWhvZS5jCi0gICBOb3QgcGFydCBvZiBHQVMgeWV0LiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLS8qIHRoaXMgYml0IGdsb21tZWQgZnJvbSB0YWhvZS1pbnN0LmggKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJ5dGU7Ci10eXBlZGVmIGJ5dGUgdGFob2Vfb3Bjb2RlVDsKLQotLyoKLSAqIFRoaXMgaXMgcGFydCBvZiB0YWhvZS1pbnMtcGFyc2UuYyAmIGZyaWVuZHMuCi0gKiBXZSB3YW50IHRvIHBhcnNlIGEgdGFob2UgaW5zdHJ1Y3Rpb24gdGV4dCBpbnRvIGEgdHJlZSBkZWZpbmVkIGhlcmUuCi0gKi8KLQotI2RlZmluZSBUSVRfTUFYX09QRVJBTkRTICg0KQkvKiBtYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBpbiBvbmUKLQkJCQkgICBzaW5nbGUgdGFob2UgaW5zdHJ1Y3Rpb24gKi8KLQotc3RydWN0IHRvcAkJCS8qIHRhaG9lIGluc3RydWN0aW9uIG9wZXJhbmQgKi8KLXsKLSAgaW50IHRvcF9uZHg7CQkJLyogLTEsIG9yIGluZGV4IHJlZ2lzdGVyLiBlZyA3PVtSN10gKi8KLSAgaW50IHRvcF9yZWc7CQkJLyogLTEsIG9yIHJlZ2lzdGVyIG51bWJlci4gZWcgNyA9IFI3IG9yIChSNykgKi8KLSAgYnl0ZSB0b3BfbW9kZTsJCS8qIEFkZHJlc3NpbmcgbW9kZSBieXRlLiBUaGlzIGJ5dGUsIGRlZmluZXMKLQkJCQkgICB3aGljaCBvZiB0aGUgMTEgbW9kZXMgb3Bjb2RlIGlzLiAqLwotCi0gIGNoYXIgdG9wX2FjY2VzczsJCS8qIEFjY2VzcyB0eXBlIHdhbnRlZCBmb3IgdGhpcyBvcHBlcmFuZAotCQkJCSAgICdiJ2JyYW5jaCAnICduby1pbnN0cnVjdGlvbiAnYW1ydncnICovCi0gIGNoYXIgdG9wX3dpZHRoOwkJLyogT3BlcmFuZCB3aWR0aCBleHBlY3RlZCwgb25lIG9mICJid2xxPy06ISIgKi8KLQotICBjaGFyICp0b3BfZXJyb3I7CQkvKiBTYXkgaWYgb3BlcmFuZCBpcyBpbmFwcHJvcHJpYXRlICAgICAgICAgKi8KLQotICBzZWdUIHNlZ19vZl9vcGVyYW5kOwkJLyogc2VnbWVudCBhcyByZXR1cm5lZCBieSBleHByZXNzaW9uKCkqLwotCi0gIGV4cHJlc3Npb25TIGV4cF9vZl9vcGVyYW5kOwkvKiBUaGUgZXhwcmVzc2lvbiBhcyBwYXJzZWQgYnkgZXhwcmVzc2lvbigpKi8KLQotICBieXRlIHRvcF9kaXNwc2l6ZTsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgZGlzcGxhY2VtZW50IGlmIHdlCi0JCQkJICAgY2FuIGZpZ3VyZSBpdCBvdXQgKi8KLX07Ci0KLS8qIFRoZSBhZGRyZXNzaW5nIG1vZGVzIGZvciBhbiBvcGVyYW5kLiBUaGVzZSBudW1iZXJzIGFyZSB0aGUgYWN1dGFsIHZhbHVlcwotICAgZm9yIGNlcnRhaW4gbW9kZXMsIHNvIGJlIGNhcmVmdWxsIGlmIHlvdSBzY3JldyB3aXRoIHRoZW0uICovCi0jZGVmaW5lIFRBSE9FX0RJUkVDVF9SRUcgKDB4NTApCi0jZGVmaW5lIFRBSE9FX1JFR19ERUZFUlJFRCAoMHg2MCkKLQotI2RlZmluZSBUQUhPRV9SRUdfRElTUCAoMHhFMCkKLSNkZWZpbmUgVEFIT0VfUkVHX0RJU1BfREVGRVJSRUQgKDB4RjApCi0KLSNkZWZpbmUgVEFIT0VfSU1NRURJQVRFICgweDhGKQotI2RlZmluZSBUQUhPRV9JTU1FRElBVEVfQllURSAoMHg4OCkKLSNkZWZpbmUgVEFIT0VfSU1NRURJQVRFX1dPUkQgKDB4ODkpCi0jZGVmaW5lIFRBSE9FX0lNTUVESUFURV9MT05HV09SRCAoMHg4RikKLSNkZWZpbmUgVEFIT0VfQUJTT0xVVEVfQUREUiAoMHg5RikKLQotI2RlZmluZSBUQUhPRV9ESVNQTEFDRURfUkVMQVRJVkUgKDB4RUYpCi0jZGVmaW5lIFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEICgweEZGKQotCi0jZGVmaW5lIFRBSE9FX0FVVE9fREVDICgweDdFKQotI2RlZmluZSBUQUhPRV9BVVRPX0lOQyAoMHg4RSkKLSNkZWZpbmUgVEFIT0VfQVVUT19JTkNfREVGRVJSRUQgKDB4OUUpCi0vKiBJTkRFWEVEX1JFRyBpcyBkZWNpZGVkIGJ5IHRoZSBleGlzdGFuY2Ugb3IgbGFjayBvZiBhIFtyZWddICovCi0KLS8qIFRoZXNlIGFyZSBlbmNvZGVkIGludG8gdG9wX3dpZHRoIHdoZW4gdG9wX2FjY2Vzcz09J2InCi0gICBhbmQgaXQncyBhIHBzdWVkbyBvcC4qLwotI2RlZmluZSBUQUhPRV9XSURUSF9BTFdBWVNfSlVNUCAgICAgICctJwotI2RlZmluZSBUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QICc/JwotI2RlZmluZSBUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVAgICAgICchJwotI2RlZmluZSBUQUhPRV9XSURUSF9CSUdfTk9OX1JFVl9KVU1QICc6JwotCi0vKiBUaGUgaGV4IGNvZGUgZm9yIGNlcnRhaW4gdGFob2UgY29tbWFuZHMgYW5kIG1vZGVzLgotICAgVGhpcyBpcyBqdXN0IGZvciByZWFkYWJpbGl0eS4gKi8KLSNkZWZpbmUgVEFIT0VfSk1QICgweDcxKQotI2RlZmluZSBUQUhPRV9QQ19SRUxfTE9ORyAoMHhFRikKLSNkZWZpbmUgVEFIT0VfQlJCICgweDExKQotI2RlZmluZSBUQUhPRV9CUlcgKDB4MTMpCi0vKiBUaGVzZSwgd2hlbiAnb3JlZCcgd2l0aCwgb3IgYWRkZWQgdG8sIGEgcmVnaXN0ZXIgbnVtYmVyLAotICAgc2V0IHVwIHRoZSBudW1iZXIgZm9yIHRoZSBkaXNwbGFjZW1lbnQgbW9kZS4gKi8KLSNkZWZpbmUgVEFIT0VfUENfT1JfQllURSAoMHhBMCkKLSNkZWZpbmUgVEFIT0VfUENfT1JfV09SRCAoMHhDMCkKLSNkZWZpbmUgVEFIT0VfUENfT1JfTE9ORyAoMHhFMCkKLQotc3RydWN0IHRpdAkJCS8qIGdldCBpdCBvdXQgb2YgdGhlIHNld2VyLCBpdCBzdGFuZHMgZm9yCi0JCQkJICAgdGFob2UgaW5zdHJ1Y3Rpb24gdHJlZSAoR2VlemUhKSAqLwotewotICB0YWhvZV9vcGNvZGVUIHRpdF9vcGNvZGU7CS8qIFRoZSBvcGNvZGUuICovCi0gIGJ5dGUgdGl0X29wZXJhbmRzOwkJLyogSG93IG1hbnkgb3BlcmFuZHMgYXJlIGhlcmUuICovCi0gIHN0cnVjdCB0b3AgdGl0X29wZXJhbmRbVElUX01BWF9PUEVSQU5EU107CS8qIE9wZXJhbmRzICovCi0gIGNoYXIgKnRpdF9lcnJvcjsJCS8qICIiIG9yIGZhdGFsIGVycm9yIHRleHQgKi8KLX07Ci0KLS8qIGVuZDogdGFob2UtaW5zdC5oICovCi0KLS8qIHRhaG9lLmMgLSB0YWhvZS1zcGVjaWZpYyAtCi0gICBOb3QgcGFydCBvZiBnYXMgeWV0LgotICAgKi8KLQotI2luY2x1ZGUgIm9wY29kZS90YWhvZS5oIgotCi0vKiBUaGlzIGlzIHRoZSBudW1iZXIgdG8gcHV0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGEub3V0IGZpbGUgKi8KLWxvbmcgb21hZ2ljID0gT01BR0lDOwotCi0vKiBUaGVzZSBjaGFycyBzdGFydCBhIGNvbW1lbnQgYW55d2hlcmUgaW4gYSBzb3VyY2UgZmlsZSAoZXhjZXB0IGluc2lkZQotICAgYW5vdGhlciBjb21tZW50IG9yIGEgcXVvdGVkIHN0cmluZy4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiM7IjsKLQotLyogVGhlc2UgY2hhcnMgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBhcyBpbiAwZjEyMy40NTYKLSAgIG9yICAgIDBkMS4yMzRFLTEyIChzZWUgZXhwIGNoYXJzIGFib3ZlKQotICAgTm90ZTogVGhlIFRhaG9lIHBvcnQgZG9lc24ndCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4gVGhpcyBpcwotICAgICAgICAgY29uc2lzdGFudCB3aXRoICdhcycgSWYgaXQncyBuZWVkZWQsIEkgY2FuIGFsd2F5cyBhZGQgaXQgbGF0ZXIuICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImRmIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMgLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKLSAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLgotICAgKFRoZSB0YWhvZSBoYXMgcGxlbnR5IG9mIHJvb20sIHNvIHRoZSBjaGFuZ2UgY3VycmVudGx5IGlzbid0IG5lZWRlZC4pCi0gICAqLwotCi1zdGF0aWMgc3RydWN0IHRpdCB0OwkJLyogQSB0YWhvZSBpbnN0cnVjdGlvbiBhZnRlciBkZWNvZGluZy4gKi8KLQotdm9pZCBmbG9hdF9jb25zICgpOwotLyogQSB0YWJsZSBvZiBwc2V1ZG8gb3BzIChzYW5zIC4pLCB0aGUgZnVuY3Rpb24gY2FsbGVkLCBhbmQgYW4gaW50ZWdlciBvcAotICAgdGhhdCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGguICovCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiZGZsb2F0IiwgZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJmZmxvYXQiLCBmbG9hdF9jb25zLCAnZid9LAotICB7MH0KLX07Ci0MCi0vKgotICogRm9yIFRhaG9lLCByZWxhdGl2ZSBhZGRyZXNzZXMgb2YgImp1c3QgdGhlIHJpZ2h0IGxlbmd0aCIgYXJlIHByZXR0eSBlYXN5LgotICogVGhlIGJyYW5jaCBkaXNwbGFjZW1lbnQgaXMgYWx3YXlzIHRoZSBsYXN0IG9wZXJhbmQsIGV2ZW4gaW4KLSAqIHN5bnRoZXRpYyBpbnN0cnVjdGlvbnMuCi0gKiBGb3IgVGFob2UsIHdlIGVuY29kZSB0aGUgcmVsYXhfc3Vic3RhdGVUcyAoaW4gZS5nLiBmcl9zdWJzdGF0ZSkgYXM6Ci0gKgotICoJCSAgICA0ICAgICAgIDMgICAgICAgMiAgICAgICAxICAgICAgIDAJICAgICBiaXQgbnVtYmVyCi0gKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gKgkJfCAgICAgd2hhdCBzdGF0ZSA/CXwgIGhvdyBsb25nID8JfAotICoJLS0tLyAvLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICoKLSAqIFRoZSAiaG93IGxvbmciIGJpdHMgYXJlIDAwPWJ5dGUsIDAxPXdvcmQsIDEwPWxvbmcuCi0gKiBUaGlzIGlzIGEgVW4qeCBjb252ZW50aW9uLgotICogTm90IGFsbCBsZW5ndGhzIGFyZSBsZWdpdCBmb3IgYSBnaXZlbiB2YWx1ZSBvZiAod2hhdCBzdGF0ZSkuCi0gKiBUaGUgZm91ciBzdGF0ZXMgYXJlIGxpc3RlZCBiZWxvdy4KLSAqIFRoZSAiaG93IGxvbmciIHJlZmVycyBtZXJlbHkgdG8gdGhlIGRpc3BsYWNlbWVudCBsZW5ndGguCi0gKiBUaGUgYWRkcmVzcyB1c3VhbGx5IGhhcyBzb21lIGNvbnN0YW50IGJ5dGVzIGluIGl0IGFzIHdlbGwuCi0gKgotCi1TdGF0ZXMgZm9yIFRhaG9lIGFkZHJlc3MgcmVsYXhpbmcuCi0xLglUQUhPRV9XSURUSF9BTFdBWVNfSlVNUCAoLSkKLQlGb3JtYXQ6ICJiLSIKLQlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKLQkJanIJCTExCi0JCWpicgkJMTEKLQlTaW1wbGUgYnJhbmNoLgotCUFsd2F5cywgMSBieXRlIG9wY29kZSwgdGhlbiBkaXNwbGFjZW1lbnQvYWJzb2x1dGUuCi0JSWYgd29yZCBvciBsb25nd29yZCwgY2hhbmdlIG9wY29kZSB0byBicncgb3Igam1wLgotCi0JCi0yLglUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QICg/KQotCUo8Y29uZD4gd2hlcmUgPGNvbmQ+IGlzIGEgc2ltcGxlIGZsYWcgdGVzdC4KLQlGb3JtYXQ6ICJiPyIKLQlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKLQkJam5lcS9qbmVxdQkyMQotCQlqZXFsL2plcWx1CTMxCi0JCWpndHIJCTQxCi0JCWpsZXEJCTUxCi0JCWpnZXEJCTgxCi0JCWpsc3MJCTkxCi0JCWpndHJ1CQlhMQotCQlqbGVxdQkJYjEKLQkJanZjCQljMQotCQlqdnMJCWQxCi0JCWpsc3N1L2pjcwllMQotCQlqZ2VxdS9qY2MJZjEKLQlBbHdheXMsIHlvdSBjb21wbGVtZW50IDR0aCBiaXQgdG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uLgotCUFsd2F5cywgMS1ieXRlIG9wY29kZSwgdGhlbiAxLWJ5dGUgZGlzcGxhY2VtZW50LgotCi0zLglUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVAgKCEpCi0JSmJjL0picyB3aGVyZSBjb25kIHRlc3RzIGEgbWVtb3J5IGJpdC4KLQlGb3JtYXQ6ICJybHZsYiEiCi0JVGFob2Ugb3Bjb2RlcyBhcmU6CShIZXgpCi0JCWpicwkJMGUKLQkJamJjCQkxZQotCUFsd2F5cywgeW91IGNvbXBsZW1lbnQgNHRoIGJpdCB0byByZXZlcnNlIHRoZSBjb25kaXRpb24uCi0JQWx3YXlzLCAxLWJ5dGUgb3BjZGUsIGxvbmd3b3JkLCBsb25nd29yZC1hZGRyZXNzLCAxLXdvcmQtZGlzcGxhY2VtZW50Ci0KLTQuCVRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVAgKDopCi0JSmFvYmxYWC9KYnNzaQotCUZvcm1hdDogInJsbWxiOiIKLQlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKLQkJYW9qbHNzCQkyZgotCQlqYW9ibHNzCQkyZgotCQlhb2psZXEJCTNmCi0JCWphb2JsZXEJCTNmCi0JCWpic3NpCQk1ZgotCUFsd2F5cywgd2UgY2Fubm90IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2g7IHdlIGhhdmUgYSB3b3JkCi0JZGlzcGxhY2VtZW50LgotCi1XZSBuZWVkIHRvIG1vZGlmeSB0aGUgb3Bjb2RlIGlzIGZvciBjbGFzcyAxLCAyIGFuZCAzIGluc3RydWN0aW9ucy4KLUFmdGVyIHJlbGF4KCkgd2UgbWF5IGNvbXBsZW1lbnQgdGhlIDR0aCBiaXQgb2YgMiBvciAzIHRvIHJldmVyc2Ugc2Vuc2Ugb2YKLWJyYW5jaC4KLQotV2Ugc29tZXRpbWVzIHN0b3JlIGNvbnRleHQgaW4gdGhlIG9wZXJhbmQgbGl0ZXJhbC4gVGhpcyB3YXkgd2UgY2FuIGZpZ3VyZSBvdXQKLWFmdGVyIHJlbGF4KCkgd2hhdCB0aGUgb3JpZ2luYWwgYWRkcmVzc2luZyBtb2RlIHdhcy4gKFdhcyBpcyBwY19yZWwsIG9yCi1wY19yZWxfZGlzcD8gVGhhdCBzb3J0IG9mIHRoaW5nLikgKi8KLQwKLS8qIFRoZXNlIGRpc3BsYWNlbWVudHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBTVEFSVCBhZGRyZXNzIG9mIHRoZQotICAgZGlzcGxhY2VtZW50IHdoaWNoIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgZGlzcGxhY2VtZW50LCBub3QgdGhlIGVuZCBvZgotICAgdGhlIGluc3RydWN0aW9uLiBUaGUgaGFyZHdhcmUgcGNfcmVsIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucy4KLSAgIFRoYXQncyB3aHkgYWxsIHRoZSBkaXNwbGFjZW1lbnRzIGhhdmUgdGhlIGxlbmd0aCBvZiB0aGUgZGlzcGxhY2VtZW50IGFkZGVkCi0gICB0byB0aGVtLiAoV0YgKyBsZW5ndGgod29yZCkpCi0KLSAgIFRoZSBmaXJzdCBsZXR0ZXIgaXMgQnl0ZSwgV29yZC4KLSAgIDJuZCBsZXR0ZXIgaXMgRm9yd2FyZCwgQmFja3dhcmQuICovCi0jZGVmaW5lIEJGICgxKyAxMjcpCi0jZGVmaW5lIEJCICgxKy0xMjgpCi0jZGVmaW5lIFdGICgyKyAzMjc2NykKLSNkZWZpbmUgV0IgKDIrLTMyNzY4KQotLyogRG9udCBuZWVkIExGLCBMQiBiZWNhdXNlIHRoZXkgYWx3YXlzIHJlYWNoLiBbVGhleSBhcmUgY29kZWQgYXMgMC5dICovCi0KLSNkZWZpbmUgQyhhLGIpIEVOQ09ERV9SRUxBWChhLGIpCi0vKiBUaGlzIG1hY3JvIGhhcyBubyBzaWRlLWVmZmVjdHMuICovCi0jZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKLSNkZWZpbmUgUkVMQVhfU1RBVEUod2hhdCkgKCh3aGF0KSA+PiAyKQotI2RlZmluZSBSRUxBWF9MRU5HVEgobGVuZ3RoKSAoKGxlbmd0aCkgJiYgMykKLQotI2RlZmluZSBTVEFURV9BTFdBWVNfQlJBTkNIICAgICAgICAgICAgICgxKQotI2RlZmluZSBTVEFURV9DT05ESVRJT05BTF9CUkFOQ0ggICAgICAgICgyKQotI2RlZmluZSBTVEFURV9CSUdfUkVWX0JSQU5DSCAgICAgICAgICAgICgzKQotI2RlZmluZSBTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0ggICAgICAgICg0KQotI2RlZmluZSBTVEFURV9QQ19SRUxBVElWRQkJKDUpCi0KLSNkZWZpbmUgU1RBVEVfQllURSAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgU1RBVEVfV09SRCAgICAgICAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgU1RBVEVfTE9ORyAgICAgICAgICAgICAgICAgICAgICAoMikKLSNkZWZpbmUgU1RBVEVfVU5ERiAgICAgICAgICAgICAgICAgICAgICAoMykJLyogU3ltYm9sIHVuZGVmaW5lZCBpbiBwYXNzMSAqLwotCi0vKiBUaGlzIGlzIHRoZSB0YWJsZSB1c2VkIGJ5IGdhcyB0byBmaWd1cmUgb3V0IHJlbGF4aW5nIG1vZGVzLiBUaGUgZmllbGRzIGFyZQotICAgZm9yd2FyZF9icmFuY2ggcmVhY2gsIGJhY2t3YXJkX2JyYW5jaCByZWFjaCwgbnVtYmVyIG9mIGJ5dGVzIGl0IHdvdWxkIHRha2UsCi0gICB3aGVyZSB0aGUgbmV4dCBiaWdnZXN0IGJyYW5jaCBpcy4gKi8KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiBlcnJvciBzZW50aW5lbCAgIDAsMAkqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDAsMQkqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDAsMgkqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDAsMwkqLwotLyogVW5jb25kaXRpb25hbCBicmFuY2ggY2FzZXMgImpyYiIKLSAgICAgVGhlIHJlbGF4IHBhcnQgaXMgdGhlIGFjdHVhbCBkaXNwbGFjZW1lbnQgKi8KLSAgewotICAgIEJGLCBCQiwgMSwgQyAoMSwgMSkKLSAgfSwJCQkJLyogYnJiIEJgZm9vCSAgICAxLDAgKi8KLSAgewotICAgIFdGLCBXQiwgMiwgQyAoMSwgMikKLSAgfSwJCQkJLyogYnJ3IFdgZm9vCSAgICAxLDEgKi8KLSAgewotICAgIDAsIDAsIDUsIDAKLSAgfSwJCQkJLyogSm1wIExgZm9vCSAgICAxLDIgKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAxLDMgKi8KLS8qIFJldmVyc2libGUgQ29uZGl0aW9uYWwgQnJhbmNoLiBJZiB0aGUgYnJhbmNoIHdvbid0IHJlYWNoLCByZXZlcnNlCi0gICAgIGl0LCBhbmQganVtcCBvdmVyIGEgYnJ3IG9yIGEgam1wIHRoYXQgd2lsbCByZWFjaC4gVGhlIHJlbGF4IHBhcnQgaXMgdGhlCi0gICAgIGFjdHVhbCBhZGRyZXNzLiAqLwotICB7Ci0gICAgQkYsIEJCLCAxLCBDICgyLCAxKQotICB9LAkJCQkvKiBiPGNvbmQ+IEJgZm9vICAgIDIsMCAqLwotICB7Ci0gICAgV0YgKyAyLCBXQiArIDIsIDQsIEMgKDIsIDIpCi0gIH0sCQkJCS8qIGJyZXYgb3ZlciwgYnJ3IFdgZm9vLCBvdmVyOiAyLDEgKi8KLSAgewotICAgIDAsIDAsIDcsIDAKLSAgfSwJCQkJLyogYnJldiBvdmVyLCBqbXAgTGBmb28sIG92ZXI6IDIsMiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDIsMyAqLwotLyogQW5vdGhlciB0eXBlIG9mIHJldmVyc2FibGUgYnJhbmNoLiBCdXQgdGhpcyBvbmx5IGhhcyBhIHdvcmQKLSAgICAgZGlzcGxhY2VtZW50LiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDMsMCAqLwotICB7Ci0gICAgV0YsIFdCLCAyLCBDICgzLCAyKQotICB9LAkJCQkvKiBqYlggV2Bmb28JICAgIDMsMSAqLwotICB7Ci0gICAgMCwgMCwgOCwgMAotICB9LAkJCQkvKiBqcmV2WCBvdmVyLCBqbXAgTGBmb28sIG92ZXI6ICAzLDIgKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAzLDMgKi8KLS8qIFRoZXNlIGFyZSB0aGUgbm9uIHJldmVyc2FibGUgYnJhbmNoZXMsIGFsbCBvZiB3aGljaCBoYXZlIGEgd29yZAotICAgICBkaXNwbGFjZW1lbnQuIElmIEkgY2FuJ3QgcmVhY2gsIGJyYW5jaCBvdmVyIGEgYnl0ZSBicmFuY2gsIHRvIGEKLSAgICAganVtcCB0aGF0IHdpbGwgcmVhY2guIFRoZSBqdW1wZWQgYnJhbmNoIGp1bXBzIG92ZXIgdGhlIHJlYWNoaW5nCi0gICAgIGJyYW5jaCwgdG8gY29udGludWUgd2l0aCB0aGUgZmxvdyBvZiB0aGUgcHJvZ3JhbS4gSXQncyBsaWtlIHBsYXlpbmcKLSAgICAgbGVhcCBmcm9nLiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDQsMCAqLwotICB7Ci0gICAgV0YsIFdCLCAyLCBDICg0LCAyKQotICB9LAkJCQkvKiBhb2JsXyBXYGZvbwkgICAgNCwxICovCi0gIHsKLSAgICAwLCAwLCAxMCwgMAotICB9LAkJCQkvKmFvYmxfIFdgaG9wLGJyIG92ZXIsaG9wOiBqbXAgTF5mb28sb3ZlciA0LDIqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDQsMyAqLwotLyogTm9ybWFsIGRpc3BsYWNlbWVudCBtb2RlLCBubyBqdW1waW5nIG9yIGFueXRoaW5nIGxpa2UgdGhhdC4KLSAgICAgVGhlIHJlbGF4IHBvaW50cyB0byBvbmUgYnl0ZSBiZWZvcmUgdGhlIGFkZHJlc3MsIHRoYXRzIHdoeSBhbGwKLSAgICAgdGhlIG51bWJlcnMgYXJlIHVwIGJ5IG9uZS4gKi8KLSAgewotICAgIEJGICsgMSwgQkIgKyAxLCAyLCBDICg1LCAxKQotICB9LAkJCQkvKiBCXiJmb28iCSAgICA1LDAgKi8KLSAgewotICAgIFdGICsgMSwgV0IgKyAxLCAzLCBDICg1LCAyKQotICB9LAkJCQkvKiBXXiJmb28iCSAgICA1LDEgKi8KLSAgewotICAgIDAsIDAsIDUsIDAKLSAgfSwJCQkJLyogTF4iZm9vIgkgICAgNSwyICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgNSwzICovCi19OwotCi0jdW5kZWYgQwotI3VuZGVmIEJGCi0jdW5kZWYgQkIKLSN1bmRlZiBXRgotI3VuZGVmIFdCCi0vKiBFbmQgcmVsYXggc3R1ZmYgKi8KLQwKLS8qIEhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUuICBOVUxMIG1lYW5zIGFueSB1c2UgYmVmb3JlCi0gICBtZF9iZWdpbigpIHdpbGwgY3Jhc2guICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0KLS8qIEluaXQgZnVuY3Rpb24uIEJ1aWxkIHRoZSBoYXNoIHRhYmxlLiAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgc3RydWN0IHRvdCAqdFA7Ci0gIGNoYXIgKmVycm9ydmFsID0gMDsKLSAgaW50IHN5bnRoZXRpY190b28gPSAxOwkvKiBJZiAwLCBqdXN0IHVzZSByZWFsIG9wY29kZXMuICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAodFAgPSB0b3RzdHJzOyAqdFAtPm5hbWUgJiYgIWVycm9ydmFsOyB0UCsrKQotICAgIGVycm9ydmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIHRQLT5uYW1lLCAmdFAtPmRldGFpbCk7Ci0KLSAgaWYgKHN5bnRoZXRpY190b28pCi0gICAgZm9yICh0UCA9IHN5bnRoZXRpY190b3RzdHJzOyAqdFAtPm5hbWUgJiYgIWVycm9ydmFsOyB0UCsrKQotICAgICAgZXJyb3J2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgdFAtPm5hbWUsICZ0UC0+ZGV0YWlsKTsKLQotICBpZiAoZXJyb3J2YWwpCi0gICAgYXNfZmF0YWwgKGVycm9ydmFsKTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJhZDpTVHQ6ViI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnYSc6Ci0gICAgICBhc193YXJuIChfKCJUaGUgLWEgb3B0aW9uIGRvZXNuJ3QgZXhpc3QuIChEZXNwaXRlIHdoYXQgdGhlIG1hbiBwYWdlIHNheXMhIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIGFzX3dhcm4gKF8oIkRpc3BsYWNlbWVudCBsZW5ndGggJXMgaWdub3JlZCEiKSwgYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgICBhc193YXJuIChfKCJTWU1CT0wgVEFCTEUgbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIGFzX3dhcm4gKF8oIlRPS0VOIFRSQUNFIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICBhc193YXJuIChfKCJJIGRvbid0IG5lZWQgb3IgdXNlIHRlbXAuIGZpbGUgXCIlc1wiLiIpLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgdXNlIGFuIGludGVycGFzcyBmaWxlISAtViBpZ25vcmVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLVRhaG9lIG9wdGlvbnM6XG5cCi0tYQkJCWlnbm9yZWRcblwKLS1kIExFTkdUSAkJaWdub3JlZFxuXAotLUoJCQlpZ25vcmVkXG5cCi0tUwkJCWlnbm9yZWRcblwKLS10IEZJTEUJCQlpZ25vcmVkXG5cCi0tVAkJCWlnbm9yZWRcblwKLS1WCQkJaWdub3JlZFxuIikpOwotfQotDAotLyogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gdGFrZSBudW1iZXJzIGluIHRoZSBtYWNoaW5lIGZvcm1hdCwgYW5kCi0gICBtdW5nZXMgdGhlbSBpbnRvIFRhaG9lIGJ5dGUgb3JkZXIuCi0gICBUaGV5IGV4aXN0IHByaW1hcmlseSBmb3IgY3Jvc3MgYXNzZW1ibHkgcHVycG9zZS4gKi8KLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIHZhbHVlVCB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChjb24sIHZhbHVlLCBuYnl0ZXMpOwotfQotCi0jaWZkZWYgY29tbWVudAotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfbnVtYmVyX3RvX2ltbSAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIGxvbmcgaW50IHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIG1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotdm9pZAotdGNfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICAvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkICovCi0gIGtub3cgKDApOwotfQotCi12b2lkCQkJCS8qIEtub3dzIGFib3V0IG9yZGVyIG9mIGJ5dGVzIGluIGFkZHJlc3MuICovCi1tZF9udW1iZXJfdG9fZGlzcCAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIGxvbmcgaW50IHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIG1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfbnVtYmVyX3RvX2ZpZWxkIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107CQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KLSAgICAgbG9uZyBpbnQgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpOwotfQotCi0vKiBQdXQgdGhlIGJpdHMgaW4gYW4gb3JkZXIgdGhhdCBhIHRhaG9lIHdpbGwgdW5kZXJzdGFuZCwgZGVzcGl0ZSB0aGUgb3JkZXJpbmcKLSAgIG9mIHRoZSBuYXRpdmUgbWFjaGluZS4KLSAgIE9uIFRhaG9lOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgYmlnIGVuZGlhbiBsb25nLAotICAgbmV4dCB0aHJlZSBieXRlcyBhcmUgc3ltYm9sbnVtLCBpbiBraW5kIG9mIDMgYnl0ZSBiaWcgZW5kaWFuIChsZWFzdCBzaWcuIGJ5dGUgbGFzdCkuCi0gICBUaGUgbGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoIGJpdCA3IGFzIHBjcmVsLAotICAgCWJpdHMgNiAmIDUgYXMgbGVuZ3RoLAotCWJpdCA0IGFzIGV4dGVybiBhbmQgdGhlIGxhc3QgbmliYmxlIGFzICd1bmRlZmluZWQnLiAqLwotCi0jaWYgY29tbWVudAotdm9pZAotbWRfcmlfdG9fY2hhcnMgKHJpX3AsIHJpKQotICAgICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyaV9wLCByaTsKLXsKLSAgYnl0ZSB0aGVfYnl0ZXNbc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKV07Ci0gIC8qIFRoZSByZWFzb24gSSBjYW4ndCBqdXN0IGVuY29kZSB0aGVzZSBkaXJlY3RseSBpbnRvIHJpX3AgaXMgdGhhdAotICAgICByaV9wIG1heSBwb2ludCB0byByaS4gKi8KLQotICAvKiBUaGlzIGlzIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLnJfYWRkcmVzcywgc2l6ZW9mIChyaS5yX2FkZHJlc3MpKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICB0aGVfYnl0ZXNbNF0gPSAocmkucl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s1XSA9IChyaS5yX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNl0gPSByaS5yX3N5bWJvbG51bSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbN10gPSAoKChyaS5yX2V4dGVybiA8PCA0KSAmIDB4MTApIHwgKChyaS5yX2xlbmd0aCA8PCA1KSAmIDB4NjApIHwKLQkJICAoKHJpLnJfcGNyZWwgPDwgNykgJiAweDgwKSkgJiAweGYwOwotCi0gIGJjb3B5ICh0aGVfYnl0ZXMsIChjaGFyICopIHJpX3AsIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi0vKiBQdXQgdGhlIGJpdHMgaW4gYW4gb3JkZXIgdGhhdCBhIHRhaG9lIHdpbGwgdW5kZXJzdGFuZCwgZGVzcGl0ZSB0aGUgb3JkZXJpbmcKLSAgIG9mIHRoZSBuYXRpdmUgbWFjaGluZS4KLSAgIE9uIFRhaG9lOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgYmlnIGVuZGlhbiBsb25nLAotICAgbmV4dCB0aHJlZSBieXRlcyBhcmUgc3ltYm9sbnVtLCBpbiBraW5kIG9mIDMgYnl0ZSBiaWcgZW5kaWFuIChsZWFzdCBzaWcuIGJ5dGUgbGFzdCkuCi0gICBUaGUgbGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoIGJpdCA3IGFzIHBjcmVsLAotICAgCWJpdHMgNiAmIDUgYXMgbGVuZ3RoLAotCWJpdCA0IGFzIGV4dGVybiBhbmQgdGhlIGxhc3QgbmliYmxlIGFzICd1bmRlZmluZWQnLiAqLwotCi12b2lkIAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs0XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKGlzX3BjcmVsIChmaXhQKSA8PCA3KSAmIDB4ODApCi0JICAgICAgfCAoKCgoZml4UC0+ZnhfdHlwZSA9PSBGWF84IHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUw4Ci0JCSAgICA/IDAKLQkJICAgIDogKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMTYgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDE2Ci0JCSAgICAgICA/IDEKLQkJICAgIDogKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMzIgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDMyCi0JCSAgICAgICA/IDIKLQkJICAgICAgIDogNDIpKSkpIDw8IDUpICYgMHg2MCkKLQkgICAgICB8ICgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpIDw8IDQpICYgMHgxMCkpOwotfQotCi0vKiBSZWxvY2F0ZSBieXRlIHN0dWZmICovCi0MCi0vKiBUaGlzIGlzIGZvciBicm9rZW4gd29yZC4gKi8KLWNvbnN0IGludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAxKTsKLSAgKnB0cisrID0gVEFIT0VfQlJXOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgb2Zmc2V0LCAyKTsKLX0KLQotY29uc3QgaW50IG1kX2xvbmdfanVtcF9zaXplID0gNjsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDQpOwotICAqcHRyKysgPSBUQUhPRV9KTVA7Ci0gICpwdHIrKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgb2Zmc2V0LCA0KTsKLX0KLQwKLS8qCi0gKgkJCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkKLSAqCi0gKiBDYWxsZWQganVzdCBiZWZvcmUgcmVsYXgoKS4KLSAqIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLCBzbyB3ZSBhc3N1bWVkCi0gKiB0aGF0IGl0IHdpbGwgYmUgcmVzb2x2ZWQgYnkgdGhlIGxpbmtlci4KLSAqIFJldHVybiB0aGUgY29ycmVjdCBmcl9zdWJ0eXBlIGluIHRoZSBmcmFnLCBmb3IgcmVsYXgoKQotICogUmV0dXJuIHRoZSBpbml0aWFsICJndWVzcyBmb3IgZnJfdmFyIiB0byBjYWxsZXIuIChIb3cgYmlnIEkgdGhpbmsgdGhpcwotICogd2lsbCBiZS4pCi0gKiBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gKiBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICogQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICogMCB2YWx1ZS4KLSAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnRfdHlwZTsJCS8qIE5fREFUQSBvciBOX1RFWFQuICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGludCBvbGRfZnJfZml4OwotICAvKiAgaW50IHBjX3JlbDsgRklYTUU6IHJlbW92ZSB0aGlzICovCi0KLSAgb2xkX2ZyX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIC8qIFRoZSBzeW1ib2wgd2FzIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMgdGhlIG9wY29kZSwgYW5kIGl0J3MKLQkgYSByZWFsIHBjX3JlbCBjYXNlIHNvIGl0J3MgYSByZWxheGFibGUgY2FzZS4gKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgY2FzZSBpcyBzdGlsbCB1bmRlZmluZWQsIHNvIGFzdW1lIGl0J3MgYSBsb25nIHdvcmQgZm9yIHRoZQotCSBsaW5rZXIgdG8gZml4LiAqLwotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpwIHw9IFRBSE9FX1BDX09SX0xPTkc7Ci0JICAvKiBXZSBub3cga25vdyBob3cgYmlnIGl0IHdpbGwgYmUsIG9uZSBsb25nIHdvcmQuICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgXj0gMHgxMDsJLyogUmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guICovCi0JICAqcCsrID0gNjsKLQkgICpwKysgPSBUQUhPRV9KTVA7Ci0JICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyAxICsgMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDMsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9Ci0JICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgXj0gMHgxMDsJLyogUmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guICovCi0JICAqcCsrID0gMDsKLQkgICpwKysgPSA2OwotCSAgKnArKyA9IFRBSE9FX0pNUDsKLQkgICpwKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLQkgIGZyYWdQLT5mcl9maXggKz0gMiArIDIgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKnArKyA9IDI7Ci0JICAqcCsrID0gMDsKLQkgICpwKysgPSBUQUhPRV9CUkI7Ci0JICAqcCsrID0gNjsKLQkgICpwKysgPSBUQUhPRV9KTVA7Ci0JICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDIgKyAyICsgMiArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDYsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9CWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpmcmFnUC0+ZnJfb3Bjb2RlID0gVEFIT0VfSk1QOwotCSAgKnArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAoZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZnJfZml4KTsKLX0JCQkJLyogbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSAqLwotDAotLyoKLSAqCQkJbWRfY29udmVydF9mcmFnKCk7Ci0gKgotICogQ2FsbGVkIGFmdGVyIHJlbGF4KCkgaXMgZmluaXNoZWQuCi0gKiBJbjoJQWRkcmVzcyBvZiBmcmFnLgotICoJZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KLSAqCWZyX3N1YnR5cGUgaXMgd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLgotICoKLSAqIE91dDoJQW55IGZpeFNzIGFuZCBjb25zdGFudHMgYXJlIHNldCB1cC4KLSAqCUNhbGxlciB3aWxsIHR1cm4gZnJhZyBpbnRvIGEgIi5zcGFjZSAwIi4KLSAqLwotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqYWRkcmVzc1A7CS8qIC0+IF92YXIgdG8gY2hhbmdlLiAqLwotICByZWdpc3RlciBjaGFyICpvcGNvZGVQOwkvKiAtPiBvcGNvZGUgY2hhcihzKSB0byBjaGFuZ2UuICovCi0gIHJlZ2lzdGVyIHNob3J0IGludCBsZW5ndGhfY29kZTsJLyogMj1sb25nIDE9d29yZCAwPWJ5dGUgKi8KLSAgcmVnaXN0ZXIgc2hvcnQgaW50IGV4dGVuc2lvbiA9IDA7CS8qIFNpemUgb2YgcmVsYXhlZCBhZGRyZXNzLgotCQkJCSAgIEFkZGVkIHRvIGZyX2ZpeDogaW5jbC4gQUxMIHZhciBjaGFycy4gKi8KLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgcmVnaXN0ZXIgbG9uZyBpbnQgd2hlcmU7Ci0gIHJlZ2lzdGVyIGxvbmcgaW50IGFkZHJlc3Nfb2ZfdmFyOwotICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgaXMgX3ZhciBvZiAqZnJhZ1A/ICovCi0gIHJlZ2lzdGVyIGxvbmcgaW50IHRhcmdldF9hZGRyZXNzOwotICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgZG9lcyBhZGRyIHBvaW50PyAqLwotCi0gIGtub3cgKGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50KTsKLSAgbGVuZ3RoX2NvZGUgPSBSRUxBWF9MRU5HVEggKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAga25vdyAobGVuZ3RoX2NvZGUgPj0gMCAmJiBsZW5ndGhfY29kZSA8IDMpOwotICB3aGVyZSA9IGZyYWdQLT5mcl9maXg7Ci0gIGFkZHJlc3NQID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyB3aGVyZTsKLSAgb3Bjb2RlUCA9IGZyYWdQLT5mcl9vcGNvZGU7Ci0gIHN5bWJvbFAgPSBmcmFnUC0+ZnJfc3ltYm9sOwotICBrbm93IChzeW1ib2xQKTsKLSAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotICBhZGRyZXNzX29mX3ZhciA9IGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmU7Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSk6Ci0gICAgICAvKiAqYWRkcmVzc1AgaG9sZHMgdGhlIHJlZ2lzdGVycyBudW1iZXIsIHBsdXMgMHgxMCwgaWYgaXQncyBkZWZlcnJlZAotICAgICAgIG1vZGUuIFRvIHNldCB1cCB0aGUgcmlnaHQgbW9kZSwganVzdCBPUiB0aGUgc2l6ZSBvZiB0aGlzIGRpc3BsYWNlbWVudCAqLwotICAgICAgLyogQnl0ZSBkaXNwbGFjZW1lbnQuICovCi0gICAgICAqYWRkcmVzc1ArKyB8PSBUQUhPRV9QQ19PUl9CWVRFOwotICAgICAgKmFkZHJlc3NQID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfV09SRCk6Ci0gICAgICAvKiBXb3JkIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgICphZGRyZXNzUCsrIHw9IFRBSE9FX1BDX09SX1dPUkQ7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDMpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfTE9ORyk6Ci0gICAgICAvKiBMb25nIHdvcmQgZGlzcGxhY2VtZW50LiAqLwotICAgICAgKmFkZHJlc3NQKysgfD0gVEFIT0VfUENfT1JfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNSksIDQpOwotICAgICAgZXh0ZW5zaW9uID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk6Ci0gICAgICAqYWRkcmVzc1AgPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOwotICAgICAgZXh0ZW5zaW9uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICAqb3Bjb2RlUCBePSAweDEwOwkJLyogUmV2ZXJzZSBzZW5zZSBvZiB0ZXN0LiAqLwotICAgICAgKmFkZHJlc3NQKysgPSAzOwkJLyogSnVtcCBvdmVyIHdvcmQgYnJhbmNoICovCi0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0JSVzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNCksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICAqb3Bjb2RlUCBePSAweDEwOwkJLyogUmV2ZXJzZSBzZW5zZSBvZiB0ZXN0LiAqLwotICAgICAgKmFkZHJlc3NQKysgPSA2OwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9KTVA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MsIDQpOwotICAgICAgZXh0ZW5zaW9uID0gNzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0JZVEUpOgotICAgICAgKmFkZHJlc3NQID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKLSAgICAgIGV4dGVuc2lvbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgICpvcGNvZGVQID0gVEFIT0VfQlJXOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICAqb3Bjb2RlUCA9IFRBSE9FX0pNUDsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICAqb3Bjb2RlUCBePSAweDEwOwotICAgICAgKmFkZHJlc3NQKysgPSAwOwotICAgICAgKmFkZHJlc3NQKysgPSA2OwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9KTVA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MsIDQpOwotICAgICAgZXh0ZW5zaW9uID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgKmFkZHJlc3NQKysgPSAwOwotICAgICAgKmFkZHJlc3NQKysgPSAyOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9CUkI7Ci0gICAgICAqYWRkcmVzc1ArKyA9IDY7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0pNUDsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOwotfQkJCQkvKiBtZF9jb252ZXJ0X2ZyYWcgKi8KLQwKLQotLyogVGhpcyBpcyB0aGUgc3R1ZmYgZm9yIG1kX2Fzc2VtYmxlLiAqLwotI2RlZmluZSBGUF9SRUcgMTMKLSNkZWZpbmUgU1BfUkVHIDE0Ci0jZGVmaW5lIFBDX1JFRyAxNQotI2RlZmluZSBCSUdHRVNUUkVHIFBDX1JFRwotCi0vKgotICogUGFyc2UgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFNUQVJUCi0gKiBJZiBpdCByZXByZXNlbnRzIGEgdmFsaWQgcmVnaXN0ZXIsIHBvaW50IFNUQVJUIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIKLSAqIHRoZSBsYXN0IHZhbGlkIHJlZ2lzdGVyIGNoYXIsIGFuZCByZXR1cm4gdGhlIHJlZ2lzdGVyIG51bWJlciAoMC0xNSkuCi0gKiBJZiBpbnZhbGlkLCBsZWF2ZSBTVEFSVCBhbG9uZSwgcmV0dXJuIC0xLgotICogVGhlIGZvcm1hdCBoYXMgdG8gYmUgZXhhY3QuIEkgZG9uJ3QgZG8gdGhpbmdzIGxpa2UgZWF0IGxlYWRpbmcgemVyb3MKLSAqIG9yIHRoZSBsaWtlLgotICogTm90ZTogVGhpcyBkb2Vzbid0IGNoZWNrIGZvciB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyBtYWtpbmcKLSAqIHRoaXMgaW52YWxpZC4gRXg6IFIxMjMgd291bGQgcmV0dXJuIDEyLCBpdCdzIHRoZSBjYWxsZXJzIGpvYiB0byBjaGVjawotICogd2hhdCBzdGFydCBpcyBwb2ludCB0byBhcG9uIHJldHVybi4KLSAqCi0gKiBWYWxpZCByZWdpc3RlcnMgYXJlIFIxLVIxNSwgJTEtJTE1LCBGUCAoMTMpLCBTUCAoMTQpLCBQQyAoMTUpCi0gKiBDYXNlIGRvZXNuJ3QgbWF0dGVyLgotICovCi1pbnQKLXRhaG9lX3JlZ19wYXJzZSAoc3RhcnQpCi0gICAgIGNoYXIgKipzdGFydDsJCS8qIEEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRvIHBhcnNlLiAqLwotewotICByZWdpc3RlciBjaGFyICpyZWdwb2ludCA9ICpzdGFydDsKLSAgcmVnaXN0ZXIgaW50IHJlZ251bSA9IC0xOwotCi0gIHN3aXRjaCAoKnJlZ3BvaW50KyspCi0gICAgewotICAgIGNhc2UgJyUnOgkJCS8qIFJlZ2lzdGVycyBjYW4gc3RhcnQgd2l0aCBhICUsCi0JCQkJICAgUiBvciByLCBhbmQgdGhlbiBhIG51bWJlci4gKi8KLSAgICBjYXNlICdSJzoKLSAgICBjYXNlICdyJzoKLSAgICAgIGlmIChpc2RpZ2l0ICgqcmVncG9pbnQpKQotCXsKLQkgIC8qIEdvdCB0aGUgZmlyc3QgZGlnaXQuICovCi0JICByZWdudW0gPSAqcmVncG9pbnQrKyAtICcwJzsKLQkgIGlmICgocmVnbnVtID09IDEpICYmIGlzZGlnaXQgKCpyZWdwb2ludCkpCi0JICAgIHsKLQkgICAgICAvKiBJdHMgYSB0d28gZGlnaXQgbnVtYmVyLiAqLwotCSAgICAgIHJlZ251bSA9IDEwICsgKCpyZWdwb2ludCsrIC0gJzAnKTsKLQkgICAgICBpZiAocmVnbnVtID4gQklHR0VTVFJFRykKLQkJewkJLyogTnVtYmVyIHRvbyBiaWc/ICovCi0JCSAgcmVnbnVtID0gLTE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0YnOgkJCS8qIElzIGl0IHRoZSBGUCAqLwotICAgIGNhc2UgJ2YnOgotICAgICAgc3dpdGNoICgqcmVncG9pbnQrKykKLQl7Ci0JY2FzZSAncCc6Ci0JY2FzZSAnUCc6Ci0JICByZWdudW0gPSBGUF9SRUc7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6CQkJLyogSG93IGFib3V0IHRoZSBTUCAqLwotICAgIGNhc2UgJ1MnOgotICAgICAgc3dpdGNoICgqcmVncG9pbnQrKykKLQl7Ci0JY2FzZSAncCc6Ci0JY2FzZSAnUCc6Ci0JICByZWdudW0gPSBTUF9SRUc7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6CQkJLyogT1IgdGhlIFBDIGV2ZW4gKi8KLSAgICBjYXNlICdQJzoKLSAgICAgIHN3aXRjaCAoKnJlZ3BvaW50KyspCi0JewotCWNhc2UgJ2MnOgotCWNhc2UgJ0MnOgotCSAgcmVnbnVtID0gUENfUkVHOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAocmVnbnVtICE9IC0xKQotICAgIHsJCQkJLyogTm8gZXJyb3IsIHNvIG1vdmUgc3RyaW5nIHBvaW50ZXIgKi8KLSAgICAgICpzdGFydCA9IHJlZ3BvaW50OwotICAgIH0KLSAgcmV0dXJuIHJlZ251bTsJCS8qIFJldHVybiByZXN1bHRzICovCi19CQkJCS8qIHRhaG9lX3JlZ19wYXJzZSAqLwotDAotLyoKLSAqIFRoaXMgY2hvcHMgdXAgYW4gb3BlcmFuZCBhbmQgZmlndXJlcyBvdXQgaXRzIG1vZGVzIGFuZCBzdHVmZi4KLSAqIEl0J3MgYSBsaXR0bGUgdG91Y2h5IGFib3V0IGV4dHJhIGNoYXJhY3RlcnMuCi0gKiBPcHRleCB0byBzdGFydCB3aXRoIG9uZSBleHRyYSBjaGFyYWN0ZXIgc28gaXQgY2FuIGJlIG92ZXJ3cml0dGVuIGZvcgotICogdGhlIGJhY2t3YXJkIHBhcnQgb2YgdGhlIHBhcnNpbmcuCi0gKiBZb3UgY2FuJ3QgcHV0IGEgYnVuY2ggb2YgZXh0cmEgY2hhcmFjdGVycyBpbiBzaWRlIHRvCi0gKiBtYWtlIHRoZSBjb21tYW5kIGxvb2sgY3V0ZS4gaWU6ICogZm9vICggcjEgKSBbICByMCBdCi0gKiBJZiB5b3UgbGlrZSBkb2luZyBhIGxvdCBvZiB0eXBpbmcsIHRyeSBDT0JPTCEKLSAqIEFjdHVhbGx5LCB0aGlzIHBhcnNlciBpcyBhIGxpdHRsZSB3ZWFrIGFsbCBhcm91bmQuIEl0J3MgZGVzaWduZWQgdG8gYmUKLSAqIHVzZWQgd2l0aCBjb21wbGllcnMsIHNvIEkgZW1waGlzaXNlIGNvcnJlY3QgZGVjb2Rpbmcgb2YgdmFsaWQgY29kZSBxdWlja2x5Ci0gKiByYXRoZXIgdGhhdCBjYXRjaGluZyBldmVyeSBwb3NzYWJsZSBlcnJvci4KLSAqIE5vdGU6IFRoaXMgdXNlcyB0aGUgZXhwcmVzc2lvbiBmdW5jdGlvbiwgc28gc2F2ZSBpbnB1dF9saW5lX3BvaW50ZXIgYmVmb3JlCi0gKiBjYWxsaW5nLgotICoKLSAqIFNwZXJyeSBkZWZpbmVzIHRoZSBzZW1hbnRpY3Mgb2YgYWRkcmVzcyBtb2RlcyAoYW5kIHZhbHVlcykKLSAqIGJ5IGEgdHdvLWxldHRlciBjb2RlLCBleHBsYWluZWQgaGVyZS4KLSAqCi0gKiAgIGxldHRlciAxOiAgIGFjY2VzcyB0eXBlCi0gKgotICogICAgIGEgICAgICAgICBhZGRyZXNzIGNhbGN1bGF0aW9uIC0gbm8gZGF0YSBhY2Nlc3MsIHJlZ2lzdGVycyBmb3JiaWRkZW4KLSAqICAgICBiICAgICAgICAgYnJhbmNoIGRpc3BsYWNlbWVudAotICogICAgIG0gICAgICAgICByZWFkIC0gbGV0IGdvIG9mIGJ1cyAtIHdyaXRlIGJhY2sgIm1vZGlmeSIKLSAqICAgICByICAgICAgICAgcmVhZAotICogICAgIHcgICAgICAgICB3cml0ZQotICogICAgIHYgICAgICAgICBiaXQgZmllbGQgYWRkcmVzczogbGlrZSAnYScgYnV0IHJlZ2lzdGVycyBhcmUgT0sKLSAqCi0gKiAgIGxldHRlciAyOiAgIGRhdGEgdHlwZSAoaS5lLiB3aWR0aCwgYWxpZ25tZW50KQotICoKLSAqICAgICBiICAgICAgICAgYnl0ZQotICogICAgIHcgICAgICAgICB3b3JkCi0gKiAgICAgbCAgICAgICAgIGxvbmd3b3JkCi0gKiAgICAgcSAgICAgICAgIHF1YWR3b3JkIChFdmVuIHJlZ3MgPCAxNCBhbGxvd2VkKSAoaWYgMTIsIHlvdSBnZXQgYSB3YXJuaW5nKQotICogICAgIC0JIHVuY29uZGl0aW9uYWwgc3ludGhldGljIGpiciBvcGVyYW5kCi0gKiAgICAgPwkgc2ltcGxlIHN5bnRoZXRpYyByZXZlcnNhYmxlIGJyYW5jaCBvcGVyYW5kCi0gKiAgICAgIQkgY29tcGxleCBzeW50aGV0aWMgcmV2ZXJzYWJsZSBicmFuY2ggb3BlcmFuZAotICogICAgIDoJIGNvbXBsZXggc3ludGhldGljIG5vbi1yZXZlcnNhYmxlIGJyYW5jaCBvcGVyYW5kCi0gKgotICogVGhlICctPyE6JyBsZXR0ZXIgMidzIGFyZSBub3QgZm9yIGV4dGVybmFsIGNvbnN1bXB0aW9uLiBUaGV5IGFyZSB1c2VkCi0gKiBieSBHQVMgZm9yIHBzdWVkbyBvcHMgcmVsYXhpbmcgY29kZS4KLSAqCi0gKiBBZnRlciBwYXJzaW5nIHRvcFAgaGFzOgotICoKLSAqICAgdG9wX25keDogICAgICAgIC0xLCBvciB0aGUgaW5kZXggcmVnaXN0ZXIuIGVnIDc9W1I3XQotICogICB0b3BfcmVnOiAgICAgICAgLTEsIG9yIHJlZ2lzdGVyIG51bWJlci4gZWcgNyA9IFI3IG9yIChSNykKLSAqICAgdG9wX21vZGU6ICAgICAgIFRoZSBhZGRyZXNzaW5nIG1vZGUgYnl0ZS4gVGhpcyBieXRlLCBkZWZpbmVzIHdoaWNoIG9mCi0gKiAgICAgICAgICAgICAgICAgICB0aGUgMTEgbW9kZXMgb3Bjb2RlIGlzLgotICogICB0b3BfYWNjZXNzOiAgICAgQWNjZXNzIHR5cGUgd2FudGVkIGZvciB0aGlzIG9wcGVyYW5kICdiJ2JyYW5jaCAnICcKLSAqICAgICAgICAgICAgICAgICAgIG5vLWluc3RydWN0aW9uICdhbXJ2dycKLSAqICAgdG9wX3dpZHRoOiAgICAgIE9wZXJhbmQgd2lkdGggZXhwZWN0ZWQsIG9uZSBvZiAiYndscT8tOiEiCi0gKiAgIGV4cF9vZl9vcGVyYW5kOiBUaGUgZXhwcmVzc2lvbiBhcyBwYXJzZWQgYnkgZXhwcmVzc2lvbigpCi0gKiAgIHRvcF9kaXNwc2l6ZTogICBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGRpc3BsYWNlbWVudCBpZiB3ZSBjYW4gZmlndXJlIGl0Ci0gKiAgICAgICAgICAgICAgICAgICBvdXQgYW5kIGl0J3MgcmVsYXZlbnQuCi0gKgotICogTmVlZCBzeW50YXggY2hlY2tzIGJ1aWx0LgotICovCi0KLXZvaWQKLXRpcF9vcCAob3B0ZXgsIHRvcFApCi0gICAgIGNoYXIgKm9wdGV4OwkJLyogVGhlIHVzZXJzIHRleHQgaW5wdXQsIHdpdGggb25lIGxlYWRpbmcgY2hhcmFjdGVyICovCi0gICAgIHN0cnVjdCB0b3AgKnRvcFA7CQkvKiBUaGUgdGFob2UgaW5zdHJ1Y3Rpb24gd2l0aCBzb21lIGZpZWxkcyBhbHJlYWR5IHNldDoKLQkJCSBpbjogYWNjZXNzLCB3aWR0aAotCQkJIG91dDogbmR4LCByZWcsIG1vZGUsIGVycm9yLCBkaXNwc2l6ZSAqLwotCi17Ci0gIGludCBtb2RlID0gMDsJCQkvKiBUaGlzIG9wZXJhbmQncyBtb2RlLiAqLwotICBjaGFyIHNlZ2ZhdWx0ID0gKm9wdGV4OwkvKiBUbyBrZWVwIHRoZSBiYWNrIHBhcnNpbmcgZnJvbSBmcmVha2luZy4gKi8KLSAgY2hhciAqcG9pbnQgPSBvcHRleCArIDE7CS8qIFBhcnNpbmcgZnJvbSBmcm9udCB0byBiYWNrLiAqLwotICBjaGFyICplbmQ7CQkJLyogUGFyc2luZyBmcm9tIGJhY2sgdG8gZnJvbnQuICovCi0gIGludCByZWcgPSAtMTsJCQkvKiBtYWpvciByZWdpc3RlciwgLTEgbWVhbnMgYWJzZW50ICovCi0gIGludCBpbXJlZyA9IC0xOwkJLyogTWFqb3IgcmVnaXN0ZXIgaW4gaW1tZWRpYXRlIG1vZGUgKi8KLSAgaW50IG5keCA9IC0xOwkJCS8qIGluZGV4IHJlZ2lzdGVyIG51bWJlciwgLTEgbWVhbnMgYWJzZW50ICovCi0gIGNoYXIgZGVjX2luYyA9ICcgJzsJCS8qIElzIHRoZSBTUCBhdXRvLWluY3JlbWVudGVkICcrJyBvcgotCQkJCSAgIGF1dG8tZGVjcmVtZW50ZWQgJy0nIG9yIG5laXRoZXIgJyAnLiAqLwotICBpbnQgaW1tZWRpYXRlID0gMDsJCS8qIDEgaWYgJyQnIGltbWVkaWF0ZSBtb2RlICovCi0gIGludCBjYWxsX3dpZHRoID0gMDsJCS8qIElmIHRoZSBjYWxsZXIgY2FzdHMgdGhlIGRpc3BsYWNlbWVudCAqLwotICBpbnQgYWJzX3dpZHRoID0gMDsJCS8qIFRoZSB3aWR0aCBvZiB0aGUgYWJzb2x1dGUgZGlzcGxhY21lbnQgKi8KLSAgaW50IGNvbV93aWR0aCA9IDA7CQkvKiBEaXNwbGFjZW1lbnQgd2lkdGggcmVxdWlyZWQgYnkgYnJhbmNoICovCi0gIGludCBkZWZlcnJlZCA9IDA7CQkvKiAxIGlmICcqJyBkZWZlcnJhbCBpcyB1c2VkICovCi0gIGJ5dGUgZGlzcF9zaXplID0gMDsJCS8qIEhvdyBiaWcgaXMgdGhpcyBvcGVyYW5kLiAwID09IGRvbid0IGtub3cgKi8KLSAgY2hhciAqb3BfYmFkID0gIiI7CQkvKiBCYWQgb3BlcmFuZCBlcnJvciAqLwotCi0gIGNoYXIgKnRwLCAqdGVtcCwgYzsJCS8qIFRlbXBvcmFyeSBob2xkZXJzICovCi0KLSAgY2hhciBhY2Nlc3MgPSB0b3BQLT50b3BfYWNjZXNzOwkvKiBTYXZlIG9uIGEgZGVyZWYuICovCi0gIGNoYXIgd2lkdGggPSB0b3BQLT50b3Bfd2lkdGg7Ci0KLSAgaW50IHJlYWxseV9ub25lID0gMDsJCS8qIEVtcHR5IGV4cHJlc3Npb25zIGV2YWx1YXRlIHRvIDAKLQkJCQkgICBidXQgSSBuZWVkIHRvIGtub3cgaWYgaXQncyB0aGVyZSBvciBub3QgKi8KLSAgZXhwcmVzc2lvblMgKmV4cFA7CQkvKiAtPiBleHByZXNzaW9uIHZhbHVlcyBmb3IgdGhpcyBvcGVyYW5kICovCi0KLSAgLyogRG9lcyB0aGlzIGNvbW1hbmQgcmVzdHJpY3QgdGhlIGRpc3BsYWNlbWVudCBzaXplLiAqLwotICBpZiAoYWNjZXNzID09ICdiJykKLSAgICBjb21fd2lkdGggPSAod2lkdGggPT0gJ2InID8gMSA6Ci0JCSAod2lkdGggPT0gJ3cnID8gMiA6Ci0JCSAgKHdpZHRoID09ICdsJyA/IDQgOiAwKSkpOwotCi0gICpvcHRleCA9ICdcMCc7CQkvKiBUaGlzIGlzIGtpbmQgb2YgYSBiYWNrIHN0b3AgZm9yIGFsbAotCQkJCSAgIHRoZSBzZWFyY2hlcyB0byBmYWlsIG9uIGlmIG5lZWRlZC4qLwotICBpZiAoKnBvaW50ID09ICcqJykKLSAgICB7CQkJCS8qIEEgZGVyZWZlcmVuY2U/ICovCi0gICAgICBkZWZlcnJlZCA9IDE7Ci0gICAgICBwb2ludCsrOwotICAgIH0KLQotICAvKiBGb3JjZSB3b3JkcyBpbnRvIGEgY2VydGFpbiBtb2RlICovCi0gIC8qIEJpdGNoLCBCaXRjaCwgQml0Y2ghICovCi0gIC8qCi0gICAqIFVzaW5nIHRoZSBeIG9wZXJhdG9yIGlzIGFtYmlnb3VzLiBJZiBJIGhhdmUgYW4gYWJzb2x1dGUgbGFiZWwKLSAgICogY2FsbGVkICd3JyBzZXQgdG8sIHNheSAyLCBhbmQgSSBoYXZlIHRoZSBleHByZXNzaW9uICd3XjEnLCBkbyBJIGdldAotICAgKiAxLCBmb3JjZWQgdG8gYmUgaW4gd29yZCBkaXNwbGFjZW1lbnQgbW9kZSwgb3IgZG8gSSBnZXQgdGhlIHZhbHVlIG9mCi0gICAqICd3JyBvcidlZCB3aXRoIDEgKDMgaW4gdGhpcyBjYXNlKS4KLSAgICogVGhlIGRlZmF1bHQgaXMgJ3cnIGFzIGFuIG9mZnNldCwgc28gdGhhdCdzIHdoYXQgSSB1c2UuCi0gICAqIFN0aWNrIHdpdGggYCwgaXQgZG9lcyB0aGUgc2FtZSwgYW5kIGlzbid0IGFtYmlnLgotICAgKi8KLQotICBpZiAoKnBvaW50ICE9ICdcMCcgJiYgKChwb2ludFsxXSA9PSAnXicpIHx8IChwb2ludFsxXSA9PSAnYCcpKSkKLSAgICBzd2l0Y2ggKCpwb2ludCkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ2InOgotICAgICAgY2FzZSAnQic6Ci0gICAgICBjYXNlICd3JzoKLSAgICAgIGNhc2UgJ1cnOgotICAgICAgY2FzZSAnbCc6Ci0gICAgICBjYXNlICdMJzoKLQlpZiAoY29tX3dpZHRoKQotCSAgYXNfd2FybiAoXygiQ2FzdGluZyBhIGJyYW5jaCBkaXNwbGFjZW1lbnQgaXMgYmFkIGZvcm0sIGFuZCBpcyBpZ25vcmVkLiIpKTsKLQllbHNlCi0JICB7Ci0JICAgIGMgPSAoaXN1cHBlciAoKnBvaW50KSA/IHRvbG93ZXIgKCpwb2ludCkgOiAqcG9pbnQpOwotCSAgICBjYWxsX3dpZHRoID0gKChjID09ICdiJykgPyAxIDoKLQkJCSAgKChjID09ICd3JykgPyAyIDogNCkpOwotCSAgfQotCXBvaW50ICs9IDI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgLyogU2V0dGluZyBpbW1lZGlhdGUgbW9kZSAqLwotICBpZiAoKnBvaW50ID09ICckJykKLSAgICB7Ci0gICAgICBpbW1lZGlhdGUgPSAxOwotICAgICAgcG9pbnQrKzsKLSAgICB9Ci0KLSAgLyoKLSAgICogSSd2ZSBwdWxsZWQgb2ZmIGFsbCB0aGUgZWFzeSBzdHVmZiBvZmYgdGhlIGZyb250LCBtb3ZlIHRvIHRoZSBlbmQgYW5kCi0gICAqIHlhbmsuCi0gICAqLwotCi0gIGZvciAoZW5kID0gcG9pbnQ7ICplbmQgIT0gJ1wwJzsgZW5kKyspCS8qIE1vdmUgdG8gdGhlIGVuZC4gKi8KLSAgICA7Ci0KLSAgaWYgKGVuZCAhPSBwb2ludCkJCS8qIE51bGwgc3RyaW5nPyAqLwotICAgIGVuZC0tOwotCi0gIGlmIChlbmQgPiBwb2ludCAmJiAqZW5kID09ICcgJyAmJiBlbmRbLTFdICE9ICdcJycpCi0gICAgZW5kLS07CQkJLyogSG9wIHdoaXRlIHNwYWNlICovCi0KLSAgLyogSXMgdGhpcyBhbiBpbmRleCByZWcuICovCi0gIGlmICgoKmVuZCA9PSAnXScpICYmIChlbmRbLTFdICE9ICdcJycpKQotICAgIHsKLSAgICAgIHRlbXAgPSBlbmQ7Ci0KLSAgICAgIC8qIEZpbmQgb3BlbmluZyBicmFjZS4gKi8KLSAgICAgIGZvciAoLS1lbmQ7ICgqZW5kICE9ICdbJyAmJiBlbmQgIT0gcG9pbnQpOyBlbmQtLSkKLQk7Ci0KLSAgICAgIC8qIElmIEkgZm91bmQgdGhlIG9wZW5pbmcgYnJhY2UsIGdldCB0aGUgaW5kZXggcmVnaXN0ZXIgbnVtYmVyLiAqLwotICAgICAgaWYgKCplbmQgPT0gJ1snKQotCXsKLQkgIHRwID0gZW5kICsgMTsJCS8qIHRwIHNob3VsZCBwb2ludCB0byB0aGUgc3RhcnQgb2YgYSByZWcuICovCi0JICBuZHggPSB0YWhvZV9yZWdfcGFyc2UgKCZ0cCk7Ci0JICBpZiAodHAgIT0gdGVtcCkKLQkgICAgewkJCS8qIFJlZy4gcGFyc2UgZXJyb3IuICovCi0JICAgICAgbmR4ID0gLTE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVuZC0tOwkJLyogRm91bmQgaXQsIG1vdmUgcGFzdCBicmFjZS4gKi8KLQkgICAgfQotCSAgaWYgKG5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIG9wX2JhZCA9IF8oIkNvdWxkbid0IHBhcnNlIHRoZSBbaW5kZXhdIGluIHRoaXMgb3BlcmFuZC4iKTsKLQkgICAgICBlbmQgPSBwb2ludDsJLyogRm9yY2UgYWxsIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB0byBmYWlsLiAqLwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wX2JhZCA9IF8oIkNvdWxkbid0IGZpbmQgdGhlIG9wZW5pbmcgJ1snIGZvciB0aGUgaW5kZXggb2YgdGhpcyBvcGVyYW5kLiIpOwotCSAgZW5kID0gcG9pbnQ7CQkvKiBGb3JjZSBhbGwgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHRvIGZhaWwuICovCi0JfQotICAgIH0KLQotICAvKiBQb3N0IGluY3JlbWVudD8gKi8KLSAgaWYgKCplbmQgPT0gJysnKQotICAgIHsKLSAgICAgIGRlY19pbmMgPSAnKyc7Ci0gICAgICAvKiB3YXM6ICAgICplbmQtLTsgKi8KLSAgICAgIGVuZC0tOwotICAgIH0KLQotICAvKiByZWdpc3RlciBpbiBwYXJlbnM/ICovCi0gIGlmICgoKmVuZCA9PSAnKScpICYmIChlbmRbLTFdICE9ICdcJycpKQotICAgIHsKLSAgICAgIHRlbXAgPSBlbmQ7Ci0KLSAgICAgIC8qIEZpbmQgb3BlbmluZyBwYXJlbi4gKi8KLSAgICAgIGZvciAoLS1lbmQ7ICgqZW5kICE9ICcoJyAmJiBlbmQgIT0gcG9pbnQpOyBlbmQtLSkKLQk7Ci0KLSAgICAgIC8qIElmIEkgZm91bmQgdGhlIG9wZW5pbmcgcGFyZW4sIGdldCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAqLwotICAgICAgaWYgKCplbmQgPT0gJygnKQotCXsKLQkgIHRwID0gZW5kICsgMTsKLQkgIHJlZyA9IHRhaG9lX3JlZ19wYXJzZSAoJnRwKTsKLQkgIGlmICh0cCAhPSB0ZW1wKQotCSAgICB7Ci0JICAgICAgLyogTm90IGEgcmVnaXN0ZXIsIGJ1dCBjb3VsZCBiZSBwYXJ0IG9mIHRoZSBleHByZXNzaW9uLiAqLwotCSAgICAgIHJlZyA9IC0xOwotCSAgICAgIGVuZCA9IHRlbXA7CS8qIFJlc3QgdGhlIHBvaW50ZXIgYmFjayAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlbmQtLTsJCS8qIEZvdW5kIHRoZSByZWcuIG1vdmUgYmVmb3JlIG9wZW5pbmcgcGFyZW4uICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3BfYmFkID0gXygiQ291bGRuJ3QgZmluZCB0aGUgb3BlbmluZyAnKCcgZm9yIHRoZSBkZXJlZiBvZiB0aGlzIG9wZXJhbmQuIik7Ci0JICBlbmQgPSBwb2ludDsJCS8qIEZvcmNlIGFsbCB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgdG8gZmFpbC4gKi8KLQl9Ci0gICAgfQotCi0gIC8qIFByZSBkZWNyZW1lbnQ/ICovCi0gIGlmICgqZW5kID09ICctJykKLSAgICB7Ci0gICAgICBpZiAoZGVjX2luYyAhPSAnICcpCi0JewotCSAgb3BfYmFkID0gXygiT3BlcmFuZCBjYW4ndCBiZSBib3RoIHByZS1pbmMgYW5kIHBvc3QtZGVjLiIpOwotCSAgZW5kID0gcG9pbnQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRlY19pbmMgPSAnLSc7Ci0JICAvKiB3YXM6ICAgICAgKmVuZC0tOyAqLwotCSAgZW5kLS07Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBFdmVyeXRoaW5nIGJldHdlZW4gcG9pbnQgYW5kIGVuZCBpcyB0aGUgJ2V4cHJlc3Npb24nLCB1bmxlc3MgaXQncwotICAgKiBhIHJlZ2lzdGVyIG5hbWUuCi0gICAqLwotCi0gIGMgPSBlbmRbMV07Ci0gIGVuZFsxXSA9ICdcMCc7Ci0KLSAgdHAgPSBwb2ludDsKLSAgaW1yZWcgPSB0YWhvZV9yZWdfcGFyc2UgKCZwb2ludCk7CS8qIEdldCB0aGUgaW1tZWRpYXRlIHJlZ2lzdGVyCi0JCQkJICAgICAgaWYgaXQgaXMgdGhlcmUuKi8KLSAgaWYgKCpwb2ludCAhPSAnXDAnKQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGlzIGp1bmsgYWZ0ZXIgcG9pbnQsIHRoZW4gdGhlIGl0J3Mgbm90IGltbWVkaWF0ZSByZWcuICovCi0gICAgICBwb2ludCA9IHRwOwotICAgICAgaW1yZWcgPSAtMTsKLSAgICB9Ci0KLSAgaWYgKGltcmVnICE9IC0xICYmIHJlZyAhPSAtMSkKLSAgICBvcF9iYWQgPSBfKCJJIHBhcnNlZCAyIHJlZ2lzdGVycyBpbiB0aGlzIG9wZXJhbmQuIik7Ci0KLSAgLyoKLSAgICogRXZhbHVhdGUgd2hhdHMgbGVmdCBvZiB0aGUgZXhwcmVzc2lvbiB0byBzZWUgaWYgaXQncyB2YWxpZC4KLSAgICogTm90ZSBhZ2FpbjogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNhbGxpbmcgZXhwcmVzc2lvbiBoYXMgc2F2ZWQKLSAgICogaW5wdXRfbGluZV9wb2ludGVyLiAoTmFnLCBuYWcsIG5hZyEpCi0gICAqLwotCi0gIGlmICgqb3BfYmFkID09ICdcMCcpCi0gICAgewotICAgICAgLyogc3RhdGVtZW50IGhhcyBubyBzeW50YXggZ29vZnMgeWV0OiBsZXRzIHNuaWZmIHRoZSBleHByZXNzaW9uICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwb2ludDsKLSAgICAgIGV4cFAgPSAmKHRvcFAtPmV4cF9vZl9vcGVyYW5kKTsKLSAgICAgIHRvcFAtPnNlZ19vZl9vcGVyYW5kID0gZXhwcmVzc2lvbiAoZXhwUCk7Ci0gICAgICBzd2l0Y2ggKGV4cFAtPlhfb3ApCi0JewotCWNhc2UgT19hYnNlbnQ6Ci0JICAvKiBObyBleHByZXNzaW9uLiBGb3IgQlNENC4yIGNvbXBhdGliaWxpdHksIG1pc3NpbmcgZXhwcmVzc2lvbiBpcwotCSAgICAgYWJzb2x1dGUgMCAqLwotCSAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmVhbGx5X25vbmUgPSAxOwotCWNhc2UgT19jb25zdGFudDoKLQkgIC8qIGZvciBTRUdfQUJTT0xVVEUsIHdlIHNob3VsZG50IG5lZWQgdG8gc2V0IFhfb3Bfc3ltYm9sLAotCSAgICAgWF9hZGRfc3ltYm9sIHRvIGFueSBwYXJ0aWN1bGFyIHZhbHVlLiAqLwotCSAgLyogQnV0LCB3ZSB3aWxsIHByb2dyYW0gZGVmZW5zaXZlbHkuIFNpbmNlIHRoaXMgc2l0dWF0aW9uIG9jY3VycwotCSAgICAgcmFyZWx5IHNvIGl0IGNvc3RzIHVzIGxpdHRsZSB0byBkbyBzby4gKi8KLQkgIGV4cFAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICBleHBQLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICAvKiBIb3cgbWFueSBieXRlcyBhcmUgbmVlZGVkIHRvIGV4cHJlc3MgdGhpcyBhYnMgdmFsdWU/ICovCi0JICBhYnNfd2lkdGggPQotCSAgICAoKCgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGRkY4MCkgPT0gMCkgfHwKLQkgICAgICAoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRkZGODApID09IDB4RkZGRkZGODApKSA/IDEgOgotCSAgICAgKCgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGODAwMCkgPT0gMCkgfHwKLQkgICAgICAoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRjgwMDApID09IDB4RkZGRjgwMDApKSA/IDIgOiA0KTsKLQotCWNhc2UgT19zeW1ib2w6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAvKgotCSAgICogTWFqb3IgYnVnLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGNhc2Ugb2YgYSBvcGVyYXRvcgotCSAgICogZXhwcmVzc2lvbiBpbiBhIHN5bnRoZXRpYyBvcGNvZGUgdmFyaWFibGUtbGVuZ3RoCi0JICAgKiBpbnN0cnVjdGlvbi4gIFdlIGRvbid0IGhhdmUgYSBmcmFnIHR5cGUgdGhhdCBpcyBzbWFydAotCSAgICogZW5vdWdoIHRvIHJlbGF4IGEgb3BlcmF0b3IsIGFuZCBzbyB3ZSBqdXN0IGZvcmNlIGFsbAotCSAgICogb3BlcmF0b3JzIHRvIGJlaGF2ZSBsaWtlIFNFR19QQVNTMXMuICBDbGVhcmx5LCBpZiB0aGVyZSBpcwotCSAgICogYSBkZW1hbmQgd2UgY2FuIGludmVudCBhIG5ldyBvciBtb2RpZmllZCBmcmFnIHR5cGUgYW5kCi0JICAgKiB0aGVuIGNvZGluZyB1cCBhIGZyYWcgZm9yIHRoaXMgY2FzZSB3aWxsIGJlIGVhc3kuCi0JICAgKi8KLQkgIG5lZWRfcGFzc18yID0gMTsKLQkgIG9wX2JhZCA9IF8oIkNhbid0IHJlbG9jYXRlIGV4cHJlc3Npb24gZXJyb3IuIik7Ci0JICBicmVhazsKLQotCWNhc2UgT19iaWc6Ci0JICAvKiBUaGlzIGlzIGFuIGVycm9yLiBUYWhvZSBkb2Vzbid0IGFsbG93IGFueSBleHByZXNzaW9ucwotCSAgICAgYmlnZ2VyIHRoYXQgYSAzMiBiaXQgbG9uZyB3b3JkLiBBbnkgYmlnZ2VyIGhhcyB0byBiZSByZWZlcmVuY2VkCi0JICAgICBieSBhZGRyZXNzLiAqLwotCSAgb3BfYmFkID0gXygiRXhwcmVzc2lvbiBpcyB0b28gbGFyZ2UgZm9yIGEgMzIgYml0cy4iKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcMCcpCi0JewotCSAgb3BfYmFkID0gXygiSnVuayBhdCBlbmQgb2YgZXhwcmVzc2lvbi4iKTsKLQl9Ci0gICAgfQotCi0gIGVuZFsxXSA9IGM7Ci0KLSAgLyogSSdtIGRvbmUsIHNvIHJlc3RvcmUgb3B0ZXggKi8KLSAgKm9wdGV4ID0gc2VnZmF1bHQ7Ci0KLQotICAvKgotICAgKiBBdCB0aGlzIHBvaW50IGluIHRoZSBnYW1lLCB3ZSAoaW4gdGhlb3J5KSBoYXZlIGFsbCB0aGUgY29tcG9uZW50cyBvZgotICAgKiB0aGUgb3BlcmFuZCBhdCBsZWFzdCBwYXJzZWQuIE5vdyBpdCdzIHRpbWUgdG8gY2hlY2sgZm9yIHN5bnRheC9zZW1hbnRpYwotICAgKiBlcnJvcnMsIGFuZCBidWlsZCB0aGUgbW9kZS4KLSAgICogVGhpcyBpcyB3aGF0IEkgaGF2ZToKLSAgICogICBkZWZlcnJlZCA9IDEgaWYgJyonCi0gICAqICAgY2FsbF93aWR0aCA9IDAsMSwyLDQKLSAgICogICBhYnNfd2lkdGggPSAwLDEsMiw0Ci0gICAqICAgY29tX3dpZHRoID0gMCwxLDIsNAotICAgKiAgIGltbWVkaWF0ZSA9IDEgaWYgJyQnCi0gICAqICAgbmR4ID0gLTEgb3IgcmVnIG51bQotICAgKiAgIGRlY19pbmMgPSAnLScgb3IgJysnIG9yICcgJwotICAgKiAgIHJlZyA9IC0xIG9yIHJlZyBudW0KLSAgICogICBpbXJlZyA9IC0xIG9yIHJlZyBudW0KLSAgICogICB0b3BQLT5leHBfb2Zfb3BlcmFuZAotICAgKiAgIHJlYWxseV9ub25lCi0gICAqLwotICAvKiBJcyB0aGVyZSBhIGRpc3BsYWNlbWVudCBzaXplPyAqLwotICBkaXNwX3NpemUgPSAoY2FsbF93aWR0aCA/IGNhbGxfd2lkdGggOgotCSAgICAgICAoY29tX3dpZHRoID8gY29tX3dpZHRoIDoKLQkJYWJzX3dpZHRoID8gYWJzX3dpZHRoIDogMCkpOwotCi0gIGlmICgqb3BfYmFkID09ICdcMCcpCi0gICAgewotICAgICAgaWYgKGltcmVnICE9IC0xKQotCXsKLQkgIC8qIFJuICovCi0JICBtb2RlID0gVEFIT0VfRElSRUNUX1JFRzsKLQkgIGlmIChkZWZlcnJlZCB8fCBpbW1lZGlhdGUgfHwgKGRlY19pbmMgIT0gJyAnKSB8fAotCSAgICAgIChyZWcgIT0gLTEpIHx8ICFyZWFsbHlfbm9uZSkKLQkgICAgb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIGRpcmVjdCByZWdpc3RlciBtb2RlLiIpOwotCSAgZWxzZSBpZiAobmR4ICE9IC0xKQotCSAgICBvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaW5kZXggYSByZWdpc3RlciBpbiBkaXJlY3QgcmVnaXN0ZXIgbW9kZS4iKTsKLQkgIGVsc2UgaWYgKGltcmVnID09IFNQX1JFRyAmJiBhY2Nlc3MgPT0gJ3InKQotCSAgICBvcF9iYWQgPQotCSAgICAgIF8oIlNQIGNhbid0IGJlIHRoZSBzb3VyY2Ugb3BlcmFuZCB3aXRoIGRpcmVjdCByZWdpc3RlciBhZGRyZXNzaW5nLiIpOwotCSAgZWxzZSBpZiAoYWNjZXNzID09ICdhJykKLQkgICAgb3BfYmFkID0gXygiQ2FuJ3QgdGFrZSB0aGUgYWRkcmVzcyBvZiBhIHJlZ2lzdGVyLiIpOwotCSAgZWxzZSBpZiAoYWNjZXNzID09ICdiJykKLQkgICAgb3BfYmFkID0gXygiRGlyZWN0IFJlZ2lzdGVyIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7Ci0JICBlbHNlIGlmICh3aWR0aCA9PSAncScgJiYgKChpbXJlZyAlIDIpIHx8IChpbXJlZyA+IDEzKSkpCi0JICAgIG9wX2JhZCA9IF8oIkZvciBxdWFkIGFjY2VzcywgdGhlIHJlZ2lzdGVyIG11c3QgYmUgZXZlbiBhbmQgPCAxNC4iKTsKLQkgIGVsc2UgaWYgKGNhbGxfd2lkdGgpCi0JICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBjYXN0IGEgZGlyZWN0IHJlZ2lzdGVyLiIpOwotCi0JICBpZiAoKm9wX2JhZCA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogTm8gZXJyb3JzLCBjaGVjayBmb3Igd2FybmluZ3MgKi8KLQkgICAgICBpZiAod2lkdGggPT0gJ3EnICYmIGltcmVnID09IDEyKQotCQlhc193YXJuIChfKCJVc2luZyByZWcgMTQgZm9yIHF1YWR3b3JkcyBjYW4gdHJvbXAgdGhlIEZQIHJlZ2lzdGVyLiIpKTsKLQotCSAgICAgIHJlZyA9IGltcmVnOwotCSAgICB9Ci0KLQkgIC8qIFdlIGtub3c6IGltbSA9IC0xICovCi0JfQotICAgICAgZWxzZSBpZiAoZGVjX2luYyA9PSAnLScpCi0JewotCSAgLyogLShTUCkgKi8KLQkgIG1vZGUgPSBUQUhPRV9BVVRPX0RFQzsKLQkgIGlmIChkZWZlcnJlZCB8fCBpbW1lZGlhdGUgfHwgIXJlYWxseV9ub25lKQotCSAgICBvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gYXV0by1kZWMgbW9kZS4iKTsKLQkgIGVsc2UgaWYgKG5keCAhPSAtMSkKLQkgICAgb3BfYmFkID0gXygiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggYXV0byBkZWMgbW9kZS4iKTsKLQkgIGVsc2UgaWYgKGFjY2VzcyA9PSAncicpCi0JICAgIG9wX2JhZCA9IF8oIkF1dG8gZGVjIG1vZGUgY2FudCBiZSB1c2VkIGZvciByZWFkaW5nLiIpOwotCSAgZWxzZSBpZiAocmVnICE9IFNQX1JFRykKLQkgICAgb3BfYmFkID0gXygiQXV0byBkZWMgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIik7Ci0JICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQotCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOwotCSAgZWxzZSBpZiAod2lkdGggPT0gJ3EnKQotCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyB3b24ndCB3b3JrIHdpdGggcXVhZHdvcmRzLiIpOwotCi0JICAvKiBXZSBrbm93OiBpbW0gPSAtMSwgZGVjX2luYyAhPSAnLScgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChkZWNfaW5jID09ICcrJykKLQl7Ci0JICBpZiAoaW1tZWRpYXRlIHx8ICFyZWFsbHlfbm9uZSkKLQkgICAgb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIG9uZSBvZiB0aGUgYXV0by1pbmMgbW9kZXMuIik7Ci0JICBlbHNlIGlmIChkZWZlcnJlZCkKLQkgICAgewotCSAgICAgIC8qICooU1ApKyAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9BVVRPX0lOQ19ERUZFUlJFRDsKLQkgICAgICBpZiAocmVnICE9IFNQX1JFRykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgZGVmZXJyZWQgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIik7Ci0JICAgICAgZWxzZSBpZiAobmR4ICE9IC0xKQotCQlvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBhdXRvIGluYyBkZWZlcnJlZCBtb2RlLiIpOwotCSAgICAgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYicpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIChTUCkrICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0FVVE9fSU5DOwotCSAgICAgIGlmIChhY2Nlc3MgPT0gJ20nIHx8IGFjY2VzcyA9PSAndycpCi0JCW9wX2JhZCA9IF8oIllvdSBjYW4ndCB3cml0ZSB0byBhbiBhdXRvIGluYyByZWdpc3Rlci4iKTsKLQkgICAgICBlbHNlIGlmIChyZWcgIT0gU1BfUkVHKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iKTsKLQkgICAgICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOwotCSAgICAgIGVsc2UgaWYgKHdpZHRoID09ICdxJykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgd29uJ3Qgd29yayB3aXRoIHF1YWR3b3Jkcy4iKTsKLQkgICAgICBlbHNlIGlmIChuZHggIT0gLTEpCi0JCW9wX2JhZCA9IF8oIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGluIGF1dG8gaW5jIG1vZGUuIik7Ci0JICAgIH0KLQotCSAgLyogV2Uga25vdzogaW1tID0gLTEsIGRlY19pbmMgPT0gJyAnICovCi0JfQotICAgICAgZWxzZSBpZiAocmVnICE9IC0xKQotCXsKLQkgIGlmICgobmR4ICE9IC0xKSAmJiAocmVnID09IFNQX1JFRykpCi0JICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBpbmRleCB0aGUgc3AgcmVnaXN0ZXIuIik7Ci0JICBpZiAoZGVmZXJyZWQpCi0JICAgIHsKLQkgICAgICAvKiAqPGRpc3A+KFJuKSAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRDsKLQkgICAgICBpZiAoaW1tZWRpYXRlKQotCQlvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gcmVnaXN0ZXIgZGlzcGxhY2VkIG1vZGUuIik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJlYWxseV9ub25lKQotCSAgICB7Ci0JICAgICAgLyogKFJuKSAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9SRUdfREVGRVJSRUQ7Ci0JICAgICAgLyogaWYgcmVnID0gU1AgdGhlbiBjYW50IGJlIGluZGV4ZWQgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogPGRpc3A+KFJuKSAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9SRUdfRElTUDsKLQkgICAgfQotCi0JICAvKiBXZSBrbm93OiBpbW0gPSAtMSwgZGVjX2luYyA9PSAnICcsIFJlZyA9IC0xICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChyZWFsbHlfbm9uZSkKLQkgICAgb3BfYmFkID0gXygiQW4gb2ZmZXN0IGlzIG5lZWRlZCBmb3IgdGhpcyBvcGVyYW5kLiIpOwotCSAgaWYgKGRlZmVycmVkICYmIGltbWVkaWF0ZSkKLQkgICAgewotCSAgICAgIC8qICokPEFERFI+ICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0FCU09MVVRFX0FERFI7Ci0JICAgICAgZGlzcF9zaXplID0gNDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW1tZWRpYXRlKQotCSAgICB7Ci0JICAgICAgLyogJDxkaXNwPiAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9JTU1FRElBVEU7Ci0JICAgICAgaWYgKG5keCAhPSAtMSkKLQkJb3BfYmFkID0gXygiWW91IGNhbid0IGluZGV4IGEgcmVnaXN0ZXIgaW4gaW1tZWRpYXRlIG1vZGUuIik7Ci0JICAgICAgaWYgKGFjY2VzcyA9PSAnYScpCi0JCW9wX2JhZCA9IF8oIkltbWVkaWF0ZSBhY2Nlc3MgY2FuJ3QgYmUgdXNlZCBhcyBhbiBhZGRyZXNzLiIpOwotCSAgICAgIC8qIHBvbmRlciB0aGUgd2lzZG9tIG9mIGEgY2FzdCBiZWNhdXNlIGl0IGRvZXNuJ3QgZG8gYW55IGdvb2QuICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKGRlZmVycmVkKQotCSAgICB7Ci0JICAgICAgLyogKjxkaXNwPiAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogPGRpc3A+ICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0RJU1BMQUNFRF9SRUxBVElWRTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogQXQgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvcnMgd2UgY2FuIGRvIGhhdmUgYmUgY2hlY2tlZCBmb3IuCi0gICAqIFdlIGNhbiBidWlsZCB0aGUgJ3RvcCcuICovCi0KLSAgdG9wUC0+dG9wX25keCA9IG5keDsKLSAgdG9wUC0+dG9wX3JlZyA9IHJlZzsKLSAgdG9wUC0+dG9wX21vZGUgPSBtb2RlOwotICB0b3BQLT50b3BfZXJyb3IgPSBvcF9iYWQ7Ci0gIHRvcFAtPnRvcF9kaXNwc2l6ZSA9IGRpc3Bfc2l6ZTsKLX0JCQkJLyogdGlwX29wICovCi0MCi0vKgotICogICAgICAgICAgICAgICAgICB0IGkgcCAoICkKLSAqCi0gKiBUaGlzIGNvbnZlcnRzIGEgc3RyaW5nIGludG8gYSB0YWhvZSBpbnN0cnVjdGlvbi4KLSAqIFRoZSBzdHJpbmcgbXVzdCBiZSBhIGJhcmUgc2luZ2xlIGluc3RydWN0aW9uIGluIHRhaG9lICh3aXRoIEJTRDQgZnJvYnMpCi0gKiBmb3JtYXQuCi0gKiBJdCBwcm92aWRlcyBhdCBtb3N0IG9uZSBmYXRhbCBlcnJvciBtZXNzYWdlICh3aGljaCBzdG9wcyB0aGUgc2NhbikKLSAqIHNvbWUgd2FybmluZyBtZXNzYWdlcyBhcyBpdCBmaW5kcyB0aGVtLgotICogVGhlIHRhaG9lIGluc3RydWN0aW9uIGlzIHJldHVybmVkIGluIGV4cGxvZGVkIGZvcm0uCi0gKgotICogVGhlIGV4cGxvZGVkIGluc3RydWN0aW9uIGlzIHJldHVybmVkIHRvIGEgc3RydWN0IHRpdCBvZiB5b3VyIGNob2ljZS4KLSAqICNpbmNsdWRlICJ0YWhvZS1pbnN0LmgiIHRvIGtub3cgd2hhdCBhIHN0cnVjdCB0aXQgaXMuCi0gKgotICovCi0KLXN0YXRpYyB2b2lkCi10aXAgKHRpdFAsIGluc3RyaW5nKQotICAgICBzdHJ1Y3QgdGl0ICp0aXRQOwkJLyogV2UgYnVpbGQgYW4gZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaGVyZS4gKi8KLSAgICAgY2hhciAqaW5zdHJpbmc7CQkvKiBUZXh0IG9mIGEgdmF4IGluc3RydWN0aW9uOiB3ZSBtb2RpZnkuICovCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB0b3Rfd290ICp0d1AgPSBOVUxMOwkvKiBIb3cgdG8gYml0LWVuY29kZSB0aGlzIG9wY29kZS4gKi8KLSAgcmVnaXN0ZXIgY2hhciAqcDsJCS8qIDEvc2tpcCB3aGl0ZXNwYWNlLjIvc2NhbiB2b3RfaG93ICovCi0gIHJlZ2lzdGVyIGNoYXIgKnE7CQkvKiAgKi8KLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjb3VudDsJLyogY291bnRzIG51bWJlciBvZiBvcGVyYW5kcyBzZWVuICovCi0gIHJlZ2lzdGVyIHN0cnVjdCB0b3AgKm9wZXJhbmRwOy8qIHNjYW4gb3BlcmFuZHMgaW4gc3RydWN0IHRpdCAqLwotICByZWdpc3RlciBjaGFyICphbGxvcGVyciA9ICIiOwkvKiBlcnJvciBvdmVyIGFsbCBvcGVyYW5kcyAqLwotICByZWdpc3RlciBjaGFyIGM7CQkvKiBSZW1lbWJlciBjaGFyLCAod2UgY2xvYmJlciBpdAotCQkJCSAgIHdpdGggJ1wwJyB0ZW1wb3JhcmlseSkuICovCi0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmICgqaW5zdHJpbmcgPT0gJyAnKQotICAgICsraW5zdHJpbmc7CQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0gIGZvciAocCA9IGluc3RyaW5nOyAqcCAmJiAqcCAhPSAnICc7IHArKykKLSAgICA7CQkJCS8qIE1VU1QgZW5kIGluIGVuZC1vZi1zdHJpbmcgb3IKLQkJCQkgICBleGFjdGx5IDEgc3BhY2UuICovCi0gIC8qIFNjYW5uZWQgdXAgdG8gZW5kIG9mIG9wZXJhdGlvbi1jb2RlLiAqLwotICAvKiBPcGVyYXRpb24tY29kZSBpcyBlbmRlZCB3aXRoIHdoaXRlc3BhY2UuICovCi0gIGlmIChwID09IGluc3RyaW5nKQotICAgIHsKLSAgICAgIHRpdFAtPnRpdF9lcnJvciA9IF8oIk5vIG9wZXJhdG9yIik7Ci0gICAgICBjb3VudCA9IDA7Ci0gICAgICB0aXRQLT50aXRfb3Bjb2RlID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjID0gKnA7Ci0gICAgICAqcCA9ICdcMCc7Ci0gICAgICAvKgotICAgICAqIEhlcmUgd2l0aCBpbnN0cmluZyBwb2ludGluZyB0byB3aGF0IGJldHRlciBiZSBhbiBvcC1uYW1lLCBhbmQgcAotICAgICAqIHBvaW50aW5nIHRvIGNoYXJhY3RlciBqdXN0IHBhc3QgdGhhdC4KLSAgICAgKiBXZSB0cnVzdCBpbnN0cmluZyBwb2ludHMgdG8gYW4gb3AtbmFtZSwgd2l0aCBubyB3aGl0ZXNwYWNlLgotICAgICAqLwotICAgICAgdHdQID0gKHN0cnVjdCB0b3Rfd290ICopIGhhc2hfZmluZCAob3BfaGFzaCwgaW5zdHJpbmcpOwotICAgICAgKnAgPSBjOwkJCS8qIFJlc3RvcmUgY2hhciBhZnRlciBvcC1jb2RlLiAqLwotICAgICAgaWYgKHR3UCA9PSAwKQotCXsKLQkgIHRpdFAtPnRpdF9lcnJvciA9IF8oIlVua25vd24gb3BlcmF0b3IiKTsKLQkgIGNvdW50ID0gMDsKLQkgIHRpdFAtPnRpdF9vcGNvZGUgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotICAgICAgICogV2UgZm91bmQgYSBtYXRjaCEgU28gbGV0cyBwaWNrIHVwIGFzIG1hbnkgb3BlcmFuZHMgYXMgdGhlCi0gICAgICAgKiBpbnN0cnVjdGlvbiB3YW50cywgYW5kIGV2ZW4gZ3JpcGUgaWYgdGhlcmUgYXJlIHRvbyBtYW55LgotICAgICAgICogV2UgZXhwZWN0IGNvbW1hIHRvIHNlcGVyYXRlIGVhY2ggb3BlcmFuZC4KLSAgICAgICAqIFdlIGxldCBpbnN0cmluZyB0cmFjayB0aGUgdGV4dCwgd2hpbGUgcCB0cmFja3MgYSBwYXJ0IG9mIHRoZQotICAgICAgICogc3RydWN0IHRvdC4KLSAgICAgICAqLwotCi0JICBjb3VudCA9IDA7CQkvKiBubyBvcGVyYW5kcyBzZWVuIHlldCAqLwotCSAgaW5zdHJpbmcgPSBwICsgKCpwICE9ICdcMCcpOwkvKiBwb2ludCBwYXN0IHRoZSBvcGVyYXRpb24gY29kZSAqLwotCSAgLyogdGlwX29wKCkgc2NyZXdzIHdpdGggdGhlIGlucHV0X2xpbmVfcG9pbnRlciwgc28gc2F2ZSBpdCBiZWZvcmUKLQkgSSBqdW1wIGluICovCi0JICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGZvciAocCA9IHR3UC0+YXJncywgb3BlcmFuZHAgPSB0aXRQLT50aXRfb3BlcmFuZDsKLQkgICAgICAgISphbGxvcGVyciAmJiAqcDsKLQkgICAgICAgb3BlcmFuZHArKywgcCArPSAyKQotCSAgICB7Ci0JICAgICAgLyoKLQkgKiBIZXJlIHRvIHBhcnNlIG9uZSBvcGVyYW5kLiBMZWF2ZSBpbnN0cmluZyBwb2ludGluZyBqdXN0Ci0JICogcGFzdCBhbnkgb25lICcsJyB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgdGhpcyBvcGVyYW5kLgotCSAqLwotCSAgICAgIGlmICghcFsxXSkKLQkJYXNfZmF0YWwgKF8oIkNvbXBpbGVyIGJ1ZzogT0REIG51bWJlciBvZiBieXRlcyBpbiBhcmcgc3RydWN0dXJlICVzLiIpLAotCQkJICB0d1AtPmFyZ3MpOwotCSAgICAgIGVsc2UgaWYgKCppbnN0cmluZykKLQkJewotCQkgIGZvciAocSA9IGluc3RyaW5nOyAoKnEgIT0gJywnICYmICpxICE9ICdcMCcpOyBxKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmICgqcSA9PSAnXCcnICYmIHFbMV0gIT0gJ1wwJykJLyogSnVtcCBxdW90ZWQgY2hhcmFjdGVycyAqLwotCQkJcSsrOwotCQkgICAgfQotCQkgIGMgPSAqcTsKLQkJICAvKgotCSAgICogUSBwb2ludHMgdG8gJywnIG9yICdcMCcgdGhhdCBlbmRzIGFyZ3VtZW50LiBDIGlzIHRoYXQKLQkgICAqIGNoYXJhY3Rlci4KLQkgICAqLwotCQkgICpxID0gJ1wwJzsKLQkJICBvcGVyYW5kcC0+dG9wX2FjY2VzcyA9IHBbMF07Ci0JCSAgb3BlcmFuZHAtPnRvcF93aWR0aCA9IHBbMV07Ci0JCSAgdGlwX29wIChpbnN0cmluZyAtIDEsIG9wZXJhbmRwKTsKLQkJICAqcSA9IGM7CS8qIFJlc3RvcmUgaW5wdXQgdGV4dC4gKi8KLQkJICBpZiAoKihvcGVyYW5kcC0+dG9wX2Vycm9yKSkKLQkJICAgIHsKLQkJICAgICAgYWxsb3BlcnIgPSBvcGVyYW5kcC0+dG9wX2Vycm9yOwotCQkgICAgfQotCQkgIGluc3RyaW5nID0gcSArIChjID8gMSA6IDApOwkvKiBuZXh0IG9wZXJhbmQgKGlmIGFueSkgKi8KLQkJICBjb3VudCsrOwkvKiAgd29uIGFub3RoZXIgYXJndW1lbnQsIG1heSBoYXZlIGFuIG9wZXJyICovCi0JCX0KLQkgICAgICBlbHNlCi0JCWFsbG9wZXJyID0gXygiTm90IGVub3VnaCBvcGVyYW5kcyIpOwotCSAgICB9Ci0JICAvKiBSZXN0b3JlIHRoZSBwb2ludGVyLiAqLwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQkgIGlmICghKmFsbG9wZXJyKQotCSAgICB7Ci0JICAgICAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0JCWluc3RyaW5nKys7CS8qIFNraXAgd2hpdGVzcGFjZS4gKi8KLQkgICAgICBpZiAoKmluc3RyaW5nKQotCQlhbGxvcGVyciA9IF8oIlRvbyBtYW55IG9wZXJhbmRzIik7Ci0JICAgIH0KLQkgIHRpdFAtPnRpdF9lcnJvciA9IGFsbG9wZXJyOwotCX0KLSAgICB9Ci0KLSAgdGl0UC0+dGl0X29wY29kZSA9IHR3UC0+Y29kZTsJLyogVGhlIG9wLWNvZGUuICovCi0gIHRpdFAtPnRpdF9vcGVyYW5kcyA9IGNvdW50OwotfQkJCQkvKiB0aXAgKi8KLQwKLS8qIG1kX2Fzc2VtYmxlKCkgZW1pdCBmcmFncyBmb3IgMSBpbnN0cnVjdGlvbiAqLwotdm9pZAotbWRfYXNzZW1ibGUgKGluc3RydWN0aW9uX3N0cmluZykKLSAgICAgY2hhciAqaW5zdHJ1Y3Rpb25fc3RyaW5nOwkvKiBBIHN0cmluZzogYXNzZW1ibGUgMSBpbnN0cnVjdGlvbi4gKi8KLXsKLSAgY2hhciAqcDsKLSAgcmVnaXN0ZXIgc3RydWN0IHRvcCAqb3BlcmFuZFA7LyogQW4gb3BlcmFuZC4gU2NhbnMgYWxsIG9wZXJhbmRzLiAqLwotICAvKiAgY2hhciBjX3NhdmU7CWZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogV2hhdCB1c2VkIHRvIGxpdmUgYWZ0ZXIgYW4gZXhwcmVzc2lvbi4gKi8KLSAgLyogIHN0cnVjdCBmcmFnICpmcmFnUDsJZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiBGcmFnbWVudCBvZiBjb2RlIHdlIGp1c3QgbWFkZS4gKi8KLSAgLyogIHJlZ2lzdGVyIHN0cnVjdCB0b3AgKmVuZF9vcGVyYW5kUDsgZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiAtPiBzbG90IGp1c3QgYWZ0ZXIgbGFzdCBvcGVyYW5kCi0JCQkJCUxpbWl0IG9mIHRoZSBmb3IgKGVhY2ggb3BlcmFuZCkuICovCi0gIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHBQOwkvKiAtPiBleHByZXNzaW9uIHZhbHVlcyBmb3IgdGhpcyBvcGVyYW5kICovCi0KLSAgLyogVGhlc2UgcmVmZXIgdG8gYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCBleHByZXNzaW9uLiAqLwotICBzZWdUIHRvX3NlZzsJCQkvKiBUYXJnZXQgc2VnbWVudCBvZiB0aGUgYWRkcmVzcy4JICovCi0KLSAgcmVnaXN0ZXIgdmFsdWVUIHRoaXNfYWRkX251bWJlcjsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqdGhpc19hZGRfc3ltYm9sOwkvKiArdmUgKG1pbnVlbmQpIHN5bWJvbC4gKi8KLQotICAvKiAgdGFob2Vfb3Bjb2RlVCBvcGNvZGVfYXNfbnVtYmVyOyBmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIFRoZSBvcGNvZGUgYXMgYSBudW1iZXIuICovCi0gIGNoYXIgKm9wY29kZVA7CQkvKiBXaGVyZSBpdCBpcyBpbiBhIGZyYWcuICovCi0gIC8qICBjaGFyICpvcG1vZGVQOwlmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIFdoZXJlIG9wY29kZSB0eXBlIGlzLCBpbiBhIGZyYWcuICovCi0KLSAgaW50IGRpc3BzaXplOwkJCS8qIEZyb20gdG9wX2Rpc3BzaXplOiB0YWhvZV9vcGVyYW5kX3dpZHRoCi0JCQkJICAgKGluIGJ5dGVzKSAqLwotICBpbnQgaXNfdW5kZWZpbmVkOwkJLyogMSBpZiBvcGVyYW5kIGV4cHJlc3Npb24ncwotCQkJCSAgIHNlZ21lbnQgbm90IGtub3duIHlldC4gKi8KLSAgaW50IHBjX3JlbDsJCQkvKiBJcyB0aGlzIG9wZXJhbmQgcGMgcmVsYXRpdmU/ICovCi0KLSAgLyogRGVjb2RlIHRoZSBvcGVyYW5kLiAqLwotICB0aXAgKCZ0LCBpbnN0cnVjdGlvbl9zdHJpbmcpOwotCi0gIC8qCi0gICAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIG9wZXJhbmQgZGVjb2RlIHByb3Blcmx5LgotICAgKiBOb3RpY2UgdGhhdCB3ZSBoYXZlbid0IG1hZGUgYW55IGZyYWdzIHlldC4KLSAgICogSWYgaXQgZ29vZmVkLCB0aGVuIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCB3ZWRnZSBpbiBhbnkgcGFzcywKLSAgICogYW5kIHdlIGNhbiBzYWZlbHkgZmx1c2ggaXQsIHdpdGhvdXQgY2F1c2luZyBpbnRlcnBhc3Mgc3ltYm9sIHBoYXNlCi0gICAqIGVycm9ycy4gVGhhdCBpcywgd2l0aG91dCBjaGFuZ2luZyBsYWJlbCB2YWx1ZXMgaW4gZGlmZmVyZW50IHBhc3Nlcy4KLSAgICovCi0gIGlmICgqdC50aXRfZXJyb3IpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiSWdub3Jpbmcgc3RhdGVtZW50IGR1ZSB0byBcIiVzXCIiKSwgdC50aXRfZXJyb3IpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIHNhdyBubyBlcnJvcnMgaW4gYW55IG9wZXJhbmRzIC0gdHJ5IHRvIG1ha2UgZnJhZyhzKSAqLwotICAgICAgLyogRW1pdCBvcC1jb2RlLiAqLwotICAgICAgLyogUmVtZW1iZXIgd2hlcmUgaXQgaXMsIGluIGNhc2Ugd2Ugd2FudCB0byBtb2RpZnkgdGhlIG9wLWNvZGUgbGF0ZXIuICovCi0gICAgICBvcGNvZGVQID0gZnJhZ19tb3JlICgxKTsKLSAgICAgICpvcGNvZGVQID0gdC50aXRfb3Bjb2RlOwotICAgICAgLyogTm93IGRvIGVhY2ggb3BlcmFuZC4gKi8KLSAgICAgIGZvciAob3BlcmFuZFAgPSB0LnRpdF9vcGVyYW5kOwotCSAgIG9wZXJhbmRQIDwgdC50aXRfb3BlcmFuZCArIHQudGl0X29wZXJhbmRzOwotCSAgIG9wZXJhbmRQKyspCi0JewkJCS8qIGZvciBlYWNoIG9wZXJhbmQgKi8KLQkgIGV4cFAgPSAmKG9wZXJhbmRQLT5leHBfb2Zfb3BlcmFuZCk7Ci0JICBpZiAob3BlcmFuZFAtPnRvcF9uZHggPj0gMCkKLQkgICAgewotCSAgICAgIC8qIEluZGV4ZWQgYWRkcmVzc2luZyBieXRlCi0JICAgTGVnYWxpdHkgb2YgaW5kZXhlZCBtb2RlIGFscmVhZHkgY2hlY2tlZDogaXQgaXMgT0sgKi8KLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKDB4NDAgKyBvcGVyYW5kUC0+dG9wX25keCk7Ci0JICAgIH0JCQkvKiBpZih0b3BfbmR4Pj0wKSAqLwotCi0JICAvKiBIZXJlIHRvIG1ha2UgbWFpbiBvcGVyYW5kIGZyYWcocykuICovCi0JICB0aGlzX2FkZF9udW1iZXIgPSBleHBQLT5YX2FkZF9udW1iZXI7Ci0JICB0aGlzX2FkZF9zeW1ib2wgPSBleHBQLT5YX2FkZF9zeW1ib2w7Ci0JICB0b19zZWcgPSBvcGVyYW5kUC0+c2VnX29mX29wZXJhbmQ7Ci0JICBrbm93ICh0b19zZWcgPT0gU0VHX1VOS05PV04gfHwgXAotCQl0b19zZWcgPT0gU0VHX0FCU09MVVRFIHx8IFwKLQkJdG9fc2VnID09IFNFR19EQVRBIHx8IFwKLQkJdG9fc2VnID09IFNFR19URVhUIHx8IFwKLQkJdG9fc2VnID09IFNFR19CU1MpOwotCSAgaXNfdW5kZWZpbmVkID0gKHRvX3NlZyA9PSBTRUdfVU5LTk9XTik7Ci0JICAvKiBEbyB3ZSBrbm93IGhvdyBiaWcgdGhpcyBvcHBlcmFuZCBpcz8gKi8KLQkgIGRpc3BzaXplID0gb3BlcmFuZFAtPnRvcF9kaXNwc2l6ZTsKLQkgIHBjX3JlbCA9IDA7Ci0JICAvKiBEZWFsIHdpdGggdGhlIGJyYW5jaCBwb3NzYWJpbGl0aWVzLiAoTm90ZSwgdGhpcyBkb2Vzbid0IGluY2x1ZGUKLQkganVtcHMuKSovCi0JICBpZiAob3BlcmFuZFAtPnRvcF9hY2Nlc3MgPT0gJ2InKQotCSAgICB7Ci0JICAgICAgLyogQnJhbmNoZXMgbXVzdCBiZSBleHByZXNzaW9ucy4gQSBwc3VlZG8gYnJhbmNoIGNhbiBhbHNvIGp1bXAgdG8KLQkgICBhbiBhYnNvbHV0ZSBhZGRyZXNzLiAqLwotCSAgICAgIGlmICh0b19zZWcgPT0gbm93X3NlZyB8fCBpc191bmRlZmluZWQpCi0JCXsKLQkJICAvKiBJZiBpc191bmRlZmluZWQsIHRoZW4gaXQgbWlnaHQgQkVDT01FIG5vd19zZWcgYnkgcmVsYXggdGltZS4gKi8KLQkJICBpZiAoZGlzcHNpemUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEkga25vdyBob3cgYmlnIHRoZSBicmFuY2ggaXMgc3VwcG9zZWQgdG8gYmUgKGl0J3MgYSBub3JtYWwKLQkgICAgICAgYnJhbmNoKSwgc28gSSBzZXQgdXAgdGhlIGZyYWcsIGFuZCBsZXQgR0FTIGRvIHRoZSByZXN0LiAqLwotCQkgICAgICBwID0gZnJhZ19tb3JlIChkaXNwc2l6ZSk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkgICAgICAgc2l6ZV90b19meCAoZGlzcHNpemUsIDEpLAotCQkJICAgICAgIE5VTEwpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogKHRvX3NlZz09bm93X3NlZyB8fCB0b19zZWcgPT0gU0VHX1VOS05PV04pICYmIGRpc3BzaXplPT0wICovCi0JCSAgICAgIC8qIElmIHdlIGRvbid0IGtub3cgaG93IGJpZyBpdCBpcywgdGhlbiBpdHMgYSBzeW50aGV0aWMgYnJhbmNoLAotCSAgICAgICBzbyB3ZSBzZXQgdXAgYSBzaW1wbGUgcmVsYXggc3RhdGUuICovCi0JCSAgICAgIHN3aXRjaCAob3BlcmFuZFAtPnRvcF93aWR0aCkKLQkJCXsKLQkJCWNhc2UgVEFIT0VfV0lEVEhfQ09ORElUSU9OQUxfSlVNUDoKLQkJCSAgLyogU2ltcGxlIChjb25kaXRpb25hbCkganVtcC4gSSBtYXkgaGF2ZSB0byByZXZlcnNlIHRoZQotCQkgY29uZGl0aW9uIG9mIG9wY29kZVAsIGFuZCB0aGVuIGp1bXAgdG8gbXkgZGVzdGluYXRpb24uCi0JCSBJIHNldCAxIGJ5dGUgYXNpZGUgZm9yIHRoZSBicmFuY2ggb2ZmIHNldCwgYW5kIGNvdWxkIG5lZWQgNgotCQkgbW9yZSBieXRlcyBmb3IgdGhlIHBjX3JlbCBqdW1wICovCi0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNywgMSwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9CWVRFKSwKLQkJCQkgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsIG9wY29kZVApOwotCQkJICBicmVhazsKLQkJCWNhc2UgVEFIT0VfV0lEVEhfQUxXQVlTX0pVTVA6Ci0JCQkgIC8qIFNpbXBsZSAodW5jb25kaXRpb25hbCkganVtcC4gSSBtYXkgaGF2ZSB0byBjb252ZXJ0IHRoaXMgdG8KLQkJIGEgd29yZCBicmFuY2gsIG9yIGFuIGFic29sdXRlIGp1bXAuICovCi0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMSwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURSksCi0JCQkJIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLCBvcGNvZGVQKTsKLQkJCSAgYnJlYWs7Ci0JCQkgIC8qIFRoZSBzbWFsbGVzdCBzaXplIGZvciB0aGUgbmV4dCAyIGNhc2VzIGlzIHdvcmQuICovCi0JCQljYXNlIFRBSE9FX1dJRFRIX0JJR19SRVZfSlVNUDoKLQkJCSAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAyLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfV09SRCksCi0JCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCSAgICBvcGNvZGVQKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIFRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVA6Ci0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTAsIDIsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfV09SRCksCi0JCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCSAgICBvcGNvZGVQKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBhc19mYXRhbCAoXygiQ29tcGxpbGVyIGJ1ZzogR290IGEgY2FzZSAoJWQpIEkgd2Fzbid0IGV4cGVjdGluZy4iKSwKLQkJCQkgICAgb3BlcmFuZFAtPnRvcF93aWR0aCk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiB0b19zZWcgIT0gbm93X3NlZyAmJiB0b19zZWcgIT0gc2VnX3Vua25vd24gKHN0aWxsIGluIGJyYW5jaCkKLQkgICAgIEluIG90aGVyIHdvcmRzLCBJJ20ganVtcGluZyBvdXQgb2YgbXkgc2VnbWVudCBzbyBleHRlbmQgdGhlCi0JICAgICBicmFuY2hlcyB0byBqdW1wcywgYW5kIGxldCBHQVMgZml4IHRoZW0uICovCi0KLQkJICAvKiBUaGVzZSBhcmUgImJyYW5jaGVzIiB3aGF0IHdpbGwgYWx3YXlzIGJlIGJyYW5jaGVzIGFyb3VuZCBhIGp1bXAKLQkgICAgIHRvIHRoZSBjb3JyZWN0IGFkZHJlc3NzIGluIHJlYWwgbGlmZS4KLQkgICAgIElmIHRvX3NlZyBpcyBTRUdfQUJTT0xVVEUsIGp1c3QgZW5jb2RlIHRoZSBicmFuY2ggaW4sCi0JICAgICBlbHNlIGxldCBHQVMgZml4IHRoZSBhZGRyZXNzLiAqLwotCi0JCSAgc3dpdGNoIChvcGVyYW5kUC0+dG9wX3dpZHRoKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgdGhlb3J5OgotCSAgICAgICBGb3IgU0VHX0FCU09MVVRFLCB0aGVuIG1vZGUgaXMgQUJTT0xVVEVfQUREUiwganVtcAotCSAgICAgICB0byB0aGF0IGFkZHJlc3NzIChub3QgcGNfcmVsKS4KLQkgICAgICAgRm9yIG90aGVyIHNlZ3MsIGFkZHJlc3MgaXMgYSBsb25nIHdvcmQgUEMgcmVsIGp1bXAuICovCi0JCSAgICBjYXNlIFRBSE9FX1dJRFRIX0NPTkRJVElPTkFMX0pVTVA6Ci0JCSAgICAgIC8qIGI8Y29uZD4gKi8KLQkJICAgICAgLyogVG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uIGluIGEgVEFIT0UgYnJhbmNoLAotCSAgICAgICBjb21wbGVtZW50IGJpdCA0ICovCi0JCSAgICAgICpvcGNvZGVQIF49IDB4MTA7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDcpOwotCQkgICAgICAqcCsrID0gNjsKLQkJICAgICAgKnArKyA9IFRBSE9FX0pNUDsKLQkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KLQkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKLQkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7Ci0JCSAgICAgIC8qCi0JICAgICAqIE5vdyAoZWcpCUJMRVEJMWYKLQkgICAgICoJCUpNUAlmb28KLQkgICAgICoJMToKLQkgICAgICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBUQUhPRV9XSURUSF9BTFdBWVNfSlVNUDoKLQkJICAgICAgLyogYnIsIGp1c3QgdHVybiBpdCBpbnRvIGEganVtcCAqLwotCQkgICAgICAqb3Bjb2RlUCA9IFRBSE9FX0pNUDsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09Ci0JCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6Ci0JCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOwotCQkgICAgICAvKiBOb3cgKGVnKSBKTVAgZm9vICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVA6Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDgpOwotCQkgICAgICAqb3Bjb2RlUCBePSAweDEwOwotCQkgICAgICAqcCsrID0gMDsKLQkJICAgICAgKnArKyA9IDY7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9KTVA7Ci0JCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09Ci0JCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6Ci0JCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOwotCQkgICAgICAvKgotCSAgICAgKiBOb3cgKGVnKQlBQ0J4CTFmCi0JICAgICAqCQlKTVAgICAgIGZvbwotCSAgICAgKgkxOgotCSAgICAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVA6Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDEwKTsKLQkJICAgICAgKnArKyA9IDA7Ci0JCSAgICAgICpwKysgPSAyOwotCQkgICAgICAqcCsrID0gVEFIT0VfQlJCOwotCQkgICAgICAqcCsrID0gNjsKLQkJICAgICAgKnArKyA9IFRBSE9FX0pNUDsKLQkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KLQkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKLQkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7Ci0JCSAgICAgIC8qCi0JICAgICAqIE5vdyAoZWcpCXhPQnh4eAkxZgotCSAgICAgKgkJQlJCCTJmCi0JICAgICAqCTE6CUpNUAlAI2ZvbwotCSAgICAgKgkyOgotCSAgICAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdiJzoKLQkJICAgIGNhc2UgJ3cnOgotCQkgICAgICBhc193YXJuIChfKCJSZWFsIGJyYW5jaCBkaXNwbGFjZW1lbnRzIG11c3QgYmUgZXhwcmVzc2lvbnMuIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGFzX2ZhdGFsIChfKCJDb21wbGllciBlcnJvcjogSSBnb3QgYW4gdW5rbm93biBzeW50aGV0aWMgYnJhbmNoIDolYyIpLAotCQkJCW9wZXJhbmRQLT50b3Bfd2lkdGgpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBJdCBhaW4ndCBhIGJyYW5jaCBvcGVyYW5kLiAqLwotCSAgICAgIHN3aXRjaCAob3BlcmFuZFAtPnRvcF9tb2RlKQotCQl7Ci0JCSAgLyogQXV0by1mb28gYWNjZXNzLCBvbmx5IHdvcmtzIGZvciBvbmUgcmVnIChTUCkKLQkgICAgIHNvIHRoZSBvbmx5IHRoaW5nIG5lZWRlZCBpcyB0aGUgbW9kZS4gKi8KLQkJY2FzZSBUQUhPRV9BVVRPX0RFQzoKLQkJY2FzZSBUQUhPRV9BVVRPX0lOQzoKLQkJY2FzZSBUQUhPRV9BVVRPX0lOQ19ERUZFUlJFRDoKLQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKG9wZXJhbmRQLT50b3BfbW9kZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBOdW1iZXJlZCBSZWdpc3RlciBvbmx5IGFjY2Vzcy4gT25seSB0aGluZyBuZWVkZWQgaXMgdGhlCi0JICAgICBtb2RlICsgUmVnaXN0ZXIgbnVtYmVyICovCi0JCWNhc2UgVEFIT0VfRElSRUNUX1JFRzoKLQkJY2FzZSBUQUhPRV9SRUdfREVGRVJSRUQ6Ci0JCSAgRlJBR19BUFBFTkRfMV9DSEFSIChvcGVyYW5kUC0+dG9wX21vZGUgKyBvcGVyYW5kUC0+dG9wX3JlZyk7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBBbiBhYnNvbHV0ZSBhZGRyZXNzLiBJdCdzIHNpemUgaXMgYWx3YXlzIDUgYnl0ZXMuCi0JICAgICAobW9kZV90eXBlICsgNCBieXRlIGFkZHJlc3MpLiAqLwotCQljYXNlIFRBSE9FX0FCU09MVVRFX0FERFI6Ci0JCSAga25vdyAoKHRoaXNfYWRkX3N5bWJvbCA9PSBOVUxMKSk7Ci0JCSAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCSAgKnAgPSBUQUhPRV9BQlNPTFVURV9BRERSOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBJbW1lZGlhdGUgZGF0YS4gSWYgdGhlIHNpemUgaXNuJ3Qga25vd24sIHRoZW4gaXQncyBhbiBhZGRyZXNzCi0JICAgICArIGFuZCBvZmZzZXQsIHdoaWNoIGlzIDQgYnl0ZXMgYmlnLiAqLwotCQljYXNlIFRBSE9FX0lNTUVESUFURToKLQkJICBpZiAodGhpc19hZGRfc3ltYm9sICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkgICAgICAqcCsrID0gVEFIT0VfSU1NRURJQVRFX0xPTkdXT1JEOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIEZYXzMyLCBOVUxMKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIEl0J3MgYSBpbnRlZ2VyLCBhbmQgSSBrbm93IGl0J3Mgc2l6ZS4gKi8KLQkJICAgICAgaWYgKCh1bnNpZ25lZCkgdGhpc19hZGRfbnVtYmVyIDwgMHg0MCkKLQkJCXsKLQkJCSAgLyogV2lsbCBpdCBmaXQgaW4gYSBsaXRlcmFsPyAqLwotCQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKChieXRlKSB0aGlzX2FkZF9udW1iZXIpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHAgPSBmcmFnX21vcmUgKGRpc3BzaXplICsgMSk7Ci0JCQkgIHN3aXRjaCAoZGlzcHNpemUpCi0JCQkgICAgewotCQkJICAgIGNhc2UgMToKLQkJCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfQllURTsKLQkJCSAgICAgICpwID0gKGJ5dGUpIHRoaXNfYWRkX251bWJlcjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgMjoKLQkJCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfV09SRDsKLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgdGhpc19hZGRfbnVtYmVyLCAyKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgNDoKLQkJCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfTE9OR1dPUkQ7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBEaXN0YW5jZSBmcm9tIHRoZSBQQy4gSWYgdGhlIHNpemUgaXNuJ3Qga25vd24sIHdlIGhhdmUgdG8gcmVsYXgKLQkgICAgIGludG8gaXQuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgZGlzcChzcCkgaXMgdGhhdAotCSAgICAgdGhpcyBvZmZzZXQgaXMgcGNfcmVsLCBhbmQgZGlzcChzcCkgaXNuJ3QuCi0JICAgICBOb3RlIHRoZSBkcm9wIHRocm91Z2ggY29kZS4gKi8KLQotCQljYXNlIFRBSE9FX0RJU1BMQUNFRF9SRUxBVElWRToKLQkJY2FzZSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRDoKLQkJICBvcGVyYW5kUC0+dG9wX3JlZyA9IFBDX1JFRzsKLQkJICBwY19yZWwgPSAxOwotCi0JCSAgLyogUmVnaXN0ZXIsIHBsdXMgYSBkaXNwbGFjZW1lbnQgbW9kZS4gU2F2ZSB0aGUgcmVnaXN0ZXIgbnVtYmVyLAotCSAgICAgYW5kIHdlYXRoZXIgaXRzIGRlZmZlcmVkIG9yIG5vdCwgYW5kIHJlbGF4IHRoZSBzaXplIGlmIGl0IGlzbid0Ci0JICAgICBrbm93bi4gKi8KLQkJY2FzZSBUQUhPRV9SRUdfRElTUDoKLQkJY2FzZSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRDoKLQkJICBpZiAob3BlcmFuZFAtPnRvcF9tb2RlID09IFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEIHx8Ci0JCSAgICAgIG9wZXJhbmRQLT50b3BfbW9kZSA9PSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRCkKLQkJICAgIG9wZXJhbmRQLT50b3BfcmVnICs9IDB4MTA7CS8qIGRlZmZlcmVkIG1vZGUgaXMgYWx3YXlzIDB4MTAgaGlnaGVyCi0JCQkJCSAgdGhhbiBpdCdzIG5vbi1kZWZmZXJlZCBzaWJsaW5nLiAqLwotCi0JCSAgLyogSXMgdGhpcyBhIHZhbHVlIG91dCBvZiB0aGlzIHNlZ21lbnQ/Ci0JICAgICBUaGUgZmlyc3QgcGFydCBvZiB0aGlzIGNvbmRpdGlvbmFsIGlzIGEgY2x1ZGdlIHRvIG1ha2UgZ2FzCi0JICAgICBwcm9kdWNlIHRoZSBzYW1lIG91dHB1dCBhcyAnYXMnIHdoZW4gdGhlcmUgaXMgYSBsYWJsZSwgaW4KLQkgICAgIHRoZSBjdXJyZW50IHNlZ21lbnQsIGRpc3BsYWNlaW5nIGEgcmVnaXN0ZXIuIEl0J3Mgc3RyYW5nZSwKLQkgICAgIGFuZCBubyBvbmUgaW4gdGhlaXIgcmlnaHQgbWluZCB3b3VsZCBkbyBpdCwgYnV0IGl0J3MgZWFzeQotCSAgICAgdG8gY2x1ZGdlLiAqLwotCQkgIGlmICgoZGlzcHNpemUgPT0gMCAmJiAhcGNfcmVsKSB8fAotCQkgICAgICAodG9fc2VnICE9IG5vd19zZWcgJiYgIWlzX3VuZGVmaW5lZCAmJiB0b19zZWcgIT0gU0VHX0FCU09MVVRFKSkKLQkJICAgIGRpc3BzaXplID0gNDsKLQotCQkgIGlmIChkaXNwc2l6ZSA9PSAwKQotCQkgICAgewotCQkgICAgICAvKgotCSAgICAgKiBXZSBoYXZlIGEgU0VHX1VOS05PV04gc3ltYm9sLCBvciB0aGUgc2l6ZSBpc24ndCBjYXN0LgotCSAgICAgKiBJdCBtaWdodCB0dXJuIG91dCB0byBiZSBpbiB0aGUgc2FtZSBzZWdtZW50IGFzCi0JICAgICAqIHRoZSBpbnN0cnVjdGlvbiwgcGVybWl0dGluZyByZWxheGF0aW9uLgotCSAgICAgKi8KLQkJICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMiwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX0JZVEUpLAotCQkJCSAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgMCk7Ci0JCSAgICAgICpwID0gb3BlcmFuZFAtPnRvcF9yZWc7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBFaXRoZXIgdGhpcyBpcyBhbiBhYnMsIG9yIGEgY2FzdC4gKi8KLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoZGlzcHNpemUgKyAxKTsKLQkJICAgICAgc3dpdGNoIChkaXNwc2l6ZSkKLQkJCXsKLQkJCWNhc2UgMToKLQkJCSAgKnAgPSBUQUhPRV9QQ19PUl9CWVRFICsgb3BlcmFuZFAtPnRvcF9yZWc7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAyOgotCQkJICAqcCA9IFRBSE9FX1BDX09SX1dPUkQgKyBvcGVyYW5kUC0+dG9wX3JlZzsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkgICpwID0gVEFIT0VfUENfT1JfTE9ORyArIG9wZXJhbmRQLT50b3BfcmVnOwotCQkJICBicmVhazsKLQkJCX07Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIHNpemVfdG9fZnggKGRpc3BzaXplLCBwY19yZWwpLCBOVUxMKTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc19mYXRhbCAoXygiQmFyZiwgYmFkIG1vZGUgJXhcbiIpLCBvcGVyYW5kUC0+dG9wX21vZGUpOwotCQl9Ci0JICAgIH0KLQl9CQkJLyogZm9yKG9wZXJhbmRQKSAqLwotICAgIH0JCQkJLyogaWYoIW5lZWRfcGFzc18yICYmICFnb29mZWQpICovCi19CQkJCS8qIHRhaG9lX2Fzc2VtYmxlKCkgKi8KLQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19CQkJCS8qIG1kX3VuZGVmaW5lZF9zeW1ib2woKSAqLwotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiAoKHNpemUgKyA3KSAmIH43KTsJLyogUm91bmQgYWxsIHNlY3RzIHRvIG11bHRpcGxlIG9mIDggKi8KLX0JCQkJLyogbWRfc2VjdGlvbl9hbGlnbigpICovCi0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBzcGFyYywgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCi0gICBpdHMgc2l6ZS4gIFRoaXMgZ2V0cyB1cyB0byB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLgotICAgKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTikgKi8KLWxvbmcgCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gKCgoZml4UC0+ZnhfdHlwZSA9PSBGWF84Ci0JICAgIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUw4KQotCSAgID8gMQotCSAgIDogKChmaXhQLT5meF90eXBlID09IEZYXzE2Ci0JICAgICAgIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwxNikKLQkgICAgICA/IDIKLQkgICAgICA6ICgoZml4UC0+ZnhfdHlwZSA9PSBGWF8zMgotCQkgIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwzMikKLQkJID8gNAotCQkgOiAwKSkpICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzKTsKLX0JCQkJLyogbWRfcGNyZWxfZnJvbSgpICovCi0KLWludCAKLXRjX2lzX3BjcmVsIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICAvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkICovCi0gIGtub3cgKDApOwotICByZXR1cm4gKDApOwotfQkJCQkvKiB0Y19pc19wY3JlbCgpICovCi0KLS8qIGVuZCBvZiB0Yy10YWhvZS5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRhaG9lLmggYi9nYXMvY29uZmlnL3RjLXRhaG9lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOGE1YmUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10YWhvZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLXRhaG9lLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19UQUhPRSAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIE5PX0xJU1RJTkcKLQotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBkb24ndCBuZWVkIGl0LiAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIGRvbid0IG5lZWQgaXQuICovCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soYSkJezt9Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGMtdGFob2UuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5jIGIvZ2FzL2NvbmZpZy90Yy10aWMzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTVjMDZhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGljMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDE4ODggKzAsMCBAQAotLyogdGMtYzMwLmMgLS0gQXNzZW1ibHkgY29kZSBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMAotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gICBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgbWFjaGluZSBzcGVjaWZpYyBnYXMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpLgotICAgQnVncyAmIHN1Z2dlc3Rpb25zIGFyZSBjb21wbGV0ZWx5IHdlbGNvbWUuICBUaGlzIGlzIGZyZWUgc29mdHdhcmUuCi0gICBQbGVhc2UgaGVscCB1cyBtYWtlIGl0IGJldHRlci4KLSAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljMzAuaCIKLQotLyogcHV0IGhlcmUgYWxsIG5vbi1kaWdpdCBub24tbGV0dGVyIGNoYXJjdGVycyB0aGF0IG1heSBvY2N1ciBpbiBhbiBvcGVyYW5kICovCi1zdGF0aWMgY2hhciBvcGVyYW5kX3NwZWNpYWxfY2hhcnNbXSA9ICIlJC0rKCwpKi5ffi88PiZeITpbQF0iOwotc3RhdGljIGNoYXIgKm9yZGluYWxfbmFtZXNbXSA9Ci17ImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCIsICJmb3VydGgiLCAiZmlmdGgifTsKLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAwOwotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiKiI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImZGZER4WCI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogdGFibGVzIGZvciBsZXhpY2FsIGFuYWx5c2lzICovCi1zdGF0aWMgY2hhciBvcGNvZGVfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIHJlZ2lzdGVyX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBvcGVyYW5kX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBzcGFjZV9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgaWRlbnRpZmllcl9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgZGlnaXRfY2hhcnNbMjU2XTsKLQotLyogbGV4aWNhbCBtYWNyb3MgKi8KLSNkZWZpbmUgaXNfb3Bjb2RlX2NoYXIoeCkgKG9wY29kZV9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX29wZXJhbmRfY2hhcih4KSAob3BlcmFuZF9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX3JlZ2lzdGVyX2NoYXIoeCkgKHJlZ2lzdGVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfc3BhY2VfY2hhcih4KSAoc3BhY2VfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19pZGVudGlmaWVyX2NoYXIoeCkgKGlkZW50aWZpZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19kaWdpdF9jaGFyKHgpIChkaWdpdF9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHswLCAwLCAwfQotfTsKLQotI3VuZGVmIFVTRV9TVERPVVQKLSNkZWZpbmUgVVNFX1NURE9VVCAxCi0KLSNpZmRlZiBVU0VfU1REQVJHCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotaW50Ci1kZWJ1ZyAoY29uc3QgY2hhciAqc3RyaW5nLC4uLikKLXsKLSAgaWYgKGZsYWdfZGVidWcpCi0gICAgewotICAgICAgdmFfbGlzdCBhcmdwdHI7Ci0gICAgICBjaGFyIHN0clsxMDBdOwotCi0gICAgICB2YV9zdGFydCAoYXJncHRyLCBzdHJpbmcpOwotICAgICAgdnNwcmludGYgKHN0ciwgc3RyaW5nLCBhcmdwdHIpOwotICAgICAgaWYgKHN0clswXSA9PSAnXDAnKQotCXJldHVybiAoMCk7Ci0gICAgICB2YV9lbmQgKGFyZ3B0cik7Ci0gICAgICBmcHV0cyAoc3RyLCBVU0VfU1RET1VUID8gc3Rkb3V0IDogc3RkZXJyKTsKLSAgICAgIHJldHVybiBzdHJsZW4gKHN0cik7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0jZWxzZQotaW50Ci1kZWJ1ZyAoc3RyaW5nLCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICB2YV9kY2wKLXsKLSAgaWYgKGZsYWdfZGVidWcpCi0gICAgewotICAgICAgdmFfbGlzdCBhcmdwdHI7Ci0gICAgICBjaGFyIHN0clsxMDBdOwotICAgICAgaW50IGNudDsKLQotICAgICAgdmFfc3RhcnQgKGFyZ3B0ciwgc3RyaW5nKTsKLSAgICAgIGNudCA9IHZzcHJpbnRmIChzdHIsIHN0cmluZywgYXJncHRyKTsKLSAgICAgIGlmIChzdHJbMF0gPT0gTlVMTCkKLQlyZXR1cm4gKDApOwotICAgICAgdmFfZW5kIChhcmdwdHIpOwotICAgICAgZnB1dHMgKHN0ciwgVVNFX1NURE9VVCA/IHN0ZG91dCA6IHN0ZGVycik7Ci0gICAgICByZXR1cm4gKGNudCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogaGFzaCB0YWJsZSBmb3Igb3Bjb2RlIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0vKiBoYXNoIHRhYmxlIGZvciBwYXJhbGxlbCBvcGNvZGUgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcGFyb3BfaGFzaDsKLS8qIGhhc2ggdGFibGUgZm9yIHJlZ2lzdGVyIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnJlZ19oYXNoOwotLyogaGFzaCB0YWJsZSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZyBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICppbmRfaGFzaDsKLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqaGFzaF9lcnI7Ci0gIGRlYnVnICgiSW4gbWRfYmVnaW4oKVxuIik7Ci0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIGNvbnN0IHRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gdGljMzBfb3B0YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9vcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBjdXJyZW50X29wdGFiLT5uYW1lLCAoY2hhciAqKSBjdXJyZW50X29wdGFiKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBhc19mYXRhbCAoIkludGVybmFsIEVycm9yOiBDYW4ndCBIYXNoICVzOiAlcyIsIGN1cnJlbnRfb3B0YWItPm5hbWUsIGhhc2hfZXJyKTsKLSAgICAgIH0KLSAgfQotICBwYXJvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICBjb25zdCBwYXJ0ZW1wbGF0ZSAqY3VycmVudF9wYXJvcCA9IHRpYzMwX3Bhcm9wdGFiOwotICAgIGZvciAoOyBjdXJyZW50X3Bhcm9wIDwgdGljMzBfcGFyb3B0YWJfZW5kOyBjdXJyZW50X3Bhcm9wKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAocGFyb3BfaGFzaCwgY3VycmVudF9wYXJvcC0+bmFtZSwgKGNoYXIgKikgY3VycmVudF9wYXJvcCk7Ci0JaWYgKGhhc2hfZXJyKQotCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X3Bhcm9wLT5uYW1lLCBoYXNoX2Vycik7Ci0gICAgICB9Ci0gIH0KLSAgcmVnX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIGNvbnN0IHJlZyAqY3VycmVudF9yZWcgPSB0aWMzMF9yZWd0YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfcmVnIDwgdGljMzBfcmVndGFiX2VuZDsgY3VycmVudF9yZWcrKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChyZWdfaGFzaCwgY3VycmVudF9yZWctPm5hbWUsIChjaGFyICopIGN1cnJlbnRfcmVnKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBhc19mYXRhbCAoIkludGVybmFsIEVycm9yOiBDYW4ndCBIYXNoICVzOiAlcyIsIGN1cnJlbnRfcmVnLT5uYW1lLCBoYXNoX2Vycik7Ci0gICAgICB9Ci0gIH0KLSAgaW5kX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIGNvbnN0IGluZF9hZGRyX3R5cGUgKmN1cnJlbnRfaW5kID0gdGljMzBfaW5kYWRkcl90YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfaW5kIDwgdGljMzBfaW5kYWRkcnRhYl9lbmQ7IGN1cnJlbnRfaW5kKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAoaW5kX2hhc2gsIGN1cnJlbnRfaW5kLT5zeW50YXgsIChjaGFyICopIGN1cnJlbnRfaW5kKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBhc19mYXRhbCAoIkludGVybmFsIEVycm9yOiBDYW4ndCBIYXNoICVzOiAlcyIsIGN1cnJlbnRfaW5kLT5zeW50YXgsIGhhc2hfZXJyKTsKLSAgICAgIH0KLSAgfQotICAvKiBmaWxsIGluIGxleGljYWwgdGFibGVzOiAgb3Bjb2RlX2NoYXJzLCBvcGVyYW5kX2NoYXJzLCBzcGFjZV9jaGFycyAqLwotICB7Ci0gICAgcmVnaXN0ZXIgaW50IGM7Ci0gICAgcmVnaXN0ZXIgY2hhciAqcDsKLQotICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykKLSAgICAgIHsKLQlpZiAoaXNsb3dlciAoYykgfHwgaXNkaWdpdCAoYykpCi0JICB7Ci0JICAgIG9wY29kZV9jaGFyc1tjXSA9IGM7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gYzsKLQkgIH0KLQllbHNlIGlmIChpc3VwcGVyIChjKSkKLQkgIHsKLQkgICAgb3Bjb2RlX2NoYXJzW2NdID0gdG9sb3dlciAoYyk7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gb3Bjb2RlX2NoYXJzW2NdOwotCSAgfQotCWVsc2UgaWYgKGMgPT0gJyknIHx8IGMgPT0gJygnKQotCSAgewotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0JaWYgKGlzdXBwZXIgKGMpIHx8IGlzbG93ZXIgKGMpIHx8IGlzZGlnaXQgKGMpKQotCSAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7Ci0JaWYgKGlzZGlnaXQgKGMpIHx8IGMgPT0gJy0nKQotCSAgZGlnaXRfY2hhcnNbY10gPSBjOwotCWlmIChpc2FscGhhIChjKSB8fCBjID09ICdfJyB8fCBjID09ICcuJyB8fCBpc2RpZ2l0IChjKSkKLQkgIGlkZW50aWZpZXJfY2hhcnNbY10gPSBjOwotCWlmIChjID09ICcgJyB8fCBjID09ICdcdCcpCi0JICBzcGFjZV9jaGFyc1tjXSA9IGM7Ci0JaWYgKGMgPT0gJ18nKQotCSAgb3Bjb2RlX2NoYXJzW2NdID0gYzsKLSAgICAgIH0KLSAgICBmb3IgKHAgPSBvcGVyYW5kX3NwZWNpYWxfY2hhcnM7ICpwICE9ICdcMCc7IHArKykKLSAgICAgIG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpwXSA9ICpwOwotICB9Ci19Ci0KLS8qIEFkZHJlc3MgTW9kZSBPUiB2YWx1ZXMgKi8KLSNkZWZpbmUgQU1fUmVnaXN0ZXIgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQU1fRGlyZWN0ICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgQU1fSW5kaXJlY3QgIDB4MDA0MDAwMDAKLSNkZWZpbmUgQU1fSW1tZWRpYXRlIDB4MDA2MDAwMDAKLSNkZWZpbmUgQU1fTm90UmVxICAgIDB4RkZGRkZGRkYKLQotLyogUEMgUmVsYXRpdmUgT1IgdmFsdWVzICovCi0jZGVmaW5lIFBDX1JlZ2lzdGVyIDB4MDAwMDAwMDAKLSNkZWZpbmUgUENfUmVsYXRpdmUgMHgwMjAwMDAwMAotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBvcF90eXBlOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBpbnQgcmVzb2x2ZWQ7Ci0gICAgICB1bnNpZ25lZCBhZGRyZXNzOwotICAgICAgY2hhciAqbGFiZWw7Ci0gICAgICBleHByZXNzaW9uUyBkaXJlY3RfZXhwcjsKLSAgICB9Ci0gIGRpcmVjdDsKLSAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgbW9kOwotICAgICAgaW50IEFSbnVtOwotICAgICAgdW5zaWduZWQgY2hhciBkaXNwOwotICAgIH0KLSAgaW5kaXJlY3Q7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIG9wY29kZTsKLSAgICB9Ci0gIHJlZzsKLSAgc3RydWN0Ci0gICAgewotICAgICAgaW50IHJlc29sdmVkOwotICAgICAgaW50IGRlY2ltYWxfZm91bmQ7Ci0gICAgICBmbG9hdCBmX251bWJlcjsKLSAgICAgIGludCBzX251bWJlcjsKLSAgICAgIHVuc2lnbmVkIGludCB1X251bWJlcjsKLSAgICAgIGNoYXIgKmxhYmVsOwotICAgICAgZXhwcmVzc2lvblMgaW1tX2V4cHI7Ci0gICAgfQotICBpbW1lZGlhdGU7Ci19Ci1vcGVyYW5kOwotCi1pbnQgdGljMzBfcGFyYWxsZWxfaW5zbiBQQVJBTVMgKChjaGFyICopKTsKLW9wZXJhbmQgKnRpYzMwX29wZXJhbmQgUEFSQU1TICgoY2hhciAqKSk7Ci1jaGFyICp0aWMzMF9maW5kX3BhcmFsbGVsX2luc24gUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKLQotdGVtcGxhdGUgKm9wY29kZTsKLQotc3RydWN0IHRpYzMwX2luc24KLSAgewotICAgIHRlbXBsYXRlICp0bTsJCS8qIFRlbXBsYXRlIG9mIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKi8KLSAgICB1bnNpZ25lZCBvcGNvZGU7CQkvKiBGaW5hbCBvcGNvZGUgKi8KLSAgICBpbnQgb3BlcmFuZHM7CQkvKiBOdW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMgKi8KLSAgICAvKiBUeXBlIG9mIG9wZXJhbmQgZ2l2ZW4gaW4gaW5zdHJ1Y3Rpb24gKi8KLSAgICBvcGVyYW5kICpvcGVyYW5kX3R5cGVbTUFYX09QRVJBTkRTXTsKLSAgICB1bnNpZ25lZCBhZGRyZXNzaW5nX21vZGU7CS8qIEZpbmFsIGFkZHJlc3NpbmcgbW9kZSBvZiBpbnN0cnVjdGlvbiAqLwotICB9OwotCi1zdHJ1Y3QgdGljMzBfaW5zbiBpbnNuOwotc3RhdGljIGludCBmb3VuZF9wYXJhbGxlbF9pbnNuOwotCi12b2lkCi1tZF9hc3NlbWJsZSAobGluZSkKLSAgICAgY2hhciAqbGluZTsKLXsKLSAgdGVtcGxhdGUgKm9wY29kZTsKLSAgY2hhciAqY3VycmVudF9wb3NuOwotICBjaGFyICp0b2tlbl9zdGFydDsKLSAgY2hhciBzYXZlX2NoYXI7Ci0gIGludCBjb3VudDsKLQotICBkZWJ1ZyAoIkluIG1kX2Fzc2VtYmxlKCkgd2l0aCBhcmd1bWVudCAlc1xuIiwgbGluZSk7Ci0gIG1lbXNldCAoJmluc24sICdcMCcsIHNpemVvZiAoaW5zbikpOwotICBpZiAoZm91bmRfcGFyYWxsZWxfaW5zbikKLSAgICB7Ci0gICAgICBkZWJ1ZyAoIkxpbmUgaXMgc2Vjb25kIHBhcnQgb2YgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25cblxuIik7Ci0gICAgICBmb3VuZF9wYXJhbGxlbF9pbnNuID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmICgoY3VycmVudF9wb3NuID0gdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuIChsaW5lLCBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKSkgPT0gTlVMTCkKLSAgICBjdXJyZW50X3Bvc24gPSBsaW5lOwotICBlbHNlCi0gICAgZm91bmRfcGFyYWxsZWxfaW5zbiA9IDE7Ci0gIHdoaWxlIChpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLSAgICBjdXJyZW50X3Bvc24rKzsKLSAgdG9rZW5fc3RhcnQgPSBjdXJyZW50X3Bvc247Ci0gIGlmICghaXNfb3Bjb2RlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGluIG9wY29kZSIsIG91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBDaGVjayBpZiBpbnN0cnVjdGlvbiBpcyBhIHBhcmFsbGVsIGluc3RydWN0aW9uIGJ5IHNlZWluZyBpZiB0aGUgZmlyc3QKLSAgICAgY2hhcmFjdGVyIGlzIGEgcS4gKi8KLSAgaWYgKCp0b2tlbl9zdGFydCA9PSAncScpCi0gICAgewotICAgICAgaWYgKHRpYzMwX3BhcmFsbGVsX2luc24gKHRva2VuX3N0YXJ0KSkKLQl7Ci0JICBpZiAoZm91bmRfcGFyYWxsZWxfaW5zbikKLQkgICAgZnJlZSAodG9rZW5fc3RhcnQpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIHdoaWxlIChpc19vcGNvZGVfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0gICAgY3VycmVudF9wb3NuKys7Ci0gIHsJCQkJLyogRmluZCBpbnN0cnVjdGlvbiAqLwotICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247Ci0gICAgKmN1cnJlbnRfcG9zbiA9ICdcMCc7Ci0gICAgb3Bjb2RlID0gKHRlbXBsYXRlICopIGhhc2hfZmluZCAob3BfaGFzaCwgdG9rZW5fc3RhcnQpOwotICAgIGlmIChvcGNvZGUpCi0gICAgICB7Ci0JZGVidWcgKCJGb3VuZCBpbnN0cnVjdGlvbiAlc1xuIiwgb3Bjb2RlLT5uYW1lKTsKLQlpbnNuLnRtID0gb3Bjb2RlOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlkZWJ1ZyAoIkRpZG4ndCBmaW5kIGluc25cbiIpOwotCWFzX2JhZCAoIlVua25vd24gVE1TMzIwQzMwIGluc3RydWN0aW9uOiAlcyIsIHRva2VuX3N0YXJ0KTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgKmN1cnJlbnRfcG9zbiA9IHNhdmVfY2hhcjsKLSAgfQotICBpZiAoKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTikKLSAgICB7CQkJCS8qIEZpbmQgb3BlcmFuZHMgKi8KLSAgICAgIGludCBwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0gICAgICBpbnQgZXhwZWN0aW5nX29wZXJhbmQgPSAwOwotICAgICAgaW50IHRoaXNfb3BlcmFuZDsKLSAgICAgIGRvCi0JewotCSAgLyogc2tpcCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBiZWZvcmUgb3BlcmFuZCAqLwotCSAgd2hpbGUgKCFpc19vcGVyYW5kX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pCi0JICAgIHsKLQkgICAgICBpZiAoIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotCQl7Ci0JCSAgYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlICVzIG9wZXJhbmQiLAotCQkJICBvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbiksCi0JCQkgIG9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGN1cnJlbnRfcG9zbisrOwotCSAgICB9Ci0JICB0b2tlbl9zdGFydCA9IGN1cnJlbnRfcG9zbjsJLyogYWZ0ZXIgd2hpdGUgc3BhY2UgKi8KLQkgIHBhcmVuX25vdF9iYWxhbmNlZCA9IDA7Ci0JICB3aGlsZSAocGFyZW5fbm90X2JhbGFuY2VkIHx8ICpjdXJyZW50X3Bvc24gIT0gJywnKQotCSAgICB7Ci0JICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCi0JCXsKLQkJICBpZiAocGFyZW5fbm90X2JhbGFuY2VkKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJVbmJhbGFuY2VkIHBhcmVudGhlc2lzIGluICVzIG9wZXJhbmQuIiwKLQkJCSAgICAgIG9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7CS8qIHdlIGFyZSBkb25lICovCi0JCX0KLQkgICAgICBlbHNlIGlmICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAhaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0JCXsKLQkJICBhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBpbiAlcyBvcGVyYW5kIiwKLQkJCSAgb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAotCQkJICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnKCcpCi0JCSsrcGFyZW5fbm90X2JhbGFuY2VkOwotCSAgICAgIGlmICgqY3VycmVudF9wb3NuID09ICcpJykKLQkJLS1wYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JICAgICAgY3VycmVudF9wb3NuKys7Ci0JICAgIH0KLQkgIGlmIChjdXJyZW50X3Bvc24gIT0gdG9rZW5fc3RhcnQpCi0JICAgIHsJCQkvKiB5ZXMsIHdlJ3ZlIHJlYWQgaW4gYW5vdGhlciBvcGVyYW5kICovCi0JICAgICAgdGhpc19vcGVyYW5kID0gaW5zbi5vcGVyYW5kcysrOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID4gTUFYX09QRVJBTkRTKQotCQl7Ci0JCSAgYXNfYmFkICgiU3B1cmlvdXMgb3BlcmFuZHM7ICglZCBvcGVyYW5kcy9pbnN0cnVjdGlvbiBtYXgpIiwKLQkJCSAgTUFYX09QRVJBTkRTKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICAvKiBub3cgcGFyc2Ugb3BlcmFuZCBhZGRpbmcgaW5mbyB0byAnaW5zbicgYXMgd2UgZ28gYWxvbmcgKi8KLQkgICAgICBzYXZlX2NoYXIgPSAqY3VycmVudF9wb3NuOwotCSAgICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOwotCSAgICAgIGluc24ub3BlcmFuZF90eXBlW3RoaXNfb3BlcmFuZF0gPSB0aWMzMF9vcGVyYW5kICh0b2tlbl9zdGFydCk7Ci0JICAgICAgKmN1cnJlbnRfcG9zbiA9IHNhdmVfY2hhcjsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbdGhpc19vcGVyYW5kXSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChleHBlY3Rpbmdfb3BlcmFuZCkKLQkJewotCQkgIGFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCi0JCXsKLQkJICBhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICAvKiBub3cgKmN1cnJlbnRfcG9zbiBtdXN0IGJlIGVpdGhlciAnLCcgb3IgRU5EX09GX0lOU04gKi8KLQkgIGlmICgqY3VycmVudF9wb3NuID09ICcsJykKLQkgICAgewotCSAgICAgIGlmICgqKytjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCi0JCXsJCS8qIGp1c3Qgc2tpcCBpdCwgaWYgaXQncyBcbiBjb21wbGFpbiAqLwotCQkgIGFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBleHBlY3Rpbmdfb3BlcmFuZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAoKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTik7CS8qIHVudGlsIHdlIGdldCBlbmQgb2YgaW5zbiAqLwotICAgIH0KLSAgZGVidWcgKCJOdW1iZXIgb2Ygb3BlcmFuZHMgZm91bmQ6ICVkXG4iLCBpbnNuLm9wZXJhbmRzKTsKLSAgLyogQ2hlY2sgdGhhdCBudW1iZXIgb2Ygb3BlcmFuZHMgaXMgY29ycmVjdCAqLwotICBpZiAoaW5zbi5vcGVyYW5kcyAhPSBpbnNuLnRtLT5vcGVyYW5kcykKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBudW1vcHMgPSBpbnNuLnRtLT5vcGVyYW5kczsKLSAgICAgIC8qIElmIG9wZXJhbmRzIGFyZSBub3QgdGhlIHNhbWUsIHRoZW4gc2VlIGlmIGFueSBvZiB0aGUgb3BlcmFuZHMgYXJlIG5vdAotICAgICAgICAgcmVxdWlyZWQuICBUaGVuIHJlY2hlY2sgd2l0aCBudW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMuICBJZiB0aGV5IGFyZSBzdGlsbCBub3QKLSAgICAgICAgIHRoZSBzYW1lLCB0aGVuIGdpdmUgYW4gZXJyb3IsIG90aGVyd2lzZSBjYXJyeSBvbi4gKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnNuLnRtLT5vcGVyYW5kczsgaSsrKQotCWlmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzW2ldICYgTm90UmVxKQotCSAgbnVtb3BzLS07Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kcyAhPSBudW1vcHMpCi0JewotCSAgYXNfYmFkICgiSW5jb3JyZWN0IG51bWJlciBvZiBvcGVyYW5kcyBnaXZlbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fTm90UmVxOwotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBpbnNuLm9wZXJhbmRzOyBjb3VudCsrKQotICAgIHsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVtjb3VudF0tPm9wX3R5cGUgJiBpbnNuLnRtLT5vcGVyYW5kX3R5cGVzW2NvdW50XSkKLQl7Ci0JICBkZWJ1ZyAoIk9wZXJhbmQgJWQgbWF0Y2hlc1xuIiwgY291bnQgKyAxKTsKLQkgIC8qIElmIGluc3RydWN0aW9uIGhhcyB0d28gb3BlcmFuZHMgYW5kIGhhcyBhbiBBZGRyZXNzTW9kZSBtb2RpZmllciB0aGVuIHNldAotCSAgICAgYWRkcmVzc2luZyBtb2RlIHR5cGUgZm9yIGluc3RydWN0aW9uICovCi0JICBpZiAoaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IEFkZHJlc3NNb2RlKQotCSAgICB7Ci0JICAgICAgaW50IGFkZHJfaW5zbiA9IDA7Ci0JICAgICAgLyogU3RvcmUgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgc2Vjb25kIG9wZXJhbmQgZm9yIHRoZSBhZGRyZXNzIG1vZGUuICovCi0JICAgICAgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzFdICYgKEluZGlyZWN0IHwgRGlyZWN0KSkgPT0gKEluZGlyZWN0IHwgRGlyZWN0KSkKLQkJYWRkcl9pbnNuID0gMTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbYWRkcl9pbnNuXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX1JlZ2lzdGVyOwotCSAgICAgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlW2FkZHJfaW5zbl0tPm9wX3R5cGUgJiBEaXJlY3QpCi0JCWluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fRGlyZWN0OwotCSAgICAgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlW2FkZHJfaW5zbl0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkJaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9JbmRpcmVjdDsKLQkgICAgICBlbHNlCi0JCWluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fSW1tZWRpYXRlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoIlRoZSAlcyBvcGVyYW5kIGRvZXNuJ3QgbWF0Y2giLCBvcmRpbmFsX25hbWVzW2NvdW50XSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgLyogTm93IHNldCB0aGUgYWRkcmVzc2luZyBtb2RlIGZvciAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLiAqLwotICBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBvcDNUMSkgJiYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMV0gJiBvcDNUMikpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBhZGRyZXNzaW5nIG1vZGUgdG8gdGhlIHZhbHVlcyB1c2VkIGZvciAyIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zIGluIHRoZQotICAgICAgICAgRyBhZGRyZXNzaW5nIGZpZWxkIG9mIHRoZSBvcGNvZGUuICovCi0gICAgICBjaGFyICpwOwotICAgICAgc3dpdGNoIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSkKLQl7Ci0JY2FzZSBSbjoKLQljYXNlIEFSbjoKLQljYXNlIERQUmVnOgotCWNhc2UgT3RoZXJSZWc6Ci0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkgICAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9SZWdpc3RlcjsKLQkgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fRGlyZWN0OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2hvdWxkbid0IG1ha2UgaXQgdG8gdGhpcyBzdGFnZSAqLwotCSAgICAgIGFzX2JhZCAoIkluY29tcGF0aWJsZSBmaXJzdCBhbmQgc2Vjb25kIG9wZXJhbmRzIGluIGluc3RydWN0aW9uIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIEluZGlyZWN0OgotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgKEFsbFJlZykpCi0JICAgIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fSW5kaXJlY3Q7Ci0JICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0ltbWVkaWF0ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNob3VsZG4ndCBtYWtlIGl0IHRvIHRoaXMgc3RhZ2UgKi8KLQkgICAgICBhc19iYWQgKCJJbmNvbXBhdGlibGUgZmlyc3QgYW5kIHNlY29uZCBvcGVyYW5kcyBpbiBpbnN0cnVjdGlvbiIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogTm93IG1ha2UgdXAgdGhlIG9wY29kZSBmb3IgdGhlIDMgb3BlcmFuZCBpbnN0cnVjdGlvbnMuICBBcyBpbiBwYXJhbGxlbAotICAgICAgICAgaW5zdHJ1Y3Rpb25zLCB0aGVyZSB3aWxsIGJlIG5vIHVucmVzb2x2ZWQgdmFsdWVzLCBzbyB0aGV5IGNhbiBiZSBmdWxseSBmb3JtZWQKLSAgICAgICAgIGFuZCBhZGRlZCB0byB0aGUgZnJhZyB0YWJsZS4gKi8KLSAgICAgIGluc24ub3Bjb2RlID0gaW5zbi50bS0+YmFzZV9vcGNvZGU7Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQl7Ci0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmluZGlyZWN0LkFSbnVtKTsKLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCX0KLSAgICAgIGVsc2UKLQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUpOwotICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JewotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQl9Ci0gICAgICBlbHNlCi0JaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlIDw8IDgpOwotICAgICAgaWYgKGluc24ub3BlcmFuZHMgPT0gMykKLQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMl0tPnJlZy5vcGNvZGUgPDwgMTYpOwotICAgICAgaW5zbi5vcGNvZGUgfD0gaW5zbi5hZGRyZXNzaW5nX21vZGU7Ci0gICAgICBwID0gZnJhZ19tb3JlIChJTlNOX1NJWkUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIE5vdCBhIHRocmVlIG9wZXJhbmQgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGNoYXIgKnA7Ci0gICAgICBpbnQgYW1faW5zbiA9IC0xOwotICAgICAgaW5zbi5vcGNvZGUgPSBpbnNuLnRtLT5iYXNlX29wY29kZTsKLSAgICAgIC8qIENyZWF0ZSBmcmFnIGZvciBpbnN0cnVjdGlvbiAtIGFsbCBpbnN0cnVjdGlvbnMgYXJlIDQgYnl0ZXMgbG9uZy4gKi8KLSAgICAgIHAgPSBmcmFnX21vcmUgKElOU05fU0laRSk7Ci0gICAgICBpZiAoKGluc24ub3BlcmFuZHMgPiAwKSAmJiAoaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IEFkZHJlc3NNb2RlKSkKLQl7Ci0JICBpbnNuLm9wY29kZSB8PSBpbnNuLmFkZHJlc3NpbmdfbW9kZTsKLQkgIGlmIChpbnNuLmFkZHJlc3NpbmdfbW9kZSA9PSBBTV9JbmRpcmVjdCkKLQkgICAgewotCSAgICAgIC8qIERldGVybWluZSB3aGljaCBvcGVyYW5kIGdpdmVzIHRoZSBhZGRyZXNzaW5nIG1vZGUgKi8KLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkJYW1faW5zbiA9IDA7Ci0JICAgICAgaWYgKChpbnNuLm9wZXJhbmRzID4gMSkgJiYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpKQotCQlhbV9pbnNuID0gMTsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmluZGlyZWN0LmRpc3ApOwotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWyFhbV9pbnNuXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fUmVnaXN0ZXIpCi0JICAgIHsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUpOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnNuLmFkZHJlc3NpbmdfbW9kZSA9PSBBTV9EaXJlY3QpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBEaXJlY3QpCi0JCWFtX2luc24gPSAwOwotCSAgICAgIGlmICgoaW5zbi5vcGVyYW5kcyA+IDEpICYmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIERpcmVjdCkpCi0JCWFtX2luc24gPSAxOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWyFhbV9pbnNuXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5kaXJlY3QucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIC8qIFJlc29sdmVkIHZhbHVlcyBjYW4gYmUgcGxhY2VkIHN0cmFpZ2h0IGludG8gaW5zdHJ1Y3Rpb24gd29yZCwgYW5kIG91dHB1dCAqLwotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+ZGlyZWN0LmFkZHJlc3MgJiAweDAwMDBGRkZGKTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7CQkvKiBVbnJlc29sdmVkIGRpcmVjdCBhZGRyZXNzaW5nIG1vZGUgaW5zdHJ1Y3Rpb24gKi8KLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmRpcmVjdC5kaXJlY3RfZXhwciwgMCwgMCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fSW1tZWRpYXRlKQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIGNoYXIgKmtlZXBsb2M7Ci0JCSAgaW50IHNpemU7Ci0JCSAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQkgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkJICBzd2l0Y2ggKGluc24udG0tPmltbV9hcmdfdHlwZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgSW1tX0Zsb2F0OgotCQkgICAgICBkZWJ1ZyAoIkZsb2F0aW5nIHBvaW50IGZpcnN0IG9wZXJhbmRcbiIpOwotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgICBrZWVwbG9jID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmxhYmVsOwotCQkgICAgICBpZiAobWRfYXRvZiAoJ2YnLCBwICsgMiwgJnNpemUpICE9IDApCi0JCQl7Ci0JCQkgIGFzX2JhZCAoImludmFsaWQgc2hvcnQgZm9ybSBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgb3BlcmFuZCIpOwotCQkJICByZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGtlZXBsb2M7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBJbW1fVUludDoKLQkJICAgICAgZGVidWcgKCJVbnNpZ25lZCBpbnQgZmlyc3Qgb3BlcmFuZFxuIik7Ci0JCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQpCi0JCQlhc193YXJuICgicm91bmRpbmcgZG93biBmaXJzdCBvcGVyYW5kIGZsb2F0IHRvIHVuc2lnbmVkIGludCIpOwotCQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciA+IDB4RkZGRikKLQkJCWFzX3dhcm4gKCJvbmx5IGxvd2VyIDE2LWJpdHMgb2YgZmlyc3Qgb3BlcmFuZCBhcmUgdXNlZCIpOwotCQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciAmIDB4MDAwMEZGRkZMKTsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEltbV9TSW50OgotCQkgICAgICBkZWJ1ZyAoIkludCBmaXJzdCBvcGVyYW5kXG4iKTsKLQkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuZGVjaW1hbF9mb3VuZCkKLQkJCWFzX3dhcm4gKCJyb3VuZGluZyBkb3duIGZpcnN0IG9wZXJhbmQgZmxvYXQgdG8gc2lnbmVkIGludCIpOwotCQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA8IC0zMjc2OCB8fAotCQkJICBpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyID4gMzI3NjcpCi0JCQl7Ci0JCQkgIGFzX2JhZCAoImZpcnN0IG9wZXJhbmQgaXMgdG9vIGxhcmdlIGZvciAxNi1iaXQgc2lnbmVkIGludCIpOwotCQkJICByZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyICYgMHgwMDAwRkZGRkwpOwotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogVW5yZXNvbHZlZCBpbW1lZGlhdGUgbGFiZWwgKi8KLQkJICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCSAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMiAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDIsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmltbV9leHByLCAwLCAwKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IFBDUmVsKQotCXsKLQkgIC8qIENvbmRpdGlvbmFsIEJyYW5jaCBhbmQgQ2FsbCBpbnN0cnVjdGlvbnMgKi8KLQkgIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIChBbGxSZWcgfCBEaXNwKSkgPT0gKEFsbFJlZyB8IERpc3ApKQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgKEFsbFJlZykpCi0JCXsKLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUpOwotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlZ2lzdGVyOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWxhdGl2ZTsKLQkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCQkgICAgewotCQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciAmIDB4MDAwMEZGRkYpOwotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMiAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDIsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmltbV9leHByLCAxLCAwKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIEFSbikgPT0gQVJuKQotCSAgICB7Ci0JICAgICAgLyogRGVjcmVtZW50IGFuZCBCcmFuY2ggaW5zdHJ1Y3Rpb25zICovCi0JICAgICAgaW5zbi5vcGNvZGUgfD0gKChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSAtIDB4MDgpIDw8IDIyKTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkJewotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSk7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVnaXN0ZXI7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoImZpcnN0IG9wZXJhbmQgaXMgZmxvYXRpbmcgcG9pbnQiKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyIDwgLTMyNzY4IHx8Ci0JCSAgICAgIGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgPiAzMjc2NykKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiZmlyc3Qgb3BlcmFuZCBpcyB0b28gbGFyZ2UgZm9yIDE2LWJpdCBzaWduZWQgaW50Iik7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmltbWVkaWF0ZS5zX251bWJlcik7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVsYXRpdmU7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlbGF0aXZlOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMSwgMCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gPT0gSVZlY3RvcikKLQl7Ci0JICAvKiBUcmFwIGluc3RydWN0aW9ucyAqLwotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgSVZlY3RvcikKLQkgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIpOwotCSAgZWxzZQotCSAgICB7CQkJLyogU2hvdWxkbid0IGdldCBoZXJlICovCi0JICAgICAgYXNfYmFkICgiaW50ZXJydXB0IHZlY3RvciBmb3IgdHJhcCBpbnN0cnVjdGlvbiBvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IFN0YWNrT3AgfHwgaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IFJvdGF0ZSkKLQl7Ci0JICAvKiBQdXNoLCBQb3AgYW5kIFJvdGF0ZSBpbnN0cnVjdGlvbnMgKi8KLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCX0KLSAgICAgIGVsc2UgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgKEFiczI0IHwgRGlyZWN0KSkgPT0gKEFiczI0IHwgRGlyZWN0KSkKLQl7Ci0JICAvKiBMRFAgSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgdGVzdGVkIGZvciBiZWZvcmUgdGhlIG5leHQgc2VjdGlvbiAqLwotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgRGlyZWN0KQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5kaXJlY3QucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIC8qIERpcmVjdCBhZGRyZXNzaW5nIHVzZXMgbG93ZXIgOCBiaXRzIG9mIGRpcmVjdCBhZGRyZXNzICovCi0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5kaXJlY3QuYWRkcmVzcyAmIDB4MDBGRjAwMDApID4+IDE2OwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmaXhTICpmaXg7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXggPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAzIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMSwgJmluc24ub3BlcmFuZF90eXBlWzBdLT5kaXJlY3QuZGlyZWN0X2V4cHIsIDAsIDApOwotCQkgIC8qIEVuc3VyZSB0aGF0IHRoZSBhc3NlbWJsZXIgZG9lc24ndCBjb21wbGFpbiBhYm91dCBmaXR0aW5nIGEgMjQtYml0Ci0JCSAgICAgYWRkcmVzcyBpbnRvIDggYml0cy4gKi8KLQkJICBmaXgtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgLyogSW1tZWRpYXRlIGFkZHJlc3NpbmcgdXNlcyB1cHBlciA4IGJpdHMgb2YgYWRkcmVzcyAqLwotCQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyID4gMHgwMEZGRkZGRikKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiTERQIGluc3RydWN0aW9uIG5lZWRzIGEgMjQtYml0IG9wZXJhbmQiKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIGluc24ub3Bjb2RlIHw9ICgoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciAmIDB4MDBGRjAwMDApID4+IDE2KTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZml4UyAqZml4OwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4ID0gZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMyAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDEsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmltbV9leHByLCAwLCAwKTsKLQkJICBmaXgtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIChJbW0yNCkpCi0JewotCSAgLyogVW5jb25kaXRpb25hbCBCcmFuY2ggYW5kIENhbGwgaW5zdHJ1Y3Rpb25zICovCi0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgPiAweDAwRkZGRkZGKQotCQlhc193YXJuICgiZmlyc3Qgb3BlcmFuZCBpcyB0b28gbGFyZ2UgZm9yIGEgMjQtYml0IGRpc3BsYWNlbWVudCIpOwotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyICYgMHgwMEZGRkZGRik7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAxIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMywgJmluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDAsIDApOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIE5vdFJlcSkKLQl7Ci0JICAvKiBDaGVjayBmb3IgTk9QIGluc3RydWN0aW9uIHdpdGhvdXQgYXJndW1lbnRzLiAqLwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGVyYW5kcyA9PSAwKQotCXsKLQkgIC8qIENoZWNrIGZvciBpbnN0cnVjdGlvbnMgd2l0aG91dCBvcGVyYW5kcy4gKi8KLQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JfQotICAgIH0KLSAgZGVidWcgKCJBZGRyZXNzaW5nIG1vZGU6ICUwOFhcbiIsIGluc24uYWRkcmVzc2luZ19tb2RlKTsKLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpbnNuLm9wZXJhbmRzOyBpKyspCi0gICAgICB7Ci0JaWYgKGluc24ub3BlcmFuZF90eXBlW2ldLT5pbW1lZGlhdGUubGFiZWwpCi0JICBmcmVlIChpbnNuLm9wZXJhbmRfdHlwZVtpXS0+aW1tZWRpYXRlLmxhYmVsKTsKLQlmcmVlIChpbnNuLm9wZXJhbmRfdHlwZVtpXSk7Ci0gICAgICB9Ci0gIH0KLSAgZGVidWcgKCJGaW5hbCBvcGNvZGU6ICUwOFhcbiIsIGluc24ub3Bjb2RlKTsKLSAgZGVidWcgKCJcbiIpOwotfQotCi1zdHJ1Y3QgdGljMzBfcGFyX2luc24KLXsKLSAgcGFydGVtcGxhdGUgKnRtOwkJLyogVGVtcGxhdGUgb2YgY3VycmVudCBwYXJhbGxlbCBpbnN0cnVjdGlvbiAqLwotICBpbnQgb3BlcmFuZHNbMl07CQkvKiBOdW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMgZm9yIGVhY2ggaW5zbiAqLwotICAvKiBUeXBlIG9mIG9wZXJhbmQgZ2l2ZW4gaW4gaW5zdHJ1Y3Rpb24gKi8KLSAgb3BlcmFuZCAqb3BlcmFuZF90eXBlWzJdW01BWF9PUEVSQU5EU107Ci0gIGludCBzd2FwX29wZXJhbmRzOwkJLyogV2hldGhlciB0byBzd2FwIG9wZXJhbmRzIGFyb3VuZC4gKi8KLSAgdW5zaWduZWQgcF9maWVsZDsJCS8qIFZhbHVlIG9mIHAgZmllbGQgaW4gbXVsdGlwbHkgYWRkL3N1YiBpbnN0cnVjdGlvbnMgKi8KLSAgdW5zaWduZWQgb3Bjb2RlOwkJLyogRmluYWwgb3Bjb2RlICovCi19OwotCi1zdHJ1Y3QgdGljMzBfcGFyX2luc24gcF9pbnNuOwotCi1pbnQKLXRpYzMwX3BhcmFsbGVsX2luc24gKGNoYXIgKnRva2VuKQotewotICBzdGF0aWMgcGFydGVtcGxhdGUgKnBfb3Bjb2RlOwotICBjaGFyICpjdXJyZW50X3Bvc24gPSB0b2tlbjsKLSAgY2hhciAqdG9rZW5fc3RhcnQ7Ci0gIGNoYXIgc2F2ZV9jaGFyOwotCi0gIGRlYnVnICgiSW4gdGljMzBfcGFyYWxsZWxfaW5zbiB3aXRoICVzXG4iLCB0b2tlbik7Ci0gIG1lbXNldCAoJnBfaW5zbiwgJ1wwJywgc2l6ZW9mIChwX2luc24pKTsKLSAgd2hpbGUgKGlzX29wY29kZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLSAgICBjdXJyZW50X3Bvc24rKzsKLSAgewkJCQkvKiBGaW5kIGluc3RydWN0aW9uICovCi0gICAgc2F2ZV9jaGFyID0gKmN1cnJlbnRfcG9zbjsKLSAgICAqY3VycmVudF9wb3NuID0gJ1wwJzsKLSAgICBwX29wY29kZSA9IChwYXJ0ZW1wbGF0ZSAqKSBoYXNoX2ZpbmQgKHBhcm9wX2hhc2gsIHRva2VuKTsKLSAgICBpZiAocF9vcGNvZGUpCi0gICAgICB7Ci0JZGVidWcgKCJGb3VuZCBpbnN0cnVjdGlvbiAlc1xuIiwgcF9vcGNvZGUtPm5hbWUpOwotCXBfaW5zbi50bSA9IHBfb3Bjb2RlOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQljaGFyIGZpcnN0X29wY29kZVs2XSA9Ci0JezB9OwotCWNoYXIgc2Vjb25kX29wY29kZVs2XSA9Ci0JezB9OwotCWludCBpOwotCWludCBjdXJyZW50X29wY29kZSA9IC0xOwotCWludCBjaGFyX3B0ciA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3RybGVuICh0b2tlbik7IGkrKykKLQkgIHsKLQkgICAgY2hhciBjaCA9ICoodG9rZW4gKyBpKTsKLQkgICAgaWYgKGNoID09ICdfJyAmJiBjdXJyZW50X29wY29kZSA9PSAtMSkKLQkgICAgICB7Ci0JCWN1cnJlbnRfb3Bjb2RlID0gMDsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICBpZiAoY2ggPT0gJ18nICYmIGN1cnJlbnRfb3Bjb2RlID09IDApCi0JICAgICAgewotCQljdXJyZW50X29wY29kZSA9IDE7Ci0JCWNoYXJfcHRyID0gMDsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICBzd2l0Y2ggKGN1cnJlbnRfb3Bjb2RlKQotCSAgICAgIHsKLQkgICAgICBjYXNlIDA6Ci0JCWZpcnN0X29wY29kZVtjaGFyX3B0cisrXSA9IGNoOwotCQlicmVhazsKLQkgICAgICBjYXNlIDE6Ci0JCXNlY29uZF9vcGNvZGVbY2hhcl9wdHIrK10gPSBjaDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCWRlYnVnICgiZmlyc3Rfb3Bjb2RlID0gJXNcbiIsIGZpcnN0X29wY29kZSk7Ci0JZGVidWcgKCJzZWNvbmRfb3Bjb2RlID0gJXNcbiIsIHNlY29uZF9vcGNvZGUpOwotCXNwcmludGYgKHRva2VuLCAicV8lc18lcyIsIHNlY29uZF9vcGNvZGUsIGZpcnN0X29wY29kZSk7Ci0JcF9vcGNvZGUgPSAocGFydGVtcGxhdGUgKikgaGFzaF9maW5kIChwYXJvcF9oYXNoLCB0b2tlbik7Ci0JaWYgKHBfb3Bjb2RlKQotCSAgewotCSAgICBkZWJ1ZyAoIkZvdW5kIGluc3RydWN0aW9uICVzXG4iLCBwX29wY29kZS0+bmFtZSk7Ci0JICAgIHBfaW5zbi50bSA9IHBfb3Bjb2RlOwotCSAgICBwX2luc24uc3dhcF9vcGVyYW5kcyA9IDE7Ci0JICB9Ci0JZWxzZQotCSAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgKmN1cnJlbnRfcG9zbiA9IHNhdmVfY2hhcjsKLSAgfQotICB7CQkJCS8qIEZpbmQgb3BlcmFuZHMgKi8KLSAgICBpbnQgcGFyZW5fbm90X2JhbGFuY2VkOwotICAgIGludCBleHBlY3Rpbmdfb3BlcmFuZCA9IDA7Ci0gICAgaW50IGZvdW5kX3NlcGFyYXRvciA9IDA7Ci0gICAgZG8KLSAgICAgIHsKLQkvKiBza2lwIG9wdGlvbmFsIHdoaXRlIHNwYWNlIGJlZm9yZSBvcGVyYW5kICovCi0Jd2hpbGUgKCFpc19vcGVyYW5kX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pCi0JICB7Ci0JICAgIGlmICghaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgKmN1cnJlbnRfcG9zbiAhPSBQQVJBTExFTF9TRVBBUkFUT1IpCi0JICAgICAgewotCQlhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBiZWZvcmUgJXMgb3BlcmFuZCIsCi0JCQlvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbiksCi0JCQlvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSBQQVJBTExFTF9TRVBBUkFUT1IpCi0JICAgICAgZm91bmRfc2VwYXJhdG9yID0gMTsKLQkgICAgY3VycmVudF9wb3NuKys7Ci0JICB9Ci0JdG9rZW5fc3RhcnQgPSBjdXJyZW50X3Bvc247CS8qIGFmdGVyIHdoaXRlIHNwYWNlICovCi0JcGFyZW5fbm90X2JhbGFuY2VkID0gMDsKLQl3aGlsZSAocGFyZW5fbm90X2JhbGFuY2VkIHx8ICpjdXJyZW50X3Bvc24gIT0gJywnKQotCSAgewotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSBFTkRfT0ZfSU5TTikKLQkgICAgICB7Ci0JCWlmIChwYXJlbl9ub3RfYmFsYW5jZWQpCi0JCSAgewotCQkgICAgYXNfYmFkICgiVW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiAlcyBvcGVyYW5kLiIsCi0JCQkgICAgb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCSAgICByZXR1cm4gMTsKLQkJICB9Ci0JCWVsc2UKLQkJICBicmVhazsJLyogd2UgYXJlIGRvbmUgKi8KLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKCpjdXJyZW50X3Bvc24gPT0gUEFSQUxMRUxfU0VQQVJBVE9SKQotCSAgICAgIHsKLQkJd2hpbGUgKGlzX3NwYWNlX2NoYXIgKCooY3VycmVudF9wb3NuIC0gMSkpKQotCQkgIGN1cnJlbnRfcG9zbi0tOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICFpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGluICVzIG9wZXJhbmQiLAotCQkJb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAotCQkJb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJygnKQotCSAgICAgICsrcGFyZW5fbm90X2JhbGFuY2VkOwotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnKScpCi0JICAgICAgLS1wYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JICAgIGN1cnJlbnRfcG9zbisrOwotCSAgfQotCWlmIChjdXJyZW50X3Bvc24gIT0gdG9rZW5fc3RhcnQpCi0JICB7CQkJLyogeWVzLCB3ZSd2ZSByZWFkIGluIGFub3RoZXIgb3BlcmFuZCAqLwotCSAgICBwX2luc24ub3BlcmFuZHNbZm91bmRfc2VwYXJhdG9yXSsrOwotCSAgICBpZiAocF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0gPiBNQVhfT1BFUkFORFMpCi0JICAgICAgewotCQlhc19iYWQgKCJTcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiLAotCQkJTUFYX09QRVJBTkRTKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICAvKiBub3cgcGFyc2Ugb3BlcmFuZCBhZGRpbmcgaW5mbyB0byAnaW5zbicgYXMgd2UgZ28gYWxvbmcgKi8KLQkgICAgc2F2ZV9jaGFyID0gKmN1cnJlbnRfcG9zbjsKLQkgICAgKmN1cnJlbnRfcG9zbiA9ICdcMCc7Ci0JICAgIHBfaW5zbi5vcGVyYW5kX3R5cGVbZm91bmRfc2VwYXJhdG9yXVtwX2luc24ub3BlcmFuZHNbZm91bmRfc2VwYXJhdG9yXSAtIDFdID0KLQkgICAgICB0aWMzMF9vcGVyYW5kICh0b2tlbl9zdGFydCk7Ci0JICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7Ci0JICAgIGlmICghcF9pbnNuLm9wZXJhbmRfdHlwZVtmb3VuZF9zZXBhcmF0b3JdW3BfaW5zbi5vcGVyYW5kc1tmb3VuZF9zZXBhcmF0b3JdIC0gMV0pCi0JICAgICAgcmV0dXJuIDE7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAoZXhwZWN0aW5nX29wZXJhbmQpCi0JICAgICAgewotCQlhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJywnKQotCSAgICAgIHsKLQkJYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYmVmb3JlICcsJzsgZ290IG5vdGhpbmciKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgfQotCS8qIG5vdyAqY3VycmVudF9wb3NuIG11c3QgYmUgZWl0aGVyICcsJyBvciBFTkRfT0ZfSU5TTiAqLwotCWlmICgqY3VycmVudF9wb3NuID09ICcsJykKLQkgIHsKLQkgICAgaWYgKCorK2N1cnJlbnRfcG9zbiA9PSBFTkRfT0ZfSU5TTikKLQkgICAgICB7CQkJLyoganVzdCBza2lwIGl0LCBpZiBpdCdzIFxuIGNvbXBsYWluICovCi0JCWFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICBleHBlY3Rpbmdfb3BlcmFuZCA9IDE7Ci0JICB9Ci0gICAgICB9Ci0gICAgd2hpbGUgKCpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pOwkvKiB1bnRpbCB3ZSBnZXQgZW5kIG9mIGluc24gKi8KLSAgfQotICBpZiAocF9pbnNuLnN3YXBfb3BlcmFuZHMpCi0gICAgewotICAgICAgaW50IHRlbXBfbnVtLCBpOwotICAgICAgb3BlcmFuZCAqdGVtcF9vcDsKLQotICAgICAgdGVtcF9udW0gPSBwX2luc24ub3BlcmFuZHNbMF07Ci0gICAgICBwX2luc24ub3BlcmFuZHNbMF0gPSBwX2luc24ub3BlcmFuZHNbMV07Ci0gICAgICBwX2luc24ub3BlcmFuZHNbMV0gPSB0ZW1wX251bTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfT1BFUkFORFM7IGkrKykKLQl7Ci0JICB0ZW1wX29wID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVtpXTsKLQkgIHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1baV0gPSBwX2luc24ub3BlcmFuZF90eXBlWzFdW2ldOwotCSAgcF9pbnNuLm9wZXJhbmRfdHlwZVsxXVtpXSA9IHRlbXBfb3A7Ci0JfQotICAgIH0KLSAgaWYgKHBfaW5zbi5vcGVyYW5kc1swXSAhPSBwX2luc24udG0tPm9wZXJhbmRzXzEpCi0gICAgewotICAgICAgYXNfYmFkICgiaW5jb3JyZWN0IG51bWJlciBvZiBvcGVyYW5kcyBnaXZlbiBpbiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24iKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKHBfaW5zbi5vcGVyYW5kc1sxXSAhPSBwX2luc24udG0tPm9wZXJhbmRzXzIpCi0gICAgewotICAgICAgYXNfYmFkICgiaW5jb3JyZWN0IG51bWJlciBvZiBvcGVyYW5kcyBnaXZlbiBpbiB0aGUgc2Vjb25kIGluc3RydWN0aW9uIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGRlYnVnICgiTnVtYmVyIG9mIG9wZXJhbmRzIGluIGZpcnN0IGluc246ICVkXG4iLCBwX2luc24ub3BlcmFuZHNbMF0pOwotICBkZWJ1ZyAoIk51bWJlciBvZiBvcGVyYW5kcyBpbiBzZWNvbmQgaW5zbjogJWRcbiIsIHBfaW5zbi5vcGVyYW5kc1sxXSk7Ci0gIHsJCQkJLyogTm93IGNoZWNrIGlmIG9wZXJhbmRzIGFyZSBjb3JyZWN0ICovCi0gICAgaW50IGNvdW50OwotICAgIGludCBudW1fcm4gPSAwOwotICAgIGludCBudW1faW5kID0gMDsKLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyOyBjb3VudCsrKQotICAgICAgewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBwX2luc24ub3BlcmFuZHNbY291bnRdOyBpKyspCi0JICB7Ci0JICAgIGlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVtjb3VudF1baV0tPm9wX3R5cGUgJgotCQkgcF9pbnNuLnRtLT5vcGVyYW5kX3R5cGVzW2NvdW50XVtpXSkgPT0gMCkKLQkgICAgICB7Ci0JCWFzX2JhZCAoIiVzIGluc3RydWN0aW9uLCBvcGVyYW5kICVkIGRvZXNuJ3QgbWF0Y2giLCBvcmRpbmFsX25hbWVzW2NvdW50XSwgaSArIDEpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIC8qIEdldCBudW1iZXIgb2YgUiByZWdpc3RlciBhbmQgaW5kaXJlY3QgcmVmZXJlbmNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGZpcnN0Ci0JICAgICAgIHR3byBvcGVyYW5kcyBvZiBlYWNoIGluc3RydWN0aW9uLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIG11bHRpcGx5Ci0JICAgICAgIHBhcmFsbGVsIGluc3RydWN0aW9ucyB3aGljaCByZXF1aXJlIHR3byBSIHJlZ2lzdGVycyBhbmQgdHdvIGluZGlyZWN0Ci0JICAgICAgIHJlZmVyZW5jZXMsIGJ1dCBub3QgaW4gYW55IHBhcnRpY3VsYXIgcGxhY2UuICovCi0JICAgIGlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVtjb3VudF1baV0tPm9wX3R5cGUgJiBSbikgJiYgaSA8IDIpCi0JICAgICAgbnVtX3JuKys7Ci0JICAgIGVsc2UgaWYgKChwX2luc24ub3BlcmFuZF90eXBlW2NvdW50XVtpXS0+b3BfdHlwZSAmIEluZGlyZWN0KSAmJiBpIDwgMikKLQkgICAgICBudW1faW5kKys7Ci0JICB9Ci0gICAgICB9Ci0gICAgaWYgKChwX2luc24udG0tPm9wZXJhbmRfdHlwZXNbMF1bMF0gJiAoSW5kaXJlY3QgfCBSbikpID09IChJbmRpcmVjdCB8IFJuKSkKLSAgICAgIHsKLQkvKiBDaGVjayBmb3IgdGhlIG11bHRpcGx5IGluc3RydWN0aW9ucyAqLwotCWlmIChudW1fcm4gIT0gMikKLQkgIHsKLQkgICAgYXNfYmFkICgiaW5jb3JyZWN0IGZvcm1hdCBmb3IgbXVsdGlwbHkgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24iKTsKLQkgICAgcmV0dXJuIDE7Ci0JICB9Ci0JaWYgKG51bV9pbmQgIT0gMikKLQkgIHsJCQkvKiBTaG91bGRuJ3QgZ2V0IGhlcmUgKi8KLQkgICAgYXNfYmFkICgiaW5jb3JyZWN0IGZvcm1hdCBmb3IgbXVsdGlwbHkgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24iKTsKLQkgICAgcmV0dXJuIDE7Ci0JICB9Ci0JaWYgKChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlICE9IDB4MDApICYmCi0JICAgIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlICE9IDB4MDEpKQotCSAgewotCSAgICBhc19iYWQgKCJkZXN0aW5hdGlvbiBmb3IgbXVsdGlwbHkgY2FuIG9ubHkgYmUgUjAgb3IgUjEiKTsKLQkgICAgcmV0dXJuIDE7Ci0JICB9Ci0JaWYgKChwX2luc24ub3BlcmFuZF90eXBlWzFdWzJdLT5yZWcub3Bjb2RlICE9IDB4MDIpICYmCi0JICAgIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzJdLT5yZWcub3Bjb2RlICE9IDB4MDMpKQotCSAgewotCSAgICBhc19iYWQgKCJkZXN0aW5hdGlvbiBmb3IgYWRkL3N1YnRyYWN0IGNhbiBvbmx5IGJlIFIyIG9yIFIzIik7Ci0JICAgIHJldHVybiAxOwotCSAgfQotCS8qIE5vdyBkZXRlcm1pbmUgdGhlIFAgZmllbGQgZm9yIHRoZSBpbnN0cnVjdGlvbiAqLwotCWlmIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICB7Ci0JICAgIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAwMDAwMDAwOwkvKiBJbmQgKiBJbmQsIFJuICArLy0gUm4gICovCi0JICAgIGVsc2UgaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgICBwX2luc24ucF9maWVsZCA9IDB4MDEwMDAwMDA7CS8qIEluZCAqIFJuLCAgSW5kICsvLSBSbiAgKi8KLQkgICAgZWxzZQotCSAgICAgIHBfaW5zbi5wX2ZpZWxkID0gMHgwMzAwMDAwMDsJLyogSW5kICogUm4sICBSbiAgKy8tIEluZCAqLwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPm9wX3R5cGUgJiBSbikKLQkgICAgICBwX2luc24ucF9maWVsZCA9IDB4MDIwMDAwMDA7CS8qIFJuICAqIFJuLCAgSW5kICsvLSBJbmQgKi8KLQkgICAgZWxzZSBpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICAgIHsKLQkJb3BlcmFuZCAqdGVtcDsKLQkJcF9pbnNuLnBfZmllbGQgPSAweDAxMDAwMDAwOwkvKiBSbiAgKiBJbmQsIEluZCArLy0gUm4gICovCi0JCS8qIE5lZWQgdG8gc3dhcCB0aGUgdHdvIG11bHRpcGx5IG9wZXJhbmRzIGFyb3VuZCBzbyB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4KLQkJICAgaXRzIHBsYWNlIGZvciB0aGUgb3Bjb2RlIG1ha2V1cCBpZSBzbyBJbmQgKiBSbiwgSW5kICsvLSBSbiAqLwotCQl0ZW1wID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXTsKLQkJcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXSA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV07Ci0JCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0gPSB0ZW1wOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJb3BlcmFuZCAqdGVtcDsKLQkJcF9pbnNuLnBfZmllbGQgPSAweDAzMDAwMDAwOwkvKiBSbiAgKiBJbmQsIFJuICArLy0gSW5kICovCi0JCXRlbXAgPSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdOwotCQlwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXTsKLQkJcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXSA9IHRlbXA7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0gIGRlYnVnICgiUCBmaWVsZDogJTA4WFxuIiwgcF9pbnNuLnBfZmllbGQpOwotICAvKiBGaW5hbGlzZSBvcGNvZGUuICBUaGlzIGlzIGVhc2llciBmb3IgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIGFzIHRoZXkgaGF2ZSB0byBiZQotICAgICBmdWxseSByZXNvbHZlZCwgdGhlcmUgYXJlIG5vIG1lbW9yeSBhZGRyZXNzZXMgYWxsb3dlZCwgZXhjZXB0IHRocm91Z2ggaW5kaXJlY3QKLSAgICAgYWRkcmVzc2luZywgc28gdGhlcmUgYXJlIG5vIGxhYmVscyB0byByZXNvbHZlLiAqLwotICB7Ci0gICAgcF9pbnNuLm9wY29kZSA9IHBfaW5zbi50bS0+YmFzZV9vcGNvZGU7Ci0gICAgc3dpdGNoIChwX2luc24udG0tPm9wb3JkZXIpCi0gICAgICB7Ci0gICAgICBjYXNlIE9PXzRvcDE6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT180b3AyOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+cmVnLm9wY29kZSA9PSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlKQotCSAgYXNfd2FybiAoImxvYWRpbmcgdGhlIHNhbWUgcmVnaXN0ZXIgaW4gcGFyYWxsZWwgb3BlcmF0aW9uIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PXzRvcDM6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT181b3AxOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fNW9wMjoKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PX1BGaWVsZDoKLQlwX2luc24ub3Bjb2RlIHw9IHBfaW5zbi5wX2ZpZWxkOwotCWlmIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlID09IDB4MDEpCi0JICBwX2luc24ub3Bjb2RlIHw9IDB4MDA4MDAwMDA7Ci0JaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMl0tPnJlZy5vcGNvZGUgPT0gMHgwMykKLQkgIHBfaW5zbi5vcGNvZGUgfD0gMHgwMDQwMDAwMDsKLQlzd2l0Y2ggKHBfaW5zbi5wX2ZpZWxkKQotCSAgewotCSAgY2FzZSAweDAwMDAwMDAwOgotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDB4MDEwMDAwMDA6Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0LkFSbnVtKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMHgwMjAwMDAwMDoKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAweDAzMDAwMDAwOgotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIH0JCQkJLyogT3Bjb2RlIGlzIGZpbmFsaXNlZCBhdCB0aGlzIHBvaW50IGZvciBhbGwgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zLiAqLwotICB7CQkJCS8qIE91dHB1dCBvcGNvZGUgKi8KLSAgICBjaGFyICpwOwotICAgIHAgPSBmcmFnX21vcmUgKElOU05fU0laRSk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBwX2luc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotICB9Ci0gIHsKLSAgICBpbnQgaSwgajsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgZm9yIChqID0gMDsgaiA8IHBfaW5zbi5vcGVyYW5kc1tpXTsgaisrKQotCWZyZWUgKHBfaW5zbi5vcGVyYW5kX3R5cGVbaV1bal0pOwotICB9Ci0gIGRlYnVnICgiRmluYWwgb3Bjb2RlOiAlMDhYXG4iLCBwX2luc24ub3Bjb2RlKTsKLSAgZGVidWcgKCJcbiIpOwotICByZXR1cm4gMTsKLX0KLQotb3BlcmFuZCAqCi10aWMzMF9vcGVyYW5kICh0b2tlbikKLSAgICAgY2hhciAqdG9rZW47Ci17Ci0gIGludCBjb3VudDsKLSAgY2hhciBpbmRfYnVmZmVyW3N0cmxlbiAodG9rZW4pXTsKLSAgb3BlcmFuZCAqY3VycmVudF9vcDsKLQotICBkZWJ1ZyAoIkluIHRpYzMwX29wZXJhbmQgd2l0aCAlc1xuIiwgdG9rZW4pOwotICBjdXJyZW50X29wID0gKG9wZXJhbmQgKikgbWFsbG9jIChzaXplb2YgKG9wZXJhbmQpKTsKLSAgbWVtc2V0IChjdXJyZW50X29wLCAnXDAnLCBzaXplb2YgKG9wZXJhbmQpKTsKLSAgaWYgKCp0b2tlbiA9PSBESVJFQ1RfUkVGRVJFTkNFKQotICAgIHsKLSAgICAgIGNoYXIgKnRva2VuX3Bvc24gPSB0b2tlbiArIDE7Ci0gICAgICBpbnQgZGlyZWN0X2xhYmVsID0gMDsKLSAgICAgIGRlYnVnICgiRm91bmQgZGlyZWN0IHJlZmVyZW5jZVxuIik7Ci0gICAgICB3aGlsZSAoKnRva2VuX3Bvc24pCi0JewotCSAgaWYgKCFpc19kaWdpdF9jaGFyICgqdG9rZW5fcG9zbikpCi0JICAgIGRpcmVjdF9sYWJlbCA9IDE7Ci0JICB0b2tlbl9wb3NuKys7Ci0JfQotICAgICAgaWYgKGRpcmVjdF9sYWJlbCkKLQl7Ci0JICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHNlZ1QgcmV0dmFsOwotCSAgZGVidWcgKCJEaXJlY3QgcmVmZXJlbmNlIGlzIGEgbGFiZWxcbiIpOwotCSAgY3VycmVudF9vcC0+ZGlyZWN0LmxhYmVsID0gdG9rZW4gKyAxOwotCSAgc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0b2tlbiArIDE7Ci0JICBkZWJ1ZyAoIkN1cnJlbnQgaW5wdXRfbGluZV9wb2ludGVyOiAlc1xuIiwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgIHJldHZhbCA9IGV4cHJlc3Npb24gKCZjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIpOwotCSAgZGVidWcgKCJFeHByZXNzaW9uIHR5cGU6ICVkXG4iLCBjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIuWF9vcCk7Ci0JICBkZWJ1ZyAoIkV4cHJlc3Npb24gYWRkbnVtOiAlZFxuIiwgY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByLlhfYWRkX251bWJlcik7Ci0JICBkZWJ1ZyAoIlNlZ21lbnQ6ICVkXG4iLCByZXR2YWwpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpZiAoY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfb3AtPmRpcmVjdC5hZGRyZXNzID0gY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByLlhfYWRkX251bWJlcjsKLQkgICAgICBjdXJyZW50X29wLT5kaXJlY3QucmVzb2x2ZWQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRlYnVnICgiRGlyZWN0IHJlZmVyZW5jZSBpcyBhIG51bWJlclxuIik7Ci0JICBjdXJyZW50X29wLT5kaXJlY3QuYWRkcmVzcyA9IGF0b2kgKHRva2VuICsgMSk7Ci0JICBjdXJyZW50X29wLT5kaXJlY3QucmVzb2x2ZWQgPSAxOwotCX0KLSAgICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBEaXJlY3Q7Ci0gICAgfQotICBlbHNlIGlmICgqdG9rZW4gPT0gSU5ESVJFQ1RfUkVGRVJFTkNFKQotICAgIHsJCQkJLyogSW5kaXJlY3QgcmVmZXJlbmNlIG9wZXJhbmQgKi8KLSAgICAgIGludCBmb3VuZF9hciA9IDA7Ci0gICAgICBpbnQgZm91bmRfZGlzcCA9IDA7Ci0gICAgICBpbnQgYXJfbnVtYmVyID0gLTE7Ci0gICAgICBpbnQgZGlzcF9udW1iZXIgPSAwOwotICAgICAgaW50IGJ1ZmZlcl9wb3NuID0gMTsKLSAgICAgIGluZF9hZGRyX3R5cGUgKmluZF9hZGRyX29wOwotICAgICAgZGVidWcgKCJGb3VuZCBpbmRpcmVjdCByZWZlcmVuY2VcbiIpOwotICAgICAgaW5kX2J1ZmZlclswXSA9ICp0b2tlbjsKLSAgICAgIGZvciAoY291bnQgPSAxOyBjb3VudCA8IHN0cmxlbiAodG9rZW4pOyBjb3VudCsrKQotCXsJCQkvKiBTdHJpcCBvcGVyYW5kICovCi0JICBpbmRfYnVmZmVyW2J1ZmZlcl9wb3NuXSA9IHRvbG93ZXIgKCoodG9rZW4gKyBjb3VudCkpOwotCSAgaWYgKCgqKHRva2VuICsgY291bnQgLSAxKSA9PSAnYScgfHwgKih0b2tlbiArIGNvdW50IC0gMSkgPT0gJ0EnKSAmJgotCSAgICAgICgqKHRva2VuICsgY291bnQpID09ICdyJyB8fCAqKHRva2VuICsgY291bnQpID09ICdSJykpCi0JICAgIHsKLQkgICAgICAvKiBBUiByZWZlcmVuY2UgaXMgZm91bmQsIHNvIGdldCBpdHMgbnVtYmVyIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYnVmZmVyCi0JICAgICAgICAgc28gaXQgY2FuIHBhc3MgdGhyb3VnaCBoYXNoX2ZpbmQoKSAqLwotCSAgICAgIGlmIChmb3VuZF9hcikKLQkJewotCQkgIGFzX2JhZCAoIk1vcmUgdGhhbiBvbmUgQVIgcmVnaXN0ZXIgZm91bmQgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JCSAgcmV0dXJuIE5VTEw7Ci0JCX0KLQkgICAgICBpZiAoKih0b2tlbiArIGNvdW50ICsgMSkgPCAnMCcgfHwgKih0b2tlbiArIGNvdW50ICsgMSkgPiAnNycpCi0JCXsKLQkJICBhc19iYWQgKCJJbGxlZ2FsIEFSIHJlZ2lzdGVyIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCQkgIHJldHVybiBOVUxMOwotCQl9Ci0JICAgICAgYXJfbnVtYmVyID0gKih0b2tlbiArIGNvdW50ICsgMSkgLSAnMCc7Ci0JICAgICAgZm91bmRfYXIgPSAxOwotCSAgICAgIGNvdW50Kys7Ci0JICAgIH0KLQkgIGlmICgqKHRva2VuICsgY291bnQpID09ICcoJykKLQkgICAgewotCSAgICAgIC8qIFBhcmVudGhlc2lzIGZvdW5kLCBzbyBjaGVjayBpZiBhIGRpc3BsYWNlbWVudCB2YWx1ZSBpcyBpbnNpZGUuICBJZiBzbywgZ2V0Ci0JICAgICAgICAgdGhlIHZhbHVlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYnVmZmVyLiAqLwotCSAgICAgIGlmIChpc19kaWdpdF9jaGFyICgqKHRva2VuICsgY291bnQgKyAxKSkpCi0JCXsKLQkJICBjaGFyIGRpc3BbMTBdOwotCQkgIGludCBkaXNwX3Bvc24gPSAwOwotCi0JCSAgaWYgKGZvdW5kX2Rpc3ApCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoIk1vcmUgdGhhbiBvbmUgZGlzcGxhY2VtZW50IGZvdW5kIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCQkgICAgICByZXR1cm4gTlVMTDsKLQkJICAgIH0KLQkJICBjb3VudCsrOwotCQkgIHdoaWxlICgqKHRva2VuICsgY291bnQpICE9ICcpJykKLQkJICAgIHsKLQkJICAgICAgaWYgKCFpc19kaWdpdF9jaGFyICgqKHRva2VuICsgY291bnQpKSkKLQkJCXsKLQkJCSAgYXNfYmFkICgiSW52YWxpZCBkaXNwbGFjZW1lbnQgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JCQkgIHJldHVybiBOVUxMOwotCQkJfQotCQkgICAgICBkaXNwW2Rpc3BfcG9zbisrXSA9ICoodG9rZW4gKyAoY291bnQrKykpOwotCQkgICAgfQotCQkgIGRpc3BbZGlzcF9wb3NuXSA9ICdcMCc7Ci0JCSAgZGlzcF9udW1iZXIgPSBhdG9pIChkaXNwKTsKLQkJICBjb3VudC0tOwotCQkgIGZvdW5kX2Rpc3AgPSAxOwotCQl9Ci0JICAgIH0KLQkgIGJ1ZmZlcl9wb3NuKys7Ci0JfQotICAgICAgaW5kX2J1ZmZlcltidWZmZXJfcG9zbl0gPSAnXDAnOwotICAgICAgaWYgKCFmb3VuZF9hcikKLQl7Ci0JICBhc19iYWQgKCJBUiByZWdpc3RlciBub3QgZm91bmQgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBpbmRfYWRkcl9vcCA9IChpbmRfYWRkcl90eXBlICopIGhhc2hfZmluZCAoaW5kX2hhc2gsIGluZF9idWZmZXIpOwotICAgICAgaWYgKGluZF9hZGRyX29wKQotCXsKLQkgIGRlYnVnICgiRm91bmQgaW5kaXJlY3QgcmVmZXJlbmNlOiAlc1xuIiwgaW5kX2FkZHJfb3AtPnN5bnRheCk7Ci0JICBpZiAoaW5kX2FkZHJfb3AtPmRpc3BsYWNlbWVudCA9PSBJTVBMSUVEX0RJU1ApCi0JICAgIHsKLQkgICAgICBmb3VuZF9kaXNwID0gMTsKLQkgICAgICBkaXNwX251bWJlciA9IDE7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChpbmRfYWRkcl9vcC0+ZGlzcGxhY2VtZW50ID09IERJU1BfUkVRVUlSRUQpICYmICFmb3VuZF9kaXNwKQotCSAgICB7Ci0JICAgICAgLyogTWF5YmUgYW4gaW1wbGllZCBkaXNwbGFjZW1lbnQgb2YgMSBhZ2FpbiAqLwotCSAgICAgIGFzX2JhZCAoInJlcXVpcmVkIGRpc3BsYWNlbWVudCB3YXNuJ3QgZ2l2ZW4gaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkICgiaWxsZWdhbCBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGlmIChmb3VuZF9kaXNwICYmIChkaXNwX251bWJlciA8IDAgfHwgZGlzcF9udW1iZXIgPiAyNTUpKQotCXsKLQkgIGFzX2JhZCAoImRpc3BsYWNlbWVudCBtdXN0IGJlIGFuIHVuc2lnbmVkIDgtYml0IG51bWJlciIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgY3VycmVudF9vcC0+aW5kaXJlY3QubW9kID0gaW5kX2FkZHJfb3AtPm1vZGZpZWxkOwotICAgICAgY3VycmVudF9vcC0+aW5kaXJlY3QuZGlzcCA9IGRpc3BfbnVtYmVyOwotICAgICAgY3VycmVudF9vcC0+aW5kaXJlY3QuQVJudW0gPSBhcl9udW1iZXI7Ci0gICAgICBjdXJyZW50X29wLT5vcF90eXBlID0gSW5kaXJlY3Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVnICpyZWdvcCA9IChyZWcgKikgaGFzaF9maW5kIChyZWdfaGFzaCwgdG9rZW4pOwotICAgICAgaWYgKHJlZ29wKQotCXsKLQkgIGRlYnVnICgiRm91bmQgcmVnaXN0ZXIgb3BlcmFuZDogJXNcbiIsIHJlZ29wLT5uYW1lKTsKLQkgIGlmIChyZWdvcC0+cmVndHlwZSA9PSBSRUdfQVJuKQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlID0gQVJuOwotCSAgZWxzZSBpZiAocmVnb3AtPnJlZ3R5cGUgPT0gUkVHX1JuKQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlID0gUm47Ci0JICBlbHNlIGlmIChyZWdvcC0+cmVndHlwZSA9PSBSRUdfRFApCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBEUFJlZzsKLQkgIGVsc2UKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IE90aGVyUmVnOwotCSAgY3VycmVudF9vcC0+cmVnLm9wY29kZSA9IHJlZ29wLT5vcGNvZGU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghaXNfZGlnaXRfY2hhciAoKnRva2VuKSB8fCAqKHRva2VuICsgMSkgPT0gJ3gnIHx8IHN0cmNociAodG9rZW4sICdoJykpCi0JICAgIHsKLQkgICAgICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBzZWdUIHJldHZhbDsKLQkgICAgICBkZWJ1ZyAoIlByb2JhYmx5IGEgbGFiZWw6ICVzXG4iLCB0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKHRva2VuKSArIDEpOwotCSAgICAgIHN0cmNweSAoY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsLCB0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsW3N0cmxlbiAodG9rZW4pXSA9ICdcMCc7Ci0JICAgICAgc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdG9rZW47Ci0JICAgICAgZGVidWcgKCJDdXJyZW50IGlucHV0X2xpbmVfcG9pbnRlcjogJXNcbiIsIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICAgICAgcmV0dmFsID0gZXhwcmVzc2lvbiAoJmN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwcik7Ci0JICAgICAgZGVidWcgKCJFeHByZXNzaW9uIHR5cGU6ICVkXG4iLCBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9vcCk7Ci0JICAgICAgZGVidWcgKCJFeHByZXNzaW9uIGFkZG51bTogJWRcbiIsIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCSAgICAgIGRlYnVnICgiU2VnbWVudDogJWRcbiIsIHJldHZhbCk7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaWYgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBjdXJyZW50X29wLT5pbW1lZGlhdGUuc19udW1iZXIgPSBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCQkgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS51X251bWJlciA9ICh1bnNpZ25lZCBpbnQpIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnJlc29sdmVkID0gMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjb3VudDsKLQkgICAgICBkZWJ1ZyAoIkZvdW5kIGEgbnVtYmVyIG9yIGRpc3BsYWNlbWVudFxuIik7Ci0JICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc3RybGVuICh0b2tlbik7IGNvdW50KyspCi0JCWlmICgqKHRva2VuICsgY291bnQpID09ICcuJykKLQkJICBjdXJyZW50X29wLT5pbW1lZGlhdGUuZGVjaW1hbF9mb3VuZCA9IDE7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKHRva2VuKSArIDEpOwotCSAgICAgIHN0cmNweSAoY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsLCB0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsW3N0cmxlbiAodG9rZW4pXSA9ICdcMCc7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmZfbnVtYmVyID0gKGZsb2F0KSBhdG9mICh0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnNfbnVtYmVyID0gKGludCkgYXRvaSAodG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS51X251bWJlciA9ICh1bnNpZ25lZCBpbnQpIGF0b2kgKHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUucmVzb2x2ZWQgPSAxOwotCSAgICB9Ci0JICBjdXJyZW50X29wLT5vcF90eXBlID0gRGlzcCB8IEFiczI0IHwgSW1tMTYgfCBJbW0yNDsKLQkgIGlmIChjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPj0gMCAmJiBjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPD0gMzEpCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgfD0gSVZlY3RvcjsKLQl9Ci0gICAgfQotICByZXR1cm4gY3VycmVudF9vcDsKLX0KLQotLyogbmV4dF9saW5lIHBvaW50cyB0byB0aGUgbmV4dCBsaW5lIGFmdGVyIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIChjdXJyZW50X2xpbmUpLgotICAgU2VhcmNoIGZvciB0aGUgcGFyYWxsZWwgYmFycywgYW5kIGlmIGZvdW5kLCBtZXJnZSB0d28gbGluZXMgaW50byBpbnRlcm5hbCBzeW50YXgKLSAgIGZvciBhIHBhcmFsbGVsIGluc3RydWN0aW9uOgotICAgcV9bSU5TTjFdX1tJTlNOMl0gW09QRVJBTkRTMV0gfCBbT1BFUkFORFMyXQotICAgQnkgdGhpcyBzdGFnZSwgYWxsIGNvbW1lbnRzIGFyZSBzY3J1YmJlZCwgYW5kIG9ubHkgdGhlIGJhcmUgbGluZXMgYXJlIGdpdmVuLgotICovCi0KLSNkZWZpbmUgTk9ORSAgICAgICAgICAgMAotI2RlZmluZSBTVEFSVF9PUENPREUgICAxCi0jZGVmaW5lIEVORF9PUENPREUgICAgIDIKLSNkZWZpbmUgU1RBUlRfT1BFUkFORFMgMwotI2RlZmluZSBFTkRfT1BFUkFORFMgICA0Ci0KLWNoYXIgKgotdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuIChjdXJyZW50X2xpbmUsIG5leHRfbGluZSkKLSAgICAgY2hhciAqY3VycmVudF9saW5lOwotICAgICBjaGFyICpuZXh0X2xpbmU7Ci17Ci0gIGludCBmb3VuZF9wYXJhbGxlbCA9IDA7Ci0gIGNoYXIgZmlyc3Rfb3Bjb2RlWzI1Nl07Ci0gIGNoYXIgc2Vjb25kX29wY29kZVsyNTZdOwotICBjaGFyIGZpcnN0X29wZXJhbmRzWzI1Nl07Ci0gIGNoYXIgc2Vjb25kX29wZXJhbmRzWzI1Nl07Ci0gIGNoYXIgKnBhcmFsbGVsX2luc247Ci0KLSAgZGVidWcgKCJJbiB0aWMzMF9maW5kX3BhcmFsbGVsX2luc24oKVxuIik7Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKGludCkgKm5leHRfbGluZV0pCi0gICAgewotICAgICAgaWYgKCpuZXh0X2xpbmUgPT0gUEFSQUxMRUxfU0VQQVJBVE9SICYmICoobmV4dF9saW5lICsgMSkgPT0gUEFSQUxMRUxfU0VQQVJBVE9SKQotCXsKLQkgIGZvdW5kX3BhcmFsbGVsID0gMTsKLQkgIG5leHRfbGluZSsrOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbmV4dF9saW5lKys7Ci0gICAgfQotICBpZiAoIWZvdW5kX3BhcmFsbGVsKQotICAgIHJldHVybiBOVUxMOwotICBkZWJ1ZyAoIkZvdW5kIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25cbiIpOwotICB7Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqb3Bjb2RlLCAqb3BlcmFuZHMsICpsaW5lOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgIHsKLQlpZiAoaSA9PSAwKQotCSAgewotCSAgICBvcGNvZGUgPSAmZmlyc3Rfb3Bjb2RlWzBdOwotCSAgICBvcGVyYW5kcyA9ICZmaXJzdF9vcGVyYW5kc1swXTsKLQkgICAgbGluZSA9IGN1cnJlbnRfbGluZTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIG9wY29kZSA9ICZzZWNvbmRfb3Bjb2RlWzBdOwotCSAgICBvcGVyYW5kcyA9ICZzZWNvbmRfb3BlcmFuZHNbMF07Ci0JICAgIGxpbmUgPSBuZXh0X2xpbmU7Ci0JICB9Ci0JewotCSAgaW50IHNlYXJjaF9zdGF0dXMgPSBOT05FOwotCSAgaW50IGNoYXJfcHRyID0gMDsKLQkgIGNoYXIgYzsKLQotCSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsoaW50KSAoYyA9ICpsaW5lKV0gJiYgKmxpbmUpCi0JICAgIHsKLQkgICAgICBpZiAoaXNfb3Bjb2RlX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gTk9ORSkKLQkJewotCQkgIG9wY29kZVtjaGFyX3B0cisrXSA9IHRvbG93ZXIgKGMpOwotCQkgIHNlYXJjaF9zdGF0dXMgPSBTVEFSVF9PUENPREU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc19vcGNvZGVfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBTVEFSVF9PUENPREUpCi0JCXsKLQkJICBvcGNvZGVbY2hhcl9wdHIrK10gPSB0b2xvd2VyIChjKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCFpc19vcGNvZGVfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBTVEFSVF9PUENPREUpCi0JCXsKLQkJICBvcGNvZGVbY2hhcl9wdHJdID0gJ1wwJzsKLQkJICBjaGFyX3B0ciA9IDA7Ci0JCSAgc2VhcmNoX3N0YXR1cyA9IEVORF9PUENPREU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc19vcGVyYW5kX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gU1RBUlRfT1BFUkFORFMpCi0JCXsKLQkJICBvcGVyYW5kc1tjaGFyX3B0cisrXSA9IGM7Ci0JCX0KLQkgICAgICBpZiAoaXNfb3BlcmFuZF9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IEVORF9PUENPREUpCi0JCXsKLQkJICBvcGVyYW5kc1tjaGFyX3B0cisrXSA9IGM7Ci0JCSAgc2VhcmNoX3N0YXR1cyA9IFNUQVJUX09QRVJBTkRTOwotCQl9Ci0JICAgICAgbGluZSsrOwotCSAgICB9Ci0JICBpZiAoc2VhcmNoX3N0YXR1cyAhPSBTVEFSVF9PUEVSQU5EUykKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICBvcGVyYW5kc1tjaGFyX3B0cl0gPSAnXDAnOwotCX0KLSAgICAgIH0KLSAgfQotICBwYXJhbGxlbF9pbnNuID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKGZpcnN0X29wY29kZSkgKyBzdHJsZW4gKGZpcnN0X29wZXJhbmRzKSArCi0JCSAgICAgc3RybGVuIChzZWNvbmRfb3Bjb2RlKSArIHN0cmxlbiAoc2Vjb25kX29wZXJhbmRzKSArIDgpOwotICBzcHJpbnRmIChwYXJhbGxlbF9pbnNuLCAicV8lc18lcyAlcyB8ICVzIiwgZmlyc3Rfb3Bjb2RlLCBzZWNvbmRfb3Bjb2RlLCBmaXJzdF9vcGVyYW5kcywgc2Vjb25kX29wZXJhbmRzKTsKLSAgZGVidWcgKCJwYXJhbGxlbCBpbnNuID0gJXNcbiIsIHBhcmFsbGVsX2luc24pOwotICByZXR1cm4gcGFyYWxsZWxfaW5zbjsKLX0KLQotI3VuZGVmIE5PTkUKLSN1bmRlZiBTVEFSVF9PUENPREUKLSN1bmRlZiBFTkRfT1BDT0RFCi0jdW5kZWYgU1RBUlRfT1BFUkFORFMKLSN1bmRlZiBFTkRfT1BFUkFORFMKLQotLyogSW4gb3JkZXIgdG8gZ2V0IGdhcyB0byBpZ25vcmUgYW55IHwgY2hhcnMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSwKLSAgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGEgfCBpcyBmb3VuZCBpbiBhIGxpbmUuICovCi0KLWludAotdGljMzBfdW5yZWNvZ25pemVkX2xpbmUgKGMpCi0gICAgIGludCBjOwotewotICBkZWJ1ZyAoIkluIHRjX3VucmVjb2duaXplZF9saW5lXG4iKTsKLSAgcmV0dXJuIChjID09IFBBUkFMTEVMX1NFUEFSQVRPUik7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgZGVidWcgKCJJbiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWdUIHNlYzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBkZWJ1ZyAoIkluIG1kX2NvbnZlcnRfZnJhZygpXG4iKTsKLX0KLQotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbFApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsUDsKLXsKLSAgdmFsdWVUIHZhbHVlID0gKnZhbFA7Ci0KLSAgZGVidWcgKCJJbiBtZF9hcHBseV9maXgoKSB3aXRoIHZhbHVlID0gJWxkXG4iLCAobG9uZykgdmFsdWUpOwotICBkZWJ1ZyAoIlZhbHVlcyBpbiBmaXhQXG4iKTsKLSAgZGVidWcgKCJmeF9zaXplID0gJWRcbiIsIGZpeFAtPmZ4X3NpemUpOwotICBkZWJ1ZyAoImZ4X3BjcmVsID0gJWRcbiIsIGZpeFAtPmZ4X3BjcmVsKTsKLSAgZGVidWcgKCJmeF93aGVyZSA9ICVkXG4iLCBmaXhQLT5meF93aGVyZSk7Ci0gIGRlYnVnICgiZnhfb2Zmc2V0ID0gJWRcbiIsIChpbnQpIGZpeFAtPmZ4X29mZnNldCk7Ci0gIHsKLSAgICBjaGFyICpidWYgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgdmFsdWUgLz0gSU5TTl9TSVpFOwotICAgIGlmIChmaXhQLT5meF9zaXplID09IDEpCi0gICAgICB7CQkJCS8qIFNwZWNpYWwgZml4IGZvciBMRFAgaW5zdHJ1Y3Rpb24uICovCi0JdmFsdWUgPSAodmFsdWUgJiAweDAwRkYwMDAwKSA+PiAxNjsKLSAgICAgIH0KLSAgICBkZWJ1ZyAoIm5ldyB2YWx1ZSA9ICVsZFxuIiwgKGxvbmcpIHZhbHVlKTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIGZpeFAtPmZ4X3NpemUpOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBpbnQgaTsKLQotICBkZWJ1ZyAoIkluIG1kX3BhcnNlX29wdGlvbigpXG4iKTsKLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlY1xuIiwgYXJnW2NdKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZGVidWcgKCJJbiBtZF9zaG93X3VzYWdlKClcbiIpOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGRlYnVnICgiSW4gbWRfdW5kZWZpbmVkX3N5bWJvbCgpXG4iKTsKLSAgcmV0dXJuIChzeW1ib2xTICopIDA7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgZGVidWcgKCJJbiBtZF9zZWN0aW9uX2FsaWduKCkgc2VnbWVudCA9ICVkIGFuZCBzaXplID0gJWRcbiIsIHNlZ21lbnQsIHNpemUpOwotICBzaXplID0gKHNpemUgKyAzKSAvIDQ7Ci0gIHNpemUgKj0gNDsKLSAgZGVidWcgKCJOZXcgc2l6ZSB2YWx1ZSA9ICVkXG4iLCBzaXplKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGludCBvZmZzZXQ7Ci0KLSAgZGVidWcgKCJJbiBtZF9wY3JlbF9mcm9tKClcbiIpOwotICBkZWJ1ZyAoImZ4X3doZXJlID0gJWRcbiIsIGZpeFAtPmZ4X3doZXJlKTsKLSAgZGVidWcgKCJmeF9zaXplID0gJWRcbiIsIGZpeFAtPmZ4X3NpemUpOwotICAvKiBGaW5kIHRoZSBvcGNvZGUgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGluIHRoZSBmcl9saXRlcmFsCi0gICAgIHN0b3JhZ2UgYXJlYSwgYW5kIGNoZWNrIGJpdCAyMS4gIEJpdCAyMSBjb250YWlucyB3aGV0aGVyIHRoZSBjdXJyZW50IGluc3RydWN0aW9uCi0gICAgIGlzIGEgZGVsYXllZCBvbmUgb3Igbm90LCBhbmQgdGhlbiBzZXQgdGhlIG9mZnNldCB2YWx1ZSBhcHByb3ByaWF0ZWx5LiAqLwotICBpZiAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbFtmaXhQLT5meF93aGVyZSAtIGZpeFAtPmZ4X3NpemUgKyAxXSAmIDB4MjApCi0gICAgb2Zmc2V0ID0gMzsKLSAgZWxzZQotICAgIG9mZnNldCA9IDE7Ci0gIGRlYnVnICgib2Zmc2V0ID0gJWRcbiIsIG9mZnNldCk7Ci0gIC8qIFBDIFJlbGF0aXZlIGluc3RydWN0aW9ucyBoYXZlIGEgZm9ybWF0OgotICAgICBkaXNwbGFjZW1lbnQgPSBMYWJlbCAtIChQQyArIG9mZnNldCkKLSAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIFBDICsgb2Zmc2V0IHdoZXJlOgotICAgICBmeF93aGVyZSAtIGZ4X3NpemUgPSBQQwotICAgICBJTlNOX1NJWkUgKiBvZmZzZXQgPSBvZmZzZXQgbnVtYmVyIG9mIGluc3RydWN0aW9ucwotICAgKi8KLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlIC0gZml4UC0+Znhfc2l6ZSArIChJTlNOX1NJWkUgKiBvZmZzZXQpOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHdoYXRfc3RhdGVtZW50X3R5cGUsIGxpdGVyYWxQLCBzaXplUCkKLSAgICAgaW50IHdoYXRfc3RhdGVtZW50X3R5cGU7Ci0gICAgIGNoYXIgKmxpdGVyYWxQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgY2hhciAqdG9rZW47Ci0gIGNoYXIga2VlcHZhbDsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgLyogIGNoYXIgKmF0b2ZfaWVlZSAoKTsgKi8KLSAgZmxvYXQgZmxvYXRfdmFsdWU7Ci0gIGRlYnVnICgiSW4gbWRfYXRvZigpXG4iKTsKLSAgZGVidWcgKCJwcmVjaXNpb24gPSAlY1xuIiwgd2hhdF9zdGF0ZW1lbnRfdHlwZSk7Ci0gIGRlYnVnICgibGl0ZXJhbCA9ICVzXG4iLCBsaXRlcmFsUCk7Ci0gIGRlYnVnICgibGluZSA9ICIpOwotICB0b2tlbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQpICppbnB1dF9saW5lX3BvaW50ZXJdICYmICgqaW5wdXRfbGluZV9wb2ludGVyKSAmJiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpKQotICAgIHsKLSAgICAgIGRlYnVnICgiJWMiLCAqaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAga2VlcHZhbCA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotICBkZWJ1ZyAoIlxuIik7Ci0gIGZsb2F0X3ZhbHVlID0gKGZsb2F0KSBhdG9mICh0b2tlbik7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBrZWVwdmFsOwotICBkZWJ1ZyAoImZsb2F0X3ZhbHVlID0gJWZcbiIsIGZsb2F0X3ZhbHVlKTsKLSAgc3dpdGNoICh3aGF0X3N0YXRlbWVudF90eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiAiQmFkIGNhbGwgdG8gTURfQVRPRigpIjsKLSAgICB9Ci0gIGlmIChmbG9hdF92YWx1ZSA9PSAwLjApCi0gICAgewotICAgICAgdmFsdWUgPSAocHJlYyA9PSAyKSA/IDB4MDAwMDgwMDBMIDogMHg4MDAwMDAwMEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBleHAsIHNpZ24sIG1hbnQsIHRtc2Zsb2F0OwotICAgICAgdG1zZmxvYXQgPSAqKChsb25nICopICZmbG9hdF92YWx1ZSk7Ci0gICAgICBzaWduID0gdG1zZmxvYXQgJiAweDgwMDAwMDAwOwotICAgICAgbWFudCA9IHRtc2Zsb2F0ICYgMHgwMDdGRkZGRjsKLSAgICAgIGV4cCA9IHRtc2Zsb2F0ICYgMHg3RjgwMDAwMDsKLSAgICAgIGV4cCA8PD0gMTsKLSAgICAgIGlmIChleHAgPT0gMHhGRjAwMDAwMCkKLQl7Ci0JICBpZiAobWFudCA9PSAwKQotCSAgICB2YWx1ZSA9IDB4N0Y3RkZGRkY7Ci0JICBlbHNlIGlmIChzaWduID09IDApCi0JICAgIHZhbHVlID0gMHg3RjdGRkZGRjsKLQkgIGVsc2UKLQkgICAgdmFsdWUgPSAweDdGODAwMDAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHAgLT0gMHg3RjAwMDAwMDsKLQkgIGlmIChzaWduKQotCSAgICB7Ci0JICAgICAgbWFudCA9IG1hbnQgJiAweDAwN0ZGRkZGOwotCSAgICAgIG1hbnQgPSAtbWFudDsKLQkgICAgICBtYW50ID0gbWFudCAmIDB4MDBGRkZGRkY7Ci0JICAgICAgaWYgKG1hbnQgPT0gMCkKLQkJewotCQkgIG1hbnQgfD0gMHgwMDgwMDAwMDsKLQkJICBleHAgPSAobG9uZykgZXhwIC0gMHgwMTAwMDAwMDsKLQkJfQotCSAgICB9Ci0JICB0bXNmbG9hdCA9IGV4cCB8IG1hbnQ7Ci0JICB2YWx1ZSA9IHRtc2Zsb2F0OwotCX0KLSAgICAgIGlmIChwcmVjID09IDIpCi0JewotCSAgbG9uZyBleHAsIG1hbnQ7Ci0KLQkgIGlmICh0bXNmbG9hdCA9PSAweDgwMDAwMDAwKQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSAweDgwMDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHZhbHVlID0gMDsKLQkgICAgICBleHAgPSAodG1zZmxvYXQgJiAweEZGMDAwMDAwKTsKLQkgICAgICBleHAgPj49IDI0OwotCSAgICAgIG1hbnQgPSB0bXNmbG9hdCAmIDB4MDA3RkZGRkY7Ci0JICAgICAgaWYgKHRtc2Zsb2F0ICYgMHgwMDgwMDAwMCkKLQkJewotCQkgIG1hbnQgfD0gMHhGRjAwMDAwMDsKLQkJICBtYW50ICs9IDB4MDAwMDA4MDA7Ci0JCSAgbWFudCA+Pj0gMTI7Ci0JCSAgbWFudCB8PSAweDAwMDAwODAwOwotCQkgIG1hbnQgJj0gMHgwRkZGOwotCQkgIGlmIChleHAgPiA3KQotCQkgICAgdmFsdWUgPSAweDc4MDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBtYW50IHw9IDB4MDA4MDAwMDA7Ci0JCSAgbWFudCArPSAweDAwMDAwODAwOwotCQkgIGV4cCArPSAobWFudCA+PiAyNCk7Ci0JCSAgbWFudCA+Pj0gMTI7Ci0JCSAgbWFudCAmPSAweDA3RkY7Ci0JCSAgaWYgKGV4cCA+IDcpCi0JCSAgICB2YWx1ZSA9IDB4NzdGRjsKLQkJfQotCSAgICAgIGlmIChleHAgPCAtOCkKLQkJdmFsdWUgPSAweDgwMDA7Ci0JICAgICAgaWYgKHZhbHVlID09IDApCi0JCXsKLQkJICBtYW50ID0gKGV4cCA8PCAxMikgfCBtYW50OwotCQkgIHZhbHVlID0gbWFudCAmIDB4RkZGRjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRlcmFsUCwgdmFsdWUsIHByZWMpOwotICAqc2l6ZVAgPSBwcmVjOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgZGVidWcgKCJJbiBtZF9udW1iZXJfdG9fY2hhcnMoKVxuIik7Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgLyogIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4oYnVmLHZhbCxuKTsgKi8KLX0KLQotI2RlZmluZSBGKFNaLFBDUkVMKQkJKCgoU1opIDw8IDEpICsgKFBDUkVMKSkKLSNkZWZpbmUgTUFQKFNaLFBDUkVMLFRZUEUpCWNhc2UgRihTWixQQ1JFTCk6IGNvZGUgPSAoVFlQRSk7IGJyZWFrCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYXJlbGVudCAqcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSA9IDA7Ci0KLSAgZGVidWcgKCJJbiB0Y19nZW5fcmVsb2MoKVxuIik7Ci0gIGRlYnVnICgiZml4UC5zaXplID0gJWRcbiIsIGZpeFAtPmZ4X3NpemUpOwotICBkZWJ1ZyAoImZpeFAucGNyZWwgPSAlZFxuIiwgZml4UC0+ZnhfcGNyZWwpOwotICBkZWJ1ZyAoImFkZHN5Lm5hbWUgPSAlc1xuIiwgU19HRVRfTkFNRSAoZml4UC0+ZnhfYWRkc3kpKTsKLSAgc3dpdGNoIChGIChmaXhQLT5meF9zaXplLCBmaXhQLT5meF9wY3JlbCkpCi0gICAgewotICAgICAgTUFQICgxLCAwLCBCRkRfUkVMT0NfVElDMzBfTERQKTsKLSAgICAgIE1BUCAoMiwgMCwgQkZEX1JFTE9DXzE2KTsKLSAgICAgIE1BUCAoMywgMCwgQkZEX1JFTE9DXzI0KTsKLSAgICAgIE1BUCAoMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIE1BUCAoNCwgMCwgQkZEX1JFTE9DXzMyKTsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkICgiQ2FuIG5vdCBkbyAlZCBieXRlICVzcmVsb2NhdGlvbiIsIGZpeFAtPmZ4X3NpemUsCi0JICAgICAgZml4UC0+ZnhfcGNyZWwgPyAicGMtcmVsYXRpdmUgIiA6ICIiKTsKLSAgICB9Ci0jdW5kZWYgTUFQCi0jdW5kZWYgRgotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICBhc3NlcnQgKHJlbCAhPSAwKTsKLSAgcmVsLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhQLT5meF9hZGRzeSk7Ci0gIHJlbC0+YWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKLSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHJlbC0+YWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsLT5hZGRlbmQgPSAwOwotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAoIXJlbC0+aG93dG8pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIG5hbWUgPSBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCW5hbWUgPSAiPHVua25vd24+IjsKLSAgICAgIGFzX2ZhdGFsICgiQ2Fubm90IGdlbmVyYXRlIHJlbG9jYXRpb24gdHlwZSBmb3Igc3ltYm9sICVzLCBjb2RlICVzIiwgbmFtZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICB9Ci0gIHJldHVybiByZWw7Ci19Ci0KLXZvaWQKLXRjX2FvdXRfcHJlX3dyaXRlX2hvb2sgKCkKLXsKLSAgZGVidWcgKCJJbiB0Y19hb3V0X3ByZV93cml0ZV9ob29rKClcbiIpOwotfQotCi12b2lkCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBkZWJ1ZyAoIkluIG1kX29wZXJhbmQoKVxuIik7Ci19Ci0KLWNoYXIgb3V0cHV0X2ludmFsaWRfYnVmWzhdOwotCi1jaGFyICoKLW91dHB1dF9pbnZhbGlkIChjKQotICAgICBjaGFyIGM7Ci17Ci0gIGlmIChpc3ByaW50IChjKSkKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICInJWMnIiwgYyk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICIoMHgleCkiLCAodW5zaWduZWQpIGMpOwotICByZXR1cm4gb3V0cHV0X2ludmFsaWRfYnVmOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5oIGIvZ2FzL2NvbmZpZy90Yy10aWMzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTcyZDJlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGljMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIHRjLXRpYzMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXRpYzMwLmMKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9UQ19USUMzMF9IXwotI2RlZmluZSBfVENfVElDMzBfSF8KLQotI2RlZmluZSBUQ19USUMzMCAxCi0KLSNpZmRlZiBPQkpfQU9VVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC10aWMzMCIKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9BUkNICQliZmRfYXJjaF90aWMzMAotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkxCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi1jaGFyICpvdXRwdXRfaW52YWxpZCBQQVJBTVMgKChpbnQgYykpOwotCi0jZGVmaW5lIEVORF9PRl9JTlNOICdcMCcKLSNkZWZpbmUgTUFYX09QRVJBTkRTIDYKLSNkZWZpbmUgRElSRUNUX1JFRkVSRU5DRSAnQCcKLSNkZWZpbmUgSU5ESVJFQ1RfUkVGRVJFTkNFICcqJwotI2RlZmluZSBQQVJBTExFTF9TRVBBUkFUT1IgJ3wnCi0jZGVmaW5lIElOU05fU0laRSA0Ci0KLS8qIERlZmluZSB0aGlzIHRvIDEgaWYgeW91IHdhbnQgdGhlIGRlYnVnIG91dHB1dCB0byBiZSBvbiBzdGRvdXQsCi0gICBvdGhlcndpc2Ugc3RkZXJyIHdpbGwgYmUgdXNlZC4gIElmIHN0ZGVyciBpcyB1c2VkLCB0aGVyZSB3aWxsIGJlIGEKLSAgIGJldHRlciBzeW5jaHJvbmlzYXRpb24gd2l0aCB0aGUgYXNfYmFkIG91dHB1dHMsIGJ1dCB5b3UgY2FuJ3QKLSAgIGNhcHR1cmUgdGhlIG91dHB1dC4gKi8KLSNkZWZpbmUgVVNFX1NURE9VVCAwCi0KLSNkZWZpbmUgdGNfdW5yZWNvZ25pemVkX2xpbmUgdGljMzBfdW5yZWNvZ25pemVkX2xpbmUKLQotZXh0ZXJuIGludCB0aWMzMF91bnJlY29nbml6ZWRfbGluZSBQQVJBTVMgKChpbnQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzgwLmMgYi9nYXMvY29uZmlnL3RjLXRpYzgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMWRiYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MSArMCwwIEBACi0vKiB0Yy10aWM4MC5jIC0tIEFzc2VtYmxlIGZvciB0aGUgVEkgVE1TMzIwQzgwIChNVikKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzgwLmgiCi0KLSNkZWZpbmUgaW50ZXJuYWxfZXJyb3Iod2hhdCkgXAotICBhc19mYXRhbChfKCJpbnRlcm5hbCBlcnJvcjolczolZDogJXNcbiIpLF9fRklMRV9fLF9fTElORV9fLHdoYXQpCi0jZGVmaW5lIGludGVybmFsX2Vycm9yX2Eod2hhdCxhcmcpIFwKLSAgYXNfZmF0YWwoXygiaW50ZXJuYWwgZXJyb3I6JXM6JWQ6ICVzICVkXG4iKSxfX0ZJTEVfXyxfX0xJTkVfXyx3aGF0LGFyZykKLQotDAotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsqIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSBzaW5nbGUKLSAgIGxpbmUuIFRoZSBzZW1pY29sb24gaXMgc3VjaCBhIGNoYXJhY3RlciBieSBkZWZhdWx0IGFuZCBzaG91bGQgbm90IGJlCi0gICBleHBsaWNpdGx5IGxpc3RlZC4gKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGYxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRiI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0KLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIGludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uICovCi0KLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gKCk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgImFsaWduIiwJc19hbGlnbl9ieXRlcywJCTQgfSwJLyogRG8gYnl0ZSBhbGlnbm1lbnQsIGRlZmF1bHQgaXMgYSA0IGJ5dGUgYm91bmRhcnkgKi8KLSAgeyAid29yZCIsCWNvbnMsCQkJNCB9LAkvKiBGSVhNRTogU2hvdWxkIHRoaXMgYmUgbWFjaGluZSBpbmRlcGVuZGVudD8gKi8KLSAgeyAiYnNzIiwJc19sY29tbV9ieXRlcywJCTEgfSwKLSAgeyAic2VjdCIsCW9ial9jb2ZmX3NlY3Rpb24sCTB9LAkvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFRJIHRvb2xzICovCi0gIHsgInNlY3Rpb24iLAlvYmpfY29mZl9zZWN0aW9uLAkwfSwJLyogU3RhbmRhcmQgQ09GRiAuc2VjdGlvbiBwc2V1ZG8tb3AgKi8KLSAgeyBOVUxMLAlOVUxMLAkJCTAgfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRpYzgwX2hhc2g7Ci0KLXN0YXRpYyBzdHJ1Y3QgdGljODBfb3Bjb2RlICogZmluZF9vcGNvZGUgUEFSQU1TICgoc3RydWN0IHRpYzgwX29wY29kZSAqLCBleHByZXNzaW9uUyBbXSkpOwotc3RhdGljIHZvaWQgYnVpbGRfaW5zbiBQQVJBTVMgKChzdHJ1Y3QgdGljODBfb3Bjb2RlICosIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyBpbnQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKGV4cHJlc3Npb25TIGV4cFtdKSk7Ci1zdGF0aWMgaW50IGNvbnN0X292ZXJmbG93IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgYml0cywgaW50IGZsYWdzKSk7Ci0KLS8qIFJlcGxhY2Ugc2hvcnQgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIHdpdGggbG9uZyBmb3JtIHdoZW4gbmVjZXNzYXJ5LiAgQ3VycmVudGx5Ci0gICB0aGlzIGlzIG9mZiBieSBkZWZhdWx0IG9yIHdoZW4gZ2l2ZW4gdGhlIC1uby1yZWxheCBvcHRpb24uICBUdXJuaW5nIGl0IG9uIGJ5IHVzaW5nCi0gICB0aGUgLXJlbGF4IG9wdGlvbiBmb3JjZXMgYWxsIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyB0byB1c2UgdGhlIGxvbmcgZm9ybSwgd2hpY2gKLSAgIGlzIHdoeSBpdCBpcyBjdXJyZW50bHkgbm90IHRoZSBkZWZhdWx0LiAqLwotc3RhdGljIGludCB0aWM4MF9yZWxheCA9IDA7Ci0KLQwKLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIGludGVybmFsX2Vycm9yIChfKCJSZWxheGF0aW9uIGlzIGEgbHV4dXJ5IHdlIGNhbid0IGFmZm9yZCIpKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDQKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotICAKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mICgpIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAgIH0KLSAgCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgCi0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKiBDaGVjayB0byBzZWUgaWYgdGhlIGNvbnN0YW50IHZhbHVlIGluIE5VTSB3aWxsIGZpdCBpbiBhIGZpZWxkIG9mCi0gICB3aWR0aCBCSVRTIGlmIGl0IGhhcyBmbGFncyBGTEFHUy4gKi8KLQotc3RhdGljIGludAotY29uc3Rfb3ZlcmZsb3cgKG51bSwgYml0cywgZmxhZ3MpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnVtOwotICAgICBpbnQgYml0czsKLSAgICAgaW50IGZsYWdzOwotewotICBsb25nIG1pbiwgbWF4OwotICBpbnQgcmV0dmFsID0gMDsKLQotICAvKiBPbmx5IG5lZWQgdG8gY2hlY2sgZmllbGRzIGxlc3MgdGhhbiAzMiBiaXRzIHdpZGUgKi8KLSAgaWYgKGJpdHMgPCAzMikKLSAgICBpZiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NJR05FRCkKLSAgICAgIHsKLQltYXggPSAoMSA8PCAoYml0cyAtIDEpKSAtIDE7IAotCW1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7ICAKLQlyZXR2YWwgPSAoKGxvbmcpIG51bSA+IG1heCkgfHwgKChsb25nKSBudW0gPCBtaW4pOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQltYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0JbWluID0gMDsKLQlyZXR2YWwgPSAobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKTsKLSAgICAgIH0KLSAgcmV0dXJuIChyZXR2YWwpOwotfQotCi0vKiBnZXRfb3BlcmFuZHMoKSBwYXJzZXMgYSBzdHJpbmcgb2Ygb3BlcmFuZHMgYW5kIGZpbGxzIGluIGEgcGFzc2VkIGFycmF5IG9mCi0gICBleHByZXNzaW9ucyBpbiBFWFAuCi0KLSAgIE5vdGUgdGhhdCB3ZSB1c2UgT19hYnNlbnQgZXhwcmVzc2lvbnMgdG8gcmVjb3JkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgIGFib3V0IHRoZSBwcmV2aW91cyBub24tT19hYnNlbnQgZXhwcmVzc2lvbiwgc3VjaCBhcyAiOm0iIG9yICI6cyIKLSAgIG1vZGlmaWVycyBvciByZWdpc3RlciBudW1iZXJzIGVuY2xvc2VkIGluIHBhcmVucyBsaWtlICIocjEwKSIuCi0KLSAgIFJldHVybnMgdGhlIG51bWJlciBvZiBleHByZXNzaW9ucyB0aGF0IHdlcmUgcGxhY2VkIGluIEVYUC4KLQotICAgKi8KLQotc3RhdGljIGludAotZ2V0X29wZXJhbmRzIChleHApIAotICAgICBleHByZXNzaW9uUyBleHBbXTsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IG51bWV4cCA9IDA7Ci0gIGludCBtZmxhZyA9IDA7Ci0gIGludCBzZmxhZyA9IDA7Ci0gIGludCBwYXJlbnMgPSAwOwotCi0gIHdoaWxlICgqcCkgIAotICAgIHsKLSAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJywnKSAKLQl7Ci0JICBwKys7Ci0JfQotCi0gICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgb3BlcmFuZHMgbGVmdCB0byBwYXJzZSAqLwotICAgICAgaWYgKCpwID09IDAgfHwgKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInKSAKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICAKLSAgICAgIC8qIE5vdGljZSBzY2FsaW5nIG9yIGRpcmVjdCBtZW1vcnkgb3BlcmFuZCBtb2RpZmllcnMgYW5kIHNhdmUgdGhlbSBpbgotCSBhbiBPX2Fic2VudCBleHByZXNzaW9uIGFmdGVyIHRoZSBleHByZXNzaW9uIHRoYXQgdGhleSBtb2RpZnkuICovCi0KLSAgICAgIGlmICgqcCA9PSAnOicpIAotCXsKLQkgIHArKzsKLQkgIGV4cFtudW1leHBdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGlmICgqcCA9PSAnbScpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIC8qIFRoaXMgaXMgYSAiOm0iIG1vZGlmaWVyICovCi0JICAgICAgZXhwW251bWV4cF0uWF9hZGRfbnVtYmVyID0gVElDODBfT1BFUkFORF9NX1NJIHwgVElDODBfT1BFUkFORF9NX0xJOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcCA9PSAncycpCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgLyogVGhpcyBpcyBhICI6cyIgbW9kaWZpZXIgKi8KLQkgICAgICBleHBbbnVtZXhwXS5YX2FkZF9udW1iZXIgPSBUSUM4MF9PUEVSQU5EX1NDQUxFRDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCInOicgbm90IGZvbGxvd2VkIGJ5ICdtJyBvciAncyciKSk7Ci0JICAgIH0KLQkgIG51bWV4cCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBIYW5kbGUgbGVhZGluZyAnKCcgb24gb3BlcmFuZHMgdGhhdCB1c2UgdGhlbSwgYnkgcmVjb3JkaW5nIHRoYXQgd2UKLQkgaGF2ZSBlbnRlcmVkIGEgcGFyZW4gbmVzdGluZyBsZXZlbCBhbmQgdGhlbiBjb250aW51aW5nLiAgV2UgY29tcGxhaW4KLQkgYWJvdXQgbXVsdGlwbGUgbmVzdGluZy4gKi8KLQotICAgICAgaWYgKCpwID09ICcoJykKLQl7Ci0JICBpZiAoKytwYXJlbnMgIT0gMSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygicGFyZW4gbmVzdGluZyIpKTsKLQkgICAgfQotCSAgcCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBIYW5kbGUgdHJhaWxpbmcgJyknIG9uIG9wZXJhbmRzIHRoYXQgdXNlIHRoZW0sIGJ5IHJlZHVjaW5nIHRoZQotCSBuZXN0aW5nIGxldmVsIGFuZCB0aGVuIGNvbnRpbnVpbmcuICBXZSBjb21wbGFpbiBpZiB0aGVyZSB3ZXJlIHRvbwotCSBtYW55IGNsb3N1cmVzLiAqLwotCi0gICAgICBpZiAoKnAgPT0gJyknKSAKLQl7Ci0JICAvKiBSZWNvcmQgdGhhdCB3ZSBoYXZlIGxlZnQgYSBwYXJlbiBncm91cCBhbmQgY29udGludWUgKi8KLQkgIGlmICgtLXBhcmVucyA8IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIm1pc21hdGNoZWQgcGFyZW50aGVzaXMiKSk7Ci0JICAgIH0KLQkgIHArKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQmVnaW4gb3BlcmFuZCBwYXJzaW5nIGF0IHRoZSBjdXJyZW50IHNjYW4gcG9pbnQuICovCi0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgICBleHByZXNzaW9uICgmZXhwW251bWV4cF0pOwotCi0gICAgICBpZiAoZXhwW251bWV4cF0uWF9vcCA9PSBPX2lsbGVnYWwpCi0JewotCSAgYXNfYmFkIChfKCJpbGxlZ2FsIG9wZXJhbmQiKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwW251bWV4cF0uWF9vcCA9PSBPX2Fic2VudCkKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLQl9Ci0KLSAgICAgIG51bWV4cCsrOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgaWYgKHBhcmVucykKLSAgICB7Ci0gICAgICBleHBbbnVtZXhwXS5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBleHBbbnVtZXhwKytdLlhfYWRkX251bWJlciA9IFRJQzgwX09QRVJBTkRfUEFSRU5TOwotICAgIH0KLQotICAvKiBNYXJrIHRoZSBlbmQgb2YgdGhlIHZhbGlkIG9wZXJhbmRzIHdpdGggYW4gaWxsZWdhbCBleHByZXNzaW9uLiAqLwotICBleHBbbnVtZXhwXS5YX29wID0gT19pbGxlZ2FsOwotCi0gIHJldHVybiAobnVtZXhwKTsKLX0KLQotLyogZmluZF9vcGNvZGUoKSBnZXRzIGEgcG9pbnRlciB0byB0aGUgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSB0aGF0Ci0gICBtYXRjaGVzIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBhc3NlbWJsZWQsIG9yIHJldHVybnMgTlVMTCBpZiBubyBzdWNoIG1hdGNoCi0gICBpcyBmb3VuZC4KLQotICAgRmlyc3QgaXQgcGFyc2VzIGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucy4gIE5vdGUgdGhhdAotICAgd2UgdXNlIE9fYWJzZW50IGV4cHJlc3Npb25zIHRvIHJlY29yZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgcHJldmlvdXMgbm9uLU9fYWJzZW50IGV4cHJlc3Npb24sIHN1Y2ggYXMgIjptIiBvciAiOnMiIG1vZGlmaWVycyBvcgotICAgcmVnaXN0ZXIgbnVtYmVycyBlbmNsb3NlZCBpbiBwYXJlbnMgbGlrZSAiKHIxMCkiLgotCi0gICBJdCB0aGVuIGxvb2tzIGF0IGFsbCBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdXNlcyB0aGUgb3BlcmFuZHMgdG8KLSAgIGNob29zZSB0aGUgY29ycmVjdCBvcGNvZGUuICAqLwotCi1zdGF0aWMgc3RydWN0IHRpYzgwX29wY29kZSAqCi1maW5kX29wY29kZSAob3Bjb2RlLCBteW9wcykKLSAgICAgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyBteW9wc1tdOwotewotICBpbnQgbnVtZXhwOwkJCQkvKiBOdW1iZXIgb2YgZXhwcmVzc2lvbnMgZnJvbSBwYXJzaW5nIG9wZXJhbmRzICovCi0gIGludCBleHBpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IGV4cHJlc3Npb24gdG8gbWF0Y2ggKi8KLSAgaW50IG9waTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBvcGVyYW5kIHRvIG1hdGNoICovCi0gIGludCBtYXRjaCA9IDA7CQkJLyogU2V0IHRvIDEgd2hlbiBhbiBvcGVyYW5kIG1hdGNoIGlzIGZvdW5kICovCi0gIHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wYyA9IG9wY29kZTsJLyogUG9pbnRlciB0byBjdXJyZW50IG9wY29kZSB0YWJsZSBlbnRyeSAqLwotICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICplbmQ7CS8qIFBvaW50ZXIgdG8gZW5kIG9mIG9wY29kZSB0YWJsZSAqLwotCi0gIC8qIEZpcnN0IHBhcnNlIGFsbCB0aGUgb3BlcmFuZHMgc28gd2Ugb25seSBoYXZlIHRvIGRvIGl0IG9uY2UuICBUaGVyZSBtYXkKLSAgICAgYmUgbW9yZSBleHByZXNzaW9ucyBnZW5lcmF0ZWQgdGhhbiB0aGVyZSBhcmUgb3BlcmFuZHMuICovCi0KLSAgbnVtZXhwID0gZ2V0X29wZXJhbmRzIChteW9wcyk7Ci0KLSAgLyogRm9yIGVhY2ggb3Bjb2RlIHdpdGggdGhlIHNhbWUgbmFtZSwgdHJ5IHRvIG1hdGNoIGl0IGFnYWluc3QgdGhlIHBhcnNlZAotICAgICBvcGVyYW5kcy4gKi8KLQotICBlbmQgPSB0aWM4MF9vcGNvZGVzICsgdGljODBfbnVtX29wY29kZXM7Ci0gIHdoaWxlICghbWF0Y2ggJiYgKG9wYyA8IGVuZCkgJiYgKHN0cmNtcCAob3BjIC0+IG5hbWUsIG9wY29kZSAtPiBuYW1lKSA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBTdGFydCBvZmYgYXNzdW1pbmcgYSBtYXRjaC4gIElmIHdlIGZpbmQgYSBtaXNtYXRjaCwgdGhlbiB0aGlzIGlzCi0JIHJlc2V0IGFuZCB0aGUgb3BlcmFuZC9leHByIG1hdGNoaW5nIGxvb3AgdGVybWluYXRlcyB3aXRoIG1hdGNoCi0JIGVxdWFsIHRvIHplcm8sIHdoaWNoIGFsbG93cyB1cyB0byB0cnkgdGhlIG5leHQgb3Bjb2RlLiAqLwotCi0gICAgICBtYXRjaCA9IDE7Ci0KLSAgICAgIC8qIEZvciBlYWNoIGV4cHJlc3Npb24sIHRyeSB0byBtYXRjaCBpdCBhZ2FpbnN0IHRoZSBjdXJyZW50IG9wZXJhbmQKLQkgZm9yIHRoZSBjdXJyZW50IG9wY29kZS4gIFVwb24gYW55IG1pc21hdGNoLCB3ZSBhYmFuZG9uIGZ1cnRoZXIKLQkgbWF0Y2hpbmcgZm9yIHRoZSBjdXJyZW50IG9wY29kZSB0YWJsZSBlbnRyeS4gICovCi0KLSAgICAgIGZvciAoZXhwaSA9IDAsIG9waSA9IC0xOyAoZXhwaSA8IG51bWV4cCkgJiYgbWF0Y2g7IGV4cGkrKykKLQl7Ci0JICBpbnQgYml0cywgZmxhZ3MsIFhfb3AsIG51bTsKLQotCSAgWF9vcCA9IG15b3BzW2V4cGldLlhfb3A7Ci0JICBudW0gPSBteW9wc1tleHBpXS5YX2FkZF9udW1iZXI7Ci0KLQkgIC8qIFRoZSBPX2Fic2VudCBleHByZXNzaW9ucyBhcHBseSB0byB0aGUgc2FtZSBvcGVyYW5kIGFzIHRoZSBtb3N0Ci0JICAgICByZWNlbnQgbm9uIE9fYWJzZW50IGV4cHJlc3Npb24uICBTbyBvbmx5IGluY3JlbWVudCB0aGUgb3BlcmFuZAotCSAgICAgaW5kZXggd2hlbiB0aGUgY3VycmVudCBleHByZXNzaW9uIGlzIG5vdCBvbmUgb2YgdGhlc2Ugc3BlY2lhbAotCSAgICAgZXhwcmVzc2lvbnMuICovCi0KLQkgIGlmIChYX29wICE9IE9fYWJzZW50KQotCSAgICB7Ci0JICAgICAgb3BpKys7Ci0JICAgIH0KLQotCSAgZmxhZ3MgPSB0aWM4MF9vcGVyYW5kc1tvcGMgLT4gb3BlcmFuZHNbb3BpXV0uZmxhZ3M7Ci0JICBiaXRzID0gdGljODBfb3BlcmFuZHNbb3BjIC0+IG9wZXJhbmRzW29waV1dLmJpdHM7Ci0KLQkgIHN3aXRjaCAoWF9vcCkKLQkgICAgewotCSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0JICAgICAgLyogQWxzbyBjaGVjayB0aGF0IHJlZ2lzdGVycyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBldmVuIGFjdHVhbGx5Ci0JCSBhcmUgZXZlbi4gKi8KLQkgICAgICBpZiAoKChmbGFncyAmIFRJQzgwX09QRVJBTkRfR1BSKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9HUFIpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZQQSkgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfRlBBKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9DUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfQ1IpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VWRU4pICYmIChudW0gJiAxKSkgfHwKLQkJICBjb25zdF9vdmVyZmxvdyAobnVtICYgflRJQzgwX09QRVJBTkRfTUFTSywgYml0cywgZmxhZ3MpKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19jb25zdGFudDoKLQkgICAgICBpZiAoKGZsYWdzICYgVElDODBfT1BFUkFORF9FTkRNQVNLKSAmJiAobnVtID09IDMyKSkKLQkJewotCQkgIC8qIEVuZG1hc2sgdmFsdWVzIG9mIDAgYW5kIDMyIGdpdmUgaWRlbnRpY2FsIHJlc3VsdHMgKi8KLQkJICBudW0gPSAwOwotCQl9Ci0JICAgICAgaWYgKChmbGFncyAmIChUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfR1BSKSkgfHwKLQkJICBjb25zdF9vdmVyZmxvdyAobnVtLCBiaXRzLCBmbGFncykpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX3N5bWJvbDoKLQkgICAgICBpZiAoKGJpdHMgPCAzMikgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkgJiYgIXRpYzgwX3JlbGF4KQotCQl7Ci0JCSAgLyogVGhlIGRlZmF1bHQgaXMgdG8gcHJlZmVyIHRoZSBzaG9ydCBmb3JtIG9mIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCQkgICAgIFRoaXMgaXMgdGhlIG9ubHkgZm9ybSB0aGF0IHRoZSBUSSBhc3NlbWJsZXIgc3VwcG9ydHMuCi0JCSAgICAgSWYgdGhlIC1yZWxheCBvcHRpb24gaXMgZ2l2ZW4sIHdlIG5ldmVyIHVzZSB0aGUgc2hvcnQgZm9ybXMuCi0JCSAgICAgRklYTUU6IFNob3VsZCBiZSBhYmxlIHRvIGNob29zZSAiYmVzdC1maXQiLiAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGJpdHMgPT0gMzIpIC8qICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfQkFTRVJFTCkgKi8pCi0JCXsKLQkJICAvKiBUaGUgZGVmYXVsdCBpcyB0byBwcmVmZXIgdGhlIGxvbmcgZm9ybSBvZiBiYXNlIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCQkgICAgIFRoaXMgaXMgdGhlIG9ubHkgZm9ybSB0aGF0IHRoZSBUSSBhc3NlbWJsZXIgc3VwcG9ydHMuCi0JCSAgICAgSWYgdGhlIC1uby1yZWxheCBvcHRpb24gaXMgZ2l2ZW4sIHdlIGFsd2F5cyB1c2UgdGhlIGxvbmcgZm9ybSBvZgotCQkgICAgIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCQkgICAgIEZJWE1FOiBTaG91bGQgYmUgYWJsZSB0byBjaG9vc2UgImJlc3QtZml0Ii4gKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFN5bWJvbHMgdGhhdCBkb24ndCBtYXRjaCBvbmUgb2YgdGhlIGFib3ZlIGNhc2VzIGFyZQotCQkgICAgIHJlamVjdGVkIGFzIGFuIG9wZXJhbmQuICovCi0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19hYnNlbnQ6Ci0JICAgICAgLyogSWYgdGhpcyBpcyBhbiBPX2Fic2VudCBleHByZXNzaW9uLCB0aGVuIGl0IG1heSBiZSBhbiBleHByZXNzaW9uIHRoYXQKLQkJIHN1cHBsaWVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhbmQsIHN1Y2ggYXMgIjptIiBvcgotCQkgIjpzIiBtb2RpZmllcnMuIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBvcGVyYW5kIG1hdGNoZXMgdGhpcyByZXF1aXJlbWVudC4gKi8KLQkgICAgICBpZiAoISgobnVtICYgVElDODBfT1BFUkFORF9NX1NJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fU0kpIHx8Ci0JCSAgICAobnVtICYgVElDODBfT1BFUkFORF9NX0xJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fTEkpIHx8Ci0JCSAgICAobnVtICYgVElDODBfT1BFUkFORF9TQ0FMRUQpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSkpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2JpZzoKLQkgICAgICBpZiAoKG51bSA+IDApIHx8ICEoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZMT0FUKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9faWxsZWdhbDoKLQkgICAgY2FzZSBPX3N5bWJvbF9ydmE6Ci0JICAgIGNhc2UgT191bWludXM6Ci0JICAgIGNhc2UgT19iaXRfbm90OgotCSAgICBjYXNlIE9fbG9naWNhbF9ub3Q6Ci0JICAgIGNhc2UgT19tdWx0aXBseToKLQkgICAgY2FzZSBPX2RpdmlkZToKLQkgICAgY2FzZSBPX21vZHVsdXM6Ci0JICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgotCSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JICAgIGNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotCSAgICBjYXNlIE9fYml0X29yX25vdDoKLQkgICAgY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6Ci0JICAgIGNhc2UgT19iaXRfYW5kOgotCSAgICBjYXNlIE9fYWRkOgotCSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0JICAgIGNhc2UgT19lcToKLQkgICAgY2FzZSBPX25lOgotCSAgICBjYXNlIE9fbHQ6Ci0JICAgIGNhc2UgT19sZToKLQkgICAgY2FzZSBPX2dlOgotCSAgICBjYXNlIE9fZ3Q6Ci0JICAgIGNhc2UgT19sb2dpY2FsX2FuZDoKLQkgICAgY2FzZSBPX2xvZ2ljYWxfb3I6Ci0JICAgIGNhc2UgT19tYXg6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIGV4cHJlc3Npb24gdHlwZSIpLCBYX29wKTsKLQkgICAgfQotCX0KLSAgICAgIGlmICghbWF0Y2gpCi0JewotCSAgb3BjKys7Ci0JfQotICAgIH0gIAotCi0gIHJldHVybiAobWF0Y2ggPyBvcGMgOiBOVUxMKTsKLQotI2lmIDAKLQotICAvKiBOb3cgc2VhcmNoIHRoZSBvcGNvZGUgdGFibGUgdGFibGUgZm9yIG9uZSB3aXRoIG9wZXJhbmRzIHRoYXQKLSAgICAgbWF0Y2hlcyB3aGF0IHdlJ3ZlIGdvdC4gKi8KLQotICB3aGlsZSAoIW1hdGNoKQotICAgIHsKLSAgICAgIG1hdGNoID0gMTsKLSAgICAgIGZvciAoaSA9IDA7IG9wY29kZSAtPiBvcGVyYW5kc1tpXTsgaSsrKSAKLQl7Ci0JICBpbnQgZmxhZ3MgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgIGludCBYX29wID0gbXlvcHNbaV0uWF9vcDsKLQkgIGludCBudW0gPSBteW9wc1tpXS5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChYX29wID09IDApIAotCSAgICB7Ci0JICAgICAgbWF0Y2ggPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAgICAgCi0JICBpZiAoZmxhZ3MgJiAoVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfQ1IpKSAKLQkgICAgewotCSAgICAgIGlmICgoWF9vcCAhPSBPX3JlZ2lzdGVyKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0dQUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfR1BSKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9GUEEpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0ZQQSkpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQ1IpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0NSKSkpCi0JCXsKLQkJICBtYXRjaD0wOwotCQkgIGJyZWFrOwotCQl9CSAgCi0JICAgIH0KLQkgICAgICAKLQkgIGlmICgoKGZsYWdzICYgVElDODBfT1BFUkFORF9NSU5VUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfTUlOVVMpKSkgfHwKLQkgICAgICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9QTFVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9QTFVTKSkpIHx8Ci0JICAgICAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQVRNSU5VUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfQVRNSU5VUykpKSB8fAotCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0FUUEFSKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9BVFBBUikpKSB8fAotCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0FUU0lHTikgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfQVRTSUdOKSkpKSAKLQkgICAgewotCSAgICAgIG1hdGNoPTA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JICAgICAgCi0JfQotICAgICAgLyogd2UncmUgb25seSBkb25lIGlmIHRoZSBvcGVyYW5kcyBtYXRjaGVkIHNvIGZhciBBTkQgdGhlcmUKLQkgYXJlIG5vIG1vcmUgdG8gY2hlY2sgKi8KLSAgICAgIGlmIChtYXRjaCAmJiBteW9wc1tpXS5YX29wPT0wKSAKLQlicmVhazsKLSAgICAgIGVsc2UKLQltYXRjaCA9IDA7Ci0KLSAgICAgIG5leHRfb3Bjb2RlID0gb3Bjb2RlKzE7Ci0gICAgICBpZiAobmV4dF9vcGNvZGUtPm9wY29kZSA9PSAwKSAKLQlicmVhazsKLSAgICAgIGlmIChzdHJjbXAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkpCi0JYnJlYWs7Ci0gICAgICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkgIAotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIG9wY29kZSBvciBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoYXQgYWxsIHJlZ2lzdGVycyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSBldmVuIGFyZS4gKi8KLSAgLyogQWxzbywgaWYgYW55IG9wZXJhbmRzIHdlcmUgbWFya2VkIGFzIHJlZ2lzdGVycywgYnV0IHdlcmUgcmVhbGx5IHN5bWJvbHMgKi8KLSAgLyogZml4IHRoYXQgaGVyZS4gKi8KLSAgZm9yIChpPTA7IG9wY29kZS0+b3BlcmFuZHNbaV07IGkrKykgCi0gICAgewotICAgICAgaWYgKCh0aWM4MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFncyAmIFRJQzgwX09QRVJBTkRfRVZFTikgJiYKLQkgIChteW9wc1tpXS5YX2FkZF9udW1iZXIgJiAxKSkgCi0JYXNfZmF0YWwgKF8oIlJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIEVWRU4iKSk7Ci0gICAgICBpZiAobXlvcHNbaV0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotCXsKLQkgIGlmICghKHRpYzgwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgVElDODBfT1BFUkFORF9SRUcpKSAKLQkgICAgewotCSAgICAgIG15b3BzW2ldLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW2ldLlhfb3Bfc3ltYm9sKTsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIG15b3BzW2ldLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNlbmRpZgotfQotCi0vKiBidWlsZF9pbnNuIHRha2VzIGEgcG9pbnRlciB0byB0aGUgb3Bjb2RlIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUKLSAgIGFuZCB0aGUgYXJyYXkgb2Ygb3BlcmFuZCBleHByZXNzaW9ucyBhbmQgd3JpdGVzIG91dCB0aGUgaW5zdHJ1Y3Rpb24uCi0KLSAgIE5vdGUgdGhhdCB0aGUgb3Bjb2RlIHdvcmQgYW5kIGV4dGVuZGVkIHdvcmQgbWF5IGJlIHdyaXR0ZW4gdG8gZGlmZmVyZW50Ci0gICBmcmFncywgd2l0aCB0aGUgb3Bjb2RlIGF0IHRoZSBlbmQgb2Ygb25lIGZyYWcgYW5kIHRoZSBleHRlbnNpb24gYXQgdGhlCi0gICBiZWdpbm5pbmcgb2YgdGhlIG5leHQuICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzKSAKLSAgICAgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyAqb3BlcnM7Ci17Ci0gIGludCBleHBpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IGV4cHJlc3Npb24gdG8gbWF0Y2ggKi8KLSAgaW50IG9waTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBvcGVyYW5kIHRvIG1hdGNoICovCi0gIHVuc2lnbmVkIGxvbmcgaW5zblsyXTsJCS8qIEluc3RydWN0aW9uIGFuZCBsb25nIGltbWVkaWF0ZSAoaWYgYW55KSAqLwotICBjaGFyICpmOwkJCQkvKiBQb2ludGVyIHRvIGZyYWcgbG9jYXRpb24gZm9yIGluc25bMF0gKi8KLSAgZnJhZ1MgKmZmcmFnOwkJCQkvKiBGcmFnIGNvbnRhaW5pbmcgbG9jYXRpb24gZiAqLwotICBjaGFyICpmeCA9IE5VTEw7CQkJLyogUG9pbnRlciB0byBmcmFnIGxvY2F0aW9uIGZvciBpbnNuWzFdICovCi0gIGZyYWdTICpmeGZyYWc7CQkJLyogRnJhZyBjb250YWluaW5nIGxvY2F0aW9uIGZ4ICovCi0KLSAgLyogU3RhcnQgd2l0aCB0aGUgcmF3IG9wY29kZSBiaXRzIGZyb20gdGhlIG9wY29kZSB0YWJsZS4gKi8KLSAgaW5zblswXSA9IG9wY29kZSAtPiBvcGNvZGU7Ci0KLSAgLyogV2UgYXJlIGdvaW5nIHRvIGluc2VydCBhdCBsZWFzdCBvbmUgMzIgYml0IG9wY29kZSBzbyBnZXQgdGhlCi0gICAgIGZyYWcgbm93LiAqLwotCi0gIGYgPSBmcmFnX21vcmUgKDQpOwotICBmZnJhZyA9IGZyYWdfbm93OwotCi0gIC8qIEZvciBlYWNoIG9wZXJhbmQgZXhwcmVzc2lvbiwgaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSBiaXRzIGludG8gdGhlCi0gICAgIGluc3RydWN0aW9uIC4gKi8KLSAgZm9yIChleHBpID0gMCwgb3BpID0gLTE7IG9wZXJzW2V4cGldLlhfb3AgIT0gT19pbGxlZ2FsOyBleHBpKyspCi0gICAgewotICAgICAgaW50IGJpdHMsIHNoaWZ0LCBmbGFncywgWF9vcCwgbnVtOwotCi0gICAgICBYX29wID0gb3BlcnNbZXhwaV0uWF9vcDsKLSAgICAgIG51bSA9IG9wZXJzW2V4cGldLlhfYWRkX251bWJlcjsKLQotICAgICAgLyogVGhlIE9fYWJzZW50IGV4cHJlc3Npb25zIGFwcGx5IHRvIHRoZSBzYW1lIG9wZXJhbmQgYXMgdGhlIG1vc3QKLQkgcmVjZW50IG5vbiBPX2Fic2VudCBleHByZXNzaW9uLiAgU28gb25seSBpbmNyZW1lbnQgdGhlIG9wZXJhbmQKLQkgaW5kZXggd2hlbiB0aGUgY3VycmVudCBleHByZXNzaW9uIGlzIG5vdCBvbmUgb2YgdGhlc2Ugc3BlY2lhbAotCSBleHByZXNzaW9ucy4gKi8KLQotICAgICAgaWYgKFhfb3AgIT0gT19hYnNlbnQpCi0JewotCSAgb3BpKys7Ci0JfQotCi0gICAgICBmbGFncyA9IHRpYzgwX29wZXJhbmRzW29wY29kZSAtPiBvcGVyYW5kc1tvcGldXS5mbGFnczsKLSAgICAgIGJpdHMgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUgLT4gb3BlcmFuZHNbb3BpXV0uYml0czsKLSAgICAgIHNoaWZ0ID0gdGljODBfb3BlcmFuZHNbb3Bjb2RlIC0+IG9wZXJhbmRzW29waV1dLnNoaWZ0OwotCi0gICAgICBzd2l0Y2ggKFhfb3ApCi0JewotCWNhc2UgT19yZWdpc3RlcjoKLQkgIG51bSAmPSB+VElDODBfT1BFUkFORF9NQVNLOwotCSAgaW5zblswXSA9IGluc25bMF0gfCAobnVtIDw8IHNoaWZ0KTsKLQkgIGJyZWFrOwotCWNhc2UgT19jb25zdGFudDoKLQkgIGlmICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VORE1BU0spICYmIChudW0gPT0gMzIpKQotCSAgICB7Ci0JICAgICAgLyogRW5kbWFzayB2YWx1ZXMgb2YgMCBhbmQgMzIgZ2l2ZSBpZGVudGljYWwgcmVzdWx0cyAqLwotCSAgICAgIG51bSA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQklUTlVNKSkKLQkgICAgewotCSAgICAgIC8qIEJJVE5VTSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBvbmUncyBjb21wbGVtZW50IGZvcm0gKi8KLQkgICAgICBudW0gPSAofm51bSAmIDB4MUYpOwotCSAgICB9Ci0JICAvKiBNYXNrIG9mZiB1cHBlciBiaXRzLCBqdXN0IGl0IGNhc2UgaXQgaXMgc2lnbmVkIGFuZCBpcyBuZWdhdGl2ZSAqLwotCSAgaWYgKGJpdHMgPCAzMikKLQkgICAgewotCSAgICAgIG51bSAmPSAoMSA8PCBiaXRzKSAtIDE7Ci0JICAgICAgaW5zblswXSA9IGluc25bMF0gfCAobnVtIDw8IHNoaWZ0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnggPSBmcmFnX21vcmUgKDQpOwotCSAgICAgIGZ4ZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIGluc25bMV0gPSBudW07Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT19zeW1ib2w6Ci0JICBpZiAoYml0cyA9PSAzMikKLQkgICAgewotCSAgICAgIGZ4ID0gZnJhZ19tb3JlICg0KTsKLQkgICAgICBmeGZyYWcgPSBmcmFnX25vdzsKLQkgICAgICBpbnNuWzFdID0gMDsKLQkgICAgICBpZiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BDUkVMKQotCQl7Ci0JCSAgZml4X25ld19leHAgKGZ4ZnJhZywKLQkJCSAgICAgICBmeCAtIChmeGZyYWcgLT4gZnJfbGl0ZXJhbCksCi0JCQkgICAgICAgNCwKLQkJCSAgICAgICAmb3BlcnNbZXhwaV0sIAotCQkJICAgICAgIDEsCi0JCQkgICAgICAgUl9NUFBDUik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmaXhfbmV3X2V4cCAoZnhmcmFnLAotCQkJICAgICAgIGZ4IC0gKGZ4ZnJhZyAtPiBmcl9saXRlcmFsKSwKLQkJCSAgICAgICA0LAotCQkJICAgICAgICZvcGVyc1tleHBpXSwgCi0JCQkgICAgICAgMCwKLQkJCSAgICAgICBSX1JFTExPTkdYKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfUENSRUwpCi0JICAgIHsKLQkgICAgICBmaXhfbmV3X2V4cCAoZmZyYWcsCi0JCQkgICBmIC0gKGZmcmFnIC0+IGZyX2xpdGVyYWwpLAotCQkJICAgNCwJCQkvKiBGSVhNRSEgaG93IGlzIHRoaXMgdXNlZD8gKi8KLQkJCSAgICZvcGVyc1tleHBpXSwKLQkJCSAgIDEsCi0JCQkgICBSX01QUENSMTVXKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50ZXJuYWxfZXJyb3IgKF8oInN5bWJvbCByZWxvYyB0aGF0IGlzIG5vdCBQQyByZWxhdGl2ZSBvciAzMiBiaXRzIikpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9fYWJzZW50OgotCSAgLyogRWFjaCBPX2Fic2VudCBleHByZXNzaW9uIGNhbiBpbmRpY2F0ZSBleGFjdGx5IG9uZSBwb3NzaWJsZSBtb2RpZmllci4gKi8KLQkgIGlmICgobnVtICYgVElDODBfT1BFUkFORF9NX1NJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fU0kpKQotCSAgICB7Ci0JICAgICAgaW5zblswXSA9IGluc25bMF0gfCAoMSA8PCAxNyk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChudW0gJiBUSUM4MF9PUEVSQU5EX01fTEkpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9MSSkpCi0JICAgIHsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8ICgxIDw8IDE1KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkpCi0JICAgIHsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8ICgxIDw8IDExKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfUEFSRU5TKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BBUkVOUykpCi0JICAgIHsKLQkgICAgICAvKiBObyBjb2RlIHRvIGdlbmVyYXRlLCBqdXN0IGFjY2VwdCBhbmQgZGlzY2FyZCB0aGlzIGV4cHJlc3Npb24gKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIG9wZXJhbmQgbW9kaWZpZXIiKSwgb3BlcnNbZXhwaV0uWF9hZGRfbnVtYmVyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPX2JpZzoKLQkgIGZ4ID0gZnJhZ19tb3JlICg0KTsKLQkgIGZ4ZnJhZyA9IGZyYWdfbm93OwotCSAgewotCSAgICBpbnQgcHJlY2lzaW9uID0gMjsKLQkgICAgbG9uZyBleHBvbmVudF9iaXRzID0gOEw7Ci0JICAgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzJdOwotCSAgICAvKiBWYWx1ZSBpcyBzdGlsbCBpbiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciAqLwotCSAgICBnZW5fdG9fd29yZHMgKHdvcmRzLCBwcmVjaXNpb24sIGV4cG9uZW50X2JpdHMpOwotCSAgICBpbnNuWzFdID0gKHdvcmRzWzBdIDw8IDE2KSB8IHdvcmRzWzFdOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPX2lsbGVnYWw6Ci0JY2FzZSBPX3N5bWJvbF9ydmE6Ci0JY2FzZSBPX3VtaW51czoKLQljYXNlIE9fYml0X25vdDoKLQljYXNlIE9fbG9naWNhbF9ub3Q6Ci0JY2FzZSBPX211bHRpcGx5OgotCWNhc2UgT19kaXZpZGU6Ci0JY2FzZSBPX21vZHVsdXM6Ci0JY2FzZSBPX2xlZnRfc2hpZnQ6Ci0JY2FzZSBPX3JpZ2h0X3NoaWZ0OgotCWNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotCWNhc2UgT19iaXRfb3Jfbm90OgotCWNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgotCWNhc2UgT19iaXRfYW5kOgotCWNhc2UgT19hZGQ6Ci0JY2FzZSBPX3N1YnRyYWN0OgotCWNhc2UgT19lcToKLQljYXNlIE9fbmU6Ci0JY2FzZSBPX2x0OgotCWNhc2UgT19sZToKLQljYXNlIE9fZ2U6Ci0JY2FzZSBPX2d0OgotCWNhc2UgT19sb2dpY2FsX2FuZDoKLQljYXNlIE9fbG9naWNhbF9vcjoKLQljYXNlIE9fbWF4OgotCWRlZmF1bHQ6Ci0JICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgZXhwcmVzc2lvbiIpLCBYX29wKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbiwgZWl0aGVyIDQgb3IgOCBieXRlcy4gICovCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuWzBdLCA0KTsKLSAgaWYgKGZ4ICE9IE5VTEwpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmeCwgaW5zblsxXSwgNCk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgR2FzCi0gICBjYWxscyB0aGlzIGZ1bmN0aW9uIGZvciBlYWNoIGlucHV0IGxpbmUgd2hpY2ggZG9lcyBub3QgY29udGFpbiBhCi0gICBwc2V1ZG9vcC4KLQotICBTVFIgcG9pbnRzIHRvIGEgTlVMTCB0ZXJtaW5hdGVkIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcwotICBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNjYW47Ci0gIHVuc2lnbmVkIGNoYXIgKmlucHV0X2xpbmVfc2F2ZTsKLSAgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICBleHByZXNzaW9uUyBteW9wc1sxNl07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotICAvKiBFbnN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlIHRvIGFzc2VtYmxlLiAqLwotICBhc3NlcnQgKHN0cik7Ci0KLSAgLyogRHJvcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgewotICAgICAgc3RyKys7Ci0gICAgfQotCi0gIC8qIElzb2xhdGUgdGhlIG1uZW1vbmljIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBieSBmaW5kaW5nIHRoZSBmaXJzdAotICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhbmQgemFwcGluZyBpdCB0byBhIG51bGwgYnl0ZS4gKi8KLSAgZm9yIChzY2FuID0gc3RyOyAqc2NhbiAhPSAnXDAwMCcgJiYgIWlzc3BhY2UgKCpzY2FuKTsgc2NhbisrKSB7O30KLSAgaWYgKCpzY2FuICE9ICdcMDAwJykKLSAgICB7Ci0gICAgICAqc2NhbisrID0gJ1wwMDAnOwotICAgIH0KLQotICAvKiBUcnkgdG8gZmluZCB0aGlzIG1uZW1vbmljIGluIHRoZSBoYXNoIHRhYmxlICovCi0gIGlmICgob3Bjb2RlID0gKHN0cnVjdCB0aWM4MF9vcGNvZGUgKikgaGFzaF9maW5kICh0aWM4MF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBtbmVtb25pYzogJyVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHIgPSBzY2FuOwotICB3aGlsZSAoaXNzcGFjZSAoKnNjYW4pKQotICAgIHsKLSAgICAgIHNjYW4rKzsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9zYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgb3Bjb2RlID0gZmluZF9vcGNvZGUgKG9wY29kZSwgbXlvcHMpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG9wZXJhbmRzOiAnJXMnIiksIGlucHV0X2xpbmVfc2F2ZSk7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfc2F2ZTsKLSAgYnVpbGRfaW5zbiAob3Bjb2RlLCBteW9wcyk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIGFzc2VtYmx5LCBhZnRlciB0aGUgY29tbWFuZAotICAgbGluZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgYWxsIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50Ci0gICBpbml0aWFsaXphdGlvbnMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4KLQotICAgSXQgc2hvdWxkIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiwgdGhhdCB0aGUgbWFjaGluZSBkZXBlbmRlbnQgcGFydCBvZgotICAgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3A7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wX2VuZDsKLSAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOwotICBleHRlcm4gaW50IGNvZmZfZmxhZ3M7CQkJLyogRGVmaW5lZCBpbiBvYmotY29mZi5jICovCi0KLSAgLyogU2V0IEZfQVIzMldSIGluIGNvZmZfZmxhZ3MsIHdoaWNoIHdpbGwgZW5kIHVwIGluIHRoZSBmaWxlIGhlYWRlcgotICAgICBmX2ZsYWdzIGZpZWxkLiAqLwotCi0gIGNvZmZfZmxhZ3MgfD0gRl9BUjMyV1I7CS8qIFRJYzgwIGlzIDMyIGJpdCBsaXR0bGUgZW5kaWFuICovCi0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgVEljODAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIHRpYzgwX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgb3BfZW5kID0gdGljODBfb3Bjb2RlcyArIHRpYzgwX251bV9vcGNvZGVzOwotICBmb3IgKG9wID0gdGljODBfb3Bjb2Rlczsgb3AgPCBvcF9lbmQ7IG9wKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcCAtPiBuYW1lKSAhPSAwKSAKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKSBvcCAtPiBuYW1lOwotCSAgaGFzaF9pbnNlcnQgKHRpYzgwX2hhc2gsIG9wIC0+IG5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgfQotCi0gIC8qIEluc2VydCB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHVzZSBzeW1ib2xfY3JlYXRlCi0gICAgIHJhdGhlciB0aGFuIHN5bWJvbF9uZXcgc28gdGhhdCB0aGVzZSBzeW1ib2xzIGRvbid0IGVuZCB1cCBpbiB0aGUgb2JqZWN0Ci0gICAgIGZpbGVzJyBzeW1ib2wgdGFibGUuICBOb3RlIHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIGluY2x1ZGUKLSAgICAgc29tZSB1cHBlciBiaXRzIHRoYXQgZGlzdGluZ3Vpc2ggdGhlIHR5cGUgb2YgdGhlIHN5bWJvbCAocmVnaXN0ZXIsIGJpdG51bSwKLSAgICAgY29uZGl0aW9uIGNvZGUsIGV0YykgYW5kIHRoZXNlIGJpdHMgbXVzdCBiZSBtYXNrZWQgYXdheSBiZWZvcmUgYWN0dWFsbHkKLSAgICAgaW5zZXJ0aW5nIHRoZSB2YWx1ZXMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgRm9yIHJlZ2lzdGVycyB3ZSBwdXQKLSAgICAgdGhlc2UgYml0cyBpbiB0aGUgc3ltYm9sIHRhYmxlIHNpbmNlIHdlIHVzZSB0aGVtIGxhdGVyIGFuZCB0aGVyZSBpcyBubwotICAgICBxdWVzdGlvbiB0aGF0IHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlIHJlZ2lzdGVyIG51bWJlci4gIEZvciBjb25zdGFudHMgd2UKLSAgICAgY2FuJ3QgZG8gdGhhdCBzaW5jZSB0aGUgY29uc3RhbnQgY2FuIGJlIGFueSB2YWx1ZSwgc28gdGhleSBhcmUgbWFza2VkIG9mZgotICAgICBiZWZvcmUgcHV0dGluZyB0aGVtIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gKi8KLQotICBwZHNwID0gTlVMTDsKLSAgd2hpbGUgKChwZHNwID0gdGljODBfbmV4dF9wcmVkZWZpbmVkX3N5bWJvbCAocGRzcCkpICE9IE5VTEwpCi0gICAgewotICAgICAgc2VnVCBzZWdtZW50OwotICAgICAgdmFsdWVUIHZhbHU7Ci0gICAgICBpbnQgc3ltdHlwZTsKLQotICAgICAgc3ltdHlwZSA9IFBEU19WQUxVRSAocGRzcCkgJiBUSUM4MF9PUEVSQU5EX01BU0s7Ci0gICAgICBzd2l0Y2ggKHN5bXR5cGUpCi0JewotCWNhc2UgVElDODBfT1BFUkFORF9HUFI6Ci0JY2FzZSBUSUM4MF9PUEVSQU5EX0ZQQToKLQljYXNlIFRJQzgwX09QRVJBTkRfQ1I6Ci0JICBzZWdtZW50ID0gcmVnX3NlY3Rpb247Ci0JICB2YWx1ID0gUERTX1ZBTFVFIChwZHNwKTsKLQkgIGJyZWFrOwotCWNhc2UgVElDODBfT1BFUkFORF9DQzoKLQljYXNlIFRJQzgwX09QRVJBTkRfQklUTlVNOgotCSAgc2VnbWVudCA9IGFic29sdXRlX3NlY3Rpb247Ci0JICB2YWx1ID0gUERTX1ZBTFVFIChwZHNwKSAmIH5USUM4MF9PUEVSQU5EX01BU0s7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIHByZWRlZmluZWQgc3ltYm9sIGJpdHMiKSwgc3ltdHlwZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChQRFNfTkFNRSAocGRzcCksIHNlZ21lbnQsIHZhbHUsCi0JCQkJCSAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gICAgfQotfQotCi0MCi0KLS8qIFRoZSBhc3NlbWJsZXIgYWRkcyBtZF9zaG9ydG9wdHMgdG8gdGhlIHN0cmluZyBwYXNzZWQgdG8gZ2V0b3B0LiAqLwotCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLQotLyogVGhlIGFzc2VtYmxlciBhZGRzIG1kX2xvbmdvcHRzIHRvIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGxvbmcgb3B0aW9ucwotICAgdGhhdCBhcmUgcGFzc2VkIHRvIGdldG9wdC4gKi8KLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotCi0jZGVmaW5lIE9QVElPTl9SRUxBWAkoT1BUSU9OX01EX0JBU0UpCi0gIHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKLQotI2RlZmluZSBPUFRJT05fTk9fUkVMQVgJKE9QVElPTl9SRUxBWCArIDEpCi0gIHsibm8tcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1JFTEFYfSwKLQotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLS8qIFRoZSBtZF9wYXJzZV9vcHRpb24gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgZ2V0b3B0IHJldHVybnMgYW4KLSAgIHVucmVjb2duaXplZCBjb2RlLCBwcmVzdW1hYmx5IGluZGljYXRpbmcgYSBzcGVjaWFsIGNvZGUgdmFsdWUgd2hpY2gKLSAgIGFwcGVhcnMgaW4gbWRfbG9uZ29wdHMgZm9yIG1hY2hpbmUgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuICovCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICB0aWM4MF9yZWxheCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9OT19SRUxBWDoKLSAgICAgIHRpYzgwX3JlbGF4ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLSAgcmV0dXJuICgxKTsKLX0KLQotLyogVGhlIG1kX3Nob3dfdXNhZ2UgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSB1c2FnZSBtZXNzYWdlIGlzCi0gICBwcmludGVkLiAgSXQgc2hvdWxkIHByaW50IGEgZGVzY3JpcHRpb24gb2YgdGhlIG1hY2hpbmUgc3BlY2lmaWMgb3B0aW9ucwotICAgZm91bmQgaW4gbWRfbG9uZ29wdHMuICovCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sICJcCi1USWM4MCBvcHRpb25zOlxuXAotLXJlbGF4CQkJYWx0ZXIgUEMgcmVsYXRpdmUgYnJhbmNoIGluc3RydWN0aW9ucyB0byB1c2UgbG9uZyBmb3JtIHdoZW4gbmVlZGVkXG5cCi0tbm8tcmVsYXgJCWFsd2F5cyB1c2Ugc2hvcnQgUEMgcmVsYXRpdmUgYnJhbmNoIGluc3RydWN0aW9ucywgZXJyb3Igb24gb3ZlcmZsb3dcbiIpOwotfQotCi0MCi0vKiBBdHRlbXB0IHRvIHNpbXBsaWZ5IG9yIGV2ZW4gZWxpbWluYXRlIGEgZml4dXAuICBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICBpZ25vcmVkOyBwZXJoYXBzIGl0IHdhcyBvbmNlIG1lYW5pbmdmdWwsIGJ1dCBub3cgaXQgaXMgaGlzdG9yaWNhbC4KLSAgIFRvIGluZGljYXRlIHRoYXQgYSBmaXh1cCBoYXMgYmVlbiBlbGltaW5hdGVkLCBzZXQgZml4UC0+ZnhfZG9uZS4KLSAgICovCi0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqZGVzdCA9ICBmaXhQIC0+IGZ4X2ZyYWcgLT4gZnJfbGl0ZXJhbCArIGZpeFAgLT4gZnhfd2hlcmU7Ci0gIGludCBvdmVyZmxvdzsKLQotICBzd2l0Y2ggKGZpeFAgLT4gZnhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUkVMTE9OR1g6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGRlc3QsICh2YWx1ZVQpIHZhbCwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTVBQQ1I6Ci0gICAgICB2YWwgPj49IDI7Ci0gICAgICB2YWwgKz0gMTsJICAvKiBUYXJnZXQgYWRkcmVzcyBjb21wdXRlZCBmcm9tIGluc3Qgc3RhcnQgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZGVzdCwgKHZhbHVlVCkgdmFsLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NUFBDUjE1VzoKLSAgICAgIG92ZXJmbG93ID0gKHZhbCA8IC02NTUzNkwpIHx8ICh2YWwgPiA2NTUzMkwpOwotICAgICAgaWYgKG92ZXJmbG93KQotCXsKLQkgIGFzX2JhZF93aGVyZSAoZml4UCAtPiBmeF9maWxlLCBmaXhQIC0+IGZ4X2xpbmUsCi0JCQlfKCJQQyBvZmZzZXQgMHglbHggb3V0c2lkZSByYW5nZSAweCVseC0weCVseCIpLAotCQkJdmFsLCAtNjU1MzZMLCA2NTUzMkwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWwgPj49IDI7Ci0JICAqZGVzdCsrID0gdmFsICYgMHhGRjsKLQkgIHZhbCA+Pj0gODsKLQkgICpkZXN0ID0gKCpkZXN0ICYgMHg4MCkgfCAodmFsICYgMHg3Rik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0FCUzoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZGVzdCwgKHZhbHVlVCkgdmFsLCBmaXhQIC0+IGZ4X3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGUgaW4gZml4dXAiKSwgZml4UCAtPiBmeF9yX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLgotCi0gICBGb3IgdGhlIFRJYzgwLCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSAzMiBiaXQgb3Bjb2RlIGNvbnRhaW5pbmcKLSAgIHRoZSBQQyByZWxhdGl2ZSBmaWVsZC4gKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIChmaXhQIC0+IGZ4X2ZyYWcgLT4gZnJfYWRkcmVzcyArIGZpeFAgLT4gZnhfd2hlcmUpIDsKLX0KLQotLyoKLSAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgotICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KLSAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KLSAqCi0gKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCi0gKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgaW50ZXJuYWxfZXJyb3IgKF8oIm1kX2NvbnZlcnRfZnJhZygpIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSk7Ci0gIGFib3J0ICgpOwotfQotCi0MCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQotICAgICBzeW1ib2xTICppZ25vcmU7Ci17Ci19Ci0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIChmaXhQIC0+IGZ4X3JfdHlwZSk7Ci19Ci0KLSNlbmRpZgkvKiBPQkpfQ09GRiAqLwotCi0vKiBlbmQgb2YgdGMtdGljODAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWM4MC5oIGIvZ2FzL2NvbmZpZy90Yy10aWM4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmZmMjQ5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGljODAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy10aWM4MC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfVElDODAKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJYmZkX2FyY2hfdGljODAKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkiY29mZi10aWM4MCIKLSNkZWZpbmUgQkZEX0FSQ0gJVEFSR0VUX0FSQ0gKLQotLyogV2UgbmVlZCB0aGUgZXh0cmEgZmllbGQgaW4gdGhlIGZpeHVwIHN0cnVjdCB0byBwdXQgdGhlIHJlbG9jYXRpb24gaW4uICovCi0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLQotLyogRGVmaW5lIG1kX251bWJlcl90b19jaGFycyBhcyB0aGUgYXBwcm9wcmlhdGUgc3RhbmRhcmQgYmlnIGVuZGlhbiBvcgotICAgbGl0dGxlIGVuZGlhbiBmdW5jdGlvbi4gIFNob3VsZCB3ZSBzb21lZGF5IHN1cHBvcnQgZW5kaWFubmVzcyBhcyBhCi0gICBydW50aW1lIGRlY2lzaW9uLCB0aGlzIHdpbGwgbmVlZCB0byBjaGFuZ2UuICovCi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotLyogRGVmaW5lIGF3YXkgdGhlIGNhbGwgdG8gbWRfb3BlcmFuZCBpbiB0aGUgZXhwcmVzc2lvbiBwYXJzaW5nIGNvZGUuCi0gICBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZXhwcmVzc2lvbiBwYXJzZXIgY2FuJ3QgcGFyc2UgdGhlIGlucHV0Ci0gICBhbmQgZ2l2ZXMgdGhlIGFzc2VtYmxlciBiYWNrZW5kIGEgY2hhbmNlIHRvIGRlYWwgd2l0aCBpdCBpbnN0ZWFkLiAqLwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2lmZGVmIE9CSl9DT0ZGCi0KLS8qIENPRkYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIENPRkZfTUFHSUMJVElDODBfQVJDSF9NQUdJQwotCi0vKiBXaGV0aGVyIGEgcmVsb2Mgc2hvdWxkIGJlIG91dHB1dC4gICovCi0KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoZml4cCkgKChmaXhwKSAtPiBmeF9hZGRzeSAhPSBOVUxMKQotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCi0KLWV4dGVybiBzaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSAoKTsKLQotI2VuZGlmCS8qIE9CSl9DT0ZGICovCi0KLS8qIGVuZCBvZiB0Yy10aWM4MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXY4NTAuYyBiL2dhcy9jb25maWcvdGMtdjg1MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTMwNTRkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdjg1MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4MiArMCwwIEBACi0vKiB0Yy12ODUwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBORUMgVjg1MAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS92ODUwLmgiCi0KLSNkZWZpbmUgQVJFQV9aREEgMAotI2RlZmluZSBBUkVBX1NEQSAxCi0jZGVmaW5lIEFSRUFfVERBIDIKLQotLyogc2lnbi1leHRlbmQgYSAxNi1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQxNih4KQkoKCgoeCkgJiAweGZmZmYpIF4gKH4gMHg3ZmZmKSkgKyAweDgwMDApCi0KLS8qIFRlbXBvcmFyaWx5IGhvbGRzIHRoZSByZWxvYyBpbiBhIGNvbnMgZXhwcmVzc2lvbi4gICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGhvbGRfY29uc19yZWxvYzsKLQotLyogU2V0IHRvIFRSVUUgaWYgd2Ugd2FudCB0byBiZSBwZWRhbnRpYyBhYm91dCBzaWduZWQgb3ZlcmZsb3dzLiAgKi8KLXN0YXRpYyBib29sZWFuIHdhcm5fc2lnbmVkX292ZXJmbG93cyAgID0gRkFMU0U7Ci1zdGF0aWMgYm9vbGVhbiB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cyA9IEZBTFNFOwotCi0vKiBJbmRpY2F0ZXMgdGhlIHRhcmdldCBCRkQgbWFjaGluZSBudW1iZXIuICAqLwotc3RhdGljIGludCAgICAgbWFjaGluZSA9IC0xOwotCi0vKiBJbmRpY2F0ZXMgdGhlIHRhcmdldCBwcm9jZXNzb3IocykgZm9yIHRoZSBhc3NlbWJsZS4gICovCi1zdGF0aWMgdW5zaWduZWQgaW50CXByb2Nlc3Nvcl9tYXNrID0gLTE7Ci0KLQwKLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCByZWdfbmFtZQotewotICBjb25zdCBjaGFyICogbmFtZTsKLSAgaW50ICAgICAgICAgIHZhbHVlOwotfTsKLQotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIAotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGQxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0MCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICAvKiBDb25kaXRpb25hbCBicmFuY2hlcy4gICovCi0gIHsweGZmLCAgICAgLTB4MTAwLCAgICAyLCAxfSwKLSAgezB4MWZmZmZmLCAtMHgyMDAwMDAsIDYsIDB9LAotICAvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKi8KLSAgezB4ZmYsICAgICAtMHgxMDAsICAgIDIsIDN9LAotICB7MHgxZmZmZmYsIC0weDIwMDAwMCwgNCwgMH0sCi19OwotCi0KLXN0YXRpYyBzZWdUIHNkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgdGRhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB6ZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHNic3Nfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB0YnNzX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgemJzc19zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHJvc2RhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCByb3pkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1Qgc2NvbW1vbl9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHRjb21tb25fc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB6Y29tbW9uX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24gPSBOVUxMOwotCi0vKiBmaXh1cHMgKi8KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotc3RydWN0IHY4NTBfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgICAgICAgICAgICAgIGV4cDsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgIG9waW5kZXg7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXN0cnVjdCB2ODUwX2ZpeHVwIGZpeHVwcyBbTUFYX0lOU05fRklYVVBTXTsKLXN0YXRpYyBpbnQgZmM7Ci0KLQwKLXZvaWQKLXY4NTBfc2RhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoc2RhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3RkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHRkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3pkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHpkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3Nic3MgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoc2Jzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF90YnNzIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHRic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfemJzcyAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0ICh6YnNzX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3Jvc2RhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAocm9zZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9yb3pkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHJvemRhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfY2FsbF90YWJsZV9kYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9jYWxsX3RhYmxlX3RleHQgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX2JzcyAoaW50IGlnbm9yZSkKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0gICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9vZmZzZXQgKGludCBpZ25vcmUpCi17Ci0gIGludCB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIAotICB0ZW1wIC09IGZyYWdfbm93X2ZpeCgpOwotICAKLSAgaWYgKHRlbXAgPiAwKQotICAgICh2b2lkKSBmcmFnX21vcmUgKHRlbXApOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogQ29waWVkIGZyb20gb2JqX2VsZl9jb21tb24oKSBpbiBnYXMvY29uZmlnL29iai1lbGYuYyAqLwotc3RhdGljIHZvaWQKLXY4NTBfY29tbSAoYXJlYSkKLSAgICAgaW50IGFyZWE7Ci17Ci0gIGNoYXIgKiAgICBuYW1lOwotICBjaGFyICAgICAgYzsKLSAgY2hhciAqICAgIHA7Ci0gIGludCAgICAgICB0ZW1wOwotICBpbnQgICAgICAgc2l6ZTsKLSAgc3ltYm9sUyAqIHN5bWJvbFA7Ci0gIGludCAgICAgICBoYXZlX2FsaWduOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIAotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIAotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwkJLyogc2tpcCAnLCcgKi8KLSAgCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPCAwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIAotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gc2l6ZSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICAKLSAga25vdyAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSA9PSAmIHplcm9fYWRkcmVzc19mcmFnKTsKLSAgCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBoYXZlX2FsaWduID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGhhdmVfYWxpZ24gPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICAKLSAgaWYgKCEgaGF2ZV9hbGlnbiB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLSAgICB7Ci0gICAgICBpZiAoISBoYXZlX2FsaWduKQotCXRlbXAgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIAotCSAgaWYgKHRlbXAgPCAwKQotCSAgICB7Ci0JICAgICAgdGVtcCA9IDA7Ci0JICAgICAgYXNfd2FybiAoXygiQ29tbW9uIGFsaWdubWVudCBuZWdhdGl2ZTsgMCBhc3N1bWVkIikpOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBpZiAoc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCkKLQl7Ci0JICBzZWdUICAgb2xkX3NlYzsKLQkgIGludCAgICBvbGRfc3Vic2VjOwotCSAgY2hhciAqIHBmcmFnOwotCSAgaW50ICAgIGFsaWduOwotCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKLQotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgICAgIAotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JCSAgCi0JICBhcHBsaWNhYmxlICY9IFNFQ19BTExPQzsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgaWYgKHNic3Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgc2Jzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5zYnNzIiwgMCk7Ci0JICAgICAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSk7Ci0JICAgICAgCi0JCSAgc2VnX2luZm8gKHNic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgIAotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIGlmICh6YnNzX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIHpic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuemJzcyIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUpOwotCSAgICAgIAotCQkgIHNlZ19pbmZvICh6YnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAKLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBpZiAodGJzc19zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICB0YnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnRic3MiLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdGJzc19zZWN0aW9uLCBhcHBsaWNhYmxlKTsKLQkJICAKLQkJICBzZWdfaW5mbyAodGJzc19zZWN0aW9uKS0+YnNzID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICh0ZW1wKQotCSAgICB7Ci0JICAgICAgLyogY29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50ICovCi0JICAgICAgZm9yIChhbGlnbiA9IDA7ICh0ZW1wICYgMSkgPT0gMDsgdGVtcCA+Pj0gMSwgKythbGlnbikKLQkJOwotCSAgICAgIAotCSAgICAgIGlmICh0ZW1wICE9IDEpCi0JCXsKLQkJICBhc19iYWQgKF8oIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFsaWduID0gMDsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2Jzc19zZWN0aW9uLCBhbGlnbik7Ci0JICAgICAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0JICAgICAgc3Vic2VnX3NldCAoc2Jzc19zZWN0aW9uLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHpic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgICAgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotCSAgICAgIHN1YnNlZ19zZXQgKHpic3Nfc2VjdGlvbiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICByZWNvcmRfYWxpZ25tZW50ICh0YnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgICAgICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLQkgICAgICBzdWJzZWdfc2V0ICh0YnNzX3NlY3Rpb24sIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCSAgCi0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHNic3Nfc2VjdGlvbikKLQkJc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB6YnNzX3NlY3Rpb24pCi0JCXN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gdGJzc19zZWN0aW9uKQotCQlzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIAotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0JICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsCi0JCQkgICAgKG9mZnNldFQpIHNpemUsIChjaGFyICopIDApOwotCSAgKnBmcmFnID0gMDsKLQkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOwotCSAgCi0JICBzd2l0Y2ggKGFyZWEpCi0JICAgIHsKLQkgICAgY2FzZSBBUkVBX1NEQToKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzYnNzX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHpic3Nfc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgdGJzc19zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JICAgIAotCSAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLQkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JYWxsb2NhdGVfY29tbW9uOgotCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOwotCSAgU19TRVRfQUxJR04gKHN5bWJvbFAsIHRlbXApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgCi0JICBzd2l0Y2ggKGFyZWEpCi0JICAgIHsKLQkgICAgY2FzZSBBUkVBX1NEQToKLQkgICAgICBpZiAoc2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICBmbGFnd29yZAlhcHBsaWNhYmxlOwotCQkgIAotCQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCQkgIAotCQkgIHNjb21tb25fc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuc2NvbW1vbiIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzY29tbW9uX3NlY3Rpb24sIGFwcGxpY2FibGUKLQkJICAgICAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19EQVRBCi0JCQl8IFNFQ19IQVNfQ09OVEVOVFMpIHwgU0VDX0lTX0NPTU1PTik7Ci0JCX0KLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzY29tbW9uX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIGlmICh6Y29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkCWFwcGxpY2FibGU7Ci0JCSAgCi0JCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JCSAgCi0JCSAgemNvbW1vbl9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi56Y29tbW9uIiwgMCk7Ci0JCSAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHpjb21tb25fc2VjdGlvbiwgYXBwbGljYWJsZQotCQkgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0RBVEEKLQkJCXwgU0VDX0hBU19DT05URU5UUykgfCBTRUNfSVNfQ09NTU9OKTsKLQkJfQotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHpjb21tb25fc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgaWYgKHRjb21tb25fc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKLQkJICAKLQkJICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkJICAKLQkJICB0Y29tbW9uX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnRjb21tb24iLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdGNvbW1vbl9zZWN0aW9uLCBhcHBsaWNhYmxlCi0JCSAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfREFUQQotCQkJfCBTRUNfSEFTX0NPTlRFTlRTKSB8IFNFQ19JU19DT01NT04pOwotCQl9Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgdGNvbW1vbl9zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSB1c2UgdGhlIGRvdCwgc29tZSBkb24ndC4gIENhbiB3ZSBnZXQgc29tZSBjb25zaXN0ZW5jeT8/ICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJic3NcIiIsIDQpCi0JICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJkYXRhXCIiLCA1KSkKLQl7Ci0JICB3aGlsZSAoKi0taW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQkgICAgOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICBnb3RvIGJhZF9jb21tb25fc2VnbWVudDsKLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICciJykKLQk7Ci0gICAgICBnb3RvIGFsbG9jYXRlX2NvbW1vbjsKLSAgICB9Ci0KLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLQotICB7Ci0gIGJhZF9jb21tb25fc2VnbWVudDoKLSAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQotICAgICAgcCsrOwotICAgIGMgPSAqcDsKLSAgICAqcCA9ICdcMCc7Ci0gICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICpwID0gYzsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQKLXNldF9tYWNoaW5lIChpbnQgbnVtYmVyKQotewotICBtYWNoaW5lID0gbnVtYmVyOwotICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBUQVJHRVRfQVJDSCwgbWFjaGluZSk7Ci0KLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIDA6IHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGU6ICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRTsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZWE6IHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7InNkYXRhIiwgICB2ODUwX3NkYXRhLCAgIDB9LAotICB7InRkYXRhIiwgICB2ODUwX3RkYXRhLCAgIDB9LAotICB7InpkYXRhIiwgICB2ODUwX3pkYXRhLCAgIDB9LAotICB7InNic3MiLCAgICB2ODUwX3Nic3MsICAgIDB9LAotICB7InRic3MiLCAgICB2ODUwX3Ric3MsICAgIDB9LAotICB7Inpic3MiLCAgICB2ODUwX3pic3MsICAgIDB9LAotICB7InJvc2RhdGEiLCB2ODUwX3Jvc2RhdGEsIDB9LAotICB7InJvemRhdGEiLCB2ODUwX3JvemRhdGEsIDB9LAotICB7ImJzcyIsICAgICB2ODUwX2JzcywgICAgIDB9LAotICB7Im9mZnNldCIsICB2ODUwX29mZnNldCwgIDB9LAotICB7IndvcmQiLCAgICBjb25zLCAgICAgICAgIDR9LAotICB7Inpjb21tIiwgICB2ODUwX2NvbW0sICAgIEFSRUFfWkRBfSwKLSAgeyJzY29tbSIsICAgdjg1MF9jb21tLCAgICBBUkVBX1NEQX0sCi0gIHsidGNvbW0iLCAgIHY4NTBfY29tbSwgICAgQVJFQV9UREF9LAotICB7InY4NTAiLCAgICBzZXRfbWFjaGluZSwgIDB9LAotICB7ImNhbGxfdGFibGVfZGF0YSIsIHY4NTBfY2FsbF90YWJsZV9kYXRhLCAwfSwKLSAgeyJjYWxsX3RhYmxlX3RleHQiLCB2ODUwX2NhbGxfdGFibGVfdGV4dCwgMH0sCi0gIHsidjg1MGUiLCAgICAgICAgICAgc2V0X21hY2hpbmUsICAgICAgICAgIGJmZF9tYWNoX3Y4NTBlfSwKLSAgeyJ2ODUwZWEiLCAgICAgICAgICBzZXRfbWFjaGluZSwgICAgICAgICAgYmZkX21hY2hfdjg1MGVhfSwKLSAgeyBOVUxMLCAgICAgTlVMTCwgICAgICAgICAwfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnY4NTBfaGFzaDsKLQotLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImVwIiwgIDMwIH0sCQkvKiBlcCAtIGVsZW1lbnQgcHRyICovCi0gIHsgImdwIiwgICA0IH0sCQkvKiBncCAtIGdsb2JhbCBwdHIgKi8KLSAgeyAiaHAiLCAgIDIgfSwJCS8qIGhwIC0gaGFuZGxlciBzdGFjayBwdHIgKi8KLSAgeyAibHAiLCAgMzEgfSwJCS8qIGxwIC0gbGluayBwdHIgKi8KLSAgeyAicjAiLCAgIDAgfSwKLSAgeyAicjEiLCAgIDEgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAicjE2IiwgMTYgfSwKLSAgeyAicjE3IiwgMTcgfSwKLSAgeyAicjE4IiwgMTggfSwKLSAgeyAicjE5IiwgMTkgfSwKLSAgeyAicjIiLCAgIDIgfSwKLSAgeyAicjIwIiwgMjAgfSwKLSAgeyAicjIxIiwgMjEgfSwKLSAgeyAicjIyIiwgMjIgfSwKLSAgeyAicjIzIiwgMjMgfSwKLSAgeyAicjI0IiwgMjQgfSwKLSAgeyAicjI1IiwgMjUgfSwKLSAgeyAicjI2IiwgMjYgfSwKLSAgeyAicjI3IiwgMjcgfSwKLSAgeyAicjI4IiwgMjggfSwKLSAgeyAicjI5IiwgMjkgfSwKLSAgeyAicjMiLCAgIDMgfSwKLSAgeyAicjMwIiwgMzAgfSwKLSAgeyAicjMxIiwgMzEgfSwKLSAgeyAicjQiLCAgIDQgfSwKLSAgeyAicjUiLCAgIDUgfSwKLSAgeyAicjYiLCAgIDYgfSwKLSAgeyAicjciLCAgIDcgfSwKLSAgeyAicjgiLCAgIDggfSwKLSAgeyAicjkiLCAgIDkgfSwKLSAgeyAic3AiLCAgIDMgfSwJCS8qIHNwIC0gc3RhY2sgcHRyICovCi0gIHsgInRwIiwgICA1IH0sCQkvKiB0cCAtIHRleHQgcHRyICovCi0gIHsgInplcm8iLCAwIH0sCi19OwotI2RlZmluZSBSRUdfTkFNRV9DTlQJKHNpemVvZiAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHN5c3RlbV9yZWdpc3RlcnNbXSA9IAotewotICB7ICJjdGJwIiwgIDIwIH0sCi0gIHsgImN0cGMiLCAgMTYgfSwKLSAgeyAiY3Rwc3ciLCAxNyB9LAotICB7ICJkYnBjIiwgIDE4IH0sCi0gIHsgImRicHN3IiwgMTkgfSwKLSAgeyAiZWNyIiwgICAgNCB9LAotICB7ICJlaXBjIiwgICAwIH0sCi0gIHsgImVpcHN3IiwgIDEgfSwKLSAgeyAiZmVwYyIsICAgMiB9LAotICB7ICJmZXBzdyIsICAzIH0sCi0gIHsgInBzdyIsICAgIDUgfSwKLX07Ci0jZGVmaW5lIFNZU1JFR19OQU1FX0NOVAkoc2l6ZW9mIChzeXN0ZW1fcmVnaXN0ZXJzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBzeXN0ZW1fbGlzdF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsiUFMiLCAgICAgIDUgfSwKLSAgeyJTUiIsICAgICAgMCArIDF9Ci19OwotI2RlZmluZSBTWVNSRUdMSVNUX05BTUVfQ05UCShzaXplb2YgKHN5c3RlbV9saXN0X3JlZ2lzdGVycykgLyBzaXplb2YgKHN0cnVjdCByZWdfbmFtZSkpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgY2NfbmFtZXNbXSA9Ci17Ci0gIHsgImMiLCAgMHgxIH0sCi0gIHsgImUiLCAgMHgyIH0sCi0gIHsgImdlIiwgMHhlIH0sCi0gIHsgImd0IiwgMHhmIH0sCi0gIHsgImgiLCAgMHhiIH0sCi0gIHsgImwiLCAgMHgxIH0sCi0gIHsgImxlIiwgMHg3IH0sCi0gIHsgImx0IiwgMHg2IH0sCi0gIHsgIm4iLCAgMHg0IH0sCi0gIHsgIm5jIiwgMHg5IH0sCi0gIHsgIm5lIiwgMHhhIH0sCi0gIHsgIm5oIiwgMHgzIH0sCi0gIHsgIm5sIiwgMHg5IH0sCi0gIHsgIm5zIiwgMHhjIH0sCi0gIHsgIm52IiwgMHg4IH0sCi0gIHsgIm56IiwgMHhhIH0sCi0gIHsgInAiLCAgMHhjIH0sCi0gIHsgInMiLCAgMHg0IH0sCi0gIHsgInNhIiwgMHhkIH0sCi0gIHsgInQiLCAgMHg1IH0sCi0gIHsgInYiLCAgMHgwIH0sCi0gIHsgInoiLCAgMHgyIH0sCi19OwotI2RlZmluZSBDQ19OQU1FX0NOVAkoc2l6ZW9mIChjY19uYW1lcykgLyBzaXplb2YgKHN0cnVjdCByZWdfbmFtZSkpCi0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUKLSAgIHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAocmVncywgcmVnY291bnQsIG5hbWUsIGFjY2VwdF9udW1iZXJzKQotICAgICBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKiByZWdzOwotICAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZWdjb3VudDsKLSAgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgbmFtZTsKLSAgICAgYm9vbGVhbiAgICAgICAgICAgICAgICAgYWNjZXB0X251bWJlcnM7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLSAgc3ltYm9sUyAqIHN5bWJvbFA7Ci0KLSAgLyogSWYgdGhlIHJlZ2lzdGVyIG5hbWUgaXMgYSBzeW1ib2wsIHRoZW4gZXZhbHVhdGUgaXQuICAqLwotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSkpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBhbiBhbGlhcyBmb3IgYW5vdGhlciBuYW1lIHRoZW4gdXNlIHRoYXQuCi0JIElmIHRoZSBzeW1ib2wgaXMgYW4gYWxpYXMgZm9yIGEgbnVtYmVyLCB0aGVuIHJldHVybiB0aGUgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChzeW1ib2xfZXF1YXRlZF9wIChzeW1ib2xQKSkKLQl7Ci0JICBuYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW1ib2xQKS0+WF9hZGRfc3ltYm9sKTsKLQl9Ci0gICAgICBlbHNlIGlmIChhY2NlcHRfbnVtYmVycykKLQl7Ci0JICBpbnQgcmVnID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgCi0JICBpZiAocmVnID49IDAgJiYgcmVnIDw9IDMxKQotCSAgICByZXR1cm4gcmVnOwotCX0KLQotICAgICAgLyogT3RoZXJ3aXNlIGRyb3AgdGhyb3VnaCBhbmQgdHJ5IHBhcnNpbmcgbmFtZSBub3JtYWxseS4gICovCi0gICAgfQotICAKLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBpbnQgICAgcmVnX251bWJlcjsKLSAgY2hhciAqIG5hbWU7Ci0gIGNoYXIgKiBzdGFydDsKLSAgY2hhciAgIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMsIFJFR19OQU1FX0NOVCwKLQkJCQluYW1lLCBGQUxTRSk7Ci0KLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gIAotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCAgICAgICAgID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sICA9IE5VTEw7Ci0gICAgICAKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7Ci0gICAgICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2Ygc3lzdGVtX3JlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogIElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqICAgICAgZXhwcmVzc2lvblAgcG9pbnRzIHRvIGFuIGV4cHJlc3Npb24gc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBpbi4KLSAqICAgICAgYWNjZXB0X251bWJlcnMgaXMgdHJ1ZSBpZmYgbnVtZXJpY2FsIHJlZ2lzdGVyIG5hbWVzIG1heSBiZSB1c2VkLgotICogICAgICBhY2NlcHRfbGlzdF9uYW1lcyBpcyB0cnVlIGlmZiB0aGUgc3BlY2lhbCBuYW1lcyBQUyBhbmQgU1IgbWF5IGJlIAotICogICAgICBhY2NlcHRlZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMgc3RydWN0dXJlIGluIGV4cHJlc3Npb25QLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLXN5c3RlbV9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCwgYWNjZXB0X251bWJlcnMsIGFjY2VwdF9saXN0X25hbWVzKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotICAgICBib29sZWFuICAgICAgIGFjY2VwdF9udW1iZXJzOwotICAgICBib29sZWFuICAgICAgIGFjY2VwdF9saXN0X25hbWVzOwotewotICBpbnQgICAgcmVnX251bWJlcjsKLSAgY2hhciAqIG5hbWU7Ci0gIGNoYXIgKiBzdGFydDsKLSAgY2hhciAgIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoc3lzdGVtX3JlZ2lzdGVycywgU1lTUkVHX05BTUVfQ05ULCBuYW1lLAotCQkJCWFjY2VwdF9udW1iZXJzKTsKLQotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAKLSAgaWYgKHJlZ19udW1iZXIgPCAwCi0gICAgICAmJiBhY2NlcHRfbnVtYmVycykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgICA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLQotICAgICAgaWYgKGlzZGlnaXQgKCogaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICByZWdfbnVtYmVyID0gc3RydG9sIChpbnB1dF9saW5lX3BvaW50ZXIsICYgaW5wdXRfbGluZV9wb2ludGVyLCAxMCk7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSByZWdpc3RlciBudW1iZXIgaXMgYWxsb3dhYmxlLiAqLwotCSAgaWYgKCAgIHJlZ19udW1iZXIgPCAwCi0JCSB8fCByZWdfbnVtYmVyID4gNQotCQkgJiYgcmVnX251bWJlciA8IDE2Ci0JCSB8fCByZWdfbnVtYmVyID4gMjAKLQkJICkKLQkgICAgewotCSAgICAgIHJlZ19udW1iZXIgPSAtMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGFjY2VwdF9saXN0X25hbWVzKQotCXsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHN5c3RlbV9saXN0X3JlZ2lzdGVycywKLQkJCQkJU1lTUkVHTElTVF9OQU1FX0NOVCwgbmFtZSwgRkFMU0UpOwotCi0JICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotCX0KLSAgICB9Ci0gIAotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCAgICAgICAgID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sICA9IE5VTEw7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7Ci0gICAgICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgY2NfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWNjX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBpbnQgICAgcmVnX251bWJlcjsKLSAgY2hhciAqIG5hbWU7Ci0gIGNoYXIgKiBzdGFydDsKLSAgY2hhciAgIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoY2NfbmFtZXMsIENDX05BTUVfQ05ULCBuYW1lLCBGQUxTRSk7Ci0KLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wICAgICAgICAgPSBPX2NvbnN0YW50OwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgID0gTlVMTDsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsKLSAgICAgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNraXBfd2hpdGVfc3BhY2UgKHZvaWQpCi17Ci0gIHdoaWxlICggICAqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcKLQkgfHwgKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykKLSAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcGFyc2VfcmVnaXN0ZXJfbGlzdCAoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyICBwb2ludHMgdG8gMXN0IGNoYXIgb2YgYSBsaXN0IG9mIHJlZ2lzdGVycy4KLSAqICAgICBpbnNuICAgICAgICAgICAgICAgIGlzIHRoZSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQgaW5zdHJ1Y3Rpb24uCi0gKiAgICAgb3BlcmFuZCAgICAgICAgICAgICBpcyB0aGUgb3BlcmFuZCBiZWluZyBpbnNlcnRlZC4KLSAqCi0gKiBvdXQ6IE5VTEwgaWYgdGhlIHBhcnNlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSBhCi0gKiAgICAgIHBvaW50ZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZC4gIElmIHRoZSBwYXJzZQotICogICAgICBjb21wbGV0ZXMgdGhlIGNvcnJlY3QgYml0IGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb24KLSAqICAgICAgd2lsbCBiZSBmaWxsZWQgaW4uCi0gKgotICogUGFyc2VzIHJlZ2lzdGVyIGxpc3RzIHdpdGggdGhlIHN5bnRheDoKLSAqCi0gKiAgIHsgclggfQotICogICB7IHJYLCByWSB9Ci0gKiAgIHsgclggLSByWSB9Ci0gKiAgIHsgclggLSByWSwgclogfQotICogICBldGMKLSAqCi0gKiBhbmQgYWxzbyBwYXJzZXMgY29uc3RhbnQgZXB4cmVzc2lvbnMgd2hvZXMgYml0cyBpbmRpY2F0ZSB0aGUKLSAqIHJlZ2lzdGVycyBpbiB0aGUgbGlzdHMuICBUaGUgTFNCIGluIHRoZSBleHByZXNzaW9uIHJlZmVycyB0bwotICogdGhlIGxvd2VzdCBudW1iZXJlZCBwZXJtaXNzYWJsZSByZWdpc3RlciBpbiB0aGUgcmVnaXN0ZXIgbGlzdCwKLSAqIGFuZCBzbyBvbiB1cHdhcmRzLiAgU3lzdGVtIHJlZ2lzdGVycyBhcmUgY29uc2lkZXJlZCB0byBiZSB2ZXJ5Ci0gKiBoaWdoIG51bWJlcnMuCi0gKiAKLSAqLwotc3RhdGljIGNoYXIgKgotcGFyc2VfcmVnaXN0ZXJfbGlzdAotKAotICB1bnNpZ25lZCBsb25nICogICAgICAgICAgICAgaW5zbiwKLSAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQKLSkKLXsKLSAgc3RhdGljIGludCAgdHlwZTFfcmVnc1sgMzIgXSA9IHsgMzAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKLSAgc3RhdGljIGludCAgdHlwZTJfcmVnc1sgMzIgXSA9IHsgMTksIDE4LCAxNywgMTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKLSAgc3RhdGljIGludCAgdHlwZTNfcmVnc1sgMzIgXSA9IHsgIDMsICAyLCAgMSwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDE0LCAxNSwgMTMsIDEyLCAgNywgIDYsICA1LCAgNCwgMTEsIDEwLCAgOSwgIDggfTsKLSAgaW50ICogICAgICAgcmVnczsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0KLSAgLyogU2VsZWN0IGEgcmVnaXN0ZXIgYXJyYXkgdG8gcGFyc2UuICovCi0gIHN3aXRjaCAob3BlcmFuZC0+c2hpZnQpCi0gICAgewotICAgIGNhc2UgMHhmZmUwMDAwMTogcmVncyA9IHR5cGUxX3JlZ3M7IGJyZWFrOwotICAgIGNhc2UgMHhmZmY4MDAwZjogcmVncyA9IHR5cGUyX3JlZ3M7IGJyZWFrOwotICAgIGNhc2UgMHhmZmY4MDAxZjogcmVncyA9IHR5cGUzX3JlZ3M7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3BlcmFuZCBzaGlmdDogJXhcbiIpLCBvcGVyYW5kLT5zaGlmdCk7Ci0gICAgICByZXR1cm4gXygiaW50ZXJuYWwgZmFpbHVyZSBpbiBwYXJzZV9yZWdpc3Rlcl9saXN0Iik7Ci0gICAgfQotCi0gIHNraXBfd2hpdGVfc3BhY2UgKCk7Ci0KLSAgLyogSWYgdGhlIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggYSBjdXJseSBicmFjZSBpdCBpcyBhIHJlZ2lzdGVyIGxpc3QuCi0gICAgIE90aGVyd2lzZSBpdCBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24sIHdob2VzIGJpdHMgaW5kaWNhdGUgd2hpY2gKLSAgICAgcmVnaXN0ZXJzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4gICovCi0gIAotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgIT0gJ3snKQotICAgIHsKLSAgICAgIGludCBiaXRzOwotICAgICAgaW50IHJlZzsKLSAgICAgIGludCBpOwotCQkKLSAgICAgIGV4cHJlc3Npb24gKCYgZXhwKTsKLSAgICAgIAotICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JcmV0dXJuIF8oImNvbnN0YW50IGV4cHJlc3Npb24gb3IgcmVnaXN0ZXIgbGlzdCBleHBlY3RlZCIpOwotCi0gICAgICBpZiAocmVncyA9PSB0eXBlMV9yZWdzKQotCXsKLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgMHhGRkZGRjAwMCkKLQkgICAgcmV0dXJuIF8oImhpZ2ggYml0cyBzZXQgaW4gcmVnaXN0ZXIgbGlzdCBleHByZXNzaW9uIik7Ci0JICAKLQkgIGZvciAocmVnID0gMjA7IHJlZyA8IDMyOyByZWcgKyspCi0JICAgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgKHJlZyAtIDIwKSkpCi0JICAgICAgewotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJICBpZiAocmVnc1tpXSA9PSByZWcpCi0JCSAgICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JICAgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHJlZ3MgPT0gdHlwZTJfcmVncykKLQl7Ci0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmIDB4RkZGRTAwMDApCi0JICAgIHJldHVybiBfKCJoaWdoIGJpdHMgc2V0IGluIHJlZ2lzdGVyIGxpc3QgZXhwcmVzc2lvbiIpOwotCSAgCi0JICBmb3IgKHJlZyA9IDE7IHJlZyA8IDE2OyByZWcgKyspCi0JICAgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgKHJlZyAtIDEpKSkKLQkgICAgICB7Ci0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkgIGlmIChyZWdzW2ldID09IHJlZykKLQkJICAgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkgICAgICB9Ci0KLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgMTUpKQotCSAgICAqIGluc24gfD0gKDEgPDwgMyk7Ci0JICAKLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgMTYpKQotCSAgICAqIGluc24gfD0gKDEgPDwgMTkpOwotCX0KLSAgICAgIGVsc2UgLyogcmVncyA9PSB0eXBlM19yZWdzICovCi0JewotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAweEZGRkUwMDAwKQotCSAgICByZXR1cm4gXygiaGlnaCBiaXRzIHNldCBpbiByZWdpc3RlciBsaXN0IGV4cHJlc3Npb24iKTsKLQkgIAotCSAgZm9yIChyZWcgPSAxNjsgcmVnIDwgMzI7IHJlZyArKykKLQkgICAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAocmVnIC0gMTYpKSkKLQkgICAgICB7Ci0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkgIGlmIChyZWdzW2ldID09IHJlZykKLQkJICAgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkgICAgICB9Ci0KLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgMTYpKQotCSAgICAqIGluc24gfD0gKDEgPDwgMTkpOwotCX0KLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLQotICAvKiBQYXJzZSB0aGUgcmVnaXN0ZXIgbGlzdCB1bnRpbCBhIHRlcm1pbmF0b3IgKGNsb3NpbmcgY3VybHkgYnJhY2Ugb3IKLSAgICAgbmV3LWxpbmUpIGlzIGZvdW5kLiAgKi8KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpZiAocmVnaXN0ZXJfbmFtZSAoJiBleHApKQotCXsKLQkgIGludCAgaTsKLQkgIAotCSAgLyogTG9jYXRlIHRoZSBnaXZlbiByZWdpc3RlciBpbiB0aGUgbGlzdCwgYW5kIGlmIGl0IGlzIHRoZXJlLAotCSAgICAgaW5zZXJ0IHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChyZWdzWyBpIF0gPT0gZXhwLlhfYWRkX251bWJlcikKLQkJewotCQkgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpID09IDMyKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIF8oImlsbGVnYWwgcmVnaXN0ZXIgaW5jbHVkZWQgaW4gbGlzdCIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3lzdGVtX3JlZ2lzdGVyX25hbWUgKCYgZXhwLCB0cnVlLCB0cnVlKSkKLQl7Ci0JICBpZiAocmVncyA9PSB0eXBlMV9yZWdzKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIF8oInN5c3RlbSByZWdpc3RlcnMgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwLlhfYWRkX251bWJlciA9PSA1KQotCSAgICB7Ci0JICAgICAgaWYgKHJlZ3MgPT0gdHlwZTJfcmVncykKLQkJcmV0dXJuIF8oIlBTVyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIpOwotCSAgICAgIGVsc2UKLQkJKiBpbnNuIHw9IDB4ODsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwLlhfYWRkX251bWJlciA8IDQpCi0JICAgICogaW5zbiB8PSAweDgwMDAwOwotCSAgZWxzZQotCSAgICByZXR1cm4gXygiSGlnaCB2YWx1ZSBzeXN0ZW0gcmVnaXN0ZXJzIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JfQotICAgICAgZWxzZSBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJ30nKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0JewotCSAgLyogV2UgaGF2ZSBlbmNvdW50ZXJlZCBhIHJhbmdlIG9mIHJlZ2lzdGVyczogclggLSByWSAqLwotCSAgaW50ICAgICAgICAgajsKLQkgIGV4cHJlc3Npb25TIGV4cDI7Ci0KLQkgIC8qIFNraXAgdGhlIGRhc2guICAqLwotCSAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotCi0JICAvKiBHZXQgdGhlIHNlY29uZCByZWdpc3RlciBpbiB0aGUgcmFuZ2UuICAqLwotCSAgaWYgKCEgcmVnaXN0ZXJfbmFtZSAoJiBleHAyKSkKLQkgICAgewotCSAgICAgIHJldHVybiBfKCJzZWNvbmQgcmVnaXN0ZXIgc2hvdWxkIGZvbGxvdyBkYXNoIGluIHJlZ2lzdGVyIGxpc3QiKTsKLQkgICAgICBleHAyLlhfYWRkX251bWJlciA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JICAgIH0KLQotCSAgLyogQWRkIHRoZSByZXN0IG9mIHRoZSByZWdpc3RlcnMgaW4gdGhlIHJhbmdlLiAgKi8KLQkgIGZvciAoaiA9IGV4cC5YX2FkZF9udW1iZXIgKyAxOyBqIDw9IGV4cDIuWF9hZGRfbnVtYmVyOyBqKyspCi0JICAgIHsKLQkgICAgICBpbnQgIGk7Ci0JICAKLQkgICAgICAvKiBMb2NhdGUgdGhlIGdpdmVuIHJlZ2lzdGVyIGluIHRoZSBsaXN0LCBhbmQgaWYgaXQgaXMgdGhlcmUsCi0JCSBpbnNlcnQgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJewotCQkgIGlmIChyZWdzWyBpIF0gPT0gaikKLQkJICAgIHsKLQkJICAgICAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGkgPT0gMzIpCi0JCXJldHVybiBfKCJpbGxlZ2FsIHJlZ2lzdGVyIGluY2x1ZGVkIGluIGxpc3QiKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHNraXBfd2hpdGVfc3BhY2UgKCk7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1DT05TVCBjaGFyICogbWRfc2hvcnRvcHRzID0gIm06IjsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIG1kX2xvbmdvcHRzOyAKLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKiBzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiIFY4NTAgb3B0aW9uczpcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1td2Fybi1zaWduZWQtb3ZlcmZsb3cgICAgV2FybiBpZiBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvd1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW13YXJuLXVuc2lnbmVkLW92ZXJmbG93ICBXYXJuIGlmIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3dcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MCAgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MGUgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBlXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXY4NTBlYSAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwZWFcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MGFueSAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgZ2VuZXJpYywgZGVzcGl0ZSBhbnkgcHJvY2Vzc29yIHNwZWNpZmljIGluc3RydWN0aW9uc1xuIikpOwotfQotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgICAgYzsKLSAgICAgY2hhciAqIGFyZzsKLXsKLSAgaWYgKGMgIT0gJ20nKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gY29tbWFuZCBsaW5lIG9wdGlvbjogLSVjJXNcbiIpLCBjLCBhcmcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKGFyZywgIndhcm4tc2lnbmVkLW92ZXJmbG93IikgPT0gMCkKLSAgICB7Ci0gICAgICB3YXJuX3NpZ25lZF9vdmVyZmxvd3MgPSBUUlVFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ3YXJuLXVuc2lnbmVkLW92ZXJmbG93IikgPT0gMCkKLSAgICB7Ci0gICAgICB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cyA9IFRSVUU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTAiKSA9PSAwKQotICAgIHsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAidjg1MGUiKSA9PSAwKQotICAgIHsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF92ODUwZTsKLSAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2ODUwZWEiKSA9PSAwKQotICAgIHsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF92ODUwZWE7Ci0gICAgICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRUE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTBhbnkiKSA9PSAwKQotICAgIHsKLSAgICAgIG1hY2hpbmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogVGVsbCB0aGUgd29ybGQgdGhhdCB0aGlzIGlzIGZvciBhbnkgdjg1MCBjaGlwLiAgKi8KLSAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsgLyogQnV0IHN1cHBvcnQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZXh0ZW5kZWQgdmVyc2lvbnMuICAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gY29tbWFuZCBsaW5lIG9wdGlvbjogLSVjJXNcbiIpLCBjLCBhcmcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqIG5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICBpbnQgICAgdHlwZTsKLSAgY2hhciAqIGxpdHA7Ci0gIGludCAqICBzaXplcDsKLXsKLSAgaW50ICAgICAgICAgICAgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKiAgICAgICAgIHQ7Ci0gIGludCAgICAgICAgICAgIGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVwID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotICAKLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVwID0gcHJlYyAqIDI7Ci0KLSAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotICAgICAgbGl0cCArPSAyOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKiBWZXJ5IGdyb3NzLiAgKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICogICAgICBhYmZkOwotICBhc2VjdGlvbiAqIHNlYzsKLSAgZnJhZ1MgKiAgICBmcmFnUDsKLXsKLSAgc3Vic2VnX2NoYW5nZSAoc2VjLCAwKTsKLSAgCi0gIC8qIEluIHJhbmdlIGNvbmRpdGlvbmFsIG9yIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDAgfHwgZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMikKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1VOVVNFRCArIChpbnQpZnJhZ1AtPmZyX29wY29kZSk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIC8qIE91dCBvZiByYW5nZSBjb25kaXRpb25hbCBicmFuY2guICBFbWl0IGEgYnJhbmNoIGFyb3VuZCBhIGp1bXAuICAqLwotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IAotCSh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOwotCi0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBidWZmZXJbMF0gXj0gMHgwODsKLSAgICAgIC8qIE1hc2sgb2ZmIGFsbCB0aGUgZGlzcGxhY2VtZW50IGJpdHMuICAqLwotICAgICAgYnVmZmVyWzBdICY9IDB4OGY7Ci0gICAgICBidWZmZXJbMV0gJj0gMHgwNzsKLSAgICAgIC8qIE5vdyBzZXQgdGhlIGRpc3BsYWNlbWVudCBiaXRzIHNvIHRoYXQgd2UgYnJhbmNoCi0JIGFyb3VuZCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgYnVmZmVyWzBdIHw9IDB4MzA7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlIGZpbmFsCi0JIHRhcmdldC4gICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlciArIDIsIDB4MDAwMDA3ODAsIDQpOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfVU5VU0VEICsKLQkgICAgICAgKGludCkgZnJhZ1AtPmZyX29wY29kZSArIDEpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7Ci0gICAgfQotICAvKiBPdXQgb2YgcmFuZ2UgdW5jb25kaXRpb25hbCBicmFuY2guICBFbWl0IGEganVtcC4gICovCi0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwsIDB4MDAwMDA3ODAsIDQpOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19VTlVTRUQgKwotCSAgICAgICAoaW50KSBmcmFnUC0+ZnJfb3Bjb2RlICsgMSk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICogc2VnOwotICAgICB2YWx1ZVQgICAgIGFkZHI7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfbmFtZSA9ICIiOwotICByZWdpc3RlciBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiBvcDsKLSAgZmxhZ3dvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZTsKLQotICBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgInY4NTBlYSIsIDYpID09IDApCi0gICAgewotICAgICAgaWYgKG1hY2hpbmUgPT0gLTEpCi0JbWFjaGluZSA9IGJmZF9tYWNoX3Y4NTBlYTsKLSAgICAgIAotICAgICAgaWYgKHByb2Nlc3Nvcl9tYXNrID09IC0xKQotCXByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJ2ODUwZSIsIDUpID09IDApCi0gICAgewotICAgICAgaWYgKG1hY2hpbmUgPT0gLTEpCi0JbWFjaGluZSAgICAgICAgPSBiZmRfbWFjaF92ODUwZTsKLSAgICAgIAotICAgICAgaWYgKHByb2Nlc3Nvcl9tYXNrID09IC0xKQotCXByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFOwotICAgIH0KLSAgZWxzZQotICBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgInY4NTAiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtYWNoaW5lID09IC0xKQotCW1hY2hpbmUgICAgICAgID0gMDsKLSAgICAgIAotICAgICAgaWYgKHByb2Nlc3Nvcl9tYXNrID09IC0xKQotCXByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTA7Ci0gICAgfQotICBlbHNlCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBhc19iYWQgKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgZGVmYXVsdCB0YXJnZXQgcHJvY2Vzc29yIGZyb20gc3RyaW5nOiAlcyIpLCAKLSAgICAgICAgICAgIFRBUkdFVF9DUFUpOwotCi0gIHY4NTBfaGFzaCA9IGhhc2hfbmV3KCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgVjg1MCBpbnN0cnVjdGlvbiBzZXQKLSAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKLSAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bwotICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLSAgb3AgPSB2ODUwX29wY29kZXM7Ci0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wLT5uYW1lKSkgCi0JewotCSAgcHJldl9uYW1lID0gKGNoYXIgKikgb3AtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAodjg1MF9oYXNoLCBvcC0+bmFtZSwgKGNoYXIgKikgb3ApOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBtYWNoaW5lKTsKLQotICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLSAgCi0gIGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5jYWxsX3RhYmxlX2RhdGEiLCAwKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uLAotCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCQkgICAgICAgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgCi0gIGNhbGxfdGFibGVfdGV4dF9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5jYWxsX3RhYmxlX3RleHQiLCAwKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGNhbGxfdGFibGVfdGV4dF9zZWN0aW9uLAotCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkKLQkJCQkgICAgICAgfCBTRUNfQ09ERSkpOwotICAKLSAgLyogUmVzdG9yZSB0ZXh0IHNlY3Rpb24gYXMgdGhlIGN1cnJlbnQgZGVmYXVsdC4gICovCi0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotaGFuZGxlX2N0b2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQgPT0gTlVMTCkKLSAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUOwotCi0gIGlmICggICBvcGVyYW5kLT5iaXRzICAhPSA2Ci0gICAgICB8fCBvcGVyYW5kLT5zaGlmdCAhPSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY3RvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0gICAgfQotICAgICAgCi0gIHJldHVybiBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1oYW5kbGVfc2Rhb2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAxNSAmJiBvcGVyYW5kLT5zaGlmdCA9PSAxNykgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQ7Ci0gIGlmIChvcGVyYW5kLT5iaXRzID09IC0xKSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDsKLSAgCi0gIGlmICggICBvcGVyYW5kLT5iaXRzICAhPSAxNgotICAgICAgfHwgb3BlcmFuZC0+c2hpZnQgIT0gMTYpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0gICAgfQotICAKLSAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQ7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWhhbmRsZV96ZGFvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQ7Ci0gIGlmIChvcGVyYW5kLT5iaXRzID09IDE1ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDE3KSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUOwotCi0gIGlmICggICBvcGVyYW5kLT5iaXRzICAhPSAxNgotICAgICAgfHwgb3BlcmFuZC0+c2hpZnQgIT0gMTYpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ6ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0gICAgfQotICAKLSAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQ7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWhhbmRsZV90ZGFvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQ7ICAvKiBkYXRhIGl0ZW0sIG5vdCBhbiBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzID09IDYgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMSkgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVDsgIC8qIHNsZC53L3NzdC53LCBvcGVyYW5kOiBEOF82ICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSA0ICYmIG9wZXJhbmQtPmluc2VydCAhPSBOVUxMKSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQ7ICAvKiBzbGQuaHUsIG9wZXJhbmQ6IEQ1LTQgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gNCAmJiBvcGVyYW5kLT5pbnNlcnQgPT0gTlVMTCkgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VUOyAgLyogc2xkLmJ1LCBvcGVyYW5kOiBENCAgICovCi0gIGlmIChvcGVyYW5kLT5iaXRzID09IDE2ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDE2KSAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOyAvKiBzZXQxICYgY2h1bXMsIG9wZXJhbmRzOiBEMTYgKi8KLSAgCi0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ0ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0gICAgfQotICAKLSAgcmV0dXJuICBvcGVyYW5kLT5pbnNlcnQgIT0gTlVMTAotICAgID8gQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQgICAgIC8qIHNsZC5oL3NzdC5oLCBvcGVyYW5kOiBEOF83ICovCi0gICAgOiBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVDsgICAgLyogc2xkLmIvc3N0LmIsIG9wcmVhbmQ6IEQ3ICAgKi8KLX0KLQotLyogV2FybmluZzogVGhlIGNvZGUgaW4gdGhpcyBmdW5jdGlvbiByZWxpZXMgdXBvbiB0aGUgZGVmaW5pdGlvbnMKLSAgIGluIHRoZSB2ODUwX29wZXJhbmRzW10gYXJyYXkgKGRlZmluZWQgaW4gb3Bjb2Rlcy92ODUwLW9wYy5jKQotICAgbWF0Y2hpbmcgdGhlIGhhcmQgY29kZWQgdmFsdWVzIGNvbnRhaW5lZCBoZXJlaW4uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi12ODUwX3JlbG9jX3ByZWZpeCAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGJvb2xlYW4gcGFyZW5fc2tpcHBlZCA9IGZhbHNlOwotCi0KLSAgLyogU2tpcCBsZWFkaW5nIG9wZW5pbmcgcGFyZW50aGVzaXMuICAqLwotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJygnKQotICAgIHsKLSAgICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHBhcmVuX3NraXBwZWQgPSB0cnVlOwotICAgIH0KLQotI2RlZmluZSBDSEVDS18obmFtZSwgcmVsb2MpIAkJCQkJCVwKLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgbmFtZSMjIigiLCBzdHJsZW4gKG5hbWUpICsgMSkgPT0gMCkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc3RybGVuIChuYW1lKTsJCQkJXAotICAgICAgcmV0dXJuIHJlbG9jOwkJCQkJCQlcCi0gICAgfQotICAKLSAgQ0hFQ0tfICgiaGkwIiwgICAgQkZEX1JFTE9DX0hJMTYpOwotICBDSEVDS18gKCJoaSIsICAgICBCRkRfUkVMT0NfSEkxNl9TKTsKLSAgQ0hFQ0tfICgibG8iLCAgICAgQkZEX1JFTE9DX0xPMTYpOwotICBDSEVDS18gKCJzZGFvZmYiLCBoYW5kbGVfc2Rhb2ZmIChvcGVyYW5kKSk7Ci0gIENIRUNLXyAoInpkYW9mZiIsIGhhbmRsZV96ZGFvZmYgKG9wZXJhbmQpKTsKLSAgQ0hFQ0tfICgidGRhb2ZmIiwgaGFuZGxlX3RkYW9mZiAob3BlcmFuZCkpOwotICBDSEVDS18gKCJoaWxvIiwgICBCRkRfUkVMT0NfMzIpOwotICBDSEVDS18gKCJjdG9mZiIsICBoYW5kbGVfY3RvZmYgKG9wZXJhbmQpKTsKLSAgCi0gIC8qIFJlc3RvcmUgc2tpcHBlZCBwYXJlbnRoZXNpcy4gICovCi0gIGlmIChwYXJlbl9za2lwcGVkKQotICAgIC0tIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgCi0gIHJldHVybiBCRkRfUkVMT0NfVU5VU0VEOwotfQotCi0vKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXY4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSwgc3RyKQotICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgICAgICAgICAgICAgICAgICAgICB2YWw7Ci0gICAgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgbGluZTsKLSAgICAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIHN0cjsKLXsKLSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogbWVzc2FnZSA9IE5VTEw7Ci0gICAgICAKLSAgICAgIGluc24gPSBvcGVyYW5kLT5pbnNlcnQgKGluc24sIHZhbCwgJiBtZXNzYWdlKTsKLSAgICAgIGlmIChtZXNzYWdlICE9IE5VTEwpCi0JewotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JICAgICAgJiYgISB3YXJuX3NpZ25lZF9vdmVyZmxvd3MKLQkgICAgICAmJiBzdHJzdHIgKG1lc3NhZ2UsICJvdXQgb2YgcmFuZ2UiKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogc2tpcCB3YXJuaW5nLi4uICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpID09IDAKLQkJICAgJiYgISB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cwotCQkgICAmJiBzdHJzdHIgKG1lc3NhZ2UsICJvdXQgb2YgcmFuZ2UiKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogc2tpcCB3YXJuaW5nLi4uICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cikKLQkgICAgewotCSAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JCWFzX3dhcm4gKCIlczogJXMiLCBzdHIsIG1lc3NhZ2UpOwotCSAgICAgIGVsc2UKLQkJYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgIiVzOiAlcyIsIHN0ciwgbWVzc2FnZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JCWFzX3dhcm4gKG1lc3NhZ2UpOwotCSAgICAgIGVsc2UKLQkJYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgbWVzc2FnZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gMzIpCi0JewotCSAgbG9uZyAgICBtaW4sIG1heDsKLQkgIG9mZnNldFQgdGVzdDsKLQotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISB3YXJuX3NpZ25lZF9vdmVyZmxvd3MpCi0JCW1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgICAgICBlbHNlCi0JCW1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgICAgICAKLQkgICAgICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICAgICAgCi0JICAgICAgaWYgKCEgd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MpCi0JCW1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JICAgICAgZWxzZQotCQltaW4gPSAwOwotCSAgICB9Ci0JICAKLQkgIGlmICh2YWwgPCAob2Zmc2V0VCkgbWluIHx8IHZhbCA+IChvZmZzZXRUKSBtYXgpCi0JICAgIHsKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIGNvbnN0IGNoYXIgKiBlcnIgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0JICAgICAgY2hhciAgICAgICAgIGJ1ZlsxMDBdOwotCSAgICAgIAotCSAgICAgIC8qIFJlc3RvcmUgbWluIGFuZCBtaXggdG8gZXhwZWN0ZWQgdmFsdWVzIGZvciBkZWNpbWFsIHJhbmdlcy4gICovCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JCSAgJiYgISB3YXJuX3NpZ25lZF9vdmVyZmxvd3MpCi0JCW1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQotCSAgICAgIGlmICghIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JCSAgJiYgISB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cykKLQkJbWluID0gMDsKLQotCSAgICAgIGlmIChzdHIpCi0JCXsKLQkJICBzcHJpbnRmIChidWYsICIlczogIiwgc3RyKTsKLQkJICAKLQkJICBzcHJpbnRfdmFsdWUgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgdmFsKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJc3ByaW50X3ZhbHVlIChidWYsIHZhbCk7Ci0JICAgICAgCi0JICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLQkJYXNfd2FybiAoZXJyLCBidWYsIG1pbiwgbWF4KTsKLQkgICAgICBlbHNlCi0JCWFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc24gfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLSAgICB9Ci0gIAotICByZXR1cm4gaW5zbjsKLX0KLQotDAotc3RhdGljIGNoYXIgICAgICAgICAgICAgICAgIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24gWzEyOF07Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpIAotICAgICBjaGFyICogc3RyOwotewotICBjaGFyICogICAgICAgICAgICAgICAgICAgIHM7Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRfb2Zfb3BlcmFuZHM7Ci0gIHN0cnVjdCB2ODUwX29wY29kZSAqICAgICAgb3Bjb2RlOwotICBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiAgICAgIG5leHRfb3Bjb2RlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogICAgIG9waW5kZXhfcHRyOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIG5leHRfb3BpbmRleDsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICByZWxheGFibGU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBpbnNuX3NpemU7Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgZjsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICBpOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOwotICBib29sZWFuICAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IGZhbHNlOwotICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGFfbGVuOwotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgIGV4dHJhX2RhdGE7Ci0gIGNoYXIgKgkJICAgIHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAKLSAgc3RybmNweSAoY29weV9vZl9pbnN0cnVjdGlvbiwgc3RyLCBzaXplb2YgKGNvcHlfb2ZfaW5zdHJ1Y3Rpb24pIC0gMSk7Ci0gIAotICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQotICAgIGNvbnRpbnVlOwotICAKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgKnMrKyA9ICdcMCc7Ci0KLSAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovCi0gIG9wY29kZSA9IChzdHJ1Y3Qgdjg1MF9vcGNvZGUgKikgaGFzaF9maW5kICh2ODUwX2hhc2gsIHN0cik7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHIgPSBzOwotICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotICAgICsrIHN0cjsKLQotICBzdGFydF9vZl9vcGVyYW5kcyA9IHN0cjsKLQotICBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIAotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBlcnJtc2cgPSBOVUxMOwotCi0gICAgICBtYXRjaCA9IDA7Ci0gICAgICAKLSAgICAgIGlmICgob3Bjb2RlLT5wcm9jZXNzb3JzICYgcHJvY2Vzc29yX21hc2spID09IDApCi0JewotCSAgZXJybXNnID0gXygiVGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgaW5zdHJ1Y3Rpb24uIik7Ci0JICBnb3RvIGVycm9yOwotCX0KLSAgICAgIAotICAgICAgcmVsYXhhYmxlID0gMDsKLSAgICAgIGZjID0gMDsKLSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0gICAgICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0gICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSBmYWxzZTsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyID0gc3RhcnRfb2Zfb3BlcmFuZHM7Ci0KLSAgICAgIGZvciAob3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleF9wdHIgIT0gMDsgb3BpbmRleF9wdHIgKyspCi0JewotCSAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7Ci0JICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgaG9sZDsKLQkgIGV4cHJlc3Npb25TICAgICAgICAgICAgICAgICBleDsKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgICByZWxvYzsKLQotCSAgaWYgKG5leHRfb3BpbmRleCA9PSAwKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICYgdjg1MF9vcGVyYW5kc1sgKiBvcGluZGV4X3B0ciBdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvcGVyYW5kICAgICAgPSAmIHY4NTBfb3BlcmFuZHNbIG5leHRfb3BpbmRleCBdOwotCSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0JICAgIH0KLQotCSAgZXJybXNnID0gTlVMTDsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnIHx8ICpzdHIgPT0gJ1snIHx8ICpzdHIgPT0gJ10nKQotCSAgICArKyBzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUxBWCkKLQkgICAgcmVsYXhhYmxlID0gMTsKLQotCSAgLyogR2F0aGVyIHRoZSBvcGVyYW5kLiAqLwotCSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQkgIAotCSAgLyogbG8oKSwgaGkoKSwgaGkwKCksIGV0Yy4uLiAqLwotCSAgaWYgKChyZWxvYyA9IHY4NTBfcmVsb2NfcHJlZml4IChvcGVyYW5kKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBmYWtlIHJlbG9jLCB1c2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0JICAgICAgaWYgKHJlbG9jID09IEJGRF9SRUxPQ182NCkKLQkJewotCQkgIG1hdGNoID0gMTsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JCSAKLQkgICAgICBleHByZXNzaW9uICgmIGV4KTsKLQotCSAgICAgIGlmIChleC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBzd2l0Y2ggKHJlbG9jKQotCQkgICAgewotCQkgICAgY2FzZSBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotCQkgICAgICAvKiBUbyBjb3BlIHdpdGggIm5vdDEgNywgemRhb2ZmKDB4ZmZmZmYwMDYpW3IwXSIKLQkJCSBhbmQgdGhlIGxpa2UuICAqLwotCQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCQkgICAgICAKLQkJICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0JCSAgICAgIHsKLQkJCS8qIFRydW5jYXRlLCB0aGVuIHNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4gICovCi0JCQlleC5YX2FkZF9udW1iZXIgPSBTRVhUMTYgKGV4LlhfYWRkX251bWJlcik7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCi0JCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotCQkgICAgICB7Ci0JCQkvKiBUcnVuY2F0ZSwgdGhlbiBzaWduIGV4dGVuZCB0aGUgdmFsdWUuICAqLwotCQkJZXguWF9hZGRfbnVtYmVyID0gU0VYVDE2IChleC5YX2FkZF9udW1iZXIgPj4gMTYpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCQkgICAgICB7Ci0JCQkvKiBUcnVuY2F0ZSwgdGhlbiBzaWduIGV4dGVuZCB0aGUgdmFsdWUuICAqLwotCQkgICAgICAgIGludCB0ZW1wID0gKGV4LlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0KLQkJCXRlbXAgKz0gKGV4LlhfYWRkX251bWJlciA+PiAxNSkgJiAxOwotCi0JCQlleC5YX2FkZF9udW1iZXIgPSBTRVhUMTYgKHRlbXApOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIAotCQkgICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0JCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUzMikgPT0gMCkKLQkJCXsKLQkJCSAgZXJybXNnID0gXygiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIik7Ci0JCQkgIGdvdG8gZXJyb3I7Ci0JCQl9Ci0JCSAgICAgIAotCQkgICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOwotCQkgICAgICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSA0OwotCQkgICAgICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7Ci0JCSAgICAgIGV4LlhfYWRkX251bWJlciAgICAgICA9IDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgICAKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInJlbG9jOiAlZFxuIiwgcmVsb2MpOwotCQkgICAgICBhc19iYWQgKF8oIkFBQVJHIC0+IHVuaGFuZGxlZCBjb25zdGFudCByZWxvYyIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBpZiAoZmMgPiBNQVhfSU5TTl9GSVhVUFMpCi0JCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCQkgIAotCQkgIGZpeHVwc1sgZmMgXS5leHAgICAgID0gZXg7Ci0JCSAgZml4dXBzWyBmYyBdLm9waW5kZXggPSAqIG9waW5kZXhfcHRyOwotCQkgIGZpeHVwc1sgZmMgXS5yZWxvYyAgID0gcmVsb2M7Ci0JCSAgZmMrKzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChyZWxvYyA9PSBCRkRfUkVMT0NfMzIpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUzMikgPT0gMCkKLQkJCXsKLQkJCSAgZXJybXNnID0gXygiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIik7Ci0JCQkgIGdvdG8gZXJyb3I7Ci0JCQl9Ci0JCSAgICAgIAotCQkgICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOwotCQkgICAgICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSA0OwotCQkgICAgICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7Ci0JCSAgICB9Ci0JCSAgICAgIAotCQkgIGlmIChmYyA+IE1BWF9JTlNOX0ZJWFVQUykKLQkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkJICBmaXh1cHNbIGZjIF0uZXhwICAgICA9IGV4OwotCQkgIGZpeHVwc1sgZmMgXS5vcGluZGV4ID0gKiBvcGluZGV4X3B0cjsKLQkJICBmaXh1cHNbIGZjIF0ucmVsb2MgICA9IHJlbG9jOwotCQkgIGZjKys7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXJybXNnID0gTlVMTDsKLQkgICAgICAKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykgIT0gMCkgCi0JCXsKLQkJICBpZiAoIXJlZ2lzdGVyX25hbWUgKCYgZXgpKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIG5hbWUiKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX05PVF9SMCkKLQkJICAgICAgJiYgZXguWF9hZGRfbnVtYmVyID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oInJlZ2lzdGVyIHIwIGNhbm5vdCBiZSB1c2VkIGhlcmUiKTsKLQkJICAgICAgCi0JCSAgICAgIC8qIEZvcmNlIGFuIGVycm9yIG1lc3NhZ2UgdG8gYmUgZ2VuZXJhdGVkIGJ5Ci0JCQkgc2tpcHBpbmcgb3ZlciBhbnkgZm9sbG93aW5nIHBvdGVudGlhbCBtYXRjaGVzCi0JCQkgZm9yIHRoaXMgb3Bjb2RlLiAgKi8KLQkJICAgICAgb3Bjb2RlICs9IDM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU1JHKSAhPSAwKSAKLQkJewotCQkgIGlmICghc3lzdGVtX3JlZ2lzdGVyX25hbWUgKCYgZXgsIHRydWUsIGZhbHNlKSkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygiaW52YWxpZCBzeXN0ZW0gcmVnaXN0ZXIgbmFtZSIpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX0VQKSAhPSAwKQotCQl7Ci0JCSAgY2hhciAqIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgIGNoYXIgICBjICAgICA9IGdldF9zeW1ib2xfZW5kICgpOwotCQkgIAotCQkgIGlmIChzdHJjbXAgKHN0YXJ0LCAiZXAiKSAhPSAwICYmIHN0cmNtcCAoc3RhcnQsICJyMzAiKSAhPSAwKQotCQkgICAgewotCQkgICAgICAvKiBQdXQgdGhpbmdzIGJhY2sgdGhlIHdheSB3ZSBmb3VuZCB0aGVtLiAgKi8KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwotCQkgICAgICBlcnJtc2cgPSBfKCJleHBlY3RlZCBFUCByZWdpc3RlciIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIAotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIAotCQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJyB8fCAqc3RyID09ICdbJyB8fCAqc3RyID09ICddJykKLQkJICAgICsrIHN0cjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9DQykgIT0gMCkgCi0JCXsKLQkJICBpZiAoIWNjX25hbWUgKCYgZXgpKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIGNvbmRpdGlvbiBjb2RlIG5hbWUiKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfUFVTSF9QT1ApIAotCQl7Ci0JCSAgZXJybXNnID0gcGFyc2VfcmVnaXN0ZXJfbGlzdCAoJiBpbnNuLCBvcGVyYW5kKTsKLQkJICAKLQkJICAvKiBUaGUgcGFyc2VfcmVnaXN0ZXJfbGlzdCgpIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGRvbmUKLQkJICAgICBldmVyeXRoaW5nLCBzbyBmYWtlIGEgZHVtbXkgZXhwcmVzc2lvbi4gICovCi0JCSAgZXguWF9vcCAgICAgICAgID0gT19jb25zdGFudDsKLQkJICBleC5YX2FkZF9udW1iZXIgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUxNikgCi0JCXsKLQkJICBleHByZXNzaW9uICgmIGV4KTsKLQotCQkgIGlmIChleC5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICBlcnJtc2cgPSBfKCJjb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JCSAgZWxzZSBpZiAoZXguWF9hZGRfbnVtYmVyICYgMHhmZmZmMDAwMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGV4LlhfYWRkX251bWJlciAmIDB4ZmZmZikKLQkJCWVycm1zZyA9IF8oImNvbnN0YW50IHRvbyBiaWcgdG8gZml0IGludG8gaW5zdHJ1Y3Rpb24iKTsKLQkJICAgICAgZWxzZSBpZiAoKGluc24gJiAweDAwMWZmZmMwKSA9PSAweDAwMTMwNzgwKQotCQkJZXguWF9hZGRfbnVtYmVyID4+PSAxNjsKLQkJICAgICAgZWxzZQotCQkJZXJybXNnID0gXygiY29uc3RhbnQgdG9vIGJpZyB0byBmaXQgaW50byBpbnN0cnVjdGlvbiIpOwotCQkgICAgfQotCQkgIAotCQkgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IHRydWU7Ci0JCSAgZXh0cmFfZGF0YV9sZW4gICAgICAgID0gMjsKLQkJICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7Ci0JCSAgZXguWF9hZGRfbnVtYmVyICAgICAgID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfSU1NRURJQVRFMzIpIAotCQl7Ci0JCSAgZXhwcmVzc2lvbiAoJiBleCk7Ci0JCSAgCi0JCSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgIGVycm1zZyA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkJICAKLQkJICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOwotCQkgIGV4dHJhX2RhdGFfbGVuICAgICAgICA9IDQ7Ci0JCSAgZXh0cmFfZGF0YSAgICAgICAgICAgID0gZXguWF9hZGRfbnVtYmVyOwotCQkgIGV4LlhfYWRkX251bWJlciAgICAgICA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChyZWdpc3Rlcl9uYW1lICgmIGV4KQotCQkgICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykgPT0gMCkKLQkJewotCQkgIGNoYXIgYzsKLQkJICBpbnQgIGV4aXN0cyA9IDA7Ci0JCSAgCi0JCSAgLyogSXQgaXMgcG9zc2libGUgdGhhdCBhbiBhbGlhcyBoYXMgYmVlbiBkZWZpbmVkIHRoYXQKLQkJICAgICBtYXRjaGVzIGEgcmVnaXN0ZXIgbmFtZS4gIEZvciBleGFtcGxlIHRoZSBjb2RlIG1heQotCQkgICAgIGluY2x1ZGUgYSAiLnNldCBaRVJPLCAwIiBkaXJlY3RpdmUsIHdoaWNoIG1hdGNoZXMKLQkJICAgICB0aGUgcmVnaXN0ZXIgbmFtZSAiemVybyIuICBBdHRlbXB0IHRvIHJlcGFyc2UgdGhlCi0JCSAgICAgZmllbGQgYXMgYW4gZXhwcmVzc2lvbiwgYW5kIG9ubHkgY29tcGxhaW4gaWYgd2UKLQkJICAgICBjYW5ub3QgZ2VuZXJhdGUgYSBjb25zdGFudC4gICovCi0KLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLQkJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JCSAgCi0JCSAgaWYgKHN5bWJvbF9maW5kIChzdHIpICE9IE5VTEwpCi0JCSAgICBleGlzdHMgPSAxOwotCQkgIAotCQkgICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0JCSAgCi0JCSAgZXhwcmVzc2lvbiAoJiBleCk7Ci0KLQkJICBpZiAoZXguWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgewotCQkgICAgICAvKiBJZiB0aGlzIHJlZ2lzdGVyIGlzIGFjdHVhbGx5IG9jY3VyaW5nIHRvbyBlYXJseSBvbgotCQkJIHRoZSBwYXJzaW5nIG9mIHRoZSBpbnN0cnVjdGlvbiwgKGJlY2F1c2UgYW5vdGhlcgotCQkJIGZpZWxkIGlzIG1pc3NpbmcpIHRoZW4gcmVwb3J0IHRoaXMuICAqLwotCQkgICAgICBpZiAob3BpbmRleF9wdHJbMV0gIT0gMAotCQkJICAmJiAodjg1MF9vcGVyYW5kcyBbb3BpbmRleF9wdHIgWzFdXS5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpKQotCQkJZXJybXNnID0gXygic3ludGF4IGVycm9yOiB2YWx1ZSBpcyBtaXNzaW5nIGJlZm9yZSB0aGUgcmVnaXN0ZXIgbmFtZSIpOwotCQkgICAgICBlbHNlCi0JCQllcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IHJlZ2lzdGVyIG5vdCBleHBlY3RlZCIpOwotCi0JCSAgICAgIC8qIElmIHdlIGNyZWF0ZWQgYSBzeW1ib2wgaW4gdGhlIHByb2Nlc3Mgb2YgdGhpcyB0ZXN0IHRoZW4KLQkJCSBkZWxldGUgaXQgbm93LCBzbyB0aGF0IGl0IHdpbGwgbm90IGJlIG91dHB1dCB3aXRoIHRoZSByZWFsCi0JCQkgc3ltYm9scy4uLiAqLwotCQkgICAgICBpZiAoZXhpc3RzID09IDAKLQkJCSAgJiYgZXguWF9vcCA9PSBPX3N5bWJvbCkKLQkJCXN5bWJvbF9yZW1vdmUgKGV4LlhfYWRkX3N5bWJvbCwKLQkJCQkgICAgICAgJiBzeW1ib2xfcm9vdFAsICYgc3ltYm9sX2xhc3RQKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKHN5c3RlbV9yZWdpc3Rlcl9uYW1lICgmIGV4LCBmYWxzZSwgZmFsc2UpCi0JCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU1JHKSA9PSAwKQotCQl7Ci0JCSAgZXJybXNnID0gXygic3ludGF4IGVycm9yOiBzeXN0ZW0gcmVnaXN0ZXIgbm90IGV4cGVjdGVkIik7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChjY19uYW1lICgmZXgpCi0JCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfQ0MpID09IDApCi0JCXsKLQkJICBlcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IGNvbmRpdGlvbiBjb2RlIG5vdCBleHBlY3RlZCIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZXhwcmVzc2lvbiAoJiBleCk7Ci0JCSAgLyogU3BlY2lhbCBjYXNlOgotCQkgICAgIElmIHdlIGFyZSBhc3NlbWJsaW5nIGEgTU9WIGluc3RydWN0aW9uIChvciBhIENBTExULi4uLiA6LSkKLQkJICAgICBhbmQgdGhlIGltbWVkaWF0ZSB2YWx1ZSBkb2VzIG5vdCBmaXQgaW50byB0aGUgYml0cwotCQkgICAgIGF2YWlsYWJsZSB0aGVuIGNyZWF0ZSBhIGZha2UgZXJyb3Igc28gdGhhdCB0aGUgbmV4dCBNT1YKLQkJICAgICBpbnN0cnVjdGlvbiB3aWxsIGJlIHNlbGVjdGVkLiAgVGhpcyBvbmUgaGFzIGEgMzIgYml0Ci0JCSAgICAgaW1tZWRpYXRlIGZpZWxkLiAgKi8KLQotCQkgIGlmICgoKGluc24gJiAweDA3ZTApID09IDB4MDIwMCkKLQkJICAgICAgJiYgZXguWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICAgICYmIChleC5YX2FkZF9udW1iZXIgPCAoLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkKLQkJCSAgfHwgZXguWF9hZGRfbnVtYmVyID4gKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpKQotCQkgICAgZXJybXNnID0gXygiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIik7Ci0JCX0KLQotCSAgICAgIGlmIChlcnJtc2cpCi0JCWdvdG8gZXJyb3I7Ci0JICAgICAgCi0vKiBmcHJpbnRmIChzdGRlcnIsICIgaW5zbjogJXgsIG9wZXJhbmQgJWQsIG9wOiAlZCwgYWRkX251bWJlcjogJWRcbiIsCi0gICBpbnNuLCBvcGluZGV4X3B0ciAtIG9wY29kZS0+b3BlcmFuZHMsIGV4Llhfb3AsIGV4LlhfYWRkX251bWJlcik7ICovCi0KLQkgICAgICBzd2l0Y2ggKGV4Llhfb3ApIAotCQl7Ci0JCWNhc2UgT19pbGxlZ2FsOgotCQkgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOwotCQkgIGdvdG8gZXJyb3I7Ci0JCWNhc2UgT19hYnNlbnQ6Ci0JCSAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7Ci0JCSAgZ290byBlcnJvcjsKLQkJY2FzZSBPX3JlZ2lzdGVyOgotCQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiAoVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfT1BFUkFORF9TUkcpKSA9PSAwKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIG9wZXJhbmQiKTsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQkJICBpbnNuID0gdjg1MF9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyLAotCQkJCQkgICAgICAoY2hhciAqKSBOVUxMLCAwLAotCQkJCQkgICAgICBjb3B5X29mX2luc3RydWN0aW9uKTsKLQkJICBicmVhazsKLQotCQljYXNlIE9fY29uc3RhbnQ6Ci0JCSAgaW5zbiA9IHY4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKLQkJCQkJICAgICAgKGNoYXIgKikgTlVMTCwgMCwKLQkJCQkJICAgICAgY29weV9vZl9pbnN0cnVjdGlvbik7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JCSAgaWYgKGZjID49IE1BWF9JTlNOX0ZJWFVQUykKLQkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkJICBmaXh1cHNbIGZjIF0uZXhwICAgICA9IGV4OwotCQkgIGZpeHVwc1sgZmMgXS5vcGluZGV4ID0gKiBvcGluZGV4X3B0cjsKLQkJICBmaXh1cHNbIGZjIF0ucmVsb2MgICA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JCSAgKytmYzsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJyB8fCAqc3RyID09ICdbJyB8fCAqc3RyID09ICddJwotCQkgfHwgKnN0ciA9PSAnKScpCi0JICAgICsrc3RyOwotCX0KLSAgICAgIG1hdGNoID0gMTsKLQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0gICAgICAgIHsKLQkgIG5leHRfb3Bjb2RlID0gb3Bjb2RlICsgMTsKLQkgIGlmIChuZXh0X29wY29kZS0+bmFtZSAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7Ci0KLQkgICAgICAvKiBTa2lwIHZlcnNpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldAotCQkgcHJvY2Vzc29yLiAgKi8KLQkgICAgICBpZiAoKG9wY29kZS0+cHJvY2Vzc29ycyAmIHByb2Nlc3Nvcl9tYXNrKSA9PSAwKQotCQlnb3RvIGVycm9yOwotCSAgICAgIAotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAKLQkgIGFzX2JhZCAoIiVzOiAlcyIsIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24sIGVycm1zZyk7Ci0JICAKLQkgIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnXScpCi0JICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIAotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciAhPSAnXDAnKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIAotICBpZiAocmVsYXhhYmxlICYmIGZjID4gMCkKLSAgICB7Ci0gICAgICBpbnNuX3NpemUgPSAyOwotICAgICAgZmMgPSAwOwotCi0gICAgICBpZiAoIXN0cmNtcCAob3Bjb2RlLT5uYW1lLCAiYnIiKSkKLQl7Ci0JICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAyLCAyLAotCQkJZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCi0JCQlmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKLQkJCShjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCBpbnNuX3NpemUpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgMiwgMCwgMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDYsIDQsIDAsCi0JCQlmaXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCwKLQkJCWZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyLAotCQkJKGNoYXIgKilmaXh1cHNbMF0ub3BpbmRleCk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIGluc25fc2l6ZSk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYgKyAyLCAwLCA0KTsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIC8qIEZvdXIgYnl0ZSBpbnNucyBoYXZlIGFuIG9wY29kZSB3aXRoIHRoZSB0d28gaGlnaCBiaXRzIG9uLiAgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4MDYwMCkgPT0gMHgwNjAwKQotCWluc25fc2l6ZSA9IDQ7Ci0gICAgICBlbHNlCi0JaW5zbl9zaXplID0gMjsKLQotICAgICAgLyogU3BlY2lhbCBjYXNlOiAzMiBiaXQgTU9WICovCi0gICAgICBpZiAoKGluc24gJiAweGZmZTApID09IDB4MDYyMCkKLQlpbnNuX3NpemUgPSAyOwotICAgICAgCi0gICAgICBmID0gZnJhZ19tb3JlIChpbnNuX3NpemUpOwotICAgICAgCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIGluc25fc2l6ZSk7Ci0KLSAgICAgIGlmIChleHRyYV9kYXRhX2FmdGVyX2luc24pCi0JewotCSAgZiA9IGZyYWdfbW9yZSAoZXh0cmFfZGF0YV9sZW4pOwotCSAgCi0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGV4dHJhX2RhdGEsIGV4dHJhX2RhdGFfbGVuKTsKLQotCSAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwgYnV0IGluc3RlYWQganVzdCB1c2UgdGhlCi0gICAgIEJGRF9SRUxPQ19VTlVTRUQgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkKLSAgICAgaGFuZGxlIGZpeHVwcyBmb3IgYW55IG9wZXJhbmQgdHlwZSwgYWx0aG91Z2ggdGhhdCBpcyBhZG1pdHRlZGx5Ci0gICAgIG5vdCBhIHZlcnkgZXhjaXRpbmcgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbgotICAgICBtZF9hcHBseV9maXguICAqLyAgCi0gIGZvciAoaSA9IDA7IGkgPCBmYzsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kOwotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICAgIHJlbG9jOwotICAgICAgCi0gICAgICBvcGVyYW5kID0gJiB2ODUwX29wZXJhbmRzWyBmaXh1cHNbaV0ub3BpbmRleCBdOwotCi0gICAgICByZWxvYyA9IGZpeHVwc1tpXS5yZWxvYzsKLSAgICAgIAotICAgICAgaWYgKHJlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JewotCSAgcmVsb2NfaG93dG9fdHlwZSAqIHJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsCi0JCQkJCQkJCSAgcmVsb2MpOwotCSAgaW50ICAgICAgICAgICAgICAgIHNpemU7Ci0JICBpbnQgICAgICAgICAgICAgICAgYWRkcmVzczsKLQkgIGZpeFMgKiAgICAgICAgICAgICBmaXhQOwotCi0JICBpZiAoIXJlbG9jX2hvd3RvKQotCSAgICBhYm9ydCgpOwotCSAgCi0JICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7Ci0KLQkgIC8qIFhYWCBUaGlzIHdpbGwgYWJvcnQgb24gYW4gUl9WODUwXzggcmVsb2MgLQotCSAgICAgaXMgdGhpcyByZWxvYyBhY3R1YWxseSB1c2VkID8gKi8KLQkgIGlmIChzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSAKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIGFkZHJlc3MgPSAoZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSArIGluc25fc2l6ZSAtIHNpemU7Ci0KLQkgIGlmIChyZWxvYyA9PSBCRkRfUkVMT0NfMzIpCi0JICAgIHsKLQkgICAgICBhZGRyZXNzICs9IDI7Ci0JICAgIH0KLQkgIAotCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgYWRkcmVzcywgc2l6ZSwKLQkJCSAgICAgICYgZml4dXBzW2ldLmV4cCwgCi0JCQkgICAgICByZWxvY19ob3d0by0+cGNfcmVsYXRpdmUsCi0JCQkgICAgICByZWxvYyk7Ci0KLQkgIHN3aXRjaCAocmVsb2MpCi0JICAgIHsKLQkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCSAgICAgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaXhfbmV3X2V4cCAoCi0JCSAgICAgICBmcmFnX25vdywKLQkJICAgICAgIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJICAgICAgICYgZml4dXBzW2ldLmV4cCwKLQkJICAgICAgIDEgLyogRklYTUU6IFY4NTBfT1BFUkFORF9SRUxBVElWRSA/Pz8gKi8sCi0JCSAgICAgICAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSAoZml4dXBzW2ldLm9waW5kZXgKLQkJCQkJCSAgICsgKGludCkgQkZEX1JFTE9DX1VOVVNFRCkKLQkJICAgICAgICk7Ci0JfQotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLQotLyogSWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCi0vKiB0aGVuIGl0IGlzIGRvbmUgaGVyZS4gICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKiBzZWc7Ci0gICAgIGZpeFMgKiAgICAgZml4cDsKLXsKLSAgYXJlbGVudCAqIHJlbG9jOwotICAKLSAgcmVsb2MgICAgICAgICAgICAgID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyAgICAgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byAgICAgICA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotCi0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgKGludCkgZml4cC0+Znhfcl90eXBlKTsKLQotICAgICAgeGZyZWUgKHJlbG9jKTsKLSAgICAgIAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKCAgIGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICAKLSAgcmV0dXJuIHJlbG9jOwotfQotCi0vKiBBc3N1bWUgZXZlcnl0aGluZyB3aWxsIGZpdCBpbiB0d28gYnl0ZXMsIHRoZW4gZXhwYW5kIGFzIG5lY2Vzc2FyeS4gICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqIGZyYWdwOwotICAgICBhc2VjdGlvbiAqIHNlZzsKLXsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDApCi0gICAgZnJhZ3AtPmZyX3ZhciA9IDQ7Ci0gIGVsc2UgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgZnJhZ3AtPmZyX3ZhciA9IDI7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIDI7Ci19IAotCi1sb25nCi12ODUwX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjdGlvbikKLSAgICAgZml4UyAqIGZpeHA7Ci0gICAgIHNlZ1QgICBzZWN0aW9uOwotewotICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgb3IgaW4gYSBzZWN0aW9uIG90aGVyIHRoYW4gb3VyIG93biwKLSAgICAgb3IgaXQgaXMgd2VhayAoaW4gd2hpY2ggY2FzZSBpdCBtYXkgd2VsbCBiZSBpbiBhbm90aGVyIHNlY3Rpb24sCi0gICAgIHRoZW4gbGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgfHwgU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkKLQkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjdGlvbikpKQotICAgIHJldHVybiAwOwotICAKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqICAgZml4cDsKLSAgICAgdmFsdWVUICogdmFsdWVwOwotICAgICBzZWdUICAgICBzZWc7Ci17Ci0gIHZhbHVlVCB2YWx1ZTsKLSAgY2hhciAqIHdoZXJlOwotCi0gIGlmICggICBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICB7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICogdmFsdWVwOwotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICogdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKChpbnQpIGZpeHAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgaW5zbjsKLQotICAgICAgb3BpbmRleCA9IChpbnQpIGZpeHAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgICBvcGVyYW5kID0gJiB2ODUwX29wZXJhbmRzWyBvcGluZGV4IF07Ci0KLSAgICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0gICAgICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLgotCi0JIE5vdGUgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIHN0b3JlZCBpbiBsaXR0bGUgZW5kaWFuCi0JIGZvcm1hdCEgICovCi0gICAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLQotICAgICAgaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGluc24gPSB2ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAob2Zmc2V0VCkgdmFsdWUsCi0JCQkJICBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBOVUxMKTsKLSAgICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0KLSAgICAgIGlmIChmaXhwLT5meF9kb25lKQotCXsKLQkgIC8qIE5vdGhpbmcgZWxzZSB0byBkbyBoZXJlLiAqLwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24uICAKLQkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50byByZWxvY3MuICovCi0KLSAgICAgIGlmIChvcGVyYW5kLT5iaXRzID09IDIyKQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMOwotICAgICAgZWxzZSBpZiAob3BlcmFuZC0+Yml0cyA9PSA5KQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19WODUwXzlfUENSRUw7Ci0gICAgICBlbHNlCi0JewotCSAgLyogZnByaW50ZiAoc3RkZXJyLCAiYml0czogJWQsIGluc246ICV4XG4iLCBvcGVyYW5kLT5iaXRzLCBpbnNuKTsgKi8KLQkgIAotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgICAgXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKLQkgIGZpeHAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfZG9uZSkKLSAgICB7Ci0gICAgICAvKiBXZSBzdGlsbCBoYXZlIHRvIGluc2VydCB0aGUgdmFsdWUgaW50byBtZW1vcnkhICAqLwotICAgICAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgICAgIGlmIChmaXhwLT5meF9zaXplID09IDEpCi0JKiB3aGVyZSA9IHZhbHVlICYgMHhmZjsKLSAgICAgIGVsc2UgaWYgKGZpeHAtPmZ4X3NpemUgPT0gMikKLQliZmRfcHV0bDE2ICh2YWx1ZSAmIDB4ZmZmZiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZSBpZiAoZml4cC0+Znhfc2l6ZSA9PSA0KQotCWJmZF9wdXRsMzIgKHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgfQotICAKLSAgZml4cC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7Ci0gIHJldHVybiAxOwotfQotCi0MCi0vKiBQYXJzZSBhIGNvbnMgZXhwcmVzc2lvbi4gIFdlIGhhdmUgdG8gaGFuZGxlIGhpKCksIGxvKCksIGV0YwotICAgb24gdGhlIHY4NTAuICAqLwotdm9pZAotcGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTAgKGV4cCkKLSAgZXhwcmVzc2lvblMgKiBleHA7Ci17Ci0gIC8qIFNlZSBpZiB0aGVyZSdzIGEgcmVsb2MgcHJlZml4IGxpa2UgaGkoKSB3ZSBoYXZlIHRvIGhhbmRsZS4gICovCi0gIGhvbGRfY29uc19yZWxvYyA9IHY4NTBfcmVsb2NfcHJlZml4IChOVUxMKTsKLQotICAvKiBEbyBub3JtYWwgZXhwcmVzc2lvbiBwYXJzaW5nLiAgKi8KLSAgZXhwcmVzc2lvbiAoZXhwKTsKLX0KLQotLyogQ3JlYXRlIGEgZml4dXAgZm9yIGEgY29ucyBleHByZXNzaW9uLiAgSWYgcGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTAKLSAgIGZvdW5kIGEgcmVsb2MgcHJlZml4LCB0aGVuIHdlIHVzZSB0aGF0IHJlbG9jLCBlbHNlIHdlIGNob29zZSBhbgotICAgYXBwcm9wcmlhdGUgb25lIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBleHByZXNzaW9uLiAgKi8KLXZvaWQKLWNvbnNfZml4X25ld192ODUwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQotICAgICBmcmFnUyAqIGZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IHNpemU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGlmIChob2xkX2NvbnNfcmVsb2MgPT0gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZSA9PSA0KQotCWhvbGRfY29uc19yZWxvYyA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGlmIChzaXplID09IDIpCi0JaG9sZF9jb25zX3JlbG9jID0gQkZEX1JFTE9DXzE2OwotICAgICAgaWYgKHNpemUgPT0gMSkKLQlob2xkX2NvbnNfcmVsb2MgPSBCRkRfUkVMT0NfODsKLSAgICB9Ci0KLSAgaWYgKGV4cCAhPSBOVUxMKQotICAgIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCAwLCBob2xkX2NvbnNfcmVsb2MpOwotICBlbHNlCi0gICAgZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIE5VTEwsIDAsIDAsIGhvbGRfY29uc19yZWxvYyk7Ci19Ci0KLWJvb2xlYW4KLXY4NTBfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIAotICAvKiBEb24ndCBhZGp1c3QgZnVuY3Rpb24gbmFtZXMgKi8KLSAgaWYgKFNfSVNfRlVOQ1RJT04gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIHJldHVybiAxOwotfQotIAotaW50Ci12ODUwX2ZvcmNlX3JlbG9jYXRpb24gKGZpeFApCi0gICAgICBzdHJ1Y3QgZml4ICogZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICYmIFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAxOwotICAKLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotIAotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdjg1MC5oIGIvZ2FzL2NvbmZpZy90Yy12ODUwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZDRkMWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKiB0Yy12ODUwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXY4NTAuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX1Y4NTAKLQotI2luY2x1ZGUgPGVsZi92ODUwLmg+Ci0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgVjg1MCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCAJCWJmZF9hcmNoX3Y4NTAKLQotLyogVGhlIHRhcmdldCBCRkQgZm9ybWF0LiAgKi8KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAJCSJlbGYzMi12ODUwIgotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSB2ODUwX2ZpeF9hZGp1c3RhYmxlKGZpeFApCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgdjg1MF9mb3JjZV9yZWxvY2F0aW9uKGZpeHApCi1leHRlcm4gaW50IHY4NTBfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiBmb28tLiBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLSAgICAgCi0vKiBXZSBuZWVkIHRvIGhhbmRsZSBsbygpLCBoaSgpLCBldGMgZXRjIGluIC5od29yZCwgLndvcmQsIGV0YwotICAgZGlyZWN0aXZlcywgc28gd2UgaGF2ZSB0byBwYXJzZSAiY29ucyIgZXhwcmVzc2lvbnMgb3Vyc2VsdmVzLiAgKi8KLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBwYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MCAoRVhQKQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X3Y4NTAKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLQotLyogVGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gdGhlIHNtYWxsIGRhdGEgYXJlYSAocG9pbnRlZCB0byBieSBHUCkuICAqLwotI2RlZmluZSBTSEZfVjg1MF9HUFJFTAkJMHgxMDAwMDAwMAotLyogVGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gdGhlIHRpbnkgZGF0YSBhcmVhIChwb2ludGVkIHRvIGJ5IEVQKS4gICovCi0jZGVmaW5lIFNIRl9WODUwX0VQUkVMCQkweDIwMDAwMDAwCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgemVybyBkYXRhIGFyZWEgKHBvaW50ZWQgdG8gYnkgUjApLiAgKi8KLSNkZWZpbmUgU0hGX1Y4NTBfUjBSRUwJCTB4NDAwMDAwMDAKLQotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5zZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0dQUkVMCX0sIFwKLSAgeyAiLnJvc2RhdGEiLAlTSFRfUFJPR0JJVFMsCQlTSEZfQUxMT0MgKyAgICAgICAgICAgICBTSEZfVjg1MF9HUFJFTAl9LCBcCi0gIHsgIi5zYnNzIiwJU0hUX05PQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0dQUkVMCX0sIFwKLSAgeyAiLnNjb21tb24iLAlTSFRfVjg1MF9TQ09NTU9OLCAJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfR1BSRUwJfSwgXAotICB7ICIudGRhdGEiLAlTSFRfUFJPR0JJVFMsCQlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9FUFJFTAl9LCBcCi0gIHsgIi50YnNzIiwJU0hUX05PQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0VQUkVMCX0sIFwKLSAgeyAiLnRjb21tb24iLAlTSFRfVjg1MF9UQ09NTU9OLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9SMFJFTAl9LCBcCi0gIHsgIi56ZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX1IwUkVMCX0sIFwKLSAgeyAiLnJvemRhdGEiLAlTSFRfUFJPR0JJVFMsCQlTSEZfQUxMT0MgKyAgICAgICAgICAgICBTSEZfVjg1MF9SMFJFTAl9LCBcCi0gIHsgIi56YnNzIiwJU0hUX05PQklUUywJICAJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfUjBSRUwJfSwgXAotICB7ICIuemNvbW1vbiIsCVNIVF9WODUwX1pDT01NT04sIAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9SMFJFTAl9LCBcCi0gIHsgIi5jYWxsX3RhYmxlX2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LAkgICBcCi0gIHsgIi5jYWxsX3RhYmxlX3RleHQiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9FWEVDSU5TVFIgfSwKLQotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oZml4UCxzZWN0aW9uKSB2ODUwX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4UCwgc2VjdGlvbikKLWV4dGVybiBsb25nIHY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uICgpOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy12YXguYyBiL2dhcy9jb25maWcvdGMtdmF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjVjY2MuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12YXguYworKysgL2Rldi9udWxsCkBAIC0xLDMyNDMgKzAsMCBAQAotLyogdGMtdmF4LmMgLSB2YXgtc3BlY2lmaWMgLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJ2YXgtaW5zdC5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIJCS8qIEZvciBGUkFHX0FQUEVORF8xX0NIQVIgbWFjcm8gaW4gImZyYWdzLmgiICovCi0KLS8qIFRoZXNlIGNoYXJzIHN0YXJ0IGEgY29tbWVudCBhbnl3aGVyZSBpbiBhIHNvdXJjZSBmaWxlIChleGNlcHQgaW5zaWRlCi0gICBhbm90aGVyIGNvbW1lbnQgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBUaGVzZSBjaGFycyBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gKi8KLS8qIE5vdGUgdGhhdCBmb3IgdGhlIFZBWCB0aGUgYXJlIHRoZSBzYW1lIGFzIGNvbW1lbnRfY2hhcnMgYWJvdmUuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogYXMgaW4gMGYxMjMuNDU2ICovCi0vKiBvciAgICAwSDEuMjM0RS0xMiAoc2VlIGV4cCBjaGFycyBhYm92ZSkgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZERmRmdHaEgiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi0vKiBIb2xkIGRldGFpbHMgb2YgYW4gb3BlcmFuZCBleHByZXNzaW9uICovCi1zdGF0aWMgZXhwcmVzc2lvblMgZXhwX29mX29wZXJhbmRbVklUX01BWF9PUEVSQU5EU107Ci1zdGF0aWMgc2VnVCBzZWdfb2Zfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsKLQotLyogQSB2YXggaW5zdHJ1Y3Rpb24gYWZ0ZXIgZGVjb2RpbmcuICovCi1zdGF0aWMgc3RydWN0IHZpdCB2OwotCi0vKiBIb2xkIGRldGFpbHMgb2YgYmlnIG9wZXJhbmRzLiAqLwotTElUVExFTlVNX1RZUEUgYmlnX29wZXJhbmRfYml0c1tWSVRfTUFYX09QRVJBTkRTXVtTSVpFX09GX0xBUkdFX05VTUJFUl07Ci1GTE9OVU1fVFlQRSBmbG9hdF9vcGVyYW5kW1ZJVF9NQVhfT1BFUkFORFNdOwotLyogQWJvdmUgaXMgbWFkZSB0byBwb2ludCBpbnRvIGJpZ19vcGVyYW5kX2JpdHMgYnkgbWRfYmVnaW4oKS4gKi8KLQotaW50IGZsYWdfaGFzaF9sb25nX25hbWVzOwkvKiAtKyAqLwotaW50IGZsYWdfb25lOwkJCS8qIC0xICovCi1pbnQgZmxhZ19zaG93X2FmdGVyX3RydW5jOwkvKiAtSCAqLwotaW50IGZsYWdfbm9faGFzaF9taXhlZF9jYXNlOwkvKiAtaCBOVU0gKi8KLQwKLS8qCi0gKiBGb3IgVkFYLCByZWxhdGl2ZSBhZGRyZXNzZXMgb2YgImp1c3QgdGhlIHJpZ2h0IGxlbmd0aCIgYXJlIGVhc3kuCi0gKiBUaGUgYnJhbmNoIGRpc3BsYWNlbWVudCBpcyBhbHdheXMgdGhlIGxhc3Qgb3BlcmFuZCwgZXZlbiBpbgotICogc3ludGhldGljIGluc3RydWN0aW9ucy4KLSAqIEZvciBWQVgsIHdlIGVuY29kZSB0aGUgcmVsYXhfc3Vic3RhdGVUcyAoaW4gZS5nLiBmcl9zdWJzdGF0ZSkgYXM6Ci0gKgotICoJCSAgICA0ICAgICAgIDMgICAgICAgMiAgICAgICAxICAgICAgIDAJICAgICBiaXQgbnVtYmVyCi0gKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gKgkJfCAgICAgd2hhdCBzdGF0ZSA/CXwgIGhvdyBsb25nID8JfAotICoJLS0tLyAvLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICoKLSAqIFRoZSAiaG93IGxvbmciIGJpdHMgYXJlIDAwPWJ5dGUsIDAxPXdvcmQsIDEwPWxvbmcuCi0gKiBUaGlzIGlzIGEgVW4qeCBjb252ZW50aW9uLgotICogTm90IGFsbCBsZW5ndGhzIGFyZSBsZWdpdCBmb3IgYSBnaXZlbiB2YWx1ZSBvZiAod2hhdCBzdGF0ZSkuCi0gKiBUaGUgImhvdyBsb25nIiByZWZlcnMgbWVyZWx5IHRvIHRoZSBkaXNwbGFjZW1lbnQgbGVuZ3RoLgotICogVGhlIGFkZHJlc3MgdXN1YWxseSBoYXMgc29tZSBjb25zdGFudCBieXRlcyBpbiBpdCBhcyB3ZWxsLgotICoKLQotIGdyb3VwcyBmb3IgVkFYIGFkZHJlc3MgcmVsYXhpbmcuCi0KLSAxLgkiZm9vIiBwYy1yZWxhdGl2ZS4KLSBsZW5ndGggb2YgYnl0ZSwgd29yZCwgbG9uZwotCi0gMmEuCUo8Y29uZD4gd2hlcmUgPGNvbmQ+IGlzIGEgc2ltcGxlIGZsYWcgdGVzdC4KLSBsZW5ndGggb2YgYnl0ZSwgd29yZCwgbG9uZy4KLSBWQVggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYm5lcS9ibmVxdQkxMgotIGJlcWwvYmVxbHUJMTMKLSBiZ3RyCQkxNAotIGJsZXEJCTE1Ci0gYmdlcQkJMTgKLSBibHNzCQkxOQotIGJndHJ1CQkxYQotIGJsZXF1CQkxYgotIGJ2YwkJMWMKLSBidnMJCTFkCi0gYmdlcXUvYmNjCTFlCi0gYmxzc3UvYmNzCTFmCi0gQWx3YXlzLCB5b3UgY29tcGxlbWVudCAwdGggYml0IHRvIHJldmVyc2UgY29uZGl0aW9uLgotIEFsd2F5cywgMS1ieXRlIG9wY29kZSwgdGhlbiAxLWJ5dGUgZGlzcGxhY2VtZW50LgotCi0gMmIuCUo8Y29uZD4gd2hlcmUgY29uZCB0ZXN0cyBhIG1lbW9yeSBiaXQuCi0gbGVuZ3RoIG9mIGJ5dGUsIHdvcmQsIGxvbmcuCi0gVmF4IG9wY29kZXMgYXJlOgkoSGV4KQotIGJicwkJZTAKLSBiYmMJCWUxCi0gYmJzcwkJZTIKLSBiYmNzCQllMwotIGJic2MJCWU0Ci0gYmJjYwkJZTUKLSBiYnNzaQkJZTYKLSBiYmNjaQkJZTcKLSBBbHdheXMsIHlvdSBjb21wbGVtZW50IDB0aCBiaXQgdG8gcmV2ZXJzZSBjb25kaXRpb24uCi0gQWx3YXlzLCAxLWJ5dGUgb3BjZGUsIGxvbmd3b3JkLWFkZHJlc3MsIGJ5dGUtYWRkcmVzcywgMS1ieXRlLWRpc3BsYWNlbWVudAotCi0gMmMuCUo8Y29uZD4gd2hlcmUgY29uZCB0ZXN0cyBsb3ctb3JkZXIgbWVtb3J5IGJpdAotIGxlbmd0aCBvZiBieXRlLHdvcmQsbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYmxicwkJZTgKLSBibGJjCQllOQotIEFsd2F5cywgeW91IGNvbXBsZW1lbnQgMHRoIGJpdCB0byByZXZlcnNlIGNvbmRpdGlvbi4KLSBBbHdheXMsIDEtYnl0ZSBvcGNvZGUsIGxvbmd3b3JkLWFkZHJlc3MsIDEtYnl0ZSBkaXNwbGFjZW1lbnQuCi0KLSAzLglKYnMvSmJyLgotIGxlbmd0aCBvZiBieXRlLHdvcmQsbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYnNiYgkJMTAKLSBicmIJCTExCi0gVGhlc2UgYXJlIGxpa2UgKDIpIGJ1dCB0aGVyZSBpcyBubyBjb25kaXRpb24gdG8gcmV2ZXJzZS4KLSBBbHdheXMsIDEgYnl0ZSBvcGNvZGUsIHRoZW4gZGlzcGxhY2VtZW50L2Fic29sdXRlLgotCi0gNGEuCUphY2JYCi0gbGVuZ3RoIG9mIHdvcmQsIGxvbmcuCi0gVmF4IG9wY29kZXMgYXJlOgkoSGV4KQotIGFjYncJCTNkCi0gYWNiZgkJNGYKLSBhY2JkCQk2ZgotIGFiY2IJCTlkCi0gYWNibAkJZjEKLSBhY2JnCSAgICAgIDRmZmQKLSBhY2JoCSAgICAgIDZmZmQKLSBBbHdheXMsIHdlIGNhbm5vdCByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoOyB3ZSBoYXZlIGEgd29yZAotIGRpc3BsYWNlbWVudC4KLSBUaGUgZG91YmxlLWJ5dGUgb3AtY29kZXMgZG9uJ3QgaHVydDogd2UgbmV2ZXIgd2FudCB0byBtb2RpZnkgdGhlCi0gb3Bjb2RlLCBzbyB3ZSBkb24ndCBjYXJlIGhvdyBtYW55IGJ5dGVzIGFyZSBiZXR3ZWVuIHRoZSBvcGNvZGUgYW5kCi0gdGhlIG9wZXJhbmQuCi0KLSA0Yi4JSlhvYlhYWAotIGxlbmd0aCBvZiBsb25nLCBsb25nLCBieXRlLgotIFZheCBvcGNvZGVzIGFyZToJKEhleCkKLSBhb2Jsc3MJCWYyCi0gYW9ibGVxCQlmMwotIHNvYmdlcQkJZjQKLSBzb2JndHIJCWY1Ci0gQWx3YXlzLCB3ZSBjYW5ub3QgcmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIGJyYW5jaDsgd2UgaGF2ZSBhIGJ5dGUKLSBkaXNwbGFjZW1lbnQuCi0KLSBUaGUgb25seSB0aW1lIHdlIG5lZWQgdG8gbW9kaWZ5IHRoZSBvcGNvZGUgaXMgZm9yIGNsYXNzIDIgaW5zdHJ1Y3Rpb25zLgotIEFmdGVyIHJlbGF4KCkgd2UgbWF5IGNvbXBsZW1lbnQgdGhlIGxvd2VzdCBvcmRlciBiaXQgb2Ygc3VjaCBpbnN0cnVjdGlvbgotIHRvIHJldmVyc2Ugc2Vuc2Ugb2YgYnJhbmNoLgotCi0gRm9yIGNsYXNzIDIgaW5zdHJ1Y3Rpb25zLCB3ZSBzdG9yZSBjb250ZXh0IG9mICJ3aGVyZSBpcyB0aGUgb3Bjb2RlIGxpdGVyYWwiLgotIFdlIGNhbiBjaGFuZ2UgYW4gb3Bjb2RlJ3MgbG93ZXN0IG9yZGVyIGJpdCB3aXRob3V0IGJyZWFraW5nIGFueXRoaW5nIGVsc2UuCi0KLSBXZSBzb21ldGltZXMgc3RvcmUgY29udGV4dCBpbiB0aGUgb3BlcmFuZCBsaXRlcmFsLiBUaGlzIHdheSB3ZSBjYW4gZmlndXJlIG91dAotIGFmdGVyIHJlbGF4KCkgd2hhdCB0aGUgb3JpZ2luYWwgYWRkcmVzc2luZyBtb2RlIHdhcy4KLSAqLwotDAotLyogVGhlc2UgZGlzcGxhY2VtZW50cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlCi0gICBkaXNwbGFjZW1lbnQuICBUaGUgZmlyc3QgbGV0dGVyIGlzIEJ5dGUsIFdvcmQuICAybmQgbGV0dGVyIGlzCi0gICBGb3J3YXJkLCBCYWNrd2FyZC4gKi8KLSNkZWZpbmUgQkYgKDErIDEyNykKLSNkZWZpbmUgQkIgKDErLTEyOCkKLSNkZWZpbmUgV0YgKDIrIDMyNzY3KQotI2RlZmluZSBXQiAoMistMzI3NjgpCi0vKiBEb250IG5lZWQgTEYsIExCIGJlY2F1c2UgdGhleSBhbHdheXMgcmVhY2guIFtUaGV5IGFyZSBjb2RlZCBhcyAwLl0gKi8KLQotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotLyogVGhpcyBtYWNybyBoYXMgbm8gc2lkZS1lZmZlY3RzLiAqLwotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICB7MSwgMSwgMCwgMH0sCQkJLyogZXJyb3Igc2VudGluZWwgICAwLDAJKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMCwxCSovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDAsMgkqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAwLDMJKi8KLSAge0JGICsgMSwgQkIgKyAxLCAyLCBDICgxLCAxKX0sLyogQl4iZm9vIgkgICAgMSwwICovCi0gIHtXRiArIDEsIFdCICsgMSwgMywgQyAoMSwgMil9LC8qIFdeImZvbyIJICAgIDEsMSAqLwotICB7MCwgMCwgNSwgMH0sCQkJLyogTF4iZm9vIgkgICAgMSwyICovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDEsMyAqLwotICB7QkYsIEJCLCAxLCBDICgyLCAxKX0sCS8qIGI8Y29uZD4gQl4iZm9vIiAgMiwwICovCi0gIHtXRiArIDIsIFdCICsgMiwgNCwgQyAoMiwgMil9LC8qIGJyLis/IGJydyBYCSAgICAyLDEgKi8KLSAgezAsIDAsIDcsIDB9LAkJCS8qIGJyLis/IGptcCBYCSAgICAyLDIgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMiwzICovCi0gIHtCRiwgQkIsIDEsIEMgKDMsIDEpfSwJLyogYnJiIEJeZm9vCSAgICAzLDAgKi8KLSAge1dGLCBXQiwgMiwgQyAoMywgMil9LAkvKiBicncgV15mb28JICAgIDMsMSAqLwotICB7MCwgMCwgNSwgMH0sCQkJLyogSm1wIExeZm9vCSAgICAzLDIgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMywzICovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDQsMCAqLwotICB7V0YsIFdCLCAyLCBDICg0LCAyKX0sCS8qIGFjYl8gXldmb28JICAgIDQsMSAqLwotICB7MCwgMCwgMTAsIDB9LAkJLyogYWNiXyxicixqbXAgTF5mb280LDIgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgNCwzICovCi0gIHtCRiwgQkIsIDEsIEMgKDUsIDEpfSwJLyogWG9iX19fLCxmb28gICAgICA1LDAgKi8KLSAge1dGICsgNCwgV0IgKyA0LCA2LCBDICg1LCAyKX0sLyogWG9iLisyLGJyYi4rMyxicnc1LDEgKi8KLSAgezAsIDAsIDksIDB9LAkJCS8qIFhvYi4rMixicmIuKzYsam1wNSwyICovCi19OwotCi0jdW5kZWYgQwotI3VuZGVmIEJGCi0jdW5kZWYgQkIKLSN1bmRlZiBXRgotI3VuZGVmIFdCCi0KLXZvaWQgZmxvYXRfY29ucyAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZ2Zsb2F0IiwgZmxvYXRfY29ucywgJ2cnfSwKLSAgeyJoZmxvYXQiLCBmbG9hdF9jb25zLCAnaCd9LAotICB7MH0sCi19OwotCi0jZGVmaW5lIFNUQVRFX1BDX1JFTEFUSVZFCQkoMSkKLSNkZWZpbmUgU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNICSgyKQotI2RlZmluZSBTVEFURV9BTFdBWVNfQlJBTkNICQkoMykJLyogaW5jbHVkZXMgQlNCLi4uICovCi0jZGVmaW5lIFNUQVRFX0NPTVBMRVhfQlJBTkNICSAgICAgICAgKDQpCi0jZGVmaW5lIFNUQVRFX0NPTVBMRVhfSE9QCQkoNSkKLQotI2RlZmluZSBTVEFURV9CWVRFCQkJKDApCi0jZGVmaW5lIFNUQVRFX1dPUkQJCQkoMSkKLSNkZWZpbmUgU1RBVEVfTE9ORwkJCSgyKQotI2RlZmluZSBTVEFURV9VTkRGCQkJKDMpCS8qIFN5bWJvbCB1bmRlZmluZWQgaW4gcGFzczEgKi8KLQotCi0jZGVmaW5lIG1pbihhLCBiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotCi1pbnQgZmxvbnVtX2dlbjJ2YXggUEFSQU1TICgoY2hhciBmb3JtYXRfbGV0dGVyLCBGTE9OVU1fVFlQRSAqIGYsCi0JCQkgICAgTElUVExFTlVNX1RZUEUgKiB3b3JkcykpOwotc3RhdGljIGNvbnN0IGNoYXIgKnZpcF9iZWdpbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgdmlwX29wX2RlZmF1bHRzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHZpcF9vcCBQQVJBTVMgKChjaGFyICosIHN0cnVjdCB2b3AgKikpOwotc3RhdGljIHZvaWQgdmlwIFBBUkFNUyAoKHN0cnVjdCB2aXQgKiwgY2hhciAqKSk7Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKmVycnR4dDsKLSAgRkxPTlVNX1RZUEUgKmZQOwotICBpbnQgaTsKLQotICBpZiAoKGVycnR4dCA9IHZpcF9iZWdpbiAoMSwgIiQiLCAiKiIsICJgIikpICE9IDApCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIlZJUF9CRUdJTiBlcnJvcjolcyIpLCBlcnJ0eHQpOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBmUCA9IGZsb2F0X29wZXJhbmQ7Ci0gICAgICAgZlAgPCBmbG9hdF9vcGVyYW5kICsgVklUX01BWF9PUEVSQU5EUzsKLSAgICAgICBpKyssIGZQKyspCi0gICAgewotICAgICAgZlAtPmxvdyA9ICZiaWdfb3BlcmFuZF9iaXRzW2ldWzBdOwotICAgICAgZlAtPmhpZ2ggPSAmYmlnX29wZXJhbmRfYml0c1tpXVtTSVpFX09GX0xBUkdFX05VTUJFUiAtIDFdOwotICAgIH0KLX0KLQwKLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLS8qIEZpeCB1cCBzb21lIGRhdGEgb3IgaW5zdHJ1Y3Rpb25zIGFmdGVyIHdlIGZpbmQgb3V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbAotICAgdGhhdCB0aGV5IHJlZmVyZW5jZS4gICovCi0KLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsdWUpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCQkodmFsdWVUKSB2YWx1ZSwgZml4UC0+Znhfc2l6ZSk7Ci19Ci0KLWxvbmcKLW1kX2NoYXJzX3RvX251bWJlciAoY29uLCBuYnl0ZXMpCi0gICAgIHVuc2lnbmVkIGNoYXIgY29uW107CS8qIExvdyBvcmRlciBieXRlIDFzdC4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgaW5wdXQuICovCi17Ci0gIGxvbmcgcmV0dmFsOwotICBmb3IgKHJldHZhbCA9IDAsIGNvbiArPSBuYnl0ZXMgLSAxOyBuYnl0ZXMtLTsgY29uLS0pCi0gICAgewotICAgICAgcmV0dmFsIDw8PSBCSVRTX1BFUl9DSEFSOwotICAgICAgcmV0dmFsIHw9ICpjb247Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogdmF4Om1kX2Fzc2VtYmxlKCkgZW1pdCBmcmFncyBmb3IgMSBpbnN0cnVjdGlvbiAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoaW5zdHJ1Y3Rpb25fc3RyaW5nKQotICAgICBjaGFyICppbnN0cnVjdGlvbl9zdHJpbmc7CS8qIEEgc3RyaW5nOiBhc3NlbWJsZSAxIGluc3RydWN0aW9uLiAqLwotewotICAvKiBOb24temVybyBpZiBvcGVyYW5kIGV4cHJlc3Npb24ncyBzZWdtZW50IGlzIG5vdCBrbm93biB5ZXQuICovCi0gIGludCBpc191bmRlZmluZWQ7Ci0KLSAgaW50IGxlbmd0aF9jb2RlOwotICBjaGFyICpwOwotICAvKiBBbiBvcGVyYW5kLiBTY2FucyBhbGwgb3BlcmFuZHMuICovCi0gIHN0cnVjdCB2b3AgKm9wZXJhbmRQOwotICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkJCS8qIFdoYXQgdXNlZCB0byBsaXZlIGFmdGVyIGFuIGV4cHJlc3Npb24uICovCi0gIGNoYXIgY19zYXZlOwotICAvKiAxOiBpbnN0cnVjdGlvbl9zdHJpbmcgYmFkIGZvciBhbGwgcGFzc2VzLiAqLwotICBpbnQgZ29vZmVkOwotICAvKiBQb2ludHMgdG8gc2xvdCBqdXN0IGFmdGVyIGxhc3Qgb3BlcmFuZC4gICovCi0gIHN0cnVjdCB2b3AgKmVuZF9vcGVyYW5kUDsKLSAgLyogUG9pbnRzIHRvIGV4cHJlc3Npb24gdmFsdWVzIGZvciB0aGlzIG9wZXJhbmQuICAqLwotICBleHByZXNzaW9uUyAqZXhwUDsKLSAgc2VnVCAqc2VnUDsKLQotICAvKiBUaGVzZSByZWZlciB0byBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kIGV4cHJlc3Npb24uICovCi0gIC8qIFRhcmdldCBzZWdtZW50IG9mIHRoZSBhZGRyZXNzLgkgKi8KLSAgc2VnVCB0b19zZWc7Ci0gIHZhbHVlVCB0aGlzX2FkZF9udW1iZXI7Ci0gIC8qIFBvc2l0aXZlIChtaW51ZW5kKSBzeW1ib2wuICovCi0gIHN5bWJvbFMgKnRoaXNfYWRkX3N5bWJvbDsKLSAgLyogQXMgYSBudW1iZXIuICovCi0gIGxvbmcgb3Bjb2RlX2FzX251bWJlcjsKLSAgLyogTGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSAxc3QuICovCi0gIGNoYXIgKm9wY29kZV9hc19jaGFyczsKLSAgLyogQXMgYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4gKi8KLSAgLyogTGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSAxc3QgKi8KLSAgY2hhciAqb3Bjb2RlX2xvd19ieXRlUDsKLSAgLyogbGVuZ3RoIChieXRlcykgbWVhbnQgYnkgdm9wX3Nob3J0LiAqLwotICBpbnQgbGVuZ3RoOwotICAvKiAwLCBvciAxIGlmICdAJyBpcyBpbiBhZGRyZXNzaW5nIG1vZGUuICovCi0gIGludCBhdDsKLSAgLyogRnJvbSB2b3BfbmJ5dGVzOiB2YXhfb3BlcmFuZF93aWR0aCAoaW4gYnl0ZXMpICovCi0gIGludCBuYnl0ZXM7Ci0gIEZMT05VTV9UWVBFICpmbG9hdFA7Ci0gIExJVFRMRU5VTV9UWVBFIGxpdGVyYWxfZmxvYXRbOF07Ci0gIC8qIEJpZyBlbm91Z2ggZm9yIGFueSBmbG9hdGluZyBwb2ludCBsaXRlcmFsLiAqLwotCi0gIHZpcCAoJnYsIGluc3RydWN0aW9uX3N0cmluZyk7Ci0KLSAgLyoKLSAgICogTm93IHdlIHRyeSB0byBmaW5kIGFzIG1hbnkgYXNfd2FybigpcyBhcyB3ZSBjYW4uIElmIHdlIGRvIGFueSBhc193YXJuKClzCi0gICAqIHRoZW4gZ29vZmVkPTEuIE5vdGljZSB0aGF0IHdlIGRvbid0IG1ha2UgYW55IGZyYWdzIHlldC4KLSAgICogU2hvdWxkIGdvb2ZlZCBiZSAxLCB0aGVuIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCB3ZWRnZSBpbiBhbnkgcGFzcywKLSAgICogYW5kIHdlIGNhbiBzYWZlbHkgZmx1c2ggaXQsIHdpdGhvdXQgY2F1c2luZyBpbnRlcnBhc3Mgc3ltYm9sIHBoYXNlCi0gICAqIGVycm9ycy4gVGhhdCBpcywgd2l0aG91dCBjaGFuZ2luZyBsYWJlbCB2YWx1ZXMgaW4gZGlmZmVyZW50IHBhc3Nlcy4KLSAgICovCi0gIGlmICgoZ29vZmVkID0gKCp2LnZpdF9lcnJvcikpICE9IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiSWdub3Jpbmcgc3RhdGVtZW50IGR1ZSB0byBcIiVzXCIiKSwgdi52aXRfZXJyb3IpOwotICAgIH0KLSAgLyoKLSAgICogV2UgbmVlZCB0byB1c2UgZXhwcmVzc2lvbigpIGFuZCBmcmllbmRzLCB3aGljaCByZXF1aXJlIHVzIHRvIGRpZGRsZQotICAgKiBpbnB1dF9saW5lX3BvaW50ZXIuIFNvIHdlIHNhdmUgaXQgYW5kIHJlc3RvcmUgaXQgbGF0ZXIuCi0gICAqLwotICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZm9yIChvcGVyYW5kUCA9IHYudml0X29wZXJhbmQsCi0gICAgICAgZXhwUCA9IGV4cF9vZl9vcGVyYW5kLAotICAgICAgIHNlZ1AgPSBzZWdfb2Zfb3BlcmFuZCwKLSAgICAgICBmbG9hdFAgPSBmbG9hdF9vcGVyYW5kLAotICAgICAgIGVuZF9vcGVyYW5kUCA9IHYudml0X29wZXJhbmQgKyB2LnZpdF9vcGVyYW5kczsKLQotICAgICAgIG9wZXJhbmRQIDwgZW5kX29wZXJhbmRQOwotCi0gICAgICAgb3BlcmFuZFArKywgZXhwUCsrLCBzZWdQKyssIGZsb2F0UCsrKQotICAgIHsJCQkJLyogZm9yIGVhY2ggb3BlcmFuZCAqLwotICAgICAgaWYgKG9wZXJhbmRQLT52b3BfZXJyb3IpCi0JewotCSAgYXNfd2FybiAoXygiSWdub3Jpbmcgc3RhdGVtZW50IGJlY2F1c2UgXCIlc1wiIiksIG9wZXJhbmRQLT52b3BfZXJyb3IpOwotCSAgZ29vZmVkID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogc3RhdGVtZW50IGhhcyBubyBzeW50YXggZ29vZnM6IGxldHMgc25pZmYgdGhlIGV4cHJlc3Npb24gKi8KLQkgIGludCBjYW5fYmVfc2hvcnQgPSAwOwkvKiAxIGlmIGEgYmlnbnVtIGNhbiBiZSByZWR1Y2VkIHRvIGEgc2hvcnQgbGl0ZXJhbC4gKi8KLQotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BlcmFuZFAtPnZvcF9leHByX2JlZ2luOwotCSAgY19zYXZlID0gb3BlcmFuZFAtPnZvcF9leHByX2VuZFsxXTsKLQkgIG9wZXJhbmRQLT52b3BfZXhwcl9lbmRbMV0gPSAnXDAnOwotCSAgLyogSWYgdG9fc2VnID09IFNFR19QQVNTMSwgZXhwcmVzc2lvbigpIHdpbGwgaGF2ZSBzZXQgbmVlZF9wYXNzXzIgPSAxLiAqLwotCSAgKnNlZ1AgPSBleHByZXNzaW9uIChleHBQKTsKLQkgIHN3aXRjaCAoZXhwUC0+WF9vcCkKLQkgICAgewotCSAgICBjYXNlIE9fYWJzZW50OgotCSAgICAgIC8qIGZvciBCU0Q0LjIgY29tcGF0aWJpbGl0eSwgbWlzc2luZyBleHByZXNzaW9uIGlzIGFic29sdXRlIDAgKi8KLQkgICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLQkgICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIC8qIEZvciBTRUdfQUJTT0xVVEUsIHdlIHNob3VsZG4ndCBuZWVkIHRvIHNldCBYX29wX3N5bWJvbCwKLQkJIFhfYWRkX3N5bWJvbCB0byBhbnkgcGFydGljdWxhciB2YWx1ZS4gIEJ1dCwgd2Ugd2lsbCBwcm9ncmFtCi0JCSBkZWZlbnNpdmVseS4gU2luY2UgdGhpcyBzaXR1YXRpb24gb2NjdXJzIHJhcmVseSBzbyBpdCBjb3N0cwotCQkgdXMgbGl0dGxlIHRvIGRvLCBhbmQgc3RvcHMgRGVhbiB3b3JyeWluZyBhYm91dCB0aGUgb3JpZ2luIG9mCi0JCSByYW5kb20gYml0cyBpbiBleHByZXNzaW9uUydzLiAgKi8KLQkgICAgICBleHBQLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgICAgIGV4cFAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9fc3ltYm9sOgotCSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKgotCSAgICAgICAqIE1ham9yIGJ1Zy4gV2UgY2FuJ3QgaGFuZGxlIHRoZSBjYXNlIG9mIGEKLQkgICAgICAgKiBTRUdfT1AgZXhwcmVzc2lvbiBpbiBhIFZJVF9PUENPREVfU1lOVEhFVElDCi0JICAgICAgICogdmFyaWFibGUtbGVuZ3RoIGluc3RydWN0aW9uLgotCSAgICAgICAqIFdlIGRvbid0IGhhdmUgYSBmcmFnIHR5cGUgdGhhdCBpcyBzbWFydCBlbm91Z2ggdG8KLQkgICAgICAgKiByZWxheCBhIFNFR19PUCwgYW5kIHNvIHdlIGp1c3QgZm9yY2UgYWxsCi0JICAgICAgICogU0VHX09QcyB0byBiZWhhdmUgbGlrZSBTRUdfUEFTUzFzLgotCSAgICAgICAqIENsZWFybHksIGlmIHRoZXJlIGlzIGEgZGVtYW5kIHdlIGNhbiBpbnZlbnQgYSBuZXcgb3IKLQkgICAgICAgKiBtb2RpZmllZCBmcmFnIHR5cGUgYW5kIHRoZW4gY29kaW5nIHVwIGEgZnJhZyBmb3IgdGhpcwotCSAgICAgICAqIGNhc2Ugd2lsbCBiZSBlYXN5LiBTRUdfT1Agd2FzIGludmVudGVkIGZvciB0aGUKLQkgICAgICAgKiAud29yZHMgYWZ0ZXIgYSBDQVNFIG9wY29kZSwgYW5kIHdhcyBuZXZlciBpbnRlbmRlZCBmb3IKLQkgICAgICAgKiBpbnN0cnVjdGlvbiBvcGVyYW5kcy4KLQkgICAgICAgKi8KLQkgICAgICBuZWVkX3Bhc3NfMiA9IDE7Ci0JICAgICAgYXNfd2FybiAoXygiQ2FuJ3QgcmVsb2NhdGUgZXhwcmVzc2lvbiIpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9fYmlnOgotCSAgICAgIC8qIFByZXNlcnZlIHRoZSBiaXRzLiAqLwotCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPiAwKQotCQl7Ci0JCSAgYmlnbnVtX2NvcHkgKGdlbmVyaWNfYmlnbnVtLCBleHBQLT5YX2FkZF9udW1iZXIsCi0JCQkgICAgICAgZmxvYXRQLT5sb3csIFNJWkVfT0ZfTEFSR0VfTlVNQkVSKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGtub3cgKGV4cFAtPlhfYWRkX251bWJlciA8IDApOwotCQkgIGZsb251bV9jb3B5ICgmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIsCi0JCQkgICAgICAgZmxvYXRQKTsKLQkJICBpZiAoc3RyY2hyICgicyBpIiwgb3BlcmFuZFAtPnZvcF9zaG9ydCkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIENvdWxkIHBvc3NpYmx5IGJlY29tZSBTXiMgKi8KLQkJICAgICAgZmxvbnVtX2dlbjJ2YXggKC1leHBQLT5YX2FkZF9udW1iZXIsIGZsb2F0UCwgbGl0ZXJhbF9mbG9hdCk7Ci0JCSAgICAgIHN3aXRjaCAoLWV4cFAtPlhfYWRkX251bWJlcikKLQkJCXsKLQkJCWNhc2UgJ2YnOgotCQkJICBjYW5fYmVfc2hvcnQgPQotCQkJICAgIChsaXRlcmFsX2Zsb2F0WzBdICYgMHhGQzBGKSA9PSAweDQwMDAKLQkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzFdID09IDA7Ci0JCQkgIGJyZWFrOwotCi0JCQljYXNlICdkJzoKLQkJCSAgY2FuX2JlX3Nob3J0ID0KLQkJCSAgICAobGl0ZXJhbF9mbG9hdFswXSAmIDB4RkMwRikgPT0gMHg0MDAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsxXSA9PSAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsyXSA9PSAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFszXSA9PSAwOwotCQkJICBicmVhazsKLQotCQkJY2FzZSAnZyc6Ci0JCQkgIGNhbl9iZV9zaG9ydCA9Ci0JCQkgICAgKGxpdGVyYWxfZmxvYXRbMF0gJiAweEZGODEpID09IDB4NDAwMAotCQkJICAgICYmIGxpdGVyYWxfZmxvYXRbMV0gPT0gMAotCQkJICAgICYmIGxpdGVyYWxfZmxvYXRbMl0gPT0gMAotCQkJICAgICYmIGxpdGVyYWxfZmxvYXRbM10gPT0gMDsKLQkJCSAgYnJlYWs7Ci0KLQkJCWNhc2UgJ2gnOgotCQkJICBjYW5fYmVfc2hvcnQgPSAoKGxpdGVyYWxfZmxvYXRbMF0gJiAweEZGRjgpID09IDB4NDAwMAotCQkJCQkgICYmIChsaXRlcmFsX2Zsb2F0WzFdICYgMHhFMDAwKSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFsyXSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFszXSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFs0XSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFs1XSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFs2XSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFs3XSA9PSAwKTsKLQkJCSAgYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkgIEJBRF9DQVNFICgtZXhwUC0+WF9hZGRfbnVtYmVyKTsKLQkJCSAgYnJlYWs7Ci0JCQl9CS8qIHN3aXRjaCAoZmxvYXQgdHlwZSkgKi8KLQkJICAgIH0JCS8qIGlmIChjb3VsZCB3YW50IHRvIGJlY29tZSBTXiMuLi4pICovCi0JCX0JCS8qIGJpZ251bSBvciBmbG9udW0gPyAqLwotCi0JICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnCi0JCSAgfHwgb3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnaScKLQkJICB8fCAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcKLQkJICAgICAgJiYgb3BlcmFuZFAtPnZvcF9yZWcgPT0gMHhGCi0JCSAgICAgICYmIChvcGVyYW5kUC0+dm9wX21vZGUgJiAweEUpID09IDB4OCkpCi0JCXsKLQkJICAvKiBTYXcgYSAnIycuICovCi0JCSAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJyAnKQotCQkgICAgewotCQkgICAgICAvKiBXZSBtdXN0IGNob3NlIFNeIG9yIEleLiAqLwotCQkgICAgICBpZiAoZXhwUC0+WF9hZGRfbnVtYmVyID4gMCkKLQkJCXsKLQkJCSAgLyogQmlnbnVtOiBTaG9ydCBsaXRlcmFsIGltcG9zc2libGUuICovCi0JCQkgIG9wZXJhbmRQLT52b3Bfc2hvcnQgPSAnaSc7Ci0JCQkgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDg7Ci0JCQkgIG9wZXJhbmRQLT52b3BfcmVnID0gMHhGOwkvKiBWQVggUEMuICovCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogRmxvbnVtOiBUcnkgdG8gZG8gaXQuICovCi0JCQkgIGlmIChjYW5fYmVfc2hvcnQpCi0JCQkgICAgewotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdzJzsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDA7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX25keCA9IC0xOwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9yZWcgPSAtMTsKLQkJCSAgICAgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3Bfc2hvcnQgPSAnaSc7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQyAqLwotCQkJICAgIH0KLQkJCX0JLyogYmlnbnVtIG9yIGZsb251bSA/ICovCi0JCSAgICB9CQkvKiAgaWYgIywgYnV0IG5vIFNeIG9yIEleIHNlZW4uICovCi0JCSAgLyogTm8gbW9yZSAnICcgY2FzZTogZWl0aGVyICdzJyBvciAnaScuICovCi0JCSAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnKQotCQkgICAgewotCQkgICAgICAvKiBXYW50cyB0byBiZSBhIHNob3J0IGxpdGVyYWwuICovCi0JCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPiAwKQotCQkJewotCQkJICBhc193YXJuIChfKCJCaWdudW0gbm90IHBlcm1pdHRlZCBpbiBzaG9ydCBsaXRlcmFsLiBJbW1lZGlhdGUgbW9kZSBhc3N1bWVkLiIpKTsKLQkJCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJCSAgb3BlcmFuZFAtPnZvcF9tb2RlID0gODsKLQkJCSAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQy4gKi8KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAoIWNhbl9iZV9zaG9ydCkKLQkJCSAgICB7Ci0JCQkgICAgICBhc193YXJuIChfKCJDYW4ndCBkbyBmbG9udW0gc2hvcnQgbGl0ZXJhbDogaW1tZWRpYXRlIG1vZGUgdXNlZC4iKSk7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9tb2RlID0gODsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3BfcmVnID0gMHhGOwkvKiBWQVggUEMuICovCi0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewkvKiBFbmNvZGUgc2hvcnQgbGl0ZXJhbCBub3cuICovCi0JCQkgICAgICBpbnQgdGVtcCA9IDA7Ci0KLQkJCSAgICAgIHN3aXRjaCAoLWV4cFAtPlhfYWRkX251bWJlcikKLQkJCQl7Ci0JCQkJY2FzZSAnZic6Ci0JCQkJY2FzZSAnZCc6Ci0JCQkJICB0ZW1wID0gbGl0ZXJhbF9mbG9hdFswXSA+PiA0OwotCQkJCSAgYnJlYWs7Ci0KLQkJCQljYXNlICdnJzoKLQkJCQkgIHRlbXAgPSBsaXRlcmFsX2Zsb2F0WzBdID4+IDE7Ci0JCQkJICBicmVhazsKLQotCQkJCWNhc2UgJ2gnOgotCQkJCSAgdGVtcCA9ICgobGl0ZXJhbF9mbG9hdFswXSA8PCAzKSAmIDA3MCkKLQkJCQkgICAgfCAoKGxpdGVyYWxfZmxvYXRbMV0gPj4gMTMpICYgMDcpOwotCQkJCSAgYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OgotCQkJCSAgQkFEX0NBU0UgKC1leHBQLT5YX2FkZF9udW1iZXIpOwotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCi0JCQkgICAgICBmbG9hdFAtPmxvd1swXSA9IHRlbXAgJiAwNzc7Ci0JCQkgICAgICBmbG9hdFAtPmxvd1sxXSA9IDA7Ci0JCQkgICAgfQkvKiBpZiBjYW4gYmUgc2hvcnQgbGl0ZXJhbCBmbG9hdCAqLwotCQkJfQkvKiBmbG9udW0gb3IgYmlnbnVtID8gKi8KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7CQkvKiBJXiMgc2Vlbjogc2V0IGl0IHVwIGlmIGZsb2F0LiAqLwotCQkgICAgICBpZiAoZXhwUC0+WF9hZGRfbnVtYmVyIDwgMCkKLQkJCXsKLQkJCSAgbWVtY3B5IChmbG9hdFAtPmxvdywgbGl0ZXJhbF9mbG9hdCwgc2l6ZW9mIChsaXRlcmFsX2Zsb2F0KSk7Ci0JCQl9Ci0JCSAgICB9CQkvKiBpZiBTXiMgc2Vlbi4gKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX3dhcm4gKF8oIkEgYmlnbnVtL2Zsb251bSBtYXkgbm90IGJlIGEgZGlzcGxhY2VtZW50OiAweCVseCB1c2VkIiksCi0JCQkgICAoZXhwUC0+WF9hZGRfbnVtYmVyID0gMHg4MDAwMDAwMEwpKTsKLQkJICAvKiBDaG9zZW4gc28gbHVzZXIgZ2V0cyB0aGUgbW9zdCBvZmZzZXQgYml0cyB0byBwYXRjaCBsYXRlci4gKi8KLQkJfQotCSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IGZsb2F0UC0+bG93WzBdCi0JCXwgKChMSVRUTEVOVU1fTUFTSyAmIChmbG9hdFAtPmxvd1sxXSkpIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyk7Ci0JICAgICAgLyoKLQkgICAgICAgKiBGb3IgdGhlIE9fYmlnIGNhc2Ugd2UgaGF2ZToKLQkgICAgICAgKiBJZiB2b3Bfc2hvcnQgPT0gJ3MnIHRoZW4gYSBzaG9ydCBmbG9hdGluZyBsaXRlcmFsIGlzIGluIHRoZQotCSAgICAgICAqCWxvd2VzdCA2IGJpdHMgb2YgZmxvYXRQIC0+IGxvdyBbMF0sIHdoaWNoIGlzCi0JICAgICAgICoJYmlnX29wZXJhbmRfYml0cyBbLS0tXSBbMF0uCi0JICAgICAgICogSWYgdm9wX3Nob3J0ID09ICdpJyB0aGVuIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgZWxlbWVudHMKLQkgICAgICAgKglvZiBiaWdfb3BlcmFuZF9iaXRzIFstLS1dIFsuLi5dIGFyZSBzZXQgdXAgd2l0aCB0aGUgY29ycmVjdAotCSAgICAgICAqCWJpdHMuCi0JICAgICAgICogQWxzbywganVzdCBpbiBjYXNlIHdpZHRoIGlzIGJ5dGUgd29yZCBvciBsb25nLCB3ZSBjb3B5IHRoZSBsb3dlc3QKLQkgICAgICAgKiAzMiBiaXRzIG9mIHRoZSBudW1iZXIgdG8gWF9hZGRfbnVtYmVyLgotCSAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoaW5wdXRfbGluZV9wb2ludGVyICE9IG9wZXJhbmRQLT52b3BfZXhwcl9lbmQgKyAxKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoIkp1bmsgYXQgZW5kIG9mIGV4cHJlc3Npb24gXCIlc1wiIiwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICAgICBnb29mZWQgPSAxOwotCSAgICB9Ci0JICBvcGVyYW5kUC0+dm9wX2V4cHJfZW5kWzFdID0gY19zYXZlOwotCX0KLSAgICB9CQkJCS8qIGZvcihlYWNoIG9wZXJhbmQpICovCi0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKG5lZWRfcGFzc18yIHx8IGdvb2ZlZCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgLyogRW1pdCBvcC1jb2RlLiAqLwotICAvKiBSZW1lbWJlciB3aGVyZSBpdCBpcywgaW4gY2FzZSB3ZSB3YW50IHRvIG1vZGlmeSB0aGUgb3AtY29kZSBsYXRlci4gKi8KLSAgb3Bjb2RlX2xvd19ieXRlUCA9IGZyYWdfbW9yZSAodi52aXRfb3Bjb2RlX25ieXRlcyk7Ci0gIG1lbWNweSAob3Bjb2RlX2xvd19ieXRlUCwgdi52aXRfb3Bjb2RlLCB2LnZpdF9vcGNvZGVfbmJ5dGVzKTsKLSAgb3Bjb2RlX2FzX251bWJlciA9IG1kX2NoYXJzX3RvX251bWJlciAob3Bjb2RlX2FzX2NoYXJzID0gdi52aXRfb3Bjb2RlLCA0KTsKLSAgZm9yIChvcGVyYW5kUCA9IHYudml0X29wZXJhbmQsCi0gICAgICAgZXhwUCA9IGV4cF9vZl9vcGVyYW5kLAotICAgICAgIHNlZ1AgPSBzZWdfb2Zfb3BlcmFuZCwKLSAgICAgICBmbG9hdFAgPSBmbG9hdF9vcGVyYW5kLAotICAgICAgIGVuZF9vcGVyYW5kUCA9IHYudml0X29wZXJhbmQgKyB2LnZpdF9vcGVyYW5kczsKLQotICAgICAgIG9wZXJhbmRQIDwgZW5kX29wZXJhbmRQOwotCi0gICAgICAgb3BlcmFuZFArKywKLSAgICAgICBmbG9hdFArKywKLSAgICAgICBzZWdQKyssCi0gICAgICAgZXhwUCsrKQotICAgIHsKLSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX25keCA+PSAwKQotCXsKLQkgIC8qIGluZGV4ZWQgYWRkcmVzc2luZyBieXRlICovCi0JICAvKiBMZWdhbGl0eSBvZiBpbmRleGVkIG1vZGUgYWxyZWFkeSBjaGVja2VkOiBpdCBpcyBPSyAqLwotCSAgRlJBR19BUFBFTkRfMV9DSEFSICgweDQwICsgb3BlcmFuZFAtPnZvcF9uZHgpOwotCX0JCQkvKiBpZih2b3BfbmR4Pj0wKSAqLwotCi0gICAgICAvKiBIZXJlIHRvIG1ha2UgbWFpbiBvcGVyYW5kIGZyYWcocykuICovCi0gICAgICB0aGlzX2FkZF9udW1iZXIgPSBleHBQLT5YX2FkZF9udW1iZXI7Ci0gICAgICB0aGlzX2FkZF9zeW1ib2wgPSBleHBQLT5YX2FkZF9zeW1ib2w7Ci0gICAgICB0b19zZWcgPSAqc2VnUDsKLSAgICAgIGlzX3VuZGVmaW5lZCA9ICh0b19zZWcgPT0gU0VHX1VOS05PV04pOwotICAgICAgYXQgPSBvcGVyYW5kUC0+dm9wX21vZGUgJiAxOwotICAgICAgbGVuZ3RoID0gKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ2InCi0JCT8gMSA6IChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICd3JwotCQkgICAgICAgPyAyIDogKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ2wnCi0JCQkgICAgICA/IDQgOiAwKSkpOwotICAgICAgbmJ5dGVzID0gb3BlcmFuZFAtPnZvcF9uYnl0ZXM7Ci0gICAgICBpZiAob3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ2InKQotCXsKLQkgIGlmICh0b19zZWcgPT0gbm93X3NlZyB8fCBpc191bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICAvKiBJZiBpc191bmRlZmluZWQsIHRoZW4gaXQgbWlnaHQgQkVDT01FIG5vd19zZWcuICovCi0JICAgICAgaWYgKG5ieXRlcykKLQkJewotCQkgIHAgPSBmcmFnX21vcmUgKG5ieXRlcyk7Ci0JCSAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgbmJ5dGVzLAotCQkJICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogdG9fc2VnPT1ub3dfc2VnIHx8IHRvX3NlZyA9PSBTRUdfVU5LTk9XTiAqLwotCQkgIC8qIG5ieXRlcz09MCAqLwotCQkgIGxlbmd0aF9jb2RlID0gaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX0JZVEU7Ci0JCSAgaWYgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NQRUNJQUwpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9VTkNPTkRJVElPTkFMX0pVTVApCi0JCQl7Ci0JCQkgIC8qIGJyIG9yIGpzYiAqLwotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDUsIDEsCi0JCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBsZW5ndGhfY29kZSksCi0JCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCSAgICBvcGNvZGVfbG93X2J5dGVQKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfV09SRF9KVU1QKQotCQkJICAgIHsKLQkJCSAgICAgIGxlbmd0aF9jb2RlID0gU1RBVEVfV09SRDsKLQkJCSAgICAgIC8qIEpGOiBUaGVyZSBpcyBubyBzdGF0ZV9ieXRlIGZvciB0aGlzIG9uZSEgKi8KLQkJCSAgICAgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTAsIDIsCi0JCQkJCUVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9CUkFOQ0gsIGxlbmd0aF9jb2RlKSwKLQkJCQkJdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJCW9wY29kZV9sb3dfYnl0ZVApOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0JZVEVfSlVNUCk7Ci0JCQkgICAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDksIDEsCi0JCQkgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBsZW5ndGhfY29kZSksCi0JCQkJCXRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCQlvcGNvZGVfbG93X2J5dGVQKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBrbm93IChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9DT05ESVRJT05BTF9KVU1QKTsKLQkJICAgICAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA3LCAxLAotCQkgICAgICAgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIGxlbmd0aF9jb2RlKSwKLQkJCQl0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCQlvcGNvZGVfbG93X2J5dGVQKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiB0b19zZWcgIT0gbm93X3NlZyAmJiB0b19zZWcgIT0gU0VHX1VOS05PV04gKi8KLQkgICAgICAvKgotCSAgICAgICAqIC0tLSBTRUcgRkxPQVQgTUFZIEFQUEVBUiBIRVJFIC0tLS0KLQkgICAgICAgKi8KLQkgICAgICBpZiAodG9fc2VnID09IFNFR19BQlNPTFVURSkKLQkJewotCQkgIGlmIChuYnl0ZXMpCi0JCSAgICB7Ci0JCSAgICAgIGtub3cgKCEob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1lOVEhFVElDKSk7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKG5ieXRlcyk7Ci0JCSAgICAgIC8qIENvbnZlbnRpb25hbCByZWxvY2F0aW9uLiAqLwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIG5ieXRlcywgJmFic19zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCSAgICAgICAxLCBOT19SRUxPQyk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBrbm93IChvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TWU5USEVUSUMpOwotCQkgICAgICBpZiAob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1BFQ0lBTCkKLQkJCXsKLQkJCSAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1VOQ09ORElUSU9OQUxfSlVNUCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBiciBvciBqc2IgKi8KLQkJCSAgICAgICpvcGNvZGVfbG93X2J5dGVQID0gb3Bjb2RlX2FzX2NoYXJzWzBdICsgVkFYX1dJREVOX0xPTkc7Ci0JCQkgICAgICBrbm93IChvcGNvZGVfYXNfY2hhcnNbMV0gPT0gMCk7Ci0JCQkgICAgICBwID0gZnJhZ19tb3JlICg1KTsKLQkJCSAgICAgIHBbMF0gPSBWQVhfQUJTT0xVVEVfTU9ERTsJLyogQCMuLi4gKi8KLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkgICAgICAvKiBOb3cgKGVnKSBKTVAgQCNmb28gb3IgSlNCIEAjZm9vLiAqLwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9XT1JEX0pVTVApCi0JCQkJewotCQkJCSAgcCA9IGZyYWdfbW9yZSAoMTApOwotCQkJCSAgcFswXSA9IDI7Ci0JCQkJICBwWzFdID0gMDsKLQkJCQkgIHBbMl0gPSBWQVhfQlJCOwotCQkJCSAgcFszXSA9IDY7Ci0JCQkJICBwWzRdID0gVkFYX0pNUDsKLQkJCQkgIHBbNV0gPSBWQVhfQUJTT0xVVEVfTU9ERTsJLyogQCMuLi4gKi8KLQkJCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDYsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkJICAvKgotCQkJCSAgICogTm93IChlZykJQUNCeAkxZgotCQkJCSAgICoJCUJSQgkyZgotCQkJCSAgICoJMToJSk1QCUAjZm9vCi0JCQkJICAgKgkyOgotCQkJCSAgICovCi0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0JZVEVfSlVNUCk7Ci0JCQkJICBwID0gZnJhZ19tb3JlICg5KTsKLQkJCQkgIHBbMF0gPSAyOwotCQkJCSAgcFsxXSA9IFZBWF9CUkI7Ci0JCQkJICBwWzJdID0gNjsKLQkJCQkgIHBbM10gPSBWQVhfSk1QOwotCQkJCSAgcFs0XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFICsgMTsJLyogQCMuLi4gKi8KLQkJCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDUsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkJICAvKgotCQkJCSAgICogTm93IChlZykJeE9CeHh4CTFmCi0JCQkJICAgKgkJQlJCCTJmCi0JCQkJICAgKgkxOglKTVAJQCNmb28KLQkJCQkgICAqCTI6Ci0JCQkJICAgKi8KLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIGI8Y29uZD4gKi8KLQkJCSAgKm9wY29kZV9sb3dfYnl0ZVAgXj0gMTsKLQkJCSAgLyogVG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uIGluIGEgVkFYIGJyYW5jaCwKLQkJCSAgICAgY29tcGxlbWVudCB0aGUgbG93ZXN0IG9yZGVyIGJpdC4gKi8KLQkJCSAgcCA9IGZyYWdfbW9yZSAoNyk7Ci0JCQkgIHBbMF0gPSA2OwotCQkJICBwWzFdID0gVkFYX0pNUDsKLQkJCSAgcFsyXSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLwotCQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyAzLCB0aGlzX2FkZF9udW1iZXIsIDQpOwotCQkJICAvKgotCQkJICAgKiBOb3cgKGVnKQlCTEVRCTFmCi0JCQkgICAqCQlKTVAJQCNmb28KLQkJCSAgICoJMToKLQkJCSAgICovCi0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiB0b19zZWcgIT0gbm93X3NlZyAmJiB0b19zZWcgIT0gU0VHX1VOS05PV04gJiYgdG9fU2VnICE9IFNFR19BQlNPTFVURSAqLwotCQkgIGlmIChuYnl0ZXMgPiAwKQotCQkgICAgewotCQkgICAgICAvKiBQYy1yZWxhdGl2ZS4gQ29udmVudGlvbmFsIHJlbG9jYXRpb24uICovCi0JCSAgICAgIGtub3cgKCEob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1lOVEhFVElDKSk7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKG5ieXRlcyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgbmJ5dGVzLCAmYWJzX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIDEsIE5PX1JFTE9DKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGtub3cgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NZTlRIRVRJQyk7Ci0JCSAgICAgIGlmIChvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TUEVDSUFMKQotCQkJewotCQkJICBpZiAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfVU5DT05ESVRJT05BTF9KVU1QKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIGJyIG9yIGpzYiAqLwotCQkJICAgICAga25vdyAob3Bjb2RlX2FzX2NoYXJzWzFdID09IDApOwotCQkJICAgICAgKm9wY29kZV9sb3dfYnl0ZVAgPSBvcGNvZGVfYXNfY2hhcnNbMF0gKyBWQVhfV0lERU5fTE9ORzsKLQkJCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkJICAgICAgcFswXSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotCQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csCi0JCQkJICAgICAgIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICAgICAgdGhpc19hZGRfbnVtYmVyLCAxLCBOT19SRUxPQyk7Ci0JCQkgICAgICAvKiBOb3cgZWcgSk1QIGZvbyBvciBKU0IgZm9vLiAqLwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9XT1JEX0pVTVApCi0JCQkJewotCQkJCSAgcCA9IGZyYWdfbW9yZSAoMTApOwotCQkJCSAgcFswXSA9IDA7Ci0JCQkJICBwWzFdID0gMjsKLQkJCQkgIHBbMl0gPSBWQVhfQlJCOwotCQkJCSAgcFszXSA9IDY7Ci0JCQkJICBwWzRdID0gVkFYX0pNUDsKLQkJCQkgIHBbNV0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLQkJCQkgIGZpeF9uZXcgKGZyYWdfbm93LAotCQkJCQkgICBwICsgNiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQkJCQkgICB0aGlzX2FkZF9zeW1ib2wsCi0JCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOwotCQkJCSAgLyoKLQkJCQkgICAqIE5vdyAoZWcpCUFDQngJMWYKLQkJCQkgICAqCQlCUkIJMmYKLQkJCQkgICAqCTE6CUpNUAlmb28KLQkJCQkgICAqCTI6Ci0JCQkJICAgKi8KLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfQllURV9KVU1QKTsKLQkJCQkgIHAgPSBmcmFnX21vcmUgKDEwKTsKLQkJCQkgIHBbMF0gPSAyOwotCQkJCSAgcFsxXSA9IFZBWF9CUkI7Ci0JCQkJICBwWzJdID0gNjsKLQkJCQkgIHBbM10gPSBWQVhfSk1QOwotCQkJCSAgcFs0XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotCQkJCSAgZml4X25ldyAoZnJhZ19ub3csCi0JCQkJCSAgIHAgKyA1IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkJCSAgIDQsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkJICAgdGhpc19hZGRfbnVtYmVyLCAxLCBOT19SRUxPQyk7Ci0JCQkJICAvKgotCQkJCSAgICogTm93IChlZykJeE9CeHh4CTFmCi0JCQkJICAgKgkJQlJCCTJmCi0JCQkJICAgKgkxOglKTVAJZm9vCi0JCQkJICAgKgkyOgotCQkJCSAgICovCi0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9DT05ESVRJT05BTF9KVU1QKTsKLQkJCSAgKm9wY29kZV9sb3dfYnl0ZVAgXj0gMTsJLyogUmV2ZXJzZSBicmFuY2ggY29uZGl0aW9uLiAqLwotCQkJICBwID0gZnJhZ19tb3JlICg3KTsKLQkJCSAgcFswXSA9IDY7Ci0JCQkgIHBbMV0gPSBWQVhfSk1QOwotCQkJICBwWzJdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7Ci0JCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMyAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCSAgIDQsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGtub3cgKG9wZXJhbmRQLT52b3BfYWNjZXNzICE9ICdiJyk7CS8qIFNvIGl0IGlzIG9yZGluYXJ5IG9wZXJhbmQuICovCi0JICBrbm93IChvcGVyYW5kUC0+dm9wX2FjY2VzcyAhPSAnICcpOwkvKiAnICcgdGFyZ2V0LWluZGVwZW5kZW50OiBlbHNld2hlcmUuICovCi0JICBrbm93IChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnYScKLQkJfHwgb3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ20nCi0JCXx8IG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICdyJwotCQl8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndicKLQkJfHwgb3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ3cnKTsKLQkgIGlmIChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICdzJykKLQkgICAgewotCSAgICAgIGlmICh0b19zZWcgPT0gU0VHX0FCU09MVVRFKQotCQl7Ci0JCSAgaWYgKHRoaXNfYWRkX251bWJlciA+PSA2NCkKLQkJICAgIHsKLQkJICAgICAgYXNfd2FybiAoXygiU2hvcnQgbGl0ZXJhbCBvdmVyZmxvdyglbGQuKSwgaW1tZWRpYXRlIG1vZGUgYXNzdW1lZC4iKSwKLQkJCSAgICAgICAobG9uZykgdGhpc19hZGRfbnVtYmVyKTsKLQkJICAgICAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJICAgICAgb3BlcmFuZFAtPnZvcF9tb2RlID0gODsKLQkJICAgICAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc193YXJuIChfKCJGb3JjZWQgc2hvcnQgbGl0ZXJhbCB0byBpbW1lZGlhdGUgbW9kZS4gbm93X3NlZz0lcyB0b19zZWc9JXMiKSwKLQkJCSAgIHNlZ21lbnRfbmFtZSAobm93X3NlZyksIHNlZ21lbnRfbmFtZSAodG9fc2VnKSk7Ci0JCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkgIG9wZXJhbmRQLT52b3BfcmVnID0gMHhGOwotCQl9Ci0JICAgIH0KLQkgIGlmIChvcGVyYW5kUC0+dm9wX3JlZyA+PSAwICYmIChvcGVyYW5kUC0+dm9wX21vZGUgPCA4Ci0JCSAgfHwgKG9wZXJhbmRQLT52b3BfcmVnICE9IDB4RiAmJiBvcGVyYW5kUC0+dm9wX21vZGUgPCAxMCkpKQotCSAgICB7Ci0JICAgICAgLyogT25lIGJ5dGUgb3BlcmFuZC4gKi8KLQkgICAgICBrbm93IChvcGVyYW5kUC0+dm9wX21vZGUgPiAzKTsKLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKG9wZXJhbmRQLT52b3BfbW9kZSA8PCA0IHwgb3BlcmFuZFAtPnZvcF9yZWcpOwotCSAgICAgIC8qIEFsbCAxLWJ5dGVzIGV4Y2VwdCBTXiMgaGFwcGVuIGhlcmUuICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHtAfXtxXn1mb297KFJuKX0gb3IgU14jZm9vICovCi0JICAgICAgaWYgKG9wZXJhbmRQLT52b3BfcmVnID09IC0xICYmIG9wZXJhbmRQLT52b3Bfc2hvcnQgIT0gJ3MnKQotCQl7Ci0JCSAgLyogIntAfXtxXn1mb28iICovCi0JCSAgaWYgKHRvX3NlZyA9PSBub3dfc2VnKQotCQkgICAgewotCQkgICAgICBpZiAobGVuZ3RoID09IDApCi0JCQl7Ci0JCQkgIGtub3cgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJyAnKTsKLQkJCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTAsIDIsCi0JCQkgICAgICAgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSksCi0JCQkJCXRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCQlvcGNvZGVfbG93X2J5dGVQKTsKLQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9tb2RlID09IDEwICsgYXQpOwotCQkJICAqcCA9IGF0IDw8IDQ7Ci0JCQkgIC8qIEF0IGlzIHRoZSBvbmx5IGNvbnRleHQgd2UgbmVlZCB0byBjYXJyeQotCQkJICAgICB0byBvdGhlciBzaWRlIG9mIHJlbGF4KCkgcHJvY2Vzcy4gIE11c3QKLQkJCSAgICAgYmUgaW4gdGhlIGNvcnJlY3QgYml0IHBvc2l0aW9uIG9mIFZBWAotCQkJICAgICBvcGVyYW5kIHNwZWMuIGJ5dGUuICovCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAga25vdyAobGVuZ3RoKTsKLQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAnICcpOwotCQkJICBwID0gZnJhZ19tb3JlIChsZW5ndGggKyAxKTsKLQkJCSAgcFswXSA9IDB4RiB8ICgoYXQgKyAiP1wxMlwxND9cMTYiW2xlbmd0aF0pIDw8IDQpOwotCQkJICBmaXhfbmV3IChmcmFnX25vdywgcCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCQkgICBsZW5ndGgsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7CQkvKiB0b19zZWcgIT0gbm93X3NlZyAqLwotCQkgICAgICBpZiAodGhpc19hZGRfc3ltYm9sID09IE5VTEwpCi0JCQl7Ci0JCQkgIGtub3cgKHRvX3NlZyA9PSBTRUdfQUJTT0xVVEUpOwotCQkJICAvKiBEbyBAI2Zvbzogc2ltcGxlciByZWxvY2F0aW9uIHRoYW4gZm9vLS4ocGMpIGFueXdheS4gKi8KLQkJCSAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCQkgIHBbMF0gPSBWQVhfQUJTT0xVVEVfTU9ERTsJLyogQCMuLi4gKi8KLQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCSAgaWYgKGxlbmd0aCAmJiBsZW5ndGggIT0gNCkKLQkJCSAgICB7Ci0JCQkgICAgICBhc193YXJuIChfKCJMZW5ndGggc3BlY2lmaWNhdGlvbiBpZ25vcmVkLiBBZGRyZXNzIG1vZGUgOUYgdXNlZCIpKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyoge0B9e3FefW90aGVyX3NlZyAqLwotCQkJICBrbm93ICgobGVuZ3RoID09IDAgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpCi0JCQkgICAgIHx8IChsZW5ndGggPiAwICYmIG9wZXJhbmRQLT52b3Bfc2hvcnQgIT0gJyAnKSk7Ci0JCQkgIGlmIChpc191bmRlZmluZWQpCi0JCQkgICAgewotCQkJICAgICAgLyoKLQkJCSAgICAgICAqIFdlIGhhdmUgYSBTRUdfVU5LTk9XTiBzeW1ib2wuIEl0IG1pZ2h0Ci0JCQkgICAgICAgKiB0dXJuIG91dCB0byBiZSBpbiB0aGUgc2FtZSBzZWdtZW50IGFzCi0JCQkgICAgICAgKiB0aGUgaW5zdHJ1Y3Rpb24sIHBlcm1pdHRpbmcgcmVsYXhhdGlvbi4KLQkJCSAgICAgICAqLwotCQkJICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMiwKLQkJCSAgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9VTkRGKSwKLQkJCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCQkgICAgMCk7Ci0JCQkgICAgICBwWzBdID0gYXQgPDwgNDsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAobGVuZ3RoID09IDApCi0JCQkJewotCQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpOwotCQkJCSAgbGVuZ3RoID0gNDsJLyogTG9uZ2VzdCBwb3NzaWJsZS4gKi8KLQkJCQl9Ci0JCQkgICAgICBwID0gZnJhZ19tb3JlIChsZW5ndGggKyAxKTsKLQkJCSAgICAgIHBbMF0gPSAweEYgfCAoKGF0ICsgIj9cMTJcMTQ/XDE2IltsZW5ndGhdKSA8PCA0KTsKLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgbGVuZ3RoKTsKLQkJCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LAotCQkJCSAgICAgICBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCSAgICAgICBsZW5ndGgsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICAgICAgdGhpc19hZGRfbnVtYmVyLCAxLCBOT19SRUxPQyk7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyoge0B9e3FefWZvbyhSbikgb3IgU14jIG9yIEleIyBvciAjICovCi0JCSAgaWYgKG9wZXJhbmRQLT52b3BfbW9kZSA8IDB4QSkKLQkJICAgIHsKLQkJICAgICAgLyogIyBvciBTXiMgb3IgSV4jICovCi0JCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndicKLQkJCSAgfHwgb3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ2EnKQotCQkJewotCQkJICBpZiAob3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ3YnKQotCQkJICAgIGFzX3dhcm4gKF8oIkludmFsaWQgb3BlcmFuZDogIGltbWVkaWF0ZSB2YWx1ZSB1c2VkIGFzIGJhc2UgYWRkcmVzcy4iKSk7Ci0JCQkgIGVsc2UKLQkJCSAgICBhc193YXJuIChfKCJJbnZhbGlkIG9wZXJhbmQ6ICBpbW1lZGlhdGUgdmFsdWUgdXNlZCBhcyBhZGRyZXNzLiIpKTsKLQkJCSAgLyogZ2NjIDIuNi4zIGlzIGtub3duIHRvIGdlbmVyYXRlIHRoZXNlIGluIGF0IGxlYXN0Ci0JCQkgICAgIG9uZSBjYXNlLiAgKi8KLQkJCX0KLQkJICAgICAgaWYgKGxlbmd0aCA9PSAwCi0JCQkgICYmIHRvX3NlZyA9PSBTRUdfQUJTT0xVVEUgJiYgKGV4cFAtPlhfb3AgIT0gT19iaWcpCi0JCQkgICYmIG9wZXJhbmRQLT52b3BfbW9kZSA9PSA4CS8qIE5vICdAJy4gKi8KLQkJCSAgJiYgdGhpc19hZGRfbnVtYmVyIDwgNjQpCi0JCQl7Ci0JCQkgIG9wZXJhbmRQLT52b3Bfc2hvcnQgPSAncyc7Ci0JCQl9Ci0JCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICdzJykKLQkJCXsKLQkJCSAgRlJBR19BUFBFTkRfMV9DSEFSICh0aGlzX2FkZF9udW1iZXIpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIEleIy4uLiAqLwotCQkJICBrbm93IChuYnl0ZXMpOwotCQkJICBwID0gZnJhZ19tb3JlIChuYnl0ZXMgKyAxKTsKLQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9yZWcgPT0gMHhGKTsKLQkJCSAgcFswXSA9IChvcGVyYW5kUC0+dm9wX21vZGUgPDwgNCkgfCAweEY7Ci0JCQkgIGlmICgodG9fc2VnID09IFNFR19BQlNPTFVURSkgJiYgKGV4cFAtPlhfb3AgIT0gT19iaWcpKQotCQkJICAgIHsKLQkJCSAgICAgIC8qCi0JCQkgICAgICAgKiBJZiBuYnl0ZXMgPiA0LCB0aGVuIHdlIGFyZSBzY3JvZC4gV2UKLQkJCSAgICAgICAqIGRvbid0IGtub3cgaWYgdGhlIGhpZ2ggb3JkZXIgYnl0ZXMKLQkJCSAgICAgICAqIGFyZSB0byBiZSAweEZGIG9yIDB4MDAuICBCU0Q0LjIgJiBSTVMKLQkJCSAgICAgICAqIHNheSB1c2UgMHgwMC4gT0sgLS0tIGJ1dCB0aGlzCi0JCQkgICAgICAgKiBhc3NlbWJsZXIgbmVlZHMgQU5PVEhFUiByZXdyaXRlIHRvCi0JCQkgICAgICAgKiBjb3BlIHByb3Blcmx5IHdpdGggdGhpcyBidWcuICovCi0JCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyAxLCB0aGlzX2FkZF9udW1iZXIsIG1pbiAoNCwgbmJ5dGVzKSk7Ci0JCQkgICAgICBpZiAobmJ5dGVzID4gNCkKLQkJCQl7Ci0JCQkJICBtZW1zZXQgKHAgKyA1LCAnXDAnLCBuYnl0ZXMgLSA0KTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaWYgKGV4cFAtPlhfb3AgPT0gT19iaWcpCi0JCQkJewotCQkJCSAgLyoKLQkJCQkgICAqIFByb2JsZW0gaGVyZSBpcyB0byBnZXQgdGhlIGJ5dGVzCi0JCQkJICAgKiBpbiB0aGUgcmlnaHQgb3JkZXIuICBXZSBzdG9yZWQKLQkJCQkgICAqIG91ciBjb25zdGFudCBhcyBMSVRUTEVOVU1zLCBub3QKLQkJCQkgICAqIGJ5dGVzLiAqLwotCQkJCSAgTElUVExFTlVNX1RZUEUgKmxQOwotCi0JCQkJICBsUCA9IGZsb2F0UC0+bG93OwotCQkJCSAgaWYgKG5ieXRlcyAmIDEpCi0JCQkJICAgIHsKLQkJCQkgICAgICBrbm93IChuYnl0ZXMgPT0gMSk7Ci0JCQkJICAgICAgcFsxXSA9ICpsUDsKLQkJCQkgICAgfQotCQkJCSAgZWxzZQotCQkJCSAgICB7Ci0JCQkJICAgICAgZm9yIChwKys7IG5ieXRlczsgbmJ5dGVzIC09IDIsIHAgKz0gMiwgbFArKykKLQkJCQkJewotCQkJCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKmxQLCAyKTsKLQkJCQkJfQotCQkJCSAgICB9Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCQkgICBuYnl0ZXMsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkJICAgdGhpc19hZGRfbnVtYmVyLCAwLCBOT19SRUxPQyk7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7CQkvKiB7QH17cV59Zm9vKFJuKSAqLwotCQkgICAgICBrbm93ICgobGVuZ3RoID09IDAgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpCi0JCQkgICAgfHwgKGxlbmd0aCA+IDAgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAnICcpKTsKLQkJICAgICAgaWYgKGxlbmd0aCA9PSAwKQotCQkJewotCQkJICBpZiAodG9fc2VnID09IFNFR19BQlNPTFVURSkKLQkJCSAgICB7Ci0JCQkgICAgICBsb25nIHRlc3Q7Ci0KLQkJCSAgICAgIHRlc3QgPSB0aGlzX2FkZF9udW1iZXI7Ci0KLQkJCSAgICAgIGlmICh0ZXN0IDwgMCkKLQkJCQl0ZXN0ID0gfnRlc3Q7Ci0KLQkJCSAgICAgIGxlbmd0aCA9IHRlc3QgJiAweGZmZmY4MDAwID8gNAotCQkJCTogdGVzdCAmIDB4ZmZmZmZmODAgPyAyCi0JCQkJOiAxOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGxlbmd0aCA9IDQ7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBwID0gZnJhZ19tb3JlICgxICsgbGVuZ3RoKTsKLQkJICAgICAga25vdyAob3BlcmFuZFAtPnZvcF9yZWcgPj0gMCk7Ci0JCSAgICAgIHBbMF0gPSBvcGVyYW5kUC0+dm9wX3JlZwotCQkJfCAoKGF0IHwgIj9cMTJcMTQ/XDE2IltsZW5ndGhdKSA8PCA0KTsKLQkJICAgICAgaWYgKHRvX3NlZyA9PSBTRUdfQUJTT0xVVEUpCi0JCQl7Ci0JCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgbGVuZ3RoKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBmaXhfbmV3IChmcmFnX25vdywgcCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCQkgICBsZW5ndGgsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDAsIE5PX1JFTE9DKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9CQkJLyogaWYoc2luZ2xlLWJ5dGUtb3BlcmFuZCkgKi8KLQl9Ci0gICAgfQkJCQkvKiBmb3Iob3BlcmFuZFApICovCi19CQkJCS8qIHZheF9hc3NlbWJsZSgpICovCi0MCi0vKgotICoJCQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpCi0gKgotICogQ2FsbGVkIGp1c3QgYmVmb3JlIHJlbGF4KCkuCi0gKiBBbnkgc3ltYm9sIHRoYXQgaXMgbm93IHVuZGVmaW5lZCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZC4KLSAqIFJldHVybiB0aGUgY29ycmVjdCBmcl9zdWJ0eXBlIGluIHRoZSBmcmFnLgotICogUmV0dXJuIHRoZSBpbml0aWFsICJndWVzcyBmb3IgZnJfdmFyIiB0byBjYWxsZXIuCi0gKiBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gKiBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICogQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICogMCB2YWx1ZS4KLSAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBjaGFyICpwOwotICBpbnQgb2xkX2ZyX2ZpeDsKLQotICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQotCXsJCQkvKiBBIHJlbGF4YWJsZSBjYXNlLiAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9CWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgIHBbMF0gfD0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIFByZXNlcnZlIEAgYml0LiAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgXj0gMTsJLyogUmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guICovCi0JICBwWzBdID0gNjsKLQkgIHBbMV0gPSBWQVhfSk1QOwotCSAgcFsyXSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwkvKiAuLi4oUEMpICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyAxICsgMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDMsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgU1RBVEVfV09SRCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICBwWzBdID0gMjsKLQkgIHBbMV0gPSAwOwotCSAgcFsyXSA9IFZBWF9CUkI7Ci0JICBwWzNdID0gNjsKLQkgIHBbNF0gPSBWQVhfSk1QOwotCSAgcFs1XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwkvKiAuLi4ocGMpICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDIgKyAyICsgMSArIDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyA2LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgcFswXSA9IDI7Ci0JICBwWzFdID0gVkFYX0JSQjsKLQkgIHBbMl0gPSA2OwotCSAgcFszXSA9IFZBWF9KTVA7Ci0JICBwWzRdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihwYykgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDIgKyAxICsgMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDUsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgKz0gVkFYX1dJREVOX0xPTkc7Ci0JICBwWzBdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihQQykgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0MCi0vKgotICoJCQltZF9jb252ZXJ0X2ZyYWcoKTsKLSAqCi0gKiBDYWxsZWQgYWZ0ZXIgcmVsYXgoKSBpcyBmaW5pc2hlZC4KLSAqIEluOglBZGRyZXNzIG9mIGZyYWcuCi0gKglmcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICoJZnJfc3VidHlwZSBpcyB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uCi0gKgotICogT3V0OglBbnkgZml4U3MgYW5kIGNvbnN0YW50cyBhcmUgc2V0IHVwLgotICoJQ2FsbGVyIHdpbGwgdHVybiBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBjaGFyICphZGRyZXNzUDsJCS8qIC0+IF92YXIgdG8gY2hhbmdlLiAqLwotICBjaGFyICpvcGNvZGVQOwkJLyogLT4gb3Bjb2RlIGNoYXIocykgdG8gY2hhbmdlLiAqLwotICBzaG9ydCBpbnQgbGVuZ3RoX2NvZGU7CS8qIDI9bG9uZyAxPXdvcmQgMD1ieXRlICovCi0gIHNob3J0IGludCBleHRlbnNpb24gPSAwOwkvKiBTaXplIG9mIHJlbGF4ZWQgYWRkcmVzcy4gKi8KLSAgLyogQWRkZWQgdG8gZnJfZml4OiBpbmNsLiBBTEwgdmFyIGNoYXJzLiAqLwotICBzeW1ib2xTICpzeW1ib2xQOwotICBsb25nIHdoZXJlOwotICBsb25nIGFkZHJlc3Nfb2ZfdmFyOwotICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgaXMgX3ZhciBvZiAqZnJhZ1A/ICovCi0gIGxvbmcgdGFyZ2V0X2FkZHJlc3MgPSAwOwotICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgZG9lcyBhZGRyIHBvaW50PyAqLwotCi0gIGtub3cgKGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50KTsKLSAgbGVuZ3RoX2NvZGUgPSBmcmFnUC0+ZnJfc3VidHlwZSAmIDM7CS8qIGRlcGVuZHMgb24gRU5DT0RFX1JFTEFYKCkgKi8KLSAga25vdyAobGVuZ3RoX2NvZGUgPj0gMCAmJiBsZW5ndGhfY29kZSA8IDMpOwotICB3aGVyZSA9IGZyYWdQLT5mcl9maXg7Ci0gIGFkZHJlc3NQID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyB3aGVyZTsKLSAgb3Bjb2RlUCA9IGZyYWdQLT5mcl9vcGNvZGU7Ci0gIHN5bWJvbFAgPSBmcmFnUC0+ZnJfc3ltYm9sOwotICBrbm93IChzeW1ib2xQKTsKLSAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotICBhZGRyZXNzX29mX3ZhciA9IGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmU7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0JZVEUpOgotICAgICAga25vdyAoKmFkZHJlc3NQID09IDAgfHwgKmFkZHJlc3NQID09IDB4MTApOwkvKiAnQCcgYml0LiAqLwotICAgICAgYWRkcmVzc1BbMF0gfD0gMHhBRjsJLyogQnl0ZSBkaXNwbGFjZW1lbnQuICovCi0gICAgICBhZGRyZXNzUFsxXSA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1dPUkQpOgotICAgICAga25vdyAoKmFkZHJlc3NQID09IDAgfHwgKmFkZHJlc3NQID09IDB4MTApOwkvKiAnQCcgYml0LiAqLwotICAgICAgYWRkcmVzc1BbMF0gfD0gMHhDRjsJLyogV29yZCBkaXNwbGFjZW1lbnQuICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQICsgMSwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAzKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0xPTkcpOgotICAgICAga25vdyAoKmFkZHJlc3NQID09IDAgfHwgKmFkZHJlc3NQID09IDB4MTApOwkvKiAnQCcgYml0LiAqLwotICAgICAgYWRkcmVzc1BbMF0gfD0gMHhFRjsJLyogTG9uZyB3b3JkIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAxLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0JZVEUpOgotICAgICAgYWRkcmVzc1BbMF0gPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOwotICAgICAgZXh0ZW5zaW9uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBvcGNvZGVQWzBdIF49IDE7CQkvKiBSZXZlcnNlIHNlbnNlIG9mIHRlc3QuICovCi0gICAgICBhZGRyZXNzUFswXSA9IDM7Ci0gICAgICBhZGRyZXNzUFsxXSA9IFZBWF9CUkIgKyBWQVhfV0lERU5fV09SRDsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAyLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDQpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgb3Bjb2RlUFswXSBePSAxOwkJLyogUmV2ZXJzZSBzZW5zZSBvZiB0ZXN0LiAqLwotICAgICAgYWRkcmVzc1BbMF0gPSA2OwotICAgICAgYWRkcmVzc1BbMV0gPSBWQVhfSk1QOwotICAgICAgYWRkcmVzc1BbMl0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAzLCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSA3OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfQllURSk6Ci0gICAgICBhZGRyZXNzUFswXSA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMSk7Ci0gICAgICBleHRlbnNpb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBvcGNvZGVQWzBdICs9IFZBWF9XSURFTl9XT1JEOwkvKiBicmIgLT4gYnJ3LCBic2JiIC0+IGJzYncgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMiksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgb3Bjb2RlUFswXSArPSBWQVhfV0lERU5fTE9ORzsJLyogYnJiIC0+IGptcCwgYnNiYiAtPiBqc2IgKi8KLSAgICAgIGFkZHJlc3NQWzBdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQICsgMSwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA1KSwgNCk7Ci0gICAgICBleHRlbnNpb24gPSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgYWRkcmVzc1BbMF0gPSAyOwotICAgICAgYWRkcmVzc1BbMV0gPSAwOwotICAgICAgYWRkcmVzc1BbMl0gPSBWQVhfQlJCOwotICAgICAgYWRkcmVzc1BbM10gPSA2OwotICAgICAgYWRkcmVzc1BbNF0gPSBWQVhfSk1QOwotICAgICAgYWRkcmVzc1BbNV0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyA2LCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBTVEFURV9CWVRFKToKLSAgICAgIGFkZHJlc3NQWzBdID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKLSAgICAgIGV4dGVuc2lvbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfV09SRCk6Ci0gICAgICBhZGRyZXNzUFswXSA9IDI7Ci0gICAgICBhZGRyZXNzUFsxXSA9IFZBWF9CUkI7Ci0gICAgICBhZGRyZXNzUFsyXSA9IDM7Ci0gICAgICBhZGRyZXNzUFszXSA9IFZBWF9CUlc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQICsgNCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA2KSwgMik7Ci0gICAgICBleHRlbnNpb24gPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIFNUQVRFX0xPTkcpOgotICAgICAgYWRkcmVzc1BbMF0gPSAyOwotICAgICAgYWRkcmVzc1BbMV0gPSBWQVhfQlJCOwotICAgICAgYWRkcmVzc1BbMl0gPSA2OwotICAgICAgYWRkcmVzc1BbM10gPSBWQVhfSk1QOwotICAgICAgYWRkcmVzc1BbNF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyA1LCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSA5OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19CQkJCS8qIG1kX2NvbnZlcnRfZnJhZygpICovCi0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCBmb3JtYXQgb2YgcmVsb2NhdGlvbiBpbmZvIGludG8gdGFyZ2V0IGZvcm1hdC4KLQotICAgT24gdmF4OiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZywgbmV4dCB0aHJlZSBieXRlcwotICAgYXJlIHN5bWJvbG51bSwgbGVhc3Qgc2lnLiBieXRlIGZpcnN0LiAgTGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoCi0gICB0aGUgdXBwZXIgbmliYmxlIGFzIG51dGhpbiwgYml0IDMgYXMgZXh0ZXJuLCBiaXRzIDIgJiAxIGFzIGxlbmd0aCwgYW5kCi0gICBiaXQgMCBhcyBwY3JlbC4gKi8KLSNpZmRlZiBjb21tZW50Ci12b2lkCi1tZF9yaV90b19jaGFycyAodGhlX2J5dGVzLCByaSkKLSAgICAgY2hhciAqdGhlX2J5dGVzOwotICAgICBzdHJ1Y3QgcmVsb2NfaW5mb19nZW5lcmljIHJpOwotewotICAvKiB0aGlzIGlzIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLnJfYWRkcmVzcywgc2l6ZW9mIChyaS5yX2FkZHJlc3MpKTsKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgdGhlX2J5dGVzWzZdID0gKHJpLnJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNV0gPSAocmkucl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzRdID0gcmkucl9zeW1ib2xudW0gJiAweDBmZjsKLSAgdGhlX2J5dGVzWzddID0gKCgocmkucl9leHRlcm4gPDwgMykgJiAweDA4KSB8ICgocmkucl9sZW5ndGggPDwgMSkgJiAweDA2KSB8Ci0JCSAgKChyaS5yX3BjcmVsIDw8IDApICYgMHgwMSkpICYgMHgwRjsKLX0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotdm9pZCAKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgLyoKLSAgICogSW46IGxlbmd0aCBvZiByZWxvY2F0aW9uIChvciBvZiBhZGRyZXNzKSBpbiBjaGFyczogMSwgMiBvciA0LgotICAgKiBPdXQ6IEdOVSBMRCByZWxvY2F0aW9uIGxlbmd0aCBjb2RlOiAwLCAxLCBvciAyLgotICAgKi8KLQotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBuYnl0ZXNfcl9sZW5ndGhbXSA9IHs0MiwgMCwgMSwgNDIsIDJ9OwotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs2XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNF0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDMpICYgMHgwOCkKLQkgICAgICB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDEpICYgMHgwNikKLQkgICAgICB8ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDApICYgMHgwMSkgJiAweDBmKSk7Ci19Ci0KLS8qCi0gKiAgICAgICBCVUdTLCBHUklQRVMsICBBUE9MT0dJQSwgZXRjLgotICoKLSAqIFRoZSBvcGNvZGUgdGFibGUgJ3ZvdHN0cnMnIG5lZWRzIHRvIGJlIHNvcnRlZCBvbiBvcGNvZGUgZnJlcXVlbmN5LgotICogVGhhdCBpcywgQUZURVIgd2UgaGFzaCBpdCB3aXRoIGhhc2hfLi4uKCksIHdlIHdhbnQgbW9zdC11c2VkIG9wY29kZXMKLSAqIHRvIGNvbWUgb3V0IG9mIHRoZSBoYXNoIHRhYmxlIGZhc3Rlci4KLSAqCi0gKiBJIGFtIHNvcnJ5IHRvIGluZmxpY3QgeWV0IGFub3RoZXIgVkFYIGFzc2VtYmxlciBvbiB0aGUgd29ybGQsIGJ1dAotICogUk1TIHNheXMgd2UgbXVzdCBkbyBldmVyeXRoaW5nIGZyb20gc2NyYXRjaCwgdG8gcHJldmVudCBwaW4taGVhZHMKLSAqIHJlc3RyaWN0aW5nIHRoaXMgc29mdHdhcmUuCi0gKi8KLQotLyoKLSAqIFRoaXMgaXMgYSB2YWd1ZWx5IG1vZHVsYXIgc2V0IG9mIHJvdXRpbmVzIGluIEMgdG8gcGFyc2UgVkFYCi0gKiBhc3NlbWJseSBjb2RlIHVzaW5nIERFQyBtbmVtb25pY3MuIEl0IGlzIE5PVCB1bip4IHNwZWNpZmljLgotICoKLSAqIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCB0aGUgYXNzZW1ibGVyIGhhcyB0YWtlbiBjYXJlIG9mIGFsbDoKLSAqICAgbGFiZWxzCi0gKiAgIG1hY3JvcwotICogICBsaXN0aW5nCi0gKiAgIHBzZXVkby1vcHMKLSAqICAgbGluZSBjb250aW51YXRpb24KLSAqICAgY29tbWVudHMKLSAqICAgY29uZGVuc2luZyBhbnkgd2hpdGVzcGFjZSBkb3duIHRvIGV4YWN0bHkgb25lIHNwYWNlCi0gKiBhbmQgYWxsIHdlIGhhdmUgdG8gZG8gaXMgcGFyc2UgMSBsaW5lIGludG8gYSB2YXggaW5zdHJ1Y3Rpb24KLSAqIHBhcnRpYWxseSBmb3JtZWQuIFdlIHdpbGwgYWNjZXB0IGEgbGluZSwgYW5kIGRlbGl2ZXI6Ci0gKiAgIGFuIGVycm9yIG1lc3NhZ2UgKGhvcGVmdWxseSBlbXB0eSkKLSAqICAgYSBza2VsZXRvbiBWQVggaW5zdHJ1Y3Rpb24gKHRyZWUgc3RydWN0dXJlKQotICogICB0ZXh0dWFsIHBvaW50ZXJzIHRvIGFsbCB0aGUgb3BlcmFuZCBleHByZXNzaW9ucwotICogICBhIHdhcm5pbmcgbWVzc2FnZSB0aGF0IG5vdGVzIGEgc2lsbHkgb3BlcmFuZCAoaG9wZWZ1bGx5IGVtcHR5KQotICovCi0MCi0vKgotICoJCUUgRCBJIFQgICBIIEkgUyBUIE8gUiBZCi0gKgotICogMTdtYXk4NiBEZWFuIEVsc25lci4gQnVnIGlmIGxpbmUgZW5kcyBpbW1lZGlhdGVseSBhZnRlciBvcGNvZGUuCi0gKiAzMGFwcjg2IERlYW4gRWxzbmVyLiBOZXcgdmlwX29wKCkgdXNlcyBhcmcgYmxvY2sgc28gY2hhbmdlIGNhbGwuCi0gKiAgNmphbjg2IERlYW4gRWxzbmVyLiBDcm9jayB2aXBfYmVnaW4oKSB0byBjYWxsIHZpcF9vcF9kZWZhdWx0cygpLgotICogIDJqYW44NiBEZWFuIEVsc25lci4gSW52ZW50IHN5bnRoZXRpYyBvcGNvZGVzLgotICoJV2lkZW4gdmF4X29wY29kZVQgdG8gMzIgYml0cy4gVXNlIGEgYml0IGZvciBWSVRfT1BDT0RFX1NZTlRIRVRJQywKLSAqCXdoaWNoIG1lYW5zIHRoaXMgaXMgbm90IGEgcmVhbCBvcGNvZGUsIGl0IGlzIGxpa2UgYSBtYWNybzsgaXQgd2lsbAotICoJYmUgcmVsYXgoKWVkIGludG8gMSBvciBtb3JlIGluc3RydWN0aW9ucy4KLSAqCVVzZSBhbm90aGVyIGJpdCBmb3IgVklUX09QQ09ERV9TUEVDSUFMIGlmIHRoZSBvcC1jb2RlIGlzIG5vdCBvcHRpbWlzZWQKLSAqCWxpa2UgYSByZWd1bGFyIGJyYW5jaCBpbnN0cnVjdGlvbi4gT3B0aW9uIGFkZGVkIHRvIHZpcF9iZWdpbigpOgotICoJZXhjbHVkZQlzeW50aGV0aWMgb3Bjb2Rlcy4gSW52ZW50IHN5bnRoZXRpY192b3RzdHJzW10uCi0gKiAzMWRlYzg1IERlYW4gRWxzbmVyLiBJbnZlbnQgdml0X29wY29kZV9uYnl0ZXMuCi0gKglBbHNvIG1ha2Ugdml0X29wY29kZSBpbnRvIGEgY2hhcltdLiBXZSBub3cgaGF2ZSBuLWJ5dGUgdmF4IG9wY29kZXMsCi0gKglzbyBjYWxsZXIncyBkb24ndCBoYXZlIHRvIGtub3cgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIDEtYnl0ZSAmIGEKLSAqCTItYnl0ZSBvcC1jb2RlLiBTdGlsbCBuZWVkIHZheF9vcGNvZGVUIGNvbmNlcHQsIHNvIHdlIGtub3cgaG93Ci0gKgliaWcgYW4gb2JqZWN0IG11c3QgYmUgdG8gaG9sZCBhbiBvcC5jb2RlLgotICogMzBkZWM4NSBEZWFuIEVsc25lci4gV2lkZW4gdHlwZWRlZiB2YXhfb3Bjb2RlVCBpbiAidmF4LWluc3QuaCIKLSAqCWJlY2F1c2UgdmF4IG9wY29kZXMgbWF5IGJlIDE2IGJpdHMuIE91ciBjcnVmdHkgQyBjb21waWxlciB3YXMKLSAqCWhhcHBpbHkgaW5pdGlhbGlzaW5nIDgtYml0IHZvdF9jb2RlcyB3aXRoIDE2LWJpdCBudW1iZXJzIQotICoJKFdvdWxkbid0IHRoZSAncGhvbmUgY29tcGFueSBsaWtlIHRvIGNvbXByZXNzIGRhdGEgc28gZWFzaWx5ISkKLSAqIDI5ZGVjODUgRGVhbiBFbHNuZXIuIE5ldyBzdGF0aWMgdGFibGUgdmF4X29wZXJhbmRfd2lkdGhfc2l6ZVtdLgotICoJSW52ZW50ZWQgc28gd2Uga25vdyBodyBtYW55IGJ5dGVzIGEgIkleIzQyIiBuZWVkcyBpbiBpdHMgaW1tZWRpYXRlCi0gKglvcGVyYW5kLiBSZXZpc2VkIHN0cnVjdCB2b3AgaW4gInZheC1pbnN0LmgiOiBleHBsaWNpdGx5IGluY2x1ZGUKLSAqCWJ5dGUgbGVuZ3RoIG9mIGVhY2ggb3BlcmFuZCwgYW5kIGl0J3MgbGV0dGVyLWNvZGUgZGF0dW0gdHlwZS4KLSAqIDE3bm92ODUgRGVhbiBFbHNuZXIuIE5hbWUgQ2hhbmdlLgotICoJRHVlIHRvIGFyKDEpIHRydW5jYXRpbmcgbmFtZXMsIHdlIGxlYXJuZWQgdGhlIGhhcmQgd2F5IHRoYXQKLSAqCSJ2YXgtaW5zdC1wYXJzZS5jIiAtPiAidmF4LWluc3QtcGFyc2UuIiBkcm9wcGluZyB0aGUgIm8iIG9mZgotICoJdGhlIGFyY2hpdmVkIG9iamVjdCBuYW1lLiBTTy4uLiB3ZSBzaG9ydGVuZWQgdGhlIG5hbWUgb2YgdGhpcwotICoJc291cmNlIGZpbGUsIGFuZCBjaGFuZ2VkIHRoZSBtYWtlZmlsZS4KLSAqLwotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLQotLyoKLSAqIEluOgkxIGNoYXJhY3RlciwgZnJvbSAiYmRmZ2hsb3FwdyIgYmVpbmcgdGhlIGRhdGEtdHlwZSBvZiBhbiBvcGVyYW5kCi0gKglvZiBhIHZheCBpbnN0cnVjdGlvbi4KLSAqCi0gKiBPdXQ6CXRoZSBsZW5ndGggb2YgYW4gb3BlcmFuZCBvZiB0aGF0IHR5cGUsIGluIGJ5dGVzLgotICoJU3BlY2lhbCBicmFuY2ggb3BlcmFuZHMgdHlwZXMgIi0/ISIgaGF2ZSBsZW5ndGggMC4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgaW50IHZheF9vcGVyYW5kX3dpZHRoX3NpemVbMjU2XSA9Ci17Ci0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAxLCAwLCA4LCAwLCA0LCA4LCAxNiwgMCwgMCwgMCwgNCwgMCwgMCwxNiwJLyogLi5iLmQuZmdoLi4ubC4ubyAqLwotICAwLCA4LCAwLCAwLCAwLCAwLCAwLCAyLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogLnEuLi4uLncuLi4uLi4uLiAqLwotICAwLCAwLCAxLCAwLCA4LCAwLCA0LCA4LCAxNiwgMCwgMCwgMCwgNCwgMCwgMCwxNiwJLyogLi5iLmQuZmdoLi4ubC4ubyAqLwotICAwLCA4LCAwLCAwLCAwLCAwLCAwLCAyLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogLnEuLi4uLncuLi4uLi4uLiAqLwotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi19OwotDAotLyoKLSAqIFRoaXMgcGVydmVyc2lvbiBlbmNvZGVzIGFsbCB0aGUgdmF4IG9wY29kZXMgYXMgYSBidW5jaCBvZiBzdHJpbmdzLgotICogUk1TIHNheXMgd2Ugc2hvdWxkIGJ1aWxkIG91ciBoYXNoLXRhYmxlIGF0IHJ1bi10aW1lLiBIbW0uCi0gKiBQbGVhc2Ugd291bGQgc29tZW9uZSBhcnJhbmdlIHRoZXNlIGluIGRlY3JlYXNpbmcgZnJlcXVlbmN5IG9mIG9wY29kZT8KLSAqIEJlY2F1c2Ugb2YgdGhlIHdheSBoYXNoXy4uLigpIHdvcmtzLCB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgb3Bjb2RlCi0gKiBzaG91bGQgYmUgdGV4dHVhbGx5IGZpcnN0IGFuZCBzbyBvbi4KLSAqCi0gKiBJbnB1dCBmb3IgdGhpcyB0YWJsZSB3YXMgJ3ZheC5vcGNvZGVzJywgYXdrKDEpZWQgYnkgJ3ZheC5vcGNvZGVzLmMuYXdrJyAuCi0gKiBTbyBjaGFuZ2UgJ3ZheC5vcGNvZGVzJywgdGhlbiByZS1nZW5lcmF0ZSB0aGlzIHRhYmxlLgotICovCi0KLSNpbmNsdWRlICJvcGNvZGUvdmF4LmgiCi0MCi0vKgotICogVGhpcyBpcyBhIHRhYmxlIG9mIG9wdGlvbmFsIG9wLWNvZGVzLiBBbGwgb2YgdGhlbSByZXByZXNlbnQKLSAqICdzeW50aGV0aWMnIGluc3RydWN0aW9ucyB0aGF0IHNlZW0gcG9wdWxhci4KLSAqCi0gKiBIZXJlIHdlIG1ha2Ugc29tZSBwc2V1ZG8gb3AtY29kZXMuIEV2ZXJ5IGNvZGUgaGFzIGEgYml0IHNldCB0byBzYXkKLSAqIGl0IGlzIHN5bnRoZXRpYy4gVGhpcyBsZXRzIHlvdSBjYXRjaCB0aGVtIGlmIHlvdSB3YW50IHRvCi0gKiBiYW4gdGhlc2Ugb3Bjb2Rlcy4gVGhleSBhcmUgbW5lbW9uaWNzIGZvciAiZWxhc3RpYyIgaW5zdHJ1Y3Rpb25zCi0gKiB0aGF0IGFyZSBzdXBwb3NlZCB0byBhc3NlbWJsZSBpbnRvIHRoZSBmZXdlc3QgYnl0ZXMgbmVlZGVkIHRvIGRvIGEKLSAqIGJyYW5jaCwgb3IgdG8gZG8gYSBjb25kaXRpb25hbCBicmFuY2gsIG9yIHdoYXRldmVyLgotICoKLSAqIFRoZSBvcGNvZGUgaXMgaW4gdGhlIHVzdWFsIHBsYWNlIFtsb3ctb3JkZXIgbio4IGJpdHNdLiBUaGlzIG1lYW5zCi0gKiB0aGF0IGlmIHlvdSBtYXNrIG9mZiB0aGUgYnVja3kgYml0cywgdGhlIHVzdWFsIHJ1bGVzIGFwcGx5IGFib3V0Ci0gKiBob3cgbG9uZyB0aGUgb3Bjb2RlIGlzLgotICoKLSAqIEFsbCBWQVggYnJhbmNoIGRpc3BsYWNlbWVudHMgY29tZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAqIEZvciBzaW1wbGUgYnJhbmNoZXMgKDEtYnl0ZSBvcGNvZGUgKyAxLWJ5dGUgZGlzcGxhY2VtZW50KSB0aGUgbGFzdAotICogb3BlcmFuZCBpcyBjb2RlZCAnYj8nIHdoZXJlIHRoZSAiZGF0YSB0eXBlIiAnPycgaXMgYSBjbHVlIHRoYXQgd2UKLSAqIG1heSByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoIChjb21wbGVtZW50IGxvd2VzdCBvcmRlciBiaXQpCi0gKiBhbmQgYnJhbmNoIGFyb3VuZCBhIGp1bXAuIFRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgotICogVGhhdCBpcyB3aHkgdGhlIFZJVF9PUENPREVfU1lOVEhFVElDIGJpdCBpcyBzZXQ6IGl0IHNheXMgdGhpcyBpcwotICogYSAwLWJ5dGUgb3AtY29kZSBmb2xsb3dlZCBieSAyIG9yIG1vcmUgYnl0ZXMgb2Ygb3BlcmFuZCBhZGRyZXNzLgotICoKLSAqIElmIHRoZSBvcC1jb2RlIGhhcyBWSVRfT1BDT0RFX1NQRUNJQUwgc2V0LCB0aGVuIHdlIGhhdmUgYSBtb3JlIHVudXN1YWwKLSAqIGNhc2UuCi0gKgotICogRm9yIEpCU0IgJiBKQlIgdGhlIHRyZWF0bWVudCBpcyB0aGUgc2ltaWxhciwgZXhjZXB0ICgxKSB3ZSBoYXZlIGEgJ2J3JwotICogb3B0aW9uIGJlZm9yZSAoMikgd2UgY2FuIGRpcmVjdGx5IEpTQi9KTVAgYmVjYXVzZSB0aGVyZSBpcyBubyBjb25kaXRpb24uCi0gKiBUaGVzZSBvcGVyYW5kcyBoYXZlICdiLScgYXMgdGhlaXIgYWNjZXNzL2RhdGEgdHlwZS4KLSAqCi0gKiBUaGF0IGxlYXZlcyBhIGJ1bmNoIG9mIHJhbmRvbSBvcGNvZGVzOiBKQUNCeCwgSnhPQnh4eC4gSW4gdGhlc2UKLSAqIGNhc2VzLCB3ZSBkbyB0aGUgc2FtZSBpZGVhLiBKQUNCeHh4IGFyZSBhbGwgbWFya2VkIHdpdGggYSAnYiEnCi0gKiBKQU9CeHh4ICYgSlNPQnh4eCBhcmUgbWFya2VkIHdpdGggYSAnYjonLgotICoKLSAqLwotI2lmIChWSVRfT1BDT0RFX1NZTlRIRVRJQyAhPSAweDgwMDAwMDAwKQotWW91IGhhdmUganVzdCBicm9rZW4gdGhlIGVuY29kaW5nIGJlbG93LCB3aGljaCBhc3N1bWVzIHRoZSBzaWduIGJpdAotICBtZWFucyAnSSBhbSBhbiBpbWFnaW5hcnkgaW5zdHJ1Y3Rpb24nLgotI2VuZGlmCi0KLSNpZiAoVklUX09QQ09ERV9TUEVDSUFMICE9IDB4NDAwMDAwMDApCi0gIFlvdSBoYXZlIGp1c3QgYnJva2VuIHRoZSBlbmNvZGluZyBiZWxvdywgd2hpY2ggYXNzdW1lcyB0aGUgMHg0MCBNIGJpdCBtZWFucwotICAnSSBhbSBub3QgdG8gYmUgIm9wdGltaXNlZCIgdGhlIHdheSBub3JtYWwgYnJhbmNoZXMgYXJlJy4KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHZvdAotICBzeW50aGV0aWNfdm90c3Ryc1tdID0KLXsKLSAgeyJqYnNiIiwJeyJiLSIsIDB4QzAwMDAwMTB9fSwJCS8qIEJTRCA0LjIgKi8KLS8qIGpzYiB1c2VkIGFscmVhZHkgKi8KLSAgeyJqYnIiLAl7ImItIiwgMHhDMDAwMDAxMX19LAkJLyogQlNEIDQuMiAqLwotICB7ImpyIiwJeyJiLSIsIDB4QzAwMDAwMTF9fSwJCS8qIGNvbnNpc3RlbnQgKi8KLSAgeyJqbmVxIiwJeyJiPyIsIDB4ODAwMDAwMTJ9fSwKLSAgeyJqbmVxdSIsCXsiYj8iLCAweDgwMDAwMDEyfX0sCi0gIHsiamVxbCIsCXsiYj8iLCAweDgwMDAwMDEzfX0sCi0gIHsiamVxbHUiLAl7ImI/IiwgMHg4MDAwMDAxM319LAotICB7ImpndHIiLAl7ImI/IiwgMHg4MDAwMDAxNH19LAotICB7ImpsZXEiLAl7ImI/IiwgMHg4MDAwMDAxNX19LAotLyogdW4tdXNlZCBvcGNvZGVzIGhlcmUgKi8KLSAgeyJqZ2VxIiwJeyJiPyIsIDB4ODAwMDAwMTh9fSwKLSAgeyJqbHNzIiwJeyJiPyIsIDB4ODAwMDAwMTl9fSwKLSAgeyJqZ3RydSIsCXsiYj8iLCAweDgwMDAwMDFhfX0sCi0gIHsiamxlcXUiLAl7ImI/IiwgMHg4MDAwMDAxYn19LAotICB7Imp2YyIsCXsiYj8iLCAweDgwMDAwMDFjfX0sCi0gIHsianZzIiwJeyJiPyIsIDB4ODAwMDAwMWR9fSwKLSAgeyJqZ2VxdSIsCXsiYj8iLCAweDgwMDAwMDFlfX0sCi0gIHsiamNjIiwJeyJiPyIsIDB4ODAwMDAwMWV9fSwKLSAgeyJqbHNzdSIsCXsiYj8iLCAweDgwMDAwMDFmfX0sCi0gIHsiamNzIiwJeyJiPyIsIDB4ODAwMDAwMWZ9fSwKLQotICB7ImphY2J3IiwJeyJyd3J3bXdiISIsIDB4QzAwMDAwM2R9fSwKLSAgeyJqYWNiZiIsCXsicmZyZm1mYiEiLCAweEMwMDAwMDRmfX0sCi0gIHsiamFjYmQiLAl7InJkcmRtZGIhIiwgMHhDMDAwMDA2Zn19LAotICB7ImphY2JiIiwJeyJyYnJibWJiISIsIDB4QzAwMDAwOWR9fSwKLSAgeyJqYWNibCIsCXsicmxybG1sYiEiLCAweEMwMDAwMGYxfX0sCi0gIHsiamFjYmciLAl7InJncmdtZ2IhIiwgMHhDMDAwNGZmZH19LAotICB7ImphY2JoIiwJeyJyaHJobWhiISIsIDB4QzAwMDZmZmR9fSwKLQotICB7ImpicyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlMH19LAotICB7ImpiYyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlMX19LAotICB7Impic3MiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTJ9fSwKLSAgeyJqYmNzIiwJeyJybHZiYj8iLCAweDgwMDAwMGUzfX0sCi0gIHsiamJzYyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlNH19LAotICB7ImpiY2MiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTV9fSwKLSAgeyJqYnNzaSIsCXsicmx2YmI/IiwgMHg4MDAwMDBlNn19LAotICB7ImpiY2NpIiwJeyJybHZiYj8iLCAweDgwMDAwMGU3fX0sCi0gIHsiamxicyIsCXsicmxiPyIsIDB4ODAwMDAwZTh9fSwKLSAgeyJqbGJjIiwJeyJybGI/IiwgMHg4MDAwMDBlOX19LAotCi0gIHsiamFvYmxzcyIsCXsicmxtbGI6IiwgMHhDMDAwMDBmMn19LAotICB7Imphb2JsZXEiLAl7InJsbWxiOiIsIDB4QzAwMDAwZjN9fSwKLSAgeyJqc29iZ2VxIiwJeyJtbGI6IiwgMHhDMDAwMDBmNH19LAotICB7Impzb2JndHIiLAl7Im1sYjoiLCAweEMwMDAwMGY1fX0sCi0KLS8qIENBU0V4IGhhcyBubyBicmFuY2ggYWRkcmVzc2VzIGluIG91ciBjb25jZXB0aW9uIG9mIGl0LiAqLwotLyogWW91IHNob3VsZCB1c2UgIi53b3JkIC4uLiIgc3RhdGVtZW50cyBhZnRlciB0aGUgImNhc2UgLi4uIi4gKi8KLQotICB7IiIsCXsiIiwgMH19CQkJLyogZW1wdHkgaXMgZW5kIHNlbnRpbmVsICovCi0KLX07CQkJCS8qIHN5bnRoZXRpY192b3RzdHJzICovCi0MCi0vKgotICogICAgICAgICAgICAgICAgICB2IGkgcCBfIGIgZSBnIGkgbiAoICkKLSAqCi0gKiBDYWxsIG1lIG9uY2UgYmVmb3JlIHlvdSBkZWNvZGUgYW55IGxpbmVzLgotICogSSBkZWNvZGUgdm90c3RycyBpbnRvIGEgaGFzaCB0YWJsZSBhdCBvcF9oYXNoICh3aGljaCBJIGNyZWF0ZSkuCi0gKiBJIHJldHVybiBhbiBlcnJvciB0ZXh0IG9yIG51bGwuCi0gKiBJZiB5b3Ugd2FudCwgSSB3aWxsIGluY2x1ZGUgdGhlICdzeW50aGV0aWMnIGpYWFggaW5zdHJ1Y3Rpb25zIGluIHRoZQotICogaW5zdHJ1Y3Rpb24gdGFibGUuCi0gKiBZb3UgbXVzdCBub21pbmF0ZSBtZXRhY2hhcmFjdGVycyBmb3IgZWcgREVDJ3MgIiMiLCAiQCIsICJeIi4KLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi12aXBfYmVnaW4gKHN5bnRoZXRpY190b28sIGltbWVkaWF0ZSwgaW5kaXJlY3QsIGRpc3BsZW4pCi0gICAgIGludCBzeW50aGV0aWNfdG9vOwkJLyogMSBtZWFucyBpbmNsdWRlIGpYWFggb3AtY29kZXMuICovCi0gICAgIGNvbnN0IGNoYXIgKmltbWVkaWF0ZSwgKmluZGlyZWN0LCAqZGlzcGxlbjsKLXsKLSAgY29uc3Qgc3RydWN0IHZvdCAqdlA7CQkvKiBzY2FuIHZvdHN0cnMgKi8KLSAgY29uc3QgY2hhciAqcmV0dmFsID0gMDsJLyogZXJyb3IgdGV4dCAqLwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKHZQID0gdm90c3RyczsgKnZQLT52b3RfbmFtZSAmJiAhcmV0dmFsOyB2UCsrKQotICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCB2UC0+dm90X25hbWUsIChQVFIpICZ2UC0+dm90X2RldGFpbCk7Ci0KLSAgaWYgKHN5bnRoZXRpY190b28pCi0gICAgZm9yICh2UCA9IHN5bnRoZXRpY192b3RzdHJzOyAqdlAtPnZvdF9uYW1lICYmICFyZXR2YWw7IHZQKyspCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgdlAtPnZvdF9uYW1lLCAoUFRSKSAmdlAtPnZvdF9kZXRhaWwpOwotCi0jaWZuZGVmIENPTlNUX1RBQkxFCi0gIHZpcF9vcF9kZWZhdWx0cyAoaW1tZWRpYXRlLCBpbmRpcmVjdCwgZGlzcGxlbik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLS8qCi0gKiAgICAgICAgICAgICAgICAgIHYgaSBwICggKQotICoKLSAqIFRoaXMgY29udmVydHMgYSBzdHJpbmcgaW50byBhIHZheCBpbnN0cnVjdGlvbi4KLSAqIFRoZSBzdHJpbmcgbXVzdCBiZSBhIGJhcmUgc2luZ2xlIGluc3RydWN0aW9uIGluIGRlYy12YXggKHdpdGggQlNENCBmcm9icykKLSAqIGZvcm1hdC4KLSAqIEl0IHByb3ZpZGVzIHNvbWUgZXJyb3IgbWVzc2FnZXM6IGF0IG1vc3Qgb25lIGZhdGFsIGVycm9yIG1lc3NhZ2UgKHdoaWNoCi0gKiBzdG9wcyB0aGUgc2NhbikgYW5kIGF0IG1vc3Qgb25lIHdhcm5pbmcgbWVzc2FnZSBmb3IgZWFjaCBvcGVyYW5kLgotICogVGhlIHZheCBpbnN0cnVjdGlvbiBpcyByZXR1cm5lZCBpbiBleHBsb2RlZCBmb3JtLCBzaW5jZSB3ZSBoYXZlIG5vCi0gKiBrbm93bGVkZ2Ugb2YgaG93IHlvdSBwYXJzZSAob3IgZXZhbHVhdGUpIHlvdXIgZXhwcmVzc2lvbnMuCi0gKiBXZSBkbyBob3dldmVyIHN0cmlwIG9mZiBhbmQgZGVjb2RlIGFkZHJlc3NpbmcgbW9kZXMgYW5kIG9wZXJhdGlvbgotICogbW5lbW9uaWMuCi0gKgotICogVGhlIGV4cGxvZGVkIGluc3RydWN0aW9uIGlzIHJldHVybmVkIHRvIGEgc3RydWN0IHZpdCBvZiB5b3VyIGNob2ljZS4KLSAqICNpbmNsdWRlICJ2YXgtaW5zdC5oIiB0byBrbm93IHdoYXQgYSBzdHJ1Y3Qgdml0IGlzLgotICoKLSAqIFRoaXMgZnVuY3Rpb24ncyB2YWx1ZSBpcyBhIHN0cmluZy4gSWYgaXQgaXMgbm90ICIiIHRoZW4gYW4gaW50ZXJuYWwKLSAqIGxvZ2ljIGVycm9yIHdhcyBmb3VuZDogcmVhZCB0aGlzIGNvZGUgdG8gYXNzaWduIG1lYW5pbmcgdG8gdGhlIHN0cmluZy4KLSAqIE5vIGFyZ3VtZW50IHN0cmluZyBzaG91bGQgZ2VuZXJhdGUgc3VjaCBhbiBlcnJvciBzdHJpbmc6Ci0gKiBpdCBtZWFucyBhIGJ1ZyBpbiBvdXIgY29kZSwgbm90IGluIHRoZSB1c2VyJ3MgdGV4dC4KLSAqCi0gKiBZb3UgTVVTVCBoYXZlIGNhbGxlZCB2aXBfYmVnaW4oKSBvbmNlIGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLgotICovCi0KLXN0YXRpYyB2b2lkCi12aXAgKHZpdFAsIGluc3RyaW5nKQotICAgICBzdHJ1Y3Qgdml0ICp2aXRQOwkJLyogV2UgYnVpbGQgYW4gZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaGVyZS4gKi8KLSAgICAgY2hhciAqaW5zdHJpbmc7CQkvKiBUZXh0IG9mIGEgdmF4IGluc3RydWN0aW9uOiB3ZSBtb2RpZnkuICovCi17Ci0gIC8qIEhvdyB0byBiaXQtZW5jb2RlIHRoaXMgb3Bjb2RlLiAqLwotICBzdHJ1Y3Qgdm90X3dvdCAqdndQOwotICAvKiAxL3NraXAgd2hpdGVzcGFjZS4yL3NjYW4gdm90X2hvdyAqLwotICBjaGFyICpwOwotICBjaGFyICpxOwotICAvKiBjb3VudHMgbnVtYmVyIG9mIG9wZXJhbmRzIHNlZW4gKi8KLSAgdW5zaWduZWQgY2hhciBjb3VudDsKLSAgLyogc2NhbiBvcGVyYW5kcyBpbiBzdHJ1Y3Qgdml0ICovCi0gIHN0cnVjdCB2b3AgKm9wZXJhbmRwOwotICAvKiBlcnJvciBvdmVyIGFsbCBvcGVyYW5kcyAqLwotICBjb25zdCBjaGFyICphbGxvcGVycjsKLSAgLyogUmVtZW1iZXIgY2hhciwgKHdlIGNsb2JiZXIgaXQgd2l0aCAnXDAnIHRlbXBvcmFyaWx5KS4gKi8KLSAgY2hhciBjOwotICAvKiBPcC1jb2RlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uICovCi0gIHZheF9vcGNvZGVUIG9jOwotCi0gIGlmICgqaW5zdHJpbmcgPT0gJyAnKQotICAgICsraW5zdHJpbmc7CQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0gIGZvciAocCA9IGluc3RyaW5nOyAqcCAmJiAqcCAhPSAnICc7IHArKyk7OwkvKiBNVVNUIGVuZCBpbiBlbmQtb2Ytc3RyaW5nIG9yIGV4YWN0bHkgMSBzcGFjZS4gKi8KLSAgLyogU2Nhbm5lZCB1cCB0byBlbmQgb2Ygb3BlcmF0aW9uLWNvZGUuICovCi0gIC8qIE9wZXJhdGlvbi1jb2RlIGlzIGVuZGVkIHdpdGggd2hpdGVzcGFjZS4gKi8KLSAgaWYgKHAgLSBpbnN0cmluZyA9PSAwKQotICAgIHsKLSAgICAgIHZpdFAtPnZpdF9lcnJvciA9IF8oIk5vIG9wZXJhdG9yIik7Ci0gICAgICBjb3VudCA9IDA7Ci0gICAgICBtZW1zZXQgKHZpdFAtPnZpdF9vcGNvZGUsICdcMCcsIHNpemVvZiAodml0UC0+dml0X29wY29kZSkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGMgPSAqcDsKLSAgICAgICpwID0gJ1wwJzsKLSAgICAgIC8qCi0gICAgICAgKiBIZXJlIHdpdGggaW5zdHJpbmcgcG9pbnRpbmcgdG8gd2hhdCBiZXR0ZXIgYmUgYW4gb3AtbmFtZSwgYW5kIHAKLSAgICAgICAqIHBvaW50aW5nIHRvIGNoYXJhY3RlciBqdXN0IHBhc3QgdGhhdC4KLSAgICAgICAqIFdlIHRydXN0IGluc3RyaW5nIHBvaW50cyB0byBhbiBvcC1uYW1lLCB3aXRoIG5vIHdoaXRlc3BhY2UuCi0gICAgICAgKi8KLSAgICAgIHZ3UCA9IChzdHJ1Y3Qgdm90X3dvdCAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIGluc3RyaW5nKTsKLSAgICAgICpwID0gYzsJCQkvKiBSZXN0b3JlIGNoYXIgYWZ0ZXIgb3AtY29kZS4gKi8KLSAgICAgIGlmICh2d1AgPT0gMCkKLQl7Ci0JICB2aXRQLT52aXRfZXJyb3IgPSBfKCJVbmtub3duIG9wZXJhdG9yIik7Ci0JICBjb3VudCA9IDA7Ci0JICBtZW1zZXQgKHZpdFAtPnZpdF9vcGNvZGUsICdcMCcsIHNpemVvZiAodml0UC0+dml0X29wY29kZSkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICogV2UgZm91bmQgYSBtYXRjaCEgU28gbGV0cyBwaWNrIHVwIGFzIG1hbnkgb3BlcmFuZHMgYXMgdGhlCi0JICAgKiBpbnN0cnVjdGlvbiB3YW50cywgYW5kIGV2ZW4gZ3JpcGUgaWYgdGhlcmUgYXJlIHRvbyBtYW55LgotCSAgICogV2UgZXhwZWN0IGNvbW1hIHRvIHNlcGVyYXRlIGVhY2ggb3BlcmFuZC4KLQkgICAqIFdlIGxldCBpbnN0cmluZyB0cmFjayB0aGUgdGV4dCwgd2hpbGUgcCB0cmFja3MgYSBwYXJ0IG9mIHRoZQotCSAgICogc3RydWN0IHZvdC4KLQkgICAqLwotCSAgY29uc3QgY2hhciAqaG93cDsKLQkgIC8qCi0JICAgKiBUaGUgbGluZXMgYmVsb3cga25vdyBhYm91dCAyLWJ5dGUgb3Bjb2RlcyBzdGFydGluZyBGRCxGRSBvciBGRi4KLQkgICAqIFRoZXkgYWxzbyB1bmRlcnN0YW5kIHN5bnRoZXRpYyBvcGNvZGVzLiBOb3RlOgotCSAgICogd2UgcmV0dXJuIDMyIGJpdHMgb2Ygb3Bjb2RlLCBpbmNsdWRpbmcgYnVja3kgYml0cywgQlVUCi0JICAgKiBhbiBvcGNvZGUgbGVuZ3RoIGlzIGVpdGhlciA4IG9yIDE2IGJpdHMgZm9yIHZpdF9vcGNvZGVfbmJ5dGVzLgotCSAgICovCi0JICBvYyA9IHZ3UC0+dm90X2NvZGU7CS8qIFRoZSBvcC1jb2RlLiAqLwotCSAgdml0UC0+dml0X29wY29kZV9uYnl0ZXMgPSAob2MgJiAweEZGKSA+PSAweEZEID8gMiA6IDE7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHZpdFAtPnZpdF9vcGNvZGUsIG9jLCA0KTsKLQkgIGNvdW50ID0gMDsJCS8qIG5vIG9wZXJhbmRzIHNlZW4geWV0ICovCi0JICBpbnN0cmluZyA9IHA7CQkvKiBwb2ludCBqdXN0IHBhc3Qgb3BlcmF0aW9uIGNvZGUgKi8KLQkgIGFsbG9wZXJyID0gIiI7Ci0JICBmb3IgKGhvd3AgPSB2d1AtPnZvdF9ob3csIG9wZXJhbmRwID0gdml0UC0+dml0X29wZXJhbmQ7Ci0JICAgICAgICEoYWxsb3BlcnIgJiYgKmFsbG9wZXJyKSAmJiAqaG93cDsKLQkgICAgICAgb3BlcmFuZHArKywgaG93cCArPSAyKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBIZXJlIHRvIHBhcnNlIG9uZSBvcGVyYW5kLiBMZWF2ZSBpbnN0cmluZyBwb2ludGluZyBqdXN0Ci0JICAgICAgICogcGFzdCBhbnkgb25lICcsJyB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgdGhpcyBvcGVyYW5kLgotCSAgICAgICAqLwotCSAgICAgIGlmICghaG93cFsxXSkKLQkJYXNfZmF0YWwgKF8oIm9kZCBudW1iZXIgb2YgYnl0ZXMgaW4gb3BlcmFuZCBkZXNjcmlwdGlvbiIpKTsKLQkgICAgICBlbHNlIGlmICgqaW5zdHJpbmcpCi0JCXsKLQkJICBmb3IgKHEgPSBpbnN0cmluZzsgKGMgPSAqcSkgJiYgYyAhPSAnLCc7IHErKykKLQkJICAgIDsKLQkJICAvKgotCQkgICAqIFEgcG9pbnRzIHRvICcsJyBvciAnXDAnIHRoYXQgZW5kcyBhcmd1bWVudC4gQyBpcyB0aGF0Ci0JCSAgICogY2hhcmFjdGVyLgotCQkgICAqLwotCQkgICpxID0gMDsKLQkJICBvcGVyYW5kcC0+dm9wX3dpZHRoID0gaG93cFsxXTsKLQkJICBvcGVyYW5kcC0+dm9wX25ieXRlcyA9IHZheF9vcGVyYW5kX3dpZHRoX3NpemVbKHVuc2lnbmVkKSBob3dwWzFdXTsKLQkJICBvcGVyYW5kcC0+dm9wX2FjY2VzcyA9IGhvd3BbMF07Ci0JCSAgdmlwX29wIChpbnN0cmluZywgb3BlcmFuZHApOwotCQkgICpxID0gYzsJLyogUmVzdG9yZSBpbnB1dCB0ZXh0LiAqLwotCQkgIGlmIChvcGVyYW5kcC0+dm9wX2Vycm9yKQotCQkgICAgYWxsb3BlcnIgPSBfKCJCYWQgb3BlcmFuZCIpOwotCQkgIGluc3RyaW5nID0gcSArIChjID8gMSA6IDApOwkvKiBuZXh0IG9wZXJhbmQgKGlmIGFueSkgKi8KLQkJICBjb3VudCsrOwkvKiAgd29uIGFub3RoZXIgYXJndW1lbnQsIG1heSBoYXZlIGFuIG9wZXJyICovCi0JCX0KLQkgICAgICBlbHNlCi0JCWFsbG9wZXJyID0gXygiTm90IGVub3VnaCBvcGVyYW5kcyIpOwotCSAgICB9Ci0JICBpZiAoISphbGxvcGVycikKLQkgICAgewotCSAgICAgIGlmICgqaW5zdHJpbmcgPT0gJyAnKQotCQlpbnN0cmluZysrOwkvKiBTa2lwIHdoaXRlc3BhY2UuICovCi0JICAgICAgaWYgKCppbnN0cmluZykKLQkJYWxsb3BlcnIgPSBfKCJUb28gbWFueSBvcGVyYW5kcyIpOwotCSAgICB9Ci0JICB2aXRQLT52aXRfZXJyb3IgPSBhbGxvcGVycjsKLQl9Ci0gICAgfQotICB2aXRQLT52aXRfb3BlcmFuZHMgPSBjb3VudDsKLX0KLQwKLSNpZmRlZiB0ZXN0Ci0KLS8qCi0gKiBUZXN0IHByb2dyYW0gZm9yIGFib3ZlLgotICovCi0KLXN0cnVjdCB2aXQgbXl2aXQ7CQkvKiBidWlsZCBhbiBleHBsb2RlZCB2YXggaW5zdHJ1Y3Rpb24gaGVyZSAqLwotY2hhciBhbnN3ZXJbMTAwXTsJCS8qIGh1bWFuIHR5cGVzIGEgbGluZSBvZiB2YXggYXNzZW1ibGVyIGhlcmUgKi8KLWNoYXIgKm15YnVnOwkJCS8qICIiIG9yIGFuIGludGVybmFsIGxvZ2ljIGRpYWdub3N0aWMgKi8KLWludCBteWNvdW50OwkJCS8qIG51bWJlciBvZiBvcGVyYW5kcyAqLwotc3RydWN0IHZvcCAqbXl2b3A7CQkvKiBzY2FuIG9wZXJhbmRzIGZyb20gbXl2aXQgKi8KLWludCBteXN5bnRoOwkJCS8qIDEgbWVhbnMgd2FudCBzeW50aGV0aWMgb3Bjb2Rlcy4gKi8KLWNoYXIgbXlfaW1tZWRpYXRlWzIwMF07Ci1jaGFyIG15X2luZGlyZWN0WzIwMF07Ci1jaGFyIG15X2Rpc3BsZW5bMjAwXTsKLQotbWFpbiAoKQotewotICBjaGFyICpwOwotCi0gIHByaW50ZiAoIjAgbWVhbnMgbm8gc3ludGhldGljIGluc3RydWN0aW9ucy4gICAiKTsKLSAgcHJpbnRmICgiVmFsdWUgZm9yIHZpcF9iZWdpbj8gICIpOwotICBnZXRzIChhbnN3ZXIpOwotICBzc2NhbmYgKGFuc3dlciwgIiVkIiwgJm15c3ludGgpOwotICBwcmludGYgKCJTeW50aGV0aWMgb3Bjb2RlcyAlcyBiZSBpbmNsdWRlZC5cbiIsIG15c3ludGggPyAid2lsbCIgOiAid2lsbCBub3QiKTsKLSAgcHJpbnRmICgiZW50ZXIgaW1tZWRpYXRlIHN5bWJvbHMgZWcgZW50ZXIgIyAgICIpOwotICBnZXRzIChteV9pbW1lZGlhdGUpOwotICBwcmludGYgKCJlbnRlciBpbmRpcmVjdCBzeW1ib2xzICBlZyBlbnRlciBAICAgIik7Ci0gIGdldHMgKG15X2luZGlyZWN0KTsKLSAgcHJpbnRmICgiZW50ZXIgZGlzcGxlbiBzeW1ib2xzICAgZWcgZW50ZXIgXiAgICIpOwotICBnZXRzIChteV9kaXNwbGVuKTsKLSAgaWYgKHAgPSB2aXBfYmVnaW4gKG15c3ludGgsIG15X2ltbWVkaWF0ZSwgbXlfaW5kaXJlY3QsIG15X2Rpc3BsZW4pKQotICAgIHsKLSAgICAgIGVycm9yICgidmlwX2JlZ2luPSVzIiwgcCk7Ci0gICAgfQotICBwcmludGYgKCJBbiBlbXB0eSBpbnB1dCBsaW5lIHdpbGwgcXVpdCB5b3UgZnJvbSB0aGUgdmF4IGluc3RydWN0aW9uIHBhcnNlclxuIik7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgcHJpbnRmICgidmF4IGluc3RydWN0aW9uOiAiKTsKLSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLSAgICAgIGdldHMgKGFuc3dlcik7Ci0gICAgICBpZiAoISphbnN3ZXIpCi0JewotCSAgYnJlYWs7CQkvKiBvdXQgb2YgZm9yIGVhY2ggaW5wdXQgdGV4dCBsb29wICovCi0JfQotICAgICAgdmlwICgmbXl2aXQsIGFuc3dlcik7Ci0gICAgICBpZiAoKm15dml0LnZpdF9lcnJvcikKLQl7Ci0JICBwcmludGYgKCJFUlI6XCIlc1wiXG4iLCBteXZpdC52aXRfZXJyb3IpOwotCX0KLSAgICAgIHByaW50ZiAoIm9wY29kZT0iKTsKLSAgICAgIGZvciAobXljb3VudCA9IG15dml0LnZpdF9vcGNvZGVfbmJ5dGVzLCBwID0gbXl2aXQudml0X29wY29kZTsKLQkgICBteWNvdW50OwotCSAgIG15Y291bnQtLSwgcCsrCi0JKQotCXsKLQkgIHByaW50ZiAoIiUwMnggIiwgKnAgJiAweEZGKTsKLQl9Ci0gICAgICBwcmludGYgKCIgICBvcGVyYW5kIGNvdW50PSVkLlxuIiwgbXljb3VudCA9IG15dml0LnZpdF9vcGVyYW5kcyk7Ci0gICAgICBmb3IgKG15dm9wID0gbXl2aXQudml0X29wZXJhbmQ7IG15Y291bnQ7IG15Y291bnQtLSwgbXl2b3ArKykKLQl7Ci0JICBwcmludGYgKCJtb2RlPSV4eCByZWc9JXh4IG5keD0leHggbGVuPSclYyc9JWMlYyVkLiBleHByPVwiIiwKLQkJICBteXZvcC0+dm9wX21vZGUsIG15dm9wLT52b3BfcmVnLCBteXZvcC0+dm9wX25keCwKLQkJICBteXZvcC0+dm9wX3Nob3J0LCBteXZvcC0+dm9wX2FjY2VzcywgbXl2b3AtPnZvcF93aWR0aCwKLQkJICBteXZvcC0+dm9wX25ieXRlcyk7Ci0JICBmb3IgKHAgPSBteXZvcC0+dm9wX2V4cHJfYmVnaW47IHAgPD0gbXl2b3AtPnZvcF9leHByX2VuZDsgcCsrKQotCSAgICB7Ci0JICAgICAgcHV0Y2hhciAoKnApOwotCSAgICB9Ci0JICBwcmludGYgKCJcIlxuIik7Ci0JICBpZiAobXl2b3AtPnZvcF9lcnJvcikKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAgZXJyOlwiJXNcIlxuIiwgbXl2b3AtPnZvcF9lcnJvcik7Ci0JICAgIH0KLQkgIGlmIChteXZvcC0+dm9wX3dhcm4pCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgIHdybjpcIiVzXCJcbiIsIG15dm9wLT52b3Bfd2Fybik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICB2aXBfZW5kICgpOwotICBleGl0IChFWElUX1NVQ0NFU1MpOwotfQotCi0jZW5kaWYgLyogI2lmZGVmIHRlc3QgKi8KLQotLyogZW5kIG9mIHZheF9pbnNfcGFyc2UuYyAqLwotCi0vKiB2YXhfcmVnX3BhcnNlLmMgLSBjb252ZXJ0IGEgVkFYIHJlZ2lzdGVyIG5hbWUgdG8gYSBudW1iZXIgKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiBBIHBhcnQgb2YgR05VLiAqLwotCi0vKgotICogICAgICAgICAgdiBhIHggXyByIGUgZyBfIHAgYSByIHMgZSAoICkKLSAqCi0gKiBUYWtlIDMgY2hhci5zLCB0aGUgbGFzdCBvZiB3aGljaCBtYXkgYmUgYFwwYCAobm9uLWV4aXN0ZW50KQotICogYW5kIHJldHVybiB0aGUgVkFYIHJlZ2lzdGVyIG51bWJlciB0aGF0IHRoZXkgcmVwcmVzZW50LgotICoKLSAqIFJldHVybiAtMSBpZiB0aGV5IGRvbid0IGZvcm0gYSByZWdpc3RlciBuYW1lLiBHb29kIG5hbWVzIHJldHVybgotICogYSBudW1iZXIgZnJvbSAwOjE1IGluY2x1c2l2ZS4KLSAqCi0gKiBDYXNlIGlzIG5vdCBpbXBvcnRhbnQgaW4gYSBuYW1lLgotICoKLSAqIFJlZ2lzdGVyIG5hbWVzIHVuZGVyc3Rvb2QgYXJlOgotICoKLSAqCVIwCi0gKglSMQotICoJUjIKLSAqCVIzCi0gKglSNAotICoJUjUKLSAqCVI2Ci0gKiAJUjcKLSAqCVI4Ci0gKglSOQotICoJUjEwCi0gKglSMTEKLSAqCVIxMglBUAotICoJUjEzCUZQCi0gKglSMTQJU1AKLSAqCVIxNQlQQwotICoKLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgQVAgKDEyKQotI2RlZmluZSBGUCAoMTMpCi0jZGVmaW5lIFNQICgxNCkKLSNkZWZpbmUgUEMgKDE1KQotDAotaW50CQkJCS8qIHJldHVybiAtMSBvciAwOjE1ICovCi12YXhfcmVnX3BhcnNlIChjMSwgYzIsIGMzKQkvKiAzIGNoYXJzIG9mIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgY2hhciBjMSwgYzIsIGMzOwkJLyogYzMgPT0gMCBpZiAyLWNoYXJhY3RlciByZWcgbmFtZSAqLwotewotICBpbnQgcmV0dmFsOwkJLyogcmV0dXJuIC0xOjE1ICovCi0KLSAgcmV0dmFsID0gLTE7Ci0KLSAgaWYgKGlzdXBwZXIgKGMxKSkKLSAgICBjMSA9IHRvbG93ZXIgKGMxKTsKLSAgaWYgKGlzdXBwZXIgKGMyKSkKLSAgICBjMiA9IHRvbG93ZXIgKGMyKTsKLSAgaWYgKGlzZGlnaXQgKGMyKSAmJiBjMSA9PSAncicpCi0gICAgewotICAgICAgcmV0dmFsID0gYzIgLSAnMCc7Ci0gICAgICBpZiAoaXNkaWdpdCAoYzMpKQotCXsKLQkgIHJldHZhbCA9IHJldHZhbCAqIDEwICsgYzMgLSAnMCc7Ci0JICByZXR2YWwgPSAocmV0dmFsID4gMTUpID8gLTEgOiByZXR2YWw7Ci0JICAvKiBjbGFtcCB0aGUgcmVnaXN0ZXIgdmFsdWUgdG8gMSBoZXggZGlnaXQgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChjMykKLQlyZXR2YWwgPSAtMTsJCS8qIGMzIG11c3QgYmUgJ1wwJyBvciBhIGRpZ2l0ICovCi0gICAgfQotICBlbHNlIGlmIChjMykJCQkvKiBUaGVyZSBhcmUgbm8gdGhyZWUgbGV0dGVyIHJlZ3MgKi8KLSAgICByZXR2YWwgPSAtMTsKLSAgZWxzZSBpZiAoYzIgPT0gJ3AnKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYzEpCi0JewotCWNhc2UgJ3MnOgotCSAgcmV0dmFsID0gU1A7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIHJldHZhbCA9IEZQOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICByZXR2YWwgPSBBUDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR2YWwgPSAtMTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChjMSA9PSAncCcgJiYgYzIgPT0gJ2MnKQotICAgIHJldHZhbCA9IFBDOwotICBlbHNlCi0gICAgcmV0dmFsID0gLTE7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQotLyoKLSAqICAgICAgICAgICAgICAgdiBpIHAgXyBvIHAgKCApCi0gKgotICogUGFyc2UgYSB2YXggb3BlcmFuZCBpbiBERUMgYXNzZW1ibGVyIG5vdGF0aW9uLgotICogRm9yIHNwZWVkLCBleHBlY3QgYSBzdHJpbmcgb2Ygd2hpdGVzcGFjZSB0byBiZSByZWR1Y2VkIHRvIGEgc2luZ2xlICcgJy4KLSAqIFRoaXMgaXMgdGhlIGNhc2UgZm9yIEdOVSBBUywgYW5kIGlzIGVhc3kgZm9yIG90aGVyIERFQy1jb21wYXRpYmxlCi0gKiBhc3NlbWJsZXJzLgotICoKLSAqIEtub3dsZWRnZSBhYm91dCBERUMgVkFYIGFzc2VtYmxlciBvcGVyYW5kIG5vdGF0aW9uIGxpdmVzIGhlcmUuCi0gKiBUaGlzIGRvZXNuJ3QgZXZlbiBrbm93IHdoYXQgYSByZWdpc3RlciBuYW1lIGlzLCBleGNlcHQgaXQgYmVsaWV2ZXMKLSAqIGFsbCByZWdpc3RlciBuYW1lcyBhcmUgMiBvciAzIGNoYXJhY3RlcnMsIGFuZCBsZXRzIHZheF9yZWdfcGFyc2UoKSBzYXkKLSAqIHdoYXQgbnVtYmVyIGVhY2ggbmFtZSByZXByZXNlbnRzLgotICogSXQgZG9lcywgaG93ZXZlciwga25vdyB0aGF0IFBDLCBTUCBldGMgYXJlIHNwZWNpYWwgcmVnaXN0ZXJzIHNvIGl0IGNhbgotICogZGV0ZWN0IGFkZHJlc3NpbmcgbW9kZXMgdGhhdCBhcmUgc2lsbHkgZm9yIHRob3NlIHJlZ2lzdGVycy4KLSAqCi0gKiBXaGVyZSBwb3NzaWJsZSwgaXQgZGVsaXZlcnMgMSBmYXRhbCBvciAxIHdhcm5pbmcgbWVzc2FnZSBpZiB0aGUgb3BlcmFuZAotICogaXMgc3VzcGVjdC4gRXhhY3RseSB3aGF0IHdlIHRlc3QgZm9yIGlzIHN0aWxsIGV2b2x2aW5nLgotICovCi0KLS8qCi0gKgkJICAgCUIgdSBnIHMKLSAqCi0gKglBcmcgYmxvY2suCi0gKgotICogVGhlcmUgd2VyZSBhIG51bWJlciBvZiAnbWlzbWF0Y2hlZCBhcmd1bWVudCB0eXBlJyBidWdzIHRvIHZpcF9vcC4KLSAqIFRoZSBtb3N0IGdlbmVyYWwgc29sdXRpb24gaXMgdG8gdHlwZWRlZiBlYWNoIChvZiBtYW55KSBhcmd1bWVudHMuCi0gKiBXZSB1c2VkIGluc3RlYWQgYSB0eXBlZGVmJ2QgYXJndW1lbnQgYmxvY2suIFRoaXMgaXMgbGVzcyBtb2R1bGFyCi0gKiB0aGFuIHVzaW5nIHNlcGVyYXRlIHJldHVybiBwb2ludGVycyBmb3IgZWFjaCByZXN1bHQsIGJ1dCBydW5zIGZhc3RlcgotICogb24gbW9zdCBlbmdpbmVzLCBhbmQgc2VlbXMgdG8ga2VlcCBwcm9ncmFtbWVycyBoYXBweS4gSXQgd2lsbCBoYXZlCi0gKiB0byBiZSBkb25lIHByb3Blcmx5IGlmIHdlIGV2ZXIgd2FudCB0byB1c2UgdmlwX29wIGFzIGEgZ2VuZXJhbC1wdXJwb3NlCi0gKiBtb2R1bGUgKGl0IHdhcyBkZXNpZ25lZCB0byBiZSkuCi0gKgotICoJR14KLSAqCi0gKiBEb2Vzbid0IHN1cHBvcnQgREVDICJHXiIgZm9ybWF0IG9wZXJhbmRzLiBUaGVzZSBhbHdheXMgdGFrZSA1IGJ5dGVzCi0gKiB0byBleHByZXNzLCBhbmQgY29kZSBhcyBtb2RlcyA4RiBvciA5Ri4gUmVhc29uOiAiR14iIGRlcHJpdmVzIHlvdSBvZgotICogb3B0aW1pc2luZyB0byAoc2F5KSBhICJCXiIgaWYgeW91IGFyZSBsdWNreSBpbiB0aGUgd2F5IHlvdSBsaW5rLgotICogV2hlbiBzb21lb25lIGJ1aWxkcyBhIGxpbmtlciBzbWFydCBlbm91Z2ggdG8gY29udmVydCAiR14iIHRvICJCXiIsICJXXiIKLSAqIHdoZW5ldmVyIHBvc3NpYmxlLCB0aGVuIHdlIHNob3VsZCBpbXBsZW1lbnQgaXQuCi0gKiBJZiB0aGVyZSBpcyBzb21lIG90aGVyIHVzZSBmb3IgIkdeIiwgZmVlbCBmcmVlIHRvIGNvZGUgaXQgaW4hCi0gKgotICoKLSAqCXNwZWVkCi0gKgotICogSWYgSSBuZXN0ZWQgaWYoKXMgbW9yZSwgSSBjb3VsZCBhdm9pZCB0ZXN0aW5nICgqZXJyKSB3aGljaCB3b3VsZCBzYXZlCi0gKiB0aW1lLCBzcGFjZSBhbmQgcGFnZSBmYXVsdHMuIEkgZGlkbid0IG5lc3QgYWxsIHRob3NlIGlmKClzIGZvciBjbGFyaXR5Ci0gKiBhbmQgYmVjYXVzZSBJIHRoaW5rIHRoZSBtb2RlIHRlc3RpbmcgY2FuIGJlIHJlLWFycmFuZ2VkIDFzdCB0byB0ZXN0IHRoZQotICogY29tbW9uZXIgY29uc3RydWN0cyAxc3QuIERvZXMgYW55Ym9keSBoYXZlIHN0YXRpc3RpY3Mgb24gdGhpcz8KLSAqCi0gKgotICoKLSAqCWVycm9yIG1lc3NhZ2VzCi0gKgotICogSW4gZnV0dXJlLCB3ZSBzaG91bGQgYmUgYWJsZSB0byAnY29tcG9zZScgZXJyb3IgbWVzc2FnZXMgaW4gYSBzY3JhdGNoIGFyZWEKLSAqIGFuZCBnaXZlIHRoZSB1c2VyIE1VQ0ggbW9yZSBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gQWx0aG91Z2ggdGhpcyB0YWtlcwotICogYSBsaXR0bGUgbW9yZSBjb2RlIGF0IHJ1bi10aW1lLCBpdCB3aWxsIG1ha2UgdGhpcyBtb2R1bGUgbXVjaCBtb3JlIHNlbGYtCi0gKiBkb2N1bWVudGluZy4gQXMgYW4gZXhhbXBsZSBvZiB3aGF0IHN1Y2tzIG5vdzogbW9zdCBlcnJvciBtZXNzYWdlcyBoYXZlCi0gKiBoYXJkd2lyZWQgaW50byB0aGVtIHRoZSBERUMgVkFYIG1ldGFjaGFyYWN0ZXJzICIjXkAiIHdoaWNoIGFyZSBub3RoaW5nIGxpa2UKLSAqIHRoZSBVbip4IGNoYXJhY3RlcnMgIiRgKiIsIHRoYXQgbW9zdCB1c2VycyB3aWxsIGV4cGVjdCBmcm9tIHRoaXMgQVMuCi0gKi8KLQwKLS8qCi0gKiBUaGUgaW5wdXQgaXMgYSBzdHJpbmcsIGVuZGluZyB3aXRoICdcMCcuCi0gKgotICogV2UgYWxzbyByZXF1aXJlIGEgJ2hpbnQnIG9mIHdoYXQga2luZCBvZiBvcGVyYW5kIGlzIGV4cGVjdGVkOiBzbwotICogd2UgY2FuIHJlbWluZCBjYWxsZXIgbm90IHRvIHdyaXRlIGludG8gbGl0ZXJhbHMgZm9yIGluc3RhbmNlLgotICoKLSAqIFRoZSBvdXRwdXQgaXMgYSBza2VsZXRhbCBpbnN0cnVjdGlvbi4KLSAqCi0gKiBUaGUgYWxnb3JpdGhtIGhhcyB0d28gcGFydHMuCi0gKiAxLiBleHRyYWN0IHRoZSBzeW50YWN0aWMgZmVhdHVyZXMgKHBhcnNlIG9mZiBhbGwgdGhlIEBeIy0oKStbXSBtb2RlIGNydWQpOwotICogMi4gZXhwcmVzcyB0aGUgQF4jLSgpK1tdIGFzIHNvbWUgcGFyYW1ldGVycyBzdWl0ZWQgdG8gZnVydGhlciBhbmFseXNpcy4KLSAqCi0gKiAybmQgc3RlcCBpcyB3aGVyZSB3ZSBkZXRlY3QgdGhlIGdvb2dsZXMgb2YgcG9zc2libGUgaW52YWxpZCBjb21iaW5hdGlvbnMKLSAqIGEgaHVtYW4gKG9yIGNvbXBpbGVyKSBtaWdodCB3cml0ZS4gTm90ZSB0aGF0IGlmIHdlIGRvIGEgaGFsZi13YXkKLSAqIGRlY2VudCBhc3NlbWJsZXIsIHdlIGRvbid0IGtub3cgaG93IGxvbmcgdG8gbWFrZSAoZWcpIGRpc3BsYWNlbWVudAotICogZmllbGRzIHdoZW4gd2UgZmlyc3QgbWVldCB0aGVtIChiZWNhdXNlIHRoZXkgbWF5IG5vdCBoYXZlIGRlZmluZWQgdmFsdWVzKS4KLSAqIFNvIHdlIG11c3Qgd2FpdCB1bnRpbCB3ZSBrbm93IGhvdyBtYW55IGJpdHMgYXJlIG5lZWRlZCBmb3IgZWFjaCBhZGRyZXNzLAotICogdGhlbiB3ZSBjYW4ga25vdyBib3RoIGxlbmd0aCBhbmQgb3Bjb2RlcyBvZiBpbnN0cnVjdGlvbnMuCi0gKiBGb3IgcmVhc29uKHMpIGFib3ZlLCB3ZSB3aWxsIHBhc3MgdG8gb3VyIGNhbGxlciBhICdicm9rZW4nIGluc3RydWN0aW9uCi0gKiBvZiB0aGVzZSBtYWpvciBjb21wb25lbnRzLCBmcm9tIHdoaWNoIG91ciBjYWxsZXIgY2FuIGdlbmVyYXRlIGluc3RydWN0aW9uczoKLSAqICAtICBkaXNwbGFjZW1lbnQgbGVuZ3RoICAgICAgSV4gU14gTF4gQl4gV14gdW5zcGVjaWZpZWQKLSAqICAtICBtb2RlICAgICAgICAgICAgICAgICAgICAgKG1hbnkpCi0gKiAgLSAgcmVnaXN0ZXIgICAgICAgICAgICAgICAgIFIwLVIxNSBvciBhYnNlbnQKLSAqICAtICBpbmRleCByZWdpc3RlciAgICAgICAgICAgUjAtUjE1IG9yIGFic2VudAotICogIC0gIGV4cHJlc3Npb24gdGV4dCAgICAgICAgICB3aGF0IHdlIGRvbid0IHBhcnNlCi0gKiAgLSAgZXJyb3IgdGV4dChzKSAgICAgICAgICAgIHdoeSB3ZSBjb3VsZG4ndCB1bmRlcnN0YW5kIHRoZSBvcGVyYW5kCi0gKi8KLQotLyoKLSAqIFRvIGRlY29kZSBvdXRwdXQgb2YgdGhpcywgdGVzdCBlcnJ0eHQuIElmIGVycnR4dFswXSA9PSAnXDAnLCB0aGVuCi0gKiB3ZSBoYWQgbm8gZXJyb3JzIHRoYXQgcHJldmVudGVkIHBhcnNpbmcuIEFsc28sIGlmIHdlIGV2ZXIgcmVwb3J0Ci0gKiBhbiBpbnRlcm5hbCBidWcsIGVycnR4dFswXSBpcyBzZXQgbm9uLXplcm8uIFNvIG9uZSB0ZXN0IHRlbGxzIHlvdQotICogaWYgdGhlIG90aGVyIG91dHB1dHMgYXJlIHRvIGJlIHRha2VuIHNlcmlvdXNseS4KLSAqLwotCi0KLS8qCi0gKiBCZWNhdXNlIHRoaXMgbW9kdWxlIGlzIHVzZWZ1bCBmb3IgYm90aCBWTVMgYW5kIFVOKlggc3R5bGUgYXNzZW1ibGVycwotICogYW5kIGJlY2F1c2Ugb2YgdGhlIHZhcmlldHkgb2YgVU4qWCBhc3NlbWJsZXJzIHdlIG11c3QgcmVjb2duaXNlCi0gKiB0aGUgZGlmZmVyZW50IGNvbnZlbnRpb25zIGZvciBhc3NlbWJsZXIgb3BlcmFuZCBub3RhdGlvbi4gRm9yIGV4YW1wbGUKLSAqIFZNUyBzYXlzICIjNDIiIGZvciBpbW1lZGlhdGUgbW9kZSwgd2hpbGUgbW9zdCBVTipYIHNheSAiJDQyIi4KLSAqIFdlIHBlcm1pdCBhcmJpdHJhcnkgc2V0cyBvZiAoc2luZ2xlKSBjaGFyYWN0ZXJzIHRvIHJlcHJlc2VudCB0aGUKLSAqIDMgY29uY2VwdHMgdGhhdCBERUMgd3JpdGVzICcjJywgJ0AnLCAnXicuCi0gKi8KLQotLyogY2hhcmFjdGVyIHRlc3RzICovCi0jZGVmaW5lIFZJUF9JTU1FRElBVEUgMDEJLyogQ2hhcmFjdGVyIGlzIGxpa2UgREVDICMgKi8KLSNkZWZpbmUgVklQX0lORElSRUNUICAwMgkvKiBDaGFyIGlzIGxpa2UgREVDIEAgKi8KLSNkZWZpbmUgVklQX0RJU1BMRU4gICAwNAkvKiBDaGFyIGlzIGxpa2UgREVDIF4gKi8KLQotI2RlZmluZSBJTU1FRElBVEVQKGMpCSh2aXBfbWV0YWNoYXJhY3RlcnMgWyhjKSYweGZmXSZWSVBfSU1NRURJQVRFKQotI2RlZmluZSBJTkRJUkVDVFAoYykJKHZpcF9tZXRhY2hhcmFjdGVycyBbKGMpJjB4ZmZdJlZJUF9JTkRJUkVDVCkKLSNkZWZpbmUgRElTUExFTlAoYykJKHZpcF9tZXRhY2hhcmFjdGVycyBbKGMpJjB4ZmZdJlZJUF9ESVNQTEVOKQotCi0vKiBXZSBhc3N1bWUgOCBiaXRzIHBlciBieXRlLiBVc2UgdmlwX29wX2RlZmF1bHRzKCkgdG8gc2V0IHRoZXNlIHVwIEJFRk9SRSB3ZQotICogYXJlIGV2ZXIgY2FsbGVkLgotICovCi0KLSNpZiBkZWZpbmVkKENPTlNUX1RBQkxFKQotI2RlZmluZSBfIDAsCi0jZGVmaW5lIEkgVklQX0lNTUVESUFURSwKLSNkZWZpbmUgUyBWSVBfSU5ESVJFQ1QsCi0jZGVmaW5lIEQgVklQX0RJU1BMRU4sCi1zdGF0aWMgY29uc3QgY2hhcgotdmlwX21ldGFjaGFyYWN0ZXJzWzI1Nl0gPQotewotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qIF5AIF5BIF5CIF5DIF5EIF5FIF5GIF5HIF5IIF5JIF5KIF5LIF5MIF5NIF5OIF5PKi8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKiBeUCBeUSBeUiBeUyBeVCBeVSBeViBeVyBeWCBeWSBeWiBeWyBeXCBeXSBeXiBeXyAqLwotICBfIF8gXyBfIEkgXyBfIF8gXyBfIFMgXyBfIF8gXyBfCS8qIHNwICEgICIgICMgICQgICUgICYgJyAgKCAgKSAgKiAgKyAgLCAgLSAgLiAgLyAqLwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgOiAgOyAgPCAgPSAgPiAgPyovCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLypAICBBICBCICBDICBEICBFICBGICBHICBIICBJICBKICBLICBMICBNICBOICBPKi8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKlAgIFEgIFIgIFMgIFQgIFUgIFYgIFcgIFggIFkgIFogIFsgIFwgIF0gIF4gIF8qLwotICBEIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qYCAgYSAgYiAgYyAgZCAgZSAgZiAgZyAgaCAgaSAgaiAgayAgbCAgbSAgbiAgbyovCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLypwICBxICByICBzICB0ICB1ICB2ICB3ICB4ICB5ICB6ICB7ICB8ICB9ICB+ICBePyovCi0KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi19OwotI3VuZGVmIF8KLSN1bmRlZiBJCi0jdW5kZWYgUwotI3VuZGVmIEQKLSNlbHNlCi1zdGF0aWMgY2hhciB2aXBfbWV0YWNoYXJhY3RlcnNbMjU2XTsKLQotc3RhdGljIHZvaWQKLXZpcF9vcF8xIChiaXQsIHN5bXMpCi0gICAgIGludCBiaXQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bXM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgdDsKLQotICB3aGlsZSAoKHQgPSAqc3ltcysrKSAhPSAwKQotICAgIHZpcF9tZXRhY2hhcmFjdGVyc1t0XSB8PSBiaXQ7Ci19Ci0KLS8qIENhbiBiZSBjYWxsZWQgYW55IHRpbWUuICBNb3JlIGFyZ3VtZW50cyBtYXkgYXBwZWFyIGluIGZ1dHVyZS4gICovCi1zdGF0aWMgdm9pZCAKLXZpcF9vcF9kZWZhdWx0cyAoaW1tZWRpYXRlLCBpbmRpcmVjdCwgZGlzcGxlbikKLSAgICAgY29uc3QgY2hhciAqaW1tZWRpYXRlOwotICAgICBjb25zdCBjaGFyICppbmRpcmVjdDsKLSAgICAgY29uc3QgY2hhciAqZGlzcGxlbjsKLXsKLSAgdmlwX29wXzEgKFZJUF9JTU1FRElBVEUsIGltbWVkaWF0ZSk7Ci0gIHZpcF9vcF8xIChWSVBfSU5ESVJFQ1QsIGluZGlyZWN0KTsKLSAgdmlwX29wXzEgKFZJUF9ESVNQTEVOLCBkaXNwbGVuKTsKLX0KLQotI2VuZGlmCi0MCi0KLS8qCi0gKiBEZWMgZGVmaW5lcyB0aGUgc2VtYW50aWNzIG9mIGFkZHJlc3MgbW9kZXMgKGFuZCB2YWx1ZXMpCi0gKiBieSBhIHR3by1sZXR0ZXIgY29kZSwgZXhwbGFpbmVkIGhlcmUuCi0gKgotICogICBsZXR0ZXIgMTogICBhY2Nlc3MgdHlwZQotICoKLSAqICAgICBhICAgICAgICAgYWRkcmVzcyBjYWxjdWxhdGlvbiAtIG5vIGRhdGEgYWNjZXNzLCByZWdpc3RlcnMgZm9yYmlkZGVuCi0gKiAgICAgYiAgICAgICAgIGJyYW5jaCBkaXNwbGFjZW1lbnQKLSAqICAgICBtICAgICAgICAgcmVhZCAtIGxldCBnbyBvZiBidXMgLSB3cml0ZSBiYWNrICAgICJtb2RpZnkiCi0gKiAgICAgciAgICAgICAgIHJlYWQKLSAqICAgICB2ICAgICAgICAgYml0IGZpZWxkIGFkZHJlc3M6IGxpa2UgJ2EnIGJ1dCByZWdpc3RlcnMgYXJlIE9LCi0gKiAgICAgdyAgICAgICAgIHdyaXRlCi0gKiAgICAgc3BhY2UJIG5vIG9wZXJhdG9yIChlZyAiLmxvbmcgZm9vIikgW291ciBjb252ZW50aW9uXQotICoKLSAqICAgbGV0dGVyIDI6ICAgZGF0YSB0eXBlIChpLmUuIHdpZHRoLCBhbGlnbm1lbnQpCi0gKgotICogICAgIGIgICAgICAgICBieXRlCi0gKiAgICAgZCAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKEQgZm9ybWF0KQotICogICAgIGYgICAgICAgICBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IChGIGZvcm1hdCkKLSAqICAgICBnICAgICAgICAgRyBmb3JtYXQgZmxvYXRpbmcKLSAqICAgICBoICAgICAgICAgSCBmb3JtYXQgZmxvYXRpbmcKLSAqICAgICBsICAgICAgICAgbG9uZ3dvcmQKLSAqICAgICBvICAgICAgICAgb2N0YXdvcmQKLSAqICAgICBxICAgICAgICAgcXVhZHdvcmQKLSAqICAgICB3ICAgICAgICAgd29yZAotICogICAgID8JIHNpbXBsZSBzeW50aGV0aWMgYnJhbmNoIG9wZXJhbmQKLSAqICAgICAtCSB1bmNvbmRpdGlvbmFsIHN5bnRoZXRpYyBKU0IvSlNSIG9wZXJhbmQKLSAqICAgICAhCSBjb21wbGV4IHN5bnRoZXRpYyBicmFuY2ggb3BlcmFuZAotICoKLSAqIFRoZSAnLT8hJyBsZXR0ZXIgMidzIGFyZSBub3QgZm9yIGV4dGVybmFsIGNvbnN1bXB0aW9uLiBUaGV5IGFyZSB1c2VkCi0gKiBmb3IgdmFyaW91cyBhc3NlbWJsZXJzLiBHZW5lcmFsbHksIGFsbCB1bmtub3duIHdpZHRocyBhcmUgYXNzdW1lZCAwLgotICogV2UgZG9uJ3QgbGltaXQgeW91ciBjaG9pY2Ugb2Ygd2lkdGggY2hhcmFjdGVyLgotICoKLSAqIERFQyBvcGVyYW5kcyBhcmUgaGFyZCB3b3JrIHRvIHBhcnNlLiBGb3IgZXhhbXBsZSwgJ0AnIGFzIHRoZSBmaXJzdAotICogY2hhcmFjdGVyIG1lYW5zIGluZGlyZWN0IChkZWZlcnJlZCkgbW9kZSBidXQgZWxzd2hlcmUgaXQgaXMgYSBzaGlmdAotICogb3BlcmF0b3IuCi0gKiBUaGUgbG9uZy13aW5kZWQgZXhwbGFuYXRpb24gb2YgaG93IHRoaXMgaXMgc3VwcG9zZWQgdG8gd29yayBpcwotICogY2FuY2VsbGVkLiBSZWFkIGEgREVDIHZheCBtYW51YWwuCi0gKiBXZSB0cnkgaGFyZCBub3QgdG8gcGFyc2UgYW55dGhpbmcgdGhhdCBNSUdIVCBiZSBwYXJ0IG9mIHRoZSBleHByZXNzaW9uCi0gKiBidXJpZWQgaW4gdGhhdCBzeW50YXguIEZvciBleGFtcGxlIGlmIHdlIHNlZSBALi4uKFJuKSB3ZSBkb24ndCBjaGVjawotICogZm9yICctJyBiZWZvcmUgdGhlICcoJyBiZWNhdXNlIG1vZGUgQC0oUm4pIGRvZXMgbm90IGV4aXN0LgotICoKLSAqIEFmdGVyIHBhcnNpbmcgd2UgaGF2ZToKLSAqCi0gKiBhdCAgICAgICAgICAgICAgICAgICAgIDEgaWYgbGVhZGluZyAnQCcgKG9yIFVuKnggJyonKQotICogbGVuICAgICAgICAgICAgICAgICAgICB0YWtlcyBvbmUgdmFsdWUgZnJvbSAiIGJpbHN3Ii4gZWcgQl4gLT4gJ2InLgotICogaGFzaCAgICAgICAgICAgICAgICAgICAxIGlmIGxlYWRpbmcgJyMnIChvciBVbip4ICckJykKLSAqIGV4cHJfYmVnaW4sIGV4cHJfZW5kICAgdGhlIGV4cHJlc3Npb24gd2UgZGlkIG5vdCBwYXJzZQotICogICAgICAgICAgICAgICAgICAgICAgICBldmVuIHRob3VnaCB3ZSBkb24ndCBpbnRlcnByZXQgaXQsIHdlIG1ha2UgdXNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIG9mIGl0cyBwcmVzZW5jZSBvciBhYnNlbmNlLgotICogc2lnbiAgICAgICAgICAgICAgICAgICAtMTogLShSbikgICAgMDogYWJzZW50ICAgICsxOiAoUm4pKwotICogcGFyZW4gICAgICAgICAgICAgICAgICAxIGlmICgpIGFyZSBhcm91bmQgcmVnaXN0ZXIKLSAqIHJlZyAgICAgICAgICAgICAgICAgICAgbWFqb3IgcmVnaXN0ZXIgbnVtYmVyIDA6MTUgICAgLTEgbWVhbnMgYWJzZW50Ci0gKiBuZHggICAgICAgICAgICAgICAgICAgIGluZGV4IHJlZ2lzdGVyIG51bWJlciAwOjE1ICAgIC0xIG1lYW5zIGFic2VudAotICoKLSAqIEFnYWluLCBJIGRhcmUgbm90IGV4cGxhaW4gaXQ6IGp1c3QgdHJhY2UgQUxMIHRoZSBjb2RlIQotICovCi0MCi1zdGF0aWMgdm9pZAotdmlwX29wIChvcHRleHQsIHZvcFApCi0gICAgIC8qIHVzZXIncyBpbnB1dCBzdHJpbmcgZS5nLjogIkBCXmZvb0BiYXIoQVApW0ZQXToiICovCi0gICAgIGNoYXIgKm9wdGV4dDsKLSAgICAgLyogSW5wdXQgZmllbGRzOiB2b3BfYWNjZXNzLCB2b3Bfd2lkdGguCi0JT3V0cHV0IGZpZWxkczogX25keCwgX3JlZywgX21vZGUsIF9zaG9ydCwgX3dhcm4sCi0JX2Vycm9yIF9leHByX2JlZ2luLCBfZXhwcl9lbmQsIF9uYnl0ZXMuCi0Jdm9wX25ieXRlcyA6IG51bWJlciBvZiBieXRlcyBpbiBhIGRhdHVtLiAqLwotICAgICBzdHJ1Y3Qgdm9wICp2b3BQOwotewotICAvKiB0cmFjayBvcGVyYW5kIHRleHQgZm9yd2FyZCAqLwotICBjaGFyICpwOwotICAvKiB0cmFjayBvcGVyYW5kIHRleHQgYmFja3dhcmQgKi8KLSAgY2hhciAqcTsKLSAgLyogMSBpZiBsZWFkaW5nICdAJyAoJyonKSBzZWVuICovCi0gIGludCBhdDsKLSAgLyogb25lIG9mICIgYmlsc3ciICovCi0gIGNoYXIgbGVuOwotICAvKiAxIGlmIGxlYWRpbmcgJyMnICgnJCcpIHNlZW4gKi8KLSAgaW50IGhhc2g7Ci0gIC8qIC0xLCAwIG9yICsxICovCi0gIGludCBzaWduID0gMDsKLSAgLyogMSBpZiAoKSBzdXJyb3VuZCByZWdpc3RlciAqLwotICBpbnQgcGFyZW4gPSAwOwotICAvKiByZWdpc3RlciBudW1iZXIsIC0xOmFic2VudCAqLwotICBpbnQgcmVnID0gMDsKLSAgLyogaW5kZXggcmVnaXN0ZXIgbnVtYmVyIC0xOmFic2VudCAqLwotICBpbnQgbmR4ID0gMDsKLSAgLyogcmVwb3J0IGlsbGVnYWwgb3BlcmFuZCwgIiI9PU9LICovCi0gIC8qICIgIiBpcyBhIEZBS0UgZXJyb3I6IG1lYW5zIHdlIHdvbiAqLwotICAvKiBBTlkgZXJyIHRoYXQgYmVnaW5zIHdpdGggJyAnIGlzIGEgZmFrZS4gKi8KLSAgLyogIiAiIGlzIGNvbnZlcnRlZCB0byAiIiBiZWZvcmUgcmV0dXJuICovCi0gIGNvbnN0IGNoYXIgKmVycjsKLSAgLyogd2FybiBhYm91dCB3ZWlyZCBtb2RlcyBwZiBhZGRyZXNzICovCi0gIGNvbnN0IGNoYXIgKndybjsKLSAgLyogcHJlc2VydmUgcSBpbiBjYXNlIHdlIGJhY2t1cCAqLwotICBjaGFyICpvbGRxID0gTlVMTDsKLSAgLyogYnVpbGQgdXAgNC1iaXQgb3BlcmFuZCBtb2RlIGhlcmUgKi8KLSAgLyogbm90ZTogaW5kZXggbW9kZSBpcyBpbiBuZHgsIHRoaXMgaXMgKi8KLSAgLyogdGhlIG1ham9yIG1vZGUgb2Ygb3BlcmFuZCBhZGRyZXNzICovCi0gIGludCBtb2RlID0gMDsKLSAgLyoKLSAgICogTm90aWNlIGhvdyB3ZSBtb3ZlIHdyb25nLWFyZy10eXBlIGJ1Z3MgSU5TSURFIHRoaXMgbW9kdWxlOiBpZiB3ZQotICAgKiBnZXQgdGhlIHR5cGVzIHdyb25nIGJlbG93LCB3ZSBsb3NlIGF0IGNvbXBpbGUgdGltZSByYXRoZXIgdGhhbiBhdAotICAgKiBsaW50IG9yIHJ1biB0aW1lLgotICAgKi8KLSAgY2hhciBhY2Nlc3NfbW9kZTsJCS8qIHZvcF9hY2Nlc3MuICovCi0gIGNoYXIgd2lkdGg7CQkJLyogdm9wX3dpZHRoLiAqLwotCi0gIGFjY2Vzc19tb2RlID0gdm9wUC0+dm9wX2FjY2VzczsKLSAgd2lkdGggPSB2b3BQLT52b3Bfd2lkdGg7Ci0gIC8qIE5vbmUgb2Ygb3VyIGNvZGUgYnVncyAoeWV0KSwgbm8gdXNlciB0ZXh0IGVycm9ycywgbm8gd2FybmluZ3MKLSAgICAgZXZlbi4gICovCi0gIGVyciA9IHdybiA9IDA7Ci0KLSAgcCA9IG9wdGV4dDsKLQotICBpZiAoKnAgPT0gJyAnKQkJLyogRXhwZWN0IGFsbCB3aGl0ZXNwYWNlIHJlZHVjZWQgdG8gJyAnLiAqLwotICAgIHArKzsJCQkvKiBza2lwIG92ZXIgd2hpdGVzcGFjZSAqLwotCi0gIGlmICgoYXQgPSBJTkRJUkVDVFAgKCpwKSkgIT0gMCkKLSAgICB7CQkJCS8qIDEgaWYgKnA9PSdAJyhvciAnKicgZm9yIFVuKngpICovCi0gICAgICBwKys7CQkJLyogYXQgaXMgZGV0ZXJtaW5lZCAqLwotICAgICAgaWYgKCpwID09ICcgJykJCS8qIEV4cGVjdCBhbGwgd2hpdGVzcGFjZSByZWR1Y2VkIHRvICcgJy4gKi8KLQlwKys7CQkJLyogc2tpcCBvdmVyIHdoaXRlc3BhY2UgKi8KLSAgICB9Ci0KLSAgLyoKLSAgICogVGhpcyBjb2RlIGlzIHN1YnRsZS4gSXQgdHJpZXMgdG8gZGV0ZWN0IGFsbCBsZWdhbCAobGV0dGVyKSdeJwotICAgKiBidXQgaXQgZG9lc24ndCB3YXN0ZSB0aW1lIGV4cGxpY2l0bHkgdGVzdGluZyBmb3IgcHJlbWF0dXJlICdcMCcgYmVjYXVzZQotICAgKiB0aGlzIGNhc2UgaXMgcmVqZWN0ZWQgYXMgYSBtaXNtYXRjaCBhZ2FpbnN0IGVpdGhlciAobGV0dGVyKSBvciAnXicuCi0gICAqLwotICB7Ci0gICAgY2hhciBjOwotCi0gICAgYyA9ICpwOwotICAgIGlmIChpc3VwcGVyIChjKSkKLSAgICAgIGMgPSB0b2xvd2VyIChjKTsKLSAgICBpZiAoRElTUExFTlAgKHBbMV0pICYmIHN0cmNociAoImJpbHdzIiwgbGVuID0gYykpCi0gICAgICBwICs9IDI7CQkJLyogc2tpcCAobGV0dGVyKSAnXicgKi8KLSAgICBlbHNlCQkJLyogbm8gKGxldHRlcikgJ14nIHNlZW4gKi8KLSAgICAgIGxlbiA9ICcgJzsJCS8qIGxlbiBpcyBkZXRlcm1pbmVkICovCi0gIH0KLQotICBpZiAoKnAgPT0gJyAnKQkJLyogRXhwZWN0IGFsbCB3aGl0ZXNwYWNlIHJlZHVjZWQgdG8gJyAnLiAqLwotICAgIHArKzsJCQkvKiBza2lwIG92ZXIgd2hpdGVzcGFjZSAqLwotCi0gIGlmICgoaGFzaCA9IElNTUVESUFURVAgKCpwKSkgIT0gMCkJLyogMSBpZiAqcD09JyMnICgnJCcgZm9yIFVuKngpICovCi0gICAgcCsrOwkJCS8qIGhhc2ggaXMgZGV0ZXJtaW5lZCAqLwotCi0gIC8qCi0gICAqIHAgcG9pbnRzIHRvIHdoYXQgbWF5IGJlIHRoZSBiZWdpbm5pbmcgb2YgYW4gZXhwcmVzc2lvbi4KLSAgICogV2UgaGF2ZSBwZWVsZWQgb2ZmIHRoZSBmcm9udCBhbGwgdGhhdCBpcyBwZWVsYWJsZS4KLSAgICogV2Uga25vdyBhdCwgbGVuLCBoYXNoLgotICAgKgotICAgKiBMZXRzIHBvaW50IHEgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dCBhbmQgcGFyc2UgdGhhdCAoYmFja3dhcmRzKS4KLSAgICovCi0KLSAgZm9yIChxID0gcDsgKnE7IHErKykKLSAgICA7Ci0gIHEtLTsJCQkJLyogbm93IHEgcG9pbnRzIGF0IGxhc3QgY2hhciBvZiB0ZXh0ICovCi0MCi0gIGlmICgqcSA9PSAnICcgJiYgcSA+PSBwKQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0gICAgcS0tOwotICAvKiByZXZlcnNlIG92ZXIgd2hpdGVzcGFjZSwgYnV0IGRvbid0ICovCi0gIC8qIHJ1biBiYWNrIG92ZXIgKnAgKi8KLQotICAvKgotICAgKiBBcyBhIG1hdHRlciBvZiBwb2xpY3kgaGVyZSwgd2UgbG9vayBmb3IgW1JuXSwgYWx0aG91Z2ggYm90aCBSbiBhbmQgU14jCi0gICAqIGZvcmJpZCBbUm5dLiBUaGlzIGlzIGJlY2F1c2UgaXQgaXMgZWFzeSwgYW5kIGJlY2F1c2Ugb25seSBhIHNpY2sKLSAgICogY3lib3JnIHdvdWxkIGhhdmUgWy4uLl0gdHJhaWxpbmcgYW4gZXhwcmVzc2lvbiBpbiBhIFZBWC1saWtlIGFzc2VtYmxlci4KLSAgICogQSBtZXRpY3Vsb3VzIHBhcnNlciB3b3VsZCBmaXJzdCBjaGVjayBmb3IgUm4gZm9sbG93ZWQgYnkgJygnIG9yICdbJwotICAgKiBhbmQgbm90IHBhcnNlIGEgdHJhaWxpbmcgJ10nIGlmIGl0IGZvdW5kIGFub3RoZXIuIFdlIGp1c3QgYmFuIGV4cHJlc3Npb25zCi0gICAqIGVuZGluZyBpbiAnXScuCi0gICAqLwotICBpZiAoKnEgPT0gJ10nKQotICAgIHsKLSAgICAgIHdoaWxlIChxID49IHAgJiYgKnEgIT0gJ1snKQotCXEtLTsKLSAgICAgIC8qIGVpdGhlciBxPHAgb3Igd2UgZ290IG1hdGNoaW5nICdbJyAqLwotICAgICAgaWYgKHEgPCBwKQotCWVyciA9IF8oIm5vICdbJyB0byBtYXRjaCAnXSciKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICogQ29uZnVzZXJzIGxpa2UgIltdIiB3aWxsIGV2ZW50dWFsbHkgbG9zZSB3aXRoIGEgYmFkIHJlZ2lzdGVyCi0JICAgKiBuYW1lIGVycm9yLiBTbyBhZ2FpbiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBlYXJseSAnXDAnLgotCSAgICovCi0JICBpZiAocVszXSA9PSAnXScpCi0JICAgIG5keCA9IHZheF9yZWdfcGFyc2UgKHFbMV0sIHFbMl0sIDApOwotCSAgZWxzZSBpZiAocVs0XSA9PSAnXScpCi0JICAgIG5keCA9IHZheF9yZWdfcGFyc2UgKHFbMV0sIHFbMl0sIHFbM10pOwotCSAgZWxzZQotCSAgICBuZHggPSAtMTsKLQkgIC8qCi0JICAgKiBTaW5jZSB3ZSBzYXcgYSAnXScgd2Ugd2lsbCBkZW1hbmQgYSByZWdpc3RlciBuYW1lIGluIHRoZSBbXS4KLQkgICAqIElmIGx1c2VyIGhhc24ndCBnaXZlbiB1cyBvbmU6IGJlIHJ1ZGUuCi0JICAgKi8KLQkgIGlmIChuZHggPCAwKQotCSAgICBlcnIgPSBfKCJiYWQgcmVnaXN0ZXIgaW4gW10iKTsKLQkgIGVsc2UgaWYgKG5keCA9PSBQQykKLQkgICAgZXJyID0gXygiW1BDXSBpbmRleCBiYW5uZWQiKTsKLQkgIGVsc2UKLQkgICAgcS0tOwkJLyogcG9pbnQgcSBqdXN0IGJlZm9yZSAiWy4uLl0iICovCi0JfQotICAgIH0KLSAgZWxzZQotICAgIG5keCA9IC0xOwkJCS8qIG5vICddJywgc28gbm8gaU5EZVggcmVnaXN0ZXIgKi8KLQotICAvKgotICAgKiBJZiBlcnIgPSAiLi4uIiB0aGVuIHdlIGxvc3Q6IHJ1biBhd2F5LgotICAgKiBPdGhlcndpc2UgbmR4ID09IC0xIGlmIHRoZXJlIHdhcyBubyAiWy4uLl0iLgotICAgKiBPdGhlcndpc2UsIG5keCBpcyBpbmRleCByZWdpc3RlciBudW1iZXIsIGFuZCBxIHBvaW50cyBiZWZvcmUgIlsuLi5dIi4KLSAgICovCi0MCi0gIGlmICgqcSA9PSAnICcgJiYgcSA+PSBwKQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0gICAgcS0tOwotICAvKiByZXZlcnNlIG92ZXIgd2hpdGVzcGFjZSwgYnV0IGRvbid0ICovCi0gIC8qIHJ1biBiYWNrIG92ZXIgKnAgKi8KLSAgaWYgKCFlcnIgfHwgISplcnIpCi0gICAgewotICAgICAgc2lnbiA9IDA7CQkJLyogbm8gKCkrIG9yIC0oKSBzZWVuIHlldCAqLwotCi0gICAgICBpZiAocSA+IHAgKyAzICYmICpxID09ICcrJyAmJiBxWy0xXSA9PSAnKScpCi0JewotCSAgc2lnbiA9IDE7CQkvKiB3ZSBzYXcgYSAiKSsiICovCi0JICBxLS07CQkJLyogcSBwb2ludHMgdG8gJyknICovCi0JfQotCi0gICAgICBpZiAoKnEgPT0gJyknICYmIHEgPiBwICsgMikKLQl7Ci0JICBwYXJlbiA9IDE7CQkvKiBhc3N1bWUgd2UgaGF2ZSAiKC4uLikiICovCi0JICB3aGlsZSAocSA+PSBwICYmICpxICE9ICcoJykKLQkgICAgcS0tOwotCSAgLyogZWl0aGVyIHE8cCBvciB3ZSBnb3QgbWF0Y2hpbmcgJygnICovCi0JICBpZiAocSA8IHApCi0JICAgIGVyciA9IF8oIm5vICcoJyB0byBtYXRjaCAnKSciKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogQ29uZnVzZXJzIGxpa2UgIigpIiB3aWxsIGV2ZW50dWFsbHkgbG9zZSB3aXRoIGEgYmFkIHJlZ2lzdGVyCi0JICAgICAgICogbmFtZSBlcnJvci4gU28gYWdhaW4gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgZWFybHkgJ1wwJy4KLQkgICAgICAgKi8KLQkgICAgICBpZiAocVszXSA9PSAnKScpCi0JCXJlZyA9IHZheF9yZWdfcGFyc2UgKHFbMV0sIHFbMl0sIDApOwotCSAgICAgIGVsc2UgaWYgKHFbNF0gPT0gJyknKQotCQlyZWcgPSB2YXhfcmVnX3BhcnNlIChxWzFdLCBxWzJdLCBxWzNdKTsKLQkgICAgICBlbHNlCi0JCXJlZyA9IC0xOwotCSAgICAgIC8qCi0JICAgICAgICogU2luY2Ugd2Ugc2F3IGEgJyknIHdlIHdpbGwgZGVtYW5kIGEgcmVnaXN0ZXIgbmFtZSBpbiB0aGUgJyknLgotCSAgICAgICAqIFRoaXMgaXMgbmFzdHk6IHdoeSBjYW4ndCBvdXIgaHlwb3RoZXRpY2FsIGFzc2VtYmxlciBwZXJtaXQKLQkgICAgICAgKiBwYXJlbnRoZXNpc2VkIGV4cHJlc3Npb25zPyBCRUNBVVNFIEkgQU0gTEFaWSEgVGhhdCBpcyB3aHkuCi0JICAgICAgICogQWJ1c2UgbHVzZXIgaWYgd2UgZGlkbid0IHNweSBhIHJlZ2lzdGVyIG5hbWUuCi0JICAgICAgICovCi0JICAgICAgaWYgKHJlZyA8IDApCi0JCXsKLQkJICAvKiBKRiBhbGxvdyBwYXJlbnRoYXNpemVkIGV4cHJlc3Npb25zLiAgSSBob3BlIHRoaXMgd29ya3MgKi8KLQkJICBwYXJlbiA9IDA7Ci0JCSAgd2hpbGUgKCpxICE9ICcpJykKLQkJICAgIHErKzsKLQkJICAvKiBlcnIgPSAidW5rbm93biByZWdpc3RlciBpbiAoKSI7ICovCi0JCX0KLQkgICAgICBlbHNlCi0JCXEtLTsJCS8qIHBvaW50IGp1c3QgYmVmb3JlICcoJyBvZiAiKC4uLikiICovCi0JICAgICAgLyoKLQkgICAgICAgKiBJZiBlcnIgPT0gIi4uLiIgdGhlbiB3ZSBsb3N0LiBSdW4gYXdheS4KLQkgICAgICAgKiBPdGhlcndpc2UgaWYgcmVnID49IDAgdGhlbiB3ZSBzYXcgKFJuKS4KLQkgICAgICAgKi8KLQkgICAgfQotCSAgLyoKLQkgICAqIElmIGVyciA9PSAiLi4uIiB0aGVuIHdlIGxvc3QuCi0JICAgKiBPdGhlcndpc2UgcGFyZW49PTEgYW5kIHJlZyA9IHJlZ2lzdGVyIGluICIoKSIuCi0JICAgKi8KLQl9Ci0gICAgICBlbHNlCi0JcGFyZW4gPSAwOwotICAgICAgLyoKLSAgICAgICAqIElmIGVyciA9PSAiLi4uIiB0aGVuIHdlIGxvc3QuCi0gICAgICAgKiBPdGhlcndpc2UsIHEgcG9pbnRzIGp1c3QgYmVmb3JlICIoUm4pIiwgaWYgYW55LgotICAgICAgICogSWYgdGhlcmUgd2FzIGEgIiguLi4pIiB0aGVuIHBhcmVuPT0xLCBhbmQgcmVnIGlzIHRoZSByZWdpc3Rlci4KLSAgICAgICAqLwotDAotICAgICAgLyoKLSAgICAgICAqIFdlIHNob3VsZCBvbmx5IHNlZWsgJy0nIG9mICItKC4uLikiIGlmOgotICAgICAgICogICB3ZSBzYXcgIiguLi4pIiAgICAgICAgICAgICAgICAgICAgcGFyZW4gPT0gMQotICAgICAgICogICB3ZSBoYXZlIG5vIGVycm9ycyBzbyBmYXIgICAgICAgICAgISAqZXJyCi0gICAgICAgKiAgIHdlIGRpZCBub3Qgc2VlICcrJyBvZiAiKC4uLikrIiAgICBzaWduIDwgMQotICAgICAgICogV2UgZG9uJ3QgY2hlY2sgbGVuLiBXZSB3YW50IGEgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZSBsYXRlciBpZgotICAgICAgICogdXNlciB0cmllcyAieF4uLi4tKFJuKSIuIFRoaXMgaXMgYSBmZWF0dXJlIG5vdCBhIGJ1Zy4KLSAgICAgICAqLwotICAgICAgaWYgKCFlcnIgfHwgISplcnIpCi0JewotCSAgaWYgKHBhcmVuICYmIHNpZ24gPCAxKS8qICFzaWduIGlzIGFkZXF1YXRlIHRlc3QgKi8KLQkgICAgewotCSAgICAgIGlmICgqcSA9PSAnLScpCi0JCXsKLQkJICBzaWduID0gLTE7Ci0JCSAgcS0tOwotCQl9Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBXZSBoYXZlIGJhY2stdHJhY2tlZCBvdmVyIG1vc3QKLQkgICAqIG9mIHRoZSBjcnVkIGF0IHRoZSBlbmQgb2YgYW4gb3BlcmFuZC4KLQkgICAqIFVubGVzcyBlcnIsIHdlIGtub3c6IHNpZ24sIHBhcmVuLiBJZiBwYXJlbiwgd2Uga25vdyByZWcuCi0JICAgKiBUaGUgbGFzdCBjYXNlIGlzIG9mIGFuIGV4cHJlc3Npb24gIlJuIi4KLQkgICAqIFRoaXMgaXMgd29ydGggaHVudGluZyBmb3IgaWYgIWVyciwgIXBhcmVuLgotCSAgICogV2Ugd291bGRuJ3QgYmUgaGVyZSBpZiBlcnIuCi0JICAgKiBXZSByZW1lbWJlciB0byBzYXZlIHEsIGluIGNhc2Ugd2UgZGlkbid0IHdhbnQgIlJuIiBhbnl3YXkuCi0JICAgKi8KLQkgIGlmICghcGFyZW4pCi0JICAgIHsKLQkgICAgICBpZiAoKnEgPT0gJyAnICYmIHEgPj0gcCkJLyogRXhwZWN0IGFsbCB3aGl0ZXNwYWNlIHJlZHVjZWQgdG8gJyAnLiAqLwotCQlxLS07Ci0JICAgICAgLyogcmV2ZXJzZSBvdmVyIHdoaXRlc3BhY2UsIGJ1dCBkb24ndCAqLwotCSAgICAgIC8qIHJ1biBiYWNrIG92ZXIgKnAgKi8KLQkgICAgICBpZiAocSA+IHAgJiYgcSA8IHAgKyAzKQkvKiByb29tIGZvciBSbiBvciBSbm4gZXhhY3RseT8gKi8KLQkJcmVnID0gdmF4X3JlZ19wYXJzZSAocFswXSwgcFsxXSwgcSA8IHAgKyAyID8gMCA6IHBbMl0pOwotCSAgICAgIGVsc2UKLQkJcmVnID0gLTE7CS8qIGFsd2F5cyBjb21lcyBoZXJlIGlmIG5vIHJlZ2lzdGVyIGF0IGFsbCAqLwotCSAgICAgIC8qCi0JICAgICAgICogSGVyZSB3aXRoIGEgZGVmaW5pdGl2ZSByZWcgdmFsdWUuCi0JICAgICAgICovCi0JICAgICAgaWYgKHJlZyA+PSAwKQotCQl7Ci0JCSAgb2xkcSA9IHE7Ci0JCSAgcSA9IHAgLSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKgotICAgKiBoYXZlIHJlZy4gLTE6YWJzZW50OyBlbHNlIDA6MTUKLSAgICovCi0KLSAgLyoKLSAgICogV2UgaGF2ZTogIGVyciwgYXQsIGxlbiwgaGFzaCwgbmR4LCBzaWduLCBwYXJlbiwgcmVnLgotICAgKiBBbHNvLCBhbnkgcmVtYWluaW5nIGV4cHJlc3Npb24gaXMgZnJvbSAqcCB0aHJvdWdoICpxIGluY2x1c2l2ZS4KLSAgICogU2hvdWxkIHRoZXJlIGJlIG5vIGV4cHJlc3Npb24sIHE9PXAtMS4gU28gZXhwcmVzc2lvbiBsZW5ndGggPSBxLXArMS4KLSAgICogVGhpcyBjb21wbGV0ZXMgdGhlIGZpcnN0IHBhcnQ6IHBhcnNpbmcgdGhlIG9wZXJhbmQgdGV4dC4KLSAgICovCi0MCi0gIC8qCi0gICAqIFdlIG5vdyB3YW50IHRvIGJvaWwgdGhlIGRhdGEgZG93biwgY2hlY2tpbmcgY29uc2lzdGVuY3kgb24gdGhlIHdheS4KLSAgICogV2Ugd2FudDogIGxlbiwgbW9kZSwgcmVnLCBuZHgsIGVyciwgcCwgcSwgd3JuLCBidWcuCi0gICAqIFdlIHdpbGwgZGVsaXZlciBhIDQtYml0IHJlZywgYW5kIGEgNC1iaXQgbW9kZS4KLSAgICovCi0KLSAgLyoKLSAgICogQ2FzZSBvZiBicmFuY2ggb3BlcmFuZC4gRGlmZmVyZW50LiBObyBMXkJeV15JXlNeIGFsbG93ZWQgZm9yIGluc3RhbmNlLgotICAgKgotICAgKiBpbjogIGF0CT8KLSAgICogICAgICBsZW4JPwotICAgKiAgICAgIGhhc2gJPwotICAgKiAgICAgIHA6cQk/Ci0gICAqICAgICAgc2lnbiAgPwotICAgKiAgICAgIHBhcmVuCT8KLSAgICogICAgICByZWcgICA/Ci0gICAqICAgICAgbmR4ICAgPwotICAgKgotICAgKiBvdXQ6IG1vZGUgIDAKLSAgICogICAgICByZWcgICAtMQotICAgKiAgICAgIGxlbgknICcKLSAgICogICAgICBwOnEJd2hhdGV2ZXIgd2FzIGlucHV0Ci0gICAqICAgICAgbmR4CS0xCi0gICAqICAgICAgZXJyCSIgIgkJIG9yIGVycm9yIG1lc3NhZ2UsIGFuZCBvdGhlciBvdXRwdXRzIHRyYXNoZWQKLSAgICovCi0gIC8qIGJyYW5jaCBvcGVyYW5kcyBoYXZlIHJlc3RyaWN0ZWQgZm9ybXMgKi8KLSAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBhY2Nlc3NfbW9kZSA9PSAnYicpCi0gICAgewotICAgICAgaWYgKGF0IHx8IGhhc2ggfHwgc2lnbiB8fCBwYXJlbiB8fCBuZHggPj0gMCB8fCByZWcgPj0gMCB8fCBsZW4gIT0gJyAnKQotCWVyciA9IF8oImludmFsaWQgYnJhbmNoIG9wZXJhbmQiKTsKLSAgICAgIGVsc2UKLQllcnIgPSAiICI7Ci0gICAgfQotDAotICAvKiBTaW5jZSBub2JvZHkgc2VlbXMgdG8gdXNlIGl0OiBjb21tZW50IHRoaXMgJ2ZlYXR1cmUnKD8pIG91dCBmb3Igbm93LiAqLwotI2lmZGVmIE5FVkVSCi0gIC8qCi0gICAqIENhc2Ugb2Ygc3RhbmQtYWxvbmUgb3BlcmFuZC4gZS5nLiAiLmxvbmcgZm9vIgotICAgKgotICAgKiBpbjogIGF0CT8KLSAgICogICAgICBsZW4JPwotICAgKiAgICAgIGhhc2gJPwotICAgKiAgICAgIHA6cQk/Ci0gICAqICAgICAgc2lnbiAgPwotICAgKiAgICAgIHBhcmVuCT8KLSAgICogICAgICByZWcgICA/Ci0gICAqICAgICAgbmR4ICAgPwotICAgKgotICAgKiBvdXQ6IG1vZGUgIDAKLSAgICogICAgICByZWcgICAtMQotICAgKiAgICAgIGxlbgknICcKLSAgICogICAgICBwOnEJd2hhdGV2ZXIgd2FzIGlucHV0Ci0gICAqICAgICAgbmR4CS0xCi0gICAqICAgICAgZXJyCSIgIgkJIG9yIGVycm9yIG1lc3NhZ2UsIGFuZCBvdGhlciBvdXRwdXRzIHRyYXNoZWQKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgYWNjZXNzX21vZGUgPT0gJyAnKQotICAgIHsKLSAgICAgIGlmIChhdCkKLQllcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyBAIik7Ci0gICAgICBlbHNlIGlmIChoYXNoKQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzICMiKTsKLSAgICAgIGVsc2UgaWYgKHNpZ24pCi0JewotCSAgaWYgKHNpZ24gPCAwKQotCSAgICBlcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyAtKCkiKTsKLQkgIGVsc2UKLQkgICAgZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgKCkrIik7Ci0JfQotICAgICAgZWxzZSBpZiAocGFyZW4pCi0JZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgKCkiKTsKLSAgICAgIGVsc2UgaWYgKG5keCA+PSAwKQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIFtdIik7Ci0gICAgICBlbHNlIGlmIChyZWcgPj0gMCkKLQllcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyByZWdpc3RlciIpOwotICAgICAgZWxzZSBpZiAobGVuICE9ICcgJykKLQllcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyBkaXNwbGFjZW1lbnQgbGVuZ3RoIHNwZWNpZmllciIpOwotICAgICAgZWxzZQotCXsKLQkgIGVyciA9ICIgIjsJLyogc3VjY2VlZCAqLwotCSAgbW9kZSA9IDA7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiNJZmRlZiBORVZFUiovCi0MCi0gIC8qCi0gICAqIENhc2Ugb2YgU14jLgotICAgKgotICAgKiBpbjogIGF0ICAgICAgIDAKLSAgICogICAgICBsZW4gICAgICAncycgICAgICAgICAgICAgICBkZWZpbml0aW9uCi0gICAqICAgICAgaGFzaCAgICAgMSAgICAgICAgICAgICAgZGVtYW5kCi0gICAqICAgICAgcDpxICAgICAgICAgICAgICAgICAgICAgICAgZGVtYW5kIG5vdCBlbXB0eQotICAgKiAgICAgIHNpZ24gICAgIDAgICAgICAgICAgICAgICAgIGJ5IHBhcmVuPT0wCi0gICAqICAgICAgcGFyZW4gICAgMCAgICAgICAgICAgICBieSAiKCkiIHNjYW4gbG9naWMgYmVjYXVzZSAiU14iIHNlZW4KLSAgICogICAgICByZWcgICAgICAtMSAgICAgICAgICAgICAgICBvciBubiBieSBtaXN0YWtlCi0gICAqICAgICAgbmR4ICAgICAgLTEKLSAgICoKLSAgICogb3V0OiBtb2RlICAgICAwCi0gICAqICAgICAgcmVnICAgICAgLTEKLSAgICogICAgICBsZW4gICAgICAncycKLSAgICogICAgICBleHAKLSAgICogICAgICBuZHggICAgICAtMQotICAgKi8KLSAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBsZW4gPT0gJ3MnKQotICAgIHsKLSAgICAgIGlmICghaGFzaCB8fCBwYXJlbiB8fCBhdCB8fCBuZHggPj0gMCkKLQllcnIgPSBfKCJpbnZhbGlkIG9wZXJhbmQgb2YgU14jIik7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHJlZyA+PSAwKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBTSElUISB3ZSBzYXcgU14jUm5uICEgcHV0IHRoZSBSbm4gYmFjayBpbgotCSAgICAgICAqIGV4cHJlc3Npb24uIEtMVURHRSEgVXNlIG9sZHEgc28gd2UgZG9uJ3QKLQkgICAgICAgKiBuZWVkIHRvIGtub3cgZXhhY3QgbGVuZ3RoIG9mIHJlZyBuYW1lLgotCSAgICAgICAqLwotCSAgICAgIHEgPSBvbGRxOwotCSAgICAgIHJlZyA9IDA7Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBXZSBoYXZlIGFsbCB0aGUgZXhwcmVzc2lvbiB3ZSB3aWxsIGV2ZXIgZ2V0LgotCSAgICovCi0JICBpZiAocCA+IHEpCi0JICAgIGVyciA9IF8oIlNeIyBuZWVkcyBleHByZXNzaW9uIik7Ci0JICBlbHNlIGlmIChhY2Nlc3NfbW9kZSA9PSAncicpCi0JICAgIHsKLQkgICAgICBlcnIgPSAiICI7CS8qIFdJTiEgKi8KLQkgICAgICBtb2RlID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBlcnIgPSBfKCJTXiMgbWF5IG9ubHkgcmVhZC1hY2Nlc3MiKTsKLQl9Ci0gICAgfQotDAotICAvKgotICAgKiBDYXNlIG9mIC0oUm4pLCB3aGljaCBpcyB3ZWlyZCBjYXNlLgotICAgKgotICAgKiBpbjogIGF0ICAgICAgIDAKLSAgICogICAgICBsZW4gICAgICAnCi0gICAqICAgICAgaGFzaCAgICAgMAotICAgKiAgICAgIHA6cSAgICAgIHE8cAotICAgKiAgICAgIHNpZ24gICAgIC0xICAgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBwYXJlbiAgICAxICAgICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgcmVnICAgICAgcHJlc2VudCAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCi0gICAqCi0gICAqIG91dDogbW9kZSAgICAgNwotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQKLSAgICogICAgICBsZW4gICAgICAnICcKLSAgICogICAgICBleHAgICAgICAiIiAgICAgICAgICAgICAgICBlbmZvcmNlIGVtcHR5IGV4cHJlc3Npb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbCAgICAgICAgICB3YXJuIGlmIHNhbWUgYXMgcmVnCi0gICAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmIHNpZ24gPCAwKQotICAgIHsKLSAgICAgIGlmIChsZW4gIT0gJyAnIHx8IGhhc2ggfHwgYXQgfHwgcCA8PSBxKQotCWVyciA9IF8oImludmFsaWQgb3BlcmFuZCBvZiAtKCkiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBlcnIgPSAiICI7CQkvKiB3aW4gKi8KLQkgIG1vZGUgPSA3OwotCSAgaWYgKHJlZyA9PSBQQykKLQkgICAgd3JuID0gXygiLShQQykgdW5wcmVkaWN0YWJsZSIpOwotCSAgZWxzZSBpZiAocmVnID09IG5keCkKLQkgICAgd3JuID0gXygiW11pbmRleCBzYW1lIGFzIC0oKXJlZ2lzdGVyOiB1bnByZWRpY3RhYmxlIik7Ci0JfQotICAgIH0KLQwKLSAgLyoKLSAgICogV2UgY29udmVydCAiKFJuKSIgdG8gIkBSbiIgZm9yIG91ciBjb252ZW5pZW5jZS4KLSAgICogKEkgaG9wZSB0aGlzIGlzIGNvbnZlbmllbnQ6IGhhcyBzb21lb25lIGdvdCBhIGJldHRlciB3YXkgdG8gcGFyc2UgdGhpcz8pCi0gICAqIEEgc2lkZS1lZmZlY3Qgb2YgdGhpcyBpcyB0aGF0ICJAUm4iIGlzIGEgdmFsaWQgb3BlcmFuZC4KLSAgICovCi0gIGlmIChwYXJlbiAmJiAhc2lnbiAmJiAhaGFzaCAmJiAhYXQgJiYgbGVuID09ICcgJyAmJiBwID4gcSkKLSAgICB7Ci0gICAgICBhdCA9IDE7Ci0gICAgICBwYXJlbiA9IDA7Ci0gICAgfQotCi0gIC8qCi0gICAqIENhc2Ugb2YgKFJuKSssIHdoaWNoIGlzIHNsaWdodGx5IGRpZmZlcmVudC4KLSAgICoKLSAgICogaW46ICBhdAotICAgKiAgICAgIGxlbiAgICAgICcgJwotICAgKiAgICAgIGhhc2ggICAgIDAKLSAgICogICAgICBwOnEgICAgICBxPHAKLSAgICogICAgICBzaWduICAgICArMSAgICAgICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgcGFyZW4gICAgMSAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbAotICAgKgotICAgKiBvdXQ6IG1vZGUgICAgIDgrQAotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQKLSAgICogICAgICBsZW4gICAgICAnICcKLSAgICogICAgICBleHAgICAgICAiIiAgICAgICAgICAgICAgICBlbmZvcmNlIGVtcHR5IGV4cHJlc3Npb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbCAgICAgICAgICB3YXJuIGlmIHNhbWUgYXMgcmVnCi0gICAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmIHNpZ24gPiAwKQotICAgIHsKLSAgICAgIGlmIChsZW4gIT0gJyAnIHx8IGhhc2ggfHwgcCA8PSBxKQotCWVyciA9IF8oImludmFsaWQgb3BlcmFuZCBvZiAoKSsiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBlcnIgPSAiICI7CQkvKiB3aW4gKi8KLQkgIG1vZGUgPSA4ICsgKGF0ID8gMSA6IDApOwotCSAgaWYgKHJlZyA9PSBQQykKLQkgICAgd3JuID0gXygiKFBDKSsgdW5wcmVkaWN0YWJsZSIpOwotCSAgZWxzZSBpZiAocmVnID09IG5keCkKLQkgICAgd3JuID0gXygiW11pbmRleCBzYW1lIGFzICgpK3JlZ2lzdGVyOiB1bnByZWRpY3RhYmxlIik7Ci0JfQotICAgIH0KLQwKLSAgLyoKLSAgICogQ2FzZSBvZiAjLCB3aXRob3V0IFNeLgotICAgKgotICAgKiBpbjogIGF0Ci0gICAqICAgICAgbGVuICAgICAgJyAnIG9yICdpJwotICAgKiAgICAgIGhhc2ggICAgIDEgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBwOnEKLSAgICogICAgICBzaWduICAgICAwCi0gICAqICAgICAgcGFyZW4gICAgMAotICAgKiAgICAgIHJlZyAgICAgIGFic2VudAotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCi0gICAqCi0gICAqIG91dDogbW9kZSAgICAgOCtACi0gICAqICAgICAgcmVnICAgICAgUEMKLSAgICogICAgICBsZW4gICAgICAnICcgb3IgJ2knCi0gICAqICAgICAgZXhwCi0gICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgaGFzaCkKLSAgICB7Ci0gICAgICBpZiAobGVuICE9ICdpJyAmJiBsZW4gIT0gJyAnKQotCWVyciA9IF8oIiMgY29uZmxpY3RzIGxlbmd0aCIpOwotICAgICAgZWxzZSBpZiAocGFyZW4pCi0JZXJyID0gXygiIyBiYXJzIHJlZ2lzdGVyIik7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHJlZyA+PSAwKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBTSElUISB3ZSBzYXcgI1JubiEgUHV0IHRoZSBSbm4gYmFjayBpbnRvIHRoZSBleHByZXNzaW9uLgotCSAgICAgICAqIEJ5IHVzaW5nIG9sZHEsIHdlIGRvbid0IG5lZWQgdG8ga25vdyBob3cgbG9uZyBSbm4gd2FzLgotCSAgICAgICAqIEtMVURHRSEKLQkgICAgICAgKi8KLQkgICAgICBxID0gb2xkcTsKLQkgICAgICByZWcgPSAtMTsJCS8qIG5vIHJlZ2lzdGVyIGFueSBtb3JlICovCi0JICAgIH0KLQkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLwotCi0JICAvKiBKRiBhIGJ1Z2ZpeCwgSSB0aGluayEgKi8KLQkgIGlmIChhdCAmJiBhY2Nlc3NfbW9kZSA9PSAnYScpCi0JICAgIHZvcFAtPnZvcF9uYnl0ZXMgPSA0OwotCi0JICBtb2RlID0gKGF0ID8gOSA6IDgpOwotCSAgcmVnID0gUEM7Ci0JICBpZiAoKGFjY2Vzc19tb2RlID09ICdtJyB8fCBhY2Nlc3NfbW9kZSA9PSAndycpICYmICFhdCkKLQkgICAgd3JuID0gXygid3JpdGluZyBvciBtb2RpZnlpbmcgIyBpcyB1bnByZWRpY3RhYmxlIik7Ci0JfQotICAgIH0KLSAgLyoKLSAgICogSWYgISplcnIsIHRoZW4gICAgICAgIHNpZ24gPT0gMAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgaGFzaCA9PSAwCi0gICAqLwotDAotICAvKgotICAgKiBDYXNlIG9mIFJuLiBXZSBzZXBlcmF0ZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGhhcyBhIGZldyBzcGVjaWFsCi0gICAqIGVycm9ycyB0aGUgcmVtYWluaW5nIG1vZGVzIGxhY2suCi0gICAqCi0gICAqIGluOiAgYXQgICAgICAgb3B0aW9uYWwKLSAgICogICAgICBsZW4gICAgICAnICcKLSAgICogICAgICBoYXNoICAgICAwICAgICAgICAgICAgIGJ5IHByb2dyYW0gbG9naWMKLSAgICogICAgICBwOnEgICAgICBlbXB0eQotICAgKiAgICAgIHNpZ24gICAgIDAgICAgICAgICAgICAgICAgIGJ5IHByb2dyYW0gbG9naWMKLSAgICogICAgICBwYXJlbiAgICAwICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICByZWcgICAgICBwcmVzZW50ICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKLSAgICoKLSAgICogb3V0OiBtb2RlICAgICA1K0AKLSAgICogICAgICByZWcgICAgICBwcmVzZW50Ci0gICAqICAgICAgbGVuICAgICAgJyAnICAgICAgICAgICAgICAgZW5mb3JjZSBubyBsZW5ndGgKLSAgICogICAgICBleHAgICAgICAiIiAgICAgICAgICAgICAgICBlbmZvcmNlIGVtcHR5IGV4cHJlc3Npb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbCAgICAgICAgICB3YXJuIGlmIHNhbWUgYXMgcmVnCi0gICAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmICFwYXJlbiAmJiByZWcgPj0gMCkKLSAgICB7Ci0gICAgICBpZiAobGVuICE9ICcgJykKLQllcnIgPSBfKCJsZW5ndGggbm90IG5lZWRlZCIpOwotICAgICAgZWxzZSBpZiAoYXQpCi0JewotCSAgZXJyID0gIiAiOwkJLyogd2luICovCi0JICBtb2RlID0gNjsJCS8qIEBSbiAqLwotCX0KLSAgICAgIGVsc2UgaWYgKG5keCA+PSAwKQotCWVyciA9IF8oImNhbid0IFtdaW5kZXggYSByZWdpc3RlciwgYmVjYXVzZSBpdCBoYXMgbm8gYWRkcmVzcyIpOwotICAgICAgZWxzZSBpZiAoYWNjZXNzX21vZGUgPT0gJ2EnKQotCWVyciA9IF8oImEgcmVnaXN0ZXIgaGFzIG5vIGFkZHJlc3MiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICogSWRlYSBoZXJlIGlzIHRvIGRldGVjdCBmcm9tIGxlbmd0aCBvZiBkYXR1bQotCSAgICogYW5kIGZyb20gcmVnaXN0ZXIgbnVtYmVyIGlmIHdlIHdpbGwgdG91Y2ggUEMuCi0JICAgKiBXYXJuIGlmIHdlIGRvLgotCSAgICogdm9wX25ieXRlcyBpcyBudW1iZXIgb2YgYnl0ZXMgaW4gb3BlcmFuZC4KLQkgICAqIENvbXB1dGUgaGlnaGVzdCBieXRlIGFmZmVjdGVkLCBjb21wYXJlIHRvIFBDMC4KLQkgICAqLwotCSAgaWYgKCh2b3BQLT52b3BfbmJ5dGVzICsgcmVnICogNCkgPiA2MCkKLQkgICAgd3JuID0gXygiUEMgcGFydCBvZiBvcGVyYW5kIHVucHJlZGljdGFibGUiKTsKLQkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLwotCSAgbW9kZSA9IDU7CQkvKiBSbiAqLwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIElmICEqZXJyLCAgICAgICAgc2lnbiAgPT0gMAotICAgKiAgICAgICAgICAgICAgICAgIGhhc2ggID09IDAKLSAgICogICAgICAgICAgICAgICAgICBwYXJlbiA9PSAxICBPUiByZWc9PS0xCi0gICAqLwotDAotICAvKgotICAgKiBSZXN0IG9mIGNhc2VzIGZpdCBpbnRvIG9uZSBidW5jaC4KLSAgICoKLSAgICogaW46ICBhdCAgICAgICBvcHRpb25hbAotICAgKiAgICAgIGxlbiAgICAgICcgJyBvciAnYicgb3IgJ3cnIG9yICdsJwotICAgKiAgICAgIGhhc2ggICAgIDAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYwotICAgKiAgICAgIHA6cSAgICAgIGV4cGVjdGVkICAgICAgICAgIChlbXB0eSBpcyBub3QgYW4gZXJyb3IpCi0gICAqICAgICAgc2lnbiAgICAgMCAgICAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYwotICAgKiAgICAgIHBhcmVuICAgIG9wdGlvbmFsCi0gICAqICAgICAgcmVnICAgICAgb3B0aW9uYWwKLSAgICogICAgICBuZHggICAgICBvcHRpb25hbAotICAgKgotICAgKiBvdXQ6IG1vZGUgICAgIDEwICsgQCArIGxlbgotICAgKiAgICAgIHJlZyAgICAgIG9wdGlvbmFsCi0gICAqICAgICAgbGVuICAgICAgJyAnIG9yICdiJyBvciAndycgb3IgJ2wnCi0gICAqICAgICAgZXhwICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmUgZW1wdHkKLSAgICogICAgICBuZHggICAgICBvcHRpb25hbCAgICAgICAgICB3YXJuIGlmIHNhbWUgYXMgcmVnCi0gICAqLwotICBpZiAoIWVyciB8fCAhKmVycikKLSAgICB7Ci0gICAgICBlcnIgPSAiICI7CQkvKiB3aW4gKGFsd2F5cykgKi8KLSAgICAgIG1vZGUgPSAxMCArIChhdCA/IDEgOiAwKTsKLSAgICAgIHN3aXRjaCAobGVuKQotCXsKLQljYXNlICdsJzoKLQkgIG1vZGUgKz0gMjsKLQljYXNlICd3JzoKLQkgIG1vZGUgKz0gMjsKLQljYXNlICcgJzoJCS8qIGFzc3VtZWQgQl4gdW50aWwgb3VyIGNhbGxlciBjaGFuZ2VzIGl0ICovCi0JY2FzZSAnYic6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIGhlcmUgd2l0aCBjb21wbGV0ZWx5IHNwZWNpZmllZCAgICAgbW9kZQotICAgKgkJCQkJbGVuCi0gICAqCQkJCQlyZWcKLSAgICoJCQkJCWV4cHJlc3Npb24gICBwLHEKLSAgICoJCQkJCW5keAotICAgKi8KLQotICBpZiAoKmVyciA9PSAnICcpCi0gICAgZXJyID0gMDsJCQkvKiAiICIgaXMgbm8gbG9uZ2VyIGFuIGVycm9yICovCi0KLSAgdm9wUC0+dm9wX21vZGUgPSBtb2RlOwotICB2b3BQLT52b3BfcmVnID0gcmVnOwotICB2b3BQLT52b3Bfc2hvcnQgPSBsZW47Ci0gIHZvcFAtPnZvcF9leHByX2JlZ2luID0gcDsKLSAgdm9wUC0+dm9wX2V4cHJfZW5kID0gcTsKLSAgdm9wUC0+dm9wX25keCA9IG5keDsKLSAgdm9wUC0+dm9wX2Vycm9yID0gZXJyOwotICB2b3BQLT52b3Bfd2FybiA9IHdybjsKLX0KLQwKLS8qCi0KLSAgU3VtbWFyeSBvZiB2aXBfb3Agb3V0cHV0cy4KLQotICBtb2RlCXJlZwlsZW4JbmR4Ci0gIChSbikgPT4gQFJuCi0gIHtAfVJuCQkJNStACW4JJyAnCW9wdGlvbmFsCi0gIGJyYW5jaCBvcGVyYW5kCQkwCS0xCScgJwktMQotICBTXiNmb28JCQkwCS0xCSdzJwktMQotICAtKFJuKQkJCTcJbgknICcJb3B0aW9uYWwKLSAge0B9KFJuKSsJCTgrQAluCScgJwlvcHRpb25hbAotICB7QH0jZm9vLCBubyBTXgkJOCtACVBDCSIgaSIJb3B0aW9uYWwKLSAge0B9e3FefXsoUm4pfQkJMTArQCtxCW9wdGlvbgkiIGJ3bCIJb3B0aW9uYWwKLQotICAqLwotDAotI2lmZGVmIFRFU1QJCQkvKiAjRGVmaW5lIHRvIHVzZSB0aGlzIHRlc3RiZWQuICovCi0KLS8qCi0gKiBGb2xsb3dzIGEgdGVzdCBwcm9ncmFtIGZvciB0aGlzIGZ1bmN0aW9uLgotICogV2UgZGVjbGFyZSBhcnJheXMgbm9uLWxvY2FsIGluIGNhc2Ugc29tZSBvZiBvdXIgdGlueS1taW5kZWQgbWFjaGluZXMKLSAqIGRlZmF1bHQgdG8gc21hbGwgc3RhY2tzLiBBbHNvLCBoZWxwcyB3aXRoIHNvbWUgZGVidWdnZXJzLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1jaGFyIGFuc3dlclsxMDBdOwkJLyogaHVtYW4gdHlwZXMgaW50byBoZXJlICovCi1jaGFyICpwOwkJCS8qICAqLwotY2hhciAqbXllcnI7Ci1jaGFyICpteXdybjsKLWNoYXIgKm15YnVnOwotY2hhciBteWFjY2VzczsKLWNoYXIgbXl3aWR0aDsKLWNoYXIgbXltb2RlOwotY2hhciBteXJlZzsKLWNoYXIgbXlsZW47Ci1jaGFyICpteWxlZnQ7Ci1jaGFyICpteXJpZ2h0OwotY2hhciBteW5keDsKLWludCBteV9vcGVyYW5kX2xlbmd0aDsKLWNoYXIgbXlfaW1tZWRpYXRlWzIwMF07Ci1jaGFyIG15X2luZGlyZWN0WzIwMF07Ci1jaGFyIG15X2Rpc3BsZW5bMjAwXTsKLQotbWFpbiAoKQotewotICBwcmludGYgKCJlbnRlciBpbW1lZGlhdGUgc3ltYm9scyBlZyBlbnRlciAjICAgIik7Ci0gIGdldHMgKG15X2ltbWVkaWF0ZSk7Ci0gIHByaW50ZiAoImVudGVyIGluZGlyZWN0IHN5bWJvbHMgIGVnIGVudGVyIEAgICAiKTsKLSAgZ2V0cyAobXlfaW5kaXJlY3QpOwotICBwcmludGYgKCJlbnRlciBkaXNwbGVuIHN5bWJvbHMgICBlZyBlbnRlciBeICAgIik7Ci0gIGdldHMgKG15X2Rpc3BsZW4pOwotICB2aXBfb3BfZGVmYXVsdHMgKG15X2ltbWVkaWF0ZSwgbXlfaW5kaXJlY3QsIG15X2Rpc3BsZW4pOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHByaW50ZiAoImFjY2Vzcyx3aWR0aCAoZWcgJ2FiJyBvciAnd2gnKSBbZW1wdHkgbGluZSB0byBxdWl0XSA6ICAiKTsKLSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLSAgICAgIGdldHMgKGFuc3dlcik7Ci0gICAgICBpZiAoIWFuc3dlclswXSkKLQlleGl0IChFWElUX1NVQ0NFU1MpOwotICAgICAgbXlhY2Nlc3MgPSBhbnN3ZXJbMF07Ci0gICAgICBteXdpZHRoID0gYW5zd2VyWzFdOwotICAgICAgc3dpdGNoIChteXdpZHRoKQotCXsKLQljYXNlICdiJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSA4OwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDQ7Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMTY7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMzI7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gNDsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAxNjsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSA4OwotCSAgYnJlYWs7Ci0JY2FzZSAndyc6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDI7Ci0JICBicmVhazsKLQljYXNlICchJzoKLQljYXNlICc/JzoKLQljYXNlICctJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMjsKLQkgIHByaW50ZiAoIkkgZG4ndCB1bmRlcnN0YW5kIGFjY2VzcyB3aWR0aCAlY1xuIiwgbXl3aWR0aCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwcmludGYgKCJWQVggYXNzZW1ibGVyIGluc3RydWN0aW9uIG9wZXJhbmQ6ICIpOwotICAgICAgZmZsdXNoIChzdGRvdXQpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIG15YnVnID0gdmlwX29wIChhbnN3ZXIsIG15YWNjZXNzLCBteXdpZHRoLCBteV9vcGVyYW5kX2xlbmd0aCwKLQkJICAgICAgJm15bW9kZSwgJm15cmVnLCAmbXlsZW4sICZteWxlZnQsICZteXJpZ2h0LCAmbXluZHgsCi0JCSAgICAgICZteWVyciwgJm15d3JuKTsKLSAgICAgIGlmICgqbXllcnIpCi0JewotCSAgcHJpbnRmICgiZXJyb3I6IFwiJXNcIlxuIiwgbXllcnIpOwotCSAgaWYgKCpteWJ1ZykKLQkgICAgcHJpbnRmICgiIGJ1ZzogXCIlc1wiXG4iLCBteWJ1Zyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgqbXl3cm4pCi0JICAgIHByaW50ZiAoIndhcm5pbmc6IFwiJXNcIlxuIiwgbXl3cm4pOwotCSAgbXVtYmxlICgibW9kZSIsIG15bW9kZSk7Ci0JICBtdW1ibGUgKCJyZWdpc3RlciIsIG15cmVnKTsKLQkgIG11bWJsZSAoImluZGV4IiwgbXluZHgpOwotCSAgcHJpbnRmICgid2lkdGg6JyVjJyAgIiwgbXlsZW4pOwotCSAgcHJpbnRmICgiZXhwcmVzc2lvbjogXCIiKTsKLQkgIHdoaWxlIChteWxlZnQgPD0gbXlyaWdodCkKLQkgICAgcHV0Y2hhciAoKm15bGVmdCsrKTsKLQkgIHByaW50ZiAoIlwiXG4iKTsKLQl9Ci0gICAgfQotfQotCi1tdW1ibGUgKHRleHQsIHZhbHVlKQotICAgICBjaGFyICp0ZXh0OwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHByaW50ZiAoIiVzOiIsIHRleHQpOwotICBpZiAodmFsdWUgPj0gMCkKLSAgICBwcmludGYgKCIleHgiLCB2YWx1ZSk7Ci0gIGVsc2UKLSAgICBwcmludGYgKCJBQlNFTlQiKTsKLSAgcHJpbnRmICgiICAiKTsKLX0KLQotI2VuZGlmIC8qIGlmZGVmIFRFU1QgKi8KLQotLyogZW5kOiB2aXBfb3AuYyAqLwotCi1jb25zdCBpbnQgbWRfc2hvcnRfanVtcF9zaXplID0gMzsKLWNvbnN0IGludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDY7Ci1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIC8qIFRoaXMgZm9ybWVyIGNhbGN1bGF0aW9uIHdhcyBvZmYgYnkgdHdvOgotICAgICAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAxKTsKLSAgICAgV2UgbmVlZCB0byBhY2NvdW50IGZvciB0aGUgb25lIGJ5dGUgaW5zdHJ1Y3Rpb24gYW5kIGFsc28gaXRzCi0gICAgIHR3byBieXRlIG9wZXJhbmQuICAqLwotICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDEgKyAyKTsKLSAgKnB0cisrID0gVkFYX0JSVzsJCS8qIGJyYW5jaCB3aXRoIHdvcmQgKDE2IGJpdCkgb2Zmc2V0ICovCi0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCBvZmZzZXQsIDIpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gU19HRVRfVkFMVUUgKHRvX3N5bWJvbCk7Ci0gICpwdHIrKyA9IFZBWF9KTVA7CQkvKiBhcmJpdHJhcnkganVtcCAqLwotICAqcHRyKysgPSBWQVhfQUJTT0xVVEVfTU9ERTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIG9mZnNldCwgNCk7Ci0gIGZpeF9uZXcgKGZyYWcsIHB0ciAtIGZyYWctPmZyX2xpdGVyYWwsIDQsIHRvX3N5bWJvbCwgKGxvbmcpIDAsIDAsIE5PX1JFTE9DKTsKLX0KLQwKLSNpZmRlZiBPQkpfVk1TCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiZDpTVHQ6VisxaDpIdjo6IjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiZDpTVHQ6ViI7Ci0jZW5kaWYKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdTJzoKLSAgICAgIGFzX3dhcm4gKF8oIlNZTUJPTCBUQUJMRSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgYXNfd2FybiAoXygiVE9LRU4gVFJBQ0Ugbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIGFzX3dhcm4gKF8oIkRpc3BsYWNlbWVudCBsZW5ndGggJXMgaWdub3JlZCEiKSwgYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICBhc193YXJuIChfKCJJIGRvbid0IG5lZWQgb3IgdXNlIHRlbXAuIGZpbGUgXCIlc1wiLiIpLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgdXNlIGFuIGludGVycGFzcyBmaWxlISAtViBpZ25vcmVkIikpOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfVk1TCi0gICAgY2FzZSAnKyc6CQkJLyogRm9yIGcrKy4gIEhhc2ggYW55IG5hbWUgPiAzMSBjaGFycyBsb25nLiAqLwotICAgICAgZmxhZ19oYXNoX2xvbmdfbmFtZXMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzoJCQkvKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotICAgICAgZmxhZ19vbmUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdIJzoJCQkvKiBTaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uICovCi0gICAgICBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoJCQkvKiBObyBoYXNoaW5nIG9mIG1peGVkLWNhc2UgbmFtZXMgKi8KLSAgICAgIHsKLQlleHRlcm4gY2hhciB2bXNfbmFtZV9tYXBwaW5nOwotCXZtc19uYW1lX21hcHBpbmcgPSBhdG9pIChhcmcpOwotCWZsYWdfbm9faGFzaF9taXhlZF9jYXNlID0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndic6Ci0gICAgICB7Ci0JZXh0ZXJuIGNoYXIgKmNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nOwotCWlmICghYXJnIHx8ICEqYXJnIHx8IGFjY2VzcyAoYXJnLCAwKSA9PSAwKQotCSAgcmV0dXJuIDA7CQkvKiBoYXZlIGNhbGxlciBzaG93IHRoZSBhc3NlbWJsZXIgdmVyc2lvbiAqLwotCWNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nID0gYXJnOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotVkFYIG9wdGlvbnM6XG5cCi0tZCBMRU5HVEgJCWlnbm9yZWRcblwKLS1KCQkJaWdub3JlZFxuXAotLVMJCQlpZ25vcmVkXG5cCi0tdCBGSUxFCQkJaWdub3JlZFxuXAotLVQJCQlpZ25vcmVkXG5cCi0tVgkJCWlnbm9yZWRcbiIpKTsKLSNpZmRlZiBPQkpfVk1TCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVk1TIG9wdGlvbnM6XG5cCi0tKwkJCWhhc2ggZW5jb2RlIG5hbWVzIGxvbmdlciB0aGFuIDMxIGNoYXJhY3RlcnNcblwKLS0xCQkJYGNvbnN0JyBoYW5kbGluZyBjb21wYXRpYmxlIHdpdGggZ2NjIDEueFxuXAotLUgJCQlzaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uXG5cCi0taCBOVU0JCQlkb24ndCBoYXNoIG1peGVkLWNhc2UgbmFtZXMsIGFuZCBhZGp1c3QgY2FzZTpcblwKLQkJCTAgPSB1cHBlciwgMiA9IGxvd2VyLCAzID0gcHJlc2VydmUgY2FzZVxuXAotLXZcIlZFUlNJT05cIgkJY29kZSBiZWluZyBhc3NlbWJsZWQgd2FzIHByb2R1Y2VkIGJ5IGNvbXBpbGVyIFwiVkVSU0lPTlwiXG4iKSk7Ci0jZW5kaWYKLX0KLQwKLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIHZheCwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCi0gICBpdHMgc2l6ZS4gKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTikgKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBlbmQgb2YgdGMtdmF4LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdmF4LmggYi9nYXMvY29uZmlnL3RjLXZheC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjc5MWY3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdmF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiB0Yy12YXguaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtdmF4LmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTMsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX1ZBWCAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIE5PX1JFTE9DIDAKLSNkZWZpbmUgTk9QX09QQ09ERSAweDAxCi0KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWxvbmcgbWRfY2hhcnNfdG9fbnVtYmVyIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy12YXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy13NjUuYyBiL2dhcy9jb25maWcvdGMtdzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1N2ViMGYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy13NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMTkgKzAsMCBAQAotLyogdGMtdzY1LmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIFc2NTgxNgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgIHNhY0BjeWdudXMuY29tCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgIi4uL29wY29kZXMvdzY1LW9wYy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEiOwotQ09OU1QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIhIyI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICovCi0KLSNkZWZpbmUgT1BfQkNDCTB4OTAKLSNkZWZpbmUgT1BfQkNTCTB4QjAKLSNkZWZpbmUgT1BfQkVRCTB4RjAKLSNkZWZpbmUgT1BfQk1JCTB4MzAKLSNkZWZpbmUgT1BfQk5FCTB4RDAKLSNkZWZpbmUgT1BfQlBMCTB4MTAKLSNkZWZpbmUgT1BfQlJBCTB4ODAKLSNkZWZpbmUgT1BfQlJMCTB4ODIKLSNkZWZpbmUgT1BfQlZDCTB4NTAKLSNkZWZpbmUgT1BfQlZTCTB4NzAKLQotdm9pZCBzX2xvbmdhICgpOwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJpbnQiLCBjb25zLCAyfSwKLSAgeyJ3b3JkIiwgY29ucywgMn0sCi0gIHsibG9uZ2EiLCBzX2xvbmdhLCAwfSwKLSAgeyJsb25naSIsIHNfbG9uZ2EsIDF9LAotICB7MCwgMCwgMH0KLX07Ci0KLQotdm9pZCBjb25zICgpOwotdm9pZCBzX2FsaWduX2J5dGVzICgpOwotCi0KLS8qaW50IG1kX3JlbG9jX3NpemU7ICovCi0KLXN0YXRpYyBpbnQgcmVsYXg7CQkvKiBzZXQgaWYgLXJlbGF4IHNlZW4gKi8KLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi0KLWludCBNOwkJCQkvKiBNIGZsYWcgKi8KLWludCBYOwkJCQkvKiBYIGZsYWcgKi8KLQotCi0KLQotI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKLSNkZWZpbmUgRU5DT0RFX1JFTEFYKHdoYXQsbGVuZ3RoKSAoKCh3aGF0KSA8PCAyKSArIChsZW5ndGgpKQotCi0jZGVmaW5lIEdFVF9XSEFUKHgpICgoeD4+MikpCi0KLSNkZWZpbmUgQllURV9ESVNQIDEKLSNkZWZpbmUgV09SRF9ESVNQIDIKLSNkZWZpbmUgVU5ERUZfQllURV9ESVNQIDAKLSNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDMKLQotI2RlZmluZSBDT05EX0JSQU5DSCAJMQotI2RlZmluZSBVTkNPTkRfQlJBTkNIICAgMgotI2RlZmluZSBFTkQgCTMKLQotI2RlZmluZSBCWVRFX0YgMTI3CQkvKiBIb3cgZmFyIHdlIGNhbiBicmFuY2ggZm9yd2FyZHMgKi8KLSNkZWZpbmUgQllURV9CIC0xMjYJCS8qIEhvdyBmYXIgd2UgY2FuIGJyYW5jaCBiYWNrd2FyZHMgKi8KLSNkZWZpbmUgV09SRF9GIDMyNzY3Ci0jZGVmaW5lIFdPUkRfQiAzMjc2OAotCi1yZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtDIChFTkQsIDApXTsKLQotLyoKLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCi0gKi8KLQotCi12b2lkCi1zX2xvbmdhICh4bW9kZSkKLXsKLSAgaW50ICpwID0geG1vZGUgPyAmWCA6ICZNOwotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvbiIsIDIpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgICAqcCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvZmYiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgICpwID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygibmVlZCBvbiBvciBvZmYuIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgcmVsYXhfdHlwZVMgKnRhYmxlOwotICBzdHJ1Y3Qgb3BpbmZvICpvcGNvZGU7Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IG9wdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcGNvZGUtPm5hbWUpKQotCXsKLQkgIHByZXZfbmFtZSA9IG9wY29kZS0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE1ha2UgYWxsIHRoZSBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSBwb2ludCB0byB0aGUgc2FtZQotCSAgICAgc3RyaW5nICovCi0JICBvcGNvZGUtPm5hbWUgPSBwcmV2X25hbWU7Ci0JfQotICAgIH0KLQotCi0gIC8qIEluaXRpYWxpemUgdGhlIHJlbGF4IHRhYmxlLiAgV2UgdXNlIGEgbG9jYWwgdmFyaWFibGUgdG8gYXZvaWQKLSAgICAgd2FybmluZ3MgYWJvdXQgbW9kaWZ5aW5nIGEgc3VwcG9zZWRseSBjb25zdCBkYXRhIHN0cnVjdHVyZS4gICovCi0gIHRhYmxlID0gKHJlbGF4X3R5cGVTICopIG1kX3JlbGF4X3RhYmxlOwotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBCWVRFX0I7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMjsKLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCk7Ci0KLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOwotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCA9IDU7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCA9IDI7Ci0gIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoVU5DT05EX0JSQU5DSCwgV09SRF9ESVNQKTsKLQotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfZm9yd2FyZCA9IFdPUkRfRjsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gMzsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X21vcmUgPSAwOwotCi0gIGZsYWdfc2lnbmVkX292ZXJmbG93X29rID0gMTsKLX0KLQotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTE7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KLQotCi1zdGF0aWMgc3ltYm9sUyAqCi1kb3QgKCkKLXsKLSAgY29uc3QgY2hhciAqZmFrZTsKLQotICAvKiBKRjogJy4nIGlzIHBzZXVkbyBzeW1ib2wgd2l0aCB2YWx1ZSBvZiBjdXJyZW50IGxvY2F0aW9uCi0gICAgIGluIGN1cnJlbnQgc2VnbWVudC4gICovCi0gIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7Ci0gIHJldHVybiBzeW1ib2xfbmV3IChmYWtlLAotCQkgICAgIG5vd19zZWcsCi0JCSAgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkgICAgIGZyYWdfbm93KTsKLQotfQotCi1pbnQgZXhwcl9zaXplOwotaW50IGV4cHJfc2hpZnQ7Ci1pbnQgdGNfY29uc19yZWxvYzsKLXZvaWQKLXc2NV9leHByZXNzaW9uIChkZXN0LCBieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmRlc3Q7Ci0gICAgIHVuc2lnbmVkIGludCBieXRlczsKLXsKLSAgZXhwcl9zaXplID0gMDsKLSAgZXhwcl9zaGlmdCA9IDA7Ci0gIHRjX2NvbnNfcmVsb2MgPSAwOwotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzwnKQotICAgIHsKLSAgICAgIGV4cHJfc2l6ZSA9IDE7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJz4nKQotICAgIHsKLSAgICAgIGV4cHJfc2hpZnQgPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdeJykKLSAgICB7Ci0gICAgICBleHByX3NoaWZ0ID0gMjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBleHByICgwLCBkZXN0KTsKLX0KLQotaW50IGFtb2RlOwotc3RhdGljCi1jaGFyICoKLXBhcnNlX2V4cCAocywgYnl0ZXMpCi0gICAgIGNoYXIgKnM7Ci0gICAgIGludCBieXRlczsKLXsKLSAgY2hhciAqc2F2ZTsKLSAgY2hhciAqbmV3OwotCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIHc2NV9leHByZXNzaW9uICgmaW1tZWRpYXRlLCBieXRlcyk7Ci0gIGlmIChpbW1lZGlhdGUuWF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi0KLXN0YXRpYwotY2hhciAqCi1nZXRfb3BlcmFuZHMgKGluZm8sIHB0cikKLSAgICAgc3RydWN0IG9waW5mbyAqaW5mbzsKLSAgICAgY2hhciAqcHRyOwotewotICByZWdpc3RlciBpbnQgb3ZlcnJpZGVfbGVuID0gMDsKLSAgcmVnaXN0ZXIgaW50IGJ5dGVzID0gMDsKLSAgd2hpbGUgKCpwdHIgPT0gJyAnKQotICAgIHB0cisrOwotCi0gIGlmIChwdHJbMF0gPT0gJyMnKQotICAgIHsKLSAgICAgIHB0cisrOwotICAgICAgc3dpdGNoIChpbmZvLT5hbW9kZSkKLQl7Ci0JY2FzZSBBRERSX0lNTVRPSToKLQkgIGJ5dGVzID0gWCA/IDEgOiAyOwotCSAgYW1vZGUgPSBBRERSX0lNTVRPSTsKLQkgIGJyZWFrOwotCWNhc2UgQUREUl9JTU1UT0E6Ci0JICBieXRlcyA9IE0gPyAxIDogMjsKLQkgIGFtb2RlID0gQUREUl9JTU1UT0E7Ci0JICBicmVhazsKLQljYXNlIEFERFJfSU1NQ09QOgotCSAgYnl0ZXMgPSAxOwotCSAgYW1vZGUgPSBBRERSX0lNTUNPUDsKLQkgIGJyZWFrOwotCWNhc2UgQUREUl9ESVI6Ci0JICBieXRlcyA9IDI7Ci0JICBhbW9kZSA9IEFERFJfQUJTOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHRyID0gcGFyc2VfZXhwIChwdHIpOwotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICchJykKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotICAgICAgaWYgKHB0clswXSA9PSAnLCcpCi0JewotCSAgaWYgKHB0clsxXSA9PSAneScpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfQUJTX0lEWF9ZOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgICBwdHIgKz0gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAocHRyWzFdID09ICd4JykKLQkgICAgewotCSAgICAgIGFtb2RlID0gQUREUl9BQlNfSURYX1g7Ci0JICAgICAgYnl0ZXMgPSAyOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBhZnRlciA8ZXhwIikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFtb2RlID0gQUREUl9BQlM7Ci0JICBieXRlcyA9IDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICc+JykKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotICAgICAgaWYgKHB0clswXSA9PSAnLCcgJiYgcHRyWzFdID09ICd4JykKLQl7Ci0JICBhbW9kZSA9IEFERFJfQUJTX0xPTkdfSURYX1g7Ci0JICBieXRlcyA9IDM7Ci0JICBwdHIgKz0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYW1vZGUgPSBBRERSX0FCU19MT05HOwotCSAgYnl0ZXMgPSAzOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHB0clswXSA9PSAnPCcpCi0gICAgewotICAgICAgcHRyID0gcGFyc2VfZXhwIChwdHIgKyAxKTsKLSAgICAgIGlmIChwdHJbMF0gPT0gJywnKQotCXsKLQkgIGlmIChwdHJbMV0gPT0gJ3knKQotCSAgICB7Ci0JICAgICAgYW1vZGUgPSBBRERSX0RJUl9JRFhfWTsKLQkgICAgICBwdHIgKz0gMjsKLQkgICAgICBieXRlcyA9IDI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHB0clsxXSA9PSAneCcpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfRElSX0lEWF9YOwotCSAgICAgIHB0ciArPSAyOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgYWZ0ZXIgPGV4cCIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhbW9kZSA9IEFERFJfRElSOwotCSAgYnl0ZXMgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHB0clswXSA9PSAnYScpCi0gICAgewotICAgICAgYW1vZGUgPSBBRERSX0FDQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHB0clswXSA9PSAnKCcpCi0gICAgewotICAgICAgLyogTG9vayBmb3IgKGV4cCkseQotCSAoPGV4cCkseQotCSAoZXhwLHgpCi0JICg8ZXhwLHgpCi0JIChleHApCi0JICghZXhwKQotCSAoZXhwKQotCSAoPGV4cCkKLQkgKGV4cCx4KQotCSAoIWV4cCx4KQotCSAoZXhwLHMpCi0JIChleHAscykseSAqLwotCi0gICAgICBwdHIrKzsKLSAgICAgIGlmIChwdHJbMF0gPT0gJzwnKQotCXsKLQkgIG92ZXJyaWRlX2xlbiA9IDE7Ci0JICBwdHIrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJyEnKQotCXsKLQkgIG92ZXJyaWRlX2xlbiA9IDI7Ci0JICBwdHIrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJz4nKQotCXsKLQkgIG92ZXJyaWRlX2xlbiA9IDM7Ci0JICBwdHIrKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3ZlcnJpZGVfbGVuID0gMDsKLQl9Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0cik7Ci0KLSAgICAgIGlmIChwdHJbMF0gPT0gJywnKQotCXsKLQkgIHB0cisrOwotCSAgaWYgKHB0clswXSA9PSAneCcgJiYgcHRyWzFdID09ICcpJykKLQkgICAgewotCSAgICAgIHB0ciArPSAyOwotCi0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0RJUl9JRFhfSU5EX1g7Ci0JCSAgYnl0ZXMgPSAyOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0FCU19JTkRfSURYOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwdHJbMF0gPT0gJ3MnICYmIHB0clsxXSA9PSAnKScgJiYgcHRyWzJdID09ICcsJyAmJiBwdHJbM10gPT0gJ3knKQotCSAgICB7Ci0JICAgICAgYW1vZGUgPSBBRERSX1NUQUNLX1JFTF9JTkRYX0lEWDsKLQkgICAgICBieXRlcyA9IDE7Ci0JICAgICAgcHRyICs9IDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJyknKQotCXsKLQkgIGlmIChwdHJbMV0gPT0gJywnICYmIHB0clsyXSA9PSAneScpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfRElSX0lORF9JRFhfWTsKLQkgICAgICBwdHIgKz0gMzsKLQkgICAgICBieXRlcyA9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChvdmVycmlkZV9sZW4gPT0gMSkKLQkJewotCQkgIGFtb2RlID0gQUREUl9ESVJfSU5EOwotCQkgIGJ5dGVzID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFtb2RlID0gQUREUl9BQlNfSU5EOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICAgIHB0cisrOwotCi0JICAgIH0KLQl9Ci0KLSAgICB9Ci0gIGVsc2UgaWYgKHB0clswXSA9PSAnWycpCi0gICAgewotICAgICAgcHRyID0gcGFyc2VfZXhwIChwdHIgKyAxKTsKLSAgICAgIGlmIChwdHJbMF0gPT0gJ10nKQotCXsKLQkgIHB0cisrOwotCSAgaWYgKHB0clswXSA9PSAnLCcgJiYgcHRyWzFdID09ICd5JykKLQkgICAgewotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBhbW9kZSA9IEFERFJfRElSX0lORF9JRFhfWV9MT05HOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaW5mby0+Y29kZSA9PSBPX2ptcCkgCi0JCXsKLQkJYnl0ZXMgPSAyOwotCQlhbW9kZSA9IEFERFJfQUJTX0lORF9MT05HOwotCSAgICAgIH0gCi0JICAgICAgZWxzZSAKLXsKLQkJYnl0ZXMgPSAxOwotCSAgICAgIAotCQlhbW9kZSA9IEFERFJfRElSX0lORF9MT05HOwotCSAgICAgIH0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciwgMik7Ci0gICAgICBpZiAocHRyWzBdID09ICcsJykKLQl7Ci0JICBpZiAocHRyWzFdID09ICd5JykKLQkgICAgewotCSAgICAgIGlmIChvdmVycmlkZV9sZW4gPT0gMSkKLQkJewotCQkgIGJ5dGVzID0gMTsKLQkJICBhbW9kZSA9IEFERFJfRElSX0lEWF9ZOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0FCU19JRFhfWTsKLQkJICBieXRlcyA9IDI7Ci0JCX0KLQkgICAgICBwdHIgKz0gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAocHRyWzFdID09ICd4JykKLQkgICAgewotCSAgICAgIGlmIChvdmVycmlkZV9sZW4gPT0gMSkKLQkJewotCQkgIGFtb2RlID0gQUREUl9ESVJfSURYX1g7Ci0JCSAgYnl0ZXMgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0FCU19JRFhfWDsKLQkJICBieXRlcyA9IDI7Ci0JCX0KLQkgICAgICBwdHIgKz0gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAocHRyWzFdID09ICdzJykKLQkgICAgewotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBhbW9kZSA9IEFERFJfU1RBQ0tfUkVMOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBieXRlcyA9IDE7Ci0JICAgICAgaW1tZWRpYXRlMSA9IGltbWVkaWF0ZTsKLQkgICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotCSAgICAgIGFtb2RlID0gQUREUl9CTE9DS19NT1ZFOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoaW5mby0+YW1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSBBRERSX1BDX1JFTDoKLQkgICAgICBhbW9kZSA9IEFERFJfUENfUkVMOwotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBRERSX1BDX1JFTF9MT05HOgotCSAgICAgIGFtb2RlID0gQUREUl9QQ19SRUxfTE9ORzsKLQkgICAgICBieXRlcyA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0RJUjsKLQkJICBieXRlcyA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvdmVycmlkZV9sZW4gPT0gMykKLQkJewotCQkgIGJ5dGVzID0gMzsKLQkJICBhbW9kZSA9IEFERFJfQUJTX0xPTkc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfQUJTOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBzd2l0Y2ggKGJ5dGVzKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBzd2l0Y2ggKGV4cHJfc2hpZnQpCi0JewotCWNhc2UgMDoKLQkgIGlmIChhbW9kZSA9PSBBRERSX0RJUikKLQl0Y19jb25zX3JlbG9jID0gUl9XNjVfRFA7Ci0JICBlbHNlCi10Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTODsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIHRjX2NvbnNfcmVsb2MgPSBSX1c2NV9BQlM4Uzg7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTOFMxNjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHN3aXRjaCAoZXhwcl9zaGlmdCkKLQl7Ci0JY2FzZSAwOgotCSAgdGNfY29uc19yZWxvYyA9IFJfVzY1X0FCUzE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgdGNfY29uc19yZWxvYyA9IFJfVzY1X0FCUzE2Uzg7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTMTZTMTY7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi0vKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKLSAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKLSAgIHByb3ZpZGVkCi0gKi8KLQotc3RhdGljCi1zdHJ1Y3Qgb3BpbmZvICoKLWdldF9zcGVjaWZpYyAob3Bjb2RlKQotICAgICBzdHJ1Y3Qgb3BpbmZvICpvcGNvZGU7Ci17Ci0gIGludCBvY29kZSA9IG9wY29kZS0+Y29kZTsKLQotICBmb3IgKDsgb3Bjb2RlLT5jb2RlID09IG9jb2RlOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAob3Bjb2RlLT5hbW9kZSA9PSBhbW9kZSkKLQlyZXR1cm4gb3Bjb2RlOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKLSAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7Ci0gICAgIGludCBsb3c7Ci0gICAgIGludCBoaWdoOwotewotICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCi0gICAgewotICAgICAgYXNfYmFkICgib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCIsIGxvdywgaGlnaCk7Ci0gICAgfQotICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotfQotCi0KLXN0YXRpYyBpbnQgbG9nMltdID0KLXswLCAwLCAxLCAwLCAyfTsKLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotc3RhdGljIHZvaWQKLWJ1aWxkX015dGVzIChvcGNvZGUpCi0gICAgIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKLXsKLSAgaW50IHNpemU7Ci0gIGludCB0eXBlOwotICBpbnQgcGNyZWw7Ci0gIGNoYXIgKm91dHB1dDsKLQotICBpZiAob3Bjb2RlLT5hbW9kZSA9PSBBRERSX0lNUExJRUQpCi0gICAgewotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wY29kZS0+YW1vZGUgPT0gQUREUl9QQ19SRUwpCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0gICAgICAvKiBUaGlzIGlzIGEgcmVsYXhhYmxlIGluc24sIHNvIHdlIGRvIHNvbWUgc3BlY2lhbCBoYW5kbGluZyAqLwotICAgICAgdHlwZSA9IG9wY29kZS0+dmFsID09IE9QX0JSQSA/IFVOQ09ORF9CUkFOQ0ggOiBDT05EX0JSQU5DSDsKLSAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCSBtZF9yZWxheF90YWJsZVtDICh0eXBlLCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoLAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKHR5cGUsIEJZVEVfRElTUCldLnJseF9sZW5ndGgsCi0JCQkgQyAodHlwZSwgVU5ERUZfQllURV9ESVNQKSwKLQkJCSBpbW1lZGlhdGUuWF9hZGRfc3ltYm9sLAotCQkJIGltbWVkaWF0ZS5YX2FkZF9udW1iZXIsCi0JCQkgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChvcGNvZGUtPmFtb2RlKQotCXsKLQkgIEdFVElORk8gKHNpemUsIHR5cGUsIHBjcmVsKTsKLQl9Ci0KLSAgICAgIC8qIElmIHNvbWV0aGluZyBzcGVjaWFsIHdhcyBkb25lIGluIHRoZQotCSBleHByZXNzaW9uIG1vZGlmeSB0aGUgcmVsb2MgdHlwZSAqLwotICAgICAgaWYgKHRjX2NvbnNfcmVsb2MpCi0JewotCSAgdHlwZSA9IHRjX2NvbnNfcmVsb2M7Ci0JfQotCi0KLQotICAgICAgLyogMSBieXRlIGZvciB0aGUgb3Bjb2RlICsgdGhlIGJ5dGVzIGZvciB0aGUgYWRkcm1vZGUgKi8KLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoc2l6ZSArIDEpOwotCi0gICAgICBpZiAob3Bjb2RlLT5hbW9kZSA9PSBBRERSX0JMT0NLX01PVkUpCi0JewotCSAgLyogVHdvIHJlbG9jcyBmb3IgdGhpcyBvbmUgKi8KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDEsCi0JCSAgICAgICAmaW1tZWRpYXRlLAotCQkgICAgICAgMCwKLQkJICAgICAgIFJfVzY1X0FCUzhTMTYpOwotCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICBvdXRwdXQgKyAyIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAxLAotCQkgICAgICAgJmltbWVkaWF0ZTEsCi0JCSAgICAgICAwLAotCQkgICAgICAgUl9XNjVfQUJTOFMxNik7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZSA+PSAwCi0JICAgICAgICYmIG9wY29kZS0+YW1vZGUgIT0gQUREUl9JTVBMSUVECi0JICAgICAgICYmIG9wY29kZS0+YW1vZGUgIT0gQUREUl9BQ0MKLQkgICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX1NUQUNLKQotCXsKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIHNpemUsCi0JCSAgICAgICAmaW1tZWRpYXRlLAotCQkgICAgICAgcGNyZWwsCi0JCSAgICAgICB0eXBlKTsKLQl9Ci0gICAgfQotICBvdXRwdXRbMF0gPSBvcGNvZGUtPnZhbDsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX3N0YXJ0OwotICB1bnNpZ25lZCBjaGFyICpvcF9lbmQ7Ci0gIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKLSAgY2hhciBuYW1lWzIwXTsKLSAgaW50IG5sZW4gPSAwOwotICBjaGFyICpwOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBhbGwgb3Bjb2RlcyBhcmUgdGhyZWUgbGV0dGVycyAqLwotICBuYW1lWzBdID0gc3RyWzBdOwotICBuYW1lWzFdID0gc3RyWzFdOwotICBuYW1lWzJdID0gc3RyWzJdOwotICBuYW1lWzNdID0gMDsKLQotICB0Y19jb25zX3JlbG9jID0gMDsKLSAgc3RyICs9IDM7Ci0gIG9wY29kZSA9IChzdHJ1Y3Qgb3BpbmZvICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChvcGNvZGUtPmFtb2RlICE9IEFERFJfSU1QTElFRAotICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX1NUQUNLKQotICAgIHsKLSAgICAgIGdldF9vcGVyYW5kcyAob3Bjb2RlLCBzdHIpOwotICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUpOwotICAgIH0KLQotICBpZiAob3Bjb2RlID09IDApCi0gICAgewotICAgICAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLQotCi0gICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMSk7Ci0KLSAgICAgIHdoZXJlWzBdID0gMHgwOwotICAgICAgd2hlcmVbMV0gPSAweDA7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVpbGRfTXl0ZXMgKG9wY29kZSk7Ci19Ci0KLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotc3ltYm9sUyAqCi1ERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAotICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1ERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX05UT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFAtLSksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsYSkKLSAgICBpbnQgYzsKLSAgICBjaGFyICphOwotCi17Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi10Y19Ob3V0X2ZpeF90b19jaGFycyAoKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfTm91dF9maXhfdG9fY2hhcnMgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi0vKgotY2FsbGVkIGFmdGVyIHJlbGF4aW5nLCBjaGFuZ2UgdGhlIGZyYWdzIHNvIHRoZXkga25vdyBob3cgYmlnIHRoZXkgYXJlCi0qLwotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgaW50IGRpc3Bfc2l6ZSA9IDA7Ci0gIGludCBpbnN0X3NpemUgPSAwOwotICB1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKToKLSAgICAgIGRpc3Bfc2l6ZSA9IDE7Ci0gICAgICBpbnN0X3NpemUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNvbmQgYnJhbmNoZXMgdG8gYSBrbm93biAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0gICAgY2FzZSBDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKToKLSAgICAgIHN3aXRjaCAoYnVmZmVyWzBdKQotCXsKLQljYXNlIE9QX0JDQzoKLQljYXNlIE9QX0JDUzoKLQljYXNlIE9QX0JFUToKLQljYXNlIE9QX0JNSToKLQljYXNlIE9QX0JORToKLQljYXNlIE9QX0JQTDoKLQljYXNlIE9QX0JWUzoKLQljYXNlIE9QX0JWQzoKLQkgIC8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdGhlIHRlc3QgKi8KLQkgIGJ1ZmZlclswXSBePSAweDIwOwotCSAgYnVmZmVyWzFdID0gMzsJLyogSnVtcCBvdmVyIGZvbGxvd2luZyBicmwgKi8KLQkgIGJ1ZmZlclsyXSA9IE9QX0JSTDsKLQkgIGJ1ZmZlclszXSA9IDA7Ci0JICBidWZmZXJbNF0gPSAwOwotCSAgZGlzcF9zaXplID0gMjsKLQkgIGluc3Rfc2l6ZSA9IDM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApOgotICAgICAgLyogVW5jb25kaXRpb25hbCBicmFuY2hlcyB0byBhIGtub3duIDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KLQotICAgICAgc3dpdGNoIChidWZmZXJbMF0pCi0JewotCWNhc2UgT1BfQlJBOgotCSAgYnVmZmVyWzBdID0gT1BfQlJMOwotCSAgZGlzcF9zaXplID0gMjsKLQkgIGluc3Rfc2l6ZSA9IDE7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAvKiBnb3QgdG8gY3JlYXRlIGEgYnJhbmNoIG92ZXIgYSByZWxvYyBoZXJlICovCi0gICAgY2FzZSBDIChDT05EX0JSQU5DSCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIGJ1ZmZlclswXSBePSAweDIwOwkvKiBpbnZlcnQgdGVzdCAqLwotICAgICAgYnVmZmVyWzFdID0gMzsKLSAgICAgIGJ1ZmZlclsyXSA9IE9QX0JSTDsKLSAgICAgIGJ1ZmZlclszXSA9IDA7Ci0gICAgICBidWZmZXJbNF0gPSAwOwotICAgICAgZml4X25ldyAoZnJhZ1AsCi0JICAgICAgIGZyYWdQLT5mcl9maXggKyAzLAotCSAgICAgICA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLAotCSAgICAgICBSX1c2NV9QQ1IxNik7Ci0KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEMgKFVOQ09ORF9CUkFOQ0gsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgICBidWZmZXJbMF0gPSBPUF9CUkw7Ci0gICAgICBidWZmZXJbMV0gPSAwOwotICAgICAgYnVmZmVyWzJdID0gMDsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLAotCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgMSwKLQkgICAgICAgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwKLQkgICAgICAgUl9XNjVfUENSMTYpOwotCi0gICAgICBmcmFnUC0+ZnJfZml4ICs9IGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgaWYgKGluc3Rfc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGludCBuZXh0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3MgKyBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBpbnQgdGFyZ19hZGRyID0gKFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArCi0JCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0KTsKLSAgICAgIGludCBkaXNwID0gdGFyZ19hZGRyIC0gbmV4dF9pbnN0OwotCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlciArIGluc3Rfc2l6ZSwgZGlzcCwgZGlzcF9zaXplKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgfQotfQotCi0KLXZhbHVlVAotREVGVU4gKG1kX3NlY3Rpb25fYWxpZ24sIChzZWcsIHNpemUpLAotICAgICAgIHNlZ1Qgc2VnIEFORAotICAgICAgIHZhbHVlVCBzaXplKQotewotICByZXR1cm4gKChzaXplICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKQotCSAgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOwotCi19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBpbnQgYWRkciA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKLQotICBpZiAoZml4UC0+Znhfcl90eXBlID09IDApCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSkKLQlmaXhQLT5meF9yX3R5cGUgPSBSX1c2NV9BQlM4OwotICAgICAgZWxzZQotCWZpeFAtPmZ4X3JfdHlwZSA9IFJfVzY1X0FCUzE2OwotICAgIH0KLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1c2NV9BQlM4UzE2OgotICAgICAgdmFsID4+PSA4OwotICAgIGNhc2UgUl9XNjVfQUJTOFM4OgotICAgICAgdmFsID4+PSA4OwotICAgIGNhc2UgUl9XNjVfQUJTODoKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9XNjVfQUJTMTZTMTY6Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgY2FzZSBSX1c2NV9BQlMxNlM4OgotICAgICAgdmFsID4+PSA4OwotICAgIGNhc2UgUl9XNjVfQUJTMTY6Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMDsKLSAgICAgICpidWYrKyA9IHZhbCA+PiA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9BQlMyNDoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAwOwotICAgICAgKmJ1ZisrID0gdmFsID4+IDg7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X1BDUjg6Ci0gICAgICAqYnVmKysgPSB2YWwgLSBhZGRyIC0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9XNjVfUENSMTY6Ci0gICAgICB2YWwgPSB2YWwgLSBhZGRyIC0gMTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgICpidWYrKyA9IHZhbCA+PiA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9EUDoKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKLSAgICAgY2hhciAqcHRyOwotICAgICB2YWx1ZVQgdXNlOwotICAgICBpbnQgbmJ5dGVzOwotewotICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLX0KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaW50IGdhcCA9IGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSAxOwotICByZXR1cm4gZ2FwOwotfQotCi12b2lkCi10Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHgpCi0gICAgc3ltYm9sUyAqeDsKLXsKLX0KLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhfcHRyKQotICAgICBmaXhTICpmaXhfcHRyOwotewotICByZXR1cm4gZml4X3B0ci0+Znhfcl90eXBlOwotfQotCi12b2lkCi10Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgYmZkX3ZtYSBiYXNlOwotCi17Ci0gIHN5bWJvbFMgKnN5bWJvbF9wdHI7Ci0KLSAgc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBhdHRhY2hlZCB0byBhIHN5bWJvbCB0aGVuIGl0J3Mgb2sKLSAgICAgdG8gb3V0cHV0IGl0ICovCi0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfMzIpCi0gICAgewotICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKLQl7Ci0JY2FzZSAyOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU0xNjsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIGludHItPnJfdHlwZSA9IFJfSU1NODsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGZpeF9wdHItPmZ4X3NpemUgPT0gNCkKLQlpbnRyLT5yX3R5cGUgPSBSX1c2NV9BQlMyNDsKLSAgICAgIGVsc2UKLQlpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7Ci0gICAgfQotCi0gIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOwotICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLQotICAvKiBUdXJuIHRoZSBzZWdtZW50IG9mIHRoZSBzeW1ib2wgaW50byBhbiBvZmZzZXQuICAqLwotICBpZiAoc3ltYm9sX3B0cikKLSAgICB7Ci0gICAgICBzeW1ib2xTICpkb3Q7Ci0KLSAgICAgIGRvdCA9IHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKV0uZG90OwotICAgICAgaWYgKGRvdCkKLQl7Ci0JICBpbnRyLT5yX29mZnNldCArPSBTX0dFVF9WQUxVRSAoc3ltYm9sX3B0cik7Ci0JICBpbnRyLT5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLSAgICB9Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOwotfQotCi0KLQotCi0KLS8qCi1jYWxsZWQganVzdCBiZWZvcmUgYWRkcmVzcyByZWxheGF0aW9uLCByZXR1cm4gdGhlIGxlbmd0aAotYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbgotKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIGludCB3aGF0ID0gR0VUX1dIQVQgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBDIChDT05EX0JSQU5DSCwgVU5ERUZfQllURV9ESVNQKToKLSAgICBjYXNlIEMgKFVOQ09ORF9CUkFOQ0gsIFVOREVGX0JZVEVfRElTUCk6Ci0gICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLwotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCi0JIHNpemVkIC0gbWF5YmUgaXQgd2lsbCBmaXggdXAgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgQllURV9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZyAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBVTkRFRl9XT1JEX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIFdPUkRfRElTUCldLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgfQotICByZXR1cm4gZnJhZ1AtPmZyX3ZhcjsKLX0KLQotCi0KLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fUkVMQVggKE9QVElPTl9NRF9CQVNFKQotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLQotfQotCi1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXc2NS5oIGIvZ2FzL2NvbmZpZy90Yy13NjUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5NGFkMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXc2NS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLXc2NS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBUQ19XNjUKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBpbnRlcm5hbF9yZWxvYzsKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLQotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF93NjUKLSNkZWZpbmUgQ09GRl9NQUdJQyAweDY1MDAKLQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCi1leHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOwotCi0jZGVmaW5lIERPX05PVF9TVFJJUCAwCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJXNjU4MTYgR0FTICIKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQotI2RlZmluZSBSRUxPQ18zMiAxMjM0Ci0KLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgdzY1X2V4cHJlc3Npb24gKEVYUCwgTkJZVEVTKQotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoMSkKLSNkZWZpbmUgVENfQ09OU19SRUxPQyB0Y19jb25zX3JlbG9jCi0jZGVmaW5lIERPTlRfT1ZFUkZMT1cKLWludCB0Y19jb25zX3JlbG9jOwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyogZW5kIG9mIHRjLXc2NS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXo4ay5jIGIvZ2FzL2NvbmZpZy90Yy16OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YjE0Yi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXo4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU4OSArMCwwIEBACi0vKiB0Yy16OGsuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgWmlsb2cgWjgwMG4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgc2FjQGN5Z251cy5jb20KLSAgKi8KLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgIm9wY29kZXMvejhrLW9wYy5oIgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9Ci17JyEnLCAwfTsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9Ci17JzsnLCAwfTsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPQoteycjJywgMH07Ci0KLWV4dGVybiBpbnQgbWFjaGluZTsKLWV4dGVybiBpbnQgY29mZl9mbGFnczsKLWludCBzZWdtZW50ZWRfbW9kZTsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAgICovCi0KLXZvaWQgY29ucyAoKTsKLQotdm9pZAotc19zZWdtICgpCi17Ci0gIHNlZ21lbnRlZF9tb2RlID0gMTsKLSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAxOwotICBjb2ZmX2ZsYWdzID0gRl9aODAwMTsKLX0KLQotdm9pZAotc191bnNlZyAoKQotewotICBzZWdtZW50ZWRfbW9kZSA9IDA7Ci0gIG1hY2hpbmUgPSBiZmRfbWFjaF96ODAwMjsKLSAgY29mZl9mbGFncyA9IEZfWjgwMDI7Ci19Ci0KLXN0YXRpYwotdm9pZAotZXZlbiAoKQotewotICBmcmFnX2FsaWduICgxLCAwLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Ci19Ci0KLXZvaWQgb2JqX2NvZmZfc2VjdGlvbiAoKTsKLQotaW50Ci10b2hleCAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChpc2RpZ2l0IChjKSkKLSAgICByZXR1cm4gYyAtICcwJzsKLSAgaWYgKGlzbG93ZXIgKGMpKQotICAgIHJldHVybiBjIC0gJ2EnICsgMTA7Ci0gIHJldHVybiBjIC0gJ0EnICsgMTA7Ci19Ci0KLXZvaWQKLXN2YWwgKCkKLXsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCi0gICAgewotICAgICAgaW50IGM7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB3aGlsZSAoYyAhPSAnXCcnKQotCXsKLQkgIGlmIChjID09ICclJykKLQkgICAgewotCSAgICAgIGMgPSAodG9oZXggKGlucHV0X2xpbmVfcG9pbnRlclswXSkgPDwgNCkKLQkJfCB0b2hleCAoaW5wdXRfbGluZV9wb2ludGVyWzFdKTsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgICAgfQotCSAgRlJBR19BUFBFTkRfMV9DSEFSIChjKTsKLQkgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JfQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0KLX0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiaW50IiwgY29ucywgMn0sCi0gIHsiZGF0YS5iIiwgY29ucywgMX0sCi0gIHsiZGF0YS53IiwgY29ucywgMn0sCi0gIHsiZGF0YS5sIiwgY29ucywgNH0sCi0gIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7ImhlYWRpbmciLCBsaXN0aW5nX3RpdGxlLCAwfSwKLSAgeyJpbXBvcnQiLCBzX2lnbm9yZSwgMH0sCi0gIHsicGFnZSIsIGxpc3RpbmdfZWplY3QsIDB9LAotICB7InByb2dyYW0iLCBzX2lnbm9yZSwgMH0sCi0gIHsiejgwMDEiLCBzX3NlZ20sIDB9LAotICB7Ino4MDAyIiwgc191bnNlZywgMH0sCi0KLQotICB7InNlZ20iLCBzX3NlZ20sIDB9LAotICB7InVuc2VnbSIsIHNfdW5zZWcsIDB9LAotICB7InVuc2VnIiwgc191bnNlZywgMH0sCi0gIHsibmFtZSIsIHNfYXBwX2ZpbGUsIDB9LAotICB7Imdsb2JhbCIsIHNfZ2xvYmwsIDB9LAotICB7Ind2YWwiLCBjb25zLCAyfSwKLSAgeyJsdmFsIiwgY29ucywgNH0sCi0gIHsiYnZhbCIsIGNvbnMsIDF9LAotICB7InN2YWwiLCBzdmFsLCAwfSwKLSAgeyJyc2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InNlY3QiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJibG9jayIsIHNfc3BhY2UsIDB9LAotICB7ImV2ZW4iLCBldmVuLCAwfSwKLSAgezAsIDAsIDB9Ci19OwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBvcGNvZGVfZW50cnlfdHlwZSAqb3Bjb2RlOwotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgaW50IGlkeCA9IDA7Ci0KLSAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAob3Bjb2RlID0gejhrX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIC8qIE9ubHkgZW50ZXIgdW5pcXVlIGNvZGVzIGludG8gdGhlIHRhYmxlICovCi0gICAgICBjaGFyICpzcmMgPSBvcGNvZGUtPm5hbWU7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG9wY29kZS0+bmFtZSwgcHJldl9uYW1lKSkKLQl7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCSAgaWR4Kys7Ci0JfQotICAgICAgb3Bjb2RlLT5pZHggPSBpZHg7Ci0gICAgICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7Ci0gICAgfQotCi0gIC8qIGRlZmF1bHQgdG8gejgwMDIgKi8KLSAgc191bnNlZyAoKTsKLQotICAvKiBpbnNlcnQgdGhlIHBzZXVkbyBvcHMgdG9vICovCi0gIGZvciAoaWR4ID0gMDsgbWRfcHNldWRvX3RhYmxlW2lkeF0ucG9jX25hbWU7IGlkeCsrKQotICAgIHsKLSAgICAgIG9wY29kZV9lbnRyeV90eXBlICpmYWtlX29wY29kZTsKLSAgICAgIGZha2Vfb3Bjb2RlID0gKG9wY29kZV9lbnRyeV90eXBlICopIG1hbGxvYyAoc2l6ZW9mIChvcGNvZGVfZW50cnlfdHlwZSkpOwotICAgICAgZmFrZV9vcGNvZGUtPm5hbWUgPSBtZF9wc2V1ZG9fdGFibGVbaWR4XS5wb2NfbmFtZSwKLQlmYWtlX29wY29kZS0+ZnVuYyA9ICh2b2lkICopIChtZF9wc2V1ZG9fdGFibGUgKyBpZHgpOwotICAgICAgZmFrZV9vcGNvZGUtPm9wY29kZSA9IDI1MDsKLSAgICAgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBmYWtlX29wY29kZS0+bmFtZSwgZmFrZV9vcGNvZGUpOwotICAgIH0KLQotICBsaW5rcmVsYXggPSAxOwotfQotCi1zdHJ1Y3QgejhrX2V4cAotewotICBjaGFyICplX2JlZzsKLSAgY2hhciAqZV9lbmQ7Ci0gIGV4cHJlc3Npb25TIGVfZXhwOwotfTsKLXR5cGVkZWYgc3RydWN0IHo4a19vcAotewotICBjaGFyIHJlZ3NpemU7CQkJLyogJ2InLCd3JywncicsJ3EnICovCi0gIHVuc2lnbmVkIGludCByZWc7CQkvKiAwLi4xNSAqLwotCi0gIGludCBtb2RlOwotCi0gIHVuc2lnbmVkIGludCB4X3JlZzsJCS8qIGFueSBvdGhlciByZWdpc3RlciBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGUgKi8KLSAgZXhwcmVzc2lvblMgZXhwOwkJLyogYW55IGV4cHJlc3Npb24gKi8KLX0KLQotb3BfdHlwZTsKLQotc3RhdGljIGV4cHJlc3Npb25TICpkYV9vcGVyYW5kOwotc3RhdGljIGV4cHJlc3Npb25TICppbW1fb3BlcmFuZDsKLQotaW50IHJlZ1sxNl07Ci1pbnQgdGhlX2NjOwotaW50IHRoZV9jdHJsOwotaW50IHRoZV9mbGFnczsKLWludCB0aGVfaW50ZXJydXB0OwotCi1jaGFyICoKLURFRlVOICh3aGF0cmVnLCAocmVnLCBzcmMpLAotICAgICAgIGludCAqcmVnIEFORAotICAgICAgIGNoYXIgKnNyYykKLXsKLSAgaWYgKGlzZGlnaXQgKHNyY1sxXSkpCi0gICAgewotICAgICAgKnJlZyA9IChzcmNbMF0gLSAnMCcpICogMTAgKyBzcmNbMV0gLSAnMCc7Ci0gICAgICByZXR1cm4gc3JjICsgMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqcmVnID0gKHNyY1swXSAtICcwJyk7Ci0gICAgICByZXR1cm4gc3JjICsgMTsKLSAgICB9Ci19Ci0KLS8qCi0gIHBhcnNlIG9wZXJhbmRzCi0KLSAgcmgwLXJoNywgcmwwLXJsNwotICByMC1yMTUKLSAgcnIwLXJyMTQKLSAgcnEwLS1ycTEyCi0gIFdSRUcgcjAscjEscjIscjMscjQscjUscjYscjcsZnAsc3AKLSAgcjBsLHIwaCwuLnI3bCxyN2gKLSAgQFdSRUcKLSAgQFdSRUcrCi0gIEAtV1JFRwotICAjY29uc3QKLQotICAqLwotCi0vKiB0cnkgYW5kIHBhcnNlIGEgcmVnIG5hbWUsIHJldHVybnMgbnVtYmVyIG9mIGNoYXJzIGNvbnN1bWVkICovCi1jaGFyICoKLURFRlVOIChwYXJzZV9yZWcsIChzcmMsIG1vZGUsIHJlZyksCi0gICAgICAgY2hhciAqc3JjIEFORAotICAgICAgIGludCAqbW9kZSBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgKnJlZykKLXsKLSAgY2hhciAqcmVzID0gMDsKLSAgY2hhciByZWdubzsKLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50ZWRfbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0xPTkc7Ci0gICAgICAgICAgKnJlZyA9IDE0OwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19XT1JEOwotICAgICAgICAgICpyZWcgPSAxNTsKLSAgICAgICAgfQotICAgICAgcmV0dXJuIHNyYyArIDI7Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID09ICdyJykKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0xPTkc7Ci0gICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAyKTsKLQkgIHJlZ25vID0gKnJlZzsKLQkgIGlmIChyZWdubyA+IDE0KQotICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciByciVkLCBvdXQgb2YgcmFuZ2UuIikscmVnbm8pOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChzcmNbMV0gPT0gJ2gnKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfQllURTsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gNykKLSAgICAgICAgICAJYXNfd2FybiAoXygicmVnaXN0ZXIgcmglZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAoc3JjWzFdID09ICdsJykKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0JZVEU7Ci0gICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAyKTsKLQkgIHJlZ25vID0gKnJlZzsKLQkgIGlmIChyZWdubyA+IDcpCi0gICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHJsJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7Ci0gICAgICAgICAgKnJlZyArPSA4OwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChzcmNbMV0gPT0gJ3EnKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfUVVBRDsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gMTIpCi0gICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHJxJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX1dPUkQ7Ci0gICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAxKTsKLQkgIHJlZ25vID0gKnJlZzsKLQkgIGlmIChyZWdubyA+IDE1KQotICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciByJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiByZXM7Ci0KLX0KLQotY2hhciAqCi1ERUZVTiAocGFyc2VfZXhwLCAocywgb3ApLAotICAgICAgIGNoYXIgKnMgQU5ECi0gICAgICAgZXhwcmVzc2lvblMgKiBvcCkKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqbmV3OwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKG9wKTsKLSAgaWYgKG9wLT5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6Ci0KLSAgIDxyYj4KLSAgIDxyPgotICAgPHJyPgotICAgPHJxPgotICAgQHIKLSAgICNleHAKLSAgIGV4cAotICAgZXhwKHIpCi0gICByKCNleHApCi0gICByKHIpCi0KLQotCi0gICAqLwotCi1zdGF0aWMKLWNoYXIgKgotREVGVU4gKGNoZWNrZm9yLCAocHRyLCB3aGF0KSwKLSAgICAgICBjaGFyICpwdHIgQU5ECi0gICAgICAgY2hhciB3aGF0KQotewotICBpZiAoKnB0ciA9PSB3aGF0KQotICAgIHB0cisrOwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCAlYyIpLCB3aGF0KTsKLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIE1ha2Ugc3VyZSB0aGUgbW9kZSBzdXBwbGllZCBpcyB0aGUgc2l6ZSBvZiBhIHdvcmQgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocmVnd29yZCwgKG1vZGUsIHN0cmluZyksCi0gICAgICAgaW50IG1vZGUgQU5ECi0gICAgICAgY2hhciAqc3RyaW5nKQotewotICBpbnQgb2s7Ci0KLSAgb2sgPSBDTEFTU19SRUdfV09SRDsKLSAgaWYgKG9rICE9IG1vZGUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJyZWdpc3RlciBpcyB3cm9uZyBzaXplIGZvciBhIHdvcmQgJXMiKSwgc3RyaW5nKTsKLSAgICB9Ci19Ci0KLS8qIE1ha2Ugc3VyZSB0aGUgbW9kZSBzdXBwbGllZCBpcyB0aGUgc2l6ZSBvZiBhbiBhZGRyZXNzICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHJlZ2FkZHIsIChtb2RlLCBzdHJpbmcpLAotICAgICAgIGludCBtb2RlIEFORAotICAgICAgIGNoYXIgKnN0cmluZykKLXsKLSAgaW50IG9rOwotCi0gIG9rID0gc2VnbWVudGVkX21vZGUgPyBDTEFTU19SRUdfTE9ORyA6IENMQVNTX1JFR19XT1JEOwotICBpZiAob2sgIT0gbW9kZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInJlZ2lzdGVyIGlzIHdyb25nIHNpemUgZm9yIGFkZHJlc3MgJXMiKSwgc3RyaW5nKTsKLSAgICB9Ci19Ci0KLXN0cnVjdCBjdHJsX25hbWVzCi17Ci0gICBpbnQgdmFsdWU7Ci0gICBjaGFyICpuYW1lOwotfTsKLQotc3RydWN0IGN0cmxfbmFtZXMgY3RybF90YWJsZVtdID0KLXsKLSAgIDB4MiwgImZjdyIsCi0gICAwWDMsICJyZWZyZXNoIiwKLSAgIDB4NCwgInBzYXBzZWciLAotICAgMHg1LCAicHNhcG9mZiIsCi0gICAweDUsICJwc2FwIiwKLSAgIDB4NiwgIm5zcHNlZyIsCi0gICAweDcsICJuc3BvZmYiLAotICAgMHg3LCAibnNwIiwKLSAgIDAsIDAKLX07Ci0gICAKLXN0YXRpYyB2b2lkCi1ERUZVTiAoZ2V0X2N0cmxfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKLSAgICAgICBjaGFyICoqcHRyIEFORAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGRzdCkKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IHI7Ci0gIGludCBpOwotCi0gIHdoaWxlICgqc3JjID09ICcgJykKLSAgICBzcmMrKzsKLQotICBtb2RlLT5tb2RlID0gQ0xBU1NfQ1RSTDsKLSAgZm9yIChpID0gMDsgY3RybF90YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgewotICAgICAgaW50IGo7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGN0cmxfdGFibGVbaV0ubmFtZVtqXTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN0cmxfdGFibGVbaV0ubmFtZVtqXSAhPSBzcmNbal0pCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLSAgICAgIHRoZV9jdHJsID0gY3RybF90YWJsZVtpXS52YWx1ZTsKLSAgICAgICpwdHIgPSBzcmMgKyBqOwotICAgICAgcmV0dXJuOwotICAgIGZhaWw6OwotICAgIH0KLSAgdGhlX2N0cmwgPSAwOwotICByZXR1cm47Ci19Ci0KLXN0cnVjdCBmbGFnX25hbWVzCi17Ci0gIGludCB2YWx1ZTsKLSAgY2hhciAqbmFtZTsKLQotfTsKLQotc3RydWN0IGZsYWdfbmFtZXMgZmxhZ190YWJsZVtdID0KLXsKLSAgMHgxLCAicCIsCi0gIDB4MSwgInYiLAotICAweDIsICJzIiwKLSAgMHg0LCAieiIsCi0gIDB4OCwgImMiLAotICAweDAsICIrIiwKLSAgMCwgMAotfTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChnZXRfZmxhZ3Nfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKLSAgICAgICBjaGFyICoqcHRyIEFORAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGRzdCkKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IHI7Ci0gIGludCBpOwotICBpbnQgajsKLQotICB3aGlsZSAoKnNyYyA9PSAnICcpCi0gICAgc3JjKys7Ci0KLSAgbW9kZS0+bW9kZSA9IENMQVNTX0ZMQUdTOwotICB0aGVfZmxhZ3MgPSAwOwotICBmb3IgKGogPSAwOyBqIDw9IDk7IGorKykKLSAgICB7Ci0gICAgIGlmICghc3JjW2pdKQotCWdvdG8gZG9uZTsKLSAgICAgZm9yIChpID0gMDsgZmxhZ190YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZmxhZ190YWJsZVtpXS5uYW1lWzBdID09IHNyY1tqXSkKLQkJewotCSAgICAgICAgdGhlX2ZsYWdzID0gdGhlX2ZsYWdzIHwgZmxhZ190YWJsZVtpXS52YWx1ZTsKLQkJZ290byBtYXRjaDsKLQkJfQotICAgICAgICB9Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgbWF0Y2g6Ci0gICAgIDsKLSAgICB9Ci0gIGRvbmU6Ci0gICpwdHIgPSBzcmMgKyBqOwotICByZXR1cm47Ci19Ci0KLQotc3RydWN0IGludGVycnVwdF9uYW1lcwotewotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKm5hbWU7Ci0KLX07Ci0KLXN0cnVjdCBpbnRlcnJ1cHRfbmFtZXMgaW50cl90YWJsZVtdID0KLXsKLSAgMHgxLCAibnZpIiwKLSAgMHgyLCAidmkiLAotICAweDMsICJib3RoIiwKLSAgMHgzLCAiYWxsIiwKLSAgMCwgMAotfTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChnZXRfaW50ZXJydXB0X29wZXJhbmQsIChwdHIsIG1vZGUsIGRzdCksCi0gICAgICAgY2hhciAqKnB0ciBBTkQKLSAgICAgICBzdHJ1Y3QgejhrX29wICptb2RlIEFORAotICAgICAgIHVuc2lnbmVkIGludCBkc3QpCi17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGludCByOwotICBpbnQgaTsKLQotICB3aGlsZSAoKnNyYyA9PSAnICcpCi0gICAgc3JjKys7Ci0KLSAgbW9kZS0+bW9kZSA9IENMQVNTX0lNTTsKLSAgZm9yIChpID0gMDsgaW50cl90YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgewotICAgICAgaW50IGo7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGludHJfdGFibGVbaV0ubmFtZVtqXTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGludHJfdGFibGVbaV0ubmFtZVtqXSAhPSBzcmNbal0pCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLSAgICAgIHRoZV9pbnRlcnJ1cHQgPSBpbnRyX3RhYmxlW2ldLnZhbHVlOwotICAgICAgKnB0ciA9IHNyYyArIGo7Ci0gICAgICByZXR1cm47Ci0gICAgZmFpbDo7Ci0gICAgfQotICB0aGVfaW50ZXJydXB0ID0gMHgwOwotICByZXR1cm47Ci19Ci0KLXN0cnVjdCBjY19uYW1lcwotewotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKm5hbWU7Ci0KLX07Ci0KLXN0cnVjdCBjY19uYW1lcyB0YWJsZVtdID0KLXsKLSAgMHgwLCAiZiIsCi0gIDB4MSwgImx0IiwKLSAgMHgyLCAibGUiLAotICAweDMsICJ1bGUiLAotICAweDQsICJvdiIsCi0gIDB4NCwgInBlIiwKLSAgMHg1LCAibWkiLAotICAweDYsICJlcSIsCi0gIDB4NiwgInoiLAotICAweDcsICJjIiwKLSAgMHg3LCAidWx0IiwKLSAgMHg4LCAidCIsCi0gIDB4OSwgImdlIiwKLSAgMHhhLCAiZ3QiLAotICAweGIsICJ1Z3QiLAotICAweGMsICJub3YiLAotICAweGMsICJwbyIsCi0gIDB4ZCwgInBsIiwKLSAgMHhlLCAibmUiLAotICAweGUsICJueiIsCi0gIDB4ZiwgIm5jIiwKLSAgMHhmLCAidWdlIiwKLSAgMCwgMAotfTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChnZXRfY2Nfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKLSAgICAgICBjaGFyICoqcHRyIEFORAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGRzdCkKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IHI7Ci0gIGludCBpOwotCi0gIHdoaWxlICgqc3JjID09ICcgJykKLSAgICBzcmMrKzsKLQotICBtb2RlLT5tb2RlID0gQ0xBU1NfQ0M7Ci0gIGZvciAoaSA9IDA7IHRhYmxlW2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgajsKLQotICAgICAgZm9yIChqID0gMDsgdGFibGVbaV0ubmFtZVtqXTsgaisrKQotCXsKLQkgIGlmICh0YWJsZVtpXS5uYW1lW2pdICE9IHNyY1tqXSkKLQkgICAgZ290byBmYWlsOwotCX0KLSAgICAgIHRoZV9jYyA9IHRhYmxlW2ldLnZhbHVlOwotICAgICAgKnB0ciA9IHNyYyArIGo7Ci0gICAgICByZXR1cm47Ci0gICAgZmFpbDo7Ci0gICAgfQotICB0aGVfY2MgPSAweDg7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZXRfb3BlcmFuZCAocHRyLCBtb2RlLCBkc3QpCi0gICAgIGNoYXIgKipwdHI7Ci0gICAgIHN0cnVjdCB6OGtfb3AgKm1vZGU7Ci0gICAgIHVuc2lnbmVkIGludCBkc3Q7Ci17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGNoYXIgKmVuZDsKLSAgdW5zaWduZWQgaW50IG51bTsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgbW9kZS0+bW9kZSA9IDA7Ci0KLSAgd2hpbGUgKCpzcmMgPT0gJyAnKQotICAgIHNyYysrOwotICBpZiAoKnNyYyA9PSAnIycpCi0gICAgewotICAgICAgbW9kZS0+bW9kZSA9IENMQVNTX0lNTTsKLSAgICAgIGltbV9vcGVyYW5kID0gJihtb2RlLT5leHApOwotICAgICAgc3JjID0gcGFyc2VfZXhwIChzcmMgKyAxLCAmKG1vZGUtPmV4cCkpOwotICAgIH0KLSAgZWxzZSBpZiAoKnNyYyA9PSAnQCcpCi0gICAgewotICAgICAgaW50IGQ7Ci0KLSAgICAgIG1vZGUtPm1vZGUgPSBDTEFTU19JUjsKLSAgICAgIHNyYyA9IHBhcnNlX3JlZyAoc3JjICsgMSwgJmQsICZtb2RlLT5yZWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCByZWduOwotCi0gICAgICBlbmQgPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUtPm1vZGUsICZyZWduKTsKLQotICAgICAgaWYgKGVuZCkKLQl7Ci0JICBpbnQgbncsIG5yOwotCi0JICBzcmMgPSBlbmQ7Ci0JICBpZiAoKnNyYyA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBzcmMrKzsKLQkgICAgICBlbmQgPSBwYXJzZV9yZWcgKHNyYywgJm53LCAmbnIpOwotCSAgICAgIGlmIChlbmQpCi0JCXsKLQkJICAvKiBHb3QgUmEoUmIpICovCi0JCSAgc3JjID0gZW5kOwotCi0JCSAgaWYgKCpzcmMgIT0gJyknKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIk1pc3NpbmcgKSBpbiByYShyYikiKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzcmMrKzsKLQkJICAgIH0KLQotCQkgIHJlZ2FkZHIgKG1vZGUtPm1vZGUsICJyYShyYikgcmEiKTsKLS8qCQkgIHJlZ3dvcmQgKG1vZGUtPm1vZGUsICJyYShyYikgcmIiKTsqLwotCQkgIG1vZGUtPm1vZGUgPSBDTEFTU19CWDsKLQkJICBtb2RlLT5yZWcgPSByZWduOwotCQkgIG1vZGUtPnhfcmVnID0gbnI7Ci0JCSAgcmVnW0FSR19SWF0gPSBucjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvdCBSYShkaXNwKSAqLwotCQkgIGlmICgqc3JjID09ICcjJykKLQkJICAgIHNyYysrOwotCQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmKG1vZGUtPmV4cCkpOwotCQkgIHNyYyA9IGNoZWNrZm9yIChzcmMsICcpJyk7Ci0JCSAgbW9kZS0+bW9kZSA9IENMQVNTX0JBOwotCQkgIG1vZGUtPnJlZyA9IHJlZ247Ci0JCSAgbW9kZS0+eF9yZWcgPSAwOwotCQkgIGltbV9vcGVyYW5kID0gJihtb2RlLT5leHApOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1vZGUtPnJlZyA9IHJlZ247Ci0JICAgICAgbW9kZS0+eF9yZWcgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE5vIGluaXRpYWwgcmVnICovCi0JICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJihtb2RlLT5leHApKTsKLQkgIGlmICgqc3JjID09ICcoJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIGVuZCA9IHBhcnNlX3JlZyAoc3JjLCAmKG1vZGUtPm1vZGUpLCAmcmVnbik7Ci0JICAgICAgcmVnd29yZCAobW9kZS0+bW9kZSwgImFkZHIoUmEpIHJhIik7Ci0JICAgICAgbW9kZS0+bW9kZSA9IENMQVNTX1g7Ci0JICAgICAgbW9kZS0+cmVnID0gcmVnbjsKLQkgICAgICBtb2RlLT54X3JlZyA9IDA7Ci0JICAgICAgZGFfb3BlcmFuZCA9ICYobW9kZS0+ZXhwKTsKLQkgICAgICBzcmMgPSBjaGVja2ZvciAoZW5kLCAnKScpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IGFuIGFkZHJlc3MgKi8KLQkgICAgICBtb2RlLT5tb2RlID0gQ0xBU1NfREE7Ci0JICAgICAgbW9kZS0+cmVnID0gMDsKLQkgICAgICBtb2RlLT54X3JlZyA9IDA7Ci0JICAgICAgZGFfb3BlcmFuZCA9ICYobW9kZS0+ZXhwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gICpwdHIgPSBzcmM7Ci19Ci0KLXN0YXRpYwotY2hhciAqCi1nZXRfb3BlcmFuZHMgKG9wY29kZSwgb3BfZW5kLCBvcGVyYW5kKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqb3Bjb2RlOwotICAgICBjaGFyICpvcF9lbmQ7Ci0gICAgIG9wX3R5cGUgKm9wZXJhbmQ7Ci17Ci0gIGNoYXIgKnB0ciA9IG9wX2VuZDsKLWNoYXIgKnNhdnB0cjsKLSAgc3dpdGNoIChvcGNvZGUtPm5vcGVyYW5kcykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgb3BlcmFuZFswXS5tb2RlID0gMDsKLSAgICAgIG9wZXJhbmRbMV0ubW9kZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHB0cisrOwotICAgICAgaWYgKG9wY29kZS0+YXJnX2luZm9bMF0gPT0gQ0xBU1NfQ0MpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfY2Nfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IENMQVNTX0ZMQUdTKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X2ZsYWdzX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSAoQ0xBU1NfSU1NICsoQVJHX0lNTTIpKSkKLSAgICAgICAgewotICAgICAgICAgIGdldF9pbnRlcnJ1cHRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBvcGVyYW5kWzFdLm1vZGUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBwdHIrKzsKLSAgICAgIHNhdnB0ciA9IHB0cjsKLSAgICAgIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IENMQVNTX0NDKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X2NjX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSBDTEFTU19DVFJMKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGdldF9jdHJsX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgICAgICAgIGlmICh0aGVfY3RybCA9PSAwKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgcHRyID0gc2F2cHRyOwotICAgICAgICAgICAgICAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHB0ciA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgIGlmICgqcHRyID09ICcsJykKLSAgICAgICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICAgIGdldF9jdHJsX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gcHRyOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgfQotICAgICAgaWYgKHB0ciA9PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0gICAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMiwgMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDIsIDIpOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X2NjX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAzLCAzKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogUGFzc2VkIGEgcG9pbnRlciB0byBhIGxpc3Qgb2Ygb3Bjb2RlcyB3aGljaCB1c2UgZGlmZmVyZW50Ci0gICBhZGRyZXNzaW5nIG1vZGVzLCByZXR1cm4gdGhlIG9wY29kZSB3aGljaCBtYXRjaGVzIHRoZSBvcGNvZGVzCi0gICBwcm92aWRlZAotICAgKi8KLQotc3RhdGljCi1vcGNvZGVfZW50cnlfdHlwZSAqCi1ERUZVTiAoZ2V0X3NwZWNpZmljLCAob3Bjb2RlLCBvcGVyYW5kcyksCi0gICAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKiBvcGNvZGUgQU5ECi0gICAgICAgb3BfdHlwZSAqIG9wZXJhbmRzKQotCi17Ci0gIG9wY29kZV9lbnRyeV90eXBlICp0aGlzX3RyeSA9IG9wY29kZTsKLSAgaW50IGZvdW5kID0gMDsKLSAgdW5zaWduZWQgaW50IG5vcGVyYW5kcyA9IG9wY29kZS0+bm9wZXJhbmRzOwotCi0gIHVuc2lnbmVkIGludCBkaXNwcmVnOwotICB1bnNpZ25lZCBpbnQgdGhpc19pbmRleCA9IG9wY29kZS0+aWR4OwotCi0gIHdoaWxlICh0aGlzX2luZGV4ID09IG9wY29kZS0+aWR4ICYmICFmb3VuZCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgdGhpc190cnkgPSBvcGNvZGUrKzsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBub3BlcmFuZHM7IGkrKykKLQl7Ci0JICBpbnQgbW9kZSA9IG9wZXJhbmRzW2ldLm1vZGU7Ci0KLQkgIGlmICgobW9kZSAmIENMQVNTX01BU0spICE9ICh0aGlzX3RyeS0+YXJnX2luZm9baV0gJiBDTEFTU19NQVNLKSkKLQkgICAgewotCSAgICAgIC8qIGl0IGNvdWxkIGJlIGFuIHBjIHJlbCBvcGVyYW5kLCBpZiB0aGlzIGlzIGEgZGEgbW9kZSBhbmQKLQkgICB3ZSBsaWtlIGRpc3BzLCB0aGVuIGluc2VydCBpdCAqLwotCi0JICAgICAgaWYgKG1vZGUgPT0gQ0xBU1NfREEgJiYgdGhpc190cnktPmFyZ19pbmZvW2ldID09IENMQVNTX0RJU1ApCi0JCXsKLQkJICAvKiBUaGlzIGlzIHRoZSBjYXNlICovCi0JCSAgb3BlcmFuZHNbaV0ubW9kZSA9IENMQVNTX0RJU1A7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChtb2RlID09IENMQVNTX0JBICYmIHRoaXNfdHJ5LT5hcmdfaW5mb1tpXSkKLQkJewotCQkgIC8qIENhbid0IHRoaW5rIG9mIGEgd2F5IHRvIHR1cm4gd2hhdCB3ZSd2ZSBiZWVuIGdpdmVuIGludG8KLQkgICAgIHNvbWV0aGluZyB0aGF0J3Mgb2sgKi8KLQkJICBnb3RvIGZhaWw7Ci0JCX0KLQkgICAgICBlbHNlIGlmICh0aGlzX3RyeS0+YXJnX2luZm9baV0gJiBDTEFTU19QUikKLQkJewotCQkgIGlmIChtb2RlID09IENMQVNTX1JFR19MT05HICYmIHNlZ21lbnRlZF9tb2RlKQotCQkgICAgewotCQkgICAgICAvKiBvayAqLwotCQkgICAgfQotCQkgIGVsc2UgaWYgKG1vZGUgPT0gQ0xBU1NfUkVHX1dPUkQgJiYgIXNlZ21lbnRlZF9tb2RlKQotCQkgICAgewotCQkgICAgICAvKiBvayAqLwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGdvdG8gZmFpbDsKLQkJfQotCSAgICAgIGVsc2UKLQkJZ290byBmYWlsOwotCSAgICB9Ci0JICBzd2l0Y2ggKG1vZGUgJiBDTEFTU19NQVNLKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfWDoKLQkgICAgY2FzZSBDTEFTU19JUjoKLQkgICAgY2FzZSBDTEFTU19CQToKLQkgICAgY2FzZSBDTEFTU19CWDoKLQkgICAgY2FzZSBDTEFTU19ESVNQOgotCSAgICBjYXNlIENMQVNTX1JFRzoKLQkgICAgY2FzZSBDTEFTU19SRUdfV09SRDoKLQkgICAgY2FzZSBDTEFTU19SRUdfQllURToKLQkgICAgY2FzZSBDTEFTU19SRUdfUVVBRDoKLQkgICAgY2FzZSBDTEFTU19SRUdfTE9ORzoKLQkgICAgY2FzZSBDTEFTU19SRUdOMDoKLQkgICAgICByZWdbdGhpc190cnktPmFyZ19pbmZvW2ldICYgQVJHX01BU0tdID0gb3BlcmFuZHNbaV0ucmVnOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBmb3VuZCA9IDE7Ci0gICAgZmFpbDo7Ci0gICAgfQotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRoaXNfdHJ5OwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoY2hlY2tfb3BlcmFuZCwgKG9wZXJhbmQsIHdpZHRoLCBzdHJpbmcpLAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm9wZXJhbmQgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IHdpZHRoIEFORAotICAgICAgIGNoYXIgKnN0cmluZykKLXsKLSAgaWYgKG9wZXJhbmQtPmV4cC5YX2FkZF9zeW1ib2wgPT0gMAotICAgICAgJiYgb3BlcmFuZC0+ZXhwLlhfb3Bfc3ltYm9sID09IDApCi0gICAgewotCi0gICAgICAvKiBObyBzeW1ib2wgaW52b2x2ZWQsIGxldCdzIGxvb2sgYXQgb2Zmc2V0LCBpdCdzIGRhbmdlcm91cyBpZiBhbnkgb2YKLSAgICAgICB0aGUgaGlnaCBiaXRzIGFyZSBub3QgMCBvciBmZidzLCBmaW5kIG91dCBieSBvcmluZyBvciBhbmRpbmcgd2l0aAotICAgICAgIHRoZSB3aWR0aCBhbmQgc2VlaW5nIGlmIHRoZSBhbnN3ZXIgaXMgMCBvciBhbGwgZnMqLwotICAgICAgaWYgKChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICYgfndpZHRoKSAhPSAwICYmCi0JICAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciB8IHdpZHRoKSAhPSAofjApKQotCXsKLQkgIGFzX3dhcm4gKF8oIm9wZXJhbmQgJXMweCV4IG91dCBvZiByYW5nZS4iKSwgc3RyaW5nLCBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKTsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyBjaGFyIGJ1ZmZlclsyMF07Ci0KLXN0YXRpYyB2b2lkCi1ERUZVTiAobmV3Zml4LCAocHRyLCB0eXBlLCBvcGVyYW5kKSwKLSAgICAgICBpbnQgcHRyIEFORAotICAgICAgIGludCB0eXBlIEFORAotICAgICAgIGV4cHJlc3Npb25TICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQtPlhfYWRkX3N5bWJvbAotICAgICAgfHwgb3BlcmFuZC0+WF9vcF9zeW1ib2wKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlcikKLSAgICB7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIHB0ciwKLQkJICAgMSwKLQkJICAgb3BlcmFuZCwKLQkJICAgMCwKLQkJICAgdHlwZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1ERUZVTiAoYXBwbHlfZml4LCAocHRyLCB0eXBlLCBvcGVyYW5kLCBzaXplKSwKLSAgICAgICBjaGFyICpwdHIgQU5ECi0gICAgICAgaW50IHR5cGUgQU5ECi0gICAgICAgZXhwcmVzc2lvblMgKiBvcGVyYW5kIEFORAotICAgICAgIGludCBzaXplKQotewotICBpbnQgbiA9IG9wZXJhbmQtPlhfYWRkX251bWJlcjsKLQotICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPSBuOwotICBuZXdmaXggKChwdHIgLSBidWZmZXIpIC8gMiwgdHlwZSwgb3BlcmFuZCk7Ci0jaWYgMQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgODoJCQkvKiA4IG5pYmJsZXMgPT0gMzIgYml0cyAqLwotICAgICAgKnB0cisrID0gbiA+PiAyODsKLSAgICAgICpwdHIrKyA9IG4gPj4gMjQ7Ci0gICAgICAqcHRyKysgPSBuID4+IDIwOwotICAgICAgKnB0cisrID0gbiA+PiAxNjsKLSAgICBjYXNlIDQ6CQkJLyogNCBuaWJsbGVzID09IDE2IGJpdHMgKi8KLSAgICAgICpwdHIrKyA9IG4gPj4gMTI7Ci0gICAgICAqcHRyKysgPSBuID4+IDg7Ci0gICAgY2FzZSAyOgotICAgICAgKnB0cisrID0gbiA+PiA0OwotICAgIGNhc2UgMToKLSAgICAgICpwdHIrKyA9IG4gPj4gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gcHRyOwotCi19Ci0KLS8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCi0gKi8KLSNkZWZpbmUgSU5TRVJUKHgseSkgKngrKyA9IHk+PjI0OyAqeCsrID0geT4+IDE2OyAqeCsrPXk+Pjg7ICp4KysgPXk7Ci1zdGF0aWMgdm9pZAotYnVpbGRfYnl0ZXMgKHRoaXNfdHJ5LCBvcGVyYW5kKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqIHRoaXNfdHJ5OwotICAgICBzdHJ1Y3QgejhrX29wICpvcGVyYW5kOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpbnQgbGVuZ3RoOwotICBjaGFyICpvdXRwdXQ7Ci0gIGNoYXIgKm91dHB1dF9wdHIgPSBidWZmZXI7Ci0gIGNoYXIgcGFydDsKLSAgaW50IGM7Ci0gIGNoYXIgaGlnaDsKLSAgaW50IG5pYjsKLSAgaW50IG5pYmJsZTsKLSAgdW5zaWduZWQgaW50ICpjbGFzc19wdHI7Ci0KLSAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gIGZyYWdfbmV3ICgwKTsKLQotICBtZW1zZXQgKGJ1ZmZlciwgMjAsIDApOwotICBjbGFzc19wdHIgPSB0aGlzX3RyeS0+Ynl0ZV9pbmZvOwotdG9wOjsKLQotICBmb3IgKG5pYmJsZSA9IDA7IGMgPSAqY2xhc3NfcHRyKys7IG5pYmJsZSsrKQotICAgIHsKLQotICAgICAgc3dpdGNoIChjICYgQ0xBU1NfTUFTSykKLQl7Ci0JZGVmYXVsdDoKLQotCSAgYWJvcnQgKCk7Ci0JY2FzZSBDTEFTU19BRERSRVNTOgotCSAgLyogRGlyZWN0IGFkZHJlc3MsIHdlIGRvbid0IGNvcGUgd2l0aCB0aGUgU1MgbW9kZSByaWdodCBub3cgKi8KLQkgIGlmIChzZWdtZW50ZWRfbW9kZSkKLQkgICAgewotCSAgICAgIGRhX29wZXJhbmQtPlhfYWRkX251bWJlciB8PSAweDgwMDAwMDAwOwotCSAgICAgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMzIsIGRhX29wZXJhbmQsIDgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTE2LCBkYV9vcGVyYW5kLCA0KTsKLQkgICAgfQotCSAgZGFfb3BlcmFuZCA9IDA7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RJU1A4OgotCSAgLyogcGMgcmVsIDggYml0ICovCi0JICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0pSLCBkYV9vcGVyYW5kLCAyKTsKLQkgIGRhX29wZXJhbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENMQVNTXzBESVNQNzoKLQkgIC8qIHBjIHJlbCA3IGJpdCAqLwotCSAgKm91dHB1dF9wdHIgPSAwOwotCSAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9ESVNQNywgZGFfb3BlcmFuZCwgMik7Ci0JICBkYV9vcGVyYW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDTEFTU18xRElTUDc6Ci0JICAvKiBwYyByZWwgNyBiaXQgKi8KLQkgICpvdXRwdXRfcHRyID0gMHg4MDsKLQkgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfRElTUDcsIGRhX29wZXJhbmQsIDIpOwotICAgICAgICAgIG91dHB1dF9wdHJbLTJdID0gIDB4ODsKLQkgIGRhX29wZXJhbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENMQVNTX0JJVF8xT1IyOgotCSAgKm91dHB1dF9wdHIgPSBjICYgMHhmOwotCSAgaWYgKGltbV9vcGVyYW5kKQotCSAgICB7Ci0JICAgICAgaWYgKGltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMikKLQkJewotCQkgICpvdXRwdXRfcHRyIHw9IDI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyICE9IDEpCi0JCXsKLQkJICBhc19iYWQgKF8oImltbWVkaWF0ZSBtdXN0IGJlIDEgb3IgMiIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImltbWVkaWF0ZSAxIG9yIDIgZXhwZWN0ZWQiKSk7Ci0JICAgIH0KLQkgIG91dHB1dF9wdHIrKzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ0M6Ci0JICAqb3V0cHV0X3B0cisrID0gdGhlX2NjOwotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xBU1NfMENDQzoKLSAgICAgICAgICAqb3V0cHV0X3B0cisrID0gdGhlX2N0cmw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xBU1NfMUNDQzoKLSAgICAgICAgICAqb3V0cHV0X3B0cisrID0gdGhlX2N0cmwgfCAweDg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xBU1NfMDBJSToKLSAgICAgICAgICAqb3V0cHV0X3B0cisrID0gKH50aGVfaW50ZXJydXB0ICYgMHgzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTEFTU18wMUlJOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSAofnRoZV9pbnRlcnJ1cHQgJiAweDMpIHwgMHg0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENMQVNTX0ZMQUdTOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSB0aGVfZmxhZ3M7Ci0gICAgICAgICAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CSVQ6Ci0JICAqb3V0cHV0X3B0cisrID0gYyAmIDB4ZjsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHTjA6Ci0JICBpZiAocmVnW2MgJiAweGZdID09IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImNhbid0IHVzZSBSMCBoZXJlIikpOwotCSAgICB9Ci0JY2FzZSBDTEFTU19SRUc6Ci0JY2FzZSBDTEFTU19SRUdfQllURToKLQljYXNlIENMQVNTX1JFR19XT1JEOgotCWNhc2UgQ0xBU1NfUkVHX0xPTkc6Ci0JY2FzZSBDTEFTU19SRUdfUVVBRDoKLQkgIC8qIEluc2VydCBiaXQgbWF0dGVybiBvZgotCSByaWdodCByZWcgKi8KLQkgICpvdXRwdXRfcHRyKysgPSByZWdbYyAmIDB4Zl07Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RJU1A6Ci0JICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTE2LCBkYV9vcGVyYW5kLCA0KTsKLQkgIGRhX29wZXJhbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENMQVNTX0lNTToKLQkgIHsKLQkgICAgbmliID0gMDsKLQkgICAgc3dpdGNoIChjICYgQVJHX01BU0spCi0JICAgICAgewotCSAgICAgIGNhc2UgQVJHX0lNTTQ6Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NNEwsIGltbV9vcGVyYW5kLCAxKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBBUkdfSU1NNE0xOgotCQlpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyLS07Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NNEwsIGltbV9vcGVyYW5kLCAxKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBBUkdfSU1NTk1JTlVTMToKLQkJaW1tX29wZXJhbmQtPlhfYWRkX251bWJlci0tOwotCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTRMLCBpbW1fb3BlcmFuZCwgMSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQVJHX05JTTg6Ci0JCWltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXIgPSAtaW1tX29wZXJhbmQtPlhfYWRkX251bWJlcjsKLQkgICAgICBjYXNlIEFSR19JTU04OgotCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTgsIGltbV9vcGVyYW5kLCAyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBBUkdfSU1NMTY6Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMTYsIGltbV9vcGVyYW5kLCA0KTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIEFSR19JTU0zMjoKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU0zMiwgaW1tX29wZXJhbmQsIDgpOwotCQlicmVhazsKLQotCSAgICAgIGRlZmF1bHQ6Ci0JCWFib3J0ICgpOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0gICAgfQotCi0gIC8qIENvcHkgZnJvbSB0aGUgbmliYmxlIGJ1ZmZlciBpbnRvIHRoZSBmcmFnICovCi0KLSAgewotICAgIGludCBsZW5ndGggPSAob3V0cHV0X3B0ciAtIGJ1ZmZlcikgLyAyOwotICAgIGNoYXIgKnNyYyA9IGJ1ZmZlcjsKLSAgICBjaGFyICpmcmFncCA9IGZyYWdfbW9yZSAobGVuZ3RoKTsKLQotICAgIHdoaWxlIChzcmMgPCBvdXRwdXRfcHRyKQotICAgICAgewotCSpmcmFncCA9IChzcmNbMF0gPDwgNCkgfCBzcmNbMV07Ci0Jc3JjICs9IDI7Ci0JZnJhZ3ArKzsKLSAgICAgIH0KLQotICB9Ci0KLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY2l0b24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAgICovCi0KLXZvaWQKLURFRlVOIChtZF9hc3NlbWJsZSwgKHN0ciksCi0gICAgICAgY2hhciAqc3RyKQotewotICBjaGFyICpvcF9zdGFydDsKLSAgY2hhciAqb3BfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RydWN0IHo4a19vcCBvcGVyYW5kWzNdOwotICBvcGNvZGVfZW50cnlfdHlwZSAqb3Bjb2RlOwotICBvcGNvZGVfZW50cnlfdHlwZSAqcHJldl9vcGNvZGU7Ci0KLSAgY2hhciAqZG90ID0gMDsKLSAgY2hhciBjOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBmaW5kIHRoZSBvcCBjb2RlIGVuZCAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOwotICAgICAgICpvcF9lbmQgIT0gMCAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgfQotCi0gIDsKLQotICBpZiAob3BfZW5kID09IG9wX3N0YXJ0KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLSAgYyA9ICpvcF9lbmQ7Ci0KLSAgKm9wX2VuZCA9IDA7Ci0KLSAgb3Bjb2RlID0gKG9wY29kZV9lbnRyeV90eXBlICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwKLQkJCQkJICAgIG9wX3N0YXJ0KTsKLQotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAob3Bjb2RlLT5vcGNvZGUgPT0gMjUwKQotICAgIHsKLSAgICAgIC8qIHdhcyByZWFsbHkgYSBwc2V1ZG8gb3AgKi8KLQotICAgICAgcHNldWRvX3R5cGVTICpwOwotICAgICAgY2hhciBvYzsKLQotICAgICAgY2hhciAqb2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKm9wX2VuZCA9IGM7Ci0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BfZW5kOwotCi0gICAgICBvYyA9ICpvbGQ7Ci0gICAgICAqb2xkID0gJ1xuJzsKLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHAgPSAocHNldWRvX3R5cGVTICopIChvcGNvZGUtPmZ1bmMpOwotCi0gICAgICAocC0+cG9jX2hhbmRsZXIpIChwLT5wb2NfdmFsKTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZDsKLSAgICAgICpvbGQgPSBvYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBnZXRfb3BlcmFuZHMgKG9wY29kZSwgb3BfZW5kLAotCQkJCQkgb3BlcmFuZCk7Ci0gICAgICBwcmV2X29wY29kZSA9IG9wY29kZTsKLQotICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQpOwotCi0gICAgICBpZiAob3Bjb2RlID09IDApCi0JewotCSAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLQkgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKLQotCSAgd2hlcmVbMF0gPSAweDA7Ci0JICB3aGVyZVsxXSA9IDB4MDsKLQotCSAgYXNfYmFkIChfKCJDYW4ndCBmaW5kIG9wY29kZSB0byBtYXRjaCBvcGVyYW5kcyIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGJ1aWxkX2J5dGVzIChvcGNvZGUsIG9wZXJhbmQpOwotICAgIH0KLX0KLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotc3ltYm9sUyAqCi1ERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAotICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1ERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAgICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiejoiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ3onOgotICAgICAgaWYgKCFzdHJjbXAgKGFyZywgIjgwMDEiKSkKLQlzX3NlZ20gKCk7Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICI4MDAyIikpCi0Jc191bnNlZyAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC16JXMiKSwgYXJnKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1aOEsgb3B0aW9uczpcblwKLS16ODAwMQkJCWdlbmVyYXRlIHNlZ21lbnRlZCBjb2RlXG5cCi0tejgwMDIJCQlnZW5lcmF0ZSB1bnNlZ21lbnRlZCBjb2RlXG4iKSk7Ci19Ci0MCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAoKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBwcmludGYgKF8oImNhbGwgdG8gbWRfY29udmVydF9mcmFnIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1ERUZVTiAobWRfc2VjdGlvbl9hbGlnbiwgKHNlZywgc2l6ZSksCi0gICAgICAgc2VnVCBzZWcgQU5ECi0gICAgICAgdmFsdWVUIHNpemUpCi17Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLQotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0lNTTRMOgotICAgICAgYnVmWzBdID0gKGJ1ZlswXSAmIDB4ZjApIHwgKChidWZbMF0gKyB2YWwpICYgMHhmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0pSOgotCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICAvKiAgICBpZiAodmFsICE9IDApIGFib3J0KCk7Ki8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0RJU1A3OgotCi0gICAgICAqYnVmKysgKz0gdmFsOwotICAgICAgLyogICAgaWYgKHZhbCAhPSAwKSBhYm9ydCgpOyovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU04OgotICAgICAgYnVmWzBdICs9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU0xNjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NMzI6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotI2lmIDAKLSAgICBjYXNlIFJfREEgfCBSX1NFRzoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gMHgwMDsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSAwOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIH0KLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotREVGVU4gKG1kX251bWJlcl90b19jaGFycywgKHB0ciwgdXNlLCBuYnl0ZXMpLAotICAgICAgIGNoYXIgKnB0ciBBTkQKLSAgICAgICB2YWx1ZVQgdXNlIEFORAotICAgICAgIGludCBuYnl0ZXMpCi17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLX0KLQotdm9pZAotdGNfcmVsb2NfbWFuZ2xlIChmaXhfcHRyLCBpbnRyLCBiYXNlKQotICAgICBmaXhTICpmaXhfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludHI7Ci0gICAgIGJmZF92bWEgYmFzZTsKLQotewotICBzeW1ib2xTICpzeW1ib2xfcHRyOwotCi0gIGlmIChmaXhfcHRyLT5meF9hZGRzeSAmJgotICAgICAgZml4X3B0ci0+Znhfc3Vic3kpIAotICAgIHsKLSAgICAgIHN5bWJvbFMgKmFkZCA9IGZpeF9wdHItPmZ4X2FkZHN5OwotICAgICAgc3ltYm9sUyAqc3ViID0gZml4X3B0ci0+Znhfc3Vic3k7Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVChhZGQpICE9IFNfR0VUX1NFR01FTlQoc3ViKSkKLQl7Ci0JICBhc19iYWQoXygiQ2FuJ3Qgc3VidHJhY3Qgc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgJXMgJXMiKSwKLQkJIFNfR0VUX05BTUUoYWRkKSwgU19HRVRfTkFNRShzdWIpKTsKLQl9Ci0gICAgICBlbHNlIHsKLQlpbnQgZGlmZiA9IFNfR0VUX1ZBTFVFKGFkZCkgLSBTX0dFVF9WQUxVRShzdWIpOwotCWZpeF9wdHItPmZ4X2FkZHN5ID0gMDsKLQlmaXhfcHRyLT5meF9zdWJzeSA9IDA7Ci0JZml4X3B0ci0+Znhfb2Zmc2V0ICs9IGRpZmY7Ci0gICAgICB9Ci0gICAgfQotICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvawotICAgICB0byBvdXRwdXQgaXQgKi8KLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIGNvbnMgbGlrZXMgdG8gY3JlYXRlIHJlbG9jMzIncyB3aGF0ZXZlciB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MuLiAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU04OwotCSAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgaW50ci0+cl90eXBlID0gUl9JTU0zMjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7Ci0gICAgfQotCi0gIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOwotICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLQotICBpZiAoc3ltYm9sX3B0cikKLSAgICBpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLSAgZWxzZQotICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci19Ci0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtejhrLmggYi9nYXMvY29uZmlnL3RjLXo4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhiNjU2Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtejhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtejhrLmgKLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyLCA5MywgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNkZWZpbmUgVENfWjhLCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwoeCkgMAotI2VuZGlmCi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIGFib3J0KCk7Ci0KLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfejhrCi0jZGVmaW5lIENPRkZfTUFHSUMgMHg4MDAwCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCi1leHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOwotCi0jZGVmaW5lIERPX05PVF9TVFJJUCAwCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJaaWxvZyBaODAwMCBHQVMgIgotI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCi0jZGVmaW5lIFJFTE9DXzMyIDEyMzQKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIGVuZCBvZiB0Yy16OGsuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS0zODZic2QuaCBiL2dhcy9jb25maWcvdGUtMzg2YnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmY5OTAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS0zODZic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIHRlLTM4NmJzZC5oIC0tIDM4NkJTRCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEVfMzg2QlNECTEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRlLXN1bjMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1hdXguaCBiL2dhcy9jb25maWcvdGUtYXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmZhMDEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1hdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNkZWZpbmUgVEVfQVVYCi0KLS8qIEZyb20gb2JqLWNvZmYuaDoKLSAgIFRoaXMgaW50ZXJuYWxfbGluZW5vIGNyYXAgaXMgdG8gc3RvcCBuYW1lc3BhY2UgcG9sbHV0aW9uIGZyb20gdGhlCi0gICBiZmQgaW50ZXJuYWwgY29mZiBoZWFkZXJmaWxlLiAqLwotI2RlZmluZSBpbnRlcm5hbF9saW5lbm8gYmZkX2ludGVybmFsX2xpbmVubwotI2luY2x1ZGUgImNvZmYvYXV4LWNvZmYuaCIJLyogb3ZlcnJpZGUgYml0cyBpbiBjb2ZmL2ludGVybmFsLmggKi8KLSN1bmRlZiBpbnRlcm5hbF9saW5lbm8KLQotI2RlZmluZSBDT0ZGX05PTE9BRF9QUk9CTEVNCi0jZGVmaW5lIEtFRVBfUkVMT0NfSU5GTwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19GQgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWRlbHQ4OC5oIGIvZ2FzL2NvbmZpZy90ZS1kZWx0ODguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjZDZiNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWRlbHQ4OC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRlLWRlbHRhODguaC4gICovCi0KLSNkZWZpbmUgVEVfREVMVEE4OCAxCi0KLSNkZWZpbmUgQ09GRl9OT0xPQURfUFJPQkxFTQkxCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSCTEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCCQkxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWRlbHRhLmggYi9nYXMvY29uZmlnL3RlLWRlbHRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmM2MmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1kZWx0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI2RlZmluZSBURV9ERUxUQQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0jZGVmaW5lIENPRkZfTk9MT0FEX1BST0JMRU0JMQotI2RlZmluZSBDT0ZGX0NPTU1PTl9BRERFTkQJMQotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUgkxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQgkJMQotCi0vKiBlbmQgb2YgdGUtZGVsdGEuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1kcHgyLmggYi9nYXMvY29uZmlnL3RlLWRweDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNDFjYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWRweDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIE1hY2hpbmUgc3BlY2lmaWMgZGVmaW5lcyBmb3IgdGhlIGRweDIgbWFjaGluZSAqLwotCi0vKiBUaGUgbWFnaWMgbnVtYmVyIGlzIG5vdCB0aGUgdXN1YWwgTUM2OE1BR0lDLiAqLwotI2RlZmluZSBDT0ZGX01BR0lDICAgICAgIE1DNjhLQkNTTUFHSUMKLQotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTY4ay11biIKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLWRweDIuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1keW5peC5oIGIvZ2FzL2NvbmZpZy90ZS1keW5peC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTdiMzBmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZHluaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLyogVGhpcyBpcyBmb3IgaTM4Ni1zZXF1ZW50LWJzZC4gIFRoZSBhc3NlbWJsZXIgcHJvYmFibHkgZG9lcyBub3QKLSAgIGFjdHVhbGx5IHdvcmssIGFzIHRoZSBzdXBwb3J0IGluIEJGRCBpcyBub3QgY29tcGxldGUgYXMgb2YgdGhpcwotICAgd3JpdGluZy4gIFNlZSBiZmQvaTM4Ni1keW5peC5jLiAgKi8KLQotI2RlZmluZSBURV9EWU5JWCAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWVwb2MtcGUuaCBiL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzVmOTE0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jZGVmaW5lIFRFX1BFCi0jZGVmaW5lIFRFX0VQT0MKLSNkZWZpbmUgTEVYX0FUIDEgLyogY2FuIGhhdmUgQCdzIGluc2lkZSBsYWJlbHMgKi8KLQotLyogVGhlIFBFIGZvcm1hdCBzdXBwb3J0cyBsb25nIHNlY3Rpb24gbmFtZXMuICAqLwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1nZW5lcmljLmggYi9nYXMvY29uZmlnL3RlLWdlbmVyaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlZGE0NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWdlbmVyaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtZ2VuZXJpYy5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICogdGFyZ2V0IGVudmlyb25tZW50IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBJdCBpcyBteSBpbnRlbnQgdGhhdCB0aGlzIGZpbGUgd2lsbCBldm9sdmUgaW50byBhIGZpbGUgc3VpdGFibGUgZm9yIGNvbmZpZywKLSAqIGNvbXBpbGUsIGFuZCBjb3B5aW5nIGFzIGFuIGFpZCBmb3IgdGVzdGluZyBhbmQgcG9ydGluZy4gIHhveG9yaWNoLgotICovCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpZmRlZiBPQkpfSEVBREVSCi0jaW5jbHVkZSBPQkpfSEVBREVSCi0jZWxzZQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLSNlbmRpZgotCi0vKiBlbmQgb2YgdGUtZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWdvMzIuaCBiL2dhcy9jb25maWcvdGUtZ28zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODVjOTU4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZ28zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1nbzMyLmgKLSAqLwotCi0jZGVmaW5lIFRFX0dPMzIKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWdvMzIiCi0KLS8qIEdBUyBzaG91bGQgdHJlYXQgJy5hbGlnbiB2YWx1ZScgYXMgYW4gYWxpZ25tZW50IG9mIDIqKnZhbHVlICovCi0jZGVmaW5lIFVTRV9BTElHTl9QVFdPCi0KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWhwMzAwLmggYi9nYXMvY29uZmlnL3RlLWhwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOTRhYjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1ocDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogdGUtaHAzMDAuaCAtLSBocHV4IDkwMDAvMzAwIHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLWhwMzAwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtaHBwYS5oIGIvZ2FzL2NvbmZpZy90ZS1ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzRmYTcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBNYWNoaW5lIHNwZWNpZmljIGRlZmluZXMgZm9yIHRoZSBQQSBtYWNoaW5lCi0gICBDb3B5cmlnaHQgMTk4NywgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCUhQIFBBLVJJU0MgYW5kIE9TRi8xIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yCi0JU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLgotICovCi0KLS8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1pMzg2YWl4LmggYi9nYXMvY29uZmlnL3RlLWkzODZhaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmMDk0NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWkzODZhaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtaTM4NmFpeC5oIGFuZCBpcyBidWlsdCBmcm9tIHBpZWNlcyBvZiBjb2RlIGZyb20gTWluaCBUcmFuLUxlCi0gKiA8VFJBTkxFQElOVEVMTElDT1JQLkNPTT4gYnkgcmljaEBjeWdudXMuY29tLgotICovCi0KLSNkZWZpbmUgVEVfSTM4NkFJWCAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qCi0gKiBVbmRlZmluZSBSRVZFUlNFX1NPUlRfUkVMT0NTIHRvIGtlZXAgdGhlIHJlbG9jYXRpb24gZW50cmllcyBzb3J0ZWQKLSAqIGluIGFzY2VuZGluZyB2YWRkci4KLSAqLwotI3VuZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKLQotLyoKLSAqIERlZmluZSBLRUVQX1JFTE9DX0lORk8gc28gdGhhdCB0aGUgc3RyaXAgcmVsb2MgaW5mbyBmbGFnIEZfUkVMRkxHCi0gKiBpcyBub3QgdXNlZCBpbiB0aGUgZmlsZWhkciBmb3IgQ09GRiBvdXRwdXQuCi0gKi8KLSNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDc5Ci0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRlLWkzODZhaXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oIGIvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzMxZmI5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtaWM5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0ZS1pYzk2MC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiwgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIHRlLWljOTYwLmggYW5kIGlzIGludGVuZGVkIHRvIGRlZmluZSBpYzk2MCBlbnZpcm9ubWVudAotICogc3BlY2lmaWMgZGlmZmVyZW5jZXMuCi0gKi8KLQotI2RlZmluZSBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKChuYW1lWzBdID09J0wnKSBcCi0JCQkgICB8fCAobmFtZVswXSA9PScuJyBcCi0JCQkgICAgICAgJiYgKG5hbWVbMV09PSdDJyBcCi0JCQkJICAgfHwgbmFtZVsxXT09J0knIFwKLQkJCQkgICB8fCBuYW1lWzFdPT0nLicpKSkKLSNlbmRpZgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtaWM5NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1pbnRlcml4LmggYi9nYXMvY29uZmlnL3RlLWludGVyaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczYWQyNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWludGVyaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNkZWZpbmUgVEVfUEVfRFlOIC8qIFBFIHdpdGggZHluYW1pYyBsaW5raW5nIChVTklYIHNoYXJlZCBsaWIpIHN1cHBvcnQgKi8KLSNkZWZpbmUgVEVfUEUKLSNkZWZpbmUgTEVYX0FUIDEgLyogY2FuIGhhdmUgQCdzIGluc2lkZSBsYWJlbHMgKi8KLSNkZWZpbmUgTEVYX1FNIDMgLyogY2FuIGhhdmUgPydzIGluIG9yIGJlZ2luIGxhYmVscyAqLwotCi0vKiBUaGUgUEUgZm9ybWF0IHN1cHBvcnRzIGxvbmcgc2VjdGlvbiBuYW1lcy4gICovCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotCi0vKiBCb3RoIGFyY2hpdGVjdHVyZXMgdXNlIHRoZXNlICovCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19GQgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2VuZGlmCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWxpbnV4LmggYi9nYXMvY29uZmlnL3RlLWxpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzVhN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jZGVmaW5lIFRFX0xJTlVYCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWxuZXdzLmggYi9nYXMvY29uZmlnL3RlLWxuZXdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmNjNWEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1sbmV3cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKiB0ZS1sbmV3cy5oIC0tIGxpdHRsZS1lbmRpYW4gTkVXUyBlbXVsYXRpb24uICAqLwotCi0jZGVmaW5lIEVDT0ZGX0xJVFRMRV9GT1JNQVQgImVjb2ZmLWJpZ2xpdHRsZW1pcHMiCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWx5bnguaCBiL2dhcy9jb25maWcvdGUtbHlueC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg1MTVkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbHlueC5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jZGVmaW5lIFRFX0xZTlgKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotI2lmbmRlZiBMT0NBTF9MQUJFTFNfRkIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1tYWNoLmggYi9nYXMvY29uZmlnL3RlLW1hY2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1NDdmOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW1hY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2RlZmluZSBURV9NYWNoCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1tYWNvcy5oIGIvZ2FzL2NvbmZpZy90ZS1tYWNvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ4ZGM0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbWFjb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0ZS1tYWNvcy5oLiAgKi8KLQotI2RlZmluZSBURV9QT1dFUk1BQyAxCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbmJzZC5oIGIvZ2FzL2NvbmZpZy90ZS1uYnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZTQ2MDAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1uYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiB0ZS1uYnNkLmggLS0gTmV0QlNEIHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBURV9OZXRCU0QJMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbmJzZDUzMi5oIGIvZ2FzL2NvbmZpZy90ZS1uYnNkNTMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZjllNWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1uYnNkNTMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLW5ldGJzZDUzMi5oCi0gKgotICogV3JpdHRlbiBieSBJYW4gRGFsbCA8aWRhbGxAZWxlY2VuZy5hZGVsYWlkZS5lZHUuYXU+Ci0gKiAKLSAqIDE5LUp1bi05NAotICogCi0gKi8KLQotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtbnMzMmstbmV0YnNkIgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBNYXliZSB0aGVzZSBzaG91bGQgYmUgbW9yZSBsaWtlIFRDX05TMzI1MzIgYW5kIFRDX05TMzIzODEgaW4gY2FzZQotICogb2YgY29uZmxpY3RzLiBOUzMyMzgxIGlzIHVzZWQgaW4gb3Bjb2RlL25zMzJrLmggYW5kIHRoYXQgaXMgYWxzbwotICogdXNlZCBieSBHREIuIE5lZWQgdG8gY2hlY2suCi0gKi8KLSNkZWZpbmUgTlMzMjUzMgotI2RlZmluZSBOUzMyMzgxCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBjNTMybWFjaC5oIGIvZ2FzL2NvbmZpZy90ZS1wYzUzMm1hY2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlN2ZmOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXBjNTMybWFjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1wYzUzMi5oCi0gKgotICogV3JpdHRlbiBieSBJYW4gRGFsbCA8aWRhbGxAZWxlY2VuZy5hZGVsYWlkZS5lZHUuYXU+Ci0gKiAKLSAqIDI0LU1heS05NAotICogCi0gKi8KLQotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtcGM1MzItbWFjaCIKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogTWF5YmUgdGhlc2Ugc2hvdWxkIGJlIG1vcmUgbGlrZSBUQ19OUzMyNTMyIGFuZCBUQ19OUzMyMzgxIGluIGNhc2UKLSAqIG9mIGNvbmZsaWN0cy4gTlMzMjM4MSBpcyB1c2VkIGluIG9wY29kZS9uczMyay5oIGFuZCB0aGF0IGlzIGFsc28KLSAqIHVzZWQgYnkgR0RCLiBOZWVkIHRvIGNoZWNrLgotICovCi0jZGVmaW5lIE5TMzI1MzIKLSNkZWZpbmUgTlMzMjM4MQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wZS5oIGIvZ2FzL2NvbmZpZy90ZS1wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzFmMGIyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2RlZmluZSBURV9QRQotI2RlZmluZSBMRVhfQVQgMSAvKiBjYW4gaGF2ZSBAJ3MgaW5zaWRlIGxhYmVscyAqLwotCi0vKiBUaGUgUEUgZm9ybWF0IHN1cHBvcnRzIGxvbmcgc2VjdGlvbiBuYW1lcy4gICovCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBwY253LmggYi9nYXMvY29uZmlnL3RlLXBwY253LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZGYwNTAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1wcGNudy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogdGUtcHBjbncuaCAtLSBQb3dlciBQQyBydW5uaW5nIE5ldHdhcmUgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGdjYyB1c2VzIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHBwYy9uZXR3YXJlICovCi0KLSN1bmRlZiBOT19TVFJJTkdfRVNDQVBFUwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wc29zLmggYi9nYXMvY29uZmlnL3RlLXBzb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkNDE1My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXBzb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtcHNvcy5oIGZvciBlbWJlZGRlZCBzeXN0ZW1zIHJ1bm5pbmcgcFNPUy4KLSAqIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBBbmFudGhhcmFtYW4gKG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZSkKLSAqLwotCi0jZGVmaW5lIFRFX1BTT1MKLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIFRoaXMgbWFrZXMgR0FTIG1vcmUgdmVyc2F0aWxlIGFuZCBibG9ja3Mgc29tZSBFTEYnaXNtcyBpbgotICAgdGMtbTY4ay5oLiAqLwotCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGVuZCBvZiB0ZS1wc29zLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcmlzY2l4LmggYi9nYXMvY29uZmlnL3RlLXJpc2NpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzcyNTNlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcmlzY2l4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNkZWZpbmUgVEVfUklTQ0lYCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXNwYXJjYW91dC5oIGIvZ2FzL2NvbmZpZy90ZS1zcGFyY2FvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxMDE4NC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXNwYXJjYW91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogdGUtc3BhcmNhb3V0LmggLS0gZW1iZWRkZWQgc3BhcmMtYW91dCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEVfU1BBUkNBT1VUCTEKLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXN1bjMuaCBiL2dhcy9jb25maWcvdGUtc3VuMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzVkNDJiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtc3VuMy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogdGUtc3VuMy5oIC0tIFN1bi0zIHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgI2RlZmluZXMgc3BlY2lmaWMKLSAgIHRvIFNVTiBjb21wdXRlciBTVU4gMyBzZXJpZXMgY29tcHV0ZXJzLiAgKFRoZSBvbmx5IGtpbmQKLSAgIHdlIGhhdmUgYXJvdW5kIGhlcmUsIHVuZm9ydHVuYXRseS4pCi0KLSAgIFJ1bW9yIGhhcyBpdCB0aGF0IHRoaXMgZmlsZSB3aWxsIHdvcmsgb24gdGhlIFN1bi0yIGlmIHRoZSBhc3NlbWJsZXIKLSAgIGlzIGNhbGxlZCB3aXRoIC1tNjgwMTAgIFRoaXMgaXMgbm90IHRlc3RlZC4gICovCi0KLQotI2RlZmluZSBURV9TVU4zCTEKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogQ291bGQgYWxzbyBiZSA6Ci0gICAjZGVmaW5lIFNfTE9DQUxfTkFNRShzKQkoU19HRVRfTkFNRShzKVswXSA9PSAnLicgJiYKLSAgIFNfR0VUX05BTUUocylbMV0gPT0gJ0wnIHx8Ci0gICBTX0dFVF9OQU1FKHMpWzFdID09ICcuJykKLSAgICovCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0ZS1zdW4zLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtc3ZyNC5oIGIvZ2FzL2NvbmZpZy90ZS1zdnI0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTdlZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1zdnI0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNkZWZpbmUgVEVfU1ZSNAotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zeXN2MzIuaCBiL2dhcy9jb25maWcvdGUtc3lzdjMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2U2ZTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1zeXN2MzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLyogUmVtb3ZlIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIHRoZSBnY2MgZ2VuZXJhdGVkIHN5bWJvbCBuYW1lcyAqLwotI2RlZmluZSBTVFJJUF9VTkRFUlNDT1JFCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGVuZCBvZiB0ZS1zeXN2MzIuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS13aW5jZS1wZS5oIGIvZ2FzL2NvbmZpZy90ZS13aW5jZS1wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTE5M2I4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtd2luY2UtcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2RlZmluZSBURV9XSU5DRQotI2luY2x1ZGUgInRlLXBlLmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3ZheC1pbnN0LmggYi9nYXMvY29uZmlnL3ZheC1pbnN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDhmOTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy92YXgtaW5zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogdmF4LWluc3QuaCAtIEdOVSAtIFBhcnQgb2YgdmF4LmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBpcyBwYXJ0IG9mIHZheC1pbnMtcGFyc2UuYyAmIGZyaWVuZHMuCi0gKiBXZSB3YW50IHRvIHBhcnNlIGEgdmF4IGluc3RydWN0aW9uIHRleHQgaW50byBhIHRyZWUgZGVmaW5lZCBoZXJlLgotICovCi0KLSNkZWZpbmUgVklUX01BWF9PUEVSQU5EUyAoNikJLyogbWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gb25lICAgICAgICovCi0vKiBzaW5nbGUgdmF4IGluc3RydWN0aW9uICovCi0KLXN0cnVjdCB2b3AJCQkvKiB2YXggaW5zdHJ1Y3Rpb24gb3BlcmFuZCAgICAgICAgICAgICAgICAgKi8KLXsKLSAgc2hvcnQgaW50IHZvcF9uZHg7CQkvKiAtMSwgb3IgaW5kZXggcmVnaXN0ZXIuIGVnIDc9W1I3XQkgICAqLwotICBzaG9ydCBpbnQgdm9wX3JlZzsJCS8qIC0xLCBvciByZWdpc3RlciBudW1iZXIuIGVnIEBJXiM9MHhGICAgICAqLwotICAvKiBIZWxwcyBkaXN0aW5ndWlzaCAiYWJzIiBmcm9tICJhYnMoUEMpIi4gKi8KLSAgc2hvcnQgaW50IHZvcF9tb2RlOwkJLyogYWRkcmVzc2luZyBtb2RlIDQgYml0cy4gZWcgSV4jPTB4OQkgICAqLwotICBjaGFyIHZvcF9zaG9ydDsJCS8qIG9wZXJhbmQgZGlzcGxhY2VtZW50IGxlbmd0aCBhcyB3cml0dGVuICAqLwotICAvKiAnICc9bm9uZSwgImJpbHN3Ij1CXkleTF5TXldeLiAgICAgICAgICAgKi8KLSAgY2hhciB2b3BfYWNjZXNzOwkJLyogJ2InYnJhbmNoICcgJ25vLWluc3RydWN0aW9uICdhbXJ2dydub3JtICovCi0gIGNoYXIgdm9wX3dpZHRoOwkJLyogT3BlcmFuZCB3aWR0aCwgb25lIG9mICJiZGZnaGxvcXciCSAgICovCi0gIGNvbnN0IGNoYXIgKnZvcF93YXJuOwkJLyogd2FybmluZyBtZXNzYWdlIG9mIHRoaXMgb3BlcmFuZCwgaWYgYW55ICovCi0gIGNvbnN0IGNoYXIgKnZvcF9lcnJvcjsJLyogc2F5IGlmIG9wZXJhbmQgaXMgaW5hcHByb3ByaWF0ZSAgICAgICAgICovCi0gIGNoYXIgKnZvcF9leHByX2JlZ2luOwkJLyogVW5wYXJzZWQgZXhwcmVzc2lvbiwgMXN0IGNoYXIgLi4uCSAgICovCi0gIGNoYXIgKnZvcF9leHByX2VuZDsJCS8qIC4uLiBsYXN0IGNoYXIuCQkJICAgKi8KLSAgdW5zaWduZWQgY2hhciB2b3BfbmJ5dGVzOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZGF0dW0JCSAgICovCi19OwotCi0KLXR5cGVkZWYgbG9uZyB2YXhfb3Bjb2RlVDsJLyogRm9yIGluaXRpYWxpc2luZyBhcnJheSBvZiBvcGNvZGVzCSAgICovCi0vKiBTb21lIHN5bnRoZXRpYyBvcGNvZGVzID4gMTYgYml0cyEgICAgICAgKi8KLQotI2RlZmluZSBWSVRfT1BDT0RFX1NZTlRIRVRJQyAweDgwMDAwMDAwCS8qIE5vdCByZWFsIGhhcmR3YXJlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVklUX09QQ09ERV9TUEVDSUFMICAgMHg0MDAwMDAwMAkvKiBOb3Qgbm9ybWFsIGJyYW5jaCBvcHRpbWlzaW5nLiAgICovCi0vKiBOZXZlciBzZXQgd2l0aG91dCAuLi5fU1lOVEhFVElDICovCi0KLSNkZWZpbmUgVkFYX1dJRFRIX1VOQ09ORElUSU9OQUxfSlVNUCAnLScJLyogVGhlc2UgYXJlIGVuY29kZWQgaW50byAgICAgICAgICovCi0jZGVmaW5lIFZBWF9XSURUSF9DT05ESVRJT05BTF9KVU1QICAgJz8nCS8qIHZvcF93aWR0aCB3aGVuIHZvcF9hY2Nlc3M9PSdiJyAqLwotI2RlZmluZSBWQVhfV0lEVEhfV09SRF9KVU1QICAgICAgICAgICchJwkvKiBhbmQgVklUX09QQ09ERV9TWU5USEVUSUMgc2V0LiAgKi8KLSNkZWZpbmUgVkFYX1dJRFRIX0JZVEVfSlVNUAkgICAgICc6JwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBWQVhfSk1QICgweDE3KQkJLyogVXNlZnVsIGZvciBicmFuY2ggb3B0aW1pc2luZy4gSnVtcCBpbnN0ciovCi0jZGVmaW5lIFZBWF9QQ19SRUxBVElWRV9NT0RFICgweGVmKQkvKiBVc2UgaXQgYWZ0ZXIgVkFYX0pNUAkJICAgKi8KLSNkZWZpbmUgVkFYX0FCU09MVVRFX01PREUgKDB4OUYpLyogVXNlIGFzIEAjLi4uCQkJICAgKi8KLSNkZWZpbmUgVkFYX0JSQiAoMHgxMSkJCS8qIENhbm9uaWNhbCBicmFuY2guCQkJICAgKi8KLSNkZWZpbmUgVkFYX0JSVyAoMHgzMSkJCS8qIEFub3RoZXIgY2Fub25pY2FsIGJyYW5jaAkJICAgKi8KLSNkZWZpbmUgVkFYX1dJREVOX1dPUkQgKDB4MjApCS8qIEFkZCB0aGlzIHRvIGJ5dGUgYnJhbmNoIHRvIGdldCB3b3JkIGJyLiAqLwotI2RlZmluZSBWQVhfV0lERU5fTE9ORyAoMHg2KQkvKiBBZGQgdGhpcyB0byBieXRlIGJyYW5jaCB0byBnZXQgbG9uZyBqbXAuKi8KLS8qIE5lZWRzIFZBWF9QQ19SRUxBVElWRV9NT0RFIGJ5dGUgYWZ0ZXIgaXQqLwotCi1zdHJ1Y3Qgdml0CQkJLyogdmF4IGluc3RydWN0aW9uIHRyZWUgICAgICAgICAgICAgICAgICAgICovCi17Ci0gIC8qIHZpdF9vcGNvZGUgaXMgY2hhcltdIGZvciBwb3J0YWJpbGl0eS4gICAqLwotICBjaGFyIHZpdF9vcGNvZGVbc2l6ZW9mICh2YXhfb3Bjb2RlVCldOwotICB1bnNpZ25lZCBjaGFyIHZpdF9vcGNvZGVfbmJ5dGVzOwkvKiBIb3cgbG9uZyBpcyBfb3Bjb2RlPyAoY2hhcnMpCSAgICovCi0gIHVuc2lnbmVkIGNoYXIgdml0X29wZXJhbmRzOwkvKgkJCQkJICAgKi8KLSAgc3RydWN0IHZvcCB2aXRfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsJLyogb3BlcmFuZHMgICAgICAgICAgICAgKi8KLSAgY29uc3QgY2hhciAqdml0X2Vycm9yOwkvKiAiIiBvciBlcnJvciB0ZXh0ICovCi19OwotCi0vKiBlbmQgb2YgdmF4LWluc3QuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy92bXMtYS1jb25mLmggYi9nYXMvY29uZmlnL3Ztcy1hLWNvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4ZmM2OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3Ztcy1hLWNvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKiB2bXMtYWxwaGEtY29uZi5oLiAgR2VuZXJhdGVkIG1hbnVhbGx5IGZyb20gY29uZi5pbiwKLSAgIGFuZCB1c2VkIGJ5IGNvbmZpZy1nYXMtYWxwaGEuY29tIHdoZW4gY29uc3RydWN0aW5nIGNvbmZpZy5oLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIENfQUxMT0NBCi0jZWxzZQotI2RlZmluZSBDX0FMTE9DQQotI2VuZGlmCi0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgaW5saW5lCi0jZWxzZQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotCVNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLQlTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLQlTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAoLTEpCi0KLS8qIFNob3VsZCBnYXMgdXNlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZXM/ICAqLwotI2RlZmluZSBCRkRfQVNTRU1CTEVSCi0KLS8qIFNvbWUgYXNzZXJ0L3ByZXByb2Nlc3NvciBjb21iaW5hdGlvbnMgYXJlIGluY2FwYWJsZSBvZiBoYW5kbGluZwotICAgY2VydGFpbiBraW5kcyBvZiBjb25zdHJ1Y3RzIGluIHRoZSBhcmd1bWVudCBvZiBhc3NlcnQuICBGb3IgZXhhbXBsZSwKLSAgIHF1b3RlZCBzdHJpbmdzIChpZiByZXF1b3RpbmcgaXNuJ3QgZG9uZSByaWdodCkgb3IgbmV3bGluZXMuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgQlJPS0VOX0FTU0VSVAotI2Vsc2UKLSNkZWZpbmUgQlJPS0VOX0FTU0VSVAotI2VuZGlmCi0KLS8qIElmIHdlIGFyZW4ndCBkb2luZyBjcm9zcy1hc3NlbWJsaW5nLCBzb21lIG9wZXJhdGlvbnMgY2FuIGJlIG9wdGltaXplZCwKLSAgIHNpbmNlIGJ5dGUgb3JkZXJzIGFuZCB2YWx1ZSBzaXplcyBkb24ndCBuZWVkIHRvIGJlIGFkanVzdGVkLiAgKi8KLSN1bmRlZiBDUk9TU19DT01QSUxFCi0KLS8qIFNvbWUgZ2FzIGNvZGUgd2FudHMgdG8ga25vdyB0aGVzZSBwYXJhbWV0ZXJzLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FMSUFTCSJhbHBoYS12bXMiCi0jZGVmaW5lIFRBUkdFVF9DUFUJImFscGhhIgotI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMCSJhbHBoYS1kZWMtdm1zIgotI2RlZmluZSBUQVJHRVRfT1MJIm9wZW5WTVMvQWxwaGEiCi0jZGVmaW5lIFRBUkdFVF9WRU5ET1IJImRlYyIKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgbWFsbG9jIGFuZCByZWFsbG9jLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBmcmVlLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogU29tZXRpbWVzIGVycm5vLmggZG9lc24ndCBkZWNsYXJlIGVycm5vIGl0c2VsZi4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCi0jdW5kZWYgTUFOWV9TRUdNRU5UUwotCi0vKiBOZWVkZWQgb25seSBmb3Igc3BhcmMgY29uZmlndXJhdGlvbiAqLwotI3VuZGVmIHNwYXJjdjkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW1vdmUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1JFTU9WRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHVubGluayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9VTkxJTksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0VSUk5PX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1REQVJHX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSAotI2Vsc2UKLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0jZW5kaWYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSAkvKiBjb25maWctZ2FzLmNvbSB3aWxsIG1ha2Ugb25lIGlmIG5lY2Vzc2FyeSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSAotCi0vKiBWTVMtc3BlY2lmaWM6ICB3ZSBuZWVkIHRvIHNldCB1cCBFWElUX3h4eCBoZXJlIGJlY2F1c2UgdGhlIGRlZmF1bHQKLSAgIHZhbHVlcyBpbiBhcy5oIGFyZSBpbmFwcHJvcHJpYXRlIGZvciBWTVMsIGJ1dCB3ZSBhbHNvIHdhbnQgdG8gcHJldmVudAotICAgYXMuaCdzIGluY2x1c2lvbiBvZiA8c3RkbGliLmg+IGZyb20gdHJpZ2dlcmluZyByZWRlZmluaXRpb24gd2FybmluZ3MuCi0gICA8c3RkbGliLmg+IGd1YXJkcyBpdHNlbGYgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24sIHNvIGluY2x1ZGluZyBpdAotICAgaGVyZSB0dXJucyBhcy5oJ3MgbGF0ZXIgI2luY2x1ZGUgaW50byBhIG5vLW9wLiAgKFdlIGNhbid0IHNpbXBseSB1c2UKLSAgICNpZm5kZWYgSEFWRV9TVERMSUJfSCBoZXJlLCBiZWNhdXNlIHRoZSA8c3RkbGliLmg+IGluIHNldmVyYWwgb2xkZXIKLSAgIGdjYy12bXMgZGlzdHJpYnV0aW9ucyBuZWdsZWN0cyB0byBkZWZpbmUgdGhlc2UgdHdvIHJlcXVpcmVkIG1hY3Jvcy4pICAqLwotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmIF9fREVDQwotI3VuZGVmIEVYSVRfU1VDQ0VTUwotI3VuZGVmIEVYSVRfRkFJTFVSRQotI2RlZmluZSBFWElUX1NVQ0NFU1MgMQkJCS8qIFNTJF9OT1JNQUwsIFNUUyRLX1NVQ0NFU1MgKi8KLSNkZWZpbmUgRVhJVF9GQUlMVVJFIDB4MTAwMDAwMDIJCS8qIChTVFMkS19FUlJPUiB8IFNUUyRNX0lOSElCX01TRykgKi8KLSNlbmRpZgotCi0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2lmIF9fREVDQwotZXh0ZXJuIGludCBzdHJjYXNlY21wICgpOwotZXh0ZXJuIGludCBzdHJuY2FzZWNtcCAoKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy92bXMtY29uZi5oIGIvZ2FzL2NvbmZpZy92bXMtY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjI1Y2ZjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdm1zLWNvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKiB2bXMtY29uZi5oLiAgR2VuZXJhdGVkIG1hbnVhbGx5IGZyb20gY29uZi5pbiwKLSAgIGFuZCB1c2VkIGJ5IGNvbmZpZy1nYXMuY29tIHdoZW4gY29uc3RydWN0aW5nIGNvbmZpZy5oLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIENfQUxMT0NBCi0jZWxzZQotI2RlZmluZSBDX0FMTE9DQQotI2VuZGlmCi0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgaW5saW5lCi0jZWxzZQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAoLTEpCi0KLS8qIERlZmluZSBpZiBsZXggZGVjbGFyZXMgeXl0ZXh0IGFzIGEgY2hhciAqIGJ5IGRlZmF1bHQsIG5vdCBhIGNoYXJbXS4gICovCi0jdW5kZWYgWVlURVhUX1BPSU5URVIKLQotLyogTmFtZSBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gb2YgcGFja2FnZS4gICovCi0vKiBEZWZpbmUgaW4gYnkgY29uZmlnLWdhcy5jb20gKi8KLS8qICN1bmRlZiBWRVJTSU9OICovCi0KLS8qIFNob3VsZCBnYXMgdXNlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZXM/ICAqLwotI3VuZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogU29tZSBhc3NlcnQvcHJlcHJvY2Vzc29yIGNvbWJpbmF0aW9ucyBhcmUgaW5jYXBhYmxlIG9mIGhhbmRsaW5nCi0gICBjZXJ0YWluIGtpbmRzIG9mIGNvbnN0cnVjdHMgaW4gdGhlIGFyZ3VtZW50IG9mIGFzc2VydC4gIEZvciBleGFtcGxlLAotICAgcXVvdGVkIHN0cmluZ3MgKGlmIHJlcXVvdGluZyBpc24ndCBkb25lIHJpZ2h0KSBvciBuZXdsaW5lcy4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBCUk9LRU5fQVNTRVJUCi0jZWxzZQotI2RlZmluZSBCUk9LRU5fQVNTRVJUCi0jZW5kaWYKLQotLyogSWYgd2UgYXJlbid0IGRvaW5nIGNyb3NzLWFzc2VtYmxpbmcsIHNvbWUgb3BlcmF0aW9ucyBjYW4gYmUgb3B0aW1pemVkLAotICAgc2luY2UgYnl0ZSBvcmRlcnMgYW5kIHZhbHVlIHNpemVzIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLwotI3VuZGVmIENST1NTX0NPTVBJTEUKLQotLyogU29tZSBnYXMgY29kZSB3YW50cyB0byBrbm93IHRoZXNlIHBhcmFtZXRlcnMuICAqLwotI2RlZmluZSBUQVJHRVRfQUxJQVMJInZtcyIKLSNkZWZpbmUgVEFSR0VUX0NQVQkidmF4IgotI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMCSJ2YXgtZGVjLXZtcyIKLSNkZWZpbmUgVEFSR0VUX09TCSJ2bXMiCi0jZGVmaW5lIFRBUkdFVF9WRU5ET1IJImRlYyIKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgc3Ryc3RyLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBtYWxsb2MgYW5kIHJlYWxsb2MuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIGZyZWUuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBzYnJrLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogU29tZXRpbWVzIGVycm5vLmggZG9lc24ndCBkZWNsYXJlIGVycm5vIGl0c2VsZi4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCi0jdW5kZWYgTUFOWV9TRUdNRU5UUwotCi0vKiBUaGUgY29uZmlndXJlIHNjcmlwdCBkZWZpbmVzIHRoaXMgZm9yIHNvbWUgdGFyZ2V0cyBiYXNlZCBvbiB0aGUKLSAgIHRhcmdldCBuYW1lIHVzZWQuICBJdCBpcyBub3QgYWx3YXlzIGRlZmluZWQuICAqLwotI3VuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBzb21lIGNvbmZpZ3VyYXRpb25zIHRoYXQgY2FuIHByb2R1Y2UgbXVsdGlwbGUgb3V0cHV0Ci0gICBmb3JtYXRzLiAgKi8KLSN1bmRlZiBERUZBVUxUX0VNVUxBVElPTgotI3VuZGVmIEVNVUxBVElPTlMKLSN1bmRlZiBVU0VfRU1VTEFUSU9OUwotI3VuZGVmIE9CSl9NQVlCRV9BT1VUCi0jdW5kZWYgT0JKX01BWUJFX0JPVVQKLSN1bmRlZiBPQkpfTUFZQkVfQ09GRgotI3VuZGVmIE9CSl9NQVlCRV9FQ09GRgotI3VuZGVmIE9CSl9NQVlCRV9FTEYKLSN1bmRlZiBPQkpfTUFZQkVfR0VORVJJQwotI3VuZGVmIE9CSl9NQVlCRV9IUDMwMAotI3VuZGVmIE9CSl9NQVlCRV9JRUVFCi0jdW5kZWYgT0JKX01BWUJFX1NPTQotI3VuZGVmIE9CSl9NQVlCRV9WTVMKLQotLyogVXNlZCBmb3Igc29tZSBvZiB0aGUgQ09GRiBjb25maWd1cmF0aW9ucywgd2hlbiB0aGUgQ09GRiBjb2RlIG5lZWRzCi0gICB0byBzZWxlY3Qgc29tZXRoaW5nIGJhc2VkIG9uIHRoZSBDUFUgdHlwZSBiZWZvcmUgaXQga25vd3MgaXQuLi4gKi8KLSN1bmRlZiBJMzg2Q09GRgotI3VuZGVmIE02OEtDT0ZGCi0jdW5kZWYgTTg4S0NPRkYKLQotLyogVXNpbmcgY2dlbiBjb2RlPyAgKi8KLSN1bmRlZiBVU0lOR19DR0VOCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBzcGFyYyBjb25maWd1cmF0aW9uLiAgKi8KLSN1bmRlZiBERUZBVUxUX0FSQ0gKLQotLyogTmVlZGVkIG9ubHkgZm9yIFBvd2VyUEMgU29sYXJpcy4gICovCi0jdW5kZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotCi0vKiBOZWVkZWQgb25seSBmb3IgU0NPIDUuICAqLwotI3VuZGVmIFNDT19FTEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW1vdmUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1JFTU9WRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotLyogc2JyaygpIGlzIGF2YWlsYWJsZSwgYnV0IHdlIGRvbid0IHdhbnQgZ2FzIHRvIHVzZSBpdC4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VOTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRVJSTk9fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUVNT1JZX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBIQVZFX1NZU19UWVBFU19ICi0jZWxzZQotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNlbmRpZgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9ICS8qIGNvbmZpZy1nYXMuY29tIHdpbGwgbWFrZSBvbmUgaWYgbmVjZXNzYXJ5ICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFSQVJHU19ICi0KLS8qIFZNUy1zcGVjaWZpYzogIHdlIG5lZWQgdG8gc2V0IHVwIEVYSVRfeHh4IGhlcmUgYmVjYXVzZSB0aGUgZGVmYXVsdAotICAgdmFsdWVzIGluIGFzLmggYXJlIGluYXBwcm9wcmlhdGUgZm9yIFZNUywgYnV0IHdlIGFsc28gd2FudCB0byBwcmV2ZW50Ci0gICBhcy5oJ3MgaW5jbHVzaW9uIG9mIDxzdGRsaWIuaD4gZnJvbSB0cmlnZ2VyaW5nIHJlZGVmaW5pdGlvbiB3YXJuaW5ncy4KLSAgIDxzdGRsaWIuaD4gZ3VhcmRzIGl0c2VsZiBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiwgc28gaW5jbHVkaW5nIGl0Ci0gICBoZXJlIHR1cm5zIGFzLmgncyBsYXRlciAjaW5jbHVkZSBpbnRvIGEgbm8tb3AuICAoV2UgY2FuJ3Qgc2ltcGx5IHVzZQotICAgI2lmbmRlZiBIQVZFX1NURExJQl9IIGhlcmUsIGJlY2F1c2UgdGhlIDxzdGRsaWIuaD4gaW4gc2V2ZXJhbCBvbGRlcgotICAgZ2NjLXZtcyBkaXN0cmlidXRpb25zIG5lZ2xlY3RzIHRvIGRlZmluZSB0aGVzZSB0d28gcmVxdWlyZWQgbWFjcm9zLikgICovCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI3VuZGVmIEVYSVRfU1VDQ0VTUwotI3VuZGVmIEVYSVRfRkFJTFVSRQotI2VuZGlmCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAxCQkJLyogU1MkX05PUk1BTCwgU1RTJEtfU1VDQ0VTUyAqLwotI2RlZmluZSBFWElUX0ZBSUxVUkUgMHgxMDAwMDAwMgkJLyogKFNUUyRLX0VSUk9SIHwgU1RTJE1fSU5ISUJfTVNHKSAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZ3VyZSBiL2dhcy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2NWY4YWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDU5MTQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMy4xIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWJmZC1hc3NlbWJsZXIgIHVzZSBCRkQgYmFjayBlbmQgZm9yIHdyaXRpbmcgb2JqZWN0IGZpbGVzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgICB0YXJnZXRzICAgICAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIGJlc2lkZXMgdGhlIHByaW1hcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzLjEiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9YXMuaAotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgICB0ZXN0IC1mICIkY2FjaGVfZmlsZSIgJiYgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiCi1hY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIKLWFjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU3MDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hvc3QiID0gIngiIHx8ICh0ZXN0ICJ4JGhvc3QiICE9ICJ4Tk9ORSIgJiYgdGVzdCAieCRob3N0IiAhPSAieCRhY19jdl9ob3N0X2FsaWFzIik7IHRoZW4KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLQotICBhY19jdl9ob3N0X2FsaWFzPSRob3N0Ci0gIGNhc2UgIiRhY19jdl9ob3N0X2FsaWFzIiBpbgotICBOT05FKQotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgIE5PTkUpCi0gICAgICBpZiBhY19jdl9ob3N0X2FsaWFzPWAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgIGZpIDs7Ci0gICAgKikgYWNfY3ZfaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgCi0gIGFjX2N2X2hvc3RfY3B1PWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLSAgYWNfY3ZfaG9zdF92ZW5kb3I9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl9ob3N0X29zPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVsc2UKLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaG9zdCIgMT4mNgotCi1ob3N0PSRhY19jdl9ob3N0Ci1ob3N0X2FsaWFzPSRhY19jdl9ob3N0X2FsaWFzCi1ob3N0X2NwdT0kYWNfY3ZfaG9zdF9jcHUKLWhvc3RfdmVuZG9yPSRhY19jdl9ob3N0X3ZlbmRvcgotaG9zdF9vcz0kYWNfY3ZfaG9zdF9vcwotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjExOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotaWYgdGVzdCAieCRhY19jdl90YXJnZXQiID0gIngiIHx8ICh0ZXN0ICJ4JHRhcmdldCIgIT0gInhOT05FIiAmJiB0ZXN0ICJ4JHRhcmdldCIgIT0gIngkYWNfY3ZfdGFyZ2V0X2FsaWFzIik7IHRoZW4KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLQotICBhY19jdl90YXJnZXRfYWxpYXM9JHRhcmdldAotICBjYXNlICIkYWNfY3ZfdGFyZ2V0X2FsaWFzIiBpbgotICBOT05FKQotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgIE5PTkUpCi0gICAgICBhY19jdl90YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLQotICAgICopIGFjX2N2X3RhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfdGFyZ2V0PWAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzYAotICBhY19jdl90YXJnZXRfY3B1PWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotICBhY19jdl90YXJnZXRfdmVuZG9yPWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl90YXJnZXRfb3M9YGVjaG8gJGFjX2N2X3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lbHNlCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3RhcmdldCIgMT4mNgotCi10YXJnZXQ9JGFjX2N2X3RhcmdldAotdGFyZ2V0X2FsaWFzPSRhY19jdl90YXJnZXRfYWxpYXMKLXRhcmdldF9jcHU9JGFjX2N2X3RhcmdldF9jcHUKLXRhcmdldF92ZW5kb3I9JGFjX2N2X3RhcmdldF92ZW5kb3IKLXRhcmdldF9vcz0kYWNfY3ZfdGFyZ2V0X29zCi0KLQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY1MTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotaWYgdGVzdCAieCRhY19jdl9idWlsZCIgPSAieCIgfHwgKHRlc3QgIngkYnVpbGQiICE9ICJ4Tk9ORSIgJiYgdGVzdCAieCRidWlsZCIgIT0gIngkYWNfY3ZfYnVpbGRfYWxpYXMiKTsgdGhlbgotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0gIGlmICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotCi0gIGFjX2N2X2J1aWxkX2FsaWFzPSRidWlsZAotICBjYXNlICIkYWNfY3ZfYnVpbGRfYWxpYXMiIGluCi0gIE5PTkUpCi0gICAgY2FzZSAkbm9ub3B0IGluCi0gICAgTk9ORSkKLSAgICAgIGFjX2N2X2J1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0KLSAgICAqKSBhY19jdl9idWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfYnVpbGQ9YCRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhc2AKLSAgYWNfY3ZfYnVpbGRfY3B1PWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0gIGFjX2N2X2J1aWxkX3ZlbmRvcj1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl9idWlsZF9vcz1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWxzZQotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9idWlsZCIgMT4mNgotCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWJ1aWxkX2FsaWFzPSRhY19jdl9idWlsZF9hbGlhcwotYnVpbGRfY3B1PSRhY19jdl9idWlsZF9jcHUKLWJ1aWxkX3ZlbmRvcj0kYWNfY3ZfYnVpbGRfdmVuZG9yCi1idWlsZF9vcz0kYWNfY3ZfYnVpbGRfb3MKLQotCi0KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3Mjg6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIHB3cGx1cyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4NTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODQyOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1nYXMKLQotVkVSU0lPTj0yLjkuNQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg4ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFDTE9DQUw9YWNsb2NhbAotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBQ0xPQ0FMPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhY2xvY2FsIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MDE6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9DT05GPWF1dG9jb25mCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9DT05GPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvY29uZiIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTE0OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTI3OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvaGVhZGVyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0hFQURFUj1hdXRvaGVhZGVyCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9IRUFERVI9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9oZWFkZXIiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk0MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKG1ha2VpbmZvIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgTUFLRUlORk89bWFrZWluZm8KLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgTUFLRUlORk89IiRtaXNzaW5nX2Rpci9taXNzaW5nIG1ha2VpbmZvIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zaGFyZWQ9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zdGF0aWM9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIG9yIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9mYXN0X2luc3RhbGwiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19SQU5MSUIrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DQytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DQytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiogfCAqQ1lHV0lOKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DQytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTY5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTE4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMTE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIxNjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfZ2NjK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIyNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjQ0OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfY2NfZytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgotICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI4NzogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxMTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzE0OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfTEQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1ItOn0iCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzQ5OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19nbnVfbGQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzY1OiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfTk0rc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1ItOn0iCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm0gfHwgdGVzdCAtZiAkYWNfZGlyL25tJGFjX2V4ZWV4dCA7IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpCi1maQotCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1lY2hvICIkYWNfdCIiJE5NIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MDE6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfTE5fUytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWNhc2UgIiR0YXJnZXQiIGluCi1OT05FKSBsdF90YXJnZXQ9IiRob3N0IiA7OwotKikgbHRfdGFyZ2V0PSIkdGFyZ2V0IiA7OwotZXNhYwotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgOgotZmkKLQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiA9IHhubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLXRlc3QgeCIkc2lsZW50IiA9IHh5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkbHRfdGFyZ2V0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNDUwICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDUxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NzI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2x0X2N2X2NjX25lZWRzX2JlbGYrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDc3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDg0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotCi1lc2FjCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIExERkxBR1M9IiRMREZMQUdTIiBMSUJTPSIkTElCUyIgXAotTE5fUz0iJExOX1MiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIE9CSkRVTVA9IiRPQkpEVU1QIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGx0X3RhcmdldCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgICAgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiICYmIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0KLXVzZXJfYmZkX2dhcz0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1iZmQtYXNzZW1ibGVyIG9yIC0tZGlzYWJsZS1iZmQtYXNzZW1ibGVyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2JmZF9hc3NlbWJsZXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2JmZF9hc3NlbWJsZXIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBuZWVkX2JmZD15ZXMgdXNlcl9iZmRfZ2FzPXllcyA7OwotICBubykgIHVzZXJfYmZkX2dhcz1ubyA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgYmZkLWFzc2VtYmxlciBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQotCSAgICA7OwotICBubykJICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKQkgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3IgLS1kaXNhYmxlLWNvbW1vbmJmZGxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jb21tb25iZmRsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NvbW1vbmJmZGxpYiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi11c2luZ19jZ2VuPW5vCi0KLSMgR2VuZXJhdGUgYSBoZWFkZXIgZmlsZQotCi0KLQotCi0jIElmIHdlIGFyZSBvbiBhIERPUyBmaWxlc3lzdGVtLCB3ZSBtdXN0IHVzZSBnZGIuaW5pIHJhdGhlciB0aGFuCi0jIC5nZGJpbml0LgotR0RCSU5JVD0iLmdkYmluaXQiCi1jYXNlICIke2hvc3R9IiBpbgotICAqLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cyopCi0gICAgR0RCSU5JVD0iZ2RiLmluaSIKLSAgICA7OwotZXNhYwotCi0KLXRlX2ZpbGU9Z2VuZXJpYwotCi0jIE1ha2VmaWxlIHRhcmdldCBmb3IgaW5zdGFsbGluZyBnYXMgaW4gJCh0b29sZGlyKS9iaW4uCi1pbnN0YWxsX3Rvb2xkaXI9aW5zdGFsbC1leGVjLXRvb2xkaXIKLQotY2Fub25fdGFyZ2V0cz0iIgotYWxsX3RhcmdldHM9bm8KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gIGZvciB0IGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgOyBkbwotICAgIGlmIHRlc3QgJHQgPSAiYWxsIjsgdGhlbgotICAgICAgYWxsX3RhcmdldHM9eWVzCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdCAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLSAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0jICAgIGVsc2UKLSMgICAgICAjIFBlcm1pdCAiYWxsIiwgZXRjLiAgV2UgZG9uJ3Qgc3VwcG9ydCBpdCB5ZXQgdGhvdWdoLgotIyAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0IgotICAgIGZpCi0gIGRvbmUKLSAgX2dhc191bmlxX2xpc3Q9IiRjYW5vbl90YXJnZXRzIgotX2dhc191bmlxX25ld2xpc3Q9IiIKLWZvciBfZ2FzX3VuaXFfaSBpbiBfZ2FzX3VuaXFfZHVtbXkgJF9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSAkX2dhc191bmlxX2kgaW4KLSAgX2dhc191bmlxX2R1bW15KSA7OwotICAqKSBjYXNlICIgJF9nYXNfdW5pcV9uZXdsaXN0ICIgaW4KLSAgICAgICAqIiAkX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IiRfZ2FzX3VuaXFfbmV3bGlzdCAkX2dhc191bmlxX2kiIDs7Ci0gICAgIGVzYWMgOzsKLSAgZXNhYwotZG9uZQotY2Fub25fdGFyZ2V0cz0kX2dhc191bmlxX25ld2xpc3QKLQotZmkKLQotZW11bGF0aW9ucz0iIgotCi1mb3IgdGhpc190YXJnZXQgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cyA7IGRvCi0KLSAgICBldmFsIGBlY2hvICR0aGlzX3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL2NwdT1cMSB2ZW5kb3I9XDIgb3M9XDMvJ2AKLQotICAgICMgY2hlY2sgZm9yIGFyY2hpdGVjdHVyZSB2YXJpYW50cwotICAgIGFyY2g9Ci0gICAgZW5kaWFuPQotICAgIGNhc2UgJHtjcHV9IGluCi0gICAgICBhbHBoYSopCQljcHVfdHlwZT1hbHBoYSA7OwotICAgICAgYXJtZWIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OwotICAgICAgYXJtKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm12KmwpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtdipiKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1iaWcgOzsKLSAgICAgIHN0cm9uZ2FybSopCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICB0aHVtYiopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgaHBwYSopCQljcHVfdHlwZT1ocHBhIDs7Ci0gICAgICBpWzQ1Nl04NikJCWNwdV90eXBlPWkzODYgOzsKLSAgICAgIG02ODBbMDEyMzQ2XTApCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG02ODAwOCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG02ODM/PykJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG01MjAwKQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTgqKQkJY3B1X3R5cGU9bTg4ayA7OwotICAgICAgbWlwcyplbCkJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcyopCQljcHVfdHlwZT1taXBzIGVuZGlhbj1iaWcgOzsKLSAgICAgIHBqbCopCQljcHVfdHlwZT1waiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBwaiopCQljcHVfdHlwZT1waiBlbmRpYW49YmlnIDs7Ci0gICAgICBwb3dlcnBjbGUqKQljcHVfdHlwZT1wcGMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgcG93ZXJwYyopCQljcHVfdHlwZT1wcGMgZW5kaWFuPWJpZyA7OwotICAgICAgcnM2MDAwKikJCWNwdV90eXBlPXBwYyA7OwotICAgICAgc3BhcmNsaXRlKikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsKLSAgICAgIHNwYXJjbGV0KikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xldCA7OwotICAgICAgc3BhcmM2NCopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXY5LTY0IDs7Ci0gICAgICBzcGFyYzg2eCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmM4NnggIDs7Ci0gICAgICBzcGFyYyopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGl0ZSA7OyAjID8/PyBTZWUgdGMtc3BhcmMuYy4KLSAgICAgIHY4NTAqKQkJY3B1X3R5cGU9djg1MCA7OwotICAgICAgKikJCWNwdV90eXBlPSR7Y3B1fSA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgdGFyZ2V0X2NwdV90eXBlPSR7Y3B1X3R5cGV9Ci0gICAgZWxpZiB0ZXN0ICR7dGFyZ2V0X2NwdV90eXBlfSAhPSAke2NwdV90eXBlfSA7IHRoZW4KLSAgICAgIGNvbnRpbnVlCi0gICAgZmkKLQotICAgIGdlbmVyaWNfdGFyZ2V0PSR7Y3B1X3R5cGV9LSR2ZW5kb3ItJG9zCi0gICAgZGV2PW5vCi0gICAgYmZkX2dhcz1ubwotICAgIGVtPWdlbmVyaWMKLQotICAgICMgYXNzaWduIG9iamVjdCBmb3JtYXQKLSAgICBjYXNlICR7Z2VuZXJpY190YXJnZXR9IGluCi0gICAgICBhMjlrLSotY29mZikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLXVkaSkgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1hbWQtZWJtb24pICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLW55dS1zeW0xKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstKi12eHdvcmtzKikgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBhbHBoYSotKi0qdm1zKikJICAgIGZtdD1ldmF4IDs7Ci0gICAgICBhbHBoYSotKi1uZXR3YXJlKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vcGVuYnNkKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vc2YqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eGVjb2ZmKikgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eC1nbnUqKSAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgYWxwaGEqLSotbmV0YnNkKikgICAgIGZtdD1lbGYgZW09bmJzZCA7OwotCi0gICAgICBhcmMtKi1lbGYqKSAgICAgICAgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBhcm0tKi1hb3V0KQkgICAgICAgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGFybS0qLWNvZmYgfCB0aHVtYi0qLWNvZmYpICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYXJtLSotZWxmIHwgdGh1bWItKi1lbGYpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybSotKi1jb25peCopCQkJZm10PWVsZiA7OwotICAgICAgYXJtLSotbGludXgqYW91dCopCSAgICAgICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIGFybSotKi1saW51eC1nbnUqKQkJZm10PWVsZiAgZW09bGludXggOzsKLSAgICAgIGFybS0qLW5ldGJzZCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKi1vYWJpIHwgdGh1bWItKi1vYWJpKSAgICAgICAgZm10PWVsZiA7OwotICAgICAgYXJtLWVwb2MtcGUgfCB0aHVtYi1lcG9jLXBlKSAgICAgIGZtdD1jb2ZmIGVtPWVwb2MtcGUgOzsKLSAgICAgIGFybS0qLXdpbmNlKSAgICAgICAgICBmbXQ9Y29mZiBlbT13aW5jZS1wZSBiZmRfZ2FzPXllczs7Ci0gICAgICBhcm0tKi1wZSB8IHRodW1iLSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGFybS0qLXJpc2NpeCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1yaXNjaXggOzsKLQotICAgICAgYXZyLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIGQxMHYtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGQzMHYtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotCi0gICAgICBmcjMwLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIGhwcGEtKi0qZWxmKikgICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1saXRlcyopICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1vc2YqKSAgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ydGVtcyopICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ocHV4KikgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1tcGVpeCopICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ic2QqKSAgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1oaXV4KikgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLQotICAgICAgaDgzMDAtKi1jb2ZmKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIGkzNzAtKi1lbGYqIHwgaTM3MC0qLWxpbnV4KikgZm10PWVsZiA7OwotICAgICAgaTM4Ni1pYm0tYWl4KikgICAgICAgIGZtdD1jb2ZmIGVtPWkzODZhaXggOzsKLSAgICAgIGkzODYtc2VxdWVudC1ic2QqKSAgICBmbXQ9YW91dCBlbT1keW5peCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJlb3NwZSopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc2VsZiogfCBpMzg2LSotYmVvcyopIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1ic2QqKSAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QwLjgpICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1saW51eCphb3V0KiB8IGkzODYtKi1saW51eG9sZGxkKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBpMzg2LSotbGludXgqY29mZiopICAgZm10PWNvZmYgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgaTM4Ni0qLXN5c3Y0KiB8IGkzODYtKi1zb2xhcmlzKiB8IGkzODYtKi1lbGYpCi0JCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWZyZWVic2Rhb3V0KiB8IGkzODYtKi1mcmVlYnNkMTIuKiB8IGkzODYtKi1mcmVlYnNkMTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09Mzg2YnNkIDs7Ci0gICAgICBpMzg2LSotZnJlZWJzZCopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotY29mZiB8IGkzODYtKi1zeXN2KiB8IGkzODYtKi1zY28zLjJ2NSpjb2ZmIHwgaTM4Ni0qLWlzYyopCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotc2NvMy4ydjUqKSAgICAgIGZtdD1lbGYKLQkJCSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldDsgdGhlbgotCQkJCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTQ09fRUxGIDEKLUVPRgotCi0JCQkgICAgZmkKLQkJCSAgICA7OwotICAgICAgaTM4Ni0qLXNjbzMuMiopICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotdnN0YSkgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGkzODYtKi1tc2Rvc2RqZ3BwKiB8IGkzODYtKi1nbzMyKiB8IGkzODYtZ28zMi1ydGVtcyopCi0JCQkgICAgZm10PWNvZmYgZW09Z28zMjs7Ci0gICAgICBpMzg2LSotcnRlbXNlbGYqKSAgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLXJ0ZW1zKikgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotZ251KikgICAgICAgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLW1hY2gqKQotCQkJICAgIGZtdD1hb3V0IGVtPW1hY2ggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1tc2RvcyopICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTM4Ni0qLW1vc3MqKQkgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLXBlKSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBpMzg2LSotY3lnd2luKikgICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1pbnRlcml4KikJICAgIGZtdD1jb2ZmIGVtPWludGVyaXggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1taW5ndzMyKikgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLSpudCopICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBpMzg2LSotdnh3b3JrcyopICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGk5NjAtKi1ib3V0KSAgICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi1uaW5keSopICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M0KikgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuMCkgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNS4qKSAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3MqKSAgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLQotICAgICAgbTMyci0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBtNjhrLSotdnh3b3JrcyogfCBtNjhrLWVyaWNzc29uLW9zZSB8IG02OGstKi1zdW5vcyopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgbTY4ay1tb3Rvcm9sYS1zeXN2KikgIGZtdD1jb2ZmIGVtPWRlbHRhIDs7Ci0gICAgICBtNjhrLWJ1bGwtc3lzdjMqKSAgICAgZm10PWNvZmYgZW09ZHB4MiA7OwotICAgICAgbTY4ay1hcG9sbG8tKikgICAgICAgIGZtdD1jb2ZmIGVtPWFwb2xsbyA7OwotICAgICAgbTY4ay0qLXN5c3Y0KikgIyBtdXN0IGJlIGJlZm9yZSAtc3lzdioKLQkJCSAgICBmbXQ9ZWxmIGVtPXN2cjQgOzsKLSAgICAgIG02OGstKi1lbGYqKQkgICAgZm10PWVsZiA7OwotICAgICAgbTY4ay0qLWNvZmYgfCBtNjhrLSotc3lzdiogfCBtNjhrLSotcnRlbXMqKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBtNjhrLSotaHB1eCopICAgICAgICAgZm10PWhwMzAwIGVtPWhwMzAwIDs7Ci0gICAgICBtNjhrLSotbGludXgqYW91dCopICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIG02OGstKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotZ251KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBtNjhrLSotbmV0YnNkKikgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgbTY4ay0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstYXBwbGUtYXV4KikgICAgICBmbXQ9Y29mZiBlbT1hdXggOzsKLSAgICAgIG02OGstKi1wc29zKikgICAgICAgICBmbXQ9ZWxmIGVtPXBzb3M7OwotCi0gICAgICBtODhrLW1vdG9yb2xhLXN5c3YzKikgZm10PWNvZmYgZW09ZGVsdDg4IDs7Ci0gICAgICBtODhrLSotY29mZiopICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgbWNvcmUtKi1lbGYpCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtY29yZS0qLXBlKQkgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgIyBkb24ndCBjaGFuZ2UgZW0gbGlrZSAqLSotYnNkIGRvZXMKLSAgICAgIG1pcHMtZGVjLW5ldGJzZCopCSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLW9wZW5ic2QqKSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLWJzZCopICAgICAgICBmbXQ9YW91dCBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLXNvbnktYnNkKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotYnNkKikgICAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbmtub3duIHZlbmRvciBmb3IgbWlwcy1ic2QgY29uZmlndXJhdGlvbi4iIDE+JjI7IGV4aXQgMTsgfSA7OwotICAgICAgbWlwcy0qLXVsdHJpeCopICAgICAgIGZtdD1lY29mZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLSotb3NmKikgICAgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtKi1lY29mZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1lY29mZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1wZSopICAgICAgICAgICBmbXQ9Y29mZiBlbmRpYW49bGl0dGxlIGVtPXBlIDs7Ci0gICAgICBtaXBzLSotaXJpeDYqKQkgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLWlyaXg1KikgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi1pcml4KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1sbmV3cyopICAgICAgICBmbXQ9ZWNvZmYgZW09bG5ld3MgOzsKLSAgICAgIG1pcHMtKi1yaXNjb3MqKSAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1zeXN2KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1lbGYqIHwgbWlwcy0qLXJ0ZW1zKiB8IG1pcHMtKi1saW51eC1nbnUqIHwgbWlwcy0qLWdudSogfCBtaXBzLSotb3BlbmJzZCopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLXZ4d29ya3MqKSAgICAgIGZtdD1lbGYKLQkJCSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTUlQU19TVEFCU19FTEYgMQotRU9GCi0KLQkJCSAgICA7OwotICAgICAgbW4xMDIwMC0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtbjEwMzAwLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHBqKikJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBwcGMtKi1wZSB8IHBwYy0qLWN5Z3dpbiogfCBwcGMtKi13aW5udCopCi0JCSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBwcGMtKi1haXgqKSAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHBwYy0qLWJlb3MqKSAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgcHBjLSotKmJzZCogfCBwcGMtKi1lbGYqIHwgcHBjLSotZWFiaSogfCBwcGMtKi1zeXN2NCopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotbGludXgtZ251KikJICAgIGZtdD1lbGYKLQkJCSAgICBjYXNlICIkZW5kaWFuIiBpbgotCQkJICAgIGJpZykgIDs7Ci0JCQkgICAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHTlUvTGludXggbXVzdCBiZSBjb25maWd1cmVkIGJpZyBlbmRpYW4iIDE+JjI7IGV4aXQgMTsgfSA7OwotCQkJICAgIGVzYWMKLQkJCSAgICA7OwotICAgICAgcHBjLSotc29sYXJpcyopCSAgICBmbXQ9ZWxmCi0JCQkgICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQ7IHRoZW4KLQkJCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVCAxCi1FT0YKLQotCQkJICAgIGZpCi0JCQkgICAgaWYgdGVzdCB4JHtlbmRpYW59ID0geGJpZzsgdGhlbgotCQkJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogU29sYXJpcyBtdXN0IGJlIGNvbmZpZ3VyZWQgbGl0dGxlIGVuZGlhbiIgMT4mMjsgZXhpdCAxOyB9Ci0JCQkgICAgZmkKLQkJCSAgICA7OwotICAgICAgcHBjLSotcnRlbXMqKQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotbWFjb3MqIHwgcHBjLSotbXB3KikKLQkJCSAgICBmbXQ9Y29mZiBlbT1tYWNvcyA7OwotICAgICAgcHBjLSotbmV0d2FyZSopICAgICAgIGZtdD1lbGYgZW09cHBjbncgOzsKLSAgICAgIHBwYy0qLXZ4d29ya3MqKSAgICAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIHNoLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIHNoLSotY29mZiopICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgc2gtKi1wZSopICAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzOzsKLSAgICAgIHNoLSotcnRlbXNlbGYqKSAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzaC0qLXJ0ZW1zKikJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG5zMzJrLXBjNTMyLW1hY2gqIHwgbnMzMmstcGM1MzItdXgqKSAgICBmbXQ9YW91dCBlbT1wYzUzMm1hY2ggOzsKLSAgICAgIG5zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopICBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7Ci0gICAgICBuczMyay1wYzUzMi1vcGVuYnNkKikgZm10PWFvdXQgZW09bmJzZDUzMiA7OwotCi0gICAgICBzcGFyYy0qLXJ0ZW1zKikgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIHNwYXJjLSotc3Vub3M0KikgICAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICBzcGFyYy0qLWFvdXQgfCBzcGFyYyotKi12eHdvcmtzKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zcGFyY2FvdXQgOzsKLSAgICAgIHNwYXJjLSotY29mZikgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3BhcmMtKi1saW51eCphb3V0KikgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBzcGFyYy0qLWxpbnV4LWdudSopICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgc3BhcmMtKi1seW54b3MqKSAgICAgIGZtdD1jb2ZmIGVtPWx5bnggOzsKLSAgICAgIHNwYXJjLWZ1aml0c3Utbm9uZSkgICBmbXQ9YW91dCA7OwotICAgICAgc3BhcmMtKi1lbGYgfCBzcGFyYy0qLXN5c3Y0KiB8IHNwYXJjLSotc29sYXJpcyopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgc3BhcmMtKi1uZXRic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKLSAgICAgIHNwYXJjLSotb3BlbmJzZCopICAgICBmbXQ9YW91dCBlbT1uYnNkIDs7Ci0KLSAgICAgIHN0cm9uZ2FybS0qLWNvZmYpICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3Ryb25nYXJtLSotZWxmKSAgICAgIGZtdD1lbGYgOzsKLQotICAgICAgdGljMzAtKi0qYW91dCopCSAgICBmbXQ9YW91dCBiZmRfZ2FzPXllcyA7OwotICAgICAgdGljMzAtKi0qY29mZiopICAgICAgIGZtdD1jb2ZmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB0aWM4MC0qLSopCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICB2ODUwLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZWEtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICB2YXgtKi1ic2QqIHwgdmF4LSotdWx0cml4KikKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgdmF4LSotdm1zKSAgICAgICAgICAgIGZtdD12bXMgOzsKLQotCi0gICAgICB6OGstKi1jb2ZmIHwgejhrLSotc2ltKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIHc2NS0qLSopICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICAqLSotYW91dCB8ICotKi1zY291dCkKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5pbmR5KikKLQkJCSAgICBmbXQ9Ym91dCA7OwotICAgICAgKi0qLWJzZCopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgKi0qLWdlbmVyaWMpICAgICAgICAgIGZtdD1nZW5lcmljIDs7Ci0gICAgICAqLSoteHJheSB8ICotKi1obXMpICAgZm10PWNvZmYgOzsKLSAgICAgICotKi1zaW0pICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgKi0qLWVsZiB8ICotKi1zeXN2NCogfCAqLSotc29sYXJpcyopCi0JCQkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBHQVMgc3VwcG9ydCBmb3IgJHtnZW5lcmljX3RhcmdldH0gaXMgaW5jb21wbGV0ZS4iIDE+JjIKLQkJCSAgICBmbXQ9ZWxmIGRldj15ZXMgOzsKLSAgICAgICotKi12eHdvcmtzKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5ldHdhcmUpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIGVuZGlhbl9kZWY9Ci0gICAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JZW5kaWFuX2RlZj0xCi0gICAgICBlbGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhsaXR0bGU7IHRoZW4KLQllbmRpYW5fZGVmPTAKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IHgke2VuZGlhbl9kZWZ9ICE9IHg7IHRoZW4KLQljYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAkZW5kaWFuX2RlZgotRU9GCi0KLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGNhc2UgJHtjcHVfdHlwZX0tJHtmbXR9IGluCi0gICAgICBhbHBoYSotKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIGFybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICMgbm90IHlldAotICAgICMgaTM4Ni1hb3V0KQliZmRfZ2FzPXByZWZlcnJlZCA7OwotICAgICAgbWlwcy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgbnMzMmstKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHBwYy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgc3BhcmMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHN0cm9uZ2FybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lbGYpCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLWVjb2ZmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1zb20pCWJmZF9nYXM9eWVzIDs7Ci0gICAgI2VuYWJsZSBiZmQgZm9yIGNvZmYgYW5kIGFvdXQgdG8gYWxsb3cgdGVzdGluZyBpZiBhIGJmZCB0YXJnZXQgaXMKLSAgICAjdGhlIHByaW1hcnkgdGFyZ2V0LCBidXQgbm90IGZvciBjb2ZmIG9yIGFvdXQgYXMgdGhlIHByaW1hcnkgdGFyZ2V0Ci0gICAgICBpMzg2LWNvZmYpCWlmIHRlc3QgeCR7cHJpbWFyeV9iZmRfZ2FzfSA9IHh5ZXM7IHRoZW4gYmZkX2dhcz15ZXM7IGZpIDs7Ci0gICAgICBpMzg2LWFvdXQpCWlmIHRlc3QgeCR7cHJpbWFyeV9iZmRfZ2FzfSA9IHh5ZXM7IHRoZW4gYmZkX2dhcz15ZXM7IGZpIDs7Ci0gICAgICAqKQkJOzsKLSAgICBlc2FjCi0KLSMgT3RoZXIgcmFuZG9tIHN0dWZmLgotCi0gICAgIyBEbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci0gICAgY2FzZSAke2NwdV90eXBlfSBpbgotICAgICAgdmF4IHwgaTM4NiB8IHRpYzMwKQotCTs7Ci0KLSAgICAgICopCi0JbmVlZF9vcGNvZGVzPXllcwotCi0JY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLQl5ZXMpIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqb3Bjb2RlcyopIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqKSBzaGFyZWRfb3Bjb2Rlcz1mYWxzZSA7OwotCWVzYWMKLQlpZiB0ZXN0ICIke3NoYXJlZF9vcGNvZGVzfSIgPSAidHJ1ZSI7IHRoZW4KLQkgICMgQSBzaGFyZWQgbGlib3Bjb2RlcyBtdXN0IGJlIGxpbmtlZCBhZ2FpbnN0IGxpYmJmZC4KLQkgIG5lZWRfYmZkPXllcwotCWZpCi0JOzsKLSAgICBlc2FjCi0KLSAgICAjIEFueSBvdGhlciBzcGVjaWFsIG9iamVjdCBmaWxlcyBuZWVkZWQgPwotICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KLSAgICAgIGZyMzAgfCBtMzJyKQotCXVzaW5nX2NnZW49eWVzCi0JOzsKLQotICAgICAgbTY4aykKLQljYXNlICR7ZXh0cmFfb2JqZWN0c30gaW4KLQkqbTY4ay1wYXJzZS5vKikgOzsKLQkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBtNjhrLXBhcnNlLm8iIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIG1pcHMpCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1wYXJzZS5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1wYXJzZS5vIgotCWZpCi0KLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLWxleC5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1sZXgubyIKLQlmaQotCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1vcHMubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0Ymwtb3BzLm8iCi0JZmkKLQk7OwotCi0gICAgICBzcGFyYykKLQlpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCi0JICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBERUZBVUxUX0FSQ0ggIiR7YXJjaH0iCi1FT0YKLQotCWZpCi0JOzsKLSAgICAgICopCi0JOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotCWNhc2UgIngke2V4dHJhX29iamVjdHN9IiBpbgotCSpjZ2VuLm8qKSA7OwotCSopIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGNnZW4ubyIgOzsKLQllc2FjCi0gICAgZmkKLQotIyBTZWUgaWYgd2UgcmVhbGx5IGNhbiBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBlbXVsYXRpb24gY29kZS4KLQotICAgIGlmIHRlc3QgJHRoaXNfdGFyZ2V0ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHByaW1hcnlfYmZkX2dhcz0kYmZkX2dhcwotICAgICAgb2JqX2Zvcm1hdD0kZm10Ci0gICAgICB0ZV9maWxlPSRlbQotCi0gICAgICBpZiB0ZXN0ICRiZmRfZ2FzID0gbm8gOyB0aGVuCi0JIyBDYW4ndCBzdXBwb3J0IG90aGVyIGNvbmZpZ3VyYXRpb25zIHRoaXMgd2F5LgotCWJyZWFrCi0gICAgICBmaQotICAgIGVsaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgotICAgICAgIyBDYW4ndCBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICAgIGJyZWFrCi0gICAgZmkKLQotIyBGcm9tIHRhcmdldCBuYW1lIGFuZCBmb3JtYXQsIHByb2R1Y2UgYSBsaXN0IG9mIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fS0ke2ZtdH0gaW4KLSAgICAgIG1pcHMtKi1pcml4NSotKikJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0gICAgICBtaXBzLSotbGludXgtZ251Ki0qKSBjYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYgbWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiBtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJZXNhYyA7OwotICAgICAgbWlwcy0qLWxuZXdzKi1lY29mZikgOzsKLSAgICAgIG1pcHMtKi0qLWVjb2ZmKQljYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWNvZmYgbWlwc2JlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBtaXBzLSotKi1lbGYpCWNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiIgOzsKLQkJCWVzYWMgOzsKLSAgICAgICMgVW5jb21tZW50aW5nIHRoZSBuZXh0IGxpbmUgd2lsbCB0dXJuIG9uIHN1cHBvcnQgZm9yIGkzODYgQU9VVAotICAgICAgIyBmb3IgdGhlIGRlZmF1bHQgbGludXggY29uZmlndXJhdGlvbgotICAgICAgIyBpMzg2LSotbGludXgqLWVsZikgZW11bGF0aW9uPSJpMzg2ZWxmIGkzODZhb3V0IiA7OwotICAgICAgIwotICAgICAgaTM4Ni0qLWFvdXQpCWVtdWxhdGlvbj0iaTM4NmFvdXQiIDs7Ci0gICAgICBpMzg2LSotY29mZikJZW11bGF0aW9uPSJpMzg2Y29mZiIgOzsKLSAgICAgIGkzODYtKi1lbGYpCWVtdWxhdGlvbj0iaTM4NmVsZiIgOzsKLSAgICBlc2FjCi0KLSAgICBlbXVsYXRpb25zPSIkZW11bGF0aW9ucyAkZW11bGF0aW9uIgotCi1kb25lCi0KLSMgVHVybiBvbiBhbGwgdGFyZ2V0cyBpZiBwb3NzaWJsZQotaWYgdGVzdCAke2FsbF90YXJnZXRzfSA9ICJ5ZXMiOyB0aGVuCi0gIGNhc2UgJHt0YXJnZXRfY3B1X3R5cGV9IGluCi0gIGkzODYpCi0gICAgY2FzZSAke29ial9mb3JtYXR9IGluCi0gICAgYW91dCkKLSAgICAgIGVtdWxhdGlvbnM9IiRlbXVsYXRpb25zIGkzODZjb2ZmIGkzODZlbGYiCi0gICAgICA7OwotICAgIGNvZmYpCi0gICAgICBlbXVsYXRpb25zPSIkZW11bGF0aW9ucyBpMzg2YW91dCBpMzg2ZWxmIgotICAgIDs7Ci0gICAgZWxmKQotICAgICAgZW11bGF0aW9ucz0iJGVtdWxhdGlvbnMgaTM4NmFvdXQgaTM4NmNvZmYiCi0gICAgICA7OwotICAgIGVzYWMKLSAgOzsKLSAgZXNhYwotZmkKLQotIyBBc3NpZ24gZmxvYXRpbmcgcG9pbnQgdHlwZS4gIE1vc3QgcHJvY2Vzc29ycyB3aXRoIEZQIHN1cHBvcnQKLSMgSUVFRSBGUC4gIE9uIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBGUCBhdCBhbGwsIHVzdWFsbHkgSUVFRQotIyBpcyBlbXVsYXRlZC4KLWNhc2UgJHt0YXJnZXRfY3B1fSBpbgotICB2YXggfCB0YWhvZSApCWF0b2Y9JHt0YXJnZXRfY3B1fSA7OwotICAqKQkJYXRvZj1pZWVlIDs7Ci1lc2FjCi0KLWNhc2UgIiR7b2JqX2Zvcm1hdH0iIGluCi0gICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBrbm93IHdoYXQgZm9ybWF0IHRvIHVzZSBmb3IgdGFyZ2V0ICR7dGFyZ2V0fSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLSMgVW5mb3J0dW5hdGVseSB0aGUgY3B1IGluIGNwdS1vcGMuaCBmaWxlIGlzbid0IGFsd2F5cyAkKFRBUkdFVF9DUFUpLgotY2dlbl9jcHVfcHJlZml4PSIiCi1pZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotICBjYXNlICR7dGFyZ2V0X2NwdX0gaW4KLSAgICAqKSBjZ2VuX2NwdV9wcmVmaXg9JHt0YXJnZXRfY3B1fSA7OwotICBlc2FjCi0gIAotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNJTkdfQ0dFTiAxCi1FT0YKLQotZmkKLQotCi1pZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy90Yy0ke3RhcmdldF9jcHVfdHlwZX0uYzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCBDUFUgJHt0YXJnZXRfY3B1X3R5cGV9IiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWlmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL29iai0ke29ial9mb3JtYXR9LmM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHQVMgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBvYmplY3QgZmlsZSBmb3JtYXQgJHtvYmpfZm9ybWF0fSIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1jYXNlICR7dXNlcl9iZmRfZ2FzfS0ke3ByaW1hcnlfYmZkX2dhc30gaW4KLSAgeWVzLXllcyB8IG5vLW5vKQotICAgICMgV2UgZGlkbid0IG92ZXJyaWRlIHVzZXIncyBjaG9pY2UuCi0gICAgOzsKLSAgbm8teWVzKQotICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogVXNlIG9mIEJGRCBpcyByZXF1aXJlZCBmb3IgJHt0YXJnZXR9OyBvdmVycmlkaW5nIGNvbmZpZyBvcHRpb25zLiIgMT4mMgotICAgIDs7Ci0gIG5vLXByZWZlcnJlZCkKLSAgICBwcmltYXJ5X2JmZF9nYXM9bm8KLSAgICA7OwotICAqLXByZWZlcnJlZCkKLSAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCi0gICAgOzsKLSAgeWVzLSopCi0gICAgcHJpbWFyeV9iZmRfZ2FzPXllcwotICAgIDs7Ci0gIC0qKQotICAgICMgVXNlciBzcGVjaWZpZWQgbm90aGluZy4KLSAgICA7OwotZXNhYwotCi0jIFNvbWUgQ09GRiBjb25maWd1cmF0aW9ucyB3YW50IHRoZXNlIHJhbmRvbSBvdGhlciBmbGFncyBzZXQuCi1jYXNlICR7b2JqX2Zvcm1hdH0gaW4KLSAgY29mZikKLSAgICBjYXNlICR7dGFyZ2V0X2NwdV90eXBlfSBpbgotICAgICAgaTM4NikgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEkzODZDT0ZGIDEKLUVPRgotIDs7Ci0gICAgICBtNjhrKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTTY4S0NPRkYgMQotRU9GCi0gOzsKLSAgICAgIG04OGspIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNODhLQ09GRiAxCi1FT0YKLSA7OwotICAgIGVzYWMKLSAgICA7OwotZXNhYwotCi0jIEdldHRpbmcgdGhpcyBkb25lIHJpZ2h0IGlzIGdvaW5nIHRvIGJlIGEgYml0Y2guICBFYWNoIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkCi0jIHdpdGggLS1lbmFibGUtdGFyZ2V0cz0uLi4gc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGVudmlyb25tZW50LCBmb3JtYXQsIGNwdSwgYW5kCi0jIGJmZF9nYXMgc2V0dGluZy4KLSMKLSMgRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgdGhlIG5lY2Vzc2FyeSBvYmplY3QgZmlsZSBzdXBwb3J0IGNvZGUgbXVzdCBiZSBsaW5rZWQKLSMgaW4uICBUaGlzIG1pZ2h0IGJlIG9ubHkgb25lLCBpdCBtaWdodCBiZSB1cCB0byBmb3VyLiAgVGhlIG5lY2Vzc2FyeSBlbXVsYXRpb24KLSMgY29kZSBuZWVkcyB0byBiZSBwcm92aWRlZCwgdG9vLgotIwotIyBBbmQgdGhlbiB0aGVyZSdzICItLWVuYWJsZS10YXJnZXRzPWFsbCIuLi4uCi0jCi0jIEZvciBub3csIGp1c3QgYWx3YXlzIGRvIGl0IGZvciBNSVBTIEVMRiBvciBFQ09GRiBjb25maWd1cmF0aW9ucy4gIFNpZ2guCi0KLWZvcm1hdHM9IiR7b2JqX2Zvcm1hdH0iCi1lbWZpbGVzPSIiCi1FTVVMQVRJT05TPSIiCi1fZ2FzX3VuaXFfbGlzdD0iJGVtdWxhdGlvbnMiCi1fZ2FzX3VuaXFfbmV3bGlzdD0iIgotZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSAkX2dhc191bmlxX2xpc3QgOyBkbwotICBjYXNlICRfZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiAkX2dhc191bmlxX25ld2xpc3QgIiBpbgotICAgICAgICoiICRfZ2FzX3VuaXFfaSAiKikgOzsKLSAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iJF9nYXNfdW5pcV9uZXdsaXN0ICRfZ2FzX3VuaXFfaSIgOzsKLSAgICAgZXNhYyA7OwotICBlc2FjCi1kb25lCi1lbXVsYXRpb25zPSRfZ2FzX3VuaXFfbmV3bGlzdAotCi1mb3IgZW0gaW4gLiAkZW11bGF0aW9ucyA7IGRvCi0gIGNhc2UgJGVtIGluCi0gICAgLikJY29udGludWUgOzsKLSAgICBtaXBzYmVsZiB8IG1pcHNsZWxmKQotCWZtdD1lbGYgICBmaWxlPW1pcHNlbGYgOzsKLSAgICBtaXBzYmVjb2ZmIHwgbWlwc2xlY29mZikKLQlmbXQ9ZWNvZmYgZmlsZT1taXBzZWNvZmYgOzsKLSAgICBpMzg2YW91dCkKLQlmbXQ9YW91dCAgZmlsZT1pMzg2YW91dCA7OwotICAgIGkzODZjb2ZmKQotCWZtdD1jb2ZmICBmaWxlPWkzODZjb2ZmIDs7Ci0gICAgaTM4NmVsZikKLQlmbXQ9ZWxmICAgZmlsZT1pMzg2ZWxmIDs7Ci0gIGVzYWMKLSAgZm9ybWF0cz0iJGZvcm1hdHMgJGZtdCIKLSAgZW1maWxlcz0iJGVtZmlsZXMgZS0kZmlsZS5vIgotICBFTVVMQVRJT05TPSIkRU1VTEFUSU9OUyAmJGVtLCIKLWRvbmUKLV9nYXNfdW5pcV9saXN0PSIkZm9ybWF0cyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWZvcm1hdHM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLV9nYXNfdW5pcV9saXN0PSIkZW1maWxlcyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWVtZmlsZXM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLWlmIHRlc3QgYHNldCAuICRmb3JtYXRzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMSA7IHRoZW4KLSAgZm9yIGZtdCBpbiAkZm9ybWF0cyA7IGRvCi0gICAgY2FzZSAkZm10IGluCi0gICAgICBhb3V0KQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0FPVVQgMQotRU9GCi0gICA7OwotICAgICAgYm91dCkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9CT1VUIDEKLUVPRgotICAgOzsKLSAgICAgIGNvZmYpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfQ09GRiAxCi1FT0YKLSAgICA7OwotICAgICAgZWNvZmYpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfRUNPRkYgMQotRU9GCi0gICA7OwotICAgICAgZWxmKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0VMRiAxCi1FT0YKLSAgICAgOzsKLSAgICAgIGdlbmVyaWMpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfR0VORVJJQyAxCi1FT0YKLSA7OwotICAgICAgaHAzMDApCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfSFAzMDAgMQotRU9GCi0gICA7OwotICAgICAgaWVlZSkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9JRUVFIDEKLUVPRgotICAgIDs7Ci0gICAgICBzb20pCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfU09NIDEKLUVPRgotICAgICA7OwotICAgICAgdm1zKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX1ZNUyAxCi1FT0YKLSAgICAgOzsKLSAgICBlc2FjCi0gICAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgb2JqLSRmbXQubyIKLSAgZG9uZQotICBvYmpfZm9ybWF0PW11bHRpCi1maQotaWYgdGVzdCBgc2V0IC4gJGVtZmlsZXMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAwIDsgdGhlbgotICBERUZBVUxUX0VNVUxBVElPTj1gc2V0IC4gJGVtdWxhdGlvbnMgOyBlY2hvICQyYAotICAjIGUtbWlwcyogaGFzIG1vcmUgdGhhbiBvbmUgZW11bGF0aW9uIHBlciBmaWxlLCBlLWkzODYqIGhhcyBqdXN0IG9uZSBhdCB0aGUKLSAgIyBtb21lbnQuICBJZiBvbmx5IG9uZSBlbXVsYXRpb24gaXMgc3BlY2lmaWVkLCB0aGVuIGRvbid0IGRlZmluZQotICAjIFVTRV9FTVVMQVRJT05TIG9yIGluY2x1ZGUgYW55IG9mIHRoZSBlLWZpbGVzIGFzIHRoZXkgd2lsbCBvbmx5IGJlIGJsb2F0LgotICBjYXNlICIke29ial9mb3JtYXR9JHtlbWZpbGVzfSIgaW4KLSAgICBtdWx0aSogfCAqbWlwcyopCi0gICAgICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyAkZW1maWxlcyIKLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfRU1VTEFUSU9OUyAxCi1FT0YKLSA7OwotICBlc2FjCi1maQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBFTVVMQVRJT05TICRFTVVMQVRJT05TCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgREVGQVVMVF9FTVVMQVRJT04gIiRERUZBVUxUX0VNVUxBVElPTiIKLUVPRgotCi0KLWNhc2UgJHtwcmltYXJ5X2JmZF9nYXN9LSR7dGFyZ2V0X2NwdV90eXBlfS0ke29ial9mb3JtYXR9IGluCi0gIHllcy0qLWNvZmYpCW5lZWRfYmZkPXllcyA7OwotICBuby0qLWNvZmYpCW5lZWRfYmZkPXllcwotCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTUFOWV9TRUdNRU5UUyAxCi1FT0YKLSA7OwotZXNhYwotCi1yZWplY3RfZGV2X2NvbmZpZ3M9eWVzCi0KLWNhc2UgJHtyZWplY3RfZGV2X2NvbmZpZ3N9LSR7ZGV2fSBpbgotICB5ZXMteWVzKSAjIE9vcHMuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHQVMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgJHtnZW5lcmljX3RhcmdldH0gY29uZmlndXJhdGlvbi4iIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci1lc2FjCi0KLQotCi0KLQotCi0KLWNhc2UgIiR7cHJpbWFyeV9iZmRfZ2FzfSIgaW4KLSAgeWVzKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQkZEX0FTU0VNQkxFUiAxCi1FT0YKLQotCW5lZWRfYmZkPXllcyA7OwotZXNhYwotCi0jIGRvIHdlIG5lZWQgdGhlIG9wY29kZXMgbGlicmFyeT8KLWNhc2UgIiR7bmVlZF9vcGNvZGVzfSIgaW4KLXllcykKLSAgT1BDT0RFU19MSUI9Li4vb3Bjb2Rlcy9saWJvcGNvZGVzLmxhCi0gIDs7Ci1lc2FjCi0KLWNhc2UgIiR7bmVlZF9iZmR9IiBpbgoteWVzKQotICBCRkRMSUI9Li4vYmZkL2xpYmJmZC5sYQotICBBTExfT0JKX0RFUFM9IiRBTExfT0JKX0RFUFMgLi4vYmZkL2JmZC5oIgotICA7OwotZXNhYwotCi0KLQotCi0KLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX0FMSUFTICIke3RhcmdldF9hbGlhc30iCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTCAiJHt0YXJnZXR9IgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9DUFUgIiR7dGFyZ2V0X2NwdX0iCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX1ZFTkRPUiAiJHt0YXJnZXRfdmVuZG9yfSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfT1MgIiR7dGFyZ2V0X29zfSIKLUVPRgotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQzNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKiB8ICpDWUdXSU4qKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUxODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NTA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyNTYxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU5MjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTk3OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19nY2Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjA2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MjU6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19jY19nK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLQotZm9yIGFjX3Byb2cgaW4gJ2Jpc29uIC15JyBieWFjYwotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2NjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19ZQUNDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1lBQ0M9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ZQUNDPSIkYWNfY3ZfcHJvZ19ZQUNDIgotaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWUFDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRZQUNDIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJFlBQ0MiIHx8IFlBQ0M9InlhY2MiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjkzOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DUFArc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI3MTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI3MzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI3NDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWZvciBhY19wcm9nIGluIGZsZXggbGV4Ci1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0xFWCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJExFWCIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRMRVgiIHx8IExFWD0iIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImZsZXgiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgxMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0xFWCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9ImZsZXgiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0xFWCIgJiYgYWNfY3ZfcHJvZ19MRVg9ImxleCIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRMRVhMSUIiCi10aGVuCi0gIGNhc2UgIiRMRVgiIGluCi0gIGZsZXgqKSBhY19saWI9ZmwgOzsKLSAgKikgYWNfbGliPWwgOzsKLSAgZXNhYwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg0NTogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQotYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy06JV9fcF9fJSdgCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfbGliXyRhY19saWJfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgeXl3cmFwKCk7Ci0KLWludCBtYWluKCkgewoteXl3cmFwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMRVhMSUI9Ii1sJGFjX2xpYiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg4NzogY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfbGV4X3Jvb3Qrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZSBtaW5pbWFsIGxleCBwcm9ncmFtIGlzIGp1c3QgYSBzaW5nbGUgbGluZTogJSUuICBCdXQgc29tZSBicm9rZW4gbGV4ZXMKLSMgKFNvbGFyaXMsIEkgdGhpbmsgaXQgd2FzKSB3YW50IHR3byAlJSBsaW5lcywgc28gYWNjb21tb2RhdGUgdGhlbS4KLWVjaG8gJyUlCi0lJScgfCAkTEVYCi1pZiB0ZXN0IC1mIGxleC55eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4Lnl5Ci1lbGlmIHRlc3QgLWYgbGV4eXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleHl5Ci1lbHNlCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2Fubm90IGZpbmQgb3V0cHV0IGZyb20gJExFWDsgZ2l2aW5nIHVwIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3Jvb3QiIDE+JjYKLUxFWF9PVVRQVVRfUk9PVD0kYWNfY3ZfcHJvZ19sZXhfcm9vdAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MDg6IGNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFBPU0lYIHNheXMgbGV4IGNhbiBkZWNsYXJlIHl5dGV4dCBlaXRoZXIgYXMgYSBwb2ludGVyIG9yIGFuIGFycmF5OyB0aGUKLSMgZGVmYXVsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIEZpZ3VyZSBvdXQgd2hpY2ggaXQgaXMsIHNpbmNlCi0jIG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIHByb3ZpZGUgdGhlICVwb2ludGVyIGFuZCAlYXJyYXkgZGVjbGFyYXRpb25zLgotYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9bm8KLWVjaG8gJ2V4dGVybiBjaGFyICp5eXRleHQ7JyA+PiRMRVhfT1VUUFVUX1JPT1QuYwotYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9IiRMSUJTICRMRVhMSUIiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTIwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWBjYXQgJExFWF9PVVRQVVRfUk9PVC5jYAotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTI3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotcm0gLWYgIiR7TEVYX09VVFBVVF9ST09UfS5jIgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgWVlURVhUX1BPSU5URVIgMQotRU9GCi0KLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk1MTogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk3MjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl9zdGRjK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk3NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk4NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDAyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNzY6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9jX2NvbnN0K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTMwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNTE6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2NfaW5saW5lK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgaW50IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE5MTogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl90eXBlX29mZl90K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X3R5cGVfb2ZmX3Q9eWVzIgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X3R5cGVfb2ZmX3Q9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl90eXBlXydvZmZfdGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMjY6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3R5cGVfc2l6ZV90K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl90eXBlX3NpemVfdD15ZXMiCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfdHlwZV9zaXplX3Q9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl90eXBlXydzaXplX3RgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNjM6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfYWxsb2NhX2grc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjY4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyNzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjk2OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jX2FsbG9jYV93b3JrcytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMyOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzNjE6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X29zX2NyYXkrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM5MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jXyRhY19mdW5jK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci1jaGFyICgqZikoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLWYgPSAkYWNfZnVuYzsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDQ3OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9jX3N0YWNrX2RpcmVjdGlvbitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0OTk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfJGFjX3NhZmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTA0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTA5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mzg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY18kYWNfZnVuYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1NDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotY2hhciAoKmYpKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi1mID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1Njc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1OTI6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3NDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzY4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyXyRhY19zYWZlK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzc3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc3ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MDg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY18kYWNfZnVuYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotY2hhciAoKmYpKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi1mID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4Mzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY18kYWNfZnVuYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4NzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotY2hhciAoKmYpKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi1mID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4OTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzkyOTogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthbV9jdl92YWxfTENfTUVTU0FHRVMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTM0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NjI6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk4MjogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDAxOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfJGFjX3NhZmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQwMTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDI4OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHtndF9jdl9mdW5jX2dldHRleHRfbGliYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwMzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwNDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA1NjogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystOiVfX3BfXyUnYAotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2xpYl8kYWNfbGliX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA2NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwNzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwOTE6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTMxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfTVNHRk1UK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTY1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjIxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfR01TR0ZNVCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI1NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX1hHRVRURVhUK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0Mjg5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Mjk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMyOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX01TR0ZNVCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9HTVNHRk1UK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Mzk5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfWEdFVFRFWFQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDg5OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTE3OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfJGFjX3NhZmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQ1Mjc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDU5MDogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MTM6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2N5Z3dpbitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2MTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2Mjk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjQ1OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfbWluZ3czMitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2NTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjU3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgRU1YIE9TLzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2NzM6IGNoZWNraW5nIGZvciBFTVggT1MvMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZW14b3MyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY3OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fRU1YX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY4NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2VteG9zMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZW14b3MyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2VteG9zMiIgMT4mNgotRU1YT1MyPQotdGVzdCAiJGFjX2N2X2VteG9zMiIgPSB5ZXMgJiYgRU1YT1MyPXllcwotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzA0OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2V4ZWV4dCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllcyB8fCB0ZXN0ICIkRU1YT1MyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICouQyB8ICoubyB8ICoub2JqIHwgKi54Y29mZikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1mb3IgYWNfaGRyIGluIHN0cmluZy5oIHN0ZGxpYi5oIG1lbW9yeS5oIHN0cmluZ3MuaCB1bmlzdGQuaCBzdGRhcmcuaCB2YXJhcmdzLmggZXJybm8uaCBzeXMvdHlwZXMuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3Mzk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfJGFjX3NhZmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzQ5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0jIFB1dCB0aGlzIGhlcmUgc28gdGhhdCBhdXRvY29uZidzICJjcm9zcy1jb21waWxpbmciIG1lc3NhZ2UgZG9lc24ndCBjb25mdXNlCi0jIHBlb3BsZSB3aG8gYXJlIG5vdCBjcm9zcy1jb21waWxpbmcgYnV0IGFyZSBjb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVycy4KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgY29tcGlsaW5nIGEgY3Jvc3MtYXNzZW1ibGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Nzc5OiBjaGVja2luZyB3aGV0aGVyIGNvbXBpbGluZyBhIGNyb3NzLWFzc2VtYmxlciIgPiY1Ci1pZiB0ZXN0ICIke2hvc3R9IiA9ICIke3RhcmdldH0iOyB0aGVuCi0gIGNyb3NzX2dhcz1ubwotZWxzZQotICBjcm9zc19nYXM9eWVzCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDUk9TU19DT01QSUxFIDEKLUVPRgotCi1maQotZWNobyAiJGFjX3QiIiRjcm9zc19nYXMiIDE+JjYKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc5NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl9hbGxvY2FfaCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3OTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDgwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4Mjc6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDgzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDg5MjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3Zfb3NfY3JheStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4OTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTIyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTUxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5Nzg6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDI3OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9jX2lubGluZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGludCBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA0MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi0KLSMgVk1TIGRvZXNuJ3QgaGF2ZSB1bmxpbmsuCi1mb3IgYWNfZnVuYyBpbiB1bmxpbmsgcmVtb3ZlCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDcxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTAwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBTb21lIHN5c3RlbXMgZG9uJ3QgaGF2ZSBzYnJrKCkuCi1mb3IgYWNfZnVuYyBpbiBzYnJrCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTI5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTM0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBub24tQU5TSSBwcmVwcm9jZXNzb3JzIGJvdGNoIHJlcXVvdGluZyBpbnNpZGUgc3RyaW5ncy4gIFRoYXQncyBiYWQKLSMgZW5vdWdoLCBidXQgb24gc29tZSBvZiB0aG9zZSBzeXN0ZW1zLCB0aGUgYXNzZXJ0IG1hY3JvIHJlbGllcyBvbiByZXF1b3RpbmcKLSMgd29ya2luZyBwcm9wZXJseSEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFzc2VydCBtYWNybyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTE4NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXNzZXJ0IG1hY3JvIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHtnYXNfY3ZfYXNzZXJ0X29rK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTE5MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLWludCBtYWluKCkgewotCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTIwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2Fzc2VydF9vaz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2Fzc2VydF9vaz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2Fzc2VydF9vayIgMT4mNgotdGVzdCAkZ2FzX2N2X2Fzc2VydF9vayA9IHllcyB8fCBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQlJPS0VOX0FTU0VSVCAxCi1FT0YKLQotCi0KLSMgT24gc29tZSBzeXN0ZW1zLCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBtYXkgbm90IGRlY2xhcmUgbWFsbG9jLCByZWFsbG9jLAotIyBhbmQgZnJlZS4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgZ2FzIG5lZWRzIHRoZXNlIGZ1bmN0aW9ucyB0byBoYXZlIGJlZW4KLSMgZGVjbGFyZWQgLS0gc3VjaCBhcyB3aGVuIHRha2luZyB0aGVpciBhZGRyZXNzZXMuCi1nYXNfdGVzdF9oZWFkZXJzPSIKLSNpZmRlZiBIQVZFX01FTU9SWV9ICi0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3Igc3Ryc3RyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjQ5OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzdHJzdHIiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2dhc19jdl9kZWNsX25lZWRlZF9zdHJzdHIrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICooKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIHN0cnN0cjsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgbWFsbG9jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1Mjg2OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBtYWxsb2MiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2dhc19jdl9kZWNsX25lZWRlZF9tYWxsb2Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjkxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICooKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIG1hbGxvYzsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZnJlZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTMyMzogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZnJlZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7Z2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MzI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiB2b2lkICgqZikoKTsKLWYgeDsKLXggPSAoZikgZnJlZTsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9mcmVlPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9mcmVlID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzYnJrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MzYwOiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzYnJrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHtnYXNfY3ZfZGVjbF9uZWVkZWRfc2JyaytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUzNjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKigqZikoKTsKLWYgeDsKLXggPSAoZikgc2JyazsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzNzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zYnJrPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zYnJrPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU0JSSyAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlbnZpcm9uIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1Mzk3OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlbnZpcm9uIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHtnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU0MDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKipmOwotZiB4OwoteCA9IChmKSBlbnZpcm9uOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OIDEKLUVPRgotCi1maQotCi0KLSMgRG9lcyBlcnJuby5oIGRlY2xhcmUgZXJybm8sIG9yIGRvIHdlIGhhdmUgdG8gYWRkIGEgc2VwYXJhdGUgZGVjbGFyYXRpb24KLSMgZm9yIGl0PwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlcnJubyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQzNzogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZXJybm8iID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2dhc19jdl9kZWNsX25lZWRlZF9lcnJubytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU0NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgSEFWRV9FUlJOT19ICi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBpbnQgZjsKLWYgeDsKLXggPSAoZikgZXJybm87Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm89bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vIiAxPiY2Ci1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm8gPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FUlJOTyAxCi1FT0YKLQotZmkKLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMy4xIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgZG9jL01ha2VmaWxlICR7R0RCSU5JVH06Z2RiaW5pdC5pbiBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATE5fU0AlJExOX1MlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAR0RCSU5JVEAlJEdEQklOSVQlZwotcyVAY2dlbl9jcHVfcHJlZml4QCUkY2dlbl9jcHVfcHJlZml4JWcKLXMlQGV4dHJhX29iamVjdHNAJSRleHRyYV9vYmplY3RzJWcKLXMlQHRhcmdldF9jcHVfdHlwZUAlJHRhcmdldF9jcHVfdHlwZSVnCi1zJUBvYmpfZm9ybWF0QCUkb2JqX2Zvcm1hdCVnCi1zJUB0ZV9maWxlQCUkdGVfZmlsZSVnCi1zJUBpbnN0YWxsX3Rvb2xkaXJAJSRpbnN0YWxsX3Rvb2xkaXIlZwotcyVAYXRvZkAlJGF0b2YlZwotcyVAQkZETElCQCUkQkZETElCJWcKLXMlQE9QQ09ERVNfTElCQCUkT1BDT0RFU19MSUIlZwotcyVAQUxMX09CSl9ERVBTQCUkQUxMX09CSl9ERVBTJWcKLXMlQFlBQ0NAJSRZQUNDJWcKLXMlQExFWEAlJExFWCVnCi1zJUBMRVhMSUJAJSRMRVhMSUIlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQExFWF9PVVRQVVRfUk9PVEAlJExFWF9PVVRQVVRfUk9PVCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBkb2MvTWFrZWZpbGUgJHtHREJJTklUfTpnZGJpbml0LmluIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLXRhcmdldF9jcHVfdHlwZT0ke3RhcmdldF9jcHVfdHlwZX0KLSBjZ2VuX2NwdV9wcmVmaXg9JHtjZ2VuX2NwdV9wcmVmaXh9Ci0gb2JqX2Zvcm1hdD0ke29ial9mb3JtYXR9Ci0gdGVfZmlsZT0ke3RlX2ZpbGV9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1ybSAtZiB0YXJnLWNwdS5jIHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIG9iai1mb3JtYXQuYyB0YXJnLWVudi5oIGF0b2YtdGFyZy5jIGl0YmwtY3B1LmgKLSBlY2hvICcjaW5jbHVkZSAidGMtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiB0YXJnLWNwdS5oCi0gZWNobyAnI2luY2x1ZGUgIm9iai0nIiR7b2JqX2Zvcm1hdH0iJy5oIicgPiBvYmotZm9ybWF0LmgKLSBlY2hvICcjaW5jbHVkZSAidGUtJyIke3RlX2ZpbGV9IicuaCInID4gdGFyZy1lbnYuaAotIGVjaG8gJyNpbmNsdWRlICJpdGJsLSciJHt0YXJnZXRfY3B1X3R5cGV9IicuaCInID4gaXRibC1jcHUuaAotIGlmIHRlc3QgIngkY2dlbl9jcHVfcHJlZml4IiAhPSB4IDsgdGhlbgotICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIke2NnZW5fY3B1X3ByZWZpeH0iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oCi0gZmkKLQotIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJFNIRUxMICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlndXJlLmluIGIvZ2FzL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVlNDJhNi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsODMyICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi1kbmwgQW5kIGJlIGNhcmVmdWwgd2hlbiBjaGFuZ2luZyBpdCEgIElmIHlvdSBtdXN0IGFkZCB0ZXN0cyB3aXRoIHNxdWFyZQotZG5sIGJyYWNrZXRzLCBiZSBzdXJlIGNoYW5nZXF1b3RlIGludm9jYXRpb25zIHN1cnJvdW5kIGl0LgotZG5sCi1kbmwKLWRubCB2Mi41IG5lZWRlZCBmb3IgLS1iaW5kaXIgZXQgYWwKLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChhcy5oKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UoZ2FzLCAyLjkuNSkKLQotQU1fUFJPR19MSUJUT09MCi0KLXVzZXJfYmZkX2dhcz0KLUFDX0FSR19FTkFCTEUoYmZkLWFzc2VtYmxlciwKLVsgIC0tZW5hYmxlLWJmZC1hc3NlbWJsZXIgIHVzZSBCRkQgYmFjayBlbmQgZm9yIHdyaXRpbmcgb2JqZWN0IGZpbGVzXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgbmVlZF9iZmQ9eWVzIHVzZXJfYmZkX2dhcz15ZXMgOzsKLSAgbm8pICB1c2VyX2JmZF9nYXM9bm8gOzsKLSAgKikgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgYmZkLWFzc2VtYmxlciBvcHRpb24pIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgICAgdGFyZ2V0cyAgICAgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyBiZXNpZGVzIHRoZSBwcmltYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLQkgICAgOzsKLSAgbm8pCSAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikJICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi0KLXVzaW5nX2NnZW49bm8KLQotIyBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotIyBJZiB3ZSBhcmUgb24gYSBET1MgZmlsZXN5c3RlbSwgd2UgbXVzdCB1c2UgZ2RiLmluaSByYXRoZXIgdGhhbgotIyAuZ2RiaW5pdC4KLUdEQklOSVQ9Ii5nZGJpbml0IgotY2FzZSAiJHtob3N0fSIgaW4KLSAgKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotICAgIEdEQklOSVQ9ImdkYi5pbmkiCi0gICAgOzsKLWVzYWMKLUFDX1NVQlNUKEdEQklOSVQpCi0KLXRlX2ZpbGU9Z2VuZXJpYwotCi0jIE1ha2VmaWxlIHRhcmdldCBmb3IgaW5zdGFsbGluZyBnYXMgaW4gJCh0b29sZGlyKS9iaW4uCi1pbnN0YWxsX3Rvb2xkaXI9aW5zdGFsbC1leGVjLXRvb2xkaXIKLQotY2Fub25fdGFyZ2V0cz0iIgotYWxsX3RhcmdldHM9bm8KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gIGZvciB0IGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgOyBkbwotICAgIGlmIHRlc3QgJHQgPSAiYWxsIjsgdGhlbgotICAgICAgYWxsX3RhcmdldHM9eWVzCi0gICAgICBjb250aW51ZQotICAgIGZpCi0gICAgcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdCAyPi9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLSAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0jICAgIGVsc2UKLSMgICAgICAjIFBlcm1pdCAiYWxsIiwgZXRjLiAgV2UgZG9uJ3Qgc3VwcG9ydCBpdCB5ZXQgdGhvdWdoLgotIyAgICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0IgotICAgIGZpCi0gIGRvbmUKLSAgR0FTX1VOSVEoY2Fub25fdGFyZ2V0cykKLWZpCi0KLWVtdWxhdGlvbnM9IiIKLQotZm9yIHRoaXNfdGFyZ2V0IGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMgOyBkbwotCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIGV2YWwgYGVjaG8gJHRoaXNfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvY3B1PVwxIHZlbmRvcj1cMiBvcz1cMy8nYAotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0gICAgIyBjaGVjayBmb3IgYXJjaGl0ZWN0dXJlIHZhcmlhbnRzCi0gICAgYXJjaD0KLSAgICBlbmRpYW49Ci0gICAgY2FzZSAke2NwdX0gaW4KLSAgICAgIGFscGhhKikJCWNwdV90eXBlPWFscGhhIDs7Ci0gICAgICBhcm1lYikJCWNwdV90eXBlPWFybSBlbmRpYW49YmlnIDs7Ci0gICAgICBhcm0qKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybWIqKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybXYqbCkJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm12KmIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OwotICAgICAgc3Ryb25nYXJtKikJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIHRodW1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBocHBhKikJCWNwdV90eXBlPWhwcGEgOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgICBpWzQ1Nl04NikJCWNwdV90eXBlPWkzODYgOzsKLSAgICAgIG02ODBbMDEyMzQ2XTApCWNwdV90eXBlPW02OGsgOzsKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgIG02ODAwOCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG02ODM/PykJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG01MjAwKQkJY3B1X3R5cGU9bTY4ayA7OwotICAgICAgbTgqKQkJY3B1X3R5cGU9bTg4ayA7OwotICAgICAgbWlwcyplbCkJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcyopCQljcHVfdHlwZT1taXBzIGVuZGlhbj1iaWcgOzsKLSAgICAgIHBqbCopCQljcHVfdHlwZT1waiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBwaiopCQljcHVfdHlwZT1waiBlbmRpYW49YmlnIDs7Ci0gICAgICBwb3dlcnBjbGUqKQljcHVfdHlwZT1wcGMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgcG93ZXJwYyopCQljcHVfdHlwZT1wcGMgZW5kaWFuPWJpZyA7OwotICAgICAgcnM2MDAwKikJCWNwdV90eXBlPXBwYyA7OwotICAgICAgc3BhcmNsaXRlKikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsKLSAgICAgIHNwYXJjbGV0KikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xldCA7OwotICAgICAgc3BhcmM2NCopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXY5LTY0IDs7Ci0gICAgICBzcGFyYzg2eCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmM4NnggIDs7Ci0gICAgICBzcGFyYyopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGl0ZSA7OyAjID8/PyBTZWUgdGMtc3BhcmMuYy4KLSAgICAgIHY4NTAqKQkJY3B1X3R5cGU9djg1MCA7OwotICAgICAgKikJCWNwdV90eXBlPSR7Y3B1fSA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgdGFyZ2V0X2NwdV90eXBlPSR7Y3B1X3R5cGV9Ci0gICAgZWxpZiB0ZXN0ICR7dGFyZ2V0X2NwdV90eXBlfSAhPSAke2NwdV90eXBlfSA7IHRoZW4KLSAgICAgIGNvbnRpbnVlCi0gICAgZmkKLQotICAgIGdlbmVyaWNfdGFyZ2V0PSR7Y3B1X3R5cGV9LSR2ZW5kb3ItJG9zCi0gICAgZGV2PW5vCi0gICAgYmZkX2dhcz1ubwotICAgIGVtPWdlbmVyaWMKLQotICAgICMgYXNzaWduIG9iamVjdCBmb3JtYXQKLSAgICBjYXNlICR7Z2VuZXJpY190YXJnZXR9IGluCi0gICAgICBhMjlrLSotY29mZikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLXVkaSkgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1hbWQtZWJtb24pICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLW55dS1zeW0xKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstKi12eHdvcmtzKikgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBhbHBoYSotKi0qdm1zKikJICAgIGZtdD1ldmF4IDs7Ci0gICAgICBhbHBoYSotKi1uZXR3YXJlKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vcGVuYnNkKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vc2YqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eGVjb2ZmKikgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eC1nbnUqKSAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgYWxwaGEqLSotbmV0YnNkKikgICAgIGZtdD1lbGYgZW09bmJzZCA7OwotCi0gICAgICBhcmMtKi1lbGYqKSAgICAgICAgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBhcm0tKi1hb3V0KQkgICAgICAgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGFybS0qLWNvZmYgfCB0aHVtYi0qLWNvZmYpICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYXJtLSotZWxmIHwgdGh1bWItKi1lbGYpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybSotKi1jb25peCopCQkJZm10PWVsZiA7OwotICAgICAgYXJtLSotbGludXgqYW91dCopCSAgICAgICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIGFybSotKi1saW51eC1nbnUqKQkJZm10PWVsZiAgZW09bGludXggOzsKLSAgICAgIGFybS0qLW5ldGJzZCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKi1vYWJpIHwgdGh1bWItKi1vYWJpKSAgICAgICAgZm10PWVsZiA7OwotICAgICAgYXJtLWVwb2MtcGUgfCB0aHVtYi1lcG9jLXBlKSAgICAgIGZtdD1jb2ZmIGVtPWVwb2MtcGUgOzsKLSAgICAgIGFybS0qLXdpbmNlKSAgICAgICAgICBmbXQ9Y29mZiBlbT13aW5jZS1wZSBiZmRfZ2FzPXllczs7Ci0gICAgICBhcm0tKi1wZSB8IHRodW1iLSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGFybS0qLXJpc2NpeCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1yaXNjaXggOzsKLQotICAgICAgYXZyLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIGQxMHYtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGQzMHYtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotCi0gICAgICBmcjMwLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIGhwcGEtKi0qZWxmKikgICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1saXRlcyopICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1vc2YqKSAgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ydGVtcyopICAgICAgICBmbXQ9ZWxmIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ocHV4KikgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1tcGVpeCopICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1ic2QqKSAgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLSAgICAgIGhwcGEtKi1oaXV4KikgICAgICAgICBmbXQ9c29tIGVtPWhwcGEgOzsKLQotICAgICAgaDgzMDAtKi1jb2ZmKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIGkzNzAtKi1lbGYqIHwgaTM3MC0qLWxpbnV4KikgZm10PWVsZiA7OwotICAgICAgaTM4Ni1pYm0tYWl4KikgICAgICAgIGZtdD1jb2ZmIGVtPWkzODZhaXggOzsKLSAgICAgIGkzODYtc2VxdWVudC1ic2QqKSAgICBmbXQ9YW91dCBlbT1keW5peCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJlb3NwZSopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc2VsZiogfCBpMzg2LSotYmVvcyopIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1ic2QqKSAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QwLjgpICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1saW51eCphb3V0KiB8IGkzODYtKi1saW51eG9sZGxkKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBpMzg2LSotbGludXgqY29mZiopICAgZm10PWNvZmYgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgaTM4Ni0qLXN5c3Y0KiB8IGkzODYtKi1zb2xhcmlzKiB8IGkzODYtKi1lbGYpCi0JCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWZyZWVic2Rhb3V0KiB8IGkzODYtKi1mcmVlYnNkWzEyXS4qIHwgaTM4Ni0qLWZyZWVic2RbMTJdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLWZyZWVic2QqKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWNvZmYgfCBpMzg2LSotc3lzdiogfCBpMzg2LSotc2NvMy4ydjUqY29mZiB8IGkzODYtKi1pc2MqKQotICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgaTM4Ni0qLXNjbzMuMnY1KikgICAgICBmbXQ9ZWxmCi0JCQkgICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQ7IHRoZW4KLQkJCQlBQ19ERUZJTkUoU0NPX0VMRiwgMSwKLQkJCQkgICAgW0RlZmluZSBpZiBkZWZhdWx0aW5nIHRvIEVMRiBvbiBTQ08gNS5dKQotCQkJICAgIGZpCi0JCQkgICAgOzsKLSAgICAgIGkzODYtKi1zY28zLjIqKSAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgaTM4Ni0qLXZzdGEpICAgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpMzg2LSotbXNkb3NkamdwcCogfCBpMzg2LSotZ28zMiogfCBpMzg2LWdvMzItcnRlbXMqKQotCQkJICAgIGZtdD1jb2ZmIGVtPWdvMzI7OwotICAgICAgaTM4Ni0qLXJ0ZW1zZWxmKikgICAgIGZtdD1lbGYgOzsKLSAgICAgIGkzODYtKi1ydGVtcyopICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgaTM4Ni0qLWdudSopICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGkzODYtKi1tYWNoKikKLQkJCSAgICBmbXQ9YW91dCBlbT1tYWNoIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbXNkb3MqKSAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGkzODYtKi1tb3NzKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIGkzODYtKi1wZSkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgaTM4Ni0qLWN5Z3dpbiopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotaW50ZXJpeCopCSAgICBmbXQ9Y29mZiBlbT1pbnRlcml4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbWluZ3czMiopICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi0qbnQqKSAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgaTM4Ni0qLXZ4d29ya3MqKSAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpOTYwLSotYm91dCkgICAgICAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi1jb2ZmKSAgICAgICAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXJ0ZW1zKikgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotbmluZHkqKSAgICAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNCopICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M1LjApICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuKikgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzKikgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIG0zMnItKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgbTY4ay0qLXZ4d29ya3MqIHwgbTY4ay1lcmljc3Nvbi1vc2UgfCBtNjhrLSotc3Vub3MqKQotCQkJICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgIG02OGstbW90b3JvbGEtc3lzdiopICBmbXQ9Y29mZiBlbT1kZWx0YSA7OwotICAgICAgbTY4ay1idWxsLXN5c3YzKikgICAgIGZtdD1jb2ZmIGVtPWRweDIgOzsKLSAgICAgIG02OGstYXBvbGxvLSopICAgICAgICBmbXQ9Y29mZiBlbT1hcG9sbG8gOzsKLSAgICAgIG02OGstKi1zeXN2NCopICMgbXVzdCBiZSBiZWZvcmUgLXN5c3YqCi0JCQkgICAgZm10PWVsZiBlbT1zdnI0IDs7Ci0gICAgICBtNjhrLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1jb2ZmIHwgbTY4ay0qLXN5c3YqIHwgbTY4ay0qLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiA7OwotICAgICAgbTY4ay0qLWhwdXgqKSAgICAgICAgIGZtdD1ocDMwMCBlbT1ocDMwMCA7OwotICAgICAgbTY4ay0qLWxpbnV4KmFvdXQqKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotbGludXgtZ251KikgICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgbTY4ay0qLWdudSopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtNjhrLSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgbTY4ay0qLW5ldGJzZCopICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtNjhrLWFwcGxlLWF1eCopICAgICAgZm10PWNvZmYgZW09YXV4IDs7Ci0gICAgICBtNjhrLSotcHNvcyopICAgICAgICAgZm10PWVsZiBlbT1wc29zOzsKLQotICAgICAgbTg4ay1tb3Rvcm9sYS1zeXN2MyopIGZtdD1jb2ZmIGVtPWRlbHQ4OCA7OwotICAgICAgbTg4ay0qLWNvZmYqKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG1jb3JlLSotZWxmKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgbWNvcmUtKi1wZSkJICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgICMgZG9uJ3QgY2hhbmdlIGVtIGxpa2UgKi0qLWJzZCBkb2VzCi0gICAgICBtaXBzLWRlYy1uZXRic2QqKQkgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1vcGVuYnNkKikgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1ic2QqKSAgICAgICAgZm10PWFvdXQgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy1zb255LWJzZCopICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWJzZCopICAgICAgICAgIEFDX01TR19FUlJPUihVbmtub3duIHZlbmRvciBmb3IgbWlwcy1ic2QgY29uZmlndXJhdGlvbi4pIDs7Ci0gICAgICBtaXBzLSotdWx0cml4KikgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtKi1vc2YqKSAgICAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLXBlKikgICAgICAgICAgIGZtdD1jb2ZmIGVuZGlhbj1saXR0bGUgZW09cGUgOzsKLSAgICAgIG1pcHMtKi1pcml4NiopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotaXJpeDUqKSAgICAgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLWlyaXgqKSAgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWxuZXdzKikgICAgICAgIGZtdD1lY29mZiBlbT1sbmV3cyA7OwotICAgICAgbWlwcy0qLXJpc2NvcyopICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLXN5c3YqKSAgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWVsZiogfCBtaXBzLSotcnRlbXMqIHwgbWlwcy0qLWxpbnV4LWdudSogfCBtaXBzLSotZ251KiB8IG1pcHMtKi1vcGVuYnNkKikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotdnh3b3JrcyopICAgICAgZm10PWVsZgotCQkJICAgIEFDX0RFRklORShNSVBTX1NUQUJTX0VMRiwgMSwKLQkJCQlbVXNlIEVMRiBzdGFicyBmb3IgTUlQUywgbm90IEVDT0ZGIHN0YWJzXSkKLQkJCSAgICA7OwotICAgICAgbW4xMDIwMC0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtbjEwMzAwLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHBqKikJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBwcGMtKi1wZSB8IHBwYy0qLWN5Z3dpbiogfCBwcGMtKi13aW5udCopCi0JCSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBwcGMtKi1haXgqKSAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHBwYy0qLWJlb3MqKSAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgcHBjLSotKmJzZCogfCBwcGMtKi1lbGYqIHwgcHBjLSotZWFiaSogfCBwcGMtKi1zeXN2NCopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotbGludXgtZ251KikJICAgIGZtdD1lbGYKLQkJCSAgICBjYXNlICIkZW5kaWFuIiBpbgotCQkJICAgIGJpZykgIDs7Ci0JCQkgICAgKikgICAgQUNfTVNHX0VSUk9SKEdOVS9MaW51eCBtdXN0IGJlIGNvbmZpZ3VyZWQgYmlnIGVuZGlhbikgOzsKLQkJCSAgICBlc2FjCi0JCQkgICAgOzsKLSAgICAgIHBwYy0qLXNvbGFyaXMqKQkgICAgZm10PWVsZgotCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCi0JCQkJQUNfREVGSU5FKFRBUkdFVF9TT0xBUklTX0NPTU1FTlQsIDEsCi0JCQkJW0RlZmluZSBpZiBkZWZhdWx0IHRhcmdldCBpcyBQb3dlclBDIFNvbGFyaXMuXSkKLQkJCSAgICBmaQotCQkJICAgIGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhiaWc7IHRoZW4KLQkJCQlBQ19NU0dfRVJST1IoU29sYXJpcyBtdXN0IGJlIGNvbmZpZ3VyZWQgbGl0dGxlIGVuZGlhbikKLQkJCSAgICBmaQotCQkJICAgIDs7Ci0gICAgICBwcGMtKi1ydGVtcyopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBwcGMtKi1tYWNvcyogfCBwcGMtKi1tcHcqKQotCQkJICAgIGZtdD1jb2ZmIGVtPW1hY29zIDs7Ci0gICAgICBwcGMtKi1uZXR3YXJlKikgICAgICAgZm10PWVsZiBlbT1wcGNudyA7OwotICAgICAgcHBjLSotdnh3b3JrcyopICAgICAgIGZtdD1lbGYgOzsKLQotICAgICAgc2gtKi1lbGYqKQkgICAgZm10PWVsZiA7OwotICAgICAgc2gtKi1jb2ZmKikgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzaC0qLXBlKikgICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXM7OwotICAgICAgc2gtKi1ydGVtc2VsZiopICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIHNoLSotcnRlbXMqKQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgbnMzMmstcGM1MzItbWFjaCogfCBuczMyay1wYzUzMi11eCopICAgIGZtdD1hb3V0IGVtPXBjNTMybWFjaCA7OwotICAgICAgbnMzMmstcGM1MzItbmV0YnNkKiB8IG5zMzJrLXBjNTMyLWxpdGVzKikgIGZtdD1hb3V0IGVtPW5ic2Q1MzIgOzsKLSAgICAgIG5zMzJrLXBjNTMyLW9wZW5ic2QqKSBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7Ci0KLSAgICAgIHNwYXJjLSotcnRlbXMqKSAgICAgICBmbXQ9YW91dCA7OwotICAgICAgc3BhcmMtKi1zdW5vczQqKSAgICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgIHNwYXJjLSotYW91dCB8IHNwYXJjKi0qLXZ4d29ya3MqKQotCQkJICAgIGZtdD1hb3V0IGVtPXNwYXJjYW91dCA7OwotICAgICAgc3BhcmMtKi1jb2ZmKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzcGFyYy0qLWxpbnV4KmFvdXQqKSAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIHNwYXJjLSotbGludXgtZ251KikgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBzcGFyYy0qLWx5bnhvcyopICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgc3BhcmMtZnVqaXRzdS1ub25lKSAgIGZtdD1hb3V0IDs7Ci0gICAgICBzcGFyYy0qLWVsZiB8IHNwYXJjLSotc3lzdjQqIHwgc3BhcmMtKi1zb2xhcmlzKikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzcGFyYy0qLW5ldGJzZCopICAgICAgZm10PWFvdXQgZW09bmJzZCA7OwotICAgICAgc3BhcmMtKi1vcGVuYnNkKikgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKLQotICAgICAgc3Ryb25nYXJtLSotY29mZikgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzdHJvbmdhcm0tKi1lbGYpICAgICAgZm10PWVsZiA7OwotCi0gICAgICB0aWMzMC0qLSphb3V0KikJICAgIGZtdD1hb3V0IGJmZF9nYXM9eWVzIDs7Ci0gICAgICB0aWMzMC0qLSpjb2ZmKikgICAgICAgZm10PWNvZmYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHRpYzgwLSotKikJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIHY4NTAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHY4NTBlLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHY4NTBlYS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIHZheC0qLWJzZCogfCB2YXgtKi11bHRyaXgqKQotCQkJICAgIGZtdD1hb3V0IDs7Ci0gICAgICB2YXgtKi12bXMpICAgICAgICAgICAgZm10PXZtcyA7OwotCi0KLSAgICAgIHo4ay0qLWNvZmYgfCB6OGstKi1zaW0pCi0JCQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgdzY1LSotKikgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgICotKi1hb3V0IHwgKi0qLXNjb3V0KQotCQkJICAgIGZtdD1hb3V0IDs7Ci0gICAgICAqLSotbmluZHkqKQotCQkJICAgIGZtdD1ib3V0IDs7Ci0gICAgICAqLSotYnNkKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICAqLSotZ2VuZXJpYykgICAgICAgICAgZm10PWdlbmVyaWMgOzsKLSAgICAgICotKi14cmF5IHwgKi0qLWhtcykgICBmbXQ9Y29mZiA7OwotICAgICAgKi0qLXNpbSkgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICAqLSotZWxmIHwgKi0qLXN5c3Y0KiB8ICotKi1zb2xhcmlzKikKLQkJCSAgICBBQ19NU0dfV0FSTihHQVMgc3VwcG9ydCBmb3IgJHtnZW5lcmljX3RhcmdldH0gaXMgaW5jb21wbGV0ZS4pCi0JCQkgICAgZm10PWVsZiBkZXY9eWVzIDs7Ci0gICAgICAqLSotdnh3b3JrcykgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgICotKi1uZXR3YXJlKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQgOyB0aGVuCi0gICAgICBlbmRpYW5fZGVmPQotICAgICAgaWYgdGVzdCB4JHtlbmRpYW59ID0geGJpZzsgdGhlbgotCWVuZGlhbl9kZWY9MQotICAgICAgZWxpZiB0ZXN0IHgke2VuZGlhbn0gPSB4bGl0dGxlOyB0aGVuCi0JZW5kaWFuX2RlZj0wCi0gICAgICBmaQotICAgICAgaWYgdGVzdCB4JHtlbmRpYW5fZGVmfSAhPSB4OyB0aGVuCi0JQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCAkZW5kaWFuX2RlZiwKLQkJCSAgIFtEZWZpbmUgYXMgMSBpZiBiaWcgZW5kaWFuLl0pCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBjYXNlICR7Y3B1X3R5cGV9LSR7Zm10fSBpbgotICAgICAgYWxwaGEqLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKikJYmZkX2dhcz15ZXMgOzsKLSAgICAjIG5vdCB5ZXQKLSAgICAjIGkzODYtYW91dCkJYmZkX2dhcz1wcmVmZXJyZWQgOzsKLSAgICAgIG1pcHMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIG5zMzJrLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBwcGMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHNwYXJjLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBzdHJvbmdhcm0tKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotZWxmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lY29mZikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotc29tKQliZmRfZ2FzPXllcyA7OwotICAgICNlbmFibGUgYmZkIGZvciBjb2ZmIGFuZCBhb3V0IHRvIGFsbG93IHRlc3RpbmcgaWYgYSBiZmQgdGFyZ2V0IGlzCi0gICAgI3RoZSBwcmltYXJ5IHRhcmdldCwgYnV0IG5vdCBmb3IgY29mZiBvciBhb3V0IGFzIHRoZSBwcmltYXJ5IHRhcmdldAotICAgICAgaTM4Ni1jb2ZmKQlpZiB0ZXN0IHgke3ByaW1hcnlfYmZkX2dhc30gPSB4eWVzOyB0aGVuIGJmZF9nYXM9eWVzOyBmaSA7OwotICAgICAgaTM4Ni1hb3V0KQlpZiB0ZXN0IHgke3ByaW1hcnlfYmZkX2dhc30gPSB4eWVzOyB0aGVuIGJmZF9nYXM9eWVzOyBmaSA7OwotICAgICAgKikJCTs7Ci0gICAgZXNhYwotCi0jIE90aGVyIHJhbmRvbSBzdHVmZi4KLQotICAgICMgRG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PwotICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KLSAgICAgIHZheCB8IGkzODYgfCB0aWMzMCkKLQk7OwotCi0gICAgICAqKQotCW5lZWRfb3Bjb2Rlcz15ZXMKLQotCWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCi0JeWVzKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7Ci0JKm9wY29kZXMqKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7Ci0JKikgc2hhcmVkX29wY29kZXM9ZmFsc2UgOzsKLQllc2FjCi0JaWYgdGVzdCAiJHtzaGFyZWRfb3Bjb2Rlc30iID0gInRydWUiOyB0aGVuCi0JICAjIEEgc2hhcmVkIGxpYm9wY29kZXMgbXVzdCBiZSBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuCi0JICBuZWVkX2JmZD15ZXMKLQlmaQotCTs7Ci0gICAgZXNhYwotCi0gICAgIyBBbnkgb3RoZXIgc3BlY2lhbCBvYmplY3QgZmlsZXMgbmVlZGVkID8KLSAgICBjYXNlICR7Y3B1X3R5cGV9IGluCi0gICAgICBmcjMwIHwgbTMycikKLQl1c2luZ19jZ2VuPXllcwotCTs7Ci0KLSAgICAgIG02OGspCi0JY2FzZSAke2V4dHJhX29iamVjdHN9IGluCi0JKm02OGstcGFyc2UubyopIDs7Ci0JKikgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgbTY4ay1wYXJzZS5vIiA7OwotCWVzYWMKLQk7OwotCi0gICAgICBtaXBzKQotCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0YmwtcGFyc2UubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtcGFyc2UubyIKLQlmaQotCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1sZXgubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtbGV4Lm8iCi0JZmkKLQotCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0Ymwtb3BzLm8iIAotCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0JICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLW9wcy5vIgotCWZpCi0JOzsKLQotICAgICAgc3BhcmMpCi0JaWYgdGVzdCAkdGhpc190YXJnZXQgPSAkdGFyZ2V0IDsgdGhlbgotCSAgQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfQVJDSCwgIiR7YXJjaH0iLCBbRGVmYXVsdCBhcmNoaXRlY3R1cmUuXSkKLQlmaQotCTs7Ci0gICAgICAqKQotCTs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLQljYXNlICJ4JHtleHRyYV9vYmplY3RzfSIgaW4KLQkqY2dlbi5vKikgOzsKLQkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBjZ2VuLm8iIDs7Ci0JZXNhYwotICAgIGZpCi0KLSMgU2VlIGlmIHdlIHJlYWxseSBjYW4gc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZW11bGF0aW9uIGNvZGUuCi0KLSAgICBpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCi0gICAgICBwcmltYXJ5X2JmZF9nYXM9JGJmZF9nYXMKLSAgICAgIG9ial9mb3JtYXQ9JGZtdAotICAgICAgdGVfZmlsZT0kZW0KLQotICAgICAgaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgotCSMgQ2FuJ3Qgc3VwcG9ydCBvdGhlciBjb25maWd1cmF0aW9ucyB0aGlzIHdheS4KLQlicmVhawotICAgICAgZmkKLSAgICBlbGlmIHRlc3QgJGJmZF9nYXMgPSBubyA7IHRoZW4KLSAgICAgICMgQ2FuJ3Qgc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24uCi0gICAgICBicmVhawotICAgIGZpCi0KLSMgRnJvbSB0YXJnZXQgbmFtZSBhbmQgZm9ybWF0LCBwcm9kdWNlIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZW11bGF0aW9ucy4KLQotICAgIGNhc2UgJHtnZW5lcmljX3RhcmdldH0tJHtmbXR9IGluCi0gICAgICBtaXBzLSotaXJpeDUqLSopCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiBtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OwotICAgICAgbWlwcy0qLWxpbnV4LWdudSotKikgY2FzZSAiJGVuZGlhbiIgaW4KLQkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYgbWlwc2xlY29mZiBtaXBzYmVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCWVzYWMgOzsKLSAgICAgIG1pcHMtKi1sbmV3cyotZWNvZmYpIDs7Ci0gICAgICBtaXBzLSotKi1lY29mZikJY2FzZSAiJGVuZGlhbiIgaW4KLQkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJKikJZW11bGF0aW9uPSJtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJZXNhYyA7OwotICAgICAgbWlwcy0qLSotZWxmKQljYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICAjIFVuY29tbWVudGluZyB0aGUgbmV4dCBsaW5lIHdpbGwgdHVybiBvbiBzdXBwb3J0IGZvciBpMzg2IEFPVVQKLSAgICAgICMgZm9yIHRoZSBkZWZhdWx0IGxpbnV4IGNvbmZpZ3VyYXRpb24KLSAgICAgICMgaTM4Ni0qLWxpbnV4Ki1lbGYpIGVtdWxhdGlvbj0iaTM4NmVsZiBpMzg2YW91dCIgOzsKLSAgICAgICMKLSAgICAgIGkzODYtKi1hb3V0KQllbXVsYXRpb249ImkzODZhb3V0IiA7OwotICAgICAgaTM4Ni0qLWNvZmYpCWVtdWxhdGlvbj0iaTM4NmNvZmYiIDs7Ci0gICAgICBpMzg2LSotZWxmKQllbXVsYXRpb249ImkzODZlbGYiIDs7Ci0gICAgZXNhYwotCi0gICAgZW11bGF0aW9ucz0iJGVtdWxhdGlvbnMgJGVtdWxhdGlvbiIKLQotZG9uZQotCi0jIFR1cm4gb24gYWxsIHRhcmdldHMgaWYgcG9zc2libGUKLWlmIHRlc3QgJHthbGxfdGFyZ2V0c30gPSAieWVzIjsgdGhlbgotICBjYXNlICR7dGFyZ2V0X2NwdV90eXBlfSBpbgotICBpMzg2KQotICAgIGNhc2UgJHtvYmpfZm9ybWF0fSBpbgotICAgIGFvdXQpCi0gICAgICBlbXVsYXRpb25zPSIkZW11bGF0aW9ucyBpMzg2Y29mZiBpMzg2ZWxmIgotICAgICAgOzsKLSAgICBjb2ZmKQotICAgICAgZW11bGF0aW9ucz0iJGVtdWxhdGlvbnMgaTM4NmFvdXQgaTM4NmVsZiIKLSAgICA7OwotICAgIGVsZikKLSAgICAgIGVtdWxhdGlvbnM9IiRlbXVsYXRpb25zIGkzODZhb3V0IGkzODZjb2ZmIgotICAgICAgOzsKLSAgICBlc2FjCi0gIDs7Ci0gIGVzYWMKLWZpCi0KLSMgQXNzaWduIGZsb2F0aW5nIHBvaW50IHR5cGUuICBNb3N0IHByb2Nlc3NvcnMgd2l0aCBGUCBzdXBwb3J0Ci0jIElFRUUgRlAuICBPbiB0aG9zZSB0aGF0IGRvbid0IHN1cHBvcnQgRlAgYXQgYWxsLCB1c3VhbGx5IElFRUUKLSMgaXMgZW11bGF0ZWQuCi1jYXNlICR7dGFyZ2V0X2NwdX0gaW4KLSAgdmF4IHwgdGFob2UgKQlhdG9mPSR7dGFyZ2V0X2NwdX0gOzsKLSAgKikJCWF0b2Y9aWVlZSA7OwotZXNhYwotCi1jYXNlICIke29ial9mb3JtYXR9IiBpbgotICAiIikgQUNfTVNHX0VSUk9SKEdBUyBkb2VzIG5vdCBrbm93IHdoYXQgZm9ybWF0IHRvIHVzZSBmb3IgdGFyZ2V0ICR7dGFyZ2V0fSkgOzsKLWVzYWMKLQotIyBVbmZvcnR1bmF0ZWx5IHRoZSBjcHUgaW4gY3B1LW9wYy5oIGZpbGUgaXNuJ3QgYWx3YXlzICQoVEFSR0VUX0NQVSkuCi1jZ2VuX2NwdV9wcmVmaXg9IiIKLWlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0gIGNhc2UgJHt0YXJnZXRfY3B1fSBpbgotICAgICopIGNnZW5fY3B1X3ByZWZpeD0ke3RhcmdldF9jcHV9IDs7Ci0gIGVzYWMKLSAgQUNfU1VCU1QoY2dlbl9jcHVfcHJlZml4KQotICBBQ19ERUZJTkUoVVNJTkdfQ0dFTiwgMSwgW1VzaW5nIGNnZW4gY29kZT9dKQotZmkKLQotZG5sCi1kbmwgTWFrZSBzdXJlIHRoZSBkZXNpcmVkIHN1cHBvcnQgZmlsZXMgZXhpc3QuCi1kbmwKLQotaWYgdGVzdCAhIC1yICR7c3JjZGlyfS9jb25maWcvdGMtJHt0YXJnZXRfY3B1X3R5cGV9LmM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKEdBUyBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCBDUFUgJHt0YXJnZXRfY3B1X3R5cGV9KQotZmkKLQotaWYgdGVzdCAhIC1yICR7c3JjZGlyfS9jb25maWcvb2JqLSR7b2JqX2Zvcm1hdH0uYzsgdGhlbgotICBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0ICR7b2JqX2Zvcm1hdH0pCi1maQotCi1jYXNlICR7dXNlcl9iZmRfZ2FzfS0ke3ByaW1hcnlfYmZkX2dhc30gaW4KLSAgeWVzLXllcyB8IG5vLW5vKQotICAgICMgV2UgZGlkbid0IG92ZXJyaWRlIHVzZXIncyBjaG9pY2UuCi0gICAgOzsKLSAgbm8teWVzKQotICAgIEFDX01TR19XQVJOKFVzZSBvZiBCRkQgaXMgcmVxdWlyZWQgZm9yICR7dGFyZ2V0fTsgb3ZlcnJpZGluZyBjb25maWcgb3B0aW9ucy4pCi0gICAgOzsKLSAgbm8tcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz1ubwotICAgIDs7Ci0gICotcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz15ZXMKLSAgICA7OwotICB5ZXMtKikKLSAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCi0gICAgOzsKLSAgLSopCi0gICAgIyBVc2VyIHNwZWNpZmllZCBub3RoaW5nLgotICAgIDs7Ci1lc2FjCi0KLSMgU29tZSBDT0ZGIGNvbmZpZ3VyYXRpb25zIHdhbnQgdGhlc2UgcmFuZG9tIG90aGVyIGZsYWdzIHNldC4KLWNhc2UgJHtvYmpfZm9ybWF0fSBpbgotICBjb2ZmKQotICAgIGNhc2UgJHt0YXJnZXRfY3B1X3R5cGV9IGluCi0gICAgICBpMzg2KSBBQ19ERUZJTkUoSTM4NkNPRkYsIDEsIFtVc2luZyBpMzg2IENPRkY/XSkgOzsKLSAgICAgIG02OGspIEFDX0RFRklORShNNjhLQ09GRiwgMSwgW1VzaW5nIG02OGsgQ09GRj9dKSA7OwotICAgICAgbTg4aykgQUNfREVGSU5FKE04OEtDT0ZGLCAxLCBbVXNpbmcgbTg4ayBDT0ZGP10pIDs7Ci0gICAgZXNhYwotICAgIDs7Ci1lc2FjCi0KLSMgR2V0dGluZyB0aGlzIGRvbmUgcmlnaHQgaXMgZ29pbmcgdG8gYmUgYSBiaXRjaC4gIEVhY2ggY29uZmlndXJhdGlvbiBzcGVjaWZpZWQKLSMgd2l0aCAtLWVuYWJsZS10YXJnZXRzPS4uLiBzaG91bGQgYmUgY2hlY2tlZCBmb3IgZW52aXJvbm1lbnQsIGZvcm1hdCwgY3B1LCBhbmQKLSMgYmZkX2dhcyBzZXR0aW5nLgotIwotIyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCB0aGUgbmVjZXNzYXJ5IG9iamVjdCBmaWxlIHN1cHBvcnQgY29kZSBtdXN0IGJlIGxpbmtlZAotIyBpbi4gIFRoaXMgbWlnaHQgYmUgb25seSBvbmUsIGl0IG1pZ2h0IGJlIHVwIHRvIGZvdXIuICBUaGUgbmVjZXNzYXJ5IGVtdWxhdGlvbgotIyBjb2RlIG5lZWRzIHRvIGJlIHByb3ZpZGVkLCB0b28uCi0jCi0jIEFuZCB0aGVuIHRoZXJlJ3MgIi0tZW5hYmxlLXRhcmdldHM9YWxsIi4uLi4KLSMKLSMgRm9yIG5vdywganVzdCBhbHdheXMgZG8gaXQgZm9yIE1JUFMgRUxGIG9yIEVDT0ZGIGNvbmZpZ3VyYXRpb25zLiAgU2lnaC4KLQotZm9ybWF0cz0iJHtvYmpfZm9ybWF0fSIKLWVtZmlsZXM9IiIKLUVNVUxBVElPTlM9IiIKLUdBU19VTklRKGVtdWxhdGlvbnMpCi1mb3IgZW0gaW4gLiAkZW11bGF0aW9ucyA7IGRvCi0gIGNhc2UgJGVtIGluCi0gICAgLikJY29udGludWUgOzsKLSAgICBtaXBzYmVsZiB8IG1pcHNsZWxmKQotCWZtdD1lbGYgICBmaWxlPW1pcHNlbGYgOzsKLSAgICBtaXBzYmVjb2ZmIHwgbWlwc2xlY29mZikKLQlmbXQ9ZWNvZmYgZmlsZT1taXBzZWNvZmYgOzsKLSAgICBpMzg2YW91dCkKLQlmbXQ9YW91dCAgZmlsZT1pMzg2YW91dCA7OwotICAgIGkzODZjb2ZmKQotCWZtdD1jb2ZmICBmaWxlPWkzODZjb2ZmIDs7Ci0gICAgaTM4NmVsZikKLQlmbXQ9ZWxmICAgZmlsZT1pMzg2ZWxmIDs7Ci0gIGVzYWMKLSAgZm9ybWF0cz0iJGZvcm1hdHMgJGZtdCIKLSAgZW1maWxlcz0iJGVtZmlsZXMgZS0kZmlsZS5vIgotICBFTVVMQVRJT05TPSIkRU1VTEFUSU9OUyAmJGVtLCIKLWRvbmUKLUdBU19VTklRKGZvcm1hdHMpCi1HQVNfVU5JUShlbWZpbGVzKQotaWYgdGVzdCBgc2V0IC4gJGZvcm1hdHMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAxIDsgdGhlbgotICBmb3IgZm10IGluICRmb3JtYXRzIDsgZG8KLSAgICBjYXNlICRmbXQgaW4KLSAgICAgIGFvdXQpCUFDX0RFRklORShPQkpfTUFZQkVfQU9VVCwgMSwgICAgW2Eub3V0IHN1cHBvcnQ/XSkgICA7OwotICAgICAgYm91dCkJQUNfREVGSU5FKE9CSl9NQVlCRV9CT1VULCAxLCAgICBbYi5vdXQgc3VwcG9ydD9dKSAgIDs7Ci0gICAgICBjb2ZmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0NPRkYsIDEsICAgIFtDT0ZGIHN1cHBvcnQ/XSkgICAgOzsKLSAgICAgIGVjb2ZmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0VDT0ZGLCAxLCAgIFtFQ09GRiBzdXBwb3J0P10pICAgOzsKLSAgICAgIGVsZikJQUNfREVGSU5FKE9CSl9NQVlCRV9FTEYsIDEsICAgICBbRUxGIHN1cHBvcnQ/XSkgICAgIDs7Ci0gICAgICBnZW5lcmljKQlBQ19ERUZJTkUoT0JKX01BWUJFX0dFTkVSSUMsIDEsIFtnZW5lcmljIHN1cHBvcnQ/XSkgOzsKLSAgICAgIGhwMzAwKQlBQ19ERUZJTkUoT0JKX01BWUJFX0hQMzAwLCAxLCAgIFtIUDMwMCBzdXBwb3J0P10pICAgOzsKLSAgICAgIGllZWUpCUFDX0RFRklORShPQkpfTUFZQkVfSUVFRSwgMSwgICAgW0lFRUUgc3VwcG9ydD9dKSAgICA7OwotICAgICAgc29tKQlBQ19ERUZJTkUoT0JKX01BWUJFX1NPTSwgMSwgICAgIFtTT00gc3VwcG9ydD9dKSAgICAgOzsKLSAgICAgIHZtcykJQUNfREVGSU5FKE9CSl9NQVlCRV9WTVMsIDEsICAgICBbVk1TIHN1cHBvcnQ/XSkgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIG9iai0kZm10Lm8iCi0gIGRvbmUKLSAgb2JqX2Zvcm1hdD1tdWx0aQotZmkKLWlmIHRlc3QgYHNldCAuICRlbWZpbGVzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMCA7IHRoZW4KLSAgREVGQVVMVF9FTVVMQVRJT049YHNldCAuICRlbXVsYXRpb25zIDsgZWNobyAkMmAKLSAgIyBlLW1pcHMqIGhhcyBtb3JlIHRoYW4gb25lIGVtdWxhdGlvbiBwZXIgZmlsZSwgZS1pMzg2KiBoYXMganVzdCBvbmUgYXQgdGhlCi0gICMgbW9tZW50LiAgSWYgb25seSBvbmUgZW11bGF0aW9uIGlzIHNwZWNpZmllZCwgdGhlbiBkb24ndCBkZWZpbmUKLSAgIyBVU0VfRU1VTEFUSU9OUyBvciBpbmNsdWRlIGFueSBvZiB0aGUgZS1maWxlcyBhcyB0aGV5IHdpbGwgb25seSBiZSBibG9hdC4KLSAgY2FzZSAiJHtvYmpfZm9ybWF0fSR7ZW1maWxlc30iIGluCi0gICAgbXVsdGkqIHwgKm1pcHMqKQotICAgICAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgJGVtZmlsZXMiCi0gICAgICBBQ19ERUZJTkUoVVNFX0VNVUxBVElPTlMsIDEsIFtVc2UgZW11bGF0aW9uIHN1cHBvcnQ/XSkgOzsKLSAgZXNhYwotZmkKLUFDX1NVQlNUKGV4dHJhX29iamVjdHMpCi1BQ19ERUZJTkVfVU5RVU9URUQoRU1VTEFUSU9OUywgJEVNVUxBVElPTlMsIFtTdXBwb3J0ZWQgZW11bGF0aW9ucy5dKQotQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfRU1VTEFUSU9OLCAiJERFRkFVTFRfRU1VTEFUSU9OIiwKLQkJICAgW0RlZmF1bHQgZW11bGF0aW9uLl0pCi0KLWNhc2UgJHtwcmltYXJ5X2JmZF9nYXN9LSR7dGFyZ2V0X2NwdV90eXBlfS0ke29ial9mb3JtYXR9IGluCi0gIHllcy0qLWNvZmYpCW5lZWRfYmZkPXllcyA7OwotICBuby0qLWNvZmYpCW5lZWRfYmZkPXllcwotCQlBQ19ERUZJTkUoTUFOWV9TRUdNRU5UUywgMSwgW29sZCBDT0ZGIHN1cHBvcnQ/XSkgOzsKLWVzYWMKLQotcmVqZWN0X2Rldl9jb25maWdzPXllcwotCi1jYXNlICR7cmVqZWN0X2Rldl9jb25maWdzfS0ke2Rldn0gaW4KLSAgeWVzLXllcykgIyBPb3BzLgotICAgIEFDX01TR19FUlJPUihHQVMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgJHtnZW5lcmljX3RhcmdldH0gY29uZmlndXJhdGlvbi4pCi0gICAgOzsKLWVzYWMKLQotQUNfU1VCU1QodGFyZ2V0X2NwdV90eXBlKQotQUNfU1VCU1Qob2JqX2Zvcm1hdCkKLUFDX1NVQlNUKHRlX2ZpbGUpCi1BQ19TVUJTVChpbnN0YWxsX3Rvb2xkaXIpCi1BQ19TVUJTVChhdG9mKQotZG5sIEFDX1NVQlNUKGVtdWxhdGlvbikKLQotY2FzZSAiJHtwcmltYXJ5X2JmZF9nYXN9IiBpbgotICB5ZXMpCUFDX0RFRklORShCRkRfQVNTRU1CTEVSLCAxLCBbVXNlIEJGRCBpbnRlcmZhY2U/XSkKLQluZWVkX2JmZD15ZXMgOzsKLWVzYWMKLQotIyBkbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci1jYXNlICIke25lZWRfb3Bjb2Rlc30iIGluCi15ZXMpCi0gIE9QQ09ERVNfTElCPS4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotICA7OwotZXNhYwotCi1jYXNlICIke25lZWRfYmZkfSIgaW4KLXllcykKLSAgQkZETElCPS4uL2JmZC9saWJiZmQubGEKLSAgQUxMX09CSl9ERVBTPSIkQUxMX09CSl9ERVBTIC4uL2JmZC9iZmQuaCIKLSAgOzsKLWVzYWMKLQotQUNfU1VCU1QoQkZETElCKQotQUNfU1VCU1QoT1BDT0RFU19MSUIpCi0KLUFDX1NVQlNUKEFMTF9PQkpfREVQUykKLQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9BTElBUywJIiR7dGFyZ2V0X2FsaWFzfSIsIFtUYXJnZXQgYWxpYXMuXSkKLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfQ0FOT05JQ0FMLAkiJHt0YXJnZXR9IiwgICAgICAgW0Nhbm9uaWNhbCB0YXJnZXQuXSkKLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfQ1BVLAkJIiR7dGFyZ2V0X2NwdX0iLCAgIFtUYXJnZXQgQ1BVLl0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX1ZFTkRPUiwJIiR7dGFyZ2V0X3ZlbmRvcn0iLCBbVGFyZ2V0IHZlbmRvci5dKQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9PUywJCSIke3RhcmdldF9vc30iLCAgICBbVGFyZ2V0IE9TLl0pCi0KLUFDX1BST0dfQ0MKLQotQUNfUFJPR19ZQUNDCi1BTV9QUk9HX0xFWAotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RkbGliLmggbWVtb3J5Lmggc3RyaW5ncy5oIHVuaXN0ZC5oIHN0ZGFyZy5oIHZhcmFyZ3MuaCBlcnJuby5oIHN5cy90eXBlcy5oKQotCi0jIFB1dCB0aGlzIGhlcmUgc28gdGhhdCBhdXRvY29uZidzICJjcm9zcy1jb21waWxpbmciIG1lc3NhZ2UgZG9lc24ndCBjb25mdXNlCi0jIHBlb3BsZSB3aG8gYXJlIG5vdCBjcm9zcy1jb21waWxpbmcgYnV0IGFyZSBjb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVycy4KLUFDX01TR19DSEVDS0lORyh3aGV0aGVyIGNvbXBpbGluZyBhIGNyb3NzLWFzc2VtYmxlcikKLWlmIHRlc3QgIiR7aG9zdH0iID0gIiR7dGFyZ2V0fSI7IHRoZW4KLSAgY3Jvc3NfZ2FzPW5vCi1lbHNlCi0gIGNyb3NzX2dhcz15ZXMKLSAgQUNfREVGSU5FKENST1NTX0NPTVBJTEUsIDEsIFtDb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVyP10pCi1maQotQUNfTVNHX1JFU1VMVCgkY3Jvc3NfZ2FzKQotCi1kbmwgYW5zaWRlY2wuaCB3aWxsIGRlYWwgd2l0aCBjb25zdAotZG5sIEFDX0NPTlNUCi1BQ19GVU5DX0FMTE9DQQotQUNfQ19JTkxJTkUKLQotIyBWTVMgZG9lc24ndCBoYXZlIHVubGluay4KLUFDX0NIRUNLX0ZVTkNTKHVubGluayByZW1vdmUsIGJyZWFrKQotCi0jIFNvbWUgc3lzdGVtcyBkb24ndCBoYXZlIHNicmsoKS4KLUFDX0NIRUNLX0ZVTkNTKHNicmspCi0KLSMgU29tZSBub24tQU5TSSBwcmVwcm9jZXNzb3JzIGJvdGNoIHJlcXVvdGluZyBpbnNpZGUgc3RyaW5ncy4gIFRoYXQncyBiYWQKLSMgZW5vdWdoLCBidXQgb24gc29tZSBvZiB0aG9zZSBzeXN0ZW1zLCB0aGUgYXNzZXJ0IG1hY3JvIHJlbGllcyBvbiByZXF1b3RpbmcKLSMgd29ya2luZyBwcm9wZXJseSEKLUdBU19XT1JLSU5HX0FTU0VSVAotCi0jIE9uIHNvbWUgc3lzdGVtcywgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgbWF5IG5vdCBkZWNsYXJlIG1hbGxvYywgcmVhbGxvYywKLSMgYW5kIGZyZWUuICBUaGVyZSBhcmUgcGxhY2VzIHdoZXJlIGdhcyBuZWVkcyB0aGVzZSBmdW5jdGlvbnMgdG8gaGF2ZSBiZWVuCi0jIGRlY2xhcmVkIC0tIHN1Y2ggYXMgd2hlbiB0YWtpbmcgdGhlaXIgYWRkcmVzc2VzLgotZ2FzX3Rlc3RfaGVhZGVycz0iCi0jaWZkZWYgSEFWRV9NRU1PUllfSAotI2luY2x1ZGUgPG1lbW9yeS5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0iCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoc3Ryc3RyLCBmLCBjaGFyICooKmYpKCksICRnYXNfdGVzdF9oZWFkZXJzKQotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKG1hbGxvYywgZiwgY2hhciAqKCpmKSgpLCAkZ2FzX3Rlc3RfaGVhZGVycykKLUdBU19DSEVDS19ERUNMX05FRURFRChmcmVlLCBmLCB2b2lkICgqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoc2JyaywgZiwgY2hhciAqKCpmKSgpLCAkZ2FzX3Rlc3RfaGVhZGVycykKLUdBU19DSEVDS19ERUNMX05FRURFRChlbnZpcm9uLCBmLCBjaGFyICoqZiwgJGdhc190ZXN0X2hlYWRlcnMpCi0KLSMgRG9lcyBlcnJuby5oIGRlY2xhcmUgZXJybm8sIG9yIGRvIHdlIGhhdmUgdG8gYWRkIGEgc2VwYXJhdGUgZGVjbGFyYXRpb24KLSMgZm9yIGl0PwotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKGVycm5vLCBmLCBpbnQgZiwgWwotI2lmZGVmIEhBVkVfRVJSTk9fSAotI2luY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYKLV0pCi0KLWRubCBUaGlzIG11c3QgY29tZSBsYXN0LgotCi1kbmwgV2UgdXNlZCB0byBtYWtlIHN5bWxpbmtzIHRvIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBidXQgbm93Ci1kbmwgd2UganVzdCB1c2UgdGhlIHJpZ2h0IG5hbWUgZm9yIC5jIGZpbGVzLCBhbmQgY3JlYXRlIC5oIGZpbGVzIGluCi1kbmwgdGhlIGJ1aWxkIGRpcmVjdG9yeSB3aGljaCBpbmNsdWRlIHRoZSByaWdodCAuaCBmaWxlLiAgTWFrZSBzdXJlCi1kbmwgdGhlIG9sZCBzeW1saW5rcyBkb24ndCBleGlzdCwgc28gdGhhdCBhIHJlY29uZmlndXJlIGluIGFuIGV4aXN0aW5nCi1kbmwgZGlyZWN0b3J5IGJlaGF2ZXMgcmVhc29uYWJseS4KLQotQUNfT1VUUFVUKE1ha2VmaWxlIGRvYy9NYWtlZmlsZSAke0dEQklOSVR9OmdkYmluaXQuaW4gcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtybSAtZiB0YXJnLWNwdS5jIHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIG9iai1mb3JtYXQuYyB0YXJnLWVudi5oIGF0b2YtdGFyZy5jIGl0YmwtY3B1LmgKLSBlY2hvICcjaW5jbHVkZSAidGMtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiB0YXJnLWNwdS5oCi0gZWNobyAnI2luY2x1ZGUgIm9iai0nIiR7b2JqX2Zvcm1hdH0iJy5oIicgPiBvYmotZm9ybWF0LmgKLSBlY2hvICcjaW5jbHVkZSAidGUtJyIke3RlX2ZpbGV9IicuaCInID4gdGFyZy1lbnYuaAotIGVjaG8gJyNpbmNsdWRlICJpdGJsLSciJHt0YXJnZXRfY3B1X3R5cGV9IicuaCInID4gaXRibC1jcHUuaAotIGlmIHRlc3QgIngkY2dlbl9jcHVfcHJlZml4IiAhPSB4IDsgdGhlbgotICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIke2NnZW5fY3B1X3ByZWZpeH0iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oCi0gZmkKLQotIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0sCi1bdGFyZ2V0X2NwdV90eXBlPSR7dGFyZ2V0X2NwdV90eXBlfQotIGNnZW5fY3B1X3ByZWZpeD0ke2NnZW5fY3B1X3ByZWZpeH0KLSBvYmpfZm9ybWF0PSR7b2JqX2Zvcm1hdH0KLSB0ZV9maWxlPSR7dGVfZmlsZX1dKQpkaWZmIC0tZ2l0IGEvZ2FzL2RlYnVnLmMgYi9nYXMvZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5ZjIzZi4uMDAwMDAwMAotLS0gYS9nYXMvZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgZGVidWcuYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFJvdXRpbmVzIGZvciBkZWJ1ZyB1c2Ugb25seS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotZG1wX2ZyYWdzICgpCi17Ci0gIGZyY2hhaW5TICpjaHA7Ci0gIGNoYXIgKnA7Ci0KLSAgZm9yIChjaHAgPSBmcmNoYWluX3Jvb3Q7IGNocDsgY2hwID0gY2hwLT5mcmNoX25leHQpCi0gICAgewotICAgICAgc3dpdGNoIChjaHAtPmZyY2hfc2VnKQotCXsKLQljYXNlIFNFR19EQVRBOgotCSAgcCA9ICJEYXRhIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VHX1RFWFQ6Ci0JICBwID0gIlRleHQiOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHAgPSAiPz8/IjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByaW50ZiAoIlxuU0VHTUVOVCAlcyAlZFxuIiwgcCwgY2hwLT5mcmNoX3N1YnNlZyk7Ci0gICAgICBkbXBfZnJhZyAoY2hwLT5mcmNoX3Jvb3QsICJcdCIpOwotICAgIH0KLX0KLQotZG1wX2ZyYWcgKGZwLCBpbmRlbnQpCi0gICAgIHN0cnVjdCBmcmFnICpmcDsKLSAgICAgY2hhciAqaW5kZW50OwotewotICBmb3IgKDsgZnA7IGZwID0gZnAtPmZyX25leHQpCi0gICAgewotICAgICAgcHJpbnRmICgiJXNGUkFHTUVOVCBAIDB4JXhcbiIsIGluZGVudCwgZnApOwotICAgICAgc3dpdGNoIChmcC0+ZnJfdHlwZSkKLQl7Ci0JY2FzZSByc19hbGlnbjoKLQkgIHByaW50ZiAoIiVzcnNfYWxpZ24oJWQpXG4iLCBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOwotCSAgYnJlYWs7Ci0JY2FzZSByc19maWxsOgotCSAgcHJpbnRmICgiJXNyc19maWxsKCVkKVxuIiwgaW5kZW50LCBmcC0+ZnJfb2Zmc2V0KTsKLQkgIHByaW50ZiAoIiVzIiwgaW5kZW50KTsKLQkgIHZhcl9jaGFycyAoZnAsIGZwLT5mcl92YXIgKyBmcC0+ZnJfZml4KTsKLQkgIHByaW50ZiAoIiVzXHQgcmVwZWF0ZWQgJWQgdGltZXMsIiwKLQkJICBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOwotCSAgcHJpbnRmICgiIGZpeGVkIGxlbmd0aCBpZiAjIGNoYXJzID09IDApXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfb3JnOgotCSAgcHJpbnRmICgiJXNyc19vcmcoJWQrc3ltIEAweCV4KVxuIiwgaW5kZW50LAotCQkgIGZwLT5mcl9vZmZzZXQsIGZwLT5mcl9zeW1ib2wpOwotCSAgcHJpbnRmICgiJXNmaWxsIHdpdGggIiwgaW5kZW50KTsKLQkgIHZhcl9jaGFycyAoZnAsIDEpOwotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBwcmludGYgKCIlc21hY2hpbmVfZGVwXG4iLCBpbmRlbnQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIiVzdW5rbm93biB0eXBlXG4iLCBpbmRlbnQpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJpbnRmICgiJXNhZGRyPSVkKDB4JXgpXG4iLCBpbmRlbnQsIGZwLT5mcl9hZGRyZXNzLCBmcC0+ZnJfYWRkcmVzcyk7Ci0gICAgICBwcmludGYgKCIlc2ZyX2ZpeD0lZFxuIiwgaW5kZW50LCBmcC0+ZnJfZml4KTsKLSAgICAgIHByaW50ZiAoIiVzZnJfdmFyPSVkXG4iLCBpbmRlbnQsIGZwLT5mcl92YXIpOwotICAgICAgcHJpbnRmICgiJXNmcl9vZmZzZXQ9JWRcbiIsIGluZGVudCwgZnAtPmZyX29mZnNldCk7Ci0gICAgICBwcmludGYgKCIlc2NoYXJzIEAgMHgleFxuIiwgaW5kZW50LCBmcC0+ZnJfbGl0ZXJhbCk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotdmFyX2NoYXJzIChmcCwgbikKLSAgICAgc3RydWN0IGZyYWcgKmZwOwotICAgICBpbnQgbjsKLXsKLSAgdW5zaWduZWQgY2hhciAqcDsKLQotICBmb3IgKHAgPSAodW5zaWduZWQgY2hhciAqKSBmcC0+ZnJfbGl0ZXJhbDsgbjsgbi0tLCBwKyspCi0gICAgewotICAgICAgcHJpbnRmICgiJTAyeCAiLCAqcCk7Ci0gICAgfQotfQotCi0vKiBlbmQgb2YgZGVidWcuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2RlcC1pbi5zZWQgYi9nYXMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3MWYwZi4uMDAwMDAwMAotLS0gYS9nYXMvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTpsb29wCi0vXFwkL04KLS9cXCQvYiBsb29wCi0KLXMhIC4uL2NvbmZpZy5oISFnCi1zISAuLi8uLi9iZmQvYmZkLmghIWcKLXMhIC4uL2l0YmwtcGFyc2UuaCEhZwotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAQkZERElSQCEkKEJGRERJUikhZwotcyFAU1JDRElSQC9jb25maWchJChzcmNkaXIpL2NvbmZpZyFnCi1zIUBTUkNESVJALy4uL29wY29kZXMhJChzcmNkaXIpLy4uL29wY29kZXMhZwotcyFAU1JDRElSQC8hIWcKLXMhIGNvbmZpZy5oISFnCi1zISBhcy5oISFnCi1zISBhc2ludGwuaCEhZwotcyEgdGFyZy1lbnYuaCEhZwotcyEgb2JqLWZvcm1hdC5oISFnCi1zISB0YXJnLWNwdS5oISFnCi1zISBmbG9udW0uaCEhZwotcyEgZXhwci5oISFnCi1zISB3cml0ZS5oISFnCi1zISBmcmFncy5oISFnCi1zISBoYXNoLmghIWcKLXMhIHJlYWQuaCEhZwotcyEgc3ltYm9scy5oISFnCi1zISB0Yy5oISFnCi1zISBvYmouaCEhZwotcyEgbGlzdGluZy5oISFnCi1zISBiaWdudW0uaCEhZwotcyEgYml0X2ZpeC5oISFnCi1zISBpdGJsLWNwdS5oISFnCi1zISBcJChzcmNkaXIpL2NvbmZpZy90ZS1nZW5lcmljLmghIWcKLXMhIFwkKElOQ0RJUikvbGliaWJlcnR5LmghIWcKLXMhIFwkKElOQ0RJUikvYW5zaWRlY2wuaCEhZwotcyEgXCQoSU5DRElSKS9mb3Blbi1zYW1lLmghIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2dhcy9kZXBlbmQuYyBiL2dhcy9kZXBlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YzdjOC4uMDAwMDAwMAotLS0gYS9nYXMvZGVwZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogZGVwZW5kLmMgLSBIYW5kbGUgZGVwZW5kZW5jeSB0cmFja2luZy4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qIFRoZSBmaWxlIHRvIHdyaXRlIHRvLCBvciBOVUxMIGlmIG5vIGRlcGVuZGVuY2llcyBiZWluZyBrZXB0LiAgKi8KLXN0YXRpYyBjaGFyICpkZXBfZmlsZSA9IE5VTEw7Ci0KLXN0cnVjdCBkZXBlbmRlbmN5Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHN0cnVjdCBkZXBlbmRlbmN5ICpuZXh0OwotfTsKLQotLyogQWxsIHRoZSBmaWxlcyB3ZSBkZXBlbmQgb24uICAqLwotc3RhdGljIHN0cnVjdCBkZXBlbmRlbmN5ICpkZXBfY2hhaW4gPSBOVUxMOwotCi0vKiBDdXJyZW50IGNvbHVtbiBpbiBvdXRwdXQgZmlsZS4gICovCi1zdGF0aWMgaW50IGNvbHVtbiA9IDA7Ci0KLXN0YXRpYyBpbnQgcXVvdGVfc3RyaW5nX2Zvcl9tYWtlIFBBUkFNUyAoKEZJTEUgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3cmFwX291dHB1dCBQQVJBTVMgKChGSUxFICosIGNoYXIgKiwgaW50KSk7Ci0KLS8qIE51bWJlciBvZiBjb2x1bW5zIGFsbG93YWJsZS4gICovCi0jZGVmaW5lIE1BWF9DT0xVTU5TIDcyCi0KLQwKLQotLyogU3RhcnQgc2F2aW5nIGRlcGVuZGVuY2llcywgdG8gYmUgd3JpdHRlbiB0byBGSUxFTkFNRS4gIElmIHRoaXMgaXMKLSAgIG5ldmVyIGNhbGxlZCwgdGhlbiBkZXBlbmRlbmN5IHRyYWNraW5nIGlzIHNpbXBseSBza2lwcGVkLiAgKi8KLQotdm9pZAotc3RhcnRfZGVwZW5kZW5jaWVzIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGRlcF9maWxlID0gZmlsZW5hbWU7Ci19Ci0KLS8qIE5vdGljZWQgYSBuZXcgZmlsZW5hbWUsIHNvIHRyeSB0byByZWdpc3RlciBpdC4gICovCi0KLXZvaWQKLXJlZ2lzdGVyX2RlcGVuZGVuY3kgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IGRlcGVuZGVuY3kgKmRlcDsKLQotICBpZiAoZGVwX2ZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChkZXAgPSBkZXBfY2hhaW47IGRlcCAhPSBOVUxMOyBkZXAgPSBkZXAtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgc3RyY21wIChmaWxlbmFtZSwgZGVwLT5maWxlKSkKLQlyZXR1cm47Ci0gICAgfQotCi0gIGRlcCA9IChzdHJ1Y3QgZGVwZW5kZW5jeSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBkZXBlbmRlbmN5KSk7Ci0gIGRlcC0+ZmlsZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgZGVwLT5uZXh0ID0gZGVwX2NoYWluOwotICBkZXBfY2hhaW4gPSBkZXA7Ci19Ci0KLS8qIFF1b3RlIGEgZmlsZSBuYW1lIHRoZSB3YXkgYG1ha2UnIHdhbnRzIGl0LCBhbmQgcHJpbnQgaXQgdG8gRklMRS4KLSAgIElmIEZJTEUgaXMgTlVMTCwgZG8gbm8gcHJpbnRpbmcsIGJ1dCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUKLSAgIHF1b3RlZCBzdHJpbmcuCi0KLSAgIFRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIGdjYyB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcy4gICovCi0KLXN0YXRpYyBpbnQKLXF1b3RlX3N0cmluZ19mb3JfbWFrZSAoZmlsZSwgc3JjKQotICAgICBGSUxFICpmaWxlOwotICAgICBjaGFyICpzcmM7Ci17Ci0gIGNoYXIgKnAgPSBzcmM7Ci0gIGludCBpID0gMDsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSAqcCsrOwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdcMCc6Ci0JY2FzZSAnICc6Ci0JY2FzZSAnXHQnOgotCSAgewotCSAgICAvKiBHTlUgbWFrZSB1c2VzIGEgd2VpcmQgcXVvdGluZyBzY2hlbWUgZm9yIHdoaXRlIHNwYWNlLgotCSAgICAgICBBIHNwYWNlIG9yIHRhYiBwcmVjZWRlZCBieSAyTisxIGJhY2tzbGFzaGVzIHJlcHJlc2VudHMKLQkgICAgICAgTiBiYWNrc2xhc2hlcyBmb2xsb3dlZCBieSBzcGFjZTsgYSBzcGFjZSBvciB0YWIKLQkgICAgICAgcHJlY2VkZWQgYnkgMk4gYmFja3NsYXNoZXMgcmVwcmVzZW50cyBOIGJhY2tzbGFzaGVzIGF0Ci0JICAgICAgIHRoZSBlbmQgb2YgYSBmaWxlIG5hbWU7IGFuZCBiYWNrc2xhc2hlcyBpbiBvdGhlcgotCSAgICAgICBjb250ZXh0cyBzaG91bGQgbm90IGJlIGRvdWJsZWQuICAqLwotCSAgICBjaGFyICpxOwotCSAgICBmb3IgKHEgPSBwIC0gMTsgc3JjIDwgcSAmJiBxWy0xXSA9PSAnXFwnOyAgcS0tKQotCSAgICAgIHsKLQkJaWYgKGZpbGUpCi0JCSAgcHV0YyAoJ1xcJywgZmlsZSk7Ci0JCWkrKzsKLQkgICAgICB9Ci0JICB9Ci0JICBpZiAoIWMpCi0JICAgIHJldHVybiBpOwotCSAgaWYgKGZpbGUpCi0JICAgIHB1dGMgKCdcXCcsIGZpbGUpOwotCSAgaSsrOwotCSAgZ290byBvcmRpbmFyeV9jaGFyOwotCSAgCi0JY2FzZSAnJCc6Ci0JICBpZiAoZmlsZSkKLQkgICAgcHV0YyAoYywgZmlsZSk7Ci0JICBpKys7Ci0JICAvKiBGYWxsIHRocm91Z2guICBUaGlzIGNhbiBtaXNoYW5kbGUgdGhpbmdzIGxpa2UgIiQoIiBidXQKLQkgICAgIHRoZXJlJ3Mgbm8gZWFzeSBmaXguICAqLwotCWRlZmF1bHQ6Ci0Jb3JkaW5hcnlfY2hhcjoKLQkgIC8qIFRoaXMgY2FuIG1pc2hhbmRsZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgIlwwXG4lKj9bXFx+IjsKLQkgICAgIGV4YWN0bHkgd2hpY2ggY2hhcnMgYXJlIG1pc2hhbmRsZWQgZGVwZW5kcyBvbiB0aGUgYG1ha2UnIHZlcnNpb24uCi0JICAgICBXZSBrbm93IG9mIG5vIHBvcnRhYmxlIHNvbHV0aW9uIGZvciB0aGlzOwotCSAgICAgZXZlbiBHTlUgbWFrZSAzLjc2LjEgZG9lc24ndCBzb2x2ZSB0aGUgcHJvYmxlbSBlbnRpcmVseS4KLQkgICAgIChBbHNvLCAnXDAnIGlzIG1pc2hhbmRsZWQgZHVlIHRvIG91ciBjYWxsaW5nIGNvbnZlbnRpb25zLikgICovCi0JICBpZiAoZmlsZSkKLQkgICAgcHV0YyAoYywgZmlsZSk7Ci0JICBpKys7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0vKiBBcHBlbmQgc29tZSBvdXRwdXQgdG8gdGhlIGZpbGUsIGtlZXBpbmcgdHJhY2sgb2YgY29sdW1ucyBhbmQgZG9pbmcKLSAgIHdyYXBwaW5nIGFzIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyB2b2lkCi13cmFwX291dHB1dCAoZiwgc3RyaW5nLCBzcGFjZXIpCi0gICAgIEZJTEUgKmY7Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHNwYWNlcjsKLXsKLSAgaW50IGxlbiA9IHF1b3RlX3N0cmluZ19mb3JfbWFrZSAoTlVMTCwgc3RyaW5nKTsKLQotICBpZiAobGVuID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChjb2x1bW4gJiYgTUFYX0NPTFVNTlMgLSAxIC8qc3BhY2VyKi8gLSAyIC8qYCBcJyovIDwgY29sdW1uICsgbGVuKQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICIgXFxcbiAiKTsKLSAgICAgIGNvbHVtbiA9IDA7Ci0gICAgICBpZiAoc3BhY2VyID09ICcgJykKLQlzcGFjZXIgPSAnXDAnOwotICAgIH0KLQotICBpZiAoc3BhY2VyID09ICcgJykKLSAgICB7Ci0gICAgICBwdXRjIChzcGFjZXIsIGYpOwotICAgICAgKytjb2x1bW47Ci0gICAgfQotCi0gIHF1b3RlX3N0cmluZ19mb3JfbWFrZSAoZiwgc3RyaW5nKTsKLSAgY29sdW1uICs9IGxlbjsKLQotICBpZiAoc3BhY2VyID09ICc6JykKLSAgICB7Ci0gICAgICBwdXRjIChzcGFjZXIsIGYpOwotICAgICAgKytjb2x1bW47Ci0gICAgfQotfQotCi0vKiBQcmludCBkZXBlbmRlbmN5IGZpbGUuICAqLwotCi12b2lkCi1wcmludF9kZXBlbmRlbmNpZXMgKCkKLXsKLSAgRklMRSAqZjsKLSAgc3RydWN0IGRlcGVuZGVuY3kgKmRlcDsKLQotICBpZiAoZGVwX2ZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZiA9IGZvcGVuIChkZXBfZmlsZSwgInciKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJDYW4ndCBvcGVuIGAlcycgZm9yIHdyaXRpbmciKSwgZGVwX2ZpbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2x1bW4gPSAwOwotICB3cmFwX291dHB1dCAoZiwgb3V0X2ZpbGVfbmFtZSwgJzonKTsKLSAgZm9yIChkZXAgPSBkZXBfY2hhaW47IGRlcCAhPSBOVUxMOyBkZXAgPSBkZXAtPm5leHQpCi0gICAgd3JhcF9vdXRwdXQgKGYsIGRlcC0+ZmlsZSwgJyAnKTsKLQotICBwdXRjICgnXG4nLCBmKTsKLQotICBpZiAoZmNsb3NlIChmKSkKLSAgICBhc193YXJuIChfKCJDYW4ndCBjbG9zZSBgJXMnIiksIGRlcF9maWxlKTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvTWFrZWZpbGUuYW0gYi9nYXMvZG9jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVhZjc3Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB5b3Ugd2FudDsgImFsbCIgaW5jbHVkZXMgZXZlcnl0aGluZwotQ09ORklHPWFsbAotCi1tYW5fTUFOUyA9IGFzLjEKLQotaW5mb19URVhJTkZPUyA9IGFzLnRleGluZm8gZ2FzcC50ZXhpCi0KLWFzY29uZmlnLnRleGk6ICQoQ09ORklHKS50ZXhpCi0Jcm0gLWYgYXNjb25maWcudGV4aQotCWxuIC1zICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkKLQotQ1BVX0RPQ1MgPSBcCi0JYy1hMjlrLnRleGkgXAotCWMtYXJtLnRleGkgXAotCWMtZDEwdi50ZXhpIFwKLQljLWg4MzAwLnRleGkgXAotCWMtaDg1MDAudGV4aSBcCi0JYy1ocHBhLnRleGkgXAotCWMtaTM3MC50ZXhpIFwKLQljLWkzODYudGV4aSBcCi0JYy1pOTYwLnRleGkgXAotCWMtbTMyci50ZXhpIFwKLQljLW02OGsudGV4aSBcCi0JYy1taXBzLnRleGkgXAotCWMtbnMzMmsudGV4aSBcCi0JYy1wai50ZXhpIFwKLQljLXNoLnRleGkgXAotCWMtc3BhcmMudGV4aSBcCi0JYy12YXgudGV4aSBcCi0JYy12ODUwLnRleGkgXAotCWMtejhrLnRleGkKLQotZ2FzdmVyLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgJEAKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiAkQAotCi1hcy5pbmZvOiAkKHNyY2RpcikvYXMudGV4aW5mbyBhc2NvbmZpZy50ZXhpIGdhc3Zlci50ZXhpICQoQ1BVX0RPQ1MpCi1hcy5kdmk6ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKLQotIyBUaGlzIG9uZSBpc24ndCByZWFkeSBmb3IgcHJpbWUgdGltZSB5ZXQuICBOb3QgZXZlbiBhIGxpdHRsZSBiaXQuCi0KLW5vaW5zdF9URVhJTkZPUyA9IGludGVybmFscy50ZXhpCi0KLURJU1RDTEVBTkZJTEVTID0gYXNjb25maWcudGV4aQotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGdhc3Zlci50ZXhpCmRpZmYgLS1naXQgYS9nYXMvZG9jL01ha2VmaWxlLmluIGIvZ2FzL2RvYy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlmZWQxNS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLi4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BTExfT0JKX0RFUFMgPSBAQUxMX09CSl9ERVBTQAotQVMgPSBAQVNACi1CRkRMSUIgPSBAQkZETElCQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HREJJTklUID0gQEdEQklOSVRACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxFWCA9IEBMRVhACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU9CSkRVTVAgPSBAT0JKRFVNUEAKLU9QQ09ERVNfTElCID0gQE9QQ09ERVNfTElCQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1WRVJTSU9OID0gQFZFUlNJT05ACi1ZQUNDID0gQFlBQ0NACi1hdG9mID0gQGF0b2ZACi1jZ2VuX2NwdV9wcmVmaXggPSBAY2dlbl9jcHVfcHJlZml4QAotZXh0cmFfb2JqZWN0cyA9IEBleHRyYV9vYmplY3RzQAotaW5zdGFsbF90b29sZGlyID0gQGluc3RhbGxfdG9vbGRpckAKLWwgPSBAbEAKLW9ial9mb3JtYXQgPSBAb2JqX2Zvcm1hdEAKLXRhcmdldF9jcHVfdHlwZSA9IEB0YXJnZXRfY3B1X3R5cGVACi10ZV9maWxlID0gQHRlX2ZpbGVACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB5b3Ugd2FudDsgImFsbCIgaW5jbHVkZXMgZXZlcnl0aGluZwotQ09ORklHID0gYWxsCi0KLW1hbl9NQU5TID0gYXMuMQotCi1pbmZvX1RFWElORk9TID0gYXMudGV4aW5mbyBnYXNwLnRleGkKLQotQ1BVX0RPQ1MgPSBcCi0JYy1hMjlrLnRleGkgXAotCWMtYXJtLnRleGkgXAotCWMtZDEwdi50ZXhpIFwKLQljLWg4MzAwLnRleGkgXAotCWMtaDg1MDAudGV4aSBcCi0JYy1ocHBhLnRleGkgXAotCWMtaTM3MC50ZXhpIFwKLQljLWkzODYudGV4aSBcCi0JYy1pOTYwLnRleGkgXAotCWMtbTMyci50ZXhpIFwKLQljLW02OGsudGV4aSBcCi0JYy1taXBzLnRleGkgXAotCWMtbnMzMmsudGV4aSBcCi0JYy1wai50ZXhpIFwKLQljLXNoLnRleGkgXAotCWMtc3BhcmMudGV4aSBcCi0JYy12YXgudGV4aSBcCi0JYy12ODUwLnRleGkgXAotCWMtejhrLnRleGkKLQotCi0jIFRoaXMgb25lIGlzbid0IHJlYWR5IGZvciBwcmltZSB0aW1lIHlldC4gIE5vdCBldmVuIGEgbGl0dGxlIGJpdC4KLQotbm9pbnN0X1RFWElORk9TID0gaW50ZXJuYWxzLnRleGkKLQotRElTVENMRUFORklMRVMgPSBhc2NvbmZpZy50ZXhpCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gZ2FzdmVyLnRleGkKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSAuLi9jb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1URVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAotSU5GT19ERVBTID0gYXMuaW5mbyBnYXNwLmluZm8KLURWSVMgPSBhcy5kdmkgZ2FzcC5kdmkKLVRFWElORk9TID0gYXMudGV4aW5mbyBnYXNwLnRleGkKLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotTUFOUyA9ICQobWFuX01BTlMpCi0KLU5ST0ZGID0gbnJvZmYKLURJU1RfQ09NTU9OID0gIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5kdmkgLmluZm8gLnBzIC50ZXhpIC50ZXhpbmZvIC50eGkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgZG9jL01ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0KLWFzLmluZm86IGFzLnRleGluZm8KLWFzLmR2aTogYXMudGV4aW5mbwotCi0KLWdhc3AuaW5mbzogZ2FzcC50ZXhpCi1nYXNwLmR2aTogZ2FzcC50ZXhpCi0KLQotRFZJUFMgPSBkdmlwcwotCi0udGV4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50ZXhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50eGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotLmR2aS5wczoKLQkkKERWSVBTKSAkPCAtbyAkQAotCi1pbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5mb2RpcikKLQlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGlmaWxlIGluIGBjZCAkJGQgJiYgZWNobyAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldYDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZC8kJGlmaWxlOyB0aGVuIFwKLQkgICAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGUiOyBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGU7IFwKLQkgICAgZWxzZSA6IDsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JQCQoUE9TVF9JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIjtcCi0JICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSB8fCA6O1wKLQkgIGRvbmU7IFwKLQllbHNlIDogOyBmaQotCi11bmluc3RhbGwtaW5mbzoKLQkkKFBSRV9VTklOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaWk9eWVzOyBcCi0JZWxzZSBpaT07IGZpOyBcCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAteiAiJGlpIiBcCi0JICAgIHx8IGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIC0tcmVtb3ZlICQkZmlsZTsgXAotCWRvbmUKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIChjZCAkKERFU1RESVIpJChpbmZvZGlyKSAmJiBybSAtZiAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldKTsgXAotCWRvbmUKLQotZGlzdC1pbmZvOiAkKElORk9fREVQUykKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgZmlsZSBpbiBgY2QgJCRkICYmIGV2YWwgZWNobyAkJGJhc2UqYDsgZG8gXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1tb3N0bHljbGVhbi1hbWluZm86Ci0JLXJtIC1mIGFzLmF1eCBhcy5jcCBhcy5jcHMgYXMuZHZpIGFzLmZuIGFzLmZucyBhcy5reSBhcy5reXMgYXMucHMgXAotCSAgYXMubG9nIGFzLnBnIGFzLnRvYyBhcy50cCBhcy50cHMgYXMudnIgYXMudnJzIGFzLm9wIGFzLnRyIFwKLQkgIGFzLmN2IGFzLmNuIGdhc3AuYXV4IGdhc3AuY3AgZ2FzcC5jcHMgZ2FzcC5kdmkgZ2FzcC5mbiBcCi0JICBnYXNwLmZucyBnYXNwLmt5IGdhc3Aua3lzIGdhc3AucHMgZ2FzcC5sb2cgZ2FzcC5wZyBnYXNwLnRvYyBcCi0JICBnYXNwLnRwIGdhc3AudHBzIGdhc3AudnIgZ2FzcC52cnMgZ2FzcC5vcCBnYXNwLnRyIGdhc3AuY3YgXAotCSAgZ2FzcC5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLXRhZ3M6IFRBR1MKLVRBR1M6Ci0KLQotZGlzdGRpciA9ICQodG9wX2J1aWxkZGlyKS8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi0KLXN1YmRpciA9IGRvYwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1hbQotZHZpLWFtOiAkKERWSVMpCi1kdmk6IGR2aS1hbQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stYW0KLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLWluc3RhbGwtZXhlYy1hbToKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLWFtCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1tYW4KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi1hbGwtYW06IE1ha2VmaWxlICQoTUFOUykKLWFsbC1yZWRpcmVjdDogYWxsLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczoKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuLWFtOiAgY2xlYW4tYW1pbmZvIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLWFtCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKLQkJZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQotLlBIT05ZOiBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gbW9zdGx5Y2xlYW4tYW1pbmZvIFwKLWRpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tYW1pbmZvIGluc3RhbGwtbWFuMSBcCi11bmluc3RhbGwtbWFuMSBpbnN0YWxsLW1hbiB1bmluc3RhbGwtbWFuIHRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIFwKLWluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIFwKLWluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi1hc2NvbmZpZy50ZXhpOiAkKENPTkZJRykudGV4aQotCXJtIC1mIGFzY29uZmlnLnRleGkKLQlsbiAtcyAkKHNyY2RpcikvJChDT05GSUcpLnRleGkgLi9hc2NvbmZpZy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBsbiAkKHNyY2RpcikvJChDT05GSUcpLnRleGkgLi9hc2NvbmZpZy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBjcCAkKHNyY2RpcikvJChDT05GSUcpLnRleGkgLi9hc2NvbmZpZy50ZXhpCi0KLWdhc3Zlci50ZXhpOiBNYWtlZmlsZQotCXJtIC1mICRACi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gJEAKLQotYXMuaW5mbzogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQotYXMuZHZpOiAkKHNyY2RpcikvYXMudGV4aW5mbyBhc2NvbmZpZy50ZXhpIGdhc3Zlci50ZXhpICQoQ1BVX0RPQ1MpCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYWxsLnRleGkgYi9nYXMvZG9jL2FsbC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTA1OGZiLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYWxsLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1AYyBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgR0FTIG1hbnVhbAotCi1AYyBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBhbGwtaW5jbHVzaXZlIHZlcnNpb24gb2YgbWFudWFsCi0KLUBjIHN3aXRjaGVzOi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQGMgUHJvcGVydGllcyBvZiB0aGUgbWFudWFsCi1AYyA9PT09PT09PT09PT09PT09PT09PT09PT0KLUBjIERpc2N1c3MgYWxsIGFyY2hpdGVjdHVyZXM/Ci1Ac2V0IEFMTC1BUkNICi1AYyBBIGdlbmVyaWMgZm9ybSBvZiBtYW51YWwgKG5vdCB0YWlsb3JlZCB0byBzcGVjaWZpYyB0YXJnZXQpPwotQHNldCBHRU5FUklDCi1AYyBJbmNsdWRlIHRleHQgb24gYXNzZW1ibGVyIGludGVybmFscz8KLUBjbGVhciBJTlRFUk5BTFMKLUBjIE1hbnkgb2JqZWN0IGZvcm1hdHMgc3VwcG9ydGVkIGluIHRoaXMgY29uZmlnPwotQHNldCBNVUxUSS1PQkoKLQotQGMgT2JqZWN0IGZvcm1hdHMgb2YgaW50ZXJlc3QKLUBjID09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Ac2V0IEFPVVQKLUBzZXQgQk9VVAotQHNldCBDT0ZGCi1Ac2V0IEVMRgotQHNldCBTT00KLQotQGMgQ1BVcyBvZiBpbnRlcmVzdAotQGMgPT09PT09PT09PT09PT09PQotQHNldCBBMjlLCi1Ac2V0IEFSQwotQHNldCBBUk0KLUBzZXQgRDEwVgotQHNldCBEMzBWCi1Ac2V0IEg4LzMwMAotQHNldCBIOC81MDAKLUBzZXQgSFBQQQotQHNldCBJMzcwCi1Ac2V0IEk4MDM4NgotQHNldCBJOTYwCi1Ac2V0IE0zMlIKLUBzZXQgTTY4MFgwCi1Ac2V0IE1DT1JFCi1Ac2V0IE1JUFMKLUBzZXQgUEoKLUBzZXQgU0gKLUBzZXQgU1BBUkMKLUBzZXQgVjg1MAotQHNldCBWQVgKLUBzZXQgVlhXT1JLUwotQHNldCBaODAwMAotCi1AYyBEb2VzIHRoaXMgdmVyc2lvbiBvZiB0aGUgYXNzZW1ibGVyIHVzZSB0aGUgZGlmZmVyZW5jZS10YWJsZSBrbHVnZT8KLUBzZXQgRElGRi1UQkwtS0xVR0UKLQotQGMgRG8gYWxsIG1hY2hpbmVzIGRlc2NyaWJlZCB1c2UgSUVFRSBmbG9hdGluZyBwb2ludD8KLUBjbGVhciBJRUVFRkxPQVQKLQotQGMgSXMgYSB3b3JkIDMyIGJpdHMsIG9yIDE2PwotQGNsZWFyIFczMgotQHNldCBXMTYKLQotQGMgRG8gc3ltYm9scyBoYXZlIGRpZmZlcmVudCBjaGFyYWN0ZXJzIHRoYW4gdXN1YWw/Ci1AY2xlYXIgU1BFQ0lBTC1TWU1TCi0KLUBjIHN0cmluZ3M6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AYyBOYW1lIG9mIHRoZSBhc3NlbWJsZXI6Ci1Ac2V0IEFTIGFzCi1AYyBOYW1lIG9mIEMgY29tcGlsZXI6Ci1Ac2V0IEdDQyBnY2MKLUBjIE5hbWUgb2YgbGlua2VyOgotQHNldCBMRCBsZAotQGMgVGV4dCBmb3IgdGFyZ2V0IG1hY2hpbmUgKGJlc3Qgbm90IHVzZWQgaW4gZ2VuZXJpYyBjYXNlOyBidXQganVzdCBpbiBjYXNlLi4uKQotQHNldCBUQVJHRVQgbWFjaGluZSBzcGVjaWZpYwotQGMgTmFtZSBvZiBvYmplY3QgZm9ybWF0IE5PVCBTRVQgaW4gZ2VuZXJpYyB2ZXJzaW9uCi1AY2xlYXIgT0JKLU5BTUUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYXMuMSBiL2dhcy9kb2MvYXMuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkNTgwNS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2FzLjEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIGFzIDEgIjI5IE1hcmNoIDE5OTYiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLQotLlNIIE5BTUUKLUdOVSBhcyBcLSB0aGUgcG9ydGFibGUgR05VIGFzc2VtYmxlci4KLQotLlNIIFNZTk9QU0lTCi0ubmEKLS5CIGFzCi0uUkIgIltcfCIgXC1hICJbXHwiIGRobG5zICJcfF0iIFxjCi1cJlxbXHxcPVxjCi0uSSBmaWxlXGMKLVwmXHxdXHxdCi0uUkIgIltcfCIgXC1EICJcfF0iCi0uUkIgIltcfCIgXC1cLWRlZnN5bVwgU1lNPVZBTCAiXHxdIgotLlJCICJbXHwiIFwtZiAiXHxdIgotLlJCICJbXHwiIFwtXC1nc3RhYnMgIlx8XSIKLS5SQiAiW1x8IiBcLUkKLS5JIHBhdGhcYwotXCZcfF0KLS5SQiAiW1x8IiBcLUsgIlx8XSIKLS5SQiAiW1x8IiBcLUwgIlx8XSIKLS5SQiAiW1x8IiBcLU1cIHxcIFwtXC1tcmkgIlx8XSIKLS5SQiAiW1x8IiBcLW8gCi0uSSBvYmpmaWxlXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1SICJcfF0iCi0uUkIgIltcfCIgXC1cLXRyYWRpdGlvbmFsXC1mb3JtYXQgIlx8XSIKLS5SQiAiW1x8IiBcLXYgIlx8XSIKLS5SQiAiW1x8IiBcLXcgIlx8XSIKLS5SQiAiW1x8IiBcLVxeXC0gIlwgfFwgIiBcYwotLkkgZmlsZXNcYwotXCZcfC5cfC5cfC5cfF0KLQotLkkgaTk2MC1vbmx5IG9wdGlvbnM6Ci0uYnIKLS5SQiAiW1x8IiBcLUFDQSAiXHx8XHwiIFwtQUNBX0EgIlx8fFx8IiBcLUFDQlxjCi0uUkIgIlx8fFx8IiBcLUFDQyAiXHx8XHwiIFwtQUtBICJcfHxcfCIgXC1BS0JcYwotLlJCICJcfHxcfCIgXC1BS0MgIlx8fFx8IiBcLUFNQyAiXHxdIgotLlJCICJbXHwiIFwtYiAiXHxdIgotLlJCICJbXHwiIFwtbm8tcmVsYXggIlx8XSIKLQotLkkgbTY4MHgwLW9ubHkgb3B0aW9uczoKLS5icgotLlJCICJbXHwiIFwtbCAiXHxdIgotLlJCICJbXHwiIFwtbWM2ODAwMCAiXHx8XHwiIFwtbWM2ODAxMCAiXHx8XHwiIFwtbWM2ODAyMCAiXHxdIgotLmFkIGIKLQotLlNIIERFU0NSSVBUSU9OCi1HTlUgXGMKLS5CIGFzXGMKLVwmIGlzIHJlYWxseSBhIGZhbWlseSBvZiBhc3NlbWJsZXJzLiAgCi1JZiB5b3UgdXNlIChvciBoYXZlIHVzZWQpIHRoZSBHTlUgYXNzZW1ibGVyIG9uIG9uZSBhcmNoaXRlY3R1cmUsIHlvdQotc2hvdWxkIGZpbmQgYSBmYWlybHkgc2ltaWxhciBlbnZpcm9ubWVudCB3aGVuIHlvdSB1c2UgaXQgb24gYW5vdGhlcgotYXJjaGl0ZWN0dXJlLiAgRWFjaCB2ZXJzaW9uIGhhcyBtdWNoIGluIGNvbW1vbiB3aXRoIHRoZSBvdGhlcnMsCi1pbmNsdWRpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cywgbW9zdCBhc3NlbWJsZXIgZGlyZWN0aXZlcyAob2Z0ZW4gY2FsbGVkCi1cYwotLkkgcHNldWRvLW9wcylcYwotXCYgYW5kIGFzc2VtYmxlciBzeW50YXguICAKLQotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBzeW50YXggYW5kIHBzZXVkby1vcHMgdXNlZCBieSBHTlUgXGMKLS5CIGFzXGMKLVwmLCBzZWUgYFx8XGMKLS5CIGFzXGMKLVx8JyBlbnRyeSBpbiBcYwotLkIgaW5mbyBcYwotKG9yIHRoZSBtYW51YWwgXGMKLS5JCi0uSQotVXNpbmcgYXM6IFRoZSBHTlUgQXNzZW1ibGVyXGMKLVwmKS4KLQotXGMKLS5CIGFzXGMKLVwmIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhc3NlbWJsZSB0aGUgb3V0cHV0IG9mIHRoZSBHTlUgQwotY29tcGlsZXIgXGMKLS5CIGdjY1xjCi1cJiBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIgXGMKLS5CIGxkXGMKLVwmLiAgTmV2ZXJ0aGVsZXNzLAotd2UndmUgdHJpZWQgdG8gbWFrZSBcYwotLkIgYXNcYwotXCYgYXNzZW1ibGUgY29ycmVjdGx5IGV2ZXJ5dGhpbmcgdGhhdCB0aGUgbmF0aXZlCi1hc3NlbWJsZXIgd291bGQuCi1UaGlzIGRvZXNuJ3QgbWVhbiBcYwotLkIgYXNcYwotXCYgYWx3YXlzIHVzZXMgdGhlIHNhbWUgc3ludGF4IGFzIGFub3RoZXIKLWFzc2VtYmxlciBmb3IgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlOyBmb3IgZXhhbXBsZSwgd2Uga25vdyBvZiBzZXZlcmFsCi1pbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgNjgweDAgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4LgotCi1FYWNoIHRpbWUgeW91IHJ1biBcYwotLkIgYXNcYwotXCYgaXQgYXNzZW1ibGVzIGV4YWN0bHkgb25lIHNvdXJjZQotcHJvZ3JhbS4gIFRoZSBzb3VyY2UgcHJvZ3JhbSBpcyBtYWRlIHVwIG9mIG9uZSBvciBtb3JlIGZpbGVzLgotKFRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhbHNvIGEgZmlsZS4pCi0KLUlmIFxjCi0uQiBhc1xjCi1cJiBpcyBnaXZlbiBubyBmaWxlIG5hbWVzIGl0IGF0dGVtcHRzIHRvIHJlYWQgb25lIGlucHV0IGZpbGUKLWZyb20gdGhlIFxjCi0uQiBhc1xjCi1cJiBzdGFuZGFyZCBpbnB1dCwgd2hpY2ggaXMgbm9ybWFsbHkgeW91ciB0ZXJtaW5hbC4gIFlvdQotbWF5IGhhdmUgdG8gdHlwZSBcYwotLkIgY3RsLURcYwotXCYgdG8gdGVsbCBcYwotLkIgYXNcYwotXCYgdGhlcmUgaXMgbm8gbW9yZSBwcm9ncmFtCi10byBhc3NlbWJsZS4gIFVzZSBgXHxcYwotLkIgXC1cXlwtXGMKLVx8JyBpZiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IG5hbWUgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKLWluIHlvdXIgY29tbWFuZCBsaW5lLgotCi0uQiBhc1xjCi1cJiBtYXkgd3JpdGUgd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBzdGFuZGFyZCBlcnJvcgotZmlsZSAodXN1YWxseSB5b3VyIHRlcm1pbmFsKS4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiBcYwotLkIgYXNcYwotXCYgaXMKLXJ1biBhdXRvbWF0aWNhbGx5IGJ5IGEgY29tcGlsZXIuICBXYXJuaW5ncyByZXBvcnQgYW4gYXNzdW1wdGlvbiBtYWRlIHNvCi10aGF0IFxjCi0uQiBhc1xjCi1cJiBjb3VsZCBrZWVwIGFzc2VtYmxpbmcgYSBmbGF3ZWQgcHJvZ3JhbTsgZXJyb3JzIHJlcG9ydCBhCi1ncmF2ZSBwcm9ibGVtIHRoYXQgc3RvcHMgdGhlIGFzc2VtYmx5LgotCi0uU0ggT1BUSU9OUwotLlRQCi0uQlIgXC1hCi1UdXJuIG9uIGFzc2VtYmx5IGxpc3RpbmdzLiAgVGhlcmUgYXJlIHZhcmlvdXMgc3Vib3B0aW9ucy4KLS5CIGQKLW9taXRzIGRlYnVnZ2luZyBkaXJlY3RpdmVzLgotLkIgaAotaW5jbHVkZXMgdGhlIGhpZ2ggbGV2ZWwgc291cmNlIGNvZGU7IHRoaXMgaXMgb25seSBhdmFpbGFibGUgaWYgdGhlCi1zb3VyY2UgZmlsZSBjYW4gYmUgZm91bmQsIGFuZCB0aGUgY29kZSB3YXMgY29tcGlsZWQgd2l0aAotLkIgXC1nLgotLkIgbAotaW5jbHVkZXMgYW4gYXNzZW1ibHkgbGlzdGluZy4KLS5CIG4KLW9taXRzIGZvcm1zIHByb2Nlc3NpbmcuCi0uQiBzCi1pbmNsdWRlcyBhIHN5bWJvbCBsaXN0aW5nLgotLkIgPQotLkkgZmlsZQotc2V0cyB0aGUgbGlzdGluZyBmaWxlIG5hbWU7IHRoaXMgbXVzdCBiZSB0aGUgbGFzdCBzdWJvcHRpb24uCi1UaGUgZGVmYXVsdCBzdWJvcHRpb25zIGFyZQotLkIgaGxzLgotLlRQCi0uQiBcLUQKLVRoaXMgb3B0aW9uIGlzIGFjY2VwdGVkIG9ubHkgZm9yIHNjcmlwdCBjb21wYXRpYmlsaXR5IHdpdGggY2FsbHMgdG8KLW90aGVyIGFzc2VtYmxlcnM7IGl0IGhhcyBubyBlZmZlY3Qgb24gXGMKLS5CIGFzXGMKLVwmLgotLlRQCi0uQiBcLVwtZGVmc3ltIFNZTT1WQUxVRQotRGVmaW5lIHRoZSBzeW1ib2wgU1lNIHRvIGJlIFZBTFVFIGJlZm9yZSBhc3NlbWJsaW5nIHRoZSBpbnB1dCBmaWxlLgotVkFMVUUgbXVzdCBiZSBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgQXMgaW4gQywgYSBsZWFkaW5nIDB4IGluZGljYXRlcyBhCi1oZXhhZGVjaW1hbCB2YWx1ZSwgYW5kIGEgbGVhZGluZyAwIGluZGljYXRlcyBhbiBvY3RhbCB2YWx1ZS4KLS5UUAotLkIgXC1mCi1gYGZhc3QnJy0tc2tpcCBwcmVwcm9jZXNzaW5nIChhc3N1bWUgc291cmNlIGlzIGNvbXBpbGVyIG91dHB1dCkuCi0uVFAKLS5CSSAiXC1JXCAiIHBhdGgKLUFkZCAKLS5JIHBhdGgKLXRvIHRoZSBzZWFyY2ggbGlzdCBmb3IgCi0uQiAuaW5jbHVkZQotZGlyZWN0aXZlcy4KLS5UUAotLkIgXC1cLWdzdGFicwotR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBlYWNoIGFzc2VtYmxlciBsaW5lLiAgVGhpcwotbWF5IGhlbHAgZGVidWdnaW5nIGFzc2VtYmxlciBjb2RlLCBpZiB0aGUgZGVidWdnZXIgY2FuIGhhbmRsZSBpdC4KLS5UUAotLkIgXC1LCi1Jc3N1ZSB3YXJuaW5ncyB3aGVuIGRpZmZlcmVuY2UgdGFibGVzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50cy4KLS5UUAotLkIgXC1MCi1LZWVwIChpbiBzeW1ib2wgdGFibGUpIGxvY2FsIHN5bWJvbHMsIHN0YXJ0aW5nIHdpdGggYFx8XGMKLS5CIExcYwotXHwnCi0uVFAKLS5CIFwtTSwgXC1cLW1yaQotQXNzZW1ibGUgaW4gTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLS5UUAotLkJJICJcLW9cICIgb2JqZmlsZQotTmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IGZyb20gXGMKLS5CIGFzCi0uVFAKLS5CIFwtUgotRm9sZCBkYXRhIHNlY3Rpb24gaW50byB0ZXh0IHNlY3Rpb24KLS5UUAotLkIgXC1cLXRyYWRpdGlvbmFsXC1mb3JtYXQKLVVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyLCB3aGVuIHBvc3NpYmxlLgotLlRQCi0uQiBcLXYKLUFubm91bmNlIFxjCi0uQiBhc1xjCi1cJiB2ZXJzaW9uCi0uVFAKLS5CIFwtVywgXC1cLW5vLXdhcm4KLVN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMuCi0uVFAKLS5CIFwtXC1mYXRhbFwtd2FybmluZ3MKLUNvbnNpZGVyIHdhcm5pbmdzIHRvIGJlIGZhdGFsLgotLlRQCi0uQiBcLVwtd2FybgotSnVzdCB3YXJuIG9uIHdhcm5pbmdzLgotLlRQCi0uSVIgIlwtXF5cLSIgIlwgfFwgIiAiZmlsZXNcfC5cfC5cfC4iCi1Tb3VyY2UgZmlsZXMgdG8gYXNzZW1ibGUsIG9yIHN0YW5kYXJkIGlucHV0IChcYwotLkJSICJcLVxeXC0iICIpIgotLlRQCi0uQkkgXC1BIHZhcgotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIEludGVsIDk2MC4pCi1TcGVjaWZ5IHdoaWNoIHZhcmlhbnQgb2YgdGhlIDk2MCBhcmNoaXRlY3R1cmUgaXMgdGhlIHRhcmdldC4KLS5UUAotLkIgXC1iCi0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKLUFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlbi4KLS5UUAotLkIgXC1uby1yZWxheAotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIEludGVsIDk2MC4pCi1EbyBub3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzOwotZXJyb3IgaWYgbmVjZXNzYXJ5LgotLlRQCi0uQiBcLWwKLS5JCi0oV2hlbiBjb25maWd1cmVkIGZvciBNb3Rvcm9sYSA2ODAwMCkuICAKLS5icgotU2hvcnRlbiByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCBzeW1ib2xzLCB0byBvbmUgd29yZCBpbnN0ZWFkIG9mIHR3by4KLS5UUAotLkJSICJcLW1jNjgwMDAiICJcfHxcfCIgIlwtbWM2ODAxMCIgIlx8fFx8IiAiXC1tYzY4MDIwIgotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIE1vdG9yb2xhIDY4MDAwKS4gIAotLmJyCi1TcGVjaWZ5IHdoYXQgcHJvY2Vzc29yIGluIHRoZSA2ODAwMCBmYW1pbHkgaXMgdGhlIHRhcmdldCAoZGVmYXVsdCA2ODAyMCkKLQotLlBQCi1PcHRpb25zIG1heSBiZSBpbiBhbnkgb3JkZXIsIGFuZCBtYXkgYmUKLWJlZm9yZSwgYWZ0ZXIsIG9yIGJldHdlZW4gZmlsZSBuYW1lcy4gIFRoZSBvcmRlciBvZiBmaWxlIG5hbWVzIGlzCi1zaWduaWZpY2FudC4KLQotYFx8XGMKLS5CIFwtXF5cLVxjCi1cfCcgKHR3byBoeXBoZW5zKSBieSBpdHNlbGYgbmFtZXMgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKLWV4cGxpY2l0bHksIGFzIG9uZSBvZiB0aGUgZmlsZXMgZm9yIFxjCi0uQiBhc1xjCi1cJiB0byBhc3NlbWJsZS4KLQotRXhjZXB0IGZvciBgXHxcYwotLkIgXC1cXlwtXGMKLVx8JyBhbnkgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRoYXQgYmVnaW5zIHdpdGggYQotaHlwaGVuIChgXHxcYwotLkIgXC1cYwotXHwnKSBpcyBhbiBvcHRpb24uICBFYWNoIG9wdGlvbiBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgotXGMKLS5CIGFzXGMKLVwmLiAgTm8gb3B0aW9uIGNoYW5nZXMgdGhlIHdheSBhbm90aGVyIG9wdGlvbiB3b3Jrcy4gIEFuCi1vcHRpb24gaXMgYSBgXHxcYwotLkIgXC1cYwotXHwnIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGxldHRlcnM7IHRoZSBjYXNlIG9mCi10aGUgbGV0dGVyIGlzIGltcG9ydGFudC4gICBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwuCi0KLVRoZSBgXHxcYwotLkIgXC1vXGMKLVx8JyBvcHRpb24gZXhwZWN0cyBleGFjdGx5IG9uZSBmaWxlIG5hbWUgdG8gZm9sbG93LiAgVGhlIGZpbGUKLW5hbWUgbWF5IGVpdGhlciBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG9wdGlvbidzIGxldHRlciAoY29tcGF0aWJsZQotd2l0aCBvbGRlciBhc3NlbWJsZXJzKSBvciBpdCBtYXkgYmUgdGhlIG5leHQgY29tbWFuZCBhcmd1bWVudCAoR05VCi1zdGFuZGFyZCkuICAKLQotVGhlc2UgdHdvIGNvbW1hbmQgbGluZXMgYXJlIGVxdWl2YWxlbnQ6Ci0uYnIKLS5CCi1hc1wgXCBcLW9cIFwgbXlcLW9iamVjdFwtZmlsZS5vXCBcIG11bWJsZS5zCi0uYnIKLS5CCi1hc1wgXCBcLW9teVwtb2JqZWN0XC1maWxlLm9cIFwgbXVtYmxlLnMKLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBhcyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVXNpbmcgYXM6IFRoZSBHTlUgQXNzZW1ibGVyXGMKLVwmOwotLkJSIGdjYyAiKCIgMSAiKSwiCi0uQlIgbGQgIigiIDEgIikuIgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9nYXMvZG9jL2FzLnRleGluZm8gYi9nYXMvZG9jL2FzLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTdhMDAuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9hcy50ZXhpbmZvCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1NyArMCwwIEBACi1caW5wdXQgdGV4aW5mbyBAYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi1UZXhpbmZvLSotCi1AYyAgQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMjAwMAotQGMgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVVBEQVRFISEgIE9uIGZ1dHVyZSB1cGRhdGVzLS0KLUBjICAgKDEpICAgY2hlY2sgZm9yIG5ldyBtYWNoaW5lLWRlcCBjbWRsaW5lIG9wdGlvbnMgaW4KLUBjICAgICAgICAgbWRfcGFyc2Vfb3B0aW9uIGRlZmluaXRpb25zIGluIGNvbmZpZy90Yy0qLmMKLUBjICAgKDIpICAgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGRpcmVjdGl2ZXMsIGV4YW1pbmUgbWRfcHNldWRvX29wCi1AYyAgICAgICAgIGluIGNvbmZpZy90Yy0qLmMKLUBjICAgKDMpICAgZm9yIG9iamVjdC1mb3JtYXQgc3BlY2lmaWMgZGlyZWN0aXZlcywgZXhhbWluZSBvYmpfcHNldWRvX29wCi1AYyAgICAgICAgIGluIGNvbmZpZy9vYmotKi5jICAgICAgIAotQGMgICAoNCkgICBwb3J0YWJsZSBkaXJlY3RpdmVzIGluIHBvdGFibGVbXSBpbiByZWFkLmMKLUBjICUqKnN0YXJ0IG9mIGhlYWRlcgotQHNldGZpbGVuYW1lIGFzLmluZm8KLUBjIC0tLWNvbmZpZy0tLQotQGMgZGVmYXVsdHMsIGNvbmZpZyBmaWxlIG1heSBvdmVycmlkZToKLUBzZXQgaGF2ZS1zdGFicwotQGMgLS0tCi1AaW5jbHVkZSBhc2NvbmZpZy50ZXhpCi1AaW5jbHVkZSBnYXN2ZXIudGV4aQotQGMgLS0tCi1AYyBjb21tb24gT1IgY29tYmluYXRpb25zIG9mIGNvbmRpdGlvbnMKLUBpZnNldCBBT1VUCi1Ac2V0IGFvdXQtYm91dAotQGVuZCBpZnNldAotQGlmc2V0IEFSTS9UaHVtYgotQHNldCBBUk0KLUBlbmQgaWZzZXQKLUBpZnNldCBCT1VUCi1Ac2V0IGFvdXQtYm91dAotQGVuZCBpZnNldAotQGlmc2V0IEg4LzMwMAotQHNldCBIOAotQGVuZCBpZnNldAotQGlmc2V0IEg4LzUwMAotQHNldCBIOAotQGVuZCBpZnNldAotQGlmc2V0IFNICi1Ac2V0IEg4Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSFBQQQotQHNldCBhYm5vcm1hbC1zZXBhcmF0b3IKLUBlbmQgaWZzZXQKLUBjIC0tLS0tLS0tLS0tLQotQGlmc2V0IEdFTkVSSUMKLUBzZXR0aXRsZSBVc2luZyBAdmFsdWV7QVN9Ci1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Ac2V0dGl0bGUgVXNpbmcgQHZhbHVle0FTfSAoQHZhbHVle1RBUkdFVH0pCi1AZW5kIGlmY2xlYXIKLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBjICUqKmVuZCBvZiBoZWFkZXIKLQotQGMgQHNtYWxsYm9vawotQGMgQHNldCBTTUFMTAotQGMgV0FSRSEgU29tZSBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgc2VjdGlvbnMgY29udGFpbiB0YWJsZXMgb2YgbWFjaGluZQotQGMgaW5zdHJ1Y3Rpb25zLiAgRXhjZXB0IGluIG11bHRpLWNvbHVtbiBmb3JtYXQsIHRoZXNlIHRhYmxlcyBsb29rIHNpbGx5LgotQGMgVW5mb3J0dW5hdGVseSwgVGV4aW5mbyBkb2Vzbid0IGhhdmUgYSBnZW5lcmFsLXB1cnBvc2UgbXVsdGktY29sIGZvcm1hdCwgc28KLUBjIHRoZSBtdWx0aS1jb2wgZm9ybWF0IGlzIGZha2VkIHdpdGhpbiBAZXhhbXBsZSBzZWN0aW9ucy4KLUBjIAotQGMgQWdhaW4gdW5mb3J0dW5hdGVseSwgdGhlIG5hdHVyYWwgc2l6ZSB0aGF0IGZpdHMgb24gYSBwYWdlLCBmb3IgdGhlc2UgdGFibGVzLAotQGMgaXMgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCBzbWFsbGJvb2sgaXMgdHVybmVkIG9uLgotQGMgVGhpcyBtYXR0ZXJzLCBiZWNhdXNlIG9mIG9yZGVyOiB0ZXh0IGZsb3cgc3dpdGNoZXMgY29sdW1ucyBhdCBlYWNoIHBhZ2UKLUBjIGJyZWFrLgotQGMgCi1AYyBUaGUgZm9ybWF0IGZha2VkIGluIHRoaXMgc291cmNlIHdvcmtzIHJlYXNvbmFibHkgd2VsbCBmb3Igc21hbGxib29rLAotQGMgbm90IHdlbGwgZm9yIHRoZSBkZWZhdWx0IGxhcmdlLXBhZ2UgZm9ybWF0LiAgVGhpcyBtYW51YWwgZXhwZWN0cyB0aGF0IGlmIHlvdQotQGMgdHVybiBvbiBAc21hbGxib29rLCB5b3Ugd2lsbCBhbHNvIHVuY29tbWVudCB0aGUgIkBzZXQgU01BTEwiIHRvIGVuYWJsZSB0aGUKLUBjIHRhYmxlcyBpbiBxdWVzdGlvbi4gIFlvdSBjYW4gdHVybiBvbiBvbmUgd2l0aG91dCB0aGUgb3RoZXIgYXQgeW91cgotQGMgZGlzY3JldGlvbiwgb2YgY291cnNlLiAKLUBpZmluZm8KLUBzZXQgU01BTEwKLUBjIHRoZSBpbnNuIHRhYmxlcyBsb29rIGp1c3QgYXMgc2lsbHkgaW4gaW5mbyBmaWxlcyByZWdhcmRsZXNzIG9mIHNtYWxsYm9vaywKLUBjIG1pZ2h0IGFzIHdlbGwgc2hvdyAnZW0gYW55d2F5cy4KLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIEFzOiAoYXMpLiAgICAgICAgICAgICAgICAgICAgIFRoZSBHTlUgYXNzZW1ibGVyLgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGZpbmFsb3V0Ci1Ac3luY29kZWluZGV4IGt5IGNwCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBBc3NlbWJsZXIgIkB2YWx1ZXtBU30iLgotCi1Db3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMgbWFudWFsCi11bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlIHJlc3VsdGluZwotZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0bwotdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIGlmaW5mbwotCi1AdGl0bGVwYWdlCi1AdGl0bGUgVXNpbmcgQHZhbHVle0FTfQotQHN1YnRpdGxlIFRoZSBAc2N7Z251fSBBc3NlbWJsZXIKLUBpZmNsZWFyIEdFTkVSSUMKLUBzdWJ0aXRsZSBmb3IgdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseQotQGVuZCBpZmNsZWFyCi1Ac3AgMQotQHN1YnRpdGxlIFZlcnNpb24gQHZhbHVle1ZFUlNJT059Ci1Ac3AgMQotQHNwIDEzCi1UaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEluYy4gIHRoYW5rcyBUaGUgTmljZSBDb21wdXRlcgotQ29tcGFueSBvZiBBdXN0cmFsaWEgZm9yIGxvYW5pbmcgRGVhbiBFbHNuZXIgdG8gd3JpdGUgdGhlCi1maXJzdCAoVmF4KSB2ZXJzaW9uIG9mIEBjb2Rle2FzfSBmb3IgUHJvamVjdCBAc2N7Z251fS4KLVRoZSBwcm9wcmlldG9ycywgbWFuYWdlbWVudCBhbmQgc3RhZmYgb2YgVE5DQ0EgdGhhbmsgRlNGIGZvcgotZGlzdHJhY3RpbmcgdGhlIGJvc3Mgd2hpbGUgdGhleSBnb3Qgc29tZSB3b3JrCi1kb25lLgotQHNwIDMKLUBhdXRob3IgRGVhbiBFbHNuZXIsIEpheSBGZW5sYXNvbiAmIGZyaWVuZHMKLUBwYWdlCi1AdGV4Ci17XHBhcnNraXA9MHB0Ci1caGZpbGwge1xpdCBVc2luZyB7XHR0IEB2YWx1ZXtBU319fVxwYXIKLVxoZmlsbCBFZGl0ZWQgYnkgQ3lnbnVzIFN1cHBvcnRccGFyCi19Ci0lImJveGl0IiBtYWNybyBmb3IgZmlndXJlczoKLSVNb2RpZmllZCBmcm9tIEtudXRoJ3MgYGBib3hpdCcnIG1hY3JvIGZyb20gVGVYYm9vayAoYW5zd2VyIHRvIGV4ZXJjaXNlIDIxLjMpCi1cZ2RlZlxib3hpdCMxIzJ7XHZib3h7XGhydWxlXGhib3h7XHZydWxlXGtlcm4zcHQKLSAgICAgXHZib3h7XHBhcmluZGVudD0wcHRccGFyc2tpcD0wcHRcaHNpemU9IzFca2VybjNwdFxzdHJ1dFxoZmlsCi0jMlxoZmlsXHN0cnV0XGtlcm4zcHR9XGtlcm4zcHRcdnJ1bGV9XGhydWxlfX0lYm94IHdpdGggdmlzaWJsZSBvdXRsaW5lCi1cZ2RlZlxpYm94IzEjMntcaGJveCB0byAjMXsjMlxoZmlsfVxrZXJuOHB0fSUgaW52aXNpYmxlIGJveAotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMgbWFudWFsCi11bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlIHJlc3VsdGluZwotZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0bwotdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Abm9kZSBUb3AKLUB0b3AgVXNpbmcgQHZhbHVle0FTfQotCi1UaGlzIGZpbGUgaXMgYSB1c2VyIGd1aWRlIHRvIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgQGNvZGV7QHZhbHVle0FTfX0gdmVyc2lvbgotQHZhbHVle1ZFUlNJT059LgotQGlmY2xlYXIgR0VORVJJQwotVGhpcyB2ZXJzaW9uIG9mIHRoZSBmaWxlIGRlc2NyaWJlcyBAY29kZXtAdmFsdWV7QVN9fSBjb25maWd1cmVkIHRvIGdlbmVyYXRlCi1jb2RlIGZvciBAdmFsdWV7VEFSR0VUfSBhcmNoaXRlY3R1cmVzLgotQGVuZCBpZmNsZWFyCi1AbWVudQotKiBPdmVydmlldzo6ICAgICAgICAgICAgICAgICAgICBPdmVydmlldwotKiBJbnZva2luZzo6ICAgICAgICAgICAgICAgICAgICBDb21tYW5kLUxpbmUgT3B0aW9ucwotKiBTeW50YXg6OiAgICAgICAgICAgICAgICAgICAgICBTeW50YXgKLSogU2VjdGlvbnM6OiAgICAgICAgICAgICAgICAgICAgU2VjdGlvbnMgYW5kIFJlbG9jYXRpb24KLSogU3ltYm9sczo6ICAgICAgICAgICAgICAgICAgICAgU3ltYm9scwotKiBFeHByZXNzaW9uczo6ICAgICAgICAgICAgICAgICBFeHByZXNzaW9ucwotKiBQc2V1ZG8gT3BzOjogICAgICAgICAgICAgICAgICBBc3NlbWJsZXIgRGlyZWN0aXZlcwotKiBNYWNoaW5lIERlcGVuZGVuY2llczo6ICAgICAgICBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotKiBSZXBvcnRpbmcgQnVnczo6ICAgICAgICAgICAgICBSZXBvcnRpbmcgQnVncwotKiBBY2tub3dsZWRnZW1lbnRzOjogICAgICAgICAgICBXaG8gRGlkIFdoYXQKLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgT3ZlcnZpZXcKLUBjaGFwdGVyIE92ZXJ2aWV3Ci1AaWZ0ZXgKLVRoaXMgbWFudWFsIGlzIGEgdXNlciBndWlkZSB0byB0aGUgQHNje2dudX0gYXNzZW1ibGVyIEBjb2Rle0B2YWx1ZXtBU319LgotQGlmY2xlYXIgR0VORVJJQwotVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYW51YWwgZGVzY3JpYmVzIEBjb2Rle0B2YWx1ZXtBU319IGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUKLWNvZGUgZm9yIEB2YWx1ZXtUQVJHRVR9IGFyY2hpdGVjdHVyZXMuCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZ0ZXgKLQotQGNpbmRleCBpbnZvY2F0aW9uIHN1bW1hcnkKLUBjaW5kZXggb3B0aW9uIHN1bW1hcnkKLUBjaW5kZXggc3VtbWFyeSBvZiBvcHRpb25zCi1IZXJlIGlzIGEgYnJpZWYgc3VtbWFyeSBvZiBob3cgdG8gaW52b2tlIEBjb2Rle0B2YWx1ZXtBU319LiAgRm9yIGRldGFpbHMsCi1AcHhyZWZ7SW52b2tpbmcsLENvbWFuZC1MaW5lIE9wdGlvbnN9LgotCi1AYyBXZSBkb24ndCB1c2UgZGVmZm4gYW5kIGZyaWVuZHMgZm9yIHRoZSBmb2xsb3dpbmcgYmVjYXVzZSB0aGV5IHNlZW0KLUBjIHRvIGJlIGxpbWl0ZWQgdG8gb25lIGxpbmUgZm9yIHRoZSBoZWFkZXIuCi1Ac21hbGxleGFtcGxlCi1AdmFsdWV7QVN9IFsgLWFbY2RobG5zXVs9ZmlsZV0gXSBbIC1EIF0gIFsgLS1kZWZzeW0gQHZhcntzeW19PUB2YXJ7dmFsfSBdCi0gWyAtZiBdIFsgLS1nc3RhYnMgXSBbIC0tZ2R3YXJmMiBdIFsgLS1oZWxwIF0gWyAtSSBAdmFye2Rpcn0gXSBbIC1KIF0gWyAtSyBdIFsgLUwgXQotIFsgLS1rZWVwLWxvY2FscyBdIFsgLW8gQHZhcntvYmpmaWxlfSBdIFsgLVIgXSBbIC0tc3RhdGlzdGljcyBdIFsgLXYgXQotIFsgLXZlcnNpb24gXSBbIC0tdmVyc2lvbiBdIFsgLVcgXSBbIC0td2FybiBdIFsgLS1mYXRhbC13YXJuaW5ncyBdIAotIFsgLXcgXSBbIC14IF0gWyAtWiBdCi1AaWZzZXQgQTI5SwotQGMgYW0yOWsgaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJDCi0gWyAtbWJpZy1lbmRpYW4gfCAtbWxpdHRsZS1lbmRpYW4gXQotQGVuZCBpZnNldAotQGlmc2V0IEFSTQotIFsgLW1bYXJtXTEgfCAtbVthcm1dMiB8IC1tW2FybV0yNTAgfCAtbVthcm1dMyB8IC1tW2FybV02IHwgLW1bYXJtXTYwIHwKLSAgIC1tW2FybV02MDAgfCAtbVthcm1dNjEwIHwgLW1bYXJtXTYyMCB8IC1tW2FybV03W3RdW1tkXW1baV1dW2ZlXSB8IC1tW2FybV03MCB8Ci0gICAtbVthcm1dNzAwIHwgLW1bYXJtXTcxMFtjXSB8IC1tW2FybV03MTAwIHwgLW1bYXJtXTc1MDAgfCAtbVthcm1dOCB8Ci0gICAtbVthcm1dODEwIHwgLW1bYXJtXTkgfCAtbVthcm1dOTIwIHwgLW1bYXJtXTkyMHQgfCAtbVthcm1dOXRkbWkgfAotICAgLW1zdHJvbmdhcm0gfCAtbXN0cm9uZ2FybTExMCB8IC1tc3Ryb25nYXJtMTEwMCBdCi0gWyAtbVthcm1ddjIgfCAtbVthcm1ddjJhIHwgLW1bYXJtXXYzIHwgLW1bYXJtXXYzbSB8IC1tW2FybV12NCB8IC1tW2FybV12NHQgfAotICAgLW1bYXJtXXY1IHwgLVthcm1ddjV0IF0KLSBbIC1tdGh1bWIgfCAtbWFsbCBdCi0gWyAtbWZwYTEwIHwgLW1mcGExMSB8IC1tZnBlLW9sZCB8IC1tbm8tZnB1IF0KLSBbIC1FQiB8IC1FTCBdCi0gWyAtbWFwY3MtMzIgfCAtbWFwY3MtMjYgfCAtbWFwY3MtZmxvYXQgfCAtbWFwY3MtcmVlbnRyYW50IF0KLSBbIC1tdGh1bWItaW50ZXJ3b3JrIF0KLSBbIC1tb2FiaSBdCi0gWyAtayBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgRDEwVgotIFsgLU8gXQotQGVuZCBpZnNldAotQGlmc2V0IEQzMFYKLSBbIC1PIHwgLW4gfCAtTiBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgKLUBjIEhpdGFjaGkgZmFtaWx5IGNoaXBzIGhhdmUgbm8gbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyIG9wdGlvbnMKLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1AYyBIUFBBIGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIgb3B0aW9ucyAoeWV0KS4KLUBlbmQgaWZzZXQKLUBpZnNldCBQSgotIFsgLW1iIHwgLW1lIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBTUEFSQwotQGMgVGhlIG9yZGVyIGhlcmUgaXMgaW1wb3J0YW50LiAgU2VlIGMtc3BhcmMudGV4aS4KLSBbIC1BdjYgfCAtQXY3IHwgLUF2OCB8IC1Bc3BhcmNsZXQgfCAtQXNwYXJjbGl0ZQotICAgLUF2OHBsdXMgfCAtQXY4cGx1c2EgfCAtQXY5IHwgLUF2OWEgXQotIFsgLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhIF0gWyAtYnVtcCBdIFsgLTMyIHwgLTY0IF0KLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotQGMgWjgwMDAgaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotQGMgc2VlIG1kX3BhcnNlX29wdGlvbiBpbiB0Yy1pOTYwLmMKLSBbIC1BQ0EgfCAtQUNBX0EgfCAtQUNCIHwgLUFDQyB8IC1BS0EgfCAtQUtCIHwgLUFLQyB8IC1BTUMgXQotIFsgLWIgXSBbIC1uby1yZWxheCBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgTTY4MFgwCi0gWyAtbCBdIFsgLW02ODAwMCB8IC1tNjgwMTAgfCAtbTY4MDIwIHwgLi4uIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBNQ09SRQotIFsgLWpzcmkyYnNyIF0gWyAtc2lmaWx0ZXIgXSBbIC1yZWxheCBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgTUlQUwotIFsgLW5vY3BwIF0gWyAtRUwgXSBbIC1FQiBdIFsgLUcgQHZhcntudW19IF0gWyAtbWNwdT1AdmFye0NQVX0gXQotIFsgLW1pcHMxIF0gWyAtbWlwczIgXSBbIC1taXBzMyBdIFsgLW00NjUwIF0gWyAtbm8tbTQ2NTAgXQotIFsgLS10cmFwIF0gWyAtLWJyZWFrIF0KLSBbIC0tZW11bGF0aW9uPUB2YXJ7bmFtZX0gXQotQGVuZCBpZnNldAotIFsgLS0gfCBAdmFye2ZpbGVzfSBAZG90c3t9IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWFbY2RobG1uc10KLVR1cm4gb24gbGlzdGluZ3MsIGluIGFueSBvZiBhIHZhcmlldHkgb2Ygd2F5czoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYWMKLW9taXQgZmFsc2UgY29uZGl0aW9uYWxzCi0KLUBpdGVtIC1hZAotb21pdCBkZWJ1Z2dpbmcgZGlyZWN0aXZlcwotCi1AaXRlbSAtYWgKLWluY2x1ZGUgaGlnaC1sZXZlbCBzb3VyY2UKLQotQGl0ZW0gLWFsCi1pbmNsdWRlIGFzc2VtYmx5Ci0KLUBpdGVtIC1hbQotaW5jbHVkZSBtYWNybyBleHBhbnNpb25zCi0KLUBpdGVtIC1hbgotb21pdCBmb3JtcyBwcm9jZXNzaW5nCi0KLUBpdGVtIC1hcwotaW5jbHVkZSBzeW1ib2xzCi0KLUBpdGVtID1maWxlCi1zZXQgdGhlIG5hbWUgb2YgdGhlIGxpc3RpbmcgZmlsZQotQGVuZCB0YWJsZQotCi1Zb3UgbWF5IGNvbWJpbmUgdGhlc2Ugb3B0aW9uczsgZm9yIGV4YW1wbGUsIHVzZSBAc2FtcHstYWxufSBmb3IgYXNzZW1ibHkKLWxpc3Rpbmcgd2l0aG91dCBmb3JtcyBwcm9jZXNzaW5nLiAgVGhlIEBzYW1wez1maWxlfSBvcHRpb24sIGlmIHVzZWQsIG11c3QgYmUKLXRoZSBsYXN0IG9uZS4gIEJ5IGl0c2VsZiwgQHNhbXB7LWF9IGRlZmF1bHRzIHRvIEBzYW1wey1haGxzfS4KLQotQGl0ZW0gLUQKLUlnbm9yZWQuICBUaGlzIG9wdGlvbiBpcyBhY2NlcHRlZCBmb3Igc2NyaXB0IGNvbXBhdGliaWxpdHkgd2l0aCBjYWxscyB0bwotb3RoZXIgYXNzZW1ibGVycy4KLQotQGl0ZW0gLS1kZWZzeW0gQHZhcntzeW19PUB2YXJ7dmFsdWV9Ci1EZWZpbmUgdGhlIHN5bWJvbCBAdmFye3N5bX0gdG8gYmUgQHZhcnt2YWx1ZX0gYmVmb3JlIGFzc2VtYmxpbmcgdGhlIGlucHV0IGZpbGUuCi1AdmFye3ZhbHVlfSBtdXN0IGJlIGFuIGludGVnZXIgY29uc3RhbnQuICBBcyBpbiBDLCBhIGxlYWRpbmcgQHNhbXB7MHh9Ci1pbmRpY2F0ZXMgYSBoZXhhZGVjaW1hbCB2YWx1ZSwgYW5kIGEgbGVhZGluZyBAc2FtcHswfSBpbmRpY2F0ZXMgYW4gb2N0YWwgdmFsdWUuCi0KLUBpdGVtIC1mCi1gYGZhc3QnJy0tLXNraXAgd2hpdGVzcGFjZSBhbmQgY29tbWVudCBwcmVwcm9jZXNzaW5nIChhc3N1bWUgc291cmNlIGlzCi1jb21waWxlciBvdXRwdXQpLgotCi1AaXRlbSAtLWdzdGFicwotR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBlYWNoIGFzc2VtYmxlciBsaW5lLiAgVGhpcwotbWF5IGhlbHAgZGVidWdnaW5nIGFzc2VtYmxlciBjb2RlLCBpZiB0aGUgZGVidWdnZXIgY2FuIGhhbmRsZSBpdC4KLQotQGl0ZW0gLS1nZHdhcmYyCi1HZW5lcmF0ZSBEV0FSRjIgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBlYWNoIGFzc2VtYmxlciBsaW5lLiAgVGhpcwotbWF5IGhlbHAgZGVidWdnaW5nIGFzc2VtYmxlciBjb2RlLCBpZiB0aGUgZGVidWdnZXIgY2FuIGhhbmRsZSBpdC4KLQotQGl0ZW0gLS1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCBleGl0LgotCi1AaXRlbSAtSSBAdmFye2Rpcn0KLUFkZCBkaXJlY3RvcnkgQHZhcntkaXJ9IHRvIHRoZSBzZWFyY2ggbGlzdCBmb3IgQGNvZGV7LmluY2x1ZGV9IGRpcmVjdGl2ZXMuCi0KLUBpdGVtIC1KCi1Eb24ndCB3YXJuIGFib3V0IHNpZ25lZCBvdmVyZmxvdy4KLQotQGl0ZW0gLUsKLUBpZmNsZWFyIERJRkYtVEJMLUtMVUdFCi1UaGlzIG9wdGlvbiBpcyBhY2NlcHRlZCBidXQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5LgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgRElGRi1UQkwtS0xVR0UKLUlzc3VlIHdhcm5pbmdzIHdoZW4gZGlmZmVyZW5jZSB0YWJsZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzLgotQGVuZCBpZnNldAotCi1AaXRlbSAtTAotQGl0ZW14IC0ta2VlcC1sb2NhbHMKLUtlZXAgKGluIHRoZSBzeW1ib2wgdGFibGUpIGxvY2FsIHN5bWJvbHMuICBPbiB0cmFkaXRpb25hbCBhLm91dCBzeXN0ZW1zCi10aGVzZSBzdGFydCB3aXRoIEBzYW1we0x9LCBidXQgZGlmZmVyZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgbG9jYWwKLWxhYmVsIHByZWZpeGVzLgotCi1AaXRlbSAtbyBAdmFye29iamZpbGV9Ci1OYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgZnJvbSBAY29kZXtAdmFsdWV7QVN9fSBAdmFye29iamZpbGV9LgotCi1AaXRlbSAtUgotRm9sZCB0aGUgZGF0YSBzZWN0aW9uIGludG8gdGhlIHRleHQgc2VjdGlvbi4KLQotQGl0ZW0gLS1zdGF0aXN0aWNzCi1QcmludCB0aGUgbWF4aW11bSBzcGFjZSAoaW4gYnl0ZXMpIGFuZCB0b3RhbCB0aW1lIChpbiBzZWNvbmRzKSB1c2VkIGJ5Ci1hc3NlbWJseS4KLQotQGl0ZW0gLS1zdHJpcC1sb2NhbC1hYnNvbHV0ZQotUmVtb3ZlIGxvY2FsIGFic29sdXRlIHN5bWJvbHMgZnJvbSB0aGUgb3V0Z29pbmcgc3ltYm9sIHRhYmxlLgotCi1AaXRlbSAtdgotQGl0ZW14IC12ZXJzaW9uCi1QcmludCB0aGUgQGNvZGV7YXN9IHZlcnNpb24uCi0KLUBpdGVtIC0tdmVyc2lvbgotUHJpbnQgdGhlIEBjb2Rle2FzfSB2ZXJzaW9uIGFuZCBleGl0LgotCi1AaXRlbSAtVwotQGl0ZW14IC0tbm8td2FybgotU3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcy4KLQotQGl0ZW0gLS1mYXRhbC13YXJuaW5ncwotVHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzLgotCi1AaXRlbSAtLXdhcm4KLURvbid0IHN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMgb3IgdHJlYXQgdGhlbSBhcyBlcnJvcnMuCi0KLUBpdGVtIC13Ci1JZ25vcmVkLgotCi1AaXRlbSAteAotSWdub3JlZC4KLQotQGl0ZW0gLVoKLUdlbmVyYXRlIGFuIG9iamVjdCBmaWxlIGV2ZW4gYWZ0ZXIgZXJyb3JzLgotCi1AaXRlbSAtLSB8IEB2YXJ7ZmlsZXN9IEBkb3Rze30KLVN0YW5kYXJkIGlucHV0LCBvciBzb3VyY2UgZmlsZXMgdG8gYXNzZW1ibGUuCi0KLUBlbmQgdGFibGUKLQotQGlmc2V0IEFSQwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hbiBBUkMgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBBUkMgZW5kaWFubmVzcwotQGNpbmRleCBlbmRpYW5uZXNzLCBBUkMKLUBjaW5kZXggYmlnIGVuZGlhbiBvdXRwdXQsIEFSQwotQGl0ZW0gLW1iaWctZW5kaWFuCi1HZW5lcmF0ZSBgYGJpZyBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgotCi1AY2luZGV4IGxpdHRsZSBlbmRpYW4gb3V0cHV0LCBBUkMKLUBpdGVtIC1tbGl0dGxlLWVuZGlhbgotR2VuZXJhdGUgYGBsaXR0bGUgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgQVJNCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IgdGhlIEFSTQotcHJvY2Vzc29yIGZhbWlseS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtbVthcm1dWzF8MnwzfDZ8N3w4fDldWy4uLl0gCi1TcGVjaWZ5IHdoaWNoIEFSTSBwcm9jZXNzb3IgdmFyaWFudCBpcyB0aGUgdGFyZ2V0LgotQGl0ZW0gLW1bYXJtXXZbMnwyYXwzfDNtfDR8NHR8NXw1dF0KLVNwZWNpZnkgd2hpY2ggQVJNIGFyY2hpdGVjdHVyZSB2YXJpYW50IGlzIHVzZWQgYnkgdGhlIHRhcmdldC4KLUBpdGVtIC1tdGh1bWIgfCAtbWFsbAotRW5hYmxlIG9yIGRpc2FibGUgVGh1bWIgb25seSBpbnN0cnVjdGlvbiBkZWNvZGluZy4KLUBpdGVtIC1tZnBhMTAgfCAtbWZwYTExIHwgLW1mcGUtb2xkIHwgLW1uby1mcHUKLVNlbGVjdCB3aGljaCBGbG9hdGluZyBQb2ludCBhcmNoaXRjdHVyZSBpcyB0aGUgdGFyZ2V0LgotQGl0ZW0gLW1hcGNzLTMyIHwgLW1hcGNzLTI2IHwgLW1hcGNzLWZsb2F0IHwgLW1hcGNzLXJlZW50cmFudCB8IC1tb2FiaQotU2VsZWN0IHdoaWNoIHByb2NlZHVyZSBjYWxsaW5nIGNvbnZlbnRpb24gaXMgaW4gdXNlLgotQGl0ZW0gLUVCIHwgLUVMCi1TZWxlY3QgZWl0aGVyIGJpZy1lbmRpYW4gKC1FQikgb3IgbGl0dGxlLWVuZGlhbiAoLUVMKSBvdXRwdXQuCi1AaXRlbSAtbXRodW1iLWludGVyd29yawotU3BlY2lmeSB0aGF0IHRoZSBjb2RlIGhhcyBiZWVuIGdlbmVyYXRlZCB3aXRoIGludGVyd29ya2luZyBiZXR3ZWVuIFRodW1iIGFuZAotQVJNIGNvZGUgaW4gbWluZC4KLUBpdGVtIC1rCi1TcGVjaWZ5IHRoYXQgUElDIGNvZGUgaGFzIGJlZW4gZ2VuZXJhdGVkLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgRDEwVgotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hIEQxMFYgcHJvY2Vzc29yLgotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEQxMFYgb3B0aW1pemF0aW9uCi1AY2luZGV4IG9wdGltaXphdGlvbiwgRDEwVgotQGl0ZW0gLU8KLU9wdGltaXplIG91dHB1dCBieSBwYXJhbGxlbGl6aW5nIGluc3RydWN0aW9ucy4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEQzMFYKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciBhIEQzMFYKLXByb2Nlc3Nvci4KLUB0YWJsZSBAY29kZQotQGNpbmRleCBEMzBWIG9wdGltaXphdGlvbgotQGNpbmRleCBvcHRpbWl6YXRpb24sIEQzMFYKLUBpdGVtIC1PCi1PcHRpbWl6ZSBvdXRwdXQgYnkgcGFyYWxsZWxpemluZyBpbnN0cnVjdGlvbnMuCi0KLUBjaW5kZXggRDMwViBub3BzCi1AaXRlbSAtbgotV2FybiB3aGVuIG5vcHMgYXJlIGdlbmVyYXRlZC4KLQotQGNpbmRleCBEMzBWIG5vcHMgYWZ0ZXIgMzItYml0IG11bHRpcGx5Ci1AaXRlbSAtTgotV2FybiB3aGVuIGEgbm9wIGFmdGVyIGEgMzItYml0IG11bHRpcGx5IGluc3RydWN0aW9uIGlzIGdlbmVyYXRlZC4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEk5NjAKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciB0aGUKLUludGVsIDgwOTYwIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQUNBIHwgLUFDQV9BIHwgLUFDQiB8IC1BQ0MgfCAtQUtBIHwgLUFLQiB8IC1BS0MgfCAtQU1DCi1TcGVjaWZ5IHdoaWNoIHZhcmlhbnQgb2YgdGhlIDk2MCBhcmNoaXRlY3R1cmUgaXMgdGhlIHRhcmdldC4KLQotQGl0ZW0gLWIKLUFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlbi4KLQotQGl0ZW0gLW5vLXJlbGF4Ci1EbyBub3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzOwotZXJyb3IgaWYgbmVjZXNzYXJ5LgotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLQotQGlmc2V0IE02ODBYMAotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZQotTW90b3JvbGEgNjgwMDAgc2VyaWVzLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLWwKLVNob3J0ZW4gcmVmZXJlbmNlcyB0byB1bmRlZmluZWQgc3ltYm9scywgdG8gb25lIHdvcmQgaW5zdGVhZCBvZiB0d28uCi0KLUBpdGVtIC1tNjgwMDAgfCAtbTY4MDA4IHwgLW02ODAxMCB8IC1tNjgwMjAgfCAtbTY4MDMwIHwgLW02ODA0MCB8IC1tNjgwNjAKLUBpdGVteCB8IC1tNjgzMDIgfCAtbTY4MzMxIHwgLW02ODMzMiB8IC1tNjgzMzMgfCAtbTY4MzQwIHwgLW1jcHUzMiB8IC1tNTIwMAotU3BlY2lmeSB3aGF0IHByb2Nlc3NvciBpbiB0aGUgNjgwMDAgZmFtaWx5IGlzIHRoZSB0YXJnZXQuICBUaGUgZGVmYXVsdAotaXMgbm9ybWFsbHkgdGhlIDY4MDIwLCBidXQgdGhpcyBjYW4gYmUgY2hhbmdlZCBhdCBjb25maWd1cmF0aW9uIHRpbWUuCi0KLUBpdGVtIC1tNjg4ODEgfCAtbTY4ODgyIHwgLW1uby02ODg4MSB8IC1tbm8tNjg4ODIKLVRoZSB0YXJnZXQgbWFjaGluZSBkb2VzIChvciBkb2VzIG5vdCkgaGF2ZSBhIGZsb2F0aW5nLXBvaW50IGNvcHJvY2Vzc29yLgotVGhlIGRlZmF1bHQgaXMgdG8gYXNzdW1lIGEgY29wcm9jZXNzb3IgZm9yIDY4MDIwLCA2ODAzMCwgYW5kIGNwdTMyLiAgQWx0aG91Z2gKLXRoZSBiYXNpYyA2ODAwMCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSA2ODg4MSwgYSBjb21iaW5hdGlvbiBvZiB0aGUKLXR3byBjYW4gYmUgc3BlY2lmaWVkLCBzaW5jZSBpdCdzIHBvc3NpYmxlIHRvIGRvIGVtdWxhdGlvbiBvZiB0aGUKLWNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyB3aXRoIHRoZSBtYWluIHByb2Nlc3Nvci4KLQotQGl0ZW0gLW02ODg1MSB8IC1tbm8tNjg4NTEKLVRoZSB0YXJnZXQgbWFjaGluZSBkb2VzIChvciBkb2VzIG5vdCkgaGF2ZSBhIG1lbW9yeS1tYW5hZ2VtZW50Ci11bml0IGNvcHJvY2Vzc29yLiAgVGhlIGRlZmF1bHQgaXMgdG8gYXNzdW1lIGFuIE1NVSBmb3IgNjgwMjAgYW5kIHVwLgotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBQSgotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hIHBpY29KYXZhIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggUEogZW5kaWFubmVzcwotQGNpbmRleCBlbmRpYW5uZXNzLCBQSgotQGNpbmRleCBiaWcgZW5kaWFuIG91dHB1dCwgUEoKLUBpdGVtIC1tYgotR2VuZXJhdGUgYGBiaWcgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGNpbmRleCBsaXR0bGUgZW5kaWFuIG91dHB1dCwgUEoKLUBpdGVtIC1tbAotR2VuZXJhdGUgYGBsaXR0bGUgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi0KLUBpZnNldCBTUEFSQwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkCi1mb3IgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQXY2IHwgLUF2NyB8IC1BdjggfCAtQXNwYXJjbGV0IHwgLUFzcGFyY2xpdGUKLUBpdGVteCAtQXY4cGx1cyB8IC1BdjhwbHVzYSB8IC1BdjkgfCAtQXY5YQotRXhwbGljaXRseSBzZWxlY3QgYSB2YXJpYW50IG9mIHRoZSBTUEFSQyBhcmNoaXRlY3R1cmUuCi0KLUBzYW1wey1BdjhwbHVzfSBhbmQgQHNhbXB7LUF2OHBsdXNhfSBzZWxlY3QgYSAzMiBiaXQgZW52aXJvbm1lbnQuCi1Ac2FtcHstQXY5fSBhbmQgQHNhbXB7LUF2OWF9IHNlbGVjdCBhIDY0IGJpdCBlbnZpcm9ubWVudC4KLQotQHNhbXB7LUF2OHBsdXNhfSBhbmQgQHNhbXB7LUF2OWF9IGVuYWJsZSB0aGUgU1BBUkMgVjkgaW5zdHJ1Y3Rpb24gc2V0IHdpdGgKLVVsdHJhU1BBUkMgZXh0ZW5zaW9ucy4KLQotQGl0ZW0gLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhCi1Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIHY5IGFzc2VtYmxlci4gIFRoZXNlIG9wdGlvbnMgYXJlCi1lcXVpdmFsZW50IHRvIC1BdjhwbHVzIGFuZCAtQXY4cGx1c2EsIHJlc3BlY3RpdmVseS4KLQotQGl0ZW0gLWJ1bXAKLVdhcm4gd2hlbiB0aGUgYXNzZW1ibGVyIHN3aXRjaGVzIHRvIGFub3RoZXIgYXJjaGl0ZWN0dXJlLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgTUlQUwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hIE1JUFMgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1HIEB2YXJ7bnVtfQotVGhpcyBvcHRpb24gc2V0cyB0aGUgbGFyZ2VzdCBzaXplIG9mIGFuIG9iamVjdCB0aGF0IGNhbiBiZSByZWZlcmVuY2VkCi1pbXBsaWNpdGx5IHdpdGggdGhlIEBjb2Rle2dwfSByZWdpc3Rlci4gIEl0IGlzIG9ubHkgYWNjZXB0ZWQgZm9yIHRhcmdldHMgdGhhdAotdXNlIEVDT0ZGIGZvcm1hdCwgc3VjaCBhcyBhIERFQ3N0YXRpb24gcnVubmluZyBVbHRyaXguICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LgotCi1AY2luZGV4IE1JUFMgZW5kaWFubmVzcwotQGNpbmRleCBlbmRpYW5uZXNzLCBNSVBTCi1AY2luZGV4IGJpZyBlbmRpYW4gb3V0cHV0LCBNSVBTCi1AaXRlbSAtRUIKLUdlbmVyYXRlIGBgYmlnIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBjaW5kZXggbGl0dGxlIGVuZGlhbiBvdXRwdXQsIE1JUFMKLUBpdGVtIC1FTAotR2VuZXJhdGUgYGBsaXR0bGUgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGNpbmRleCBNSVBTIElTQQotQGl0ZW0gLW1pcHMxCi1AaXRlbXggLW1pcHMyCi1AaXRlbXggLW1pcHMzCi1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsLgotQHNhbXB7LW1pcHMxfSBjb3JyZXNwb25kcyB0byB0aGUgQHNje3IyMDAwfSBhbmQgQHNje3IzMDAwfSBwcm9jZXNzb3JzLAotQHNhbXB7LW1pcHMyfSB0byB0aGUgQHNje3I2MDAwfSBwcm9jZXNzb3IsIGFuZCBAc2FtcHstbWlwczN9IHRvIHRoZSBAc2N7cjQwMDB9Ci1wcm9jZXNzb3IuCi0KLUBpdGVtIC1tNDY1MAotQGl0ZW14IC1uby1tNDY1MAotR2VuZXJhdGUgY29kZSBmb3IgdGhlIE1JUFMgQHNje3I0NjUwfSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdAotdGhlIEBzYW1we21hZH0gYW5kIEBzYW1we21hZHV9IGluc3RydWN0aW9uLCBhbmQgdG8gbm90IHNjaGVkdWxlIEBzYW1we25vcH0KLWluc3RydWN0aW9ucyBhcm91bmQgYWNjZXNzZXMgdG8gdGhlIEBzYW1we0hJfSBhbmQgQHNhbXB7TE99IHJlZ2lzdGVycy4KLUBzYW1wey1uby1tNDY1MH0gdHVybnMgb2ZmIHRoaXMgb3B0aW9uLgotCi1AaXRlbSAtbWNwdT1AdmFye0NQVX0KLUdlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBNSVBTIGNwdS4gIFRoaXMgaGFzIGxpdHRsZSBlZmZlY3Qgb24gdGhlCi1hc3NlbWJsZXIsIGJ1dCBpdCBpcyBwYXNzZWQgYnkgQGNvZGV7QHZhbHVle0dDQ319LgotCi1AY2luZGV4IGVtdWxhdGlvbgotQGl0ZW0gLS1lbXVsYXRpb249QHZhcntuYW1lfQotVGhpcyBvcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGVtdWxhdGUgQGNvZGV7QHZhbHVle0FTfX0gY29uZmlndXJlZAotZm9yIHNvbWUgb3RoZXIgdGFyZ2V0LCBpbiBhbGwgcmVzcGVjdHMsIGluY2x1ZGluZyBvdXRwdXQgZm9ybWF0IChjaG9vc2luZwotYmV0d2VlbiBFTEYgYW5kIEVDT0ZGIG9ubHkpLCBoYW5kbGluZyBvZiBwc2V1ZG8tb3Bjb2RlcyB3aGljaCBtYXkgZ2VuZXJhdGUKLWRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvciBzdG9yZSBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24sIGFuZCBkZWZhdWx0Ci1lbmRpYW5uZXNzLiAgVGhlIGF2YWlsYWJsZSBjb25maWd1cmF0aW9uIG5hbWVzIGFyZTogQHNhbXB7bWlwc2Vjb2ZmfSwKLUBzYW1we21pcHNlbGZ9LCBAc2FtcHttaXBzbGVjb2ZmfSwgQHNhbXB7bWlwc2JlY29mZn0sIEBzYW1we21pcHNsZWxmfSwKLUBzYW1we21pcHNiZWxmfS4gIFRoZSBmaXJzdCB0d28gZG8gbm90IGFsdGVyIHRoZSBkZWZhdWx0IGVuZGlhbm5lc3MgZnJvbSB0aGF0Ci1vZiB0aGUgcHJpbWFyeSB0YXJnZXQgZm9yIHdoaWNoIHRoZSBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQ7IHRoZSBvdGhlcnMgY2hhbmdlCi10aGUgZGVmYXVsdCB0byBsaXR0bGUtIG9yIGJpZy1lbmRpYW4gYXMgaW5kaWNhdGVkIGJ5IHRoZSBAc2FtcHtifSBvciBAc2FtcHtsfQotaW4gdGhlIG5hbWUuICBVc2luZyBAc2FtcHstRUJ9IG9yIEBzYW1wey1FTH0gd2lsbCBvdmVycmlkZSB0aGUgZW5kaWFubmVzcwotc2VsZWN0aW9uIGluIGFueSBjYXNlLgotCi1UaGlzIG9wdGlvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9ubHkgd2hlbiB0aGUgcHJpbWFyeSB0YXJnZXQKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIGlzIGEgTUlQUyBFTEYgb3IgRUNPRkYgdGFyZ2V0LgotRnVydGhlcm1vcmUsIHRoZSBwcmltYXJ5IHRhcmdldCBvciBvdGhlcnMgc3BlY2lmaWVkIHdpdGgKLUBzYW1wey0tZW5hYmxlLXRhcmdldHM9QGRvdHN7fX0gYXQgY29uZmlndXJhdGlvbiB0aW1lIG11c3QgaW5jbHVkZSBzdXBwb3J0IGZvcgotdGhlIG90aGVyIGZvcm1hdCwgaWYgYm90aCBhcmUgdG8gYmUgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsIHRoZSBJcml4IDUKLWNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgc3VwcG9ydCBmb3IgYm90aC4KLQotRXZlbnR1YWxseSwgdGhpcyBvcHRpb24gd2lsbCBzdXBwb3J0IG1vcmUgY29uZmlndXJhdGlvbnMsIHdpdGggbW9yZQotZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciB0aGUgYXNzZW1ibGVyJ3MgYmVoYXZpb3IsIGFuZCB3aWxsIGJlIHN1cHBvcnRlZCBmb3IKLW1vcmUgcHJvY2Vzc29ycy4KLQotQGl0ZW0gLW5vY3BwCi1AY29kZXtAdmFsdWV7QVN9fSBpZ25vcmVzIHRoaXMgb3B0aW9uLiAgSXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotdGhlIG5hdGl2ZSB0b29scy4KLQotQG5lZWQgOTAwCi1AaXRlbSAtLXRyYXAKLUBpdGVteCAtLW5vLXRyYXAKLUBpdGVteCAtLWJyZWFrCi1AaXRlbXggLS1uby1icmVhawotQ29udHJvbCBob3cgdG8gZGVhbCB3aXRoIG11bHRpcGxpY2F0aW9uIG92ZXJmbG93IGFuZCBkaXZpc2lvbiBieSB6ZXJvLgotQHNhbXB7LS10cmFwfSBvciBAc2FtcHstLW5vLWJyZWFrfSAod2hpY2ggYXJlIHN5bm9ueW1zKSB0YWtlIGEgdHJhcCBleGNlcHRpb24KLShhbmQgb25seSB3b3JrIGZvciBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsIDIgYW5kIGhpZ2hlcik7Ci1Ac2FtcHstLWJyZWFrfSBvciBAc2FtcHstLW5vLXRyYXB9IChhbHNvIHN5bm9ueW1zLCBhbmQgdGhlIGRlZmF1bHQpIHRha2UgYQotYnJlYWsgZXhjZXB0aW9uLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgTUNPUkUKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYW4gTUNvcmUgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1qc3JpMmJzcgotQGl0ZW14IC1ub2pzcmkyYnNyCi1FbmFibGUgb3IgZGlzYWJsZSB0aGUgSlNSSSB0byBCU1IgdHJhbnNmb3JtYXRpb24uICBCeSBkZWZhdWx0IHRoaXMgaXMgZW5hYmxlZC4KLVRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIEBzYW1wey1ub2pzcmkyYnNyfSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIGl0LgotCi1AaXRlbSAtc2lmaWx0ZXIKLUBpdGVteCAtbm9zaWZpbHRlcgotRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNpbGljb24gZmlsdGVyIGJlaGF2aW91ci4gIEJ5IGRlZmF1bHQgdGhpcyBpcyBkaXNhYmxlZC4KLVRoZSBkZWZhdWx0IGNhbiBiZSBvdmVyaWRkZW4gYnkgdGhlIEBzYW1wey1zaWZpbHRlcn0gY29tbWFuZCBsaW5lIG9wdGlvbi4KLQotQGl0ZW0gLXJlbGF4Ci1BbHRlciBqdW1wIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzLgotCi0KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQG1lbnUKLSogTWFudWFsOjogICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIG9mIHRoaXMgTWFudWFsCi0qIEdOVSBBc3NlbWJsZXI6OiAgICAgICAgICAgICAgIFRoZSBHTlUgQXNzZW1ibGVyCi0qIE9iamVjdCBGb3JtYXRzOjogICAgICAgICAgICAgIE9iamVjdCBGaWxlIEZvcm1hdHMKLSogQ29tbWFuZCBMaW5lOjogICAgICAgICAgICAgICAgQ29tbWFuZCBMaW5lCi0qIElucHV0IEZpbGVzOjogICAgICAgICAgICAgICAgIElucHV0IEZpbGVzCi0qIE9iamVjdDo6ICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCAoT2JqZWN0KSBGaWxlCi0qIEVycm9yczo6ICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGFuZCBXYXJuaW5nIE1lc3NhZ2VzCi1AZW5kIG1lbnUKLQotQG5vZGUgTWFudWFsCi1Ac2VjdGlvbiBTdHJ1Y3R1cmUgb2YgdGhpcyBNYW51YWwKLQotQGNpbmRleCBtYW51YWwsIHN0cnVjdHVyZSBhbmQgcHVycG9zZQotVGhpcyBtYW51YWwgaXMgaW50ZW5kZWQgdG8gZGVzY3JpYmUgd2hhdCB5b3UgbmVlZCB0byBrbm93IHRvIHVzZQotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0uICBXZSBjb3ZlciB0aGUgc3ludGF4IGV4cGVjdGVkIGluIHNvdXJjZSBmaWxlcywgaW5jbHVkaW5nCi1ub3RhdGlvbiBmb3Igc3ltYm9scywgY29uc3RhbnRzLCBhbmQgZXhwcmVzc2lvbnM7IHRoZSBkaXJlY3RpdmVzIHRoYXQKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzOyBhbmQgb2YgY291cnNlIGhvdyB0byBpbnZva2UgQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBpZmNsZWFyIEdFTkVSSUMKLVdlIGFsc28gY292ZXIgc3BlY2lhbCBmZWF0dXJlcyBpbiB0aGUgQHZhbHVle1RBUkdFVH0KLWNvbmZpZ3VyYXRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0sIGluY2x1ZGluZyBhc3NlbWJsZXIgZGlyZWN0aXZlcy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLVRoaXMgbWFudWFsIGFsc28gZGVzY3JpYmVzIHNvbWUgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGZlYXR1cmVzIG9mCi12YXJpb3VzIGZsYXZvcnMgb2YgdGhlIGFzc2VtYmxlci4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBtYWNoaW5lIGluc3RydWN0aW9ucyAobm90IGNvdmVyZWQpCi1PbiB0aGUgb3RoZXIgaGFuZCwgdGhpcyBtYW51YWwgaXMgQGVtcGh7bm90fSBpbnRlbmRlZCBhcyBhbiBpbnRyb2R1Y3Rpb24KLXRvIHByb2dyYW1taW5nIGluIGFzc2VtYmx5IGxhbmd1YWdlLS0tbGV0IGFsb25lIHByb2dyYW1taW5nIGluIGdlbmVyYWwhCi1JbiBhIHNpbWlsYXIgdmVpbiwgd2UgbWFrZSBubyBhdHRlbXB0IHRvIGludHJvZHVjZSB0aGUgbWFjaGluZQotYXJjaGl0ZWN0dXJlOyB3ZSBkbyBAZW1waHtub3R9IGRlc2NyaWJlIHRoZSBpbnN0cnVjdGlvbiBzZXQsIHN0YW5kYXJkCi1tbmVtb25pY3MsIHJlZ2lzdGVycyBvciBhZGRyZXNzaW5nIG1vZGVzIHRoYXQgYXJlIHN0YW5kYXJkIHRvIGEKLXBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLgotQGlmc2V0IEdFTkVSSUMKLVlvdSBtYXkgd2FudCB0byBjb25zdWx0IHRoZSBtYW51ZmFjdHVyZXIncwotbWFjaGluZSBhcmNoaXRlY3R1cmUgbWFudWFsIGZvciB0aGlzIGluZm9ybWF0aW9uLgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEg4LzMwMAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBIOC8zMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtIOC8zMDAKLVNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIEFERS0tNjAyLS0wMjUpLiAgRm9yIHRoZSBIOC8zMDBILAotc2VlIEBjaXRle0g4LzMwMEggU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkpLgotQGVuZCBpZnNldAotQGlmc2V0IEg4LzUwMAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBIOC81MDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtIOC81MDAKLVNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIE0yMVQwMDEpLgotQGVuZCBpZnNldAotQGlmc2V0IFNICi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIEhpdGFjaGkgU0ggbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7U0gtTWljcm9jb21wdXRlciBVc2VyJ3MgTWFudWFsfSAoSGl0YWNoaSBNaWNybyBTeXN0ZW1zLCBJbmMuKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBaODAwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle1o4MDAwIENQVSBUZWNobmljYWwgTWFudWFsfQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBjIEkgdGhpbmsgdGhpcyBpcyBwcmVtYXR1cmUtLS1kb2NAY3lnbnVzLmNvbSwgMTdqYW4xOTkxCi1AaWdub3JlCi1UaHJvdWdob3V0IHRoaXMgbWFudWFsLCB3ZSBhc3N1bWUgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgQGRmbntHTlV9LAotdGhlIHBvcnRhYmxlIG9wZXJhdGluZyBzeXN0ZW0gZnJvbSB0aGUgQGRmbntGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMufS4gIFRoaXMgcmVzdHJpY3RzIG91ciBhdHRlbnRpb24gdG8gY2VydGFpbiBraW5kcyBvZgotY29tcHV0ZXIgKGluIHBhcnRpY3VsYXIsIHRoZSBraW5kcyBvZiBjb21wdXRlcnMgdGhhdCBAc2N7Z251fSBjYW4gcnVuIG9uKTsKLW9uY2UgdGhpcyBhc3N1bXB0aW9uIGlzIGdyYW50ZWQgZXhhbXBsZXMgYW5kIGRlZmluaXRpb25zIG5lZWQgbGVzcwotcXVhbGlmaWNhdGlvbi4KLQotQGNvZGV7QHZhbHVle0FTfX0gaXMgcGFydCBvZiBhIHRlYW0gb2YgcHJvZ3JhbXMgdGhhdCB0dXJuIGEgaGlnaC1sZXZlbAotaHVtYW4tcmVhZGFibGUgc2VyaWVzIG9mIGluc3RydWN0aW9ucyBpbnRvIGEgbG93LWxldmVsCi1jb21wdXRlci1yZWFkYWJsZSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zLiAgRGlmZmVyZW50IHZlcnNpb25zIG9mCi1AY29kZXtAdmFsdWV7QVN9fSBhcmUgdXNlZCBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGNvbXB1dGVyLgotQGVuZCBpZ25vcmUKLQotQGMgVGhlcmUgdXNlZCB0byBiZSBhIHNlY3Rpb24gIlRlcm1pbm9sb2d5IiBoZXJlLCB3aGljaCBkZWZpbmVkCi1AYyAiY29udGVudHMiLCAiYnl0ZSIsICJ3b3JkIiwgYW5kICJsb25nIi4gIERlZmluaW5nICJ3b3JkIiB0byBhbnkKLUBjIHBhcnRpY3VsYXIgc2l6ZSBpcyBjb25mdXNpbmcgd2hlbiB0aGUgLndvcmQgZGlyZWN0aXZlIG1heSBnZW5lcmF0ZSAxNgotQGMgYml0cyBvbiBvbmUgbWFjaGluZSBhbmQgMzIgYml0cyBvbiBhbm90aGVyOyBpbiBnZW5lcmFsLCBmb3IgdGhlIHVzZXIKLUBjIHZlcnNpb24gb2YgdGhpcyBtYW51YWwsIG5vbmUgb2YgdGhlc2UgdGVybXMgc2VlbSBlc3NlbnRpYWwgdG8gZGVmaW5lLgotQGMgVGhleSB3ZXJlIHVzZWQgdmVyeSBsaXR0bGUgZXZlbiBpbiB0aGUgZm9ybWVyIGRyYWZ0IG9mIHRoZSBtYW51YWw7Ci1AYyB0aGlzIGRyYWZ0IG1ha2VzIGFuIGVmZm9ydCB0byBhdm9pZCB0aGVtIChleGNlcHQgaW4gbmFtZXMgb2YKLUBjIGRpcmVjdGl2ZXMpLgotCi1Abm9kZSBHTlUgQXNzZW1ibGVyCi1Ac2VjdGlvbiBUaGUgR05VIEFzc2VtYmxlcgotCi1Ac2N7Z251fSBAY29kZXthc30gaXMgcmVhbGx5IGEgZmFtaWx5IG9mIGFzc2VtYmxlcnMuCi1AaWZjbGVhciBHRU5FUklDCi1UaGlzIG1hbnVhbCBkZXNjcmliZXMgQGNvZGV7QHZhbHVle0FTfX0sIGEgbWVtYmVyIG9mIHRoYXQgZmFtaWx5IHdoaWNoIGlzCi1jb25maWd1cmVkIGZvciB0aGUgQHZhbHVle1RBUkdFVH0gYXJjaGl0ZWN0dXJlcy4KLUBlbmQgaWZjbGVhcgotSWYgeW91IHVzZSAob3IgaGF2ZSB1c2VkKSB0aGUgQHNje2dudX0gYXNzZW1ibGVyIG9uIG9uZSBhcmNoaXRlY3R1cmUsIHlvdQotc2hvdWxkIGZpbmQgYSBmYWlybHkgc2ltaWxhciBlbnZpcm9ubWVudCB3aGVuIHlvdSB1c2UgaXQgb24gYW5vdGhlcgotYXJjaGl0ZWN0dXJlLiAgRWFjaCB2ZXJzaW9uIGhhcyBtdWNoIGluIGNvbW1vbiB3aXRoIHRoZSBvdGhlcnMsCi1pbmNsdWRpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cywgbW9zdCBhc3NlbWJsZXIgZGlyZWN0aXZlcyAob2Z0ZW4gY2FsbGVkCi1AZGZue3BzZXVkby1vcHN9KSBhbmQgYXNzZW1ibGVyIHN5bnRheC5AcmVmaWxsCi0KLUBjaW5kZXggcHVycG9zZSBvZiBAc2N7Z251fSBhc3NlbWJsZXIKLUBjb2Rle0B2YWx1ZXtBU319IGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhc3NlbWJsZSB0aGUgb3V0cHV0IG9mIHRoZQotQHNje2dudX0gQyBjb21waWxlciBAY29kZXtAdmFsdWV7R0NDfX0gZm9yIHVzZSBieSB0aGUgbGlua2VyCi1AY29kZXtAdmFsdWV7TER9fS4gIE5ldmVydGhlbGVzcywgd2UndmUgdHJpZWQgdG8gbWFrZSBAY29kZXtAdmFsdWV7QVN9fQotYXNzZW1ibGUgY29ycmVjdGx5IGV2ZXJ5dGhpbmcgdGhhdCBvdGhlciBhc3NlbWJsZXJzIGZvciB0aGUgc2FtZQotbWFjaGluZSB3b3VsZCBhc3NlbWJsZS4KLUBpZnNldCBWQVgKLUFueSBleGNlcHRpb25zIGFyZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkgKEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30pLgotQGVuZCBpZnNldAotQGlmc2V0IE02ODBYMAotQGMgVGhpcyByZW1hcmsgc2hvdWxkIGFwcGVhciBpbiBnZW5lcmljIHZlcnNpb24gb2YgbWFudWFsOyBhc3N1bXB0aW9uCi1AYyBoZXJlIGlzIHRoYXQgZ2VuZXJpYyB2ZXJzaW9uIHNldHMgTTY4MHgwLgotVGhpcyBkb2Vzbid0IG1lYW4gQGNvZGV7QHZhbHVle0FTfX0gYWx3YXlzIHVzZXMgdGhlIHNhbWUgc3ludGF4IGFzIGFub3RoZXIKLWFzc2VtYmxlciBmb3IgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlOyBmb3IgZXhhbXBsZSwgd2Uga25vdyBvZiBzZXZlcmFsCi1pbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgNjgweDAgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4LgotQGVuZCBpZnNldAotCi1Vbmxpa2Ugb2xkZXIgYXNzZW1ibGVycywgQGNvZGV7QHZhbHVle0FTfX0gaXMgZGVzaWduZWQgdG8gYXNzZW1ibGUgYSBzb3VyY2UKLXByb2dyYW0gaW4gb25lIHBhc3Mgb2YgdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBoYXMgYSBzdWJ0bGUgaW1wYWN0IG9uIHRoZQotQGtiZHsub3JnfSBkaXJlY3RpdmUgKEBweHJlZntPcmcsLEBjb2Rley5vcmd9fSkuCi0KLUBub2RlIE9iamVjdCBGb3JtYXRzCi1Ac2VjdGlvbiBPYmplY3QgRmlsZSBGb3JtYXRzCi0KLUBjaW5kZXggb2JqZWN0IGZpbGUgZm9ybWF0Ci1UaGUgQHNje2dudX0gYXNzZW1ibGVyIGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2Ugc2V2ZXJhbCBhbHRlcm5hdGl2ZQotb2JqZWN0IGZpbGUgZm9ybWF0cy4gIEZvciB0aGUgbW9zdCBwYXJ0LCB0aGlzIGRvZXMgbm90IGFmZmVjdCBob3cgeW91Ci13cml0ZSBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtczsgYnV0IGRpcmVjdGl2ZXMgZm9yIGRlYnVnZ2luZyBzeW1ib2xzCi1hcmUgdHlwaWNhbGx5IGRpZmZlcmVudCBpbiBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzLiAgQHhyZWZ7U3ltYm9sCi1BdHRyaWJ1dGVzLCxTeW1ib2wgQXR0cmlidXRlc30uCi1AaWZjbGVhciBHRU5FUklDCi1AaWZjbGVhciBNVUxUSS1PQkoKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCB0byBwcm9kdWNlCi1AdmFsdWV7T0JKLU5BTUV9IGZvcm1hdCBvYmplY3QgZmlsZXMuCi1AZW5kIGlmY2xlYXIKLUBjIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGV4aGF1c3QgYWxsIGNvbmZpZ3MgdGhhdCBzZXQgTVVMVEktT0JKLCBpZGVhbGx5Ci1AaWZzZXQgQTI5SwotT24gdGhlIEB2YWx1ZXtUQVJHRVR9LCBAY29kZXtAdmFsdWV7QVN9fSBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGVpdGhlcgotQGNvZGV7YS5vdXR9IG9yIENPRkYgZm9ybWF0IG9iamVjdCBmaWxlcy4KLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0sIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2UgZWl0aGVyCi1AY29kZXtiLm91dH0gb3IgQ09GRiBmb3JtYXQgb2JqZWN0IGZpbGVzLgotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBlaXRoZXIKLVNPTSBvciBFTEYgZm9ybWF0IG9iamVjdCBmaWxlcy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBDb21tYW5kIExpbmUKLUBzZWN0aW9uIENvbW1hbmQgTGluZQotCi1AY2luZGV4IGNvbW1hbmQgbGluZSBjb252ZW50aW9ucwotQWZ0ZXIgdGhlIHByb2dyYW0gbmFtZSBAY29kZXtAdmFsdWV7QVN9fSwgdGhlIGNvbW1hbmQgbGluZSBtYXkgY29udGFpbgotb3B0aW9ucyBhbmQgZmlsZSBuYW1lcy4gIE9wdGlvbnMgbWF5IGFwcGVhciBpbiBhbnkgb3JkZXIsIGFuZCBtYXkgYmUKLWJlZm9yZSwgYWZ0ZXIsIG9yIGJldHdlZW4gZmlsZSBuYW1lcy4gIFRoZSBvcmRlciBvZiBmaWxlIG5hbWVzIGlzCi1zaWduaWZpY2FudC4KLQotQGNpbmRleCBzdGFuZGFyZCBpbnB1dCwgYXMgaW5wdXQgZmlsZQotQGtpbmRleCAtLQotQGZpbGV7LS19ICh0d28gaHlwaGVucykgYnkgaXRzZWxmIG5hbWVzIHRoZSBzdGFuZGFyZCBpbnB1dCBmaWxlCi1leHBsaWNpdGx5LCBhcyBvbmUgb2YgdGhlIGZpbGVzIGZvciBAY29kZXtAdmFsdWV7QVN9fSB0byBhc3NlbWJsZS4KLQotQGNpbmRleCBvcHRpb25zLCBjb21tYW5kIGxpbmUKLUV4Y2VwdCBmb3IgQHNhbXB7LS19IGFueSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdGhhdCBiZWdpbnMgd2l0aCBhCi1oeXBoZW4gKEBzYW1wey19KSBpcyBhbiBvcHRpb24uICBFYWNoIG9wdGlvbiBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgotQGNvZGV7QHZhbHVle0FTfX0uICBObyBvcHRpb24gY2hhbmdlcyB0aGUgd2F5IGFub3RoZXIgb3B0aW9uIHdvcmtzLiAgQW4KLW9wdGlvbiBpcyBhIEBzYW1wey19IGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGxldHRlcnM7IHRoZSBjYXNlIG9mCi10aGUgbGV0dGVyIGlzIGltcG9ydGFudC4gICBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwuCi0KLVNvbWUgb3B0aW9ucyBleHBlY3QgZXhhY3RseSBvbmUgZmlsZSBuYW1lIHRvIGZvbGxvdyB0aGVtLiAgVGhlIGZpbGUKLW5hbWUgbWF5IGVpdGhlciBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG9wdGlvbidzIGxldHRlciAoY29tcGF0aWJsZQotd2l0aCBvbGRlciBhc3NlbWJsZXJzKSBvciBpdCBtYXkgYmUgdGhlIG5leHQgY29tbWFuZCBhcmd1bWVudCAoQHNje2dudX0KLXN0YW5kYXJkKS4gIFRoZXNlIHR3byBjb21tYW5kIGxpbmVzIGFyZSBlcXVpdmFsZW50OgotCi1Ac21hbGxleGFtcGxlCi1AdmFsdWV7QVN9IC1vIG15LW9iamVjdC1maWxlLm8gbXVtYmxlLnMKLUB2YWx1ZXtBU30gLW9teS1vYmplY3QtZmlsZS5vIG11bWJsZS5zCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBJbnB1dCBGaWxlcwotQHNlY3Rpb24gSW5wdXQgRmlsZXMKLQotQGNpbmRleCBpbnB1dAotQGNpbmRleCBzb3VyY2UgcHJvZ3JhbQotQGNpbmRleCBmaWxlcywgaW5wdXQKLVdlIHVzZSB0aGUgcGhyYXNlIEBkZm57c291cmNlIHByb2dyYW19LCBhYmJyZXZpYXRlZCBAZGZue3NvdXJjZX0sIHRvCi1kZXNjcmliZSB0aGUgcHJvZ3JhbSBpbnB1dCB0byBvbmUgcnVuIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgVGhlIHByb2dyYW0gbWF5Ci1iZSBpbiBvbmUgb3IgbW9yZSBmaWxlczsgaG93IHRoZSBzb3VyY2UgaXMgcGFydGl0aW9uZWQgaW50byBmaWxlcwotZG9lc24ndCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHNvdXJjZS4KLQotQGMgSSBhZGRlZCAiY29uIiBwcmVmaXggdG8gImNhdGVuYXRpb24iIGp1c3QgdG8gcHJvdmUgSSBjYW4gb3ZlcmNvbWUgbXkKLUBjIEFQTCB0cmFpbmluZy4uLiAgIGRvY0BjeWdudXMuY29tCi1UaGUgc291cmNlIHByb2dyYW0gaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0ZXh0IGluIGFsbCB0aGUgZmlsZXMsIGluIHRoZQotb3JkZXIgc3BlY2lmaWVkLgotCi1FYWNoIHRpbWUgeW91IHJ1biBAY29kZXtAdmFsdWV7QVN9fSBpdCBhc3NlbWJsZXMgZXhhY3RseSBvbmUgc291cmNlCi1wcm9ncmFtLiAgVGhlIHNvdXJjZSBwcm9ncmFtIGlzIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUgZmlsZXMuCi0oVGhlIHN0YW5kYXJkIGlucHV0IGlzIGFsc28gYSBmaWxlLikKLQotWW91IGdpdmUgQGNvZGV7QHZhbHVle0FTfX0gYSBjb21tYW5kIGxpbmUgdGhhdCBoYXMgemVybyBvciBtb3JlIGlucHV0IGZpbGUKLW5hbWVzLiAgVGhlIGlucHV0IGZpbGVzIGFyZSByZWFkIChmcm9tIGxlZnQgZmlsZSBuYW1lIHRvIHJpZ2h0KS4gIEEKLWNvbW1hbmQgbGluZSBhcmd1bWVudCAoaW4gYW55IHBvc2l0aW9uKSB0aGF0IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcKLWlzIHRha2VuIHRvIGJlIGFuIGlucHV0IGZpbGUgbmFtZS4KLQotSWYgeW91IGdpdmUgQGNvZGV7QHZhbHVle0FTfX0gbm8gZmlsZSBuYW1lcyBpdCBhdHRlbXB0cyB0byByZWFkIG9uZSBpbnB1dCBmaWxlCi1mcm9tIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzdGFuZGFyZCBpbnB1dCwgd2hpY2ggaXMgbm9ybWFsbHkgeW91ciB0ZXJtaW5hbC4gIFlvdQotbWF5IGhhdmUgdG8gdHlwZSBAa2V5e2N0bC1EfSB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRoZXJlIGlzIG5vIG1vcmUgcHJvZ3JhbQotdG8gYXNzZW1ibGUuCi0KLVVzZSBAc2FtcHstLX0gaWYgeW91IG5lZWQgdG8gZXhwbGljaXRseSBuYW1lIHRoZSBzdGFuZGFyZCBpbnB1dCBmaWxlCi1pbiB5b3VyIGNvbW1hbmQgbGluZS4KLQotSWYgdGhlIHNvdXJjZSBpcyBlbXB0eSwgQGNvZGV7QHZhbHVle0FTfX0gcHJvZHVjZXMgYSBzbWFsbCwgZW1wdHkgb2JqZWN0Ci1maWxlLgotCi1Ac3ViaGVhZGluZyBGaWxlbmFtZXMgYW5kIExpbmUtbnVtYmVycwotCi1AY2luZGV4IGlucHV0IGZpbGUgbGluZW51bWJlcnMKLUBjaW5kZXggbGluZSBudW1iZXJzLCBpbiBpbnB1dCBmaWxlcwotVGhlcmUgYXJlIHR3byB3YXlzIG9mIGxvY2F0aW5nIGEgbGluZSBpbiB0aGUgaW5wdXQgZmlsZSAob3IgZmlsZXMpIGFuZAotZWl0aGVyIG1heSBiZSB1c2VkIGluIHJlcG9ydGluZyBlcnJvciBtZXNzYWdlcy4gIE9uZSB3YXkgcmVmZXJzIHRvIGEgbGluZQotbnVtYmVyIGluIGEgcGh5c2ljYWwgZmlsZTsgdGhlIG90aGVyIHJlZmVycyB0byBhIGxpbmUgbnVtYmVyIGluIGEKLWBgbG9naWNhbCcnIGZpbGUuICBAeHJlZntFcnJvcnMsICxFcnJvciBhbmQgV2FybmluZyBNZXNzYWdlc30uCi0KLUBkZm57UGh5c2ljYWwgZmlsZXN9IGFyZSB0aG9zZSBmaWxlcyBuYW1lZCBpbiB0aGUgY29tbWFuZCBsaW5lIGdpdmVuCi10byBAY29kZXtAdmFsdWV7QVN9fS4KLQotQGRmbntMb2dpY2FsIGZpbGVzfSBhcmUgc2ltcGx5IG5hbWVzIGRlY2xhcmVkIGV4cGxpY2l0bHkgYnkgYXNzZW1ibGVyCi1kaXJlY3RpdmVzOyB0aGV5IGJlYXIgbm8gcmVsYXRpb24gdG8gcGh5c2ljYWwgZmlsZXMuICBMb2dpY2FsIGZpbGUgbmFtZXMgaGVscAotZXJyb3IgbWVzc2FnZXMgcmVmbGVjdCB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gc291cmNlCi1pcyBpdHNlbGYgc3ludGhlc2l6ZWQgZnJvbSBvdGhlciBmaWxlcy4gIEBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZQotQHNhbXB7I30gZGlyZWN0aXZlcyBlbWl0dGVkIGJ5IHRoZSBAY29kZXtAdmFsdWV7R0NDfX0gcHJlcHJvY2Vzc29yLiAgU2VlIGFsc28KLUByZWZ7RmlsZSwsQGNvZGV7LmZpbGV9fS4KLQotQG5vZGUgT2JqZWN0Ci1Ac2VjdGlvbiBPdXRwdXQgKE9iamVjdCkgRmlsZQotCi1AY2luZGV4IG9iamVjdCBmaWxlCi1AY2luZGV4IG91dHB1dCBmaWxlCi1Aa2luZGV4IGEub3V0Ci1Aa2luZGV4IC5vCi1FdmVyeSB0aW1lIHlvdSBydW4gQGNvZGV7QHZhbHVle0FTfX0gaXQgcHJvZHVjZXMgYW4gb3V0cHV0IGZpbGUsIHdoaWNoIGlzCi15b3VyIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW0gdHJhbnNsYXRlZCBpbnRvIG51bWJlcnMuICBUaGlzIGZpbGUKLWlzIHRoZSBvYmplY3QgZmlsZS4gIEl0cyBkZWZhdWx0IG5hbWUgaXMKLUBpZmNsZWFyIEJPVVQKLUBjb2Rle2Eub3V0fS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEJPVVQKLUBpZnNldCBHRU5FUklDCi1AY29kZXthLm91dH0sIG9yIAotQGVuZCBpZnNldAotQGNvZGV7Yi5vdXR9IHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgdGhlIEludGVsIDgwOTYwLgotQGVuZCBpZnNldAotWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSBieSB1c2luZyB0aGUgQGNvZGV7LW99IG9wdGlvbi4gIENvbnZlbnRpb25hbGx5LAotb2JqZWN0IGZpbGUgbmFtZXMgZW5kIHdpdGggQGZpbGV7Lm99LiAgVGhlIGRlZmF1bHQgbmFtZSBpcyB1c2VkIGZvciBoaXN0b3JpY2FsCi1yZWFzb25zOiBvbGRlciBhc3NlbWJsZXJzIHdlcmUgY2FwYWJsZSBvZiBhc3NlbWJsaW5nIHNlbGYtY29udGFpbmVkIHByb2dyYW1zCi1kaXJlY3RseSBpbnRvIGEgcnVubmFibGUgcHJvZ3JhbS4gIChGb3Igc29tZSBmb3JtYXRzLCB0aGlzIGlzbid0IGN1cnJlbnRseQotcG9zc2libGUsIGJ1dCBpdCBjYW4gYmUgZG9uZSBmb3IgdGhlIEBjb2Rle2Eub3V0fSBmb3JtYXQuKQotCi1AY2luZGV4IGxpbmtlcgotQGtpbmRleCBsZAotVGhlIG9iamVjdCBmaWxlIGlzIG1lYW50IGZvciBpbnB1dCB0byB0aGUgbGlua2VyIEBjb2Rle0B2YWx1ZXtMRH19LiAgSXQgY29udGFpbnMKLWFzc2VtYmxlZCBwcm9ncmFtIGNvZGUsIGluZm9ybWF0aW9uIHRvIGhlbHAgQGNvZGV7QHZhbHVle0xEfX0gaW50ZWdyYXRlCi10aGUgYXNzZW1ibGVkIHByb2dyYW0gaW50byBhIHJ1bm5hYmxlIGZpbGUsIGFuZCAob3B0aW9uYWxseSkgc3ltYm9saWMKLWluZm9ybWF0aW9uIGZvciB0aGUgZGVidWdnZXIuCi0KLUBjIGxpbmsgYWJvdmUgdG8gc29tZSBpbmZvIGZpbGUocykgbGlrZSB0aGUgZGVzY3JpcHRpb24gb2YgYS5vdXQuCi1AYyBkb24ndCBmb3JnZXQgdG8gZGVzY3JpYmUgQHNje2dudX0gaW5mbyBhcyB3ZWxsIGFzIFVuaXggbG9zc2FnZS4KLQotQG5vZGUgRXJyb3JzCi1Ac2VjdGlvbiBFcnJvciBhbmQgV2FybmluZyBNZXNzYWdlcwotCi1AY2luZGV4IGVycm9yIG1lc3NzYWdlcwotQGNpbmRleCB3YXJuaW5nIG1lc3NhZ2VzCi1AY2luZGV4IG1lc3NhZ2VzIGZyb20gYXNzZW1ibGVyCi1AY29kZXtAdmFsdWV7QVN9fSBtYXkgd3JpdGUgd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBzdGFuZGFyZCBlcnJvcgotZmlsZSAodXN1YWxseSB5b3VyIHRlcm1pbmFsKS4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiAgYSBjb21waWxlcgotcnVucyBAY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5LiAgV2FybmluZ3MgcmVwb3J0IGFuIGFzc3VtcHRpb24gbWFkZSBzbwotdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBjb3VsZCBrZWVwIGFzc2VtYmxpbmcgYSBmbGF3ZWQgcHJvZ3JhbTsgZXJyb3JzIHJlcG9ydCBhCi1ncmF2ZSBwcm9ibGVtIHRoYXQgc3RvcHMgdGhlIGFzc2VtYmx5LgotCi1AY2luZGV4IGZvcm1hdCBvZiB3YXJuaW5nIG1lc3NhZ2VzCi1XYXJuaW5nIG1lc3NhZ2VzIGhhdmUgdGhlIGZvcm1hdAotCi1Ac21hbGxleGFtcGxlCi1maWxlX25hbWU6QGJ7Tk5OfTpXYXJuaW5nIE1lc3NhZ2UgVGV4dAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1AY2luZGV4IGxpbmUgbnVtYmVycywgaW4gd2FybmluZ3MvZXJyb3JzCi0od2hlcmUgQGJ7Tk5OfSBpcyBhIGxpbmUgbnVtYmVyKS4gIElmIGEgbG9naWNhbCBmaWxlIG5hbWUgaGFzIGJlZW4gZ2l2ZW4KLShAcHhyZWZ7RmlsZSwsQGNvZGV7LmZpbGV9fSkgaXQgaXMgdXNlZCBmb3IgdGhlIGZpbGVuYW1lLCBvdGhlcndpc2UgdGhlIG5hbWUgb2YKLXRoZSBjdXJyZW50IGlucHV0IGZpbGUgaXMgdXNlZC4gIElmIGEgbG9naWNhbCBsaW5lIG51bWJlciB3YXMgZ2l2ZW4KLUBpZnNldCBHRU5FUklDCi0oQHB4cmVme0xpbmUsLEBjb2Rley5saW5lfX0pCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZjbGVhciBBMjlLCi0oQHB4cmVme0xpbmUsLEBjb2Rley5saW5lfX0pCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBBMjlLCi0oQHB4cmVme0xuLCxAY29kZXsubG59fSkKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotdGhlbiBpdCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIHByaW50ZWQsCi1vdGhlcndpc2UgdGhlIGFjdHVhbCBsaW5lIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIGlzIHByaW50ZWQuICBUaGUKLW1lc3NhZ2UgdGV4dCBpcyBpbnRlbmRlZCB0byBiZSBzZWxmIGV4cGxhbmF0b3J5IChpbiB0aGUgZ3JhbmQgVW5peAotdHJhZGl0aW9uKS4KLQotQGNpbmRleCBmb3JtYXQgb2YgZXJyb3IgbWVzc2FnZXMKLUVycm9yIG1lc3NhZ2VzIGhhdmUgdGhlIGZvcm1hdAotQHNtYWxsZXhhbXBsZQotZmlsZV9uYW1lOkBie05OTn06RkFUQUw6RXJyb3IgTWVzc2FnZSBUZXh0Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlIGRlcml2ZWQgYXMgZm9yIHdhcm5pbmcKLW1lc3NhZ2VzLiAgVGhlIGFjdHVhbCBtZXNzYWdlIHRleHQgbWF5IGJlIHJhdGhlciBsZXNzIGV4cGxhbmF0b3J5Ci1iZWNhdXNlIG1hbnkgb2YgdGhlbSBhcmVuJ3Qgc3VwcG9zZWQgdG8gaGFwcGVuLgotCi1Abm9kZSBJbnZva2luZwotQGNoYXB0ZXIgQ29tbWFuZC1MaW5lIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zLCBhbGwgdmVyc2lvbnMgb2YgYXNzZW1ibGVyCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGNvbW1hbmQtbGluZSBvcHRpb25zIGF2YWlsYWJsZSBpbiBAZW1waHthbGx9Ci12ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyOyBAcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LCBmb3Igb3B0aW9ucyBzcGVjaWZpYwotQGlmY2xlYXIgR0VORVJJQwotdG8gdGhlIEB2YWx1ZXtUQVJHRVR9LgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgR0VORVJJQwotdG8gcGFydGljdWxhciBtYWNoaW5lIGFyY2hpdGVjdHVyZXMuCi1AZW5kIGlmc2V0Ci0KLUlmIHlvdSBhcmUgaW52b2tpbmcgQGNvZGV7QHZhbHVle0FTfX0gdmlhIHRoZSBAc2N7Z251fSBDIGNvbXBpbGVyICh2ZXJzaW9uIDIpLAoteW91IGNhbiB1c2UgdGhlIEBzYW1wey1XYX0gb3B0aW9uIHRvIHBhc3MgYXJndW1lbnRzIHRocm91Z2ggdG8gdGhlIGFzc2VtYmxlci4KLVRoZSBhc3NlbWJsZXIgYXJndW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAoYW5kIHRoZSBAc2FtcHstV2F9KQotYnkgY29tbWFzLiAgRm9yIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLWdjYyAtYyAtZyAtTyAtV2EsLWFsaCwtTCBmaWxlLmMKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBwYXNzZXMgdHdvIG9wdGlvbnMgdG8gdGhlIGFzc2VtYmxlcjogQHNhbXB7LWFsaH0gKGVtaXQgYSBsaXN0aW5nIHRvCi1zdGFuZGFyZCBvdXRwdXQgd2l0aCB3aXRoIGhpZ2gtbGV2ZWwgYW5kIGFzc2VtYmx5IHNvdXJjZSkgYW5kIEBzYW1wey1MfSAocmV0YWluCi1sb2NhbCBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUpLgotCi1Vc3VhbGx5IHlvdSBkbyBub3QgbmVlZCB0byB1c2UgdGhpcyBAc2FtcHstV2F9IG1lY2hhbmlzbSwgc2luY2UgbWFueSBjb21waWxlcgotY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgcGFzc2VkIHRvIHRoZSBhc3NlbWJsZXIgYnkgdGhlIGNvbXBpbGVyLgotKFlvdSBjYW4gY2FsbCB0aGUgQHNje2dudX0gY29tcGlsZXIgZHJpdmVyIHdpdGggdGhlIEBzYW1wey12fSBvcHRpb24gdG8gc2VlCi1wcmVjaXNlbHkgd2hhdCBvcHRpb25zIGl0IHBhc3NlcyB0byBlYWNoIGNvbXBpbGF0aW9uIHBhc3MsIGluY2x1ZGluZyB0aGUKLWFzc2VtYmxlci4pCi0KLUBtZW51Ci0qIGE6OiAgICAgICAgICAgICAtYVtjZGhsbnNdIGVuYWJsZSBsaXN0aW5ncwotKiBEOjogICAgICAgICAgICAgLUQgZm9yIGNvbXBhdGliaWxpdHkKLSogZjo6ICAgICAgICAgICAgIC1mIHRvIHdvcmsgZmFzdGVyCi0qIEk6OiAgICAgICAgICAgICAtSSBmb3IgLmluY2x1ZGUgc2VhcmNoIHBhdGgKLUBpZmNsZWFyIERJRkYtVEJMLUtMVUdFCi0qIEs6OiAgICAgICAgICAgICAtSyBmb3IgY29tcGF0aWJpbGl0eQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgRElGRi1UQkwtS0xVR0UKLSogSzo6ICAgICAgICAgICAgIC1LIGZvciBkaWZmZXJlbmNlIHRhYmxlcwotQGVuZCBpZnNldAotCi0qIEw6OiAgICAgICAgICAgICAtTCB0byByZXRhaW4gbG9jYWwgbGFiZWxzCi0qIE06OgkJICAtTSBvciAtLW1yaSB0byBhc3NlbWJsZSBpbiBNUkkgY29tcGF0aWJpbGl0eSBtb2RlCi0qIE1EOjogICAgICAgICAgICAtLU1EIGZvciBkZXBlbmRlbmN5IHRyYWNraW5nCi0qIG86OiAgICAgICAgICAgICAtbyB0byBuYW1lIHRoZSBvYmplY3QgZmlsZQotKiBSOjogICAgICAgICAgICAgLVIgdG8gam9pbiBkYXRhIGFuZCB0ZXh0IHNlY3Rpb25zCi0qIHN0YXRpc3RpY3M6OiAgICAtLXN0YXRpc3RpY3MgdG8gc2VlIHN0YXRpc3RpY3MgYWJvdXQgYXNzZW1ibHkKLSogdHJhZGl0aW9uYWwtZm9ybWF0OjogLS10cmFkaXRpb25hbC1mb3JtYXQgZm9yIGNvbXBhdGlibGUgb3V0cHV0Ci0qIHY6OiAgICAgICAgICAgICAtdiB0byBhbm5vdW5jZSB2ZXJzaW9uCi0qIFc6OiAgICAgICAgICAgICAtVywgLS1uby13YXJuLCAtLXdhcm4sIC0tZmF0YWwtd2FybmluZ3MgdG8gY29udHJvbCB3YXJuaW5ncwotKiBaOjogICAgICAgICAgICAgLVogdG8gbWFrZSBvYmplY3QgZmlsZSBldmVuIGFmdGVyIGVycm9ycwotQGVuZCBtZW51Ci0KLUBub2RlIGEKLUBzZWN0aW9uIEVuYWJsZSBMaXN0aW5nczogQGNvZGV7LWFbY2RobG5zXX0KLQotQGtpbmRleCAtYQotQGtpbmRleCAtYWMKLUBraW5kZXggLWFkCi1Aa2luZGV4IC1haAotQGtpbmRleCAtYWwKLUBraW5kZXggLWFuCi1Aa2luZGV4IC1hcwotQGNpbmRleCBsaXN0aW5ncywgZW5hYmxpbmcKLUBjaW5kZXggYXNzZW1ibHkgbGlzdGluZ3MsIGVuYWJsaW5nCi0KLVRoZXNlIG9wdGlvbnMgZW5hYmxlIGxpc3Rpbmcgb3V0cHV0IGZyb20gdGhlIGFzc2VtYmxlci4gIEJ5IGl0c2VsZiwKLUBzYW1wey1hfSByZXF1ZXN0cyBoaWdoLWxldmVsLCBhc3NlbWJseSwgYW5kIHN5bWJvbHMgbGlzdGluZy4KLVlvdSBjYW4gdXNlIG90aGVyIGxldHRlcnMgdG8gc2VsZWN0IHNwZWNpZmljIG9wdGlvbnMgZm9yIHRoZSBsaXN0OgotQHNhbXB7LWFofSByZXF1ZXN0cyBhIGhpZ2gtbGV2ZWwgbGFuZ3VhZ2UgbGlzdGluZywKLUBzYW1wey1hbH0gcmVxdWVzdHMgYW4gb3V0cHV0LXByb2dyYW0gYXNzZW1ibHkgbGlzdGluZywgYW5kCi1Ac2FtcHstYXN9IHJlcXVlc3RzIGEgc3ltYm9sIHRhYmxlIGxpc3RpbmcuCi1IaWdoLWxldmVsIGxpc3RpbmdzIHJlcXVpcmUgdGhhdCBhIGNvbXBpbGVyIGRlYnVnZ2luZyBvcHRpb24gbGlrZQotQHNhbXB7LWd9IGJlIHVzZWQsIGFuZCB0aGF0IGFzc2VtYmx5IGxpc3RpbmdzIChAc2FtcHstYWx9KSBiZSByZXF1ZXN0ZWQKLWFsc28uCi0KLVVzZSB0aGUgQHNhbXB7LWFjfSBvcHRpb24gdG8gb21pdCBmYWxzZSBjb25kaXRpb25hbHMgZnJvbSBhIGxpc3RpbmcuICBBbnkgbGluZXMKLXdoaWNoIGFyZSBub3QgYXNzZW1ibGVkIGJlY2F1c2Ugb2YgYSBmYWxzZSBAY29kZXsuaWZ9IChvciBAY29kZXsuaWZkZWZ9LCBvciBhbnkKLW90aGVyIGNvbmRpdGlvbmFsKSwgb3IgYSB0cnVlIEBjb2Rley5pZn0gZm9sbG93ZWQgYnkgYW4gQGNvZGV7LmVsc2V9LCB3aWxsIGJlCi1vbWl0dGVkIGZyb20gdGhlIGxpc3RpbmcuCi0KLVVzZSB0aGUgQHNhbXB7LWFkfSBvcHRpb24gdG8gb21pdCBkZWJ1Z2dpbmcgZGlyZWN0aXZlcyBmcm9tIHRoZQotbGlzdGluZy4KLQotT25jZSB5b3UgaGF2ZSBzcGVjaWZpZWQgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gZnVydGhlciBjb250cm9sCi1saXN0aW5nIG91dHB1dCBhbmQgaXRzIGFwcGVhcmFuY2UgdXNpbmcgdGhlIGRpcmVjdGl2ZXMgQGNvZGV7Lmxpc3R9LAotQGNvZGV7Lm5vbGlzdH0sIEBjb2Rley5wc2l6ZX0sIEBjb2Rley5lamVjdH0sIEBjb2Rley50aXRsZX0sIGFuZAotQGNvZGV7LnNidHRsfS4KLVRoZSBAc2FtcHstYW59IG9wdGlvbiB0dXJucyBvZmYgYWxsIGZvcm1zIHByb2Nlc3NpbmcuCi1JZiB5b3UgZG8gbm90IHJlcXVlc3QgbGlzdGluZyBvdXRwdXQgd2l0aCBvbmUgb2YgdGhlIEBzYW1wey1hfSBvcHRpb25zLCB0aGUKLWxpc3RpbmctY29udHJvbCBkaXJlY3RpdmVzIGhhdmUgbm8gZWZmZWN0LgotCi1UaGUgbGV0dGVycyBhZnRlciBAc2FtcHstYX0gbWF5IGJlIGNvbWJpbmVkIGludG8gb25lIG9wdGlvbiwKLUBlbXBoe2UuZy59LCBAc2FtcHstYWxufS4KLQotQG5vZGUgRAotQHNlY3Rpb24gQGNvZGV7LUR9Ci0KLUBraW5kZXggLUQKLVRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgd2hhdHNvZXZlciwgYnV0IGl0IGlzIGFjY2VwdGVkIHRvIG1ha2UgaXQgbW9yZQotbGlrZWx5IHRoYXQgc2NyaXB0cyB3cml0dGVuIGZvciBvdGhlciBhc3NlbWJsZXJzIGFsc28gd29yayB3aXRoCi1AY29kZXtAdmFsdWV7QVN9fS4KLQotQG5vZGUgZgotQHNlY3Rpb24gV29yayBGYXN0ZXI6IEBjb2Rley1mfQotCi1Aa2luZGV4IC1mCi1AY2luZGV4IHRydXN0ZWQgY29tcGlsZXIKLUBjaW5kZXggZmFzdGVyIHByb2Nlc3NpbmcgKEBjb2Rley1mfSkKLUBzYW1wey1mfSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gYXNzZW1ibGluZyBwcm9ncmFtcyB3cml0dGVuIGJ5IGEKLSh0cnVzdGVkKSBjb21waWxlci4gIEBzYW1wey1mfSBzdG9wcyB0aGUgYXNzZW1ibGVyIGZyb20gZG9pbmcgd2hpdGVzcGFjZQotYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZyBvbgotdGhlIGlucHV0IGZpbGUocykgYmVmb3JlIGFzc2VtYmxpbmcgdGhlbS4gIEB4cmVme1ByZXByb2Nlc3NpbmcsCi0sUHJlcHJvY2Vzc2luZ30uCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBpZiB5b3UgdXNlIEBzYW1wey1mfSB3aGVuIHRoZSBmaWxlcyBhY3R1YWxseSBuZWVkIHRvIGJlCi1wcmVwcm9jZXNzZWQgKGlmIHRoZXkgY29udGFpbiBjb21tZW50cywgZm9yIGV4YW1wbGUpLCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzCi1ub3Qgd29yayBjb3JyZWN0bHkuCi1AZW5kIHF1b3RhdGlvbgotCi1Abm9kZSBJCi1Ac2VjdGlvbiBAY29kZXsuaW5jbHVkZX0gc2VhcmNoIHBhdGg6IEBjb2Rley1JfSBAdmFye3BhdGh9Ci0KLUBraW5kZXggLUkgQHZhcntwYXRofQotQGNpbmRleCBwYXRocyBmb3IgQGNvZGV7LmluY2x1ZGV9Ci1AY2luZGV4IHNlYXJjaCBwYXRoIGZvciBAY29kZXsuaW5jbHVkZX0KLUBjaW5kZXggQGNvZGV7aW5jbHVkZX0gZGlyZWN0aXZlIHNlYXJjaCBwYXRoCi1Vc2UgdGhpcyBvcHRpb24gdG8gYWRkIGEgQHZhcntwYXRofSB0byB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcwotQGNvZGV7QHZhbHVle0FTfX0gc2VhcmNoZXMgZm9yIGZpbGVzIHNwZWNpZmllZCBpbiBAY29kZXsuaW5jbHVkZX0KLWRpcmVjdGl2ZXMgKEBweHJlZntJbmNsdWRlLCxAY29kZXsuaW5jbHVkZX19KS4gIFlvdSBtYXkgdXNlIEBjb2Rley1JfSBhcwotbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkgdG8gaW5jbHVkZSBhIHZhcmlldHkgb2YgcGF0aHMuICBUaGUgY3VycmVudAotd29ya2luZyBkaXJlY3RvcnkgaXMgYWx3YXlzIHNlYXJjaGVkIGZpcnN0OyBhZnRlciB0aGF0LCBAY29kZXtAdmFsdWV7QVN9fQotc2VhcmNoZXMgYW55IEBzYW1wey1JfSBkaXJlY3RvcmllcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IHdlcmUKLXNwZWNpZmllZCAobGVmdCB0byByaWdodCkgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotQG5vZGUgSwotQHNlY3Rpb24gRGlmZmVyZW5jZSBUYWJsZXM6IEBjb2Rley1LfQotCi1Aa2luZGV4IC1LCi1AaWZjbGVhciBESUZGLVRCTC1LTFVHRQotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSwgdGhpcyBvcHRpb24gaXMgYWxsb3dlZCwgYnV0IGhhcyBubyBlZmZlY3QuICBJdCBpcwotcGVybWl0dGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBvbiBvdGhlciBwbGF0Zm9ybXMsCi13aGVyZSBpdCBjYW4gYmUgdXNlZCB0byB3YXJuIHdoZW4gdGhlIGFzc2VtYmxlciBhbHRlcnMgdGhlIG1hY2hpbmUgY29kZQotZ2VuZXJhdGVkIGZvciBAc2FtcHsud29yZH0gZGlyZWN0aXZlcyBpbiBkaWZmZXJlbmNlIHRhYmxlcy4gIFRoZSBAdmFsdWV7VEFSR0VUfQotZmFtaWx5IGRvZXMgbm90IGhhdmUgdGhlIGFkZHJlc3NpbmcgbGltaXRhdGlvbnMgdGhhdCBzb21ldGltZXMgbGVhZCB0byB0aGlzCi1hbHRlcmF0aW9uIG9uIG90aGVyIHBsYXRmb3Jtcy4KLUBlbmQgaWZjbGVhcgotCi1AaWZzZXQgRElGRi1UQkwtS0xVR0UKLUBjaW5kZXggZGlmZmVyZW5jZSB0YWJsZXMsIHdhcm5pbmcKLUBjaW5kZXggd2FybmluZyBmb3IgYWx0ZXJlZCBkaWZmZXJlbmNlIHRhYmxlcwotQGNvZGV7QHZhbHVle0FTfX0gc29tZXRpbWVzIGFsdGVycyB0aGUgY29kZSBlbWl0dGVkIGZvciBkaXJlY3RpdmVzIG9mIHRoZSBmb3JtCi1Ac2FtcHsud29yZCBAdmFye3N5bTF9LUB2YXJ7c3ltMn19OyBAcHhyZWZ7V29yZCwsQGNvZGV7LndvcmR9fS4KLVlvdSBjYW4gdXNlIHRoZSBAc2FtcHstS30gb3B0aW9uIGlmIHlvdSB3YW50IGEgd2FybmluZyBpc3N1ZWQgd2hlbiB0aGlzCi1pcyBkb25lLgotQGVuZCBpZnNldAotCi1Abm9kZSBMCi1Ac2VjdGlvbiBJbmNsdWRlIExvY2FsIExhYmVsczogQGNvZGV7LUx9Ci0KLUBraW5kZXggLUwKLUBjaW5kZXggbG9jYWwgbGFiZWxzLCByZXRhaW5pbmcgaW4gb3V0cHV0Ci1MYWJlbHMgYmVnaW5uaW5nIHdpdGggQHNhbXB7TH0gKHVwcGVyIGNhc2Ugb25seSkgYXJlIGNhbGxlZCBAZGZue2xvY2FsCi1sYWJlbHN9LiBAeHJlZntTeW1ib2wgTmFtZXN9LiAgTm9ybWFsbHkgeW91IGRvIG5vdCBzZWUgc3VjaCBsYWJlbHMgd2hlbgotZGVidWdnaW5nLCBiZWNhdXNlIHRoZXkgYXJlIGludGVuZGVkIGZvciB0aGUgdXNlIG9mIHByb2dyYW1zIChsaWtlCi1jb21waWxlcnMpIHRoYXQgY29tcG9zZSBhc3NlbWJsZXIgcHJvZ3JhbXMsIG5vdCBmb3IgeW91ciBub3RpY2UuCi1Ob3JtYWxseSBib3RoIEBjb2Rle0B2YWx1ZXtBU319IGFuZCBAY29kZXtAdmFsdWV7TER9fSBkaXNjYXJkIHN1Y2ggbGFiZWxzLCBzbyB5b3UgZG8gbm90Ci1ub3JtYWxseSBkZWJ1ZyB3aXRoIHRoZW0uCi0KLVRoaXMgb3B0aW9uIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHJldGFpbiB0aG9zZSBAc2FtcHtMQGRvdHN7fX0gc3ltYm9scwotaW4gdGhlIG9iamVjdCBmaWxlLiAgVXN1YWxseSBpZiB5b3UgZG8gdGhpcyB5b3UgYWxzbyB0ZWxsIHRoZSBsaW5rZXIKLUBjb2Rle0B2YWx1ZXtMRH19IHRvIHByZXNlcnZlIHN5bWJvbHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBAc2FtcHtMfS4KLQotQnkgZGVmYXVsdCwgYSBsb2NhbCBsYWJlbCBpcyBhbnkgbGFiZWwgYmVnaW5uaW5nIHdpdGggQHNhbXB7TH0sIGJ1dCBlYWNoCi10YXJnZXQgaXMgYWxsb3dlZCB0byByZWRlZmluZSB0aGUgbG9jYWwgbGFiZWwgcHJlZml4LgotQGlmc2V0IEhQUEEKLU9uIHRoZSBIUFBBIGxvY2FsIGxhYmVscyBiZWdpbiB3aXRoIEBzYW1we0wkfS4KLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0KLUBzYW1wezt9IGZvciB0aGUgQVJNIGZhbWlseTsKLUBlbmQgaWZzZXQKLQotQG5vZGUgTQotQHNlY3Rpb24gQXNzZW1ibGUgaW4gTVJJIENvbXBhdGliaWxpdHkgTW9kZTogQGNvZGV7LU19Ci0KLUBraW5kZXggLU0KLUBjaW5kZXggTVJJIGNvbXBhdGliaWxpdHkgbW9kZQotVGhlIEBjb2Rley1NfSBvciBAY29kZXstLW1yaX0gb3B0aW9uIHNlbGVjdHMgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4gIFRoaXMKLWNoYW5nZXMgdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wIGhhbmRsaW5nIG9mIEBjb2Rle0B2YWx1ZXtBU319IHRvIG1ha2UgaXQKLWNvbXBhdGlibGUgd2l0aCB0aGUgQGNvZGV7QVNNNjhLfSBvciB0aGUgQGNvZGV7QVNNOTYwfSAoZGVwZW5kaW5nIHVwb24gdGhlCi1jb25maWd1cmVkIHRhcmdldCkgYXNzZW1ibGVyIGZyb20gTWljcm90ZWMgUmVzZWFyY2guICBUaGUgZXhhY3QgbmF0dXJlIG9mIHRoZQotTVJJIHN5bnRheCB3aWxsIG5vdCBiZSBkb2N1bWVudGVkIGhlcmU7IHNlZSB0aGUgTVJJIG1hbnVhbHMgZm9yIG1vcmUKLWluZm9ybWF0aW9uLiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhlIGhhbmRsaW5nIG9mIG1hY3JvcyBhbmQgbWFjcm8KLWFyZ3VtZW50cyBpcyBzb21ld2hhdCBkaWZmZXJlbnQuICBUaGUgcHVycG9zZSBvZiB0aGlzIG9wdGlvbiBpcyB0byBwZXJtaXQKLWFzc2VtYmxpbmcgZXhpc3RpbmcgTVJJIGFzc2VtYmxlciBjb2RlIHVzaW5nIEBjb2Rle0B2YWx1ZXtBU319LgotCi1UaGUgTVJJIGNvbXBhdGliaWxpdHkgaXMgbm90IGNvbXBsZXRlLiAgQ2VydGFpbiBvcGVyYXRpb25zIG9mIHRoZSBNUkkgYXNzZW1ibGVyCi1kZXBlbmQgdXBvbiBpdHMgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY2FuIG5vdCBiZSBzdXBwb3J0ZWQgdXNpbmcgb3RoZXIgb2JqZWN0Ci1maWxlIGZvcm1hdHMuICBTdXBwb3J0aW5nIHRoZXNlIHdvdWxkIHJlcXVpcmUgZW5oYW5jaW5nIGVhY2ggb2JqZWN0IGZpbGUgZm9ybWF0Ci1pbmRpdmlkdWFsbHkuICBUaGVzZSBhcmU6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtIGdsb2JhbCBzeW1ib2xzIGluIGNvbW1vbiBzZWN0aW9uCi0KLVRoZSBtNjhrIE1SSSBhc3NlbWJsZXIgc3VwcG9ydHMgY29tbW9uIHNlY3Rpb25zIHdoaWNoIGFyZSBtZXJnZWQgYnkgdGhlIGxpbmtlci4KLU90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMgZG8gbm90IHN1cHBvcnQgdGhpcy4gIEBjb2Rle0B2YWx1ZXtBU319IGhhbmRsZXMKLWNvbW1vbiBzZWN0aW9ucyBieSB0cmVhdGluZyB0aGVtIGFzIGEgc2luZ2xlIGNvbW1vbiBzeW1ib2wuICBJdCBwZXJtaXRzIGxvY2FsCi1zeW1ib2xzIHRvIGJlIGRlZmluZWQgd2l0aGluIGEgY29tbW9uIHNlY3Rpb24sIGJ1dCBpdCBjYW4gbm90IHN1cHBvcnQgZ2xvYmFsCi1zeW1ib2xzLCBzaW5jZSBpdCBoYXMgbm8gd2F5IHRvIGRlc2NyaWJlIHRoZW0uCi0KLUBpdGVtIGNvbXBsZXggcmVsb2NhdGlvbnMKLQotVGhlIE1SSSBhc3NlbWJsZXJzIHN1cHBvcnQgcmVsb2NhdGlvbnMgYWdhaW5zdCBhIG5lZ2F0ZWQgc2VjdGlvbiBhZGRyZXNzLCBhbmQKLXJlbG9jYXRpb25zIHdoaWNoIGNvbWJpbmUgdGhlIHN0YXJ0IGFkZHJlc3NlcyBvZiB0d28gb3IgbW9yZSBzZWN0aW9ucy4gIFRoZXNlCi1hcmUgbm90IHN1cHBvcnQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQGl0ZW0gQGNvZGV7RU5EfSBwc2V1ZG8tb3Agc3BlY2lmeWluZyBzdGFydCBhZGRyZXNzCi0KLVRoZSBNUkkgQGNvZGV7RU5EfSBwc2V1ZG8tb3AgcGVybWl0cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHN0YXJ0IGFkZHJlc3MuCi1UaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIFRoZSBzdGFydCBhZGRyZXNzIG1heQotaW5zdGVhZCBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIEBjb2Rley1lfSBvcHRpb24gdG8gdGhlIGxpbmtlciwgb3IgaW4gYSBsaW5rZXIKLXNjcmlwdC4KLQotQGl0ZW0gQGNvZGV7SUROVH0sIEBjb2Rley5pZGVudH0gYW5kIEBjb2Rle05BTUV9IHBzZXVkby1vcHMKLQotVGhlIE1SSSBAY29kZXtJRE5UfSwgQGNvZGV7LmlkZW50fSBhbmQgQGNvZGV7TkFNRX0gcHNldWRvLW9wcyBhc3NpZ24gYSBtb2R1bGUKLW5hbWUgdG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUBpdGVtIEBjb2Rle09SR30gcHNldWRvLW9wCi0KLVRoZSBtNjhrIE1SSSBAY29kZXtPUkd9IHBzZXVkby1vcCBiZWdpbnMgYW4gYWJzb2x1dGUgc2VjdGlvbiBhdCBhIGdpdmVuCi1hZGRyZXNzLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlIHVzdWFsIEBjb2Rle0B2YWx1ZXtBU319IEBjb2Rley5vcmd9IHBzZXVkby1vcCwKLXdoaWNoIGNoYW5nZXMgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgY3VycmVudCBzZWN0aW9uLiAgQWJzb2x1dGUgc2VjdGlvbnMgYXJlCi1ub3Qgc3VwcG9ydGVkIGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuICBUaGUgYWRkcmVzcyBvZiBhIHNlY3Rpb24gbWF5IGJlCi1hc3NpZ25lZCB3aXRoaW4gYSBsaW5rZXIgc2NyaXB0LgotQGVuZCBpdGVtaXplCi0KLVRoZXJlIGFyZSBzb21lIG90aGVyIGZlYXR1cmVzIG9mIHRoZSBNUkkgYXNzZW1ibGVyIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fSwgdHlwaWNhbGx5IGVpdGhlciBiZWNhdXNlIHRoZXkgYXJlIGRpZmZpY3VsdCBvciBiZWNhdXNlIHRoZXkKLXNlZW0gb2YgbGl0dGxlIGNvbnNlcXVlbmNlLiAgU29tZSBvZiB0aGVzZSBtYXkgYmUgc3VwcG9ydGVkIGluIGZ1dHVyZSByZWxlYXNlcy4KLQotQGl0ZW1pemUgQGJ1bGxldAotCi1AaXRlbSBFQkNESUMgc3RyaW5ncwotCi1FQkNESUMgc3RyaW5ncyBhcmUgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gcGFja2VkIGJpbmFyeSBjb2RlZCBkZWNpbWFsCi0KLVBhY2tlZCBiaW5hcnkgY29kZWQgZGVjaW1hbCBpcyBub3Qgc3VwcG9ydGVkLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBAY29kZXtEQy5QfQotYW5kIEBjb2Rle0RDQi5QfSBwc2V1ZG8tb3BzIGFyZSBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXtGRVFVfSBwc2V1ZG8tb3AKLQotVGhlIG02OGsgQGNvZGV7RkVRVX0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rle05PT0JKfSBwc2V1ZG8tb3AKLQotVGhlIG02OGsgQGNvZGV7Tk9PQkp9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXtPUFR9IGJyYW5jaCBjb250cm9sIG9wdGlvbnMKLQotVGhlIG02OGsgQGNvZGV7T1BUfSBicmFuY2ggY29udHJvbCBvcHRpb25zLS0tQGNvZGV7Qn0sIEBjb2Rle0JSU30sIEBjb2Rle0JSQn0sCi1AY29kZXtCUkx9LCBhbmQgQGNvZGV7QlJXfS0tLWFyZSBpZ25vcmVkLiAgQGNvZGV7QHZhbHVle0FTfX0gYXV0b21hdGljYWxseQotcmVsYXhlcyBhbGwgYnJhbmNoZXMsIHdoZXRoZXIgZm9yd2FyZCBvciBiYWNrd2FyZCwgdG8gYW4gYXBwcm9wcmlhdGUgc2l6ZSwgc28KLXRoZXNlIG9wdGlvbnMgc2VydmUgbm8gcHVycG9zZS4KLQotQGl0ZW0gQGNvZGV7T1BUfSBsaXN0IGNvbnRyb2wgb3B0aW9ucwotCi1UaGUgZm9sbG93aW5nIG02OGsgQGNvZGV7T1BUfSBsaXN0IGNvbnRyb2wgb3B0aW9ucyBhcmUgaWdub3JlZDogQGNvZGV7Q30sCi1AY29kZXtDRVh9LCBAY29kZXtDTH0sIEBjb2Rle0NSRX0sIEBjb2Rle0V9LCBAY29kZXtHfSwgQGNvZGV7SX0sIEBjb2Rle019LAotQGNvZGV7TUVYfSwgQGNvZGV7TUN9LCBAY29kZXtNRH0sIEBjb2Rle1h9LgotCi1AaXRlbSBvdGhlciBAY29kZXtPUFR9IG9wdGlvbnMKLQotVGhlIGZvbGxvd2luZyBtNjhrIEBjb2Rle09QVH0gb3B0aW9ucyBhcmUgaWdub3JlZDogQGNvZGV7TkVTVH0sIEBjb2Rle099LAotQGNvZGV7T0xEfSwgQGNvZGV7T1B9LCBAY29kZXtQfSwgQGNvZGV7UENPfSwgQGNvZGV7UENSfSwgQGNvZGV7UENTfSwgQGNvZGV7Un0uCi0KLUBpdGVtIEBjb2Rle09QVH0gQGNvZGV7RH0gb3B0aW9uIGlzIGRlZmF1bHQKLQotVGhlIG02OGsgQGNvZGV7T1BUfSBAY29kZXtEfSBvcHRpb24gaXMgdGhlIGRlZmF1bHQsIHVubGlrZSB0aGUgTVJJIGFzc2VtYmxlci4KLUBjb2Rle09QVCBOT0R9IG1heSBiZSB1c2VkIHRvIHR1cm4gaXQgb2ZmLgotCi1AaXRlbSBAY29kZXtYUkVGfSBwc2V1ZG8tb3AuCi0KLVRoZSBtNjhrIEBjb2Rle1hSRUZ9IHBzZXVkby1vcCBpcyBpZ25vcmVkLgotCi1AaXRlbSBAY29kZXsuZGVidWd9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsuZGVidWd9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsuZXh0ZW5kZWR9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsuZXh0ZW5kZWR9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsubGlzdH0gcHNldWRvLW9wLgotCi1UaGUgdmFyaW91cyBvcHRpb25zIG9mIHRoZSBpOTYwIEBjb2Rley5saXN0fSBwc2V1ZG8tb3AgYXJlIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5vcHRpbWl6ZX0gcHNldWRvLW9wCi0KLVRoZSBpOTYwIEBjb2Rley5vcHRpbWl6ZX0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5vdXRwdXR9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsub3V0cHV0fSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7LnNldHJlYWx9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsuc2V0cmVhbH0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBNRAotQHNlY3Rpb24gRGVwZW5kZW5jeSB0cmFja2luZzogQGNvZGV7LS1NRH0KLQotQGtpbmRleCAtLU1ECi1AY2luZGV4IGRlcGVuZGVuY3kgdHJhY2tpbmcKLUBjaW5kZXggbWFrZSBydWxlcwotCi1AY29kZXtAdmFsdWV7QVN9fSBjYW4gZ2VuZXJhdGUgYSBkZXBlbmRlbmN5IGZpbGUgZm9yIHRoZSBmaWxlIGl0IGNyZWF0ZXMuICBUaGlzCi1maWxlIGNvbnNpc3RzIG9mIGEgc2luZ2xlIHJ1bGUgc3VpdGFibGUgZm9yIEBjb2Rle21ha2V9IGRlc2NyaWJpbmcgdGhlCi1kZXBlbmRlbmNpZXMgb2YgdGhlIG1haW4gc291cmNlIGZpbGUuCi0KLVRoZSBydWxlIGlzIHdyaXR0ZW4gdG8gdGhlIGZpbGUgbmFtZWQgaW4gaXRzIGFyZ3VtZW50LgotCi1UaGlzIGZlYXR1cmUgaXMgdXNlZCBpbiB0aGUgYXV0b21hdGljIHVwZGF0aW5nIG9mIG1ha2VmaWxlcy4KLQotQG5vZGUgbwotQHNlY3Rpb24gTmFtZSB0aGUgT2JqZWN0IEZpbGU6IEBjb2Rley1vfQotCi1Aa2luZGV4IC1vCi1AY2luZGV4IG5hbWluZyBvYmplY3QgZmlsZQotQGNpbmRleCBvYmplY3QgZmlsZSBuYW1lCi1UaGVyZSBpcyBhbHdheXMgb25lIG9iamVjdCBmaWxlIG91dHB1dCB3aGVuIHlvdSBydW4gQGNvZGV7QHZhbHVle0FTfX0uICBCeQotZGVmYXVsdCBpdCBoYXMgdGhlIG5hbWUKLUBpZnNldCBHRU5FUklDCi1AaWZzZXQgSTk2MAotQGZpbGV7YS5vdXR9IChvciBAZmlsZXtiLm91dH0sIGZvciBJbnRlbCA5NjAgdGFyZ2V0cyBvbmx5KS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEk5NjAKLUBmaWxle2Eub3V0fS4KLUBlbmQgaWZjbGVhcgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEk5NjAKLUBmaWxle2Iub3V0fS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEk5NjAKLUBmaWxle2Eub3V0fS4KLUBlbmQgaWZjbGVhcgotQGVuZCBpZmNsZWFyCi1Zb3UgdXNlIHRoaXMgb3B0aW9uICh3aGljaCB0YWtlcyBleGFjdGx5IG9uZSBmaWxlbmFtZSkgdG8gZ2l2ZSB0aGUKLW9iamVjdCBmaWxlIGEgZGlmZmVyZW50IG5hbWUuCi0KLVdoYXRldmVyIHRoZSBvYmplY3QgZmlsZSBpcyBjYWxsZWQsIEBjb2Rle0B2YWx1ZXtBU319IG92ZXJ3cml0ZXMgYW55Ci1leGlzdGluZyBmaWxlIG9mIHRoZSBzYW1lIG5hbWUuCi0KLUBub2RlIFIKLUBzZWN0aW9uIEpvaW4gRGF0YSBhbmQgVGV4dCBTZWN0aW9uczogQGNvZGV7LVJ9Ci0KLUBraW5kZXggLVIKLUBjaW5kZXggZGF0YSBhbmQgdGV4dCBzZWN0aW9ucywgam9pbmluZwotQGNpbmRleCB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zLCBqb2luaW5nCi1AY2luZGV4IGpvaW5pbmcgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucwotQGNpbmRleCBtZXJnaW5nIHRleHQgYW5kIGRhdGEgc2VjdGlvbnMKLUBjb2Rley1SfSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byB3cml0ZSB0aGUgb2JqZWN0IGZpbGUgYXMgaWYgYWxsCi1kYXRhLXNlY3Rpb24gZGF0YSBsaXZlcyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBpcyBvbmx5IGRvbmUgYXQKLXRoZSB2ZXJ5IGxhc3QgbW9tZW50OiAgeW91ciBiaW5hcnkgZGF0YSBhcmUgdGhlIHNhbWUsIGJ1dCBkYXRhCi1zZWN0aW9uIHBhcnRzIGFyZSByZWxvY2F0ZWQgZGlmZmVyZW50bHkuICBUaGUgZGF0YSBzZWN0aW9uIHBhcnQgb2YKLXlvdXIgb2JqZWN0IGZpbGUgaXMgemVybyBieXRlcyBsb25nIGJlY2F1c2UgYWxsIGl0cyBieXRlcyBhcmUKLWFwcGVuZGVkIHRvIHRoZSB0ZXh0IHNlY3Rpb24uICAoQHhyZWZ7U2VjdGlvbnMsLFNlY3Rpb25zIGFuZCBSZWxvY2F0aW9ufS4pCi0KLVdoZW4geW91IHNwZWNpZnkgQGNvZGV7LVJ9IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGdlbmVyYXRlIHNob3J0ZXIKLWFkZHJlc3MgZGlzcGxhY2VtZW50cyAoYmVjYXVzZSB3ZSBkbyBub3QgaGF2ZSB0byBjcm9zcyBiZXR3ZWVuIHRleHQgYW5kCi1kYXRhIHNlY3Rpb24pLiAgV2UgcmVmcmFpbiBmcm9tIGRvaW5nIHRoaXMgc2ltcGx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLW9sZGVyIHZlcnNpb25zIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgSW4gZnV0dXJlLCBAY29kZXstUn0gbWF5IHdvcmsgdGhpcyB3YXkuCi0KLUBpZnNldCBDT0ZGCi1XaGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIENPRkYgb3V0cHV0LAotdGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IHVzZSBzZWN0aW9ucyBuYW1lZCBAc2FtcHsudGV4dH0gYW5kCi1Ac2FtcHsuZGF0YX0uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1AY29kZXstUn0gaXMgbm90IHN1cHBvcnRlZCBmb3IgYW55IG9mIHRoZSBIUFBBIHRhcmdldHMuICBVc2luZwotQGNvZGV7LVJ9IGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSBAY29kZXtAdmFsdWV7QVN9fS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgc3RhdGlzdGljcwotQHNlY3Rpb24gRGlzcGxheSBBc3NlbWJseSBTdGF0aXN0aWNzOiBAY29kZXstLXN0YXRpc3RpY3N9Ci0KLUBraW5kZXggLS1zdGF0aXN0aWNzCi1AY2luZGV4IHN0YXRpc3RpY3MsIGFib3V0IGFzc2VtYmx5Ci1AY2luZGV4IHRpbWUsIHRvdGFsIGZvciBhc3NlbWJseQotQGNpbmRleCBzcGFjZSB1c2VkLCBtYXhpbXVtIGZvciBhc3NlbWJseQotVXNlIEBzYW1wey0tc3RhdGlzdGljc30gdG8gZGlzcGxheSB0d28gc3RhdGlzdGljcyBhYm91dCB0aGUgcmVzb3VyY2VzIHVzZWQgYnkKLUBjb2Rle0B2YWx1ZXtBU319OiB0aGUgbWF4aW11bSBhbW91bnQgb2Ygc3BhY2UgYWxsb2NhdGVkIGR1cmluZyB0aGUgYXNzZW1ibHkKLShpbiBieXRlcyksIGFuZCB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgdGFrZW4gZm9yIHRoZSBhc3NlbWJseSAoaW4gQHNje2NwdX0KLXNlY29uZHMpLgotCi1Abm9kZSB0cmFkaXRpb25hbC1mb3JtYXQKLUBzZWN0aW9uIENvbXBhdGlibGUgb3V0cHV0OiBAY29kZXstLXRyYWRpdGlvbmFsLWZvcm1hdH0KLQotQGtpbmRleCAtLXRyYWRpdGlvbmFsLWZvcm1hdAotRm9yIHNvbWUgdGFyZ2V0cywgdGhlIG91dHB1dCBvZiBAY29kZXtAdmFsdWV7QVN9fSBpcyBkaWZmZXJlbnQgaW4gc29tZSB3YXlzCi1mcm9tIHRoZSBvdXRwdXQgb2Ygc29tZSBleGlzdGluZyBhc3NlbWJsZXIuICBUaGlzIHN3aXRjaCByZXF1ZXN0cwotQGNvZGV7QHZhbHVle0FTfX0gdG8gdXNlIHRoZSB0cmFkaXRpb25hbCBmb3JtYXQgaW5zdGVhZC4KLQotRm9yIGV4YW1wbGUsIGl0IGRpc2FibGVzIHRoZSBleGNlcHRpb24gZnJhbWUgb3B0aW1pemF0aW9ucyB3aGljaAotQGNvZGV7QHZhbHVle0FTfX0gbm9ybWFsbHkgZG9lcyBieSBkZWZhdWx0IG9uIEBjb2Rle0B2YWx1ZXtHQ0N9fSBvdXRwdXQuCi0KLUBub2RlIHYKLUBzZWN0aW9uIEFubm91bmNlIFZlcnNpb246IEBjb2Rley12fQotCi1Aa2luZGV4IC12Ci1Aa2luZGV4IC12ZXJzaW9uCi1AY2luZGV4IGFzc2VtYmxlciB2ZXJzaW9uCi1AY2luZGV4IHZlcnNpb24gb2YgYXNzZW1ibGVyCi1Zb3UgY2FuIGZpbmQgb3V0IHdoYXQgdmVyc2lvbiBvZiBhcyBpcyBydW5uaW5nIGJ5IGluY2x1ZGluZyB0aGUKLW9wdGlvbiBAc2FtcHstdn0gKHdoaWNoIHlvdSBjYW4gYWxzbyBzcGVsbCBhcyBAc2FtcHstdmVyc2lvbn0pIG9uIHRoZQotY29tbWFuZCBsaW5lLgotCi1Abm9kZSBXCi1Ac2VjdGlvbiBDb250cm9sIFdhcm5pbmdzOiBAY29kZXstV30sIEBjb2Rley0td2Fybn0sIEBjb2Rley0tbm8td2Fybn0sIEBjb2Rley0tZmF0YWwtd2FybmluZ3N9Ci0KLUBjb2Rle0B2YWx1ZXtBU319IHNob3VsZCBuZXZlciBnaXZlIGEgd2FybmluZyBvciBlcnJvciBtZXNzYWdlIHdoZW4KLWFzc2VtYmxpbmcgY29tcGlsZXIgb3V0cHV0LiAgQnV0IHByb2dyYW1zIHdyaXR0ZW4gYnkgcGVvcGxlIG9mdGVuCi1jYXVzZSBAY29kZXtAdmFsdWV7QVN9fSB0byBnaXZlIGEgd2FybmluZyB0aGF0IGEgcGFydGljdWxhciBhc3N1bXB0aW9uIHdhcwotbWFkZS4gIEFsbCBzdWNoIHdhcm5pbmdzIGFyZSBkaXJlY3RlZCB0byB0aGUgc3RhbmRhcmQgZXJyb3IgZmlsZS4KLQotQGtpbmRleCBAc2FtcHstV30KLUBraW5kZXggQHNhbXB7LS1uby13YXJufQotQGNpbmRleCBzdXBwcmVzc2luZyB3YXJuaW5ncwotQGNpbmRleCB3YXJuaW5ncywgc3VwcHJlc3NpbmcKLUlmIHlvdSB1c2UgdGhlIEBjb2Rley1XfSBhbmQgQGNvZGV7LS1uby13YXJufSBvcHRpb25zLCBubyB3YXJuaW5ncyBhcmUgaXNzdWVkLgotVGhpcyBvbmx5IGFmZmVjdHMgdGhlIHdhcm5pbmcgbWVzc2FnZXM6IGl0IGRvZXMgbm90IGNoYW5nZSBhbnkgcGFydGljdWxhciBvZgotaG93IEBjb2Rle0B2YWx1ZXtBU319IGFzc2VtYmxlcyB5b3VyIGZpbGUuICBFcnJvcnMsIHdoaWNoIHN0b3AgdGhlIGFzc2VtYmx5LAotYXJlIHN0aWxsIHJlcG9ydGVkLgotCi1Aa2luZGV4IEBzYW1wey0tZmF0YWwtd2FybmluZ3N9Ci1AY2luZGV4IGVycm9ycywgY2F1c2VkIGJ5IHdhcm5pbmdzCi1AY2luZGV4IHdhcm5pbmdzLCBjYXVzaW5nIGVycm9yCi1JZiB5b3UgdXNlIHRoZSBAY29kZXstLWZhdGFsLXdhcm5pbmdzfSBvcHRpb24sIEBjb2Rle0B2YWx1ZXtBU319IGNvbnNpZGVycwotZmlsZXMgdGhhdCBnZW5lcmF0ZSB3YXJuaW5ncyB0byBiZSBpbiBlcnJvci4KLQotQGtpbmRleCBAc2FtcHstLXdhcm59Ci1AY2luZGV4IHdhcm5pbmdzLCBzd2l0Y2hpbmcgb24KLVlvdSBjYW4gc3dpdGNoIHRoZXNlIG9wdGlvbnMgb2ZmIGFnYWluIGJ5IHNwZWNpZnlpbmcgQGNvZGV7LS13YXJufSwgd2hpY2gKLWNhdXNlcyB3YXJuaW5ncyB0byBiZSBvdXRwdXQgYXMgdXN1YWwuCi0KLUBub2RlIFoKLUBzZWN0aW9uIEdlbmVyYXRlIE9iamVjdCBGaWxlIGluIFNwaXRlIG9mIEVycm9yczogQGNvZGV7LVp9Ci1AY2luZGV4IG9iamVjdCBmaWxlLCBhZnRlciBlcnJvcnMKLUBjaW5kZXggZXJyb3JzLCBjb250aW51aW5nIGFmdGVyCi1BZnRlciBhbiBlcnJvciBtZXNzYWdlLCBAY29kZXtAdmFsdWV7QVN9fSBub3JtYWxseSBwcm9kdWNlcyBubyBvdXRwdXQuICBJZiBmb3IKLXNvbWUgcmVhc29uIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBvYmplY3QgZmlsZSBvdXRwdXQgZXZlbiBhZnRlcgotQGNvZGV7QHZhbHVle0FTfX0gZ2l2ZXMgYW4gZXJyb3IgbWVzc2FnZSBvbiB5b3VyIHByb2dyYW0sIHVzZSB0aGUgQHNhbXB7LVp9Ci1vcHRpb24uICBJZiB0aGVyZSBhcmUgYW55IGVycm9ycywgQGNvZGV7QHZhbHVle0FTfX0gY29udGludWVzIGFueXdheXMsIGFuZAotd3JpdGVzIGFuIG9iamVjdCBmaWxlIGFmdGVyIGEgZmluYWwgd2FybmluZyBtZXNzYWdlIG9mIHRoZSBmb3JtIEBzYW1we0B2YXJ7bn0KLWVycm9ycywgQHZhcnttfSB3YXJuaW5ncywgZ2VuZXJhdGluZyBiYWQgb2JqZWN0IGZpbGUufQotCi1Abm9kZSBTeW50YXgKLUBjaGFwdGVyIFN5bnRheAotCi1AY2luZGV4IG1hY2hpbmUtaW5kZXBlbmRlbnQgc3ludGF4Ci1AY2luZGV4IHN5bnRheCwgbWFjaGluZS1pbmRlcGVuZGVudAotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgbWFjaGluZS1pbmRlcGVuZGVudCBzeW50YXggYWxsb3dlZCBpbiBhCi1zb3VyY2UgZmlsZS4gIEBjb2Rle0B2YWx1ZXtBU319IHN5bnRheCBpcyBzaW1pbGFyIHRvIHdoYXQgbWFueSBvdGhlcgotYXNzZW1ibGVycyB1c2U7IGl0IGlzIGluc3BpcmVkIGJ5IHRoZSBCU0QgNC4yCi1AaWZjbGVhciBWQVgKLWFzc2VtYmxlci4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IFZBWAotYXNzZW1ibGVyLCBleGNlcHQgdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBhc3NlbWJsZSBWYXggYml0LWZpZWxkcy4KLUBlbmQgaWZzZXQKLQotQG1lbnUKLSogUHJlcHJvY2Vzc2luZzo6ICAgICAgICAgICAgICBQcmVwcm9jZXNzaW5nCi0qIFdoaXRlc3BhY2U6OiAgICAgICAgICAgICAgICAgIFdoaXRlc3BhY2UKLSogQ29tbWVudHM6OiAgICAgICAgICAgICAgICAgICAgQ29tbWVudHMKLSogU3ltYm9sIEludHJvOjogICAgICAgICAgICAgICAgU3ltYm9scwotKiBTdGF0ZW1lbnRzOjogICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRzCi0qIENvbnN0YW50czo6ICAgICAgICAgICAgICAgICAgIENvbnN0YW50cwotQGVuZCBtZW51Ci0KLUBub2RlIFByZXByb2Nlc3NpbmcKLUBzZWN0aW9uIFByZXByb2Nlc3NpbmcKLQotQGNpbmRleCBwcmVwcm9jZXNzaW5nCi1UaGUgQGNvZGV7QHZhbHVle0FTfX0gaW50ZXJuYWwgcHJlcHJvY2Vzc29yOgotQGl0ZW1pemUgQGJ1bGxldAotQGNpbmRleCB3aGl0ZXNwYWNlLCByZW1vdmVkIGJ5IHByZXByb2Nlc3NvcgotQGl0ZW0KLWFkanVzdHMgYW5kIHJlbW92ZXMgZXh0cmEgd2hpdGVzcGFjZS4gIEl0IGxlYXZlcyBvbmUgc3BhY2Ugb3IgdGFiIGJlZm9yZQotdGhlIGtleXdvcmRzIG9uIGEgbGluZSwgYW5kIHR1cm5zIGFueSBvdGhlciB3aGl0ZXNwYWNlIG9uIHRoZSBsaW5lIGludG8KLWEgc2luZ2xlIHNwYWNlLgotCi1AY2luZGV4IGNvbW1lbnRzLCByZW1vdmVkIGJ5IHByZXByb2Nlc3NvcgotQGl0ZW0KLXJlbW92ZXMgYWxsIGNvbW1lbnRzLCByZXBsYWNpbmcgdGhlbSB3aXRoIGEgc2luZ2xlIHNwYWNlLCBvciBhbgotYXBwcm9wcmlhdGUgbnVtYmVyIG9mIG5ld2xpbmVzLgotCi1AY2luZGV4IGNvbnN0YW50cywgY29udmVydGVkIGJ5IHByZXByb2Nlc3NvcgotQGl0ZW0KLWNvbnZlcnRzIGNoYXJhY3RlciBjb25zdGFudHMgaW50byB0aGUgYXBwcm9wcmlhdGUgbnVtZXJpYyB2YWx1ZXMuCi1AZW5kIGl0ZW1pemUKLQotSXQgZG9lcyBub3QgZG8gbWFjcm8gcHJvY2Vzc2luZywgaW5jbHVkZSBmaWxlIGhhbmRsaW5nLCBvcgotYW55dGhpbmcgZWxzZSB5b3UgbWF5IGdldCBmcm9tIHlvdXIgQyBjb21waWxlcidzIHByZXByb2Nlc3Nvci4gIFlvdSBjYW4KLWRvIGluY2x1ZGUgZmlsZSBwcm9jZXNzaW5nIHdpdGggdGhlIEBjb2Rley5pbmNsdWRlfSBkaXJlY3RpdmUKLShAcHhyZWZ7SW5jbHVkZSwsQGNvZGV7LmluY2x1ZGV9fSkuICBZb3UgY2FuIHVzZSB0aGUgQHNje2dudX0gQyBjb21waWxlciBkcml2ZXIKLXRvIGdldCBvdGhlciBgYENQUCcnIHN0eWxlIHByZXByb2Nlc3NpbmcsIGJ5IGdpdmluZyB0aGUgaW5wdXQgZmlsZSBhCi1Ac2FtcHsuU30gc3VmZml4LiAgQHhyZWZ7T3ZlcmFsbCBPcHRpb25zLCwgT3B0aW9ucyBDb250cm9sbGluZyB0aGUgS2luZCBvZgotT3V0cHV0LCBnY2MuaW5mbywgVXNpbmcgR05VIENDfS4KLQotRXhjZXNzIHdoaXRlc3BhY2UsIGNvbW1lbnRzLCBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cwotY2Fubm90IGJlIHVzZWQgaW4gdGhlIHBvcnRpb25zIG9mIHRoZSBpbnB1dCB0ZXh0IHRoYXQgYXJlIG5vdAotcHJlcHJvY2Vzc2VkLgotCi1AY2luZGV4IHR1cm5pbmcgcHJlcHJvY2Vzc2luZyBvbiBhbmQgb2ZmCi1AY2luZGV4IHByZXByb2Nlc3NpbmcsIHR1cm5pbmcgb24gYW5kIG9mZgotQGtpbmRleCAjTk9fQVBQCi1Aa2luZGV4ICNBUFAKLUlmIHRoZSBmaXJzdCBsaW5lIG9mIGFuIGlucHV0IGZpbGUgaXMgQGNvZGV7I05PX0FQUH0gb3IgaWYgeW91IHVzZSB0aGUKLUBzYW1wey1mfSBvcHRpb24sIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dCBmaWxlLgotV2l0aGluIGFuIGlucHV0IGZpbGUsIHlvdSBjYW4gYXNrIGZvciB3aGl0ZXNwYWNlIGFuZCBjb21tZW50IHJlbW92YWwgaW4KLXNwZWNpZmljIHBvcnRpb25zIG9mIHRoZSBieSBwdXR0aW5nIGEgbGluZSB0aGF0IHNheXMgQGNvZGV7I0FQUH0gYmVmb3JlIHRoZQotdGV4dCB0aGF0IG1heSBjb250YWluIHdoaXRlc3BhY2Ugb3IgY29tbWVudHMsIGFuZCBwdXR0aW5nIGEgbGluZSB0aGF0IHNheXMKLUBjb2RleyNOT19BUFB9IGFmdGVyIHRoaXMgdGV4dC4gIFRoaXMgZmVhdHVyZSBpcyBtYWlubHkgaW50ZW5kIHRvIHN1cHBvcnQKLUBjb2Rle2FzbX0gc3RhdGVtZW50cyBpbiBjb21waWxlcnMgd2hvc2Ugb3V0cHV0IGlzIG90aGVyd2lzZSBmcmVlIG9mIGNvbW1lbnRzCi1hbmQgd2hpdGVzcGFjZS4KLQotQG5vZGUgV2hpdGVzcGFjZQotQHNlY3Rpb24gV2hpdGVzcGFjZQotCi1AY2luZGV4IHdoaXRlc3BhY2UKLUBkZm57V2hpdGVzcGFjZX0gaXMgb25lIG9yIG1vcmUgYmxhbmtzIG9yIHRhYnMsIGluIGFueSBvcmRlci4KLVdoaXRlc3BhY2UgaXMgdXNlZCB0byBzZXBhcmF0ZSBzeW1ib2xzLCBhbmQgdG8gbWFrZSBwcm9ncmFtcyBuZWF0ZXIgZm9yCi1wZW9wbGUgdG8gcmVhZC4gIFVubGVzcyB3aXRoaW4gY2hhcmFjdGVyIGNvbnN0YW50cwotKEBweHJlZntDaGFyYWN0ZXJzLCxDaGFyYWN0ZXIgQ29uc3RhbnRzfSksIGFueSB3aGl0ZXNwYWNlIG1lYW5zIHRoZSBzYW1lCi1hcyBleGFjdGx5IG9uZSBzcGFjZS4KLQotQG5vZGUgQ29tbWVudHMKLUBzZWN0aW9uIENvbW1lbnRzCi0KLUBjaW5kZXggY29tbWVudHMKLVRoZXJlIGFyZSB0d28gd2F5cyBvZiByZW5kZXJpbmcgY29tbWVudHMgdG8gQGNvZGV7QHZhbHVle0FTfX0uICBJbiBib3RoCi1jYXNlcyB0aGUgY29tbWVudCBpcyBlcXVpdmFsZW50IHRvIG9uZSBzcGFjZS4KLQotQW55dGhpbmcgZnJvbSBAc2FtcHsvKn0gdGhyb3VnaCB0aGUgbmV4dCBAc2FtcHsqL30gaXMgYSBjb21tZW50LgotVGhpcyBtZWFucyB5b3UgbWF5IG5vdCBuZXN0IHRoZXNlIGNvbW1lbnRzLgotCi1Ac21hbGxleGFtcGxlCi0vKgotICBUaGUgb25seSB3YXkgdG8gaW5jbHVkZSBhIG5ld2xpbmUgKCdcbicpIGluIGEgY29tbWVudAotICBpcyB0byB1c2UgdGhpcyBzb3J0IG9mIGNvbW1lbnQuCi0qLwotCi0vKiBUaGlzIHNvcnQgb2YgY29tbWVudCBkb2VzIG5vdCBuZXN0LiAqLwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Bbnl0aGluZyBmcm9tIHRoZSBAZGZue2xpbmUgY29tbWVudH0gY2hhcmFjdGVyIHRvIHRoZSBuZXh0IG5ld2xpbmUKLWlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBpZ25vcmVkLiAgVGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgaXMKLUBpZnNldCBBMjlLCi1Ac2FtcHs7fSBmb3IgdGhlIEFNRCAyOUsgZmFtaWx5OwotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotQHNhbXB7O30gb24gdGhlIEFSQzsKLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0KLUBzYW1we0BAfSBvbiB0aGUgQVJNOwotQGVuZCBpZnNldAotQGlmc2V0IEg4LzMwMAotQHNhbXB7O30gZm9yIHRoZSBIOC8zMDAgZmFtaWx5OwotQGVuZCBpZnNldAotQGlmc2V0IEg4LzUwMAotQHNhbXB7IX0gZm9yIHRoZSBIOC81MDAgZmFtaWx5OwotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUBzYW1wezt9IGZvciB0aGUgSFBQQTsKLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1Ac2FtcHsjfSBvbiB0aGUgaTk2MDsKLUBlbmQgaWZzZXQKLUBpZnNldCBQSgotQHNhbXB7O30gZm9yIHBpY29KYXZhOwotQGVuZCBpZnNldAotQGlmc2V0IFNICi1Ac2FtcHshfSBmb3IgdGhlIEhpdGFjaGkgU0g7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgU1BBUkMKLUBzYW1weyF9IG9uIHRoZSBTUEFSQzsKLUBlbmQgaWZzZXQKLUBpZnNldCBNMzJSCi1Ac2FtcHsjfSBvbiB0aGUgbTMycjsKLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLUBzYW1we3x9IG9uIHRoZSA2ODB4MDsKLUBlbmQgaWZzZXQKLUBpZnNldCBWQVgKLUBzYW1weyN9IG9uIHRoZSBWYXg7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLUBzYW1weyF9IGZvciB0aGUgWjgwMDA7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgVjg1MAotQHNhbXB7I30gb24gdGhlIFY4NTA7Ci1AZW5kIGlmc2V0Ci1zZWUgQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uICBAcmVmaWxsCi1AYyBGSVhNRSBXaGF0IGFib3V0IGkzODYsIG04OGssIGk4NjA/Ci0KLUBpZnNldCBHRU5FUklDCi1PbiBzb21lIG1hY2hpbmVzIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGxpbmUgY29tbWVudCBjaGFyYWN0ZXJzLiAgT25lCi1jaGFyYWN0ZXIgb25seSBiZWdpbnMgYSBjb21tZW50IGlmIGl0IGlzIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb24KLWEgbGluZSwgd2hpbGUgdGhlIG90aGVyIGFsd2F5cyBiZWdpbnMgYSBjb21tZW50LgotQGVuZCBpZnNldAotCi1AaWZzZXQgVjg1MAotVGhlIFY4NTAgYXNzZW1ibGVyIGFsc28gc3VwcG9ydHMgYSBkb3VibGUgZGFzaCBhcyBzdGFydGluZyBhIGNvbW1lbnQgdGhhdAotZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgotCi1Ac2FtcHstLX07Ci1AZW5kIGlmc2V0Ci0KLUBraW5kZXggIwotQGNpbmRleCBsaW5lcyBzdGFydGluZyB3aXRoIEBjb2RleyN9Ci1AY2luZGV4IGxvZ2ljYWwgbGluZSBudW1iZXJzCi1UbyBiZSBjb21wYXRpYmxlIHdpdGggcGFzdCBhc3NlbWJsZXJzLCBsaW5lcyB0aGF0IGJlZ2luIHdpdGggQHNhbXB7I30gaGF2ZSBhCi1zcGVjaWFsIGludGVycHJldGF0aW9uLiAgRm9sbG93aW5nIHRoZSBAc2FtcHsjfSBzaG91bGQgYmUgYW4gYWJzb2x1dGUKLWV4cHJlc3Npb24gKEBweHJlZntFeHByZXNzaW9uc30pOiB0aGUgbG9naWNhbCBsaW5lIG51bWJlciBvZiB0aGUgQGVtcGh7bmV4dH0KLWxpbmUuICBUaGVuIGEgc3RyaW5nIChAcHhyZWZ7U3RyaW5ncywsIFN0cmluZ3N9KSBpcyBhbGxvd2VkOiBpZiBwcmVzZW50IGl0IGlzIGEKLW5ldyBsb2dpY2FsIGZpbGUgbmFtZS4gIFRoZSByZXN0IG9mIHRoZSBsaW5lLCBpZiBhbnksIHNob3VsZCBiZSB3aGl0ZXNwYWNlLgotCi1JZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBvbiB0aGUgbGluZSBhcmUgbm90IG51bWVyaWMsCi10aGUgbGluZSBpcyBpZ25vcmVkLiAgKEp1c3QgbGlrZSBhIGNvbW1lbnQuKQotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhbiBvcmRpbmFyeSBjb21tZW50LgotIyA0Mi02ICJuZXdfZmlsZV9uYW1lIiAgICAjIE5ldyBsb2dpY2FsIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgbG9naWNhbCBsaW5lICMgMzYuCi1AZW5kIHNtYWxsZXhhbXBsZQotVGhpcyBmZWF0dXJlIGlzIGRlcHJlY2F0ZWQsIGFuZCBtYXkgZGlzYXBwZWFyIGZyb20gZnV0dXJlIHZlcnNpb25zCi1vZiBAY29kZXtAdmFsdWV7QVN9fS4KLQotQG5vZGUgU3ltYm9sIEludHJvCi1Ac2VjdGlvbiBTeW1ib2xzCi0KLUBjaW5kZXggY2hhcmFjdGVycyB1c2VkIGluIHN5bWJvbHMKLUBpZmNsZWFyIFNQRUNJQUwtU1lNUwotQSBAZGZue3N5bWJvbH0gaXMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBjaG9zZW4gZnJvbSB0aGUgc2V0IG9mIGFsbAotbGV0dGVycyAoYm90aCB1cHBlciBhbmQgbG93ZXIgY2FzZSksIGRpZ2l0cyBhbmQgdGhlIHRocmVlIGNoYXJhY3RlcnMKLUBzYW1we18uJH0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBTUEVDSUFMLVNZTVMKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIOAotQSBAZGZue3N5bWJvbH0gaXMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBjaG9zZW4gZnJvbSB0aGUgc2V0IG9mIGFsbAotbGV0dGVycyAoYm90aCB1cHBlciBhbmQgbG93ZXIgY2FzZSksIGRpZ2l0cyBhbmQgdGhlIHRocmVlIGNoYXJhY3RlcnMKLUBzYW1wey5fJH0uICAoU2F2ZSB0aGF0LCBvbiB0aGUgSDgvMzAwIG9ubHksIHlvdSBtYXkgbm90IHVzZSBAc2FtcHskfSBpbgotc3ltYm9sIG5hbWVzLikKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotQGVuZCBpZnNldAotQGlmc2V0IEdFTkVSSUMKLU9uIG1vc3QgbWFjaGluZXMsIHlvdSBjYW4gYWxzbyB1c2UgQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzOyBleGNlcHRpb25zCi1hcmUgbm90ZWQgaW4gQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1ObyBzeW1ib2wgbWF5IGJlZ2luIHdpdGggYSBkaWdpdC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuCi1UaGVyZSBpcyBubyBsZW5ndGggbGltaXQ6IGFsbCBjaGFyYWN0ZXJzIGFyZSBzaWduaWZpY2FudC4gIFN5bWJvbHMgYXJlCi1kZWxpbWl0ZWQgYnkgY2hhcmFjdGVycyBub3QgaW4gdGhhdCBzZXQsIG9yIGJ5IHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlCi0oc2luY2UgdGhlIHNvdXJjZSBwcm9ncmFtIG11c3QgZW5kIHdpdGggYSBuZXdsaW5lLCB0aGUgZW5kIG9mIGEgZmlsZSBpcwotbm90IGEgcG9zc2libGUgc3ltYm9sIGRlbGltaXRlcikuICBAeHJlZntTeW1ib2xzfS4KLUBjaW5kZXggbGVuZ3RoIG9mIHN5bWJvbHMKLQotQG5vZGUgU3RhdGVtZW50cwotQHNlY3Rpb24gU3RhdGVtZW50cwotCi1AY2luZGV4IHN0YXRlbWVudHMsIHN0cnVjdHVyZSBvZgotQGNpbmRleCBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIGFibm9ybWFsLXNlcGFyYXRvcgotQSBAZGZue3N0YXRlbWVudH0gZW5kcyBhdCBhIG5ld2xpbmUgY2hhcmFjdGVyIChAc2FtcHtcbn0pIG9yIGF0IGEKLXNlbWljb2xvbiAoQHNhbXB7O30pLiAgVGhlIG5ld2xpbmUgb3Igc2VtaWNvbG9uIGlzIGNvbnNpZGVyZWQgcGFydCBvZgotdGhlIHByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgc2VtaWNvbG9ucyB3aXRoaW4gY2hhcmFjdGVyCi1jb25zdGFudHMgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBhYm5vcm1hbC1zZXBhcmF0b3IKLUBpZnNldCBBMjlLCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgYW4gYGBhdCcnCi1zaWduIChAc2FtcHtAQH0pLiAgVGhlIG5ld2xpbmUgb3IgYXQgc2lnbiBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlCi1wcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIGF0IHNpZ25zIHdpdGhpbiBjaGFyYWN0ZXIgY29uc3RhbnRzCi1hcmUgYW4gZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgYW4gZXhjbGFtYXRpb24gCi1wb2ludCAoQHNhbXB7IX0pLiAgVGhlIG5ld2xpbmUgb3IgZXhjbGFtYXRpb24gcG9pbnQgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZQotcHJlY2VkaW5nIHN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBleGNsYW1hdGlvbiBwb2ludHMgd2l0aGluIGNoYXJhY3RlcgotY29uc3RhbnRzIGFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotQGlmc2V0IEg4Ci1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSk7IG9yIChmb3IgdGhlCi1IOC8zMDApIGEgZG9sbGFyIHNpZ24gKEBzYW1weyR9KTsgb3IgKGZvciB0aGUKLUhpdGFjaGktU0ggb3IgdGhlCi1IOC81MDApIGEgc2VtaWNvbG9uCi0oQHNhbXB7O30pLiAgVGhlIG5ld2xpbmUgb3Igc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBjb25zaWRlcmVkIHBhcnQgb2YKLXRoZSBwcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIHNlcGFyYXRvcnMgd2l0aGluIGNoYXJhY3RlcgotY29uc3RhbnRzIGFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AaWZzZXQgR0VORVJJQwotQSBAZGZue3N0YXRlbWVudH0gZW5kcyBhdCBhIG5ld2xpbmUgY2hhcmFjdGVyIChAc2FtcHtcbn0pIG9yIGxpbmUKLXNlcGFyYXRvciBjaGFyYWN0ZXIuICAoVGhlIGxpbmUgc2VwYXJhdG9yIGlzIHVzdWFsbHkgQHNhbXB7O30sIHVubGVzcwotdGhpcyBjb25mbGljdHMgd2l0aCB0aGUgY29tbWVudCBjaGFyYWN0ZXI7IEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uKSAgVGhlCi1uZXdsaW5lIG9yIHNlcGFyYXRvciBjaGFyYWN0ZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBwcmVjZWRpbmcKLXN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBzZXBhcmF0b3JzIHdpdGhpbiBjaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSBhbgotZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBuZXdsaW5lLCByZXF1aXJlZCBhdCBmaWxlIGVuZAotQGNpbmRleCBFT0YsIG5ld2xpbmUgbXVzdCBwcmVjZWRlCi1JdCBpcyBhbiBlcnJvciB0byBlbmQgYW55IHN0YXRlbWVudCB3aXRoIGVuZC1vZi1maWxlOiAgdGhlIGxhc3QKLWNoYXJhY3RlciBvZiBhbnkgaW5wdXQgZmlsZSBzaG91bGQgYmUgYSBuZXdsaW5lLkByZWZpbGwKLQotQW4gZW1wdHkgc3RhdGVtZW50IGlzIGFsbG93ZWQsIGFuZCBtYXkgaW5jbHVkZSB3aGl0ZXNwYWNlLiAgSXQgaXMgaWdub3JlZC4KLQotQGNpbmRleCBpbnN0cnVjdGlvbnMgYW5kIGRpcmVjdGl2ZXMKLUBjaW5kZXggZGlyZWN0aXZlcyBhbmQgaW5zdHJ1Y3Rpb25zCi1AYyAia2V5IHN5bWJvbCIgaXMgbm90IHVzZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudDsgc2VlbXMgcGVkYW50aWMgdG8KLUBjIEBkZWZue30gaXQgaW4gdGhhdCBjYXNlLCBhcyB3YXMgZG9uZSBwcmV2aW91c2x5Li4uICBkb2NAY3lnbnVzLmNvbSwKLUBjIDEzZmViOTEuCi1BIHN0YXRlbWVudCBiZWdpbnMgd2l0aCB6ZXJvIG9yIG1vcmUgbGFiZWxzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEKLWtleSBzeW1ib2wgd2hpY2ggZGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2Ygc3RhdGVtZW50IGl0IGlzLiAgVGhlIGtleQotc3ltYm9sIGRldGVybWluZXMgdGhlIHN5bnRheCBvZiB0aGUgcmVzdCBvZiB0aGUgc3RhdGVtZW50LiAgSWYgdGhlCi1zeW1ib2wgYmVnaW5zIHdpdGggYSBkb3QgQHNhbXB7Ln0gdGhlbiB0aGUgc3RhdGVtZW50IGlzIGFuIGFzc2VtYmxlcgotZGlyZWN0aXZlOiB0eXBpY2FsbHkgdmFsaWQgZm9yIGFueSBjb21wdXRlci4gIElmIHRoZSBzeW1ib2wgYmVnaW5zIHdpdGgKLWEgbGV0dGVyIHRoZSBzdGF0ZW1lbnQgaXMgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgQGRmbntpbnN0cnVjdGlvbn06IGl0Ci1hc3NlbWJsZXMgaW50byBhIG1hY2hpbmUgbGFuZ3VhZ2UgaW5zdHJ1Y3Rpb24uCi1AaWZzZXQgR0VORVJJQwotRGlmZmVyZW50IHZlcnNpb25zIG9mIEBjb2Rle0B2YWx1ZXtBU319IGZvciBkaWZmZXJlbnQgY29tcHV0ZXJzCi1yZWNvZ25pemUgZGlmZmVyZW50IGluc3RydWN0aW9ucy4gIEluIGZhY3QsIHRoZSBzYW1lIHN5bWJvbCBtYXkKLXJlcHJlc2VudCBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBpbiBhIGRpZmZlcmVudCBjb21wdXRlcidzIGFzc2VtYmx5Ci1sYW5ndWFnZS5AcmVmaWxsCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggQGNvZGV7On0gKGxhYmVsKQotQGNpbmRleCBsYWJlbCAoQGNvZGV7On0pCi1BIGxhYmVsIGlzIGEgc3ltYm9sIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29sb24gKEBjb2Rlezp9KS4KLVdoaXRlc3BhY2UgYmVmb3JlIGEgbGFiZWwgb3IgYWZ0ZXIgYSBjb2xvbiBpcyBwZXJtaXR0ZWQsIGJ1dCB5b3UgbWF5IG5vdAotaGF2ZSB3aGl0ZXNwYWNlIGJldHdlZW4gYSBsYWJlbCdzIHN5bWJvbCBhbmQgaXRzIGNvbG9uLiBAeHJlZntMYWJlbHN9LgotCi1AaWZzZXQgSFBQQQotRm9yIEhQUEEgdGFyZ2V0cywgbGFiZWxzIG5lZWQgbm90IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29sb24sIGJ1dCAKLXRoZSBkZWZpbml0aW9uIG9mIGEgbGFiZWwgbXVzdCBiZWdpbiBpbiBjb2x1bW4gemVyby4gIFRoaXMgYWxzbyBpbXBsaWVzIHRoYXQKLW9ubHkgb25lIGxhYmVsIG1heSBiZSBkZWZpbmVkIG9uIGVhY2ggbGluZS4KLUBlbmQgaWZzZXQKLQotQHNtYWxsZXhhbXBsZQotbGFiZWw6ICAgICAuZGlyZWN0aXZlICAgIGZvbGxvd2VkIGJ5IHNvbWV0aGluZwotYW5vdGhlcl9sYWJlbDogICAgICAgICAgICMgVGhpcyBpcyBhbiBlbXB0eSBzdGF0ZW1lbnQuCi0gICAgICAgICAgIGluc3RydWN0aW9uICAgb3BlcmFuZF8xLCBvcGVyYW5kXzIsIEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIENvbnN0YW50cwotQHNlY3Rpb24gQ29uc3RhbnRzCi0KLUBjaW5kZXggY29uc3RhbnRzCi1BIGNvbnN0YW50IGlzIGEgbnVtYmVyLCB3cml0dGVuIHNvIHRoYXQgaXRzIHZhbHVlIGlzIGtub3duIGJ5Ci1pbnNwZWN0aW9uLCB3aXRob3V0IGtub3dpbmcgYW55IGNvbnRleHQuICBMaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLS5ieXRlICA3NCwgMDExMiwgMDkyLCAweDRBLCAwWDRhLCAnSiwgJ1xKICMgQWxsIHRoZSBzYW1lIHZhbHVlLgotLmFzY2lpICJSaW5nIHRoZSBiZWxsXDciICAgICAgICAgICAgICAgICAgIyBBIHN0cmluZyBjb25zdGFudC4KLS5vY3RhICAweDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlBQkNERUYwICMgQSBiaWdudW0uCi0uZmxvYXQgMGYtMzE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3XAotOTUwMjg4NDE5NzEuNjkzOTkzNzUxRS00MCAgICAgICAgICAgICAgICAgIyAtIHBpLCBhIGZsb251bS4KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBtZW51Ci0qIENoYXJhY3RlcnM6OiAgICAgICAgICAgICAgICAgIENoYXJhY3RlciBDb25zdGFudHMKLSogTnVtYmVyczo6ICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIENvbnN0YW50cwotQGVuZCBtZW51Ci0KLUBub2RlIENoYXJhY3RlcnMKLUBzdWJzZWN0aW9uIENoYXJhY3RlciBDb25zdGFudHMKLQotQGNpbmRleCBjaGFyYWN0ZXIgY29uc3RhbnRzCi1AY2luZGV4IGNvbnN0YW50cywgY2hhcmFjdGVyCi1UaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGNoYXJhY3RlciBjb25zdGFudHMuICBBIEBkZm57Y2hhcmFjdGVyfSBzdGFuZHMKLWZvciBvbmUgY2hhcmFjdGVyIGluIG9uZSBieXRlIGFuZCBpdHMgdmFsdWUgbWF5IGJlIHVzZWQgaW4KLW51bWVyaWMgZXhwcmVzc2lvbnMuICBTdHJpbmcgY29uc3RhbnRzIChwcm9wZXJseSBjYWxsZWQgc3RyaW5nCi1AZW1waHtsaXRlcmFsc30pIGFyZSBwb3RlbnRpYWxseSBtYW55IGJ5dGVzIGFuZCB0aGVpciB2YWx1ZXMgbWF5IG5vdCBiZQotdXNlZCBpbiBhcml0aG1ldGljIGV4cHJlc3Npb25zLgotCi1AbWVudQotKiBTdHJpbmdzOjogICAgICAgICAgICAgICAgICAgICBTdHJpbmdzCi0qIENoYXJzOjogICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlcnMKLUBlbmQgbWVudQotCi1Abm9kZSBTdHJpbmdzCi1Ac3Vic3Vic2VjdGlvbiBTdHJpbmdzCi0KLUBjaW5kZXggc3RyaW5nIGNvbnN0YW50cwotQGNpbmRleCBjb25zdGFudHMsIHN0cmluZwotQSBAZGZue3N0cmluZ30gaXMgd3JpdHRlbiBiZXR3ZWVuIGRvdWJsZS1xdW90ZXMuICBJdCBtYXkgY29udGFpbgotZG91YmxlLXF1b3RlcyBvciBudWxsIGNoYXJhY3RlcnMuICBUaGUgd2F5IHRvIGdldCBzcGVjaWFsIGNoYXJhY3RlcnMKLWludG8gYSBzdHJpbmcgaXMgdG8gQGRmbntlc2NhcGV9IHRoZXNlIGNoYXJhY3RlcnM6IHByZWNlZGUgdGhlbSB3aXRoCi1hIGJhY2tzbGFzaCBAc2FtcHtcfSBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZSBAc2FtcHtcXH0gcmVwcmVzZW50cwotb25lIGJhY2tzbGFzaDogIHRoZSBmaXJzdCBAY29kZXtcfSBpcyBhbiBlc2NhcGUgd2hpY2ggdGVsbHMKLUBjb2Rle0B2YWx1ZXtBU319IHRvIGludGVycHJldCB0aGUgc2Vjb25kIGNoYXJhY3RlciBsaXRlcmFsbHkgYXMgYSBiYWNrc2xhc2gKLSh3aGljaCBwcmV2ZW50cyBAY29kZXtAdmFsdWV7QVN9fSBmcm9tIHJlY29nbml6aW5nIHRoZSBzZWNvbmQgQGNvZGV7XH0gYXMgYW4KLWVzY2FwZSBjaGFyYWN0ZXIpLiAgVGhlIGNvbXBsZXRlIGxpc3Qgb2YgZXNjYXBlcyBmb2xsb3dzLgotCi1AY2luZGV4IGVzY2FwZSBjb2RlcywgY2hhcmFjdGVyCi1AY2luZGV4IGNoYXJhY3RlciBlc2NhcGUgY29kZXMKLUB0YWJsZSBAa2JkCi1AYyAgICAgIEBpdGVtIFxhCi1AYyAgICAgIE1uZW1vbmljIGZvciBBQ0tub3dsZWRnZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMDcuCi1AYwotQGNpbmRleCBAY29kZXtcYn0gKGJhY2tzcGFjZSBjaGFyYWN0ZXIpCi1AY2luZGV4IGJhY2tzcGFjZSAoQGNvZGV7XGJ9KQotQGl0ZW0gXGIKLU1uZW1vbmljIGZvciBiYWNrc3BhY2U7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDEwLgotCi1AYyAgICAgIEBpdGVtIFxlCi1AYyAgICAgIE1uZW1vbmljIGZvciBFT1RleHQ7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDA0LgotQGMKLUBjaW5kZXggQGNvZGV7XGZ9IChmb3JtZmVlZCBjaGFyYWN0ZXIpCi1AY2luZGV4IGZvcm1mZWVkIChAY29kZXtcZn0pCi1AaXRlbSBcZgotTW5lbW9uaWMgZm9yIEZvcm1GZWVkOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxNC4KLQotQGNpbmRleCBAY29kZXtcbn0gKG5ld2xpbmUgY2hhcmFjdGVyKQotQGNpbmRleCBuZXdsaW5lIChAY29kZXtcbn0pCi1AaXRlbSBcbgotTW5lbW9uaWMgZm9yIG5ld2xpbmU7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDEyLgotCi1AYyAgICAgIEBpdGVtIFxwCi1AYyAgICAgIE1uZW1vbmljIGZvciBwcmVmaXg7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDMzLCB1c3VhbGx5IGtub3duIGFzIEBjb2Rle2VzY2FwZX0uCi1AYwotQGNpbmRleCBAY29kZXtccn0gKGNhcnJpYWdlIHJldHVybiBjaGFyYWN0ZXIpCi1AY2luZGV4IGNhcnJpYWdlIHJldHVybiAoQGNvZGV7XHJ9KQotQGl0ZW0gXHIKLU1uZW1vbmljIGZvciBjYXJyaWFnZS1SZXR1cm47IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDE1LgotCi1AYyAgICAgIEBpdGVtIFxzCi1AYyAgICAgIE1uZW1vbmljIGZvciBzcGFjZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwNDAuICBJbmNsdWRlZCBmb3IgY29tcGxpYW5jZSB3aXRoCi1AYyAgICAgIG90aGVyIGFzc2VtYmxlcnMuCi1AYwotQGNpbmRleCBAY29kZXtcdH0gKHRhYikKLUBjaW5kZXggdGFiIChAY29kZXtcdH0pCi1AaXRlbSBcdAotTW5lbW9uaWMgZm9yIGhvcml6b250YWwgVGFiOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxMS4KLQotQGMgICAgICBAaXRlbSBcdgotQGMgICAgICBNbmVtb25pYyBmb3IgVmVydGljYWwgdGFiOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxMy4KLUBjICAgICAgQGl0ZW0gXHggQHZhcntkaWdpdH0gQHZhcntkaWdpdH0gQHZhcntkaWdpdH0KLUBjICAgICAgQSBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgY29kZS4gIFRoZSBudW1lcmljIGNvZGUgaXMgMyBoZXhhZGVjaW1hbCBkaWdpdHMuCi1AYwotQGNpbmRleCBAY29kZXtcQHZhcntkZGR9fSAob2N0YWwgY2hhcmFjdGVyIGNvZGUpCi1AY2luZGV4IG9jdGFsIGNoYXJhY3RlciBjb2RlIChAY29kZXtcQHZhcntkZGR9fSkKLUBpdGVtIFwgQHZhcntkaWdpdH0gQHZhcntkaWdpdH0gQHZhcntkaWdpdH0KLUFuIG9jdGFsIGNoYXJhY3RlciBjb2RlLiAgVGhlIG51bWVyaWMgY29kZSBpcyAzIG9jdGFsIGRpZ2l0cy4KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgVW5peCBzeXN0ZW1zLCA4IGFuZCA5IGFyZSBhY2NlcHRlZCBhcyBkaWdpdHM6Ci1mb3IgZXhhbXBsZSwgQGNvZGV7XDAwOH0gaGFzIHRoZSB2YWx1ZSAwMTAsIGFuZCBAY29kZXtcMDA5fSB0aGUgdmFsdWUgMDExLgotCi1AY2luZGV4IEBjb2Rle1xAdmFye3hkLi4ufX0gKGhleCBjaGFyYWN0ZXIgY29kZSkKLUBjaW5kZXggaGV4IGNoYXJhY3RlciBjb2RlIChAY29kZXtcQHZhcnt4ZC4uLn19KQotQGl0ZW0gXEBjb2Rle3h9IEB2YXJ7aGV4LWRpZ2l0cy4uLn0KLUEgaGV4IGNoYXJhY3RlciBjb2RlLiAgQWxsIHRyYWlsaW5nIGhleCBkaWdpdHMgYXJlIGNvbWJpbmVkLiAgRWl0aGVyIHVwcGVyIG9yCi1sb3dlciBjYXNlIEBjb2Rle3h9IHdvcmtzLgotCi1AY2luZGV4IEBjb2Rle1xcfSAoQHNhbXB7XH0gY2hhcmFjdGVyKQotQGNpbmRleCBiYWNrc2xhc2ggKEBjb2Rle1xcfSkKLUBpdGVtIFxcCi1SZXByZXNlbnRzIG9uZSBAc2FtcHtcfSBjaGFyYWN0ZXIuCi0KLUBjICAgICAgQGl0ZW0gXCcKLUBjICAgICAgUmVwcmVzZW50cyBvbmUgQHNhbXB7J30gKGFjY2VudCBhY3V0ZSkgY2hhcmFjdGVyLgotQGMgICAgICBUaGlzIGlzIG5lZWRlZCBpbiBzaW5nbGUgY2hhcmFjdGVyIGxpdGVyYWxzCi1AYyAgICAgIChAeHJlZntDaGFyYWN0ZXJzLCxDaGFyYWN0ZXIgQ29uc3RhbnRzfS4pIHRvIHJlcHJlc2VudAotQGMgICAgICBhIEBzYW1weyd9LgotQGMKLUBjaW5kZXggQGNvZGV7XCJ9IChkb3VibGVxdW90ZSBjaGFyYWN0ZXIpCi1AY2luZGV4IGRvdWJsZXF1b3RlIChAY29kZXtcIn0pCi1AaXRlbSBcIgotUmVwcmVzZW50cyBvbmUgQHNhbXB7In0gY2hhcmFjdGVyLiAgTmVlZGVkIGluIHN0cmluZ3MgdG8gcmVwcmVzZW50Ci10aGlzIGNoYXJhY3RlciwgYmVjYXVzZSBhbiB1bmVzY2FwZWQgQHNhbXB7In0gd291bGQgZW5kIHRoZSBzdHJpbmcuCi0KLUBpdGVtIFwgQHZhcnthbnl0aGluZy1lbHNlfQotQW55IG90aGVyIGNoYXJhY3RlciB3aGVuIGVzY2FwZWQgYnkgQGtiZHtcfSBnaXZlcyBhIHdhcm5pbmcsIGJ1dAotYXNzZW1ibGVzIGFzIGlmIHRoZSBAc2FtcHtcfSB3YXMgbm90IHByZXNlbnQuICBUaGUgaWRlYSBpcyB0aGF0IGlmCi15b3UgdXNlZCBhbiBlc2NhcGUgc2VxdWVuY2UgeW91IGNsZWFybHkgZGlkbid0IHdhbnQgdGhlIGxpdGVyYWwKLWludGVycHJldGF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyLiAgSG93ZXZlciBAY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8KLW90aGVyIGludGVycHJldGF0aW9uLCBzbyBAY29kZXtAdmFsdWV7QVN9fSBrbm93cyBpdCBpcyBnaXZpbmcgeW91IHRoZSB3cm9uZwotY29kZSBhbmQgd2FybnMgeW91IG9mIHRoZSBmYWN0LgotQGVuZCB0YWJsZQotCi1XaGljaCBjaGFyYWN0ZXJzIGFyZSBlc2NhcGFibGUsIGFuZCB3aGF0IHRob3NlIGVzY2FwZXMgcmVwcmVzZW50LAotdmFyaWVzIHdpZGVseSBhbW9uZyBhc3NlbWJsZXJzLiAgVGhlIGN1cnJlbnQgc2V0IGlzIHdoYXQgd2UgdGhpbmsKLXRoZSBCU0QgNC4yIGFzc2VtYmxlciByZWNvZ25pemVzLCBhbmQgaXMgYSBzdWJzZXQgb2Ygd2hhdCBtb3N0IEMKLWNvbXBpbGVycyByZWNvZ25pemUuICBJZiB5b3UgYXJlIGluIGRvdWJ0LCBkbyBub3QgdXNlIGFuIGVzY2FwZQotc2VxdWVuY2UuCi0KLUBub2RlIENoYXJzCi1Ac3Vic3Vic2VjdGlvbiBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggc2luZ2xlIGNoYXJhY3RlciBjb25zdGFudAotQGNpbmRleCBjaGFyYWN0ZXIsIHNpbmdsZQotQGNpbmRleCBjb25zdGFudCwgc2luZ2xlIGNoYXJhY3RlcgotQSBzaW5nbGUgY2hhcmFjdGVyIG1heSBiZSB3cml0dGVuIGFzIGEgc2luZ2xlIHF1b3RlIGltbWVkaWF0ZWx5Ci1mb2xsb3dlZCBieSB0aGF0IGNoYXJhY3Rlci4gIFRoZSBzYW1lIGVzY2FwZXMgYXBwbHkgdG8gY2hhcmFjdGVycyBhcwotdG8gc3RyaW5ncy4gIFNvIGlmIHlvdSB3YW50IHRvIHdyaXRlIHRoZSBjaGFyYWN0ZXIgYmFja3NsYXNoLCB5b3UKLW11c3Qgd3JpdGUgQGtiZHsnXFx9IHdoZXJlIHRoZSBmaXJzdCBAY29kZXtcfSBlc2NhcGVzIHRoZSBzZWNvbmQKLUBjb2Rle1x9LiAgQXMgeW91IGNhbiBzZWUsIHRoZSBxdW90ZSBpcyBhbiBhY3V0ZSBhY2NlbnQsIG5vdCBhCi1ncmF2ZSBhY2NlbnQuICBBIG5ld2xpbmUKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIGFibm9ybWFsLXNlcGFyYXRvcgotKG9yIHNlbWljb2xvbiBAc2FtcHs7fSkKLUBlbmQgaWZjbGVhcgotQGlmc2V0IGFibm9ybWFsLXNlcGFyYXRvcgotQGlmc2V0IEEyOUsKLShvciBhdCBzaWduIEBzYW1we0BAfSkKLUBlbmQgaWZzZXQKLUBpZnNldCBIOAotKG9yIGRvbGxhciBzaWduIEBzYW1weyR9LCBmb3IgdGhlIEg4LzMwMDsgb3Igc2VtaWNvbG9uIEBzYW1wezt9IGZvciB0aGUKLUhpdGFjaGkgU0ggb3IKLUg4LzUwMCkKLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFuIGFjdXRlIGFjY2VudCBpcyB0YWtlbiBhcyBhIGxpdGVyYWwgY2hhcmFjdGVyCi1hbmQgZG9lcyBub3QgY291bnQgYXMgdGhlIGVuZCBvZiBhIHN0YXRlbWVudC4gIFRoZSB2YWx1ZSBvZiBhIGNoYXJhY3RlcgotY29uc3RhbnQgaW4gYSBudW1lcmljIGV4cHJlc3Npb24gaXMgdGhlIG1hY2hpbmUncyBieXRlLXdpZGUgY29kZSBmb3IKLXRoYXQgY2hhcmFjdGVyLiAgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB5b3VyIGNoYXJhY3RlciBjb2RlIGlzIEFTQ0lJOgotQGtiZHsnQX0gbWVhbnMgNjUsIEBrYmR7J0J9IG1lYW5zIDY2LCBhbmQgc28gb24uIEByZWZpbGwKLQotQG5vZGUgTnVtYmVycwotQHN1YnNlY3Rpb24gTnVtYmVyIENvbnN0YW50cwotCi1AY2luZGV4IGNvbnN0YW50cywgbnVtYmVyCi1AY2luZGV4IG51bWJlciBjb25zdGFudHMKLUBjb2Rle0B2YWx1ZXtBU319IGRpc3Rpbmd1aXNoZXMgdGhyZWUga2luZHMgb2YgbnVtYmVycyBhY2NvcmRpbmcgdG8gaG93IHRoZXkKLWFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCBtYWNoaW5lLiAgQGVtcGh7SW50ZWdlcnN9IGFyZSBudW1iZXJzIHRoYXQKLXdvdWxkIGZpdCBpbnRvIGFuIEBjb2Rle2ludH0gaW4gdGhlIEMgbGFuZ3VhZ2UuICBAZW1waHtCaWdudW1zfSBhcmUKLWludGVnZXJzLCBidXQgdGhleSBhcmUgc3RvcmVkIGluIG1vcmUgdGhhbiAzMiBiaXRzLiAgQGVtcGh7RmxvbnVtc30KLWFyZSBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBkZXNjcmliZWQgYmVsb3cuCi0KLUBtZW51Ci0qIEludGVnZXJzOjogICAgICAgICAgICAgICAgICAgIEludGVnZXJzCi0qIEJpZ251bXM6OiAgICAgICAgICAgICAgICAgICAgIEJpZ251bXMKLSogRmxvbnVtczo6ICAgICAgICAgICAgICAgICAgICAgRmxvbnVtcwotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEk5NjAKLSogQml0IEZpZWxkczo6ICAgICAgICAgICAgICAgICAgQml0IEZpZWxkcwotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AZW5kIG1lbnUKLQotQG5vZGUgSW50ZWdlcnMKLUBzdWJzdWJzZWN0aW9uIEludGVnZXJzCi1AY2luZGV4IGludGVnZXJzCi1AY2luZGV4IGNvbnN0YW50cywgaW50ZWdlcgotCi1AY2luZGV4IGJpbmFyeSBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2VycywgYmluYXJ5Ci1BIGJpbmFyeSBpbnRlZ2VyIGlzIEBzYW1wezBifSBvciBAc2FtcHswQn0gZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIG9mCi10aGUgYmluYXJ5IGRpZ2l0cyBAc2FtcHswMX0uCi0KLUBjaW5kZXggb2N0YWwgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMsIG9jdGFsCi1BbiBvY3RhbCBpbnRlZ2VyIGlzIEBzYW1wezB9IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBvZiB0aGUgb2N0YWwKLWRpZ2l0cyAoQHNhbXB7MDEyMzQ1Njd9KS4KLQotQGNpbmRleCBkZWNpbWFsIGludGVnZXJzCi1AY2luZGV4IGludGVnZXJzLCBkZWNpbWFsCi1BIGRlY2ltYWwgaW50ZWdlciBzdGFydHMgd2l0aCBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IKLW1vcmUgZGlnaXRzIChAc2FtcHswMTIzNDU2Nzg5fSkuCi0KLUBjaW5kZXggaGV4YWRlY2ltYWwgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMsIGhleGFkZWNpbWFsCi1BIGhleGFkZWNpbWFsIGludGVnZXIgaXMgQHNhbXB7MHh9IG9yIEBzYW1wezBYfSBmb2xsb3dlZCBieSBvbmUgb3IKLW1vcmUgaGV4YWRlY2ltYWwgZGlnaXRzIGNob3NlbiBmcm9tIEBzYW1wezAxMjM0NTY3ODlhYmNkZWZBQkNERUZ9LgotCi1JbnRlZ2VycyBoYXZlIHRoZSB1c3VhbCB2YWx1ZXMuICBUbyBkZW5vdGUgYSBuZWdhdGl2ZSBpbnRlZ2VyLCB1c2UKLXRoZSBwcmVmaXggb3BlcmF0b3IgQHNhbXB7LX0gZGlzY3Vzc2VkIHVuZGVyIGV4cHJlc3Npb25zCi0oQHB4cmVme1ByZWZpeCBPcHMsLFByZWZpeCBPcGVyYXRvcnN9KS4KLQotQG5vZGUgQmlnbnVtcwotQHN1YnN1YnNlY3Rpb24gQmlnbnVtcwotCi1AY2luZGV4IGJpZ251bXMKLUBjaW5kZXggY29uc3RhbnRzLCBiaWdudW0KLUEgQGRmbntiaWdudW19IGhhcyB0aGUgc2FtZSBzeW50YXggYW5kIHNlbWFudGljcyBhcyBhbiBpbnRlZ2VyCi1leGNlcHQgdGhhdCB0aGUgbnVtYmVyIChvciBpdHMgbmVnYXRpdmUpIHRha2VzIG1vcmUgdGhhbiAzMiBiaXRzIHRvCi1yZXByZXNlbnQgaW4gYmluYXJ5LiAgVGhlIGRpc3RpbmN0aW9uIGlzIG1hZGUgYmVjYXVzZSBpbiBzb21lIHBsYWNlcwotaW50ZWdlcnMgYXJlIHBlcm1pdHRlZCB3aGlsZSBiaWdudW1zIGFyZSBub3QuCi0KLUBub2RlIEZsb251bXMKLUBzdWJzdWJzZWN0aW9uIEZsb251bXMKLUBjaW5kZXggZmxvbnVtcwotQGNpbmRleCBmbG9hdGluZyBwb2ludCBudW1iZXJzCi1AY2luZGV4IGNvbnN0YW50cywgZmxvYXRpbmcgcG9pbnQKLQotQGNpbmRleCBwcmVjaXNpb24sIGZsb2F0aW5nIHBvaW50Ci1BIEBkZm57ZmxvbnVtfSByZXByZXNlbnRzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgVGhlIHRyYW5zbGF0aW9uIGlzCi1pbmRpcmVjdDogYSBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IG51bWJlciBmcm9tIHRoZSB0ZXh0IGlzIGNvbnZlcnRlZCBieQotQGNvZGV7QHZhbHVle0FTfX0gdG8gYSBnZW5lcmljIGJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgb2YgbW9yZSB0aGFuCi1zdWZmaWNpZW50IHByZWNpc2lvbi4gIFRoaXMgZ2VuZXJpYyBmbG9hdGluZyBwb2ludCBudW1iZXIgaXMgY29udmVydGVkCi10byBhIHBhcnRpY3VsYXIgY29tcHV0ZXIncyBmbG9hdGluZyBwb2ludCBmb3JtYXQgKG9yIGZvcm1hdHMpIGJ5IGEKLXBvcnRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gc3BlY2lhbGl6ZWQgdG8gdGhhdCBjb21wdXRlci4KLQotQSBmbG9udW0gaXMgd3JpdHRlbiBieSB3cml0aW5nIChpbiBvcmRlcikKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgZGlnaXQgQHNhbXB7MH0uCi1AaWZzZXQgSFBQQQotKEBzYW1wezB9IGlzIG9wdGlvbmFsIG9uIHRoZSBIUFBBLikKLUBlbmQgaWZzZXQKLQotQGl0ZW0KLUEgbGV0dGVyLCB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRoZSByZXN0IG9mIHRoZSBudW1iZXIgaXMgYSBmbG9udW0uCi1AaWZzZXQgR0VORVJJQwotQGtiZHtlfSBpcyByZWNvbW1lbmRlZC4gIENhc2UgaXMgbm90IGltcG9ydGFudC4KLUBpZ25vcmUKLUBjIEZJWE1FOiB2ZXJpZnkgaWYgZmxvbnVtIHN5bnRheCByZWFsbHkgdGhpcyB2YWd1ZSBmb3IgbW9zdCBjYXNlcwotKEFueSBvdGhlcndpc2UgaWxsZWdhbCBsZXR0ZXIgd29ya3MgaGVyZSwgYnV0IHRoYXQgbWlnaHQgYmUgY2hhbmdlZC4gIFZheCBCU0QKLTQuMiBhc3NlbWJsZXIgc2VlbXMgdG8gYWxsb3cgYW55IG9mIEBzYW1we2RlZmdoREVGR0h9LikKLUBlbmQgaWdub3JlCi0KLU9uIHRoZSBIOC8zMDAsIEg4LzUwMCwKLUhpdGFjaGkgU0gsCi1hbmQgQU1EIDI5SyBhcmNoaXRlY3R1cmVzLCB0aGUgbGV0dGVyIG11c3QgYmUKLW9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlBSU1h9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLQotT24gdGhlIEFSQywgdGhlIGxldHRlciBtdXN0IGJlIG9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlJTfQotKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotCi1PbiB0aGUgSW50ZWwgOTYwIGFyY2hpdGVjdHVyZSwgdGhlIGxldHRlciBtdXN0IGJlCi1vbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7REZUfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCi0KLU9uIHRoZSBIUFBBIGFyY2hpdGVjdHVyZSwgdGhlIGxldHRlciBtdXN0IGJlIEBzYW1we0V9ICh1cHBlciBjYXNlIG9ubHkpLgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEEyOUsKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlBSU1h9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBBUkMKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlJTfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlBSU1h9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1UaGUgbGV0dGVyIEBzYW1we0V9ICh1cHBlciBjYXNlIG9ubHkpLgotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlR9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1AaXRlbQotQW4gb3B0aW9uYWwgc2lnbjogZWl0aGVyIEBzYW1weyt9IG9yIEBzYW1wey19LgotCi1AaXRlbQotQW4gb3B0aW9uYWwgQGRmbntpbnRlZ2VyIHBhcnR9OiB6ZXJvIG9yIG1vcmUgZGVjaW1hbCBkaWdpdHMuCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBAZGZue2ZyYWN0aW9uYWwgcGFydH06IEBzYW1wey59IGZvbGxvd2VkIGJ5IHplcm8KLW9yIG1vcmUgZGVjaW1hbCBkaWdpdHMuCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBleHBvbmVudCwgY29uc2lzdGluZyBvZjoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUFuIEBzYW1we0V9IG9yIEBzYW1we2V9LgotQGMgSSBjYW4ndCBmaW5kIGEgY29uZmlnIHdoZXJlICJFWFBfQ0hBUlMiIGlzIG90aGVyIHRoYW4gJ2VFJywgYnV0IGluCi1AYyBwcmluY2lwbGUgdGhpcyBjYW4gcGVyZmVjdGx5IHdlbGwgYmUgZGlmZmVyZW50IG9uIGRpZmZlcmVudCB0YXJnZXRzLgotQGl0ZW0KLU9wdGlvbmFsIHNpZ246IGVpdGhlciBAc2FtcHsrfSBvciBAc2FtcHstfS4KLUBpdGVtCi1PbmUgb3IgbW9yZSBkZWNpbWFsIGRpZ2l0cy4KLUBlbmQgaXRlbWl6ZQotCi1AZW5kIGl0ZW1pemUKLQotQXQgbGVhc3Qgb25lIG9mIHRoZSBpbnRlZ2VyIHBhcnQgb3IgdGhlIGZyYWN0aW9uYWwgcGFydCBtdXN0IGJlCi1wcmVzZW50LiAgVGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciBoYXMgdGhlIHVzdWFsIGJhc2UtMTAgdmFsdWUuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGRvZXMgYWxsIHByb2Nlc3NpbmcgdXNpbmcgaW50ZWdlcnMuICBGbG9udW1zIGFyZSBjb21wdXRlZAotaW5kZXBlbmRlbnRseSBvZiBhbnkgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUgaW4gdGhlIGNvbXB1dGVyIHJ1bm5pbmcKLUBjb2Rle0B2YWx1ZXtBU319LgotCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSTk2MAotQGMgQml0IGZpZWxkcyBhcmUgd3JpdHRlbiBhcyBhIGdlbmVyYWwgZmFjaWxpdHkgYnV0IGFyZSBhbHNvIGNvbnRyb2xsZWQKLUBjIGJ5IGEgY29uZGl0aW9uYWwtY29tcGlsYXRpb24gZmxhZy0tLXdoaWNoIGlzIGFzIG9mIG5vdyAoMjFtYXI5MSkKLUBjIHR1cm5lZCBvbiBvbmx5IGJ5IHRoZSBpOTYwIGNvbmZpZyBvZiBHQVMuCi1Abm9kZSBCaXQgRmllbGRzCi1Ac3Vic3Vic2VjdGlvbiBCaXQgRmllbGRzCi0KLUBjaW5kZXggYml0IGZpZWxkcwotQGNpbmRleCBjb25zdGFudHMsIGJpdCBmaWVsZAotWW91IGNhbiBhbHNvIGRlZmluZSBudW1lcmljIGNvbnN0YW50cyBhcyBAZGZue2JpdCBmaWVsZHN9Lgotc3BlY2lmeSB0d28gbnVtYmVycyBzZXBhcmF0ZWQgYnkgYSBjb2xvbi0tLQotQGV4YW1wbGUKLUB2YXJ7bWFza306QHZhcnt2YWx1ZX0KLUBlbmQgZXhhbXBsZQotQG5vaW5kZW50Ci1AY29kZXtAdmFsdWV7QVN9fSBhcHBsaWVzIGEgYml0d2lzZSBAc2N7YW5kfSBiZXR3ZWVuIEB2YXJ7bWFza30gYW5kCi1AdmFye3ZhbHVlfS4KLQotVGhlIHJlc3VsdGluZyBudW1iZXIgaXMgdGhlbiBwYWNrZWQKLUBpZnNldCBHRU5FUklDCi1AYyB0aGlzIGNvbmRpdGlvbmFsIHBhcmVuIGluIGNhc2UgYml0IGZpZWxkcyB0dXJuZWQgb24gZWxzZXdoZXJlIHRoYW4gOTYwCi0oaW4gaG9zdC1kZXBlbmRlbnQgYnl0ZSBvcmRlcikKLUBlbmQgaWZzZXQKLWludG8gYSBmaWVsZCB3aG9zZSB3aWR0aCBkZXBlbmRzIG9uIHdoaWNoIGFzc2VtYmxlciBkaXJlY3RpdmUgaGFzIHRoZQotYml0LWZpZWxkIGFzIGl0cyBhcmd1bWVudC4gIE92ZXJmbG93IChhIHJlc3VsdCBmcm9tIHRoZSBiaXR3aXNlIGFuZAotcmVxdWlyaW5nIG1vcmUgYmluYXJ5IGRpZ2l0cyB0byByZXByZXNlbnQpIGlzIG5vdCBhbiBlcnJvcjsgaW5zdGVhZCwKLW1vcmUgY29uc3RhbnRzIGFyZSBnZW5lcmF0ZWQsIG9mIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGJlZ2lubmluZyB3aXRoIHRoZQotbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXRzLkByZWZpbGwKLQotVGhlIGRpcmVjdGl2ZXMgQGNvZGV7LmJ5dGV9LCBAY29kZXsuaHdvcmR9LCBAY29kZXsuaW50fSwgQGNvZGV7Lmxvbmd9LAotQGNvZGV7LnNob3J0fSwgYW5kIEBjb2Rley53b3JkfSBhY2NlcHQgYml0LWZpZWxkIGFyZ3VtZW50cy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBTZWN0aW9ucwotQGNoYXB0ZXIgU2VjdGlvbnMgYW5kIFJlbG9jYXRpb24KLUBjaW5kZXggc2VjdGlvbnMKLUBjaW5kZXggcmVsb2NhdGlvbgotCi1AbWVudQotKiBTZWNzIEJhY2tncm91bmQ6OiAgICAgICAgICAgICBCYWNrZ3JvdW5kCi0qIExkIFNlY3Rpb25zOjogICAgICAgICAgICAgICAgIExpbmtlciBTZWN0aW9ucwotKiBBcyBTZWN0aW9uczo6ICAgICAgICAgICAgICAgICBBc3NlbWJsZXIgSW50ZXJuYWwgU2VjdGlvbnMKLSogU3ViLVNlY3Rpb25zOjogICAgICAgICAgICAgICAgU3ViLVNlY3Rpb25zCi0qIGJzczo6ICAgICAgICAgICAgICAgICAgICAgICAgIGJzcyBTZWN0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgU2VjcyBCYWNrZ3JvdW5kCi1Ac2VjdGlvbiBCYWNrZ3JvdW5kCi0KLVJvdWdobHksIGEgc2VjdGlvbiBpcyBhIHJhbmdlIG9mIGFkZHJlc3Nlcywgd2l0aCBubyBnYXBzOyBhbGwgZGF0YQotYGBpbicnIHRob3NlIGFkZHJlc3NlcyBpcyB0cmVhdGVkIHRoZSBzYW1lIGZvciBzb21lIHBhcnRpY3VsYXIgcHVycG9zZS4KLUZvciBleGFtcGxlIHRoZXJlIG1heSBiZSBhIGBgcmVhZCBvbmx5Jycgc2VjdGlvbi4KLQotQGNpbmRleCBsaW5rZXIsIGFuZCBhc3NlbWJsZXIKLUBjaW5kZXggYXNzZW1ibGVyLCBhbmQgbGlua2VyCi1UaGUgbGlua2VyIEBjb2Rle0B2YWx1ZXtMRH19IHJlYWRzIG1hbnkgb2JqZWN0IGZpbGVzIChwYXJ0aWFsIHByb2dyYW1zKSBhbmQKLWNvbWJpbmVzIHRoZWlyIGNvbnRlbnRzIHRvIGZvcm0gYSBydW5uYWJsZSBwcm9ncmFtLiAgV2hlbiBAY29kZXtAdmFsdWV7QVN9fQotZW1pdHMgYW4gb2JqZWN0IGZpbGUsIHRoZSBwYXJ0aWFsIHByb2dyYW0gaXMgYXNzdW1lZCB0byBzdGFydCBhdCBhZGRyZXNzIDAuCi1AY29kZXtAdmFsdWV7TER9fSBhc3NpZ25zIHRoZSBmaW5hbCBhZGRyZXNzZXMgZm9yIHRoZSBwYXJ0aWFsIHByb2dyYW0sIHNvIHRoYXQKLWRpZmZlcmVudCBwYXJ0aWFsIHByb2dyYW1zIGRvIG5vdCBvdmVybGFwLiAgVGhpcyBpcyBhY3R1YWxseSBhbgotb3ZlcnNpbXBsaWZpY2F0aW9uLCBidXQgaXQgc3VmZmljZXMgdG8gZXhwbGFpbiBob3cgQGNvZGV7QHZhbHVle0FTfX0gdXNlcwotc2VjdGlvbnMuCi0KLUBjb2Rle0B2YWx1ZXtMRH19IG1vdmVzIGJsb2NrcyBvZiBieXRlcyBvZiB5b3VyIHByb2dyYW0gdG8gdGhlaXIgcnVuLXRpbWUKLWFkZHJlc3Nlcy4gIFRoZXNlIGJsb2NrcyBzbGlkZSB0byB0aGVpciBydW4tdGltZSBhZGRyZXNzZXMgYXMgcmlnaWQKLXVuaXRzOyB0aGVpciBsZW5ndGggZG9lcyBub3QgY2hhbmdlIGFuZCBuZWl0aGVyIGRvZXMgdGhlIG9yZGVyIG9mIGJ5dGVzCi13aXRoaW4gdGhlbS4gIFN1Y2ggYSByaWdpZCB1bml0IGlzIGNhbGxlZCBhIEBlbXBoe3NlY3Rpb259LiAgQXNzaWduaW5nCi1ydW4tdGltZSBhZGRyZXNzZXMgdG8gc2VjdGlvbnMgaXMgY2FsbGVkIEBkZm57cmVsb2NhdGlvbn0uICBJdCBpbmNsdWRlcwotdGhlIHRhc2sgb2YgYWRqdXN0aW5nIG1lbnRpb25zIG9mIG9iamVjdC1maWxlIGFkZHJlc3NlcyBzbyB0aGV5IHJlZmVyIHRvCi10aGUgcHJvcGVyIHJ1bi10aW1lIGFkZHJlc3Nlcy4KLUBpZnNldCBIOAotRm9yIHRoZSBIOC8zMDAgYW5kIEg4LzUwMCwKLWFuZCBmb3IgdGhlIEhpdGFjaGkgU0gsCi1AY29kZXtAdmFsdWV7QVN9fSBwYWRzIHNlY3Rpb25zIGlmIG5lZWRlZCB0bwotZW5zdXJlIHRoZXkgZW5kIG9uIGEgd29yZCAoc2l4dGVlbiBiaXQpIGJvdW5kYXJ5LgotQGVuZCBpZnNldAotCi1AY2luZGV4IHN0YW5kYXJkIGFzc2VtYmxlciBzZWN0aW9ucwotQW4gb2JqZWN0IGZpbGUgd3JpdHRlbiBieSBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYXQgbGVhc3QgdGhyZWUgc2VjdGlvbnMsIGFueQotb2Ygd2hpY2ggbWF5IGJlIGVtcHR5LiAgVGhlc2UgYXJlIG5hbWVkIEBkZm57dGV4dH0sIEBkZm57ZGF0YX0gYW5kCi1AZGZue2Jzc30gc2VjdGlvbnMuCi0KLUBpZnNldCBDT0ZGCi1AaWZzZXQgR0VORVJJQwotV2hlbiBpdCBnZW5lcmF0ZXMgQ09GRiBvdXRwdXQsCi1AZW5kIGlmc2V0Ci1AY29kZXtAdmFsdWV7QVN9fSBjYW4gYWxzbyBnZW5lcmF0ZSB3aGF0ZXZlciBvdGhlciBuYW1lZCBzZWN0aW9ucyB5b3Ugc3BlY2lmeQotdXNpbmcgdGhlIEBzYW1wey5zZWN0aW9ufSBkaXJlY3RpdmUgKEBweHJlZntTZWN0aW9uLCxAY29kZXsuc2VjdGlvbn19KS4KLUlmIHlvdSBkbyBub3QgdXNlIGFueSBkaXJlY3RpdmVzIHRoYXQgcGxhY2Ugb3V0cHV0IGluIHRoZSBAc2FtcHsudGV4dH0KLW9yIEBzYW1wey5kYXRhfSBzZWN0aW9ucywgdGhlc2Ugc2VjdGlvbnMgc3RpbGwgZXhpc3QsIGJ1dCBhcmUgZW1wdHkuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1AaWZzZXQgR0VORVJJQwotV2hlbiBAY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgU09NIG9yIEVMRiBvdXRwdXQgZm9yIHRoZSBIUFBBLAotQGVuZCBpZnNldAotQGNvZGV7QHZhbHVle0FTfX0gY2FuIGFsc28gZ2VuZXJhdGUgd2hhdGV2ZXIgb3RoZXIgbmFtZWQgc2VjdGlvbnMgeW91Ci1zcGVjaWZ5IHVzaW5nIHRoZSBAc2FtcHsuc3BhY2V9IGFuZCBAc2FtcHsuc3Vic3BhY2V9IGRpcmVjdGl2ZXMuICBTZWUKLUBjaXRle0hQOTAwMCBTZXJpZXMgODAwIEFzc2VtYmx5IExhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9Ci0oSFAgOTI0MzItOTAwMDEpIGZvciBkZXRhaWxzIG9uIHRoZSBAc2FtcHsuc3BhY2V9IGFuZCBAc2FtcHsuc3Vic3BhY2V9Ci1hc3NlbWJsZXIgZGlyZWN0aXZlcy4KLQotQGlmc2V0IFNPTQotQWRkaXRpb25hbGx5LCBAY29kZXtAdmFsdWV7QVN9fSB1c2VzIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHN0YW5kYXJkCi10ZXh0LCBkYXRhLCBhbmQgYnNzIHNlY3Rpb25zIHdoZW4gZ2VuZXJhdGluZyBTT00gb3V0cHV0LiAgUHJvZ3JhbSB0ZXh0Ci1pcyBwbGFjZWQgaW50byB0aGUgQHNhbXB7JENPREUkfSBzZWN0aW9uLCBkYXRhIGludG8gQHNhbXB7JERBVEEkfSwgYW5kCi1CU1MgaW50byBAc2FtcHskQlNTJH0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLVdpdGhpbiB0aGUgb2JqZWN0IGZpbGUsIHRoZSB0ZXh0IHNlY3Rpb24gc3RhcnRzIGF0IGFkZHJlc3MgQGNvZGV7MH0sIHRoZQotZGF0YSBzZWN0aW9uIGZvbGxvd3MsIGFuZCB0aGUgYnNzIHNlY3Rpb24gZm9sbG93cyB0aGUgZGF0YSBzZWN0aW9uLgotCi1AaWZzZXQgSFBQQQotV2hlbiBnZW5lcmF0aW5nIGVpdGhlciBTT00gb3IgRUxGIG91dHB1dCBmaWxlcyBvbiB0aGUgSFBQQSwgdGhlIHRleHQKLXNlY3Rpb24gc3RhcnRzIGF0IGFkZHJlc3MgQGNvZGV7MH0sIHRoZSBkYXRhIHNlY3Rpb24gYXQgYWRkcmVzcwotQGNvZGV7MHg0MDAwMDAwfSwgYW5kIHRoZSBic3Mgc2VjdGlvbiBmb2xsb3dzIHRoZSBkYXRhIHNlY3Rpb24uCi1AZW5kIGlmc2V0Ci0KLVRvIGxldCBAY29kZXtAdmFsdWV7TER9fSBrbm93IHdoaWNoIGRhdGEgY2hhbmdlcyB3aGVuIHRoZSBzZWN0aW9ucyBhcmUKLXJlbG9jYXRlZCwgYW5kIGhvdyB0byBjaGFuZ2UgdGhhdCBkYXRhLCBAY29kZXtAdmFsdWV7QVN9fSBhbHNvIHdyaXRlcyB0byB0aGUKLW9iamVjdCBmaWxlIGRldGFpbHMgb2YgdGhlIHJlbG9jYXRpb24gbmVlZGVkLiAgVG8gcGVyZm9ybSByZWxvY2F0aW9uCi1AY29kZXtAdmFsdWV7TER9fSBtdXN0IGtub3csIGVhY2ggdGltZSBhbiBhZGRyZXNzIGluIHRoZSBvYmplY3QKLWZpbGUgaXMgbWVudGlvbmVkOgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVdoZXJlIGluIHRoZSBvYmplY3QgZmlsZSBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgcmVmZXJlbmNlIHRvCi1hbiBhZGRyZXNzPwotQGl0ZW0KLUhvdyBsb25nIChpbiBieXRlcykgaXMgdGhpcyByZWZlcmVuY2U/Ci1AaXRlbQotV2hpY2ggc2VjdGlvbiBkb2VzIHRoZSBhZGRyZXNzIHJlZmVyIHRvPyAgV2hhdCBpcyB0aGUgbnVtZXJpYyB2YWx1ZSBvZgotQGRpc3BsYXkKLShAdmFye2FkZHJlc3N9KSBAbWludXN7fSAoQHZhcntzdGFydC1hZGRyZXNzIG9mIHNlY3Rpb259KT8KLUBlbmQgZGlzcGxheQotQGl0ZW0KLUlzIHRoZSByZWZlcmVuY2UgdG8gYW4gYWRkcmVzcyBgYFByb2dyYW0tQ291bnRlciByZWxhdGl2ZScnPwotQGVuZCBpdGVtaXplCi0KLUBjaW5kZXggYWRkcmVzc2VzLCBmb3JtYXQgb2YKLUBjaW5kZXggc2VjdGlvbi1yZWxhdGl2ZSBhZGRyZXNzaW5nCi1JbiBmYWN0LCBldmVyeSBhZGRyZXNzIEBjb2Rle0B2YWx1ZXtBU319IGV2ZXIgdXNlcyBpcyBleHByZXNzZWQgYXMKLUBkaXNwbGF5Ci0oQHZhcntzZWN0aW9ufSkgKyAoQHZhcntvZmZzZXQgaW50byBzZWN0aW9ufSkKLUBlbmQgZGlzcGxheQotQG5vaW5kZW50Ci1GdXJ0aGVyLCBtb3N0IGV4cHJlc3Npb25zIEBjb2Rle0B2YWx1ZXtBU319IGNvbXB1dGVzIGhhdmUgdGhpcyBzZWN0aW9uLXJlbGF0aXZlCi1uYXR1cmUuCi1AaWZzZXQgU09NCi0oRm9yIHNvbWUgb2JqZWN0IGZvcm1hdHMsIHN1Y2ggYXMgU09NIGZvciB0aGUgSFBQQSwgc29tZSBleHByZXNzaW9ucyBhcmUKLXN5bWJvbC1yZWxhdGl2ZSBpbnN0ZWFkLikKLUBlbmQgaWZzZXQKLQotSW4gdGhpcyBtYW51YWwgd2UgdXNlIHRoZSBub3RhdGlvbiBAe0B2YXJ7c2VjbmFtZX0gQHZhcntOfUB9IHRvIG1lYW4gYGBvZmZzZXQKLUB2YXJ7Tn0gaW50byBzZWN0aW9uIEB2YXJ7c2VjbmFtZX0uJycKLQotQXBhcnQgZnJvbSB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgeW91IG5lZWQgdG8ga25vdyBhYm91dCB0aGUKLUBkZm57YWJzb2x1dGV9IHNlY3Rpb24uICBXaGVuIEBjb2Rle0B2YWx1ZXtMRH19IG1peGVzIHBhcnRpYWwgcHJvZ3JhbXMsCi1hZGRyZXNzZXMgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24gcmVtYWluIHVuY2hhbmdlZC4gIEZvciBleGFtcGxlLCBhZGRyZXNzCi1AY29kZXtAe2Fic29sdXRlIDBAfX0gaXMgYGByZWxvY2F0ZWQnJyB0byBydW4tdGltZSBhZGRyZXNzIDAgYnkKLUBjb2Rle0B2YWx1ZXtMRH19LiAgQWx0aG91Z2ggdGhlIGxpbmtlciBuZXZlciBhcnJhbmdlcyB0d28gcGFydGlhbCBwcm9ncmFtcycKLWRhdGEgc2VjdGlvbnMgd2l0aCBvdmVybGFwcGluZyBhZGRyZXNzZXMgYWZ0ZXIgbGlua2luZywgQGVtcGh7YnkgZGVmaW5pdGlvbn0KLXRoZWlyIGFic29sdXRlIHNlY3Rpb25zIG11c3Qgb3ZlcmxhcC4gIEFkZHJlc3MgQGNvZGV7QHthYnNvbHV0ZUAgMjM5QH19IGluIG9uZQotcGFydCBvZiBhIHByb2dyYW0gaXMgYWx3YXlzIHRoZSBzYW1lIGFkZHJlc3Mgd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW5uaW5nIGFzCi1hZGRyZXNzIEBjb2Rle0B7YWJzb2x1dGVAIDIzOUB9fSBpbiBhbnkgb3RoZXIgcGFydCBvZiB0aGUgcHJvZ3JhbS4KLQotVGhlIGlkZWEgb2Ygc2VjdGlvbnMgaXMgZXh0ZW5kZWQgdG8gdGhlIEBkZm57dW5kZWZpbmVkfSBzZWN0aW9uLiAgQW55Ci1hZGRyZXNzIHdob3NlIHNlY3Rpb24gaXMgdW5rbm93biBhdCBhc3NlbWJseSB0aW1lIGlzIGJ5IGRlZmluaXRpb24KLXJlbmRlcmVkIEB7dW5kZWZpbmVkIEB2YXJ7VX1AfS0tLXdoZXJlIEB2YXJ7VX0gaXMgZmlsbGVkIGluIGxhdGVyLgotU2luY2UgbnVtYmVycyBhcmUgYWx3YXlzIGRlZmluZWQsIHRoZSBvbmx5IHdheSB0byBnZW5lcmF0ZSBhbiB1bmRlZmluZWQKLWFkZHJlc3MgaXMgdG8gbWVudGlvbiBhbiB1bmRlZmluZWQgc3ltYm9sLiAgQSByZWZlcmVuY2UgdG8gYSBuYW1lZAotY29tbW9uIGJsb2NrIHdvdWxkIGJlIHN1Y2ggYSBzeW1ib2w6IGl0cyB2YWx1ZSBpcyB1bmtub3duIGF0IGFzc2VtYmx5Ci10aW1lIHNvIGl0IGhhcyBzZWN0aW9uIEBlbXBoe3VuZGVmaW5lZH0uCi0KLUJ5IGFuYWxvZ3kgdGhlIHdvcmQgQGVtcGh7c2VjdGlvbn0gaXMgdXNlZCB0byBkZXNjcmliZSBncm91cHMgb2Ygc2VjdGlvbnMgaW4KLXRoZSBsaW5rZWQgcHJvZ3JhbS4gIEBjb2Rle0B2YWx1ZXtMRH19IHB1dHMgYWxsIHBhcnRpYWwgcHJvZ3JhbXMnIHRleHQKLXNlY3Rpb25zIGluIGNvbnRpZ3VvdXMgYWRkcmVzc2VzIGluIHRoZSBsaW5rZWQgcHJvZ3JhbS4gIEl0IGlzCi1jdXN0b21hcnkgdG8gcmVmZXIgdG8gdGhlIEBlbXBoe3RleHQgc2VjdGlvbn0gb2YgYSBwcm9ncmFtLCBtZWFuaW5nIGFsbAotdGhlIGFkZHJlc3NlcyBvZiBhbGwgcGFydGlhbCBwcm9ncmFtcycgdGV4dCBzZWN0aW9ucy4gIExpa2V3aXNlIGZvcgotZGF0YSBhbmQgYnNzIHNlY3Rpb25zLgotCi1Tb21lIHNlY3Rpb25zIGFyZSBtYW5pcHVsYXRlZCBieSBAY29kZXtAdmFsdWV7TER9fTsgb3RoZXJzIGFyZSBpbnZlbnRlZCBmb3IKLXVzZSBvZiBAY29kZXtAdmFsdWV7QVN9fSBhbmQgaGF2ZSBubyBtZWFuaW5nIGV4Y2VwdCBkdXJpbmcgYXNzZW1ibHkuCi0KLUBub2RlIExkIFNlY3Rpb25zCi1Ac2VjdGlvbiBMaW5rZXIgU2VjdGlvbnMKLUBjb2Rle0B2YWx1ZXtMRH19IGRlYWxzIHdpdGgganVzdCBmb3VyIGtpbmRzIG9mIHNlY3Rpb25zLCBzdW1tYXJpemVkIGJlbG93LgotCi1AdGFibGUgQHN0cm9uZwotCi1AaWZzZXQgQ09GRgotQGNpbmRleCBuYW1lZCBzZWN0aW9ucwotQGNpbmRleCBzZWN0aW9ucywgbmFtZWQKLUBpdGVtIG5hbWVkIHNlY3Rpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgYW91dC1ib3V0Ci1AY2luZGV4IHRleHQgc2VjdGlvbgotQGNpbmRleCBkYXRhIHNlY3Rpb24KLUBpdGVteCB0ZXh0IHNlY3Rpb24KLUBpdGVteCBkYXRhIHNlY3Rpb24KLUBlbmQgaWZzZXQKLVRoZXNlIHNlY3Rpb25zIGhvbGQgeW91ciBwcm9ncmFtLiAgQGNvZGV7QHZhbHVle0FTfX0gYW5kIEBjb2Rle0B2YWx1ZXtMRH19IHRyZWF0IHRoZW0gYXMKLXNlcGFyYXRlIGJ1dCBlcXVhbCBzZWN0aW9ucy4gIEFueXRoaW5nIHlvdSBjYW4gc2F5IG9mIG9uZSBzZWN0aW9uIGlzCi10cnVlIGFub3RoZXIuCi1AaWZzZXQgYW91dC1ib3V0Ci1XaGVuIHRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcsIGhvd2V2ZXIsIGl0IGlzCi1jdXN0b21hcnkgZm9yIHRoZSB0ZXh0IHNlY3Rpb24gdG8gYmUgdW5hbHRlcmFibGUuICBUaGUKLXRleHQgc2VjdGlvbiBpcyBvZnRlbiBzaGFyZWQgYW1vbmcgcHJvY2Vzc2VzOiBpdCBjb250YWlucwotaW5zdHJ1Y3Rpb25zLCBjb25zdGFudHMgYW5kIHRoZSBsaWtlLiAgVGhlIGRhdGEgc2VjdGlvbiBvZiBhIHJ1bm5pbmcKLXByb2dyYW0gaXMgdXN1YWxseSBhbHRlcmFibGU6IGZvciBleGFtcGxlLCBDIHZhcmlhYmxlcyB3b3VsZCBiZSBzdG9yZWQKLWluIHRoZSBkYXRhIHNlY3Rpb24uCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggYnNzIHNlY3Rpb24KLUBpdGVtIGJzcyBzZWN0aW9uCi1UaGlzIHNlY3Rpb24gY29udGFpbnMgemVyb2VkIGJ5dGVzIHdoZW4geW91ciBwcm9ncmFtIGJlZ2lucyBydW5uaW5nLiAgSXQKLWlzIHVzZWQgdG8gaG9sZCB1bml0aWFsaXplZCB2YXJpYWJsZXMgb3IgY29tbW9uIHN0b3JhZ2UuICBUaGUgbGVuZ3RoIG9mCi1lYWNoIHBhcnRpYWwgcHJvZ3JhbSdzIGJzcyBzZWN0aW9uIGlzIGltcG9ydGFudCwgYnV0IGJlY2F1c2UgaXQgc3RhcnRzCi1vdXQgY29udGFpbmluZyB6ZXJvZWQgYnl0ZXMgdGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSBleHBsaWNpdCB6ZXJvCi1ieXRlcyBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgYnNzIHNlY3Rpb24gd2FzIGludmVudGVkIHRvIGVsaW1pbmF0ZQotdGhvc2UgZXhwbGljaXQgemVyb3MgZnJvbSBvYmplY3QgZmlsZXMuCi0KLUBjaW5kZXggYWJzb2x1dGUgc2VjdGlvbgotQGl0ZW0gYWJzb2x1dGUgc2VjdGlvbgotQWRkcmVzcyAwIG9mIHRoaXMgc2VjdGlvbiBpcyBhbHdheXMgYGByZWxvY2F0ZWQnJyB0byBydW50aW1lIGFkZHJlc3MgMC4KLVRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJlZmVyIHRvIGFuIGFkZHJlc3MgdGhhdCBAY29kZXtAdmFsdWV7TER9fSBtdXN0Ci1ub3QgY2hhbmdlIHdoZW4gcmVsb2NhdGluZy4gIEluIHRoaXMgc2Vuc2Ugd2Ugc3BlYWsgb2YgYWJzb2x1dGUKLWFkZHJlc3NlcyBiZWluZyBgYHVucmVsb2NhdGFibGUnJzogdGhleSBkbyBub3QgY2hhbmdlIGR1cmluZyByZWxvY2F0aW9uLgotCi1AY2luZGV4IHVuZGVmaW5lZCBzZWN0aW9uCi1AaXRlbSB1bmRlZmluZWQgc2VjdGlvbgotVGhpcyBgYHNlY3Rpb24nJyBpcyBhIGNhdGNoLWFsbCBmb3IgYWRkcmVzcyByZWZlcmVuY2VzIHRvIG9iamVjdHMgbm90IGluCi10aGUgcHJlY2VkaW5nIHNlY3Rpb25zLgotQGMgRklYTUU6IHJlZiB0byBzb21lIG90aGVyIGRvYyBvbiBvYmotZmlsZSBmb3JtYXRzIGNvdWxkIGdvIGhlcmUuCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggcmVsb2NhdGlvbiBleGFtcGxlCi1BbiBpZGVhbGl6ZWQgZXhhbXBsZSBvZiB0aHJlZSByZWxvY2F0YWJsZSBzZWN0aW9ucyBmb2xsb3dzLgotQGlmc2V0IENPRkYKLVRoZSBleGFtcGxlIHVzZXMgdGhlIHRyYWRpdGlvbmFsIHNlY3Rpb24gbmFtZXMgQHNhbXB7LnRleHR9IGFuZCBAc2FtcHsuZGF0YX0uCi1AZW5kIGlmc2V0Ci1NZW1vcnkgYWRkcmVzc2VzIGFyZSBvbiB0aGUgaG9yaXpvbnRhbCBheGlzLgotCi1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgICAgICAgICAgICAgKy0tLS0tKy0tLS0rLS0rCi1wYXJ0aWFsIHByb2dyYW0gIyAxOiAgfHR0dHR0fGRkZGR8MDB8Ci0gICAgICAgICAgICAgICAgICAgICAgKy0tLS0tKy0tLS0rLS0rCi0KLSAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICAgZGF0YSBic3MKLSAgICAgICAgICAgICAgICAgICAgICBzZWcuICAgc2VnLiBzZWcuCi0KLSAgICAgICAgICAgICAgICAgICAgICArLS0tKy0tLSstLS0rCi1wYXJ0aWFsIHByb2dyYW0gIyAyOiAgfFRUVHxERER8MDAwfAotICAgICAgICAgICAgICAgICAgICAgICstLS0rLS0tKy0tLSsKLQotICAgICAgICAgICAgICAgICAgICAgICstLSstLS0rLS0tLS0rLS0rLS0tLSstLS0rLS0tLS0rfn4KLWxpbmtlZCBwcm9ncmFtOiAgICAgICB8ICB8VFRUfHR0dHR0fCAgfGRkZGR8REREfDAwMDAwfAotICAgICAgICAgICAgICAgICAgICAgICstLSstLS0rLS0tLS0rLS0rLS0tLSstLS0rLS0tLS0rfn4KLQotICAgIGFkZHJlc3NlczogICAgICAgIDAgQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQG5lZWQgNTAwMAotQHRleAotCi1cbGluZXtcaXQgUGFydGlhbCBwcm9ncmFtIFwjMTogXGhmaWx9Ci1cbGluZXtcaWJveHsyLjVjbX17XHR0IHRleHR9XGlib3h7MmNtfXtcdHQgZGF0YX1caWJveHsxY219e1x0dCBic3N9XGhmaWx9Ci1cbGluZXtcYm94aXR7Mi41Y219e1x0dCB0dHR0dH1cYm94aXR7MmNtfXtcdHQgZGRkZH1cYm94aXR7MWNtfXtcdHQgMDB9XGhmaWx9Ci0KLVxsaW5le1xpdCBQYXJ0aWFsIHByb2dyYW0gXCMyOiBcaGZpbH0KLVxsaW5le1xpYm94ezFjbX17XHR0IHRleHR9XGlib3h7MS41Y219e1x0dCBkYXRhfVxpYm94ezFjbX17XHR0IGJzc31caGZpbH0KLVxsaW5le1xib3hpdHsxY219e1x0dCBUVFR9XGJveGl0ezEuNWNtfXtcdHQgRERERH1cYm94aXR7MWNtfXtcdHQgMDAwfVxoZmlsfQotCi1cbGluZXtcaXQgbGlua2VkIHByb2dyYW06IFxoZmlsfQotXGxpbmV7XGlib3h7LjVjbX17fVxpYm94ezFjbX17XHR0IHRleHR9XGlib3h7Mi41Y219e31caWJveHsuNzVjbX17fVxpYm94ezJjbX17XHR0IGRhdGF9XGlib3h7MS41Y219e31caWJveHsyY219e1x0dCBic3N9XGhmaWx9Ci1cbGluZXtcYm94aXR7LjVjbX17fVxib3hpdHsxY219e1x0dCBUVFR9XGJveGl0ezIuNWNtfXtcdHQKLXR0dHR0fVxib3hpdHsuNzVjbX17fVxib3hpdHsyY219e1x0dCBkZGRkfVxib3hpdHsxLjVjbX17XHR0Ci1EREREfVxib3hpdHsyY219e1x0dCAwMDAwMH1cIFxkb3RzXGhmaWx9Ci0KLVxsaW5le1xpdCBhZGRyZXNzZXM6IFxoZmlsfQotXGxpbmV7MFxkb3RzXGhmaWx9Ci0KLUBlbmQgdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotQG5vZGUgQXMgU2VjdGlvbnMKLUBzZWN0aW9uIEFzc2VtYmxlciBJbnRlcm5hbCBTZWN0aW9ucwotCi1AY2luZGV4IGludGVybmFsIGFzc2VtYmxlciBzZWN0aW9ucwotQGNpbmRleCBzZWN0aW9ucyBpbiBtZXNzYWdlcywgaW50ZXJuYWwKLVRoZXNlIHNlY3Rpb25zIGFyZSBtZWFudCBvbmx5IGZvciB0aGUgaW50ZXJuYWwgdXNlIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgVGhleQotaGF2ZSBubyBtZWFuaW5nIGF0IHJ1bi10aW1lLiAgWW91IGRvIG5vdCByZWFsbHkgbmVlZCB0byBrbm93IGFib3V0IHRoZXNlCi1zZWN0aW9ucyBmb3IgbW9zdCBwdXJwb3NlczsgYnV0IHRoZXkgY2FuIGJlIG1lbnRpb25lZCBpbiBAY29kZXtAdmFsdWV7QVN9fQotd2FybmluZyBtZXNzYWdlcywgc28gaXQgbWlnaHQgYmUgaGVscGZ1bCB0byBoYXZlIGFuIGlkZWEgb2YgdGhlaXIKLW1lYW5pbmdzIHRvIEBjb2Rle0B2YWx1ZXtBU319LiAgVGhlc2Ugc2VjdGlvbnMgYXJlIHVzZWQgdG8gcGVybWl0IHRoZQotdmFsdWUgb2YgZXZlcnkgZXhwcmVzc2lvbiBpbiB5b3VyIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW0gdG8gYmUgYQotc2VjdGlvbi1yZWxhdGl2ZSBhZGRyZXNzLgotCi1AdGFibGUgQGIKLUBjaW5kZXggYXNzZW1ibGVyIGludGVybmFsIGxvZ2ljIGVycm9yCi1AaXRlbSBBU1NFTUJMRVItSU5URVJOQUwtTE9HSUMtRVJST1IhCi1BbiBpbnRlcm5hbCBhc3NlbWJsZXIgbG9naWMgZXJyb3IgaGFzIGJlZW4gZm91bmQuICBUaGlzIG1lYW5zIHRoZXJlIGlzIGEKLWJ1ZyBpbiB0aGUgYXNzZW1ibGVyLgotCi1AY2luZGV4IGV4cHIgKGludGVybmFsIHNlY3Rpb24pCi1AaXRlbSBleHByIHNlY3Rpb24KLVRoZSBhc3NlbWJsZXIgc3RvcmVzIGNvbXBsZXggZXhwcmVzc2lvbiBpbnRlcm5hbGx5IGFzIGNvbWJpbmF0aW9ucyBvZgotc3ltYm9scy4gIFdoZW4gaXQgbmVlZHMgdG8gcmVwcmVzZW50IGFuIGV4cHJlc3Npb24gYXMgYSBzeW1ib2wsIGl0IHB1dHMKLWl0IGluIHRoZSBleHByIHNlY3Rpb24uCi1AYyBGSVhNRSBpdGVtIGRlYnVnCi1AYyBGSVhNRSBpdGVtIHRyYW5zZmVyW3RdIHZlY3RvciBwcmVsb2FkCi1AYyBGSVhNRSBpdGVtIHRyYW5zZmVyW3RdIHZlY3RvciBwb3N0bG9hZAotQGMgRklYTUUgaXRlbSByZWdpc3RlcgotQGVuZCB0YWJsZQotCi1Abm9kZSBTdWItU2VjdGlvbnMKLUBzZWN0aW9uIFN1Yi1TZWN0aW9ucwotCi1AY2luZGV4IG51bWJlcmVkIHN1YnNlY3Rpb25zCi1AY2luZGV4IGdyb3VwaW5nIGRhdGEKLUBpZnNldCBhb3V0LWJvdXQKLUFzc2VtYmxlZCBieXRlcwotQGlmc2V0IENPRkYKLWNvbnZlbnRpb25hbGx5Ci1AZW5kIGlmc2V0Ci1mYWxsIGludG8gdHdvIHNlY3Rpb25zOiB0ZXh0IGFuZCBkYXRhLgotQGVuZCBpZnNldAotWW91IG1heSBoYXZlIHNlcGFyYXRlIGdyb3VwcyBvZgotQGlmc2V0IEdFTkVSSUMKLWRhdGEgaW4gbmFtZWQgc2VjdGlvbnMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIGFvdXQtYm91dAotZGF0YSBpbiBuYW1lZCBzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AaWZzZXQgYW91dC1ib3V0Ci10ZXh0IG9yIGRhdGEKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotdGhhdCB5b3Ugd2FudCB0byBlbmQgdXAgbmVhciB0byBlYWNoIG90aGVyIGluIHRoZSBvYmplY3QgZmlsZSwgZXZlbiB0aG91Z2ggdGhleQotYXJlIG5vdCBjb250aWd1b3VzIGluIHRoZSBhc3NlbWJsZXIgc291cmNlLiAgQGNvZGV7QHZhbHVle0FTfX0gYWxsb3dzIHlvdSB0bwotdXNlIEBkZm57c3Vic2VjdGlvbnN9IGZvciB0aGlzIHB1cnBvc2UuICBXaXRoaW4gZWFjaCBzZWN0aW9uLCB0aGVyZSBjYW4gYmUKLW51bWJlcmVkIHN1YnNlY3Rpb25zIHdpdGggdmFsdWVzIGZyb20gMCB0byA4MTkyLiAgT2JqZWN0cyBhc3NlbWJsZWQgaW50byB0aGUKLXNhbWUgc3Vic2VjdGlvbiBnbyBpbnRvIHRoZSBvYmplY3QgZmlsZSB0b2dldGhlciB3aXRoIG90aGVyIG9iamVjdHMgaW4gdGhlIHNhbWUKLXN1YnNlY3Rpb24uICBGb3IgZXhhbXBsZSwgYSBjb21waWxlciBtaWdodCB3YW50IHRvIHN0b3JlIGNvbnN0YW50cyBpbiB0aGUgdGV4dAotc2VjdGlvbiwgYnV0IG1pZ2h0IG5vdCB3YW50IHRvIGhhdmUgdGhlbSBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgcHJvZ3JhbSBiZWluZwotYXNzZW1ibGVkLiAgSW4gdGhpcyBjYXNlLCB0aGUgY29tcGlsZXIgY291bGQgaXNzdWUgYSBAc2FtcHsudGV4dCAwfSBiZWZvcmUgZWFjaAotc2VjdGlvbiBvZiBjb2RlIGJlaW5nIG91dHB1dCwgYW5kIGEgQHNhbXB7LnRleHQgMX0gYmVmb3JlIGVhY2ggZ3JvdXAgb2YKLWNvbnN0YW50cyBiZWluZyBvdXRwdXQuCi0KLVN1YnNlY3Rpb25zIGFyZSBvcHRpb25hbC4gIElmIHlvdSBkbyBub3QgdXNlIHN1YnNlY3Rpb25zLCBldmVyeXRoaW5nCi1nb2VzIGluIHN1YnNlY3Rpb24gbnVtYmVyIHplcm8uCi0KLUBpZnNldCBHRU5FUklDCi1FYWNoIHN1YnNlY3Rpb24gaXMgemVyby1wYWRkZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiBmb3VyIGJ5dGVzLgotKFN1YnNlY3Rpb25zIG1heSBiZSBwYWRkZWQgYSBkaWZmZXJlbnQgYW1vdW50IG9uIGRpZmZlcmVudCBmbGF2b3JzCi1vZiBAY29kZXtAdmFsdWV7QVN9fS4pCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgKLU9uIHRoZSBIOC8zMDAgYW5kIEg4LzUwMCBwbGF0Zm9ybXMsIGVhY2ggc3Vic2VjdGlvbiBpcyB6ZXJvLXBhZGRlZCB0byBhIHdvcmQKLWJvdW5kYXJ5ICh0d28gYnl0ZXMpLgotVGhlIHNhbWUgaXMgdHJ1ZSBvbiB0aGUgSGl0YWNoaSBTSC4KLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1AYyBGSVhNRSBzZWN0aW9uIHBhZGRpbmcgKGFsaWdubWVudCk/Ci1AYyBSaWNoIFBpeGxleSBzYXlzIHBhZGRpbmcgaGVyZSBkZXBlbmRzIG9uIHRhcmdldCBvYmogY29kZSBmb3JtYXQ7IHRoYXQKLUBjIGRvZXNuJ3Qgc2VlbSBwYXJ0aWN1bGFybHkgdXNlZnVsIHRvIHNheSB3aXRob3V0IGZ1cnRoZXIgZWxhYm9yYXRpb24sCi1AYyBzbyBmb3Igbm93IEkgc2F5IG5vdGhpbmcgYWJvdXQgaXQuICBJZiB0aGlzIGlzIGEgZ2VuZXJpYyBCRkQgaXNzdWUsCi1AYyB0aGVzZSBwYXJhZ3JhcGhzIG1pZ2h0IG5lZWQgdG8gdmFuaXNoIGZyb20gdGhpcyBtYW51YWwsIGFuZCBiZQotQGMgZGlzY3Vzc2VkIGluIEJGRCBjaGFwdGVyIG9mIGJpbnV0aWxzIChvciBzb21lIHN1Y2gpLgotQGVuZCBpZnNldAotQGlmc2V0IEEyOUsKLU9uIHRoZSBBTUQgMjlLIGZhbWlseSwgbm8gcGFydGljdWxhciBwYWRkaW5nIGlzIGFkZGVkIHRvIHNlY3Rpb24gb3IKLXN1YnNlY3Rpb24gc2l6ZXM7IEB2YWx1ZXtBU30gZm9yY2VzIG5vIGFsaWdubWVudCBvbiB0aGlzIHBsYXRmb3JtLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLVN1YnNlY3Rpb25zIGFwcGVhciBpbiB5b3VyIG9iamVjdCBmaWxlIGluIG51bWVyaWMgb3JkZXIsIGxvd2VzdCBudW1iZXJlZAotdG8gaGlnaGVzdC4gIChBbGwgdGhpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4pCi1UaGUgb2JqZWN0IGZpbGUgY29udGFpbnMgbm8gcmVwcmVzZW50YXRpb24gb2Ygc3Vic2VjdGlvbnM7IEBjb2Rle0B2YWx1ZXtMRH19IGFuZAotb3RoZXIgcHJvZ3JhbXMgdGhhdCBtYW5pcHVsYXRlIG9iamVjdCBmaWxlcyBzZWUgbm8gdHJhY2Ugb2YgdGhlbS4KLVRoZXkganVzdCBzZWUgYWxsIHlvdXIgdGV4dCBzdWJzZWN0aW9ucyBhcyBhIHRleHQgc2VjdGlvbiwgYW5kIGFsbCB5b3VyCi1kYXRhIHN1YnNlY3Rpb25zIGFzIGEgZGF0YSBzZWN0aW9uLgotCi1UbyBzcGVjaWZ5IHdoaWNoIHN1YnNlY3Rpb24geW91IHdhbnQgc3Vic2VxdWVudCBzdGF0ZW1lbnRzIGFzc2VtYmxlZAotaW50bywgdXNlIGEgbnVtZXJpYyBhcmd1bWVudCB0byBzcGVjaWZ5IGl0LCBpbiBhIEBzYW1wey50ZXh0Ci1AdmFye2V4cHJlc3Npb259fSBvciBhIEBzYW1wey5kYXRhIEB2YXJ7ZXhwcmVzc2lvbn19IHN0YXRlbWVudC4KLUBpZnNldCBDT0ZGCi1AaWZzZXQgR0VORVJJQwotV2hlbiBnZW5lcmF0aW5nIENPRkYgb3V0cHV0LCB5b3UKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLVlvdQotQGVuZCBpZmNsZWFyCi1jYW4gYWxzbyB1c2UgYW4gZXh0cmEgc3Vic2VjdGlvbgotYXJndW1lbnQgd2l0aCBhcmJpdHJhcnkgbmFtZWQgc2VjdGlvbnM6IEBzYW1wey5zZWN0aW9uIEB2YXJ7bmFtZX0sCi1AdmFye2V4cHJlc3Npb259fS4KLUBlbmQgaWZzZXQKLUB2YXJ7RXhwcmVzc2lvbn0gc2hvdWxkIGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24uCi0oQHhyZWZ7RXhwcmVzc2lvbnN9LikgIElmIHlvdSBqdXN0IHNheSBAc2FtcHsudGV4dH0gdGhlbiBAc2FtcHsudGV4dCAwfQotaXMgYXNzdW1lZC4gIExpa2V3aXNlIEBzYW1wey5kYXRhfSBtZWFucyBAc2FtcHsuZGF0YSAwfS4gIEFzc2VtYmx5Ci1iZWdpbnMgaW4gQGNvZGV7dGV4dCAwfS4gIEZvciBpbnN0YW5jZToKLUBzbWFsbGV4YW1wbGUKLS50ZXh0IDAgICAgICMgVGhlIGRlZmF1bHQgc3Vic2VjdGlvbiBpcyB0ZXh0IDAgYW55d2F5LgotLmFzY2lpICJUaGlzIGxpdmVzIGluIHRoZSBmaXJzdCB0ZXh0IHN1YnNlY3Rpb24uICoiCi0udGV4dCAxCi0uYXNjaWkgIkJ1dCB0aGlzIGxpdmVzIGluIHRoZSBzZWNvbmQgdGV4dCBzdWJzZWN0aW9uLiIKLS5kYXRhIDAKLS5hc2NpaSAiVGhpcyBsaXZlcyBpbiB0aGUgZGF0YSBzZWN0aW9uLCIKLS5hc2NpaSAiaW4gdGhlIGZpcnN0IGRhdGEgc3Vic2VjdGlvbi4iCi0udGV4dCAwCi0uYXNjaWkgIlRoaXMgbGl2ZXMgaW4gdGhlIGZpcnN0IHRleHQgc2VjdGlvbiwiCi0uYXNjaWkgImltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgYXN0ZXJpc2sgKCopLiIKLUBlbmQgc21hbGxleGFtcGxlCi0KLUVhY2ggc2VjdGlvbiBoYXMgYSBAZGZue2xvY2F0aW9uIGNvdW50ZXJ9IGluY3JlbWVudGVkIGJ5IG9uZSBmb3IgZXZlcnkgYnl0ZQotYXNzZW1ibGVkIGludG8gdGhhdCBzZWN0aW9uLiAgQmVjYXVzZSBzdWJzZWN0aW9ucyBhcmUgbWVyZWx5IGEgY29udmVuaWVuY2UKLXJlc3RyaWN0ZWQgdG8gQGNvZGV7QHZhbHVle0FTfX0gdGhlcmUgaXMgbm8gY29uY2VwdCBvZiBhIHN1YnNlY3Rpb24gbG9jYXRpb24KLWNvdW50ZXIuICBUaGVyZSBpcyBubyB3YXkgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZSBhIGxvY2F0aW9uIGNvdW50ZXItLS1idXQgdGhlCi1AY29kZXsuYWxpZ259IGRpcmVjdGl2ZSBjaGFuZ2VzIGl0LCBhbmQgYW55IGxhYmVsIGRlZmluaXRpb24gY2FwdHVyZXMgaXRzCi1jdXJyZW50IHZhbHVlLiAgVGhlIGxvY2F0aW9uIGNvdW50ZXIgb2YgdGhlIHNlY3Rpb24gd2hlcmUgc3RhdGVtZW50cyBhcmUgYmVpbmcKLWFzc2VtYmxlZCBpcyBzYWlkIHRvIGJlIHRoZSBAZGZue2FjdGl2ZX0gbG9jYXRpb24gY291bnRlci4KLQotQG5vZGUgYnNzCi1Ac2VjdGlvbiBic3MgU2VjdGlvbgotCi1AY2luZGV4IGJzcyBzZWN0aW9uCi1AY2luZGV4IGNvbW1vbiB2YXJpYWJsZSBzdG9yYWdlCi1UaGUgYnNzIHNlY3Rpb24gaXMgdXNlZCBmb3IgbG9jYWwgY29tbW9uIHZhcmlhYmxlIHN0b3JhZ2UuCi1Zb3UgbWF5IGFsbG9jYXRlIGFkZHJlc3Mgc3BhY2UgaW4gdGhlIGJzcyBzZWN0aW9uLCBidXQgeW91IG1heQotbm90IGRpY3RhdGUgZGF0YSB0byBsb2FkIGludG8gaXQgYmVmb3JlIHlvdXIgcHJvZ3JhbSBleGVjdXRlcy4gIFdoZW4KLXlvdXIgcHJvZ3JhbSBzdGFydHMgcnVubmluZywgYWxsIHRoZSBjb250ZW50cyBvZiB0aGUgYnNzCi1zZWN0aW9uIGFyZSB6ZXJvZWQgYnl0ZXMuCi0KLVRoZSBAY29kZXsubGNvbW19IHBzZXVkby1vcCBkZWZpbmVzIGEgc3ltYm9sIGluIHRoZSBic3Mgc2VjdGlvbjsgc2VlCi1AcmVme0xjb21tLCxAY29kZXsubGNvbW19fS4KLQotVGhlIEBjb2Rley5jb21tfSBwc2V1ZG8tb3AgbWF5IGJlIHVzZWQgdG8gZGVjbGFyZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGlzCi1hbm90aGVyIGZvcm0gb2YgdW5pbml0aWFsaXplZCBzeW1ib2w7IHNlZSBAeHJlZntDb21tLCxAY29kZXsuY29tbX19LgotCi1AaWZzZXQgR0VORVJJQwotV2hlbiBhc3NlbWJsaW5nIGZvciBhIHRhcmdldCB3aGljaCBzdXBwb3J0cyBtdWx0aXBsZSBzZWN0aW9ucywgc3VjaCBhcyBFTEYgb3IKLUNPRkYsIHlvdSBtYXkgc3dpdGNoIGludG8gdGhlIEBjb2Rley5ic3N9IHNlY3Rpb24gYW5kIGRlZmluZSBzeW1ib2xzIGFzIHVzdWFsOwotc2VlIEByZWZ7U2VjdGlvbiwsQGNvZGV7LnNlY3Rpb259fS4gIFlvdSBtYXkgb25seSBhc3NlbWJsZSB6ZXJvIHZhbHVlcyBpbnRvIHRoZQotc2VjdGlvbi4gIFR5cGljYWxseSB0aGUgc2VjdGlvbiB3aWxsIG9ubHkgY29udGFpbiBzeW1ib2wgZGVmaW5pdGlvbnMgYW5kCi1AY29kZXsuc2tpcH0gZGlyZWN0aXZlcyAoQHB4cmVme1NraXAsLEBjb2Rley5za2lwfX0pLgotQGVuZCBpZnNldAotCi1Abm9kZSBTeW1ib2xzCi1AY2hhcHRlciBTeW1ib2xzCi0KLUBjaW5kZXggc3ltYm9scwotU3ltYm9scyBhcmUgYSBjZW50cmFsIGNvbmNlcHQ6IHRoZSBwcm9ncmFtbWVyIHVzZXMgc3ltYm9scyB0byBuYW1lCi10aGluZ3MsIHRoZSBsaW5rZXIgdXNlcyBzeW1ib2xzIHRvIGxpbmssIGFuZCB0aGUgZGVidWdnZXIgdXNlcyBzeW1ib2xzCi10byBkZWJ1Zy4KLQotQHF1b3RhdGlvbgotQGNpbmRleCBkZWJ1Z2dlcnMsIGFuZCBzeW1ib2wgb3JkZXIKLUBlbXBoe1dhcm5pbmc6fSBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBwbGFjZSBzeW1ib2xzIGluIHRoZSBvYmplY3QgZmlsZSBpbgotdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIGRlY2xhcmVkLiAgVGhpcyBtYXkgYnJlYWsgc29tZSBkZWJ1Z2dlcnMuCi1AZW5kIHF1b3RhdGlvbgotCi1AbWVudQotKiBMYWJlbHM6OiAgICAgICAgICAgICAgICAgICAgICBMYWJlbHMKLSogU2V0dGluZyBTeW1ib2xzOjogICAgICAgICAgICAgR2l2aW5nIFN5bWJvbHMgT3RoZXIgVmFsdWVzCi0qIFN5bWJvbCBOYW1lczo6ICAgICAgICAgICAgICAgIFN5bWJvbCBOYW1lcwotKiBEb3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgU3BlY2lhbCBEb3QgU3ltYm9sCi0qIFN5bWJvbCBBdHRyaWJ1dGVzOjogICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgTGFiZWxzCi1Ac2VjdGlvbiBMYWJlbHMKLQotQGNpbmRleCBsYWJlbHMKLUEgQGRmbntsYWJlbH0gaXMgd3JpdHRlbiBhcyBhIHN5bWJvbCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGNvbG9uCi1Ac2FtcHs6fS4gIFRoZSBzeW1ib2wgdGhlbiByZXByZXNlbnRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZQotYWN0aXZlIGxvY2F0aW9uIGNvdW50ZXIsIGFuZCBpcywgZm9yIGV4YW1wbGUsIGEgc3VpdGFibGUgaW5zdHJ1Y3Rpb24KLW9wZXJhbmQuICBZb3UgYXJlIHdhcm5lZCBpZiB5b3UgdXNlIHRoZSBzYW1lIHN5bWJvbCB0byByZXByZXNlbnQgdHdvCi1kaWZmZXJlbnQgbG9jYXRpb25zOiB0aGUgZmlyc3QgZGVmaW5pdGlvbiBvdmVycmlkZXMgYW55IG90aGVyCi1kZWZpbml0aW9ucy4KLQotQGlmc2V0IEhQUEEKLU9uIHRoZSBIUFBBLCB0aGUgdXN1YWwgZm9ybSBmb3IgYSBsYWJlbCBuZWVkIG5vdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhCi1jb2xvbiwgYnV0IGluc3RlYWQgbXVzdCBzdGFydCBpbiBjb2x1bW4gemVyby4gIE9ubHkgb25lIGxhYmVsIG1heSBiZSBkZWZpbmVkIG9uCi1hIHNpbmdsZSBsaW5lLiAgVG8gd29yayBhcm91bmQgdGhpcywgdGhlIEhQUEEgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhbHNvCi1wcm92aWRlcyBhIHNwZWNpYWwgZGlyZWN0aXZlIEBjb2Rley5sYWJlbH0gZm9yIGRlZmluaW5nIGxhYmVscyBtb3JlIGZsZXhpYmx5LgotQGVuZCBpZnNldAotCi1Abm9kZSBTZXR0aW5nIFN5bWJvbHMKLUBzZWN0aW9uIEdpdmluZyBTeW1ib2xzIE90aGVyIFZhbHVlcwotCi1AY2luZGV4IGFzc2lnbmluZyB2YWx1ZXMgdG8gc3ltYm9scwotQGNpbmRleCBzeW1ib2wgdmFsdWVzLCBhc3NpZ25pbmcKLUEgc3ltYm9sIGNhbiBiZSBnaXZlbiBhbiBhcmJpdHJhcnkgdmFsdWUgYnkgd3JpdGluZyBhIHN5bWJvbCwgZm9sbG93ZWQKLWJ5IGFuIGVxdWFscyBzaWduIEBzYW1wez19LCBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uCi0oQHB4cmVme0V4cHJlc3Npb25zfSkuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIEBjb2Rley5zZXR9Ci1kaXJlY3RpdmUuICBAeHJlZntTZXQsLEBjb2Rley5zZXR9fS4KLQotQG5vZGUgU3ltYm9sIE5hbWVzCi1Ac2VjdGlvbiBTeW1ib2wgTmFtZXMKLQotQGNpbmRleCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggbmFtZXMsIHN5bWJvbAotQGlmY2xlYXIgU1BFQ0lBTC1TWU1TCi1TeW1ib2wgbmFtZXMgYmVnaW4gd2l0aCBhIGxldHRlciBvciB3aXRoIG9uZSBvZiBAc2FtcHsuX30uICBPbiBtb3N0Ci1tYWNoaW5lcywgeW91IGNhbiBhbHNvIHVzZSBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXM7IGV4Y2VwdGlvbnMgYXJlCi1ub3RlZCBpbiBAcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4gIFRoYXQgY2hhcmFjdGVyIG1heSBiZSBmb2xsb3dlZCBieSBhbnkKLXN0cmluZyBvZiBkaWdpdHMsIGxldHRlcnMsIGRvbGxhciBzaWducyAodW5sZXNzIG90aGVyd2lzZSBub3RlZCBpbgotQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30pLCBhbmQgdW5kZXJzY29yZXMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBBMjlLCi1Gb3IgdGhlIEFNRCAyOUsgZmFtaWx5LCBAc2FtcHs/fSBpcyBhbHNvIGFsbG93ZWQgaW4gdGhlCi1ib2R5IG9mIGEgc3ltYm9sIG5hbWUsIHRob3VnaCBub3QgYXQgaXRzIGJlZ2lubmluZy4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNQRUNJQUwtU1lNUwotQGlmc2V0IEg4Ci1TeW1ib2wgbmFtZXMgYmVnaW4gd2l0aCBhIGxldHRlciBvciB3aXRoIG9uZSBvZiBAc2FtcHsuX30uICBPbiB0aGUKLUhpdGFjaGkgU0ggb3IgdGhlCi1IOC81MDAsIHlvdSBjYW4gYWxzbyB1c2UgQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzLiAgVGhhdCBjaGFyYWN0ZXIgbWF5Ci1iZSBmb2xsb3dlZCBieSBhbnkgc3RyaW5nIG9mIGRpZ2l0cywgbGV0dGVycywgZG9sbGFyIHNpZ25zIChzYXZlIG9uIHRoZQotSDgvMzAwKSwgYW5kIHVuZGVyc2NvcmVzLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1DYXNlIG9mIGxldHRlcnMgaXMgc2lnbmlmaWNhbnQ6IEBjb2Rle2Zvb30gaXMgYSBkaWZmZXJlbnQgc3ltYm9sIG5hbWUKLXRoYW4gQGNvZGV7Rm9vfS4KLQotRWFjaCBzeW1ib2wgaGFzIGV4YWN0bHkgb25lIG5hbWUuICBFYWNoIG5hbWUgaW4gYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbQotcmVmZXJzIHRvIGV4YWN0bHkgb25lIHN5bWJvbC4gIFlvdSBtYXkgdXNlIHRoYXQgc3ltYm9sIG5hbWUgYW55IG51bWJlciBvZiB0aW1lcwotaW4gYSBwcm9ncmFtLgotCi1Ac3ViaGVhZGluZyBMb2NhbCBTeW1ib2wgTmFtZXMKLQotQGNpbmRleCBsb2NhbCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBsb2NhbAotQGNpbmRleCB0ZW1wb3Jhcnkgc3ltYm9sIG5hbWVzCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgdGVtcG9yYXJ5Ci1Mb2NhbCBzeW1ib2xzIGhlbHAgY29tcGlsZXJzIGFuZCBwcm9ncmFtbWVycyB1c2UgbmFtZXMgdGVtcG9yYXJpbHkuCi1UaGVyZSBhcmUgdGVuIGxvY2FsIHN5bWJvbCBuYW1lcywgd2hpY2ggYXJlIHJlLXVzZWQgdGhyb3VnaG91dCB0aGUKLXByb2dyYW0uICBZb3UgbWF5IHJlZmVyIHRvIHRoZW0gdXNpbmcgdGhlIG5hbWVzIEBzYW1wezB9IEBzYW1wezF9Ci1AZG90c3t9IEBzYW1wezl9LiAgVG8gZGVmaW5lIGEgbG9jYWwgc3ltYm9sLCB3cml0ZSBhIGxhYmVsIG9mIHRoZSBmb3JtCi1Ac2FtcHtAYntOfTp9ICh3aGVyZSBAYntOfSByZXByZXNlbnRzIGFueSBkaWdpdCkuICBUbyByZWZlciB0byB0aGUgbW9zdAotcmVjZW50IHByZXZpb3VzIGRlZmluaXRpb24gb2YgdGhhdCBzeW1ib2wgd3JpdGUgQHNhbXB7QGJ7Tn1ifSwgdXNpbmcgdGhlCi1zYW1lIGRpZ2l0IGFzIHdoZW4geW91IGRlZmluZWQgdGhlIGxhYmVsLiAgVG8gcmVmZXIgdG8gdGhlIG5leHQKLWRlZmluaXRpb24gb2YgYSBsb2NhbCBsYWJlbCwgd3JpdGUgQHNhbXB7QGJ7Tn1mfS0tLXdoZXJlIEBie059IGdpdmVzIHlvdQotYSBjaG9pY2Ugb2YgMTAgZm9yd2FyZCByZWZlcmVuY2VzLiAgVGhlIEBzYW1we2J9IHN0YW5kcyBmb3IKLWBgYmFja3dhcmRzJycgYW5kIHRoZSBAc2FtcHtmfSBzdGFuZHMgZm9yIGBgZm9yd2FyZHMnJy4KLQotTG9jYWwgc3ltYm9scyBhcmUgbm90IGVtaXR0ZWQgYnkgdGhlIGN1cnJlbnQgQHNje2dudX0gQyBjb21waWxlci4KLQotVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gaG93IHlvdSBjYW4gdXNlIHRoZXNlIGxhYmVscywgYnV0Ci1yZW1lbWJlciB0aGF0IGF0IGFueSBwb2ludCBpbiB0aGUgYXNzZW1ibHkgeW91IGNhbiByZWZlciB0byBhdCBtb3N0Ci0xMCBwcmlvciBsb2NhbCBsYWJlbHMgYW5kIHRvIGF0IG1vc3QgMTAgZm9yd2FyZCBsb2NhbCBsYWJlbHMuCi0KLUxvY2FsIHN5bWJvbCBuYW1lcyBhcmUgb25seSBhIG5vdGF0aW9uIGRldmljZS4gIFRoZXkgYXJlIGltbWVkaWF0ZWx5Ci10cmFuc2Zvcm1lZCBpbnRvIG1vcmUgY29udmVudGlvbmFsIHN5bWJvbCBuYW1lcyBiZWZvcmUgdGhlIGFzc2VtYmxlcgotdXNlcyB0aGVtLiAgVGhlIHN5bWJvbCBuYW1lcyBzdG9yZWQgaW4gdGhlIHN5bWJvbCB0YWJsZSwgYXBwZWFyaW5nIGluCi1lcnJvciBtZXNzYWdlcyBhbmQgb3B0aW9uYWxseSBlbWl0dGVkIHRvIHRoZSBvYmplY3QgZmlsZSBoYXZlIHRoZXNlCi1wYXJ0czoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBMCi1BbGwgbG9jYWwgbGFiZWxzIGJlZ2luIHdpdGggQHNhbXB7TH0uIE5vcm1hbGx5IGJvdGggQGNvZGV7QHZhbHVle0FTfX0gYW5kCi1AY29kZXtAdmFsdWV7TER9fSBmb3JnZXQgc3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggQHNhbXB7TH0uIFRoZXNlIGxhYmVscyBhcmUKLXVzZWQgZm9yIHN5bWJvbHMgeW91IGFyZSBuZXZlciBpbnRlbmRlZCB0byBzZWUuICBJZiB5b3UgdXNlIHRoZQotQHNhbXB7LUx9IG9wdGlvbiB0aGVuIEBjb2Rle0B2YWx1ZXtBU319IHJldGFpbnMgdGhlc2Ugc3ltYm9scyBpbiB0aGUKLW9iamVjdCBmaWxlLiBJZiB5b3UgYWxzbyBpbnN0cnVjdCBAY29kZXtAdmFsdWV7TER9fSB0byByZXRhaW4gdGhlc2Ugc3ltYm9scywKLXlvdSBtYXkgdXNlIHRoZW0gaW4gZGVidWdnaW5nLgotCi1AaXRlbSBAdmFye2RpZ2l0fQotSWYgdGhlIGxhYmVsIGlzIHdyaXR0ZW4gQHNhbXB7MDp9IHRoZW4gdGhlIGRpZ2l0IGlzIEBzYW1wezB9LgotSWYgdGhlIGxhYmVsIGlzIHdyaXR0ZW4gQHNhbXB7MTp9IHRoZW4gdGhlIGRpZ2l0IGlzIEBzYW1wezF9LgotQW5kIHNvIG9uIHVwIHRocm91Z2ggQHNhbXB7OTp9LgotCi1AaXRlbSBAa2Jke0MtQX0KLVRoaXMgdW51c3VhbCBjaGFyYWN0ZXIgaXMgaW5jbHVkZWQgc28geW91IGRvIG5vdCBhY2NpZGVudGFsbHkgaW52ZW50Ci1hIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgVGhlIGNoYXJhY3RlciBoYXMgQVNDSUkgdmFsdWUKLUBzYW1we1wwMDF9LgotCi1AaXRlbSBAZW1waHtvcmRpbmFsIG51bWJlcn0KLVRoaXMgaXMgYSBzZXJpYWwgbnVtYmVyIHRvIGtlZXAgdGhlIGxhYmVscyBkaXN0aW5jdC4gIFRoZSBmaXJzdAotQHNhbXB7MDp9IGdldHMgdGhlIG51bWJlciBAc2FtcHsxfTsgVGhlIDE1dGggQHNhbXB7MDp9IGdldHMgdGhlCi1udW1iZXIgQHNhbXB7MTV9OyBAZW1waHtldGMufS4gIExpa2V3aXNlIGZvciB0aGUgb3RoZXIgbGFiZWxzIEBzYW1wezE6fQotdGhyb3VnaCBAc2FtcHs5On0uCi1AZW5kIHRhYmxlCi0KLUZvciBpbnN0YW5jZSwgdGhlIGZpcnN0IEBjb2RlezE6fSBpcyBuYW1lZCBAY29kZXtMMUBrYmR7Qy1BfTF9LCB0aGUgNDR0aAotQGNvZGV7Mzp9IGlzIG5hbWVkIEBjb2Rle0wzQGtiZHtDLUF9NDR9LgotCi1Abm9kZSBEb3QKLUBzZWN0aW9uIFRoZSBTcGVjaWFsIERvdCBTeW1ib2wKLQotQGNpbmRleCBkb3QgKHN5bWJvbCkKLUBjaW5kZXggQGNvZGV7Ln0gKHN5bWJvbCkKLUBjaW5kZXggY3VycmVudCBhZGRyZXNzCi1AY2luZGV4IGxvY2F0aW9uIGNvdW50ZXIKLVRoZSBzcGVjaWFsIHN5bWJvbCBAc2FtcHsufSByZWZlcnMgdG8gdGhlIGN1cnJlbnQgYWRkcmVzcyB0aGF0Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBhc3NlbWJsaW5nIGludG8uICBUaHVzLCB0aGUgZXhwcmVzc2lvbiBAc2FtcHttZWx2aW46Ci0ubG9uZyAufSBkZWZpbmVzIEBjb2Rle21lbHZpbn0gdG8gY29udGFpbiBpdHMgb3duIGFkZHJlc3MuCi1Bc3NpZ25pbmcgYSB2YWx1ZSB0byBAY29kZXsufSBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIGEgQGNvZGV7Lm9yZ30KLWRpcmVjdGl2ZS4gIFRodXMsIHRoZSBleHByZXNzaW9uIEBzYW1wey49Lis0fSBpcyB0aGUgc2FtZSBhcyBzYXlpbmcKLUBpZmNsZWFyIG5vLXNwYWNlLWRpcgotQHNhbXB7LnNwYWNlIDR9LgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgbm8tc3BhY2UtZGlyCi1AaWZzZXQgQTI5SwotQHNhbXB7LmJsb2NrIDR9LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBTeW1ib2wgQXR0cmlidXRlcwotQHNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXMKLQotQGNpbmRleCBzeW1ib2wgYXR0cmlidXRlcwotQGNpbmRleCBhdHRyaWJ1dGVzLCBzeW1ib2wKLUV2ZXJ5IHN5bWJvbCBoYXMsIGFzIHdlbGwgYXMgaXRzIG5hbWUsIHRoZSBhdHRyaWJ1dGVzIGBgVmFsdWUnJyBhbmQKLWBgVHlwZScnLiAgRGVwZW5kaW5nIG9uIG91dHB1dCBmb3JtYXQsIHN5bWJvbHMgY2FuIGFsc28gaGF2ZSBhdXhpbGlhcnkKLWF0dHJpYnV0ZXMuCi1AaWZzZXQgSU5URVJOQUxTCi1UaGUgZGV0YWlsZWQgZGVmaW5pdGlvbnMgYXJlIGluIEBmaWxle2Eub3V0Lmh9LgotQGVuZCBpZnNldAotCi1JZiB5b3UgdXNlIGEgc3ltYm9sIHdpdGhvdXQgZGVmaW5pbmcgaXQsIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgemVybyBmb3IKLWFsbCB0aGVzZSBhdHRyaWJ1dGVzLCBhbmQgcHJvYmFibHkgd29uJ3Qgd2FybiB5b3UuICBUaGlzIG1ha2VzIHRoZQotc3ltYm9sIGFuIGV4dGVybmFsbHkgZGVmaW5lZCBzeW1ib2wsIHdoaWNoIGlzIGdlbmVyYWxseSB3aGF0IHlvdQotd291bGQgd2FudC4KLQotQG1lbnUKLSogU3ltYm9sIFZhbHVlOjogICAgICAgICAgICAgICAgVmFsdWUKLSogU3ltYm9sIFR5cGU6OiAgICAgICAgICAgICAgICAgVHlwZQotQGlmc2V0IGFvdXQtYm91dAotQGlmc2V0IEdFTkVSSUMKLSogYS5vdXQgU3ltYm9sczo6ICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgQk9VVAotKiBhLm91dCBTeW1ib2xzOjogICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci1AZW5kIGlmY2xlYXIKLUBpZnNldCBCT1VUCi0qIGEub3V0IFN5bWJvbHM6OiAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0sIEBjb2Rle2Iub3V0fQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQ09GRgotKiBDT0ZGIFN5bWJvbHM6OiAgICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlcyBmb3IgQ09GRgotQGVuZCBpZnNldAotQGlmc2V0IFNPTQotKiBTT00gU3ltYm9sczo6ICAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBTT00KLUBlbmQgaWZzZXQKLUBlbmQgbWVudQotCi1Abm9kZSBTeW1ib2wgVmFsdWUKLUBzdWJzZWN0aW9uIFZhbHVlCi0KLUBjaW5kZXggdmFsdWUgb2YgYSBzeW1ib2wKLUBjaW5kZXggc3ltYm9sIHZhbHVlCi1UaGUgdmFsdWUgb2YgYSBzeW1ib2wgaXMgKHVzdWFsbHkpIDMyIGJpdHMuICBGb3IgYSBzeW1ib2wgd2hpY2ggbGFiZWxzIGEKLWxvY2F0aW9uIGluIHRoZSB0ZXh0LCBkYXRhLCBic3Mgb3IgYWJzb2x1dGUgc2VjdGlvbnMgdGhlIHZhbHVlIGlzIHRoZQotbnVtYmVyIG9mIGFkZHJlc3NlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGF0IHNlY3Rpb24gdG8gdGhlIGxhYmVsLgotTmF0dXJhbGx5IGZvciB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGNoYW5nZXMKLWFzIEBjb2Rle0B2YWx1ZXtMRH19IGNoYW5nZXMgc2VjdGlvbiBiYXNlIGFkZHJlc3NlcyBkdXJpbmcgbGlua2luZy4gIEFic29sdXRlCi1zeW1ib2xzJyB2YWx1ZXMgZG8gbm90IGNoYW5nZSBkdXJpbmcgbGlua2luZzogdGhhdCBpcyB3aHkgdGhleSBhcmUKLWNhbGxlZCBhYnNvbHV0ZS4KLQotVGhlIHZhbHVlIG9mIGFuIHVuZGVmaW5lZCBzeW1ib2wgaXMgdHJlYXRlZCBpbiBhIHNwZWNpYWwgd2F5LiAgSWYgaXQgaXMKLTAgdGhlbiB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgYXNzZW1ibGVyIHNvdXJjZSBmaWxlLCBhbmQKLUBjb2Rle0B2YWx1ZXtMRH19IHRyaWVzIHRvIGRldGVybWluZSBpdHMgdmFsdWUgZnJvbSBvdGhlciBmaWxlcyBsaW5rZWQgaW50byB0aGUKLXNhbWUgcHJvZ3JhbS4gIFlvdSBtYWtlIHRoaXMga2luZCBvZiBzeW1ib2wgc2ltcGx5IGJ5IG1lbnRpb25pbmcgYSBzeW1ib2wKLW5hbWUgd2l0aG91dCBkZWZpbmluZyBpdC4gIEEgbm9uLXplcm8gdmFsdWUgcmVwcmVzZW50cyBhIEBjb2Rley5jb21tfQotY29tbW9uIGRlY2xhcmF0aW9uLiAgVGhlIHZhbHVlIGlzIGhvdyBtdWNoIGNvbW1vbiBzdG9yYWdlIHRvIHJlc2VydmUsIGluCi1ieXRlcyAoYWRkcmVzc2VzKS4gIFRoZSBzeW1ib2wgcmVmZXJzIHRvIHRoZSBmaXJzdCBhZGRyZXNzIG9mIHRoZQotYWxsb2NhdGVkIHN0b3JhZ2UuCi0KLUBub2RlIFN5bWJvbCBUeXBlCi1Ac3Vic2VjdGlvbiBUeXBlCi0KLUBjaW5kZXggdHlwZSBvZiBhIHN5bWJvbAotQGNpbmRleCBzeW1ib2wgdHlwZQotVGhlIHR5cGUgYXR0cmlidXRlIG9mIGEgc3ltYm9sIGNvbnRhaW5zIHJlbG9jYXRpb24gKHNlY3Rpb24pCi1pbmZvcm1hdGlvbiwgYW55IGZsYWcgc2V0dGluZ3MgaW5kaWNhdGluZyB0aGF0IGEgc3ltYm9sIGlzIGV4dGVybmFsLCBhbmQKLShvcHRpb25hbGx5KSwgb3RoZXIgaW5mb3JtYXRpb24gZm9yIGxpbmtlcnMgYW5kIGRlYnVnZ2Vycy4gIFRoZSBleGFjdAotZm9ybWF0IGRlcGVuZHMgb24gdGhlIG9iamVjdC1jb2RlIG91dHB1dCBmb3JtYXQgaW4gdXNlLgotCi1AaWZzZXQgYW91dC1ib3V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgQk9VVAotQGMgVGhlIGZvbGxvd2luZyBhdm9pZHMgYSAid2lkb3ciIHN1YnNlY3Rpb24gdGl0bGUuICBAZ3JvdXAgd291bGQgYmUKLUBjIGJldHRlciBpZiBpdCB3ZXJlIGF2YWlsYWJsZSBvdXRzaWRlIGV4YW1wbGVzLgotQG5lZWQgMTAwMAotQG5vZGUgYS5vdXQgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fSwgQGNvZGV7Yi5vdXR9Ci0KLUBjaW5kZXggQGNvZGV7Yi5vdXR9IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBAY29kZXtiLm91dH0KLVRoZXNlIHN5bWJvbCBhdHRyaWJ1dGVzIGFwcGVhciBvbmx5IHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IKLW9uZSBvZiB0aGUgQmVya2VsZXktZGVzY2VuZGVkIG9iamVjdCBvdXRwdXQgZm9ybWF0cy0tLUBjb2Rle2Eub3V0fSBvcgotQGNvZGV7Yi5vdXR9LgotCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBCT1VUCi1Abm9kZSBhLm91dCBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci0KLUBjaW5kZXggQGNvZGV7YS5vdXR9IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBAY29kZXthLm91dH0KLQotQGVuZCBpZmNsZWFyCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi1Abm9kZSBhLm91dCBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci0KLUBjaW5kZXggQGNvZGV7YS5vdXR9IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBAY29kZXthLm91dH0KLQotQGVuZCBpZnNldAotQG1lbnUKLSogU3ltYm9sIERlc2M6OiAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcgotKiBTeW1ib2wgT3RoZXI6OiAgICAgICAgICAgICAgICBPdGhlcgotQGVuZCBtZW51Ci0KLUBub2RlIFN5bWJvbCBEZXNjCi1Ac3Vic3Vic2VjdGlvbiBEZXNjcmlwdG9yCi0KLUBjaW5kZXggZGVzY3JpcHRvciwgb2YgQGNvZGV7YS5vdXR9IHN5bWJvbAotVGhpcyBpcyBhbiBhcmJpdHJhcnkgMTYtYml0IHZhbHVlLiAgWW91IG1heSBlc3RhYmxpc2ggYSBzeW1ib2wncwotZGVzY3JpcHRvciB2YWx1ZSBieSB1c2luZyBhIEBjb2Rley5kZXNjfSBzdGF0ZW1lbnQKLShAcHhyZWZ7RGVzYywsQGNvZGV7LmRlc2N9fSkuICBBIGRlc2NyaXB0b3IgdmFsdWUgbWVhbnMgbm90aGluZyB0bwotQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBub2RlIFN5bWJvbCBPdGhlcgotQHN1YnN1YnNlY3Rpb24gT3RoZXIKLQotQGNpbmRleCBvdGhlciBhdHRyaWJ1dGUsIG9mIEBjb2Rle2Eub3V0fSBzeW1ib2wKLVRoaXMgaXMgYW4gYXJiaXRyYXJ5IDgtYml0IHZhbHVlLiAgSXQgbWVhbnMgbm90aGluZyB0byBAY29kZXtAdmFsdWV7QVN9fS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIENPRkYgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXMgZm9yIENPRkYKLQotQGNpbmRleCBDT0ZGIHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBDT0ZGCi0KLVRoZSBDT0ZGIGZvcm1hdCBzdXBwb3J0cyBhIG11bHRpdHVkZSBvZiBhdXhpbGlhcnkgc3ltYm9sIGF0dHJpYnV0ZXM7Ci1saWtlIHRoZSBwcmltYXJ5IHN5bWJvbCBhdHRyaWJ1dGVzLCB0aGV5IGFyZSBzZXQgYmV0d2VlbiBAY29kZXsuZGVmfSBhbmQKLUBjb2Rley5lbmRlZn0gZGlyZWN0aXZlcy4KLQotQHN1YnN1YnNlY3Rpb24gUHJpbWFyeSBBdHRyaWJ1dGVzCi0KLUBjaW5kZXggcHJpbWFyeSBhdHRyaWJ1dGVzLCBDT0ZGIHN5bWJvbHMKLVRoZSBzeW1ib2wgbmFtZSBpcyBzZXQgd2l0aCBAY29kZXsuZGVmfTsgdGhlIHZhbHVlIGFuZCB0eXBlLAotcmVzcGVjdGl2ZWx5LCB3aXRoIEBjb2Rley52YWx9IGFuZCBAY29kZXsudHlwZX0uCi0KLUBzdWJzdWJzZWN0aW9uIEF1eGlsaWFyeSBBdHRyaWJ1dGVzCi0KLUBjaW5kZXggYXV4aWxpYXJ5IGF0dHJpYnV0ZXMsIENPRkYgc3ltYm9scwotVGhlIEBjb2Rle0B2YWx1ZXtBU319IGRpcmVjdGl2ZXMgQGNvZGV7LmRpbX0sIEBjb2Rley5saW5lfSwgQGNvZGV7LnNjbH0sCi1AY29kZXsuc2l6ZX0sIGFuZCBAY29kZXsudGFnfSBjYW4gZ2VuZXJhdGUgYXV4aWxpYXJ5IHN5bWJvbCB0YWJsZQotaW5mb3JtYXRpb24gZm9yIENPRkYuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBTT00KLUBub2RlIFNPTSBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlcyBmb3IgU09NCi0KLUBjaW5kZXggU09NIHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBTT00KLQotVGhlIFNPTSBmb3JtYXQgZm9yIHRoZSBIUFBBIHN1cHBvcnRzIGEgbXVsdGl0dWRlIG9mIHN5bWJvbCBhdHRyaWJ1dGVzIHNldCB3aXRoCi10aGUgQGNvZGV7LkVYUE9SVH0gYW5kIEBjb2Rley5JTVBPUlR9IGRpcmVjdGl2ZXMuCi0KLVRoZSBhdHRyaWJ1dGVzIGFyZSBkZXNjcmliZWQgaW4gQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAgQXNzZW1ibHkgCi1MYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfSAoSFAgOTI0MzItOTAwMDEpIHVuZGVyIHRoZSBAY29kZXtJTVBPUlR9IGFuZAotQGNvZGV7RVhQT1JUfSBhc3NlbWJsZXIgZGlyZWN0aXZlIGRvY3VtZW50YXRpb24uCi1AZW5kIGlmc2V0Ci0KLUBub2RlIEV4cHJlc3Npb25zCi1AY2hhcHRlciBFeHByZXNzaW9ucwotCi1AY2luZGV4IGV4cHJlc3Npb25zCi1AY2luZGV4IGFkZHJlc3NlcwotQGNpbmRleCBudW1lcmljIHZhbHVlcwotQW4gQGRmbntleHByZXNzaW9ufSBzcGVjaWZpZXMgYW4gYWRkcmVzcyBvciBudW1lcmljIHZhbHVlLgotV2hpdGVzcGFjZSBtYXkgcHJlY2VkZSBhbmQvb3IgZm9sbG93IGFuIGV4cHJlc3Npb24uCi0KLVRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBtdXN0IGJlIGFuIGFic29sdXRlIG51bWJlciwgb3IgZWxzZSBhbiBvZmZzZXQgaW50bwotYSBwYXJ0aWN1bGFyIHNlY3Rpb24uICBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBhYnNvbHV0ZSwgYW5kIHRoZXJlIGlzIG5vdAotZW5vdWdoIGluZm9ybWF0aW9uIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gc2VlcyB0aGUgZXhwcmVzc2lvbiB0byBrbm93IGl0cwotc2VjdGlvbiwgYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBzb3VyY2UgcHJvZ3JhbSBtaWdodCBiZSBuZWNlc3NhcnkgdG8gaW50ZXJwcmV0Ci10aGUgZXhwcmVzc2lvbi0tLWJ1dCB0aGUgc2Vjb25kIHBhc3MgaXMgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZC4KLUBjb2Rle0B2YWx1ZXtBU319IGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBzaXR1YXRpb24uCi0KLUBtZW51Ci0qIEVtcHR5IEV4cHJzOjogICAgICAgICAgICAgICAgIEVtcHR5IEV4cHJlc3Npb25zCi0qIEludGVnZXIgRXhwcnM6OiAgICAgICAgICAgICAgIEludGVnZXIgRXhwcmVzc2lvbnMKLUBlbmQgbWVudQotCi1Abm9kZSBFbXB0eSBFeHBycwotQHNlY3Rpb24gRW1wdHkgRXhwcmVzc2lvbnMKLQotQGNpbmRleCBlbXB0eSBleHByZXNzaW9ucwotQGNpbmRleCBleHByZXNzaW9ucywgZW1wdHkKLUFuIGVtcHR5IGV4cHJlc3Npb24gaGFzIG5vIHZhbHVlOiBpdCBpcyBqdXN0IHdoaXRlc3BhY2Ugb3IgbnVsbC4KLVdoZXJldmVyIGFuIGFic29sdXRlIGV4cHJlc3Npb24gaXMgcmVxdWlyZWQsIHlvdSBtYXkgb21pdCB0aGUKLWV4cHJlc3Npb24sIGFuZCBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIGEgdmFsdWUgb2YgKGFic29sdXRlKSAwLiAgVGhpcwotaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuCi0KLUBub2RlIEludGVnZXIgRXhwcnMKLUBzZWN0aW9uIEludGVnZXIgRXhwcmVzc2lvbnMKLQotQGNpbmRleCBpbnRlZ2VyIGV4cHJlc3Npb25zCi1AY2luZGV4IGV4cHJlc3Npb25zLCBpbnRlZ2VyCi1BbiBAZGZue2ludGVnZXIgZXhwcmVzc2lvbn0gaXMgb25lIG9yIG1vcmUgQGVtcGh7YXJndW1lbnRzfSBkZWxpbWl0ZWQKLWJ5IEBlbXBoe29wZXJhdG9yc30uCi0KLUBtZW51Ci0qIEFyZ3VtZW50czo6ICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50cwotKiBPcGVyYXRvcnM6OiAgICAgICAgICAgICAgICAgICBPcGVyYXRvcnMKLSogUHJlZml4IE9wczo6ICAgICAgICAgICAgICAgICAgUHJlZml4IE9wZXJhdG9ycwotKiBJbmZpeCBPcHM6OiAgICAgICAgICAgICAgICAgICBJbmZpeCBPcGVyYXRvcnMKLUBlbmQgbWVudQotCi1Abm9kZSBBcmd1bWVudHMKLUBzdWJzZWN0aW9uIEFyZ3VtZW50cwotCi1AY2luZGV4IGV4cHJlc3Npb24gYXJndW1lbnRzCi1AY2luZGV4IGFyZ3VtZW50cyBpbiBleHByZXNzaW9ucwotQGNpbmRleCBvcGVyYW5kcyBpbiBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljIG9wZXJhbmRzCi1AZGZue0FyZ3VtZW50c30gYXJlIHN5bWJvbHMsIG51bWJlcnMgb3Igc3ViZXhwcmVzc2lvbnMuICBJbiBvdGhlcgotY29udGV4dHMgYXJndW1lbnRzIGFyZSBzb21ldGltZXMgY2FsbGVkIGBgYXJpdGhtZXRpYyBvcGVyYW5kcycnLiAgSW4KLXRoaXMgbWFudWFsLCB0byBhdm9pZCBjb25mdXNpbmcgdGhlbSB3aXRoIHRoZSBgYGluc3RydWN0aW9uIG9wZXJhbmRzJycgb2YKLXRoZSBtYWNoaW5lIGxhbmd1YWdlLCB3ZSB1c2UgdGhlIHRlcm0gYGBhcmd1bWVudCcnIHRvIHJlZmVyIHRvIHBhcnRzIG9mCi1leHByZXNzaW9ucyBvbmx5LCByZXNlcnZpbmcgdGhlIHdvcmQgYGBvcGVyYW5kJycgdG8gcmVmZXIgb25seSB0byBtYWNoaW5lCi1pbnN0cnVjdGlvbiBvcGVyYW5kcy4KLQotU3ltYm9scyBhcmUgZXZhbHVhdGVkIHRvIHlpZWxkIEB7QHZhcntzZWN0aW9ufSBAdmFye05OTn1AfSB3aGVyZQotQHZhcntzZWN0aW9ufSBpcyBvbmUgb2YgdGV4dCwgZGF0YSwgYnNzLCBhYnNvbHV0ZSwKLW9yIHVuZGVmaW5lZC4gIEB2YXJ7Tk5OfSBpcyBhIHNpZ25lZCwgMidzIGNvbXBsZW1lbnQgMzIgYml0Ci1pbnRlZ2VyLgotCi1OdW1iZXJzIGFyZSB1c3VhbGx5IGludGVnZXJzLgotCi1BIG51bWJlciBjYW4gYmUgYSBmbG9udW0gb3IgYmlnbnVtLiAgSW4gdGhpcyBjYXNlLCB5b3UgYXJlIHdhcm5lZAotdGhhdCBvbmx5IHRoZSBsb3cgb3JkZXIgMzIgYml0cyBhcmUgdXNlZCwgYW5kIEBjb2Rle0B2YWx1ZXtBU319IHByZXRlbmRzCi10aGVzZSAzMiBiaXRzIGFyZSBhbiBpbnRlZ2VyLiAgWW91IG1heSB3cml0ZSBpbnRlZ2VyLW1hbmlwdWxhdGluZwotaW5zdHJ1Y3Rpb25zIHRoYXQgYWN0IG9uIGV4b3RpYyBjb25zdGFudHMsIGNvbXBhdGlibGUgd2l0aCBvdGhlcgotYXNzZW1ibGVycy4KLQotQGNpbmRleCBzdWJleHByZXNzaW9ucwotU3ViZXhwcmVzc2lvbnMgYXJlIGEgbGVmdCBwYXJlbnRoZXNpcyBAc2FtcHsofSBmb2xsb3dlZCBieSBhbiBpbnRlZ2VyCi1leHByZXNzaW9uLCBmb2xsb3dlZCBieSBhIHJpZ2h0IHBhcmVudGhlc2lzIEBzYW1weyl9OyBvciBhIHByZWZpeAotb3BlcmF0b3IgZm9sbG93ZWQgYnkgYW4gYXJndW1lbnQuCi0KLUBub2RlIE9wZXJhdG9ycwotQHN1YnNlY3Rpb24gT3BlcmF0b3JzCi0KLUBjaW5kZXggb3BlcmF0b3JzLCBpbiBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljIGZ1bmN0aW9ucwotQGNpbmRleCBmdW5jdGlvbnMsIGluIGV4cHJlc3Npb25zCi1AZGZue09wZXJhdG9yc30gYXJlIGFyaXRobWV0aWMgZnVuY3Rpb25zLCBsaWtlIEBjb2Rleyt9IG9yIEBjb2RleyV9LiAgUHJlZml4Ci1vcGVyYXRvcnMgYXJlIGZvbGxvd2VkIGJ5IGFuIGFyZ3VtZW50LiAgSW5maXggb3BlcmF0b3JzIGFwcGVhcgotYmV0d2VlbiB0aGVpciBhcmd1bWVudHMuICBPcGVyYXRvcnMgbWF5IGJlIHByZWNlZGVkIGFuZC9vciBmb2xsb3dlZCBieQotd2hpdGVzcGFjZS4KLQotQG5vZGUgUHJlZml4IE9wcwotQHN1YnNlY3Rpb24gUHJlZml4IE9wZXJhdG9yCi0KLUBjaW5kZXggcHJlZml4IG9wZXJhdG9ycwotQGNvZGV7QHZhbHVle0FTfX0gaGFzIHRoZSBmb2xsb3dpbmcgQGRmbntwcmVmaXggb3BlcmF0b3JzfS4gIFRoZXkgZWFjaCB0YWtlCi1vbmUgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYWJzb2x1dGUuCi0KLUBjIHRoZSB0ZXgvZW5kIHRleCBzdHVmZiBzdXJyb3VuZGluZyB0aGlzIHNtYWxsIHRhYmxlIGlzIG1lYW50IHRvIG1ha2UKLUBjIGl0IGFsaWduLCBvbiB0aGUgcHJpbnRlZCBwYWdlLCB3aXRoIHRoZSBzaW1pbGFyIHRhYmxlIGluIHRoZSBuZXh0Ci1AYyBzZWN0aW9uICh3aGljaCBpcyBpbnNpZGUgYW4gZW51bWVyYXRlKS4KLUB0ZXgKLVxnbG9iYWxcYWR2YW5jZVxsZWZ0c2tpcCBieSBcaXRlbWluZGVudAotQGVuZCB0ZXgKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtCi1AZGZue05lZ2F0aW9ufS4gIFR3bydzIGNvbXBsZW1lbnQgbmVnYXRpb24uCi1AaXRlbSB+Ci1AZGZue0NvbXBsZW1lbnRhdGlvbn0uICBCaXR3aXNlIG5vdC4KLUBlbmQgdGFibGUKLQotQHRleAotXGdsb2JhbFxhZHZhbmNlXGxlZnRza2lwIGJ5IC1caXRlbWluZGVudAotQGVuZCB0ZXgKLQotQG5vZGUgSW5maXggT3BzCi1Ac3Vic2VjdGlvbiBJbmZpeCBPcGVyYXRvcnMKLQotQGNpbmRleCBpbmZpeCBvcGVyYXRvcnMKLUBjaW5kZXggb3BlcmF0b3JzLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AZGZue0luZml4IG9wZXJhdG9yc30gdGFrZSB0d28gYXJndW1lbnRzLCBvbmUgb24gZWl0aGVyIHNpZGUuICBPcGVyYXRvcnMKLWhhdmUgcHJlY2VkZW5jZSwgYnV0IG9wZXJhdGlvbnMgd2l0aCBlcXVhbCBwcmVjZWRlbmNlIGFyZSBwZXJmb3JtZWQgbGVmdAotdG8gcmlnaHQuICBBcGFydCBmcm9tIEBjb2Rleyt9IG9yIEBjb2Rley19LCBib3RoIGFyZ3VtZW50cyBtdXN0IGJlCi1hYnNvbHV0ZSwgYW5kIHRoZSByZXN1bHQgaXMgYWJzb2x1dGUuCi0KLUBlbnVtZXJhdGUKLUBjaW5kZXggb3BlcmF0b3IgcHJlY2VkZW5jZQotQGNpbmRleCBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycwotCi1AaXRlbQotSGlnaGVzdCBQcmVjZWRlbmNlCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gKgotQGRmbntNdWx0aXBsaWNhdGlvbn0uCi0KLUBpdGVtIC8KLUBkZm57RGl2aXNpb259LiAgVHJ1bmNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgQyBvcGVyYXRvciBAc2FtcHsvfQotCi1AaXRlbSAlCi1AZGZue1JlbWFpbmRlcn0uCi0KLUBpdGVtIDwKLUBpdGVteCA8PAotQGRmbntTaGlmdCBMZWZ0fS4gIFNhbWUgYXMgdGhlIEMgb3BlcmF0b3IgQHNhbXB7PDx9LgotCi1AaXRlbSA+Ci1AaXRlbXggPj4KLUBkZm57U2hpZnQgUmlnaHR9LiAgU2FtZSBhcyB0aGUgQyBvcGVyYXRvciBAc2FtcHs+Pn0uCi1AZW5kIHRhYmxlCi0KLUBpdGVtCi1JbnRlcm1lZGlhdGUgcHJlY2VkZW5jZQotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHwKLQotQGRmbntCaXR3aXNlIEluY2x1c2l2ZSBPcn0uCi0KLUBpdGVtICYKLUBkZm57Qml0d2lzZSBBbmR9LgotCi1AaXRlbSBeCi1AZGZue0JpdHdpc2UgRXhjbHVzaXZlIE9yfS4KLQotQGl0ZW0gIQotQGRmbntCaXR3aXNlIE9yIE5vdH0uCi1AZW5kIHRhYmxlCi0KLUBpdGVtCi1Mb3dlc3QgUHJlY2VkZW5jZQotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggYWRkaXRpb24sIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBjaW5kZXggcGx1cywgcGVybWl0dGVkIGFyZ3VtZW50cwotQGNpbmRleCBhcmd1bWVudHMgZm9yIGFkZGl0aW9uCi1AaXRlbSArCi1AZGZue0FkZGl0aW9ufS4gIElmIGVpdGhlciBhcmd1bWVudCBpcyBhYnNvbHV0ZSwgdGhlIHJlc3VsdCBoYXMgdGhlIHNlY3Rpb24gb2YKLXRoZSBvdGhlciBhcmd1bWVudC4gIFlvdSBtYXkgbm90IGFkZCB0b2dldGhlciBhcmd1bWVudHMgZnJvbSBkaWZmZXJlbnQKLXNlY3Rpb25zLgotCi1AY2luZGV4IHN1YnRyYWN0aW9uLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AY2luZGV4IG1pbnVzLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AY2luZGV4IGFyZ3VtZW50cyBmb3Igc3VidHJhY3Rpb24KLUBpdGVtIC0KLUBkZm57U3VidHJhY3Rpb259LiAgSWYgdGhlIHJpZ2h0IGFyZ3VtZW50IGlzIGFic29sdXRlLCB0aGUKLXJlc3VsdCBoYXMgdGhlIHNlY3Rpb24gb2YgdGhlIGxlZnQgYXJndW1lbnQuCi1JZiBib3RoIGFyZ3VtZW50cyBhcmUgaW4gdGhlIHNhbWUgc2VjdGlvbiwgdGhlIHJlc3VsdCBpcyBhYnNvbHV0ZS4KLVlvdSBtYXkgbm90IHN1YnRyYWN0IGFyZ3VtZW50cyBmcm9tIGRpZmZlcmVudCBzZWN0aW9ucy4KLUBjIEZJWE1FIGlzIHRoZXJlIHN0aWxsIHNvbWV0aGluZyB1c2VmdWwgdG8gc2F5IGFib3V0IHVuZGVmaW5lZCAtIHVuZGVmaW5lZCA/Ci1AZW5kIHRhYmxlCi1AZW5kIGVudW1lcmF0ZQotCi1JbiBzaG9ydCwgaXQncyBvbmx5IG1lYW5pbmdmdWwgdG8gYWRkIG9yIHN1YnRyYWN0IHRoZSBAZW1waHtvZmZzZXRzfSBpbiBhbgotYWRkcmVzczsgeW91IGNhbiBvbmx5IGhhdmUgYSBkZWZpbmVkIHNlY3Rpb24gaW4gb25lIG9mIHRoZSB0d28gYXJndW1lbnRzLgotCi1Abm9kZSBQc2V1ZG8gT3BzCi1AY2hhcHRlciBBc3NlbWJsZXIgRGlyZWN0aXZlcwotCi1AY2luZGV4IGRpcmVjdGl2ZXMsIG1hY2hpbmUgaW5kZXBlbmRlbnQKLUBjaW5kZXggcHNldWRvLW9wcywgbWFjaGluZSBpbmRlcGVuZGVudAotQGNpbmRleCBtYWNoaW5lIGluZGVwZW5kZW50IGRpcmVjdGl2ZXMKLUFsbCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBoYXZlIG5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIHBlcmlvZCAoQHNhbXB7Ln0pLgotVGhlIHJlc3Qgb2YgdGhlIG5hbWUgaXMgbGV0dGVycywgdXN1YWxseSBpbiBsb3dlciBjYXNlLgotCi1UaGlzIGNoYXB0ZXIgZGlzY3Vzc2VzIGRpcmVjdGl2ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlCi10YXJnZXQgbWFjaGluZSBjb25maWd1cmF0aW9uIGZvciB0aGUgQHNje2dudX0gYXNzZW1ibGVyLgotQGlmc2V0IEdFTkVSSUMKLVNvbWUgbWFjaGluZSBjb25maWd1cmF0aW9ucyBwcm92aWRlIGFkZGl0aW9uYWwgZGlyZWN0aXZlcy4KLUB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBtYWNoaW5lLWRpcmVjdGl2ZXMKLUB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSBmb3IgYWRkaXRpb25hbCBkaXJlY3RpdmVzLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBtZW51Ci0qIEFib3J0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5hYm9ydH0KLUBpZnNldCBDT0ZGCi0qIEFCT1JUOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5BQk9SVH0KLUBlbmQgaWZzZXQKLQotKiBBbGlnbjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYWxpZ24gQHZhcnthYnMtZXhwcn0gLCBAdmFye2Ficy1leHByfX0KLSogQXNjaWk6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFzY2lpICJAdmFye3N0cmluZ30ifUBkb3Rze30KLSogQXNjaXo6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFzY2l6ICJAdmFye3N0cmluZ30ifUBkb3Rze30KLSogQmFsaWduOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmJhbGlnbiBAdmFye2Ficy1leHByfSAsIEB2YXJ7YWJzLWV4cHJ9fQotKiBCeXRlOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYnl0ZSBAdmFye2V4cHJlc3Npb25zfX0KLSogQ29tbTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9IH0KLSogRGF0YTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRhdGEgQHZhcntzdWJzZWN0aW9ufX0KLUBpZnNldCBDT0ZGCi0qIERlZjo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5kZWYgQHZhcntuYW1lfX0KLUBlbmQgaWZzZXQKLUBpZnNldCBhb3V0LWJvdXQKLSogRGVzYzo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRlc2MgQHZhcntzeW1ib2x9LCBAdmFye2Ficy1leHByZXNzaW9ufX0KLUBlbmQgaWZzZXQKLUBpZnNldCBDT0ZGCi0qIERpbTo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5kaW19Ci1AZW5kIGlmc2V0Ci0KLSogRG91YmxlOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRvdWJsZSBAdmFye2Zsb251bXN9fQotKiBFamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZWplY3R9Ci0qIEVsc2U6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbHNlfQotKiBFbHNlaWY6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZWxzZWlmfQotKiBFbmQ6OgkJCQlAY29kZXsuZW5kfQotQGlmc2V0IENPRkYKLSogRW5kZWY6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVuZGVmfQotQGVuZCBpZnNldAotCi0qIEVuZGZ1bmM6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbmRmdW5jfQotKiBFbmRpZjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZW5kaWZ9Ci0qIEVxdTo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lcXUgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotKiBFcXVpdjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZXF1aXYgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotKiBFcnI6OgkJCQlAY29kZXsuZXJyfQotKiBFeGl0bTo6CQkJQGNvZGV7LmV4aXRtfQotKiBFeHRlcm46OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZXh0ZXJufQotKiBGYWlsOjoJCQlAY29kZXsuZmFpbH0KLUBpZmNsZWFyIG5vLWZpbGUtZGlyCi0qIEZpbGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5maWxlIEB2YXJ7c3RyaW5nfX0KLUBlbmQgaWZjbGVhcgotCi0qIEZpbGw6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5maWxsIEB2YXJ7cmVwZWF0fSAsIEB2YXJ7c2l6ZX0gLCBAdmFye3ZhbHVlfX0KLSogRmxvYXQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZsb2F0IEB2YXJ7ZmxvbnVtc319Ci0qIEZ1bmM6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5mdW5jfSAgCi0qIEdsb2JhbDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5nbG9iYWwgQHZhcntzeW1ib2x9fSwgQGNvZGV7Lmdsb2JsIEB2YXJ7c3ltYm9sfX0KLSogaHdvcmQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lmh3b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBJZGVudDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuaWRlbnR9Ci0qIElmOjogICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pZiBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259fQotKiBJbmNsdWRlOjogICAgICAgICAgICAgICAgICAgICBAY29kZXsuaW5jbHVkZSAiQHZhcntmaWxlfSJ9Ci0qIEludDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pbnQgQHZhcntleHByZXNzaW9uc319Ci0qIElycDo6CQkJCUBjb2Rley5pcnAgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0qIElycGM6OgkJCUBjb2Rley5pcnBjIEB2YXJ7c3ltYm9sfSxAdmFye3ZhbHVlc319QGRvdHN7fQotKiBMY29tbTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9fQotKiBMZmxhZ3M6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGZsYWdzfQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLSogTGluZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxpbmUgQHZhcntsaW5lLW51bWJlcn19Ci1AZW5kIGlmY2xlYXIKLQotKiBMbjo6ICAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubG4gQHZhcntsaW5lLW51bWJlcn19Ci0qIExpbmtvbmNlOjoJCQlAY29kZXsubGlua29uY2UgW0B2YXJ7dHlwZX1dfQotKiBMaXN0OjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGlzdH0KLSogTG9uZzo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxvbmcgQHZhcntleHByZXNzaW9uc319Ci1AaWdub3JlCi0qIExzeW06OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sc3ltIEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLUBlbmQgaWdub3JlCi0KLSogTWFjcm86OgkJCUBjb2Rley5tYWNybyBAdmFye25hbWV9IEB2YXJ7YXJnc319QGRvdHN7fQotKiBNUkk6OgkJCQlAY29kZXsubXJpIEB2YXJ7dmFsfX0KLQotKiBOb2xpc3Q6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubm9saXN0fQotKiBPY3RhOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsub2N0YSBAdmFye2JpZ251bXN9fQotKiBPcmc6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsub3JnIEB2YXJ7bmV3LWxjfSAsIEB2YXJ7ZmlsbH19Ci0qIFAyYWxpZ246OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5wMmFsaWduIEB2YXJ7YWJzLWV4cHJ9ICwgQHZhcnthYnMtZXhwcn19Ci0qIFByaW50OjoJCQlAY29kZXsucHJpbnQgQHZhcntzdHJpbmd9fQotKiBQc2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsucHNpemUgQHZhcntsaW5lc30sIEB2YXJ7Y29sdW1uc319Ci0qIFB1cmdlbTo6CQkJQGNvZGV7LnB1cmdlbSBAdmFye25hbWV9fQotKiBRdWFkOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsucXVhZCBAdmFye2JpZ251bXN9fQotKiBSZXB0OjoJCQlAY29kZXsucmVwdCBAdmFye2NvdW50fX0KLSogU2J0dGw6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNidHRsICJAdmFye3N1YmhlYWRpbmd9In0KLUBpZnNldCBDT0ZGCi0qIFNjbDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zY2wgQHZhcntjbGFzc319Ci0qIFNlY3Rpb246OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zZWN0aW9uIEB2YXJ7bmFtZX0sIEB2YXJ7c3Vic2VjdGlvbn19Ci1AZW5kIGlmc2V0Ci0KLSogU2V0OjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNldCBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0qIFNob3J0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zaG9ydCBAdmFye2V4cHJlc3Npb25zfX0KLSogU2luZ2xlOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNpbmdsZSBAdmFye2Zsb251bXN9fQotQGlmc2V0IENPRkYKLSogU2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNpemV9Ci1AZW5kIGlmc2V0Ci0KLSogU2tpcDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNraXAgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci0qIFNsZWIxMjg6OgkJCUBjb2Rley5zbGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBTcGFjZTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3BhY2UgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci1AaWZzZXQgaGF2ZS1zdGFicwotKiBTdGFiOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3RhYmQsIC5zdGFibiwgLnN0YWJzfQotQGVuZCBpZnNldAotCi0qIFN0cmluZzo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zdHJpbmcgIkB2YXJ7c3RyfSJ9Ci0qIFN0cnVjdDo6CQkJQGNvZGV7LnN0cnVjdCBAdmFye2V4cHJlc3Npb259fQotQGlmc2V0IEVMRgotKiBTeW12ZXI6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3ltdmVyIEB2YXJ7bmFtZX0sQHZhcntuYW1lMkBAbm9kZW5hbWV9fQotQGVuZCBpZnNldAotQGlmc2V0IENPRkYKLSogVGFnOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnRhZyBAdmFye3N0cnVjdG5hbWV9fQotQGVuZCBpZnNldAotCi0qIFRleHQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50ZXh0IEB2YXJ7c3Vic2VjdGlvbn19Ci0qIFRpdGxlOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50aXRsZSAiQHZhcntoZWFkaW5nfSJ9Ci1AaWZzZXQgQ09GRgotKiBUeXBlOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsudHlwZSBAdmFye2ludH19Ci0qIFZhbDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley52YWwgQHZhcnthZGRyfX0KLUBlbmQgaWZzZXQKLUBpZnNldCBFTEYKLSogVmlzaWJpbGl0eTo6ICAgICAgICAgICAgICAgICAgQGNvZGV7LmludGVybmFsIEB2YXJ7bmFtZX0sIC5oaWRkZW4gQHZhcntuYW1lfSwgLnByb3RlY3RlZCBAdmFye25hbWV9fQotQGVuZCBpZnNldAotCi0qIFVsZWIxMjg6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley51bGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBXb3JkOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsud29yZCBAdmFye2V4cHJlc3Npb25zfX0KLSogRGVwcmVjYXRlZDo6ICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZCBEaXJlY3RpdmVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQWJvcnQKLUBzZWN0aW9uIEBjb2Rley5hYm9ydH0KLQotQGNpbmRleCBAY29kZXthYm9ydH0gZGlyZWN0aXZlCi1AY2luZGV4IHN0b3BwaW5nIHRoZSBhc3NlbWJseQotVGhpcyBkaXJlY3RpdmUgc3RvcHMgdGhlIGFzc2VtYmx5IGltbWVkaWF0ZWx5LiAgSXQgaXMgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXNzZW1ibGVycy4gIFRoZSBvcmlnaW5hbCBpZGVhIHdhcyB0aGF0IHRoZQotYXNzZW1ibHkgbGFuZ3VhZ2Ugc291cmNlIHdvdWxkIGJlIHBpcGVkIGludG8gdGhlIGFzc2VtYmxlci4gIElmIHRoZSBzZW5kZXIKLW9mIHRoZSBzb3VyY2UgcXVpdCwgaXQgY291bGQgdXNlIHRoaXMgZGlyZWN0aXZlIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvCi1xdWl0IGFsc28uICBPbmUgZGF5IEBjb2Rley5hYm9ydH0gd2lsbCBub3QgYmUgc3VwcG9ydGVkLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgQUJPUlQKLUBzZWN0aW9uIEBjb2Rley5BQk9SVH0KLQotQGNpbmRleCBAY29kZXtBQk9SVH0gZGlyZWN0aXZlCi1XaGVuIHByb2R1Y2luZyBDT0ZGIG91dHB1dCwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBhcyBhCi1zeW5vbnltIGZvciBAc2FtcHsuYWJvcnR9LgotCi1AaWZzZXQgQk9VVAotV2hlbiBwcm9kdWNpbmcgQGNvZGV7Yi5vdXR9IG91dHB1dCwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSwKLWJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBBbGlnbgotQHNlY3Rpb24gQGNvZGV7LmFsaWduIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn19Ci0KLUBjaW5kZXggcGFkZGluZyB0aGUgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBAY29kZXthbGlnbn0gZGlyZWN0aXZlCi1QYWQgdGhlIGxvY2F0aW9uIGNvdW50ZXIgKGluIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIHRvIGEgcGFydGljdWxhciBzdG9yYWdlCi1ib3VuZGFyeS4gIFRoZSBmaXJzdCBleHByZXNzaW9uICh3aGljaCBtdXN0IGJlIGFic29sdXRlKSBpcyB0aGUgYWxpZ25tZW50Ci1yZXF1aXJlZCwgYXMgZGVzY3JpYmVkIGJlbG93LgotCi1UaGUgc2Vjb25kIGV4cHJlc3Npb24gKGFsc28gYWJzb2x1dGUpIGdpdmVzIHRoZSBmaWxsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUKLXBhZGRpbmcgYnl0ZXMuICBJdCAoYW5kIHRoZSBjb21tYSkgbWF5IGJlIG9taXR0ZWQuICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUKLXBhZGRpbmcgYnl0ZXMgYXJlIG5vcm1hbGx5IHplcm8uICBIb3dldmVyLCBvbiBzb21lIHN5c3RlbXMsIGlmIHRoZSBzZWN0aW9uIGlzCi1tYXJrZWQgYXMgY29udGFpbmluZyBjb2RlIGFuZCB0aGUgZmlsbCB2YWx1ZSBpcyBvbWl0dGVkLCB0aGUgc3BhY2UgaXMgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucy4KLQotVGhlIHRoaXJkIGV4cHJlc3Npb24gaXMgYWxzbyBhYnNvbHV0ZSwgYW5kIGlzIGFsc28gb3B0aW9uYWwuICBJZiBpdCBpcyBwcmVzZW50LAotaXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgYnkgdGhpcyBhbGlnbm1lbnQKLWRpcmVjdGl2ZS4gIElmIGRvaW5nIHRoZSBhbGlnbm1lbnQgd291bGQgcmVxdWlyZSBza2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gdGhlCi1zcGVjaWZpZWQgbWF4aW11bSwgdGhlbiB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4gIFlvdSBjYW4gb21pdCB0aGUKLWZpbGwgdmFsdWUgKHRoZSBzZWNvbmQgYXJndW1lbnQpIGVudGlyZWx5IGJ5IHNpbXBseSB1c2luZyB0d28gY29tbWFzIGFmdGVyIHRoZQotcmVxdWlyZWQgYWxpZ25tZW50OyB0aGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGFsaWdubWVudCB0byBiZSBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZW4gYXBwcm9wcmlhdGUuCi0KLVRoZSB3YXkgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBpcyBzcGVjaWZpZWQgdmFyaWVzIGZyb20gc3lzdGVtIHRvIHN5c3RlbS4KLUZvciB0aGUgYTI5aywgaHBwYSwgbTY4aywgbTg4aywgdzY1LCBzcGFyYywgYW5kIEhpdGFjaGkgU0gsIGFuZCBpMzg2IHVzaW5nIEVMRgotZm9ybWF0LAotdGhlIGZpcnN0IGV4cHJlc3Npb24gaXMgdGhlCi1hbGlnbm1lbnQgcmVxdWVzdCBpbiBieXRlcy4gIEZvciBleGFtcGxlIEBzYW1wey5hbGlnbiA4fSBhZHZhbmNlcwotdGhlIGxvY2F0aW9uIGNvdW50ZXIgdW50aWwgaXQgaXMgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIKLWlzIGFscmVhZHkgYSBtdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgotCi1Gb3Igb3RoZXIgc3lzdGVtcywgaW5jbHVkaW5nIHRoZSBpMzg2IHVzaW5nIGEub3V0IGZvcm1hdCwgaXQgaXMgdGhlCi1udW1iZXIgb2YgbG93LW9yZGVyIHplcm8gYml0cyB0aGUgbG9jYXRpb24gY291bnRlciBtdXN0IGhhdmUgYWZ0ZXIKLWFkdmFuY2VtZW50LiAgRm9yIGV4YW1wbGUgQHNhbXB7LmFsaWduIDN9IGFkdmFuY2VzIHRoZSBsb2NhdGlvbgotY291bnRlciB1bnRpbCBpdCBhIG11bHRpcGxlIG9mIDguICBJZiB0aGUgbG9jYXRpb24gY291bnRlciBpcyBhbHJlYWR5IGEKLW11bHRpcGxlIG9mIDgsIG5vIGNoYW5nZSBpcyBuZWVkZWQuCi0KLVRoaXMgaW5jb25zaXN0ZW5jeSBpcyBkdWUgdG8gdGhlIGRpZmZlcmVudCBiZWhhdmlvcnMgb2YgdGhlIHZhcmlvdXMKLW5hdGl2ZSBhc3NlbWJsZXJzIGZvciB0aGVzZSBzeXN0ZW1zIHdoaWNoIEdBUyBtdXN0IGVtdWxhdGUuCi1HQVMgYWxzbyBwcm92aWRlcyBAY29kZXsuYmFsaWdufSBhbmQgQGNvZGV7LnAyYWxpZ259IGRpcmVjdGl2ZXMsCi1kZXNjcmliZWQgbGF0ZXIsIHdoaWNoIGhhdmUgYSBjb25zaXN0ZW50IGJlaGF2aW9yIGFjcm9zcyBhbGwKLWFyY2hpdGVjdHVyZXMgKGJ1dCBhcmUgc3BlY2lmaWMgdG8gR0FTKS4KLQotQG5vZGUgQXNjaWkKLUBzZWN0aW9uIEBjb2Rley5hc2NpaSAiQHZhcntzdHJpbmd9In1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7YXNjaWl9IGRpcmVjdGl2ZQotQGNpbmRleCBzdHJpbmcgbGl0ZXJhbHMKLUBjb2Rley5hc2NpaX0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgc3RyaW5nIGxpdGVyYWxzIChAcHhyZWZ7U3RyaW5nc30pCi1zZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQgYXNzZW1ibGVzIGVhY2ggc3RyaW5nICh3aXRoIG5vIGF1dG9tYXRpYwotdHJhaWxpbmcgemVybyBieXRlKSBpbnRvIGNvbnNlY3V0aXZlIGFkZHJlc3Nlcy4KLQotQG5vZGUgQXNjaXoKLUBzZWN0aW9uIEBjb2Rley5hc2NpeiAiQHZhcntzdHJpbmd9In1AZG90c3t9Ci0KLUBjaW5kZXggQGNvZGV7YXNjaXp9IGRpcmVjdGl2ZQotQGNpbmRleCB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5ncwotQGNpbmRleCBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncwotQGNvZGV7LmFzY2l6fSBpcyBqdXN0IGxpa2UgQGNvZGV7LmFzY2lpfSwgYnV0IGVhY2ggc3RyaW5nIGlzIGZvbGxvd2VkIGJ5Ci1hIHplcm8gYnl0ZS4gIFRoZSBgYHonJyBpbiBAc2FtcHsuYXNjaXp9IHN0YW5kcyBmb3IgYGB6ZXJvJycuCi0KLUBub2RlIEJhbGlnbgotQHNlY3Rpb24gQGNvZGV7LmJhbGlnblt3bF0gQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfX0KLQotQGNpbmRleCBwYWRkaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGdpdmVuIG51bWJlciBvZiBieXRlcwotQGNpbmRleCBAY29kZXtiYWxpZ259IGRpcmVjdGl2ZQotUGFkIHRoZSBsb2NhdGlvbiBjb3VudGVyIChpbiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSB0byBhIHBhcnRpY3VsYXIKLXN0b3JhZ2UgYm91bmRhcnkuICBUaGUgZmlyc3QgZXhwcmVzc2lvbiAod2hpY2ggbXVzdCBiZSBhYnNvbHV0ZSkgaXMgdGhlCi1hbGlnbm1lbnQgcmVxdWVzdCBpbiBieXRlcy4gIEZvciBleGFtcGxlIEBzYW1wey5iYWxpZ24gOH0gYWR2YW5jZXMKLXRoZSBsb2NhdGlvbiBjb3VudGVyIHVudGlsIGl0IGlzIGEgbXVsdGlwbGUgb2YgOC4gIElmIHRoZSBsb2NhdGlvbiBjb3VudGVyCi1pcyBhbHJlYWR5IGEgbXVsdGlwbGUgb2YgOCwgbm8gY2hhbmdlIGlzIG5lZWRlZC4KLQotVGhlIHNlY29uZCBleHByZXNzaW9uIChhbHNvIGFic29sdXRlKSBnaXZlcyB0aGUgZmlsbCB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1wYWRkaW5nIGJ5dGVzLiAgSXQgKGFuZCB0aGUgY29tbWEpIG1heSBiZSBvbWl0dGVkLiAgSWYgaXQgaXMgb21pdHRlZCwgdGhlCi1wYWRkaW5nIGJ5dGVzIGFyZSBub3JtYWxseSB6ZXJvLiAgSG93ZXZlciwgb24gc29tZSBzeXN0ZW1zLCBpZiB0aGUgc2VjdGlvbiBpcwotbWFya2VkIGFzIGNvbnRhaW5pbmcgY29kZSBhbmQgdGhlIGZpbGwgdmFsdWUgaXMgb21pdHRlZCwgdGhlIHNwYWNlIGlzIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMuCi0KLVRoZSB0aGlyZCBleHByZXNzaW9uIGlzIGFsc28gYWJzb2x1dGUsIGFuZCBpcyBhbHNvIG9wdGlvbmFsLiAgSWYgaXQgaXMgcHJlc2VudCwKLWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJ5IHRoaXMgYWxpZ25tZW50Ci1kaXJlY3RpdmUuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIHRoZQotc3BlY2lmaWVkIG1heGltdW0sIHRoZW4gdGhlIGFsaWdubWVudCBpcyBub3QgZG9uZSBhdCBhbGwuICBZb3UgY2FuIG9taXQgdGhlCi1maWxsIHZhbHVlICh0aGUgc2Vjb25kIGFyZ3VtZW50KSBlbnRpcmVseSBieSBzaW1wbHkgdXNpbmcgdHdvIGNvbW1hcyBhZnRlciB0aGUKLXJlcXVpcmVkIGFsaWdubWVudDsgdGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBhbGlnbm1lbnQgdG8gYmUgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlLgotCi1AY2luZGV4IEBjb2Rle2JhbGlnbnd9IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtiYWxpZ25sfSBkaXJlY3RpdmUKLVRoZSBAY29kZXsuYmFsaWdud30gYW5kIEBjb2Rley5iYWxpZ25sfSBkaXJlY3RpdmVzIGFyZSB2YXJpYW50cyBvZiB0aGUKLUBjb2Rley5iYWxpZ259IGRpcmVjdGl2ZS4gIFRoZSBAY29kZXsuYmFsaWdud30gZGlyZWN0aXZlIHRyZWF0cyB0aGUgZmlsbAotcGF0dGVybiBhcyBhIHR3byBieXRlIHdvcmQgdmFsdWUuICBUaGUgQGNvZGV7LmJhbGlnbmx9IGRpcmVjdGl2ZXMgdHJlYXRzIHRoZQotZmlsbCBwYXR0ZXJuIGFzIGEgZm91ciBieXRlIGxvbmd3b3JkIHZhbHVlLiAgRm9yIGV4YW1wbGUsIEBjb2Rley5iYWxpZ253Ci00LDB4MzY4ZH0gd2lsbCBhbGlnbiB0byBhIG11bHRpcGxlIG9mIDQuICBJZiBpdCBza2lwcyB0d28gYnl0ZXMsIHRoZXkgd2lsbCBiZQotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIDB4MzY4ZCAodGhlIGV4YWN0IHBsYWNlbWVudCBvZiB0aGUgYnl0ZXMgZGVwZW5kcyB1cG9uCi10aGUgZW5kaWFubmVzcyBvZiB0aGUgcHJvY2Vzc29yKS4gIElmIGl0IHNraXBzIDEgb3IgMyBieXRlcywgdGhlIGZpbGwgdmFsdWUgaXMKLXVuZGVmaW5lZC4KLQotQG5vZGUgQnl0ZQotQHNlY3Rpb24gQGNvZGV7LmJ5dGUgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7Ynl0ZX0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXJzLCBvbmUgYnl0ZQotQGNvZGV7LmJ5dGV9IGV4cGVjdHMgemVybyBvciBtb3JlIGV4cHJlc3Npb25zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgotRWFjaCBleHByZXNzaW9uIGlzIGFzc2VtYmxlZCBpbnRvIHRoZSBuZXh0IGJ5dGUuCi0KLUBub2RlIENvbW0KLUBzZWN0aW9uIEBjb2Rley5jb21tIEB2YXJ7c3ltYm9sfSAsIEB2YXJ7bGVuZ3RofSB9Ci0KLUBjaW5kZXggQGNvZGV7Y29tbX0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCwgY29tbW9uCi1AY29kZXsuY29tbX0gZGVjbGFyZXMgYSBjb21tb24gc3ltYm9sIG5hbWVkIEB2YXJ7c3ltYm9sfS4gIFdoZW4gbGlua2luZywgYQotY29tbW9uIHN5bWJvbCBpbiBvbmUgb2JqZWN0IGZpbGUgbWF5IGJlIG1lcmdlZCB3aXRoIGEgZGVmaW5lZCBvciBjb21tb24gc3ltYm9sCi1vZiB0aGUgc2FtZSBuYW1lIGluIGFub3RoZXIgb2JqZWN0IGZpbGUuICBJZiBAY29kZXtAdmFsdWV7TER9fSBkb2VzIG5vdCBzZWUgYQotZGVmaW5pdGlvbiBmb3IgdGhlIHN5bWJvbC0tanVzdCBvbmUgb3IgbW9yZSBjb21tb24gc3ltYm9scy0tdGhlbiBpdCB3aWxsCi1hbGxvY2F0ZSBAdmFye2xlbmd0aH0gYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuICBAdmFye2xlbmd0aH0gbXVzdCBiZSBhbgotYWJzb2x1dGUgZXhwcmVzc2lvbi4gIElmIEBjb2Rle0B2YWx1ZXtMRH19IHNlZXMgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgd2l0aAotdGhlIHNhbWUgbmFtZSwgYW5kIHRoZXkgZG8gbm90IGFsbCBoYXZlIHRoZSBzYW1lIHNpemUsIGl0IHdpbGwgYWxsb2NhdGUgc3BhY2UKLXVzaW5nIHRoZSBsYXJnZXN0IHNpemUuCi0KLUBpZnNldCBFTEYKLVdoZW4gdXNpbmcgRUxGLCB0aGUgQGNvZGV7LmNvbW19IGRpcmVjdGl2ZSB0YWtlcyBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudC4KLVRoaXMgaXMgdGhlIGRlc2lyZWQgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wsIHNwZWNpZmllZCBhcyBhIGJ5dGUgYm91bmRhcnkgKGZvcgotZXhhbXBsZSwgYW4gYWxpZ25tZW50IG9mIDE2IG1lYW5zIHRoYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IDQgYml0cyBvZiB0aGUKLWFkZHJlc3Mgc2hvdWxkIGJlIHplcm8pLiAgVGhlIGFsaWdubWVudCBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24sIGFuZCBpdAotbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gIElmIEBjb2Rle0B2YWx1ZXtMRH19IGFsbG9jYXRlcyB1bmluaXRpYWxpemVkIG1lbW9yeQotZm9yIHRoZSBjb21tb24gc3ltYm9sLCBpdCB3aWxsIHVzZSB0aGUgYWxpZ25tZW50IHdoZW4gcGxhY2luZyB0aGUgc3ltYm9sLiAgSWYKLW5vIGFsaWdubWVudCBpcyBzcGVjaWZpZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgc2V0IHRoZSBhbGlnbm1lbnQgdG8gdGhlCi1sYXJnZXN0IHBvd2VyIG9mIHR3byBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHN5bWJvbCwgdXAgdG8gYQotbWF4aW11bSBvZiAxNi4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rley5jb21tfSBkaWZmZXJzIHNsaWdodGx5IG9uIHRoZSBIUFBBLiAgVGhlIHN5bnRheCBpcwotQHNhbXB7QHZhcntzeW1ib2x9IC5jb21tLCBAdmFye2xlbmd0aH19OyBAdmFye3N5bWJvbH0gaXMgb3B0aW9uYWwuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIERhdGEKLUBzZWN0aW9uIEBjb2Rley5kYXRhIEB2YXJ7c3Vic2VjdGlvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZGF0YX0gZGlyZWN0aXZlCi1AY29kZXsuZGF0YX0gdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIG9udG8gdGhlCi1lbmQgb2YgdGhlIGRhdGEgc3Vic2VjdGlvbiBudW1iZXJlZCBAdmFye3N1YnNlY3Rpb259ICh3aGljaCBpcyBhbgotYWJzb2x1dGUgZXhwcmVzc2lvbikuICBJZiBAdmFye3N1YnNlY3Rpb259IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzCi10byB6ZXJvLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgRGVmCi1Ac2VjdGlvbiBAY29kZXsuZGVmIEB2YXJ7bmFtZX19Ci0KLUBjaW5kZXggQGNvZGV7ZGVmfSBkaXJlY3RpdmUKLUBjaW5kZXggQ09GRiBzeW1ib2xzLCBkZWJ1Z2dpbmcKLUBjaW5kZXggZGVidWdnaW5nIENPRkYgc3ltYm9scwotQmVnaW4gZGVmaW5pbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbCBAdmFye25hbWV9OyB0aGUKLWRlZmluaXRpb24gZXh0ZW5kcyB1bnRpbCB0aGUgQGNvZGV7LmVuZGVmfSBkaXJlY3RpdmUgaXMgZW5jb3VudGVyZWQuCi1AaWZzZXQgQk9VVAotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IG9ic2VydmVkIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgQ09GRgotZm9ybWF0IG91dHB1dDsgd2hlbiBwcm9kdWNpbmcgQGNvZGV7Yi5vdXR9LCBAc2FtcHsuZGVmfSBpcyByZWNvZ25pemVkLAotYnV0IGlnbm9yZWQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBpZnNldCBhb3V0LWJvdXQKLUBub2RlIERlc2MKLUBzZWN0aW9uIEBjb2Rley5kZXNjIEB2YXJ7c3ltYm9sfSwgQHZhcnthYnMtZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZGVzY30gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgc3ltYm9sIGRlc2NyaXB0b3IKLUBjaW5kZXggc3ltYm9sIGRlc2NyaXB0b3IsIENPRkYKLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHN5bWJvbCAoQHB4cmVme1N5bWJvbCBBdHRyaWJ1dGVzfSkKLXRvIHRoZSBsb3cgMTYgYml0cyBvZiBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLgotCi1AaWZzZXQgQ09GRgotVGhlIEBzYW1wey5kZXNjfSBkaXJlY3RpdmUgaXMgbm90IGF2YWlsYWJsZSB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzCi1jb25maWd1cmVkIGZvciBDT0ZGIG91dHB1dDsgaXQgaXMgb25seSBmb3IgQGNvZGV7YS5vdXR9IG9yIEBjb2Rle2Iub3V0fQotb2JqZWN0IGZvcm1hdC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXRpYmlsaXR5LCBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzCi1pdCwgYnV0IHByb2R1Y2VzIG5vIG91dHB1dCwgd2hlbiBjb25maWd1cmVkIGZvciBDT0ZGLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgRGltCi1Ac2VjdGlvbiBAY29kZXsuZGltfQotCi1AY2luZGV4IEBjb2Rle2RpbX0gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgYXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbgotQGNpbmRleCBhdXhpbGlhcnkgc3ltYm9sIGluZm9ybWF0aW9uLCBDT0ZGCi1UaGlzIGRpcmVjdGl2ZSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzIHRvIGluY2x1ZGUgYXV4aWxpYXJ5IGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGlzIG9ubHkgcGVybWl0dGVkIGluc2lkZQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycy4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey5kaW19IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBnZW5lcmF0aW5nIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQKLWlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIERvdWJsZQotQHNlY3Rpb24gQGNvZGV7LmRvdWJsZSBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKGRvdWJsZSkKLUBjb2Rley5kb3VibGV9IGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBJdAotYXNzZW1ibGVzIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSBAc2FtcHsuZG91YmxlfSBlbWl0cyA2NC1iaXQgZmxvYXRpbmctcG9pbnQgbnVtYmVycwotaW4gQHNje2llZWV9IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBFamVjdAotQHNlY3Rpb24gQGNvZGV7LmVqZWN0fQotCi1AY2luZGV4IEBjb2Rle2VqZWN0fSBkaXJlY3RpdmUKLUBjaW5kZXggbmV3IHBhZ2UsIGluIGxpc3RpbmdzCi1AY2luZGV4IHBhZ2UsIGluIGxpc3RpbmdzCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogbmV3IHBhZ2UKLUZvcmNlIGEgcGFnZSBicmVhayBhdCB0aGlzIHBvaW50LCB3aGVuIGdlbmVyYXRpbmcgYXNzZW1ibHkgbGlzdGluZ3MuCi0KLUBub2RlIEVsc2UKLUBzZWN0aW9uIEBjb2Rley5lbHNlfQotCi1AY2luZGV4IEBjb2Rle2Vsc2V9IGRpcmVjdGl2ZQotQGNvZGV7LmVsc2V9IGlzIHBhcnQgb2YgdGhlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgZm9yIGNvbmRpdGlvbmFsCi1hc3NlbWJseTsgQHB4cmVme0lmLCxAY29kZXsuaWZ9fS4gIEl0IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZWN0aW9uCi1vZiBjb2RlIHRvIGJlIGFzc2VtYmxlZCBpZiB0aGUgY29uZGl0aW9uIGZvciB0aGUgcHJlY2VkaW5nIEBjb2Rley5pZn0KLXdhcyBmYWxzZS4KLQotQG5vZGUgRWxzZWlmCi1Ac2VjdGlvbiBAY29kZXsuZWxzZWlmfQotCi1AY2luZGV4IEBjb2Rle2Vsc2VpZn0gZGlyZWN0aXZlCi1AY29kZXsuZWxzZWlmfSBpcyBwYXJ0IG9mIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0IGZvciBjb25kaXRpb25hbAotYXNzZW1ibHk7IEBweHJlZntJZiwsQGNvZGV7LmlmfX0uICBJdCBpcyBzaG9ydGhhbmQgZm9yIGJlZ2lubmluZyBhIG5ldwotQGNvZGV7LmlmfSBibG9jayB0aGF0IHdvdWxkIG90aGVyd2lzZSBmaWxsIHRoZSBlbnRpcmUgQGNvZGV7LmVsc2V9IHNlY3Rpb24uCi0KLUBub2RlIEVuZAotQHNlY3Rpb24gQGNvZGV7LmVuZH0KLQotQGNpbmRleCBAY29kZXtlbmR9IGRpcmVjdGl2ZQotQGNvZGV7LmVuZH0gbWFya3MgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkgZmlsZS4gIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90Ci1wcm9jZXNzIGFueXRoaW5nIGluIHRoZSBmaWxlIHBhc3QgdGhlIEBjb2Rley5lbmR9IGRpcmVjdGl2ZS4KLQotQGlmc2V0IENPRkYKLUBub2RlIEVuZGVmCi1Ac2VjdGlvbiBAY29kZXsuZW5kZWZ9Ci0KLUBjaW5kZXggQGNvZGV7ZW5kZWZ9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgZmxhZ3MgdGhlIGVuZCBvZiBhIHN5bWJvbCBkZWZpbml0aW9uIGJlZ3VuIHdpdGgKLUBjb2Rley5kZWZ9LgotQGlmc2V0IEJPVVQKLQotQHNhbXB7LmVuZGVmfSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBnZW5lcmF0aW5nIENPRkYgZm9ybWF0IG91dHB1dDsgaWYKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMKLWRpcmVjdGl2ZSBidXQgaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgRW5kZnVuYwotQHNlY3Rpb24gQGNvZGV7LmVuZGZ1bmN9Ci1AY2luZGV4IEBjb2Rle2VuZGZ1bmN9IGRpcmVjdGl2ZQotQGNvZGV7LmVuZGZ1bmN9IG1hcmtzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBzcGVjaWZpZWQgd2l0aCBAY29kZXsuZnVuY30uCi0KLUBub2RlIEVuZGlmCi1Ac2VjdGlvbiBAY29kZXsuZW5kaWZ9Ci0KLUBjaW5kZXggQGNvZGV7ZW5kaWZ9IGRpcmVjdGl2ZQotQGNvZGV7LmVuZGlmfSBpcyBwYXJ0IG9mIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0IGZvciBjb25kaXRpb25hbCBhc3NlbWJseTsKLWl0IG1hcmtzIHRoZSBlbmQgb2YgYSBibG9jayBvZiBjb2RlIHRoYXQgaXMgb25seSBhc3NlbWJsZWQKLWNvbmRpdGlvbmFsbHkuICBAeHJlZntJZiwsQGNvZGV7LmlmfX0uCi0KLUBub2RlIEVxdQotQHNlY3Rpb24gQGNvZGV7LmVxdSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZXF1fSBkaXJlY3RpdmUKLUBjaW5kZXggYXNzaWduaW5nIHZhbHVlcyB0byBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGFzc2lnbmluZyB2YWx1ZXMgdG8KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIHZhbHVlIG9mIEB2YXJ7c3ltYm9sfSB0byBAdmFye2V4cHJlc3Npb259LgotSXQgaXMgc3lub255bW91cyB3aXRoIEBzYW1wey5zZXR9OyBAcHhyZWZ7U2V0LCxAY29kZXsuc2V0fX0uCi0KLUBpZnNldCBIUFBBCi1UaGUgc3ludGF4IGZvciBAY29kZXtlcXV9IG9uIHRoZSBIUFBBIGlzIAotQHNhbXB7QHZhcntzeW1ib2x9IC5lcXUgQHZhcntleHByZXNzaW9ufX0uCi1AZW5kIGlmc2V0Ci0KLUBub2RlIEVxdWl2Ci1Ac2VjdGlvbiBAY29kZXsuZXF1aXYgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotQGNpbmRleCBAY29kZXtlcXVpdn0gZGlyZWN0aXZlCi1UaGUgQGNvZGV7LmVxdWl2fSBkaXJlY3RpdmUgaXMgbGlrZSBAY29kZXsuZXF1fSBhbmQgQGNvZGV7LnNldH0sIGV4Y2VwdCB0aGF0Ci10aGUgYXNzZW1ibGVyIHdpbGwgc2lnbmFsIGFuIGVycm9yIGlmIEB2YXJ7c3ltYm9sfSBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLUV4Y2VwdCBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBlcnJvciBtZXNzYWdlLCB0aGlzIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byAKLUBzbWFsbGV4YW1wbGUKLS5pZmRlZiBTWU0KLS5lcnIKLS5lbmRpZgotLmVxdSBTWU0sVkFMCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBFcnIKLUBzZWN0aW9uIEBjb2Rley5lcnJ9Ci1AY2luZGV4IEBjb2Rle2Vycn0gZGlyZWN0aXZlCi1JZiBAY29kZXtAdmFsdWV7QVN9fSBhc3NlbWJsZXMgYSBAY29kZXsuZXJyfSBkaXJlY3RpdmUsIGl0IHdpbGwgcHJpbnQgYW4gZXJyb3IKLW1lc3NhZ2UgYW5kLCB1bmxlc3MgdGhlIEBjb2Rley1afSBvcHRpb24gd2FzIHVzZWQsIGl0IHdpbGwgbm90IGdlbmVyYXRlIGFuCi1vYmplY3QgZmlsZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2lnbmFsIGVycm9yIGFuIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgY29kZS4KLQotQG5vZGUgRXhpdG0KLUBzZWN0aW9uIEBjb2Rley5leGl0bX0KLUV4aXQgZWFybHkgZnJvbSB0aGUgY3VycmVudCBtYWNybyBkZWZpbml0aW9uLiAgQHhyZWZ7TWFjcm99LgotCi1Abm9kZSBFeHRlcm4KLUBzZWN0aW9uIEBjb2Rley5leHRlcm59Ci0KLUBjaW5kZXggQGNvZGV7ZXh0ZXJufSBkaXJlY3RpdmUKLUBjb2Rley5leHRlcm59IGlzIGFjY2VwdGVkIGluIHRoZSBzb3VyY2UgcHJvZ3JhbS0tLWZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGFzc2VtYmxlcnMtLS1idXQgaXQgaXMgaWdub3JlZC4gIEBjb2Rle0B2YWx1ZXtBU319IHRyZWF0cwotYWxsIHVuZGVmaW5lZCBzeW1ib2xzIGFzIGV4dGVybmFsLgotCi1Abm9kZSBGYWlsCi1Ac2VjdGlvbiBAY29kZXsuZmFpbCBAdmFye2V4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle2ZhaWx9IGRpcmVjdGl2ZQotR2VuZXJhdGVzIGFuIGVycm9yIG9yIGEgd2FybmluZy4gIElmIHRoZSB2YWx1ZSBvZiB0aGUgQHZhcntleHByZXNzaW9ufSBpcyA1MDAKLW9yIG1vcmUsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgcHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UuICBJZiB0aGUgdmFsdWUgaXMgbGVzcwotdGhhbiA1MDAsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIFRoZSBtZXNzYWdlIHdpbGwKLWluY2x1ZGUgdGhlIHZhbHVlIG9mIEB2YXJ7ZXhwcmVzc2lvbn0uICBUaGlzIGNhbiBvY2Nhc2lvbmFsbHkgYmUgdXNlZnVsIGluc2lkZQotY29tcGxleCBuZXN0ZWQgbWFjcm9zIG9yIGNvbmRpdGlvbmFsIGFzc2VtYmx5LgotCi1AaWZjbGVhciBuby1maWxlLWRpcgotQG5vZGUgRmlsZQotQHNlY3Rpb24gQGNvZGV7LmZpbGUgQHZhcntzdHJpbmd9fQotCi1AY2luZGV4IEBjb2Rle2ZpbGV9IGRpcmVjdGl2ZQotQGNpbmRleCBsb2dpY2FsIGZpbGUgbmFtZQotQGNpbmRleCBmaWxlIG5hbWUsIGxvZ2ljYWwKLUBjb2Rley5maWxlfSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0aGF0IHdlIGFyZSBhYm91dCB0byBzdGFydCBhIG5ldyBsb2dpY2FsCi1maWxlLiAgQHZhcntzdHJpbmd9IGlzIHRoZSBuZXcgZmlsZSBuYW1lLiAgSW4gZ2VuZXJhbCwgdGhlIGZpbGVuYW1lIGlzCi1yZWNvZ25pemVkIHdoZXRoZXIgb3Igbm90IGl0IGlzIHN1cnJvdW5kZWQgYnkgcXVvdGVzIEBzYW1weyJ9OyBidXQgaWYgeW91IHdpc2gKLXRvIHNwZWNpZnkgYW4gZW1wdHkgZmlsZSBuYW1lLCB5b3UgbXVzdCBnaXZlIHRoZSBxdW90ZXMtLUBjb2RleyIifS4gIFRoaXMKLXN0YXRlbWVudCBtYXkgZ28gYXdheSBpbiBmdXR1cmU6IGl0IGlzIG9ubHkgcmVjb2duaXplZCB0byBiZSBjb21wYXRpYmxlIHdpdGgKLW9sZCBAY29kZXtAdmFsdWV7QVN9fSBwcm9ncmFtcy4KLUBpZnNldCBBMjlLCi1JbiBzb21lIGNvbmZpZ3VyYXRpb25zIG9mIEBjb2Rle0B2YWx1ZXtBU319LCBAY29kZXsuZmlsZX0gaGFzIGFscmVhZHkgYmVlbgotcmVtb3ZlZCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlciBhc3NlbWJsZXJzLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIEZpbGwKLUBzZWN0aW9uIEBjb2Rley5maWxsIEB2YXJ7cmVwZWF0fSAsIEB2YXJ7c2l6ZX0gLCBAdmFye3ZhbHVlfX0KLQotQGNpbmRleCBAY29kZXtmaWxsfSBkaXJlY3RpdmUKLUBjaW5kZXggd3JpdGluZyBwYXR0ZXJucyBpbiBtZW1vcnkKLUBjaW5kZXggcGF0dGVybnMsIHdyaXRpbmcgaW4gbWVtb3J5Ci1AdmFye3Jlc3VsdH0sIEB2YXJ7c2l6ZX0gYW5kIEB2YXJ7dmFsdWV9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4KLVRoaXMgZW1pdHMgQHZhcntyZXBlYXR9IGNvcGllcyBvZiBAdmFye3NpemV9IGJ5dGVzLiAgQHZhcntSZXBlYXR9Ci1tYXkgYmUgemVybyBvciBtb3JlLiAgQHZhcntTaXplfSBtYXkgYmUgemVybyBvciBtb3JlLCBidXQgaWYgaXQgaXMKLW1vcmUgdGhhbiA4LCB0aGVuIGl0IGlzIGRlZW1lZCB0byBoYXZlIHRoZSB2YWx1ZSA4LCBjb21wYXRpYmxlIHdpdGgKLW90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuICBUaGUgY29udGVudHMgb2YgZWFjaCBAdmFye3JlcGVhdH0gYnl0ZXMKLWlzIHRha2VuIGZyb20gYW4gOC1ieXRlIG51bWJlci4gIFRoZSBoaWdoZXN0IG9yZGVyIDQgYnl0ZXMgYXJlCi16ZXJvLiAgVGhlIGxvd2VzdCBvcmRlciA0IGJ5dGVzIGFyZSBAdmFye3ZhbHVlfSByZW5kZXJlZCBpbiB0aGUKLWJ5dGUtb3JkZXIgb2YgYW4gaW50ZWdlciBvbiB0aGUgY29tcHV0ZXIgQGNvZGV7QHZhbHVle0FTfX0gaXMgYXNzZW1ibGluZyBmb3IuCi1FYWNoIEB2YXJ7c2l6ZX0gYnl0ZXMgaW4gYSByZXBldGl0aW9uIGlzIHRha2VuIGZyb20gdGhlIGxvd2VzdCBvcmRlcgotQHZhcntzaXplfSBieXRlcyBvZiB0aGlzIG51bWJlci4gIEFnYWluLCB0aGlzIGJpemFycmUgYmVoYXZpb3IgaXMKLWNvbXBhdGlibGUgd2l0aCBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLgotCi1AdmFye3NpemV9IGFuZCBAdmFye3ZhbHVlfSBhcmUgb3B0aW9uYWwuCi1JZiB0aGUgc2Vjb25kIGNvbW1hIGFuZCBAdmFye3ZhbHVlfSBhcmUgYWJzZW50LCBAdmFye3ZhbHVlfSBpcwotYXNzdW1lZCB6ZXJvLiAgSWYgdGhlIGZpcnN0IGNvbW1hIGFuZCBmb2xsb3dpbmcgdG9rZW5zIGFyZSBhYnNlbnQsCi1AdmFye3NpemV9IGlzIGFzc3VtZWQgdG8gYmUgMS4KLQotQG5vZGUgRmxvYXQKLUBzZWN0aW9uIEBjb2Rley5mbG9hdCBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHNpbmdsZSkKLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgYXNzZW1ibGVzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQKLWhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQGNvZGV7LnNpbmdsZX0uCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLgotQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSwgQGNvZGV7LmZsb2F0fSBlbWl0cyAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwotaW4gQHNje2llZWV9IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBGdW5jCi1Ac2VjdGlvbiBAY29kZXsuZnVuYyBAdmFye25hbWV9WyxAdmFye2xhYmVsfV19Ci1AY2luZGV4IEBjb2Rle2Z1bmN9IGRpcmVjdGl2ZQotQGNvZGV7LmZ1bmN9IGVtaXRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgZnVuY3Rpb24gQHZhcntuYW1lfSwgYW5kCi1pcyBpZ25vcmVkIHVubGVzcyB0aGUgZmlsZSBpcyBhc3NlbWJsZWQgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZC4KLU9ubHkgQHNhbXB7LS1nc3RhYnN9IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuCi1AdmFye2xhYmVsfSBpcyB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGZ1bmN0aW9uIGFuZCBpZiBvbWl0dGVkIEB2YXJ7bmFtZX0KLXByZXBlbmRlZCB3aXRoIHRoZSBAc2FtcHtsZWFkaW5nIGNoYXJ9IGlzIHVzZWQuCi1Ac2FtcHtsZWFkaW5nIGNoYXJ9IGlzIHVzdWFsbHkgQGNvZGV7X30gb3Igbm90aGluZywgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCi1BbGwgZnVuY3Rpb25zIGFyZSBjdXJyZW50bHkgZGVmaW5lZCB0byBoYXZlIEBjb2Rle3ZvaWR9IHJldHVybiB0eXBlLgotVGhlIGZ1bmN0aW9uIG11c3QgYmUgdGVybWluYXRlZCB3aXRoIEBjb2Rley5lbmRmdW5jfS4KLQotQG5vZGUgR2xvYmFsCi1Ac2VjdGlvbiBAY29kZXsuZ2xvYmFsIEB2YXJ7c3ltYm9sfX0sIEBjb2Rley5nbG9ibCBAdmFye3N5bWJvbH19Ci0KLUBjaW5kZXggQGNvZGV7Z2xvYmFsfSBkaXJlY3RpdmUKLUBjaW5kZXggc3ltYm9sLCBtYWtpbmcgdmlzaWJsZSB0byBsaW5rZXIKLUBjb2Rley5nbG9iYWx9IG1ha2VzIHRoZSBzeW1ib2wgdmlzaWJsZSB0byBAY29kZXtAdmFsdWV7TER9fS4gIElmIHlvdSBkZWZpbmUKLUB2YXJ7c3ltYm9sfSBpbiB5b3VyIHBhcnRpYWwgcHJvZ3JhbSwgaXRzIHZhbHVlIGlzIG1hZGUgYXZhaWxhYmxlIHRvCi1vdGhlciBwYXJ0aWFsIHByb2dyYW1zIHRoYXQgYXJlIGxpbmtlZCB3aXRoIGl0LiAgT3RoZXJ3aXNlLAotQHZhcntzeW1ib2x9IHRha2VzIGl0cyBhdHRyaWJ1dGVzIGZyb20gYSBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZQotZnJvbSBhbm90aGVyIGZpbGUgbGlua2VkIGludG8gdGhlIHNhbWUgcHJvZ3JhbS4KLQotQm90aCBzcGVsbGluZ3MgKEBzYW1wey5nbG9ibH0gYW5kIEBzYW1wey5nbG9iYWx9KSBhcmUgYWNjZXB0ZWQsIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuCi0KLUBpZnNldCBIUFBBCi1PbiB0aGUgSFBQQSwgQGNvZGV7Lmdsb2JhbH0gaXMgbm90IGFsd2F5cyBlbm91Z2ggdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIHRvIG90aGVyCi1wYXJ0aWFsIHByb2dyYW1zLiAgWW91IG1heSBuZWVkIHRoZSBIUFBBLW9ubHkgQGNvZGV7LkVYUE9SVH0gZGlyZWN0aXZlIGFzIHdlbGwuCi1AeHJlZntIUFBBIERpcmVjdGl2ZXMsLCBIUFBBIEFzc2VtYmxlciBEaXJlY3RpdmVzfS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgaHdvcmQKLUBzZWN0aW9uIEBjb2Rley5od29yZCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtod29yZH0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXJzLCAxNi1iaXQKLUBjaW5kZXggbnVtYmVycywgMTYtYml0Ci1AY2luZGV4IHNpeHRlZW4gYml0IGludGVnZXJzCi1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIEB2YXJ7ZXhwcmVzc2lvbnN9LCBhbmQgZW1pdHMKLWEgMTYgYml0IG51bWJlciBmb3IgZWFjaC4KLQotQGlmc2V0IEdFTkVSSUMKLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3lub255bSBmb3IgQHNhbXB7LnNob3J0fTsgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQKLWFyY2hpdGVjdHVyZSwgaXQgbWF5IGFsc28gYmUgYSBzeW5vbnltIGZvciBAc2FtcHsud29yZH0uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgVzMyCi1UaGlzIGRpcmVjdGl2ZSBpcyBhIHN5bm9ueW0gZm9yIEBzYW1wey5zaG9ydH0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgVzE2Ci1UaGlzIGRpcmVjdGl2ZSBpcyBhIHN5bm9ueW0gZm9yIGJvdGggQHNhbXB7LnNob3J0fSBhbmQgQHNhbXB7LndvcmR9LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIElkZW50Ci1Ac2VjdGlvbiBAY29kZXsuaWRlbnR9Ci0KLUBjaW5kZXggQGNvZGV7aWRlbnR9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgaXMgdXNlZCBieSBzb21lIGFzc2VtYmxlcnMgdG8gcGxhY2UgdGFncyBpbiBvYmplY3QgZmlsZXMuCi1AY29kZXtAdmFsdWV7QVN9fSBzaW1wbHkgYWNjZXB0cyB0aGUgZGlyZWN0aXZlIGZvciBzb3VyY2UtZmlsZQotY29tcGF0aWJpbGl0eSB3aXRoIHN1Y2ggYXNzZW1ibGVycywgYnV0IGRvZXMgbm90IGFjdHVhbGx5IGVtaXQgYW55dGhpbmcKLWZvciBpdC4KLQotQG5vZGUgSWYKLUBzZWN0aW9uIEBjb2Rley5pZiBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259fQotCi1AY2luZGV4IGNvbmRpdGlvbmFsIGFzc2VtYmx5Ci1AY2luZGV4IEBjb2Rle2lmfSBkaXJlY3RpdmUKLUBjb2Rley5pZn0gbWFya3MgdGhlIGJlZ2lubmluZyBvZiBhIHNlY3Rpb24gb2YgY29kZSB3aGljaCBpcyBvbmx5Ci1jb25zaWRlcmVkIHBhcnQgb2YgdGhlIHNvdXJjZSBwcm9ncmFtIGJlaW5nIGFzc2VtYmxlZCBpZiB0aGUgYXJndW1lbnQKLSh3aGljaCBtdXN0IGJlIGFuIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0pIGlzIG5vbi16ZXJvLiAgVGhlIGVuZCBvZgotdGhlIGNvbmRpdGlvbmFsIHNlY3Rpb24gb2YgY29kZSBtdXN0IGJlIG1hcmtlZCBieSBAY29kZXsuZW5kaWZ9Ci0oQHB4cmVme0VuZGlmLCxAY29kZXsuZW5kaWZ9fSk7IG9wdGlvbmFsbHksIHlvdSBtYXkgaW5jbHVkZSBjb2RlIGZvciB0aGUKLWFsdGVybmF0aXZlIGNvbmRpdGlvbiwgZmxhZ2dlZCBieSBAY29kZXsuZWxzZX0gKEBweHJlZntFbHNlLCxAY29kZXsuZWxzZX19KS4KLUlmIHlvdSBoYXZlIHNldmVyYWwgY29uZGl0aW9ucyB0byBjaGVjaywgQGNvZGV7LmVsc2VpZn0gbWF5IGJlIHVzZWQgdG8gYXZvaWQKLW5lc3RpbmcgYmxvY2tzIGlmL2Vsc2Ugd2l0aGluIGVhY2ggc3Vic2VxdWVudCBAY29kZXsuZWxzZX0gYmxvY2suCi0KLVRoZSBmb2xsb3dpbmcgdmFyaWFudHMgb2YgQGNvZGV7LmlmfSBhcmUgYWxzbyBzdXBwb3J0ZWQ6Ci1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7aWZkZWZ9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmZGVmIEB2YXJ7c3ltYm9sfQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBzcGVjaWZpZWQgQHZhcntzeW1ib2x9Ci1oYXMgYmVlbiBkZWZpbmVkLgotCi1AY2luZGV4IEBjb2Rle2lmY30gZGlyZWN0aXZlCi1AaXRlbSAuaWZjIEB2YXJ7c3RyaW5nMX0sQHZhcntzdHJpbmcyfQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUgdGhlIHNhbWUuICBUaGUKLXN0cmluZ3MgbWF5IGJlIG9wdGlvbmFsbHkgcXVvdGVkIHdpdGggc2luZ2xlIHF1b3Rlcy4gIElmIHRoZXkgYXJlIG5vdCBxdW90ZWQsCi10aGUgZmlyc3Qgc3RyaW5nIHN0b3BzIGF0IHRoZSBmaXJzdCBjb21tYSwgYW5kIHRoZSBzZWNvbmQgc3RyaW5nIHN0b3BzIGF0IHRoZQotZW5kIG9mIHRoZSBsaW5lLiAgU3RyaW5ncyB3aGljaCBjb250YWluIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHF1b3RlZC4gIFRoZQotc3RyaW5nIGNvbXBhcmlzb24gaXMgY2FzZSBzZW5zaXRpdmUuCi0KLUBjaW5kZXggQGNvZGV7aWZlcX0gZGlyZWN0aXZlCi1AaXRlbSAuaWZlcSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZlcXN9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmZXFzIEB2YXJ7c3RyaW5nMX0sQHZhcntzdHJpbmcyfQotQW5vdGhlciBmb3JtIG9mIEBjb2Rley5pZmN9LiAgVGhlIHN0cmluZ3MgbXVzdCBiZSBxdW90ZWQgdXNpbmcgZG91YmxlIHF1b3Rlcy4KLQotQGNpbmRleCBAY29kZXtpZmdlfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmdlIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIG9yCi1lcXVhbCB0byB6ZXJvLgotCi1AY2luZGV4IEBjb2Rle2lmZ3R9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmZ3QgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotQGNpbmRleCBAY29kZXtpZmxlfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmxlIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsCi10byB6ZXJvLgotCi1AY2luZGV4IEBjb2Rle2lmbHR9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbHQgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBsZXNzIHRoYW4gemVyby4KLQotQGNpbmRleCBAY29kZXtpZm5jfSBkaXJlY3RpdmUKLUBpdGVtIC5pZm5jIEB2YXJ7c3RyaW5nMX0sQHZhcntzdHJpbmcyfS4KLUxpa2UgQGNvZGV7LmlmY30sIGJ1dCB0aGUgc2Vuc2Ugb2YgdGhlIHRlc3QgaXMgcmV2ZXJzZWQ6IHRoaXMgYXNzZW1ibGVzIHRoZQotZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgdHdvIHN0cmluZ3MgYXJlIG5vdCB0aGUgc2FtZS4KLQotQGNpbmRleCBAY29kZXtpZm5kZWZ9IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtpZm5vdGRlZn0gZGlyZWN0aXZlCi1AaXRlbSAuaWZuZGVmIEB2YXJ7c3ltYm9sfQotQGl0ZW14IC5pZm5vdGRlZiBAdmFye3N5bWJvbH0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgc3BlY2lmaWVkIEB2YXJ7c3ltYm9sfQotaGFzIG5vdCBiZWVuIGRlZmluZWQuICBCb3RoIHNwZWxsaW5nIHZhcmlhbnRzIGFyZSBlcXVpdmFsZW50LgotCi1AY2luZGV4IEBjb2Rle2lmbmV9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbmUgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgZXF1YWwgdG8gemVybwotKGluIG90aGVyIHdvcmRzLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gQGNvZGV7LmlmfSkuCi0KLUBjaW5kZXggQGNvZGV7aWZuZXN9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbmVzIEB2YXJ7c3RyaW5nMX0sQHZhcntzdHJpbmcyfQotTGlrZSBAY29kZXsuaWZlcXN9LCBidXQgdGhlIHNlbnNlIG9mIHRoZSB0ZXN0IGlzIHJldmVyc2VkOiB0aGlzIGFzc2VtYmxlcyB0aGUKLWZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluY2x1ZGUKLUBzZWN0aW9uIEBjb2Rley5pbmNsdWRlICJAdmFye2ZpbGV9In0KLQotQGNpbmRleCBAY29kZXtpbmNsdWRlfSBkaXJlY3RpdmUKLUBjaW5kZXggc3VwcG9ydGluZyBmaWxlcywgaW5jbHVkaW5nCi1AY2luZGV4IGZpbGVzLCBpbmNsdWRpbmcKLVRoaXMgZGlyZWN0aXZlIHByb3ZpZGVzIGEgd2F5IHRvIGluY2x1ZGUgc3VwcG9ydGluZyBmaWxlcyBhdCBzcGVjaWZpZWQKLXBvaW50cyBpbiB5b3VyIHNvdXJjZSBwcm9ncmFtLiAgVGhlIGNvZGUgZnJvbSBAdmFye2ZpbGV9IGlzIGFzc2VtYmxlZCBhcwotaWYgaXQgZm9sbG93ZWQgdGhlIHBvaW50IG9mIHRoZSBAY29kZXsuaW5jbHVkZX07IHdoZW4gdGhlIGVuZCBvZiB0aGUKLWluY2x1ZGVkIGZpbGUgaXMgcmVhY2hlZCwgYXNzZW1ibHkgb2YgdGhlIG9yaWdpbmFsIGZpbGUgY29udGludWVzLiAgWW91Ci1jYW4gY29udHJvbCB0aGUgc2VhcmNoIHBhdGhzIHVzZWQgd2l0aCB0aGUgQHNhbXB7LUl9IGNvbW1hbmQtbGluZSBvcHRpb24KLShAcHhyZWZ7SW52b2tpbmcsLENvbW1hbmQtTGluZSBPcHRpb25zfSkuICBRdW90YXRpb24gbWFya3MgYXJlIHJlcXVpcmVkCi1hcm91bmQgQHZhcntmaWxlfS4KLQotQG5vZGUgSW50Ci1Ac2VjdGlvbiBAY29kZXsuaW50IEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle2ludH0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXJzLCAzMi1iaXQKLUV4cGVjdCB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIG9mIGFueSBzZWN0aW9uLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgotRm9yIGVhY2ggZXhwcmVzc2lvbiwgZW1pdCBhIG51bWJlciB0aGF0LCBhdCBydW4gdGltZSwgaXMgdGhlIHZhbHVlIG9mIHRoYXQKLWV4cHJlc3Npb24uICBUaGUgYnl0ZSBvcmRlciBhbmQgYml0IHNpemUgb2YgdGhlIG51bWJlciBkZXBlbmRzIG9uIHdoYXQga2luZAotb2YgdGFyZ2V0IHRoZSBhc3NlbWJseSBpcyBmb3IuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIOAotT24gdGhlIEg4LzUwMCBhbmQgbW9zdCBmb3JtcyBvZiB0aGUgSDgvMzAwLCBAY29kZXsuaW50fSBlbWl0cyAxNi1iaXQKLWludGVnZXJzLiAgT24gdGhlIEg4LzMwMEggYW5kIHRoZSBIaXRhY2hpIFNILCBob3dldmVyLCBAY29kZXsuaW50fSBlbWl0cwotMzItYml0IGludGVnZXJzLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIElycAotQHNlY3Rpb24gQGNvZGV7LmlycCBAdmFye3N5bWJvbH0sQHZhcnt2YWx1ZXN9fUBkb3Rze30KLQotQGNpbmRleCBAY29kZXtpcnB9IGRpcmVjdGl2ZQotRXZhbHVhdGUgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGFzc2lnbmluZyBkaWZmZXJlbnQgdmFsdWVzIHRvIEB2YXJ7c3ltYm9sfS4KLVRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIHN0YXJ0cyBhdCB0aGUgQGNvZGV7LmlycH0gZGlyZWN0aXZlLCBhbmQgaXMKLXRlcm1pbmF0ZWQgYnkgYW4gQGNvZGV7LmVuZHJ9IGRpcmVjdGl2ZS4gIEZvciBlYWNoIEB2YXJ7dmFsdWV9LCBAdmFye3N5bWJvbH0gaXMKLXNldCB0byBAdmFye3ZhbHVlfSwgYW5kIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzIGFzc2VtYmxlZC4gIElmIG5vCi1AdmFye3ZhbHVlfSBpcyBsaXN0ZWQsIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzIGFzc2VtYmxlZCBvbmNlLCB3aXRoCi1AdmFye3N5bWJvbH0gc2V0IHRvIHRoZSBudWxsIHN0cmluZy4gIFRvIHJlZmVyIHRvIEB2YXJ7c3ltYm9sfSB3aXRoaW4gdGhlCi1zZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLCB1c2UgQHZhcntcc3ltYm9sfS4KLQotRm9yIGV4YW1wbGUsIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgLmlycCAgICBwYXJhbSwxLDIsMwotICAgICAgICBtb3ZlICAgIGRccGFyYW0sc3BAQC0KLSAgICAgICAgLmVuZHIKLUBlbmQgZXhhbXBsZQotCi1pcyBlcXVpdmFsZW50IHRvIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgbW92ZSAgICBkMSxzcEBALQotICAgICAgICBtb3ZlICAgIGQyLHNwQEAtCi0gICAgICAgIG1vdmUgICAgZDMsc3BAQC0KLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBJcnBjCi1Ac2VjdGlvbiBAY29kZXsuaXJwYyBAdmFye3N5bWJvbH0sQHZhcnt2YWx1ZXN9fUBkb3Rze30KLQotQGNpbmRleCBAY29kZXtpcnBjfSBkaXJlY3RpdmUKLUV2YWx1YXRlIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBhc3NpZ25pbmcgZGlmZmVyZW50IHZhbHVlcyB0byBAdmFye3N5bWJvbH0uCi1UaGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBzdGFydHMgYXQgdGhlIEBjb2Rley5pcnBjfSBkaXJlY3RpdmUsIGFuZCBpcwotdGVybWluYXRlZCBieSBhbiBAY29kZXsuZW5kcn0gZGlyZWN0aXZlLiAgRm9yIGVhY2ggY2hhcmFjdGVyIGluIEB2YXJ7dmFsdWV9LAotQHZhcntzeW1ib2x9IGlzIHNldCB0byB0aGUgY2hhcmFjdGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgaXMKLWFzc2VtYmxlZC4gIElmIG5vIEB2YXJ7dmFsdWV9IGlzIGxpc3RlZCwgdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgaXMKLWFzc2VtYmxlZCBvbmNlLCB3aXRoIEB2YXJ7c3ltYm9sfSBzZXQgdG8gdGhlIG51bGwgc3RyaW5nLiAgVG8gcmVmZXIgdG8KLUB2YXJ7c3ltYm9sfSB3aXRoaW4gdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMsIHVzZSBAdmFye1xzeW1ib2x9LgotCi1Gb3IgZXhhbXBsZSwgYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICAuaXJwYyAgICBwYXJhbSwxMjMKLSAgICAgICAgbW92ZSAgICBkXHBhcmFtLHNwQEAtCi0gICAgICAgIC5lbmRyCi1AZW5kIGV4YW1wbGUKLQotaXMgZXF1aXZhbGVudCB0byBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIG1vdmUgICAgZDEsc3BAQC0KLSAgICAgICAgbW92ZSAgICBkMixzcEBALQotICAgICAgICBtb3ZlICAgIGQzLHNwQEAtCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgTGNvbW0KLUBzZWN0aW9uIEBjb2Rley5sY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH19Ci0KLUBjaW5kZXggQGNvZGV7bGNvbW19IGRpcmVjdGl2ZQotQGNpbmRleCBsb2NhbCBjb21tb24gc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCBsb2NhbCBjb21tb24KLVJlc2VydmUgQHZhcntsZW5ndGh9IChhbiBhYnNvbHV0ZSBleHByZXNzaW9uKSBieXRlcyBmb3IgYSBsb2NhbCBjb21tb24KLWRlbm90ZWQgYnkgQHZhcntzeW1ib2x9LiAgVGhlIHNlY3Rpb24gYW5kIHZhbHVlIG9mIEB2YXJ7c3ltYm9sfSBhcmUKLXRob3NlIG9mIHRoZSBuZXcgbG9jYWwgY29tbW9uLiAgVGhlIGFkZHJlc3NlcyBhcmUgYWxsb2NhdGVkIGluIHRoZSBic3MKLXNlY3Rpb24sIHNvIHRoYXQgYXQgcnVuLXRpbWUgdGhlIGJ5dGVzIHN0YXJ0IG9mZiB6ZXJvZWQuICBAdmFye1N5bWJvbH0KLWlzIG5vdCBkZWNsYXJlZCBnbG9iYWwgKEBweHJlZntHbG9iYWwsLEBjb2Rley5nbG9iYWx9fSksIHNvIGlzIG5vcm1hbGx5Ci1ub3QgdmlzaWJsZSB0byBAY29kZXtAdmFsdWV7TER9fS4KLQotQGlmc2V0IEdFTkVSSUMKLVNvbWUgdGFyZ2V0cyBwZXJtaXQgYSB0aGlyZCBhcmd1bWVudCB0byBiZSB1c2VkIHdpdGggQGNvZGV7Lmxjb21tfS4gIFRoaXMKLWFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZGVzaXJlZCBhbGlnbm1lbnQgb2YgdGhlIHN5bWJvbCBpbiB0aGUgYnNzIHNlY3Rpb24uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1UaGUgc3ludGF4IGZvciBAY29kZXsubGNvbW19IGRpZmZlcnMgc2xpZ2h0bHkgb24gdGhlIEhQUEEuICBUaGUgc3ludGF4IGlzCi1Ac2FtcHtAdmFye3N5bWJvbH0gLmxjb21tLCBAdmFye2xlbmd0aH19OyBAdmFye3N5bWJvbH0gaXMgb3B0aW9uYWwuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIExmbGFncwotQHNlY3Rpb24gQGNvZGV7LmxmbGFnc30KLQotQGNpbmRleCBAY29kZXtsZmxhZ3N9IGRpcmVjdGl2ZSAoaWdub3JlZCkKLUBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLWFzc2VtYmxlcnMsIGJ1dCBpZ25vcmVzIGl0LgotCi1AaWZjbGVhciBuby1saW5lLWRpcgotQG5vZGUgTGluZQotQHNlY3Rpb24gQGNvZGV7LmxpbmUgQHZhcntsaW5lLW51bWJlcn19Ci0KLUBjaW5kZXggQGNvZGV7bGluZX0gZGlyZWN0aXZlCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBuby1saW5lLWRpcgotQG5vZGUgTG4KLUBzZWN0aW9uIEBjb2Rley5sbiBAdmFye2xpbmUtbnVtYmVyfX0KLQotQGNpbmRleCBAY29kZXtsbn0gZGlyZWN0aXZlCi1AZW5kIGlmc2V0Ci1AY2luZGV4IGxvZ2ljYWwgbGluZSBudW1iZXIKLUBpZnNldCBhb3V0LWJvdXQKLUNoYW5nZSB0aGUgbG9naWNhbCBsaW5lIG51bWJlci4gIEB2YXJ7bGluZS1udW1iZXJ9IG11c3QgYmUgYW4gYWJzb2x1dGUKLWV4cHJlc3Npb24uICBUaGUgbmV4dCBsaW5lIGhhcyB0aGF0IGxvZ2ljYWwgbGluZSBudW1iZXIuICBUaGVyZWZvcmUgYW55IG90aGVyCi1zdGF0ZW1lbnRzIG9uIHRoZSBjdXJyZW50IGxpbmUgKGFmdGVyIGEgc3RhdGVtZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIpIGFyZQotcmVwb3J0ZWQgYXMgb24gbG9naWNhbCBsaW5lIG51bWJlciBAdmFye2xpbmUtbnVtYmVyfSBAbWludXN7fSAxLiAgT25lIGRheQotQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBubyBsb25nZXIgc3VwcG9ydCB0aGlzIGRpcmVjdGl2ZTogaXQgaXMgcmVjb2duaXplZCBvbmx5Ci1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGFzc2VtYmxlciBwcm9ncmFtcy4KLQotQGlmc2V0IEdFTkVSSUMKLUBpZnNldCBBMjlLCi1AZW1waHtXYXJuaW5nOn0gSW4gdGhlIEFNRDI5SyBjb25maWd1cmF0aW9uIG9mIEB2YWx1ZXtBU30sIHRoaXMgY29tbWFuZCBpcwotbm90IGF2YWlsYWJsZTsgdXNlIHRoZSBzeW5vbnltIEBjb2Rley5sbn0gaW4gdGhhdCBjb250ZXh0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZjbGVhciBuby1saW5lLWRpcgotRXZlbiB0aG91Z2ggdGhpcyBpcyBhIGRpcmVjdGl2ZSBhc3NvY2lhdGVkIHdpdGggdGhlIEBjb2Rle2Eub3V0fSBvcgotQGNvZGV7Yi5vdXR9IG9iamVjdC1jb2RlIGZvcm1hdHMsIEBjb2Rle0B2YWx1ZXtBU319IHN0aWxsIHJlY29nbml6ZXMgaXQKLXdoZW4gcHJvZHVjaW5nIENPRkYgb3V0cHV0LCBhbmQgdHJlYXRzIEBzYW1wey5saW5lfSBhcyB0aG91Z2ggaXQKLXdlcmUgdGhlIENPRkYgQHNhbXB7LmxufSBAZW1waHtpZn0gaXQgaXMgZm91bmQgb3V0c2lkZSBhCi1AY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXIuCi0KLUluc2lkZSBhIEBjb2Rley5kZWZ9LCBAc2FtcHsubGluZX0gaXMsIGluc3RlYWQsIG9uZSBvZiB0aGUgZGlyZWN0aXZlcwotdXNlZCBieSBjb21waWxlcnMgdG8gZ2VuZXJhdGUgYXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IKLWRlYnVnZ2luZy4KLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBMaW5rb25jZQotQHNlY3Rpb24gQGNvZGV7LmxpbmtvbmNlIFtAdmFye3R5cGV9XX0KLUBjaW5kZXggQ09NREFUCi1AY2luZGV4IEBjb2Rle2xpbmtvbmNlfSBkaXJlY3RpdmUKLUBjaW5kZXggY29tbW9uIHNlY3Rpb25zCi1NYXJrIHRoZSBjdXJyZW50IHNlY3Rpb24gc28gdGhhdCB0aGUgbGlua2VyIG9ubHkgaW5jbHVkZXMgYSBzaW5nbGUgY29weSBvZiBpdC4KLVRoaXMgbWF5IGJlIHVzZWQgdG8gaW5jbHVkZSB0aGUgc2FtZSBzZWN0aW9uIGluIHNldmVyYWwgZGlmZmVyZW50IG9iamVjdCBmaWxlcywKLWJ1dCBlbnN1cmUgdGhhdCB0aGUgbGlua2VyIHdpbGwgb25seSBpbmNsdWRlIGl0IG9uY2UgaW4gdGhlIGZpbmFsIG91dHB1dCBmaWxlLgotVGhlIEBjb2Rley5saW5rb25jZX0gcHNldWRvLW9wIG11c3QgYmUgdXNlZCBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGUgc2VjdGlvbi4KLUR1cGxpY2F0ZSBzZWN0aW9ucyBhcmUgZGV0ZWN0ZWQgYmFzZWQgb24gdGhlIHNlY3Rpb24gbmFtZSwgc28gaXQgc2hvdWxkIGJlCi11bmlxdWUuCi0KLVRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IGEgZmV3IG9iamVjdCBmaWxlIGZvcm1hdHM7IGFzIG9mIHRoaXMKLXdyaXRpbmcsIHRoZSBvbmx5IG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBzdXBwb3J0cyBpdCBpcyB0aGUgUG9ydGFibGUKLUV4ZWN1dGFibGUgZm9ybWF0IHVzZWQgb24gV2luZG93cyBOVC4KLQotVGhlIEB2YXJ7dHlwZX0gYXJndW1lbnQgaXMgb3B0aW9uYWwuICBJZiBzcGVjaWZpZWQsIGl0IG11c3QgYmUgb25lIG9mIHRoZQotZm9sbG93aW5nIHN0cmluZ3MuICBGb3IgZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLS5saW5rb25jZSBzYW1lX3NpemUKLUBlbmQgc21hbGxleGFtcGxlCi1Ob3QgYWxsIHR5cGVzIG1heSBiZSBzdXBwb3J0ZWQgb24gYWxsIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZGlzY2FyZAotU2lsZW50bHkgZGlzY2FyZCBkdXBsaWNhdGUgc2VjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgotCi1AaXRlbSBvbmVfb25seQotV2FybiBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIHNlY3Rpb25zLCBidXQgc3RpbGwga2VlcCBvbmx5IG9uZSBjb3B5LgotCi1AaXRlbSBzYW1lX3NpemUKLVdhcm4gaWYgYW55IG9mIHRoZSBkdXBsaWNhdGVzIGhhdmUgZGlmZmVyZW50IHNpemVzLgotCi1AaXRlbSBzYW1lX2NvbnRlbnRzCi1XYXJuIGlmIGFueSBvZiB0aGUgZHVwbGljYXRlcyBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGNvbnRlbnRzLgotQGVuZCB0YWJsZQotCi1Abm9kZSBMbgotQHNlY3Rpb24gQGNvZGV7LmxuIEB2YXJ7bGluZS1udW1iZXJ9fQotCi1AY2luZGV4IEBjb2Rle2xufSBkaXJlY3RpdmUKLUBpZmNsZWFyIG5vLWxpbmUtZGlyCi1Ac2FtcHsubG59IGlzIGEgc3lub255bSBmb3IgQHNhbXB7LmxpbmV9LgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgbm8tbGluZS1kaXIKLVRlbGwgQGNvZGV7QHZhbHVle0FTfX0gdG8gY2hhbmdlIHRoZSBsb2dpY2FsIGxpbmUgbnVtYmVyLiAgQHZhcntsaW5lLW51bWJlcn0KLW11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFRoZSBuZXh0IGxpbmUgaGFzIHRoYXQgbG9naWNhbAotbGluZSBudW1iZXIsIHNvIGFueSBvdGhlciBzdGF0ZW1lbnRzIG9uIHRoZSBjdXJyZW50IGxpbmUgKGFmdGVyIGEKLXN0YXRlbWVudCBzZXBhcmF0b3IgY2hhcmFjdGVyIEBjb2Rlezt9KSBhcmUgcmVwb3J0ZWQgYXMgb24gbG9naWNhbAotbGluZSBudW1iZXIgQHZhcntsaW5lLW51bWJlcn0gQG1pbnVze30gMS4KLUBpZnNldCBCT1VUCi0KLVRoaXMgZGlyZWN0aXZlIGlzIGFjY2VwdGVkLCBidXQgaWdub3JlZCwgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcwotY29uZmlndXJlZCBmb3IgQGNvZGV7Yi5vdXR9OyBpdHMgZWZmZWN0IGlzIG9ubHkgYXNzb2NpYXRlZCB3aXRoIENPRkYKLW91dHB1dCBmb3JtYXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIE1SSQotQHNlY3Rpb24gQGNvZGV7Lm1yaSBAdmFye3ZhbH19Ci0KLUBjaW5kZXggQGNvZGV7bXJpfSBkaXJlY3RpdmUKLUBjaW5kZXggTVJJIG1vZGUsIHRlbXBvcmFyaWx5Ci1JZiBAdmFye3ZhbH0gaXMgbm9uLXplcm8sIHRoaXMgdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZW50ZXIgTVJJIG1vZGUuICBJZgotQHZhcnt2YWx9IGlzIHplcm8sIHRoaXMgdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZXhpdCBNUkkgbW9kZS4gIFRoaXMgY2hhbmdlCi1hZmZlY3RzIGNvZGUgYXNzZW1ibGVkIHVudGlsIHRoZSBuZXh0IEBjb2Rley5tcml9IGRpcmVjdGl2ZSwgb3IgdW50aWwgdGhlIGVuZAotb2YgdGhlIGZpbGUuICBAeHJlZntNLCBNUkkgbW9kZSwgTVJJIG1vZGV9LgotCi1Abm9kZSBMaXN0Ci1Ac2VjdGlvbiBAY29kZXsubGlzdH0KLQotQGNpbmRleCBAY29kZXtsaXN0fSBkaXJlY3RpdmUKLUBjaW5kZXggbGlzdGluZyBjb250cm9sLCB0dXJuaW5nIG9uCi1Db250cm9sIChpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBAY29kZXsubm9saXN0fSBkaXJlY3RpdmUpIHdoZXRoZXIgb3IKLW5vdCBhc3NlbWJseSBsaXN0aW5ncyBhcmUgZ2VuZXJhdGVkLiAgVGhlc2UgdHdvIGRpcmVjdGl2ZXMgbWFpbnRhaW4gYW4KLWludGVybmFsIGNvdW50ZXIgKHdoaWNoIGlzIHplcm8gaW5pdGlhbGx5KS4gICBAY29kZXsubGlzdH0gaW5jcmVtZW50cyB0aGUKLWNvdW50ZXIsIGFuZCBAY29kZXsubm9saXN0fSBkZWNyZW1lbnRzIGl0LiAgQXNzZW1ibHkgbGlzdGluZ3MgYXJlCi1nZW5lcmF0ZWQgd2hlbmV2ZXIgdGhlIGNvdW50ZXIgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLUJ5IGRlZmF1bHQsIGxpc3RpbmdzIGFyZSBkaXNhYmxlZC4gIFdoZW4geW91IGVuYWJsZSB0aGVtICh3aXRoIHRoZQotQHNhbXB7LWF9IGNvbW1hbmQgbGluZSBvcHRpb247IEBweHJlZntJbnZva2luZywsQ29tbWFuZC1MaW5lIE9wdGlvbnN9KSwKLXRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBsaXN0aW5nIGNvdW50ZXIgaXMgb25lLgotCi1Abm9kZSBMb25nCi1Ac2VjdGlvbiBAY29kZXsubG9uZyBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtsb25nfSBkaXJlY3RpdmUKLUBjb2Rley5sb25nfSBpcyB0aGUgc2FtZSBhcyBAc2FtcHsuaW50fSwgQHB4cmVme0ludCwsQGNvZGV7LmludH19LgotCi1AaWdub3JlCi1AYyBubyBvbmUgc2VlbXMgdG8ga25vdyB3aGF0IHRoaXMgaXMgZm9yIG9yIHdoZXRoZXIgdGhpcyBkZXNjcmlwdGlvbiBpcwotQGMgd2hhdCBpdCByZWFsbHkgb3VnaHQgdG8gZG8KLUBub2RlIExzeW0KLUBzZWN0aW9uIEBjb2Rley5sc3ltIEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLQotQGNpbmRleCBAY29kZXtsc3ltfSBkaXJlY3RpdmUKLUBjaW5kZXggc3ltYm9sLCBub3QgcmVmZXJlbmNlZCBpbiBhc3NlbWJseQotQGNvZGV7LmxzeW19IGNyZWF0ZXMgYSBuZXcgc3ltYm9sIG5hbWVkIEB2YXJ7c3ltYm9sfSwgYnV0IGRvZXMgbm90IHB1dCBpdCBpbgotdGhlIGhhc2ggdGFibGUsIGVuc3VyaW5nIGl0IGNhbm5vdCBiZSByZWZlcmVuY2VkIGJ5IG5hbWUgZHVyaW5nIHRoZQotcmVzdCBvZiB0aGUgYXNzZW1ibHkuICBUaGlzIHNldHMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHN5bWJvbCB0byBiZQotdGhlIHNhbWUgYXMgdGhlIGV4cHJlc3Npb24gdmFsdWU6Ci1Ac21hbGxleGFtcGxlCi1AdmFye290aGVyfSA9IEB2YXJ7ZGVzY3JpcHRvcn0gPSAwCi1AdmFye3R5cGV9ID0gQHJ7KHNlY3Rpb24gb2YgQHZhcntleHByZXNzaW9ufSl9Ci1AdmFye3ZhbHVlfSA9IEB2YXJ7ZXhwcmVzc2lvbn0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoZSBuZXcgc3ltYm9sIGlzIG5vdCBmbGFnZ2VkIGFzIGV4dGVybmFsLgotQGVuZCBpZ25vcmUKLQotQG5vZGUgTWFjcm8KLUBzZWN0aW9uIEBjb2Rley5tYWNyb30KLQotQGNpbmRleCBtYWNyb3MKLVRoZSBjb21tYW5kcyBAY29kZXsubWFjcm99IGFuZCBAY29kZXsuZW5kbX0gYWxsb3cgeW91IHRvIGRlZmluZSBtYWNyb3MgdGhhdAotZ2VuZXJhdGUgYXNzZW1ibHkgb3V0cHV0LiAgRm9yIGV4YW1wbGUsIHRoaXMgZGVmaW5pdGlvbiBzcGVjaWZpZXMgYSBtYWNybwotQGNvZGV7c3VtfSB0aGF0IHB1dHMgYSBzZXF1ZW5jZSBvZiBudW1iZXJzIGludG8gbWVtb3J5OgotCi1AZXhhbXBsZQotICAgICAgICAubWFjcm8gIHN1bSBmcm9tPTAsIHRvPTUKLSAgICAgICAgLmxvbmcgICBcZnJvbQotICAgICAgICAuaWYgICAgIFx0by1cZnJvbQotICAgICAgICBzdW0gICAgICIoXGZyb20rMSkiLFx0bwotICAgICAgICAuZW5kaWYKLSAgICAgICAgLmVuZG0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVdpdGggdGhhdCBkZWZpbml0aW9uLCBAc2FtcHtTVU0gMCw1fSBpcyBlcXVpdmFsZW50IHRvIHRoaXMgYXNzZW1ibHkgaW5wdXQ6Ci0KLUBleGFtcGxlCi0gICAgICAgIC5sb25nICAgMAotICAgICAgICAubG9uZyAgIDEKLSAgICAgICAgLmxvbmcgICAyCi0gICAgICAgIC5sb25nICAgMwotICAgICAgICAubG9uZyAgIDQKLSAgICAgICAgLmxvbmcgICA1Ci1AZW5kIGV4YW1wbGUKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLm1hY3JvIEB2YXJ7bWFjbmFtZX0KLUBpdGVteCAubWFjcm8gQHZhcnttYWNuYW1lfSBAdmFye21hY2FyZ3N9IEBkb3Rze30KLUBjaW5kZXggQGNvZGV7bWFjcm99IGRpcmVjdGl2ZQotQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQHZhcnttYWNuYW1lfS4gIElmIHlvdXIgbWFjcm8KLWRlZmluaXRpb24gcmVxdWlyZXMgYXJndW1lbnRzLCBzcGVjaWZ5IHRoZWlyIG5hbWVzIGFmdGVyIHRoZSBtYWNybyBuYW1lLAotc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciBzcGFjZXMuICBZb3UgY2FuIHN1cHBseSBhIGRlZmF1bHQgdmFsdWUgZm9yIGFueQotbWFjcm8gYXJndW1lbnQgYnkgZm9sbG93aW5nIHRoZSBuYW1lIHdpdGggQHNhbXB7PUB2YXJ7ZGVmbHR9fS4gIEZvcgotZXhhbXBsZSwgdGhlc2UgYXJlIGFsbCB2YWxpZCBAY29kZXsubWFjcm99IHN0YXRlbWVudHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLm1hY3JvIGNvbW0KLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle2NvbW19LCB3aGljaCB0YWtlcyBubwotYXJndW1lbnRzLgotCi1AaXRlbSAubWFjcm8gcGx1czEgcCwgcDEKLUBpdGVteCAubWFjcm8gcGx1czEgcCBwMQotRWl0aGVyIHN0YXRlbWVudCBiZWdpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7cGx1czF9LAotd2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50czsgd2l0aGluIHRoZSBtYWNybyBkZWZpbml0aW9uLCB3cml0ZQotQHNhbXB7XHB9IG9yIEBzYW1we1xwMX0gdG8gZXZhbHVhdGUgdGhlIGFyZ3VtZW50cy4KLQotQGl0ZW0gLm1hY3JvIHJlc2VydmVfc3RyIHAxPTAgcDIKLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle3Jlc2VydmVfc3RyfSwgd2l0aCB0d28KLWFyZ3VtZW50cy4gIFRoZSBmaXJzdCBhcmd1bWVudCBoYXMgYSBkZWZhdWx0IHZhbHVlLCBidXQgbm90IHRoZSBzZWNvbmQuCi1BZnRlciB0aGUgZGVmaW5pdGlvbiBpcyBjb21wbGV0ZSwgeW91IGNhbiBjYWxsIHRoZSBtYWNybyBlaXRoZXIgYXMKLUBzYW1we3Jlc2VydmVfc3RyIEB2YXJ7YX0sQHZhcntifX0gKHdpdGggQHNhbXB7XHAxfSBldmFsdWF0aW5nIHRvCi1AdmFye2F9IGFuZCBAc2FtcHtccDJ9IGV2YWx1YXRpbmcgdG8gQHZhcntifSksIG9yIGFzIEBzYW1we3Jlc2VydmVfc3RyCi0sQHZhcntifX0gKHdpdGggQHNhbXB7XHAxfSBldmFsdWF0aW5nIGFzIHRoZSBkZWZhdWx0LCBpbiB0aGlzIGNhc2UKLUBzYW1wezB9LCBhbmQgQHNhbXB7XHAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLgotQGVuZCB0YWJsZQotCi1XaGVuIHlvdSBjYWxsIGEgbWFjcm8sIHlvdSBjYW4gc3BlY2lmeSB0aGUgYXJndW1lbnQgdmFsdWVzIGVpdGhlciBieQotcG9zaXRpb24sIG9yIGJ5IGtleXdvcmQuICBGb3IgZXhhbXBsZSwgQHNhbXB7c3VtIDksMTd9IGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1we3N1bSB0bz0xNywgZnJvbT05fS4KLQotQGl0ZW0gLmVuZG0KLUBjaW5kZXggQGNvZGV7ZW5kbX0gZGlyZWN0aXZlCi1NYXJrIHRoZSBlbmQgb2YgYSBtYWNybyBkZWZpbml0aW9uLgotCi1AaXRlbSAuZXhpdG0KLUBjaW5kZXggQGNvZGV7ZXhpdG19IGRpcmVjdGl2ZQotRXhpdCBlYXJseSBmcm9tIHRoZSBjdXJyZW50IG1hY3JvIGRlZmluaXRpb24uCi0KLUBjaW5kZXggbnVtYmVyIG9mIG1hY3JvcyBleGVjdXRlZAotQGNpbmRleCBtYWNyb3MsIGNvdW50IGV4ZWN1dGVkCi1AaXRlbSBcQEAKLUBjb2Rle0B2YWx1ZXtBU319IG1haW50YWlucyBhIGNvdW50ZXIgb2YgaG93IG1hbnkgbWFjcm9zIGl0IGhhcwotZXhlY3V0ZWQgaW4gdGhpcyBwc2V1ZG8tdmFyaWFibGU7IHlvdSBjYW4gY29weSB0aGF0IG51bWJlciB0byB5b3VyCi1vdXRwdXQgd2l0aCBAc2FtcHtcQEB9LCBidXQgQGVtcGh7b25seSB3aXRoaW4gYSBtYWNybyBkZWZpbml0aW9ufS4KLQotQGlnbm9yZQotQGl0ZW0gTE9DQUwgQHZhcntuYW1lfSBbICwgQGRvdHN7fSBdCi1AZW1waHtXYXJuaW5nOiBAY29kZXtMT0NBTH0gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHNlbGVjdCBgYGFsdGVybmF0ZQotbWFjcm8gc3ludGF4Jycgd2l0aCBAc2FtcHstYX0gb3IgQHNhbXB7LS1hbHRlcm5hdGV9Ln0gIEB4cmVme0FsdGVybmF0ZSwsCi1BbHRlcm5hdGUgbWFjcm8gc3ludGF4fS4KLQotR2VuZXJhdGUgYSBzdHJpbmcgcmVwbGFjZW1lbnQgZm9yIGVhY2ggb2YgdGhlIEB2YXJ7bmFtZX0gYXJndW1lbnRzLCBhbmQKLXJlcGxhY2UgYW55IGluc3RhbmNlcyBvZiBAdmFye25hbWV9IGluIGVhY2ggbWFjcm8gZXhwYW5zaW9uLiAgVGhlCi1yZXBsYWNlbWVudCBzdHJpbmcgaXMgdW5pcXVlIGluIHRoZSBhc3NlbWJseSwgYW5kIGRpZmZlcmVudCBmb3IgZWFjaAotc2VwYXJhdGUgbWFjcm8gZXhwYW5zaW9uLiAgQGNvZGV7TE9DQUx9IGFsbG93cyB5b3UgdG8gd3JpdGUgbWFjcm9zIHRoYXQKLWRlZmluZSBzeW1ib2xzLCB3aXRob3V0IGZlYXIgb2YgY29uZmxpY3QgYmV0d2VlbiBzZXBhcmF0ZSBtYWNybyBleHBhbnNpb25zLgotQGVuZCBpZ25vcmUKLUBlbmQgZnRhYmxlCi0KLUBub2RlIE5vbGlzdAotQHNlY3Rpb24gQGNvZGV7Lm5vbGlzdH0KLQotQGNpbmRleCBAY29kZXtub2xpc3R9IGRpcmVjdGl2ZQotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2wsIHR1cm5pbmcgb2ZmCi1Db250cm9sIChpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBAY29kZXsubGlzdH0gZGlyZWN0aXZlKSB3aGV0aGVyIG9yCi1ub3QgYXNzZW1ibHkgbGlzdGluZ3MgYXJlIGdlbmVyYXRlZC4gIFRoZXNlIHR3byBkaXJlY3RpdmVzIG1haW50YWluIGFuCi1pbnRlcm5hbCBjb3VudGVyICh3aGljaCBpcyB6ZXJvIGluaXRpYWxseSkuICAgQGNvZGV7Lmxpc3R9IGluY3JlbWVudHMgdGhlCi1jb3VudGVyLCBhbmQgQGNvZGV7Lm5vbGlzdH0gZGVjcmVtZW50cyBpdC4gIEFzc2VtYmx5IGxpc3RpbmdzIGFyZQotZ2VuZXJhdGVkIHdoZW5ldmVyIHRoZSBjb3VudGVyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotCi1Abm9kZSBPY3RhCi1Ac2VjdGlvbiBAY29kZXsub2N0YSBAdmFye2JpZ251bXN9fQotCi1AYyBGSVhNRTogZG91YmxlIHNpemUgZW1pdHRlZCBmb3IgIm9jdGEiIG9uIGk5NjAsIG90aGVycz8gIE9yIHdhcm4/Ci1AY2luZGV4IEBjb2Rle29jdGF9IGRpcmVjdGl2ZQotQGNpbmRleCBpbnRlZ2VyLCAxNi1ieXRlCi1AY2luZGV4IHNpeHRlZW4gYnl0ZSBpbnRlZ2VyCi1UaGlzIGRpcmVjdGl2ZSBleHBlY3RzIHplcm8gb3IgbW9yZSBiaWdudW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgRm9yIGVhY2gKLWJpZ251bSwgaXQgZW1pdHMgYSAxNi1ieXRlIGludGVnZXIuCi0KLVRoZSB0ZXJtIGBgb2N0YScnIGNvbWVzIGZyb20gY29udGV4dHMgaW4gd2hpY2ggYSBgYHdvcmQnJyBpcyB0d28gYnl0ZXM7Ci1oZW5jZSBAZW1waHtvY3RhfS13b3JkIGZvciAxNiBieXRlcy4KLQotQG5vZGUgT3JnCi1Ac2VjdGlvbiBAY29kZXsub3JnIEB2YXJ7bmV3LWxjfSAsIEB2YXJ7ZmlsbH19Ci0KLUBjaW5kZXggQGNvZGV7b3JnfSBkaXJlY3RpdmUKLUBjaW5kZXggbG9jYXRpb24gY291bnRlciwgYWR2YW5jaW5nCi1AY2luZGV4IGFkdmFuY2luZyBsb2NhdGlvbiBjb3VudGVyCi1AY2luZGV4IGN1cnJlbnQgYWRkcmVzcywgYWR2YW5jaW5nCi1BZHZhbmNlIHRoZSBsb2NhdGlvbiBjb3VudGVyIG9mIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8KLUB2YXJ7bmV3LWxjfS4gIEB2YXJ7bmV3LWxjfSBpcyBlaXRoZXIgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBvciBhbgotZXhwcmVzc2lvbiB3aXRoIHRoZSBzYW1lIHNlY3Rpb24gYXMgdGhlIGN1cnJlbnQgc3Vic2VjdGlvbi4gIFRoYXQgaXMsCi15b3UgY2FuJ3QgdXNlIEBjb2Rley5vcmd9IHRvIGNyb3NzIHNlY3Rpb25zOiBpZiBAdmFye25ldy1sY30gaGFzIHRoZQotd3Jvbmcgc2VjdGlvbiwgdGhlIEBjb2Rley5vcmd9IGRpcmVjdGl2ZSBpcyBpZ25vcmVkLiAgVG8gYmUgY29tcGF0aWJsZQotd2l0aCBmb3JtZXIgYXNzZW1ibGVycywgaWYgdGhlIHNlY3Rpb24gb2YgQHZhcntuZXctbGN9IGlzIGFic29sdXRlLAotQGNvZGV7QHZhbHVle0FTfX0gaXNzdWVzIGEgd2FybmluZywgdGhlbiBwcmV0ZW5kcyB0aGUgc2VjdGlvbiBvZiBAdmFye25ldy1sY30KLWlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24uCi0KLUBjb2Rley5vcmd9IG1heSBvbmx5IGluY3JlYXNlIHRoZSBsb2NhdGlvbiBjb3VudGVyLCBvciBsZWF2ZSBpdAotdW5jaGFuZ2VkOyB5b3UgY2Fubm90IHVzZSBAY29kZXsub3JnfSB0byBtb3ZlIHRoZSBsb2NhdGlvbiBjb3VudGVyCi1iYWNrd2FyZHMuCi0KLUBjIGRvdWJsZSBuZWdhdGl2ZSB1c2VkIGJlbG93ICJub3QgdW5kZWZpbmVkIiBiZWNhdXNlIHRoaXMgaXMgYSBzcGVjaWZpYwotQGMgcmVmZXJlbmNlIHRvICJ1bmRlZmluZWQiIChhcyBTRUdfVU5LTk9XTiBpcyBjYWxsZWQgaW4gdGhpcyBtYW51YWwpCi1AYyBzZWN0aW9uLiBkb2NAY3lnbnVzLmNvbSAxOGZlYjkxCi1CZWNhdXNlIEBjb2Rle0B2YWx1ZXtBU319IHRyaWVzIHRvIGFzc2VtYmxlIHByb2dyYW1zIGluIG9uZSBwYXNzLCBAdmFye25ldy1sY30KLW1heSBub3QgYmUgdW5kZWZpbmVkLiAgSWYgeW91IHJlYWxseSBkZXRlc3QgdGhpcyByZXN0cmljdGlvbiB3ZSBlYWdlcmx5IGF3YWl0Ci1hIGNoYW5jZSB0byBzaGFyZSB5b3VyIGltcHJvdmVkIGFzc2VtYmxlci4KLQotQmV3YXJlIHRoYXQgdGhlIG9yaWdpbiBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIG5vdAotdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdWJzZWN0aW9uLiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIKLXBlb3BsZSdzIGFzc2VtYmxlcnMuCi0KLVdoZW4gdGhlIGxvY2F0aW9uIGNvdW50ZXIgKG9mIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIGlzIGFkdmFuY2VkLCB0aGUKLWludGVydmVuaW5nIGJ5dGVzIGFyZSBmaWxsZWQgd2l0aCBAdmFye2ZpbGx9IHdoaWNoIHNob3VsZCBiZSBhbgotYWJzb2x1dGUgZXhwcmVzc2lvbi4gIElmIHRoZSBjb21tYSBhbmQgQHZhcntmaWxsfSBhcmUgb21pdHRlZCwKLUB2YXJ7ZmlsbH0gZGVmYXVsdHMgdG8gemVyby4KLQotQG5vZGUgUDJhbGlnbgotQHNlY3Rpb24gQGNvZGV7LnAyYWxpZ25bd2xdIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn19Ci0KLUBjaW5kZXggcGFkZGluZyB0aGUgbG9jYXRpb24gY291bnRlciBnaXZlbiBhIHBvd2VyIG9mIHR3bwotQGNpbmRleCBAY29kZXtwMmFsaWdufSBkaXJlY3RpdmUKLVBhZCB0aGUgbG9jYXRpb24gY291bnRlciAoaW4gdGhlIGN1cnJlbnQgc3Vic2VjdGlvbikgdG8gYSBwYXJ0aWN1bGFyCi1zdG9yYWdlIGJvdW5kYXJ5LiAgVGhlIGZpcnN0IGV4cHJlc3Npb24gKHdoaWNoIG11c3QgYmUgYWJzb2x1dGUpIGlzIHRoZQotbnVtYmVyIG9mIGxvdy1vcmRlciB6ZXJvIGJpdHMgdGhlIGxvY2F0aW9uIGNvdW50ZXIgbXVzdCBoYXZlIGFmdGVyCi1hZHZhbmNlbWVudC4gIEZvciBleGFtcGxlIEBzYW1wey5wMmFsaWduIDN9IGFkdmFuY2VzIHRoZSBsb2NhdGlvbgotY291bnRlciB1bnRpbCBpdCBhIG11bHRpcGxlIG9mIDguICBJZiB0aGUgbG9jYXRpb24gY291bnRlciBpcyBhbHJlYWR5IGEKLW11bHRpcGxlIG9mIDgsIG5vIGNoYW5nZSBpcyBuZWVkZWQuCi0KLVRoZSBzZWNvbmQgZXhwcmVzc2lvbiAoYWxzbyBhYnNvbHV0ZSkgZ2l2ZXMgdGhlIGZpbGwgdmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZQotcGFkZGluZyBieXRlcy4gIEl0IChhbmQgdGhlIGNvbW1hKSBtYXkgYmUgb21pdHRlZC4gIElmIGl0IGlzIG9taXR0ZWQsIHRoZQotcGFkZGluZyBieXRlcyBhcmUgbm9ybWFsbHkgemVyby4gIEhvd2V2ZXIsIG9uIHNvbWUgc3lzdGVtcywgaWYgdGhlIHNlY3Rpb24gaXMKLW1hcmtlZCBhcyBjb250YWluaW5nIGNvZGUgYW5kIHRoZSBmaWxsIHZhbHVlIGlzIG9taXR0ZWQsIHRoZSBzcGFjZSBpcyBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zLgotCi1UaGUgdGhpcmQgZXhwcmVzc2lvbiBpcyBhbHNvIGFic29sdXRlLCBhbmQgaXMgYWxzbyBvcHRpb25hbC4gIElmIGl0IGlzIHByZXNlbnQsCi1pdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgc2tpcHBlZCBieSB0aGlzIGFsaWdubWVudAotZGlyZWN0aXZlLiAgSWYgZG9pbmcgdGhlIGFsaWdubWVudCB3b3VsZCByZXF1aXJlIHNraXBwaW5nIG1vcmUgYnl0ZXMgdGhhbiB0aGUKLXNwZWNpZmllZCBtYXhpbXVtLCB0aGVuIHRoZSBhbGlnbm1lbnQgaXMgbm90IGRvbmUgYXQgYWxsLiAgWW91IGNhbiBvbWl0IHRoZQotZmlsbCB2YWx1ZSAodGhlIHNlY29uZCBhcmd1bWVudCkgZW50aXJlbHkgYnkgc2ltcGx5IHVzaW5nIHR3byBjb21tYXMgYWZ0ZXIgdGhlCi1yZXF1aXJlZCBhbGlnbm1lbnQ7IHRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0aGUgYWxpZ25tZW50IHRvIGJlIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMgd2hlbiBhcHByb3ByaWF0ZS4KLQotQGNpbmRleCBAY29kZXtwMmFsaWdud30gZGlyZWN0aXZlCi1AY2luZGV4IEBjb2Rle3AyYWxpZ25sfSBkaXJlY3RpdmUKLVRoZSBAY29kZXsucDJhbGlnbnd9IGFuZCBAY29kZXsucDJhbGlnbmx9IGRpcmVjdGl2ZXMgYXJlIHZhcmlhbnRzIG9mIHRoZQotQGNvZGV7LnAyYWxpZ259IGRpcmVjdGl2ZS4gIFRoZSBAY29kZXsucDJhbGlnbnd9IGRpcmVjdGl2ZSB0cmVhdHMgdGhlIGZpbGwKLXBhdHRlcm4gYXMgYSB0d28gYnl0ZSB3b3JkIHZhbHVlLiAgVGhlIEBjb2Rley5wMmFsaWdubH0gZGlyZWN0aXZlcyB0cmVhdHMgdGhlCi1maWxsIHBhdHRlcm4gYXMgYSBmb3VyIGJ5dGUgbG9uZ3dvcmQgdmFsdWUuICBGb3IgZXhhbXBsZSwgQGNvZGV7LnAyYWxpZ253Ci0yLDB4MzY4ZH0gd2lsbCBhbGlnbiB0byBhIG11bHRpcGxlIG9mIDQuICBJZiBpdCBza2lwcyB0d28gYnl0ZXMsIHRoZXkgd2lsbCBiZQotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIDB4MzY4ZCAodGhlIGV4YWN0IHBsYWNlbWVudCBvZiB0aGUgYnl0ZXMgZGVwZW5kcyB1cG9uCi10aGUgZW5kaWFubmVzcyBvZiB0aGUgcHJvY2Vzc29yKS4gIElmIGl0IHNraXBzIDEgb3IgMyBieXRlcywgdGhlIGZpbGwgdmFsdWUgaXMKLXVuZGVmaW5lZC4KLQotQG5vZGUgUHJpbnQKLUBzZWN0aW9uIEBjb2Rley5wcmludCBAdmFye3N0cmluZ319Ci0KLUBjaW5kZXggQGNvZGV7cHJpbnR9IGRpcmVjdGl2ZQotQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBwcmludCBAdmFye3N0cmluZ30gb24gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcKLWFzc2VtYmx5LiAgWW91IG11c3QgcHV0IEB2YXJ7c3RyaW5nfSBpbiBkb3VibGUgcXVvdGVzLgotCi1Abm9kZSBQc2l6ZQotQHNlY3Rpb24gQGNvZGV7LnBzaXplIEB2YXJ7bGluZXN9ICwgQHZhcntjb2x1bW5zfX0KLQotQGNpbmRleCBAY29kZXtwc2l6ZX0gZGlyZWN0aXZlCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogcGFwZXIgc2l6ZQotQGNpbmRleCBwYXBlciBzaXplLCBmb3IgbGlzdGluZ3MKLVVzZSB0aGlzIGRpcmVjdGl2ZSB0byBkZWNsYXJlIHRoZSBudW1iZXIgb2YgbGluZXMtLS1hbmQsIG9wdGlvbmFsbHksIHRoZQotbnVtYmVyIG9mIGNvbHVtbnMtLS10byB1c2UgZm9yIGVhY2ggcGFnZSwgd2hlbiBnZW5lcmF0aW5nIGxpc3RpbmdzLgotCi1JZiB5b3UgZG8gbm90IHVzZSBAY29kZXsucHNpemV9LCBsaXN0aW5ncyB1c2UgYSBkZWZhdWx0IGxpbmUtY291bnQKLW9mIDYwLiAgWW91IG1heSBvbWl0IHRoZSBjb21tYSBhbmQgQHZhcntjb2x1bW5zfSBzcGVjaWZpY2F0aW9uOyB0aGUKLWRlZmF1bHQgd2lkdGggaXMgMjAwIGNvbHVtbnMuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBmb3JtZmVlZHMgd2hlbmV2ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YKLWxpbmVzIGlzIGV4Y2VlZGVkIChvciB3aGVuZXZlciB5b3UgZXhwbGljaXRseSByZXF1ZXN0IG9uZSwgdXNpbmcKLUBjb2Rley5lamVjdH0pLgotCi1JZiB5b3Ugc3BlY2lmeSBAdmFye2xpbmVzfSBhcyBAY29kZXswfSwgbm8gZm9ybWZlZWRzIGFyZSBnZW5lcmF0ZWQgc2F2ZQotdGhvc2UgZXhwbGljaXRseSBzcGVjaWZpZWQgd2l0aCBAY29kZXsuZWplY3R9LgotCi1Abm9kZSBQdXJnZW0KLUBzZWN0aW9uIEBjb2Rley5wdXJnZW0gQHZhcntuYW1lfX0KLQotQGNpbmRleCBAY29kZXtwdXJnZW19IGRpcmVjdGl2ZQotVW5kZWZpbmUgdGhlIG1hY3JvIEB2YXJ7bmFtZX0sIHNvIHRoYXQgbGF0ZXIgdXNlcyBvZiB0aGUgc3RyaW5nIHdpbGwgbm90IGJlCi1leHBhbmRlZC4gIEB4cmVme01hY3JvfS4KLQotQG5vZGUgUXVhZAotQHNlY3Rpb24gQGNvZGV7LnF1YWQgQHZhcntiaWdudW1zfX0KLQotQGNpbmRleCBAY29kZXtxdWFkfSBkaXJlY3RpdmUKLUBjb2Rley5xdWFkfSBleHBlY3RzIHplcm8gb3IgbW9yZSBiaWdudW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgRm9yCi1lYWNoIGJpZ251bSwgaXQgZW1pdHMKLUBpZmNsZWFyIGJpZ251bS0xNgotYW4gOC1ieXRlIGludGVnZXIuICBJZiB0aGUgYmlnbnVtIHdvbid0IGZpdCBpbiA4IGJ5dGVzLCBpdCBwcmludHMgYQotd2FybmluZyBtZXNzYWdlOyBhbmQganVzdCB0YWtlcyB0aGUgbG93ZXN0IG9yZGVyIDggYnl0ZXMgb2YgdGhlIGJpZ251bS4KLUBjaW5kZXggZWlnaHQtYnl0ZSBpbnRlZ2VyCi1AY2luZGV4IGludGVnZXIsIDgtYnl0ZQotCi1UaGUgdGVybSBgYHF1YWQnJyBjb21lcyBmcm9tIGNvbnRleHRzIGluIHdoaWNoIGEgYGB3b3JkJycgaXMgdHdvIGJ5dGVzOwotaGVuY2UgQGVtcGh7cXVhZH0td29yZCBmb3IgOCBieXRlcy4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IGJpZ251bS0xNgotYSAxNi1ieXRlIGludGVnZXIuICBJZiB0aGUgYmlnbnVtIHdvbid0IGZpdCBpbiAxNiBieXRlcywgaXQgcHJpbnRzIGEKLXdhcm5pbmcgbWVzc2FnZTsgYW5kIGp1c3QgdGFrZXMgdGhlIGxvd2VzdCBvcmRlciAxNiBieXRlcyBvZiB0aGUgYmlnbnVtLgotQGNpbmRleCBzaXh0ZWVuLWJ5dGUgaW50ZWdlcgotQGNpbmRleCBpbnRlZ2VyLCAxNi1ieXRlCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFJlcHQKLUBzZWN0aW9uIEBjb2Rley5yZXB0IEB2YXJ7Y291bnR9fQotCi1AY2luZGV4IEBjb2Rle3JlcHR9IGRpcmVjdGl2ZQotUmVwZWF0IHRoZSBzZXF1ZW5jZSBvZiBsaW5lcyBiZXR3ZWVuIHRoZSBAY29kZXsucmVwdH0gZGlyZWN0aXZlIGFuZCB0aGUgbmV4dAotQGNvZGV7LmVuZHJ9IGRpcmVjdGl2ZSBAdmFye2NvdW50fSB0aW1lcy4KLQotRm9yIGV4YW1wbGUsIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgLnJlcHQgICAzCi0gICAgICAgIC5sb25nICAgMAotICAgICAgICAuZW5kcgotQGVuZCBleGFtcGxlCi0KLWlzIGVxdWl2YWxlbnQgdG8gYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICAubG9uZyAgIDAKLSAgICAgICAgLmxvbmcgICAwCi0gICAgICAgIC5sb25nICAgMAotQGVuZCBleGFtcGxlCi0KLUBub2RlIFNidHRsCi1Ac2VjdGlvbiBAY29kZXsuc2J0dGwgIkB2YXJ7c3ViaGVhZGluZ30ifQotCi1AY2luZGV4IEBjb2Rle3NidHRsfSBkaXJlY3RpdmUKLUBjaW5kZXggc3VidGl0bGVzIGZvciBsaXN0aW5ncwotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2w6IHN1YnRpdGxlCi1Vc2UgQHZhcntzdWJoZWFkaW5nfSBhcyB0aGUgdGl0bGUgKHRoaXJkIGxpbmUsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQotdGl0bGUgbGluZSkgd2hlbiBnZW5lcmF0aW5nIGFzc2VtYmx5IGxpc3RpbmdzLgotCi1UaGlzIGRpcmVjdGl2ZSBhZmZlY3RzIHN1YnNlcXVlbnQgcGFnZXMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgcGFnZSBpZgotaXQgYXBwZWFycyB3aXRoaW4gdGVuIGxpbmVzIG9mIHRoZSB0b3Agb2YgYSBwYWdlLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgU2NsCi1Ac2VjdGlvbiBAY29kZXsuc2NsIEB2YXJ7Y2xhc3N9fQotCi1AY2luZGV4IEBjb2Rle3NjbH0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCBzdG9yYWdlIGNsYXNzIChDT0ZGKQotQGNpbmRleCBDT0ZGIHN5bWJvbCBzdG9yYWdlIGNsYXNzCi1TZXQgdGhlIHN0b3JhZ2UtY2xhc3MgdmFsdWUgZm9yIGEgc3ltYm9sLiAgVGhpcyBkaXJlY3RpdmUgbWF5IG9ubHkgYmUKLXVzZWQgaW5zaWRlIGEgQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlyLiAgU3RvcmFnZSBjbGFzcyBtYXkgZmxhZwotd2hldGhlciBhIHN5bWJvbCBpcyBzdGF0aWMgb3IgZXh0ZXJuYWwsIG9yIGl0IG1heSByZWNvcmQgZnVydGhlcgotc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotQGlmc2V0IEJPVVQKLQotVGhlIEBzYW1wey5zY2x9IGRpcmVjdGl2ZSBpcyBwcmltYXJpbHkgYXNzb2NpYXRlZCB3aXRoIENPRkYgb3V0cHV0OyB3aGVuCi1jb25maWd1cmVkIHRvIGdlbmVyYXRlIEBjb2Rle2Iub3V0fSBvdXRwdXQgZm9ybWF0LCBAY29kZXtAdmFsdWV7QVN9fQotYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQgaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgU2VjdGlvbgotQHNlY3Rpb24gQGNvZGV7LnNlY3Rpb24gQHZhcntuYW1lfX0KLQotQGNpbmRleCBAY29kZXtzZWN0aW9ufSBkaXJlY3RpdmUKLUBjaW5kZXggbmFtZWQgc2VjdGlvbgotVXNlIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIHRvIGFzc2VtYmxlIHRoZSBmb2xsb3dpbmcgY29kZSBpbnRvIGEgc2VjdGlvbgotbmFtZWQgQHZhcntuYW1lfS4KLQotVGhpcyBkaXJlY3RpdmUgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRhcmdldHMgdGhhdCBhY3R1YWxseSBzdXBwb3J0IGFyYml0cmFyaWx5Ci1uYW1lZCBzZWN0aW9uczsgb24gQGNvZGV7YS5vdXR9IHRhcmdldHMsIGZvciBleGFtcGxlLCBpdCBpcyBub3QgYWNjZXB0ZWQsIGV2ZW4KLXdpdGggYSBzdGFuZGFyZCBAY29kZXthLm91dH0gc2VjdGlvbiBuYW1lLgotCi1AaWZzZXQgQ09GRgotRm9yIENPRkYgdGFyZ2V0cywgdGhlIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgaXMgdXNlZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZwotd2F5czoKLUBzbWFsbGV4YW1wbGUKLS5zZWN0aW9uIEB2YXJ7bmFtZX1bLCAiQHZhcntmbGFnc30iXQotLnNlY3Rpb24gQHZhcntuYW1lfVssIEB2YXJ7c3Vic2VnbWVudH1dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgaXMgcXVvdGVkLCBpdCBpcyB0YWtlbiBhcyBmbGFncyB0byB1c2UgZm9yIHRoZQotc2VjdGlvbi4gIEVhY2ggZmxhZyBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuICBUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSByZWNvZ25pemVkOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBiCi1ic3Mgc2VjdGlvbiAodW5pbml0aWFsaXplZCBkYXRhKQotQGl0ZW0gbgotc2VjdGlvbiBpcyBub3QgbG9hZGVkCi1AaXRlbSB3Ci13cml0YWJsZSBzZWN0aW9uCi1AaXRlbSBkCi1kYXRhIHNlY3Rpb24KLUBpdGVtIHIKLXJlYWQtb25seSBzZWN0aW9uCi1AaXRlbSB4Ci1leGVjdXRhYmxlIHNlY3Rpb24KLUBpdGVtIHMKLXNoYXJlZCBzZWN0aW9uIChtZWFuaW5nZnVsIGZvciBQRSB0YXJnZXRzKQotQGVuZCB0YWJsZQotCi1JZiBubyBmbGFncyBhcmUgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBmbGFncyBkZXBlbmQgdXBvbiB0aGUgc2VjdGlvbiBuYW1lLiAgSWYKLXRoZSBzZWN0aW9uIG5hbWUgaXMgbm90IHJlY29nbml6ZWQsIHRoZSBkZWZhdWx0IHdpbGwgYmUgZm9yIHRoZSBzZWN0aW9uIHRvIGJlCi1sb2FkZWQgYW5kIHdyaXRhYmxlLgotCi1JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgdG8gdGhlIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgaXMgbm90IHF1b3RlZCwgaXQgaXMKLXRha2VuIGFzIGEgc3Vic2VnbWVudCBudW1iZXIgKEBweHJlZntTdWItU2VjdGlvbnN9KS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEVMRgotRm9yIEVMRiB0YXJnZXRzLCB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSBpcyB1c2VkIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLS5zZWN0aW9uIEB2YXJ7bmFtZX1bLCAiQHZhcntmbGFnc30iWywgQEBAdmFye3R5cGV9XV0KLUBlbmQgc21hbGxleGFtcGxlCi1UaGUgb3B0aW9uYWwgQHZhcntmbGFnc30gYXJndW1lbnQgaXMgYSBxdW90ZWQgc3RyaW5nIHdoaWNoIG1heSBjb250YWluIGFueQotY29tYmludGlvbiBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIGEKLXNlY3Rpb24gaXMgYWxsb2NhdGFibGUKLUBpdGVtIHcKLXNlY3Rpb24gaXMgd3JpdGFibGUKLUBpdGVtIHgKLXNlY3Rpb24gaXMgZXhlY3V0YWJsZQotQGVuZCB0YWJsZQotCi1UaGUgb3B0aW9uYWwgQHZhcnt0eXBlfSBhcmd1bWVudCBtYXkgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIEBAcHJvZ2JpdHMKLXNlY3Rpb24gY29udGFpbnMgZGF0YQotQGl0ZW0gQEBub2JpdHMKLXNlY3Rpb24gZG9lcyBub3QgY29udGFpbiBkYXRhIChpLmUuLCBzZWN0aW9uIG9ubHkgb2NjdXBpZXMgc3BhY2UpCi1AZW5kIHRhYmxlCi0KLUlmIG5vIGZsYWdzIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGZsYWdzIGRlcGVuZCB1cG9uIHRoZSBzZWN0aW9uIG5hbWUuICBJZgotdGhlIHNlY3Rpb24gbmFtZSBpcyBub3QgcmVjb2duaXplZCwgdGhlIGRlZmF1bHQgd2lsbCBiZSBmb3IgdGhlIHNlY3Rpb24gdG8gaGF2ZQotbm9uZSBvZiB0aGUgYWJvdmUgZmxhZ3M6IGl0IHdpbGwgbm90IGJlIGFsbG9jYXRlZCBpbiBtZW1vcnksIG5vciB3cml0YWJsZSwgbm9yCi1leGVjdXRhYmxlLiAgVGhlIHNlY3Rpb24gd2lsbCBjb250YWluIGRhdGEuCi0KLUZvciBFTEYgdGFyZ2V0cywgdGhlIGFzc2VtYmxlciBzdXBwb3J0cyBhbm90aGVyIHR5cGUgb2YgQGNvZGV7LnNlY3Rpb259Ci1kaXJlY3RpdmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyBhc3NlbWJsZXI6Ci1Ac21hbGxleGFtcGxlCi0uc2VjdGlvbiAiQHZhcntuYW1lfSJbLCBAdmFye2ZsYWdzfS4uLl0KLUBlbmQgc21hbGxleGFtcGxlCi1Ob3RlIHRoYXQgdGhlIHNlY3Rpb24gbmFtZSBpcyBxdW90ZWQuICBUaGVyZSBtYXkgYmUgYSBzZXF1ZW5jZSBvZiBjb21tYQotc2VwYXJhdGVkIGZsYWdzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSAjYWxsb2MKLXNlY3Rpb24gaXMgYWxsb2NhdGFibGUKLUBpdGVtICN3cml0ZQotc2VjdGlvbiBpcyB3cml0YWJsZQotQGl0ZW0gI2V4ZWNpbnN0cgotc2VjdGlvbiBpcyBleGVjdXRhYmxlCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFNldAotQHNlY3Rpb24gQGNvZGV7LnNldCBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7c2V0fSBkaXJlY3RpdmUKLUBjaW5kZXggc3ltYm9sIHZhbHVlLCBzZXR0aW5nCi1TZXQgdGhlIHZhbHVlIG9mIEB2YXJ7c3ltYm9sfSB0byBAdmFye2V4cHJlc3Npb259LiAgVGhpcwotY2hhbmdlcyBAdmFye3N5bWJvbH0ncyB2YWx1ZSBhbmQgdHlwZSB0byBjb25mb3JtIHRvCi1AdmFye2V4cHJlc3Npb259LiAgSWYgQHZhcntzeW1ib2x9IHdhcyBmbGFnZ2VkIGFzIGV4dGVybmFsLCBpdCByZW1haW5zCi1mbGFnZ2VkIChAcHhyZWZ7U3ltYm9sIEF0dHJpYnV0ZXN9KS4KLQotWW91IG1heSBAY29kZXsuc2V0fSBhIHN5bWJvbCBtYW55IHRpbWVzIGluIHRoZSBzYW1lIGFzc2VtYmx5LgotCi1JZiB5b3UgQGNvZGV7LnNldH0gYSBnbG9iYWwgc3ltYm9sLCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBvYmplY3QKLWZpbGUgaXMgdGhlIGxhc3QgdmFsdWUgc3RvcmVkIGludG8gaXQuCi0KLUBpZnNldCBIUFBBCi1UaGUgc3ludGF4IGZvciBAY29kZXtzZXR9IG9uIHRoZSBIUFBBIGlzCi1Ac2FtcHtAdmFye3N5bWJvbH0gLnNldCBAdmFye2V4cHJlc3Npb259fS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgU2hvcnQKLUBzZWN0aW9uIEBjb2Rley5zaG9ydCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtzaG9ydH0gZGlyZWN0aXZlCi1AaWZzZXQgR0VORVJJQwotQGNvZGV7LnNob3J0fSBpcyBub3JtYWxseSB0aGUgc2FtZSBhcyBAc2FtcHsud29yZH0uCi1AeHJlZntXb3JkLCxAY29kZXsud29yZH19LgotCi1JbiBzb21lIGNvbmZpZ3VyYXRpb25zLCBob3dldmVyLCBAY29kZXsuc2hvcnR9IGFuZCBAY29kZXsud29yZH0gZ2VuZXJhdGUKLW51bWJlcnMgb2YgZGlmZmVyZW50IGxlbmd0aHM7IEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgVzE2Ci1AY29kZXsuc2hvcnR9IGlzIHRoZSBzYW1lIGFzIEBzYW1wey53b3JkfS4gIEB4cmVme1dvcmQsLEBjb2Rley53b3JkfX0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgVzMyCi1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIEB2YXJ7ZXhwcmVzc2lvbnN9LCBhbmQgZW1pdHMKLWEgMTYgYml0IG51bWJlciBmb3IgZWFjaC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBTaW5nbGUKLUBzZWN0aW9uIEBjb2Rley5zaW5nbGUgQHZhcntmbG9udW1zfX0KLQotQGNpbmRleCBAY29kZXtzaW5nbGV9IGRpcmVjdGl2ZQotQGNpbmRleCBmbG9hdGluZyBwb2ludCBudW1iZXJzIChzaW5nbGUpCi1UaGlzIGRpcmVjdGl2ZSBhc3NlbWJsZXMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBJdAotaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBAY29kZXsuZmxvYXR9LgotQGlmc2V0IEdFTkVSSUMKLVRoZSBleGFjdCBraW5kIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgZW1pdHRlZCBkZXBlbmRzIG9uIGhvdwotQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZC4gIEB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBJRUVFRkxPQVQKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHksIEBjb2Rley5zaW5nbGV9IGVtaXRzIDMyLWJpdCBmbG9hdGluZyBwb2ludAotbnVtYmVycyBpbiBAc2N7aWVlZX0gZm9ybWF0LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBpZnNldCBDT0ZGCi1Abm9kZSBTaXplCi1Ac2VjdGlvbiBAY29kZXsuc2l6ZX0KLQotQGNpbmRleCBAY29kZXtzaXplfSBkaXJlY3RpdmUKLVRoaXMgZGlyZWN0aXZlIGlzIGdlbmVyYXRlZCBieSBjb21waWxlcnMgdG8gaW5jbHVkZSBhdXhpbGlhcnkgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSXQgaXMgb25seSBwZXJtaXR0ZWQgaW5zaWRlCi1AY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXJzLgotQGlmc2V0IEJPVVQKLQotQHNhbXB7LnNpemV9IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBnZW5lcmF0aW5nIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQKLWlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFNsZWIxMjgKLUBzZWN0aW9uIEBjb2Rley5zbGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3NsZWIxMjh9IGRpcmVjdGl2ZQotQHZhcntzbGViMTI4fSBzdGFuZHMgZm9yIGBgc2lnbmVkIGxpdHRsZSBlbmRpYW4gYmFzZSAxMjguJycgIFRoaXMgaXMgYSAKLWNvbXBhY3QsIHZhcmlhYmxlIGxlbmd0aCByZXByZXNlbnRhdGlvbiBvZiBudW1iZXJzIHVzZWQgYnkgdGhlIERXQVJGCi1zeW1ib2xpYyBkZWJ1Z2dpbmcgZm9ybWF0LiAgQHhyZWZ7VWxlYjEyOCxAY29kZXsudWxlYjEyOH19LgotCi1AaWZjbGVhciBuby1zcGFjZS1kaXIKLUBub2RlIFNraXAKLUBzZWN0aW9uIEBjb2Rley5za2lwIEB2YXJ7c2l6ZX0gLCBAdmFye2ZpbGx9fQotCi1AY2luZGV4IEBjb2Rle3NraXB9IGRpcmVjdGl2ZQotQGNpbmRleCBmaWxsaW5nIG1lbW9yeQotVGhpcyBkaXJlY3RpdmUgZW1pdHMgQHZhcntzaXplfSBieXRlcywgZWFjaCBvZiB2YWx1ZSBAdmFye2ZpbGx9LiAgQm90aAotQHZhcntzaXplfSBhbmQgQHZhcntmaWxsfSBhcmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMuICBJZiB0aGUgY29tbWEgYW5kCi1AdmFye2ZpbGx9IGFyZSBvbWl0dGVkLCBAdmFye2ZpbGx9IGlzIGFzc3VtZWQgdG8gYmUgemVyby4gIFRoaXMgaXMgdGhlIHNhbWUgYXMKLUBzYW1wey5zcGFjZX0uCi0KLUBub2RlIFNwYWNlCi1Ac2VjdGlvbiBAY29kZXsuc3BhY2UgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci0KLUBjaW5kZXggQGNvZGV7c3BhY2V9IGRpcmVjdGl2ZQotQGNpbmRleCBmaWxsaW5nIG1lbW9yeQotVGhpcyBkaXJlY3RpdmUgZW1pdHMgQHZhcntzaXplfSBieXRlcywgZWFjaCBvZiB2YWx1ZSBAdmFye2ZpbGx9LiAgQm90aAotQHZhcntzaXplfSBhbmQgQHZhcntmaWxsfSBhcmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMuICBJZiB0aGUgY29tbWEKLWFuZCBAdmFye2ZpbGx9IGFyZSBvbWl0dGVkLCBAdmFye2ZpbGx9IGlzIGFzc3VtZWQgdG8gYmUgemVyby4gIFRoaXMgaXMgdGhlIHNhbWUKLWFzIEBzYW1wey5za2lwfS4KLQotQGlmc2V0IEhQUEEKLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXsuc3BhY2V9IGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IG1lYW5pbmcgZm9yIEhQUEEKLXRhcmdldHM7IHVzZSBAY29kZXsuYmxvY2t9IGFzIGEgc3Vic3RpdHV0ZS4gIFNlZSBAY2l0ZXtIUDkwMDAgU2VyaWVzIDgwMAotQXNzZW1ibHkgTGFuZ3VhZ2UgUmVmZXJlbmNlIE1hbnVhbH0gKEhQIDkyNDMyLTkwMDAxKSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlCi1AY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4gIEB4cmVme0hQUEEgRGlyZWN0aXZlcywsSFBQQSBBc3NlbWJsZXIgRGlyZWN0aXZlc30sCi1mb3IgYSBzdW1tYXJ5LgotQGVuZCBxdW90YXRpb24KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1AaWZzZXQgQTI5SwotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgU3BhY2UKLUBzZWN0aW9uIEBjb2Rley5zcGFjZX0KLUBjaW5kZXggQGNvZGV7c3BhY2V9IGRpcmVjdGl2ZQotQGVuZCBpZmNsZWFyCi1PbiB0aGUgQU1EIDI5SywgdGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gSW4gbW9zdCB2ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyLCB0aGUgZGlyZWN0aXZlCi1AY29kZXsuc3BhY2V9IGhhcyB0aGUgZWZmZWN0IG9mIEBjb2Rley5ibG9ja30gIEB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgcXVvdGF0aW9uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBoYXZlLXN0YWJzCi1Abm9kZSBTdGFiCi1Ac2VjdGlvbiBAY29kZXsuc3RhYmQsIC5zdGFibiwgLnN0YWJzfQotCi1AY2luZGV4IHN5bWJvbGljIGRlYnVnZ2VycywgaW5mb3JtYXRpb24gZm9yCi1AY2luZGV4IEBjb2Rle3N0YWJAdmFye3h9fSBkaXJlY3RpdmVzCi1UaGVyZSBhcmUgdGhyZWUgZGlyZWN0aXZlcyB0aGF0IGJlZ2luIEBzYW1wey5zdGFifS4KLUFsbCBlbWl0IHN5bWJvbHMgKEBweHJlZntTeW1ib2xzfSksIGZvciB1c2UgYnkgc3ltYm9saWMgZGVidWdnZXJzLgotVGhlIHN5bWJvbHMgYXJlIG5vdCBlbnRlcmVkIGluIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBoYXNoIHRhYmxlOiB0aGV5Ci1jYW5ub3QgYmUgcmVmZXJlbmNlZCBlbHNld2hlcmUgaW4gdGhlIHNvdXJjZSBmaWxlLgotVXAgdG8gZml2ZSBmaWVsZHMgYXJlIHJlcXVpcmVkOgotCi1AdGFibGUgQHZhcgotQGl0ZW0gc3RyaW5nCi1UaGlzIGlzIHRoZSBzeW1ib2wncyBuYW1lLiAgSXQgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlciBleGNlcHQKLUBzYW1we1wwMDB9LCBzbyBpcyBtb3JlIGdlbmVyYWwgdGhhbiBvcmRpbmFyeSBzeW1ib2wgbmFtZXMuICBTb21lCi1kZWJ1Z2dlcnMgdXNlZCB0byBjb2RlIGFyYml0cmFyaWx5IGNvbXBsZXggc3RydWN0dXJlcyBpbnRvIHN5bWJvbCBuYW1lcwotdXNpbmcgdGhpcyBmaWVsZC4KLQotQGl0ZW0gdHlwZQotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFRoZSBzeW1ib2wncyB0eXBlIGlzIHNldCB0byB0aGUgbG93IDggYml0cyBvZgotdGhpcyBleHByZXNzaW9uLiAgQW55IGJpdCBwYXR0ZXJuIGlzIHBlcm1pdHRlZCwgYnV0IEBjb2Rle0B2YWx1ZXtMRH19Ci1hbmQgZGVidWdnZXJzIGNob2tlIG9uIHNpbGx5IGJpdCBwYXR0ZXJucy4KLQotQGl0ZW0gb3RoZXIKLUFuIGFic29sdXRlIGV4cHJlc3Npb24uICBUaGUgc3ltYm9sJ3MgYGBvdGhlcicnIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdGhlCi1sb3cgOCBiaXRzIG9mIHRoaXMgZXhwcmVzc2lvbi4KLQotQGl0ZW0gZGVzYwotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFRoZSBzeW1ib2wncyBkZXNjcmlwdG9yIGlzIHNldCB0byB0aGUgbG93IDE2Ci1iaXRzIG9mIHRoaXMgZXhwcmVzc2lvbi4KLQotQGl0ZW0gdmFsdWUKLUFuIGFic29sdXRlIGV4cHJlc3Npb24gd2hpY2ggYmVjb21lcyB0aGUgc3ltYm9sJ3MgdmFsdWUuCi1AZW5kIHRhYmxlCi0KLUlmIGEgd2FybmluZyBpcyBkZXRlY3RlZCB3aGlsZSByZWFkaW5nIGEgQGNvZGV7LnN0YWJkfSwgQGNvZGV7LnN0YWJufSwKLW9yIEBjb2Rley5zdGFic30gc3RhdGVtZW50LCB0aGUgc3ltYm9sIGhhcyBwcm9iYWJseSBhbHJlYWR5IGJlZW4gY3JlYXRlZDsKLXlvdSBnZXQgYSBoYWxmLWZvcm1lZCBzeW1ib2wgaW4geW91ciBvYmplY3QgZmlsZS4gIFRoaXMgaXMKLWNvbXBhdGlibGUgd2l0aCBlYXJsaWVyIGFzc2VtYmxlcnMhCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtzdGFiZH0gZGlyZWN0aXZlCi1AaXRlbSAuc3RhYmQgQHZhcnt0eXBlfSAsIEB2YXJ7b3RoZXJ9ICwgQHZhcntkZXNjfQotCi1UaGUgYGBuYW1lJycgb2YgdGhlIHN5bWJvbCBnZW5lcmF0ZWQgaXMgbm90IGV2ZW4gYW4gZW1wdHkgc3RyaW5nLgotSXQgaXMgYSBudWxsIHBvaW50ZXIsIGZvciBjb21wYXRpYmlsaXR5LiAgT2xkZXIgYXNzZW1ibGVycyB1c2VkIGEKLW51bGwgcG9pbnRlciBzbyB0aGV5IGRpZG4ndCB3YXN0ZSBzcGFjZSBpbiBvYmplY3QgZmlsZXMgd2l0aCBlbXB0eQotc3RyaW5ncy4KLQotVGhlIHN5bWJvbCdzIHZhbHVlIGlzIHNldCB0byB0aGUgbG9jYXRpb24gY291bnRlciwKLXJlbG9jYXRhYmx5LiAgV2hlbiB5b3VyIHByb2dyYW0gaXMgbGlua2VkLCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wKLWlzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyIHdoZW4gdGhlIEBjb2Rley5zdGFiZH0gd2FzCi1hc3NlbWJsZWQuCi0KLUBjaW5kZXggQGNvZGV7c3RhYm59IGRpcmVjdGl2ZQotQGl0ZW0gLnN0YWJuIEB2YXJ7dHlwZX0gLCBAdmFye290aGVyfSAsIEB2YXJ7ZGVzY30gLCBAdmFye3ZhbHVlfQotVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBpcyBzZXQgdG8gdGhlIGVtcHR5IHN0cmluZyBAY29kZXsiIn0uCi0KLUBjaW5kZXggQGNvZGV7c3RhYnN9IGRpcmVjdGl2ZQotQGl0ZW0gLnN0YWJzIEB2YXJ7c3RyaW5nfSAsICBAdmFye3R5cGV9ICwgQHZhcntvdGhlcn0gLCBAdmFye2Rlc2N9ICwgQHZhcnt2YWx1ZX0KLUFsbCBmaXZlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotQGMgZW5kICAgICBoYXZlLXN0YWJzCi0KLUBub2RlIFN0cmluZwotQHNlY3Rpb24gQGNvZGV7LnN0cmluZ30gIkB2YXJ7c3RyfSIKLQotQGNpbmRleCBzdHJpbmcsIGNvcHlpbmcgdG8gb2JqZWN0IGZpbGUKLUBjaW5kZXggQGNvZGV7c3RyaW5nfSBkaXJlY3RpdmUKLQotQ29weSB0aGUgY2hhcmFjdGVycyBpbiBAdmFye3N0cn0gdG8gdGhlIG9iamVjdCBmaWxlLiAgWW91IG1heSBzcGVjaWZ5IG1vcmUgdGhhbgotb25lIHN0cmluZyB0byBjb3B5LCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgZm9yIGEKLXBhcnRpY3VsYXIgbWFjaGluZSwgdGhlIGFzc2VtYmxlciBtYXJrcyB0aGUgZW5kIG9mIGVhY2ggc3RyaW5nIHdpdGggYSAwIGJ5dGUuCi1Zb3UgY2FuIHVzZSBhbnkgb2YgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgZGVzY3JpYmVkIGluIEByZWZ7U3RyaW5ncywsU3RyaW5nc30uCi0KLUBub2RlIFN0cnVjdAotQHNlY3Rpb24gQGNvZGV7LnN0cnVjdCBAdmFye2V4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle3N0cnVjdH0gZGlyZWN0aXZlCi1Td2l0Y2ggdG8gdGhlIGFic29sdXRlIHNlY3Rpb24sIGFuZCBzZXQgdGhlIHNlY3Rpb24gb2Zmc2V0IHRvIEB2YXJ7ZXhwcmVzc2lvbn0sCi13aGljaCBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBZb3UgbWlnaHQgdXNlIHRoaXMgYXMgZm9sbG93czoKLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgLnN0cnVjdCAwCi1maWVsZDE6Ci0gICAgICAgIC5zdHJ1Y3QgZmllbGQxICsgNAotZmllbGQyOgotICAgICAgICAuc3RydWN0IGZpZWxkMiArIDQKLWZpZWxkMzoKLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIHdvdWxkIGRlZmluZSB0aGUgc3ltYm9sIEBjb2Rle2ZpZWxkMX0gdG8gaGF2ZSB0aGUgdmFsdWUgMCwgdGhlIHN5bWJvbAotQGNvZGV7ZmllbGQyfSB0byBoYXZlIHRoZSB2YWx1ZSA0LCBhbmQgdGhlIHN5bWJvbCBAY29kZXtmaWVsZDN9IHRvIGhhdmUgdGhlCi12YWx1ZSA4LiAgQXNzZW1ibHkgd291bGQgYmUgbGVmdCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiwgYW5kIHlvdSB3b3VsZCBuZWVkIHRvCi11c2UgYSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIG9mIHNvbWUgc29ydCB0byBjaGFuZ2UgdG8gc29tZSBvdGhlciBzZWN0aW9uCi1iZWZvcmUgZnVydGhlciBhc3NlbWJseS4KLQotQGlmc2V0IEVMRgotQG5vZGUgU3ltdmVyCi1Ac2VjdGlvbiBAY29kZXsuc3ltdmVyfQotQGNpbmRleCBAY29kZXtzeW12ZXJ9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wgdmVyc2lvbmluZwotQGNpbmRleCB2ZXJzaW9ucyBvZiBzeW1ib2xzCi1Vc2UgdGhlIEBjb2Rley5zeW12ZXJ9IGRpcmVjdGl2ZSB0byBiaW5kIHN5bWJvbHMgdG8gc3BlY2lmaWMgdmVyc2lvbiBub2Rlcwotd2l0aGluIGEgc291cmNlIGZpbGUuICBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIG9uIEVMRiBwbGF0Zm9ybXMsIGFuZCBpcwotdHlwaWNhbGx5IHVzZWQgd2hlbiBhc3NlbWJsaW5nIGZpbGVzIHRvIGJlIGxpbmtlZCBpbnRvIGEgc2hhcmVkIGxpYnJhcnkuCi1UaGVyZSBhcmUgY2FzZXMgd2hlcmUgaXQgbWF5IG1ha2Ugc2Vuc2UgdG8gdXNlIHRoaXMgaW4gb2JqZWN0cyB0byBiZSBib3VuZAotaW50byBhbiBhcHBsaWNhdGlvbiBpdHNlbGYgc28gYXMgdG8gb3ZlcnJpZGUgYSB2ZXJzaW9uZWQgc3ltYm9sIGZyb20gYQotc2hhcmVkIGxpYnJhcnkuCi0KLUZvciBFTEYgdGFyZ2V0cywgdGhlIEBjb2Rley5zeW12ZXJ9IGRpcmVjdGl2ZSBpcyB1c2VkIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLS5zeW12ZXIgQHZhcntuYW1lfSwgQHZhcntuYW1lMkBAbm9kZW5hbWV9Ci1AZW5kIHNtYWxsZXhhbXBsZQotSW4gdGhpcyBjYXNlLCB0aGUgc3ltYm9sIEB2YXJ7bmFtZX0gbXVzdCBleGlzdCBhbmQgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGZpbGUKLWJlaW5nIGFzc2VtYmxlZC4gIFRoZSBAY29kZXsudmVyc3ltfSBkaXJlY3RpdmUgZWZmZWN0aXZlbHkgY3JlYXRlcyBhIHN5bWJvbAotYWxpYXMgd2l0aCB0aGUgbmFtZSBAdmFye25hbWUyQEBub2RlbmFtZX0sIGFuZCBpbiBmYWN0IHRoZSBtYWluIHJlYXNvbiB0aGF0IHdlCi1qdXN0IGRvbid0IHRyeSBhbmQgY3JlYXRlIGEgcmVndWxhciBhbGlhcyBpcyB0aGF0IHRoZSBAdmFye0BAfSBjaGFyYWN0ZXIgaXNuJ3QKLXBlcm1pdHRlZCBpbiBzeW1ib2wgbmFtZXMuICBUaGUgQHZhcntuYW1lMn0gcGFydCBvZiB0aGUgbmFtZSBpcyB0aGUgYWN0dWFsIG5hbWUKLW9mIHRoZSBzeW1ib2wgYnkgd2hpY2ggaXQgd2lsbCBiZSBleHRlcm5hbGx5IHJlZmVyZW5jZWQuICBUaGUgbmFtZSBAdmFye25hbWV9Ci1pdHNlbGYgaXMgbWVyZWx5IGEgbmFtZSBvZiBjb252ZW5pZW5jZSB0aGF0IGlzIHVzZWQgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0bwotaGF2ZSBkZWZpbml0aW9ucyBmb3IgbXVsdGlwbGUgdmVyc2lvbnMgb2YgYSBmdW5jdGlvbiB3aXRoaW4gYSBzaW5nbGUgc291cmNlCi1maWxlLCBhbmQgc28gdGhhdCB0aGUgY29tcGlsZXIgY2FuIHVuYW1iaWd1b3VzbHkga25vdyB3aGljaCB2ZXJzaW9uIG9mIGEKLWZ1bmN0aW9uIGlzIGJlaW5nIG1lbnRpb25lZC4gIFRoZSBAdmFye25vZGVuYW1lfSBwb3J0aW9uIG9mIHRoZSBhbGlhcyBzaG91bGQgYmUKLXRoZSBuYW1lIG9mIGEgbm9kZSBzcGVjaWZpZWQgaW4gdGhlIHZlcnNpb24gc2NyaXB0IHN1cHBsaWVkIHRvIHRoZSBsaW5rZXIgd2hlbgotYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIElmIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBvdmVycmlkZSBhIHZlcnNpb25lZAotc3ltYm9sIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBAdmFye25vZGVuYW1lfSBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUKLW5vZGVuYW1lIG9mIHRoZSBzeW1ib2wgeW91IGFyZSB0cnlpbmcgdG8gb3ZlcnJpZGUuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBDT0ZGCi1Abm9kZSBUYWcKLUBzZWN0aW9uIEBjb2Rley50YWcgQHZhcntzdHJ1Y3RuYW1lfX0KLQotQGNpbmRleCBDT0ZGIHN0cnVjdHVyZSBkZWJ1Z2dpbmcKLUBjaW5kZXggc3RydWN0dXJlIGRlYnVnZ2luZywgQ09GRgotQGNpbmRleCBAY29kZXt0YWd9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgaXMgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVycyB0byBpbmNsdWRlIGF1eGlsaWFyeSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBJdCBpcyBvbmx5IHBlcm1pdHRlZCBpbnNpZGUKLUBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMuICBUYWdzIGFyZSB1c2VkIHRvIGxpbmsgc3RydWN0dXJlCi1kZWZpbml0aW9ucyBpbiB0aGUgc3ltYm9sIHRhYmxlIHdpdGggaW5zdGFuY2VzIG9mIHRob3NlIHN0cnVjdHVyZXMuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsudGFnfSBpcyBvbmx5IHVzZWQgd2hlbiBnZW5lcmF0aW5nIENPRkYgZm9ybWF0IG91dHB1dDsgd2hlbgotQGNvZGV7QHZhbHVle0FTfX0gaXMgZ2VuZXJhdGluZyBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0Ci1pZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBUZXh0Ci1Ac2VjdGlvbiBAY29kZXsudGV4dCBAdmFye3N1YnNlY3Rpb259fQotCi1AY2luZGV4IEBjb2Rle3RleHR9IGRpcmVjdGl2ZQotVGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIG9udG8gdGhlIGVuZCBvZgotdGhlIHRleHQgc3Vic2VjdGlvbiBudW1iZXJlZCBAdmFye3N1YnNlY3Rpb259LCB3aGljaCBpcyBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbi4gIElmIEB2YXJ7c3Vic2VjdGlvbn0gaXMgb21pdHRlZCwgc3Vic2VjdGlvbiBudW1iZXIgemVybwotaXMgdXNlZC4KLQotQG5vZGUgVGl0bGUKLUBzZWN0aW9uIEBjb2Rley50aXRsZSAiQHZhcntoZWFkaW5nfSJ9Ci0KLUBjaW5kZXggQGNvZGV7dGl0bGV9IGRpcmVjdGl2ZQotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2w6IHRpdGxlIGxpbmUKLVVzZSBAdmFye2hlYWRpbmd9IGFzIHRoZSB0aXRsZSAoc2Vjb25kIGxpbmUsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQotc291cmNlIGZpbGUgbmFtZSBhbmQgcGFnZW51bWJlcikgd2hlbiBnZW5lcmF0aW5nIGFzc2VtYmx5IGxpc3RpbmdzLgotCi1UaGlzIGRpcmVjdGl2ZSBhZmZlY3RzIHN1YnNlcXVlbnQgcGFnZXMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgcGFnZSBpZgotaXQgYXBwZWFycyB3aXRoaW4gdGVuIGxpbmVzIG9mIHRoZSB0b3Agb2YgYSBwYWdlLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgVHlwZQotQHNlY3Rpb24gQGNvZGV7LnR5cGUgQHZhcntpbnR9fQotCi1AY2luZGV4IENPRkYgc3ltYm9sIHR5cGUKLUBjaW5kZXggc3ltYm9sIHR5cGUsIENPRkYKLUBjaW5kZXggQGNvZGV7dHlwZX0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSwgcGVybWl0dGVkIG9ubHkgd2l0aGluIEBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMsCi1yZWNvcmRzIHRoZSBpbnRlZ2VyIEB2YXJ7aW50fSBhcyB0aGUgdHlwZSBhdHRyaWJ1dGUgb2YgYSBzeW1ib2wgdGFibGUgZW50cnkuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsudHlwZX0gaXMgYXNzb2NpYXRlZCBvbmx5IHdpdGggQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvciBAY29kZXtiLm91dH0gb3V0cHV0LCBpdCBhY2NlcHRzIHRoaXMKLWRpcmVjdGl2ZSBidXQgaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIFZhbAotQHNlY3Rpb24gQGNvZGV7LnZhbCBAdmFye2FkZHJ9fQotCi1AY2luZGV4IEBjb2Rle3ZhbH0gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgdmFsdWUgYXR0cmlidXRlCi1AY2luZGV4IHZhbHVlIGF0dHJpYnV0ZSwgQ09GRgotVGhpcyBkaXJlY3RpdmUsIHBlcm1pdHRlZCBvbmx5IHdpdGhpbiBAY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXJzLAotcmVjb3JkcyB0aGUgYWRkcmVzcyBAdmFye2FkZHJ9IGFzIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YgYSBzeW1ib2wgdGFibGUKLWVudHJ5LgotQGlmc2V0IEJPVVQKLQotQHNhbXB7LnZhbH0gaXMgdXNlZCBvbmx5IGZvciBDT0ZGIG91dHB1dDsgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcwotY29uZmlndXJlZCBmb3IgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBVbGViMTI4Ci1Ac2VjdGlvbiBAY29kZXsudWxlYjEyOCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXt1bGViMTI4fSBkaXJlY3RpdmUKLUB2YXJ7dWxlYjEyOH0gc3RhbmRzIGZvciBgYHVuc2lnbmVkIGxpdHRsZSBlbmRpYW4gYmFzZSAxMjguJycgIFRoaXMgaXMgYSAKLWNvbXBhY3QsIHZhcmlhYmxlIGxlbmd0aCByZXByZXNlbnRhdGlvbiBvZiBudW1iZXJzIHVzZWQgYnkgdGhlIERXQVJGCi1zeW1ib2xpYyBkZWJ1Z2dpbmcgZm9ybWF0LiAgQHhyZWZ7U2xlYjEyOCxAY29kZXsuc2xlYjEyOH19LgotCi1AaWZzZXQgRUxGCi1Abm9kZSBWaXNpYmlsaXR5Ci1Ac2VjdGlvbiBAY29kZXsuaW50ZXJuYWx9LCBAY29kZXsuaGlkZGVufSwgQGNvZGV7LnByb3RlY3RlZH0KLUBjaW5kZXggQGNvZGV7aW50ZXJuYWx9IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtoaWRkZW59IGRpcmVjdGl2ZQotQGNpbmRleCBAY29kZXtwcm90ZWN0ZWR9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wgdmlzaWJpbGl0eQotCi1UaGVzZSBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgdmlzaWJpbGl0eSBvZiBhIHNwZWNpZmllZCBzeW1ib2wuICBCeQotZGVmYXVsdCBhIHN5bWJvbCdzIHZpc2liaWxpdHkgaXMgc2V0IGJ5IGl0cyBiaW5kaW5nIChsb2NhbCwgZ2xvYmFsIG9yIHdlYWspLAotYnV0IHRoZXNlIGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhhdC4KLQotQSB2aXNpYmlsaXR5IG9mIEBjb2Rle3Byb3RlY3RlZH0gbWVhbnMgdGhhdCBhbnkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGZyb20KLXdpdGhpbiB0aGUgY29tcG9uZW50IHRoYXQgZGVmaW5lcyB0aGUgc3ltYm9sIG11c3QgYmUgcmVzb2x2ZWQgdG8gdGhlIGRlZmluaXRpb24KLWluIHRoYXQgY29tcG9uZW50LCBldmVuIGlmIGEgZGVmaW5pdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCB3b3VsZCBub3JtYWxseQotcHJlZW1wdCB0aGlzLgotCi1BIHZpc2liaWxpdHkgb2YgQGNvZGV7aGlkZGVufSBtZWFucyB0aGF0IHRoZSBzeW1ib2wgaXMgbm90IHZpc2libGUgdG8gb3RoZXIgCi1jb21wb25lbnRzLiAgU3VjaCBhIHN5bWJvbCBpcyBhbHdheXMgY29uc2lkZXJlZCB0byBiZSBwcm90ZWN0ZWQgYXMgd2VsbC4KLQotQSB2aXNpYmlsaXR5IG9mIEBjb2Rle2ludGVybmFsfSBpcyB0aGUgc2FtZSBhcyBhIHZpc2liaWxpdHkgb2YgQGNvZGV7aGlkZGVufSwKLWV4Y2VwdCB0aGF0IHNvbWUgZXh0cmEsIHByb2Nlc3NvciBzcGVjaWZpYyBwcm9jZXNzaW5nIG11c3QgYWxzbyBiZSBwZXJmb3JtZWQKLXVwb24gdGhlIHN5bWJvbC4gCi0KLUZvciBFTEYgdGFyZ2V0cywgdGhlIGRpcmVjdGl2ZXMgYXJlIHVzZWQgbGlrZSB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi0uaW50ZXJuYWwgQHZhcntuYW1lfQotLmhpZGRlbiBAdmFye25hbWV9Ci0ucHJvdGVjdGVkIEB2YXJ7bmFtZX0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBlbmQgaWZzZXQKLQotQG5vZGUgV29yZAotQHNlY3Rpb24gQGNvZGV7LndvcmQgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBleHBlY3RzIHplcm8gb3IgbW9yZSBAdmFye2V4cHJlc3Npb25zfSwgb2YgYW55IHNlY3Rpb24sCi1zZXBhcmF0ZWQgYnkgY29tbWFzLgotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IFczMgotRm9yIGVhY2ggZXhwcmVzc2lvbiwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMgYSAzMi1iaXQgbnVtYmVyLgotQGVuZCBpZnNldAotQGlmc2V0IFcxNgotRm9yIGVhY2ggZXhwcmVzc2lvbiwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMgYSAxNi1iaXQgbnVtYmVyLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AaWZzZXQgR0VORVJJQwotCi1UaGUgc2l6ZSBvZiB0aGUgbnVtYmVyIGVtaXR0ZWQsIGFuZCBpdHMgYnl0ZSBvcmRlciwKLWRlcGVuZCBvbiB3aGF0IHRhcmdldCBjb21wdXRlciB0aGUgYXNzZW1ibHkgaXMgZm9yLgotQGVuZCBpZnNldAotCi1AYyBvbiBhbWQyOWssIGk5NjAsIHNwYXJjIHRoZSAic3BlY2lhbCB0cmVhdG1lbnQgdG8gc3VwcG9ydCBjb21waWxlcnMiIGRvZXNuJ3QKLUBjIGhhcHBlbi0tLTMyLWJpdCBhZGRyZXNzYWJpbGl0eSwgcGVyaW9kOyBubyBsb25nL3Nob3J0IGp1bXBzLgotQGlmc2V0IERJRkYtVEJMLUtMVUdFCi1AY2luZGV4IGRpZmZlcmVuY2UgdGFibGVzIGFsdGVyZWQKLUBjaW5kZXggYWx0ZXJlZCBkaWZmZXJlbmNlIHRhYmxlcwotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzogU3BlY2lhbCBUcmVhdG1lbnQgdG8gc3VwcG9ydCBDb21waWxlcnN9Ci1AZW5kIHF1b3RhdGlvbgotCi1AaWZzZXQgR0VORVJJQwotTWFjaGluZXMgd2l0aCBhIDMyLWJpdCBhZGRyZXNzIHNwYWNlLCBidXQgdGhhdCBkbyBsZXNzIHRoYW4gMzItYml0Ci1hZGRyZXNzaW5nLCByZXF1aXJlIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCB0cmVhdG1lbnQuICBJZiB0aGUgbWFjaGluZSBvZgotaW50ZXJlc3QgdG8geW91IGRvZXMgMzItYml0IGFkZHJlc3NpbmcgKG9yIGRvZXNuJ3QgcmVxdWlyZSBpdDsKLUBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30pLCB5b3UgY2FuIGlnbm9yZSB0aGlzIGlzc3VlLgotCi1AZW5kIGlmc2V0Ci1JbiBvcmRlciB0byBhc3NlbWJsZSBjb21waWxlciBvdXRwdXQgaW50byBzb21ldGhpbmcgdGhhdCB3b3JrcywKLUBjb2Rle0B2YWx1ZXtBU319IG9jY2FzaW9ubGx5IGRvZXMgc3RyYW5nZSB0aGluZ3MgdG8gQHNhbXB7LndvcmR9IGRpcmVjdGl2ZXMuCi1EaXJlY3RpdmVzIG9mIHRoZSBmb3JtIEBzYW1wey53b3JkIHN5bTEtc3ltMn0gYXJlIG9mdGVuIGVtaXR0ZWQgYnkKLWNvbXBpbGVycyBhcyBwYXJ0IG9mIGp1bXAgdGFibGVzLiAgVGhlcmVmb3JlLCB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGFzc2VtYmxlcyBhCi1kaXJlY3RpdmUgb2YgdGhlIGZvcm0gQHNhbXB7LndvcmQgc3ltMS1zeW0yfSwgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLUBjb2Rle3N5bTF9IGFuZCBAY29kZXtzeW0yfSBkb2VzIG5vdCBmaXQgaW4gMTYgYml0cywgQGNvZGV7QHZhbHVle0FTfX0KLWNyZWF0ZXMgYSBAZGZue3NlY29uZGFyeSBqdW1wIHRhYmxlfSwgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBuZXh0IGxhYmVsLgotVGhpcyBzZWNvbmRhcnkganVtcCB0YWJsZSBpcyBwcmVjZWRlZCBieSBhIHNob3J0LWp1bXAgdG8gdGhlCi1maXJzdCBieXRlIGFmdGVyIHRoZSBzZWNvbmRhcnkgdGFibGUuICBUaGlzIHNob3J0LWp1bXAgcHJldmVudHMgdGhlIGZsb3cKLW9mIGNvbnRyb2wgZnJvbSBhY2NpZGVudGFsbHkgZmFsbGluZyBpbnRvIHRoZSBuZXcgdGFibGUuICBJbnNpZGUgdGhlCi10YWJsZSBpcyBhIGxvbmctanVtcCB0byBAY29kZXtzeW0yfS4gIFRoZSBvcmlnaW5hbCBAc2FtcHsud29yZH0KLWNvbnRhaW5zIEBjb2Rle3N5bTF9IG1pbnVzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb25nLWp1bXAgdG8KLUBjb2Rle3N5bTJ9LgotCi1JZiB0aGVyZSB3ZXJlIHNldmVyYWwgb2NjdXJyZW5jZXMgb2YgQHNhbXB7LndvcmQgc3ltMS1zeW0yfSBiZWZvcmUgdGhlCi1zZWNvbmRhcnkganVtcCB0YWJsZSwgYWxsIG9mIHRoZW0gYXJlIGFkanVzdGVkLiAgSWYgdGhlcmUgd2FzIGEKLUBzYW1wey53b3JkIHN5bTMtc3ltNH0sIHRoYXQgYWxzbyBkaWQgbm90IGZpdCBpbiBzaXh0ZWVuIGJpdHMsIGEKLWxvbmctanVtcCB0byBAY29kZXtzeW00fSBpcyBpbmNsdWRlZCBpbiB0aGUgc2Vjb25kYXJ5IGp1bXAgdGFibGUsCi1hbmQgdGhlIEBjb2Rley53b3JkfSBkaXJlY3RpdmVzIGFyZSBhZGp1c3RlZCB0byBjb250YWluIEBjb2Rle3N5bTN9Ci1taW51cyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9uZy1qdW1wIHRvIEBjb2Rle3N5bTR9OyBhbmQgc28gb24sIGZvciBhcyBtYW55Ci1lbnRyaWVzIGluIHRoZSBvcmlnaW5hbCBqdW1wIHRhYmxlIGFzIG5lY2Vzc2FyeS4KLQotQGlmc2V0IElOVEVSTkFMUwotQGVtcGh7VGhpcyBmZWF0dXJlIG1heSBiZSBkaXNhYmxlZCBieSBjb21waWxpbmcgQGNvZGV7QHZhbHVle0FTfX0gd2l0aCB0aGUKLUBzYW1wey1EV09SS0lOR19ET1RfV09SRH0gb3B0aW9uLn0gVGhpcyBmZWF0dXJlIGlzIGxpa2VseSB0byBjb25mdXNlCi1hc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtbWVycy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLUBjIGVuZCAgICAgRElGRi1UQkwtS0xVR0UKLQotQG5vZGUgRGVwcmVjYXRlZAotQHNlY3Rpb24gRGVwcmVjYXRlZCBEaXJlY3RpdmVzCi0KLUBjaW5kZXggZGVwcmVjYXRlZCBkaXJlY3RpdmVzCi1AY2luZGV4IG9ic29sZXNjZW50IGRpcmVjdGl2ZXMKLU9uZSBkYXkgdGhlc2UgZGlyZWN0aXZlcyB3b24ndCB3b3JrLgotVGhleSBhcmUgaW5jbHVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBhc3NlbWJsZXJzLgotQHRhYmxlIEB0Ci1AaXRlbSAuYWJvcnQKLUBpdGVtIC5saW5lCi1AZW5kIHRhYmxlCi0KLUBpZnNldCBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBtYWNoaW5lIGRlcGVuZGVuY2llcwotVGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0cyBhcmUgKGFsbW9zdCBieSBkZWZpbml0aW9uKSBkaWZmZXJlbnQgb24KLWVhY2ggbWFjaGluZSB3aGVyZSBAY29kZXtAdmFsdWV7QVN9fSBydW5zLiAgRmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb25zCi12YXJ5IGFzIHdlbGwsIGFuZCBAY29kZXtAdmFsdWV7QVN9fSBvZnRlbiBzdXBwb3J0cyBhIGZldyBhZGRpdGlvbmFsCi1kaXJlY3RpdmVzIG9yIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLWFzc2VtYmxlcnMgb24gYSBwYXJ0aWN1bGFyIHBsYXRmb3JtLiAgRmluYWxseSwgc29tZSB2ZXJzaW9ucyBvZgotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydCBzcGVjaWFsIHBzZXVkby1pbnN0cnVjdGlvbnMgZm9yIGJyYW5jaAotb3B0aW1pemF0aW9uLgotCi1UaGlzIGNoYXB0ZXIgZGlzY3Vzc2VzIG1vc3Qgb2YgdGhlc2UgZGlmZmVyZW5jZXMsIHRob3VnaCBpdCBkb2VzIG5vdAotaW5jbHVkZSBkZXRhaWxzIG9uIGFueSBtYWNoaW5lJ3MgaW5zdHJ1Y3Rpb24gc2V0LiAgRm9yIGRldGFpbHMgb24gdGhhdAotc3ViamVjdCwgc2VlIHRoZSBoYXJkd2FyZSBtYW51ZmFjdHVyZXIncyBtYW51YWwuCi0KLUBtZW51Ci1AaWZzZXQgQTI5SwotKiBBTUQyOUstRGVwZW5kZW50OjogICAgICAgICAgICBBTUQgMjlLIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotKiBBUkMtRGVwZW5kZW50OjogICAgICAgICAgICAgICBBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJNCi0qIEFSTS1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBEMTBWCi0qIEQxMFYtRGVwZW5kZW50OjogICAgICAgICAgICAgIEQxMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgRDMwVgotKiBEMzBWLURlcGVuZGVudDo6ICAgICAgICAgICAgICBEMzBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEg4LzMwMAotKiBIOC8zMDAtRGVwZW5kZW50OjogICAgICAgICAgICBIaXRhY2hpIEg4LzMwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC81MDAKLSogSDgvNTAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC81MDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSFBQQQotKiBIUFBBLURlcGVuZGVudDo6ICAgICAgICAgICAgICBIUFBBIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEkzNzAKLSogRVNBLzM5MC1EZXBlbmRlbnQ6OiAgICAgICAgICAgSUJNIEVTQS8zOTAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTgwMzg2Ci0qIGkzODYtRGVwZW5kZW50OjogICAgICAgICAgICAgIEludGVsIDgwMzg2IERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLSogaTk2MC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgSW50ZWwgODA5NjAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgTTY4MFgwCi0qIE02OEstRGVwZW5kZW50OjogICAgICAgICAgICAgIE02ODB4MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBNSVBTCi0qIE1JUFMtRGVwZW5kZW50OjogICAgICAgICAgICAgIE1JUFMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU0gKLSogU0gtRGVwZW5kZW50OjogICAgICAgICAgICAgICAgSGl0YWNoaSBTSCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBQSgotKiBQSi1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgICBwaWNvSmF2YSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBTUEFSQwotKiBTcGFyYy1EZXBlbmRlbnQ6OiAgICAgICAgICAgICBTUEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBWODUwCi0qIFY4NTAtRGVwZW5kZW50OjogICAgICAgICAgICAgIFY4NTAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLSogWjgwMDAtRGVwZW5kZW50OjogICAgICAgICAgICAgWjgwMDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgVkFYCi0qIFZheC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgIFZBWCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBlbmQgbWVudQotCi1AbG93ZXJzZWN0aW9ucwotQGVuZCBpZnNldAotCi1AYyBUaGUgZm9sbG93aW5nIG1ham9yIG5vZGVzIGFyZSAqc2VjdGlvbnMqIGluIHRoZSBHRU5FUklDIHZlcnNpb24sICpjaGFwdGVycyoKLUBjIGluIHNpbmdsZS1jcHUgdmVyc2lvbnMuICBUaGlzIGlzIG1haW5seSBhY2hpZXZlZCBieSBAbG93ZXJzZWN0aW9ucy4gIFRoZXJlIGlzIGEKLUBjIHBlY3VsaWFyaXR5OiB0byBwcmVzZXJ2ZSBjcm9zcy1yZWZlcmVuY2VzLCB0aGVyZSBtdXN0IGJlIGEgbm9kZSBjYWxsZWQKLUBjICJNYWNoaW5lIERlcGVuZGVuY2llcyIuICBIZW5jZSB0aGUgY29uZGl0aW9uYWwgbm9kZW5hbWVzIGluIGVhY2gKLUBjIG1ham9yIG5vZGUgYmVsb3cuICBOb2RlIGRlZmF1bHRpbmcgaW4gbWFrZWluZm8gcmVxdWlyZXMgYWRqYWNlbmN5IG9mCi1AYyBub2RlIGFuZCBzZWN0aW9uaW5nIGNvbW1hbmRzOyBoZW5jZSB0aGUgcmVwZXRpdGlvbiBvZiBAY2hhcHRlciBCTEFICi1AYyBpbiBib3RoIGNvbmRpdGlvbmFsIGJsb2Nrcy4KLQotQGlmc2V0IEFSQwotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBBUkMtRGVwZW5kZW50Ci1AY2hhcHRlciBBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggQVJDIHN1cHBvcnQKLUBtZW51Ci0qIEFSQy1PcHRzOjogICAgICAgICAgICAgICAgICAgIE9wdGlvbnMKLSogQVJDLUZsb2F0OjogICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogQVJDLURpcmVjdGl2ZXM6OiAgICAgICAgICAgICAgU3BhcmMgTWFjaGluZSBEaXJlY3RpdmVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQVJDLU9wdHMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zIGZvciBBUkMKLUBjaW5kZXggQVJDIG9wdGlvbnMKLUBjaW5kZXggYXJjaGl0ZWN0dXJlcywgQVJDCi1AY2luZGV4IEFSQyBhcmNoaXRlY3R1cmVzCi1UaGUgQVJDIGNoaXAgZmFtaWx5IGluY2x1ZGVzIHNldmVyYWwgc3VjY2Vzc2l2ZSBsZXZlbHMgKG9yIG90aGVyCi12YXJpYW50cykgb2YgY2hpcCwgdXNpbmcgdGhlIHNhbWUgY29yZSBpbnN0cnVjdGlvbiBzZXQsIGJ1dCBpbmNsdWRpbmcKLWEgZmV3IGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGF0IGVhY2ggbGV2ZWwuCi0KLUJ5IGRlZmF1bHQsIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgdGhlIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0IChBUkMKLWJhc2UpLiAgVGhlIEBjb2Rley5jcHV9IHBzZXVkby1vcCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHNlbGVjdAotdGhlIHZhcmlhbnQuCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXstbWJpZy1lbmRpYW59IG9wdGlvbiAoQVJDKQotQGNpbmRleCBAY29kZXstbWxpdHRsZS1lbmRpYW59IG9wdGlvbiAoQVJDKQotQGNpbmRleCBBUkMgYmlnLWVuZGlhbiBvdXRwdXQKLUBjaW5kZXggQVJDIGxpdHRsZS1lbmRpYW4gb3V0cHV0Ci1AY2luZGV4IGJpZy1lbmRpYW4gb3V0cHV0LCBBUkMKLUBjaW5kZXggbGl0dGxlLWVuZGlhbiBvdXRwdXQsIEFSQwotQGl0ZW0gLW1iaWctZW5kaWFuCi1AaXRlbXggLW1saXR0bGUtZW5kaWFuCi1BbnkgQHNje2FyY30gY29uZmlndXJhdGlvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBjYW4gc2VsZWN0IGJpZy1lbmRpYW4gb3IKLWxpdHRsZS1lbmRpYW4gb3V0cHV0IGF0IHJ1biB0aW1lICh1bmxpa2UgbW9zdCBvdGhlciBAc2N7Z251fSBkZXZlbG9wbWVudAotdG9vbHMsIHdoaWNoIG11c3QgYmUgY29uZmlndXJlZCBmb3Igb25lIG9yIHRoZSBvdGhlcikuICBVc2UKLUBzYW1wey1tYmlnLWVuZGlhbn0gdG8gc2VsZWN0IGJpZy1lbmRpYW4gb3V0cHV0LCBhbmQgQHNhbXB7LW1saXR0bGUtZW5kaWFufQotZm9yIGxpdHRsZS1lbmRpYW4uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEFSQy1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgQVJDIChAc2N7aWVlZX0pCi1AY2luZGV4IEFSQyBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEFSQyBjcHUgZmFtaWx5IGN1cnJlbnRseSBkb2VzIG5vdCBoYXZlIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50Ci1zdXBwb3J0LiAgU29mdHdhcmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBpcyBwcm92aWRlZCBieSBAY29kZXtHQ0N9Ci1hbmQgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgQVJDLURpcmVjdGl2ZXMKLUBzZWN0aW9uIEFSQyBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBBUkMgbWFjaGluZSBkaXJlY3RpdmVzCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgQVJDCi1UaGUgQVJDIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsCi1tYWNoaW5lIGRpcmVjdGl2ZXM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLmNwdQotQGNpbmRleCBAY29kZXtjcHV9IGRpcmVjdGl2ZSwgU1BBUkMKLVRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgZGVzaXJlZCBjcHUuCi1UaGUgQVJDIGlzIGludGVuZGVkIHRvIGJlIGN1c3RvbWl6YWJsZSwgQGNvZGV7LmNwdX0gaXMgdXNlZCB0bwotc2VsZWN0IHRoZSBkZXNpcmVkIHZhcmlhbnQgW3Rob3VnaCBjdXJyZW50bHkgdGhlcmUgYXJlIG5vbmVdLgotCi1AZW5kIHRhYmxlCi0KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEEyOUsKLUBpbmNsdWRlIGMtYTI5ay50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBBUk0KLUBpbmNsdWRlIGMtYXJtLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhpdGFjaGktYWxsCi1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKLQotVGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0cyBhcmUgZGlmZmVyZW50IG9uIGVhY2ggSGl0YWNoaSBjaGlwIGZhbWlseSwKLWFuZCB0aGVyZSBhcmUgYWxzbyBzb21lIHN5bnRheCBkaWZmZXJlbmNlcyBhbW9uZyB0aGUgZmFtaWxpZXMuICBUaGlzCi1jaGFwdGVyIGRlc2NyaWJlcyB0aGUgc3BlY2lmaWMgQGNvZGV7QHZhbHVle0FTfX0gZmVhdHVyZXMgZm9yIGVhY2gKLWZhbWlseS4KLQotQG1lbnUKLSogSDgvMzAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC8zMDAgRGVwZW5kZW50IEZlYXR1cmVzCi0qIEg4LzUwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgIEhpdGFjaGkgSDgvNTAwIERlcGVuZGVudCBGZWF0dXJlcwotKiBTSC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgICBIaXRhY2hpIFNIIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBtZW51Ci1AbG93ZXJzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBEMTBWCi1AaW5jbHVkZSBjLWQxMHYudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgRDMwVgotQGluY2x1ZGUgYy1kMzB2LnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEg4LzMwMAotQGluY2x1ZGUgYy1oODMwMC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIOC81MDAKLUBpbmNsdWRlIGMtaDg1MDAudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSFBQQQotQGluY2x1ZGUgYy1ocHBhLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEkzNzAKLUBpbmNsdWRlIGMtaTM3MC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBJODAzODYKLUBpbmNsdWRlIGMtaTM4Ni50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBJOTYwCi1AaW5jbHVkZSBjLWk5NjAudGV4aQotQGVuZCBpZnNldAotCi0KLUBpZnNldCBNNjgwWDAKLUBpbmNsdWRlIGMtbTY4ay50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBNSVBTCi1AaW5jbHVkZSBjLW1pcHMudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgTlMzMksKLUBpbmNsdWRlIGMtbnMzMmsudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgUEoKLUBpbmNsdWRlIGMtcGoudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgU0gKLUBpbmNsdWRlIGMtc2gudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgU1BBUkMKLUBpbmNsdWRlIGMtc3BhcmMudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgWjgwMDAKLUBpbmNsdWRlIGMtejhrLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFZBWAotQGluY2x1ZGUgYy12YXgudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgVjg1MAotQGluY2x1ZGUgYy12ODUwLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEdFTkVSSUMKLUBjIHJldmVyc2UgZWZmZWN0IG9mIEBkb3duIGF0IHRvcCBvZiBnZW5lcmljIE1hY2hpbmUtRGVwIGNoYXB0ZXIKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFJlcG9ydGluZyBCdWdzCi1AY2hhcHRlciBSZXBvcnRpbmcgQnVncwotQGNpbmRleCBidWdzIGluIGFzc2VtYmxlcgotQGNpbmRleCByZXBvcnRpbmcgYnVncyBpbiBhc3NlbWJsZXIKLQotWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyBAY29kZXtAdmFsdWV7QVN9fSByZWxpYWJsZS4KLQotUmVwb3J0aW5nIGEgYnVnIG1heSBoZWxwIHlvdSBieSBicmluZ2luZyBhIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbSwgb3IgaXQgbWF5Ci1ub3QuICBCdXQgaW4gYW55IGNhc2UgdGhlIHByaW5jaXBhbCBmdW5jdGlvbiBvZiBhIGJ1ZyByZXBvcnQgaXMgdG8gaGVscCB0aGUKLWVudGlyZSBjb21tdW5pdHkgYnkgbWFraW5nIHRoZSBuZXh0IHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gd29yayBiZXR0ZXIuCi1CdWcgcmVwb3J0cyBhcmUgeW91ciBjb250cmlidXRpb24gdG8gdGhlIG1haW50ZW5hbmNlIG9mIEBjb2Rle0B2YWx1ZXtBU319LgotCi1JbiBvcmRlciBmb3IgYSBidWcgcmVwb3J0IHRvIHNlcnZlIGl0cyBwdXJwb3NlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotaW5mb3JtYXRpb24gdGhhdCBlbmFibGVzIHVzIHRvIGZpeCB0aGUgYnVnLgotCi1AbWVudQotKiBCdWcgQ3JpdGVyaWE6OiAgICAgICAgICAgICAgICBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLSogQnVnIFJlcG9ydGluZzo6ICAgICAgICAgICAgICAgSG93IHRvIHJlcG9ydCBidWdzCi1AZW5kIG1lbnUKLQotQG5vZGUgQnVnIENyaXRlcmlhCi1Ac2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLUBjaW5kZXggYnVnIGNyaXRlcmlhCi0KLUlmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AY2luZGV4IGZhdGFsIHNpZ25hbAotQGNpbmRleCBhc3NlbWJsZXIgY3Jhc2gKLUBjaW5kZXggY3Jhc2ggb2YgYXNzZW1ibGVyCi1AaXRlbQotSWYgdGhlIGFzc2VtYmxlciBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzIGEKLUBjb2Rle0B2YWx1ZXtBU319IGJ1Zy4gIFJlbGlhYmxlIGFzc2VtYmxlcnMgbmV2ZXIgY3Jhc2guCi0KLUBjaW5kZXggZXJyb3Igb24gdmFsaWQgaW5wdXQKLUBpdGVtCi1JZiBAY29kZXtAdmFsdWV7QVN9fSBwcm9kdWNlcyBhbiBlcnJvciBtZXNzYWdlIGZvciB2YWxpZCBpbnB1dCwgdGhhdCBpcyBhIGJ1Zy4KLQotQGNpbmRleCBpbnZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0LCB0aGF0Ci1pcyBhIGJ1Zy4gIEhvd2V2ZXIsIHlvdSBzaG91bGQgbm90ZSB0aGF0IHlvdXIgaWRlYSBvZiBgYGludmFsaWQgaW5wdXQnJyBtaWdodAotYmUgb3VyIGlkZWEgb2YgYGBhbiBleHRlbnNpb24nJyBvciBgYHN1cHBvcnQgZm9yIHRyYWRpdGlvbmFsIHByYWN0aWNlJycuCi0KLUBpdGVtCi1JZiB5b3UgYXJlIGFuIGV4cGVyaWVuY2VkIHVzZXIgb2YgYXNzZW1ibGVycywgeW91ciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQKLW9mIEBjb2Rle0B2YWx1ZXtBU319IGFyZSB3ZWxjb21lIGluIGFueSBjYXNlLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEJ1ZyBSZXBvcnRpbmcKLUBzZWN0aW9uIEhvdyB0byByZXBvcnQgYnVncwotQGNpbmRleCBidWcgcmVwb3J0cwotQGNpbmRleCBhc3NlbWJsZXIgYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0gcHJvZHVjdHMuICBJZgoteW91IG9idGFpbmVkIEBjb2Rle0B2YWx1ZXtBU319IGZyb20gYSBzdXBwb3J0IG9yZ2FuaXphdGlvbiwgd2UgcmVjb21tZW5kIHlvdQotY29udGFjdCB0aGF0IG9yZ2FuaXphdGlvbiBmaXJzdC4KLQotWW91IGNhbiBmaW5kIGNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3VwcG9ydCBjb21wYW5pZXMgYW5kCi1pbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBAZmlsZXtldGMvU0VSVklDRX0gaW4gdGhlIEBzY3tnbnV9IEVtYWNzCi1kaXN0cmlidXRpb24uCi0KLUluIGFueSBldmVudCwgd2UgYWxzbyByZWNvbW1lbmQgdGhhdCB5b3Ugc2VuZCBidWcgcmVwb3J0cyBmb3IgQGNvZGV7QHZhbHVle0FTfX0KLXRvIEBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9LgotCi1UaGUgZnVuZGFtZW50YWwgcHJpbmNpcGxlIG9mIHJlcG9ydGluZyBidWdzIHVzZWZ1bGx5IGlzIHRoaXM6Ci1Ac3Ryb25ne3JlcG9ydCBhbGwgdGhlIGZhY3RzfS4gIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhCi1mYWN0IG9yIGxlYXZlIGl0IG91dCwgc3RhdGUgaXQhCi0KLU9mdGVuIHBlb3BsZSBvbWl0IGZhY3RzIGJlY2F1c2UgdGhleSB0aGluayB0aGV5IGtub3cgd2hhdCBjYXVzZXMgdGhlIHByb2JsZW0KLWFuZCBhc3N1bWUgdGhhdCBzb21lIGRldGFpbHMgZG8gbm90IG1hdHRlci4gIFRodXMsIHlvdSBtaWdodCBhc3N1bWUgdGhhdCB0aGUKLW5hbWUgb2YgYSBzeW1ib2wgeW91IHVzZSBpbiBhbiBleGFtcGxlIGRvZXMgbm90IG1hdHRlci4gIFdlbGwsIHByb2JhYmx5IGl0IGRvZXMKLW5vdCwgYnV0IG9uZSBjYW5ub3QgYmUgc3VyZS4gIFBlcmhhcHMgdGhlIGJ1ZyBpcyBhIHN0cmF5IG1lbW9yeSByZWZlcmVuY2Ugd2hpY2gKLWhhcHBlbnMgdG8gZmV0Y2ggZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUgdGhhdCBuYW1lIGlzIHN0b3JlZCBpbiBtZW1vcnk7Ci1wZXJoYXBzLCBpZiB0aGUgbmFtZSB3ZXJlIGRpZmZlcmVudCwgdGhlIGNvbnRlbnRzIG9mIHRoYXQgbG9jYXRpb24gd291bGQgZm9vbAotdGhlIGFzc2VtYmxlciBpbnRvIGRvaW5nIHRoZSByaWdodCB0aGluZyBkZXNwaXRlIHRoZSBidWcuICBQbGF5IGl0IHNhZmUgYW5kCi1naXZlIGEgc3BlY2lmaWMsIGNvbXBsZXRlIGV4YW1wbGUuICBUaGF0IGlzIHRoZSBlYXNpZXN0IHRoaW5nIGZvciB5b3UgdG8gZG8sCi1hbmQgdGhlIG1vc3QgaGVscGZ1bC4KLQotS2VlcCBpbiBtaW5kIHRoYXQgdGhlIHB1cnBvc2Ugb2YgYSBidWcgcmVwb3J0IGlzIHRvIGVuYWJsZSB1cyB0byBmaXggdGhlIGJ1ZyBpZgotaXQgaXMgbmV3IHRvIHVzLiAgVGhlcmVmb3JlLCBhbHdheXMgd3JpdGUgeW91ciBidWcgcmVwb3J0cyBvbiB0aGUgYXNzdW1wdGlvbgotdGhhdCB0aGUgYnVnIGhhcyBub3QgYmVlbiByZXBvcnRlZCBwcmV2aW91c2x5LgotCi1Tb21ldGltZXMgcGVvcGxlIGdpdmUgYSBmZXcgc2tldGNoeSBmYWN0cyBhbmQgYXNrLCBgYERvZXMgdGhpcyByaW5nIGEKLWJlbGw/JycgIFRob3NlIGJ1ZyByZXBvcnRzIGFyZSB1c2VsZXNzLCBhbmQgd2UgdXJnZSBldmVyeW9uZSB0bwotQGVtcGh7cmVmdXNlIHRvIHJlc3BvbmQgdG8gdGhlbX0gZXhjZXB0IHRvIGNoaWRlIHRoZSBzZW5kZXIgdG8gcmVwb3J0Ci1idWdzIHByb3Blcmx5LgotCi1UbyBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcsIHlvdSBzaG91bGQgaW5jbHVkZSBhbGwgdGhlc2UgdGhpbmdzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhlIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0uICBAY29kZXtAdmFsdWV7QVN9fSBhbm5vdW5jZXMgaXQgaWYgeW91IHN0YXJ0Ci1pdCB3aXRoIHRoZSBAc2FtcHstLXZlcnNpb259IGFyZ3VtZW50LgotCi1XaXRob3V0IHRoaXMsIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB0aGVyZSBpcyBhbnkgcG9pbnQgaW4gbG9va2luZyBmb3IKLXRoZSBidWcgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fS4KLQotQGl0ZW0KLUFueSBwYXRjaGVzIHlvdSBtYXkgaGF2ZSBhcHBsaWVkIHRvIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgQGNvZGV7QHZhbHVle0FTfX0tLS1lLmcuCi1gYEBjb2Rle2djYy0yLjd9JycuCi0KLUBpdGVtCi1UaGUgY29tbWFuZCBhcmd1bWVudHMgeW91IGdhdmUgdGhlIGFzc2VtYmxlciB0byBhc3NlbWJsZSB5b3VyIGV4YW1wbGUgYW5kCi1vYnNlcnZlIHRoZSBidWcuICBUbyBndWFyYW50ZWUgeW91IHdpbGwgbm90IG9taXQgc29tZXRoaW5nIGltcG9ydGFudCwgbGlzdCB0aGVtCi1hbGwuICBBIGNvcHkgb2YgdGhlIE1ha2VmaWxlIChvciB0aGUgb3V0cHV0IGZyb20gbWFrZSkgaXMgc3VmZmljaWVudC4KLQotSWYgd2Ugd2VyZSB0byB0cnkgdG8gZ3Vlc3MgdGhlIGFyZ3VtZW50cywgd2Ugd291bGQgcHJvYmFibHkgZ3Vlc3Mgd3JvbmcKLWFuZCB0aGVuIHdlIG1pZ2h0IG5vdCBlbmNvdW50ZXIgdGhlIGJ1Zy4KLQotQGl0ZW0KLUEgY29tcGxldGUgaW5wdXQgZmlsZSB0aGF0IHdpbGwgcmVwcm9kdWNlIHRoZSBidWcuICBJZiB0aGUgYnVnIGlzIG9ic2VydmVkIHdoZW4KLXRoZSBhc3NlbWJsZXIgaXMgaW52b2tlZCB2aWEgYSBjb21waWxlciwgc2VuZCB0aGUgYXNzZW1ibGVyIHNvdXJjZSwgbm90IHRoZQotaGlnaCBsZXZlbCBsYW5ndWFnZSBzb3VyY2UuICBNb3N0IGNvbXBpbGVycyB3aWxsIHByb2R1Y2UgdGhlIGFzc2VtYmxlciBzb3VyY2UKLXdoZW4gcnVuIHdpdGggdGhlIEBzYW1wey1TfSBvcHRpb24uICBJZiB5b3UgYXJlIHVzaW5nIEBjb2Rle0B2YWx1ZXtHQ0N9fSwgdXNlCi10aGUgb3B0aW9ucyBAc2FtcHstdiAtLXNhdmUtdGVtcHN9OyB0aGlzIHdpbGwgc2F2ZSB0aGUgYXNzZW1ibGVyIHNvdXJjZSBpbiBhCi1maWxlIHdpdGggYW4gZXh0ZW5zaW9uIG9mIEBmaWxley5zfSwgYW5kIGFsc28gc2hvdyB5b3UgZXhhY3RseSBob3cKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGJlaW5nIHJ1bi4KLQotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2Ygd2hhdCBiZWhhdmlvciB5b3Ugb2JzZXJ2ZSB0aGF0IHlvdSBiZWxpZXZlIGlzCi1pbmNvcnJlY3QuICBGb3IgZXhhbXBsZSwgYGBJdCBnZXRzIGEgZmF0YWwgc2lnbmFsLicnCi0KLU9mIGNvdXJzZSwgaWYgdGhlIGJ1ZyBpcyB0aGF0IEBjb2Rle0B2YWx1ZXtBU319IGdldHMgYSBmYXRhbCBzaWduYWwsIHRoZW4gd2UKLXdpbGwgY2VydGFpbmx5IG5vdGljZSBpdC4gIEJ1dCBpZiB0aGUgYnVnIGlzIGluY29ycmVjdCBvdXRwdXQsIHdlIG1pZ2h0IG5vdAotbm90aWNlIHVubGVzcyBpdCBpcyBnbGFyaW5nbHkgd3JvbmcuICBZb3UgbWlnaHQgYXMgd2VsbCBub3QgZ2l2ZSB1cyBhIGNoYW5jZSB0bwotbWFrZSBhIG1pc3Rha2UuCi0KLUV2ZW4gaWYgdGhlIHByb2JsZW0geW91IGV4cGVyaWVuY2UgaXMgYSBmYXRhbCBzaWduYWwsIHlvdSBzaG91bGQgc3RpbGwgc2F5IHNvCi1leHBsaWNpdGx5LiAgU3VwcG9zZSBzb21ldGhpbmcgc3RyYW5nZSBpcyBnb2luZyBvbiwgc3VjaCBhcywgeW91ciBjb3B5IG9mCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluIHRoZSBDCi1saWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodCBjcmFzaCBhbmQgb3Vycwotd291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbiBvdXJzIGZhaWxzIHRvIGNyYXNoLCB3ZQotd291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yIHVzLiAgSWYgeW91IGhhZCBub3QgdG9sZCB1cyB0bwotZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUgdG8gZHJhdyBhbnkgY29uY2x1c2lvbiBmcm9tIG91cgotb2JzZXJ2YXRpb25zLgotCi1AaXRlbQotSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UsIHNlbmQgdXMgY29udGV4dAotZGlmZnMsIGFzIGdlbmVyYXRlZCBieSBAY29kZXtkaWZmfSB3aXRoIHRoZSBAc2FtcHstdX0sIEBzYW1wey1jfSwgb3IgQHNhbXB7LXB9Ci1vcHRpb24uICBBbHdheXMgc2VuZCBkaWZmcyBmcm9tIHRoZSBvbGQgZmlsZSB0byB0aGUgbmV3IGZpbGUuICBJZiB5b3UgZXZlbgotZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle0B2YWx1ZXtBU319IHNvdXJjZSwgcmVmZXIgdG8gaXQgYnkgY29udGV4dCwgbm90Ci1ieSBsaW5lIG51bWJlci4KLQotVGhlIGxpbmUgbnVtYmVycyBpbiBvdXIgZGV2ZWxvcG1lbnQgc291cmNlcyB3aWxsIG5vdCBtYXRjaCB0aG9zZSBpbiB5b3VyCi1zb3VyY2VzLiAgWW91ciBsaW5lIG51bWJlcnMgd291bGQgY29udmV5IG5vIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB1cy4KLUBlbmQgaXRlbWl6ZQotCi1IZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGFyZSBub3QgbmVjZXNzYXJ5OgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQSBkZXNjcmlwdGlvbiBvZiB0aGUgZW52ZWxvcGUgb2YgdGhlIGJ1Zy4KLQotT2Z0ZW4gcGVvcGxlIHdobyBlbmNvdW50ZXIgYSBidWcgc3BlbmQgYSBsb3Qgb2YgdGltZSBpbnZlc3RpZ2F0aW5nCi13aGljaCBjaGFuZ2VzIHRvIHRoZSBpbnB1dCBmaWxlIHdpbGwgbWFrZSB0aGUgYnVnIGdvIGF3YXkgYW5kIHdoaWNoCi1jaGFuZ2VzIHdpbGwgbm90IGFmZmVjdCBpdC4KLQotVGhpcyBpcyBvZnRlbiB0aW1lIGNvbnN1bWluZyBhbmQgbm90IHZlcnkgdXNlZnVsLCBiZWNhdXNlIHRoZSB3YXkgd2UKLXdpbGwgZmluZCB0aGUgYnVnIGlzIGJ5IHJ1bm5pbmcgYSBzaW5nbGUgZXhhbXBsZSB1bmRlciB0aGUgZGVidWdnZXIKLXdpdGggYnJlYWtwb2ludHMsIG5vdCBieSBwdXJlIGRlZHVjdGlvbiBmcm9tIGEgc2VyaWVzIG9mIGV4YW1wbGVzLgotV2UgcmVjb21tZW5kIHRoYXQgeW91IHNhdmUgeW91ciB0aW1lIGZvciBzb21ldGhpbmcgZWxzZS4KLQotT2YgY291cnNlLCBpZiB5b3UgY2FuIGZpbmQgYSBzaW1wbGVyIGV4YW1wbGUgdG8gcmVwb3J0IEBlbXBoe2luc3RlYWR9Ci1vZiB0aGUgb3JpZ2luYWwgb25lLCB0aGF0IGlzIGEgY29udmVuaWVuY2UgZm9yIHVzLiAgRXJyb3JzIGluIHRoZQotb3V0cHV0IHdpbGwgYmUgZWFzaWVyIHRvIHNwb3QsIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyIHdpbGwgdGFrZQotbGVzcyB0aW1lLCBhbmQgc28gb24uCi0KLUhvd2V2ZXIsIHNpbXBsaWZpY2F0aW9uIGlzIG5vdCB2aXRhbDsgaWYgeW91IGRvIG5vdCB3YW50IHRvIGRvIHRoaXMsCi1yZXBvcnQgdGhlIGJ1ZyBhbnl3YXkgYW5kIHNlbmQgdXMgdGhlIGVudGlyZSB0ZXN0IGNhc2UgeW91IHVzZWQuCi0KLUBpdGVtCi1BIHBhdGNoIGZvciB0aGUgYnVnLgotCi1BIHBhdGNoIGZvciB0aGUgYnVnIGRvZXMgaGVscCB1cyBpZiBpdCBpcyBhIGdvb2Qgb25lLiAgQnV0IGRvIG5vdCBvbWl0Ci10aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0ZXN0IGNhc2UsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKLWEgcGF0Y2ggaXMgYWxsIHdlIG5lZWQuICBXZSBtaWdodCBzZWUgcHJvYmxlbXMgd2l0aCB5b3VyIHBhdGNoIGFuZCBkZWNpZGUKLXRvIGZpeCB0aGUgcHJvYmxlbSBhbm90aGVyIHdheSwgb3Igd2UgbWlnaHQgbm90IHVuZGVyc3RhbmQgaXQgYXQgYWxsLgotCi1Tb21ldGltZXMgd2l0aCBhIHByb2dyYW0gYXMgY29tcGxpY2F0ZWQgYXMgQGNvZGV7QHZhbHVle0FTfX0gaXQgaXMgdmVyeSBoYXJkIHRvCi1jb25zdHJ1Y3QgYW4gZXhhbXBsZSB0aGF0IHdpbGwgbWFrZSB0aGUgcHJvZ3JhbSBmb2xsb3cgYSBjZXJ0YWluIHBhdGggdGhyb3VnaAotdGhlIGNvZGUuICBJZiB5b3UgZG8gbm90IHNlbmQgdXMgdGhlIGV4YW1wbGUsIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gY29uc3RydWN0Ci1vbmUsIHNvIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gdmVyaWZ5IHRoYXQgdGhlIGJ1ZyBpcyBmaXhlZC4KLQotQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKLXBhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKLWhlbHAgdXMgdG8gdW5kZXJzdGFuZC4KLQotQGl0ZW0KLUEgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KLQotU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAotdGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEFja25vd2xlZGdlbWVudHMKLUBjaGFwdGVyIEFja25vd2xlZGdlbWVudHMKLQotSWYgeW91IGhhdmUgY29udHJpYnV0ZWQgdG8gQGNvZGV7QHZhbHVle0FTfX0gYW5kIHlvdXIgbmFtZSBpc24ndCBsaXN0ZWQgaGVyZSwKLWl0IGlzIG5vdCBtZWFudCBhcyBhIHNsaWdodC4gIFdlIGp1c3QgZG9uJ3Qga25vdyBhYm91dCBpdC4gIFNlbmQgbWFpbCB0byB0aGUKLW1haW50YWluZXIsIGFuZCB3ZSdsbCBjb3JyZWN0IHRoZSBzaXR1YXRpb24uICBDdXJyZW50bHkgCi1AYyAoSmFudWFyeSAxOTk0KSwgCi10aGUgbWFpbnRhaW5lciBpcyBLZW4gUmFlYnVybiAoZW1haWwgYWRkcmVzcyBAY29kZXtyYWVidXJuQEBjeWdudXMuY29tfSkuCi0KLURlYW4gRWxzbmVyIHdyb3RlIHRoZSBvcmlnaW5hbCBAc2N7Z251fSBhc3NlbWJsZXIgZm9yIHRoZSBWQVguQGZvb3Rub3Rle0FueQotbW9yZSBkZXRhaWxzP30KLQotSmF5IEZlbmxhc29uIG1haW50YWluZWQgR0FTIGZvciBhIHdoaWxlLCBhZGRpbmcgc3VwcG9ydCBmb3IgR0RCLXNwZWNpZmljIGRlYnVnCi1pbmZvcm1hdGlvbiBhbmQgdGhlIDY4ayBzZXJpZXMgbWFjaGluZXMsIG1vc3Qgb2YgdGhlIHByZXByb2Nlc3NpbmcgcGFzcywgYW5kCi1leHRlbnNpdmUgY2hhbmdlcyBpbiBAZmlsZXttZXNzYWdlcy5jfSwgQGZpbGV7aW5wdXQtZmlsZS5jfSwgQGZpbGV7d3JpdGUuY30uCi0KLUsuIFJpY2hhcmQgUGl4bGV5IG1haW50YWluZWQgR0FTIGZvciBhIHdoaWxlLCBhZGRpbmcgdmFyaW91cyBlbmhhbmNlbWVudHMgYW5kCi1tYW55IGJ1ZyBmaXhlcywgaW5jbHVkaW5nIG1lcmdpbmcgc3VwcG9ydCBmb3Igc2V2ZXJhbCBwcm9jZXNzb3JzLCBicmVha2luZyBHQVMKLXVwIHRvIGhhbmRsZSBtdWx0aXBsZSBvYmplY3QgZmlsZSBmb3JtYXQgYmFjayBlbmRzIChpbmNsdWRpbmcgaGVhdnkgcmV3cml0ZSwKLXRlc3RpbmcsIGFuIGludGVncmF0aW9uIG9mIHRoZSBjb2ZmIGFuZCBiLm91dCBiYWNrIGVuZHMpLCBhZGRpbmcgY29uZmlndXJhdGlvbgotaW5jbHVkaW5nIGhlYXZ5IHRlc3RpbmcgYW5kIHZlcmlmaWNhdGlvbiBvZiBjcm9zcyBhc3NlbWJsZXJzIGFuZCBmaWxlIHNwbGl0cwotYW5kIHJlbmFtaW5nLCBjb252ZXJ0ZWQgR0FTIHRvIHN0cmljdGx5IEFOU0kgQyBpbmNsdWRpbmcgZnVsbCBwcm90b3R5cGVzLCBhZGRlZAotc3VwcG9ydCBmb3IgbTY4MFszNF0wIGFuZCBjcHUzMiwgZGlkIGNvbnNpZGVyYWJsZSB3b3JrIG9uIGk5NjAgaW5jbHVkaW5nIGEgQ09GRgotcG9ydCAoaW5jbHVkaW5nIGNvbnNpZGVyYWJsZSBhbW91bnRzIG9mIHJldmVyc2UgZW5naW5lZXJpbmcpLCBhIFNQQVJDIG9wY29kZQotZmlsZSByZXdyaXRlLCBERUNzdGF0aW9uLCByczYwMDAsIGFuZCBocDMwMGhwdXggaG9zdCBwb3J0cywgdXBkYXRlZCBgYGtub3cnJwotYXNzZXJ0aW9ucyBhbmQgbWFkZSB0aGVtIHdvcmssIG11Y2ggb3RoZXIgcmVvcmdhbml6YXRpb24sIGNsZWFudXAsIGFuZCBsaW50LgotCi1LZW4gUmFlYnVybiB3cm90ZSB0aGUgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlIGNvZGUgdG8gcmVwbGFjZSBtb3N0IG9mIHRoZSBjb2RlCi1pbiBmb3JtYXQtc3BlY2lmaWMgSS9PIG1vZHVsZXMuCi0KLVRoZSBvcmlnaW5hbCBWTVMgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgRGF2aWQgTC4gS2FzaHRhbi4gIEVyaWMgWW91bmdkYWxlCi1oYXMgZG9uZSBtdWNoIHdvcmsgd2l0aCBpdCBzaW5jZS4KLQotVGhlIEludGVsIDgwMzg2IG1hY2hpbmUgZGVzY3JpcHRpb24gd2FzIHdyaXR0ZW4gYnkgRWxpb3QgRHJlc3NlbGhhdXMuCi0KLU1pbmggVHJhbi1MZSBhdCBJbnRlbGxpQ29ycCBjb250cmlidXRlZCBzb21lIEFJWCAzODYgc3VwcG9ydC4KLQotVGhlIE1vdG9yb2xhIDg4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyBjb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZiBCdWZmYWxvCi1Vbml2ZXJzaXR5IGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KLQotS2VpdGggS25vd2xlcyBhdCB0aGUgT3BlbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHdyb3RlIHRoZSBvcmlnaW5hbCBNSVBTIGJhY2sgZW5kCi0oQGZpbGV7dGMtbWlwcy5jfSwgQGZpbGV7dGMtbWlwcy5ofSksIGFuZCBjb250cmlidXRlZCBSb3NlIGZvcm1hdCBzdXBwb3J0Ci0od2hpY2ggaGFzbid0IGJlZW4gbWVyZ2VkIGluIHlldCkuICBSYWxwaCBDYW1wYmVsbCB3b3JrZWQgd2l0aCB0aGUgTUlQUyBjb2RlIHRvCi1zdXBwb3J0IGEub3V0IGZvcm1hdC4KLQotU3VwcG9ydCBmb3IgdGhlIFppbG9nIFo4ayBhbmQgSGl0YWNoaSBIOC8zMDAgYW5kIEg4LzUwMCBwcm9jZXNzb3JzICh0Yy16OGssCi10Yy1oODMwMCwgdGMtaDg1MDApLCBhbmQgSUVFRSA2OTUgb2JqZWN0IGZpbGUgZm9ybWF0IChvYmotaWVlZSksIHdhcyB3cml0dGVuIGJ5Ci1TdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4gIFN0ZXZlIGFsc28gbW9kaWZpZWQgdGhlIENPRkYgYmFjayBlbmQgdG8KLXVzZSBCRkQgZm9yIHNvbWUgbG93LWxldmVsIG9wZXJhdGlvbnMsIGZvciB1c2Ugd2l0aCB0aGUgSDgvMzAwIGFuZCBBTUQgMjlrCi10YXJnZXRzLgotCi1Kb2huIEdpbG1vcmUgYnVpbHQgdGhlIEFNRCAyOTAwMCBzdXBwb3J0LCBhZGRlZCBAY29kZXsuaW5jbHVkZX0gc3VwcG9ydCwgYW5kCi1zaW1wbGlmaWVkIHRoZSBjb25maWd1cmF0aW9uIG9mIHdoaWNoIHZlcnNpb25zIGFjY2VwdCB3aGljaCBkaXJlY3RpdmVzLiAgSGUKLXVwZGF0ZWQgdGhlIDY4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHNvIHRoYXQgTW90b3JvbGEncyBvcGNvZGVzIGFsd2F5cyBwcm9kdWNlZAotZml4ZWQtc2l6ZSBpbnN0cnVjdGlvbnMgKGUuZy4gQGNvZGV7anNyfSksIHdoaWxlIHN5bnRoZXRpYyBpbnN0cnVjdGlvbnMKLXJlbWFpbmVkIHNocmlua2FibGUgKEBjb2Rle2pic3J9KS4gIEpvaG4gZml4ZWQgbWFueSBidWdzLCBpbmNsdWRpbmcgdHJ1ZSB0ZXN0ZWQKLWNyb3NzLWNvbXBpbGF0aW9uIHN1cHBvcnQsIGFuZCBvbmUgYnVnIGluIHJlbGF4YXRpb24gdGhhdCB0b29rIGEgd2VlayBhbmQKLXJlcXVpcmVkIHRoZSBwcm92ZXJiaWFsIG9uZS1iaXQgZml4LgotCi1JYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0IG1lcmdlZCB0aGUgTW90b3JvbGEgYW5kIE1JVCBzeW50YXggZm9yIHRoZQotNjhrLCBjb21wbGV0ZWQgc3VwcG9ydCBmb3Igc29tZSBDT0ZGIHRhcmdldHMgKDY4aywgaTM4NiBTVlIzLCBhbmQgU0NPIFVuaXgpLAotYWRkZWQgc3VwcG9ydCBmb3IgTUlQUyBFQ09GRiBhbmQgRUxGIHRhcmdldHMsIHdyb3RlIHRoZSBpbml0aWFsIFJTLzYwMDAgYW5kCi1Qb3dlclBDIGFzc2VtYmxlciwgYW5kIG1hZGUgYSBmZXcgb3RoZXIgbWlub3IgcGF0Y2hlcy4KLQotU3RldmUgQ2hhbWJlcmxhaW4gbWFkZSBAY29kZXtAdmFsdWV7QVN9fSBhYmxlIHRvIGdlbmVyYXRlIGxpc3RpbmdzLgotCi1IZXdsZXR0LVBhY2thcmQgY29udHJpYnV0ZWQgc3VwcG9ydCBmb3IgdGhlIEhQOTAwMC8zMDAuCi0KLUplZmYgTGF3IHdyb3RlIEdBUyBhbmQgQkZEIHN1cHBvcnQgZm9yIHRoZSBuYXRpdmUgSFBQQSBvYmplY3QgZm9ybWF0IChTT00pCi1hbG9uZyB3aXRoIGEgZmFpcmx5IGV4dGVuc2l2ZSBIUFBBIHRlc3RzdWl0ZSAoZm9yIGJvdGggU09NIGFuZCBFTEYgb2JqZWN0Ci1mb3JtYXRzKS4gIFRoaXMgd29yayB3YXMgc3VwcG9ydGVkIGJ5IGJvdGggdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdAotdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBhbmQgQ3lnbnVzIFN1cHBvcnQuCi0KLVN1cHBvcnQgZm9yIEVMRiBmb3JtYXQgZmlsZXMgaGFzIGJlZW4gd29ya2VkIG9uIGJ5IE1hcmsgRWljaGluIG9mIEN5Z251cwotU3VwcG9ydCAob3JpZ2luYWwsIGluY29tcGxldGUgaW1wbGVtZW50YXRpb24gZm9yIFNQQVJDKSwgUGV0ZSBIb29nZW5ib29tIGFuZAotSmVmZiBMYXcgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCAoSFBQQSBtYWlubHkpLCBNaWNoYWVsIE1laXNzbmVyIG9mIHRoZSBPcGVuCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uIChpMzg2IG1haW5seSksIGFuZCBLZW4gUmFlYnVybiBvZiBDeWdudXMgU3VwcG9ydCAoc3BhcmMsCi1hbmQgc29tZSBpbml0aWFsIDY0LWJpdCBzdXBwb3J0KS4KLQotTGluYXMgVmVwc3RhcyBhZGRlZCBHQVMgc3VwcG9ydCBmb3IgdGhlIEVTQS8zOTAgIklCTSAzNzAiIGFyY2hpdGVjdHVyZS4KLQotUmljaGFyZCBIZW5kZXJzb24gcmV3cm90ZSB0aGUgQWxwaGEgYXNzZW1ibGVyLiBLbGF1cyBLYWVtcGYgd3JvdGUgR0FTIGFuZCBCRkQKLXN1cHBvcnQgZm9yIG9wZW5WTVMvQWxwaGEuCi0KLVNldmVyYWwgZW5naW5lZXJzIGF0IEN5Z251cyBTdXBwb3J0IGhhdmUgYWxzbyBwcm92aWRlZCBtYW55IHNtYWxsIGJ1ZyBmaXhlcyBhbmQKLWNvbmZpZ3VyYXRpb24gZW5oYW5jZW1lbnRzLgotCi1NYW55IG90aGVycyBoYXZlIGNvbnRyaWJ1dGVkIGxhcmdlIG9yIHNtYWxsIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMuICBJZgoteW91IGhhdmUgY29udHJpYnV0ZWQgc2lnbmlmaWNhbnQgd29yayBhbmQgYXJlIG5vdCBtZW50aW9uZWQgb24gdGhpcyBsaXN0LCBhbmQKLXdhbnQgdG8gYmUsIGxldCB1cyBrbm93LiAgU29tZSBvZiB0aGUgaGlzdG9yeSBoYXMgYmVlbiBsb3N0OyB3ZSBhcmUgbm90Ci1pbnRlbnRpb25hbGx5IGxlYXZpbmcgYW55b25lIG91dC4KLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkIEluZGV4Ci0KLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQotQGMgTG9jYWwgVmFyaWFibGVzOgotQGMgZmlsbC1jb2x1bW46IDc5Ci1AYyBFbmQ6CmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtYTI5ay50ZXhpIGIvZ2FzL2RvYy9jLWEyOWsudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxMTVkOC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtYTI5ay50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBBTUQyOUstRGVwZW5kZW50Ci1AY2hhcHRlciBBTUQgMjlLIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEFNRCAyOUsgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBBTUQgMjlLIHN1cHBvcnQKLUBjaW5kZXggMjlLIHN1cHBvcnQKLUBtZW51Ci0qIEFNRDI5SyBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogQU1EMjlLIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEFNRDI5SyBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEFNRDI5SyBEaXJlY3RpdmVzOjogICAgICAgICAgIEFNRCAyOUsgTWFjaGluZSBEaXJlY3RpdmVzCi0qIEFNRDI5SyBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBTUQyOUsgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotQGNpbmRleCBBTUQgMjlLIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMgZm9yIEFNRDI5SyAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgQU1ECi0yOUsgZmFtaWx5LgotCi1Abm9kZSBBTUQyOUsgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIEFNRDI5Sy1NYWNyb3M6OgkJTWFjcm9zCi0qIEFNRDI5Sy1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBBTUQyOUstUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotQGVuZCBtZW51Ci0KLUBub2RlIEFNRDI5Sy1NYWNyb3MKLUBzdWJzZWN0aW9uIE1hY3JvcwotCi1AY2luZGV4IE1hY3JvcywgQU1EIDI5SwotQGNpbmRleCBBTUQgMjlLIG1hY3JvcwotVGhlIG1hY3JvIHN5bnRheCB1c2VkIG9uIHRoZSBBTUQgMjlLIGlzIGxpa2UgdGhhdCBkZXNjcmliZWQgaW4gdGhlIEFNRAotMjlLIEZhbWlseSBNYWNybyBBc3NlbWJsZXIgU3BlY2lmaWNhdGlvbi4gIE5vcm1hbCBAY29kZXtAdmFsdWV7QVN9fQotbWFjcm9zIHNob3VsZCBzdGlsbCB3b3JrLgotCi1Abm9kZSBBTUQyOUstQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHs7fSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQGNpbmRleCBpZGVudGlmaWVycywgQU1EIDI5SwotQGNpbmRleCBBTUQgMjlLIGlkZW50aWZpZXJzCi1UaGUgY2hhcmFjdGVyIEBzYW1wez99IGlzIHBlcm1pdHRlZCBpbiBpZGVudGlmaWVycyAoYnV0IG1heSBub3QgYmVnaW4KLWFuIGlkZW50aWZpZXIpLgotCi1Abm9kZSBBTUQyOUstUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBBTUQgMjlLIHJlZ2lzdGVyIG5hbWVzCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBBTUQgMjlLCi1HZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSBwcmVkZWZpbmVkIHN5bWJvbHMgb2YgdGhlCi1mb3JtIEBzYW1we0dSQHZhcntubm59fSAoZm9yIGdsb2JhbCByZWdpc3RlcnMpIG9yIEBzYW1we0xSQHZhcntubm59fQotKGZvciBsb2NhbCByZWdpc3RlcnMpLCB3aGVyZSBAdmFye25ubn0gcmVwcmVzZW50cyBhIG51bWJlciBiZXR3ZWVuCi1AY29kZXswfSBhbmQgQGNvZGV7MTI3fSwgd3JpdHRlbiB3aXRoIG5vIGxlYWRpbmcgemVyb3MuICBUaGUgbGVhZGluZwotbGV0dGVycyBtYXkgYmUgaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2U7IGZvciBleGFtcGxlLCBAc2FtcHtncjEzfQotYW5kIEBzYW1we0xSN30gYXJlIGJvdGggdmFsaWQgcmVnaXN0ZXIgbmFtZXMuCi0KLVlvdSBtYXkgYWxzbyByZWZlciB0byBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzIGJ5IHNwZWNpZnlpbmcgdGhlCi1yZWdpc3RlciBudW1iZXIgYXMgdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIChwcmVmaXhlZCB3aXRoIEBzYW1weyUlfQotdG8gZmxhZyB0aGUgZXhwcmVzc2lvbiBhcyBhIHJlZ2lzdGVyIG51bWJlcik6Ci1Ac21hbGxleGFtcGxlCi0lJUB2YXJ7ZXhwcmVzc2lvbn0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLS0tLXdoZXJlIEB2YXJ7ZXhwcmVzc2lvbn0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIGV2YWx1YXRpbmcgdG8gYQotbnVtYmVyIGJldHdlZW4gQGNvZGV7MH0gYW5kIEBjb2RlezI1NX0uICBUaGUgcmFuZ2UgWzAsIDEyN10gcmVmZXJzIHRvCi1nbG9iYWwgcmVnaXN0ZXJzLCBhbmQgdGhlIHJhbmdlIFsxMjgsIDI1NV0gdG8gbG9jYWwgcmVnaXN0ZXJzLgotCi1AY2luZGV4IHNwZWNpYWwgcHVycG9zZSByZWdpc3RlcnMsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzCi1AY2luZGV4IHByb3RlY3RlZCByZWdpc3RlcnMsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBwcm90ZWN0ZWQgcmVnaXN0ZXJzCi1JbiBhZGRpdGlvbiwgQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBwcm90ZWN0ZWQKLXNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBuYW1lcyBmb3IgdGhlIEFNRCAyOUsgZmFtaWx5OgotCi1Ac21hbGxleGFtcGxlCi0gIHZhYiAgICBjaGQgICAgcGMwCi0gIG9wcyAgICBjaGMgICAgcGMxCi0gIGNwcyAgICByYnAgICAgcGMyCi0gIGNmZyAgICB0bWMgICAgbW11Ci0gIGNoYSAgICB0bXIgICAgbHJ1Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGVzZSB1bnByb3RlY3RlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgYXJlIGFsc28gcmVjb2duaXplZDoKLUBzbWFsbGV4YW1wbGUKLSAgaXBjICAgIGFsdSAgICBmcGUKLSAgaXBhICAgIGJwICAgICBpbnRlCi0gIGlwYiAgICBmYyAgICAgZnBzCi0gIHEgICAgICBjciAgICAgZXhvcAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgQU1EMjlLIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBBTUQgMjlLIChAc2N7aWVlZX0pCi1AY2luZGV4IEFNRCAyOUsgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBBTUQgMjlLIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBBTUQyOUsgRGlyZWN0aXZlcwotQHNlY3Rpb24gQU1EIDI5SyBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBtYWNoaW5lIGRpcmVjdGl2ZXMKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtibG9ja30gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAuYmxvY2sgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH0KLVRoaXMgZGlyZWN0aXZlIGVtaXRzIEB2YXJ7c2l6ZX0gYnl0ZXMsIGVhY2ggb2YgdmFsdWUgQHZhcntmaWxsfS4gIEJvdGgKLUB2YXJ7c2l6ZX0gYW5kIEB2YXJ7ZmlsbH0gYXJlIGFic29sdXRlIGV4cHJlc3Npb25zLiAgSWYgdGhlIGNvbW1hCi1hbmQgQHZhcntmaWxsfSBhcmUgb21pdHRlZCwgQHZhcntmaWxsfSBpcyBhc3N1bWVkIHRvIGJlIHplcm8uCi0KLUluIG90aGVyIHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIsIHRoaXMgZGlyZWN0aXZlIGlzIGNhbGxlZAotQHNhbXB7LnNwYWNlfS4KLUBlbmQgdGFibGUKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2NwdXR5cGV9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLmNwdXR5cGUKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLUFNRCAyOUsgYXNzZW1ibGVycy4KLQotQGNpbmRleCBAY29kZXtmaWxlfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5maWxlCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1BTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBpbiBvdGhlciB2ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyLCBAY29kZXsuZmlsZX0gaXMKLXVzZWQgZm9yIHRoZSBkaXJlY3RpdmUgY2FsbGVkIEBjb2Rley5hcHAtZmlsZX0gaW4gdGhlIEFNRCAyOUsgc3VwcG9ydC4KLUBlbmQgcXVvdGF0aW9uCi0KLUBjaW5kZXggQGNvZGV7bGluZX0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAubGluZQotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AaWdub3JlCi1AYyBzaW5jZSB3ZSdyZSBpZ25vcmluZyAubHN5bS4uLgotQGNpbmRleCBAY29kZXtyZWd9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLnJlZyBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn0KLUBjb2Rley5yZWd9IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQGNvZGV7LmxzeW19OyBAcHhyZWZ7THN5bSwsQGNvZGV7LmxzeW19fS4KLUBlbmQgaWdub3JlCi0KLUBjaW5kZXggQGNvZGV7c2VjdH0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAuc2VjdAotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AY2luZGV4IEBjb2Rle3VzZX0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAudXNlIEB2YXJ7c2VjdGlvbiBuYW1lfQotRXN0YWJsaXNoZXMgdGhlIHNlY3Rpb24gYW5kIHN1YnNlY3Rpb24gZm9yIHRoZSBmb2xsb3dpbmcgY29kZTsKLUB2YXJ7c2VjdGlvbiBuYW1lfSBtYXkgYmUgb25lIG9mIEBjb2Rley50ZXh0fSwgQGNvZGV7LmRhdGF9LAotQGNvZGV7LmRhdGExfSwgb3IgQGNvZGV7LmxpdH0uICBXaXRoIG9uZSBvZiB0aGUgZmlyc3QgdGhyZWUgQHZhcntzZWN0aW9uCi1uYW1lfSBvcHRpb25zLCBAc2FtcHsudXNlfSBpcyBlcXVpdmFsZW50IHRvIHRoZSBtYWNoaW5lIGRpcmVjdGl2ZQotQHZhcntzZWN0aW9uIG5hbWV9OyB0aGUgcmVtYWluaW5nIGNhc2UsIEBzYW1wey51c2UgLmxpdH0sIGlzIHRoZSBzYW1lIGFzCi1Ac2FtcHsuZGF0YSAyMDB9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBBTUQyOUsgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IEFNRCAyOUsgb3Bjb2RlcwotQGNpbmRleCBvcGNvZGVzIGZvciBBTUQgMjlLCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgQU1EIDI5SyBvcGNvZGVzLiAgTm8KLWFkZGl0aW9uYWwgcHNldWRvLWluc3RydWN0aW9ucyBhcmUgbmVlZGVkIG9uIHRoaXMgZmFtaWx5LgotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIDI5SyBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle0FtMjkwMDAKLVVzZXIncyBNYW51YWx9LCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1hcm0udGV4aSBiL2dhcy9kb2MvYy1hcm0udGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5OGQ3Zi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtYXJtLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi0KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgQVJNLURlcGVuZGVudAotQGNoYXB0ZXIgQVJNIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotCi1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgQVJNIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggQVJNIHN1cHBvcnQKLUBjaW5kZXggVGh1bWIgc3VwcG9ydAotQG1lbnUKLSogQVJNIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBBUk0gU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogQVJNIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogQVJNIERpcmVjdGl2ZXM6OiAgICAgICAgICAgQVJNIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBBUk0gT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQVJNIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLUBjaW5kZXggQVJNIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMgZm9yIEFSTSAobm9uZSkKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXstbWFybX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWFybSBbQHZhcnsyfXxAdmFyezI1MH18QHZhcnszfXxAdmFyezZ9fEB2YXJ7NjB9fEB2YXJ7NjAwfXxAdmFyezYxMH18QHZhcns2MjB9fEB2YXJ7N318QHZhcns3bX18QHZhcns3ZH18QHZhcns3ZG19fEB2YXJ7N2RpfXxAdmFyezdkbWl9fEB2YXJ7NzB9fEB2YXJ7NzAwfXxAdmFyezcwMGl9fEB2YXJ7NzEwfXxAdmFyezcxMGN9fEB2YXJ7NzEwMH18QHZhcns3NTAwfXxAdmFyezc1MDBmZX18QHZhcns3dGRtaX18QHZhcns4fXxAdmFyezgxMH18QHZhcns5fXxAdmFyezl0ZG1pfXxAdmFyezkyMH18QHZhcntzdHJvbmdhcm19fEB2YXJ7c3Ryb25nYXJtMTEwfXxAdmFye3N0cm9uZ2FybTExMDB9XQotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSB0YXJnZXQgcHJvY2Vzc29yLiAgVGhlIGFzc2VtYmxlciB3aWxsIGlzc3VlIGFuCi1lcnJvciBtZXNzYWdlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhc3NlbWJsZSBhbiBpbnN0cnVjdGlvbiB3aGljaAotd2lsbCBub3QgZXhlY3V0ZSBvbiB0aGUgdGFyZ2V0IHByb2Nlc3Nvci4KLUBjaW5kZXggQGNvZGV7LW1hcm12fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tYXJtdiBbQHZhcnsyfXxAdmFyezJhfXxAdmFyezN9fEB2YXJ7M219fEB2YXJ7NH18QHZhcns0dH18QHZhcns1fXxAdmFyezV0fV0KLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gIFRoZSBhc3NlbWJsZXIgd2lsbCBpc3N1ZQotYW4gZXJyb3IgbWVzc2FnZSBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gd2hpY2gKLXdpbGwgbm90IGV4ZWN1dGUgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCi1AY2luZGV4IEBjb2Rley1tdGh1bWJ9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW10aHVtYgotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgb25seSBUaHVtYiBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGFzc2VtYmxlZC4KLUBjaW5kZXggQGNvZGV7LW1hbGx9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1hbGwKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IGFueSBBcm0gb3IgVGh1bWIgaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGFzc2VtYmxlZC4KLUBjaW5kZXggQGNvZGV7LW1mcGF9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1mcGEgW0B2YXJ7MTB9fEB2YXJ7MTF9XQotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSBmbG9hdGluZyBwb2ludCBhcmNoaXRlY3R1cmUgaW4gdXNlIG9uIHRoZQotdGFyZ2V0IHByb2Nlc3Nvci4gCi1AY2luZGV4IEBjb2Rley1tZnBlLW9sZH0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWZwZS1vbGQKLURvIG5vdCBhbGxvdyB0aGUgYXNzZW1ibGUgb2YgZmxvYXRpbmcgcG9pbnQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zLgotQGNpbmRleCBAY29kZXstbW5vLWZwdX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbW5vLWZwdQotRG8gbm90IGFsbG93IHRoZSBhc3NlbWJseSBvZiBhbnkgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLgotQGNpbmRleCBAY29kZXstbXRodW1iLWludGVyd29ya30gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbXRodW1iLWludGVyd29yawotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBzdXBwb3J0aW5nIGludGVyd29ya2luZy4KLUBjaW5kZXggQGNvZGV7LW1hcGNzfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tYXBjcyBbQHZhcnsyNn18QHZhcnszMn1dCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAotYmUgbWFya2VkIGFzIHN1cHBvcnRpbmcgdGhlIGluZGljYXRlZCB2ZXJzaW9uIG9mIHRoZSBBcm0gUHJvY2VkdXJlLgotQ2FsbGluZyBTdGFuZGFyZC4KLUBpdGVtIC1tYXBjcy1mbG9hdAotVGhpcyBpbmRpY2F0ZXMgdGhlIHRoZSBmbG9hdGluZyBwb2ludCB2YXJpYW50IG9mIHRoZSBBUENTIHNob3VsZCBiZQotdXNlZC4gIEluIHRoaXMgdmFyaWFudCBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBGUAotcmVnaXN0ZXJzIHJhdGhlciB0aGFuIGludGVnZXIgcmVnaXN0ZXJzLgotQGl0ZW0gLW1hcGNzLXJlZW50cmFudAotVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVlbnRyYW50IHZhcmlhbnQgb2YgdGhlIEFQQ1Mgc2hvdWxkIGJlIHVzZWQuCi1UaGlzIHZhcmlhbnQgc3VwcG9ydHMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4KLUBjaW5kZXggQGNvZGV7LUVCfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1FQgotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBiZWluZyBlbmNvZGVkIGZvciBhIGJpZy1lbmRpYW4gcHJvY2Vzc29yLgotQGNpbmRleCBAY29kZXstRUx9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLUVMCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAotYmUgbWFya2VkIGFzIGJlaW5nIGVuY29kZWQgZm9yIGEgbGl0dGxlLWVuZGlhbiBwcm9jZXNzb3IuCi1AY2luZGV4IEBjb2Rley1rfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBjaW5kZXggUElDIGNvZGUgZ2VuZXJhdGlvbiBmb3IgQVJNCi1AaXRlbSAtawotVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiBQSUMgKHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUpLgotQGl0ZW0gLW1vYWJpCi1UaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb2RlIHNob3VsZCBiZSBhc3NlbWJsZWQgdXNpbmcgdGhlIG9sZCBBUk0gRUxGCi1jb252ZW50aW9ucywgYmFzZWQgb24gYSBiZXRhIHJlbGVhc2UgcmVsZWFzZSBvZiB0aGUgQVJNLUVMRgotc3BlY2lmaWNhdGlvbnMsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGNvbnZlbnRpb25zIHdoaWNoIGFyZSBiYXNlZCBvbgotdGhlIGZpbmFsIHJlbGVhc2Ugb2YgdGhlIEFSTS1FTEYgc3BlY2lmaWNhdGlvbnMuCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgQVJNIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBBUk0tQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogQVJNLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBUk0tQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEFSTQotQGNpbmRleCBBUk0gbGluZSBjb21tZW50IGNoYXJhY3RlcgotVGhlIHByZXNlbmNlIG9mIGEgQHNhbXB7QEB9IG9uIGEgbGluZSBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGEgY29tbWVudAotdGhhdCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS4gIElmIGEgQHNhbXB7I30gYXBwZWFycyBhcwotdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGxpbmUsIHRoZSB3aG9sZSBsaW5lIGlzIHRyZWF0ZWQgYXMgYSBjb21tZW50LgotCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBBUk0KLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgQVJNCi1AY2luZGV4IEFSTSBsaW5lIHNlcGFyYXRvcgotT24gQVJNIHN5c3RlbXMgcnVubmluZyB0aGUgR05VL0xpbnV4IG9wZXJhdGluZyBzeXN0ZW0sIEBzYW1wezt9IGNhbiBiZQotdXNlZCBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1AY2luZGV4IGltbWVkaWF0ZSBjaGFyYWN0ZXIsIEFSTQotQGNpbmRleCBBUk0gaW1tZWRpYXRlIGNoYXJhY3RlcgotRWl0aGVyIEBzYW1weyN9IG9yIEBzYW1weyR9IGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIGltbWVkaWF0ZSBvcGVyYW5kcy4KLQotQGNpbmRleCBpZGVudGlmaWVycywgQVJNCi1AY2luZGV4IEFSTSBpZGVudGlmaWVycwotKlRPRE8qIEV4cGxhaW4gYWJvdXQgL2RhdGEgbW9kaWZpZXIgb24gc3ltYm9scy4KLQotQG5vZGUgQVJNLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggQVJNIHJlZ2lzdGVyIG5hbWVzCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBBUk0KLSpUT0RPKiBFeHBsYWluIGFib3V0IEFSTSByZWdpc3RlciBuYW1pbmcsIGFuZCB0aGUgcHJlZGVmaW5lZCBuYW1lcy4KLQotQG5vZGUgQVJNIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBBUk0gKEBzY3tpZWVlfSkKLUBjaW5kZXggQVJNIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgQVJNIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi0KLQotQG5vZGUgQVJNIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEFSTSBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEFSTQotQGNpbmRleCBBUk0gbWFjaGluZSBkaXJlY3RpdmVzCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBAY29kZXtyZXF9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSBAdmFye25hbWV9IC5yZXEgQHZhcntyZWdpc3RlciBuYW1lfQotVGhpcyBjcmVhdGVzIGFuIGFsaWFzIGZvciBAdmFye3JlZ2lzdGVyIG5hbWV9IGNhbGxlZCBAdmFye25hbWV9LiAgRm9yCi1leGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIGZvbyAucmVxIHIwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IEBjb2Rle2NvZGV9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAuY29kZSBbQHZhcnsxNn18QHZhcnszMn1dCi1UaGlzIGRpcmVjdGl2ZSBzZWxlY3RzIHRoZSBpbnN0cnVjdGlvbiBzZXQgYmVpbmcgZ2VuZXJhdGVkLiBUaGUgdmFsdWUgMTYKLXNlbGVjdHMgVGh1bWIsIHdpdGggdGhlIHZhbHVlIDMyIHNlbGVjdGluZyBBUk0uCi0KLUBjaW5kZXggQGNvZGV7dGh1bWJ9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAudGh1bWIKLVRoaXMgcGVyZm9ybXMgdGhlIHNhbWUgYWN0aW9uIGFzIEB2YXJ7LmNvZGUgMTZ9LgotCi1AY2luZGV4IEBjb2Rle2FybX0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5hcm0KLVRoaXMgcGVyZm9ybXMgdGhlIHNhbWUgYWN0aW9uIGFzIEB2YXJ7LmNvZGUgMzJ9LgotCi1AY2luZGV4IEBjb2Rle2ZvcmNlX3RodW1ifSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLmZvcmNlX3RodW1iCi1UaGlzIGRpcmVjdGl2ZSBmb3JjZXMgdGhlIHNlbGVjdGlvbiBvZiBUaHVtYiBpbnN0cnVjdGlvbnMsIGV2ZW4gaWYgdGhlCi10YXJnZXQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGhvc2UgaW5zdHJ1Y3Rpb25zCi0KLUBjaW5kZXggQGNvZGV7dGh1bWJfZnVuY30gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC50aHVtYl9mdW5jCi1UaGlzIGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhhdCB0aGUgZm9sbG93aW5nIHN5bWJvbCBpcyB0aGUgbmFtZSBvZiBhCi1UaHVtYiBlbmNvZGVkIGZ1bmN0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gYWxsb3cKLXRoZSBhc3NlbWJsZXIgYW5kIGxpbmtlciB0byBnZW5lcmF0ZSBjb3JyZWN0IGNvZGUgZm9yIGludGVyd29ya2luZwotYmV0d2VlbiBBcm0gYW5kIFRodW1iIGluc3RydWN0aW9ucyBhbmQgc2hvdWxkIGJlIHVzZWQgZXZlbiBpZgotaW50ZXJ3b3JraW5nIGlzIG5vdCBnb2luZyB0byBiZSBwZXJmb3JtZWQuCi0KLUBjaW5kZXggQGNvZGV7dGh1bWJfc2V0fSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLnRodW1iX3NldAotVGhpcyBwZXJmb3JtcyB0aGUgZXF1aXZhbGVudCBvZiBhIEBjb2Rley5zZXR9IGRpcmVjdGl2ZSBpbiB0aGF0IGl0Ci1jcmVhdGVzIGEgc3ltYm9sIHdoaWNoIGlzIGFuIGFsaWFzIGZvciBhbm90aGVyIHN5bWJvbCAocG9zc2libHkgbm90IHlldAotZGVmaW5lZCkuICBUaGlzIGRpcmVjdGl2ZSBhbHNvIGhhcyB0aGUgYWRkZWQgcHJvcGVydHkgaW4gdGhhdCBpdCBtYXJrcwotdGhlIGFsaWFzZWQgc3ltYm9sIGFzIGJlaW5nIGEgdGh1bWIgZnVuY3Rpb24gZW50cnkgcG9pbnQsIGluIHRoZSBzYW1lCi13YXkgdGhhdCB0aGUgQGNvZGV7LnRodW1iX2Z1bmN9IGRpcmVjdGl2ZSBkb2VzLgotCi1AY2luZGV4IEBjb2Rley5sdG9yZ30gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5sdG9yZwotVGhpcyBkaXJlY3RpdmUgY2F1c2VzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBsaXRlcmFsIHBvb2wgdG8gYmUKLWR1bXBlZCBpbnRvIHRoZSBjdXJyZW50IHNlY3Rpb24gKHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgdGhlIC50ZXh0Ci1zZWN0aW9uKSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiAoYWxpZ25lZCB0byBhIHdvcmQgYm91bmRhcnkpLgotCi1AY2luZGV4IEBjb2Rley5wb29sfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLnBvb2wKLVRoaXMgaXMgYSBzeW5vbnltIGZvciAubHRvcmcuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgQVJNIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBBUk0gb3Bjb2RlcwotQGNpbmRleCBvcGNvZGVzIGZvciBBUk0KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBBUk0gb3Bjb2Rlcy4gIEl0IGFsc28KLWltcGxlbWVudHMgc2V2ZXJhbCBwc2V1ZG8gb3Bjb2RlcywgaW5jbHVkaW5nIHNldmVyYWwgc3ludGhldGljIGxvYWQKLWluc3RydWN0aW9ucy4gCi0KLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEBjb2Rle05PUH0gcHNldWRvIG9wLCBBUk0KLUBpdGVtIE5PUAotQHNtYWxsZXhhbXBsZQotICBub3AKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgcHNldWRvIG9wIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvIGEgbGVnYWwgQVJNIGluc3RydWN0aW9uIHRoYXQgZG9lcwotbm90aGluZy4gIEN1cnJlbnRseSBpdCB3aWxsIGV2YWx1YXRlIHRvIE1PViByMCwgcjAuCi0KLUBjaW5kZXggQGNvZGV7TERSIHJlZyw9PGxhYmVsPn0gcHNldWRvIG9wLCBBUk0KLUBpdGVtIExEUiAKLUBzbWFsbGV4YW1wbGUKLSAgbGRyIDxyZWdpc3Rlcj4gLCA9IDxleHByZXNzaW9uPgotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBudW1lcmljIGNvbnN0YW50IHRoZW4gYSBNT1Ygb3IgTVZOCi1pbnN0cnVjdGlvbiB3aWxsIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIExEUiBpbnN0cnVjdGlvbiwgaWYgdGhlCi1jb25zdGFudCBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGVpdGhlciBvZiB0aGVzZSBpbnN0cnVjdGlvbnMuICBPdGhlcndpc2UKLXRoZSBjb25zdGFudCB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSBuZWFyZXN0IGxpdGVyYWwgcG9vbCAoaWYgaXQgbm90Ci1hbHJlYWR5IHRoZXJlKSBhbmQgYSBQQyByZWxhdGl2ZSBMRFIgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQuCi0KLUBjaW5kZXggQGNvZGV7QURSIHJlZyw8bGFiZWw+fSBwc2V1ZG8gb3AsIEFSTQotQGl0ZW0gQURSCi1Ac21hbGxleGFtcGxlCi0gIGFkciA8cmVnaXN0ZXI+IDxsYWJlbD4KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCBsb2FkIHRoZSBhZGRyZXNzIG9mIEB2YXJ7bGFiZWx9IGludG8gdGhlIGluZGljYXRlZAotcmVnaXN0ZXIuICBUaGUgaW5zdHJ1Y3Rpb24gd2lsbCBldmFsdWF0ZSB0byBhIFBDIHJlbGF0aXZlIEFERCBvciBTVUIKLWluc3RydWN0aW9uIGRlcGVuZGluZyB1cG9uIHdoZXJlIHRoZSBsYWJlbCBpcyBsb2NhdGVkLiAgSWYgdGhlIGxhYmVsIGlzCi1vdXQgb2YgcmFuZ2UsIG9yIGlmIGl0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUgKGFuZCBzZWN0aW9uKSBhcwotdGhlIEFEUiBpbnN0cnVjdGlvbiwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZC4gIFRoaXMgaW5zdHJ1Y3Rpb24KLXdpbGwgbm90IG1ha2UgdXNlIG9mIHRoZSBsaXRlcmFsIHBvb2wuCi0KLUBjaW5kZXggQGNvZGV7QURSTCByZWcsPGxhYmVsPn0gcHNldWRvIG9wLCBBUk0KLUBpdGVtIEFEUkwgCi1Ac21hbGxleGFtcGxlCi0gIGFkcmwgPHJlZ2lzdGVyPiA8bGFiZWw+Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIGluc3RydWN0aW9uIHdpbGwgbG9hZCB0aGUgYWRkcmVzcyBvZiBAdmFye2xhYmVsfSBpbnRvIHRoZSBpbmRpY2F0ZWQKLXJlZ2lzdGVyLiAgVGhlIGluc3RydWN0aW9uIHdpbGwgZXZhbHVhdGUgdG8gb25lIG9yIHR3byBhIFBDIHJlbGF0aXZlIEFERAotb3IgU1VCIGluc3RydWN0aW9ucyBkZXBlbmRpbmcgdXBvbiB3aGVyZSB0aGUgbGFiZWwgaXMgbG9jYXRlZC4gIElmIGEKLXNlY29uZCBpbnN0cnVjdGlvbiBpcyBub3QgbmVlZGVkIGEgTk9QIGluc3RydWN0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkIGluCi1pdHMgcGxhY2UsIHNvIHRoYXQgdGhpcyBpbnN0cnVjdGlvbiBpcyBhbHdheXMgOCBieXRlcyBsb25nLgotCi1JZiB0aGUgbGFiZWwgaXMgb3V0IG9mIHJhbmdlLCBvciBpZiBpdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgc2FtZSBmaWxlCi0oYW5kIHNlY3Rpb24pIGFzIHRoZSBBRFJMIGluc3RydWN0aW9uLCB0aGVuIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLgotVGhpcyBpbnN0cnVjdGlvbiB3aWxsIG5vdCBtYWtlIHVzZSBvZiB0aGUgbGl0ZXJhbCBwb29sLgotCi1AZW5kIHRhYmxlCi0KLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgQVJNIG9yIFRodW1iIGluc3RydWN0aW9uIHNldHMsIHNlZSBAY2l0ZXtBUk0KLVNvZnR3YXJlIERldmVsb3BtZW50IFRvb2xraXQgUmVmZXJlbmNlIE1hbnVhbH0sIEFkdmFuY2VkIFJJU0MgTWFjaGluZXMKLUx0ZC4KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWQxMHYudGV4aSBiL2dhcy9kb2MvYy1kMTB2LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2JmODguLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWQxMHYudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgRDEwVi1EZXBlbmRlbnQKLUBjaGFwdGVyIEQxMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgRDEwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IEQxMFYgc3VwcG9ydAotQG1lbnUKLSogRDEwVi1PcHRzOjogICAgICAgICAgICAgICAgICAgRDEwViBPcHRpb25zCi0qIEQxMFYtU3ludGF4OjogICAgICAgICAgICAgICAgIFN5bnRheAotKiBEMTBWLUZsb2F0OjogICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBEMTBWLU9wY29kZXM6OiAgICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgRDEwVi1PcHRzCi1Ac2VjdGlvbiBEMTBWIE9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgRDEwVgotQGNpbmRleCBEMTBWIG9wdGlvbnMKLVRoZSBNaXRzdWJpc2hpIEQxMFYgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYSBmZXcgbWFjaGluZQotZGVwZW5kZW50IG9wdGlvbnMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gLU8KLVRoZSBEMTBWIGNhbiBvZnRlbiBleGVjdXRlIHR3byBzdWItaW5zdHJ1Y3Rpb25zIGluIHBhcmFsbGVsLiBXaGVuIHRoaXMgb3B0aW9uCi1pcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGF0dGVtcHQgdG8gb3B0aW1pemUgaXRzIG91dHB1dCBieSBkZXRlY3Rpbmcgd2hlbgotaW5zdHJ1Y3Rpb25zIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4KLUBpdGVtIC0tbm93YXJuc3dhcAotVG8gb3B0aW1pemUgZXhlY3V0aW9uIHBlcmZvcm1hbmNlLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIHNvbWV0aW1lcyBzd2FwIHRoZQotb3JkZXIgb2YgaW5zdHJ1Y3Rpb25zLiBOb3JtYWxseSB0aGlzIGdlbmVyYXRlcyBhIHdhcm5pbmcuIFdoZW4gdGhpcyBvcHRpb24gCi1pcyB1c2VkLCBubyB3YXJuaW5nIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gaW5zdHJ1Y3Rpb25zIGFyZSBzd2FwcGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBEMTBWLVN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AY2luZGV4IEQxMFYgc3ludGF4Ci1AY2luZGV4IHN5bnRheCwgRDEwVgotCi1UaGUgRDEwViBzeW50YXggaXMgYmFzZWQgb24gdGhlIHN5bnRheCBpbiBNaXRzdWJpc2hpJ3MgRDEwViBhcmNoaXRlY3R1cmUgbWFudWFsLgotVGhlIGRpZmZlcmVuY2VzIGFyZSBkZXRhaWxlZCBiZWxvdy4KLQotQG1lbnUKLSogRDEwVi1TaXplOjogICAgICAgICAgICAgICAgIFNpemUgTW9kaWZpZXJzCi0qIEQxMFYtU3Viczo6ICAgICAgICAgICAgICAgICBTdWItSW5zdHJ1Y3Rpb25zCi0qIEQxMFYtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogRDEwVi1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIEQxMFYtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi0qIEQxMFYtV29yZDo6ICAgICAgICAgICAgICAgICBAQFdPUkQgTW9kaWZpZXIKLUBlbmQgbWVudQotCi0KLUBub2RlIEQxMFYtU2l6ZQotQHN1YnNlY3Rpb24gU2l6ZSBNb2RpZmllcnMKLUBjaW5kZXggRDEwViBzaXplIG1vZGlmaWVycwotQGNpbmRleCBzaXplIG1vZGlmaWVycywgRDEwVgotVGhlIEQxMFYgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSB1c2VzIHRoZSBpbnN0cnVjdGlvbiBuYW1lcyBpbiB0aGUgRDEwVgotQXJjaGl0ZWN0dXJlIE1hbnVhbC4gIEhvd2V2ZXIsIHRoZSBuYW1lcyBpbiB0aGUgbWFudWFsIGFyZSBzb21ldGltZXMgYW1iaWd1b3VzLgotVGhlcmUgYXJlIGluc3RydWN0aW9uIG5hbWVzIHRoYXQgY2FuIGFzc2VtYmxlIHRvIGEgc2hvcnQgb3IgbG9uZyBmb3JtIG9wY29kZS4KLUhvdyBkb2VzIHRoZSBhc3NlbWJsZXIgcGljayB0aGUgY29ycmVjdCBmb3JtPyAgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhbHdheXMgcGljayB0aGUKLXNtYWxsZXN0IGZvcm0gaWYgaXQgY2FuLiAgV2hlbiBkZWFsaW5nIHdpdGggYSBzeW1ib2wgdGhhdCBpcyBub3QgZGVmaW5lZCB5ZXQgd2hlbiBhCi1saW5lIGlzIGJlaW5nIGFzc2VtYmxlZCwgaXQgd2lsbCBhbHdheXMgdXNlIHRoZSBsb25nIGZvcm0uICBJZiB5b3UgbmVlZCB0byBmb3JjZSB0aGUgCi1hc3NlbWJsZXIgdG8gdXNlIGVpdGhlciB0aGUgc2hvcnQgb3IgbG9uZyBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbiwgeW91IGNhbiBhcHBlbmQKLWVpdGhlciBAc2FtcHsuc30gKHNob3J0KSBvciBAc2FtcHsubH0gKGxvbmcpIHRvIGl0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgd3JpdGluZyAKLWFuIGFzc2VtYmx5IHByb2dyYW0gYW5kIHlvdSB3YW50IHRvIGRvIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgZGVmaW5lZCBsYXRlcgotaW4geW91ciBwcm9ncmFtLCB5b3UgY2FuIHdyaXRlIEBzYW1we2JyYS5zICAgZm9vfS4gIAotT2JqZHVtcCBhbmQgR0RCIHdpbGwgYWx3YXlzIGFwcGVuZCBAc2FtcHsuc30gb3IgQHNhbXB7Lmx9IHRvIGluc3RydWN0aW9ucyB3aGljaAotaGF2ZSBib3RoIHNob3J0IGFuZCBsb25nIGZvcm1zLgotCi1Abm9kZSBEMTBWLVN1YnMKLUBzdWJzZWN0aW9uIFN1Yi1JbnN0cnVjdGlvbnMKLUBjaW5kZXggRDEwViBzdWItaW5zdHJ1Y3Rpb25zCi1AY2luZGV4IHN1Yi1pbnN0cnVjdGlvbnMsIEQxMFYKLVRoZSBEMTBWIGFzc2VtYmxlciB0YWtlcyBhcyBpbnB1dCBhIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMsIGVpdGhlciBvbmUtcGVyLWxpbmUsCi1vciBpbiB0aGUgc3BlY2lhbCB0d28tcGVyLWxpbmUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgU29tZSBvZiB0aGVzZQotaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgc2hvcnQtZm9ybSBvciBzdWItaW5zdHJ1Y3Rpb25zLiAgVGhlc2Ugc3ViLWluc3RydWN0aW9ucyBjYW4gYmUgcGFja2VkCi1pbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgVGhlIGFzc2VtYmxlciB3aWxsIGRvIHRoaXMgYXV0b21hdGljYWxseS4gIEl0IHdpbGwgYWxzbyBkZXRlY3QKLXdoZW4gaXQgc2hvdWxkIG5vdCBwYWNrIGluc3RydWN0aW9ucy4gIEZvciBleGFtcGxlLCB3aGVuIGEgbGFiZWwgaXMgZGVmaW5lZCwgdGhlIG5leHQKLWluc3RydWN0aW9uIHdpbGwgbmV2ZXIgYmUgcGFja2FnZWQgd2l0aCB0aGUgcHJldmlvdXMgb25lLiAgV2hlbmV2ZXIgYSBicmFuY2ggYW5kIGxpbmsKLWluc3RydWN0aW9uIGlzIGNhbGxlZCwgaXQgd2lsbCBub3QgYmUgcGFja2FnZWQgd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBzbyB0aGUgcmV0dXJuCi1hZGRyZXNzIHdpbGwgYmUgdmFsaWQuICBOb3BzIGFyZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIHdoZW4gbmVjZXNzYXJ5LgotCi1JZiB5b3UgZG8gbm90IHdhbnQgdGhlIGFzc2VtYmxlciBhdXRvbWF0aWNhbGx5IG1ha2luZyB0aGVzZSBkZWNpc2lvbnMsIHlvdSBjYW4gY29udHJvbAotdGhlIHBhY2thZ2luZyBhbmQgZXhlY3V0aW9uIHR5cGUgKHBhcmFsbGVsIG9yIHNlcXVlbnRpYWwpIHdpdGggdGhlIHNwZWNpYWwgZXhlY3V0aW9uIAotc3ltYm9scyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIAotCi1Abm9kZSBEMTBWLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgRDEwVgotQGNpbmRleCBEMTBWIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1wezt9IGFuZCBAc2FtcHsjfSBhcmUgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXJzLgotQGNpbmRleCBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcsIEQxMFYKLUBjaW5kZXggRDEwViBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcKLVN1Yi1pbnN0cnVjdGlvbnMgbWF5IGJlIGV4ZWN1dGVkIGluIG9yZGVyLCBpbiByZXZlcnNlLW9yZGVyLCBvciBpbiBwYXJhbGxlbC4KLUluc3RydWN0aW9ucyBsaXN0ZWQgaW4gdGhlIHN0YW5kYXJkIG9uZS1wZXItbGluZSBmb3JtYXQgd2lsbCBiZSBleGVjdXRlZCBzZXF1ZW50aWFsbHkuCi1UbyBzcGVjaWZ5IHRoZSBleGVjdXRpbmcgb3JkZXIsIHVzZSB0aGUgZm9sbG93aW5nIHN5bWJvbHM6IAotQHRhYmxlIEBzYW1wCi1AaXRlbSAtPgotU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSBsZWZ0IGZpcnN0LgotQGl0ZW0gPC0KLVNlcXVlbnRpYWwgd2l0aCBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgZmlyc3QuCi1AaXRlbSB8fAotUGFyYWxsZWwKLUBlbmQgdGFibGUKLVRoZSBEMTBWIHN5bnRheCBhbGxvd3MgZWl0aGVyIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZSwgb25lIGluc3RydWN0aW9uIHBlciBsaW5lIHdpdGgKLXRoZSBleGVjdXRpb24gc3ltYm9sLCBvciB0d28gaW5zdHJ1Y3Rpb25zIHBlciBsaW5lLiAgRm9yIGV4YW1wbGUKLUB0YWJsZSBAY29kZQotQGl0ZW0gYWJzICAgICAgIGExICAgICAgLT4gICAgICBhYnMgICAgIHIwCi1FeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseS4gIFRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgaXMgaW4gdGhlIHJpZ2h0Ci1jb250YWluZXIgYW5kIGlzIGV4ZWN1dGVkIHNlY29uZC4KLUBpdGVtIGFicyAgICAgICByMCAgICAgIDwtICAgICAgYWJzICAgICBhMQotRXhlY3V0ZSB0aGVzZSByZXZlcnNlLXNlcXVlbnRpYWxseS4gIFRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgaXMgaW4gdGhlIHJpZ2h0Ci1jb250YWluZXIsIGFuZCBpcyBleGVjdXRlZCBmaXJzdC4KLUBpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICB8fCAgICAgIG1hYyAgICAgYTAscjAscjcKLUV4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCi1AaXRlbSBsZDJ3ICAgIHIyLEBAcjgrICAgICAgICAgfHwgICAgICAKLUBpdGVteCBtYWMgICAgIGEwLHIwLHI3Ci1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCi1AaXRlbSBsZDJ3ICAgIHIyLEBAcjgrICAgICAgICAgCi1AaXRlbXggbWFjICAgICBhMCxyMCxyNwotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseS4gIEFzc2VtYmxlciB3aWxsCi1wdXQgdGhlbSBpbiB0aGUgcHJvcGVyIGNvbnRhaW5lcnMuCi1AaXRlbSBsZDJ3ICAgIHIyLEBAcjgrICAgICAgICAgLT4KLUBpdGVteCBtYWMgICAgIGEwLHIwLHI3Ci1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgU2FtZSBhcyBhYm92ZSBidXQKLXNlY29uZCBpbnN0cnVjdGlvbiB3aWxsIGFsd2F5cyBnbyBpbnRvIHJpZ2h0IGNvbnRhaW5lci4gIAotQGVuZCB0YWJsZQotQGNpbmRleCBzeW1ib2wgbmFtZXMsIEBzYW1weyR9IGluCi1AY2luZGV4IEBjb2RleyR9IGluIHN5bWJvbCBuYW1lcwotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1Abm9kZSBEMTBWLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi1AY2luZGV4IEQxMFYgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgRDEwVgotWW91IGNhbiB1c2UgdGhlIHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyMH0gdGhyb3VnaCBAc2FtcHtyMTV9IHRvIHJlZmVyIHRvIHRoZSBEMTBWIAotcmVnaXN0ZXJzLiAgWW91IGNhbiBhbHNvIHVzZSBAc2FtcHtzcH0gYXMgYW4gYWxpYXMgZm9yIEBzYW1we3IxNX0uICBUaGUgYWNjdW11bGF0b3JzCi1hcmUgQHNhbXB7YTB9IGFuZCBAc2FtcHthMX0uICBUaGVyZSBhcmUgc3BlY2lhbCByZWdpc3Rlci1wYWlyIG5hbWVzIHRoYXQgbWF5IAotb3B0aW9uYWxseSBiZSB1c2VkIGluIG9wY29kZXMgdGhhdCByZXF1aXJlIGV2ZW4tbnVtYmVyZWQgcmVnaXN0ZXJzLiBSZWdpc3RlciBuYW1lcyBhcmUgCi1ub3QgY2FzZSBzZW5zaXRpdmUuICAKLQotUmVnaXN0ZXIgUGFpcnMKLUB0YWJsZSBAY29kZQotQGl0ZW0gcjAtcjEKLUBpdGVtIHIyLXIzCi1AaXRlbSByNC1yNQotQGl0ZW0gcjYtcjcKLUBpdGVtIHI4LXI5Ci1AaXRlbSByMTAtcjExCi1AaXRlbSByMTItcjEzCi1AaXRlbSByMTQtcjE1Ci1AZW5kIHRhYmxlCi0KLVRoZSBEMTBWIGFsc28gaGFzIHByZWRlZmluZWQgc3ltYm9scyBmb3IgdGhlc2UgY29udHJvbCByZWdpc3RlcnMgYW5kIHN0YXR1cyBiaXRzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBwc3cKLVByb2Nlc3NvciBTdGF0dXMgV29yZAotQGl0ZW0gYnBzdwotQmFja3VwIFByb2Nlc3NvciBTdGF0dXMgV29yZAotQGl0ZW0gcGMKLVByb2dyYW0gQ291bnRlcgotQGl0ZW0gYnBjCi1CYWNrdXAgUHJvZ3JhbSBDb3VudGVyCi1AaXRlbSBycHRfYwotUmVwZWF0IENvdW50Ci1AaXRlbSBycHRfcwotUmVwZWF0IFN0YXJ0IGFkZHJlc3MKLUBpdGVtIHJwdF9lCi1SZXBlYXQgRW5kIGFkZHJlc3MKLUBpdGVtIG1vZF9zCi1Nb2R1bG8gU3RhcnQgYWRkcmVzcwotQGl0ZW0gbW9kX2UKLU1vZHVsbyBFbmQgYWRkcmVzcwotQGl0ZW0gaWJhCi1JbnN0cnVjdGlvbiBCcmVhayBBZGRyZXNzCi1AaXRlbSBmMAotRmxhZyAwCi1AaXRlbSBmMQotRmxhZyAxCi1AaXRlbSBjCi1DYXJyeSBmbGFnCi1AZW5kIHRhYmxlCi0gICAgICAgIAotQG5vZGUgRDEwVi1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIEQxMFYKLUBjaW5kZXggRDEwViBhZGRyZXNzaW5nIG1vZGVzCi1AY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBEMTBWLgotQGNvZGV7UkB2YXJ7bn19IGluIHRoZSBmb2xsb3dpbmcgcmVmZXJzIHRvIGFueSBvZiB0aGUgbnVtYmVyZWQKLXJlZ2lzdGVycywgYnV0IEBlbXBoe25vdH0gdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgotQHRhYmxlIEBjb2RlCi1AaXRlbSBSQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci1AaXRlbSBAQFJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotQGl0ZW0gQEBSQHZhcntufSsKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKLUBpdGVtIEBAUkB2YXJ7bn0tCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtZGVjcmVtZW50Ci1AaXRlbSBAQC1TUAotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci1AaXRlbSBAQChAdmFye2Rpc3B9LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci1AaXRlbSBAdmFye2FkZHJ9Ci1QQyByZWxhdGl2ZSBhZGRyZXNzIChmb3IgYnJhbmNoIG9yIHJlcCkuIAotQGl0ZW0gI0B2YXJ7aW1tfQotSW1tZWRpYXRlIGRhdGEgKHRoZSBAc2FtcHsjfSBpcyBvcHRpb25hbCBhbmQgaWdub3JlZCkKLUBlbmQgdGFibGUKLQotQG5vZGUgRDEwVi1Xb3JkCi1Ac3Vic2VjdGlvbiBAQFdPUkQgTW9kaWZpZXIKLUBjaW5kZXggRDEwViBAQHdvcmQgbW9kaWZpZXIKLUBjaW5kZXggQEB3b3JkIG1vZGlmaWVyLCBEMTBWCi1Bbnkgc3ltYm9sIGZvbGxvd2VkIGJ5IEBjb2Rle0BAd29yZH0gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgc3ltYm9sJ3MgdmFsdWUKLXNoaWZ0ZWQgcmlnaHQgYnkgMi4gIFRoaXMgaXMgdXNlZCBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgbG9hZGluZyBhIHJlZ2lzdGVyCi13aXRoIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gKG9yIGFueSBvdGhlciBjb2RlIGZyYWdtZW50KS4gIEZvciBleGFtcGxlLCBpZgoteW91IHdhbnQgdG8gbG9hZCBhIHJlZ2lzdGVyIHdpdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBmdW5jdGlvbiBAY29kZXttYWlufSB0aGVuCi1qdW1wIHRvIHRoYXQgZnVuY3Rpb24sIHlvdSBjb3VsZCBkbyBpdCBhcyBmb2xsd3M6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWxkaSAgICAgcjIsIG1haW5AQHdvcmQKLWptcCAgICAgcjIKLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIEQxMFYtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBEMTBWCi1AY2luZGV4IEQxMFYgZmxvYXRpbmcgcG9pbnQKLVRoZSBEMTBWIGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9IGFuZCBAY29kZXsuZG91YmxlfQotZGlyZWN0aXZlcyBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuIAotCi1Abm9kZSBEMTBWLU9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLUBjaW5kZXggRDEwViBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgRDEwVgotQGNpbmRleCBtbmVtb25pY3MsIEQxMFYKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgRDEwVgotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBEMTBWIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle0QxMFYgQXJjaGl0ZWN0dXJlOiBBIFZMSVcgTWljcm9wcm9jZXNzb3IgZm9yIE11bHRpbWVkaWEgQXBwbGljYXRpb25zfSAKLShNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuKS4KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBEMTBWIG9wY29kZXMuICBUaGUgb25seSBjaGFuZ2VzIGFyZSB0aG9zZQotZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIG9uIHNpemUgbW9kaWZpZXJzCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1kMzB2LnRleGkgYi9nYXMvZG9jL2MtZDMwdi50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzFiMzQ0Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1kMzB2LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEQzMFYtRGVwZW5kZW50Ci1AY2hhcHRlciBEMzBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEQzMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBEMzBWIHN1cHBvcnQKLUBtZW51Ci0qIEQzMFYtT3B0czo6ICAgICAgICAgICAgICAgICAgIEQzMFYgT3B0aW9ucwotKiBEMzBWLVN5bnRheDo6ICAgICAgICAgICAgICAgICBTeW50YXgKLSogRDMwVi1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogRDMwVi1PcGNvZGVzOjogICAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEQzMFYtT3B0cwotQHNlY3Rpb24gRDMwViBPcHRpb25zCi1AY2luZGV4IG9wdGlvbnMsIEQzMFYKLUBjaW5kZXggRDMwViBvcHRpb25zCi1UaGUgTWl0c3ViaXNoaSBEMzBWIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gaGFzIGEgZmV3IG1hY2hpbmUKLWRlcGVuZGVudCBvcHRpb25zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC1PCi1UaGUgRDMwViBjYW4gb2Z0ZW4gZXhlY3V0ZSB0d28gc3ViLWluc3RydWN0aW9ucyBpbiBwYXJhbGxlbC4gV2hlbiB0aGlzIG9wdGlvbgotaXMgdXNlZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhdHRlbXB0IHRvIG9wdGltaXplIGl0cyBvdXRwdXQgYnkgZGV0ZWN0aW5nIHdoZW4KLWluc3RydWN0aW9ucyBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuCi0KLUBpdGVtIC1uCi1XaGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgaXNzdWUgYSB3YXJuaW5nIGV2ZXJ5Ci10aW1lIGl0IGFkZHMgYSBub3AgaW5zdHJ1Y3Rpb24uCi0KLUBpdGVtIC1OCi1XaGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgaXNzdWUgYSB3YXJuaW5nIGlmIGl0Ci1uZWVkcyB0byBpbnNlcnQgYSBub3AgYWZ0ZXIgYSAzMi1iaXQgbXVsdGlwbHkgYmVmb3JlIGEgbG9hZCBvciAxNi1iaXQKLW11bHRpcGx5IGluc3RydWN0aW9uLgotQGVuZCB0YWJsZQotCi1Abm9kZSBEMzBWLVN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AY2luZGV4IEQzMFYgc3ludGF4Ci1AY2luZGV4IHN5bnRheCwgRDMwVgotCi1UaGUgRDMwViBzeW50YXggaXMgYmFzZWQgb24gdGhlIHN5bnRheCBpbiBNaXRzdWJpc2hpJ3MgRDMwViBhcmNoaXRlY3R1cmUgbWFudWFsLgotVGhlIGRpZmZlcmVuY2VzIGFyZSBkZXRhaWxlZCBiZWxvdy4KLQotQG1lbnUKLSogRDMwVi1TaXplOjogICAgICAgICAgICAgICAgIFNpemUgTW9kaWZpZXJzCi0qIEQzMFYtU3Viczo6ICAgICAgICAgICAgICAgICBTdWItSW5zdHJ1Y3Rpb25zCi0qIEQzMFYtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogRDMwVi1HdWFyZGVkOjogICAgICAgICAgICAgIEd1YXJkZWQgRXhlY3V0aW9uCi0qIEQzMFYtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBEMzBWLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotQGVuZCBtZW51Ci0KLQotQG5vZGUgRDMwVi1TaXplCi1Ac3Vic2VjdGlvbiBTaXplIE1vZGlmaWVycwotQGNpbmRleCBEMzBWIHNpemUgbW9kaWZpZXJzCi1AY2luZGV4IHNpemUgbW9kaWZpZXJzLCBEMzBWCi1UaGUgRDMwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgdGhlIGluc3RydWN0aW9uIG5hbWVzIGluIHRoZSBEMzBWCi1BcmNoaXRlY3R1cmUgTWFudWFsLiAgSG93ZXZlciwgdGhlIG5hbWVzIGluIHRoZSBtYW51YWwgYXJlIHNvbWV0aW1lcyBhbWJpZ3VvdXMuCi1UaGVyZSBhcmUgaW5zdHJ1Y3Rpb24gbmFtZXMgdGhhdCBjYW4gYXNzZW1ibGUgdG8gYSBzaG9ydCBvciBsb25nIGZvcm0gb3Bjb2RlLgotSG93IGRvZXMgdGhlIGFzc2VtYmxlciBwaWNrIHRoZSBjb3JyZWN0IGZvcm0/ICBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGFsd2F5cyBwaWNrIHRoZQotc21hbGxlc3QgZm9ybSBpZiBpdCBjYW4uICBXaGVuIGRlYWxpbmcgd2l0aCBhIHN5bWJvbCB0aGF0IGlzIG5vdCBkZWZpbmVkIHlldCB3aGVuIGEKLWxpbmUgaXMgYmVpbmcgYXNzZW1ibGVkLCBpdCB3aWxsIGFsd2F5cyB1c2UgdGhlIGxvbmcgZm9ybS4gIElmIHlvdSBuZWVkIHRvIGZvcmNlIHRoZSAKLWFzc2VtYmxlciB0byB1c2UgZWl0aGVyIHRoZSBzaG9ydCBvciBsb25nIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uLCB5b3UgY2FuIGFwcGVuZAotZWl0aGVyIEBzYW1wey5zfSAoc2hvcnQpIG9yIEBzYW1wey5sfSAobG9uZykgdG8gaXQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB3cml0aW5nIAotYW4gYXNzZW1ibHkgcHJvZ3JhbSBhbmQgeW91IHdhbnQgdG8gZG8gYSBicmFuY2ggdG8gYSBzeW1ib2wgdGhhdCBpcyBkZWZpbmVkIGxhdGVyCi1pbiB5b3VyIHByb2dyYW0sIHlvdSBjYW4gd3JpdGUgQHNhbXB7YnJhLnMgZm9vfS4gCi1PYmpkdW1wIGFuZCBHREIgd2lsbCBhbHdheXMgYXBwZW5kIEBzYW1wey5zfSBvciBAc2FtcHsubH0gdG8gaW5zdHJ1Y3Rpb25zIHdoaWNoCi1oYXZlIGJvdGggc2hvcnQgYW5kIGxvbmcgZm9ybXMuCi0KLUBub2RlIEQzMFYtU3VicwotQHN1YnNlY3Rpb24gU3ViLUluc3RydWN0aW9ucwotQGNpbmRleCBEMzBWIHN1Yi1pbnN0cnVjdGlvbnMKLUBjaW5kZXggc3ViLWluc3RydWN0aW9ucywgRDMwVgotVGhlIEQzMFYgYXNzZW1ibGVyIHRha2VzIGFzIGlucHV0IGEgc2VyaWVzIG9mIGluc3RydWN0aW9ucywgZWl0aGVyIG9uZS1wZXItbGluZSwKLW9yIGluIHRoZSBzcGVjaWFsIHR3by1wZXItbGluZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uICBTb21lIG9mIHRoZXNlCi1pbnN0cnVjdGlvbnMgd2lsbCBiZSBzaG9ydC1mb3JtIG9yIHN1Yi1pbnN0cnVjdGlvbnMuICBUaGVzZSBzdWItaW5zdHJ1Y3Rpb25zIGNhbiBiZSBwYWNrZWQKLWludG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBUaGUgYXNzZW1ibGVyIHdpbGwgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiAgSXQgd2lsbCBhbHNvIGRldGVjdAotd2hlbiBpdCBzaG91bGQgbm90IHBhY2sgaW5zdHJ1Y3Rpb25zLiAgRm9yIGV4YW1wbGUsIHdoZW4gYSBsYWJlbCBpcyBkZWZpbmVkLCB0aGUgbmV4dAotaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBwYWNrYWdlZCB3aXRoIHRoZSBwcmV2aW91cyBvbmUuICBXaGVuZXZlciBhIGJyYW5jaCBhbmQgbGluawotaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkLCBpdCB3aWxsIG5vdCBiZSBwYWNrYWdlZCB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uIHNvIHRoZSByZXR1cm4KLWFkZHJlc3Mgd2lsbCBiZSB2YWxpZC4gIE5vcHMgYXJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgd2hlbiBuZWNlc3NhcnkuCi0KLUlmIHlvdSBkbyBub3Qgd2FudCB0aGUgYXNzZW1ibGVyIGF1dG9tYXRpY2FsbHkgbWFraW5nIHRoZXNlIGRlY2lzaW9ucywgeW91IGNhbiBjb250cm9sCi10aGUgcGFja2FnaW5nIGFuZCBleGVjdXRpb24gdHlwZSAocGFyYWxsZWwgb3Igc2VxdWVudGlhbCkgd2l0aCB0aGUgc3BlY2lhbCBleGVjdXRpb24gCi1zeW1ib2xzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgCi0KLUBub2RlIEQzMFYtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBEMzBWCi1AY2luZGV4IEQzMFYgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7O30gYW5kIEBzYW1weyN9IGFyZSB0aGUgbGluZSBjb21tZW50IGNoYXJhY3RlcnMuCi1AY2luZGV4IHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZywgRDMwVgotQGNpbmRleCBEMzBWIHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZwotU3ViLWluc3RydWN0aW9ucyBtYXkgYmUgZXhlY3V0ZWQgaW4gb3JkZXIsIGluIHJldmVyc2Utb3JkZXIsIG9yIGluIHBhcmFsbGVsLgotSW5zdHJ1Y3Rpb25zIGxpc3RlZCBpbiB0aGUgc3RhbmRhcmQgb25lLXBlci1saW5lIGZvcm1hdCB3aWxsIGJlIGV4ZWN1dGVkCi1zZXF1ZW50aWFsbHkgdW5sZXNzIHlvdSB1c2UgdGhlIEBzYW1wey1PfSBvcHRpb24uCi0KLVRvIHNwZWNpZnkgdGhlIGV4ZWN1dGluZyBvcmRlciwgdXNlIHRoZSBmb2xsb3dpbmcgc3ltYm9sczogCi1AdGFibGUgQHNhbXAKLUBpdGVtIC0+Ci1TZXF1ZW50aWFsIHdpdGggaW5zdHJ1Y3Rpb24gb24gdGhlIGxlZnQgZmlyc3QuCi0KLUBpdGVtIDwtCi1TZXF1ZW50aWFsIHdpdGggaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGZpcnN0LgotCi1AaXRlbSB8fAotUGFyYWxsZWwKLUBlbmQgdGFibGUKLQotVGhlIEQzMFYgc3ludGF4IGFsbG93cyBlaXRoZXIgb25lIGluc3RydWN0aW9uIHBlciBsaW5lLCBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUgd2l0aAotdGhlIGV4ZWN1dGlvbiBzeW1ib2wsIG9yIHR3byBpbnN0cnVjdGlvbnMgcGVyIGxpbmUuICBGb3IgZXhhbXBsZQotQHRhYmxlIEBjb2RlCi1AaXRlbSBhYnMgcjIscjMgLT4gYWJzIHI0LHI1Ci1FeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseS4gIFRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgaXMgaW4gdGhlIHJpZ2h0Ci1jb250YWluZXIgYW5kIGlzIGV4ZWN1dGVkIHNlY29uZC4KLQotQGl0ZW0gYWJzIHIyLHIzIDwtIGFicyByNCxyNQotRXhlY3V0ZSB0aGVzZSByZXZlcnNlLXNlcXVlbnRpYWxseS4gIFRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgaXMgaW4gdGhlIHJpZ2h0Ci1jb250YWluZXIsIGFuZCBpcyBleGVjdXRlZCBmaXJzdC4KLQotQGl0ZW0gYWJzIHIyLHIzIHx8IGFicyByNCxyNQotRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KLQotQGl0ZW0gbGR3IHIyLEBAKHIzLHI0KSB8fAotQGl0ZW14IG11bHggcjYscjgscjkKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KLQotQGl0ZW0gbXVseCBhMCxyOCxyOQotQGl0ZW14IHN0dyByMixAQChyMyxyNCkKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkgdW5sZXNzIEBzYW1wey1PfSBvcHRpb24gaXMKLXVzZWQuICBJZiB0aGUgQHNhbXB7LU99IG9wdGlvbiBpcyB1c2VkLCB0aGUgYXNzZW1ibGVyIHdpbGwgZGV0ZXJtaW5lIGlmCi10aGUgaW5zdHJ1Y3Rpb25zIGNvdWxkIGJlIGRvbmUgaW4gcGFyYWxsZWwgKHRoZSBhYm92ZSB0d28gaW5zdHJ1Y3Rpb25zCi1jYW4gYmUgZG9uZSBpbiBwYXJhbGxlbCksIGFuZCBpZiBzbywgZW1pdCB0aGVtIGFzIHBhcmFsbGVsIGluc3RydWN0aW9ucy4KLVRoZSBhc3NlbWJsZXIgd2lsbCBwdXQgdGhlbSBpbiB0aGUgcHJvcGVyIGNvbnRhaW5lcnMuICBJbiB0aGUgYWJvdmUKLWV4YW1wbGUsIHRoZSBhc3NlbWJsZXIgd2lsbCBwdXQgdGhlIEBzYW1we3N0d30gaW5zdHJ1Y3Rpb24gaW4gbGVmdAotY29udGFpbmVyIGFuZCB0aGUgQHNhbXB7bXVseH0gaW5zdHJ1Y3Rpb24gaW4gdGhlIHJpZ2h0IGNvbnRhaW5lci4KLQotQGl0ZW0gc3R3IHIyLEBAKHIzLHI0KSAtPgotQGl0ZW14IG11bHggYTAscjgscjkKLVR3by1saW5lIGZvcm1hdC4gIEV4ZWN1dGUgdGhlIEBzYW1we3N0d30gaW5zdHJ1Y3Rpb24gZm9sbG93ZWQgYnkgdGhlCi1Ac2FtcHttdWx4fSBpbnN0cnVjdGlvbiBzZXF1ZW50aWFsbHkuICBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gZ29lcyBpbiB0aGUKLWxlZnQgY29udGFpbmVyIGFuZCB0aGUgc2Vjb25kIGluc3RydWN0aW9uIGdvZXMgaW50byByaWdodCBjb250YWluZXIuCi1UaGUgYXNzZW1ibGVyIHdpbGwgZ2l2ZSBhbiBlcnJvciBpZiB0aGUgbWFjaGluZSBvcmRlcmluZyBjb25zdHJhaW50cyBhcmUKLXZpb2xhdGVkLgotCi1AaXRlbSBzdHcgcjIsQEAocjMscjQpIDwtCi1AaXRlbXggbXVseCBhMCxyOCxyOQotU2FtZSBhcyBwcmV2aW91cyBleGFtcGxlLCBleGNlcHQgdGhhdCB0aGUgQHNhbXB7bXVseH0gaW5zdHJ1Y3Rpb24gaXMKLWV4ZWN1dGVkIGJlZm9yZSB0aGUgQHNhbXB7c3R3fSBpbnN0cnVjdGlvbi4KLUBlbmQgdGFibGUKLQotQGNpbmRleCBzeW1ib2wgbmFtZXMsIEBzYW1weyR9IGluCi1AY2luZGV4IEBjb2RleyR9IGluIHN5bWJvbCBuYW1lcwotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1Abm9kZSBEMzBWLUd1YXJkZWQKLUBzdWJzZWN0aW9uIEd1YXJkZWQgRXhlY3V0aW9uCi1AY2luZGV4IEQzMFYgR3VhcmRlZCBFeGVjdXRpb24KLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmdWxsIHJhbmdlIG9mIGd1YXJkZWQgZXhlY3V0aW9uCi1kaXJlY3RpdmVzIGZvciBlYWNoIGluc3RydWN0aW9uLiAgSnVzdCBhcHBlbmQgdGhlIGRpcmVjdGl2ZSBhZnRlciB0aGUKLWluc3RydWN0aW9uIHByb3Blci4gIFRoZSBkaXJlY3RpdmVzIGFyZToKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAvdHgKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjAgaXMgdHJ1ZS4KLUBpdGVtIC9meAotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMCBpcyBmYWxzZS4KLUBpdGVtIC94dAotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMSBpcyB0cnVlLgotQGl0ZW0gL3hmCi1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYxIGlzIGZhbHNlLgotQGl0ZW0gL3R0Ci1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBib3RoIGZsYWdzIGYwIGFuZCBmMSBhcmUgdHJ1ZS4KLUBpdGVtIC90ZgotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMCBpcyB0cnVlIGFuZCBmbGFnIGYxIGlzIGZhbHNlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBEMzBWLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi1AY2luZGV4IEQzMFYgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgRDMwVgotWW91IGNhbiB1c2UgdGhlIHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyMH0gdGhyb3VnaCBAc2FtcHtyNjN9IHRvIHJlZmVyCi10byB0aGUgRDMwViByZWdpc3RlcnMuICBZb3UgY2FuIGFsc28gdXNlIEBzYW1we3NwfSBhcyBhbiBhbGlhcyBmb3IKLUBzYW1we3I2M30gYW5kIEBzYW1we2xpbmt9IGFzIGFuIGFsaWFzIGZvciBAc2FtcHtyNjJ9LiAgVGhlIGFjY3VtdWxhdG9ycwotYXJlIEBzYW1we2EwfSBhbmQgQHNhbXB7YTF9LgotCi1UaGUgRDMwViBhbHNvIGhhcyBwcmVkZWZpbmVkIHN5bWJvbHMgZm9yIHRoZXNlIGNvbnRyb2wgcmVnaXN0ZXJzIGFuZCBzdGF0dXMgYml0czoKLUB0YWJsZSBAY29kZQotQGl0ZW0gcHN3Ci1Qcm9jZXNzb3IgU3RhdHVzIFdvcmQKLUBpdGVtIGJwc3cKLUJhY2t1cCBQcm9jZXNzb3IgU3RhdHVzIFdvcmQKLUBpdGVtIHBjCi1Qcm9ncmFtIENvdW50ZXIKLUBpdGVtIGJwYwotQmFja3VwIFByb2dyYW0gQ291bnRlcgotQGl0ZW0gcnB0X2MKLVJlcGVhdCBDb3VudAotQGl0ZW0gcnB0X3MKLVJlcGVhdCBTdGFydCBhZGRyZXNzCi1AaXRlbSBycHRfZQotUmVwZWF0IEVuZCBhZGRyZXNzCi1AaXRlbSBtb2RfcwotTW9kdWxvIFN0YXJ0IGFkZHJlc3MKLUBpdGVtIG1vZF9lCi1Nb2R1bG8gRW5kIGFkZHJlc3MKLUBpdGVtIGliYQotSW5zdHJ1Y3Rpb24gQnJlYWsgQWRkcmVzcwotQGl0ZW0gZjAKLUZsYWcgMAotQGl0ZW0gZjEKLUZsYWcgMQotQGl0ZW0gZjIKLUZsYWcgMgotQGl0ZW0gZjMKLUZsYWcgMwotQGl0ZW0gZjQKLUZsYWcgNAotQGl0ZW0gZjUKLUZsYWcgNQotQGl0ZW0gZjYKLUZsYWcgNgotQGl0ZW0gZjcKLUZsYWcgNwotQGl0ZW0gcwotU2FtZSBhcyBmbGFnIDQgKHNhdHVyYXRpb24gZmxhZykKLUBpdGVtIHYKLVNhbWUgYXMgZmxhZyA1IChvdmVyZmxvdyBmbGFnKQotQGl0ZW0gdmEKLVNhbWUgYXMgZmxhZyA2IChzdGlja3kgb3ZlcmZsb3cgZmxhZykKLUBpdGVtIGMKLVNhbWUgYXMgZmxhZyA3IChjYXJyeS9ib3Jyb3cgZmxhZykKLUBpdGVtIGIKLVNhbWUgYXMgZmxhZyA3IChjYXJyeS9ib3Jyb3cgZmxhZykKLUBlbmQgdGFibGUKLSAgICAgICAgCi1Abm9kZSBEMzBWLUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgRDMwVgotQGNpbmRleCBEMzBWIGFkZHJlc3NpbmcgbW9kZXMKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEQzMFYuCi1AY29kZXtSQHZhcntufX0gaW4gdGhlIGZvbGxvd2luZyByZWZlcnMgdG8gYW55IG9mIHRoZSBudW1iZXJlZAotcmVnaXN0ZXJzLCBidXQgQGVtcGh7bm90fSB0aGUgY29udHJvbCByZWdpc3RlcnMuCi1AdGFibGUgQGNvZGUKLUBpdGVtIFJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLUBpdGVtIEBAUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0Ci1AaXRlbSBAQFJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotQGl0ZW0gQEBSQHZhcntufS0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1kZWNyZW1lbnQKLUBpdGVtIEBALVNQCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKLUBpdGVtIEBAKEB2YXJ7ZGlzcH0sIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLUBpdGVtIEB2YXJ7YWRkcn0KLVBDIHJlbGF0aXZlIGFkZHJlc3MgKGZvciBicmFuY2ggb3IgcmVwKS4gCi1AaXRlbSAjQHZhcntpbW19Ci1JbW1lZGlhdGUgZGF0YSAodGhlIEBzYW1weyN9IGlzIG9wdGlvbmFsIGFuZCBpZ25vcmVkKQotQGVuZCB0YWJsZQotCi1Abm9kZSBEMzBWLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgRDMwVgotQGNpbmRleCBEMzBWIGZsb2F0aW5nIHBvaW50Ci1UaGUgRDMwViBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fSBhbmQgQGNvZGV7LmRvdWJsZX0KLWRpcmVjdGl2ZXMgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLiAKLQotQG5vZGUgRDMwVi1PcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi1AY2luZGV4IEQzMFYgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIEQzMFYKLUBjaW5kZXggbW5lbW9uaWNzLCBEMzBWCi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIEQzMFYKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgRDMwViBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtEMzBWIEFyY2hpdGVjdHVyZTogQSBWTElXIE1pY3JvcHJvY2Vzc29yIGZvciBNdWx0aW1lZGlhIEFwcGxpY2F0aW9uc30gCi0oTWl0c3ViaXNoaSBFbGVjdHJpYyBDb3JwLikuCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgRDMwViBvcGNvZGVzLiAgVGhlIG9ubHkgY2hhbmdlcyBhcmUgdGhvc2UKLWRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiBvbiBzaXplIG1vZGlmaWVycwotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaDgzMDAudGV4aSBiL2dhcy9kb2MvYy1oODMwMC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjcwOTE4Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1oODMwMC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1AZW5kIGlmc2V0Ci1Abm9kZSBIOC8zMDAtRGVwZW5kZW50Ci1AY2hhcHRlciBIOC8zMDAgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggSDgvMzAwIHN1cHBvcnQKLUBtZW51Ci0qIEg4LzMwMCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogSDgvMzAwIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEg4LzMwMCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEg4LzMwMCBEaXJlY3RpdmVzOjogICAgICAgICAgIEg4LzMwMCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogSDgvMzAwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEg4LzMwMCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggSDgvMzAwIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMsIEg4LzMwMCAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSGl0YWNoaQotSDgvMzAwIGZhbWlseS4KLQotQG5vZGUgSDgvMzAwIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBIOC8zMDAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogSDgvMzAwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogSDgvMzAwLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEg4LzMwMC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgSDgvMzAwCi1AY2luZGV4IEg4LzMwMCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHs7fSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQGNpbmRleCBsaW5lIHNlcGFyYXRvciwgSDgvMzAwCi1AY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIEg4LzMwMAotQGNpbmRleCBIOC8zMDAgbGluZSBzZXBhcmF0b3IKLUBzYW1weyR9IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCi1UaGVyZWZvcmUgQGVtcGh7eW91IG1heSBub3QgdXNlIEBzYW1weyR9IGluIHN5bWJvbCBuYW1lc30gb24gdGhlIEg4LzMwMC4KLQotQG5vZGUgSDgvMzAwLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggSDgvMzAwIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlciBuYW1lcywgSDgvMzAwCi1Zb3UgY2FuIHVzZSBwcmVkZWZpbmVkIHN5bWJvbHMgb2YgdGhlIGZvcm0gQHNhbXB7ckB2YXJ7bn1ofSBhbmQKLUBzYW1we3JAdmFye259bH0gdG8gcmVmZXIgdG8gdGhlIEg4LzMwMCByZWdpc3RlcnMgYXMgc2l4dGVlbiA4LWJpdAotZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gIEB2YXJ7bn0gaXMgYSBkaWdpdCBmcm9tIEBzYW1wezB9IHRvCi1Ac2FtcHs3fSk7IGZvciBpbnN0YW5jZSwgYm90aCBAc2FtcHtyMGh9IGFuZCBAc2FtcHtyN2x9IGFyZSB2YWxpZAotcmVnaXN0ZXIgbmFtZXMuCi0KLVlvdSBjYW4gYWxzbyB1c2UgdGhlIGVpZ2h0IHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyQHZhcntufX0gdG8gcmVmZXIKLXRvIHRoZSBIOC8zMDAgcmVnaXN0ZXJzIGFzIDE2LWJpdCByZWdpc3RlcnMgKHlvdSBtdXN0IHVzZSB0aGlzIGZvcm0gZm9yCi1hZGRyZXNzaW5nKS4KLQotT24gdGhlIEg4LzMwMEgsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGVpZ2h0IHByZWRlZmluZWQgc3ltYm9scwotQHNhbXB7ZXJAdmFye259fSAoQHNhbXB7ZXIwfSBAZG90c3t9IEBzYW1we2VyN30pIHRvIHJlZmVyIHRvIHRoZSAzMi1iaXQKLWdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuCi0KLVRoZSB0d28gY29udHJvbCByZWdpc3RlcnMgYXJlIGNhbGxlZCBAY29kZXtwY30gKHByb2dyYW0gY291bnRlcjsgYQotMTYtYml0IHJlZ2lzdGVyLCBleGNlcHQgb24gdGhlIEg4LzMwMEggd2hlcmUgaXQgaXMgMjQgYml0cykgYW5kCi1AY29kZXtjY3J9IChjb25kaXRpb24gY29kZSByZWdpc3RlcjsgYW4gOC1iaXQgcmVnaXN0ZXIpLiAgQGNvZGV7cjd9IGlzCi11c2VkIGFzIHRoZSBzdGFjayBwb2ludGVyLCBhbmQgY2FuIGFsc28gYmUgY2FsbGVkIEBjb2Rle3NwfS4KLQotQG5vZGUgSDgvMzAwLUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLQotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBIOC8zMDAKLUBjaW5kZXggSDgvMzAwIGFkZHJlc3NpbmcgbW9kZXMKLUB2YWx1ZXtBU30gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgSDgvMzAwOgotQHRhYmxlIEBjb2RlCi1AaXRlbSByQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci0KLUBpdGVtIEBAckB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0Ci0KLUBuZWVkIDEyMDAKLUBpdGVtIEBAKEB2YXJ7ZH0sIHJAdmFye259KQotQGl0ZW14IEBAKEB2YXJ7ZH06MTYsIHJAdmFye259KQotQGl0ZW14IEBAKEB2YXJ7ZH06MjQsIHJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Q6IDE2LWJpdCBvciAyNC1iaXQgZGlzcGxhY2VtZW50IEB2YXJ7ZH0gZnJvbSByZWdpc3RlcgotQHZhcntufS4gICgyNC1iaXQgZGlzcGxhY2VtZW50cyBhcmUgb25seSBtZWFuaW5nZnVsIG9uIHRoZSBIOC8zMDBILikKLQotQGl0ZW0gQEByQHZhcntufSsKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKLQotQGl0ZW0gQEAtckB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotCi1AaXRlbSBAY29kZXtAQH1AdmFye2FhfQotQGl0ZW14IEBjb2Rle0BAfUB2YXJ7YWF9OjgKLUBpdGVteCBAY29kZXtAQH1AdmFye2FhfToxNgotQGl0ZW14IEBjb2Rle0BAfUB2YXJ7YWF9OjI0Ci1BYnNvbHV0ZSBhZGRyZXNzIEBjb2Rle2FhfS4gIChUaGUgYWRkcmVzcyBzaXplIEBzYW1wezoyNH0gb25seSBtYWtlcwotc2Vuc2Ugb24gdGhlIEg4LzMwMEguKQotCi1AaXRlbSAjQHZhcnt4eH0KLUBpdGVteCAjQHZhcnt4eH06OAotQGl0ZW14ICNAdmFye3h4fToxNgotQGl0ZW14ICNAdmFye3h4fTozMgotSW1tZWRpYXRlIGRhdGEgQHZhcnt4eH0uICBZb3UgbWF5IHNwZWNpZnkgdGhlIEBzYW1wezo4fSwgQHNhbXB7OjE2fSwgb3IKLUBzYW1wezozMn0gZm9yIGNsYXJpdHksIGlmIHlvdSB3aXNoOyBidXQgQGNvZGV7QHZhbHVle0FTfX0gbmVpdGhlcgotcmVxdWlyZXMgdGhpcyBub3IgdXNlcyBpdC0tLXRoZSBkYXRhIHNpemUgcmVxdWlyZWQgaXMgdGFrZW4gZnJvbQotY29udGV4dC4KLQotQGl0ZW0gQGNvZGV7QEB9QGNvZGV7QEB9QHZhcnthYX0KLUBpdGVteCBAY29kZXtAQH1AY29kZXtAQH1AdmFye2FhfTo4Ci1NZW1vcnkgaW5kaXJlY3QuICBZb3UgbWF5IHNwZWNpZnkgdGhlIEBzYW1wezo4fSBmb3IgY2xhcml0eSwgaWYgeW91Ci13aXNoOyBidXQgQGNvZGV7QHZhbHVle0FTfX0gbmVpdGhlciByZXF1aXJlcyB0aGlzIG5vciB1c2VzIGl0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBIOC8zMDAgRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEg4LzMwMCAoQHNje2llZWV9KQotQGNpbmRleCBIOC8zMDAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBIOC8zMDAgZmFtaWx5IGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9Ci1kaXJlY3RpdmUgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLgotCi1AcGFnZQotQG5vZGUgSDgvMzAwIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEg4LzMwMCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBIOC8zMDAgbWFjaGluZSBkaXJlY3RpdmVzIChub25lKQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEg4LzMwMCAobm9uZSkKLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBIOC8zMDAKLUBjaW5kZXggQGNvZGV7aW50fSBkaXJlY3RpdmUsIEg4LzMwMAotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG9ubHkgb25lIG1hY2hpbmUtZGVwZW5kZW50IGRpcmVjdGl2ZSBmb3IgdGhlCi1IOC8zMDA6Ci0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBIOC8zMDBILCBhc3NlbWJsaW5nIGZvcgotQGl0ZW0gLmg4MzAwaAotUmVjb2duaXplIGFuZCBlbWl0IGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgSDgvMzAwSCB2YXJpYW50LCBhbmQKLWFsc28gbWFrZSBAY29kZXsuaW50fSBlbWl0IDMyLWJpdCBudW1iZXJzIHJhdGhlciB0aGFuIHRoZSB1c3VhbCAoMTYtYml0KQotZm9yIHRoZSBIOC8zMDAgZmFtaWx5LgotQGVuZCB0YWJsZQotCi1PbiB0aGUgSDgvMzAwIGZhbWlseSAoaW5jbHVkaW5nIHRoZSBIOC8zMDBIKSBAc2FtcHsud29yZH0gZGlyZWN0aXZlcwotZ2VuZXJhdGUgMTYtYml0IG51bWJlcnMuCi0KLUBub2RlIEg4LzMwMCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggSDgvMzAwIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBIOC8zMDAKLUBjaW5kZXggbW5lbW9uaWNzLCBIOC8zMDAKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgSDgvMzAwCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEg4LzMwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtIOC8zMDAgU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgQURFLS02MDItLTAyNSkuICBGb3IKLWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBIOC8zMDBILCBzZWUgQGNpdGV7SDgvMzAwSCBTZXJpZXMKLVByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkpLgotCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgSDgvMzAwIG9wY29kZXMuICBObyBhZGRpdGlvbmFsCi1wc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuCi0KLUBpZnNldCBTTUFMTAotQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5Ci1AYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgSDgvMzAwIG9wY29kZXMsIGFuZCB0aGVpciBhcmd1bWVudHMuCi1FbnRyaWVzIG1hcmtlZCBAc2FtcHsqfSBhcmUgb3Bjb2RlcyB1c2VkIG9ubHkgb24gdGhlIEg4LzMwMEguCi0KLUBzbWFsbGV4YW1wbGUKLUBjIFVzaW5nIEBncm91cCBzZWVtcyB0byB1c2UgdGhlIG5vcm1hbCBiYXNlbGluZXNraXAsIG5vdCB0aGUgc21hbGxleGFtcGxlCi1AYyBiYXNlbGluZXNraXA7IGxvb2tzIGFwcHJveCBkb3VibGVzcGFjZWQuCi0gICAgICAgICBAaXtMZWdlbmQ6fQotICAgICAgICAgICAgUnMgICBAcntzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBSZCAgIEBye2Rlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgYWJzICBAcnthYnNvbHV0ZSBhZGRyZXNzfQotICAgICAgICAgICAgaW1tICBAcntpbW1lZGlhdGUgZGF0YX0KLSAgICAgICAgIGRpc3A6TiAgQHJ7Ti1iaXQgZGlzcGxhY2VtZW50IGZyb20gYSByZWdpc3Rlcn0KLSAgICAgICAgcGNyZWw6TiAgQHJ7Ti1iaXQgZGlzcGxhY2VtZW50IHJlbGF0aXZlIHRvIHByb2dyYW0gY291bnRlcn0KLQotICAgYWRkLmIgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYW5kYyAjaW1tLGNjcgotICAgYWRkLmIgcnMscmQgICAgICAgICAgICAgICAgICAgYmFuZCAjaW1tLHJkCi0gICBhZGQudyBycyxyZCAgICAgICAgICAgICAgICAgICBiYW5kICNpbW0sQEByZAotKiAgYWRkLncgI2ltbSxyZCAgICAgICAgICAgICAgICAgYmFuZCAjaW1tLEBAYWJzOjgKLSogIGFkZC5sIHJzLHJkICAgICAgICAgICAgICAgICAgIGJyYSAgcGNyZWw6OAotKiAgYWRkLmwgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYnJhICBwY3JlbDoxNgotICAgYWRkcyAjaW1tLHJkICAgICAgICAgICAgICAgICAgYnQgICBwY3JlbDo4Ci0gICBhZGR4ICNpbW0scmQgICAgICAgICAgICAgICAqICBidCAgIHBjcmVsOjE2Ci0gICBhZGR4IHJzLHJkICAgICAgICAgICAgICAgICAgICBicm4gIHBjcmVsOjgKLSAgIGFuZC5iICNpbW0scmQgICAgICAgICAgICAgICogIGJybiAgcGNyZWw6MTYKLSAgIGFuZC5iIHJzLHJkICAgICAgICAgICAgICAgICAgIGJmICAgcGNyZWw6OAotKiAgYW5kLncgcnMscmQgICAgICAgICAgICAgICAgKiAgYmYgICBwY3JlbDoxNgotKiAgYW5kLncgI2ltbSxyZCAgICAgICAgICAgICAgICAgYmhpICBwY3JlbDo4Ci0qICBhbmQubCAjaW1tLHJkICAgICAgICAgICAgICAqICBiaGkgIHBjcmVsOjE2Ci0qICBhbmQubCBycyxyZCAgICAgICAgICAgICAgICAgICBibHMgIHBjcmVsOjgKLUBwYWdlCi0qICBibHMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibGQgICNpbW0scmQKLSAgIGJjYyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJsZCAgI2ltbSxAQHJkCi0qICBiY2MgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibGQgICNpbW0sQEBhYnM6OAotICAgYmhzICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm5vdCAjaW1tLHJkCi0qICBiaHMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibm90ICNpbW0sQEByZAotICAgYmNzICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm5vdCAjaW1tLEBAYWJzOjgKLSogIGJjcyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJub3QgcnMscmQKLSAgIGJsbyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJub3QgcnMsQEByZAotKiAgYmxvICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYm5vdCBycyxAQGFiczo4Ci0gICBibmUgIHBjcmVsOjggICAgICAgICAgICAgICAgICBib3IgICNpbW0scmQKLSogIGJuZSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJvciAgI2ltbSxAQHJkCi0gICBiZXEgIHBjcmVsOjggICAgICAgICAgICAgICAgICBib3IgICNpbW0sQEBhYnM6OAotKiAgYmVxICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNldCAjaW1tLHJkCi0gICBidmMgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic2V0ICNpbW0sQEByZAotKiAgYnZjICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNldCAjaW1tLEBAYWJzOjgKLSAgIGJ2cyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzZXQgcnMscmQKLSogIGJ2cyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzZXQgcnMsQEByZAotICAgYnBsICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnNldCBycyxAQGFiczo4Ci0qICBicGwgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic3IgIHBjcmVsOjgKLSAgIGJtaSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzciAgcGNyZWw6MTYKLSogIGJtaSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzdCAgI2ltbSxyZAotICAgYmdlICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnN0ICAjaW1tLEBAcmQKLSogIGJnZSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzdCAgI2ltbSxAQGFiczo4Ci0gICBibHQgIHBjcmVsOjggICAgICAgICAgICAgICAgICBidHN0ICNpbW0scmQKLSogIGJsdCAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJ0c3QgI2ltbSxAQHJkCi0gICBiZ3QgIHBjcmVsOjggICAgICAgICAgICAgICAgICBidHN0ICNpbW0sQEBhYnM6OAotKiAgYmd0ICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnRzdCBycyxyZAotICAgYmxlICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnRzdCBycyxAQHJkCi0qICBibGUgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBidHN0IHJzLEBAYWJzOjgKLSAgIGJjbHIgI2ltbSxyZCAgICAgICAgICAgICAgICAgIGJ4b3IgI2ltbSxyZAotICAgYmNsciAjaW1tLEBAcmQgICAgICAgICAgICAgICAgIGJ4b3IgI2ltbSxAQHJkCi0gICBiY2xyICNpbW0sQEBhYnM6OCAgICAgICAgICAgICAgYnhvciAjaW1tLEBAYWJzOjgKLSAgIGJjbHIgcnMscmQgICAgICAgICAgICAgICAgICAgIGNtcC5iICNpbW0scmQKLSAgIGJjbHIgcnMsQEByZCAgICAgICAgICAgICAgICAgICBjbXAuYiBycyxyZAotICAgYmNsciBycyxAQGFiczo4ICAgICAgICAgICAgICAgIGNtcC53IHJzLHJkCi0gICBiaWFuZCAjaW1tLHJkICAgICAgICAgICAgICAgICBjbXAudyBycyxyZAotICAgYmlhbmQgI2ltbSxAQHJkICAgICAgICAgICAgICogIGNtcC53ICNpbW0scmQKLSAgIGJpYW5kICNpbW0sQEBhYnM6OCAgICAgICAgICAqICBjbXAubCAjaW1tLHJkCi0gICBiaWxkICNpbW0scmQgICAgICAgICAgICAgICAqICBjbXAubCBycyxyZAotICAgYmlsZCAjaW1tLEBAcmQgICAgICAgICAgICAgICAgIGRhYSAgcnMKLSAgIGJpbGQgI2ltbSxAQGFiczo4ICAgICAgICAgICAgICBkYXMgIHJzCi0gICBiaW9yICNpbW0scmQgICAgICAgICAgICAgICAgICBkZWMuYiBycwotICAgYmlvciAjaW1tLEBAcmQgICAgICAgICAgICAgICogIGRlYy53ICNpbW0scmQKLSAgIGJpb3IgI2ltbSxAQGFiczo4ICAgICAgICAgICAqICBkZWMubCAjaW1tLHJkCi0gICBiaXN0ICNpbW0scmQgICAgICAgICAgICAgICAgICBkaXZ4dS5iIHJzLHJkCi0gICBiaXN0ICNpbW0sQEByZCAgICAgICAgICAgICAgKiAgZGl2eHUudyBycyxyZAotICAgYmlzdCAjaW1tLEBAYWJzOjggICAgICAgICAgICogIGRpdnhzLmIgcnMscmQKLSAgIGJpeG9yICNpbW0scmQgICAgICAgICAgICAgICogIGRpdnhzLncgcnMscmQKLSAgIGJpeG9yICNpbW0sQEByZCAgICAgICAgICAgICAgICBlZXBtb3YKLSAgIGJpeG9yICNpbW0sQEBhYnM6OCAgICAgICAgICAqICBlZXBtb3Z3Ci1AcGFnZQotKiAgZXh0cy53IHJkICAgICAgICAgICAgICAgICAgICAgbW92LncgcnMsQEBhYnM6MTYKLSogIGV4dHMubCByZCAgICAgICAgICAgICAgICAgICogIG1vdi5sICNpbW0scmQKLSogIGV4dHUudyByZCAgICAgICAgICAgICAgICAgICogIG1vdi5sIHJzLHJkCi0qICBleHR1LmwgcmQgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQHJzLHJkCi0gICBpbmMgIHJzICAgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQChkaXNwOjE2LHJzKSxyZAotKiAgaW5jLncgI2ltbSxyZCAgICAgICAgICAgICAgKiAgbW92LmwgQEAoZGlzcDoyNCxycykscmQKLSogIGluYy5sICNpbW0scmQgICAgICAgICAgICAgICogIG1vdi5sIEBAcnMrLHJkCi0gICBqbXAgIEBAcnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgQEBhYnM6MTYscmQKLSAgIGptcCAgYWJzICAgICAgICAgICAgICAgICAgICogIG1vdi5sIEBAYWJzOjI0LHJkCi0gICBqbXAgIEBAQEBhYnM6OCAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAcmQKLSAgIGpzciAgQEBycyAgICAgICAgICAgICAgICAgICAqICBtb3YubCBycyxAQChkaXNwOjE2LHJkKQotICAganNyICBhYnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEAoZGlzcDoyNCxyZCkKLSAgIGpzciAgQEBAQGFiczo4ICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEAtcmQKLSAgIGxkYyAgI2ltbSxjY3IgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAYWJzOjE2Ci0gICBsZGMgIHJzLGNjciAgICAgICAgICAgICAgICAqICBtb3YubCBycyxAQGFiczoyNAotKiAgbGRjICBAQGFiczoxNixjY3IgICAgICAgICAgICAgIG1vdmZwZSBAQGFiczoxNixyZAotKiAgbGRjICBAQGFiczoyNCxjY3IgICAgICAgICAgICAgIG1vdnRwZSBycyxAQGFiczoxNgotKiAgbGRjICBAQChkaXNwOjE2LHJzKSxjY3IgICAgICAgIG11bHh1LmIgcnMscmQKLSogIGxkYyAgQEAoZGlzcDoyNCxycyksY2NyICAgICAqICBtdWx4dS53IHJzLHJkCi0qICBsZGMgIEBAcnMrLGNjciAgICAgICAgICAgICAgKiAgbXVseHMuYiBycyxyZAotKiAgbGRjICBAQHJzLGNjciAgICAgICAgICAgICAgICogIG11bHhzLncgcnMscmQKLSogIG1vdi5iIEBAKGRpc3A6MjQscnMpLHJkICAgICAgICBuZWcuYiBycwotKiAgbW92LmIgcnMsQEAoZGlzcDoyNCxyZCkgICAgICogIG5lZy53IHJzCi0gICBtb3YuYiBAQGFiczoxNixyZCAgICAgICAgICAgKiAgbmVnLmwgcnMKLSAgIG1vdi5iIHJzLHJkICAgICAgICAgICAgICAgICAgIG5vcAotICAgbW92LmIgQEBhYnM6OCxyZCAgICAgICAgICAgICAgIG5vdC5iIHJzCi0gICBtb3YuYiBycyxAQGFiczo4ICAgICAgICAgICAgKiAgbm90LncgcnMKLSAgIG1vdi5iIHJzLHJkICAgICAgICAgICAgICAgICogIG5vdC5sIHJzCi0gICBtb3YuYiAjaW1tLHJkICAgICAgICAgICAgICAgICBvci5iICNpbW0scmQKLSAgIG1vdi5iIEBAcnMscmQgICAgICAgICAgICAgICAgICBvci5iIHJzLHJkCi0gICBtb3YuYiBAQChkaXNwOjE2LHJzKSxyZCAgICAgKiAgb3IudyAjaW1tLHJkCi0gICBtb3YuYiBAQHJzKyxyZCAgICAgICAgICAgICAgKiAgb3IudyBycyxyZAotICAgbW92LmIgQEBhYnM6OCxyZCAgICAgICAgICAgICogIG9yLmwgI2ltbSxyZAotICAgbW92LmIgcnMsQEByZCAgICAgICAgICAgICAgICogIG9yLmwgcnMscmQKLSAgIG1vdi5iIHJzLEBAKGRpc3A6MTYscmQpICAgICAgICBvcmMgICNpbW0sY2NyCi0gICBtb3YuYiBycyxAQC1yZCAgICAgICAgICAgICAgICAgcG9wLncgcnMKLSAgIG1vdi5iIHJzLEBAYWJzOjggICAgICAgICAgICAqICBwb3AubCBycwotICAgbW92LncgcnMsQEByZCAgICAgICAgICAgICAgICAgIHB1c2gudyBycwotKiAgbW92LncgQEAoZGlzcDoyNCxycykscmQgICAgICogIHB1c2gubCBycwotKiAgbW92LncgcnMsQEAoZGlzcDoyNCxyZCkgICAgICAgIHJvdGwuYiBycwotKiAgbW92LncgQEBhYnM6MjQscmQgICAgICAgICAgICogIHJvdGwudyBycwotKiAgbW92LncgcnMsQEBhYnM6MjQgICAgICAgICAgICogIHJvdGwubCBycwotICAgbW92LncgcnMscmQgICAgICAgICAgICAgICAgICAgcm90ci5iIHJzCi0gICBtb3YudyAjaW1tLHJkICAgICAgICAgICAgICAqICByb3RyLncgcnMKLSAgIG1vdi53IEBAcnMscmQgICAgICAgICAgICAgICAqICByb3RyLmwgcnMKLSAgIG1vdi53IEBAKGRpc3A6MTYscnMpLHJkICAgICAgICByb3R4bC5iIHJzCi0gICBtb3YudyBAQHJzKyxyZCAgICAgICAgICAgICAgKiAgcm90eGwudyBycwotICAgbW92LncgQEBhYnM6MTYscmQgICAgICAgICAgICogIHJvdHhsLmwgcnMKLSAgIG1vdi53IHJzLEBAKGRpc3A6MTYscmQpICAgICAgICByb3R4ci5iIHJzCi0gICBtb3YudyBycyxAQC1yZCAgICAgICAgICAgICAgKiAgcm90eHIudyBycwotQHBhZ2UKLSogIHJvdHhyLmwgcnMgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBAKGRpc3A6MjQscmQpCi0gICBicHQgICAgICAgICAgICAgICAgICAgICAgICAqICBzdGMgIGNjcixAQC1yZAotICAgcnRlICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3RjICBjY3IsQEBhYnM6MTYKLSAgIHJ0cyAgICAgICAgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBAYWJzOjI0Ci0gICBzaGFsLmIgcnMgICAgICAgICAgICAgICAgICAgICBzdWIuYiBycyxyZAotKiAgc2hhbC53IHJzICAgICAgICAgICAgICAgICAgICAgc3ViLncgcnMscmQKLSogIHNoYWwubCBycyAgICAgICAgICAgICAgICAgICogIHN1Yi53ICNpbW0scmQKLSAgIHNoYXIuYiBycyAgICAgICAgICAgICAgICAgICogIHN1Yi5sIHJzLHJkCi0qICBzaGFyLncgcnMgICAgICAgICAgICAgICAgICAqICBzdWIubCAjaW1tLHJkCi0qICBzaGFyLmwgcnMgICAgICAgICAgICAgICAgICAgICBzdWJzICNpbW0scmQKLSAgIHNobGwuYiBycyAgICAgICAgICAgICAgICAgICAgIHN1YnggI2ltbSxyZAotKiAgc2hsbC53IHJzICAgICAgICAgICAgICAgICAgICAgc3VieCBycyxyZAotKiAgc2hsbC5sIHJzICAgICAgICAgICAgICAgICAgKiAgdHJhcGEgI2ltbQotICAgc2hsci5iIHJzICAgICAgICAgICAgICAgICAgICAgeG9yICAjaW1tLHJkCi0qICBzaGxyLncgcnMgICAgICAgICAgICAgICAgICAgICB4b3IgIHJzLHJkCi0qICBzaGxyLmwgcnMgICAgICAgICAgICAgICAgICAqICB4b3IudyAjaW1tLHJkCi0gICBzbGVlcCAgICAgICAgICAgICAgICAgICAgICAqICB4b3IudyBycyxyZAotICAgc3RjICBjY3IscmQgICAgICAgICAgICAgICAgKiAgeG9yLmwgI2ltbSxyZAotKiAgc3RjICBjY3IsQEBycyAgICAgICAgICAgICAgICogIHhvci5sIHJzLHJkCi0qICBzdGMgIGNjcixAQChkaXNwOjE2LHJkKSAgICAgICAgeG9yYyAjaW1tLGNjcgotQGVuZCBzbWFsbGV4YW1wbGUKLUBlbmQgaWZzZXQKLQotQGNpbmRleCBzaXplIHN1ZmZpeGVzLCBIOC8zMDAKLUBjaW5kZXggSDgvMzAwIHNpemUgc3VmZml4ZXMKLUZvdXIgSDgvMzAwIGluc3RydWN0aW9ucyAoQGNvZGV7YWRkfSwgQGNvZGV7Y21wfSwgQGNvZGV7bW92fSwKLUBjb2Rle3N1Yn0pIGFyZSBkZWZpbmVkIHdpdGggdmFyaWFudHMgdXNpbmcgdGhlIHN1ZmZpeGVzIEBzYW1wey5ifSwKLUBzYW1wey53fSwgYW5kIEBzYW1wey5sfSB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIGEgbWVtb3J5IG9wZXJhbmQuCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGVzZSBzdWZmaXhlcywgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlbTsKLXNpbmNlIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgYWx3YXlzIGEgcmVnaXN0ZXIsIEBjb2Rle0B2YWx1ZXtBU319IGNhbgotZGVkdWNlIHRoZSBjb3JyZWN0IHNpemUuCi0KLUZvciBleGFtcGxlLCBzaW5jZSBAY29kZXtyMH0gcmVmZXJzIHRvIGEgMTYtYml0IHJlZ2lzdGVyLAotQGV4YW1wbGUKLW1vdiAgICByMCxAQGZvbwotQGV4ZGVudCBpcyBlcXVpdmFsZW50IHRvCi1tb3YudyAgcjAsQEBmb28KLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgdXNlIHRoZSBzaXplIHN1ZmZpeGVzLCBAY29kZXtAdmFsdWV7QVN9fSBpc3N1ZXMgYSB3YXJuaW5nIHdoZW4KLXRoZSBzdWZmaXggYW5kIHRoZSByZWdpc3RlciBzaXplIGRvIG5vdCBtYXRjaC4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1oODUwMC50ZXhpIGIvZ2FzL2RvYy9jLWg4NTAwLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjBlNjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWg4NTAwLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AcGFnZQotQG5vZGUgSDgvNTAwLURlcGVuZGVudAotQGNoYXB0ZXIgSDgvNTAwIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IEg4LzUwMCBzdXBwb3J0Ci1AbWVudQotKiBIOC81MDAgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEg4LzUwMCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBIOC81MDAgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBIOC81MDAgRGlyZWN0aXZlczo6ICAgICAgICAgICBIOC81MDAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIEg4LzUwMCBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIOC81MDAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IEg4LzUwMCBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zLCBIOC81MDAgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEhpdGFjaGkKLUg4LzUwMCBmYW1pbHkuCi0KLUBub2RlIEg4LzUwMCBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotCi1AbWVudQotKiBIOC81MDAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogSDgvNTAwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogSDgvNTAwLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEg4LzUwMC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgSDgvNTAwCi1AY2luZGV4IEg4LzUwMCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHshfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQGNpbmRleCBsaW5lIHNlcGFyYXRvciwgSDgvNTAwCi1AY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIEg4LzUwMAotQGNpbmRleCBIOC81MDAgbGluZSBzZXBhcmF0b3IKLUBzYW1wezt9IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCi0KLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgotQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgSDgvNTAwLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggSDgvNTAwIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIEg4LzUwMAotWW91IGNhbiB1c2UgdGhlIHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyMH0sIEBzYW1we3IxfSwgQHNhbXB7cjJ9LAotQHNhbXB7cjN9LCBAc2FtcHtyNH0sIEBzYW1we3I1fSwgQHNhbXB7cjZ9LCBhbmQgQHNhbXB7cjd9IHRvIHJlZmVyIHRvCi10aGUgSDgvNTAwIHJlZ2lzdGVycy4KLQotVGhlIEg4LzUwMCBhbHNvIGhhcyB0aGVzZSBjb250cm9sIHJlZ2lzdGVyczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBjcAotY29kZSBwb2ludGVyCi0KLUBpdGVtIGRwCi1kYXRhIHBvaW50ZXIKLQotQGl0ZW0gYnAKLWJhc2UgcG9pbnRlcgotCi1AaXRlbSB0cAotc3RhY2sgdG9wIHBvaW50ZXIKLQotQGl0ZW0gZXAKLWV4dHJhIHBvaW50ZXIKLQotQGl0ZW0gc3IKLXN0YXR1cyByZWdpc3RlcgotCi1AaXRlbSBjY3IKLWNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyCi1AZW5kIHRhYmxlCi0KLUFsbCByZWdpc3RlcnMgYXJlIDE2IGJpdHMgbG9uZy4gIFRvIHJlcHJlc2VudCAzMiBiaXQgbnVtYmVycywgdXNlIHR3bwotYWRqYWNlbnQgcmVnaXN0ZXJzOyBmb3IgZGlzdGFudCBtZW1vcnkgYWRkcmVzc2VzLCB1c2Ugb25lIG9mIHRoZSBzZWdtZW50Ci1wb2ludGVycyAoQGNvZGV7Y3B9IGZvciB0aGUgcHJvZ3JhbSBjb3VudGVyOyBAY29kZXtkcH0gZm9yCi1AY29kZXtyMH0tLUBjb2Rle3IzfTsgQGNvZGV7ZXB9IGZvciBAY29kZXtyNH0gYW5kIEBjb2Rle3I1fTsgYW5kCi1AY29kZXt0cH0gZm9yIEBjb2Rle3I2fSBhbmQgQGNvZGV7cjd9LgotCi1Abm9kZSBIOC81MDAtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIEg4LzUwMAotQGNpbmRleCBIOC81MDAgYWRkcmVzc2luZyBtb2RlcwotQHZhbHVle0FTfSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBIOC81MDA6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIFJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLQotQGl0ZW0gQEBSQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLQotQGl0ZW0gQEAoZDo4LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudAotCi1AaXRlbSBAQChkOjE2LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggMTYgYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQKLQotQGl0ZW0gQEAtUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotCi1AaXRlbSBAQFJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotCi1AaXRlbSBAQEB2YXJ7YWF9OjgKLTggYml0IGFic29sdXRlIGFkZHJlc3MKLQotQGl0ZW0gQEBAdmFye2FhfToxNgotMTYgYml0IGFic29sdXRlIGFkZHJlc3MKLQotQGl0ZW0gI0B2YXJ7eHh9OjgKLTggYml0IGltbWVkaWF0ZQotCi1AaXRlbSAjQHZhcnt4eH06MTYKLTE2IGJpdCBpbW1lZGlhdGUKLUBlbmQgdGFibGUKLQotQG5vZGUgSDgvNTAwIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBIOC81MDAgKEBzY3tpZWVlfSkKLUBjaW5kZXggSDgvNTAwIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgSDgvNTAwIGZhbWlseSBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fQotZGlyZWN0aXZlIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4KLQotQG5vZGUgSDgvNTAwIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEg4LzUwMCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBIOC81MDAgbWFjaGluZSBkaXJlY3RpdmVzIChub25lKQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEg4LzUwMCAobm9uZSkKLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBIOC81MDAKLUBjaW5kZXggQGNvZGV7aW50fSBkaXJlY3RpdmUsIEg4LzUwMAotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGRpcmVjdGl2ZXMgZm9yIHRoZSBIOC81MDAuCi1Ib3dldmVyLCBvbiB0aGlzIHBsYXRmb3JtIHRoZSBAc2FtcHsuaW50fSBhbmQgQHNhbXB7LndvcmR9IGRpcmVjdGl2ZXMKLWdlbmVyYXRlIDE2LWJpdCBudW1iZXJzLgotCi1Abm9kZSBIOC81MDAgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IEg4LzUwMCBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgSDgvNTAwCi1AY2luZGV4IG1uZW1vbmljcywgSDgvNTAwCi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIEg4LzUwMAotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBIOC81MDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7SDgvNTAwIFNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIE0yMVQwMDEpLgotCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgSDgvNTAwIG9wY29kZXMuICBObyBhZGRpdGlvbmFsCi1wc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuCi0KLUBpZnNldCBTTUFMTAotQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5Ci1AYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyBIOC81MDAgb3Bjb2RlcyBhbmQgdGhlaXIgb3BlcmFuZHM6Ci0KLUBjIFVzZSBAZ3JvdXAgaWYgaXQgZXZlciB3b3JrcywgaW5zdGVhZCBvZiBAcGFnZQotQHBhZ2UKLUBzbWFsbGV4YW1wbGUKLUBpe0xlZ2VuZDp9Ci1hYnM4ICAgICAgQHJ7OC1iaXQgYWJzb2x1dGUgYWRkcmVzc30KLWFiczE2ICAgICBAcnsxNi1iaXQgYWJzb2x1dGUgYWRkcmVzc30KLWFiczI0ICAgICBAcnsyNC1iaXQgYWJzb2x1dGUgYWRkcmVzc30KLWNyYiAgICAgICBAcntAY29kZXtjY3J9LCBAY29kZXticn0sIEBjb2Rle2VwfSwgQGNvZGV7ZHB9LCBAY29kZXt0cH0sIEBjb2Rle2RwfX0KLWRpc3A4ICAgICBAcns4LWJpdCBkaXNwbGFjZW1lbnR9Ci1lYSAgICAgICAgQHJ7QGNvZGV7cm59LCBAY29kZXtAQHJufSwgQGNvZGV7QEAoZDo4LCBybil9LCBAY29kZXtAQChkOjE2LCBybil9LH0KLSAgICAgICAgICBAcntAY29kZXtAQC1ybn0sIEBjb2Rle0BAcm4rfSwgQGNvZGV7QEBhYTo4fSwgQGNvZGV7QEBhYToxNn0sfQotICAgICAgICAgIEBye0Bjb2RleyN4eDo4fSwgQGNvZGV7I3h4OjE2fX0KLWVhX21lbSAgICBAcntAY29kZXtAQHJufSwgQGNvZGV7QEAoZDo4LCBybil9LCBAY29kZXtAQChkOjE2LCBybil9LH0KLSAgICAgICAgICBAcntAY29kZXtAQC1ybn0sIEBjb2Rle0BAcm4rfSwgQGNvZGV7QEBhYTo4fSwgQGNvZGV7QEBhYToxNn19Ci1lYV9ub2ltbSAgQHJ7QGNvZGV7cm59LCBAY29kZXtAQHJufSwgQGNvZGV7QEAoZDo4LCBybil9LCBAY29kZXtAQChkOjE2LCBybil9LH0KLSAgICAgICAgICBAcntAY29kZXtAQC1ybn0sIEBjb2Rle0BAcm4rfSwgQGNvZGV7QEBhYTo4fSwgQGNvZGV7QEBhYToxNn19Ci1mcCAgICAgICAgcjYKLWltbTQgICAgICBAcns0LWJpdCBpbW1lZGlhdGUgZGF0YX0KLWltbTggICAgICBAcns4LWJpdCBpbW1lZGlhdGUgZGF0YX0KLWltbTE2ICAgICBAcnsxNi1iaXQgaW1tZWRpYXRlIGRhdGF9Ci1wY3JlbDggICAgQHJ7OC1iaXQgb2Zmc2V0IGZyb20gcHJvZ3JhbSBjb3VudGVyfQotcGNyZWwxNiAgIEByezE2LWJpdCBvZmZzZXQgZnJvbSBwcm9ncmFtIGNvdW50ZXJ9Ci1xaW0gICAgICAgQHJ7QGNvZGV7LTJ9LCBAY29kZXstMX0sIEBjb2RlezF9LCBAY29kZXsyfX0KLXJkICAgICAgICBAcnthbnkgcmVnaXN0ZXJ9Ci1ycyAgICAgICAgQHJ7YSByZWdpc3RlciBkaXN0aW5jdCBmcm9tIHJkfQotcmxpc3QgICAgIEBye2NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlZ2lzdGVycyBpbiBwYXJlbnRoZXNlczt9Ci0gICAgICAgICAgQHJ7cmVnaXN0ZXIgcmFuZ2VzIEBjb2Rle3JkLXJzfSBhcmUgYWxsb3dlZH0KLXNwICAgICAgICBAcntzdGFjayBwb2ludGVyIChAY29kZXtyN30pfQotc3IgICAgICAgIEBye3N0YXR1cyByZWdpc3Rlcn0KLXN6ICAgICAgICBAcntzaXplOyBAc2FtcHsuYn0gb3IgQHNhbXB7Lnd9LiAgSWYgb21pdHRlZCwgZGVmYXVsdCBAc2FtcHsud319Ci0KLWxkY1suYl0gZWEsY3JiICAgICAgICAgICAgICAgICBiY2NbLnddIHBjcmVsMTYKLWxkY1sud10gZWEsc3IgICAgICAgICAgICAgICAgICBiY2NbLmJdIHBjcmVsOCAKLWFkZFs6cV0gc3ogcWltLGVhX25vaW1tICAgICAgICBiaHNbLnddIHBjcmVsMTYKLWFkZFs6Z10gc3ogZWEscmQgICAgICAgICAgICAgICBiaHNbLmJdIHBjcmVsOCAKLWFkZHMgc3ogZWEscmQgICAgICAgICAgICAgICAgICBiY3NbLnddIHBjcmVsMTYKLWFkZHggc3ogZWEscmQgICAgICAgICAgICAgICAgICBiY3NbLmJdIHBjcmVsOCAKLWFuZCBzeiBlYSxyZCAgICAgICAgICAgICAgICAgICBibG9bLnddIHBjcmVsMTYKLWFuZGNbLmJdIGltbTgsY3JiICAgICAgICAgICAgICBibG9bLmJdIHBjcmVsOCAKLWFuZGNbLnddIGltbTE2LHNyICAgICAgICAgICAgICBibmVbLnddIHBjcmVsMTYKLWJwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBibmVbLmJdIHBjcmVsOCAKLWJyYVsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBiZXFbLnddIHBjcmVsMTYKLWJyYVsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBiZXFbLmJdIHBjcmVsOCAKLWJ0Wy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgICBidmNbLnddIHBjcmVsMTYKLWJ0Wy5iXSBwY3JlbDggICAgICAgICAgICAgICAgICBidmNbLmJdIHBjcmVsOCAKLWJyblsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBidnNbLnddIHBjcmVsMTYKLWJyblsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBidnNbLmJdIHBjcmVsOCAKLWJmWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgICBicGxbLnddIHBjcmVsMTYKLWJmWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgICBicGxbLmJdIHBjcmVsOCAKLWJoaVsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBibWlbLnddIHBjcmVsMTYKLWJoaVsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBibWlbLmJdIHBjcmVsOCAKLWJsc1sud10gcGNyZWwxNiAgICAgICAgICAgICAgICBiZ2VbLnddIHBjcmVsMTYKLWJsc1suYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBiZ2VbLmJdIHBjcmVsOCAKLUBwYWdlCi1ibHRbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgbW92WzpnXVsuYl0gaW1tOCxlYV9tZW0gICAgICAgCi1ibHRbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgbW92WzpnXVsud10gaW1tMTYsZWFfbWVtICAgICAgCi1iZ3RbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgbW92ZnBlWy5iXSBlYSxyZCAgICAgICAgICAgICAgCi1iZ3RbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgbW92dHBlWy5iXSBycyxlYV9ub2ltbSAgICAgICAgCi1ibGVbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgbXVseHUgc3ogZWEscmQgICAgICAgICAgICAgICAgCi1ibGVbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgbmVnIHN6IGVhICAgICAgICAgICAgICAgICAgICAgCi1iY2xyIHN6IGltbTQsZWFfbm9pbW0gICAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1iY2xyIHN6IHJzLGVhX25vaW1tICAgICAgICAgICAgbm90IHN6IGVhICAgICAgICAgICAgICAgICAgICAgCi1ibm90IHN6IGltbTQsZWFfbm9pbW0gICAgICAgICAgb3Igc3ogZWEscmQgICAgICAgICAgICAgICAgICAgCi1ibm90IHN6IHJzLGVhX25vaW1tICAgICAgICAgICAgb3JjWy5iXSBpbW04LGNyYiAgICAgICAgICAgICAgCi1ic2V0IHN6IGltbTQsZWFfbm9pbW0gICAgICAgICAgb3JjWy53XSBpbW0xNixzciAgICAgICAgICAgICAgCi1ic2V0IHN6IHJzLGVhX25vaW1tICAgICAgICAgICAgcGptcCBhYnMyNCAgICAgICAgICAgICAgICAgICAgCi1ic3JbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgcGptcCBAQHJkICAgICAgICAgICAgICAgICAgICAgCi1ic3JbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgcGpzciBhYnMyNCAgICAgICAgICAgICAgICAgICAgCi1idHN0IHN6IGltbTQsZWFfbm9pbW0gICAgICAgICAgcGpzciBAQHJkICAgICAgICAgICAgICAgICAgICAgCi1idHN0IHN6IHJzLGVhX25vaW1tICAgICAgICAgICAgcHJ0ZCBpbW04ICAgICAgICAgICAgICAgICAgICAgCi1jbHIgc3ogZWEgICAgICAgICAgICAgICAgICAgICAgcHJ0ZCBpbW0xNiAgICAgICAgICAgICAgICAgICAgCi1jbXBbOmVdWy5iXSBpbW04LHJkICAgICAgICAgICAgcHJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgCi1jbXBbOmldWy53XSBpbW0xNixyZCAgICAgICAgICAgcm90bCBzeiBlYSAgICAgICAgICAgICAgICAgICAgCi1jbXBbOmddLmIgaW1tOCxlYV9ub2ltbSAgICAgICAgcm90ciBzeiBlYSAgICAgICAgICAgICAgICAgICAgCi1jbXBbOmddWy53XSBpbW0xNixlYV9ub2ltbSAgICAgcm90eGwgc3ogZWEgICAgICAgICAgICAgICAgICAgCi1DbXBbOmddIHN6IGVhLHJkICAgICAgICAgICAgICAgcm90eHIgc3ogZWEgICAgICAgICAgICAgICAgICAgCi1kYWRkIHJzLHJkICAgICAgICAgICAgICAgICAgICAgcnRkIGltbTggICAgICAgICAgICAgICAgICAgICAKLWRpdnh1IHN6IGVhLHJkICAgICAgICAgICAgICAgICBydGQgaW1tMTYgICAgICAgICAgICAgICAgICAgIAotZHN1YiBycyxyZCAgICAgICAgICAgICAgICAgICAgIHJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgCi1leHRzWy5iXSByZCAgICAgICAgICAgICAgICAgICAgc2NiL2YgcnMscGNyZWw4ICAgICAgICAgICAgICAgCi1leHR1Wy5iXSByZCAgICAgICAgICAgICAgICAgICAgc2NiL25lIHJzLHBjcmVsOCAgICAgICAgICAgICAKLWptcCBAQHJkICAgICAgICAgICAgICAgICAgICAgICAgc2NiL2VxIHJzLHBjcmVsOCAgICAgICAgICAgICAKLWptcCBAQChpbW04LHJkKSAgICAgICAgICAgICAgICAgc2hhbCBzeiBlYSAgICAgICAgICAgICAgICAgICAKLWptcCBAQChpbW0xNixyZCkgICAgICAgICAgICAgICAgc2hhciBzeiBlYSAgICAgICAgICAgICAgICAgICAgCi1qbXAgYWJzMTYgICAgICAgICAgICAgICAgICAgICAgc2hsbCBzeiBlYSAgICAgICAgICAgIAotanNyIEBAcmQgICAgICAgICAgICAgICAgICAgICAgICBzaGxyIHN6IGVhICAgICAgICAgICAgCi1qc3IgQEAoaW1tOCxyZCkgICAgICAgICAgICAgICAgIHNsZWVwICAgICAgICAgICAgICAgICAKLWpzciBAQChpbW0xNixyZCkgICAgICAgICAgICAgICAgc3RjWy5iXSBjcmIsZWFfbm9pbW0gIAotanNyIGFiczE2ICAgICAgICAgICAgICAgICAgICAgIHN0Y1sud10gc3IsZWFfbm9pbW0gICAKLWxkbSBAQHNwKywocmxpc3QpICAgICAgICAgICAgICAgc3RtIChybGlzdCksQEAtc3AgICAgIAotbGluayBmcCxpbW04ICAgICAgICAgICAgICAgICAgIHN1YiBzeiBlYSxyZCAgICAgICAgICAKLWxpbmsgZnAsaW1tMTYgICAgICAgICAgICAgICAgICBzdWJzIHN6IGVhLHJkICAgICAgICAgCi1tb3ZbOmVdWy5iXSBpbW04LHJkICAgICAgICAgICAgc3VieCBzeiBlYSxyZCAgICAgICAgIAotbW92WzppXVsud10gaW1tMTYscmQgICAgICAgICAgIHN3YXBbLmJdIHJkICAgICAgICAgICAKLW1vdls6bF1bLnddIGFiczgscmQgICAgICAgICAgICB0YXNbLmJdIGVhICAgICAKLW1vdls6bF0uYiBhYnM4LHJkICAgICAgICAgICAgICB0cmFwYSBpbW00ICAgICAKLW1vdls6c11bLnddIHJzLGFiczggICAgICAgICAgICB0cmFwL3ZzICAgICAgICAKLW1vdls6c10uYiBycyxhYnM4ICAgICAgICAgICAgICB0c3Qgc3ogZWEgICAgICAKLW1vdls6Zl1bLnddIEBAKGRpc3A4LGZwKSxyZCAgICAgdW5sayBmcCAgICAgICAgCi1tb3ZbOmZdWy53XSBycyxAQChkaXNwOCxmcCkgICAgIHhjaFsud10gcnMscmQgCi1tb3ZbOmZdLmIgQEAoZGlzcDgsZnApLHJkICAgICAgIHhvciBzeiBlYSxyZCAgIAotbW92WzpmXS5iIHJzLEBAKGRpc3A4LGZwKSAgICAgICB4b3JjLmIgaW1tOCxjcmIKLW1vdls6Z10gc3ogcnMsZWFfbWVtICAgICAgICAgICB4b3JjLncgaW1tMTYsc3IKLW1vdls6Z10gc3ogZWEscmQgICAgICAgICAgICAgIAotQGVuZCBzbWFsbGV4YW1wbGUKLUBlbmQgaWZzZXQKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1ocHBhLnRleGkgYi9nYXMvZG9jL2MtaHBwYS50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmE1MzVmLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1ocHBhLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AcGFnZQotQG5vZGUgSFBQQS1EZXBlbmRlbnQKLUBjaGFwdGVyIEhQUEEgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggIHN1cHBvcnQKLUBtZW51Ci0qIEhQUEEgTm90ZXM6OiAgICAgICAgICAgICAgICBOb3RlcwotKiBIUFBBIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBIUFBBIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEhQUEEgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBIUFBBIERpcmVjdGl2ZXM6OiAgICAgICAgICAgSFBQQSBNYWNoaW5lIERpcmVjdGl2ZXMKLSogSFBQQSBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIUFBBIE5vdGVzCi1Ac2VjdGlvbiBOb3RlcwotQXMgYSBiYWNrIGVuZCBmb3IgQHNje2dudX0gQHNje2NjfSBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYmVlbiB0aHJvdWdobHkgdGVzdGVkIGFuZCBzaG91bGQKLXdvcmsgZXh0cmVtZWx5IHdlbGwuICBXZSBoYXZlIHRlc3RlZCBpdCBvbmx5IG1pbmltYWxseSBvbiBoYW5kIHdyaXR0ZW4gYXNzZW1ibHkKLWNvZGUgYW5kIG5vIG9uZSBoYXMgdGVzdGVkIGl0IG11Y2ggb24gdGhlIGFzc2VtYmx5IG91dHB1dCBmcm9tIHRoZSBIUAotY29tcGlsZXJzLgotCi1UaGUgZm9ybWF0IG9mIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbnMgaGFzIGNoYW5nZWQgc2luY2UgdGhlIG9yaWdpbmFsCi1AY29kZXtAdmFsdWV7QVN9fSBwb3J0ICh2ZXJzaW9uIDEuM1gpIHdhcyByZWxlYXNlZDsgdGhlcmVmb3JlLAoteW91IG11c3QgcmVidWlsZCBhbGwgSFBQQSBvYmplY3RzIGFuZCBsaWJyYXJpZXMgd2l0aCB0aGUgbmV3IAotYXNzZW1ibGVyIHNvIHRoYXQgeW91IGNhbiBkZWJ1ZyB0aGUgZmluYWwgZXhlY3V0YWJsZS4KLQotVGhlIEhQUEEgQGNvZGV7QHZhbHVle0FTfX0gcG9ydCBnZW5lcmF0ZXMgYSBzbWFsbCBzdWJzZXQgb2YgdGhlIHJlbG9jYXRpb25zCi1hdmFpbGFibGUgaW4gdGhlIFNPTSBhbmQgRUxGIG9iamVjdCBmaWxlIGZvcm1hdHMuICBBZGRpdGlvbmFsIHJlbG9jYXRpb24KLXN1cHBvcnQgd2lsbCBiZSBhZGRlZCBhcyBpdCBiZWNvbWVzIG5lY2Vzc2FyeS4gIAotCi1Abm9kZSBIUFBBIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEhQUEEuCi0KLUBjaW5kZXggSFBQQSBTeW50YXgKLUBub2RlIEhQUEEgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLVRoZSBhc3NlbWJsZXIgc3ludGF4IGNsb3NlbHkgZm9sbG93cyB0aGUgSFBQQSBpbnN0cnVjdGlvbiBzZXQKLXJlZmVyZW5jZSBtYW51YWw7IGFzc2VtYmxlciBkaXJlY3RpdmVzIGFuZCBnZW5lcmFsIHN5bnRheCBjbG9zZWx5IGZvbGxvdyB0aGUKLUhQUEEgYXNzZW1ibHkgbGFuZ3VhZ2UgcmVmZXJlbmNlIG1hbnVhbCwgd2l0aCBhIGZldyBub3Rld29ydGh5IGRpZmZlcmVuY2VzLgotCi1GaXJzdCwgYSBjb2xvbiBtYXkgaW1tZWRpYXRlbHkgZm9sbG93IGEgbGFiZWwgZGVmaW5pdGlvbi4gIFRoaXMgaXMKLXNpbXBseSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGhvdyBtb3N0IGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1tZXJzCi13cml0ZSBjb2RlLgotCi1Tb21lIG9ic2N1cmUgZXhwcmVzc2lvbiBwYXJzaW5nIHByb2JsZW1zIG1heSBhZmZlY3QgaGFuZCB3cml0dGVuIGNvZGUgd2hpY2gKLXVzZXMgdGhlIEBjb2Rle3Nwb3B9IGluc3RydWN0aW9ucywgb3IgY29kZSB3aGljaCBtYWtlcyBzaWduaWZpY2FudAotdXNlIG9mIHRoZSBAY29kZXshfSBsaW5lIHNlcGFyYXRvci4KLQotQGNvZGV7QHZhbHVle0FTfX0gaXMgbXVjaCBsZXNzIGZvcmdpdmluZyBhYm91dCBtaXNzaW5nIGFyZ3VtZW50cyBhbmQgb3RoZXIKLXNpbWlsYXIgb3ZlcnNpZ2h0cyB0aGFuIHRoZSBIUCBhc3NlbWJsZXIuICBAY29kZXtAdmFsdWV7QVN9fSBub3RpZmllcyB5b3UKLW9mIG1pc3NpbmcgYXJndW1lbnRzIGFzIHN5bnRheCBlcnJvcnM7IHRoaXMgaXMgcmVnYXJkZWQgYXMgYSBmZWF0dXJlLCBub3QgYQotYnVnLgotCi1GaW5hbGx5LCBAY29kZXtAdmFsdWV7QVN9fSBhbGxvd3MgeW91IHRvIHVzZSBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aG91dAotZXhwbGljaXRseSBpbXBvcnRpbmcgdGhlIHN5bWJvbC4gIEBlbXBoe1dhcm5pbmc6fSBpbiB0aGUgZnV0dXJlIHRoaXMgd2lsbCBiZQotYW4gZXJyb3IgZm9yIEhQUEEgdGFyZ2V0cy4KLQotU3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBIUFBBIHRhcmdldHMgaW5jbHVkZToKLQotQHNhbXB7O30gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBzYW1weyF9IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCi0KLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgSFBQQSBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEhQUEEgKEBzY3tpZWVlfSkKLUBjaW5kZXggSFBQQSBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEhQUEEgZmFtaWx5IHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0KLUBub2RlIEhQUEEgRGlyZWN0aXZlcwotQHNlY3Rpb24gSFBQQSBBc3NlbWJsZXIgRGlyZWN0aXZlcwotCi1AY29kZXtAdmFsdWV7QVN9fSBmb3IgdGhlIEhQUEEgc3VwcG9ydHMgbWFueSBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggdGhlIG5hdGl2ZSBhc3NlbWJsZXIuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZW0gb25seQotYnJpZWZseS4gIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBIUFBBLXNwZWNpZmljIGFzc2VtYmxlciBkaXJlY3RpdmVzLCBzZWUKLUBjaXRle0hQOTAwMCBTZXJpZXMgODAwIEFzc2VtYmx5IExhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9IChIUCA5MjQzMi05MDAwMSkuCi0KLUBjaW5kZXggSFBQQSBkaXJlY3RpdmVzIG5vdCBzdXBwb3J0ZWQKLUBjb2Rle0B2YWx1ZXtBU319IGRvZXMgQGVtcGh7bm90fSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXNzZW1ibGVyIGRpcmVjdGl2ZXMKLWRlc2NyaWJlZCBpbiB0aGUgSFAgbWFudWFsOgotCi1AZXhhbXBsZQotLmVuZG0gICAgICAgICAgIC5saXN0b24KLS5lbnRlciAgICAgICAgICAubG9jY3QKLS5sZWF2ZSAgICAgICAgICAubWFjcm8gIAotLmxpc3RvZmYKLUBlbmQgZXhhbXBsZQotCi1AY2luZGV4IEBjb2Rley5wYXJhbX0gb24gSFBQQQotQmV5b25kIHRob3NlIGltcGxlbWVudGVkIGZvciBjb21wYXRpYmlsaXR5LCBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBvbmUKLWFkZGl0aW9uYWwgYXNzZW1ibGVyIGRpcmVjdGl2ZSBmb3IgdGhlIEhQUEE6IEBjb2Rley5wYXJhbX0uICBJdCBjb252ZXlzCi1yZWdpc3RlciBhcmd1bWVudCBsb2NhdGlvbnMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICBJdHMgc3ludGF4IGNsb3NlbHkgZm9sbG93cwotdGhlIEBjb2Rley5leHBvcnR9IGRpcmVjdGl2ZS4KLQotQGNpbmRleCBIUFBBLW9ubHkgZGlyZWN0aXZlcwotVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgaW4gQGNvZGV7QHZhbHVle0FTfX0gZm9yIHRoZSBIUFBBOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5ibG9jayBAdmFye259Ci1AaXRlbXggLmJsb2NreiBAdmFye259Ci1SZXNlcnZlIEB2YXJ7bn0gYnl0ZXMgb2Ygc3RvcmFnZSwgYW5kIGluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgotCi1AaXRlbSAuY2FsbCAKLU1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHByb2NlZHVyZSBjYWxsLiAgT25seSB0aGUgc3BlY2lhbCBjYXNlIHdpdGggQGVtcGh7bm8KLWFyZ3VtZW50c30gaXMgYWxsb3dlZC4KLQotQGl0ZW0gLmNhbGxpbmZvIFsgQHZhcntwYXJhbX09QHZhcnt2YWx1ZX0sIEBkb3Rze30gXSAgWyBAdmFye2ZsYWd9LCBAZG90c3t9IF0KLVNwZWNpZnkgYSBudW1iZXIgb2YgcGFyYW1ldGVycyBhbmQgZmxhZ3MgdGhhdCBkZWZpbmUgdGhlIGVudmlyb25tZW50IGZvciBhCi1wcm9jZWR1cmUuCi0KLUB2YXJ7cGFyYW19IG1heSBiZSBhbnkgb2YgQHNhbXB7ZnJhbWV9IChmcmFtZSBzaXplKSwgQHNhbXB7ZW50cnlfZ3J9IChlbmQgb2YKLWdlbmVyYWwgcmVnaXN0ZXIgcmFuZ2UpLCBAc2FtcHtlbnRyeV9mcn0gKGVuZCBvZiBmbG9hdCByZWdpc3RlciByYW5nZSksCi1Ac2FtcHtlbnRyeV9zcn0gKGVuZCBvZiBzcGFjZSByZWdpc3RlciByYW5nZSkuCi0KLVRoZSB2YWx1ZXMgZm9yIEB2YXJ7ZmxhZ30gYXJlIEBzYW1we2NhbGxzfSBvciBAc2FtcHtjYWxsZXJ9IChwcm9jIGhhcwotc3Vicm91dGluZXMpLCBAc2FtcHtub19jYWxsc30gKHByb2MgZG9lcyBub3QgY2FsbCBzdWJyb3V0aW5lcyksIEBzYW1we3NhdmVfcnB9Ci0ocHJlc2VydmUgcmV0dXJuIHBvaW50ZXIpLCBAc2FtcHtzYXZlX3NwfSAocHJvYyBwcmVzZXJ2ZXMgc3RhY2sgcG9pbnRlciksCi1Ac2FtcHtub191bndpbmR9IChkbyBub3QgdW53aW5kIHRoaXMgcHJvYyksIEBzYW1we2hwdXhfaW50fSAocHJvYyBpcyBpbnRlcnJ1cHQKLXJvdXRpbmUpLgotCi1AaXRlbSAuY29kZQotQXNzZW1ibGUgaW50byB0aGUgc3RhbmRhcmQgc2VjdGlvbiBjYWxsZWQgQHNhbXB7JFRFWFQkfSwgc3Vic2VjdGlvbgotQHNhbXB7JENPREUkfS4KLQotQGlmc2V0IFNPTQotQGl0ZW0gLmNvcHlyaWdodCAiQHZhcntzdHJpbmd9IgotSW4gdGhlIFNPTSBvYmplY3QgZm9ybWF0LCBpbnNlcnQgQHZhcntzdHJpbmd9IGludG8gdGhlIG9iamVjdCBjb2RlLCBtYXJrZWQgYXMgYQotY29weXJpZ2h0IHN0cmluZy4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEVMRgotQGl0ZW0gLmNvcHlyaWdodCAiQHZhcntzdHJpbmd9IgotSW4gdGhlIEVMRiBvYmplY3QgZm9ybWF0LCBpbnNlcnQgQHZhcntzdHJpbmd9IGludG8gdGhlIG9iamVjdCBjb2RlLCBtYXJrZWQgYXMgYQotdmVyc2lvbiBzdHJpbmcuCi1AZW5kIGlmc2V0Ci0KLUBpdGVtIC5lbnRlcgotTm90IHlldCBzdXBwb3J0ZWQ7IHRoZSBhc3NlbWJsZXIgcmVqZWN0cyBwcm9ncmFtcyBjb250YWluaW5nIHRoaXMgZGlyZWN0aXZlLgotCi1AaXRlbSAuZW50cnkKLU1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHByb2NlZHVyZS4KLQotQGl0ZW0gLmV4aXQKLU1hcmsgdGhlIGVuZCBvZiBhIHByb2NlZHVyZS4KLQotQGl0ZW0gLmV4cG9ydCBAdmFye25hbWV9IFsgLEB2YXJ7dHlwfSBdICBbICxAdmFye3BhcmFtfT1AdmFye3J9IF0KLU1ha2UgYSBwcm9jZWR1cmUgQHZhcntuYW1lfSBhdmFpbGFibGUgdG8gY2FsbGVycy4gIEB2YXJ7dHlwfSwgaWYgcHJlc2VudCwgbXVzdAotYmUgb25lIG9mIEBzYW1we2Fic29sdXRlfSwgQHNhbXB7Y29kZX0gKEVMRiBvbmx5LCBub3QgU09NKSwgQHNhbXB7ZGF0YX0sCi1Ac2FtcHtlbnRyeX0sIEBzYW1we2RhdGF9LCBAc2FtcHtlbnRyeX0sIEBzYW1we21pbGxpY29kZX0sIEBzYW1we3BsYWJlbH0sCi1Ac2FtcHtwcmlfcHJvZ30sIG9yIEBzYW1we3NlY19wcm9nfS4KLQotQHZhcntwYXJhbX0sIGlmIHByZXNlbnQsIHByb3ZpZGVzIGVpdGhlciByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUKLXByb2NlZHVyZSBhcmd1bWVudHMgYW5kIHJlc3VsdCwgb3IgYSBwcml2aWxlZ2UgbGV2ZWwuICBAdmFye3BhcmFtfSBtYXkgYmUKLUBzYW1we2FyZ3dAdmFye259fSAod2hlcmUgQHZhcntufSByYW5nZXMgZnJvbSBAY29kZXswfSB0byBAY29kZXszfSwgYW5kCi1pbmRpY2F0ZXMgb25lIG9mIGZvdXIgb25lLXdvcmQgYXJndW1lbnRzKTsgQHNhbXB7cnRudmFsfSAodGhlIHByb2NlZHVyZSdzCi1yZXN1bHQpOyBvciBAc2FtcHtwcml2X2xldn0gKHByaXZpbGVnZSBsZXZlbCkuICBGb3IgYXJndW1lbnRzIG9yIHRoZSByZXN1bHQsCi1AdmFye3J9IHNwZWNpZmllcyBob3cgdG8gcmVsb2NhdGUsIGFuZCBtdXN0IGJlIG9uZSBvZiBAc2FtcHtub30gKG5vdAotcmVsb2NhdGFibGUpLCBAc2FtcHtncn0gKGFyZ3VtZW50IGlzIGluIGdlbmVyYWwgcmVnaXN0ZXIpLCBAc2FtcHtmcn0gKGluCi1mbG9hdGluZyBwb2ludCByZWdpc3RlciksIG9yIEBzYW1we2Z1fSAodXBwZXIgaGFsZiBvZiBmbG9hdCByZWdpc3RlcikuCi1Gb3IgQHNhbXB7cHJpdl9sZXZ9LCBAdmFye3J9IGlzIGFuIGludGVnZXIuCi0KLUBpdGVtIC5oYWxmIEB2YXJ7bn0KLURlZmluZSBhIHR3by1ieXRlIGludGVnZXIgY29uc3RhbnQgQHZhcntufTsgc3lub255bSBmb3IgdGhlIHBvcnRhYmxlCi1AY29kZXtAdmFsdWV7QVN9fSBkaXJlY3RpdmUgQGNvZGV7LnNob3J0fS4KLQotQGl0ZW0gLmltcG9ydCBAdmFye25hbWV9IFsgLEB2YXJ7dHlwfSBdCi1Db252ZXJzZSBvZiBAY29kZXsuZXhwb3J0fTsgbWFrZSBhIHByb2NlZHVyZSBhdmFpbGFibGUgdG8gY2FsbC4gIFRoZSBhcmd1bWVudHMKLXVzZSB0aGUgc2FtZSBjb252ZW50aW9ucyBhcyB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBmb3IgQGNvZGV7LmV4cG9ydH0uCi0KLUBpdGVtIC5sYWJlbCBAdmFye25hbWV9Ci1EZWZpbmUgQHZhcntuYW1lfSBhcyBhIGxhYmVsIGZvciB0aGUgY3VycmVudCBhc3NlbWJseSBsb2NhdGlvbi4KLQotQGl0ZW0gLmxlYXZlCi1Ob3QgeWV0IHN1cHBvcnRlZDsgdGhlIGFzc2VtYmxlciByZWplY3RzIHByb2dyYW1zIGNvbnRhaW5pbmcgdGhpcyBkaXJlY3RpdmUuCi0KLUBpdGVtIC5vcmlnaW4gQHZhcntsY30KLUFkdmFuY2UgbG9jYXRpb24gY291bnRlciB0byBAdmFye2xjfS4gU3lub255bSBmb3IgdGhlIEBjb2Rle0B2YWx1ZXthc319Ci1wb3J0YWJsZSBkaXJlY3RpdmUgQGNvZGV7Lm9yZ30uCi0KLUBpdGVtIC5wYXJhbSBAdmFye25hbWV9IFsgLEB2YXJ7dHlwfSBdICBbICxAdmFye3BhcmFtfT1AdmFye3J9IF0KLUBjIE5vdCBpbiBIUCBtYW51YWw7IEBzY3tnbnV9IEhQUEEgZXh0ZW5zaW9uCi1TaW1pbGFyIHRvIEBjb2Rley5leHBvcnR9LCBidXQgdXNlZCBmb3Igc3RhdGljIHByb2NlZHVyZXMuCi0KLUBpdGVtIC5wcm9jCi1Vc2UgcHJlY2VkaW5nIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YgYSBwcm9jZWR1cmUuCi0KLUBpdGVtIC5wcm9jZW5kCi1Vc2UgZm9sbG93aW5nIHRoZSBsYXN0IHN0YXRlbWVudCBvZiBhIHByb2NlZHVyZS4KLQotQGl0ZW0gQHZhcntsYWJlbH0gLnJlZyBAdmFye2V4cHJ9Ci1AYyA/PyBOb3QgaW4gSFAgbWFudWFsIChKYW4gMTk4OCB2bikKLVN5bm9ueW0gZm9yIEBjb2Rley5lcXV9OyBkZWZpbmUgQHZhcntsYWJlbH0gd2l0aCB0aGUgYWJzb2x1dGUgZXhwcmVzc2lvbgotQHZhcntleHByfSBhcyBpdHMgdmFsdWUuCi0KLUBpdGVtIC5zcGFjZSBAdmFye3NlY25hbWV9IFsgLEB2YXJ7cGFyYW1zfSBdCi1Td2l0Y2ggdG8gc2VjdGlvbiBAdmFye3NlY25hbWV9LCBjcmVhdGluZyBhIG5ldyBzZWN0aW9uIGJ5IHRoYXQgbmFtZSBpZgotbmVjZXNzYXJ5LiAgWW91IG1heSBvbmx5IHVzZSBAdmFye3BhcmFtc30gd2hlbiBjcmVhdGluZyBhIG5ldyBzZWN0aW9uLCBub3QKLXdoZW4gc3dpdGNoaW5nIHRvIGFuIGV4aXN0aW5nIG9uZS4gIEB2YXJ7c2VjbmFtZX0gbWF5IGlkZW50aWZ5IGEgc2VjdGlvbiBieQotbnVtYmVyIHJhdGhlciB0aGFuIGJ5IG5hbWUuCi0KLUlmIHNwZWNpZmllZCwgdGhlIGxpc3QgQHZhcntwYXJhbXN9IGRlY2xhcmVzIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24sCi1pZGVudGlmaWVkIGJ5IGtleXdvcmRzLiAgVGhlIGtleXdvcmRzIHJlY29nbml6ZWQgYXJlIEBzYW1we3NwbnVtPUB2YXJ7ZXhwfX0KLShpZGVudGlmeSB0aGlzIHNlY3Rpb24gYnkgdGhlIG51bWJlciBAdmFye2V4cH0sIGFuIGFic29sdXRlIGV4cHJlc3Npb24pLAotQHNhbXB7c29ydD1AdmFye2V4cH19IChvcmRlciBzZWN0aW9ucyBhY2NvcmRpbmcgdG8gdGhpcyBzb3J0IGtleSB3aGVuIGxpbmtpbmc7Ci1AdmFye2V4cH0gaXMgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiksIEBzYW1we3VubG9hZGFibGV9IChzZWN0aW9uIGNvbnRhaW5zIG5vCi1sb2FkYWJsZSBkYXRhKSwgQHNhbXB7bm90ZGVmaW5lZH0gKHRoaXMgc2VjdGlvbiBkZWZpbmVkIGVsc2V3aGVyZSksIGFuZAotQHNhbXB7cHJpdmF0ZX0gKGRhdGEgaW4gdGhpcyBzZWN0aW9uIG5vdCBhdmFpbGFibGUgdG8gb3RoZXIgcHJvZ3JhbXMpLgotCi1AaXRlbSAuc3BudW0gQHZhcntzZWNuYW19Ci1AYyA/PyBOb3QgaW4gSFAgbWFudWFsIChKYW4gMTk4OCkKLUFsbG9jYXRlIGZvdXIgYnl0ZXMgb2Ygc3RvcmFnZSwgYW5kIGluaXRpYWxpemUgdGhlbSB3aXRoIHRoZSBzZWN0aW9uIG51bWJlciBvZgotdGhlIHNlY3Rpb24gbmFtZWQgQHZhcntzZWNuYW19LiAgKFlvdSBjYW4gZGVmaW5lIHRoZSBzZWN0aW9uIG51bWJlciB3aXRoIHRoZQotSFBQQSBAY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4pCi0KLUBjaW5kZXggQGNvZGV7c3RyaW5nfSBkaXJlY3RpdmUgb24gSFBQQQotQGl0ZW0gLnN0cmluZyAiQHZhcntzdHJ9IgotQ29weSB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIEB2YXJ7c3RyfSB0byB0aGUgb2JqZWN0IGZpbGUuCi1AeHJlZntTdHJpbmdzLCxTdHJpbmdzfSwgZm9yIGluZm9ybWF0aW9uIG9uIGVzY2FwZSBzZXF1ZW5jZXMgeW91IGNhbiB1c2UgaW4KLUBjb2Rle0B2YWx1ZXtBU319IHN0cmluZ3MuCi0KLUBlbXBoe1dhcm5pbmchfSBUaGUgSFBQQSB2ZXJzaW9uIG9mIEBjb2Rley5zdHJpbmd9IGRpZmZlcnMgZnJvbSB0aGUKLXVzdWFsIEBjb2Rle0B2YWx1ZXtBU319IGRlZmluaXRpb246IGl0IGRvZXMgQGVtcGh7bm90fSB3cml0ZSBhIHplcm8gYnl0ZQotYWZ0ZXIgY29weWluZyBAdmFye3N0cn0uCi0KLUBpdGVtIC5zdHJpbmd6ICJAdmFye3N0cn0iCi1MaWtlIEBjb2Rley5zdHJpbmd9LCBidXQgYXBwZW5kcyBhIHplcm8gYnl0ZSBhZnRlciBjb3B5aW5nIEB2YXJ7c3RyfSB0byBvYmplY3QKLWZpbGUuCi0KLUBpdGVtIC5zdWJzcGEgQHZhcntuYW1lfSBbICxAdmFye3BhcmFtc30gXQotQGl0ZW14IC5uc3Vic3BhIEB2YXJ7bmFtZX0gWyAsQHZhcntwYXJhbXN9IF0KLVNpbWlsYXIgdG8gQGNvZGV7LnNwYWNlfSwgYnV0IHNlbGVjdHMgYSBzdWJzZWN0aW9uIEB2YXJ7bmFtZX0gd2l0aGluIHRoZQotY3VycmVudCBzZWN0aW9uLiAgWW91IG1heSBvbmx5IHNwZWNpZnkgQHZhcntwYXJhbXN9IHdoZW4geW91IGNyZWF0ZSBhCi1zdWJzZWN0aW9uIChpbiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgQGNvZGV7LnN1YnNwYX0gZm9yIHRoaXMgQHZhcntuYW1lfSkuCi0KLUlmIHNwZWNpZmllZCwgdGhlIGxpc3QgQHZhcntwYXJhbXN9IGRlY2xhcmVzIGF0dHJpYnV0ZXMgb2YgdGhlIHN1YnNlY3Rpb24sCi1pZGVudGlmaWVkIGJ5IGtleXdvcmRzLiAgVGhlIGtleXdvcmRzIHJlY29nbml6ZWQgYXJlIEBzYW1we3F1YWQ9QHZhcntleHByfX0KLShgYHF1YWRyYW50JycgZm9yIHRoaXMgc3Vic2VjdGlvbiksIEBzYW1we2FsaWduPUB2YXJ7ZXhwcn19IChhbGlnbm1lbnQgZm9yCi1iZWdpbm5pbmcgb2YgdGhpcyBzdWJzZWN0aW9uOyBhIHBvd2VyIG9mIHR3byksIEBzYW1we2FjY2Vzcz1AdmFye2V4cHJ9fSAodmFsdWUKLWZvciBgYGFjY2VzcyByaWdodHMnJyBmaWVsZCksIEBzYW1we3NvcnQ9QHZhcntleHByfX0gKHNvcnRpbmcgb3JkZXIgZm9yIHRoaXMKLXN1YnNwYWNlIGluIGxpbmspLCBAc2FtcHtjb2RlX29ubHl9IChzdWJzZWN0aW9uIGNvbnRhaW5zIG9ubHkgY29kZSksCi1Ac2FtcHt1bmxvYWRhYmxlfSAoc3Vic2VjdGlvbiBjYW5ub3QgYmUgbG9hZGVkIGludG8gbWVtb3J5KSwgQHNhbXB7Y29tbW9ufQotKHN1YnNlY3Rpb24gaXMgY29tbW9uIGJsb2NrKSwgQHNhbXB7ZHVwX2NvbW19IChpbml0aWFsaXplZCBkYXRhIG1heSBoYXZlCi1kdXBsaWNhdGUgbmFtZXMpLCBvciBAc2FtcHt6ZXJvfSAoc3Vic2VjdGlvbiBpcyBhbGwgemVyb3MsIGRvIG5vdCB3cml0ZSBpbgotb2JqZWN0IGZpbGUpLgotCi1AY29kZXsubnN1YnNwYX0gYWx3YXlzIGNyZWF0ZXMgYSBuZXcgc3Vic3BhY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgZXZlbgotaWYgb25lIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLQotQGl0ZW0gLnZlcnNpb24gIkB2YXJ7c3RyfSIKLVdyaXRlIEB2YXJ7c3RyfSBhcyB2ZXJzaW9uIGlkZW50aWZpZXIgaW4gb2JqZWN0IGNvZGUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEhQUEEgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBIUFBBIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle1BBLVJJU0MgQXJjaGl0ZWN0dXJlIGFuZCBJbnN0cnVjdGlvbiBTZXQgUmVmZXJlbmNlIE1hbnVhbH0gCi0oSFAgMDk3NDAtOTAwMzkpLgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWkzNzAudGV4aSBiL2dhcy9kb2MvYy1pMzcwLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YjQxYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWkzNzAudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgRVNBLzM5MC1EZXBlbmRlbnQKLUBjaGFwdGVyIEVTQS8zOTAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgRVNBLzM5MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IGkzNzAgc3VwcG9ydAotQGNpbmRleCBFU0EvMzkwIHN1cHBvcnQKLQotQG1lbnUKLSogRVNBLzM5MCBOb3Rlczo6ICAgICAgICAgICAgICAgIE5vdGVzCi0qIEVTQS8zOTAgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEVTQS8zOTAgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogRVNBLzM5MCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEVTQS8zOTAgRGlyZWN0aXZlczo6ICAgICAgICAgICBFU0EvMzkwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBFU0EvMzkwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEVTQS8zOTAgTm90ZXMKLUBzZWN0aW9uIE5vdGVzCi1UaGUgRVNBLzM5MCBAY29kZXtAdmFsdWV7QVN9fSBwb3J0IGlzIGN1cnJlbnRseSBpbnRlbmRlZCB0byBiZSBhIGJhY2stZW5kCi1mb3IgdGhlIEBzY3tnbnV9IEBzY3tjY30gY29tcGlsZXIuICBJdCBpcyBub3QgSExBU00gY29tcGF0aWJsZSwgYWx0aG91Z2gKLWl0IGRvZXMgc3VwcG9ydCBhIHN1YnNldCBvZiBzb21lIG9mIHRoZSBITEFTTSBkaXJlY3RpdmVzLiAgVGhlIG9ubHkgCi1zdXBwb3J0ZWQgYmluYXJ5IGZpbGUgZm9ybWF0IGlzIEVMRjsgbm9uZSBvZiB0aGUgdXN1YWwgTVZTL1ZNL09FL1VTUyAKLW9iamVjdCBmaWxlIGZvcm1hdHMsIHN1Y2ggYXMgRVNEIG9yIFhTRCwgYXJlIHN1cHBvcnRlZC4KLQotV2hlbiB1c2VkIHdpdGggdGhlIEBzY3tnbnV9IEBzY3tjY30gY29tcGlsZXIsIHRoZSBFU0EvMzkwIEBjb2Rle0B2YWx1ZXtBU319Ci13aWxsIHByb2R1Y2UgY29ycmVjdCwgZnVsbHkgcmVsb2NhdGVkLCBmdW5jdGlvbmFsIGJpbmFyaWVzLCBhbmQgaGFzIGJlZW4gCi11c2VkIHRvIGNvbXBpbGUgYW5kIGV4ZWN1dGUgbGFyZ2UgcHJvamVjdHMuICBIb3dldmVyLCBtYW55IGFzcGVjdHMgc2hvdWxkIAotc3RpbGwgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWw7IHRoZXNlIGluY2x1ZGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCwgCi1keW5hbWljYWxseSBsb2FkYWJsZSBvYmplY3RzLCBhbmQgYW55IHJlbG9jYXRpb24gb3RoZXIgdGhhbiB0aGUgMzEtYml0IAotcmVsb2NhdGlvbi4KLQotQG5vZGUgRVNBLzM5MCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBFU0EvMzkwLgotCi1AY2luZGV4IEVTQS8zOTAgU3ludGF4Ci1Abm9kZSBFU0EvMzkwIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1UaGUgb3Bjb2RlL29wZXJhbmQgc3ludGF4IGZvbGxvd3MgdGhlIEVTQS8zOTAgUHJpbmNpcGxlcyBvZiBPcGVyYXRpb24KLW1hbnVhbDsgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgYW5kIGdlbmVyYWwgc3ludGF4IGFyZSBsb29zZWx5IGJhc2VkIG9uIHRoZSAKLXByZXZhaWxpbmcgQVQmVC9TVlI0L0VMRi9Tb2xhcmlzIHN0eWxlIG5vdGF0aW9uLiAgSExBU00tc3R5bGUgZGlyZWN0aXZlcwotYXJlIEBlbXBoe25vdH0gc3VwcG9ydGVkIGZvciB0aGUgbW9zdCBwYXJ0LCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhvc2UgCi1kZXNjcmliZWQgaGVyZWluLgotCi1BIGxlYWRpbmcgZG90IGluIGZyb250IG9mIGRpcmVjdGl2ZXMgaXMgb3B0aW9uYWwsIGFuZCB0aGUgY2FzZSBvZgotZGlyZWN0aXZlcyBpcyBpZ25vcmVkOyB0aHVzIGZvciBleGFtcGxlLCAudXNpbmcgYW5kIFVTSU5HIGhhdmUgdGhlIHNhbWUKLWVmZmVjdC4KLQotQSBjb2xvbiBtYXkgaW1tZWRpYXRlbHkgZm9sbG93IGEgbGFiZWwgZGVmaW5pdGlvbi4gIFRoaXMgaXMKLXNpbXBseSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGhvdyBtb3N0IGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1tZXJzCi13cml0ZSBjb2RlLgotCi1Ac2FtcHsjfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQHNhbXB7O30gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLQotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1SZWdpc3RlcnMgY2FuIGJlIGdpdmVuIHRoZSBzeW1ib2xpYyBuYW1lcyByMC4ucjE1LCBmcDAsIGZwMiwgZnA0LCBmcDYuCi1CeSB1c2luZyB0aGVzc2Ugc3ltYm9saWMgbmFtZXMsIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBkZXRlY3Qgc2ltcGxlIAotc3ludGF4IGVycm9ycy4gVGhlIG5hbWUgcmFyZyBvciByLmFyZyBpcyBhIHN5bm9ueW0gZm9yIHIxMSwgcnRjYSBvciByLnRjYQotZm9yIHIxMiwgc3AsIHIuc3AsIGRzYSByLmRzYSBmb3IgcjEzLCBsciBvciByLmxyIGZvciByMTQsIHJiYXNlIG9yIHIuYmFzZSAKLWZvciByMyBhbmQgcnBndCBvciByLnBndCBmb3IgcjQuCi0KLUBzYW1weyp9IGlzIHRoZSBjdXJyZW50IGxvY2F0aW9uIGNvdW50ZXIuICBVbmxpa2UgQHNhbXB7Ln0gaXQgaXMgYWx3YXlzCi1yZWxhdGl2ZSB0byB0aGUgbGFzdCBVU0lORyBkaXJlY3RpdmUuICBOb3RlIHRoYXQgdGhpcyBtZWFucyB0aGF0IAotZXhwcmVzc2lvbnMgY2Fubm90IHVzZSBtdWx0aXBsaWNhdGlvbiwgYXMgYW55IG9jY3VyZW5jZSBvZiBAc2FtcHsqfQotd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhIGxvY2F0aW9uIGNvdW50ZXIuCi0KLUFsbCBsYWJlbHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBsYXN0IFVTSU5HLiAgVGh1cywgYnJhbmNoZXMgdG8gYSBsYWJlbCAKLWFsd2F5cyBpbXBseSB0aGUgdXNlIG9mIGJhc2UrZGlzcGxhY2VtZW50LgotCi1NYW55IG9mIHRoZSB1c3VhbCBmb3JtcyBvZiBhZGRyZXNzIGNvbnN0YW50cyAvIGFkZHJlc3MgbGl0ZXJhbHMgCi1hcmUgc3VwcG9ydGVkLiAgVGh1cywKLUBleGFtcGxlCi0JLnVzaW5nCSoscjMKLQlMCXIxNSw9QShzb21lX3JvdXRpbmUpCi0JTE0JcjYscjcsPVYoc29tZV9sb25nbG9uZ19leHRlcm4pCi0JQQlyMSw9RicxMicKLQlBSAlyMCw9SCc0MicKLQlNRQlyNiw9RSczLjE0MTYnCi0JTUQJcjYsPUQnMy4xNDE1OTI2NTM1ODk3OScKLQlPCXI2LD1YTDQnY2FjYWQwZDAnCi0JLmx0b3JnCi1AZW5kIGV4YW1wbGUKLXNob3VsZCBhbGwgYmVoYXZlIGFzIGV4cGVjdGVkOiB0aGF0IGlzLCBhbiBlbnRyeSBpbiB0aGUgbGl0ZXJhbAotcG9vbCB3aWxsIGJlIGNyZWF0ZWQgKG9yIHJldXNlZCBpZiBpdCBhbHJlYWR5IGV4aXN0cyksIGFuZCB0aGUgCi1pbnN0cnVjdGlvbiBvcGVyYW5kcyB3aWxsIGJlIHRoZSBkaXNwbGFjZW1lbnQgaW50byB0aGUgbGl0ZXJhbCBwb29sCi11c2luZyB0aGUgY3VycmVudCBiYXNlIHJlZ2lzdGVyIChhcyBsYXN0IGRlY2xhcmVkIHdpdGggdGhlIEBjb2Rley51c2luZ30KLWRpcmVjdGl2ZSkuCi0KLUBub2RlIEVTQS8zOTAgRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBFU0EvMzkwIChAc2N7aWVlZX0pCi1AY2luZGV4IEVTQS8zOTAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBhc3NlbWJsZXIgZ2VuZXJhdGVzIG9ubHkgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuICBUaGUgb2xkZXIKLWZsb2lhdGluZyBwb2ludCBmb3JtYXRzIGFyZSBub3Qgc3VwcG9ydGVkLgotCi0KLUBub2RlIEVTQS8zOTAgRGlyZWN0aXZlcwotQHNlY3Rpb24gRVNBLzM5MCBBc3NlbWJsZXIgRGlyZWN0aXZlcwotCi1AY29kZXtAdmFsdWV7QVN9fSBmb3IgdGhlIEVTQS8zOTAgc3VwcG9ydHMgYWxsIG9mIHRoZSBzdGFuZGFyZCBFTEYvU1ZSNCAKLWFzc2VtYmxlciBkaXJlY3RpdmVzIHRoYXQgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIG1haW4gcGFydCBvZiB0aGlzCi1kb2N1bWVudGF0aW9uLiAgU2V2ZXJhbCBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgYXJlIHN1cHBvcnRlZCBpbiBvcmRlcgotdG8gaW1wbGVtZW50IHRoZSBFU0EvMzkwIGFkZHJlc3NpbmcgbW9kZWwuICBUaGUgbW9zdCBpbXBvcnRhbnQgb2YgdGhlc2UKLWFyZSBAY29kZXsudXNpbmd9IGFuZCBAY29kZXsubHRvcmd9Ci0KLUBjaW5kZXggRVNBLzM5MC1vbmx5IGRpcmVjdGl2ZXMKLVRoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBkaXJlY3RpdmVzIGluIEBjb2Rle0B2YWx1ZXtBU319IGZvciB0aGUgRVNBLzM5MDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAuZGMgCi1BIHNtYWxsIHN1YnNldCBvZiB0aGUgdXN1YWwgREMgZGlyZWN0aXZlIGlzIHN1cHBvcnRlZC4KLQotQGl0ZW0gLmRyb3AgQHZhcntyZWdub30KLVN0b3AgdXNpbmcgQHZhcntyZWdub30gYXMgdGhlIGJhc2UgcmVnaXN0ZXIuICBUaGUgQHZhcntyZWdub30gbXVzdAotaGF2ZSBiZWVuIHByZXZpb3VzbHkgZGVjbGFyZWQgd2l0aCBhIEBjb2Rley51c2luZ30gZGlyZWN0aXZlIGluIHRoZQotc2FtZSBzZWN0aW9uIGFzIHRoZSBjdXJyZW50IHNlY3Rpb24uCi0KLUBpdGVtIC5lYmNkaWMgQHZhcntzdHJpbmd9Ci1FbWl0IHRoZSBFQkNESUMgZXF1aXZhbGVudCBvZiB0aGUgaW5kaWNhdGVkIHN0cmluZy4gIFRoZSBlbWl0dGVkIHN0cmluZwotd2lsbCBiZSBudWxsIHRlcm1pbmF0ZWQuICBOb3RlIHRoYXQgdGhlIGRpcmVjdGl2ZXMgQGNvZGV7LnN0cmluZ30gZXRjLiBlbWl0Ci1hc2NpaSBzdHJpbmdzIGJ5IGRlZmF1bHQuCi0KLUBpdGVtIEVRVSAKLVRoZSBzdGFuZGFyZCBITEFTTS1zdHlsZSBFUVUgZGlyZWN0aXZlIGlzIG5vdCBzdXBwb3J0ZWQ7IGhvd2V2ZXIsIHRoZSAKLXN0YW5kYXJkIEBjb2Rle0B2YWx1ZXtBU319IGRpcmVjdGl2ZSAuZXF1IGNhbiBiZSB1c2VkIHRvIHRoZSBzYW1lIGVmZmVjdC4KLQotQGl0ZW0gLmx0b3JnIAotRHVtcCB0aGUgbGl0ZXJhbCBwb29sIGFjY3VtdWxhdGVkIHNvIGZhcjsgYmVnaW4gYSBuZXcgbGl0ZXJhbCBwb29sLgotVGhlIGxpdGVyYWwgcG9vbCB3aWxsIGJlIHdyaXR0ZW4gaW4gdGhlIGN1cnJlbnQgc2VjdGlvbjsgaW4gb3JkZXIgdG8KLWdlbmVyYXRlIGNvcnJlY3QgYXNzZW1ibHksIGEgQGNvZGV7LnVzaW5nfSBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5Ci1zcGVjaWZpZWQgaW4gdGhlIHNhbWUgc2VjdGlvbi4KLQotQGl0ZW0gLnVzaW5nIEB2YXJ7ZXhwcn0sQHZhcntyZWdub30KLVVzZSBAdmFye3JlZ25vfSBhcyB0aGUgYmFzZSByZWdpc3RlciBmb3IgYWxsIHN1YnNlcXVlbnQgUlgsIFJTLCBhbmQgU1MgZm9ybQotaW5zdHJ1Y3Rpb25zLiBUaGUgQHZhcntleHByfSB3aWxsIGJlIGV2YWx1YXRlZCB0byBvYnRhaW4gdGhlIGJhc2UgYWRkcmVzczsKLXVzdWFsbHksIEB2YXJ7ZXhwcn0gd2lsbCBtZXJlbHkgYmUgQHNhbXB7Kn0uCi0KLVRoaXMgYXNzZW1ibGVyIGFsbG93cyB0d28gQGNvZGV7LnVzaW5nfSBkaXJlY3RpdmVzIHRvIGJlIHNpbXVsdGFuZW91c2x5Ci1vdXRzdGFuZGluZywgb25lIGluIHRoZSBAY29kZXsudGV4dH0gc2VjdGlvbiwgYW5kIG9uZSBpbiBhbm90aGVyIHNlY3Rpb24gCi0odHlwaWNhbGx5LCB0aGUgQGNvZGV7LmRhdGF9IHNlY3Rpb24pLiAgVGhpcyBmZWF0dXJlIGFsbG93cyAKLWR5bmFtaWNhbGx5IGxvYWRlZCBvYmplY3RzIHRvIGJlIGltcGxlbWVudGVkIGluIGEgcmVsYXRpdmVseSAKLXN0cmFpZ2h0Zm9yd2FyZCB3YXkuICBBIEBjb2Rley51c2luZ30gZGlyZWN0aXZlIG11c3QgYWx3YXlzIGJlIHNwZWNpZmllZCAKLWluIHRoZSBAY29kZXsudGV4dH0gc2VjdGlvbjsgdGhpcyB3aWxsIHNwZWNpZnkgdGhlIGJhc2UgcmVnaXN0ZXIgdGhhdAotd2lsbCBiZSB1c2VkIGZvciBicmFuY2hlcyBpbiB0aGUgQGNvZGV7LnRleHR9IHNlY3Rpb24uICBBIHNlY29uZAotQGNvZGV7LnVzaW5nfSBtYXkgYmUgc3BlY2lmaWVkIGluIGFub3RoZXIgc2VjdGlvbjsgdGhpcyB3aWxsIHNwZWNpZnkKLXRoZSBiYXNlIHJlZ2lzdGVyIHRoYXQgaXMgdXNlZCBmb3Igbm9uLWxhYmVsIGFkZHJlc3MgbGl0ZXJhbHMuCi1XaGVuIGEgc2Vjb25kIEBjb2Rley51c2luZ30gaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBzdWJzZXF1ZW50Ci1AY29kZXsubHRvcmd9IG11c3QgYmUgcHV0IGluIHRoZSBzYW1lIHNlY3Rpb247IG90aGVyd2lzZSBhbiBlcnJvciB3aWxsIAotcmVzdWx0LgotCi1UaHVzLCBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHVzZXMgQGNvZGV7cjN9IHRvIGFkZHJlc3MgYnJhbmNoIAotdGFyZ2V0cyBhbmQgQGNvZGV7cjR9IHRvIGFkZHJlc3MgdGhlIGxpdGVyYWwgcG9vbCwgd2hpY2ggaGFzIGJlZW4gd3JpdHRlbiAKLXRvIHRoZSBAY29kZXsuZGF0YX0gc2VjdGlvbi4gIFRoZSBpcywgdGhlIGNvbnN0YW50cyBAY29kZXs9QShzb21lX3JvdXRpbmUpfSwKLUBjb2Rlez1IJzQyJ30gYW5kIEBjb2Rlez1FJzMuMTQxNid9IHdpbGwgYWxsIGFwcGVhciBpbiB0aGUgQGNvZGV7LmRhdGF9Ci1zZWN0aW9uLgotCi1AZXhhbXBsZQotLmRhdGEKLQkudXNpbmcgIExJVFBPT0wscjQKLS50ZXh0Ci0JQkFTUglyMywwCi0JLnVzaW5nCSoscjMKLSAgICAgICAgQiAgICAgICBTVEFSVAotCS5sb25nCUxJVFBPT0wKLVNUQVJUOgotCUwJcjQsNCgscjMpCi0JTAlyMTUsPUEoc29tZV9yb3V0aW5lKQotCUxUUglyMTUscjE1Ci0JQk5FCUxBQkVMCi0JQUgJcjAsPUgnNDInCi1MQUJFTDoKLQlNRQlyNiw9RSczLjE0MTYnCi0uZGF0YQotTElUUE9PTDoKLQkubHRvcmcKLUBlbmQgZXhhbXBsZQotCi0KLU5vdGUgdGhhdCB0aGlzIGR1YWwtQGNvZGV7LnVzaW5nfSBkaXJlY3RpdmUgc2VtYW50aWNzIGV4dGVuZHMgCi1hbmQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBITEFTTSBzZW1hbnRpY3MuICBOb3RlIHRoYXQgdGhpcyBhc3NlbWJsZXIgCi1kaXJlY3RpdmUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZnVsbCByYW5nZSBvZiBITEFTTSBzZW1hbnRpY3MuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgRVNBLzM5MCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEVTQS8zOTAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7RVNBLzM5MCBQcmluY2lwbGVzIG9mIE9wZXJhdGlvbn0gKElCTSBQdWJsaWNhdGlvbiBOdW1iZXIgRFo5QVIwMDQpLgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWkzODYudGV4aSBiL2dhcy9kb2MvYy1pMzg2LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOWM4NWEuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWkzODYudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDUyOSArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBpMzg2LURlcGVuZGVudAotQGNoYXB0ZXIgODAzODYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgODAzODYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBpMzg2IHN1cHBvcnQKLUBjaW5kZXggaTgwMzA2IHN1cHBvcnQKLUBtZW51Ci0qIGkzODYtT3B0aW9uczo6ICAgICAgICAgICAgICAgIE9wdGlvbnMKLSogaTM4Ni1TeW50YXg6OiAgICAgICAgICAgICAgICAgQVQmVCBTeW50YXggdmVyc3VzIEludGVsIFN5bnRheAotKiBpMzg2LU1uZW1vbmljczo6ICAgICAgICAgICAgICBJbnN0cnVjdGlvbiBOYW1pbmcKLSogaTM4Ni1SZWdzOjogICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtaW5nCi0qIGkzODYtUHJlZml4ZXM6OiAgICAgICAgICAgICAgIEluc3RydWN0aW9uIFByZWZpeGVzCi0qIGkzODYtTWVtb3J5OjogICAgICAgICAgICAgICAgIE1lbW9yeSBSZWZlcmVuY2VzCi0qIGkzODYtanVtcHM6OiAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIG9mIEp1bXAgSW5zdHJ1Y3Rpb25zCi0qIGkzODYtRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIGkzODYtU0lNRDo6ICAgICAgICAgICAgICAgICAgIEludGVsJ3MgTU1YIGFuZCBBTUQncyAzRE5vdyEgU0lNRCBPcGVyYXRpb25zCi0qIGkzODYtMTZiaXQ6OiAgICAgICAgICAgICAgICAgIFdyaXRpbmcgMTYtYml0IENvZGUKLSogaTM4Ni1CdWdzOjogICAgICAgICAgICAgICAgICAgQVQmVCBTeW50YXggYnVncwotKiBpMzg2LU5vdGVzOjogICAgICAgICAgICAgICAgICBOb3RlcwotQGVuZCBtZW51Ci0KLUBub2RlIGkzODYtT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMgZm9yIGkzODYgKG5vbmUpCi1AY2luZGV4IGkzODYgb3B0aW9ucyAobm9uZSkKLVRoZSA4MDM4NiBoYXMgbm8gbWFjaGluZSBkZXBlbmRlbnQgb3B0aW9ucy4KLQotQG5vZGUgaTM4Ni1TeW50YXgKLUBzZWN0aW9uIEFUJlQgU3ludGF4IHZlcnN1cyBJbnRlbCBTeW50YXgKLQotQGNpbmRleCBpMzg2IHN5bnRheCBjb21wYXRpYmlsaXR5Ci1AY2luZGV4IHN5bnRheCBjb21wYXRpYmlsaXR5LCBpMzg2Ci1JbiBvcmRlciB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG91dHB1dCBvZiBAY29kZXtAdmFsdWV7R0NDfX0sCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBBVCZUIFN5c3RlbSBWLzM4NiBhc3NlbWJsZXIgc3ludGF4LiAgVGhpcyBpcyBxdWl0ZQotZGlmZmVyZW50IGZyb20gSW50ZWwgc3ludGF4LiAgV2UgbWVudGlvbiB0aGVzZSBkaWZmZXJlbmNlcyBiZWNhdXNlCi1hbG1vc3QgYWxsIDgwMzg2IGRvY3VtZW50cyB1c2UgSW50ZWwgc3ludGF4LiAgTm90YWJsZSBkaWZmZXJlbmNlcwotYmV0d2VlbiB0aGUgdHdvIHN5bnRheGVzIGFyZToKLQotQGNpbmRleCBpbW1lZGlhdGUgb3BlcmFuZHMsIGkzODYKLUBjaW5kZXggaTM4NiBpbW1lZGlhdGUgb3BlcmFuZHMKLUBjaW5kZXggcmVnaXN0ZXIgb3BlcmFuZHMsIGkzODYKLUBjaW5kZXggaTM4NiByZWdpc3RlciBvcGVyYW5kcwotQGNpbmRleCBqdW1wL2NhbGwgb3BlcmFuZHMsIGkzODYKLUBjaW5kZXggaTM4NiBqdW1wL2NhbGwgb3BlcmFuZHMKLUBjaW5kZXggb3BlcmFuZCBkZWxpbWl0ZXJzLCBpMzg2Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQVQmVCBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHByZWNlZGVkIGJ5IEBzYW1weyR9OyBJbnRlbCBpbW1lZGlhdGUKLW9wZXJhbmRzIGFyZSB1bmRlbGltaXRlZCAoSW50ZWwgQHNhbXB7cHVzaCA0fSBpcyBBVCZUIEBzYW1we3B1c2hsICQ0fSkuCi1BVCZUIHJlZ2lzdGVyIG9wZXJhbmRzIGFyZSBwcmVjZWRlZCBieSBAc2FtcHslfTsgSW50ZWwgcmVnaXN0ZXIgb3BlcmFuZHMKLWFyZSB1bmRlbGltaXRlZC4gIEFUJlQgYWJzb2x1dGUgKGFzIG9wcG9zZWQgdG8gUEMgcmVsYXRpdmUpIGp1bXAvY2FsbAotb3BlcmFuZHMgYXJlIHByZWZpeGVkIGJ5IEBzYW1weyp9OyB0aGV5IGFyZSB1bmRlbGltaXRlZCBpbiBJbnRlbCBzeW50YXguCi0KLUBjaW5kZXggaTM4NiBzb3VyY2UsIGRlc3RpbmF0aW9uIG9wZXJhbmRzCi1AY2luZGV4IHNvdXJjZSwgZGVzdGluYXRpb24gb3BlcmFuZHM7IGkzODYKLUBpdGVtCi1BVCZUIGFuZCBJbnRlbCBzeW50YXggdXNlIHRoZSBvcHBvc2l0ZSBvcmRlciBmb3Igc291cmNlIGFuZCBkZXN0aW5hdGlvbgotb3BlcmFuZHMuICBJbnRlbCBAc2FtcHthZGQgZWF4LCA0fSBpcyBAc2FtcHthZGRsICQ0LCAlZWF4fS4gIFRoZQotQHNhbXB7c291cmNlLCBkZXN0fSBjb252ZW50aW9uIGlzIG1haW50YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotcHJldmlvdXMgVW5peCBhc3NlbWJsZXJzLiAgTm90ZSB0aGF0IGluc3RydWN0aW9ucyB3aXRoIG1vcmUgdGhhbiBvbmUKLXNvdXJjZSBvcGVyYW5kLCBzdWNoIGFzIHRoZSBAc2FtcHtlbnRlcn0gaW5zdHJ1Y3Rpb24sIGRvIEBlbXBoe25vdH0gaGF2ZQotcmV2ZXJzZWQgb3JkZXIuICBAcmVme2kzODYtQnVnc30uCi0KLUBjaW5kZXggbW5lbW9uaWMgc3VmZml4ZXMsIGkzODYKLUBjaW5kZXggc2l6ZXMgb3BlcmFuZHMsIGkzODYKLUBjaW5kZXggaTM4NiBzaXplIHN1ZmZpeGVzCi1AaXRlbQotSW4gQVQmVCBzeW50YXggdGhlIHNpemUgb2YgbWVtb3J5IG9wZXJhbmRzIGlzIGRldGVybWluZWQgZnJvbSB0aGUgbGFzdAotY2hhcmFjdGVyIG9mIHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYy4gIE1uZW1vbmljIHN1ZmZpeGVzIG9mIEBzYW1we2J9LAotQHNhbXB7d30sIGFuZCBAc2FtcHtsfSBzcGVjaWZ5IGJ5dGUgKDgtYml0KSwgd29yZCAoMTYtYml0KSwgYW5kIGxvbmcKLSgzMi1iaXQpIG1lbW9yeSByZWZlcmVuY2VzLiAgSW50ZWwgc3ludGF4IGFjY29tcGxpc2hlcyB0aGlzIGJ5IHByZWZpeGluZwotbWVtb3J5IG9wZXJhbmRzIChAZW1waHtub3R9IHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pY3MpIHdpdGggQHNhbXB7Ynl0ZQotcHRyfSwgQHNhbXB7d29yZCBwdHJ9LCBhbmQgQHNhbXB7ZHdvcmQgcHRyfS4gIFRodXMsIEludGVsIEBzYW1we21vdiBhbCwKLWJ5dGUgcHRyIEB2YXJ7Zm9vfX0gaXMgQHNhbXB7bW92YiBAdmFye2Zvb30sICVhbH0gaW4gQVQmVCBzeW50YXguCi0KLUBjaW5kZXggcmV0dXJuIGluc3RydWN0aW9ucywgaTM4NgotQGNpbmRleCBpMzg2IGp1bXAsIGNhbGwsIHJldHVybgotQGl0ZW0KLUltbWVkaWF0ZSBmb3JtIGxvbmcganVtcHMgYW5kIGNhbGxzIGFyZQotQHNhbXB7bGNhbGwvbGptcCAkQHZhcntzZWN0aW9ufSwgJEB2YXJ7b2Zmc2V0fX0gaW4gQVQmVCBzeW50YXg7IHRoZQotSW50ZWwgc3ludGF4IGlzCi1Ac2FtcHtjYWxsL2ptcCBmYXIgQHZhcntzZWN0aW9ufTpAdmFye29mZnNldH19LiAgQWxzbywgdGhlIGZhciByZXR1cm4KLWluc3RydWN0aW9uCi1pcyBAc2FtcHtscmV0ICRAdmFye3N0YWNrLWFkanVzdH19IGluIEFUJlQgc3ludGF4OyBJbnRlbCBzeW50YXggaXMKLUBzYW1we3JldCBmYXIgQHZhcntzdGFjay1hZGp1c3R9fS4KLQotQGNpbmRleCBzZWN0aW9ucywgaTM4NgotQGNpbmRleCBpMzg2IHNlY3Rpb25zCi1AaXRlbQotVGhlIEFUJlQgYXNzZW1ibGVyIGRvZXMgbm90IHByb3ZpZGUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2VjdGlvbgotcHJvZ3JhbXMuICBVbml4IHN0eWxlIHN5c3RlbXMgZXhwZWN0IGFsbCBwcm9ncmFtcyB0byBiZSBzaW5nbGUgc2VjdGlvbnMuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgaTM4Ni1NbmVtb25pY3MKLUBzZWN0aW9uIEluc3RydWN0aW9uIE5hbWluZwotCi1AY2luZGV4IGkzODYgaW5zdHJ1Y3Rpb24gbmFtaW5nCi1AY2luZGV4IGluc3RydWN0aW9uIG5hbWluZywgaTM4NgotSW5zdHJ1Y3Rpb24gbW5lbW9uaWNzIGFyZSBzdWZmaXhlZCB3aXRoIG9uZSBjaGFyYWN0ZXIgbW9kaWZpZXJzIHdoaWNoCi1zcGVjaWZ5IHRoZSBzaXplIG9mIG9wZXJhbmRzLiAgVGhlIGxldHRlcnMgQHNhbXB7Yn0sIEBzYW1we3d9LCBhbmQKLUBzYW1we2x9IHNwZWNpZnkgYnl0ZSwgd29yZCwgYW5kIGxvbmcgb3BlcmFuZHMuICBJZiBubyBzdWZmaXggaXMKLXNwZWNpZmllZCBieSBhbiBpbnN0cnVjdGlvbiB0aGVuIEBjb2Rle0B2YWx1ZXtBU319IHRyaWVzIHRvIGZpbGwgaW4gdGhlCi1taXNzaW5nIHN1ZmZpeCBiYXNlZCBvbiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgb3BlcmFuZCAodGhlIGxhc3Qgb25lCi1ieSBjb252ZW50aW9uKS4gIFRodXMsIEBzYW1we21vdiAlYXgsICVieH0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHttb3Z3Ci0lYXgsICVieH07IGFsc28sIEBzYW1we21vdiAkMSwgJWJ4fSBpcyBlcXVpdmFsZW50IHRvIEBzYW1we21vdncgJDEsCi0lYnh9LiAgTm90ZSB0aGF0IHRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIEFUJlQgVW5peCBhc3NlbWJsZXIgd2hpY2gKLWFzc3VtZXMgdGhhdCBhIG1pc3NpbmcgbW5lbW9uaWMgc3VmZml4IGltcGxpZXMgbG9uZyBvcGVyYW5kIHNpemUuICAoVGhpcwotaW5jb21wYXRpYmlsaXR5IGRvZXMgbm90IGFmZmVjdCBjb21waWxlciBvdXRwdXQgc2luY2UgY29tcGlsZXJzIGFsd2F5cwotZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBtbmVtb25pYyBzdWZmaXguKQotCi1BbG1vc3QgYWxsIGluc3RydWN0aW9ucyBoYXZlIHRoZSBzYW1lIG5hbWVzIGluIEFUJlQgYW5kIEludGVsIGZvcm1hdC4KLVRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zLiAgVGhlIHNpZ24gZXh0ZW5kIGFuZCB6ZXJvIGV4dGVuZAotaW5zdHJ1Y3Rpb25zIG5lZWQgdHdvIHNpemVzIHRvIHNwZWNpZnkgdGhlbS4gIFRoZXkgbmVlZCBhIHNpemUgdG8KLXNpZ24vemVybyBleHRlbmQgQGVtcGh7ZnJvbX0gYW5kIGEgc2l6ZSB0byB6ZXJvIGV4dGVuZCBAZW1waHt0b30uICBUaGlzCi1pcyBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdHdvIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzIGluIEFUJlQKLXN5bnRheC4gIEJhc2UgbmFtZXMgZm9yIHNpZ24gZXh0ZW5kIGFuZCB6ZXJvIGV4dGVuZCBhcmUKLUBzYW1we21vdnNAZG90c3t9fSBhbmQgQHNhbXB7bW92ekBkb3Rze319IGluIEFUJlQgc3ludGF4IChAc2FtcHttb3ZzeH0KLWFuZCBAc2FtcHttb3Z6eH0gaW4gSW50ZWwgc3ludGF4KS4gIFRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcwotYXJlIHRhY2tlZCBvbiB0byB0aGlzIGJhc2UgbmFtZSwgdGhlIEBlbXBoe2Zyb219IHN1ZmZpeCBiZWZvcmUgdGhlCi1AZW1waHt0b30gc3VmZml4LiAgVGh1cywgQHNhbXB7bW92c2JsICVhbCwgJWVkeH0gaXMgQVQmVCBzeW50YXggZm9yCi1gYG1vdmUgc2lnbiBleHRlbmQgQGVtcGh7ZnJvbX0gJWFsIEBlbXBoe3RvfSAlZWR4LicnICBQb3NzaWJsZSBzdWZmaXhlcywKLXRodXMsIGFyZSBAc2FtcHtibH0gKGZyb20gYnl0ZSB0byBsb25nKSwgQHNhbXB7Ynd9IChmcm9tIGJ5dGUgdG8gd29yZCksCi1hbmQgQHNhbXB7d2x9IChmcm9tIHdvcmQgdG8gbG9uZykuCi0KLUBjaW5kZXggY29udmVyc2lvbiBpbnN0cnVjdGlvbnMsIGkzODYKLUBjaW5kZXggaTM4NiBjb252ZXJzaW9uIGluc3RydWN0aW9ucwotVGhlIEludGVsLXN5bnRheCBjb252ZXJzaW9uIGluc3RydWN0aW9ucwotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQHNhbXB7Y2J3fSAtLS0gc2lnbi1leHRlbmQgYnl0ZSBpbiBAc2FtcHslYWx9IHRvIHdvcmQgaW4gQHNhbXB7JWF4fSwKLQotQGl0ZW0KLUBzYW1we2N3ZGV9IC0tLSBzaWduLWV4dGVuZCB3b3JkIGluIEBzYW1weyVheH0gdG8gbG9uZyBpbiBAc2FtcHslZWF4fSwKLQotQGl0ZW0KLUBzYW1we2N3ZH0gLS0tIHNpZ24tZXh0ZW5kIHdvcmQgaW4gQHNhbXB7JWF4fSB0byBsb25nIGluIEBzYW1weyVkeDolYXh9LAotCi1AaXRlbQotQHNhbXB7Y2RxfSAtLS0gc2lnbi1leHRlbmQgZHdvcmQgaW4gQHNhbXB7JWVheH0gdG8gcXVhZCBpbiBAc2FtcHslZWR4OiVlYXh9LAotQGVuZCBpdGVtaXplCi0KLUBub2luZGVudAotYXJlIGNhbGxlZCBAc2FtcHtjYnR3fSwgQHNhbXB7Y3d0bH0sIEBzYW1we2N3dGR9LCBhbmQgQHNhbXB7Y2x0ZH0gaW4KLUFUJlQgbmFtaW5nLiAgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyBlaXRoZXIgbmFtaW5nIGZvciB0aGVzZSBpbnN0cnVjdGlvbnMuCi0KLUBjaW5kZXgganVtcCBpbnN0cnVjdGlvbnMsIGkzODYKLUBjaW5kZXggY2FsbCBpbnN0cnVjdGlvbnMsIGkzODYKLUZhciBjYWxsL2p1bXAgaW5zdHJ1Y3Rpb25zIGFyZSBAc2FtcHtsY2FsbH0gYW5kIEBzYW1we2xqbXB9IGluCi1BVCZUIHN5bnRheCwgYnV0IGFyZSBAc2FtcHtjYWxsIGZhcn0gYW5kIEBzYW1we2p1bXAgZmFyfSBpbiBJbnRlbAotY29udmVudGlvbi4KLQotQG5vZGUgaTM4Ni1SZWdzCi1Ac2VjdGlvbiBSZWdpc3RlciBOYW1pbmcKLQotQGNpbmRleCBpMzg2IHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIGkzODYKLVJlZ2lzdGVyIG9wZXJhbmRzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCBAc2FtcHslfS4gIFRoZSA4MDM4NiByZWdpc3RlcnMKLWNvbnNpc3Qgb2YKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLXRoZSA4IDMyLWJpdCByZWdpc3RlcnMgQHNhbXB7JWVheH0gKHRoZSBhY2N1bXVsYXRvciksIEBzYW1weyVlYnh9LAotQHNhbXB7JWVjeH0sIEBzYW1weyVlZHh9LCBAc2FtcHslZWRpfSwgQHNhbXB7JWVzaX0sIEBzYW1weyVlYnB9ICh0aGUKLWZyYW1lIHBvaW50ZXIpLCBhbmQgQHNhbXB7JWVzcH0gKHRoZSBzdGFjayBwb2ludGVyKS4KLQotQGl0ZW0KLXRoZSA4IDE2LWJpdCBsb3ctZW5kcyBvZiB0aGVzZTogQHNhbXB7JWF4fSwgQHNhbXB7JWJ4fSwgQHNhbXB7JWN4fSwKLUBzYW1weyVkeH0sIEBzYW1weyVkaX0sIEBzYW1weyVzaX0sIEBzYW1weyVicH0sIGFuZCBAc2FtcHslc3B9LgotCi1AaXRlbQotdGhlIDggOC1iaXQgcmVnaXN0ZXJzOiBAc2FtcHslYWh9LCBAc2FtcHslYWx9LCBAc2FtcHslYmh9LAotQHNhbXB7JWJsfSwgQHNhbXB7JWNofSwgQHNhbXB7JWNsfSwgQHNhbXB7JWRofSwgYW5kIEBzYW1weyVkbH0gKFRoZXNlCi1hcmUgdGhlIGhpZ2gtYnl0ZXMgYW5kIGxvdy1ieXRlcyBvZiBAc2FtcHslYXh9LCBAc2FtcHslYnh9LAotQHNhbXB7JWN4fSwgYW5kIEBzYW1weyVkeH0pCi0KLUBpdGVtCi10aGUgNiBzZWN0aW9uIHJlZ2lzdGVycyBAc2FtcHslY3N9IChjb2RlIHNlY3Rpb24pLCBAc2FtcHslZHN9Ci0oZGF0YSBzZWN0aW9uKSwgQHNhbXB7JXNzfSAoc3RhY2sgc2VjdGlvbiksIEBzYW1weyVlc30sIEBzYW1weyVmc30sCi1hbmQgQHNhbXB7JWdzfS4KLQotQGl0ZW0KLXRoZSAzIHByb2Nlc3NvciBjb250cm9sIHJlZ2lzdGVycyBAc2FtcHslY3IwfSwgQHNhbXB7JWNyMn0sIGFuZAotQHNhbXB7JWNyM30uCi0KLUBpdGVtCi10aGUgNiBkZWJ1ZyByZWdpc3RlcnMgQHNhbXB7JWRiMH0sIEBzYW1weyVkYjF9LCBAc2FtcHslZGIyfSwKLUBzYW1weyVkYjN9LCBAc2FtcHslZGI2fSwgYW5kIEBzYW1weyVkYjd9LgotCi1AaXRlbQotdGhlIDIgdGVzdCByZWdpc3RlcnMgQHNhbXB7JXRyNn0gYW5kIEBzYW1weyV0cjd9LgotCi1AaXRlbQotdGhlIDggZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc3RhY2sgQHNhbXB7JXN0fSBvciBlcXVpdmFsZW50bHkKLUBzYW1weyVzdCgwKX0sIEBzYW1weyVzdCgxKX0sIEBzYW1weyVzdCgyKX0sIEBzYW1weyVzdCgzKX0sCi1Ac2FtcHslc3QoNCl9LCBAc2FtcHslc3QoNSl9LCBAc2FtcHslc3QoNil9LCBhbmQgQHNhbXB7JXN0KDcpfS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBpMzg2LVByZWZpeGVzCi1Ac2VjdGlvbiBJbnN0cnVjdGlvbiBQcmVmaXhlcwotCi1AY2luZGV4IGkzODYgaW5zdHJ1Y3Rpb24gcHJlZml4ZXMKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gcHJlZml4ZXMsIGkzODYKLUBjaW5kZXggcHJlZml4ZXMsIGkzODYKLUluc3RydWN0aW9uIHByZWZpeGVzIGFyZSB1c2VkIHRvIG1vZGlmeSB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLiAgVGhleQotYXJlIHVzZWQgdG8gcmVwZWF0IHN0cmluZyBpbnN0cnVjdGlvbnMsIHRvIHByb3ZpZGUgc2VjdGlvbiBvdmVycmlkZXMsIHRvCi1wZXJmb3JtIGJ1cyBsb2NrIG9wZXJhdGlvbnMsIGFuZCB0byBjaGFuZ2Ugb3BlcmFuZCBhbmQgYWRkcmVzcyBzaXplcy4KLShNb3N0IGluc3RydWN0aW9ucyB0aGF0IG5vcm1hbGx5IG9wZXJhdGUgb24gMzItYml0IG9wZXJhbmRzIHdpbGwgdXNlCi0xNi1iaXQgb3BlcmFuZHMgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBhbiBgYG9wZXJhbmQgc2l6ZScnIHByZWZpeC4pCi1JbnN0cnVjdGlvbiBwcmVmaXhlcyBhcmUgYmVzdCB3cml0dGVuIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGluc3RydWN0aW9uCi10aGV5IGFjdCB1cG9uLiBGb3IgZXhhbXBsZSwgdGhlIEBzYW1we3NjYXN9IChzY2FuIHN0cmluZykgaW5zdHJ1Y3Rpb24gaXMKLXJlcGVhdGVkIHdpdGg6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgcmVwbmUgc2NhcyAlZXM6KCVlZGkpLCVhbAotQGVuZCBzbWFsbGV4YW1wbGUKLQotWW91IG1heSBhbHNvIHBsYWNlIHByZWZpeGVzIG9uIHRoZSBsaW5lcyBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlCi1pbnN0cnVjdGlvbiwgYnV0IHRoaXMgY2lyY3VtdmVudHMgY2hlY2tzIHRoYXQgQGNvZGV7QHZhbHVle0FTfX0gZG9lcwotd2l0aCBwcmVmaXhlcywgYW5kIHdpbGwgbm90IHdvcmsgd2l0aCBhbGwgcHJlZml4ZXMuCi0KLUhlcmUgaXMgYSBsaXN0IG9mIGluc3RydWN0aW9uIHByZWZpeGVzOgotCi1AY2luZGV4IHNlY3Rpb24gb3ZlcnJpZGUgcHJlZml4ZXMsIGkzODYKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1TZWN0aW9uIG92ZXJyaWRlIHByZWZpeGVzIEBzYW1we2NzfSwgQHNhbXB7ZHN9LCBAc2FtcHtzc30sIEBzYW1we2VzfSwKLUBzYW1we2ZzfSwgQHNhbXB7Z3N9LiAgVGhlc2UgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgc3BlY2lmeWluZwotdXNpbmcgdGhlIEB2YXJ7c2VjdGlvbn06QHZhcnttZW1vcnktb3BlcmFuZH0gZm9ybSBmb3IgbWVtb3J5IHJlZmVyZW5jZXMuCi0KLUBjaW5kZXggc2l6ZSBwcmVmaXhlcywgaTM4NgotQGl0ZW0KLU9wZXJhbmQvQWRkcmVzcyBzaXplIHByZWZpeGVzIEBzYW1we2RhdGExNn0gYW5kIEBzYW1we2FkZHIxNn0KLWNoYW5nZSAzMi1iaXQgb3BlcmFuZHMvYWRkcmVzc2VzIGludG8gMTYtYml0IG9wZXJhbmRzL2FkZHJlc3NlcywKLXdoaWxlIEBzYW1we2RhdGEzMn0gYW5kIEBzYW1we2FkZHIzMn0gY2hhbmdlIDE2LWJpdCBvbmVzIChpbiBhCi1AY29kZXsuY29kZTE2fSBzZWN0aW9uKSBpbnRvIDMyLWJpdCBvcGVyYW5kcy9hZGRyZXNzZXMuICBUaGVzZSBwcmVmaXhlcwotQGVtcGh7bXVzdH0gYXBwZWFyIG9uIHRoZSBzYW1lIGxpbmUgb2YgY29kZSBhcyB0aGUgaW5zdHJ1Y3Rpb24gdGhleQotbW9kaWZ5LiBGb3IgZXhhbXBsZSwgaW4gYSAxNi1iaXQgQGNvZGV7LmNvZGUxNn0gc2VjdGlvbiwgeW91IG1pZ2h0Ci13cml0ZToKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBhZGRyMzIgam1wbCAqKCVlYngpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IGJ1cyBsb2NrIHByZWZpeGVzLCBpMzg2Ci1AY2luZGV4IGluaGliaXRpbmcgaW50ZXJydXB0cywgaTM4NgotQGl0ZW0KLVRoZSBidXMgbG9jayBwcmVmaXggQHNhbXB7bG9ja30gaW5oaWJpdHMgaW50ZXJydXB0cyBkdXJpbmcgZXhlY3V0aW9uIG9mCi10aGUgaW5zdHJ1Y3Rpb24gaXQgcHJlY2VkZXMuICAoVGhpcyBpcyBvbmx5IHZhbGlkIHdpdGggY2VydGFpbgotaW5zdHJ1Y3Rpb25zOyBzZWUgYSA4MDM4NiBtYW51YWwgZm9yIGRldGFpbHMpLgotCi1AY2luZGV4IGNvcHJvY2Vzc29yIHdhaXQsIGkzODYKLUBpdGVtCi1UaGUgd2FpdCBmb3IgY29wcm9jZXNzb3IgcHJlZml4IEBzYW1we3dhaXR9IHdhaXRzIGZvciB0aGUgY29wcm9jZXNzb3IgdG8KLWNvbXBsZXRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgVGhpcyBzaG91bGQgbmV2ZXIgYmUgbmVlZGVkIGZvciB0aGUKLTgwMzg2LzgwMzg3IGNvbWJpbmF0aW9uLgotCi1AY2luZGV4IHJlcGVhdCBwcmVmaXhlcywgaTM4NgotQGl0ZW0KLVRoZSBAc2FtcHtyZXB9LCBAc2FtcHtyZXBlfSwgYW5kIEBzYW1we3JlcG5lfSBwcmVmaXhlcyBhcmUgYWRkZWQKLXRvIHN0cmluZyBpbnN0cnVjdGlvbnMgdG8gbWFrZSB0aGVtIHJlcGVhdCBAc2FtcHslZWN4fSB0aW1lcyAoQHNhbXB7JWN4fQotdGltZXMgaWYgdGhlIGN1cnJlbnQgYWRkcmVzcyBzaXplIGlzIDE2LWJpdHMpLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIGkzODYtTWVtb3J5Ci1Ac2VjdGlvbiBNZW1vcnkgUmVmZXJlbmNlcwotCi1AY2luZGV4IGkzODYgbWVtb3J5IHJlZmVyZW5jZXMKLUBjaW5kZXggbWVtb3J5IHJlZmVyZW5jZXMsIGkzODYKLUFuIEludGVsIHN5bnRheCBpbmRpcmVjdCBtZW1vcnkgcmVmZXJlbmNlIG9mIHRoZSBmb3JtCi0KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7c2VjdGlvbn06W0B2YXJ7YmFzZX0gKyBAdmFye2luZGV4fSpAdmFye3NjYWxlfSArIEB2YXJ7ZGlzcH1dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLWlzIHRyYW5zbGF0ZWQgaW50byB0aGUgQVQmVCBzeW50YXgKLQotQHNtYWxsZXhhbXBsZQotQHZhcntzZWN0aW9ufTpAdmFye2Rpc3B9KEB2YXJ7YmFzZX0sIEB2YXJ7aW5kZXh9LCBAdmFye3NjYWxlfSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgQHZhcntiYXNlfSBhbmQgQHZhcntpbmRleH0gYXJlIHRoZSBvcHRpb25hbCAzMi1iaXQgYmFzZSBhbmQKLWluZGV4IHJlZ2lzdGVycywgQHZhcntkaXNwfSBpcyB0aGUgb3B0aW9uYWwgZGlzcGxhY2VtZW50LCBhbmQKLUB2YXJ7c2NhbGV9LCB0YWtpbmcgdGhlIHZhbHVlcyAxLCAyLCA0LCBhbmQgOCwgbXVsdGlwbGllcyBAdmFye2luZGV4fQotdG8gY2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBvcGVyYW5kLiAgSWYgbm8gQHZhcntzY2FsZX0gaXMKLXNwZWNpZmllZCwgQHZhcntzY2FsZX0gaXMgdGFrZW4gdG8gYmUgMS4gIEB2YXJ7c2VjdGlvbn0gc3BlY2lmaWVzIHRoZQotb3B0aW9uYWwgc2VjdGlvbiByZWdpc3RlciBmb3IgdGhlIG1lbW9yeSBvcGVyYW5kLCBhbmQgbWF5IG92ZXJyaWRlIHRoZQotZGVmYXVsdCBzZWN0aW9uIHJlZ2lzdGVyIChzZWUgYSA4MDM4NiBtYW51YWwgZm9yIHNlY3Rpb24gcmVnaXN0ZXIKLWRlZmF1bHRzKS4gTm90ZSB0aGF0IHNlY3Rpb24gb3ZlcnJpZGVzIGluIEFUJlQgc3ludGF4IEBlbXBoe211c3R9Ci1iZSBwcmVjZWRlZCBieSBhIEBzYW1weyV9LiAgSWYgeW91IHNwZWNpZnkgYSBzZWN0aW9uIG92ZXJyaWRlIHdoaWNoCi1jb2luY2lkZXMgd2l0aCB0aGUgZGVmYXVsdCBzZWN0aW9uIHJlZ2lzdGVyLCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIEBlbXBoe25vdH0KLW91dHB1dCBhbnkgc2VjdGlvbiByZWdpc3RlciBvdmVycmlkZSBwcmVmaXhlcyB0byBhc3NlbWJsZSB0aGUgZ2l2ZW4KLWluc3RydWN0aW9uLiAgVGh1cywgc2VjdGlvbiBvdmVycmlkZXMgY2FuIGJlIHNwZWNpZmllZCB0byBlbXBoYXNpemUgd2hpY2gKLXNlY3Rpb24gcmVnaXN0ZXIgaXMgdXNlZCBmb3IgYSBnaXZlbiBtZW1vcnkgb3BlcmFuZC4KLQotSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBJbnRlbCBhbmQgQVQmVCBzdHlsZSBtZW1vcnkgcmVmZXJlbmNlczoKLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBBVCZUOiBAc2FtcHstNCglZWJwKX0sIEludGVsOiAgQHNhbXB7W2VicCAtIDRdfQotQHZhcntiYXNlfSBpcyBAc2FtcHslZWJwfTsgQHZhcntkaXNwfSBpcyBAc2FtcHstNH0uIEB2YXJ7c2VjdGlvbn0gaXMKLW1pc3NpbmcsIGFuZCB0aGUgZGVmYXVsdCBzZWN0aW9uIGlzIHVzZWQgKEBzYW1weyVzc30gZm9yIGFkZHJlc3Npbmcgd2l0aAotQHNhbXB7JWVicH0gYXMgdGhlIGJhc2UgcmVnaXN0ZXIpLiAgQHZhcntpbmRleH0sIEB2YXJ7c2NhbGV9IGFyZSBib3RoIG1pc3NpbmcuCi0KLUBpdGVtIEFUJlQ6IEBzYW1we2ZvbygsJWVheCw0KX0sIEludGVsOiBAc2FtcHtbZm9vICsgZWF4KjRdfQotQHZhcntpbmRleH0gaXMgQHNhbXB7JWVheH0gKHNjYWxlZCBieSBhIEB2YXJ7c2NhbGV9IDQpOyBAdmFye2Rpc3B9IGlzCi1Ac2FtcHtmb299LiAgQWxsIG90aGVyIGZpZWxkcyBhcmUgbWlzc2luZy4gIFRoZSBzZWN0aW9uIHJlZ2lzdGVyIGhlcmUKLWRlZmF1bHRzIHRvIEBzYW1weyVkc30uCi0KLUBpdGVtIEFUJlQ6IEBzYW1we2ZvbygsMSl9OyBJbnRlbCBAc2FtcHtbZm9vXX0KLVRoaXMgdXNlcyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSBAc2FtcHtmb299IGFzIGEgbWVtb3J5IG9wZXJhbmQuCi1Ob3RlIHRoYXQgQHZhcntiYXNlfSBhbmQgQHZhcntpbmRleH0gYXJlIGJvdGggbWlzc2luZywgYnV0IHRoZXJlIGlzIG9ubHkKLUBlbXBoe29uZX0gQHNhbXB7LH0uICBUaGlzIGlzIGEgc3ludGFjdGljIGV4Y2VwdGlvbi4KLQotQGl0ZW0gQVQmVDogQHNhbXB7JWdzOmZvb307IEludGVsIEBzYW1we2dzOmZvb30KLVRoaXMgc2VsZWN0cyB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlIEBzYW1we2Zvb30gd2l0aCBzZWN0aW9uCi1yZWdpc3RlciBAdmFye3NlY3Rpb259IGJlaW5nIEBzYW1weyVnc30uCi1AZW5kIHRhYmxlCi0KLUFic29sdXRlIChhcyBvcHBvc2VkIHRvIFBDIHJlbGF0aXZlKSBjYWxsIGFuZCBqdW1wIG9wZXJhbmRzIG11c3QgYmUKLXByZWZpeGVkIHdpdGggQHNhbXB7Kn0uICBJZiBubyBAc2FtcHsqfSBpcyBzcGVjaWZpZWQsIEBjb2Rle0B2YWx1ZXtBU319Ci1hbHdheXMgY2hvb3NlcyBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nIGZvciBqdW1wL2NhbGwgbGFiZWxzLgotCi1BbnkgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgYSBtZW1vcnkgb3BlcmFuZCwgYnV0IG5vIHJlZ2lzdGVyIG9wZXJhbmQsCi1AZW1waHttdXN0fSBzcGVjaWZ5IGl0cyBzaXplIChieXRlLCB3b3JkLCBvciBsb25nKSB3aXRoIGFuIGluc3RydWN0aW9uCi1tbmVtb25pYyBzdWZmaXggKEBzYW1we2J9LCBAc2FtcHt3fSwgb3IgQHNhbXB7bH0sIHJlc3BlY3RpdmVseSkuCi0KLUBub2RlIGkzODYtanVtcHMKLUBzZWN0aW9uIEhhbmRsaW5nIG9mIEp1bXAgSW5zdHJ1Y3Rpb25zCi0KLUBjaW5kZXgganVtcCBvcHRpbWl6YXRpb24sIGkzODYKLUBjaW5kZXggaTM4NiBqdW1wIG9wdGltaXphdGlvbgotSnVtcCBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBvcHRpbWl6ZWQgdG8gdXNlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZQotZGlzcGxhY2VtZW50cy4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIGJ5dGUgKDgtYml0KSBkaXNwbGFjZW1lbnQKLWp1bXBzIHdoZW5ldmVyIHRoZSB0YXJnZXQgaXMgc3VmZmljaWVudGx5IGNsb3NlLiAgSWYgYSBieXRlIGRpc3BsYWNlbWVudAotaXMgaW5zdWZmaWNpZW50IGEgbG9uZyAoMzItYml0KSBkaXNwbGFjZW1lbnQgaXMgdXNlZC4gIFdlIGRvIG5vdCBzdXBwb3J0Ci13b3JkICgxNi1iaXQpIGRpc3BsYWNlbWVudCBqdW1wcyBpbiAzMi1iaXQgbW9kZSAoaS5lLiBwcmVmaXhpbmcgdGhlIGp1bXAKLWluc3RydWN0aW9uIHdpdGggdGhlIEBzYW1we2RhdGExNn0gaW5zdHJ1Y3Rpb24gcHJlZml4KSwgc2luY2UgdGhlIDgwMzg2Ci1pbnNpc3RzIHVwb24gbWFza2luZyBAc2FtcHslZWlwfSB0byAxNiBiaXRzIGFmdGVyIHRoZSB3b3JkIGRpc3BsYWNlbWVudAotaXMgYWRkZWQuCi0KLU5vdGUgdGhhdCB0aGUgQHNhbXB7amN4en0sIEBzYW1we2plY3h6fSwgQHNhbXB7bG9vcH0sIEBzYW1we2xvb3B6fSwKLUBzYW1we2xvb3BlfSwgQHNhbXB7bG9vcG56fSBhbmQgQHNhbXB7bG9vcG5lfSBpbnN0cnVjdGlvbnMgb25seSBjb21lIGluIGJ5dGUKLWRpc3BsYWNlbWVudHMsIHNvIHRoYXQgaWYgeW91IHVzZSB0aGVzZSBpbnN0cnVjdGlvbnMgKEBjb2Rle0B2YWx1ZXtHQ0N9fSBkb2VzCi1ub3QgdXNlIHRoZW0pIHlvdSBtYXkgZ2V0IGFuIGVycm9yIG1lc3NhZ2UgKGFuZCBpbmNvcnJlY3QgY29kZSkuICBUaGUgQVQmVAotODAzODYgYXNzZW1ibGVyIHRyaWVzIHRvIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIGJ5IGV4cGFuZGluZyBAc2FtcHtqY3h6IGZvb30KLXRvCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgIGpjeHogY3hfemVybwotICAgICAgICAgam1wIGN4X25vbnplcm8KLWN4X3plcm86IGptcCBmb28KLWN4X25vbnplcm86Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBpMzg2LUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGkzODYgZmxvYXRpbmcgcG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIGkzODYKLUFsbCA4MDM4NyBmbG9hdGluZyBwb2ludCB0eXBlcyBleGNlcHQgcGFja2VkIEJDRCBhcmUgc3VwcG9ydGVkLgotKEJDRCBzdXBwb3J0IG1heSBiZSBhZGRlZCB3aXRob3V0IG11Y2ggZGlmZmljdWx0eSkuICBUaGVzZSBkYXRhCi10eXBlcyBhcmUgMTYtLCAzMi0sIGFuZCA2NC0gYml0IGludGVnZXJzLCBhbmQgc2luZ2xlICgzMi1iaXQpLAotZG91YmxlICg2NC1iaXQpLCBhbmQgZXh0ZW5kZWQgKDgwLWJpdCkgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LgotRWFjaCBzdXBwb3J0ZWQgdHlwZSBoYXMgYW4gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGFuZCBhIGNvbnN0cnVjdG9yCi1hc3NvY2lhdGVkIHdpdGggaXQuICBJbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBzcGVjaWZ5IHRoZSBvcGVyYW5kJ3MKLWRhdGEgdHlwZS4gIENvbnN0cnVjdG9ycyBidWlsZCB0aGVzZSBkYXRhIHR5cGVzIGludG8gbWVtb3J5LgotCi1AY2luZGV4IEBjb2Rle2Zsb2F0fSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7c2luZ2xlfSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7ZG91YmxlfSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7dGZsb2F0fSBkaXJlY3RpdmUsIGkzODYKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1GbG9hdGluZyBwb2ludCBjb25zdHJ1Y3RvcnMgYXJlIEBzYW1wey5mbG9hdH0gb3IgQHNhbXB7LnNpbmdsZX0sCi1Ac2FtcHsuZG91YmxlfSwgYW5kIEBzYW1wey50ZmxvYXR9IGZvciAzMi0sIDY0LSwgYW5kIDgwLWJpdCBmb3JtYXRzLgotVGhlc2UgY29ycmVzcG9uZCB0byBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBAc2FtcHtzfSwgQHNhbXB7bH0sCi1hbmQgQHNhbXB7dH0uIEBzYW1we3R9IHN0YW5kcyBmb3IgODAtYml0ICh0ZW4gYnl0ZSkgcmVhbC4gIFRoZSA4MDM4Nwotb25seSBzdXBwb3J0cyB0aGlzIGZvcm1hdCB2aWEgdGhlIEBzYW1we2ZsZHR9IChsb2FkIDgwLWJpdCByZWFsIHRvIHN0YWNrCi10b3ApIGFuZCBAc2FtcHtmc3RwdH0gKHN0b3JlIDgwLWJpdCByZWFsIGFuZCBwb3Agc3RhY2spIGluc3RydWN0aW9ucy4KLQotQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7bG9uZ30gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2ludH0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle3F1YWR9IGRpcmVjdGl2ZSwgaTM4NgotQGl0ZW0KLUludGVnZXIgY29uc3RydWN0b3JzIGFyZSBAc2FtcHsud29yZH0sIEBzYW1wey5sb25nfSBvciBAc2FtcHsuaW50fSwgYW5kCi1Ac2FtcHsucXVhZH0gZm9yIHRoZSAxNi0sIDMyLSwgYW5kIDY0LWJpdCBpbnRlZ2VyIGZvcm1hdHMuICBUaGUKLWNvcnJlc3BvbmRpbmcgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMgYXJlIEBzYW1we3N9IChzaW5nbGUpLAotQHNhbXB7bH0gKGxvbmcpLCBhbmQgQHNhbXB7cX0gKHF1YWQpLiAgQXMgd2l0aCB0aGUgODAtYml0IHJlYWwgZm9ybWF0LAotdGhlIDY0LWJpdCBAc2FtcHtxfSBmb3JtYXQgaXMgb25seSBwcmVzZW50IGluIHRoZSBAc2FtcHtmaWxkcX0gKGxvYWQKLXF1YWQgaW50ZWdlciB0byBzdGFjayB0b3ApIGFuZCBAc2FtcHtmaXN0cHF9IChzdG9yZSBxdWFkIGludGVnZXIgYW5kIHBvcAotc3RhY2spIGluc3RydWN0aW9ucy4KLUBlbmQgaXRlbWl6ZQotCi1SZWdpc3RlciB0byByZWdpc3RlciBvcGVyYXRpb25zIHNob3VsZCBub3QgdXNlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzLgotQHNhbXB7ZnN0bCAlc3QsICVzdCgxKX0gd2lsbCBnaXZlIGEgd2FybmluZywgYW5kIGJlIGFzc2VtYmxlZCBhcyBpZiB5b3UKLXdyb3RlIEBzYW1we2ZzdCAlc3QsICVzdCgxKX0sIHNpbmNlIGFsbCByZWdpc3RlciB0byByZWdpc3RlciBvcGVyYXRpb25zCi11c2UgODAtYml0IGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzLiAoQ29udHJhc3QgdGhpcyB3aXRoIEBzYW1we2ZzdGwgJXN0LCBtZW19LAotd2hpY2ggY29udmVydHMgQHNhbXB7JXN0fSBmcm9tIDgwLWJpdCB0byA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LAotdGhlbiBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGUgNCBieXRlIGxvY2F0aW9uIEBzYW1we21lbX0pCi0KLUBub2RlIGkzODYtU0lNRAotQHNlY3Rpb24gSW50ZWwncyBNTVggYW5kIEFNRCdzIDNETm93ISBTSU1EIE9wZXJhdGlvbnMKLQotQGNpbmRleCBNTVgsIGkzODYKLUBjaW5kZXggM0ROb3chLCBpMzg2Ci1AY2luZGV4IFNJTUQsIGkzODYKLQotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgSW50ZWwncyBNTVggaW5zdHJ1Y3Rpb24gc2V0IChTSU1ECi1pbnN0cnVjdGlvbnMgZm9yIGludGVnZXIgZGF0YSksIGF2YWlsYWJsZSBvbiBJbnRlbCdzIFBlbnRpdW0gTU1YCi1wcm9jZXNzb3JzIGFuZCBQZW50aXVtIElJIHByb2Nlc3NvcnMsIEFNRCdzIEs2IGFuZCBLNi0yIHByb2Nlc3NvcnMsCi1DeXJpeCcgTTIgcHJvY2Vzc29yLCBhbmQgcHJvYmFibHkgb3RoZXJzLiAgSXQgYWxzbyBzdXBwb3J0cyBBTUQncyAzRE5vdyEKLWluc3RydWN0aW9uIHNldCAoU0lNRCBpbnN0cnVjdGlvbnMgZm9yIDMyLWJpdCBmbG9hdGluZyBwb2ludCBkYXRhKQotYXZhaWxhYmxlIG9uIEFNRCdzIEs2LTIgcHJvY2Vzc29yIGFuZCBwb3NzaWJseSBvdGhlcnMgaW4gdGhlIGZ1dHVyZS4KLQotQ3VycmVudGx5LCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBzdXBwb3J0IEludGVsJ3MgZmxvYXRpbmcgcG9pbnQKLVNJTUQsIEthdG1haSAoS05JKS4KLQotVGhlIGVpZ2h0IDY0LWJpdCBNTVggb3BlcmFuZHMsIGFsc28gdXNlZCBieSAzRE5vdyEsIGFyZSBjYWxsZWQgQHNhbXB7JW1tMH0sCi1Ac2FtcHslbW0xfSwgLi4uIEBzYW1weyVtbTd9LiAgVGhleSBjb250YWluIGVpZ2h0IDgtYml0IGludGVnZXJzLCBmb3VyCi0xNi1iaXQgaW50ZWdlcnMsIHR3byAzMi1iaXQgaW50ZWdlcnMsIG9uZSA2NC1iaXQgaW50ZWdlciwgb3IgdHdvIDMyLWJpdAotZmxvYXRpbmcgcG9pbnQgdmFsdWVzLiAgVGhlIE1NWCByZWdpc3RlcnMgY2Fubm90IGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZQotYXMgdGhlIGZsb2F0aW5nIHBvaW50IHN0YWNrLgotCi1TZWUgSW50ZWwgYW5kIEFNRCBkb2N1bWVudGF0aW9uLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgb3BlcmFuZCBvcmRlciBpbgotaW5zdHJ1Y3Rpb25zIGlzIHJldmVyc2VkIGZyb20gdGhlIEludGVsIHN5bnRheC4KLQotQG5vZGUgaTM4Ni0xNmJpdAotQHNlY3Rpb24gV3JpdGluZyAxNi1iaXQgQ29kZQotCi1AY2luZGV4IGkzODYgMTYtYml0IGNvZGUKLUBjaW5kZXggMTYtYml0IGNvZGUsIGkzODYKLUBjaW5kZXggcmVhbC1tb2RlIGNvZGUsIGkzODYKLUBjaW5kZXggQGNvZGV7Y29kZTE2Z2NjfSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7Y29kZTE2fSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7Y29kZTMyfSBkaXJlY3RpdmUsIGkzODYKLVdoaWxlIEBjb2Rle0B2YWx1ZXtBU319IG5vcm1hbGx5IHdyaXRlcyBvbmx5IGBgcHVyZScnIDMyLWJpdCBpMzg2IGNvZGUsCi1pdCBhbHNvIHN1cHBvcnRzIHdyaXRpbmcgY29kZSB0byBydW4gaW4gcmVhbCBtb2RlIG9yIGluIDE2LWJpdCBwcm90ZWN0ZWQKLW1vZGUgY29kZSBzZWdtZW50cy4gIFRvIGRvIHRoaXMsIHB1dCBhIEBzYW1wey5jb2RlMTZ9IG9yCi1Ac2FtcHsuY29kZTE2Z2NjfSBkaXJlY3RpdmUgYmVmb3JlIHRoZSBhc3NlbWJseSBsYW5ndWFnZSBpbnN0cnVjdGlvbnMgdG8KLWJlIHJ1biBpbiAxNi1iaXQgbW9kZS4gIFlvdSBjYW4gc3dpdGNoIEBjb2Rle0B2YWx1ZXtBU319IGJhY2sgdG8gd3JpdGluZwotbm9ybWFsIDMyLWJpdCBjb2RlIHdpdGggdGhlIEBzYW1wey5jb2RlMzJ9IGRpcmVjdGl2ZS4KLQotQHNhbXB7LmNvZGUxNmdjY30gcHJvdmlkZXMgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgMTYtYml0Ci1jb2RlIGZyb20gZ2NjLCBhbmQgZGlmZmVycyBmcm9tIEBzYW1wey5jb2RlMTZ9IGluIHRoYXQgQHNhbXB7Y2FsbH0sCi1Ac2FtcHtyZXR9LCBAc2FtcHtlbnRlcn0sIEBzYW1we2xlYXZlfSwgQHNhbXB7cHVzaH0sIEBzYW1we3BvcH0sCi1Ac2FtcHtwdXNoYX0sIEBzYW1we3BvcGF9LCBAc2FtcHtwdXNoZn0sIGFuZCBAc2FtcHtwb3BmfSBpbnN0cnVjdGlvbnMKLWRlZmF1bHQgdG8gMzItYml0IHNpemUuICBUaGlzIGlzIHNvIHRoYXQgdGhlIHN0YWNrIHBvaW50ZXIgaXMKLW1hbmlwdWxhdGVkIGluIHRoZSBzYW1lIHdheSBvdmVyIGZ1bmN0aW9uIGNhbGxzLCBhbGxvd2luZyBhY2Nlc3MgdG8KLWZ1bmN0aW9uIHBhcmFtZXRlcnMgYXQgdGhlIHNhbWUgc3RhY2sgb2Zmc2V0cyBhcyBpbiAzMi1iaXQgbW9kZS4KLUBzYW1wey5jb2RlMTZnY2N9IGFsc28gYXV0b21hdGljYWxseSBhZGRzIGFkZHJlc3Mgc2l6ZSBwcmVmaXhlcyB3aGVyZQotbmVjZXNzYXJ5IHRvIHVzZSB0aGUgMzItYml0IGFkZHJlc3NpbmcgbW9kZXMgdGhhdCBnY2MgZ2VuZXJhdGVzLgotCi1UaGUgY29kZSB3aGljaCBAY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgaW4gMTYtYml0IG1vZGUgd2lsbCBub3QKLW5lY2Vzc2FyaWx5IHJ1biBvbiBhIDE2LWJpdCBwcmUtODAzODYgcHJvY2Vzc29yLiAgVG8gd3JpdGUgY29kZSB0aGF0Ci1ydW5zIG9uIHN1Y2ggYSBwcm9jZXNzb3IsIHlvdSBtdXN0IHJlZnJhaW4gZnJvbSB1c2luZyBAZW1waHthbnl9IDMyLWJpdAotY29uc3RydWN0cyB3aGljaCByZXF1aXJlIEBjb2Rle0B2YWx1ZXtBU319IHRvIG91dHB1dCBhZGRyZXNzIG9yIG9wZXJhbmQKLXNpemUgcHJlZml4ZXMuCi0KLU5vdGUgdGhhdCB3cml0aW5nIDE2LWJpdCBjb2RlIGluc3RydWN0aW9ucyBieSBleHBsaWNpdGx5IHNwZWNpZnlpbmcgYQotcHJlZml4IG9yIGFuIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCB3aXRoaW4gYSAzMi1iaXQgY29kZSBzZWN0aW9uCi1nZW5lcmF0ZXMgZGlmZmVyZW50IG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHRoYW4gdGhvc2UgZ2VuZXJhdGVkIGZvciBhCi0xNi1iaXQgY29kZSBzZWdtZW50LiAgSW4gYSAzMi1iaXQgY29kZSBzZWN0aW9uLCB0aGUgZm9sbG93aW5nIGNvZGUKLWdlbmVyYXRlcyB0aGUgbWFjaGluZSBvcGNvZGUgYnl0ZXMgQHNhbXB7NjYgNmEgMDR9LCB3aGljaCBwdXNoZXMgdGhlCi12YWx1ZSBAc2FtcHs0fSBvbnRvIHRoZSBzdGFjaywgZGVjcmVtZW50aW5nIEBzYW1weyVlc3B9IGJ5IDIuCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgcHVzaHcgJDQKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBzYW1lIGNvZGUgaW4gYSAxNi1iaXQgY29kZSBzZWN0aW9uIHdvdWxkIGdlbmVyYXRlIHRoZSBtYWNoaW5lCi1vcGNvZGUgYnl0ZXMgQHNhbXB7NmEgMDR9IChpZS4gd2l0aG91dCB0aGUgb3BlcmFuZCBzaXplIHByZWZpeCksIHdoaWNoCi1pcyBjb3JyZWN0IHNpbmNlIHRoZSBwcm9jZXNzb3IgZGVmYXVsdCBvcGVyYW5kIHNpemUgaXMgYXNzdW1lZCB0byBiZSAxNgotYml0cyBpbiBhIDE2LWJpdCBjb2RlIHNlY3Rpb24uCi0KLUBub2RlIGkzODYtQnVncwotQHNlY3Rpb24gQVQmVCBTeW50YXggYnVncwotCi1UaGUgVW5peFdhcmUgYXNzZW1ibGVyLCBhbmQgcHJvYmFibHkgb3RoZXIgQVQmVCBkZXJpdmVkIGl4ODYgVW5peAotYXNzZW1ibGVycywgZ2VuZXJhdGUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHdpdGggcmV2ZXJzZWQgc291cmNlCi1hbmQgZGVzdGluYXRpb24gcmVnaXN0ZXJzIGluIGNlcnRhaW4gY2FzZXMuICBVbmZvcnR1bmF0ZWx5LCBnY2MgYW5kCi1wb3NzaWJseSBtYW55IG90aGVyIHByb2dyYW1zIHVzZSB0aGlzIHJldmVyc2VkIHN5bnRheCwgc28gd2UncmUgc3R1Y2sKLXdpdGggaXQuCi0KLUZvciBleGFtcGxlCi0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgZnN1YiAlc3QsJXN0KDMpCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1yZXN1bHRzIGluIEBzYW1weyVzdCgzKX0gYmVpbmcgdXBkYXRlZCB0byBAc2FtcHslc3QgLSAlc3QoMyl9IHJhdGhlcgotdGhhbiB0aGUgZXhwZWN0ZWQgQHNhbXB7JXN0KDMpIC0gJXN0fS4gIFRoaXMgaGFwcGVucyB3aXRoIGFsbCB0aGUKLW5vbi1jb21tdXRhdGl2ZSBhcml0aG1ldGljIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgd2l0aCB0d28gcmVnaXN0ZXIKLW9wZXJhbmRzIHdoZXJlIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMgQHNhbXB7JXN0fSBhbmQgdGhlIGRlc3RpbmF0aW9uCi1yZWdpc3RlciBpcyBAc2FtcHslc3QoaSl9LgotCi1Abm9kZSBpMzg2LU5vdGVzCi1Ac2VjdGlvbiBOb3RlcwotCi1AY2luZGV4IGkzODYgQGNvZGV7bXVsfSwgQGNvZGV7aW11bH0gaW5zdHJ1Y3Rpb25zCi1AY2luZGV4IEBjb2Rle211bH0gaW5zdHJ1Y3Rpb24sIGkzODYKLUBjaW5kZXggQGNvZGV7aW11bH0gaW5zdHJ1Y3Rpb24sIGkzODYKLVRoZXJlIGlzIHNvbWUgdHJpY2tlcnkgY29uY2VybmluZyB0aGUgQHNhbXB7bXVsfSBhbmQgQHNhbXB7aW11bH0KLWluc3RydWN0aW9ucyB0aGF0IGRlc2VydmVzIG1lbnRpb24uICBUaGUgMTYtLCAzMi0sIGFuZCA2NC1iaXQgZXhwYW5kaW5nCi1tdWx0aXBsaWVzIChiYXNlIG9wY29kZSBAc2FtcHsweGY2fTsgZXh0ZW5zaW9uIDQgZm9yIEBzYW1we211bH0gYW5kIDUKLWZvciBAc2FtcHtpbXVsfSkgY2FuIGJlIG91dHB1dCBvbmx5IGluIHRoZSBvbmUgb3BlcmFuZCBmb3JtLiAgVGh1cywKLUBzYW1we2ltdWwgJWVieCwgJWVheH0gZG9lcyBAZW1waHtub3R9IHNlbGVjdCB0aGUgZXhwYW5kaW5nIG11bHRpcGx5OwotdGhlIGV4cGFuZGluZyBtdWx0aXBseSB3b3VsZCBjbG9iYmVyIHRoZSBAc2FtcHslZWR4fSByZWdpc3RlciwgYW5kIHRoaXMKLXdvdWxkIGNvbmZ1c2UgQGNvZGV7QHZhbHVle0dDQ319IG91dHB1dC4gIFVzZSBAc2FtcHtpbXVsICVlYnh9IHRvIGdldCB0aGUKLTY0LWJpdCBwcm9kdWN0IGluIEBzYW1weyVlZHg6JWVheH0uCi0KLVdlIGhhdmUgYWRkZWQgYSB0d28gb3BlcmFuZCBmb3JtIG9mIEBzYW1we2ltdWx9IHdoZW4gdGhlIGZpcnN0IG9wZXJhbmQKLWlzIGFuIGltbWVkaWF0ZSBtb2RlIGV4cHJlc3Npb24gYW5kIHRoZSBzZWNvbmQgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyLgotVGhpcyBpcyBqdXN0IGEgc2hvcnRoYW5kLCBzbyB0aGF0LCBtdWx0aXBseWluZyBAc2FtcHslZWF4fSBieSA2OSwgZm9yCi1leGFtcGxlLCBjYW4gYmUgZG9uZSB3aXRoIEBzYW1we2ltdWwgJDY5LCAlZWF4fSByYXRoZXIgdGhhbiBAc2FtcHtpbXVsCi0kNjksICVlYXgsICVlYXh9LgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaTk2MC50ZXhpIGIvZ2FzL2RvYy9jLWk5NjAudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3MDMwYS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaTk2MC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBpOTYwLURlcGVuZGVudAotQGNoYXB0ZXIgSW50ZWwgODA5NjAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgSW50ZWwgODA5NjAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBpOTYwIHN1cHBvcnQKLUBtZW51Ci0qIE9wdGlvbnMtaTk2MDo6ICAgICAgICAgICAgICAgIGk5NjAgQ29tbWFuZC1saW5lIE9wdGlvbnMKLSogRmxvYXRpbmcgUG9pbnQtaTk2MDo6ICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogRGlyZWN0aXZlcy1pOTYwOjogICAgICAgICAgICAgaTk2MCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogT3Bjb2RlcyBmb3IgaTk2MDo6ICAgICAgICAgICAgaTk2MCBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQGMgRklYTUUhIEFkZCBTeW50YXggc2VjIHdpdGggZGlzY3Vzc2lvbiBvZiBiaXRmaWVsZHMgaGVyZSwgYXQgbGVhc3Qgc28KLUBjIGxvbmcgYXMgdGhleSdyZSBub3QgdHVybmVkIG9uIGZvciBvdGhlciBtYWNoaW5lcyB0aGFuIDk2MC4KLQotQG5vZGUgT3B0aW9ucy1pOTYwCi0KLUBzZWN0aW9uIGk5NjAgQ29tbWFuZC1saW5lIE9wdGlvbnMKLQotQGNpbmRleCBpOTYwIG9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgaTk2MAotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggaTk2MCBhcmNoaXRlY3R1cmUgb3B0aW9ucwotQGNpbmRleCBhcmNoaXRlY3R1cmUgb3B0aW9ucywgaTk2MAotQGNpbmRleCBAY29kZXstQX0gb3B0aW9ucywgaTk2MAotQGl0ZW0gLUFDQSB8IC1BQ0FfQSB8IC1BQ0IgfCAtQUNDIHwgLUFLQSB8IC1BS0IgfCAtQUtDIHwgLUFNQwotU2VsZWN0IHRoZSA4MDk2MCBhcmNoaXRlY3R1cmUuICBJbnN0cnVjdGlvbnMgb3IgZmVhdHVyZXMgbm90IHN1cHBvcnRlZAotYnkgdGhlIHNlbGVjdGVkIGFyY2hpdGVjdHVyZSBjYXVzZSBmYXRhbCBlcnJvcnMuCi0KLUBzYW1wey1BQ0F9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7LUFDQV9BfTsgQHNhbXB7LUFLQ30gaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7LUFNQ30uICBTeW5vbnltcyBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciB0b29scy4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBvZiB0aGVzZSBvcHRpb25zLCBAY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgY29kZQotZm9yIGFueSBpbnN0cnVjdGlvbiBvciBmZWF0dXJlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IEBlbXBoe3NvbWV9IHZlcnNpb24gb2YgdGhlCi05NjAgKGV2ZW4gaWYgdGhpcyBtZWFucyBtaXhpbmcgYXJjaGl0ZWN0dXJlcyEpLiAgSW4gcHJpbmNpcGxlLAotQGNvZGV7QHZhbHVle0FTfX0gYXR0ZW1wdHMgdG8gZGVkdWNlIHRoZSBtaW5pbWFsIHN1ZmZpY2llbnQgcHJvY2Vzc29yIHR5cGUgaWYKLW5vbmUgaXMgc3BlY2lmaWVkOyBkZXBlbmRpbmcgb24gdGhlIG9iamVjdCBjb2RlIGZvcm1hdCwgdGhlIHByb2Nlc3NvciB0eXBlIG1heQotYmUgcmVjb3JkZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgSWYgaXQgaXMgY3JpdGljYWwgdGhhdCB0aGUgQGNvZGV7QHZhbHVle0FTfX0KLW91dHB1dCBtYXRjaCBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSwgc3BlY2lmeSB0aGF0IGFyY2hpdGVjdHVyZSBleHBsaWNpdGx5LgotCi1AY2luZGV4IEBjb2Rley1ifSBvcHRpb24sIGk5NjAKLUBjaW5kZXggYnJhbmNoIHJlY29yZGluZywgaTk2MAotQGNpbmRleCBpOTYwIGJyYW5jaCByZWNvcmRpbmcKLUBpdGVtIC1iCi1BZGQgY29kZSB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRha2VuLCBmb3IKLWxhdGVyIG9wdGltaXphdGlvbiB1c2luZyBicmFuY2ggcHJlZGljdGlvbiBiaXRzLiAgKFRoZSBjb25kaXRpb25hbCBicmFuY2gKLWluc3RydWN0aW9ucyBoYXZlIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMgaW4gdGhlIENBLCBDQiwgYW5kIENDCi1hcmNoaXRlY3R1cmVzLikgIElmIEB2YXJ7QlJ9IHJlcHJlc2VudHMgYSBjb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb24sCi10aGUgZm9sbG93aW5nIHJlcHJlc2VudHMgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgd2hlbgotQHNhbXB7LWJ9IGlzIHNwZWNpZmllZDoKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBjYWxsICAgIEB2YXJ7aW5jcmVtZW50IHJvdXRpbmV9Ci0gICAgICAgIC53b3JkICAgMCAgICAgICAjIHByZS1jb3VudGVyCi1MYWJlbDogIEB2YXJ7QlJ9Ci0gICAgICAgIGNhbGwgICAgQHZhcntpbmNyZW1lbnQgcm91dGluZX0KLSAgICAgICAgLndvcmQgICAwICAgICAgICMgcG9zdC1jb3VudGVyCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgY291bnRlciBmb2xsb3dpbmcgYSBicmFuY2ggcmVjb3JkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYnJhbmNoCi13YXMgQGVtcGh7bm90fSB0YWtlbjsgdGhlIGRpZmZlcmVuYyBiZXR3ZWVuIHRoZSB0d28gY291bnRlcnMgaXMgdGhlCi1udW1iZXIgb2YgdGltZXMgdGhlIGJyYW5jaCBAZW1waHt3YXN9IHRha2VuLgotCi1AY2luZGV4IEBjb2Rle2dicjk2MH0sIGk5NjAgcG9zdHByb2Nlc3NvcgotQGNpbmRleCBicmFuY2ggc3RhdGlzdGljcyB0YWJsZSwgaTk2MAotQSB0YWJsZSBvZiBldmVyeSBzdWNoIEBjb2Rle0xhYmVsfSBpcyBhbHNvIGdlbmVyYXRlZCwgc28gdGhhdCB0aGUKLWV4dGVybmFsIHBvc3Rwcm9jZXNzb3IgQGNvZGV7Z2JyOTYwfSAoc3VwcGxpZWQgYnkgSW50ZWwpIGNhbiBsb2NhdGUgYWxsCi10aGUgY291bnRlcnMuICBUaGlzIHRhYmxlIGlzIGFsd2F5cyBsYWJlbGxlZCBAc2FtcHtfX0JSQU5DSF9UQUJMRV9ffTsKLXRoaXMgaXMgYSBsb2NhbCBzeW1ib2wgdG8gcGVybWl0IGNvbGxlY3Rpbmcgc3RhdGlzdGljcyBmb3IgbWFueSBzZXBhcmF0ZQotb2JqZWN0IGZpbGVzLiAgVGhlIHRhYmxlIGlzIHdvcmQgYWxpZ25lZCwgYW5kIGJlZ2lucyB3aXRoIGEgdHdvLXdvcmQKLWhlYWRlci4gIFRoZSBmaXJzdCB3b3JkLCBpbml0aWFsaXplZCB0byAwLCBpcyB1c2VkIGluIG1haW50YWluaW5nIGxpbmtlZAotbGlzdHMgb2YgYnJhbmNoIHRhYmxlcy4gIFRoZSBzZWNvbmQgd29yZCBpcyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YKLWVudHJpZXMgaW4gdGhlIHRhYmxlLCB3aGljaCBmb2xsb3cgaW1tZWRpYXRlbHk6IGVhY2ggaXMgYSB3b3JkLCBwb2ludGluZwotdG8gb25lIG9mIHRoZSBsYWJlbHMgaWxsdXN0cmF0ZWQgYWJvdmUuCi0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBleGFtcGxlCi0gKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKyAuLi4gKy0tLS0tLS0tLS0tLSsKLSB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgfAotIHwgICpORVhUICAgICB8ICBDT1VOVDogTiAgfCAqQlJMQUIgMSAgIHwgICAgIHwgKkJSTEFCIE4gICB8Ci0gfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgfCAgICAgICAgICAgIHwKLSArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rIC4uLiArLS0tLS0tLS0tLS0tKwotCi0gICAgICAgICAgICAgICBfX0JSQU5DSF9UQUJMRV9fIGxheW91dAotQGVuZCBleGFtcGxlCi1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUBuZWVkIDIwMDAKLUB0ZXgKLVx2c2tpcCAxcGMKLVxsaW5le1xsZWZ0c2tpcD0wcHRcaHNraXBcdGFibGVpbmRlbnQKLVxib3hpdHsyY219e1x0dCAqTkVYVH1cYm94aXR7MmNtfXtcdHQgQ09VTlQ6IFxpdCBOfVxib3hpdHsyY219e1x0dAotKkJSTEFCIDF9XGlib3h7MWNtfXtccXVhZFxkb3RzfVxib3hpdHsyY219e1x0dCAqQlJMQUIgXGl0IE59XGhmaWx9Ci1cY2VudGVybGluZXtcaXQge1x0dCBcX1xfQlJBTkNIXF9UQUJMRVxfXF99IGxheW91dH0KLUBlbmQgdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotVGhlIGZpcnN0IHdvcmQgb2YgdGhlIGhlYWRlciBpcyB1c2VkIHRvIGxvY2F0ZSBtdWx0aXBsZSBicmFuY2ggdGFibGVzLAotc2luY2UgZWFjaCBvYmplY3QgZmlsZSBtYXkgY29udGFpbiBvbmUuIE5vcm1hbGx5IHRoZSBsaW5rcyBhcmUKLW1haW50YWluZWQgd2l0aCBhIGNhbGwgdG8gYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSwgcGxhY2VkIGF0IHRoZQotYmVnaW5uaW5nIG9mIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGZpbGUuICBUaGUgQHNje2dudX0gQyBjb21waWxlcgotZ2VuZXJhdGVzIHRoZXNlIGNhbGxzIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgZ2l2ZSBpdCBhIEBzYW1wey1ifSBvcHRpb24uCi1Gb3IgZnVydGhlciBkZXRhaWxzLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQHNhbXB7Z2JyOTYwfS4KLQotQGNpbmRleCBAY29kZXstbm8tcmVsYXh9IG9wdGlvbiwgaTk2MAotQGl0ZW0gLW5vLXJlbGF4Ci1Ob3JtYWxseSwgQ29tcGFyZS1hbmQtQnJhbmNoIGluc3RydWN0aW9ucyB3aXRoIHRhcmdldHMgdGhhdCByZXF1aXJlCi1kaXNwbGFjZW1lbnRzIGdyZWF0ZXIgdGhhbiAxMyBiaXRzIChvciB0aGF0IGhhdmUgZXh0ZXJuYWwgdGFyZ2V0cykgYXJlCi1yZXBsYWNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgKG9yIEBzYW1we2Noa2JpdH0pIGFuZCBicmFuY2gKLWluc3RydWN0aW9ucy4gIFlvdSBjYW4gdXNlIHRoZSBAc2FtcHstbm8tcmVsYXh9IG9wdGlvbiB0byBzcGVjaWZ5IHRoYXQKLUBjb2Rle0B2YWx1ZXtBU319IHNob3VsZCBnZW5lcmF0ZSBlcnJvcnMgaW5zdGVhZCwgaWYgdGhlIHRhcmdldCBkaXNwbGFjZW1lbnQKLWlzIGxhcmdlciB0aGFuIDEzIGJpdHMuCi0KLVRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgQ29tcGFyZS1hbmQtSnVtcCBpbnN0cnVjdGlvbnM7IHRoZSBjb2RlCi1lbWl0dGVkIGZvciB0aGVtIGlzIEBlbXBoe2Fsd2F5c30gYWRqdXN0ZWQgd2hlbiBuZWNlc3NhcnkgKGRlcGVuZGluZyBvbgotZGlzcGxhY2VtZW50IHNpemUpLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgeW91IHVzZSBAc2FtcHstbm8tcmVsYXh9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBGbG9hdGluZyBQb2ludC1pOTYwCi1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBpOTYwIChAc2N7aWVlZX0pCi1AY2luZGV4IGk5NjAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLUBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgdGhlIGRpcmVjdGl2ZXMKLUBzYW1wey5mbG9hdH0sIEBzYW1wey5kb3VibGV9LCBAc2FtcHsuZXh0ZW5kZWR9LCBhbmQgQHNhbXB7LnNpbmdsZX0uCi0KLUBub2RlIERpcmVjdGl2ZXMtaTk2MAotQHNlY3Rpb24gaTk2MCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIGk5NjAKLUBjaW5kZXggaTk2MCBtYWNoaW5lIGRpcmVjdGl2ZXMKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2Jzc30gZGlyZWN0aXZlLCBpOTYwCi1AaXRlbSAuYnNzIEB2YXJ7c3ltYm9sfSwgQHZhcntsZW5ndGh9LCBAdmFye2FsaWdufQotUmVzZXJ2ZSBAdmFye2xlbmd0aH0gYnl0ZXMgaW4gdGhlIGJzcyBzZWN0aW9uIGZvciBhIGxvY2FsIEB2YXJ7c3ltYm9sfSwKLWFsaWduZWQgdG8gdGhlIHBvd2VyIG9mIHR3byBzcGVjaWZpZWQgYnkgQHZhcnthbGlnbn0uICBAdmFye2xlbmd0aH0gYW5kCi1AdmFye2FsaWdufSBtdXN0IGJlIHBvc2l0aXZlIGFic29sdXRlIGV4cHJlc3Npb25zLiAgVGhpcyBkaXJlY3RpdmUKLWRpZmZlcnMgZnJvbSBAc2FtcHsubGNvbW19IG9ubHkgaW4gdGhhdCBpdCBwZXJtaXRzIHlvdSB0byBzcGVjaWZ5Ci1hbiBhbGlnbm1lbnQuICBAeHJlZntMY29tbSwsQGNvZGV7Lmxjb21tfX0uCi1AZW5kIHRhYmxlCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtleHRlbmRlZH0gZGlyZWN0aXZlLCBpOTYwCi1AaXRlbSAuZXh0ZW5kZWQgQHZhcntmbG9udW1zfQotQGNvZGV7LmV4dGVuZGVkfSBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzOyBmb3IKLWVhY2ggZmxvbnVtLCBAc2FtcHsuZXh0ZW5kZWR9IGVtaXRzIGFuIEBzY3tpZWVlfSBleHRlbmRlZC1mb3JtYXQgKDgwLWJpdCkKLWZsb2F0aW5nLXBvaW50IG51bWJlci4KLQotQGNpbmRleCBAY29kZXtsZWFmcHJvY30gZGlyZWN0aXZlLCBpOTYwCi1AaXRlbSAubGVhZnByb2MgQHZhcntjYWxsLWxhYn0sIEB2YXJ7YmFsLWxhYn0KLVlvdSBjYW4gdXNlIHRoZSBAc2FtcHsubGVhZnByb2N9IGRpcmVjdGl2ZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotb3B0aW1pemVkIEBjb2Rle2NhbGxqfSBpbnN0cnVjdGlvbiB0byBlbmFibGUgZmFzdGVyIGNhbGxzIG9mIGxlYWYKLXByb2NlZHVyZXMuICBJZiBhIHByb2NlZHVyZSBpcyBrbm93biB0byBjYWxsIG5vIG90aGVyIHByb2NlZHVyZXMsIHlvdQotbWF5IGRlZmluZSBhbiBlbnRyeSBwb2ludCB0aGF0IHNraXBzIHByb2NlZHVyZSBwcm9sb2cgY29kZSAoYW5kIHRoYXQgZG9lcwotbm90IGRlcGVuZCBvbiBzeXN0ZW0tc3VwcGxpZWQgc2F2ZWQgY29udGV4dCksIGFuZCBkZWNsYXJlIGl0IGFzIHRoZQotQHZhcntiYWwtbGFifSB1c2luZyBAc2FtcHsubGVhZnByb2N9LiAgSWYgdGhlIHByb2NlZHVyZSBhbHNvIGhhcyBhbgotZW50cnkgcG9pbnQgdGhhdCBnb2VzIHRocm91Z2ggdGhlIG5vcm1hbCBwcm9sb2csIHlvdSBjYW4gc3BlY2lmeSB0aGF0Ci1lbnRyeSBwb2ludCBhcyBAdmFye2NhbGwtbGFifS4KLQotQSBAc2FtcHsubGVhZnByb2N9IGRlY2xhcmF0aW9uIGlzIG1lYW50IGZvciB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLW9wdGltaXplZCBjYWxsIGluc3RydWN0aW9uIEBzYW1we2NhbGxqfTsgdGhlIGRpcmVjdGl2ZSByZWNvcmRzIHRoZSBkYXRhCi1uZWVkZWQgbGF0ZXIgdG8gY2hvb3NlIGJldHdlZW4gY29udmVydGluZyB0aGUgQHNhbXB7Y2FsbGp9IGludG8gYQotQGNvZGV7YmFsfSBvciBhIEBjb2Rle2NhbGx9LgotCi1AdmFye2NhbGwtbGFifSBpcyBvcHRpb25hbDsgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJlc2VudCwgb3IgaWYgdGhlCi10d28gYXJndW1lbnRzIGFyZSBpZGVudGljYWwsIHRoZSBzaW5nbGUgYXJndW1lbnQgaXMgYXNzdW1lZCB0byBiZSB0aGUKLUBjb2Rle2JhbH0gZW50cnkgcG9pbnQuCi0KLUBjaW5kZXggQGNvZGV7c3lzcHJvY30gZGlyZWN0aXZlLCBpOTYwCi1AaXRlbSAuc3lzcHJvYyBAdmFye25hbWV9LCBAdmFye2luZGV4fQotVGhlIEBzYW1wey5zeXNwcm9jfSBkaXJlY3RpdmUgZGVmaW5lcyBhIG5hbWUgZm9yIGEgc3lzdGVtIHByb2NlZHVyZS4KLUFmdGVyIHlvdSBkZWZpbmUgaXQgdXNpbmcgQHNhbXB7LnN5c3Byb2N9LCB5b3UgY2FuIHVzZSBAdmFye25hbWV9IHRvCi1yZWZlciB0byB0aGUgc3lzdGVtIHByb2NlZHVyZSBpZGVudGlmaWVkIGJ5IEB2YXJ7aW5kZXh9IHdoZW4gY2FsbGluZwotcHJvY2VkdXJlcyB3aXRoIHRoZSBvcHRpbWl6ZWQgY2FsbCBpbnN0cnVjdGlvbiBAc2FtcHtjYWxsan0uCi0KLUJvdGggYXJndW1lbnRzIGFyZSByZXF1aXJlZDsgQHZhcntpbmRleH0gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDMxCi0oaW5jbHVzaXZlKS4KLUBlbmQgdGFibGUKLQotQG5vZGUgT3Bjb2RlcyBmb3IgaTk2MAotQHNlY3Rpb24gaTk2MCBPcGNvZGVzCi0KLUBjaW5kZXggb3Bjb2RlcywgaTk2MAotQGNpbmRleCBpOTYwIG9wY29kZXMKLUFsbCBJbnRlbCA5NjAgbWFjaGluZSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZDsKLUBweHJlZntPcHRpb25zLWk5NjAsLGk5NjAgQ29tbWFuZC1saW5lIE9wdGlvbnN9IGZvciBhIGRpc2N1c3Npb24gb2YKLXNlbGVjdGluZyB0aGUgaW5zdHJ1Y3Rpb24gc3Vic2V0IGZvciBhIHBhcnRpY3VsYXIgOTYwCi1hcmNoaXRlY3R1cmUuQHJlZmlsbAotCi1Tb21lIG9wY29kZXMgYXJlIHByb2Nlc3NlZCBiZXlvbmQgc2ltcGx5IGVtaXR0aW5nIGEgc2luZ2xlIGNvcnJlc3BvbmRpbmcKLWluc3RydWN0aW9uOiBAc2FtcHtjYWxsan0sIGFuZCBDb21wYXJlLWFuZC1CcmFuY2ggb3IgQ29tcGFyZS1hbmQtSnVtcAotaW5zdHJ1Y3Rpb25zIHdpdGggdGFyZ2V0IGRpc3BsYWNlbWVudHMgbGFyZ2VyIHRoYW4gMTMgYml0cy4KLQotQG1lbnUKLSogY2FsbGotaTk2MDo6ICAgICAgICAgICAgICAgICAgQGNvZGV7Y2FsbGp9Ci0qIENvbXBhcmUtYW5kLWJyYW5jaC1pOTYwOjogICAgIENvbXBhcmUtYW5kLUJyYW5jaAotQGVuZCBtZW51Ci0KLUBub2RlIGNhbGxqLWk5NjAKLUBzdWJzZWN0aW9uIEBjb2Rle2NhbGxqfQotCi1AY2luZGV4IEBjb2Rle2NhbGxqfSwgaTk2MCBwc2V1ZG8tb3Bjb2RlCi1AY2luZGV4IGk5NjAgQGNvZGV7Y2FsbGp9IHBzZXVkby1vcGNvZGUKLVlvdSBjYW4gd3JpdGUgQGNvZGV7Y2FsbGp9IHRvIGhhdmUgdGhlIGFzc2VtYmxlciBvciB0aGUgbGlua2VyIGRldGVybWluZQotdGhlIG1vc3QgYXBwcm9wcmlhdGUgZm9ybSBvZiBzdWJyb3V0aW5lIGNhbGw6IEBzYW1we2NhbGx9LAotQHNhbXB7YmFsfSwgb3IgQHNhbXB7Y2FsbHN9LiAgSWYgdGhlIGFzc2VtYmx5IHNvdXJjZSBjb250YWlucwotZW5vdWdoIGluZm9ybWF0aW9uLS0tYSBAc2FtcHsubGVhZnByb2N9IG9yIEBzYW1wey5zeXNwcm9jfSBkaXJlY3RpdmUKLWRlZmluaW5nIHRoZSBvcGVyYW5kLS0tdGhlbiBAY29kZXtAdmFsdWV7QVN9fSB0cmFuc2xhdGVzIHRoZQotQGNvZGV7Y2FsbGp9OyBpZiBub3QsIGl0IHNpbXBseSBlbWl0cyB0aGUgQGNvZGV7Y2FsbGp9LCBsZWF2aW5nIGl0Ci1mb3IgdGhlIGxpbmtlciB0byByZXNvbHZlLgotCi1Abm9kZSBDb21wYXJlLWFuZC1icmFuY2gtaTk2MAotQHN1YnNlY3Rpb24gQ29tcGFyZS1hbmQtQnJhbmNoCi0KLUBjaW5kZXggaTk2MCBjb21wYXJlL2JyYW5jaCBpbnN0cnVjdGlvbnMKLUBjaW5kZXggY29tcGFyZS9icmFuY2ggaW5zdHJ1Y3Rpb25zLCBpOTYwCi1UaGUgOTYwIGFyY2hpdGVjdHVyZXMgcHJvdmlkZSBjb21iaW5lZCBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb25zCi10aGF0IHBlcm1pdCB5b3UgdG8gc3RvcmUgdGhlIGJyYW5jaCB0YXJnZXQgaW4gdGhlIGxvd2VyIDEzIGJpdHMgb2YgdGhlCi1pbnN0cnVjdGlvbiB3b3JkIGl0c2VsZi4gIEhvd2V2ZXIsIGlmIHlvdSBzcGVjaWZ5IGEgYnJhbmNoIHRhcmdldCBmYXIKLWVub3VnaCBhd2F5IHRoYXQgaXRzIGFkZHJlc3Mgd29uJ3QgZml0IGluIDEzIGJpdHMsIHRoZSBhc3NlbWJsZXIgY2FuCi1laXRoZXIgaXNzdWUgYW4gZXJyb3IsIG9yIGNvbnZlcnQgeW91ciBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb24KLWludG8gc2VwYXJhdGUgaW5zdHJ1Y3Rpb25zIHRvIGRvIHRoZSBjb21wYXJlIGFuZCB0aGUgYnJhbmNoLgotCi1AY2luZGV4IGNvbXBhcmUgYW5kIGp1bXAgZXhwYW5zaW9ucywgaTk2MAotQGNpbmRleCBpOTYwIGNvbXBhcmUgYW5kIGp1bXAgZXhwYW5zaW9ucwotV2hldGhlciBAY29kZXtAdmFsdWV7QVN9fSBnaXZlcyBhbiBlcnJvciBvciBleHBhbmRzIHRoZSBpbnN0cnVjdGlvbiBkZXBlbmRzCi1vbiB0d28gY2hvaWNlcyB5b3UgY2FuIG1ha2U6IHdoZXRoZXIgeW91IHVzZSB0aGUgQHNhbXB7LW5vLXJlbGF4fSBvcHRpb24sCi1hbmQgd2hldGhlciB5b3UgdXNlIGEgYGBDb21wYXJlIGFuZCBCcmFuY2gnJyBpbnN0cnVjdGlvbiBvciBhIGBgQ29tcGFyZQotYW5kIEp1bXAnJyBpbnN0cnVjdGlvbi4gIFRoZSBgYEp1bXAnJyBpbnN0cnVjdGlvbnMgYXJlIEBlbXBoe2Fsd2F5c30KLWV4cGFuZGVkIGlmIG5lY2Vzc2FyeTsgdGhlIGBgQnJhbmNoJycgaW5zdHJ1Y3Rpb25zIGFyZSBleHBhbmRlZCB3aGVuCi1uZWNlc3NhcnkgQGVtcGh7dW5sZXNzfSB5b3Ugc3BlY2lmeSBAY29kZXstbm8tcmVsYXh9LS0taW4gd2hpY2ggY2FzZQotQGNvZGV7QHZhbHVle0FTfX0gZ2l2ZXMgYW4gZXJyb3IgaW5zdGVhZC4KLQotVGhlc2UgYXJlIHRoZSBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb25zLCB0aGVpciBgYEp1bXAnJyB2YXJpYW50cywKLWFuZCB0aGUgaW5zdHJ1Y3Rpb24gcGFpcnMgdGhleSBtYXkgZXhwYW5kIGludG86Ci0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBleGFtcGxlCi0gICAgICAgIENvbXBhcmUgYW5kCi0gICAgIEJyYW5jaCAgICAgIEp1bXAgICAgICAgRXhwYW5kZWQgdG8KLSAgICAgLS0tLS0tICAgIC0tLS0tLSAgICAgICAtLS0tLS0tLS0tLS0KLSAgICAgICAgYmJjICAgICAgICAgICAgICAgICBjaGtiaXQ7IGJubwotICAgICAgICBiYnMgICAgICAgICAgICAgICAgIGNoa2JpdDsgYm8KLSAgICAgY21waWJlICAgIGNtcGlqZSAgICAgICBjbXBpOyBiZQotICAgICBjbXBpYmcgICAgY21waWpnICAgICAgIGNtcGk7IGJnCi0gICAgY21waWJnZSAgIGNtcGlqZ2UgICAgICAgY21waTsgYmdlCi0gICAgIGNtcGlibCAgICBjbXBpamwgICAgICAgY21waTsgYmwKLSAgICBjbXBpYmxlICAgY21waWpsZSAgICAgICBjbXBpOyBibGUKLSAgICBjbXBpYm5vICAgY21waWpubyAgICAgICBjbXBpOyBibm8KLSAgICBjbXBpYm5lICAgY21waWpuZSAgICAgICBjbXBpOyBibmUKLSAgICAgY21waWJvICAgIGNtcGlqbyAgICAgICBjbXBpOyBibwotICAgICBjbXBvYmUgICAgY21wb2plICAgICAgIGNtcG87IGJlCi0gICAgIGNtcG9iZyAgICBjbXBvamcgICAgICAgY21wbzsgYmcKLSAgICBjbXBvYmdlICAgY21wb2pnZSAgICAgICBjbXBvOyBiZ2UKLSAgICAgY21wb2JsICAgIGNtcG9qbCAgICAgICBjbXBvOyBibAotICAgIGNtcG9ibGUgICBjbXBvamxlICAgICAgIGNtcG87IGJsZQotICAgIGNtcG9ibmUgICBjbXBvam5lICAgICAgIGNtcG87IGJuZQotQGVuZCBleGFtcGxlCi1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUB0ZXgKLVxoc2tpcFx0YWJsZWluZGVudAotXGhhbGlnbntcaGZpbCB7XHR0ICN9XHF1YWQmXGhmaWwge1x0dCAjfVxxcXVhZCZ7XHR0ICN9XGhmaWxcY3IKLVxvbWl0e1xoZmlsXGl0IENvbXBhcmUgYW5kXGhmaWx9XHNwYW5cb21pdCZcY3IKLXtcaXQgQnJhbmNofSZ7XGl0IEp1bXB9JntcaXQgRXhwYW5kZWQgdG99XGNyCi0gICAgICAgIGJiYyYgICAgICAgICAgICAgICAgICYgY2hrYml0OyBibm9cY3IKLSAgICAgICAgYmJzJiAgICAgICAgICAgICAgICAgJiBjaGtiaXQ7IGJvXGNyCi0gICAgIGNtcGliZSYgICAgY21waWplJiAgICAgICBjbXBpOyBiZVxjcgotICAgICBjbXBpYmcmICAgIGNtcGlqZyYgICAgICAgY21waTsgYmdcY3IKLSAgICBjbXBpYmdlJiAgIGNtcGlqZ2UmICAgICAgIGNtcGk7IGJnZVxjcgotICAgICBjbXBpYmwmICAgIGNtcGlqbCYgICAgICAgY21waTsgYmxcY3IKLSAgICBjbXBpYmxlJiAgIGNtcGlqbGUmICAgICAgIGNtcGk7IGJsZVxjcgotICAgIGNtcGlibm8mICAgY21waWpubyYgICAgICAgY21waTsgYm5vXGNyCi0gICAgY21waWJuZSYgICBjbXBpam5lJiAgICAgICBjbXBpOyBibmVcY3IKLSAgICAgY21waWJvJiAgICBjbXBpam8mICAgICAgIGNtcGk7IGJvXGNyCi0gICAgIGNtcG9iZSYgICAgY21wb2plJiAgICAgICBjbXBvOyBiZVxjcgotICAgICBjbXBvYmcmICAgIGNtcG9qZyYgICAgICAgY21wbzsgYmdcY3IKLSAgICBjbXBvYmdlJiAgIGNtcG9qZ2UmICAgICAgIGNtcG87IGJnZVxjcgotICAgICBjbXBvYmwmICAgIGNtcG9qbCYgICAgICAgY21wbzsgYmxcY3IKLSAgICBjbXBvYmxlJiAgIGNtcG9qbGUmICAgICAgIGNtcG87IGJsZVxjcgotICAgIGNtcG9ibmUmICAgY21wb2puZSYgICAgICAgY21wbzsgYm5lXGNyfQotQGVuZCB0ZXgKLUBjIEVORCBURVhJMlJPRkYtS0lMTApkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW0zMnIudGV4aSBiL2dhcy9kb2MvYy1tMzJyLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MzNmYjMuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW0zMnIudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIE0zMlItRGVwZW5kZW50Ci1AY2hhcHRlciBNMzJSIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE0zMlIgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBNMzJSIHN1cHBvcnQKLUBtZW51Ci0qIE0zMlItT3B0czo6ICAgICAgICAgICAgICAgICAgIE0zMlIgT3B0aW9ucwotKiBNMzJSLVdhcm5pbmdzOjogICAgICAgICAgICAgICBNMzJSIFdhcm5pbmdzCi1AZW5kIG1lbnUKLQotQG5vZGUgTTMyUi1PcHRzCi1Ac2VjdGlvbiBNMzJSIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zLCBNMzJSCi1AY2luZGV4IE0zMlIgb3B0aW9ucwotCi1UaGUgTWl0c3ViaXNoaSBNMzJSIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gaGFzIGEgZmV3IG1hY2hpbmUKLWRlcGVuZGVudCBvcHRpb25zOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1tMzJyeAotQGNpbmRleCBAc2FtcHstbTMycnh9IG9wdGlvbiwgTTMyUlgKLUBjaW5kZXggYXJjaGl0ZWN0dXJlIG9wdGlvbnMsIE0zMlJYCi1AY2luZGV4IE0zMlIgYXJjaGl0ZWN0dXJlIG9wdGlvbnMKLUBjb2Rle0B2YWx1ZXtBU319IGNhbiBhc3NlbWJsZSBjb2RlIGZvciBzZXZlcmFsIGRpZmZlcmVudCBtZW1iZXJzIG9mIHRoZQotTWl0c3ViaXNoaSBNMzJSIGZhbWlseS4gIE5vcm1hbGx5IHRoZSBkZWZhdWx0IGlzIHRvIGFzc2VtYmxlIGNvZGUgZm9yCi10aGUgTTMyUiBtaWNyb3Byb2Nlc3Nvci4gIFRoaXMgb3B0aW9uIG1heSBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAotdG8gdGhlIE0zMlJYIG1pY3JvcHJvY2Vzc29yLCB3aGljaCBhZGRzIHNvbWUgbW9yZSBpbnN0cnVjdGlvbnMgdG8gdGhlCi1iYXNpYyBNMzJSIGluc3RydWN0aW9uIHNldCwgYW5kIHNvbWUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHNvbWUgb2YKLXRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbnMuCi0KLUBpdGVtIC1tMzJyCi1AY2luZGV4IEBzYW1wey1tMzJyfSBvcHRpb24sIE0zMlIKLUBjaW5kZXggYXJjaGl0ZWN0dXJlIG9wdGlvbnMsIE0zMlIKLUBjaW5kZXggTTMyUiBhcmNoaXRlY3R1cmUgb3B0aW9ucwotVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgYXNzZW1ibGVyJ3MgZGVmYXVsdCBiZWhhdmlvdXIgb2YKLWFzc2VtYmxpbmcgZm9yIHRoZSBNMzJSIG1pY3JvcHJvY2Vzc29yLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHRoZQotZGVmYXVsdCBoYXMgYmVlbiBjaGFuZ2VkIGJ5IGEgcHJldmlvdXMgY29tbWFuZCBsaW5lIG9wdGlvbi4KLQotQGl0ZW0gLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzCi1AY2luZGV4IEBzYW1wey13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0c30gb3B0aW9uLCBNMzJSWAotSW5zdHJ1Y3RzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcyB3aGVuCi1xdWVzdGlvbmFibGUgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIGFyZSBlbmNvdW50ZXJlZC4gIFRoaXMgb3B0aW9uIGlzCi1lbmFibGVkIGJ5IGRlZmF1bHQsIGJ1dCBAY29kZXtAdmFsdWV7R0NDfX0gZGlzYWJsZXMgaXQgd2hlbiBpdCBpbnZva2VzCi1AY29kZXtAdmFsdWV7QVN9fSBkaXJlY3RseS4gIFF1ZXN0aW9uYWJsZSBpbnN0cnVjdGlvbnMgYXJlIHRob3NlIHdob2VzCi1iZWhhdmlvdXIgd291bGQgYmUgZGlmZmVyZW50IGlmIHRoZXkgd2VyZSBleGVjdXRlZCBzZXF1ZW50aWFsbHkuICBGb3IKLWV4YW1wbGUgdGhlIGNvZGUgZnJhZ21lbnQgQHNhbXB7bXYgcjEsIHIyIHx8IG12IHIzLCByMX0gcHJvZHVjZXMgYQotZGlmZmVyZW50IHJlc3VsdCBmcm9tIEBzYW1we212IHIxLCByMiBcbiBtdiByMywgcjF9IHNpbmNlIHRoZSBmb3JtZXIKLW1vdmVzIHIxIGludG8gcjMgYW5kIHRoZW4gcjIgaW50byByMSwgd2hlcmVhcyB0aGUgbGF0ZXIgbW92ZXMgcjIgaW50byByMQotYW5kIHIzLgotCi1AaXRlbSAtV3AKLUBjaW5kZXggQHNhbXB7LVdwfSBvcHRpb24sIE0zMlJYCi1UaGlzIGlzIGEgc2hvcnRlciBzeW5vbnltIGZvciB0aGUgQGVtcGh7LXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzfQotb3B0aW9uLgotCi1AaXRlbSAtbm8td2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHMKLUBjaW5kZXggQHNhbXB7LW5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzfSBvcHRpb24sIE0zMlJYCi1JbnN0cnVjdHMgQGNvZGV7QHZhbHVle0FTfX0gbm90IHRvIHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcyB3aGVuCi1xdWVzdGlvbmFibGUgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIGFyZSBlbmNvdW50ZXJlZC4KLQotQGl0ZW0gLVducAotQGNpbmRleCBAc2FtcHstV25wfSBvcHRpb24sIE0zMlJYCi1UaGlzIGlzIGEgc2hvcnRlciBzeW5vbnltIGZvciB0aGUgQGVtcGh7LW5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzfQotb3B0aW9uLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIE0zMlItV2FybmluZ3MKLUBzZWN0aW9uIE0zMlIgV2FybmluZ3MKLQotQGNpbmRleCB3YXJuaW5ncywgTTMyUgotQGNpbmRleCBNMzJSIHdhcm5pbmdzCi0KLVRoZXJlIGFyZSBzZXZlcmFsIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHByb2R1Y2VkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fSB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhlIE0zMlI6Ci0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSBvdXRwdXQgb2YgMXN0IGluc3RydWN0aW9uIGlzIHRoZSBzYW1lIGFzIGFuIGlucHV0IHRvIDJuZCBpbnN0cnVjdGlvbiAtIGlzIHRoaXMgaW50ZW50aW9uYWwgPwotVGhpcyBtZXNzYWdlIGlzIG9ubHkgcHJvZHVjZWQgaWYgd2FybmluZ3MgZm9yIGV4cGxpY2l0IHBhcmFsbGVsCi1jb25mbGljdHMgaGF2ZSBiZWVuIGVuYWJsZWQuICBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgYXNzZW1ibGVyIGhhcwotZW5jb3VudGVyZWQgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbiBpbiB3aGljaCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgb2YKLXRoZSBsZWZ0IGhhbmQgaW5zdHJ1Y3Rpb24gaXMgdXNlZCBhcyBhbiBpbnB1dCByZWdpc3RlciBpbiB0aGUgcmlnaHQgaGFuZAotaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZSBpbiB0aGlzIGNvZGUgZnJhZ21lbnQKLUBzYW1we212IHIxLCByMiB8fCBuZWcgcjMsIHIxfSByZWdpc3RlciByMSBpcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlCi1tb3ZlIGluc3RydWN0aW9uIGFuZCB0aGUgaW5wdXQgdG8gdGhlIG5lZyBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gb3V0cHV0IG9mIDJuZCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbiBpbnB1dCB0byAxc3QgaW5zdHJ1Y3Rpb24gLSBpcyB0aGlzIGludGVudGlvbmFsID8KLVRoaXMgbWVzc2FnZSBpcyBvbmx5IHByb2R1Y2VkIGlmIHdhcm5pbmdzIGZvciBleHBsaWNpdCBwYXJhbGxlbAotY29uZmxpY3RzIGhhdmUgYmVlbiBlbmFibGVkLiAgSXQgaW5kaWNhdGVzIHRoYXQgdGhlIGFzc2VtYmxlciBoYXMKLWVuY291bnRlcmVkIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gaW4gd2hpY2ggdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIG9mCi10aGUgcmlnaHQgaGFuZCBpbnN0cnVjdGlvbiBpcyB1c2VkIGFzIGFuIGlucHV0IHJlZ2lzdGVyIGluIHRoZSBsZWZ0IGhhbmQKLWluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUgaW4gdGhpcyBjb2RlIGZyYWdtZW50Ci1Ac2FtcHttdiByMSwgcjIgfHwgbmVnIHIyLCByM30gcmVnaXN0ZXIgcjIgaXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZQotbmVnIGluc3RydWN0aW9uIGFuZCB0aGUgaW5wdXQgdG8gdGhlIG1vdmUgaW5zdHJ1Y3Rpb24uCi0KLUBpdGVtIGluc3RydWN0aW9uIEBzYW1wey4uLn0gaXMgZm9yIHRoZSBNMzJSWCBvbmx5Ci1UaGlzIG1lc3NhZ2UgaXMgcHJvZHVjZWQgd2hlbiB0aGUgYXNzZW1ibGVyIGVuY291bnRlcnMgYW4gaW5zdHJ1Y3Rpb24KLXdoaWNoIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSBNMzJSeCBwcm9jZXNzb3IsIGFuZCB0aGUgQHNhbXB7LW0zMnJ4fQotY29tbWFuZCBsaW5lIGZsYWcgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCB0byBhbGxvdyBhc3NlbWJseSBvZiBzdWNoCi1pbnN0cnVjdGlvbnMuIAotCi1AaXRlbSB1bmtub3duIGluc3RydWN0aW9uIEBzYW1wey4uLn0KLVRoaXMgbWVzc2FnZSBpcyBwcm9kdWNlZCB3aGVuIHRoZSBhc3NlbWJsZXIgZW5jb3VudGVycyBhbiBpbnN0cnVjdGlvbgotd2hpY2ggaXQgZG9lIHNub3QgcmVjb2duaXNlLgotCi1AaXRlbSBvbmx5IHRoZSBOT1AgaW5zdHJ1Y3Rpb24gY2FuIGJlIGlzc3VlZCBpbiBwYXJhbGxlbCBvbiB0aGUgbTMycgotVGhpcyBtZXNzYWdlIGlzIHByb2R1Y2VkIHdoZW4gdGhlIGFzc2VtYmxlciBlbmNvdW50ZXJzIGEgcGFyYWxsZWwKLWluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IGludm9sdmUgYSBOT1AgaW5zdHJ1Y3Rpb24gYW5kIHRoZQotQHNhbXB7LW0zMnJ4fSBjb21tYW5kIGxpbmUgZmxhZyBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLiAgT25seSB0aGUgTTMyUngKLXByb2Nlc3NvciBpcyBhYmxlIHRvIGV4ZWN1dGUgdHdvIGluc3RydWN0aW9ucyBpbiBwYXJhbGxlbC4KLQotQGl0ZW0gaW5zdHJ1Y3Rpb24gQHNhbXB7Li4ufSBjYW5ub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuCi1UaGlzIG1lc3NhZ2UgaXMgcHJvZHVjZWQgd2hlbiB0aGUgYXNzZW1ibGVyIGVuY291bnRlcnMgYSBwYXJhbGxlbAotaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbWFkZSB1cCBvZiBvbmUgb3IgdHdvIGluc3RydWN0aW9ucyB3aGljaCBjYW5ub3QgYmUKLWV4ZWN1dGVkIGluIHBhcmFsbGVsLgotCi1AaXRlbSBJbnN0cnVjdGlvbnMgc2hhcmUgdGhlIHNhbWUgZXhlY3V0aW9uIHBpcGVsaW5lCi1UaGlzIG1lc3NhZ2UgaXMgcHJvZHVjZWQgd2hlbiB0aGUgYXNzZW1ibGVyIGVuY291bnRlcnMgYSBwYXJhbGxlbAotaW5zdHJ1Y3Rpb24gd2hvZXMgY29tcG9uZW50cyBib3RoIHVzZSB0aGUgc2FtZSBleGVjdXRpb24gcGlwZWxpbmUuCi0KLUBpdGVtIEluc3RydWN0aW9ucyB3cml0ZSB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4KLVRoaXMgbWVzc2FnZSBpcyBwcm9kdWNlZCB3aGVuIHRoZSBhc3NlbWJsZXIgZW5jb3VudGVycyBhIHBhcmFsbGVsCi1pbnN0cnVjdGlvbiB3aGVyZSBib3RoIGNvbXBvbmVudHMgYXR0ZW1wdCB0byBtb2RpZnkgdGhlIHNhbWUgcmVnaXN0ZXIuCi1Gb3IgZXhhbXBsZSB0aGVzZSBjb2RlIGZyYWdtZW50cyB3aWxsIHByb2R1Y2UgdGhpcyBtZXNzYWdlOgotQHNhbXB7bXYgcjEsIHIyIHx8IG5lZyByMSwgcjN9Ci1Ac2FtcHtqbCByMCB8fCBtdiByMTQsIHIxfQotQHNhbXB7c3QgcjIsIEBALXIxIHx8IG12IHIxLCByM30gCi1Ac2FtcHttdiByMSwgcjIgfHwgbGQgcjAsIEBAcjErfSAKLUBzYW1we2NtcCByMSwgcjIgfHwgYWRkeCByMywgcjR9IChCb3RoIHdyaXRlIHRvIHRoZSBjb25kaXRpb24gYml0KQotCi1AZW5kIHRhYmxlCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtbTY4ay50ZXhpIGIvZ2FzL2RvYy9jLW02OGsudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmODU3Zi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtbTY4ay50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIE02OEstRGVwZW5kZW50Ci1AY2hhcHRlciBNNjgweDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTTY4MHgwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggTTY4MHgwIHN1cHBvcnQKLUBtZW51Ci0qIE02OEstT3B0czo6ICAgICAgICAgICAgICAgICAgIE02ODB4MCBPcHRpb25zCi0qIE02OEstU3ludGF4OjogICAgICAgICAgICAgICAgIFN5bnRheAotKiBNNjhLLU1vdG8tU3ludGF4OjogICAgICAgICAgICBNb3Rvcm9sYSBTeW50YXgKLSogTTY4Sy1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogTTY4Sy1EaXJlY3RpdmVzOjogICAgICAgICAgICAgNjgweDAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIE02OEstb3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBNNjhLLU9wdHMKLUBzZWN0aW9uIE02ODB4MCBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBvcHRpb25zCi1UaGUgTW90b3JvbGEgNjgweDAgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYSBmZXcgbWFjaGluZQotZGVwZW5kZW50IG9wdGlvbnMuCi0KLUBjaW5kZXggQHNhbXB7LWx9IG9wdGlvbiwgTTY4MHgwCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LWx9IG9wdGlvbiB0byBzaG9ydGVuIHRoZSBzaXplIG9mIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkCi1zeW1ib2xzLiAgSWYgeW91IGRvIG5vdCB1c2UgdGhlIEBzYW1wey1sfSBvcHRpb24sIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkCi1zeW1ib2xzIGFyZSB3aWRlIGVub3VnaCBmb3IgYSBmdWxsIEBjb2Rle2xvbmd9ICgzMiBiaXRzKS4gIChTaW5jZQotQGNvZGV7QHZhbHVle0FTfX0gY2Fubm90IGtub3cgd2hlcmUgdGhlc2Ugc3ltYm9scyBlbmQgdXAsIEBjb2Rle0B2YWx1ZXtBU319IGNhbgotb25seSBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpbmtlciB0byBmaWxsIGluIGxhdGVyLiAgU2luY2UgQGNvZGV7QHZhbHVle0FTfX0KLWRvZXMgbm90IGtub3cgaG93IGZhciBhd2F5IHRoZXNlIHN5bWJvbHMgYXJlLCBpdCBhbGxvY2F0ZXMgYXMgbXVjaCBzcGFjZSBhcyBpdAotY2FuLikgIElmIHlvdSB1c2UgdGhpcyBvcHRpb24sIHRoZSByZWZlcmVuY2VzIGFyZSBvbmx5IG9uZSB3b3JkIHdpZGUgKDE2IGJpdHMpLgotVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZSB0byBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZSwgYW5kCi15b3Uga25vdyB0aGF0IHRoZSByZWxldmFudCBzeW1ib2xzIGFyZSBhbHdheXMgbGVzcyB0aGFuIDE3IGJpdHMgYXdheS4KLQotQGNpbmRleCBAc2FtcHstLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbH0gb3B0aW9uLCBNNjgweDAKLUZvciBzb21lIGNvbmZpZ3VyYXRpb25zLCBlc3BlY2lhbGx5IHRob3NlIHdoZXJlIHRoZSBjb21waWxlciBub3JtYWxseQotZG9lcyBub3QgcHJlcGVuZCBhbiB1bmRlcnNjb3JlIHRvIHRoZSBuYW1lcyBvZiB1c2VyIHZhcmlhYmxlcywgdGhlCi1hc3NlbWJsZXIgcmVxdWlyZXMgYSBAc2FtcHslfSBiZWZvcmUgYW55IHVzZSBvZiBhIHJlZ2lzdGVyIG5hbWUuICBUaGlzCi1pcyBpbnRlbmRlZCB0byBsZXQgdGhlIGFzc2VtYmxlciBkaXN0aW5ndWlzaCBiZXR3ZWVuIEMgdmFyaWFibGVzIGFuZAotZnVuY3Rpb25zIG5hbWVkIEBzYW1we2EwfSB0aHJvdWdoIEBzYW1we2E3fSwgYW5kIHNvIG9uLiAgVGhlIEBzYW1weyV9IGlzCi1hbHdheXMgYWNjZXB0ZWQsIGJ1dCBpcyBub3QgcmVxdWlyZWQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMsIG5vdGFibHkKLUBzYW1we3N1bjN9LiAgVGhlIEBzYW1wey0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsfSBvcHRpb24gbWF5IGJlIHVzZWQKLXRvIHBlcm1pdCBvbWl0dGluZyB0aGUgQHNhbXB7JX0gZXZlbiBmb3IgY29uZmlndXJhdGlvbnMgZm9yIHdoaWNoIGl0IGlzCi1ub3JtYWxseSByZXF1aXJlZC4gIElmIHRoaXMgaXMgZG9uZSwgaXQgd2lsbCBnZW5lcmFsbHkgYmUgaW1wb3NzaWJsZSB0bwotcmVmZXIgdG8gQyB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWVzIGFzIHJlZ2lzdGVyCi1uYW1lcy4KLQotQGNpbmRleCBAc2FtcHstLWJpdHdpc2Utb3J9IG9wdGlvbiwgTTY4MHgwCi1Ob3JtYWxseSB0aGUgY2hhcmFjdGVyIEBzYW1we3x9IGlzIHRyZWF0ZWQgYXMgYSBjb21tZW50IGNoYXJhY3Rlciwgd2hpY2gKLW1lYW5zIHRoYXQgaXQgY2FuIG5vdCBiZSB1c2VkIGluIGV4cHJlc3Npb25zLiAgVGhlIEBzYW1wey0tYml0d2lzZS1vcn0KLW9wdGlvbiB0dXJucyBAc2FtcHt8fSBpbnRvIGEgbm9ybWFsIGNoYXJhY3Rlci4gIEluIHRoaXMgbW9kZSwgeW91IG11c3QKLWVpdGhlciB1c2UgQyBzdHlsZSBjb21tZW50cywgb3Igc3RhcnQgY29tbWVudHMgd2l0aCBhIEBzYW1weyN9IGNoYXJhY3RlcgotYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCi0KLUBjaW5kZXggQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0xNn0KLUBjaW5kZXggQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0zMn0KLUlmIHlvdSB1c2UgYW4gYWRkcmVzc2luZyBtb2RlIHdpdGggYSBiYXNlIHJlZ2lzdGVyIHdpdGhvdXQgc3BlY2lmeWluZwotdGhlIHNpemUsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgbm9ybWFsbHkgdXNlIHRoZSBmdWxsIDMyIGJpdCB2YWx1ZS4KLUZvciBleGFtcGxlLCB0aGUgYWRkcmVzc2luZyBtb2RlIEBzYW1weyVhMEBAKCVkMCl9IGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1weyVhMEBAKCVkMDpsKX0uICBZb3UgbWF5IHVzZSB0aGUgQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0xNn0KLW9wdGlvbiB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRvIGRlZmF1bHQgdG8gdXNpbmcgdGhlIDE2IGJpdCB2YWx1ZS4KLUluIHRoaXMgY2FzZSwgQHNhbXB7JWEwQEAoJWQwKX0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHslYTBAQCglZDA6dyl9LgotWW91IG1heSB1c2UgdGhlIEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMzJ9IG9wdGlvbiB0byByZXN0b3JlIHRoZQotZGVmYXVsdCBiZWhhdmlvdXIuCi0KLUBjaW5kZXggQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0xNn0KLUBjaW5kZXggQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0zMn0KLUlmIHlvdSB1c2UgYW4gYWRkcmVzc2luZyBtb2RlIHdpdGggYSBkaXNwbGFjZW1lbnQsIGFuZCB0aGUgdmFsdWUgb2YgdGhlCi1kaXNwbGFjZW1lbnQgaXMgbm90IGtub3duLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIG5vcm1hbGx5IGFzc3VtZSB0aGF0Ci10aGUgdmFsdWUgaXMgMzIgYml0cy4gIEZvciBleGFtcGxlLCBpZiB0aGUgc3ltYm9sIEBzYW1we2Rpc3B9IGhhcyBub3QKLWJlZW4gZGVmaW5lZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhc3NlbWJsZSB0aGUgYWRkcmVzc2luZyBtb2RlCi1Ac2FtcHslYTBAQChkaXNwLCVkMCl9IGFzIHRob3VnaCBAc2FtcHtkaXNwfSBpcyBhIDMyIGJpdCB2YWx1ZS4gIFlvdSBtYXkKLXVzZSB0aGUgQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0xNn0gb3B0aW9uIHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0KLXRvIGluc3RlYWQgYXNzdW1lIHRoYXQgdGhlIGRpc3BsYWNlbWVudCBpcyAxNiBiaXRzLiAgSW4gdGhpcyBjYXNlLAotQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhc3NlbWJsZSBAc2FtcHslYTBAQChkaXNwLCVkMCl9IGFzIHRob3VnaAotQHNhbXB7ZGlzcH0gaXMgYSAxNiBiaXQgdmFsdWUuICBZb3UgbWF5IHVzZSB0aGUKLUBzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMzJ9IG9wdGlvbiB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KLQotQGNpbmRleCBAc2FtcHstbTY4MDAwfSBhbmQgcmVsYXRlZCBvcHRpb25zCi1AY2luZGV4IGFyY2hpdGVjdHVyZSBvcHRpb25zLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGFyY2hpdGVjdHVyZSBvcHRpb25zCi1AY29kZXtAdmFsdWV7QVN9fSBjYW4gYXNzZW1ibGUgY29kZSBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgbWVtYmVycyBvZiB0aGUKLU1vdG9yb2xhIDY4MHgwIGZhbWlseS4gIFRoZSBkZWZhdWx0IGRlcGVuZHMgdXBvbiBob3cgQGNvZGV7QHZhbHVle0FTfX0KLXdhcyBjb25maWd1cmVkIHdoZW4gaXQgd2FzIGJ1aWx0OyBub3JtYWxseSwgdGhlIGRlZmF1bHQgaXMgdG8gYXNzZW1ibGUKLWNvZGUgZm9yIHRoZSA2ODAyMCBtaWNyb3Byb2Nlc3Nvci4gIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBtYXkgYmUgdXNlZCB0bwotY2hhbmdlIHRoZSBkZWZhdWx0LiAgVGhlc2Ugb3B0aW9ucyBjb250cm9sIHdoaWNoIGluc3RydWN0aW9ucyBhbmQKLWFkZHJlc3NpbmcgbW9kZXMgYXJlIHBlcm1pdHRlZC4gIFRoZSBtZW1iZXJzIG9mIHRoZSA2ODB4MCBmYW1pbHkgYXJlCi12ZXJ5IHNpbWlsYXIuICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpZmZlcmVuY2VzLCBzZWUgdGhlCi1Nb3Rvcm9sYSBtYW51YWxzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC1tNjgwMDAKLUBpdGVteCAtbTY4ZWMwMDAKLUBpdGVteCAtbTY4aGMwMDAKLUBpdGVteCAtbTY4aGMwMDEKLUBpdGVteCAtbTY4MDA4Ci1AaXRlbXggLW02ODMwMgotQGl0ZW14IC1tNjgzMDYKLUBpdGVteCAtbTY4MzA3Ci1AaXRlbXggLW02ODMyMgotQGl0ZW14IC1tNjgzNTYKLUFzc2VtYmxlIGZvciB0aGUgNjgwMDAuIEBzYW1wey1tNjgwMDh9LCBAc2FtcHstbTY4MzAyfSwgYW5kIHNvIG9uIGFyZSBzeW5vbnltcwotZm9yIEBzYW1wey1tNjgwMDB9LCBzaW5jZSB0aGUgY2hpcHMgYXJlIHRoZSBzYW1lIGZyb20gdGhlIHBvaW50IG9mIHZpZXcKLW9mIHRoZSBhc3NlbWJsZXIuCi0KLUBpdGVtIC1tNjgwMTAKLUFzc2VtYmxlIGZvciB0aGUgNjgwMTAuCi0KLUBpdGVtIC1tNjgwMjAKLUBpdGVteCAtbTY4ZWMwMjAKLUFzc2VtYmxlIGZvciB0aGUgNjgwMjAuICBUaGlzIGlzIG5vcm1hbGx5IHRoZSBkZWZhdWx0LgotCi1AaXRlbSAtbTY4MDMwCi1AaXRlbXggLW02OGVjMDMwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDMwLgotCi1AaXRlbSAtbTY4MDQwCi1AaXRlbXggLW02OGVjMDQwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDQwLgotCi1AaXRlbSAtbTY4MDYwCi1AaXRlbXggLW02OGVjMDYwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDYwLgotCi1AaXRlbSAtbWNwdTMyCi1AaXRlbXggLW02ODMzMAotQGl0ZW14IC1tNjgzMzEKLUBpdGVteCAtbTY4MzMyCi1AaXRlbXggLW02ODMzMwotQGl0ZW14IC1tNjgzMzQKLUBpdGVteCAtbTY4MzM2Ci1AaXRlbXggLW02ODM0MAotQGl0ZW14IC1tNjgzNDEKLUBpdGVteCAtbTY4MzQ5Ci1AaXRlbXggLW02ODM2MAotQXNzZW1ibGUgZm9yIHRoZSBDUFUzMiBmYW1pbHkgb2YgY2hpcHMuCi0KLUBpdGVtIC1tNTIwMAotQXNzZW1ibGUgZm9yIHRoZSBDb2xkRmlyZSBmYW1pbHkgb2YgY2hpcHMuCi0KLUBpdGVtIC1tNjg4ODEKLUBpdGVteCAtbTY4ODgyCi1Bc3NlbWJsZSA2ODg4MSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUKLTY4MDIwLCA2ODAzMCwgYW5kIHRoZSBDUFUzMi4gIFRoZSA2ODA0MCBhbmQgNjgwNjAgYWx3YXlzIHN1cHBvcnQKLWZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLW1uby02ODg4MQotRG8gbm90IGFzc2VtYmxlIDY4ODgxIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQKLWZvciA2ODAwMCBhbmQgdGhlIDY4MDEwLiAgVGhlIDY4MDQwIGFuZCA2ODA2MCBhbHdheXMgc3VwcG9ydCBmbG9hdGluZwotcG9pbnQgaW5zdHJ1Y3Rpb25zLCBldmVuIGlmIHRoaXMgb3B0aW9uIGlzIHVzZWQuCi0KLUBpdGVtIC1tNjg4NTEKLUFzc2VtYmxlIDY4ODUxIE1NVSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUgNjgwMjAsCi02ODAzMCwgYW5kIDY4MDYwLiAgVGhlIDY4MDQwIGFjY2VwdHMgYSBzb21ld2hhdCBkaWZmZXJlbnQgc2V0IG9mIE1NVQotaW5zdHJ1Y3Rpb25zOyBAc2FtcHstbTY4ODUxfSBhbmQgQHNhbXB7LW02ODA0MH0gc2hvdWxkIG5vdCBiZSB1c2VkCi10b2dldGhlci4KLQotQGl0ZW0gLW1uby02ODg1MQotRG8gbm90IGFzc2VtYmxlIDY4ODUxIE1NVSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUKLTY4MDAwLCA2ODAxMCwgYW5kIHRoZSBDUFUzMi4gIFRoZSA2ODA0MCBhY2NlcHRzIGEgc29tZXdoYXQgZGlmZmVyZW50IHNldAotb2YgTU1VIGluc3RydWN0aW9ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1TeW50YXgKLUBzZWN0aW9uIFN5bnRheAotCi1AY2luZGV4IEBzY3ttaXR9Ci1UaGlzIHN5bnRheCBmb3IgdGhlIE1vdG9yb2xhIDY4MHgwIHdhcyBkZXZlbG9wZWQgYXQgQHNje21pdH0uCi0KLUBjaW5kZXggTTY4MHgwIHN5bnRheAotQGNpbmRleCBzeW50YXgsIE02ODB4MAotQGNpbmRleCBNNjgweDAgc2l6ZSBtb2RpZmllcnMKLUBjaW5kZXggc2l6ZSBtb2RpZmllcnMsIE02ODB4MAotVGhlIDY4MHgwIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gdXNlcyBpbnN0cnVjdGlvbnMgbmFtZXMgYW5kCi1zeW50YXggY29tcGF0aWJsZSB3aXRoIHRoZSBTdW4gYXNzZW1ibGVyLiAgSW50ZXJ2ZW5pbmcgcGVyaW9kcyBhcmUKLWlnbm9yZWQ7IGZvciBleGFtcGxlLCBAc2FtcHttb3ZsfSBpcyBlcXVpdmFsZW50IHRvIEBzYW1we21vdi5sfS4KLQotSW4gdGhlIGZvbGxvd2luZyB0YWJsZSBAdmFye2FwY30gc3RhbmRzIGZvciBhbnkgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXJzCi0oQHNhbXB7JWEwfSB0aHJvdWdoIEBzYW1weyVhN30pLCB0aGUgcHJvZ3JhbSBjb3VudGVyIChAc2FtcHslcGN9KSwgdGhlCi16ZXJvLWFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXpwY30pLCBhIHN1cHByZXNzZWQKLWFkZHJlc3MgcmVnaXN0ZXIgKEBzYW1weyV6YTB9IHRocm91Z2ggQHNhbXB7JXphN30pLCBvciBpdCBtYXkgYmUgb21pdHRlZAotZW50aXJlbHkuICBUaGUgdXNlIG9mIEB2YXJ7c2l6ZX0gbWVhbnMgb25lIG9mIEBzYW1we3d9IG9yIEBzYW1we2x9LCBhbmQKLWl0IG1heSBiZSBvbWl0dGVkLCBhbG9uZyB3aXRoIHRoZSBsZWFkaW5nIGNvbG9uLCB1bmxlc3MgYSBzY2FsZSBpcyBhbHNvCi1zcGVjaWZpZWQuICBUaGUgdXNlIG9mIEB2YXJ7c2NhbGV9IG1lYW5zIG9uZSBvZiBAc2FtcHsxfSwgQHNhbXB7Mn0sCi1Ac2FtcHs0fSwgb3IgQHNhbXB7OH0sIGFuZCBpdCBtYXkgYWx3YXlzIGJlIG9taXR0ZWQgYWxvbmcgd2l0aCB0aGUKLWxlYWRpbmcgY29sb24uCi0KLUBjaW5kZXggTTY4MHgwIGFkZHJlc3NpbmcgbW9kZXMKLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgTTY4MHgwCi1UaGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgYXJlIHVuZGVyc3Rvb2Q6Ci1AdGFibGUgQGRmbgotQGl0ZW0gSW1tZWRpYXRlCi1Ac2FtcHsjQHZhcntudW1iZXJ9fQotCi1AaXRlbSBEYXRhIFJlZ2lzdGVyCi1Ac2FtcHslZDB9IHRocm91Z2ggQHNhbXB7JWQ3fQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyCi1Ac2FtcHslYTB9IHRocm91Z2ggQHNhbXB7JWE3fUAqCi1Ac2FtcHslYTd9IGlzIGFsc28ga25vd24gYXMgQHNhbXB7JXNwfSwgaS5lLiB0aGUgU3RhY2sgUG9pbnRlci4gIEBjb2RleyVhNn0KLWlzIGFsc28ga25vd24gYXMgQHNhbXB7JWZwfSwgdGhlIEZyYW1lIFBvaW50ZXIuCi0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgSW5kaXJlY3QKLUBzYW1weyVhMEBAfSB0aHJvdWdoIEBzYW1weyVhN0BAfQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFBvc3RpbmNyZW1lbnQKLUBzYW1weyVhMEBAK30gdGhyb3VnaCBAc2FtcHslYTdAQCt9Ci0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgUHJlZGVjcmVtZW50Ci1Ac2FtcHslYTBAQC19IHRocm91Z2ggQHNhbXB7JWE3QEAtfQotCi1AaXRlbSBJbmRpcmVjdCBQbHVzIE9mZnNldAotQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9KX0KLQotQGl0ZW0gSW5kZXgKLUBzYW1we0B2YXJ7YXBjfUBAKEB2YXJ7bnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KX0KLQotVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYmUgb21pdHRlZC4KLQotQGl0ZW0gUG9zdGluZGV4Ci1Ac2FtcHtAdmFye2FwY31AQChAdmFye251bWJlcn0pQEAoQHZhcntvbnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KX0KLQotVGhlIEB2YXJ7b251bWJlcn0gb3IgdGhlIEB2YXJ7cmVnaXN0ZXJ9LCBidXQgbm90IGJvdGgsIG1heSBiZSBvbWl0dGVkLgotCi1AaXRlbSBQcmVpbmRleAotQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9LEB2YXJ7cmVnaXN0ZXJ9OkB2YXJ7c2l6ZX06QHZhcntzY2FsZX0pQEAoQHZhcntvbnVtYmVyfSl9Ci0KLVRoZSBAdmFye251bWJlcn0gbWF5IGJlIG9taXR0ZWQuICBPbWl0dGluZyB0aGUgQHZhcntyZWdpc3Rlcn0gcHJvZHVjZXMKLXRoZSBQb3N0aW5kZXggYWRkcmVzc2luZyBtb2RlLgotCi1AaXRlbSBBYnNvbHV0ZQotQHNhbXB7QHZhcntzeW1ib2x9fSwgb3IgQHNhbXB7QHZhcntkaWdpdHN9fSwgb3B0aW9uYWxseSBmb2xsb3dlZCBieQotQHNhbXB7OmJ9LCBAc2FtcHs6d30sIG9yIEBzYW1wezpsfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1Nb3RvLVN5bnRheAotQHNlY3Rpb24gTW90b3JvbGEgU3ludGF4Ci0KLUBjaW5kZXggTW90b3JvbGEgc3ludGF4IGZvciB0aGUgNjgweDAKLUBjaW5kZXggYWx0ZXJuYXRlIHN5bnRheCBmb3IgdGhlIDY4MHgwCi0KLVRoZSBzdGFuZGFyZCBNb3Rvcm9sYSBzeW50YXggZm9yIHRoaXMgY2hpcCBkaWZmZXJzIGZyb20gdGhlIHN5bnRheAotYWxyZWFkeSBkaXNjdXNzZWQgKEBweHJlZntNNjhLLVN5bnRheCwsU3ludGF4fSkuICBAY29kZXtAdmFsdWV7QVN9fSBjYW4KLWFjY2VwdCBNb3Rvcm9sYSBzeW50YXggZm9yIG9wZXJhbmRzLCBldmVuIGlmIEBzY3ttaXR9IHN5bnRheCBpcyB1c2VkIGZvcgotb3RoZXIgb3BlcmFuZHMgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGUgdHdvIGtpbmRzIG9mIHN5bnRheCBhcmUKLWZ1bGx5IGNvbXBhdGlibGUuCi0KLUluIHRoZSBmb2xsb3dpbmcgdGFibGUgQHZhcnthcGN9IHN0YW5kcyBmb3IgYW55IG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVycwotKEBzYW1weyVhMH0gdGhyb3VnaCBAc2FtcHslYTd9KSwgdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXBjfSksIHRoZQotemVyby1hZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIgKEBzYW1weyV6cGN9KSwgb3IgYQotc3VwcHJlc3NlZCBhZGRyZXNzIHJlZ2lzdGVyIChAc2FtcHslemEwfSB0aHJvdWdoIEBzYW1weyV6YTd9KS4gIFRoZSB1c2UKLW9mIEB2YXJ7c2l6ZX0gbWVhbnMgb25lIG9mIEBzYW1we3d9IG9yIEBzYW1we2x9LCBhbmQgaXQgbWF5IGFsd2F5cyBiZQotb21pdHRlZCBhbG9uZyB3aXRoIHRoZSBsZWFkaW5nIGRvdC4gIFRoZSB1c2Ugb2YgQHZhcntzY2FsZX0gbWVhbnMgb25lIG9mCi1Ac2FtcHsxfSwgQHNhbXB7Mn0sIEBzYW1wezR9LCBvciBAc2FtcHs4fSwgYW5kIGl0IG1heSBhbHdheXMgYmUgb21pdHRlZAotYWxvbmcgd2l0aCB0aGUgbGVhZGluZyBhc3Rlcmlzay4KLQotVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFkZHJlc3NpbmcgbW9kZXMgYXJlIHVuZGVyc3Rvb2Q6Ci0KLUB0YWJsZSBAZGZuCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIEluZGlyZWN0Ci1Ac2FtcHsoJWEwKX0gdGhyb3VnaCBAc2FtcHsoJWE3KX1AKiAKLUBzYW1weyVhN30gaXMgYWxzbyBrbm93biBhcyBAc2FtcHslc3B9LCBpLmUuIHRoZSBTdGFjayBQb2ludGVyLiAgQGNvZGV7JWE2fQotaXMgYWxzbyBrbm93biBhcyBAc2FtcHslZnB9LCB0aGUgRnJhbWUgUG9pbnRlci4KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBQb3N0aW5jcmVtZW50Ci1Ac2FtcHsoJWEwKSt9IHRocm91Z2ggQHNhbXB7KCVhNykrfQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFByZWRlY3JlbWVudAotQHNhbXB7LSglYTApfSB0aHJvdWdoIEBzYW1wey0oJWE3KX0KLQotQGl0ZW0gSW5kaXJlY3QgUGx1cyBPZmZzZXQKLUBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVhMH0pfSB0aHJvdWdoIEBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVhN30pfSwKLW9yIEBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVwY30pfS4KLQotVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYWxzbyBhcHBlYXIgd2l0aGluIHRoZSBwYXJlbnRoZXNlcywgYXMgaW4KLUBzYW1weyhAdmFye251bWJlcn0sQHZhcnslYTB9KX0uICBXaGVuIHVzZWQgd2l0aCB0aGUgQHZhcntwY30sIHRoZQotQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkICh3aXRoIGFuIGFkZHJlc3MgcmVnaXN0ZXIsIG9taXR0aW5nIHRoZQotQHZhcntudW1iZXJ9IHByb2R1Y2VzIEFkZHJlc3MgUmVnaXN0ZXIgSW5kaXJlY3QgbW9kZSkuCi0KLUBpdGVtIEluZGV4Ci1Ac2FtcHtAdmFye251bWJlcn0oQHZhcnthcGN9LEB2YXJ7cmVnaXN0ZXJ9LkB2YXJ7c2l6ZX0qQHZhcntzY2FsZX0pfQotCi1UaGUgQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkLCBvciBpdCBtYXkgYXBwZWFyIHdpdGhpbiB0aGUKLXBhcmVudGhlc2VzLiAgVGhlIEB2YXJ7YXBjfSBtYXkgYmUgb21pdHRlZC4gIFRoZSBAdmFye3JlZ2lzdGVyfSBhbmQgdGhlCi1AdmFye2FwY30gbWF5IGFwcGVhciBpbiBlaXRoZXIgb3JkZXIuICBJZiBib3RoIEB2YXJ7YXBjfSBhbmQKLUB2YXJ7cmVnaXN0ZXJ9IGFyZSBhZGRyZXNzIHJlZ2lzdGVycywgYW5kIHRoZSBAdmFye3NpemV9IGFuZCBAdmFye3NjYWxlfQotYXJlIG9taXR0ZWQsIHRoZW4gdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHRha2VuIGFzIHRoZSBiYXNlIHJlZ2lzdGVyLCBhbmQKLXRoZSBzZWNvbmQgYXMgdGhlIGluZGV4IHJlZ2lzdGVyLgotCi1AaXRlbSBQb3N0aW5kZXgKLUBzYW1weyhbQHZhcntudW1iZXJ9LEB2YXJ7YXBjfV0sQHZhcntyZWdpc3Rlcn0uQHZhcntzaXplfSpAdmFye3NjYWxlfSxAdmFye29udW1iZXJ9KX0KLQotVGhlIEB2YXJ7b251bWJlcn0sIG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgb3IgYm90aCwgbWF5IGJlIG9taXR0ZWQuCi1FaXRoZXIgdGhlIEB2YXJ7bnVtYmVyfSBvciB0aGUgQHZhcnthcGN9IG1heSBiZSBvbWl0dGVkLCBidXQgbm90IGJvdGguCi0KLUBpdGVtIFByZWluZGV4Ci1Ac2FtcHsoW0B2YXJ7bnVtYmVyfSxAdmFye2FwY30sQHZhcntyZWdpc3Rlcn0uQHZhcntzaXplfSpAdmFye3NjYWxlfV0sQHZhcntvbnVtYmVyfSl9Ci0KLVRoZSBAdmFye251bWJlcn0sIG9yIHRoZSBAdmFye2FwY30sIG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgb3IgYW55IHR3byBvZgotdGhlbSwgbWF5IGJlIG9taXR0ZWQuICBUaGUgQHZhcntvbnVtYmVyfSBtYXkgYmUgb21pdHRlZC4gIFRoZQotQHZhcntyZWdpc3Rlcn0gYW5kIHRoZSBAdmFye2FwY30gbWF5IGFwcGVhciBpbiBlaXRoZXIgb3JkZXIuICBJZiBib3RoCi1AdmFye2FwY30gYW5kIEB2YXJ7cmVnaXN0ZXJ9IGFyZSBhZGRyZXNzIHJlZ2lzdGVycywgYW5kIHRoZSBAdmFye3NpemV9Ci1hbmQgQHZhcntzY2FsZX0gYXJlIG9taXR0ZWQsIHRoZW4gdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHRha2VuIGFzIHRoZQotYmFzZSByZWdpc3RlciwgYW5kIHRoZSBzZWNvbmQgYXMgdGhlIGluZGV4IHJlZ2lzdGVyLgotQGVuZCB0YWJsZQotCi1Abm9kZSBNNjhLLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGZsb2F0aW5nIHBvaW50Ci1QYWNrZWQgZGVjaW1hbCAoUCkgZm9ybWF0IGZsb2F0aW5nIGxpdGVyYWxzIGFyZSBub3Qgc3VwcG9ydGVkLgotRmVlbCBmcmVlIHRvIGFkZCB0aGUgY29kZSEKLQotVGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgZ2VuZXJhdGVkIGJ5IGRpcmVjdGl2ZXMgYXJlIHRoZXNlLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZmxvYXQKLUBjb2Rle1NpbmdsZX0gcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZG91YmxlCi1AY29kZXtEb3VibGV9IHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7ZXh0ZW5kfSBkaXJlY3RpdmUgTTY4MHgwCi1AY2luZGV4IEBjb2Rle2xkb3VibGV9IGRpcmVjdGl2ZSBNNjgweDAKLUBpdGVtIC5leHRlbmQKLUBpdGVteCAubGRvdWJsZQotQGNvZGV7RXh0ZW5kZWR9IHByZWNpc2lvbiAoQGNvZGV7bG9uZyBkb3VibGV9KSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstRGlyZWN0aXZlcwotQHNlY3Rpb24gNjgweDAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggTTY4MHgwIGRpcmVjdGl2ZXMKLUBjaW5kZXggZGlyZWN0aXZlcywgTTY4MHgwCi1JbiBvcmRlciB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIFN1biBhc3NlbWJsZXIgdGhlIDY4MHgwIGFzc2VtYmxlcgotdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7ZGF0YTF9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZGF0YTEKLVRoaXMgZGlyZWN0aXZlIGlzIGlkZW50aWNhbCB0byBhIEBjb2Rley5kYXRhIDF9IGRpcmVjdGl2ZS4KLQotQGNpbmRleCBAY29kZXtkYXRhMn0gZGlyZWN0aXZlLCBNNjgweDAKLUBpdGVtIC5kYXRhMgotVGhpcyBkaXJlY3RpdmUgaXMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7LmRhdGEgMn0gZGlyZWN0aXZlLgotCi1AY2luZGV4IEBjb2Rle2V2ZW59IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZXZlbgotVGhpcyBkaXJlY3RpdmUgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIEBjb2Rley5hbGlnbn0gZGlyZWN0aXZlOyBpdAotYWxpZ25zIHRoZSBvdXRwdXQgdG8gYW4gZXZlbiBieXRlIGJvdW5kYXJ5LgotCi1AY2luZGV4IEBjb2Rle3NraXB9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuc2tpcAotVGhpcyBkaXJlY3RpdmUgaXMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuCi1AZW5kIHRhYmxlCi0KLUBuZWVkIDIwMDAKLUBub2RlIE02OEstb3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IE02ODB4MCBvcGNvZGVzCi1AY2luZGV4IG9wY29kZXMsIE02ODB4MAotQGNpbmRleCBpbnN0cnVjdGlvbiBzZXQsIE02ODB4MAotQGMgZG9jQGN5Z251cy5jb206IEkgZG9uJ3Qgc2VlIGFueSBwb2ludCBpbiB0aGUgZm9sbG93aW5nCi1AYyAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguICBCdWdzIGFyZSBidWdzOyBob3cgZG9lcyBzYXlpbmcgdGhpcwotQGMgICAgICAgICAgICAgICAgICAgaGVscCBhbnlvbmU/Ci1AaWdub3JlCi1EYW5nZXI6ICBTZXZlcmFsIGJ1Z3MgaGF2ZSBiZWVuIGZvdW5kIGluIHRoZSBvcGNvZGUgdGFibGUgKGFuZAotZml4ZWQpLiAgTW9yZSBidWdzIG1heSBleGlzdC4gIEJlIGNhcmVmdWwgd2hlbiB1c2luZyBvYnNjdXJlCi1pbnN0cnVjdGlvbnMuCi1AZW5kIGlnbm9yZQotCi1AbWVudQotKiBNNjhLLUJyYW5jaDo6ICAgICAgICAgICAgICAgICBCcmFuY2ggSW1wcm92ZW1lbnQKLSogTTY4Sy1DaGFyczo6ICAgICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi1AZW5kIG1lbnUKLQotQG5vZGUgTTY4Sy1CcmFuY2gKLUBzdWJzZWN0aW9uIEJyYW5jaCBJbXByb3ZlbWVudAotCi1AY2luZGV4IHBzZXVkby1vcGNvZGVzLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIHBzZXVkby1vcGNvZGVzCi1AY2luZGV4IGJyYW5jaCBpbXByb3ZlbWVudCwgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBicmFuY2ggaW1wcm92ZW1lbnQKLUNlcnRhaW4gcHNldWRvIG9wY29kZXMgYXJlIHBlcm1pdHRlZCBmb3IgYnJhbmNoIGluc3RydWN0aW9ucy4KLVRoZXkgZXhwYW5kIHRvIHRoZSBzaG9ydGVzdCBicmFuY2ggaW5zdHJ1Y3Rpb24gdGhhdCByZWFjaCB0aGUKLXRhcmdldC4gIEdlbmVyYWxseSB0aGVzZSBtbmVtb25pY3MgYXJlIG1hZGUgYnkgc3Vic3RpdHV0aW5nIEBzYW1we2p9IGZvcgotQHNhbXB7Yn0gYXQgdGhlIHN0YXJ0IG9mIGEgTW90b3JvbGEgbW5lbW9uaWMuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgcHNldWRvLW9wZXJhdGlvbnMuICBBIEBjb2Rleyp9IGZsYWdzCi1jYXNlcyB0aGF0IGFyZSBtb3JlIGZ1bGx5IGRlc2NyaWJlZCBhZnRlciB0aGUgdGFibGU6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICBEaXNwbGFjZW1lbnQKLSAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgIHwgICAgICAgICAgICAgICAgNjgwMjAgICA2ODAwMC8xMAotUHNldWRvLU9wIHxCWVRFICAgIFdPUkQgICAgTE9ORyAgICBMT05HICAgICAgbm9uLVBDIHJlbGF0aXZlCi0gICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgamJzciB8YnNycyAgICBic3IgICAgIGJzcmwgICAganNyICAgICAgIGpzcgotICAgICAganJhIHxicmFzICAgIGJyYSAgICAgYnJhbCAgICBqbXAgICAgICAgam1wCi0qICAgICBqWFggfGJYWHMgICAgYlhYICAgICBiWFhsICAgIGJOWHM7am1wbCBiTlhzO2ptcAotKiAgICBkYlhYIHxkYlhYICAgIGRiWFggICAgICAgIGRiWFg7IGJyYTsgam1wbAotKiAgICBmalhYIHxmYlhYdyAgIGZiWFh3ICAgZmJYWGwgICAgICAgICAgICAgZmJOWHc7am1wCi0KLVhYOiBjb25kaXRpb24KLU5YOiBuZWdhdGl2ZSBvZiBjb25kaXRpb24gWFgKLQotQGVuZCBzbWFsbGV4YW1wbGUKLUBjZW50ZXIgQGNvZGV7Kn0tLS1zZWUgZnVsbCBkZXNjcmlwdGlvbiBiZWxvdwotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGpic3IKLUBpdGVteCBqcmEKLVRoZXNlIGFyZSB0aGUgc2ltcGxlc3QganVtcCBwc2V1ZG8tb3BlcmF0aW9uczsgdGhleSBhbHdheXMgbWFwIHRvIG9uZQotcGFydGljdWxhciBtYWNoaW5lIGluc3RydWN0aW9uLCBkZXBlbmRpbmcgb24gdGhlIGRpc3BsYWNlbWVudCB0byB0aGUKLWJyYW5jaCB0YXJnZXQuCi0KLUBpdGVtIGpAdmFye1hYfQotSGVyZSwgQHNhbXB7akB2YXJ7WFh9fSBzdGFuZHMgZm9yIGFuIGVudGlyZSBmYW1pbHkgb2YgcHNldWRvLW9wZXJhdGlvbnMsCi13aGVyZSBAdmFye1hYfSBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCBvciBjb25kaXRpb24tY29kZSB0ZXN0LiAgVGhlIGZ1bGwKLWxpc3Qgb2YgcHNldWRvLW9wcyBpbiB0aGlzIGZhbWlseSBpczoKLUBzbWFsbGV4YW1wbGUKLSBqaGkgICBqbHMgICBqY2MgICBqY3MgICBqbmUgICBqZXEgICBqdmMKLSBqdnMgICBqcGwgICBqbWkgICBqZ2UgICBqbHQgICBqZ3QgICBqbGUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUZvciB0aGUgY2FzZXMgb2Ygbm9uLVBDIHJlbGF0aXZlIGRpc3BsYWNlbWVudHMgYW5kIGxvbmcgZGlzcGxhY2VtZW50cyBvbgotdGhlIDY4MDAwIG9yIDY4MDEwLCBAY29kZXtAdmFsdWV7QVN9fSBpc3N1ZXMgYSBsb25nZXIgY29kZSBmcmFnbWVudCBpbiB0ZXJtcyBvZgotQHZhcntOWH0sIHRoZSBvcHBvc2l0ZSBjb25kaXRpb24gdG8gQHZhcntYWH0uICBGb3IgZXhhbXBsZSwgZm9yIHRoZQotbm9uLVBDIHJlbGF0aXZlIGNhc2U6Ci1Ac21hbGxleGFtcGxlCi0gICAgakB2YXJ7WFh9IGZvbwotQGVuZCBzbWFsbGV4YW1wbGUKLWdpdmVzCi1Ac21hbGxleGFtcGxlCi0gICAgIGJAdmFye05YfXMgb29mCi0gICAgIGptcCBmb28KLSBvb2Y6Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBkYkB2YXJ7WFh9Ci1UaGUgZnVsbCBmYW1pbHkgb2YgcHNldWRvLW9wZXJhdGlvbnMgY292ZXJlZCBoZXJlIGlzCi1Ac21hbGxleGFtcGxlCi0gZGJoaSAgIGRibHMgICBkYmNjICAgZGJjcyAgIGRibmUgICBkYmVxICAgZGJ2YwotIGRidnMgICBkYnBsICAgZGJtaSAgIGRiZ2UgICBkYmx0ICAgZGJndCAgIGRibGUKLSBkYmYgICAgZGJyYSAgIGRidAotQGVuZCBzbWFsbGV4YW1wbGUKLQotT3RoZXIgdGhhbiBmb3Igd29yZCBhbmQgYnl0ZSBkaXNwbGFjZW1lbnRzLCB3aGVuIHRoZSBzb3VyY2UgcmVhZHMKLUBzYW1we2RiQHZhcntYWH0gZm9vfSwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMKLUBzbWFsbGV4YW1wbGUKLSAgICAgZGJAdmFye1hYfSBvbzEKLSAgICAgYnJhIG9vMgotIG9vMTpqbXBsIGZvbwotIG9vMjoKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIGZqQHZhcntYWH0KLVRoaXMgZmFtaWx5IGluY2x1ZGVzCi1Ac21hbGxleGFtcGxlCi0gZmpuZSAgIGZqZXEgICBmamdlICAgZmpsdCAgIGZqZ3QgICBmamxlICAgZmpmCi0gZmp0ICAgIGZqZ2wgICBmamdsZSAgZmpuZ2UgIGZqbmdsICBmam5nbGUgZmpuZ3QKLSBmam5sZSAgZmpubHQgIGZqb2dlICBmam9nbCAgZmpvZ3QgIGZqb2xlICBmam9sdAotIGZqb3IgICBmanNlcSAgZmpzZiAgIGZqc25lICBmanN0ICAgZmp1ZXEgIGZqdWdlCi0gZmp1Z3QgIGZqdWxlICBmanVsdCAgZmp1bgotQGVuZCBzbWFsbGV4YW1wbGUKLQotRm9yIGJyYW5jaCB0YXJnZXRzIHRoYXQgYXJlIG5vdCBQQyByZWxhdGl2ZSwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMKLUBzbWFsbGV4YW1wbGUKLSAgICAgZmJAdmFye05YfSBvb2YKLSAgICAgam1wIGZvbwotIG9vZjoKLUBlbmQgc21hbGxleGFtcGxlCi13aGVuIGl0IGVuY291bnRlcnMgQHNhbXB7ZmpAdmFye1hYfSBmb299LgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IHNwZWNpYWwgY2hhcmFjdGVycywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBpbW1lZGlhdGUgY2hhcmFjdGVyCi1AY2luZGV4IGltbWVkaWF0ZSBjaGFyYWN0ZXIsIE02ODB4MAotQGNpbmRleCBNNjgweDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBNNjgweDAKLUBjaW5kZXggY29tbWVudHMsIE02ODB4MAotVGhlIGltbWVkaWF0ZSBjaGFyYWN0ZXIgaXMgQHNhbXB7I30gZm9yIFN1biBjb21wYXRpYmlsaXR5LiAgVGhlCi1saW5lLWNvbW1lbnQgY2hhcmFjdGVyIGlzIEBzYW1we3x9ICh1bmxlc3MgdGhlIEBzYW1wey0tYml0d2lzZS1vcn0KLW9wdGlvbiBpcyB1c2VkKS4gIElmIGEgQHNhbXB7I30gYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSwgaXQKLWlzIHRyZWF0ZWQgYXMgYSBjb21tZW50IHVubGVzcyBpdCBsb29rcyBsaWtlIEBzYW1weyMgbGluZSBmaWxlfSwgaW4KLXdoaWNoIGNhc2UgaXQgaXMgdHJlYXRlZCBub3JtYWxseS4KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW1pcHMudGV4aSBiL2dhcy9kb2MvYy1taXBzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTQwZGUuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW1pcHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIE1JUFMtRGVwZW5kZW50Ci1AY2hhcHRlciBNSVBTIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE1JUFMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBNSVBTIHByb2Nlc3NvcgotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0gZm9yIEBzY3ttaXBzfSBhcmNoaXRlY3R1cmVzIHN1cHBvcnRzIHNldmVyYWwKLWRpZmZlcmVudCBAc2N7bWlwc30gcHJvY2Vzc29ycywgYW5kIE1JUFMgSVNBIGxldmVscyBJIHRocm91Z2ggSVYuICBGb3IKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBAc2N7bWlwc30gaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7TUlQUyBSSVNDCi1BcmNoaXRlY3R1cmV9LCBieSBLYW5lIGFuZCBIZWluZHJpY2ggKFByZW50aWNlLUhhbGwpLiAgRm9yIGFuIG92ZXJ2aWV3Ci1vZiBAc2N7bWlwc30gYXNzZW1ibHkgY29udmVudGlvbnMsIHNlZSBgYEFwcGVuZGl4IEQ6IEFzc2VtYmx5IExhbmd1YWdlCi1Qcm9ncmFtbWluZycnIGluIHRoZSBzYW1lIHdvcmsuCi0KLUBtZW51Ci0qIE1JUFMgT3B0czo6ICAgCUFzc2VtYmxlciBvcHRpb25zCi0qIE1JUFMgT2JqZWN0OjogCUVDT0ZGIG9iamVjdCBjb2RlCi0qIE1JUFMgU3RhYnM6OiAgCURpcmVjdGl2ZXMgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotKiBNSVBTIElTQTo6ICAgIAlEaXJlY3RpdmVzIHRvIG92ZXJyaWRlIHRoZSBJU0EgbGV2ZWwKLSogTUlQUyBhdXRvZXh0ZW5kOjoJRGlyZWN0aXZlcyBmb3IgZXh0ZW5kaW5nIE1JUFMgMTYgYml0IGluc3RydWN0aW9ucwotKiBNSVBTIGluc246OgkJRGlyZWN0aXZlIHRvIG1hcmsgZGF0YSBhcyBhbiBpbnN0cnVjdGlvbgotKiBNSVBTIG9wdGlvbiBzdGFjazo6CURpcmVjdGl2ZXMgdG8gc2F2ZSBhbmQgcmVzdG9yZSBvcHRpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgTUlQUyBPcHRzCi1Ac2VjdGlvbiBBc3NlbWJsZXIgb3B0aW9ucwotCi1UaGUgQHNje21pcHN9IGNvbmZpZ3VyYXRpb25zIG9mIEBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgdGhlc2UKLXNwZWNpYWwgb3B0aW9uczoKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1HfSBvcHRpb24gKE1JUFMpCi1AaXRlbSAtRyBAdmFye251bX0KLVRoaXMgb3B0aW9uIHNldHMgdGhlIGxhcmdlc3Qgc2l6ZSBvZiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZAotaW1wbGljaXRseSB3aXRoIHRoZSBAY29kZXtncH0gcmVnaXN0ZXIuICBJdCBpcyBvbmx5IGFjY2VwdGVkIGZvciB0YXJnZXRzCi10aGF0IHVzZSBAc2N7ZWNvZmZ9IGZvcm1hdC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguCi0KLUBjaW5kZXggQGNvZGV7LUVCfSBvcHRpb24gKE1JUFMpCi1AY2luZGV4IEBjb2Rley1FTH0gb3B0aW9uIChNSVBTKQotQGNpbmRleCBNSVBTIGJpZy1lbmRpYW4gb3V0cHV0Ci1AY2luZGV4IE1JUFMgbGl0dGxlLWVuZGlhbiBvdXRwdXQKLUBjaW5kZXggYmlnLWVuZGlhbiBvdXRwdXQsIE1JUFMKLUBjaW5kZXggbGl0dGxlLWVuZGlhbiBvdXRwdXQsIE1JUFMKLUBpdGVtIC1FQgotQGl0ZW14IC1FTAotQW55IEBzY3ttaXBzfSBjb25maWd1cmF0aW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBzZWxlY3QgYmlnLWVuZGlhbiBvcgotbGl0dGxlLWVuZGlhbiBvdXRwdXQgYXQgcnVuIHRpbWUgKHVubGlrZSB0aGUgb3RoZXIgQHNje2dudX0gZGV2ZWxvcG1lbnQKLXRvb2xzLCB3aGljaCBtdXN0IGJlIGNvbmZpZ3VyZWQgZm9yIG9uZSBvciB0aGUgb3RoZXIpLiAgVXNlIEBzYW1wey1FQn0KLXRvIHNlbGVjdCBiaWctZW5kaWFuIG91dHB1dCwgYW5kIEBzYW1wey1FTH0gZm9yIGxpdHRsZS1lbmRpYW4uCi0KLUBjaW5kZXggTUlQUyBhcmNoaXRlY3R1cmUgb3B0aW9ucwotQGl0ZW0gLW1pcHMxCi1AaXRlbXggLW1pcHMyCi1AaXRlbXggLW1pcHMzCi1AaXRlbXggLW1pcHM0Ci1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsLgotQHNhbXB7LW1pcHMxfSBjb3JyZXNwb25kcyB0byB0aGUgQHNje3IyMDAwfSBhbmQgQHNje3IzMDAwfSBwcm9jZXNzb3JzLAotQHNhbXB7LW1pcHMyfSB0byB0aGUgQHNje3I2MDAwfSBwcm9jZXNzb3IsIEBzYW1wey1taXBzM30gdG8gdGhlCi1Ac2N7cjQwMDB9IHByb2Nlc3NvciwgYW5kIEBzYW1wey1taXBzNH0gdG8gdGhlIEBzY3tyODAwMH0gYW5kCi1Ac2N7cjEwMDAwfSBwcm9jZXNzb3JzLiAgWW91IGNhbiBhbHNvIHN3aXRjaCBpbnN0cnVjdGlvbiBzZXRzIGR1cmluZyB0aGUKLWFzc2VtYmx5OyBzZWUgQHJlZntNSVBTIElTQSwsIERpcmVjdGl2ZXMgdG8gb3ZlcnJpZGUgdGhlIElTQSBsZXZlbH0uCi0KLUBpdGVtIC1tZ3AzMgotQXNzdW1lIHRoYXQgMzItYml0IGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZS4gIFRoaXMKLWFmZmVjdHMgc3ludGhldGljIGluc3RydWN0aW9ucyBzdWNoIGFzIEBjb2Rle21vdmV9LCB3aGljaCB3aWxsIGFzc2VtYmxlCi10byBhIDMyLWJpdCBvciBhIDY0LWJpdCBpbnN0cnVjdGlvbiBkZXBlbmRpbmcgb24gdGhpcyBmbGFnLiAgT24gc29tZQotTUlQUyB2YXJpYW50cyB0aGVyZSBpcyBhIDMyLWJpdCBtb2RlIGZsYWc7IHdoZW4gdGhpcyBmbGFnIGlzIHNldCwKLTY0LWJpdCBpbnN0cnVjdGlvbnMgZ2VuZXJhdGUgYSB0cmFwLiAgQWxzbywgc29tZSAzMi1iaXQgT1NlcyBvbmx5IHNhdmUKLXRoZSAzMi1iaXQgcmVnaXN0ZXJzIG9uIGEgY29udGV4dCBzd2l0Y2gsIHNvIGl0IGlzIGVzc2VudGlhbCBuZXZlciB0bwotdXNlIHRoZSA2NC1iaXQgcmVnaXN0ZXJzLgotCi1AaXRlbSAtbWdwNjQKLUFzc3VtZSB0aGF0IDY0LWJpdCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIGFyZSBhdmFpbGFibGUuICBUaGlzIGlzCi1wcm92aWRlZCBpbiB0aGUgaW50ZXJlc3RzIG9mIHN5bW1ldHJ5IHdpdGggLWdwMzIuCi0KLUBpdGVtIC1taXBzMTYKLUBpdGVteCAtbm8tbWlwczE2Ci1HZW5lcmF0ZSBjb2RlIGZvciB0aGUgTUlQUyAxNiBwcm9jZXNzb3IuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gcHV0dGluZwotQHNhbXB7LnNldCBtaXBzMTZ9IGF0IHRoZSBzdGFydCBvZiB0aGUgYXNzZW1ibHkgZmlsZS4gIEBzYW1wey1uby1taXBzMTZ9Ci10dXJucyBvZmYgdGhpcyBvcHRpb24uCi0KLUBpdGVtIC1tZml4NzAwMAotQGl0ZW14IC1uby1tZml4NzAwMAotQ2F1c2Ugbm9wcyB0byBiZSBpbnNlcnRlZCBpZiB0aGUgcmVhZCBvZiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIKLW9mIGFuIG1maGkgb3IgbWZsbyBpbnN0cnVjdGlvbiBvY2N1cnMgaW4gdGhlIGZvbGxvd2luZyB0d28gaW5zdHJ1Y3Rpb25zLgotCi1AaXRlbSAtbTQwMTAKLUBpdGVteCAtbm8tbTQwMTAKLUdlbmVyYXRlIGNvZGUgZm9yIHRoZSBMU0kgQHNje3I0MDEwfSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvCi1hY2NlcHQgdGhlIEBzY3tyNDAxMH0gc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIChAc2FtcHthZGRjaXV9LCBAc2FtcHtmZmN9LAotZXRjLiksIGFuZCB0byBub3Qgc2NoZWR1bGUgQHNhbXB7bm9wfSBpbnN0cnVjdGlvbnMgYXJvdW5kIGFjY2Vzc2VzIHRvCi10aGUgQHNhbXB7SEl9IGFuZCBAc2FtcHtMT30gcmVnaXN0ZXJzLiAgQHNhbXB7LW5vLW00MDEwfSB0dXJucyBvZmYgdGhpcwotb3B0aW9uLgotCi1AaXRlbSAtbTQ2NTAKLUBpdGVteCAtbm8tbTQ2NTAKLUdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTIEBzY3tyNDY1MH0gY2hpcC4gIFRoaXMgdGVsbHMgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQKLXRoZSBAc2FtcHttYWR9IGFuZCBAc2FtcHttYWR1fSBpbnN0cnVjdGlvbiwgYW5kIHRvIG5vdCBzY2hlZHVsZSBAc2FtcHtub3B9Ci1pbnN0cnVjdGlvbnMgYXJvdW5kIGFjY2Vzc2VzIHRvIHRoZSBAc2FtcHtISX0gYW5kIEBzYW1we0xPfSByZWdpc3RlcnMuCi1Ac2FtcHstbm8tbTQ2NTB9IHR1cm5zIG9mZiB0aGlzIG9wdGlvbi4KLQotQGl0ZW14IC1tMzkwMAotQGl0ZW14IC1uby1tMzkwMAotQGl0ZW14IC1tNDEwMAotQGl0ZW14IC1uby1tNDEwMAotRm9yIGVhY2ggb3B0aW9uIEBzYW1wey1tQHZhcntubm5ufX0sIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTCi1Ac2N7ckB2YXJ7bm5ubn19IGNoaXAuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IGluc3RydWN0aW9ucwotc3BlY2lmaWMgdG8gdGhhdCBjaGlwLCBhbmQgdG8gc2NoZWR1bGUgZm9yIHRoYXQgY2hpcCdzIGhhemFyZHMuCi0KLUBpdGVtIC1tY3B1PUB2YXJ7Y3B1fQotR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIE1JUFMgY3B1LiAgSXQgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvCi1Ac2FtcHstbUB2YXJ7Y3B1fX0sIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBtb3JlIHZhbHVlIG9mIEB2YXJ7Y3B1fQotdW5kZXJzdG9vZC4gIFZhbGlkIEB2YXJ7Y3B1fSB2YWx1ZSBhcmU6Ci0KLUBxdW90YXRpb24KLTIwMDAsCi0zMDAwLAotMzkwMCwKLTQwMDAsCi00MDEwLAotNDEwMCwKLTQxMTEsCi00MzAwLAotNDQwMCwKLTQ2MDAsCi00NjUwLAotNTAwMCwKLTYwMDAsCi04MDAwLAotMTAwMDAKLUBlbmQgcXVvdGF0aW9uCi0KLQotQGNpbmRleCBAY29kZXstbm9jcHB9IGlnbm9yZWQgKE1JUFMpCi1AaXRlbSAtbm9jcHAKLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuICBJdCBpcyBhY2NlcHRlZCBmb3IgY29tbWFuZC1saW5lIGNvbXBhdGliaWxpdHkgd2l0aAotb3RoZXIgYXNzZW1ibGVycywgd2hpY2ggdXNlIGl0IHRvIHR1cm4gb2ZmIEMgc3R5bGUgcHJlcHJvY2Vzc2luZy4gIFdpdGgKLUBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319LCB0aGVyZSBpcyBubyBuZWVkIGZvciBAc2FtcHstbm9jcHB9LCBiZWNhdXNlIHRoZQotQHNje2dudX0gYXNzZW1ibGVyIGl0c2VsZiBuZXZlciBydW5zIHRoZSBDIHByZXByb2Nlc3Nvci4KLQotQGl0ZW0gLS10cmFwCi1AaXRlbXggLS1uby1icmVhawotQGMgRklYTUUhICAoMSkgcmVmbGVjdCB0aGVzZSBvcHRpb25zIChuZXh0IGl0ZW0gdG9vKSBpbiBvcHRpb24gc3VtbWFyaWVzOwotQGMgICAgICAgICAoMikgc3RvcCB0ZWFzaW5nLCBzYXkgX3doaWNoXyBpbnN0cnVjdGlvbnMgZXhwYW5kZWQgX2hvd18uCi1AY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5IG1hY3JvIGV4cGFuZHMgY2VydGFpbiBkaXZpc2lvbiBhbmQKLW11bHRpcGxpY2F0aW9uIGluc3RydWN0aW9ucyB0byBjaGVjayBmb3Igb3ZlcmZsb3cgYW5kIGRpdmlzaW9uIGJ5IHplcm8uICBUaGlzCi1vcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGdlbmVyYXRlIGNvZGUgdG8gdGFrZSBhIHRyYXAgZXhjZXB0aW9uCi1yYXRoZXIgdGhhbiBhIGJyZWFrIGV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIGlzIGRldGVjdGVkLiAgVGhlIHRyYXAgaW5zdHJ1Y3Rpb25zCi1hcmUgb25seSBzdXBwb3J0ZWQgYXQgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbCAyIGFuZCBoaWdoZXIuCi0KLUBpdGVtIC0tYnJlYWsKLUBpdGVteCAtLW5vLXRyYXAKLUdlbmVyYXRlIGNvZGUgdG8gdGFrZSBhIGJyZWFrIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiBhIHRyYXAgZXhjZXB0aW9uIHdoZW4gYW4KLWVycm9yIGlzIGRldGVjdGVkLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgTUlQUyBPYmplY3QKLUBzZWN0aW9uIE1JUFMgRUNPRkYgb2JqZWN0IGNvZGUKLQotQGNpbmRleCBFQ09GRiBzZWN0aW9ucwotQGNpbmRleCBNSVBTIEVDT0ZGIHNlY3Rpb25zCi1Bc3NlbWJsaW5nIGZvciBhIEBzY3ttaXBzfSBAc2N7ZWNvZmZ9IHRhcmdldCBzdXBwb3J0cyBzb21lIGFkZGl0aW9uYWwgc2VjdGlvbnMKLWJlc2lkZXMgdGhlIHVzdWFsIEBjb2Rley50ZXh0fSwgQGNvZGV7LmRhdGF9IGFuZCBAY29kZXsuYnNzfS4gIFRoZQotYWRkaXRpb25hbCBzZWN0aW9ucyBhcmUgQGNvZGV7LnJkYXRhfSwgdXNlZCBmb3IgcmVhZC1vbmx5IGRhdGEsCi1AY29kZXsuc2RhdGF9LCB1c2VkIGZvciBzbWFsbCBkYXRhLCBhbmQgQGNvZGV7LnNic3N9LCB1c2VkIGZvciBzbWFsbAotY29tbW9uIG9iamVjdHMuCi0KLUBjaW5kZXggc21hbGwgb2JqZWN0cywgTUlQUyBFQ09GRgotQGNpbmRleCBAY29kZXtncH0gcmVnaXN0ZXIsIE1JUFMKLVdoZW4gYXNzZW1ibGluZyBmb3IgQHNje2Vjb2ZmfSwgdGhlIGFzc2VtYmxlciB1c2VzIHRoZSBAY29kZXskZ3B9IChAY29kZXskMjh9KQotcmVnaXN0ZXIgdG8gZm9ybSB0aGUgYWRkcmVzcyBvZiBhIGBgc21hbGwgb2JqZWN0JycuICBBbnkgb2JqZWN0IGluIHRoZQotQGNvZGV7LnNkYXRhfSBvciBAY29kZXsuc2Jzc30gc2VjdGlvbnMgaXMgY29uc2lkZXJlZCBgYHNtYWxsJycgaW4gdGhpcyBzZW5zZS4KLUZvciBleHRlcm5hbCBvYmplY3RzLCBvciBmb3Igb2JqZWN0cyBpbiB0aGUgQGNvZGV7LmJzc30gc2VjdGlvbiwgeW91IGNhbiB1c2UKLXRoZSBAY29kZXtAdmFsdWV7R0NDfX0gQHNhbXB7LUd9IG9wdGlvbiB0byBjb250cm9sIHRoZSBzaXplIG9mIG9iamVjdHMgYWRkcmVzc2VkIHZpYQotQGNvZGV7JGdwfTsgdGhlIGRlZmF1bHQgdmFsdWUgaXMgOCwgbWVhbmluZyB0aGF0IGEgcmVmZXJlbmNlIHRvIGFueSBvYmplY3QKLWVpZ2h0IGJ5dGVzIG9yIHNtYWxsZXIgdXNlcyBAY29kZXskZ3B9LiAgUGFzc2luZyBAc2FtcHstRyAwfSB0bwotQGNvZGV7QHZhbHVle0FTfX0gcHJldmVudHMgaXQgZnJvbSB1c2luZyB0aGUgQGNvZGV7JGdwfSByZWdpc3RlciBvbiB0aGUgYmFzaXMKLW9mIG9iamVjdCBzaXplIChidXQgdGhlIGFzc2VtYmxlciB1c2VzIEBjb2RleyRncH0gZm9yIG9iamVjdHMgaW4gQGNvZGV7LnNkYXRhfQotb3IgQGNvZGV7c2Jzc30gaW4gYW55IGNhc2UpLiAgVGhlIHNpemUgb2YgYW4gb2JqZWN0IGluIHRoZSBAY29kZXsuYnNzfSBzZWN0aW9uCi1pcyBzZXQgYnkgdGhlIEBjb2Rley5jb21tfSBvciBAY29kZXsubGNvbW19IGRpcmVjdGl2ZSB0aGF0IGRlZmluZXMgaXQuICBUaGUKLXNpemUgb2YgYW4gZXh0ZXJuYWwgb2JqZWN0IG1heSBiZSBzZXQgd2l0aCB0aGUgQGNvZGV7LmV4dGVybn0gZGlyZWN0aXZlLiAgRm9yCi1leGFtcGxlLCBAc2FtcHsuZXh0ZXJuIHN5bSw0fSBkZWNsYXJlcyB0aGF0IHRoZSBvYmplY3QgYXQgQGNvZGV7c3ltfSBpcyA0IGJ5dGVzCi1pbiBsZW5ndGgsIHdoaWUgbGVhdmluZyBAY29kZXtzeW19IG90aGVyd2lzZSB1bmRlZmluZWQuCi0KLVVzaW5nIHNtYWxsIEBzY3tlY29mZn0gb2JqZWN0cyByZXF1aXJlcyBsaW5rZXIgc3VwcG9ydCwgYW5kIGFzc3VtZXMgdGhhdCB0aGUKLUBjb2RleyRncH0gcmVnaXN0ZXIgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkIChub3JtYWxseSBkb25lIGF1dG9tYXRpY2FsbHkgYnkKLXRoZSBzdGFydHVwIGNvZGUpLiAgQHNje21pcHN9IEBzY3tlY29mZn0gYXNzZW1ibHkgY29kZSBtdXN0IG5vdCBtb2RpZnkgdGhlCi1AY29kZXskZ3B9IHJlZ2lzdGVyLgotCi1Abm9kZSBNSVBTIFN0YWJzCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQotQGNpbmRleCBNSVBTIGRlYnVnZ2luZyBkaXJlY3RpdmVzCi1Ac2N7bWlwc30gQHNje2Vjb2ZmfSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBzZXZlcmFsIGRpcmVjdGl2ZXMgdXNlZCBmb3IKLWdlbmVyYXRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIGFyZSBub3Qgc3VwcG9ydCBieSB0cmFkaXRpb25hbCBAc2N7bWlwc30KLWFzc2VtYmxlcnMuICBUaGVzZSBhcmUgQGNvZGV7LmRlZn0sIEBjb2Rley5lbmRlZn0sIEBjb2Rley5kaW19LCBAY29kZXsuZmlsZX0sCi1AY29kZXsuc2NsfSwgQGNvZGV7LnNpemV9LCBAY29kZXsudGFnfSwgQGNvZGV7LnR5cGV9LCBAY29kZXsudmFsfSwKLUBjb2Rley5zdGFiZH0sIEBjb2Rley5zdGFibn0sIGFuZCBAY29kZXsuc3RhYnN9LiAgVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotZ2VuZXJhdGVkIGJ5IHRoZSB0aHJlZSBAY29kZXsuc3RhYn0gZGlyZWN0aXZlcyBjYW4gb25seSBiZSByZWFkIGJ5IEBzY3tnZGJ9LAotbm90IGJ5IHRyYWRpdGlvbmFsIEBzY3ttaXBzfSBkZWJ1Z2dlcnMgKHRoaXMgZW5oYW5jZW1lbnQgaXMgcmVxdWlyZWQgdG8gZnVsbHkKLXN1cHBvcnQgQysrIGRlYnVnZ2luZykuICBUaGVzZSBkaXJlY3RpdmVzIGFyZSBwcmltYXJpbHkgdXNlZCBieSBjb21waWxlcnMsIG5vdAotYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMhCi0KLUBub2RlIE1JUFMgSVNBCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIHRvIG92ZXJyaWRlIHRoZSBJU0EgbGV2ZWwKLQotQGNpbmRleCBNSVBTIElTQSBvdmVycmlkZQotQGtpbmRleCBAY29kZXsuc2V0IG1pcHNAdmFye259fQotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgYW4gYWRkaXRpb25hbCBkaXJlY3RpdmUgdG8gY2hhbmdlCi10aGUgQHNje21pcHN9IEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwgb24gdGhlIGZseTogQGNvZGV7LnNldAotbWlwc0B2YXJ7bn19LiAgQHZhcntufSBzaG91bGQgYmUgYSBudW1iZXIgZnJvbSAwIHRvIDQuICBBIHZhbHVlIGZyb20gMQotdG8gNCBtYWtlcyB0aGUgYXNzZW1ibGVyIGFjY2VwdCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nCi1Ac2N7aXNhfSBsZXZlbCwgZnJvbSB0aGF0IHBvaW50IG9uIGluIHRoZSBhc3NlbWJseS4gIEBjb2Rley5zZXQKLW1pcHNAdmFye259fSBhZmZlY3RzIG5vdCBvbmx5IHdoaWNoIGluc3RydWN0aW9ucyBhcmUgcGVybWl0dGVkLCBidXQgYWxzbwotaG93IGNlcnRhaW4gbWFjcm9zIGFyZSBleHBhbmRlZC4gIEBjb2Rley5zZXQgbWlwczB9IHJlc3RvcmVzIHRoZQotQHNje2lzYX0gbGV2ZWwgdG8gaXRzIG9yaWdpbmFsIGxldmVsOiBlaXRoZXIgdGhlIGxldmVsIHlvdSBzZWxlY3RlZCB3aXRoCi1jb21tYW5kIGxpbmUgb3B0aW9ucywgb3IgdGhlIGRlZmF1bHQgZm9yIHlvdXIgY29uZmlndXJhdGlvbi4gIFlvdSBjYW4KLXVzZSB0aGlzIGZlYXR1cmUgdG8gcGVybWl0IHNwZWNpZmljIEBzY3tyNDAwMH0gaW5zdHJ1Y3Rpb25zIHdoaWxlCi1hc3NlbWJsaW5nIGluIDMyIGJpdCBtb2RlLiAgVXNlIHRoaXMgZGlyZWN0aXZlIHdpdGggY2FyZSEKLQotVGhlIGRpcmVjdGl2ZSBAc2FtcHsuc2V0IG1pcHMxNn0gcHV0cyB0aGUgYXNzZW1ibGVyIGludG8gTUlQUyAxNiBtb2RlLAotaW4gd2hpY2ggaXQgd2lsbCBhc3NlbWJsZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBNSVBTIDE2IHByb2Nlc3Nvci4gIFVzZQotQHNhbXB7LnNldCBub21pcHMxNn0gdG8gcmV0dXJuIHRvIG5vcm1hbCAzMiBiaXQgbW9kZS4KLQotVHJhZGl0aW9uYWwgQHNje21pcHN9IGFzc2VtYmxlcnMgZG8gbm90IHN1cHBvcnQgdGhpcyBkaXJlY3RpdmUuICAKLQotQG5vZGUgTUlQUyBhdXRvZXh0ZW5kCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIGZvciBleHRlbmRpbmcgTUlQUyAxNiBiaXQgaW5zdHJ1Y3Rpb25zCi0KLUBraW5kZXggQGNvZGV7LnNldCBhdXRvZXh0ZW5kfQotQGtpbmRleCBAY29kZXsuc2V0IG5vYXV0b2V4dGVuZH0KLUJ5IGRlZmF1bHQsIE1JUFMgMTYgaW5zdHJ1Y3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIHRvIDMyIGJpdHMKLXdoZW4gbmVjZXNzYXJ5LiAgVGhlIGRpcmVjdGl2ZSBAc2FtcHsuc2V0IG5vYXV0b2V4dGVuZH0gd2lsbCB0dXJuIHRoaXMKLW9mZi4gIFdoZW4gQHNhbXB7LnNldCBub2F1dG9leHRlbmR9IGlzIGluIGVmZmVjdCwgYW55IDMyIGJpdCBpbnN0cnVjdGlvbgotbXVzdCBiZSBleHBsaWNpdGx5IGV4dGVuZGVkIHdpdGggdGhlIEBzYW1wey5lfSBtb2RpZmllciAoZS5nLiwKLUBzYW1we2xpLmUgJDQsMTAwMH0pLiAgVGhlIGRpcmVjdGl2ZSBAc2FtcHsuc2V0IGF1dG9leHRlbmR9IG1heSBiZSB1c2VkCi10byBvbmNlIGFnYWluIGF1dG9tYXRpY2FsbHkgZXh0ZW5kIGluc3RydWN0aW9ucyB3aGVuIG5lY2Vzc2FyeS4KLQotVGhpcyBkaXJlY3RpdmUgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gaW4gTUlQUyAxNiBtb2RlLiAgVHJhZGl0aW9uYWwKLUBzY3ttaXBzfSBhc3NlbWJsZXJzIGRvIG5vdCBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlLgotCi1Abm9kZSBNSVBTIGluc24KLUBzZWN0aW9uIERpcmVjdGl2ZSB0byBtYXJrIGRhdGEgYXMgYW4gaW5zdHJ1Y3Rpb24KLQotQGtpbmRleCBAY29kZXsuaW5zbn0KLVRoZSBAY29kZXsuaW5zbn0gZGlyZWN0aXZlIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRoYXQgdGhlIGZvbGxvd2luZwotZGF0YSBpcyBhY3R1YWxseSBpbnN0cnVjdGlvbnMuICBUaGlzIG1ha2VzIGEgZGlmZmVyZW5jZSBpbiBNSVBTIDE2IG1vZGU6Ci13aGVuIGxvYWRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBsYWJlbCB3aGljaCBwcmVjZWRlcyBpbnN0cnVjdGlvbnMsCi1AY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5IGFkZHMgMSB0byB0aGUgdmFsdWUsIHNvIHRoYXQganVtcGluZyB0bwotdGhlIGxvYWRlZCBhZGRyZXNzIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLgotCi1Abm9kZSBNSVBTIG9wdGlvbiBzdGFjawotQHNlY3Rpb24gRGlyZWN0aXZlcyB0byBzYXZlIGFuZCByZXN0b3JlIG9wdGlvbnMKLQotQGNpbmRleCBNSVBTIG9wdGlvbiBzdGFjawotQGtpbmRleCBAY29kZXsuc2V0IHB1c2h9Ci1Aa2luZGV4IEBjb2Rley5zZXQgcG9wfQotVGhlIGRpcmVjdGl2ZXMgQGNvZGV7LnNldCBwdXNofSBhbmQgQGNvZGV7LnNldCBwb3B9IG1heSBiZSB1c2VkIHRvIHNhdmUKLWFuZCByZXN0b3JlIHRoZSBjdXJyZW50IHNldHRpbmdzIGZvciBhbGwgdGhlIG9wdGlvbnMgd2hpY2ggYXJlCi1jb250cm9sbGVkIGJ5IEBjb2Rley5zZXR9LiAgVGhlIEBjb2Rley5zZXQgcHVzaH0gZGlyZWN0aXZlIHNhdmVzIHRoZQotY3VycmVudCBzZXR0aW5ncyBvbiBhIHN0YWNrLiAgVGhlIEBjb2Rley5zZXQgcG9wfSBkaXJlY3RpdmUgcG9wcyB0aGUKLXN0YWNrIGFuZCByZXN0b3JlcyB0aGUgc2V0dGluZ3MuCi0KLVRoZXNlIGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWZ1bCBpbnNpZGUgYW4gbWFjcm8gd2hpY2ggbXVzdCBjaGFuZ2UgYW4KLW9wdGlvbiBzdWNoIGFzIHRoZSBJU0EgbGV2ZWwgb3IgaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZyBidXQgZG9lcyBub3Qgd2FudAotdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgY29kZSB3aGljaCBpbnZva2VkIHRoZSBtYWNyby4KLQotVHJhZGl0aW9uYWwgQHNje21pcHN9IGFzc2VtYmxlcnMgZG8gbm90IHN1cHBvcnQgdGhlc2UgZGlyZWN0aXZlcy4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1uczMyay50ZXhpIGIvZ2FzL2RvYy9jLW5zMzJrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzYxZDkuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW5zMzJrLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AYyAgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi0KLUBpZ25vcmUKLUBjIEZJWE1FISAgU3RvcCBpZ25vcmluZyB3aGVuIGZpbGxlZCBpbi4KLUBub2RlIDMyeDMyCi1AY2hhcHRlciAzMngzMgotCi1Ac2VjdGlvbiBPcHRpb25zCi1UaGUgMzJ4MzIgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIGEgQHNhbXB7LW0zMjAzMn0gb3B0aW9uIHRvCi1zcGVjaWZ5IHRoaWF0IGl0IGlzIGNvbXBpbGluZyBmb3IgYSAzMjAzMiBwcm9jZXNzb3IsIG9yIGEKLUBzYW1wey1tMzI1MzJ9IHRvIHNwZWNpZnkgdGhhdCBpdCBpcyBjb21waWxpbmcgZm9yIGEgMzI1MzIgb3B0aW9uLgotVGhlIGRlZmF1bHQgKGlmIG5laXRoZXIgaXMgc3BlY2lmaWVkKSBpcyBjaG9zZW4gd2hlbiB0aGUgYXNzZW1ibGVyCi1pcyBjb21waWxlZC4KLQotQHNlY3Rpb24gU3ludGF4Ci1JIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIDMyeDMyIHN5bnRheCBhc3NlbWJsZWQgYnkKLUBjb2Rle0B2YWx1ZXtBU319LiAgU29tZW9uZSB3aG8gdW5kZXJzYW5kcyB0aGUgcHJvY2Vzc29yIChJJ3ZlIG5ldmVyIHNlZW4KLW9uZSkgYW5kIHRoZSBwb3NzaWJsZSBzeW50YXhlcyBzaG91bGQgd3JpdGUgdGhpcyBzZWN0aW9uLgotCi1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotVGhlIDMyeDMyIHVzZXMgQHNje2llZWV9IGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGJ1dCBAY29kZXtAdmFsdWV7QVN9fQotb25seSBjcmVhdGVzIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIHZhbHVlcy4gIEkgZG9uJ3Qga25vdyBpZiB0aGUKLTMyeDMyIHVuZGVyc3RhbmRzIGV4dGVuZGVkIHByZWNpc2lvbiBudW1iZXJzLgotCi1Ac2VjdGlvbiAzMngzMiBNYWNoaW5lIERpcmVjdGl2ZXMKLVRoZSAzMngzMiBoYXMgbm8gbWFjaGluZSBkZXBlbmRlbnQgZGlyZWN0aXZlcy4KLQotQGVuZCBpZ25vcmUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1wai50ZXhpIGIvZ2FzL2RvYy9jLXBqLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjAwMTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXBqLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBwYWdlCi1Abm9kZSBQSi1EZXBlbmRlbnQKLUBjaGFwdGVyIHBpY29KYXZhIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IFBKIHN1cHBvcnQKLUBtZW51Ci0qIFBKIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIFBKIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBQSiBvcHRpb25zCi1AY2luZGV4IG9wdGlvbnMsIFBKCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgdHdvIGFkZGlpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgcGljb0phdmEKLWFyY2hpdGVjdHVyZS4KLUB0YWJsZSBAY29kZQotQGl0ZW0gLW1sCi1UaGlzIG9wdGlvbiBzZWxlY3RzIGxpdHRsZSBlbmRpYW4gZGF0YSBvdXRwdXQuCi0KLUBpdGVtIC1tYgotVGhpcyBvcHRpb24gc2VsZWN0cyBiaWcgZW5kaWFuIGRhdGEgb3V0cHV0LgotQGVuZCB0YWJsZQotCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1zaC50ZXhpIGIvZ2FzL2RvYy9jLXNoLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMGY1NTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXNoLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQHBhZ2UKLUBub2RlIFNILURlcGVuZGVudAotQGNoYXB0ZXIgSGl0YWNoaSBTSCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBTSCBzdXBwb3J0Ci1AbWVudQotKiBTSCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogU0ggU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogU0ggRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBTSCBEaXJlY3RpdmVzOjogICAgICAgICAgIFNIIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBTSCBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTSCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggU0ggb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucywgU0ggKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEhpdGFjaGkKLVNIIGZhbWlseS4KLQotQG5vZGUgU0ggU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLQotQG1lbnUKLSogU0gtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogU0gtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBTSC1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTSC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgU0gKLUBjaW5kZXggU0ggbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7IX0gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggbGluZSBzZXBhcmF0b3IsIFNICi1AY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIFNICi1AY2luZGV4IFNIIGxpbmUgc2VwYXJhdG9yCi1Zb3UgY2FuIHVzZSBAc2FtcHs7fSBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KLUBjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIFNILVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggU0ggcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgU0gKLVlvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9LCBAc2FtcHtyMX0sIEBzYW1we3IyfSwKLUBzYW1we3IzfSwgQHNhbXB7cjR9LCBAc2FtcHtyNX0sIEBzYW1we3I2fSwgQHNhbXB7cjd9LCBAc2FtcHtyOH0sCi1Ac2FtcHtyOX0sIEBzYW1we3IxMH0sIEBzYW1we3IxMX0sIEBzYW1we3IxMn0sIEBzYW1we3IxM30sIEBzYW1we3IxNH0sCi1hbmQgQHNhbXB7cjE1fSB0byByZWZlciB0byB0aGUgU0ggcmVnaXN0ZXJzLgotCi1UaGUgU0ggYWxzbyBoYXMgdGhlc2UgY29udHJvbCByZWdpc3RlcnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gcHIKLXByb2NlZHVyZSByZWdpc3RlciAoaG9sZHMgcmV0dXJuIGFkZHJlc3MpCi0KLUBpdGVtIHBjCi1wcm9ncmFtIGNvdW50ZXIKLQotQGl0ZW0gbWFjaAotQGl0ZW14IG1hY2wKLWhpZ2ggYW5kIGxvdyBtdWx0aXBseSBhY2N1bXVsYXRvciByZWdpc3RlcnMKLQotQGl0ZW0gc3IKLXN0YXR1cyByZWdpc3RlcgotCi1AaXRlbSBnYnIKLWdsb2JhbCBiYXNlIHJlZ2lzdGVyCi0KLUBpdGVtIHZicgotdmVjdG9yIGJhc2UgcmVnaXN0ZXIgKGZvciBpbnRlcnJ1cHQgdmVjdG9ycykKLUBlbmQgdGFibGUKLQotQG5vZGUgU0gtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIFNICi1AY2luZGV4IFNIIGFkZHJlc3NpbmcgbW9kZXMKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIFNILgotQGNvZGV7UkB2YXJ7bn19IGluIHRoZSBmb2xsb3dpbmcgcmVmZXJzIHRvIGFueSBvZiB0aGUgbnVtYmVyZWQKLXJlZ2lzdGVycywgYnV0IEBlbXBoe25vdH0gdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLQotQGl0ZW0gQEBSQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLQotQGl0ZW0gQEAtUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotCi1AaXRlbSBAQFJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotCi1AaXRlbSBAQChAdmFye2Rpc3B9LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0KLUBpdGVtIEBAKFIwLCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGV4ZWQKLQotQGl0ZW0gQEAoQHZhcntkaXNwfSwgR0JSKQotQGNvZGV7R0JSfSBvZmZzZXQKLQotQGl0ZW0gQEAoUjAsIEdCUikKLUdCUiBpbmRleGVkCi0KLUBpdGVtIEB2YXJ7YWRkcn0KLUBpdGVteCBAQChAdmFye2Rpc3B9LCBQQykKLVBDIHJlbGF0aXZlIGFkZHJlc3MgKGZvciBicmFuY2ggb3IgZm9yIGFkZHJlc3NpbmcgbWVtb3J5KS4gIFRoZQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50YXRpb24gYWxsb3dzIHlvdSB0byB1c2UgdGhlIHNpbXBsZXIgZm9ybQotQHZhcnthZGRyfSBhbnl3aGVyZSBhIFBDIHJlbGF0aXZlIGFkZHJlc3MgaXMgY2FsbGVkIGZvcjsgdGhlIGFsdGVybmF0ZQotZm9ybSBpcyBzdXBwb3J0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBhc3NlbWJsZXJzLgotCi1AaXRlbSAjQHZhcntpbW19Ci1JbW1lZGlhdGUgZGF0YQotQGVuZCB0YWJsZQotCi1Abm9kZSBTSCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgU0ggKEBzY3tpZWVlfSkKLUBjaW5kZXggU0ggZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBTSCBmYW1pbHkgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0KLWRpcmVjdGl2ZSBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuCi0KLUBub2RlIFNIIERpcmVjdGl2ZXMKLUBzZWN0aW9uIFNIIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IFNIIG1hY2hpbmUgZGlyZWN0aXZlcwotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIFNICi1AY2luZGV4IEBjb2Rle3Vhd29yZH0gZGlyZWN0aXZlLCBTSAotQGNpbmRleCBAY29kZXt1YWxvbmd9IGRpcmVjdGl2ZSwgU0gKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSB1YXdvcmQKLUBpdGVteCB1YWxvbmcKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgaXNzdWUgYSB3YXJuaW5nIHdoZW4gYSBtaXNhbGlnbmVkIEBjb2Rley53b3JkfSBvcgotQGNvZGV7Lmxvbmd9IGRpcmVjdGl2ZSBpcyB1c2VkLiAgWW91IG1heSB1c2UgQGNvZGV7LnVhd29yZH0gb3IKLUBjb2Rley51YWxvbmd9IHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGludGVudGlvbmFsbHkgbWlzYWxpZ25lZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgU0ggT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IFNIIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBTSAotQGNpbmRleCBtbmVtb25pY3MsIFNICi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIFNICi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIFNIIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle1NILU1pY3JvY29tcHV0ZXIgVXNlcidzIE1hbnVhbH0gKEhpdGFjaGkgTWljcm8gU3lzdGVtcywgSW5jLikuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBTSCBvcGNvZGVzLiAgTm8gYWRkaXRpb25hbAotcHNldWRvLWluc3RydWN0aW9ucyBhcmUgbmVlZGVkIG9uIHRoaXMgZmFtaWx5LiAgTm90ZSwgaG93ZXZlciwgdGhhdAotYmVjYXVzZSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBhIHNpbXBsZXIgZm9ybSBvZiBQQy1yZWxhdGl2ZQotYWRkcmVzc2luZywgeW91IG1heSBzaW1wbHkgd3JpdGUgKGZvciBleGFtcGxlKQotCi1AZXhhbXBsZQotbW92LmwgIGJhcixyMAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgb3RoZXIgYXNzZW1ibGVycyBtaWdodCByZXF1aXJlIGFuIGV4cGxpY2l0IGRpc3BsYWNlbWVudCB0bwotQGNvZGV7YmFyfSBmcm9tIHRoZSBwcm9ncmFtIGNvdW50ZXI6Ci0KLUBleGFtcGxlCi1tb3YubCAgQEAoQHZhcntkaXNwfSwgUEMpCi1AZW5kIGV4YW1wbGUKLQotQGlmc2V0IFNNQUxMCi1AYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKLUBjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KLQotSGVyZSBpcyBhIHN1bW1hcnkgb2YgU0ggb3Bjb2RlczoKLQotQHBhZ2UKLUBzbWFsbGV4YW1wbGUKLUBpe0xlZ2VuZDp9Ci1SbiAgICAgICAgQHJ7YSBudW1iZXJlZCByZWdpc3Rlcn0KLVJtICAgICAgICBAcnthbm90aGVyIG51bWJlcmVkIHJlZ2lzdGVyfQotI2ltbSAgICAgIEBye2ltbWVkaWF0ZSBkYXRhfQotZGlzcCAgICAgIEBye2Rpc3BsYWNlbWVudH0KLWRpc3A4ICAgICBAcns4LWJpdCBkaXNwbGFjZW1lbnR9Ci1kaXNwMTIgICAgQHJ7MTItYml0IGRpc3BsYWNlbWVudH0KLQotYWRkICNpbW0sUm4gICAgICAgICAgICAgICAgICAgIGxkcy5sIEBAUm4rLFBSICAgICAgICAgICAgICAKLWFkZCBSbSxSbiAgICAgICAgICAgICAgICAgICAgICBtYWMudyBAQFJtKyxAQFJuKyAgICAgICAgICAgCi1hZGRjIFJtLFJuICAgICAgICAgICAgICAgICAgICAgbW92ICNpbW0sUm4gICAgICAgICAgICAgICAgIAotYWRkdiBSbSxSbiAgICAgICAgICAgICAgICAgICAgIG1vdiBSbSxSbiAgICAgICAgICAgICAgICAgICAKLWFuZCAjaW1tLFIwICAgICAgICAgICAgICAgICAgICBtb3YuYiBSbSxAQChSMCxSbikgICAgICAgICAgCi1hbmQgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgbW92LmIgUm0sQEAtUm4gICAgICAgICAgICAgIAotYW5kLmIgI2ltbSxAQChSMCxHQlIpICAgICAgICAgICBtb3YuYiBSbSxAQFJuICAgICAgICAgICAgICAgCi1iZiBkaXNwOCAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEAoZGlzcCxSbSksUjAgICAgICAgIAotYnJhIGRpc3AxMiAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAKGRpc3AsR0JSKSxSMCAgICAgICAKLWJzciBkaXNwMTIgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQChSMCxSbSksUm4gICAgICAgICAgCi1idCBkaXNwOCAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEBSbSssUm4gICAgICAgICAgICAgIAotY2xybWFjICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAUm0sUm4gICAgICAgICAgICAgICAKLWNscnQgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBSMCxAQChkaXNwLFJtKSAgICAgICAgCi1jbXAvZXEgI2ltbSxSMCAgICAgICAgICAgICAgICAgbW92LmIgUjAsQEAoZGlzcCxHQlIpICAgICAgIAotY21wL2VxIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBAKGRpc3AsUm4pICAgICAgICAKLWNtcC9nZSBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBSbSxAQChSMCxSbikgICAgICAgICAgCi1jbXAvZ3QgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEAtUm4gICAgICAgICAgICAgIAotY21wL2hpIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBAUm4gICAgICAgICAgICAgICAKLWNtcC9ocyBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBAQChkaXNwLFJuKSxSbSAgICAgICAgCi1jbXAvcGwgUm4gICAgICAgICAgICAgICAgICAgICAgbW92LmwgQEAoZGlzcCxHQlIpLFIwICAgICAgIAotY21wL3B6IFJuICAgICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKGRpc3AsUEMpLFJuICAgICAgICAKLWNtcC9zdHIgUm0sUm4gICAgICAgICAgICAgICAgICBtb3YubCBAQChSMCxSbSksUm4gICAgICAgICAgCi1kaXYwcyBSbSxSbiAgICAgICAgICAgICAgICAgICAgbW92LmwgQEBSbSssUm4gICAgICAgICAgICAgIAotZGl2MHUgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAUm0sUm4gICAgICAgICAgICAgICAKLWRpdjEgUm0sUm4gICAgICAgICAgICAgICAgICAgICBtb3YubCBSMCxAQChkaXNwLEdCUikgICAgICAgCi1leHRzLmIgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgUm0sQEAoUjAsUm4pICAgICAgICAgIAotZXh0cy53IFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi53IFJtLEBALVJuICAgICAgICAgICAgICAKLWV4dHUuYiBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBSbSxAQFJuICAgICAgICAgICAgICAgCi1leHR1LncgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgQEAoZGlzcCxSbSksUjAgICAgICAgIAotam1wIEBAUm4gICAgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQChkaXNwLEdCUiksUjAgICAgICAgCi1qc3IgQEBSbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKGRpc3AsUEMpLFJuICAgICAgICAKLWxkYyBSbixHQlIgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQChSMCxSbSksUm4gICAgICAgICAgCi1sZGMgUm4sU1IgICAgICAgICAgICAgICAgICAgICAgbW92LncgQEBSbSssUm4gICAgICAgICAgICAgIAotbGRjIFJuLFZCUiAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAUm0sUm4gICAgICAgICAgICAgICAKLWxkYy5sIEBAUm4rLEdCUiAgICAgICAgICAgICAgICAgbW92LncgUjAsQEAoZGlzcCxSbSkgICAgICAgIAotbGRjLmwgQEBSbissU1IgICAgICAgICAgICAgICAgICBtb3YudyBSMCxAQChkaXNwLEdCUikgICAgICAgCi1sZGMubCBAQFJuKyxWQlIgICAgICAgICAgICAgICAgIG1vdmEgQEAoZGlzcCxQQyksUjAgICAgICAgICAKLWxkcyBSbixNQUNIICAgICAgICAgICAgICAgICAgICBtb3Z0IFJuICAgICAgICAgICAgICAgICAgICAgCi1sZHMgUm4sTUFDTCAgICAgICAgICAgICAgICAgICAgbXVscyBSbSxSbiAgICAgICAgICAgICAgICAgIAotbGRzIFJuLFBSICAgICAgICAgICAgICAgICAgICAgIG11bHUgUm0sUm4gICAgICAgICAgICAgICAgICAKLWxkcy5sIEBAUm4rLE1BQ0ggICAgICAgICAgICAgICAgbmVnIFJtLFJuICAgICAgICAgICAgICAgICAgIAotbGRzLmwgQEBSbissTUFDTCAgICAgICAgICAgICAgICBuZWdjIFJtLFJuICAgICAgICAgICAgICAgICAgCi1AcGFnZQotbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YyBWQlIsUm4gICAgICAgICAgICAgICAgCi1ub3QgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgc3RjLmwgR0JSLEBALVJuICAgICAgICAgICAKLW9yICNpbW0sUjAgICAgICAgICAgICAgICAgICAgICBzdGMubCBTUixAQC1SbiAgICAgICAgICAgIAotb3IgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgIHN0Yy5sIFZCUixAQC1SbiAgICAgICAgICAgCi1vci5iICNpbW0sQEAoUjAsR0JSKSAgICAgICAgICAgIHN0cyBNQUNILFJuICAgICAgICAgICAgICAgCi1yb3RjbCBSbiAgICAgICAgICAgICAgICAgICAgICAgc3RzIE1BQ0wsUm4gICAgICAgICAgICAgICAKLXJvdGNyIFJuICAgICAgICAgICAgICAgICAgICAgICBzdHMgUFIsUm4gICAgICAgICAgICAgICAgIAotcm90bCBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cy5sIE1BQ0gsQEAtUm4gICAgICAgICAgCi1yb3RyIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3RzLmwgTUFDTCxAQC1SbiAgICAgICAgICAKLXJ0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHMubCBQUixAQC1SbiAgICAgICAgICAgIAotcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiBSbSxSbiAgICAgICAgICAgICAgICAgCi1zZXR0ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYyBSbSxSbiAgICAgICAgICAgICAgICAKLXNoYWwgUm4gICAgICAgICAgICAgICAgICAgICAgICBzdWJ2IFJtLFJuICAgICAgICAgICAgICAgIAotc2hhciBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAuYiBSbSxSbiAgICAgICAgICAgICAgCi1zaGxsIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3dhcC53IFJtLFJuICAgICAgICAgICAgICAKLXNobGwxNiBSbiAgICAgICAgICAgICAgICAgICAgICB0YXMuYiBAQFJuICAgICAgICAgICAgICAgIAotc2hsbDIgUm4gICAgICAgICAgICAgICAgICAgICAgIHRyYXBhICNpbW0gICAgICAgICAgICAgICAgCi1zaGxsOCBSbiAgICAgICAgICAgICAgICAgICAgICAgdHN0ICNpbW0sUjAgICAgICAgICAgICAgICAKLXNobHIgUm4gICAgICAgICAgICAgICAgICAgICAgICB0c3QgUm0sUm4gICAgICAgICAgICAgICAgIAotc2hscjE2IFJuICAgICAgICAgICAgICAgICAgICAgIHRzdC5iICNpbW0sQEAoUjAsR0JSKSAgICAgCi1zaGxyMiBSbiAgICAgICAgICAgICAgICAgICAgICAgeG9yICNpbW0sUjAgICAgICAgICAgICAgICAKLXNobHI4IFJuICAgICAgICAgICAgICAgICAgICAgICB4b3IgUm0sUm4gICAgICAgICAgICAgICAgIAotc2xlZXAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvci5iICNpbW0sQEAoUjAsR0JSKSAgICAgCi1zdGMgR0JSLFJuICAgICAgICAgICAgICAgICAgICAgeHRyY3QgUm0sUm4gICAgICAgICAgICAgICAKLXN0YyBTUixSbgotQGVuZCBzbWFsbGV4YW1wbGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhpdGFjaGktYWxsCi1AaWZjbGVhciBHRU5FUklDCi1AcmFpc2VzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1zcGFyYy50ZXhpIGIvZ2FzL2RvYy9jLXNwYXJjLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTRlYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXNwYXJjLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIFNwYXJjLURlcGVuZGVudAotQGNoYXB0ZXIgU1BBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgU1BBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBTUEFSQyBzdXBwb3J0Ci1AbWVudQotKiBTcGFyYy1PcHRzOjogICAgICAgICAgICAgICAgICBPcHRpb25zCi0qIFNwYXJjLUFsaWduZWQtRGF0YTo6CQlPcHRpb24gdG8gZW5mb3JjZSBhbGlnbmVkIGRhdGEKLSogU3BhcmMtRmxvYXQ6OiAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogU3BhcmMtRGlyZWN0aXZlczo6ICAgICAgICAgICAgU3BhcmMgTWFjaGluZSBEaXJlY3RpdmVzCi1AZW5kIG1lbnUKLQotQG5vZGUgU3BhcmMtT3B0cwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMgZm9yIFNQQVJDCi1AY2luZGV4IFNQQVJDIG9wdGlvbnMKLUBjaW5kZXggYXJjaGl0ZWN0dXJlcywgU1BBUkMKLUBjaW5kZXggU1BBUkMgYXJjaGl0ZWN0dXJlcwotVGhlIFNQQVJDIGNoaXAgZmFtaWx5IGluY2x1ZGVzIHNldmVyYWwgc3VjY2Vzc2l2ZSBsZXZlbHMsIHVzaW5nIHRoZSBzYW1lCi1jb3JlIGluc3RydWN0aW9uIHNldCwgYnV0IGluY2x1ZGluZyBhIGZldyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdAotZWFjaCBsZXZlbC4gIFRoZXJlIGFyZSBleGNlcHRpb25zIHRvIHRoaXMgaG93ZXZlci4gIEZvciBkZXRhaWxzIG9uIHdoYXQKLWluc3RydWN0aW9ucyBlYWNoIHZhcmlhbnQgc3VwcG9ydHMsIHBsZWFzZSBzZWUgdGhlIGNoaXAncyBhcmNoaXRlY3R1cmUKLXJlZmVyZW5jZSBtYW51YWwuCi0KLUJ5IGRlZmF1bHQsIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgdGhlIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0IChTUEFSQwotdjYpLCBidXQgYGBidW1wcycnIHRoZSBhcmNoaXRlY3R1cmUgbGV2ZWwgYXMgbmVlZGVkOiBpdCBzd2l0Y2hlcyB0bwotc3VjY2Vzc2l2ZWx5IGhpZ2hlciBhcmNoaXRlY3R1cmVzIGFzIGl0IGVuY291bnRlcnMgaW5zdHJ1Y3Rpb25zIHRoYXQKLW9ubHkgZXhpc3QgaW4gdGhlIGhpZ2hlciBsZXZlbHMuCi0KLUlmIG5vdCBjb25maWd1cmVkIGZvciBTUEFSQyB2OSAoQGNvZGV7c3BhcmM2NC0qLSp9KSBHQVMgd2lsbCBub3QgYnVtcAotcGFzc2VkIHNwYXJjbGl0ZSBieSBkZWZhdWx0LCBhbiBvcHRpb24gbXVzdCBiZSBwYXNzZWQgdG8gZW5hYmxlIHRoZQotdjkgaW5zdHJ1Y3Rpb25zLgotCi1HQVMgdHJlYXRzIHNwYXJjbGl0ZSBhcyBiZWluZyBjb21wYXRpYmxlIHdpdGggdjgsIHVubGVzcyBhbiBhcmNoaXRlY3R1cmUKLWlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgU1BBUkMgdjkgaXMgYWx3YXlzIGluY29tcGF0aWJsZSB3aXRoIHNwYXJjbGl0ZS4KLQotQGMgVGhlIG9yZGVyIGhlcmUgaXMgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIG9mIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsCi1AYyB0byBnaXZlIHRoZSB1c2VyIGEgc2Vuc2Ugb2YgdGhlIG9yZGVyIG9mIHRoZSAiYnVtcGluZyIuCi0KLUB0YWJsZSBAY29kZQotQGtpbmRleCAtQXY2Ci1Aa2luZGV4IEF2NwotQGtpbmRleCAtQXY4Ci1Aa2luZGV4IC1Bc3BhcmNsZXQKLUBraW5kZXggLUFzcGFyY2xpdGUKLUBraW5kZXggLUF2OQotQGtpbmRleCAtQXY5YQotQGl0ZW0gLUF2NiB8IC1BdjcgfCAtQXY4IHwgLUFzcGFyY2xldCB8IC1Bc3BhcmNsaXRlCi1AaXRlbXggLUF2OHBsdXMgfCAtQXY4cGx1c2EgfCAtQXY5IHwgLUF2OWEKLVVzZSBvbmUgb2YgdGhlIEBzYW1wey1BfSBvcHRpb25zIHRvIHNlbGVjdCBvbmUgb2YgdGhlIFNQQVJDCi1hcmNoaXRlY3R1cmVzIGV4cGxpY2l0bHkuICBJZiB5b3Ugc2VsZWN0IGFuIGFyY2hpdGVjdHVyZSBleHBsaWNpdGx5LAotQGNvZGV7QHZhbHVle0FTfX0gcmVwb3J0cyBhIGZhdGFsIGVycm9yIGlmIGl0IGVuY291bnRlcnMgYW4gaW5zdHJ1Y3Rpb24KLW9yIGZlYXR1cmUgcmVxdWlyaW5nIGFuIGluY29tcGF0aWJsZSBvciBoaWdoZXIgbGV2ZWwuCi0KLUBzYW1wey1BdjhwbHVzfSBhbmQgQHNhbXB7LUF2OHBsdXNhfSBzZWxlY3QgYSAzMiBiaXQgZW52aXJvbm1lbnQuCi0KLUBzYW1wey1Bdjl9IGFuZCBAc2FtcHstQXY5YX0gc2VsZWN0IGEgNjQgYml0IGVudmlyb25tZW50IGFuZCBhcmUgbm90Ci1hdmFpbGFibGUgdW5sZXNzIEdBUyBpcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgd2l0aCA2NCBiaXQgZW52aXJvbm1lbnQKLXN1cHBvcnQuCi0KLUBzYW1wey1BdjhwbHVzYX0gYW5kIEBzYW1wey1BdjlhfSBlbmFibGUgdGhlIFNQQVJDIFY5IGluc3RydWN0aW9uIHNldCB3aXRoCi1VbHRyYVNQQVJDIGV4dGVuc2lvbnMuCi0KLUBpdGVtIC14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyB2OSBhc3NlbWJsZXIuICBUaGVzZSBvcHRpb25zIGFyZQotZXF1aXZhbGVudCB0byAtQXY4cGx1cyBhbmQgLUF2OHBsdXNhLCByZXNwZWN0aXZlbHkuCi0KLUBpdGVtIC1idW1wCi1XYXJuIHdoZW5ldmVyIGl0IGlzIG5lY2Vzc2FyeSB0byBzd2l0Y2ggdG8gYW5vdGhlciBsZXZlbC4KLUlmIGFuIGFyY2hpdGVjdHVyZSBsZXZlbCBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZCwgR0FTIHdpbGwgbm90IGlzc3VlCi13YXJuaW5ncyB1bnRpbCB0aGF0IGxldmVsIGlzIHJlYWNoZWQsIGFuZCB3aWxsIHRoZW4gYnVtcCB0aGUgbGV2ZWwKLWFzIHJlcXVpcmVkIChleGNlcHQgYmV0d2VlbiBpbmNvbXBhdGlibGUgbGV2ZWxzKS4KLQotQGl0ZW0gLTMyIHwgLTY0Ci1TZWxlY3QgdGhlIHdvcmQgc2l6ZSwgZWl0aGVyIDMyIGJpdHMgb3IgNjQgYml0cy4KLVRoZXNlIG9wdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIHdpdGggdGhlIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQsCi1hbmQgcmVxdWlyZSB0aGF0IHRoZSBuZWNlc3NhcnkgQkZEIHN1cHBvcnQgaGFzIGJlZW4gaW5jbHVkZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIFNwYXJjLUFsaWduZWQtRGF0YQotQHNlY3Rpb24gRW5mb3JjaW5nIGFsaWduZWQgZGF0YQotCi1AY2luZGV4IGRhdGEgYWxpZ25tZW50IG9uIFNQQVJDCi1AY2luZGV4IFNQQVJDIGRhdGEgYWxpZ25tZW50Ci1TUEFSQyBHQVMgbm9ybWFsbHkgcGVybWl0cyBkYXRhIHRvIGJlIG1pc2FsaWduZWQuICBGb3IgZXhhbXBsZSwgaXQKLXBlcm1pdHMgdGhlIEBjb2Rley5sb25nfSBwc2V1ZG8tb3AgdG8gYmUgdXNlZCBvbiBhIGJ5dGUgYm91bmRhcnkuCi1Ib3dldmVyLCB0aGUgbmF0aXZlIFN1bk9TIGFuZCBTb2xhcmlzIGFzc2VtYmxlcnMgaXNzdWUgYW4gZXJyb3Igd2hlbgotdGhleSBzZWUgbWlzYWxpZ25lZCBkYXRhLgotCi1Aa2luZGV4IC0tZW5mb3JjZS1hbGlnbmVkLWRhdGEKLVlvdSBjYW4gdXNlIHRoZSBAY29kZXstLWVuZm9yY2UtYWxpZ25lZC1kYXRhfSBvcHRpb24gdG8gbWFrZSBTUEFSQyBHQVMKLWFsc28gaXNzdWUgYW4gZXJyb3IgYWJvdXQgbWlzYWxpZ25lZCBkYXRhLCBqdXN0IGFzIHRoZSBTdW5PUyBhbmQgU29sYXJpcwotYXNzZW1ibGVycyBkby4KLQotVGhlIEBjb2Rley0tZW5mb3JjZS1hbGlnbmVkLWRhdGF9IG9wdGlvbiBpcyBub3QgdGhlIGRlZmF1bHQgYmVjYXVzZSBnY2MKLWlzc3VlcyBtaXNhbGlnbmVkIGRhdGEgcHNldWRvLW9wcyB3aGVuIGl0IGluaXRpYWxpemVzIGNlcnRhaW4gcGFja2VkCi1kYXRhIHN0cnVjdHVyZXMgKHN0cnVjdHVyZXMgZGVmaW5lZCB1c2luZyB0aGUgQGNvZGV7cGFja2VkfSBhdHRyaWJ1dGUpLgotWW91IG1heSBoYXZlIHRvIGFzc2VtYmxlIHdpdGggR0FTIGluIG9yZGVyIHRvIGluaXRpYWxpemUgcGFja2VkIGRhdGEKLXN0cnVjdHVyZXMgaW4geW91ciBvd24gY29kZS4KLQotQGlnbm9yZQotQGMgRklYTUU6IChzcGFyYykgRmlsbCBpbiAic3ludGF4IiBzZWN0aW9uIQotQGMgc3Vic2VjdGlvbiBzeW50YXgKLUkgZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCBTcGFyYyBzeW50YXguICBTb21lb25lIHdobyBkb2VzCi13aWxsIGhhdmUgdG8gd3JpdGUgdGhpcyBzZWN0aW9uLgotQGVuZCBpZ25vcmUKLQotQG5vZGUgU3BhcmMtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIFNQQVJDIChAc2N7aWVlZX0pCi1AY2luZGV4IFNQQVJDIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgU3BhcmMgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgU3BhcmMtRGlyZWN0aXZlcwotQHNlY3Rpb24gU3BhcmMgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggU1BBUkMgbWFjaGluZSBkaXJlY3RpdmVzCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgU1BBUkMKLVRoZSBTcGFyYyB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAotbWFjaGluZSBkaXJlY3RpdmVzOgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7YWxpZ259IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5hbGlnbgotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBkZXNpcmVkIGFsaWdubWVudCBpbiBieXRlcy4KLQotQGNpbmRleCBAY29kZXtjb21tb259IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5jb21tb24KLVRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHN5bWJvbCBuYW1lLCBhIHBvc2l0aXZlIG51bWJlciwgYW5kCi1AY29kZXsiYnNzIn0uICBUaGlzIGJlaGF2ZXMgc29tZXdoYXQgbGlrZSBAY29kZXsuY29tbX0sIGJ1dCB0aGUKLXN5bnRheCBpcyBkaWZmZXJlbnQuCi0KLUBjaW5kZXggQGNvZGV7aGFsZn0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLmhhbGYKLVRoaXMgaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byBAY29kZXsuc2hvcnR9LgotCi1AY2luZGV4IEBjb2Rle253b3JkfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAubndvcmQKLU9uIHRoZSBTcGFyYywgdGhlIEBjb2Rley5ud29yZH0gZGlyZWN0aXZlIHByb2R1Y2VzIG5hdGl2ZSB3b3JkIHNpemVkIHZhbHVlLAotaWUuIGlmIGFzc2VtYmxpbmcgd2l0aCAtMzIgaXQgaXMgZXF1aXZhbGVudCB0byBAY29kZXsud29yZH0sIGlmIGFzc2VtYmxpbmcKLXdpdGggLTY0IGl0IGlzIGVxdWl2YWxlbnQgdG8gQGNvZGV7Lnh3b3JkfS4KLQotQGNpbmRleCBAY29kZXtwcm9jfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAucHJvYwotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZC4gIEFueSB0ZXh0IGZvbGxvd2luZyBpdCBvbiB0aGUgc2FtZQotbGluZSBpcyBhbHNvIGlnbm9yZWQuCi0KLUBjaW5kZXggQGNvZGV7cmVnaXN0ZXJ9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5yZWdpc3RlcgotVGhpcyBkaXJlY3RpdmUgZGVjbGFyZXMgdXNlIG9mIGEgZ2xvYmFsIGFwcGxpY2F0aW9uIG9yIHN5c3RlbSByZWdpc3Rlci4KLUl0IG11c3QgYmUgZm9sbG93ZWQgYnkgYSByZWdpc3RlciBuYW1lICVnMiwgJWczLCAlZzYgb3IgJWc3LCBjb21tYSBhbmQKLXRoZSBzeW1ib2wgbmFtZSBmb3IgdGhhdCByZWdpc3Rlci4gIElmIHN5bWJvbCBuYW1lIGlzIEBjb2RleyNzY3JhdGNofSwKLWl0IGlzIGEgc2NyYXRjaCByZWdpc3RlciwgaWYgaXQgaXMgQGNvZGV7I2lnbm9yZX0sIGl0IGp1c3Qgc3VycHJlc3NlcyBhbnkKLWVycm9ycyBhYm91dCB1c2luZyB1bmRlY2xhcmVkIGdsb2JhbCByZWdpc3RlciwgYnV0IGRvZXMgbm90IGVtaXQgYW55Ci1pbmZvcm1hdGlvbiBhYm91dCBpdCBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBlLmcuIGlmIHlvdQotc2F2ZSB0aGUgcmVnaXN0ZXIgYmVmb3JlIHVzZSBhbmQgcmVzdG9yZSBpdCBhZnRlci4KLQotQGNpbmRleCBAY29kZXtyZXNlcnZlfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAucmVzZXJ2ZQotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3ltYm9sIG5hbWUsIGEgcG9zaXRpdmUgbnVtYmVyLCBhbmQKLUBjb2RleyJic3MifS4gIFRoaXMgYmVoYXZlcyBzb21ld2hhdCBsaWtlIEBjb2Rley5sY29tbX0sIGJ1dCB0aGUKLXN5bnRheCBpcyBkaWZmZXJlbnQuCi0KLUBjaW5kZXggQGNvZGV7c2VnfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAuc2VnCi1UaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgQGNvZGV7InRleHQifSwgQGNvZGV7ImRhdGEifSwgb3IKLUBjb2RleyJkYXRhMSJ9LiAgSXQgYmVoYXZlcyBsaWtlIEBjb2Rley50ZXh0fSwgQGNvZGV7LmRhdGF9LCBvcgotQGNvZGV7LmRhdGEgMX0uCi0KLUBjaW5kZXggQGNvZGV7c2tpcH0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnNraXAKLVRoaXMgaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuCi0KLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLndvcmQKLU9uIHRoZSBTcGFyYywgdGhlIEBjb2Rley53b3JkfSBkaXJlY3RpdmUgcHJvZHVjZXMgMzIgYml0IHZhbHVlcywKLWluc3RlYWQgb2YgdGhlIDE2IGJpdCB2YWx1ZXMgaXQgcHJvZHVjZXMgb24gbWFueSBvdGhlciBtYWNoaW5lcy4KLQotQGNpbmRleCBAY29kZXt4d29yZH0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnh3b3JkCi1PbiB0aGUgU3BhcmMgVjkgcHJvY2Vzc29yLCB0aGUgQGNvZGV7Lnh3b3JkfSBkaXJlY3RpdmUgcHJvZHVjZXMKLTY0IGJpdCB2YWx1ZXMuCi1AZW5kIHRhYmxlCmRpZmYgLS1naXQgYS9nYXMvZG9jL2Mtdjg1MC50ZXhpIGIvZ2FzL2RvYy9jLXY4NTAudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxNmUwZi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2Mtdjg1MC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotCi1Abm9kZSBWODUwLURlcGVuZGVudAotQGNoYXB0ZXIgdjg1MCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBWODUwIHN1cHBvcnQKLUBtZW51Ci0qIFY4NTAgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIFY4NTAgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogVjg1MCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIFY4NTAgRGlyZWN0aXZlczo6ICAgICAgICAgICBWODUwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBWODUwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIFY4NTAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotQGNpbmRleCBWODUwIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMgZm9yIFY4NTAgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMKLWZvciB0aGUgVjg1MCBwcm9jZXNzb3IgZmFtaWx5OgotCi1AY2luZGV4IGNvbW1hbmQgbGluZSBvcHRpb25zLCBWODUwCi1AY2luZGV4IFY4NTAgY29tbWFuZCBsaW5lIG9wdGlvbnMKLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEBjb2Rley13c2lnbmVkX292ZXJmbG93fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtd3NpZ25lZF9vdmVyZmxvdwotQ2F1c2VzIHdhcm5pbmdzIHRvIGJlIHByb2R1Y2VkIHdoZW4gc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3cgdGhlCi1zcGFjZSBhdmFpbGFibGUgZm9yIHRoZW4gd2l0aGluIHRoZWlyIG9wY29kZXMuICBCeSBkZWZhdWx0IHRoaXMgb3B0aW9uCi1pcyBkaXNhYmxlZCBhcyBpdCBpcyBwb3NzaWJsZSB0byByZWNlaXZlIHNwdXJpb3VzIHdhcm5pbmdzIGR1ZSB0byB1c2luZwotZXhhY3QgYml0IHBhdHRlcm5zIGFzIGltbWVkaWF0ZSBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7LXd1bnNpZ25lZF9vdmVyZmxvd30gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAotQGl0ZW0gLXd1bnNpZ25lZF9vdmVyZmxvdwotQ2F1c2VzIHdhcm5pbmdzIHRvIGJlIHByb2R1Y2VkIHdoZW4gdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvdwotdGhlIHNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlbiB3aXRoaW4gdGhlaXIgb3Bjb2Rlcy4gIEJ5IGRlZmF1bHQgdGhpcwotb3B0aW9uIGlzIGRpc2FibGVkIGFzIGl0IGlzIHBvc3NpYmxlIHRvIHJlY2VpdmUgc3B1cmlvdXMgd2FybmluZ3MgZHVlIHRvCi11c2luZyBleGFjdCBiaXQgcGF0dGVybnMgYXMgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXstbXY4NTB9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC1tdjg1MAotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwIHByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgdG8gZGV0ZWN0IGF0dGVtcHRzIHRvIGxpbmsKLXN1Y2ggY29kZSB3aXRoIGNvZGUgYXNzZW1ibGVkIGZvciBvdGhlciBwcm9jZXNzb3JzLgotCi1AY2luZGV4IEBjb2Rley1tdjg1MGV9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC1tdjg1MGUKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MEUgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBjaW5kZXggQGNvZGV7LW12ODUwYW55fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtbXY4NTBhbnkKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MCBwcm9jZXNzb3IgYnV0IHN1cHBvcnQgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZQotZXh0ZW5kZWQgdmFyaWFudHMgb2YgdGhlIHByb2Nlc3MuICBUaGlzIGFsbG93cyB0aGUgcHJvZHVjdGlvbiBvZgotYmluYXJpZXMgdGhhdCBjb250YWluIHRhcmdldCBzcGVjaWZpYyBjb2RlLCBidXQgd2hpY2ggYXJlIGFsc28gaW50ZW5kZWQKLXRvIGJlIHVzZWQgaW4gYSBnZW5lcmljIGZhc2hpb24uICBGb3IgZXhhbXBsZSBsaWJnY2MuYSBjb250YWlucyBnZW5lcmljCi1yb3V0aW5lcyB1c2VkIGJ5IHRoZSBjb2RlIHByb2R1Y2VkIGJ5IEdDQyBmb3IgYWxsIHZlcnNpb25zIG9mIHRoZSB2ODUwCi1hcmNoaXRlY3R1cmUsIHRvZ2V0aGVyIHdpdGggc3VwcG9ydCByb3V0aW5lcyBvbmx5IHVzZWQgYnkgdGhlIFY4NTBFCi1hcmNoaXRlY3R1cmUuCi0KLUBlbmQgdGFibGUKLQotCi1Abm9kZSBWODUwIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBWODUwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIFY4NTAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotQGVuZCBtZW51Ci0KLUBub2RlIFY4NTAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIFY4NTAKLUBjaW5kZXggVjg1MCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHsjfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLUBub2RlIFY4NTAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBWODUwIHJlZ2lzdGVyIG5hbWVzCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBWODUwCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG5hbWVzIGZvciByZWdpc3RlcnM6Ci1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7emVyb30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMAotcjAsIHplcm8KLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMQotcjEKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMgotcjIsIGhwCi1AY2luZGV4IEBjb2Rle3NwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAzCi1yMywgc3AKLUBjaW5kZXggQGNvZGV7Z3B9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDQKLXI0LCBncAotQGNpbmRleCBAY29kZXt0cH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNQotcjUsIHRwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDYKLXI2Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDcKLXI3Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDgKLXI4Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDkKLXI5Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEwCi1yMTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTEKLXIxMQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxMgotcjEyCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEzCi1yMTMKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTQKLXIxNAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNQotcjE1Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE2Ci1yMTYKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTcKLXIxNwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxOAotcjE4Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE5Ci1yMTkKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjAKLXIyMAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMQotcjIxCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDIyCi1yMjIKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjMKLXIyMwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNAotcjI0Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI1Ci1yMjUKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjYKLXIyNgotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNwotcjI3Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI4Ci1yMjgKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjkKLXIyOQotQGNpbmRleCBAY29kZXtlcH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMzAKLXIzMCwgZXAKLUBjaW5kZXggQGNvZGV7bHB9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDMxCi1yMzEsIGxwCi1AY2luZGV4IEBjb2Rle2VpcGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMAotZWlwYwotQGNpbmRleCBAY29kZXtlaXBzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxCi1laXBzdwotQGNpbmRleCBAY29kZXtmZXBjfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDIKLWZlcGMKLUBjaW5kZXggQGNvZGV7ZmVwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMwotZmVwc3cKLUBjaW5kZXggQGNvZGV7ZWNyfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDQKLWVjcgotQGNpbmRleCBAY29kZXtwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgNQotcHN3Ci1AY2luZGV4IEBjb2Rle2N0cGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTYKLWN0cGMKLUBjaW5kZXggQGNvZGV7Y3Rwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTcKLWN0cHN3Ci1AY2luZGV4IEBjb2Rle2RicGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTgKLWRicGMKLUBjaW5kZXggQGNvZGV7ZGJwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTkKLWRicHN3Ci1AY2luZGV4IEBjb2Rle2N0YnB9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMjAKLWN0YnAKLUBlbmQgdGFibGUKLQotQG5vZGUgVjg1MCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgVjg1MCAoQHNje2llZWV9KQotQGNpbmRleCBWODUwIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgVjg1MCBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgVjg1MCBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBWODUwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgVjg1MAotQGNpbmRleCBWODUwIG1hY2hpbmUgZGlyZWN0aXZlcwotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle29mZnNldH0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAub2Zmc2V0IEB2YXJ7PGV4cHJlc3Npb24+fQotTW92ZXMgdGhlIG9mZnNldCBpbnRvIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBhbW91bnQuIAotCi1AY2luZGV4IEBjb2Rle3NlY3Rpb259IGRpcmVjdGl2ZSwgVjg1MAotQGl0ZW0gLnNlY3Rpb24gIm5hbWUiLCA8dHlwZT4KLVRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBzdGFuZGFyZCAuc2VjdGlvbiBkaXJlY3RpdmUuICBJdCBzZXRzIHRoZQotY3VycmVudCBzZWN0aW9uIHRvIGJlIDx0eXBlPiBhbmQgY3JlYXRlcyBhbiBhbGlhcyBmb3IgdGhpcyBzZWN0aW9uCi1jYWxsZWQgIm5hbWUiLiAKLQotQGNpbmRleCBAY29kZXsudjg1MH0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAudjg1MAotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwIHByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgdG8gZGV0ZWN0IGF0dGVtcHRzIHRvIGxpbmsKLXN1Y2ggY29kZSB3aXRoIGNvZGUgYXNzZW1ibGVkIGZvciBvdGhlciBwcm9jZXNzb3JzLgotCi1AY2luZGV4IEBjb2Rley52ODUwZX0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAudjg1MGUKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MEUgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgVjg1MCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggVjg1MCBvcGNvZGVzCi1AY2luZGV4IG9wY29kZXMgZm9yIFY4NTAKLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBWODUwIG9wY29kZXMuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGFsc28gaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIHBzZXVkbyBvcHM6Ci0KLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEBjb2Rle2hpMH0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBoaTAoKQotQ29tcHV0ZXMgdGhlIGhpZ2hlciAxNiBiaXRzIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCBzdG9yZXMgaXQgaW50bwotdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgQHNhbXB7bXVsaGkgaGkwKGhlcmUgLSB0aGVyZSksIHI1LCByNn0KLQotY29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiBsYWJlbHMgJ2hlcmUnIGFuZAotJ3RoZXJlJywgdGFrZXMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhpcyBkaWZmZXJlbmNlLCBzaGlmdHMgaXQgZG93biAxNgotYml0cyBhbmQgdGhlbiBtdXRsaXBsaWVzIGl0IGJ5IHRoZSBsb3dlciAxNiBiaXRzIGluIHJlZ2lzdGVyIDUsIHB1dHRpbmcKLXRoZSByZXN1bHQgaW50byByZWdpc3RlciA2LiAKLQotQGNpbmRleCBAY29kZXtsb30gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBsbygpCi1Db21wdXRlcyB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgc3RvcmVzIGl0IGludG8KLXRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZToKLQotICAgIEBzYW1we2FkZGkgbG8oaGVyZSAtIHRoZXJlKSwgcjUsIHI2fQotCi1jb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGxhYmVscyAnaGVyZScgYW5kCi0ndGhlcmUnLCB0YWtlcyB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGlzIGRpZmZlcmVuY2UgYW5kIGFkZHMgaXQgdG8KLXJlZ2lzdGVyIDUsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbnRvIHJlZ2lzdGVyIDYuCi0KLUBjaW5kZXggQGNvZGV7aGl9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gaGkoKQotQ29tcHV0ZXMgdGhlIGhpZ2hlciAxNiBiaXRzIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCB0aGVuIGFkZHMgdGhlCi12YWx1ZSBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIGV4cHJlc3Npb24KLWFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4KLWluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlCi1hZGRyZXNzIG9mIHRoZSBsYWJlbCAnaGVyZScgYW5kIHN0b3JlIGl0IGludG8gcmVnaXN0ZXIgNjoKLQotICAgIEBzYW1we21vdmhpIGhpKGhlcmUpLCByMCwgcjZ9Ci0gICAgQHNhbXB7bW92ZWEgbG8oaGVyZSksIHI2LCByNn0KLQotVGhlIHJlYXNvbiBmb3IgdGhpcyBzcGVjaWFsIGJlaGF2aW91ciBpcyB0aGF0IG1vdmVhIHBlcmZvcm1zIGEgc2lnbgotZXh0ZW50aW9uIG9uIGl0cyBpbW1lZGlhdGUgb3BlcmFuZC4gIFNvIGZvciBleGFtcGxlIGlmIHRoZSBhZGRyZXNzIG9mCi0naGVyZScgd2FzIDB4RkZGRkZGRkYgdGhlbiB3aXRob3V0IHRoZSBzcGVjaWFsIGJlaGF2aW91ciBvZiB0aGUgaGkoKQotcHNldWRvLW9wIHRoZSBtb3ZoaSBpbnN0cnVjdGlvbiB3b3VsZCBwdXQgMHhGRkZGMDAwMCBpbnRvIHI2LCB0aGVuIHRoZQotbW92ZWEgaW5zdHJ1Y3Rpb24gd291bGQgdGFrZXMgaXRzIGltbWVkaWF0ZSBvcGVyYW5kLCAweEZGRkYsIHNpZ24gZXh0ZW5kCi1pdCB0byAzMiBiaXRzLCAweEZGRkZGRkZGLCBhbmQgdGhlbiBhZGQgaXQgaW50byByNiBnaXZpbmcgMHhGRkZFRkZGRgotd2hpY2ggaXMgd3JvbmcgKHRoZSBmaWZ0aCBuaWJibGUgaXMgRSkuICBXaXRoIHRoZSBoaSgpIHBzZXVkbyBvcCBhZGRpbmcKLWluIHRoZSB0b3AgYml0IG9mIHRoZSBsbygpIHBzZXVkbyBvcCwgdGhlIG1vdmhpIGluc3RydWN0aW9uIGFjdHVhbGx5Ci1zdG9yZXMgMCBpbnRvIHI2ICgweEZGRkYgKyAxID0gMHgwMDAwKSwgc28gdGhhdCB0aGUgbW92ZWEgaW5zdHJ1Y3Rpb24KLXN0b3JlcyAweEZGRkZGRkZGIGludG8gcjYgLSB0aGUgcmlnaHQgdmFsdWUuCi0KLUBjaW5kZXggQGNvZGV7aGlsb30gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBoaWxvKCkKLUNvbXB1dGVzIHRoZSAzMiBiaXQgdmFsdWUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHN0b3JlcyBpdCBpbnRvCi10aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uICh3aGljaCBtdXN0IGJlIGEKLW1vdiBpbnN0cnVjdGlvbikuICBGb3IgZXhhbXBsZToKLQotICAgIEBzYW1we21vdiBoaWxvKGhlcmUpLCByNn0KLQotY29tcHV0ZXMgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgbGFiZWwgJ2hlcmUnIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50bwotcmVnaXN0ZXIgNi4gIAotCi1AY2luZGV4IEBjb2Rle3NkYW9mZn0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBzZGFvZmYoKQotQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFNtYWxsCi1EYXRhIEFyZWEgKHdob2VzIGFkZHJlc3MgaXMgaGVsZCBpbiByZWdpc3RlciA0LCB0aGUgR1AgcmVnaXN0ZXIpIGFuZAotc3RvcmVzIHRoZSByZXN1bHQgYXMgYSAxNiBiaXQgc2lnbmVkIHZhbHVlIGluIHRoZSBpbW1lZGlhdGUgb3BlcmFuZAotZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6IAotCi0gICAgICBAc2FtcHtsZC53IHNkYW9mZihfYV92YXJpYWJsZSlbZ3BdLHI2fQotCi1sb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIGxhYmVsICdfYV92YXJpYWJsZScKLWludG8gcmVnaXN0ZXIgNiwgcHJvdmlkZWQgdGhhdCB0aGUgbGFiZWwgaXMgbG9jYXRlZCBzb21ld2hlcmUgd2l0aGluICsvLQotMzJLIG9mIHRoZSBhZGRyZXNzIGhlbGQgaW4gdGhlIEdQIHJlZ2lzdGVyLiAgW05vdGUgdGhlIGxpbmtlciBhc3N1bWVzCi10aGF0IHRoZSBHUCByZWdpc3RlciBjb250YWlucyBhIGZpeGVkIGFkZHJlc3Mgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZQotbGFiZWwgY2FsbGVkICdfX2dwJy4gIFRoaXMgY2FuIGVpdGhlciBiZSBzZXQgdXAgYXV0b21hdGljYWxseSBieSB0aGUKLWxpbmtlciwgb3Igc3BlY2lmaWNhbGx5IHNldCBieSB1c2luZyB0aGUgQHNhbXB7LS1kZWZzeW0gX19ncD08dmFsdWU+fQotY29tbWFuZCBsaW5lIG9wdGlvbl0uCi0KLUBjaW5kZXggQGNvZGV7dGRhb2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIHRkYW9mZigpCi1Db21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgVGlueQotRGF0YSBBcmVhICh3aG9lcyBhZGRyZXNzIGlzIGhlbGQgaW4gcmVnaXN0ZXIgMzAsIHRoZSBFUCByZWdpc3RlcikgYW5kCi1zdG9yZXMgdGhlIHJlc3VsdCBhcyBhIDQsNSwgNyBvciA4IGJpdCB1bnNpZ25lZCB2YWx1ZSBpbiB0aGUgaW1tZWRpYXRlCi1vcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgICBAc2FtcHtzbGQudyB0ZGFvZmYoX2FfdmFyaWFibGUpW2VwXSxyNn0KLQotbG9hZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBsYWJlbCAnX2FfdmFyaWFibGUnCi1pbnRvIHJlZ2lzdGVyIDYsIHByb3ZpZGVkIHRoYXQgdGhlIGxhYmVsIGlzIGxvY2F0ZWQgc29tZXdoZXJlIHdpdGhpbiArMjU2Ci1ieXRlcyBvZiB0aGUgYWRkcmVzcyBoZWxkIGluIHRoZSBFUCByZWdpc3Rlci4gIFtOb3RlIHRoZSBsaW5rZXIgYXNzdW1lcwotdGhhdCB0aGUgRVAgcmVnaXN0ZXIgY29udGFpbnMgYSBmaXhlZCBhZGRyZXNzIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUKLWxhYmVsIGNhbGxlZCAnX19lcCcuICBUaGlzIGNhbiBlaXRoZXIgYmUgc2V0IHVwIGF1dG9tYXRpY2FsbHkgYnkgdGhlCi1saW5rZXIsIG9yIHNwZWNpZmljYWxseSBzZXQgYnkgdXNpbmcgdGhlIEBzYW1wey0tZGVmc3ltIF9fZXA9PHZhbHVlPn0KLWNvbW1hbmQgbGluZSBvcHRpb25dLgotCi1AY2luZGV4IEBjb2Rle3pkYW9mZn0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSB6ZGFvZmYoKQotQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSBhZGRyZXNzIDAgYW5kIHN0b3JlcyB0aGUKLXJlc3VsdCBhcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUgaW4gdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZQotZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZToKLQotICAgICAgQHNhbXB7bW92ZWEgemRhb2ZmKF9hX3ZhcmlhYmxlKSx6ZXJvLHI2fQotCi1wdXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBsYWJlbCAnX2FfdmFyaWFibGUnIGludG8gcmVnaXN0ZXIgNiwgYXNzdW1pbmcKLXRoYXQgdGhlIGxhYmVsIGlzIHNvbWV3aGVyZSB3aXRoaW4gdGhlIGZpcnN0IDMySyBvZiBtZW1vcnkuICAoU3RyaWN0bHkKLXNwZWFraW5nIGl0IGFsc28gcG9zc2libGUgdG8gYWNjZXNzIHRoZSBsYXN0IDMySyBvZiBtZW1vcnkgYXMgd2VsbCwgYXMKLXRoZSBvZmZzZXRzIGFyZSBzaWduZWQpLgotCi1AY2luZGV4IEBjb2Rle2N0b2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGN0b2ZmKCkKLUNvbXB1dGVzIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWVkIHZhcmlhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBDYWxsCi1UYWJsZSBBcmVhICh3aG9lcyBhZGRyZXNzIGlzIGhlbGcgaW4gc3lzdGVtIHJlZ2lzdGVyIDIwLCB0aGUgQ1RCUAotcmVnaXN0ZXIpIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBhIDYgb3IgMTYgYml0IHVuc2lnbmVkIHZhbHVlIGluIHRoZQotaW1tZWRpYXRlIGZpZWxkIG9mIHRoZW4gZ2l2ZW4gaW5zdHJ1Y3Rpb24gb3IgcGllY2Ugb2YgZGF0YS4gIEZvcgotZXhhbXBsZToKLQotICAgICBAc2FtcHtjYWxsdCBjdG9mZih0YWJsZV9mdW5jMSl9Ci0KLXdpbGwgcHV0IHRoZSBjYWxsIHRoZSBmdW5jdGlvbiB3aG9lcyBhZGRyZXNzIGlzIGhlbGQgaW4gdGhlIGNhbGwgdGFibGUKLWF0IHRoZSBsb2NhdGlvbiBsYWJlbGVkICd0YWJsZV9mdW5jMScuCi0KLUBlbmQgdGFibGUKLQotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIFY4NTAgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7Vjg1MAotRmFtaWx5IDMyLS8xNi1CaXQgc2luZ2xlLUNoaXAgTWljcm9jb250cm9sbGVyIEFyY2hpdGVjdHVyZSBNYW51YWx9IGZyb20gTkVDLgotTHRkLgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtdmF4LnRleGkgYi9nYXMvZG9jL2MtdmF4LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxM2Q3ZTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXZheC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AYyBWQVgvVk1TIGRlc2NyaXB0aW9uIGV4aGFuY2VkIGFuZCBjb3JyZWN0ZWQgYnkgS2xhdXMgSyJhZW1wZiwga2thZW1wZkBwcm9naXMuZGUKLUBpZnNldCBHRU5FUklDCi1Abm9kZSBWYXgtRGVwZW5kZW50Ci1AY2hhcHRlciBWQVggRGVwZW5kZW50IEZlYXR1cmVzCi1AY2luZGV4IFZBWCBzdXBwb3J0Ci0KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBWQVggRGVwZW5kZW50IEZlYXR1cmVzCi1AY2luZGV4IFZBWCBzdXBwb3J0Ci0KLUBlbmQgaWZjbGVhcgotCi1AbWVudQotKiBWQVgtT3B0czo6ICAgICAgICAgICAgICAgICAgICBWQVggQ29tbWFuZC1MaW5lIE9wdGlvbnMKLSogVkFYLWZsb2F0OjogICAgICAgICAgICAgICAgICAgVkFYIEZsb2F0aW5nIFBvaW50Ci0qIFZBWC1kaXJlY3RpdmVzOjogICAgICAgICAgICAgIFZheCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogVkFYLW9wY29kZXM6OiAgICAgICAgICAgICAgICAgVkFYIE9wY29kZXMKLSogVkFYLWJyYW5jaDo6ICAgICAgICAgICAgICAgICAgVkFYIEJyYW5jaCBJbXByb3ZlbWVudAotKiBWQVgtb3BlcmFuZHM6OiAgICAgICAgICAgICAgICBWQVggT3BlcmFuZHMKLSogVkFYLW5vOjogICAgICAgICAgICAgICAgICAgICAgTm90IFN1cHBvcnRlZCBvbiBWQVgKLUBlbmQgbWVudQotCi0KLUBub2RlIFZBWC1PcHRzCi1Ac2VjdGlvbiBWQVggQ29tbWFuZC1MaW5lIE9wdGlvbnMKLQotQGNpbmRleCBjb21tYW5kLWxpbmUgb3B0aW9ucyBpZ25vcmVkLCBWQVgKLUBjaW5kZXggVkFYIGNvbW1hbmQtbGluZSBvcHRpb25zIGlnbm9yZWQKLVRoZSBWYXggdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMsCi1naXZlcyBhIHdhcm5pbmcgbWVzc2FnZSB0aGF0IHRoZSBvcHRpb24gd2FzIGlnbm9yZWQgYW5kIHByb2NlZWRzLgotVGhlc2Ugb3B0aW9ucyBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzY3JpcHRzIGRlc2lnbmVkIGZvciBvdGhlcgotcGVvcGxlJ3MgYXNzZW1ibGVycy4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1EfSwgaWdub3JlZCBvbiBWQVgKLUBjaW5kZXggQGNvZGV7LVN9LCBpZ25vcmVkIG9uIFZBWAotQGNpbmRleCBAY29kZXstVH0sIGlnbm9yZWQgb24gVkFYCi1AaXRlbSBAY29kZXstRH0gKERlYnVnKQotQGl0ZW14IEBjb2Rley1TfSAoU3ltYm9sIFRhYmxlKQotQGl0ZW14IEBjb2Rley1UfSAoVG9rZW4gVHJhY2UpCi1UaGVzZSBhcmUgb2Jzb2xldGUgb3B0aW9ucyB1c2VkIHRvIGRlYnVnIG9sZCBhc3NlbWJsZXJzLgotCi1AY2luZGV4IEBjb2Rley1kfSwgVkFYIG9wdGlvbgotQGl0ZW0gQGNvZGV7LWR9IChEaXNwbGFjZW1lbnQgc2l6ZSBmb3IgSlVNUHMpCi1UaGlzIG9wdGlvbiBleHBlY3RzIGEgbnVtYmVyIGZvbGxvd2luZyB0aGUgQHNhbXB7LWR9LiAgTGlrZSBvcHRpb25zCi10aGF0IGV4cGVjdCBmaWxlbmFtZXMsIHRoZSBudW1iZXIgbWF5IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUKLUBzYW1wey1kfSAob2xkIHN0YW5kYXJkKSBvciBjb25zdGl0dXRlIHRoZSB3aG9sZSBvZiB0aGUgY29tbWFuZCBsaW5lCi1hcmd1bWVudCB0aGF0IGZvbGxvd3MgQHNhbXB7LWR9IChAc2N7Z251fSBzdGFuZGFyZCkuCi0KLUBjaW5kZXggQGNvZGV7LVZ9LCByZWR1bmRhbnQgb24gVkFYCi1AaXRlbSBAY29kZXstVn0gKFZpcnR1YWxpemUgSW50ZXJwYXNzIFRlbXBvcmFyeSBGaWxlKQotU29tZSBvdGhlciBhc3NlbWJsZXJzIHVzZSBhIHRlbXBvcmFyeSBmaWxlLiAgVGhpcyBvcHRpb24KLWNvbW1hbmRlZCB0aGVtIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIGluIGFjdGl2ZSBtZW1vcnkgcmF0aGVyCi10aGFuIGluIGEgZGlzayBmaWxlLiAgQGNvZGV7QHZhbHVle0FTfX0gYWx3YXlzIGRvZXMgdGhpcywgc28gdGhpcwotb3B0aW9uIGlzIHJlZHVuZGFudC4KLQotQGNpbmRleCBAY29kZXstSn0sIGlnbm9yZWQgb24gVkFYCi1AaXRlbSBAY29kZXstSn0gKEpVTVBpZnkgTG9uZ2VyIEJyYW5jaGVzKQotTWFueSAzMi1iaXQgY29tcHV0ZXJzIHBlcm1pdCBhIHZhcmlldHkgb2YgYnJhbmNoIGluc3RydWN0aW9ucwotdG8gZG8gdGhlIHNhbWUgam9iLiAgU29tZSBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgYXJlIHNob3J0IChhbmQKLWZhc3QpIGJ1dCBoYXZlIGEgbGltaXRlZCByYW5nZTsgb3RoZXJzIGFyZSBsb25nIChhbmQgc2xvdykgYnV0Ci1jYW4gYnJhbmNoIGFueXdoZXJlIGluIHZpcnR1YWwgbWVtb3J5LiAgT2Z0ZW4gdGhlcmUgYXJlIDMKLWZsYXZvcnMgb2YgYnJhbmNoOiBzaG9ydCwgbWVkaXVtIGFuZCBsb25nLiAgU29tZSBvdGhlcgotYXNzZW1ibGVycyB3b3VsZCBlbWl0IHNob3J0IGFuZCBtZWRpdW0gYnJhbmNoZXMsIHVubGVzcyB0b2xkIGJ5Ci10aGlzIG9wdGlvbiB0byBlbWl0IHNob3J0IGFuZCBsb25nIGJyYW5jaGVzLgotCi1AY2luZGV4IEBjb2Rley10fSwgaWdub3JlZCBvbiBWQVgKLUBpdGVtIEBjb2Rley10fSAoVGVtcG9yYXJ5IEZpbGUgRGlyZWN0b3J5KQotU29tZSBvdGhlciBhc3NlbWJsZXJzIG1heSB1c2UgYSB0ZW1wb3JhcnkgZmlsZSwgYW5kIHRoaXMgb3B0aW9uCi10YWtlcyBhIGZpbGVuYW1lIGJlaW5nIHRoZSBkaXJlY3RvcnkgdG8gc2l0ZSB0aGUgdGVtcG9yYXJ5Ci1maWxlLiAgU2luY2UgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QgdXNlIGEgdGVtcG9yYXJ5IGRpc2sgZmlsZSwgdGhpcwotb3B0aW9uIG1ha2VzIG5vIGRpZmZlcmVuY2UuICBAc2FtcHstdH0gbmVlZHMgZXhhY3RseSBvbmUKLWZpbGVuYW1lLgotQGVuZCB0YWJsZQotCi1AY2luZGV4IFZNUyAoVkFYKSBvcHRpb25zCi1AY2luZGV4IG9wdGlvbnMgZm9yIFZBWC9WTVMKLUBjaW5kZXggVkFYL1ZNUyBvcHRpb25zCi1AY2luZGV4IFZheC0xMSBDIGNvbXBhdGliaWxpdHkKLUBjaW5kZXggc3ltYm9scyB3aXRoIHVwcGVyY2FzZSwgVkFYL1ZNUwotVGhlIFZheCB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgYWNjZXB0cyBhZGRpdGlvbmFsIG9wdGlvbnMgd2hlbgotY29tcGlsZWQgZm9yIFZNUzoKLQotQHRhYmxlIEBzYW1wCi1AY2luZGV4IEBzYW1wey1ofSBvcHRpb24sIFZBWC9WTVMKLUBpdGVtIC1oIEB2YXJ7bn0KLUV4dGVybmFsIHN5bWJvbCBvciBzZWN0aW9uICh1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzKSBuYW1lcyBhcmUgbm90Ci1jYXNlIHNlbnNpdGl2ZSBvbiBWQVgvVk1TIGFuZCBhbHdheXMgbWFwcGVkIHRvIHVwcGVyIGNhc2UuICBUaGlzIGlzCi1jb250cmFyeSB0byB0aGUgQyBsYW5ndWFnZSBkZWZpbml0aW9uIHdoaWNoIGV4cGxpY2l0bHkgZGlzdGluZ3Vpc2hlcwotdXBwZXIgYW5kIGxvd2VyIGNhc2UuICBUbyBpbXBsZW1lbnQgYSBzdGFuZGFyZCBjb25mb3JtaW5nIEMgY29tcGlsZXIsCi1uYW1lcyBtdXN0IGJlIGNoYW5nZWQgKG1hcHBlZCkgdG8gcHJlc2VydmUgdGhlIGNhc2UgaW5mb3JtYXRpb24uICBUaGUKLWRlZmF1bHQgbWFwcGluZyBpcyB0byBjb252ZXJ0IGFsbCBsb3dlciBjYXNlIGNoYXJhY3RlcnMgdG8gdXBwZXJjYXNlIGFuZAotYWRkaW5nIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYSA2IGRpZ2l0IGhleCB2YWx1ZSwgcmVwcmVzZW50aW5nIGEgMjQKLWRpZ2l0IGJpbmFyeSB2YWx1ZS4gIFRoZSBvbmUgZGlnaXRzIGluIHRoZSBiaW5hcnkgdmFsdWUgcmVwcmVzZW50IHdoaWNoCi1jaGFyYWN0ZXJzIGFyZSB1cHBlcmNhc2UgaW4gdGhlIG9yaWdpbmFsIHN5bWJvbCBuYW1lLgotCi1UaGUgQHNhbXB7LWggQHZhcntufX0gb3B0aW9uIGRldGVybWluZXMgaG93IHdlIG1hcCBuYW1lcy4gIFRoaXMgdGFrZXMKLXNldmVyYWwgdmFsdWVzLiAgTm8gQHNhbXB7LWh9IHN3aXRjaCBhdCBhbGwgYWxsb3dzIGNhc2UgaGFja2luZyBhcwotZGVzY3JpYmVkIGFib3ZlLiAgQSB2YWx1ZSBvZiB6ZXJvIChAc2FtcHstaDB9KSBpbXBsaWVzIG5hbWVzIHNob3VsZCBiZQotdXBwZXIgY2FzZSwgYW5kIGluaGliaXRzIHRoZSBjYXNlIGhhY2suICBBIHZhbHVlIG9mIDIgKEBzYW1wey1oMn0pCi1pbXBsaWVzIG5hbWVzIHNob3VsZCBiZSBhbGwgbG93ZXIgY2FzZSwgd2l0aCBubyBjYXNlIGhhY2suICBBIHZhbHVlIG9mIDMKLShAc2FtcHstaDN9KSBpbXBsaWVzIHRoYXQgY2FzZSBzaG91bGQgYmUgcHJlc2VydmVkLiAgVGhlIHZhbHVlIDEgaXMKLXVudXNlZC4gIFRoZSBAY29kZXstSH0gb3B0aW9uIGRpcmVjdHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZGlzcGxheQotZXZlcnkgbWFwcGVkIHN5bWJvbCBkdXJpbmcgYXNzZW1ibHkuCi0KLVN5bWJvbHMgd2hvc2UgbmFtZXMgaW5jbHVkZSBhIGRvbGxhciBzaWduIEBzYW1weyR9IGFyZSBleGNlcHRpb25zIHRvIHRoZQotZ2VuZXJhbCBuYW1lIG1hcHBpbmcuICBUaGVzZSBzeW1ib2xzIGFyZSBub3JtYWxseSBvbmx5IHVzZWQgdG8gcmVmZXJlbmNlCi1WTVMgbGlicmFyeSBuYW1lcy4gIFN1Y2ggc3ltYm9scyBhcmUgYWx3YXlzIG1hcHBlZCB0byB1cHBlciBjYXNlLgotCi1AY2luZGV4IEBzYW1wey0rfSBvcHRpb24sIFZBWC9WTVMKLUBpdGVtIC0rCi1UaGUgQHNhbXB7LSt9IG9wdGlvbiBjYXVzZXMgQGNvZGV7QHZhbHVle0FTfX0gdG8gdHJ1bmNhdGUgYW55IHN5bWJvbAotbmFtZSBsYXJnZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLiAgVGhlIEBzYW1wey0rfSBvcHRpb24gYWxzbyBwcmV2ZW50cyBzb21lCi1jb2RlIGZvbGxvd2luZyB0aGUgQHNhbXB7X21haW59IHN5bWJvbCBub3JtYWxseSBhZGRlZCB0byBtYWtlIHRoZSBvYmplY3QKLWZpbGUgY29tcGF0aWJsZSB3aXRoIFZheC0xMSAiQyIuCi0KLUBjaW5kZXggQHNhbXB7LTF9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLTEKLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBAY29kZXtAdmFsdWV7QVN9fQotdmVyc2lvbiAxLnguCi0KLUBjaW5kZXggQHNhbXB7LUh9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLUgKLVRoZSBAc2FtcHstSH0gb3B0aW9uIGNhdXNlcyBAY29kZXtAdmFsdWV7QVN9fSB0byBwcmludCBldmVyeSBzeW1ib2wKLXdoaWNoIHdhcyBjaGFuZ2VkIGJ5IGNhc2UgbWFwcGluZy4KLUBlbmQgdGFibGUKLQotQG5vZGUgVkFYLWZsb2F0Ci1Ac2VjdGlvbiBWQVggRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBWQVggZmxvYXRpbmcgcG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIFZBWAotQ29udmVyc2lvbiBvZiBmbG9udW1zIHRvIGZsb2F0aW5nIHBvaW50IGlzIGNvcnJlY3QsIGFuZAotY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIGFzc2VtYmxlcnMuICBSb3VuZGluZyBpcwotdG93YXJkcyB6ZXJvIGlmIHRoZSByZW1haW5kZXIgaXMgZXhhY3RseSBoYWxmIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuCi0KLUBjb2Rle0R9LCBAY29kZXtGfSwgQGNvZGV7R30gYW5kIEBjb2Rle0h9IGZsb2F0aW5nIHBvaW50IGZvcm1hdHMKLWFyZSB1bmRlcnN0b29kLgotCi1JbW1lZGlhdGUgZmxvYXRpbmcgbGl0ZXJhbHMgKEBlbXBoe2UuZy59IEBzYW1we1NgJDYuOX0pCi1hcmUgcmVuZGVyZWQgY29ycmVjdGx5LiAgQWdhaW4sIHJvdW5kaW5nIGlzIHRvd2FyZHMgemVybyBpbiB0aGUKLWJvdW5kYXJ5IGNhc2UuCi0KLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlLCBWQVgKLVRoZSBAY29kZXsuZmxvYXR9IGRpcmVjdGl2ZSBwcm9kdWNlcyBAY29kZXtmfSBmb3JtYXQgbnVtYmVycy4KLVRoZSBAY29kZXsuZG91YmxlfSBkaXJlY3RpdmUgcHJvZHVjZXMgQGNvZGV7ZH0gZm9ybWF0IG51bWJlcnMuCi0KLUBub2RlIFZBWC1kaXJlY3RpdmVzCi1Ac2VjdGlvbiBWYXggTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBWQVgKLUBjaW5kZXggVkFYIG1hY2hpbmUgZGlyZWN0aXZlcwotVGhlIFZheCB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgc3VwcG9ydHMgZm91ciBkaXJlY3RpdmVzIGZvcgotZ2VuZXJhdGluZyBWYXggZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLiAgVGhleSBhcmUgZGVzY3JpYmVkIGluIHRoZQotdGFibGUgYmVsb3cuCi0KLUBjaW5kZXggd2lkZSBmbG9hdGluZyBwb2ludCBkaXJlY3RpdmVzLCBWQVgKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtkZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuZGZsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtkfSBmb3JtYXQgNjQtYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtmZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuZmZsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtmfSBmb3JtYXQgMzItYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtnZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuZ2Zsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtnfSBmb3JtYXQgNjQtYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtoZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuaGZsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtofSBmb3JtYXQgMTI4LWJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgVkFYLW9wY29kZXMKLUBzZWN0aW9uIFZBWCBPcGNvZGVzCi0KLUBjaW5kZXggVkFYIG9wY29kZSBtbmVtb25pY3MKLUBjaW5kZXggb3Bjb2RlIG1uZW1vbmljcywgVkFYCi1AY2luZGV4IG1uZW1vbmljcyBmb3Igb3Bjb2RlcywgVkFYCi1BbGwgREVDIG1uZW1vbmljcyBhcmUgc3VwcG9ydGVkLiAgQmV3YXJlIHRoYXQgQGNvZGV7Y2FzZUBkb3Rze319Ci1pbnN0cnVjdGlvbnMgaGF2ZSBleGFjdGx5IDMgb3BlcmFuZHMuICBUaGUgZGlzcGF0Y2ggdGFibGUgdGhhdAotZm9sbG93cyB0aGUgQGNvZGV7Y2FzZUBkb3Rze319IGluc3RydWN0aW9uIHNob3VsZCBiZSBtYWRlIHdpdGgKLUBjb2Rley53b3JkfSBzdGF0ZW1lbnRzLiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggYWxsIHVuaXgKLWFzc2VtYmxlcnMgd2Uga25vdyBvZi4KLQotQG5vZGUgVkFYLWJyYW5jaAotQHNlY3Rpb24gVkFYIEJyYW5jaCBJbXByb3ZlbWVudAotCi1AY2luZGV4IFZBWCBicmFuY2ggaW1wcm92ZW1lbnQKLUBjaW5kZXggYnJhbmNoIGltcHJvdmVtZW50LCBWQVgKLUBjaW5kZXggcHNldWRvLW9wcyBmb3IgYnJhbmNoLCBWQVgKLUNlcnRhaW4gcHNldWRvIG9wY29kZXMgYXJlIHBlcm1pdHRlZC4gIFRoZXkgYXJlIGZvciBicmFuY2gKLWluc3RydWN0aW9ucy4gIFRoZXkgZXhwYW5kIHRvIHRoZSBzaG9ydGVzdCBicmFuY2ggaW5zdHJ1Y3Rpb24gdGhhdAotcmVhY2hlcyB0aGUgdGFyZ2V0LiAgR2VuZXJhbGx5IHRoZXNlIG1uZW1vbmljcyBhcmUgbWFkZSBieQotc3Vic3RpdHV0aW5nIEBzYW1we2p9IGZvciBAc2FtcHtifSBhdCB0aGUgc3RhcnQgb2YgYSBERUMgbW5lbW9uaWMuCi1UaGlzIGZlYXR1cmUgaXMgaW5jbHVkZWQgYm90aCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgdG8gaGVscAotY29tcGlsZXJzLiAgSWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgZmVhdHVyZSwgYXZvaWQgdGhlc2UKLW9wY29kZXMuICBIZXJlIGFyZSB0aGUgbW5lbW9uaWNzLCBhbmQgdGhlIGNvZGUgdGhleSBjYW4gZXhwYW5kIGludG8uCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gamJzYgotQHNhbXB7SnNifSBpcyBhbHJlYWR5IGFuIGluc3RydWN0aW9uIG1uZW1vbmljLCBzbyB3ZSBjaG9zZSBAc2FtcHtqYnNifS4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQotQGtiZHtic2JiIEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JzYncgQGRvdHN7fX0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBrYmR7anNiIEBkb3Rze319Ci1AZW5kIHRhYmxlCi1AaXRlbSBqYnIKLUBpdGVteCBqcgotVW5jb25kaXRpb25hbCBicmFuY2guCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7YnJiIEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JydyBAZG90c3t9fQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGtiZHtqbXAgQGRvdHN7fX0KLUBlbmQgdGFibGUKLUBpdGVtIGpAdmFye0NPTkR9Ci1AdmFye0NPTkR9IG1heSBiZSBhbnkgb25lIG9mIHRoZSBjb25kaXRpb25hbCBicmFuY2hlcwotQGNvZGV7bmVxfSwgQGNvZGV7bmVxdX0sIEBjb2Rle2VxbH0sIEBjb2Rle2VxbHV9LCBAY29kZXtndHJ9LAotQGNvZGV7Z2VxfSwgQGNvZGV7bHNzfSwgQGNvZGV7Z3RydX0sIEBjb2Rle2xlcXV9LCBAY29kZXt2Y30sIEBjb2Rle3ZzfSwKLUBjb2Rle2dlcXV9LCBAY29kZXtjY30sIEBjb2Rle2xzc3V9LCBAY29kZXtjc30uCi1AdmFye0NPTkR9IG1heSBhbHNvIGJlIG9uZSBvZiB0aGUgYml0IHRlc3RzCi1AY29kZXtic30sIEBjb2Rle2JjfSwgQGNvZGV7YnNzfSwgQGNvZGV7YmNzfSwgQGNvZGV7YnNjfSwgQGNvZGV7YmNjfSwKLUBjb2Rle2Jzc2l9LCBAY29kZXtiY2NpfSwgQGNvZGV7bGJzfSwgQGNvZGV7bGJjfS4KLUB2YXJ7Tk9UQ09ORH0gaXMgdGhlIG9wcG9zaXRlIGNvbmRpdGlvbiB0byBAdmFye0NPTkR9LgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JAdmFye0NPTkR9IEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JAdmFye05PVENPTkR9IGZvbyA7IGJydyBAZG90c3t9IDsgZm9vOn0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBrYmR7YkB2YXJ7Tk9UQ09ORH0gZm9vIDsgam1wIEBkb3Rze30gOyBmb286fQotQGVuZCB0YWJsZQotQGl0ZW0gamFjYkB2YXJ7WH0KLUB2YXJ7WH0gbWF5IGJlIG9uZSBvZiBAY29kZXtiIGQgZiBnIGggbCB3fS4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGtiZHtAdmFye09QQ09ERX0gQGRvdHN7fX0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBqbXAgQGRvdHN7fSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLUBpdGVtIGphb2JAdmFye1lZWX0KLUB2YXJ7WVlZfSBtYXkgYmUgb25lIG9mIEBjb2Rle2xzcyBsZXF9LgotQGl0ZW0ganNvYkB2YXJ7WlpafQotQHZhcntaWlp9IG1heSBiZSBvbmUgb2YgQGNvZGV7Z2VxIGd0cn0uCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7QHZhcntPUENPREV9IEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1AZXhhbXBsZQotQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7Ci1icmIgYmFyIDsKLWZvbzogYnJ3IEB2YXJ7ZGVzdGluYXRpb259IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGptcCBAdmFye2Rlc3RpbmF0aW9ufSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLUBpdGVtIGFvYmxlcQotQGl0ZW14IGFvYmxzcwotQGl0ZW14IHNvYmdlcQotQGl0ZW14IHNvYmd0cgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke0B2YXJ7T1BDT0RFfSBAZG90c3t9fQotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGJydyBAdmFye2Rlc3RpbmF0aW9ufSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBqbXAgQHZhcntkZXN0aW5hdGlvbn0gOwotYmFyOgotQGVuZCBleGFtcGxlCi1AZW5kIHRhYmxlCi1AZW5kIHRhYmxlCi0KLUBub2RlIFZBWC1vcGVyYW5kcwotQHNlY3Rpb24gVkFYIE9wZXJhbmRzCi0KLUBjaW5kZXggVkFYIG9wZXJhbmQgbm90YXRpb24KLUBjaW5kZXggb3BlcmFuZCBub3RhdGlvbiwgVkFYCi1AY2luZGV4IGltbWVkaWF0ZSBjaGFyYWN0ZXIsIFZBWAotQGNpbmRleCBWQVggaW1tZWRpYXRlIGNoYXJhY3RlcgotVGhlIGltbWVkaWF0ZSBjaGFyYWN0ZXIgaXMgQHNhbXB7JH0gZm9yIFVuaXggY29tcGF0aWJpbGl0eSwgbm90Ci1Ac2FtcHsjfSBhcyBERUMgd3JpdGVzIGl0LgotCi1AY2luZGV4IGluZGlyZWN0IGNoYXJhY3RlciwgVkFYCi1AY2luZGV4IFZBWCBpbmRpcmVjdCBjaGFyYWN0ZXIKLVRoZSBpbmRpcmVjdCBjaGFyYWN0ZXIgaXMgQHNhbXB7Kn0gZm9yIFVuaXggY29tcGF0aWJpbGl0eSwgbm90Ci1Ac2FtcHtAQH0gYXMgREVDIHdyaXRlcyBpdC4KLQotQGNpbmRleCBkaXNwbGFjZW1lbnQgc2l6aW5nIGNoYXJhY3RlciwgVkFYCi1AY2luZGV4IFZBWCBkaXNwbGFjZW1lbnQgc2l6aW5nIGNoYXJhY3RlcgotVGhlIGRpc3BsYWNlbWVudCBzaXppbmcgY2hhcmFjdGVyIGlzIEBzYW1we2B9IChhbiBhY2NlbnQgZ3JhdmUpIGZvcgotVW5peCBjb21wYXRpYmlsaXR5LCBub3QgQHNhbXB7Xn0gYXMgREVDIHdyaXRlcyBpdC4gIFRoZSBsZXR0ZXIKLXByZWNlZGluZyBAc2FtcHtgfSBtYXkgaGF2ZSBlaXRoZXIgY2FzZS4gIEBzYW1we0d9IGlzIG5vdAotdW5kZXJzdG9vZCwgYnV0IGFsbCBvdGhlciBsZXR0ZXJzIChAY29kZXtiIGkgbCBzIHd9KSBhcmUgdW5kZXJzdG9vZC4KLQotQGNpbmRleCByZWdpc3RlciBuYW1lcywgVkFYCi1AY2luZGV4IFZBWCByZWdpc3RlciBuYW1lcwotUmVnaXN0ZXIgbmFtZXMgdW5kZXJzdG9vZCBhcmUgQGNvZGV7cjAgcjEgcjIgQGRvdHN7fSByMTUgYXAgZnAgc3AKLXBjfS4gIFVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMgYXJlIGVxdWl2YWxlbnQuCi0KLUZvciBpbnN0YW5jZQotQHNtYWxsZXhhbXBsZQotdHN0YiAqd2AkNChyNSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUFueSBleHByZXNzaW9uIGlzIHBlcm1pdHRlZCBpbiBhbiBvcGVyYW5kLiAgT3BlcmFuZHMgYXJlIGNvbW1hCi1zZXBhcmF0ZWQuCi0KLUBjIFRoZXJlIGlzIHNvbWUgYnVnIHRvIGRvIHdpdGggcmVjb2duaXppbmcgZXhwcmVzc2lvbnMKLUBjIGluIG9wZXJhbmRzLCBidXQgSSBmb3JnZXQgd2hhdCBpdCBpcy4gIEl0IGlzCi1AYyBhIHN5bnRheCBjbGFzaCBiZWNhdXNlICgpIGlzIHVzZWQgYXMgYW4gYWRkcmVzcyBtb2RlCi1AYyBhbmQgdG8gZW5jYXBzdWxhdGUgc3ViLWV4cHJlc3Npb25zLgotCi1Abm9kZSBWQVgtbm8KLUBzZWN0aW9uIE5vdCBTdXBwb3J0ZWQgb24gVkFYCi0KLUBjaW5kZXggVkFYIGJpdGZpZWxkcyBub3Qgc3VwcG9ydGVkCi1AY2luZGV4IGJpdGZpZWxkcywgbm90IHN1cHBvcnRlZCBvbiBWQVgKLVZheCBiaXQgZmllbGRzIGNhbiBub3QgYmUgYXNzZW1ibGVkIHdpdGggQGNvZGV7QHZhbHVle0FTfX0uICBTb21lb25lCi1jYW4gYWRkIHRoZSByZXF1aXJlZCBjb2RlIGlmIHRoZXkgcmVhbGx5IG5lZWQgaXQuCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtejhrLnRleGkgYi9nYXMvZG9jL2MtejhrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYjEwZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXo4ay50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBaODAwMC1EZXBlbmRlbnQKLUBjaGFwdGVyIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggWjgwMDAgc3VwcG9ydAotVGhlIFo4MDAwIEB2YWx1ZXtBU30gc3VwcG9ydHMgYm90aCBtZW1iZXJzIG9mIHRoZSBaODAwMCBmYW1pbHk6IHRoZQotdW5zZWdtZW50ZWQgWjgwMDIsIHdpdGggMTYgYml0IGFkZHJlc3NlcywgYW5kIHRoZSBzZWdtZW50ZWQgWjgwMDEgd2l0aAotMjQgYml0IGFkZHJlc3Nlcy4KLQotV2hlbiB0aGUgYXNzZW1ibGVyIGlzIGluIHVuc2VnbWVudGVkIG1vZGUgKHNwZWNpZmllZCB3aXRoIHRoZQotQGNvZGV7dW5zZWdtfSBkaXJlY3RpdmUpLCBhbiBhZGRyZXNzIHRha2VzIHVwIG9uZSB3b3JkICgxNiBiaXQpCi1zaXplZCByZWdpc3Rlci4gIFdoZW4gdGhlIGFzc2VtYmxlciBpcyBpbiBzZWdtZW50ZWQgbW9kZSAoc3BlY2lmaWVkIHdpdGgKLXRoZSBAY29kZXtzZWdtfSBkaXJlY3RpdmUpLCBhIDI0LWJpdCBhZGRyZXNzIHRha2VzIHVwIGEgbG9uZyAoMzIgYml0KQotcmVnaXN0ZXIuICBAeHJlZntaODAwMCBEaXJlY3RpdmVzLCxBc3NlbWJsZXIgRGlyZWN0aXZlcyBmb3IgdGhlIFo4MDAwfSwKLWZvciBhIGxpc3Qgb2Ygb3RoZXIgWjgwMDAgc3BlY2lmaWMgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCi0KLUBtZW51Ci0qIFo4MDAwIE9wdGlvbnM6OiAgICAgICAgICAgICAgIE5vIHNwZWNpYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIFo4MDAwCi0qIFo4MDAwIFN5bnRheDo6ICAgICAgICAgICAgICAgIEFzc2VtYmxlciBzeW50YXggZm9yIHRoZSBaODAwMAotKiBaODAwMCBEaXJlY3RpdmVzOjogICAgICAgICAgICBTcGVjaWFsIGRpcmVjdGl2ZXMgZm9yIHRoZSBaODAwMAotKiBaODAwMCBPcGNvZGVzOjogICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgWjgwMDAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IFo4MDAwIG9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgWjgwMDAKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgWmlsb2cKLVo4MDAwIGZhbWlseS4KLQotQG5vZGUgWjgwMDAgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIFo4MDAwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIFo4MDAwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogWjgwMDAtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgWjgwMDAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIFo4MDAwCi1AY2luZGV4IFo4MDAwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1weyF9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBaODAwMAotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBaODAwMAotQGNpbmRleCBaODAwMCBsaW5lIHNlcGFyYXRvcgotWW91IGNhbiB1c2UgQHNhbXB7O30gaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLQotQG5vZGUgWjgwMDAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBaODAwMCByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBaODAwMAotVGhlIFo4MDAwIGhhcyBzaXh0ZWVuIDE2IGJpdCByZWdpc3RlcnMsIG51bWJlcmVkIDAgdG8gMTUuICBZb3UgY2FuIHJlZmVyCi10byBkaWZmZXJlbnQgc2l6ZWQgZ3JvdXBzIG9mIHJlZ2lzdGVycyBieSByZWdpc3RlciBudW1iZXIsIHdpdGggdGhlCi1wcmVmaXggQHNhbXB7cn0gZm9yIDE2IGJpdCByZWdpc3RlcnMsIEBzYW1we3JyfSBmb3IgMzIgYml0IHJlZ2lzdGVycyBhbmQKLUBzYW1we3JxfSBmb3IgNjQgYml0IHJlZ2lzdGVycy4gIFlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgY29udGVudHMgb2YKLXRoZSBmaXJzdCBlaWdodCAob2YgdGhlIHNpeHRlZW4gMTYgYml0IHJlZ2lzdGVycykgYnkgYnl0ZXMuICBUaGV5IGFyZQotbmFtZWQgQHNhbXB7ckB2YXJ7bn1ofSBhbmQgQHNhbXB7ckB2YXJ7bn1sfS4KLQotQHNtYWxsZXhhbXBsZQotQGV4ZGVudCBAZW1waHtieXRlIHJlZ2lzdGVyc30KLXIwbCByMGggcjFoIHIxbCByMmggcjJsIHIzaCByM2wKLXI0aCByNGwgcjVoIHI1bCByNmggcjZsIHI3aCByN2wKLQotQGV4ZGVudCBAZW1waHt3b3JkIHJlZ2lzdGVyc30KLXIwIHIxIHIyIHIzIHI0IHI1IHI2IHI3IHI4IHI5IHIxMCByMTEgcjEyIHIxMyByMTQgcjE1Ci0KLUBleGRlbnQgQGVtcGh7bG9uZyB3b3JkIHJlZ2lzdGVyc30KLXJyMCBycjIgcnI0IHJyNiBycjggcnIxMCBycjEyIHJyMTQKLQotQGV4ZGVudCBAZW1waHtxdWFkIHdvcmQgcmVnaXN0ZXJzfQotcnEwIHJxNCBycTggcnExMgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgWjgwMDAtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIFo4MDAwCi1AY2luZGV4IFo4MDAgYWRkcmVzc2luZyBtb2RlcwotQHZhbHVle0FTfSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBaODAwMDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSByQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci0KLUBpdGVtIEBAckB2YXJ7bn0KLUluZGlyZWN0IHJlZ2lzdGVyCi0KLUBpdGVtIEB2YXJ7YWRkcn0KLURpcmVjdDogdGhlIDE2IGJpdCBvciAyNCBiaXQgYWRkcmVzcyAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGFzc2VtYmxlcgotaXMgaW4gc2VnbWVudGVkIG9yIHVuc2VnbWVudGVkIG1vZGUpIG9mIHRoZSBvcGVyYW5kIGlzIGluIHRoZSBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gYWRkcmVzcyhyQHZhcntufSkKLUluZGV4ZWQ6IHRoZSAxNiBvciAyNCBiaXQgYWRkcmVzcyBpcyBhZGRlZCB0byB0aGUgMTYgYml0IHJlZ2lzdGVyIHRvIHByb2R1Y2UKLXRoZSBmaW5hbCBhZGRyZXNzIGluIG1lbW9yeSBvZiB0aGUgb3BlcmFuZC4KLQotQGl0ZW0gckB2YXJ7bn0oI0B2YXJ7aW1tfSkKLUJhc2UgQWRkcmVzczogdGhlIDE2IG9yIDI0IGJpdCByZWdpc3RlciBpcyBhZGRlZCB0byB0aGUgMTYgYml0IHNpZ24KLWV4dGVuZGVkIGltbWVkaWF0ZSBkaXNwbGFjZW1lbnQgdG8gcHJvZHVjZSB0aGUgZmluYWwgYWRkcmVzcyBpbiBtZW1vcnkKLW9mIHRoZSBvcGVyYW5kLgotCi1AaXRlbSByQHZhcntufShyQHZhcnttfSkKLUJhc2UgSW5kZXg6IHRoZSAxNiBvciAyNCBiaXQgcmVnaXN0ZXIgckB2YXJ7bn0gaXMgYWRkZWQgdG8gdGhlIHNpZ24KLWV4dGVuZGVkIDE2IGJpdCBpbmRleCByZWdpc3RlciByQHZhcnttfSB0byBwcm9kdWNlIHRoZSBmaW5hbCBhZGRyZXNzIGluCi1tZW1vcnkgb2YgdGhlIG9wZXJhbmQuCi0KLUBpdGVtICNAdmFye3h4fQotSW1tZWRpYXRlIGRhdGEgQHZhcnt4eH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIFo4MDAwIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEFzc2VtYmxlciBEaXJlY3RpdmVzIGZvciB0aGUgWjgwMDAKLQotQGNpbmRleCBaODAwMCBkaXJlY3RpdmVzCi1AY2luZGV4IGRpcmVjdGl2ZXMsIFo4MDAwCi1UaGUgWjgwMDAgcG9ydCBvZiBAdmFsdWV7QVN9IGluY2x1ZGVzIHRoZXNlIGFkZGl0aW9uYWwgYXNzZW1ibGVyIGRpcmVjdGl2ZXMsCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFo4MDAwIGFzc2VtYmxlcnMuICBBcyBzaG93biwgdGhlc2UgZG8gbm90Ci1iZWdpbiB3aXRoIEBzYW1wey59ICh1bmxpa2UgdGhlIG9yZGluYXJ5IEB2YWx1ZXtBU30gZGlyZWN0aXZlcykuCi0KLUB0YWJsZSBAY29kZQotQGtpbmRleCBzZWdtCi1AaXRlbSBzZWdtCi1HZW5lcmF0ZXMgY29kZSBmb3IgdGhlIHNlZ21lbnRlZCBaODAwMS4KLQotQGtpbmRleCB1bnNlZ20KLUBpdGVtIHVuc2VnbQotR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSB1bnNlZ21lbnRlZCBaODAwMi4KLQotQGtpbmRleCBuYW1lCi1AaXRlbSBuYW1lCi1TeW5vbnltIGZvciBAY29kZXsuZmlsZX0KLQotQGtpbmRleCBnbG9iYWwKLUBpdGVtIGdsb2JhbAotU3lub255bSBmb3IgQGNvZGV7Lmdsb2JhbH0KLQotQGtpbmRleCB3dmFsCi1AaXRlbSB3dmFsCi1TeW5vbnltIGZvciBAY29kZXsud29yZH0KLQotQGtpbmRleCBsdmFsCi1AaXRlbSBsdmFsCi1TeW5vbnltIGZvciBAY29kZXsubG9uZ30KLQotQGtpbmRleCBidmFsCi1AaXRlbSBidmFsCi1TeW5vbnltIGZvciBAY29kZXsuYnl0ZX0KLQotQGtpbmRleCBzdmFsCi1AaXRlbSBzdmFsCi1Bc3NlbWJsZSBhIHN0cmluZy4gIEBjb2Rle3N2YWx9IGV4cGVjdHMgb25lIHN0cmluZyBsaXRlcmFsLCBkZWxpbWl0ZWQgYnkKLXNpbmdsZSBxdW90ZXMuICBJdCBhc3NlbWJsZXMgZWFjaCBieXRlIG9mIHRoZSBzdHJpbmcgaW50byBjb25zZWN1dGl2ZQotYWRkcmVzc2VzLiAgWW91IGNhbiB1c2UgdGhlIGVzY2FwZSBzZXF1ZW5jZSBAc2FtcHslQHZhcnt4eH19ICh3aGVyZQotQHZhcnt4eH0gcmVwcmVzZW50cyBhIHR3by1kaWdpdCBoZXhhZGVjaW1hbCBudW1iZXIpIHRvIHJlcHJlc2VudCB0aGUKLWNoYXJhY3RlciB3aG9zZSBAc2N7YXNjaWl9IHZhbHVlIGlzIEB2YXJ7eHh9LiAgVXNlIHRoaXMgZmVhdHVyZSB0bwotZGVzY3JpYmUgc2luZ2xlIHF1b3RlIGFuZCBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgbWF5IG5vdCBhcHBlYXIgaW4gc3RyaW5nCi1saXRlcmFscyBhcyB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBDIHN0YXRlbWVudCBAd3tAc2FtcHtjaGFyICphID0KLSJoZSBzYWlkIFwiaXQncyA1MCUgb2ZmXCIiO319IGlzIHJlcHJlc2VudGVkIGluIFo4MDAwIGFzc2VtYmx5IGxhbmd1YWdlCi0oc2hvd24gd2l0aCB0aGUgYXNzZW1ibGVyIG91dHB1dCBpbiBoZXggYXQgdGhlIGxlZnQpIGFzCi0KLUBpZnRleAotQGJlZ2luZ3JvdXAKLUBsZXRAbm9uYXJyb3dpbmc9QGNvbW1lbnQKLUBlbmQgaWZ0ZXgKLUBzbWFsbGV4YW1wbGUKLTY4NjUyMDczICAgIHN2YWwgICAgJ2hlIHNhaWQgJTIyaXQlMjdzIDUwJTI1IG9mZiUyMiUwMCcKLTYxNjk2NDIwCi0yMjY5NzQyNwotNzMyMDM1MzAKLTI1MjA2RjY2Ci02NjIyMDAKLUBlbmQgc21hbGxleGFtcGxlCi1AaWZ0ZXgKLUBlbmRncm91cAotQGVuZCBpZnRleAotCi1Aa2luZGV4IHJzZWN0Ci1AaXRlbSByc2VjdAotc3lub255bSBmb3IgQGNvZGV7LnNlY3Rpb259Ci0KLUBraW5kZXggYmxvY2sKLUBpdGVtIGJsb2NrCi1zeW5vbnltIGZvciBAY29kZXsuc3BhY2V9Ci0KLUBraW5kZXggZXZlbgotQGl0ZW0gZXZlbgotc3BlY2lhbCBjYXNlIG9mIEBjb2Rley5hbGlnbn07IGFsaWducyBvdXRwdXQgdG8gZXZlbiBieXRlIGJvdW5kYXJ5LgotQGVuZCB0YWJsZQotCi1Abm9kZSBaODAwMCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggWjgwMDAgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIFo4MDAwCi1AY2luZGV4IG1uZW1vbmljcywgWjgwMDAKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgWjgwMDAKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgWjgwMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7WjgwMDAgVGVjaG5pY2FsIE1hbnVhbH0uCi0KLUBpZnNldCBTTUFMTAotQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5Ci1AYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgb3Bjb2RlcyBhbmQgdGhlaXIgYXJndW1lbnRzOgotQGlmdGV4Ci1AYmVnaW5ncm91cAotQGxldEBub25hcnJvd2luZz1AY29tbWVudAotQGVuZCBpZnRleAotQHNtYWxsZXhhbXBsZQotCi0gICAgICAgICAgICBycyAgIEByezE2IGJpdCBzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICByZCAgIEByezE2IGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJicyAgIEByezggYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJiZCAgIEByezggYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgcnJzICAgQHJ7MzIgYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJyZCAgIEByezMyIGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJxcyAgIEByezY0IGJpdCBzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBycWQgICBAcns2NCBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBhZGRyIEByezE2LzI0IGJpdCBhZGRyZXNzfQotICAgICAgICAgICAgaW1tICBAcntpbW1lZGlhdGUgZGF0YX0KLQotYWRjIHJkLHJzICAgICAgICAgICAgICAgY2xyYiBhZGRyICAgICAgICAgICAgICAgY3BzaXIgQEByZCxAQHJzLHJyLGNjCi1hZGNiIHJiZCxyYnMgICAgICAgICAgICBjbHJiIGFkZHIocmQpICAgICAgICAgICBjcHNpcmIgQEByZCxAQHJzLHJyLGNjCi1hZGQgcmQsQEBycyAgICAgICAgICAgICAgY2xyYiByYmQgICAgICAgICAgICAgICAgZGFiIHJiZAotYWRkIHJkLGFkZHIgICAgICAgICAgICAgY29tIEBAcmQgICAgICAgICAgICAgICAgIGRiam56IHJiZCxkaXNwNwotYWRkIHJkLGFkZHIocnMpICAgICAgICAgY29tIGFkZHIgICAgICAgICAgICAgICAgZGVjIEBAcmQsaW1tNG0xCi1hZGQgcmQsaW1tMTYgICAgICAgICAgICBjb20gYWRkcihyZCkgICAgICAgICAgICBkZWMgYWRkcihyZCksaW1tNG0xCi1hZGQgcmQscnMgICAgICAgICAgICAgICBjb20gcmQgICAgICAgICAgICAgICAgICBkZWMgYWRkcixpbW00bTEKLWFkZGIgcmJkLEBAcnMgICAgICAgICAgICBjb21iIEBAcmQgICAgICAgICAgICAgICAgZGVjIHJkLGltbTRtMQotYWRkYiByYmQsYWRkciAgICAgICAgICAgY29tYiBhZGRyICAgICAgICAgICAgICAgZGVjYiBAQHJkLGltbTRtMQotYWRkYiByYmQsYWRkcihycykgICAgICAgY29tYiBhZGRyKHJkKSAgICAgICAgICAgZGVjYiBhZGRyKHJkKSxpbW00bTEKLWFkZGIgcmJkLGltbTggICAgICAgICAgIGNvbWIgcmJkICAgICAgICAgICAgICAgIGRlY2IgYWRkcixpbW00bTEKLWFkZGIgcmJkLHJicyAgICAgICAgICAgIGNvbWZsZyBmbGFncyAgICAgICAgICAgIGRlY2IgcmJkLGltbTRtMQotYWRkbCBycmQsQEBycyAgICAgICAgICAgIGNwIEBAcmQsaW1tMTYgICAgICAgICAgICBkaSBpMgotYWRkbCBycmQsYWRkciAgICAgICAgICAgY3AgYWRkcihyZCksaW1tMTYgICAgICAgZGl2IHJyZCxAQHJzCi1hZGRsIHJyZCxhZGRyKHJzKSAgICAgICBjcCBhZGRyLGltbTE2ICAgICAgICAgICBkaXYgcnJkLGFkZHIKLWFkZGwgcnJkLGltbTMyICAgICAgICAgIGNwIHJkLEBAcnMgICAgICAgICAgICAgICBkaXYgcnJkLGFkZHIocnMpCi1hZGRsIHJyZCxycnMgICAgICAgICAgICBjcCByZCxhZGRyICAgICAgICAgICAgICBkaXYgcnJkLGltbTE2Ci1hbmQgcmQsQEBycyAgICAgICAgICAgICAgY3AgcmQsYWRkcihycykgICAgICAgICAgZGl2IHJyZCxycwotYW5kIHJkLGFkZHIgICAgICAgICAgICAgY3AgcmQsaW1tMTYgICAgICAgICAgICAgZGl2bCBycWQsQEBycwotYW5kIHJkLGFkZHIocnMpICAgICAgICAgY3AgcmQscnMgICAgICAgICAgICAgICAgZGl2bCBycWQsYWRkcgotYW5kIHJkLGltbTE2ICAgICAgICAgICAgY3BiIEBAcmQsaW1tOCAgICAgICAgICAgIGRpdmwgcnFkLGFkZHIocnMpCi1hbmQgcmQscnMgICAgICAgICAgICAgICBjcGIgYWRkcihyZCksaW1tOCAgICAgICBkaXZsIHJxZCxpbW0zMgotYW5kYiByYmQsQEBycyAgICAgICAgICAgIGNwYiBhZGRyLGltbTggICAgICAgICAgIGRpdmwgcnFkLHJycwotYW5kYiByYmQsYWRkciAgICAgICAgICAgY3BiIHJiZCxAQHJzICAgICAgICAgICAgIGRqbnogcmQsZGlzcDcKLWFuZGIgcmJkLGFkZHIocnMpICAgICAgIGNwYiByYmQsYWRkciAgICAgICAgICAgIGVpIGkyCi1hbmRiIHJiZCxpbW04ICAgICAgICAgICBjcGIgcmJkLGFkZHIocnMpICAgICAgICBleCByZCxAQHJzCi1hbmRiIHJiZCxyYnMgICAgICAgICAgICBjcGIgcmJkLGltbTggICAgICAgICAgICBleCByZCxhZGRyCi1iaXQgQEByZCxpbW00ICAgICAgICAgICAgY3BiIHJiZCxyYnMgICAgICAgICAgICAgZXggcmQsYWRkcihycykKLWJpdCBhZGRyKHJkKSxpbW00ICAgICAgIGNwZCByZCxAQHJzLHJyLGNjICAgICAgICBleCByZCxycwotYml0IGFkZHIsaW1tNCAgICAgICAgICAgY3BkYiByYmQsQEBycyxycixjYyAgICAgIGV4YiByYmQsQEBycwotYml0IHJkLGltbTQgICAgICAgICAgICAgY3BkciByZCxAQHJzLHJyLGNjICAgICAgIGV4YiByYmQsYWRkcgotYml0IHJkLHJzICAgICAgICAgICAgICAgY3BkcmIgcmJkLEBAcnMscnIsY2MgICAgIGV4YiByYmQsYWRkcihycykKLWJpdGIgQEByZCxpbW00ICAgICAgICAgICBjcGkgcmQsQEBycyxycixjYyAgICAgICAgZXhiIHJiZCxyYnMKLWJpdGIgYWRkcihyZCksaW1tNCAgICAgIGNwaWIgcmJkLEBAcnMscnIsY2MgICAgICBleHQwZSBpbW04Ci1iaXRiIGFkZHIsaW1tNCAgICAgICAgICBjcGlyIHJkLEBAcnMscnIsY2MgICAgICAgZXh0MGYgaW1tOAotYml0YiByYmQsaW1tNCAgICAgICAgICAgY3BpcmIgcmJkLEBAcnMscnIsY2MgICAgIGV4dDhlIGltbTgKLWJpdGIgcmJkLHJzICAgICAgICAgICAgIGNwbCBycmQsQEBycyAgICAgICAgICAgICBleHQ4ZiBpbW04Ci1icHQgICAgICAgICAgICAgICAgICAgICBjcGwgcnJkLGFkZHIgICAgICAgICAgICBleHRzIHJyZAotY2FsbCBAQHJkICAgICAgICAgICAgICAgIGNwbCBycmQsYWRkcihycykgICAgICAgIGV4dHNiIHJkCi1jYWxsIGFkZHIgICAgICAgICAgICAgICBjcGwgcnJkLGltbTMyICAgICAgICAgICBleHRzbCBycWQKLWNhbGwgYWRkcihyZCkgICAgICAgICAgIGNwbCBycmQscnJzICAgICAgICAgICAgIGhhbHQKLWNhbHIgZGlzcDEyICAgICAgICAgICAgIGNwc2QgQEByZCxAQHJzLHJyLGNjICAgICAgaW4gcmQsQEBycwotY2xyIEBAcmQgICAgICAgICAgICAgICAgIGNwc2RiIEBAcmQsQEBycyxycixjYyAgICAgaW4gcmQsaW1tMTYKLWNsciBhZGRyICAgICAgICAgICAgICAgIGNwc2RyIEBAcmQsQEBycyxycixjYyAgICAgaW5iIHJiZCxAQHJzCi1jbHIgYWRkcihyZCkgICAgICAgICAgICBjcHNkcmIgQEByZCxAQHJzLHJyLGNjICAgIGluYiByYmQsaW1tMTYKLWNsciByZCAgICAgICAgICAgICAgICAgIGNwc2kgQEByZCxAQHJzLHJyLGNjICAgICAgaW5jIEBAcmQsaW1tNG0xCi1jbHJiIEBAcmQgICAgICAgICAgICAgICAgY3BzaWIgQEByZCxAQHJzLHJyLGNjICAgICBpbmMgYWRkcihyZCksaW1tNG0xCi1pbmMgYWRkcixpbW00bTEgICAgICAgICBsZGIgcmJkLHJzKHJ4KSAgICAgICAgICBtdWx0IHJyZCxhZGRyKHJzKQotaW5jIHJkLGltbTRtMSAgICAgICAgICAgbGRiIHJkKGltbTE2KSxyYnMgICAgICAgbXVsdCBycmQsaW1tMTYKLWluY2IgQEByZCxpbW00bTEgICAgICAgICBsZGIgcmQocngpLHJicyAgICAgICAgICBtdWx0IHJyZCxycwotaW5jYiBhZGRyKHJkKSxpbW00bTEgICAgbGRjdGwgY3RybCxycyAgICAgICAgICAgbXVsdGwgcnFkLEBAcnMKLWluY2IgYWRkcixpbW00bTEgICAgICAgIGxkY3RsIHJkLGN0cmwgICAgICAgICAgIG11bHRsIHJxZCxhZGRyCi1pbmNiIHJiZCxpbW00bTEgICAgICAgICBsZGQgQEBycyxAQHJkLHJyICAgICAgICAgIG11bHRsIHJxZCxhZGRyKHJzKQotaW5kIEBAcmQsQEBycyxyYSAgICAgICAgICBsZGRiIEBAcnMsQEByZCxyciAgICAgICAgIG11bHRsIHJxZCxpbW0zMgotaW5kYiBAQHJkLEBAcnMscmJhICAgICAgICBsZGRyIEBAcnMsQEByZCxyciAgICAgICAgIG11bHRsIHJxZCxycnMKLWluaWIgQEByZCxAQHJzLHJhICAgICAgICAgbGRkcmIgQEBycyxAQHJkLHJyICAgICAgICBuZWcgQEByZAotaW5pYnIgQEByZCxAQHJzLHJhICAgICAgICBsZGkgQEByZCxAQHJzLHJyICAgICAgICAgIG5lZyBhZGRyCi1pcmV0ICAgICAgICAgICAgICAgICAgICBsZGliIEBAcmQsQEBycyxyciAgICAgICAgIG5lZyBhZGRyKHJkKQotanAgY2MsQEByZCAgICAgICAgICAgICAgIGxkaXIgQEByZCxAQHJzLHJyICAgICAgICAgbmVnIHJkCi1qcCBjYyxhZGRyICAgICAgICAgICAgICBsZGlyYiBAQHJkLEBAcnMscnIgICAgICAgIG5lZ2IgQEByZAotanAgY2MsYWRkcihyZCkgICAgICAgICAgbGRrIHJkLGltbTQgICAgICAgICAgICAgbmVnYiBhZGRyCi1qciBjYyxkaXNwOCAgICAgICAgICAgICBsZGwgQEByZCxycnMgICAgICAgICAgICAgbmVnYiBhZGRyKHJkKQotbGQgQEByZCxpbW0xNiAgICAgICAgICAgIGxkbCBhZGRyKHJkKSxycnMgICAgICAgIG5lZ2IgcmJkCi1sZCBAQHJkLHJzICAgICAgICAgICAgICAgbGRsIGFkZHIscnJzICAgICAgICAgICAgbm9wCi1sZCBhZGRyKHJkKSxpbW0xNiAgICAgICBsZGwgcmQoaW1tMTYpLHJycyAgICAgICBvciByZCxAQHJzCi1sZCBhZGRyKHJkKSxycyAgICAgICAgICBsZGwgcmQocngpLHJycyAgICAgICAgICBvciByZCxhZGRyCi1sZCBhZGRyLGltbTE2ICAgICAgICAgICBsZGwgcnJkLEBAcnMgICAgICAgICAgICAgb3IgcmQsYWRkcihycykKLWxkIGFkZHIscnMgICAgICAgICAgICAgIGxkbCBycmQsYWRkciAgICAgICAgICAgIG9yIHJkLGltbTE2Ci1sZCByZChpbW0xNikscnMgICAgICAgICBsZGwgcnJkLGFkZHIocnMpICAgICAgICBvciByZCxycwotbGQgcmQocngpLHJzICAgICAgICAgICAgbGRsIHJyZCxpbW0zMiAgICAgICAgICAgb3JiIHJiZCxAQHJzCi1sZCByZCxAQHJzICAgICAgICAgICAgICAgbGRsIHJyZCxycnMgICAgICAgICAgICAgb3JiIHJiZCxhZGRyCi1sZCByZCxhZGRyICAgICAgICAgICAgICBsZGwgcnJkLHJzKGltbTE2KSAgICAgICBvcmIgcmJkLGFkZHIocnMpCi1sZCByZCxhZGRyKHJzKSAgICAgICAgICBsZGwgcnJkLHJzKHJ4KSAgICAgICAgICBvcmIgcmJkLGltbTgKLWxkIHJkLGltbTE2ICAgICAgICAgICAgIGxkbSBAQHJkLHJzLG4gICAgICAgICAgICBvcmIgcmJkLHJicwotbGQgcmQscnMgICAgICAgICAgICAgICAgbGRtIGFkZHIocmQpLHJzLG4gICAgICAgb3V0IEBAcmQscnMKLWxkIHJkLHJzKGltbTE2KSAgICAgICAgIGxkbSBhZGRyLHJzLG4gICAgICAgICAgIG91dCBpbW0xNixycwotbGQgcmQscnMocngpICAgICAgICAgICAgbGRtIHJkLEBAcnMsbiAgICAgICAgICAgIG91dGIgQEByZCxyYnMKLWxkYSByZCxhZGRyICAgICAgICAgICAgIGxkbSByZCxhZGRyKHJzKSxuICAgICAgIG91dGIgaW1tMTYscmJzCi1sZGEgcmQsYWRkcihycykgICAgICAgICBsZG0gcmQsYWRkcixuICAgICAgICAgICBvdXRkIEBAcmQsQEBycyxyYQotbGRhIHJkLHJzKGltbTE2KSAgICAgICAgbGRwcyBAQHJzICAgICAgICAgICAgICAgIG91dGRiIEBAcmQsQEBycyxyYmEKLWxkYSByZCxycyhyeCkgICAgICAgICAgIGxkcHMgYWRkciAgICAgICAgICAgICAgIG91dGliIEBAcmQsQEBycyxyYQotbGRhciByZCxkaXNwMTYgICAgICAgICAgbGRwcyBhZGRyKHJzKSAgICAgICAgICAgb3V0aWJyIEBAcmQsQEBycyxyYQotbGRiIEBAcmQsaW1tOCAgICAgICAgICAgIGxkciBkaXNwMTYscnMgICAgICAgICAgIHBvcCBAQHJkLEBAcnMKLWxkYiBAQHJkLHJicyAgICAgICAgICAgICBsZHIgcmQsZGlzcDE2ICAgICAgICAgICBwb3AgYWRkcihyZCksQEBycwotbGRiIGFkZHIocmQpLGltbTggICAgICAgbGRyYiBkaXNwMTYscmJzICAgICAgICAgcG9wIGFkZHIsQEBycwotbGRiIGFkZHIocmQpLHJicyAgICAgICAgbGRyYiByYmQsZGlzcDE2ICAgICAgICAgcG9wIHJkLEBAcnMKLWxkYiBhZGRyLGltbTggICAgICAgICAgIGxkcmwgZGlzcDE2LHJycyAgICAgICAgIHBvcGwgQEByZCxAQHJzCi1sZGIgYWRkcixyYnMgICAgICAgICAgICBsZHJsIHJyZCxkaXNwMTYgICAgICAgICBwb3BsIGFkZHIocmQpLEBAcnMKLWxkYiByYmQsQEBycyAgICAgICAgICAgICBtYml0ICAgICAgICAgICAgICAgICAgICBwb3BsIGFkZHIsQEBycwotbGRiIHJiZCxhZGRyICAgICAgICAgICAgbXJlcSByZCAgICAgICAgICAgICAgICAgcG9wbCBycmQsQEBycwotbGRiIHJiZCxhZGRyKHJzKSAgICAgICAgbXJlcyAgICAgICAgICAgICAgICAgICAgcHVzaCBAQHJkLEBAcnMKLWxkYiByYmQsaW1tOCAgICAgICAgICAgIG1zZXQgICAgICAgICAgICAgICAgICAgIHB1c2ggQEByZCxhZGRyCi1sZGIgcmJkLHJicyAgICAgICAgICAgICBtdWx0IHJyZCxAQHJzICAgICAgICAgICAgcHVzaCBAQHJkLGFkZHIocnMpCi1sZGIgcmJkLHJzKGltbTE2KSAgICAgICBtdWx0IHJyZCxhZGRyICAgICAgICAgICBwdXNoIEBAcmQsaW1tMTYKLXB1c2ggQEByZCxycyAgICAgICAgICAgICBzZXQgYWRkcixpbW00ICAgICAgICAgICBzdWJsIHJyZCxpbW0zMgotcHVzaGwgQEByZCxAQHJzICAgICAgICAgICBzZXQgcmQsaW1tNCAgICAgICAgICAgICBzdWJsIHJyZCxycnMKLXB1c2hsIEBAcmQsYWRkciAgICAgICAgICBzZXQgcmQscnMgICAgICAgICAgICAgICB0Y2MgY2MscmQKLXB1c2hsIEBAcmQsYWRkcihycykgICAgICBzZXRiIEBAcmQsaW1tNCAgICAgICAgICAgdGNjYiBjYyxyYmQKLXB1c2hsIEBAcmQscnJzICAgICAgICAgICBzZXRiIGFkZHIocmQpLGltbTQgICAgICB0ZXN0IEBAcmQKLXJlcyBAQHJkLGltbTQgICAgICAgICAgICBzZXRiIGFkZHIsaW1tNCAgICAgICAgICB0ZXN0IGFkZHIKLXJlcyBhZGRyKHJkKSxpbW00ICAgICAgIHNldGIgcmJkLGltbTQgICAgICAgICAgIHRlc3QgYWRkcihyZCkKLXJlcyBhZGRyLGltbTQgICAgICAgICAgIHNldGIgcmJkLHJzICAgICAgICAgICAgIHRlc3QgcmQKLXJlcyByZCxpbW00ICAgICAgICAgICAgIHNldGZsZyBpbW00ICAgICAgICAgICAgIHRlc3RiIEBAcmQKLXJlcyByZCxycyAgICAgICAgICAgICAgIHNpbmIgcmJkLGltbTE2ICAgICAgICAgIHRlc3RiIGFkZHIKLXJlc2IgQEByZCxpbW00ICAgICAgICAgICBzaW5iIHJkLGltbTE2ICAgICAgICAgICB0ZXN0YiBhZGRyKHJkKQotcmVzYiBhZGRyKHJkKSxpbW00ICAgICAgc2luZCBAQHJkLEBAcnMscmEgICAgICAgICB0ZXN0YiByYmQKLXJlc2IgYWRkcixpbW00ICAgICAgICAgIHNpbmRiIEBAcmQsQEBycyxyYmEgICAgICAgdGVzdGwgQEByZAotcmVzYiByYmQsaW1tNCAgICAgICAgICAgc2luaWIgQEByZCxAQHJzLHJhICAgICAgICB0ZXN0bCBhZGRyCi1yZXNiIHJiZCxycyAgICAgICAgICAgICBzaW5pYnIgQEByZCxAQHJzLHJhICAgICAgIHRlc3RsIGFkZHIocmQpCi1yZXNmbGcgaW1tNCAgICAgICAgICAgICBzbGEgcmQsaW1tOCAgICAgICAgICAgICB0ZXN0bCBycmQKLXJldCBjYyAgICAgICAgICAgICAgICAgIHNsYWIgcmJkLGltbTggICAgICAgICAgIHRyZGIgQEByZCxAQHJzLHJiYQotcmwgcmQsaW1tMW9yMiAgICAgICAgICAgc2xhbCBycmQsaW1tOCAgICAgICAgICAgdHJkcmIgQEByZCxAQHJzLHJiYQotcmxiIHJiZCxpbW0xb3IyICAgICAgICAgc2xsIHJkLGltbTggICAgICAgICAgICAgdHJpYiBAQHJkLEBAcnMscmJyCi1ybGMgcmQsaW1tMW9yMiAgICAgICAgICBzbGxiIHJiZCxpbW04ICAgICAgICAgICB0cmlyYiBAQHJkLEBAcnMscmJyCi1ybGNiIHJiZCxpbW0xb3IyICAgICAgICBzbGxsIHJyZCxpbW04ICAgICAgICAgICB0cnRkcmIgQEByYSxAQHJiLHJicgotcmxkYiByYmIscmJhICAgICAgICAgICAgc291dCBpbW0xNixycyAgICAgICAgICAgdHJ0aWIgQEByYSxAQHJiLHJyCi1yciByZCxpbW0xb3IyICAgICAgICAgICBzb3V0YiBpbW0xNixyYnMgICAgICAgICB0cnRpcmIgQEByYSxAQHJiLHJicgotcnJiIHJiZCxpbW0xb3IyICAgICAgICAgc291dGQgQEByZCxAQHJzLHJhICAgICAgICB0cnRyYiBAQHJhLEBAcmIscmJyCi1ycmMgcmQsaW1tMW9yMiAgICAgICAgICBzb3V0ZGIgQEByZCxAQHJzLHJiYSAgICAgIHRzZXQgQEByZAotcnJjYiByYmQsaW1tMW9yMiAgICAgICAgc291dGliIEBAcmQsQEBycyxyYSAgICAgICB0c2V0IGFkZHIKLXJyZGIgcmJiLHJiYSAgICAgICAgICAgIHNvdXRpYnIgQEByZCxAQHJzLHJhICAgICAgdHNldCBhZGRyKHJkKQotcnN2ZDM2ICAgICAgICAgICAgICAgICAgc3JhIHJkLGltbTggICAgICAgICAgICAgdHNldCByZAotcnN2ZDM4ICAgICAgICAgICAgICAgICAgc3JhYiByYmQsaW1tOCAgICAgICAgICAgdHNldGIgQEByZAotcnN2ZDc4ICAgICAgICAgICAgICAgICAgc3JhbCBycmQsaW1tOCAgICAgICAgICAgdHNldGIgYWRkcgotcnN2ZDdlICAgICAgICAgICAgICAgICAgc3JsIHJkLGltbTggICAgICAgICAgICAgdHNldGIgYWRkcihyZCkKLXJzdmQ5ZCAgICAgICAgICAgICAgICAgIHNybGIgcmJkLGltbTggICAgICAgICAgIHRzZXRiIHJiZAotcnN2ZDlmICAgICAgICAgICAgICAgICAgc3JsbCBycmQsaW1tOCAgICAgICAgICAgeG9yIHJkLEBAcnMKLXJzdmRiOSAgICAgICAgICAgICAgICAgIHN1YiByZCxAQHJzICAgICAgICAgICAgICB4b3IgcmQsYWRkcgotcnN2ZGJmICAgICAgICAgICAgICAgICAgc3ViIHJkLGFkZHIgICAgICAgICAgICAgeG9yIHJkLGFkZHIocnMpCi1zYmMgcmQscnMgICAgICAgICAgICAgICBzdWIgcmQsYWRkcihycykgICAgICAgICB4b3IgcmQsaW1tMTYKLXNiY2IgcmJkLHJicyAgICAgICAgICAgIHN1YiByZCxpbW0xNiAgICAgICAgICAgIHhvciByZCxycwotc2MgaW1tOCAgICAgICAgICAgICAgICAgc3ViIHJkLHJzICAgICAgICAgICAgICAgeG9yYiByYmQsQEBycwotc2RhIHJkLHJzICAgICAgICAgICAgICAgc3ViYiByYmQsQEBycyAgICAgICAgICAgIHhvcmIgcmJkLGFkZHIKLXNkYWIgcmJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLGFkZHIgICAgICAgICAgIHhvcmIgcmJkLGFkZHIocnMpCi1zZGFsIHJyZCxycyAgICAgICAgICAgICBzdWJiIHJiZCxhZGRyKHJzKSAgICAgICB4b3JiIHJiZCxpbW04Ci1zZGwgcmQscnMgICAgICAgICAgICAgICBzdWJiIHJiZCxpbW04ICAgICAgICAgICB4b3JiIHJiZCxyYnMKLXNkbGIgcmJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLHJicyAgICAgICAgICAgIHhvcmIgcmJkLHJicwotc2RsbCBycmQscnMgICAgICAgICAgICAgc3VibCBycmQsQEBycwotc2V0IEBAcmQsaW1tNCAgICAgICAgICAgIHN1YmwgcnJkLGFkZHIKLXNldCBhZGRyKHJkKSxpbW00ICAgICAgIHN1YmwgcnJkLGFkZHIocnMpCi1AZW5kIHNtYWxsZXhhbXBsZQotQGlmdGV4Ci1AZW5kZ3JvdXAKLUBlbmQgaWZ0ZXgKLUBlbmQgaWZzZXQKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9nYXNwLnRleGkgYi9nYXMvZG9jL2dhc3AudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjZDZmNC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2dhc3AudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDEwODYgKzAsMCBAQAotXGlucHV0IHRleGluZm8gICAgICAgICAgICAgICBAYyAgICAgICAgICAgICAtKi0gVGV4aW5mbyAtKi0KLUBzZXRmaWxlbmFtZSBnYXNwLmluZm8KLUBjCi1AYyBUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBhc3NlbWJseSBwcmVwcm9jZXNzb3IgIkdBU1AiCi1AYwotQGMgQ29weXJpZ2h0IChjKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMKLUBjIFRoaXMgdGV4dCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi1AYyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBnYXNwOiAoZ2FzcCkuICAgICAgICAgICAgICAgICAgICAgVGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1Ac3luY29kZWluZGV4IGt5IGNwCi1Ac3luY29kZWluZGV4IGZuIGNwCi0KLUBmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIEdBU1AKLUB0aXRsZXBhZ2UKLUBjIEZJWE1FIGJvcmluZyB0aXRsZQotQHRpdGxlIEdBU1AsIGFuIGFzc2VtYmx5IHByZXByb2Nlc3NvcgotQHN1YnRpdGxlIGZvciBHQVNQIHZlcnNpb24gMQotQHNwIDEKLUBzdWJ0aXRsZSBNYXJjaCAxOTk0Ci1AYXV0aG9yIFJvbGFuZCBQZXNjaAotQHBhZ2UKLQotQHRleAote1xwYXJza2lwPTBwdCBcaGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi19Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGEgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLQotQG5vZGUgVG9wCi1AdG9wIEdBU1AKLQotR0FTUCBpcyBhIHByZXByb2Nlc3NvciBmb3IgYXNzZW1ibHkgcHJvZ3JhbXMuCi0KLVRoaXMgZmlsZSBkZXNjcmliZXMgdmVyc2lvbiAxIG9mIEdBU1AuCi0KLVN0ZXZlIENoYW1iZXJsYWluIHdyb3RlIEdBU1A7IFJvbGFuZCBQZXNjaCB3cm90ZSB0aGlzIG1hbnVhbC4KLQotQG1lbnUKLSogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgV2hhdCBpcyBHQVNQPwotKiBJbnZva2luZyBHQVNQOjogICAgICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucy4KLSogQ29tbWFuZHM6OiAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yIGNvbW1hbmRzLgotKiBJbmRleDo6ICAgICAgICAgICAgICAgICAgICAgICBJbmRleC4KLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgT3ZlcnZpZXcKLUBjaGFwdGVyIFdoYXQgaXMgR0FTUD8KLQotVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyIGlzIHRvIGFzc2VtYmxlIHRoZSBvdXRwdXQgb2YKLW90aGVyIHByb2dyYW1zLS0tbm90YWJseSBjb21waWxlcnMuICBXaGVuIHlvdSBoYXZlIHRvIGhhbmQtY29kZQotc3BlY2lhbGl6ZWQgcm91dGluZXMgaW4gYXNzZW1ibHksIHRoYXQgbWVhbnMgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBpcwotYW4gdW5mcmllbmRseSBwcm9jZXNzb3I6IGl0IGhhcyBubyBkaXJlY3RpdmVzIGZvciBtYWNyb3MsIGNvbmRpdGlvbmFscywKLW9yIG1hbnkgb3RoZXIgY29udmVuaWVuY2VzIHRoYXQgeW91IG1pZ2h0IGV4cGVjdC4KLQotSW4gc29tZSBjYXNlcyB5b3UgY2FuIHNpbXBseSB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yLCBvciBhIGdlbmVyYWxpemVkCi1wcmVwcm9jZXNzb3IgbGlrZSBAc2N7bTR9OyBidXQgdGhpcyBjYW4gYmUgYXdrd2FyZCwgc2luY2Ugbm9uZSBvZiB0aGVzZQotdGhpbmdzIGFyZSBkZXNpZ25lZCB3aXRoIGFzc2VtYmx5IGluIG1pbmQuCi0KLUBzY3tnYXNwfSBmaWxscyB0aGlzIG5lZWQuICBJdCBpcyBleHByZXNzbHkgZGVzaWduZWQgdG8gcHJvdmlkZSB0aGUKLWZhY2lsaXRpZXMgeW91IG5lZWQgd2l0aCBoYW5kLWNvZGVkIGFzc2VtYmx5IGNvZGUuICBJbXBsZW1lbnRpbmcgaXQgYXMgYQotcHJlcHJvY2Vzc29yLCByYXRoZXIgdGhhbiBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIsIGFsbG93cyB0aGUgbWF4aW11bQotZmxleGliaWxpdHk6IHlvdSBjYW4gdXNlIGl0IHdpdGggaGFuZC1jb2RlZCBhc3NlbWJseSwgd2l0aG91dCBwYXlpbmcgYQotcGVuYWx0eSBvZiBhZGRlZCBjb21wbGV4aXR5IGluIHRoZSBhc3NlbWJsZXIgeW91IHVzZSBmb3IgY29tcGlsZXIKLW91dHB1dC4KLQotSGVyZSBpcyBhIHNtYWxsIGV4YW1wbGUgdG8gZ2l2ZSB0aGUgZmxhdm9yIG9mIEBzY3tnYXNwfS4gIFRoaXMgaW5wdXQgdG8KLUBzY3tnYXNwfQotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAuTUFDUk8gIHNhdmVyZWdzIGZyb209OCB0bz0xNAotY291bnQgICAuQVNTSUdOQSBcZnJvbQotICAgICAgICAhIHNhdmUgclxmcm9tLi5yXHRvCi0gICAgICAgIC5BV0hJTEUgIFwmY291bnQgTEUgXHRvCi0gICAgICAgIG1vdiAgICAgclwmY291bnQsQEAtc3AKLWNvdW50ICAgLkFTU0lHTkEgIFwmY291bnQgKyAxCi0gICAgICAgIC5BRU5EVwotICAgICAgICAuRU5ETQotCi0gICAgICAgIHNhdmVyZWdzIGZyb209MTIKLQotYmFyOiAgICBtb3YgICAgICNIJ2RlYWQrMTAscjAKLWZvbyAgICAgLlNEQVRBQyAiaGVsbG8iPDEwPgotICAgICAgICAuRU5ECi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBub2luZGVudAotZ2VuZXJhdGVzIHRoaXMgYXNzZW1ibHkgcHJvZ3JhbToKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgISBzYXZlIHIxMi4ucjE0Ci0gICAgICAgIG1vdiAgICAgcjEyLEBALXNwCi0gICAgICAgIG1vdiAgICAgcjEzLEBALXNwCi0gICAgICAgIG1vdiAgICAgcjE0LEBALXNwCi0KLWJhcjogICAgbW92ICAgICAjNTcwMDUrMTAscjAKLWZvbzogICAgLmJ5dGUgICA2LDEwNCwxMDEsMTA4LDEwOCwxMTEsMTAKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQG5vZGUgSW52b2tpbmcgR0FTUAotQGNoYXB0ZXIgQ29tbWFuZCBMaW5lIE9wdGlvbnMKLQotQGMgRklYTUUhICBPciBpcyB0aGVyZSBhIHNpbXBsZXIgd2F5LCBjYWxsaW5nIGZyb20gR0FTIG9wdGlvbj8KLVRoZSBzaW1wbGVzdCB3YXkgdG8gdXNlIEBzY3tnYXNwfSBpcyB0byBydW4gaXQgYXMgYSBmaWx0ZXIgYW5kIGFzc2VtYmxlCi1pdHMgb3V0cHV0LiAgSW4gVW5peCBhbmQgaXRzIGlsaywgeW91IGNhbiBkbyB0aGlzLCBmb3IgZXhhbXBsZToKLQotQGMgRklYTUUhIEdBU1AgZmlsZW5hbWUgc3VmZml4IGNvbnZlbnRpb24/Ci1AZXhhbXBsZQotJCBnYXNwIHByb2cuYXNtIHwgYXMgLW8gcHJvZy5vCi1AZW5kIGV4YW1wbGUKLQotTmF0dXJhbGx5LCB0aGVyZSBhcmUgYWxzbyBhIGZldyBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhbGxvdyB5b3UgdG8KLXJlcXVlc3QgdmFyaWF0aW9ucyBvbiB0aGlzIGJhc2ljIHRoZW1lLiAgSGVyZSBpcyB0aGUgZnVsbCBzZXQgb2YKLXBvc3NpYmlsaXRpZXMgZm9yIHRoZSBAc2N7Z2FzcH0gY29tbWFuZCBsaW5lLgotCi1AZXhhbXBsZQotZ2FzcCAgWyAtYSB8IC0tYWx0ZXJuYXRlIF0KLSAgICAgIFsgLWMgQHZhcntjaGFyfSB8IC0tY29tbWVudGNoYXIgQHZhcntjaGFyfSBdCi0gICAgICBbIC1kIHwgLS1kZWJ1ZyBdICBbIC1oIHwgLS1oZWxwIF0gWyAtTSB8IC0tbXJpIF0KLSAgICAgIFsgLW8gQHZhcntvdXRmaWxlfSB8IC0tb3V0cHV0IEB2YXJ7b3V0ZmlsZX0gXQotICAgICAgWyAtcCB8IC0tcHJpbnQgXSAgWyAtcyB8IC0tY29weXNvdXJjZSBdCi0gICAgICBbIC11IHwgLS11bnJlYXNvbmFibGUgXSAgWyAtdiB8IC0tdmVyc2lvbiBdCi0gICAgICBAdmFye2luZmlsZX0gQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7aW5maWxlfSBAZG90c3t9Ci1AYyBGSVhNRSEgV2h5IG5vdCBzdGRpbiBhcyBkZWZhdWx0IGluZmlsZT8KLVRoZSBpbnB1dCBmaWxlIG5hbWVzLiAgWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsZTsgaWYgeW91Ci1zcGVjaWZ5IG1vcmUsIEBzY3tnYXNwfSBwcmVwcm9jZXNzZXMgdGhlbSBhbGwsIGNvbmNhdGVuYXRpbmcgdGhlIG91dHB1dAotaW4gdGhlIG9yZGVyIHlvdSBsaXN0IHRoZSBAdmFye2luZmlsZX0gYXJndW1lbnRzLgotCi1NYXJrIHRoZSBlbmQgb2YgZWFjaCBpbnB1dCBmaWxlIHdpdGggdGhlIHByZXByb2Nlc3NvciBjb21tYW5kCi1AY29kZXsuRU5EfS4gIEB4cmVme090aGVyIENvbW1hbmRzLCwgTWlzY2VsbGFuZW91cyBjb21tYW5kc30uCi0KLUBpdGVtIC1hCi1AaXRlbXggLS1hbHRlcm5hdGUKLVVzZSBhbHRlcm5hdGl2ZSBtYWNybyBzeW50YXguICBAeHJlZntBbHRlcm5hdGUsLCBBbHRlcm5hdGUgbWFjcm8KLXN5bnRheH0sIGZvciBhIGRpc2N1c3Npb24gb2YgaG93IHRoaXMgc3ludGF4IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdAotQHNje2dhc3B9IHN5bnRheC4KLQotQGNpbmRleCBjb21tZW50IGNoYXJhY3RlciwgY2hhbmdpbmcKLUBjaW5kZXggc2VtaWNvbG9uLCBhcyBjb21tZW50Ci1AY2luZGV4IGV4Y2xhbWF0aW9uIG1hcmssIGFzIGNvbW1lbnQKLUBjaW5kZXggc2hyaWVrLCBhcyBjb21tZW50Ci1AY2luZGV4IGJhbmcsIGFzIGNvbW1lbnQKLUBjaW5kZXggQGNvZGV7IX0gZGVmYXVsdCBjb21tZW50IGNoYXIKLUBjaW5kZXggQGNvZGV7O30gYXMgY29tbWVudCBjaGFyCi1AaXRlbSAtYyAnQHZhcntjaGFyfScKLUBpdGVteCAtLWNvbW1lbnRjaGFyICdAdmFye2NoYXJ9JwotVXNlIEB2YXJ7Y2hhcn0gYXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLiAgVGhlIGRlZmF1bHQgY29tbWVudCBjaGFyYWN0ZXIKLWlzIEBzYW1weyF9LiAgRm9yIGV4YW1wbGUsIHRvIHVzZSBhIHNlbWljb2xvbiBhcyB0aGUgY29tbWVudCBjaGFyYWN0ZXIsCi1zcGVjaWZ5IEB3e0BzYW1wey1jICc7J319IG9uIHRoZSBAc2N7Z2FzcH0gY29tbWFuZCBsaW5lLiAgU2luY2UKLWFzc2VtYmxlciBjb21tYW5kIGNoYXJhY3RlcnMgb2Z0ZW4gaGF2ZSBzcGVjaWFsIHNpZ25pZmljYW5jZSB0byBjb21tYW5kCi1zaGVsbHMsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIHF1b3RlIG9yIGVzY2FwZSBAdmFye2NoYXJ9IHdoZW4geW91IHNwZWNpZnkKLWEgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LCBhbGwgZXhhbXBsZXMgaW4gdGhpcyBtYW51YWwgdXNlIHRoZSBkZWZhdWx0Ci1jb21tZW50IGNoYXJhY3RlciBAc2FtcHshfS4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWRlYnVnCi1TaG93IGRlYnVnZ2luZyBzdGF0aXN0aWNzLiAgSW4gdGhpcyB2ZXJzaW9uIG9mIEBzY3tnYXNwfSwgdGhpcyBvcHRpb24KLXByb2R1Y2VzIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHN0cmluZyBidWZmZXJzIHRoYXQgQHNje2dhc3B9IGFsbG9jYXRlcwotaW50ZXJuYWxseS4gIEZvciBlYWNoIGRlZmluZWQgYnVmZmVyc2l6ZSBAdmFye3N9LCBAc2N7Z2FzcH0gc2hvd3MgdGhlCi1udW1iZXIgb2Ygc3RyaW5ncyBAdmFye259IHRoYXQgaXQgYWxsb2NhdGVkLCB3aXRoIGEgbGluZSBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1zdHJpbmdzIHNpemUgQHZhcntzfSA6IEB2YXJ7bn0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUBzY3tnYXNwfSBkaXNwbGF5cyB0aGVzZSBzdGF0aXN0aWNzIG9uIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0sIHdoZW4KLWRvbmUgcHJlcHJvY2Vzc2luZy4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLWhlbHAKLURpc3BsYXkgYSBzdW1tYXJ5IG9mIHRoZSBAc2N7Z2FzcH0gY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0KLUBpdGVtIC1NCi1AaXRlbXggLS1tcmkKLVVzZSBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLiAgVXNpbmcgdGhpcyBvcHRpb24gY2F1c2VzIEBzY3tnYXNwfSB0bwotYWNjZXB0IHRoZSBzeW50YXggYW5kIHBzZXVkby1vcHMgdXNlZCBieSB0aGUgTWljcm90ZWMgUmVzZWFyY2gKLUBjb2Rle0FTTTY4S30gYXNzZW1ibGVyLgotCi1AaXRlbSAtbyBAdmFye291dGZpbGV9Ci1AaXRlbXggLS1vdXRwdXQgQHZhcntvdXRmaWxlfQotV3JpdGUgdGhlIG91dHB1dCBpbiBhIGZpbGUgY2FsbGVkIEB2YXJ7b3V0ZmlsZX0uICBJZiB5b3UgZG8gbm90IHVzZSB0aGUKLUBzYW1wey1vfSBvcHRpb24sIEBzY3tnYXNwfSB3cml0ZXMgaXRzIG91dHB1dCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0Ci1zdHJlYW0uCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1wcmludAotUHJpbnQgbGluZSBudW1iZXJzLiAgQHNje2dhc3B9IG9iZXlzIHRoaXMgb3B0aW9uIEBlbXBoe29ubHl9IGlmIHlvdSBhbHNvCi1zcGVjaWZ5IEBzYW1wey1zfSB0byBjb3B5IHNvdXJjZSBsaW5lcyB0byBpdHMgb3V0cHV0LiAgV2l0aCBAc2FtcHstcwotLXB9LCBAc2N7Z2FzcH0gZGlzcGxheXMgdGhlIGxpbmUgbnVtYmVyIG9mIGVhY2ggc291cmNlIGxpbmUgY29waWVkCi0oaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUpLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tY29weXNvdXJjZQotQ29weSB0aGUgc291cmNlIGxpbmVzIHRvIHRoZSBvdXRwdXQgZmlsZS4gIFVzZSB0aGlzIG9wdGlvbgotdG8gc2VlIHRoZSBlZmZlY3Qgb2YgZWFjaCBwcmVwcm9jZXNzb3IgbGluZSBvbiB0aGUgQHNje2dhc3B9IG91dHB1dC4KLUBzY3tnYXNwfSBwbGFjZXMgYSBjb21tZW50IGNoYXJhY3RlciAoQHNhbXB7IX0gYnkgZGVmYXVsdCkgYXQKLXRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzb3VyY2UgbGluZSBpdCBjb3BpZXMsIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcwotb3B0aW9uIGFuZCBzdGlsbCBhc3NlbWJsZSB0aGUgcmVzdWx0LgotCi1AaXRlbSAtdQotQGl0ZW14IC0tdW5yZWFzb25hYmxlCi1CeXBhc3MgYGB1bnJlYXNvbmFibGUgZXhwYW5zaW9uJycgbGltaXQuICBTaW5jZSB5b3UgY2FuIGRlZmluZSBAc2N7Z2FzcH0KLW1hY3JvcyBpbnNpZGUgb3RoZXIgbWFjcm8gZGVmaW5pdGlvbnMsIHRoZSBwcmVwcm9jZXNzb3Igbm9ybWFsbHkKLWluY2x1ZGVzIGEgc2FuaXR5IGNoZWNrLiAgSWYgeW91ciBwcm9ncmFtIHJlcXVpcmVzIG1vcmUgdGhhbiAxLDAwMAotbmVzdGVkIGV4cGFuc2lvbnMsIEBzY3tnYXNwfSBub3JtYWxseSBleGl0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICBVc2UKLXRoaXMgb3B0aW9uIHRvIHR1cm4gb2ZmIHRoaXMgY2hlY2ssIGFsbG93aW5nIHVubGltaXRlZCBuZXN0ZWQKLWV4cGFuc2lvbnMuCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1EaXNwbGF5IHRoZSBAc2N7Z2FzcH0gdmVyc2lvbiBudW1iZXIuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBDb21tYW5kcwotQGNoYXB0ZXIgUHJlcHJvY2Vzc29yIENvbW1hbmRzCi0KLUBzY3tnYXNwfSBjb21tYW5kcyBoYXZlIGEgc3RyYWlnaHRmb3J3YXJkIHN5bnRheCB0aGF0IGZpdHMgaW4gd2VsbCB3aXRoCi1hc3NlbWJseSBjb252ZW50aW9ucy4gIEluIGdlbmVyYWwsIGEgY29tbWFuZCBleHRlbmRzIGZvciBhIGxpbmUsIGFuZCBtYXkKLWhhdmUgdXAgdG8gdGhyZWUgZmllbGRzOiBhbiBvcHRpb25hbCBsYWJlbCwgdGhlIGNvbW1hbmQgaXRzZWxmLCBhbmQKLW9wdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgY29tbWFuZC4gIFlvdSBjYW4gd3JpdGUgY29tbWFuZHMgaW4gdXBwZXIgb3IKLWxvd2VyIGNhc2UsIHRob3VnaCB0aGlzIG1hbnVhbCBzaG93cyB0aGVtIGluIHVwcGVyIGNhc2UuICBAeHJlZntTeW50YXgKLURldGFpbHMsLCBEZXRhaWxzIG9mIHRoZSBHQVNQIHN5bnRheH0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AbWVudQotKiBDb25kaXRpb25hbHM6OgotKiBMb29wczo6Ci0qIFZhcmlhYmxlczo6Ci0qIE1hY3Jvczo6Ci0qIERhdGE6OgotKiBMaXN0aW5nczo6Ci0qIE90aGVyIENvbW1hbmRzOjoKLSogU3ludGF4IERldGFpbHM6OgotKiBBbHRlcm5hdGU6OgotQGVuZCBtZW51Ci0KLUBub2RlIENvbmRpdGlvbmFscwotQHNlY3Rpb24gQ29uZGl0aW9uYWwgYXNzZW1ibHkKLQotVGhlIGNvbmRpdGlvbmFsLWFzc2VtYmx5IGRpcmVjdGl2ZXMgYWxsb3cgeW91IHRvIGluY2x1ZGUgb3IgZXhjbHVkZQotcG9ydGlvbnMgb2YgYW4gYXNzZW1ibHkgZGVwZW5kaW5nIG9uIGhvdyBhIHBhaXIgb2YgZXhwcmVzc2lvbnMsIG9yIGEKLXBhaXIgb2Ygc3RyaW5ncywgY29tcGFyZS4KLQotVGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGNvbmRpdGlvbmFscyBpcyBmYW1pbGlhciBmcm9tIG1hbnkgb3RoZXIKLWNvbnRleHRzLiAgQGNvZGV7LkFJRn0gbWFya3MgdGhlIHN0YXJ0IG9mIGEgY29uZGl0aW9uYWwsIGFuZCBwcmVjZWRlcwotYXNzZW1ibHkgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlLiAgIEFuIG9wdGlvbmFsCi1AY29kZXsuQUVMU0V9IHByZWNlZGVzIGFzc2VtYmx5IGZvciB0aGUgY29udmVyc2UgY2FzZSwgYW5kIGFuCi1AY29kZXsuQUVOREl9IG1hcmtzIHRoZSBlbmQgb2YgdGhlIGNvbmRpdGlvbi4KLQotQGMgRklYTUUhIFdoeSBkb2Vzbid0IC11IHR1cm4gb2ZmIHRoaXMgY2hlY2s/Ci1Zb3UgbWF5IG5lc3QgY29uZGl0aW9uYWxzIHVwIHRvIGEgZGVwdGggb2YgMTAwOyBAc2N7Z2FzcH0gcmVqZWN0cwotbmVzdGluZyBiZXlvbmQgdGhhdCwgYmVjYXVzZSBpdCBtYXkgaW5kaWNhdGUgYSBidWcgaW4geW91ciBtYWNybwotc3RydWN0dXJlLgotCi1AYyBGSVhNRSEgV2h5IGlzbid0IHRoZXJlIHNvbWV0aGluZyBsaWtlIGNwcCdzIC1EIG9wdGlvbj8gIENvbmRpdGlvbmFscwotQGMgICAgICAgIHdvdWxkIGJlIG11Y2ggbW9yZSB1c2VmdWwgaWYgdGhlcmUgd2VyZS4KLUNvbmRpdGlvbmFscyBhcmUgcHJpbWFyaWx5IHVzZWZ1bCBpbnNpZGUgbWFjcm8gZGVmaW5pdGlvbnMsIHdoZXJlIHlvdQotb2Z0ZW4gbmVlZCBkaWZmZXJlbnQgZWZmZWN0cyBkZXBlbmRpbmcgb24gYXJndW1lbnQgdmFsdWVzLgotQHhyZWZ7TWFjcm9zLCwgRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30sIGZvciBkZXRhaWxzIGFib3V0IGRlZmluaW5nCi1tYWNyb3MuCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5BSUYgQHZhcntleHByYX0gQHZhcntjbXB9IEB2YXJ7ZXhwcmJ9Ci1AaXRlbXggLkFJRiAiQHZhcntzdHJhfSIgQHZhcntjbXB9ICJAdmFye3N0cmJ9IgotCi1UaGUgZ292ZXJuaW5nIGNvbmRpdGlvbiBnb2VzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIEBjb2Rley5BSUZ9Ci1wcmVwcm9jZXNzb3IgY29tbWFuZC4gIFlvdSBtYXkgY29tcGFyZSBlaXRoZXIgdHdvIHN0cmluZ3MsIG9yIHR3bwotZXhwcmVzc2lvbnMuCi0KLVdoZW4geW91IGNvbXBhcmUgc3RyaW5ncywgb25seSB0d28gY29uZGl0aW9uYWwgQHZhcntjbXB9IGNvbXBhcmlzb24KLW9wZXJhdG9ycyBhcmUgYXZhaWxhYmxlOiBAc2FtcHtFUX0gKHRydWUgaWYgQHZhcntzdHJhfSBhbmQgQHZhcntzdHJifQotYXJlIGlkZW50aWNhbCksIGFuZCBAc2FtcHtORX0gKHRoZSBvcHBvc2l0ZSkuCi0KLVdoZW4geW91IGNvbXBhcmUgdHdvIGV4cHJlc3Npb25zLCBAZW1waHtib3RoIGV4cHJlc3Npb25zIG11c3QgYmUKLWFic29sdXRlfSAoQHB4cmVme0V4cHJlc3Npb25zLCwgQXJpdGhtZXRpYyBleHByZXNzaW9ucyBpbiBHQVNQfSkuICBZb3UKLWNhbiB1c2UgdGhlc2UgQHZhcntjbXB9IGNvbXBhcmlzb24gb3BlcmF0b3JzIHdpdGggZXhwcmVzc2lvbnM6Ci0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIEVRCi1BcmUgQHZhcntleHByYX0gYW5kIEB2YXJ7ZXhwcmJ9IGVxdWFsPyAgKEZvciBzdHJpbmdzLCBhcmUgQHZhcntzdHJhfSBhbmQKLUB2YXJ7c3RyYn0gaWRlbnRpY2FsPykKLQotQGl0ZW0gTkUKLUFyZSBAdmFye2V4cHJhfSBhbmQgQHZhcntleHByYn0gZGlmZmVyZW50PyAgKEZvciBzdHJpbmdzLCBhcmUgQHZhcntzdHJhfQotYW5kIEB2YXJ7c3RyYn0gZGlmZmVyZW50PwotCi1AaXRlbSBMVAotSXMgQHZhcntleHByYX0gbGVzcyB0aGFuIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvciBzdHJpbmdzLikKLQotQGl0ZW0gTEUKLUlzIEB2YXJ7ZXhwcmF9IGxlc3MgdGhhbiBvciBlcXVhbCB0byBAdmFye2V4cHJifT8gIChOb3QgYWxsb3dlZCBmb3Igc3RyaW5ncy4pCi0KLUBpdGVtIEdUCi1JcyBAdmFye2V4cHJhfSBncmVhdGVyIHRoYW4gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yIHN0cmluZ3MuKQotCi1AaXRlbSBHRQotSXMgQHZhcntleHByYX0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvcgotc3RyaW5ncy4pCi1AZW5kIGZ0YWJsZQotCi1AaXRlbSAuQUVMU0UKLU1hcmtzIHRoZSBzdGFydCBvZiBhc3NlbWJseSBjb2RlIHRvIGJlIGluY2x1ZGVkIGlmIHRoZSBjb25kaXRpb24gZmFpbHMuCi1PcHRpb25hbCwgYW5kIG9ubHkgYWxsb3dlZCB3aXRoaW4gYSBjb25kaXRpb25hbCAoYmV0d2VlbiBAY29kZXsuQUlGfSBhbmQKLUBjb2Rley5BRU5ESX0pLgotCi1AaXRlbSAuQUVOREkKLU1hcmtzIHRoZSBlbmQgb2YgYSBjb25kaXRpb25hbCBhc3NlbWJseS4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIExvb3BzCi1Ac2VjdGlvbiBSZXBldGl0aXZlIHNlY3Rpb25zIG9mIGFzc2VtYmx5Ci0KLVR3byBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBhbGxvdyB5b3UgdG8gcmVwZWF0ZWRseSBpc3N1ZSBjb3BpZXMgb2YgdGhlCi1zYW1lIGJsb2NrIG9mIGFzc2VtYmx5IGNvZGUuCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5BUkVQRUFUIEB2YXJ7YWV4cH0KLUBpdGVteCAuQUVORFIKLUlmIHlvdSBzaW1wbHkgbmVlZCB0byByZXBlYXQgdGhlIHNhbWUgYmxvY2sgb2YgYXNzZW1ibHkgb3ZlciBhbmQgb3ZlciBhCi1maXhlZCBudW1iZXIgb2YgdGltZXMsIHNhbmR3aWNoIG9uZSBpbnN0YW5jZSBvZiB0aGUgcmVwZWF0ZWQgYmxvY2sKLWJldHdlZW4gQGNvZGV7LkFSRVBFQVR9IGFuZCBAY29kZXsuQUVORFJ9LiAgU3BlY2lmeSB0aGUgbnVtYmVyIG9mCi1jb3BpZXMgYXMgQHZhcnthZXhwfSAod2hpY2ggbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uKS4gIEZvcgotZXhhbXBsZSwgdGhpcyByZXBlYXRzIHR3byBhc3NlbWJseSBzdGF0ZW1lbnRzIHRocmVlIHRpbWVzIGluIHN1Y2Nlc3Npb246Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi0gICAgICAgIC5BUkVQRUFUICAgICAgICAzCi0gICAgICAgIHJvdGNsICAgcjIKLSAgICAgICAgZGl2MSAgICByMCxyMQotICAgICAgICAuQUVORFIKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQGl0ZW0gLkFXSElMRSBAdmFye2V4cHJhfSBAdmFye2NtcH0gQHZhcntleHByYn0KLUBpdGVteCAuQUVORFcKLUBpdGVteCAuQVdISUxFIEB2YXJ7c3RyYX0gQHZhcntjbXB9IEB2YXJ7c3RyYn0KLUBpdGVteCAuQUVORFcKLVRvIHJlcGVhdCBhIGJsb2NrIG9mIGFzc2VtYmx5IGRlcGVuZGluZyBvbiBhIGNvbmRpdGlvbmFsIHRlc3QsIHJhdGhlcgotdGhhbiByZXBlYXRpbmcgaXQgZm9yIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHRpbWVzLCB1c2UgQGNvZGV7LkFXSElMRX0uCi1AY29kZXsuQUVORFd9IG1hcmtzIHRoZSBlbmQgb2YgdGhlIHJlcGVhdGVkIGJsb2NrLiAgVGhlIGNvbmRpdGlvbmFsCi1jb21wYXJpc29uIHdvcmtzIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGZvciBAY29kZXsuQUlGfSwgd2l0aCB0aGUgc2FtZQotY29tcGFyaXNvbiBvcGVyYXRvcnMgKEBweHJlZntDb25kaXRpb25hbHMsLCBDb25kaXRpb25hbCBhc3NlbWJseX0pLgotCi1TaW5jZSB0aGUgdGVybXMgb2YgdGhlIGNvbXBhcmlzb24gbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9uLAotQGNvZGV7LkFXSElMRX0gaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aXRoaW4gbWFjcm9zLiAgQHhyZWZ7TWFjcm9zLCwKLURlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LgotQGVuZCBmdGFibGUKLQotQGNpbmRleCBsb29wcywgYnJlYWtpbmcgb3V0IG9mCi1AY2luZGV4IGJyZWFraW5nIG91dCBvZiBsb29wcwotWW91IGNhbiB1c2UgdGhlIEBjb2Rley5FWElUTX0gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSB0byBicmVhayBvdXQgb2YKLWxvb3BzIGVhcmx5IChhcyB3ZWxsIGFzIHRvIGJyZWFrIG91dCBvZiBtYWNyb3MpLiAgQHhyZWZ7TWFjcm9zLCwKLURlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LgotCi1Abm9kZSBWYXJpYWJsZXMKLUBzZWN0aW9uIFByZXByb2Nlc3NvciB2YXJpYWJsZXMKLQotWW91IGNhbiB1c2UgdmFyaWFibGVzIGluIEBzY3tnYXNwfSB0byByZXByZXNlbnQgc3RyaW5ncywgcmVnaXN0ZXJzLCBvcgotdGhlIHJlc3VsdHMgb2YgZXhwcmVzc2lvbnMuCi0KLVlvdSBtdXN0IGRpc3Rpbmd1aXNoIHR3byBraW5kcyBvZiB2YXJpYWJsZXM6IAotQGVudW1lcmF0ZQotQGl0ZW0KLVZhcmlhYmxlcyBkZWZpbmVkIHdpdGggQGNvZGV7LkVRVX0gb3IgQGNvZGV7LkFTU0lHTn0uICBUbyBldmFsdWF0ZSB0aGlzCi1raW5kIG9mIHZhcmlhYmxlIGluIHlvdXIgYXNzZW1ibHkgb3V0cHV0LCBzaW1wbHkgbWVudGlvbiBpdHMgbmFtZS4gIEZvcgotZXhhbXBsZSwgdGhlc2UgdHdvIGxpbmVzIGRlZmluZSBhbmQgdXNlIGEgdmFyaWFibGUgQHNhbXB7ZWd9OgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotZWcgICAgIC5FUVUgICBGTElQLTY0Ci0gICAgICAgQGRvdHN7fQotICAgICAgIG1vdi5sICBlZyxyMAotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1AZW1waHtEbyBub3QgdXNlfSB0aGlzIGtpbmQgb2YgdmFyaWFibGUgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgb3IKLXdoaWxlIGxvb3BzOyBAc2N7Z2FzcH0gb25seSBldmFsdWF0ZXMgdGhlc2UgdmFyaWFibGVzIHdoZW4gd3JpdGluZwotYXNzZW1ibHkgb3V0cHV0LgotCi1AaXRlbQotVmFyaWFibGVzIGZvciB1c2UgZHVyaW5nIHByZXByb2Nlc3NpbmcuICBZb3UgY2FuIGRlZmluZSB0aGVzZQotd2l0aCBAY29kZXsuQVNTSUdOQ30gb3IgQGNvZGV7LkFTU0lHTkF9LiAgVG8gZXZhbHVhdGUgdGhpcwota2luZCBvZiB2YXJpYWJsZSwgd3JpdGUgQHNhbXB7XCZ9IGJlZm9yZSB0aGUgdmFyaWFibGUgbmFtZTsgZm9yIGV4YW1wbGUsCi0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi1vcGNpdCAgLkFTU0lHTkEgIDQ3Ci0gICAgICAgQGRvdHN7fQotICAgICAgIC5BV0hJTEUgIFwmb3BjaXQgR1QgMAotICAgICAgIEBkb3Rze30KLSAgICAgICAuQUVORFcKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQHNje2dhc3B9IHRyZWF0cyBtYWNybyBhcmd1bWVudHMgYWxtb3N0IHRoZSBzYW1lIHdheSwgYnV0IHRvIGV2YWx1YXRlCi10aGVtIHlvdSB1c2UgdGhlIHByZWZpeCBAc2FtcHtcfSByYXRoZXIgdGhhbiBAc2FtcHtcJn0uCi1AeHJlZntNYWNyb3MsLCBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfS4KLUBlbmQgZW51bWVyYXRlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7cHZhcn0gLkVRVSBAdmFye2V4cHJ9Ci1AYyBGSVhNRSEgIEFueXRoaW5nIHRvIGJld2FyZSBvZiByZSBHQVMgZGlyZWN0aXZlIG9mIHNhbWUgbmFtZT8KLUFzc2lnbiBwcmVwcm9jZXNzb3IgdmFyaWFibGUgQHZhcntwdmFyfSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24KLUB2YXJ7ZXhwcn0uICBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHJlZGVmaW5pdGlvbjsgdXNlIEBzYW1wey5FUVV9Ci13aXRoIHRoZSBzYW1lIEB2YXJ7cHZhcn0gYXMgb2Z0ZW4gYXMgeW91IGZpbmQgaXQgY29udmVuaWVudC4KLQotQGl0ZW0gQHZhcntwdmFyfSAuQVNTSUdOIEB2YXJ7ZXhwcn0KLUFsbW9zdCB0aGUgc2FtZSBhcyBAY29kZXsuRVFVfSwgc2F2ZSB0aGF0IHlvdSBtYXkgbm90IHJlZGVmaW5lCi1AdmFye3B2YXJ9IHVzaW5nIEBjb2Rley5BU1NJR059IG9uY2UgaXQgaGFzIGEgdmFsdWUuCi1AYyBGSVhNRSEhICBTdXBwb3NlZCB0byB3b3JrIHRoaXMgd2F5LCBhcHBhcmVudGx5LCBidXQgb24gOWZlYjk0IHdvcmtzCi1AYyAgICAgICAgICBqdXN0IGxpa2UgLkVRVQotCi1AaXRlbSBAdmFye3B2YXJ9IC5BU1NJR05BIEB2YXJ7YWV4cHJ9Ci1EZWZpbmUgYSB2YXJpYWJsZSB3aXRoIGEgbnVtZXJpYyB2YWx1ZSwgZm9yIHVzZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KLUB2YXJ7YWV4cHJ9IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFlvdSBjYW4gcmVkZWZpbmUgdmFyaWFibGVzCi13aXRoIEBjb2Rley5BU1NJR05BfSBhdCBhbnkgdGltZS4KLQotQGl0ZW0gQHZhcntwdmFyfSAuQVNTSUdOQyAiQHZhcntzdHJ9IgotRGVmaW5lIGEgdmFyaWFibGUgd2l0aCBhIHN0cmluZyB2YWx1ZSwgZm9yIHVzZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KLVlvdSBjYW4gcmVkZWZpbmUgdmFyaWFibGVzIHdpdGggQGNvZGV7LkFTU0lHTkN9IGF0IGFueSB0aW1lLgotCi1AaXRlbSBAdmFye3B2YXJ9IC5SRUcgKEB2YXJ7cmVnaXN0ZXJ9KQotVXNlIEBjb2Rley5SRUd9IHRvIGRlZmluZSBhIHZhcmlhYmxlIHRoYXQgcmVwcmVzZW50cyBhIHJlZ2lzdGVyLiAgSW4KLXBhcnRpY3VsYXIsIEB2YXJ7cmVnaXN0ZXJ9IGlzIEBlbXBoe25vdCBldmFsdWF0ZWR9IGFzIGFuIGV4cHJlc3Npb24uCi1Zb3UgbWF5IHVzZSBAY29kZXsuUkVHfSBhdCB3aWxsIHRvIHJlZGVmaW5lIHJlZ2lzdGVyIHZhcmlhYmxlcy4KLUBlbmQgZnRhYmxlCi0KLUFsbCB0aGVzZSBkaXJlY3RpdmVzIGFjY2VwdCB0aGUgdmFyaWFibGUgbmFtZSBpbiB0aGUgYGBsYWJlbCcnIHBvc2l0aW9uLAotdGhhdCBpcyBhdCB0aGUgbGVmdCBtYXJnaW4uICBZb3UgbWF5IHNwZWNpZnkgYSBjb2xvbiBhZnRlciB0aGUgdmFyaWFibGUKLW5hbWUgaWYgeW91IHdpc2g7IHRoZSBmaXJzdCBleGFtcGxlIGFib3ZlIGNvdWxkIGhhdmUgc3RhcnRlZCBAc2FtcHtlZzp9Ci13aXRoIHRoZSBzYW1lIGVmZmVjdC4KLQotQGMgcGFnZWJyZWFrIG1ha2VzIGZvciBiZXR0ZXIgYWVzdGhldGljcy0tLWVuc3VyZXMgbWFjcm8gYW5kIGV4cGFuc2lvbiB0b2dldGhlcgotQHBhZ2UKLUBub2RlIE1hY3JvcwotQHNlY3Rpb24gRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlcwotCi1UaGUgY29tbWFuZHMgQGNvZGV7Lk1BQ1JPfSBhbmQgQGNvZGV7LkVORE19IGFsbG93IHlvdSB0byBkZWZpbmUgbWFjcm9zCi10aGF0IGdlbmVyYXRlIGFzc2VtYmx5IG91dHB1dC4gIFlvdSBjYW4gdXNlIHRoZXNlIG1hY3JvcyB3aXRoIGEgc3ludGF4Ci1zaW1pbGFyIHRvIGJ1aWx0LWluIEBzY3tnYXNwfSBvciBhc3NlbWJsZXIgZGlyZWN0aXZlcy4gIEZvciBleGFtcGxlLAotdGhpcyBkZWZpbml0aW9uIHNwZWNpZmllcyBhIG1hY3JvIEBjb2Rle1NVTX0gdGhhdCBhZGRzIHRvZ2V0aGVyIGEgcmFuZ2Ugb2YKLWNvbnNlY3V0aXZlIHJlZ2lzdGVyczoKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgLk1BQ1JPICBTVU0gRlJPTT0wLCBUTz05Ci0gICAgICAgICEgXEZST00gXFRPCi0gICAgICAgIG1vdiAgICAgclxGUk9NLHIxMAotQ09VTlQgICAuQVNTSUdOQSAgICAgICAgXEZST00rMQotICAgICAgICAuQVdISUxFIFwmQ09VTlQgTEUgXFRPCi0gICAgICAgIGFkZCAgICAgclwmQ09VTlQscjEwCi1DT1VOVCAgIC5BU1NJR05BICAgICAgICBcJkNPVU5UKzEKLSAgICAgICAgLkFFTkRXCi0gICAgICAgIC5FTkRNCi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBub2luZGVudAotV2l0aCB0aGF0IGRlZmluaXRpb24sIEBzYW1we1NVTSAwLDV9IGdlbmVyYXRlcyB0aGlzIGFzc2VtYmx5IG91dHB1dDoKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgISAwIDUKLSAgICAgICAgbW92ICAgICByMCxyMTAKLSAgICAgICAgYWRkICAgICByMSxyMTAKLSAgICAgICAgYWRkICAgICByMixyMTAKLSAgICAgICAgYWRkICAgICByMyxyMTAKLSAgICAgICAgYWRkICAgICByNCxyMTAKLSAgICAgICAgYWRkICAgICByNSxyMTAKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLk1BQ1JPIEB2YXJ7bWFjbmFtZX0KLUBpdGVteCAuTUFDUk8gQHZhcnttYWNuYW1lfSBAdmFye21hY2FyZ3N9IEBkb3Rze30KLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEB2YXJ7bWFjbmFtZX0uICBJZiB5b3VyIG1hY3JvCi1kZWZpbml0aW9uIHJlcXVpcmVzIGFyZ3VtZW50cywgc3BlY2lmeSB0aGVpciBuYW1lcyBhZnRlciB0aGUgbWFjcm8gbmFtZSwKLXNlcGFyYXRlZCBieSBjb21tYXMgb3Igc3BhY2VzLiAgWW91IGNhbiBzdXBwbHkgYSBkZWZhdWx0IHZhbHVlIGZvciBhbnkKLW1hY3JvIGFyZ3VtZW50IGJ5IGZvbGxvd2luZyB0aGUgbmFtZSB3aXRoIEBzYW1wez1AdmFye2RlZmx0fX0uICBGb3IKLWV4YW1wbGUsIHRoZXNlIGFyZSBhbGwgdmFsaWQgQGNvZGV7Lk1BQ1JPfSBzdGF0ZW1lbnRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5NQUNSTyBDT01NCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtDT01NfSwgd2hpY2ggdGFrZXMgbm8KLWFyZ3VtZW50cy4KLQotQGl0ZW0gLk1BQ1JPIFBMVVMxIFAsIFAxCi1AaXRlbXggLk1BQ1JPIFBMVVMxIFAgUDEKLUVpdGhlciBzdGF0ZW1lbnQgYmVnaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle1BMVVMxfSwKLXdoaWNoIHRha2VzIHR3byBhcmd1bWVudHM7IHdpdGhpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgd3JpdGUKLUBzYW1we1xQfSBvciBAc2FtcHtcUDF9IHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudHMuCi0KLUBpdGVtIC5NQUNSTyBSRVNFUlZFX1NUUiBQMT0wIFAyCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtSRVNFUlZFX1NUUn0sIHdpdGggdHdvCi1hcmd1bWVudHMuICBUaGUgZmlyc3QgYXJndW1lbnQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYnV0IG5vdCB0aGUgc2Vjb25kLgotQWZ0ZXIgdGhlIGRlZmluaXRpb24gaXMgY29tcGxldGUsIHlvdSBjYW4gY2FsbCB0aGUgbWFjcm8gZWl0aGVyIGFzCi1Ac2FtcHtSRVNFUlZFX1NUUiBAdmFye2F9LEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xQMX0gZXZhbHVhdGluZyB0bwotQHZhcnthfSBhbmQgQHNhbXB7XFAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLCBvciBhcyBAc2FtcHtSRVNFUlZFX1NUUgotLEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xQMX0gZXZhbHVhdGluZyBhcyB0aGUgZGVmYXVsdCwgaW4gdGhpcyBjYXNlCi1Ac2FtcHswfSwgYW5kIEBzYW1we1xQMn0gZXZhbHVhdGluZyB0byBAdmFye2J9KS4KLUBlbmQgdGFibGUKLQotV2hlbiB5b3UgY2FsbCBhIG1hY3JvLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHZhbHVlcyBlaXRoZXIgYnkKLXBvc2l0aW9uLCBvciBieSBrZXl3b3JkLiAgRm9yIGV4YW1wbGUsIEBzYW1we1NVTSA5LDE3fSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHtTVU0gVE89MTcsIEZST009OX0uICBNYWNybyBhcmd1bWVudHMgYXJlIHByZXByb2Nlc3NvciB2YXJpYWJsZXMKLXNpbWlsYXIgdG8gdGhlIHZhcmlhYmxlcyB5b3UgZGVmaW5lIHdpdGggQHNhbXB7LkFTU0lHTkF9IG9yCi1Ac2FtcHsuQVNTSUdOQ307IGluIHBhcnRpY3VsYXIsIHlvdSBjYW4gdXNlIHRoZW0gaW4gY29uZGl0aW9uYWxzIG9yIGZvcgotbG9vcCBjb250cm9sLiAgKFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIHByZWZpeCB5b3Ugd3JpdGUgdG8gZXZhbHVhdGUKLXRoZSB2YXJpYWJsZTogZm9yIGEgbWFjcm8gYXJndW1lbnQsIHdyaXRlIEBzYW1we1xAdmFye2FyZ25hbWV9fSwgYnV0IGZvcgotYSBwcmVwcm9jZXNzb3IgdmFyaWFibGUsIHdyaXRlIEBzYW1we1wmQHZhcnt2YXJuYW1lfX0uKQotCi1AaXRlbSBAdmFye25hbWV9IC5NQUNSTwotQGl0ZW14IEB2YXJ7bmFtZX0gLk1BQ1JPICggQHZhcnttYWNhcmdzfSBAZG90c3t9ICkKLUBjIEZJWE1FIGNoZWNrOiBJIHRoaW5rIG5vIGVycm9yIF9hbmRfIG5vIGFyZ3MgcmVjb2duaXplZCBpZiBJIHVzZSBmb3JtCi1AYyAgICAgICBOQU1FICAuTUFDUk8gICBBUkcgQVJHCi1BbiBhbHRlcm5hdGl2ZSBmb3JtIG9mIGludHJvZHVjaW5nIGEgbWFjcm8gZGVmaW5pdGlvbjogc3BlY2lmeSB0aGUgbWFjcm8KLW5hbWUgaW4gdGhlIGxhYmVsIHBvc2l0aW9uLCBhbmQgdGhlIGFyZ3VtZW50cyAoaWYgYW55KSBiZXR3ZWVuCi1wYXJlbnRoZXNlcyBhZnRlciB0aGUgbmFtZS4gIERlZmF1bHRpbmcgcnVsZXMgYW5kIHVzYWdlIHdvcmsgdGhlIHNhbWUKLXdheSBhcyBmb3IgdGhlIG90aGVyIG1hY3JvIGRlZmluaXRpb24gc3ludGF4LgotCi1AaXRlbSAuRU5ETQotTWFyayB0aGUgZW5kIG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4KLQotQGl0ZW0gLkVYSVRNCi1FeGl0IGVhcmx5IGZyb20gdGhlIGN1cnJlbnQgbWFjcm8gZGVmaW5pdGlvbiwgQGNvZGV7LkFSRVBFQVR9IGxvb3AsIG9yCi1AY29kZXsuQVdISUxFfSBsb29wLgotCi1AY2luZGV4IG51bWJlciBvZiBtYWNyb3MgZXhlY3V0ZWQKLUBjaW5kZXggbWFjcm9zLCBjb3VudCBleGVjdXRlZAotQGl0ZW0gXEBACi1Ac2N7Z2FzcH0gbWFpbnRhaW5zIGEgY291bnRlciBvZiBob3cgbWFueSBtYWNyb3MgaXQgaGFzCi1leGVjdXRlZCBpbiB0aGlzIHBzZXVkby12YXJpYWJsZTsgeW91IGNhbiBjb3B5IHRoYXQgbnVtYmVyIHRvIHlvdXIKLW91dHB1dCB3aXRoIEBzYW1we1xAQH0sIGJ1dCBAZW1waHtvbmx5IHdpdGhpbiBhIG1hY3JvIGRlZmluaXRpb259LgotCi1AaXRlbSBMT0NBTCBAdmFye25hbWV9IFsgLCBAZG90c3t9IF0KLUBlbXBoe1dhcm5pbmc6IEBjb2Rle0xPQ0FMfSBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0IGBgYWx0ZXJuYXRlCi1tYWNybyBzeW50YXgnJyB3aXRoIEBzYW1wey1hfSBvciBAc2FtcHstLWFsdGVybmF0ZX0ufSAgQHhyZWZ7QWx0ZXJuYXRlLCwKLUFsdGVybmF0ZSBtYWNybyBzeW50YXh9LgotCi1HZW5lcmF0ZSBhIHN0cmluZyByZXBsYWNlbWVudCBmb3IgZWFjaCBvZiB0aGUgQHZhcntuYW1lfSBhcmd1bWVudHMsIGFuZAotcmVwbGFjZSBhbnkgaW5zdGFuY2VzIG9mIEB2YXJ7bmFtZX0gaW4gZWFjaCBtYWNybyBleHBhbnNpb24uICBUaGUKLXJlcGxhY2VtZW50IHN0cmluZyBpcyB1bmlxdWUgaW4gdGhlIGFzc2VtYmx5LCBhbmQgZGlmZmVyZW50IGZvciBlYWNoCi1zZXBhcmF0ZSBtYWNybyBleHBhbnNpb24uICBAY29kZXtMT0NBTH0gYWxsb3dzIHlvdSB0byB3cml0ZSBtYWNyb3MgdGhhdAotZGVmaW5lIHN5bWJvbHMsIHdpdGhvdXQgZmVhciBvZiBjb25mbGljdCBiZXR3ZWVuIHNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbnMuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBEYXRhCi1Ac2VjdGlvbiBEYXRhIG91dHB1dAotCi1JbiBhc3NlbWJseSBjb2RlLCB5b3Ugb2Z0ZW4gbmVlZCB0byBzcGVjaWZ5IHdvcmtpbmcgYXJlYXMgb2YgbWVtb3J5OwotZGVwZW5kaW5nIG9uIHRoZSBhcHBsaWNhdGlvbiwgeW91IG1heSB3YW50IHRvIGluaXRpYWxpemUgc3VjaCBtZW1vcnkgb3IKLW5vdC4gIEBzY3tnYXNwfSBwcm92aWRlcyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB0byBoZWxwIHlvdSBhdm9pZAotcmVwZXRpdGl2ZSBjb2RpbmcgZm9yIGJvdGggcHVycG9zZXMuCi0KLVlvdSBjYW4gdXNlIGxhYmVscyBhcyB1c3VhbCB0byBtYXJrIHRoZSBkYXRhIGFyZWFzLgotCi1AbWVudQotKiBJbml0aWFsaXplZDo6Ci0qIFVuaW5pdGlhbGl6ZWQ6OgotQGVuZCBtZW51Ci0KLUBub2RlIEluaXRpYWxpemVkCi1Ac3Vic2VjdGlvbiBJbml0aWFsaXplZCBkYXRhCi0KLVRoZXNlIGFyZSB0aGUgQHNje2dhc3B9IGRpcmVjdGl2ZXMgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCB0aGUgc3RhbmRhcmQKLUBzY3tnbnV9IGFzc2VtYmxlciBkaXJlY3RpdmVzIHRoZXkgZXhwYW5kIHRvOgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuREFUQSBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1AaXRlbXggLkRBVEEuQiBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1AaXRlbXggLkRBVEEuVyBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1AaXRlbXggLkRBVEEuTCBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1FdmFsdWF0ZSBhcml0aG1ldGljIGV4cHJlc3Npb25zIEB2YXJ7ZXhwcn0sIGFuZCBlbWl0IHRoZSBjb3JyZXNwb25kaW5nCi1AY29kZXthc30gZGlyZWN0aXZlIChsYWJlbGxlZCB3aXRoIEB2YXJ7bGFifSkuICBUaGUgdW5xdWFsaWZpZWQKLUBjb2Rley5EQVRBfSBlbWl0cyBAc2FtcHsubG9uZ307IEBjb2Rley5EQVRBLkJ9IGVtaXRzIEBzYW1wey5ieXRlfTsKLUBjb2Rley5EQVRBLld9IGVtaXRzIEBzYW1wey5zaG9ydH07IGFuZCBAY29kZXsuREFUQS5MfSBlbWl0cwotQHNhbXB7Lmxvbmd9LgotCi1Gb3IgZXhhbXBsZSwgQHNhbXB7Zm9vIC5EQVRBIDEsMiwzfSBlbWl0cyBAc2FtcHtmb286IC5sb25nIDEsMiwzfS4KLQotQGl0ZW0gLkRBVEFCIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGl0ZW14IC5EQVRBQi5CIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGl0ZW14IC5EQVRBQi5XIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGl0ZW14IC5EQVRBQi5MIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGMgRklYTUUhIExvb2tzIGxpa2UgZ2FzcCBhY2NlcHRzIGFuZCBpZ25vcmVzIGFyZ3MgYWZ0ZXIgMm5kLgotTWFrZSBAY29kZXthc30gZW1pdCBAdmFye3JlcGVhdH0gY29waWVzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbgotQHZhcntleHByfSAodXNpbmcgdGhlIEBjb2Rle2FzfSBkaXJlY3RpdmUgQGNvZGV7LmZpbGx9KS4KLUBzYW1wey5EQVRBQi5CfSByZXBlYXRzIG9uZS1ieXRlIHZhbHVlczsgQHNhbXB7LkRBVEFCLld9IHJlcGVhdHMKLXR3by1ieXRlIHZhbHVlczsgYW5kIEBzYW1wey5EQVRBQi5MfSByZXBlYXRzIGZvdXItYnl0ZSB2YWx1ZXMuCi1Ac2FtcHsuREFUQUJ9IHdpdGhvdXQgYSBzdWZmaXggcmVwZWF0cyBmb3VyLWJ5dGUgdmFsdWVzLCBqdXN0IGxpa2UKLUBzYW1wey5EQVRBQi5MfS4KLQotQGMgRklYTUUhIEFsbG93aW5nIHplcm8gbWlnaHQgYmUgdXNlZnVsIGZvciBlZGdlIGNvbmRpdGlvbnMgaW4gbWFjcm9zLgotQHZhcntyZXBlYXR9IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aXRoIGEgcG9zaXRpdmUgdmFsdWUuCi0KLUBpdGVtIC5TREFUQSAiQHZhcntzdHJ9IiBAZG90c3t9Ci1TdHJpbmcgZGF0YS4gIEVtaXRzIGEgY29uY2F0ZW5hdGlvbiBvZiBieXRlcywgcHJlY2lzZWx5IGFzIHlvdSBzcGVjaWZ5Ci10aGVtIChpbiBwYXJ0aWN1bGFyLCBAZW1waHtub3RoaW5nIGlzIGFkZGVkIHRvIG1hcmsgdGhlIGVuZH0gb2YgdGhlCi1zdHJpbmcpLiAgQHhyZWZ7Q29uc3RhbnRzLCwgU3RyaW5nIGFuZCBudW1lcmljIGNvbnN0YW50c30sIGZvciBkZXRhaWxzCi1hYm91dCBob3cgdG8gd3JpdGUgc3RyaW5ncy4gIEBjb2Rley5TREFUQX0gY29uY2F0ZW5hdGVzIG11bHRpcGxlCi1hcmd1bWVudHMsIG1ha2luZyBpdCBlYXN5IHRvIHN3aXRjaCBiZXR3ZWVuIHN0cmluZyByZXByZXNlbnRhdGlvbnMuICBZb3UKLWNhbiB1c2UgY29tbWFzIHRvIHNlcGFyYXRlIHRoZSBpbmRpdmlkdWFsIGFyZ3VtZW50cyBmb3IgY2xhcml0eSwgaWYgeW91Ci1jaG9vc2UuCi0KLUBpdGVtIC5TREFUQUIgQHZhcntyZXBlYXR9LCAiQHZhcntzdHJ9IiBAZG90c3t9Ci1SZXBlYXRlZCBzdHJpbmcgZGF0YS4gIFRoZSBmaXJzdCBhcmd1bWVudCBzcGVjaWZpZXMgaG93IG1hbnkgY29waWVzIG9mCi10aGUgc3RyaW5nIHRvIGVtaXQ7IHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHNwZWNpZnkgdGhlIHN0cmluZywgaW4gdGhlCi1zYW1lIHdheSBhcyB0aGUgYXJndW1lbnRzIHRvIEBjb2Rley5TREFUQX0uCi0KLUBpdGVtIC5TREFUQVogIkB2YXJ7c3RyfSIgQGRvdHN7fQotWmVyby10ZXJtaW5hdGVkIHN0cmluZyBkYXRhLiAgSnVzdCBsaWtlIEBjb2Rley5TREFUQX0sIGV4Y2VwdCB0aGF0Ci1AY29kZXsuU0RBVEFafSB3cml0ZXMgYSB6ZXJvIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotCi1AaXRlbSAuU0RBVEFDICJAdmFye3N0cn0iIEBkb3Rze30KLUNvdW50LXByZWZpeGVkIHN0cmluZyBkYXRhLiAgSnVzdCBsaWtlIEBjb2Rley5TREFUQX0sIGV4Y2VwdCB0aGF0Ci1Ac2N7Z2FzcH0gcHJlY2VkZXMgdGhlIHN0cmluZyB3aXRoIGEgbGVhZGluZyBvbmUtYnl0ZSBjb3VudC4gIEZvcgotZXhhbXBsZSwgQHNhbXB7LlNEQVRBQyAiSEkifSBnZW5lcmF0ZXMgQHNhbXB7LmJ5dGUgMiw3Miw3M30uICBTaW5jZSB0aGUKLWNvdW50IGZpZWxkIGlzIG9ubHkgb25lIGJ5dGUsIHlvdSBjYW4gb25seSB1c2UgQGNvZGV7LlNEQVRBQ30gZm9yCi1zdHJpbmdzIGxlc3MgdGhhbiAyNTYgYnl0ZXMgaW4gbGVuZ3RoLgotQGVuZCBmdGFibGUKLQotQG5vZGUgVW5pbml0aWFsaXplZAotQHN1YnNlY3Rpb24gVW5pbml0aWFsaXplZCBkYXRhCi0KLUBjIEZJWE1FISAgLnNwYWNlIGRpZmZlcmVudCBvbiBzb21lIHBsYXRmb3Jtcywgbm90YWJseSBIUFBBLiAgQ29uZmlnPwotVXNlIHRoZSBAY29kZXsuUkVTfSwgQGNvZGV7LlNSRVN9LCBAY29kZXsuU1JFU0N9LCBhbmQgQGNvZGV7LlNSRVNafQotZGlyZWN0aXZlcyB0byByZXNlcnZlIG1lbW9yeSBhbmQgbGVhdmUgaXQgdW5pbml0aWFsaXplZC4gIEBzY3tnYXNwfQotcmVzb2x2ZXMgdGhlc2UgZGlyZWN0aXZlcyB0byBhcHByb3ByaWF0ZSBjYWxscyBvZiB0aGUgQHNje2dudX0KLUBjb2Rle2FzfSBAY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLlJFUyBAdmFye2NvdW50fQotQGl0ZW14IC5SRVMuQiBAdmFye2NvdW50fQotQGl0ZW14IC5SRVMuVyBAdmFye2NvdW50fQotQGl0ZW14IC5SRVMuTCBAdmFye2NvdW50fQotUmVzZXJ2ZSByb29tIGZvciBAdmFye2NvdW50fSB1bmluaXRpYWxpemVkIGVsZW1lbnRzIG9mIGRhdGEuICBUaGUKLXN1ZmZpeCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgZWFjaCBlbGVtZW50OiBAY29kZXsuUkVTLkJ9IHJlc2VydmVzCi1AdmFye2NvdW50fSBieXRlcywgQGNvZGV7LlJFUy5XfSByZXNlcnZlcyBAdmFye2NvdW50fSBwYWlycyBvZiBieXRlcywKLWFuZCBAY29kZXsuUkVTLkx9IHJlc2VydmVzIEB2YXJ7Y291bnR9IHF1YXJ0ZXRzLiAgQGNvZGV7LlJFU30gd2l0aG91dCBhCi1zdWZmaXggaXMgZXF1aXZhbGVudCB0byBAY29kZXsuUkVTLkx9LgotCi1AaXRlbSAuU1JFUyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTLkIgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFUy5XIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVMuTCBAdmFye2NvdW50fQotQGMgRklYTUUhICBUaGlzIGlzIGJvcmluZy4gIFNob3VsZG4ndCBpdCBhdCBsZWFzdCBoYXZlIGEgZGlmZmVyZW50Ci1AYyAgICAgICAgIGRlZmF1bHQgc2l6ZT8gIChlLmcuIHRoZSAiUyIgc3VnZ2VzdHMgInN0cmluZyIsIGZvciB3aGljaCAuQgotQGMgICAgICAgICB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlKQotQGNvZGV7LlNSRVN9IGlzIGEgc3lub255bSBmb3IgQHNhbXB7LlJFU30uCi0KLUBpdGVtIC5TUkVTQyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTQy5CIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNDLlcgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU0MuTCBAdmFye2NvdW50fQotTGlrZSBAY29kZXsuU1JFU30sIGJ1dCByZXNlcnZlcyBzcGFjZSBmb3IgQGNvZGV7QHZhcntjb3VudH0rMX0gZWxlbWVudHMuCi0KLUBpdGVtIC5TUkVTWiBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTWi5CIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNaLlcgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU1ouTCBAdmFye2NvdW50fQotTGlrZSBAY29kZXsuU1JFU30sIGJ1dCByZXNlcnZlcyBzcGFjZSBmb3IgQGNvZGV7QHZhcntjb3VudH0rMX0gZWxlbWVudHMuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBMaXN0aW5ncwotQHNlY3Rpb24gQXNzZW1ibHkgbGlzdGluZyBjb250cm9sCi0KLVRoZSBAc2N7Z2FzcH0gbGlzdGluZy1jb250cm9sIGRpcmVjdGl2ZXMgY29ycmVzcG9uZCB0bwotcmVsYXRlZCBAc2N7Z251fSBAY29kZXthc30gZGlyZWN0aXZlcy4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLlBSSU5UIExJU1QKLUBpdGVteCAuUFJJTlQgTk9MSVNUCi1QcmludCBjb250cm9sLiAgVGhpcyBkaXJlY3RpdmUgZW1pdHMgdGhlIEBzY3tnbnV9IEBjb2Rle2FzfSBkaXJlY3RpdmUKLUBjb2Rley5saXN0fSBvciBAY29kZXsubm9saXN0fSwgYWNjb3JkaW5nIHRvIGl0cyBhcmd1bWVudC4gIEB4cmVme0xpc3QsLAotQGNvZGV7Lmxpc3R9LCBhcy5pbmZvLCBVc2luZyBhc30sIGZvciBkZXRhaWxzIG9uIGhvdyB0aGVzZSBkaXJlY3RpdmVzCi1pbnRlcmFjdC4KLQotQGl0ZW0gLkZPUk0gTElOPUB2YXJ7bG59Ci1AaXRlbXggLkZPUk0gQ09MPUB2YXJ7Y29sc30KLUBpdGVteCAuRk9STSBMSU49QHZhcntsbn0gQ09MPUB2YXJ7Y29sc30KLVNwZWNpZnkgdGhlIHBhZ2Ugc2l6ZSBmb3IgYXNzZW1ibHkgbGlzdGluZ3M6IEB2YXJ7bG59IHJlcHJlc2VudHMgdGhlCi1udW1iZXIgb2YgbGluZXMsIGFuZCBAdmFye2NvbHN9IHRoZSBudW1iZXIgb2YgY29sdW1ucy4gIFlvdSBtYXkgc3BlY2lmeQotZWl0aGVyIHBhZ2UgZGltZW5zaW9uIGluZGVwZW5kZW50bHksIG9yIGJvdGggdG9nZXRoZXIuICBJZiB5b3UgZG8gbm90Ci1zcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMsIEBzY3tnYXNwfSBhc3N1bWVzIDYwIGxpbmVzOyBpZiB5b3UgZG8gbm90Ci1zcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucywgQHNje2dhc3B9IGFzc3VtZXMgMTMyIGNvbHVtbnMuCi0oQW55IHZhbHVlcyB5b3UgbWF5IGhhdmUgc3BlY2lmaWVkIGluIHByZXZpb3VzIGluc3RhbmNlcyBvZiBAY29kZXsuRk9STX0KLWRvIEBlbXBoe25vdH0gY2Fycnkgb3ZlciBhcyBkZWZhdWx0cy4pICBFbWl0cyB0aGUgQGNvZGV7LnBzaXplfQotYXNzZW1ibGVyIGRpcmVjdGl2ZS4KLQotQGl0ZW0gLkhFQURJTkcgQHZhcntzdHJpbmd9Ci1TcGVjaWZ5IEB2YXJ7c3RyaW5nfSBhcyB0aGUgdGl0bGUgb2YgeW91ciBhc3NlbWJseSBsaXN0aW5ncy4gIEVtaXRzCi1Ac2FtcHsudGl0bGUgIkB2YXJ7c3RyaW5nfSJ9LgotCi1AaXRlbSAuUEFHRQotRm9yY2UgYSBuZXcgcGFnZSBpbiBhc3NlbWJseSBsaXN0aW5ncy4gIEVtaXRzIEBzYW1wey5lamVjdH0uCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBPdGhlciBDb21tYW5kcwotQHNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb21tYW5kcwotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuQUxURVJOQVRFCi1Vc2UgdGhlIGFsdGVybmF0ZSBtYWNybyBzeW50YXggaGVuY2Vmb3J0aCBpbiB0aGUgYXNzZW1ibHkuCi1AeHJlZntBbHRlcm5hdGUsLCBBbHRlcm5hdGUgbWFjcm8gc3ludGF4fS4KLQotQGl0ZW0gLk9SRwotQGMgRklYTUUhICBUaGlzIGlzIHZlcnkgc3RyYW5nZSwgc2luY2UgX0dBU18gdW5kZXJzdGFuZHMgLm9yZwotVGhpcyBjb21tYW5kIGlzIHJlY29nbml6ZWQsIGJ1dCBub3QgeWV0IGltcGxlbWVudGVkLiAgQHNje2dhc3B9Ci1nZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvZ3JhbXMgdGhhdCB1c2UgQGNvZGV7Lk9SR30uCi0KLUBpdGVtIC5SQURJWCBAdmFye3N9Ci1AYyBGSVhNRSBubyB0ZXN0IGNhc2VzIGluIHRlc3RzdWl0ZS9nYXNwCi1Ac2N7Z2FzcH0gdW5kZXJzdGFuZHMgbnVtYmVycyBpbiBhbnkgb2YgYmFzZSB0d28sIGVpZ2h0LCB0ZW4sIG9yCi1zaXh0ZWVuLiAgWW91IGNhbiBlbmNvZGUgdGhlIGJhc2UgZXhwbGljaXRseSBpbiBhbnkgbnVtZXJpYyBjb25zdGFudAotKEBweHJlZntDb25zdGFudHMsLCBTdHJpbmcgYW5kIG51bWVyaWMgY29uc3RhbnRzfSkuICBJZiB5b3Ugd3JpdGUKLW51bWJlcnMgd2l0aG91dCBhbiBleHBsaWNpdCBpbmRpY2F0aW9uIG9mIHRoZSBiYXNlLCB0aGUgbW9zdCByZWNlbnQKLUBzYW1wey5SQURJWCBAdmFye3N9fSBjb21tYW5kIGRldGVybWluZXMgaG93IHRoZXkgYXJlIGludGVycHJldGVkLgotQHZhcntzfSBpcyBhIHNpbmdsZSBsZXR0ZXIsIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5SQURJWCBCCi1CYXNlIDIuCi0KLUBpdGVtIC5SQURJWCBRCi1CYXNlIDguCi0KLUBpdGVtIC5SQURJWCBECi1CYXNlIDEwLiAgVGhpcyBpcyB0aGUgb3JpZ2luYWwgZGVmYXVsdCByYWRpeC4KLQotQGl0ZW0gLlJBRElYIEgKLUJhc2UgMTYuCi1AZW5kIHRhYmxlCi0KLVlvdSBtYXkgc3BlY2lmeSB0aGUgYXJndW1lbnQgQHZhcntzfSBpbiBsb3dlciBjYXNlIChhbnkgb2YgQHNhbXB7YnFkaH0pCi13aXRoIHRoZSBzYW1lIGVmZmVjdHMuCi0KLUBpdGVtIC5FWFBPUlQgQHZhcntuYW1lfQotQGl0ZW14IC5HTE9CQUwgQHZhcntuYW1lfQotQGMgRklYTUUhIE5vIHRlc3QgY2FzZXMgaW4gdGVzdHN1aXRlL2dhc3AKLURlY2xhcmUgQHZhcntuYW1lfSBnbG9iYWwgKGVtaXRzIEBzYW1wey5nbG9iYWwgQHZhcntuYW1lfX0pLiAgVGhlIHR3bwotZGlyZWN0aXZlcyBhcmUgc3lub255bW91cy4KLQotQGl0ZW0gLlBST0dSQU0KLU5vIGVmZmVjdDogQHNje2dhc3B9IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUsIGFuZCBzaWxlbnRseSBpZ25vcmVzIGl0LgotCi1AaXRlbSAuRU5ECi1NYXJrIGVuZCBvZiBlYWNoIHByZXByb2Nlc3NvciBmaWxlLiAgQHNje2dhc3B9IGlzc3VlcyBhIHdhcm5pbmcgaWYgaXQKLXJlYWNoZXMgZW5kIG9mIGZpbGUgd2l0aG91dCBzZWVpbmcgdGhpcyBjb21tYW5kLgotCi1AaXRlbSAuSU5DTFVERSAiQHZhcntzdHJ9IgotUHJlcHJvY2VzcyB0aGUgZmlsZSBuYW1lZCBieSBAdmFye3N0cn0sIGFzIGlmIGl0cyBjb250ZW50cyBhcHBlYXJlZAotd2hlcmUgdGhlIEBjb2Rley5JTkNMVURFfSBkaXJlY3RpdmUgZG9lcy4gIEBzY3tnYXNwfSBpbXBvc2VzIGEgbWF4aW11bQotbGltaXQgb2YgMzAgc3RhY2tlZCBpbmNsdWRlIGZpbGVzLCBhcyBhIHNhbml0eSBjaGVjay4KLUBjIEZJWE1FISAgV2h5IGlzIGluY2x1ZGUgZGVwdGggbm90IGFmZmVjdGVkIGJ5IC11PwotCi1AaXRlbSAuQUxJR04gQHZhcntzaXplfQotQGMgRklYTUUhIFdoeSBpcyB0aGlzIG5vdCB1dHRlcmx5IHBvaW50bGVzcz8KLUV2YWx1YXRlIHRoZSBhYnNvbHV0ZSBleHByZXNzaW9uIEB2YXJ7c2l6ZX0sIGFuZCBlbWl0IHRoZSBhc3NlbWJseQotaW5zdHJ1Y3Rpb24gQHNhbXB7LmFsaWduIEB2YXJ7c2l6ZX19IHVzaW5nIHRoZSByZXN1bHQuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBTeW50YXggRGV0YWlscwotQHNlY3Rpb24gRGV0YWlscyBvZiB0aGUgR0FTUCBzeW50YXgKLQotU2luY2UgQHNje2dhc3B9IGlzIG1lYW50IHRvIHdvcmsgd2l0aCBhc3NlbWJseSBjb2RlLCBpdHMgc3RhdGVtZW50Ci1zeW50YXggaGFzIG5vIHN1cnByaXNlcyBmb3IgdGhlIGFzc2VtYmx5IHByb2dyYW1tZXIuCi0KLUBjaW5kZXggd2hpdGVzcGFjZQotQGVtcGh7V2hpdGVzcGFjZX0gKGJsYW5rcyBvciB0YWJzOyBAZW1waHtub3R9IG5ld2xpbmUpIGlzIHBhcnRpYWxseQotc2lnbmlmaWNhbnQsIGluIHRoYXQgaXQgZGVsaW1pdHMgdXAgdG8gdGhyZWUgZmllbGRzIGluIGEgbGluZS4gIFRoZQotYW1vdW50IG9mIHdoaXRlc3BhY2UgZG9lcyBub3QgbWF0dGVyOyB5b3UgbWF5IGxpbmUgdXAgZmllbGRzIGluIHNlcGFyYXRlCi1saW5lcyBpZiB5b3Ugd2lzaCwgYnV0IEBzY3tnYXNwfSBkb2VzIG5vdCByZXF1aXJlIHRoYXQuCi0KLUBjaW5kZXggZmllbGRzIG9mIEBzY3tnYXNwfSBzb3VyY2UgbGluZQotQGNpbmRleCBsYWJlbCBmaWVsZAotVGhlIEBlbXBoe2ZpcnN0IGZpZWxkfSwgYW4gb3B0aW9uYWwgQGRmbntsYWJlbH0sIG11c3QgYmUgZmx1c2ggbGVmdCBpbiBhCi1saW5lICh3aXRoIG5vIGxlYWRpbmcgd2hpdGVzcGFjZSkgaWYgaXQgYXBwZWFycyBhdCBhbGwuICBZb3UgbWF5IHVzZSBhCi1jb2xvbiBhZnRlciB0aGUgbGFiZWwgaWYgeW91IHdpc2g7IEBzY3tnYXNwfSBuZWl0aGVyIHJlcXVpcmVzIHRoZSBjb2xvbgotbm9yIG9iamVjdHMgdG8gaXQgKGJ1dCB3aWxsIG5vdCBpbmNsdWRlIGl0IGFzIHBhcnQgb2YgdGhlIGxhYmVsIG5hbWUpLgotCi1AY2luZGV4IGRpcmVjdGl2ZSBmaWVsZAotVGhlIEBlbXBoe3NlY29uZCBmaWVsZH0sIHdoaWNoIG11c3QgYXBwZWFyIGFmdGVyIHNvbWUgd2hpdGVzcGFjZSwKLWNvbnRhaW5zIGEgQHNje2dhc3B9IG9yIGFzc2VtYmx5IEBkZm57ZGlyZWN0aXZlfS4KLQotQGNpbmRleCBhcmd1bWVudCBmaWVsZHMKLUFueSBAZW1waHtmdXJ0aGVyIGZpZWxkc30gb24gYSBsaW5lIGFyZSBAZGZue2FyZ3VtZW50c30gdG8gdGhlCi1kaXJlY3RpdmU7IHlvdSBjYW4gc2VwYXJhdGUgdGhlbSBmcm9tIG9uZSBhbm90aGVyIHVzaW5nIGVpdGhlciBjb21tYXMgb3IKLXdoaXRlc3BhY2UuCi0KLUBtZW51Ci0qIE1hcmtlcnM6OgotKiBDb25zdGFudHM6OgotKiBTeW1ib2xzOjoKLSogRXhwcmVzc2lvbnM6OgotKiBTdHJpbmcgQnVpbHRpbnM6OgotQGVuZCBtZW51Ci0KLUBub2RlIE1hcmtlcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgc3ludGFjdGljIG1hcmtlcnMKLQotQHNje2dhc3B9IHJlY29nbml6ZXMgYSBmZXcgc3BlY2lhbCBtYXJrZXJzOiB0byBkZWxpbWl0IGNvbW1lbnRzLCB0bwotY29udGludWUgYSBzdGF0ZW1lbnQgb24gdGhlIG5leHQgbGluZSwgdG8gc2VwYXJhdGUgc3ltYm9scyBmcm9tIG90aGVyCi1jaGFyYWN0ZXJzLCBhbmQgdG8gY29weSB0ZXh0IHRvIHRoZSBvdXRwdXQgbGl0ZXJhbGx5LiAgKE9uZSBvdGhlcgotc3BlY2lhbCBtYXJrZXIsIEBzYW1we1xAQH0sIHdvcmtzIG9ubHkgd2l0aGluIG1hY3JvIGRlZmluaXRpb25zOwotQHB4cmVme01hY3JvcywsIERlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LikKLQotQGNpbmRleCBjb21tZW50cwotVGhlIHRyYWlsaW5nIHBhcnQgb2YgYW55IEBzY3tnYXNwfSBzb3VyY2UgbGluZSBtYXkgYmUgYSBAZGZue2NvbW1lbnR9LgotQSBjb21tZW50IGJlZ2lucyB3aXRoIHRoZSBmaXJzdCB1bnF1b3RlZCBjb21tZW50IGNoYXJhY3RlciAoQHNhbXB7IX0gYnkKLWRlZmF1bHQpLCBvciBhbiBlc2NhcGVkIG9yIGRvdWJsZWQgY29tbWVudCBjaGFyYWN0ZXIgKEBzYW1we1whfSBvcgotQHNhbXB7ISF9IGJ5IGRlZmF1bHQpLCBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIGEgbGluZS4gIFlvdSBjYW4KLXNwZWNpZnkgd2hhdCBjb21tZW50IGNoYXJhY3RlciB0byB1c2Ugd2l0aCB0aGUgQHNhbXB7LWN9IG9wdGlvbgotKEBweHJlZntJbnZva2luZyBHQVNQLCwgQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIFRoZSB0d28ga2luZHMgb2YKLWNvbW1lbnQgbWFya2VycyBsZWFkIHRvIHNsaWdodGx5IGRpZmZlcmVudCB0cmVhdG1lbnQ6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gIQotQSBzaW5nbGUsIHVuLWVzY2FwZWQgY29tbWVudCBjaGFyYWN0ZXIgZ2VuZXJhdGVzIGFuIGFzc2VtYmx5IGNvbW1lbnQgaW4KLXRoZSBAc2N7Z2FzcH0gb3V0cHV0LiAgQHNje2dhc3B9IGV2YWx1YXRlcyBhbnkgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcwotKG1hY3JvIGFyZ3VtZW50cywgb3IgdmFyaWFibGVzIGRlZmluZWQgd2l0aCBAY29kZXsuQVNTSUdOQX0gb3IKLUBjb2Rley5BU1NJR05DfSkgcHJlc2VudC4gIEZvciBleGFtcGxlLCBhIG1hY3JvIHRoYXQgYmVnaW5zIGxpa2UgdGhpcwotCi1AZXhhbXBsZQotICAgICAgICAuTUFDUk8gIFNVTSBGUk9NPTAsIFRPPTkKLSAgICAgICAgISBcRlJPTSBcVE8KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWlzc3VlcyBhcyB0aGUgZmlyc3QgbGluZSBvZiBvdXRwdXQgYSBjb21tZW50IHRoYXQgcmVjb3JkcyB0aGUKLXZhbHVlcyB5b3UgdXNlZCB0byBjYWxsIHRoZSBtYWNyby4KLQotQGMgY29tbWVudHMsIHByZXByb2Nlc3Nvci1vbmx5Ci1AYyBwcmVwcm9jZXNzb3Itb25seSBjb21tZW50cwotQGMgR0FTUC1vbmx5IGNvbW1lbnRzCi1AaXRlbSBcIQotQGl0ZW14ICEhCi1FaXRoZXIgYW4gZXNjYXBlZCBjb21tZW50IGNoYXJhY3Rlciwgb3IgYSBkb3VibGUgY29tbWVudCBjaGFyYWN0ZXIsCi1tYXJrcyBhIEBzY3tnYXNwfSBzb3VyY2UgY29tbWVudC4gIEBzY3tnYXNwfSBkb2VzIG5vdCBjb3B5IHN1Y2ggY29tbWVudHMKLXRvIHRoZSBhc3NlbWJseSBvdXRwdXQuCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggY29udGludWF0aW9uIGNoYXJhY3RlcgotQGtpbmRleCArCi1UbyBAZW1waHtjb250aW51ZSBhIHN0YXRlbWVudH0gb24gdGhlIG5leHQgbGluZSBvZiB0aGUgZmlsZSwgYmVnaW4gdGhlCi1zZWNvbmQgbGluZSB3aXRoIHRoZSBjaGFyYWN0ZXIgQHNhbXB7K30uCi0KLUBjaW5kZXggbGl0ZXJhbCBjb3B5IHRvIG91dHB1dAotQGNpbmRleCBjb3B5aW5nIGxpdGVyYWxseSB0byBvdXRwdXQKLUBjaW5kZXggcHJlcHJvY2Vzc2luZywgYXZvaWRpbmcKLUBjaW5kZXggYXZvaWRpbmcgcHJlcHJvY2Vzc2luZwotT2NjYXNpb25hbGx5IHlvdSBtYXkgd2FudCB0byBwcmV2ZW50IEBzY3tnYXNwfSBmcm9tIHByZXByb2Nlc3Npbmcgc29tZQotcGFydGljdWxhciBiaXQgb2YgdGV4dC4gIFRvIEBlbXBoe2NvcHkgbGl0ZXJhbGx5fSBmcm9tIHRoZSBAc2N7Z2FzcH0KLXNvdXJjZSB0byBpdHMgb3V0cHV0LCBwbGFjZSBAc2FtcHtcKH0gYmVmb3JlIHRoZSBzdHJpbmcgdG8gY29weSwgYW5kCi1Ac2FtcHspfSBhdCB0aGUgZW5kLiAgRm9yIGV4YW1wbGUsIHdyaXRlIEBzYW1we1woXCEpfSBpZiB5b3UgbmVlZCB0aGUKLWNoYXJhY3RlcnMgQHNhbXB7XCF9IGluIHlvdXIgYXNzZW1ibHkgb3V0cHV0LgotCi1AY2luZGV4IHN5bWJvbCBzZXBhcmF0b3IKLUBjaW5kZXggdGV4dCwgc2VwYXJhdGluZyBmcm9tIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgc2VwYXJhdGluZyBmcm9tIHRleHQKLVRvIEBlbXBoe3NlcGFyYXRlIGEgcHJlcHJvY2Vzc29yIHZhcmlhYmxlfSBmcm9tIHRleHQgdG8gYXBwZWFyCi1pbW1lZGlhdGVseSBhZnRlciBpdHMgdmFsdWUsIHdyaXRlIGEgc2luZ2xlIHF1b3RlIChAY29kZXsnfSkuICBGb3IKLWV4YW1wbGUsIEBzYW1wey5TREFUQSAiXFAnMSJ9IHdyaXRlcyBhIHN0cmluZyBidWlsdCBieSBjb25jYXRlbmF0aW5nIHRoZQotdmFsdWUgb2YgQGNvZGV7UH0gYW5kIHRoZSBkaWdpdCBAc2FtcHsxfS4gIChZb3UgY2Fubm90IGFjaGlldmUgdGhpcyBieQotd3JpdGluZyBqdXN0IEBzYW1we1xQMX0sIHNpbmNlIEBzYW1we1AxfSBpcyBpdHNlbGYgYSB2YWxpZCBuYW1lIGZvciBhCi1wcmVwcm9jZXNzb3IgdmFyaWFibGUuKQotCi1Abm9kZSBDb25zdGFudHMKLUBzdWJzZWN0aW9uIFN0cmluZyBhbmQgbnVtZXJpYyBjb25zdGFudHMKLQotVGhlcmUgYXJlIHR3byB3YXlzIG9mIHdyaXRpbmcgQGRmbntzdHJpbmcgY29uc3RhbnRzfSBpbiBAc2N7Z2FzcH06IGFzCi1saXRlcmFsIHRleHQsIGFuZCBieSBudW1lcmljIGJ5dGUgdmFsdWUuICBTcGVjaWZ5IGEgc3RyaW5nIGxpdGVyYWwKLWJldHdlZW4gZG91YmxlIHF1b3RlcyAoQGNvZGV7IkB2YXJ7c3RyfSJ9KS4gIFNwZWNpZnkgYW4gaW5kaXZpZHVhbAotbnVtZXJpYyBieXRlIHZhbHVlIGFzIGFuIGFic29sdXRlIGV4cHJlc3Npb24gYmV0d2VlbiBhbmdsZSBicmFja2V0cwotKEBjb2RlezxAdmFye2V4cHJ9Pn0uICBEaXJlY3RpdmVzIHRoYXQgb3V0cHV0IHN0cmluZ3MgYWxsb3cgeW91IHRvCi1zcGVjaWZ5IGFueSBudW1iZXIgb2YgZWl0aGVyIGtpbmQgb2YgdmFsdWUsIGluIHdoYXRldmVyIG9yZGVyIGlzCi1jb252ZW5pZW50LCBhbmQgY29uY2F0ZW5hdGUgdGhlIHJlc3VsdC4gIChBbHRlcm5hdGUgc3ludGF4IG1vZGUKLWludHJvZHVjZXMgYSBudW1iZXIgb2YgYWx0ZXJuYXRpdmUgc3RyaW5nIG5vdGF0aW9uczsgQHB4cmVme0FsdGVybmF0ZSwsCi1BbHRlcm5hdGUgbWFjcm8gc3ludGF4fS4pCi0KLUBjIERldGFpbHMgb2YgbnVtZXJpYyBub3RhdGlvbiwgZS5nLiBiYXNlIHByZWZpeGVzCi1Zb3UgY2FuIHdyaXRlIEBkZm57bnVtZXJpYyBjb25zdGFudHN9IGVpdGhlciBpbiBhIHNwZWNpZmljIGJhc2UsIG9yIGluCi13aGF0ZXZlciBiYXNlIGlzIGN1cnJlbnRseSBzZWxlY3RlZCAoZWl0aGVyIDEwLCBvciBzZWxlY3RlZCBieSB0aGUgbW9zdAotcmVjZW50IEBjb2Rley5SQURJWH0pLgotCi1UbyB3cml0ZSBhIG51bWJlciBpbiBhIEBlbXBoe3NwZWNpZmljIGJhc2V9LCB1c2UgdGhlIHBhdHRlcm4KLUBjb2Rle0B2YXJ7c30nQHZhcntkZGR9fTogYSBiYXNlIHNwZWNpZmllciBjaGFyYWN0ZXIgQHZhcntzfSwgZm9sbG93ZWQKLWJ5IGEgc2luZ2xlIHF1b3RlIGZvbGxvd2VkIGJ5IGRpZ2l0cyBAdmFye2RkZH0uICBUaGUgYmFzZSBzcGVjaWZpZXIKLWNoYXJhY3RlciBtYXRjaGVzIHRob3NlIHlvdSBjYW4gc3BlY2lmeSB3aXRoIEBjb2Rley5SQURJWH06IEBzYW1we0J9IGZvcgotYmFzZSAyLCBAc2FtcHtRfSBmb3IgYmFzZSA4LCBAc2FtcHtEfSBmb3IgYmFzZSAxMCwgYW5kIEBzYW1we0h9IGZvciBiYXNlCi0xNi4gIChZb3UgY2FuIHdyaXRlIHRoaXMgY2hhcmFjdGVyIGluIGxvd2VyIGNhc2UgaWYgeW91IHByZWZlci4pCi0KLUBjIEZJWE1FISBXaGF0IGFyZSBydWxlcyBmb3IgcmVjb2duaXppbmcgbnVtYmVyIGluIGRlZmx0IGJhc2U/ICBXaGF0ZXZlcgotQGMgICAgICAgIGlzIGxlZnQgb3ZlciBhZnRlciBwYXJzaW5nIG90aGVyIHRoaW5ncz8/Ci0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbHMKLQotQHNje2dhc3B9IHJlY29nbml6ZXMgc3ltYm9sIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhbnkgYWxwaGFiZXRpYyBjaGFyYWN0ZXIsCi1Ac2FtcHtffSwgb3IgQHNhbXB7JH0sIGFuZCBjb250aW51ZSB3aXRoIGFueSBvZiB0aGUgc2FtZSBjaGFyYWN0ZXJzIG9yCi13aXRoIGRpZ2l0cy4gIExhYmVsIG5hbWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcy4KLQotQG5vZGUgRXhwcmVzc2lvbnMKLUBzdWJzZWN0aW9uIEFyaXRobWV0aWMgZXhwcmVzc2lvbnMgaW4gR0FTUAotCi1AY2luZGV4IGFic29sdXRlIGV4cHJlc3Npb25zCi1AY2luZGV4IHJlbG9jYXRhYmxlIGV4cHJlc3Npb25zCi1UaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGV4cHJlc3Npb25zLCBkZXBlbmRpbmcgb24gdGhlaXIgcmVzdWx0OgotQGRmbnthYnNvbHV0ZX0gZXhwcmVzc2lvbnMsIHdoaWNoIHJlc29sdmUgdG8gYSBjb25zdGFudCAodGhhdCBpcywgdGhleQotZG8gbm90IGludm9sdmUgYW55IHZhbHVlcyB1bmtub3duIHRvIEBzY3tnYXNwfSksIGFuZCBAZGZue3JlbG9jYXRhYmxlfQotZXhwcmVzc2lvbnMsIHdoaWNoIG11c3QgcmVkdWNlIHRvIHRoZSBmb3JtCi0KLUBleGFtcGxlCi1AdmFye2FkZHN5bX0rQHZhcntjb25zdH0tQHZhcntzdWJzeW19Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSBAdmFye2FkZHN5bX0gYW5kIEB2YXJ7c3Vic3ltfSBhcmUgYXNzZW1ibHkgc3ltYm9scyBvZiB1bmtub3duCi12YWx1ZSwgYW5kIEB2YXJ7Y29uc3R9IGlzIGEgY29uc3RhbnQuCi0KLUFyaXRobWV0aWMgZm9yIEBzY3tnYXNwfSBleHByZXNzaW9ucyBmb2xsb3dzIHZlcnkgc2ltaWxhciBydWxlcyB0byBDLgotWW91IGNhbiB1c2UgcGFyZW50aGVzZXMgdG8gY2hhbmdlIHByZWNlZGVuY2U7IG90aGVyd2lzZSwgYXJpdGhtZXRpYwotcHJpbWl0aXZlcyBoYXZlIGRlY3JlYXNpbmcgcHJlY2VkZW5jZSBpbiB0aGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZwotbGlzdC4KLQotQGVudW1lcmF0ZQotQGl0ZW0KLVNpbmdsZS1hcmd1bWVudCBAY29kZXsrfSAoaWRlbnRpdHkpLCBAY29kZXstfSAoYXJpdGhtZXRpYyBvcHBvc2l0ZSksIG9yCi1AY29kZXt+fSAoYml0d2lzZSBuZWdhdGlvbikuICBAZW1waHtUaGUgYXJndW1lbnQgbXVzdCBiZSBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbi59Ci0KLUBpdGVtCi1AY29kZXsqfSAobXVsdGlwbGljYXRpb24pIGFuZCBAY29kZXsvfSAoZGl2aXNpb24pLiAgQGVtcGh7Qm90aCBhcmd1bWVudHMKLW11c3QgYmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMufQotCi1AaXRlbQotQGNvZGV7K30gKGFkZGl0aW9uKSBhbmQgQGNvZGV7LX0gKHN1YnRyYWN0aW9uKS4gIEBlbXBoe0F0IGxlYXN0IG9uZSBhcmd1bWVudAotbXVzdCBiZSBhYnNvbHV0ZS59Ci1AYyBGSVhNRSEgIEFjdHVhbGx5LCBzdWJ0cmFjdGlvbiBkb2Vzbid0IGNoZWNrIGZvciB0aGlzLgotCi1AaXRlbQotQGNvZGV7Jn0gKGJpdHdpc2UgYW5kKS4gIEBlbXBoe0JvdGggYXJndW1lbnRzIG11c3QgYmUgYWJzb2x1dGUufQotCi1AaXRlbQotQGMgRklYTUUhICBJIGFncmVlIH4gaXMgYSBiZXR0ZXIgbm90YXRpb24gdGhhbiBeIGZvciB4b3IsIGJ1dCBpcyB0aGUKLUBjICAgICAgICAgaW1wcm92ZW1lbnQgd29ydGggZGlmZmVyaW5nIGZyb20gQz8KLUBjb2Rle3x9IChiaXR3aXNlIG9yKSBhbmQgQGNvZGV7fn0gKGJpdHdpc2UgZXhjbHVzaXZlIG9yOyBAY29kZXtefSBpbgotQykuICBAZW1waHtCb3RoIGFyZ3VtZW50cyBtdXN0IGJlIGFic29sdXRlLn0KLUBlbmQgZW51bWVyYXRlCi0KLUBub2RlIFN0cmluZyBCdWlsdGlucwotQHN1YnNlY3Rpb24gU3RyaW5nIHByaW1pdGl2ZXMKLQotWW91IGNhbiB1c2UgdGhlc2UgcHJpbWl0aXZlcyB0byBtYW5pcHVsYXRlIHN0cmluZ3MgKGluIHRoZSBhcmd1bWVudAotZmllbGQgb2YgQHNje2dhc3B9IHN0YXRlbWVudHMpOgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuTEVOKCJAdmFye3N0cn0iKQotQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2Ygc3RyaW5nIEBjb2RleyJAdmFye3N0cn0ifSwgYXMgYW4gYWJzb2x1dGUKLWV4cHJlc3Npb24uICBGb3IgZXhhbXBsZSwgQHNhbXB7LlJFUy5CIC5MRU4oInNhbXBsZSIpfSByZXNlcnZlcyBzaXgKLWJ5dGVzIG9mIG1lbW9yeS4KLQotQGl0ZW0gLklOU1RSKCJAdmFye3N0cmluZ30iLCAiQHZhcntzZWd9IiwgQHZhcntpeH0pCi1TZWFyY2ggZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIEB2YXJ7c2VnfSBhZnRlciBwb3NpdGlvbiBAdmFye2l4fSBvZgotQHZhcntzdHJpbmd9LiAgRm9yIGV4YW1wbGUsIEBzYW1wey5JTlNUUigiQUJDREVGRyIsICJDREUiLCAwKX0gZXZhbHVhdGVzCi10byB0aGUgYWJzb2x1dGUgcmVzdWx0IEBjb2RlezJ9LgotCi1UaGUgcmVzdWx0IGlzIEBjb2Rley0xfSBpZiBAdmFye3NlZ30gZG9lcyBub3Qgb2NjdXIgaW4gQHZhcntzdHJpbmd9Ci1hZnRlciBwb3NpdGlvbiBAdmFye2l4fS4KLQotQGl0ZW0gLlNVQlNUUigiQHZhcntzdHJpbmd9IixAdmFye3N0YXJ0fSxAdmFye2xlbn0pCi1UaGUgc3Vic3RyaW5nIG9mIEB2YXJ7c3RyaW5nfSBiZWdpbm5pbmcgYXQgYnl0ZSBudW1iZXIgQHZhcntzdGFydH0gYW5kCi1leHRlbmRpbmcgZm9yIEB2YXJ7bGVufSBieXRlcy4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIEFsdGVybmF0ZQotQHNlY3Rpb24gQWx0ZXJuYXRlIG1hY3JvIHN5bnRheAotCi1JZiB5b3Ugc3BlY2lmeSBAc2FtcHstYX0gb3IgQHNhbXB7LS1hbHRlcm5hdGV9IG9uIHRoZSBAc2N7Z2FzcH0gY29tbWFuZAotbGluZSwgdGhlIHByZXByb2Nlc3NvciB1c2VzIHNvbWV3aGF0IGRpZmZlcmVudCBzeW50YXguICBUaGlzIHN5bnRheCBpcwotcmVtaW5pc2NlbnQgb2YgdGhlIHN5bnRheCBvZiBQaGFyIExhcCBtYWNybyBhc3NlbWJsZXIsIGJ1dCBpdAotaXMgQGVtcGh7bm90fSBtZWFudCB0byBiZSBhIGZ1bGwgZW11bGF0aW9uIG9mIFBoYXIgTGFwIG9yIHNpbWlsYXIKLWFzc2VtYmxlcnMuICBJbiBwYXJ0aWN1bGFyLCBAc2N7Z2FzcH0gZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3RpdmVzIHN1Y2gKLWFzIEBjb2Rle0RCfSBhbmQgQGNvZGV7SVJQfSwgZXZlbiBpbiBhbHRlcm5hdGUgc3ludGF4IG1vZGUuCi0KLUluIHBhcnRpY3VsYXIsIEBzYW1wey1hfSAob3IgQHNhbXB7LS1hbHRlcm5hdGV9KSBlbGljaXRzIHRoZXNlCi1kaWZmZXJlbmNlczoKLQotQHRhYmxlIEBlbXBoCi1AaXRlbSBQcmVwcm9jZXNzb3IgZGlyZWN0aXZlcwotWW91IGNhbiB1c2UgQHNje2dhc3B9IHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHdpdGhvdXQgYSBsZWFkaW5nIEBzYW1wey59Ci1kb3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiB3cml0ZSBAc2FtcHtTREFUQX0gd2l0aCB0aGUgc2FtZSBlZmZlY3QgYXMKLUBzYW1wey5TREFUQX0uCi0KLUBpdGVtIExPQ0FMCi1PbmUgYWRkaXRpb25hbCBkaXJlY3RpdmUsIEBjb2Rle0xPQ0FMfSwgaXMgYXZhaWxhYmxlLiAgQHhyZWZ7TWFjcm9zLCwKLURlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRvIHVzZQotQGNvZGV7TE9DQUx9LgotCi1AbmVlZCAyMDAwCi1AaXRlbSBTdHJpbmcgZGVsaW1pdGVycwotWW91IGNhbiB3cml0ZSBzdHJpbmdzIGRlbGltaXRlZCBpbiB0aGVzZSBvdGhlciB3YXlzIGJlc2lkZXMKLUBjb2RleyJAdmFye3N0cmluZ30ifToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAnQHZhcntzdHJpbmd9JwotWW91IGNhbiBkZWxpbWl0IHN0cmluZ3Mgd2l0aCBzaW5nbGUtcXVvdGUgY2hhcmF0ZXJzLgotCi1AaXRlbSA8QHZhcntzdHJpbmd9PgotWW91IGNhbiBkZWxpbWl0IHN0cmluZ3Mgd2l0aCBtYXRjaGluZyBhbmdsZSBicmFja2V0cy4KLUBlbmQgdGFibGUKLQotQGl0ZW0gc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgZXNjYXBlCi1UbyBpbmNsdWRlIGFueSBzaW5nbGUgY2hhcmFjdGVyIGxpdGVyYWxseSBpbiBhIHN0cmluZyAoZXZlbiBpZiB0aGUKLWNoYXJhY3RlciB3b3VsZCBvdGhlcndpc2UgaGF2ZSBzb21lIHNwZWNpYWwgbWVhbmluZyksIHlvdSBjYW4gcHJlZml4IHRoZQotY2hhcmFjdGVyIHdpdGggQHNhbXB7IX0gKGFuIGV4Y2xhbWF0aW9uIG1hcmspLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4KLXdyaXRlIEBzYW1wezw0LjMgIT4gNS40ISE+fSB0byBnZXQgdGhlIGxpdGVyYWwgdGV4dCBAc2FtcHs0LjMgPiA1LjQhfS4KLQotQGl0ZW0gRXhwcmVzc2lvbiByZXN1bHRzIGFzIHN0cmluZ3MKLVlvdSBjYW4gd3JpdGUgQHNhbXB7JUB2YXJ7ZXhwcn19IHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIEB2YXJ7ZXhwcn0KLWFuZCB1c2UgdGhlIHJlc3VsdCBhcyBhIHN0cmluZy4gIAotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWQgSW5kZXgKLQotQHByaW50aW5kZXggY3AKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9nYXMvZG9jL2g4LnRleGkgYi9nYXMvZG9jL2g4LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjE3MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9oOC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGNsZWFyIEFMTC1BUkNICi1AY2xlYXIgR0VORVJJQwotQGNsZWFyIElOVEVSTkFMUwotQGNsZWFyIE1VTFRJLU9CSgotQGNsZWFyIEFPVVQKLUBjbGVhciBCT1VUCi1Ac2V0IENPRkYKLUBjbGVhciBFTEYKLUBzZXQgSGl0YWNoaS1hbGwKLUBzZXQgSDgvMzAwCi1Ac2V0IEg4LzUwMAotQHNldCBTSAotQGNsZWFyIERJRkYtVEJMLUtMVUdFCi1Ac2V0IElFRUVGTE9BVAotQGNsZWFyIFczMgotQHNldCBXMTYKLUBzZXQgU1BFQ0lBTC1TWU1TCi1Ac2V0IEFTIGFzCi1Ac2V0IEdDQyBnY2MKLUBzZXQgTEQgbGQKLUBzZXQgVEFSR0VUIEg4LzMwMCBhbmQgSDgvNTAwCi1Ac2V0IFRBUkdFVCBIOC8zMDAsIEg4LzUwMCwgYW5kIEhpdGFjaGkgU0gKLUBzZXQgT0JKLU5BTUUgQ09GRgotQGMKLUBjbGVhciBoYXZlLXN0YWJzCi1Ac2V0IGFibm9ybWFsLXNlcGFyYXRvcgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9pbnRlcm5hbHMudGV4aSBiL2dhcy9kb2MvaW50ZXJuYWxzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZThiODEuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9pbnRlcm5hbHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE3NTYgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBpbnRlcm5hbHMuaW5mbwotQG5vZGUgVG9wCi1AdG9wIEFzc2VtYmxlciBJbnRlcm5hbHMKLUByYWlzZXNlY3Rpb25zCi1AY2luZGV4IGludGVybmFscwotCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIGFzc2VtYmxlci4gIEl0IGlzIGluY29tcGxldGUsIGJ1dAotaXQgbWF5IGhlbHAgYSBiaXQuCi0KLVRoaXMgY2hhcHRlciB3YXMgbGFzdCBtb2RpZmllZCBvbiAkRGF0ZSQuICBJdCBpcyBub3QgdXBkYXRlZCByZWd1bGFybHksIGFuZCBpdAotbWF5IGJlIG91dCBvZiBkYXRlLgotCi1AbWVudQotKiBHQVMgdmVyc2lvbnM6OiAgICAgICAgR0FTIHZlcnNpb25zCi0qIERhdGEgdHlwZXM6OgkJRGF0YSB0eXBlcwotKiBHQVMgcHJvY2Vzc2luZzo6ICAgICAgV2hhdCBHQVMgZG9lcyB3aGVuIGl0IHJ1bnMKLSogUG9ydGluZyBHQVM6OiAgICAgICAgIFBvcnRpbmcgR0FTCi0qIFJlbGF4YXRpb246OiAgICAgICAgICBSZWxheGF0aW9uCi0qIEJyb2tlbiB3b3Jkczo6ICAgICAgICBCcm9rZW4gd29yZHMKLSogSW50ZXJuYWwgZnVuY3Rpb25zOjogIEludGVybmFsIGZ1bmN0aW9ucwotKiBUZXN0IHN1aXRlOjogICAgICAgICAgVGVzdCBzdWl0ZQotQGVuZCBtZW51Ci0KLUBub2RlIEdBUyB2ZXJzaW9ucwotQHNlY3Rpb24gR0FTIHZlcnNpb25zCi0KLUdBUyBoYXMgYWNxdWlyZWQgbGF5ZXJzIG9mIGNvZGUgb3ZlciB0aW1lLiAgVGhlIG9yaWdpbmFsIEdBUyBvbmx5IHN1cHBvcnRlZCB0aGUKLWEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCwgd2l0aCB0aHJlZSBzZWN0aW9ucy4gIFN1cHBvcnQgZm9yIG11bHRpcGxlIHNlY3Rpb25zCi1oYXMgYmVlbiBhZGRlZCBpbiB0d28gZGlmZmVyZW50IHdheXMuCi0KLVRoZSBwcmVmZXJyZWQgYXBwcm9hY2ggaXMgdG8gdXNlIHRoZSB2ZXJzaW9uIG9mIEdBUyBjcmVhdGVkIHdoZW4gdGhlIHN5bWJvbAotQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgZGVmaW5lZC4gIFRoZSBvdGhlciB2ZXJzaW9ucyBvZiBHQVMgYXJlIGRvY3VtZW50ZWQgZm9yCi1oaXN0b3JpY2FsIHB1cnBvc2VzLCBhbmQgdG8gaGVscCBhbnlib2R5IHdobyBoYXMgdG8gZGVidWcgY29kZSB3cml0dGVuIGZvcgotdGhlbS4KLQotVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgdXNlZCB0byByZXByZXNlbnQgYSBzZWN0aW9uIGluIGNvZGUgd2hpY2ggbXVzdCB3b3JrCi13aXRoIGFsbCB2ZXJzaW9ucyBvZiBHQVMuCi0KLUBtZW51Ci0qIE9yaWdpbmFsIEdBUzo6ICAgICAgICBPcmlnaW5hbCBHQVMgdmVyc2lvbgotKiBNQU5ZX1NFR01FTlRTOjogICAgICAgTUFOWV9TRUdNRU5UUyBnYXMgdmVyc2lvbgotKiBCRkRfQVNTRU1CTEVSOjogICAgICAgQkZEX0FTU0VNQkxFUiBnYXMgdmVyc2lvbgotQGVuZCBtZW51Ci0KLUBub2RlIE9yaWdpbmFsIEdBUwotQHN1YnNlY3Rpb24gT3JpZ2luYWwgR0FTCi0KLVRoZSBvcmlnaW5hbCBHQVMgb25seSBzdXBwb3J0ZWQgdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCB3aXRoIHRocmVlCi1zZWN0aW9uczogQHNhbXB7LnRleHR9LCBAc2FtcHsuZGF0YX0sIGFuZCBAc2FtcHsuYnNzfS4gIFRoaXMgaXMgdGhlIHZlcnNpb24gb2YKLUdBUyB0aGF0IGlzIGNvbXBpbGVkIGlmIG5laXRoZXIgQGNvZGV7QkZEX0FTU0VNQkxFUn0gbm9yIEBjb2Rle01BTllfU0VHTUVOVFN9Ci1pcyBkZWZpbmVkLiAgVGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBzdGlsbCB1c2VkIGZvciB0aGUgbTY4ay1hb3V0IHRhcmdldCwgYW5kCi1wZXJoYXBzIG90aGVycy4KLQotVGhpcyB2ZXJzaW9uIG9mIEdBUyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGFueSBuZXcgZGV2ZWxvcG1lbnQuCi0KLVRoZXJlIGlzIHN0aWxsIGNvZGUgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGlzIHZlcnNpb24gb2YgR0FTLCBub3RhYmx5IGluCi1AZmlsZXt3cml0ZS5jfS4gIFRoZXJlIGlzIG5vIHdheSBmb3IgdGhpcyBjb2RlIHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlCi1zZWN0aW9uczsgaXQgc2ltcGx5IGxvb2tzIGF0IGdsb2JhbCB2YXJpYWJsZXMgbGlrZSBAY29kZXt0ZXh0X2ZyYWdfcm9vdH0gYW5kCi1AY29kZXtkYXRhX2ZyYWdfcm9vdH0uCi0KLVRoZSB0eXBlIEBjb2Rle3NlZ1R9IGlzIGFuIGVudW0uCi0KLUBub2RlIE1BTllfU0VHTUVOVFMKLUBzdWJzZWN0aW9uIE1BTllfU0VHTUVOVFMgZ2FzIHZlcnNpb24KLUBjaW5kZXggTUFOWV9TRUdNRU5UUwotCi1UaGUgQGNvZGV7TUFOWV9TRUdNRU5UU30gdmVyc2lvbiBvZiBnYXMgaXMgb25seSB1c2VkIGZvciBDT0ZGLiAgSXQgdXNlcyB0aGUgQkZECi1saWJyYXJ5LCBidXQgaXQgd3JpdGVzIG91dCBhbGwgdGhlIGRhdGEgaXRzZWxmIHVzaW5nIEBjb2Rle2JmZF93cml0ZX0uICBUaGlzCi12ZXJzaW9uIG9mIGdhcyBzdXBwb3J0cyB1cCB0byA0MCBub3JtYWwgc2VjdGlvbnMuICBUaGUgc2VjdGlvbiBuYW1lcyBhcmUgc3RvcmVkCi1pbiB0aGUgQGNvZGV7c2VnX25hbWV9IGFycmF5LiAgT3RoZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZQotQGNvZGV7c2VnbWVudF9pbmZvfSBhcnJheS4KLQotVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgYW4gZW51bS4gIENvZGUgdGhhdCB3YW50cyB0byBleGFtaW5lIGFsbCB0aGUgc2VjdGlvbnMKLWNhbiB1c2UgYSBAY29kZXtzZWdUfSB2YXJpYWJsZSBhcyBsb29wIGluZGV4IGZyb20gQGNvZGV7U0VHX0UwfSB1cCB0byBidXQgbm90Ci1pbmNsdWRpbmcgQGNvZGV7U0VHX1VOS05PV059LgotCi1Nb3N0IG9mIHRoZSBjb2RlIHNwZWNpZmljIHRvIHRoaXMgdmVyc2lvbiBvZiBHQVMgaXMgaW4gdGhlIGZpbGUKLUBmaWxle2NvbmZpZy9vYmotY29mZi5jfSwgaW4gdGhlIHBvcnRpb24gb2YgdGhhdCBmaWxlIHRoYXQgaXMgY29tcGlsZWQgd2hlbgotQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuCi0KLVRoaXMgdmVyc2lvbiBvZiBHQVMgaXMgc3RpbGwgdXNlZCBmb3Igc2V2ZXJhbCBDT0ZGIHRhcmdldHMuCi0KLUBub2RlIEJGRF9BU1NFTUJMRVIKLUBzdWJzZWN0aW9uIEJGRF9BU1NFTUJMRVIgZ2FzIHZlcnNpb24KLUBjaW5kZXggQkZEX0FTU0VNQkxFUgotCi1UaGUgcHJlZmVycmVkIHZlcnNpb24gb2YgR0FTIGlzIHRoZSBAY29kZXtCRkRfQVNTRU1CTEVSfSB2ZXJzaW9uLiAgSW4gdGhpcwotdmVyc2lvbiBvZiBHQVMsIHRoZSBvdXRwdXQgZmlsZSBpcyBhIG5vcm1hbCBCRkQsIGFuZCB0aGUgQkZEIHJvdXRpbmVzIGFyZSB1c2VkCi10byBnZW5lcmF0ZSB0aGUgb3V0cHV0LgotCi1AY29kZXtCRkRfQVNTRU1CTEVSfSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdXNlZCBmb3IgY2VydGFpbiB0YXJnZXRzLCBpbmNsdWRpbmcKLXRob3NlIHRoYXQgdXNlIHRoZSBFTEYsIEVDT0ZGLCBhbmQgU09NIG9iamVjdCBmaWxlIGZvcm1hdHMsIGFuZCBhbHNvIGFsbCBBbHBoYSwKLU1JUFMsIFBvd2VyUEMsIGFuZCBTUEFSQyB0YXJnZXRzLiAgWW91IGNhbiBmb3JjZSB0aGUgdXNlIG9mCi1AY29kZXtCRkRfQVNTRU1CTEVSfSBmb3Igb3RoZXIgdGFyZ2V0cyB3aXRoIHRoZSBjb25maWd1cmUgb3B0aW9uCi1Ac2FtcHstLWVuYWJsZS1iZmQtYXNzZW1ibGVyfTsgaG93ZXZlciwgaXQgaGFzIG5vdCBiZWVuIHRlc3RlZCBmb3IgbWFueQotdGFyZ2V0cywgYW5kIGNhbiBub3QgYmUgYXNzdW1lZCB0byB3b3JrLgotCi1Abm9kZSBEYXRhIHR5cGVzCi1Ac2VjdGlvbiBEYXRhIHR5cGVzCi1AY2luZGV4IGludGVybmFscywgZGF0YSB0eXBlcwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgZnVuZGFtZW50YWwgR0FTIGRhdGEgdHlwZXMuCi0KLUBtZW51Ci0qIFN5bWJvbHM6OiAgICAgICAgICAgICBUaGUgc3ltYm9sUyBzdHJ1Y3R1cmUKLSogRXhwcmVzc2lvbnM6OiAgICAgICAgIFRoZSBleHByZXNzaW9uUyBzdHJ1Y3R1cmUKLSogRml4dXBzOjoJCVRoZSBmaXhTIHN0cnVjdHVyZQotKiBGcmFnczo6ICAgICAgICAgICAgICAgVGhlIGZyYWdTIHN0cnVjdHVyZQotQGVuZCBtZW51Ci0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbHMKLUBjaW5kZXggaW50ZXJuYWxzLCBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGludGVybmFsCi1AY2luZGV4IHN5bWJvbFMgc3RydWN0dXJlCi0KLVRoZSBkZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sIHN0cnVjdHVyZSwgQGNvZGV7c3ltYm9sU30sIGlzIGxvY2F0ZWQgaW4KLUBmaWxle3N0cnVjLXN5bWJvbC5ofS4KLQotSW4gZ2VuZXJhbCwgdGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZSBtYXkgbm90IGJlIHJlZmVycmVkIHRvIGRpcmVjdGx5LgotSW5zdGVhZCwgeW91IG11c3QgdXNlIG9uZSBvZiB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gQGZpbGV7c3ltYm9sLmh9LgotVGhlc2UgYWNjZXNzb3IgZnVuY3Rpb25zIHNob3VsZCB3b3JrIGZvciBhbnkgR0FTIHZlcnNpb24uCi0KLVN5bWJvbCBzdHJ1Y3R1cmVzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gc3lfdmFsdWUKLVRoaXMgaXMgYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHRoYXQgZGVzY3JpYmVzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgSXQgbWlnaHQKLXJlZmVyIHRvIG9uZSBvciBtb3JlIG90aGVyIHN5bWJvbHM7IGlmIHNvLCBpdHMgdHJ1ZSB2YWx1ZSBtYXkgbm90IGJlIGtub3duCi11bnRpbCBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0gaXMgY2FsbGVkIGluIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfS4KLQotVGhlIGV4cHJlc3Npb24gaXMgb2Z0ZW4gc2ltcGx5IGEgY29uc3RhbnQuICBCZWZvcmUgQGNvZGV7cmVzb2x2ZV9zeW1ib2xfdmFsdWV9Ci1pcyBjYWxsZWQsIHRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGZyYWcgKEBweHJlZntGcmFnc30pLiAgQWZ0ZXJ3YXJkLAotdGhlIGZyYWcgYWRkcmVzcyBoYXMgYmVlbiBhZGRlZCBpbi4KLQotQGl0ZW0gc3lfcmVzb2x2ZWQKLVRoaXMgZmllbGQgaXMgbm9uLXplcm8gaWYgdGhlIHN5bWJvbCdzIHZhbHVlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVzb2x2ZWQuICBJdAotaXMgdXNlZCBkdXJpbmcgdGhlIGZpbmFsIHBhc3Mgb3ZlciB0aGUgc3ltYm9sIHRhYmxlLgotCi1AaXRlbSBzeV9yZXNvbHZpbmcKLVRoaXMgZmllbGQgaXMgdXNlZCB0byBkZXRlY3QgbG9vcHMgd2hpbGUgcmVzb2x2aW5nIHRoZSBzeW1ib2wncyB2YWx1ZS4KLQotQGl0ZW0gc3lfdXNlZF9pbl9yZWxvYwotVGhpcyBmaWVsZCBpcyBub24temVybyBpZiB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvY2F0aW9uIGVudHJ5LiAgSWYgYSBsb2NhbAotc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uIGVudHJ5LCBpdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHJlZGlyZWN0IHRob3NlCi1yZWxvY2F0aW9ucyB0byBvdGhlciBzeW1ib2xzLCBvciB0aGlzIHN5bWJvbCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBmaW5hbAotc3ltYm9sIGxpc3QuCi0KLUBpdGVtIHN5X25leHQKLUBpdGVteCBzeV9wcmV2aW91cwotVGhlc2UgcG9pbnRlcnMgdG8gb3RoZXIgQGNvZGV7c3ltYm9sU30gc3RydWN0dXJlcyBkZXNjcmliZSBhIHNpbmdseSBvciBkb3VibHkKLWxpbmtlZCBsaXN0LiAgKElmIEBjb2Rle1NZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlN9IGlzIG5vdCBkZWZpbmVkLCB0aGUKLUBjb2Rle3N5X3ByZXZpb3VzfSBmaWVsZCB3aWxsIGJlIG9taXR0ZWQ7IEBjb2Rle1NZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlN9IGlzCi1hbHdheXMgZGVmaW5lZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfS4pICBUaGVzZSBmaWVsZHMgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGgKLXRoZSBAY29kZXtzeW1ib2xfbmV4dH0gYW5kIEBjb2Rle3N5bWJvbF9wcmV2aW91c30gbWFjcm9zLgotCi1AaXRlbSBzeV9mcmFnCi1UaGlzIHBvaW50cyB0byB0aGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkgdGhhdCB0aGlzIHN5bWJvbCBpcyBhdHRhY2hlZCB0by4KLQotQGl0ZW0gc3lfdXNlZAotV2hldGhlciB0aGUgc3ltYm9sIGlzIHVzZWQgYXMgYW4gb3BlcmFuZCBvciBpbiBhbiBleHByZXNzaW9uLiAgTm90ZTogTm90IGFsbCBvZgotdGhlIGJhY2tlbmRzIGtlZXAgdGhpcyBpbmZvcm1hdGlvbiBhY2N1cmF0ZTsgYmFja2VuZHMgd2hpY2ggdXNlIHRoaXMgYml0IGFyZQotcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaXQgd2hlbiBhIHN5bWJvbCBpcyB1c2VkIGluIGJhY2tlbmQgcm91dGluZXMuCi0KLUBpdGVtIHN5X21yaV9jb21tb24KLVdoZXRoZXIgdGhlIHN5bWJvbCBpcyBhbiBNUkkgY29tbW9uIHN5bWJvbCBjcmVhdGVkIGJ5IHRoZSBAY29kZXtDT01NT059Ci1wc2V1ZG8tb3Agd2hlbiBhc3NlbWJsaW5nIGluIE1SSSBtb2RlLgotCi1AaXRlbSBic3ltCi1JZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkLCB0aGlzIHBvaW50cyB0byB0aGUgQkZEIEBjb2Rle2FzeW1ib2x9IHRoYXQKLXdpbGwgYmUgdXNlZCBpbiB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4KLQotQGl0ZW0gc3lfbmFtZV9vZmZzZXQKLShPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyB0aGUgcG9zaXRpb24gb2YKLXRoZSBzeW1ib2wncyBuYW1lIGluIHRoZSBzdHJpbmcgdGFibGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgT24gc29tZSBmb3JtYXRzLAotdGhpcyB3aWxsIHN0YXJ0IGF0IHBvc2l0aW9uIDQsIHdpdGggcG9zaXRpb24gMCByZXNlcnZlZCBmb3IgdW5uYW1lZCBzeW1ib2xzLgotVGhpcyBmaWVsZCBpcyBub3QgdXNlZCB1bnRpbCBAY29kZXt3cml0ZV9vYmplY3RfZmlsZX0gaXMgY2FsbGVkLgotCi1AaXRlbSBzeV9zeW1ib2wKLShPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyB0aGUKLWZvcm1hdC1zcGVjaWZpYyBzeW1ib2wgc3RydWN0dXJlLCBhcyBpdCB3b3VsZCBiZSB3cml0dGVuIGludG8gdGhlIG9iamVjdCBmaWxlLgotCi1AaXRlbSBzeV9udW1iZXIKLShPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyBhIDI0LWJpdCBzeW1ib2wKLW51bWJlciwgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgcmVsb2NhdGlvbiB0YWJsZSBlbnRyaWVzLgotCi1AaXRlbSBzeV9vYmoKLVRoaXMgZm9ybWF0LXNwZWNpZmljIGRhdGEgaXMgb2YgdHlwZSBAY29kZXtPQkpfU1lNRklFTERfVFlQRX0uICBJZiBubyBtYWNybyBieQotdGhhdCBuYW1lIGlzIGRlZmluZWQgaW4gQGZpbGV7b2JqLWZvcm1hdC5ofSwgdGhpcyBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQotQGl0ZW0gc3lfdGMKLVRoaXMgcHJvY2Vzc29yLXNwZWNpZmljIGRhdGEgaXMgb2YgdHlwZSBAY29kZXtUQ19TWU1GSUVMRF9UWVBFfS4gIElmIG5vIG1hY3JvCi1ieSB0aGF0IG5hbWUgaXMgZGVmaW5lZCBpbiBAZmlsZXt0YXJnLWNwdS5ofSwgdGhpcyBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQotQGVuZCB0YWJsZQotCi1IZXJlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucy4gIFRoZXNlIHNob3VsZCBiZSB1c2VkIHJhdGhlcgotdGhhbiByZWZlcnJpbmcgdG8gdGhlIGZpZWxkcyBvZiBAY29kZXtzeW1ib2xTfSBkaXJlY3RseS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBTX1NFVF9WQUxVRQotQGNpbmRleCBTX1NFVF9WQUxVRQotU2V0IHRoZSBzeW1ib2wncyB2YWx1ZS4KLQotQGl0ZW0gU19HRVRfVkFMVUUKLUBjaW5kZXggU19HRVRfVkFMVUUKLUdldCB0aGUgc3ltYm9sJ3MgdmFsdWUuICBUaGlzIHdpbGwgY2F1c2UgQGNvZGV7cmVzb2x2ZV9zeW1ib2xfdmFsdWV9IHRvIGJlCi1jYWxsZWQgaWYgbmVjZXNzYXJ5LCBzbyBAY29kZXtTX0dFVF9WQUxVRX0gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gaXQgaXMKLXNhZmUgdG8gcmVzb2x2ZSBzeW1ib2xzIChpLmUuLCBhZnRlciB0aGUgZW50aXJlIGlucHV0IGZpbGUgaGFzIGJlZW4gcmVhZCBhbmQKLWFsbCBzeW1ib2xzIGhhdmUgYmVlbiBkZWZpbmVkKS4KLQotQGl0ZW0gU19TRVRfU0VHTUVOVAotQGNpbmRleCBTX1NFVF9TRUdNRU5UCi1TZXQgdGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbC4KLQotQGl0ZW0gU19HRVRfU0VHTUVOVAotQGNpbmRleCBTX0dFVF9TRUdNRU5UCi1HZXQgdGhlIHN5bWJvbCdzIHNlY3Rpb24uCi0KLUBpdGVtIFNfR0VUX05BTUUKLUBjaW5kZXggU19HRVRfTkFNRQotR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCi0KLUBpdGVtIFNfU0VUX05BTUUKLUBjaW5kZXggU19TRVRfTkFNRQotU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCi0KLUBpdGVtIFNfSVNfRVhURVJOQUwKLUBjaW5kZXggU19JU19FWFRFUk5BTAotUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLgotCi1AaXRlbSBTX0lTX0VYVEVSTgotQGNpbmRleCBTX0lTX0VYVEVSTgotQSBzeW5vbnltIGZvciBAY29kZXtTX0lTX0VYVEVSTkFMfS4gIERvbid0IHVzZSBpdC4KLQotQGl0ZW0gU19JU19XRUFLCi1AY2luZGV4IFNfSVNfV0VBSwotUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgd2Vhay4KLQotQGl0ZW0gU19JU19DT01NT04KLUBjaW5kZXggU19JU19DT01NT04KLVJldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIENvbW1vbiBzeW1ib2xzIGFyZSBzb21ldGltZXMKLXJlcHJlc2VudGVkIGFzIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggYSB2YWx1ZSwgaW4gd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwKLW5vdCBiZSByZWxpYWJsZS4KLQotQGl0ZW0gU19JU19ERUZJTkVECi1AY2luZGV4IFNfSVNfREVGSU5FRAotUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxpYWJsZSB3aGVuCi1jYWxsZWQgb24gYSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBTX0lTX0RFQlVHCi1AY2luZGV4IFNfSVNfREVCVUcKLVJldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4KLQotQGl0ZW0gU19JU19MT0NBTAotQGNpbmRleCBTX0lTX0xPQ0FMCi1SZXR1cm4gbm9uLXplcm8gaWYgdGhpcyBpcyBhIGxvY2FsIGFzc2VtYmxlciBzeW1ib2wgd2hpY2ggc2hvdWxkIG5vdCBiZQotaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHN5bWJvbCB0YWJsZS4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgb3Bwb3NpdGUgb2YKLUBjb2Rle1NfSVNfRVhURVJOQUx9LiAgVGhlIEBzYW1wey1MfSBhc3NlbWJsZXIgb3B0aW9uIGFmZmVjdHMgdGhlIHJldHVybiB2YWx1ZQotb2YgdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gU19TRVRfRVhURVJOQUwKLUBjaW5kZXggU19TRVRfRVhURVJOQUwKLU1hcmsgdGhlIHN5bWJvbCBhcyBleHRlcm5hbGx5IHZpc2libGUuCi0KLUBpdGVtIFNfQ0xFQVJfRVhURVJOQUwKLUBjaW5kZXggU19DTEVBUl9FWFRFUk5BTAotTWFyayB0aGUgc3ltYm9sIGFzIG5vdCBleHRlcm5hbGx5IHZpc2libGUuCi0KLUBpdGVtIFNfU0VUX1dFQUsKLUBjaW5kZXggU19TRVRfV0VBSwotTWFyayB0aGUgc3ltYm9sIGFzIHdlYWsuCi0KLUBpdGVtIFNfR0VUX1RZUEUKLUBpdGVtIFNfR0VUX0RFU0MKLUBpdGVtIFNfR0VUX09USEVSCi1AY2luZGV4IFNfR0VUX1RZUEUKLUBjaW5kZXggU19HRVRfREVTQwotQGNpbmRleCBTX0dFVF9PVEhFUgotR2V0IHRoZSBAY29kZXt0eXBlfSwgQGNvZGV7ZGVzY30sIGFuZCBAY29kZXtvdGhlcn0gZmllbGRzIG9mIHRoZSBzeW1ib2wuICBUaGVzZQotYXJlIG9ubHkgZGVmaW5lZCBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBmb3Igd2hpY2ggdGhleSBtYWtlIHNlbnNlIChwcmltYXJpbHkKLWEub3V0KS4KLQotQGl0ZW0gU19TRVRfVFlQRQotQGl0ZW0gU19TRVRfREVTQwotQGl0ZW0gU19TRVRfT1RIRVIKLUBjaW5kZXggU19TRVRfVFlQRQotQGNpbmRleCBTX1NFVF9ERVNDCi1AY2luZGV4IFNfU0VUX09USEVSCi1TZXQgdGhlIEBjb2Rle3R5cGV9LCBAY29kZXtkZXNjfSwgYW5kIEBjb2Rle290aGVyfSBmaWVsZHMgb2YgdGhlIHN5bWJvbC4gIFRoZXNlCi1hcmUgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvciB3aGljaCB0aGV5IG1ha2Ugc2Vuc2UgKHByaW1hcmlseQotYS5vdXQpLgotCi1AaXRlbSBTX0dFVF9TSVpFCi1AY2luZGV4IFNfR0VUX1NJWkUKLUdldCB0aGUgc2l6ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvcgotd2hpY2ggaXQgbWFrZXMgc2Vuc2UgKHByaW1hcmlseSBFTEYpLgotCi1AaXRlbSBTX1NFVF9TSVpFCi1AY2luZGV4IFNfU0VUX1NJWkUKLVNldCB0aGUgc2l6ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvcgotd2hpY2ggaXQgbWFrZXMgc2Vuc2UgKHByaW1hcmlseSBFTEYpLgotCi1AaXRlbSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24KLUBjaW5kZXggc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uCi1HZXQgYSBwb2ludGVyIHRvIGFuIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgd2hpY2ggcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YKLXRoZSBzeW1ib2wgYXMgYW4gZXhwcmVzc2lvbi4KLQotQGl0ZW0gc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uCi1AY2luZGV4IHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbgotU2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCB0byBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfc2V0X2ZyYWcKLUBjaW5kZXggc3ltYm9sX3NldF9mcmFnCi1TZXQgdGhlIGZyYWcgd2hlcmUgYSBzeW1ib2wgaXMgZGVmaW5lZC4KLQotQGl0ZW0gc3ltYm9sX2dldF9mcmFnCi1AY2luZGV4IHN5bWJvbF9nZXRfZnJhZwotR2V0IHRoZSBmcmFnIHdoZXJlIGEgc3ltYm9sIGlzIGRlZmluZWQuCi0KLUBpdGVtIHN5bWJvbF9tYXJrX3VzZWQKLUBjaW5kZXggc3ltYm9sX21hcmtfdXNlZAotTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLUBpdGVtIHN5bWJvbF9jbGVhcl91c2VkCi1AY2luZGV4IHN5bWJvbF9jbGVhcl91c2VkCi1DbGVhciB0aGUgbWFyayBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgd2FzIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4KLQotQGl0ZW0gc3ltYm9sX3VzZWRfcAotQGNpbmRleCBzeW1ib2xfdXNlZF9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCB3YXMgdXNlZCBpbiBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jCi1AY2luZGV4IHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MKLU1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gdXNlZCBieSBhIHJlbG9jYXRpb24uCi0KLUBpdGVtIHN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jCi1AY2luZGV4IHN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jCi1DbGVhciB0aGUgbWFyayBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgd2FzIHVzZWQgaW4gYSByZWxvY2F0aW9uLgotCi1AaXRlbSBzeW1ib2xfdXNlZF9pbl9yZWxvY19wCi1AY2luZGV4IHN5bWJvbF91c2VkX2luX3JlbG9jX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIHdhcyB1c2VkIGluIGEgcmVsb2NhdGlvbi4KLQotQGl0ZW0gc3ltYm9sX21hcmtfbXJpX2NvbW1vbgotQGNpbmRleCBzeW1ib2xfbWFya19tcmlfY29tbW9uCi1NYXJrIGEgc3ltYm9sIGFzIGFuIE1SSSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfY2xlYXJfbXJpX2NvbW1vbgotQGNpbmRleCBzeW1ib2xfY2xlYXJfbXJpX2NvbW1vbgotQ2xlYXIgdGhlIG1hcmsgaW5kaWNhdGluZyB0aGF0IGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfbXJpX2NvbW1vbl9wCi1AY2luZGV4IHN5bWJvbF9tcmlfY29tbW9uX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfbWFya193cml0dGVuCi1AY2luZGV4IHN5bWJvbF9tYXJrX3dyaXR0ZW4KLU1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gd3JpdHRlbi4KLQotQGl0ZW0gc3ltYm9sX2NsZWFyX3dyaXR0ZW4KLUBjaW5kZXggc3ltYm9sX2NsZWFyX3dyaXR0ZW4KLUNsZWFyIHRoZSBtYXJrIGluZGljYXRpbmcgdGhhdCBhIHN5bWJvbCB3YXMgd3JpdHRlbi4KLQotQGl0ZW0gc3ltYm9sX3dyaXR0ZW5fcAotQGNpbmRleCBzeW1ib2xfd3JpdHRlbl9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCB3YXMgd3JpdHRlbi4KLQotQGl0ZW0gc3ltYm9sX21hcmtfcmVzb2x2ZWQKLUBjaW5kZXggc3ltYm9sX21hcmtfcmVzb2x2ZWQKLU1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gcmVzb2x2ZWQuCi0KLUBpdGVtIHN5bWJvbF9yZXNvbHZlZF9wCi1AY2luZGV4IHN5bWJvbF9yZXNvbHZlZF9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiByZXNvbHZlZC4KLQotQGl0ZW0gc3ltYm9sX3NlY3Rpb25fcAotQGNpbmRleCBzeW1ib2xfc2VjdGlvbl9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfZXF1YXRlZF9wCi1AY2luZGV4IHN5bWJvbF9lcXVhdGVkX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9jb25zdGFudF9wCi1AY2luZGV4IHN5bWJvbF9jb25zdGFudF9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYSBjb25zdGFudCB2YWx1ZSwgaW5jbHVkaW5nIGJlaW5nIGFuIG9mZnNldCB3aXRoaW4KLXNvbWUgZnJhZy4KLQotQGl0ZW0gc3ltYm9sX2dldF9iZmRzeW0KLUBjaW5kZXggc3ltYm9sX2dldF9iZmRzeW0KLVJldHVybiB0aGUgQkZEIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9zZXRfYmZkc3ltCi1AY2luZGV4IHN5bWJvbF9zZXRfYmZkc3ltCi1TZXQgdGhlIEJGRCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfZ2V0X29iagotQGNpbmRleCBzeW1ib2xfZ2V0X29iagotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgQGNvZGV7T0JKX1NZTUZJRUxEX1RZUEV9IGZpZWxkIG9mIGEgc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfc2V0X29iagotQGNpbmRleCBzeW1ib2xfc2V0X29iagotU2V0IHRoZSBAY29kZXtPQkpfU1lNRklFTERfVFlQRX0gZmllbGQgb2YgYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9nZXRfdGMKLUBjaW5kZXggc3ltYm9sX2dldF90YwotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgQGNvZGV7VENfU1lNRklFTERfVFlQRX0gZmllbGQgb2YgYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9zZXRfdGMKLUBjaW5kZXggc3ltYm9sX3NldF90YwotU2V0IHRoZSBAY29kZXtUQ19TWU1GSUVMRF9UWVBFfSBmaWVsZCBvZiBhIHN5bWJvbC4KLQotQGVuZCB0YWJsZQotCi1XaGVuIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IGlzIGRlZmluZWQsIEdBUyBhdHRlbXB0cyB0byBzdG9yZSBsb2NhbAotc3ltYm9scy0tc3ltYm9scyB3aGljaCB3aWxsIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZS0tdXNpbmcgYQotZGlmZmVyZW50IHN0cnVjdHVyZSwgQGNvZGV7c3RydWN0IGxvY2FsX3N5bWJvbH0uICBUaGlzIHN0cnVjdHVyZSBjYW4gb25seQotcmVwcmVzZW50IHN5bWJvbHMgd2hvc2UgdmFsdWUgaXMgYW4gb2Zmc2V0IHdpdGhpbiBhIGZyYWcuCi0KLUNvZGUgb3V0c2lkZSBvZiB0aGUgc3ltYm9sIGhhbmRsZXIgd2lsbCBhbHdheXMgZGVhbCB3aXRoIEBjb2Rle3N5bWJvbFN9Ci1zdHJ1Y3R1cmVzIGFuZCB1c2UgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucy4gIFRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgY29ycmVjdGx5Ci1kZWFsIHdpdGggbG9jYWwgc3ltYm9scy4gIEBjb2Rle3N0cnVjdCBsb2NhbF9zeW1ib2x9IGlzIG11Y2ggc21hbGxlciB0aGFuCi1AY29kZXtzeW1ib2xTfSAod2hpY2ggYWxzbyBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBiZmQgQGNvZGV7YXN5bWJvbH0KLXN0cnVjdHVyZSksIHNvIHRoaXMgc2F2ZXMgc3BhY2Ugd2hlbiBhc3NlbWJsaW5nIGxhcmdlIGZpbGVzLgotCi1UaGUgZmlyc3QgZmllbGQgb2YgQGNvZGV7c3ltYm9sU30gaXMgQGNvZGV7YnN5bX0sIHRoZSBwb2ludGVyIHRvIHRoZSBCRkQKLXN5bWJvbC4gIFRoZSBmaXJzdCBmaWVsZCBvZiBAY29kZXtzdHJ1Y3QgbG9jYWxfc3ltYm9sfSBpcyBhIHBvaW50ZXIgd2hpY2ggaXMKLWFsd2F5cyBzZXQgdG8gTlVMTC4gIFRoaXMgaXMgaG93IHRoZSBzeW1ib2wgYWNjZXNzb3IgZnVuY3Rpb25zIGNhbiBkaXN0aW5ndWlzaAotbG9jYWwgc3ltYm9scyBmcm9tIG9yZGluYXJ5IHN5bWJvbHMuICBUaGUgc3ltYm9sIGFjY2Vzc29yIGZ1bmN0aW9ucwotYXV0b21hdGljYWxseSBjb252ZXJ0IGEgbG9jYWwgc3ltYm9sIGludG8gYW4gb3JkaW5hcnkgc3ltYm9sIHdoZW4gbmVjZXNzYXJ5LgotCi1Abm9kZSBFeHByZXNzaW9ucwotQHN1YnNlY3Rpb24gRXhwcmVzc2lvbnMKLUBjaW5kZXggaW50ZXJuYWxzLCBleHByZXNzaW9ucwotQGNpbmRleCBleHByZXNzaW9ucywgaW50ZXJuYWwKLUBjaW5kZXggZXhwcmVzc2lvblMgc3RydWN0dXJlCi0KLUV4cHJlc3Npb25zIGFyZSBzdG9yZWQgaW4gYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZS4gIFRoZSBzdHJ1Y3R1cmUgaXMKLWRlZmluZWQgaW4gQGZpbGV7ZXhwci5ofS4KLQotQGNpbmRleCBleHByZXNzaW9uCi1UaGUgbWFjcm8gQGNvZGV7ZXhwcmVzc2lvbn0gd2lsbCBjcmVhdGUgYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBiYXNlZAotb24gdGhlIHRleHQgZm91bmQgYXQgdGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtpbnB1dF9saW5lX3BvaW50ZXJ9LgotCi1AY2luZGV4IG1ha2VfZXhwcl9zeW1ib2wKLUBjaW5kZXggZXhwcl9zeW1ib2xfd2hlcmUKLUEgc2luZ2xlIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgY2FuIHJlcHJlc2VudCBhIHNpbmdsZSBvcGVyYXRpb24uCi1Db21wbGV4IGV4cHJlc3Npb25zIGFyZSBmb3JtZWQgYnkgY3JlYXRpbmcgQGRmbntleHByZXNzaW9uIHN5bWJvbHN9IGFuZAotY29tYmluaW5nIHRoZW0gaW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZXMuICBBbiBleHByZXNzaW9uIHN5bWJvbCBpcwotY3JlYXRlZCBieSBjYWxsaW5nIEBjb2Rle21ha2VfZXhwcl9zeW1ib2x9LiAgQW4gZXhwcmVzc2lvbiBzeW1ib2wgc2hvdWxkCi1uYXR1cmFsbHkgbmV2ZXIgYXBwZWFyIGluIGEgc3ltYm9sIHRhYmxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mCi1AY29kZXtTX0lTX0xPQ0FMfSAoQHB4cmVme1N5bWJvbHN9KSByZWZsZWN0cyB0aGF0LiAgVGhlIGZ1bmN0aW9uCi1AY29kZXtleHByX3N5bWJvbF93aGVyZX0gcmV0dXJucyBub24temVybyBpZiBhIHN5bWJvbCBpcyBhbiBleHByZXNzaW9uIHN5bWJvbCwKLWFuZCBhbHNvIHJldHVybnMgdGhlIGZpbGUgYW5kIGxpbmUgZm9yIHRoZSBleHByZXNzaW9uIHdoaWNoIGNhdXNlZCBpdCB0byBiZQotY3JlYXRlZC4KLQotVGhlIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgaGFzIHR3byBzeW1ib2wgZmllbGRzLCBhIG51bWJlciBmaWVsZCwgYW4KLW9wZXJhdG9yIGZpZWxkLCBhbmQgYSBmaWVsZCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG51bWJlciBpcyB1bnNpZ25lZC4KLQotVGhlIG9wZXJhdG9yIGZpZWxkIGlzIG9mIHR5cGUgQGNvZGV7b3BlcmF0b3JUfSwgYW5kIGRlc2NyaWJlcyBob3cgdG8gaW50ZXJwcmV0Ci10aGUgb3RoZXIgZmllbGRzOyBzZWUgdGhlIGRlZmluaXRpb24gaW4gQGZpbGV7ZXhwci5ofSBmb3IgdGhlIHBvc3NpYmlsaXRpZXMuCi0KLUFuIEBjb2Rle29wZXJhdG9yVH0gdmFsdWUgb2YgQGNvZGV7T19iaWd9IGluZGljYXRlcyBlaXRoZXIgYSBmbG9hdGluZyBwb2ludAotbnVtYmVyLCBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcn0sIG9yCi1hbiBpbnRlZ2VyIHRvIGxhcmdlIHRvIHN0b3JlIGluIGFuIEBjb2Rle29mZnNldFR9IHR5cGUsIHN0b3JlZCBpbiB0aGUgZ2xvYmFsCi1hcnJheSBAY29kZXtnZW5lcmljX2JpZ251bX0uICBUaGlzIHJhdGhlciBpbmZsZXhpYmxlIGFwcHJvYWNoIG1ha2VzIGl0Ci1pbXBvc3NpYmxlIHRvIHVzZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIG9yIGxhcmdlIGV4cHJlc3Npb25zIGluIGNvbXBsZXgKLWV4cHJlc3Npb25zLgotCi1Abm9kZSBGaXh1cHMKLUBzdWJzZWN0aW9uIEZpeHVwcwotQGNpbmRleCBpbnRlcm5hbHMsIGZpeHVwcwotQGNpbmRleCBmaXh1cHMKLUBjaW5kZXggZml4UyBzdHJ1Y3R1cmUKLQotQSBAZGZue2ZpeHVwfSBpcyBiYXNpY2FsbHkgYW55dGhpbmcgd2hpY2ggY2FuIG5vdCBiZSByZXNvbHZlZCBpbiB0aGUgZmlyc3QKLXBhc3MuICBTb21ldGltZXMgYSBmaXh1cCBjYW4gYmUgcmVzb2x2ZWQgYnkgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHk7IGlmIG5vdCwKLXRoZSBmaXh1cCBiZWNvbWVzIGEgcmVsb2NhdGlvbiBlbnRyeSBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLUBjaW5kZXggZml4X25ldwotQGNpbmRleCBmaXhfbmV3X2V4cAotQSBmaXh1cCBpcyBjcmVhdGVkIGJ5IGEgY2FsbCB0byBAY29kZXtmaXhfbmV3fSBvciBAY29kZXtmaXhfbmV3X2V4cH0uICBCb3RoCi10YWtlIGEgZnJhZyAoQHB4cmVme0ZyYWdzfSksIGEgcG9zaXRpb24gd2l0aGluIHRoZSBmcmFnLCBhIHNpemUsIGFuIGluZGljYXRpb24KLW9mIHdoZXRoZXIgdGhlIGZpeHVwIGlzIFBDIHJlbGF0aXZlLCBhbmQgYSB0eXBlLiAgSW4gYSBAY29kZXtCRkRfQVNTRU1CTEVSfQotR0FTLCB0aGUgdHlwZSBpcyBub21pbmFsbHkgYSBAY29kZXtiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGV9LCBidXQgc2V2ZXJhbAotdGFyZ2V0cyB1c2Ugb3RoZXIgdHlwZSBjb2RlcyB0byByZXByZXNlbnQgZml4dXBzIHRoYXQgY2FuIG5vdCBiZSBkZXNjcmliZWQgYXMKLXJlbG9jYXRpb25zLgotCi1UaGUgQGNvZGV7Zml4U30gc3RydWN0dXJlIGhhcyBhIG51bWJlciBvZiBmaWVsZHMsIHNldmVyYWwgb2Ygd2hpY2ggYXJlIG9ic29sZXRlCi1vciBhcmUgb25seSB1c2VkIGJ5IGEgcGFydGljdWxhciB0YXJnZXQuICBUaGUgaW1wb3J0YW50IGZpZWxkcyBhcmU6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZnhfZnJhZwotVGhlIGZyYWcgKEBweHJlZntGcmFnc30pIHRoaXMgZml4dXAgaXMgaW4uCi0KLUBpdGVtIGZ4X3doZXJlCi1UaGUgbG9jYXRpb24gd2l0aGluIHRoZSBmcmFnIHdoZXJlIHRoZSBmaXh1cCBvY2N1cnMuCi0KLUBpdGVtIGZ4X2FkZHN5Ci1UaGUgc3ltYm9sIHRoaXMgZml4dXAgaXMgYWdhaW5zdC4gIFR5cGljYWxseSwgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGlzIGFkZGVkCi1pbnRvIHRoZSBvYmplY3QgY29udGVudHMuICBUaGlzIG1heSBiZSBOVUxMLgotCi1AaXRlbSBmeF9zdWJzeQotVGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0IGNvbnRlbnRzLiAgVGhpcyBpcwotbm9ybWFsbHkgTlVMTC4KLQotQGl0ZW0gZnhfb2Zmc2V0Ci1BIG51bWJlciB3aGljaCBpcyBhZGRlZCBpbnRvIHRoZSBmaXh1cC4KLQotQGl0ZW0gZnhfYWRkbnVtYmVyCi1Tb21lIENQVSBiYWNrZW5kcyB1c2UgdGhpcyBmaWVsZCB0byBjb252ZXkgaW5mb3JtYXRpb24gYmV0d2VlbgotQGNvZGV7bWRfYXBwbHlfZml4fSBhbmQgQGNvZGV7dGNfZ2VuX3JlbG9jfS4gIFRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUgZG9lcwotbm90IHVzZSBpdC4KLQotQGl0ZW0gZnhfbmV4dAotVGhlIG5leHQgZml4dXAgaW4gdGhlIHNlY3Rpb24uCi0KLUBpdGVtIGZ4X3JfdHlwZQotVGhlIHR5cGUgb2YgdGhlIGZpeHVwLiAgVGhpcyBmaWVsZCBpcyBvbmx5IGRlZmluZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0sIG9yCi1pZiB0aGUgdGFyZ2V0IGRlZmluZXMgQGNvZGV7TkVFRF9GWF9SX1RZUEV9LgotCi1AaXRlbSBmeF9zaXplCi1UaGUgc2l6ZSBvZiB0aGUgZml4dXAuICBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBlcnJvciBjaGVja2luZy4KLQotQGl0ZW0gZnhfcGNyZWwKLVdoZXRoZXIgdGhlIGZpeHVwIGlzIFBDIHJlbGF0aXZlLgotCi1AaXRlbSBmeF9kb25lCi1Ob24temVybyBpZiB0aGUgZml4dXAgaGFzIGJlZW4gYXBwbGllZCwgYW5kIG5vIHJlbG9jYXRpb24gZW50cnkgbmVlZHMgdG8gYmUKLWdlbmVyYXRlZC4KLQotQGl0ZW0gZnhfZmlsZQotQGl0ZW14IGZ4X2xpbmUKLVRoZSBmaWxlIGFuZCBsaW5lIHdoZXJlIHRoZSBmaXh1cCB3YXMgY3JlYXRlZC4KLQotQGl0ZW0gdGNfZml4X2RhdGEKLVRoaXMgaGFzIHRoZSB0eXBlIEBjb2Rle1RDX0ZJWF9UWVBFfSwgYW5kIGlzIG9ubHkgZGVmaW5lZCBpZiB0aGUgdGFyZ2V0IGRlZmluZXMKLXRoYXQgbWFjcm8uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEZyYWdzCi1Ac3Vic2VjdGlvbiBGcmFncwotQGNpbmRleCBpbnRlcm5hbHMsIGZyYWdzCi1AY2luZGV4IGZyYWdzCi1AY2luZGV4IGZyYWdTIHN0cnVjdHVyZS4KLQotVGhlIEBjb2Rle2ZyYWdTfSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBAZmlsZXthcy5ofS4gIEVhY2ggZnJhZyByZXByZXNlbnRzIGEKLXBvcnRpb24gb2YgdGhlIGZpbmFsIG9iamVjdCBmaWxlLiAgQXMgR0FTIHJlYWRzIHRoZSBzb3VyY2UgZmlsZSwgaXQgY3JlYXRlcwotZnJhZ3MgdG8gaG9sZCB0aGUgZGF0YSB0aGF0IGl0IHJlYWRzLiAgQXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkgdGhlIGZyYWdzIGFuZAotZml4dXBzIGFyZSBwcm9jZXNzZWQgdG8gcHJvZHVjZSB0aGUgZmluYWwgY29udGVudHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZnJfYWRkcmVzcwotVGhlIGFkZHJlc3Mgb2YgdGhlIGZyYWcuICBUaGlzIGlzIG5vdCBzZXQgdW50aWwgdGhlIGFzc2VtYmxlciByZXNjYW5zIHRoZSBsaXN0Ci1vZiBhbGwgZnJhZ3MgYWZ0ZXIgdGhlIGVudGlyZSBpbnB1dCBmaWxlIGlzIHBhcnNlZC4gIFRoZSBmdW5jdGlvbgotQGNvZGV7cmVsYXhfc2VnbWVudH0gZmlsbHMgaW4gdGhpcyBmaWVsZC4KLQotQGl0ZW0gZnJfbmV4dAotUG9pbnRlciB0byB0aGUgbmV4dCBmcmFnIGluIHRoaXMgKHN1YilzZWN0aW9uLgotCi1AaXRlbSBmcl9maXgKLUZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gZW1pdCB0byB0aGUgb3V0cHV0IGZpbGUuICBNYXkKLWJlIHplcm8uCi0KLUBpdGVtIGZyX3ZhcgotVmFyaWFibGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgbWF5IG91dHB1dCwgYWZ0ZXIgdGhlIGluaXRpYWwgQGNvZGV7ZnJfZml4fQotY2hhcmFjdGVycy4gIE1heSBiZSB6ZXJvLgotCi1AaXRlbSBmcl9vZmZzZXQKLVRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGZpZWxkIGlzIGNvbnRyb2xsZWQgYnkgQGNvZGV7ZnJfdHlwZX0uICBHZW5lcmFsbHksCi1pZiBAY29kZXtmcl92YXJ9IGlzIG5vbi16ZXJvLCB0aGlzIGlzIGEgcmVwZWF0IGNvdW50OiB0aGUgQGNvZGV7ZnJfdmFyfQotY2hhcmFjdGVycyBhcmUgb3V0cHV0IEBjb2Rle2ZyX29mZnNldH0gdGltZXMuCi0KLUBpdGVtIGxpbmUKLUhvbGRzIGxpbmUgbnVtYmVyIGluZm8gd2hlbiBhbiBhc3NlbWJsZXIgbGlzdGluZyB3YXMgcmVxdWVzdGVkLgotCi1AaXRlbSBmcl90eXBlCi1SZWxheGF0aW9uIHN0YXRlLiAgVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGludGVycHJldGF0aW9uIG9mIEBjb2Rle2ZyX29mZnNldH0sCi1AY29kZXtmcl9zeW1ib2x9IGFuZCB0aGUgdmFyaWFibGUtbGVuZ3RoIHRhaWwgb2YgdGhlIGZyYWcsIGFzIHdlbGwgYXMgdGhlCi10cmVhdG1lbnQgaXQgZ2V0cyBpbiB2YXJpb3VzIHBoYXNlcyBvZiBwcm9jZXNzaW5nLiAgSXQgZG9lcyBub3QgYWZmZWN0IHRoZQotaW5pdGlhbCBAY29kZXtmcl9maXh9IGNoYXJhY3RlcnM7IHRoZXkgYXJlIGFsd2F5cyBzdXBwb3NlZCB0byBiZSBvdXRwdXQKLXZlcmJhdGltIChmaXh1cHMgYXNpZGUpLiAgU2VlIGJlbG93IGZvciBzcGVjaWZpYyB2YWx1ZXMgdGhpcyBmaWVsZCBjYW4gaGF2ZS4KLQotQGl0ZW0gZnJfc3VidHlwZQotUmVsYXhhdGlvbiBzdWJzdGF0ZS4gIElmIHRoZSBtYWNybyBAY29kZXttZF9yZWxheF9mcmFnfSBpc24ndCBkZWZpbmVkLCB0aGlzIGlzCi1hc3N1bWVkIHRvIGJlIGFuIGluZGV4IGludG8gQGNvZGV7VENfR0VORVJJQ19SRUxBWF9UQUJMRX0gZm9yIHRoZSBnZW5lcmljCi1yZWxheGF0aW9uIGNvZGUgdG8gcHJvY2VzcyAoQHB4cmVme1JlbGF4YXRpb259KS4gIElmIEBjb2Rle21kX3JlbGF4X2ZyYWd9IGlzCi1kZWZpbmVkLCB0aGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgYW55IHVzZSBieSB0aGUgQ1BVLXNwZWNpZmljIGNvZGUuCi0KLUBpdGVtIGZyX3N5bWJvbAotVGhpcyBub3JtYWxseSBpbmRpY2F0ZXMgdGhlIHN5bWJvbCB0byB1c2Ugd2hlbiByZWxheGluZyB0aGUgZnJhZyBhY2NvcmRpbmcgdG8KLUBjb2Rle2ZyX3R5cGV9LgotCi1AaXRlbSBmcl9vcGNvZGUKLVBvaW50cyB0byB0aGUgbG93ZXN0LWFkZHJlc3NlZCBieXRlIG9mIHRoZSBvcGNvZGUsIGZvciB1c2UgaW4gcmVsYXhhdGlvbi4KLQotQGl0ZW0gdGNfZnJhZ19kYXRhCi1UYXJnZXQgc3BlY2lmaWMgZnJhZ21lbnQgZGF0YSBvZiB0eXBlIFRDX0ZSQUdfVFlQRS4KLU9ubHkgcHJlc2VudCBpZiBAY29kZXtUQ19GUkFHX1RZUEV9IGlzIGRlZmluZWQuCi0KLUBpdGVtIGZyX2ZpbGUKLUBpdGVteCBmcl9saW5lCi1UaGUgZmlsZSBhbmQgbGluZSB3aGVyZSB0aGlzIGZyYWcgd2FzIGxhc3QgbW9kaWZpZWQuCi0KLUBpdGVtIGZyX2xpdGVyYWwKLURlY2xhcmVkIGFzIGEgb25lLWNoYXJhY3RlciBhcnJheSwgdGhpcyBsYXN0IGZpZWxkIGdyb3dzIGFyYml0cmFyaWx5IGxhcmdlIHRvCi1ob2xkIHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlIGZyYWcuCi1AZW5kIHRhYmxlCi0KLVRoZXNlIGFyZSB0aGUgcG9zc2libGUgcmVsYXhhdGlvbiBzdGF0ZXMsIHByb3ZpZGVkIGluIHRoZSBlbnVtZXJhdGlvbiB0eXBlCi1AY29kZXtyZWxheF9zdGF0ZVR9LCBhbmQgdGhlIGludGVycHJldGF0aW9ucyB0aGV5IHJlcHJlc2VudCBmb3IgdGhlIG90aGVyCi1maWVsZHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gcnNfYWxpZ24KLUBpdGVteCByc19hbGlnbl9jb2RlCi1UaGUgc3RhcnQgb2YgdGhlIGZvbGxvd2luZyBmcmFnIHNob3VsZCBiZSBhbGlnbmVkIG9uIHNvbWUgYm91bmRhcnkuICBJbiB0aGlzCi1mcmFnLCBAY29kZXtmcl9vZmZzZXR9IGlzIHRoZSBsb2dhcml0aG0gKGJhc2UgMikgb2YgdGhlIGFsaWdubWVudCBpbiBieXRlcy4KLShGb3IgZXhhbXBsZSwgaWYgYWxpZ25tZW50IG9uIGFuIDgtYnl0ZSBib3VuZGFyeSB3ZXJlIGRlc2lyZWQsIEBjb2Rle2ZyX29mZnNldH0KLXdvdWxkIGhhdmUgYSB2YWx1ZSBvZiAzLikgIFRoZSB2YXJpYWJsZSBjaGFyYWN0ZXJzIGluZGljYXRlIHRoZSBmaWxsIHBhdHRlcm4gdG8KLWJlIHVzZWQuICBUaGUgQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAKLXdoZW4gZG9pbmcgdGhpcyBhbGlnbm1lbnQuICBJZiBtb3JlIGJ5dGVzIGFyZSBuZWVkZWQsIHRoZSBhbGlnbm1lbnQgaXMgbm90Ci1kb25lLiAgQW4gQGNvZGV7ZnJfc3VidHlwZX0gdmFsdWUgb2YgMCBtZWFucyBubyBtYXhpbXVtLCB3aGljaCBpcyB0aGUgbm9ybWFsCi1jYXNlLiAgVGFyZ2V0IGJhY2tlbmRzIGNhbiB1c2UgQGNvZGV7cnNfYWxpZ25fY29kZX0gdG8gaGFuZGxlIGNlcnRhaW4gdHlwZXMgb2YKLWFsaWdubWVudCBkaWZmZXJlbnRseS4KLQotQGl0ZW0gcnNfYnJva2VuX3dvcmQKLVRoaXMgaW5kaWNhdGVzIHRoYXQgYGBicm9rZW4gd29yZCcnIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGRvbmUgKEBweHJlZntCcm9rZW4KLXdvcmRzfSkuICBJZiBicm9rZW4gd29yZCBwcm9jZXNzaW5nIGlzIG5vdCBuZWNlc3Nhcnkgb24gdGhlIHRhcmdldCBtYWNoaW5lLAotdGhpcyBlbnVtZXJhdG9yIHZhbHVlIHdpbGwgbm90IGJlIGRlZmluZWQuCi0KLUBpdGVtIHJzX2NmYQotVGhpcyBzdGF0ZSBpcyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gZnJhbWUgb3B0aW1pemF0aW9ucy4gIFRoZQotQGNvZGV7ZnJfc3ltYm9sfSBpcyBhbiBleHByZXNzaW9uIHN5bWJvbCBmb3IgdGhlIHN1YnRyYWN0aW9uIHdoaWNoIG1heSBiZQotcmVsYXhlZC4gIFRoZSBAY29kZXtmcl9vcGNvZGV9IGZpZWxkIGhvbGRzIHRoZSBmcmFnIGZvciB0aGUgcHJlY2VkaW5nIGNvbW1hbmQKLWJ5dGUuICBUaGUgQGNvZGV7ZnJfb2Zmc2V0fSBmaWVsZCBob2xkcyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGF0IGZyYWcuICBUaGUKLUBjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIGlzIHVzZWQgZHVyaW5nIHJlbGF4YXRpb24gdG8gaG9sZCB0aGUgY3VycmVudCBzaXplIG9mCi10aGUgZnJhZy4KLQotQGl0ZW0gcnNfZmlsbAotVGhlIHZhcmlhYmxlIGNoYXJhY3RlcnMgYXJlIHRvIGJlIHJlcGVhdGVkIEBjb2Rle2ZyX29mZnNldH0gdGltZXMuICBJZgotQGNvZGV7ZnJfb2Zmc2V0fSBpcyAwLCB0aGlzIGZyYWcgaGFzIGEgbGVuZ3RoIG9mIEBjb2Rle2ZyX2ZpeH0uICBNb3N0IGZyYWdzCi1oYXZlIHRoaXMgdHlwZS4KLQotQGl0ZW0gcnNfbGViMTI4Ci1UaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBEV0FSRiBgYGxpdHRsZSBlbmRpYW4gYmFzZSAxMjgnJyAKLXZhcmlhYmxlIGxlbmd0aCBudW1iZXIgZm9ybWF0LiAgVGhlIEBjb2Rle2ZyX3N5bWJvbH0gaXMgYWx3YXlzIGFuIGV4cHJlc3Npb24KLXN5bWJvbCwgYXMgY29uc3RhbnQgZXhwcmVzc2lvbnMgYXJlIGVtaXR0ZWQgZGlyZWN0bHkuICBUaGUgQGNvZGV7ZnJfb2Zmc2V0fQotZmllbGQgaXMgdXNlZCBkdXJpbmcgcmVsYXhhdGlvbiB0byBob2xkIHRoZSBwcmV2aW91cyBzaXplIG9mIHRoZSBudW1iZXIgc28KLXRoYXQgd2UgY2FuIGRldGVybWluZSBpZiB0aGUgZnJhZ21lbnQgY2hhbmdlZCBzaXplLgotCi1AaXRlbSByc19tYWNoaW5lX2RlcGVuZGVudAotRGlzcGxhY2VtZW50IHJlbGF4YXRpb24gaXMgdG8gYmUgZG9uZSBvbiB0aGlzIGZyYWcuICBUaGUgdGFyZ2V0IGlzIGluZGljYXRlZCBieQotQGNvZGV7ZnJfc3ltYm9sfSBhbmQgQGNvZGV7ZnJfb2Zmc2V0fSwgYW5kIEBjb2Rle2ZyX3N1YnR5cGV9IGluZGljYXRlcyB0aGUKLXBhcnRpY3VsYXIgbWFjaGluZS1zcGVjaWZpYyBhZGRyZXNzaW5nIG1vZGUgZGVzaXJlZC4gIEB4cmVme1JlbGF4YXRpb259LgotCi1AaXRlbSByc19vcmcKLVRoZSBzdGFydCBvZiB0aGUgZm9sbG93aW5nIGZyYWcgc2hvdWxkIGJlIHB1c2hlZCBiYWNrIHRvIHNvbWUgc3BlY2lmaWMgb2Zmc2V0Ci13aXRoaW4gdGhlIHNlY3Rpb24uICAoU29tZSBhc3NlbWJsZXJzIHVzZSB0aGUgdmFsdWUgYXMgYW4gYWJzb2x1dGUgYWRkcmVzczsgR0FTCi1kb2VzIG5vdCBoYW5kbGUgZmluYWwgYWJzb2x1dGUgYWRkcmVzc2VzLCBidXQgcmF0aGVyIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmtlcgotc2V0IHRoZW0uKSAgVGhlIG9mZnNldCBpcyBnaXZlbiBieSBAY29kZXtmcl9zeW1ib2x9IGFuZCBAY29kZXtmcl9vZmZzZXR9OyBvbmUKLWNoYXJhY3RlciBmcm9tIHRoZSB2YXJpYWJsZS1sZW5ndGggdGFpbCBpcyB1c2VkIGFzIHRoZSBmaWxsIGNoYXJhY3Rlci4KLUBlbmQgdGFibGUKLQotQGNpbmRleCBmcmNoYWluUyBzdHJ1Y3R1cmUKLUEgY2hhaW4gb2YgZnJhZ3MgaXMgYnVpbHQgdXAgZm9yIGVhY2ggc3Vic2VjdGlvbi4gIFRoZSBkYXRhIHN0cnVjdHVyZQotZGVzY3JpYmluZyBhIGNoYWluIGlzIGNhbGxlZCBhIEBjb2Rle2ZyY2hhaW5TfSwgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLWZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBmcmNoX3Jvb3QKLVBvaW50cyB0byB0aGUgZmlyc3QgZnJhZyBpbiB0aGUgY2hhaW4uICBNYXkgYmUgTlVMTCBpZiB0aGVyZSBhcmUgbm8gZnJhZ3MgaW4KLXRoaXMgY2hhaW4uCi1AaXRlbSBmcmNoX2xhc3QKLVBvaW50cyB0byB0aGUgbGFzdCBmcmFnIGluIHRoZSBjaGFpbiwgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbm9uZS4KLUBpdGVtIGZyY2hfbmV4dAotTmV4dCBpbiB0aGUgbGlzdCBvZiBAY29kZXtmcmNoYWluU30gc3RydWN0dXJlcy4KLUBpdGVtIGZyY2hfc2VnCi1JbmRpY2F0ZXMgdGhlIHNlY3Rpb24gdGhpcyBmcmFnIGNoYWluIGJlbG9uZ3MgdG8uCi1AaXRlbSBmcmNoX3N1YnNlZwotU3Vic2VjdGlvbiAoc3Vic2VnbWVudCkgbnVtYmVyIG9mIHRoaXMgZnJhZyBjaGFpbi4KLUBpdGVtIGZpeF9yb290LCBmaXhfdGFpbAotKERlZmluZWQgb25seSBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkKS4gIFBvaW50IHRvIGZpcnN0IGFuZCBsYXN0Ci1AY29kZXtmaXhTfSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNlY3Rpb24uCi1AaXRlbSBmcmNoX29ic3RhY2sKLU5vdCBjdXJyZW50bHkgdXNlZC4gIEludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGZyYWcgYWxsb2NhdGlvbiBmb3IgdGhpcwotc3Vic2VjdGlvbi4gIFRoaXMgc2hvdWxkIHJlZHVjZSBmcmFnIGdlbmVyYXRpb24gY2F1c2VkIGJ5IHN3aXRjaGluZyBzZWN0aW9ucy4KLUBpdGVtIGZyY2hfZnJhZ19ub3cKLVRoZSBjdXJyZW50IGZyYWcgZm9yIHRoaXMgc3Vic2VnbWVudC4KLUBlbmQgdGFibGUKLQotQSBAY29kZXtmcmNoYWluU30gY29ycmVzcG9uZHMgdG8gYSBzdWJzZWN0aW9uOyBlYWNoIHNlY3Rpb24gaGFzIGEgbGlzdCBvZgotQGNvZGV7ZnJjaGFpblN9IHJlY29yZHMgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSW4gbW9zdCBjYXNlcywgb25seSBvbmUgc3Vic2VjdGlvbgotb2YgZWFjaCBzZWN0aW9uIGlzIHVzZWQsIHNvIHRoZSBsaXN0IHdpbGwgb25seSBiZSBvbmUgZWxlbWVudCBsb25nLCBidXQgYW55Ci1wcm9jZXNzaW5nIG9mIGZyYWcgY2hhaW5zIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggbXVsdGlwbGUgY2hhaW5zIHBlcgotc2VjdGlvbi4KLQotQWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZCwgYW5kIG5vIG1vcmUgZnJhZ3MgYXJlIHRvCi1iZSBnZW5lcmF0ZWQsIHRoZSBmcmFnIGNoYWlucyBhcmUgam9pbmVkIGludG8gb25lIHBlciBzZWN0aW9uIGZvciBmdXJ0aGVyCi1wcm9jZXNzaW5nLiAgQWZ0ZXIgdGhpcyBwb2ludCwgaXQgaXMgc2FmZSB0byBvcGVyYXRlIG9uIG9uZSBjaGFpbiBwZXIgc2VjdGlvbi4KLQotVGhlIGFzc2VtYmxlciBhbHdheXMgaGFzIGEgY3VycmVudCBmcmFnLCBuYW1lZCBAY29kZXtmcmFnX25vd30uICBNb3JlIHNwYWNlIGlzCi1hbGxvY2F0ZWQgZm9yIHRoZSBjdXJyZW50IGZyYWcgdXNpbmcgdGhlIEBjb2Rle2ZyYWdfbW9yZX0gZnVuY3Rpb247IHRoaXMKLXJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbW91bnQgb2YgcmVxdWVzdGVkIHNwYWNlLiAgUmVsYXhpbmcgaXMgZG9uZSB1c2luZwotdmFyaWFudCBmcmFncyBhbGxvY2F0ZWQgYnkgQGNvZGV7ZnJhZ192YXJ9IG9yIEBjb2Rle2ZyYWdfdmFyaWFudH0KLShAcHhyZWZ7UmVsYXhhdGlvbn0pLgotCi1Abm9kZSBHQVMgcHJvY2Vzc2luZwotQHNlY3Rpb24gV2hhdCBHQVMgZG9lcyB3aGVuIGl0IHJ1bnMKLUBjaW5kZXggaW50ZXJuYWxzLCBvdmVydmlldwotCi1UaGlzIGlzIGEgcXVpY2sgbG9vayBhdCB3aGF0IGFuIGFzc2VtYmxlciBydW4gbG9va3MgbGlrZS4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBhc3NlbWJsZXIgaW5pdGlhbGl6ZXMgaXRzZWxmIGJ5IGNhbGxpbmcgdmFyaW91cyBpbml0IHJvdXRpbmVzLgotCi1AaXRlbQotRm9yIGVhY2ggc291cmNlIGZpbGUsIHRoZSBAY29kZXtyZWFkX2Ffc291cmNlX2ZpbGV9IGZ1bmN0aW9uIHJlYWRzIGluIHRoZSBmaWxlCi1hbmQgcGFyc2VzIGl0LiAgVGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtpbnB1dF9saW5lX3BvaW50ZXJ9IHBvaW50cyB0byB0aGUKLWN1cnJlbnQgdGV4dDsgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IHVwIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGJ1dCBub3QKLWZhcnRoZXIuCi0KLUBpdGVtCi1Gb3IgZWFjaCBsaW5lLCB0aGUgYXNzZW1ibGVyIHBhc3NlcyBsYWJlbHMgdG8gdGhlIEBjb2Rle2NvbG9ufSBmdW5jdGlvbiwgYW5kCi1pc29sYXRlcyB0aGUgZmlyc3Qgd29yZC4gIElmIGl0IGxvb2tzIGxpa2UgYSBwc2V1ZG8tb3AsIHRoZSB3b3JkIGlzIGxvb2tlZCB1cAotaW4gdGhlIHBzZXVkby1vcCBoYXNoIHRhYmxlIEBjb2Rle3BvX2hhc2h9IGFuZCBkaXNwYXRjaGVkIHRvIGEgcHNldWRvLW9wCi1yb3V0aW5lLiAgT3RoZXJ3aXNlLCB0aGUgdGFyZ2V0IGRlcGVuZGVudCBAY29kZXttZF9hc3NlbWJsZX0gcm91dGluZSBpcyBjYWxsZWQKLXRvIHBhcnNlIHRoZSBpbnN0cnVjdGlvbi4KLQotQGl0ZW0KLVdoZW4gcHNldWRvLW9wcyBvciBpbnN0cnVjdGlvbnMgb3V0cHV0IGRhdGEsIHRoZXkgYWRkIGl0IHRvIGEgZnJhZywgY2FsbGluZwotQGNvZGV7ZnJhZ19tb3JlfSB0byBnZXQgc3BhY2UgdG8gc3RvcmUgaXQgaW4uCi0KLUBpdGVtCi1Qc2V1ZG8tb3BzIGFuZCBpbnN0cnVjdGlvbnMgY2FuIGFsc28gb3V0cHV0IGZpeHVwcyBjcmVhdGVkIGJ5IEBjb2Rle2ZpeF9uZXd9IG9yCi1AY29kZXtmaXhfbmV3X2V4cH0uCi0KLUBpdGVtCi1Gb3IgY2VydGFpbiB0YXJnZXRzLCBpbnN0cnVjdGlvbnMgY2FuIGNyZWF0ZSB2YXJpYW50IGZyYWdzIHdoaWNoIGFyZSB1c2VkIHRvCi1zdG9yZSByZWxheGF0aW9uIGluZm9ybWF0aW9uIChAcHhyZWZ7UmVsYXhhdGlvbn0pLgotCi1AaXRlbQotV2hlbiB0aGUgaW5wdXQgZmlsZSBpcyBmaW5pc2hlZCwgdGhlIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfSByb3V0aW5lIGlzCi1jYWxsZWQuICBJdCBhc3NpZ25zIGFkZHJlc3NlcyB0byBhbGwgdGhlIGZyYWdzIChAY29kZXtyZWxheF9zZWdtZW50fSksIHJlc29sdmVzCi1hbGwgdGhlIGZpeHVwcyAoQGNvZGV7Zml4dXBfc2VnbWVudH0pLCByZXNvbHZlcyBhbGwgdGhlIHN5bWJvbCB2YWx1ZXMgKHVzaW5nCi1AY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0pLCBhbmQgZmluYWxseSB3cml0ZXMgb3V0IHRoZSBmaWxlIChpbiB0aGUKLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IGNhc2UsIHRoaXMgaXMgZG9uZSBieSBzaW1wbHkgY2FsbGluZyBAY29kZXtiZmRfY2xvc2V9KS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBQb3J0aW5nIEdBUwotQHNlY3Rpb24gUG9ydGluZyBHQVMKLUBjaW5kZXggcG9ydGluZwotCi1FYWNoIEdBUyB0YXJnZXQgc3BlY2lmaWVzIHR3byBtYWluIHRoaW5nczogdGhlIENQVSBmaWxlIGFuZCB0aGUgb2JqZWN0IGZvcm1hdAotZmlsZS4gIFR3byBtYWluIHN3aXRjaGVzIGluIHRoZSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaGFuZGxlIHRoaXMuICBUaGUKLWZpcnN0IHN3aXRjaGVzIG9uIENQVSB0eXBlIHRvIHNldCB0aGUgc2hlbGwgdmFyaWFibGUgQGNvZGV7Y3B1X3R5cGV9LiAgVGhlCi1zZWNvbmQgc3dpdGNoZXMgb24gdGhlIGVudGlyZSB0YXJnZXQgdG8gc2V0IHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtmbXR9LgotCi1UaGUgY29uZmlndXJlIHNjcmlwdCB1c2VzIHRoZSB2YWx1ZSBvZiBAY29kZXtjcHVfdHlwZX0gdG8gc2VsZWN0IHR3byBmaWxlcyBpbgotdGhlIEBmaWxle2NvbmZpZ30gZGlyZWN0b3J5OiBAZmlsZXt0Yy1AdmFye0NQVX0uY30gYW5kIEBmaWxle3RjLUB2YXJ7Q1BVfS5ofS4KLVRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle3RhcmctY3B1Lmh9IGluIHRoZQotYnVpbGQgZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGVzIEBmaWxle3RjLUB2YXJ7Q1BVfS5ofS4KLQotVGhlIGNvbmZpZ3VyZSBzY3JpcHQgYWxzbyB1c2VzIHRoZSB2YWx1ZSBvZiBAY29kZXtmbXR9IHRvIHNlbGVjdCB0d28gZmlsZXM6Ci1AZmlsZXtvYmotQHZhcntmbXR9LmN9IGFuZCBAZmlsZXtvYmotQHZhcntmbXR9Lmh9LiAgVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcwotd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle29iai1mb3JtYXQuaH0gaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSB3aGljaAotaW5jbHVkZXMgQGZpbGV7b2JqLUB2YXJ7Zm10fS5ofS4KLQotWW91IGNhbiBhbHNvIHNldCB0aGUgZW11bGF0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGJ5IHNldHRpbmcgdGhlIEBjb2Rle2VtfQotdmFyaWFibGUuICBOb3JtYWxseSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAc2FtcHtnZW5lcmljfSBpcyBmaW5lLiAgVGhlCi1jb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle3RhcmctZW52Lmh9IGluIHRoZSBidWlsZAotZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGVzIEBmaWxle3RlLUB2YXJ7ZW19Lmh9LgotCi1Qb3J0aW5nIEdBUyB0byBhIG5ldyBDUFUgcmVxdWlyZXMgd3JpdGluZyB0aGUgQGZpbGV7dGMtQHZhcntDUFV9fSBmaWxlcy4KLVBvcnRpbmcgR0FTIHRvIGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCByZXF1aXJlcyB3cml0aW5nIHRoZQotQGZpbGV7b2JqLUB2YXJ7Zm10fX0gZmlsZXMuICBUaGVyZSBpcyBzb21ldGltZXMgc29tZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZXNlCi10d28gZmlsZXMsIGJ1dCBpdCBpcyBub3JtYWxseSBtaW5pbWFsLgotCi1UaGUgYmVzdCBhcHByb2FjaCBpcywgb2YgY291cnNlLCB0byBjb3B5IGV4aXN0aW5nIGZpbGVzLiAgVGhlIGRvY3VtZW50YXRpb24KLWJlbG93IGFzc3VtZXMgdGhhdCB5b3UgYXJlIGxvb2tpbmcgYXQgZXhpc3RpbmcgZmlsZXMgdG8gc2VlIHVzYWdlIGRldGFpbHMuCi0KLVRoZXNlIGludGVyZmFjZXMgaGF2ZSBncm93biBvdmVyIHRpbWUsIGFuZCBoYXZlIG5ldmVyIGJlZW4gY2FyZWZ1bGx5IHRob3VnaHQKLW91dCBvciBkZXNpZ25lZC4gIE5vdGhpbmcgYWJvdXQgdGhlIGludGVyZmFjZXMgZGVzY3JpYmVkIGhlcmUgaXMgY2FzdCBpbiBzdG9uZS4KLUl0IGlzIHBvc3NpYmxlIHRoYXQgdGhleSB3aWxsIGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgdG8gdGhlCi1uZXh0LiAgQWxzbywgbmV3IG1hY3JvcyBhcmUgYWRkZWQgYWxsIHRoZSB0aW1lIGFzIHRoZXkgYXJlIG5lZWRlZC4KLQotQG1lbnUKLSogQ1BVIGJhY2tlbmQ6OiAgICAgICAgICAgICAgICAgV3JpdGluZyBhIENQVSBiYWNrZW5kCi0qIE9iamVjdCBmb3JtYXQgYmFja2VuZDo6ICAgICAgIFdyaXRpbmcgYW4gb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi0qIEVtdWxhdGlvbnM6OiAgICAgICAgICAgICAgICAgIFdyaXRpbmcgZW11bGF0aW9uIGZpbGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQ1BVIGJhY2tlbmQKLUBzdWJzZWN0aW9uIFdyaXRpbmcgYSBDUFUgYmFja2VuZAotQGNpbmRleCBDUFUgYmFja2VuZAotQGNpbmRleCBAZmlsZXt0Yy1AdmFye0NQVX19Ci0KLVRoZSBDUFUgYmFja2VuZCBmaWxlcyBhcmUgdGhlIGhlYXJ0IG9mIHRoZSBhc3NlbWJsZXIuICBUaGV5IGFyZSB0aGUgb25seSBwYXJ0cwotb2YgdGhlIGFzc2VtYmxlciB3aGljaCBhY3R1YWxseSBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlCi1wcm9jZXNzb3IuCi0KLVlvdSBtdXN0IGRlZmluZSBhIHJlYXNvbmFibHkgc21hbGwgbGlzdCBvZiBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBpbiB0aGUgQ1BVCi1iYWNrZW5kIGZpbGVzLiAgWW91IG1heSBkZWZpbmUgYSBsYXJnZSBudW1iZXIgb2YgYWRkaXRpb25hbCBtYWNyb3MgaW4gdGhlIENQVQotYmFja2VuZCBmaWxlcywgbm90IGFsbCBvZiB3aGljaCBhcmUgZG9jdW1lbnRlZCBoZXJlLiAgWW91IG11c3QsIG9mIGNvdXJzZSwKLWRlZmluZSBtYWNyb3MgaW4gdGhlIEBmaWxley5ofSBmaWxlLCB3aGljaCBpcyBpbmNsdWRlZCBieSBldmVyeSBhc3NlbWJsZXIKLXNvdXJjZSBmaWxlLiAgWW91IG1heSBkZWZpbmUgdGhlIGZ1bmN0aW9ucyBhcyBtYWNyb3MgaW4gdGhlIEBmaWxley5ofSBmaWxlLCBvcgotYXMgZnVuY3Rpb25zIGluIHRoZSBAZmlsZXsuY30gZmlsZS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBUQ19AdmFye0NQVX0KLUBjaW5kZXggVENfQHZhcntDUFV9Ci1CeSBjb252ZW50aW9uLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIGluIHRoZSBAZmlsZXsuaH0gZmlsZS4gIEZvcgotZXhhbXBsZSwgQGZpbGV7dGMtbTY4ay5ofSBkZWZpbmVzIEBjb2Rle1RDX002OEt9LiAgWW91IG1pZ2h0IGhhdmUgdG8gdXNlIHRoaXMKLWlmIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgQ1BVIHNwZWNpZmljIGNvZGUgdG8gdGhlIG9iamVjdCBmb3JtYXQgZmlsZS4KLQotQGl0ZW0gVEFSR0VUX0ZPUk1BVAotVGhpcyBtYWNybyBpcyB0aGUgQkZEIHRhcmdldCBuYW1lIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLXdpbGwgbm9ybWFsbHkgZGVwZW5kIHVwb24gdGhlIEBjb2Rle09CSl9AdmFye0ZNVH19IG1hY3JvLgotCi1AaXRlbSBUQVJHRVRfQVJDSAotVGhpcyBtYWNybyBpcyB0aGUgQkZEIGFyY2hpdGVjdHVyZSB0byBwYXNzIHRvIEBjb2Rle2JmZF9zZXRfYXJjaF9tYWNofS4KLQotQGl0ZW0gVEFSR0VUX01BQ0gKLVRoaXMgbWFjcm8gaXMgdGhlIEJGRCBtYWNoaW5lIG51bWJlciB0byBwYXNzIHRvIEBjb2Rle2JmZF9zZXRfYXJjaF9tYWNofS4gIElmCi1pdCBpcyBub3QgZGVmaW5lZCwgR0FTIHdpbGwgdXNlIDAuCi0KLUBpdGVtIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi1Zb3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIHRvIGJlIG5vbi16ZXJvIGlmIHRoZSB0YXJnZXQgaXMgYmlnIGVuZGlhbiwgYW5kCi16ZXJvIGlmIHRoZSB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbi4KLQotQGl0ZW0gbWRfc2hvcnRvcHRzCi1AaXRlbXggbWRfbG9uZ29wdHMKLUBpdGVteCBtZF9sb25nb3B0c19zaXplCi1AaXRlbXggbWRfcGFyc2Vfb3B0aW9uCi1AaXRlbXggbWRfc2hvd191c2FnZQotQGNpbmRleCBtZF9zaG9ydG9wdHMKLUBjaW5kZXggbWRfbG9uZ29wdHMKLUBjaW5kZXggbWRfbG9uZ29wdHNfc2l6ZQotQGNpbmRleCBtZF9wYXJzZV9vcHRpb24KLUBjaW5kZXggbWRfc2hvd191c2FnZQotR0FTIHVzZXMgdGhlc2UgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZHVyaW5nIG9wdGlvbiBwcm9jZXNzaW5nLgotQGNvZGV7bWRfc2hvcnRvcHRzfSBpcyBhIEBjb2Rle2NvbnN0IGNoYXIgKn0gd2hpY2ggR0FTIGFkZHMgdG8gdGhlIG1hY2hpbmUKLWluZGVwZW5kZW50IHN0cmluZyBwYXNzZWQgdG8gQGNvZGV7Z2V0b3B0fS4gIEBjb2Rle21kX2xvbmdvcHRzfSBpcyBhCi1AY29kZXtzdHJ1Y3Qgb3B0aW9uIFtdfSB3aGljaCBHQVMgYWRkcyB0byB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBsb25nIG9wdGlvbnMKLXBhc3NlZCB0byBAY29kZXtnZXRvcHR9OyB5b3UgbWF5IHVzZSBAY29kZXtPUFRJT05fTURfQkFTRX0sIGRlZmluZWQgaW4KLUBmaWxle2FzLmh9LCBhcyB0aGUgc3RhcnQgb2YgYSBzZXQgb2YgbG9uZyBvcHRpb24gaW5kaWNlcywgaWYgbmVjZXNzYXJ5LgotQGNvZGV7bWRfbG9uZ29wdHNfc2l6ZX0gaXMgYSBAY29kZXtzaXplX3R9IGhvbGRpbmcgdGhlIHNpemUgQGNvZGV7bWRfbG9uZ29wdHN9LgotR0FTIHdpbGwgY2FsbCBAY29kZXttZF9wYXJzZV9vcHRpb259IHdoZW5ldmVyIEBjb2Rle2dldG9wdH0gcmV0dXJucyBhbgotdW5yZWNvZ25pemVkIGNvZGUsIHByZXN1bWFibHkgaW5kaWNhdGluZyBhIHNwZWNpYWwgY29kZSB2YWx1ZSB3aGljaCBhcHBlYXJzIGluCi1AY29kZXttZF9sb25nb3B0c30uICBHQVMgd2lsbCBjYWxsIEBjb2Rle21kX3Nob3dfdXNhZ2V9IHdoZW4gYSB1c2FnZSBtZXNzYWdlIGlzCi1wcmludGVkOyBpdCBzaG91bGQgcHJpbnQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFjaGluZSBzcGVjaWZpYyBvcHRpb25zLgotCi1AaXRlbSBtZF9iZWdpbgotQGNpbmRleCBtZF9iZWdpbgotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgYXNzZW1ibHksIGFmdGVyIHRoZSBjb21tYW5kCi1saW5lIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIGFuZCBhbGwgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb25zCi1oYXZlIGJlZW4gY29tcGxldGVkLgotCi1AaXRlbSBtZF9jbGVhbnVwCi1AY2luZGV4IG1kX2NsZWFudXAKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgZW5kIG9mIGVhY2ggaW5wdXQgZmlsZS4KLQotQGl0ZW0gbWRfYXNzZW1ibGUKLUBjaW5kZXggbWRfYXNzZW1ibGUKLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBpbnB1dCBsaW5lIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYQotcHNldWRvLW9wLiAgVGhlIGFyZ3VtZW50IGlzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSBmdW5jdGlvbiBzaG91bGQKLWFzc2VtYmxlIHRoZSBzdHJpbmcgYXMgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBvcGVyYW5kcy4gIE5vcm1hbGx5Ci1AY29kZXttZF9hc3NlbWJsZX0gd2lsbCBkbyB0aGlzIGJ5IGNhbGxpbmcgQGNvZGV7ZnJhZ19tb3JlfSBhbmQgd3JpdGluZyBvdXQKLXNvbWUgYnl0ZXMgKEBweHJlZntGcmFnc30pLiAgQGNvZGV7bWRfYXNzZW1ibGV9IHdpbGwgY2FsbCBAY29kZXtmaXhfbmV3fSB0bwotY3JlYXRlIGZpeHVwcyBhcyBuZWVkZWQgKEBweHJlZntGaXh1cHN9KS4gIFRhcmdldHMgd2hpY2ggbmVlZCB0byBkbyBzcGVjaWFsCi1wdXJwb3NlIHJlbGF4YXRpb24gd2lsbCBjYWxsIEBjb2Rle2ZyYWdfdmFyfS4KLQotQGl0ZW0gbWRfcHNldWRvX3RhYmxlCi1AY2luZGV4IG1kX3BzZXVkb190YWJsZQotVGhpcyBpcyBhIGNvbnN0IGFycmF5IG9mIHR5cGUgQGNvZGV7cHNldWRvX3R5cGVTfS4gIEl0IGlzIGEgbWFwcGluZyBmcm9tCi1wc2V1ZG8tb3AgbmFtZXMgdG8gZnVuY3Rpb25zLiAgWW91IHNob3VsZCB1c2UgdGhpcyB0YWJsZSB0byBpbXBsZW1lbnQKLXBzZXVkby1vcHMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIHRoZSBDUFUuCi0KLUBpdGVtIHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCi1AY2luZGV4IHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIEdBUyB3aWxsIGNhbGwgaXQgd2l0aCBhIEBjb2Rle3BzZXVkb190eXBlU30gYXJndW1lbnQuCi1JdCBzaG91bGQgcmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBwc2V1ZG8tb3AgaXMgYSBjb25kaXRpb25hbCB3aGljaCBjb250cm9scwotd2hldGhlciBjb2RlIGlzIGFzc2VtYmxlZCwgc3VjaCBhcyBAc2FtcHsuaWZ9LiAgR0FTIGtub3dzIGFib3V0IHRoZSBub3JtYWwKLWNvbmRpdGlvbmFsIHBzZXVkby1vcHMsYW5kIHlvdSBzaG91bGQgbm9ybWFsbHkgbm90IGhhdmUgdG8gZGVmaW5lIHRoaXMgbWFjcm8uCi0KLUBpdGVtIGNvbW1lbnRfY2hhcnMKLUBjaW5kZXggY29tbWVudF9jaGFycwotVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEKLWNvbW1lbnQuCi0KLUBpdGVtIHRjX2NvbW1lbnRfY2hhcnMKLUBjaW5kZXggdGNfY29tbWVudF9jaGFycwotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBHQVMgd2lsbCB1c2UgaXQgaW5zdGVhZCBvZiBAY29kZXtjb21tZW50X2NoYXJzfS4KLQotQGl0ZW0gdGNfc3ltYm9sX2NoYXJzCi1AY2luZGV4IHRjX3N5bWJvbF9jaGFycwotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBpdCBpcyBhIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgbGlzdCBvZgotY2hhcmFjdGVycyB3aGljaCBtYXkgYXBwZWFyIGluIGFuIG9wZXJhbmQuICBHQVMgYWxyZWFkeSBhc3N1bWVzIHRoYXQgYWxsCi1hbHBoYW51bWJlcmljIGNoYXJhY3RlcnMsIGFuZCBAc2FtcHskfSwgQHNhbXB7Ln0sIGFuZCBAc2FtcHtffSBtYXkgYXBwZWFyIGluIGFuCi1vcGVyYW5kIChzZWUgQHNhbXB7c3ltYm9sX2NoYXJzfSBpbiBAZmlsZXthcHAuY30pLiAgVGhpcyBtYWNybyBtYXkgYmUgZGVmaW5lZAotdG8gdHJlYXQgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGFzIGFwcGVhcmluZyBpbiBhbiBvcGVyYW5kLiAgVGhpcyBhZmZlY3RzIHRoZQotd2F5IGluIHdoaWNoIEdBUyByZW1vdmVzIHdoaXRlc3BhY2UgYmVmb3JlIHBhc3NpbmcgdGhlIHN0cmluZyB0bwotQHNhbXB7bWRfYXNzZW1ibGV9LgotCi1AaXRlbSBsaW5lX2NvbW1lbnRfY2hhcnMKLUBjaW5kZXggbGluZV9jb21tZW50X2NoYXJzCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYQotY29tbWVudCB3aGVuIHRoZXkgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCi0KLUBpdGVtIGxpbmVfc2VwYXJhdG9yX2NoYXJzCi1AY2luZGV4IGxpbmVfc2VwYXJhdG9yX2NoYXJzCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc2VwYXJhdGUKLWxpbmVzIChzZW1pY29sb24gYW5kIG5ld2xpbmUgYXJlIHN1Y2ggY2hhcmFjdGVycyBieSBkZWZhdWx0LCBhbmQgbmVlZCBub3QgYmUKLWxpc3RlZCBpbiB0aGlzIGFycmF5KS4gIE5vdGUgdGhhdCBsaW5lX3NlcGFyYXRvcl9jaGFycyBkbyBub3Qgc2VwYXJhdGUgbGluZXMKLWlmIGZvdW5kIGluIGEgY29tbWVudCwgc3VjaCBhcyBhZnRlciBhIGNoYXJhY3RlciBpbiBsaW5lX2NvbW1lbnRfY2hhcnMgb3IKLWNvbW1lbnRfY2hhcnMuCi0KLUBpdGVtIEVYUF9DSEFSUwotQGNpbmRleCBFWFBfQ0hBUlMKLVRoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBtYXkgYmUKLXVzZWQgYXMgdGhlIGV4cG9uZW50IGNoYXJhY3RlciBpbiBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gIFRoaXMgaXMgbm9ybWFsbHkKLUBjb2RleyJlRSJ9LgotCi1AaXRlbSBGTFRfQ0hBUlMKLUBjaW5kZXggRkxUX0NIQVJTCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlCi11c2VkIHRvIGluZGljYXRlIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICBBIHplcm8gZm9sbG93ZWQgYnkgb25lIG9mIHRoZXNlCi1jaGFyYWN0ZXJzIGlzIGFzc3VtZWQgdG8gYmUgZm9sbG93ZWQgYnkgYSBmbG9hdGluZyBwb2ludCBudW1iZXI7IHRodXMgdGhleQotb3BlcmF0ZSB0aGUgd2F5IHRoYXQgQGNvZGV7MHh9IGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBoZXhhZGVjaW1hbCBjb25zdGFudC4KLVVzdWFsbHkgdGhpcyBpbmNsdWRlcyBAc2FtcHtyfSBhbmQgQHNhbXB7Zn0uCi0KLUBpdGVtIExFWF9BVAotQGNpbmRleCBMRVhfQVQKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHtAQH0gY2hhcmFjdGVyLiAgVGhlCi1kZWZhdWx0IGlzIHplcm8uCi0KLUxleGljYWwgdHlwZXMgYXJlIGEgY29tYmluYXRpb24gb2YgQGNvZGV7TEVYX05BTUV9IGFuZCBAY29kZXtMRVhfQkVHSU5fTkFNRX0sCi1ib3RoIGRlZmluZWQgaW4gQGZpbGV7cmVhZC5ofS4gIEBjb2Rle0xFWF9OQU1FfSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hhcmFjdGVyCi1tYXkgYXBwZWFyIGluIGEgbmFtZS4gIEBjb2Rle0xFWF9CRUdJTl9OQU1FfSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hhcmFjdGVyIG1heQotYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuYW1lLgotCi1AaXRlbSBMRVhfQlIKLUBjaW5kZXggTEVYX0JSCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIGJyYWNlIGNoYXJhY3RlcnMgQGtiZHtAe30sCi1Aa2Jke0B9fSwgQGtiZHtbfSwgYW5kIEBrYmR7XX0uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB6ZXJvLgotCi1AaXRlbSBMRVhfUENUCi1AY2luZGV4IExFWF9QQ1QKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHslfSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgemVyby4KLQotQGl0ZW0gTEVYX1FNCi1AY2luZGV4IExFWF9RTQotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBAa2Jkez99IGNoYXJhY3Rlci4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpdCB6ZXJvLgotCi1AaXRlbSBMRVhfRE9MTEFSCi1AY2luZGV4IExFWF9ET0xMQVIKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHskfSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7TEVYX05BTUUgfCBMRVhfQkVHSU5fTkFNRX0uCi0KLUBpdGVtIE5VTUJFUlNfV0lUSF9TVUZGSVgKLUBjaW5kZXggTlVNQkVSU19XSVRIX1NVRkZJWAotV2hlbiB0aGlzIG1hY3JvIGlzIGRlZmluZWQgdG8gYmUgbm9uLXplcm8sIHRoZSBwYXJzZXIgYWxsb3dzIHRoZSByYWRpeCBvZiBhCi1jb25zdGFudCB0byBiZSBpbmRpY2F0ZWQgd2l0aCBhIHN1ZmZpeC4gIFZhbGlkIHN1ZmZpeGVzIGFyZSBiaW5hcnkgKEIpLCAKLW9jdGFsIChRKSwgYW5kIGhleGFkZWNpbWFsIChIKS4gIENhc2UgaXMgbm90IHNpZ25pZmljYW50LgotCi1AaXRlbSBTSU5HTEVfUVVPVEVfU1RSSU5HUwotQGNpbmRleCBTSU5HTEVfUVVPVEVfU1RSSU5HUwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCB0cmVhdCBzaW5nbGUgcXVvdGVzIGFzIHN0cmluZyBkZWxpbWl0ZXJzLgotTm9ybWFsbHkgb25seSBkb3VibGUgcXVvdGVzIGFyZSBhY2NlcHRlZCBhcyBzdHJpbmcgZGVsaW1pdGVycy4KLQotQGl0ZW0gTk9fU1RSSU5HX0VTQ0FQRVMKLUBjaW5kZXggTk9fU1RSSU5HX0VTQ0FQRVMKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgbm90IHBlcm1pdCBlc2NhcGUgc2VxdWVuY2VzIGluIGEgc3RyaW5nLgotCi1AaXRlbSBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKLUBjaW5kZXggT05MWV9TVEFOREFSRF9FU0NBUEVTCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHdhcm4gYWJvdXQgdGhlIHVzZSBvZiBub25zdGFuZGFyZCBlc2NhcGUKLXNlcXVlbmNlcyBpbiBhIHN0cmluZy4KLQotQGl0ZW0gbWRfc3RhcnRfbGluZV9ob29rCi1AY2luZGV4IG1kX3N0YXJ0X2xpbmVfaG9vawotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBzdGFydCBvZiBlYWNoIGxpbmUuCi0KLUBpdGVtIExBQkVMU19XSVRIT1VUX0NPTE9OUwotQGNpbmRleCBMQUJFTFNfV0lUSE9VVF9DT0xPTlMKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgYXNzdW1lIHRoYXQgYW55IHRleHQgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZQotaXMgYSBsYWJlbCwgZXZlbiBpZiBpdCBkb2VzIG5vdCBoYXZlIGEgY29sb24uCi0KLUBpdGVtIFRDX1NUQVJUX0xBQkVMCi1AY2luZGV4IFRDX1NUQVJUX0xBQkVMCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGNvbnRyb2wgd2hhdCBHQVMgY29uc2lkZXJzIHRvIGJlIGEgbGFiZWwuICBUaGUKLWRlZmF1bHQgZGVmaW5pdGlvbiBpcyB0byBhY2NlcHQgYW55IG5hbWUgZm9sbG93ZWQgYnkgYSBjb2xvbiBjaGFyYWN0ZXIuCi0KLUBpdGVtIFRDX1NUQVJUX0xBQkVMX1dJVEhPVVRfQ09MT04KLUBjaW5kZXggVENfU1RBUlRfTEFCRUxfV0lUSE9VVF9DT0xPTgotU2FtZSBhcyBUQ19TVEFSVF9MQUJFTCwgYnV0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgVENfU1RBUlRfTEFCRUwgd2hlbgotTEFCRUxTX1dJVEhPVVRfQ09MT05TIGlzIGRlZmluZWQuIAotCi1AaXRlbSBOT19QU0VVRE9fRE9UCi1AY2luZGV4IE5PX1BTRVVET19ET1QKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgbm90IHJlcXVpcmUgcHNldWRvLW9wcyB0byBzdGFydCB3aXRoIGEKLUBrYmR7Ln0gY2hhcmFjdGVyLgotCi1AaXRlbSBUQ19FUVVBTF9JTl9JTlNOCi1AY2luZGV4IFRDX0VRVUFMX0lOX0lOU04KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgaXQgc2hvdWxkIHJldHVybiBub256ZXJvIGlmIHRoZSBpbnN0cnVjdGlvbiBpcwotcGVybWl0dGVkIHRvIGNvbnRhaW4gYW4gQGtiZHs9fSBjaGFyYWN0ZXIuICBHQVMgd2lsbCBjYWxsIGl0IHdpdGggdHdvCi1hcmd1bWVudHMsIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBAa2Jkez19IGNoYXJhY3RlciwgYW5kIHRoZSB2YWx1ZSBvZgotQGNvZGV7aW5wdXRfbGluZV9wb2ludGVyfSBhdCB0aGF0IHBvaW50LiAgR0FTIHVzZXMgdGhpcyBtYWNybyB0byBkZWNpZGUgaWYgYQotQGtiZHs9fSBpcyBhbiBhc3NpZ25tZW50IG9yIGFuIGluc3RydWN0aW9uLgotCi1AaXRlbSBUQ19FT0xfSU5fSU5TTgotQGNpbmRleCBUQ19FT0xfSU5fSU5TTgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBzaG91bGQgcmV0dXJuIG5vbnplcm8gaWYgdGhlIGN1cnJlbnQgaW5wdXQgbGluZQotcG9pbnRlciBzaG91bGQgYmUgdHJlYXRlZCBhcyB0aGUgZW5kIG9mIGEgbGluZS4KLQotQGl0ZW0gbWRfcGFyc2VfbmFtZQotQGNpbmRleCBtZF9wYXJzZV9uYW1lCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIEdBUyB3aWxsIGNhbGwgaXQgZm9yIGFueSBzeW1ib2wgZm91bmQgaW4gYW4KLWV4cHJlc3Npb24uICBZb3UgY2FuIGRlZmluZSB0aGlzIHRvIGhhbmRsZSBzcGVjaWFsIHN5bWJvbHMgaW4gYSBzcGVjaWFsIHdheS4KLUlmIGEgc3ltYm9sIGFsd2F5cyBoYXMgYSBjZXJ0YWluIHZhbHVlLCB5b3Ugc2hvdWxkIG5vcm1hbGx5IGVudGVyIGl0IGluIHRoZQotc3ltYm9sIHRhYmxlLCBwZXJoYXBzIHVzaW5nIEBjb2Rle3JlZ19zZWN0aW9ufS4KLQotQGl0ZW0gbWRfdW5kZWZpbmVkX3N5bWJvbAotQGNpbmRleCBtZF91bmRlZmluZWRfc3ltYm9sCi1HQVMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBhIHN5bWJvbCB0YWJsZSBsb29rdXAgZmFpbHMsIGJlZm9yZSBpdAotY3JlYXRlcyBhIG5ldyBzeW1ib2wuICBUeXBpY2FsbHkgdGhpcyB3b3VsZCBiZSB1c2VkIHRvIHN1cHBseSBzeW1ib2xzIHdob3NlCi1uYW1lIG9yIHZhbHVlIGNoYW5nZXMgZHluYW1pY2FsbHksIHBvc3NpYmx5IGluIGEgY29udGV4dCBzZW5zaXRpdmUgd2F5LgotUHJlZGVmaW5lZCBzeW1ib2xzIHdpdGggZml4ZWQgdmFsdWVzLCBzdWNoIGFzIHJlZ2lzdGVyIG5hbWVzIG9yIGNvbmRpdGlvbgotY29kZXMsIGFyZSB0eXBpY2FsbHkgZW50ZXJlZCBkaXJlY3RseSBpbnRvIHRoZSBzeW1ib2wgdGFibGUgd2hlbiBAY29kZXttZF9iZWdpbn0KLWlzIGNhbGxlZC4gIE9uZSBhcmd1bWVudCBpcyBwYXNzZWQsIGEgQGNvZGV7Y2hhciAqfSBmb3IgdGhlIHN5bWJvbC4KLQotQGl0ZW0gbWRfb3BlcmFuZAotQGNpbmRleCBtZF9vcGVyYW5kCi1HQVMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBvbmUgYXJndW1lbnQsIGFuIEBjb2Rle2V4cHJlc3Npb25TfQotcG9pbnRlciwgZm9yIGFueSBleHByZXNzaW9uIHRoYXQgY2FuIG5vdCBiZSByZWNvZ25pemVkLiAgV2hlbiB0aGUgZnVuY3Rpb24KLWlzIGNhbGxlZCwgQGNvZGV7aW5wdXRfbGluZV9wb2ludGVyfSB3aWxsIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUKLWV4cHJlc3Npb24uCi0KLUBpdGVtIHRjX3VucmVjb2duaXplZF9saW5lCi1AY2luZGV4IHRjX3VucmVjb2duaXplZF9saW5lCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgd2hlbiBpdCBmaW5kcyBhIGxpbmUgdGhhdCBpdCBjYW4gbm90Ci1wYXJzZS4KLQotQGl0ZW0gbWRfZG9fYWxpZ24KLUBjaW5kZXggbWRfZG9fYWxpZ24KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaGFuZGxlIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuICBHQVMgd2lsbCBjYWxsIGl0Ci13aGVuIHRoZSBkaXJlY3RpdmUgaXMgc2VlbiBpbiB0aGUgaW5wdXQgZmlsZS4gIEZvciBleGFtcGxlLCB0aGUgaTM4NiBiYWNrZW5kCi11c2VzIHRoaXMgdG8gZ2VuZXJhdGUgZWZmaWNpZW50IG5vcCBpbnN0cnVjdGlvbnMgb2YgdmFyeWluZyBsZW5ndGhzLCBkZXBlbmRpbmcKLXVwb24gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBhbGlnbm1lbnQgd2lsbCBza2lwLgotCi1AaXRlbSBIQU5ETEVfQUxJR04KLUBjaW5kZXggSEFORExFX0FMSUdOCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGRvIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuCi1HQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LgotCi1AaXRlbSBUQ19JTVBMSUNJVF9MQ09NTV9BTElHTk1FTlQgKEB2YXJ7c2l6ZX0sIEB2YXJ7cDJ2YXJ9KQotQGNpbmRleCBUQ19JTVBMSUNJVF9MQ09NTV9BTElHTk1FTlQKLUFuIEBjb2Rley5sY29tbX0gZGlyZWN0aXZlIHdpdGggbm8gZXhwbGljaXQgYWxpZ25tZW50IHBhcmFtZXRlciB3aWxsIHVzZSB0aGlzCi1tYWNybyB0byBzZXQgQHZhcntwMnZhcn0gdG8gdGhlIGFsaWdubWVudCB0aGF0IGEgcmVxdWVzdCBmb3IgQHZhcntzaXplfSBieXRlcwotd2lsbCBoYXZlLiAgVGhlIGFsaWdubWVudCBpcyBleHByZXNzZWQgYXMgYSBwb3dlciBvZiB0d28uICBJZiBubyBhbGlnbm1lbnQKLXNob3VsZCB0YWtlIHBsYWNlLCB0aGUgbWFjcm8gZGVmaW5pdGlvbiBzaG91bGQgZG8gbm90aGluZy4gIFNvbWUgdGFyZ2V0cyBkZWZpbmUKLWEgQGNvZGV7LmJzc30gZGlyZWN0aXZlIHRoYXQgaXMgYWxzbyBhZmZlY3RlZCBieSB0aGlzIG1hY3JvLiAgVGhlIGRlZmF1bHQKLWRlZmluaXRpb24gd2lsbCBzZXQgQHZhcntwMnZhcn0gdG8gdGhlIHRydW5jYXRlZCBwb3dlciBvZiB0d28gb2Ygc2l6ZXMgdXAgdG8KLWVpZ2h0IGJ5dGVzLgotCi1AaXRlbSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotQGNpbmRleCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGVhY2ggdGltZSBpdCBza2lwcyBhbnkgc3BhY2UgYmVjYXVzZSBvZiBhCi1zcGFjZSBmaWxsaW5nIG9yIGFsaWdubWVudCBvciBkYXRhIGFsbG9jYXRpb24gcHNldWRvLW9wLgotCi1AaXRlbSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KLUBjaW5kZXggVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24gdXNlZCBpbiBhIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wIHN1Y2ggYXMgQGNvZGV7LndvcmR9LiAgWW91IGNhbiB1c2UgdGhpcyB0byByZWNvZ25pemUgcmVsb2NhdGlvbgotZGlyZWN0aXZlcyB0aGF0IG1heSBhcHBlYXIgaW4gc3VjaCBkaXJlY3RpdmVzLgotCi1AaXRlbSBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT04KLUBjaW5kZXggQklURklFTERfQ09OU19FWFBSRVNTSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHJlY29nbml6ZSBiaXRmaWVsZCBpbnN0cnVjdGlvbnMgaW4gZGF0YQotYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLCBhcyB1c2VkIG9uIHRoZSBpOTYwLgotCi1AaXRlbSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OCi1AY2luZGV4IFJFUEVBVF9DT05TX0VYUFJFU1NJT04KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgcmVjb2duaXplIHJlcGVhdCBjb3VudHMgaW4gZGF0YSBhbGxvY2F0aW9uCi1wc2V1ZG8tb3BzLCBhcyB1c2VkIG9uIHRoZSBNSVBTLgotCi1AaXRlbSBtZF9jb25zX2FsaWduCi1AY2luZGV4IG1kX2NvbnNfYWxpZ24KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gZG8gYW55IHNwZWNpYWwgYWxpZ25tZW50IGJlZm9yZSBhIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wLgotCi1AaXRlbSBUQ19DT05TX0ZJWF9ORVcKLUBjaW5kZXggVENfQ09OU19GSVhfTkVXCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIGEgZGF0YSBhbGxvY2F0aW9uIHBzZXVkby1vcC4KLQotQGl0ZW0gVENfSU5JVF9GSVhfREFUQSAoQHZhcntmaXhwfSkKLUBjaW5kZXggVENfSU5JVF9GSVhfREFUQQotQSBDIHN0YXRlbWVudCB0byBpbml0aWFsaXplIHRoZSB0YXJnZXQgc3BlY2lmaWMgZmllbGRzIG9mIGZpeHVwIEB2YXJ7Zml4cH0uCi1UaGVzZSBmaWVsZHMgYXJlIGRlZmluZWQgd2l0aCB0aGUgQGNvZGV7VENfRklYX1RZUEV9IG1hY3JvLgotCi1AaXRlbSBUQ19GSVhfREFUQV9QUklOVCAoQHZhcntzdHJlYW19LCBAdmFye2ZpeHB9KQotQGNpbmRleCBUQ19GSVhfREFUQV9QUklOVAotQSBDIHN0YXRlbWVudCB0byBvdXRwdXQgdGFyZ2V0IHNwZWNpZmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IKLWZpeHVwIEB2YXJ7Zml4cH0gdG8gQHZhcntzdHJlYW19LiAgVGhpcyBtYWNybyBpcyBjYWxsZWQgYnkgQGNvZGV7cHJpbnRfZml4dXB9LgotCi1AaXRlbSBUQ19GUkFHX0lOSVQgKEB2YXJ7ZnJhZ3B9KQotQGNpbmRleCBUQ19GUkFHX0lOSVQKLUEgQyBzdGF0ZW1lbnQgdG8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IHNwZWNpZmljIGZpZWxkcyBvZiBmcmFnIEB2YXJ7ZnJhZ3B9LgotVGhlc2UgZmllbGRzIGFyZSBkZWZpbmVkIHdpdGggdGhlIEBjb2Rle1RDX0ZSQUdfVFlQRX0gbWFjcm8uCi0KLUBpdGVtIG1kX251bWJlcl90b19jaGFycwotQGNpbmRleCBtZF9udW1iZXJfdG9fY2hhcnMKLVRoaXMgc2hvdWxkIGp1c3QgY2FsbCBlaXRoZXIgQGNvZGV7bnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbn0gb3IKLUBjb2Rle251bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW59LCB3aGljaGV2ZXIgaXMgYXBwcm9wcmlhdGUuICBPbiB0YXJnZXRzIGxpa2UKLXRoZSBNSVBTIHdoaWNoIHN1cHBvcnQgb3B0aW9ucyB0byBjaGFuZ2UgdGhlIGVuZGlhbm5lc3MsIHdoaWNoIGZ1bmN0aW9uIHRvIGNhbGwKLWlzIGEgcnVudGltZSBkZWNpc2lvbi4gIE9uIG90aGVyIHRhcmdldHMsIEBjb2Rle21kX251bWJlcl90b19jaGFyc30gY2FuIGJlIGEKLXNpbXBsZSBtYWNyby4KLQotQGl0ZW0gbWRfcmVsb2Nfc2l6ZQotQGNpbmRleCBtZF9yZWxvY19zaXplCi1UaGlzIHZhcmlhYmxlIGlzIG9ubHkgdXNlZCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiBnYXMgKG5vdAotQGNvZGV7QkZEX0FTU0VNQkxFUn0gYW5kIG5vdCBAY29kZXtNQU5ZX1NFR01FTlRTfSkuICBJdCBob2xkcyB0aGUgc2l6ZSBvZiBhCi1yZWxvY2F0aW9uIGVudHJ5LgotCi1AaXRlbSBXT1JLSU5HX0RPVF9XT1JECi1AaXRlbXggbWRfc2hvcnRfanVtcF9zaXplCi1AaXRlbXggbWRfbG9uZ19qdW1wX3NpemUKLUBpdGVteCBtZF9jcmVhdGVfc2hvcnRfanVtcAotQGl0ZW14IG1kX2NyZWF0ZV9sb25nX2p1bXAKLUBjaW5kZXggV09SS0lOR19ET1RfV09SRAotQGNpbmRleCBtZF9zaG9ydF9qdW1wX3NpemUKLUBjaW5kZXggbWRfbG9uZ19qdW1wX3NpemUKLUBjaW5kZXggbWRfY3JlYXRlX3Nob3J0X2p1bXAKLUBjaW5kZXggbWRfY3JlYXRlX2xvbmdfanVtcAotSWYgQGNvZGV7V09SS0lOR19ET1RfV09SRH0gaXMgZGVmaW5lZCwgR0FTIHdpbGwgbm90IGRvIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcKLShAcHhyZWZ7QnJva2VuIHdvcmRzfSkuICBPdGhlcndpc2UsIHlvdSBzaG91bGQgc2V0IEBjb2Rle21kX3Nob3J0X2p1bXBfc2l6ZX0gdG8KLXRoZSBzaXplIG9mIGEgc2hvcnQganVtcCAoYSBqdW1wIHRoYXQgaXMganVzdCBsb25nIGVub3VnaCB0byBqdW1wIGFyb3VuZCBhCi1udW1iZXIgb2YgbG9uZyBqdW1wcykgYW5kIEBjb2Rle21kX2xvbmdfanVtcF9zaXplfSB0byB0aGUgc2l6ZSBvZiBhIGxvbmcganVtcAotKGEganVtcCB0aGF0IGNhbiBnbyBhbnl3aGVyZSBpbiB0aGUgZnVuY3Rpb24pLiAgWW91IHNob3VsZCBkZWZpbmUKLUBjb2Rle21kX2NyZWF0ZV9zaG9ydF9qdW1wfSB0byBjcmVhdGUgYSBzaG9ydCBqdW1wIGFyb3VuZCBhIG51bWJlciBvZiBsb25nCi1qdW1wcywgYW5kIGRlZmluZSBAY29kZXttZF9jcmVhdGVfbG9uZ19qdW1wfSB0byBjcmVhdGUgYSBsb25nIGp1bXAuCi0KLUBpdGVtIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4Ci1AY2luZGV4IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIHNpemUgb2YgYSBAY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0KLWZyYWcgYmVmb3JlIGFueSByZWxheGluZyBpcyBkb25lLiAgSXQgbWF5IGFsc28gY3JlYXRlIGFueSBuZWNlc3NhcnkKLXJlbG9jYXRpb25zLgotCi1AaXRlbSBtZF9yZWxheF9mcmFnCi1AY2luZGV4IG1kX3JlbGF4X2ZyYWcKLVRoaXMgbWFjcm8gbWF5IGJlIGRlZmluZWQgdG8gcmVsYXggYSBmcmFnLiAgR0FTIHdpbGwgY2FsbCB0aGlzIHdpdGggdGhlIGZyYWcKLWFuZCB0aGUgY2hhbmdlIGluIHNpemUgb2YgYWxsIHByZXZpb3VzIGZyYWdzOyBAY29kZXttZF9yZWxheF9mcmFnfSBzaG91bGQKLXJldHVybiB0aGUgY2hhbmdlIGluIHNpemUgb2YgdGhlIGZyYWcuICBAeHJlZntSZWxheGF0aW9ufS4KLQotQGl0ZW0gVENfR0VORVJJQ19SRUxBWF9UQUJMRQotQGNpbmRleCBUQ19HRU5FUklDX1JFTEFYX1RBQkxFCi1JZiB5b3UgZG8gbm90IGRlZmluZSBAY29kZXttZF9yZWxheF9mcmFnfSwgeW91IG1heSBkZWZpbmUKLUBjb2Rle1RDX0dFTkVSSUNfUkVMQVhfVEFCTEV9IGFzIGEgdGFibGUgb2YgQGNvZGV7cmVsYXhfdHlwZVN9IHN0cnVjdHVyZXMuICBUaGUKLW1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBrbm93cyBob3cgdG8gdXNlIHN1Y2ggYSB0YWJsZSB0byByZWxheCBQQyByZWxhdGl2ZQotcmVmZXJlbmNlcy4gIFNlZSBAZmlsZXt0Yy1tNjhrLmN9IGZvciBhbiBleGFtcGxlLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCi0KLUBpdGVtIG1kX3ByZXBhcmVfcmVsYXhfc2NhbgotQGNpbmRleCBtZF9wcmVwYXJlX3JlbGF4X3NjYW4KLUlmIGRlZmluZWQsIGl0IGlzIGEgQyBzdGF0ZW1lbnQgdGhhdCBpcyBpbnZva2VkIHByaW9yIHRvIHNjYW5uaW5nCi10aGUgcmVsYXggdGFibGUuCi0KLUBpdGVtIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLUBjaW5kZXggTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSBAc2FtcHtsaW5rcmVsYXh9IGlzIHNldAotKGJlY2F1c2Ugb2YgYSBjb21tYW5kIGxpbmUgb3B0aW9uLCBvciB1bmNvbmRpdGlvbmFsbHkgaW4gQGNvZGV7bWRfYmVnaW59KSwgYQotQHNhbXB7LmFsaWdufSBkaXJlY3RpdmUgd2lsbCBjYXVzZSBleHRyYSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQuICBUaGUgbGlua2VyIGNhbgotdGhlbiBkaXNjYXJkIHRoaXMgc3BhY2Ugd2hlbiByZWxheGluZyB0aGUgc2VjdGlvbi4KLQotQGl0ZW0gbWRfY29udmVydF9mcmFnCi1AY2luZGV4IG1kX2NvbnZlcnRfZnJhZwotR0FTIHdpbGwgY2FsbCB0aGlzIGZvciBlYWNoIHJzX21hY2hpbmVfZGVwZW5kZW50IGZyYWdtZW50LgotVGhlIGluc3RydWN0aW9uIGlzIGNvbXBsZXRlZCB1c2luZyB0aGUgZGF0YSBmcm9tIHRoZSByZWxheGF0aW9uIHBhc3MuCi1JdCBtYXkgYWxzbyBjcmVhdGUgYW55IG5lY2Vzc2FyeSByZWxvY2F0aW9ucy4KLUB4cmVme1JlbGF4YXRpb259LgotCi1AaXRlbSBtZF9hcHBseV9maXgKLUBjaW5kZXggbWRfYXBwbHlfZml4Ci1HQVMgd2lsbCBjYWxsIHRoaXMgZm9yIGVhY2ggZml4dXAuICBJdCBzaG91bGQgc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgaW4gdGhlCi1vYmplY3QgZmlsZS4gIEBjb2Rle2ZpeHVwX3NlZ21lbnR9IHBlcmZvcm1zIGEgZ2VuZXJpYyBvdmVyZmxvdyBjaGVjayBvbiB0aGUKLUBjb2Rle3ZhbHVlVCAqdmFsfSBhcmd1bWVudCBhZnRlciBAY29kZXttZF9hcHBseV9maXh9IHJldHVybnMuICBJZiB0aGUgb3ZlcmZsb3cKLWNoZWNrIGlzIHJlbGV2YW50IGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUsIHRoZW4gQGNvZGV7bWRfYXBwbHlfZml4fSBzaG91bGQKLW1vZGlmeSBAY29kZXt2YWx1ZVQgKnZhbH0sIHR5cGljYWxseSB0byB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBvYmplY3QgZmlsZS4KLQotQGl0ZW0gVENfSEFORExFU19GWF9ET05FCi1AY2luZGV4IFRDX0hBTkRMRVNfRlhfRE9ORQotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBpdCBtZWFucyB0aGF0IEBjb2Rle21kX2FwcGx5X2ZpeH0gY29ycmVjdGx5IHNldHMgdGhlCi1AY29kZXtmeF9kb25lfSBmaWVsZCBpbiB0aGUgZml4dXAuCi0KLUBpdGVtIHRjX2dlbl9yZWxvYwotQGNpbmRleCB0Y19nZW5fcmVsb2MKLUEgQGNvZGV7QkZEX0FTU0VNQkxFUn0gR0FTIHdpbGwgY2FsbCB0aGlzIHRvIGdlbmVyYXRlIGEgcmVsb2MuICBHQVMgd2lsbCBwYXNzCi10aGUgcmVzdWx0aW5nIHJlbG9jIHRvIEBjb2Rle2JmZF9pbnN0YWxsX3JlbG9jYXRpb259LiAgVGhpcyBjdXJyZW50bHkgd29ya3MKLXBvb3JseSwgYXMgQGNvZGV7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0gb2Z0ZW4gZG9lcyB0aGUgd3JvbmcgdGhpbmcsIGFuZAotaW5zdGFuY2VzIG9mIEBjb2Rle3RjX2dlbl9yZWxvY30gaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW1zLAotd2hpY2ggaW4gdHVybnMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGZpeCBAY29kZXtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufS4KLQotQGl0ZW0gUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi1AY2luZGV4IFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBtZWFucyB0aGF0IEBjb2Rle3RjX2dlbl9yZWxvY30gbWF5IHJldHVybiBtdWx0aXBsZQotcmVsb2NhdGlvbiBlbnRyaWVzIGZvciBhIHNpbmdsZSBmaXh1cC4gIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiB2YWx1ZSBvZgotQGNvZGV7dGNfZ2VuX3JlbG9jfSBpcyBhIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgYXJyYXkuCi0KLUBpdGVtIE1BWF9SRUxPQ19FWFBBTlNJT04KLUBjaW5kZXggTUFYX1JFTE9DX0VYUEFOU0lPTgotWW91IG11c3QgZGVmaW5lIHRoaXMgaWYgQGNvZGV7UkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFfSBpcyBkZWZpbmVkOyBpdAotaW5kaWNhdGVzIHRoZSBsYXJnZXN0IG51bWJlciBvZiByZWxvY3Mgd2hpY2ggQGNvZGV7dGNfZ2VuX3JlbG9jfSBtYXkgcmV0dXJuIGZvcgotYSBzaW5nbGUgZml4dXAuCi0KLUBpdGVtIHRjX2ZpeF9hZGp1c3RhYmxlCi1AY2luZGV4IHRjX2ZpeF9hZGp1c3RhYmxlCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHdoZXRoZXIgYSBmaXh1cCBhZ2FpbnN0IGEgbG9jYWxseSBkZWZpbmVkCi1zeW1ib2wgc2hvdWxkIGJlIGFkanVzdGVkIHRvIGJlIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLiAgSXQgc2hvdWxkIHJldHVybiBhCi1ub24temVybyB2YWx1ZSBpZiB0aGUgYWRqdXN0bWVudCBpcyBhY2NlcHRhYmxlLgotCi1AaXRlbSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04KLUBjaW5kZXggTURfUENSRUxfRlJPTV9TRUNUSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGEKLVBDIHJlbGF0aXZlIGZpeHVwIGFuZCB0aGUgcG9zaXRpb24gZnJvbSB3aGljaCB0aGUgUEMgcmVsYXRpdmUgYWRqdXN0bWVudCBzaG91bGQKLWJlIG1hZGUuICBPbiBtYW55IHByb2Nlc3NvcnMsIHRoZSBiYXNlIG9mIGEgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gaXMgdGhlIG5leHQKLWluc3RydWN0aW9uLCBzbyB0aGlzIG1hY3JvIHdvdWxkIHJldHVybiB0aGUgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLgotCi1AaXRlbSBtZF9wY3JlbF9mcm9tCi1AY2luZGV4IG1kX3BjcmVsX2Zyb20KLVRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7TURfUENSRUxfRlJPTV9TRUNUSU9OfS4gIFRoZSBkaWZmZXJlbmNlIGlzCi10aGF0IEBjb2Rle21kX3BjcmVsX2Zyb219IGRvZXMgbm90IHRha2UgYSBzZWN0aW9uIGFyZ3VtZW50LgotCi1AaXRlbSB0Y19mcm9iX2xhYmVsCi1AY2luZGV4IHRjX2Zyb2JfbGFiZWwKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBlYWNoIHRpbWUgYSBsYWJlbCBpcyBkZWZpbmVkLgotCi1AaXRlbSBtZF9zZWN0aW9uX2FsaWduCi1AY2luZGV4IG1kX3NlY3Rpb25fYWxpZ24KLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LCB0bwotcGVybWl0IHRoZSBDUFUgYmFja2VuZCB0byBhZGp1c3QgdGhlIGFsaWdubWVudCBvZiBhIHNlY3Rpb24uICBUaGUgZnVuY3Rpb24KLW11c3QgdGFrZSB0d28gYXJndW1lbnRzLCBhIEBjb2Rle3NlZ1R9IGZvciB0aGUgc2VjdGlvbiBhbmQgYSBAY29kZXt2YWx1ZVR9Ci1mb3IgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24sIGFuZCByZXR1cm4gYSBAY29kZXt2YWx1ZVR9IGZvciB0aGUgcm91bmRlZAotc2l6ZS4KLQotQGl0ZW0gbWRfbWFjcm9fc3RhcnQKLUBjaW5kZXggbWRfbWFjcm9fc3RhcnQKLUlmIGRlZmluZWQsIEdBUyB3aWxsIGNhbGwgdGhpcyBtYWNybyB3aGVuIGl0IHN0YXJ0cyB0byBpbmNsdWRlIGEgbWFjcm8KLWV4cGFuc2lvbi4gIEBjb2Rle21hY3JvX25lc3R9IGluZGljYXRlcyB0aGUgY3VycmVudCBtYWNybyBuZXN0aW5nIGxldmVsLCB3aGljaAotaW5jbHVkZXMgdGhlIG9uZSBiZWluZyBleHBhbmRlZC4gCi0KLUBpdGVtIG1kX21hY3JvX2luZm8KLUBjaW5kZXggbWRfbWFjcm9faW5mbwotSWYgZGVmaW5lZCwgR0FTIHdpbGwgY2FsbCB0aGlzIG1hY3JvIGFmdGVyIHRoZSBtYWNybyBleHBhbnNpb24gaGFzIGJlZW4KLWluY2x1ZGVkIGluIHRoZSBpbnB1dCBhbmQgYWZ0ZXIgcGFyc2luZyB0aGUgbWFjcm8gYXJndW1lbnRzLiAgVGhlIHNpbmdsZQotYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHRoZSBtYWNybyBwcm9jZXNzaW5nJ3MgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlCi1tYWNybyAobWFjcm9fZW50cnkgKiksIHdoaWNoIGluY2x1ZGVzIGV4cGFuc2lvbiBvZiB0aGUgZm9ybWFsIGFyZ3VtZW50cy4KLQotQGl0ZW0gbWRfbWFjcm9fZW5kCi1AY2luZGV4IG1kX21hY3JvX2VuZAotQ29tcGxlbWVudCB0byBtZF9tYWNyb19zdGFydC4gIElmIGRlZmluZWQsIGl0IGlzIGNhbGxlZCB3aGVuIGZpbmlzaGVkCi1wcm9jZXNzaW5nIGFuIGluc2VydGVkIG1hY3JvIGV4cGFuc2lvbiwganVzdCBiZWZvcmUgZGVjcmVtZW50aW5nIG1hY3JvX25lc3QuIAotCi1AaXRlbSBET1VCTEVCQVJfUEFSQUxMRUwKLUBjaW5kZXggRE9VQkxFQkFSX1BBUkFMTEVMCi1BZmZlY3RzIHRoZSBwcmVwcm9jZXNzb3Igc28gdGhhdCBsaW5lcyBjb250YWluaW5nICd8fCcgZG9uJ3QgaGF2ZSB0aGVpcgotd2hpdGVzcGFjZSBzdHJpcHBlZCBmb2xsb3dpbmcgdGhlIGRvdWJsZSBiYXIuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdGFyZ2V0cyB0aGF0Ci1pbXBsZW1lbnQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zLgotCi1AaXRlbSBLRUVQX1dISVRFX0FST1VORF9DT0xPTgotQGNpbmRleCBLRUVQX1dISVRFX0FST1VORF9DT0xPTgotTm9ybWFsbHksIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBhbmQgcmVtb3ZlZCB3aGVuLCBpbiB0aGUgcHJlc2VuY2Ugb2YgdGhlCi1jb2xvbiwgdGhlIGFkam9pbmluZyB0b2tlbnMgY2FuIGJlIGRpc3Rpbmd1aXNoZWQuICBUaGlzIG9wdGlvbiBhZmZlY3RzIHRoZQotcHJlcHJvY2Vzc29yIHNvIHRoYXQgd2hpdGVzcGFjZSBhcm91bmQgY29sb25zIGlzIHByZXNlcnZlZC4gIFRoaXMgaXMgdXNlZnVsCi13aGVuIGNvbG9ucyBtaWdodCBiZSByZW1vdmVkIGZyb20gdGhlIGlucHV0IGFmdGVyIHByZXByb2Nlc3NpbmcgYnV0IGJlZm9yZQotYXNzZW1ibGluZywgc28gdGhhdCBhZGpvaW5pbmcgdG9rZW5zIGNhbiBzdGlsbCBiZSBkaXN0aW5ndWlzaGVkIGlmIHRoZXJlIGlzCi13aGl0ZXNwYWNlLCBvciBjb25jYXRlbnRhdGVkIGlmIHRoZXJlIGlzIG5vdC4KLQotQGl0ZW0gdGNfZnJvYl9zZWN0aW9uCi1AY2luZGV4IHRjX2Zyb2Jfc2VjdGlvbgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBhIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IEdBUyB3aWxsIGNhbGwgaXQgZm9yIGVhY2gKLXNlY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkuCi0KLUBpdGVtIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci1AY2luZGV4IHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB2YWx1ZXMgYXJlCi1yZXNvbHZlZCwgYnV0IGJlZm9yZSB0aGUgZml4dXBzIGhhdmUgYmVlbiBjaGFuZ2VkIGZyb20gbG9jYWwgc3ltYm9scyB0byBzZWN0aW9uCi1zeW1ib2xzLgotCi1AaXRlbSB0Y19mcm9iX3N5bWJvbAotQGNpbmRleCB0Y19mcm9iX3N5bWJvbAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoIHN5bWJvbC4gIFlvdSBjYW4gaW5kaWNhdGUKLXRoYXQgdGhlIHN5bWJvbCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvYmplY3QgZmlsZSBieSBkZWZpbmluaW5nIHRoaXMKLW1hY3JvIHRvIHNldCBpdHMgc2Vjb25kIGFyZ3VtZW50IHRvIGEgbm9uLXplcm8gdmFsdWUuCi0KLUBpdGVtIHRjX2Zyb2JfZmlsZQotQGNpbmRleCB0Y19mcm9iX2ZpbGUKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuCi1jb21wbGV0ZWQsIGJ1dCBiZWZvcmUgdGhlIHJlbG9jYXRpb25zIGhhdmUgYmVlbiBnZW5lcmF0ZWQuCi0KLUBpdGVtIHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgcmVsb2NzIGhhdmUgYmVlbgotZ2VuZXJhdGVkLgotCi1AaXRlbSBMSVNUSU5HX0hFQURFUgotQSBzdHJpbmcgdG8gdXNlIG9uIHRoZSBoZWFkZXIgbGluZSBvZiBhIGxpc3RpbmcuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBzaW1wbHkKLUBjb2RleyJHQVMgTElTVElORyJ9LgotCi1AaXRlbSBMSVNUSU5HX1dPUkRfU0laRQotVGhlIG51bWJlciBvZiBieXRlcyB0byBwdXQgaW50byBhIHdvcmQgaW4gYSBsaXN0aW5nLiAgVGhpcyBhZmZlY3RzIHRoZSB3YXkgdGhlCi1ieXRlcyBhcmUgY2x1bXBlZCB0b2dldGhlciBpbiB0aGUgbGlzdGluZy4gIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDIgbWlnaHQKLXByaW50IEBzYW1wezEyMzQgNTY3OH0gd2hlcmUgYSB2YWx1ZSBvZiAxIHdvdWxkIHByaW50IEBzYW1wezEyIDM0IDU2IDc4fS4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpcyA0LgotCi1AaXRlbSBMSVNUSU5HX0xIU19XSURUSAotVGhlIG51bWJlciBvZiB3b3JkcyBvZiBkYXRhIHRvIHByaW50IG9uIHRoZSBmaXJzdCBsaW5lIG9mIGEgbGlzdGluZyBmb3IgYQotcGFydGljdWxhciBzb3VyY2UgbGluZSwgd2hlcmUgZWFjaCB3b3JkIGlzIEBjb2Rle0xJU1RJTkdfV09SRF9TSVpFfSBieXRlcy4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpcyAxLgotCi1AaXRlbSBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQKLUxpa2UgQGNvZGV7TElTVElOR19MSFNfV0lEVEh9LCBidXQgYXBwbHlpbmcgdG8gdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBsaW5lCi1vZiB0aGUgZGF0YSBwcmludGVkIGZvciBhIHBhcnRpY3VsYXIgc291cmNlIGxpbmUuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLgotCi1AaXRlbSBMSVNUSU5HX0xIU19DT05UX0xJTkVTCi1UaGUgbWF4aW11bSBudW1iZXIgb2YgY29udGludWF0aW9uIGxpbmVzIHRvIHByaW50IGluIGEgbGlzdGluZyBmb3IgYSBwYXJ0aWN1bGFyCi1zb3VyY2UgbGluZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuCi0KLUBpdGVtIExJU1RJTkdfUkhTX1dJRFRICi1UaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBwcmludCBmcm9tIG9uZSBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIDEwMC4KLUBlbmQgdGFibGUKLQotQG5vZGUgT2JqZWN0IGZvcm1hdCBiYWNrZW5kCi1Ac3Vic2VjdGlvbiBXcml0aW5nIGFuIG9iamVjdCBmb3JtYXQgYmFja2VuZAotQGNpbmRleCBvYmplY3QgZm9ybWF0IGJhY2tlbmQKLUBjaW5kZXggQGZpbGV7b2JqLUB2YXJ7Zm10fX0KLQotQXMgd2l0aCB0aGUgQ1BVIGJhY2tlbmQsIHRoZSBvYmplY3QgZm9ybWF0IGJhY2tlbmQgbXVzdCBkZWZpbmUgYSBmZXcgdGhpbmdzLAotYW5kIG1heSBkZWZpbmUgc29tZSBvdGhlciB0aGluZ3MuICBUaGUgaW50ZXJmYWNlIHRvIHRoZSBvYmplY3QgZm9ybWF0IGJhY2tlbmQKLWlzIGdlbmVyYWxseSBzaW1wbGVyOyBtb3N0IG9mIHRoZSBzdXBwb3J0IGZvciBhbiBvYmplY3QgZmlsZSBmb3JtYXQgY29uc2lzdHMgb2YKLWRlZmluaW5nIGEgbnVtYmVyIG9mIHBzZXVkby1vcHMuCi0KLVRoZSBvYmplY3QgZm9ybWF0IEBmaWxley5ofSBmaWxlIG11c3QgaW5jbHVkZSBAZmlsZXt0YXJnLWNwdS5ofS4KLQotVGhpcyBzZWN0aW9uIHdpbGwgb25seSBkZWZpbmUgdGhlIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IHZlcnNpb24gb2YgR0FTLiAgSXQgaXMKLWltcG9zc2libGUgdG8gc3VwcG9ydCBhIG5ldyBvYmplY3QgZmlsZSBmb3JtYXQgdXNpbmcgYW55IG90aGVyIHZlcnNpb24gYW55aG93LAotYXMgdGhlIG9yaWdpbmFsIEdBUyB2ZXJzaW9uIG9ubHkgc3VwcG9ydHMgYS5vdXQsIGFuZCB0aGUgQGNvZGV7TUFOWV9TRUdNRU5UU30KLUdBUyB2ZXJzaW9uIG9ubHkgc3VwcG9ydHMgQ09GRi4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBPQkpfQHZhcntmb3JtYXR9Ci1AY2luZGV4IE9CSl9AdmFye2Zvcm1hdH0KLUJ5IGNvbnZlbnRpb24sIHlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gaW4gdGhlIEBmaWxley5ofSBmaWxlLiAgRm9yCi1leGFtcGxlLCBAZmlsZXtvYmotZWxmLmh9IGRlZmluZXMgQGNvZGV7T0JKX0VMRn0uICBZb3UgbWlnaHQgaGF2ZSB0byB1c2UgdGhpcwotaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFkZCBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWMgY29kZSB0byB0aGUgQ1BVIGZpbGUuCi0KLUBpdGVtIG9ial9iZWdpbgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBzdGFydCBvZiB0aGUgYXNzZW1ibHksIGFmdGVyCi10aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIGFuZCBhbGwgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQKLWluaXRpYWxpemF0aW9ucyBoYXZlIGJlZW4gY29tcGxldGVkLgotCi1AaXRlbSBvYmpfYXBwX2ZpbGUKLUBjaW5kZXggb2JqX2FwcF9maWxlCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGludm9rZSBpdCB3aGVuIGl0IHNlZXMgYSBAY29kZXsuZmlsZX0KLXBzZXVkby1vcCBvciBhIEBzYW1weyN9IGxpbmUgYXMgdXNlZCBieSB0aGUgQyBwcmVwcm9jZXNzb3IuCi0KLUBpdGVtIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTCi1AY2luZGV4IE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTCi1Zb3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIHRvIGNvcHkgb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tCi1vbmUgc3ltYm9sIHRvIGFub3RoZXIuICBHQVMgd2lsbCBjYWxsIGl0IHdoZW4gb25lIHN5bWJvbCBpcyBlcXVhdGVkIHRvCi1hbm90aGVyLgotCi1AaXRlbSBvYmpfZml4X2FkanVzdGFibGUKLUBjaW5kZXggb2JqX2ZpeF9hZGp1c3RhYmxlCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHdoZXRoZXIgYSBmaXh1cCBhZ2FpbnN0IGEgbG9jYWxseSBkZWZpbmVkCi1zeW1ib2wgc2hvdWxkIGJlIGFkanVzdGVkIHRvIGJlIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLiAgSXQgc2hvdWxkIHJldHVybiBhCi1ub24temVybyB2YWx1ZSBpZiB0aGUgYWRqdXN0bWVudCBpcyBhY2NlcHRhYmxlLgotCi1AaXRlbSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLUBjaW5kZXggb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgT0sgdG8gdXNlIGEgc2VjdGlvbiBzeW1ib2wgaW4KLWEgcmVsb2NhdGVpb24gZW50cnkuICBJZiBpdCBpcyBub3QsIEdBUyB3aWxsIGRlZmluZSBhIG5ldyBzeW1ib2wgYXQgdGhlIHN0YXJ0Ci1vZiBhIHNlY3Rpb24uCi0KLUBpdGVtIEVNSVRfU0VDVElPTl9TWU1CT0xTCi1AY2luZGV4IEVNSVRfU0VDVElPTl9TWU1CT0xTCi1Zb3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIHdpdGggYSB6ZXJvIHZhbHVlIGlmIHlvdSBkbyBub3Qgd2FudCB0byBpbmNsdWRlCi1zZWN0aW9uIHN5bWJvbHMgaW4gdGhlIG91dHB1dCBzeW1ib2wgdGFibGUuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBtYWNybwotaXMgb25lLgotCi1AaXRlbSBvYmpfYWRqdXN0X3N5bXRhYgotQGNpbmRleCBvYmpfYWRqdXN0X3N5bXRhYgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBpbnZva2UgaXQganVzdCBiZWZvcmUgc2V0dGluZyB0aGUgc3ltYm9sCi10YWJsZSBvZiB0aGUgb3V0cHV0IEJGRC4gIEZvciBleGFtcGxlLCB0aGUgQ09GRiBzdXBwb3J0IHVzZXMgdGhpcyBtYWNybyB0bwotZ2VuZXJhdGUgYSBAY29kZXsuZmlsZX0gc3ltYm9sIGlmIG5vbmUgd2FzIGdlbmVyYXRlZCBwcmV2aW91c2x5LgotCi1AaXRlbSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi1AY2luZGV4IFNFUEFSQVRFX1NUQUJfU0VDVElPTlMKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhhdCBzdGFicyBzaG91bGQgYmUgcGxhY2VkIGluIHNlcGFyYXRlCi1zZWN0aW9ucywgYXMgaW4gRUxGLgotCi1AaXRlbSBJTklUX1NUQUJfU0VDVElPTgotQGNpbmRleCBJTklUX1NUQUJfU0VDVElPTgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbml0aWFsaXplIHRoZSBzdGFicyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotQGl0ZW0gT0JKX1BST0NFU1NfU1RBQgotQGNpbmRleCBPQkpfUFJPQ0VTU19TVEFCCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGRvIHNwZWNpZmljIHByb2Nlc3Npbmcgb24gYSBzdGFicyBlbnRyeS4KLQotQGl0ZW0gb2JqX2Zyb2Jfc2VjdGlvbgotQGNpbmRleCBvYmpfZnJvYl9zZWN0aW9uCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZm9yIGVhY2ggc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZQotYXNzZW1ibHkuCi0KLUBpdGVtIG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotQGNpbmRleCBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgc3ltYm9sIHZhbHVlcyBhcmUKLXJlc29sdmVkLCBidXQgYmVmb3JlIHRoZSBmaXh1cHMgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIHNlY3Rpb24KLXN5bWJvbHMuCi0KLUBpdGVtIG9ial9mcm9iX3N5bWJvbAotQGNpbmRleCBvYmpfZnJvYl9zeW1ib2wKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaCBzeW1ib2wuICBZb3UgY2FuIGluZGljYXRlCi10aGF0IHRoZSBzeW1ib2wgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0IGZpbGUgYnkgZGVmaW5pbmluZyB0aGlzCi1tYWNybyB0byBzZXQgaXRzIHNlY29uZCBhcmd1bWVudCB0byBhIG5vbi16ZXJvIHZhbHVlLgotCi1AaXRlbSBvYmpfZnJvYl9maWxlCi1AY2luZGV4IG9ial9mcm9iX2ZpbGUKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuCi1jb21wbGV0ZWQsIGJ1dCBiZWZvcmUgdGhlIHJlbG9jYXRpb25zIGhhdmUgYmVlbiBnZW5lcmF0ZWQuCi0KLUBpdGVtIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHJlbG9jcyBoYXZlIGJlZW4KLWdlbmVyYXRlZC4KLQotQGl0ZW0gU0VUX1NFQ1RJT05fUkVMT0NTIChAdmFye3NlY30sIEB2YXJ7cmVsb2NzfSwgQHZhcntufSkKLUBjaW5kZXggU0VUX1NFQ1RJT05fUkVMT0NTCi1JZiB5b3UgZGVmaW5lIHRoaXMsIGl0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSByZWxvY2F0aW9ucyBoYXZlIGJlZW4gc2V0IGZvcgotdGhlIHNlY3Rpb24gQHZhcntzZWN9LiAgVGhlIGxpc3Qgb2YgcmVsb2NhdGlvbnMgaXMgaW4gQHZhcntyZWxvY3N9LCBhbmQgdGhlCi1udW1iZXIgb2YgcmVsb2NhdGlvbnMgaXMgaW4gQHZhcntufS4gIFRoaXMgaXMgb25seSB1c2VkIHdpdGgKLUBjb2Rle0JGRF9BU1NFTUJMRVJ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBFbXVsYXRpb25zCi1Ac3Vic2VjdGlvbiBXcml0aW5nIGVtdWxhdGlvbiBmaWxlcwotCi1Ob3JtYWxseSB5b3UgZG8gbm90IGhhdmUgdG8gd3JpdGUgYW4gZW11bGF0aW9uIGZpbGUuICBZb3UgY2FuIGp1c3QgdXNlCi1AZmlsZXt0ZS1nZW5lcmljLmh9LgotCi1JZiB5b3UgZG8gd3JpdGUgeW91ciBvd24gZW11bGF0aW9uIGZpbGUsIGl0IG11c3QgaW5jbHVkZSBAZmlsZXtvYmotZm9ybWF0Lmh9LgotCi1BbiBlbXVsYXRpb24gZmlsZSB3aWxsIG9mdGVuIGRlZmluZSBAY29kZXtURV9AdmFye0VNfX07IHRoaXMgbWF5IHRoZW4gYmUgdXNlZAotaW4gb3RoZXIgZmlsZXMgdG8gY2hhbmdlIHRoZSBvdXRwdXQuCi0KLUBub2RlIFJlbGF4YXRpb24KLUBzZWN0aW9uIFJlbGF4YXRpb24KLUBjaW5kZXggcmVsYXhhdGlvbgotCi1AZGZue1JlbGF4YXRpb259IGlzIGEgZ2VuZXJpYyB0ZXJtIHVzZWQgd2hlbiB0aGUgc2l6ZSBvZiBzb21lIGluc3RydWN0aW9uIG9yCi1kYXRhIGRlcGVuZHMgdXBvbiB0aGUgdmFsdWUgb2Ygc29tZSBzeW1ib2wgb3Igb3RoZXIgZGF0YS4KLQotR0FTIGtub3dzIHRvIHJlbGF4IGEgcGFydGljdWxhciB0eXBlIG9mIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNpbmcgYSB0YWJsZS4KLVlvdSBjYW4gYWxzbyBkZWZpbmUgYXJiaXRyYXJpbHkgY29tcGxleCBmb3JtcyBvZiByZWxheGF0aW9uIHlvdXJzZWxmLgotCi1AbWVudQotKiBSZWxheGluZyB3aXRoIGEgdGFibGU6OiAgICAgICBSZWxheGluZyB3aXRoIGEgdGFibGUKLSogR2VuZXJhbCByZWxheGluZzo6ICAgICAgICAgICAgR2VuZXJhbCByZWxheGluZwotQGVuZCBtZW51Ci0KLUBub2RlIFJlbGF4aW5nIHdpdGggYSB0YWJsZQotQHN1YnNlY3Rpb24gUmVsYXhpbmcgd2l0aCBhIHRhYmxlCi0KLUlmIHlvdSBkbyBub3QgZGVmaW5lIEBjb2Rle21kX3JlbGF4X2ZyYWd9LCBhbmQgeW91IGRvIGRlZmluZQotQGNvZGV7VENfR0VORVJJQ19SRUxBWF9UQUJMRX0sIEdBUyB3aWxsIHJlbGF4IEBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBmcmFncwotYmFzZWQgb24gdGhlIGZyYWcgc3VidHlwZSBhbmQgdGhlIGRpc3BsYWNlbWVudCB0byBzb21lIHNwZWNpZmllZCB0YXJnZXQKLWFkZHJlc3MuICBUaGUgYmFzaWMgaWRlYSBpcyB0aGF0IHNldmVyYWwgbWFjaGluZXMgaGF2ZSBkaWZmZXJlbnQgYWRkcmVzc2luZwotbW9kZXMgZm9yIGluc3RydWN0aW9ucyB0aGF0IGNhbiBzcGVjaWZ5IGRpZmZlcmVudCByYW5nZXMgb2YgdmFsdWVzLCB3aXRoCi1zdWNjZXNzaXZlIG1vZGVzIGFibGUgdG8gYWNjZXNzIHdpZGVyIHJhbmdlcywgaW5jbHVkaW5nIHRoZSBlbnRpcmV0eSBvZiB0aGUKLXByZXZpb3VzIHJhbmdlLiAgU21hbGxlciByYW5nZXMgYXJlIGFzc3VtZWQgdG8gYmUgbW9yZSBkZXNpcmFibGUgKHBlcmhhcHMgdGhlCi1pbnN0cnVjdGlvbiByZXF1aXJlcyBvbmUgd29yZCBpbnN0ZWFkIG9mIHR3byBvciB0aHJlZSk7IGlmIHRoaXMgaXMgbm90IHRoZQotY2FzZSwgZG9uJ3QgZGVzY3JpYmUgdGhlIHNtYWxsZXItcmFuZ2UsIGluZmVyaW9yIG1vZGUuCi0KLVRoZSBAY29kZXtmcl9zdWJ0eXBlfSBmaWVsZCBvZiBhIGZyYWcgaXMgYW4gaW5kZXggaW50byBhIENQVS1zcGVjaWZpYwotcmVsYXhhdGlvbiB0YWJsZS4gIFRoYXQgdGFibGUgZW50cnkgaW5kaWNhdGVzIHRoZSByYW5nZSBvZiB2YWx1ZXMgdGhhdCBjYW4gYmUKLXN0b3JlZCwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdpbGwgaGF2ZSB0byBiZSBhZGRlZCB0byB0aGUgZnJhZyB0bwotYWNjb21vZGF0ZSB0aGUgYWRkcmVzc2luZyBtb2RlLCBhbmQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5IHRvIGV4YW1pbmUgaWYKLXRoZSB2YWx1ZSB0byBiZSBzdG9yZWQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgYWNjZXNzaWJsZSBieSB0aGUgY3VycmVudAotYWRkcmVzc2luZyBtb2RlLiAgVGhlIEBjb2Rle2ZyX3N5bWJvbH0gZmllbGQgb2YgdGhlIGZyYWcgaW5kaWNhdGVzIHdoYXQgc3ltYm9sCi1pcyB0byBiZSBhY2Nlc3NlZDsgdGhlIEBjb2Rle2ZyX29mZnNldH0gZmllbGQgaXMgYWRkZWQgaW4uCi0KLUlmIHRoZSBAY29kZXtUQ19QQ1JFTF9BREpVU1R9IG1hY3JvIGlzIGRlZmluZWQsIHdoaWNoIGN1cnJlbnRseSBzaG91bGQgb25seSBoYXBwZW4KLWZvciB0aGUgTlMzMmsgZmFtaWx5LCB0aGUgQGNvZGV7VENfUENSRUxfQURKVVNUfSBtYWNybyBpcyBjYWxsZWQgb24gdGhlIGZyYWcgdG8KLWNvbXB1dGUgYW4gYWRqdXN0bWVudCB0byBiZSBtYWRlIHRvIHRoZSBkaXNwbGFjZW1lbnQuCi0KLVRoZSB2YWx1ZSBmaXR0ZWQgYnkgdGhlIHJlbGF4YXRpb24gY29kZSBpcyBhbHdheXMgYXNzdW1lZCB0byBiZSBhIGRpc3BsYWNlbWVudAotZnJvbSB0aGUgY3VycmVudCBmcmFnLiAgKE1vcmUgc3BlY2lmaWNhbGx5LCBmcm9tIEBjb2Rle2ZyX2ZpeH0gYnl0ZXMgaW50byB0aGUKLWZyYWcuKQotQGlnbm9yZQotVGhpcyBzZWVtcyBraW5kYSBzaWxseS4gIFdoYXQgYWJvdXQgZml0dGluZyBzbWFsbCBhYnNvbHV0ZSB2YWx1ZXM/ICBJIHN1cHBvc2UKLUBjb2Rle21kX2Fzc2VtYmxlfSBpcyBzdXBwb3NlZCB0byB0YWtlIGNhcmUgb2YgdGhhdCwgYnV0IGlmIHRoZSBvcGVyYW5kIGlzIGEKLWRpZmZlcmVuY2UgYmV0d2VlbiBzeW1ib2xzLCBpdCBtaWdodCBub3QgYmUgYWJsZSB0bywgaWYgdGhlIGRpZmZlcmVuY2Ugd2FzIG5vdAotY29tcHV0YWJsZSB5ZXQuCi1AZW5kIGlnbm9yZQotCi1UaGUgZW5kIG9mIHRoZSByZWxheGF0aW9uIHNlcXVlbmNlIGlzIGluZGljYXRlZCBieSBhIGBgbmV4dCcnIHZhbHVlIG9mIDAuICBUaGlzCi1tZWFucyB0aGF0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUgY2FuJ3QgYmUgdXNlZC4KLQotRm9yIHNvbWUgY29uZmlndXJhdGlvbnMsIHRoZSBsaW5rZXIgY2FuIGRvIHJlbGF4aW5nIHdpdGhpbiBhIHNlY3Rpb24gb2YgYW4KLW9iamVjdCBmaWxlLiAgSWYgY2FsbCBpbnN0cnVjdGlvbnMgb2YgdmFyaW91cyBzaXplcyBleGlzdCwgdGhlIGxpbmtlciBjYW4KLWRldGVybWluZSB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBlYWNoIGluc3RhbmNlLCB3aGVuIGEgc3ltYm9sJ3MgdmFsdWUgaXMKLXJlc29sdmVkLiAgSW4gb3JkZXIgZm9yIHRoZSBsaW5rZXIgdG8gYXZvaWQgd2FzdGluZyBzcGFjZSBhbmQgaGF2aW5nIHRvIGluc2VydAotbm8tb3AgaW5zdHJ1Y3Rpb25zLCBpdCBtdXN0IGJlIGFibGUgdG8gZXhwYW5kIG9yIHNocmluayB0aGUgc2VjdGlvbiBjb250ZW50cwotd2hpbGUgc3RpbGwgcHJlc2VydmluZyBpbnRyYS1zZWN0aW9uIHJlZmVyZW5jZXMgYW5kIG1lZXRpbmcgYWxpZ25tZW50Ci1yZXF1aXJlbWVudHMuCi0KLUZvciB0aGUgaTk2MCB1c2luZyBiLm91dCBmb3JtYXQsIG5vIGV4cGFuc2lvbiBpcyBkb25lOyBpbnN0ZWFkLCBlYWNoCi1Ac2FtcHsuYWxpZ259IGRpcmVjdGl2ZSBjYXVzZXMgZXh0cmEgc3BhY2UgdG8gYmUgYWxsb2NhdGVkLCBlbm91Z2ggdGhhdCB3aGVuCi10aGUgbGlua2VyIGlzIHJlbGF4aW5nIGEgc2VjdGlvbiBhbmQgcmVtb3ZpbmcgdW5uZWVkZWQgc3BhY2UsIGl0IGNhbiBkaXNjYXJkCi1zb21lIG9yIGFsbCBvZiB0aGlzIGV4dHJhIHBhZGRpbmcgYW5kIGNhdXNlIHRoZSBmb2xsb3dpbmcgZGF0YSB0byBiZSBjb3JyZWN0bHkKLWFsaWduZWQuCi0KLUZvciB0aGUgSDgvMzAwLCBJIHRoaW5rIHRoZSBsaW5rZXIgZXhwYW5kcyBjYWxscyB0aGF0IGNhbid0IHJlYWNoLCBhbmQgZG9lc24ndAotd29ycnkgYWJvdXQgYWxpZ25tZW50IGlzc3VlczsgdGhlIGNwdSBwcm9iYWJseSBuZXZlciBuZWVkcyBhbnkgc2lnbmlmaWNhbnQKLWFsaWdubWVudCBiZXlvbmQgdGhlIGluc3RydWN0aW9uIHNpemUuCi0KLVRoZSByZWxheGF0aW9uIHRhYmxlIHR5cGUgY29udGFpbnMgdGhlc2UgZmllbGRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGxvbmcgcmx4X2ZvcndhcmQKLUZvcndhcmQgcmVhY2gsIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgotQGl0ZW0gbG9uZyBybHhfYmFja3dhcmQKLUJhY2t3YXJkIHJlYWNoLCBtdXN0IGJlIHplcm8gb3IgbmVnYXRpdmUuCi1AaXRlbSBybHhfbGVuZ3RoCi1MZW5ndGggaW4gYnl0ZXMgb2YgdGhpcyBhZGRyZXNzaW5nIG1vZGUuCi1AaXRlbSBybHhfbW9yZQotSW5kZXggb2YgdGhlIG5leHQtbG9uZ2VyIHJlbGF4IHN0YXRlLCBvciB6ZXJvIGlmIHRoZXJlIGlzIG5vIG5leHQgcmVsYXggc3RhdGUuCi1AZW5kIHRhYmxlCi0KLVRoZSByZWxheGF0aW9uIGlzIGRvbmUgaW4gQGNvZGV7cmVsYXhfc2VnbWVudH0gaW4gQGZpbGV7d3JpdGUuY30uICBUaGUKLWRpZmZlcmVuY2UgaW4gdGhlIGxlbmd0aCBmaWVsZHMgYmV0d2VlbiB0aGUgb3JpZ2luYWwgbW9kZSBhbmQgdGhlIG9uZSBmaW5hbGx5Ci1jaG9zZW4gYnkgdGhlIHJlbGF4aW5nIGNvZGUgaXMgdGFrZW4gYXMgdGhlIHNpemUgYnkgd2hpY2ggdGhlIGN1cnJlbnQgZnJhZyB3aWxsCi1iZSBpbmNyZWFzZWQgaW4gc2l6ZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgaW5pdGlhbCByZWxheGluZyBtb2RlIGhhcyBhIGxlbmd0aAotb2YgMiBieXRlcywgYW5kIGJlY2F1c2Ugb2YgdGhlIHNpemUgb2YgdGhlIGRpc3BsYWNlbWVudCwgaXQgZ2V0cyB1cGdyYWRlZCB0byBhCi1tb2RlIHdpdGggYSBzaXplIG9mIDYgYnl0ZXMsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhZyB3aWxsIGdyb3cgYnkgNCBieXRlcy4KLShUaGUgaW5pdGlhbCB0d28gYnl0ZXMgc2hvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBmaXhlZCBwb3J0aW9uIG9mIHRoZSBmcmFnLAotc2luY2UgaXQgaXMgYWxyZWFkeSBrbm93biB0aGF0IHRoZXkgd2lsbCBiZSBvdXRwdXQuKSAgVGhpcyBncm93dGggbXVzdCBiZQotZWZmZWN0ZWQgYnkgQGNvZGV7bWRfY29udmVydF9mcmFnfTsgaXQgc2hvdWxkIGluY3JlYXNlIHRoZSBAY29kZXtmcl9maXh9IGZpZWxkCi1ieSB0aGUgYXBwcm9wcmlhdGUgc2l6ZSwgYW5kIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIG9mIHRoZSBmcmFnLgotKEVub3VnaCBzcGFjZSBmb3IgdGhlIG1heGltdW0gZ3Jvd3RoIHNob3VsZCBoYXZlIGJlZW4gYWxsb2NhdGVkIGluIHRoZSBjYWxsIHRvCi1mcmFnX3ZhciBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LikKLQotSWYgcmVsb2NhdGlvbiByZWNvcmRzIGFyZSBuZWVkZWQsIHRoZXkgc2hvdWxkIGJlIGVtaXR0ZWQgYnkKLUBjb2Rle21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4fS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGV4YW1pbmUgdGhlIHRhcmdldAotc3ltYm9sIG9mIHRoZSBzdXBwbGllZCBmcmFnIGFuZCBjb3JyZWN0IHRoZSBAY29kZXtmcl9zdWJ0eXBlfSBvZiB0aGUgZnJhZyBpZgotbmVlZGVkLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaWYgdGhlIHN5bWJvbCBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQsCi1pdCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZCBsYXRlcjsgaG93ZXZlciwgaXRzIHZhbHVlIG1heSBzdGlsbCBjaGFuZ2UgaWYgdGhlCi1zZWN0aW9uIGl0IGlzIGluIGdldHMgcmVsYXhlZC4KLQotVXN1YWxseSwgaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSBmcmFnIChnaXZlbiBieSB0aGUKLUB2YXJ7c2VjfSBhcmd1bWVudCksIHRoZSBuYXJyb3dlc3QgbGlrZWx5IHJlbGF4YXRpb24gbW9kZSBpcyBzdG9yZWQgaW4KLUBjb2Rle2ZyX3N1YnR5cGV9LCBhbmQgdGhhdCdzIHRoYXQuCi0KLUlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBvciBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIChhbmQgdGhlcmVmb3JlIG1vdmVhYmxlCi10byBhbiBhcmJpdHJhcmlseSBsYXJnZSBkaXN0YW5jZSksIHRoZSBsYXJnZXN0IGF2YWlsYWJsZSByZWxheGF0aW9uIG1vZGUgaXMKLXNwZWNpZmllZCwgQGNvZGV7Zml4X25ld30gaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHJlbG9jYXRpb24gcmVjb3JkLAotQGNvZGV7ZnJfZml4fSBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aGUgcmVsb2NhdGVkIGZpZWxkIChyZW1lbWJlciwgdGhpcwotc3RvcmFnZSB3YXMgYWxsb2NhdGVkIHdoZW4gQGNvZGV7ZnJhZ192YXJ9IHdhcyBjYWxsZWQpLCBhbmQgQGNvZGV7ZnJhZ193YW5lfSBpcwotY2FsbGVkIHRvIGNvbnZlcnQgdGhlIGZyYWcgdG8gYW4gQGNvZGV7cnNfZmlsbH0gZnJhZyB3aXRoIG5vIHZhcmlhbnQgcGFydC4KLVNvbWV0aW1lcyBjaGFuZ2luZyBhZGRyZXNzaW5nIG1vZGVzIG1heSBhbHNvIHJlcXVpcmUgcmV3cml0aW5nIHRoZSBpbnN0cnVjdGlvbi4KLUl0IGNhbiBiZSBhY2Nlc3NlZCB2aWEgQGNvZGV7ZnJfb3Bjb2RlfSBvciBAY29kZXtmcl9maXh9LgotCi1Tb21ldGltZXMgQGNvZGV7ZnJfdmFyfSBpcyBpbmNyZWFzZWQgaW5zdGVhZCwgYW5kIEBjb2Rle2ZyYWdfd2FuZX0gaXMgbm90Ci1jYWxsZWQuICBJJ20gbm90IHN1cmUsIGJ1dCBJIHRoaW5rIHRoaXMgaXMgdG8ga2VlcCBAY29kZXtmcl9maXh9IHJlZmVycmluZyB0bwotYW4gZWFybGllciBieXRlLCBhbmQgQGNvZGV7ZnJfc3VidHlwZX0gc2V0IHRvIEBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBzbwotdGhhdCBAY29kZXttZF9jb252ZXJ0X2ZyYWd9IHdpbGwgZ2V0IGNhbGxlZC4KLQotQG5vZGUgR2VuZXJhbCByZWxheGluZwotQHN1YnNlY3Rpb24gR2VuZXJhbCByZWxheGluZwotCi1JZiB1c2luZyBhIHNpbXBsZSB0YWJsZSBpcyBub3Qgc3VpdGFibGUsIHlvdSBtYXkgaW1wbGVtZW50IGFyYml0cmFyaWx5IGNvbXBsZXgKLXJlbGF4YXRpb24gc2VtYW50aWNzIHlvdXJzZWxmLiAgRm9yIGV4YW1wbGUsIHRoZSBNSVBTIGJhY2tlbmQgdXNlcyB0aGlzIHRvIGVtaXQKLWRpZmZlcmVudCBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMgZGVwZW5kaW5nIHVwb24gdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBiZWluZwotYWNjZXNzZWQuCi0KLVdoZW4geW91IGFzc2VtYmxlIGFuIGluc3RydWN0aW9uIHRoYXQgbWF5IG5lZWQgcmVsYXhhdGlvbiwgeW91IHNob3VsZCBhbGxvY2F0ZQotYSBmcmFnIHVzaW5nIEBjb2Rle2ZyYWdfdmFyfSBvciBAY29kZXtmcmFnX3ZhcmlhbnR9IHdpdGggYSB0eXBlIG9mCi1AY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0uICBZb3Ugc2hvdWxkIHN0b3JlIHNvbWUgc29ydCBvZiBpbmZvcm1hdGlvbiBpbiB0aGUKLUBjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIHNvIHRoYXQgeW91IGNhbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCB0aGUgZnJhZwotbGF0ZXIuCi0KLVdoZW4gR0FTIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZSwgaXQgd2lsbCBsb29rIHRocm91Z2ggdGhlIGZyYWdzIGFuZAotd29yayBvdXQgdGhlaXIgZmluYWwgc2l6ZXMuCi0KLUdBUyB3aWxsIGZpcnN0IGNhbGwgQGNvZGV7bWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXh9IG9uIGVhY2gKLUBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBmcmFnLiAgVGhpcyBmdW5jdGlvbiBtdXN0IHJldHVybiBhbiBlc3RpbWF0ZWQgc2l6ZQotZm9yIHRoZSBmcmFnLgotCi1HQVMgd2lsbCB0aGVuIGxvb3Agb3ZlciB0aGUgZnJhZ3MsIGNhbGxpbmcgQGNvZGV7bWRfcmVsYXhfZnJhZ30gb24gZWFjaAotQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IGZyYWcuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGNoYW5nZSBpbgotc2l6ZSBvZiB0aGUgZnJhZy4gIEdBUyB3aWxsIGtlZXAgbG9vcGluZyBvdmVyIHRoZSBmcmFncyB1bnRpbCBub25lIG9mIHRoZSBmcmFncwotY2hhbmdlcyBzaXplLgotCi1Abm9kZSBCcm9rZW4gd29yZHMKLUBzZWN0aW9uIEJyb2tlbiB3b3JkcwotQGNpbmRleCBpbnRlcm5hbHMsIGJyb2tlbiB3b3JkcwotQGNpbmRleCBicm9rZW4gd29yZHMKLQotU29tZSBjb21waWxlcnMsIGluY2x1ZGluZyBHQ0MsIHdpbGwgc29tZXRpbWVzIGVtaXQgc3dpdGNoIHRhYmxlcyBzcGVjaWZ5aW5nCi0xNi1iaXQgQGNvZGV7LndvcmR9IGRpc3BsYWNlbWVudHMgdG8gYnJhbmNoIHRhcmdldHMsIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zCi10aGF0IGxvYWQgZW50cmllcyBmcm9tIHRoYXQgdGFibGUgdG8gY29tcHV0ZSB0aGUgdGFyZ2V0IGFkZHJlc3MuICBJZiB0aGlzIGlzCi1kb25lIG9uIGEgMzItYml0IG1hY2hpbmUsIHRoZXJlIGlzIGEgY2hhbmNlIChhdCBsZWFzdCB3aXRoIHJlYWxseSBsYXJnZQotZnVuY3Rpb25zKSB0aGF0IHRoZSBkaXNwbGFjZW1lbnQgd2lsbCBub3QgZml0IGluIDE2IGJpdHMuICBUaGUgYXNzZW1ibGVyCi1oYW5kbGVzIHRoaXMgdXNpbmcgYSBjb25jZXB0IGNhbGxlZCBAZGZue2Jyb2tlbiB3b3Jkc30uICBUaGlzIGlkZWEgaXMgd2VsbAotbmFtZWQsIHNpbmNlIHRoZXJlIGlzIGFuIGltcGxpZWQgcHJvbWlzZSB0aGF0IHRoZSAxNi1iaXQgZmllbGQgd2lsbCBpbiBmYWN0Ci1ob2xkIHRoZSBzcGVjaWZpZWQgZGlzcGxhY2VtZW50LgotCi1JZiBicm9rZW4gd29yZCBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIGFuZCBhIHNpdHVhdGlvbiBsaWtlIHRoaXMgaXMgZW5jb3VudGVyZWQsCi10aGUgYXNzZW1ibGVyIHdpbGwgaW5zZXJ0IGEganVtcCBpbnN0cnVjdGlvbiBpbnRvIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0sIGNsb3NlCi1lbm91Z2ggdG8gYmUgcmVhY2hlZCB3aXRoIHRoZSAxNi1iaXQgZGlzcGxhY2VtZW50LiAgVGhpcyBqdW1wIGluc3RydWN0aW9uIHdpbGwKLXRyYW5zZmVyIHRvIHRoZSByZWFsIGRlc2lyZWQgdGFyZ2V0IGFkZHJlc3MuICBUaHVzLCBhcyBsb25nIGFzIHRoZSBAY29kZXsud29yZH0KLXZhbHVlIHJlYWxseSBpcyB1c2VkIGFzIGEgZGlzcGxhY2VtZW50IHRvIGNvbXB1dGUgYW4gYWRkcmVzcyB0byBqdW1wIHRvLCB0aGUKLW5ldCBlZmZlY3Qgd2lsbCBiZSBjb3JyZWN0IChtaW51cyBhIHZlcnkgc21hbGwgZWZmaWNpZW5jeSBjb3N0KS4gIElmCi1AY29kZXsud29yZH0gZGlyZWN0aXZlcyB3aXRoIGxhYmVsIGRpZmZlcmVuY2VzIGZvciB2YWx1ZXMgYXJlIHVzZWQgZm9yIG90aGVyCi1wdXJwb3NlcywgaG93ZXZlciwgdGhpbmdzIG1heSBub3Qgd29yayBwcm9wZXJseS4gIEZvciB0YXJnZXRzIHdoaWNoIHVzZSBicm9rZW4KLXdvcmRzLCB0aGUgQHNhbXB7LUt9IG9wdGlvbiB3aWxsIHdhcm4gd2hlbiBhIGJyb2tlbiB3b3JkIGlzIGRpc2NvdmVyZWQuCi0KLVRoZSBicm9rZW4gd29yZCBjb2RlIGlzIHR1cm5lZCBvZmYgYnkgdGhlIEBjb2Rle1dPUktJTkdfRE9UX1dPUkR9IG1hY3JvLiAgSXQKLWlzbid0IG5lZWRlZCBpZiBAY29kZXsud29yZH0gZW1pdHMgYSB2YWx1ZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhbiBhZGRyZXNzCi0ob3IsIG1vcmUgY29ycmVjdGx5LCBhbnkgcG9zc2libGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBhZGRyZXNzZXMpLgotCi1Abm9kZSBJbnRlcm5hbCBmdW5jdGlvbnMKLUBzZWN0aW9uIEludGVybmFsIGZ1bmN0aW9ucwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGJhc2ljIGludGVybmFsIGZ1bmN0aW9ucyB1c2VkIGJ5IEdBUy4KLQotQG1lbnUKLSogV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXM6OiAgV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMKLSogSGFzaCB0YWJsZXM6OiAgICAgICAgICAgICAgICAgSGFzaCB0YWJsZXMKLUBlbmQgbWVudQotCi1Abm9kZSBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcwotQHN1YnNlY3Rpb24gV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMKLQotQGRlZnR5cGVmdW4gIEB7QH0gaW50IGhhZF93YXJuaW5ncyAodm9pZCkKLUBkZWZ0eXBlZnVueCBAe0B9IGludCBoYWRfZXJyb3JzICh2b2lkKQotUmV0dXJucyBub24temVybyBpZiBhbnkgd2FybmluZ3Mgb3IgZXJyb3JzLCByZXNwZWN0aXZlbHksIGhhdmUgYmVlbiBwcmludGVkCi1kdXJpbmcgdGhpcyBpbnZvY2F0aW9uLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gdm9pZCBhc19wZXJyb3IgKGNvbnN0IGNoYXIgKkB2YXJ7Z3JpcGV9LCBjb25zdCBjaGFyICpAdmFye2ZpbGVuYW1lfSkKLURpc3BsYXlzIGEgQkZEIG9yIHN5c3RlbSBlcnJvciwgdGhlbiBjbGVhcnMgdGhlIGVycm9yIHN0YXR1cy4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biAgQHtAfSB2b2lkIGFzX3Rza3RzayAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX3dhcm4gKGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQotQGRlZnR5cGVmdW54IEB7QH0gdm9pZCBhc19iYWQgKGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQotQGRlZnR5cGVmdW54IEB7QH0gdm9pZCBhc19mYXRhbCAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1UaGVzZSBmdW5jdGlvbnMgZGlzcGxheSBtZXNzYWdlcyBhYm91dCBzb21ldGhpbmcgYW1pc3Mgd2l0aCB0aGUgaW5wdXQgZmlsZSwgb3IKLWludGVybmFsIHByb2JsZW1zIGluIHRoZSBhc3NlbWJsZXIgaXRzZWxmLiAgVGhlIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lCi1udW1iZXIgYXJlIHByaW50ZWQsIGZvbGxvd2VkIGJ5IHRoZSBzdXBwbGllZCBtZXNzYWdlLCBmb3JtYXR0ZWQgdXNpbmcKLUBjb2Rle3ZmcHJpbnRmfSwgYW5kIGEgZmluYWwgbmV3bGluZS4KLQotQW4gZXJyb3IgaW5kaWNhdGVkIGJ5IEBjb2Rle2FzX2JhZH0gd2lsbCByZXN1bHQgaW4gYSBub24temVybyBleGl0IHN0YXR1cyB3aGVuCi10aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZC4gIENhbGxpbmcgQGNvZGV7YXNfZmF0YWx9IHdpbGwgcmVzdWx0IGluIGltbWVkaWF0ZQotdGVybWluYXRpb24gb2YgdGhlIGFzc2VtYmxlciBwcm9jZXNzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gdm9pZCBhc193YXJuX3doZXJlIChjaGFyICpAdmFye2ZpbGV9LCB1bnNpZ25lZCBpbnQgQHZhcntsaW5lfSwgY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX2JhZF93aGVyZSAoY2hhciAqQHZhcntmaWxlfSwgdW5zaWduZWQgaW50IEB2YXJ7bGluZX0sIGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQotVGhlc2UgdmFyaWFudHMgcGVybWl0IHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCBhcmUKLXVzZWQgd2hlbiBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQgd2hlbiByZXByb2Nlc3NpbmcgaW5mb3JtYXRpb24gc2F2ZWQgYXdheSB3aGVuCi1wcm9jZXNzaW5nIHNvbWUgZWFybGllciBwYXJ0IG9mIHRoZSBmaWxlLiAgRm9yIGV4YW1wbGUsIGZpeHVwcyBhcmUgcHJvY2Vzc2VkCi1hZnRlciBhbGwgaW5wdXQgaGFzIGJlZW4gcmVhZCwgYnV0IG1lc3NhZ2VzIGFib3V0IGZpeHVwcyBzaG91bGQgcmVmZXIgdG8gdGhlCi1vcmlnaW5hbCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIgdGhhdCB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gdm9pZCBmcHJpbnRfdmFsdWUgKEZJTEUgKkB2YXJ7ZmlsZX0sIHZhbHVlVCBAdmFye3ZhbH0pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIHNwcmludF92YWx1ZSAoY2hhciAqQHZhcntidWZ9LCB2YWx1ZVQgQHZhcnt2YWx9KQotVGhlc2UgZnVuY3Rpb25zIGFyZSBoZWxwZnVsIGZvciBjb252ZXJ0aW5nIGEgQGNvZGV7dmFsdWVUfSB2YWx1ZSBpbnRvIHByaW50YWJsZQotZm9ybWF0LCBpbiBjYXNlIGl0J3Mgd2lkZXIgdGhhbiBtb2RlcyB0aGF0IEBjb2RleypwcmludGZ9IGNhbiBoYW5kbGUuICBJZiB0aGUKLXR5cGUgaXMgbmFycm93IGVub3VnaCwgYSBkZWNpbWFsIG51bWJlciB3aWxsIGJlIHByb2R1Y2VkOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUKLWluIGhleGFkZWNpbWFsLiAgVGhlIHZhbHVlIGl0c2VsZiBpcyBub3QgZXhhbWluZWQgdG8gbWFrZSB0aGlzIGRldGVybWluYXRpb24uCi1AZW5kIGRlZnR5cGVmdW4KLQotQG5vZGUgSGFzaCB0YWJsZXMKLUBzdWJzZWN0aW9uIEhhc2ggdGFibGVzCi1AY2luZGV4IGhhc2ggdGFibGVzCi0KLUBkZWZ0eXBlZnVuIEB7QH0gQHtzdHJ1Y3QgaGFzaF9jb250cm9sICpAfSBoYXNoX25ldyAodm9pZCkKLUNyZWF0ZXMgdGhlIGhhc2ggdGFibGUgY29udHJvbCBzdHJ1Y3R1cmUuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGhhc2hfZGllIChzdHJ1Y3QgaGFzaF9jb250cm9sICopCi1EZXN0cm95IGEgaGFzaCB0YWJsZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IFBUUiBoYXNoX2RlbGV0ZSAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICopCi1EZWxldGVzIGVudHJ5IGZyb20gdGhlIGhhc2ggdGFibGUsIHJldHVybnMgdGhlIHZhbHVlIGl0IGhhZC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IFBUUiBoYXNoX3JlcGxhY2UgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqLCBQVFIpCi1VcGRhdGVzIHRoZSB2YWx1ZSBmb3IgYW4gZW50cnkgYWxyZWFkeSBpbiB0aGUgdGFibGUsIHJldHVybmluZyB0aGUgb2xkIHZhbHVlLgotSWYgbm8gZW50cnkgd2FzIGZvdW5kLCBqdXN0IHJldHVybnMgTlVMTC4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IEB7Y29uc3QgY2hhciAqQH0gaGFzaF9pbnNlcnQgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqLCBQVFIpCi1JbnNlcnRpbmcgYSB2YWx1ZSBhbHJlYWR5IGluIHRoZSB0YWJsZSBpcyBhbiBlcnJvci4KLVJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gQHtjb25zdCBjaGFyICpAfSBoYXNoX2phbSAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICosIFBUUikKLUluc2VydHMgaWYgdGhlIHZhbHVlIGlzbid0IGFscmVhZHkgcHJlc2VudCwgdXBkYXRlcyBpdCBpZiBpdCBpcy4KLUBlbmQgZGVmdHlwZWZ1bgotCi1Abm9kZSBUZXN0IHN1aXRlCi1Ac2VjdGlvbiBUZXN0IHN1aXRlCi1AY2luZGV4IHRlc3Qgc3VpdGUKLQotVGhlIHRlc3Qgc3VpdGUgaXMga2luZCBvZiBsYW1lIGZvciBtb3N0IHByb2Nlc3NvcnMuICBPZnRlbiBpdCBvbmx5IGNoZWNrcyB0bwotc2VlIGlmIGEgY291cGxlIG9mIGZpbGVzIGNhbiBiZSBhc3NlbWJsZWQgd2l0aG91dCB0aGUgYXNzZW1ibGVyIHJlcG9ydGluZyBhbnkKLWVycm9ycy4gIEZvciBtb3JlIGNvbXBsZXRlIHRlc3RpbmcsIHdyaXRlIGEgdGVzdCB3aGljaCBlaXRoZXIgZXhhbWluZXMgdGhlCi1hc3NlbWJsZXIgbGlzdGluZywgb3IgcnVucyBAY29kZXtvYmpkdW1wfSBhbmQgZXhhbWluZXMgaXRzIG91dHB1dC4gIEZvciB0aGUKLWxhdHRlciwgdGhlIFRDTCBwcm9jZWR1cmUgQGNvZGV7cnVuX2R1bXBfdGVzdH0gbWF5IGNvbWUgaW4gaGFuZHkuICBJdCB0YWtlcyB0aGUKLWJhc2UgbmFtZSBvZiBhIGZpbGUsIGFuZCBsb29rcyBmb3IgQGZpbGV7QHZhcntmaWxlfS5kfS4gIFRoaXMgZmlsZSBzaG91bGQKLWNvbnRhaW4gYXMgaXRzIGluaXRpYWwgbGluZXMgYSBzZXQgb2YgdmFyaWFibGUgc2V0dGluZ3MgaW4gQHNhbXB7I30gY29tbWVudHMsCi1pbiB0aGUgZm9ybToKLQotQGV4YW1wbGUKLSAgICAgICAgI0B2YXJ7dmFybmFtZX06IEB2YXJ7dmFsdWV9Ci1AZW5kIGV4YW1wbGUKLQotVGhlIEB2YXJ7dmFybmFtZX0gbWF5IGJlIEBjb2Rle29iamR1bXB9LCBAY29kZXtubX0sIG9yIEBjb2Rle2FzfSwgaW4gd2hpY2ggY2FzZQotaXQgc3BlY2lmaWVzIHRoZSBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byB0aGUgc3BlY2lmaWVkIHByb2dyYW1zLiAgRXhhY3RseSBvbmUKLW9mIEBjb2Rle29iamR1bXB9IG9yIEBjb2Rle25tfSBtdXN0IGJlIHNwZWNpZmllZCwgYXMgdGhhdCBhbHNvIHNwZWNpZmllcyB3aGljaAotcHJvZ3JhbSB0byBydW4gYWZ0ZXIgdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQuICBJZiBAdmFye3Zhcm5hbWV9IGlzCi1AY29kZXtzb3VyY2V9LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlOyBvdGhlcndpc2UsCi1AZmlsZXtAdmFye2ZpbGV9LnN9IGlzIHVzZWQuICBJZiBAdmFye3Zhcm5hbWV9IGlzIEBjb2Rle25hbWV9LCBpdCBzcGVjaWZpZXMgdGhlCi1uYW1lIG9mIHRoZSB0ZXN0IHRvIGJlIHVzZWQgaW4gdGhlIEBjb2Rle3Bhc3N9IG9yIEBjb2Rle2ZhaWx9IG1lc3NhZ2VzLgotCi1UaGUgbm9uLWNvbW1lbnRlZCBwYXJ0cyBvZiB0aGUgZmlsZSBhcmUgaW50ZXJwcmV0ZWQgYXMgcmVndWxhciBleHByZXNzaW9ucywgb25lCi1wZXIgbGluZS4gIEJsYW5rIGxpbmVzIGluIHRoZSBAY29kZXtvYmpkdW1wfSBvciBAY29kZXtubX0gb3V0cHV0IGFyZSBza2lwcGVkLAotYXMgYXJlIGJsYW5rIGxpbmVzIGluIHRoZSBAY29kZXsuZH0gZmlsZTsgdGhlIG90aGVyIGxpbmVzIGFyZSB0ZXN0ZWQgdG8gc2VlIGlmCi10aGUgcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMgdGhlIHByb2dyYW0gb3V0cHV0LiAgSWYgaXQgZG9lcyBub3QsIHRoZSB0ZXN0Ci1mYWlscy4KLQotTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhlIHRlc3RzIG11c3QgYmUgbW9kaWZpZWQgaWYgdGhlIEBjb2Rle29iamR1bXB9IG91dHB1dAotc3R5bGUgaXMgY2hhbmdlZC4KLQotQGJ5ZQotQGMgTG9jYWwgVmFyaWFibGVzOgotQGMgZmlsbC1jb2x1bW46IDc5Ci1AYyBFbmQ6CmRpZmYgLS1naXQgYS9nYXMvZHdhcmYyZGJnLmMgYi9nYXMvZHdhcmYyZGJnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzE3NWEuLjAwMDAwMDAKLS0tIGEvZ2FzL2R3YXJmMmRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcwICswLDAgQEAKLS8qIGR3YXJmMmRiZy5jIC0gRFdBUkYyIGRlYnVnIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTG9naWNhbCBsaW5lIG51bWJlcnMgY2FuIGJlIGNvbnRyb2xsZWQgYnkgdGhlIGNvbXBpbGVyIHZpYSB0aGUKLSAgIGZvbGxvd2luZyB0d28gZGlyZWN0aXZlczoKLQotCS5maWxlIEZJTEVOTyAiZmlsZS5jIgotCS5sb2MgIEZJTEVOTyBMSU5FTk8gW0NPTFVNTl0KLQotICAgRklMRU5PIGlzIHRoZSBmaWxlbnVtYmVyLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImR3YXJmMmRiZy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgImVsZi9kd2FyZjIuaCIKLQotLyogU2luY2Ugd2UgY2FuJ3QgZ2VuZXJhdGUgdGhlIHByb2xvZyB1bnRpbCB0aGUgYm9keSBpcyBjb21wbGV0ZSwgd2UKLSAgIHVzZSB0aHJlZSBkaWZmZXJlbnQgc3Vic2VnbWVudHMgZm9yIC5kZWJ1Z19saW5lOiBvbmUgaG9sZGluZyB0aGUKLSAgIHByb2xvZywgb25lIGZvciB0aGUgZGlyZWN0b3J5IGFuZCBmaWxlbmFtZSBpbmZvLCBhbmQgb25lIGZvciB0aGUKLSAgIGJvZHkgKCJzdGF0ZW1lbnQgcHJvZ3JhbSIpLiAgKi8KLSNkZWZpbmUgRExfUFJPTE9HCTAKLSNkZWZpbmUgRExfRklMRVMJMQotI2RlZmluZSBETF9CT0RZCQkyCi0KLS8qIEZpcnN0IHNwZWNpYWwgbGluZSBvcGNkZSAtIGxlYXZlIHJvb20gZm9yIHRoZSBzdGFuZGFyZCBvcGNvZGVzLgotICAgTm90ZTogSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoaXMsIHlvdSdsbCBoYXZlIHRvIHVwZGF0ZSB0aGUKLSAgICJzdGFuZGFyZF9vcGNvZGVfbGVuZ3RocyIgdGFibGUgdGhhdCBpcyBlbWl0dGVkIGJlbG93IGluCi0gICBkd2FyZjJfZmluaXNoKCkuICAqLwotI2RlZmluZSBEV0FSRjJfTElORV9PUENPREVfQkFTRQkJMTAKLQotI2lmbmRlZiBEV0FSRjJfTElORV9CQVNFCi0gIC8qIE1pbmltdW0gbGluZSBvZmZzZXQgaW4gYSBzcGVjaWFsIGxpbmUgaW5mby4gb3Bjb2RlLiAgVGhpcyB2YWx1ZQotICAgICB3YXMgY2hvc2VuIHRvIGdpdmUgYSByZWFzb25hYmxlIHJhbmdlIG9mIHZhbHVlcy4gICovCi0jIGRlZmluZSBEV0FSRjJfTElORV9CQVNFCQktNQotI2VuZGlmCi0KLS8qIFJhbmdlIG9mIGxpbmUgb2Zmc2V0cyBpbiBhIHNwZWNpYWwgbGluZSBpbmZvLiBvcGNvZGUuICAqLwotI2lmbmRlZiBEV0FSRjJfTElORV9SQU5HRQotIyBkZWZpbmUgRFdBUkYyX0xJTkVfUkFOR0UJCTE0Ci0jZW5kaWYKLQotI2lmbmRlZiBEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEgKLSAgLyogRGVmaW5lIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IG1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoIChpbgotICAgICBieXRlcykuICBUaGlzIHZhbHVlIHNob3VsZCBiZSByYXRoZXIgdG9vIHNtYWxsIHRoYW4gdG9vIGJpZy4gICovCi0jIGRlZmluZSBEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEgJNAotI2VuZGlmCi0KLS8qIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGlzX3N0bXRfc3RhcnQgZmxhZy4KLSAgIEluIHRoZSBwcmVzZW50IGltcGxlbWVudGF0aW9uLCB3ZSBkbyBub3QgbWFyayBhbnkgbGluZXMgYXMKLSAgIHRoZSBiZWdpbm5pbmcgb2YgYSBzb3VyY2Ugc3RhdGVtZW50LCBiZWNhdXNlIHRoYXQgaW5mb3JtYXRpb24KLSAgIGlzIG5vdCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgR0NDIGZyb250LWVuZC4gICovCi0jZGVmaW5lCURXQVJGMl9MSU5FX0RFRkFVTFRfSVNfU1RNVAkxCi0KLS8qIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGlzX3N0bXRfc3RhcnQgZmxhZy4KLSAgIEluIHRoZSBwcmVzZW50IGltcGxlbWVudGF0aW9uLCB3ZSBkbyBub3QgbWFyayBhbnkgbGluZXMgYXMKLSAgIHRoZSBiZWdpbm5pbmcgb2YgYSBzb3VyY2Ugc3RhdGVtZW50LCBiZWNhdXNlIHRoYXQgaW5mb3JtYXRpb24KLSAgIGlzIG5vdCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgR0NDIGZyb250LWVuZC4gICovCi0jZGVmaW5lCURXQVJGMl9MSU5FX0RFRkFVTFRfSVNfU1RNVAkxCi0KLS8qIEdpdmVuIGEgc3BlY2lhbCBvcCwgcmV0dXJuIHRoZSBsaW5lIHNraXAgYW1vdW50LiAgKi8KLSNkZWZpbmUgU1BFQ0lBTF9MSU5FKG9wKSBcCi0JKCgob3ApIC0gRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0UpJURXQVJGMl9MSU5FX1JBTkdFICsgRFdBUkYyX0xJTkVfQkFTRSkKLQotLyogR2l2ZW4gYSBzcGVjaWFsIG9wLCByZXR1cm4gdGhlIGFkZHJlc3Mgc2tpcCBhbW91bnQgKGluIHVuaXRzIG9mCi0gICBEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEguICAqLwotI2RlZmluZSBTUEVDSUFMX0FERFIob3ApICgoKG9wKSAtIERXQVJGMl9MSU5FX09QQ09ERV9CQVNFKS9EV0FSRjJfTElORV9SQU5HRSkKLQotLyogVGhlIG1heGltdW0gYWRkcmVzcyBza2lwIGFtb3VudCB0aGF0IGNhbiBiZSBlbmNvZGVkIHdpdGggYSBzcGVjaWFsIG9wLiAgKi8KLSNkZWZpbmUgTUFYX1NQRUNJQUxfQUREUl9ERUxUQQkJU1BFQ0lBTF9BRERSKDI1NSkKLQotI2RlZmluZSBJTklUSUFMX1NUQVRFCQkJCQkJXAotICAvKiBJbml0aWFsaXplIGFzIHBlciBEV0FSRjIuMCBzdGFuZGFyZC4gICovCQkJXAotICAwLAkJCQkJLyogYWRkcmVzcyAqLwkJXAotICAxLAkJCQkJLyogZmlsZSAqLwkJXAotICAxLAkJCQkJLyogbGluZSAqLwkJXAotICAwLAkJCQkJLyogY29sdW1uICovCQlcCi0gIERXQVJGMl9MSU5FX0RFRkFVTFRfSVNfU1RNVCwJCS8qIGlzX3N0bXQgKi8JCVwKLSAgMCwJCQkJCS8qIGJhc2ljX2Jsb2NrICovCVwKLSAgMQkJCQkJLyogZW1wdHlfc2VxdWVuY2UgKi8KLQotc3RhdGljIHN0cnVjdAotICB7Ci0gICAgLyogc3RhdGUgbWFjaGluZSBzdGF0ZSBhcyBwZXIgRFdBUkYyIG1hbnVhbDogKi8KLSAgICBzdHJ1Y3QgZHdhcmYyX3NtCi0gICAgICB7Ci0JYWRkcmVzc1QgYWRkcjsKLQl1bnNpZ25lZCBpbnQgZmlsZW51bTsKLQl1bnNpZ25lZCBpbnQgbGluZTsKLQl1bnNpZ25lZCBpbnQgY29sdW1uOwotCXVuc2lnbmVkIGludAotCSAgaXNfc3RtdCA6IDEsCi0JICBiYXNpY19ibG9jayA6IDEsCi0JICBlbXB0eV9zZXF1ZW5jZSA6IDE7CQkvKiBjdXJyZW50IGNvZGUgc2VxdWVuY2UgaGFzIG5vIERXQVJGMiBkaXJlY3RpdmVzPyAqLwotICAgICAgfQotICAgIHNtOwotCi0gICAgdW5zaWduZWQgaW50Ci0gICAgICBhbnlfZHdhcmYyX2RpcmVjdGl2ZXMgOiAxOwkvKiBkaWQgd2UgZW1pdCBhbnkgRFdBUkYyIGxpbmUgZGVidWcgZGlyZWN0aXZlcz8gKi8KLQotICAgIGZyYWdTICogZnJhZzsJLyogZnJhZyB0aGF0ICJhZGRyIiBpcyByZWxhdGl2ZSB0byAqLwotICAgIHNlZ1QgdGV4dF9zZWc7CS8qIHRleHQgc2VnbWVudCAiYWRkciIgaXMgcmVsYXRpdmUgdG8gKi8KLSAgICBzdWJzZWdUIHRleHRfc3Vic2VnOwotICAgIHNlZ1QgbGluZV9zZWc7CS8qICIuZGVidWdfbGluZSIgc2VnbWVudCAqLwotICAgIGludCBsYXN0X2ZpbGVuYW1lOwkvKiBpbmRleCBvZiBsYXN0IGZpbGVuYW1lIHRoYXQgd2FzIHVzZWQgKi8KLSAgICBpbnQgbnVtX2ZpbGVuYW1lczsJLyogaW5kZXggb2YgbGFzdCBmaWxlbmFtZSBpbiB1c2UgKi8KLSAgICBpbnQgZmlsZW5hbWVfbGVuOwkvKiBsZW5ndGggb2YgdGhlIGZpbGVuYW1lIGFycmF5ICovCi0gICAgc3RydWN0Ci0gICAgICB7Ci0JaW50IGRpcjsJLyogdmFsaWQgYWZ0ZXIgZ2VuX2Rpcl9saXN0KCkgb25seSAqLwotCWNoYXIgKm5hbWU7IC8qIGZ1bGwgcGF0aCBiZWZvcmUgZ2VuX2Rpcl9saXN0KCksIGZpbGVuYW1lIGFmdGVyd2FyZHMgKi8KLSAgICAgIH0KLSAgICAqZmlsZTsKLQotICAgIHN0cnVjdCBkd2FyZjJfbGluZV9pbmZvIGN1cnJlbnQ7CS8qIGN1cnJlbnQgc291cmNlIGluZm86ICovCi0KLSAgICAvKiBjb3VudGVycyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM6ICovCi0gICAgdW5zaWduZWQgaW50IG51bV9saW5lX2VudHJpZXM7Ci0gICAgdW5zaWduZWQgaW50IG9wY29kZV9oaXN0WzI1Nl07CS8qIGhpc3RvZ3JhbSBvZiBvcGNvZGUgZnJlcXVlbmNpZXMgKi8KLSAgfQotbHMgPQotICB7Ci0gICAgewotICAgICAgSU5JVElBTF9TVEFURQotICAgIH0sCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIE5VTEwsCi0gICAgeyBOVUxMLCAwLCAwLCAwLCAwIH0sCi0gICAgMCwKLSAgICB7Ci0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi0gICAgfQotICB9OwotCi0KLS8qIEZ1bmN0aW9uIHByb3RvdHlwZXM6ICovCi1zdGF0aWMgdm9pZCBvdXRfdWxlYjEyOCBQQVJBTVMgKChhZGRyZXNzVCkpOwotc3RhdGljIHZvaWQgb3V0X3NsZWIxMjggUEFSQU1TICgob2Zmc2V0VCkpOwotc3RhdGljIHZvaWQgZ2VuX2FkZHJfbGluZSBQQVJBTVMgKChpbnQsIGFkZHJlc3NUKSk7Ci1zdGF0aWMgdm9pZCByZXNldF9zdGF0ZV9tYWNoaW5lIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG91dF9zZXRfYWRkciBQQVJBTVMgKChhZGRyZXNzVCkpOwotc3RhdGljIHZvaWQgb3V0X2VuZF9zZXF1ZW5jZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldF9maWxlbnVtIFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBnZW5fZGlyX2xpc3QgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2VuX2ZpbGVfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0cyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci0KLQotI2RlZmluZSBvdXRfYnl0ZShieXRlKQlGUkFHX0FQUEVORF8xX0NIQVIoYnl0ZSkKLSNkZWZpbmUgb3V0X29wY29kZShvcGMpCShvdXRfYnl0ZSAoKG9wYykpLCArK2xzLm9wY29kZV9oaXN0WyhvcGMpICYgMHhmZl0pCi0KLS8qIE91dHB1dCBhbiB1bnNpZ25lZCAibGl0dGxlLWVuZGlhbiBiYXNlIDEyOCIgbnVtYmVyLiAgKi8KLXN0YXRpYyB2b2lkCi1vdXRfdWxlYjEyOCAodmFsdWUpCi0gICAgIGFkZHJlc3NUIHZhbHVlOwotewotICB1bnNpZ25lZCBjaGFyIGJ5dGUsIG1vcmUgPSAweDgwOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IHZhbHVlICYgMHg3ZjsKLSAgICAgIHZhbHVlID4+PSA3OwotICAgICAgaWYgKHZhbHVlID09IDApCi0JbW9yZSA9IDA7Ci0gICAgICBvdXRfYnl0ZSAobW9yZSB8IGJ5dGUpOwotICAgIH0KLSAgd2hpbGUgKG1vcmUpOwotfQotCi0vKiBPdXRwdXQgYSBzaWduZWQgImxpdHRsZS1lbmRpYW4gYmFzZSAxMjgiIG51bWJlci4gICovCi1zdGF0aWMgdm9pZAotb3V0X3NsZWIxMjggKHZhbHVlKQotICAgICBvZmZzZXRUIHZhbHVlOwotewotICB1bnNpZ25lZCBjaGFyIGJ5dGUsIG1vcmUgPSAweDgwOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IHZhbHVlICYgMHg3ZjsKLSAgICAgIHZhbHVlID4+PSA3OwotICAgICAgaWYgKCgodmFsdWUgPT0gMCkgJiYgKChieXRlICYgMHg0MCkgPT0gMCkpCi0JICB8fCAoKHZhbHVlID09IC0xKSAmJiAoKGJ5dGUgJiAweDQwKSAhPSAwKSkpCi0JbW9yZSA9IDA7Ci0gICAgICBvdXRfYnl0ZSAobW9yZSB8IGJ5dGUpOwotICAgIH0KLSAgd2hpbGUgKG1vcmUpOwotfQotCi0vKiBFbmNvZGUgYSBwYWlyIG9mIGxpbmUgYW5kIGFkZHJlc3Mgc2tpcHMgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuCi0gICBOb3RlIHRoYXQgdGhlIGxpbmUgc2tpcCBpcyBzaWduZWQsIHdoZXJlYXMgdGhlIGFkZHJlc3Mgc2tpcCBpcwotICAgdW5zaWduZWQuICAqLwotc3RhdGljIHZvaWQKLWdlbl9hZGRyX2xpbmUgKGxpbmVfZGVsdGEsIGFkZHJfZGVsdGEpCi0gICAgIGludCBsaW5lX2RlbHRhOwotICAgICBhZGRyZXNzVCBhZGRyX2RlbHRhOwotewotICB1bnNpZ25lZCBpbnQgdG1wLCBvcGNvZGU7Ci0KLSAgdG1wID0gbGluZV9kZWx0YSAtIERXQVJGMl9MSU5FX0JBU0U7Ci0KLSAgaWYgKHRtcCA+PSBEV0FSRjJfTElORV9SQU5HRSkKLSAgICB7Ci0gICAgICBvdXRfb3Bjb2RlIChEV19MTlNfYWR2YW5jZV9saW5lKTsKLSAgICAgIG91dF9zbGViMTI4IChsaW5lX2RlbHRhKTsKLSAgICAgIHRtcCA9IDAgLSBEV0FSRjJfTElORV9CQVNFOwotICAgICAgbGluZV9kZWx0YSA9IDA7Ci0gICAgfQotCi0gIHRtcCArPSBEV0FSRjJfTElORV9PUENPREVfQkFTRTsKLQotICAvKiB0cnkgdXNpbmcgYSBzcGVjaWFsIG9wY29kZTogKi8KLSAgb3Bjb2RlID0gdG1wICsgYWRkcl9kZWx0YSpEV0FSRjJfTElORV9SQU5HRTsKLSAgaWYgKG9wY29kZSA8PSAyNTUpCi0gICAgewotICAgICAgb3V0X29wY29kZSAob3Bjb2RlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogdHJ5IHVzaW5nIERXX0xOU19jb25zdF9hZGRfcGMgZm9sbG93ZWQgYnkgc3BlY2lhbCBvcDogKi8KLSAgb3Bjb2RlID0gdG1wICsgKGFkZHJfZGVsdGEgLSBNQVhfU1BFQ0lBTF9BRERSX0RFTFRBKSpEV0FSRjJfTElORV9SQU5HRTsKLSAgaWYgKG9wY29kZSA8PSAyNTUpCi0gICAgewotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX2NvbnN0X2FkZF9wYyk7Ci0gICAgICBvdXRfb3Bjb2RlIChvcGNvZGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBvdXRfb3Bjb2RlIChEV19MTlNfYWR2YW5jZV9wYyk7Ci0gIG91dF91bGViMTI4IChhZGRyX2RlbHRhKTsKLQotICBpZiAobGluZV9kZWx0YSkKLSAgICBvdXRfb3Bjb2RlICh0bXApOwkJLyogb3V0cHV0IGxpbmUtZGVsdGEgKi8KLSAgZWxzZQotICAgIG91dF9vcGNvZGUgKERXX0xOU19jb3B5KTsJLyogYXBwZW5kIG5ldyByb3cgd2l0aCBjdXJyZW50IGluZm8gKi8KLX0KLQotc3RhdGljIHZvaWQKLXJlc2V0X3N0YXRlX21hY2hpbmUgKCkKLXsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBkd2FyZjJfc20gaW5pdGlhbF9zdGF0ZSA9IHsgSU5JVElBTF9TVEFURSB9OwotCi0gIGxzLnNtID0gaW5pdGlhbF9zdGF0ZTsKLX0KLQotLyogU2V0IGFuIGFic29sdXRlIGFkZHJlc3MgKG1heSByZXN1bHRzIGluIGEgcmVsb2NhdGlvbiBlbnRyeSk6ICovCi1zdGF0aWMgdm9pZAotb3V0X3NldF9hZGRyIChhZGRyKQotICAgICBhZGRyZXNzVCBhZGRyOwotewotICBzdWJzZWdUIHNhdmVkX3N1YnNlZzsKLSAgc2VnVCBzYXZlZF9zZWc7Ci0gIGV4cHJlc3Npb25TIGV4cHI7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgaW50IGJ5dGVzX3Blcl9hZGRyZXNzOwotCi0gIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgc3Vic2VnX3NldCAobHMudGV4dF9zZWcsIGxzLnRleHRfc3Vic2VnKTsKLSAgc3ltID0gc3ltYm9sX25ldyAoIi5MMFwwMDEiLCBub3dfc2VnLCBhZGRyLCBmcmFnX25vdyk7Ci0KLSAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBieXRlc19wZXJfYWRkcmVzcyA9IGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgLyA4OwotI2Vsc2UKLSAgLyogRklYTUUuICAqLwotICBieXRlc19wZXJfYWRkcmVzcyA9IDQ7Ci0jZW5kaWYKLQotICBvdXRfb3Bjb2RlIChEV19MTlNfZXh0ZW5kZWRfb3ApOwotICBvdXRfdWxlYjEyOCAoYnl0ZXNfcGVyX2FkZHJlc3MgKyAxKTsKLQotICBvdXRfb3Bjb2RlIChEV19MTkVfc2V0X2FkZHJlc3MpOwotICBleHByLlhfb3AgPSBPX3N5bWJvbDsKLSAgZXhwci5YX2FkZF9zeW1ib2wgPSBzeW07Ci0gIGV4cHIuWF9hZGRfbnVtYmVyID0gMDsKLSAgZW1pdF9leHByICgmZXhwciwgYnl0ZXNfcGVyX2FkZHJlc3MpOwotfQotCi0vKiBFbWl0IERXX0xOU19lbmRfc2VxdWVuY2UgYW5kIHJlc2V0IHN0YXRlIG1hY2hpbmUuICBEb2VzIG5vdAotICAgcHJlc2VydmUgdGhlIGN1cnJlbnQgc2VnbWVudC9zdWItc2VnbWVudCEgICovCi1zdGF0aWMgdm9pZAotb3V0X2VuZF9zZXF1ZW5jZSAoKQotewotICBhZGRyZXNzVCBhZGRyLCBkZWx0YTsKLSAgZnJhZ1MgKnRleHRfZnJhZzsKLQotICBpZiAobHMudGV4dF9zZWcpCi0gICAgewotICAgICAgc3Vic2VnX3NldCAobHMudGV4dF9zZWcsIGxzLnRleHRfc3Vic2VnKTsKLSNpZmRlZiBtZF9jdXJyZW50X3RleHRfYWRkcgotICAgICAgYWRkciA9IG1kX2N1cnJlbnRfdGV4dF9hZGRyICgpOwotI2Vsc2UKLSAgICAgIGFkZHIgPSBmcmFnX25vd19maXggKCk7Ci0jZW5kaWYKLSAgICAgIHRleHRfZnJhZyA9IGZyYWdfbm93OwotICAgICAgc3Vic2VnX3NldCAobHMubGluZV9zZWcsIERMX0JPRFkpOwotICAgICAgaWYgKHRleHRfZnJhZyAhPSBscy5mcmFnKQotCXsKLQkgIG91dF9zZXRfYWRkciAoYWRkcik7Ci0JICBscy5zbS5hZGRyID0gYWRkcjsKLQkgIGxzLmZyYWcgPSB0ZXh0X2ZyYWc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRlbHRhID0gKGFkZHIgLSBscy5zbS5hZGRyKSAvIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSDsKLQkgIGlmIChkZWx0YSA+IDApCi0JICAgIHsKLQkgICAgICAvKiBBZHZhbmNlIGFkZHJlc3Mgd2l0aG91dCB1cGRhdGluZyB0aGUgbGluZS1kZWJ1ZwotCQkgbWF0cml4LS0tdGhlIGVuZF9zZXF1ZW5jZSBlbnRyeSBpcyB1c2VkIG9ubHkgdG8gdGVsbAotCQkgdGhlIGRlYnVnZ2VyIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLiovCi0JICAgICAgb3V0X29wY29kZSAoRFdfTE5TX2FkdmFuY2VfcGMpOwotCSAgICAgIG91dF91bGViMTI4IChkZWx0YSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgc3Vic2VnX3NldCAobHMubGluZV9zZWcsIERMX0JPRFkpOwotCi0gIG91dF9vcGNvZGUgKERXX0xOU19leHRlbmRlZF9vcCk7Ci0gIG91dF91bGViMTI4ICgxKTsKLSAgb3V0X2J5dGUgKERXX0xORV9lbmRfc2VxdWVuY2UpOwotCi0gIHJlc2V0X3N0YXRlX21hY2hpbmUgKCk7Ci19Ci0KLS8qIExvb2sgdXAgYSBmaWxlbnVtYmVyIGVpdGhlciBieSBmaWxlbmFtZSBvciBieSBmaWxlbnVtYmVyLiAgSWYgYm90aAotICAgYSBmaWxlbnVtYmVyIGFuZCBhIGZpbGVuYW1lIGFyZSBzcGVjaWZpZWQsIGxvb2t1cCBieSBmaWxlbmFtZSB0YWtlcwotICAgcHJlY2VkZW5jZS4gIElmIHRoZSBmaWxlbmFtZSBjYW5ub3QgYmUgZm91bmQsIGl0IGlzIGFkZGVkIHRvIHRoZQotICAgZmlsZXRhYmxlIGFuZCB0aGUgZmlsZW51bWJlciBmb3IgdGhlIG5ldyBlbnRyeSBpcyByZXR1cm5lZC4gICovCi1zdGF0aWMgaW50Ci1nZXRfZmlsZW51bSAoZmlsZW51bSwgZmlsZSkKLSAgICAgaW50IGZpbGVudW07Ci0gICAgIGNoYXIgKmZpbGU7Ci17Ci0gIGludCBpLCBsYXN0ID0gZmlsZW51bSAtIDE7Ci0gIGNoYXIgY2hhcjAgPSBmaWxlWzBdOwotCi0gIC8qIElmIGZpbGVudW0gaXMgb3V0IG9mIHJhbmdlIG9mIHRoZSBmaWxlbmFtZSB0YWJsZSwgdGhlbiB0cnkgdXNpbmcgdGhlCi0gICAgIHRhYmxlIGVudHJ5IHJldHVybmVkIGZyb20gdGhlIHByZXZpb3VzIGNhbGwuICAqLwotICBpZiAobGFzdCA+PSBscy5udW1fZmlsZW5hbWVzIHx8IGxhc3QgPCAwKQotICAgIGxhc3QgPSBscy5sYXN0X2ZpbGVuYW1lOwotCi0gIC8qIERvIGEgcXVpY2sgY2hlY2sgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIG9yIHByZXZpb3VzbHkgdXNlZCBmaWxlbnVtLiAgKi8KLSAgaWYgKGxzLm51bV9maWxlbmFtZXMgPiAwICYmIGxzLmZpbGVbbGFzdF0ubmFtZVswXSA9PSBjaGFyMAotICAgICAgJiYgc3RyY21wIChscy5maWxlW2xhc3RdLm5hbWUgKyAxLCBmaWxlICsgMSkgPT0gMCkKLSAgICByZXR1cm4gbGFzdCArIDE7Ci0KLSAgLyogbm8gbWF0Y2gsIGZhbGwgYmFjayB0byBzaW1wbGUgbGluZWFyIHNjYW46ICovCi0gIGZvciAoaSA9IDA7IGkgPCBscy5udW1fZmlsZW5hbWVzOyArK2kpCi0gICAgewotICAgICAgaWYgKGxzLmZpbGVbaV0ubmFtZVswXSA9PSBjaGFyMAotCSAgJiYgc3RyY21wIChscy5maWxlW2ldLm5hbWUgKyAxLCBmaWxlICsgMSkgPT0gMCkKLQl7Ci0JICBscy5sYXN0X2ZpbGVuYW1lID0gaTsKLQkgIHJldHVybiBpICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIG5vIG1hdGNoOiBlbnRlciBuZXcgZmlsZW5hbWUgKi8KLSAgaWYgKGxzLm51bV9maWxlbmFtZXMgPj0gbHMuZmlsZW5hbWVfbGVuKQotICAgIHsKLSAgICAgIGxzLmZpbGVuYW1lX2xlbiArPSAxMzsKLSAgICAgIGxzLmZpbGUgPSB4cmVhbGxvYyAobHMuZmlsZSwgbHMuZmlsZW5hbWVfbGVuICogc2l6ZW9mIChscy5maWxlWzBdKSk7Ci0gICAgfQotICBscy5maWxlW2xzLm51bV9maWxlbmFtZXNdLmRpciA9IDA7Ci0gIGxzLmZpbGVbbHMubnVtX2ZpbGVuYW1lc10ubmFtZSA9IGZpbGU7Ci0gIGxzLmxhc3RfZmlsZW5hbWUgPSBscy5udW1fZmlsZW5hbWVzOwotICByZXR1cm4gKytscy5udW1fZmlsZW5hbWVzOwotfQotCi0vKiBFbWl0IGFuIGVudHJ5IGluIHRoZSBsaW5lIG51bWJlciB0YWJsZSBpZiB0aGUgYWRkcmVzcyBvciBsaW5lIGhhcyBjaGFuZ2VkLgotICAgQUREUiBpcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBmcmFnIGluIHRoZSB0ZXh0IHNlY3Rpb24uICAqLwotCi12b2lkCi1kd2FyZjJfZ2VuX2xpbmVfaW5mbyAoYWRkciwgbCkKLSAgICAgYWRkcmVzc1QgYWRkcjsKLSAgICAgc3RydWN0IGR3YXJmMl9saW5lX2luZm8gKmw7Ci17Ci0gIHVuc2lnbmVkIGludCBmaWxlbnVtID0gbC0+ZmlsZW51bTsKLSAgdW5zaWduZWQgaW50IGFueV9vdXRwdXQgPSAwOwotICBzdWJzZWdUIHNhdmVkX3N1YnNlZzsKLSAgc2VnVCBzYXZlZF9zZWc7Ci0gIGZyYWdTICpzYXZlZF9mcmFnOwotCi0gIGlmIChmbGFnX2RlYnVnKQotICAgIGZwcmludGYgKHN0ZGVyciwgImxpbmU6IGFkZHIgJWx4IGZpbGUgYCVzJyBsaW5lICV1IGNvbCAldSBmbGFncyAleFxuIiwKLQkgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLCBsLT5maWxlbmFtZSwgbC0+bGluZSwgbC0+Y29sdW1uLCBsLT5mbGFncyk7Ci0KLSAgaWYgKGZpbGVudW0gPiAwICYmICFsLT5maWxlbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoZmlsZW51bSA+PSAodW5zaWduZWQgaW50KSBscy5udW1fZmlsZW5hbWVzKQotCXsKLQkgIGFzX3dhcm4gKCJFbmNvdW50ZXJlZCBiYWQgZmlsZSBudW1iZXIgaW4gbGluZSBudW1iZXIgZGVidWcgaW5mbyEiKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChsLT5maWxlbmFtZSkKLSAgICBmaWxlbnVtID0gZ2V0X2ZpbGVudW0gKGZpbGVudW0sIGwtPmZpbGVuYW1lKTsKLSAgZWxzZQotICAgIHJldHVybjsJLyogbm8gZmlsZW5hbWUsIG5vIGZpbG51bSA9PiBubyBwbGF5ICovCi0KLSAgLyogTXVzdCBzYXZlIHRoZXNlIGJlZm9yZSB0aGUgc3Vic2VnX25ldyBjYWxsLCBhcyB0aGF0IGNhbGwgd2lsbCBjaGFuZ2UKLSAgICAgdGhlbS4gICovCi0gIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHNhdmVkX2ZyYWcgPSBmcmFnX25vdzsKLQotICBpZiAoIWxzLmxpbmVfc2VnKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBzeW1ib2xTICpzZWNzeW07Ci0jZW5kaWYKLQotICAgICAgbHMubGluZV9zZWcgPSBzdWJzZWdfbmV3ICgiLmRlYnVnX2xpbmUiLCAwKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBscy5saW5lX3NlZywgU0VDX1JFQURPTkxZKTsKLQotICAgICAgLyogV2UncmUgZ29pbmcgdG8gbmVlZCB0aGlzIHN5bWJvbC4gICovCi0gICAgICBzZWNzeW0gPSBzeW1ib2xfZmluZCAoIi5kZWJ1Z19saW5lIik7Ci0gICAgICBpZiAoc2Vjc3ltICE9IE5VTEwpCi0gICAgICAgIHN5bWJvbF9zZXRfYmZkc3ltIChzZWNzeW0sIGxzLmxpbmVfc2VnLT5zeW1ib2wpOwotICAgICAgZWxzZQotICAgICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAobHMubGluZV9zZWcpKTsKLSNlbmRpZgotICAgIH0KLQotICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfQk9EWSk7Ci0KLSAgaWYgKGxzLnRleHRfc2VnICE9IHNhdmVkX3NlZyB8fCBscy50ZXh0X3N1YnNlZyAhPSBzYXZlZF9zdWJzZWcpCi0gICAgewotICAgICAgaWYgKCFscy5zbS5lbXB0eV9zZXF1ZW5jZSkKLQl7Ci0JICBvdXRfZW5kX3NlcXVlbmNlICgpOwkJLyogdGVybWluYXRlIHByZXZpb3VzIHNlcXVlbmNlICovCi0JICBscy5zbS5lbXB0eV9zZXF1ZW5jZSA9IDE7Ci0JfQotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBscy50ZXh0X3NlZyA9IHNhdmVkX3NlZzsKLSAgICAgIGxzLnRleHRfc3Vic2VnID0gc2F2ZWRfc3Vic2VnOwotICAgICAgb3V0X3NldF9hZGRyIChhZGRyKTsKLSAgICAgIGxzLnNtLmFkZHIgPSBhZGRyOwotICAgICAgbHMuZnJhZyA9IHNhdmVkX2ZyYWc7Ci0gICAgfQotCi0gIGlmIChscy5zbS5maWxlbnVtICE9IGZpbGVudW0pCi0gICAgewotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBvdXRfb3Bjb2RlIChEV19MTlNfc2V0X2ZpbGUpOwotICAgICAgb3V0X3VsZWIxMjggKGZpbGVudW0pOwotICAgICAgbHMuc20uZmlsZW51bSA9IGZpbGVudW07Ci0gICAgfQotCi0gIGlmIChscy5zbS5jb2x1bW4gIT0gbC0+Y29sdW1uKQotICAgIHsKLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX3NldF9jb2x1bW4pOwotICAgICAgb3V0X3VsZWIxMjggKGwtPmNvbHVtbik7Ci0gICAgICBscy5zbS5jb2x1bW4gPSBsLT5jb2x1bW47Ci0gICAgfQotCi0gIGlmICgoKGwtPmZsYWdzICYgRFdBUkYyX0ZMQUdfQkVHSU5fU1RNVCkgIT0gMCkgIT0gbHMuc20uaXNfc3RtdCkKLSAgICB7Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19uZWdhdGVfc3RtdCk7Ci0gICAgfQotCi0gIGlmIChsLT5mbGFncyAmIERXQVJGMl9GTEFHX0JFR0lOX0JMT0NLKQotICAgIHsKLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX3NldF9iYXNpY19ibG9jayk7Ci0gICAgfQotCi0gIGlmIChscy5zbS5saW5lICE9IGwtPmxpbmUpCi0gICAgewotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBpZiAoc2F2ZWRfZnJhZyAhPSBscy5mcmFnKQotCXsKLQkgIC8qIElmIGEgbmV3IGZyYWcgZ290IGFsbG9jYXRlZCAoZm9yIHdoYXRldmVyIHJlYXNvbiksIHRoZW4KLQkgICAgIGRlYWwgd2l0aCBpdCBieSBnZW5lcmF0aW5nIGEgcmVmZXJlbmNlIHN5bWJvbC4gIE5vdGU6IG5vCi0JICAgICBlbmRfc2VxdWVuY2UgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIGFkZHJlc3MgZGlkCi0JICAgICBub3QgcmVhbGx5IGRlY3JlYXNlIChvbmx5IHRoZSByZWZlcmVuY2UgcG9pbnQgY2hhbmdlZCkuICAqLwotCSAgb3V0X3NldF9hZGRyIChhZGRyKTsKLQkgIGxzLnNtLmFkZHIgPSBhZGRyOwotCSAgbHMuZnJhZyA9IHNhdmVkX2ZyYWc7Ci0JfQotICAgICAgZ2VuX2FkZHJfbGluZSAobC0+bGluZSAtIGxzLnNtLmxpbmUsCi0JCSAgICAgKGFkZHIgLSBscy5zbS5hZGRyKSAvIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSCk7Ci0gICAgICBscy5zbS5iYXNpY19ibG9jayA9IDA7Ci0gICAgICBscy5zbS5saW5lID0gbC0+bGluZTsKLSAgICAgIGxzLnNtLmFkZHIgPSBhZGRyOwotICAgIH0KLQotICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci0KLSAgbHMubnVtX2xpbmVfZW50cmllcyArPSBhbnlfb3V0cHV0OwotICBpZiAoYW55X291dHB1dCkKLSAgICBscy5zbS5lbXB0eV9zZXF1ZW5jZSA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZGlyX2xpc3QgKCkKLXsKLSAgY2hhciAqc3RyLCAqc2xhc2gsICpkaXJfbGlzdCwgKmRwLCAqY3A7Ci0gIGludCBpLCBqLCBudW1fZGlyczsKLQotICBkaXJfbGlzdCA9IGZyYWdfbW9yZSAoMCk7Ci0gIG51bV9kaXJzID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgbHMubnVtX2ZpbGVuYW1lczsgKytpKQotICAgIHsKLSAgICAgIHN0ciA9IGxzLmZpbGVbaV0ubmFtZTsKLSAgICAgIHNsYXNoID0gc3RycmNociAoc3RyLCAnLycpOwotICAgICAgaWYgKHNsYXNoKQotCXsKLQkgICpzbGFzaCA9ICdcMCc7Ci0JICBmb3IgKGogPSAwLCBkcCA9IGRpcl9saXN0OyBqIDwgbnVtX2RpcnM7ICsraikKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKHN0ciwgZHApID09IDApCi0JCXsKLQkJICBscy5maWxlW2ldLmRpciA9IGogKyAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZHAgKz0gc3RybGVuIChkcCk7Ci0JICAgIH0KLQkgIGlmIChqID49IG51bV9kaXJzKQotCSAgICB7Ci0JICAgICAgLyogZGlkbid0IGZpbmQgdGhpcyBkaXJlY3Rvcnk6IGFwcGVuZCBpdCB0byB0aGUgbGlzdCAqLwotCSAgICAgIHNpemVfdCBzaXplID0gc3RybGVuIChzdHIpICsgMTsKLQkgICAgICBjcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0JICAgICAgbWVtY3B5IChjcCwgc3RyLCBzaXplKTsKLQkgICAgICBscy5maWxlW2ldLmRpciA9ICsrbnVtX2RpcnM7Ci0JICAgIH0KLQkgICpzbGFzaCA9ICcvJzsKLQkgIGxzLmZpbGVbaV0ubmFtZSA9IHNsYXNoICsgMTsKLQl9Ci0gICAgfQotICBvdXRfYnl0ZSAoJ1wwJyk7CS8qIHRlcm1pbmF0ZSBkaXJlY3RvcnkgbGlzdCAqLwotfQotCi1zdGF0aWMgdm9pZAotZ2VuX2ZpbGVfbGlzdCAoKQotewotICBzaXplX3Qgc2l6ZTsKLSAgY2hhciAqY3A7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBscy5udW1fZmlsZW5hbWVzOyArK2kpCi0gICAgewotICAgICAgc2l6ZSA9IHN0cmxlbiAobHMuZmlsZVtpXS5uYW1lKSArIDE7Ci0gICAgICBjcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0gICAgICBtZW1jcHkgKGNwLCBscy5maWxlW2ldLm5hbWUsIHNpemUpOwotCi0gICAgICBvdXRfdWxlYjEyOCAobHMuZmlsZVtpXS5kaXIpOwkvKiBkaXJlY3RvcnkgbnVtYmVyICovCi0gICAgICBvdXRfdWxlYjEyOCAoMCk7CQkJLyogbGFzdCBtb2RpZmljYXRpb24gdGltZXN0YW1wICovCi0gICAgICBvdXRfdWxlYjEyOCAoMCk7CQkJLyogZmlsZXNpemUgKi8KLSAgICB9Ci0gIG91dF9ieXRlICgwKTsJCS8qIHRlcm1pbmF0ZSBmaWxlbmFtZSBsaXN0ICovCi19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0cyAodG90YWxfc2l6ZSkKLSAgICAgdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOwotewotICBzdGF0aWMgY29uc3QgY2hhciAqb3BjX25hbWVbXSA9Ci0gICAgewotICAgICAgImV4dGVuZGVkIiwgImNvcHkiLCAiYWR2YW5jZV9wYyIsICJhZHZhbmNlX2xpbmUiLCAic2V0X2ZpbGUiLAotICAgICAgInNldF9jb2x1bW4iLCAibmVnYXRlX3N0bXQiLCAic2V0X2Jhc2ljX2Jsb2NrIiwgImNvbnN0X2FkZF9wYyIsCi0gICAgICAiZml4ZWRfYWR2YW5jZV9wYyIKLSAgICB9OwotICBzaXplX3QgaTsKLSAgaW50IGo7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiQXZlcmFnZSBzaXplOiAlZyBieXRlcy9saW5lXG4iLAotCSAgIHRvdGFsX3NpemUgLyAoZG91YmxlKSBscy5udW1fbGluZV9lbnRyaWVzKTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJcblN0YW5kYXJkIG9wY29kZSBoaXN0b2dyYW06XG4iKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcGNfbmFtZSkvc2l6ZW9mIChvcGNfbmFtZVswXSk7ICsraSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsIG9wY19uYW1lW2ldKTsKLSAgICAgIGZvciAoaiA9IHN0cmxlbiAob3BjX25hbWVbaV0pOyBqIDwgMTY7ICsraikKLQlmcHJpbnRmIChzdGRlcnIsICIgIik7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6ICV1XG4iLCBscy5vcGNvZGVfaGlzdFtpXSk7Ci0gICAgfQotCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuU3BlY2lhbCBvcGNvZGVzOlxuYWRkclx0XHRcdFx0bGluZSBza2lwXG4iKTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJza2lwOiAiKTsKLSAgZm9yIChqID0gRFdBUkYyX0xJTkVfQkFTRTsgaiA8IERXQVJGMl9MSU5FX0JBU0UgKyBEV0FSRjJfTElORV9SQU5HRTsgKytqKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiUzZCIsIGopOwotICBmcHJpbnRmIChzdGRlcnIsICJcbi0tLS0tIik7Ci0KLSAgZm9yICg7IGkgPCAyNTY7ICsraSkKLSAgICB7Ci0gICAgICBqID0gU1BFQ0lBTF9MSU5FIChpKTsKLSAgICAgIGlmIChqID09IERXQVJGMl9MSU5FX0JBU0UpCi0JZnByaW50ZiAoc3RkZXJyLCAiXG4lNHU6ICIsCi0JCSAoKHVuc2lnbmVkIGludCkKLQkJICBEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEggKiBTUEVDSUFMX0FERFIgKGkpKSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgJTJ1IiwgbHMub3Bjb2RlX2hpc3RbaV0pOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotdm9pZAotZHdhcmYyX2ZpbmlzaCAoKQotewotICBhZGRyZXNzVCBib2R5X3NpemUsIHRvdGFsX3NpemUsIHByb2xvZ19zaXplOwotICBzdWJzZWdUIHNhdmVkX3N1YnNlZzsKLSAgc2VnVCBzYXZlZF9zZWc7Ci0gIGNoYXIgKmNwOwotCi0gIGlmICghbHMubGluZV9zZWcpCi0gICAgLyogbm8gLmRlYnVnX2xpbmUgc2VnbWVudCwgbm8gd29yayB0byBkby4uLiAqLwotICAgIHJldHVybjsKLQotICBzYXZlZF9zZWcgPSBub3dfc2VnOwotICBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0gIGlmICghbHMuc20uZW1wdHlfc2VxdWVuY2UpCi0gICAgb3V0X2VuZF9zZXF1ZW5jZSAoKTsKLSAgdG90YWxfc2l6ZSA9IGJvZHlfc2l6ZSA9IGZyYWdfbm93X2ZpeCAoKTsKLQotICAvKiBub3cgZ2VuZXJhdGUgdGhlIGRpcmVjdG9yeSBhbmQgZmlsZSBsaXN0czogKi8KLSAgc3Vic2VnX3NldCAobHMubGluZV9zZWcsIERMX0ZJTEVTKTsKLSAgZ2VuX2Rpcl9saXN0ICgpOwotICBnZW5fZmlsZV9saXN0ICgpOwotICB0b3RhbF9zaXplICs9IGZyYWdfbm93X2ZpeCAoKTsKLQotICAvKiBhbmQgbm93IHRoZSBoZWFkZXIgKCJzdGF0ZW1lbnQgcHJvZ3JhbSBwcm9sb2ciLCBpbiBEV0FSRjIgbGluZ28uLi4pICovCi0gIHN1YnNlZ19zZXQgKGxzLmxpbmVfc2VnLCBETF9QUk9MT0cpOwotCi0gIGNwID0gZnJhZ19tb3JlICgxNSArIERXQVJGMl9MSU5FX09QQ09ERV9CQVNFIC0gMSk7Ci0KLSAgdG90YWxfc2l6ZSArPSBmcmFnX25vd19maXggKCk7Ci0gIHByb2xvZ19zaXplID0gdG90YWxfc2l6ZSAtIGJvZHlfc2l6ZSAtIDEwOwotCi0jIGRlZmluZSBTVFVGRih2YWwsc2l6ZSkJbWRfbnVtYmVyX3RvX2NoYXJzIChjcCwgdmFsLCBzaXplKTsgY3AgKz0gc2l6ZTsKLSAgU1RVRkYgKHRvdGFsX3NpemUgLSA0LCA0KTsJLyogbGVuZ3RoICovCi0gIFNUVUZGICgyLCAyKTsJCQkvKiB2ZXJzaW9uICovCi0gIFNUVUZGIChwcm9sb2dfc2l6ZSwgNCk7CS8qIHByb2xvZ3VlX2xlbmd0aCAqLwotICBTVFVGRiAoRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RILCAxKTsKLSAgU1RVRkYgKERXQVJGMl9MSU5FX0RFRkFVTFRfSVNfU1RNVCwgMSk7Ci0gIFNUVUZGIChEV0FSRjJfTElORV9CQVNFLCAxKTsKLSAgU1RVRkYgKERXQVJGMl9MSU5FX1JBTkdFLCAxKTsKLSAgU1RVRkYgKERXQVJGMl9MSU5FX09QQ09ERV9CQVNFLCAxKTsKLQotICAvKiBzdGFuZGFyZF9vcGNvZGVfbGVuZ3RoczogKi8KLSAgU1RVRkYgKDAsIDEpOwkJCS8qIERXX0xOU19jb3B5ICovCi0gIFNUVUZGICgxLCAxKTsJCQkvKiBEV19MTlNfYWR2YW5jZV9wYyAqLwotICBTVFVGRiAoMSwgMSk7CQkJLyogRFdfTE5TX2FkdmFuY2VfbGluZSAqLwotICBTVFVGRiAoMSwgMSk7CQkJLyogRFdfTE5TX3NldF9maWxlICovCi0gIFNUVUZGICgxLCAxKTsJCQkvKiBEV19MTlNfc2V0X2NvbHVtbiAqLwotICBTVFVGRiAoMCwgMSk7CQkJLyogRFdfTE5TX25lZ2F0ZV9zdG10ICovCi0gIFNUVUZGICgwLCAxKTsJCQkvKiBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrICovCi0gIFNUVUZGICgwLCAxKTsJCQkvKiBEV19MTlNfY29uc3RfYWRkX3BjICovCi0gIFNUVUZGICgxLCAxKTsJCQkvKiBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYyAqLwotCi0gIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKLQotICBpZiAoZmxhZ19kZWJ1ZykKLSAgICBwcmludF9zdGF0cyAodG90YWxfc2l6ZSk7Ci19Ci0KLXZvaWQKLWR3YXJmMl9kaXJlY3RpdmVfZmlsZSAoZHVtbXkpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgbGVuOwotCi0gIC8qIENvbnRpbnVlIHRvIGFjY2VwdCBhIGJhcmUgc3RyaW5nIGFuZCBwYXNzIGl0IG9mZi4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotICAgIHsKLSAgICAgIHNfYXBwX2ZpbGUgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBscy5hbnlfZHdhcmYyX2RpcmVjdGl2ZXMgPSAxOwotCi0gIGlmIChkZWJ1Z190eXBlID09IERFQlVHX05PTkUpCi0gICAgLyogQXV0b21hdGljYWxseSB0dXJuIG9uIERXQVJGMiBkZWJ1ZyBpbmZvIHVubGVzcyBzb21ldGhpbmcgZWxzZQotICAgICAgIGhhcyBiZWVuIHNlbGVjdGVkLiAgKi8KLSAgICBkZWJ1Z190eXBlID0gREVCVUdfRFdBUkYyOwotCi0gIGxzLmN1cnJlbnQuZmlsZW51bSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBscy5jdXJyZW50LmZpbGVuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLWR3YXJmMl9kaXJlY3RpdmVfbG9jIChkdW1teSkKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGxzLmFueV9kd2FyZjJfZGlyZWN0aXZlcyA9IDE7Ci0KLSAgbHMuY3VycmVudC5maWxlbnVtID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbHMuY3VycmVudC5saW5lID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbHMuY3VycmVudC5jb2x1bW4gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBscy5jdXJyZW50LmZsYWdzID0gRFdBUkYyX0ZMQUdfQkVHSU5fU1RNVDsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGlmIChsaXN0aW5nKQotICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKGxzLmN1cnJlbnQubGluZSk7Ci0jZW5kaWYKLX0KLQotdm9pZAotZHdhcmYyX3doZXJlIChsaW5lKQotICAgICBzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyAqbGluZTsKLXsKLSAgaWYgKGxzLmFueV9kd2FyZjJfZGlyZWN0aXZlcykKLSAgICAqbGluZSA9IGxzLmN1cnJlbnQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193aGVyZSAoJmxpbmUtPmZpbGVuYW1lLCAmbGluZS0+bGluZSk7Ci0gICAgICBsaW5lLT5maWxlbnVtID0gMDsKLSAgICAgIGxpbmUtPmNvbHVtbiA9IDA7Ci0gICAgICBsaW5lLT5mbGFncyA9IERXQVJGMl9GTEFHX0JFR0lOX1NUTVQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL2R3YXJmMmRiZy5oIGIvZ2FzL2R3YXJmMmRiZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2VlYzFjLi4wMDAwMDAwCi0tLSBhL2dhcy9kd2FyZjJkYmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qIGR3YXJmMmRiZy5oIC0gRFdBUkYyIGRlYnVnIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBBU19EV0FSRjJEQkdfSAotI2RlZmluZSBBU19EV0FSRjJEQkdfSAotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2RlZmluZSBEV0FSRjJfRkxBR19CRUdJTl9TVE1UCSgxIDw8IDApCS8qIGJlZ2lubmluZyBvZiBzdGF0ZW1lbnQgKi8KLSNkZWZpbmUgRFdBUkYyX0ZMQUdfQkVHSU5fQkxPQ0sJKDEgPDwgMSkJLyogYmVnaW5uaW5nIG9mIGJhc2ljIGJsb2NrICovCi0KLXN0cnVjdCBkd2FyZjJfbGluZV9pbmZvCi0gIHsKLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgZmlsZW51bTsKLSAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICAgIHVuc2lnbmVkIGludCBmbGFnczsKLSAgfTsKLQotLyogSW1wbGVtZW50cyB0aGUgLmZpbGUgRklMRU5PICJGSUxFTkFNRSIgZGlyZWN0aXZlLiAgRklMRU5PIGNhbiBiZSAwCi0gICB0byBpbmRpY2F0ZSB0aGF0IG5vIGZpbGUgbnVtYmVyIGhhcyBiZWVuIGFzc2lnbmVkLiAgQWxsIHJlYWwgZmlsZQotICAgbnVtYmVyIG11c3QgYmUgPjAuICAqLwotZXh0ZXJuIHZvaWQgZHdhcmYyX2RpcmVjdGl2ZV9maWxlIFBBUkFNUyAoKGludCBkdW1teSkpOwotCi0vKiBJbXBsZW1lbnRzIHRoZSAubG9jIEZJTEVOTyBMSU5FTk8gW0NPTFVNTl0gZGlyZWN0aXZlLiAgRklMRU5PIGlzCi0gICB0aGUgZmlsZSBudW1iZXIsIExJTkVOTyB0aGUgbGluZSBudW1iZXIgYW5kIHRoZSAob3B0aW9uYWwpIENPTFVNTgotICAgdGhlIGNvbHVtbiBvZiB0aGUgc291cmNlIGNvZGUgdGhhdCB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uCi0gICBjb3JyZXNwb25kcyB0by4gIEZJTEVOTyBjYW4gYmUgMCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlbmFtZQotICAgc3BlY2lmaWVkIGJ5IHRoZSB0ZXh0dWFsbHkgbW9zdCByZWNlbnQgLmZpbGUgZGlyZWN0aXZlIHNob3VsZCBiZQotICAgdXNlZC4gICovCi1leHRlcm4gdm9pZCBkd2FyZjJfZGlyZWN0aXZlX2xvYyBQQVJBTVMgKChpbnQgZHVtbXkpKTsKLQotLyogUmV0dXJucyB0aGUgY3VycmVudCBzb3VyY2UgaW5mb3JtYXRpb24uICBJZiAuZmlsZSBkaXJlY3RpdmVzIGhhdmUKLSAgIGJlZW4gZW5jb3VudGVyZWQsIHRoZSBpbmZvIGZvciB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZSBpcwotICAgcmV0dXJuZWQuICBPdGhlcndpc2UsIHRoZSBpbmZvIGZvciB0aGUgYXNzZW1ibHkgc291cmNlIGZpbGUgaXMKLSAgIHJldHVybmVkLiAgKi8KLWV4dGVybiB2b2lkIGR3YXJmMl93aGVyZSBQQVJBTVMgKChzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyAqbCkpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyAuZGVidWdfbGluZSBpbmZvIGJhc2VkIG9uIHRoZSBhZGRyZXNzIGFuZAotICAgc291cmNlIGluZm9ybWF0aW9uIHBhc3NlZCBpbiB0aGUgYXJndW1lbnRzLiAgQUREUiBzaG91bGQgYmUgdGhlCi0gICBmcmFnLXJlbGF0aXZlIG9mZnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGhlIGluZm9ybWF0aW9uIGlzIGZvciBhbmQKLSAgIEwgaXMgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhhdAotICAgYWRkcmVzcy4gKi8KLWV4dGVybiB2b2lkIGR3YXJmMl9nZW5fbGluZV9pbmZvIFBBUkFNUyAoKGFkZHJlc3NUIGFkZHIsCi0JCQkJCSAgc3RydWN0IGR3YXJmMl9saW5lX2luZm8gKmwpKTsKLQotLyogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIG90aGVyIGlucHV0IGlzIHByb2Nlc3NlZCB0byBmaW5pc2ggdXAgdGhlCi0gICAuZGVidWdfbGluZSBzZWN0aW9uLiAgKi8KLWV4dGVybiB2b2lkIGR3YXJmMl9maW5pc2ggUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogQVNfRFdBUkYyREJHX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9lY29mZi5jIGIvZ2FzL2Vjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNmM4YzQuLjAwMDAwMDAKLS0tIGEvZ2FzL2Vjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzE4ICswLDAgQEAKLS8qIEVDT0ZGIGRlYnVnZ2luZyBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFRoaXMgZmlsZSB3YXMgcHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4gIEEKLSAgIGdvb2QgZGVhbCBvZiBpdCBjb21lcyBkaXJlY3RseSBmcm9tIG1pcHMtdGZpbGUuYywgYnkgTWljaGFlbAotICAgTWVpc3NuZXIgPG1laXNzbmVyQG9zZi5vcmc+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0vKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgY29uZGl0aW9uYWxseSBmb3IgdGhvc2UgdGFyZ2V0cyB3aGljaCB1c2UKLSAgIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAoZS5nLiwgTUlQUyBFQ09GRiwgTUlQUyBFTEYsIEFscGhhCi0gICBFQ09GRikuICAqLwotCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBXaHkgaXNuJ3QgdGhpcyBpbiBjb2ZmL3N5bS5oPyAgKi8KLSNkZWZpbmUgU1RfUkZERVNDQVBFIDB4ZmZmCi0KLS8qIFRoaXMgZmlsZSBjb25zdHJ1Y3RzIHRoZSBpbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSBFQ09GRiBkZWJ1Z2dpbmcKLSAgIGZvcm1hdC4gIEl0IGp1c3QgYnVpbGRzIGEgbGFyZ2UgYmxvY2sgb2YgZGF0YS4KLQotICAgV2Ugc3VwcG9ydCBib3RoIEVDT0ZGIHN0eWxlIGRlYnVnZ2luZyBhbmQgc3RhYnMgZGVidWdnaW5nICh0aGUKLSAgIHN0YWJzIHN5bWJvbHMgYXJlIGVuY2Fwc3VsYXRlZCBpbiBFQ09GRiBzeW1ib2xzKS4gIFRoaXMgc2hvdWxkIGxldAotICAgdXMgaGFuZGxlIGFueXRoaW5nIHRoZSBjb21waWxlciBtaWdodCB0aHJvdyBhdCB1cy4gICovCi0KLS8qIEhlcmUgaXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgTUlQUyBFQ09GRiBzeW1ib2wgdGFibGUsIGJ5Ci0gICBNaWNoYWVsIE1laXNzbmVyLiAgVGhlIE1JUFMgc3ltYm9sIHRhYmxlIGhhcyB0aGUgZm9sbG93aW5nIHBpZWNlczoKLQotCVN5bWJvbGljIEhlYWRlcgotCSAgICB8Ci0JICAgICstLQlBdXhpbGlhcnkgU3ltYm9scwotCSAgICB8Ci0JICAgICstLQlEZW5zZSBudW1iZXIgdGFibGUKLQkgICAgfAotCSAgICArLS0JT3B0aW1pemVyIFN5bWJvbHMKLQkgICAgfAotCSAgICArLS0JRXh0ZXJuYWwgU3RyaW5ncwotCSAgICB8Ci0JICAgICstLQlFeHRlcm5hbCBTeW1ib2xzCi0JICAgIHwKLQkgICAgKy0tCVJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvcnMKLQkgICAgfAotCSAgICArLS0JRmlsZSB0YWJsZQotCQkgICAgfAotCQkgICAgKy0tCVByb2NlZHVyZSB0YWJsZQotCQkgICAgfAotCQkgICAgKy0tCUxpbmUgbnVtYmVyIHRhYmxlCi0JCSAgICB8Ci0JCSAgICArLS0JTG9jYWwgU3RyaW5ncwotCQkgICAgfAotCQkgICAgKy0tCUxvY2FsIFN5bWJvbHMKLQotICAgVGhlIHN5bWJvbGljIGhlYWRlciBwb2ludHMgdG8gZWFjaCBvZiB0aGUgb3RoZXIgdGFibGVzLCBhbmQgYWxzbwotICAgY29udGFpbnMgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgSXQgYWxzbyBjb250YWlucyBhIG1hZ2ljIG51bWJlcgotICAgYW5kIE1JUFMgY29tcGlsZXIgdmVyc2lvbiBudW1iZXIsIHN1Y2ggYXMgMi4wLgotCi0gICBUaGUgYXV4aWxpYXJ5IHRhYmxlIGlzIGEgc2VyaWVzIG9mIDMyIGJpdCBpbnRlZ2VycywgdGhhdCBhcmUKLSAgIHJlZmVyZW5jZWQgYXMgbmVlZGVkIGZyb20gdGhlIGxvY2FsIHN5bWJvbCB0YWJsZS4gIFVubGlrZSBzdGFuZGFyZAotICAgQ09GRiwgdGhlIGF1eC4gIGluZm9ybWF0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgc3ltYm9sIHRoYXQgdXNlcwotICAgaXQsIGJ1dCByYXRoZXIgaXMgYSBzZXBhcmF0ZSB0YWJsZS4gIEluIHRoZW9yeSwgdGhpcyB3b3VsZCBhbGxvdwotICAgdGhlIE1JUFMgY29tcGlsZXJzIHRvIGNvbGxhcHNlIGR1cGxpY2F0ZSBhdXguIGVudHJpZXMsIGJ1dCBJJ3ZlIG5vdAotICAgbm90aWNlZCB0aGlzIGhhcHBlbmluZyB3aXRoIHRoZSAxLjMxIGNvbXBpbGVyIHN1aXRlLiAgVGhlIGRpZmZlcmVudAotICAgdHlwZXMgb2YgYXV4LiBlbnRyaWVzIGFyZToKLQotICAgIDEpCWRuTG93OiBMb3cgYm91bmQgb24gYXJyYXkgZGltZW5zaW9uLgotCi0gICAgMikJZG5IaWdoOiBIaWdoIGJvdW5kIG9uIGFycmF5IGRpbWVuc2lvbi4KLQotICAgIDMpCWlzeW06IEluZGV4IHRvIHRoZSBsb2NhbCBzeW1ib2wgd2hpY2ggaXMgdGhlIHN0YXJ0IG9mIHRoZQotCWZ1bmN0aW9uIGZvciB0aGUgZW5kIG9mIGZ1bmN0aW9uIGZpcnN0IGF1eC4gZW50cnkuCi0KLSAgICA0KQl3aWR0aDogV2lkdGggb2Ygc3RydWN0dXJlcyBhbmQgYml0ZmllbGRzLgotCi0gICAgNSkJY291bnQ6IENvdW50IG9mIHJhbmdlcyBmb3IgdmFyaWFudCBwYXJ0LgotCi0gICAgNikJcm5keDogQSByZWxhdGl2ZSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBUaGUgcmVsYXRpdmUKLQlpbmRleCBmaWVsZCBoYXMgdHdvIHBhcnRzOiByZmQgd2hpY2ggaXMgYSBwb2ludGVyIGludG8gdGhlCi0JcmVsYXRpdmUgZmlsZSBpbmRleCB0YWJsZSBvciBTVF9SRkRFU0NBUEUgd2hpY2ggc2F5cyB0aGUgbmV4dAotCWF1eC4gZW50cnkgaXMgdGhlIGZpbGUgbnVtYmVyLCBhbmQgaW5kZXg6IHdoaWNoIGlzIHRoZSBwb2ludGVyCi0JaW50byB0aGUgbG9jYWwgc3ltYm9sIHdpdGhpbiBhIGdpdmVuIGZpbGUgdGFibGUuICBUaGlzIGlzIGZvcgotCXRoaW5ncyBsaWtlIHJlZmVyZW5jZXMgdG8gdHlwZXMgZGVmaW5lZCBpbiBhbm90aGVyIGZpbGUuCi0KLSAgICA3KQlUeXBlIGluZm9ybWF0aW9uOiBUaGlzIGlzIGxpa2UgdGhlIENPRkYgdHlwZSBiaXRzLCBleGNlcHQgaXQKLQlpcyAzMiBiaXRzIGluc3RlYWQgb2YgMTY7IHRoZXkgc3RpbGwgaGF2ZSByb29tIHRvIGFkZCBuZXcKLQliYXNpYyB0eXBlczsgYW5kIHRoZXkgY2FuIGhhbmRsZSBtb3JlIHRoYW4gNiBsZXZlbHMgb2YgYXJyYXksCi0JcG9pbnRlciwgZnVuY3Rpb24sIGV0Yy4gIEVhY2ggdHlwZSBpbmZvcm1hdGlvbiBmaWVsZCBjb250YWlucwotCXRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnM6Ci0KLQkgICAgYSkJZkJpdGZpZWxkOiBhIGJpdCB0aGF0IHNheXMgdGhpcyBpcyBhIGJpdGZpZWxkLCBhbmQgdGhlCi0JCXNpemUgaW4gYml0cyBmb2xsb3dzIGFzIHRoZSBuZXh0IGF1eC4gZW50cnkuCi0KLQkgICAgYikJY29udGludWVkOiBhIGJpdCB0aGF0IHNheXMgdGhlIG5leHQgYXV4LiBlbnRyeSBpcyBhCi0JCWNvbnRpbnVhdGlvbiBvZiB0aGUgY3VycmVudCB0eXBlIGluZm9ybWF0aW9uIChpbiBjYXNlCi0JCXRoZXJlIGFyZSBtb3JlIHRoYW4gNiBsZXZlbHMgb2YgYXJyYXkvcHRyL2Z1bmN0aW9uKS4KLQotCSAgICBjKQlidDogYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBiYXNlIHR5cGUgYmVmb3JlIGFkZGluZwotCQlhcnJheSwgcG9pbnRlciwgZnVuY3Rpb24sIGV0Yy4gcXVhbGlmaWVycy4gIFRoZQotCQljdXJyZW50IGJhc2UgdHlwZXMgdGhhdCBJIGhhdmUgZG9jdW1lbnRhdGlvbiBmb3IgYXJlOgotCi0JCQlidE5pbAkJLS0gdW5kZWZpbmVkCi0JCQlidEFkcgkJLS0gYWRkcmVzcyAtIGludGVnZXIgc2FtZSBzaXplIGFzIHB0cgotCQkJYnRDaGFyCQktLSBjaGFyYWN0ZXIKLQkJCWJ0VUNoYXIJCS0tIHVuc2lnbmVkIGNoYXJhY3RlcgotCQkJYnRTaG9ydAkJLS0gc2hvcnQKLQkJCWJ0VVNob3J0CS0tIHVuc2lnbmVkIHNob3J0Ci0JCQlidEludAkJLS0gaW50Ci0JCQlidFVJbnQJCS0tIHVuc2lnbmVkIGludAotCQkJYnRMb25nCQktLSBsb25nCi0JCQlidFVMb25nCQktLSB1bnNpZ25lZCBsb25nCi0JCQlidEZsb2F0CQktLSBmbG9hdCAocmVhbCkKLQkJCWJ0RG91YmxlCS0tIERvdWJsZSAocmVhbCkKLQkJCWJ0U3RydWN0CS0tIFN0cnVjdHVyZSAoUmVjb3JkKQotCQkJYnRVbmlvbgkJLS0gVW5pb24gKHZhcmlhbnQpCi0JCQlidEVudW0JCS0tIEVudW1lcmF0ZWQKLQkJCWJ0VHlwZWRlZgktLSBkZWZpbmVkIHZpYSBhIHR5cGVkZWYgaXN5bVJlZgotCQkJYnRSYW5nZQkJLS0gc3VicmFuZ2Ugb2YgaW50Ci0JCQlidFNldAkJLS0gcGFzY2FsIHNldHMKLQkJCWJ0Q29tcGxleAktLSBmb3J0cmFuIGNvbXBsZXgKLQkJCWJ0RENvbXBsZXgJLS0gZm9ydHJhbiBkb3VibGUgY29tcGxleAotCQkJYnRJbmRpcmVjdAktLSBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZgotCQkJYnRGaXhlZERlYwktLSBGaXhlZCBEZWNpbWFsCi0JCQlidEZsb2F0RGVjCS0tIEZsb2F0IERlY2ltYWwKLQkJCWJ0U3RyaW5nCS0tIFZhcnlpbmcgTGVuZ3RoIENoYXJhY3RlciBTdHJpbmcKLQkJCWJ0Qml0CQktLSBBbGlnbmVkIEJpdCBTdHJpbmcKLQkJCWJ0UGljdHVyZQktLSBQaWN0dXJlCi0JCQlidFZvaWQJCS0tIFZvaWQgKE1JUFMgY2MgcmV2aXNpb24gPj0gMi4wMCkKLQotCSAgICBkKQl0cTAgLSB0cTU6IHR5cGUgcXVhbGlmaWVyIGZpZWxkcyBhcyBuZWVkZWQuICBUaGUKLQkJY3VycmVudCB0eXBlIHF1YWxpZmllciBmaWVsZHMgSSBoYXZlIGRvY3VtZW50YXRpb24gZm9yCi0JCWFyZToKLQotCQkJdHFOaWwJCS0tIG5vIG1vcmUgcXVhbGlmaWVycwotCQkJdHFQdHIJCS0tIHBvaW50ZXIKLQkJCXRxUHJvYwkJLS0gcHJvY2VkdXJlCi0JCQl0cUFycmF5CQktLSBhcnJheQotCQkJdHFGYXIJCS0tIDgwODYgZmFyIHBvaW50ZXJzCi0JCQl0cVZvbAkJLS0gdm9sYXRpbGUKLQotCi0gICBUaGUgZGVuc2UgbnVtYmVyIHRhYmxlIGlzIHVzZWQgaW4gdGhlIGZyb250IGVuZHMsIGFuZCBkaXNhcHBlYXJzIGJ5Ci0gICB0aGUgdGltZSB0aGUgLm8gaXMgY3JlYXRlZC4KLQotICAgV2l0aCB0aGUgMS4zMSBjb21waWxlciBzdWl0ZSwgdGhlIG9wdGltaXphdGlvbiBzeW1ib2xzIGRvbid0IHNlZW0KLSAgIHRvIGJlIHVzZWQgYXMgZmFyIGFzIEkgY2FuIHRlbGwuCi0KLSAgIFRoZSBsaW5rZXIgaXMgdGhlIGZpcnN0IGVudGl0eSB0aGF0IGNyZWF0ZXMgdGhlIHJlbGF0aXZlIGZpbGUKLSAgIGRlc2NyaXB0b3IgdGFibGUsIGFuZCBJIGJlbGlldmUgaXQgaXMgdXNlZCBzbyB0aGF0IHRoZSBpbmRpdmlkdWFsCi0gICBmaWxlIHRhYmxlIHBvaW50ZXJzIGRvbid0IGhhdmUgdG8gYmUgcmV3cml0dGVuIHdoZW4gdGhlIG9iamVjdHMgYXJlCi0gICBtZXJnZWQgdG9nZXRoZXIgaW50byB0aGUgcHJvZ3JhbSBmaWxlLgotCi0gICBVbmxpa2UgQ09GRiwgdGhlIGJhc2ljIHN5bWJvbCAmIHN0cmluZyB0YWJsZXMgYXJlIHNwbGl0IGludG8KLSAgIGV4dGVybmFsIGFuZCBsb2NhbCBzeW1ib2xzL3N0cmluZ3MuICBUaGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbgotICAgb25seSBnb2VzIG9mZiBvZiB0aGUgZXh0ZXJuYWwgc3ltYm9sIHRhYmxlLCBhbmQgdGhlIGRlYnVnCi0gICBpbmZvcm1hdGlvbiBvbmx5IGdvZXMgb2ZmIG9mIHRoZSBpbnRlcm5hbCBzeW1ib2wgdGFibGUuICBUaGUKLSAgIGV4dGVybmFsIHN5bWJvbHMgY2FuIGhhdmUgbGlua3MgdG8gYW4gYXBwcm9wcmlhdGUgZmlsZSBpbmRleCBhbmQKLSAgIHN5bWJvbCB3aXRoaW4gdGhlIGZpbGUgdG8gZ2l2ZSBpdCB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbmZvcm1hdGlvbi4KLSAgIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGV4dGVybmFsIHN5bWJvbHMgYXJlIGFjdHVhbGx5IGxhcmdlciB0aGFuIHRoZQotICAgaW50ZXJuYWwgc3ltYm9scyAodG8gY29udGFpbiB0aGUgbGluayBpbmZvcm1hdGlvbiksIGFuZCBjb250YWluIHRoZQotICAgbG9jYWwgc3ltYm9sIHN0cnVjdHVyZSBhcyBhIG1lbWJlciwgdGhvdWdoIHRoaXMgbWVtYmVyIGlzIG5vdCB0aGUKLSAgIGZpcnN0IG1lbWJlciBvZiB0aGUgZXh0ZXJuYWwgc3ltYm9sIHN0cnVjdHVyZSAoISkuICBJIHN1c3BlY3QgdGhpcwotICAgc3BsaXQgaXMgdG8gbWFrZSBzdHJpcCBlYXNpZXIgdG8gZGVhbCB3aXRoLgotCi0gICBFYWNoIGZpbGUgdGFibGUgaGFzIG9mZnNldHMgZm9yIHdoZXJlIHRoZSBsaW5lIG51bWJlcnMsIGxvY2FsCi0gICBzdHJpbmdzLCBsb2NhbCBzeW1ib2xzLCBhbmQgcHJvY2VkdXJlIHRhYmxlIHN0YXJ0cyBmcm9tIHdpdGhpbiB0aGUKLSAgIGdsb2JhbCB0YWJsZXMsIGFuZCB0aGUgaW5kZXhzIGFyZSByZXNldCB0byAwIGZvciBlYWNoIG9mIHRob3NlCi0gICB0YWJsZXMgZm9yIHRoZSBmaWxlLgotCi0gICBUaGUgcHJvY2VkdXJlIHRhYmxlIGNvbnRhaW5zIHRoZSBiaW5hcnkgZXF1aXZhbGVudHMgb2YgdGhlIC5lbnQKLSAgIChzdGFydCBvZiB0aGUgZnVuY3Rpb24gYWRkcmVzcyksIC5mcmFtZSAod2hhdCByZWdpc3RlciBpcyB0aGUKLSAgIHZpcnR1YWwgZnJhbWUgcG9pbnRlciwgY29uc3RhbnQgb2Zmc2V0IGZyb20gdGhlIHJlZ2lzdGVyIHRvIG9idGFpbgotICAgdGhlIFZGUCwgYW5kIHdoYXQgcmVnaXN0ZXIgaG9sZHMgdGhlIHJldHVybiBhZGRyZXNzKSwgLm1hc2svLmZtYXNrCi0gICAoYml0bWFzayBvZiBzYXZlZCByZWdpc3RlcnMsIGFuZCB3aGVyZSB0aGUgZmlyc3QgcmVnaXN0ZXIgaXMgc3RvcmVkCi0gICByZWxhdGl2ZSB0byB0aGUgVkZQKSBhc3NlbWJsZXIgZGlyZWN0aXZlcy4gIEl0IGFsc28gY29udGFpbnMgdGhlCi0gICBsb3cgYW5kIGhpZ2ggYm91bmRzIG9mIHRoZSBsaW5lIG51bWJlcnMgaWYgZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4KLQotICAgVGhlIGxpbmUgbnVtYmVyIHRhYmxlIGlzIGEgY29tcHJlc3NlZCBmb3JtIG9mIHRoZSBub3JtYWwgQ09GRiBsaW5lCi0gICB0YWJsZS4gIEVhY2ggbGluZSBudW1iZXIgZW50cnkgaXMgZWl0aGVyIDEgb3IgMyBieXRlcyBsb25nLCBhbmQKLSAgIGNvbnRhaW5zIGEgc2lnbmVkIGRlbHRhIGZyb20gdGhlIHByZXZpb3VzIGxpbmUsIGFuZCBhbiB1bnNpZ25lZAotICAgY291bnQgb2YgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhpcyBzdGF0ZW1lbnQgdGFrZXMuCi0KLSAgIFRoZSBsb2NhbCBzeW1ib2wgdGFibGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6Ci0KLSAgICAxKQlpc3M6IGluZGV4IHRvIHRoZSBsb2NhbCBzdHJpbmcgdGFibGUgZ2l2aW5nIHRoZSBuYW1lIG9mIHRoZQotCXN5bWJvbC4KLQotICAgIDIpCXZhbHVlOiB2YWx1ZSBvZiB0aGUgc3ltYm9sIChhZGRyZXNzLCByZWdpc3RlciBudW1iZXIsIGV0Yy4pLgotCi0gICAgMykJc3Q6IHN5bWJvbCB0eXBlLiAgVGhlIGN1cnJlbnQgc3ltYm9sIHR5cGVzIGFyZToKLQotCSAgICBzdE5pbAkgIC0tIE51dGhpbicgc3BlY2lhbAotCSAgICBzdEdsb2JhbAkgIC0tIGV4dGVybmFsIHN5bWJvbAotCSAgICBzdFN0YXRpYwkgIC0tIHN0YXRpYwotCSAgICBzdFBhcmFtCSAgLS0gcHJvY2VkdXJlIGFyZ3VtZW50Ci0JICAgIHN0TG9jYWwJICAtLSBsb2NhbCB2YXJpYWJsZQotCSAgICBzdExhYmVsCSAgLS0gbGFiZWwKLQkgICAgc3RQcm9jCSAgLS0gRXh0ZXJuYWwgUHJvY2VkdXJlCi0JICAgIHN0QmxvY2sJICAtLSBiZWdpbm5pbmcgb2YgYmxvY2sKLQkgICAgc3RFbmQJICAtLSBlbmQgKG9mIGFueXRoaW5nKQotCSAgICBzdE1lbWJlcgkgIC0tIG1lbWJlciAob2YgYW55dGhpbmcpCi0JICAgIHN0VHlwZWRlZgkgIC0tIHR5cGUgZGVmaW5pdGlvbgotCSAgICBzdEZpbGUJICAtLSBmaWxlIG5hbWUKLQkgICAgc3RSZWdSZWxvYwkgIC0tIHJlZ2lzdGVyIHJlbG9jYXRpb24KLQkgICAgc3RGb3J3YXJkCSAgLS0gZm9yd2FyZGluZyBhZGRyZXNzCi0JICAgIHN0U3RhdGljUHJvYyAgLS0gU3RhdGljIHByb2NlZHVyZQotCSAgICBzdENvbnN0YW50CSAgLS0gY29uc3QKLQotICAgIDQpCXNjOiBzdG9yYWdlIGNsYXNzLiAgVGhlIGN1cnJlbnQgc3RvcmFnZSBjbGFzc2VzIGFyZToKLQotCSAgICBzY1RleHQJICAtLSB0ZXh0IHN5bWJvbAotCSAgICBzY0RhdGEJICAtLSBpbml0aWFsaXplZCBkYXRhIHN5bWJvbAotCSAgICBzY0JzcwkgIC0tIHVuLWluaXRpYWxpemVkIGRhdGEgc3ltYm9sCi0JICAgIHNjUmVnaXN0ZXIJICAtLSB2YWx1ZSBvZiBzeW1ib2wgaXMgcmVnaXN0ZXIgbnVtYmVyCi0JICAgIHNjQWJzCSAgLS0gdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlCi0JICAgIHNjVW5kZWZpbmVkICAgLS0gd2hvIGtub3dzPwotCSAgICBzY0NkYkxvY2FsCSAgLS0gdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBzZS0+dmEuPz8KLQkgICAgc2NCaXRzCSAgLS0gdGhpcyBpcyBhIGJpdCBmaWVsZAotCSAgICBzY0NkYlN5c3RlbQkgIC0tIHZhbHVlIGlzIElOIGRlYnVnZ2VyJ3MgYWRkcmVzcyBzcGFjZQotCSAgICBzY1JlZ0ltYWdlCSAgLS0gcmVnaXN0ZXIgdmFsdWUgc2F2ZWQgb24gc3RhY2sKLQkgICAgc2NJbmZvCSAgLS0gc3ltYm9sIGNvbnRhaW5zIGRlYnVnZ2VyIGluZm9ybWF0aW9uCi0JICAgIHNjVXNlclN0cnVjdCAgLS0gYWRkciBpbiBzdHJ1Y3QgdXNlciBmb3IgY3VycmVudCBwcm9jZXNzCi0JICAgIHNjU0RhdGEJICAtLSBsb2FkIHRpbWUgb25seSBzbWFsbCBkYXRhCi0JICAgIHNjU0JzcwkgIC0tIGxvYWQgdGltZSBvbmx5IHNtYWxsIGNvbW1vbgotCSAgICBzY1JEYXRhCSAgLS0gbG9hZCB0aW1lIG9ubHkgcmVhZCBvbmx5IGRhdGEKLQkgICAgc2NWYXIJICAtLSBWYXIgcGFyYW1ldGVyIChmb3J0cmFucGFzY2FsKQotCSAgICBzY0NvbW1vbgkgIC0tIGNvbW1vbiB2YXJpYWJsZQotCSAgICBzY1NDb21tb24JICAtLSBzbWFsbCBjb21tb24KLQkgICAgc2NWYXJSZWdpc3RlciAtLSBWYXIgcGFyYW1ldGVyIGluIGEgcmVnaXN0ZXIKLQkgICAgc2NWYXJpYW50CSAgLS0gVmFyaWFudCByZWNvcmQKLQkgICAgc2NTVW5kZWZpbmVkICAtLSBzbWFsbCB1bmRlZmluZWQoZXh0ZXJuYWwpIGRhdGEKLQkgICAgc2NJbml0CSAgLS0gLmluaXQgc2VjdGlvbiBzeW1ib2wKLQotICAgIDUpCWluZGV4OiBwb2ludGVyIHRvIGEgbG9jYWwgc3ltYm9sIG9yIGF1eC4gZW50cnkuCi0KLQotCi0gICBGb3IgdGhlIGZvbGxvd2luZyBwcm9ncmFtOgotCi0JI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLQltYWluKCl7Ci0JCXByaW50ZigiSGVsbG8gV29ybGQhXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0gICBNaXBzLXRkdW1wIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246Ci0KLSAgIEdsb2JhbCBmaWxlIGhlYWRlcjoKLSAgICAgICBtYWdpYyBudW1iZXIgICAgICAgICAgICAgMHgxNjIKLSAgICAgICAjIHNlY3Rpb25zICAgICAgICAgICAgICAgMgotICAgICAgIHRpbWVzdGFtcCAgICAgICAgICAgICAgICA2NDUzMTE3OTksIFdlZCBKdW4gMTMgMTc6MTY6MzkgMTk5MAotICAgICAgIHN5bWJvbGljIGhlYWRlciBvZmZzZXQgICAyODQKLSAgICAgICBzeW1ib2xpYyBoZWFkZXIgc2l6ZSAgICAgOTYKLSAgICAgICBvcHRpb25hbCBoZWFkZXIgICAgICAgICAgNTYKLSAgICAgICBmbGFncyAgICAgICAgICAgICAgICAgICAgMHgwCi0KLSAgIFN5bWJvbGljIGhlYWRlciwgbWFnaWMgbnVtYmVyID0gMHg3MDA5LCB2c3RhbXAgPSAxLjMxOgotCi0gICAgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICBOdW1iZXIgICAgICAgQnl0ZXMKLSAgICAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgID09PT09PSAgICAgID09PT09PSAgICAgID09PT09Ci0KLSAgICAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgIDM4MCAgICAgICAgICAgNCAgICAgICAgICAgNCBbMTNdCi0gICAgICAgRGVuc2UgbnVtYmVycyAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLSAgICAgICBQcm9jZWR1cmVzIFRhYmxlcyAgICAgICAgICAgIDM4NCAgICAgICAgICAgMSAgICAgICAgICA1MgotICAgICAgIExvY2FsIFN5bWJvbHMgICAgICAgICAgICAgICAgNDM2ICAgICAgICAgIDE2ICAgICAgICAgMTkyCi0gICAgICAgT3B0aW1pemF0aW9uIFN5bWJvbHMgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLSAgICAgICBBdXhpbGlhcnkgU3ltYm9scyAgICAgICAgICAgIDYyOCAgICAgICAgICAzOSAgICAgICAgIDE1NgotICAgICAgIExvY2FsIFN0cmluZ3MgICAgICAgICAgICAgICAgNzg0ICAgICAgICAgIDgwICAgICAgICAgIDgwCi0gICAgICAgRXh0ZXJuYWwgU3RyaW5ncyAgICAgICAgICAgICA4NjQgICAgICAgICAxNDQgICAgICAgICAxNDQKLSAgICAgICBGaWxlIFRhYmxlcyAgICAgICAgICAgICAgICAgMTAwOCAgICAgICAgICAgMiAgICAgICAgIDE0NAotICAgICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgRXh0ZXJuYWwgU3ltYm9scyAgICAgICAgICAgIDExNTIgICAgICAgICAgMjAgICAgICAgICAzMjAKLQotICAgRmlsZSAjMCwgImhlbGxvMi5jIgotCi0gICAgICAgTmFtZSBpbmRleCAgPSAxICAgICAgICAgIFJlYWRpbiAgICAgID0gTm8KLSAgICAgICBNZXJnZSAgICAgICA9IE5vICAgICAgICAgRW5kaWFuICAgICAgPSBMSVRUTEUKLSAgICAgICBEZWJ1ZyBsZXZlbCA9IEcyICAgICAgICAgTGFuZ3VhZ2UgICAgPSBDCi0gICAgICAgQWRyICAgICAgICAgPSAweDAwMDAwMDAwCi0KLSAgICAgICBJbmZvICAgICAgICAgICAgICAgICAgICAgICBTdGFydCAgICAgIE51bWJlciAgICAgICAgU2l6ZSAgICAgIE9mZnNldAotICAgICAgID09PT0gICAgICAgICAgICAgICAgICAgICAgID09PT09ICAgICAgPT09PT09ICAgICAgICA9PT09ICAgICAgPT09PT09Ci0gICAgICAgTG9jYWwgc3RyaW5ncyAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgMTUgICAgICAgICAgMTUgICAgICAgICA3ODQKLSAgICAgICBMb2NhbCBzeW1ib2xzICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgNiAgICAgICAgICA3MiAgICAgICAgIDQzNgotICAgICAgIExpbmUgbnVtYmVycyAgICAgICAgICAgICAgICAgICAwICAgICAgICAgIDEzICAgICAgICAgIDEzICAgICAgICAgMzgwCi0gICAgICAgT3B0aW1pemF0aW9uIHN5bWJvbHMgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLSAgICAgICBQcm9jZWR1cmVzICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMSAgICAgICAgICA1MiAgICAgICAgIDM4NAotICAgICAgIEF1eGlsaWFyeSBzeW1ib2xzICAgICAgICAgICAgICAwICAgICAgICAgIDE0ICAgICAgICAgIDU2ICAgICAgICAgNjI4Ci0gICAgICAgUmVsYXRpdmUgRmlsZXMgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLQotICAgIFRoZXJlIGFyZSA2IGxvY2FsIHN5bWJvbHMsIHN0YXJ0aW5nIGF0IDQzNgotCi0JU3ltYm9sIyAwOiAiaGVsbG8yLmMiCi0JICAgIEVuZCsxIHN5bWJvbCAgPSA2Ci0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSA2Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBGaWxlICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE6ICJtYWluIgotCSAgICBFbmQrMSBzeW1ib2wgID0gNQotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSAxMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMTIKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMjogIiIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDQKLQkgICAgU3ltYm9sIHR5cGUgICA9IEJsb2NrICAgICAgIFZhbHVlICA9IDgKLQotCVN5bWJvbCMgMzogIiIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDIKLQkgICAgU3ltYm9sIHR5cGUgICA9IEVuZCAgICAgICAgIFZhbHVlICA9IDI4Ci0KLQlTeW1ib2wjIDQ6ICJtYWluIgotCSAgICBGaXJzdCBzeW1ib2wgID0gMQotCSAgICBTdHJpbmcgaW5kZXggID0gMTAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDEKLQkgICAgU3ltYm9sIHR5cGUgICA9IEVuZCAgICAgICAgIFZhbHVlICA9IDUyCi0KLQlTeW1ib2wjIDU6ICJoZWxsbzIuYyIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDAKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDAKLQkgICAgU3ltYm9sIHR5cGUgICA9IEVuZCAgICAgICAgIFZhbHVlICA9IDAKLQotICAgIFRoZXJlIGFyZSAxNCBhdXhpbGlhcnkgdGFibGUgZW50cmllcywgc3RhcnRpbmcgYXQgNjI4LgotCi0JKiAjMCAgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzEgICAgICAgICAgICAgIDI0LCBbICAyNC8gICAgICAwXSwgWyA2IDA6MCAwOjA6MDowOjA6MF0KLQkqICMyICAgICAgICAgICAgICAgOCwgWyAgIDgvICAgICAgMF0sIFsgMiAwOjAgMDowOjA6MDowOjBdCi0JKiAjMyAgICAgICAgICAgICAgMTYsIFsgIDE2LyAgICAgIDBdLCBbIDQgMDowIDA6MDowOjA6MDowXQotCSogIzQgICAgICAgICAgICAgIDI0LCBbICAyNC8gICAgICAwXSwgWyA2IDA6MCAwOjA6MDowOjA6MF0KLQkqICM1ICAgICAgICAgICAgICAzMiwgWyAgMzIvICAgICAgMF0sIFsgOCAwOjAgMDowOjA6MDowOjBdCi0JKiAjNiAgICAgICAgICAgICAgNDAsIFsgIDQwLyAgICAgIDBdLCBbMTAgMDowIDA6MDowOjA6MDowXQotCSogIzcgICAgICAgICAgICAgIDQ0LCBbICA0NC8gICAgICAwXSwgWzExIDA6MCAwOjA6MDowOjA6MF0KLQkqICM4ICAgICAgICAgICAgICAxMiwgWyAgMTIvICAgICAgMF0sIFsgMyAwOjAgMDowOjA6MDowOjBdCi0JKiAjOSAgICAgICAgICAgICAgMjAsIFsgIDIwLyAgICAgIDBdLCBbIDUgMDowIDA6MDowOjA6MDowXQotCSogIzEwICAgICAgICAgICAgIDI4LCBbICAyOC8gICAgICAwXSwgWyA3IDA6MCAwOjA6MDowOjA6MF0KLQkqICMxMSAgICAgICAgICAgICAzNiwgWyAgMzYvICAgICAgMF0sIFsgOSAwOjAgMDowOjA6MDowOjBdCi0JICAjMTIgICAgICAgICAgICAgIDUsIFsgICA1LyAgICAgIDBdLCBbIDEgMTowIDA6MDowOjA6MDowXQotCSAgIzEzICAgICAgICAgICAgIDI0LCBbICAyNC8gICAgICAwXSwgWyA2IDA6MCAwOjA6MDowOjA6MF0KLQotICAgIFRoZXJlIGFyZSAxIHByb2NlZHVyZSBkZXNjcmlwdG9yIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDAuCi0KLQlQcm9jZWR1cmUgZGVzY3JpcHRvciAwOgotCSAgICBOYW1lIGluZGV4ICAgPSAxMCAgICAgICAgICBOYW1lICAgICAgICAgID0gIm1haW4iCi0JICAgIC5tYXNrIDB4ODAwMDAwMDAsLTQgICAgICAgIC5mbWFzayAweDAwMDAwMDAwLDAKLQkgICAgLmZyYW1lICQyOSwyNCwkMzEKLQkgICAgT3B0LiBzdGFydCAgID0gLTEgICAgICAgICAgU3ltYm9scyBzdGFydCA9IDEKLQkgICAgRmlyc3QgbGluZSAjID0gMyAgICAgICAgICAgTGFzdCBsaW5lICMgICA9IDYKLQkgICAgTGluZSBPZmZzZXQgID0gMCAgICAgICAgICAgQWRkcmVzcyAgICAgICA9IDB4MDAwMDAwMDAKLQotCVRoZXJlIGFyZSA0IGJ5dGVzIGhvbGRpbmcgbGluZSBudW1iZXJzLCBzdGFydGluZyBhdCAzODAuCi0JICAgIExpbmUgICAgICAgICAgIDMsICAgZGVsdGEgICAgIDAsICAgY291bnQgIDIKLQkgICAgTGluZSAgICAgICAgICAgNCwgICBkZWx0YSAgICAgMSwgICBjb3VudCAgMwotCSAgICBMaW5lICAgICAgICAgICA1LCAgIGRlbHRhICAgICAxLCAgIGNvdW50ICAyCi0JICAgIExpbmUgICAgICAgICAgIDYsICAgZGVsdGEgICAgIDEsICAgY291bnQgIDYKLQotICAgRmlsZSAjMSwgIi91c3IvaW5jbHVkZS9zdGRpby5oIgotCi0gICAgTmFtZSBpbmRleCAgPSAxICAgICAgICAgIFJlYWRpbiAgICAgID0gTm8KLSAgICBNZXJnZSAgICAgICA9IFllcyAgICAgICAgRW5kaWFuICAgICAgPSBMSVRUTEUKLSAgICBEZWJ1ZyBsZXZlbCA9IEcyICAgICAgICAgTGFuZ3VhZ2UgICAgPSBDCi0gICAgQWRyICAgICAgICAgPSAweDAwMDAwMDAwCi0KLSAgICBJbmZvICAgICAgICAgICAgICAgICAgICAgICBTdGFydCAgICAgIE51bWJlciAgICAgICAgU2l6ZSAgICAgIE9mZnNldAotICAgID09PT0gICAgICAgICAgICAgICAgICAgICAgID09PT09ICAgICAgPT09PT09ICAgICAgICA9PT09ICAgICAgPT09PT09Ci0gICAgTG9jYWwgc3RyaW5ncyAgICAgICAgICAgICAgICAgMTUgICAgICAgICAgNjUgICAgICAgICAgNjUgICAgICAgICA3OTkKLSAgICBMb2NhbCBzeW1ib2xzICAgICAgICAgICAgICAgICAgNiAgICAgICAgICAxMCAgICAgICAgIDEyMCAgICAgICAgIDUwOAotICAgIExpbmUgbnVtYmVycyAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgMzgwCi0gICAgT3B0aW1pemF0aW9uIHN5bWJvbHMgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLSAgICBQcm9jZWR1cmVzICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgIDQzNgotICAgIEF1eGlsaWFyeSBzeW1ib2xzICAgICAgICAgICAgIDE0ICAgICAgICAgIDI1ICAgICAgICAgMTAwICAgICAgICAgNjg0Ci0gICAgUmVsYXRpdmUgRmlsZXMgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLQotICAgIFRoZXJlIGFyZSAxMCBsb2NhbCBzeW1ib2xzLCBzdGFydGluZyBhdCA0NDIKLQotCVN5bWJvbCMgMDogIi91c3IvaW5jbHVkZS9zdGRpby5oIgotCSAgICBFbmQrMSBzeW1ib2wgID0gMTAKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDEwCi0JICAgIFN5bWJvbCB0eXBlICAgPSBGaWxlICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE6ICJfaW9idWYiCi0JICAgIEVuZCsxIHN5bWJvbCAgPSA5Ci0JICAgIFN0cmluZyBpbmRleCAgPSAyMgotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gOQotCSAgICBTeW1ib2wgdHlwZSAgID0gQmxvY2sgICAgICAgVmFsdWUgID0gMjAKLQotCVN5bWJvbCMgMjogIl9jbnQiCi0JICAgIFR5cGUgICAgICAgICAgPSBpbnQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDI5Ci0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSA0Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDM6ICJfcHRyIgotCSAgICBUeXBlICAgICAgICAgID0gcHRyIHRvIGNoYXIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDM0Ci0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAxNQotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gMzIKLQotCVN5bWJvbCMgNDogIl9iYXNlIgotCSAgICBUeXBlICAgICAgICAgID0gcHRyIHRvIGNoYXIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDM5Ci0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAxNgotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gNjQKLQotCVN5bWJvbCMgNTogIl9idWZzaXoiCi0JICAgIFR5cGUgICAgICAgICAgPSBpbnQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDQ1Ci0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSA0Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSA5NgotCi0JU3ltYm9sIyA2OiAiX2ZsYWciCi0JICAgIFR5cGUgICAgICAgICAgPSBzaG9ydAotCSAgICBTdHJpbmcgaW5kZXggID0gNTMKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDMKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDEyOAotCi0JU3ltYm9sIyA3OiAiX2ZpbGUiCi0JICAgIFR5cGUgICAgICAgICAgPSBjaGFyCi0JICAgIFN0cmluZyBpbmRleCAgPSA1OQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMgotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gMTQ0Ci0KLQlTeW1ib2wjIDg6ICIiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAxCi0JICAgIFN0cmluZyBpbmRleCAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAxCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDk6ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDAKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDAKLQkgICAgU3ltYm9sIHR5cGUgICA9IEVuZCAgICAgICAgIFZhbHVlICA9IDAKLQotICAgIFRoZXJlIGFyZSAyNSBhdXhpbGlhcnkgdGFibGUgZW50cmllcywgc3RhcnRpbmcgYXQgNjQyLgotCi0JKiAjMTQgICAgICAgICAgICAgLTEsIFs0MDk1LzEwNDg1NzVdLCBbNjMgMToxIGY6ZjpmOmY6ZjpmXQotCSAgIzE1ICAgICAgICAgIDY1NTQ0LCBbICAgOC8gICAgIDE2XSwgWyAyIDA6MCAxOjA6MDowOjA6MF0KLQkgICMxNiAgICAgICAgICA2NTU0NCwgWyAgIDgvICAgICAxNl0sIFsgMiAwOjAgMTowOjA6MDowOjBdCi0JKiAjMTcgICAgICAgICAxOTY2NTYsIFsgIDQ4LyAgICAgNDhdLCBbMTIgMDowIDM6MDowOjA6MDowXQotCSogIzE4ICAgICAgICAgICA4MTkxLCBbNDA5NS8gICAgICAxXSwgWzYzIDE6MSAwOjA6MDowOmY6MV0KLQkqICMxOSAgICAgICAgICAgICAgMSwgWyAgIDEvICAgICAgMF0sIFsgMCAxOjAgMDowOjA6MDowOjBdCi0JKiAjMjAgICAgICAgICAgMjA0NzksIFs0MDk1LyAgICAgIDRdLCBbNjMgMToxIDA6MDowOjA6Zjo0XQotCSogIzIxICAgICAgICAgICAgICAxLCBbICAgMS8gICAgICAwXSwgWyAwIDE6MCAwOjA6MDowOjA6MF0KLQkqICMyMiAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjMgICAgICAgICAgICAgIDIsIFsgICAyLyAgICAgIDBdLCBbIDAgMDoxIDA6MDowOjA6MDowXQotCSogIzI0ICAgICAgICAgICAgMTYwLCBbIDE2MC8gICAgICAwXSwgWzQwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyNSAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjYgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzI3ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyOCAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjkgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzMwICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzMSAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzIgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzMzICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzNCAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzUgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM2ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzNyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzggICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCi0gICAgVGhlcmUgYXJlIDAgcHJvY2VkdXJlIGRlc2NyaXB0b3IgZW50cmllcywgc3RhcnRpbmcgYXQgMS4KLQotICAgVGhlcmUgYXJlIDIwIGV4dGVybmFsIHN5bWJvbHMsIHN0YXJ0aW5nIGF0IDExNTIKLQotCVN5bWJvbCMgMDogIl9pb2IiCi0JICAgIFR5cGUgICAgICAgICAgPSBhcnJheSBbMyB7MTYwfV0gb2Ygc3RydWN0IF9pb2J1ZiB7IGlmZCA9IDEsIGluZGV4ID0gMSB9Ci0JICAgIFN0cmluZyBpbmRleCAgPSAwICAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxNwotCSAgICBTeW1ib2wgdHlwZSAgID0gR2xvYmFsICAgICAgVmFsdWUgID0gNjAKLQotCVN5bWJvbCMgMTogImZvcGVuIgotCSAgICBTdHJpbmcgaW5kZXggID0gNSAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAyOiAiZmRvcGVuIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTEgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAzOiAiZnJlb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDE4ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNDogInBvcGVuIgotCSAgICBTdHJpbmcgaW5kZXggID0gMjYgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA1OiAidG1wZmlsZSIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDMyICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNjogImZ0ZWxsIgotCSAgICBTdHJpbmcgaW5kZXggID0gNDAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA3OiAicmV3aW5kIgotCSAgICBTdHJpbmcgaW5kZXggID0gNDYgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA4OiAic2V0YnVmIgotCSAgICBTdHJpbmcgaW5kZXggID0gNTMgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA5OiAic2V0YnVmZmVyIgotCSAgICBTdHJpbmcgaW5kZXggID0gNjAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxMDogInNldGxpbmVidWYiCi0JICAgIFN0cmluZyBpbmRleCAgPSA3MCAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDExOiAiZmdldHMiCi0JICAgIFN0cmluZyBpbmRleCAgPSA4MSAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDEyOiAiZ2V0cyIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDg3ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTM6ICJjdGVybWlkIgotCSAgICBTdHJpbmcgaW5kZXggID0gOTIgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxNDogImN1c2VyaWQiCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMDAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE1OiAidGVtcG5hbSIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEwOCAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTY6ICJ0bXBuYW0iCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMTYgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE3OiAic3ByaW50ZiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEyMyAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTg6ICJtYWluIgotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSAxMzEgICAgICAgICBJZmQgICAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxCi0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE5OiAicHJpbnRmIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTM2ICAgICAgICAgSWZkICAgID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVW5kZWZpbmVkICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0gICBUaGUgZm9sbG93aW5nIGF1eGlsaWFyeSB0YWJsZSBlbnRyaWVzIHdlcmUgdW51c2VkOgotCi0gICAgIzAgICAgICAgICAgICAgICAwICAweDAwMDAwMDAwICB2b2lkCi0gICAgIzIgICAgICAgICAgICAgICA4ICAweDAwMDAwMDA4ICBjaGFyCi0gICAgIzMgICAgICAgICAgICAgIDE2ICAweDAwMDAwMDEwICBzaG9ydAotICAgICM0ICAgICAgICAgICAgICAyNCAgMHgwMDAwMDAxOCAgaW50Ci0gICAgIzUgICAgICAgICAgICAgIDMyICAweDAwMDAwMDIwICBsb25nCi0gICAgIzYgICAgICAgICAgICAgIDQwICAweDAwMDAwMDI4ICBmbG9hdAotICAgICM3ICAgICAgICAgICAgICA0NCAgMHgwMDAwMDAyYyAgZG91YmxlCi0gICAgIzggICAgICAgICAgICAgIDEyICAweDAwMDAwMDBjICB1bnNpZ25lZCBjaGFyCi0gICAgIzkgICAgICAgICAgICAgIDIwICAweDAwMDAwMDE0ICB1bnNpZ25lZCBzaG9ydAotICAgICMxMCAgICAgICAgICAgICAyOCAgMHgwMDAwMDAxYyAgdW5zaWduZWQgaW50Ci0gICAgIzExICAgICAgICAgICAgIDM2ICAweDAwMDAwMDI0ICB1bnNpZ25lZCBsb25nCi0gICAgIzE0ICAgICAgICAgICAgICAwICAweDAwMDAwMDAwICB2b2lkCi0gICAgIzE1ICAgICAgICAgICAgIDI0ICAweDAwMDAwMDE4ICBpbnQKLSAgICAjMTkgICAgICAgICAgICAgMzIgIDB4MDAwMDAwMjAgIGxvbmcKLSAgICAjMjAgICAgICAgICAgICAgNDAgIDB4MDAwMDAwMjggIGZsb2F0Ci0gICAgIzIxICAgICAgICAgICAgIDQ0ICAweDAwMDAwMDJjICBkb3VibGUKLSAgICAjMjIgICAgICAgICAgICAgMTIgIDB4MDAwMDAwMGMgIHVuc2lnbmVkIGNoYXIKLSAgICAjMjMgICAgICAgICAgICAgMjAgIDB4MDAwMDAwMTQgIHVuc2lnbmVkIHNob3J0Ci0gICAgIzI0ICAgICAgICAgICAgIDI4ICAweDAwMDAwMDFjICB1bnNpZ25lZCBpbnQKLSAgICAjMjUgICAgICAgICAgICAgMzYgIDB4MDAwMDAwMjQgIHVuc2lnbmVkIGxvbmcKLSAgICAjMjYgICAgICAgICAgICAgNDggIDB4MDAwMDAwMzAgIHN0cnVjdCBubyBuYW1lIHsgaWZkID0gLTEsIGluZGV4ID0gMTA0ODU3NSB9Ci0qLwotDAotLyogUmVkZWZpbml0aW9uIG9mIG9mIHN0b3JhZ2UgY2xhc3NlcyBhcyBhbiBlbnVtZXJhdGlvbiBmb3IgYmV0dGVyCi0gICBkZWJ1Z2dpbmcuICAqLwotCi10eXBlZGVmIGVudW0gc2MgewotICBzY19OaWwJID0gc2NOaWwsCSAgLyogbm8gc3RvcmFnZSBjbGFzcyAqLwotICBzY19UZXh0CSA9IHNjVGV4dCwJICAvKiB0ZXh0IHN5bWJvbCAqLwotICBzY19EYXRhCSA9IHNjRGF0YSwJICAvKiBpbml0aWFsaXplZCBkYXRhIHN5bWJvbCAqLwotICBzY19Cc3MJID0gc2NCc3MsCSAgLyogdW4taW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KLSAgc2NfUmVnaXN0ZXIJID0gc2NSZWdpc3RlciwJICAvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgcmVnaXN0ZXIgbnVtYmVyICovCi0gIHNjX0FicwkgPSBzY0FicywJICAvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KLSAgc2NfVW5kZWZpbmVkCSA9IHNjVW5kZWZpbmVkLAkgIC8qIHdobyBrbm93cz8gKi8KLSAgc2NfQ2RiTG9jYWwJID0gc2NDZGJMb2NhbCwJICAvKiB2YXJpYWJsZSdzIHZhbHVlIGlzIElOIHNlLT52YS4/PyAqLwotICBzY19CaXRzCSA9IHNjQml0cywJICAvKiB0aGlzIGlzIGEgYml0IGZpZWxkICovCi0gIHNjX0NkYlN5c3RlbQkgPSBzY0NkYlN5c3RlbSwJICAvKiB2YWx1ZSBpcyBJTiBDREIncyBhZGRyZXNzIHNwYWNlICovCi0gIHNjX1JlZ0ltYWdlCSA9IHNjUmVnSW1hZ2UsCSAgLyogcmVnaXN0ZXIgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKi8KLSAgc2NfSW5mbwkgPSBzY0luZm8sCSAgLyogc3ltYm9sIGNvbnRhaW5zIGRlYnVnZ2VyIGluZm9ybWF0aW9uICovCi0gIHNjX1VzZXJTdHJ1Y3QJID0gc2NVc2VyU3RydWN0LCAgLyogYWRkciBpbiBzdHJ1Y3QgdXNlciBmb3IgY3VycmVudCBwcm9jZXNzICovCi0gIHNjX1NEYXRhCSA9IHNjU0RhdGEsCSAgLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgZGF0YSAqLwotICBzY19TQnNzCSA9IHNjU0JzcywJICAvKiBsb2FkIHRpbWUgb25seSBzbWFsbCBjb21tb24gKi8KLSAgc2NfUkRhdGEJID0gc2NSRGF0YSwJICAvKiBsb2FkIHRpbWUgb25seSByZWFkIG9ubHkgZGF0YSAqLwotICBzY19WYXIJID0gc2NWYXIsCSAgLyogVmFyIHBhcmFtZXRlciAoZm9ydHJhbixwYXNjYWwpICovCi0gIHNjX0NvbW1vbgkgPSBzY0NvbW1vbiwJICAvKiBjb21tb24gdmFyaWFibGUgKi8KLSAgc2NfU0NvbW1vbgkgPSBzY1NDb21tb24sCSAgLyogc21hbGwgY29tbW9uICovCi0gIHNjX1ZhclJlZ2lzdGVyID0gc2NWYXJSZWdpc3RlciwgLyogVmFyIHBhcmFtZXRlciBpbiBhIHJlZ2lzdGVyICovCi0gIHNjX1ZhcmlhbnQJID0gc2NWYXJpYW50LAkgIC8qIFZhcmlhbnQgcmVjb3JkICovCi0gIHNjX1NVbmRlZmluZWQJID0gc2NTVW5kZWZpbmVkLCAgLyogc21hbGwgdW5kZWZpbmVkKGV4dGVybmFsKSBkYXRhICovCi0gIHNjX0luaXQJID0gc2NJbml0LAkgIC8qIC5pbml0IHNlY3Rpb24gc3ltYm9sICovCi0gIHNjX01heAkgPSBzY01heAkgIC8qIE1heCBzdG9yYWdlIGNsYXNzKzEgKi8KLX0gc2NfdDsKLQotLyogUmVkZWZpbml0aW9uIG9mIHN5bWJvbCB0eXBlLiAgKi8KLQotdHlwZWRlZiBlbnVtIHN0IHsKLSAgc3RfTmlsCT0gc3ROaWwsCS8qIE51dGhpbicgc3BlY2lhbCAqLwotICBzdF9HbG9iYWwJPSBzdEdsb2JhbCwJLyogZXh0ZXJuYWwgc3ltYm9sICovCi0gIHN0X1N0YXRpYwk9IHN0U3RhdGljLAkvKiBzdGF0aWMgKi8KLSAgc3RfUGFyYW0JPSBzdFBhcmFtLAkvKiBwcm9jZWR1cmUgYXJndW1lbnQgKi8KLSAgc3RfTG9jYWwJPSBzdExvY2FsLAkvKiBsb2NhbCB2YXJpYWJsZSAqLwotICBzdF9MYWJlbAk9IHN0TGFiZWwsCS8qIGxhYmVsICovCi0gIHN0X1Byb2MJPSBzdFByb2MsCS8qICAgICAiICAgICAgIgkgUHJvY2VkdXJlICovCi0gIHN0X0Jsb2NrCT0gc3RCbG9jaywJLyogYmVnaW5uaW5nIG9mIGJsb2NrICovCi0gIHN0X0VuZAk9IHN0RW5kLAkvKiBlbmQgKG9mIGFueXRoaW5nKSAqLwotICBzdF9NZW1iZXIJPSBzdE1lbWJlciwJLyogbWVtYmVyIChvZiBhbnl0aGluZwktIHN0cnVjdC91bmlvbi9lbnVtICovCi0gIHN0X1R5cGVkZWYJPSBzdFR5cGVkZWYsCS8qIHR5cGUgZGVmaW5pdGlvbiAqLwotICBzdF9GaWxlCT0gc3RGaWxlLAkvKiBmaWxlIG5hbWUgKi8KLSAgc3RfUmVnUmVsb2MJPSBzdFJlZ1JlbG9jLAkvKiByZWdpc3RlciByZWxvY2F0aW9uICovCi0gIHN0X0ZvcndhcmQJPSBzdEZvcndhcmQsCS8qIGZvcndhcmRpbmcgYWRkcmVzcyAqLwotICBzdF9TdGF0aWNQcm9jCT0gc3RTdGF0aWNQcm9jLAkvKiBsb2FkIHRpbWUgb25seSBzdGF0aWMgcHJvY3MgKi8KLSAgc3RfQ29uc3RhbnQJPSBzdENvbnN0YW50LAkvKiBjb25zdCAqLwotICBzdF9TdHIJPSBzdFN0ciwJLyogc3RyaW5nICovCi0gIHN0X051bWJlcgk9IHN0TnVtYmVyLAkvKiBwdXJlIG51bWJlciAoaWUuIDQgTk9SIDIrMikgKi8KLSAgc3RfRXhwcgk9IHN0RXhwciwJLyogMisyIHZzLiA0ICovCi0gIHN0X1R5cGUJPSBzdFR5cGUsCS8qIHBvc3QtY29lcmNpb24gU0VSICovCi0gIHN0X01heAk9IHN0TWF4CQkvKiBtYXggdHlwZSsxICovCi19IHN0X3Q7Ci0KLS8qIFJlZGVmaW5pdGlvbiBvZiB0eXBlIHF1YWxpZmllcnMuICAqLwotCi10eXBlZGVmIGVudW0gdHEgewotICB0cV9OaWwJPSB0cU5pbCwJLyogYnQgaXMgd2hhdCB5b3Ugc2VlICovCi0gIHRxX1B0cgk9IHRxUHRyLAkvKiBwb2ludGVyICovCi0gIHRxX1Byb2MJPSB0cVByb2MsCS8qIHByb2NlZHVyZSAqLwotICB0cV9BcnJheQk9IHRxQXJyYXksCS8qIGR1aCAqLwotICB0cV9GYXIJPSB0cUZhciwJLyogbG9uZ2VyIGFkZHJlc3NpbmcgLSA4MDg2LzggbGFuZCAqLwotICB0cV9Wb2wJPSB0cVZvbCwJLyogdm9sYXRpbGUgKi8KLSAgdHFfTWF4CT0gdHFNYXgJCS8qIE1heCB0eXBlIHF1YWxpZmllcisxICovCi19IHRxX3Q7Ci0KLS8qIFJlZGVmaW5pdGlvbiBvZiBiYXNpYyB0eXBlcy4gICovCi0KLXR5cGVkZWYgZW51bSBidCB7Ci0gIGJ0X05pbAk9IGJ0TmlsLAkvKiB1bmRlZmluZWQgKi8KLSAgYnRfQWRyCT0gYnRBZHIsCS8qIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwb2ludGVyICovCi0gIGJ0X0NoYXIJPSBidENoYXIsCS8qIGNoYXJhY3RlciAqLwotICBidF9VQ2hhcgk9IGJ0VUNoYXIsCS8qIHVuc2lnbmVkIGNoYXJhY3RlciAqLwotICBidF9TaG9ydAk9IGJ0U2hvcnQsCS8qIHNob3J0ICovCi0gIGJ0X1VTaG9ydAk9IGJ0VVNob3J0LAkvKiB1bnNpZ25lZCBzaG9ydCAqLwotICBidF9JbnQJPSBidEludCwJLyogaW50ICovCi0gIGJ0X1VJbnQJPSBidFVJbnQsCS8qIHVuc2lnbmVkIGludCAqLwotICBidF9Mb25nCT0gYnRMb25nLAkvKiBsb25nICovCi0gIGJ0X1VMb25nCT0gYnRVTG9uZywJLyogdW5zaWduZWQgbG9uZyAqLwotICBidF9GbG9hdAk9IGJ0RmxvYXQsCS8qIGZsb2F0IChyZWFsKSAqLwotICBidF9Eb3VibGUJPSBidERvdWJsZSwJLyogRG91YmxlIChyZWFsKSAqLwotICBidF9TdHJ1Y3QJPSBidFN0cnVjdCwJLyogU3RydWN0dXJlIChSZWNvcmQpICovCi0gIGJ0X1VuaW9uCT0gYnRVbmlvbiwJLyogVW5pb24gKHZhcmlhbnQpICovCi0gIGJ0X0VudW0JPSBidEVudW0sCS8qIEVudW1lcmF0ZWQgKi8KLSAgYnRfVHlwZWRlZgk9IGJ0VHlwZWRlZiwJLyogZGVmaW5lZCB2aWEgYSB0eXBlZGVmLCBpc3ltUmVmIHBvaW50cyAqLwotICBidF9SYW5nZQk9IGJ0UmFuZ2UsCS8qIHN1YnJhbmdlIG9mIGludCAqLwotICBidF9TZXQJPSBidFNldCwJLyogcGFzY2FsIHNldHMgKi8KLSAgYnRfQ29tcGxleAk9IGJ0Q29tcGxleCwJLyogZm9ydHJhbiBjb21wbGV4ICovCi0gIGJ0X0RDb21wbGV4CT0gYnREQ29tcGxleCwJLyogZm9ydHJhbiBkb3VibGUgY29tcGxleCAqLwotICBidF9JbmRpcmVjdAk9IGJ0SW5kaXJlY3QsCS8qIGZvcndhcmQgb3IgdW5uYW1lZCB0eXBlZGVmICovCi0gIGJ0X0ZpeGVkRGVjCT0gYnRGaXhlZERlYywJLyogRml4ZWQgRGVjaW1hbCAqLwotICBidF9GbG9hdERlYwk9IGJ0RmxvYXREZWMsCS8qIEZsb2F0IERlY2ltYWwgKi8KLSAgYnRfU3RyaW5nCT0gYnRTdHJpbmcsCS8qIFZhcnlpbmcgTGVuZ3RoIENoYXJhY3RlciBTdHJpbmcgKi8KLSAgYnRfQml0CT0gYnRCaXQsCS8qIEFsaWduZWQgQml0IFN0cmluZyAqLwotICBidF9QaWN0dXJlCT0gYnRQaWN0dXJlLAkvKiBQaWN0dXJlICovCi0gIGJ0X1ZvaWQJPSBidFZvaWQsCS8qIFZvaWQgKi8KLSAgYnRfTWF4CT0gYnRNYXgJCS8qIE1heCBiYXNpYyB0eXBlKzEgKi8KLX0gYnRfdDsKLQotI2RlZmluZSBOX1RRIGl0cU1heAotCi0vKiBTdGF0ZXMgZm9yIHdoZXRoZXIgdG8gaGFzaCB0eXBlIG9yIG5vdC4gICovCi10eXBlZGVmIGVudW0gaGFzaF9zdGF0ZSB7Ci0gIGhhc2hfbm8JPSAwLAkJLyogZG9uJ3QgaGFzaCB0eXBlICovCi0gIGhhc2hfeWVzCT0gMSwJCS8qIG9rIHRvIGhhc2ggdHlwZSwgb3IgdXNlIHByZXZpb3VzIGhhc2ggKi8KLSAgaGFzaF9yZWNvcmQJPSAyCQkvKiBvayB0byByZWNvcmQgaGFzaCwgYnV0IGRvbid0IHVzZSBwcmV2LiAqLwotfSBoYXNoX3N0YXRlX3Q7Ci0KLS8qIFR5cGVzIG9mIGRpZmZlcmVudCBzaXplZCBhbGxvY2F0aW9uIHJlcXVlc3RzLiAgKi8KLWVudW0gYWxsb2NfdHlwZSB7Ci0gIGFsbG9jX3R5cGVfbm9uZSwJCS8qIGR1bW15IHZhbHVlICovCi0gIGFsbG9jX3R5cGVfc2NvcGUsCQkvKiBuZXN0ZWQgc2NvcGVzIGxpbmtlZCBsaXN0ICovCi0gIGFsbG9jX3R5cGVfdmxpbmtzLAkJLyogZ2x1ZSBsaW5raW5nIHBhZ2VzIGluIHZhcnJheSAqLwotICBhbGxvY190eXBlX3NoYXNoLAkJLyogc3RyaW5nIGhhc2ggZWxlbWVudCAqLwotICBhbGxvY190eXBlX3RoYXNoLAkJLyogdHlwZSBoYXNoIGVsZW1lbnQgKi8KLSAgYWxsb2NfdHlwZV90YWcsCQkvKiBzdHJ1Y3QvdW5pb24vdGFnIGVsZW1lbnQgKi8KLSAgYWxsb2NfdHlwZV9mb3J3YXJkLAkJLyogZWxlbWVudCB0byBob2xkIHVua25vd24gdGFnICovCi0gIGFsbG9jX3R5cGVfdGhlYWQsCQkvKiBoZWFkIG9mIHR5cGUgaGFzaCBsaXN0ICovCi0gIGFsbG9jX3R5cGVfdmFycmF5LAkJLyogZ2VuZXJhbCB2YXJyYXkgYWxsb2NhdGlvbiAqLwotICBhbGxvY190eXBlX2xpbmVubywJCS8qIGxpbmUgbnVtYmVyIGxpc3QgKi8KLSAgYWxsb2NfdHlwZV9sYXN0CQkvKiBsYXN0KzEgZWxlbWVudCBmb3IgYXJyYXkgYm91bmRzICovCi19OwotCi0vKiBUeXBlcyBvZiBhdXhpbGlhcnkgdHlwZSBpbmZvcm1hdGlvbi4gICovCi1lbnVtIGF1eF90eXBlIHsKLSAgYXV4X3RpciwJCQkvKiBUSVIgdHlwZSBpbmZvcm1hdGlvbiAqLwotICBhdXhfcm5keCwJCQkvKiByZWxhdGl2ZSBpbmRleCBpbnRvIHN5bWJvbCB0YWJsZSAqLwotICBhdXhfZG5Mb3csCQkJLyogbG93IGRpbWVuc2lvbiAqLwotICBhdXhfZG5IaWdoLAkJCS8qIGhpZ2ggZGltZW5zaW9uICovCi0gIGF1eF9pc3ltLAkJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCAoZW5kIG9mIHByb2MpICovCi0gIGF1eF9pc3MsCQkJLyogaW5kZXggaW50byBzdHJpbmcgc3BhY2UgKG5vdCB1c2VkKSAqLwotICBhdXhfd2lkdGgsCQkJLyogd2lkdGggZm9yIG5vbi1kZWZhdWx0IHNpemVkIHN0cnVjIGZpZWxkcyAqLwotICBhdXhfY291bnQJCQkvKiBjb3VudCBvZiByYW5nZXMgZm9yIHZhcmlhbnQgYXJtICovCi19OwotDAotLyogU3RydWN0dXJlcyB0byBwcm92aWRlIG4tbnVtYmVyIG9mIHZpcnR1YWwgYXJyYXlzLCBlYWNoIG9mIHdoaWNoIGNhbgotICAgZ3JvdyBsaW5lYXJseSwgYW5kIHdoaWNoIGFyZSB3cml0dGVuIGluIHRoZSBvYmplY3QgZmlsZSBhcwotICAgc2VxdWVudGlhbCBwYWdlcy4gIE9uIHN5c3RlbXMgd2l0aCBhIEJTRCBtYWxsb2MsIHRoZQotICAgTUFYX0NMVVNURVJfUEFHRVMgc2hvdWxkIGJlIDEgbGVzcyB0aGFuIGEgcG93ZXIgb2YgdHdvLCBzaW5jZQotICAgbWFsbG9jIGFkZHMgaXQncyBvdmVyaGVhZCwgYW5kIHJvdW5kcyB1cCB0byB0aGUgbmV4dCBwb3dlciBvZiAyLgotICAgUGFnZXMgYXJlIGxpbmtlZCB0b2dldGhlciB2aWEgYSBsaW5rZWQgbGlzdC4KLQotICAgSWYgUEFHRV9TSVpFIGlzID4gNDA5NiwgdGhlIHN0cmluZyBsZW5ndGggaW4gdGhlIHNoYXNoX3Qgc3RydWN0dXJlCi0gICBjYW4ndCBiZSByZXByZXNlbnRlZCAoYXNzdW1pbmcgdGhlcmUgYXJlIHN0cmluZ3MgPiA0MDk2IGJ5dGVzKS4gICovCi0KLS8qIEZJWE1FOiBZZXMsIHRoZXJlIGNhbiBiZSBzdWNoIHN0cmluZ3Mgd2hpbGUgZW1pdHRpbmcgQysrIGNsYXNzIGRlYnVnCi0gICBpbmZvLiAgVGVtcGxhdGVzIGFyZSB0aGUgb2ZmZW5kZXIgaGVyZSwgdGhlIHRlc3QgY2FzZSBpbiBxdWVzdGlvbiAKLSAgIGhhdmluZyBhIG1hbmdsZWQgY2xhc3MgbmFtZSBvZgotCi0gICAgIHQ3cmJfdHJlZTRaNHhrZXladDRwYWlyMlpDNHhrZXladDd4c29ja2V0MVo0VXNlclp0OXNlbGVjdDFzdDJadDRwYWlyXAotICAgICAyWkM0eGtleVp0N3hzb2NrZXQxWjRVc2VyWjR4a2V5WnQ0bGVzczFaNHhrZXkKLQotICAgUmVwZWF0IHRoYXQgYSBjb3VwbGUgZG96ZW4gdGltZXMgd2hpbGUgbGlzdGluZyB0aGUgY2xhc3MgbWVtYmVycyBhbmQKLSAgIHlvdSd2ZSBnb3Qgc3RyaW5ncyBvdmVyIDRrLiAgSGFjayBhcm91bmQgdGhpcyBmb3Igbm93IGJ5IGluY3JlYXNpbmcKLSAgIHRoZSBwYWdlIHNpemUuICBBIHByb3BlciBzb2x1dGlvbiB3b3VsZCBhYmFuZG9uIHRoaXMgc3RydWN0dXJlIHNjaGVtZQotICAgY2VydGFpbmx5IGZvciB2ZXJ5IGxhcmdlIHN0cmluZ3MsIGFuZCBwb3NzaWJseSBlbnRpcmVseS4gICovCi0KLSNpZm5kZWYgUEFHRV9TSVpFCi0jZGVmaW5lIFBBR0VfU0laRSAoOCoxMDI0KQkvKiBzaXplIG9mIHZhcnJheSBwYWdlcyAqLwotI2VuZGlmCi0KLSNkZWZpbmUgUEFHRV9VU0laRSAoKHVuc2lnbmVkIGxvbmcpIFBBR0VfU0laRSkKLQotI2lmbmRlZiBNQVhfQ0xVU1RFUl9QQUdFUwkvKiAjIHBhZ2VzIHRvIGdldCBmcm9tIHN5c3RlbSAqLwotI2RlZmluZSBNQVhfQ0xVU1RFUl9QQUdFUyA2MwotI2VuZGlmCi0KLS8qIExpbmtlZCBsaXN0IGNvbm5lY3Rpbmcgc2VwYXJhdGUgcGFnZSBhbGxvY2F0aW9ucy4gICovCi10eXBlZGVmIHN0cnVjdCB2bGlua3MgewotICBzdHJ1Y3QgdmxpbmtzCSpwcmV2OwkJLyogcHJldmlvdXMgc2V0IG9mIHBhZ2VzICovCi0gIHN0cnVjdCB2bGlua3MgKm5leHQ7CQkvKiBuZXh0IHNldCBvZiBwYWdlcyAqLwotICB1bmlvbiAgcGFnZSAgICpkYXR1bTsJCS8qIHN0YXJ0IG9mIHBhZ2UgKi8KLSAgdW5zaWduZWQgbG9uZwkgc3RhcnRfaW5kZXg7CS8qIHN0YXJ0aW5nIGluZGV4ICMgb2YgcGFnZSAqLwotfSB2bGlua3NfdDsKLQotCi0vKiBWaXJ0dWFsIGFycmF5IGhlYWRlci4gICovCi10eXBlZGVmIHN0cnVjdCB2YXJyYXkgewotICB2bGlua3NfdAkqZmlyc3Q7CQkJLyogZmlyc3QgcGFnZSBsaW5rICovCi0gIHZsaW5rc190CSpsYXN0OwkJCS8qIGxhc3QgcGFnZSBsaW5rICovCi0gIHVuc2lnbmVkIGxvbmcJIG51bV9hbGxvY2F0ZWQ7CQkvKiAjIG9iamVjdHMgYWxsb2NhdGVkICovCi0gIHVuc2lnbmVkIHNob3J0IG9iamVjdF9zaXplOwkJLyogc2l6ZSBpbiBieXRlcyBvZiBlYWNoIG9iamVjdCAqLwotICB1bnNpZ25lZCBzaG9ydCBvYmplY3RzX3Blcl9wYWdlOwkvKiAjIG9iamVjdHMgdGhhdCBjYW4gZml0IG9uIGEgcGFnZSAqLwotICB1bnNpZ25lZCBzaG9ydCBvYmplY3RzX2xhc3RfcGFnZTsJLyogIyBvYmplY3RzIGFsbG9jYXRlZCBvbiBsYXN0IHBhZ2UgKi8KLX0gdmFycmF5X3Q7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0jZGVmaW5lIE9CSkVDVFNfUEVSX1BBR0UodHlwZSkgKFBBR0VfU0laRSAvIHNpemVvZiAodHlwZSkpCi0jZWxzZQotI2RlZmluZSBPQkpFQ1RTX1BFUl9QQUdFKHR5cGUpICgoc2l6ZW9mICh0eXBlKSA+IDEpID8gMSA6IFBBR0VfU0laRSkKLSNlbmRpZgotCi0jZGVmaW5lIElOSVRfVkFSUkFZKHR5cGUpIHsJLyogbWFjcm8gdG8gaW5pdGlhbGl6ZSBhIHZhcnJheSAqLwlcCi0gICh2bGlua3NfdCAqKTAsCQkvKiBmaXJzdCAqLwkJCQlcCi0gICh2bGlua3NfdCAqKTAsCQkvKiBsYXN0ICovCQkJCVwKLSAgMCwJCQkJLyogbnVtX2FsbG9jYXRlZCAqLwkJCVwKLSAgc2l6ZW9mICh0eXBlKSwJCS8qIG9iamVjdF9zaXplICovCQkJXAotICBPQkpFQ1RTX1BFUl9QQUdFICh0eXBlKSwJLyogb2JqZWN0c19wZXJfcGFnZSAqLwkJCVwKLSAgT0JKRUNUU19QRVJfUEFHRSAodHlwZSksCS8qIG9iamVjdHNfbGFzdF9wYWdlICovCQkJXAotfQotCi0KLS8qIE1hc3RlciB0eXBlIGZvciBpbmRleGVzIHdpdGhpbiB0aGUgc3ltYm9sIHRhYmxlLiAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWludF90OwotCi0KLS8qIExpbmtlZCBsaXN0IHN1cHBvcnQgZm9yIG5lc3RlZCBzY29wZXMgKGZpbGUsIGJsb2NrLCBzdHJ1Y3R1cmUsIGV0Yy4pLiAgKi8KLXR5cGVkZWYgc3RydWN0IHNjb3BlIHsKLSAgc3RydWN0IHNjb3BlCSpwcmV2OwkJLyogcHJldmlvdXMgc2NvcGUgbGV2ZWwgKi8KLSAgc3RydWN0IHNjb3BlCSpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgc3RydWN0IGxvY2Fsc3ltICpsc3ltOwkvKiBwb2ludGVyIHRvIGxvY2FsIHN5bWJvbCBub2RlICovCi0gIHN0X3QJCSB0eXBlOwkJLyogdHlwZSBvZiB0aGUgbm9kZSAqLwotfSBzY29wZV90OwotCi0KLS8qIEZvciBhIGxvY2FsIHN5bWJvbCB3ZSBzdG9yZSBhIGdhcyBzeW1ib2wgYXMgd2VsbCBhcyB0aGUgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbiB3ZSBnZW5lcmF0ZS4gIFRoZSBnYXMgc3ltYm9sIHdpbGwgYmUgTlVMTCBpZiB0aGlzIGlzCi0gICBvbmx5IGEgZGVidWdnaW5nIHN5bWJvbC4gICovCi10eXBlZGVmIHN0cnVjdCBsb2NhbHN5bSB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBzeW1ib2wgbmFtZSAqLwotICBzeW1ib2xTICphc19zeW07CQkvKiBzeW1ib2wgYXMgc2VlbiBieSBnYXMgKi8KLSAgYmZkX3ZtYSBhZGRlbmQ7CQkvKiBhZGRlbmQgdG8gYXNfc3ltIHZhbHVlICovCi0gIHN0cnVjdCBlZmRyICpmaWxlX3B0cjsJLyogZmlsZSBwb2ludGVyICovCi0gIHN0cnVjdCBlY29mZl9wcm9jICpwcm9jX3B0cjsJLyogcHJvYyBwb2ludGVyICovCi0gIHN0cnVjdCBsb2NhbHN5bSAqYmVnaW5fcHRyOwkvKiBzeW1ib2wgYXQgc3RhcnQgb2YgYmxvY2sgKi8KLSAgc3RydWN0IGVjb2ZmX2F1eCAqaW5kZXhfcHRyOwkvKiBpbmRleCB2YWx1ZSB0byBiZSBmaWxsZWQgaW4gKi8KLSAgc3RydWN0IGZvcndhcmQgKmZvcndhcmRfcmVmOwkvKiBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gdGhpcyBzeW1ib2wgKi8KLSAgbG9uZyBzeW1faW5kZXg7CQkvKiBmaW5hbCBzeW1ib2wgaW5kZXggKi8KLSAgRVhUUiBlY29mZl9zeW07CQkvKiBFQ09GRiBkZWJ1Z2dpbmcgc3ltYm9sICovCi19IGxvY2Fsc3ltX3Q7Ci0KLQotLyogRm9yIGF1eCBpbmZvcm1hdGlvbiB3ZSBrZWVwIHRoZSB0eXBlIGFuZCB0aGUgZGF0YS4gICovCi10eXBlZGVmIHN0cnVjdCBlY29mZl9hdXggewotICBlbnVtIGF1eF90eXBlIHR5cGU7CQkvKiBhdXggdHlwZSAqLwotICBBVVhVIGRhdGE7CQkJLyogYXV4IGRhdGEgKi8KLX0gYXV4X3Q7Ci0KLS8qIEZvciBhIHByb2NlZHVyZSB3ZSBzdG9yZSB0aGUgZ2FzIHN5bWJvbCBhcyB3ZWxsIGFzIHRoZSBQRFIKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCBlY29mZl9wcm9jIHsKLSAgbG9jYWxzeW1fdCAqc3ltOwkJLyogYXNzb2NpYXRlZCBzeW1ib2wgKi8KLSAgUERSIHBkcjsJCQkvKiBFQ09GRiBkZWJ1Z2dpbmcgaW5mbyAqLwotfSBwcm9jX3Q7Ci0KLS8qIE51bWJlciBvZiBwcm9jX3Qgc3RydWN0dXJlcyBhbGxvY2F0ZWQuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJvY19jbnQ7Ci0KLQotLyogRm9yd2FyZCByZWZlcmVuY2UgbGlzdCBmb3IgdGFncyByZWZlcmVuY2VkLCBidXQgbm90IHlldCBkZWZpbmVkLiAgKi8KLXR5cGVkZWYgc3RydWN0IGZvcndhcmQgewotICBzdHJ1Y3QgZm9yd2FyZCAqbmV4dDsJCS8qIG5leHQgZm9yd2FyZCByZWZlcmVuY2UgKi8KLSAgc3RydWN0IGZvcndhcmQgKmZyZWU7CQkvKiBmcmVlIGxpc3QgcG9pbnRlciAqLwotICBhdXhfdAkJICppZmRfcHRyOwkvKiBwb2ludGVyIHRvIHN0b3JlIGZpbGUgaW5kZXggKi8KLSAgYXV4X3QJCSAqaW5kZXhfcHRyOwkvKiBwb2ludGVyIHRvIHN0b3JlIHN5bWJvbCBpbmRleCAqLwotfSBmb3J3YXJkX3Q7Ci0KLQotLyogTGlua2VkIGxpc3Qgc3VwcG9ydCBmb3IgdGFncy4gIFRoZSBmaXJzdCB0YWcgaW4gdGhlIGxpc3QgaXMgYWx3YXlzCi0gICB0aGUgY3VycmVudCB0YWcgZm9yIHRoYXQgYmxvY2suICAqLwotdHlwZWRlZiBzdHJ1Y3QgdGFnIHsKLSAgc3RydWN0IHRhZwkgKmZyZWU7CQkvKiBmcmVlIGxpc3QgcG9pbnRlciAqLwotICBzdHJ1Y3Qgc2hhc2gJICpoYXNoX3B0cjsJLyogcG9pbnRlciB0byB0aGUgaGFzaCB0YWJsZSBoZWFkICovCi0gIHN0cnVjdCB0YWcJICpzYW1lX25hbWU7CS8qIHRhZyB3aXRoIHNhbWUgbmFtZSBpbiBvdXRlciBzY29wZSAqLwotICBzdHJ1Y3QgdGFnCSAqc2FtZV9ibG9jazsJLyogbmV4dCB0YWcgZGVmaW5lZCBpbiB0aGUgc2FtZSBibG9jay4gICovCi0gIHN0cnVjdCBmb3J3YXJkICpmb3J3YXJkX3JlZjsJLyogbGlzdCBvZiBmb3J3YXJkIHJlZmVyZW5jZXMgKi8KLSAgYnRfdAkJICBiYXNpY190eXBlOwkvKiBidF9TdHJ1Y3QsIGJ0X1VuaW9uLCBvciBidF9FbnVtICovCi0gIHN5bWludF90CSAgaWZkOwkJLyogZmlsZSAjIHRhZyBkZWZpbmVkIGluICovCi0gIGxvY2Fsc3ltX3QJICpzeW07CQkvKiBmaWxlJ3MgbG9jYWwgc3ltYm9scyAqLwotfSB0YWdfdDsKLQotCi0vKiBIZWFkIG9mIGEgYmxvY2sncyBsaW5rZWQgbGlzdCBvZiB0YWdzLiAgKi8KLXR5cGVkZWYgc3RydWN0IHRoZWFkIHsKLSAgc3RydWN0IHRoZWFkCSpwcmV2OwkJLyogcHJldmlvdXMgYmxvY2sgKi8KLSAgc3RydWN0IHRoZWFkCSpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgc3RydWN0IHRhZwkqZmlyc3RfdGFnOwkvKiBmaXJzdCB0YWcgaW4gYmxvY2sgZGVmaW5lZCAqLwotfSB0aGVhZF90OwotCi0KLS8qIFVuaW9uIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gZWFjaCB0aGUgc21hbGwgc3RydWN0dXJlcyB3aGljaCBhcmUgZnJlZWQgdXAuICAqLwotdHlwZWRlZiB1bmlvbiBzbWFsbF9mcmVlIHsKLSAgc2NvcGVfdAkqZl9zY29wZTsJLyogc2NvcGUgc3RydWN0dXJlICovCi0gIHRoZWFkX3QJKmZfdGhlYWQ7CS8qIHRhZyBoZWFkIHN0cnVjdHVyZSAqLwotICB0YWdfdAkJKmZfdGFnOwkJLyogdGFnIGVsZW1lbnQgc3RydWN0dXJlICovCi0gIGZvcndhcmRfdAkqZl9mb3J3YXJkOwkvKiBmb3J3YXJkIHRhZyByZWZlcmVuY2UgKi8KLX0gc21hbGxfZnJlZV90OwotCi0KLS8qIFN0cmluZyBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc2hhc2ggewotICBjaGFyCQkqc3RyaW5nOwkvKiBzdHJpbmcgd2UgYXJlIGhhc2hpbmcgKi8KLSAgc3ltaW50X3QJIGluZHg7CQkvKiBpbmRleCB3aXRoaW4gc3RyaW5nIHRhYmxlICovCi0gIEVYVFIJCSplc3ltX3B0cjsJLyogZ2xvYmFsIHN5bWJvbCBwb2ludGVyICovCi0gIGxvY2Fsc3ltX3QJKnN5bV9wdHI7CS8qIGxvY2FsIHN5bWJvbCBwb2ludGVyICovCi0gIGxvY2Fsc3ltX3QJKmVuZF9wdHI7CS8qIHN5bWJvbCBwb2ludGVyIHRvIGVuZCBibG9jayAqLwotICB0YWdfdAkJKnRhZ19wdHI7CS8qIHRhZyBwb2ludGVyICovCi0gIHByb2NfdAkqcHJvY19wdHI7CS8qIHByb2NlZHVyZSBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KLX0gc2hhc2hfdDsKLQotCi0vKiBUeXBlIGhhc2ggdGFibGUgc3VwcG9ydC4gIFRoZSBzaXplIG9mIHRoZSBoYXNoIHRhYmxlIG11c3QgZml0Ci0gICB3aXRoaW4gYSBwYWdlIHdpdGggdGhlIG90aGVyIGV4dGVuZGVkIGZpbGUgZGVzY3JpcHRvciBpbmZvcm1hdGlvbi4KLSAgIEJlY2F1c2UgdW5pcXVlIHR5cGVzIHdoaWNoIGFyZSBoYXNoZWQgYXJlIGZld2VyIGluIG51bWJlciB0aGFuCi0gICBzdHJpbmdzLCB3ZSB1c2UgYSBzbWFsbGVyIGhhc2ggdmFsdWUuICAqLwotCi0jZGVmaW5lIEhBU0hCSVRTIDMwCi0KLSNpZm5kZWYgVEhBU0hfU0laRQotI2RlZmluZSBUSEFTSF9TSVpFIDExMwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHRoYXNoIHsKLSAgc3RydWN0IHRoYXNoCSpuZXh0OwkJLyogbmV4dCBoYXNoIHZhbHVlICovCi0gIEFVWFUJCSB0eXBlOwkJLyogdHlwZSB3ZSBhcmUgaGFzaGluZyAqLwotICBzeW1pbnRfdAkgaW5keDsJCS8qIGluZGV4IHdpdGhpbiBzdHJpbmcgdGFibGUgKi8KLX0gdGhhc2hfdDsKLQotCi0vKiBFeHRlbmRlZCBmaWxlIGRlc2NyaXB0b3IgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHN1cHBvcnQgbmVjZXNzYXJ5Ci0gICB0byBhZGQgdGhpbmdzIHRvIGVhY2ggZmlsZSBzZXBhcmF0ZWx5LiAgKi8KLXR5cGVkZWYgc3RydWN0IGVmZHIgewotICBGRFIJCSBmZHI7CQkvKiBGaWxlIGhlYWRlciB0byBiZSB3cml0dGVuIG91dCAqLwotICBGRFIJCSpvcmlnX2ZkcjsJLyogb3JpZ2luYWwgZmlsZSBoZWFkZXIgKi8KLSAgY2hhcgkJKm5hbWU7CQkvKiBmaWxlbmFtZSAqLwotICBpbnQJCSBmYWtlOwkJLyogd2hldGhlciB0aGlzIGlzIGZha2VkIC5maWxlICovCi0gIHN5bWludF90CSB2b2lkX3R5cGU7CS8qIGF1eC4gcG9pbnRlciB0byAndm9pZCcgdHlwZSAqLwotICBzeW1pbnRfdAkgaW50X3R5cGU7CS8qIGF1eC4gcG9pbnRlciB0byAnaW50JyB0eXBlICovCi0gIHNjb3BlX3QJKmN1cl9zY29wZTsJLyogY3VycmVudCBuZXN0ZWQgc2NvcGVzICovCi0gIHN5bWludF90CSBmaWxlX2luZGV4OwkvKiBjdXJyZW50IGZpbGUgbnVtYmVyICovCi0gIGludAkJIG5lc3RlZF9zY29wZXM7CS8qICMgbmVzdGVkIHNjb3BlcyAqLwotICB2YXJyYXlfdAkgc3RyaW5nczsJLyogbG9jYWwgc3RyaW5ncyAqLwotICB2YXJyYXlfdAkgc3ltYm9sczsJLyogbG9jYWwgc3ltYm9scyAqLwotICB2YXJyYXlfdAkgcHJvY3M7CQkvKiBwcm9jZWR1cmVzICovCi0gIHZhcnJheV90CSBhdXhfc3ltczsJLyogYXV4aWxpYXJ5IHN5bWJvbHMgKi8KLSAgc3RydWN0IGVmZHIJKm5leHRfZmlsZTsJLyogbmV4dCBmaWxlIGRlc2NyaXB0b3IgKi8KLQkJCQkvKiBzdHJpbmcvdHlwZSBoYXNoIHRhYmxlcyAqLwotICBzdHJ1Y3QgaGFzaF9jb250cm9sICpzdHJfaGFzaDsJLyogc3RyaW5nIGhhc2ggdGFibGUgKi8KLSAgdGhhc2hfdAkqdGhhc2hfaGVhZFtUSEFTSF9TSVpFXTsKLX0gZWZkcl90OwotCi0vKiBQcmUtaW5pdGlhbGl6ZWQgZXh0ZW5kZWQgZmlsZSBzdHJ1Y3R1cmUuICAqLwotc3RhdGljIGNvbnN0IGVmZHJfdCBpbml0X2ZpbGUgPQotewotICB7CQkJLyogRkRSIHN0cnVjdHVyZSAqLwotICAgIDAsCQkJLyogYWRyOgkJbWVtb3J5IGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIGZpbGUgKi8KLSAgICAwLAkJCS8qIHJzczoJCWZpbGUgbmFtZSAob2Ygc291cmNlLCBpZiBrbm93bikgKi8KLSAgICAwLAkJCS8qIGlzc0Jhc2U6CWZpbGUncyBzdHJpbmcgc3BhY2UgKi8KLSAgICAwLAkJCS8qIGNiU3M6CW51bWJlciBvZiBieXRlcyBpbiB0aGUgc3MgKi8KLSAgICAwLAkJCS8qIGlzeW1CYXNlOgliZWdpbm5pbmcgb2Ygc3ltYm9scyAqLwotICAgIDAsCQkJLyogY3N5bToJY291bnQgZmlsZSdzIG9mIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGlsaW5lQmFzZToJZmlsZSdzIGxpbmUgc3ltYm9scyAqLwotICAgIDAsCQkJLyogY2xpbmU6CWNvdW50IG9mIGZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGlvcHRCYXNlOglmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLSAgICAwLAkJCS8qIGNvcHQ6CWNvdW50IG9mIGZpbGUncyBvcHRpbWl6YXRpb24gZW50cmllcyAqLwotICAgIDAsCQkJLyogaXBkRmlyc3Q6CXN0YXJ0IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLwotICAgIDAsCQkJLyogY3BkOgkJY291bnQgb2YgcHJvY2VkdXJlcyBmb3IgdGhpcyBmaWxlICovCi0gICAgMCwJCQkvKiBpYXV4QmFzZToJZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCi0gICAgMCwJCQkvKiBjYXV4Ogljb3VudCBvZiBmaWxlJ3MgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLSAgICAwLAkJCS8qIHJmZEJhc2U6CWluZGV4IGludG8gdGhlIGZpbGUgaW5kaXJlY3QgdGFibGUgKi8KLSAgICAwLAkJCS8qIGNyZmQ6CWNvdW50IGZpbGUgaW5kaXJlY3QgZW50cmllcyAqLwotICAgIGxhbmdDLAkJLyogbGFuZzoJbGFuZ3VhZ2UgZm9yIHRoaXMgZmlsZSAqLwotICAgIDEsCQkJLyogZk1lcmdlOgl3aGV0aGVyIHRoaXMgZmlsZSBjYW4gYmUgbWVyZ2VkICovCi0gICAgMCwJCQkvKiBmUmVhZGluOgl0cnVlIGlmIHJlYWQgaW4gKG5vdCBqdXN0IGNyZWF0ZWQpICovCi0gICAgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sICAvKiBmQmlnZW5kaWFuOglpZiAxLCBjb21waWxlZCBvbiBiaWcgZW5kaWFuIG1hY2hpbmUgKi8KLSAgICBHTEVWRUxfMiwJCS8qIGdsZXZlbDoJbGV2ZWwgdGhpcyBmaWxlIHdhcyBjb21waWxlZCB3aXRoICovCi0gICAgMCwJCQkvKiByZXNlcnZlZDoJcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLSAgICAwLAkJCS8qIGNiTGluZU9mZnNldDogYnl0ZSBvZmZzZXQgZnJvbSBoZWFkZXIgZm9yIHRoaXMgZmlsZSBsbidzICovCi0gICAgMCwJCQkvKiBjYkxpbmU6CXNpemUgb2YgbGluZXMgZm9yIHRoaXMgZmlsZSAqLwotICB9LAotCi0gIChGRFIgKikwLAkJLyogb3JpZ19mZHI6CW9yaWdpbmFsIGZpbGUgaGVhZGVyIHBvaW50ZXIgKi8KLSAgKGNoYXIgKikwLAkJLyogbmFtZToJcG9pbnRlciB0byBmaWxlbmFtZSAqLwotICAwLAkJCS8qIGZha2U6CXdoZXRoZXIgdGhpcyBpcyBhIGZha2VkIC5maWxlICovCi0gIDAsCQkJLyogdm9pZF90eXBlOglwdHIgdG8gYXV4IG5vZGUgZm9yIHZvaWQgdHlwZSAqLwotICAwLAkJCS8qIGludF90eXBlOglwdHIgdG8gYXV4IG5vZGUgZm9yIGludCB0eXBlICovCi0gIChzY29wZV90ICopMCwJCS8qIGN1cl9zY29wZToJY3VycmVudCBzY29wZSBiZWluZyBwcm9jZXNzZWQgKi8KLSAgMCwJCQkvKiBmaWxlX2luZGV4OgljdXJyZW50IGZpbGUgIyAqLwotICAwLAkJCS8qIG5lc3RlZF9zY29wZXM6ICMgbmVzdGVkIHNjb3BlcyAqLwotICBJTklUX1ZBUlJBWSAoY2hhciksCS8qIHN0cmluZ3M6CWxvY2FsIHN0cmluZyB2YXJyYXkgKi8KLSAgSU5JVF9WQVJSQVkgKGxvY2Fsc3ltX3QpLAkvKiBzeW1ib2xzOglsb2NhbCBzeW1ib2xzIHZhcnJheSAqLwotICBJTklUX1ZBUlJBWSAocHJvY190KSwJLyogcHJvY3M6CXByb2NlZHVyZSB2YXJyYXkgKi8KLSAgSU5JVF9WQVJSQVkgKGF1eF90KSwJLyogYXV4X3N5bXM6CWF1eGlsaWFyeSBzeW1ib2xzIHZhcnJheSAqLwotCi0gIChzdHJ1Y3QgZWZkciAqKTAsCS8qIG5leHRfZmlsZToJbmV4dCBmaWxlIHN0cnVjdHVyZSAqLwotCi0gIChzdHJ1Y3QgaGFzaF9jb250cm9sICopMCwJLyogc3RyX2hhc2g6CXN0cmluZyBoYXNoIHRhYmxlICovCi0gIHsgMCB9LAkJLyogdGhhc2hfaGVhZDoJdHlwZSBoYXNoIHRhYmxlICovCi19OwotCi0KLXN0YXRpYyBlZmRyX3QgKmZpcnN0X2ZpbGU7CQkJLyogZmlyc3QgZmlsZSBkZXNjcmlwdG9yICovCi1zdGF0aWMgZWZkcl90ICoqbGFzdF9maWxlX3B0ciA9ICZmaXJzdF9maWxlOwkvKiBmaWxlIGRlc2NyaXB0b3IgdGFpbCAqLwotCi0KLS8qIExpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGlzIGtlcHQgaW4gYSBsaXN0IHVudGlsIHRoZSBhc3NlbWJseSBpcwotICAgZmluaXNoZWQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgbGluZW5vX2xpc3QgewotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKm5leHQ7CS8qIG5leHQgZWxlbWVudCBpbiBsaXN0ICovCi0gIGVmZHJfdCAqZmlsZTsJCQkvKiBmaWxlIHRoaXMgbGluZSBpcyBpbiAqLwotICBwcm9jX3QgKnByb2M7CQkJLyogcHJvY2VkdXJlIHRoaXMgbGluZSBpcyBpbiAqLwotICBmcmFnUyAqZnJhZzsJCQkvKiBmcmFnbWVudCB0aGlzIGxpbmUgbnVtYmVyIGlzIGluICovCi0gIHVuc2lnbmVkIGxvbmcgcGFkZHI7CQkvKiBvZmZzZXQgd2l0aGluIGZyYWdtZW50ICovCi0gIGxvbmcgbGluZW5vOwkJCS8qIGFjdHVhbCBsaW5lIG51bWJlciAqLwotfSBsaW5lbm9fbGlzdF90OwotCi1zdGF0aWMgbGluZW5vX2xpc3RfdCAqZmlyc3RfbGluZW5vOwotc3RhdGljIGxpbmVub19saXN0X3QgKmxhc3RfbGluZW5vOwotc3RhdGljIGxpbmVub19saXN0X3QgKipsYXN0X2xpbmVub19wdHIgPSAmZmlyc3RfbGluZW5vOwotCi0vKiBTb21ldGltZXMgdGhlcmUgd2lsbCBiZSBzb21lIC5sb2Mgc3RhdGVtZW50cyBiZWZvcmUgYSAuZW50LiAgV2UKLSAgIGtlZXAgdGhlbSBpbiB0aGlzIGxpc3Qgc28gdGhhdCB3ZSBjYW4gZmlsbCBpbiB0aGUgcHJvY2VkdXJlIHBvaW50ZXIKLSAgIGFmdGVyIHdlIHNlZSB0aGUgLmVudC4gICovCi1zdGF0aWMgbGluZW5vX2xpc3RfdCAqbm9wcm9jX2xpbmVubzsKLQotLyogVW5pb24gb2YgdmFyaW91cyB0aGluZ3MgdGhhdCBhcmUgaGVsZCBpbiBwYWdlcy4gICovCi10eXBlZGVmIHVuaW9uIHBhZ2UgewotICBjaGFyCQlieXRlCVsgUEFHRV9TSVpFIF07Ci0gIHVuc2lnbmVkIGNoYXIJdWJ5dGUJWyBQQUdFX1NJWkUgXTsKLSAgZWZkcl90CWZpbGUJWyBQQUdFX1NJWkUgLyBzaXplb2YgKGVmZHJfdCkJICAgICBdOwotICBGRFIJCW9maWxlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChGRFIpCSAgICAgXTsKLSAgcHJvY190CXByb2MJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHByb2NfdCkJICAgICBdOwotICBsb2NhbHN5bV90CXN5bQlbIFBBR0VfU0laRSAvIHNpemVvZiAobG9jYWxzeW1fdCkgICAgXTsKLSAgYXV4X3QJCWF1eAlbIFBBR0VfU0laRSAvIHNpemVvZiAoYXV4X3QpCSAgICAgXTsKLSAgRE5SCQlkZW5zZQlbIFBBR0VfU0laRSAvIHNpemVvZiAoRE5SKQkgICAgIF07Ci0gIHNjb3BlX3QJc2NvcGUJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHNjb3BlX3QpCSAgICAgXTsKLSAgdmxpbmtzX3QJdmxpbmtzCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh2bGlua3NfdCkJICAgICBdOwotICBzaGFzaF90CXNoYXNoCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChzaGFzaF90KQkgICAgIF07Ci0gIHRoYXNoX3QJdGhhc2gJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHRoYXNoX3QpCSAgICAgXTsKLSAgdGFnX3QJCXRhZwlbIFBBR0VfU0laRSAvIHNpemVvZiAodGFnX3QpCSAgICAgXTsKLSAgZm9yd2FyZF90CWZvcndhcmQJWyBQQUdFX1NJWkUgLyBzaXplb2YgKGZvcndhcmRfdCkgICAgIF07Ci0gIHRoZWFkX3QJdGhlYWQJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHRoZWFkX3QpCSAgICAgXTsKLSAgbGluZW5vX2xpc3RfdAlsaW5lbm8JWyBQQUdFX1NJWkUgLyBzaXplb2YgKGxpbmVub19saXN0X3QpIF07Ci19IHBhZ2VfdHlwZTsKLQotCi0vKiBTdHJ1Y3R1cmUgaG9sZGluZyBhbGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBzbWFsbCBzaXplZCBzdHJ1Y3R1cmVzLiAgKi8KLXR5cGVkZWYgc3RydWN0IGFsbG9jX2luZm8gewotICBjaGFyCQkqYWxsb2NfbmFtZTsJLyogbmFtZSBvZiB0aGlzIGFsbG9jYXRpb24gdHlwZSAobXVzdCBiZSBmaXJzdCkgKi8KLSAgcGFnZV90eXBlCSpjdXJfcGFnZTsJLyogY3VycmVudCBwYWdlIGJlaW5nIGFsbG9jYXRlZCBmcm9tICovCi0gIHNtYWxsX2ZyZWVfdAkgZnJlZV9saXN0OwkvKiBjdXJyZW50IGZyZWUgbGlzdCBpZiBhbnkgKi8KLSAgaW50CQkgdW5hbGxvY2F0ZWQ7CS8qIG51bWJlciBvZiBlbGVtZW50cyB1bmFsbG9jYXRlZCBvbiBwYWdlICovCi0gIGludAkJIHRvdGFsX2FsbG9jOwkvKiB0b3RhbCBudW1iZXIgb2YgYWxsb2NhdGlvbnMgKi8KLSAgaW50CQkgdG90YWxfZnJlZTsJLyogdG90YWwgbnVtYmVyIG9mIGZyZWVzICovCi0gIGludAkJIHRvdGFsX3BhZ2VzOwkvKiB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYWxsb2NhdGVkICovCi19IGFsbG9jX2luZm9fdDsKLQotCi0vKiBUeXBlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCB0b2dldGhlci4gICovCi10eXBlZGVmIHN0cnVjdCB0eXBlX2luZm8gewotICBidF90CSAgICAgIGJhc2ljX3R5cGU7CQkvKiBiYXNpYyB0eXBlICovCi0gIGludAkgICAgICBvcmlnX3R5cGU7CQkvKiBvcmlnaW5hbCBDT0ZGLWJhc2VkIHR5cGUgKi8KLSAgaW50CSAgICAgIG51bV90cTsJCQkvKiAjIHR5cGUgcXVhbGlmaWVycyAqLwotICBpbnQJICAgICAgbnVtX2RpbXM7CQkJLyogIyBkaW1lbnNpb25zICovCi0gIGludAkgICAgICBudW1fc2l6ZXM7CQkvKiAjIHNpemVzICovCi0gIGludAkgICAgICBleHRyYV9zaXplczsJCS8qICMgZXh0cmEgc2l6ZXMgbm90IHRpZWQgd2l0aCBkaW1zICovCi0gIHRhZ190ICogICAgIHRhZ19wdHI7CQkJLyogdGFnIHBvaW50ZXIgKi8KLSAgaW50CSAgICAgIGJpdGZpZWxkOwkJCS8qIHN5bWJvbCBpcyBhIGJpdGZpZWxkICovCi0gIHRxX3QJICAgICAgdHlwZV9xdWFsaWZpZXJzW05fVFFdOwkvKiB0eXBlIHF1YWxpZmllcnMgKHB0ciwgZnVuYywgYXJyYXkpKi8KLSAgc3ltaW50X3QgICAgZGltZW5zaW9ucyAgICAgW05fVFFdOwkvKiBkaW1lbnNpb25zIGZvciBlYWNoIGFycmF5ICovCi0gIHN5bWludF90ICAgIHNpemVzCSAgICAgW05fVFErMl07CS8qIHNpemVzIG9mIGVhY2ggYXJyYXkgc2xpY2UgKyBzaXplIG9mCi0JCQkJCSAgIHN0cnVjdC91bmlvbi9lbnVtICsgYml0ZmllbGQgc2l6ZSAqLwotfSB0eXBlX2luZm9fdDsKLQotLyogUHJlLWluaXRpYWxpemVkIHR5cGVfaW5mbyBzdHJ1Y3QuICAqLwotc3RhdGljIGNvbnN0IHR5cGVfaW5mb190IHR5cGVfaW5mb19pbml0ID0gewotICBidF9OaWwsCQkJCS8qIGJhc2ljIHR5cGUgKi8KLSAgVF9OVUxMLAkJCQkvKiBvcmlnaW5hbCBDT0ZGLWJhc2VkIHR5cGUgKi8KLSAgMCwJCQkJCS8qICMgdHlwZSBxdWFsaWZpZXJzICovCi0gIDAsCQkJCQkvKiAjIGRpbWVuc2lvbnMgKi8KLSAgMCwJCQkJCS8qICMgc2l6ZXMgKi8KLSAgMCwJCQkJCS8qIHNpemVzIG5vdCB0aWVkIHdpdGggZGltcyAqLwotICBOVUxMLAkJCQkJLyogcHRyIHRvIHRhZyAqLwotICAwLAkJCQkJLyogYml0ZmllbGQgKi8KLSAgewkJCQkJLyogdHlwZSBxdWFsaWZpZXJzICovCi0gICAgdHFfTmlsLAotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gIH0sCi0gIHsJCQkJCS8qIGRpbWVuc2lvbnMgKi8KLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMAotICB9LAotICB7CQkJCQkvKiBzaXplcyAqLwotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgfSwKLX07Ci0KLS8qIEdsb2JhbCBoYXNoIHRhYmxlIGZvciB0aGUgdGFncyB0YWJsZSBhbmQgZ2xvYmFsIHRhYmxlIGZvciBmaWxlCi0gICBkZXNjcmlwdG9ycy4gICovCi0KLXN0YXRpYyB2YXJyYXlfdCBmaWxlX2Rlc2MJPSBJTklUX1ZBUlJBWSAoZWZkcl90KTsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhZ19oYXNoOwotCi0vKiBTdGF0aWMgdHlwZXMgZm9yIGludCBhbmQgdm9pZC4gIEFsc28sIHJlbWVtYmVyIHRoZSBsYXN0IGZ1bmN0aW9uJ3MKLSAgIHR5cGUgKHdoaWNoIGlzIHNldCB1cCB3aGVuIHdlIGVuY291bnRlciB0aGUgZGVjbGFyYXRpb24gZm9yIHRoZQotICAgZnVuY3Rpb24sIGFuZCB1c2VkIHdoZW4gdGhlIGVuZCBibG9jayBmb3IgdGhlIGZ1bmN0aW9uIGlzIGVtaXR0ZWQuICAqLwotCi1zdGF0aWMgdHlwZV9pbmZvX3QgaW50X3R5cGVfaW5mbzsKLXN0YXRpYyB0eXBlX2luZm9fdCB2b2lkX3R5cGVfaW5mbzsKLXN0YXRpYyB0eXBlX2luZm9fdCBsYXN0X2Z1bmNfdHlwZV9pbmZvOwotc3RhdGljIHN5bWJvbFMgKmxhc3RfZnVuY19zeW1fdmFsdWU7Ci0KLQotLyogQ29udmVydCBDT0ZGIGJhc2ljIHR5cGUgdG8gRUNPRkYgYmFzaWMgdHlwZS4gIFRoZSBUX05VTEwgdHlwZQotICAgcmVhbGx5IHNob3VsZCB1c2UgYnRfVm9pZCwgYnV0IHRoaXMgY2F1c2VzIHRoZSBjdXJyZW50IGVjb2ZmIEdEQiB0bwotICAgaXNzdWUgdW5zdXBwb3J0ZWQgdHlwZSBtZXNzYWdlcywgYW5kIHRoZSBVbHRyaXggNC4wMCBkYnggKGFrYSBNSVBTCi0gICAyLjApIGRvZXNuJ3QgdW5kZXJzdGFuZCBpdCwgZXZlbiB0aG91Z2ggdGhlIGNvbXBpbGVyIGdlbmVyYXRlcyBpdC4KLSAgIE1heWJlIHRoaXMgd2lsbCBiZSBmaXhlZCBpbiAyLjEwIG9yIDIuMjAgb2YgdGhlIE1JUFMgY29tcGlsZXIKLSAgIHN1aXRlLCBidXQgZm9yIG5vdyBnbyB3aXRoIHdoYXQgd29ya3MuCi0KLSAgIEl0IHdvdWxkIG1ha2Ugc2Vuc2UgZm9yIHRoZSAudHlwZSBhbmQgLnNjbCBkaXJlY3RpdmVzIHRvIHVzZSB0aGUKLSAgIEVDT0ZGIG51bWJlcnMgZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBDT0ZGIG51bWJlcnMgYW5kCi0gICBtYXBwaW5nIHRoZW0uICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIGhpc3RvcmljYWxseSB3aGF0IG1pcHMtdGZpbGUKLSAgIGV4cGVjdHMsIGFuZCBjaGFuZ2luZyBnY2Mgbm93IHdvdWxkIGJlIGEgY29uc2lkZXJhYmxlIHBhaW4gKHRoZQotICAgbmF0aXZlIGNvbXBpbGVyIGdlbmVyYXRlcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50ZXJuYWxseSwgcmF0aGVyCi0gICB0aGFuIHZpYSB0aGUgYXNzZW1ibGVyLCBzbyBpdCB3aWxsIG5ldmVyIHVzZSAudHlwZSBvciAuc2NsKS4gICovCi0KLXN0YXRpYyBjb25zdCBidF90IG1hcF9jb2ZmX3R5cGVzW10gPSB7Ci0gIGJ0X05pbCwJCQkvKiBUX05VTEwgKi8KLSAgYnRfTmlsLAkJCS8qIFRfQVJHICovCi0gIGJ0X0NoYXIsCQkJLyogVF9DSEFSICovCi0gIGJ0X1Nob3J0LAkJCS8qIFRfU0hPUlQgKi8KLSAgYnRfSW50LAkJCS8qIFRfSU5UICovCi0gIGJ0X0xvbmcsCQkJLyogVF9MT05HICovCi0gIGJ0X0Zsb2F0LAkJCS8qIFRfRkxPQVQgKi8KLSAgYnRfRG91YmxlLAkJCS8qIFRfRE9VQkxFICovCi0gIGJ0X1N0cnVjdCwJCQkvKiBUX1NUUlVDVCAqLwotICBidF9VbmlvbiwJCQkvKiBUX1VOSU9OICovCi0gIGJ0X0VudW0sCQkJLyogVF9FTlVNICovCi0gIGJ0X0VudW0sCQkJLyogVF9NT0UgKi8KLSAgYnRfVUNoYXIsCQkJLyogVF9VQ0hBUiAqLwotICBidF9VU2hvcnQsCQkJLyogVF9VU0hPUlQgKi8KLSAgYnRfVUludCwJCQkvKiBUX1VJTlQgKi8KLSAgYnRfVUxvbmcJCQkvKiBUX1VMT05HICovCi19OwotCi0vKiBDb252ZXJ0IENPRkYgc3RvcmFnZSBjbGFzcyB0byBFQ09GRiBzdG9yYWdlIGNsYXNzLiAgKi8KLXN0YXRpYyBjb25zdCBzY190IG1hcF9jb2ZmX3N0b3JhZ2VbXSA9IHsKLSAgc2NfTmlsLAkJCS8qICAgMDogQ19OVUxMICovCi0gIHNjX0FicywJCQkvKiAgIDE6IENfQVVUTwkgIGF1dG8gdmFyICovCi0gIHNjX1VuZGVmaW5lZCwJCQkvKiAgIDI6IENfRVhUCSAgZXh0ZXJuYWwgKi8KLSAgc2NfRGF0YSwJCQkvKiAgIDM6IENfU1RBVAkgIHN0YXRpYyAqLwotICBzY19SZWdpc3RlciwJCQkvKiAgIDQ6IENfUkVHCSAgcmVnaXN0ZXIgKi8KLSAgc2NfVW5kZWZpbmVkLAkJCS8qICAgNTogQ19FWFRERUYgID8/PyAqLwotICBzY19UZXh0LAkJCS8qICAgNjogQ19MQUJFTAkgIGxhYmVsICovCi0gIHNjX1RleHQsCQkJLyogICA3OiBDX1VMQUJFTCAgdXNlciBsYWJlbCAqLwotICBzY19JbmZvLAkJCS8qICAgODogQ19NT1MJICBtZW1iZXIgb2Ygc3RydWN0ICovCi0gIHNjX0FicywJCQkvKiAgIDk6IENfQVJHCSAgYXJndW1lbnQgKi8KLSAgc2NfSW5mbywJCQkvKiAgMTA6IENfU1RSVEFHICBzdHJ1Y3QgdGFnICovCi0gIHNjX0luZm8sCQkJLyogIDExOiBDX01PVQkgIG1lbWJlciBvZiB1bmlvbiAqLwotICBzY19JbmZvLAkJCS8qICAxMjogQ19VTlRBRyAgIHVuaW9uIHRhZyAqLwotICBzY19JbmZvLAkJCS8qICAxMzogQ19UUERFRgkgIHR5cGVkZWYgKi8KLSAgc2NfRGF0YSwJCQkvKiAgMTQ6IENfVVNUQVRJQyA/Pz8gKi8KLSAgc2NfSW5mbywJCQkvKiAgMTU6IENfRU5UQUcJICBlbnVtIHRhZyAqLwotICBzY19JbmZvLAkJCS8qICAxNjogQ19NT0UJICBtZW1iZXIgb2YgZW51bSAqLwotICBzY19SZWdpc3RlciwJCQkvKiAgMTc6IENfUkVHUEFSTSByZWdpc3RlciBwYXJhbWV0ZXIgKi8KLSAgc2NfQml0cywJCQkvKiAgMTg7IENfRklFTEQJICBiaXRmaWVsZCAqLwotICBzY19OaWwsCQkJLyogIDE5ICovCi0gIHNjX05pbCwJCQkvKiAgMjAgKi8KLSAgc2NfTmlsLAkJCS8qICAyMSAqLwotICBzY19OaWwsCQkJLyogIDIyICovCi0gIHNjX05pbCwJCQkvKiAgMjMgKi8KLSAgc2NfTmlsLAkJCS8qICAyNCAqLwotICBzY19OaWwsCQkJLyogIDI1ICovCi0gIHNjX05pbCwJCQkvKiAgMjYgKi8KLSAgc2NfTmlsLAkJCS8qICAyNyAqLwotICBzY19OaWwsCQkJLyogIDI4ICovCi0gIHNjX05pbCwJCQkvKiAgMjkgKi8KLSAgc2NfTmlsLAkJCS8qICAzMCAqLwotICBzY19OaWwsCQkJLyogIDMxICovCi0gIHNjX05pbCwJCQkvKiAgMzIgKi8KLSAgc2NfTmlsLAkJCS8qICAzMyAqLwotICBzY19OaWwsCQkJLyogIDM0ICovCi0gIHNjX05pbCwJCQkvKiAgMzUgKi8KLSAgc2NfTmlsLAkJCS8qICAzNiAqLwotICBzY19OaWwsCQkJLyogIDM3ICovCi0gIHNjX05pbCwJCQkvKiAgMzggKi8KLSAgc2NfTmlsLAkJCS8qICAzOSAqLwotICBzY19OaWwsCQkJLyogIDQwICovCi0gIHNjX05pbCwJCQkvKiAgNDEgKi8KLSAgc2NfTmlsLAkJCS8qICA0MiAqLwotICBzY19OaWwsCQkJLyogIDQzICovCi0gIHNjX05pbCwJCQkvKiAgNDQgKi8KLSAgc2NfTmlsLAkJCS8qICA0NSAqLwotICBzY19OaWwsCQkJLyogIDQ2ICovCi0gIHNjX05pbCwJCQkvKiAgNDcgKi8KLSAgc2NfTmlsLAkJCS8qICA0OCAqLwotICBzY19OaWwsCQkJLyogIDQ5ICovCi0gIHNjX05pbCwJCQkvKiAgNTAgKi8KLSAgc2NfTmlsLAkJCS8qICA1MSAqLwotICBzY19OaWwsCQkJLyogIDUyICovCi0gIHNjX05pbCwJCQkvKiAgNTMgKi8KLSAgc2NfTmlsLAkJCS8qICA1NCAqLwotICBzY19OaWwsCQkJLyogIDU1ICovCi0gIHNjX05pbCwJCQkvKiAgNTYgKi8KLSAgc2NfTmlsLAkJCS8qICA1NyAqLwotICBzY19OaWwsCQkJLyogIDU4ICovCi0gIHNjX05pbCwJCQkvKiAgNTkgKi8KLSAgc2NfTmlsLAkJCS8qICA2MCAqLwotICBzY19OaWwsCQkJLyogIDYxICovCi0gIHNjX05pbCwJCQkvKiAgNjIgKi8KLSAgc2NfTmlsLAkJCS8qICA2MyAqLwotICBzY19OaWwsCQkJLyogIDY0ICovCi0gIHNjX05pbCwJCQkvKiAgNjUgKi8KLSAgc2NfTmlsLAkJCS8qICA2NiAqLwotICBzY19OaWwsCQkJLyogIDY3ICovCi0gIHNjX05pbCwJCQkvKiAgNjggKi8KLSAgc2NfTmlsLAkJCS8qICA2OSAqLwotICBzY19OaWwsCQkJLyogIDcwICovCi0gIHNjX05pbCwJCQkvKiAgNzEgKi8KLSAgc2NfTmlsLAkJCS8qICA3MiAqLwotICBzY19OaWwsCQkJLyogIDczICovCi0gIHNjX05pbCwJCQkvKiAgNzQgKi8KLSAgc2NfTmlsLAkJCS8qICA3NSAqLwotICBzY19OaWwsCQkJLyogIDc2ICovCi0gIHNjX05pbCwJCQkvKiAgNzcgKi8KLSAgc2NfTmlsLAkJCS8qICA3OCAqLwotICBzY19OaWwsCQkJLyogIDc5ICovCi0gIHNjX05pbCwJCQkvKiAgODAgKi8KLSAgc2NfTmlsLAkJCS8qICA4MSAqLwotICBzY19OaWwsCQkJLyogIDgyICovCi0gIHNjX05pbCwJCQkvKiAgODMgKi8KLSAgc2NfTmlsLAkJCS8qICA4NCAqLwotICBzY19OaWwsCQkJLyogIDg1ICovCi0gIHNjX05pbCwJCQkvKiAgODYgKi8KLSAgc2NfTmlsLAkJCS8qICA4NyAqLwotICBzY19OaWwsCQkJLyogIDg4ICovCi0gIHNjX05pbCwJCQkvKiAgODkgKi8KLSAgc2NfTmlsLAkJCS8qICA5MCAqLwotICBzY19OaWwsCQkJLyogIDkxICovCi0gIHNjX05pbCwJCQkvKiAgOTIgKi8KLSAgc2NfTmlsLAkJCS8qICA5MyAqLwotICBzY19OaWwsCQkJLyogIDk0ICovCi0gIHNjX05pbCwJCQkvKiAgOTUgKi8KLSAgc2NfTmlsLAkJCS8qICA5NiAqLwotICBzY19OaWwsCQkJLyogIDk3ICovCi0gIHNjX05pbCwJCQkvKiAgOTggKi8KLSAgc2NfTmlsLAkJCS8qICA5OSAqLwotICBzY19UZXh0LAkJCS8qIDEwMDogQ19CTE9DSyAgYmxvY2sgc3RhcnQvZW5kICovCi0gIHNjX1RleHQsCQkJLyogMTAxOiBDX0ZDTgkgZnVuY3Rpb24gc3RhcnQvZW5kICovCi0gIHNjX0luZm8sCQkJLyogMTAyOiBDX0VPUwkgZW5kIG9mIHN0cnVjdC91bmlvbi9lbnVtICovCi0gIHNjX05pbCwJCQkvKiAxMDM6IENfRklMRQkgZmlsZSBzdGFydCAqLwotICBzY19OaWwsCQkJLyogMTA0OiBDX0xJTkUJIGxpbmUgbnVtYmVyICovCi0gIHNjX05pbCwJCQkvKiAxMDU6IENfQUxJQVMJIGNvbWJpbmVkIHR5cGUgaW5mbyAqLwotICBzY19OaWwsCQkJLyogMTA2OiBDX0hJRERFTiA/Pz8gKi8KLX07Ci0KLS8qIENvbnZlcnQgQ09GRiBzdG9yYWdlIGNsYXNzIHRvIEVDT0ZGIHN5bWJvbCB0eXBlLiAgKi8KLXN0YXRpYyBjb25zdCBzdF90IG1hcF9jb2ZmX3N5bV90eXBlW10gPSB7Ci0gIHN0X05pbCwJCQkvKiAgIDA6IENfTlVMTCAqLwotICBzdF9Mb2NhbCwJCQkvKiAgIDE6IENfQVVUTwkgIGF1dG8gdmFyICovCi0gIHN0X0dsb2JhbCwJCQkvKiAgIDI6IENfRVhUCSAgZXh0ZXJuYWwgKi8KLSAgc3RfU3RhdGljLAkJCS8qICAgMzogQ19TVEFUCSAgc3RhdGljICovCi0gIHN0X0xvY2FsLAkJCS8qICAgNDogQ19SRUcJICByZWdpc3RlciAqLwotICBzdF9HbG9iYWwsCQkJLyogICA1OiBDX0VYVERFRiAgPz8/ICovCi0gIHN0X0xhYmVsLAkJCS8qICAgNjogQ19MQUJFTAkgIGxhYmVsICovCi0gIHN0X0xhYmVsLAkJCS8qICAgNzogQ19VTEFCRUwgIHVzZXIgbGFiZWwgKi8KLSAgc3RfTWVtYmVyLAkJCS8qICAgODogQ19NT1MJICBtZW1iZXIgb2Ygc3RydWN0ICovCi0gIHN0X1BhcmFtLAkJCS8qICAgOTogQ19BUkcJICBhcmd1bWVudCAqLwotICBzdF9CbG9jaywJCQkvKiAgMTA6IENfU1RSVEFHICBzdHJ1Y3QgdGFnICovCi0gIHN0X01lbWJlciwJCQkvKiAgMTE6IENfTU9VCSAgbWVtYmVyIG9mIHVuaW9uICovCi0gIHN0X0Jsb2NrLAkJCS8qICAxMjogQ19VTlRBRyAgIHVuaW9uIHRhZyAqLwotICBzdF9UeXBlZGVmLAkJCS8qICAxMzogQ19UUERFRgkgIHR5cGVkZWYgKi8KLSAgc3RfU3RhdGljLAkJCS8qICAxNDogQ19VU1RBVElDID8/PyAqLwotICBzdF9CbG9jaywJCQkvKiAgMTU6IENfRU5UQUcJICBlbnVtIHRhZyAqLwotICBzdF9NZW1iZXIsCQkJLyogIDE2OiBDX01PRQkgIG1lbWJlciBvZiBlbnVtICovCi0gIHN0X1BhcmFtLAkJCS8qICAxNzogQ19SRUdQQVJNIHJlZ2lzdGVyIHBhcmFtZXRlciAqLwotICBzdF9NZW1iZXIsCQkJLyogIDE4OyBDX0ZJRUxECSAgYml0ZmllbGQgKi8KLSAgc3RfTmlsLAkJCS8qICAxOSAqLwotICBzdF9OaWwsCQkJLyogIDIwICovCi0gIHN0X05pbCwJCQkvKiAgMjEgKi8KLSAgc3RfTmlsLAkJCS8qICAyMiAqLwotICBzdF9OaWwsCQkJLyogIDIzICovCi0gIHN0X05pbCwJCQkvKiAgMjQgKi8KLSAgc3RfTmlsLAkJCS8qICAyNSAqLwotICBzdF9OaWwsCQkJLyogIDI2ICovCi0gIHN0X05pbCwJCQkvKiAgMjcgKi8KLSAgc3RfTmlsLAkJCS8qICAyOCAqLwotICBzdF9OaWwsCQkJLyogIDI5ICovCi0gIHN0X05pbCwJCQkvKiAgMzAgKi8KLSAgc3RfTmlsLAkJCS8qICAzMSAqLwotICBzdF9OaWwsCQkJLyogIDMyICovCi0gIHN0X05pbCwJCQkvKiAgMzMgKi8KLSAgc3RfTmlsLAkJCS8qICAzNCAqLwotICBzdF9OaWwsCQkJLyogIDM1ICovCi0gIHN0X05pbCwJCQkvKiAgMzYgKi8KLSAgc3RfTmlsLAkJCS8qICAzNyAqLwotICBzdF9OaWwsCQkJLyogIDM4ICovCi0gIHN0X05pbCwJCQkvKiAgMzkgKi8KLSAgc3RfTmlsLAkJCS8qICA0MCAqLwotICBzdF9OaWwsCQkJLyogIDQxICovCi0gIHN0X05pbCwJCQkvKiAgNDIgKi8KLSAgc3RfTmlsLAkJCS8qICA0MyAqLwotICBzdF9OaWwsCQkJLyogIDQ0ICovCi0gIHN0X05pbCwJCQkvKiAgNDUgKi8KLSAgc3RfTmlsLAkJCS8qICA0NiAqLwotICBzdF9OaWwsCQkJLyogIDQ3ICovCi0gIHN0X05pbCwJCQkvKiAgNDggKi8KLSAgc3RfTmlsLAkJCS8qICA0OSAqLwotICBzdF9OaWwsCQkJLyogIDUwICovCi0gIHN0X05pbCwJCQkvKiAgNTEgKi8KLSAgc3RfTmlsLAkJCS8qICA1MiAqLwotICBzdF9OaWwsCQkJLyogIDUzICovCi0gIHN0X05pbCwJCQkvKiAgNTQgKi8KLSAgc3RfTmlsLAkJCS8qICA1NSAqLwotICBzdF9OaWwsCQkJLyogIDU2ICovCi0gIHN0X05pbCwJCQkvKiAgNTcgKi8KLSAgc3RfTmlsLAkJCS8qICA1OCAqLwotICBzdF9OaWwsCQkJLyogIDU5ICovCi0gIHN0X05pbCwJCQkvKiAgNjAgKi8KLSAgc3RfTmlsLAkJCS8qICA2MSAqLwotICBzdF9OaWwsCQkJLyogIDYyICovCi0gIHN0X05pbCwJCQkvKiAgNjMgKi8KLSAgc3RfTmlsLAkJCS8qICA2NCAqLwotICBzdF9OaWwsCQkJLyogIDY1ICovCi0gIHN0X05pbCwJCQkvKiAgNjYgKi8KLSAgc3RfTmlsLAkJCS8qICA2NyAqLwotICBzdF9OaWwsCQkJLyogIDY4ICovCi0gIHN0X05pbCwJCQkvKiAgNjkgKi8KLSAgc3RfTmlsLAkJCS8qICA3MCAqLwotICBzdF9OaWwsCQkJLyogIDcxICovCi0gIHN0X05pbCwJCQkvKiAgNzIgKi8KLSAgc3RfTmlsLAkJCS8qICA3MyAqLwotICBzdF9OaWwsCQkJLyogIDc0ICovCi0gIHN0X05pbCwJCQkvKiAgNzUgKi8KLSAgc3RfTmlsLAkJCS8qICA3NiAqLwotICBzdF9OaWwsCQkJLyogIDc3ICovCi0gIHN0X05pbCwJCQkvKiAgNzggKi8KLSAgc3RfTmlsLAkJCS8qICA3OSAqLwotICBzdF9OaWwsCQkJLyogIDgwICovCi0gIHN0X05pbCwJCQkvKiAgODEgKi8KLSAgc3RfTmlsLAkJCS8qICA4MiAqLwotICBzdF9OaWwsCQkJLyogIDgzICovCi0gIHN0X05pbCwJCQkvKiAgODQgKi8KLSAgc3RfTmlsLAkJCS8qICA4NSAqLwotICBzdF9OaWwsCQkJLyogIDg2ICovCi0gIHN0X05pbCwJCQkvKiAgODcgKi8KLSAgc3RfTmlsLAkJCS8qICA4OCAqLwotICBzdF9OaWwsCQkJLyogIDg5ICovCi0gIHN0X05pbCwJCQkvKiAgOTAgKi8KLSAgc3RfTmlsLAkJCS8qICA5MSAqLwotICBzdF9OaWwsCQkJLyogIDkyICovCi0gIHN0X05pbCwJCQkvKiAgOTMgKi8KLSAgc3RfTmlsLAkJCS8qICA5NCAqLwotICBzdF9OaWwsCQkJLyogIDk1ICovCi0gIHN0X05pbCwJCQkvKiAgOTYgKi8KLSAgc3RfTmlsLAkJCS8qICA5NyAqLwotICBzdF9OaWwsCQkJLyogIDk4ICovCi0gIHN0X05pbCwJCQkvKiAgOTkgKi8KLSAgc3RfQmxvY2ssCQkJLyogMTAwOiBDX0JMT0NLICBibG9jayBzdGFydC9lbmQgKi8KLSAgc3RfUHJvYywJCQkvKiAxMDE6IENfRkNOCSBmdW5jdGlvbiBzdGFydC9lbmQgKi8KLSAgc3RfRW5kLAkJCS8qIDEwMjogQ19FT1MJIGVuZCBvZiBzdHJ1Y3QvdW5pb24vZW51bSAqLwotICBzdF9GaWxlLAkJCS8qIDEwMzogQ19GSUxFCSBmaWxlIHN0YXJ0ICovCi0gIHN0X05pbCwJCQkvKiAxMDQ6IENfTElORQkgbGluZSBudW1iZXIgKi8KLSAgc3RfTmlsLAkJCS8qIDEwNTogQ19BTElBUwkgY29tYmluZWQgdHlwZSBpbmZvICovCi0gIHN0X05pbCwJCQkvKiAxMDY6IENfSElEREVOID8/PyAqLwotfTsKLQotCi0vKiBLZWVwIHRyYWNrIG9mIGRpZmZlcmVudCBzaXplZCBhbGxvY2F0aW9uIHJlcXVlc3RzLiAgKi8KLXN0YXRpYyBhbGxvY19pbmZvX3QgYWxsb2NfY291bnRzWyAoaW50KWFsbG9jX3R5cGVfbGFzdCBdOwotDAotLyogUmVjb3JkIHdoZXRoZXIgd2UgaGF2ZSBzZWVuIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotaW50IGVjb2ZmX2RlYnVnZ2luZ19zZWVuID0gMDsKLQotLyogVmFyaW91cyBzdGF0aWNzLiAgKi8KLXN0YXRpYyBlZmRyX3QgICpjdXJfZmlsZV9wdHIJPSAoZWZkcl90ICopIDA7CS8qIGN1cnJlbnQgZmlsZSBkZXNjLiBoZWFkZXIgKi8KLXN0YXRpYyBwcm9jX3QgICpjdXJfcHJvY19wdHIJPSAocHJvY190ICopIDA7CS8qIGN1cnJlbnQgcHJvY2VkdXJlIGhlYWRlciAqLwotc3RhdGljIHByb2NfdCAgKmZpcnN0X3Byb2NfcHRyICA9IChwcm9jX3QgKikgMDsgLyogZmlyc3QgcHJvY2VkdXJlIGhlYWRlciAqLwotc3RhdGljIHRoZWFkX3QgKnRvcF90YWdfaGVhZAk9ICh0aGVhZF90ICopIDA7IC8qIHRvcCBsZXZlbCB0YWcgaGVhZCAqLwotc3RhdGljIHRoZWFkX3QgKmN1cl90YWdfaGVhZAk9ICh0aGVhZF90ICopIDA7IC8qIGN1cnJlbnQgdGFnIGhlYWQgKi8KLSNpZmRlZiBFQ09GRl9ERUJVRwotc3RhdGljIGludAlkZWJ1ZwkJPSAwOyAJCS8qIHRyYWNlIGZ1bmN0aW9ucyAqLwotI2VuZGlmCi1zdGF0aWMgaW50CXN0YWJzX3NlZW4JPSAwOwkJLyogIT0gMCBpZiBzdGFicyBoYXZlIGJlZW4gc2VlbiAqLwotCi1zdGF0aWMgaW50IGN1cnJlbnRfZmlsZV9pZHg7Ci1zdGF0aWMgY29uc3QgY2hhciAqY3VycmVudF9zdGFic19maWxlbmFtZTsKLQotLyogUHNldWRvIHN5bWJvbCB0byB1c2Ugd2hlbiBwdXR0aW5nIHN0YWJzIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0jaWZuZGVmIFNUQUJTX1NZTUJPTAotI2RlZmluZSBTVEFCU19TWU1CT0wgIkBzdGFicyIKLSNlbmRpZgotCi1zdGF0aWMgY2hhciBzdGFic19zeW1ib2xbXSA9IFNUQUJTX1NZTUJPTDsKLQwKLS8qIFByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGFkZF92YXJyYXlfcGFnZSBQQVJBTVMgKCh2YXJyYXlfdCAqdnApKTsKLXN0YXRpYyBzeW1pbnRfdCBhZGRfc3RyaW5nIFBBUkFNUyAoKHZhcnJheV90ICp2cCwKLQkJCQkgICAgc3RydWN0IGhhc2hfY29udHJvbCAqaGFzaF90YmwsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnN0ciwKLQkJCQkgICAgc2hhc2hfdCAqKnJldF9oYXNoKSk7Ci1zdGF0aWMgbG9jYWxzeW1fdCAqYWRkX2Vjb2ZmX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICpzdHIsIHN0X3QgdHlwZSwKLQkJCQkJICAgICBzY190IHN0b3JhZ2UsIHN5bWJvbFMgKnN5bSwKLQkJCQkJICAgICBiZmRfdm1hIGFkZGVuZCwgc3ltaW50X3QgdmFsdWUsCi0JCQkJCSAgICAgc3ltaW50X3QgaW5keCkpOwotc3RhdGljIHN5bWludF90IGFkZF9hdXhfc3ltX3N5bWludCBQQVJBTVMgKChzeW1pbnRfdCBhdXhfd29yZCkpOwotc3RhdGljIHN5bWludF90IGFkZF9hdXhfc3ltX3JuZHggUEFSQU1TICgoaW50IGZpbGVfaW5kZXgsCi0JCQkJCSAgc3ltaW50X3Qgc3ltX2luZGV4KSk7Ci1zdGF0aWMgc3ltaW50X3QgYWRkX2F1eF9zeW1fdGlyIFBBUkFNUyAoKHR5cGVfaW5mb190ICp0LAotCQkJCQkgaGFzaF9zdGF0ZV90IHN0YXRlLAotCQkJCQkgdGhhc2hfdCAqKmhhc2hfdGJsKSk7Ci1zdGF0aWMgdGFnX3QgKmdldF90YWcgUEFSQU1TICgoY29uc3QgY2hhciAqdGFnLCBsb2NhbHN5bV90ICpzeW0sCi0JCQkgICAgICAgYnRfdCBiYXNpY190eXBlKSk7Ci1zdGF0aWMgdm9pZCBhZGRfdW5rbm93bl90YWcgUEFSQU1TICgodGFnX3QgKnB0YWcpKTsKLXN0YXRpYyB2b2lkIGFkZF9wcm9jZWR1cmUgUEFSQU1TICgoY2hhciAqZnVuYykpOwotc3RhdGljIHZvaWQgYWRkX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZV9uYW1lLCBpbnQgaW5keCwgaW50IGZha2UpKTsKLSNpZmRlZiBFQ09GRl9ERUJVRwotc3RhdGljIGNoYXIgKnNjX3RvX3N0cmluZyBQQVJBTVMgKChzY190IHN0b3JhZ2VfY2xhc3MpKTsKLXN0YXRpYyBjaGFyICpzdF90b19zdHJpbmcgUEFSQU1TICgoc3RfdCBzeW1ib2xfdHlwZSkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBtYXJrX3N0YWJzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNoYXIgKmVjb2ZmX2FkZF9ieXRlcyBQQVJBTVMgKChjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCQkJCSAgICAgIGNoYXIgKmJ1ZnB0ciwgdW5zaWduZWQgbG9uZyBuZWVkKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9wYWRkaW5nX2FkanVzdAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgY2hhciAqKmJ1ZnB0cnB0cikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfbGluZW5vCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsb25nICpsaW5lY250cHRyKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9wcm9jcwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfYXV4Ci0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9zdHJpbmdzIFBBUkFNUyAoKGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JCQkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCQkJICB2YXJyYXlfdCAqdnApKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX3NzCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9mZHIKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3NldHVwX2V4dCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgcGFnZV90eXBlICphbGxvY2F0ZV9jbHVzdGVyIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnBhZ2VzKSk7Ci1zdGF0aWMgcGFnZV90eXBlICphbGxvY2F0ZV9wYWdlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBzY29wZV90ICphbGxvY2F0ZV9zY29wZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3Njb3BlIFBBUkFNUyAoKHNjb3BlX3QgKnB0cikpOwotc3RhdGljIHZsaW5rc190ICphbGxvY2F0ZV92bGlua3MgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHNoYXNoX3QgKmFsbG9jYXRlX3NoYXNoIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB0aGFzaF90ICphbGxvY2F0ZV90aGFzaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdGFnX3QgKmFsbG9jYXRlX3RhZyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3RhZyBQQVJBTVMgKCh0YWdfdCAqcHRyKSk7Ci1zdGF0aWMgZm9yd2FyZF90ICphbGxvY2F0ZV9mb3J3YXJkIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB0aGVhZF90ICphbGxvY2F0ZV90aGVhZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3RoZWFkIFBBUkFNUyAoKHRoZWFkX3QgKnB0cikpOwotc3RhdGljIGxpbmVub19saXN0X3QgKmFsbG9jYXRlX2xpbmVub19saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQwKLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzIHVwLiAgKi8KLQotdm9pZAotZWNvZmZfcmVhZF9iZWdpbl9ob29rICgpCi17Ci0gIHRhZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHRvcF90YWdfaGVhZCA9IGFsbG9jYXRlX3RoZWFkICgpOwotICB0b3BfdGFnX2hlYWQtPmZpcnN0X3RhZyA9ICh0YWdfdCAqKSBOVUxMOwotICB0b3BfdGFnX2hlYWQtPmZyZWUgPSAodGhlYWRfdCAqKSBOVUxMOwotICB0b3BfdGFnX2hlYWQtPnByZXYgPSBjdXJfdGFnX2hlYWQ7Ci0gIGN1cl90YWdfaGVhZCA9IHRvcF90YWdfaGVhZDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBzeW1ib2wgaXMgY3JlYXRlZC4gICovCi0KLXZvaWQKLWVjb2ZmX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgT0JKX1NZTUZJRUxEX1RZUEUgKm9iajsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgZmlsZSBwb2ludGVyLCBidXQgb25seSBpZiB3ZSBoYXZlIHNlZW4gYQotICAgICBmaWxlLiAgSWYgd2UgaGF2ZW4ndCBzZWVuIGEgZmlsZSwgdGhlbiB0aGlzIGlzIGEgcHJvYmFibHkgc3BlY2lhbAotICAgICBzeW1ib2wgY3JlYXRlZCBieSBtZF9iZWdpbiB3aGljaCBtYXkgcmVxdWlyZWQgc3BlY2lhbCBoYW5kbGluZyBhdAotICAgICBzb21lIHBvaW50LiAgQ3JlYXRpbmcgYSBkdW1teSBmaWxlIHdpdGggYSBkdW1teSBuYW1lIGlzIGNlcnRhaW5seQotICAgICB3cm9uZy4gICovCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMCi0gICAgICAmJiBzZWVuX2F0X2xlYXN0XzFfZmlsZSAoKSkKLSAgICBhZGRfZmlsZSAoKGNvbnN0IGNoYXIgKikgTlVMTCwgMCwgMSk7Ci0gIG9iaiA9IHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKTsKLSAgb2JqLT5lY29mZl9maWxlID0gY3VyX2ZpbGVfcHRyOwotICBvYmotPmVjb2ZmX3N5bWJvbCA9IE5VTEw7Ci0gIG9iai0+ZWNvZmZfZXh0ZXJuX3NpemUgPSAwOwotfQotDAotLyogQWRkIGEgcGFnZSB0byBhIHZhcnJheSBvYmplY3QuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX3ZhcnJheV9wYWdlICh2cCkKLSAgICAgdmFycmF5X3QgKnZwOwkJCQkvKiB2YXJyYXkgdG8gYWRkIHBhZ2UgdG8gKi8KLXsKLSAgdmxpbmtzX3QgKm5ld19saW5rcyA9IGFsbG9jYXRlX3ZsaW5rcyAoKTsKLQotI2lmZGVmIE1BTExPQ19DSEVDSwotICBpZiAodnAtPm9iamVjdF9zaXplID4gMSkKLSAgICBuZXdfbGlua3MtPmRhdHVtID0gKHBhZ2VfdHlwZSAqKSB4Y2FsbG9jICgxLCB2cC0+b2JqZWN0X3NpemUpOwotICBlbHNlCi0jZW5kaWYKLSAgICBuZXdfbGlua3MtPmRhdHVtID0gYWxsb2NhdGVfcGFnZSAoKTsKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZhcnJheV0udG90YWxfYWxsb2MrKzsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92YXJyYXldLnRvdGFsX3BhZ2VzKys7Ci0KLSAgbmV3X2xpbmtzLT5zdGFydF9pbmRleCA9IHZwLT5udW1fYWxsb2NhdGVkOwotICB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPSAwOwotCi0gIGlmICh2cC0+Zmlyc3QgPT0gKHZsaW5rc190ICopIE5VTEwpCQkvKiBmaXJzdCBhbGxvY2F0aW9uPyAqLwotICAgIHZwLT5maXJzdCA9IHZwLT5sYXN0ID0gbmV3X2xpbmtzOwotICBlbHNlCi0gICAgewkJCQkJCS8qIDJuZCBvciBncmVhdGVyIGFsbG9jYXRpb24gKi8KLSAgICAgIG5ld19saW5rcy0+cHJldiA9IHZwLT5sYXN0OwotICAgICAgdnAtPmxhc3QtPm5leHQgPSBuZXdfbGlua3M7Ci0gICAgICB2cC0+bGFzdCA9IG5ld19saW5rczsKLSAgICB9Ci19Ci0MCi0vKiBBZGQgYSBzdHJpbmcgKGFuZCBudWxsIHBhZCkgdG8gb25lIG9mIHRoZSBzdHJpbmcgdGFibGVzLiAgKi8KLQotc3RhdGljIHN5bWludF90Ci1hZGRfc3RyaW5nICh2cCwgaGFzaF90YmwsIHN0ciwgcmV0X2hhc2gpCi0gICAgIHZhcnJheV90ICp2cDsJCQkvKiBzdHJpbmcgb2JzdGFjayAqLwotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYXNoX3RibDsJLyogcHRyIHRvIGhhc2ggdGFibGUgKi8KLSAgICAgY29uc3QgY2hhciAqc3RyOwkJCS8qIHN0cmluZyAqLwotICAgICBzaGFzaF90ICoqcmV0X2hhc2g7CQkvKiByZXR1cm4gaGFzaCBwb2ludGVyICovCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbGVuID0gc3RybGVuIChzdHIpOwotICByZWdpc3RlciBzaGFzaF90ICpoYXNoX3B0cjsKLQotICBpZiAobGVuID49IFBBR0VfVVNJWkUpCi0gICAgYXNfZmF0YWwgKF8oIlN0cmluZyB0b28gYmlnICglbHUgYnl0ZXMpIiksIGxlbik7Ci0KLSAgaGFzaF9wdHIgPSAoc2hhc2hfdCAqKSBoYXNoX2ZpbmQgKGhhc2hfdGJsLCBzdHIpOwotICBpZiAoaGFzaF9wdHIgPT0gKHNoYXNoX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjb25zdCBjaGFyICplcnI7Ci0KLSAgICAgIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgKyBsZW4gPj0gUEFHRV9VU0laRSkKLSAgICAgICAgewotICAgICAgICAgIHZwLT5udW1fYWxsb2NhdGVkID0KLSAgICAgICAgICAgICgodnAtPm51bV9hbGxvY2F0ZWQgKyBQQUdFX1VTSVpFIC0gMSkgLyBQQUdFX1VTSVpFKSAqIFBBR0VfVVNJWkU7Ci0gICAgICAgICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0gICAgICAgIH0KLQotICAgICAgaGFzaF9wdHIgPSBhbGxvY2F0ZV9zaGFzaCAoKTsKLSAgICAgIGhhc2hfcHRyLT5pbmR4ID0gdnAtPm51bV9hbGxvY2F0ZWQ7Ci0KLSAgICAgIGhhc2hfcHRyLT5zdHJpbmcgPSAmdnAtPmxhc3QtPmRhdHVtLT5ieXRlW3ZwLT5vYmplY3RzX2xhc3RfcGFnZV07Ci0KLSAgICAgIHZwLT5vYmplY3RzX2xhc3RfcGFnZSArPSBsZW4gKyAxOwotICAgICAgdnAtPm51bV9hbGxvY2F0ZWQgKz0gbGVuICsgMTsKLQotICAgICAgc3RyY3B5IChoYXNoX3B0ci0+c3RyaW5nLCBzdHIpOwotCi0gICAgICBlcnIgPSBoYXNoX2luc2VydCAoaGFzaF90YmwsIHN0ciwgKGNoYXIgKikgaGFzaF9wdHIpOwotICAgICAgaWYgKGVycikKLQlhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cmluZyBoYXNoIHRhYmxlOiAlcyIpLAotCQkgIHN0ciwgZXJyKTsKLSAgICB9Ci0KLSAgaWYgKHJldF9oYXNoICE9IChzaGFzaF90ICoqKSBOVUxMKQotICAgICpyZXRfaGFzaCA9IGhhc2hfcHRyOwotCi0gIHJldHVybiBoYXNoX3B0ci0+aW5keDsKLX0KLQwKLS8qIEFkZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIGxvY2Fsc3ltX3QgKgotYWRkX2Vjb2ZmX3N5bWJvbCAoc3RyLCB0eXBlLCBzdG9yYWdlLCBzeW1fdmFsdWUsIGFkZGVuZCwgdmFsdWUsIGluZHgpCi0gICAgIGNvbnN0IGNoYXIgKnN0cjsJCQkvKiBzeW1ib2wgbmFtZSAqLwotICAgICBzdF90IHR5cGU7CQkJCS8qIHN5bWJvbCB0eXBlICovCi0gICAgIHNjX3Qgc3RvcmFnZTsJCQkvKiBzdG9yYWdlIGNsYXNzICovCi0gICAgIHN5bWJvbFMgKnN5bV92YWx1ZTsJCS8qIGFzc29jaWF0ZWQgc3ltYm9sLiAgKi8KLSAgICAgYmZkX3ZtYSBhZGRlbmQ7CQkJLyogYWRkZW5kIHRvIHN5bV92YWx1ZS4gICovCi0gICAgIHN5bWludF90IHZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotICAgICBzeW1pbnRfdCBpbmR4OwkJCS8qIGluZGV4IHRvIGxvY2FsL2F1eC4gc3ltcyAqLwotewotICBsb2NhbHN5bV90ICpwc3ltOwotICByZWdpc3RlciBzY29wZV90ICpwc2NvcGU7Ci0gIHJlZ2lzdGVyIHRoZWFkX3QgKnB0YWdfaGVhZDsKLSAgcmVnaXN0ZXIgdGFnX3QgKnB0YWc7Ci0gIHJlZ2lzdGVyIHRhZ190ICpwdGFnX25leHQ7Ci0gIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKLSAgcmVnaXN0ZXIgaW50IHNjb3BlX2RlbHRhID0gMDsKLSAgc2hhc2hfdCAqaGFzaF9wdHIgPSAoc2hhc2hfdCAqKSBOVUxMOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPnN5bWJvbHM7Ci0KLSBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQotICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotCi0gIHBzeW0gPSAmdnAtPmxhc3QtPmRhdHVtLT5zeW1bIHZwLT5vYmplY3RzX2xhc3RfcGFnZSsrIF07Ci0KLSAgaWYgKHN0ciA9PSAoY29uc3QgY2hhciAqKSBOVUxMICYmIHN5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHBzeW0tPm5hbWUgPSBTX0dFVF9OQU1FIChzeW1fdmFsdWUpOwotICBlbHNlCi0gICAgcHN5bS0+bmFtZSA9IHN0cjsKLSAgcHN5bS0+YXNfc3ltID0gc3ltX3ZhbHVlOwotICBpZiAoc3ltX3ZhbHVlICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgc3ltYm9sX2dldF9vYmogKHN5bV92YWx1ZSktPmVjb2ZmX3N5bWJvbCA9IHBzeW07Ci0gIHBzeW0tPmFkZGVuZCA9IGFkZGVuZDsKLSAgcHN5bS0+ZmlsZV9wdHIgPSBjdXJfZmlsZV9wdHI7Ci0gIHBzeW0tPnByb2NfcHRyID0gY3VyX3Byb2NfcHRyOwotICBwc3ltLT5iZWdpbl9wdHIgPSAobG9jYWxzeW1fdCAqKSBOVUxMOwotICBwc3ltLT5pbmRleF9wdHIgPSAoYXV4X3QgKikgTlVMTDsKLSAgcHN5bS0+Zm9yd2FyZF9yZWYgPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0gIHBzeW0tPnN5bV9pbmRleCA9IC0xOwotICBtZW1zZXQgKCZwc3ltLT5lY29mZl9zeW0sIDAsIHNpemVvZiAoRVhUUikpOwotICBwc3ltLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9IHZhbHVlOwotICBwc3ltLT5lY29mZl9zeW0uYXN5bS5zdCA9ICh1bnNpZ25lZCkgdHlwZTsKLSAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0uc2MgPSAodW5zaWduZWQpIHN0b3JhZ2U7Ci0gIHBzeW0tPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0gaW5keDsKLQotICAvKiBJZiB0aGVyZSBpcyBhbiBhc3NvY2lhdGVkIHN5bWJvbCwgd2Ugd2FpdCB1bnRpbCB0aGUgZW5kIG9mIHRoZQotICAgICBhc3NlbWJseSBiZWZvcmUgZGVjaWRpbmcgd2hlcmUgdG8gcHV0IHRoZSBuYW1lIChpdCBtYXkgYmUganVzdCBhbgotICAgICBleHRlcm5hbCBzeW1ib2wpLiAgT3RoZXJ3aXNlLCB0aGlzIGlzIGp1c3QgYSBkZWJ1Z2dpbmcgc3ltYm9sIGFuZAotICAgICB0aGUgbmFtZSBzaG91bGQgZ28gd2l0aCB0aGUgY3VycmVudCBmaWxlLiAgKi8KLSAgaWYgKHN5bV92YWx1ZSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHBzeW0tPmVjb2ZmX3N5bS5hc3ltLmlzcyA9ICgoc3RyID09IChjb25zdCBjaGFyICopIE5VTEwpCi0JCQkJPyAwCi0JCQkJOiBhZGRfc3RyaW5nICgmY3VyX2ZpbGVfcHRyLT5zdHJpbmdzLAotCQkJCQkgICAgICBjdXJfZmlsZV9wdHItPnN0cl9oYXNoLAotCQkJCQkgICAgICBzdHIsCi0JCQkJCSAgICAgICZoYXNoX3B0cikpOwotCi0gICsrdnAtPm51bV9hbGxvY2F0ZWQ7Ci0KLSAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZwc3ltLT5lY29mZl9zeW0uYXN5bSkpCi0gICAgcmV0dXJuIHBzeW07Ci0KLSAgLyogU2F2ZSB0aGUgc3ltYm9sIHdpdGhpbiB0aGUgaGFzaCB0YWJsZSBpZiB0aGlzIGlzIGEgc3RhdGljCi0gICAgIGl0ZW0sIGFuZCBpdCBoYXMgYSBuYW1lLiAgKi8KLSAgaWYgKGhhc2hfcHRyICE9IChzaGFzaF90ICopIE5VTEwKLSAgICAgICYmICh0eXBlID09IHN0X0dsb2JhbCB8fCB0eXBlID09IHN0X1N0YXRpYyB8fCB0eXBlID09IHN0X0xhYmVsCi0JICB8fCB0eXBlID09IHN0X1Byb2MgfHwgdHlwZSA9PSBzdF9TdGF0aWNQcm9jKSkKLSAgICBoYXNoX3B0ci0+c3ltX3B0ciA9IHBzeW07Ci0KLSAgLyogcHVzaCBvciBwb3AgYSBzY29wZSBpZiBhcHByb3ByaWF0ZS4gICovCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBzdF9GaWxlOgkJCS8qIGJlZ2lubmluZyBvZiBmaWxlICovCi0gICAgY2FzZSBzdF9Qcm9jOgkJCS8qIHByb2NlZHVyZSAqLwotICAgIGNhc2Ugc3RfU3RhdGljUHJvYzoJCQkvKiBzdGF0aWMgcHJvY2VkdXJlICovCi0gICAgY2FzZSBzdF9CbG9jazoJCQkvKiBiZWdpbiBzY29wZSAqLwotICAgICAgcHNjb3BlID0gYWxsb2NhdGVfc2NvcGUgKCk7Ci0gICAgICBwc2NvcGUtPnByZXYgPSBjdXJfZmlsZV9wdHItPmN1cl9zY29wZTsKLSAgICAgIHBzY29wZS0+bHN5bSA9IHBzeW07Ci0gICAgICBwc2NvcGUtPnR5cGUgPSB0eXBlOwotICAgICAgY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgPSBwc2NvcGU7Ci0KLSAgICAgIGlmICh0eXBlICE9IHN0X0ZpbGUpCi0Jc2NvcGVfZGVsdGEgPSAxOwotCi0gICAgICAvKiBGb3IgZXZlcnkgYmxvY2sgdHlwZSBleGNlcHQgZmlsZSwgc3RydWN0LCB1bmlvbiwgb3IKLQkgZW51bWVyYXRpb24gYmxvY2tzLCBwdXNoIGEgbGV2ZWwgb24gdGhlIHRhZyBzdGFjay4gIFdlIG9taXQKLQkgZmlsZSB0eXBlcywgc28gdGhhdCB0YWdzIGNhbiBzcGFuIGZpbGUgYm91bmRhcmllcy4gICovCi0gICAgICBpZiAodHlwZSAhPSBzdF9GaWxlICYmIHN0b3JhZ2UgIT0gc2NfSW5mbykKLQl7Ci0JICBwdGFnX2hlYWQgPSBhbGxvY2F0ZV90aGVhZCAoKTsKLQkgIHB0YWdfaGVhZC0+Zmlyc3RfdGFnID0gMDsKLQkgIHB0YWdfaGVhZC0+cHJldiA9IGN1cl90YWdfaGVhZDsKLQkgIGN1cl90YWdfaGVhZCA9IHB0YWdfaGVhZDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ugc3RfRW5kOgotICAgICAgcHNjb3BlID0gY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGU7Ci0gICAgICBpZiAocHNjb3BlID09IChzY29wZV90ICopIE5VTEwpCi0JYXNfZmF0YWwgKF8oInRvbyBtYW55IHN0X0VuZCdzIikpOwotICAgICAgZWxzZQotCXsKLQkgIHN0X3QgYmVnaW5fdHlwZSA9IChzdF90KSBwc2NvcGUtPmxzeW0tPmVjb2ZmX3N5bS5hc3ltLnN0OwotCi0JICBwc3ltLT5iZWdpbl9wdHIgPSBwc2NvcGUtPmxzeW07Ci0KLQkgIGlmIChiZWdpbl90eXBlICE9IHN0X0ZpbGUpCi0JICAgIHNjb3BlX2RlbHRhID0gLTE7Ci0KLQkgIC8qIEV4Y2VwdCBmb3IgZmlsZSwgc3RydWN0dXJlLCB1bmlvbiwgb3IgZW51bWVyYXRpb24gZW5kCi0JICAgICBibG9ja3MgcmVtb3ZlIGFsbCB0YWdzIGNyZWF0ZWQgd2l0aGluIHRoaXMgc2NvcGUuICAqLwotCSAgaWYgKGJlZ2luX3R5cGUgIT0gc3RfRmlsZSAmJiBzdG9yYWdlICE9IHNjX0luZm8pCi0JICAgIHsKLQkgICAgICBwdGFnX2hlYWQgPSBjdXJfdGFnX2hlYWQ7Ci0JICAgICAgY3VyX3RhZ19oZWFkID0gcHRhZ19oZWFkLT5wcmV2OwotCi0JICAgICAgZm9yIChwdGFnID0gcHRhZ19oZWFkLT5maXJzdF90YWc7Ci0JCSAgIHB0YWcgIT0gKHRhZ190ICopIE5VTEw7Ci0JCSAgIHB0YWcgPSBwdGFnX25leHQpCi0JCXsKLQkJICBpZiAocHRhZy0+Zm9yd2FyZF9yZWYgIT0gKGZvcndhcmRfdCAqKSBOVUxMKQotCQkgICAgYWRkX3Vua25vd25fdGFnIChwdGFnKTsKLQotCQkgIHB0YWdfbmV4dCA9IHB0YWctPnNhbWVfYmxvY2s7Ci0JCSAgcHRhZy0+aGFzaF9wdHItPnRhZ19wdHIgPSBwdGFnLT5zYW1lX25hbWU7Ci0JCSAgZnJlZV90YWcgKHB0YWcpOwotCQl9Ci0KLQkgICAgICBmcmVlX3RoZWFkIChwdGFnX2hlYWQpOwotCSAgICB9Ci0KLQkgIGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlID0gcHNjb3BlLT5wcmV2OwotCi0JICAvKiBibG9jayBiZWdpbiBnZXRzIG5leHQgc3ltICMuICBUaGlzIGlzIHNldCB3aGVuIHdlIGtub3cKLQkgICAgIHRoZSBzeW1ib2wgaW5kZXggdmFsdWUuICAqLwotCi0JICAvKiBGdW5jdGlvbnMgcHVzaCB0d28gb3IgbW9yZSBhdXggd29yZHMgYXMgZm9sbG93czoKLQkgICAgIDFzdCB3b3JkOiBpbmRleCsxIG9mIHRoZSBlbmQgc3ltYm9sIChmaWxsZWQgaW4gbGF0ZXIpLgotCSAgICAgMm5kIHdvcmQ6IHR5cGUgb2YgdGhlIGZ1bmN0aW9uIChwbHVzIGFueSBhdXggd29yZHMgbmVlZGVkKS4KLQkgICAgIEFsc28sIHRpZSB0aGUgZXh0ZXJuYWwgcG9pbnRlciBiYWNrIHRvIHRoZSBmdW5jdGlvbiBiZWdpbiBzeW1ib2wuICAqLwotCSAgaWYgKGJlZ2luX3R5cGUgIT0gc3RfRmlsZSAmJiBiZWdpbl90eXBlICE9IHN0X0Jsb2NrKQotCSAgICB7Ci0JICAgICAgc3ltaW50X3QgdHk7Ci0JICAgICAgdmFycmF5X3QgKnN2cCA9ICZjdXJfZmlsZV9wdHItPmF1eF9zeW1zOwotCi0JICAgICAgcHNjb3BlLT5sc3ltLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGFkZF9hdXhfc3ltX3N5bWludCAoMCk7Ci0JICAgICAgcHNjb3BlLT5sc3ltLT5pbmRleF9wdHIgPQotCQkmc3ZwLT5sYXN0LT5kYXR1bS0+YXV4W3N2cC0+b2JqZWN0c19sYXN0X3BhZ2UgLSAxXTsKLQkgICAgICB0eSA9IGFkZF9hdXhfc3ltX3RpciAoJmxhc3RfZnVuY190eXBlX2luZm8sCi0JCQkJICAgIGhhc2hfbm8sCi0JCQkJICAgICZjdXJfZmlsZV9wdHItPnRoYXNoX2hlYWRbMF0pOwotCi0vKiBUaGlzIHNlZW1zIHRvIGJlIHVubmVjZXNzYXJ5LiAgSSdtIG5vdCBldmVuIHN1cmUgd2hhdCBpdCBpcwotICogaW50ZW5kZWQgdG8gZG8uICBJdCdzIGZyb20gbWlwcy10ZmlsZS4KLSAqCSAgICAgIGlmIChsYXN0X2Z1bmNfc3ltX3ZhbHVlICE9IChzeW1ib2xTICopIE5VTEwpCi0gKgkJewotICoJCSAgbGFzdF9mdW5jX3N5bV92YWx1ZS0+aWZkID0gY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4OwotICoJCSAgbGFzdF9mdW5jX3N5bV92YWx1ZS0+aW5kZXggPSB0eTsKLSAqCQl9Ci0gKi8KLQkgICAgfQotCi0JICBmcmVlX3Njb3BlIChwc2NvcGUpOwotCX0KLSAgICB9Ci0KLSAgY3VyX2ZpbGVfcHRyLT5uZXN0ZWRfc2NvcGVzICs9IHNjb3BlX2RlbHRhOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnICYmIHR5cGUgIT0gc3RfRmlsZQotICAgICAgJiYgKGRlYnVnID4gMiB8fCB0eXBlID09IHN0X0Jsb2NrIHx8IHR5cGUgPT0gc3RfRW5kCi0JICB8fCB0eXBlID09IHN0X1Byb2MgfHwgdHlwZSA9PSBzdF9TdGF0aWNQcm9jKSkKLSAgICB7Ci0gICAgICBjaGFyICpzY19zdHIgPSBzY190b19zdHJpbmcgKHN0b3JhZ2UpOwotICAgICAgY2hhciAqc3Rfc3RyID0gc3RfdG9fc3RyaW5nICh0eXBlKTsKLSAgICAgIGludCBkZXB0aCA9IGN1cl9maWxlX3B0ci0+bmVzdGVkX3Njb3BlcyArIChzY29wZV9kZWx0YSA8IDApOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcdGxzeW1cdHY9ICUxMGxkLCBkZXB0aD0gJTJkLCBzYz0gJS0xMnMiLAotCSAgICAgICB2YWx1ZSwgZGVwdGgsIHNjX3N0cik7Ci0KLSAgICAgIGlmIChzdHJfc3RhcnQgJiYgc3RyX2VuZF9wMSAtIHN0cl9zdGFydCA+IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIHN0PSAlLTExcyBuYW1lPSAlLipzXG4iLCBzdF9zdHIsIHN0cl9lbmRfcDEgLSBzdHJfc3RhcnQsIHN0cl9zdGFydCk7Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBsZW4gPSBzdHJsZW4gKHN0X3N0cik7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIgc3Q9ICUuKnNcbiIsIGxlbi0xLCBzdF9zdHIpOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gcHN5bTsKLX0KLQwKLS8qIEFkZCBhbiBhdXhpbGlhcnkgc3ltYm9sIChwYXNzaW5nIGEgc3ltaW50KS4gIFRoaXMgaXMgYWN0dWFsbHkgdXNlZAotICAgZm9yIGludGVncmFsIGF1eCB0eXBlcywgbm90IGp1c3Qgc3ltaW50cy4gICovCi0KLXN0YXRpYyBzeW1pbnRfdAotYWRkX2F1eF9zeW1fc3ltaW50IChhdXhfd29yZCkKLSAgICAgc3ltaW50X3QgYXV4X3dvcmQ7CQkvKiBhdXhpbGlhcnkgaW5mb3JtYXRpb24gd29yZCAqLwotewotICByZWdpc3RlciB2YXJyYXlfdCAqdnA7Ci0gIHJlZ2lzdGVyIGF1eF90ICphdXhfcHRyOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPmF1eF9zeW1zOwotCi0gIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCi0gICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0KLSAgYXV4X3B0ciA9ICZ2cC0+bGFzdC0+ZGF0dW0tPmF1eFt2cC0+b2JqZWN0c19sYXN0X3BhZ2UrK107Ci0gIGF1eF9wdHItPnR5cGUgPSBhdXhfaXN5bTsKLSAgYXV4X3B0ci0+ZGF0YS5pc3ltID0gYXV4X3dvcmQ7Ci0KLSAgcmV0dXJuIHZwLT5udW1fYWxsb2NhdGVkKys7Ci19Ci0KLQotLyogQWRkIGFuIGF1eGlsaWFyeSBzeW1ib2wgKHBhc3NpbmcgYSBmaWxlL3N5bWJvbCBpbmRleCBjb21ibykuICAqLwotCi1zdGF0aWMgc3ltaW50X3QKLWFkZF9hdXhfc3ltX3JuZHggKGZpbGVfaW5kZXgsIHN5bV9pbmRleCkKLSAgICAgaW50IGZpbGVfaW5kZXg7Ci0gICAgIHN5bWludF90IHN5bV9pbmRleDsKLXsKLSAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOwotICByZWdpc3RlciBhdXhfdCAqYXV4X3B0cjsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7Ci0KLSAgdnAgPSAmY3VyX2ZpbGVfcHRyLT5hdXhfc3ltczsKLQotICBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQotICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotCi0gIGF1eF9wdHIgPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbdnAtPm9iamVjdHNfbGFzdF9wYWdlKytdOwotICBhdXhfcHRyLT50eXBlID0gYXV4X3JuZHg7Ci0gIGF1eF9wdHItPmRhdGEucm5keC5yZmQgICA9IGZpbGVfaW5kZXg7Ci0gIGF1eF9wdHItPmRhdGEucm5keC5pbmRleCA9IHN5bV9pbmRleDsKLQotICByZXR1cm4gdnAtPm51bV9hbGxvY2F0ZWQrKzsKLX0KLQwKLS8qIEFkZCBhbiBhdXhpbGlhcnkgc3ltYm9sIChwYXNzaW5nIHRoZSBiYXNpYyB0eXBlIGFuZCBwb3NzaWJseQotICAgdHlwZSBxdWFsaWZpZXJzKS4gICovCi0KLXN0YXRpYyBzeW1pbnRfdAotYWRkX2F1eF9zeW1fdGlyICh0LCBzdGF0ZSwgaGFzaF90YmwpCi0gICAgIHR5cGVfaW5mb190ICp0OwkJLyogY3VycmVudCB0eXBlIGluZm9ybWF0aW9uICovCi0gICAgIGhhc2hfc3RhdGVfdCBzdGF0ZTsJLyogd2hldGhlciB0byBoYXNoIHR5cGUgb3Igbm90ICovCi0gICAgIHRoYXNoX3QgKipoYXNoX3RibDsJLyogcG9pbnRlciB0byBoYXNoIHRhYmxlIHRvIHVzZSAqLwotewotICByZWdpc3RlciB2YXJyYXlfdCAqdnA7Ci0gIHJlZ2lzdGVyIGF1eF90ICphdXhfcHRyOwotICBzdGF0aWMgQVVYVSBpbml0X2F1eDsKLSAgc3ltaW50X3QgcmV0OwotICBpbnQgaTsKLSAgQVVYVSBhdXg7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIHZwID0gJmN1cl9maWxlX3B0ci0+YXV4X3N5bXM7Ci0KLSAgYXV4ID0gaW5pdF9hdXg7Ci0gIGF1eC50aS5idCA9IChpbnQpIHQtPmJhc2ljX3R5cGU7Ci0gIGF1eC50aS5jb250aW51ZWQgPSAwOwotICBhdXgudGkuZkJpdGZpZWxkID0gdC0+Yml0ZmllbGQ7Ci0KLSAgYXV4LnRpLnRxMCA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1swXTsKLSAgYXV4LnRpLnRxMSA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1sxXTsKLSAgYXV4LnRpLnRxMiA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1syXTsKLSAgYXV4LnRpLnRxMyA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1szXTsKLSAgYXV4LnRpLnRxNCA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1s0XTsKLSAgYXV4LnRpLnRxNSA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1s1XTsKLQotCi0gIC8qIEZvciBhbnl0aGluZyB0aGF0IGFkZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgd2UgbXVzdCBub3QgaGFzaCwKLSAgICAgc28gY2hlY2sgaGVyZSwgYW5kIHJlc2V0IG91ciBzdGF0ZS4gKi8KLQotICBpZiAoc3RhdGUgIT0gaGFzaF9ubwotICAgICAgJiYgKHQtPnR5cGVfcXVhbGlmaWVyc1swXSA9PSB0cV9BcnJheQotCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzFdID09IHRxX0FycmF5Ci0JICB8fCB0LT50eXBlX3F1YWxpZmllcnNbMl0gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1szXSA9PSB0cV9BcnJheQotCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzRdID09IHRxX0FycmF5Ci0JICB8fCB0LT50eXBlX3F1YWxpZmllcnNbNV0gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPmJhc2ljX3R5cGUgPT0gYnRfU3RydWN0Ci0JICB8fCB0LT5iYXNpY190eXBlID09IGJ0X1VuaW9uCi0JICB8fCB0LT5iYXNpY190eXBlID09IGJ0X0VudW0KLQkgIHx8IHQtPmJpdGZpZWxkCi0JICB8fCB0LT5udW1fZGltcyA+IDApKQotICAgIHN0YXRlID0gaGFzaF9ubzsKLQotICAvKiBTZWUgaWYgd2UgY2FuIGhhc2ggdGhpcyB0eXBlLCBhbmQgc2F2ZSBzb21lIHNwYWNlLCBidXQgc29tZSB0eXBlcwotICAgICBjYW4ndCBiZSBoYXNoZWQgKGJlY2F1c2UgdGhleSBjb250YWluIGFycmF5cyBvciBjb250aW51YXRpb25zKSwKLSAgICAgYW5kIG90aGVycyBjYW4gYmUgcHV0IGludG8gdGhlIGhhc2ggbGlzdCwgYnV0IGNhbm5vdCB1c2UgZXhpc3RpbmcKLSAgICAgdHlwZXMgYmVjYXVzZSBvdGhlciBhdXggZW50cmllcyBwcmVjZWRlIHRoaXMgb25lLiAgKi8KLQotICBpZiAoc3RhdGUgIT0gaGFzaF9ubykKLSAgICB7Ci0gICAgICByZWdpc3RlciB0aGFzaF90ICpoYXNoX3B0cjsKLSAgICAgIHJlZ2lzdGVyIHN5bWludF90IGhpOwotCi0gICAgICBoaSA9IGF1eC5pc3ltICYgKCgxIDw8IEhBU0hCSVRTKSAtIDEpOwotICAgICAgaGkgJT0gVEhBU0hfU0laRTsKLQotICAgICAgZm9yIChoYXNoX3B0ciA9IGhhc2hfdGJsW2hpXTsKLQkgICBoYXNoX3B0ciAhPSAodGhhc2hfdCAqKTA7Ci0JICAgaGFzaF9wdHIgPSBoYXNoX3B0ci0+bmV4dCkKLQl7Ci0JICBpZiAoYXV4LmlzeW0gPT0gaGFzaF9wdHItPnR5cGUuaXN5bSkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaGFzaF9wdHIgIT0gKHRoYXNoX3QgKikgTlVMTCAmJiBzdGF0ZSA9PSBoYXNoX3llcykKLQlyZXR1cm4gaGFzaF9wdHItPmluZHg7Ci0KLSAgICAgIGlmIChoYXNoX3B0ciA9PSAodGhhc2hfdCAqKSBOVUxMKQotCXsKLQkgIGhhc2hfcHRyID0gYWxsb2NhdGVfdGhhc2ggKCk7Ci0JICBoYXNoX3B0ci0+bmV4dCA9IGhhc2hfdGJsW2hpXTsKLQkgIGhhc2hfcHRyLT50eXBlID0gYXV4OwotCSAgaGFzaF9wdHItPmluZHggPSB2cC0+bnVtX2FsbG9jYXRlZDsKLQkgIGhhc2hfdGJsW2hpXSA9IGhhc2hfcHRyOwotCX0KLSAgICB9Ci0KLSAgLyogRXZlcnl0aGluZyBpcyBzZXQgdXAsIGFkZCB0aGUgYXV4IHN5bWJvbC4gKi8KLSAgaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKLSAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLQotICBhdXhfcHRyID0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4WyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UrKyBdOwotICBhdXhfcHRyLT50eXBlID0gYXV4X3RpcjsKLSAgYXV4X3B0ci0+ZGF0YSA9IGF1eDsKLQotICByZXQgPSB2cC0+bnVtX2FsbG9jYXRlZCsrOwotCi0gIC8qIEFkZCBiaXRmaWVsZCBsZW5ndGggaWYgaXQgZXhpc3RzLgotCi0gICAgIE5PVEU6ICBNaXBzIGRvY3VtZW50YXRpb24gY2xhaW1zIGJpdGZpZWxkIGdvZXMgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgQVVYIHJlY29yZCwgYnV0IHRoZSBERUNzdGF0aW9uIGNvbXBpbGVyIGVtaXRzIGl0IGhlcmUuCi0gICAgIChUaGlzIHdvdWxkIG9ubHkgbWFrZSBhIGRpZmZlcmVuY2UgZm9yIGVudW0gYml0ZmllbGRzLikKLQotICAgICBBbHNvIG5vdGU6ICBXZSB1c2UgdGhlIGxhc3Qgc2l6ZSBnaXZlbiBzaW5jZSBnY2MgbWF5IGVtaXQgMgotICAgICBmb3IgYW4gZW51bSBiaXRmaWVsZC4gICovCi0KLSAgaWYgKHQtPmJpdGZpZWxkKQotICAgICh2b2lkKSBhZGRfYXV4X3N5bV9zeW1pbnQgKChzeW1pbnRfdCl0LT5zaXplc1t0LT5udW1fc2l6ZXMtMV0pOwotCi0KLSAgLyogQWRkIHRhZyBpbmZvcm1hdGlvbiBpZiBuZWVkZWQuICBTdHJ1Y3R1cmUsIHVuaW9uLCBhbmQgZW51bQotICAgICByZWZlcmVuY2VzIGFkZCAyIGF1eCBzeW1ib2xzOiBhIFtmaWxlIGluZGV4LCBzeW1ib2wgaW5kZXhdCi0gICAgIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB0eXBlLCBhbmQgdGhlIGN1cnJlbnQgZmlsZSBpbmRleC4gICovCi0KLSAgaWYgKHQtPmJhc2ljX3R5cGUgPT0gYnRfU3RydWN0Ci0gICAgICB8fCB0LT5iYXNpY190eXBlID09IGJ0X1VuaW9uCi0gICAgICB8fCB0LT5iYXNpY190eXBlID09IGJ0X0VudW0pCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3ltaW50X3QgZmlsZV9pbmRleCA9IHQtPnRhZ19wdHItPmlmZDsKLSAgICAgIHJlZ2lzdGVyIGxvY2Fsc3ltX3QgKnN5bSAgPSB0LT50YWdfcHRyLT5zeW07Ci0gICAgICByZWdpc3RlciBmb3J3YXJkX3QgKmZvcndhcmRfcmVmID0gYWxsb2NhdGVfZm9yd2FyZCAoKTsKLQotICAgICAgaWYgKHN5bSAhPSAobG9jYWxzeW1fdCAqKSBOVUxMKQotCXsKLQkgIGZvcndhcmRfcmVmLT5uZXh0ID0gc3ltLT5mb3J3YXJkX3JlZjsKLQkgIHN5bS0+Zm9yd2FyZF9yZWYgPSBmb3J3YXJkX3JlZjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9yd2FyZF9yZWYtPm5leHQgPSB0LT50YWdfcHRyLT5mb3J3YXJkX3JlZjsKLQkgIHQtPnRhZ19wdHItPmZvcndhcmRfcmVmID0gZm9yd2FyZF9yZWY7Ci0JfQotCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fcm5keCAoU1RfUkZERVNDQVBFLCBpbmRleE5pbCk7Ci0gICAgICBmb3J3YXJkX3JlZi0+aW5kZXhfcHRyCi0JPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbIHZwLT5vYmplY3RzX2xhc3RfcGFnZSAtIDFdOwotCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50IChmaWxlX2luZGV4KTsKLSAgICAgIGZvcndhcmRfcmVmLT5pZmRfcHRyCi0JPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbIHZwLT5vYmplY3RzX2xhc3RfcGFnZSAtIDFdOwotICAgIH0KLQotICAvKiBBZGQgaW5mb3JtYXRpb24gYWJvdXQgYXJyYXkgYm91bmRzIGlmIHRoZXkgZXhpc3QuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgdC0+bnVtX2RpbXM7IGkrKykKLSAgICB7Ci0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fcm5keCAoU1RfUkZERVNDQVBFLAotCQkJICAgICAgIGN1cl9maWxlX3B0ci0+aW50X3R5cGUpOwotCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50IChjdXJfZmlsZV9wdHItPmZpbGVfaW5kZXgpOwkvKiBmaWxlIGluZGV4Ki8KLSAgICAgICh2b2lkKSBhZGRfYXV4X3N5bV9zeW1pbnQgKChzeW1pbnRfdCkgMCk7CQkJLyogbG93IGJvdW5kICovCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICh0LT5kaW1lbnNpb25zW2ldIC0gMSk7CQkvKiBoaWdoIGJvdW5kKi8KLSAgICAgICh2b2lkKSBhZGRfYXV4X3N5bV9zeW1pbnQgKCh0LT5kaW1lbnNpb25zW2ldID09IDApCS8qIHN0cmlkZSAqLwotCQkJCSA/IDAKLQkJCQkgOiAodC0+c2l6ZXNbaV0gKiA4KSAvIHQtPmRpbWVuc2lvbnNbaV0pOwotICAgIH07Ci0KLSAgLyogTk9URTogIE1pcHMgZG9jdW1lbnRhdGlvbiBjbGFpbXMgdGhhdCB0aGUgYml0ZmllbGQgd2lkdGggZ29lcyBoZXJlLgotICAgICBCdXQgaXQgbmVlZHMgdG8gYmUgZW1pdHRlZCBlYXJsaWVyLiAqLwotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBBZGQgYSB0YWcgdG8gdGhlIHRhZyB0YWJsZSAodW5sZXNzIGl0IGFscmVhZHkgZXhpc3RzKS4gICovCi0KLXN0YXRpYyB0YWdfdCAqCi1nZXRfdGFnICh0YWcsIHN5bSwgYmFzaWNfdHlwZSkKLSAgICAgY29uc3QgY2hhciAqdGFnOwkJCS8qIHRhZyBuYW1lICovCi0gICAgIGxvY2Fsc3ltX3QgKnN5bTsJCQkvKiB0YWcgc3RhcnQgYmxvY2sgKi8KLSAgICAgYnRfdCBiYXNpY190eXBlOwkJCS8qIGJ0X1N0cnVjdCwgYnRfVW5pb24sIG9yIGJ0X0VudW0gKi8KLXsKLSAgc2hhc2hfdCAqaGFzaF9wdHI7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgdGFnX3QgKnRhZ19wdHI7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIGhhc2hfcHRyID0gKHNoYXNoX3QgKikgaGFzaF9maW5kICh0YWdfaGFzaCwgdGFnKTsKLQotICBpZiAoaGFzaF9wdHIgIT0gKHNoYXNoX3QgKikgTlVMTAotICAgICAgJiYgaGFzaF9wdHItPnRhZ19wdHIgIT0gKHRhZ190ICopIE5VTEwpCi0gIHsKLSAgICB0YWdfcHRyID0gaGFzaF9wdHItPnRhZ19wdHI7Ci0gICAgaWYgKHN5bSAhPSAobG9jYWxzeW1fdCAqKSBOVUxMKQotICAgICAgewotCXRhZ19wdHItPmJhc2ljX3R5cGUgPSBiYXNpY190eXBlOwotCXRhZ19wdHItPmlmZAkgICAgPSBjdXJfZmlsZV9wdHItPmZpbGVfaW5kZXg7Ci0JdGFnX3B0ci0+c3ltCSAgICA9IHN5bTsKLSAgICAgIH0KLSAgICByZXR1cm4gdGFnX3B0cjsKLSAgfQotCi0gIGlmIChoYXNoX3B0ciA9PSAoc2hhc2hfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnBlcm07Ci0KLSAgICAgIHBlcm0gPSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgKHN0cmxlbiAodGFnKSArIDEpKTsKLSAgICAgIHN0cmNweSAocGVybSwgdGFnKTsKLSAgICAgIGhhc2hfcHRyID0gYWxsb2NhdGVfc2hhc2ggKCk7Ci0gICAgICBlcnIgPSBoYXNoX2luc2VydCAodGFnX2hhc2gsIHBlcm0sIChjaGFyICopIGhhc2hfcHRyKTsKLSAgICAgIGlmIChlcnIpCi0JYXNfZmF0YWwgKF8oIkluc2VydGluZyBcIiVzXCIgaW50byB0YWcgaGFzaCB0YWJsZTogJXMiKSwKLQkJICB0YWcsIGVycik7Ci0gICAgICBoYXNoX3B0ci0+c3RyaW5nID0gcGVybTsKLSAgICB9Ci0KLSAgdGFnX3B0ciA9IGFsbG9jYXRlX3RhZyAoKTsKLSAgdGFnX3B0ci0+Zm9yd2FyZF9yZWYJPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0gIHRhZ19wdHItPmhhc2hfcHRyCT0gaGFzaF9wdHI7Ci0gIHRhZ19wdHItPnNhbWVfbmFtZQk9IGhhc2hfcHRyLT50YWdfcHRyOwotICB0YWdfcHRyLT5iYXNpY190eXBlCT0gYmFzaWNfdHlwZTsKLSAgdGFnX3B0ci0+c3ltCQk9IHN5bTsKLSAgdGFnX3B0ci0+aWZkCQk9ICgoc3ltID09IChsb2NhbHN5bV90ICopIE5VTEwpCi0JCQkgICA/IChzeW1pbnRfdCkgLTEKLQkJCSAgIDogY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4KTsKLSAgdGFnX3B0ci0+c2FtZV9ibG9jawk9IGN1cl90YWdfaGVhZC0+Zmlyc3RfdGFnOwotCi0gIGN1cl90YWdfaGVhZC0+Zmlyc3RfdGFnID0gdGFnX3B0cjsKLSAgaGFzaF9wdHItPnRhZ19wdHIJICA9IHRhZ19wdHI7Ci0KLSAgcmV0dXJuIHRhZ19wdHI7Ci19Ci0MCi0vKiBBZGQgYW4gdW5rbm93biB7c3RydWN0LCB1bmlvbiwgZW51bX0gdGFnLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF91bmtub3duX3RhZyAocHRhZykKLSAgICAgdGFnX3QJKnB0YWc7CQkvKiBwb2ludGVyIHRvIHRhZyBpbmZvcm1hdGlvbiAqLwotewotICBzaGFzaF90ICpoYXNoX3B0cgk9IHB0YWctPmhhc2hfcHRyOwotICBjaGFyICpuYW1lCQk9IGhhc2hfcHRyLT5zdHJpbmc7Ci0gIGxvY2Fsc3ltX3QgKnN5bTsKLSAgZm9yd2FyZF90ICoqcGY7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVRwotICBpZiAoZGVidWcgPiAxKQotICAgIHsKLSAgICAgIGNoYXIgKmFnZ190eXBlCT0gInt1bmtub3duIGFnZ3JlZ2F0ZSB0eXBlfSI7Ci0gICAgICBzd2l0Y2ggKHB0YWctPmJhc2ljX3R5cGUpCi0JewotCWNhc2UgYnRfU3RydWN0OglhZ2dfdHlwZSA9ICJzdHJ1Y3QiOwlicmVhazsKLQljYXNlIGJ0X1VuaW9uOglhZ2dfdHlwZSA9ICJ1bmlvbiI7CWJyZWFrOwotCWNhc2UgYnRfRW51bToJYWdnX3R5cGUgPSAiZW51bSI7CWJyZWFrOwotCWRlZmF1bHQ6CQkJCWJyZWFrOwotCX0KLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAidW5rbm93biAlcyAlLipzIGZvdW5kXG4iLCBhZ2dfdHlwZSwKLQkgICAgICAgaGFzaF9wdHItPmxlbiwgbmFtZV9zdGFydCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgc3ltID0gYWRkX2Vjb2ZmX3N5bWJvbCAobmFtZSwKLQkJCSAgc3RfQmxvY2ssCi0JCQkgIHNjX0luZm8sCi0JCQkgIChzeW1ib2xTICopIE5VTEwsCi0JCQkgIChiZmRfdm1hKSAwLAotCQkJICAoc3ltaW50X3QpIDAsCi0JCQkgIChzeW1pbnRfdCkgMCk7Ci0KLSAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKG5hbWUsCi0JCQkgICBzdF9FbmQsCi0JCQkgICBzY19JbmZvLAotCQkJICAgKHN5bWJvbFMgKikgTlVMTCwKLQkJCSAgIChiZmRfdm1hKSAwLAotCQkJICAgKHN5bWludF90KSAwLAotCQkJICAgKHN5bWludF90KSAwKTsKLQotICBmb3IgKHBmID0gJnN5bS0+Zm9yd2FyZF9yZWY7ICpwZiAhPSAoZm9yd2FyZF90ICopIE5VTEw7IHBmID0gJigqcGYpLT5uZXh0KQotICAgIDsKLSAgKnBmID0gcHRhZy0+Zm9yd2FyZF9yZWY7Ci19Ci0MCi0vKiBBZGQgYSBwcm9jZWR1cmUgdG8gdGhlIGN1cnJlbnQgZmlsZSdzIGxpc3Qgb2YgcHJvY2VkdXJlcywgYW5kIHJlY29yZAotICAgdGhpcyBpcyB0aGUgY3VycmVudCBwcm9jZWR1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX3Byb2NlZHVyZSAoZnVuYykKLSAgICAgY2hhciAqZnVuYzsJCQkvKiBmdW5jIG5hbWUgKi8KLXsKLSAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOwotICByZWdpc3RlciBwcm9jX3QgKm5ld19wcm9jX3B0cjsKLSAgc3ltYm9sUyAqc3ltOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnKQotICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOwotI2VuZGlmCi0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIHZwID0gJmN1cl9maWxlX3B0ci0+cHJvY3M7Ci0KLSAgaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKLSAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLQotICBjdXJfcHJvY19wdHIgPSBuZXdfcHJvY19wdHIgPSAmdnAtPmxhc3QtPmRhdHVtLT5wcm9jW3ZwLT5vYmplY3RzX2xhc3RfcGFnZSsrXTsKLQotICBpZiAoZmlyc3RfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIGZpcnN0X3Byb2NfcHRyID0gbmV3X3Byb2NfcHRyOwotCi0gIHZwLT5udW1fYWxsb2NhdGVkKys7Ci0KLSAgbmV3X3Byb2NfcHRyLT5wZHIuaXN5bSA9IC0xOwotICBuZXdfcHJvY19wdHItPnBkci5pbGluZSA9IC0xOwotICBuZXdfcHJvY19wdHItPnBkci5sbkxvdyA9IC0xOwotICBuZXdfcHJvY19wdHItPnBkci5sbkhpZ2ggPSAtMTsKLQotICAvKiBTZXQgdGhlIEJTRl9GVU5DVElPTiBmbGFnIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoZnVuYyk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLSAgLyogUHVzaCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgbmV3X3Byb2NfcHRyLT5zeW0gPSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9Qcm9jLCBzY19UZXh0LAotCQkJCQlzeW0sIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIDAsCi0JCQkJCShzeW1pbnRfdCkgMCk7Ci0KLSAgKytwcm9jX2NudDsKLQotICAvKiBGaWxsIGluIHRoZSBsaW5lbm9zIHByZWNlZGluZyB0aGUgLmVudCwgaWYgYW55LiAgKi8KLSAgaWYgKG5vcHJvY19saW5lbm8gIT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBsaW5lbm9fbGlzdF90ICpsOwotCi0gICAgICBmb3IgKGwgPSBub3Byb2NfbGluZW5vOyBsICE9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7IGwgPSBsLT5uZXh0KQotCWwtPnByb2MgPSBuZXdfcHJvY19wdHI7Ci0gICAgICAqbGFzdF9saW5lbm9fcHRyID0gbm9wcm9jX2xpbmVubzsKLSAgICAgIHdoaWxlICgqbGFzdF9saW5lbm9fcHRyICE9IE5VTEwpCi0JewotCSAgbGFzdF9saW5lbm8gPSAqbGFzdF9saW5lbm9fcHRyOwotCSAgbGFzdF9saW5lbm9fcHRyID0gJmxhc3RfbGluZW5vLT5uZXh0OwotCX0KLSAgICAgIG5vcHJvY19saW5lbm8gPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotICAgIH0KLX0KLQotc3ltYm9sUyAqCi1lY29mZl9nZXRfY3VyX3Byb2Nfc3ltICgpCi17Ci0gIHJldHVybiAoY3VyX3Byb2NfcHRyID8gY3VyX3Byb2NfcHRyLT5zeW0tPmFzX3N5bSA6IE5VTEwpOwotfQotDAotLyogQWRkIGEgbmV3IGZpbGVuYW1lLCBhbmQgc2V0IHVwIGFsbCBvZiB0aGUgZmlsZSByZWxhdGl2ZQotICAgdmlydHVhbCBhcnJheXMgKHN0cmluZ3MsIHN5bWJvbHMsIGF1eCBzeW1zLCBldGMuKS4gIFJlY29yZAotICAgd2hlcmUgdGhlIGN1cnJlbnQgZmlsZSBzdHJ1Y3R1cmUgbGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX2ZpbGUgKGZpbGVfbmFtZSwgaW5keCwgZmFrZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lOwkJLyogZmlsZSBuYW1lICovCi0gICAgIGludCBpbmR4OwotICAgICBpbnQgZmFrZTsKLXsKLSAgcmVnaXN0ZXIgaW50IGZpcnN0X2NoOwotICByZWdpc3RlciBlZmRyX3QgKmZpbF9wdHI7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVRwotICBpZiAoZGVidWcpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXHRmaWxlXHQlLipzXG4iLCBsZW4sIGZpbGVfc3RhcnQpOwotI2VuZGlmCi0KLSAgLyogSWYgdGhlIGZpbGUgbmFtZSBpcyBOVUxMLCB0aGVuIG5vIC5maWxlIHN5bWJvbCBhcHBlYXJlZCwgYW5kIHdlCi0gICAgIHdhbnQgdG8gdXNlIHRoZSBhY3R1YWwgZmlsZSBuYW1lLiAgKi8KLSAgaWYgKGZpbGVfbmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGU7Ci0KLSAgICAgIGlmIChmaXJzdF9maWxlICE9IChlZmRyX3QgKikgTlVMTCkKLQlhc19mYXRhbCAoXygiZmFrZSAuZmlsZSBhZnRlciByZWFsIG9uZSIpKTsKLSAgICAgIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKLSAgICAgIGZpbGVfbmFtZSA9IChjb25zdCBjaGFyICopIGZpbGU7Ci0KLSAgICAgIC8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBzaW5jZSBJCi0gICAgICAgICB0aGluayB0aGF0J3Mgd2hhdCBvdGhlciBFQ09GRiBhc3NlbWJsZXJzIGRvLiAgV2UgZG9uJ3QgZG8KLSAgICAgICAgIHRoaXMgaWYgd2Ugc2VlIGEgLmZpbGUgZGlyZWN0aXZlIHdpdGggYSBzdHJpbmcsIHNpbmNlIHRoYXQKLSAgICAgICAgIGltcGxpZXMgdGhhdCBzb21lIHNvcnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGJlaW5nCi0gICAgICAgICBwcm92aWRlZC4gICovCi0gICAgICBpZiAoISBzeW1ib2xfdGFibGVfZnJvemVuICYmIGRlYnVnX3R5cGUgPT0gREVCVUdfTk9ORSkKLQlkZWJ1Z190eXBlID0gREVCVUdfRUNPRkY7Ci0gICAgfQotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZV9uYW1lKTsKLSNlbmRpZgotCi0gIGN1cnJlbnRfc3RhYnNfZmlsZW5hbWUgPSBmaWxlX25hbWU7Ci0KLSAgLyogSWYgd2UncmUgY3JlYXRpbmcgc3RhYnMsIHRoZW4gd2UgZG9uJ3QgYWN0dWFsbHkgbWFrZSBhIG5ldyBGRFIuCi0gICAgIEluc3RlYWQsIHdlIGp1c3QgY3JlYXRlIGEgc3RhYnMgc3ltYm9sLiAgKi8KLSAgaWYgKHN0YWJzX3NlZW4pCi0gICAgewotICAgICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKGZpbGVfbmFtZSwgc3RfTmlsLCBzY19OaWwsCi0JCQkgICAgICAgc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsCi0JCQkJCSAgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJCQkJICAgZnJhZ19ub3cpLAotCQkJICAgICAgIChiZmRfdm1hKSAwLCAwLCBFQ09GRl9NQVJLX1NUQUIgKE5fU09MKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZpcnN0X2NoID0gKmZpbGVfbmFtZTsKLQotICAvKiBGSVhNRTogV2UgY2FuJ3Qgc2FmZWx5IG1lcmdlIGZpbGVzIHdoaWNoIGhhdmUgbGluZSBudW1iZXIKLSAgICAgaW5mb3JtYXRpb24gKGZNZXJnZSB3aWxsIGJlIHplcm8gaW4gdGhpcyBjYXNlKS4gIE90aGVyd2lzZSwgd2UKLSAgICAgZ2V0IGluY29ycmVjdCBsaW5lIG51bWJlciBkZWJ1Z2dpbmcgaW5mby4gIFNlZSBmb3IgaW5zdGFuY2UKLSAgICAgZWNvZmZfYnVpbGRfbGluZW5vLCB3aGljaCB3aWxsIGVuZCB1cCBzZXR0aW5nIGFsbCBmaWxlLT5mZHIuKgotICAgICBmaWVsZHMgbXVsdGlwbGUgdGltZXMsIHJlc3VsdGluZyBpbiBpbmNvcnJlY3QgZGVidWcgaW5mby4gIEluCi0gICAgIG9yZGVyIHRvIG1ha2UgdGhpcyB3b3JrIHJpZ2h0LCBhbGwgbGluZSBudW1iZXIgYW5kIHN5bWJvbCBpbmZvCi0gICAgIGZvciB0aGUgc2FtZSBzb3VyY2UgZmlsZSBoYXMgdG8gYmUgYWRqYWNlbnQgaW4gdGhlIG9iamVjdCBmaWxlLAotICAgICBzbyB0aGF0IGEgc2luZ2xlIGZpbGUgZGVzY3JpcHRvciBjYW4gYmUgdXNlZCB0byBwb2ludCB0byB0aGVtLgotICAgICBUaGlzIHdvdWxkIHJlcXVpcmUgbWFpbnRhaW5pbmcgZmlsZSBzcGVjaWZpYyBsaXN0cyBvZiBsaW5lCi0gICAgIG51bWJlcnMgYW5kIHN5bWJvbHMgZm9yIGVhY2ggZmlsZSwgc28gdGhhdCB0aGV5IGNhbiBiZSBtZXJnZWQKLSAgICAgdG9nZXRoZXIgKG9yIG91dHB1dCB0b2dldGhlcikgd2hlbiB0d28gLmZpbGUgcHNldWRvLW9wcyBhcmUKLSAgICAgbWVyZ2VkIGludG8gb25lIGZpbGUgZGVzY3JpcHRvci4gICovCi0KLSAgLyogU2VlIGlmIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZC4gICovCi0gIGZvciAoZmlsX3B0ciA9IGZpcnN0X2ZpbGU7Ci0gICAgICAgZmlsX3B0ciAhPSAoZWZkcl90ICopIE5VTEw7Ci0gICAgICAgZmlsX3B0ciA9IGZpbF9wdHItPm5leHRfZmlsZSkKLSAgICB7Ci0gICAgICBpZiAoZmlyc3RfY2ggPT0gZmlsX3B0ci0+bmFtZVswXQotCSAgJiYgc3RyY21wIChmaWxlX25hbWUsIGZpbF9wdHItPm5hbWUpID09IDAKLQkgICYmIGZpbF9wdHItPmZkci5mTWVyZ2UpCi0JewotCSAgY3VyX2ZpbGVfcHRyID0gZmlsX3B0cjsKLQkgIGlmICghIGZha2UpCi0JICAgIGN1cl9maWxlX3B0ci0+ZmFrZSA9IDA7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBuZXcgZmlsZSwgY3JlYXRlIGl0LiAqLwotICBpZiAoZmlsX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZSA9PSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZSkKLQlhZGRfdmFycmF5X3BhZ2UgKCZmaWxlX2Rlc2MpOwotCi0gICAgICBmaWxfcHRyID0gY3VyX2ZpbGVfcHRyID0KLQkmZmlsZV9kZXNjLmxhc3QtPmRhdHVtLT5maWxlW2ZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZSsrXTsKLSAgICAgICpmaWxfcHRyID0gaW5pdF9maWxlOwotCi0gICAgICBmaWxfcHRyLT5maWxlX2luZGV4ID0gY3VycmVudF9maWxlX2lkeCsrOwotICAgICAgKytmaWxlX2Rlc2MubnVtX2FsbG9jYXRlZDsKLQotICAgICAgZmlsX3B0ci0+ZmFrZSA9IGZha2U7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHRoZSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0gICAgICBmaWxfcHRyLT5zdHJfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gICAgICAvKiBNYWtlIHN1cmUgMCBieXRlIGluIHN0cmluZyB0YWJsZSBpcyBudWxsICAqLwotICAgICAgYWRkX3N0cmluZyAoJmZpbF9wdHItPnN0cmluZ3MsCi0JCSAgZmlsX3B0ci0+c3RyX2hhc2gsCi0JCSAgIiIsCi0JCSAgKHNoYXNoX3QgKiopMCk7Ci0KLSAgICAgIGlmIChzdHJsZW4gKGZpbGVfbmFtZSkgPiBQQUdFX1VTSVpFIC0gMikKLQlhc19mYXRhbCAoXygiRmlsZW5hbWUgZ29lcyBvdmVyIG9uZSBwYWdlIGJvdW5kYXJ5LiIpKTsKLQotICAgICAgLyogUHVzaCB0aGUgc3RhcnQgb2YgdGhlIGZpbGVuYW1lLiBXZSBhc3N1bWUgdGhhdCB0aGUgZmlsZW5hbWUKLSAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGF0IHN0cmluZyBvZmZzZXQgMS4gICovCi0gICAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoZmlsZV9uYW1lLCBzdF9GaWxlLCBzY19UZXh0LAotCQkJICAgICAgIChzeW1ib2xTICopIE5VTEwsIChiZmRfdm1hKSAwLAotCQkJICAgICAgIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKLSAgICAgIGZpbF9wdHItPmZkci5yc3MgPSAxOwotICAgICAgZmlsX3B0ci0+bmFtZSA9ICZmaWxfcHRyLT5zdHJpbmdzLmxhc3QtPmRhdHVtLT5ieXRlWzFdOwotCi0gICAgICAvKiBVcGRhdGUgdGhlIGxpbmtlZCBsaXN0IG9mIGZpbGUgZGVzY3JpcHRvcnMuICAqLwotICAgICAgKmxhc3RfZmlsZV9wdHIgPSBmaWxfcHRyOwotICAgICAgbGFzdF9maWxlX3B0ciA9ICZmaWxfcHRyLT5uZXh0X2ZpbGU7Ci0KLSAgICAgIC8qIEFkZCB2b2lkICYgaW50IHR5cGVzIHRvIHRoZSBmaWxlICh2b2lkIHNob3VsZCBiZSBmaXJzdCB0byBjYXRjaAotCSBlcnJhbnQgMCdzIHdpdGhpbiB0aGUgaW5kZXggZmllbGRzKS4gICovCi0gICAgICBmaWxfcHRyLT52b2lkX3R5cGUgPSBhZGRfYXV4X3N5bV90aXIgKCZ2b2lkX3R5cGVfaW5mbywKLQkJCQkJICAgIGhhc2hfeWVzLAotCQkJCQkgICAgJmN1cl9maWxlX3B0ci0+dGhhc2hfaGVhZFswXSk7Ci0KLSAgICAgIGZpbF9wdHItPmludF90eXBlID0gYWRkX2F1eF9zeW1fdGlyICgmaW50X3R5cGVfaW5mbywKLQkJCQkJICAgaGFzaF95ZXMsCi0JCQkJCSAgICZjdXJfZmlsZV9wdHItPnRoYXNoX2hlYWRbMF0pOwotICAgIH0KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIG5vdGljZXMgYSBwcmVwcm9jZXNzb3IKLSAgIGRpcmVjdGl2ZSBzd2l0Y2hpbmcgdG8gYSBuZXcgZmlsZS4gIFRoaXMgd2lsbCBub3QgaGFwcGVuIGluCi0gICBjb21waWxlciBvdXRwdXQsIG9ubHkgaW4gaGFuZCBjb2RlZCBhc3NlbWJsZXIuICAqLwotCi12b2lkCi1lY29mZl9uZXdfZmlsZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGN1cl9maWxlX3B0ciAhPSBOVUxMICYmIHN0cmNtcCAoY3VyX2ZpbGVfcHRyLT5uYW1lLCBuYW1lKSA9PSAwKQotICAgIHJldHVybjsKLSAgYWRkX2ZpbGUgKG5hbWUsIDAsIDApOwotCi0gIC8qIFRoaXMgaXMgYSBoYW5kIGNvZGVkIGFzc2VtYmxlciBmaWxlLCBzbyBhdXRvbWF0aWNhbGx5IHR1cm4gb24KLSAgICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfTk9ORSkKLSAgICBkZWJ1Z190eXBlID0gREVCVUdfRUNPRkY7Ci19Ci0MCi0jaWZkZWYgRUNPRkZfREVCVUcKLQotLyogQ29udmVydCBzdG9yYWdlIGNsYXNzIHRvIHN0cmluZy4gICovCi0KLXN0YXRpYyBjaGFyICoKLXNjX3RvX3N0cmluZyhzdG9yYWdlX2NsYXNzKQotICAgICBzY190IHN0b3JhZ2VfY2xhc3M7Ci17Ci0gIHN3aXRjaChzdG9yYWdlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIHNjX05pbDoJIHJldHVybiAiTmlsLCI7Ci0gICAgY2FzZSBzY19UZXh0OgkgcmV0dXJuICJUZXh0LCI7Ci0gICAgY2FzZSBzY19EYXRhOgkgcmV0dXJuICJEYXRhLCI7Ci0gICAgY2FzZSBzY19Cc3M6CSByZXR1cm4gIkJzcywiOwotICAgIGNhc2Ugc2NfUmVnaXN0ZXI6CSByZXR1cm4gIlJlZ2lzdGVyLCI7Ci0gICAgY2FzZSBzY19BYnM6CSByZXR1cm4gIkFicywiOwotICAgIGNhc2Ugc2NfVW5kZWZpbmVkOgkgcmV0dXJuICJVbmRlZmluZWQsIjsKLSAgICBjYXNlIHNjX0NkYkxvY2FsOgkgcmV0dXJuICJDZGJMb2NhbCwiOwotICAgIGNhc2Ugc2NfQml0czoJIHJldHVybiAiQml0cywiOwotICAgIGNhc2Ugc2NfQ2RiU3lzdGVtOgkgcmV0dXJuICJDZGJTeXN0ZW0sIjsKLSAgICBjYXNlIHNjX1JlZ0ltYWdlOgkgcmV0dXJuICJSZWdJbWFnZSwiOwotICAgIGNhc2Ugc2NfSW5mbzoJIHJldHVybiAiSW5mbywiOwotICAgIGNhc2Ugc2NfVXNlclN0cnVjdDoJIHJldHVybiAiVXNlclN0cnVjdCwiOwotICAgIGNhc2Ugc2NfU0RhdGE6CSByZXR1cm4gIlNEYXRhLCI7Ci0gICAgY2FzZSBzY19TQnNzOgkgcmV0dXJuICJTQnNzLCI7Ci0gICAgY2FzZSBzY19SRGF0YToJIHJldHVybiAiUkRhdGEsIjsKLSAgICBjYXNlIHNjX1ZhcjoJIHJldHVybiAiVmFyLCI7Ci0gICAgY2FzZSBzY19Db21tb246CSByZXR1cm4gIkNvbW1vbiwiOwotICAgIGNhc2Ugc2NfU0NvbW1vbjoJIHJldHVybiAiU0NvbW1vbiwiOwotICAgIGNhc2Ugc2NfVmFyUmVnaXN0ZXI6IHJldHVybiAiVmFyUmVnaXN0ZXIsIjsKLSAgICBjYXNlIHNjX1ZhcmlhbnQ6CSByZXR1cm4gIlZhcmlhbnQsIjsKLSAgICBjYXNlIHNjX1NVbmRlZmluZWQ6CSByZXR1cm4gIlNVbmRlZmluZWQsIjsKLSAgICBjYXNlIHNjX0luaXQ6CSByZXR1cm4gIkluaXQsIjsKLSAgICBjYXNlIHNjX01heDoJIHJldHVybiAiTWF4LCI7Ci0gICAgfQotCi0gIHJldHVybiAiPz8/LCI7Ci19Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotDAotI2lmZGVmIEVDT0ZGX0RFQlVHCi0KLS8qIENvbnZlcnQgc3ltYm9sIHR5cGUgdG8gc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotc3RfdG9fc3RyaW5nKHN5bWJvbF90eXBlKQotICAgICBzdF90IHN5bWJvbF90eXBlOwotewotICBzd2l0Y2goc3ltYm9sX3R5cGUpCi0gICAgewotICAgIGNhc2Ugc3RfTmlsOglyZXR1cm4gIk5pbCwiOwotICAgIGNhc2Ugc3RfR2xvYmFsOglyZXR1cm4gIkdsb2JhbCwiOwotICAgIGNhc2Ugc3RfU3RhdGljOglyZXR1cm4gIlN0YXRpYywiOwotICAgIGNhc2Ugc3RfUGFyYW06CXJldHVybiAiUGFyYW0sIjsKLSAgICBjYXNlIHN0X0xvY2FsOglyZXR1cm4gIkxvY2FsLCI7Ci0gICAgY2FzZSBzdF9MYWJlbDoJcmV0dXJuICJMYWJlbCwiOwotICAgIGNhc2Ugc3RfUHJvYzoJcmV0dXJuICJQcm9jLCI7Ci0gICAgY2FzZSBzdF9CbG9jazoJcmV0dXJuICJCbG9jaywiOwotICAgIGNhc2Ugc3RfRW5kOglyZXR1cm4gIkVuZCwiOwotICAgIGNhc2Ugc3RfTWVtYmVyOglyZXR1cm4gIk1lbWJlciwiOwotICAgIGNhc2Ugc3RfVHlwZWRlZjoJcmV0dXJuICJUeXBlZGVmLCI7Ci0gICAgY2FzZSBzdF9GaWxlOglyZXR1cm4gIkZpbGUsIjsKLSAgICBjYXNlIHN0X1JlZ1JlbG9jOglyZXR1cm4gIlJlZ1JlbG9jLCI7Ci0gICAgY2FzZSBzdF9Gb3J3YXJkOglyZXR1cm4gIkZvcndhcmQsIjsKLSAgICBjYXNlIHN0X1N0YXRpY1Byb2M6CXJldHVybiAiU3RhdGljUHJvYywiOwotICAgIGNhc2Ugc3RfQ29uc3RhbnQ6CXJldHVybiAiQ29uc3RhbnQsIjsKLSAgICBjYXNlIHN0X1N0cjoJcmV0dXJuICJTdHJpbmcsIjsKLSAgICBjYXNlIHN0X051bWJlcjoJcmV0dXJuICJOdW1iZXIsIjsKLSAgICBjYXNlIHN0X0V4cHI6CXJldHVybiAiRXhwciwiOwotICAgIGNhc2Ugc3RfVHlwZToJcmV0dXJuICJUeXBlLCI7Ci0gICAgY2FzZSBzdF9NYXg6CXJldHVybiAiTWF4LCI7Ci0gICAgfQotCi0gIHJldHVybiAiPz8/LCI7Ci19Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotDAotLyogUGFyc2UgLmJlZ2luIGRpcmVjdGl2ZXMgd2hpY2ggaGF2ZSBhIGxhYmVsIGFzIHRoZSBmaXJzdCBhcmd1bWVudAotICAgd2hpY2ggZ2l2ZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYmxvY2suICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfYmVnaW4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuYmVnaW4gZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmJlZ2luIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfQmxvY2ssIHNjX1RleHQsCi0JCQkgICBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKSwKLQkJCSAgIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIDAsIChzeW1pbnRfdCkgMCk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIC8qIFRoZSBsaW5lIG51bWJlciBmb2xsb3dzLCBidXQgd2UgZG9uJ3QgdXNlIGl0LiAgKi8KLSAgKHZvaWQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmJlbmQgZGlyZWN0aXZlcyB3aGljaCBoYXZlIGEgbGFiZWwgYXMgdGhlIGZpcnN0IGFyZ3VtZW50Ci0gICB3aGljaCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgYmxvY2suICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfYmVuZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotICBzeW1ib2xTICplbmRzeW07Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmJlbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmJlbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIFRoZSB2YWx1ZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgLmJlbmQgZGlyZWN0aXZlIGFuZCB0aGUKLSAgICAgY29ycmVzcG9uZGluZyBzeW1ib2wuICBXZSBmaWxsIGluIHRoZSBvZmZzZXQgd2hlbiB3ZSB3cml0ZSBvdXQKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIGVuZHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgaWYgKGVuZHN5bSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIGFzX3dhcm4gKF8oIi5iZW5kIGRpcmVjdGl2ZSBuYW1lcyB1bmtub3duIHN5bWJvbCIpKTsKLSAgZWxzZQotICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9FbmQsIHNjX1RleHQsIGVuZHN5bSwKLQkJCSAgICAgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgLyogVGhlIGxpbmUgbnVtYmVyIGZvbGxvd3MsIGJ1dCB3ZSBkb24ndCB1c2UgaXQuICAqLwotICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBhcyBhIHNlcmllcyBvZiBkaXJlY3RpdmVzCi0gICAoLmRlZiwgLnNjbCwgZXRjLikuICBXZSBidWlsZCB1cCBpbmZvcm1hdGlvbiBhcyB3ZSByZWFkIHRoZQotICAgZGlyZWN0aXZlcyBpbiB0aGUgZm9sbG93aW5nIHN0YXRpYyB2YXJpYWJsZXMsIGFuZCBmaWxlIGl0IGF3YXkgd2hlbgotICAgd2UgcmVhY2ggdGhlIC5lbmRlZiBkaXJlY3RpdmUuICAqLwotc3RhdGljIGNoYXIgKmNvZmZfc3ltX25hbWU7Ci1zdGF0aWMgdHlwZV9pbmZvX3QgY29mZl90eXBlOwotc3RhdGljIHNjX3QgY29mZl9zdG9yYWdlX2NsYXNzOwotc3RhdGljIHN0X3QgY29mZl9zeW1ib2xfdHlwOwotc3RhdGljIGludCBjb2ZmX2lzX2Z1bmN0aW9uOwotc3RhdGljIGNoYXIgKmNvZmZfdGFnOwotc3RhdGljIHZhbHVlVCBjb2ZmX3ZhbHVlOwotc3RhdGljIHN5bWJvbFMgKmNvZmZfc3ltX3ZhbHVlOwotc3RhdGljIGJmZF92bWEgY29mZl9zeW1fYWRkZW5kOwotc3RhdGljIGludCBjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbjsKLQotLyogSGFuZGxlIGEgLmRlZiBkaXJlY3RpdmU6IHN0YXJ0IGRlZmluaW5nIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2RlZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGVjb2ZmX2RlYnVnZ2luZ19zZWVuID0gMTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoY29mZl9zeW1fbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIGFzX3dhcm4gKF8oIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICBlbHNlIGlmICgqbmFtZSA9PSAnXDAnKQotICAgIGFzX3dhcm4gKF8oIkVtcHR5IHN5bWJvbCBuYW1lIGluIC5kZWY7IGlnbm9yZWQiKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zeW1fbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotCWZyZWUgKGNvZmZfc3ltX25hbWUpOwotICAgICAgaWYgKGNvZmZfdGFnICE9IChjaGFyICopIE5VTEwpCi0JZnJlZSAoY29mZl90YWcpOwotICAgICAgY29mZl9zeW1fbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSAoc3RybGVuIChuYW1lKSArIDEpKTsKLSAgICAgIHN0cmNweSAoY29mZl9zeW1fbmFtZSwgbmFtZSk7Ci0gICAgICBjb2ZmX3R5cGUgPSB0eXBlX2luZm9faW5pdDsKLSAgICAgIGNvZmZfc3RvcmFnZV9jbGFzcyA9IHNjX05pbDsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cCA9IHN0X05pbDsKLSAgICAgIGNvZmZfaXNfZnVuY3Rpb24gPSAwOwotICAgICAgY29mZl90YWcgPSAoY2hhciAqKSBOVUxMOwotICAgICAgY29mZl92YWx1ZSA9IDA7Ci0gICAgICBjb2ZmX3N5bV92YWx1ZSA9IChzeW1ib2xTICopIE5VTEw7Ci0gICAgICBjb2ZmX3N5bV9hZGRlbmQgPSAwOwotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmRpbSBkaXJlY3RpdmUsIHVzZWQgdG8gZ2l2ZSBkaW1lbnNpb25zIGZvciBhbiBhcnJheS4gIFRoZQotICAgYXJndW1lbnRzIGFyZSBjb21tYSBzZXBhcmF0ZWQgbnVtYmVycy4gIG1pcHMtdGZpbGUgYXNzdW1lcyB0aGF0Ci0gICB0aGVyZSB3aWxsIG5vdCBiZSBtb3JlIHRoYW4gNiBkaW1lbnNpb25zLCBhbmQgZ2RiIHdvbid0IHJlYWQgYW55Ci0gICBtb3JlIHRoYW4gdGhhdCBhbnlob3csIHNvIEkgd2lsbCBhbHNvIG1ha2UgdGhhdCBhc3N1bXB0aW9uLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2RpbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgZGltZW5zW05fVFFdOwotICBpbnQgaTsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBOX1RROyBpKyspCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgZGltZW5zW2ldID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1xuJwotCSAgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJzsnKQotCSAgICBhc193YXJuIChfKCJCYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChpID09IE5fVFEpCi0gICAgLS1pOwotCi0gIC8qIFRoZSBkaW1lbnNpb25zIGFyZSBzdG9yZWQgYXdheSBpbiByZXZlcnNlIG9yZGVyLiAgKi8KLSAgZm9yICg7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3R5cGUubnVtX2RpbXMgPj0gTl9UUSkKLQl7Ci0JICBhc193YXJuIChfKCJUb28gbWFueSAuZGltIGVudHJpZXMiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBjb2ZmX3R5cGUuZGltZW5zaW9uc1tjb2ZmX3R5cGUubnVtX2RpbXNdID0gZGltZW5zW2ldOwotICAgICAgKytjb2ZmX3R5cGUubnVtX2RpbXM7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5zY2wgZGlyZWN0aXZlLCB3aGljaCBzZXRzIHRoZSBDT0ZGIHN0b3JhZ2UgY2xhc3Mgb2YgdGhlCi0gICBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfc2NsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnNjbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgY29mZl9zeW1ib2xfdHlwID0gbWFwX2NvZmZfc3ltX3R5cGVbdmFsXTsKLSAgY29mZl9zdG9yYWdlX2NsYXNzID0gbWFwX2NvZmZfc3RvcmFnZVt2YWxdOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5zaXplIGRpcmVjdGl2ZS4gIEZvciBzb21lIHJlYXNvbiBtaXBzLXRmaWxlLmMgdGhpbmtzIHRoYXQKLSAgIC5zaXplIGNhbiBoYXZlIG11bHRpcGxlIGFyZ3VtZW50cy4gIFdlIGh1bW9yIGl0LCBhbHRob3VnaCBnY2Mgd2lsbAotICAgbmV2ZXIgZ2VuZXJhdGUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9zaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBzaXplc1tOX1RRXTsKLSAgaW50IGk7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc2l6ZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5fVFE7IGkrKykKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzaXplc1tpXSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZWxzZQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcbicKLQkgICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICc7JykKLQkgICAgYXNfd2FybiAoXygiQmFkbHkgZm9ybWVkIC5zaXplIGRpcmVjdGl2ZSIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGkgPT0gTl9UUSkKLSAgICAtLWk7Ci0KLSAgLyogVGhlIHNpemVzIGFyZSBzdG9yZWQgYXdheSBpbiByZXZlcnNlIG9yZGVyLiAgKi8KLSAgZm9yICg7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3R5cGUubnVtX3NpemVzID49IE5fVFEpCi0JewotCSAgYXNfd2FybiAoXygiVG9vIG1hbnkgLnNpemUgZW50cmllcyIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGNvZmZfdHlwZS5zaXplc1tjb2ZmX3R5cGUubnVtX3NpemVzXSA9IHNpemVzW2ldOwotICAgICAgKytjb2ZmX3R5cGUubnVtX3NpemVzOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC50eXBlIGRpcmVjdGl2ZSwgd2hpY2ggZ2l2ZXMgdGhlIENPRkYgdHlwZSBvZiB0aGUKLSAgIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV90eXBlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotICB0cV90ICp0cV9wdHI7Ci0gIHRxX3QgKnRxX3NoZnQ7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgY29mZl90eXBlLm9yaWdfdHlwZSA9IEJUWVBFICh2YWwpOwotICBjb2ZmX3R5cGUuYmFzaWNfdHlwZSA9IG1hcF9jb2ZmX3R5cGVzW2NvZmZfdHlwZS5vcmlnX3R5cGVdOwotCi0gIHRxX3B0ciA9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzW05fVFFdOwotICB3aGlsZSAodmFsICZ+IE5fQlRNQVNLKQotICAgIHsKLSAgICAgIGlmICh0cV9wdHIgPT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbMF0pCi0JewotCSAgLyogRklYTUU6IFdlIGNvdWxkIGhhbmRsZSB0aGlzIGJ5IHNldHRpbmcgdGhlIGNvbnRpbnVlZCBiaXQuCi0gICAgICAgICAgICAgVGhlcmUgd291bGQgc3RpbGwgYmUgYSBsaW1pdDogdGhlIC50eXBlIGFyZ3VtZW50IGNhbiBub3QKLSAgICAgICAgICAgICBiZSBpbmZpbml0ZS4gICovCi0JICBhc193YXJuIChfKCJUaGUgdHlwZSBvZiAlcyBpcyB0b28gY29tcGxleDsgaXQgd2lsbCBiZSBzaW1wbGlmaWVkIiksCi0JCSAgIGNvZmZfc3ltX25hbWUpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKElTUFRSICh2YWwpKQotCSotLXRxX3B0ciA9IHRxX1B0cjsKLSAgICAgIGVsc2UgaWYgKElTRkNOICh2YWwpKQotCSotLXRxX3B0ciA9IHRxX1Byb2M7Ci0gICAgICBlbHNlIGlmIChJU0FSWSAodmFsKSkKLQkqLS10cV9wdHIgPSB0cV9BcnJheTsKLSAgICAgIGVsc2UKLQlhc19mYXRhbCAoXygiVW5yZWNvZ25pemVkIC50eXBlIGFyZ3VtZW50IikpOwotCi0gICAgICB2YWwgPSBERUNSRUYgKHZhbCk7Ci0gICAgfQotCi0gIHRxX3NoZnQgPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1swXTsKLSAgd2hpbGUgKHRxX3B0ciAhPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1tOX1RRXSkKLSAgICAqdHFfc2hmdCsrID0gKnRxX3B0cisrOwotCi0gIGlmICh0cV9zaGZ0ICE9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzWzBdICYmIHRxX3NoZnRbLTFdID09IHRxX1Byb2MpCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBpZ25vcmUgaXQsIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHR3bwotCSBlbnRyaWVzIChvbmUgZnJvbSB0aGUgLmVudCwgYW5kIG9uZSBmb3IgdGhlIC5kZWYgdGhhdAotCSBwcmVjZWRlcyBpdCkuICBTYXZlIHRoZSB0eXBlIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlIGVuZAotCSBibG9jayBjYW4gcHJvcGVybHkgYWRkIGl0IGFmdGVyIHRoZSBiZWdpbiBibG9jayBpbmRleC4gIEZvcgotCSBNSVBTIGtub3dzIHdoYXQgcmVhc29uLCB3ZSBtdXN0IHN0cmlwIG9mZiB0aGUgZnVuY3Rpb24gdHlwZQotCSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgICAgIGNvZmZfaXNfZnVuY3Rpb24gPSAxOwotICAgICAgdHFfc2hmdFstMV0gPSB0cV9OaWw7Ci0gICAgfQotCi0gIHdoaWxlICh0cV9zaGZ0ICE9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzW05fVFFdKQotICAgICp0cV9zaGZ0KysgPSB0cV9OaWw7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAudGFnIGRpcmVjdGl2ZSwgd2hpY2ggZ2l2ZXMgdGhlIG5hbWUgb2YgYSBzdHJ1Y3R1cmUsCi0gICB1bmlvbiBvciBlbnVtLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3RhZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBjb2ZmX3RhZyA9IChjaGFyICopIHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSAoc3RybGVuIChuYW1lKSArIDEpKTsKLSAgc3RyY3B5IChjb2ZmX3RhZywgbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnZhbCBkaXJlY3RpdmUsIHdoaWNoIGdpdmVzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgSXQKLSAgIG1heSBiZSB0aGUgbmFtZSBvZiBhIHN0YXRpYyBvciBnbG9iYWwgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3ZhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudmFsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQgJiYgZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIudmFsIGV4cHJlc3Npb24gaXMgdG9vIGNvcG1sZXgiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICBjb2ZmX3ZhbHVlID0gZXhwLlhfYWRkX251bWJlcjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvZmZfc3ltX3ZhbHVlID0gZXhwLlhfYWRkX3N5bWJvbDsKLSAgICAgIGNvZmZfc3ltX2FkZGVuZCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVuZGVmIGRpcmVjdGl2ZSwgd2hpY2ggdGVybWluYXRlcyBwcm9jZXNzaW5nIG9mIENPRkYKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZW5kZWYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgc3ltaW50X3QgaW5keDsKLSAgbG9jYWxzeW1fdCAqc3ltOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kZWYgcHNldWRvLW9wIHVzZWQgYmVmb3JlIC5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBjb2ZmX3N5bV9uYW1lOwotICBjb2ZmX3N5bV9uYW1lID0gKGNoYXIgKikgTlVMTDsKLQotICAvKiBJZiB0aGUgc3ltYm9sIGlzIGEgc3RhdGljIG9yIGV4dGVybmFsLCB3ZSBoYXZlIGFscmVhZHkgZ290dGVuIHRoZQotICAgICBhcHByb3ByaWF0ZSB0eXBlIGFuZCBjbGFzcywgc28gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJyaWRlIHRob3NlCi0gICAgIHZhbHVlcy4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgdHlwZSBhbmQgY2xhc3NlcwotICAgICB0aGF0IGFyZSBub3QgaW4gQ09GRiwgc3VjaCBhcyBzaG9ydCBkYXRhLCBldGMuICAqLwotICBpZiAoY29mZl9zeW1fdmFsdWUgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXAgPSBzdF9OaWw7Ci0gICAgICBjb2ZmX3N0b3JhZ2VfY2xhc3MgPSBzY19OaWw7Ci0gICAgfQotCi0gIGNvZmZfdHlwZS5leHRyYV9zaXplcyA9IGNvZmZfdGFnICE9IChjaGFyICopIE5VTEw7Ci0gIGlmIChjb2ZmX3R5cGUubnVtX2RpbXMgPiAwKQotICAgIHsKLSAgICAgIGludCBkaWZmID0gY29mZl90eXBlLm51bV9kaW1zIC0gY29mZl90eXBlLm51bV9zaXplczsKLSAgICAgIGludCBpID0gY29mZl90eXBlLm51bV9kaW1zIC0gMTsKLSAgICAgIGludCBqOwotCi0gICAgICBpZiAoY29mZl90eXBlLm51bV9zaXplcyAhPSAxIHx8IGRpZmYgPCAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkJhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBhcnJheSwgbWFrZSBzdXJlIHRoZSBzYW1lIG51bWJlciBvZiBkaW1lbnNpb25zCi0JIGFuZCBzaXplcyB3ZXJlIHBhc3NlZCwgY3JlYXRpbmcgZXh0cmEgc2l6ZXMgZm9yIG11bHRpcGx5Ci0JIGRpbWVuc2lvbmVkIGFycmF5cyBpZiBub3QgcGFzc2VkLiAgKi8KLSAgICAgIGNvZmZfdHlwZS5leHRyYV9zaXplcyA9IDA7Ci0gICAgICBpZiAoZGlmZikKLQl7Ci0JICBqID0gKHNpemVvZiAoY29mZl90eXBlLnNpemVzKSAvIHNpemVvZiAoY29mZl90eXBlLnNpemVzWzBdKSkgLSAxOwotCSAgd2hpbGUgKGogPj0gMCkKLQkgICAgewotCSAgICAgIGNvZmZfdHlwZS5zaXplc1tqXSA9ICgoKGogLSBkaWZmKSA+PSAwKQotCQkJCSAgICA/IGNvZmZfdHlwZS5zaXplc1tqIC0gZGlmZl0KLQkJCQkgICAgOiAwKTsKLQkgICAgICBqLS07Ci0JICAgIH0KLQotCSAgY29mZl90eXBlLm51bV9zaXplcyA9IGkgKyAxOwotCSAgZm9yIChpLS07IGkgPj0gMDsgaS0tKQotCSAgICBjb2ZmX3R5cGUuc2l6ZXNbaV0gPSAoY29mZl90eXBlLmRpbWVuc2lvbnNbaSArIDFdID09IDAKLQkJCQkgID8gMAotCQkJCSAgOiAoY29mZl90eXBlLnNpemVzW2kgKyAxXQotCQkJCSAgICAgLyBjb2ZmX3R5cGUuZGltZW5zaW9uc1tpICsgMV0pKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChjb2ZmX3N5bWJvbF90eXAgPT0gc3RfTWVtYmVyCi0JICAgJiYgY29mZl90eXBlLm51bV9zaXplcyAtIGNvZmZfdHlwZS5leHRyYV9zaXplcyA9PSAxKQotICAgIHsKLSAgICAgIC8qIElzIHRoaXMgYSBiaXRmaWVsZD8gIFRoaXMgaXMgaW5kaWNhdGVkIGJ5IGEgc3RydWN0dXJlIG1lbWViZXIKLQkgaGF2aW5nIGEgc2l6ZSBmaWVsZCB0aGF0IGlzbid0IGFuIGFycmF5LiAgKi8KLSAgICAgIGNvZmZfdHlwZS5iaXRmaWVsZCA9IDE7Ci0gICAgfQotCi0gIC8qIEV4Y2VwdCBmb3IgZW51bWVyYXRpb24gbWVtYmVycyAmIGJlZ2luL2VuZGluZyBvZiBzY29wZXMsIHB1dCB0aGUKLSAgICAgdHlwZSB3b3JkIGluIHRoZSBhdXguIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChjb2ZmX3N5bWJvbF90eXAgPT0gc3RfQmxvY2sgfHwgY29mZl9zeW1ib2xfdHlwID09IHN0X0VuZCkKLSAgICBpbmR4ID0gMDsKLSAgZWxzZSBpZiAoY29mZl9pbnNpZGVfZW51bWVyYXRpb24pCi0gICAgaW5keCA9IGN1cl9maWxlX3B0ci0+dm9pZF90eXBlOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGNvZmZfdHlwZS5iYXNpY190eXBlID09IGJ0X1N0cnVjdAotCSAgfHwgY29mZl90eXBlLmJhc2ljX3R5cGUgPT0gYnRfVW5pb24KLQkgIHx8IGNvZmZfdHlwZS5iYXNpY190eXBlID09IGJ0X0VudW0pCi0JewotCSAgaWYgKGNvZmZfdGFnID09IChjaGFyICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJObyB0YWcgc3BlY2lmaWVkIGZvciAlcyIpLCBuYW1lKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgY29mZl90eXBlLnRhZ19wdHIgPSBnZXRfdGFnIChjb2ZmX3RhZywgKGxvY2Fsc3ltX3QgKikgTlVMTCwKLQkJCQkgICAgICAgY29mZl90eXBlLmJhc2ljX3R5cGUpOwotCX0KLQotICAgICAgaWYgKGNvZmZfaXNfZnVuY3Rpb24pCi0JewotCSAgbGFzdF9mdW5jX3R5cGVfaW5mbyA9IGNvZmZfdHlwZTsKLQkgIGxhc3RfZnVuY19zeW1fdmFsdWUgPSBjb2ZmX3N5bV92YWx1ZTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGluZHggPSBhZGRfYXV4X3N5bV90aXIgKCZjb2ZmX3R5cGUsCi0JCQkgICAgICBoYXNoX3llcywKLQkJCSAgICAgICZjdXJfZmlsZV9wdHItPnRoYXNoX2hlYWRbMF0pOwotICAgIH0KLQotICAvKiBEbyBhbnkgbGFzdCBtaW51dGUgYWRqdXN0bWVudHMgdGhhdCBhcmUgbmVjZXNzYXJ5LiAgKi8KLSAgc3dpdGNoIChjb2ZmX3N5bWJvbF90eXApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLQotICAgICAgLyogRm9yIHRoZSBiZWdpbm5pbmcgb2Ygc3RydWN0cywgdW5pb25zLCBhbmQgZW51bWVyYXRpb25zLCB0aGUKLQkgc2l6ZSBpbmZvIG5lZWRzIHRvIGJlIHBhc3NlZCBpbiB0aGUgdmFsdWUgZmllbGQuICAqLwotICAgIGNhc2Ugc3RfQmxvY2s6Ci0gICAgICBpZiAoY29mZl90eXBlLm51bV9zaXplcyAtIGNvZmZfdHlwZS5udW1fZGltcyAtIGNvZmZfdHlwZS5leHRyYV9zaXplcwotCSAgIT0gMSkKLQl7Ci0JICBhc193YXJuIChfKCJCYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCWNvZmZfdmFsdWUgPSBjb2ZmX3R5cGUuc2l6ZXNbMF07Ci0KLSAgICAgIGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uID0gKGNvZmZfdHlwZS5vcmlnX3R5cGUgPT0gVF9FTlVNKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBGb3IgdGhlIGVuZCBvZiBzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBlbnVtZXJhdGlvbnMsIG9taXQgdGhlCi0JIG5hbWUgd2hpY2ggaXMgYWx3YXlzICIuZW9zIi4gIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBsYXN0LCBzbwotCSB0aGF0IGFueSBlcnJvciByZXBvcnRpbmcgYWJvdmUgZ2l2ZXMgdGhlIGNvcnJlY3QgbmFtZS4gICovCi0gICAgY2FzZSBzdF9FbmQ6Ci0gICAgICBmcmVlIChuYW1lKTsKLSAgICAgIG5hbWUgPSAoY2hhciAqKSBOVUxMOwotICAgICAgY29mZl92YWx1ZSA9IDA7Ci0gICAgICBjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbiA9IDA7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogTWVtYmVycyBvZiBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMgdGhhdCBhcmVuJ3QgYml0ZmllbGRzLCBuZWVkCi0JIHRvIGFkanVzdCB0aGUgdmFsdWUgZnJvbSBhIGJ5dGUgb2Zmc2V0IHRvIGEgYml0IG9mZnNldC4KLQkgTWVtYmVycyBvZiBlbnVtZXJhdGlvbnMgZG8gbm90IGhhdmUgdGhlIHZhbHVlIGFkanVzdGVkLCBhbmQKLQkgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgYnkgaW5keCA9PSBpbmRleE5pbC4gIEZvciBlbnVtZXJhdGlvbnMsCi0JIHVwZGF0ZSB0aGUgbWF4aW11bSBlbnVtZXJhdGlvbiB2YWx1ZS4gICovCi0gICAgY2FzZSBzdF9NZW1iZXI6Ci0gICAgICBpZiAoISBjb2ZmX3R5cGUuYml0ZmllbGQgJiYgISBjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbikKLQljb2ZmX3ZhbHVlICo9IDg7Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBBZGQgdGhlIHN5bWJvbC4gICovCi0gIHN5bSA9IGFkZF9lY29mZl9zeW1ib2wgKG5hbWUsCi0JCQkgIGNvZmZfc3ltYm9sX3R5cCwKLQkJCSAgY29mZl9zdG9yYWdlX2NsYXNzLAotCQkJICBjb2ZmX3N5bV92YWx1ZSwKLQkJCSAgY29mZl9zeW1fYWRkZW5kLAotCQkJICAoc3ltaW50X3QpIGNvZmZfdmFsdWUsCi0JCQkgIGluZHgpOwotCi0gIC8qIGRlYWwgd2l0aCBzdHJ1Y3QsIHVuaW9uLCBhbmQgZW51bSB0YWdzLiAgKi8KLSAgaWYgKGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9CbG9jaykKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgb3IgdXBkYXRlIHRoZSB0YWcgaW5mb3JtYXRpb24uICAqLwotICAgICAgdGFnX3QgKnRhZ19wdHIgPSBnZXRfdGFnIChuYW1lLAotCQkJCXN5bSwKLQkJCQljb2ZmX3R5cGUuYmFzaWNfdHlwZSk7Ci0gICAgICBmb3J3YXJkX3QgKipwZjsKLQotICAgICAgLyogUmVtZW1iZXIgYW55IGZvcndhcmQgcmVmZXJlbmNlcy4gICovCi0gICAgICBmb3IgKHBmID0gJnN5bS0+Zm9yd2FyZF9yZWY7Ci0JICAgKnBmICE9IChmb3J3YXJkX3QgKikgTlVMTDsKLQkgICBwZiA9ICYoKnBmKS0+bmV4dCkKLQk7Ci0gICAgICAqcGYgPSB0YWdfcHRyLT5mb3J3YXJkX3JlZjsKLSAgICAgIHRhZ19wdHItPmZvcndhcmRfcmVmID0gKGZvcndhcmRfdCAqKSBOVUxMOwotICAgIH0KLX0KLQwKLS8qIFBhcnNlIC5lbmQgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9lbmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLSAgcmVnaXN0ZXIgaW50IGNoOwotICBzeW1ib2xTICplbnQ7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBjaCA9ICpuYW1lOwotICBpZiAoISBpc19uYW1lX2JlZ2lubmVyIChjaCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiKSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgdmFsdWUgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIC5lbmQgZGlyZWN0aXZlIGFuZCB0aGUKLSAgICAgY29ycmVzcG9uZGluZyBzeW1ib2wuICBXZSBjcmVhdGUgYSBmYWtlIHN5bWJvbCB0byBob2xkIHRoZQotICAgICBjdXJyZW50IGxvY2F0aW9uLCBhbmQgcHV0IGluIHRoZSBvZmZzZXQgd2hlbiB3ZSB3cml0ZSBvdXQgdGhlCi0gICAgIHN5bWJvbC4gICovCi0gIGVudCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgaWYgKGVudCA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIG5hbWVzIHVua25vd24gc3ltYm9sIikpOwotICBlbHNlCi0gICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X0VuZCwgc2NfVGV4dCwKLQkJCSAgICAgc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsCi0JCQkJCSAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkJCSBmcmFnX25vdyksCi0JCQkgICAgIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIDAsIChzeW1pbnRfdCkgMCk7Ci0KLSAgY3VyX3Byb2NfcHRyID0gKHByb2NfdCAqKSBOVUxMOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5lbnQgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9lbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLSAgcmVnaXN0ZXIgaW50IGNoOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKLQotICBpZiAoY3VyX3Byb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJzZWNvbmQgLmVudCBkaXJlY3RpdmUgZm91bmQgYmVmb3JlIC5lbmQgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBjaCA9ICpuYW1lOwotICBpZiAoISBpc19uYW1lX2JlZ2lubmVyIChjaCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVudCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiKSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhZGRfcHJvY2VkdXJlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgLyogVGhlIC5lbnQgZGlyZWN0aXZlIGlzIHNvbWV0aW1lcyBmb2xsb3dlZCBieSBhIG51bWJlci4gIEknbSBub3QKLSAgICAgcmVhbGx5IHN1cmUgd2hhdCB0aGUgbnVtYmVyIG1lYW5zLiAgSSBkb24ndCBzZWUgYW55IHdheSB0byBzdG9yZQotICAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIFBEUi4gIFRoZSBJcml4IDQgYXNzZW1ibGVyIHNlZW1zIHRvIGlnbm9yZQotICAgICB0aGUgaW5mb3JtYXRpb24uICAqLwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmV4dGVybiBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2V4dGVybiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9scDsKLSAgdmFsdWVUIHNpemU7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xwID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xwKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBzeW1ib2xfZ2V0X29iaiAoc3ltYm9scCktPmVjb2ZmX2V4dGVybl9zaXplID0gc2l6ZTsKLX0KLQwKLS8qIFBhcnNlIC5maWxlIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZmlsZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgaW5keDsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGxlbjsKLQotICBpZiAoY3VyX3Byb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJObyB3YXkgdG8gaGFuZGxlIC5maWxlIHdpdGhpbiAuZW50Ly5lbmQgc2VjdGlvbiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluZHggPSAoaW50KSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAvKiBGSVhNRTogd2UgZG9uJ3QgaGF2ZSB0byBzYXZlIHRoZSBuYW1lIGhlcmUuICAqLwotICBuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotCi0gIGFkZF9maWxlIChuYW1lLCBpbmR4IC0gMSwgMCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5mbWFzayBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2ZtYXNrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5mbWFzayBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZtYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZnJlZ21hc2sgPSB2YWw7Ci0gIGN1cl9wcm9jX3B0ci0+cGRyLmZyZWdvZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmZyYW1lIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZnJhbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmZyYW1lIG91dHNpZGUgb2YgLmVudCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmZyYW1lcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnCi0gICAgICB8fCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5mcmFtZW9mZnNldCA9IHZhbDsKLQotICBjdXJfcHJvY19wdHItPnBkci5wY3JlZyA9IHRjX2dldF9yZWdpc3RlciAoMCk7Ci0KLSNpZiAwIC8qIEFscGhhLU9TRjEgYWRkcyAidGhlIG9mZnNldCBvZiBzYXZlZCAkYTAgZnJvbSAkc3AiLCBhY2NvcmRpbmcKLQkgdG8gU2FuZHJvLiAgSSBkb24ndCB5ZXQga25vdyB3aGVyZSB0aGlzIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQsIGlmCi0JIGFueXdoZXJlLiAgKi8KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSNlbHNlCi0gIHNfaWdub3JlICg0Mik7Ci0jZW5kaWYKLX0KLQwKLS8qIFBhcnNlIC5tYXNrIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfbWFzayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubWFzayBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLm1hc2sgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5yZWdtYXNrID0gdmFsOwotICBjdXJfcHJvY19wdHItPnBkci5yZWdvZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmxvYyBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2xvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsaW5lbm9fbGlzdF90ICpsaXN0OwotICBzeW1pbnRfdCBsaW5lbm87Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxvYyBiZWZvcmUgLmZpbGUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAobm93X3NlZyAhPSB0ZXh0X3NlY3Rpb24pCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxvYyBvdXRzaWRlIG9mIC50ZXh0IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogU2tpcCB0aGUgZmlsZSBudW1iZXIuICAqLwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgbGluZW5vID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBpZiAobGlzdGluZykKLSAgICBsaXN0aW5nX3NvdXJjZV9saW5lIChsaW5lbm8pOwotI2VuZGlmCi0KLSAgLyogSWYgd2UncmUgYnVpbGRpbmcgc3RhYnMsIHRoZW4gb3V0cHV0IGEgc3BlY2lhbCBsYWJlbCByYXRoZXIgdGhhbgotICAgICBFQ09GRiBsaW5lIG51bWJlciBpbmZvLiAgKi8KLSAgaWYgKHN0YWJzX3NlZW4pCi0gICAgewotICAgICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjaGFyICopIE5VTEwsIHN0X0xhYmVsLCBzY19UZXh0LAotCQkJICAgICAgIHN5bWJvbF9uZXcgKCJMMFwwMDEiLCBub3dfc2VnLAotCQkJCQkgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkJCSAgIGZyYWdfbm93KSwKLQkJCSAgICAgICAoYmZkX3ZtYSkgMCwgMCwgbGluZW5vKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbGlzdCA9IGFsbG9jYXRlX2xpbmVub19saXN0ICgpOwotCi0gIGxpc3QtPm5leHQgPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotICBsaXN0LT5maWxlID0gY3VyX2ZpbGVfcHRyOwotICBsaXN0LT5wcm9jID0gY3VyX3Byb2NfcHRyOwotICBsaXN0LT5mcmFnID0gZnJhZ19ub3c7Ci0gIGxpc3QtPnBhZGRyID0gZnJhZ19ub3dfZml4ICgpOwotICBsaXN0LT5saW5lbm8gPSBsaW5lbm87Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBtZXJnZSBmaWxlcyB3aGljaCBoYXZlIGxpbmUgbnVtYmVycy4gICovCi0gIGN1cl9maWxlX3B0ci0+ZmRyLmZNZXJnZSA9IDA7Ci0KLSAgLyogQSAubG9jIGRpcmVjdGl2ZSB3aWxsIHNvbWV0aW1lcyBhcHBlYXIgYmVmb3JlIGEgLmVudCBkaXJlY3RpdmUsCi0gICAgIHdoaWNoIG1lYW5zIHRoYXQgY3VyX3Byb2NfcHRyIHdpbGwgYmUgTlVMTCBoZXJlLiAgQXJyYW5nZSB0bwotICAgICBwYXRjaCB0aGlzIHVwLiAgKi8KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgbGluZW5vX2xpc3RfdCAqKnBsOwotCi0gICAgICBwbCA9ICZub3Byb2NfbGluZW5vOwotICAgICAgd2hpbGUgKCpwbCAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotCXBsID0gJigqcGwpLT5uZXh0OwotICAgICAgKnBsID0gbGlzdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0X2xpbmVubyA9IGxpc3Q7Ci0gICAgICAqbGFzdF9saW5lbm9fcHRyID0gbGlzdDsKLSAgICAgIGxhc3RfbGluZW5vX3B0ciA9ICZsaXN0LT5uZXh0OwotICAgIH0KLX0KLQotLyogVGhlIE1JUFMgYXNzZW1ibGVyIHNvbWV0aW1lcyBpbnNlcnRzIG5vcCBpbnN0cnVjdGlvbnMgaW4gdGhlCi0gICBpbnN0cnVjdGlvbiBzdHJlYW0uICBXaGVuIHRoaXMgaGFwcGVucywgd2UgbXVzdCBwYXRjaCB1cCB0aGUgLmxvYwotICAgaW5mb3JtYXRpb24gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGluc3RydWN0aW9uIGFmdGVyIHRoZSBub3AuICAqLwotCi12b2lkCi1lY29mZl9maXhfbG9jIChvbGRfZnJhZywgb2xkX2ZyYWdfb2Zmc2V0KQotICAgICBmcmFnUyAqb2xkX2ZyYWc7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2xkX2ZyYWdfb2Zmc2V0OwotewotICBpZiAobGFzdF9saW5lbm8gIT0gTlVMTAotICAgICAgJiYgbGFzdF9saW5lbm8tPmZyYWcgPT0gb2xkX2ZyYWcKLSAgICAgICYmIGxhc3RfbGluZW5vLT5wYWRkciA9PSBvbGRfZnJhZ19vZmZzZXQpCi0gICAgewotICAgICAgbGFzdF9saW5lbm8tPmZyYWcgPSBmcmFnX25vdzsKLSAgICAgIGxhc3RfbGluZW5vLT5wYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgICB9Ci19Ci0MCi0vKiBNYWtlIHN1cmUgdGhlIEBzdGFicyBzeW1ib2wgaXMgZW1pdHRlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1tYXJrX3N0YWJzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICghIHN0YWJzX3NlZW4pCi0gICAgewotICAgICAgLyogQWRkIGEgZHVtbXkgQHN0YWJzIGR5bWJvbC4gKi8KLSAgICAgIHN0YWJzX3NlZW4gPSAxOwotICAgICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKHN0YWJzX3N5bWJvbCwgc3ROaWwsIHNjSW5mbywKLQkJCSAgICAgICAoc3ltYm9sUyAqKSBOVUxMLAotCQkJICAgICAgIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIC0xLAotCQkJICAgICAgIEVDT0ZGX01BUktfU1RBQiAoMCkpOwotICAgIH0KLX0KLQwKLS8qIFBhcnNlIC53ZWFrZXh0IGRpcmVjdGl2ZXMuICAqLwotI2lmbmRlZiBUQ19NSVBTCi0vKiBGb3IgVENfTUlQUyB1c2UgdGhlIHZlcnNpb24gaW4gdGMtbWlwcy5jLiAqLwotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQl7Ci0JICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JCSAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCXsKLQkgIGV4cHJlc3Npb24gKCZleHApOwotCSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgLndlYWtleHQgZGlyZWN0aXZlIikpOwotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltYm9sUCwgJmV4cCk7Ci0JfQotICAgIH0KLQotICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotI2VuZGlmIC8qIG5vdCBUQ19NSVBTICovCi0MCi0vKiBIYW5kbGUgLnN0YWJzIGRpcmVjdGl2ZXMuICBUaGUgYWN0dWFsIHBhcnNpbmcgcm91dGluZSBpcyBkb25lIGJ5IGEKLSAgIGdlbmVyaWMgcm91dGluZS4gIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdmlhIE9CSl9QUk9DRVNTX1NUQUIuCi0gICBXaGVuIHRoaXMgaXMgY2FsbGVkLCBpbnB1dF9saW5lX3BvaW50ZXIgd2lsbCBiZSBwb2ludGluZyBhdCB0aGUKLSAgIHZhbHVlIGZpZWxkIG9mIHRoZSBzdGFiLgotCi0gICAuc3RhYnMgZGlyZWN0aXZlcyBoYXZlIGZpdmUgZmllbGRzOgotCSJzdHJpbmciCWEgc3RyaW5nLCBlbmNvZGluZyB0aGUgdHlwZSBpbmZvcm1hdGlvbi4KLQljb2RlCQlhIG51bWVyaWMgY29kZSwgZGVmaW5lZCBpbiA8c3RhYi5oPgotCTAJCWEgemVybwotCWRlc2MJCWEgemVybyBvciBsaW5lIG51bWJlcgotCXZhbHVlCQlhIG51bWVyaWMgdmFsdWUgb3IgYW4gYWRkcmVzcy4KLQotICAgIElmIHRoZSB2YWx1ZSBpcyByZWxvY2F0YWJsZSwgd2UgdHJhbnNmb3JtIHRoaXMgaW50bzoKLQlpc3MJCXBvaW50cyBhcyBhbiBpbmRleCBpbnRvIHN0cmluZyBzcGFjZQotCXZhbHVlCQl2YWx1ZSBmcm9tIGxvb2t1cCBvZiB0aGUgbmFtZQotCXN0CQlzdCBmcm9tIGxvb2t1cCBvZiB0aGUgbmFtZQotCXNjCQlzYyBmcm9tIGxvb2t1cCBvZiB0aGUgbmFtZQotCWluZGV4CQljb2RlfENPREVfTUFTSwotCi0gICAgSWYgdGhlIHZhbHVlIGlzIG5vdCByZWxvY2F0YWJsZSwgd2UgdHJhbnNmb3JtIHRoaXMgaW50bzoKLQlpc3MJCXBvaW50cyBhcyBhbiBpbmRleCBpbnRvIHN0cmluZyBzcGFjZQotCXZhbHVlCQl2YWx1ZQotCXN0CQlzdF9OaWwKLQlzYwkJc2NfTmlsCi0JaW5kZXgJCWNvZGV8Q09ERV9NQVNLCi0KLSAgICAuc3RhYm4gZGlyZWN0aXZlcyBoYXZlIGZvdXIgZmllbGRzIChzdHJpbmcgaXMgbnVsbCk6Ci0JY29kZQkJYSBudW1lcmljIGNvZGUsIGRlZmluZWQgaW4gPHN0YWIuaD4KLQkwCQlhIHplcm8KLQlkZXNjCQlhIHplcm8gb3IgYSBsaW5lIG51bWJlcgotCXZhbHVlCQlhIG51bWVyaWMgdmFsdWUgb3IgYW4gYWRkcmVzcy4gICovCi0KLXZvaWQKLWVjb2ZmX3N0YWIgKHNlYywgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGludCB3aGF0OwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgb3RoZXI7Ci0gICAgIGludCBkZXNjOwotewotICBlZmRyX3QgKnNhdmVfZmlsZV9wdHIgPSBjdXJfZmlsZV9wdHI7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgc3ltaW50X3QgdmFsdWU7Ci0gIGJmZF92bWEgYWRkZW5kOwotICBzdF90IHN0OwotICBzY190IHNjOwotICBzeW1pbnRfdCBpbmR4OwotICBsb2NhbHN5bV90ICpob2xkID0gTlVMTDsKLQotICBlY29mZl9kZWJ1Z2dpbmdfc2VlbiA9IDE7Ci0KLSAgLyogV2UgZG9uJ3QgaGFuZGxlIC5zdGFiZC4gICovCi0gIGlmICh3aGF0ICE9ICdzJyAmJiB3aGF0ICE9ICduJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5zdGFiJWMgaXMgbm90IHN1cHBvcnRlZCIpLCB3aGF0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogQSAuc3RhYm4gdXNlcyBhIG51bGwgbmFtZSwgbm90IGFuIGVtcHR5IHN0cmluZy4gICovCi0gIGlmICh3aGF0ID09ICduJykKLSAgICBzdHJpbmcgPSBOVUxMOwotCi0gIC8qIFdlIGlnbm9yZSB0aGUgb3RoZXIgZmllbGQuICAqLwotICBpZiAob3RoZXIgIT0gMCkKLSAgICBhc193YXJuIChfKCIuc3RhYiVjOiBpZ25vcmluZyBub24temVybyBvdGhlciBmaWVsZCIpLCB3aGF0KTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGN1cnJlbnQgZmlsZS4gICovCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKLSAgICAgIHNhdmVfZmlsZV9wdHIgPSBjdXJfZmlsZV9wdHI7Ci0gICAgfQotCi0gIC8qIEZvciBzdGFicyBpbiBFQ09GRiwgdGhlIGZpcnN0IHN5bWJvbCBtdXN0IGJlIEBzdGFicy4gIFRoaXMgaXMgYQotICAgICBzaWduYWwgdG8gZ2RiLiAgKi8KLSAgaWYgKHN0YWJzX3NlZW4gPT0gMCkKLSAgICBtYXJrX3N0YWJzICgwKTsKLQotICAvKiBMaW5lIG51bWJlciBzdGFicyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgc2luY2UgdGhleSBoYXZlIHR3bwotICAgICB2YWx1ZXMsIHRoZSBsaW5lIG51bWJlciBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhYmVsLiAgV2UgdXNlIHRoZQotICAgICBpbmRleCBmaWVsZCAoYWthIGRlc2MpIHRvIGhvbGQgdGhlIGxpbmUgbnVtYmVyLCBhbmQgdGhlIHZhbHVlCi0gICAgIGZpZWxkIHRvIGhvbGQgdGhlIGFkZHJlc3MuICBUaGUgc3ltYm9sIHR5cGUgaXMgc3RfTGFiZWwsIHdoaWNoCi0gICAgIHNob3VsZCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgc3RhYnMsIHNvIHRoYXQgZ2RiIGNhbgotICAgICByZWNvZ25pemUgaXQuICAqLwotICBpZiAodHlwZSA9PSBOX1NMSU5FKQotICAgIHsKLSAgICAgIFNZTVIgZHVtbXlfc3ltcjsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIG5hbWVfZW5kOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIGlmIChsaXN0aW5nKQotCWxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGRlc2MpOwotI2VuZGlmCi0KLSAgICAgIGR1bW15X3N5bXIuaW5kZXggPSBkZXNjOwotICAgICAgaWYgKGR1bW15X3N5bXIuaW5kZXggIT0gZGVzYykKLQl7Ci0JICBhc193YXJuIChfKCJMaW5lIG51bWJlciAoJWQpIGZvciAuc3RhYiVjIGRpcmVjdGl2ZSBjYW5ub3QgZml0IGluIGluZGV4IGZpZWxkICgyMCBiaXRzKSIpLAotCQkgICBkZXNjLCB3aGF0KTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAgICAgdmFsdWUgPSAwOwotICAgICAgYWRkZW5kID0gMDsKLSAgICAgIHN0ID0gc3RfTGFiZWw7Ci0gICAgICBzYyA9IHNjX1RleHQ7Ci0gICAgICBpbmR4ID0gZGVzYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIGlmIChsaXN0aW5nICYmICh0eXBlID09IE5fU08gfHwgdHlwZSA9PSBOX1NPTCkpCi0JbGlzdGluZ19zb3VyY2VfZmlsZSAoc3RyaW5nKTsKLSNlbmRpZgotCi0gICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpCi0JICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICctJwotCSAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKycpCi0JewotCSAgc3QgPSBzdF9OaWw7Ci0JICBzYyA9IHNjX05pbDsKLQkgIHN5bSA9IChzeW1ib2xTICopIE5VTEw7Ci0JICB2YWx1ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgYWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICBhc193YXJuIChfKCJJbGxlZ2FsIC5zdGFiJWMgZGlyZWN0aXZlLCBiYWQgY2hhcmFjdGVyIiksIHdoYXQpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByZXNzaW9uUyBleHA7Ci0KLQkgIHNjID0gc2NfTmlsOwotCSAgc3QgPSBzdF9OaWw7Ci0KLQkgIGV4cHJlc3Npb24gKCZleHApOwotCSAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBzeW0gPSBOVUxMOwotCSAgICAgIHZhbHVlID0gZXhwLlhfYWRkX251bWJlcjsKLQkgICAgICBhZGRlbmQgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbCkKLQkgICAgewotCSAgICAgIHN5bSA9IGV4cC5YX2FkZF9zeW1ib2w7Ci0JICAgICAgdmFsdWUgPSAwOwotCSAgICAgIGFkZGVuZCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZleHApOwotCSAgICAgIHZhbHVlID0gMDsKLQkgICAgICBhZGRlbmQgPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpbmR4ID0gRUNPRkZfTUFSS19TVEFCICh0eXBlKTsKLSAgICB9Ci0KLSAgLyogRG9uJ3Qgc3RvcmUgdGhlIHN0YWJzIHN5bWJvbCB3ZSBhcmUgY3JlYXRpbmcgYXMgdGhlIHR5cGUgb2YgdGhlCi0gICAgIEVDT0ZGIHN5bWJvbC4gIFdlIHdhbnQgdG8gY29tcHV0ZSB0aGUgdHlwZSBvZiB0aGUgRUNPRkYgc3ltYm9sCi0gICAgIGluZGVwZW5kZW50bHkuICAqLwotICBpZiAoc3ltICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgaG9sZCA9IHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2w7Ci0KLSAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKHN0cmluZywgc3QsIHNjLCBzeW0sIGFkZGVuZCwgdmFsdWUsIGluZHgpOwotCi0gIGlmIChzeW0gIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sID0gaG9sZDsKLQotICAvKiBSZXN0b3JlIG5vcm1hbCBmaWxlIHR5cGUuICAqLwotICBjdXJfZmlsZV9wdHIgPSBzYXZlX2ZpbGVfcHRyOwotfQotDAotLyogRnJvYiBhbiBFQ09GRiBzeW1ib2wuICBTbWFsbCBjb21tb24gc3ltYm9scyBnbyBpbnRvIGEgc3BlY2lhbAotICAgLnNjb21tb24gc2VjdGlvbiByYXRoZXIgdGhhbiBiZmRfY29tX3NlY3Rpb24uICAqLwotCi12b2lkCi1lY29mZl9mcm9iX3N5bWJvbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChTX0lTX0NPTU1PTiAoc3ltKQotICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPiAwCi0gICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCi0gICAgewotICAgICAgc3RhdGljIGFzZWN0aW9uIHNjb21fc2VjdGlvbjsKLSAgICAgIHN0YXRpYyBhc3ltYm9sIHNjb21fc3ltYm9sOwotCi0gICAgICAvKiBXZSBtdXN0IGNvbnN0cnVjdCBhIGZha2Ugc2VjdGlvbiBzaW1pbGFyIHRvIGJmZF9jb21fc2VjdGlvbgotCSBidXQgd2l0aCB0aGUgbmFtZSAuc2NvbW1vbi4gICovCi0gICAgICBpZiAoc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICBzY29tX3NlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb247Ci0JICBzY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBzY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmc2NvbV9zZWN0aW9uOwotCSAgc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZzY29tX3N5bWJvbDsKLQkgIHNjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZzY29tX3NlY3Rpb24uc3ltYm9sOwotCSAgc2NvbV9zeW1ib2wgPSAqYmZkX2NvbV9zZWN0aW9uLnN5bWJvbDsKLQkgIHNjb21fc3ltYm9sLm5hbWUgPSAiLnNjb21tb24iOwotCSAgc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZzY29tX3NlY3Rpb247Ci0JfQotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCAmc2NvbV9zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogRG91YmxlIGNoZWNrIHdlYWsgc3ltYm9scy4gICovCi0gIGlmIChTX0lTX1dFQUsgKHN5bSkpCi0gICAgewotICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW0pKQotCWFzX2JhZCAoXygiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIpLAotCQlTX0dFVF9OQU1FIChzeW0pKTsKLSAgICB9Ci19Ci0MCi0vKiBBZGQgYnl0ZXMgdG8gdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGJ1ZmZlci4gICovCi0KLXN0YXRpYyBjaGFyICoKLWVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgbmVlZCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgY2hhciAqYnVmcHRyOwotICAgICB1bnNpZ25lZCBsb25nIG5lZWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgYXQ7Ci0gIHVuc2lnbmVkIGxvbmcgd2FudDsKLQotICBhdCA9IGJ1ZnB0ciAtICpidWY7Ci0gIG5lZWQgLT0gKmJ1ZmVuZCAtIGJ1ZnB0cjsKLSAgaWYgKG5lZWQgPCBQQUdFX1NJWkUpCi0gICAgbmVlZCA9IFBBR0VfU0laRTsKLSAgd2FudCA9ICgqYnVmZW5kIC0gKmJ1ZikgKyBuZWVkOwotICAqYnVmID0geHJlYWxsb2MgKCpidWYsIHdhbnQpOwotICAqYnVmZW5kID0gKmJ1ZiArIHdhbnQ7Ci0gIHJldHVybiAqYnVmICsgYXQ7Ci19Ci0KLS8qIEFkanVzdCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gYnVmZmVyIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQKLSAgIGZvciB0aGUgRUNPRkYgdGFyZ2V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCwgYnVmcHRycHRyKQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIGNoYXIgKipidWZwdHJwdHI7Ci17Ci0gIGJmZF9zaXplX3R5cGUgYWxpZ247Ci0KLSAgYWxpZ24gPSBiYWNrZW5kLT5kZWJ1Z19hbGlnbjsKLSAgaWYgKChvZmZzZXQgJiAoYWxpZ24gLSAxKSkgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGFkZDsKLQotICAgICAgYWRkID0gYWxpZ24gLSAob2Zmc2V0ICYgKGFsaWduIC0gMSkpOwotICAgICAgaWYgKCpidWZlbmQgLSAoKmJ1ZiArIG9mZnNldCkgPCBhZGQpCi0JKHZvaWQpIGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsICpidWYgKyBvZmZzZXQsIGFkZCk7Ci0gICAgICBtZW1zZXQgKCpidWYgKyBvZmZzZXQsIDAsIGFkZCk7Ci0gICAgICBvZmZzZXQgKz0gYWRkOwotICAgICAgaWYgKGJ1ZnB0cnB0ciAhPSAoY2hhciAqKikgTlVMTCkKLQkqYnVmcHRycHRyID0gKmJ1ZiArIG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotLyogQnVpbGQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX2xpbmVubyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCwgbGluZWNudHB0cikKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICBsb25nICpsaW5lY250cHRyOwotewotICBjaGFyICpidWZwdHI7Ci0gIHJlZ2lzdGVyIGxpbmVub19saXN0X3QgKmw7Ci0gIGxpbmVub19saXN0X3QgKmxhc3Q7Ci0gIGVmZHJfdCAqZmlsZTsKLSAgcHJvY190ICpwcm9jOwotICB1bnNpZ25lZCBsb25nIGM7Ci0gIGxvbmcgaWxpbmU7Ci0gIGxvbmcgdG90Y291bnQ7Ci0gIGxpbmVub19saXN0X3QgZmlyc3Q7Ci0gIGxpbmVub19saXN0X3QgKmxvY2FsX2ZpcnN0X2xpbmVubyA9IGZpcnN0X2xpbmVubzsKLQotICBpZiAobGluZWNudHB0ciAhPSAobG9uZyAqKSBOVUxMKQotICAgICpsaW5lY250cHRyID0gMDsKLQotICBidWZwdHIgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGZpbGUgPSAoZWZkcl90ICopIE5VTEw7Ci0gIHByb2MgPSAocHJvY190ICopIE5VTEw7Ci0gIGxhc3QgPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotICBjID0gb2Zmc2V0OwotICBpbGluZSA9IDA7Ci0gIHRvdGNvdW50ID0gMDsKLQotICAvKiBGb3Igc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByb2NlZHVyZSBpcyBpZ25vcmVkCi0gICAgIHdoZW4gcmVhZGluZyBsaW5lIG51bWJlcnMuICBUaGlzIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBmaXJzdCBwcm9jZWR1cmUgaXMgMCwgYnV0IHdoZW4gZ2NjIGlzIGdlbmVyYXRpbmcgTUlQUwotICAgICBlbWJlZGRlZCBQSUMgY29kZSwgaXQgd2lsbCBwdXQgc3RyaW5ncyBpbiB0aGUgLnRleHQgc2VjdGlvbgotICAgICBiZWZvcmUgdGhlIGZpcnN0IHByb2NlZHVyZS4gIFdlIGNvcGUgYnkgaW5zZXJ0aW5nIGEgZHVtbXkgbGluZSBpZgotICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcHJvY2VkdXJlIGlzIG5vdCAwLiAgSG9wZWZ1bGx5IHRoaXMKLSAgICAgd29uJ3Qgc2NyZXcgdGhpbmdzIHVwIHRvbyBiYWRseS4gIAotCi0gICAgIERvbid0IGRvIHRoaXMgZm9yIEVDT0ZGIGFzc2VtYmx5IHNvdXJjZSBsaW5lIG51bWJlcnMuICBUaGV5IHdvcmsKLSAgICAgd2l0aG91dCB0aGlzIGV4dHJhIGF0dGVudGlvbi4gICovCi0gIGlmIChkZWJ1Z190eXBlICE9IERFQlVHX0VDT0ZGCi0gICAgICAmJiBmaXJzdF9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwKLSAgICAgICYmIGxvY2FsX2ZpcnN0X2xpbmVubyAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMCi0gICAgICAmJiAoKFNfR0VUX1ZBTFVFIChmaXJzdF9wcm9jX3B0ci0+c3ltLT5hc19zeW0pCi0JICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsCi0JCQkJICBTX0dFVF9TRUdNRU5UIChmaXJzdF9wcm9jX3B0ci0+c3ltLT5hc19zeW0pKSkKLQkgICE9IDApKQotICAgIHsKLSAgICAgIGZpcnN0LmZpbGUgPSBsb2NhbF9maXJzdF9saW5lbm8tPmZpbGU7Ci0gICAgICBmaXJzdC5wcm9jID0gbG9jYWxfZmlyc3RfbGluZW5vLT5wcm9jOwotICAgICAgZmlyc3QuZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgICAgIGZpcnN0LnBhZGRyID0gMDsKLSAgICAgIGZpcnN0LmxpbmVubyA9IDA7Ci0KLSAgICAgIGZpcnN0Lm5leHQgPSBsb2NhbF9maXJzdF9saW5lbm87Ci0gICAgICBsb2NhbF9maXJzdF9saW5lbm8gPSAmZmlyc3Q7Ci0gICAgfQotCi0gIGZvciAobCA9IGxvY2FsX2ZpcnN0X2xpbmVubzsgbCAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBsb25nIGNvdW50OwotICAgICAgbG9uZyBkZWx0YTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgdG8gdGhlIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSBuZXh0IGxpbmUgbnVtYmVyCi0JIChpbiB3b3JkcykuICBEbyB0aGlzIGZpcnN0LCBzbyB0aGF0IHdlIGNhbiBza2lwIGFoZWFkIHRvIHRoZQotCSBuZXh0IHVzZWZ1bCBsaW5lIG51bWJlciBlbnRyeS4gICovCi0gICAgICBpZiAobC0+bmV4dCA9PSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotCXsKLQkgIC8qIFdlIHdhbnQgYSBjb3VudCBvZiB6ZXJvLCBidXQgaXQgd2lsbCBiZSBkZWNyZW1lbnRlZAotCSAgICAgYmVmb3JlIGl0IGlzIHVzZWQuICAqLwotCSAgY291bnQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGwtPm5leHQtPmZyYWctPmZyX2FkZHJlc3MgKyBsLT5uZXh0LT5wYWRkcgotCSAgICAgICA+IGwtPmZyYWctPmZyX2FkZHJlc3MgKyBsLT5wYWRkcikKLQl7Ci0JICBjb3VudCA9ICgobC0+bmV4dC0+ZnJhZy0+ZnJfYWRkcmVzcyArIGwtPm5leHQtPnBhZGRyCi0JCSAgICAtIChsLT5mcmFnLT5mcl9hZGRyZXNzICsgbC0+cGFkZHIpKQotCQkgICA+PiAyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRG9uJ3QgY2hhbmdlIGxhc3QsIHNvIHdlIHN0aWxsIGdldCB0aGUgcmlnaHQgZGVsdGEuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAobC0+ZmlsZSAhPSBmaWxlIHx8IGwtPnByb2MgIT0gcHJvYykKLQl7Ci0JICBpZiAobC0+cHJvYyAhPSBwcm9jICYmIHByb2MgIT0gKHByb2NfdCAqKSBOVUxMKQotCSAgICBwcm9jLT5wZHIubG5IaWdoID0gbGFzdC0+bGluZW5vOwotCSAgaWYgKGwtPmZpbGUgIT0gZmlsZSAmJiBmaWxlICE9IChlZmRyX3QgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGZpbGUtPmZkci5jYkxpbmUgPSBjIC0gZmlsZS0+ZmRyLmNiTGluZU9mZnNldDsKLQkgICAgICBmaWxlLT5mZHIuY2xpbmUgPSB0b3Rjb3VudCArIGNvdW50OwotCSAgICAgIGlmIChsaW5lY250cHRyICE9IChsb25nICopIE5VTEwpCi0JCSpsaW5lY250cHRyICs9IHRvdGNvdW50ICsgY291bnQ7Ci0JICAgICAgdG90Y291bnQgPSAwOwotCSAgICB9Ci0KLQkgIGlmIChsLT5maWxlICE9IGZpbGUpCi0JICAgIHsKLQkgICAgICBlZmRyX3QgKmxhc3RfZmlsZSA9IGZpbGU7Ci0KLQkgICAgICBmaWxlID0gbC0+ZmlsZTsKLQkgICAgICBpZiAobGFzdF9maWxlICE9IChlZmRyX3QgKikgTlVMTCkKLQkJZmlsZS0+ZmRyLmlsaW5lQmFzZQotCQkgID0gbGFzdF9maWxlLT5mZHIuaWxpbmVCYXNlICsgbGFzdF9maWxlLT5mZHIuY2xpbmU7Ci0JICAgICAgZWxzZQotCQlmaWxlLT5mZHIuaWxpbmVCYXNlID0gMDsKLQkgICAgICBmaWxlLT5mZHIuY2JMaW5lT2Zmc2V0ID0gYzsKLQkgICAgfQotCSAgaWYgKGwtPnByb2MgIT0gcHJvYykKLQkgICAgewotCSAgICAgIHByb2MgPSBsLT5wcm9jOwotCSAgICAgIGlmIChwcm9jICE9IChwcm9jX3QgKikgTlVMTCkKLQkJewotCQkgIHByb2MtPnBkci5sbkxvdyA9IGwtPmxpbmVubzsKLQkJICBwcm9jLT5wZHIuY2JMaW5lT2Zmc2V0ID0gYyAtIGZpbGUtPmZkci5jYkxpbmVPZmZzZXQ7Ci0JCSAgcHJvYy0+cGRyLmlsaW5lID0gdG90Y291bnQ7Ci0JCX0KLQkgICAgfQotCi0JICBsYXN0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLQl9Ci0KLSAgICAgIHRvdGNvdW50ICs9IGNvdW50OwotCi0gICAgICAvKiBHZXQgdGhlIG9mZnNldCB0byB0aGlzIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChsYXN0ID09IChsaW5lbm9fbGlzdF90ICopIE5VTEwpCi0JZGVsdGEgPSAwOwotICAgICAgZWxzZQotCWRlbHRhID0gbC0+bGluZW5vIC0gbGFzdC0+bGluZW5vOwotCi0gICAgICAvKiBQdXQgaW4gdGhlIG9mZnNldCB0byB0aGlzIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIHdoaWxlIChkZWx0YSAhPSAwKQotCXsKLQkgIGludCBzZXRjb3VudDsKLQotCSAgLyogMSBpcyBhZGRlZCB0byBlYWNoIGNvdW50IHJlYWQuICAqLwotCSAgLS1jb3VudDsKLQkgIC8qIFdlIGNhbiBvbmx5IGFkanVzdCB0aGUgd29yZCBjb3VudCBieSB1cCB0byAxNSB3b3JkcyBhdCBhCi0JICAgICB0aW1lLiAgKi8KLQkgIGlmIChjb3VudCA8PSAweDBmKQotCSAgICB7Ci0JICAgICAgc2V0Y291bnQgPSBjb3VudDsKLQkgICAgICBjb3VudCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNldGNvdW50ID0gMHgwZjsKLQkgICAgICBjb3VudCAtPSAweDBmOwotCSAgICB9Ci0JICBpZiAoZGVsdGEgPj0gLTcgJiYgZGVsdGEgPD0gNykKLQkgICAgewotCSAgICAgIGlmIChidWZwdHIgPj0gKmJ1ZmVuZCkKLQkJYnVmcHRyID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCAobG9uZykgMSk7Ci0JICAgICAgKmJ1ZnB0cisrID0gc2V0Y291bnQgKyAoZGVsdGEgPDwgNCk7Ci0JICAgICAgZGVsdGEgPSAwOwotCSAgICAgICsrYzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IHNldDsKLQotCSAgICAgIGlmICgqYnVmZW5kIC0gYnVmcHRyIDwgMykKLQkJYnVmcHRyID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCAobG9uZykgMyk7Ci0JICAgICAgKmJ1ZnB0cisrID0gc2V0Y291bnQgKyAoOCA8PCA0KTsKLQkgICAgICBpZiAoZGVsdGEgPCAtMHg4MDAwKQotCQl7Ci0JCSAgc2V0ID0gLTB4ODAwMDsKLQkJICBkZWx0YSArPSAweDgwMDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChkZWx0YSA+IDB4N2ZmZikKLQkJewotCQkgIHNldCA9IDB4N2ZmZjsKLQkJICBkZWx0YSAtPSAweDdmZmY7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzZXQgPSBkZWx0YTsKLQkJICBkZWx0YSA9IDA7Ci0JCX0KLQkgICAgICAqYnVmcHRyKysgPSBzZXQgPj4gODsKLQkgICAgICAqYnVmcHRyKysgPSBzZXQgJiAweGZmZmY7Ci0JICAgICAgYyArPSAzOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaW5pc2ggYWRqdXN0aW5nIHRoZSBjb3VudC4gICovCi0gICAgICB3aGlsZSAoY291bnQgPiAwKQotCXsKLQkgIGlmIChidWZwdHIgPj0gKmJ1ZmVuZCkKLQkgICAgYnVmcHRyID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCAobG9uZykgMSk7Ci0JICAvKiAxIGlzIGFkZGVkIHRvIGVhY2ggY291bnQgcmVhZC4gICovCi0JICAtLWNvdW50OwotCSAgaWYgKGNvdW50ID4gMHgwZikKLQkgICAgewotCSAgICAgICpidWZwdHIrKyA9IDB4MGY7Ci0JICAgICAgY291bnQgLT0gMHgwZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKmJ1ZnB0cisrID0gY291bnQ7Ci0JICAgICAgY291bnQgPSAwOwotCSAgICB9Ci0JICArK2M7Ci0JfQotCi0gICAgICArK2lsaW5lOwotICAgICAgbGFzdCA9IGw7Ci0gICAgfQotCi0gIGlmIChwcm9jICE9IChwcm9jX3QgKikgTlVMTCkKLSAgICBwcm9jLT5wZHIubG5IaWdoID0gbGFzdC0+bGluZW5vOwotICBpZiAoZmlsZSAhPSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgZmlsZS0+ZmRyLmNiTGluZSA9IGMgLSBmaWxlLT5mZHIuY2JMaW5lT2Zmc2V0OwotICAgICAgZmlsZS0+ZmRyLmNsaW5lID0gdG90Y291bnQ7Ci0gICAgfQotCi0gIGlmIChsaW5lY250cHRyICE9IChsb25nICopIE5VTEwpCi0gICAgKmxpbmVjbnRwdHIgKz0gdG90Y291bnQ7Ci0KLSAgYyA9IGVjb2ZmX3BhZGRpbmdfYWRqdXN0IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgYywgJmJ1ZnB0cik7Ci0KLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIEJ1aWxkIGFuZCBzd2FwIG91dCB0aGUgc3ltYm9scy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9zeW1ib2xzIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9zeW1fc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpCi0gICAgPSBiYWNrZW5kLT5zd2FwX3N5bV9vdXQ7Ci0gIGNoYXIgKnN5bV9vdXQ7Ci0gIGxvbmcgaXN5bTsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBzeW1fb3V0ID0gKmJ1ZiArIG9mZnNldDsKLQotICBpc3ltID0gMDsKLQotICAvKiBUaGUgc3ltYm9scyBhcmUgc3RvcmVkIGJ5IGZpbGUuICAqLwotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBpZmlsZXN5bTsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICB2bGlua3NfdCAqc3ltX2xpbms7Ci0KLQkgIGZpbF9wdHItPmZkci5pc3ltQmFzZSA9IGlzeW07Ci0JICBpZmlsZXN5bSA9IGlzeW07Ci0JICBmb3IgKHN5bV9saW5rID0gZmlsX3B0ci0+c3ltYm9scy5maXJzdDsKLQkgICAgICAgc3ltX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0JICAgICAgIHN5bV9saW5rID0gc3ltX2xpbmstPm5leHQpCi0JICAgIHsKLQkgICAgICBpbnQgc3ltX2NudDsKLQkgICAgICBsb2NhbHN5bV90ICpzeW1fcHRyOwotCSAgICAgIGxvY2Fsc3ltX3QgKnN5bV9lbmQ7Ci0KLQkgICAgICBpZiAoc3ltX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JCXN5bV9jbnQgPSBmaWxfcHRyLT5zeW1ib2xzLm9iamVjdHNfbGFzdF9wYWdlOwotCSAgICAgIGVsc2UKLQkJc3ltX2NudCA9IGZpbF9wdHItPnN5bWJvbHMub2JqZWN0c19wZXJfcGFnZTsKLQkgICAgICBzeW1fcHRyID0gc3ltX2xpbmstPmRhdHVtLT5zeW07Ci0JICAgICAgc3ltX2VuZCA9IHN5bV9wdHIgKyBzeW1fY250OwotCSAgICAgIGZvciAoOyBzeW1fcHRyIDwgc3ltX2VuZDsgc3ltX3B0cisrKQotCQl7Ci0JCSAgaW50IGxvY2FsOwotCQkgIHN5bWJvbFMgKmFzX3N5bTsKLQkJICBmb3J3YXJkX3QgKmY7Ci0KLQkJICBrbm93IChzeW1fcHRyLT5maWxlX3B0ciA9PSBmaWxfcHRyKTsKLQotCQkgIC8qIElmIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgZ2FzIHN5bWJvbCwgdGhlbiB0aGlzCi0JCSAgICAgaXMgYSBwdXJlIGRlYnVnZ2luZyBzeW1ib2wuICBXZSBoYXZlIGFscmVhZHkKLQkJICAgICBhZGRlZCB0aGUgbmFtZSAoaWYgYW55KSB0byBmaWxfcHRyLT5zdHJpbmdzLgotCQkgICAgIE90aGVyd2lzZSB3ZSBtdXN0IGRlY2lkZSB3aGV0aGVyIHRoaXMgaXMgYW4KLQkJICAgICBleHRlcm5hbCBvciBhIGxvY2FsIHN5bWJvbCAoYWN0dWFsbHksIGl0IG1heSBiZQotCQkgICAgIGJvdGggaWYgdGhlIGxvY2FsIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGVidWdnaW5nCi0JCSAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBleHRlcm5hbCkuICAqLwotCQkgIGxvY2FsID0gMTsKLQkJICBhc19zeW0gPSBzeW1fcHRyLT5hc19zeW07Ci0JCSAgaWYgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCQkgICAgewotCQkgICAgICBzeW1pbnRfdCBpbmR4OwotCi0JCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiBhIGJsb2NrIHN0YXJ0IHN5bWJvbCBpcyB0aGUKLQkJCSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHByb2NlZHVyZS4gIEZvcgotCQkJIG90aGVyIHN5bWJvbHMgd2UganVzdCB1c2UgdGhlIGdhcyB2YWx1ZSAoYnV0Ci0JCQkgd2UgbXVzdCBvZmZzZXQgaXQgYnkgdGhlIHZtYSBvZiB0aGUgc2VjdGlvbiwKLQkJCSBqdXN0IGFzIEJGRCBkb2VzLCBiZWNhdXNlIEJGRCB3aWxsIG5vdCBzZWUKLQkJCSB0aGlzIHZhbHVlKS4gICovCi0JCSAgICAgIGlmIChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSAoaW50KSBzdF9CbG9jawotCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyA9PSAoaW50KSBzY19UZXh0KQotCQkJewotCQkJICBzeW1ib2xTICpiZWdpbl9zeW07Ci0KLQkJCSAga25vdyAoc3ltX3B0ci0+cHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKTsKLQkJCSAgYmVnaW5fc3ltID0gc3ltX3B0ci0+cHJvY19wdHItPnN5bS0+YXNfc3ltOwotCQkJICBpZiAoU19HRVRfU0VHTUVOVCAoYXNfc3ltKQotCQkJICAgICAgIT0gU19HRVRfU0VHTUVOVCAoYmVnaW5fc3ltKSkKLQkJCSAgICBhc193YXJuIChfKCIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOwotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9Ci0JCQkgICAgU19HRVRfVkFMVUUgKGFzX3N5bSkgLSBTX0dFVF9WQUxVRSAoYmVnaW5fc3ltKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQotCQkJICAoU19HRVRfVkFMVUUgKGFzX3N5bSkKLQkJCSAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LAotCQkJCQkJICBTX0dFVF9TRUdNRU5UIChhc19zeW0pKQotCQkJICAgKyBzeW1fcHRyLT5hZGRlbmQpOwotCi0JCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS53ZWFrZXh0ID0gU19JU19XRUFLIChhc19zeW0pOwotCi0JCSAgICAgIC8qIFNldCBzdF9Qcm9jIHRvIHN0X1N0YXRpY1Byb2MgZm9yIGxvY2FsCi0JCQkgZnVuY3Rpb25zLiAgKi8KLQkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X1Byb2MKLQkJCSAgJiYgU19JU19ERUZJTkVEIChhc19zeW0pCi0JCQkgICYmICEgU19JU19FWFRFUk5BTCAoYXNfc3ltKQotCQkJICAmJiAhIFNfSVNfV0VBSyAoYXNfc3ltKSkKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID0gc3RfU3RhdGljUHJvYzsKLQotCQkgICAgICAvKiBHZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UgY2xhc3MgYmFzZWQgb24gd2hlcmUKLQkJCSB0aGUgc3ltYm9sIGFjdHVhbGx5IHdvdW5kIHVwLiAgVHJhZGl0aW9uYWxseSwKLQkJCSBOX0xCUkFDIGFuZCBOX1JCUkFDIGFyZSAqbm90KiByZWxvY2F0ZWQuICovCi0JCSAgICAgIGluZHggPSBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pbmRleDsKLQkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X05pbAotCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyA9PSBzY19OaWwKLQkJCSAgJiYgKCEgRUNPRkZfSVNfU1RBQiAoJnN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltKQotCQkJICAgICAgfHwgKChFQ09GRl9VTk1BUktfU1RBQiAoaW5keCkgIT0gTl9MQlJBQykKLQkJCQkgICYmIChFQ09GRl9VTk1BUktfU1RBQiAoaW5keCkgIT0gTl9SQlJBQykpKSkKLQkJCXsKLQkJCSAgc2VnVCBzZWc7Ci0JCQkgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0JCQkgIHN0X3Qgc3Q7Ci0JCQkgIHNjX3Qgc2M7Ci0KLQkJCSAgc2VnID0gU19HRVRfU0VHTUVOVCAoYXNfc3ltKTsKLQkJCSAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAoc2VnKTsKLQotCQkJICBpZiAoISBFQ09GRl9JU19TVEFCICgmc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0pCi0JCQkgICAgICAmJiAoU19JU19FWFRFUk5BTCAoYXNfc3ltKQotCQkJCSAgfHwgU19JU19XRUFLIChhc19zeW0pCi0JCQkJICB8fCAhIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkpCi0JCQkgICAgewotCQkJICAgICAgaWYgKChzeW1ib2xfZ2V0X2JmZHN5bSAoYXNfc3ltKS0+ZmxhZ3MKLQkJCQkgICAmIEJTRl9GVU5DVElPTikgIT0gMCkKLQkJCQlzdCA9IHN0X1Byb2M7Ci0JCQkgICAgICBlbHNlCi0JCQkJc3QgPSBzdF9HbG9iYWw7Ci0JCQkgICAgfQotCQkJICBlbHNlIGlmIChzZWcgPT0gdGV4dF9zZWN0aW9uKQotCQkJICAgIHN0ID0gc3RfTGFiZWw7Ci0JCQkgIGVsc2UKLQkJCSAgICBzdCA9IHN0X1N0YXRpYzsKLQotCQkJICBpZiAoISBTX0lTX0RFRklORUQgKGFzX3N5bSkpCi0JCQkgICAgewotCQkJICAgICAgdmFsdWVUIHM7Ci0KLQkJCSAgICAgIHMgPSBzeW1ib2xfZ2V0X29iaiAoYXNfc3ltKS0+ZWNvZmZfZXh0ZXJuX3NpemU7Ci0JCQkgICAgICBpZiAocyA9PSAwCi0JCQkJICB8fCBzID4gYmZkX2dldF9ncF9zaXplIChzdGRvdXRwdXQpKQotCQkJCXNjID0gc2NfVW5kZWZpbmVkOwotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIHNjID0gc2NfU1VuZGVmaW5lZDsKLQkJCQkgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0gczsKLQkJCQl9Ci0jaWZkZWYgU19TRVRfU0laRQotCQkJICAgICAgU19TRVRfU0laRSAoYXNfc3ltLCBzKTsKLSNlbmRpZgotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoU19JU19DT01NT04gKGFzX3N5bSkpCi0JCQkgICAgewotCQkJICAgICAgaWYgKFNfR0VUX1ZBTFVFIChhc19zeW0pID4gMAotCQkJCSAgJiYgKFNfR0VUX1ZBTFVFIChhc19zeW0pCi0JCQkJICAgICAgPD0gYmZkX2dldF9ncF9zaXplIChzdGRvdXRwdXQpKSkKLQkJCQlzYyA9IHNjX1NDb21tb247Ci0JCQkgICAgICBlbHNlCi0JCQkJc2MgPSBzY19Db21tb247Ci0JCQkgICAgfQotCQkJICBlbHNlIGlmIChzZWcgPT0gdGV4dF9zZWN0aW9uKQotCQkJICAgIHNjID0gc2NfVGV4dDsKLQkJCSAgZWxzZSBpZiAoc2VnID09IGRhdGFfc2VjdGlvbikKLQkJCSAgICBzYyA9IHNjX0RhdGE7Ci0JCQkgIGVsc2UgaWYgKHN0cmNtcCAoc2VnbmFtZSwgIi5yZGF0YSIpID09IDAKLQkJCQkgICB8fCBzdHJjbXAgKHNlZ25hbWUsICIucm9kYXRhIikgPT0gMCkKLQkJCSAgICBzYyA9IHNjX1JEYXRhOwotCQkJICBlbHNlIGlmIChzdHJjbXAgKHNlZ25hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkJICAgIHNjID0gc2NfU0RhdGE7Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSBic3Nfc2VjdGlvbikKLQkJCSAgICBzYyA9IHNjX0JzczsKLQkJCSAgZWxzZSBpZiAoc3RyY21wIChzZWduYW1lLCAiLnNic3MiKSA9PSAwKQotCQkJICAgIHNjID0gc2NfU0JzczsKLQkJCSAgZWxzZSBpZiAoc2VnID09ICZiZmRfYWJzX3NlY3Rpb24pCi0JCQkgICAgc2MgPSBzY19BYnM7Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBUaGlzIG11c3QgYmUgYSB1c2VyIG5hbWVkIHNlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIG5vdCBwb3NzaWJsZSBpbiBFQ09GRiwgYnV0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbiBFTEYuICAqLwotCQkJICAgICAgc2MgPSBzY19EYXRhOwotCQkJICAgIH0KLQotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9IChpbnQpIHN0OwotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyA9IChpbnQpIHNjOwotCQkJfQotCi0JCSAgICAgIC8qIFRoaXMgaXMganVzdCBhbiBleHRlcm5hbCBzeW1ib2wgaWYgaXQgaXMKLQkJCSBvdXRzaWRlIGEgcHJvY2VkdXJlIGFuZCBpdCBoYXMgYSB0eXBlLgotCQkJIEZJWE1FOiBnKysgd2lsbCBnZW5lcmF0ZSBzeW1ib2xzIHdoaWNoIGhhdmUKLQkJCSBkaWZmZXJlbnQgbmFtZXMgaW4gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCQkJIHRoYW4gdGhlIGFjdHVhbCBzeW1ib2wuICBTaG91bGQgd2UgaGFuZGxlCi0JCQkgdGhlbSBoZXJlPyAgKi8KLQkJICAgICAgaWYgKChTX0lTX0VYVEVSTkFMIChhc19zeW0pCi0JCQkgICB8fCBTX0lTX1dFQUsgKGFzX3N5bSkKLQkJCSAgIHx8ICEgU19JU19ERUZJTkVEIChhc19zeW0pKQotCQkJICAmJiBzeW1fcHRyLT5wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwKLQkJCSAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgIT0gKGludCkgc3RfTmlsCi0JCQkgICYmICEgRUNPRkZfSVNfU1RBQiAoJnN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltKSkKLQkJCWxvY2FsID0gMDsKLQotCQkgICAgICAvKiBUaGlzIGlzIGp1c3QgYW4gZXh0ZXJuYWwgc3ltYm9sIGlmIGl0IGlzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24gc3ltYm9sLiAgKi8KLQkJICAgICAgaWYgKFNfSVNfQ09NTU9OIChhc19zeW0pKQotCQkJbG9jYWwgPSAwOwotCi0JCSAgICAgIC8qIElmIGFuIHN0X2VuZCBzeW1ib2wgaGFzIGFuIGFzc29jaWF0ZWQgZ2FzCi0JCQkgc3ltYm9sLCB0aGVuIGl0IGlzIGEgbG9jYWwgbGFiZWwgY3JlYXRlZCBmb3IKLQkJCSBhIC5iZW5kIG9yIC5lbmQgZGlyZWN0aXZlLiAgU3RhYnMgbGluZQotCQkJIG51bWJlcnMgd2lsbCBoYXZlIFwwMDEgaW4gdGhlIG5hbWVzLiAgKi8KLQkJICAgICAgaWYgKGxvY2FsCi0JCQkgICYmIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ICE9IHN0X0VuZAotCQkJICAmJiBzdHJjaHIgKHN5bV9wdHItPm5hbWUsICdcMDAxJykgPT0gMCkKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLmlzcyA9Ci0JCQkgIGFkZF9zdHJpbmcgKCZmaWxfcHRyLT5zdHJpbmdzLAotCQkJCSAgICAgIGZpbF9wdHItPnN0cl9oYXNoLAotCQkJCSAgICAgIHN5bV9wdHItPm5hbWUsCi0JCQkJICAgICAgKHNoYXNoX3QgKiopIE5VTEwpOwotCQkgICAgfQotCi0JCSAgLyogV2Ugbm93IGtub3cgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sOyBmaWxsIGluCi0JCSAgICAgbG9jYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHdhaXRpbmcgZm9yIHRoYXQKLQkJICAgICBpbmZvcm1hdGlvbi4gICovCi0JCSAgaWYgKHN5bV9wdHItPmJlZ2luX3B0ciAhPSAobG9jYWxzeW1fdCAqKSBOVUxMKQotCQkgICAgewotCQkgICAgICBsb2NhbHN5bV90ICpiZWdpbl9wdHI7Ci0JCSAgICAgIHN0X3QgYmVnaW5fdHlwZTsKLQotCQkgICAgICBrbm93IChsb2NhbCk7Ci0JCSAgICAgIGJlZ2luX3B0ciA9IHN5bV9wdHItPmJlZ2luX3B0cjsKLQkJICAgICAga25vdyAoYmVnaW5fcHRyLT5zeW1faW5kZXggIT0gLTEpOwotCQkgICAgICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGJlZ2luX3B0ci0+c3ltX2luZGV4OwotCQkgICAgICBpZiAoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgIT0gKGludCkgc2NfSW5mbykKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLmlzcyA9Ci0JCQkgIGJlZ2luX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaXNzOwotCi0JCSAgICAgIGJlZ2luX3R5cGUgPSBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0OwotCQkgICAgICBpZiAoYmVnaW5fdHlwZSA9PSBzdF9GaWxlCi0JCQkgIHx8IGJlZ2luX3R5cGUgPT0gc3RfQmxvY2spCi0JCQl7Ci0JCQkgIGJlZ2luX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPQotCQkJICAgIGlzeW0gLSBpZmlsZXN5bSArIDE7Ci0JCQkgICgqc3dhcF9zeW1fb3V0KSAoc3Rkb3V0cHV0LAotCQkJCQkgICAmYmVnaW5fcHRyLT5lY29mZl9zeW0uYXN5bSwKLQkJCQkJICAgKCpidWYKLQkJCQkJICAgICsgb2Zmc2V0Ci0JCQkJCSAgICArIChiZWdpbl9wdHItPnN5bV9pbmRleAotCQkJCQkgICAgICAgKiBleHRlcm5hbF9zeW1fc2l6ZSkpKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBrbm93IChiZWdpbl9wdHItPmluZGV4X3B0ciAhPSAoYXV4X3QgKikgTlVMTCk7Ci0JCQkgIGJlZ2luX3B0ci0+aW5kZXhfcHRyLT5kYXRhLmlzeW0gPQotCQkJICAgIGlzeW0gLSBpZmlsZXN5bSArIDE7Ci0JCQl9Ci0KLQkJICAgICAgLyogVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgbWFya2luZyB0aGUgZW5kIG9mIGEKLQkJCSBwcm9jZWR1cmUgaXMgdGhlIHNpemUgb2YgdGhlIHByb2NlZHVyZS4gIFRoZQotCQkJIHZhbHVlIG9mIHRoZSBzeW1ib2wgbWFya2luZyB0aGUgZW5kIG9mIGEKLQkJCSBibG9jayBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZQotCQkJIHByb2NlZHVyZSB0byB0aGUgYmxvY2suICAqLwotCQkgICAgICBpZiAoYmVnaW5fdHlwZSA9PSBzdF9Qcm9jCi0JCQkgIHx8IGJlZ2luX3R5cGUgPT0gc3RfU3RhdGljUHJvYykKLQkJCXsKLQkJCSAga25vdyAoYXNfc3ltICE9IChzeW1ib2xTICopIE5VTEwpOwotCQkJICBrbm93IChiZWdpbl9wdHItPmFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKLQkJCSAgaWYgKFNfR0VUX1NFR01FTlQgKGFzX3N5bSkKLQkJCSAgICAgICE9IFNfR0VUX1NFR01FTlQgKGJlZ2luX3B0ci0+YXNfc3ltKSkKLQkJCSAgICBhc193YXJuIChfKCIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOwotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9Ci0JCQkgICAgKFNfR0VUX1ZBTFVFIChhc19zeW0pCi0JCQkgICAgIC0gU19HRVRfVkFMVUUgKGJlZ2luX3B0ci0+YXNfc3ltKSk7Ci0KLQkJCSAgLyogSWYgdGhlIHNpemUgaXMgb2RkLCB0aGlzIGlzIHByb2JhYmx5IGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwczE2IGZ1bmN0aW9uOyBmb3JjZSBpdCB0byBiZSBldmVuLiAgKi8KLQkJCSAgaWYgKChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSAmIDEpICE9IDApCi0JCQkgICAgKytzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZTsKLQotI2lmZGVmIFNfU0VUX1NJWkUKLQkJCSAgU19TRVRfU0laRSAoYmVnaW5fcHRyLT5hc19zeW0sCi0JCQkJICAgICAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUpOwotI2VuZGlmCi0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKGJlZ2luX3R5cGUgPT0gc3RfQmxvY2sKLQkJCSAgICAgICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyAhPSAoaW50KSBzY19JbmZvKQotCQkJewotCQkJICBzeW1ib2xTICpiZWdpbl9zeW07Ci0KLQkJCSAga25vdyAoYXNfc3ltICE9IChzeW1ib2xTICopIE5VTEwpOwotCQkJICBrbm93IChzeW1fcHRyLT5wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwpOwotCQkJICBiZWdpbl9zeW0gPSBzeW1fcHRyLT5wcm9jX3B0ci0+c3ltLT5hc19zeW07Ci0JCQkgIGlmIChTX0dFVF9TRUdNRU5UIChhc19zeW0pCi0JCQkgICAgICAhPSBTX0dFVF9TRUdNRU5UIChiZWdpbl9zeW0pKQotCQkJICAgIGFzX3dhcm4gKF8oIi5iZWdpbi8uYmVuZCBpbiBkaWZmZXJlbnQgc2VnbWVudHMiKSk7Ci0JCQkgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0KLQkJCSAgICBTX0dFVF9WQUxVRSAoYXNfc3ltKSAtIFNfR0VUX1ZBTFVFIChiZWdpbl9zeW0pOwotCQkJfQotCQkgICAgfQotCi0JCSAgZm9yIChmID0gc3ltX3B0ci0+Zm9yd2FyZF9yZWY7Ci0JCSAgICAgICBmICE9IChmb3J3YXJkX3QgKikgTlVMTDsKLQkJICAgICAgIGYgPSBmLT5uZXh0KQotCQkgICAgewotCQkgICAgICBrbm93IChsb2NhbCk7Ci0JCSAgICAgIGYtPmlmZF9wdHItPmRhdGEuaXN5bSA9IGZpbF9wdHItPmZpbGVfaW5kZXg7Ci0JCSAgICAgIGYtPmluZGV4X3B0ci0+ZGF0YS5ybmR4LmluZGV4ID0gaXN5bSAtIGlmaWxlc3ltOwotCQkgICAgfQotCi0JCSAgaWYgKGxvY2FsKQotCQkgICAgewotCQkgICAgICBpZiAoKmJ1ZmVuZCAtIHN5bV9vdXQgPCBleHRlcm5hbF9zeW1fc2l6ZSkKLQkJCXN5bV9vdXQgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLAotCQkJCQkJICAgc3ltX291dCwKLQkJCQkJCSAgIGV4dGVybmFsX3N5bV9zaXplKTsKLQkJICAgICAgKCpzd2FwX3N5bV9vdXQpIChzdGRvdXRwdXQsICZzeW1fcHRyLT5lY29mZl9zeW0uYXN5bSwKLQkJCQkgICAgICAgc3ltX291dCk7Ci0JCSAgICAgIHN5bV9vdXQgKz0gZXh0ZXJuYWxfc3ltX3NpemU7Ci0KLQkJICAgICAgc3ltX3B0ci0+c3ltX2luZGV4ID0gaXN5bTsKLQotCQkgICAgICBpZiAoc3ltX3B0ci0+cHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMCi0JCQkgICYmIHN5bV9wdHItPnByb2NfcHRyLT5zeW0gPT0gc3ltX3B0cikKLQkJCXN5bV9wdHItPnByb2NfcHRyLT5wZHIuaXN5bSA9IGlzeW0gLSBpZmlsZXN5bTsKLQotCQkgICAgICArK2lzeW07Ci0JCSAgICB9Ci0KLQkJICAvKiBSZWNvcmQgdGhlIGxvY2FsIHN5bWJvbCBpbmRleCBhbmQgZmlsZSBudW1iZXIgaW4KLQkJICAgICBjYXNlIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgTm90ZSB0aGF0IHRoaXMKLQkJICAgICBkZXN0cm95cyB0aGUgYXN5bS5pbmRleCBmaWVsZC4gICovCi0JCSAgaWYgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0JCSAgICAgICYmIHN5bWJvbF9nZXRfb2JqIChhc19zeW0pLT5lY29mZl9zeW1ib2wgPT0gc3ltX3B0cikKLQkJICAgIHsKLQkJICAgICAgaWYgKChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSBzdF9Qcm9jCi0JCQkgICB8fCBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSBzdF9TdGF0aWNQcm9jKQotCQkJICAmJiBsb2NhbCkKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0gaXN5bSAtIGlmaWxlc3ltIC0gMTsKLQkJICAgICAgc3ltX3B0ci0+ZWNvZmZfc3ltLmlmZCA9IGZpbF9wdHItPmZpbGVfaW5kZXg7Ci0KLQkJICAgICAgLyogRG9uJ3QgdHJ5IHRvIG1lcmdlIGFuIEZEUiB3aGljaCBoYXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBzeW1ib2wgYXR0YWNoZWQgdG8gaXQuICAqLwotCQkgICAgICBpZiAoU19JU19FWFRFUk5BTCAoYXNfc3ltKSB8fCBTX0lTX1dFQUsgKGFzX3N5bSkpCi0JCQlmaWxfcHRyLT5mZHIuZk1lcmdlID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBmaWxfcHRyLT5mZHIuY3N5bSA9IGlzeW0gLSBmaWxfcHRyLT5mZHIuaXN5bUJhc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0ICsgaXN5bSAqIGV4dGVybmFsX3N5bV9zaXplOwotfQotCi0vKiBTd2FwIG91dCB0aGUgcHJvY2VkdXJlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX3Byb2NzIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9wZHJfc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3Bkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQRFIgKiwgUFRSKSkKLSAgICA9IGJhY2tlbmQtPnN3YXBfcGRyX291dDsKLSAgY2hhciAqcGRyX291dDsKLSAgbG9uZyBpcHJvYzsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBwZHJfb3V0ID0gKmJ1ZiArIG9mZnNldDsKLQotICBpcHJvYyA9IDA7Ci0KLSAgLyogVGhlIHByb2NlZHVyZXMgYXJlIHN0b3JlZCBieSBmaWxlLiAgKi8KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgdmxpbmtzX3QgKnByb2NfbGluazsKLQkgIGludCBmaXJzdDsKLQotCSAgZmlsX3B0ci0+ZmRyLmlwZEZpcnN0ID0gaXByb2M7Ci0JICBmaXJzdCA9IDE7Ci0JICBmb3IgKHByb2NfbGluayA9IGZpbF9wdHItPnByb2NzLmZpcnN0OwotCSAgICAgICBwcm9jX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0JICAgICAgIHByb2NfbGluayA9IHByb2NfbGluay0+bmV4dCkKLQkgICAgewotCSAgICAgIGludCBwcmNfY250OwotCSAgICAgIHByb2NfdCAqcHJvY19wdHI7Ci0JICAgICAgcHJvY190ICpwcm9jX2VuZDsKLQotCSAgICAgIGlmIChwcm9jX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JCXByY19jbnQgPSBmaWxfcHRyLT5wcm9jcy5vYmplY3RzX2xhc3RfcGFnZTsKLQkgICAgICBlbHNlCi0JCXByY19jbnQgPSBmaWxfcHRyLT5wcm9jcy5vYmplY3RzX3Blcl9wYWdlOwotCSAgICAgIHByb2NfcHRyID0gcHJvY19saW5rLT5kYXR1bS0+cHJvYzsKLQkgICAgICBwcm9jX2VuZCA9IHByb2NfcHRyICsgcHJjX2NudDsKLQkgICAgICBmb3IgKDsgcHJvY19wdHIgPCBwcm9jX2VuZDsgcHJvY19wdHIrKykKLQkJewotCQkgIHN5bWJvbFMgKmFkcl9zeW07Ci0JCSAgdW5zaWduZWQgbG9uZyBhZHI7Ci0KLQkJICBhZHJfc3ltID0gcHJvY19wdHItPnN5bS0+YXNfc3ltOwotCQkgIGFkciA9IChTX0dFVF9WQUxVRSAoYWRyX3N5bSkKLQkJCSArIGJmZF9nZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwKLQkJCQkJCVNfR0VUX1NFR01FTlQgKGFkcl9zeW0pKSk7Ci0JCSAgaWYgKGZpcnN0KQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBmb3JjZSB0aGUgYWRyIG9mIHRoZSB2ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgZmRyIHRvIGJlIDAuICBIb3dldmVyLCB0aGUgbmF0aXZlIHRvb2xzCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgZG8gdGhhdCwgYW5kIEkgY2FuJ3QgcmVtZW1iZXIgd2h5IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byB3b3JrIHRoYXQgd2F5LCBzbyBJIHRvb2sgaXQgb3V0LiAgKi8KLQkJICAgICAgZmlsX3B0ci0+ZmRyLmFkciA9IGFkcjsKLQkJICAgICAgZmlyc3QgPSAwOwotCQkgICAgfQotCQkgIHByb2NfcHRyLT5wZHIuYWRyID0gYWRyIC0gZmlsX3B0ci0+ZmRyLmFkcjsKLQkJICBpZiAoKmJ1ZmVuZCAtIHBkcl9vdXQgPCBleHRlcm5hbF9wZHJfc2l6ZSkKLQkJICAgIHBkcl9vdXQgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLAotCQkJCQkgICAgICAgcGRyX291dCwKLQkJCQkJICAgICAgIGV4dGVybmFsX3Bkcl9zaXplKTsKLQkJICAoKnN3YXBfcGRyX291dCkgKHN0ZG91dHB1dCwgJnByb2NfcHRyLT5wZHIsIHBkcl9vdXQpOwotCQkgIHBkcl9vdXQgKz0gZXh0ZXJuYWxfcGRyX3NpemU7Ci0JCSAgKytpcHJvYzsKLQkJfQotCSAgICB9Ci0JICBmaWxfcHRyLT5mZHIuY3BkID0gaXByb2MgLSBmaWxfcHRyLT5mZHIuaXBkRmlyc3Q7Ci0JfQotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0ICsgaXByb2MgKiBleHRlcm5hbF9wZHJfc2l6ZTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGF1eCBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9hdXggKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLXsKLSAgaW50IGJpZ2VuZGlhbjsKLSAgdW5pb24gYXV4X2V4dCAqYXV4X291dDsKLSAgbG9uZyBpYXV4OwotICB2bGlua3NfdCAqZmlsZV9saW5rOwotCi0gIGJpZ2VuZGlhbiA9IGJmZF9iaWdfZW5kaWFuIChzdGRvdXRwdXQpOwotCi0gIGF1eF9vdXQgPSAodW5pb24gYXV4X2V4dCAqKSAoKmJ1ZiArIG9mZnNldCk7Ci0KLSAgaWF1eCA9IDA7Ci0KLSAgLyogVGhlIGF1eCBlbnRyaWVzIGFyZSBzdG9yZWQgYnkgZmlsZS4gICovCi0gIGZvciAoZmlsZV9saW5rID0gZmlsZV9kZXNjLmZpcnN0OwotICAgICAgIGZpbGVfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBmaWxlX2xpbmsgPSBmaWxlX2xpbmstPm5leHQpCi0gICAgewotICAgICAgaW50IGZpbF9jbnQ7Ci0gICAgICBlZmRyX3QgKmZpbF9wdHI7Ci0gICAgICBlZmRyX3QgKmZpbF9lbmQ7Ci0KLSAgICAgIGlmIChmaWxlX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2U7Ci0gICAgICBmaWxfcHRyID0gZmlsZV9saW5rLT5kYXR1bS0+ZmlsZTsKLSAgICAgIGZpbF9lbmQgPSBmaWxfcHRyICsgZmlsX2NudDsKLSAgICAgIGZvciAoOyBmaWxfcHRyIDwgZmlsX2VuZDsgZmlsX3B0cisrKQotCXsKLQkgIHZsaW5rc190ICphdXhfbGluazsKLQotCSAgZmlsX3B0ci0+ZmRyLmZCaWdlbmRpYW4gPSBiaWdlbmRpYW47Ci0JICBmaWxfcHRyLT5mZHIuaWF1eEJhc2UgPSBpYXV4OwotCSAgZm9yIChhdXhfbGluayA9IGZpbF9wdHItPmF1eF9zeW1zLmZpcnN0OwotCSAgICAgICBhdXhfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLQkgICAgICAgYXV4X2xpbmsgPSBhdXhfbGluay0+bmV4dCkKLQkgICAgewotCSAgICAgIGludCBhdXhfY250OwotCSAgICAgIGF1eF90ICphdXhfcHRyOwotCSAgICAgIGF1eF90ICphdXhfZW5kOwotCi0JICAgICAgaWYgKGF1eF9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCQlhdXhfY250ID0gZmlsX3B0ci0+YXV4X3N5bXMub2JqZWN0c19sYXN0X3BhZ2U7Ci0JICAgICAgZWxzZQotCQlhdXhfY250ID0gZmlsX3B0ci0+YXV4X3N5bXMub2JqZWN0c19wZXJfcGFnZTsKLQkgICAgICBhdXhfcHRyID0gYXV4X2xpbmstPmRhdHVtLT5hdXg7Ci0JICAgICAgYXV4X2VuZCA9IGF1eF9wdHIgKyBhdXhfY250OwotCSAgICAgIGZvciAoOyBhdXhfcHRyIDwgYXV4X2VuZDsgYXV4X3B0cisrKQotCQl7Ci0JCSAgaWYgKCpidWZlbmQgLSAoY2hhciAqKSBhdXhfb3V0IDwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSkKLQkJICAgIGF1eF9vdXQgPSAoKHVuaW9uIGF1eF9leHQgKikKLQkJCSAgICAgICBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLAotCQkJCQkJKGNoYXIgKikgYXV4X291dCwKLQkJCQkJCXNpemVvZiAodW5pb24gYXV4X2V4dCkpKTsKLQkJICBzd2l0Y2ggKGF1eF9wdHItPnR5cGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIGF1eF90aXI6Ci0JCSAgICAgICgqYmFja2VuZC0+c3dhcF90aXJfb3V0KSAoYmlnZW5kaWFuLAotCQkJCQkJJmF1eF9wdHItPmRhdGEudGksCi0JCQkJCQkmYXV4X291dC0+YV90aSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfcm5keDoKLQkJICAgICAgKCpiYWNrZW5kLT5zd2FwX3JuZHhfb3V0KSAoYmlnZW5kaWFuLAotCQkJCQkJICZhdXhfcHRyLT5kYXRhLnJuZHgsCi0JCQkJCQkgJmF1eF9vdXQtPmFfcm5keCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfZG5Mb3c6Ci0JCSAgICAgIEFVWF9QVVRfRE5MT1cgKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5kbkxvdywKLQkJCQkgICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2RuSGlnaDoKLQkJICAgICAgQVVYX1BVVF9ETkhJR0ggKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5kbkhpZ2gsCi0JCQkJICAgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfaXN5bToKLQkJICAgICAgQVVYX1BVVF9JU1lNIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuaXN5bSwKLQkJCQkgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfaXNzOgotCQkgICAgICBBVVhfUFVUX0lTUyAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmlzcywKLQkJCQkgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF93aWR0aDoKLQkJICAgICAgQVVYX1BVVF9XSURUSCAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLndpZHRoLAotCQkJCSAgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfY291bnQ6Ci0JCSAgICAgIEFVWF9QVVRfQ09VTlQgKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5jb3VudCwKLQkJCQkgICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQkgICsrYXV4X291dDsKLQkJICArK2lhdXg7Ci0JCX0KLQkgICAgfQotCSAgZmlsX3B0ci0+ZmRyLmNhdXggPSBpYXV4IC0gZmlsX3B0ci0+ZmRyLmlhdXhCYXNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGVjb2ZmX3BhZGRpbmdfYWRqdXN0IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwKLQkJCSAgICAgICBvZmZzZXQgKyBpYXV4ICogc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQkJCSAgICAgICAoY2hhciAqKikgTlVMTCk7Ci19Ci0KLS8qIENvcHkgb3V0IHRoZSBzdHJpbmdzIGZyb20gYSB2YXJyYXlfdC4gIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gICBieXRlcyBjb3BpZWQsIHJhdGhlciB0aGFuIHRoZSBuZXcgb2Zmc2V0LiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX3N0cmluZ3MgKGJ1ZiwgYnVmZW5kLCBvZmZzZXQsIHZwKQotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgdmFycmF5X3QgKnZwOwotewotICB1bnNpZ25lZCBsb25nIGlzdHI7Ci0gIGNoYXIgKnN0cl9vdXQ7Ci0gIHZsaW5rc190ICpzdHJfbGluazsKLQotICBzdHJfb3V0ID0gKmJ1ZiArIG9mZnNldDsKLQotICBpc3RyID0gMDsKLQotICBmb3IgKHN0cl9saW5rID0gdnAtPmZpcnN0OwotICAgICAgIHN0cl9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIHN0cl9saW5rID0gc3RyX2xpbmstPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBzdHJfY250OwotCi0gICAgICBpZiAoc3RyX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0Jc3RyX2NudCA9IHZwLT5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlzdHJfY250ID0gdnAtPm9iamVjdHNfcGVyX3BhZ2U7Ci0KLSAgICAgIGlmICgqYnVmZW5kIC0gc3RyX291dCA8IHN0cl9jbnQpCi0Jc3RyX291dCA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIHN0cl9vdXQsIHN0cl9jbnQpOwotCi0gICAgICBtZW1jcHkgKHN0cl9vdXQsIHN0cl9saW5rLT5kYXR1bS0+Ynl0ZSwgc3RyX2NudCk7Ci0gICAgICBzdHJfb3V0ICs9IHN0cl9jbnQ7Ci0gICAgICBpc3RyICs9IHN0cl9jbnQ7Ci0gICAgfQotCi0gIHJldHVybiBpc3RyOwotfQotCi0vKiBEdW1wIG91dCB0aGUgbG9jYWwgc3RyaW5ncy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9zcyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBsb25nIGlzczsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBpc3MgPSAwOwotCi0gIGZvciAoZmlsZV9saW5rID0gZmlsZV9kZXNjLmZpcnN0OwotICAgICAgIGZpbGVfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBmaWxlX2xpbmsgPSBmaWxlX2xpbmstPm5leHQpCi0gICAgewotICAgICAgaW50IGZpbF9jbnQ7Ci0gICAgICBlZmRyX3QgKmZpbF9wdHI7Ci0gICAgICBlZmRyX3QgKmZpbF9lbmQ7Ci0KLSAgICAgIGlmIChmaWxlX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2U7Ci0gICAgICBmaWxfcHRyID0gZmlsZV9saW5rLT5kYXR1bS0+ZmlsZTsKLSAgICAgIGZpbF9lbmQgPSBmaWxfcHRyICsgZmlsX2NudDsKLSAgICAgIGZvciAoOyBmaWxfcHRyIDwgZmlsX2VuZDsgZmlsX3B0cisrKQotCXsKLQkgIGxvbmcgc3NfY250OwotCi0JICBmaWxfcHRyLT5mZHIuaXNzQmFzZSA9IGlzczsKLQkgIHNzX2NudCA9IGVjb2ZmX2J1aWxkX3N0cmluZ3MgKGJ1ZiwgYnVmZW5kLCBvZmZzZXQgKyBpc3MsCi0JCQkJCSZmaWxfcHRyLT5zdHJpbmdzKTsKLQkgIGZpbF9wdHItPmZkci5jYlNzID0gc3NfY250OwotCSAgaXNzICs9IHNzX2NudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBlY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCArIGlzcywKLQkJCSAgICAgICAoY2hhciAqKikgTlVMTCk7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX2ZkciAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9mZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRkRSICosIFBUUikpCi0gICAgPSBiYWNrZW5kLT5zd2FwX2Zkcl9vdXQ7Ci0gIGxvbmcgaWZpbGU7Ci0gIGNoYXIgKmZkcl9vdXQ7Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgaWZpbGUgPSAwOwotCi0gIGZkcl9vdXQgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGZvciAoZmlsZV9saW5rID0gZmlsZV9kZXNjLmZpcnN0OwotICAgICAgIGZpbGVfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBmaWxlX2xpbmsgPSBmaWxlX2xpbmstPm5leHQpCi0gICAgewotICAgICAgaW50IGZpbF9jbnQ7Ci0gICAgICBlZmRyX3QgKmZpbF9wdHI7Ci0gICAgICBlZmRyX3QgKmZpbF9lbmQ7Ci0KLSAgICAgIGlmIChmaWxlX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2U7Ci0gICAgICBmaWxfcHRyID0gZmlsZV9saW5rLT5kYXR1bS0+ZmlsZTsKLSAgICAgIGZpbF9lbmQgPSBmaWxfcHRyICsgZmlsX2NudDsKLSAgICAgIGZvciAoOyBmaWxfcHRyIDwgZmlsX2VuZDsgZmlsX3B0cisrKQotCXsKLQkgIGlmICgqYnVmZW5kIC0gZmRyX291dCA8IGV4dGVybmFsX2Zkcl9zaXplKQotCSAgICBmZHJfb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgZmRyX291dCwKLQkJCQkgICAgICAgZXh0ZXJuYWxfZmRyX3NpemUpOwotCSAgKCpzd2FwX2Zkcl9vdXQpIChzdGRvdXRwdXQsICZmaWxfcHRyLT5mZHIsIGZkcl9vdXQpOwotCSAgZmRyX291dCArPSBleHRlcm5hbF9mZHJfc2l6ZTsKLQkgICsraWZpbGU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0ICsgaWZpbGUgKiBleHRlcm5hbF9mZHJfc2l6ZTsKLX0KLQotLyogU2V0IHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgVGhlc2UgYXJlIHN1cHBvc2VkIHRvIGJlIGhhbmRsZWQgYnkKLSAgIHRoZSBiYWNrZW5kLiAgVGhpcyByb3V0aW5lIGp1c3QgZ2V0cyB0aGUgcmlnaHQgaW5mb3JtYXRpb24gYW5kCi0gICBjYWxscyBhIGJhY2tlbmQgZnVuY3Rpb24gdG8gZGVhbCB3aXRoIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3NldHVwX2V4dCAoKQotewotICByZWdpc3RlciBzeW1ib2xTICpzeW07Ci0KLSAgZm9yIChzeW0gPSBzeW1ib2xfcm9vdFA7IHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMOyBzeW0gPSBzeW1ib2xfbmV4dCAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX3N5bWJvbCA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB0aGVuIGZvcmNlIHRoZSBmaWVsZHMgdG8gemVyby4gICovCi0gICAgICBpZiAoISBTX0lTX0VYVEVSTkFMIChzeW0pCi0JICAmJiAhIFNfSVNfV0VBSyAoc3ltKQotCSAgJiYgU19JU19ERUZJTkVEIChzeW0pKQotCXsKLQkgIHN0cnVjdCBsb2NhbHN5bSAqbHN5bTsKLQotCSAgbHN5bSA9IHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2w7Ci0JICBsc3ltLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9IDA7Ci0JICBsc3ltLT5lY29mZl9zeW0uYXN5bS5zdCA9IChpbnQpIHN0X05pbDsKLQkgIGxzeW0tPmVjb2ZmX3N5bS5hc3ltLnNjID0gKGludCkgc2NfTmlsOwotCSAgbHN5bS0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLQl9Ci0KLSAgICAgIG9ial9lY29mZl9zZXRfZXh0IChzeW0sICZzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sLT5lY29mZl9zeW0pOwotICAgIH0KLX0KLQotLyogQnVpbGQgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX2RlYnVnIChoZHIsIGJ1ZnAsIGJhY2tlbmQpCi0gICAgIEhEUlIgKmhkcjsKLSAgICAgY2hhciAqKmJ1ZnA7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotewotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0gIHRhZ190ICpwdGFnOwotICB0YWdfdCAqcHRhZ19uZXh0OwotICBlZmRyX3QgKmZpbF9wdHI7Ci0gIGludCBlbmRfd2FybmluZzsKLSAgZWZkcl90ICpob2xkX2ZpbGVfcHRyOwotICBwcm9jX3QgKiBob2xkX3Byb2NfcHRyOwotICBzeW1ib2xTICpzeW07Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqYnVmZW5kOwotICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGZpbGUuICAqLwotICBpZiAoZmlyc3RfZmlsZSA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOwotCi0gIC8qIEhhbmRsZSBhbnkgdG9wIGxldmVsIHRhZ3MuICAqLwotICBmb3IgKHB0YWcgPSB0b3BfdGFnX2hlYWQtPmZpcnN0X3RhZzsKLSAgICAgICBwdGFnICE9ICh0YWdfdCAqKSBOVUxMOwotICAgICAgIHB0YWcgPSBwdGFnX25leHQpCi0gICAgewotICAgICAgaWYgKHB0YWctPmZvcndhcmRfcmVmICE9IChmb3J3YXJkX3QgKikgTlVMTCkKLQlhZGRfdW5rbm93bl90YWcgKHB0YWcpOwotCi0gICAgICBwdGFnX25leHQgPSBwdGFnLT5zYW1lX2Jsb2NrOwotICAgICAgcHRhZy0+aGFzaF9wdHItPnRhZ19wdHIgPSBwdGFnLT5zYW1lX25hbWU7Ci0gICAgICBmcmVlX3RhZyAocHRhZyk7Ci0gICAgfQotCi0gIGZyZWVfdGhlYWQgKHRvcF90YWdfaGVhZCk7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzLiAgQWRkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgZWFjaAotICAgICBzeW1ib2wgdGhhdCBoYXMgbm90IGFscmVhZHkgcmVjZWl2ZWQgaXQuICAqLwotICBob2xkX2ZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOwotICBob2xkX3Byb2NfcHRyID0gY3VyX3Byb2NfcHRyOwotICBjdXJfcHJvY19wdHIgPSAocHJvY190ICopIE5VTEw7Ci0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gKHN5bWJvbFMgKikgTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2wgIT0gTlVMTAotCSAgfHwgc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX2ZpbGUgPT0gKGVmZHJfdCAqKSBOVUxMCi0JICB8fCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBjdXJfZmlsZV9wdHIgPSBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfZmlsZTsKLSAgICAgIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X05pbCwgc2NfTmlsLCBzeW0sCi0JCQkoYmZkX3ZtYSkgMCwgU19HRVRfVkFMVUUgKHN5bSksIGluZGV4TmlsKTsKLSAgICB9Ci0gIGN1cl9wcm9jX3B0ciA9IGhvbGRfcHJvY19wdHI7Ci0gIGN1cl9maWxlX3B0ciA9IGhvbGRfZmlsZV9wdHI7Ci0KLSAgLyogT3V0cHV0IGFuIGVuZGluZyBzeW1ib2wgZm9yIGFsbCB0aGUgZmlsZXMuICBXZSBoYXZlIHRvIGRvIHRoaXMKLSAgICAgaGVyZSBmb3IgdGhlIGxhc3QgZmlsZSwgc28gd2UgbWF5IGFzIHdlbGwgZG8gaXQgZm9yIGFsbCBvZiB0aGUKLSAgICAgZmlsZXMuICAqLwotICBlbmRfd2FybmluZyA9IDA7Ci0gIGZvciAoZmlsX3B0ciA9IGZpcnN0X2ZpbGU7Ci0gICAgICAgZmlsX3B0ciAhPSAoZWZkcl90ICopIE5VTEw7Ci0gICAgICAgZmlsX3B0ciA9IGZpbF9wdHItPm5leHRfZmlsZSkKLSAgICB7Ci0gICAgICBjdXJfZmlsZV9wdHIgPSBmaWxfcHRyOwotICAgICAgd2hpbGUgKGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlICE9IChzY29wZV90ICopIE5VTEwKLQkgICAgICYmIGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlLT5wcmV2ICE9IChzY29wZV90ICopIE5VTEwpCi0JewotCSAgY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgPSBjdXJfZmlsZV9wdHItPmN1cl9zY29wZS0+cHJldjsKLQkgIGlmICghIGVuZF93YXJuaW5nICYmICEgY3VyX2ZpbGVfcHRyLT5mYWtlKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiTWlzc2luZyAuZW5kIG9yIC5iZW5kIGF0IGVuZCBvZiBmaWxlIikpOwotCSAgICAgIGVuZF93YXJuaW5nID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChjdXJfZmlsZV9wdHItPmN1cl9zY29wZSAhPSAoc2NvcGVfdCAqKSBOVUxMKQotCSh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSBzdF9FbmQsIHNjX1RleHQsCi0JCQkJIChzeW1ib2xTICopIE5VTEwsCi0JCQkJIChiZmRfdm1hKSAwLAotCQkJCSAoc3ltaW50X3QpIDAsCi0JCQkJIChzeW1pbnRfdCkgMCk7Ci0gICAgfQotCi0gIC8qIEJ1aWxkIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIG9mZnNldCA9IDA7Ci0gIGJ1ZiA9IHhtYWxsb2MgKFBBR0VfU0laRSk7Ci0gIGJ1ZmVuZCA9IGJ1ZiArIFBBR0VfU0laRTsKLQotICAvKiBCdWlsZCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAqLwotICBoZHItPmNiTGluZU9mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfbGluZW5vIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQsCi0JCQkgICAgICAgJmhkci0+aWxpbmVNYXgpOwotICBoZHItPmNiTGluZSA9IG9mZnNldCAtIGhkci0+Y2JMaW5lT2Zmc2V0OwotCi0gIC8qIFdlIGRvbid0IHVzZSBkZW5zZSBudW1iZXJzIGF0IGFsbC4gICovCi0gIGhkci0+aWRuTWF4ID0gMDsKLSAgaGRyLT5jYkRuT2Zmc2V0ID0gMDsKLQotICAvKiBXZSBjYW4ndCBidWlsZCB0aGUgUERSIHRhYmxlIHVudGlsIHdlIGhhdmUgYnVpbHQgdGhlIHN5bWJvbHMsCi0gICAgIGJlY2F1c2UgYSBQRFIgY29udGFpbnMgYSBzeW1ib2wgaW5kZXguICBIb3dldmVyLCB3ZSBzZXQgYXNpZGUKLSAgICAgc3BhY2UgYXQgdGhpcyBwb2ludC4gICovCi0gIGhkci0+aXBkTWF4ID0gcHJvY19jbnQ7Ci0gIGhkci0+Y2JQZE9mZnNldCA9IG9mZnNldDsKLSAgaWYgKGJ1ZmVuZCAtIChidWYgKyBvZmZzZXQpIDwgcHJvY19jbnQgKiBleHRlcm5hbF9wZHJfc2l6ZSkKLSAgICAodm9pZCkgZWNvZmZfYWRkX2J5dGVzICgmYnVmLCAmYnVmZW5kLCBidWYgKyBvZmZzZXQsCi0JCQkgICAgcHJvY19jbnQgKiBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIG9mZnNldCArPSBwcm9jX2NudCAqIGV4dGVybmFsX3Bkcl9zaXplOwotCi0gIC8qIEJ1aWxkIHRoZSBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgaGRyLT5jYlN5bU9mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfc3ltYm9scyAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0KTsKLSAgaGRyLT5pc3ltTWF4ID0gKG9mZnNldCAtIGhkci0+Y2JTeW1PZmZzZXQpIC8gYmFja2VuZC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0KLSAgLyogQnVpbGRpbmcgdGhlIHN5bWJvbHMgaW5pdGlhbGl6ZXMgdGhlIHN5bWJvbCBpbmRleCBpbiB0aGUgUERSJ3MuCi0gICAgIE5vdyB3ZSBjYW4gc3dhcCBvdXQgdGhlIFBEUidzLiAgKi8KLSAgKHZvaWQpIGVjb2ZmX2J1aWxkX3Byb2NzIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBoZHItPmNiUGRPZmZzZXQpOwotCi0gIC8qIFdlIGRvbid0IHVzZSBvcHRpbWl6YXRpb24gc3ltYm9scy4gICovCi0gIGhkci0+aW9wdE1heCA9IDA7Ci0gIGhkci0+Y2JPcHRPZmZzZXQgPSAwOwotCi0gIC8qIFN3YXAgb3V0IHRoZSBhdXhpbGlhcnkgdHlwZSBpbmZvcm1hdGlvbi4gICovCi0gIGhkci0+Y2JBdXhPZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX2F1eCAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0KTsKLSAgaGRyLT5pYXV4TWF4ID0gKG9mZnNldCAtIGhkci0+Y2JBdXhPZmZzZXQpIC8gc2l6ZW9mICh1bmlvbiBhdXhfZXh0KTsKLQotICAvKiBDb3B5IG91dCB0aGUgbG9jYWwgc3RyaW5ncy4gICovCi0gIGhkci0+Y2JTc09mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfc3MgKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCk7Ci0gIGhkci0+aXNzTWF4ID0gb2Zmc2V0IC0gaGRyLT5jYlNzT2Zmc2V0OwotCi0gIC8qIFdlIGRvbid0IHVzZSByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KLSAgaGRyLT5jcmZkID0gMDsKLSAgaGRyLT5jYlJmZE9mZnNldCA9IDA7Ci0KLSAgLyogU3dhcCBvdXQgdGhlIGZpbGUgZGVzY3JpcHRvcnMuICAqLwotICBoZHItPmNiRmRPZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX2ZkciAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0KTsKLSAgaGRyLT5pZmRNYXggPSAob2Zmc2V0IC0gaGRyLT5jYkZkT2Zmc2V0KSAvIGJhY2tlbmQtPmV4dGVybmFsX2Zkcl9zaXplOwotCi0gIC8qIFNldCB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scywgd2hpY2ggYXJlIGhhbmRsZWQgYnkgdGhlIEJGRCBiYWNrCi0gICAgIGVuZC4gICovCi0gIGhkci0+aXNzRXh0TWF4ID0gMDsKLSAgaGRyLT5jYlNzRXh0T2Zmc2V0ID0gMDsKLSAgaGRyLT5pZXh0TWF4ID0gMDsKLSAgaGRyLT5jYkV4dE9mZnNldCA9IDA7Ci0gIGVjb2ZmX3NldHVwX2V4dCAoKTsKLQotICBrbm93ICgob2Zmc2V0ICYgKGJhY2tlbmQtPmRlYnVnX2FsaWduIC0gMSkpID09IDApOwotCi0gIC8qIEZJWE1FOiBUaGlzIHZhbHVlIHNob3VsZCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIC52ZXJzdGFtcCBkaXJlY3RpdmUsCi0gICAgIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cyBpbiBjb25maWcgZmlsZXMuICAqLwotI2lmZGVmIFRDX0FMUEhBCi0gIGhkci0+dnN0YW1wID0gMHgwMzBiOwotI2Vsc2UKLSAgaGRyLT52c3RhbXAgPSAweDAyMGI7Ci0jZW5kaWYKLQotICAqYnVmcCA9IGJ1ZjsKLSAgcmV0dXJuIG9mZnNldDsKLX0KLQwKLS8qIEFsbG9jYXRlIGEgY2x1c3RlciBvZiBwYWdlcy4gICovCi0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLXN0YXRpYyBwYWdlX3R5cGUgKgotYWxsb2NhdGVfY2x1c3RlciAobnBhZ2VzKQotICAgICB1bnNpZ25lZCBsb25nIG5wYWdlczsKLXsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICp2YWx1ZSA9IChwYWdlX3R5cGUgKikgeG1hbGxvYyAobnBhZ2VzICogUEFHRV9VU0laRSk7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVRwotICBpZiAoZGVidWcgPiAzKQotICAgIGZwcmludGYgKHN0ZGVyciwgIlx0YWxsb2NcdG5wYWdlcyA9ICVkLCB2YWx1ZSA9IDB4JS44eFxuIiwgbnBhZ2VzLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBtZW1zZXQgKHZhbHVlLCAwLCBucGFnZXMgKiBQQUdFX1VTSVpFKTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLQotc3RhdGljIHBhZ2VfdHlwZSAqY2x1c3Rlcl9wdHIgPSBOVUxMOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZXNfbGVmdCA9IDA7Ci0KLSNlbmRpZiAvKiBNQUxMT0NfQ0hFQ0sgKi8KLQotLyogQWxsb2NhdGUgb25lIHBhZ2UgKHdoaWNoIGlzIGluaXRpYWxpemVkIHRvIDApLiAgKi8KLQotc3RhdGljIHBhZ2VfdHlwZSAqCi1hbGxvY2F0ZV9wYWdlICgpCi17Ci0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIGlmIChwYWdlc19sZWZ0ID09IDApCi0gICAgewotICAgICAgcGFnZXNfbGVmdCA9IE1BWF9DTFVTVEVSX1BBR0VTOwotICAgICAgY2x1c3Rlcl9wdHIgPSBhbGxvY2F0ZV9jbHVzdGVyIChwYWdlc19sZWZ0KTsKLSAgICB9Ci0KLSAgcGFnZXNfbGVmdC0tOwotICByZXR1cm4gY2x1c3Rlcl9wdHIrKzsKLQotI2Vsc2UJLyogTUFMTE9DX0NIRUNLICovCi0KLSAgcGFnZV90eXBlICpwdHI7Ci0KLSAgcHRyID0geG1hbGxvYyAoUEFHRV9VU0laRSk7Ci0gIG1lbXNldCAocHRyLCAwLCBQQUdFX1VTSVpFKTsKLSAgcmV0dXJuIHB0cjsKLQotI2VuZGlmCS8qIE1BTExPQ19DSEVDSyAqLwotfQotDAotLyogQWxsb2NhdGUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBzY29wZV90ICoKLWFsbG9jYXRlX3Njb3BlICgpCi17Ci0gIHJlZ2lzdGVyIHNjb3BlX3QgKnB0cjsKLSAgc3RhdGljIHNjb3BlX3QgaW5pdGlhbF9zY29wZTsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICBwdHIgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5mcmVlX2xpc3QuZl9zY29wZTsKLSAgaWYgKHB0ciAhPSAoc2NvcGVfdCAqKSBOVUxMKQotICAgIGFsbG9jX2NvdW50c1sgKGludClhbGxvY190eXBlX3Njb3BlIF0uZnJlZV9saXN0LmZfc2NvcGUgPSBwdHItPmZyZWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQJPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS51bmFsbG9jYXRlZDsKLSAgICAgIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UJPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5jdXJfcGFnZTsKLQotICAgICAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0JewotCSAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHNjb3BlX3QpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS50b3RhbF9wYWdlcysrOwotCX0KLQotICAgICAgcHRyID0gJmN1cl9wYWdlLT5zY29wZVstLXVuYWxsb2NhdGVkXTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0gICAgfQotCi0jZWxzZQotCi0gIHB0ciA9IChzY29wZV90ICopIHhtYWxsb2MgKHNpemVvZiAoc2NvcGVfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF9zY29wZTsKLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogRnJlZSBzY29waW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfc2NvcGUgKHB0cikKLSAgICAgc2NvcGVfdCAqcHRyOwotewotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS50b3RhbF9mcmVlKys7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0gIHB0ci0+ZnJlZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmZyZWVfbGlzdC5mX3Njb3BlOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5mcmVlX2xpc3QuZl9zY29wZSA9IHB0cjsKLSNlbHNlCi0gIGZyZWUgKChQVFIpIHB0cik7Ci0jZW5kaWYKLX0KLQwKLS8qIEFsbG9jYXRlIGxpbmtzIGZvciBwYWdlcyBpbiBhIHZpcnR1YWwgYXJyYXkuICAqLwotCi1zdGF0aWMgdmxpbmtzX3QgKgotYWxsb2NhdGVfdmxpbmtzICgpCi17Ci0gIHJlZ2lzdGVyIHZsaW5rc190ICpwdHI7Ci0gIHN0YXRpYyB2bGlua3NfdCBpbml0aWFsX3ZsaW5rczsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHZsaW5rc190KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPnZsaW5rc1stLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHZsaW5rc190ICopIHhtYWxsb2MgKHNpemVvZiAodmxpbmtzX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3ZsaW5rczsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIEFsbG9jYXRlIHN0cmluZyBoYXNoIGJ1Y2tldHMuICAqLwotCi1zdGF0aWMgc2hhc2hfdCAqCi1hbGxvY2F0ZV9zaGFzaCAoKQotewotICByZWdpc3RlciBzaGFzaF90ICpwdHI7Ci0gIHN0YXRpYyBzaGFzaF90IGluaXRpYWxfc2hhc2g7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAoc2hhc2hfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+c2hhc2hbLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHNoYXNoX3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzaGFzaF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3NoYXNoOwotICByZXR1cm4gcHRyOwotfQotDAotLyogQWxsb2NhdGUgdHlwZSBoYXNoIGJ1Y2tldHMuICAqLwotCi1zdGF0aWMgdGhhc2hfdCAqCi1hbGxvY2F0ZV90aGFzaCAoKQotewotICByZWdpc3RlciB0aGFzaF90ICpwdHI7Ci0gIHN0YXRpYyB0aGFzaF90IGluaXRpYWxfdGhhc2g7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAodGhhc2hfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+dGhhc2hbLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHRoYXNoX3QgKikgeG1hbGxvYyAoc2l6ZW9mICh0aGFzaF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3RoYXNoOwotICByZXR1cm4gcHRyOwotfQotDAotLyogQWxsb2NhdGUgc3RydWN0dXJlLCB1bmlvbiwgb3IgZW51bSB0YWcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdGFnX3QgKgotYWxsb2NhdGVfdGFnICgpCi17Ci0gIHJlZ2lzdGVyIHRhZ190ICpwdHI7Ci0gIHN0YXRpYyB0YWdfdCBpbml0aWFsX3RhZzsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICBwdHIgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnOwotICBpZiAocHRyICE9ICh0YWdfdCAqKSBOVUxMKQotICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5mcmVlX2xpc3QuZl90YWcgPSBwdHItPmZyZWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udW5hbGxvY2F0ZWQ7Ci0gICAgICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmN1cl9wYWdlOwotCi0gICAgICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLQl7Ci0JICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAodGFnX3QpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnRvdGFsX3BhZ2VzKys7Ci0JfQotCi0gICAgICBwdHIgPSAmY3VyX3BhZ2UtPnRhZ1stLXVuYWxsb2NhdGVkXTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotICAgIH0KLQotI2Vsc2UKLQotICBwdHIgPSAodGFnX3QgKikgeG1hbGxvYyAoc2l6ZW9mICh0YWdfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfdGFnOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBGcmVlIHNjb3BpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV90YWcgKHB0cikKLSAgICAgdGFnX3QgKnB0cjsKLXsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnRvdGFsX2ZyZWUrKzsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLSAgcHRyLT5mcmVlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmZyZWVfbGlzdC5mX3RhZzsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmZyZWVfbGlzdC5mX3RhZyA9IHB0cjsKLSNlbHNlCi0gIGZyZWUgKChQVFJfVCkgcHRyKTsKLSNlbmRpZgotfQotDAotLyogQWxsb2NhdGUgZm9yd2FyZCByZWZlcmVuY2UgdG8gYSB5ZXQgdW5rbm93biB0YWcuICAqLwotCi1zdGF0aWMgZm9yd2FyZF90ICoKLWFsbG9jYXRlX2ZvcndhcmQgKCkKLXsKLSAgcmVnaXN0ZXIgZm9yd2FyZF90ICpwdHI7Ci0gIHN0YXRpYyBmb3J3YXJkX3QgaW5pdGlhbF9mb3J3YXJkOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mIChmb3J3YXJkX3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT5mb3J3YXJkWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKGZvcndhcmRfdCAqKSB4bWFsbG9jIChzaXplb2YgKGZvcndhcmRfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX2ZvcndhcmQ7Ci0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBoZWFkIG9mIHR5cGUgaGFzaCBsaXN0LiAgKi8KLQotc3RhdGljIHRoZWFkX3QgKgotYWxsb2NhdGVfdGhlYWQgKCkKLXsKLSAgcmVnaXN0ZXIgdGhlYWRfdCAqcHRyOwotICBzdGF0aWMgdGhlYWRfdCBpbml0aWFsX3RoZWFkOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHB0ciA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmZyZWVfbGlzdC5mX3RoZWFkOwotICBpZiAocHRyICE9ICh0aGVhZF90ICopIE5VTEwpCi0gICAgYWxsb2NfY291bnRzWyAoaW50KWFsbG9jX3R5cGVfdGhlYWQgXS5mcmVlX2xpc3QuZl90aGVhZCA9IHB0ci0+ZnJlZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnVuYWxsb2NhdGVkOwotICAgICAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmN1cl9wYWdlOwotCi0gICAgICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLQl7Ci0JICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAodGhlYWRfdCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnRvdGFsX3BhZ2VzKys7Ci0JfQotCi0gICAgICBwdHIgPSAmY3VyX3BhZ2UtPnRoZWFkWy0tdW5hbGxvY2F0ZWRdOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLSAgICB9Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHRoZWFkX3QgKikgeG1hbGxvYyAoc2l6ZW9mICh0aGVhZF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3RoZWFkOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBGcmVlIHNjb3BpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV90aGVhZCAocHRyKQotICAgICB0aGVhZF90ICpwdHI7Ci17Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnRvdGFsX2ZyZWUrKzsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLSAgcHRyLT5mcmVlID0gKHRoZWFkX3QgKikgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uZnJlZV9saXN0LmZfdGhlYWQ7Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmZyZWVfbGlzdC5mX3RoZWFkID0gcHRyOwotI2Vsc2UKLSAgZnJlZSAoKFBUUl9UKSBwdHIpOwotI2VuZGlmCi19Ci0MCi1zdGF0aWMgbGluZW5vX2xpc3RfdCAqCi1hbGxvY2F0ZV9saW5lbm9fbGlzdCAoKQotewotICByZWdpc3RlciBsaW5lbm9fbGlzdF90ICpwdHI7Ci0gIHN0YXRpYyBsaW5lbm9fbGlzdF90IGluaXRpYWxfbGluZW5vX2xpc3Q7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mIChsaW5lbm9fbGlzdF90KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPmxpbmVub1stLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKGxpbmVub19saXN0X3QgKikgeG1hbGxvYyAoc2l6ZW9mIChsaW5lbm9fbGlzdF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF9saW5lbm9fbGlzdDsKLSAgcmV0dXJuIHB0cjsKLX0KLQotdm9pZAotZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplIChzeikKLSAgICAgaW50IHN6OwotewotICBpZiAoY3VyX3Byb2NfcHRyID09IDApCi0gICAgcmV0dXJuOwotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmdwX3Byb2xvZ3VlID0gc3o7Ci0gIGlmIChjdXJfcHJvY19wdHItPnBkci5ncF9wcm9sb2d1ZSAhPSBzeikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJHUCBwcm9sb2d1ZSBzaXplIGV4Y2VlZHMgZmllbGQgc2l6ZSwgdXNpbmcgMCBpbnN0ZWFkIikpOwotICAgICAgY3VyX3Byb2NfcHRyLT5wZHIuZ3BfcHJvbG9ndWUgPSAwOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5ncF91c2VkID0gMTsKLX0KLQotaW50IAotZWNvZmZfbm9fY3VycmVudF9maWxlICgpCi17Ci0gIHJldHVybiBjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMOwotfQotCi12b2lkCi1lY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vICgpCi17Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0gIGNoYXIgKmZpbGVuYW1lOwotICBsaW5lbm9fbGlzdF90ICpsaXN0OwotCi0gIGFzX3doZXJlICgmZmlsZW5hbWUsICZsaW5lbm8pOwotCi0gIGlmIChjdXJyZW50X3N0YWJzX2ZpbGVuYW1lID09IChjaGFyICopTlVMTAotICAgICAgfHwgc3RyY21wIChjdXJyZW50X3N0YWJzX2ZpbGVuYW1lLCBmaWxlbmFtZSkpCi0gICAgYWRkX2ZpbGUgKGZpbGVuYW1lLCAwLCAxKTsKLQotICBsaXN0ID0gYWxsb2NhdGVfbGluZW5vX2xpc3QgKCk7Ci0KLSAgbGlzdC0+bmV4dCA9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7Ci0gIGxpc3QtPmZpbGUgPSBjdXJfZmlsZV9wdHI7Ci0gIGxpc3QtPnByb2MgPSBjdXJfcHJvY19wdHI7Ci0gIGxpc3QtPmZyYWcgPSBmcmFnX25vdzsKLSAgbGlzdC0+cGFkZHIgPSBmcmFnX25vd19maXggKCk7Ci0gIGxpc3QtPmxpbmVubyA9IGxpbmVubzsKLQotICAvKiBXZSBkb24ndCB3YW50IHRvIG1lcmdlIGZpbGVzIHdoaWNoIGhhdmUgbGluZSBudW1iZXJzLiAgKi8KLSAgY3VyX2ZpbGVfcHRyLT5mZHIuZk1lcmdlID0gMDsKLQotICAvKiBBIC5sb2MgZGlyZWN0aXZlIHdpbGwgc29tZXRpbWVzIGFwcGVhciBiZWZvcmUgYSAuZW50IGRpcmVjdGl2ZSwKLSAgICAgd2hpY2ggbWVhbnMgdGhhdCBjdXJfcHJvY19wdHIgd2lsbCBiZSBOVUxMIGhlcmUuICBBcnJhbmdlIHRvCi0gICAgIHBhdGNoIHRoaXMgdXAuICAqLwotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBsaW5lbm9fbGlzdF90ICoqcGw7Ci0KLSAgICAgIHBsID0gJm5vcHJvY19saW5lbm87Ci0gICAgICB3aGlsZSAoKnBsICE9IChsaW5lbm9fbGlzdF90ICopIE5VTEwpCi0gICAgICAgIHBsID0gJigqcGwpLT5uZXh0OwotICAgICAgKnBsID0gbGlzdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0X2xpbmVubyA9IGxpc3Q7Ci0gICAgICAqbGFzdF9saW5lbm9fcHRyID0gbGlzdDsKLSAgICAgIGxhc3RfbGluZW5vX3B0ciA9ICZsaXN0LT5uZXh0OwotICAgIH0KLX0KLQotI2Vsc2UKLQotdm9pZAotZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKQotewotfQotCi0jZW5kaWYgLyogRUNPRkZfREVCVUdHSU5HICovCmRpZmYgLS1naXQgYS9nYXMvZWNvZmYuaCBiL2dhcy9lY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM2NWY4Li4wMDAwMDAwCi0tLSBhL2dhcy9lY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIGVjb2ZmLmggLS0gaGVhZGVyIGZpbGUgZm9yIEVDT0ZGIGRlYnVnZ2luZyBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgUHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVNfRUNPRkZfSAotI2RlZmluZSBHQVNfRUNPRkZfSAotCi0jaWZkZWYgRUNPRkZfREVCVUdHSU5HCi0KLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLQotLyogV2hldGhlciB3ZSBoYXZlIHNlZW4gYW55IEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gaW50IGVjb2ZmX2RlYnVnZ2luZ19zZWVuOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGFzc2VtYmx5LCBieQotICAgb2JqX3JlYWRfYmVnaW5faG9vay4gICovCi1leHRlcm4gdm9pZCBlY29mZl9yZWFkX2JlZ2luX2hvb2sgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN3aXRjaGVzIHRvIGEgbmV3Ci0gICBmaWxlLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX25ld19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIG5ldyBzeW1ib2wgaXMgY3JlYXRlZCwgYnkKLSAgIG9ial9zeW1ib2xfbmV3X2hvb2suICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIG9ial9mcm9iX3N5bWJvbCBob29rLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBCdWlsZCB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5Ci0gICBvYmpfZnJvYl9maWxlLiAgVGhpcyBmaWxscyBpbiB0aGUgY291bnRzIGluICpIRFI7IHRoZSBvZmZzZXRzIGFyZQotICAgZmlsbGVkIGluIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgKkJVRlAuICBJdCBzZXRzICpCVUZQIHRvIGEKLSAgIGJsb2NrIG9mIG1lbW9yeSBob2xkaW5nIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJdCByZXR1cm5zIHRoZQotICAgbGVuZ3RoIG9mICpCVUZQLiAgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2RlYnVnCi0gIFBBUkFNUyAoKEhEUlIgKmhkciwgY2hhciAqKmJ1ZnAsIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICopKTsKLQotLyogRnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgRUNPRkYgZGVidWdnaW5nIGRpcmVjdGl2ZXMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2JlZ2luIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2JlbmQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZW5kIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2VudCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9mbWFzayBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9sb2MgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfbWFzayBQQVJBTVMgKChpbnQpKTsKLQotLyogT3RoZXIgRUNPRkYgZGlyZWN0aXZlcy4gICovCi1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZXh0ZXJuIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIENPRkYgZGVidWdnaW5nIGRpcmVjdGl2ZXMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2RlZiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9kaW0gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZW5kZWYgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZmlsZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9zY2wgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfc2l6ZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV90YWcgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfdHlwZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV92YWwgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEhhbmRsZSBzdGFicy4gICovCi1leHRlcm4gdm9pZCBlY29mZl9zdGFiIFBBUkFNUyAoKHNlZ1Qgc2VjLCBpbnQgd2hhdCwgY29uc3QgY2hhciAqc3RyaW5nLAotCQkJCWludCB0eXBlLCBpbnQgb3RoZXIsIGludCBkZXNjKSk7Ci0KLS8qIFNldCB0aGUgR1AgcHJvbG9ndWUgc2l6ZS4gICovCi1leHRlcm4gdm9pZCBlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUgUEFSQU1TICgoaW50IHN6KSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB0aGUgRUNPRkYgY29kZSB0byBzZXQgdGhlIGV4dGVybmFsCi0gICBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotI2lmbmRlZiBvYmpfZWNvZmZfc2V0X2V4dAotZXh0ZXJuIHZvaWQgb2JqX2Vjb2ZmX3NldF9leHQgUEFSQU1TICgoc3ltYm9sUyAqLCBFWFRSICopKTsKLSNlbmRpZgotCi0vKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwYXRjaCB1cCBhIGxpbmUgbnVtYmVyIGRpcmVjdGl2ZSB3aGVuCi0gICBpbnN0cnVjdGlvbnMgYXJlIG1vdmVkIGFyb3VuZC4gICovCi1leHRlcm4gdm9pZCBlY29mZl9maXhfbG9jIFBBUkFNUyAoKGZyYWdTICosIHVuc2lnbmVkIGxvbmcpKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSByZWFkLmMgdG8gcGVlayBhdCBjdXJfZmlsZV9wdHIuICAqLwotZXh0ZXJuIGludCBlY29mZl9ub19jdXJyZW50X2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcHJvYy4gICovCi1leHRlcm4gc3ltYm9sUyAqZWNvZmZfZ2V0X2N1cl9wcm9jX3N5bSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiBFQ09GRl9ERUJVR0dJTkcgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHJlYWQuYyB0byBnZW5lcmF0ZSBsaW5lIG51bWJlciBmb3IgLnMgZmlsZS4gICovCi1leHRlcm4gdm9pZCBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qICEgR0FTX0VDT0ZGX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9laG9wdC5jIGIvZ2FzL2Vob3B0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTVmNjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2Vob3B0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyogZWhvcHQuYy0tb3B0aW1pemUgZ2NjIGV4Y2VwdGlvbiBmcmFtZSBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotLyogV2UgaW5jbHVkZSB0aGlzIEVMRiBmaWxlLCBldmVuIHRob3VnaCB3ZSBtYXkgbm90IGJlIGFzc2VtYmxpbmcgZm9yCi0gICBFTEYsIHNpbmNlIHRoZSBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gaXMgYWx3YXlzIGluIGEgZm9ybWF0Ci0gICBkZXJpdmVkIGZyb20gRFdBUkYuICAqLwotCi0jaW5jbHVkZSAiZWxmL2R3YXJmMi5oIgotCi0vKiBUcnkgdG8gb3B0aW1pemUgZ2NjIDIuOCBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24uCi0KLSAgIEV4Y2VwdGlvbiBmcmFtZSBpbmZvcm1hdGlvbiBpcyBlbWl0dGVkIGZvciBldmVyeSBmdW5jdGlvbiBpbiB0aGUKLSAgIC5laF9mcmFtZSBzZWN0aW9uLiAgU2ltcGxlIGluZm9ybWF0aW9uIGZvciBhIGZ1bmN0aW9uIHdpdGggbm8KLSAgIGV4Y2VwdGlvbnMgbG9va3MgbGlrZSB0aGlzOgotCi1fX0ZSQU1FX0JFR0lOX186Ci0JLjRieXRlCS5MTENJRTEJLyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5Ci0uTFNDSUUxOgotCS40Ynl0ZQkweDAJLyBDSUUgSWRlbnRpZmllciBUYWcKLQkuYnl0ZQkweDEJLyBDSUUgVmVyc2lvbgotCS5ieXRlCTB4MAkvIENJRSBBdWdtZW50YXRpb24gKG5vbmUpCi0JLmJ5dGUJMHgxCS8gVUxFQjEyOCAweDEgKENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IpCi0JLmJ5dGUJMHg3YwkvIFNMRUIxMjggLTQgKENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IpCi0JLmJ5dGUJMHg4CS8gQ0lFIFJBIENvbHVtbgotCS5ieXRlCTB4YwkvIERXX0NGQV9kZWZfY2ZhCi0JLmJ5dGUJMHg0CS8gVUxFQjEyOCAweDQKLQkuYnl0ZQkweDQJLyBVTEVCMTI4IDB4NAotCS5ieXRlCTB4ODgJLyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg4Ci0JLmJ5dGUJMHgxCS8gVUxFQjEyOCAweDEKLQkuYWxpZ24gNAotLkxFQ0lFMToKLQkuc2V0CS5MTENJRTEsLkxFQ0lFMS0uTFNDSUUxCS8gQ0lFIExlbmd0aCBTeW1ib2wKLQkuNGJ5dGUJLkxMRkRFMQkvIEZERSBMZW5ndGgKLS5MU0ZERTE6Ci0JLjRieXRlCS5MU0ZERTEtX19GUkFNRV9CRUdJTl9fCS8gRkRFIENJRSBvZmZzZXQKLQkuNGJ5dGUJLkxGQjEJLyBGREUgaW5pdGlhbCBsb2NhdGlvbgotCS40Ynl0ZQkuTEZFMS0uTEZCMQkvIEZERSBhZGRyZXNzIHJhbmdlCi0JLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkuTENGSTAtLkxGQjEKLQkuYnl0ZQkweGUJLyBEV19DRkFfZGVmX2NmYV9vZmZzZXQKLQkuYnl0ZQkweDgJLyBVTEVCMTI4IDB4OAotCS5ieXRlCTB4ODUJLyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg1Ci0JLmJ5dGUJMHgyCS8gVUxFQjEyOCAweDIKLQkuYnl0ZQkweDQJLyBEV19DRkFfYWR2YW5jZV9sb2M0Ci0JLjRieXRlCS5MQ0ZJMS0uTENGSTAKLQkuYnl0ZQkweGQJLyBEV19DRkFfZGVmX2NmYV9yZWdpc3RlcgotCS5ieXRlCTB4NQkvIFVMRUIxMjggMHg1Ci0JLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkuTENGSTItLkxDRkkxCi0JLmJ5dGUJMHgyZQkvIERXX0NGQV9HTlVfYXJnc19zaXplCi0JLmJ5dGUJMHg0CS8gVUxFQjEyOCAweDQKLQkuYnl0ZQkweDQJLyBEV19DRkFfYWR2YW5jZV9sb2M0Ci0JLjRieXRlCS5MQ0ZJMy0uTENGSTIKLQkuYnl0ZQkweDJlCS8gRFdfQ0ZBX0dOVV9hcmdzX3NpemUKLQkuYnl0ZQkweDAJLyBVTEVCMTI4IDB4MAotCS5hbGlnbiA0Ci0uTEVGREUxOgotCS5zZXQJLkxMRkRFMSwuTEVGREUxLS5MU0ZERTEJLyBGREUgTGVuZ3RoIFN5bWJvbAotCi0gICBUaGUgaW1tZWRpYXRlIGlzc3VlIHdlIGNhbiBhZGRyZXNzIGluIHRoZSBhc3NlbWJsZXIgaXMgdGhlCi0gICBEV19DRkFfYWR2YW5jZV9sb2M0IGZvbGxvd2VkIGJ5IGEgZm91ciBieXRlIHZhbHVlLiAgVGhlIHZhbHVlIGlzCi0gICB0aGUgZGlmZmVyZW5jZSBvZiB0d28gYWRkcmVzc2VzIGluIHRoZSBmdW5jdGlvbi4gIFNpbmNlIGdjYyBkb2VzCi0gICBub3Qga25vdyB0aGlzIHZhbHVlLCBpdCBhbHdheXMgdXNlcyBmb3VyIGJ5dGVzLiAgV2Ugd2lsbCBrbm93IHRoZQotICAgdmFsdWUgYXQgdGhlIGVuZCBvZiBhc3NlbWJseSwgc28gd2UgY2FuIGRvIGJldHRlci4gICovCi0KLXN0YXRpYyBpbnQgZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBHZXQgdGhlIGNvZGUgYWxpZ25tZW50IGZhY3RvciBmcm9tIHRoZSBDSUUuICAqLwotCi1zdGF0aWMgaW50Ci1laF9mcmFtZV9jb2RlX2FsaWdubWVudCAoKQotewotICBzdGF0aWMgaW50IGNvZGVfYWxpZ25tZW50OwotICBzZWdUIGN1cnJlbnRfc2VnOwotICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnOwotICBmcmFnUyAqZjsKLSAgZml4UyAqZml4OwotICBpbnQgb2Zmc2V0OwotICBjaGFyIGF1Z21lbnRhdGlvblsxMF07Ci0gIGludCBpYXVnOwotCi0gIGlmIChjb2RlX2FsaWdubWVudCAhPSAwKQotICAgIHJldHVybiBjb2RlX2FsaWdubWVudDsKLQotICAvKiBXZSBzaG91bGQgZmluZCB0aGUgQ0lFIGF0IHRoZSBzdGFydCBvZiB0aGUgLmVoX2ZyYW1lIHNlY3Rpb24uICAqLwotCi0gIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLSAgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBzdWJzZWdfbmV3ICgiLmVoX2ZyYW1lIiwgMCk7Ci0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykKLSAgZiA9IHNlZ19pbmZvIChub3dfc2VnKS0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSNlbHNlCi0gIGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OwotI2VuZGlmCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmaXggPSBzZWdfaW5mbyAobm93X3NlZyktPmZyY2hhaW5QLT5maXhfcm9vdDsKLSNlbHNlCi0gIGZpeCA9ICpzZWdfZml4X3Jvb3RQOwotI2VuZGlmCi0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBmcmFncyBvZiB0aGUgc2VjdGlvbiB0byBmaW5kIHRoZSBjb2RlIGFsaWdubWVudC4gICovCi0KLSAgLyogRmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIENJRSBJZGVudGlmaWVyIFRhZyBpcyAwLiAgKi8KLQotICBvZmZzZXQgPSA0OwotICB3aGlsZSAoZiAhPSBOVUxMICYmIG9mZnNldCA+PSBmLT5mcl9maXgpCi0gICAgewotICAgICAgb2Zmc2V0IC09IGYtPmZyX2ZpeDsKLSAgICAgIGYgPSBmLT5mcl9uZXh0OwotICAgIH0KLSAgaWYgKGYgPT0gTlVMTAotICAgICAgfHwgZi0+ZnJfZml4IC0gb2Zmc2V0IDwgNAotICAgICAgfHwgZi0+ZnJfbGl0ZXJhbFtvZmZzZXRdICE9IDAKLSAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gIT0gMAotICAgICAgfHwgZi0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSAhPSAwCi0gICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldCArIDNdICE9IDApCi0gICAgewotICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogTmV4dCBtYWtlIHN1cmUgdGhlIENJRSB2ZXJzaW9uIG51bWJlciBpcyAxLiAgKi8KLQotICBvZmZzZXQgKz0gNDsKLSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQotICAgIHsKLSAgICAgIG9mZnNldCAtPSBmLT5mcl9maXg7Ci0gICAgICBmID0gZi0+ZnJfbmV4dDsKLSAgICB9Ci0gIGlmIChmID09IE5VTEwKLSAgICAgIHx8IGYtPmZyX2ZpeCAtIG9mZnNldCA8IDEKLSAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0XSAhPSAxKQotICAgIHsKLSAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGF1Z21lbnRhdGlvbiAoYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nKS4gICovCi0KLSAgaWF1ZyA9IDA7Ci0gICsrb2Zmc2V0OwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoZiAhPSBOVUxMICYmIG9mZnNldCA+PSBmLT5mcl9maXgpCi0JewotCSAgb2Zmc2V0IC09IGYtPmZyX2ZpeDsKLQkgIGYgPSBmLT5mcl9uZXh0OwotCX0KLSAgICAgIGlmIChmID09IE5VTEwpCi0JewotCSAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICB3aGlsZSAob2Zmc2V0IDwgZi0+ZnJfZml4ICYmIGYtPmZyX2xpdGVyYWxbb2Zmc2V0XSAhPSAnXDAnKQotCXsKLQkgIGlmICgoc2l6ZV90KSBpYXVnIDwgKHNpemVvZiBhdWdtZW50YXRpb24pIC0gMSkKLQkgICAgewotCSAgICAgIGF1Z21lbnRhdGlvbltpYXVnXSA9IGYtPmZyX2xpdGVyYWxbb2Zmc2V0XTsKLQkgICAgICArK2lhdWc7Ci0JICAgIH0KLQkgICsrb2Zmc2V0OwotCX0KLSAgICAgIGlmIChvZmZzZXQgPCBmLT5mcl9maXgpCi0JYnJlYWs7Ci0gICAgfQotICArK29mZnNldDsKLSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQotICAgIHsKLSAgICAgIG9mZnNldCAtPSBmLT5mcl9maXg7Ci0gICAgICBmID0gZi0+ZnJfbmV4dDsKLSAgICB9Ci0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgYXVnbWVudGF0aW9uW2lhdWddID0gJ1wwJzsKLSAgaWYgKGF1Z21lbnRhdGlvblswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIE5vIGF1Z21lbnRhdGlvbi4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGF1Z21lbnRhdGlvbiwgImVoIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIHNraXAgYSBwb2ludGVyLiAgVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3Qga25vdyBob3cKLQkgbGFyZ2UgaXQgaXMuICBXZSBmaW5kIG91dCBieSBsb29raW5nIGZvciBhIG1hdGNoaW5nIGZpeHVwLiAgKi8KLSAgICAgIHdoaWxlIChmaXggIT0gTlVMTAotCSAgICAgJiYgKGZpeC0+ZnhfZnJhZyAhPSBmIHx8IGZpeC0+Znhfd2hlcmUgIT0gb2Zmc2V0KSkKLQlmaXggPSBmaXgtPmZ4X25leHQ7Ci0gICAgICBpZiAoZml4ID09IE5VTEwpCi0Jb2Zmc2V0ICs9IDQ7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0ICs9IGZpeC0+Znhfc2l6ZTsKLSAgICAgIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKLQl7Ci0JICBvZmZzZXQgLT0gZi0+ZnJfZml4OwotCSAgZiA9IGYtPmZyX25leHQ7Ci0JfQotICAgICAgaWYgKGYgPT0gTlVMTCkKLQl7Ci0JICBjb2RlX2FsaWdubWVudCA9IC0xOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb2RlX2FsaWdubWVudCA9IC0xOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBXZSdyZSBub3cgYXQgdGhlIGNvZGUgYWxpZ25tZW50IGZhY3Rvciwgd2hpY2ggaXMgYSBVTEVCMTI4LiAgSWYKLSAgICAgaXQgaXNuJ3QgYSBzaW5nbGUgYnl0ZSwgZm9yZ2V0IGl0LiAgKi8KLQotICBjb2RlX2FsaWdubWVudCA9IGYtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0gIGlmICgoY29kZV9hbGlnbm1lbnQgJiAweDgwKSAhPSAwIHx8IGNvZGVfYWxpZ25tZW50ID09IDApCi0gICAgewotICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNvZGVfYWxpZ25tZW50OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGVtaXRfZXhwci4gIEl0IGxvb2tzIGZvciBjYXNlcyB3aGljaAotICAgd2UgY2FuIG9wdGltaXplLgotCi0gICBSYXRoZXIgdGhhbiB0cnkgdG8gcGFyc2UgYWxsIHRoaXMgaW5mb3JtYXRpb24gYXMgd2UgcmVhZCBpdCwgd2UKLSAgIGxvb2sgZm9yIGEgc2luZ2xlIGJ5dGUgRFdfQ0ZBX2FkdmFuY2VfbG9jNCBmb2xsb3dlZCBieSBhIDQgYnl0ZQotICAgZGlmZmVyZW5jZS4gIFdlIHR1cm4gdGhhdCBpbnRvIGEgcnNfY2ZhX2FkdmFuY2UgZnJhZywgYW5kIGhhbmRsZQotICAgdGhvc2UgZnJhZ3MgYXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkuICBJZiB0aGUgZ2NjIG91dHB1dCBjaGFuZ2VzCi0gICBzb21ld2hhdCwgdGhpcyBvcHRpbWl6YXRpb24gbWF5IHN0b3Agd29ya2luZy4KLQotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIGlmIGl0IGhhbmRsZWQgdGhlIGV4cHJlc3Npb24gYW5kCi0gICBlbWl0X2V4cHIgc2hvdWxkIG5vdCBkbyBhbnl0aGluZywgb3IgemVybyBvdGhlcndpc2UuICBJdCBjYW4gYWxzbwotICAgY2hhbmdlICpFWFAgYW5kICpQTkJZVEVTLiAgKi8KLQotaW50Ci1jaGVja19laF9mcmFtZSAoZXhwLCBwbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICB1bnNpZ25lZCBpbnQgKnBuYnl0ZXM7Ci17Ci0gIHN0YXRpYyBpbnQgc2F3X3NpemU7Ci0gIHN0YXRpYyBzeW1ib2xTICpzaXplX2VuZF9zeW07Ci0gIHN0YXRpYyBpbnQgc2F3X2FkdmFuY2VfbG9jNDsKLSAgc3RhdGljIGZyYWdTICpsb2M0X2ZyYWc7Ci0gIHN0YXRpYyBpbnQgbG9jNF9maXg7Ci0KLSAgaWYgKHNhd19zaXplCi0gICAgICAmJiBTX0lTX0RFRklORUQgKHNpemVfZW5kX3N5bSkpCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBjb21lIHRvIHRoZSBlbmQgb2YgdGhlIENJRSBvciBGREUuICBTZWUgYmVsb3cgd2hlcmUKLSAgICAgICAgIHdlIHNldCBzYXdfc2l6ZS4gIFdlIG11c3QgY2hlY2sgdGhpcyBmaXJzdCBiZWNhdXNlIHdlIG1heSBub3cKLSAgICAgICAgIGJlIGxvb2tpbmcgYXQgdGhlIG5leHQgc2l6ZS4gICovCi0gICAgICBzYXdfc2l6ZSA9IDA7Ci0gICAgICBzYXdfYWR2YW5jZV9sb2M0ID0gMDsKLSAgICB9Ci0KLSAgaWYgKGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0KQotICAgIHsKLSAgICAgIC8qIERvbid0IG9wdGltaXplLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5laF9mcmFtZSIpICE9IDApCi0gICAgewotICAgICAgc2F3X3NpemUgPSAwOwotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0gICAgfQotICBlbHNlIGlmICghIHNhd19zaXplCi0JICAgJiYgKnBuYnl0ZXMgPT0gNCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG1pZ2h0IGJlIHRoZSBzaXplIG9mIHRoZSBDSUUgb3IgRkRFLiAgV2Ugd2FudCB0byBrbm93Ci0gICAgICAgICB0aGUgc2l6ZSBzbyB0aGF0IHdlIGRvbid0IGFjY2lkZW50YWxseSBvcHRpbWl6ZSBhY3Jvc3MgYW4gRkRFCi0gICAgICAgICBib3VuZGFyeS4gIFdlIHJlY29nbml6ZSB0aGUgc2l6ZSBpbiBvbmUgb2YgdHdvIGZvcm1zOiBhCi0gICAgICAgICBzeW1ib2wgd2hpY2ggd2lsbCBsYXRlciBiZSBkZWZpbmVkIGFzIGEgZGlmZmVyZW5jZSwgb3IgYQotICAgICAgICAgc3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMuICBFaXRoZXIgd2F5LCB3ZSBjYW4gdGVsbCB3aGVuIHdlCi0gICAgICAgICBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgRkRFIGJlY2F1c2UgdGhlIHN5bWJvbCBiZWNvbWVzIGRlZmluZWQKLSAgICAgICAgIChpbiB0aGUgY2FzZSBvZiBhIHN1YnRyYWN0aW9uLCB0aGUgZW5kIHN5bWJvbCwgZnJvbSB3aGljaCB0aGUKLSAgICAgICAgIHN0YXJ0IHN5bWJvbCBpcyBiZWluZyBzdWJ0cmFjdGVkKS4gIE90aGVyIHdheXMgb2YgZGVzY3JpYmluZwotICAgICAgICAgdGhlIHNpemUgd2lsbCBub3QgYmUgb3B0aW1pemVkLiAgKi8KLSAgICAgIGlmICgoZXhwLT5YX29wID09IE9fc3ltYm9sIHx8IGV4cC0+WF9vcCA9PSBPX3N1YnRyYWN0KQotCSAgJiYgISBTX0lTX0RFRklORUQgKGV4cC0+WF9hZGRfc3ltYm9sKSkKLQl7Ci0JICBzYXdfc2l6ZSA9IDE7Ci0JICBzaXplX2VuZF9zeW0gPSBleHAtPlhfYWRkX3N5bWJvbDsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzYXdfc2l6ZQotCSAgICYmICpwbmJ5dGVzID09IDEKLQkgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IERXX0NGQV9hZHZhbmNlX2xvYzQpCi0gICAgewotICAgICAgLyogVGhpcyBtaWdodCBiZSBhIERXX0NGQV9hZHZhbmNlX2xvYzQuICBSZWNvcmQgdGhlIGZyYWcgYW5kIHRoZQotICAgICAgICAgcG9zaXRpb24gd2l0aGluIHRoZSBmcmFnLCBzbyB0aGF0IHdlIGNhbiBjaGFuZ2UgaXQgbGF0ZXIuICAqLwotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDE7Ci0gICAgICBmcmFnX2dyb3cgKDEpOwotICAgICAgbG9jNF9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBsb2M0X2ZpeCA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHNhd19hZHZhbmNlX2xvYzQKLQkgICAmJiAqcG5ieXRlcyA9PSA0Ci0JICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaW50IGNhOwotCi0gICAgICAvKiBUaGlzIGlzIGEgY2FzZSB3aGljaCB3ZSBjYW4gb3B0aW1pemUuICBUaGUgdHdvIHN5bWJvbHMgYmVpbmcKLSAgICAgICAgIHN1YnRyYWN0ZWQgd2VyZSBpbiB0aGUgc2FtZSBmcmFnIGFuZCB0aGUgZXhwcmVzc2lvbiB3YXMKLSAgICAgICAgIHJlZHVjZWQgdG8gYSBjb25zdGFudC4gIFdlIGNhbiBkbyB0aGUgb3B0aW1pemF0aW9uIGVudGlyZWx5Ci0gICAgICAgICBpbiB0aGlzIGZ1bmN0aW9uLiAgKi8KLQotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0KLSAgICAgIGNhID0gZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCk7Ci0gICAgICBpZiAoY2EgPCAwKQotCXsKLQkgIC8qIERvbid0IG9wdGltaXplLiAgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChleHAtPlhfYWRkX251bWJlciAlIGNhID09IDAKLQkgICAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgLyBjYSA8IDB4NDApCi0JewotCSAgbG9jNF9mcmFnLT5mcl9saXRlcmFsW2xvYzRfZml4XQotCSAgICA9IERXX0NGQV9hZHZhbmNlX2xvYyB8IChleHAtPlhfYWRkX251bWJlciAvIGNhKTsKLQkgIC8qIE5vIG1vcmUgYnl0ZXMgbmVlZGVkLiAgKi8KLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cC0+WF9hZGRfbnVtYmVyIDwgMHgxMDApCi0JewotCSAgbG9jNF9mcmFnLT5mcl9saXRlcmFsW2xvYzRfZml4XSA9IERXX0NGQV9hZHZhbmNlX2xvYzE7Ci0JICAqcG5ieXRlcyA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5YX2FkZF9udW1iZXIgPCAweDEwMDAwKQotCXsKLQkgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MyOwotCSAgKnBuYnl0ZXMgPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHNhd19hZHZhbmNlX2xvYzQKLQkgICAmJiAqcG5ieXRlcyA9PSA0Ci0JICAgJiYgZXhwLT5YX29wID09IE9fc3VidHJhY3QpCi0gICAgewotCi0gICAgICAvKiBUaGlzIGlzIGEgY2FzZSB3ZSBjYW4gb3B0aW1pemUuICBUaGUgZXhwcmVzc2lvbiB3YXMgbm90Ci0gICAgICAgICByZWR1Y2VkLCBzbyB3ZSBjYW4gbm90IGZpbmlzaCB0aGUgb3B0aW1pemF0aW9uIHVudGlsIHRoZSBlbmQKLSAgICAgICAgIG9mIHRoZSBhc3NlbWJseS4gIFdlIHNldCB1cCBhIHZhcmlhbnQgZnJhZyB3aGljaCB3ZSBoYW5kbGUKLSAgICAgICAgIGxhdGVyLiAgKi8KLQotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0KLSAgICAgIGZyYWdfdmFyIChyc19jZmEsIDQsIDAsIDAsIG1ha2VfZXhwcl9zeW1ib2wgKGV4cCksCi0JCWxvYzRfZml4LCAoY2hhciAqKSBsb2M0X2ZyYWcpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzYXdfYWR2YW5jZV9sb2M0ID0gMDsKLQotICByZXR1cm4gMDsKLX0KLQotLyogVGhlIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgc2l6ZSBvZiBhIHJzX2NmYSB2YXJpYW50IGZyYWcgYmFzZWQgb24KLSAgIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgc3ltYm9scy4gIEl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlCi0gICByZWxheGF0aW9uIGxvb3AuICBXZSBzZXQgZnJfc3VidHlwZSB0byB0aGUgZXhwZWN0ZWQgbGVuZ3RoLiAgKi8KLQotaW50Ci1laF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGludCBjYTsKLSAgb2Zmc2V0VCBkaWZmOwotICBpbnQgcmV0OwotCi0gIGNhID0gZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCk7Ci0gIGRpZmYgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZnJhZy0+ZnJfc3ltYm9sLCAwKTsKLQotICBpZiAoY2EgPCAwKQotICAgIHJldCA9IDQ7Ci0gIGVsc2UgaWYgKGRpZmYgJSBjYSA9PSAwICYmIGRpZmYgLyBjYSA8IDB4NDApCi0gICAgcmV0ID0gMDsKLSAgZWxzZSBpZiAoZGlmZiA8IDB4MTAwKQotICAgIHJldCA9IDE7Ci0gIGVsc2UgaWYgKGRpZmYgPCAweDEwMDAwKQotICAgIHJldCA9IDI7Ci0gIGVsc2UKLSAgICByZXQgPSA0OwotCi0gIGZyYWctPmZyX3N1YnR5cGUgPSByZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZWxheGVzIGEgcnNfY2ZhIHZhcmlhbnQgZnJhZyBiYXNlZCBvbiB0aGUgY3VycmVudAotICAgdmFsdWVzIG9mIHRoZSBzeW1ib2xzLiAgZnJfc3VidHlwZSBpcyB0aGUgY3VycmVudCBsZW5ndGggb2YgdGhlCi0gICBmcmFnLiAgVGhpcyByZXR1cm5zIHRoZSBjaGFuZ2UgaW4gZnJhZyBsZW5ndGguICAqLwotCi1pbnQKLWVoX2ZyYW1lX3JlbGF4X2ZyYWcgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBpbnQgb2xkc2l6ZSwgbmV3c2l6ZTsKLQotICBvbGRzaXplID0gZnJhZy0+ZnJfc3VidHlwZTsKLSAgbmV3c2l6ZSA9IGVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnKTsKLSAgcmV0dXJuIG5ld3NpemUgLSBvbGRzaXplOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgcnNfY2ZhIHZhcmlhbnQgZnJhZyBpbnRvIGEgbm9ybWFsIGZpbGwKLSAgIGZyYWcuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgcmVsYXhhdGlvbiBoYXMgYmVlbiBkb25lLgotICAgZnJfc3VidHlwZSB3aWxsIGJlIHRoZSBkZXNpcmVkIGxlbmd0aCBvZiB0aGUgZnJhZy4gICovCi0KLXZvaWQKLWVoX2ZyYW1lX2NvbnZlcnRfZnJhZyAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIG9mZnNldFQgZGlmZjsKLSAgZnJhZ1MgKmxvYzRfZnJhZzsKLSAgaW50IGxvYzRfZml4OwotCi0gIGxvYzRfZnJhZyA9IChmcmFnUyAqKSBmcmFnLT5mcl9vcGNvZGU7Ci0gIGxvYzRfZml4ID0gKGludCkgZnJhZy0+ZnJfb2Zmc2V0OwotCi0gIGRpZmYgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZnJhZy0+ZnJfc3ltYm9sLCAxKTsKLQotICBpZiAoZnJhZy0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGludCBjYTsKLQotICAgICAgY2EgPSBlaF9mcmFtZV9jb2RlX2FsaWdubWVudCAoKTsKLSAgICAgIGFzc2VydCAoY2EgPiAwICYmIGRpZmYgJSBjYSA9PSAwICYmIGRpZmYgLyBjYSA8IDB4NDApOwotICAgICAgbG9jNF9mcmFnLT5mcl9saXRlcmFsW2xvYzRfZml4XSA9IERXX0NGQV9hZHZhbmNlX2xvYyB8IChkaWZmIC8gY2EpOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZy0+ZnJfc3VidHlwZSA9PSAxKQotICAgIHsKLSAgICAgIGFzc2VydCAoZGlmZiA8IDB4MTAwKTsKLSAgICAgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MxOwotICAgICAgZnJhZy0+ZnJfbGl0ZXJhbFtmcmFnLT5mcl9maXhdID0gZGlmZjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWctPmZyX3N1YnR5cGUgPT0gMikKLSAgICB7Ci0gICAgICBhc3NlcnQgKGRpZmYgPCAweDEwMDAwKTsKLSAgICAgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MyOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnLT5mcl9saXRlcmFsICsgZnJhZy0+ZnJfZml4LCBkaWZmLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWctPmZyX2xpdGVyYWwgKyBmcmFnLT5mcl9maXgsIGRpZmYsIDQpOwotCi0gIGZyYWctPmZyX2ZpeCArPSBmcmFnLT5mcl9zdWJ0eXBlOwotICBmcmFnLT5mcl90eXBlID0gcnNfZmlsbDsKLSAgZnJhZy0+ZnJfb2Zmc2V0ID0gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9lbXVsLXRhcmdldC5oIGIvZ2FzL2VtdWwtdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MDQwNTAuLjAwMDAwMDAKLS0tIGEvZ2FzL2VtdWwtdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jaWZuZGVmIGVtdWxfaW5pdAotI2RlZmluZSBlbXVsX2luaXQJCQljb21tb25fZW11bF9pbml0Ci0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJCQlkZWZhdWx0X2VtdWxfYmZkX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfbG9jYWxfbGFiZWxzX2ZiCi0jZGVmaW5lIGVtdWxfbG9jYWxfbGFiZWxzX2ZiCQkwCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2xvY2FsX2xhYmVsc19kb2xsYXIKLSNkZWZpbmUgZW11bF9sb2NhbF9sYWJlbHNfZG9sbGFyCTAKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlCi0jZGVmaW5lIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlCQkyCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX3N0cmlwX3VuZGVyc2NvcmUKLSNkZWZpbmUgZW11bF9zdHJpcF91bmRlcnNjb3JlCQkwCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2RlZmF1bHRfZW5kaWFuCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4JCTIKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfZmFrZV9sYWJlbF9uYW1lCi0jZGVmaW5lIGVtdWxfZmFrZV9sYWJlbF9uYW1lCQkwCi0jZW5kaWYKLQotc3RydWN0IGVtdWxhdGlvbiBlbXVsX3N0cnVjdF9uYW1lID0gewotICAwLAotICBlbXVsX25hbWUsCi0gIGVtdWxfaW5pdCwKLSAgZW11bF9iZmRfbmFtZSwKLSAgZW11bF9sb2NhbF9sYWJlbHNfZmIsIGVtdWxfbG9jYWxfbGFiZWxzX2RvbGxhciwKLSAgZW11bF9sZWFkaW5nX3VuZGVyc2NvcmUsIGVtdWxfc3RyaXBfdW5kZXJzY29yZSwKLSAgZW11bF9kZWZhdWx0X2VuZGlhbiwKLSAgZW11bF9mYWtlX2xhYmVsX25hbWUsCi0gIGVtdWxfZm9ybWF0LAotfTsKZGlmZiAtLWdpdCBhL2dhcy9lbXVsLmggYi9nYXMvZW11bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2M0NmQ4Li4wMDAwMDAwCi0tLSBhL2dhcy9lbXVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jaWZuZGVmIEVNVUxfREVGUwotI2RlZmluZSBFTVVMX0RFRlMKLQotc3RydWN0IGVtdWxhdGlvbiB7Ci0gIHZvaWQgKCptYXRjaCkgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHZvaWQgKCppbml0KSBQQVJBTVMgKCh2b2lkKSk7Ci0gIGNvbnN0IGNoYXIgKigqYmZkX25hbWUpIFBBUkFNUyAoKHZvaWQpKTsKLSAgdW5zaWduZWQgbG9jYWxfbGFiZWxzX2ZiIDogMTsKLSAgdW5zaWduZWQgbG9jYWxfbGFiZWxzX2RvbGxhciA6IDE7Ci0gIHVuc2lnbmVkIGxlYWRpbmdfdW5kZXJzY29yZSA6IDI7Ci0gIHVuc2lnbmVkIHN0cmlwX3VuZGVyc2NvcmUgOiAxOwotICB1bnNpZ25lZCBkZWZhdWx0X2VuZGlhbiA6IDI7Ci0gIGNvbnN0IGNoYXIgKmZha2VfbGFiZWxfbmFtZTsKLSAgY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgKmZvcm1hdDsKLX07Ci0KLUNPTU1PTiBzdHJ1Y3QgZW11bGF0aW9uICp0aGlzX2VtdWxhdGlvbjsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlZmF1bHRfZW11bF9iZmRfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBjb21tb25fZW11bF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvZXhwci5jIGIvZ2FzL2V4cHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjYTQzNy4uMDAwMDAwMAotLS0gYS9nYXMvZXhwci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyMCArMCwwIEBACi0vKiBleHByLmMgLW9wZXJhbmRzLCBleHByZXNzaW9ucy0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0gKiBUaGlzIGlzIHJlYWxseSBhIGJyYW5jaCBvZmZpY2Ugb2YgYXMtcmVhZC5jLiBJIHNwbGl0IGl0IG91dCB0byBjbGVhcmx5Ci0gKiBkaXN0aW5ndWlzaCB0aGUgd29ybGQgb2YgZXhwcmVzc2lvbnMgZnJvbSB0aGUgd29ybGQgb2Ygc3RhdGVtZW50cy4KLSAqIChJdCBhbHNvIGdpdmVzIHNtYWxsZXIgZmlsZXMgdG8gcmUtY29tcGlsZS4pCi0gKiBIZXJlLCAib3BlcmFuZCJzIGFyZSBvZiBleHByZXNzaW9ucywgbm90IGluc3RydWN0aW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgbWluKGEsIGIpICAgICAgICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotc3RhdGljIHZvaWQgZmxvYXRpbmdfY29uc3RhbnQgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotc3RhdGljIHZhbHVlVCBnZW5lcmljX2JpZ251bV90b19pbnQzMiBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZkZWYgQkZENjQKLXN0YXRpYyB2YWx1ZVQgZ2VuZXJpY19iaWdudW1fdG9faW50NjQgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBpbnRlZ2VyX2NvbnN0YW50IFBBUkFNUyAoKGludCByYWRpeCwgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotc3RhdGljIHZvaWQgbXJpX2NoYXJfY29uc3RhbnQgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgY3VycmVudF9sb2NhdGlvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBjbGVhbl91cF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLXN0YXRpYyBzZWdUIG9wZXJhbmQgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIG9wZXJhdG9yVCBvcGVyYXRvciBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiBjb25zdCBjaGFyIEVYUF9DSEFSU1tdLCBGTFRfQ0hBUlNbXTsKLQotLyogV2Uga2VlcCBhIG1hcHBpbmcgb2YgZXhwcmVzc2lvbiBzeW1ib2xzIHRvIGZpbGUgcG9zaXRpb25zLCBzbyB0aGF0Ci0gICB3ZSBjYW4gcHJvdmlkZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuICAqLwotCi1zdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZQotewotICBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqbmV4dDsKLSAgc3ltYm9sUyAqc3ltOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqZXhwcl9zeW1ib2xfbGluZXM7Ci0MCi0vKiBCdWlsZCBhIGR1bW15IHN5bWJvbCB0byBob2xkIGEgY29tcGxleCBleHByZXNzaW9uLiAgVGhpcyBpcyBob3cgd2UKLSAgIGJ1aWxkIGV4cHJlc3Npb25zIHVwIG91dCBvZiBvdGhlciBleHByZXNzaW9ucy4gIFRoZSBzeW1ib2wgaXMgcHV0Ci0gICBpbnRvIHRoZSBmYWtlIHNlY3Rpb24gZXhwcl9zZWN0aW9uLiAgKi8KLQotc3ltYm9sUyAqCi1tYWtlX2V4cHJfc3ltYm9sIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBleHByZXNzaW9uUyB6ZXJvOwotICBjb25zdCBjaGFyICpmYWtlOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqbjsKLQotICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPT0gMCkKLSAgICByZXR1cm4gZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbDsKLQotICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgLyogVGhpcyB3b24ndCB3b3JrLCBiZWNhdXNlIHRoZSBhY3R1YWwgdmFsdWUgaXMgc3RvcmVkIGluCi0gICAgICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciBvciBnZW5lcmljX2JpZ251bSwgYW5kIHdlIGFyZQotICAgICAgICAgZ29pbmcgdG8gbG9zZSBpdCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICB6ZXJvLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgemVyby5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgemVyby5YX3Vuc2lnbmVkID0gMDsKLSAgICAgIGNsZWFuX3VwX2V4cHJlc3Npb24gKCZ6ZXJvKTsKLSAgICAgIGV4cHJlc3Npb25QID0gJnplcm87Ci0gICAgfQotCi0gIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7Ci0KLSAgLyogUHV0dGluZyBjb25zdGFudCBzeW1ib2xzIGluIGFic29sdXRlX3NlY3Rpb24gcmF0aGVyIHRoYW4KLSAgICAgZXhwcl9zZWN0aW9uIGlzIGNvbnZlbmllbnQgZm9yIHRoZSBvbGQgYS5vdXQgY29kZSwgZm9yIHdoaWNoCi0gICAgIFNfR0VUX1NFR01FTlQgZG9lcyBub3QgYWx3YXlzIHJldHJpZXZlIHRoZSB2YWx1ZSBwdXQgaW4gYnkKLSAgICAgU19TRVRfU0VHTUVOVC4gICovCi0gIHN5bWJvbFAgPSBzeW1ib2xfY3JlYXRlIChmYWtlLAotCQkJICAgKGV4cHJlc3Npb25QLT5YX29wID09IE9fY29uc3RhbnQKLQkJCSAgICA/IGFic29sdXRlX3NlY3Rpb24KLQkJCSAgICA6IGV4cHJfc2VjdGlvbiksCi0JCQkgICAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsIGV4cHJlc3Npb25QKTsKLQotICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLSAgbiA9IChzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBuLT5zeW0gPSBzeW1ib2xQOwotICBhc193aGVyZSAoJm4tPmZpbGUsICZuLT5saW5lKTsKLSAgbi0+bmV4dCA9IGV4cHJfc3ltYm9sX2xpbmVzOwotICBleHByX3N5bWJvbF9saW5lcyA9IG47Ci0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0KLS8qIFJldHVybiB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZm9yIGFuIGV4cHIgc3ltYm9sLiAgUmV0dXJuCi0gICBub24temVybyBpZiBzb21ldGhpbmcgd2FzIGZvdW5kLCAwIGlmIG5vIGluZm9ybWF0aW9uIGlzIGtub3duIGZvcgotICAgdGhlIHN5bWJvbC4gICovCi0KLWludAotZXhwcl9zeW1ib2xfd2hlcmUgKHN5bSwgcGZpbGUsIHBsaW5lKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGNoYXIgKipwZmlsZTsKLSAgICAgdW5zaWduZWQgaW50ICpwbGluZTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKmw7Ci0KLSAgZm9yIChsID0gZXhwcl9zeW1ib2xfbGluZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnN5bSA9PSBzeW0pCi0JewotCSAgKnBmaWxlID0gbC0+ZmlsZTsKLQkgICpwbGluZSA9IGwtPmxpbmU7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotDAotLyogVXRpbGl0aWVzIGZvciBidWlsZGluZyBleHByZXNzaW9ucy4KLSAgIFNpbmNlIGNvbXBsZXggZXhwcmVzc2lvbnMgYXJlIHJlY29yZGVkIGFzIHN5bWJvbHMgZm9yIHVzZSBpbiBvdGhlcgotICAgZXhwcmVzc2lvbnMgdGhlc2UgcmV0dXJuIGEgc3ltYm9sUyAqIGFuZCBub3QgYW4gZXhwcmVzc2lvblMgKi4KLSAgIFRoZXNlIGV4cGxpY2l0bHkgZG8gbm90IHRha2UgYW4gImFkZF9udW1iZXIiIGFyZ3VtZW50LiAgKi8KLS8qID8/PyBGb3IgY29tcGxldGVuZXNzJyBzYWtlIG9uZSBtaWdodCB3YW50IGV4cHJfYnVpbGRfc3ltYm9sLgotICAgSXQgd291bGQganVzdCByZXR1cm4gaXRzIGFyZ3VtZW50LiAgKi8KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgYW4gdW5zaWduZWQgY29uc3RhbnQuCi0gICBUaGUgY29ycmVzcG9uZGluZyBvbmUgZm9yIHNpZ25lZCBjb25zdGFudHMgaXMgbWlzc2luZyBiZWNhdXNlCi0gICB0aGVyZSdzIGN1cnJlbnRseSBubyBuZWVkIGZvciBpdC4gIE9uZSBjb3VsZCBhZGQgYW4gdW5zaWduZWRfcCBmbGFnCi0gICBidXQgdGhhdCBzZWVtcyBtb3JlIGNsdW1zeS4gICovCi0KLXN5bWJvbFMgKgotZXhwcl9idWlsZF91Y29uc3RhbnQgKHZhbHVlKQotICAgICBvZmZzZXRUIHZhbHVlOwotewotICBleHByZXNzaW9uUyBlOwotCi0gIGUuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGUuWF9hZGRfbnVtYmVyID0gdmFsdWU7Ci0gIGUuWF91bnNpZ25lZCA9IDE7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIE9QIHMxLiAgKi8KLQotc3ltYm9sUyAqCi1leHByX2J1aWxkX3VuYXJ5IChvcCwgczEpCi0gICAgIG9wZXJhdG9yVCBvcDsKLSAgICAgc3ltYm9sUyAqczE7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0KLSAgZS5YX29wID0gb3A7Ci0gIGUuWF9hZGRfc3ltYm9sID0gczE7Ci0gIGUuWF9hZGRfbnVtYmVyID0gMDsKLSAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKLX0KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgczEgT1AgczIuICAqLwotCi1zeW1ib2xTICoKLWV4cHJfYnVpbGRfYmluYXJ5IChvcCwgczEsIHMyKQotICAgICBvcGVyYXRvclQgb3A7Ci0gICAgIHN5bWJvbFMgKnMxOwotICAgICBzeW1ib2xTICpzMjsKLXsKLSAgZXhwcmVzc2lvblMgZTsKLQotICBlLlhfb3AgPSBvcDsKLSAgZS5YX2FkZF9zeW1ib2wgPSBzMTsKLSAgZS5YX29wX3N5bWJvbCA9IHMyOwotICBlLlhfYWRkX251bWJlciA9IDA7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uICgnLicpLiAgKi8KLQotc3ltYm9sUyAqCi1leHByX2J1aWxkX2RvdCAoKQotewotICBleHByZXNzaW9uUyBlOwotCi0gIGN1cnJlbnRfbG9jYXRpb24gKCZlKTsKLSAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKLX0KLQwKLS8qCi0gKiBCdWlsZCBhbnkgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbCBoZXJlLgotICogQWxzbyBidWlsZCBhbnkgYmlnbnVtIGxpdGVyYWwgaGVyZS4KLSAqLwotCi0vKiBTZWVtcyBhdG9mX21hY2hpbmUgY2FuIGJhY2tzY2FuIHRocm91Z2ggZ2VuZXJpY19iaWdudW0gYW5kIGhpdCB3aGF0ZXZlcgotICAgaGFwcGVucyB0byBiZSBsb2FkZWQgYmVmb3JlIGl0IGluIG1lbW9yeS4gIEFuZCBpdHMgd2F5IHRvbyBjb21wbGljYXRlZAotICAgZm9yIG1lIHRvIGZpeCByaWdodC4gIFRodXMgYSBoYWNrLiAgSkY6ICBKdXN0IG1ha2UgZ2VuZXJpY19iaWdudW0gYmlnZ2VyLAotICAgYW5kIG5ldmVyIHdyaXRlIGludG8gdGhlIGVhcmx5IHdvcmRzLCB0aHVzIHRoZXknbGwgYWx3YXlzIGJlIHplcm8uCi0gICBJIGhhdGUgRGVhbidzIGZsb2F0aW5nLXBvaW50IGNvZGUuICBCbGVoLiAgKi8KLUxJVFRMRU5VTV9UWVBFIGdlbmVyaWNfYmlnbnVtW1NJWkVfT0ZfTEFSR0VfTlVNQkVSICsgNl07Ci1GTE9OVU1fVFlQRSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciA9Ci17Ci0gICZnZW5lcmljX2JpZ251bVs2XSwJCS8qIGxvdyAoSkY6IFdhcyAwKSAqLwotICAmZ2VuZXJpY19iaWdudW1bU0laRV9PRl9MQVJHRV9OVU1CRVIgKyA2IC0gMV0sIC8qIGhpZ2ggSkY6IChhZGRlZCArNikgKi8KLSAgMCwJCQkJLyogbGVhZGVyICovCi0gIDAsCQkJCS8qIGV4cG9uZW50ICovCi0gIDAJCQkJLyogc2lnbiAqLwotfTsKLS8qIElmIG5vbnplcm8sIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgbmFuLCAraW5mIG9yIC1pbmYgKi8KLWludCBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X21hZ2ljOwotDAotc3RhdGljIHZvaWQKLWZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPiovCi0gIC8qIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50LiAqLwotICBpbnQgZXJyb3JfY29kZTsKLQotICBlcnJvcl9jb2RlID0gYXRvZl9nZW5lcmljICgmaW5wdXRfbGluZV9wb2ludGVyLCAiLiIsIEVYUF9DSEFSUywKLQkJCSAgICAgJmdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKTsKLQotICBpZiAoZXJyb3JfY29kZSkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfY29kZSA9PSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVykKLQl7Ci0JICBhc19iYWQgKF8oImJhZCBmbG9hdGluZy1wb2ludCBjb25zdGFudDogZXhwb25lbnQgb3ZlcmZsb3csIHByb2JhYmx5IGFzc2VtYmxpbmcganVuayIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IHVua25vd24gZXJyb3IgY29kZT0lZC4iKSwgZXJyb3JfY29kZSk7Ci0JfQotICAgIH0KLSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKLSAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5qdXN0IGFmdGVyIGNvbnN0YW50LCAqLwotICAvKiB3aGljaCBtYXkgcG9pbnQgdG8gd2hpdGVzcGFjZS4gKi8KLSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IC0xOwotfQotCi1zdGF0aWMgdmFsdWVUIAotZ2VuZXJpY19iaWdudW1fdG9faW50MzIgKCkgCi17Ci0gIHZhbHVlVCBudW1iZXIgPQotCSAgICgoZ2VuZXJpY19iaWdudW1bMV0gJiBMSVRUTEVOVU1fTUFTSykgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgIHwgKGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0spOwotICBudW1iZXIgJj0gMHhmZmZmZmZmZjsKLSAgcmV0dXJuIG51bWJlcjsKLX0KLQotI2lmZGVmIEJGRDY0Ci1zdGF0aWMgdmFsdWVUIAotZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCkgCi17Ci0gIHZhbHVlVCBudW1iZXIgPSAKLQkgICAoKCgoKCgoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bM10gJiBMSVRUTEVOVU1fTUFTSykKLQkJIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzJdICYgTElUVExFTlVNX01BU0spKQotCSAgICAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgICAgfCAoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bMV0gJiBMSVRUTEVOVU1fTUFTSykpCi0JICAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0spKTsKLSAgcmV0dXJuIG51bWJlcjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotaW50ZWdlcl9jb25zdGFudCAocmFkaXgsIGV4cHJlc3Npb25QKQotICAgICBpbnQgcmFkaXg7Ci0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgY2hhciAqc3RhcnQ7CQkvKiBzdGFydCBvZiBudW1iZXIuICovCi0gIGNoYXIgKnN1ZmZpeCA9IE5VTEw7Ci0gIGNoYXIgYzsKLSAgdmFsdWVUIG51bWJlcjsJLyogb2Zmc2V0IG9yIChhYnNvbHV0ZSkgdmFsdWUgKi8KLSAgc2hvcnQgaW50IGRpZ2l0OwkvKiB2YWx1ZSBvZiBuZXh0IGRpZ2l0IGluIGN1cnJlbnQgcmFkaXggKi8KLSAgc2hvcnQgaW50IG1heGRpZyA9IDA7LyogaGlnaGVzdCBwZXJtaXR0ZWQgZGlnaXQgdmFsdWUuICovCi0gIGludCB0b29fbWFueV9kaWdpdHMgPSAwOwkvKiBpZiB3ZSBzZWUgPj0gdGhpcyBudW1iZXIgb2YgKi8KLSAgY2hhciAqbmFtZTsJCS8qIHBvaW50cyB0byBuYW1lIG9mIHN5bWJvbCAqLwotICBzeW1ib2xTICpzeW1ib2xQOwkvKiBwb2ludHMgdG8gc3ltYm9sICovCi0KLSAgaW50IHNtYWxsOwkJCS8qIHRydWUgaWYgZml0cyBpbiAzMiBiaXRzLiAqLwotCi0gIC8qIE1heSBiZSBiaWdudW0sIG9yIG1heSBmaXQgaW4gMzIgYml0cy4gKi8KLSAgLyogTW9zdCBudW1iZXJzIGZpdCBpbnRvIDMyIGJpdHMsIGFuZCB3ZSB3YW50IHRoaXMgY2FzZSB0byBiZSBmYXN0LgotICAgICBzbyB3ZSBwcmV0ZW5kIGl0IHdpbGwgZml0IGludG8gMzIgYml0cy4gIElmLCBhZnRlciBtYWtpbmcgdXAgYSAzMgotICAgICBiaXQgbnVtYmVyLCB3ZSByZWFsaXNlIHRoYXQgd2UgaGF2ZSBzY2FubmVkIG1vcmUgZGlnaXRzIHRoYW4KLSAgICAgY29tZm9ydGFibHkgZml0IGludG8gMzIgYml0cywgd2UgcmUtc2NhbiB0aGUgZGlnaXRzIGNvZGluZyB0aGVtCi0gICAgIGludG8gYSBiaWdudW0uICBGb3IgZGVjaW1hbCBhbmQgb2N0YWwgbnVtYmVycyB3ZSBhcmUKLSAgICAgY29uc2VydmF0aXZlOiBTb21lIG51bWJlcnMgbWF5IGJlIGFzc3VtZWQgYmlnbnVtcyB3aGVuIGluIGZhY3QKLSAgICAgdGhleSBkbyBmaXQgaW50byAzMiBiaXRzLiAgTnVtYmVycyBvZiBhbnkgcmFkaXggY2FuIGhhdmUgZXhjZXNzCi0gICAgIGxlYWRpbmcgemVyb3M6IFdlIHN0cml2ZSB0byByZWNvZ25pc2UgdGhpcyBhbmQgY2FzdCB0aGVtIGJhY2sKLSAgICAgaW50byAzMiBiaXRzLiAgV2UgbXVzdCBjaGVjayB0aGF0IHRoZSBiaWdudW0gcmVhbGx5IGlzIG1vcmUgdGhhbgotICAgICAzMiBiaXRzLCBhbmQgY2hhbmdlIGl0IGJhY2sgdG8gYSAzMi1iaXQgbnVtYmVyIGlmIGl0IGZpdHMuICBUaGUKLSAgICAgbnVtYmVyIHdlIGFyZSBsb29raW5nIGZvciBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGlmIGl0Ci0gICAgIGZpdHMgaW50byAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIG51bWJlciwgd2UgbGV0IGl0IGJlIGEgMzItYml0Ci0gICAgIG51bWJlci4gIFRoZSBjYXZhbGllciBhcHByb2FjaCBpcyBmb3Igc3BlZWQgaW4gb3JkaW5hcnkgY2FzZXMuICovCi0gIC8qIFRoaXMgaGFzIGJlZW4gZXh0ZW5kZWQgZm9yIDY0IGJpdHMuICBXZSBibGluZGx5IGFzc3VtZSB0aGF0IGlmCi0gICAgIHlvdSdyZSBjb21waWxpbmcgaW4gNjQtYml0IG1vZGUsIHRoZSB0YXJnZXQgaXMgYSA2NC1iaXQgbWFjaGluZS4KLSAgICAgVGhpcyBzaG91bGQgYmUgY2xlYW5lZCB1cC4gICovCi0KLSNpZmRlZiBCRkQ2NAotI2RlZmluZSB2YWx1ZXNpemUgNjQKLSNlbHNlIC8qIGluY2x1ZGVzIG5vbi1iZmQgY2FzZSwgbW9zdGx5ICovCi0jZGVmaW5lIHZhbHVlc2l6ZSAzMgotI2VuZGlmCi0KLSAgaWYgKChOVU1CRVJTX1dJVEhfU1VGRklYIHx8IGZsYWdfbTY4a19tcmkpICYmIHJhZGl4ID09IDApCi0gICAgewotICAgICAgaW50IGZsdCA9IDA7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgbnVtYmVyIG1heSBoYXZlIGEgc3VmZml4IGluZGljYXRpbmcgdGhlCi0gICAgICAgICByYWRpeC4gIEZvciB0aGF0IG1hdHRlciwgaXQgbWlnaHQgYWN0dWFsbHkgYmUgYSBmbG9hdGluZwotICAgICAgICAgcG9pbnQgY29uc3RhbnQuICAqLwotICAgICAgZm9yIChzdWZmaXggPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpzdWZmaXgpOwotCSAgIHN1ZmZpeCsrKQotCXsKLQkgIGlmICgqc3VmZml4ID09ICdlJyB8fCAqc3VmZml4ID09ICdFJykKLQkgICAgZmx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChzdWZmaXggPT0gaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQkgIHJhZGl4ID0gMTA7Ci0JICBzdWZmaXggPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjID0gKi0tc3VmZml4OwotCSAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgYyA9IHRvdXBwZXIgKGMpOwotCSAgaWYgKGMgPT0gJ0InKQotCSAgICByYWRpeCA9IDI7Ci0JICBlbHNlIGlmIChjID09ICdEJykKLQkgICAgcmFkaXggPSAxMDsKLQkgIGVsc2UgaWYgKGMgPT0gJ08nIHx8IGMgPT0gJ1EnKQotCSAgICByYWRpeCA9IDg7Ci0JICBlbHNlIGlmIChjID09ICdIJykKLQkgICAgcmFkaXggPSAxNjsKLQkgIGVsc2UgaWYgKHN1ZmZpeFsxXSA9PSAnLicgfHwgYyA9PSAnRScgfHwgZmx0KQotCSAgICB7Ci0JICAgICAgZmxvYXRpbmdfY29uc3RhbnQgKGV4cHJlc3Npb25QKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJhZGl4ID0gMTA7Ci0JICAgICAgc3VmZml4ID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc3dpdGNoIChyYWRpeCkKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgbWF4ZGlnID0gMjsKLSAgICAgIHRvb19tYW55X2RpZ2l0cyA9IHZhbHVlc2l6ZSArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBtYXhkaWcgPSByYWRpeCA9IDg7Ci0gICAgICB0b29fbWFueV9kaWdpdHMgPSAodmFsdWVzaXplICsgMikgLyAzICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBtYXhkaWcgPSByYWRpeCA9IDE2OwotICAgICAgdG9vX21hbnlfZGlnaXRzID0gKHZhbHVlc2l6ZSArIDMpIC8gNCArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEwOgotICAgICAgbWF4ZGlnID0gcmFkaXggPSAxMDsKLSAgICAgIHRvb19tYW55X2RpZ2l0cyA9ICh2YWx1ZXNpemUgKyAxMSkgLyA0OyAvKiB2ZXJ5IHJvdWdoICovCi0gICAgfQotI3VuZGVmIHZhbHVlc2l6ZQotICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZm9yIChudW1iZXIgPSAwOwotICAgICAgIChkaWdpdCA9IGhleF92YWx1ZSAoYykpIDwgbWF4ZGlnOwotICAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0gICAgewotICAgICAgbnVtYmVyID0gbnVtYmVyICogcmFkaXggKyBkaWdpdDsKLSAgICB9Ci0gIC8qIGMgY29udGFpbnMgY2hhcmFjdGVyIGFmdGVyIG51bWJlci4gKi8KLSAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5jaGFyIGFmdGVyIGMuICovCi0gIHNtYWxsID0gKGlucHV0X2xpbmVfcG9pbnRlciAtIHN0YXJ0IC0gMSkgPCB0b29fbWFueV9kaWdpdHM7Ci0KLSAgaWYgKHJhZGl4ID09IDE2ICYmIGMgPT0gJ18nKSAKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGxpdGVyYWwgb2YgdGhlIGZvcm0gMHgzMzNfMF8xMjM0NTY3OF8xLgotICAgICAgICAgVGhpcyBleGFtcGxlIGlzIGVxdWl2YWxlbnQgdG8gMHgwMDAwMDMzMzAwMDAwMDAwMTIzNDU2NzgwMDAwMDAwMS4gICovCi0KLSAgICAgIGludCBudW1fbGl0dGxlX2RpZ2l0cyA9IDA7Ci0gICAgICBpbnQgaTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwkvKi0+MXN0IGRpZ2l0LiAqLwotCi0gICAgICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotCi0gICAgICBmb3IgKGMgPSAnXyc7IGMgPT0gJ18nOyBudW1fbGl0dGxlX2RpZ2l0cys9MikKLQl7Ci0KLQkgIC8qIENvbnZlcnQgb25lIDY0LWJpdCB3b3JkLiAqLwotCSAgaW50IG5kaWdpdCA9IDA7IAotCSAgbnVtYmVyID0gMDsKLQkgIGZvciAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICAgKGRpZ2l0ID0gaGV4X3ZhbHVlIChjKSkgPCBtYXhkaWc7Ci0JICAgICAgIGMgPSAqKGlucHV0X2xpbmVfcG9pbnRlcisrKSkKLQkgICAgewotCSAgICAgIG51bWJlciA9IG51bWJlciAqIHJhZGl4ICsgZGlnaXQ7Ci0JICAgICAgbmRpZ2l0Kys7Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgZm9yIDggZGlnaXQgcGVyIHdvcmQgbWF4LiAgKi8KLQkgIGlmIChuZGlnaXQgPiA4KSAKLQkgICAgYXNfYmFkIChfKCJBIGJpZ251bSB3aXRoIHVuZGVyc2NvcmVzIG1heSBub3QgaGF2ZSBtb3JlIHRoYW4gOCBoZXggZGlnaXRzIGluIGFueSB3b3JkLiIpKTsKLQotCSAgLyogQWRkIHRoaXMgY2h1bmsgdG8gdGhlIGJpZ251bS4gIFNoaWZ0IHRoaW5ncyBkb3duIDIgbGl0dGxlIGRpZ2l0cy4qLwotCSAga25vdyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTID09IDE2KTsKLQkgIGZvciAoaSA9IG1pbiAobnVtX2xpdHRsZV9kaWdpdHMgKyAxLCBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpOyBpID49IDI7IGktLSkKLQkgICAgZ2VuZXJpY19iaWdudW1baV0gPSBnZW5lcmljX2JpZ251bVtpLTJdOwotCi0JICAvKiBBZGQgdGhlIG5ldyBkaWdpdHMgYXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IG5ldyBvbmVzLiAqLwotCSAgZ2VuZXJpY19iaWdudW1bMF0gPSBudW1iZXIgJiAweGZmZmZmZmZmOwotCSAgZ2VuZXJpY19iaWdudW1bMV0gPSBudW1iZXIgPj4gMTY7Ci0JfQotCi0gICAgICAvKiBBZ2FpbiwgYyBpcyBjaGFyIGFmdGVyIG51bWJlciwgaW5wdXRfbGluZV9wb2ludGVyLT5hZnRlciBjLiAqLwotCi0gICAgICBpZiAobnVtX2xpdHRsZV9kaWdpdHMgPiBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCi0JbnVtX2xpdHRsZV9kaWdpdHMgPSBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDE7Ci0KLSAgICAgIGFzc2VydCAobnVtX2xpdHRsZV9kaWdpdHMgPj0gNCk7Ci0KLSAgICAgIGlmIChudW1fbGl0dGxlX2RpZ2l0cyAhPSA4KQotCWFzX2JhZCAoXygiQSBiaWdudW0gd2l0aCB1bmRlcnNjb3JlcyBtdXN0IGhhdmUgZXhhY3RseSA0IHdvcmRzLiIpKTsKLQotICAgICAgLyogV2UgbWlnaHQgaGF2ZSBzb21lIGxlYWRpbmcgemVyb3MuICBUaGVzZSBjYW4gYmUgdHJpbW1lZCB0byBnaXZlCi0gICAgICAgKiB1cyBhIGNoYW5nZSB0byBmaXQgdGhpcyBjb25zdGFudCBpbnRvIGEgc21hbGwgbnVtYmVyLgotICAgICAgICovCi0gICAgICB3aGlsZSAoZ2VuZXJpY19iaWdudW1bbnVtX2xpdHRsZV9kaWdpdHMtMV0gPT0gMCAmJiBudW1fbGl0dGxlX2RpZ2l0cyA+IDEpCi0JbnVtX2xpdHRsZV9kaWdpdHMtLTsKLQkKLSAgICAgIGlmIChudW1fbGl0dGxlX2RpZ2l0cyA8PSAyKQotCXsKLQkgIC8qIHdpbGwgZml0IGludG8gMzIgYml0cy4gKi8KLQkgIG51bWJlciA9IGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyICgpOwotCSAgc21hbGwgPSAxOwotCX0KLSNpZmRlZiBCRkQ2NAotICAgICAgZWxzZSBpZiAobnVtX2xpdHRsZV9kaWdpdHMgPD0gNCkKLQl7Ci0JICAvKiBXaWxsIGZpdCBpbnRvIDY0IGJpdHMuICAqLwotCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCk7Ci0JICBzbWFsbCA9IDE7Ci0JfQotI2VuZGlmCi0gICAgICBlbHNlCi0JewotCSAgc21hbGwgPSAwOwotCSAgbnVtYmVyID0gbnVtX2xpdHRsZV9kaWdpdHM7IC8qIG51bWJlciBvZiBsaXR0bGVudW1zIGluIHRoZSBiaWdudW0uICovCi0JfQotICAgIH0KLSAgZWxzZSBpZiAoIXNtYWxsKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiB3ZSBzYXcgYSBsb3Qgb2YgZGlnaXRzLiBtYW51ZmFjdHVyZSBhIGJpZ251bSB0aGUgaGFyZCB3YXkuCi0gICAgICAgKi8KLSAgICAgIExJVFRMRU5VTV9UWVBFICpsZWFkZXI7CS8qLT5oaWdoIG9yZGVyIGxpdHRsZW51bSBvZiB0aGUgYmlnbnVtLiAqLwotICAgICAgTElUVExFTlVNX1RZUEUgKnBvaW50ZXI7CS8qLT5saXR0bGVudW0gd2UgYXJlIGZyb2JiaW5nIG5vdy4gKi8KLSAgICAgIGxvbmcgY2Fycnk7Ci0KLSAgICAgIGxlYWRlciA9IGdlbmVyaWNfYmlnbnVtOwotICAgICAgZ2VuZXJpY19iaWdudW1bMF0gPSAwOwotICAgICAgZ2VuZXJpY19iaWdudW1bMV0gPSAwOwotICAgICAgZ2VuZXJpY19iaWdudW1bMl0gPSAwOwotICAgICAgZ2VuZXJpY19iaWdudW1bM10gPSAwOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7CS8qLT4xc3QgZGlnaXQuICovCi0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZm9yICg7Ci0JICAgKGNhcnJ5ID0gaGV4X3ZhbHVlIChjKSkgPCBtYXhkaWc7Ci0JICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKLQl7Ci0JICBmb3IgKHBvaW50ZXIgPSBnZW5lcmljX2JpZ251bTsKLQkgICAgICAgcG9pbnRlciA8PSBsZWFkZXI7Ci0JICAgICAgIHBvaW50ZXIrKykKLQkgICAgewotCSAgICAgIGxvbmcgd29yazsKLQotCSAgICAgIHdvcmsgPSBjYXJyeSArIHJhZGl4ICogKnBvaW50ZXI7Ci0JICAgICAgKnBvaW50ZXIgPSB3b3JrICYgTElUVExFTlVNX01BU0s7Ci0JICAgICAgY2FycnkgPSB3b3JrID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICAgfQotCSAgaWYgKGNhcnJ5KQotCSAgICB7Ci0JICAgICAgaWYgKGxlYWRlciA8IGdlbmVyaWNfYmlnbnVtICsgU0laRV9PRl9MQVJHRV9OVU1CRVIgLSAxKQotCQl7Ci0JCSAgLyogcm9vbSB0byBncm93IGEgbG9uZ2VyIGJpZ251bS4gKi8KLQkJICAqKytsZWFkZXIgPSBjYXJyeTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgLyogYWdhaW4sIGMgaXMgY2hhciBhZnRlciBudW1iZXIsICovCi0gICAgICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyIGMuICovCi0gICAgICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotICAgICAgaWYgKGxlYWRlciA8IGdlbmVyaWNfYmlnbnVtICsgMikKLQl7Ci0JICAvKiB3aWxsIGZpdCBpbnRvIDMyIGJpdHMuICovCi0JICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQzMiAoKTsKLQkgIHNtYWxsID0gMTsKLQl9Ci0jaWZkZWYgQkZENjQKLSAgICAgIGVsc2UgaWYgKGxlYWRlciA8IGdlbmVyaWNfYmlnbnVtICsgNCkKLQl7Ci0JICAvKiBXaWxsIGZpdCBpbnRvIDY0IGJpdHMuICAqLwotCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCk7Ci0JICBzbWFsbCA9IDE7Ci0JfQotI2VuZGlmCi0gICAgICBlbHNlCi0JewotCSAgbnVtYmVyID0gbGVhZGVyIC0gZ2VuZXJpY19iaWdudW0gKyAxOwkvKiBudW1iZXIgb2YgbGl0dGxlbnVtcyBpbiB0aGUgYmlnbnVtLiAqLwotCX0KLSAgICB9Ci0KLSAgaWYgKChOVU1CRVJTX1dJVEhfU1VGRklYIHx8IGZsYWdfbTY4a19tcmkpIAotICAgICAgJiYgc3VmZml4ICE9IE5VTEwgCi0gICAgICAmJiBpbnB1dF9saW5lX3BvaW50ZXIgLSAxID09IHN1ZmZpeCkKLSAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0gIGlmIChzbWFsbCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogaGVyZSB3aXRoIG51bWJlciwgaW4gY29ycmVjdCByYWRpeC4gYyBpcyB0aGUgbmV4dCBjaGFyLgotICAgICAgICogbm90ZSB0aGF0IHVubGlrZSB1bip4LCB3ZSBhbGxvdyAiMDExZiIgIjB4OWYiIHRvCi0gICAgICAgKiBib3RoIG1lYW4gdGhlIHNhbWUgYXMgdGhlIChjb252ZW50aW9uYWwpICI5ZiIuIHRoaXMgaXMgc2ltcGx5IGVhc2llcgotICAgICAgICogdGhhbiBjaGVja2luZyBmb3Igc3RyaWN0IGNhbm9uaWNhbCBmb3JtLiBzeW50YXggc3V4IQotICAgICAgICovCi0KLSAgICAgIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgYyA9PSAnYicpCi0JewotCSAgLyoKLQkgICAqIGJhY2t3YXJkIHJlZiB0byBsb2NhbCBsYWJlbC4KLQkgICAqIGJlY2F1c2UgaXQgaXMgYmFja3dhcmQsIGV4cGVjdCBpdCB0byBiZSBkZWZpbmVkLgotCSAgICovCi0JICAvKiBDb25zdHJ1Y3QgYSBsb2NhbCBsYWJlbC4gICovCi0JICBuYW1lID0gZmJfbGFiZWxfbmFtZSAoKGludCkgbnVtYmVyLCAwKTsKLQotCSAgLyogc2VlbiBiZWZvcmUsIG9yIHN5bWJvbCBpcyBkZWZpbmVkOiBvayAqLwotCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQkgIGlmICgoc3ltYm9sUCAhPSBOVUxMKSAmJiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkpCi0JICAgIHsKLQkgICAgICAvKiBsb2NhbCBsYWJlbHMgYXJlIG5ldmVyIGFic29sdXRlLiBkb24ndCB3YXN0ZSB0aW1lCi0JCSBjaGVja2luZyBhYnNvbHV0ZW5lc3MuICovCi0JICAgICAga25vdyAoU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpKTsKLQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIGVpdGhlciBub3Qgc2VlbiBvciBub3QgZGVmaW5lZC4gKi8KLQkgICAgICAvKiBAQCBTaG91bGQgcHJpbnQgb3V0IHRoZSBvcmlnaW5hbCBzdHJpbmcgaW5zdGVhZCBvZgotCQkgdGhlIHBhcnNlZCBudW1iZXIuICAqLwotCSAgICAgIGFzX2JhZCAoXygiYmFja3cuIHJlZiB0byB1bmtub3duIGxhYmVsIFwiJWQ6XCIsIDAgYXNzdW1lZC4iKSwKLQkJICAgICAgKGludCkgbnVtYmVyKTsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgIH0KLQotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JfQkJCS8qIGNhc2UgJ2InICovCi0gICAgICBlbHNlIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgYyA9PSAnZicpCi0JewotCSAgLyoKLQkgICAqIGZvcndhcmQgcmVmZXJlbmNlLiBleHBlY3Qgc3ltYm9sIHRvIGJlIHVuZGVmaW5lZCBvcgotCSAgICogdW5rbm93bi4gdW5kZWZpbmVkOiBzZWVuIGl0IGJlZm9yZS4gdW5rbm93bjogbmV2ZXIgc2VlbgotCSAgICogaXQgYmVmb3JlLgotCSAgICogY29uc3RydWN0IGEgbG9jYWwgbGFiZWwgbmFtZSwgdGhlbiBhbiB1bmRlZmluZWQgc3ltYm9sLgotCSAgICogZG9uJ3QgY3JlYXRlIGEgeHNlZyBmcmFnIGZvciBpdDogY2FsbGVyIG1heSBkbyB0aGF0LgotCSAgICoganVzdCByZXR1cm4gaXQgYXMgbmV2ZXIgc2VlbiBiZWZvcmUuCi0JICAgKi8KLQkgIG5hbWUgPSBmYl9sYWJlbF9uYW1lICgoaW50KSBudW1iZXIsIDEpOwotCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCSAgLyogd2UgaGF2ZSBubyBuZWVkIHRvIGNoZWNrIHN5bWJvbCBwcm9wZXJ0aWVzLiAqLwotI2lmbmRlZiBtYW55X3NlZ21lbnRzCi0JICAvKiBzaW5jZSAia25vdyIgcHV0cyBpdHMgYXJnIGludG8gYSAic3RyaW5nIiwgd2UKLQkgICAgIGNhbid0IGhhdmUgbmV3bGluZXMgaW4gdGhlIGFyZ3VtZW50LiAgKi8KLQkgIGtub3cgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHVuZGVmaW5lZF9zZWN0aW9uIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHRleHRfc2VjdGlvbiB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBkYXRhX3NlY3Rpb24pOwotI2VuZGlmCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQl9CQkJLyogY2FzZSAnZicgKi8KLSAgICAgIGVsc2UgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIgJiYgYyA9PSAnJCcpCi0JewotCSAgLyogSWYgdGhlIGRvbGxhciBsYWJlbCBpcyAqY3VycmVudGx5KiBkZWZpbmVkLCB0aGVuIHRoaXMgaXMganVzdAotCSAgICAgYW5vdGhlciByZWZlcmVuY2UgdG8gaXQuICBJZiBpdCBpcyBub3QgKmN1cnJlbnRseSogZGVmaW5lZCwKLQkgICAgIHRoZW4gdGhpcyBpcyBhIGZyZXNoIGluc3RhbnRpYXRpb24gb2YgdGhhdCBudW1iZXIsIHNvIGNyZWF0ZQotCSAgICAgaXQuICAqLwotCi0JICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKChsb25nKSBudW1iZXIpKQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGRvbGxhcl9sYWJlbF9uYW1lICgobG9uZykgbnVtYmVyLCAwKTsKLQkgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCSAgICAgIGtub3cgKHN5bWJvbFAgIT0gTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAoKGxvbmcpIG51bWJlciwgMSk7Ci0JICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCSAgICB9Ci0KLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCX0JCQkvKiBjYXNlICckJyAqLwotICAgICAgZWxzZQotCXsKLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSNpZmRlZiBUQVJHRVRfV09SRF9TSVpFCi0JICAvKiBTaWduIGV4dGVuZCBOVU1CRVIuICAqLwotCSAgbnVtYmVyIHw9ICgtKG51bWJlciA+PiAoVEFSR0VUX1dPUkRfU0laRSAtIDEpKSkgPDwgKFRBUkdFVF9XT1JEX1NJWkUgLSAxKTsKLSNlbmRpZgotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IG51bWJlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKiByZXN0b3JlIGZvbGxvd2luZyBjaGFyYWN0ZXIuICovCi0JfQkJCS8qIHJlYWxseSBqdXN0IGEgbnVtYmVyICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogbm90IGEgc21hbGwgbnVtYmVyICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYmlnOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IG51bWJlcjsJLyogbnVtYmVyIG9mIGxpdHRsZW51bXMgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKi0+Y2hhciBmb2xsb3dpbmcgbnVtYmVyLiAqLwotICAgIH0KLX0KLQotLyogUGFyc2UgYW4gTVJJIG11bHRpIGNoYXJhY3RlciBjb25zdGFudC4gICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfY2hhcl9jb25zdGFudCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJwotICAgICAgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycpCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEluIG9yZGVyIHRvIGdldCB0aGUgY29ycmVjdCBieXRlIG9yZGVyaW5nLCB3ZSBtdXN0IGJ1aWxkIHRoZQotICAgICBudW1iZXIgaW4gcmV2ZXJzZS4gICovCi0gIGZvciAoaSA9IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgaW50IGo7Ci0KLSAgICAgIGdlbmVyaWNfYmlnbnVtW2ldID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBDSEFSU19QRVJfTElUVExFTlVNOyBqKyspCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLQkgICAgewotCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ1wnJykKLQkJYnJlYWs7Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGdlbmVyaWNfYmlnbnVtW2ldIDw8PSA4OwotCSAgZ2VuZXJpY19iaWdudW1baV0gKz0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLQotICAgICAgaWYgKGkgPCBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCi0JewotCSAgLyogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBsaXR0bGVudW0sIGxlZnQganVzdGlmeSB0aGUKLSAgICAgICAgICAgICBsYXN0IG9uZSB0byBtYWtlIGl0IG1hdGNoIHRoZSBlYXJsaWVyIG9uZXMuICBJZiB0aGVyZSBpcwotICAgICAgICAgICAgIG9ubHkgb25lLCB3ZSBjYW4ganVzdCB1c2UgdGhlIHZhbHVlIGRpcmVjdGx5LiAgKi8KLQkgIGZvciAoOyBqIDwgQ0hBUlNfUEVSX0xJVFRMRU5VTTsgaisrKQotCSAgICBnZW5lcmljX2JpZ251bVtpXSA8PD0gODsKLQl9Ci0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycKLQkgICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnXCcnKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoaSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDaGFyYWN0ZXIgY29uc3RhbnQgdG9vIGxhcmdlIikpOwotICAgICAgaSA9IDA7Ci0gICAgfQotCi0gIGlmIChpID4gMCkKLSAgICB7Ci0gICAgICBpbnQgYzsKLSAgICAgIGludCBqOwotCi0gICAgICBjID0gU0laRV9PRl9MQVJHRV9OVU1CRVIgLSBpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGM7IGorKykKLQlnZW5lcmljX2JpZ251bVtqXSA9IGdlbmVyaWNfYmlnbnVtW2kgKyBqXTsKLSAgICAgIGkgPSBjOwotICAgIH0KLQotICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotICBpZiAoaSA+IDIpCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGlmIChpIDwgMikKLQlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMF0gJiBMSVRUTEVOVU1fTUFTSzsKLSAgICAgIGVsc2UKLQlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0KLQkgICgoKGdlbmVyaWNfYmlnbnVtWzFdICYgTElUVExFTlVNX01BU0spCi0JICAgIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICB8IChnZW5lcmljX2JpZ251bVswXSAmIExJVFRMRU5VTV9NQVNLKSk7Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGZpbmFsIGNsb3NpbmcgcXVvdGUuICAqLwotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotLyogUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgVGhpcwotICAgaGFuZGxlcyB0aGUgbWFnaWMgc3ltYm9sIGAuJy4gICovCi0KLXN0YXRpYyB2b2lkCi1jdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9ucCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25wOwotewotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25wLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9udW1iZXIgPSBhYnNfc2VjdGlvbl9vZmZzZXQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltYm9scDsKLQotICAgICAgc3ltYm9scCA9IHN5bWJvbF9uZXcgKEZBS0VfTEFCRUxfTkFNRSwgbm93X3NlZywKLQkJCSAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkgICAgZnJhZ19ub3cpOwotICAgICAgZXhwcmVzc2lvbnAtPlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xwOwotICAgICAgZXhwcmVzc2lvbnAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotfQotCi0vKgotICogU3VtbWFyeSBvZiBvcGVyYW5kKCkuCi0gKgotICogaW46CUlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZCwgd2hpY2ggbWF5Ci0gKgliZSBhIHNwYWNlLgotICoKLSAqIG91dDoJQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gZW1wdHk6IGluIHRoaXMgY2FzZSBYX29wID09IE9fYWJzZW50LgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZC4KLSAqLwotCi1zdGF0aWMgc2VnVAotb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW1ib2xQOwkvKiBwb2ludHMgdG8gc3ltYm9sICovCi0gIGNoYXIgKm5hbWU7CQkvKiBwb2ludHMgdG8gbmFtZSBvZiBzeW1ib2wgKi8KLSAgc2VnVCBzZWdtZW50OwotCi0gIC8qIEFsbCBpbnRlZ2VycyBhcmUgcmVnYXJkZWQgYXMgdW5zaWduZWQgdW5sZXNzIHRoZXkgYXJlIG5lZ2F0ZWQuCi0gICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgb25seSB0aGluZyB3aGljaCBjYXJlcyB3aGV0aGVyIGEgbnVtYmVyIGlzCi0gICAgIHVuc2lnbmVkIGlzIHRoZSBjb2RlIGluIGVtaXRfZXhwciB3aGljaCBleHRlbmRzIGNvbnN0YW50cyBpbnRvCi0gICAgIGJpZ251bXMuICBJdCBzaG91bGQgb25seSBzaWduIGV4dGVuZCBuZWdhdGl2ZSBudW1iZXJzLCBzbyB0aGF0Ci0gICAgIHNvbWV0aGluZyBsaWtlIGBgLnF1YWQgMHg4MDAwMDAwMCcnIGlzIG5vdCBzaWduIGV4dGVuZGVkIGV2ZW4KLSAgICAgdGhvdWdoIGl0IGFwcGVhcnMgbmVnYXRpdmUgaWYgdmFsdWVUIGlzIDMyIGJpdHMuICAqLwotICBleHByZXNzaW9uUC0+WF91bnNpZ25lZCA9IDE7Ci0KLSAgLyogZGlnaXRzLCBhc3N1bWUgaXQgaXMgYSBiaWdudW0uICovCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogbGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsJLyogaW5wdXRfbGluZV9wb2ludGVyLT5wYXN0IGNoYXIgaW4gYy4gKi8KLQotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0KLSAgICAgIGludGVnZXJfY29uc3RhbnQgKChOVU1CRVJTX1dJVEhfU1VGRklYIHx8IGZsYWdfbTY4a19tcmkpIAotICAgICAgICAgICAgICAgICAgICAgICAgPyAwIDogMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgICAgLyogbm9uLWRlY2ltYWwgcmFkaXggKi8KLQotICAgICAgaWYgKE5VTUJFUlNfV0lUSF9TVUZGSVggfHwgZmxhZ19tNjhrX21yaSkKLQl7Ci0JICBjaGFyICpzOwotCi0JICAvKiBDaGVjayBmb3IgYSBoZXggY29uc3RhbnQuICAqLwotCSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyBoZXhfcCAoKnMpOyBzKyspCi0JICAgIDsKLQkgIGlmICgqcyA9PSAnaCcgfHwgKnMgPT0gJ0gnKQotCSAgICB7Ci0JICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0gICAgICAgIH0KLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdvJzoKLQljYXNlICdPJzoKLQljYXNlICdxJzoKLQljYXNlICdRJzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQkgIGlmIChOVU1CRVJTX1dJVEhfU1VGRklYIHx8IGZsYWdfbTY4a19tcmkpCi0JICAgIHsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JZGVmYXVsdDoKLQlkZWZhdWx0X2Nhc2U6Ci0JICBpZiAoYyAmJiBzdHJjaHIgKEZMVF9DSEFSUywgYykpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBmbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPQotCQktIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgYykgPyB0b2xvd2VyIChjKSA6IGMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGUgc3RyaW5nIHdhcyBvbmx5IHplcm8gKi8KLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlICd4JzoKLQljYXNlICdYJzoKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICBnb3RvIGRlZmF1bHRfY2FzZTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgaW50ZWdlcl9jb25zdGFudCAoMTYsIGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYic6Ci0JICBpZiAoTE9DQUxfTEFCRUxTX0ZCICYmICEgKGZsYWdfbTY4a19tcmkgfHwgTlVNQkVSU19XSVRIX1NVRkZJWCkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBjaGVjayBmb3IgJysnIGFuZCAnLScgaGVyZSwgYW5kLCBpbgotCQkgc29tZSBjb25kaXRpb25zLCBmYWxsIHRocm91Z2ggdG8gY2FsbAotCQkgaW50ZWdlcl9jb25zdGFudC4gIEhvd2V2ZXIsIHRoYXQgZGlkbid0IG1ha2Ugc2Vuc2UsCi0JCSBhcyBpbnRlZ2VyX2NvbnN0YW50IG9ubHkgYWNjZXB0cyBkaWdpdHMuICAqLwotCSAgICAgIC8qIFNvbWUgb2Ygb3VyIGNvZGUgZWxzZXdoZXJlIGRvZXMgcGVybWl0IGRpZ2l0cyBncmVhdGVyCi0JCSB0aGFuIHRoZSBleHBlY3RlZCBiYXNlOyBmb3IgY29uc2lzdGVuY3ksIGRvIHRoZSBzYW1lCi0JCSBoZXJlLiAgKi8KLQkgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdIDwgJzAnCi0JCSAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID4gJzknKQotCQl7Ci0JCSAgLyogUGFyc2UgdGhpcyBhcyBhIGJhY2sgcmVmZXJlbmNlIHRvIGxhYmVsIDAuICAqLwotCQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCQkgIGludGVnZXJfY29uc3RhbnQgKDEwLCBleHByZXNzaW9uUCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAvKiBPdGhlcndpc2UsIHBhcnNlIHRoaXMgYXMgYSBiaW5hcnkgbnVtYmVyLiAgKi8KLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlICdCJzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgaWYgKGZsYWdfbTY4a19tcmkgfHwgTlVNQkVSU19XSVRIX1NVRkZJWCkKLQkgICAgZ290byBkZWZhdWx0X2Nhc2U7Ci0JICBpbnRlZ2VyX2NvbnN0YW50ICgyLCBleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOgotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCWNhc2UgJzcnOgotCSAgaW50ZWdlcl9jb25zdGFudCAoKGZsYWdfbTY4a19tcmkgfHwgTlVNQkVSU19XSVRIX1NVRkZJWCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAgOiA4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgaWYgKExPQ0FMX0xBQkVMU19GQikKLQkgICAgewotCSAgICAgIC8qIElmIGl0IHNheXMgIjBmIiBhbmQgaXQgY291bGQgcG9zc2libHkgYmUgYSBmbG9hdGluZyBwb2ludAotCQkgbnVtYmVyLCBtYWtlIGl0IG9uZS4gIE90aGVyd2lzZSwgbWFrZSBpdCBhIGxvY2FsIGxhYmVsLAotCQkgYW5kIHRyeSB0byBkZWFsIHdpdGggcGFyc2luZyB0aGUgcmVzdCBsYXRlci4gICovCi0JICAgICAgaWYgKCFpbnB1dF9saW5lX3BvaW50ZXJbMV0KLQkJICB8fCAoaXNfZW5kX29mX2xpbmVbMHhmZiAmIGlucHV0X2xpbmVfcG9pbnRlclsxXV0pCi0JCSAgfHwgc3RyY2hyIChGTFRfQ0hBUlMsICdmJykgPT0gTlVMTCkKLQkJZ290byBpc18wZl9sYWJlbDsKLQkgICAgICB7Ci0JCWNoYXIgKmNwID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLQkJaW50IHIgPSBhdG9mX2dlbmVyaWMgKCZjcCwgIi4iLCBFWFBfQ0hBUlMsCi0JCQkJICAgICAgJmdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKTsKLQkJc3dpdGNoIChyKQotCQkgIHsKLQkJICBjYXNlIDA6Ci0JCSAgY2FzZSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVzoKLQkJICAgIGlmICgqY3AgPT0gJ2YnIHx8ICpjcCA9PSAnYicpCi0JCSAgICAgIC8qIGxvb2tzIGxpa2UgYSBkaWZmZXJlbmNlIGV4cHJlc3Npb24gKi8KLQkJICAgICAgZ290byBpc18wZl9sYWJlbDsKLQkJICAgIGVsc2UgaWYgKGNwID09IGlucHV0X2xpbmVfcG9pbnRlciArIDEpCi0JCSAgICAgIC8qIE5vIGNoYXJhY3RlcnMgaGFzIGJlZW4gYWNjZXB0ZWQgLS0gbG9va3MgbGlrZQotICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCBvZiBvcGVyYW5kLiAqLwotCQkgICAgICBnb3RvIGlzXzBmX2xhYmVsOwotCQkgICAgZWxzZQotCQkgICAgICBnb3RvIGlzXzBmX2Zsb2F0OwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBhc19mYXRhbCAoXygiZXhwci5jKG9wZXJhbmQpOiBiYWQgYXRvZl9nZW5lcmljIHJldHVybiB2YWwgJWQiKSwKLQkJCSAgICAgIHIpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgICAvKiBPa2F5LCBub3cgd2UndmUgc29ydGVkIGl0IG91dC4gIFdlIHJlc3VtZSBhdCBvbmUgb2YgdGhlc2UKLQkJIHR3byBsYWJlbHMsIGRlcGVuZGluZyBvbiB3aGF0IHdlJ3ZlIGRlY2lkZWQgd2UncmUgcHJvYmFibHkKLQkJIGxvb2tpbmcgYXQuICAqLwotCSAgICBpc18wZl9sYWJlbDoKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgxMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGlzXzBmX2Zsb2F0OgotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCSAgICAgIDsKLQkgICAgfQotCi0JY2FzZSAnZCc6Ci0JY2FzZSAnRCc6Ci0JICBpZiAoZmxhZ19tNjhrX21yaSB8fCBOVU1CRVJTX1dJVEhfU1VGRklYKQotCSAgICB7Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgJ0YnOgotCWNhc2UgJ3InOgotCWNhc2UgJ2UnOgotCWNhc2UgJ0UnOgotCWNhc2UgJ2cnOgotCWNhc2UgJ0cnOgotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBmbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9Ci0JICAgIC0gKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSA/IHRvbG93ZXIgKGMpIDogYyk7Ci0JICBicmVhazsKLQotCWNhc2UgJyQnOgotCSAgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIpCi0JICAgIHsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgxMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGdvdG8gZGVmYXVsdF9jYXNlOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcoJzoKLSNpZm5kZWYgTkVFRF9JTkRFWF9PUEVSQVRPUgotICAgIGNhc2UgJ1snOgotI2VuZGlmCi0gICAgICAvKiBkaWRuJ3QgYmVnaW4gd2l0aCBkaWdpdCAmIG5vdCBhIG5hbWUgKi8KLSAgICAgIHNlZ21lbnQgPSBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgICAvKiBFeHByZXNzaW9uKCkgd2lsbCBwYXNzIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KLSAgICAgIGlmICgoYyA9PSAnKCcgJiYgKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcpJykKLQkgIHx8IChjID09ICdbJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJ10nKSkKLQl7Ci0JICBhc19iYWQgKF8oIk1pc3NpbmcgJyknIGFzc3VtZWQiKSk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQl9Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICAvKiBoZXJlIHdpdGggaW5wdXRfbGluZV9wb2ludGVyLT5jaGFyIGFmdGVyICIoLi4uKSIgKi8KLSAgICAgIHJldHVybiBzZWdtZW50OwotCi0jaWZkZWYgVENfTTY4SwotICAgIGNhc2UgJ0UnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgIGFzX2JhZCAoXygiRUJDRElDIGNvbnN0YW50cyBhcmUgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSAnQSc6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wnJykKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotI2VuZGlmCi0gICAgY2FzZSAnXCcnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQl7Ci0JICAvKiBXYXJuaW5nOiB0byBjb25mb3JtIHRvIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMgTk8KLQkgICAgIEVTQ0FQRU1FTlQgaXMgcGVybWl0dGVkIGZvciBhIHNpbmdsZSBxdW90ZS4gVGhlIG5leHQKLQkgICAgIGNoYXJhY3RlciwgcGFyaXR5IGVycm9ycyBhbmQgYWxsLCBpcyB0YWtlbiBhcyB0aGUgdmFsdWUKLQkgICAgIG9mIHRoZSBvcGVyYW5kLiBWRVJZIEtJTktZLiAgKi8KLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIG1yaV9jaGFyX2NvbnN0YW50IChleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJysnOgotICAgICAgKHZvaWQpIG9wZXJhbmQgKGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgVENfTTY4SwotICAgIGNhc2UgJyInOgotICAgICAgLyogRG91YmxlIHF1b3RlIGlzIHRoZSBiaXR3aXNlIG5vdCBvcGVyYXRvciBpbiBNUkkgbW9kZS4gICovCi0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCWdvdG8gZGVfZmF1bHQ7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotI2VuZGlmCi0gICAgY2FzZSAnfic6Ci0gICAgICAvKiB+IGlzIHBlcm1pdHRlZCB0byBzdGFydCBhIGxhYmVsIG9uIHRoZSBEZWx0YS4gICovCi0gICAgICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoYykpCi0JZ290byBpc25hbWU7Ci0gICAgY2FzZSAnISc6Ci0gICAgY2FzZSAnLSc6Ci0gICAgICB7Ci0Jb3BlcmFuZCAoZXhwcmVzc2lvblApOwotCWlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgewotCSAgICAvKiBpbnB1dF9saW5lX3BvaW50ZXIgLT4gY2hhciBhZnRlciBvcGVyYW5kICovCi0JICAgIGlmIChjID09ICctJykKLQkgICAgICB7Ci0JCWV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAtIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXI7Ci0JCS8qIE5vdGljZTogJy0nIG1heSBvdmVyZmxvdzogbm8gd2FybmluZyBpcyBnaXZlbi4gVGhpcyBpcwotCQkgICBjb21wYXRpYmxlIHdpdGggb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4gU2lnaC4gICovCi0JCWV4cHJlc3Npb25QLT5YX3Vuc2lnbmVkID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKGMgPT0gJ34nIHx8IGMgPT0gJyInKQotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSB+IGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXI7Ci0JICAgIGVsc2UKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gISBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyOwotCSAgfQotCWVsc2UgaWYgKGV4cHJlc3Npb25QLT5YX29wICE9IE9faWxsZWdhbAotCQkgJiYgZXhwcmVzc2lvblAtPlhfb3AgIT0gT19hYnNlbnQpCi0JICB7Ci0JICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sIChleHByZXNzaW9uUCk7Ci0JICAgIGlmIChjID09ICctJykKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fdW1pbnVzOwotCSAgICBlbHNlIGlmIChjID09ICd+JyB8fCBjID09ICciJykKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYml0X25vdDsKLQkgICAgZWxzZQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19sb2dpY2FsX25vdDsKLQkgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JICB9Ci0JZWxzZQotCSAgYXNfd2FybiAoXygiVW5hcnkgb3BlcmF0b3IgJWMgaWdub3JlZCBiZWNhdXNlIGJhZCBvcGVyYW5kIGZvbGxvd3MiKSwKLQkJICAgYyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotI2lmIGRlZmluZWQgKERPTExBUl9ET1QpIHx8IGRlZmluZWQgKFRDX002OEspCi0gICAgY2FzZSAnJCc6Ci0gICAgICAvKiAkIGlzIHRoZSBwcm9ncmFtIGNvdW50ZXIgd2hlbiBpbiBNUkkgbW9kZSwgb3Igd2hlbiBET0xMQVJfRE9UCi0gICAgICAgICBpcyBkZWZpbmVkLiAgKi8KLSNpZm5kZWYgRE9MTEFSX0RPVAotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotI2VuZGlmCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaSAmJiBoZXhfcCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgLyogSW4gTVJJIG1vZGUsICQgaXMgYWxzbyB1c2VkIGFzIHRoZSBwcmVmaXggZm9yIGEKLSAgICAgICAgICAgICBoZXhhZGVjaW1hbCBjb25zdGFudC4gICovCi0JICBpbnRlZ2VyX2NvbnN0YW50ICgxNiwgZXhwcmVzc2lvblApOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQlnb3RvIGlzbmFtZTsKLQotICAgICAgY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgJy4nOgotICAgICAgaWYgKCFpc19wYXJ0X29mX25hbWUgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotCXsKLQkgIGN1cnJlbnRfbG9jYXRpb24gKGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic3RhcnRvZi4iLCA4KSA9PSAwCi0JCSYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbOF0pKQotCSAgICAgICB8fCAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNpemVvZi4iLCA3KSA9PSAwCi0JCSAgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbN10pKSkKLQl7Ci0JICBpbnQgc3RhcnQ7Ci0KLQkgIHN0YXJ0ID0gKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAndCcKLQkJICAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdUJyk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc3RhcnQgPyA4IDogNzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcoJykKLQkgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gLnN0YXJ0b2YuIG9yIC5zaXplb2YuIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqYnVmOwotCi0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEwKTsKLQkgICAgICBpZiAoc3RhcnQpCi0JCXNwcmludGYgKGJ1ZiwgIi5zdGFydG9mLiVzIiwgbmFtZSk7Ci0JICAgICAgZWxzZQotCQlzcHJpbnRmIChidWYsICIuc2l6ZW9mLiVzIiwgbmFtZSk7Ci0JICAgICAgc3ltYm9sUCA9IHN5bWJvbF9tYWtlIChidWYpOwotCSAgICAgIGZyZWUgKGJ1Zik7Ci0KLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJykKLQkJYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gLnN0YXJ0b2YuIG9yIC5zaXplb2YuIikpOwotCSAgICAgIGVsc2UKLQkJKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBnb3RvIGlzbmFtZTsKLQl9Ci0gICAgY2FzZSAnLCc6Ci0gICAgY2FzZSAnXG4nOgotICAgIGNhc2UgJ1wwJzoKLSAgICBlb2w6Ci0gICAgICAvKiBjYW4ndCBpbWFnaW5lIGFueSBvdGhlciBraW5kIG9mIG9wZXJhbmQgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgVENfTTY4SwotICAgIGNhc2UgJyUnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgaW50ZWdlcl9jb25zdGFudCAoMiwgZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdAJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgIGludGVnZXJfY29uc3RhbnQgKDgsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnOic6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCWdvdG8gZGVfZmF1bHQ7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgcmVwcmVzZW50ZWQKLSAgICAgICAgIHVzaW5nIGhleGFkZWNpbWFsIGRpZ2l0cy4gICovCi0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ZWdlcl9jb25zdGFudCAoMTYsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKic6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpIHx8IGlzX3BhcnRfb2ZfbmFtZSAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JZ290byBkZV9mYXVsdDsKLQotICAgICAgY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0jaWZkZWYgVENfTTY4SwotICAgIGRlX2ZhdWx0OgotI2VuZGlmCi0gICAgICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGNdKQotCWdvdG8gZW9sOwotICAgICAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMpKQkvKiBoZXJlIGlmIGRpZCBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0ICovCi0JewotCSAgLyoKLQkgICAqIElkZW50aWZpZXIgYmVnaW5zIGhlcmUuCi0JICAgKiBUaGlzIGlzIGtsdWRnZWQgZm9yIHNwZWVkLCBzbyBjb2RlIGlzIHJlcGVhdGVkLgotCSAgICovCi0JaXNuYW1lOgotCSAgbmFtZSA9IC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgbWRfcGFyc2VfbmFtZQotCSAgLyogVGhpcyBpcyBhIGhvb2sgZm9yIHRoZSBiYWNrZW5kIHRvIHBhcnNlIGNlcnRhaW4gbmFtZXMKLSAgICAgICAgICAgICBzcGVjaWFsbHkgaW4gY2VydGFpbiBjb250ZXh0cy4gIElmIGEgbmFtZSBhbHdheXMgaGFzIGEKLSAgICAgICAgICAgICBzcGVjaWZpYyB2YWx1ZSwgaXQgY2FuIG9mdGVuIGJlIGhhbmRsZWQgYnkgc2ltcGx5Ci0gICAgICAgICAgICAgZW50ZXJpbmcgaXQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0JICBpZiAobWRfcGFyc2VfbmFtZSAobmFtZSwgZXhwcmVzc2lvblApKQotCSAgICB7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgVENfSTk2MAotCSAgLyogVGhlIE1SSSBpOTYwIGFzc2VtYmxlciBwZXJtaXRzCi0JICAgICAgICAgbGRhIHNpemVvZiBjb2RlLGcxMwotCSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIHVzZSBtZF9wYXJzZV9uYW1lLiAgKi8KLQkgIGlmIChmbGFnX21yaQotCSAgICAgICYmIChzdHJjYXNlY21wIChuYW1lLCAic2l6ZW9mIikgPT0gMAotCQkgIHx8IHN0cmNhc2VjbXAgKG5hbWUsICJzdGFydG9mIikgPT0gMCkpCi0JICAgIHsKLQkgICAgICBpbnQgc3RhcnQ7Ci0JICAgICAgY2hhciAqYnVmOwotCi0JICAgICAgc3RhcnQgPSAobmFtZVsxXSA9PSAndCcKLQkJICAgICAgIHx8IG5hbWVbMV0gPT0gJ1QnKTsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEwKTsKLQkgICAgICBpZiAoc3RhcnQpCi0JCXNwcmludGYgKGJ1ZiwgIi5zdGFydG9mLiVzIiwgbmFtZSk7Ci0JICAgICAgZWxzZQotCQlzcHJpbnRmIChidWYsICIuc2l6ZW9mLiVzIiwgbmFtZSk7Ci0JICAgICAgc3ltYm9sUCA9IHN5bWJvbF9tYWtlIChidWYpOwotCSAgICAgIGZyZWUgKGJ1Zik7Ci0KLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0JICAgICAgCi0jZW5kaWYKLQotCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0JICAvKiBJZiB3ZSBoYXZlIGFuIGFic29sdXRlIHN5bWJvbCBvciBhIHJlZywgdGhlbiB3ZSBrbm93IGl0cwotCSAgICAgdmFsdWUgbm93LiAgKi8KLQkgIHNlZ21lbnQgPSBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKTsKLQkgIGlmIChzZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2VnbWVudCA9PSByZWdfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICB9Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTGV0IHRoZSB0YXJnZXQgdHJ5IHRvIHBhcnNlIGl0LiAgU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkgY2hhbmdpbmcKLQkgICAgIHRoZSBYX29wIGZpZWxkIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIE9fYWJzZW50IGFuZCBwb2ludGluZwotCSAgICAgaW5wdXRfbGluZV9wb2ludGVyIHBhc3NlZCB0aGUgZXhwcmVzc2lvbi4gIElmIGl0IGNhbid0IHBhcnNlIHRoZQotCSAgICAgZXhwcmVzc2lvbiwgWF9vcCBhbmQgaW5wdXRfbGluZV9wb2ludGVyIHNob3VsZCBiZSB1bmNoYW5nZWQuICAqLwotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2Fic2VudDsKLQkgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApOwotCSAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fYWJzZW50KQotCSAgICB7Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYXNfYmFkIChfKCJCYWQgZXhwcmVzc2lvbiIpKTsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyoKLSAgICogSXQgaXMgbW9yZSAnZWZmaWNpZW50JyB0byBjbGVhbiB1cCB0aGUgZXhwcmVzc2lvblMgd2hlbiB0aGV5IGFyZSBjcmVhdGVkLgotICAgKiBEb2luZyBpdCBoZXJlIHNhdmVzIGxpbmVzIG9mIGNvZGUuCi0gICAqLwotICBjbGVhbl91cF9leHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qLT4xc3QgY2hhciBhZnRlciBvcGVyYW5kLiAqLwotICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyk7Ci0KLSAgLyogVGhlIFBBIHBvcnQgbmVlZHMgdGhpcyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKQotICAgIHN5bWJvbF9tYXJrX3VzZWQgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpOwotCi0gIHN3aXRjaCAoZXhwcmVzc2lvblAtPlhfb3ApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYWJzb2x1dGVfc2VjdGlvbjsKLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgcmV0dXJuIFNfR0VUX1NFR01FTlQgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpOwotICAgIGNhc2UgT19yZWdpc3RlcjoKLSAgICAgIHJldHVybiByZWdfc2VjdGlvbjsKLSAgICB9Ci19CQkJCS8qIG9wZXJhbmQoKSAqLwotDAotLyogSW50ZXJuYWwuIFNpbXBsaWZ5IGEgc3RydWN0IGV4cHJlc3Npb24gZm9yIHVzZSBieSBleHByKCkgKi8KLQotLyoKLSAqIEluOglhZGRyZXNzIG9mIGEgZXhwcmVzc2lvblMuCi0gKglUaGUgWF9vcCBmaWVsZCBvZiB0aGUgZXhwcmVzc2lvblMgbWF5IG9ubHkgdGFrZSBjZXJ0YWluIHZhbHVlcy4KLSAqCUVsc2V3aXNlIHdlIHdhc3RlIHRpbWUgc3BlY2lhbC1jYXNlIHRlc3RpbmcuIFNpZ2guIERpdHRvIFNFR19BQlNFTlQuCi0gKiBPdXQ6CWV4cHJlc3Npb25TIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQ6Ci0gKgknZm9vLWZvbycgc3ltYm9sIHJlZmVyZW5jZXMgY2FuY2VsbGVkIHRvIDAsCi0gKgkJd2hpY2ggY2hhbmdlcyBYX29wIGZyb20gT19zdWJ0cmFjdCB0byBPX2NvbnN0YW50LgotICoJVW51c2VkIGZpZWxkcyB6ZXJvZWQgdG8gaGVscCBleHByKCkuCi0gKi8KLQotc3RhdGljIHZvaWQKLWNsZWFuX3VwX2V4cHJlc3Npb24gKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIHN3aXRjaCAoZXhwcmVzc2lvblAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgIGNhc2UgT19hYnNlbnQ6Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBPX2JpZzoKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgY2FzZSBPX3JlZ2lzdGVyOgotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgY2FzZSBPX3VtaW51czoKLSAgICBjYXNlIE9fYml0X25vdDoKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID09IGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wKLQkgIHx8ICgoc3ltYm9sX2dldF9mcmFnIChleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wpCi0JICAgICAgID09IHN5bWJvbF9nZXRfZnJhZyAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkpCi0JICAgICAgJiYgU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkpCi0JICAgICAgJiYgKFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wpCi0JCSAgPT0gU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpKSkpCi0JewotCSAgYWRkcmVzc1QgZGlmZiA9IChTX0dFVF9WQUxVRSAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkKLQkJCSAgIC0gU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCkpOwotCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyICs9IGRpZmY7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qIEV4cHJlc3Npb24gcGFyc2VyLiAqLwotCi0vKgotICogV2UgYWxsb3cgYW4gZW1wdHkgZXhwcmVzc2lvbiwgYW5kIGp1c3QgYXNzdW1lIChhYnNvbHV0ZSwwKSBzaWxlbnRseS4KLSAqIFVuYXJ5IG9wZXJhdG9ycyBhbmQgcGFyZW50aGV0aWNhbCBleHByZXNzaW9ucyBhcmUgdHJlYXRlZCBhcyBvcGVyYW5kcy4KLSAqIEFzIHVzdWFsLCBRPT1xdWFudGl0eT09b3BlcmFuZCwgTz09b3BlcmF0b3IsIFg9PWV4cHJlc3Npb24gbW5lbW9uaWNzLgotICoKLSAqIFdlIHVzZWQgdG8gZG8gYSBhaG8vdWxsbWFuIHNoaWZ0LXJlZHVjZSBwYXJzZXIsIGJ1dCB0aGUgbG9naWMgZ290IHNvCi0gKiB3YXJwZWQgdGhhdCBJIGZsdXNoZWQgaXQgYW5kIHdyb3RlIGEgcmVjdXJzaXZlLWRlc2NlbnQgcGFyc2VyIGluc3RlYWQuCi0gKiBOb3cgdGhpbmdzIGFyZSBzdGFibGUsIHdvdWxkIGFueWJvZHkgbGlrZSB0byB3cml0ZSBhIGZhc3QgcGFyc2VyPwotICogTW9zdCBleHByZXNzaW9ucyBhcmUgZWl0aGVyIHJlZ2lzdGVyICh3aGljaCBkb2VzIG5vdCBldmVuIHJlYWNoIGhlcmUpCi0gKiBvciAxIHN5bWJvbC4gVGhlbiAic3ltYm9sK2NvbnN0YW50IiBhbmQgInN5bWJvbC1zeW1ib2wiIGFyZSBjb21tb24uCi0gKiBTbyBJIGd1ZXNzIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBob3cgaW5lZmZpY2llbnQgbW9yZSBjb21wbGV4IGV4cHJlc3Npb25zCi0gKiBhcmUgcGFyc2VkLgotICoKLSAqIEFmdGVyIGV4cHIoUkFOSyxyZXN1bHRQKSBpbnB1dF9saW5lX3BvaW50ZXItPm9wZXJhdG9yIG9mIHJhbmsgPD0gUkFOSy4KLSAqIEFsc28sIHdlIGhhdmUgY29uc3VtZWQgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIChvcGVyYW5kIGRvZXMgdGhhdCkKLSAqIGFuZCBkb25lIGFsbCBpbnRlcnZlbmluZyBvcGVyYXRvcnMuCi0gKgotICogVGhpcyByZXR1cm5zIHRoZSBzZWdtZW50IG9mIHRoZSByZXN1bHQsIHdoaWNoIHdpbGwgYmUKLSAqIGFic29sdXRlX3NlY3Rpb24gb3IgdGhlIHNlZ21lbnQgb2YgYSBzeW1ib2wuCi0gKi8KLQotI3VuZGVmIF9fCi0jZGVmaW5lIF9fIE9faWxsZWdhbAotCi1zdGF0aWMgY29uc3Qgb3BlcmF0b3JUIG9wX2VuY29kaW5nWzI1Nl0gPQotewkJCQkvKiBtYXBzIEFTQ0lJLT5vcGVyYXRvcnMgKi8KLQotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0KLSAgX18sIE9fYml0X29yX25vdCwgX18sIF9fLCBfXywgT19tb2R1bHVzLCBPX2JpdF9hbmQsIF9fLAotICBfXywgX18sIE9fbXVsdGlwbHksIE9fYWRkLCBfXywgT19zdWJ0cmFjdCwgX18sIE9fZGl2aWRlLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBPX2x0LCBfXywgT19ndCwgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sCi0jaWZkZWYgTkVFRF9JTkRFWF9PUEVSQVRPUgotICBPX2luZGV4LAotI2Vsc2UKLSAgX18sCi0jZW5kaWYKLSAgX18sIF9fLCBPX2JpdF9leGNsdXNpdmVfb3IsIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgT19iaXRfaW5jbHVzaXZlX29yLCBfXywgX18sIF9fLAotCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXwotfTsKLQotCi0vKgotICoJUmFuawlFeGFtcGxlcwotICoJMAlvcGVyYW5kLCAoZXhwcmVzc2lvbikKLSAqCTEJfHwKLSAqCTIJJiYKLSAqCTMJPSA8PiA8IDw9ID49ID4KLSAqCTQJKyAtCi0gKgk1CXVzZWQgZm9yICogLyAlIGluIE1SSSBtb2RlCi0gKgk2CSYgXiAhIHwKLSAqCTcJKiAvICUgPDwgPj4KLSAqCTgJdW5hcnkgLSB1bmFyeSB+Ci0gKi8KLXN0YXRpYyBvcGVyYXRvcl9yYW5rVCBvcF9yYW5rW10gPQotewotICAwLAkvKiBPX2lsbGVnYWwgKi8KLSAgMCwJLyogT19hYnNlbnQgKi8KLSAgMCwJLyogT19jb25zdGFudCAqLwotICAwLAkvKiBPX3N5bWJvbCAqLwotICAwLAkvKiBPX3N5bWJvbF9ydmEgKi8KLSAgMCwJLyogT19yZWdpc3RlciAqLwotICAwLAkvKiBPX2JpdCAqLwotICA5LAkvKiBPX3VtaW51cyAqLwotICA5LAkvKiBPX2JpdF9ub3QgKi8KLSAgOSwJLyogT19sb2dpY2FsX25vdCAqLwotICA4LAkvKiBPX211bHRpcGx5ICovCi0gIDgsCS8qIE9fZGl2aWRlICovCi0gIDgsCS8qIE9fbW9kdWx1cyAqLwotICA4LAkvKiBPX2xlZnRfc2hpZnQgKi8KLSAgOCwJLyogT19yaWdodF9zaGlmdCAqLwotICA3LAkvKiBPX2JpdF9pbmNsdXNpdmVfb3IgKi8KLSAgNywJLyogT19iaXRfb3Jfbm90ICovCi0gIDcsCS8qIE9fYml0X2V4Y2x1c2l2ZV9vciAqLwotICA3LAkvKiBPX2JpdF9hbmQgKi8KLSAgNSwJLyogT19hZGQgKi8KLSAgNSwJLyogT19zdWJ0cmFjdCAqLwotICA0LAkvKiBPX2VxICovCi0gIDQsCS8qIE9fbmUgKi8KLSAgNCwJLyogT19sdCAqLwotICA0LAkvKiBPX2xlICovCi0gIDQsCS8qIE9fZ2UgKi8KLSAgNCwJLyogT19ndCAqLwotICAzLAkvKiBPX2xvZ2ljYWxfYW5kICovCi0gIDIsCS8qIE9fbG9naWNhbF9vciAqLwotICAxLAkvKiBPX2luZGV4ICovCi0gIDAsCS8qIE9fbWQxICovCi0gIDAsCS8qIE9fbWQyICovCi0gIDAsCS8qIE9fbWQzICovCi0gIDAsCS8qIE9fbWQ0ICovCi0gIDAsCS8qIE9fbWQ1ICovCi0gIDAsCS8qIE9fbWQ2ICovCi0gIDAsCS8qIE9fbWQ3ICovCi0gIDAsCS8qIE9fbWQ4ICovCi0gIDAsCS8qIE9fbWQ5ICovCi0gIDAsCS8qIE9fbWQxMCAqLwotICAwLAkvKiBPX21kMTEgKi8KLSAgMCwJLyogT19tZDEyICovCi0gIDAsCS8qIE9fbWQxMyAqLwotICAwLAkvKiBPX21kMTQgKi8KLSAgMCwJLyogT19tZDE1ICovCi0gIDAsCS8qIE9fbWQxNiAqLwotfTsKLQotLyogVW5mb3J0dW5hdGVseSwgaW4gTVJJIG1vZGUgZm9yIHRoZSBtNjhrLCBtdWx0aXBsaWNhdGlvbiBhbmQKLSAgIGRpdmlzaW9uIGhhdmUgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIHRoZSBiaXQgd2lzZSBvcGVyYXRvcnMuICBUaGlzCi0gICBmdW5jdGlvbiBzZXRzIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlcyBjb3JyZWN0bHkgZm9yIHRoZSBjdXJyZW50Ci0gICBtb2RlLiAgQWxzbywgTVJJIHVzZXMgYSBkaWZmZXJlbnQgYml0X25vdCBvcGVyYXRvciwgYW5kIHRoaXMgZml4ZXMKLSAgIHRoYXQgYXMgd2VsbC4gICovCi0KLSNkZWZpbmUgU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0UgKDcpCi0jZGVmaW5lIE1SSV9NVUxfUFJFQ0VERU5DRSAoNSkKLQotdm9pZAotZXhwcl9zZXRfcHJlY2VkZW5jZSAoKQotewotICBpZiAoZmxhZ19tNjhrX21yaSkKLSAgICB7Ci0gICAgICBvcF9yYW5rW09fbXVsdGlwbHldID0gTVJJX01VTF9QUkVDRURFTkNFOwotICAgICAgb3BfcmFua1tPX2RpdmlkZV0gPSBNUklfTVVMX1BSRUNFREVOQ0U7Ci0gICAgICBvcF9yYW5rW09fbW9kdWx1c10gPSBNUklfTVVMX1BSRUNFREVOQ0U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb3BfcmFua1tPX211bHRpcGx5XSA9IFNUQU5EQVJEX01VTF9QUkVDRURFTkNFOwotICAgICAgb3BfcmFua1tPX2RpdmlkZV0gPSBTVEFOREFSRF9NVUxfUFJFQ0VERU5DRTsKLSAgICAgIG9wX3JhbmtbT19tb2R1bHVzXSA9IFNUQU5EQVJEX01VTF9QUkVDRURFTkNFOwotICAgIH0KLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgZXhwcmVzc2lvbiBwYXJzZXIuICAqLwotCi12b2lkCi1leHByX2JlZ2luICgpCi17Ci0gIGV4cHJfc2V0X3ByZWNlZGVuY2UgKCk7Ci0KLSAgLyogVmVyaWZ5IHRoYXQgWF9vcCBmaWVsZCBpcyB3aWRlIGVub3VnaC4gICovCi0gIHsKLSAgICBleHByZXNzaW9uUyBlOwotICAgIGUuWF9vcCA9IE9fbWF4OwotICAgIGFzc2VydCAoZS5YX29wID09IE9fbWF4KTsKLSAgfQotfQotDAotLyogUmV0dXJuIHRoZSBlbmNvZGluZyBmb3IgdGhlIG9wZXJhdG9yIGF0IElOUFVUX0xJTkVfUE9JTlRFUi4KLSAgIEFkdmFuY2UgSU5QVVRfTElORV9QT0lOVEVSIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgb3BlcmF0b3IKLSAgIChpLmUuLCBkb24ndCBjaGFuZ2UgaXQgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciBvcGVyYXRvcikuICAqLwotCi1zdGF0aWMgaW5saW5lIG9wZXJhdG9yVAotb3BlcmF0b3IgKCkKLXsKLSAgaW50IGM7Ci0gIG9wZXJhdG9yVCByZXQ7Ci0KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIgJiAweGZmOwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQotICAgIGNhc2UgJzwnOgotICAgICAgc3dpdGNoIChpbnB1dF9saW5lX3BvaW50ZXJbMV0pCi0JewotCWRlZmF1bHQ6Ci0JICByZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0JY2FzZSAnPCc6Ci0JICByZXQgPSBPX2xlZnRfc2hpZnQ7Ci0JICBicmVhazsKLQljYXNlICc+JzoKLQkgIHJldCA9IE9fbmU7Ci0JICBicmVhazsKLQljYXNlICc9JzoKLQkgIHJldCA9IE9fbGU7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBjYXNlICc9JzoKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJz0nKQotCXJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gT19lcTsKLQotICAgIGNhc2UgJz4nOgotICAgICAgc3dpdGNoIChpbnB1dF9saW5lX3BvaW50ZXJbMV0pCi0JewotCWRlZmF1bHQ6Ci0JICByZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0JY2FzZSAnPic6Ci0JICByZXQgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgYnJlYWs7Ci0JY2FzZSAnPSc6Ci0JICByZXQgPSBPX2dlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gcmV0OwotCi0gICAgY2FzZSAnISc6Ci0gICAgICAvKiBXZSBhY2NlcHQgISEgYXMgZXF1aXZhbGVudCB0byBeIGZvciBNUkkgY29tcGF0aWJpbGl0eS4gICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICchJykKLQl7Ci0JICBpZiAoZmxhZ19tNjhrX21yaSkKLQkgICAgcmV0dXJuIE9fYml0X2luY2x1c2l2ZV9vcjsKLQkgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiBPX2JpdF9leGNsdXNpdmVfb3I7Ci0KLSAgICBjYXNlICd8JzoKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ3wnKQotCXJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gT19sb2dpY2FsX29yOwotCi0gICAgY2FzZSAnJic6Ci0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICcmJykKLQlyZXR1cm4gb3BfZW5jb2RpbmdbY107Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIE9fbG9naWNhbF9hbmQ7Ci0gICAgfQotCi0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIFBhcnNlIGFuIGV4cHJlc3Npb24uICAqLwotCi1zZWdUCi1leHByIChyYW5rYXJnLCByZXN1bHRQKQotICAgICBpbnQgcmFua2FyZzsJLyogTGFyZ2VyICMgaXMgaGlnaGVyIHJhbmsuICovCi0gICAgIGV4cHJlc3Npb25TICpyZXN1bHRQOwkvKiBEZWxpdmVyIHJlc3VsdCBoZXJlLiAqLwotewotICBvcGVyYXRvcl9yYW5rVCByYW5rID0gKG9wZXJhdG9yX3JhbmtUKSByYW5rYXJnOwotICBzZWdUIHJldHZhbDsKLSAgZXhwcmVzc2lvblMgcmlnaHQ7Ci0gIG9wZXJhdG9yVCBvcF9sZWZ0OwotICBvcGVyYXRvclQgb3BfcmlnaHQ7Ci0KLSAga25vdyAocmFuayA+PSAwKTsKLQotICByZXR2YWwgPSBvcGVyYW5kIChyZXN1bHRQKTsKLQotICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyk7CS8qIE9wZXJhbmQoKSBnb2JibGVzIHNwYWNlcy4gKi8KLQotICBvcF9sZWZ0ID0gb3BlcmF0b3IgKCk7Ci0gIHdoaWxlIChvcF9sZWZ0ICE9IE9faWxsZWdhbCAmJiBvcF9yYW5rWyhpbnQpIG9wX2xlZnRdID4gcmFuaykKLSAgICB7Ci0gICAgICBzZWdUIHJpZ2h0c2VnOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJLyotPmFmdGVyIDFzdCBjaGFyYWN0ZXIgb2Ygb3BlcmF0b3IuICovCi0KLSAgICAgIHJpZ2h0c2VnID0gZXhwciAob3BfcmFua1soaW50KSBvcF9sZWZ0XSwgJnJpZ2h0KTsKLSAgICAgIGlmIChyaWdodC5YX29wID09IE9fYWJzZW50KQotCXsKLQkgIGFzX3dhcm4gKF8oIm1pc3Npbmcgb3BlcmFuZDsgemVybyBhc3N1bWVkIikpOwotCSAgcmlnaHQuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICByaWdodC5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmlnaHQuWF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIHJpZ2h0Llhfb3Bfc3ltYm9sID0gTlVMTDsKLQl9Ci0KLSAgICAgIGtub3cgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyAnKTsKLQotICAgICAgaWYgKG9wX2xlZnQgPT0gT19pbmRleCkKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXScpCi0JICAgIGFzX2JhZCAoIm1pc3NpbmcgcmlnaHQgYnJhY2tldCIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocmV0dmFsID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCXsKLQkgIGlmIChTRUdfTk9STUFMIChyaWdodHNlZykpCi0JICAgIHJldHZhbCA9IHJpZ2h0c2VnOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgU0VHX05PUk1BTCAocmV0dmFsKSkKLQlyZXR2YWwgPSByaWdodHNlZzsKLSAgICAgIGVsc2UgaWYgKFNFR19OT1JNQUwgKHJpZ2h0c2VnKQotCSAgICAgICAmJiByZXR2YWwgIT0gcmlnaHRzZWcKLSNpZmRlZiBESUZGX0VYUFJfT0sKLQkgICAgICAgJiYgb3BfbGVmdCAhPSBPX3N1YnRyYWN0Ci0jZW5kaWYKLQkgICAgICAgKQotCWFzX2JhZCAoXygib3BlcmF0aW9uIGNvbWJpbmVzIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOwotCi0gICAgICBvcF9yaWdodCA9IG9wZXJhdG9yICgpOwotCi0gICAgICBrbm93IChvcF9yaWdodCA9PSBPX2lsbGVnYWwgfHwgb3BfcmFua1soaW50KSBvcF9yaWdodF0gPD0gb3BfcmFua1soaW50KSBvcF9sZWZ0XSk7Ci0gICAgICBrbm93ICgoaW50KSBvcF9sZWZ0ID49IChpbnQpIE9fbXVsdGlwbHkKLQkgICAgJiYgKGludCkgb3BfbGVmdCA8PSAoaW50KSBPX2xvZ2ljYWxfb3IpOwotCi0gICAgICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyIHJpZ2h0LWhhbmQgcXVhbnRpdHkuICovCi0gICAgICAvKiBsZWZ0LWhhbmQgcXVhbnRpdHkgaW4gcmVzdWx0UCAqLwotICAgICAgLyogcmlnaHQtaGFuZCBxdWFudGl0eSBpbiByaWdodC4gKi8KLSAgICAgIC8qIG9wZXJhdG9yIGluIG9wX2xlZnQuICovCi0KLSAgICAgIGlmIChyZXN1bHRQLT5YX29wID09IE9fYmlnKQotCXsKLQkgIGlmIChyZXN1bHRQLT5YX2FkZF9udW1iZXIgPiAwKQotCSAgICBhc193YXJuIChfKCJsZWZ0IG9wZXJhbmQgaXMgYSBiaWdudW07IGludGVnZXIgMCBhc3N1bWVkIikpOwotCSAgZWxzZQotCSAgICBhc193YXJuIChfKCJsZWZ0IG9wZXJhbmQgaXMgYSBmbG9hdDsgaW50ZWdlciAwIGFzc3VtZWQiKSk7Ci0JICByZXN1bHRQLT5YX29wID0gT19jb25zdGFudDsKLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IDA7Ci0JICByZXN1bHRQLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgcmVzdWx0UC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCX0KLSAgICAgIGlmIChyaWdodC5YX29wID09IE9fYmlnKQotCXsKLQkgIGlmIChyaWdodC5YX2FkZF9udW1iZXIgPiAwKQotCSAgICBhc193YXJuIChfKCJyaWdodCBvcGVyYW5kIGlzIGEgYmlnbnVtOyBpbnRlZ2VyIDAgYXNzdW1lZCIpKTsKLQkgIGVsc2UKLQkgICAgYXNfd2FybiAoXygicmlnaHQgb3BlcmFuZCBpcyBhIGZsb2F0OyBpbnRlZ2VyIDAgYXNzdW1lZCIpKTsKLQkgIHJpZ2h0Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgcmlnaHQuWF9hZGRfbnVtYmVyID0gMDsKLQkgIHJpZ2h0LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICByaWdodC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICAvKiBPcHRpbWl6ZSBjb21tb24gY2FzZXMuICAqLwotICAgICAgaWYgKG9wX2xlZnQgPT0gT19hZGQgJiYgcmlnaHQuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFggKyBjb25zdGFudC4gICovCi0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCX0KLSAgICAgIC8qIFRoaXMgY2FzZSBjb21lcyB1cCBpbiBQSUMgY29kZS4gICovCi0gICAgICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fc3VidHJhY3QKLQkgICAgICAgJiYgcmlnaHQuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiByZXN1bHRQLT5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmIChzeW1ib2xfZ2V0X2ZyYWcgKHJpZ2h0LlhfYWRkX3N5bWJvbCkKLQkJICAgPT0gc3ltYm9sX2dldF9mcmFnIChyZXN1bHRQLT5YX2FkZF9zeW1ib2wpKQotCSAgICAgICAmJiBTRUdfTk9STUFMIChTX0dFVF9TRUdNRU5UIChyaWdodC5YX2FkZF9zeW1ib2wpKSkKLQotCXsKLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciAtPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gKFNfR0VUX1ZBTFVFIChyZXN1bHRQLT5YX2FkZF9zeW1ib2wpCi0JCQkJICAgIC0gU19HRVRfVkFMVUUgKHJpZ2h0LlhfYWRkX3N5bWJvbCkpOwotCSAgcmVzdWx0UC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICByZXN1bHRQLT5YX2FkZF9zeW1ib2wgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wX2xlZnQgPT0gT19zdWJ0cmFjdCAmJiByaWdodC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogWCAtIGNvbnN0YW50LiAgKi8KLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciAtPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JfQotICAgICAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX2FkZCAmJiByZXN1bHRQLT5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogQ29uc3RhbnQgKyBYLiAgKi8KLQkgIHJlc3VsdFAtPlhfb3AgPSByaWdodC5YX29wOwotCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gcmlnaHQuWF9hZGRfc3ltYm9sOwotCSAgcmVzdWx0UC0+WF9vcF9zeW1ib2wgPSByaWdodC5YX29wX3N5bWJvbDsKLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JICByZXR2YWwgPSByaWdodHNlZzsKLQl9Ci0gICAgICBlbHNlIGlmIChyZXN1bHRQLT5YX29wID09IE9fY29uc3RhbnQgJiYgcmlnaHQuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIENvbnN0YW50IE9QIGNvbnN0YW50LiAgKi8KLQkgIG9mZnNldFQgdiA9IHJpZ2h0LlhfYWRkX251bWJlcjsKLQkgIGlmICh2ID09IDAgJiYgKG9wX2xlZnQgPT0gT19kaXZpZGUgfHwgb3BfbGVmdCA9PSBPX21vZHVsdXMpKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZGl2aXNpb24gYnkgemVybyIpKTsKLQkgICAgICB2ID0gMTsKLQkgICAgfQotCSAgc3dpdGNoIChvcF9sZWZ0KQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6CQkJYWJvcnQgKCk7Ci0JICAgIGNhc2UgT19tdWx0aXBseToJCXJlc3VsdFAtPlhfYWRkX251bWJlciAqPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2RpdmlkZToJCXJlc3VsdFAtPlhfYWRkX251bWJlciAvPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX21vZHVsdXM6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgJT0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIDw8PSB2OyBicmVhazsKLQkgICAgY2FzZSBPX3JpZ2h0X3NoaWZ0OgotCSAgICAgIC8qIFdlIGFsd2F5cyB1c2UgdW5zaWduZWQgc2hpZnRzLCB0byBhdm9pZCByZWx5aW5nIG9uCi0gICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIGdhcy4gICovCi0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJKG9mZnNldFQpICgodmFsdWVUKSByZXN1bHRQLT5YX2FkZF9udW1iZXIgPj4gKHZhbHVlVCkgdik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfaW5jbHVzaXZlX29yOglyZXN1bHRQLT5YX2FkZF9udW1iZXIgfD0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfb3Jfbm90OgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIHw9IH52OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6CXJlc3VsdFAtPlhfYWRkX251bWJlciBePSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9hbmQ6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgJj0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19hZGQ6CQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fc3VidHJhY3Q6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19lcToKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPT0gdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbmU6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICE9IHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2x0OgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA8ICB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19sZToKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPD0gdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fZ2U6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyID49IHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2d0OgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA+ICB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19sb2dpY2FsX2FuZDoKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSByZXN1bHRQLT5YX2FkZF9udW1iZXIgJiYgdjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2xvZ2ljYWxfb3I6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0gcmVzdWx0UC0+WF9hZGRfbnVtYmVyIHx8IHY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChyZXN1bHRQLT5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmIHJpZ2h0Llhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAgJiYgKG9wX2xlZnQgPT0gT19hZGQKLQkJICAgfHwgb3BfbGVmdCA9PSBPX3N1YnRyYWN0Ci0JCSAgIHx8IChyZXN1bHRQLT5YX2FkZF9udW1iZXIgPT0gMAotCQkgICAgICAgJiYgcmlnaHQuWF9hZGRfbnVtYmVyID09IDApKSkKLQl7Ci0JICAvKiBTeW1ib2wgT1Agc3ltYm9sLiAgKi8KLQkgIHJlc3VsdFAtPlhfb3AgPSBvcF9sZWZ0OwotCSAgcmVzdWx0UC0+WF9vcF9zeW1ib2wgPSByaWdodC5YX2FkZF9zeW1ib2w7Ci0JICBpZiAob3BfbGVmdCA9PSBPX2FkZCkKLQkgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IHJpZ2h0LlhfYWRkX251bWJlcjsKLQkgIGVsc2UgaWYgKG9wX2xlZnQgPT0gT19zdWJ0cmFjdCkKLQkgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHJpZ2h0LlhfYWRkX251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlIGdlbmVyYWwgY2FzZS4gICovCi0JICByZXN1bHRQLT5YX2FkZF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sIChyZXN1bHRQKTsKLQkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnJpZ2h0KTsKLQkgIHJlc3VsdFAtPlhfb3AgPSBvcF9sZWZ0OwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgIHJlc3VsdFAtPlhfdW5zaWduZWQgPSAxOwotCX0KLQotICAgICAgb3BfbGVmdCA9IG9wX3JpZ2h0OwotICAgIH0JCQkJLyogV2hpbGUgbmV4dCBvcGVyYXRvciBpcyA+PSB0aGlzIHJhbmsuICovCi0KLSAgLyogVGhlIFBBIHBvcnQgbmVlZHMgdGhpcyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChyZXN1bHRQLT5YX2FkZF9zeW1ib2wpCi0gICAgc3ltYm9sX21hcmtfdXNlZCAocmVzdWx0UC0+WF9hZGRfc3ltYm9sKTsKLQotICByZXR1cm4gcmVzdWx0UC0+WF9vcCA9PSBPX2NvbnN0YW50ID8gYWJzb2x1dGVfc2VjdGlvbiA6IHJldHZhbDsKLX0KLQwKLS8qCi0gKgkJCWdldF9zeW1ib2xfZW5kKCkKLSAqCi0gKiBUaGlzIGxpdmVzIGhlcmUgYmVjYXVzZSBpdCBiZWxvbmdzIGVxdWFsbHkgaW4gZXhwci5jICYgcmVhZC5jLgotICogRXhwci5jIGlzIGp1c3QgYSBicmFuY2ggb2ZmaWNlIHJlYWQuYyBhbnl3YXksIGFuZCBwdXR0aW5nIGl0Ci0gKiBoZXJlIGxlc3NlbnMgdGhlIGNyb3dkIGF0IHJlYWQuYy4KLSAqCi0gKiBBc3N1bWUgaW5wdXRfbGluZV9wb2ludGVyIGlzIGF0IHN0YXJ0IG9mIHN5bWJvbCBuYW1lLgotICogQWR2YW5jZSBpbnB1dF9saW5lX3BvaW50ZXIgcGFzdCBzeW1ib2wgbmFtZS4KLSAqIFR1cm4gdGhhdCBjaGFyYWN0ZXIgaW50byBhICdcMCcsIHJldHVybmluZyBpdHMgZm9ybWVyIHZhbHVlLgotICogVGhpcyBhbGxvd3MgYSBzdHJpbmcgY29tcGFyZSAoUk1TIHdhbnRzIHN5bWJvbCBuYW1lcyB0byBiZSBzdHJpbmdzKQotICogb2YgdGhlIHN5bWJvbCBuYW1lLgotICogVGhlcmUgd2lsbCBhbHdheXMgYmUgYSBjaGFyIGZvbGxvd2luZyBzeW1ib2wgbmFtZSwgYmVjYXVzZSBhbGwgZ29vZAotICogbGluZXMgZW5kIGluIGVuZC1vZi1saW5lLgotICovCi1jaGFyCi1nZXRfc3ltYm9sX2VuZCAoKQotewotICBjaGFyIGM7Ci0KLSAgLyogV2UgYWNjZXB0IFwwMDEgaW4gYSBuYW1lIGluIGNhc2UgdGhpcyBpcyBiZWluZyBjYWxsZWQgd2l0aCBhCi0gICAgIGNvbnN0cnVjdGVkIHN0cmluZy4gICovCi0gIGlmIChpc19uYW1lX2JlZ2lubmVyIChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKSB8fCBjID09ICdcMDAxJykKLSAgICB7Ci0gICAgICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKQotCSAgICAgfHwgYyA9PSAnXDAwMScpCi0JOwotICAgICAgaWYgKGlzX25hbWVfZW5kZXIgKGMpKQotCWMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICAqLS1pbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICByZXR1cm4gKGMpOwotfQotCi0KLXVuc2lnbmVkIGludAotZ2V0X3NpbmdsZV9udW1iZXIgKCkKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBvcGVyYW5kICgmZXhwKTsKLSAgcmV0dXJuIGV4cC5YX2FkZF9udW1iZXI7Ci0KLX0KLQotLyogZW5kIG9mIGV4cHIuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2V4cHIuaCBiL2dhcy9leHByLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDZhZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2V4cHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKiBleHByLmggLT4gaGVhZGVyIGZpbGUgZm9yIGV4cHIuYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5Mi05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIEJ5IHBvcHVsYXIgZGVtYW5kLCB3ZSBkZWZpbmUgYSBzdHJ1Y3QgdG8gcmVwcmVzZW50IGFuIGV4cHJlc3Npb24uCi0gKiBUaGlzIHdpbGwgbm8gZG91YnQgbXV0YXRlIGFzIGV4cHJlc3Npb25zIGJlY29tZSBiYXJvcXVlLgotICoKLSAqIEN1cnJlbnRseSwgd2Ugc3VwcG9ydCBleHByZXNzaW9ucyBsaWtlICJmb28gT1AgYmFyICsgNDIiLiAgSW4gb3RoZXIKLSAqIHdvcmRzIHdlIHBlcm1pdCBhIChwb3NzaWJseSB1bmRlZmluZWQpIHN5bWJvbCwgYSAocG9zc2libHkKLSAqIHVuZGVmaW5lZCkgc3ltYm9sIGFuZCB0aGUgb3BlcmF0aW9uIHVzZWQgdG8gY29tYmluZSB0aGUgc3ltYm9scywKLSAqIGFuZCBhbiAoYWJzb2x1dGUpIGF1Z2VuZC4gIFJNUyBzYXlzIHRoaXMgaXMgc28gd2UgY2FuIGhhdmUgMS1wYXNzCi0gKiBhc3NlbWJseSBmb3IgYW55IGNvbXBpbGVyIGVtaXNzaW9ucywgYW5kIGEgJ2Nhc2UnIHN0YXRlbWVudCBtaWdodAotICogZW1pdCAndW5kZWZpbmVkMSAtIHVuZGVmaW5lZDInLgotICoKLSAqIFRoZSB0eXBlIG9mIGFuIGV4cHJlc3Npb24gdXNlZCB0byBiZSBzdG9yZWQgYXMgYSBzZWdtZW50LiAgVGhhdCBnb3QKLSAqIGNvbmZ1c2luZyBiZWNhdXNlIGl0IG92ZXJsb2FkZWQgdGhlIGNvbmNlcHQgb2YgYSBzZWdtZW50LiAgSSBhZGRlZAotICogYW4gb3BlcmF0b3IgZmllbGQsIGluc3RlYWQuCi0gKi8KLQotLyogVGhpcyBpcyB0aGUgdHlwZSBvZiBhbiBleHByZXNzaW9uLiAgVGhlIG9wZXJhdG9yIHR5cGVzIGFyZSBhbHNvCi0gICB1c2VkIHdoaWxlIHBhcnNpbmcgYW4gZXhwcmVzc2lvbi4KLQotICAgTk9URTogVGhpcyBlbnVtZXJhdGlvbiBtdXN0IG1hdGNoIHRoZSBvcF9yYW5rIGFycmF5IGluIGV4cHIuYy4gICovCi0KLXR5cGVkZWYgZW51bQotewotICAvKiBBbiBpbGxlZ2FsIGV4cHJlc3Npb24uICAqLwotICBPX2lsbGVnYWwsCi0gIC8qIEEgbm9uZXhpc3RlbnQgZXhwcmVzc2lvbi4gICovCi0gIE9fYWJzZW50LAotICAvKiBYX2FkZF9udW1iZXIgKGEgY29uc3RhbnQgZXhwcmVzc2lvbikuICAqLwotICBPX2NvbnN0YW50LAotICAvKiBYX2FkZF9zeW1ib2wgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX3N5bWJvbCwKLSAgLyogWF9hZGRfc3ltYm9sICsgWF9hZGRfbnVtYmVyIC0gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgaW1hZ2UuICAqLwotICBPX3N5bWJvbF9ydmEsCi0gIC8qIEEgcmVnaXN0ZXIgKFhfYWRkX251bWJlciBpcyByZWdpc3RlciBudW1iZXIpLiAgKi8KLSAgT19yZWdpc3RlciwKLSAgLyogQSBiaWcgdmFsdWUuICBJZiBYX2FkZF9udW1iZXIgaXMgbmVnYXRpdmUgb3IgMCwgdGhlIHZhbHVlIGlzIGluCi0gICAgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLiAgT3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyBpbgotICAgICBnZW5lcmljX2JpZ251bSwgYW5kIFhfYWRkX251bWJlciBpcyB0aGUgbnVtYmVyIG9mIExJVFRMRU5VTXMgaW4KLSAgICAgdGhlIHZhbHVlLiAgKi8KLSAgT19iaWcsCi0gIC8qICgtIFhfYWRkX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX3VtaW51cywKLSAgLyogKH4gWF9hZGRfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fYml0X25vdCwKLSAgLyogKCEgWF9hZGRfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbG9naWNhbF9ub3QsCi0gIC8qIChYX2FkZF9zeW1ib2wgKiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX211bHRpcGx5LAotICAvKiAoWF9hZGRfc3ltYm9sIC8gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19kaXZpZGUsCi0gIC8qIFhfYWRkX3N5bWJvbCAlIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbW9kdWx1cywKLSAgLyogWF9hZGRfc3ltYm9sIDw8IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbGVmdF9zaGlmdCwKLSAgLyogWF9hZGRfc3ltYm9sID4+IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fcmlnaHRfc2hpZnQsCi0gIC8qIFhfYWRkX3N5bWJvbCB8IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fYml0X2luY2x1c2l2ZV9vciwKLSAgLyogWF9hZGRfc3ltYm9sIHx+IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fYml0X29yX25vdCwKLSAgLyogWF9hZGRfc3ltYm9sIF4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfZXhjbHVzaXZlX29yLAotICAvKiBYX2FkZF9zeW1ib2wgJiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9hbmQsCi0gIC8qIFhfYWRkX3N5bWJvbCArIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fYWRkLAotICAvKiBYX2FkZF9zeW1ib2wgLSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX3N1YnRyYWN0LAotICAvKiAoWF9hZGRfc3ltYm9sID09IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fZXEsCi0gIC8qIChYX2FkZF9zeW1ib2wgIT0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19uZSwKLSAgLyogKFhfYWRkX3N5bWJvbCA8IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbHQsCi0gIC8qIChYX2FkZF9zeW1ib2wgPD0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sZSwKLSAgLyogKFhfYWRkX3N5bWJvbCA+PSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2dlLAotICAvKiAoWF9hZGRfc3ltYm9sID4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19ndCwKLSAgLyogKFhfYWRkX3N5bWJvbCAmJiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xvZ2ljYWxfYW5kLAotICAvKiAoWF9hZGRfc3ltYm9sIHx8IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbG9naWNhbF9vciwKLSAgLyogWF9vcF9zeW1ib2wgWyBYX2FkZF9zeW1ib2wgXSAqLwotICBPX2luZGV4LAotICAvKiBtYWNoaW5lIGRlcGVuZGVudCBvcGVyYXRvcnMgKi8KLSAgT19tZDEsICBPX21kMiwgIE9fbWQzLCAgT19tZDQsICBPX21kNSwgIE9fbWQ2LCAgT19tZDcsICBPX21kOCwKLSAgT19tZDksICBPX21kMTAsIE9fbWQxMSwgT19tZDEyLCBPX21kMTMsIE9fbWQxNCwgT19tZDE1LCBPX21kMTYsCi0gIC8qIHRoaXMgbXVzdCBiZSB0aGUgbGFyZ2VzdCB2YWx1ZSAqLwotICBPX21heAotfSBvcGVyYXRvclQ7Ci0KLXR5cGVkZWYgc3RydWN0IGV4cHJlc3Npb25TCi17Ci0gIC8qIFRoZSBtYWluIHN5bWJvbC4gICovCi0gIHN5bWJvbFMgKlhfYWRkX3N5bWJvbDsKLSAgLyogVGhlIHNlY29uZCBzeW1ib2wsIGlmIG5lZWRlZC4gICovCi0gIHN5bWJvbFMgKlhfb3Bfc3ltYm9sOwotICAvKiBBIG51bWJlciB0byBhZGQuICAqLwotICBvZmZzZXRUIFhfYWRkX251bWJlcjsKLQotICAvKiBUaGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi4gIFdlIGNhbid0IGFzc3VtZSB0aGF0IGFuIGFyYml0cmFyeQotICAgICBjb21waWxlciBjYW4gaGFuZGxlIGEgYml0ZmllbGQgb2YgZW51bSB0eXBlLiAgRklYTUU6IFdlIGNvdWxkCi0gICAgIGNoZWNrIHRoaXMgdXNpbmcgYXV0b2NvbmYuICAqLwotI2lmZGVmIF9fR05VQ19fCi0gIG9wZXJhdG9yVCBYX29wIDogODsKLSNlbHNlCi0gIHVuc2lnbmVkIGNoYXIgWF9vcDsKLSNlbmRpZgotCi0gIC8qIE5vbi16ZXJvIGlmIFhfYWRkX251bWJlciBzaG91bGQgYmUgcmVnYXJkZWQgYXMgdW5zaWduZWQuICBUaGlzIGlzCi0gICAgIG9ubHkgdmFsaWQgZm9yIE9fY29uc3RhbnQgZXhwcmVzc2lvbnMuICBJdCBpcyBvbmx5IHVzZWQgd2hlbiBhbgotICAgICBPX2NvbnN0YW50IG11c3QgYmUgZXh0ZW5kZWQgaW50byBhIGJpZ251bSAoaS5lLiwgaXQgaXMgbm90IHVzZWQKLSAgICAgd2hlbiBwZXJmb3JtaW5nIGFyaXRobWV0aWMgb24gdGhlc2UgdmFsdWVzKS4KLSAgICAgRklYTUU6IFRoaXMgZmllbGQgaXMgbm90IHNldCB2ZXJ5IHJlbGlhYmx5LiAgKi8KLSAgdW5zaWduZWQgaW50IFhfdW5zaWduZWQgOiAxOwotCi0gIC8qIDcgYWRkaXRpb25hbCBiaXRzIGNhbiBiZSBkZWZpbmVkIGlmIG5lZWRlZC4gICovCi0KLSAgLyogTWFjaGluZSBkZXBlbmRlbnQgZmllbGQgKi8KLSAgdW5zaWduZWQgc2hvcnQgWF9tZDsKLX0gZXhwcmVzc2lvblM7Ci0KLS8qICJyZXN1bHQiIHNob3VsZCBiZSB0eXBlIChleHByZXNzaW9uUyAqKS4gKi8KLSNkZWZpbmUgZXhwcmVzc2lvbihyZXN1bHQpIGV4cHIgKDAsIHJlc3VsdCkKLQotLyogSWYgYW4gZXhwcmVzc2lvbiBpcyBPX2JpZywgbG9vayBoZXJlIGZvciBpdHMgdmFsdWUuIFRoZXNlIGNvbW1vbgotICAgZGF0YSBtYXkgYmUgY2xvYmJlcmVkIHdoZW5ldmVyIGV4cHIoKSBpcyBjYWxsZWQuICovCi0vKiBGbG9udW1zIHJldHVybmVkIGhlcmUuICBCaWcgZW5vdWdoIHRvIGhvbGQgbW9zdCBwcmVjaXNlIGZsb251bS4gKi8KLWV4dGVybiBGTE9OVU1fVFlQRSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLS8qIEJpZ251bXMgcmV0dXJuZWQgaGVyZS4gKi8KLWV4dGVybiBMSVRUTEVOVU1fVFlQRSBnZW5lcmljX2JpZ251bVtdOwotLyogTnVtYmVyIG9mIGxpdHRsZW51bXMgaW4gYWJvdmUuICovCi0jZGVmaW5lIFNJWkVfT0ZfTEFSR0VfTlVNQkVSICgyMCkKLQotdHlwZWRlZiBjaGFyIG9wZXJhdG9yX3JhbmtUOwotCi1leHRlcm4gY2hhciBnZXRfc3ltYm9sX2VuZCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBleHByX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGV4cHJfc2V0X3ByZWNlZGVuY2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHNlZ1QgZXhwciBQQVJBTVMgKChpbnQgcmFuaywgZXhwcmVzc2lvblMgKiByZXN1bHRQKSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGdldF9zaW5nbGVfbnVtYmVyIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBzeW1ib2xTICptYWtlX2V4cHJfc3ltYm9sIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLWV4dGVybiBpbnQgZXhwcl9zeW1ib2xfd2hlcmUKLSAgUEFSQU1TICgoc3ltYm9sUyAqLCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1leHRlcm4gc3ltYm9sUyAqZXhwcl9idWlsZF91Y29uc3RhbnQgUEFSQU1TICgob2Zmc2V0VCkpOwotZXh0ZXJuIHN5bWJvbFMgKmV4cHJfYnVpbGRfdW5hcnkgUEFSQU1TICgob3BlcmF0b3JULCBzeW1ib2xTICopKTsKLWV4dGVybiBzeW1ib2xTICpleHByX2J1aWxkX2JpbmFyeSBQQVJBTVMgKChvcGVyYXRvclQsIHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci1leHRlcm4gc3ltYm9sUyAqZXhwcl9idWlsZF9kb3QgUEFSQU1TICgodm9pZCkpOwotCi0vKiBlbmQgb2YgZXhwci5oICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLWNvcHkuYyBiL2dhcy9mbG9udW0tY29weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmNjNWNjLi4wMDAwMDAwCi0tLSBhL2dhcy9mbG9udW0tY29weS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogZmxvbnVtX2NvcHkuYyAtIGNvcHkgYSBmbG9udW0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotdm9pZAotZmxvbnVtX2NvcHkgKGluLCBvdXQpCi0gICAgIEZMT05VTV9UWVBFICppbjsKLSAgICAgRkxPTlVNX1RZUEUgKm91dDsKLXsKLSAgdW5zaWduZWQgaW50IGluX2xlbmd0aDsJCS8qIDAgb3JpZ2luICovCi0gIHVuc2lnbmVkIGludCBvdXRfbGVuZ3RoOwkJLyogMCBvcmlnaW4gKi8KLQotICBvdXQtPnNpZ24gPSBpbi0+c2lnbjsKLSAgaW5fbGVuZ3RoID0gaW4tPmxlYWRlciAtIGluLT5sb3c7Ci0KLSAgaWYgKGluLT5sZWFkZXIgPCBpbi0+bG93KQotICAgIHsKLSAgICAgIG91dC0+bGVhZGVyID0gb3V0LT5sb3cgLSAxOwkvKiAwLjAgY2FzZSAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG91dF9sZW5ndGggPSBvdXQtPmhpZ2ggLSBvdXQtPmxvdzsKLSAgICAgIC8qCi0gICAgICAgKiBBc3N1bWUgbm8gR0FQUyBpbiBwYWNraW5nIG9mIGxpdHRsZW51bXMuCi0gICAgICAgKiBJLmUuIHNpemVvZihhcnJheSkgPT0gc2l6ZW9mKGVsZW1lbnQpICogbnVtYmVyX29mX2VsZW1lbnRzLgotICAgICAgICovCi0gICAgICBpZiAoaW5fbGVuZ3RoIDw9IG91dF9sZW5ndGgpCi0JewotCSAgewotCSAgICAvKgotCSAgICAgKiBGb3IgZGVmZW5zaXZlIHByb2dyYW1taW5nLCB6ZXJvIGFueSBoaWdoLW9yZGVyIGxpdHRsZW51bXMgd2UgZG9uJ3QgbmVlZC4KLQkgICAgICogVGhpcyBpcyBkZXN0cm95aW5nIGV2aWRlbmNlIGFuZCB3YXN0aW5nIHRpbWUsIHNvIHdoeSBib3RoZXI/Pz8KLQkgICAgICovCi0JICAgIGlmIChpbl9sZW5ndGggPCBvdXRfbGVuZ3RoKQotCSAgICAgIHsKLQkJbWVtc2V0ICgoY2hhciAqKSAob3V0LT5sb3cgKyBpbl9sZW5ndGggKyAxKSwgJ1wwJywgb3V0X2xlbmd0aCAtIGluX2xlbmd0aCk7Ci0JICAgICAgfQotCSAgfQotCSAgbWVtY3B5ICgodm9pZCAqKSAob3V0LT5sb3cpLCAodm9pZCAqKSAoaW4tPmxvdyksICgoaW5fbGVuZ3RoICsgMSkgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSkpOwotCSAgb3V0LT5leHBvbmVudCA9IGluLT5leHBvbmVudDsKLQkgIG91dC0+bGVhZGVyID0gaW4tPmxlYWRlciAtIGluLT5sb3cgKyBvdXQtPmxvdzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IHNob3J0ZW47CQkvKiAxLW9yaWdpbi4gTnVtYmVyIG9mIGxpdHRsZW51bXMgd2UgZHJvcC4gKi8KLQotCSAgc2hvcnRlbiA9IGluX2xlbmd0aCAtIG91dF9sZW5ndGg7Ci0JICAvKiBBc3N1bWUgb3V0X2xlbmd0aCA+PSAwICEgKi8KLQkgIG1lbWNweSAoKHZvaWQgKikgKG91dC0+bG93KSwgKHZvaWQgKikgKGluLT5sb3cgKyBzaG9ydGVuKSwgKChvdXRfbGVuZ3RoICsgMSkgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSkpOwotCSAgb3V0LT5sZWFkZXIgPSBvdXQtPmhpZ2g7Ci0JICBvdXQtPmV4cG9uZW50ID0gaW4tPmV4cG9uZW50ICsgc2hvcnRlbjsKLQl9Ci0gICAgfQkJCQkvKiBpZiBhbnkgc2lnbmlmaWNhbnQgYml0cyAqLwotfQkJCQkvKiBmbG9udW1fY29weSgpICovCi0KLS8qIGVuZCBvZiBmbG9udW1fY29weS5jICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLWtvbnN0LmMgYi9nYXMvZmxvbnVtLWtvbnN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYmJhMDUuLjAwMDAwMDAKLS0tIGEvZ2FzL2Zsb251bS1rb25zdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qIGZsb251bV9jb25zdC5jIC0gVXNlZnVsIEZsb251bSBjb25zdGFudHMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgImZsb251bS5oIgotLyogSkY6ICBJIGFkZGVkIHRoZSBsYXN0IGVudHJ5IHRvIHRoaXMgdGFibGUsIGFuZCBJJ20gbm90Ci0gICBzdXJlIGlmIGl0cyByaWdodCBvciBub3QuICBDb3VsZCBnbyBlaXRoZXIgd2F5LiAgSSB3aXNoCi0gICBJIHJlYWxseSB1bmRlcnN0b29kIHRoaXMgc3R1ZmYuICovCi0KLQotY29uc3QgaW50IHRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW4gPSAxMzsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHplcm9bXSA9Ci17MX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJV2FybmluZzogdGhlIGxvdyBvcmRlciBiaXRzIG1heSBiZSBXUk9ORyBoZXJlLgkJCSoKLSAqCUkgdG9vayB0aGlzIGZyb20gYSBzdXNwZWN0IGJjKDEpIHNjcmlwdC4JCQkqCi0gKgkibWludXNfWCJbXSBpcyBzdXBwb3NlZCB0byBiZSAxMF4oMl4tWCkgZXhwcmVzc2VkIGluIGJhc2UgMl4xNi4JKgotICoJVGhlIHJhZGl4IHBvaW50IGlzIGp1c3QgQUZURVIgdGhlIGhpZ2hlc3QgZWxlbWVudCBvZiB0aGUgW10JKgotICoJCQkJCQkJCQkqCi0gKglCZWNhdXNlIGJjIHJvdW5kcyBET1dOIGZvciBwcmludGluZyAoSSB0aGluayksIHRoZSBsb3dlc3QJKgotICoJc2lnbmlmaWNhbmNlIGxpdHRsZW51bXMgc2hvdWxkIHByb2JhYmx5IGhhdmUgMSBhZGRlZCB0byB0aGVtLgkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEpGOiAgSWYgdGhpcyBlcXVhbHMgNjU1My8oMl4xNikrMzkzMjEvKDJeMzIpKy4uLiAgaXQgYXBwcm9hY2hlcyAuMSAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzFbXSA9Ci17Ci0gIDM5MzIyLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLAotICAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCA2NTUzfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzFbXSA9Ci17MTB9OwotCi0vKiBKRjogIElmIHRoaXMgZXF1YWxzIDY1NS8oMl4xNikgKyAyMzU5Mi8oMl4zMikgKyAuLi4gaXQgYXBwcm9hY2hlcyAuMDEgKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18yW10gPQotewotICAxMDQ4NiwgMzY3MDAsIDYyOTE0LCAyMzU5MiwgNDk4MDcsIDEwNDg1LCAzNjcwMCwgNjI5MTQsIDIzNTkyLCA0OTgwNywKLSAgMTA0ODUsIDM2NzAwLCA2MjkxNCwgMjM1OTIsIDQ5ODA3LCAxMDQ4NSwgMzY3MDAsIDYyOTE0LCAyMzU5MiwgNjU1fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzJbXSA9Ci17MTAwfTsKLQotLyogVGhpcyBhcHByb2FjaGVzIC4wMDAxICovCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfM1tdID0KLXsKLSAgNTI1MzQsIDIwMDI3LCAzNzMyOSwgNjUxMTYsIDY0MDY3LCA2MDM5NywgMTQ3ODQsIDE4OTc5LCAzMzY1OSwgMTk1MDMsCi0gIDI3MjYsIDk1NDIsIDYyOSwgMjIwMiwgNDA0NzUsIDEwNTkwLCA0Mjk5LCA0NzgxNSwgMzYyODAsIDZ9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfM1tdID0KLXsxMDAwMH07Ci0KLS8qIEpGOiB0aGlzIGFwcHJvYWNoZXMgMWUtOCAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzRbXSA9Ci17Ci0gIDIyNTE3LCA0OTUwMSwgNTQyOTMsIDE5NDI0LCA2MDY5OSwgNjcxNiwgMjQzNDgsIDIyNjE4LCAyMzkwNCwgMjEzMjcsCi0gIDM5MTksIDQ0NzAzLCAxOTE0OSwgMjg4MDMsIDQ4OTU5LCA2MjU5LCA1MDI3MywgNjIyMzcsIDQyfTsKLS8qIFRoaXMgZXF1YWxzIDE1MjUgKiAyXjE2ICsgNTc2MDAgKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzRbXSA9Ci17NTc2MDAsIDE1MjV9OwotCi0vKiBUaGlzIGFwcHJvYWNoZXMgMWUtMTYgKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c181W10gPQotewotICAyMjE5OSwgNDU5NTcsIDE3MDA1LCAyNjI2NiwgMTA1MjYsIDE2MjYwLCA1NTAxNywgMzU2ODAsIDQwNDQzLCAxOTc4OSwKLSAgMTczNTYsIDMwMTk1LCA1NTkwNSwgMjg0MjYsIDYzMDEwLCA0NDE5NywgMTg0NH07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c181W10gPQotezI4NjA5LCAzNDU0NiwgMzV9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfNltdID0KLXsKLSAgMzA5MjYsIDI2NTE4LCAxMzExMCwgNDMwMTgsIDU0OTgyLCA0ODI1OCwgMjQ2NTgsIDE1MjA5LCA2MzM2NiwgMTE5MjksCi0gIDIwMDY5LCA0Mzg1NywgNjA0ODcsIDUxfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzZbXSA9Ci17NjEzMTMsIDM0MjIwLCAxNjczMSwgMTE2MjksIDEyNjJ9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfN1tdID0KLXsKLSAgMjk4MTksIDE0NzMzLCAyMTQ5MCwgNDA2MDIsIDMxMzE1LCA2NTE4NiwgMjY5NX07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c183W10gPQotewotICA3OTM3LCA0OTAwMiwgNjA3NzIsIDI4MjE2LCAzODg5MywgNTU5NzUsIDYzOTg4LCA1OTcxMSwgMjAyMjcsIDI0fTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzhbXSA9Ci17Ci0gIDI3NTc5LCA2NDgwNywgMTI1NDMsIDc5NCwgMTM5MDcsIDYxMjk3LCAxMjAxMywgNjQzNjAsIDE1OTYxLCAyMDU2NiwKLSAgMjQxNzgsIDE1OTIyLCA1OTQyNywgMTEwfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzhbXSA9Ci17Ci0gIDE1ODczLCAxMTkyNSwgMzkxNzcsIDk5MSwgMTQ1ODksIDM4NjEsIDU4NDE1LCA5MDc2LCA2Mjk1NiwgNTQyMjMsCi0gIDU2MzI4LCA1MDE4MCwgNDUyNzQsIDQ4MzMzLCAzMjUzNywgNDI1NDcsIDk3MzEsIDU5Njc5LCA1OTB9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfOVtdID0KLXsKLSAgMTEwNDIsIDg0NjQsIDU4OTcxLCA2MzQyOSwgNjAyMiwgNjM0ODUsIDU1MDAsIDUzNDY0LCA0NzU0NSwgNTAwNjgsCi0gIDU2OTg4LCAyMjgxOSwgNDk3MDgsIDU0NDkzLCA5OTIwLCA0NzY2NywgNDA0MDksIDM1NzY0LCAxMDM4MywgNTQ0NjYsCi0gIDMyNzAyLCAxNzQ5MywgMzI0MjAsIDM0MzgyLCAyMjc1MCwgMjA2ODEsIDEyMzAwfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzlbXSA9Ci17Ci0gIDIwNjc4LCAyNzYxNCwgMjgyNzIsIDUzMDY2LCA1NTMxMSwgNTQ2NzcsIDI5MDM4LCA5OTA2LCAyNjI4OCwgNDQ0ODYsCi0gIDEzODYwLCA3NDQ1LCA1NDEwNiwgMTU0MjYsIDIxNTE4LCAyNTU5OSwgMjk2MzIsIDUyMzA5LCA2MTIwNywgMjYxMDUsCi0gIDEwNDgyLCAyMTk0OCwgNTExOTEsIDMyOTg4LCA2MDg5MiwgNjI1NzQsIDYxMzkwLCAyNDU0MCwgMjE0OTUsIDV9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMTBbXSA9Ci17Ci0gIDYyMTQsIDQ4NzcxLCAyMzQ3MSwgMzAxNjMsIDMxNzYzLCAzODAxMywgNTcwMDEsIDExNzcwLCAxODI2MywgMzYzNjYsCi0gIDIwNzQyLCA0NTA4NiwgNTY5NjksIDUzMjMxLCAzNzg1NiwgNTU4MTQsIDM4MDU3LCAxNTY5MiwgNDY3NjEsIDg3MTMsCi0gIDYxMDIsIDIwMDgzLCA4MjY5LCAxMTgzOSwgMTE1NzEsIDUwOTYzLCAxNTY0OSwgMTE2OTgsIDQwNjc1LCAyMzA4fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzEwW10gPQotewotICA2MzgzOSwgMzY1NzYsIDQ1NzEyLCA0NDUxNiwgMzc4MDMsIDI5NDgyLCA0OTY2LCAzMDU1NiwgMzc5NjEsIDIzMzEwLAotICAyNzA3MCwgNDQ5NzIsIDI5NTA3LCA0ODI1NywgNDUyMDksIDc0OTQsIDE3ODMxLCAzODcyOCwgNDE1NzcsIDI5NDQzLAotICAzNjAxNiwgNzk1NSwgMzUzMzksIDM1NDc5LCAzNjAxMSwgMTQ1NTMsIDQ5NjE4LCA1NTg4LCAyNTM5NiwgMjh9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMTFbXSA9Ci17Ci0gIDE2NjYzLCA1Njg4MiwgNjE5ODMsIDc4MDQsIDM2NTU1LCAzMjA2MCwgMzQ1MDIsIDEwMDAsIDE0MzU2LCAyMTY4MSwKLSAgNjYwNSwgMzQ3NjcsIDUxNDExLCA1OTA0OCwgNTM2MTQsIDM5ODUwLCAzMDA3OSwgNjQ5NiwgNjg0NiwgMjY4NDEsCi0gIDQwNzc4LCAxOTU3OCwgNTk4OTksIDQ0MDg1LCA1NDAxNiwgMjQyNTksIDExMjMyLCAyMTIyOSwgMjEzMTMsIDgxfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzExW10gPQotewotICA5MiwgOTA1NCwgNjI3MDcsIDE3OTkzLCA3ODIxLCA1NjgzOCwgMTM5OTIsIDIxMzIxLCAyOTYzNywgNDg0MjYsCi0gIDQyOTgyLCAzODY2OCwgNDk1NzQsIDI4ODIwLCAxODIwMCwgMTg5MjcsIDUzOTc5LCAxNjIxOSwgMzc0ODQsIDI1MTYsCi0gIDQ0NjQyLCAxNDY2NSwgMTE1ODcsIDQxOTI2LCAxMzU1NiwgMjM5NTYsIDU0MzIwLCA2NjYxLCA1NTc2NiwgODA1fTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzEyW10gPQotewotICAzMzIwMiwgNDU5NjksIDU4ODA0LCA1NjczNCwgMTY0ODIsIDI2MDA3LCA0NDk4NCwgNDkzMzQsIDMxMDA3LCAzMjk0NCwKLSAgNDQ1MTcsIDYzMzI5LCA0NzEzMSwgMTUyOTEsIDU5NDY1LCAyMjY0LCAyMzIxOCwgMTE4MjksIDU5NzcxLCAzODc5OCwKLSAgMzEwNTEsIDI4NzQ4LCAyMzEyOSwgNDA1NDEsIDQxNTYyLCAzNTEwOCwgNTA2MjAsIDU5MDE0LCA1MTgxNywgNjYxM307Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xMltdID0KLXsKLSAgMTAwOTgsIDM3OTIyLCA1ODA3MCwgNzQzMiwgMTA0NzAsIDYzNDY1LCAyMzcxOCwgNjIxOTAsIDQ3NDIwLCA3MDA5LAotICAzODQ0MywgNDU4NywgNDU1OTYsIDM4NDcyLCA1MjEyOSwgNTI3NzksIDI5MDEyLCAxMzU1OSwgNDg2ODgsIDMxNjc4LAotICA0MTc1MywgNTg2NjIsIDEwNjY4LCAzNjA2NywgMjk5MDYsIDU2OTA2LCAyMTQ2MSwgNDY1NTYsIDU5NTcxLCA5fTsKLQotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzEzW10gPQotewotICA0NTMwOSwgMjc1OTIsIDM3MTQ0LCAzNDYzNywgMzQzMjgsIDQxNjcxLCAzNDYyMCwgMjQxMzUsIDUzNDAxLCAyMjExMiwKLSAgMjE1NzYsIDQ1MTQ3LCAzOTMxMCwgNDQwNTEsIDQ4NTcyLCAzNjc2LCA0NjU0NCwgNTk3NjgsIDMzMzUwLCAyMzIzLAotICA0OTUyNCwgNjE1NjgsIDM5MDMsIDM2NDg3LCAzNjM1NiwgMzA5MDMsIDE0OTc1LCA5MDM1LCAyOTcxNSwgNjY3fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzEzW10gPQotewotICAxODc4OCwgMTY5NjAsIDYzMTgsIDQ1Njg1LCA1NTQwMCwgNDYyMzAsIDM1Nzk0LCAyNTU4OCwgNzI1MywgNTU1NDEsCi0gIDQ5NzE2LCA1OTc2MCwgNjM1OTIsIDgxOTEsIDYzNzY1LCA1ODUzMCwgNDQ2NjcsIDEzMjk0LCAxMDAwMSwgNTU1ODYsCi0gIDQ3ODg3LCAxODczOCwgOTUwOSwgNDA4OTYsIDQyNTA2LCA1MjU4MCwgNDE3MSwgMzI1LCAxMjMyOSwgOTh9OwotCi0vKiBTaHV0IHVwIGNvbXBsYWludHMgYWJvdXQgZGlmZmVyaW5nIHBvaW50ZXIgdHlwZXMuICBUaGV5IG9ubHkgZGlmZmVyCi0gICBpbiB0aGUgY29uc3QgYXR0cmlidXRlLCBidXQgdGhlcmUgaXNuJ3QgYW55IGVhc3kgd2F5IHRvIGRvIHRoaXMKLSAgICovCi0jZGVmaW5lIFggKExJVFRMRU5VTV9UWVBFICopCi0KLWNvbnN0IEZMT05VTV9UWVBFIGZsb251bV9uZWdhdGl2ZV9wb3dlcnNfb2ZfdGVuW10gPQotewotICB7WCB6ZXJvLCBYIHplcm8sIFggemVybywgMCwgJysnfSwKLSAge1ggbWludXNfMSwgWCBtaW51c18xICsgMTksIFggbWludXNfMSArIDE5LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzIsIFggbWludXNfMiArIDE5LCBYIG1pbnVzXzIgKyAxOSwgLTIwLCAnKyd9LAotICB7WCBtaW51c18zLCBYIG1pbnVzXzMgKyAxOSwgWCBtaW51c18zICsgMTksIC0yMCwgJysnfSwKLSAge1ggbWludXNfNCwgWCBtaW51c180ICsgMTgsIFggbWludXNfNCArIDE4LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzUsIFggbWludXNfNSArIDE2LCBYIG1pbnVzXzUgKyAxNiwgLTIwLCAnKyd9LAotICB7WCBtaW51c182LCBYIG1pbnVzXzYgKyAxMywgWCBtaW51c182ICsgMTMsIC0yMCwgJysnfSwKLSAge1ggbWludXNfNywgWCBtaW51c183ICsgNiwgWCBtaW51c183ICsgNiwgLTIwLCAnKyd9LAotICB7WCBtaW51c184LCBYIG1pbnVzXzggKyAxMywgWCBtaW51c184ICsgMTMsIC00MCwgJysnfSwKLSAge1ggbWludXNfOSwgWCBtaW51c185ICsgMjYsIFggbWludXNfOSArIDI2LCAtODAsICcrJ30sCi0gIHtYIG1pbnVzXzEwLCBYIG1pbnVzXzEwICsgMjksIFggbWludXNfMTAgKyAyOSwgLTEzNiwgJysnfSwKLSAge1ggbWludXNfMTEsIFggbWludXNfMTEgKyAyOSwgWCBtaW51c18xMSArIDI5LCAtMjQyLCAnKyd9LAotICB7WCBtaW51c18xMiwgWCBtaW51c18xMiArIDI5LCBYIG1pbnVzXzEyICsgMjksIC00NTUsICcrJ30sCi0gIHtYIG1pbnVzXzEzLCBYIG1pbnVzXzEzICsgMjksIFggbWludXNfMTMgKyAyOSwgLTg4MCwgJysnfSwKLX07Ci0KLWNvbnN0IEZMT05VTV9UWVBFIGZsb251bV9wb3NpdGl2ZV9wb3dlcnNfb2ZfdGVuW10gPQotewotICB7WCB6ZXJvLCBYIHplcm8sIFggemVybywgMCwgJysnfSwKLSAge1ggcGx1c18xLCBYIHBsdXNfMSArIDAsIFggcGx1c18xICsgMCwgMCwgJysnfSwKLSAge1ggcGx1c18yLCBYIHBsdXNfMiArIDAsIFggcGx1c18yICsgMCwgMCwgJysnfSwKLSAge1ggcGx1c18zLCBYIHBsdXNfMyArIDAsIFggcGx1c18zICsgMCwgMCwgJysnfSwKLSAge1ggcGx1c180LCBYIHBsdXNfNCArIDEsIFggcGx1c180ICsgMSwgMCwgJysnfSwKLSAge1ggcGx1c181LCBYIHBsdXNfNSArIDIsIFggcGx1c181ICsgMiwgMSwgJysnfSwKLSAge1ggcGx1c182LCBYIHBsdXNfNiArIDQsIFggcGx1c182ICsgNCwgMiwgJysnfSwKLSAge1ggcGx1c183LCBYIHBsdXNfNyArIDksIFggcGx1c183ICsgOSwgNCwgJysnfSwKLSAge1ggcGx1c184LCBYIHBsdXNfOCArIDE4LCBYIHBsdXNfOCArIDE4LCA4LCAnKyd9LAotICB7WCBwbHVzXzksIFggcGx1c185ICsgMjksIFggcGx1c185ICsgMjksIDI0LCAnKyd9LAotICB7WCBwbHVzXzEwLCBYIHBsdXNfMTAgKyAyOSwgWCBwbHVzXzEwICsgMjksIDc3LCAnKyd9LAotICB7WCBwbHVzXzExLCBYIHBsdXNfMTEgKyAyOSwgWCBwbHVzXzExICsgMjksIDE4MywgJysnfSwKLSAge1ggcGx1c18xMiwgWCBwbHVzXzEyICsgMjksIFggcGx1c18xMiArIDI5LCAzOTYsICcrJ30sCi0gIHtYIHBsdXNfMTMsIFggcGx1c18xMyArIDI5LCBYIHBsdXNfMTMgKyAyOSwgODIxLCAnKyd9LAotfTsKLQotI2lmZGVmIFZNUwotdm9pZCBkdW1teTEgKCkgeyB9Ci0jZW5kaWYKLS8qIGVuZCBvZiBmbG9udW1fY29uc3QuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Zsb251bS1tdWx0LmMgYi9nYXMvZmxvbnVtLW11bHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0YTczYi4uMDAwMDAwMAotLS0gYS9nYXMvZmxvbnVtLW11bHQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKiBmbG9udW1fbXVsdC5jIC0gbXVsdGlwbHkgdHdvIGZsb251bXMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR2FzLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgVGhlIEdOVSBhc3NlbWJsZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gIE5vIGF1dGhvciBvciBkaXN0cmlidXRvcgotICAgYWNjZXB0cyByZXNwb25zaWJpbGl0eSB0byBhbnlvbmUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNpbmcgaXQKLSAgIG9yIGZvciB3aGV0aGVyIGl0IHNlcnZlcyBhbnkgcGFydGljdWxhciBwdXJwb3NlIG9yIHdvcmtzIGF0IGFsbCwKLSAgIHVubGVzcyBoZSBzYXlzIHNvIGluIHdyaXRpbmcuICBSZWZlciB0byB0aGUgR05VIEFzc2VtYmxlciBHZW5lcmFsCi0gICBQdWJsaWMgTGljZW5zZSBmb3IgZnVsbCBkZXRhaWxzLgotCi0gICBFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUKLSAgIHRoZSBHTlUgQXNzZW1ibGVyLCBidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlCi0gICBHTlUgQXNzZW1ibGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBIGNvcHkgb2YgdGhpcyBsaWNlbnNlIGlzCi0gICBzdXBwb3NlZCB0byBoYXZlIGJlZW4gZ2l2ZW4gdG8geW91IGFsb25nIHdpdGggdGhlIEdOVSBBc3NlbWJsZXIKLSAgIHNvIHlvdSBjYW4ga25vdyB5b3VyIHJpZ2h0cyBhbmQgcmVzcG9uc2liaWxpdGllcy4gIEl0IHNob3VsZCBiZQotICAgaW4gYSBmaWxlIG5hbWVkIENPUFlJTkcuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBjb3B5cmlnaHQKLSAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgImZsb251bS5oIgotCi0vKglwbGFuIGZvciBhIC4gYiA9PiBwKHJvZHVjdCkKLQkKLQkKLQkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKwotCXwgYQl8IGEJfCAgLi4uCXwgYQl8IGEJfAotCXwgIEEJfCAgQS0xCXwJfCAgMQl8ICAwCXwKLQkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKwotCQotCQotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JfCBiCXwgYgl8ICAuLi4JfCBiCXwgYgl8Ci0JfCAgQgl8ICBCLTEJfAl8ICAxCXwgIDAJfAotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JCi0JCi0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JfCBwCXwgcAl8ICAuLi4JfCBwCXwgIC4uLgl8IHAJfCBwCXwKLQl8ICBBK0IrMXwgIEErQgl8CXwgIE4JfAl8ICAxCXwgIDAJfAotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKwotCQotCS9eXAotCShjYXJyeSkgYSAuYgkgICAuLi4JICAgIHwJICAgLi4uCSBhIC5iCSBhIC5iCi0JQSAgQiAJCSAgICB8CQkgIDAgIDEJICAwICAwCi0JfAotCS4uLgkgICAgfAkgICAuLi4JIGEgLmIKLQl8CQkgIDEgIDAKLQl8Ci0JfAkgICAuLi4KLQl8Ci0JfAotCXwKLQl8CQkgIF9fXwotCXwJCSAgXAotCSstLS0tLSAgUCAgPSAgID4gIGEgLmIKLQlOCSAgL19fICBpICBqCi0JCi0JTiA9IDAgLi4uIEErQgotCQotCWZvciBhbGwgaSxqIHdoZXJlIGkraj1OCi0JW2ksaiBpbnRlZ2VycyA+IDBdCi0JCi0JYVtdLCBiW10sIHBbXSBtYXkgbm90IGludGVyc2VjdC4KLQlaZXJvIGxlbmd0aCBmYWN0b3JzIHNpZ25pZnkgMCBzaWduaWZpY2FudCBiaXRzOiB0cmVhdCBhcyAwLjAuCi0JMC4wIGZhY3RvcnMgZG8gdGhlIHJpZ2h0IHRoaW5nLgotCVplcm8gbGVuZ3RoIHByb2R1Y3QgT0suCi0JCi0JSSBjaG9zZSB0aGUgRm9yVHJhbiBhY2NlbnQgImZvb1tiYXJdIiBpbnN0ZWFkIG9mIHRoZSBDIGFjY2VudCAiKmdhcnBseSIKLQliZWNhdXNlIEkgZmVsdCB0aGUgRm9yVHJhbiB3YXkgd2FzIG1vcmUgaW50dWl0aXZlLiBUaGUgQyB3YXkgd291bGQKLQlwcm9iYWJseSB5aWVsZCBiZXR0ZXIgY29kZSBvbiBtb3N0IEMgY29tcGlsZXJzLiBEZWFuIEVsc25lci4KLQkoQyBzdHlsZSBhbHNvIGdpdmVzIGRlZXBlciBpbnNpZ2h0IFt0byBtZV0gLi4uIG9oIHdlbGwgLi4uKQotCSovCi0MCi12b2lkIAotZmxvbnVtX211bHRpcCAoYSwgYiwgcHJvZHVjdCkKLSAgICAgY29uc3QgRkxPTlVNX1RZUEUgKmE7Ci0gICAgIGNvbnN0IEZMT05VTV9UWVBFICpiOwotICAgICBGTE9OVU1fVFlQRSAqcHJvZHVjdDsKLXsKLSAgaW50IHNpemVfb2ZfYTsJCS8qIDAgb3JpZ2luICovCi0gIGludCBzaXplX29mX2I7CQkvKiAwIG9yaWdpbiAqLwotICBpbnQgc2l6ZV9vZl9wcm9kdWN0OwkJLyogMCBvcmlnaW4gKi8KLSAgaW50IHNpemVfb2Zfc3VtOwkJLyogMCBvcmlnaW4gKi8KLSAgaW50IGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zOwkvKiAxIG9yaWdpbiAqLwotICB1bnNpZ25lZCBsb25nIHdvcms7Ci0gIHVuc2lnbmVkIGxvbmcgY2Fycnk7Ci0gIGxvbmcgZXhwb25lbnQ7Ci0gIExJVFRMRU5VTV9UWVBFICpxOwotICBsb25nIHNpZ25pZmljYW50OwkJLyogVFJVRSB3aGVuIHdlIGVtaXQgYSBub24tMCBsaXR0bGVudW0gICovCi0gIC8qIEZvclRyYW4gYWNjZW50IGZvbGxvd3MuICovCi0gIGludCBQOwkJCS8qIFNjYW4gcHJvZHVjdCBsb3ctb3JkZXIgLT4gaGlnaC4gKi8KLSAgaW50IE47CQkJLyogQXMgaW4gc3VtIGFib3ZlLiAgKi8KLSAgaW50IEE7CQkJLyogV2hpY2ggW10gb2YgYT8gKi8KLSAgaW50IEI7CQkJLyogV2hpY2ggW10gb2YgYj8gKi8KLQotICBpZiAoKGEtPnNpZ24gIT0gJy0nICYmIGEtPnNpZ24gIT0gJysnKSB8fCAoYi0+c2lnbiAhPSAnLScgJiYgYi0+c2lnbiAhPSAnKycpKQotICAgIHsKLSAgICAgIC8qIC4uLgotCQkgICBHb3QgdG8gZmFpbCBzb21laG93LiAgQW55IHN1Z2dlc3Rpb25zPyAqLwotICAgICAgcHJvZHVjdC0+c2lnbiA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBwcm9kdWN0LT5zaWduID0gKGEtPnNpZ24gPT0gYi0+c2lnbikgPyAnKycgOiAnLSc7Ci0gIHNpemVfb2ZfYSA9IGEtPmxlYWRlciAtIGEtPmxvdzsKLSAgc2l6ZV9vZl9iID0gYi0+bGVhZGVyIC0gYi0+bG93OwotICBleHBvbmVudCA9IGEtPmV4cG9uZW50ICsgYi0+ZXhwb25lbnQ7Ci0gIHNpemVfb2ZfcHJvZHVjdCA9IHByb2R1Y3QtPmhpZ2ggLSBwcm9kdWN0LT5sb3c7Ci0gIHNpemVfb2Zfc3VtID0gc2l6ZV9vZl9hICsgc2l6ZV9vZl9iOwotICBleHRyYV9wcm9kdWN0X3Bvc2l0aW9ucyA9IHNpemVfb2ZfcHJvZHVjdCAtIHNpemVfb2Zfc3VtOwotICBpZiAoZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnMgPCAwKQotICAgIHsKLSAgICAgIFAgPSBleHRyYV9wcm9kdWN0X3Bvc2l0aW9uczsJLyogUCA8IDAgKi8KLSAgICAgIGV4cG9uZW50IC09IGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zOwkvKiBJbmNyZWFzZXMgZXhwb25lbnQuICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgUCA9IDA7Ci0gICAgfQotICBjYXJyeSA9IDA7Ci0gIHNpZ25pZmljYW50ID0gMDsKLSAgZm9yIChOID0gMDsgTiA8PSBzaXplX29mX3N1bTsgTisrKQotICAgIHsKLSAgICAgIHdvcmsgPSBjYXJyeTsKLSAgICAgIGNhcnJ5ID0gMDsKLSAgICAgIGZvciAoQSA9IDA7IEEgPD0gTjsgQSsrKQotCXsKLQkgIEIgPSBOIC0gQTsKLQkgIGlmIChBIDw9IHNpemVfb2ZfYSAmJiBCIDw9IHNpemVfb2ZfYiAmJiBCID49IDApCi0JICAgIHsKLSNpZmRlZiBUUkFDRQotCSAgICAgIHByaW50ZiAoImE6bG93WyVkLl09JTA0eCBiOmxvd1slZC5dPSUwNHggd29ya19iZWZvcmU9JTA4eFxuIiwgQSwgYS0+bG93W0FdLCBCLCBiLT5sb3dbQl0sIHdvcmspOwotI2VuZGlmCi0JICAgICAgLyogV2F0Y2ggb3V0IGZvciBzaWduIGV4dGVuc2lvbiEgIFdpdGhvdXQgdGhlIGNhc3RzLCBvbgotCQkgdGhlIERFQyBBbHBoYSwgdGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBpcyAqc2lnbmVkKgotCQkgaW50LCB3aGljaCBnZXRzIHNpZ24tZXh0ZW5kZWQgdG8gY29udmVydCB0byB0aGUKLQkJIHVuc2lnbmVkIGxvbmchICAqLwotCSAgICAgIHdvcmsgKz0gKHVuc2lnbmVkIGxvbmcpIGEtPmxvd1tBXSAqICh1bnNpZ25lZCBsb25nKSBiLT5sb3dbQl07Ci0JICAgICAgY2FycnkgKz0gd29yayA+PiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICAgICAgd29yayAmPSBMSVRUTEVOVU1fTUFTSzsKLSNpZmRlZiBUUkFDRQotCSAgICAgIHByaW50ZiAoIndvcms9JTA4eCBjYXJyeT0lMDR4XG4iLCB3b3JrLCBjYXJyeSk7Ci0jZW5kaWYKLQkgICAgfQotCX0KLSAgICAgIHNpZ25pZmljYW50IHw9IHdvcms7Ci0gICAgICBpZiAoc2lnbmlmaWNhbnQgfHwgUCA8IDApCi0JewotCSAgaWYgKFAgPj0gMCkKLQkgICAgewotCSAgICAgIHByb2R1Y3QtPmxvd1tQXSA9IHdvcms7Ci0jaWZkZWYgVFJBQ0UKLQkgICAgICBwcmludGYgKCJQPSVkLiB3b3JrW3BdOj0lMDR4XG4iLCBQLCB3b3JrKTsKLSNlbmRpZgotCSAgICB9Ci0JICBQKys7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zKys7Ci0JICBleHBvbmVudCsrOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIFtQXS0+IHBvc2l0aW9uICMgc2l6ZV9vZl9zdW0gKyAxLgotICAgKiBUaGlzIGlzIHdoZXJlICdjYXJyeScgc2hvdWxkIGdvLgotICAgKi8KLSNpZmRlZiBUUkFDRQotICBwcmludGYgKCJmaW5hbCBjYXJyeSA9JTA0eFxuIiwgY2FycnkpOwotI2VuZGlmCi0gIGlmIChjYXJyeSkKLSAgICB7Ci0gICAgICBpZiAoZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnMgPiAwKQotCXsKLQkgIHByb2R1Y3QtPmxvd1tQXSA9IGNhcnJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBObyByb29tIGF0IGhpZ2ggb3JkZXIgZm9yIGNhcnJ5IGxpdHRsZW51bS4gKi8KLQkgIC8qIFNoaWZ0IHJpZ2h0IDEgdG8gbWFrZSByb29tIGZvciBtb3N0IHNpZ25pZmljYW50IGxpdHRsZW51bS4gKi8KLQkgIGV4cG9uZW50Kys7Ci0JICBQLS07Ci0JICBmb3IgKHEgPSBwcm9kdWN0LT5sb3cgKyBQOyBxID49IHByb2R1Y3QtPmxvdzsgcS0tKQotCSAgICB7Ci0JICAgICAgd29yayA9ICpxOwotCSAgICAgICpxID0gY2Fycnk7Ci0JICAgICAgY2FycnkgPSB3b3JrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFAtLTsKLSAgICB9Ci0gIHByb2R1Y3QtPmxlYWRlciA9IHByb2R1Y3QtPmxvdyArIFA7Ci0gIHByb2R1Y3QtPmV4cG9uZW50ID0gZXhwb25lbnQ7Ci19Ci0KLS8qIGVuZCBvZiBmbG9udW1fbXVsdC5jICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLmggYi9nYXMvZmxvbnVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODRmNDkuLjAwMDAwMDAKLS0tIGEvZ2FzL2Zsb251bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIGZsb251bS5oIC0gRmxvYXRpbmcgcG9pbnQgcGFja2FnZQotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglBcmJpdHJhcnktcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuCQkJKgotICoJCQkJCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSAqCU5vdGF0aW9uOiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBpcyBleHByZXNzZWQgYXMJCSoKLSAqCU1BTlRJU1NBICogKDIgKiogRVhQT05FTlQpLgkJCQkJKgotICoJCQkJCQkJCQkqCi0gKglJZiB0aGlzIG9mZmVuZHMgbW9yZSB0cmFkaXRpb25hbCBtYXRoZW1hdGljaWFucywgdGhlbgkJKgotICoJcGxlYXNlIHRlbGwgbWUgeW91ciBub21lbmNsYXR1cmUgZm9yIGZsb251bXMhCQkJKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmlnbnVtLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJVmFyaWFibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCQkJKgotICoJCQkJCQkJCQkqCi0gKglFeHBvbmVudCBpcyB0aGUgcGxhY2UgdmFsdWUgb2YgdGhlIGxvdyBsaXR0bGVudW0uIEUuZy46CQkqCi0gKglJZiAgMDogIGxvdyBwb2ludHMgdG8gdGhlIHVuaXRzICAgICAgICAgICAgIGxpdHRsZW51bS4JCSoKLSAqCUlmICAxOiAgbG93IHBvaW50cyB0byB0aGUgTElUVExFTlVNX1JBRElYICAgbGl0dGxlbnVtLgkJKgotICoJSWYgLTE6ICBsb3cgcG9pbnRzIHRvIHRoZSAxL0xJVFRMRU5VTV9SQURJWCBsaXR0bGVudW0uCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEpGOiAgQSBzaWduIHZhbHVlIG9mIDAgbWVhbnMgd2UgaGF2ZSBiZWVuIGFza2VkIHRvIGFzc2VtYmxlIE5hTgotICAgQSBzaWduIHZhbHVlIG9mICdQJyBtZWFucyB3ZSd2ZSBiZWVuIGFza2VkIHRvIGFzc2VtYmxlICtJbmYKLSAgIEEgc2lnbiB2YWx1ZSBvZiAnTicgbWVhbnMgd2UndmUgYmVlbiBhc2tlZCB0byBhc3NlbWJsZSAtSW5mCi0gICAqLwotc3RydWN0IEZMT05VTV9TVFJVQ1QKLXsKLSAgTElUVExFTlVNX1RZUEUgKmxvdzsJCS8qIGxvdyBvcmRlciBsaXR0bGVudW0gb2YgYSBiaWdudW0gKi8KLSAgTElUVExFTlVNX1RZUEUgKmhpZ2g7CQkvKiBoaWdoIG9yZGVyIGxpdHRsZW51bSBvZiBhIGJpZ251bSAqLwotICBMSVRUTEVOVU1fVFlQRSAqbGVhZGVyOwkvKiAtPiAxc3Qgbm9uLXplcm8gbGl0dGxlbnVtICovCi0gIC8qIElmIGZsb251bSBpcyAwLjAsIGxlYWRlcj09bG93LTEgKi8KLSAgbG9uZyBleHBvbmVudDsJCS8qIGJhc2UgTElUVExFTlVNX1JBRElYICovCi0gIGNoYXIgc2lnbjsJCQkvKiAnKycgb3IgJy0nICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBGTE9OVU1fU1RSVUNUIEZMT05VTV9UWVBFOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJU2luY2Ugd2UgY2FuICgmIGRvKSBtZWV0IHdpdGggZXhwb25lbnRzIGxpa2UgMTBeNTAwMCwgaXQJKgotICoJaXMgc2lsbHkgdG8gbWFrZSBhIHRhYmxlIG9mIH4gMTAsMDAwIGVudHJpZXMsIG9uZSBmb3IgZWFjaAkqCi0gKglwb3dlciBvZiAxMC4gV2Uga2VlcCBhIHRhYmxlIHdoZXJlIGl0ZW0gW25dIGlzIGEgc3RydWN0CQkqCi0gKglGTE9OVU1fRkxPQVRJTkdfUE9JTlQgcmVwcmVzZW50aW5nIDEwXigyXm4pLiBXZSB0aGVuCQkqCi0gKgltdWx0aXBseSBhcHByb3ByaWF0ZSBlbnRyaWVzIGZyb20gdGhpcyB0YWJsZSB0byBnZXQgYW55CQkqCi0gKglwYXJ0aWN1bGFyIHBvd2VyIG9mIDEwLiBGb3IgdGhlIGV4YW1wbGUgb2YgMTBeNTAwMCwgYSB0YWJsZQkqCi0gKglvZiBqdXN0IDI1IGVudHJpZXMgc3VmZmljZXM6IDEwXigyXi0xMikuLi4xMF4oMl4rMTIpLgkJKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLWV4dGVybiBjb25zdCBGTE9OVU1fVFlQRSBmbG9udW1fcG9zaXRpdmVfcG93ZXJzX29mX3RlbltdOwotZXh0ZXJuIGNvbnN0IEZMT05VTV9UWVBFIGZsb251bV9uZWdhdGl2ZV9wb3dlcnNfb2ZfdGVuW107Ci1leHRlcm4gY29uc3QgaW50IHRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW47Ci0vKiBGbG9udW1fWFhYX3Bvd2Vyc19vZl90ZW5bXSB0YWJsZSBoYXMgKi8KLS8qIGxlZ2FsIGluZGljZXMgZnJvbSAwIHRvICovCi0vKiArIHRoaXMgbnVtYmVyIGluY2x1c2l2ZS4gKi8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJRGVjbGFyZSB3b3JrZXIgZnVuY3Rpb25zLgkJCQkJKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgYXRvZl9nZW5lcmljIFBBUkFNUyAoKGNoYXIgKiphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyLAotCQkJICBjb25zdCBjaGFyICpzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrcywKLQkJCSAgY29uc3QgY2hhciAqc3RyaW5nX29mX2RlY2ltYWxfZXhwb25lbnRfbWFya3MsCi0JCQkgIEZMT05VTV9UWVBFICogYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcikpOwotCi12b2lkIGZsb251bV9jb3B5IFBBUkFNUyAoKEZMT05VTV9UWVBFICogaW4sIEZMT05VTV9UWVBFICogb3V0KSk7Ci12b2lkIGZsb251bV9tdWx0aXAgUEFSQU1TICgoY29uc3QgRkxPTlVNX1RZUEUgKiBhLCBjb25zdCBGTE9OVU1fVFlQRSAqIGIsCi0JCQkgICAgRkxPTlVNX1RZUEUgKiBwcm9kdWN0KSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJRGVjbGFyZSBlcnJvciBjb2Rlcy4JCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRVJST1JfRVhQT05FTlRfT1ZFUkZMT1cgKDIpCi0KLS8qIGVuZCBvZiBmbG9udW0uaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2ZyYWdzLmMgYi9nYXMvZnJhZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyY2IxMi4uMDAwMDAwMAotLS0gYS9nYXMvZnJhZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKiBmcmFncy5jIC0gbWFuYWdlIGZyYWdzIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotZXh0ZXJuIGZyYWdTIHplcm9fYWRkcmVzc19mcmFnOwotZXh0ZXJuIGZyYWdTIGJzc19hZGRyZXNzX2ZyYWc7Ci0MCi0vKiBJbml0aWFsaXphdGlvbiBmb3IgZnJhZyByb3V0aW5lcy4gICovCi12b2lkCi1mcmFnX2luaXQgKCkKLXsKLSAgemVyb19hZGRyZXNzX2ZyYWcuZnJfdHlwZSA9IHJzX2ZpbGw7Ci0gIGJzc19hZGRyZXNzX2ZyYWcuZnJfdHlwZSA9IHJzX2ZpbGw7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBhIGZyYWcgb24gdGhlIHNwZWNpZmllZCBvYnN0YWNrLgotICAgQ2FsbCB0aGlzIHJvdXRpbmUgZnJvbSBldmVyeXdoZXJlIGVsc2UsIHNvIHRoYXQgYWxsIHRoZSB3ZWlyZCBhbGlnbm1lbnQKLSAgIGhhY2tlcnkgY2FuIGJlIGRvbmUgaW4ganVzdCBvbmUgcGxhY2UuICAqLwotZnJhZ1MgKgotZnJhZ19hbGxvYyAob2IpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYjsKLXsKLSAgZnJhZ1MgKnB0cjsKLSAgaW50IG9hbGlnbjsKLQotICAodm9pZCkgb2JzdGFja19hbGxvYyAob2IsIDApOwotICBvYWxpZ24gPSBvYnN0YWNrX2FsaWdubWVudF9tYXNrIChvYik7Ci0gIG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKG9iKSA9IDA7Ci0gIHB0ciA9IChmcmFnUyAqKSBvYnN0YWNrX2FsbG9jIChvYiwgU0laRU9GX1NUUlVDVF9GUkFHKTsKLSAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAob2IpID0gb2FsaWduOwotICBtZW1zZXQgKHB0ciwgMCwgU0laRU9GX1NUUlVDVF9GUkFHKTsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qCi0gKgkJCWZyYWdfZ3JvdygpCi0gKgotICogVHJ5IHRvIGF1Z21lbnQgY3VycmVudCBmcmFnIGJ5IG5jaGFycyBjaGFycy4KLSAqIElmIHRoZXJlIGlzIG5vIHJvb20sIGNsb3NlIG9mIHRoZSBjdXJyZW50IGZyYWcgd2l0aCBhICIuZmlsbCAwIgotICogYW5kIGJlZ2luIGEgbmV3IGZyYWcuIFVubGVzcyB0aGUgbmV3IGZyYWcgaGFzIG5jaGFycyBjaGFycyBhdmFpbGFibGUKLSAqIGRvIG5vdCByZXR1cm4uIERvIG5vdCBzZXQgdXAgYW55IGZpZWxkcyBvZiAqbm93X2ZyYWcuCi0gKi8KLXZvaWQgCi1mcmFnX2dyb3cgKG5jaGFycykKLSAgICAgdW5zaWduZWQgaW50IG5jaGFyczsKLXsKLSAgaWYgKG9ic3RhY2tfcm9vbSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spIDwgbmNoYXJzKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuOwotICAgICAgbG9uZyBvbGRjOwotCi0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbmV3ICgwKTsKLSAgICAgIG9sZGMgPSBmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLmNodW5rX3NpemU7Ci0gICAgICBmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLmNodW5rX3NpemUgPSAyICogbmNoYXJzICsgU0laRU9GX1NUUlVDVF9GUkFHOwotICAgICAgd2hpbGUgKChuID0gb2JzdGFja19yb29tICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykpIDwgbmNoYXJzKQotCXsKLQkgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotCSAgZnJhZ19uZXcgKDApOwotCX0KLSAgICAgIGZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2suY2h1bmtfc2l6ZSA9IG9sZGM7Ci0gICAgfQotICBpZiAob2JzdGFja19yb29tICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgPCBuY2hhcnMpCi0gICAgYXNfZmF0YWwgKF8oIkNhbid0IGV4dGVuZCBmcmFnICVkLiBjaGFycyIpLCBuY2hhcnMpOwotfQotDAotLyoKLSAqCQkJZnJhZ19uZXcoKQotICoKLSAqIENhbGwgdGhpcyB0byBjbG9zZSBvZmYgYSBjb21wbGV0ZWQgZnJhZywgYW5kIHN0YXJ0IHVwIGEgbmV3IChlbXB0eSkKLSAqIGZyYWcsIGluIHRoZSBzYW1lIHN1YnNlZ21lbnQgYXMgdGhlIG9sZCBmcmFnLgotICogW2ZyY2hhaW5fbm93IHJlbWFpbnMgdGhlIHNhbWUgYnV0IGZyYWdfbm93IGlzIHVwZGF0ZWQuXQotICogQmVjYXVzZSB0aGlzIGNhbGN1bGF0ZXMgdGhlIGNvcnJlY3QgdmFsdWUgb2YgZnJfZml4IGJ5Ci0gKiBsb29raW5nIGF0IHRoZSBvYnN0YWNrICdmcmFncycsIGl0IG5lZWRzIHRvIGtub3cgaG93IG1hbnkKLSAqIGNoYXJhY3RlcnMgYXQgdGhlIGVuZCBvZiB0aGUgb2xkIGZyYWcgYmVsb25nIHRvICh0aGUgbWF4aW1hbCkKLSAqIGZyX3ZhcjogdGhlIHJlc3QgbXVzdCBiZWxvbmcgdG8gZnJfZml4LgotICogSXQgZG9lc24ndCBhY3R1YWxseSBzZXQgdXAgdGhlIG9sZCBmcmFnJ3MgZnJfdmFyOiB5b3UgbWF5IGhhdmUKLSAqIHNldCBmcl92YXIgPT0gMSwgYnV0IGFsbG9jYXRlZCAxMCBjaGFycyB0byB0aGUgZW5kIG9mIHRoZSBmcmFnOgotICogaW4gdGhpcyBjYXNlIHlvdSBwYXNzIG9sZF9mcmFnc192YXJfbWF4X3NpemUgPT0gMTAuCi0gKgotICogTWFrZSBhIG5ldyBmcmFnLCBpbml0aWFsaXNpbmcgc29tZSBjb21wb25lbnRzLiBMaW5rIG5ldyBmcmFnIGF0IGVuZAotICogb2YgZnJjaGFpbl9ub3cuCi0gKi8KLXZvaWQgCi1mcmFnX25ldyAob2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZSkKLSAgICAgLyogTnVtYmVyIG9mIGNoYXJzIChhbHJlYWR5IGFsbG9jYXRlZCBvbiBvYnN0YWNrIGZyYWdzKSBpbgotCXZhcmlhYmxlX2xlbmd0aCBwYXJ0IG9mIGZyYWcuICovCi0gICAgIGludCBvbGRfZnJhZ3NfdmFyX21heF9zaXplOwotewotICBmcmFnUyAqZm9ybWVyX2xhc3RfZnJhZ1A7Ci0gIGZyY2hhaW5TICpmcmNoUDsKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93LT5mcmNoX2xhc3QgPT0gZnJhZ19ub3cpOwotCi0gIC8qIEZpeCB1cCBvbGQgZnJhZydzIGZyX2ZpeC4gICovCi0gIGZyYWdfbm93LT5mcl9maXggPSBmcmFnX25vd19maXhfb2N0ZXRzICgpIC0gb2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZTsKLSAgLyogTWFrZSBzdXJlIGl0cyB0eXBlIGlzIHZhbGlkLiAgKi8KLSAgYXNzZXJ0IChmcmFnX25vdy0+ZnJfdHlwZSAhPSAwKTsKLQotICAvKiBUaGlzIHdpbGwgYWxpZ24gdGhlIG9ic3RhY2sgc28gdGhlIG5leHQgc3RydWN0IHdlIGFsbG9jYXRlIG9uIGl0Ci0gICAgIHdpbGwgYmVnaW4gYXQgYSBjb3JyZWN0IGJvdW5kYXJ5LiAqLwotICBvYnN0YWNrX2ZpbmlzaCAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOwotICBmcmNoUCA9IGZyY2hhaW5fbm93OwotICBrbm93IChmcmNoUCk7Ci0gIGZvcm1lcl9sYXN0X2ZyYWdQID0gZnJjaFAtPmZyY2hfbGFzdDsKLSAgYXNzZXJ0IChmb3JtZXJfbGFzdF9mcmFnUCAhPSAwKTsKLSAgYXNzZXJ0IChmb3JtZXJfbGFzdF9mcmFnUCA9PSBmcmFnX25vdyk7Ci0gIGZyYWdfbm93ID0gZnJhZ19hbGxvYyAoJmZyY2hQLT5mcmNoX29ic3RhY2spOwotCi0gIGFzX3doZXJlICgmZnJhZ19ub3ctPmZyX2ZpbGUsICZmcmFnX25vdy0+ZnJfbGluZSk7Ci0KLSAgLyogR2VuZXJhbGx5LCBmcmFnX25vdy0+cG9pbnRzIHRvIGFuIGFkZHJlc3Mgcm91bmRlZCB1cCB0byBuZXh0Ci0gICAgIGFsaWdubWVudC4gIEhvd2V2ZXIsIGNoYXJhY3RlcnMgd2lsbCBhZGQgdG8gb2JzdGFjayBmcmFncwotICAgICBJTU1FRElBVEVMWSBhZnRlciB0aGUgc3RydWN0IGZyYWcsIGV2ZW4gaWYgdGhleSBhcmUgbm90IHN0YXJ0aW5nCi0gICAgIGF0IGFuIGFsaWdubWVudCBhZGRyZXNzLiAqLwotICBmb3JtZXJfbGFzdF9mcmFnUC0+ZnJfbmV4dCA9IGZyYWdfbm93OwotICBmcmNoUC0+ZnJjaF9sYXN0ID0gZnJhZ19ub3c7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICB7Ci0gICAgZXh0ZXJuIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICpsaXN0aW5nX3RhaWw7Ci0gICAgZnJhZ19ub3ctPmxpbmUgPSBsaXN0aW5nX3RhaWw7Ci0gIH0KLSNlbmRpZgotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgZnJhZ19ub3ctPmZyX25leHQgPSBOVUxMOwotfQkJCQkvKiBmcmFnX25ldygpICovCi0MCi0vKgotICoJCQlmcmFnX21vcmUoKQotICoKLSAqIFN0YXJ0IGEgbmV3IGZyYWcgdW5sZXNzIHdlIGhhdmUgbiBtb3JlIGNoYXJzIG9mIHJvb20gaW4gdGhlIGN1cnJlbnQgZnJhZy4KLSAqIENsb3NlIG9mZiB0aGUgb2xkIGZyYWcgd2l0aCBhIC5maWxsIDAuCi0gKgotICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSAxc3QgY2hhciB0byB3cml0ZSBpbnRvLiBBZHZhbmNlCi0gKiBmcmFnX25vd19ncm93dGggcGFzdCB0aGUgbmV3IGNoYXJzLgotICovCi0KLWNoYXIgKgotZnJhZ19tb3JlIChuY2hhcnMpCi0gICAgIGludCBuY2hhcnM7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldHZhbDsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byBhbGxvY2F0ZSBkYXRhIGluIGFic29sdXRlIHNlY3Rpb24iKSk7Ci0gICAgICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotICAgIH0KLQotICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gYWxsb2NhdGUgZGF0YSBpbiBjb21tb24gc2VjdGlvbiIpKTsKLSAgICAgIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLSAgICB9Ci0KLSAgZnJhZ19ncm93IChuY2hhcnMpOwotICByZXR2YWwgPSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOwotICBvYnN0YWNrX2JsYW5rX2Zhc3QgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLCBuY2hhcnMpOwotICByZXR1cm4gKHJldHZhbCk7Ci19CQkJCS8qIGZyYWdfbW9yZSgpICovCi0MCi0vKgotICoJCQlmcmFnX3ZhcigpCi0gKgotICogU3RhcnQgYSBuZXcgZnJhZyB1bmxlc3Mgd2UgaGF2ZSBtYXhfY2hhcnMgbW9yZSBjaGFycyBvZiByb29tIGluIHRoZSBjdXJyZW50IGZyYWcuCi0gKiBDbG9zZSBvZmYgdGhlIG9sZCBmcmFnIHdpdGggYSAuZmlsbCAwLgotICoKLSAqIFNldCB1cCBhIG1hY2hpbmVfZGVwZW5kZW50IHJlbGF4YWJsZSBmcmFnLCB0aGVuIHN0YXJ0IGEgbmV3IGZyYWcuCi0gKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIDFzdCBjaGFyIG9mIHRoZSB2YXIgcGFydCBvZiB0aGUgb2xkIGZyYWcKLSAqIHRvIHdyaXRlIGludG8uCi0gKi8KLQotY2hhciAqCi1mcmFnX3ZhciAodHlwZSwgbWF4X2NoYXJzLCB2YXIsIHN1YnR5cGUsIHN5bWJvbCwgb2Zmc2V0LCBvcGNvZGUpCi0gICAgIHJlbGF4X3N0YXRlVCB0eXBlOwotICAgICBpbnQgbWF4X2NoYXJzOwotICAgICBpbnQgdmFyOwotICAgICByZWxheF9zdWJzdGF0ZVQgc3VidHlwZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sOwotICAgICBvZmZzZXRUIG9mZnNldDsKLSAgICAgY2hhciAqb3Bjb2RlOwotewotICByZWdpc3RlciBjaGFyICpyZXR2YWw7Ci0KLSAgZnJhZ19ncm93IChtYXhfY2hhcnMpOwotICByZXR2YWwgPSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOwotICBvYnN0YWNrX2JsYW5rX2Zhc3QgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLCBtYXhfY2hhcnMpOwotICBmcmFnX25vdy0+ZnJfdmFyID0gdmFyOwotICBmcmFnX25vdy0+ZnJfdHlwZSA9IHR5cGU7Ci0gIGZyYWdfbm93LT5mcl9zdWJ0eXBlID0gc3VidHlwZTsKLSAgZnJhZ19ub3ctPmZyX3N5bWJvbCA9IHN5bWJvbDsKLSAgZnJhZ19ub3ctPmZyX29mZnNldCA9IG9mZnNldDsKLSAgZnJhZ19ub3ctPmZyX29wY29kZSA9IG9wY29kZTsKLSNpZmRlZiBVU0lOR19DR0VOCi0gIGZyYWdfbm93LT5mcl9jZ2VuLmluc24gPSAwOwotICBmcmFnX25vdy0+ZnJfY2dlbi5vcGluZGV4ID0gMDsKLSAgZnJhZ19ub3ctPmZyX2NnZW4ub3BpbmZvID0gMDsKLSNlbmRpZgotI2lmZGVmIFRDX0ZSQUdfSU5JVAotICBUQ19GUkFHX0lOSVQgKGZyYWdfbm93KTsKLSNlbmRpZgotICBhc193aGVyZSAoJmZyYWdfbm93LT5mcl9maWxlLCAmZnJhZ19ub3ctPmZyX2xpbmUpOwotICBmcmFnX25ldyAobWF4X2NoYXJzKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQotDAotLyoKLSAqCQkJZnJhZ192YXJpYW50KCkKLSAqCi0gKiBPVkU6IFRoaXMgdmFyaWFudCBvZiBmcmFnX3ZhciBhc3N1bWVzIHRoYXQgc3BhY2UgZm9yIHRoZSB0YWlsIGhhcyBiZWVuCi0gKiAgICAgIGFsbG9jYXRlZCBieSBjYWxsZXIuCi0gKiAgICAgIE5vIGNhbGwgdG8gZnJhZ19ncm93IGlzIGRvbmUuCi0gKi8KLQotY2hhciAqCi1mcmFnX3ZhcmlhbnQgKHR5cGUsIG1heF9jaGFycywgdmFyLCBzdWJ0eXBlLCBzeW1ib2wsIG9mZnNldCwgb3Bjb2RlKQotICAgICByZWxheF9zdGF0ZVQgdHlwZTsKLSAgICAgaW50IG1heF9jaGFyczsKLSAgICAgaW50IHZhcjsKLSAgICAgcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbDsKLSAgICAgb2Zmc2V0VCBvZmZzZXQ7Ci0gICAgIGNoYXIgKm9wY29kZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcmV0dmFsOwotCi0gIHJldHZhbCA9IG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjayk7Ci0gIGZyYWdfbm93LT5mcl92YXIgPSB2YXI7Ci0gIGZyYWdfbm93LT5mcl90eXBlID0gdHlwZTsKLSAgZnJhZ19ub3ctPmZyX3N1YnR5cGUgPSBzdWJ0eXBlOwotICBmcmFnX25vdy0+ZnJfc3ltYm9sID0gc3ltYm9sOwotICBmcmFnX25vdy0+ZnJfb2Zmc2V0ID0gb2Zmc2V0OwotICBmcmFnX25vdy0+ZnJfb3Bjb2RlID0gb3Bjb2RlOwotI2lmZGVmIFVTSU5HX0NHRU4KLSAgZnJhZ19ub3ctPmZyX2NnZW4uaW5zbiA9IDA7Ci0gIGZyYWdfbm93LT5mcl9jZ2VuLm9waW5kZXggPSAwOwotICBmcmFnX25vdy0+ZnJfY2dlbi5vcGluZm8gPSAwOwotI2VuZGlmCi0jaWZkZWYgVENfRlJBR19JTklUCi0gIFRDX0ZSQUdfSU5JVCAoZnJhZ19ub3cpOwotI2VuZGlmCi0gIGFzX3doZXJlICgmZnJhZ19ub3ctPmZyX2ZpbGUsICZmcmFnX25vdy0+ZnJfbGluZSk7Ci0gIGZyYWdfbmV3IChtYXhfY2hhcnMpOwotICByZXR1cm4gKHJldHZhbCk7Ci19CQkJCS8qIGZyYWdfdmFyaWFudCgpICovCi0MCi0vKgotICoJCQlmcmFnX3dhbmUoKQotICoKLSAqIFJlZHVjZSB0aGUgdmFyaWFibGUgZW5kIG9mIGEgZnJhZyB0byBhIGhhcm1sZXNzIHN0YXRlLgotICovCi12b2lkIAotZnJhZ193YW5lIChmcmFnUCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0gIGZyYWdQLT5mcl9vZmZzZXQgPSAwOwotICBmcmFnUC0+ZnJfdmFyID0gMDsKLX0KLQwKLS8qIE1ha2UgYW4gYWxpZ25tZW50IGZyYWcuICBUaGUgc2l6ZSBvZiB0aGlzIGZyYWcgd2lsbCBiZSBhZGp1c3RlZCB0bwotICAgZm9yY2UgdGhlIG5leHQgZnJhZyB0byBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhbGlnbm1lbnQuICBBTElHTk1FTlQKLSAgIGlzIHRoZSBwb3dlciBvZiB0d28gdG8gd2hpY2ggdG8gYWxpZ24uICBGSUxMX0NIQVJBQ1RFUiBpcyB0aGUKLSAgIGNoYXJhY3RlciB0byB1c2UgdG8gZmlsbCBpbiBhbnkgYnl0ZXMgd2hpY2ggYXJlIHNraXBwZWQuICBNQVggaXMKLSAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbiBkb2luZyB0aGUgYWxpZ25tZW50LAotICAgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLQotdm9pZCAKLWZyYWdfYWxpZ24gKGFsaWdubWVudCwgZmlsbF9jaGFyYWN0ZXIsIG1heCkKLSAgICAgaW50IGFsaWdubWVudDsKLSAgICAgaW50IGZpbGxfY2hhcmFjdGVyOwotICAgICBpbnQgbWF4OwotewotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGFkZHJlc3NUIG5ld19vZmY7Ci0KLSAgICAgIG5ld19vZmYgPSAoKGFic19zZWN0aW9uX29mZnNldCArIGFsaWdubWVudCAtIDEpCi0JCSAmfiAoKDEgPDwgYWxpZ25tZW50KSAtIDEpKTsKLSAgICAgIGlmIChtYXggPT0gMCB8fCBuZXdfb2ZmIC0gYWJzX3NlY3Rpb25fb2Zmc2V0IDw9IChhZGRyZXNzVCkgbWF4KQotCWFic19zZWN0aW9uX29mZnNldCA9IG5ld19vZmY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqcDsKLQotICAgICAgcCA9IGZyYWdfdmFyIChyc19hbGlnbiwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgbWF4LAotCQkgICAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIGFsaWdubWVudCwgKGNoYXIgKikgMCk7Ci0gICAgICAqcCA9IGZpbGxfY2hhcmFjdGVyOwotICAgIH0KLX0KLQotLyogTWFrZSBhbiBhbGlnbm1lbnQgZnJhZyBsaWtlIGZyYWdfYWxpZ24sIGJ1dCBmaWxsIHdpdGggYSByZXBlYXRpbmcKLSAgIHBhdHRlcm4gcmF0aGVyIHRoYW4gYSBzaW5nbGUgYnl0ZS4gIEFMSUdOTUVOVCBpcyB0aGUgcG93ZXIgb2YgdHdvCi0gICB0byB3aGljaCB0byBhbGlnbi4gIEZJTExfUEFUVEVSTiBpcyB0aGUgZmlsbCBwYXR0ZXJuIHRvIHJlcGVhdCBpbgotICAgdGhlIGJ5dGVzIHdoaWNoIGFyZSBza2lwcGVkLiAgTl9GSUxMIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4KLSAgIEZJTExfUEFUVEVSTi4gIE1BWCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwIHdoZW4KLSAgIGRvaW5nIHRoZSBhbGlnbm1lbnQsIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0KLXZvaWQgCi1mcmFnX2FsaWduX3BhdHRlcm4gKGFsaWdubWVudCwgZmlsbF9wYXR0ZXJuLCBuX2ZpbGwsIG1heCkKLSAgICAgaW50IGFsaWdubWVudDsKLSAgICAgY29uc3QgY2hhciAqZmlsbF9wYXR0ZXJuOwotICAgICBpbnQgbl9maWxsOwotICAgICBpbnQgbWF4OwotewotICBjaGFyICpwOwotCi0gIHAgPSBmcmFnX3ZhciAocnNfYWxpZ24sIG5fZmlsbCwgbl9maWxsLCAocmVsYXhfc3Vic3RhdGVUKSBtYXgsCi0JCShzeW1ib2xTICopIDAsIChvZmZzZXRUKSBhbGlnbm1lbnQsIChjaGFyICopIDApOwotICBtZW1jcHkgKHAsIGZpbGxfcGF0dGVybiwgbl9maWxsKTsKLX0KLQotYWRkcmVzc1QKLWZyYWdfbm93X2ZpeF9vY3RldHMgKCkKLXsKLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm4gYWJzX3NlY3Rpb25fb2Zmc2V0OwotCi0gIHJldHVybiAoKGNoYXIqKSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spCi0gICAgICAgICAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCk7Ci19Ci0KLWFkZHJlc3NUCi1mcmFnX25vd19maXggKCkKLXsKLSAgcmV0dXJuIGZyYWdfbm93X2ZpeF9vY3RldHMoKSAvIE9DVEVUU19QRVJfQllURTsKLX0KLQotdm9pZAotZnJhZ19hcHBlbmRfMV9jaGFyIChkYXR1bSkKLSAgICAgaW50IGRhdHVtOwotewotICBpZiAob2JzdGFja19yb29tICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgPD0gMSkKLSAgICB7Ci0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbmV3ICgwKTsKLSAgICB9Ci0gIG9ic3RhY2tfMWdyb3cgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLCBkYXR1bSk7Ci19Ci0KLS8qIGVuZCBvZiBmcmFncy5jICovCmRpZmYgLS1naXQgYS9nYXMvZnJhZ3MuaCBiL2dhcy9mcmFncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGM2ZTM4Li4wMDAwMDAwCi0tLSBhL2dhcy9mcmFncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qIGZyYWdzLmggLSBIZWFkZXIgZmlsZSBmb3IgdGhlIGZyYWcgY29uY2VwdC4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgRlJBR1NfSAotI2RlZmluZSBGUkFHU19ICi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBvYnN0YWNrOwotI2VuZGlmCi0KLS8qCi0gKiBBIGNvZGUgZnJhZ21lbnQgKGZyYWcpIGlzIHNvbWUga25vd24gbnVtYmVyIG9mIGNoYXJzLCBmb2xsb3dlZCBieSBzb21lCi0gKiB1bmtub3duIG51bWJlciBvZiBjaGFycy4gVHlwaWNhbGx5IHRoZSB1bmtub3duIG51bWJlciBvZiBjaGFycyBpcyBhbgotICogaW5zdHJ1Y3Rpb24gYWRkcmVzcyB3aG9zZSBzaXplIGlzIHlldCB1bmtub3duLiBXZSBhbHdheXMga25vdyB0aGUgZ3JlYXRlc3QKLSAqIHBvc3NpYmxlIHNpemUgdGhlIHVua25vd24gbnVtYmVyIG9mIGNoYXJzIG1heSBiZWNvbWUsIGFuZCByZXNlcnZlIHRoYXQKLSAqIG11Y2ggcm9vbSBhdCB0aGUgZW5kIG9mIHRoZSBmcmFnLgotICogT25jZSBjcmVhdGVkLCBmcmFncyBkbyBub3QgY2hhbmdlIGFkZHJlc3MgZHVyaW5nIGFzc2VtYmx5LgotICogV2UgY2hhaW4gdGhlIGZyYWdzIGluIChhKSBmb3J3YXJkLWxpbmtlZCBsaXN0KHMpLiBUaGUgb2JqZWN0LWZpbGUgYWRkcmVzcwotICogb2YgdGhlIDFzdCBjaGFyIG9mIGEgZnJhZyBpcyBnZW5lcmFsbHkgbm90IGtub3duIHVudGlsIGFmdGVyIHJlbGF4KCkuCi0gKiBNYW55IHRoaW5ncyBhdCBhc3NlbWJseSB0aW1lIGRlc2NyaWJlIGFuIGFkZHJlc3MgYnkge29iamVjdC1maWxlLWFkZHJlc3MKLSAqIG9mIGEgcGFydGljdWxhciBmcmFnfStvZmZzZXQuCi0KLSBCVUc6IGl0IG1heSBiZSBzbWFydGVyIHRvIGhhdmUgYSBzaW5nbGUgcG9pbnRlciBvZmYgdG8gdmFyaW91cyBkaWZmZXJlbnQKLSBub3RlcyBmb3IgZGlmZmVyZW50IGZyYWcga2luZHMuIFNlZSBob3cgY29kZSBwYW5zCi0gKi8KLQotc3RydWN0IGZyYWcKLXsKLSAgLyogT2JqZWN0IGZpbGUgYWRkcmVzcyAoYXMgYW4gb2N0ZXQgb2Zmc2V0KS4gKi8KLSAgYWRkcmVzc1QgZnJfYWRkcmVzczsKLSAgLyogQ2hhaW4gZm9yd2FyZDsgYXNjZW5kaW5nIGFkZHJlc3Mgb3JkZXIuICBSb290ZWQgaW4gZnJjaF9yb290LiAqLwotICBzdHJ1Y3QgZnJhZyAqZnJfbmV4dDsKLQotICAvKiAoRml4ZWQpIG51bWJlciBvZiBvY3RldHMgd2Uga25vdyB3ZSBoYXZlLiAgTWF5IGJlIDAuICovCi0gIG9mZnNldFQgZnJfZml4OwotICAvKiAoVmFyaWFibGUpIG51bWJlciBvZiBvY3RldHMgYWZ0ZXIgYWJvdmUuICBNYXkgYmUgMC4gKi8KLSAgb2Zmc2V0VCBmcl92YXI7Ci0gIC8qIEZvciB2YXJpYWJsZS1sZW5ndGggdGFpbC4gKi8KLSAgc3ltYm9sUyAqZnJfc3ltYm9sOwotICAvKiBGb3IgdmFyaWFibGUtbGVuZ3RoIHRhaWwuICovCi0gIG9mZnNldFQgZnJfb2Zmc2V0OwotICAvKiBQb2ludHMgdG8gb3Bjb2RlIGxvdyBhZGRyIGJ5dGUsIGZvciByZWxheGF0aW9uLiAgKi8KLSAgY2hhciAqZnJfb3Bjb2RlOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgKmxpbmU7Ci0jZW5kaWYKLQotICAvKiBXaGF0IHN0YXRlIGlzIG15IHRhaWwgaW4/ICovCi0gIHJlbGF4X3N0YXRlVCBmcl90eXBlOwotICByZWxheF9zdWJzdGF0ZVQgZnJfc3VidHlwZTsKLQotI2lmZGVmIFVTSU5HX0NHRU4KLSAgLyogRG9uJ3QgaW5jbHVkZSB0aGlzIHVubGVzcyB1c2luZyBDR0VOIHRvIGtlZXAgZnJhZyBzaXplIGRvd24uICAqLwotICBzdHJ1Y3QgewotICAgIC8qIENHRU5fSU5TTiBlbnRyeSBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgY29uc3Qgc3RydWN0IGNnZW5faW5zbiAqaW5zbjsKLSAgICAvKiBJbmRleCBpbnRvIG9wZXJhbmQgdGFibGUuICAqLwotICAgIGludCBvcGluZGV4OwotICAgIC8qIFRhcmdldCBzcGVjaWZpYyBkYXRhLCB1c3VhbGx5IHJlbG9jIG51bWJlci4gICovCi0gICAgaW50IG9waW5mbzsKLSAgfSBmcl9jZ2VuOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19GUkFHX1RZUEUKLSAgVENfRlJBR19UWVBFIHRjX2ZyYWdfZGF0YTsKLSNlbmRpZgotCi0gIC8qIFdoZXJlIHRoZSBmcmFnIHdhcyBjcmVhdGVkLCBvciB3aGVyZSBpdCBiZWNhbWUgYSB2YXJpYW50IGZyYWcuICAqLwotICBjaGFyICpmcl9maWxlOwotICB1bnNpZ25lZCBpbnQgZnJfbGluZTsKLQotICAvKiBEYXRhIGJlZ2lucyBoZXJlLiAgKi8KLSAgY2hhciBmcl9saXRlcmFsWzFdOwotfTsKLQotI2RlZmluZSBTSVpFT0ZfU1RSVUNUX0ZSQUcgXAotKChjaGFyICopemVyb19hZGRyZXNzX2ZyYWcuZnJfbGl0ZXJhbC0oY2hhciAqKSZ6ZXJvX2FkZHJlc3NfZnJhZykKLS8qIFdlIHdhbnQgdG8gc2F5IGZyX2xpdGVyYWxbMF0gYWJvdmUuICovCi0KLS8qIEN1cnJlbnQgZnJhZyB3ZSBhcmUgYnVpbGRpbmcuICBUaGlzIGZyYWcgaXMgaW5jb21wbGV0ZS4gIEl0IGlzLAotICAgaG93ZXZlciwgaW5jbHVkZWQgaW4gZnJjaGFpbl9ub3cuICBUaGUgZnJfZml4IGZpZWxkIGlzIGJvZ3VzOwotICAgaW5zdGVhZCwgdXNlIGZyYWdfbm93X2ZpeCAoKS4gICovCi1DT01NT04gZnJhZ1MgKmZyYWdfbm93OwotZXh0ZXJuIGFkZHJlc3NUIGZyYWdfbm93X2ZpeCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gYWRkcmVzc1QgZnJhZ19ub3dfZml4X29jdGV0cyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZvciBmb3JlaWduLXNlZ21lbnQgc3ltYm9sIGZpeHVwcy4gKi8KLUNPTU1PTiBmcmFnUyB6ZXJvX2FkZHJlc3NfZnJhZzsKLS8qIEZvciBsb2NhbCBjb21tb24gKE5fQlNTIHNlZ21lbnQpIGZpeHVwcy4gKi8KLUNPTU1PTiBmcmFnUyBic3NfYWRkcmVzc19mcmFnOwotCi0jaWYgMAotLyoKLSAqIEEgbWFjcm8gdG8gc3BlZWQgdXAgYXBwZW5kaW5nIGV4YWN0bHkgMSBjaGFyCi0gKiB0byBjdXJyZW50IGZyYWcuCi0gKi8KLS8qIEpGIGNoYW5nZWQgPCAxIHRvIDw9IDEgdG8gYXZvaWQgYSByYWNlIGNvbmRpdG9uICovCi0jZGVmaW5lIEZSQUdfQVBQRU5EXzFfQ0hBUihkYXR1bSkJXAotewkJCQkJXAotICBpZiAob2JzdGFja19yb29tKCAmZnJhZ3MgKSA8PSAxKSB7XAotICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwlcCi0gICAgZnJhZ19uZXcgKDApOwkJXAotICB9CQkJCVwKLSAgb2JzdGFja18xZ3JvdyggJmZyYWdzLCBkYXR1bSApOwlcCi19Ci0jZWxzZQotZXh0ZXJuIHZvaWQgZnJhZ19hcHBlbmRfMV9jaGFyIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBGUkFHX0FQUEVORF8xX0NIQVIoWCkgZnJhZ19hcHBlbmRfMV9jaGFyIChYKQotI2VuZGlmCi0KLQotdm9pZCBmcmFnX2luaXQgUEFSQU1TICgodm9pZCkpOwotZnJhZ1MgKmZyYWdfYWxsb2MgUEFSQU1TICgoc3RydWN0IG9ic3RhY2sgKikpOwotdm9pZCBmcmFnX2dyb3cgUEFSQU1TICgodW5zaWduZWQgaW50IG5jaGFycykpOwotY2hhciAqZnJhZ19tb3JlIFBBUkFNUyAoKGludCBuY2hhcnMpKTsKLXZvaWQgZnJhZ19hbGlnbiBQQVJBTVMgKChpbnQgYWxpZ25tZW50LCBpbnQgZmlsbF9jaGFyYWN0ZXIsIGludCBtYXgpKTsKLXZvaWQgZnJhZ19hbGlnbl9wYXR0ZXJuIFBBUkFNUyAoKGludCBhbGlnbm1lbnQsCi0JCQkJIGNvbnN0IGNoYXIgKmZpbGxfcGF0dGVybiwKLQkJCQkgaW50IG5fZmlsbCwKLQkJCQkgaW50IG1heCkpOwotdm9pZCBmcmFnX25ldyBQQVJBTVMgKChpbnQgb2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZSkpOwotdm9pZCBmcmFnX3dhbmUgUEFSQU1TICgoZnJhZ1MgKiBmcmFnUCkpOwotCi1jaGFyICpmcmFnX3ZhcmlhbnQgUEFSQU1TICgocmVsYXhfc3RhdGVUIHR5cGUsCi0JCQkgICAgaW50IG1heF9jaGFycywKLQkJCSAgICBpbnQgdmFyLAotCQkJICAgIHJlbGF4X3N1YnN0YXRlVCBzdWJ0eXBlLAotCQkJICAgIHN5bWJvbFMgKiBzeW1ib2wsCi0JCQkgICAgb2Zmc2V0VCBvZmZzZXQsCi0JCQkgICAgY2hhciAqb3Bjb2RlKSk7Ci0KLWNoYXIgKmZyYWdfdmFyIFBBUkFNUyAoKHJlbGF4X3N0YXRlVCB0eXBlLAotCQkJaW50IG1heF9jaGFycywKLQkJCWludCB2YXIsCi0JCQlyZWxheF9zdWJzdGF0ZVQgc3VidHlwZSwKLQkJCXN5bWJvbFMgKiBzeW1ib2wsCi0JCQlvZmZzZXRUIG9mZnNldCwKLQkJCWNoYXIgKm9wY29kZSkpOwotCi0jZW5kaWYgLyogRlJBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2dhc3AuYyBiL2dhcy9nYXNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNWE0YWUuLjAwMDAwMDAKLS0tIGEvZ2FzL2dhc3AuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MTUgKzAsMCBAQAotLyogZ2FzcC5jIC0gR251IGFzc2VtYmxlciBwcmVwcm9jZXNzb3IgbWFpbiBwcm9ncmFtLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTUCwgdGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yLgotCi0gICBHQVNQIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTUCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBU1A7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0KLVRoaXMgcHJvZ3JhbSB0cmFuc2xhdGVzIHRoZSBpbnB1dCBtYWNyb3MgYW5kIHN0dWZmIGludG8gYSBmb3JtCi1zdWl0YWJsZSBmb3IgZ2FzIHRvIGNvbnN1bWUuCi0KLQotICBnYXNwIFstc2RoYXVdIFstYyBjaGFyXSBbLW8gPG91dGZpbGU+XSA8aW5maWxlPioKLQotICAtcyBjb3B5IHNvdXJjZSB0byBvdXRwdXQKLSAgLWMgPGNoYXI+IGNvbW1lbnRzIGFyZSBzdGFydGVkIHdpdGggPGNoYXI+IGluc3RlYWQgb2YgIQotICAtdSBhbGxvdyB1bnJlYXNvbmFibGUgc3R1ZmYKLSAgLXAgcHJpbnQgbGluZSBudW1iZXJzCi0gIC1kIHByaW50IGRlYnVnZ2luZyBzdGF0cwotICAtcyBzZW1pIGNvbG9ucyBzdGFydCBjb21tZW50cwotICAtYSB1c2UgYWx0ZXJuYXRlIHN5bnRheAotICAgICBQc2V1ZG8gb3BzIGNhbiBzdGFydCB3aXRoIG9yIHdpdGhvdXQgYSAuCi0gICAgIExhYmVscyBoYXZlIHRvIGJlIGluIGZpcnN0IGNvbHVtbi4KLSAgLUkgc3BlY2lmeSBpbmNsdWRlIGRpcgotICAgIE1hY3JvIGFyZyBwYXJhbWV0ZXJzIHN1YnNpdHV0ZWQgYnkgbmFtZSwgZG9uJ3QgbmVlZCB0aGUgJi4KLSAgICAgU3RyaW5nIGNhbiBzdGFydCB3aXRoICcgdG9vLgotICAgICBTdHJpbmdzIGNhbiBiZSBzdXJyb3VuZGVkIGJ5IDwuLj4KLSAgICAgQSAlPGV4cD4gaW4gYSBzdHJpbmcgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIAotICAgICBMaXRlcmFsIGNoYXIgaW4gYSBzdHJpbmcgd2l0aCAhCi0KLQotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX01BTExPQ19ERUNMQVJBVElPTgotZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0jaW5jbHVkZSAiYXNpbnRsLmgiCi0KLWNoYXIgKnByb2dyYW1fdmVyc2lvbiA9ICIxLjIiOwotCi0vKiBUaGlzIGlzIG5vcm1hbGx5IGRlY2xhcmVkIGluIGFzLmgsIGJ1dCB3ZSBkb24ndCBpbmNsdWRlIHRoYXQuICBXZQotICAgbmVlZCB0aGUgZnVuY3Rpb24gYmVjYXVzZSBvdGhlciBmaWxlcyBsaW5rZWQgd2l0aCBnYXNwLmMgbWlnaHQgY2FsbAotICAgaXQuICAqLwotZXh0ZXJuIHZvaWQgYXNfYWJvcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGUgZGVmYXVsdCBvYnN0YWNrIGNodW5rIHNpemUuICBJZiB3ZSBzZXQgdGhpcyB0byB6ZXJvLCB0aGUKLSAgIG9ic3RhY2sgY29kZSB3aWxsIHVzZSB3aGF0ZXZlciB3aWxsIGZpdCBpbiBhIDQwOTYgYnl0ZSBibG9jay4gIFRoaXMKLSAgIGlzIHVzZWQgYnkgdGhlIGhhc2ggdGFibGUgY29kZSB1c2VkIGJ5IG1hY3JvLmMuICAqLwotaW50IGNodW5rc2l6ZSA9IDA7Ci0KLSNkZWZpbmUgTUFYX0lOQ0xVREVTIDMwCQkvKiBNYXhpbXVtIGluY2x1ZGUgZGVwdGggKi8KLSNkZWZpbmUgTUFYX1JFQVNPTkFCTEUgMTAwMAkvKiBNYXhpbXVtIG51bWJlciBvZiBleHBhbnNpb25zICovCi0KLWludCB1bnJlYXNvbmFibGU7CQkvKiAtdSBvbiBjb21tYW5kIGxpbmUgKi8KLWludCBzdGF0czsJCQkvKiAtZCBvbiBjb21tYW5kIGxpbmUgKi8KLWludCBwcmludF9saW5lX251bWJlcjsJCS8qIC1wIGZsYWcgb24gY29tbWFuZCBsaW5lICovCi1pbnQgY29weXNvdXJjZTsJCQkvKiAtYyBmbGFnIG9uIGNvbW1hbmQgbGluZSAqLwotaW50IHdhcm5pbmdzOwkJCS8qIE51bWJlciBvZiBXQVJOSU5HcyBnZW5lcmF0ZWQgc28gZmFyLiAqLwotaW50IGVycm9yczsJCQkvKiBOdW1iZXIgb2YgRVJST1JzIGdlbmVyYXRlZCBzbyBmYXIuICovCi1pbnQgZmF0YWxzOwkJCS8qIE51bWJlciBvZiBmYXRhbCBFUlJPUnMgZ2VuZXJhdGVkIHNvIGZhciAoZWl0aGVyIDAgb3IgMSkuICovCi1pbnQgYWx0ZXJuYXRlID0gMDsgICAgICAgICAgICAgIC8qIC1hIG9uIGNvbW1hbmQgbGluZSAqLwotaW50IG1yaSA9IDA7CQkJLyogLU0gb24gY29tbWFuZCBsaW5lICovCi1jaGFyIGNvbW1lbnRfY2hhciA9ICchJzsKLWludCByYWRpeCA9IDEwOwkJCS8qIERlZmF1bHQgcmFkaXggKi8KLQotaW50IGhhZF9lbmQ7IC8qIFNlZW4gLkVORCAqLwotCi0vKiBUaGUgb3V0cHV0IHN0cmVhbSAqLwotRklMRSAqb3V0ZmlsZTsKLQotLyogdGhlIGF0dHJpYnV0ZXMgb2YgZWFjaCBjaGFyYWN0ZXIgYXJlIHN0b3JlZCBhcyBhIGJpdCBwYXR0ZXJuCi0gICBjaGFydHlwZSwgd2hpY2ggZ2l2ZXMgdXMgcXVpY2sgdGVzdHMuICovCi0KLQotI2RlZmluZSBGSVJTVEJJVCAxCi0jZGVmaW5lIE5FWFRCSVQgIDIKLSNkZWZpbmUgU0VQQklUICAgNAotI2RlZmluZSBXSElURUJJVCA4Ci0jZGVmaW5lIENPTU1FTlRCSVQgMTYKLSNkZWZpbmUgQkFTRUJJVCAgMzIKLSNkZWZpbmUgSVNDT01NRU5UQ0hBUih4KSAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIENPTU1FTlRCSVQpCi0jZGVmaW5lIElTRklSU1RDSEFSKHgpICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIEZJUlNUQklUKQotI2RlZmluZSBJU05FWFRDSEFSKHgpICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBORVhUQklUKQotI2RlZmluZSBJU1NFUCh4KSAgICAgICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBTRVBCSVQpCi0jZGVmaW5lIElTV0hJVEUoeCkgICAgICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIFdISVRFQklUKQotI2RlZmluZSBJU0JBU0UoeCkgICAgICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBCQVNFQklUKQotc3RhdGljIGNoYXIgY2hhcnR5cGVbMjU2XTsKLQotCi0vKiBDb25kaXRpb25hbCBhc3NlbWJseSB1c2VzIHRoZSBgaWZzdGFjaycuICBFYWNoIGFpZiBwdXNoZXMgYW5vdGhlcgotICAgZW50cnkgb250byB0aGUgc3RhY2ssIGFuZCBzZXRzIHRoZSBvbiBmbGFnIGlmIGl0IHNob3VsZC4gIFRoZSBhZWxzZQotICAgc2V0cyBoYWRlbHNlLCBhbmQgdG9nZ2xlcyBvbi4gIEFuIGFlbmQgcG9wcyBhIGxldmVsLiAgV2UgbGltaXQgdG8KLSAgIDEwMCBsZXZlbHMgb2YgbmVzdGluZywgbm90IGJlY2F1c2Ugd2UncmUgZmFjaXN0cyBwaWdzIHdpdGggcmVhZAotICAgb25seSBtaW5kcywgYnV0IGJlY2F1c2UgbW9yZSB0aGFuIDEwMCBsZXZlbHMgb2YgbmVzdGluZyBpcyBwcm9iYWJseQotICAgYSBidWcgaW4gdGhlIHVzZXIncyBtYWNybyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIElGTkVTVElORyAxMDAKLXN0cnVjdAotICB7Ci0gICAgaW50IG9uOwkJCS8qIGlzIHRoZSBsZXZlbCBiZWluZyBvdXRwdXQgKi8KLSAgICBpbnQgaGFkZWxzZTsJCS8qIGhhcyBhbiBhZWxzZSBiZWVuIHNlZW4gKi8KLSAgfQotaWZzdGFja1tJRk5FU1RJTkddOwotaW50IGlmaTsKLQotLyogVGhlIGZpbmFsIGFuZCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBvZiBleHByZXNzaW9uIGV2YWx1YXRpb24gYXJlIGtlcHQgaW4KLSAgIGV4cF90J3MuICBOb3RlIHRoYXQgYSBzeW1ib2wgaXMgbm90IGFuIHNiLCBidXQgYSBwb2ludGVyIGludG8gdGhlIGlucHV0Ci0gICBsaW5lLiAgSXQgbXVzdCBiZSBjb3BlZCBzb21ld2hlcmUgc2FmZSBiZWZvcmUgdGhlIG5leHQgbGluZSBpcyByZWFkIGluLiAqLwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgbGVuOwotICB9Ci1zeW1ib2w7Ci0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBpbnQgdmFsdWU7CQkJLyogY29uc3RhbnQgcGFydCAqLwotICAgIHN5bWJvbCBhZGRfc3ltYm9sOwkJLyogbmFtZSBwYXJ0ICovCi0gICAgc3ltYm9sIHN1Yl9zeW1ib2w7CQkvKiBuYW1lIHBhcnQgKi8KLSAgfQotZXhwX3Q7Ci0KLQotLyogSGFzaGluZyBpcyBkb25lIGluIGEgcHJldHR5IHN0YW5kYXJkIHdheS4gIEEgaGFzaF90YWJsZSBoYXMgYQotICAgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0byBoYXNoX2VudHJ5cywgYW5kIHRoZSBzaXplIG9mIHRoZQotICAgdmVjdG9yLiAgQSBoYXNoX2VudHJ5IGNvbnRhaW5zIGEgdW5pb24gb2YgYWxsIHRoZSBpbmZvIHdlIGxpa2UgdG8KLSAgIHN0b3JlIGluIGhhc2ggdGFibGUuICBJZiB0aGVyZSBpcyBhIGhhc2ggY29sbGlzaW9uLCBoYXNoX2VudHJpZXMKLSAgIHdpdGggdGhlIHNhbWUgaGFzaCBhcmUga2VwdCBpbiBhIGNoYWluLiAqLwotCi0vKiBXaGF0IHRoZSBkYXRhIGluIGEgaGFzaF9lbnRyeSBtZWFucyAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBoYXNoX2ludGVnZXIsCQkvKiBuYW1lLT5pbnRlZ2VyIG1hcHBpbmcgKi8KLSAgICBoYXNoX3N0cmluZywJCS8qIG5hbWUtPnN0cmluZyBtYXBwaW5nICovCi0gICAgaGFzaF9tYWNybywJCQkvKiBuYW1lIGlzIGEgbWFjcm8gKi8KLSAgICBoYXNoX2Zvcm1hbAkJCS8qIG5hbWUgaXMgYSBmb3JtYWwgYXJndW1lbnQgKi8KLSAgfSBoYXNoX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGhzCi0gIHsKLSAgICBzYiBrZXk7CQkJLyogc3ltYm9sIG5hbWUgKi8KLSAgICBoYXNoX3R5cGUgdHlwZTsJCS8qIHN5bWJvbCBtZWFuaW5nICovCi0gICAgdW5pb24KLSAgICAgIHsKLQlzYiBzOwotCWludCBpOwotCXN0cnVjdCBtYWNyb19zdHJ1Y3QgKm07Ci0Jc3RydWN0IGZvcm1hbF9zdHJ1Y3QgKmY7Ci0gICAgICB9IHZhbHVlOwotICAgIHN0cnVjdCBocyAqbmV4dDsJCS8qIG5leHQgaGFzaF9lbnRyeSB3aXRoIHNhbWUgaGFzaCBrZXkgKi8KLSAgfSBoYXNoX2VudHJ5OwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgaGFzaF9lbnRyeSAqKnRhYmxlOwotICAgIGludCBzaXplOwotICB9IGhhc2hfdGFibGU7Ci0KLQotLyogaG93IHdlIG5lc3QgZmlsZXMgYW5kIGV4cGFuZCBtYWNyb3MgZXRjLgotCi0gICB3ZSBrZWVwIGEgc3RhY2sgb2Ygb2YgaW5jbHVkZV9zdGFjayBzdHJ1Y3RzLiAgZWFjaCBpbmNsdWRlIGZpbGUKLSAgIHB1c2hlcyBhIG5ldyBsZXZlbCBvbnRvIHRoZSBzdGFjay4gIHdlIGtlZXAgYW4gc2Igd2l0aCBhIHB1c2hiYWNrCi0gICB0b28uICB1bmdldCBjaGFycyBhcmUgcHVzaGVkIG9udG8gdGhlIHB1c2hiYWNrIHNiLCBnZXRjaGFycyBmaXJzdAotICAgY2hlY2tzIHRoZSBwdXNoYmFjayBzYiBiZWZvcmUgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0KLSAgIHNtYWxsIHRoaW5ncyBhcmUgZXhwYW5kZWQgYnkgYWRkaW5nIHRoZSB0ZXh0IG9mIHRoZSBpdGVtIG9udG8gdGhlCi0gICBwdXNoYmFjayBzYi4gIGxhcmdlciBpdGVtcyBhcmUgZ3Jvd24gYnkgcHVzaGluZyBhIG5ldyBsZXZlbCBhbmQKLSAgIGFsbG9jYXRpbmcgdGhlIGVudGlyZSBwdXNoYmFjayBidWYgZm9yIHRoZSBpdGVtLiAgZWFjaCB0aW1lCi0gICBzb21ldGhpbmcgbGlrZSBhIG1hY3JvIGlzIGV4cGFuZGVkLCB0aGUgc3RhY2sgaW5kZXggaXMgY2hhbmdlZC4gd2UKLSAgIGNhbiB0aGVuIHBlcmZvcm0gYW4gZXhpdG0gYnkgcG9wcGluZyBhbGwgZW50cmllcyBvZmYgdGhlIHN0YWNrIHdpdGgKLSAgIHRoZSBzYW1lIHN0YWNrIGluZGV4LiAgaWYgd2UncmUgYmVpbmcgcmVhc29uYWJsZSwgd2UgY2FuIGRldGVjdAotICAgcmVjdXNpdmUgZXhwYW5zaW9uIGJ5IGNoZWNraW5nIHRoZSBpbmRleCBpcyByZWFzb25hYmx5IHNtYWxsLgotICovCi0KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgaW5jbHVkZV9maWxlLCBpbmNsdWRlX3JlcGVhdCwgaW5jbHVkZV93aGlsZSwgaW5jbHVkZV9tYWNybwotICB9IGluY2x1ZGVfdHlwZTsKLQotc3RydWN0IGluY2x1ZGVfc3RhY2sKLSAgewotICAgIHNiIHB1c2hiYWNrOwkJLyogY3VycmVudCBwdXNoYmFjayBzdHJlYW0gKi8KLSAgICBpbnQgcHVzaGJhY2tfaW5kZXg7CQkvKiBuZXh0IGNoYXIgdG8gcmVhZCBmcm9tIHN0cmVhbSAqLwotICAgIEZJTEUgKmhhbmRsZTsJCS8qIG9wZW4gZmlsZSAqLwotICAgIHNiIG5hbWU7CQkJLyogbmFtZSBvZiBmaWxlICovCi0gICAgaW50IGxpbmVjb3VudDsJCS8qIG51bWJlciBvZiBsaW5lcyByZWFkIHNvIGZhciAqLwotICAgIGluY2x1ZGVfdHlwZSB0eXBlOwotICAgIGludCBpbmRleDsJCQkvKiBpbmRleCBvZiB0aGlzIGxheWVyICovCi0gIH0KLWluY2x1ZGVfc3RhY2tbTUFYX0lOQ0xVREVTXTsKLQotc3RydWN0IGluY2x1ZGVfc3RhY2sgKnNwOwotI2RlZmluZSBpc3AgKHNwIC0gaW5jbHVkZV9zdGFjaykKLQotLyogSW5jbHVkZSBmaWxlIGxpc3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaW5jbHVkZV9wYXRoIAotewotICBzdHJ1Y3QgaW5jbHVkZV9wYXRoICpuZXh0OwotICBzYiBwYXRoOwotfSAgaW5jbHVkZV9wYXRoOwotCi1pbmNsdWRlX3BhdGggKnBhdGhzX2hlYWQ7Ci1pbmNsdWRlX3BhdGggKnBhdGhzX3RhaWw7Ci0KLQotc3RhdGljIHZvaWQgcXVpdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBoYXNoX25ld190YWJsZSBQQVJBTVMgKChpbnQsIGhhc2hfdGFibGUgKikpOwotc3RhdGljIGludCBoYXNoIFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyBoYXNoX2VudHJ5ICpoYXNoX2NyZWF0ZSBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICosIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgaGFzaF9hZGRfdG9faW50X3RhYmxlIFBBUkFNUyAoKGhhc2hfdGFibGUgKiwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgaGFzaF9lbnRyeSAqaGFzaF9sb29rdXAgUEFSQU1TICgoaGFzaF90YWJsZSAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBjaGVja2NvbnN0IFBBUkFNUyAoKGludCwgZXhwX3QgKikpOwotc3RhdGljIGludCBzYl9zdHJ0b2wgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzAgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzEgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzIgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzMgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzQgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzUgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGV4cF9wYXJzZSBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKLXN0YXRpYyB2b2lkIGV4cF9zdHJpbmcgUEFSQU1TICgoZXhwX3QgKiwgc2IgKikpOwotc3RhdGljIGludCBleHBfZ2V0X2FicyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLSNpZiAwCi1zdGF0aWMgdm9pZCBzdHJpcF9jb21tZW50cyBQQVJBTVMgKChzYiAqKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIHVuZ2V0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgaW5jbHVkZV9idWYgUEFSQU1TICgoc2IgKiwgc2IgKiwgaW5jbHVkZV90eXBlLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGluY2x1ZGVfcHJpbnRfbGluZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgZ2V0X2xpbmUgUEFSQU1TICgoc2IgKikpOwotc3RhdGljIGludCBncmFiX2xhYmVsIFBBUkFNUyAoKHNiICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGNoYW5nZV9iYXNlIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fZW5kIFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2Fzc2lnbiBQQVJBTVMgKChpbnQsIGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fcmFkaXggUEFSQU1TICgoc2IgKikpOwotc3RhdGljIGludCBnZXRfb3BzaXplIFBBUkFNUyAoKGludCwgc2IgKiwgaW50ICopKTsKLXN0YXRpYyBpbnQgZW9sIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fZGF0YSBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fZGF0YWIgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hbGlnbiBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3JlcyBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fZXhwb3J0IFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3ByaW50IFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9faGVhZGluZyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3BhZ2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9fZm9ybSBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0X2FueV9zdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBza2lwX29wZW5wIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBza2lwX2Nsb3NlcCBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgZG9sZW4gUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGRvaW5zdHIgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGRvc3Vic3RyIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19hc3NpZ25zIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBnZXRfYW5kX3Byb2Nlc3MgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV9vbGRfZW50cnkgUEFSQU1TICgoaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hc3NpZ25hIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fYXNzaWduYyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3JlZyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgY29uZGFzc19sb29rdXBfbmFtZSBQQVJBTVMgKChzYiAqLCBpbnQsIHNiICosIGludCkpOwotc3RhdGljIGludCB3aGF0Y29uZCBQQVJBTVMgKChpbnQsIHNiICosIGludCAqKSk7Ci1zdGF0aWMgaW50IGlzdHJ1ZSBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2FpZiBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2FlbHNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2FlbmRpIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgY29uZGFzc19vbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19pZiBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIGludCBnZXRfbXJpX3N0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9faWZjIFBBUkFNUyAoKGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19hZW5kciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19hd2hpbGUgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hZW5kdyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19leGl0bSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19hcmVwZWF0IFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fZW5kbSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19pcnAgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX2xvY2FsIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fbWFjcm8gUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IG1hY3JvX29wIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBnZXRzdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19zZGF0YSBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fc2RhdGFiIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBuZXdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX2luY2x1ZGUgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBpbmNsdWRlX3BvcCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGxpbmVjb3VudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGluY2x1ZGVfbmV4dF9pbmRleCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBjaGFydHlwZV9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcHJvY2Vzc19wc2V1ZG9fb3AgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBhZGRfa2V5d29yZCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2RlZmluZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHNob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNob3dfaGVscCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgRkFUQUwoeCkgXAotICBkbyB7IGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoc3RkZXJyKTsgZnByaW50ZiB4IDsgZmF0YWxzKys7IHF1aXQoKTsgfSB3aGlsZSgwKSAKLSNkZWZpbmUgRVJST1IoeCkgXAotICBkbyB7IGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoc3RkZXJyKTsgZnByaW50ZiB4OyBlcnJvcnMrKzsgfSB3aGlsZSgwKQotI2RlZmluZSBXQVJOSU5HKHgpIFwKLSAgZG8geyBpbmNsdWRlX3ByaW50X3doZXJlX2xpbmUgKHN0ZGVycik7IGZwcmludGYgeDsgd2FybmluZ3MrKzt9IHdoaWxlKDApIAotCi0KLQotLyogZXhpdCB0aGUgcHJvZ3JhbSBhbmQgcmV0dXJuIHRoZSByaWdodCBFUlJPUiBjb2RlLiAqLwotc3RhdGljIHZvaWQKLXF1aXQgKCkKLXsKLSAgaW50IGV4aXRjb2RlOwotICBpZiAoZmF0YWxzICsgZXJyb3JzKQotICAgIGV4aXRjb2RlID0gMTsKLSAgZWxzZQotICAgIGV4aXRjb2RlID0gMDsKLQotICBpZiAoc3RhdHMpIAotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNiX21heF9wb3dlcl90d287IGkrKykgCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAic3RyaW5ncyBzaXplICU4ZCA6ICVkXG4iLCAxPDxpLCBzdHJpbmdfY291bnRbaV0pOwotCX0KLSAgICB9Ci0gIGV4aXQgKGV4aXRjb2RlKTsKLX0KLQotLyogaGFzaCB0YWJsZSBtYWludGVuYW5jZS4gKi8KLQotLyogYnVpbGQgYSBuZXcgaGFzaCB0YWJsZSB3aXRoIHNpemUgYnVja2V0cywgYW5kIGZpbGwgaW4gdGhlIGluZm8gYXQgcHRyLiAqLwotCi1zdGF0aWMgdm9pZAotaGFzaF9uZXdfdGFibGUgKHNpemUsIHB0cikKLSAgICAgaW50IHNpemU7Ci0gICAgIGhhc2hfdGFibGUgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIHB0ci0+c2l6ZSA9IHNpemU7Ci0gIHB0ci0+dGFibGUgPSAoaGFzaF9lbnRyeSAqKikgeG1hbGxvYyAoc2l6ZSAqIChzaXplb2YgKGhhc2hfZW50cnkgKikpKTsKLSAgLyogRmlsbCB3aXRoIG51bGwtcG9pbnRlciwgbm90IHplcm8tYml0LXBhdHRlcm4uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHB0ci0+dGFibGVbaV0gPSAwOwotfQotCi0vKiBjYWxjdWxhdGUgYW5kIHJldHVybiB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgc2IgYXQga2V5LiAqLwotCi1zdGF0aWMgaW50Ci1oYXNoIChrZXkpCi0gICAgIHNiICprZXk7Ci17Ci0gIGludCBrID0gMHgxMjM0OwotICBpbnQgaTsKLSAgY2hhciAqcCA9IGtleS0+cHRyOwotICBmb3IgKGkgPSAwOyBpIDwga2V5LT5sZW47IGkrKykKLSAgICB7Ci0gICAgICBrIF49IChrIDw8IDIpIF4gKnA7Ci0gICAgICBwKys7Ci0gICAgfQotICByZXR1cm4gayAmIDB4ZjBmZmY7Ci19Ci0KLS8qIGxvb2t1cCBrZXkgaW4gaGFzaF90YWJsZSB0YWIsIGlmIHByZXNlbnQsIHRoZW4gcmV0dXJuIGl0LCBvdGhlcndpc2UKLSAgIGJ1aWxkIGEgbmV3IG9uZSBhbmQgZmlsbCBpdCB3aXRoIGhhc2hfaW50ZWdlci4gKi8KLQotc3RhdGljCi1oYXNoX2VudHJ5ICoKLWhhc2hfY3JlYXRlICh0YWIsIGtleSkKLSAgICAgaGFzaF90YWJsZSAqdGFiOwotICAgICBzYiAqa2V5OwotewotICBpbnQgayA9IGhhc2ggKGtleSkgJSB0YWItPnNpemU7Ci0gIGhhc2hfZW50cnkgKnA7Ci0gIGhhc2hfZW50cnkgKip0YWJsZSA9IHRhYi0+dGFibGU7Ci0KLSAgcCA9IHRhYmxlW2tdOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmICghcCkKLQl7Ci0JICBoYXNoX2VudHJ5ICpuID0gKGhhc2hfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChoYXNoX2VudHJ5KSk7Ci0JICBuLT5uZXh0ID0gdGFibGVba107Ci0JICBzYl9uZXcgKCZuLT5rZXkpOwotCSAgc2JfYWRkX3NiICgmbi0+a2V5LCBrZXkpOwotCSAgdGFibGVba10gPSBuOwotCSAgbi0+dHlwZSA9IGhhc2hfaW50ZWdlcjsKLQkgIHJldHVybiBuOwotCX0KLSAgICAgIGlmIChzdHJuY21wICh0YWJsZVtrXS0+a2V5LnB0ciwga2V5LT5wdHIsIGtleS0+bGVuKSA9PSAwKQotCXsKLQkgIHJldHVybiBwOwotCX0KLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLX0KLQotLyogYWRkIHNiIG5hbWUgd2l0aCBrZXkgaW50byBoYXNoX3RhYmxlIHRhYi4gIGlmIHJlcGxhY2luZyBvbGQgdmFsdWUKLSAgIGFuZCBhZ2FpbiwgdGhlbiBFUlJPUi4gKi8KLQotc3RhdGljCi12b2lkCi1oYXNoX2FkZF90b19zdHJpbmdfdGFibGUgKHRhYiwga2V5LCBuYW1lLCBhZ2FpbikKLSAgICAgaGFzaF90YWJsZSAqdGFiOwotICAgICBzYiAqa2V5OwotICAgICBzYiAqbmFtZTsKLSAgICAgaW50IGFnYWluOwotewotICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAodGFiLCBrZXkpOwotICBpZiAocHRyLT50eXBlID09IGhhc2hfaW50ZWdlcikKLSAgICB7Ci0gICAgICBzYl9uZXcgKCZwdHItPnZhbHVlLnMpOwotICAgIH0KLSAgaWYgKHB0ci0+dmFsdWUucy5sZW4pCi0gICAgewotICAgICAgaWYgKCFhZ2FpbikKLQlFUlJPUiAoKHN0ZGVyciwgXygicmVkZWZpbml0aW9uIG5vdCBhbGxvd2VkXG4iKSkpOwotICAgIH0KLQotICBwdHItPnR5cGUgPSBoYXNoX3N0cmluZzsKLSAgc2JfcmVzZXQgKCZwdHItPnZhbHVlLnMpOwotICAKLSAgc2JfYWRkX3NiICgmcHRyLT52YWx1ZS5zLCBuYW1lKTsKLX0KLQotLyogYWRkIGludGVnZXIgbmFtZSB0byBoYXNoX3RhYmxlIHRhYiB3aXRoIHNiIGtleS4gKi8KLQotc3RhdGljCi12b2lkCi1oYXNoX2FkZF90b19pbnRfdGFibGUgKHRhYiwga2V5LCBuYW1lKQotICAgICBoYXNoX3RhYmxlICp0YWI7Ci0gICAgIHNiICprZXk7Ci0gICAgIGludCBuYW1lOwotewotICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAodGFiLCBrZXkpOwotICBwdHItPnZhbHVlLmkgPSBuYW1lOwotfQotCi0vKiBsb29rdXAgc2Iga2V5IGluIGhhc2hfdGFibGUgdGFiLiAgaWYgZm91bmQgcmV0dXJuIGhhc2hfZW50cnkgcmVzdWx0LAotICAgZWxzZSAwLiAqLwotICAgCi1zdGF0aWMKLWhhc2hfZW50cnkgKgotaGFzaF9sb29rdXAgKHRhYiwga2V5KQotICAgICBoYXNoX3RhYmxlICp0YWI7Ci0gICAgIHNiICprZXk7Ci17Ci0gIGludCBrID0gaGFzaCAoa2V5KSAlIHRhYi0+c2l6ZTsKLSAgaGFzaF9lbnRyeSAqKnRhYmxlID0gdGFiLT50YWJsZTsKLSAgaGFzaF9lbnRyeSAqcCA9IHRhYmxlW2tdOwotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICBpZiAocC0+a2V5LmxlbiA9PSBrZXktPmxlbgotCSAgJiYgc3RybmNtcCAocC0+a2V5LnB0ciwga2V5LT5wdHIsIGtleS0+bGVuKSA9PSAwKQotCXJldHVybiBwOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBleHByZXNzaW9ucwotCi0gICBhcmUgaGFuZGxlZCBpbiBhIHJlYWxseSBzaW1wbGUgcmVjdXJzaXZlIGRlY2VudCB3YXkuIGVhY2ggYml0IG9mCi0gICB0aGUgbWFjaGluZSB0YWtlcyBhbiBpbmRleCBpbnRvIGFuIHNiIGFuZCBhIHBvaW50ZXIgdG8gYW4gZXhwX3QsCi0gICBtb2RpZmllcyB0aGUgKmV4cF90IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICBwYXN0IHRoZSBwYXJ0IG9mIHRoZSBleHByZXNzaW9uIHBhcnNlZC4KLQotIGV4cHJlc3Npb24gcHJlY2VkZW5jZToKLSAgKCApCi0gdW5hcnkgKyAtIH4KLSAgKiAvCi0gICsgLQotICAmCi0gIHwgfgotCi0qLwotCi0KLS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBleHBfdCBhdCB0ZXJtIGlzIGNvbnN0YW50LCBpZiBub3QgdGhlIGdpdmUgdGhlIG9wIEVSUk9SLiAqLwotCi1zdGF0aWMKLXZvaWQKLWNoZWNrY29uc3QgKG9wLCB0ZXJtKQotICAgICBpbnQgb3A7Ci0gICAgIGV4cF90ICp0ZXJtOwotewotICBpZiAodGVybS0+YWRkX3N5bWJvbC5sZW4KLSAgICAgIHx8IHRlcm0tPnN1Yl9zeW1ib2wubGVuKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJ0aGUgJWMgb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy5cbiIpLCBvcCkpOwotICAgIH0KLX0KLQotLyogdHVybiB0aGUgbnVtYmVyIGluIHN0cmluZyBhdCBpZHggaW50byBhIG51bWJlciBvZiBiYXNlLAotICAgZmlsbCBpbiBwdHIgYW5kIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBub3QgaW4gdGhlCi0gICBudW1iZXIuICovCi0KLXN0YXRpYwotaW50Ci1zYl9zdHJ0b2wgKGlkeCwgc3RyaW5nLCBiYXNlLCBwdHIpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGludCBiYXNlOwotICAgICBpbnQgKnB0cjsKLXsKLSAgaW50IHZhbHVlID0gMDsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotCi0gIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbikKLSAgICB7Ci0gICAgICBpbnQgY2ggPSBzdHJpbmctPnB0cltpZHhdOwotICAgICAgaW50IGRpZyA9IDA7Ci0gICAgICBpZiAoaXNkaWdpdCAoY2gpKQotCWRpZyA9IGNoIC0gJzAnOwotICAgICAgZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKLQlkaWcgPSBjaCAtICdhJyArIDEwOwotICAgICAgZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKLQlkaWcgPSBjaCAtICdBJyArIDEwOwotICAgICAgZWxzZQotCWJyZWFrOwotCi0gICAgICBpZiAoZGlnID49IGJhc2UpCi0JYnJlYWs7Ci0KLSAgICAgIHZhbHVlID0gdmFsdWUgKiBiYXNlICsgZGlnOwotICAgICAgaWR4Kys7Ci0gICAgfQotICAqcHRyID0gdmFsdWU7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBpbnQKLWxldmVsXzAgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGxocy0+YWRkX3N5bWJvbC5sZW4gPSAwOwotICBsaHMtPmFkZF9zeW1ib2wubmFtZSA9IDA7Ci0KLSAgbGhzLT5zdWJfc3ltYm9sLmxlbiA9IDA7Ci0gIGxocy0+c3ViX3N5bWJvbC5uYW1lID0gMDsKLQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci0KLSAgbGhzLT52YWx1ZSA9IDA7Ci0KLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzdHJpbmctPnB0cltpZHhdKSkKLSAgICB7Ci0gICAgICBpZHggPSBzYl9zdHJ0b2wgKGlkeCwgc3RyaW5nLCAxMCwgJmxocy0+dmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKHN0cmluZy0+cHRyW2lkeF0pKQotICAgIHsKLSAgICAgIGludCBsZW4gPSAwOwotICAgICAgbGhzLT5hZGRfc3ltYm9sLm5hbWUgPSBzdHJpbmctPnB0ciArIGlkeDsKLSAgICAgIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbiAmJiBJU05FWFRDSEFSIChzdHJpbmctPnB0cltpZHhdKSkKLQl7Ci0JICBpZHgrKzsKLQkgIGxlbisrOwotCX0KLSAgICAgIGxocy0+YWRkX3N5bWJvbC5sZW4gPSBsZW47Ci0gICAgfQotICBlbHNlIGlmIChzdHJpbmctPnB0cltpZHhdID09ICciJykKLSAgICB7Ci0gICAgICBzYiBhY2M7Ci0gICAgICBzYl9uZXcgKCZhY2MpOwotICAgICAgRVJST1IgKChzdGRlcnIsIF8oInN0cmluZyB3aGVyZSBleHByZXNzaW9uIGV4cGVjdGVkLlxuIikpKTsKLSAgICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBzdHJpbmcsICZhY2MpOwotICAgICAgc2Jfa2lsbCAoJmFjYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oImNhbid0IGZpbmQgcHJpbWFyeSBpbiBleHByZXNzaW9uLlxuIikpKTsKLSAgICAgIGlkeCsrOwotICAgIH0KLSAgcmV0dXJuIHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQKLWxldmVsXzEgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLQotICBzd2l0Y2ggKHN0cmluZy0+cHRyW2lkeF0pCi0gICAgewotICAgIGNhc2UgJysnOgotICAgICAgaWR4ID0gbGV2ZWxfMSAoaWR4ICsgMSwgc3RyaW5nLCBsaHMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnfic6Ci0gICAgICBpZHggPSBsZXZlbF8xIChpZHggKyAxLCBzdHJpbmcsIGxocyk7Ci0gICAgICBjaGVja2NvbnN0ICgnficsIGxocyk7Ci0gICAgICBsaHMtPnZhbHVlID0gfmxocy0+dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICctJzoKLSAgICAgIHsKLQlzeW1ib2wgdDsKLQlpZHggPSBsZXZlbF8xIChpZHggKyAxLCBzdHJpbmcsIGxocyk7Ci0JbGhzLT52YWx1ZSA9IC1saHMtPnZhbHVlOwotCXQgPSBsaHMtPmFkZF9zeW1ib2w7Ci0JbGhzLT5hZGRfc3ltYm9sID0gbGhzLT5zdWJfc3ltYm9sOwotCWxocy0+c3ViX3N5bWJvbCA9IHQ7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSAnKCc6Ci0gICAgICBpZHgrKzsKLSAgICAgIGlkeCA9IGxldmVsXzUgKHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKSwgc3RyaW5nLCBsaHMpOwotICAgICAgaWYgKHN0cmluZy0+cHRyW2lkeF0gIT0gJyknKQotCUVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgY2xvc2luZyBwYXJlbnMuXG4iKSkpOwotICAgICAgZWxzZQotCWlkeCsrOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlkeCA9IGxldmVsXzAgKGlkeCwgc3RyaW5nLCBsaHMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotfQotCi1zdGF0aWMgaW50Ci1sZXZlbF8yIChpZHgsIHN0cmluZywgbGhzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqbGhzOwotewotICBleHBfdCByaHM7Ci0KLSAgaWR4ID0gbGV2ZWxfMSAoaWR4LCBzdHJpbmcsIGxocyk7Ci0KLSAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuICYmIChzdHJpbmctPnB0cltpZHhdID09ICcqJwotCQkJICAgICAgIHx8IHN0cmluZy0+cHRyW2lkeF0gPT0gJy8nKSkKLSAgICB7Ci0gICAgICBjaGFyIG9wID0gc3RyaW5nLT5wdHJbaWR4KytdOwotICAgICAgaWR4ID0gbGV2ZWxfMSAoaWR4LCBzdHJpbmcsICZyaHMpOwotICAgICAgc3dpdGNoIChvcCkKLQl7Ci0JY2FzZSAnKic6Ci0JICBjaGVja2NvbnN0ICgnKicsIGxocyk7Ci0JICBjaGVja2NvbnN0ICgnKicsICZyaHMpOwotCSAgbGhzLT52YWx1ZSAqPSByaHMudmFsdWU7Ci0JICBicmVhazsKLQljYXNlICcvJzoKLQkgIGNoZWNrY29uc3QgKCcvJywgbGhzKTsKLQkgIGNoZWNrY29uc3QgKCcvJywgJnJocyk7Ci0JICBpZiAocmhzLnZhbHVlID09IDApCi0JICAgIEVSUk9SICgoc3RkZXJyLCBfKCJhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvLlxuIikpKTsKLQkgIGVsc2UKLQkgICAgbGhzLT52YWx1ZSAvPSByaHMudmFsdWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotfQotCi0KLXN0YXRpYyBpbnQKLWxldmVsXzMgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGV4cF90IHJoczsKLQotICBpZHggPSBsZXZlbF8yIChpZHgsIHN0cmluZywgbGhzKTsKLQotICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4KLQkgJiYgKHN0cmluZy0+cHRyW2lkeF0gPT0gJysnCi0JICAgICB8fCBzdHJpbmctPnB0cltpZHhdID09ICctJykpCi0gICAgewotICAgICAgY2hhciBvcCA9IHN0cmluZy0+cHRyW2lkeCsrXTsKLSAgICAgIGlkeCA9IGxldmVsXzIgKGlkeCwgc3RyaW5nLCAmcmhzKTsKLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWNhc2UgJysnOgotCSAgbGhzLT52YWx1ZSArPSByaHMudmFsdWU7Ci0JICBpZiAobGhzLT5hZGRfc3ltYm9sLm5hbWUgJiYgcmhzLmFkZF9zeW1ib2wubmFtZSkKLQkgICAgewotCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJjYW4ndCBhZGQgdHdvIHJlbG9jYXRhYmxlIGV4cHJlc3Npb25zXG4iKSkpOwotCSAgICB9Ci0JICAvKiBjaGFuZ2Ugbm4rc3ltYm9sIHRvIHN5bWJvbCArIG5uICovCi0JICBpZiAocmhzLmFkZF9zeW1ib2wubmFtZSkKLQkgICAgewotCSAgICAgIGxocy0+YWRkX3N5bWJvbCA9IHJocy5hZGRfc3ltYm9sOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICctJzoKLQkgIGxocy0+dmFsdWUgLT0gcmhzLnZhbHVlOwotCSAgbGhzLT5zdWJfc3ltYm9sID0gcmhzLmFkZF9zeW1ib2w7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotfQotCi1zdGF0aWMgaW50Ci1sZXZlbF80IChpZHgsIHN0cmluZywgbGhzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqbGhzOwotewotICBleHBfdCByaHM7Ci0KLSAgaWR4ID0gbGV2ZWxfMyAoaWR4LCBzdHJpbmcsIGxocyk7Ci0KLSAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuICYmCi0JIHN0cmluZy0+cHRyW2lkeF0gPT0gJyYnKQotICAgIHsKLSAgICAgIGNoYXIgb3AgPSBzdHJpbmctPnB0cltpZHgrK107Ci0gICAgICBpZHggPSBsZXZlbF8zIChpZHgsIHN0cmluZywgJnJocyk7Ci0gICAgICBzd2l0Y2ggKG9wKQotCXsKLQljYXNlICcmJzoKLQkgIGNoZWNrY29uc3QgKCcmJywgbGhzKTsKLQkgIGNoZWNrY29uc3QgKCcmJywgJnJocyk7Ci0JICBsaHMtPnZhbHVlICY9IHJocy52YWx1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWxldmVsXzUgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGV4cF90IHJoczsKLQotICBpZHggPSBsZXZlbF80IChpZHgsIHN0cmluZywgbGhzKTsKLQotICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4KLQkgJiYgKHN0cmluZy0+cHRyW2lkeF0gPT0gJ3wnIHx8IHN0cmluZy0+cHRyW2lkeF0gPT0gJ34nKSkKLSAgICB7Ci0gICAgICBjaGFyIG9wID0gc3RyaW5nLT5wdHJbaWR4KytdOwotICAgICAgaWR4ID0gbGV2ZWxfNCAoaWR4LCBzdHJpbmcsICZyaHMpOwotICAgICAgc3dpdGNoIChvcCkKLQl7Ci0JY2FzZSAnfCc6Ci0JICBjaGVja2NvbnN0ICgnfCcsIGxocyk7Ci0JICBjaGVja2NvbnN0ICgnfCcsICZyaHMpOwotCSAgbGhzLT52YWx1ZSB8PSByaHMudmFsdWU7Ci0JICBicmVhazsKLQljYXNlICd+JzoKLQkgIGNoZWNrY29uc3QgKCd+JywgbGhzKTsKLQkgIGNoZWNrY29uc3QgKCd+JywgJnJocyk7Ci0JICBsaHMtPnZhbHVlIF49IHJocy52YWx1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci19Ci0KLQotLyogcGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgb2Zmc2V0IGlkeCBpbnRvIHN0cmluZywgZmlsbCB1cCByZXMgd2l0aAotICAgdGhlIHJlc3VsdC4gcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhciBwYXN0IHRoZSBleHByZXNzaW9uLgotICAgKi8KLQotc3RhdGljIGludAotZXhwX3BhcnNlIChpZHgsIHN0cmluZywgcmVzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqcmVzOwotewotICByZXR1cm4gbGV2ZWxfNSAoc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpLCBzdHJpbmcsIHJlcyk7Ci19Ci0KLQotLyogdHVybiB0aGUgZXhwcmVzc2lvbiBhdCBleHAgaW50byB0ZXh0IGFuZCBnbHVlIGl0IG9udG8gdGhlIGVuZCBvZgotICAgc3RyaW5nLiAqLwotCi1zdGF0aWMgdm9pZAotZXhwX3N0cmluZyAoZXhwLCBzdHJpbmcpCi0gICAgIGV4cF90ICpleHA7Ci0gICAgIHNiICpzdHJpbmc7Ci17Ci0gIGludCBucCA9IDA7Ci0gIGludCBhZCA9IDA7Ci0gIHNiX3Jlc2V0IChzdHJpbmcpOwotCi0gIGlmIChleHAtPmFkZF9zeW1ib2wubGVuKQotICAgIHsKLSAgICAgIHNiX2FkZF9idWZmZXIgKHN0cmluZywgZXhwLT5hZGRfc3ltYm9sLm5hbWUsIGV4cC0+YWRkX3N5bWJvbC5sZW4pOwotICAgICAgbnAgPSAxOwotICAgICAgYWQgPSAxOwotICAgIH0KLSAgaWYgKGV4cC0+dmFsdWUpCi0gICAgewotICAgICAgY2hhciBidWZbMjBdOwotICAgICAgaWYgKG5wKQotCXNiX2FkZF9jaGFyIChzdHJpbmcsICcrJyk7Ci0gICAgICBzcHJpbnRmIChidWYsICIlZCIsIGV4cC0+dmFsdWUpOwotICAgICAgc2JfYWRkX3N0cmluZyAoc3RyaW5nLCBidWYpOwotICAgICAgbnAgPSAxOwotICAgICAgYWQgPSAxOwotICAgIH0KLSAgaWYgKGV4cC0+c3ViX3N5bWJvbC5sZW4pCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKHN0cmluZywgJy0nKTsKLSAgICAgIHNiX2FkZF9idWZmZXIgKHN0cmluZywgZXhwLT5hZGRfc3ltYm9sLm5hbWUsIGV4cC0+YWRkX3N5bWJvbC5sZW4pOwotICAgICAgbnAgPSAwOwotICAgICAgYWQgPSAxOwotICAgIH0KLQotICBpZiAoIWFkKQotICAgIHNiX2FkZF9jaGFyIChzdHJpbmcsICcwJyk7Ci19Ci0KLQotLyogcGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgb2Zmc2V0IGlkeCBpbnRvIHNiIGluLCByZXR1cm4gdGhlIHZhbHVlIGluIHZhbC4gIAotICAgaWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IGNvbnN0YW50LCBnaXZlIEVSUk9SIGVtc2cuICByZXR1cm5zIHRoZSBpbmRleAotICAgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBwYXN0IHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb24uICovCi0KLXN0YXRpYyBpbnQKLWV4cF9nZXRfYWJzIChlbXNnLCBpZHgsIGluLCB2YWwpCi0gICAgIGNvbnN0IGNoYXIgKmVtc2c7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50ICp2YWw7Ci17Ci0gIGV4cF90IHJlczsKLSAgaWR4ID0gZXhwX3BhcnNlIChpZHgsIGluLCAmcmVzKTsKLSAgaWYgKHJlcy5hZGRfc3ltYm9sLmxlbiB8fCByZXMuc3ViX3N5bWJvbC5sZW4pCi0gICAgRVJST1IgKChzdGRlcnIsICIlcyIsIGVtc2cpKTsKLSAgKnZhbCA9IHJlcy52YWx1ZTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotCi1zYiBsYWJlbDsgLyogY3VycmVudCBsYWJlbCBwYXJzZWQgZnJvbSBsaW5lICovCi1oYXNoX3RhYmxlIGFzc2lnbl9oYXNoX3RhYmxlOyAgIC8qIGhhc2ggdGFibGUgZm9yIGFsbCBhc3NpZ25lZCB2YXJpYWJsZXMgKi8KLWhhc2hfdGFibGUga2V5d29yZF9oYXNoX3RhYmxlOyAgLyogaGFzaCB0YWJsZSBmb3Iga2V5d29yZCAqLwotaGFzaF90YWJsZSB2YXJzOyAgLyogaGFzaCB0YWJsZSBmb3IgIGVxIHZhcmlhYmxlcyAqLwotCi0jZGVmaW5lIGluX2NvbW1lbnQgJzsnCi0KLSNpZiAwCi1zdGF0aWMgdm9pZAotc3RyaXBfY29tbWVudHMgKG91dCkKLSAgICAgc2IgKm91dDsKLXsKLSAgY2hhciAqcyA9IG91dC0+cHRyOwotICBpbnQgaSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBvdXQtPmxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChJU0NPTU1FTlRDSEFSKHNbaV0pKQotCXsKLQkgIG91dC0+bGVuID0gaTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qIHB1c2ggYmFjayBjaGFyYWN0ZXIgY2ggc28gdGhhdCBpdCBjYW4gYmUgcmVhZCBhZ2Fpbi4gKi8KLQotc3RhdGljIHZvaWQKLXVuZ2V0IChjaCkKLSAgICAgaW50IGNoOwotewotICBpZiAoY2ggPT0gJ1xuJykKLSAgICB7Ci0gICAgICBzcC0+bGluZWNvdW50LS07Ci0gICAgfQotICBpZiAoc3AtPnB1c2hiYWNrX2luZGV4KQotICAgIHNwLT5wdXNoYmFja19pbmRleC0tOwotICBlbHNlCi0gICAgc2JfYWRkX2NoYXIgKCZzcC0+cHVzaGJhY2ssIGNoKTsKLX0KLQotLyogcHVzaCB0aGUgc2IgcHRyIG9udG8gdGhlIGluY2x1ZGUgc3RhY2ssIHdpdGggdGhlIGdpdmVuIG5hbWUsIHR5cGUgYW5kIGluZGV4LiAqLwotCi1zdGF0aWMKLXZvaWQKLWluY2x1ZGVfYnVmIChuYW1lLCBwdHIsIHR5cGUsIGluZGV4KQotICAgICBzYiAqbmFtZTsKLSAgICAgc2IgKnB0cjsKLSAgICAgaW5jbHVkZV90eXBlIHR5cGU7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgc3ArKzsKLSAgaWYgKHNwIC0gaW5jbHVkZV9zdGFjayA+PSBNQVhfSU5DTFVERVMpCi0gICAgRkFUQUwgKChzdGRlcnIsIF8oInVucmVhc29uYWJsZSBuZXN0aW5nLlxuIikpKTsKLSAgc2JfbmV3ICgmc3AtPm5hbWUpOwotICBzYl9hZGRfc2IgKCZzcC0+bmFtZSwgbmFtZSk7Ci0gIHNwLT5oYW5kbGUgPSAwOwotICBzcC0+bGluZWNvdW50ID0gMTsKLSAgc3AtPnB1c2hiYWNrX2luZGV4ID0gMDsKLSAgc3AtPnR5cGUgPSB0eXBlOwotICBzcC0+aW5kZXggPSBpbmRleDsKLSAgc2JfbmV3ICgmc3AtPnB1c2hiYWNrKTsKLSAgc2JfYWRkX3NiICgmc3AtPnB1c2hiYWNrLCBwdHIpOwotfQotCi0KLS8qIHVzZWQgaW4gRVJST1IgbWVzc2FnZXMsIHByaW50IGluZm8gb24gd2hlcmUgdGhlIGluY2x1ZGUgc3RhY2sgaXMgb250byBmaWxlLiAqLwotc3RhdGljIAotdm9pZAotaW5jbHVkZV9wcmludF93aGVyZV9saW5lIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBzdHJ1Y3QgaW5jbHVkZV9zdGFjayAqcCA9IGluY2x1ZGVfc3RhY2sgKyAxOwotCi0gIHdoaWxlIChwIDw9IHNwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICIlczolZCAiLCBzYl9uYW1lICgmcC0+bmFtZSksIHAtPmxpbmVjb3VudCAtIDEpOwotICAgICAgcCsrOwotICAgIH0KLX0KLQotLyogdXNlZCBpbiBsaXN0aW5ncywgcHJpbnQgdGhlIGxpbmUgbnVtYmVyIG9udG8gZmlsZS4gKi8KLXN0YXRpYyB2b2lkCi1pbmNsdWRlX3ByaW50X2xpbmUgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGludCBuOwotICBzdHJ1Y3QgaW5jbHVkZV9zdGFjayAqcCA9IGluY2x1ZGVfc3RhY2sgKyAxOwotCi0gIG4gPSBmcHJpbnRmIChmaWxlLCAiJTRkIiwgcC0+bGluZWNvdW50KTsKLSAgcCsrOwotICB3aGlsZSAocCA8PSBzcCkKLSAgICB7Ci0gICAgICBuICs9IGZwcmludGYgKGZpbGUsICIuJWQiLCBwLT5saW5lY291bnQpOwotICAgICAgcCsrOwotICAgIH0KLSAgd2hpbGUgKG4gPCA4ICogMykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICIpOwotICAgICAgbisrOwotICAgIH0KLX0KLQotCi0vKiByZWFkIGEgbGluZSBmcm9tIHRoZSB0b3Agb2YgdGhlIGluY2x1ZGUgc3RhY2sgaW50byBzYiBpbi4gKi8KLQotc3RhdGljIGludAotZ2V0X2xpbmUgKGluKQotICAgICBzYiAqaW47Ci17Ci0gIGludCBvbmxpbmUgPSAwOwotICBpbnQgbW9yZSA9IDE7Ci0KLSAgaWYgKGNvcHlzb3VyY2UpCi0gICAgewotICAgICAgcHV0YyAoY29tbWVudF9jaGFyLCBvdXRmaWxlKTsKLSAgICAgIGlmIChwcmludF9saW5lX251bWJlcikKLQlpbmNsdWRlX3ByaW50X2xpbmUgKG91dGZpbGUpOwotICAgIH0KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgY2ggPSBnZXQgKCk7Ci0KLSAgICAgIHdoaWxlIChjaCA9PSAnXHInKQotCWNoID0gZ2V0ICgpOwotCi0gICAgICBpZiAoY2ggPT0gRU9GKQotCXsKLQkgIGlmIChvbmxpbmUpCi0JICAgIHsKLQkgICAgICBXQVJOSU5HICgoc3RkZXJyLCBfKCJFbmQgb2YgZmlsZSBub3QgYXQgc3RhcnQgb2YgbGluZS5cbiIpKSk7Ci0JICAgICAgaWYgKGNvcHlzb3VyY2UpCi0JCXB1dGMgKCdcbicsIG91dGZpbGUpOwotCSAgICAgIGNoID0gJ1xuJzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBtb3JlID0gMDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGNvcHlzb3VyY2UpCi0JewotCSAgcHV0YyAoY2gsIG91dGZpbGUpOwotCX0KLQotICAgICAgaWYgKGNoID09ICdcbicpCi0JewotCSAgY2ggPSBnZXQgKCk7Ci0JICBvbmxpbmUgPSAwOwotCSAgaWYgKGNoID09ICcrJykKLQkgICAgewotCSAgICAgIC8qIGNvbnRpbnVlZCBsaW5lICovCi0JICAgICAgaWYgKGNvcHlzb3VyY2UpCi0JCXsKLQkJICBwdXRjIChjb21tZW50X2NoYXIsIG91dGZpbGUpOwotCQkgIHB1dGMgKCcrJywgb3V0ZmlsZSk7Ci0JCX0KLQkgICAgICBjaCA9IGdldCAoKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGNoICE9IEVPRikKLQkJdW5nZXQgKGNoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfY2hhciAoaW4sIGNoKTsKLQl9Ci0gICAgICBvbmxpbmUrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIG1vcmU7Ci19Ci0KLS8qIGZpbmQgYSBsYWJlbCBmcm9tIHNiIGluIGFuZCBwdXQgaXQgaW4gb3V0LiAqLwotCi1zdGF0aWMgaW50Ci1ncmFiX2xhYmVsIChpbiwgb3V0KQotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0gIGludCBpID0gMDsKLSAgc2JfcmVzZXQgKG91dCk7Ci0gIGlmIChJU0ZJUlNUQ0hBUiAoaW4tPnB0cltpXSkgfHwgaW4tPnB0cltpXSA9PSAnXFwnKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaV0pOwotICAgICAgaSsrOwotICAgICAgd2hpbGUgKChJU05FWFRDSEFSIChpbi0+cHRyW2ldKSAKLQkgICAgICB8fCBpbi0+cHRyW2ldID09ICdcXCcKLQkgICAgICB8fCBpbi0+cHRyW2ldID09ICcmJykgCi0JICAgICAmJiBpIDwgaW4tPmxlbikKLQl7Ci0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2ldKTsKLQkgIGkrKzsKLQl9Ci0gICAgfQotICByZXR1cm4gaTsKLX0KLQotLyogZmluZCBhbGwgc3RyYW5nZSBiYXNlIHN0dWZmIGFuZCB0dXJuIGludG8gZGVjaW1hbC4gYWxzbwotICAgZmluZCBhbGwgdGhlIG90aGVyIG51bWJlcnMgYW5kIGNvbnZlcnQgdGhlbSBmcm9tIHRoZSBkZWZhdWx0IHJhZGl4ICovCi0KLXN0YXRpYyB2b2lkCi1jaGFuZ2VfYmFzZSAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0gIGNoYXIgYnVmZmVyWzIwXTsKLQotICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKLQkgICYmIGlkeCArIDEgPCBpbi0+bGVuCi0JICAmJiBpbi0+cHRyW2lkeCArIDFdID09ICcoJykKLQl7Ci0JICBpZHggKz0gMjsKLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JCSAmJiBpbi0+cHRyW2lkeF0gIT0gJyknKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCSAgaWYgKGlkeCA8IGluLT5sZW4pCi0JICAgIGlkeCsrOwotCX0KLSAgICAgIGVsc2UgaWYgKGlkeCA8IGluLT5sZW4gLSAxICYmIGluLT5wdHJbaWR4ICsgMV0gPT0gJ1wnJyAmJiAhIG1yaSkKLQl7Ci0JICBpbnQgYmFzZTsKLQkgIGludCB2YWx1ZTsKLQkgIHN3aXRjaCAoaW4tPnB0cltpZHhdKQotCSAgICB7Ci0JICAgIGNhc2UgJ2InOgotCSAgICBjYXNlICdCJzoKLQkgICAgICBiYXNlID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncSc6Ci0JICAgIGNhc2UgJ1EnOgotCSAgICAgIGJhc2UgPSA4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdoJzoKLQkgICAgY2FzZSAnSCc6Ci0JICAgICAgYmFzZSA9IDE2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdkJzoKLQkgICAgY2FzZSAnRCc6Ci0JICAgICAgYmFzZSA9IDEwOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJJbGxlZ2FsIGJhc2UgY2hhcmFjdGVyICVjLlxuIiksIGluLT5wdHJbaWR4XSkpOwotCSAgICAgIGJhc2UgPSAxMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZHggPSBzYl9zdHJ0b2wgKGlkeCArIDIsIGluLCBiYXNlLCAmdmFsdWUpOwotCSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCB2YWx1ZSk7Ci0JICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1ZmZlcik7Ci0JfQotICAgICAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgLyogY29weSBlbnRpcmUgbmFtZXMgdGhyb3VnaCBxdWlja2x5ICovCi0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOwotCSAgaWR4Kys7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBJU05FWFRDSEFSIChpbi0+cHRyW2lkeF0pKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pKQotCXsKLQkgIGludCB2YWx1ZTsKLQkgIC8qIGFsbCBudW1iZXJzIG11c3Qgc3RhcnQgd2l0aCBhIGRpZ2l0LCBsZXQncyBjaGV3IGl0IGFuZAotCSAgICAgc3BpdCBvdXQgZGVjaW1hbCAqLwotCSAgaWR4ID0gc2Jfc3RydG9sIChpZHgsIGluLCByYWRpeCwgJnZhbHVlKTsKLQkgIHNwcmludGYgKGJ1ZmZlciwgIiVkIiwgdmFsdWUpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCi0JICAvKiBza2lwIGFsbCB1bmRpZ3Nlc3RlZCBsZXR0ZXJzICovCi0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBJU05FWFRDSEFSIChpbi0+cHRyW2lkeF0pKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JewotCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKLQkgIC8qIGNvcHkgZW50aXJlIG5hbWVzIHRocm91Z2ggcXVpY2tseSAqLwotCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgIGlkeCsrOwotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdICE9IHRjaGFyKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBub3RoaW5nIHNwZWNpYWwsIGp1c3QgcGFzcyBpdCB0aHJvdWdoICovCi0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOwotCSAgaWR4Kys7Ci0JfQotICAgIH0KLQotfQotCi0vKiAuZW5kICovCi1zdGF0aWMgdm9pZAotZG9fZW5kIChpbikKLSAgICAgc2IgKmluOwotewotICBoYWRfZW5kID0gMTsKLSAgaWYgKG1yaSkKLSAgICBmcHJpbnRmIChvdXRmaWxlLCAiJXNcbiIsIHNiX25hbWUgKGluKSk7Ci19Ci0KLS8qIC5hc3NpZ24gKi8KLQotc3RhdGljIHZvaWQKLWRvX2Fzc2lnbiAoYWdhaW4sIGlkeCwgaW4pCi0gICAgIGludCBhZ2FpbjsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICAvKiBzdGljayBsYWJlbCBpbiBzeW1ib2wgdGFibGUgd2l0aCBmb2xsb3dpbmcgdmFsdWUgKi8KLSAgZXhwX3QgZTsKLSAgc2IgYWNjOwotCi0gIHNiX25ldyAoJmFjYyk7Ci0gIGlkeCA9IGV4cF9wYXJzZSAoaWR4LCBpbiwgJmUpOwotICBleHBfc3RyaW5nICgmZSwgJmFjYyk7Ci0gIGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSAoJmFzc2lnbl9oYXNoX3RhYmxlLCAmbGFiZWwsICZhY2MsIGFnYWluKTsKLSAgc2Jfa2lsbCAoJmFjYyk7Ci19Ci0KLQotLyogLnJhZGl4IFtifHF8ZHxoXSAqLwotCi1zdGF0aWMKLXZvaWQKLWRvX3JhZGl4IChwdHIpCi0gICAgIHNiICpwdHI7Ci17Ci0gIGludCBpZHggPSBzYl9za2lwX3doaXRlICgwLCBwdHIpOwotICBzd2l0Y2ggKHB0ci0+cHRyW2lkeF0pCi0gICAgewotICAgIGNhc2UgJ0InOgotICAgIGNhc2UgJ2InOgotICAgICAgcmFkaXggPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncSc6Ci0gICAgY2FzZSAnUSc6Ci0gICAgICByYWRpeCA9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHJhZGl4ID0gMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdoJzoKLSAgICBjYXNlICdIJzoKLSAgICAgIHJhZGl4ID0gMTY7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IgKChzdGRlcnIsIF8oInJhZGl4IGlzICVjIG11c3QgYmUgb25lIG9mIGIsIHEsIGQgb3IgaCIpLCByYWRpeCkpOwotICAgIH0KLX0KLQotCi0vKiBQYXJzZSBvZmYgYSAuYiwgLncgb3IgLmwgKi8KLQotc3RhdGljIGludAotZ2V0X29wc2l6ZSAoaWR4LCBpbiwgc2l6ZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgKnNpemU7Ci17Ci0gICpzaXplID0gNDsKLSAgaWYgKGluLT5wdHJbaWR4XSA9PSAnLicpCi0gICAgewotICAgICAgaWR4Kys7Ci0gICAgfQotICBzd2l0Y2ggKGluLT5wdHJbaWR4XSkKLSAgICB7Ci0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAnQic6Ci0gICAgICAqc2l6ZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd3JzoKLSAgICBjYXNlICdXJzoKLSAgICAgICpzaXplID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2wnOgotICAgIGNhc2UgJ0wnOgotICAgICAgKnNpemUgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnICc6Ci0gICAgY2FzZSAnXHQnOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJzaXplIG11c3QgYmUgb25lIG9mIGIsIHcgb3IgbCwgaXMgJWMuXG4iKSwgaW4tPnB0cltpZHhdKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGlkeCsrOwotCi0gIHJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyAKLWludCBlb2woaWR4LCBsaW5lKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqbGluZTsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBsaW5lKTsKLSAgaWYgKGlkeCA8IGxpbmUtPmxlbiAKLSAgICAgICYmIElTQ09NTUVOVENIQVIobGluZS0+cHRyW2lkeF0pKQotICAgIHJldHVybiAxOwotICBpZiAoaWR4ID49IGxpbmUtPmxlbikKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIC5kYXRhIFsuYnwud3wubF0gPGRhdGE+KiAKLSAgICBvciBkW2J3bF0gPGRhdGE+KiAqLwotCi1zdGF0aWMgdm9pZAotZG9fZGF0YSAoaWR4LCBpbiwgc2l6ZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IG9wc2l6ZSA9IDQ7Ci0gIGNoYXIgKm9wbmFtZSA9ICIueWlrZXMhIjsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotCi0gIGlmICghc2l6ZSkgCi0gICAgewotICAgICAgaWR4ID0gZ2V0X29wc2l6ZSAoaWR4LCBpbiwgJm9wc2l6ZSk7Ci0gICAgfQotICBlbHNlIHsKLSAgICBvcHNpemUgPSBzaXplOwotICB9Ci0gIHN3aXRjaCAob3BzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBvcG5hbWUgPSAiLmxvbmciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgb3BuYW1lID0gIi5zaG9ydCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBvcG5hbWUgPSAiLmJ5dGUiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIiVzXHQiLCBvcG5hbWUpOwotCi0gIGlkeCA9ICAgc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgaWYgKGFsdGVybmF0ZSAKLSAgICAgICYmIGlkeCA8IGluLT5sZW4gCi0gICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJyInKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhY2MubGVuOyBpKyspCi0JewotCSAgaWYgKGkpCi0JICAgIGZwcmludGYob3V0ZmlsZSwiLCIpOwotCSAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLnB0cltpXSk7Ci0JfQotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICB3aGlsZSAoIWVvbCAoaWR4LCBpbikpCi0JewotCSAgZXhwX3QgZTsKLQkgIGlkeCA9IGV4cF9wYXJzZSAoaWR4LCBpbiwgJmUpOwotCSAgZXhwX3N0cmluZyAoJmUsICZhY2MpOwotCSAgc2JfYWRkX2NoYXIgKCZhY2MsIDApOwotCSAgZnByaW50ZiAob3V0ZmlsZSwgIiVzIiwgYWNjLnB0cik7Ci0JICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJywnKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotICBzYl9wcmludF9hdCAob3V0ZmlsZSwgaWR4LCBpbik7Ci0gIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotfQotCi0vKiAuZGF0YWIgWy5ifC53fC5sXSA8cmVwZWF0Piw8ZmlsbD4gKi8KLQotc3RhdGljIHZvaWQKLWRvX2RhdGFiIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBvcHNpemU7Ci0gIGludCByZXBlYXQ7Ci0gIGludCBmaWxsOwotCi0gIGlkeCA9IGdldF9vcHNpemUgKGlkeCwgaW4sICZvcHNpemUpOwotCi0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJkYXRhYiByZXBlYXQgbXVzdCBiZSBjb25zdGFudC5cbiIpLCBpZHgsIGluLCAmcmVwZWF0KTsKLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJkYXRhYiBkYXRhIG11c3QgYmUgYWJzb2x1dGUuXG4iKSwgaWR4LCBpbiwgJmZpbGwpOwotCi0gIGZwcmludGYgKG91dGZpbGUsICIuZmlsbFx0JWQsJWQsJWRcbiIsIHJlcGVhdCwgb3BzaXplLCBmaWxsKTsKLX0KLQotLyogLmFsaWduIDxzaXplPiAqLwotCi1zdGF0aWMgdm9pZAotZG9fYWxpZ24gKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IGFsLCBoYXZlX2ZpbGwsIGZpbGw7Ci0KLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oImFsaWduIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24uXG4iKSwgaWR4LCBpbiwgJmFsKTsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGhhdmVfZmlsbCA9IDA7Ci0gIGZpbGwgPSAwOwotICBpZiAoISBlb2wgKGlkeCwgaW4pKQotICAgIHsKLSAgICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICAgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIi5hbGlnbiBuZWVkcyBhYnNvbHV0ZSBmaWxsIHZhbHVlLlxuIiksIGlkeCwgaW4sCi0JCQkgJmZpbGwpOwotICAgICAgaGF2ZV9maWxsID0gMTsKLSAgICB9Ci0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIi5hbGlnbgklZCIsIGFsKTsKLSAgaWYgKGhhdmVfZmlsbCkKLSAgICBmcHJpbnRmIChvdXRmaWxlLCAiLCVkIiwgZmlsbCk7Ci0gIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotfQotCi0vKiAucmVzWy5ifC53fC5sXSA8c2l6ZT4gKi8KLQotc3RhdGljIHZvaWQKLWRvX3JlcyAoaWR4LCBpbiwgdHlwZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IHNpemUgPSA0OwotICBpbnQgY291bnQgPSAwOwotCi0gIGlkeCA9IGdldF9vcHNpemUgKGlkeCwgaW4sICZzaXplKTsKLSAgd2hpbGUgKCFlb2woaWR4LCBpbikpCi0gICAgewotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICcsJykKLQlpZHgrKzsKLSAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJyZXMgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiBmb3IgZmlsbCBjb3VudC5cbiIpLCBpZHgsIGluLCAmY291bnQpOwotCi0gICAgICBpZiAodHlwZSA9PSAnYycgfHwgdHlwZSA9PSAneicpCi0JY291bnQrKzsKLQotICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIi5zcGFjZQklZFxuIiwgY291bnQgKiBzaXplKTsKLSAgICB9Ci19Ci0KLQotLyogLmV4cG9ydCAqLwotCi1zdGF0aWMgdm9pZAotZG9fZXhwb3J0IChpbikKLSAgICAgc2IgKmluOwotewotICBmcHJpbnRmIChvdXRmaWxlLCAiLmdsb2JhbAklc1xuIiwgc2JfbmFtZSAoaW4pKTsKLX0KLQotLyogLnByaW50IFtsaXN0XSBbbm9saXN0XSAqLwotCi1zdGF0aWMgdm9pZAotZG9fcHJpbnQgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgIkxJU1QiLCA0KSA9PSAwKQotCXsKLQkgIGZwcmludGYgKG91dGZpbGUsICIubGlzdFxuIik7Ci0JICBpZHggKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgIk5PTElTVCIsIDYpID09IDApCi0JewotCSAgZnByaW50ZiAob3V0ZmlsZSwgIi5ub2xpc3RcbiIpOwotCSAgaWR4ICs9IDY7Ci0JfQotICAgICAgaWR4Kys7Ci0gICAgfQotfQotCi0vKiAuaGVhZCAqLwotc3RhdGljIHZvaWQKLWRvX2hlYWRpbmcgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgc2IgaGVhZDsKLSAgc2JfbmV3ICgmaGVhZCk7Ci0gIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmhlYWQpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiLnRpdGxlCVwiJXNcIlxuIiwgc2JfbmFtZSAoJmhlYWQpKTsKLSAgc2Jfa2lsbCAoJmhlYWQpOwotfQotCi0vKiAucGFnZSAqLwotCi1zdGF0aWMgdm9pZAotZG9fcGFnZSAoKQotewotICBmcHJpbnRmIChvdXRmaWxlLCAiLmVqZWN0XG4iKTsKLX0KLQotLyogLmZvcm0gW2xpbj08dmFsdWU+XSBbY29sPTx2YWx1ZT5dICovCi1zdGF0aWMgdm9pZAotZG9fZm9ybSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgbGluZXMgPSA2MDsKLSAgaW50IGNvbHVtbnMgPSAxMzI7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLQotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbi0+cHRyICsgaWR4LCAiTElOPSIsIDQpID09IDApCi0JewotCSAgaWR4ICs9IDQ7Ci0JICBpZHggPSBleHBfZ2V0X2FicyAoXygiZm9ybSBMSU49IG5lZWRzIGFic29sdXRlIGV4cHJlc3NzaW9uLlxuIiksIGlkeCwgaW4sICZsaW5lcyk7Ci0JfQotCi0gICAgICBpZiAoc3RybmNhc2VjbXAgKGluLT5wdHIgKyBpZHgsIF8oIkNPTD0iKSwgNCkgPT0gMCkKLQl7Ci0JICBpZHggKz0gNDsKLQkgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJmb3JtIENPTD0gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc3Npb24uXG4iKSwgaWR4LCBpbiwgJmNvbHVtbnMpOwotCX0KLQotICAgICAgaWR4Kys7Ci0gICAgfQotICBmcHJpbnRmIChvdXRmaWxlLCAiLnBzaXplICVkLCVkXG4iLCBsaW5lcywgY29sdW1ucyk7Ci0KLX0KLQotCi0vKiBGZXRjaCBzdHJpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLAotICAgcnVsZXM6Ci0gICAgJ0J4eXg8d2hpdGVzcGFjZT4gIAktPiByZXR1cm4gJ0J4eXphCi0gICAgJTxjaGFyPgkJLT4gcmV0dXJuIHN0cmluZyBvZiBkZWNpbWFsIHZhbHVlIG9mIHgKLSAgICAiPHN0cmluZz4iCQktPiByZXR1cm4gc3RyaW5nCi0gICAgeHl4PHdoaXRlc3BhY2U+ICAgICAtPiByZXR1cm4geHl6Ci0qLwotc3RhdGljIGludAotZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sIG91dCwgZXhwYW5kLCBwcmV0ZW5kX3F1b3RlZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgZXhwYW5kOwotICAgICBpbnQgcHJldGVuZF9xdW90ZWQ7Ci17Ci0gIHNiX3Jlc2V0IChvdXQpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBpZiAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoaW4tPmxlbiA+IDIgJiYgaW4tPnB0cltpZHgrMV0gPT0gJ1wnJyAmJiBJU0JBU0UgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgd2hpbGUgKCFJU1NFUCAoaW4tPnB0cltpZHhdKSkKLQkgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnJScKLQkgICAgICAgJiYgYWx0ZXJuYXRlCi0JICAgICAgICYmIGV4cGFuZCkKLQl7Ci0JICBpbnQgdmFsOwotCSAgY2hhciBidWZbMjBdOwotCSAgLyogVHVybnMgdGhlIG5leHQgZXhwcmVzc2lvbiBpbnRvIGEgc3RyaW5nICovCi0JICBpZHggPSBleHBfZ2V0X2FicyAoXygiJSBvcGVyYXRvciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uIiksCi0JCQkgICAgIGlkeCArIDEsCi0JCQkgICAgIGluLAotCQkJICAgICAmdmFsKTsKLQkgIHNwcmludGYoYnVmLCAiJWQiLCB2YWwpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWYpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicKLQkgICAgICAgfHwgaW4tPnB0cltpZHhdID09ICc8JwotCSAgICAgICB8fCAoYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSA9PSAnXCcnKSkKLQl7Ci0JICBpZiAoYWx0ZXJuYXRlICYmIGV4cGFuZCkKLQkgICAgewotCSAgICAgIC8qIEtlZXAgdGhlIHF1b3RlcyAqLwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICAnXCInKTsKLQkJICAgIAotCSAgICAgIGlkeCA9ICBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOwotCi0JICAgIH0KLQkgIGVsc2UgewotCSAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICB9Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAKLQkJICYmIChpbi0+cHRyW2lkeF0gPT0gJyInCi0JCSAgICAgfHwgaW4tPnB0cltpZHhdID09ICdcJycKLQkJICAgICB8fCBwcmV0ZW5kX3F1b3RlZCAKLQkJICAgICB8fCAhSVNTRVAgKGluLT5wdHJbaWR4XSkpKQotCSAgICB7Ci0JICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgCi0JCSAgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JCXsKLQkJICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOwotCQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQkJICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCQkJICYmIGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkJICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsJCSAgICAKLQkJICBpZiAoaWR4ID09IGluLT5sZW4pCi0JCSAgICByZXR1cm4gaWR4OwkgICAgICAKLQkJfQotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotCi0vKiBza2lwIGFsb25nIHNiIGluIHN0YXJ0aW5nIGF0IGlkeCwgc3VjayBvZmYgd2hpdGVzcGFjZSBhICggYW5kIG1vcmUKLSAgIHdoaXRlc3BhY2UuICByZXR1cm4gdGhlIGlkeCBvZiB0aGUgbmV4dCBjaGFyICovCi0KLXN0YXRpYyBpbnQKLXNraXBfb3BlbnAgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGlmIChpbi0+cHRyW2lkeF0gIT0gJygnKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgKCAuXG4iKSkpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHggKyAxLCBpbik7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIHNraXAgYWxvbmcgc2IgaW4gc3RhcnRpbmcgYXQgaWR4LCBzdWNrIG9mZiB3aGl0ZXNwYWNlIGEgKSBhbmQgbW9yZQotICAgd2hpdGVzcGFjZS4gIHJldHVybiB0aGUgaWR4IG9mIHRoZSBuZXh0IGNoYXIgKi8KLQotc3RhdGljIGludAotc2tpcF9jbG9zZXAgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGlmIChpbi0+cHRyW2lkeF0gIT0gJyknKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgKS5cbiIpKSk7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCArIDEsIGluKTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogLmxlbiAqLwotCi1zdGF0aWMgaW50Ci1kb2xlbiAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0KLSAgc2Igc3RyaW5nb3V0OwotICBjaGFyIGJ1ZmZlclsxMF07Ci0KLSAgc2JfbmV3ICgmc3RyaW5nb3V0KTsKLSAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnN0cmluZ291dCk7Ci0gIGlkeCA9IHNraXBfY2xvc2VwIChpZHgsIGluKTsKLSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBzdHJpbmdvdXQubGVuKTsKLSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCi0gIHNiX2tpbGwgKCZzdHJpbmdvdXQpOwotICByZXR1cm4gaWR4OwotfQotCi0KLS8qIC5pbnN0ciAqLwotCi1zdGF0aWMKLWludAotZG9pbnN0ciAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0gIHNiIHN0cmluZzsKLSAgc2Igc2VhcmNoOwotICBpbnQgaTsKLSAgaW50IHN0YXJ0OwotICBpbnQgcmVzOwotICBjaGFyIGJ1ZmZlclsxMF07Ci0KLSAgc2JfbmV3ICgmc3RyaW5nKTsKLSAgc2JfbmV3ICgmc2VhcmNoKTsKLSAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnN0cmluZyk7Ci0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzZWFyY2gpOwotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pKQotICAgIHsKLSAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCIuaW5zdHIgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc29uLlxuIiksIGlkeCwgaW4sICZzdGFydCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RhcnQgPSAwOwotICAgIH0KLSAgaWR4ID0gc2tpcF9jbG9zZXAgKGlkeCwgaW4pOwotICByZXMgPSAtMTsKLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdHJpbmcubGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKHN0cmluZy5wdHIgKyBpLCBzZWFyY2gucHRyLCBzZWFyY2gubGVuKSA9PSAwKQotCXsKLQkgIHJlcyA9IGk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBzcHJpbnRmIChidWZmZXIsICIlZCIsIHJlcyk7Ci0gIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKLSAgc2Jfa2lsbCAoJnN0cmluZyk7Ci0gIHNiX2tpbGwgKCZzZWFyY2gpOwotICByZXR1cm4gaWR4OwotfQotCi0KLXN0YXRpYyBpbnQKLWRvc3Vic3RyIChpZHgsIGluLCBvdXQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLSAgc2Igc3RyaW5nOwotICBpbnQgcG9zOwotICBpbnQgbGVuOwotICBzYl9uZXcgKCZzdHJpbmcpOwotCi0gIGlkeCA9IHNraXBfb3BlbnAgKGlkeCwgaW4pOwotICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzdHJpbmcpOwotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIm5lZWQgYWJzb2x1dGUgcG9zaXRpb24uXG4iKSwgaWR4LCBpbiwgJnBvcyk7Ci0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBleHBfZ2V0X2FicyAoXygibmVlZCBhYnNvbHV0ZSBsZW5ndGguXG4iKSwgaWR4LCBpbiwgJmxlbik7Ci0gIGlkeCA9IHNraXBfY2xvc2VwIChpZHgsIGluKTsKLQotCi0gIGlmIChsZW4gPCAwIHx8IHBvcyA8IDAgfHwKLSAgICAgIHBvcyA+IHN0cmluZy5sZW4KLSAgICAgIHx8IHBvcyArIGxlbiA+IHN0cmluZy5sZW4pCi0gICAgewotICAgICAgc2JfYWRkX3N0cmluZyAob3V0LCAiICIpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAob3V0LCAnIicpOwotICAgICAgd2hpbGUgKGxlbiA+IDApCi0JewotCSAgc2JfYWRkX2NoYXIgKG91dCwgc3RyaW5nLnB0cltwb3MrK10pOwotCSAgbGVuLS07Ci0JfQotICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyInKTsKLSAgICB9Ci0gIHNiX2tpbGwoJnN0cmluZyk7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIHNjYW4gbGluZSwgY2hhbmdlIHRva2VucyBpbiB0aGUgaGFzaCB0YWJsZSB0byB0aGVpciByZXBsYWNlbWVudHMgKi8KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sIGJ1ZikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqYnVmOwotewotICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBoYXNoX2VudHJ5ICpwdHI7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKLQkgICYmIGlkeCArIDEgPCBpbi0+bGVuCi0JICAmJiBpbi0+cHRyW2lkeCArIDFdID09ICcoJykKLQl7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKGJ1ZiwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHggLSAxXSAhPSAnKScpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnXFwnCi0JICAmJiBpZHggKyAxIDwgaW4tPmxlbgotCSAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnJicpCi0JewotCSAgaWR4ID0gY29uZGFzc19sb29rdXBfbmFtZSAoaW4sIGlkeCArIDIsIGJ1ZiwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKLQkgICAgICAgJiYgaWR4ICsgMSA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnJCcpCi0JewotCSAgaWR4ID0gY29uZGFzc19sb29rdXBfbmFtZSAoaW4sIGlkeCArIDIsIGJ1ZiwgMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoaWR4ICsgMyA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltpZHhdID09ICcuJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAxXSkgPT0gJ0wnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDJdKSA9PSAnRScKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgM10pID09ICdOJykKLQlpZHggPSBkb2xlbiAoaWR4ICsgNCwgaW4sIGJ1Zik7Ci0gICAgICBlbHNlIGlmIChpZHggKyA2IDwgaW4tPmxlbgotCSAgICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJy4nCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDFdKSA9PSAnSScKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMl0pID09ICdOJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAzXSkgPT0gJ1MnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDRdKSA9PSAnVCcKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNV0pID09ICdSJykKLQlpZHggPSBkb2luc3RyIChpZHggKyA2LCBpbiwgYnVmKTsKLSAgICAgIGVsc2UgaWYgKGlkeCArIDcgPCBpbi0+bGVuCi0JICAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnLicKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMV0pID09ICdTJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAyXSkgPT0gJ1UnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDNdKSA9PSAnQicKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNF0pID09ICdTJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyA1XSkgPT0gJ1QnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDZdKSA9PSAnUicpCi0JaWR4ID0gZG9zdWJzdHIgKGlkeCArIDcsIGluLCBidWYpOwotICAgICAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgLyogbWF5IGJlIGEgc2ltcGxlIG5hbWUgc3Vic2l0dXRpb24sIHNlZSBpZiB3ZSBoYXZlIGEgd29yZCAqLwotCSAgc2IgYWNjOwotCSAgaW50IGN1ciA9IGlkeCArIDE7Ci0JICB3aGlsZSAoY3VyIDwgaW4tPmxlbgotCQkgJiYgKElTTkVYVENIQVIgKGluLT5wdHJbY3VyXSkpKQotCSAgICBjdXIrKzsKLQotCSAgc2JfbmV3ICgmYWNjKTsKLQkgIHNiX2FkZF9idWZmZXIgKCZhY2MsIGluLT5wdHIgKyBpZHgsIGN1ciAtIGlkeCk7Ci0JICBwdHIgPSBoYXNoX2xvb2t1cCAoJmFzc2lnbl9oYXNoX3RhYmxlLCAmYWNjKTsKLQkgIGlmIChwdHIpCi0JICAgIHsKLQkgICAgICAvKiBGb3VuZCBhIGRlZmluaXRpb24gZm9yIGl0ICovCi0JICAgICAgc2JfYWRkX3NiIChidWYsICZwdHItPnZhbHVlLnMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBObyBkZWZpbml0aW9uLCBqdXN0IGNvcHkgdGhlIHdvcmQgKi8KLQkgICAgICBzYl9hZGRfc2IgKGJ1ZiwgJmFjYyk7Ci0JICAgIH0KLQkgIHNiX2tpbGwgKCZhY2MpOwotCSAgaWR4ID0gY3VyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfY2hhciAoYnVmLCBpbi0+cHRyW2lkeCsrXSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGludAotZ2V0X2FuZF9wcm9jZXNzIChpZHgsIGluLCBvdXQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLSAgc2IgdDsKLSAgc2JfbmV3ICgmdCk7Ci0gIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmdCwgMSwgMCk7Ci0gIHByb2Nlc3NfYXNzaWducyAoMCwgJnQsIG91dCk7Ci0gIHNiX2tpbGwgKCZ0KTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljCi12b2lkCi1wcm9jZXNzX2ZpbGUgKCkKLXsKLSAgc2IgbGluZTsKLSAgc2IgdDEsIHQyOwotICBzYiBhY2M7Ci0gIHNiIGxhYmVsX2luOwotICBpbnQgbW9yZTsKLQotICBzYl9uZXcgKCZsaW5lKTsKLSAgc2JfbmV3ICgmdDEpOwotICBzYl9uZXcgKCZ0Mik7Ci0gIHNiX25ldygmYWNjKTsKLSAgc2JfbmV3ICgmbGFiZWxfaW4pOwotICBzYl9yZXNldCAoJmxpbmUpOwotICBtb3JlID0gZ2V0X2xpbmUgKCZsaW5lKTsKLSAgd2hpbGUgKG1vcmUpCi0gICAgewotICAgICAgLyogRmluZCBhbnkgbGFiZWwgYW5kIHBzZXVkbyBvcCB0aGF0IHdlJ3JlIGludGVzdGVkIGluICovCi0gICAgICBpbnQgbDsKLSAgICAgIGlmIChsaW5lLmxlbiA9PSAwKQotCXsKLQkgIGlmIChjb25kYXNzX29uICgpKQotCSAgICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtcmkKLQkgICAgICAgJiYgKGxpbmUucHRyWzBdID09ICcqJwotCQkgICB8fCBsaW5lLnB0clswXSA9PSAnIScpKQotCXsKLQkgIC8qIE1SSSBsaW5lIGNvbW1lbnQuICAqLwotCSAgZnByaW50ZiAob3V0ZmlsZSwgIiVzIiwgc2JfbmFtZSAoJmxpbmUpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbCA9IGdyYWJfbGFiZWwgKCZsaW5lLCAmbGFiZWxfaW4pOwotCSAgc2JfcmVzZXQgKCZsYWJlbCk7CSAgCSAgCi0KLQkgIGlmIChsaW5lLnB0cltsXSA9PSAnOicpCi0JICAgIGwrKzsKLQkgIHdoaWxlIChJU1dISVRFIChsaW5lLnB0cltsXSkgJiYgbCA8IGxpbmUubGVuKQotCSAgICBsKys7Ci0KLQkgIGlmIChsYWJlbF9pbi5sZW4pCi0JICAgIHsKLQkgICAgICBpbnQgZG9fYXNzaWduczsKLQotCSAgICAgIC8qIE11bmdlIHRoZSBsYWJlbCwgdW5sZXNzIHRoaXMgaXMgRVFVIG9yIEFTU0lHTi4gICovCi0JICAgICAgZG9fYXNzaWducyA9IDE7Ci0JICAgICAgaWYgKGwgPCBsaW5lLmxlbgotCQkgICYmIChsaW5lLnB0cltsXSA9PSAnLicgfHwgYWx0ZXJuYXRlIHx8IG1yaSkpCi0JCXsKLQkJICBpbnQgbHggPSBsOwotCi0JCSAgaWYgKGxpbmUucHRyW2x4XSA9PSAnLicpCi0JCSAgICArK2x4OwotCQkgIGlmIChseCArIDMgPD0gbGluZS5sZW4KLQkJICAgICAgJiYgc3RybmNhc2VjbXAgKCJFUVUiLCBsaW5lLnB0ciArIGx4LCAzKSA9PSAwCi0JCSAgICAgICYmIChseCArIDMgPT0gbGluZS5sZW4KLQkJCSAgfHwgISBJU0ZJUlNUQ0hBUiAobGluZS5wdHJbbHggKyAzXSkpKQotCQkgICAgZG9fYXNzaWducyA9IDA7Ci0JCSAgZWxzZSBpZiAobHggKyA2IDw9IGxpbmUubGVuCi0JCQkgICAmJiBzdHJuY2FzZWNtcCAoIkFTU0lHTiIsIGxpbmUucHRyICsgbHgsIDYpID09IDAKLQkJCSAgICYmIChseCArIDYgPT0gbGluZS5sZW4KLQkJCSAgICAgICB8fCAhIElTRklSU1RDSEFSIChsaW5lLnB0cltseCArIDZdKSkpCi0JCSAgICBkb19hc3NpZ25zID0gMDsKLQkJfQotCi0JICAgICAgaWYgKGRvX2Fzc2lnbnMpCi0JCXByb2Nlc3NfYXNzaWducyAoMCwgJmxhYmVsX2luLCAmbGFiZWwpOwotCSAgICAgIGVsc2UKLQkJc2JfYWRkX3NiICgmbGFiZWwsICZsYWJlbF9pbik7Ci0JICAgIH0KLQotCSAgaWYgKGwgPCBsaW5lLmxlbikKLQkgICAgewotCSAgICAgIGlmIChwcm9jZXNzX3BzZXVkb19vcCAobCwgJmxpbmUsICZhY2MpKQotCQl7Ci0KLQotCi0JCX0KLQkgICAgICBlbHNlIGlmIChjb25kYXNzX29uICgpKQotCQl7Ci0JCSAgaWYgKG1hY3JvX29wIChsLCAmbGluZSkpCi0JCSAgICB7Ci0KLQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgewotCQkJaWYgKGxhYmVsLmxlbikKLQkJCSAgewotCQkJICAgIGZwcmludGYgKG91dGZpbGUsICIlczpcdCIsIHNiX25hbWUgKCZsYWJlbCkpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIGZwcmludGYgKG91dGZpbGUsICJcdCIpOwotCQkJc2JfcmVzZXQoJnQxKTsKLQkJCXByb2Nlc3NfYXNzaWducyAobCwgJmxpbmUsICZ0MSk7Ci0JCQlzYl9yZXNldCAoJnQyKTsKLQkJCWNoYW5nZV9iYXNlICgwLCAmdDEsICZ0Mik7Ci0JCQlmcHJpbnRmIChvdXRmaWxlLCAiJXNcbiIsIHNiX25hbWUgKCZ0MikpOwotCQkgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZSB7Ci0JICAgIC8qIE9ubHkgYSBsYWJlbCBvbiB0aGlzIGxpbmUgKi8KLQkgICAgaWYgKGxhYmVsLmxlbiAmJiBjb25kYXNzX29uKCkpCi0JICAgICAgewotCQlmcHJpbnRmIChvdXRmaWxlLCAiJXM6XG4iLCBzYl9uYW1lICgmbGFiZWwpKTsKLQkgICAgICB9Ci0JICB9Ci0JfQotCi0gICAgICBpZiAoaGFkX2VuZCkKLQlicmVhazsKLSAgICAgIHNiX3Jlc2V0ICgmbGluZSk7Ci0gICAgICBtb3JlID0gZ2V0X2xpbmUgKCZsaW5lKTsKLSAgICB9Ci0KLSAgaWYgKCFoYWRfZW5kICYmICFtcmkpCi0gICAgV0FSTklORyAoKHN0ZGVyciwgXygiRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS5cbiIpKSk7Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQKLWZyZWVfb2xkX2VudHJ5IChwdHIpCi0gICAgIGhhc2hfZW50cnkgKnB0cjsKLXsKLSAgaWYgKHB0cikKLSAgICB7Ci0gICAgICBpZiAocHRyLT50eXBlID09IGhhc2hfc3RyaW5nKQotCXNiX2tpbGwoJnB0ci0+dmFsdWUucyk7Ci0gICAgfQotfQotCi0vKiBuYW1lOiAuQVNTSUdOQSA8dmFsdWU+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19hc3NpZ25hIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIHNiIHRtcDsKLSAgaW50IHZhbDsKLSAgc2JfbmV3ICgmdG1wKTsKLQotICBwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sICZ0bXApOwotICBpZHggPSBleHBfZ2V0X2FicyAoXygiLkFTU0lHTkEgbmVlZHMgY29uc3RhbnQgZXhwcmVzc2lvbiBhcmd1bWVudC5cbiIpLCAwLCAmdG1wLCAmdmFsKTsKLQotICBpZiAoIWxhYmVsLmxlbikKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiLkFTU0lHTkEgd2l0aG91dCBsYWJlbC5cbiIpKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGFzaF9lbnRyeSAqcHRyID0gaGFzaF9jcmVhdGUgKCZ2YXJzLCAmbGFiZWwpOwotICAgICAgZnJlZV9vbGRfZW50cnkgKHB0cik7Ci0gICAgICBwdHItPnR5cGUgPSBoYXNoX2ludGVnZXI7Ci0gICAgICBwdHItPnZhbHVlLmkgPSB2YWw7Ci0gICAgfQotICBzYl9raWxsICgmdG1wKTsKLX0KLQotLyogbmFtZTogLkFTU0lHTkMgPHN0cmluZz4gKi8KLQotc3RhdGljIHZvaWQKLWRvX2Fzc2lnbmMgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2MpOwotCi0gIGlmICghbGFiZWwubGVuKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCIuQVNTSUdOUyB3aXRob3V0IGxhYmVsLlxuIikpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAoJnZhcnMsICZsYWJlbCk7Ci0gICAgICBmcmVlX29sZF9lbnRyeSAocHRyKTsKLSAgICAgIHB0ci0+dHlwZSA9IGhhc2hfc3RyaW5nOwotICAgICAgc2JfbmV3ICgmcHRyLT52YWx1ZS5zKTsKLSAgICAgIHNiX2FkZF9zYiAoJnB0ci0+dmFsdWUucywgJmFjYyk7Ci0gICAgfQotICBzYl9raWxsICgmYWNjKTsKLX0KLQotCi0vKiBuYW1lOiAuUkVHIChyZWcpICovCi0KLXN0YXRpYyB2b2lkCi1kb19yZWcgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgLyogcmVtb3ZlIHJlZyBzdHVmZiBmcm9tIGluc2lkZSBwYXJlbnMgKi8KLSAgc2Igd2hhdDsKLSAgaWYgKCFtcmkpCi0gICAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGVsc2UKLSAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgc2JfbmV3ICgmd2hhdCk7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JICYmIChtcmkKLQkgICAgID8gISBlb2wgKGlkeCwgaW4pCi0JICAgICA6IGluLT5wdHJbaWR4XSAhPSAnKScpKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyICgmd2hhdCwgaW4tPnB0cltpZHhdKTsKLSAgICAgIGlkeCsrOwotICAgIH0KLSAgaGFzaF9hZGRfdG9fc3RyaW5nX3RhYmxlICgmYXNzaWduX2hhc2hfdGFibGUsICZsYWJlbCwgJndoYXQsIDEpOwotICBzYl9raWxsICgmd2hhdCk7Ci19Ci0KLQotc3RhdGljIGludAotY29uZGFzc19sb29rdXBfbmFtZSAoaW5idWYsIGlkeCwgb3V0LCB3YXJuKQotICAgICBzYiAqaW5idWY7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCB3YXJuOwotewotICBoYXNoX2VudHJ5ICpwdHI7Ci0gIHNiIGNvbmRhc3NfYWNjOwotICBzYl9uZXcgKCZjb25kYXNzX2FjYyk7Ci0KLSAgd2hpbGUgKGlkeCA8IGluYnVmLT5sZW4KLQkgJiYgSVNORVhUQ0hBUiAoaW5idWYtPnB0cltpZHhdKSkKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAoJmNvbmRhc3NfYWNjLCBpbmJ1Zi0+cHRyW2lkeCsrXSk7Ci0gICAgfQotCi0gIGlmIChpbmJ1Zi0+cHRyW2lkeF0gPT0gJ1wnJykKLSAgICBpZHgrKzsKLSAgcHRyID0gaGFzaF9sb29rdXAgKCZ2YXJzLCAmY29uZGFzc19hY2MpOwotCi0KLSAgaWYgKCFwdHIpCi0gICAgewotICAgICAgaWYgKHdhcm4pIAotCXsKLQkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIkNhbid0IGZpbmQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlICVzLlxuIiksIHNiX25hbWUgKCZjb25kYXNzX2FjYykpKTsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgIjAiKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHB0ci0+dHlwZSA9PSBoYXNoX2ludGVnZXIpCi0JewotCSAgY2hhciBidWZmZXJbMzBdOwotCSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBwdHItPnZhbHVlLmkpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfc2IgKG91dCwgJnB0ci0+dmFsdWUucyk7Ci0JfQotICAgIH0KLSAgc2Jfa2lsbCAoJmNvbmRhc3NfYWNjKTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotI2RlZmluZSBFUSAxCi0jZGVmaW5lIE5FIDIKLSNkZWZpbmUgR0UgMwotI2RlZmluZSBMVCA0Ci0jZGVmaW5lIExFIDUKLSNkZWZpbmUgR1QgNgotI2RlZmluZSBORVZFUiA3Ci0KLXN0YXRpYyBpbnQKLXdoYXRjb25kIChpZHgsIGluLCB2YWwpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50ICp2YWw7Ci17Ci0gIGludCBjb25kOwotCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICBjb25kID0gTkVWRVI7Ci0gIGlmIChpZHggKyAxIDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciBhLCBiOwotCi0gICAgICBwID0gaW4tPnB0ciArIGlkeDsKLSAgICAgIGEgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgcFswXSk7Ci0gICAgICBiID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIHBbMV0pOwotICAgICAgaWYgKGEgPT0gJ0UnICYmIGIgPT0gJ1EnKQotCWNvbmQgPSBFUTsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ04nICYmIGIgPT0gJ0UnKQotCWNvbmQgPSBORTsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0wnICYmIGIgPT0gJ1QnKQotCWNvbmQgPSBMVDsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0wnICYmIGIgPT0gJ0UnKQotCWNvbmQgPSBMRTsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0cnICYmIGIgPT0gJ1QnKQotCWNvbmQgPSBHVDsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0cnICYmIGIgPT0gJ0UnKQotCWNvbmQgPSBHRTsKLSAgICB9Ci0gIGlmIChjb25kID09IE5FVkVSKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJDb21wYXJpc29uIG9wZXJhdG9yIG11c3QgYmUgb25lIG9mIEVRLCBORSwgTFQsIExFLCBHVCBvciBHRS5cbiIpKSk7Ci0gICAgICBjb25kID0gTkVWRVI7Ci0gICAgfQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHggKyAyLCBpbik7Ci0gICp2YWwgPSBjb25kOwotICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW50Ci1pc3RydWUgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IHJlczsKLSAgc2IgYWNjX2E7Ci0gIHNiIGNvbmQ7Ci0gIHNiIGFjY19iOwotICBzYl9uZXcgKCZhY2NfYSk7Ci0gIHNiX25ldyAoJmNvbmQpOwotICBzYl9uZXcgKCZhY2NfYik7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQotICAgIHsKLSAgICAgIGludCBjb25kOwotICAgICAgaW50IHNhbWU7Ci0gICAgICAvKiBUaGlzIGlzIGEgc3RyaW5nIGNvbXBhcmlzaW9uICovCi0gICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2NfYSk7Ci0gICAgICBpZHggPSB3aGF0Y29uZCAoaWR4LCBpbiwgJmNvbmQpOwotICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjX2IpOwotICAgICAgc2FtZSA9IGFjY19hLmxlbiA9PSBhY2NfYi5sZW4gJiYgKHN0cm5jbXAgKGFjY19hLnB0ciwgYWNjX2IucHRyLCBhY2NfYS5sZW4pID09IDApOwotCi0gICAgICBpZiAoY29uZCAhPSBFUSAmJiBjb25kICE9IE5FKQotCXsKLQkgIEVSUk9SICgoc3RkZXJyLCBfKCJDb21wYXJpc29uIG9wZXJhdG9yIGZvciBzdHJpbmdzIG11c3QgYmUgRVEgb3IgTkVcbiIpKSk7Ci0JICByZXMgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlyZXMgPSAoY29uZCAhPSBFUSkgXiBzYW1lOwotICAgIH0KLSAgZWxzZQotICAgIC8qIFRoaXMgaXMgYSBudW1lcmljIGV4cHJlc3Npb24gKi8KLSAgICB7Ci0gICAgICBpbnQgdmFsYTsKLSAgICAgIGludCB2YWxiOwotICAgICAgaW50IGNvbmQ7Ci0gICAgICBpZHggPSBleHBfZ2V0X2FicyAoXygiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIiksIGlkeCwgaW4sICZ2YWxhKTsKLSAgICAgIGlkeCA9IHdoYXRjb25kIChpZHgsIGluLCAmY29uZCk7Ci0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQotCXsKLQkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIlN0cmluZyBjb21wYXJlZCBhZ2FpbnN0IGV4cHJlc3Npb24uXG4iKSkpOwotCSAgcmVzID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkNvbmRpdGlvbmFsIG9wZXJhdG9yIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kcy5cbiIpLCBpZHgsIGluLCAmdmFsYik7Ci0JICBzd2l0Y2ggKGNvbmQpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXMgPSA0MjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBFUToKLQkgICAgICByZXMgPSB2YWxhID09IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTkU6Ci0JICAgICAgcmVzID0gdmFsYSAhPSB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIExUOgotCSAgICAgIHJlcyA9IHZhbGEgPCB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIExFOgotCSAgICAgIHJlcyA9IHZhbGEgPD0gdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBHVDoKLQkgICAgICByZXMgPSB2YWxhID4gdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBHRToKLQkgICAgICByZXMgPSB2YWxhID49IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTkVWRVI6Ci0JICAgICAgcmVzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc2Jfa2lsbCAoJmFjY19hKTsKLSAgc2Jfa2lsbCAoJmNvbmQpOwotICBzYl9raWxsICgmYWNjX2IpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiAuQUlGICovCi1zdGF0aWMgdm9pZAotZG9fYWlmIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGlmIChpZmkgPj0gSUZORVNUSU5HKQotICAgIHsKLSAgICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOwotICAgIH0KLSAgaWZpKys7Ci0gIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gaXN0cnVlIChpZHgsIGluKSA6IDA7Ci0gIGlmc3RhY2tbaWZpXS5oYWRlbHNlID0gMDsKLX0KLQotCi0vKiAuQUVMU0UgKi8KLXN0YXRpYyB2b2lkCi1kb19hZWxzZSAoKQotewotICBpZnN0YWNrW2lmaV0ub24gPSBpZnN0YWNrW2lmaS0xXS5vbiA/ICFpZnN0YWNrW2lmaV0ub24gOiAwOwotICBpZiAoaWZzdGFja1tpZmldLmhhZGVsc2UpCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oIk11bHRpcGxlIEFFTFNFcyBpbiBBSUYuXG4iKSkpOwotICAgIH0KLSAgaWZzdGFja1tpZmldLmhhZGVsc2UgPSAxOwotfQotCi0KLS8qIC5BRU5ESSAqLwotc3RhdGljIHZvaWQKLWRvX2FlbmRpICgpCi17Ci0gIGlmIChpZmkgIT0gMCkKLSAgICB7Ci0gICAgICBpZmktLTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiQUVOREkgd2l0aG91dCBBSUYuXG4iKSkpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotY29uZGFzc19vbiAoKQotewotICByZXR1cm4gaWZzdGFja1tpZmldLm9uOwotfQotCi0vKiBNUkkgSUZFUSwgSUZORSwgSUZMVCwgSUZMRSwgSUZHRSwgSUZHVC4gICovCi0KLXN0YXRpYyB2b2lkCi1kb19pZiAoaWR4LCBpbiwgY29uZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgY29uZDsKLXsKLSAgaW50IHZhbDsKLSAgaW50IHJlczsKLQotICBpZiAoaWZpID49IElGTkVTVElORykKLSAgICB7Ci0gICAgICBGQVRBTCAoKHN0ZGVyciwgXygiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOwotICAgIH0KLQotICBpZHggPSBleHBfZ2V0X2FicyAoXygiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIiksCi0JCSAgICAgaWR4LCBpbiwgJnZhbCk7Ci0gIHN3aXRjaCAoY29uZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVROiByZXMgPSB2YWwgPT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBORTogcmVzID0gdmFsICE9IDA7IGJyZWFrOwotICAgIGNhc2UgTFQ6IHJlcyA9IHZhbCA8ICAwOyBicmVhazsKLSAgICBjYXNlIExFOiByZXMgPSB2YWwgPD0gMDsgYnJlYWs7Ci0gICAgY2FzZSBHRTogcmVzID0gdmFsID49IDA7IGJyZWFrOwotICAgIGNhc2UgR1Q6IHJlcyA9IHZhbCA+ICAwOyBicmVhazsKLSAgICB9Ci0KLSAgaWZpKys7Ci0gIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gcmVzOiAwOwotICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDA7Ci19Ci0KLS8qIEdldCBhIHN0cmluZyBmb3IgdGhlIE1SSSBJRkMgb3IgSUZOQyBwc2V1ZG8tb3BzLiAgKi8KLQotc3RhdGljIGludAotZ2V0X21yaV9zdHJpbmcgKGlkeCwgaW4sIHZhbCwgdGVybWluYXRvcikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqdmFsOwotICAgICBpbnQgdGVybWluYXRvcjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgaWYgKGlkeCA8IGluLT5sZW4KLSAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnXCcnKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyICh2YWwsICdcJycpOwotICAgICAgZm9yICgrK2lkeDsgaWR4IDwgaW4tPmxlbjsgKytpZHgpCi0JewotCSAgc2JfYWRkX2NoYXIgKHZhbCwgaW4tPnB0cltpZHhdKTsKLQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQkgICAgewotCSAgICAgICsraWR4OwotCSAgICAgIGlmIChpZHggPj0gaW4tPmxlbgotCQkgIHx8IGluLT5wdHJbaWR4XSAhPSAnXCcnKQotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAgICAgJiYgaW4tPnB0cltpZHhdICE9IHRlcm1pbmF0b3IpCi0JewotCSAgc2JfYWRkX2NoYXIgKHZhbCwgaW4tPnB0cltpZHhdKTsKLQkgICsraWR4OwotCX0KLSAgICAgIGkgPSB2YWwtPmxlbiAtIDE7Ci0gICAgICB3aGlsZSAoaSA+PSAwICYmIElTV0hJVEUgKHZhbC0+cHRyW2ldKSkKLQktLWk7Ci0gICAgICB2YWwtPmxlbiA9IGkgKyAxOwotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBNUkkgSUZDLCBJRk5DLiAgKi8KLQotc3RhdGljIHZvaWQKLWRvX2lmYyAoaWR4LCBpbiwgaWZuYykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgaWZuYzsKLXsKLSAgc2IgZmlyc3Q7Ci0gIHNiIHNlY29uZDsKLSAgaW50IHJlczsKLQotICBpZiAoaWZpID49IElGTkVTVElORykKLSAgICB7Ci0gICAgICBGQVRBTCAoKHN0ZGVyciwgXygiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOwotICAgIH0KLQotICBzYl9uZXcgKCZmaXJzdCk7Ci0gIHNiX25ldyAoJnNlY29uZCk7Ci0KLSAgaWR4ID0gZ2V0X21yaV9zdHJpbmcgKGlkeCwgaW4sICZmaXJzdCwgJywnKTsKLQotICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdICE9ICcsJykKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiQmFkIGZvcm1hdCBmb3IgSUYgb3IgSUZOQy5cbiIpKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlkeCA9IGdldF9tcmlfc3RyaW5nIChpZHggKyAxLCBpbiwgJnNlY29uZCwgJzsnKTsKLQotICByZXMgPSAoZmlyc3QubGVuID09IHNlY29uZC5sZW4KLQkgJiYgc3RybmNtcCAoZmlyc3QucHRyLCBzZWNvbmQucHRyLCBmaXJzdC5sZW4pID09IDApOwotICByZXMgXj0gaWZuYzsKLQotICBpZmkrKzsKLSAgaWZzdGFja1tpZmldLm9uID0gaWZzdGFja1tpZmktMV0ub24gPyByZXMgOiAwOwotICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDA7Ci19Ci0KLS8qIC5FTkRSICovCi1zdGF0aWMgdm9pZAotZG9fYWVuZHIgKCkKLXsKLSAgaWYgKCFtcmkpCi0gICAgRVJST1IgKChzdGRlcnIsIF8oIkFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULlxuIikpKTsKLSAgZWxzZQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJFTkRSIHdpdGhvdXQgYSBSRVBULlxuIikpKTsKLX0KLQotLyogLkFXSElMRSAqLwotCi1zdGF0aWMKLXZvaWQKLWRvX2F3aGlsZSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgbGluZSA9IGxpbmVjb3VudCAoKTsKLSAgc2IgZXhwOwotICBzYiBzdWI7Ci0gIGludCBkb2l0OwotCi0gIHNiX25ldyAoJnN1Yik7Ci0gIHNiX25ldyAoJmV4cCk7Ci0KLSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmZXhwKTsKLSAgZG9pdCA9IGlzdHJ1ZSAoMCwgJmV4cCk7Ci0KLSAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0ICgiQVdISUxFIiwgIkFFTkRXIiwgJnN1YiwgZ2V0X2xpbmUpKQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBV0hJTEUgd2l0aG91dCBhIEFFTkRXIGF0ICVkLlxuIiksIGxpbmUgLSAxKSk7Ci0KLSAgLyogVHVybgotICAgICAJLkFXSElMRSBleHAKLQkgICAgIGZvbwotCS5BRU5EVwotICAgICBpbnRvCi0gICAgICAgIGZvbwotCS5BV0hJTEUgZXhwCi0JZm9vCi0JLkVORFcKLSAgICovCi0KLSAgaWYgKGRvaXQpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gaW5jbHVkZV9uZXh0X2luZGV4ICgpOwotCi0gICAgICBzYiBjb3B5OwotICAgICAgc2JfbmV3ICgmY29weSk7Ci0gICAgICBzYl9hZGRfc2IgKCZjb3B5LCAmc3ViKTsKLSAgICAgIHNiX2FkZF9zYiAoJmNvcHksIGluKTsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiXG4iKTsKLSAgICAgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOwotICAgICAgc2JfYWRkX3N0cmluZyAoJmNvcHksICJcdC5BRU5EV1xuIik7Ci0gICAgICAvKiBQdXNoIGFub3RoZXIgV0hJTEUgKi8KLSAgICAgIGluY2x1ZGVfYnVmICgmZXhwLCAmY29weSwgaW5jbHVkZV93aGlsZSwgaW5kZXgpOwotICAgICAgc2Jfa2lsbCAoJmNvcHkpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmV4cCk7Ci0gIHNiX2tpbGwgKCZzdWIpOwotfQotCi0KLS8qIC5BRU5EVyAqLwotCi1zdGF0aWMgdm9pZAotZG9fYWVuZHcgKCkKLXsKLSAgRVJST1IgKChzdGRlcnIsIF8oIkFFTkRXIHdpdGhvdXQgYSBBRU5EVy5cbiIpKSk7Ci19Ci0KLQotLyogLkVYSVRNCi0gICAKLSAgIFBvcCB0aGluZ3Mgb2ZmIHRoZSBpbmNsdWRlIHN0YWNrIHVudGlsIHRoZSB0eXBlIGFuZCBpbmRleCBjaGFuZ2VzICovCi0KLXN0YXRpYyB2b2lkCi1kb19leGl0bSAoKQotewotICBpbmNsdWRlX3R5cGUgdHlwZSA9IHNwLT50eXBlOwotICBpZiAodHlwZSA9PSBpbmNsdWRlX3JlcGVhdAotICAgICAgfHwgdHlwZSA9PSBpbmNsdWRlX3doaWxlCi0gICAgICB8fCB0eXBlID09IGluY2x1ZGVfbWFjcm8pCi0gICAgewotICAgICAgaW50IGluZGV4ID0gc3AtPmluZGV4OwotICAgICAgaW5jbHVkZV9wb3AgKCk7Ci0gICAgICB3aGlsZSAoc3AtPmluZGV4ID09IGluZGV4Ci0JICAgICAmJiBzcC0+dHlwZSA9PSB0eXBlKQotCXsKLQkgIGluY2x1ZGVfcG9wICgpOwotCX0KLSAgICB9Ci19Ci0KLS8qIC5BUkVQRUFUICovCi0KLXN0YXRpYyB2b2lkCi1kb19hcmVwZWF0IChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBsaW5lID0gbGluZWNvdW50ICgpOwotICBzYiBleHA7CQkJLyogYnVmZmVyIHdpdGggZXhwcmVzc2lvbiBpbiBpdCAqLwotICBzYiBjb3B5OwkJCS8qIGV4cGFuZGVkIHJlcGVhdCBibG9jayAqLwotICBzYiBzdWI7CQkJLyogY29udGVudHMgb2YgQVJFUEVBVCAqLwotICBpbnQgcmM7Ci0gIGludCByZXQ7Ci0gIGNoYXIgYnVmZmVyWzMwXTsKLQotICBzYl9uZXcgKCZleHApOwotICBzYl9uZXcgKCZjb3B5KTsKLSAgc2JfbmV3ICgmc3ViKTsKLSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmZXhwKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkFSRVBFQVQgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmQuXG4iKSwgMCwgJmV4cCwgJnJjKTsKLSAgaWYgKCFtcmkpCi0gICAgcmV0ID0gYnVmZmVyX2FuZF9uZXN0ICgiQVJFUEVBVCIsICJBRU5EUiIsICZzdWIsIGdldF9saW5lKTsKLSAgZWxzZQotICAgIHJldCA9IGJ1ZmZlcl9hbmRfbmVzdCAoIlJFUFQiLCAiRU5EUiIsICZzdWIsIGdldF9saW5lKTsKLSAgaWYgKCEgcmV0KQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBUkVQRUFUIHdpdGhvdXQgYSBBRU5EUiBhdCAlZC5cbiIpLCBsaW5lIC0gMSkpOwotICBpZiAocmMgPiAwKQotICAgIHsKLSAgICAgIC8qIFB1c2ggYmFjayB0aGUgdGV4dCBmb2xsb3dpbmcgdGhlIHJlcGVhdCwgYW5kIGFub3RoZXIgcmVwZWF0IGJsb2NrCi0JIHNvCi0JIC5BUkVQRUFUIDIwCi0JIGZvbwotCSAuQUVORFIKLQkgZ2V0cyB0dXJuZWQgaW50bwotCSBmb28KLQkgLkFSRVBFQVQgMTkKLQkgZm9vCi0JIC5BRU5EUgotCSAqLwotICAgICAgaW50IGluZGV4ID0gaW5jbHVkZV9uZXh0X2luZGV4ICgpOwotICAgICAgc2JfYWRkX3NiICgmY29weSwgJnN1Yik7Ci0gICAgICBpZiAocmMgPiAxKQotCXsKLQkgIGlmICghbXJpKQotCSAgICBzcHJpbnRmIChidWZmZXIsICJcdC5BUkVQRUFUCSVkXG4iLCByYyAtIDEpOwotCSAgZWxzZQotCSAgICBzcHJpbnRmIChidWZmZXIsICJcdFJFUFQJJWRcbiIsIHJjIC0gMSk7Ci0JICBzYl9hZGRfc3RyaW5nICgmY29weSwgYnVmZmVyKTsKLQkgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOwotCSAgaWYgKCFtcmkpCi0JICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCS5BRU5EUlxuIik7Ci0JICBlbHNlCi0JICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCUVORFJcbiIpOwotCX0KLQotICAgICAgaW5jbHVkZV9idWYgKCZleHAsICZjb3B5LCBpbmNsdWRlX3JlcGVhdCwgaW5kZXgpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmV4cCk7Ci0gIHNiX2tpbGwgKCZzdWIpOwotICBzYl9raWxsICgmY29weSk7Ci19Ci0KLS8qIC5FTkRNICovCi0KLXN0YXRpYyB2b2lkCi1kb19lbmRtICgpCi17Ci0gIEVSUk9SICgoc3RkZXJyLCBfKCIuRU5ETSB3aXRob3V0IGEgbWF0Y2hpbmcgLk1BQ1JPLlxuIikpKTsKLX0KLQotLyogTVJJIElSUCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotZG9faXJwIChpZHgsIGluLCBpcnBjKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCBpcnBjOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIHNiIG91dDsKLQotICBzYl9uZXcgKCZvdXQpOwotCi0gIGVyciA9IGV4cGFuZF9pcnAgKGlycGMsIGlkeCwgaW4sICZvdXQsIGdldF9saW5lLCBjb21tZW50X2NoYXIpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsICIlc1xuIiwgZXJyKSk7Ci0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIiVzIiwgc2JfdGVybWluYXRlICgmb3V0KSk7Ci0KLSAgc2Jfa2lsbCAoJm91dCk7Ci19Ci0KLS8qIE1BQ1JPIFBST0NFU1NJTkcgKi8KLQotLyogUGFyc2Ugb2ZmIExPQ0FMIG4xLCBuMiwuLi4gSW52ZW50IGEgbGFiZWwgbmFtZSBmb3IgaXQgKi8KLXN0YXRpYwotdm9pZCAKLWRvX2xvY2FsIChpZHgsIGxpbmUpCi0gICAgIGludCBpZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2IgKmxpbmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgRVJST1IgKChzdGRlcnIsIF8oIkxPQ0FMIG91dHNpZGUgb2YgTUFDUk8iKSkpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbWFjcm8gKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgY29uc3QgY2hhciAqZXJyOwotICBpbnQgbGluZSA9IGxpbmVjb3VudCAoKTsKLQotICBlcnIgPSBkZWZpbmVfbWFjcm8gKGlkeCwgaW4sICZsYWJlbCwgZ2V0X2xpbmUsIChjb25zdCBjaGFyICoqKSBOVUxMKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtYWNybyBhdCBsaW5lICVkOiAlc1xuIiksIGxpbmUgLSAxLCBlcnIpKTsKLX0KLQotc3RhdGljIGludAotbWFjcm9fb3AgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgY29uc3QgY2hhciAqZXJyOwotICBzYiBvdXQ7Ci0gIHNiIG5hbWU7Ci0KLSAgaWYgKCEgbWFjcm9fZGVmaW5lZCkKLSAgICByZXR1cm4gMDsKLQotICBzYl90ZXJtaW5hdGUgKGluKTsKLSAgaWYgKCEgY2hlY2tfbWFjcm8gKGluLT5wdHIgKyBpZHgsICZvdXQsIGNvbW1lbnRfY2hhciwgJmVyciwgTlVMTCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIEVSUk9SICgoc3RkZXJyLCAiJXNcbiIsIGVycikpOwotCi0gIHNiX25ldyAoJm5hbWUpOwotICBzYl9hZGRfc3RyaW5nICgmbmFtZSwgXygibWFjcm8gZXhwYW5zaW9uIikpOwotCi0gIGluY2x1ZGVfYnVmICgmbmFtZSwgJm91dCwgaW5jbHVkZV9tYWNybywgaW5jbHVkZV9uZXh0X2luZGV4ICgpKTsKLQotICBzYl9raWxsICgmbmFtZSk7Ci0gIHNiX2tpbGwgKCZvdXQpOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBTVFJJTkcgSEFORExJTkcgKi8KLQotc3RhdGljIGludAotZ2V0c3RyaW5nIChpZHgsIGluLCBhY2MpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKmFjYzsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkgJiYgKGluLT5wdHJbaWR4XSA9PSAnIicgCi0JICAgICB8fCBpbi0+cHRyW2lkeF0gPT0gJzwnIAotCSAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnXCcnICYmIGFsdGVybmF0ZSkpKQotICAgIHsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCXsKLQkgIGlmIChhbHRlcm5hdGUgfHwgbXJpKQotCSAgICB7Ci0JICAgICAgaW50IG5lc3QgPSAwOwotCSAgICAgIGlkeCsrOwotCSAgICAgIHdoaWxlICgoaW4tPnB0cltpZHhdICE9ICc+JyB8fCBuZXN0KQotCQkgICAgICYmIGlkeCA8IGluLT5sZW4pCi0JCXsKLQkJICBpZiAoaW4tPnB0cltpZHhdID09ICchJykKLQkJICAgIHsKLQkJICAgICAgaWR4KysgIDsKLQkJICAgICAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOwotCQkgICAgfQotCQkgIGVsc2UgewotCQkgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPicpCi0JCSAgICAgIG5lc3QtLTsKLQkJICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCQkgICAgICBuZXN0Kys7Ci0JCSAgICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCSAgfQotCQl9Ci0JICAgICAgaWR4Kys7Ci0JICAgIH0KLQkgIGVsc2UgewotCSAgICBpbnQgY29kZTsKLQkgICAgaWR4Kys7Ci0JICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJDaGFyYWN0ZXIgY29kZSBpbiBzdHJpbmcgbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9uLlxuIiksCi0JCQkgICAgICAgaWR4LCBpbiwgJmNvZGUpOwotCSAgICBzYl9hZGRfY2hhciAoYWNjLCBjb2RlKTsKLQotCSAgICBpZiAoaW4tPnB0cltpZHhdICE9ICc+JykKLQkgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiTWlzc2luZyA+IGZvciBjaGFyYWN0ZXIgY29kZS5cbiIpKSk7Ci0JICAgIGlkeCsrOwotCSAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JewotCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKLQkgIGlkeCsrOwotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4pCi0JICAgIHsKLQkgICAgICBpZiAoYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSA9PSAnIScpCi0JCXsKLQkJICBpZHgrKyAgOwotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJfQotCSAgICAgIGVsc2UgewotCQlpZiAoaW4tPnB0cltpZHhdID09IHRjaGFyKQotCQkgIHsKLQkJICAgIGlkeCsrOwotCQkgICAgaWYgKGlkeCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkJICAgICAgYnJlYWs7Ci0JCSAgfQotCQlzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeF0pOwotCQlpZHgrKzsKLQkgICAgICB9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogLlNEQVRBW0N8Wl0gPHN0cmluZz4gKi8KLQotc3RhdGljCi12b2lkCi1kb19zZGF0YSAoaWR4LCBpbiwgdHlwZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IG5jID0gMDsKLSAgaW50IHBpZHggPSAtMTsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiLmJ5dGVcdCIpOwotCi0gIHdoaWxlICghZW9sIChpZHgsIGluKSkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHNiX3Jlc2V0ICgmYWNjKTsKLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgICAgd2hpbGUgKCFlb2wgKGlkeCwgaW4pKQotCXsKLQkgIHBpZHggPSBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgJmFjYywgMCwgMSk7Ci0JICBpZiAodHlwZSA9PSAnYycpCi0JICAgIHsKLQkgICAgICBpZiAoYWNjLmxlbiA+IDI1NSkKLQkJewotCQkgIEVSUk9SICgoc3RkZXJyLCBfKCJzdHJpbmcgZm9yIFNEQVRBQyBsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyAoJWQpLlxuIiksIGFjYy5sZW4pKTsKLQkJfQotCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlZCIsIGFjYy5sZW4pOwotCSAgICAgIG5jID0gMTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYWNjLmxlbjsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKG5jKQotCQl7Ci0JCSAgZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQkJfQotCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlZCIsIGFjYy5wdHJbaV0pOwotCSAgICAgIG5jID0gMTsKLQkgICAgfQotCi0JICBpZiAodHlwZSA9PSAneicpCi0JICAgIHsKLQkgICAgICBpZiAobmMpCi0JCWZwcmludGYgKG91dGZpbGUsICIsIik7Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIjAiKTsKLQkgICAgfQotCSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0JICBpZiAoaWR4ID09IHBpZHgpIGJyZWFrOwotCX0KLSAgICAgIGlmICghYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSAhPSAnLCcgJiYgaWR4ICE9IGluLT5sZW4pCi0JewotCSAgZnByaW50ZiAob3V0ZmlsZSwgIlxuIik7Ci0JICBFUlJPUiAoKHN0ZGVyciwgXygiaWxsZWdhbCBjaGFyYWN0ZXIgaW4gU0RBVEEgbGluZSAoMHgleCkuXG4iKSwgaW4tPnB0cltpZHhdKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZHgrKzsKLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLX0KLQotLyogLlNEQVRBQiA8Y291bnQ+IDxzdHJpbmc+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19zZGF0YWIgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IHJlcGVhdDsKLSAgaW50IGk7Ci0gIHNiIGFjYzsKLSAgc2JfbmV3ICgmYWNjKTsKLQotICBpZHggPSBleHBfZ2V0X2FicyAoXygiTXVzdCBoYXZlIGFic29sdXRlIFNEQVRBQiByZXBlYXQgY291bnQuXG4iKSwgaWR4LCBpbiwgJnJlcGVhdCk7Ci0gIGlmIChyZXBlYXQgPD0gMCkKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiTXVzdCBoYXZlIHBvc2l0aXZlIFNEQVRBQiByZXBlYXQgY291bnQgKCVkKS5cbiIpLCByZXBlYXQpKTsKLSAgICAgIHJlcGVhdCA9IDE7Ci0gICAgfQotCi0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2MpOwotCi0gIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSkKLQlmcHJpbnRmIChvdXRmaWxlLCAiXHQiKTsKLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIuYnl0ZVx0Iik7Ci0gICAgICBzYl9wcmludCAob3V0ZmlsZSwgJmFjYyk7Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotCi19Ci0KLXN0YXRpYyBpbnQKLW5ld19maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBGSUxFICpuZXdvbmUgPSBmb3BlbiAobmFtZSwgInIiKTsKLSAgaWYgKCFuZXdvbmUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGlzcCA9PSBNQVhfSU5DTFVERVMpCi0gICAgRkFUQUwgKChzdGRlcnIsIF8oIlVucmVhc29uYWJsZSBpbmNsdWRlIGRlcHRoICglbGQpLlxuIiksIChsb25nKSBpc3ApKTsKLQotICBzcCsrOwotICBzcC0+aGFuZGxlID0gbmV3b25lOwotCi0gIHNiX25ldyAoJnNwLT5uYW1lKTsKLSAgc2JfYWRkX3N0cmluZyAoJnNwLT5uYW1lLCBuYW1lKTsKLQotICBzcC0+bGluZWNvdW50ID0gMTsKLSAgc3AtPnB1c2hiYWNrX2luZGV4ID0gMDsKLSAgc3AtPnR5cGUgPSBpbmNsdWRlX2ZpbGU7Ci0gIHNwLT5pbmRleCA9IDA7Ci0gIHNiX25ldyAoJnNwLT5wdXNoYmFjayk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotZG9faW5jbHVkZSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBzYiB0OwotICBzYiBjYXQ7Ci0gIGluY2x1ZGVfcGF0aCAqaW5jbHVkZXM7Ci0KLSAgc2JfbmV3ICgmdCk7Ci0gIHNiX25ldyAoJmNhdCk7Ci0KLSAgaWYgKCEgbXJpKQotICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJnQpOwotICBlbHNlCi0gICAgewotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiAhIElTV0hJVEUgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgc2JfYWRkX2NoYXIgKCZ0LCBpbi0+cHRyW2lkeF0pOwotCSAgKytpZHg7Ci0JfQotICAgIH0KLQotICBmb3IgKGluY2x1ZGVzID0gcGF0aHNfaGVhZDsgaW5jbHVkZXM7IGluY2x1ZGVzID0gaW5jbHVkZXMtPm5leHQpCi0gICAgewotICAgICAgc2JfcmVzZXQgKCZjYXQpOwotICAgICAgc2JfYWRkX3NiICgmY2F0LCAmaW5jbHVkZXMtPnBhdGgpOwotICAgICAgc2JfYWRkX2NoYXIgKCZjYXQsICcvJyk7Ci0gICAgICBzYl9hZGRfc2IgKCZjYXQsICZ0KTsKLSAgICAgIGlmIChuZXdfZmlsZSAoc2JfbmFtZSAoJmNhdCkpKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmICghaW5jbHVkZXMpCi0gICAgewotICAgICAgaWYgKCEgbmV3X2ZpbGUgKHNiX25hbWUgKCZ0KSkpCi0JRkFUQUwgKChzdGRlcnIsIF8oIkNhbid0IG9wZW4gaW5jbHVkZSBmaWxlIGAlcycuXG4iKSwgc2JfbmFtZSAoJnQpKSk7Ci0gICAgfQotICBzYl9raWxsICgmY2F0KTsKLSAgc2Jfa2lsbCAoJnQpOwotfQotCi1zdGF0aWMgdm9pZAotaW5jbHVkZV9wb3AgKCkKLXsKLSAgaWYgKHNwICE9IGluY2x1ZGVfc3RhY2spCi0gICAgewotICAgICAgaWYgKHNwLT5oYW5kbGUpCi0JZmNsb3NlIChzcC0+aGFuZGxlKTsKLSAgICAgIHNwLS07Ci0gICAgfQotfQotCi0vKiBHZXQgdGhlIG5leHQgY2hhcmFjdGVyIGZyb20gdGhlIGluY2x1ZGUgc3RhY2suICBJZiB0aGVyZSdzIGFueXRoaW5nCi0gICBpbiB0aGUgcHVzaGJhY2sgYnVmZmVyLCB0YWtlIHRoYXQgZmlyc3QuICBJZiB3ZSdyZSBhdCBlb2YsIHBvcCBmcm9tCi0gICB0aGUgc3RhY2sgYW5kIHRyeSBhZ2Fpbi4gIEtlZXAgdGhlIGxpbmVjb3VudCB1cCB0byBkYXRlLiAqLwotCi1zdGF0aWMgaW50Ci1nZXQgKCkKLXsKLSAgaW50IHI7Ci0KLSAgaWYgKHNwLT5wdXNoYmFjay5sZW4gIT0gc3AtPnB1c2hiYWNrX2luZGV4KQotICAgIHsKLSAgICAgIHIgPSAoY2hhcikgKHNwLT5wdXNoYmFjay5wdHJbc3AtPnB1c2hiYWNrX2luZGV4KytdKTsKLSAgICAgIC8qIFdoZW4gdGhleSd2ZSBhbGwgZ29uZSwgcmVzZXQgdGhlIHBvaW50ZXIgKi8KLSAgICAgIGlmIChzcC0+cHVzaGJhY2tfaW5kZXggPT0gc3AtPnB1c2hiYWNrLmxlbikKLQl7Ci0JICBzcC0+cHVzaGJhY2subGVuID0gMDsKLQkgIHNwLT5wdXNoYmFja19pbmRleCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3AtPmhhbmRsZSkKLSAgICB7Ci0gICAgICByID0gZ2V0YyAoc3AtPmhhbmRsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgciA9IEVPRjsKLQotICBpZiAociA9PSBFT0YgJiYgaXNwKQotICAgIHsKLSAgICAgIGluY2x1ZGVfcG9wICgpOwotICAgICAgciA9IGdldCAoKTsKLSAgICAgIHdoaWxlIChyID09IEVPRiAmJiBpc3ApCi0JewotCSAgaW5jbHVkZV9wb3AgKCk7Ci0JICByID0gZ2V0ICgpOwotCX0KLSAgICAgIHJldHVybiByOwotICAgIH0KLSAgaWYgKHIgPT0gJ1xuJykKLSAgICB7Ci0gICAgICBzcC0+bGluZWNvdW50Kys7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotCi1zdGF0aWMgaW50Ci1saW5lY291bnQgKCkKLXsKLSAgcmV0dXJuIHNwLT5saW5lY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWluY2x1ZGVfbmV4dF9pbmRleCAoKQotewotICBzdGF0aWMgaW50IGluZGV4OwotICBpZiAoIXVucmVhc29uYWJsZQotICAgICAgJiYgaW5kZXggPiBNQVhfUkVBU09OQUJMRSkKLSAgICBGQVRBTCAoKHN0ZGVyciwgXygiVW5yZWFzb25hYmxlIGV4cGFuc2lvbiAoLXUgdHVybnMgb2ZmIGNoZWNrKS5cbiIpKSk7Ci0gIHJldHVybiArK2luZGV4OwotfQotCi0KLS8qIEluaXRpYWxpemUgdGhlIGNoYXJ0eXBlIHZlY3Rvci4gKi8KLQotc3RhdGljIHZvaWQKLWNoYXJ0eXBlX2luaXQgKCkKLXsKLSAgaW50IHg7Ci0gIGZvciAoeCA9IDA7IHggPCAyNTY7IHgrKykKLSAgICB7Ci0gICAgICBpZiAoaXNhbHBoYSAoeCkgfHwgeCA9PSAnXycgfHwgeCA9PSAnJCcpCi0JY2hhcnR5cGVbeF0gfD0gRklSU1RCSVQ7Ci0KLSAgICAgIGlmIChtcmkgJiYgeCA9PSAnLicpCi0JY2hhcnR5cGVbeF0gfD0gRklSU1RCSVQ7Ci0KLSAgICAgIGlmIChpc2RpZ2l0ICh4KSB8fCBpc2FscGhhICh4KSB8fCB4ID09ICdfJyB8fCB4ID09ICckJykKLQljaGFydHlwZVt4XSB8PSBORVhUQklUOwotCi0gICAgICBpZiAoeCA9PSAnICcgfHwgeCA9PSAnXHQnIHx8IHggPT0gJywnIHx8IHggPT0gJyInIHx8IHggPT0gJzsnCi0JICB8fCB4ID09ICciJyB8fCB4ID09ICc8JyB8fCB4ID09ICc+JyB8fCB4ID09ICcpJyB8fCB4ID09ICcoJykKLQljaGFydHlwZVt4XSB8PSBTRVBCSVQ7Ci0KLSAgICAgIGlmICh4ID09ICdiJyB8fCB4ID09ICdCJwotCSAgfHwgeCA9PSAncScgfHwgeCA9PSAnUScKLQkgIHx8IHggPT0gJ2gnIHx8IHggPT0gJ0gnCi0JICB8fCB4ID09ICdkJyB8fCB4ID09ICdEJykKLQljaGFydHlwZSBbeF0gfD0gQkFTRUJJVDsKLQkgIAotICAgICAgaWYgKHggPT0gJyAnIHx8IHggPT0gJ1x0JykKLQljaGFydHlwZVt4XSB8PSBXSElURUJJVDsKLQotICAgICAgaWYgKHggPT0gY29tbWVudF9jaGFyKQotCWNoYXJ0eXBlW3hdIHw9IENPTU1FTlRCSVQ7Ci0gICAgfQotfQotCi0KLQotLyogV2hhdCB0byBkbyB3aXRoIGFsbCB0aGUga2V5d29yZHMgKi8KLSNkZWZpbmUgUFJPQ0VTUyAJMHgxMDAwICAvKiBSdW4gc3Vic3RpdHV0aW9uIG92ZXIgdGhlIGxpbmUgKi8KLSNkZWZpbmUgTEFCCQkweDIwMDAgIC8qIFNwaXQgb3V0IHRoZSBsYWJlbCAqLwotCi0jZGVmaW5lIEtfRVFVIAkJKFBST0NFU1N8MSkKLSNkZWZpbmUgS19BU1NJR04gCShQUk9DRVNTfDIpCi0jZGVmaW5lIEtfUkVHIAkJKFBST0NFU1N8MykKLSNkZWZpbmUgS19PUkcgCQkoUFJPQ0VTU3w0KQotI2RlZmluZSBLX1JBRElYIAkoUFJPQ0VTU3w1KQotI2RlZmluZSBLX0RBVEEgCQkoTEFCfFBST0NFU1N8NikKLSNkZWZpbmUgS19EQVRBQiAJKExBQnxQUk9DRVNTfDcpCi0jZGVmaW5lIEtfU0RBVEEgCShMQUJ8UFJPQ0VTU3w4KQotI2RlZmluZSBLX1NEQVRBQiAJKExBQnxQUk9DRVNTfDkpCi0jZGVmaW5lIEtfU0RBVEFDIAkoTEFCfFBST0NFU1N8MTApCi0jZGVmaW5lIEtfU0RBVEFaCShMQUJ8UFJPQ0VTU3wxMSkKLSNkZWZpbmUgS19SRVMgCQkoTEFCfFBST0NFU1N8MTIpCi0jZGVmaW5lIEtfU1JFUyAJCShMQUJ8UFJPQ0VTU3wxMykKLSNkZWZpbmUgS19TUkVTQyAJKExBQnxQUk9DRVNTfDE0KQotI2RlZmluZSBLX1NSRVNaIAkoTEFCfFBST0NFU1N8MTUpCi0jZGVmaW5lIEtfRVhQT1JUIAkoTEFCfFBST0NFU1N8MTYpCi0jZGVmaW5lIEtfR0xPQkFMIAkoTEFCfFBST0NFU1N8MTcpCi0jZGVmaW5lIEtfUFJJTlQgCShMQUJ8UFJPQ0VTU3wxOSkKLSNkZWZpbmUgS19GT1JNIAkJKExBQnxQUk9DRVNTfDIwKQotI2RlZmluZSBLX0hFQURJTkcJKExBQnxQUk9DRVNTfDIxKQotI2RlZmluZSBLX1BBR0UJCShMQUJ8UFJPQ0VTU3wyMikKLSNkZWZpbmUgS19JTVBPUlQJKExBQnxQUk9DRVNTfDIzKQotI2RlZmluZSBLX1BST0dSQU0JKExBQnxQUk9DRVNTfDI0KQotI2RlZmluZSBLX0VORAkJKFBST0NFU1N8MjUpCi0jZGVmaW5lIEtfSU5DTFVERQkoUFJPQ0VTU3wyNikKLSNkZWZpbmUgS19JR05PUkVECShQUk9DRVNTfDI3KQotI2RlZmluZSBLX0FTU0lHTkEJKFBST0NFU1N8MjgpCi0jZGVmaW5lIEtfQVNTSUdOQwkoMjkpCi0jZGVmaW5lIEtfQUlGCQkoUFJPQ0VTU3wzMCkKLSNkZWZpbmUgS19BRUxTRQkJKFBST0NFU1N8MzEpCi0jZGVmaW5lIEtfQUVOREkJCShQUk9DRVNTfDMyKQotI2RlZmluZSBLX0FSRVBFQVQJKFBST0NFU1N8MzMpCi0jZGVmaW5lIEtfQUVORFIJCShQUk9DRVNTfDM0KQotI2RlZmluZSBLX0FXSElMRQkoMzUpCi0jZGVmaW5lIEtfQUVORFcJCShQUk9DRVNTfDM2KQotI2RlZmluZSBLX0VYSVRNCQkoMzcpCi0jZGVmaW5lIEtfTUFDUk8JCShQUk9DRVNTfDM4KQotI2RlZmluZSBLX0VORE0JCSgzOSkKLSNkZWZpbmUgS19BTElHTgkJKFBST0NFU1N8TEFCfDQwKQotI2RlZmluZSBLX0FMVEVSTkFURSAgICAgKDQxKQotI2RlZmluZSBLX0RCCQkoTEFCfFBST0NFU1N8NDIpCi0jZGVmaW5lIEtfRFcJCShMQUJ8UFJPQ0VTU3w0MykKLSNkZWZpbmUgS19ETAkJKExBQnxQUk9DRVNTfDQ0KQotI2RlZmluZSBLX0xPQ0FMCQkoNDUpCi0jZGVmaW5lIEtfSUZFUQkJKFBST0NFU1N8NDYpCi0jZGVmaW5lIEtfSUZORQkJKFBST0NFU1N8NDcpCi0jZGVmaW5lIEtfSUZMVAkJKFBST0NFU1N8NDgpCi0jZGVmaW5lIEtfSUZMRQkJKFBST0NFU1N8NDkpCi0jZGVmaW5lIEtfSUZHRQkJKFBST0NFU1N8NTApCi0jZGVmaW5lIEtfSUZHVAkJKFBST0NFU1N8NTEpCi0jZGVmaW5lIEtfSUZDCQkoUFJPQ0VTU3w1MikKLSNkZWZpbmUgS19JRk5DCQkoUFJPQ0VTU3w1MykKLSNkZWZpbmUgS19JUlAJCShQUk9DRVNTfDU0KQotI2RlZmluZSBLX0lSUEMJCShQUk9DRVNTfDU1KQotCi0KLXN0cnVjdCBrZXl3b3JkCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjb2RlOwotICBpbnQgZXh0cmE7Ci19OwotCi1zdGF0aWMgc3RydWN0IGtleXdvcmQga2luZm9bXSA9Ci17Ci0gIHsgIkVRVSIsIEtfRVFVLCAwIH0sCi0gIHsgIkFMVEVSTkFURSIsIEtfQUxURVJOQVRFLCAwIH0sCi0gIHsgIkFTU0lHTiIsIEtfQVNTSUdOLCAwIH0sCi0gIHsgIlJFRyIsIEtfUkVHLCAwIH0sCi0gIHsgIk9SRyIsIEtfT1JHLCAwIH0sCi0gIHsgIlJBRElYIiwgS19SQURJWCwgMCB9LAotICB7ICJEQVRBIiwgS19EQVRBLCAwIH0sCi0gIHsgIkRCIiwgS19EQiwgMCB9LAotICB7ICJEVyIsIEtfRFcsIDAgfSwKLSAgeyAiREwiLCBLX0RMLCAwIH0sCi0gIHsgIkRBVEFCIiwgS19EQVRBQiwgMCB9LAotICB7ICJTREFUQSIsIEtfU0RBVEEsIDAgfSwKLSAgeyAiU0RBVEFCIiwgS19TREFUQUIsIDAgfSwKLSAgeyAiU0RBVEFaIiwgS19TREFUQVosIDAgfSwKLSAgeyAiU0RBVEFDIiwgS19TREFUQUMsIDAgfSwKLSAgeyAiUkVTIiwgS19SRVMsIDAgfSwKLSAgeyAiU1JFUyIsIEtfU1JFUywgMCB9LAotICB7ICJTUkVTQyIsIEtfU1JFU0MsIDAgfSwKLSAgeyAiU1JFU1oiLCBLX1NSRVNaLCAwIH0sCi0gIHsgIkVYUE9SVCIsIEtfRVhQT1JULCAwIH0sCi0gIHsgIkdMT0JBTCIsIEtfR0xPQkFMLCAwIH0sCi0gIHsgIlBSSU5UIiwgS19QUklOVCwgMCB9LAotICB7ICJGT1JNIiwgS19GT1JNLCAwIH0sCi0gIHsgIkhFQURJTkciLCBLX0hFQURJTkcsIDAgfSwKLSAgeyAiUEFHRSIsIEtfUEFHRSwgMCB9LAotICB7ICJQUk9HUkFNIiwgS19JR05PUkVELCAwIH0sCi0gIHsgIkVORCIsIEtfRU5ELCAwIH0sCi0gIHsgIklOQ0xVREUiLCBLX0lOQ0xVREUsIDAgfSwKLSAgeyAiQVNTSUdOQSIsIEtfQVNTSUdOQSwgMCB9LAotICB7ICJBU1NJR05DIiwgS19BU1NJR05DLCAwIH0sCi0gIHsgIkFJRiIsIEtfQUlGLCAwIH0sCi0gIHsgIkFFTFNFIiwgS19BRUxTRSwgMCB9LAotICB7ICJBRU5ESSIsIEtfQUVOREksIDAgfSwKLSAgeyAiQVJFUEVBVCIsIEtfQVJFUEVBVCwgMCB9LAotICB7ICJBRU5EUiIsIEtfQUVORFIsIDAgfSwKLSAgeyAiRVhJVE0iLCBLX0VYSVRNLCAwIH0sCi0gIHsgIk1BQ1JPIiwgS19NQUNSTywgMCB9LAotICB7ICJFTkRNIiwgS19FTkRNLCAwIH0sCi0gIHsgIkFXSElMRSIsIEtfQVdISUxFLCAwIH0sCi0gIHsgIkFMSUdOIiwgS19BTElHTiwgMCB9LAotICB7ICJBRU5EVyIsIEtfQUVORFcsIDAgfSwKLSAgeyAiQUxURVJOQVRFIiwgS19BTFRFUk5BVEUsIDAgfSwKLSAgeyAiTE9DQUwiLCBLX0xPQ0FMLCAwIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi0vKiBBbHRob3VnaCB0aGUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFyZSBoYW5kbGVkIGJ5IGdhcywgd2UgbmVlZCB0bwotICAgaGFuZGxlIHRoZW0gaGVyZSBhcyB3ZWxsLCBpbiBjYXNlIHRoZXkgYXJlIHVzZWQgaW4gYSByZWN1cnNpdmUKLSAgIG1hY3JvIHRvIGVuZCB0aGUgcmVjdXJzaW9uLiAgKi8KLQotc3RhdGljIHN0cnVjdCBrZXl3b3JkIG1yaWtpbmZvW10gPQotewotICB7ICJJRkVRIiwgS19JRkVRLCAwIH0sCi0gIHsgIklGTkUiLCBLX0lGTkUsIDAgfSwKLSAgeyAiSUZMVCIsIEtfSUZMVCwgMCB9LAotICB7ICJJRkxFIiwgS19JRkxFLCAwIH0sCi0gIHsgIklGR0UiLCBLX0lGR0UsIDAgfSwKLSAgeyAiSUZHVCIsIEtfSUZHVCwgMCB9LAotICB7ICJJRkMiLCBLX0lGQywgMCB9LAotICB7ICJJRk5DIiwgS19JRk5DLCAwIH0sCi0gIHsgIkVMU0VDIiwgS19BRUxTRSwgMCB9LAotICB7ICJFTkRDIiwgS19BRU5ESSwgMCB9LAotICB7ICJNRVhJVCIsIEtfRVhJVE0sIDAgfSwKLSAgeyAiUkVQVCIsIEtfQVJFUEVBVCwgMCB9LAotICB7ICJJUlAiLCBLX0lSUCwgMCB9LAotICB7ICJJUlBDIiwgS19JUlBDLCAwIH0sCi0gIHsgIkVORFIiLCBLX0FFTkRSLCAwIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi0vKiBMb29rIGZvciBhIHBzZXVkbyBvcCBvbiB0aGUgbGluZS4gSWYgb25lJ3MgdGhlcmUgdGhlbiBjYWxsCi0gICBpdHMgaGFuZGxlci4gKi8KLQotc3RhdGljIGludAotcHJvY2Vzc19wc2V1ZG9fb3AgKGlkeCwgbGluZSwgYWNjKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqbGluZTsKLSAgICAgc2IgKmFjYzsKLXsKLSAgaW50IG9pZHggPSBpZHg7Ci0KLSAgaWYgKGxpbmUtPnB0cltpZHhdID09ICcuJyB8fCBhbHRlcm5hdGUgfHwgbXJpKQotICAgIHsKLSAgICAgIC8qIFNjYW4gZm9yd2FyZCBhbmQgZmluZCBwc2V1ZG8gbmFtZSAqLwotICAgICAgY2hhciAqaW47Ci0gICAgICBoYXNoX2VudHJ5ICpwdHI7Ci0KLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyICplOwotICAgICAgaWYgKGxpbmUtPnB0cltpZHhdID09ICcuJykKLQlpZHgrKzsKLSAgICAgIGluID0gbGluZS0+cHRyICsgaWR4OwotICAgICAgcyA9IGluOwotICAgICAgZSA9IHM7Ci0gICAgICBzYl9yZXNldCAoYWNjKTsKLQotICAgICAgd2hpbGUgKGlkeCA8IGxpbmUtPmxlbiAmJiAqZSAmJiBJU0ZJUlNUQ0hBUiAoKmUpKQotCXsKLQkgIHNiX2FkZF9jaGFyIChhY2MsICplKTsKLQkgIGUrKzsKLQkgIGlkeCsrOwotCX0KLQotICAgICAgcHRyID0gaGFzaF9sb29rdXAgKCZrZXl3b3JkX2hhc2hfdGFibGUsIGFjYyk7Ci0KLSAgICAgIGlmICghcHRyKQotCXsKLSNpZiAwCi0JICAvKiBUaGlzIG9uZSBjYXVzZXMgbG90cyBvZiBwYWluIHdoZW4gdHJ5aW5nIHRvIHByZXByb2Nlc3MKLQkgICAgIG9yZGluYXJ5IGNvZGUgKi8KLQkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIlVucmVjb2duaXNlZCBwc2V1ZG8gb3AgYCVzJy5cbiIpLCBzYl9uYW1lIChhY2MpKSk7Ci0jZW5kaWYKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmIChwdHItPnZhbHVlLmkgJiBMQUIpCi0JewkJCS8qIG91dHB1dCB0aGUgbGFiZWwgKi8KLQkgIGlmIChsYWJlbC5sZW4pCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChvdXRmaWxlLCAiJXM6XHQiLCBzYl9uYW1lICgmbGFiZWwpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmcHJpbnRmIChvdXRmaWxlLCAiXHQiKTsKLQl9Ci0KLSAgICAgIGlmIChtcmkgJiYgcHRyLT52YWx1ZS5pID09IEtfRU5EKQotCXsKLQkgIHNiIHQ7Ci0KLQkgIHNiX25ldyAoJnQpOwotCSAgc2JfYWRkX2J1ZmZlciAoJnQsIGxpbmUtPnB0ciArIG9pZHgsIGlkeCAtIG9pZHgpOwotCSAgZnByaW50ZiAob3V0ZmlsZSwgIlx0JXMiLCBzYl9uYW1lICgmdCkpOwotCSAgc2Jfa2lsbCAoJnQpOwotCX0KLQotICAgICAgaWYgKHB0ci0+dmFsdWUuaSAmIFBST0NFU1MpCi0JewotCSAgLyogUG9saXNoIHRoZSByZXN0IG9mIHRoZSBsaW5lIGJlZm9yZSBoYW5kbGluZyB0aGUgcHNldWRvIG9wICovCi0jaWYgMAotCSAgc3RyaXBfY29tbWVudHMobGluZSk7Ci0jZW5kaWYKLQkgIHNiX3Jlc2V0IChhY2MpOwotCSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGxpbmUsIGFjYyk7Ci0JICBzYl9yZXNldChsaW5lKTsKLQkgIGNoYW5nZV9iYXNlICgwLCBhY2MsIGxpbmUpOwotCSAgaWR4ID0gMDsKLQl9Ci0gICAgICBpZiAoIWNvbmRhc3Nfb24gKCkpCi0JewotCSAgc3dpdGNoIChwdHItPnZhbHVlLmkpCi0JICAgIHsKLQkgICAgY2FzZSBLX0FJRjoKLQkgICAgICBkb19haWYgKGlkeCwgbGluZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgS19BRUxTRToKLQkgICAgICBkb19hZWxzZSAoKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBLX0FFTkRJOgotCSAgICAgIGRvX2FlbmRpICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChwdHItPnZhbHVlLmkpCi0JICAgIHsKLQkgICAgY2FzZSBLX0FMVEVSTkFURToKLQkgICAgICBhbHRlcm5hdGUgPSAxOwotCSAgICAgIG1hY3JvX2luaXQgKDEsIG1yaSwgMCwgZXhwX2dldF9hYnMpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUVMU0U6Ci0JICAgICAgZG9fYWVsc2UgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BRU5ESToKLQkgICAgICBkb19hZW5kaSAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX09SRzoKLQkgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiT1JHIGNvbW1hbmQgbm90IGFsbG93ZWQuXG4iKSkpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEtfUkFESVg6Ci0JICAgICAgZG9fcmFkaXggKGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfREI6Ci0JICAgICAgZG9fZGF0YSAoaWR4LCBsaW5lLCAxKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0RXOgotCSAgICAgIGRvX2RhdGEgKGlkeCwgbGluZSwgMik7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19ETDoKLQkgICAgICBkb19kYXRhIChpZHgsIGxpbmUsIDQpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfREFUQToKLQkgICAgICBkb19kYXRhIChpZHgsIGxpbmUsIDApOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfREFUQUI6Ci0JICAgICAgZG9fZGF0YWIgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TREFUQToKLQkgICAgICBkb19zZGF0YSAoaWR4LCBsaW5lLCAwKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBQjoKLQkgICAgICBkb19zZGF0YWIgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TREFUQUM6Ci0JICAgICAgZG9fc2RhdGEgKGlkeCwgbGluZSwgJ2MnKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBWjoKLQkgICAgICBkb19zZGF0YSAoaWR4LCBsaW5lLCAneicpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVNTSUdOOgotCSAgICAgIGRvX2Fzc2lnbiAoMCwgMCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BSUY6Ci0JICAgICAgZG9fYWlmIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVJFUEVBVDoKLQkgICAgICBkb19hcmVwZWF0IChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUVORFc6Ci0JICAgICAgZG9fYWVuZHcgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BV0hJTEU6Ci0JICAgICAgZG9fYXdoaWxlIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUVORFI6Ci0JICAgICAgZG9fYWVuZHIgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19FUVU6Ci0JICAgICAgZG9fYXNzaWduICgxLCBpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUxJR046Ci0JICAgICAgZG9fYWxpZ24gKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19SRVM6Ci0JICAgICAgZG9fcmVzIChpZHgsIGxpbmUsIDApOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfU1JFUzoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgJ3MnKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lOQ0xVREU6Ci0JICAgICAgZG9faW5jbHVkZSAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0xPQ0FMOgotCSAgICAgIGRvX2xvY2FsIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfTUFDUk86Ci0JICAgICAgZG9fbWFjcm8gKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19FTkRNOgotCSAgICAgIGRvX2VuZG0gKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TUkVTQzoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgJ2MnKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1BSSU5UOgotCSAgICAgIGRvX3ByaW50IChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfRk9STToKLQkgICAgICBkb19mb3JtIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSEVBRElORzoKLQkgICAgICBkb19oZWFkaW5nIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfUEFHRToKLQkgICAgICBkb19wYWdlICgpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfR0xPQkFMOgotCSAgICBjYXNlIEtfRVhQT1JUOgotCSAgICAgIGRvX2V4cG9ydCAobGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JTVBPUlQ6Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TUkVTWjoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgJ3onKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lHTk9SRUQ6Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19FTkQ6Ci0JICAgICAgZG9fZW5kIChsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FTU0lHTkE6Ci0JICAgICAgZG9fYXNzaWduYSAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FTU0lHTkM6Ci0JICAgICAgZG9fYXNzaWduYyAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0VYSVRNOgotCSAgICAgIGRvX2V4aXRtICgpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfUkVHOgotCSAgICAgIGRvX3JlZyAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGRVE6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgRVEpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZORToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBORSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRkxUOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIExUKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGTEU6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgTEUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZHRToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBHRSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRkdUOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIEdUKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGQzoKLQkgICAgICBkb19pZmMgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRk5DOgotCSAgICAgIGRvX2lmYyAoaWR4LCBsaW5lLCAxKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lSUDoKLQkgICAgICBkb19pcnAgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JUlBDOgotCSAgICAgIGRvX2lycCAoaWR4LCBsaW5lLCAxKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLQotLyogQWRkIGEga2V5d29yZCB0byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfa2V5d29yZCAobmFtZSwgY29kZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHNiIGxhYmVsOwotICBpbnQgajsKLQotICBzYl9uZXcgKCZsYWJlbCk7Ci0gIHNiX2FkZF9zdHJpbmcgKCZsYWJlbCwgbmFtZSk7Ci0KLSAgaGFzaF9hZGRfdG9faW50X3RhYmxlICgma2V5d29yZF9oYXNoX3RhYmxlLCAmbGFiZWwsIGNvZGUpOwotCi0gIHNiX3Jlc2V0ICgmbGFiZWwpOwotICBmb3IgKGogPSAwOyBuYW1lW2pdOyBqKyspCi0gICAgc2JfYWRkX2NoYXIgKCZsYWJlbCwgbmFtZVtqXSAtICdBJyArICdhJyk7Ci0gIGhhc2hfYWRkX3RvX2ludF90YWJsZSAoJmtleXdvcmRfaGFzaF90YWJsZSwgJmxhYmVsLCBjb2RlKTsKLQotICBzYl9raWxsICgmbGFiZWwpOwotfSAgCi0KLS8qIEJ1aWxkIHRoZSBrZXl3b3JkIGhhc2ggdGFibGUgLSBwdXQgZWFjaCBrZXl3b3JkIGluIHRoZSB0YWJsZSB0d2ljZSwKLSAgIG9uY2UgdXBwZXIgYW5kIG9uY2UgbG93ZXIgY2FzZS4qLwotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19pbml0ICgpCi17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGtpbmZvW2ldLm5hbWU7IGkrKykKLSAgICBhZGRfa2V5d29yZCAoa2luZm9baV0ubmFtZSwga2luZm9baV0uY29kZSk7Ci0KLSAgaWYgKG1yaSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBtcmlraW5mb1tpXS5uYW1lOyBpKyspCi0JYWRkX2tleXdvcmQgKG1yaWtpbmZvW2ldLm5hbWUsIG1yaWtpbmZvW2ldLmNvZGUpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotZG9fZGVmaW5lIChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc2IgbGFiZWw7Ci0gIGludCByZXMgPSAxOwotICBoYXNoX2VudHJ5ICpwdHI7Ci0gIHNiX25ldyAoJmxhYmVsKTsKLQotCi0gIHdoaWxlICgqc3RyaW5nKQotICAgIHsKLSAgICAgIGlmICgqc3RyaW5nID09ICc9JykgCi0JewotCSAgc2IgdmFsdWU7Ci0JICBzYl9uZXcgKCZ2YWx1ZSk7Ci0JICBzdHJpbmcrKzsKLQkgIHdoaWxlICgqc3RyaW5nKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKCZ2YWx1ZSwgKnN0cmluZyk7Ci0JICAgICAgc3RyaW5nKys7Ci0JICAgIH0KLQkgIGV4cF9nZXRfYWJzIChfKCJJbnZhbGlkIGV4cHJlc3Npb24gb24gY29tbWFuZCBsaW5lLlxuIiksIDAsICZ2YWx1ZSwgJnJlcyk7Ci0JICBzYl9raWxsICgmdmFsdWUpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgc2JfYWRkX2NoYXIgKCZsYWJlbCwgKnN0cmluZyk7Ci0KLSAgICAgIHN0cmluZyArKzsKLSAgICB9Ci0KLSAgcHRyID0gaGFzaF9jcmVhdGUgKCZ2YXJzLCAmbGFiZWwpOwotICBmcmVlX29sZF9lbnRyeSAocHRyKTsKLSAgcHRyLT50eXBlID0gaGFzaF9pbnRlZ2VyOwotICBwdHItPnZhbHVlLmkgPSByZXM7Ci0gIHNiX2tpbGwgKCZsYWJlbCk7Ci19Ci1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIFRoZSBsaXN0IG9mIGxvbmcgb3B0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsgImFsdGVybmF0ZSIsIG5vX2FyZ3VtZW50LCAwLCAnYScgfSwKLSAgeyAiaW5jbHVkZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSScgfSwKLSAgeyAiY29tbWVudGNoYXIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2MnIH0sCi0gIHsgImNvcHlzb3VyY2UiLCBub19hcmd1bWVudCwgMCwgJ3MnIH0sCi0gIHsgImRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdkJyB9LAotICB7ICJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJyB9LAotICB7ICJtcmkiLCBub19hcmd1bWVudCwgMCwgJ00nIH0sCi0gIHsgIm91dHB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbycgfSwKLSAgeyAicHJpbnQiLCBub19hcmd1bWVudCwgMCwgJ3AnIH0sCi0gIHsgInVucmVhc29uYWJsZSIsIG5vX2FyZ3VtZW50LCAwLCAndScgfSwKLSAgeyAidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAndicgfSwKLSAgeyAiZGVmaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdkJyB9LAotICB7IE5VTEwsIG5vX2FyZ3VtZW50LCAwLCAwIH0KLX07Ci0KLS8qIFNob3cgYSB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LiAgKi8KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIlwKLVVzYWdlOiAlcyBcblwKLSAgWy1hXSAgICAgIFstLWFsdGVybmF0ZV0gICAgICAgICBlbnRlciBhbHRlcm5hdGUgbWFjcm8gbW9kZVxuXAotICBbLWMgY2hhcl0gWy0tY29tbWVudGNoYXIgY2hhcl0gIGNoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXIgZnJvbSAhXG5cCi0gIFstZF0gICAgICBbLS1kZWJ1Z10gICAgICAgICAgICAgcHJpbnQgc29tZSBkZWJ1Z2dpbmcgaW5mb1xuXAotICBbLWhdICAgICAgWy0taGVscF0gICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZVxuXAotICBbLU1dICAgICAgWy0tbXJpXSAgICAgICAgICAgICAgIGVudGVyIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcblwKLSAgWy1vIG91dF0gIFstLW91dHB1dCBvdXRdICAgICAgICBzZXQgdGhlIG91dHB1dCBmaWxlXG5cCi0gIFstcF0gICAgICBbLS1wcmludF0gICAgICAgICAgICAgcHJpbnQgbGluZSBudW1iZXJzXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiXAotICBbLXNdICAgICAgWy0tY29weXNvdXJjZV0gICAgICAgIGNvcHkgc291cmNlIHRocm91Z2ggYXMgY29tbWVudHMgXG5cCi0gIFstdV0gICAgICBbLS11bnJlYXNvbmFibGVdICAgICAgYWxsb3cgdW5yZWFzb25hYmxlIG5lc3RpbmdcblwKLSAgWy12XSAgICAgIFstLXZlcnNpb25dICAgICAgICAgICBwcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uXG5cCi0gIFstRG5hbWU9dmFsdWVdICAgICAgICAgICAgICAgICAgY3JlYXRlIHByZXByb2Nlc3NvciB2YXJpYWJsZSBjYWxsZWQgbmFtZSwgd2l0aCB2YWx1ZVxuXAotICBbLUlwYXRoXSAgICAgICAgICAgICAgICAgICAgICAgIGFkZCB0byBpbmNsdWRlIHBhdGggbGlzdFxuXAotICBbaW4tZmlsZV1cbiIpKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHByaW50ZiAoXygiXG5SZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogRGlzcGxheSBhIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4gICovCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IEdudSBBc3NlbWJsZXIgTWFjcm8gUHJlcHJvY2Vzc29yXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgb3B0OwotICBjaGFyICpvdXRfbmFtZSA9IDA7Ci0gIHNwID0gaW5jbHVkZV9zdGFjazsKLQotICBpZnN0YWNrWzBdLm9uID0gMTsKLSAgaWZpID0gMDsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBoYXNoX25ld190YWJsZSAoMTAxLCAma2V5d29yZF9oYXNoX3RhYmxlKTsKLSAgaGFzaF9uZXdfdGFibGUgKDEwMSwgJmFzc2lnbl9oYXNoX3RhYmxlKTsKLSAgaGFzaF9uZXdfdGFibGUgKDEwMSwgJnZhcnMpOwotCi0gIHNiX25ldyAoJmxhYmVsKTsKLQotICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiSTpzZGhhdmM6dXBvOkQ6TSIsIGxvbmdfb3B0aW9ucywKLQkJCSAgICAgKGludCAqKSBOVUxMKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0KQotCXsKLQljYXNlICdvJzoKLQkgIG91dF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JICB1bnJlYXNvbmFibGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnSSc6Ci0JICB7Ci0JICAgIGluY2x1ZGVfcGF0aCAqcCA9IChpbmNsdWRlX3BhdGggKikgeG1hbGxvYyAoc2l6ZW9mIChpbmNsdWRlX3BhdGgpKTsKLQkgICAgcC0+bmV4dCA9IE5VTEw7Ci0JICAgIHNiX25ldyAoJnAtPnBhdGgpOwotCSAgICBzYl9hZGRfc3RyaW5nICgmcC0+cGF0aCwgb3B0YXJnKTsKLQkgICAgaWYgKHBhdGhzX3RhaWwpCi0JICAgICAgcGF0aHNfdGFpbC0+bmV4dCA9IHA7Ci0JICAgIGVsc2UKLQkgICAgICBwYXRoc19oZWFkID0gcDsKLQkgICAgcGF0aHNfdGFpbCA9IHA7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIHByaW50X2xpbmVfbnVtYmVyID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgY29tbWVudF9jaGFyID0gb3B0YXJnWzBdOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBhbHRlcm5hdGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBjb3B5c291cmNlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgc3RhdHMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkb19kZWZpbmUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdNJzoKLQkgIG1yaSA9IDE7Ci0JICBjb21tZW50X2NoYXIgPSAnOyc7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAndic6Ci0JICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotCSAgcHJpbnRmIChfKCJHTlUgYXNzZW1ibGVyIHByZS1wcm9jZXNzb3IgJXNcbiIpLCBwcm9ncmFtX3ZlcnNpb24pOwotCSAgcHJpbnRmIChfKCJDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpKTsKLQkgIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgLypOT1RSRUFDSEVEKi8KLQl9Ci0gICAgfQotCi0gIHByb2Nlc3NfaW5pdCAoKTsKLQotICBtYWNyb19pbml0IChhbHRlcm5hdGUsIG1yaSwgMCwgZXhwX2dldF9hYnMpOwotCi0gIGlmIChvdXRfbmFtZSkgewotICAgIG91dGZpbGUgPSBmb3BlbiAob3V0X25hbWUsICJ3Iik7Ci0gICAgaWYgKCFvdXRmaWxlKQotICAgICAgewotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gb3V0cHV0IGZpbGUgYCVzJy5cbiIpLAotCQkgcHJvZ3JhbV9uYW1lLCBvdXRfbmFtZSk7Ci0JZXhpdCAoMSk7Ci0gICAgICB9Ci0gIH0KLSAgZWxzZSAgewotICAgIG91dGZpbGUgPSBzdGRvdXQ7Ci0gIH0KLQotICBjaGFydHlwZV9pbml0ICgpOwotICBpZiAoIW91dGZpbGUpCi0gICAgb3V0ZmlsZSA9IHN0ZG91dDsKLQotICAvKiBQcm9jZXNzIGFsbCB0aGUgaW5wdXQgZmlsZXMgKi8KLQotICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBpZiAobmV3X2ZpbGUgKGFyZ3Zbb3B0aW5kXSkpCi0JewotCSAgcHJvY2Vzc19maWxlICgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCBvcGVuIGlucHV0IGZpbGUgYCVzJy5cbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGFyZ3Zbb3B0aW5kXSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBvcHRpbmQrKzsKLSAgICB9Ci0KLSAgcXVpdCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBiZWNhdXNlIGFuIGFib3J0IGluIHNvbWUgb2YgdGhlIG90aGVyIGZpbGVzCi0gICBtYXkgYmUgY29tcGlsZWQgaW50byBhc19hYm9ydCBiZWNhdXNlIHRoZXkgaW5jbHVkZSBhcy5oLiAgKi8KLQotdm9pZAotYXNfYWJvcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlLCAqZm47Ci0gICAgIGludCBsaW5lOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkIiksIGZpbGUsIGxpbmUpOwotICBpZiAoZm4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIGluICVzIiwgZm4pOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIlxuUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIpKTsKLSAgZXhpdCAoMSk7Ci19CmRpZmYgLS1naXQgYS9nYXMvZ2RiaW5pdC5pbiBiL2dhcy9nZGJpbml0LmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQ2NzI2Li4wMDAwMDAwCi0tLSBhL2dhcy9nZGJpbml0LmluCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotZGlyIEBzcmNkaXJACi1kaXIgLgotCi1icmVhayBhc193YXJuCi1icmVhayBhc193YXJuX3doZXJlCi1icmVhayBhc19iYWQKLWJyZWFrIGFzX2JhZF93aGVyZQotYnJlYWsgYXNfZmF0YWwKLWJyZWFrIGFzX3BlcnJvcgotYnJlYWsgYXNfYXNzZXJ0Ci1icmVhayBhc19hYm9ydAotCi1kZWZpbmUgcGUKLWNhbGwgcHJpbnRfZXhwciAoJCkKLWVuZAotCi1kb2N1bWVudCBwZQotUHJpbnQgKiQgYXMgYW4gZXhwcmVzc2lvblMsIGV4cGFuZGluZyBwYXJhbWV0ZXJzLgotZW5kCi0KLWRlZmluZSBwcwotY2FsbCBwcmludF9zeW1ib2xfdmFsdWUgKCQpCi1lbmQKLQotZG9jdW1lbnQgcHMKLVByaW50ICokIGFzIGEgc3ltYm9sUywgaW5jbHVkaW5nIGV4cHJlc3Npb24gdmFsdWUuCi1lbmQKLQotZGVmaW5lIHBmCi1jYWxsIHByaW50X2ZpeHVwICgkKQotZW5kCi0KLWRvY3VtZW50IHBmCi1QcmludCAqJCBhcyBhIGZpeFMsIGluY2x1ZGluZyBzeW1ib2wgdmFsdWUuCi1lbmQKLQotIyBQdXQgdGhpcyBsYXN0LCBpbiBjYXNlIGl0IGZhaWxzLgotCi1icmVhayBhYm9ydApkaWZmIC0tZ2l0IGEvZ2FzL2hhc2guYyBiL2dhcy9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTI5ZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2hhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDYwMSArMCwwIEBACi0vKiBoYXNoLmMgLS0gZ2FzIGhhc2ggdGFibGUgY29kZQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHZlcnNpb24gb2YgdGhlIGhhc2ggdGFibGUgY29kZSBpcyBhIHdob2xlc2NhbGUgcmVwbGFjZW1lbnQgb2YKLSAgIHRoZSBvbGQgaGFzaCB0YWJsZSBjb2RlLCB3aGljaCB3YXMgZmFpcmx5IGJhZC4gIFRoaXMgaXMgYmFzZWQgb24KLSAgIHRoZSBoYXNoIHRhYmxlIGNvZGUgaW4gQkZELCBidXQgb3B0aW1pemVkIHNsaWdodGx5IGZvciB0aGUKLSAgIGFzc3NlbWJsZXIuICBUaGUgYXNzZW1ibGVyIGRvZXMgbm90IG5lZWQgdG8gZGVyaXZlIHN0cnVjdHVyZXMgdGhhdAotICAgYXJlIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZS4gIEluc3RlYWQsIGl0IGFsd2F5cyBzdG9yZXMgYSBwb2ludGVyLgotICAgVGhlIGFzc2VtYmxlciB1c2VzIHRoZSBoYXNoIHRhYmxlIG1vc3RseSB0byBzdG9yZSBzeW1ib2xzLCBhbmQgd2UKLSAgIGRvbid0IG5lZWQgdG8gY29uZnVzZSB0aGUgc3ltYm9sIHN0cnVjdHVyZSB3aXRoIGEgaGFzaCB0YWJsZQotICAgc3RydWN0dXJlLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgZW50cmllcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIERFRkFVTFRfU0laRSAoNDA1MSkKLQotLyogQW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGhhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogU3RyaW5nIGJlaW5nIGhhc2hlZC4gICovCi0gIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgLyogSGFzaCBjb2RlLiAgVGhpcyBpcyB0aGUgZnVsbCBoYXNoIGNvZGUsIG5vdCB0aGUgaW5kZXggaW50byB0aGUKLSAgICAgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIC8qIFBvaW50ZXIgYmVpbmcgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgUFRSIGRhdGE7Ci19OwotCi0vKiBBIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgaGFzaF9jb250cm9sCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGhhc2hfZW50cnkgKip0YWJsZTsKLSAgLyogVGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBBbiBvYnN0YWNrIGZvciB0aGlzIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgb2JzdGFjayBtZW1vcnk7Ci0KLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgLyogU3RhdGlzdGljcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbG9va3VwczsKLSAgdW5zaWduZWQgbG9uZyBoYXNoX2NvbXBhcmVzOwotICB1bnNpZ25lZCBsb25nIHN0cmluZ19jb21wYXJlczsKLSAgdW5zaWduZWQgbG9uZyBpbnNlcnRpb25zOwotICB1bnNpZ25lZCBsb25nIHJlcGxhY2VtZW50czsKLSAgdW5zaWduZWQgbG9uZyBkZWxldGlvbnM7Ci0jZW5kaWYgLyogSEFTSF9TVEFUSVNUSUNTICovCi19OwotCi0vKiBDcmVhdGUgYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm4gYSBjb250cm9sIGJsb2NrLiAgKi8KLQotc3RydWN0IGhhc2hfY29udHJvbCAqCi1oYXNoX25ldyAoKQotewotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgc3RydWN0IGhhc2hfY29udHJvbCAqcmV0OwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgc2l6ZSA9IERFRkFVTFRfU0laRTsKLQotICByZXQgPSAoc3RydWN0IGhhc2hfY29udHJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIG9ic3RhY2tfYmVnaW4gKCZyZXQtPm1lbW9yeSwgY2h1bmtzaXplKTsKLSAgYWxsb2MgPSBzaXplICogc2l6ZW9mIChzdHJ1Y3QgaGFzaF9lbnRyeSAqKTsKLSAgcmV0LT50YWJsZSA9IChzdHJ1Y3QgaGFzaF9lbnRyeSAqKikgb2JzdGFja19hbGxvYyAoJnJldC0+bWVtb3J5LCBhbGxvYyk7Ci0gIG1lbXNldCAocmV0LT50YWJsZSwgMCwgYWxsb2MpOwotICByZXQtPnNpemUgPSBzaXplOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gIHJldC0+bG9va3VwcyA9IDA7Ci0gIHJldC0+aGFzaF9jb21wYXJlcyA9IDA7Ci0gIHJldC0+c3RyaW5nX2NvbXBhcmVzID0gMDsKLSAgcmV0LT5pbnNlcnRpb25zID0gMDsKLSAgcmV0LT5yZXBsYWNlbWVudHMgPSAwOwotICByZXQtPmRlbGV0aW9ucyA9IDA7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OyAgCi19Ci0KLS8qIERlbGV0ZSBhIGhhc2ggdGFibGUsIGZyZWVpbmcgYWxsIGFsbG9jYXRlZCBtZW1vcnkuICAqLwotCi12b2lkCi1oYXNoX2RpZSAodGFibGUpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlOwotewotICBvYnN0YWNrX2ZyZWUgKCZ0YWJsZS0+bWVtb3J5LCAwKTsKLSAgZnJlZSAodGFibGUpOwotfQotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCi0gICBoYXNoX2VudHJ5LCBvciBOVUxMIGlmIHRoZSBzdHJpbmcgaXMgbm90IGluIHRoZSB0YWJsZS4gIElmIFBMSVNUIGlzCi0gICBub3QgTlVMTCwgdGhpcyBzZXRzICpQTElTVCB0byBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpc3Qgd2hpY2gKLSAgIHdvdWxkIGhvbGQgdGhpcyBoYXNoIGVudHJ5LiAgSWYgUEhBU0ggaXMgbm90IE5VTEwsIHRoaXMgc2V0cyAqUEhBU0gKLSAgIHRvIHRoZSBoYXNoIGNvZGUgZm9yIEtFWS4KLQotICAgRWFjaCB0aW1lIHdlIGxvb2sgdXAgYSBzdHJpbmcsIHdlIG1vdmUgaXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0Ci0gICBmb3IgaXRzIGhhc2ggY29kZSwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgcmVmZXJlbnRpYWwgbG9jYWxpdHkuICAqLwotCi1zdGF0aWMgc3RydWN0IGhhc2hfZW50cnkgKmhhc2hfbG9va3VwIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBoYXNoX2VudHJ5ICoqKiwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKikpOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfZW50cnkgKgotaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksIHBsaXN0LCBwaGFzaCkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgc3RydWN0IGhhc2hfZW50cnkgKioqcGxpc3Q7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBoYXNoOwotewotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICoqbGlzdDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwcmV2OwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPmxvb2t1cHM7Ci0jZW5kaWYKLQotICBoYXNoID0gMDsKLSAgbGVuID0gMDsKLSAgcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGtleTsKLSAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBoYXNoICs9IGMgKyAoYyA8PCAxNyk7Ci0gICAgICBoYXNoIF49IGhhc2ggPj4gMjsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgaGFzaCArPSBsZW4gKyAobGVuIDw8IDE3KTsKLSAgaGFzaCBePSBoYXNoID4+IDI7Ci0KLSAgaWYgKHBoYXNoICE9IE5VTEwpCi0gICAgKnBoYXNoID0gaGFzaDsKLQotICBpbmRleCA9IGhhc2ggJSB0YWJsZS0+c2l6ZTsKLSAgbGlzdCA9IHRhYmxlLT50YWJsZSArIGluZGV4OwotCi0gIGlmIChwbGlzdCAhPSBOVUxMKQotICAgICpwbGlzdCA9IGxpc3Q7Ci0KLSAgcHJldiA9IE5VTEw7Ci0gIGZvciAocCA9ICpsaXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgICAgICsrdGFibGUtPmhhc2hfY29tcGFyZXM7Ci0jZW5kaWYKLQotICAgICAgaWYgKHAtPmhhc2ggPT0gaGFzaCkKLQl7Ci0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0JICArK3RhYmxlLT5zdHJpbmdfY29tcGFyZXM7Ci0jZW5kaWYKLQotCSAgaWYgKHN0cmNtcCAocC0+c3RyaW5nLCBrZXkpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAocHJldiAhPSBOVUxMKQotCQl7Ci0JCSAgcHJldi0+bmV4dCA9IHAtPm5leHQ7Ci0JCSAgcC0+bmV4dCA9ICpsaXN0OwotCQkgICpsaXN0ID0gcDsKLQkJfQotCi0JICAgICAgcmV0dXJuIHA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByZXYgPSBwOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW5zZXJ0IGFuIGVudHJ5IGludG8gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIE5VTEwgb24gc3VjY2Vzcy4KLSAgIE9uIGVycm9yLCBpdCByZXR1cm5zIGEgcHJpbnRhYmxlIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBlcnJvci4gIEl0Ci0gICBpcyBjb25zaWRlcmVkIHRvIGJlIGFuIGVycm9yIGlmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKLSAgIGhhc2ggdGFibGUuICAqLwotCi1jb25zdCBjaGFyICoKLWhhc2hfaW5zZXJ0ICh0YWJsZSwga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0KLSAgcCA9IGhhc2hfbG9va3VwICh0YWJsZSwga2V5LCAmbGlzdCwgJmhhc2gpOwotICBpZiAocCAhPSBOVUxMKQotICAgIHJldHVybiAiZXhpc3RzIjsKLQotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICArK3RhYmxlLT5pbnNlcnRpb25zOwotI2VuZGlmCi0KLSAgcCA9IG9ic3RhY2tfYWxsb2MgKCZ0YWJsZS0+bWVtb3J5LCBzaXplb2YgKnApOwotICBwLT5zdHJpbmcgPSBrZXk7Ci0gIHAtPmhhc2ggPSBoYXNoOwotICBwLT5kYXRhID0gdmFsdWU7Ci0KLSAgcC0+bmV4dCA9ICpsaXN0OwotICAqbGlzdCA9IHA7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEluc2VydCBvciByZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBOVUxMIG9uCi0gICBzdWNjZXNzLiAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlCi0gICBlcnJvci4gIElmIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RzLCBpdHMgdmFsdWUgaXMgcmVwbGFjZWQuICAqLwotCi1jb25zdCBjaGFyICoKLWhhc2hfamFtICh0YWJsZSwga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0KLSAgcCA9IGhhc2hfbG9va3VwICh0YWJsZSwga2V5LCAmbGlzdCwgJmhhc2gpOwotICBpZiAocCAhPSBOVUxMKQotICAgIHsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgICAgICsrdGFibGUtPnJlcGxhY2VtZW50czsKLSNlbmRpZgotCi0gICAgICBwLT5kYXRhID0gdmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICAgICAgKyt0YWJsZS0+aW5zZXJ0aW9uczsKLSNlbmRpZgotCi0gICAgICBwID0gb2JzdGFja19hbGxvYyAoJnRhYmxlLT5tZW1vcnksIHNpemVvZiAqcCk7Ci0gICAgICBwLT5zdHJpbmcgPSBrZXk7Ci0gICAgICBwLT5oYXNoID0gaGFzaDsKLSAgICAgIHAtPmRhdGEgPSB2YWx1ZTsKLQotICAgICAgcC0+bmV4dCA9ICpsaXN0OwotICAgICAgKmxpc3QgPSBwOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgdGhlIG9sZAotICAgdmFsdWUgc3RvcmVkIGZvciB0aGUgZW50cnkuICBJZiB0aGUgZW50cnkgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoCi0gICB0YWJsZSwgdGhpcyBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgTlVMTC4gICovCi0KLVBUUgotaGFzaF9yZXBsYWNlICh0YWJsZSwga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgUFRSIHJldDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksIE5VTEwsIE5VTEwpOwotICBpZiAocCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPnJlcGxhY2VtZW50czsKLSNlbmRpZgotCi0gIHJldCA9IHAtPmRhdGE7Ci0KLSAgcC0+ZGF0YSA9IHZhbHVlOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEZpbmQgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLCByZXR1cm5pbmcgaXRzIHZhbHVlLiAgUmV0dXJucyBOVUxMCi0gICBpZiB0aGUgZW50cnkgaXMgbm90IGZvdW5kLiAgKi8KLQotUFRSCi1oYXNoX2ZpbmQgKHRhYmxlLCBrZXkpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICprZXk7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwOwotCi0gIHAgPSBoYXNoX2xvb2t1cCAodGFibGUsIGtleSwgTlVMTCwgTlVMTCk7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIHAtPmRhdGE7Ci19Ci0KLS8qIERlbGV0ZSBhbiBlbnRyeSBmcm9tIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkCi0gICBmb3IgdGhhdCBlbnRyeSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBzdWNoIGVudHJ5LiAgKi8KLQotUFRSCi1oYXNoX2RlbGV0ZSAodGFibGUsIGtleSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICoqbGlzdDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksICZsaXN0LCBOVUxMKTsKLSAgaWYgKHAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAocCAhPSAqbGlzdCkKLSAgICBhYm9ydCAoKTsKLQotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICArK3RhYmxlLT5kZWxldGlvbnM7Ci0jZW5kaWYKLQotICAqbGlzdCA9IHAtPm5leHQ7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIG5ldmVyIHJlY2xhaW0gdGhlIG1lbW9yeSBmb3IgdGhpcyBlbnRyeS4gIElmIGdhcwotICAgICBldmVyIHN0YXJ0cyBkZWxldGluZyBoYXNoIHRhYmxlIGVudHJpZXMgaW4gYSBiaWcgd2F5LCB0aGlzIHdpbGwKLSAgICAgaGF2ZSB0byBjaGFuZ2UuICAqLwotCi0gIHJldHVybiBwLT5kYXRhOwotfQotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUuICBDYWxsIHRoZSBmdW5jdGlvbiBvbiBldmVyeSBlbnRyeSBpbiB0aGUKLSAgIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1oYXNoX3RyYXZlcnNlICh0YWJsZSwgcGZuKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgdm9pZCAoKnBmbikgUEFSQU1TICgoY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyArK2kpCi0gICAgewotICAgICAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0KLSAgICAgIGZvciAocCA9IHRhYmxlLT50YWJsZVtpXTsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkoKnBmbikgKHAtPnN0cmluZywgcC0+ZGF0YSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBoYXNoIHRhYmxlIHN0YXRpc3RpY3Mgb24gdGhlIHNwZWNpZmllZCBmaWxlLiAgTkFNRSBpcyB0aGUKLSAgIG5hbWUgb2YgdGhlIGhhc2ggdGFibGUsIHVzZWQgZm9yIHByaW50aW5nIGEgaGVhZGVyLiAgKi8KLQotdm9pZAotaGFzaF9wcmludF9zdGF0aXN0aWNzIChmLCBuYW1lLCB0YWJsZSkKLSAgICAgRklMRSAqZiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBsb25nIHRvdGFsOwotICB1bnNpZ25lZCBsb25nIGVtcHR5OwotCi0gIGZwcmludGYgKGYsICIlcyBoYXNoIHN0YXRpc3RpY3M6XG4iLCBuYW1lKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGxvb2t1cHNcbiIsIHRhYmxlLT5sb29rdXBzKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGhhc2ggY29tcGFyaXNvbnNcbiIsIHRhYmxlLT5oYXNoX2NvbXBhcmVzKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IHN0cmluZyBjb21wYXJpc29uc1xuIiwgdGFibGUtPnN0cmluZ19jb21wYXJlcyk7Ci0gIGZwcmludGYgKGYsICJcdCVsdSBpbnNlcnRpb25zXG4iLCB0YWJsZS0+aW5zZXJ0aW9ucyk7Ci0gIGZwcmludGYgKGYsICJcdCVsdSByZXBsYWNlbWVudHNcbiIsIHRhYmxlLT5yZXBsYWNlbWVudHMpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgZGVsZXRpb25zXG4iLCB0YWJsZS0+ZGVsZXRpb25zKTsKLQotICB0b3RhbCA9IDA7Ci0gIGVtcHR5ID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyArK2kpCi0gICAgewotICAgICAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0KLSAgICAgIGlmICh0YWJsZS0+dGFibGVbaV0gPT0gTlVMTCkKLQkrK2VtcHR5OwotICAgICAgZWxzZQotCXsKLQkgIGZvciAocCA9IHRhYmxlLT50YWJsZVtpXTsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkgICAgKyt0b3RhbDsKLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGYsICJcdCVnIGF2ZXJhZ2UgY2hhaW4gbGVuZ3RoXG4iLCAoZG91YmxlKSB0b3RhbCAvIHRhYmxlLT5zaXplKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGVtcHR5IHNsb3RzXG4iLCBlbXB0eSk7Ci0jZW5kaWYKLX0KLQwKLSNpZmRlZiBURVNUCi0KLS8qIFRoaXMgdGVzdCBwcm9ncmFtIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBvbGQgaGFzaCB0YWJsZSBjb2RlLiAgKi8KLQotI2RlZmluZSBUQUJMRVMgKDYpCQkvKiBudW1iZXIgb2YgaGFzaCB0YWJsZXMgdG8gbWFpbnRhaW4gKi8KLQkJCQkvKiAoYXQgb25jZSkgaW4gYW55IHRlc3RpbmcgKi8KLSNkZWZpbmUgU1RBVEJVRlNJWkUgKDEyKQkvKiB3ZSBjYW4gaGF2ZSAxMiBzdGF0aXN0aWNzICovCi0KLWludCBzdGF0YnVmW1NUQVRCVUZTSVpFXTsJLyogZGlzcGxheSBzdGF0aXN0aWNzIGhlcmUgKi8KLWNoYXIgYW5zd2VyWzEwMF07CQkvKiBodW1hbiBmYXJ0cyBoZXJlICovCi1jaGFyICpoYXNodGFibGVbVEFCTEVTXTsJLyogd2UgdGVzdCBtYW55IGhhc2ggdGFibGVzIGF0IG9uY2UgKi8KLWNoYXIgKmg7CQkJLyogcG9pbnRzIHRvIGN1cmVudCBoYXNoX2NvbnRyb2wgKi8KLWNoYXIgKipwcDsKLWNoYXIgKnA7Ci1jaGFyICpuYW1lOwotY2hhciAqdmFsdWU7Ci1pbnQgc2l6ZTsKLWludCB1c2VkOwotY2hhciBjb21tYW5kOwotaW50IG51bWJlcjsJCQkvKiBudW1iZXIgMDpUQUJMRVMtMSBvZiBjdXJyZW50IGhhc2hlZCAqLwotCQkJCS8qIHN5bWJvbCB0YWJsZSAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSAgdm9pZCBhcHBsaWNhdGVlICgpOwotICB2b2lkIGRlc3Ryb3kgKCk7Ci0gIGNoYXIgKndoYXQgKCk7Ci0gIGludCAqaXA7Ci0KLSAgbnVtYmVyID0gMDsKLSAgaCA9IDA7Ci0gIHByaW50ZiAoInR5cGUgaCA8UkVUVVJOPiBmb3IgaGVscFxuIik7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgcHJpbnRmICgiaGFzaF90ZXN0IGNvbW1hbmQ6ICIpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIGNvbW1hbmQgPSBhbnN3ZXJbMF07Ci0gICAgICBpZiAoaXN1cHBlciAoY29tbWFuZCkpCi0JY29tbWFuZCA9IHRvbG93ZXIgKGNvbW1hbmQpOwkvKiBlY2NoISAqLwotICAgICAgc3dpdGNoIChjb21tYW5kKQotCXsKLQljYXNlICcjJzoKLQkgIHByaW50ZiAoIm9sZCBoYXNoIHRhYmxlICM9JWQuXG4iLCBudW1iZXIpOwotCSAgd2hhdHRhYmxlICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAnPyc6Ci0JICBmb3IgKHBwID0gaGFzaHRhYmxlOyBwcCA8IGhhc2h0YWJsZSArIFRBQkxFUzsgcHArKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoImFkZHJlc3Mgb2YgaGFzaCB0YWJsZSAjJWQgY29udHJvbCBibG9jayBpcyAleHhcbiIKLQkJICAgICAgLHBwIC0gaGFzaHRhYmxlLCAqcHApOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIGhhc2hfdHJhdmVyc2UgKGgsIGFwcGxpY2F0ZWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBoYXNoX3RyYXZlcnNlIChoLCBkZXN0cm95KTsKLQkgIGhhc2hfZGllIChoKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgcCA9IGhhc2hfZmluZCAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSk7Ci0JICBwcmludGYgKCJ2YWx1ZSBvZiBcIiVzXCIgaXMgXCIlc1wiXG4iLCBuYW1lLCBwID8gcCA6ICJOT1QtUFJFU0VOVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBwcmludGYgKCIjIHNob3cgb2xkLCBzZWxlY3QgbmV3IGRlZmF1bHQgaGFzaCB0YWJsZSBudW1iZXJcbiIpOwotCSAgcHJpbnRmICgiPyBkaXNwbGF5IGFsbCBoYXNodGFibGUgY29udHJvbCBibG9jayBhZGRyZXNzZXNcbiIpOwotCSAgcHJpbnRmICgiYSBhcHBseSBhIHNpbXBsZSBkaXNwbGF5LWVyIHRvIGVhY2ggc3ltYm9sIGluIHRhYmxlXG4iKTsKLQkgIHByaW50ZiAoImQgZGllOiBkZXN0cm95IGhhc2h0YWJsZVxuIik7Ci0JICBwcmludGYgKCJmIGZpbmQgdmFsdWUgb2Ygbm9taW5hdGVkIHN5bWJvbFxuIik7Ci0JICBwcmludGYgKCJoIHRoaXMgaGVscFxuIik7Ci0JICBwcmludGYgKCJpIGluc2VydCB2YWx1ZSBpbnRvIHN5bWJvbFxuIik7Ci0JICBwcmludGYgKCJqIGphbSB2YWx1ZSBpbnRvIHN5bWJvbFxuIik7Ci0JICBwcmludGYgKCJuIG5ldyBoYXNodGFibGVcbiIpOwotCSAgcHJpbnRmICgiciByZXBsYWNlIGEgdmFsdWUgd2l0aCBhbm90aGVyXG4iKTsKLQkgIHByaW50ZiAoInMgc2F5IHdoYXQgJSUgb2YgdGFibGUgaXMgdXNlZFxuIik7Ci0JICBwcmludGYgKCJxIGV4aXQgdGhpcyBwcm9ncmFtXG4iKTsKLQkgIHByaW50ZiAoInggZGVsZXRlIGEgc3ltYm9sIGZyb20gdGFibGUsIHJlcG9ydCBpdHMgdmFsdWVcbiIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBwID0gaGFzaF9pbnNlcnQgKGgsIG5hbWUgPSB3aGF0ICgic3ltYm9sIiksIHZhbHVlID0gd2hhdCAoInZhbHVlIikpOwotCSAgaWYgKHApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJzeW1ib2w9XCIlc1wiICB2YWx1ZT1cIiVzXCIgIGVycm9yPSVzXG4iLCBuYW1lLCB2YWx1ZSwKLQkJICAgICAgcCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2onOgotCSAgcCA9IGhhc2hfamFtIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpLCB2YWx1ZSA9IHdoYXQgKCJ2YWx1ZSIpKTsKLQkgIGlmIChwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgic3ltYm9sPVwiJXNcIiAgdmFsdWU9XCIlc1wiICBlcnJvcj0lc1xuIiwgbmFtZSwgdmFsdWUsIHApOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGggPSBoYXNodGFibGVbbnVtYmVyXSA9IChjaGFyICopIGhhc2hfbmV3ICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6Ci0JICBleGl0IChFWElUX1NVQ0NFU1MpOwotCWNhc2UgJ3InOgotCSAgcCA9IGhhc2hfcmVwbGFjZSAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSwgdmFsdWUgPSB3aGF0ICgidmFsdWUiKSk7Ci0JICBwcmludGYgKCJvbGQgdmFsdWUgd2FzIFwiJXNcIlxuIiwgcCA/IHAgOiAie30iKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgaGFzaF9zYXkgKGgsIHN0YXRidWYsIFNUQVRCVUZTSVpFKTsKLQkgIGZvciAoaXAgPSBzdGF0YnVmOyBpcCA8IHN0YXRidWYgKyBTVEFUQlVGU0laRTsgaXArKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVkICIsICppcCk7Ci0JICAgIH0KLQkgIHByaW50ZiAoIlxuIik7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIHAgPSBoYXNoX2RlbGV0ZSAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSk7Ci0JICBwcmludGYgKCJvbGQgdmFsdWUgd2FzIFwiJXNcIlxuIiwgcCA/IHAgOiAie30iKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBwcmludGYgKCJJIGNhbid0IHVuZGVyc3RhbmQgY29tbWFuZCBcIiVjXCJcbiIsIGNvbW1hbmQpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotY2hhciAqCi13aGF0IChkZXNjcmlwdGlvbikKLSAgICAgY2hhciAqZGVzY3JpcHRpb247Ci17Ci0gIGNoYXIgKnJldHZhbDsKLSAgY2hhciAqbWFsbG9jICgpOwotCi0gIHByaW50ZiAoIiAgICVzIDogIiwgZGVzY3JpcHRpb24pOwotICBnZXRzIChhbnN3ZXIpOwotICAvKiB3aWxsIG9uZSBkYXkgY2xlYW4gdXAgYW5zd2VyIGhlcmUgKi8KLSAgcmV0dmFsID0gbWFsbG9jIChzdHJsZW4gKGFuc3dlcikgKyAxKTsKLSAgaWYgKCFyZXR2YWwpCi0gICAgewotICAgICAgZXJyb3IgKCJyb29tIik7Ci0gICAgfQotICAodm9pZCkgc3RyY3B5IChyZXR2YWwsIGFuc3dlcik7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQotdm9pZAotZGVzdHJveSAoc3RyaW5nLCB2YWx1ZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBjaGFyICp2YWx1ZTsKLXsKLSAgZnJlZSAoc3RyaW5nKTsKLSAgZnJlZSAodmFsdWUpOwotfQotCi0KLXZvaWQKLWFwcGxpY2F0ZWUgKHN0cmluZywgdmFsdWUpCi0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgY2hhciAqdmFsdWU7Ci17Ci0gIHByaW50ZiAoIiUuMjBzLSUuMjBzXG4iLCBzdHJpbmcsIHZhbHVlKTsKLX0KLQotdm9pZAotd2hhdHRhYmxlICgpCQkJLyogZGV0ZXJtaW5lIG51bWJlcjogd2hhdCBoYXNoIHRhYmxlIHRvIHVzZSAqLwotCQkJICAgICAgICAvKiBhbHNvIGRldGVybWluZSBoOiBwb2ludHMgdG8gaGFzaF9jb250cm9sICovCi17Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwcmludGYgKCIgICB3aGF0IGhhc2ggdGFibGUgKCVkOiVkKSA/ICAiLCAwLCBUQUJMRVMgLSAxKTsKLSAgICAgIGdldHMgKGFuc3dlcik7Ci0gICAgICBzc2NhbmYgKGFuc3dlciwgIiVkIiwgJm51bWJlcik7Ci0gICAgICBpZiAobnVtYmVyID49IDAgJiYgbnVtYmVyIDwgVEFCTEVTKQotCXsKLQkgIGggPSBoYXNodGFibGVbbnVtYmVyXTsKLQkgIGlmICghaCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIndhcm5pbmc6IGN1cnJlbnQgaGFzaC10YWJsZS0jJWQuIGhhcyBubyBoYXNoLWNvbnRyb2xcbiIsIG51bWJlcik7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiaW52YWxpZCBoYXNoIHRhYmxlIG51bWJlcjogJWRcbiIsIG51bWJlcik7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmIC8qICNpZmRlZiBURVNUICovCi0KLS8qIGVuZCBvZiBoYXNoLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9oYXNoLmggYi9nYXMvaGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjU5ZDlmLi4wMDAwMDAwCi0tLSBhL2dhcy9oYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBoYXNoLmggLS0gaGVhZGVyIGZpbGUgZm9yIGdhcyBoYXNoIHRhYmxlIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgSEFTSF9ICi0jZGVmaW5lIEhBU0hfSAotCi1zdHJ1Y3QgaGFzaF9jb250cm9sOwotCi0vKiBDcmVhdGUgYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm4gYSBjb250cm9sIGJsb2NrLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfbmV3IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRGVsZXRlIGEgaGFzaCB0YWJsZSwgZnJlZWluZyBhbGwgYWxsb2NhdGVkIG1lbW9yeS4gICovCi0KLWV4dGVybiB2b2lkIGhhc2hfZGllIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKikpOwotCi0vKiBJbnNlcnQgYW4gZW50cnkgaW50byBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgTlVMTCBvbiBzdWNjZXNzLgotICAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlIGVycm9yLiAgSXQKLSAgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gZXJyb3IgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzIGluIHRoZQotICAgaGFzaCB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpoYXNoX2luc2VydCBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosCi0JCQkJCWNvbnN0IGNoYXIgKmtleSwgUFRSIHZhbHVlKSk7Ci0KLS8qIEluc2VydCBvciByZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBOVUxMIG9uCi0gICBzdWNjZXNzLiAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlCi0gICBlcnJvci4gIElmIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RzLCBpdHMgdmFsdWUgaXMgcmVwbGFjZWQuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqaGFzaF9qYW0gUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLAotCQkJCSAgICAgY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKTsKLQotLyogUmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgdGhlIG9sZAotICAgdmFsdWUgc3RvcmVkIGZvciB0aGUgZW50cnkuICBJZiB0aGUgZW50cnkgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoCi0gICB0YWJsZSwgdGhpcyBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgTlVMTC4gICovCi0KLWV4dGVybiBQVFIgaGFzaF9yZXBsYWNlIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqa2V5LAotCQkJCSBQVFIgdmFsdWUpKTsKLQotLyogRmluZCBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUsIHJldHVybmluZyBpdHMgdmFsdWUuICBSZXR1cm5zIE5VTEwKLSAgIGlmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQuICAqLwotCi1leHRlcm4gUFRSIGhhc2hfZmluZCBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKmtleSkpOwotCi0vKiBEZWxldGUgYW4gZW50cnkgZnJvbSBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZAotICAgZm9yIHRoYXQgZW50cnksIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbnRyeS4gICovCi0KLWV4dGVybiBQVFIgaGFzaF9kZWxldGUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICprZXkpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgQ2FsbCB0aGUgZnVuY3Rpb24gb24gZXZlcnkgZW50cnkgaW4gdGhlCi0gICBoYXNoIHRhYmxlLiAgKi8KLQotZXh0ZXJuIHZvaWQgaGFzaF90cmF2ZXJzZSBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosCi0JCQkJICAgdm9pZCAoKnBmbikgKGNvbnN0IGNoYXIgKmtleSwgUFRSIHZhbHVlKSkpOwotCi0vKiBQcmludCBoYXNoIHRhYmxlIHN0YXRpc3RpY3Mgb24gdGhlIHNwZWNpZmllZCBmaWxlLiAgTkFNRSBpcyB0aGUKLSAgIG5hbWUgb2YgdGhlIGhhc2ggdGFibGUsIHVzZWQgZm9yIHByaW50aW5nIGEgaGVhZGVyLiAgKi8KLQotZXh0ZXJuIHZvaWQgaGFzaF9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJICAgc3RydWN0IGhhc2hfY29udHJvbCAqKSk7Ci0KLSNlbmRpZiAvKiBIQVNIX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9pbnB1dC1maWxlLmMgYi9nYXMvaW5wdXQtZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRmNmY3Li4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyogaW5wdXRfZmlsZS5jIC0gRGVhbCB3aXRoIElucHV0IEZpbGVzIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogQ29uZmluZXMgYWxsIGRldGFpbHMgb2YgcmVhZGluZyBzb3VyY2UgYnl0ZXMgdG8gdGhpcyBtb2R1bGUuCi0gKiBBbGwgTy9TIHNwZWNpZmljIGNyb2NrcyBzaG91bGQgbGl2ZSBoZXJlLgotICogV2hhdCB3ZSBsb3NlIGluICJlZmZpY2llbmN5IiB3ZSBnYWluIGluIG1vZHVsYXJpdHkuCi0gKiBOb3RlIHdlIGRvbid0IG5lZWQgdG8gI2luY2x1ZGUgdGhlICJhcy5oIiBmaWxlLiBObyBjb21tb24gY291cGxpbmchCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKLQotc3RhdGljIGludCBpbnB1dF9maWxlX2dldCBQQVJBTVMgKChjaGFyICosIGludCkpOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIG5vbi16ZXJvIGlmIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyByZWFkIHNob3VsZCBiZQotICAgcHJlcHJvY2Vzc2VkIGJ5IGFwcC4gIEl0IGlzIHplcm8gaWYgdGhlIGZpbGUgY2FuIGJlIHJlYWQgc3RyYWlnaHQgaW4uCi0gICAqLwotaW50IHByZXByb2Nlc3MgPSAwOwotCi0vKgotICogVGhpcyBjb2RlIG9wZW5zIGEgZmlsZSwgdGhlbiBkZWxpdmVycyBCVUZGRVJfU0laRSBjaGFyYWN0ZXIKLSAqIGNodW5rcyBvZiB0aGUgZmlsZSBvbiBkZW1hbmQuCi0gKiBCVUZGRVJfU0laRSBpcyBzdXBwb3NlZCB0byBiZSBhIG51bWJlciBjaG9zZW4gZm9yIHNwZWVkLgotICogVGhlIGNhbGxlciBvbmx5IGFza3Mgb25jZSB3aGF0IEJVRkZFUl9TSVpFIGlzLCBhbmQgYXNrcyBiZWZvcmUKLSAqIHRoZSBuYXR1cmUgb2YgdGhlIGlucHV0IGZpbGVzIChpZiBhbnkpIGlzIGtub3duLgotICovCi0KLSNkZWZpbmUgQlVGRkVSX1NJWkUgKDMyICogMTAyNCkKLQotLyoKLSAqIFdlIHVzZSBzdGF0aWMgZGF0YTogdGhlIGRhdGEgYXJlYSBpcyBub3Qgc2hhcmFibGUuCi0gKi8KLQotc3RhdGljIEZJTEUgKmZfaW47Ci1zdGF0aWMgY2hhciAqZmlsZV9uYW1lOwotCi0vKiBTdHJ1Y3QgZm9yIHNhdmluZyB0aGUgc3RhdGUgb2YgdGhpcyBtb2R1bGUgZm9yIGZpbGUgaW5jbHVkZXMuICAqLwotc3RydWN0IHNhdmVkX2ZpbGUKLSAgewotICAgIEZJTEUgKmZfaW47Ci0gICAgY2hhciAqZmlsZV9uYW1lOwotICAgIGludCBwcmVwcm9jZXNzOwotICAgIGNoYXIgKmFwcF9zYXZlOwotICB9OwotDAotLyogVGhlc2UgaG9va3MgYWNjb21vZGF0ZSBtb3N0IG9wZXJhdGluZyBzeXN0ZW1zLiAqLwotCi12b2lkIAotaW5wdXRfZmlsZV9iZWdpbiAoKQotewotICBmX2luID0gKEZJTEUgKikgMDsKLX0KLQotdm9pZCAKLWlucHV0X2ZpbGVfZW5kICgpCi17Ci19Ci0KLS8qIFJldHVybiBCVUZGRVJfU0laRS4gKi8KLXVuc2lnbmVkIGludCAKLWlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCkKLXsKLSAgcmV0dXJuIChCVUZGRVJfU0laRSk7Ci19Ci0KLWludCAKLWlucHV0X2ZpbGVfaXNfb3BlbiAoKQotewotICByZXR1cm4gZl9pbiAhPSAoRklMRSAqKSAwOwotfQotCi0vKiBQdXNoIHRoZSBzdGF0ZSBvZiBvdXIgaW5wdXQsIHJldHVybmluZyBhIHBvaW50ZXIgdG8gc2F2ZWQgaW5mbyB0aGF0Ci0gICBjYW4gYmUgcmVzdG9yZWQgd2l0aCBpbnB1dF9maWxlX3BvcCAoKS4gICovCi1jaGFyICoKLWlucHV0X2ZpbGVfcHVzaCAoKQotewotICByZWdpc3RlciBzdHJ1Y3Qgc2F2ZWRfZmlsZSAqc2F2ZWQ7Ci0KLSAgc2F2ZWQgPSAoc3RydWN0IHNhdmVkX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpzYXZlZCk7Ci0KLSAgc2F2ZWQtPmZfaW4gPSBmX2luOwotICBzYXZlZC0+ZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotICBzYXZlZC0+cHJlcHJvY2VzcyA9IHByZXByb2Nlc3M7Ci0gIGlmIChwcmVwcm9jZXNzKQotICAgIHNhdmVkLT5hcHBfc2F2ZSA9IGFwcF9wdXNoICgpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7CQkvKiBJbml0aWFsaXplIGZvciBuZXcgZmlsZSAqLwotCi0gIHJldHVybiAoY2hhciAqKSBzYXZlZDsKLX0KLQotdm9pZAotaW5wdXRfZmlsZV9wb3AgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3Qgc2F2ZWRfZmlsZSAqc2F2ZWQgPSAoc3RydWN0IHNhdmVkX2ZpbGUgKikgYXJnOwotCi0gIGlucHV0X2ZpbGVfZW5kICgpOwkJLyogQ2xvc2Ugb3V0IG9sZCBmaWxlICovCi0KLSAgZl9pbiA9IHNhdmVkLT5mX2luOwotICBmaWxlX25hbWUgPSBzYXZlZC0+ZmlsZV9uYW1lOwotICBwcmVwcm9jZXNzID0gc2F2ZWQtPnByZXByb2Nlc3M7Ci0gIGlmIChwcmVwcm9jZXNzKQotICAgIGFwcF9wb3AgKHNhdmVkLT5hcHBfc2F2ZSk7Ci0KLSAgZnJlZSAoYXJnKTsKLX0KLQwKLXZvaWQKLWlucHV0X2ZpbGVfb3BlbiAoZmlsZW5hbWUsIHByZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7CQkvKiAiIiBtZWFucyB1c2Ugc3RkaW4uIE11c3Qgbm90IGJlIDAuICovCi0gICAgIGludCBwcmU7Ci17Ci0gIGludCBjOwotICBjaGFyIGJ1Zls4MF07Ci0KLSAgcHJlcHJvY2VzcyA9IHByZTsKLQotICBhc3NlcnQgKGZpbGVuYW1lICE9IDApOwkvKiBGaWxlbmFtZSBtYXkgbm90IGJlIE5VTEwuICovCi0gIGlmIChmaWxlbmFtZVswXSkKLSAgICB7CQkJCS8qIFdlIGhhdmUgYSBmaWxlIG5hbWUuIFN1Y2sgaXQgYW5kIHNlZS4gKi8KLSAgICAgIGZfaW4gPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0gICAgICBmaWxlX25hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIHVzZSBzdGRpbiBmb3IgdGhlIGlucHV0IGZpbGUuICovCi0gICAgICBmX2luID0gc3RkaW47Ci0gICAgICBmaWxlX25hbWUgPSBfKCJ7c3RhbmRhcmQgaW5wdXR9Iik7CS8qIEZvciBlcnJvciBtZXNzYWdlcy4gKi8KLSAgICB9Ci0gIGlmIChmX2luID09IChGSUxFICopIDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW4ndCBvcGVuICVzIGZvciByZWFkaW5nLiIpLCBmaWxlX25hbWUpOwotICAgICAgYXNfcGVycm9yICgiJXMiLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjID0gZ2V0YyAoZl9pbik7Ci0gIGlmIChjID09ICcjJykKLSAgICB7CQkJCS8qIEJlZ2lucyB3aXRoIGNvbW1lbnQsIG1heSBub3Qgd2FudCB0byBwcmVwcm9jZXNzICovCi0gICAgICBjID0gZ2V0YyAoZl9pbik7Ci0gICAgICBpZiAoYyA9PSAnTicpCi0JewotCSAgZmdldHMgKGJ1ZiwgODAsIGZfaW4pOwotCSAgaWYgKCFzdHJjbXAgKGJ1ZiwgIk9fQVBQXG4iKSkKLQkgICAgcHJlcHJvY2VzcyA9IDA7Ci0JICBpZiAoIXN0cmNociAoYnVmLCAnXG4nKSkKLQkgICAgdW5nZXRjICgnIycsIGZfaW4pOwkvKiBJdCB3YXMgbG9uZ2VyICovCi0JICBlbHNlCi0JICAgIHVuZ2V0YyAoJ1xuJywgZl9pbik7Ci0JfQotICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQotCXVuZ2V0YyAoJ1xuJywgZl9pbik7Ci0gICAgICBlbHNlCi0JdW5nZXRjICgnIycsIGZfaW4pOwotICAgIH0KLSAgZWxzZQotICAgIHVuZ2V0YyAoYywgZl9pbik7Ci19Ci0KLS8qIENsb3NlIGlucHV0IGZpbGUuICAqLwotdm9pZCAKLWlucHV0X2ZpbGVfY2xvc2UgKCkKLXsKLSAgaWYgKGZfaW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmY2xvc2UgKGZfaW4pOwotICAgIH0JCQkJLyogZG9uJ3QgY2xvc2UgYSBudWxsIGZpbGUgcG9pbnRlciAqLwotICBmX2luID0gMDsKLX0JCQkJLyogaW5wdXRfZmlsZV9jbG9zZSgpICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIGRvX3NjcnViX2NoYXJzLiAgKi8KLQotc3RhdGljIGludAotaW5wdXRfZmlsZV9nZXQgKGJ1ZiwgYnVmbGVuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIGludCBzaXplOwotCi0gIHNpemUgPSBmcmVhZCAoYnVmLCBzaXplb2YgKGNoYXIpLCBidWZsZW4sIGZfaW4pOwotICBpZiAoc2l6ZSA8IDApCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJDYW4ndCByZWFkIGZyb20gJXMiKSwgZmlsZV9uYW1lKTsKLSAgICAgIHNpemUgPSAwOwotICAgIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIFJlYWQgYSBidWZmZXIgZnJvbSB0aGUgaW5wdXQgZmlsZS4gICovCi0KLWNoYXIgKgotaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyICh3aGVyZSkKLSAgICAgY2hhciAqd2hlcmU7CQkvKiBXaGVyZSB0byBwbGFjZSAxc3QgY2hhcmFjdGVyIG9mIG5ldyBidWZmZXIuICovCi17Ci0gIGNoYXIgKnJldHVybl92YWx1ZTsJCS8qIC0+IExhc3QgY2hhciBvZiB3aGF0IHdlIHJlYWQsICsgMS4gKi8KLSAgcmVnaXN0ZXIgaW50IHNpemU7Ci0KLSAgaWYgKGZfaW4gPT0gKEZJTEUgKikgMCkKLSAgICByZXR1cm4gMDsKLSAgLyoKLSAgICogZmZsdXNoIChzdGRpbik7IGNvdWxkIGJlIGRvbmUgaGVyZSBpZiB5b3Ugd2FudCB0byBzeW5jaHJvbmlzZQotICAgKiBzdGRpbiBhbmQgc3Rkb3V0LCBmb3IgdGhlIGNhc2Ugd2hlcmUgb3VyIGlucHV0IGZpbGUgaXMgc3RkaW4uCi0gICAqIFNpbmNlIHRoZSBhc3NlbWJsZXIgc2hvdWxkbid0IGRvIGFueSBvdXRwdXQgdG8gc3Rkb3V0LCB3ZQotICAgKiBkb24ndCBib3RoZXIgdG8gc3luY2ggb3V0cHV0IGFuZCBpbnB1dC4KLSAgICovCi0gIGlmIChwcmVwcm9jZXNzKQotICAgIHNpemUgPSBkb19zY3J1Yl9jaGFycyAoaW5wdXRfZmlsZV9nZXQsIHdoZXJlLCBCVUZGRVJfU0laRSk7Ci0gIGVsc2UKLSAgICBzaXplID0gZnJlYWQgKHdoZXJlLCBzaXplb2YgKGNoYXIpLCBCVUZGRVJfU0laRSwgZl9pbik7Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkNhbid0IHJlYWQgZnJvbSAlcyIpLCBmaWxlX25hbWUpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICBpZiAoc2l6ZSkKLSAgICByZXR1cm5fdmFsdWUgPSB3aGVyZSArIHNpemU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZmNsb3NlIChmX2luKSkKLQlhc19wZXJyb3IgKF8oIkNhbid0IGNsb3NlICVzIiksIGZpbGVfbmFtZSk7Ci0gICAgICBmX2luID0gKEZJTEUgKikgMDsKLSAgICAgIHJldHVybl92YWx1ZSA9IDA7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLS8qIGVuZCBvZiBpbnB1dC1maWxlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9pbnB1dC1maWxlLmggYi9nYXMvaW5wdXQtZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjliZjI4Li4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiBpbnB1dF9maWxlLmggaGVhZGVyIGZvciBpbnB1dC1maWxlLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiJpbnB1dF9maWxlLmMiOk9wZXJhdGluZy1zeXN0ZW0gZGVwZW5kYW50IGZ1bmN0aW9ucyB0byByZWFkIHNvdXJjZSBmaWxlcy4qLwotCi0KLS8qCi0gKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgdGhpcyBtb2R1bGUgbXVzdCBwcm92aWRlIHRoZQotICogZm9sbG93aW5nIHNlcnZpY2VzIHRvIGl0cyBjYWxsZXJzLgotICoKLSAqIGlucHV0X2ZpbGVfYmVnaW4oKQkJCUNhbGwgb25jZSBiZWZvcmUgYW55dGhpbmcgZWxzZS4KLSAqCi0gKiBpbnB1dF9maWxlX2VuZCgpCQkJQ2FsbCBvbmNlIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4KLSAqCi0gKiBpbnB1dF9maWxlX2J1ZmZlcl9zaXplKCkJCUNhbGwgYW55dGltZS4gUmV0dXJucyBsYXJnZXN0IHBvc3NpYmxlCi0gKgkJCQkJZGVsaXZlcnkgZnJvbQotICoJCQkJCWlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlcigpLgotICoKLSAqIGlucHV0X2ZpbGVfb3BlbihuYW1lKQkJQ2FsbCBvbmNlIGZvciBlYWNoIGlucHV0IGZpbGUuCi0gKgotICogaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKHdoZXJlKQlDYWxsIG9uY2UgdG8gZ2V0IGVhY2ggbmV3IGJ1ZmZlci4KLSAqCQkJCQlSZXR1cm4gMDogbm8gbW9yZSBjaGFycyBsZWZ0IGluIGZpbGUsCi0gKgkJCQkJICAgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCi0gKgkJCQkJT3RoZXJ3aXNlOiByZXR1cm4gYSBwb2ludGVyIHRvIGp1c3QKLSAqCQkJCQkgICBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgd2UgcmVhZAotICoJCQkJCSAgIGludG8gdGhlIGJ1ZmZlci4KLSAqCQkJCQlJZiB3ZSBjYW4gb25seSByZWFkIDAgY2hhcmFjdGVycywgdGhlbgotICoJCQkJCWVuZC1vZi1maWxlIGlzIGZha2VkLgotICoKLSAqIGlucHV0X2ZpbGVfcHVzaCgpCQkJUHVzaCBzdGF0ZSwgd2hpY2ggY2FuIGJlIHJlc3RvcmVkCi0gKgkJCQkJbGF0ZXIuICBEb2VzIGltcGxpY2l0IGlucHV0X2ZpbGVfYmVnaW4uCi0gKgkJCQkJUmV0dXJucyBjaGFyICogdG8gc2F2ZWQgc3RhdGUuCi0gKgotICogaW5wdXRfZmlsZV9wb3AgKGFyZykJCQlQb3BzIHByZXZpb3VzbHkgc2F2ZWQgc3RhdGUuCi0gKgotICogaW5wdXRfZmlsZV9jbG9zZSAoKQkJCUNsb3NlcyBvcGVuZWQgZmlsZS4KLSAqCi0gKiBBbGwgZXJyb3JzIGFyZSByZXBvcnRlZCAodXNpbmcgYXNfcGVycm9yKSBzbyBjYWxsZXIgZG9lc24ndCBoYXZlIHRvIHRoaW5rCi0gKiBhYm91dCBJL08gZXJyb3JzLiBObyBJL08gZXJyb3JzIGFyZSBmYXRhbDogYW4gZW5kLW9mLWZpbGUgbWF5IGJlIGZha2VkLgotICovCi0KLWNoYXIgKmlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlciBQQVJBTVMgKChjaGFyICp3aGVyZSkpOwotY2hhciAqaW5wdXRfZmlsZV9wdXNoIFBBUkFNUyAoKHZvaWQpKTsKLXVuc2lnbmVkIGludCBpbnB1dF9maWxlX2J1ZmZlcl9zaXplIFBBUkFNUyAoKHZvaWQpKTsKLWludCBpbnB1dF9maWxlX2lzX29wZW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9maWxlX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9jbG9zZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X2ZpbGVfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9vcGVuIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBpbnQgcHJlKSk7Ci12b2lkIGlucHV0X2ZpbGVfcG9wIFBBUkFNUyAoKGNoYXIgKmFyZykpOwotCi0vKiBlbmQgb2YgaW5wdXRfZmlsZS5oICovCmRpZmYgLS1naXQgYS9nYXMvaW5wdXQtc2NydWIuYyBiL2dhcy9pbnB1dC1zY3J1Yi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2JkYWVmLi4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1zY3J1Yi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQzICswLDAgQEAKLS8qIGlucHV0X3NjcnViLmMgLSBCcmVhayB1cCBpbnB1dCBidWZmZXJzIGludG8gd2hvbGUgbnVtYmVycyBvZiBsaW5lcy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgkJLyogTmVlZCB0aGlzIHRvIG1ha2UgZXJybm8gZGVjbGFyYXRpb24gcmlnaHQgKi8KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgImxpc3RpbmcuaCIKLQotLyoKLSAqIE8vUyBpbmRlcGVuZGVudCBtb2R1bGUgdG8gc3VwcGx5IGJ1ZmZlcnMgb2Ygc2FuaXRpc2VkIHNvdXJjZSBjb2RlCi0gKiB0byByZXN0IG9mIGFzc2VtYmxlci4gIFdlIGdldCBzYW5pdGlzZWQgaW5wdXQgZGF0YSBvZiBhcmJpdHJhcnkgbGVuZ3RoLgotICogV2UgYnJlYWsgdGhlc2UgYnVmZmVycyBvbiBsaW5lIGJvdW5kYXJpZXMsIHJlY29tYmluZSBwaWVjZXMgdGhhdAotICogd2VyZSBicm9rZW4gYWNyb3NzIGJ1ZmZlcnMsIGFuZCByZXR1cm4gYSBidWZmZXIgb2YgZnVsbCBsaW5lcyB0bwotICogdGhlIGNhbGxlci4KLSAqIFRoZSBsYXN0IHBhcnRpYWwgbGluZSBiZWdpbnMgdGhlIG5leHQgYnVmZmVyIHdlIGJ1aWxkIGFuZCByZXR1cm4gdG8gY2FsbGVyLgotICogVGhlIGJ1ZmZlciByZXR1cm5lZCB0byBjYWxsZXIgaXMgcHJlY2VlZGVkIGJ5IEJFRk9SRV9TVFJJTkcgYW5kIGZvbGxvd2VkCi0gKiBieSBBRlRFUl9TVFJJTkcsIGFzIHNlbnRpbmVscy4gVGhlIGxhc3QgY2hhcmFjdGVyIGJlZm9yZSBBRlRFUl9TVFJJTkcKLSAqIGlzIGEgbmV3bGluZS4KLSAqIEFsc28gbG9va3MgYWZ0ZXIgbGluZSBudW1iZXJzLCBmb3IgZS5nLiBlcnJvciBtZXNzYWdlcy4KLSAqLwotCi0vKgotICogV2UgZG9uJ3QgY2FyZSBob3cgZmlsdGh5IG91ciBidWZmZXJzIGFyZSwgYnV0IG91ciBjYWxsZXJzIGFzc3VtZQotICogdGhhdCB0aGUgZm9sbG93aW5nIHNhbml0YXRpb24gaGFzIGFscmVhZHkgYmVlbiBkb25lLgotICoKLSAqIE5vIGNvbW1lbnRzLCByZWR1Y2UgYSBjb21tZW50IHRvIGEgc3BhY2UuCi0gKiBSZWR1Y2UgYSB0YWIgdG8gYSBzcGFjZSB1bmxlc3MgaXQgaXMgMXN0IGNoYXIgb2YgbGluZS4KLSAqIEFsbCBtdWx0aXBsZSB0YWJzIGFuZCBzcGFjZXMgY29sbGFwc2VkIGludG8gMSBjaGFyLiBUYWIgb25seQotICogICBsZWdhbCBpZiAxc3QgY2hhciBvZiBsaW5lLgotICogIyBsaW5lIGZpbGUgc3RhdGVtZW50cyBjb252ZXJ0ZWQgdG8gLmxpbmUgeDsuZmlsZSB5OyBzdGF0ZW1lbnRzLgotICogRXNjYXBlZCBuZXdsaW5lcyBhdCBlbmQgb2YgbGluZTogcmVtb3ZlIHRoZW0gYnV0IGFkZCBhcyBtYW55IG5ld2xpbmVzCi0gKiAgIHRvIGVuZCBvZiBzdGF0ZW1lbnQgYXMgeW91IHJlbW92ZWQgaW4gdGhlIG1pZGRsZSwgdG8gc3luY2ggbGluZSBudW1iZXJzLgotICovCi0MCi0jZGVmaW5lIEJFRk9SRV9TVFJJTkcgKCJcbiIpCi0jZGVmaW5lIEFGVEVSX1NUUklORyAoIlwwIikJLyogbWVtY3B5IG9mIDAgY2hhcnMgbWlnaHQgY2hva2UuICovCi0jZGVmaW5lIEJFRk9SRV9TSVpFICgxKQotI2RlZmluZSBBRlRFUl9TSVpFICAoMSkKLQotc3RhdGljIGNoYXIgKmJ1ZmZlcl9zdGFydDsJLyotPjFzdCBjaGFyIG9mIGZ1bGwgYnVmZmVyIGFyZWEuICovCi1zdGF0aWMgY2hhciAqcGFydGlhbF93aGVyZTsJLyotPmFmdGVyIGxhc3QgZnVsbCBsaW5lIGluIGJ1ZmZlci4gKi8KLXN0YXRpYyBpbnQgcGFydGlhbF9zaXplOwkvKiA+PTAuIE51bWJlciBvZiBjaGFycyBpbiBwYXJ0aWFsIGxpbmUgaW4gYnVmZmVyLiAqLwotc3RhdGljIGNoYXIgc2F2ZV9zb3VyY2VbQUZURVJfU0laRV07Ci0vKiBCZWNhdXNlIHdlIG5lZWQgQUZURVJfU1RSSU5HIGp1c3QgYWZ0ZXIgbGFzdCAqLwotLyogZnVsbCBsaW5lLCBpdCBjbG9iYmVycyAxc3QgcGFydCBvZiBwYXJ0aWFsICovCi0vKiBsaW5lLiBTbyB3ZSBwcmVzZXJ2ZSAxc3QgcGFydCBvZiBwYXJ0aWFsICovCi0vKiBsaW5lIGhlcmUuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGJ1ZmZlcl9sZW5ndGg7CS8qIFdoYXQgaXMgdGhlIGxhcmdlc3Qgc2l6ZSBidWZmZXIgdGhhdCAqLwotLyogaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKCkgY291bGQgKi8KLS8qIHJldHVybiB0byB1cz8gKi8KLQotLyogVGhlIGluZGV4IGludG8gYW4gc2Igc3RydWN0dXJlIHdlIGFyZSByZWFkaW5nIGZyb20uICAtMSBpZiBub25lLiAgKi8KLXN0YXRpYyBpbnQgc2JfaW5kZXggPSAtMTsKLQotLyogSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUsIHRoaXMgaXMgaXQuICAqLwotc3RhdGljIHNiIGZyb21fc2I7Ci0KLS8qIFNob3VsZCB3ZSBkbyBhIGNvbmRpdGlvbmFsIGNoZWNrIG9uIGZyb21fc2I/ICovCi1zdGF0aWMgaW50IGZyb21fc2JfaXNfZXhwYW5zaW9uID0gMTsKLQotLyogVGhlIG51bWJlciBvZiBuZXN0ZWQgc2Igc3RydWN0dXJlcyB3ZSBoYXZlIGluY2x1ZGVkLiAgKi8KLWludCBtYWNyb19uZXN0OwotCi0vKiBXZSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHNvdXJjZSBmaWxlIG9wZW4gYXQgb25jZSwgdGhvdWdoIHRoZSBpbmZvIGZvciBhbGwKLSAgIGJ1dCB0aGUgbGF0ZXN0IG9uZSBhcmUgc2F2ZWQgb2ZmIGluIGEgc3RydWN0IGlucHV0X3NhdmUuICBUaGVzZSBmaWxlcyByZW1haW4KLSAgIG9wZW4sIHNvIHdlIGFyZSBsaW1pdGVkIGJ5IHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlcyBhbGxvd2VkIGJ5IHRoZQotICAgdW5kZXJseWluZyBPUy4gV2UgbWF5IGFsc28gc2VxdWVudGlhbGx5IHJlYWQgbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZSBpbiBhbgotICAgYXNzZW1ibHkuICovCi0KLS8qIFdlIG11c3QgdHJhY2sgdGhlIHBoeXNpY2FsIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZvciBlcnJvciBtZXNzYWdlcy4gV2UgYWxzbwotICAgdHJhY2sgYSAibG9naWNhbCIgZmlsZSBhbmQgbGluZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byAoQz8pICBjb21waWxlcgotICAgc291cmNlIGxpbmUgbnVtYmVycy4gIFdoZW5ldmVyIHdlIG9wZW4gYSBmaWxlIHdlIG11c3QgZmlsbCBpbgotICAgcGh5c2ljYWxfaW5wdXRfZmlsZS4gU28gaWYgaXQgaXMgTlVMTCB3ZSBoYXZlIG5vdCBvcGVuZWQgYW55IGZpbGVzIHlldC4gKi8KLQotc3RhdGljIGNoYXIgKnBoeXNpY2FsX2lucHV0X2ZpbGU7Ci1zdGF0aWMgY2hhciAqbG9naWNhbF9pbnB1dF9maWxlOwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBsaW5lX251bWJlclQ7CS8qIDEtb3JpZ2luIGxpbmUgbnVtYmVyIGluIGEgc291cmNlIGZpbGUuICovCi0vKiBBIGxpbmUgZW5kcyBpbiAnXG4nIG9yIGVvZi4gKi8KLQotc3RhdGljIGxpbmVfbnVtYmVyVCBwaHlzaWNhbF9pbnB1dF9saW5lOwotc3RhdGljIGludCBsb2dpY2FsX2lucHV0X2xpbmU7Ci0KLS8qIFN0cnVjdCB1c2VkIHRvIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBpbnB1dCBoYW5kbGVyIGR1cmluZyBpbmNsdWRlIGZpbGVzICovCi1zdHJ1Y3QgaW5wdXRfc2F2ZQotICB7Ci0gICAgY2hhciAqYnVmZmVyX3N0YXJ0OwotICAgIGNoYXIgKnBhcnRpYWxfd2hlcmU7Ci0gICAgaW50IHBhcnRpYWxfc2l6ZTsKLSAgICBjaGFyIHNhdmVfc291cmNlW0FGVEVSX1NJWkVdOwotICAgIHVuc2lnbmVkIGludCBidWZmZXJfbGVuZ3RoOwotICAgIGNoYXIgKnBoeXNpY2FsX2lucHV0X2ZpbGU7Ci0gICAgY2hhciAqbG9naWNhbF9pbnB1dF9maWxlOwotICAgIGxpbmVfbnVtYmVyVCBwaHlzaWNhbF9pbnB1dF9saW5lOwotICAgIGludCBsb2dpY2FsX2lucHV0X2xpbmU7Ci0gICAgaW50IHNiX2luZGV4OwotICAgIHNiIGZyb21fc2I7Ci0gICAgaW50IGZyb21fc2JfaXNfZXhwYW5zaW9uOyAgICAgICAvKiBTaG91bGQgd2UgZG8gYSBjb25kaXRpb25hbCBjaGVjaz8gKi8KLSAgICBzdHJ1Y3QgaW5wdXRfc2F2ZSAqbmV4dF9zYXZlZF9maWxlOwkvKiBDaGFpbiBvZiBpbnB1dF9zYXZlcyAqLwotICAgIGNoYXIgKmlucHV0X2ZpbGVfc2F2ZTsJLyogU2F2ZWQgc3RhdGUgb2YgaW5wdXQgcm91dGluZXMgKi8KLSAgICBjaGFyICpzYXZlZF9wb3NpdGlvbjsJLyogQ2FsbGVyJ3Mgc2F2ZWQgcG9zaXRpb24gaW4gYnVmICovCi0gIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfc2F2ZSAqaW5wdXRfc2NydWJfcHVzaCBQQVJBTVMgKChjaGFyICpzYXZlZF9wb3NpdGlvbikpOwotc3RhdGljIGNoYXIgKmlucHV0X3NjcnViX3BvcCBQQVJBTVMgKChzdHJ1Y3QgaW5wdXRfc2F2ZSAqYXJnKSk7Ci1zdGF0aWMgdm9pZCBhc18xX2NoYXIgUEFSQU1TICgodW5zaWduZWQgaW50IGMsIEZJTEUgKiBzdHJlYW0pKTsKLQotLyogU2F2ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGUgdGhhdCAuaW5jbHVkZSdkIHRoaXMgb25lLiAgV2hlbiB3ZSBoaXQgRU9GLAotICAgd2UgYXV0b21hdGljYWxseSBwb3AgdG8gdGhhdCBmaWxlLiAqLwotCi1zdGF0aWMgc3RydWN0IGlucHV0X3NhdmUgKm5leHRfc2F2ZWRfZmlsZTsKLQotLyogUHVzaCB0aGUgc3RhdGUgb2YgaW5wdXQgcmVhZGluZyBhbmQgc2NydWJiaW5nIHNvIHRoYXQgd2UgY2FuICNpbmNsdWRlLgotICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhICd2b2lkIConIChmdWRnZWQgZm9yIG9sZCBjb21waWxlcnMpIHRvIGEgc2F2ZQotICAgYXJlYSwgd2hpY2ggY2FuIGJlIHJlc3RvcmVkIGJ5IHBhc3NpbmcgaXQgdG8gaW5wdXRfc2NydWJfcG9wKCkuICovCi1zdGF0aWMgc3RydWN0IGlucHV0X3NhdmUgKgotaW5wdXRfc2NydWJfcHVzaCAoc2F2ZWRfcG9zaXRpb24pCi0gICAgIGNoYXIgKnNhdmVkX3Bvc2l0aW9uOwotewotICByZWdpc3RlciBzdHJ1Y3QgaW5wdXRfc2F2ZSAqc2F2ZWQ7Ci0KLSAgc2F2ZWQgPSAoc3RydWN0IGlucHV0X3NhdmUgKikgeG1hbGxvYyAoc2l6ZW9mICpzYXZlZCk7Ci0KLSAgc2F2ZWQtPnNhdmVkX3Bvc2l0aW9uID0gc2F2ZWRfcG9zaXRpb247Ci0gIHNhdmVkLT5idWZmZXJfc3RhcnQgPSBidWZmZXJfc3RhcnQ7Ci0gIHNhdmVkLT5wYXJ0aWFsX3doZXJlID0gcGFydGlhbF93aGVyZTsKLSAgc2F2ZWQtPnBhcnRpYWxfc2l6ZSA9IHBhcnRpYWxfc2l6ZTsKLSAgc2F2ZWQtPmJ1ZmZlcl9sZW5ndGggPSBidWZmZXJfbGVuZ3RoOwotICBzYXZlZC0+cGh5c2ljYWxfaW5wdXRfZmlsZSA9IHBoeXNpY2FsX2lucHV0X2ZpbGU7Ci0gIHNhdmVkLT5sb2dpY2FsX2lucHV0X2ZpbGUgPSBsb2dpY2FsX2lucHV0X2ZpbGU7Ci0gIHNhdmVkLT5waHlzaWNhbF9pbnB1dF9saW5lID0gcGh5c2ljYWxfaW5wdXRfbGluZTsKLSAgc2F2ZWQtPmxvZ2ljYWxfaW5wdXRfbGluZSA9IGxvZ2ljYWxfaW5wdXRfbGluZTsKLSAgc2F2ZWQtPnNiX2luZGV4ID0gc2JfaW5kZXg7Ci0gIHNhdmVkLT5mcm9tX3NiID0gZnJvbV9zYjsKLSAgc2F2ZWQtPmZyb21fc2JfaXNfZXhwYW5zaW9uID0gZnJvbV9zYl9pc19leHBhbnNpb247Ci0gIG1lbWNweSAoc2F2ZWQtPnNhdmVfc291cmNlLCBzYXZlX3NvdXJjZSwgc2l6ZW9mIChzYXZlX3NvdXJjZSkpOwotICBzYXZlZC0+bmV4dF9zYXZlZF9maWxlID0gbmV4dF9zYXZlZF9maWxlOwotICBzYXZlZC0+aW5wdXRfZmlsZV9zYXZlID0gaW5wdXRfZmlsZV9wdXNoICgpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7CQkvKiBSZWluaXRpYWxpemUhICovCi0gIGxvZ2ljYWxfaW5wdXRfbGluZSA9IC0xOwotICBsb2dpY2FsX2lucHV0X2ZpbGUgPSAoY2hhciAqKSBOVUxMOwotICBidWZmZXJfbGVuZ3RoID0gaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKTsKLSAgc2JfaW5kZXggPSAtMTsKLQotICBidWZmZXJfc3RhcnQgPSB4bWFsbG9jICgoQkVGT1JFX1NJWkUgKyBidWZmZXJfbGVuZ3RoICsgYnVmZmVyX2xlbmd0aCArIEFGVEVSX1NJWkUpKTsKLSAgbWVtY3B5IChidWZmZXJfc3RhcnQsIEJFRk9SRV9TVFJJTkcsIChpbnQpIEJFRk9SRV9TSVpFKTsKLQotICByZXR1cm4gc2F2ZWQ7Ci19CQkJCS8qIGlucHV0X3NjcnViX3B1c2goKSAqLwotCi1zdGF0aWMgY2hhciAqCi1pbnB1dF9zY3J1Yl9wb3AgKHNhdmVkKQotICAgICBzdHJ1Y3QgaW5wdXRfc2F2ZSAqc2F2ZWQ7Ci17Ci0gIGNoYXIgKnNhdmVkX3Bvc2l0aW9uOwotCi0gIGlucHV0X3NjcnViX2VuZCAoKTsJCS8qIEZpbmlzaCBvZmYgb2xkIGJ1ZmZlciAqLwotCi0gIGlucHV0X2ZpbGVfcG9wIChzYXZlZC0+aW5wdXRfZmlsZV9zYXZlKTsKLSAgc2F2ZWRfcG9zaXRpb24gPSBzYXZlZC0+c2F2ZWRfcG9zaXRpb247Ci0gIGJ1ZmZlcl9zdGFydCA9IHNhdmVkLT5idWZmZXJfc3RhcnQ7Ci0gIGJ1ZmZlcl9sZW5ndGggPSBzYXZlZC0+YnVmZmVyX2xlbmd0aDsKLSAgcGh5c2ljYWxfaW5wdXRfZmlsZSA9IHNhdmVkLT5waHlzaWNhbF9pbnB1dF9maWxlOwotICBsb2dpY2FsX2lucHV0X2ZpbGUgPSBzYXZlZC0+bG9naWNhbF9pbnB1dF9maWxlOwotICBwaHlzaWNhbF9pbnB1dF9saW5lID0gc2F2ZWQtPnBoeXNpY2FsX2lucHV0X2xpbmU7Ci0gIGxvZ2ljYWxfaW5wdXRfbGluZSA9IHNhdmVkLT5sb2dpY2FsX2lucHV0X2xpbmU7Ci0gIHNiX2luZGV4ID0gc2F2ZWQtPnNiX2luZGV4OwotICBmcm9tX3NiID0gc2F2ZWQtPmZyb21fc2I7Ci0gIGZyb21fc2JfaXNfZXhwYW5zaW9uID0gc2F2ZWQtPmZyb21fc2JfaXNfZXhwYW5zaW9uOwotICBwYXJ0aWFsX3doZXJlID0gc2F2ZWQtPnBhcnRpYWxfd2hlcmU7Ci0gIHBhcnRpYWxfc2l6ZSA9IHNhdmVkLT5wYXJ0aWFsX3NpemU7Ci0gIG5leHRfc2F2ZWRfZmlsZSA9IHNhdmVkLT5uZXh0X3NhdmVkX2ZpbGU7Ci0gIG1lbWNweSAoc2F2ZV9zb3VyY2UsIHNhdmVkLT5zYXZlX3NvdXJjZSwgc2l6ZW9mIChzYXZlX3NvdXJjZSkpOwotCi0gIGZyZWUgKHNhdmVkKTsKLSAgcmV0dXJuIHNhdmVkX3Bvc2l0aW9uOwotfQotDAotCi12b2lkCi1pbnB1dF9zY3J1Yl9iZWdpbiAoKQotewotICBrbm93IChzdHJsZW4gKEJFRk9SRV9TVFJJTkcpID09IEJFRk9SRV9TSVpFKTsKLSAga25vdyAoc3RybGVuIChBRlRFUl9TVFJJTkcpID09IEFGVEVSX1NJWkUgfHwgKEFGVEVSX1NUUklOR1swXSA9PSAnXDAnICYmIEFGVEVSX1NJWkUgPT0gMSkpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7Ci0KLSAgYnVmZmVyX2xlbmd0aCA9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0KLSAgYnVmZmVyX3N0YXJ0ID0geG1hbGxvYyAoKEJFRk9SRV9TSVpFICsgYnVmZmVyX2xlbmd0aCArIGJ1ZmZlcl9sZW5ndGggKyBBRlRFUl9TSVpFKSk7Ci0gIG1lbWNweSAoYnVmZmVyX3N0YXJ0LCBCRUZPUkVfU1RSSU5HLCAoaW50KSBCRUZPUkVfU0laRSk7Ci0KLSAgLyogTGluZSBudW1iZXIgdGhpbmdzLiAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSAtMTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gKGNoYXIgKikgTlVMTDsKLSAgcGh5c2ljYWxfaW5wdXRfZmlsZSA9IE5VTEw7CS8qIE5vIGZpbGUgcmVhZCB5ZXQuICovCi0gIG5leHRfc2F2ZWRfZmlsZSA9IE5VTEw7CS8qIEF0IEVPRiwgZG9uJ3QgcG9wIHRvIGFueSBvdGhlciBmaWxlICovCi0gIGRvX3NjcnViX2JlZ2luIChmbGFnX202OGtfbXJpKTsKLX0KLQotdm9pZAotaW5wdXRfc2NydWJfZW5kICgpCi17Ci0gIGlmIChidWZmZXJfc3RhcnQpCi0gICAgewotICAgICAgZnJlZSAoYnVmZmVyX3N0YXJ0KTsKLSAgICAgIGJ1ZmZlcl9zdGFydCA9IDA7Ci0gICAgICBpbnB1dF9maWxlX2VuZCAoKTsKLSAgICB9Ci19Ci0KLS8qIFN0YXJ0IHJlYWRpbmcgaW5wdXQgZnJvbSBhIG5ldyBmaWxlLiAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIHN0YXJ0IG9mIGNhbGxlcidzIHBhcnQgb2YgYnVmZmVyLiAqLwotaW5wdXRfc2NydWJfbmV3X2ZpbGUgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaW5wdXRfZmlsZV9vcGVuIChmaWxlbmFtZSwgIWZsYWdfbm9fY29tbWVudHMpOwotICBwaHlzaWNhbF9pbnB1dF9maWxlID0gZmlsZW5hbWVbMF0gPyBmaWxlbmFtZSA6IF8oIntzdGFuZGFyZCBpbnB1dH0iKTsKLSAgcGh5c2ljYWxfaW5wdXRfbGluZSA9IDA7Ci0KLSAgcGFydGlhbF9zaXplID0gMDsKLSAgcmV0dXJuIChidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSk7Ci19Ci0KLQotLyogSW5jbHVkZSBhIGZpbGUgZnJvbSB0aGUgY3VycmVudCBmaWxlLiAgU2F2ZSBvdXIgc3RhdGUsIGNhdXNlIGl0IHRvCi0gICBiZSByZXN0b3JlZCBvbiBFT0YsIGFuZCBiZWdpbiBoYW5kbGluZyBhIG5ldyBmaWxlLiAgU2FtZSByZXN1bHQgYXMKLSAgIGlucHV0X3NjcnViX25ld19maWxlLiAqLwotCi1jaGFyICoKLWlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSAoZmlsZW5hbWUsIHBvc2l0aW9uKQotICAgICBjaGFyICpmaWxlbmFtZTsKLSAgICAgY2hhciAqcG9zaXRpb247Ci17Ci0gIG5leHRfc2F2ZWRfZmlsZSA9IGlucHV0X3NjcnViX3B1c2ggKHBvc2l0aW9uKTsKLSAgcmV0dXJuIGlucHV0X3NjcnViX25ld19maWxlIChmaWxlbmFtZSk7Ci19Ci0KLS8qIFN0YXJ0IGdldHRpbmcgaW5wdXQgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUuICBUaGlzIGlzIHVzZWQgd2hlbgotICAgZXhwYW5kaW5nIGEgbWFjcm8uICAqLwotCi12b2lkCi1pbnB1dF9zY3J1Yl9pbmNsdWRlX3NiIChmcm9tLCBwb3NpdGlvbiwgaXNfZXhwYW5zaW9uKQotICAgICBzYiAqZnJvbTsKLSAgICAgY2hhciAqcG9zaXRpb247Ci0gICAgIGludCBpc19leHBhbnNpb247Ci17Ci0gIGlmIChtYWNyb19uZXN0ID4gbWF4X21hY3JvX25lc3QpCi0gICAgYXNfZmF0YWwgKF8oImJ1ZmZlcnMgbmVzdGVkIHRvbyBkZWVwbHkiKSk7Ci0gICsrbWFjcm9fbmVzdDsKLQotI2lmZGVmIG1kX21hY3JvX3N0YXJ0Ci0gIGlmIChpc19leHBhbnNpb24pCi0gICAgewotICAgICAgbWRfbWFjcm9fc3RhcnQgKCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgbmV4dF9zYXZlZF9maWxlID0gaW5wdXRfc2NydWJfcHVzaCAocG9zaXRpb24pOwotCi0gIHNiX25ldyAoJmZyb21fc2IpOwotICBmcm9tX3NiX2lzX2V4cGFuc2lvbiA9IGlzX2V4cGFuc2lvbjsKLSAgaWYgKGZyb20tPmxlbiA+PSAxICYmIGZyb20tPnB0clswXSAhPSAnXG4nKQotICAgIHsKLSAgICAgIC8qIEFkZCB0aGUgc2VudGluZWwgcmVxdWlyZWQgYnkgcmVhZC5jLiAgKi8KLSAgICAgIHNiX2FkZF9jaGFyICgmZnJvbV9zYiwgJ1xuJyk7Ci0gICAgfQotICBzYl9hZGRfc2IgKCZmcm9tX3NiLCBmcm9tKTsKLSAgc2JfaW5kZXggPSAxOwotCi0gIC8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVzZXQgYnkgaW5wdXRfc2NydWJfcHVzaC4gIFJlc3RvcmUgdGhlbQotICAgICBzaW5jZSB3ZSBhcmUsIGFmdGVyIGFsbCwgc3RpbGwgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGhlIGZpbGUuICAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSBuZXh0X3NhdmVkX2ZpbGUtPmxvZ2ljYWxfaW5wdXRfbGluZTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gbmV4dF9zYXZlZF9maWxlLT5sb2dpY2FsX2lucHV0X2ZpbGU7Ci19Ci0KLXZvaWQKLWlucHV0X3NjcnViX2Nsb3NlICgpCi17Ci0gIGlucHV0X2ZpbGVfY2xvc2UgKCk7Ci19Ci0KLWNoYXIgKgotaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKGJ1ZnApCi0gICAgIGNoYXIgKipidWZwOwotewotICByZWdpc3RlciBjaGFyICpsaW1pdDsJCS8qLT5qdXN0IGFmdGVyIGxhc3QgY2hhciBvZiBidWZmZXIuICovCi0KLSAgaWYgKHNiX2luZGV4ID49IDApCi0gICAgewotICAgICAgaWYgKHNiX2luZGV4ID49IGZyb21fc2IubGVuKQotCXsKLQkgIHNiX2tpbGwgKCZmcm9tX3NiKTsKLSAgICAgICAgICBpZiAoZnJvbV9zYl9pc19leHBhbnNpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbmRfZmluaXNoX2NoZWNrIChtYWNyb19uZXN0KTsKLSNpZmRlZiBtZF9tYWNyb19lbmQKLSAgICAgICAgICAgICAgLyogYWxsb3cgdGhlIHRhcmdldCB0byBjbGVhbiB1cCBwZXItbWFjcm8gZXhwYW5zaW9uIGRhdGEgKi8KLSAgICAgICAgICAgICAgbWRfbWFjcm9fZW5kICgpOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgLS1tYWNyb19uZXN0OwotCSAgcGFydGlhbF93aGVyZSA9IE5VTEw7Ci0JICBpZiAobmV4dF9zYXZlZF9maWxlICE9IE5VTEwpCi0JICAgICpidWZwID0gaW5wdXRfc2NydWJfcG9wIChuZXh0X3NhdmVkX2ZpbGUpOwotCSAgcmV0dXJuIHBhcnRpYWxfd2hlcmU7Ci0JfQotCi0gICAgICBwYXJ0aWFsX3doZXJlID0gZnJvbV9zYi5wdHIgKyBmcm9tX3NiLmxlbjsKLSAgICAgIHBhcnRpYWxfc2l6ZSA9IDA7Ci0gICAgICAqYnVmcCA9IGZyb21fc2IucHRyICsgc2JfaW5kZXg7Ci0gICAgICBzYl9pbmRleCA9IGZyb21fc2IubGVuOwotICAgICAgcmV0dXJuIHBhcnRpYWxfd2hlcmU7Ci0gICAgfQotCi0gICpidWZwID0gYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkU7Ci0KLSAgaWYgKHBhcnRpYWxfc2l6ZSkKLSAgICB7Ci0gICAgICBtZW1jcHkgKGJ1ZmZlcl9zdGFydCArIEJFRk9SRV9TSVpFLCBwYXJ0aWFsX3doZXJlLAotCSAgICAgICh1bnNpZ25lZCBpbnQpIHBhcnRpYWxfc2l6ZSk7Ci0gICAgICBtZW1jcHkgKGJ1ZmZlcl9zdGFydCArIEJFRk9SRV9TSVpFLCBzYXZlX3NvdXJjZSwgQUZURVJfU0laRSk7Ci0gICAgfQotICBsaW1pdCA9IGlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlciAoYnVmZmVyX3N0YXJ0Ci0JCQkJICAgICAgICsgQkVGT1JFX1NJWkUKLQkJCQkgICAgICAgKyBwYXJ0aWFsX3NpemUpOwotICBpZiAobGltaXQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgY2hhciAqcDsJCS8qIEZpbmQgbGFzdCBuZXdsaW5lLiAqLwotCi0gICAgICBmb3IgKHAgPSBsaW1pdCAtIDE7ICpwICE9ICdcbic7IC0tcCkKLQk7Ci0gICAgICArK3A7Ci0KLSAgICAgIHdoaWxlIChwIDw9IGJ1ZmZlcl9zdGFydCArIEJFRk9SRV9TSVpFKQotCXsKLQkgIGludCBsaW1vZmY7Ci0KLQkgIGxpbW9mZiA9IGxpbWl0IC0gYnVmZmVyX3N0YXJ0OwotCSAgYnVmZmVyX2xlbmd0aCArPSBpbnB1dF9maWxlX2J1ZmZlcl9zaXplICgpOwotCSAgYnVmZmVyX3N0YXJ0ID0geHJlYWxsb2MgKGJ1ZmZlcl9zdGFydCwKLQkJCQkgICAoQkVGT1JFX1NJWkUKLQkJCQkgICAgKyAyICogYnVmZmVyX2xlbmd0aAotCQkJCSAgICArIEFGVEVSX1NJWkUpKTsKLQkgICpidWZwID0gYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkU7Ci0JICBsaW1pdCA9IGlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlciAoYnVmZmVyX3N0YXJ0ICsgbGltb2ZmKTsKLQotCSAgaWYgKGxpbWl0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJwYXJ0aWFsIGxpbmUgYXQgZW5kIG9mIGZpbGUgaWdub3JlZCIpKTsKLQkgICAgICBwYXJ0aWFsX3doZXJlID0gTlVMTDsKLQkgICAgICBpZiAobmV4dF9zYXZlZF9maWxlKQotCQkqYnVmcCA9IGlucHV0X3NjcnViX3BvcCAobmV4dF9zYXZlZF9maWxlKTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JICBmb3IgKHAgPSBsaW1pdCAtIDE7ICpwICE9ICdcbic7IC0tcCkKLQkgICAgOwotCSAgKytwOwotCX0KLQotICAgICAgcGFydGlhbF93aGVyZSA9IHA7Ci0gICAgICBwYXJ0aWFsX3NpemUgPSBsaW1pdCAtIHA7Ci0gICAgICBtZW1jcHkgKHNhdmVfc291cmNlLCBwYXJ0aWFsX3doZXJlLCAoaW50KSBBRlRFUl9TSVpFKTsKLSAgICAgIG1lbWNweSAocGFydGlhbF93aGVyZSwgQUZURVJfU1RSSU5HLCAoaW50KSBBRlRFUl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwYXJ0aWFsX3doZXJlID0gMDsKLSAgICAgIGlmIChwYXJ0aWFsX3NpemUgPiAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIlBhcnRpYWwgbGluZSBhdCBlbmQgb2YgZmlsZSBpZ25vcmVkIikpOwotCX0KLQotICAgICAgLyogVGVsbCB0aGUgbGlzdGluZyB3ZSd2ZSBmaW5pc2hlZCB0aGUgZmlsZS4gICovCi0gICAgICBMSVNUSU5HX0VPRiAoKTsKLQotICAgICAgLyogSWYgd2Ugc2hvdWxkIHBvcCB0byBhbm90aGVyIGZpbGUgYXQgRU9GLCBkbyBpdC4gKi8KLSAgICAgIGlmIChuZXh0X3NhdmVkX2ZpbGUpCi0JewotCSAgKmJ1ZnAgPSBpbnB1dF9zY3J1Yl9wb3AgKG5leHRfc2F2ZWRfZmlsZSk7CS8qIFBvcCBzdGF0ZSAqLwotCSAgLyogcGFydGlhbF93aGVyZSBpcyBub3cgY29ycmVjdCB0byByZXR1cm4sIHNpbmNlIHdlIHBvcHBlZCBpdC4gKi8KLQl9Ci0gICAgfQotICByZXR1cm4gKHBhcnRpYWxfd2hlcmUpOwotfQkJCQkvKiBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlcigpICovCi0MCi0vKgotICogVGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoaXMgZmlsZSBkZWFscyB3aXRoIGxpbmUgbnVtYmVycywgZXJyb3IKLSAqIG1lc3NhZ2VzIGFuZCBzbyBvbi4KLSAqLwotCi0KLWludAotc2Vlbl9hdF9sZWFzdF8xX2ZpbGUgKCkJCS8qIFRSVUUgaWYgd2Ugb3BlbmVkIGFueSBmaWxlLiAqLwotewotICByZXR1cm4gKHBoeXNpY2FsX2lucHV0X2ZpbGUgIT0gTlVMTCk7Ci19Ci0KLXZvaWQKLWJ1bXBfbGluZV9jb3VudGVycyAoKQotewotICBpZiAoc2JfaW5kZXggPCAwKQotICAgIHsKLSAgICAgICsrcGh5c2ljYWxfaW5wdXRfbGluZTsKLSAgICAgIGlmIChsb2dpY2FsX2lucHV0X2xpbmUgPj0gMCkKLQkrK2xvZ2ljYWxfaW5wdXRfbGluZTsKLSAgICB9Ci19Ci0MCi0vKgotICoJCQluZXdfbG9naWNhbF9saW5lKCkKLSAqCi0gKiBUZWxscyB1cyB3aGF0IHRoZSBuZXcgbG9naWNhbCBsaW5lIG51bWJlciBhbmQgZmlsZSBhcmUuCi0gKiBJZiB0aGUgbGluZV9udW1iZXIgaXMgLTEsIHdlIGRvbid0IGNoYW5nZSB0aGUgY3VycmVudCBsb2dpY2FsIGxpbmUKLSAqIG51bWJlci4gIElmIGl0IGlzIC0yLCB3ZSBkZWNyZW1lbnQgdGhlIGxvZ2ljYWwgbGluZSBudW1iZXIgKHRoaXMgaXMKLSAqIHRvIHN1cHBvcnQgdGhlIC5hcHBmaWxlIHBzZXVkby1vcCBpbnNlcnRlZCBpbnRvIHRoZSBzdHJlYW0gYnkKLSAqIGRvX3NjcnViX2NoYXJzKS4KLSAqIElmIHRoZSBmbmFtZSBpcyBOVUxMLCB3ZSBkb24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgbG9naWNhbCBmaWxlIG5hbWUuCi0gKiBSZXR1cm5zIG5vbnplcm8gaWYgdGhlIGZpbGVuYW1lIGFjdHVhbGx5IGNoYW5nZXMuCi0gKi8KLWludAotbmV3X2xvZ2ljYWxfbGluZSAoZm5hbWUsIGxpbmVfbnVtYmVyKQotICAgICBjaGFyICpmbmFtZTsJCS8qIERPTidUIGRlc3Ryb3kgaXQhIFdlIHBvaW50IHRvIGl0ISAqLwotICAgICBpbnQgbGluZV9udW1iZXI7Ci17Ci0gIGlmIChsaW5lX251bWJlciA+PSAwKQotICAgIGxvZ2ljYWxfaW5wdXRfbGluZSA9IGxpbmVfbnVtYmVyOwotICBlbHNlIGlmIChsaW5lX251bWJlciA9PSAtMiAmJiBsb2dpY2FsX2lucHV0X2xpbmUgPiAwKQotICAgIC0tbG9naWNhbF9pbnB1dF9saW5lOwotCi0gIGlmIChmbmFtZQotICAgICAgJiYgKGxvZ2ljYWxfaW5wdXRfZmlsZSA9PSBOVUxMCi0JICB8fCBzdHJjbXAgKGxvZ2ljYWxfaW5wdXRfZmlsZSwgZm5hbWUpKSkKLSAgICB7Ci0gICAgICBsb2dpY2FsX2lucHV0X2ZpbGUgPSBmbmFtZTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAwOwotfQkJCQkvKiBuZXdfbG9naWNhbF9saW5lKCkgKi8KLQwKLS8qCi0gKgkJCWEgcyBfIHcgaCBlIHIgZSAoKQotICoKLSAqIFJldHVybiB0aGUgY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyLgotICogbmFtZXAgc2hvdWxkIGJlIGNoYXIgKiBjb25zdCAqLCBidXQgdGhlcmUgYXJlIGNvbXBpbGVycyB3aGljaCBzY3JldwotICogdXAgZGVjbGFyYXRpb25zIGxpa2UgdGhhdCwgYW5kIGl0J3MgZWFzaWVyIHRvIGF2b2lkIGl0LgotICovCi12b2lkIAotYXNfd2hlcmUgKG5hbWVwLCBsaW5lcCkKLSAgICAgY2hhciAqKm5hbWVwOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVwOwotewotICBpZiAobG9naWNhbF9pbnB1dF9maWxlICE9IE5VTEwKLSAgICAgICYmIChsaW5lcCA9PSBOVUxMIHx8IGxvZ2ljYWxfaW5wdXRfbGluZSA+PSAwKSkKLSAgICB7Ci0gICAgICAqbmFtZXAgPSBsb2dpY2FsX2lucHV0X2ZpbGU7Ci0gICAgICBpZiAobGluZXAgIT0gTlVMTCkKLQkqbGluZXAgPSBsb2dpY2FsX2lucHV0X2xpbmU7Ci0gICAgfQotICBlbHNlIGlmIChwaHlzaWNhbF9pbnB1dF9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgKm5hbWVwID0gcGh5c2ljYWxfaW5wdXRfZmlsZTsKLSAgICAgIGlmIChsaW5lcCAhPSBOVUxMKQotCSpsaW5lcCA9IHBoeXNpY2FsX2lucHV0X2xpbmU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKm5hbWVwID0gMDsKLSAgICAgIGlmIChsaW5lcCAhPSBOVUxMKQotCSpsaW5lcCA9IDA7Ci0gICAgfQotfQkJCQkvKiBhc193aGVyZSgpICovCi0MCi0KLQotCi0vKgotICoJCQlhIHMgXyBoIG8gdyBtIHUgYyBoICgpCi0gKgotICogT3V0cHV0IHRvIGdpdmVuIHN0cmVhbSBob3cgbXVjaCBvZiBsaW5lIHdlIGhhdmUgc2Nhbm5lZCBzbyBmYXIuCi0gKiBBc3N1bWVzIHdlIGhhdmUgc2Nhbm5lZCB1cCB0byBhbmQgaW5jbHVkaW5nIGlucHV0X2xpbmVfcG9pbnRlci4KLSAqIE5vIGZyZWUgJ1xuJyBhdCBlbmQgb2YgbGluZS4KLSAqLwotdm9pZAotYXNfaG93bXVjaCAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07CQkvKiBPcGVuZWQgZm9yIHdyaXRlIHBsZWFzZS4gKi8KLXsKLSAgcmVnaXN0ZXIgY2hhciAqcDsJCS8qIFNjYW4gaW5wdXQgbGluZS4gKi8KLSAgLyogcmVnaXN0ZXIgY2hhciBjOyBKRiB1bnVzZWQgKi8KLQotICBmb3IgKHAgPSBpbnB1dF9saW5lX3BvaW50ZXIgLSAxOyAqcCAhPSAnXG4nOyAtLXApCi0gICAgewotICAgIH0KLSAgKytwOwkJCQkvKiBwLT4xc3QgY2hhciBvZiBsaW5lLiAqLwotICBmb3IgKDsgcCA8PSBpbnB1dF9saW5lX3BvaW50ZXI7IHArKykKLSAgICB7Ci0gICAgICAvKiBBc3N1bWUgQVNDSUkuIEVCQ0RJQyAmIG90aGVyIG1pY3JvLWNvbXB1dGVyIGNoYXIgc2V0cyBpZ25vcmVkLiAqLwotICAgICAgYXNfMV9jaGFyICgodW5zaWduZWQgY2hhcikgKnAsIHN0cmVhbSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCAKLWFzXzFfY2hhciAoYywgc3RyZWFtKQotICAgICB1bnNpZ25lZCBpbnQgYzsKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBpZiAoYyA+IDEyNykKLSAgICB7Ci0gICAgICAodm9pZCkgcHV0YyAoJyUnLCBzdHJlYW0pOwotICAgICAgYyAtPSAxMjg7Ci0gICAgfQotICBpZiAoYyA8IDMyKQotICAgIHsKLSAgICAgICh2b2lkKSBwdXRjICgnXicsIHN0cmVhbSk7Ci0gICAgICBjICs9ICdAJzsKLSAgICB9Ci0gICh2b2lkKSBwdXRjIChjLCBzdHJlYW0pOwotfQotCi0vKiBlbmQgb2YgaW5wdXRfc2NydWIuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2l0YmwtbGV4LmwgYi9nYXMvaXRibC1sZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwNWRkZC4uMDAwMDAwMAotLS0gYS9nYXMvaXRibC1sZXgubAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKiBpdGJsLWxleC5sCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotJXsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiaXRibC1wYXJzZS5oIgotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgREJHKHgpIHByaW50ZiB4Ci0jZGVmaW5lIE1EQkcoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIERCRyh4KQotI2RlZmluZSBNREJHKHgpCi0jZW5kaWYKLQotaW50IGluc250YmxfbGluZSA9IDE7Ci0lfQotCi1BTE5VTQlbQS1aYS16MC05X10KLURJR0lUCVswLTldCi1BTFBIQQlbQS1aYS16X10KLUhFWAlbMC05QS1GYS1mXQotCi0lJQotCi0iY3JlZyJ8IkNSRUciIHsKLSAgICByZXR1cm4gQ1JFRzsKLSAgfQotImRyZWcifCJEUkVHIiB7Ci0gICAgcmV0dXJuIERSRUc7Ci0gIH0KLSJncmVnInwiR1JFRyIgewotICAgIHJldHVybiBHUkVHOwotICB9Ci0iaW1tZWQifCJJTU1FRCIgewotICAgIHJldHVybiBJTU1FRDsKLSAgfQotImFkZHIifCJBRERSIiB7Ci0gICAgcmV0dXJuIEFERFI7Ci0gIH0KLSJpbnNuInwiSU5TTiIgewotICAgIHJldHVybiBJTlNOOwotICB9Ci0icCJ7RElHSVR9IHsKLSAgICB5eXRleHRbeXlsZW5nXSA9IDA7Ci0gICAgeXlsdmFsLnByb2Nlc3NvciA9IHN0cnRvdWwgKHl5dGV4dCsxLCAwLCAwKTsKLSAgICByZXR1cm4gUE5VTTsKLSAgfQote0RJR0lUfSsgewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwubnVtID0gc3RydG91bCAoeXl0ZXh0LCAwLCAwKTsKLSAgICByZXR1cm4gTlVNOwotICB9Ci0iMHgie0hFWH0rIHsKLSAgICB5eXRleHRbeXlsZW5nXSA9IDA7Ci0gICAgeXlsdmFsLm51bSA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7Ci0gICAgcmV0dXJuIE5VTTsKLSAgfQote0FMUEhBfXtBTE5VTX0qCXsKLSAgICB5eXRleHRbeXlsZW5nXSA9IDA7Ci0gICAgeXlsdmFsLnN0ciA9IHN0cmR1cCAoeXl0ZXh0KTsKLSAgICByZXR1cm4gSUQ7Ci0gIH0KLSI7InwiIyIJewotICAgIGludCBjOwotICAgIHdoaWxlICgoYyA9IGlucHV0ICgpKSAhPSAgRU9GKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKGMgPT0gICdcbicpIAotICAgIAl7Ci0gICAgCQl1bnB1dCAoYyk7Ci0gICAgCQlicmVhazsKLSAgICAJfQotICAgICAgfQotICB9Ci0iXG4iCXsgCi0gICAgaW5zbnRibF9saW5lKys7IAotICAgIE1EQkcgKCgiaW4gbGV4LCBOTCA9ICVkICh4JXgpXG4iLCBOTCwgTkwpKTsKLSAgICByZXR1cm4gTkw7IAotICB9Ci0iICJ8Ilx0IiB7IAotICB9Ci0uIHsKLSAgICBNREJHICgoImNoYXIgPSAleCwgJWRcbiIsIHl5dGV4dFswXSwgeXl0ZXh0WzBdKSk7Ci0gICAgcmV0dXJuIHl5dGV4dFswXTsKLSAgfQotJSUKLQotI2lmbmRlZiB5eXdyYXAKLWludCAKLXl5d3JhcCAoKSAKLSAgeyAKLSAgICByZXR1cm4gMTsgCi0gIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2l0Ymwtb3BzLmMgYi9nYXMvaXRibC1vcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjY2E2MC4uMDAwMDAwMAotLS0gYS9nYXMvaXRibC1vcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNiArMCwwIEBACi0vKiBpdGJsLW9wcy5jCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotICogSGVyZWluIGxpZXMgdGhlIHN1cHBvcnQgZm9yIGR5bmFtaWMgc3BlY2lmaWNhdGlvbiBvZiBwcm9jZXNzb3IKLSAqIGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzLiAgTW5lbW9uaWNzLCB2YWx1ZXMsIGFuZCBmb3JtYXRzIGZvciBlYWNoCi0gKiBpbnN0cnVjdGlvbiBhbmQgcmVnaXN0ZXIgYXJlIHNwZWNpZmllZCBpbiBhbiBhc2NpaSBmaWxlIGNvbnNpc3Rpbmcgb2YKLSAqIHRhYmxlIGVudHJpZXMuICBUaGUgZ3JhbW1hciBmb3IgdGhlIHRhYmxlIGlzIGRlZmluZWQgaW4gdGhlIGRvY3VtZW50Ci0gKiAiUHJvY2Vzc29yIGluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24iLgotICoKLSAqIEluc3RydWN0aW9ucyB1c2UgdGhlIGdudSBhc3NlbWJsZXIgc3ludGF4LCB3aXRoIHRoZSBhZGRpdGlvbiBvZgotICogYWxsb3dpbmcgbW5lbW9uaWNzIGZvciByZWdpc3Rlci4KLSAqIEVnLiAiZnVuYyAkMixyZWczLDB4MTAwLHN5bWJvbCA7IGNvbW1lbnQiCi0gKiAJZnVuYyAtIG9wY29kZSBuYW1lCi0gKiAJJG4gLSByZWdpc3RlciBuCi0gKiAJcmVnMyAtIG1uZW1vbmljIGZvciBwcm9jZXNzb3IncyByZWdpc3RlciBkZWZpbmVkIGluIHRhYmxlCi0gKiAJMHhkZGQuLmQgLSBpbW1lZGlhdGUgdmFsdWUKLSAqIAlzeW1ib2wgLSBhZGRyZXNzIG9mIGxhYmVsIG9yIGV4dGVybmFsIHN5bWJvbAotICoKLSAqIEZpcnN0LCBpdGJsX3BhcnNlIHJlYWRzIGluIHRoZSB0YWJsZSBvZiByZWdpc3RlciBhbmQgaW5zdHJ1Y3Rpb24KLSAqIG5hbWVzIGFuZCBmb3JtYXRzLCBhbmQgYnVpbGRzIGEgbGlzdCBvZiBlbnRyaWVzIGZvciBlYWNoCi0gKiBwcm9jZXNzb3IvdHlwZSBjb21iaW5hdGlvbi4gIGxleCBhbmQgeWFjYyBhcmUgdXNlZCB0byBwYXJzZQotICogdGhlIGVudHJpZXMgaW4gdGhlIHRhYmxlIGFuZCBjYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgdG8KLSAqIGFkZCBlYWNoIGVudHJ5IHRvIG91ciBsaXN0LgotICoKLSAqIFRoZW4sIHdoZW4gYXNzZW1ibGluZyBvciBkaXNhc3NlbWJsaW5nLCB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCB0bwotICogMSkgZ2V0IGluZm9ybWF0aW9uIG9uIGEgcHJvY2Vzc29yJ3MgcmVnaXN0ZXJzIGFuZAotICogMikgYXNzZW1ibGUvZGlzYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24uCi0gKiBUbyBhc3NlbWJsZShkaXNhc3NlbWJsZSkgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBmdW5jdGlvbgotICogaXRibF9hc3NlbWJsZShpdGJsX2Rpc2Fzc2VtYmxlKSBpcyBjYWxsZWQgdG8gc2VhcmNoIHRoZSBsaXN0IG9mCi0gKiBpbnN0cnVjdGlvbiBlbnRyaWVzLCBhbmQgaWYgYSBtYXRjaCBpcyBmb3VuZCwgdXNlcyB0aGUgZm9ybWF0Ci0gKiBkZXNjcmliZWQgaW4gdGhlIGluc3RydWN0aW9uIGVudHJ5IHN0cnVjdHVyZSB0byBjb21wbGV0ZSB0aGUgYWN0aW9uLgotICoKLSAqIEVnLiBTdXBwb3NlIHdlIGhhdmUgYSBNaXBzIGNvcHJvY2Vzc29yICJjb3AzIiB3aXRoIGRhdGEgcmVnaXN0ZXIgImQyIgotICogYW5kIHdlIHdhbnQgdG8gZGVmaW5lIGZ1bmN0aW9uICJwaWciIHdoaWNoIHRha2VzIHR3byBvcGVyYW5kcy4KLSAqCi0gKiBHaXZlbiB0aGUgdGFibGUgZW50cmllczoKLSAqIAkicDMgaW5zbiBwaWcgMHgxOjI0LTIxIGRyZWc6MjAtMTYgaW1tZWQ6MTUtMCIKLSAqIAkicDMgZHJlZyBkMiAweDIiCi0gKiBhbmQgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgZm9yIGNvcHJvY2Vzc29yIHB6IGhhcyBlbmNvZGluZzoKLSAqIAkjZGVmaW5lIE1JUFNfRU5DT0RFX0NPUF9OVU0oeikgKCgweDIxfCh6PDwxKSk8PDI1KQotICogCSNkZWZpbmUgSVRCTF9FTkNPREVfUE5VTShwbnVtKSBNSVBTX0VOQ09ERV9DT1BfTlVNKHBudW0pCi0gKgotICogYSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhlIGluc3RydWN0aW9uIG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2U6Ci0gKiAgICAgIHN0cnVjdCBpdGJsX2VudHJ5ID0gewotICogICAgICBlX3Byb2Nlc3NvciBwcm9jZXNzb3IgPSBlX3AzCi0gKiAgICAgIGVfdHlwZSB0eXBlID0gZV9pbnNuCi0gKiAgICAgIGNoYXIgKm5hbWUgPSAicGlnIgotICogICAgICB1aW50IHZhbHVlID0gMHgxCi0gKiAgICAgIHVpbnQgZmxhZ3MgPSAwCi0gKiAgICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlID0gMjQtMjEKLSAqICAgICAgc3RydWN0IGl0YmxfZmllbGQgKmZpZWxkID0gewotICogICAgICAgICAgICAgIGVfdHlwZSB0eXBlID0gZV9kcmVnCi0gKiAgICAgICAgICAgICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2UgPSAyMC0xNgotICogICAgICAgICAgICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpuZXh0ID0gewotICogICAgICAgICAgICAgICAgICAgICAgZV90eXBlIHR5cGUgPSBlX2ltbWVkCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZSA9IDE1LTAKLSAqICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpuZXh0ID0gMAotICogICAgICAgICAgICAgICAgICAgICAgfTsKLSAqICAgICAgICAgICAgICB9OwotICogICAgICBzdHJ1Y3QgaXRibF9lbnRyeSAqbmV4dCA9IDAKLSAqICAgICAgfTsKLSAqCi0gKiBBbmQgdGhlIGFzc2VtYmxlciBpbnN0cnVjdGlvbnM6Ci0gKiAJInBpZyBkMiwweDEwMCIKLSAqIAkicGlnICQyLDB4MTAwIgotICoKLSAqIHdvdWxkIGJvdGggYXNzZW1ibGUgdG8gdGhlIGhleCB2YWx1ZToKLSAqIAkiMHg0ZTIyMDEwMCIKLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLSNpbmNsdWRlICJpdGJsLXBhcnNlLmgiCi0KLS8qICNkZWZpbmUgREVCVUcgKi8KLQotI2lmZGVmIERFQlVHCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZGVmaW5lIEFTU0VSVCh4KSBhc3NlcnQoeCkKLSNkZWZpbmUgREJHKHgpIHByaW50ZiB4Ci0jZWxzZQotI2RlZmluZSBBU1NFUlQoeCkKLSNkZWZpbmUgREJHKHgpCi0jZW5kaWYKLQotI2lmbmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKGE8Yj9hOmIpCi0jZW5kaWYKLQotaW50IGl0YmxfaGF2ZV9lbnRyaWVzID0gMDsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIHN0cnVjdHVyZXMgZm9yIGtlZXBpbmcgaXRibCBmb3JtYXQgZW50cmllcyAqLwotCi1zdHJ1Y3QgaXRibF9yYW5nZQotICB7Ci0gICAgaW50IHNiaXQ7CQkJLyogbWFzayBzdGFydGluZyBiaXQgcG9zaXRpb24gKi8KLSAgICBpbnQgZWJpdDsJCQkvKiBtYXNrIGVuZGluZyBiaXQgcG9zaXRpb24gKi8KLSAgfTsKLQotc3RydWN0IGl0YmxfZmllbGQKLSAgewotICAgIGVfdHlwZSB0eXBlOwkJLyogZHJlZy9jcmVnL2dyZWcvaW1tZWQvc3ltYiAqLwotICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlOwkvKiBmaWVsZCdzIGJpdGZpZWxkIHJhbmdlIHdpdGhpbiBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIGZpZWxkIGZsYWdzICovCi0gICAgc3RydWN0IGl0YmxfZmllbGQgKm5leHQ7CS8qIG5leHQgZmllbGQgaW4gbGlzdCAqLwotICB9OwotCi0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgZGVmaW5lIHRoZSBpbnN0cnVjdGlvbnMgYW5kIHJlZ2lzdGVycyBmb3IgYSBwcm9jZXNzb3IuCi0gKiBJZiB0aGUgdHlwZSBpcyBhbiBpbnN0cnVjdGlvbiwgdGhlIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgYW4KLSAqIGluc3RydWN0aW9uIHdoZXJlIHRoZSBmaWVsZHMgYXJlIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotICogVGhlIGZsYWdzIGZpZWxkIGJlbG93IHVzZXMgdGhlIHNhbWUgdmFsdWVzIGFzIHRob3NlIGRlZmluZWQgaW4gdGhlCi0gKiBnbnUgYXNzZW1ibGVyIGFuZCBhcmUgbWFjaGluZSBzcGVjaWZpYy4gKi8KLXN0cnVjdCBpdGJsX2VudHJ5Ci0gIHsKLSAgICBlX3Byb2Nlc3NvciBwcm9jZXNzb3I7CS8qIHByb2Nlc3NvciBudW1iZXIgKi8KLSAgICBlX3R5cGUgdHlwZTsJCS8qIGRyZWcvY3JlZy9ncmVnL2luc24gKi8KLSAgICBjaGFyICpuYW1lOwkJCS8qIG1uZW1pb25pYyBuYW1lIGZvciBpbnNuL3JlZ2lzdGVyICovCi0gICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsJLyogb3Bjb2RlL2luc3RydWN0aW9uIG1hc2svcmVnaXN0ZXIgbnVtYmVyICovCi0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsJLyogZWZmZWN0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZTsJLyogYml0IHJhbmdlIHdpdGhpbiBpbnN0cnVjdGlvbiBmb3IgdmFsdWUgKi8KLSAgICBzdHJ1Y3QgaXRibF9maWVsZCAqZmllbGRzOwkvKiBsaXN0IG9mIG9wZXJhbmQgZGVmaW5pdGlvbnMgKGlmIGFueSkgKi8KLSAgICBzdHJ1Y3QgaXRibF9lbnRyeSAqbmV4dDsJLyogbmV4dCBlbnRyeSAqLwotICB9OwotCi0KLS8qIGxvY2FsIGRhdGEgYW5kIHN0cnVjdHVyZXMgKi8KLQotc3RhdGljIGludCBpdGJsX251bV9vcGNvZGVzID0gMDsKLS8qIEFycmF5IG9mIGVudHJpZXMgZm9yIGVhY2ggcHJvY2Vzc29yIGFuZCBlbnRyeSB0eXBlICovCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmVudHJpZXNbZV9ucHJvY3NdW2VfbnR5cGVzXSA9Ci17Ci0gIHswLCAwLCAwLCAwLCAwLCAwfSwKLSAgezAsIDAsIDAsIDAsIDAsIDB9LAotICB7MCwgMCwgMCwgMCwgMCwgMH0sCi0gIHswLCAwLCAwLCAwLCAwLCAwfQotfTsKLQotLyogbG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVpbGRfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCBpdGJsX2VudHJ5ICplKSk7Ci1zdGF0aWMgZV90eXBlIGdldF90eXBlIFBBUkFNUyAoKGludCB5eXR5cGUpKTsKLXN0YXRpYyBlX3Byb2Nlc3NvciBnZXRfcHJvY2Vzc29yIFBBUkFNUyAoKGludCB5eXByb2MpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqKmdldF9lbnRyaWVzIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgCi0JCQkJCQllX3R5cGUgdHlwZSkpOwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICpmaW5kX2VudHJ5X2J5bmFtZSBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAotCQkJCQllX3R5cGUgdHlwZSwgY2hhciAqbmFtZSkpOwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICpmaW5kX2VudHJ5X2J5dmFsIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgCi0JCQllX3R5cGUgdHlwZSwgdW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBpdGJsX3JhbmdlICpyKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmFsbG9jX2VudHJ5IFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgCi0JCWVfdHlwZSB0eXBlLCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHZhbHVlKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBhcHBseV9yYW5nZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHZhbHVlLCAKLQkJCQkJCXN0cnVjdCBpdGJsX3JhbmdlIHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGV4dHJhY3RfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyB2YWx1ZSwgCi0JCQkJCQlzdHJ1Y3QgaXRibF9yYW5nZSByKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZmllbGQgKmFsbG9jX2ZpZWxkIFBBUkFNUyAoKGVfdHlwZSB0eXBlLCBpbnQgc2JpdCwgCi0JCQkJCWludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEludGVyZmFjZXMgdG8gdGhlIHBhcnNlciAqLwotCi0KLS8qIE9wZW4gdGhlIHRhYmxlIGFuZCB1c2UgbGV4IGFuZCB5YWNjIHRvIHBhcnNlIHRoZSBlbnRyaWVzLgotICogUmV0dXJuIDEgZm9yIGZhaWx1cmU7IDAgZm9yIHN1Y2Nlc3MuICAqLwotCi1pbnQgCi1pdGJsX3BhcnNlIChjaGFyICppbnNudGJsKQotewotICBleHRlcm4gRklMRSAqeXlpbjsKLSAgZXh0ZXJuIGludCB5eXBhcnNlICh2b2lkKTsKLSAgeXlpbiA9IGZvcGVuIChpbnNudGJsLCAiciIpOwotICBpZiAoeXlpbiA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIkNhbid0IG9wZW4gcHJvY2Vzc29yIGluc3RydWN0aW9uIHNwZWNpZmljYXRpb24gZmlsZSBcIiVzXCJcbiIsCi0JICAgICAgaW5zbnRibCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoeXlwYXJzZSAoKSk7Ci0gICAgfQotICBmY2xvc2UgKHl5aW4pOwotICBpdGJsX2hhdmVfZW50cmllcyA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBBZGQgYSByZWdpc3RlciBlbnRyeSAqLwotCi1zdHJ1Y3QgaXRibF9lbnRyeSAqCi1pdGJsX2FkZF9yZWcgKGludCB5eXByb2Nlc3NvciwgaW50IHl5dHlwZSwgY2hhciAqcmVnbmFtZSwKLQkgICAgICBpbnQgcmVnbnVtKQotewotI2lmIDAJCQkJCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzeW1ib2xzLmgiCi0gIC8qIFNpbmNlIHJlZ2lzdGVyIG5hbWVzIGRvbid0IGhhdmUgYSBwcmVmaXgsIHdlIHB1dCB0aGVtIGluIHRoZSBzeW1ib2wgdGFibGUgc28KLSAgICAgdGhleSBjYW4ndCBiZSB1c2VkIGFzIHN5bWJvbHMuICBUaGlzIGFsc28gc2ltcGxpZmllcyBhcmd1bWVudCBwYXJzaW5nIGFzCi0gICAgIHdlIGNhbiBsZXQgZ2FzIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuICBUaGUgcmVjb3JkZWQgcmVnaXN0ZXIgbnVtYmVyIGlzCi0gICAgIHJlZ251bS4gICovCi0gIC8qIFVzZSBzeW1ib2xfY3JlYXRlIGhlcmUgaW5zdGVhZCBvZiBzeW1ib2xfbmV3IHNvIHdlIGRvbid0IHRyeSB0bwotICAgICBvdXRwdXQgcmVnaXN0ZXJzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLiAgKi8KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX2NyZWF0ZSAocmVnbmFtZSwgcmVnX3NlY3Rpb24sCi0JCQkJICAgICAgcmVnbnVtLCAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSNlbmRpZgotICByZXR1cm4gYWxsb2NfZW50cnkgKGdldF9wcm9jZXNzb3IgKHl5cHJvY2Vzc29yKSwgZ2V0X3R5cGUgKHl5dHlwZSksIHJlZ25hbWUsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSByZWdudW0pOwotfQotCi0vKiBBZGQgYW4gaW5zdHJ1Y3Rpb24gZW50cnkgKi8KLQotc3RydWN0IGl0YmxfZW50cnkgKgotaXRibF9hZGRfaW5zbiAoaW50IHl5cHJvY2Vzc29yLCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHZhbHVlLAotCSAgICAgICBpbnQgc2JpdCwgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplOwotICBlID0gYWxsb2NfZW50cnkgKGdldF9wcm9jZXNzb3IgKHl5cHJvY2Vzc29yKSwgZV9pbnNuLCBuYW1lLCB2YWx1ZSk7Ci0gIGlmIChlKQotICAgIHsKLSAgICAgIGUtPnJhbmdlLnNiaXQgPSBzYml0OwotICAgICAgZS0+cmFuZ2UuZWJpdCA9IGViaXQ7Ci0gICAgICBlLT5mbGFncyA9IGZsYWdzOwotICAgICAgaXRibF9udW1fb3Bjb2RlcysrOwotICAgIH0KLSAgcmV0dXJuIGU7Ci19Ci0KLS8qIEFkZCBhbiBvcGVyYW5kIHRvIGFuIGluc3RydWN0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCBpdGJsX2ZpZWxkICoKLWl0YmxfYWRkX29wZXJhbmQgKHN0cnVjdCBpdGJsX2VudHJ5ICplLCBpbnQgeXl0eXBlLCBpbnQgc2JpdCwKLQkJICBpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmYsICoqbGFzdF9mOwotICBpZiAoIWUpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIEFkZCB0byBlbmQgb2YgZmllbGRzJyBsaXN0LiAqLwotICBmID0gYWxsb2NfZmllbGQgKGdldF90eXBlICh5eXR5cGUpLCBzYml0LCBlYml0LCBmbGFncyk7Ci0gIGlmIChmKQotICAgIHsKLSAgICAgIGxhc3RfZiA9ICZlLT5maWVsZHM7Ci0gICAgICB3aGlsZSAoKmxhc3RfZikKLQlsYXN0X2YgPSAmKCpsYXN0X2YpLT5uZXh0OwotICAgICAgKmxhc3RfZiA9IGY7Ci0gICAgICBmLT5uZXh0ID0gMDsKLSAgICB9Ci0gIHJldHVybiBmOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBJbnRlcmZhY2VzIGZvciBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciAqLwotCi0jaWZuZGVmIFNUQU5EX0FMT05FCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzeW1ib2xzLmgiCi1zdGF0aWMgdm9pZCBhcHBlbmRfaW5zbnNfYXNfbWFjcm9zICh2b2lkKTsKLQotLyogaW5pdGlhbGl6ZSBmb3IgZ2FzICovCi12b2lkIAotaXRibF9pbml0ICh2b2lkKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLSAgZV9wcm9jZXNzb3IgcHJvY247Ci0gIGVfdHlwZSB0eXBlOwotCi0gIGlmICghaXRibF9oYXZlX2VudHJpZXMpCi0JcmV0dXJuOwotCi0gIC8qIFNpbmNlIHJlZ2lzdGVyIG5hbWVzIGRvbid0IGhhdmUgYSBwcmVmaXgsIHB1dCB0aGVtIGluIHRoZSBzeW1ib2wgdGFibGUgc28KLSAgICAgdGhleSBjYW4ndCBiZSB1c2VkIGFzIHN5bWJvbHMuICBUaGlzIHNpbXBsaWZpZXMgYXJndW1lbnQgcGFyc2luZyBhcwotICAgICB3ZSBjYW4gbGV0IGdhcyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLiAqLwotICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBpbnN0ZWFkIG9mIHN5bWJvbF9uZXcgc28gd2UgZG9uJ3QgdHJ5IHRvCi0gICAgIG91dHB1dCByZWdpc3RlcnMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuICAqLwotCi0gIGZvciAodHlwZSA9IGVfcmVndHlwZTA7IHR5cGUgPCBlX25yZWd0eXBlczsgdHlwZSsrKQotICAgIGZvciAocHJvY24gPSBlX3AwOyBwcm9jbiA8IGVfbnByb2NzOyBwcm9jbisrKQotICAgICAgewotCWVzID0gZ2V0X2VudHJpZXMgKHByb2NuLCB0eXBlKTsKLQlmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQotCSAgewotCSAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChlLT5uYW1lLCByZWdfc2VjdGlvbiwKLQkJCQkJICAgICBlLT52YWx1ZSwgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0JICB9Ci0gICAgICB9Ci0gIGFwcGVuZF9pbnNuc19hc19tYWNyb3MgKCk7Ci19Ci0KLQotLyogQXBwZW5kIGluc25zIHRvIG9wY29kZXMgdGFibGUgYW5kIGluY3JlYXNlIG51bWJlciBvZiBvcGNvZGVzIAotICogU3RydWN0dXJlIG9mIG9wY29kZXMgdGFibGU6IAotICogc3RydWN0IGl0Ymxfb3Bjb2RlCi0gKiB7Ci0gKiAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gKiAgIGNvbnN0IGNoYXIgKmFyZ3M7IAkJLSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYXJndW1lbnRzLiAgCi0gKiAgIHVuc2lnbmVkIGxvbmcgbWF0Y2g7IAktIG9wY29kZSwgb3IgSVNBIGxldmVsIGlmIHBpbmZvPUlOU05fTUFDUk8gCi0gKiAgIHVuc2lnbmVkIGxvbmcgbWFzazsgCS0gb3Bjb2RlIG1hc2ssIG9yIG1hY3JvIGlkIGlmIHBpbmZvPUlOU05fTUFDUk8gCi0gKiAgIHVuc2lnbmVkIGxvbmcgcGluZm87IAktIGluc24gZmxhZ3MsIG9yIElOU05fTUFDUk8gCi0gKiB9OwotICogZXhhbXBsZXM6Ci0gKgl7ImxpIiwgICAgICAidCxpIiwgIDB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QgICAgfSwKLSAqCXsibGkiLCAgICAgICJ0LEkiLCAgMCwgICAgKGludCkgTV9MSSwgICBJTlNOX01BQ1JPICB9LAotICovCi0KLXN0YXRpYyBjaGFyICpmb3JtX2FyZ3MgKHN0cnVjdCBpdGJsX2VudHJ5ICplKTsKLXN0YXRpYyB2b2lkIAotYXBwZW5kX2luc25zX2FzX21hY3JvcyAodm9pZCkKLXsKLSAgc3RydWN0IElUQkxfT1BDT0RFX1NUUlVDVCAqbmV3X29wY29kZXMsICpvOwotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLSAgaW50IG4sIGlkLCBzaXplLCBuZXdfc2l6ZSwgbmV3X251bV9vcGNvZGVzOwotCi0gIGlmICghaXRibF9oYXZlX2VudHJpZXMpCi0JcmV0dXJuOwotCi0gIGlmICghaXRibF9udW1fb3Bjb2RlcykJLyogbm8gbmV3IGluc3RydWN0aW9ucyB0byBhZGQhICovCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgREJHICgoInByZXZpb3VzIG51bV9vcGNvZGVzPSVkXG4iLCBJVEJMX05VTV9PUENPREVTKSk7Ci0KLSAgbmV3X251bV9vcGNvZGVzID0gSVRCTF9OVU1fT1BDT0RFUyArIGl0YmxfbnVtX29wY29kZXM7Ci0gIEFTU0VSVCAobmV3X251bV9vcGNvZGVzID49IGl0YmxfbnVtX29wY29kZXMpOwotCi0gIHNpemUgPSBzaXplb2YgKHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QpICogSVRCTF9OVU1fT1BDT0RFUzsKLSAgQVNTRVJUIChzaXplID49IDApOwotICBEQkcgKCgiSSBnZXQ9JWRcbiIsIHNpemUgLyBzaXplb2YgKElUQkxfT1BDT0RFU1swXSkpKTsKLQotICBuZXdfc2l6ZSA9IHNpemVvZiAoc3RydWN0IElUQkxfT1BDT0RFX1NUUlVDVCkgKiBuZXdfbnVtX29wY29kZXM7Ci0gIEFTU0VSVCAobmV3X3NpemUgPiBzaXplKTsKLQotICAvKiBGSVhNRSBzaW5jZSBJVEJMX09QQ09ERVMgY3VsZCBiZSBhIHN0YXRpYyB0YWJsZSwKLQkJd2UgY2FuJ3QgcmVhbGxvYyBvciBkZWxldGUgdGhlIG9sZCBtZW1vcnkuICovCi0gIG5ld19vcGNvZGVzID0gKHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QgKikgbWFsbG9jIChuZXdfc2l6ZSk7Ci0gIGlmICghbmV3X29wY29kZXMpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgaW5zdHJ1Y3Rpb25zXG4iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc2l6ZSkJCQkvKiBjb3B5IHByZXhpc3Rpbmcgb3Bjb2RlcyB0YWJsZSAqLwotICAgIG1lbWNweSAobmV3X29wY29kZXMsIElUQkxfT1BDT0RFUywgc2l6ZSk7Ci0KLSAgLyogRklYTUUhIHNvbWUgTlVNT1BDT0RFUyBhcmUgY2FsY3VsYXRlZCBleHByZXNzaW9ucy4KLQkJVGhlc2UgbmVlZCB0byBiZSBjaGFuZ2VkIGJlZm9yZSBpdGJscyBjYW4gYmUgc3VwcG9ydGVkLiAqLwotCi0gIGlkID0gSVRCTF9OVU1fTUFDUk9TOwkJLyogYmVnaW4gdGhlIG5leHQgbWFjcm8gaWQgYWZ0ZXIgdGhlIGxhc3QgKi8KLSAgbyA9ICZuZXdfb3Bjb2Rlc1tJVEJMX05VTV9PUENPREVTXTsJLyogYXBwZW5kIG1hY3JvIHRvIG9wY29kZXMgbGlzdCAqLwotICBmb3IgKG4gPSBlX3AwOyBuIDwgZV9ucHJvY3M7IG4rKykKLSAgICB7Ci0gICAgICBlcyA9IGdldF9lbnRyaWVzIChuLCBlX2luc24pOwotICAgICAgZm9yIChlID0gKmVzOyBlOyBlID0gZS0+bmV4dCkKLQl7Ci0JICAvKiBuYW1lLCAgICBhcmdzLCAgIG1hc2ssICAgICAgIG1hdGNoLCAgcGluZm8KLQkJICogeyJsaSIsICAgICAgInQsaSIsICAweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90ICAgIH0sCi0JCSAqIHsibGkiLCAgICAgICJ0LEkiLCAgMCwgICAgKGludCkgTV9MSSwgICBJTlNOX01BQ1JPICB9LAotCQkgKiBDb25zdHJ1Y3QgYXJncyBmcm9tIGl0YmxfZmllbGRzLgotCQkqLwotCSAgby0+bmFtZSA9IGUtPm5hbWU7Ci0JICBvLT5hcmdzID0gc3RyZHVwIChmb3JtX2FyZ3MgKGUpKTsKLQkgIG8tPm1hc2sgPSBhcHBseV9yYW5nZSAoZS0+dmFsdWUsIGUtPnJhbmdlKTsKLQkgIC8qIEZJWE1FIGhvdyB0byBjYXRjaCBkdXJyaW5nIGFzc2VtYmx5PyAqLwotCSAgLyogbWFzayB0byBpZGVudGlmeSB0aGlzIGluc24gKi8KLQkgIG8tPm1hdGNoID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7Ci0JICBvLT5waW5mbyA9IDA7Ci0KLSNpZmRlZiBVU0VfTUFDUk9TCi0JICBvLT5tYXNrID0gaWQrKzsJLyogRklYTUUgaG93IHRvIGNhdGNoIGR1cnJpbmcgYXNzZW1ibHk/ICovCi0JICBvLT5tYXRjaCA9IDA7CQkvKiBmb3IgbWFjcm9zLCB0aGUgaW5zbl9pc2EgbnVtYmVyICovCi0JICBvLT5waW5mbyA9IElOU05fTUFDUk87Ci0jZW5kaWYKLQotCSAgLyogRG9uJ3QgYWRkIGluc3RydWN0aW9ucyB3aGljaCBjYXVzZWQgYW4gZXJyb3IgKi8KLQkgIGlmIChvLT5hcmdzKQotCSAgICBvKys7Ci0JICBlbHNlCi0JICAgIG5ld19udW1fb3Bjb2Rlcy0tOwotCX0KLSAgICB9Ci0gIElUQkxfT1BDT0RFUyA9IG5ld19vcGNvZGVzOwotICBJVEJMX05VTV9PUENPREVTID0gbmV3X251bV9vcGNvZGVzOwotCi0gIC8qIEZJWE1FCi0JCUF0IHRoaXMgcG9pbnQsIHdlIGNhbiBmcmVlIHRoZSBlbnRyaWVzLCBhcyB0aGV5IHNob3VsZCBoYXZlCi0JCWJlZW4gYWRkZWQgdG8gdGhlIGFzc2VtYmxlcidzIHRhYmxlcy4KLQkJRG9uJ3QgZnJlZSBuYW1lIHRob3VnaCwgc2luY2UgbmFtZSBpcyBiZWluZyB1c2VkIGJ5IHRoZSBuZXcKLQkJb3Bjb2RlcyB0YWJsZS4KLQotCQlFdmVudHVhbGx5LCB3ZSBzaG91bGQgYWxzbyBmcmVlIHRoZSBuZXcgb3Bjb2RlcyB0YWJsZSBpdHNlbGYgCi0JCW9uIGV4aXQuCi0JKi8KLX0KLQotc3RhdGljIGNoYXIgKgotZm9ybV9hcmdzIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSkKLXsKLSAgc3RhdGljIGNoYXIgc1szMV07Ci0gIGNoYXIgYyA9IDAsICpwID0gczsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmY7Ci0KLSAgQVNTRVJUIChlKTsKLSAgZm9yIChmID0gZS0+ZmllbGRzOyBmOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGYtPnR5cGUpCi0JewotCWNhc2UgZV9kcmVnOgotCSAgYyA9ICdkJzsKLQkgIGJyZWFrOwotCWNhc2UgZV9jcmVnOgotCSAgYyA9ICd0JzsKLQkgIGJyZWFrOwotCWNhc2UgZV9ncmVnOgotCSAgYyA9ICdzJzsKLQkgIGJyZWFrOwotCWNhc2UgZV9pbW1lZDoKLQkgIGMgPSAnaSc7Ci0JICBicmVhazsKLQljYXNlIGVfYWRkcjoKLQkgIGMgPSAnYSc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYyA9IDA7CQkvKiBpZ25vcmU7IHVua25vd24gZmllbGQgdHlwZSAqLwotCX0KLSAgICAgIGlmIChjKQotCXsKLQkgIGlmIChwICE9IHMpCi0JICAgICpwKysgPSAnLCc7Ci0JICAqcCsrID0gYzsKLQl9Ci0gICAgfQotICAqcCA9IDA7Ci0gIHJldHVybiBzOwotfQotI2VuZGlmIC8qICFTVEFORF9BTE9ORSAqLwotCi0KLS8qIEdldCBwcm9jZXNzb3IncyByZWdpc3RlciBuYW1lIGZyb20gdmFsICovCi0KLWludAotaXRibF9nZXRfcmVnX3ZhbCAoY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqcHZhbCkKLXsKLSAgZV90eXBlIHQ7Ci0gIGVfcHJvY2Vzc29yIHA7Ci0KLSAgZm9yIChwID0gZV9wMDsgcCA8IGVfbnByb2NzOyBwKyspCi0gICAgewotICAgICAgZm9yICh0ID0gZV9yZWd0eXBlMDsgdCA8IGVfbnJlZ3R5cGVzOyB0KyspCi0JewotCSAgaWYgKGl0YmxfZ2V0X3ZhbCAocCwgdCwgbmFtZSwgcHZhbCkpCi0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLWl0YmxfZ2V0X25hbWUgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqcjsKLSAgLyogdHlwZSBkZXBlbmRzIG9uIGluc3RydWN0aW9uIHBhc3NlZCAqLwotICByID0gZmluZF9lbnRyeV9ieXZhbCAocHJvY2Vzc29yLCB0eXBlLCB2YWwsIDApOwotICBpZiAocikKLSAgICByZXR1cm4gci0+bmFtZTsKLSAgZWxzZQotICAgIHJldHVybiAwOwkJCS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KLX0KLQotLyogR2V0IHByb2Nlc3NvcidzIHJlZ2lzdGVyIHZhbHVlIGZyb20gbmFtZSAqLwotCi1pbnQKLWl0YmxfZ2V0X3ZhbCAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwKLQkgICAgICB1bnNpZ25lZCBsb25nICpwdmFsKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqcjsKLSAgLyogdHlwZSBkZXBlbmRzIG9uIGluc3RydWN0aW9uIHBhc3NlZCAqLwotICByID0gZmluZF9lbnRyeV9ieW5hbWUgKHByb2Nlc3NvciwgdHlwZSwgbmFtZSk7Ci0gIGlmIChyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gICpwdmFsID0gci0+dmFsdWU7Ci0gIHJldHVybiAxOwotfQotCi0KLS8qIEFzc2VtYmxlIGluc3RydWN0aW9uICJuYW1lIiB3aXRoIG9wZXJhbmRzICJzIi4KLSAqIG5hbWUgLSBuYW1lIG9mIGluc3RydWN0aW9uCi0gKiBzIC0gb3BlcmFuZHMKLSAqIHJldHVybnMgLSBsb25nIHdvcmQgZm9yIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiAqLwotCi11bnNpZ25lZCBsb25nIAotaXRibF9hc3NlbWJsZSAoY2hhciAqbmFtZSwgY2hhciAqcykKLXsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplOwotICBzdHJ1Y3QgaXRibF9maWVsZCAqZjsKLSAgY2hhciAqbjsKLSAgaW50IHByb2Nlc3NvcjsKLQotICBpZiAoIW5hbWUgfHwgISpuYW1lKQotICAgIHJldHVybiAwOwkJCS8qIGVycm9yISAgbXVzdCBoYXZlIGEgb3Bjb2RlIG5hbWUvZXhwciAqLwotCi0gIC8qIGZpbmQgZW50cnkgaW4gbGlzdCBvZiBpbnN0cnVjdGlvbnMgZm9yIGFsbCBwcm9jZXNzb3JzICovCi0gIGZvciAocHJvY2Vzc29yID0gMDsgcHJvY2Vzc29yIDwgZV9ucHJvY3M7IHByb2Nlc3NvcisrKQotICAgIHsKLSAgICAgIGUgPSBmaW5kX2VudHJ5X2J5bmFtZSAocHJvY2Vzc29yLCBlX2luc24sIG5hbWUpOwotICAgICAgaWYgKGUpCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoIWUpCi0gICAgcmV0dXJuIDA7CQkJLyogb3Bjb2RlIG5vdCBpbiB0YWJsZTsgaW52YWxpZCBpbnN0cnVzdGlvbiAqLwotICBvcGNvZGUgPSBidWlsZF9vcGNvZGUgKGUpOwotCi0gIC8qIHBhcnNlIG9wY29kZSdzIGFyZ3MgKGlmIGFueSkgKi8KLSAgZm9yIChmID0gZS0+ZmllbGRzOyBmOyBmID0gZi0+bmV4dCkJLyogZm9yIGVhY2ggYXJnLCAuLi4gKi8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgaXRibF9lbnRyeSAqcjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgICBpZiAoIXMgfHwgISpzKQotCXJldHVybiAwOwkJLyogZXJyb3IgLSBub3QgZW5vdWdoIG9wZXJhbmRzICovCi0gICAgICBuID0gaXRibF9nZXRfZmllbGQgKCZzKTsKLSAgICAgIC8qIG4gc2hvdWxkIGJlIGluIGZvcm0gJG4gb3IgMHhoaGggKGFyZSBzeW1ib2wgbmFtZXMgdmFsaWQ/PyAqLwotICAgICAgc3dpdGNoIChmLT50eXBlKQotCXsKLQljYXNlIGVfZHJlZzoKLQljYXNlIGVfY3JlZzoKLQljYXNlIGVfZ3JlZzoKLQkgIC8qIEFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgbmFtZQotCQkJICogb3IgJyQnIGZvbGxvd2VkIGJ5IHRoZSByZWdpc3RlciBudW1iZXIgKi8KLQkgIGlmICgqbiA9PSAnJCcpCi0JICAgIHsKLQkgICAgICBuKys7Ci0JICAgICAgdmFsdWUgPSBzdHJ0b2wgKG4sIDAsIDEwKTsKLQkgICAgICAvKiBGSVhNRSEgY291bGQgaGF2ZSAiMGwiLi4uIHRoZW4gd2hhdD8/ICovCi0JICAgICAgaWYgKHZhbHVlID09IDAgJiYgKm4gIT0gJzAnKQotCQlyZXR1cm4gMDsJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByID0gZmluZF9lbnRyeV9ieW5hbWUgKGUtPnByb2Nlc3NvciwgZi0+dHlwZSwgbik7Ci0JICAgICAgaWYgKHIpCi0JCXZhbHVlID0gci0+dmFsdWU7Ci0JICAgICAgZWxzZQotCQlyZXR1cm4gMDsJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIGVfYWRkcjoKLQkgIC8qIHVzZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUgdG8gZmluZCBzeW1ib2wgKi8KLQkgIC8qIEZJWE1FISEgRG8gd2UgbmVlZCB0aGlzPwotCQkJCWlmIHNvLCB3aGF0IGFib3V0IHJlbG9jcz8/Ci0JCQkJbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkJCQlyZXR1cm4gMDsJLy0qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi0vCi0JCQkJYnJlYWs7Ci0JCQkqLwotCSAgLyogSWYgbm90IGEgc3ltYm9sLCBmYWxsIHRocnUgdG8gSU1NRUQgKi8KLQljYXNlIGVfaW1tZWQ6Ci0JICBpZiAoKm4gPT0gJzAnICYmICoobiArIDEpID09ICd4JykJLyogaGV4IGJlZ2lucyAweC4uLiAqLwotCSAgICB7Ci0JICAgICAgbiArPSAyOwotCSAgICAgIHZhbHVlID0gc3RydG9sIChuLCAwLCAxNik7Ci0JICAgICAgLyogRklYTUUhIGNvdWxkIGhhdmUgIjB4bCIuLi4gdGhlbiB3aGF0Pz8gKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSBzdHJ0b2wgKG4sIDAsIDEwKTsKLQkgICAgICAvKiBGSVhNRSEgY291bGQgaGF2ZSAiMGwiLi4uIHRoZW4gd2hhdD8/ICovCi0JICAgICAgaWYgKHZhbHVlID09IDAgJiYgKm4gIT0gJzAnKQotCQlyZXR1cm4gMDsJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotCSAgICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIDA7CQkvKiBlcnJvcjsgaW52YWxpZCBmaWVsZCBzcGVjICovCi0JfQotICAgICAgb3Bjb2RlIHw9IGFwcGx5X3JhbmdlICh2YWx1ZSwgZi0+cmFuZ2UpOwotICAgIH0KLSAgaWYgKHMgJiYgKnMpCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3IgLSB0b28gbWFueSBvcGVyYW5kcyAqLwotICByZXR1cm4gb3Bjb2RlOwkJLyogZG9uZSEgKi8KLX0KLQotLyogRGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb24gImluc24iLgotICogaW5zbiAtIGluc3RydWN0aW9uCi0gKiBzIC0gYnVmZmVyIHRvIGhvbGQgZGlzYXNzZW1ibGVkIGluc3RydWN0aW9uCi0gKiByZXR1cm5zIC0gMSBpZiBzdWNjZWVkZWQ7IDAgaWYgZmFpbGVkCi0gKi8KLQotaW50IAotaXRibF9kaXNhc3NlbWJsZSAoY2hhciAqcywgdW5zaWduZWQgbG9uZyBpbnNuKQotewotICBlX3Byb2Nlc3NvciBwcm9jZXNzb3I7Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplOwotICBzdHJ1Y3QgaXRibF9maWVsZCAqZjsKLQotICBpZiAoIUlUQkxfSVNfSU5TTiAoaW5zbikpCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3IqLwotICBwcm9jZXNzb3IgPSBnZXRfcHJvY2Vzc29yIChJVEJMX0RFQ09ERV9QTlVNIChpbnNuKSk7Ci0KLSAgLyogZmluZCBlbnRyeSBpbiBsaXN0ICovCi0gIGUgPSBmaW5kX2VudHJ5X2J5dmFsIChwcm9jZXNzb3IsIGVfaW5zbiwgaW5zbiwgMCk7Ci0gIGlmICghZSkKLSAgICByZXR1cm4gMDsJCQkvKiBvcGNvZGUgbm90IGluIHRhYmxlOyBpbnZhbGlkIGluc3RydXN0aW9uICovCi0gIHN0cmNweSAocywgZS0+bmFtZSk7Ci0KLSAgLyogcGFyc2UgaW5zbidzIGFyZ3MgKGlmIGFueSkgKi8KLSAgZm9yIChmID0gZS0+ZmllbGRzOyBmOyBmID0gZi0+bmV4dCkJLyogZm9yIGVhY2ggYXJnLCAuLi4gKi8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgaXRibF9lbnRyeSAqcjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLSAgICAgIGlmIChmID09IGUtPmZpZWxkcykJLyogZmlyc3Qgb3BlcmFuZCBpcyBwcmVjZWVkZWQgYnkgdGFiICovCi0Jc3RyY2F0IChzLCAiXHQiKTsKLSAgICAgIGVsc2UJCQkvKiAnLCdzIHNlcGFyYXRlIGZvbGxvd2luZyBvcGVyYW5kcyAqLwotCXN0cmNhdCAocywgIiwiKTsKLSAgICAgIHZhbHVlID0gZXh0cmFjdF9yYW5nZSAoaW5zbiwgZi0+cmFuZ2UpOwotICAgICAgLyogbiBzaG91bGQgYmUgaW4gZm9ybSAkbiBvciAweGhoaCAoYXJlIHN5bWJvbCBuYW1lcyB2YWxpZD8/ICovCi0gICAgICBzd2l0Y2ggKGYtPnR5cGUpCi0JewotCWNhc2UgZV9kcmVnOgotCWNhc2UgZV9jcmVnOgotCWNhc2UgZV9ncmVnOgotCSAgLyogQWNjZXB0IGVpdGhlciBhIHN0cmluZyBuYW1lCi0JCQkgKiBvciAnJCcgZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyIG51bWJlciAqLwotCSAgciA9IGZpbmRfZW50cnlfYnl2YWwgKGUtPnByb2Nlc3NvciwgZi0+dHlwZSwgdmFsdWUsICZmLT5yYW5nZSk7Ci0JICBpZiAocikKLQkgICAgc3RyY2F0IChzLCByLT5uYW1lKTsKLQkgIGVsc2UKLQkgICAgc3ByaW50ZiAocywgIiVzJCVsdSIsIHMsIHZhbHVlKTsKLQkgIGJyZWFrOwotCWNhc2UgZV9hZGRyOgotCSAgLyogdXNlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZSB0byBmaW5kIHN5bWJvbCAqLwotCSAgLyogRklYTUUhISBEbyB3ZSBuZWVkIHRoaXM/Ci0JCQkgKiAgIGlmIHNvLCB3aGF0IGFib3V0IHJlbG9jcz8/Ci0JCQkqLwotCSAgLyogSWYgbm90IGEgc3ltYm9sLCBmYWxsIHRocnUgdG8gSU1NRUQgKi8KLQljYXNlIGVfaW1tZWQ6Ci0JICBzcHJpbnRmIChzLCAiJXMweCVseCIsIHMsIHZhbHVlKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR1cm4gMDsJCS8qIGVycm9yOyBpbnZhbGlkIGZpZWxkIHNwZWMgKi8KLQl9Ci0gICAgfQotICByZXR1cm4gMTsJCQkvKiBkb25lISAqLwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyoKLSAqIExvY2FsIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHByaXZhdGUgc3RydWN0dXJlcyBjb250YWluaW5nCi0gKiB0aGUgbmFtZXMgYW5kIGZvcm1hdCBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbnMgYW5kIHJlZ2lzdGVycwotICogZm9yIGVhY2ggcHJvY2Vzc29yLgotICovCi0KLS8qIENhbGN1bGF0ZSBpbnN0cnVjdGlvbidzIG9wY29kZSBhbmQgZnVuY3Rpb24gdmFsdWVzIGZyb20gZW50cnkgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgCi1idWlsZF9vcGNvZGUgKHN0cnVjdCBpdGJsX2VudHJ5ICplKQotewotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICBvcGNvZGUgPSBhcHBseV9yYW5nZSAoZS0+dmFsdWUsIGUtPnJhbmdlKTsKLSAgb3Bjb2RlIHw9IElUQkxfRU5DT0RFX1BOVU0gKGUtPnByb2Nlc3Nvcik7Ci0gIHJldHVybiBvcGNvZGU7Ci19Ci0KLS8qIENhbGN1bGF0ZSBhYnNvbHV0ZSB2YWx1ZSBnaXZlbiB0aGUgcmVsYXRpdmUgdmFsdWUgYW5kIGJpdCBwb3NpdGlvbiByYW5nZQotICogd2l0aGluIHRoZSBpbnN0cnVjdGlvbi4KLSAqIFRoZSByYW5nZSBpcyBpbmNsdXNpdmUgd2hlcmUgMCBpcyBsZWFzdCBzaWduaWZpY2FudCBiaXQuCi0gKiBBIHJhbmdlIG9mIHsgMjQsIDIwIH0gd2lsbCBoYXZlIGEgbWFzayBvZgotICogYml0ICAgMyAgICAgICAgICAgMiAgICAgICAgICAgIDEKLSAqIHBvczogMTA5OCA3NjU0IDMyMTAgOTg3NiA1NDMyIDEwOTggNzY1NCAzMjEwCi0gKiBiaW46IDAwMDAgMDAwMSAxMTExIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMAotICogaGV4OiAgICAwICAgIDEgICAgZiAgICAwICAgIDAgICAgMCAgICAwICAgIDAKLSAqIG1hc2s6IDB4MDFmMDAwMDAuCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgCi1hcHBseV9yYW5nZSAodW5zaWduZWQgbG9uZyBydmFsLCBzdHJ1Y3QgaXRibF9yYW5nZSByKQotewotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0gIHVuc2lnbmVkIGxvbmcgYXZhbDsKLSAgaW50IGxlbiA9IE1BWF9CSVRQT1MgLSByLnNiaXQ7Ci0KLSAgQVNTRVJUIChyLnNiaXQgPj0gci5lYml0KTsKLSAgQVNTRVJUIChNQVhfQklUUE9TID49IHIuc2JpdCk7Ci0gIEFTU0VSVCAoci5lYml0ID49IDApOwotCi0gIC8qIGNyZWF0ZSBtYXNrIGJ5IHRydW5jYXRpbmcgMXMgYnkgc2hpZnRpbmcgKi8KLSAgbWFzayA9IDB4ZmZmZmZmZmYgPDwgbGVuOwotICBtYXNrID0gbWFzayA+PiBsZW47Ci0gIG1hc2sgPSBtYXNrID4+IHIuZWJpdDsKLSAgbWFzayA9IG1hc2sgPDwgci5lYml0OwotCi0gIGF2YWwgPSAocnZhbCA8PCByLmViaXQpICYgbWFzazsKLSAgcmV0dXJuIGF2YWw7Ci19Ci0KLS8qIENhbGN1bGF0ZSByZWxhdGl2ZSB2YWx1ZSBnaXZlbiB0aGUgYWJzb2x1dGUgdmFsdWUgYW5kIGJpdCBwb3NpdGlvbiByYW5nZQotICogd2l0aGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIAotZXh0cmFjdF9yYW5nZSAodW5zaWduZWQgbG9uZyBhdmFsLCBzdHJ1Y3QgaXRibF9yYW5nZSByKQotewotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0gIHVuc2lnbmVkIGxvbmcgcnZhbDsKLSAgaW50IGxlbiA9IE1BWF9CSVRQT1MgLSByLnNiaXQ7Ci0KLSAgLyogY3JlYXRlIG1hc2sgYnkgdHJ1bmNhdGluZyAxcyBieSBzaGlmdGluZyAqLwotICBtYXNrID0gMHhmZmZmZmZmZiA8PCBsZW47Ci0gIG1hc2sgPSBtYXNrID4+IGxlbjsKLSAgbWFzayA9IG1hc2sgPj4gci5lYml0OwotICBtYXNrID0gbWFzayA8PCByLmViaXQ7Ci0KLSAgcnZhbCA9IChhdmFsICYgbWFzaykgPj4gci5lYml0OwotICByZXR1cm4gcnZhbDsKLX0KLQotLyogRXh0cmFjdCBwcm9jZXNzb3IncyBhc3NlbWJseSBpbnN0cnVjdGlvbiBmaWVsZCBuYW1lIGZyb20gczsKLSAqIGZvcm1zIGFyZSAibiBhcmdzIiAibixhcmdzIiBvciAibiIgKi8KLS8qIFJldHVybiBuZXh0IGFyZ3VtZW50IGZyb20gc3RyaW5nIHBvaW50ZXIgInMiIGFuZCBhZHZhbmNlIHMuCi0gKiBkZWxpbWl0ZXJzIGFyZSAiICwoKSIgKi8KLQotY2hhciAqCi1pdGJsX2dldF9maWVsZCAoY2hhciAqKlMpCi17Ci0gIHN0YXRpYyBjaGFyIG5bMTI4XTsKLSAgY2hhciAqczsKLSAgaW50IGxlbjsKLQotICBzID0gKlM7Ci0gIGlmICghcyB8fCAhKnMpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIEZJWE1FOiBUaGlzIGlzIGEgd2VpcmQgc2V0IG9mIGRlbGltaXRlcnMuICAqLwotICBsZW4gPSBzdHJjc3BuIChzLCAiIFx0LCgpIik7Ci0gIEFTU0VSVCAoMTI4ID4gbGVuICsgMSk7Ci0gIHN0cm5jcHkgKG4sIHMsIGxlbik7Ci0gIG5bbGVuXSA9IDA7Ci0gIGlmIChzW2xlbl0gPT0gJ1wwJykKLSAgICBzID0gMDsJCQkvKiBubyBtb3JlIGFyZ3MgKi8KLSAgZWxzZQotICAgIHMgKz0gbGVuICsgMTsJCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmcgKi8KLQotICAqUyA9IHM7Ci0gIHJldHVybiBuOwotfQotCi0vKiBTZWFyY2ggZW50cmllcyBmb3IgYSBnaXZlbiBwcm9jZXNzb3IgYW5kIHR5cGUKLSAqIHRvIGZpbmQgb25lIG1hdGNoaW5nIHRoZSBuYW1lICJuIi4KLSAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5ICovCi0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqCi1maW5kX2VudHJ5X2J5bmFtZSAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkgICBlX3R5cGUgdHlwZSwgY2hhciAqbikKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0KLSAgZXMgPSBnZXRfZW50cmllcyAocHJvY2Vzc29yLCB0eXBlKTsKLSAgZm9yIChlID0gKmVzOyBlOyBlID0gZS0+bmV4dCkJLyogZm9yIGVhY2ggZW50cnksIC4uLiAqLwotICAgIHsKLSAgICAgIGlmICghc3RyY21wIChlLT5uYW1lLCBuKSkKLQlyZXR1cm4gZTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBTZWFyY2ggZW50cmllcyBmb3IgYSBnaXZlbiBwcm9jZXNzb3IgYW5kIHR5cGUKLSAqIHRvIGZpbmQgb25lIG1hdGNoaW5nIHRoZSB2YWx1ZSAidmFsIiBmb3IgdGhlIHJhbmdlICJyIi4KLSAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5LgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBkaXNhc3NlbWJsaW5nIGZpZWxkcyBvZiBhbiBpbnN0cnVjdGlvbi4KLSAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKgotZmluZF9lbnRyeV9ieXZhbCAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwKLQkJICB1bnNpZ25lZCBsb25nIHZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgKnIpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplLCAqKmVzOwotICB1bnNpZ25lZCBsb25nIGV2YWw7Ci0KLSAgZXMgPSBnZXRfZW50cmllcyAocHJvY2Vzc29yLCB0eXBlKTsKLSAgZm9yIChlID0gKmVzOyBlOyBlID0gZS0+bmV4dCkJLyogZm9yIGVhY2ggZW50cnksIC4uLiAqLwotICAgIHsKLSAgICAgIGlmIChwcm9jZXNzb3IgIT0gZS0+cHJvY2Vzc29yKQotCWNvbnRpbnVlOwotICAgICAgLyogRm9yIGluc25zLCB3ZSBtaWdodCBub3Qga25vdyB0aGUgcmFuZ2Ugb2YgdGhlIG9wY29kZSwKLQkgKiBzbyBhIHJhbmdlIG9mIDAgd2lsbCBhbGxvdyB0aGlzIHJvdXRpbmUgdG8gbWF0Y2ggYWdhaW5zdAotCSAqIHRoZSByYW5nZSBvZiB0aGUgZW50cnkgdG8gYmUgY29tcGFyZWQgd2l0aC4KLQkgKiBUaGlzIGNvdWxkIGNhdXNlIGFtYmlndWl0aWVzLgotCSAqIEZvciBvcGVyYW5kcywgd2UgZ2V0IGFuIGV4dHJhY3RlZCB2YWx1ZSBhbmQgYSByYW5nZS4KLQkgKi8KLSAgICAgIC8qIGlmIHJhbmdlIGlzIDAsIG1hc2sgdmFsIGFnYWluc3QgdGhlIHJhbmdlIG9mIHRoZSBjb21wYXJlZCBlbnRyeS4gKi8KLSAgICAgIGlmIChyID09IDApCQkvKiBpZiBubyByYW5nZSBwYXNzZWQsIG11c3QgYmUgd2hvbGUgMzItYml0cwotCQkJICogc28gY3JlYXRlIDMyLWJpdCB2YWx1ZSBmcm9tIGVudHJ5J3MgcmFuZ2UgKi8KLQl7Ci0JICBldmFsID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7Ci0JICB2YWwgJj0gYXBwbHlfcmFuZ2UgKDB4ZmZmZmZmZmYsIGUtPnJhbmdlKTsKLQl9Ci0gICAgICBlbHNlIGlmICgoci0+c2JpdCA9PSBlLT5yYW5nZS5zYml0ICYmIHItPmViaXQgPT0gZS0+cmFuZ2UuZWJpdCkKLQkgICAgICAgfHwgKGUtPnJhbmdlLnNiaXQgPT0gMCAmJiBlLT5yYW5nZS5lYml0ID09IDApKQotCXsKLQkgIGV2YWwgPSBhcHBseV9yYW5nZSAoZS0+dmFsdWUsICpyKTsKLQkgIHZhbCA9IGFwcGx5X3JhbmdlICh2YWwsICpyKTsKLQl9Ci0gICAgICBlbHNlCi0JY29udGludWU7Ci0gICAgICBpZiAodmFsID09IGV2YWwpCi0JcmV0dXJuIGU7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbGlzdCBvZiBlbnRyaWVzIGZvciBhIGdpdmVuIHByb2Nlc3NvciBhbmQgdHlwZS4gKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoqCi1nZXRfZW50cmllcyAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSkKLXsKLSAgcmV0dXJuICZlbnRyaWVzW3Byb2Nlc3Nvcl1bdHlwZV07Ci19Ci0KLS8qIFJldHVybiBhbiBpbnRlZ3JhbCB2YWx1ZSBmb3IgdGhlIHByb2Nlc3NvciBwYXNzZWQgZnJvbSB5eXBhcnNlLiAqLwotCi1zdGF0aWMgZV9wcm9jZXNzb3IgCi1nZXRfcHJvY2Vzc29yIChpbnQgeXlwcm9jKQotewotICAvKiB0cmFuc2xhdGUgZnJvbSB5YWNjJ3MgcHJvY2Vzc29yIHRvIGVudW0gKi8KLSAgaWYgKHl5cHJvYyA+PSBlX3AwICYmIHl5cHJvYyA8IGVfbnByb2NzKQotICAgIHJldHVybiAoZV9wcm9jZXNzb3IpIHl5cHJvYzsKLSAgcmV0dXJuIGVfaW52cHJvYzsJCS8qIGVycm9yOyBpbnZhbGlkIHByb2Nlc3NvciAqLwotfQotCi0vKiBSZXR1cm4gYW4gaW50ZWdyYWwgdmFsdWUgZm9yIHRoZSBlbnRyeSB0eXBlIHBhc3NlZCBmcm9tIHl5cGFyc2UuICovCi0KLXN0YXRpYyBlX3R5cGUgCi1nZXRfdHlwZSAoaW50IHl5dHlwZSkKLXsKLSAgc3dpdGNoICh5eXR5cGUpCi0gICAgewotICAgICAgLyogdHJhbnNsYXRlIGZyb20geWFjYydzIHR5cGUgdG8gZW51bSAqLwotICAgIGNhc2UgSU5TTjoKLSAgICAgIHJldHVybiBlX2luc247Ci0gICAgY2FzZSBEUkVHOgotICAgICAgcmV0dXJuIGVfZHJlZzsKLSAgICBjYXNlIENSRUc6Ci0gICAgICByZXR1cm4gZV9jcmVnOwotICAgIGNhc2UgR1JFRzoKLSAgICAgIHJldHVybiBlX2dyZWc7Ci0gICAgY2FzZSBBRERSOgotICAgICAgcmV0dXJuIGVfYWRkcjsKLSAgICBjYXNlIElNTUVEOgotICAgICAgcmV0dXJuIGVfaW1tZWQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBlX2ludnR5cGU7CQkvKiBlcnJvcjsgaW52YWxpZCB0eXBlICovCi0gICAgfQotfQotCi0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGVudHJ5ICovCi0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqCi1hbGxvY19lbnRyeSAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwKLQkgICAgIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplLCAqKmVzOwotICBpZiAoIW5hbWUpCi0gICAgcmV0dXJuIDA7Ci0gIGUgPSAoc3RydWN0IGl0YmxfZW50cnkgKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBpdGJsX2VudHJ5KSk7Ci0gIGlmIChlKQotICAgIHsKLSAgICAgIG1lbXNldCAoZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXRibF9lbnRyeSkpOwotICAgICAgZS0+bmFtZSA9IChjaGFyICopIG1hbGxvYyAoc2l6ZW9mIChzdHJsZW4gKG5hbWUpKSArIDEpOwotICAgICAgaWYgKGUtPm5hbWUpCi0Jc3RyY3B5IChlLT5uYW1lLCBuYW1lKTsKLSAgICAgIGUtPnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKLSAgICAgIGUtPnR5cGUgPSB0eXBlOwotICAgICAgZS0+dmFsdWUgPSB2YWx1ZTsKLSAgICAgIGVzID0gZ2V0X2VudHJpZXMgKGUtPnByb2Nlc3NvciwgZS0+dHlwZSk7Ci0gICAgICBlLT5uZXh0ID0gKmVzOwotICAgICAgKmVzID0gZTsKLSAgICB9Ci0gIHJldHVybiBlOwotfQotCi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBlbnRyeSdzIGZpZWxkICovCi0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9maWVsZCAqCi1hbGxvY19maWVsZCAoZV90eXBlIHR5cGUsIGludCBzYml0LCBpbnQgZWJpdCwKLQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0gIHN0cnVjdCBpdGJsX2ZpZWxkICpmOwotICBmID0gKHN0cnVjdCBpdGJsX2ZpZWxkICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaXRibF9maWVsZCkpOwotICBpZiAoZikKLSAgICB7Ci0gICAgICBtZW1zZXQgKGYsIDAsIHNpemVvZiAoc3RydWN0IGl0YmxfZmllbGQpKTsKLSAgICAgIGYtPnR5cGUgPSB0eXBlOwotICAgICAgZi0+cmFuZ2Uuc2JpdCA9IHNiaXQ7Ci0gICAgICBmLT5yYW5nZS5lYml0ID0gZWJpdDsKLSAgICAgIGYtPmZsYWdzID0gZmxhZ3M7Ci0gICAgfQotICByZXR1cm4gZjsKLX0KZGlmZiAtLWdpdCBhL2dhcy9pdGJsLW9wcy5oIGIvZ2FzL2l0Ymwtb3BzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OWVhN2YuLjAwMDAwMDAKLS0tIGEvZ2FzL2l0Ymwtb3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyogaXRibC1vcHMuaAotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBFeHRlcm5hbCBmdW5jdGlvbnMsIGNvbnN0YW50cyBhbmQgZGVmaW5lcyBmb3IgaXRibCBzdXBwb3J0ICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBJbmNsdWRlIGZpbGUgbm90ZXM6ICJleHByLmgiIG5lZWRlZCBiZWZvcmUgdGFyZy0qLmgsCi0gKiAidGFyZy1lbnYuaCIgaW5jbHVkZXMgdGhlIGNoYWluIG9mIHRhcmdldCBkZXBlbmRhbnQgaGVhZGVycywKLSAqICJ0YXJnLWNwdS5oIiBoYXMgdGhlIEhBVkVfSVRCTF9DUFUgZGVmaW5lLCBhbmQKLSAqIGFzLmggaW5jbHVkZXMgdGhlbSBhbGwgKi8KLSNpbmNsdWRlICJhcy5oIgotCi0jaWZkZWYgSEFWRV9JVEJMX0NQVQotI2luY2x1ZGUgIml0YmwtY3B1LmgiCi0jZW5kaWYKLQotLyogRGVmYXVsdHMgZm9yIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IGdlbmVyaWMgY29kZSAqLwotI2lmbmRlZiBJVEJMX05VTUJFUl9PRl9QUk9DRVNTT1JTCi0jZGVmaW5lIElUQkxfTlVNQkVSX09GX1BST0NFU1NPUlMgMQotI2VuZGlmCi0KLSNpZm5kZWYgSVRCTF9NQVhfQklUUE9TCi0jZGVmaW5lIElUQkxfTUFYX0JJVFBPUyAzMQotI2VuZGlmCi0KLSNpZm5kZWYgSVRCTF9UWVBFCi0jZGVmaW5lIElUQkxfVFlQRSB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX0lTX0lOU04KLSNkZWZpbmUgSVRCTF9JU19JTlNOKGluc24pIDEKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfREVDT0RFX1BOVU0KLSNkZWZpbmUgSVRCTF9ERUNPREVfUE5VTShpbnNuKSAwCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX0VOQ09ERV9QTlVNCi0jZGVmaW5lIElUQkxfRU5DT0RFX1BOVU0ocG51bSkgMAotI2VuZGlmCi0KLXR5cGVkZWYgSVRCTF9UWVBFIHRfaW5zbjsKLQotLyogdHlwZXMgb2YgZW50cmllcyAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBlX2luc24sCi0gICAgZV9kcmVnLAotICAgIGVfcmVndHlwZTAgPSBlX2RyZWcsCi0gICAgZV9jcmVnLAotICAgIGVfZ3JlZywKLSAgICBlX2FkZHIsCi0gICAgZV9ucmVndHlwZXMgPSBlX2dyZWcgKyAxLAotICAgIGVfaW1tZWQsCi0gICAgZV9udHlwZXMsCi0gICAgZV9pbnZ0eXBlCQkJLyogaW52YWxpZCB0eXBlICovCi0gIH0gZV90eXBlOwotCi10eXBlZGVmIGVudW0KLSAgewotICAgIGVfcDAsCi0gICAgZV9ucHJvY3MgPSBOVU1CRVJfT0ZfUFJPQ0VTU09SUywKLSAgICBlX2ludnByb2MJCQkvKiBpbnZhbGlkIHByb2Nlc3NvciAqLwotICB9IGVfcHJvY2Vzc29yOwotCi0vKiAwIG1lYW5zIGFuIGluc3RydWN0aW9uIHRhYmxlIHdhcyBub3Qgc3BlY2lmaWVkLiAqLwotZXh0ZXJuIGludCBpdGJsX2hhdmVfZW50cmllczsKLQotLyogVGhlc2Ugcm91dGluZXMgYXJlIHZpc2libGUgdG8gdGhlIG1haW4gcGFydCBvZiB0aGUgYXNzZW1ibGVyICovCi0KLWludCBpdGJsX3BhcnNlIFBBUkFNUyAoKGNoYXIgKmluc250YmwpKTsKLXZvaWQgaXRibF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLWNoYXIgKml0YmxfZ2V0X2ZpZWxkIFBBUkFNUyAoKGNoYXIgKipzKSk7Ci11bnNpZ25lZCBsb25nIGl0YmxfYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqbmFtZSwgY2hhciAqb3BlcmFuZHMpKTsKLWludCBpdGJsX2Rpc2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBpbnNuKSk7Ci1pbnQgaXRibF9wYXJzZSBQQVJBTVMgKChjaGFyICp0YmwpKTsJLyogcGFyc2VzIGluc24gdGJsICovCi1pbnQgaXRibF9nZXRfcmVnX3ZhbCBQQVJBTVMgKChjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpwdmFsKSk7Ci1pbnQgaXRibF9nZXRfdmFsIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsCi0JCQkgIHVuc2lnbmVkIGxvbmcgKnB2YWwpKTsKLWNoYXIgKml0YmxfZ2V0X25hbWUgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwpKTsKLQotLyogVGhlc2Ugcm91dGluZXMgYXJlIGNhbGxlZCBieSB0aGUgdGFibGUgcGFyc2VyIHVzZWQgdG8gYnVpbGQgdGhlCi0gICBkeW5hbWljIGxpc3Qgb2YgbmV3IHByb2Nlc3NvciBpbnN0cnVjdGlvbnMgYW5kIHJlZ2lzdGVycy4gKi8KLQotc3RydWN0IGl0YmxfZW50cnkgKml0YmxfYWRkX3JlZyBQQVJBTVMgKChpbnQgeXlwcm9jLCBpbnQgeXl0eXBlLAotCQkJCQkgY2hhciAqcmVnbmFtZSwgaW50IHJlZ251bSkpOwotc3RydWN0IGl0YmxfZW50cnkgKml0YmxfYWRkX2luc24gUEFSQU1TICgoaW50IHl5cHJvYywgY2hhciAqbmFtZSwKLQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsIGludCBzYml0LCBpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RydWN0IGl0YmxfZmllbGQgKml0YmxfYWRkX29wZXJhbmQgUEFSQU1TICgoc3RydWN0IGl0YmxfZW50cnkgKiBlLCBpbnQgeXl0eXBlLAotCQkJCSAgaW50IHNiaXQsIGludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CmRpZmYgLS1naXQgYS9nYXMvaXRibC1wYXJzZS55IGIvZ2FzL2l0YmwtcGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2NmVlOC4uMDAwMDAwMAotLS0gYS9nYXMvaXRibC1wYXJzZS55CisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS8qIGl0YmwtcGFyc2UueQotICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotJXsKLQotLyogCi0KLVlhY2MgZ3JhbW1hciBmb3IgaW5zdHJ1Y3Rpb24gdGFibGUgZW50cmllcy4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLU9yaWdpbmFsIEluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24gZG9jdW1lbnQ6Ci0KLQkgICAgTUlQUyBDb3Byb2Nlc3NvciBUYWJsZSBTcGVjaWZpY2F0aW9uCi0JICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBNSVBTIGNvcHJvY2Vzc29yIHRhYmxlLiAgVGhlCi10YWJsZSBzcGVjaWZpZXMgYSBsaXN0IG9mIHZhbGlkIGZ1bmN0aW9ucywgZGF0YSByZWdpc3RlcnMgYW5kIGNvbnRyb2wKLXJlZ2lzdGVycyB0aGF0IGNhbiBiZSB1c2VkIGluIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucy4gIFRoaXMgbGlzdCwKLXRvZ2V0aGVyIHdpdGggdGhlIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIGNsYXNzZXMgbGlzdGVkIGJlbG93LAotc3BlY2lmaWVzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyB0aGF0IHdpbGwKLWJlIHJlY29nbml6ZWQgYW5kIGFzc2VtYmxlZCBieSB0aGUgR05VIGFzc2VtYmxlci4gIEluIGVmZmVjdCwKLXRoaXMgbWFrZXMgdGhlIEdOVSBhc3NlbWJsZXIgdGFibGUtZHJpdmVuLCB3aGVyZSB0aGUgdGFibGUgaXMKLXNwZWNpZmllZCBieSB0aGUgcHJvZ3JhbW1lci4KLQotVGhlIHRhYmxlIGlzIGFuIG9yZGluYXJ5IHRleHQgZmlsZSB0aGF0IHRoZSBHTlUgYXNzZW1ibGVyIHJlYWRzIHdoZW4KLWl0IHN0YXJ0cy4gIFVzaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGFibGUsIHRoZSBhc3NlbWJsZXIKLWdlbmVyYXRlcyBhbiBpbnRlcm5hbCBsaXN0IG9mIHZhbGlkIGNvcHJvY2Vzc29yIHJlZ2lzdGVycyBhbmQKLWZ1bmN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgdXNlcyB0aGlzIGludGVybmFsIGxpc3QgaW4gYWRkaXRpb24gdG8gdGhlCi1zdGFuZGFyZCBNSVBTIHJlZ2lzdGVycyBhbmQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFyZSBidWlsdC1pbiB0byB0aGUgCi1hc3NlbWJsZXIgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQotVG8gc3BlY2lmeSB0aGUgY29wcm9jZXNzb3IgdGFibGUgd2hlbiBpbnZva2luZyB0aGUgR05VIGFzc2VtYmxlciwgdXNlCi10aGUgY29tbWFuZCBsaW5lIG9wdGlvbiAiLS1pdGJsIGZpbGUiLCB3aGVyZSBmaWxlIGlzIHRoZQotY29tcGxldGUgbmFtZSBvZiB0aGUgdGFibGUsIGluY2x1ZGluZyBwYXRoIGFuZCBleHRlbnNpb24uCi0KLUV4YW1wbGVzOgotCi0JICAgIGdhcyAtdCBjb3AudGJsIHRlc3QucyAtbyB0ZXN0Lm8KLQkgICAgZ2FzIC10IC91c3IvbG9jYWwvbGliL2NvcC50YmwgdGVzdC5zIC1vIHRlc3QubwotCSAgICBnYXMgLS1pdGJsIGQ6XGdudVxkYXRhXGNvcC50YmwgdGVzdC5zIC1vIHRlc3QubwotCi1Pbmx5IG9uZSB0YWJsZSBtYXkgYmUgc3VwcGxpZWQgZHVyaW5nIGEgc2luZ2xlIGludm9jYXRpb24gb2YKLXRoZSBhc3NlbWJsZXIuCi0KLQotSW5zdHJ1Y3Rpb24gY2xhc3NlcwotPT09PT09PT09PT09PT09PT09PQotCi1CZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHZhbGlkIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIGNsYXNzZXMgZm9yCi1hbnkgZ2l2ZW4gY29wcm9jZXNzb3IgInoiLiAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBhbHJlYWR5IHJlY29nbml6ZWQKLWJ5IHRoZSBhc3NlbWJsZXIsIGFuZCBhcmUgbGlzdGVkIGhlcmUgb25seSBmb3IgcmVmZXJlbmNlLgotCi1DbGFzcyAgIGZvcm1hdAkgICAgCSAgICAJICAgICAgaW5zdHJ1Y3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1DbGFzczE6Ci0Jb3AgYmFzZSBydCBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgTFdDeiBydCxvZmZzZXQgKGJhc2UpCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIFNXQ3ogcnQsb2Zmc2V0IChiYXNlKQotQ2xhc3MyOgotCUNPUHogc3ViIHJ0IHJkIDAKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgTVRDeiBydCxyZAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBNRkN6IHJ0LHJkCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIENUQ3ogcnQscmQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQ0ZDeiBydCxyZAotQ2xhc3MzOgotCUNPUHogQ08gY29mdW4KLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQ09QeiBjb2Z1bgotQ2xhc3M0OgotCUNPUHogQkMgYnIgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIEJDelQgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIEJDekYgb2Zmc2V0Ci1DbGFzczU6Ci0JQ09QeiBzdWIgcnQgcmQgMAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBETUZDeiBydCxyZAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBETVRDeiBydCxyZAotQ2xhc3M2OgotCW9wIGJhc2UgcnQgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIExEQ3ogcnQsb2Zmc2V0IChiYXNlKQotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBTREN6IHJ0LG9mZnNldCAoYmFzZSkKLUNsYXNzNzoKLQlDT1B6IEJDIGJyIG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pUTCBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQkN6Rkwgb2Zmc2V0Ci0KLVRoZSBjb3Byb2Nlc3NvciB0YWJsZSBkZWZpbmVzIGNvcHJvY2Vzc29yLXNwZWNpZmljIHJlZ2lzdGVycyB0aGF0IGNhbgotYmUgdXNlZCB3aXRoIGFsbCBvZiB0aGUgYWJvdmUgY2xhc3NlcyBvZiBpbnN0cnVjdGlvbnMsIHdoZXJlCi1hcHByb3ByaWF0ZS4gIEl0IGFsc28gZGVmaW5lcyBhZGRpdGlvbmFsIGNvcHJvY2Vzc29yLXNwZWNpZmljCi1mdW5jdGlvbnMgZm9yIENsYXNzMyAoQ09QeiBjb2Z1bikgaW5zdHJ1Y3Rpb25zLCBUaHVzLCB0aGUgdGFibGUgYWxsb3dzCi10aGUgcHJvZ3JhbW1lciB0byB1c2UgY29udmVuaWVudCBtbmVtb25pY3MgYW5kIG9wZXJhbmRzIGZvciB0aGVzZQotZnVuY3Rpb25zLCBpbnN0ZWFkIG9mIHRoZSBDT1B6IG1tZW5tb25pYyBhbmQgY29mdW4gb3BlcmFuZC4KLQotVGhlIG5hbWVzIG9mIHRoZSBNSVBTIGdlbmVyYWwgcmVnaXN0ZXJzIGFuZCB0aGVpciBhbGlhc2VzIGFyZSBkZWZpbmVkCi1ieSB0aGUgYXNzZW1ibGVyIGFuZCB3aWxsIGJlIHJlY29nbml6ZWQgYXMgdmFsaWQgcmVnaXN0ZXIgbmFtZXMgYnkgdGhlCi1hc3NlbWJsZXIgd2hlbiB1c2VkICh3aGVyZSBhbGxvd2VkKSBpbiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuCi1Ib3dldmVyLCB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiBhbGwgY29wcm9jZXNzb3IgZGF0YSBhbmQgY29udHJvbAotcmVnaXN0ZXIgbW5lbW9uaWNzIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBjb3Byb2Nlc3NvciB0YWJsZS4KLQotCi1UYWJsZSBHcmFtbWFyCi09PT09PT09PT09PT09Ci0KLUhlcmUgaXMgdGhlIGdyYW1tYXIgZm9yIHRoZSBjb3Byb2Nlc3NvciB0YWJsZToKLQotCSAgICB0YWJsZSAtPiBlbnRyeSoKLQotCSAgICBlbnRyeSAtPiBbeiBlbnRyeWRlZl0gW2NvbW1lbnRdICdcbicKLQotCSAgICBlbnRyeWRlZiAtPiB0eXBlIG5hbWUgdmFsCi0JICAgIGVudHJ5ZGVmIC0+ICdpbnNuJyBuYW1lIHZhbCBmdW5jZGVmIDsgdHlwZSBvZiBlbnRyeSAoaW5zdHJ1Y3Rpb24pCi0KLQkgICAgeiAtPiAncCdbJzAnLi4nMyddCSAgICAJICAgICA7IHByb2Nlc3NvciBudW1iZXIgCi0JICAgIHR5cGUgLT4gWydkcmVnJyB8ICdjcmVnJyB8ICdncmVnJyBdCSAgICAgOyB0eXBlIG9mIGVudHJ5IChyZWdpc3RlcikKLQk7ICdkcmVnJywgJ2NyZWcnIG9yICdncmVnJyBzcGVjaWZpZXMgYSBkYXRhLCBjb250cm9sLCBvciBnZW5lcmFsCi0JOwkgICAgcmVnaXN0ZXIgbW5lbW9uaWMsIHJlc3BlY3RpdmVseQotCSAgICBuYW1lIC0+IFtsdHJ8ZGVjXSoJICAgIAkgICAgIDsgbW5lbW9uaWMgb2YgcmVnaXN0ZXIvZnVuY3Rpb24KLQkgICAgdmFsIC0+IFtkZWN8aGV4XQkgICAgCSAgICAgOyByZWdpc3Rlci9mdW5jdGlvbiBudW1iZXIgKGludGVnZXIgY29uc3RhbnQpCi0KLQkgICAgZnVuY2RlZiAtPiBmcmFuZ2UgZmxhZ3MgZmllbGRzCi0JICAgIAkgICAgCSAgICAJOyBiaXRmaWVsZCByYW5nZSBmb3Igb3Bjb2RlCi0JICAgIAkgICAgCSAgICAJOyBsaXN0IG9mIGZpZWxkcycgZm9ybWF0cwotCSAgICBmaWVsZHMgLT4gZmllbGQqCi0JICAgIGZpZWxkIC0+IFsnLCddIGZ0eXBlIGZyYW5nZSBmbGFncwotCSAgICBmbGFncyAtPiBbJyonIGZsYWdleHByXQotCSAgICBmbGFnZXhwciAtPiAnWycgZmxhZ2V4cHIgJ10nCi0JICAgIGZsYWdleHByIC0+IHZhbCAnfCcgZmxhZ2V4cHIgCi0JICAgIGZ0eXBlIC0+IFsgdHlwZSB8ICdpbW1lZCcgfCAnYWRkcicgXQotCTsgJ2ltbWVkJyBzcGVjaWZpZXMgYW4gaW1tZWRpYXRlIHZhbHVlOyBzZWUgZ3JhbW1hciBmb3IgInZhbCIgYWJvdmUKLQkgICAgCTsgJ2FkZHInIHNwZWNpZmllcyBhIEMgaWRlbnRpZmllcjsgbmFtZSBvZiBzeW1ib2wgdG8gYmUgcmVzb2x2ZWQgYXQgCi0JOwkgICAgbGluayB0aW1lCi0JICAgIGZyYW5nZSAtPiAnOicgdmFsICctJyB2YWwJOyBzdGFydGluZyB0byBlbmRpbmcgYml0IHBvc2l0aW9ucywgd2hlcmUKLQkgICAgCSAgICAJICAgIAk7IHdoZXJlIDAgaXMgbGVhc3Qgc2lnbmlmaWNhbnQgYml0Ci0JICAgIGZyYW5nZSAtPiAobnVsbCkJICAgIAk7IGRlZmF1bHQgcmFuZ2Ugb2YgMzEtMCB3aWxsIGJlIGFzc3VtZWQKLQotCSAgICBjb21tZW50IC0+IFsnOyd8JyMnXSBbY2hhcl0qCi0JICAgIGNoYXIgLT4gYW55IHByaW50YWJsZSBjaGFyYWN0ZXIKLQkgICAgbHRyIC0+IFsnYScuLid6J3wnQScuLidaJ10gCi0JICAgIGRlYyAtPiBbJzAnLi4nOSddKgkgICAgCSAgICAJICAgIAkgICAgCSAgICAgOyB2YWx1ZSBpbiBkZWNpbWFsCi0JICAgIGhleCAtPiAnMHgnWycwJy4uJzknIHwgJ2EnLi4nZicgfCAnQScuLidGJ10qCTsgdmFsdWUgaW4gaGV4aWRlY2ltYWwgCi0KLQotRXhhbXBsZXMKLT09PT09PT09Ci0KLUV4YW1wbGUgMToKLQotVGhlIHRhYmxlOgotCi0JICAgIHAxIGRyZWcgZDEgMQkgICAgIDsgZGF0YSByZWdpc3RlciAiZDEiIGZvciBDT1AxIGhhcyB2YWx1ZSAxCi0JICAgIHAxIGNyZWcgYzMgMwkgICAgIDsgY3RybCByZWdpc3RlciAiYzMiIGZvciBDT1AxIGhhcyB2YWx1ZSAzCi0JICAgIHAzIGZ1bmMgZmlsbCAweDFmOjI0LTIwCSAgICAgIDsgZnVuY3Rpb24gImZpbGwiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMSBhbmQgCi0JICAgIAkgICAgCTsgbm8gZmllbGRzCi0KLXdpbGwgYWxsb3cgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQgdGhlIGZvbGxvd2luZyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnM6Ci0KLQkgICAgTFdDMSBkMSwweDEwMCAoJDIpCi0JICAgIGZpbGwKLQotSGVyZSwgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAiJDIiLCBhbmQgaW5zdHJ1Y3Rpb24gIkxXQzEiLCBhcmUgc3RhbmRhcmQgCi1tbmVtb25pY3MgYnVpbHQtaW4gdG8gdGhlIE1JUFMgYXNzZW1ibGVyLiAgCi0KLQotRXhhbXBsZSAyOgotCi1UaGUgdGFibGU6Ci0KLQkgICAgcDMgZHJlZyBkMyAzCSAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLQkgICAgcDMgY3JlZyBjMiAyMgkgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotCSAgICBwMyBmdW5jIGZlZSAweDFmOjI0LTIwIGRyZWc6MTctMTMgY3JlZzoxMi04IGltbWVkOjctMCAKLQkgICAgCTsgZnVuY3Rpb24gImZlZSIgZm9yIENPUDMgaGFzIHZhbHVlIDMxLCBhbmQgMyBmaWVsZHMgCi0JICAgIAk7IGNvbnNpc3Rpbmcgb2YgYSBkYXRhIHJlZ2lzdGVyLCBhIGNvbnRyb2wgcmVnaXN0ZXIsIAotCSAgICAJOyBhbmQgYW4gaW1tZWRpYXRlIHZhbHVlLgotCi13aWxsIGFsbG93IHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IHRoZSBmb2xsb3dpbmcgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb246Ci0KLQkgICAgZmVlIGQzLGMyLDB4MQotCi1hbmQgd2lsbCBlbWl0IHRoZSBvYmplY3QgY29kZToKLQotCSAgICAzMS0yNiAgMjUgMjQtMjAgMTktMTggIDE3LTEzIDEyLTggIDctMAotCSAgICBDT1B6ICAgQ08gZnVuCSAgICAJICAgICAgZHJlZyAgY3JlZyAgaW1tZWQKLQkgICAgMDEwMDExIDEgIDExMTExIDAwCSAgICAgMDAwMTEgMTAxMTAgMDAwMDAwMDEgCi0KLQkgICAgMHg0ZmYwNzYwMQotCi0KLUV4YW1wbGUgMzoKLQotVGhlIHRhYmxlOgotCi0JICAgIHAzIGRyZWcgZDMgMwkgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0JICAgIHAzIGNyZWcgYzIgMjIJICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLQkgICAgcDMgZnVuYyBmdXUgMHgwMWYwMDAwMSBkcmVnOjE3LTEzIGNyZWc6MTItOAotCi13aWxsIGFsbG93IHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IHRoZSBmb2xsb3dpbmcgY29wcm9jZXNzb3IKLWluc3RydWN0aW9uOgotCi0JICAgIGZ1dSBkMyxjMgotCi1hbmQgd2lsbCBlbWl0IHRoZSBvYmplY3QgY29kZToKLQotCSAgICAzMS0yNiAgMjUgMjQtMjAgMTktMTggIDE3LTEzIDEyLTggIDctMAotCSAgICBDT1B6ICAgQ08gZnVuCSAgICAJICAgICAgZHJlZyAgY3JlZyAgCi0JICAgIDAxMDAxMSAxICAxMTExMSAwMAkgICAgIDAwMDExIDEwMTEwIDAwMDAwMDAxIAotCi0JICAgIDB4NGZmMDc2MDEKLQotSW4gdGhpcyB3YXksIHRoZSBwcm9ncmFtbWVyIGNhbiBmb3JjZSBhcmJpdHJhcnkgYml0cyBvZiBhbiBpbnN0cnVjdGlvbgotdG8gaGF2ZSBwcmVkZWZpbmVkIHZhbHVlcy4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUFkZGl0aW9uYWwgbm90ZXM6Ci0KLUVuY29kaW5nIG9mIHJhbmdlczoKLVRvIGhhbmRsZSBtb3JlIHRoYW4gb25lIGJpdCBwb3NpdGlvbiByYW5nZSB3aXRoaW4gYW4gaW5zdHJ1Y3Rpb24sCi11c2UgMHMgdG8gbWFzayBvdXQgdGhlIHJhbmdlcyB3aGljaCBkb24ndCBhcHBseS4KLU1heSBkZWNpZGUgdG8gbW9kaWZ5IHRoZSBzeW50YXggdG8gYWxsb3cgY29tbWFzIHNlcGFyYXRlIG11bHRpcGxlIAotcmFuZ2VzIHdpdGhpbiBhbiBpbnN0cnVjdGlvbiAocmFuZ2UnLCdyYW5nZSkuCi0KLUNoYW5nZXMgaW4gZ3JhbW1hcjoKLQlUaGUgbnVtYmVyIG9mIHBhcm1zIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbiBlbnRyeQotd2FzIGRlbGV0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgZm9ybWF0IHN1Y2ggdGhhdCB3ZSBub3cgY291bnQgdGhlIGZpZWxkcy4KLQotLS0tLQotRklYTUUhIHNob3VsZCByZWFsbHkgY2hhbmdlIGxleGljYWwgYW5hbHl6ZXIgCi10byByZWNvZ25pemUgJ2RyZWcnIGV0Yy4gaW4gY29udGV4dCBzZW5zYXRpdmUgd2F5LgotQ3VycmVudGx5IGZ1bmN0aW9uIG5hbWVzIG9yIG1uZW1vbmljcyBtYXkgYmUgaW5jb3JyZWN0bHkgcGFyc2VkIGFzIGtleXdvcmRzCi0KLUZJWE1FISBoZXggaXMgYW1iaWd1b3VzIHdpdGggYW55IGRpZ2l0Ci0KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0KLS8qICNkZWZpbmUgREVCVUcgKi8KLQotI2lmZGVmIERFQlVHCi0jaWZuZGVmIERCR19MVkwKLSNkZWZpbmUgREJHX0xWTCAxCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIERCR19MVkwgMAotI2VuZGlmCi0KLSNpZiBEQkdfTFZMID49IDEKLSNkZWZpbmUgREJHKHgpIHByaW50ZiB4Ci0jZWxzZQotI2RlZmluZSBEQkcoeCkgCi0jZW5kaWYKLQotI2lmIERCR19MVkwgPj0gMgotI2RlZmluZSBEQkdMMih4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgREJHTDIoeCkgCi0jZW5kaWYKLQotc3RhdGljIGludCBzYml0LCBlYml0Owotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICppbnNuPTA7Ci1leHRlcm4gaW50IGluc250YmxfbGluZTsKLWludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSV9Ci0KLSV1bmlvbiAKLSAgewotICAgIGNoYXIgKnN0cjsKLSAgICBpbnQgbnVtOwotICAgIGludCBwcm9jZXNzb3I7Ci0gICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIH0KLQotJXRva2VuCSAgICBEUkVHIENSRUcgR1JFRyBJTU1FRCBBRERSIElOU04gTlVNIElEIE5MIFBOVU0KLSV0eXBlCSAgICA8dmFsPiB2YWx1ZSBmbGFncyBmbGFnZXhwcgotJXR5cGUJICAgIDxudW0+IG51bWJlciBOVU0gZnR5cGUgcmVndHlwZSBwbnVtIFBOVU0KLSV0eXBlCSAgICA8c3RyPiBJRCBuYW1lCi0KLSVzdGFydCBpbnNudGJsCi0KLSUlCi0KLWluc250Ymw6Ci0JZW50cnlzCi0JOwotCi1lbnRyeXM6Ci0JZW50cnkgZW50cnlzCi0JfAotCTsKLQotZW50cnk6Ci0JcG51bSByZWd0eXBlIG5hbWUgdmFsdWUgTkwKLQkgIHsKLQkgICAgREJHICgoImxpbmUgJWQ6IGVudHJ5IHBudW09JWQgdHlwZT0lZCBuYW1lPSVzIHZhbHVlPXgleFxuIiwgCi0JICAgIAkgICAgaW5zbnRibF9saW5lLCAkMSwgJDIsICQzLCAkNCkpOwotCSAgICBpdGJsX2FkZF9yZWcgKCQxLCAkMiwgJDMsICQ0KTsKLQkgIH0KLQl8IHBudW0gSU5TTiBuYW1lIHZhbHVlIHJhbmdlIGZsYWdzCi0JICB7Ci0JICAgIERCRyAoKCJsaW5lICVkOiBlbnRyeSBwbnVtPSVkIHR5cGU9SU5TTiBuYW1lPSVzIHZhbHVlPXgleCIsCi0JICAgIAkgICAgaW5zbnRibF9saW5lLCAkMSwgJDMsICQ0KSk7Ci0JICAgIERCRyAoKCIgc2JpdD0lZCBlYml0PSVkIGZsYWdzPTB4JXhcbiIsIHNiaXQsIGViaXQsICQ2KSk7Ci0JICAgIGluc249aXRibF9hZGRfaW5zbiAoJDEsICQzLCAkNCwgc2JpdCwgZWJpdCwgJDYpOwotCSAgfQotCWZpZWxkc3BlY3MgTkwKLQl8IE5MCi0JfCBlcnJvciBOTAotCTsKLQotZmllbGRzcGVjczoKLQknLCcgZmllbGRzcGVjIGZpZWxkc3BlY3MKLQl8IGZpZWxkc3BlYyBmaWVsZHNwZWNzCi0JfAotCTsKLQotZnR5cGU6Ci0JcmVndHlwZSAKLQkgIHsKLQkgICAgREJHTDIgKCgiZnR5cGVcbiIpKTsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IEFERFIgCi0JICB7Ci0JICAgIERCR0wyICgoImFkZHJcbiIpKTsKLQkgICAgJCQgPSBBRERSOwotCSAgfQotCXwgSU1NRUQKLQkgIHsKLQkgICAgREJHTDIgKCgiaW1tZWRcbiIpKTsKLQkgICAgJCQgPSBJTU1FRDsKLQkgIH0KLQk7Ci0KLWZpZWxkc3BlYzoKLQlmdHlwZSByYW5nZSBmbGFncwotCSAgewotCSAgICBEQkcgKCgibGluZSAlZDogZmllbGQgdHlwZT0lZCBzYml0PSVkIGViaXQ9JWQsIGZsYWdzPTB4JXhcbiIsIAotCSAgICAJICAgIGluc250YmxfbGluZSwgJDEsIHNiaXQsIGViaXQsICQzKSk7Ci0JICAgIGl0YmxfYWRkX29wZXJhbmQgKGluc24sICQxLCBzYml0LCBlYml0LCAkMyk7Ci0JICB9Ci0JOwotCi1mbGFnZXhwcjoKLQlOVU0gJ3wnIGZsYWdleHByCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMzsKLQkgIH0KLQl8ICdbJyBmbGFnZXhwciAnXScKLQkgIHsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQl8IE5VTQotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotZmxhZ3M6Ci0JJyonIGZsYWdleHByCi0JICB7Ci0JICAgIERCR0wyICgoImZsYWdzPSVkXG4iLCAkMikpOwotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgCi0JICB7Ci0JICAgICQkID0gMDsKLQkgIH0KLQk7Ci0KLXJhbmdlOgotCSc6JyBOVU0gJy0nIE5VTQotCSAgewotCSAgICBEQkdMMiAoKCJyYW5nZSAlZCAlZFxuIiwgJDIsICQ0KSk7Ci0JICAgIHNiaXQgPSAkMjsKLQkgICAgZWJpdCA9ICQ0OwotCSAgfQotCXwKLQkgIHsKLQkgICAgc2JpdCA9IDMxOwotCSAgICBlYml0ID0gMDsKLQkgIH0KLQk7Ci0JICAgIAotcG51bToKLQlQTlVNCi0JICB7Ci0JICAgIERCR0wyICgoInBudW09JWRcbiIsJDEpKTsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLXJlZ3R5cGU6Ci0JICAgICBEUkVHCi0JICB7Ci0JICAgIERCR0wyICgoImRyZWdcbiIpKTsKLQkgICAgJCQgPSBEUkVHOwotCSAgfQotCXwgQ1JFRwotCSAgewotCSAgICBEQkdMMiAoKCJjcmVnXG4iKSk7Ci0JICAgICQkID0gQ1JFRzsKLQkgIH0KLQl8IEdSRUcKLQkgIHsKLQkgICAgREJHTDIgKCgiZ3JlZ1xuIikpOwotCSAgICAkJCA9IEdSRUc7Ci0JICB9Ci0JOwotCi1uYW1lOgotCUlECi0JICB7Ci0JICAgIERCR0wyICgoIm5hbWU9JXNcbiIsJDEpKTsKLQkgICAgJCQgPSAkMTsgCi0JICB9Ci0JOwotCi1udW1iZXI6Ci0JTlVNCi0JICB7Ci0JICAgIERCR0wyICgoIm51bT0lZFxuIiwkMSkpOwotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotdmFsdWU6Ci0JTlVNCi0JICB7Ci0JICAgIERCR0wyICgoInZhbD14JXhcbiIsJDEpKTsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0lJQotCi1zdGF0aWMgaW50Ci15eWVycm9yIChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgcHJpbnRmICgibGluZSAlZDogJXNcbiIsIGluc250YmxfbGluZSwgbXNnKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvbGluay5jbWQgYi9nYXMvbGluay5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzVjYTguLjAwMDAwMDAKLS0tIGEvZ2FzL2xpbmsuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQUxJR049MTAyNAotUkVTTlVNIDB4MDAwMCwgMHg4MDAwCi07IFB1dHRpbmcgaW4gLmxpdDEgZ2l2ZXMgZXJyb3JzLgotT1JERVIgLmRhdGE9MHg4MDAwMjAwMCwgLmRhdGExLCAubGl0LCAuYnNzCi07IExldCdzIHB1dCB0aGlzIG9uIHRoZSBjb21tYW5kIGxpbmUgc28gaXQgZ29lcyBmaXJzdCwgd2hpY2ggaXMgd2hhdAotOyBHREIgZXhwZWN0cy4KLTsgTE9BRCAvczIvYW1kLzI5ay9saWIvY3J0MC5vCi1MT0FEIC9zMi9hbWQvMjlrL2xpYi9saWJxY2IwaC5saWIKLUxPQUQgL3MyL2FtZC8yOWsvbGliL2xpYnNjYjBoLmxpYgotTE9BRCAvczIvYW1kLzI5ay9saWIvbGliYWNiMGgubGliCmRpZmYgLS1naXQgYS9nYXMvbGlzdGluZy5jIGIvZ2FzL2xpc3RpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjZjI0NS4uMDAwMDAwMAotLS0gYS9nYXMvbGlzdGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQyNSArMCwwIEBACi0vKiBsaXN0aW5nLmMgLSBtYWludGluZyBhc3NlbWJseSBsaXN0aW5ncwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyoKLSBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgotIAkJc2FjQGN5Z251cy5jb20KLQotCi0gQSBsaXN0aW5nIHBhZ2UgbG9va3MgbGlrZToKLQotIExJU1RJTkdfSEVBREVSICBzb3VyY2VmaWxlbmFtZSBwYWdlbnVtYmVyCi0gVElUTEUgTElORQotIFNVQlRJVExFIExJTkUKLSBsaW5lbnVtYmVyIGFkZHJlc3MgZGF0YSAgc291cmNlCi0gbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQotIGxpbmVudW1iZXIgYWRkcmVzcyBkYXRhICBzb3VyY2UKLSBsaW5lbnVtYmVyIGFkZHJlc3MgZGF0YSAgc291cmNlCi0KLSBJZiBub3Qgb3ZlcnJpZGRlbiwgdGhlIGxpc3RpbmcgY29tbWFuZHMgYXJlOgotCi0gLnRpdGxlICAic3R1ZmYiCi0gCVB1dCAic3R1ZmYiIG9udG8gdGhlIHRpdGxlIGxpbmUKLSAuc2J0dGwgICJzdHVmZiIKLSAgICAgICAgUHV0IHN0dWZmIG9udG8gdGhlIHN1YnRpdGxlIGxpbmUKLQotICBJZiB0aGVzZSBjb21tYW5kcyBjb21lIHdpdGhpbiAxMCBsaW5lcyBvZiB0aGUgdG9wIG9mIHRoZSBwYWdlLCB0aGV5Ci0gIHdpbGwgYWZmZWN0IHRoZSBwYWdlIHRoZXkgYXJlIG9uLCBhcyB3ZWxsIGFzIGFueSBzdWJzZXF1ZW50IHBhZ2UKLQotIC5lamVjdAotIAlUaG93IGEgcGFnZQotIC5saXN0Ci0gCUluY3JlbWVudCB0aGUgZW5hYmxlIGxpc3RpbmcgY291bnRlcgotIC5ub2xpc3QKLSAJRGVjcmVtZW50IHRoZSBlbmFibGUgbGlzdGluZyBjb3VudGVyCi0KLSAucHNpemUgWVssWF0KLSAJU2V0IHRoZSBwYXBlciBzaXplIHRvIFggd2lkZSBhbmQgWSBoaWdoLiBTZXR0aW5nIGEgcHNpemUgWSBvZgotCXplcm8gd2lsbCBzdXBwcmVzcyBmb3JtIGZlZWRzIGV4Y2VwdCB3aGVyZSBkZW1hbmRlZCBieSAuZWplY3QKLQotIElmIHRoZSBjb3VudGVyIGdvZXMgYmVsb3cgemVybywgbGlzdGluZyBpcyBzdXBwcmVzc2VkLgotCi0KLSBMaXN0aW5ncyBhcmUgYSBtYWludGFpbmVkIGJ5IHJlYWQgY2FsbGluZyB2YXJpb3VzIGxpc3RpbmdfPGZvbz4KLSBmdW5jdGlvbnMuICBXaGF0IGhhcHBlbnMgbW9zdCBpcyB0aGF0IHRoZSBtYWNybyBOT19MSVNUSU5HIGlzIG5vdAotIGRlZmluZWQgKGZyb20gdGhlIE1ha2VmaWxlKSwgdGhlbiB0aGUgbWFjcm8gTElTVElOR19ORVdMSU5FIGV4cGFuZHMKLSBpbnRvIGEgY2FsbCB0byBsaXN0aW5nX25ld2xpbmUuICBUaGUgY2FsbCBpcyBkb25lIGZyb20gcmVhZC5jLCBldmVyeQotIHRpbWUgaXQgc2VlcyBhIG5ld2xpbmUsIGFuZCAtbCBpcyBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi0gVGhlIGZ1bmN0aW9uIGxpc3RpbmdfbmV3bGluZSByZW1lbWJlcnMgdGhlIGZyYWcgYXNzb2NpYXRlZCB3aXRoIHRoZQotIG5ld2xpbmUsIGFuZCBjcmVhdGVzIGEgbmV3IGZyYWcgLSBub3RlIHRoYXQgdGhpcyBpcyB3YXN0ZWZ1bCwgYnV0IG5vdAotIGEgYmlnIGRlYWwsIHNpbmNlIGxpc3Rpbmcgc2xvd3MgdGhpbmdzIGRvd24gYSBsb3QgYW55d2F5LiAgVGhlCi0gZnVuY3Rpb24gYWxzbyByZW1lbWViZXJzIHdoZW4gdGhlIGZpbGVuYW1lIGNoYW5nZXMuCi0KLSBXaGVuIGFsbCB0aGUgaW5wdXQgaGFzIGZpbmlzaGVkLCBhbmQgZ2FzIGhhcyBoYWQgYSBjaGFuY2UgdG8gc2V0dGxlCi0gZG93biwgdGhlIGxpc3RpbmcgaXMgb3V0cHV0LiBUaGlzIGlzIGRvbmUgYnkgcnVubmluZyBkb3duIHRoZSBsaXN0IG9mCi0gZnJhZy9zb3VyY2UgZmlsZSByZWNvcmRzLCBhbmQgb3BlbmluZyB0aGUgZmlsZXMgYXMgbmVlZGVkIGFuZCBwcmludGluZwotIG91dCB0aGUgYnl0ZXMgYW5kIGNoYXJzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgotCi0gVGhlIG9ubHkgdGhpbmdzIHdoaWNoIHRoZSBhcmNoaXRlY3R1cmUgY2FuIGNoYW5nZSBhYm91dCB0aGUgbGlzdGluZwotIGFyZSBkZWZpbmVkIGluIHRoZXNlIG1hY3JvczoKLQotIExJU1RJTkdfSEVBREVSCQlUaGUgbmFtZSBvZiB0aGUgYXJjaGl0ZWN0dXJlCi0gTElTVElOR19XT1JEX1NJWkUgICAgICBUaGUgbWFrZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgd29yZCwgdGhpcyBkZXRlcm1pbmVzCi0gCQkJdGhlIGNsdW1waW5nIG9mIHRoZSBvdXRwdXQgZGF0YS4gZWcgYSB2YWx1ZSBvZgotCQkJMiBtYWtlcyB3b3JkcyBsb29rIGxpa2UgMTIzNCA1Njc4LCB3aGlsc3QgMQotCQkJd291bGQgbWFrZSB0aGUgc2FtZSB2YWx1ZSBsb29rIGxpa2UgMTIgMzQgNTYKLQkJCTc4Ci0gTElTVElOR19MSFNfV0lEVEggICAgICBOdW1iZXIgb2Ygd29yZHMgb2YgYWJvdmUgc2l6ZSBmb3IgdGhlIGxocwotCi0gTElTVElOR19MSFNfV0lEVEhfU0VDT05EICAgTnVtYmVyIG9mIHdvcmRzIGZvciB0aGUgZGF0YSBvbiB0aGUgbGhzCi0gCQkJZm9yIHRoZSBzZWNvbmQgbGluZQotCi0gTElTVElOR19MSFNfQ09OVF9MSU5FUwlNYXggbnVtYmVyIG9mIGxpbmVzIHRvIHVzZSB1cCBmb3IgYSBjb250aW51dGF0aW9uCi0gTElTVElOR19SSFNfV0lEVEggICAgICBOdW1iZXIgb2YgY2hhcnMgZnJvbSB0aGUgaW5wdXQgZmlsZSB0byBwcmludAotICAgICAgICAgICAgICAgICAgICAgICAgb24gYSBsaW5lCi0qLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSA8b2JzdGFjay5oPgotI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpZm5kZWYgTk9fTElTVElORwotCi0jaWZuZGVmIExJU1RJTkdfSEVBREVSCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJHQVMgTElTVElORyIKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX1dPUkRfU0laRQotI2RlZmluZSBMSVNUSU5HX1dPUkRfU0laRSA0Ci0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19MSFNfV0lEVEgKLSNkZWZpbmUgTElTVElOR19MSFNfV0lEVEggKChMSVNUSU5HX1dPUkRfU0laRSkgPiA0ID8gMSA6IDQgLyAoTElTVElOR19XT1JEX1NJWkUpKQotI2VuZGlmCi0jaWZuZGVmIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORAotI2RlZmluZSBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQgTElTVElOR19MSFNfV0lEVEgKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX1JIU19XSURUSAotI2RlZmluZSBMSVNUSU5HX1JIU19XSURUSCAxMDAKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX0xIU19DT05UX0xJTkVTCi0jZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMgNAotI2VuZGlmCi0KLS8qIFRoaXMgc3RydWN0dXJlIHJlbWVtYmVycyB3aGljaCAucyB3ZXJlIHVzZWQgKi8KLXR5cGVkZWYgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QKLXsKLSAgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QgKiBuZXh0OwotICBjaGFyICogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOwotICBsb25nICAgICAgICAgICAgICAgICAgICAgIHBvczsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBsaW5lbnVtOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGF0X2VuZDsKLX0KLWZpbGVfaW5mb190eXBlOwotCi0vKiBUaGlzIHN0cnVjdHVyZSByZW1lbWVicnMgd2hpY2ggbGluZSBmcm9tIHdoaWNoIGZpbGUgZ29lcyBpbnRvIHdoaWNoCi0gICBmcmFnICovCi1zdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdAotewotICAvKiBGcmFnIHdoaWNoIHRoaXMgbGluZSBvZiBzb3VyY2UgaXMgbmVhcmVzdCB0byAqLwotICBmcmFnUyAqIGZyYWc7Ci0KLSAgLyogVGhlIGFjdHVhbCBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgLyogUG9pbnRlciB0byB0aGUgZmlsZSBpbmZvIHN0cnVjdCBmb3IgdGhlIGZpbGUgd2hpY2ggdGhpcyBsaW5lCi0gICAgIGJlbG9uZ3MgdG8gKi8KLSAgZmlsZV9pbmZvX3R5cGUgKiBmaWxlOwotCi0gIC8qIFRoZSBleHBhbmRlZCB0ZXh0IG9mIGFueSBtYWNybyB0aGF0IG1heSBoYXZlIGJlZW4gZXhlY3V0aW5nLiAgKi8KLSAgY2hhciAqIGxpbmVfY29udGVudHM7Ci0KLSAgLyogTmV4dCBpbiBsaXN0ICovCi0gIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogbmV4dDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBmaWxlIGluZm8gc3RydWN0IGZvciB0aGUgaGlnaCBsZXZlbCBsYW5ndWFnZQotICAgICBzb3VyY2UgbGluZSB0aGF0IGJlbG9uZ3MgaGVyZSAqLwotICBmaWxlX2luZm9fdHlwZSAqIGhsbF9maWxlOwotICAvKiBIaWdoIGxldmVsIGxhbmd1YWdlIHNvdXJjZSBsaW5lICovCi0gIHVuc2lnbmVkIGludCBobGxfbGluZTsKLQotICAvKiBQb2ludGVyIHRvIGFueSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpbmUgKi8KLSAgY2hhciAqIG1lc3NhZ2U7Ci0KLSAgZW51bQotICAgIHsKLSAgICAgIEVESUNUX05PTkUsCi0gICAgICBFRElDVF9TQlRUTCwKLSAgICAgIEVESUNUX1RJVExFLAotICAgICAgRURJQ1RfTk9MSVNULAotICAgICAgRURJQ1RfTElTVCwKLSAgICAgIEVESUNUX05PTElTVF9ORVhULAotICAgICAgRURJQ1RfRUpFQ1QKLSAgICB9IGVkaWN0OwotICBjaGFyICogZWRpY3RfYXJnOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBsaW5lIGlzIHRvIGJlIG9taXR0ZWQgYmVjYXVzZSBpdCBjb250YWlucwotICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBiZWNvbWUgYSBmbGFncyBmaWVsZCBpZiB3ZSBjb21lCi0gICAgIHVwIHdpdGggbW9yZSBpbmZvcm1hdGlvbiB0byBzdG9yZSBoZXJlLiAgKi8KLSAgaW50IGRlYnVnZ2luZzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgbGlzdF9pbmZvX3R5cGU7Ci0KLQotaW50IGxpc3RpbmdfbGhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfTEhTX1dJRFRIOwotaW50IGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORDsKLWludCBsaXN0aW5nX2xoc19jb250X2xpbmVzICAgPSBMSVNUSU5HX0xIU19DT05UX0xJTkVTOwotaW50IGxpc3RpbmdfcmhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfUkhTX1dJRFRIOwotCi1zdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqICAgICAgICBsaXN0aW5nX3RhaWw7Ci0KLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqICAgICAgICAgIGZpbGVfaW5mb19oZWFkOwotc3RhdGljIGZpbGVfaW5mb190eXBlICogICAgICAgICAgbGFzdF9vcGVuX2ZpbGVfaW5mbzsKLXN0YXRpYyBGSUxFICogICAgICAgICAgICAgICAgICAgIGxhc3Rfb3Blbl9maWxlOwotc3RhdGljIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogaGVhZDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgIHBhcGVyX3dpZHRoID0gMjAwOwotc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgICAgcGFwZXJfaGVpZ2h0ID0gNjA7Ci0KLWV4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmc7Ci0KLS8qIEZpbGUgdG8gb3V0cHV0IGxpc3RpbmdzIHRvLiAgKi8KLXN0YXRpYyBGSUxFICogbGlzdF9maWxlOwotCi0vKiBUaGlzIHN0YXRpYyBhcnJheSBpcyB1c2VkIHRvIGtlZXAgdGhlIHRleHQgb2YgZGF0YSB0byBiZSBwcmludGVkCi0gICBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiAgKi8KLQotI2RlZmluZSBNQVhfQllURVMJCQkJCQkJXAotICAoKChMSVNUSU5HX1dPUkRfU0laRSAqIDIpICsgMSkgKiBsaXN0aW5nX2xoc193aWR0aAkJCVwKLSAgICsgKCgoKExJU1RJTkdfV09SRF9TSVpFICogMikgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCkJXAotICAgICAgKiBsaXN0aW5nX2xoc19jb250X2xpbmVzKQkJCQkJCVwKLSAgICsgMjApCi0KLXN0YXRpYyBjaGFyICogZGF0YV9idWZmZXI7Ci0KLS8qIFByb3RvdHlwZXMuICAqLwotc3RhdGljIHZvaWQgbGlzdGluZ19tZXNzYWdlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpKTsKLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqIGZpbGVfaW5mbyBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlX25hbWUpKTsKLXN0YXRpYyB2b2lkIG5ld19mcmFnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICogYnVmZmVyX2xpbmUgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmZpbGUsCi0JCQkJICBjaGFyICpsaW5lLCB1bnNpZ25lZCBpbnQgc2l6ZSkpOwotc3RhdGljIHZvaWQgbGlzdGluZ19wYWdlIFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNhbGNfaGV4IFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9saW5lcyBQQVJBTVMgKChsaXN0X2luZm9fdHlwZSAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJIGNoYXIgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBsaXN0X3N5bWJvbF90YWJsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zb3VyY2UgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmN1cnJlbnRfZmlsZSwKLQkJCQkgIGxpc3RfaW5mb190eXBlICpsaXN0LAotCQkJCSAgY2hhciAqYnVmZmVyLAotCQkJCSAgdW5zaWduZWQgaW50IHdpZHRoKSk7Ci1zdGF0aWMgaW50IGRlYnVnZ2luZ19wc2V1ZG8gUEFSQU1TICgobGlzdF9pbmZvX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBsaXN0aW5nX2xpc3RpbmcgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX21lc3NhZ2UgKG5hbWUsIG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIHVuc2lnbmVkIGludCBsID0gc3RybGVuIChuYW1lKSArIHN0cmxlbiAobWVzc2FnZSkgKyAxOwotICBjaGFyICpuID0gKGNoYXIgKikgeG1hbGxvYyAobCk7Ci0gIHN0cmNweSAobiwgbmFtZSk7Ci0gIHN0cmNhdCAobiwgbWVzc2FnZSk7Ci0gIGlmIChsaXN0aW5nX3RhaWwgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgbGlzdGluZ190YWlsLT5tZXNzYWdlID0gbjsKLSAgICB9Ci19Ci0KLXZvaWQKLWxpc3Rpbmdfd2FybmluZyAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgbGlzdGluZ19tZXNzYWdlIChfKCJXYXJuaW5nOiIpLCBtZXNzYWdlKTsKLX0KLQotdm9pZAotbGlzdGluZ19lcnJvciAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgbGlzdGluZ19tZXNzYWdlIChfKCJFcnJvcjoiKSwgbWVzc2FnZSk7Ci19Ci0KLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqCi1maWxlX2luZm8gKGZpbGVfbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lOwotewotICAvKiBGaW5kIGFuIGVudHJ5IHdpdGggdGhpcyBmaWxlIG5hbWUgKi8KLSAgZmlsZV9pbmZvX3R5cGUgKnAgPSBmaWxlX2luZm9faGVhZDsKLQotICB3aGlsZSAocCAhPSAoZmlsZV9pbmZvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKSA9PSAwKQotCXJldHVybiBwOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotCi0gIC8qIE1ha2UgbmV3IGVudHJ5ICovCi0KLSAgcCA9IChmaWxlX2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGZpbGVfaW5mb190eXBlKSk7Ci0gIHAtPm5leHQgPSBmaWxlX2luZm9faGVhZDsKLSAgZmlsZV9pbmZvX2hlYWQgPSBwOwotICBwLT5maWxlbmFtZSA9IHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSBzdHJsZW4gKGZpbGVfbmFtZSkgKyAxKTsKLSAgc3RyY3B5IChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKTsKLSAgcC0+cG9zID0gMDsKLSAgcC0+bGluZW51bSA9IDA7Ci0gIHAtPmF0X2VuZCA9IDA7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW5ld19mcmFnICgpCi17Ci0KLSAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gIGZyYWdfbmV3ICgwKTsKLQotfQotCi12b2lkCi1saXN0aW5nX25ld2xpbmUgKHBzKQotICAgICBjaGFyICpwczsKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9saW5lID0gMHhmZmZmOwotICBzdGF0aWMgY2hhciAqbGFzdF9maWxlID0gTlVMTDsKLSAgbGlzdF9pbmZvX3R5cGUgKm5ldyA9IE5VTEw7Ci0KLSAgaWYgKGxpc3RpbmcgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEluIEVMRiwgYW55dGhpbmcgaW4gYSBzZWN0aW9uIGJlZ2lubmluZyB3aXRoIC5kZWJ1ZyBvciAubGluZSBpcwotICAgICBjb25zaWRlcmVkIHRvIGJlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaW5jbHVkZXMgdGhlCi0gICAgIHN0YXRlbWVudCB3aGljaCBzd2l0Y2hlcyB1cyBpbnRvIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbiwgd2hpY2ggd2UKLSAgICAgY2FuIG9ubHkgc2V0IGFmdGVyIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbi4gICovCi0gIGlmICgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykgIT0gMAotICAgICAgJiYgbGlzdGluZ190YWlsICE9IE5VTEwKLSAgICAgICYmICEgbGlzdGluZ190YWlsLT5kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VnbmFtZTsKLQotICAgICAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAobm93X3NlZyk7Ci0gICAgICBpZiAoc3RybmNtcCAoc2VnbmFtZSwgIi5kZWJ1ZyIsIHNpemVvZiAiLmRlYnVnIiAtIDEpID09IDAKLQkgIHx8IHN0cm5jbXAgKHNlZ25hbWUsICIubGluZSIsIHNpemVvZiAiLmxpbmUiIC0gMSkgPT0gMCkKLQlsaXN0aW5nX3RhaWwtPmRlYnVnZ2luZyA9IDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0gIGlmIChwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW5lID09IGxhc3RfbGluZSAmJiAhKGxhc3RfZmlsZSAmJiBmaWxlICYmIHN0cmNtcCAoZmlsZSwgbGFzdF9maWxlKSkpCi0JcmV0dXJuOwotCi0gICAgICBuZXcgPSAobGlzdF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChsaXN0X2luZm9fdHlwZSkpOwotCi0gICAgICAvKiBEZXRlY3QgaWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiBieSBleGFtaW5pbmcgdGhlIGZpbGUKLQkgbmFtZSByZXR1cm5lZCBieSBhc193aGVyZSgpLgotCi0JIFtGSVhNRTogV2UgcmVseSB1cG9uIHRoZSBuYW1lIGluIHRoZSBzdHJjbXAgYmVsb3cgYmVpbmcgdGhlCi0JIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGJ5IGlucHV0X3NjcnViX25ld19maWxlKCksIGlmIHRoYXQgaXMKLQkgbm90IHRydWUsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbF0uCi0KLQkgSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiwgdGhlbiB3ZSBuZWVkIHRvIHNhdmUgZWFjaCBpbnB1dCBsaW5lCi0JIGhlcmUgKGFzc3VtaW5nIG9mIGNvdXJzZSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSBsaW5lIG9mIGlucHV0IHRvIHJlYWQpLAotCSBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3RpbmcgdGhhdCBpcyBwcm9kdWNlZCBhdCB0aGUgZW5kCi0JIG9mIHRoZSBhc3NlbWJseS4gICovCi0gICAgICBpZiAoc3RyY21wIChmaWxlLCBfKCJ7c3RhbmRhcmQgaW5wdXR9IikpID09IDAKLQkgICYmIGlucHV0X2xpbmVfcG9pbnRlciAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKiBjb3B5OwotCSAgaW50IGxlbjsKLQkgIGludCBzZWVuX3F1b3RlID0gMDsKLQotCSAgZm9yIChjb3B5ID0gaW5wdXRfbGluZV9wb2ludGVyIC0gMTsKLQkgICAgICAgKiBjb3B5ICYmIChzZWVuX3F1b3RlCi0JCQkgIHx8ICghIGlzX2VuZF9vZl9saW5lIFsodW5zaWduZWQgY2hhcikgKiBjb3B5XSkpOwotCSAgICAgICBjb3B5ICsrKQotCSAgICBpZiAoKiBjb3B5ID09ICciJyAmJiBjb3B5Wy0xXSAhPSAnXFwnKQotCSAgICAgIHNlZW5fcXVvdGUgPSAhIHNlZW5fcXVvdGU7Ci0KLQkgIGxlbiA9IChjb3B5IC0gaW5wdXRfbGluZV9wb2ludGVyKSArIDI7Ci0KLQkgIGNvcHkgPSB4bWFsbG9jIChsZW4pOwotCi0JICBpZiAoY29weSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqIHNyYyA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7Ci0JICAgICAgY2hhciAqIGRlc3QgPSBjb3B5OwotCSAgICAgIAotCSAgICAgIHdoaWxlICgtLWxlbikKLQkJewotCQkgIHVuc2lnbmVkIGNoYXIgYyA9ICogc3JjICsrOwotCi0JCSAgLyogT21pdCBjb250cm9sIGNoYXJhY3RlcnMgaW4gdGhlIGxpc3RpbmcuICAqLwotCQkgIGlmIChpc2FzY2lpIChjKSAmJiAhIGlzY250cmwgKGMpKQotCQkgICAgKiBkZXN0ICsrID0gYzsKLQkJfQotCSAgICAgIAotCSAgICAgICpkZXN0ID0gMDsKLQkgICAgfQotCSAgCi0JICBuZXctPmxpbmVfY29udGVudHMgPSBjb3B5OwotCX0KLSAgICAgIGVsc2UKLQluZXctPmxpbmVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5ldyA9IChsaXN0X2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGxpc3RfaW5mb190eXBlKSk7Ci0gICAgICBuZXctPmxpbmVfY29udGVudHMgPSBwczsKLSAgICB9Ci0KLSAgbGFzdF9saW5lID0gbGluZTsKLSAgbGFzdF9maWxlID0gZmlsZTsKLSAgCi0gIG5ld19mcmFnICgpOwotCi0gIGlmIChsaXN0aW5nX3RhaWwpCi0gICAgbGlzdGluZ190YWlsLT5uZXh0ID0gbmV3OwotICBlbHNlCi0gICAgaGVhZCA9IG5ldzsKLSAgCi0gIGxpc3RpbmdfdGFpbCA9IG5ldzsKLQotICBuZXctPmZyYWcgPSBmcmFnX25vdzsKLSAgbmV3LT5saW5lID0gbGluZTsKLSAgbmV3LT5maWxlID0gZmlsZV9pbmZvIChmaWxlKTsKLSAgbmV3LT5uZXh0ID0gKGxpc3RfaW5mb190eXBlICopIE5VTEw7Ci0gIG5ldy0+bWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0gIG5ldy0+ZWRpY3QgPSBFRElDVF9OT05FOwotICBuZXctPmhsbF9maWxlID0gKGZpbGVfaW5mb190eXBlICopIE5VTEw7Ci0gIG5ldy0+aGxsX2xpbmUgPSAwOwotICBuZXctPmRlYnVnZ2luZyA9IDA7Ci0gIAotICBuZXdfZnJhZyAoKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogSW4gRUxGLCBhbnl0aGluZyBpbiBhIHNlY3Rpb24gYmVnaW5uaW5nIHdpdGggLmRlYnVnIG9yIC5saW5lIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gYmUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0KLSAgICAgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKG5vd19zZWcpOwotICAgICAgaWYgKHN0cm5jbXAgKHNlZ25hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChzZWduYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDApCi0JbmV3LT5kZWJ1Z2dpbmcgPSAxOwotICAgIH0KLSNlbmRpZgotfQotCi0vKiBBdHRhY2ggYWxsIGN1cnJlbnQgZnJhZ3MgdG8gdGhlIHByZXZpb3VzIGxpbmUgaW5zdGVhZCBvZiB0aGUKLSAgIGN1cnJlbnQgbGluZS4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBNSVBTIGJhY2tlbmQgd2hlbiBpdCBkaXNjb3ZlcnMKLSAgIHRoYXQgaXQgbmVlZHMgdG8gYWRkIHNvbWUgTk9QIGluc3RydWN0aW9uczsgdGhlIGFkZGVkIE5PUAotICAgaW5zdHJ1Y3Rpb25zIHNob3VsZCBnbyB3aXRoIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGhhcyB0aGUgZGVsYXksIG5vdAotICAgd2l0aCB0aGUgbmV3IGluc3RydWN0aW9uLiAgKi8KLQotdm9pZAotbGlzdGluZ19wcmV2X2xpbmUgKCkKLXsKLSAgbGlzdF9pbmZvX3R5cGUgKmw7Ci0gIGZyYWdTICpmOwotCi0gIGlmIChoZWFkID09IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMCi0gICAgICB8fCBoZWFkID09IGxpc3RpbmdfdGFpbCkKLSAgICByZXR1cm47Ci0KLSAgbmV3X2ZyYWcgKCk7Ci0KLSAgZm9yIChsID0gaGVhZDsgbC0+bmV4dCAhPSBsaXN0aW5nX3RhaWw7IGwgPSBsLT5uZXh0KQotICAgIDsKLQotICBmb3IgKGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmICE9IChmcmFnUyAqKSBOVUxMOyBmID0gZi0+ZnJfbmV4dCkKLSAgICBpZiAoZi0+bGluZSA9PSBsaXN0aW5nX3RhaWwpCi0gICAgICBmLT5saW5lID0gbDsKLQotICBsaXN0aW5nX3RhaWwtPmZyYWcgPSBmcmFnX25vdzsKLSAgbmV3X2ZyYWcgKCk7Ci19Ci0KLS8qCi0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXh0IHNvdXJjZSBsaW5lIGZyb20gdGhlIGZpbGUgc3VwcGxpZWQsCi0gdHJ1bmNhdGVkIHRvIHNpemUuICBJdCBhcHBlbmRzIGEgZmFrZSBsaW5lIHRvIHRoZSBlbmQgb2YgZWFjaCBpbnB1dAotIGZpbGUgdG8gbWFrZQotKi8KLQotc3RhdGljIGNoYXIgKgotYnVmZmVyX2xpbmUgKGZpbGUsIGxpbmUsIHNpemUpCi0gICAgIGZpbGVfaW5mb190eXBlICogZmlsZTsKLSAgICAgY2hhciAqbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0gIGludCBjOwotCi0gIGNoYXIgKnAgPSBsaW5lOwotCi0gIC8qIElmIHdlIGNvdWxkbid0IG9wZW4gdGhlIGZpbGUsIHJldHVybiBhbiBlbXB0eSBsaW5lICovCi0gIGlmIChmaWxlLT5hdF9lbmQpCi0gICAgcmV0dXJuICIiOwotCi0gIC8qIENoZWNrIHRoZSBjYWNoZSBhbmQgc2VlIGlmIHdlIGxhc3QgdXNlZCB0aGlzIGZpbGUuICAqLwotICBpZiAoIWxhc3Rfb3Blbl9maWxlX2luZm8gfHwgZmlsZSAhPSBsYXN0X29wZW5fZmlsZV9pbmZvKQotICAgIHsKLSAgICAgIGlmIChsYXN0X29wZW5fZmlsZSkKLQl7Ci0JICBsYXN0X29wZW5fZmlsZV9pbmZvLT5wb3MgPSBmdGVsbCAobGFzdF9vcGVuX2ZpbGUpOwotCSAgZmNsb3NlIChsYXN0X29wZW5fZmlsZSk7Ci0JfQotCi0gICAgICBsYXN0X29wZW5fZmlsZV9pbmZvID0gZmlsZTsKLSAgICAgIGxhc3Rfb3Blbl9maWxlID0gZm9wZW4gKGZpbGUtPmZpbGVuYW1lLCAiciIpOwotICAgICAgaWYgKGxhc3Rfb3Blbl9maWxlID09IE5VTEwpCi0JewotCSAgZmlsZS0+YXRfZW5kID0gMTsKLQkgIHJldHVybiAiIjsKLQl9Ci0gICAgICAKLSAgICAgIC8qIFNlZWsgdG8gd2hlcmUgd2Ugd2VyZSBsYXN0IHRpbWUgdGhpcyBmaWxlIHdhcyBvcGVuLiAgKi8KLSAgICAgIGlmIChmaWxlLT5wb3MpCi0JZnNlZWsobGFzdF9vcGVuX2ZpbGUsIGZpbGUtPnBvcywgU0VFS19TRVQpOwotICAgIH0KLQotICBjID0gZmdldGMgKGxhc3Rfb3Blbl9maWxlKTsKLQotICBzaXplIC09IDE7CQkJLyogbGVhdmUgcm9vbSBmb3IgbnVsbCAqLwotCi0gIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpCi0gICAgewotICAgICAgaWYgKGNvdW50IDwgc2l6ZSkKLQkqcCsrID0gYzsKLSAgICAgIGNvdW50Kys7Ci0KLSAgICAgIGMgPSBmZ2V0YyAobGFzdF9vcGVuX2ZpbGUpOwotCi0gICAgfQotICBpZiAoYyA9PSBFT0YpCi0gICAgewotICAgICAgZmlsZS0+YXRfZW5kID0gMTsKLSAgICAgICpwKysgPSAnLic7Ci0gICAgICAqcCsrID0gJy4nOwotICAgICAgKnArKyA9ICcuJzsKLSAgICB9Ci0gIGZpbGUtPmxpbmVudW0rKzsKLSAgKnArKyA9IDA7Ci0gIHJldHVybiBsaW5lOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpmbjsKLQotc3RhdGljIHVuc2lnbmVkIGludCBlamVjdDsJLyogRWplY3QgcGVuZGluZyAqLwotc3RhdGljIHVuc2lnbmVkIGludCBwYWdlOwkvKiBDdXJyZW50IHBhZ2UgbnVtYmVyICovCi1zdGF0aWMgY2hhciAqdGl0bGU7CQkvKiBjdXJyZW50IHRpdGxlICovCi1zdGF0aWMgY2hhciAqc3VidGl0bGU7CQkvKiBjdXJyZW50IHN1YnRpdGxlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG9uX3BhZ2U7CS8qIG51bWJlciBvZiBsaW5lcyBwcmludGVkIG9uIGN1cnJlbnQgcGFnZSAqLwotCi0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX3BhZ2UgKGxpc3QpCi0gICAgIGxpc3RfaW5mb190eXBlICpsaXN0OwotewotICAvKiBHcm9wZSBhcm91bmQsIHNlZSBpZiB3ZSBjYW4gc2VlIGEgdGl0bGUgb3Igc3VidGl0bGUgZWRpY3QgY29taW5nIHVwCi0gICAgIHNvb24gICh3ZSBsb29rIGRvd24gMTAgbGluZXMgb2YgdGhlIHBhZ2UgYW5kIHNlZSBpZiBpdCdzIHRoZXJlKSovCi0gIGlmICgoZWplY3QgfHwgKG9uX3BhZ2UgPj0gKHVuc2lnbmVkIGludCkgcGFwZXJfaGVpZ2h0KSkgJiYgcGFwZXJfaGVpZ2h0ICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGMgPSAxMDsKLSAgICAgIGludCBoYWRfdGl0bGUgPSAwOwotICAgICAgaW50IGhhZF9zdWJ0aXRsZSA9IDA7Ci0KLSAgICAgIHBhZ2UrKzsKLQotICAgICAgd2hpbGUgKGMgIT0gMCAmJiBsaXN0KQotCXsKLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9TQlRUTCAmJiAhaGFkX3N1YnRpdGxlKQotCSAgICB7Ci0JICAgICAgaGFkX3N1YnRpdGxlID0gMTsKLQkgICAgICBzdWJ0aXRsZSA9IGxpc3QtPmVkaWN0X2FyZzsKLQkgICAgfQotCSAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX1RJVExFICYmICFoYWRfdGl0bGUpCi0JICAgIHsKLQkgICAgICBoYWRfdGl0bGUgPSAxOwotCSAgICAgIHRpdGxlID0gbGlzdC0+ZWRpY3RfYXJnOwotCSAgICB9Ci0JICBsaXN0ID0gbGlzdC0+bmV4dDsKLQkgIGMtLTsKLQl9Ci0KLQotICAgICAgaWYgKHBhZ2UgPiAxKQotCXsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIlxmIik7Ci0JfQotCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlcyAlcyBcdFx0XHRwYWdlICVkXG4iLCBMSVNUSU5HX0hFQURFUiwgZm4sIHBhZ2UpOwotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXNcbiIsIHRpdGxlKTsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCBzdWJ0aXRsZSk7Ci0gICAgICBvbl9wYWdlID0gMzsKLSAgICAgIGVqZWN0ID0gMDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY2FsY19oZXggKGxpc3QpCi0gICAgIGxpc3RfaW5mb190eXBlICogbGlzdDsKLXsKLSAgaW50IGRhdGFfYnVmZmVyX3NpemU7Ci0gIGxpc3RfaW5mb190eXBlICpmaXJzdCA9IGxpc3Q7Ci0gIHVuc2lnbmVkIGludCBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOwotICBmcmFnUyAqZnJhZzsKLSAgZnJhZ1MgKmZyYWdfcHRyOwotICB1bnNpZ25lZCBpbnQgb2N0ZXRfaW5fZnJhZzsKLQotICAvKiBGaW5kIGZpcnN0IGZyYWcgd2hpY2ggc2F5cyBpdCBiZWxvbmdzIHRvIHRoaXMgbGluZSAqLwotICBmcmFnID0gbGlzdC0+ZnJhZzsKLSAgd2hpbGUgKGZyYWcgJiYgZnJhZy0+bGluZSAhPSBsaXN0KQotICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotCi0gIGZyYWdfcHRyID0gZnJhZzsKLQotICBkYXRhX2J1ZmZlcl9zaXplID0gMDsKLQotICAvKiBEdW1wIGFsbCB0aGUgZnJhZ3Mgd2hpY2ggYmVsb25nIHRvIHRoaXMgbGluZSAqLwotICB3aGlsZSAoZnJhZ19wdHIgIT0gKGZyYWdTICopIE5VTEwgJiYgZnJhZ19wdHItPmxpbmUgPT0gZmlyc3QpCi0gICAgewotICAgICAgLyogUHJpbnQgYXMgbWFueSBieXRlcyBmcm9tIHRoZSBmaXhlZCBwYXJ0IGFzIGlzIHNlbnNpYmxlICovCi0gICAgICBvY3RldF9pbl9mcmFnID0gMDsKLSAgICAgIHdoaWxlICgob2Zmc2V0VCkgb2N0ZXRfaW5fZnJhZyA8IGZyYWdfcHRyLT5mcl9maXgKLQkgICAgICYmIGRhdGFfYnVmZmVyX3NpemUgPCBNQVhfQllURVMgLSAzKQotCXsKLQkgIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKLQkgICAgewotCSAgICAgIGFkZHJlc3MgPSBmcmFnX3B0ci0+ZnJfYWRkcmVzcyAvIE9DVEVUU19QRVJfQllURTsKLQkgICAgfQotCi0JICBzcHJpbnRmIChkYXRhX2J1ZmZlciArIGRhdGFfYnVmZmVyX3NpemUsCi0JCSAgICIlMDJYIiwKLQkJICAgKGZyYWdfcHRyLT5mcl9saXRlcmFsW29jdGV0X2luX2ZyYWddKSAmIDB4ZmYpOwotCSAgZGF0YV9idWZmZXJfc2l6ZSArPSAyOwotCSAgb2N0ZXRfaW5fZnJhZysrOwotCX0KLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgdmFyX3JlcF9tYXggPSBvY3RldF9pbl9mcmFnOwotCXVuc2lnbmVkIGludCB2YXJfcmVwX2lkeCA9IG9jdGV0X2luX2ZyYWc7Ci0KLQkvKiBQcmludCBhcyBtYW55IGJ5dGVzIGZyb20gdGhlIHZhcmlhYmxlIHBhcnQgYXMgaXMgc2Vuc2libGUgKi8KLQl3aGlsZSAoKChvZmZzZXRUKSBvY3RldF9pbl9mcmFnCi0JCTwgKGZyYWdfcHRyLT5mcl9maXggKyBmcmFnX3B0ci0+ZnJfdmFyICogZnJhZ19wdHItPmZyX29mZnNldCkpCi0JICAgICAgICYmIGRhdGFfYnVmZmVyX3NpemUgPCBNQVhfQllURVMgLSAzKQotCSAgewotCSAgICBpZiAoYWRkcmVzcyA9PSB+ICh1bnNpZ25lZCBpbnQpIDApCi0JICAgICAgewotCQlhZGRyZXNzID0gZnJhZ19wdHItPmZyX2FkZHJlc3MgLyBPQ1RFVFNfUEVSX0JZVEU7Ci0JICAgICAgfQotCSAgICBzcHJpbnRmIChkYXRhX2J1ZmZlciArIGRhdGFfYnVmZmVyX3NpemUsCi0JCSAgICAgIiUwMlgiLAotCQkgICAgIChmcmFnX3B0ci0+ZnJfbGl0ZXJhbFt2YXJfcmVwX2lkeF0pICYgMHhmZik7Ci0jaWYgMAotCSAgICBkYXRhX2J1ZmZlcltkYXRhX2J1ZmZlcl9zaXplKytdID0gJyonOwotCSAgICBkYXRhX2J1ZmZlcltkYXRhX2J1ZmZlcl9zaXplKytdID0gJyonOwotI2VuZGlmCi0JICAgIGRhdGFfYnVmZmVyX3NpemUgKz0gMjsKLQotCSAgICB2YXJfcmVwX2lkeCsrOwotCSAgICBvY3RldF9pbl9mcmFnKys7Ci0KLQkgICAgaWYgKChvZmZzZXRUKSB2YXJfcmVwX2lkeCA+PSBmcmFnX3B0ci0+ZnJfZml4ICsgZnJhZ19wdHItPmZyX3ZhcikKLQkgICAgICB2YXJfcmVwX2lkeCA9IHZhcl9yZXBfbWF4OwotCSAgfQotICAgICAgfQotCi0gICAgICBmcmFnX3B0ciA9IGZyYWdfcHRyLT5mcl9uZXh0OwotICAgIH0KLSAgZGF0YV9idWZmZXJbZGF0YV9idWZmZXJfc2l6ZV0gPSAnXDAnOwotICByZXR1cm4gYWRkcmVzczsKLX0KLQotCi0KLQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9saW5lcyAobGlzdCwgbGluZW5vLCBzdHJpbmcsIGFkZHJlc3MpCi0gICAgIGxpc3RfaW5mb190eXBlICpsaXN0OwotICAgICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIHVuc2lnbmVkIGludCBhZGRyZXNzOwotewotICB1bnNpZ25lZCBpbnQgaWR4OwotICB1bnNpZ25lZCBpbnQgbmNoYXJzOwotICB1bnNpZ25lZCBpbnQgbGluZXM7Ci0gIHVuc2lnbmVkIGludCBvY3RldF9pbl93b3JkID0gMDsKLSAgY2hhciAqc3JjID0gZGF0YV9idWZmZXI7Ci0gIGludCBjdXI7Ci0KLSAgLyogUHJpbnQgdGhlIHN0dWZmIG9uIHRoZSBmaXJzdCBsaW5lICovCi0gIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gIG5jaGFycyA9IChMSVNUSU5HX1dPUkRfU0laRSAqIDIgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoOwotICAKLSAgLyogUHJpbnQgdGhlIGhleCBmb3IgdGhlIGZpcnN0IGxpbmUgKi8KLSAgaWYgKGFkZHJlc3MgPT0gfiAodW5zaWduZWQgaW50KSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUgNGQgICAgICIsIGxpbmVubyk7Ci0gICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5jaGFyczsgaWR4KyspCi0JZnByaW50ZiAobGlzdF9maWxlLCAiICIpOwotCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcdCVzXG4iLCBzdHJpbmcgPyBzdHJpbmcgOiAiIik7Ci0gICAgICAKLSAgICAgIG9uX3BhZ2UgKys7Ci0gICAgICAKLSAgICAgIGxpc3RpbmdfcGFnZSAoMCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGhhZF9lcnJvcnMgKCkpCi0gICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCA/Pz8/ICIsIGxpbmVubyk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlIDRkICUwNHggIiwgbGluZW5vLCBhZGRyZXNzKTsKLQotICAvKiBBbmQgdGhlIGRhdGEgdG8gZ28gYWxvbmcgd2l0aCBpdCAqLwotICBpZHggPSAwOwotICBjdXIgPSAwOwotICB3aGlsZSAoc3JjW2N1cl0gJiYgaWR4IDwgbmNoYXJzKQotICAgIHsKLSAgICAgIGludCBvZmZzZXQ7Ci0gICAgICBvZmZzZXQgPSBjdXI7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlYyVjIiwgc3JjW29mZnNldF0sIHNyY1tvZmZzZXQrMV0pOwotICAgICAgY3VyICs9IDI7Ci0gICAgICBvY3RldF9pbl93b3JkKys7Ci0gICAgICAKLSAgICAgIGlmIChvY3RldF9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQotCXsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLQkgIGlkeCsrOwotCSAgb2N0ZXRfaW5fd29yZCA9IDA7Ci0JfQotICAgICAgCi0gICAgICBpZHggKz0gMjsKLSAgICB9Ci0gIAotICBmb3IgKDsgaWR4IDwgbmNoYXJzOyBpZHgrKykKLSAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIgIik7Ci0gIAotICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcdCVzXG4iLCBzdHJpbmcgPyBzdHJpbmcgOiAiIik7Ci0gIG9uX3BhZ2UrKzsKLSAgbGlzdGluZ19wYWdlIChsaXN0KTsKLSAgCi0gIGlmIChsaXN0LT5tZXNzYWdlKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIioqKiogICVzXG4iLCBsaXN0LT5tZXNzYWdlKTsKLSAgICAgIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gICAgICBvbl9wYWdlKys7Ci0gICAgfQotICAKLSAgZm9yIChsaW5lcyA9IDA7Ci0gICAgICAgbGluZXMgPCAodW5zaWduZWQgaW50KSBsaXN0aW5nX2xoc19jb250X2xpbmVzCi0JICYmIHNyY1tjdXJdOwotICAgICAgIGxpbmVzICsrKQotICAgIHsKLSAgICAgIG5jaGFycyA9ICgoTElTVElOR19XT1JEX1NJWkUgKiAyKSArIDEpCi0JKiBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQgLSAxOwotICAgICAgaWR4ID0gMDsKLSAgICAgIAotICAgICAgLyogUHJpbnQgYW55IG1vcmUgbGluZXMgb2YgZGF0YSwgYnV0IG1vcmUgY29tcGFjdGx5ICovCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlIDRkICAgICAgIiwgbGluZW5vKTsKLSAgICAgIAotICAgICAgd2hpbGUgKHNyY1tjdXJdICYmIGlkeCA8IG5jaGFycykKLQl7Ci0gICAgICAgICAgaW50IG9mZnNldDsKLSAgICAgICAgICBvZmZzZXQgPSBjdXI7Ci0gICAgICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJWMlYyIsIHNyY1tvZmZzZXRdLCBzcmNbb2Zmc2V0KzFdKTsKLQkgIGN1ciArPSAyOwotCSAgaWR4ICs9IDI7Ci0JICBvY3RldF9pbl93b3JkKys7Ci0JICAKLQkgIGlmIChvY3RldF9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiICIpOwotCSAgICAgIGlkeCsrOwotCSAgICAgIG9jdGV0X2luX3dvcmQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcbiIpOwotICAgICAgb25fcGFnZSArKzsKLSAgICAgIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1saXN0X3N5bWJvbF90YWJsZSAoKQotewotICBleHRlcm4gc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotICBpbnQgZ290X3NvbWUgPSAwOwotCi0gIHN5bWJvbFMgKnB0cjsKLSAgZWplY3QgPSAxOwotICBsaXN0aW5nX3BhZ2UgKDApOwotCi0gIGZvciAocHRyID0gc3ltYm9sX3Jvb3RQOyBwdHIgIT0gKHN5bWJvbFMgKikgTlVMTDsgcHRyID0gc3ltYm9sX25leHQgKHB0cikpCi0gICAgewotICAgICAgaWYgKFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKHB0cikpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChwdHIpID09IGFic29sdXRlX3NlY3Rpb24pCi0JewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIC8qIERvbid0IHJlcG9ydCBzZWN0aW9uIHN5bWJvbHMuICBUaGV5IGFyZSBub3QgaW50ZXJlc3RpbmcuICAqLwotCSAgaWYgKHN5bWJvbF9zZWN0aW9uX3AgKHB0cikpCi0JICAgIGNvbnRpbnVlOwotI2VuZGlmCi0JICBpZiAoU19HRVRfTkFNRSAocHRyKSkKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzMwXSwgZm10WzhdOwotCSAgICAgIHZhbHVlVCB2YWwgPSBTX0dFVF9WQUxVRSAocHRyKTsKLQotCSAgICAgIC8qIEBAIE5vdGUgdGhhdCB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgY29tcGlsYXRpb24gb3B0aW9ucywKLQkJIG5vdCBzb2xlbHkgb24gdGhlIHRhcmdldCBjaGFyYWN0ZXJpc3RpY3MuICAqLwotCSAgICAgIGlmIChzaXplb2YgKHZhbCkgPT0gNCAmJiBzaXplb2YgKGludCkgPT0gNCkKLQkJc3ByaW50ZiAoYnVmLCAiJTA4bHgiLCAodW5zaWduZWQgbG9uZykgdmFsKTsKLQkgICAgICBlbHNlIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKLQkJewotCQkgIHNwcmludGYgKGZtdCwgIiUlMCVsdWx4IiwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSAoc2l6ZW9mICh2YWwpICogMikpOwotCQkgIHNwcmludGYgKGJ1ZiwgZm10LCAodW5zaWduZWQgbG9uZykgdmFsKTsKLQkJfQotI2lmIGRlZmluZWQgKEJGRDY0KQotCSAgICAgIGVsc2UgaWYgKHNpemVvZiAodmFsKSA+IDQpCi0JCXNwcmludGZfdm1hIChidWYsIHZhbCk7Ci0jZW5kaWYKLQkgICAgICBlbHNlCi0JCWFib3J0ICgpOwotCi0JICAgICAgaWYgKCFnb3Rfc29tZSkKLQkJewotCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIkRFRklORUQgU1lNQk9MU1xuIik7Ci0JCSAgb25fcGFnZSsrOwotCQkgIGdvdF9zb21lID0gMTsKLQkJfQotCi0JICAgICAgaWYgKHN5bWJvbF9nZXRfZnJhZyAocHRyKSAmJiBzeW1ib2xfZ2V0X2ZyYWcgKHB0ciktPmxpbmUpCi0JCXsKLQkJICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlMjBzOiUtNWQgICVzOiVzICVzXG4iLAotCQkJICAgc3ltYm9sX2dldF9mcmFnIChwdHIpLT5saW5lLT5maWxlLT5maWxlbmFtZSwKLQkJCSAgIHN5bWJvbF9nZXRfZnJhZyAocHRyKS0+bGluZS0+bGluZSwKLQkJCSAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAocHRyKSksCi0JCQkgICBidWYsIFNfR0VUX05BTUUgKHB0cikpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZnByaW50ZiAobGlzdF9maWxlLCAiJTMzczolcyAlc1xuIiwKLQkJCSAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAocHRyKSksCi0JCQkgICBidWYsIFNfR0VUX05BTUUgKHB0cikpOwotCQl9Ci0KLQkgICAgICBvbl9wYWdlICsrOwotCSAgICAgIGxpc3RpbmdfcGFnZSAoMCk7Ci0JICAgIH0KLQl9Ci0KLSAgICB9Ci0gIGlmICghZ290X3NvbWUpCi0gICAgewotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiTk8gREVGSU5FRCBTWU1CT0xTXG4iKTsKLSAgICAgIG9uX3BhZ2UrKzsKLSAgICB9Ci0gIGZwcmludGYgKGxpc3RfZmlsZSwgIlxuIik7Ci0gIG9uX3BhZ2UrKzsKLSAgbGlzdGluZ19wYWdlICgwKTsKLQotICBnb3Rfc29tZSA9IDA7Ci0KLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7IHB0ciAhPSAoc3ltYm9sUyAqKSBOVUxMOyBwdHIgPSBzeW1ib2xfbmV4dCAocHRyKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfTkFNRSAocHRyKSAmJiBzdHJsZW4gKFNfR0VUX05BTUUgKHB0cikpICE9IDApCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHB0cikgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBpZiAoIWdvdF9zb21lKQotCQl7Ci0JCSAgZ290X3NvbWUgPSAxOwotCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIlVOREVGSU5FRCBTWU1CT0xTXG4iKTsKLQkJICBvbl9wYWdlKys7Ci0JCSAgbGlzdGluZ19wYWdlICgwKTsKLQkJfQotCSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCBTX0dFVF9OQU1FIChwdHIpKTsKLQkgICAgICBvbl9wYWdlKys7Ci0JICAgICAgbGlzdGluZ19wYWdlICgwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmICghZ290X3NvbWUpCi0gICAgewotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiTk8gVU5ERUZJTkVEIFNZTUJPTFNcbiIpOwotICAgICAgb25fcGFnZSsrOwotICAgICAgbGlzdGluZ19wYWdlICgwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zb3VyY2UgKGN1cnJlbnRfZmlsZSwgbGlzdCwgYnVmZmVyLCB3aWR0aCkKLSAgICAgZmlsZV9pbmZvX3R5cGUgKmN1cnJlbnRfZmlsZTsKLSAgICAgbGlzdF9pbmZvX3R5cGUgKmxpc3Q7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgdW5zaWduZWQgaW50IHdpZHRoOwotewotICBpZiAoIWN1cnJlbnRfZmlsZS0+YXRfZW5kKQotICAgIHsKLSAgICAgIHdoaWxlIChjdXJyZW50X2ZpbGUtPmxpbmVudW0gPCBsaXN0LT5obGxfbGluZQotCSAgICAgJiYgIWN1cnJlbnRfZmlsZS0+YXRfZW5kKQotCXsKLQkgIGNoYXIgKnAgPSBidWZmZXJfbGluZSAoY3VycmVudF9maWxlLCBidWZmZXIsIHdpZHRoKTsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiU0dTolLTEzcyAqKioqICVzXG4iLCBjdXJyZW50X2ZpbGUtPmxpbmVudW0sCi0JCSAgIGN1cnJlbnRfZmlsZS0+ZmlsZW5hbWUsIHApOwotCSAgb25fcGFnZSsrOwotCSAgbGlzdGluZ19wYWdlIChsaXN0KTsKLQl9Ci0gICAgfQotfQotCi0vKiBTb21ldGltZXMgdGhlIHVzZXIgZG9lc24ndCB3YW50IHRvIGJlIGJvdGhlcmVkIGJ5IHRoZSBkZWJ1Z2dpbmcKLSAgIHJlY29yZHMgaW5zZXJ0ZWQgYnkgdGhlIGNvbXBpbGVyLCBzZWUgaWYgdGhlIGxpbmUgaXMgc3VzcGljaW91cy4gICovCi0KLXN0YXRpYyBpbnQKLWRlYnVnZ2luZ19wc2V1ZG8gKGxpc3QsIGxpbmUpCi0gICAgIGxpc3RfaW5mb190eXBlICpsaXN0OwotICAgICBjb25zdCBjaGFyICpsaW5lOwotewotICBzdGF0aWMgaW50IGluX2RlYnVnOwotICBpbnQgd2FzX2RlYnVnOwotCi0gIGlmIChsaXN0LT5kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgaW5fZGVidWcgPSAxOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHdhc19kZWJ1ZyA9IGluX2RlYnVnOwotICBpbl9kZWJ1ZyA9IDA7Ci0KLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqbGluZSkpCi0gICAgbGluZSsrOwotCi0gIGlmICgqbGluZSAhPSAnLicpCi0gICAgewotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIFRoZSBFTEYgY29tcGlsZXIgc29tZXRpbWVzIGVtaXRzIGJsYW5rIGxpbmVzIGFmdGVyIHN3aXRjaGluZwotICAgICAgICAgb3V0IG9mIGEgZGVidWdnaW5nIHNlY3Rpb24uICBJZiB0aGUgbmV4dCBsaW5lIGRyb3BzIHVzIGJhY2sKLSAgICAgICAgIGludG8gZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGVuIGRvbid0IHByaW50IHRoZSBibGFuayBsaW5lLgotICAgICAgICAgVGhpcyBpcyBhIGhhY2sgZm9yIGEgcGFydGljdWxhciBjb21waWxlciBiZWhhdmlvdXIsIG5vdCBhCi0gICAgICAgICBnZW5lcmFsIGNhc2UuICAqLwotICAgICAgaWYgKHdhc19kZWJ1ZwotCSAgJiYgKmxpbmUgPT0gJ1wwJwotCSAgJiYgbGlzdC0+bmV4dCAhPSBOVUxMCi0JICAmJiBsaXN0LT5uZXh0LT5kZWJ1Z2dpbmcpCi0JewotCSAgaW5fZGVidWcgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBsaW5lKys7Ci0KLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJkZWYiLCAzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInZhbCIsIDMpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAic2NsIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJsaW5lIiwgNCkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJlbmRlZiIsIDUpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAibG4iLCAyKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInR5cGUiLCA0KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInNpemUiLCA0KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgImRpbSIsIDMpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAidGFnIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoc3RybmNtcCAobGluZSwgInN0YWJzIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJzdGFibiIsIDUpID09IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX2xpc3RpbmcgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbGlzdF9pbmZvX3R5cGUgKmxpc3QgPSBoZWFkOwotICBmaWxlX2luZm9fdHlwZSAqY3VycmVudF9obGxfZmlsZSA9IChmaWxlX2luZm9fdHlwZSAqKSBOVUxMOwotICBjaGFyICptZXNzYWdlOwotICBjaGFyICpidWZmZXI7Ci0gIGNoYXIgKnA7Ci0gIGludCBzaG93X2xpc3RpbmcgPSAxOwotICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0KLSAgYnVmZmVyID0geG1hbGxvYyAobGlzdGluZ19yaHNfd2lkdGgpOwotICBkYXRhX2J1ZmZlciA9IHhtYWxsb2MgKE1BWF9CWVRFUyk7Ci0gIGVqZWN0ID0gMTsKLSAgbGlzdCA9IGhlYWQ7Ci0KLSAgd2hpbGUgKGxpc3QgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwgJiYgMCkKLSAgICB7Ci0gICAgICBpZiAobGlzdC0+bmV4dCkKLQlsaXN0LT5mcmFnID0gbGlzdC0+bmV4dC0+ZnJhZzsKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotCi0gICAgfQotCi0gIGxpc3QgPSBoZWFkLT5uZXh0OwotCi0KLSAgd2hpbGUgKGxpc3QpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxpc3RfbGluZTsKLQotICAgICAgd2lkdGggPSBsaXN0aW5nX3Joc193aWR0aCA+IHBhcGVyX3dpZHRoID8gcGFwZXJfd2lkdGggOgotCWxpc3RpbmdfcmhzX3dpZHRoOwotCi0gICAgICBsaXN0X2xpbmUgPSBsaXN0LT5saW5lOwotICAgICAgc3dpdGNoIChsaXN0LT5lZGljdCkKLQl7Ci0JY2FzZSBFRElDVF9MSVNUOgotCSAgLyogU2tpcCBhbGwgbGluZXMgdXAgdG8gdGhlIGN1cnJlbnQuICAqLwotCSAgbGlzdF9saW5lLS07Ci0JICBicmVhazsKLQljYXNlIEVESUNUX05PTElTVDoKLQkgIHNob3dfbGlzdGluZy0tOwotCSAgYnJlYWs7Ci0JY2FzZSBFRElDVF9OT0xJU1RfTkVYVDoKLQkgIGJyZWFrOwotCWNhc2UgRURJQ1RfRUpFQ1Q6Ci0JICBicmVhazsKLQljYXNlIEVESUNUX05PTkU6Ci0JICBicmVhazsKLQljYXNlIEVESUNUX1RJVExFOgotCSAgdGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICBicmVhazsKLQljYXNlIEVESUNUX1NCVFRMOgotCSAgc3VidGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBpZiAoc2hvd19saXN0aW5nIDw9IDApCi0JewotCSAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKLQkJICYmICFsaXN0LT5maWxlLT5hdF9lbmQpCi0JICAgIHAgPSBidWZmZXJfbGluZSAobGlzdC0+ZmlsZSwgYnVmZmVyLCB3aWR0aCk7Ci0JfQotCi0gICAgICBpZiAobGlzdC0+ZWRpY3QgPT0gRURJQ1RfTElTVCkKLQl7Ci0JICAvKiBFbmFibGUgbGlzdGluZyBmb3IgdGhlIHNpbmdsZSBsaW5lIHRoYXQgY2F1c2VkIHRoZSBlbmFibGUuICAqLwotCSAgbGlzdF9saW5lKys7Ci0JICBzaG93X2xpc3RpbmcrKzsKLQl9Ci0KLSAgICAgIGlmIChzaG93X2xpc3RpbmcgPiAwKQotCXsKLQkgIC8qIFNjYW4gZG93biB0aGUgbGlzdCBhbmQgcHJpbnQgYWxsIHRoZSBzdHVmZiB3aGljaCBjYW4gYmUgZG9uZQotCSAgICAgd2l0aCB0aGlzIGxpbmUgKG9yIGxpbmVzKS4gICovCi0JICBtZXNzYWdlID0gMDsKLQotCSAgaWYgKGxpc3QtPmhsbF9maWxlKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9obGxfZmlsZSA9IGxpc3QtPmhsbF9maWxlOwotCSAgICB9Ci0KLQkgIGlmIChjdXJyZW50X2hsbF9maWxlICYmIGxpc3QtPmhsbF9saW5lICYmIChsaXN0aW5nICYgTElTVElOR19ITEwpKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc291cmNlIChjdXJyZW50X2hsbF9maWxlLCBsaXN0LCBidWZmZXIsIHdpZHRoKTsKLQkgICAgfQotCi0JICBpZiAobGlzdC0+bGluZV9jb250ZW50cykKLQkgICAgewotCSAgICAgIGlmICghKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKQotCQkgICAgJiYgZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgbGlzdC0+bGluZV9jb250ZW50cykpKQotCQl7Ci0gCQkgIHByaW50X2xpbmVzIChsaXN0LAotCQkJICAgICAgIGxpc3QtPmZpbGUtPmxpbmVudW0gPT0gMCA/IGxpc3QtPmxpbmUgOiBsaXN0LT5maWxlLT5saW5lbnVtLAotCQkJICAgICAgIGxpc3QtPmxpbmVfY29udGVudHMsIGNhbGNfaGV4IChsaXN0KSk7Ci0JCX0KLQkgICAgICBmcmVlIChsaXN0LT5saW5lX2NvbnRlbnRzKTsKLQkgICAgICBsaXN0LT5saW5lX2NvbnRlbnRzID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKLQkJICAgICAmJiAhbGlzdC0+ZmlsZS0+YXRfZW5kKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IGFkZHJlc3M7Ci0KLQkJICBwID0gYnVmZmVyX2xpbmUgKGxpc3QtPmZpbGUsIGJ1ZmZlciwgd2lkdGgpOwotCi0JCSAgaWYgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUpCi0JCSAgICBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOwotCQkgIGVsc2UKLQkJICAgIGFkZHJlc3MgPSBjYWxjX2hleCAobGlzdCk7Ci0KLQkJICBpZiAoISgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykKLQkJCSYmIGRlYnVnZ2luZ19wc2V1ZG8gKGxpc3QsIHApKSkKLQkJICAgIHByaW50X2xpbmVzIChsaXN0LCBsaXN0LT5maWxlLT5saW5lbnVtLCBwLCBhZGRyZXNzKTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9FSkVDVCkKLQkgICAgewotCSAgICAgIGVqZWN0ID0gMTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX05PTElTVF9ORVhUKQotCS0tc2hvd19saXN0aW5nOwotCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoYnVmZmVyKTsKLSAgZnJlZSAoZGF0YV9idWZmZXIpOwotICBkYXRhX2J1ZmZlciA9IE5VTEw7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfcHJpbnQgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCB1c2luZ19zdGRvdXQ7Ci0gIAotICB0aXRsZSA9ICIiOwotICBzdWJ0aXRsZSA9ICIiOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgbGlzdF9maWxlID0gc3Rkb3V0OwotICAgICAgdXNpbmdfc3Rkb3V0ID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0X2ZpbGUgPSBmb3BlbiAobmFtZSwgInciKTsKLSAgICAgIGlmIChsaXN0X2ZpbGUgIT0gTlVMTCkKLQl1c2luZ19zdGRvdXQgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGFzX3BlcnJvciAoXygiY2FuJ3Qgb3BlbiBsaXN0IGZpbGU6ICVzIiksIG5hbWUpOwotCSAgbGlzdF9maWxlID0gc3Rkb3V0OwotCSAgdXNpbmdfc3Rkb3V0ID0gMTsKLQl9Ci0gICAgfQotCi0gIGlmIChsaXN0aW5nICYgTElTVElOR19OT0ZPUk0pCi0gICAgewotICAgICAgcGFwZXJfaGVpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX0xJU1RJTkcpCi0gICAgewotICAgICAgbGlzdGluZ19saXN0aW5nIChuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX1NZTUJPTFMpCi0gICAgewotICAgICAgbGlzdF9zeW1ib2xfdGFibGUgKCk7Ci0gICAgfQotCi0gIGlmICghIHVzaW5nX3N0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoZmNsb3NlIChsaXN0X2ZpbGUpID09IEVPRikKLQlhc19wZXJyb3IgKF8oImVycm9yIGNsb3NpbmcgbGlzdCBmaWxlOiAlcyIpLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxhc3Rfb3Blbl9maWxlKQotICAgIHsKLSAgICAgIGZjbG9zZSAobGFzdF9vcGVuX2ZpbGUpOwotICAgIH0KLX0KLQotCi12b2lkCi1saXN0aW5nX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGZuID0gbmFtZTsKLX0KLQotdm9pZAotbGlzdGluZ19lamVjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChsaXN0aW5nKQotICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9FSkVDVDsKLX0KLQotdm9pZAotbGlzdGluZ19mbGFncyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHdoaWxlICgoKmlucHV0X2xpbmVfcG9pbnRlcisrKSAmJiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nKSkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotfQotCi0vKiBUdXJuIGxpc3Rpbmcgb24gb3Igb2ZmLiAgQW4gYXJndW1lbnQgb2YgMCBtZWFucyB0byB0dXJuIG9mZgotICAgbGlzdGluZy4gIEFuIGFyZ3VtZW50IG9mIDEgbWVhbnMgdG8gdHVybiBvbiBsaXN0aW5nLiAgQW4gYXJndW1lbnQKLSAgIG9mIDIgbWVhbnMgdG8gdHVybiBvZmYgbGlzdGluZywgYnV0IGFzIG9mIHRoZSBuZXh0IGxpbmU7IHRoYXQgaXMsCi0gICB0aGUgY3VycmVudCBsaW5lIHNob3VsZCBiZSBsaXN0ZWQsIGJ1dCB0aGUgbmV4dCBsaW5lIHNob3VsZCBub3QuICAqLwotCi12b2lkCi1saXN0aW5nX2xpc3QgKG9uKQotICAgICBpbnQgb247Ci17Ci0gIGlmIChsaXN0aW5nKQotICAgIHsKLSAgICAgIHN3aXRjaCAob24pCi0JewotCWNhc2UgMDoKLQkgIGlmIChsaXN0aW5nX3RhaWwtPmVkaWN0ID09IEVESUNUX0xJU1QpCi0JICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9OT05FOwotCSAgZWxzZQotCSAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9MSVNUOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaWYgKGxpc3RpbmdfdGFpbC0+ZWRpY3QgPT0gRURJQ1RfTk9MSVNUCi0JICAgICAgfHwgbGlzdGluZ190YWlsLT5lZGljdCA9PSBFRElDVF9OT0xJU1RfTkVYVCkKLQkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTkU7Ci0JICBlbHNlCi0JICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9MSVNUOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTElTVF9ORVhUOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci19Ci0KLQotdm9pZAotbGlzdGluZ19wc2l6ZSAod2lkdGhfb25seSkKLSAgICAgaW50IHdpZHRoX29ubHk7Ci17Ci0gIGlmICghIHdpZHRoX29ubHkpCi0gICAgewotICAgICAgcGFwZXJfaGVpZ2h0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgICAgIGlmIChwYXBlcl9oZWlnaHQgPCAwIHx8IHBhcGVyX2hlaWdodCA+IDEwMDApCi0JewotCSAgcGFwZXJfaGVpZ2h0ID0gMDsKLQkgIGFzX3dhcm4gKF8oInN0cmFuZ2UgcGFwZXIgaGVpZ2h0LCBzZXQgdG8gbm8gZm9ybSIpKTsKLQl9Ci0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQl7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIHBhcGVyX3dpZHRoID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotbGlzdGluZ19ub3BhZ2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBwYXBlcl9oZWlnaHQgPSAwOwotfQotCi12b2lkCi1saXN0aW5nX3RpdGxlIChkZXB0aCkKLSAgICAgaW50IGRlcHRoOwotewotICBpbnQgcXVvdGVkOwotICBjaGFyICpzdGFydDsKLSAgY2hhciAqdHRsOwotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKLSAgICBxdW90ZWQgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgcXVvdGVkID0gMTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICB7Ci0gICAgICBpZiAocXVvdGVkCi0JICA/ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJwotCSAgOiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaWYgKGxpc3RpbmcpCi0JICAgIHsKLQkgICAgICBsZW5ndGggPSBpbnB1dF9saW5lX3BvaW50ZXIgLSBzdGFydDsKLQkgICAgICB0dGwgPSB4bWFsbG9jIChsZW5ndGggKyAxKTsKLQkgICAgICBtZW1jcHkgKHR0bCwgc3RhcnQsIGxlbmd0aCk7Ci0JICAgICAgdHRsW2xlbmd0aF0gPSAwOwotCSAgICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBkZXB0aCA/IEVESUNUX1NCVFRMIDogRURJQ1RfVElUTEU7Ci0JICAgICAgbGlzdGluZ190YWlsLT5lZGljdF9hcmcgPSB0dGw7Ci0JICAgIH0KLQkgIGlmIChxdW90ZWQpCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JewotCSAgYXNfYmFkIChfKCJOZXcgbGluZSBpbiB0aXRsZSIpKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCX0KLSAgICB9Ci19Ci0KLQotCi12b2lkCi1saXN0aW5nX3NvdXJjZV9saW5lIChsaW5lKQotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgewotICAgICAgbmV3X2ZyYWcgKCk7Ci0gICAgICBsaXN0aW5nX3RhaWwtPmhsbF9saW5lID0gbGluZTsKLSAgICAgIG5ld19mcmFnICgpOwotICAgIH0KLX0KLQotdm9pZAotbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ190YWlsLT5obGxfZmlsZSA9IGZpbGVfaW5mbyAoZmlsZSk7Ci19Ci0KLQotCi0jZWxzZQotCi0KLS8qIER1bW15IGZ1bmN0aW9ucyBmb3Igd2hlbiBjb21waWxlZCB3aXRob3V0IGxpc3RpbmcgZW5hYmxlZCAqLwotCi12b2lkCi1saXN0aW5nX2ZsYWdzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZCAKLWxpc3RpbmdfbGlzdCAob24pCi0gICAgIGludCBvbjsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ19lamVjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzX2lnbm9yZSAoMCk7Ci19Ci0KLXZvaWQgCi1saXN0aW5nX3BzaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZAotbGlzdGluZ19ub3BhZ2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ190aXRsZSAoZGVwdGgpCi0gICAgIGludCBkZXB0aDsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkCi1saXN0aW5nX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0KLX0KLQotdm9pZCAKLWxpc3RpbmdfbmV3bGluZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLQotfQotCi12b2lkIAotbGlzdGluZ19zb3VyY2VfbGluZSAobikKLSAgICAgdW5zaWduZWQgaW50IG47Ci17Ci0KLX0KLXZvaWQgCi1saXN0aW5nX3NvdXJjZV9maWxlIChuKQotICAgICBjb25zdCBjaGFyICpuOwotewotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2xpc3RpbmcuaCBiL2dhcy9saXN0aW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDVjMzcuLjAwMDAwMDAKLS0tIGEvZ2FzL2xpc3RpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBsaXN0aW5nLmgKLSAgIENvcHlyaWdodCAoQykgMTk4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfX2xpc3RpbmdfaF9fCi0jZGVmaW5lIF9fbGlzdGluZ19oX18KLQotI2RlZmluZSBMSVNUSU5HX0xJU1RJTkcgICAgMQotI2RlZmluZSBMSVNUSU5HX1NZTUJPTFMgICAgMgotI2RlZmluZSBMSVNUSU5HX05PRk9STSAgICAgNAotI2RlZmluZSBMSVNUSU5HX0hMTCAgICAgICAgOAotI2RlZmluZSBMSVNUSU5HX05PREVCVUcgICAxNgotI2RlZmluZSBMSVNUSU5HX05PQ09ORAkgIDMyCi0jZGVmaW5lIExJU1RJTkdfTUFDRVhQCSAgNjQKLQotI2RlZmluZSBMSVNUSU5HX0RFRkFVTFQgICAgKExJU1RJTkdfTElTVElORyB8IExJU1RJTkdfSExMIHwgTElTVElOR19TWU1CT0xTKQotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNkZWZpbmUgTElTVElOR19ORVdMSU5FKCkgeyBpZiAobGlzdGluZykgbGlzdGluZ19uZXdsaW5lKE5VTEwpOyB9Ci0jZWxzZQotI2RlZmluZSBMSVNUSU5HX05FV0xJTkUoKSB7O30KLSNlbmRpZgotI2RlZmluZSBMSVNUSU5HX0VPRigpICAgICBMSVNUSU5HX05FV0xJTkUoKQotCi0jZGVmaW5lIExJU1RJTkdfU0tJUF9DT05EKCkgKChsaXN0aW5nICYgTElTVElOR19OT0NPTkQpICE9IDApCi0KLXZvaWQgbGlzdGluZ19lamVjdCBQQVJBTVMgKChpbnQpKTsKLXZvaWQgbGlzdGluZ19lcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICptZXNzYWdlKSk7Ci12b2lkIGxpc3RpbmdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci12b2lkIGxpc3RpbmdfZmxhZ3MgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3RpbmdfbGlzdCBQQVJBTVMgKChpbnQgb24pKTsKLXZvaWQgbGlzdGluZ19uZXdsaW5lIFBBUkFNUyAoKGNoYXIgKnBzKSk7Ci12b2lkIGxpc3RpbmdfcHJldl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgbGlzdGluZ19wcmludCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci12b2lkIGxpc3RpbmdfcHNpemUgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3Rpbmdfbm9wYWdlIFBBUkFNUyAoKGludCkpOwotdm9pZCBsaXN0aW5nX3NvdXJjZV9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotdm9pZCBsaXN0aW5nX3NvdXJjZV9saW5lIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotdm9pZCBsaXN0aW5nX3RpdGxlIFBBUkFNUyAoKGludCBkZXB0aCkpOwotdm9pZCBsaXN0aW5nX3dhcm5pbmcgUEFSQU1TICgoY29uc3QgY2hhciAqbWVzc2FnZSkpOwotdm9pZCBsaXN0aW5nX3dpZHRoIFBBUkFNUyAoKHVuc2lnbmVkIGludCB4KSk7Ci0KLWV4dGVybiBpbnQgbGlzdGluZ19saHNfd2lkdGg7Ci1leHRlcm4gaW50IGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZDsKLWV4dGVybiBpbnQgbGlzdGluZ19saHNfY29udF9saW5lczsKLWV4dGVybiBpbnQgbGlzdGluZ19yaHNfd2lkdGg7Ci0KLSNlbmRpZiAvKiBfX2xpc3RpbmdfaF9fICovCi0KLS8qIGVuZCBvZiBsaXN0aW5nLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9saXRlcmFsLmMgYi9nYXMvbGl0ZXJhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Y4ZmM0Li4wMDAwMDAwCi0tLSBhL2dhcy9saXRlcmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBhcy5jIC0gR0FTIGxpdGVyYWwgcG9vbCBtYW5hZ2VtZW50LgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiAocmFlYnVybkBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIFRoaXMgaXNuJ3QgcXVpdGUgYSAiY29uc3RhbnQiIHBvb2wuICBTb21lIG9mIHRoZSB2YWx1ZXMgbWF5IGdldAotICAgYWRqdXN0ZWQgYXQgcnVuIHRpbWUsIGUuZy4sIGZvciBzeW1ib2xpYyByZWxvY2F0aW9ucyB3aGVuIHNoYXJlZAotICAgbGlicmFyaWVzIGFyZSBpbiB1c2UuICBJdCdzIG1vcmUgb2YgYSAibGl0ZXJhbCIgcG9vbC4KLQotICAgT24gdGhlIEFscGhhLCB0aGlzIHNob3VsZCBiZSB1c2VkIGZvciAubGl0YSBhbmQgLmxpdDguICAoSXMgdGhlcmUKLSAgIGV2ZXIgYSAubGl0ND8pICBPbiB0aGUgTUlQUywgaXQgY291bGQgYmUgdXNlZCBmb3IgLmxpdDQgYXMgd2VsbC4KLQotICAgVGhlIGV4cHJlc3Npb25zIHBhc3NlZCBoZXJlIHNob3VsZCBjb250YWluIGVpdGhlciBjb25zdGFudHMgb3Igc3ltYm9scywKLSAgIG5vdCBhIGNvbWJpbmF0aW9uIG9mIGJvdGguICBUeXBpY2FsbHksIHRoZSBjb25zdGFudCBwb29sIGlzIGFjY2Vzc2VkCi0gICB3aXRoIHNvbWUgc29ydCBvZiBHUCByZWdpc3Rlciwgc28gdGhlIHNpemUgb2YgdGhlIHBvb2wgbXVzdCBiZSBrZXB0IGRvd24KLSAgIGlmIHBvc3NpYmxlLiAgVGhlIGV4Y2VwdGlvbiBpcyBzZWN0aW9uIG9mZnNldHMgLS0gaWYgeW91J3JlIHN0b3JpbmcgYQotICAgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgLmRhdGEsIGZvciBleGFtcGxlLCBhbmQgeW91ciBtYWNoaW5lIHByb3ZpZGVzCi0gICBmb3IgMTYtYml0IHNpZ25lZCBhZGRlbmRzLCB5b3UgbWlnaHQgd2FudCB0byBzdG9yZSAuZGF0YSszMkssIHNvIHRoYXQKLSAgIHlvdSBjYW4gYWNjZXNzIGFsbCBvZiB0aGUgZmlyc3QgNjRLIG9mIC5kYXRhIHdpdGggdGhlIG9uZSBwb2ludGVyLgotCi0gICBUaGlzIGlzbid0IGEgcmVxdWlyZW1lbnQsIGp1c3QgYSBndWlkZWxpbmUgdGhhdCBjYW4gaGVscCBrZWVwIC5vIGZpbGUKLSAgIHNpemUgZG93bi4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmIGRlZmluZWQgKE5FRURfTElURVJBTF9QT09MKQotCi12YWx1ZVQKLWFkZF90b19saXRlcmFsX3Bvb2wgKHN5bSwgYWRkZW5kLCBzZWMsIHNpemUpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgdmFsdWVUIGFkZGVuZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGludCBzaXplOwotewotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY190eXBlOwotICBjaGFyICpwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBmaXhTICpmaXhwOwotCi0gIG9mZnNldCA9IDA7Ci0gIC8qIEBAIFRoaXMgYXNzdW1lcyBhbGwgZW50cmllcyBpbiBhIGdpdmVuIHNlY3Rpb24gd2lsbCBiZSBvZiB0aGUgc2FtZQotICAgICBzaXplLi4uICBQcm9iYWJseSBjb3JyZWN0LCBidXQgdW53aXNlIHRvIHJlbHkgb24uICAqLwotICAvKiBUaGlzIG11c3QgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHN1YnNlZ21lbnQuICAqLwotICBpZiAoc2VnaW5mby0+ZnJjaGFpblApCi0gICAgZm9yIChmaXhwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZpeF9yb290OwotCSBmaXhwICE9IChmaXhTICopIE5VTEw7Ci0JIGZpeHAgPSBmaXhwLT5meF9uZXh0LCBvZmZzZXQgKz0gc2l6ZSkKLSAgICAgIHsKLQlpZiAoZml4cC0+ZnhfYWRkc3kgPT0gc3ltICYmIGZpeHAtPmZ4X29mZnNldCA9PSBhZGRlbmQpCi0JICByZXR1cm4gb2Zmc2V0OwotICAgICAgfQotCi0gIHN1YnNlZ19zZXQgKHNlYywgMCk7Ci0gIHAgPSBmcmFnX21vcmUgKHNpemUpOwotICBtZW1zZXQgKHAsIDAsIHNpemUpOwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfNjQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLCBzeW0sIGFkZGVuZCwgMCwKLQkgICByZWxvY190eXBlKTsKLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSAgb2Zmc2V0ID0gc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemU7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IHNpemU7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL21hYy1hcy5yIGIvZ2FzL21hYy1hcy5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZjMDMzLi4wMDAwMDAwCi0tLSBhL2dhcy9tYWMtYXMucgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJlc291cmNlcyBmb3IgR05VIEFTLiAqLwotCi0jaW5jbHVkZSAiU3lzVHlwZXMuciIKLQotLyogVmVyc2lvbiByZXNvdXJjZXMuICovCi0KLXJlc291cmNlICd2ZXJzJyAoMSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCVZFUlNJT05fU1RSSU5HICAiIChDKSAxOTg2LTk1IEZTRiwgSW5jLiIKLX07Ci0KLXJlc291cmNlICd2ZXJzJyAoMiwgcHVyZ2VhYmxlKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JIkdBUyAiIFZFUlNJT05fU1RSSU5HICIgZm9yIE1QVyIKLX07Ci0KLSNpZmRlZiBXQU5UX0NGUkcKLQotI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCi0KLXJlc291cmNlICdjZnJnJyAoMCkgewotCXsKLQkJa1Bvd2VyUEMsCi0JCWtGdWxsTGliLAotCQlrTm9WZXJzaW9uTnVtLCBrTm9WZXJzaW9uTnVtLAotCQkwLDAsCi0JCWtJc0FwcCwga09uRGlza0ZsYXQsIGtaZXJvT2Zmc2V0LCBrV2hvbGVGb3JrLAotCQlQUk9HX05BTUUKLQl9Ci19OwotCi0jZW5kaWYgLyogV0FOVF9DRlJHICovCmRpZmYgLS1naXQgYS9nYXMvbWFjcm8uYyBiL2dhcy9tYWNyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmE3NTdlLi4wMDAwMDAwCi0tLSBhL2dhcy9tYWNyby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMiArMCwwIEBACi0vKiBtYWNyby5jIC0gbWFjcm8gc3VwcG9ydCBmb3IgZ2FzIGFuZCBnYXNwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgaWZuZGVmIGFsbG9jYQotIyAgaWZkZWYgX19TVERDX18KLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICBlbHNlCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotIyAgICBpZiAhZGVmaW5lZCAoX19TVERDX18pICYmICFkZWZpbmVkIChfX2hwdXgpCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgICBlbHNlCi1leHRlcm4gdm9pZCAqYWxsb2NhICgpOwotIyAgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICAgZW5kaWYgLyogYWxsb2NhICovCi0jICBlbmRpZiAvKiBfQUlYICovCi0jIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic2IuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0jaW5jbHVkZSAibWFjcm8uaCIKLQotI2luY2x1ZGUgImFzaW50bC5oIgotCi0vKiBUaGUgcm91dGluZXMgaW4gdGhpcyBmaWxlIGhhbmRsZSBtYWNybyBkZWZpbml0aW9uIGFuZCBleHBhbnNpb24uCi0gICBUaGV5IGFyZSBjYWxsZWQgYnkgYm90aCBnYXNwIGFuZCBnYXMuICAqLwotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgaW50IGdldF90b2tlbiBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0c3RyaW5nIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBnZXRfYW55X3N0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGRvX2Zvcm1hbHMgUEFSQU1TICgobWFjcm9fZW50cnkgKiwgaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IGdldF9hcG9zdF90b2tlbiBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCkpOwotc3RhdGljIGludCBzdWJfYWN0dWFsCi0gIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKiwgc3RydWN0IGhhc2hfY29udHJvbCAqLCBpbnQsIHNiICosIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKm1hY3JvX2V4cGFuZF9ib2R5Ci0gIFBBUkFNUyAoKHNiICosIHNiICosIGZvcm1hbF9lbnRyeSAqLCBzdHJ1Y3QgaGFzaF9jb250cm9sICosIGludCwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbWFjcm9fZXhwYW5kIFBBUkFNUyAoKGludCwgc2IgKiwgbWFjcm9fZW50cnkgKiwgc2IgKiwgaW50KSk7Ci0KLSNkZWZpbmUgSVNXSElURSh4KSAoKHgpID09ICcgJyB8fCAoeCkgPT0gJ1x0JykKLQotI2RlZmluZSBJU1NFUCh4KSBcCi0gKCh4KSA9PSAnICcgfHwgKHgpID09ICdcdCcgfHwgKHgpID09ICcsJyB8fCAoeCkgPT0gJyInIHx8ICh4KSA9PSAnOycgXAotICB8fCAoeCkgPT0gJyknIHx8ICh4KSA9PSAnKCcgXAotICB8fCAoKG1hY3JvX2FsdGVybmF0ZSB8fCBtYWNyb19tcmkpICYmICgoeCkgPT0gJzwnIHx8ICh4KSA9PSAnPicpKSkKLQotI2RlZmluZSBJU0JBU0UoeCkgXAotICAoKHgpID09ICdiJyB8fCAoeCkgPT0gJ0InIFwKLSAgIHx8ICh4KSA9PSAncScgfHwgKHgpID09ICdRJyBcCi0gICB8fCAoeCkgPT0gJ2gnIHx8ICh4KSA9PSAnSCcgXAotICAgfHwgKHgpID09ICdkJyB8fCAoeCkgPT0gJ0QnKQotCi0vKiBUaGUgbWFjcm8gaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptYWNyb19oYXNoOwotCi0vKiBXaGV0aGVyIGFueSBtYWNyb3MgaGF2ZSBiZWVuIGRlZmluZWQuICAqLwotCi1pbnQgbWFjcm9fZGVmaW5lZDsKLQotLyogV2hldGhlciB3ZSBhcmUgaW4gR0FTUCBhbHRlcm5hdGUgbW9kZS4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fYWx0ZXJuYXRlOwotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiBNUkkgbW9kZS4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fbXJpOwotCi0vKiBXaGV0aGVyIHdlIHNob3VsZCBzdHJpcCAnQCcgY2hhcmFjdGVycy4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fc3RyaXBfYXQ7Ci0KLS8qIEZ1bmN0aW9uIHRvIHVzZSB0byBwYXJzZSBhbiBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIGludCAoKm1hY3JvX2V4cHIpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOwotCi0vKiBOdW1iZXIgb2YgbWFjcm8gZXhwYW5zaW9ucyB0aGF0IGhhdmUgYmVlbiBkb25lLiAgKi8KLQotc3RhdGljIGludCBtYWNyb19udW1iZXI7Ci0KLS8qIEluaXRpYWxpemUgbWFjcm8gcHJvY2Vzc2luZy4gICovCi0KLXZvaWQKLW1hY3JvX2luaXQgKGFsdGVybmF0ZSwgbXJpLCBzdHJpcF9hdCwgZXhwcikKLSAgICAgaW50IGFsdGVybmF0ZTsKLSAgICAgaW50IG1yaTsKLSAgICAgaW50IHN0cmlwX2F0OwotICAgICBpbnQgKCpleHByKSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLXsKLSAgbWFjcm9faGFzaCA9IGhhc2hfbmV3ICgpOwotICBtYWNyb19kZWZpbmVkID0gMDsKLSAgbWFjcm9fYWx0ZXJuYXRlID0gYWx0ZXJuYXRlOwotICBtYWNyb19tcmkgPSBtcmk7Ci0gIG1hY3JvX3N0cmlwX2F0ID0gc3RyaXBfYXQ7Ci0gIG1hY3JvX2V4cHIgPSBleHByOwotfQotCi0vKiBTd2l0Y2ggaW4gYW5kIG91dCBvZiBNUkkgbW9kZSBvbiB0aGUgZmx5LiAgKi8KLQotdm9pZAotbWFjcm9fbXJpX21vZGUgKG1yaSkKLSAgICAgaW50IG1yaTsKLXsKLSAgbWFjcm9fbXJpID0gbXJpOwotfQotCi0vKiBSZWFkIGlucHV0IGxpbmVzIHRpbGwgd2UgZ2V0IHRvIGEgVE8gc3RyaW5nLgotICAgSW5jcmVhc2UgbmVzdGluZyBkZXB0aCBpZiB3ZSBnZXQgYSBGUk9NIHN0cmluZy4KLSAgIFB1dCB0aGUgcmVzdWx0cyBpbnRvIHNiIGF0IFBUUi4KLSAgIEFkZCBhIG5ldyBpbnB1dCBsaW5lIHRvIGFuIHNiIHVzaW5nIEdFVF9MSU5FLgotICAgUmV0dXJuIDEgb24gc3VjY2VzcywgMCBvbiB1bmV4cGVjdGVkIEVPRi4gICovCi0KLWludAotYnVmZmVyX2FuZF9uZXN0IChmcm9tLCB0bywgcHRyLCBnZXRfbGluZSkKLSAgICAgY29uc3QgY2hhciAqZnJvbTsKLSAgICAgY29uc3QgY2hhciAqdG87Ci0gICAgIHNiICpwdHI7Ci0gICAgIGludCAoKmdldF9saW5lKSBQQVJBTVMgKChzYiAqKSk7Ci17Ci0gIGludCBmcm9tX2xlbiA9IHN0cmxlbiAoZnJvbSk7Ci0gIGludCB0b19sZW4gPSBzdHJsZW4gKHRvKTsKLSAgaW50IGRlcHRoID0gMTsKLSAgaW50IGxpbmVfc3RhcnQgPSBwdHItPmxlbjsKLQotICBpbnQgbW9yZSA9IGdldF9saW5lIChwdHIpOwotCi0gIHdoaWxlIChtb3JlKQotICAgIHsKLSAgICAgIC8qIFRyeSBhbmQgZmluZCB0aGUgZmlyc3QgcHNldWRvIG9wIG9uIHRoZSBsaW5lICovCi0gICAgICBpbnQgaSA9IGxpbmVfc3RhcnQ7Ci0KLSAgICAgIGlmICghIG1hY3JvX2FsdGVybmF0ZSAmJiAhIG1hY3JvX21yaSkKLQl7Ci0JICAvKiBXaXRoIG5vcm1hbCBzeW50YXggd2UgY2FuIHN1Y2sgd2hhdCB3ZSB3YW50IHRpbGwgd2UgZ2V0Ci0JICAgICB0byB0aGUgZG90LiAgV2l0aCB0aGUgYWx0ZXJuYXRlLCBsYWJlbHMgaGF2ZSB0byBzdGFydCBpbgotCSAgICAgdGhlIGZpcnN0IGNvbHVtbiwgc2luY2Ugd2UgY2FudCB0ZWxsIHdoYXQncyBhIGxhYmVsIGFuZAotCSAgICAgd2hhdHMgYSBwc2V1ZG9vcCAqLwotCi0JICAvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCSAgd2hpbGUgKGkgPCBwdHItPmxlbiAmJiBJU1dISVRFIChwdHItPnB0cltpXSkpCi0JICAgIGkrKzsKLQotCSAgLyogU2tpcCBvdmVyIGEgbGFiZWwgKi8KLQkgIHdoaWxlIChpIDwgcHRyLT5sZW4KLQkJICYmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgcHRyLT5wdHJbaV0pCi0JCSAgICAgfHwgcHRyLT5wdHJbaV0gPT0gJ18nCi0JCSAgICAgfHwgcHRyLT5wdHJbaV0gPT0gJyQnKSkKLQkgICAgaSsrOwotCi0JICAvKiBBbmQgYSBjb2xvbiAqLwotCSAgaWYgKGkgPCBwdHItPmxlbgotCSAgICAgICYmIHB0ci0+cHRyW2ldID09ICc6JykKLQkgICAgaSsrOwotCi0JfQotICAgICAgLyogU2tpcCB0cmFpbGluZyB3aGl0ZXNwYWNlICovCi0gICAgICB3aGlsZSAoaSA8IHB0ci0+bGVuICYmIElTV0hJVEUgKHB0ci0+cHRyW2ldKSkKLQlpKys7Ci0KLSAgICAgIGlmIChpIDwgcHRyLT5sZW4gJiYgKHB0ci0+cHRyW2ldID09ICcuJwotCQkJICAgfHwgbWFjcm9fYWx0ZXJuYXRlCi0JCQkgICB8fCBtYWNyb19tcmkpKQotCXsKLQkgIGlmIChwdHItPnB0cltpXSA9PSAnLicpCi0JICAgICAgaSsrOwotCSAgaWYgKHN0cm5jYXNlY21wIChwdHItPnB0ciArIGksIGZyb20sIGZyb21fbGVuKSA9PSAwCi0JICAgICAgJiYgKHB0ci0+bGVuID09IChpICsgZnJvbV9sZW4pIHx8ICEgaXNhbG51bSAocHRyLT5wdHJbaSArIGZyb21fbGVuXSkpKQotCSAgICBkZXB0aCsrOwotCSAgaWYgKHN0cm5jYXNlY21wIChwdHItPnB0ciArIGksIHRvLCB0b19sZW4pID09IDAKLQkgICAgICAmJiAocHRyLT5sZW4gPT0gKGkgKyB0b19sZW4pIHx8ICEgaXNhbG51bSAocHRyLT5wdHJbaSArIHRvX2xlbl0pKSkKLQkgICAgewotCSAgICAgIGRlcHRoLS07Ci0JICAgICAgaWYgKGRlcHRoID09IDApCi0JCXsKLQkJICAvKiBSZXNldCB0aGUgc3RyaW5nIHRvIG5vdCBpbmNsdWRlIHRoZSBlbmRpbmcgcnVuZSAqLwotCQkgIHB0ci0+bGVuID0gbGluZV9zdGFydDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBZGQgYSBDUiB0byB0aGUgZW5kIGFuZCBrZWVwIHJ1bm5pbmcgKi8KLSAgICAgIHNiX2FkZF9jaGFyIChwdHIsICdcbicpOwotICAgICAgbGluZV9zdGFydCA9IHB0ci0+bGVuOwotICAgICAgbW9yZSA9IGdldF9saW5lIChwdHIpOwotICAgIH0KLQotICAvKiBSZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIHVuZXhwZWN0ZWQgRU9GLiAgKi8KLSAgcmV0dXJuIGRlcHRoID09IDA7Ci19Ci0KLS8qIFBpY2sgdXAgYSB0b2tlbi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF90b2tlbiAoaWR4LCBpbiwgbmFtZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqbmFtZTsKLXsKLSAgaWYgKGlkeCA8IGluLT5sZW4KLSAgICAgICYmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHhdKQotCSAgfHwgaW4tPnB0cltpZHhdID09ICdfJwotCSAgfHwgaW4tPnB0cltpZHhdID09ICckJykpCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKG5hbWUsIGluLT5wdHJbaWR4KytdKTsKLSAgICAgIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JICAgICAmJiAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4XSkKLQkJIHx8IGluLT5wdHJbaWR4XSA9PSAnXycKLQkJIHx8IGluLT5wdHJbaWR4XSA9PSAnJCcpKQotCXsKLQkgIHNiX2FkZF9jaGFyIChuYW1lLCBpbi0+cHRyW2lkeCsrXSk7Ci0JfQotICAgIH0KLSAgLyogSWdub3JlIHRyYWlsaW5nICYgKi8KLSAgaWYgKG1hY3JvX2FsdGVybmF0ZSAmJiBpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSA9PSAnJicpCi0gICAgaWR4Kys7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIFBpY2sgdXAgYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRzdHJpbmcgKGlkeCwgaW4sIGFjYykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqYWNjOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAmJiAoaW4tPnB0cltpZHhdID09ICciJyAKLQkgICAgIHx8IChpbi0+cHRyW2lkeF0gPT0gJzwnICYmIChtYWNyb19hbHRlcm5hdGUgfHwgbWFjcm9fbXJpKSkKLQkgICAgIHx8IChpbi0+cHRyW2lkeF0gPT0gJ1wnJyAmJiBtYWNyb19hbHRlcm5hdGUpKSkKLSAgICB7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICc8JykKLQl7Ci0JICBpbnQgbmVzdCA9IDA7Ci0JICBpZHgrKzsKLQkgIHdoaWxlICgoaW4tPnB0cltpZHhdICE9ICc+JyB8fCBuZXN0KQotCQkgJiYgaWR4IDwgaW4tPmxlbikKLQkgICAgewotCSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyEnKQotCQl7Ci0JCSAgaWR4KysgIDsKLQkJICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaW4tPnB0cltpZHhdID09ICc+JykKLQkJICAgIG5lc3QtLTsKLQkJICBpZiAoaW4tPnB0cltpZHhdID09ICc8JykKLQkJICAgIG5lc3QrKzsKLQkJICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCX0KLQkgICAgfQotCSAgaWR4Kys7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICciJyB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQl7Ci0JICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOwotCSAgaWR4Kys7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLQkgICAgewotCSAgICAgIGlmIChtYWNyb19hbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdID09ICchJykKLQkJewotCQkgIGlkeCsrICA7Ci0JCSAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGluLT5wdHJbaWR4XSA9PSB0Y2hhcikKLQkJICAgIHsKLQkJICAgICAgaWR4Kys7Ci0JCSAgICAgIGlmIChpZHggPj0gaW4tPmxlbiB8fCBpbi0+cHRyW2lkeF0gIT0gdGNoYXIpCi0JCQlicmVhazsKLQkJICAgIH0KLQkJICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeF0pOwotCQkgIGlkeCsrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogRmV0Y2ggc3RyaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbSwKLSAgIHJ1bGVzOgotICAgICdCeHl4PHdoaXRlc3BhY2U+ICAJLT4gcmV0dXJuICdCeHl6YQotICAgICU8Y2hhcj4JCS0+IHJldHVybiBzdHJpbmcgb2YgZGVjaW1hbCB2YWx1ZSBvZiB4Ci0gICAgIjxzdHJpbmc+IgkJLT4gcmV0dXJuIHN0cmluZwotICAgIHh5eDx3aGl0ZXNwYWNlPiAgICAgLT4gcmV0dXJuIHh5egotKi8KLQotc3RhdGljIGludAotZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sIG91dCwgZXhwYW5kLCBwcmV0ZW5kX3F1b3RlZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgZXhwYW5kOwotICAgICBpbnQgcHJldGVuZF9xdW90ZWQ7Ci17Ci0gIHNiX3Jlc2V0IChvdXQpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBpZiAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoaW4tPmxlbiA+IDIgJiYgaW4tPnB0cltpZHgrMV0gPT0gJ1wnJyAmJiBJU0JBU0UgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgd2hpbGUgKCFJU1NFUCAoaW4tPnB0cltpZHhdKSkKLQkgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnJScKLQkgICAgICAgJiYgbWFjcm9fYWx0ZXJuYXRlCi0JICAgICAgICYmIGV4cGFuZCkKLQl7Ci0JICBpbnQgdmFsOwotCSAgY2hhciBidWZbMjBdOwotCSAgLyogVHVybnMgdGhlIG5leHQgZXhwcmVzc2lvbiBpbnRvIGEgc3RyaW5nICovCi0JICBpZHggPSAoKm1hY3JvX2V4cHIpIChfKCIlIG9wZXJhdG9yIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24iKSwKLQkJCSAgICAgICBpZHggKyAxLAotCQkJICAgICAgIGluLAotCQkJICAgICAgICZ2YWwpOwotCSAgc3ByaW50ZihidWYsICIlZCIsIHZhbCk7Ci0JICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1Zik7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICciJwotCSAgICAgICB8fCAoaW4tPnB0cltpZHhdID09ICc8JyAmJiAobWFjcm9fYWx0ZXJuYXRlIHx8IG1hY3JvX21yaSkpCi0JICAgICAgIHx8IChtYWNyb19hbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdID09ICdcJycpKQotCXsKLQkgIGlmIChtYWNyb19hbHRlcm5hdGUKLQkgICAgICAmJiAhIG1hY3JvX3N0cmlwX2F0Ci0JICAgICAgJiYgZXhwYW5kKQotCSAgICB7Ci0JICAgICAgLyogS2VlcCB0aGUgcXVvdGVzICovCi0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOwotCi0JICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCBvdXQpOwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICAnXCInKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCBvdXQpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAKLQkJICYmIChpbi0+cHRyW2lkeF0gPT0gJyInCi0JCSAgICAgfHwgaW4tPnB0cltpZHhdID09ICdcJycKLQkJICAgICB8fCBwcmV0ZW5kX3F1b3RlZCAKLQkJICAgICB8fCAoaW4tPnB0cltpZHhdICE9ICcgJwotCQkJICYmIGluLT5wdHJbaWR4XSAhPSAnXHQnCi0JCQkgJiYgaW4tPnB0cltpZHhdICE9ICcsJwotCQkJICYmIChpbi0+cHRyW2lkeF0gIT0gJzwnCi0JCQkgICAgIHx8ICghIG1hY3JvX2FsdGVybmF0ZSAmJiAhIG1hY3JvX21yaSkpKSkpCi0JICAgIHsKLQkgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICciJyAKLQkJICB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQkJewotCQkgIGNoYXIgdGNoYXIgPSBpbi0+cHRyW2lkeF07Ci0JCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCQkgIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JCQkgJiYgaW4tPnB0cltpZHhdICE9IHRjaGFyKQotCQkgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwkJICAgIAotCQkgIGlmIChpZHggPT0gaW4tPmxlbikKLQkJICAgIHJldHVybiBpZHg7CSAgICAgIAotCQl9Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBQaWNrIHVwIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiBhIG1hY3JvIGRlZmluaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1kb19mb3JtYWxzIChtYWNybywgaWR4LCBpbikKLSAgICAgbWFjcm9fZW50cnkgKm1hY3JvOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGZvcm1hbF9lbnRyeSAqKnAgPSAmbWFjcm8tPmZvcm1hbHM7Ci0KLSAgbWFjcm8tPmZvcm1hbF9jb3VudCA9IDA7Ci0gIG1hY3JvLT5mb3JtYWxfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBmb3JtYWxfZW50cnkgKmZvcm1hbDsKLQotICAgICAgZm9ybWFsID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOwotCi0gICAgICBzYl9uZXcgKCZmb3JtYWwtPm5hbWUpOwotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5kZWYpOwotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5hY3R1YWwpOwotCi0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgJmZvcm1hbC0+bmFtZSk7Ci0gICAgICBpZiAoZm9ybWFsLT5uYW1lLmxlbiA9PSAwKQotCWJyZWFrOwotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICBpZiAoZm9ybWFsLT5uYW1lLmxlbikKLQl7Ci0JICAvKiBUaGlzIGlzIGEgZm9ybWFsICovCi0JICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJz0nKQotCSAgICB7Ci0JICAgICAgLyogR290IGEgZGVmYXVsdCAqLwotCSAgICAgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHggKyAxLCBpbiwgJmZvcm1hbC0+ZGVmLCAxLCAwKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogQWRkIHRvIG1hY3JvJ3MgaGFzaCB0YWJsZSAqLwotICAgICAgaGFzaF9qYW0gKG1hY3JvLT5mb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmZm9ybWFsLT5uYW1lKSwgZm9ybWFsKTsKLQotICAgICAgZm9ybWFsLT5pbmRleCA9IG1hY3JvLT5mb3JtYWxfY291bnQ7Ci0gICAgICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgICAgIG1hY3JvLT5mb3JtYWxfY291bnQrKzsKLSAgICAgICpwID0gZm9ybWFsOwotICAgICAgcCA9ICZmb3JtYWwtPm5leHQ7Ci0gICAgICAqcCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChtYWNyb19tcmkpCi0gICAgewotICAgICAgZm9ybWFsX2VudHJ5ICpmb3JtYWw7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICAvKiBBZGQgYSBzcGVjaWFsIE5BUkcgZm9ybWFsLCB3aGljaCBtYWNyb19leHBhbmQgd2lsbCBzZXQgdG8gdGhlCi0gICAgICAgICBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgICAgIGZvcm1hbCA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKLQotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5uYW1lKTsKLSAgICAgIHNiX25ldyAoJmZvcm1hbC0+ZGVmKTsKLSAgICAgIHNiX25ldyAoJmZvcm1hbC0+YWN0dWFsKTsKLQotICAgICAgLyogVGhlIHNhbWUgTVJJIGFzc2VtYmxlcnMgd2hpY2ggdHJlYXQgJ0AnIGNoYXJhY3RlcnMgYWxzbyB1c2UKLSAgICAgICAgIHRoZSBuYW1lICROQVJHLiAgQXQgbGVhc3QgdW50aWwgd2UgZmluZCBhbiBleGNlcHRpb24uICAqLwotICAgICAgaWYgKG1hY3JvX3N0cmlwX2F0KQotCW5hbWUgPSAiJE5BUkciOwotICAgICAgZWxzZQotCW5hbWUgPSAiTkFSRyI7Ci0KLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZmb3JtYWwtPm5hbWUsIG5hbWUpOwotCi0gICAgICAvKiBBZGQgdG8gbWFjcm8ncyBoYXNoIHRhYmxlICovCi0gICAgICBoYXNoX2phbSAobWFjcm8tPmZvcm1hbF9oYXNoLCBuYW1lLCBmb3JtYWwpOwotCi0gICAgICBmb3JtYWwtPmluZGV4ID0gTkFSR19JTkRFWDsKLSAgICAgICpwID0gZm9ybWFsOwotICAgICAgZm9ybWFsLT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogRGVmaW5lIGEgbmV3IG1hY3JvLiAgUmV0dXJucyBOVUxMIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSByZXR1cm5zIGFuCi0gICBlcnJvciBtZXNzYWdlLiAgSWYgTkFNRVAgaXMgbm90IE5VTEwsICpOQU1FUCBpcyBzZXQgdG8gdGhlIG5hbWUgb2YKLSAgIHRoZSBtYWNybyB3aGljaCB3YXMgZGVmaW5lZC4gICovCi0KLWNvbnN0IGNoYXIgKgotZGVmaW5lX21hY3JvIChpZHgsIGluLCBsYWJlbCwgZ2V0X2xpbmUsIG5hbWVwKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpsYWJlbDsKLSAgICAgaW50ICgqZ2V0X2xpbmUpIFBBUkFNUyAoKHNiICopKTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotewotICBtYWNyb19lbnRyeSAqbWFjcm87Ci0gIHNiIG5hbWU7Ci0gIGNvbnN0IGNoYXIgKm5hbWVzdHI7Ci0KLSAgbWFjcm8gPSAobWFjcm9fZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChtYWNyb19lbnRyeSkpOwotICBzYl9uZXcgKCZtYWNyby0+c3ViKTsKLSAgc2JfbmV3ICgmbmFtZSk7Ci0KLSAgbWFjcm8tPmZvcm1hbF9jb3VudCA9IDA7Ci0gIG1hY3JvLT5mb3JtYWxzID0gMDsKLQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0ICgiTUFDUk8iLCAiRU5ETSIsICZtYWNyby0+c3ViLCBnZXRfbGluZSkpCi0gICAgcmV0dXJuIF8oInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gbWFjcm8gZGVmaW5pdGlvbiIpOwotICBpZiAobGFiZWwgIT0gTlVMTCAmJiBsYWJlbC0+bGVuICE9IDApCi0gICAgewotICAgICAgc2JfYWRkX3NiICgmbmFtZSwgbGFiZWwpOwotICAgICAgaWYgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdID09ICcoJykKLQl7Ci0JICAvKiBJdCdzIHRoZSBsYWJlbDogTUFDUk8gKGZvcm1hbHMsLi4uKSAgc29ydCAqLwotCSAgaWR4ID0gZG9fZm9ybWFscyAobWFjcm8sIGlkeCArIDEsIGluKTsKLQkgIGlmIChpbi0+cHRyW2lkeF0gIT0gJyknKQotCSAgICByZXR1cm4gXygibWlzc2luZyApIGFmdGVyIGZvcm1hbHMiKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSXQncyB0aGUgbGFiZWw6IE1BQ1JPIGZvcm1hbHMsLi4uICBzb3J0ICovCi0JICBpZHggPSBkb19mb3JtYWxzIChtYWNybywgaWR4LCBpbik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgJm5hbWUpOwotICAgICAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gICAgICBpZHggPSBkb19mb3JtYWxzIChtYWNybywgaWR4LCBpbik7Ci0gICAgfQotCi0gIC8qIGFuZCBzdGljayBpdCBpbiB0aGUgbWFjcm8gaGFzaCB0YWJsZSAqLwotICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5hbWUubGVuOyBpZHgrKykKLSAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIG5hbWUucHRyW2lkeF0pKQotICAgICAgbmFtZS5wdHJbaWR4XSA9IHRvbG93ZXIgKG5hbWUucHRyW2lkeF0pOwotICBuYW1lc3RyID0gc2JfdGVybWluYXRlICgmbmFtZSk7Ci0gIGhhc2hfamFtIChtYWNyb19oYXNoLCBuYW1lc3RyLCAoUFRSKSBtYWNybyk7Ci0KLSAgbWFjcm9fZGVmaW5lZCA9IDE7Ci0KLSAgaWYgKG5hbWVwICE9IE5VTEwpCi0gICAgKm5hbWVwID0gbmFtZXN0cjsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2NhbiBhIHRva2VuLCBhbmQgdGhlbiBza2lwIEtJTkQuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfYXBvc3RfdG9rZW4gKGlkeCwgaW4sIG5hbWUsIGtpbmQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm5hbWU7Ci0gICAgIGludCBraW5kOwotewotICBpZHggPSBnZXRfdG9rZW4gKGlkeCwgaW4sIG5hbWUpOwotICBpZiAoaWR4IDwgaW4tPmxlbgotICAgICAgJiYgaW4tPnB0cltpZHhdID09IGtpbmQKLSAgICAgICYmICghIG1hY3JvX21yaSB8fCBtYWNyb19zdHJpcF9hdCkKLSAgICAgICYmICghIG1hY3JvX3N0cmlwX2F0IHx8IGtpbmQgPT0gJ0AnKSkKLSAgICBpZHgrKzsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogU3Vic3RpdHV0ZSB0aGUgYWN0dWFsIHZhbHVlIGZvciBhIGZvcm1hbCBwYXJhbWV0ZXIuICAqLwotCi1zdGF0aWMgaW50Ci1zdWJfYWN0dWFsIChzdGFydCwgaW4sIHQsIGZvcm1hbF9oYXNoLCBraW5kLCBvdXQsIGNvcHlpZm5vdHRoZXJlKQotICAgICBpbnQgc3RhcnQ7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKnQ7Ci0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmZvcm1hbF9oYXNoOwotICAgICBpbnQga2luZDsKLSAgICAgc2IgKm91dDsKLSAgICAgaW50IGNvcHlpZm5vdHRoZXJlOwotewotICBpbnQgc3JjOwotICBmb3JtYWxfZW50cnkgKnB0cjsKLQotICBzcmMgPSBnZXRfYXBvc3RfdG9rZW4gKHN0YXJ0LCBpbiwgdCwga2luZCk7Ci0gIC8qIFNlZSBpZiBpdCdzIGluIHRoZSBtYWNybydzIGhhc2ggdGFibGUsIHVubGVzcyB0aGlzIGlzCi0gICAgIG1hY3JvX3N0cmlwX2F0IGFuZCBraW5kIGlzICdAJyBhbmQgdGhlIHRva2VuIGRpZCBub3QgZW5kIGluICdAJy4gICovCi0gIGlmIChtYWNyb19zdHJpcF9hdAotICAgICAgJiYga2luZCA9PSAnQCcKLSAgICAgICYmIChzcmMgPT0gc3RhcnQgfHwgaW4tPnB0cltzcmMgLSAxXSAhPSAnQCcpKQotICAgIHB0ciA9IE5VTEw7Ci0gIGVsc2UKLSAgICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAodCkpOwotICBpZiAocHRyKQotICAgIHsKLSAgICAgIGlmIChwdHItPmFjdHVhbC5sZW4pCi0JewotCSAgc2JfYWRkX3NiIChvdXQsICZwdHItPmFjdHVhbCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNiX2FkZF9zYiAob3V0LCAmcHRyLT5kZWYpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGtpbmQgPT0gJyYnKQotICAgIHsKLSAgICAgIC8qIERvaW5nIHRoaXMgcGVybWl0cyBwZW9wbGUgdG8gdXNlICYgaW4gbWFjcm8gYm9kaWVzLiAgKi8KLSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICcmJyk7Ci0gICAgfQotICBlbHNlIGlmIChjb3B5aWZub3R0aGVyZSkKLSAgICB7Ci0gICAgICBzYl9hZGRfc2IgKG91dCwgdCk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICdcXCcpOwotICAgICAgc2JfYWRkX3NiIChvdXQsIHQpOwotICAgIH0KLSAgcmV0dXJuIHNyYzsKLX0KLQotLyogRXhwYW5kIHRoZSBib2R5IG9mIGEgbWFjcm8uICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1tYWNyb19leHBhbmRfYm9keSAoaW4sIG91dCwgZm9ybWFscywgZm9ybWFsX2hhc2gsIGNvbW1lbnRfY2hhciwgbG9jYWxzKQotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsczsKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqZm9ybWFsX2hhc2g7Ci0gICAgIGludCBjb21tZW50X2NoYXI7Ci0gICAgIGludCBsb2NhbHM7Ci17Ci0gIHNiIHQ7Ci0gIGludCBzcmMgPSAwOwotICBpbnQgaW5xdW90ZSA9IDA7Ci0gIGZvcm1hbF9lbnRyeSAqbG9jbGlzdCA9IE5VTEw7Ci0KLSAgc2JfbmV3ICgmdCk7Ci0KLSAgd2hpbGUgKHNyYyA8IGluLT5sZW4pCi0gICAgewotICAgICAgaWYgKGluLT5wdHJbc3JjXSA9PSAnJicpCi0JewotCSAgc2JfcmVzZXQgKCZ0KTsKLQkgIGlmIChtYWNyb19tcmkpCi0JICAgIHsKLQkgICAgICBpZiAoc3JjICsgMSA8IGluLT5sZW4gJiYgaW4tPnB0cltzcmMgKyAxXSA9PSAnJicpCi0JCXNyYyA9IHN1Yl9hY3R1YWwgKHNyYyArIDIsIGluLCAmdCwgZm9ybWFsX2hhc2gsICdcJycsIG91dCwgMSk7Ci0JICAgICAgZWxzZQotCQlzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW3NyYysrXSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBXaHkgZG8gd2UgZG8gdGhpcz8gICovCi0JICAgICAgc3JjID0gc3ViX2FjdHVhbCAoc3JjICsgMSwgaW4sICZ0LCBmb3JtYWxfaGFzaCwgJyYnLCBvdXQsIDApOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltzcmNdID09ICdcXCcpCi0JewotCSAgc3JjKys7Ci0JICBpZiAoaW4tPnB0cltzcmNdID09IGNvbW1lbnRfY2hhciAmJiBjb21tZW50X2NoYXIgIT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBjb21tZW50LCBqdXN0IGRyb3AgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KLQkgICAgICB3aGlsZSAoc3JjIDwgaW4tPmxlbgotCQkgICAgICYmIGluLT5wdHJbc3JjXSAhPSAnXG4nKQotCQlzcmMrKzsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW4tPnB0cltzcmNdID09ICcoJykKLQkgICAgewotCSAgICAgIC8qIFN1YiBpbiB0aWxsIHRoZSBuZXh0ICcpJyBsaXRlcmFsbHkgKi8KLQkgICAgICBzcmMrKzsKLQkgICAgICB3aGlsZSAoc3JjIDwgaW4tPmxlbiAmJiBpbi0+cHRyW3NyY10gIT0gJyknKQotCQl7Ci0JCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltzcmMrK10pOwotCQl9Ci0JICAgICAgaWYgKGluLT5wdHJbc3JjXSA9PSAnKScpCi0JCXNyYysrOwotCSAgICAgIGVsc2UKLQkJcmV0dXJuIF8oIm1pc3NwbGFjZWQgKSIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJ0AnKQotCSAgICB7Ci0JICAgICAgLyogU3ViIGluIHRoZSBtYWNybyBpbnZvY2F0aW9uIG51bWJlciAqLwotCi0JICAgICAgY2hhciBidWZmZXJbMTBdOwotCSAgICAgIHNyYysrOwotCSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiUwNWQiLCBtYWNyb19udW1iZXIpOwotCSAgICAgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW4tPnB0cltzcmNdID09ICcmJykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBwcmVwcm9jZXNzb3IgdmFyaWFibGUgbmFtZSwgd2UgZG9uJ3QgZG8gdGhlbQotCQkgaGVyZSAqLwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICdcXCcpOwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICcmJyk7Ci0JICAgICAgc3JjKys7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG1hY3JvX21yaQotCQkgICAmJiBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltzcmNdKSkKLQkgICAgewotCSAgICAgIGludCBpbmQ7Ci0JICAgICAgZm9ybWFsX2VudHJ5ICpmOwotCi0JICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW3NyY10pKQotCQlpbmQgPSBpbi0+cHRyW3NyY10gLSAnMCc7Ci0JICAgICAgZWxzZSBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbc3JjXSkpCi0JCWluZCA9IGluLT5wdHJbc3JjXSAtICdBJyArIDEwOwotCSAgICAgIGVsc2UKLQkJaW5kID0gaW4tPnB0cltzcmNdIC0gJ2EnICsgMTA7Ci0JICAgICAgKytzcmM7Ci0JICAgICAgZm9yIChmID0gZm9ybWFsczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQkJewotCQkgIGlmIChmLT5pbmRleCA9PSBpbmQgLSAxKQotCQkgICAgewotCQkgICAgICBpZiAoZi0+YWN0dWFsLmxlbiAhPSAwKQotCQkJc2JfYWRkX3NiIChvdXQsICZmLT5hY3R1YWwpOwotCQkgICAgICBlbHNlCi0JCQlzYl9hZGRfc2IgKG91dCwgJmYtPmRlZik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNiX3Jlc2V0ICgmdCk7Ci0JICAgICAgc3JjID0gc3ViX2FjdHVhbCAoc3JjLCBpbiwgJnQsIGZvcm1hbF9oYXNoLCAnXCcnLCBvdXQsIDApOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKG1hY3JvX2FsdGVybmF0ZSB8fCBtYWNyb19tcmkpCi0JICAgICAgICYmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltzcmNdKQotCQkgICB8fCBpbi0+cHRyW3NyY10gPT0gJ18nCi0JCSAgIHx8IGluLT5wdHJbc3JjXSA9PSAnJCcpCi0JICAgICAgICYmICghIGlucXVvdGUKLQkJICAgfHwgISBtYWNyb19zdHJpcF9hdAotCQkgICB8fCAoc3JjID4gMCAmJiBpbi0+cHRyW3NyYyAtIDFdID09ICdAJykpKQotCXsKLQkgIGlmICghIGxvY2FscwotCSAgICAgIHx8IHNyYyArIDUgPj0gaW4tPmxlbgotCSAgICAgIHx8IHN0cm5jYXNlY21wIChpbi0+cHRyICsgc3JjLCAiTE9DQUwiLCA1KSAhPSAwCi0JICAgICAgfHwgISBJU1dISVRFIChpbi0+cHRyW3NyYyArIDVdKSkKLQkgICAgewotCSAgICAgIHNiX3Jlc2V0ICgmdCk7Ci0JICAgICAgc3JjID0gc3ViX2FjdHVhbCAoc3JjLCBpbiwgJnQsIGZvcm1hbF9oYXNoLAotCQkJCShtYWNyb19zdHJpcF9hdCAmJiBpbnF1b3RlKSA/ICdAJyA6ICdcJycsCi0JCQkJb3V0LCAxKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZm9ybWFsX2VudHJ5ICpmOwotCi0JICAgICAgc3JjID0gc2Jfc2tpcF93aGl0ZSAoc3JjICsgNSwgaW4pOwotCSAgICAgIHdoaWxlIChpbi0+cHRyW3NyY10gIT0gJ1xuJyAmJiBpbi0+cHRyW3NyY10gIT0gY29tbWVudF9jaGFyKQotCQl7Ci0JCSAgc3RhdGljIGludCBsb2NjbnQ7Ci0JCSAgY2hhciBidWZbMjBdOwotCQkgIGNvbnN0IGNoYXIgKmVycjsKLQotCQkgIGYgPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7Ci0JCSAgc2JfbmV3ICgmZi0+bmFtZSk7Ci0JCSAgc2JfbmV3ICgmZi0+ZGVmKTsKLQkJICBzYl9uZXcgKCZmLT5hY3R1YWwpOwotCQkgIGYtPmluZGV4ID0gTE9DQUxfSU5ERVg7Ci0JCSAgZi0+bmV4dCA9IGxvY2xpc3Q7Ci0JCSAgbG9jbGlzdCA9IGY7Ci0KLQkJICBzcmMgPSBnZXRfdG9rZW4gKHNyYywgaW4sICZmLT5uYW1lKTsKLQkJICArK2xvY2NudDsKLQkJICBzcHJpbnRmIChidWYsICJMTCUwNHgiLCBsb2NjbnQpOwotCQkgIHNiX2FkZF9zdHJpbmcgKCZmLT5hY3R1YWwsIGJ1Zik7Ci0KLQkJICBlcnIgPSBoYXNoX2phbSAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJmYtPm5hbWUpLCBmKTsKLQkJICBpZiAoZXJyICE9IE5VTEwpCi0JCSAgICByZXR1cm4gZXJyOwotCi0JCSAgc3JjID0gc2Jfc2tpcF9jb21tYSAoc3JjLCBpbik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGNvbW1lbnRfY2hhciAhPSAnXDAnCi0JICAgICAgICYmIGluLT5wdHJbc3JjXSA9PSBjb21tZW50X2NoYXIKLQkgICAgICAgJiYgc3JjICsgMSA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltzcmMgKyAxXSA9PSBjb21tZW50X2NoYXIKLQkgICAgICAgJiYgIWlucXVvdGUpCi0JewotCSAgLyogVHdvIGNvbW1lbnQgY2hhcnMgaW4gYSByb3cgY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgdG8KLSAgICAgICAgICAgICBiZSBkcm9wcGVkLiAgKi8KLQkgIHdoaWxlIChzcmMgPCBpbi0+bGVuICYmIGluLT5wdHJbc3JjXSAhPSAnXG4nKQotCSAgICBzcmMrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJyInCi0JICAgICAgIHx8IChtYWNyb19tcmkgJiYgaW4tPnB0cltzcmNdID09ICdcJycpKQotCXsKLQkgIGlucXVvdGUgPSAhaW5xdW90ZTsKLQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbc3JjKytdKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJ0AnICYmIG1hY3JvX3N0cmlwX2F0KQotCXsKLQkgICsrc3JjOwotCSAgaWYgKHNyYyA8IGluLT5sZW4KLQkgICAgICAmJiBpbi0+cHRyW3NyY10gPT0gJ0AnKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJ0AnKTsKLQkgICAgICArK3NyYzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1hY3JvX21yaQotCSAgICAgICAmJiBpbi0+cHRyW3NyY10gPT0gJz0nCi0JICAgICAgICYmIHNyYyArIDEgPCBpbi0+bGVuCi0JICAgICAgICYmIGluLT5wdHJbc3JjICsgMV0gPT0gJz0nKQotCXsKLQkgIGZvcm1hbF9lbnRyeSAqcHRyOwotCi0JICBzYl9yZXNldCAoJnQpOwotCSAgc3JjID0gZ2V0X3Rva2VuIChzcmMgKyAyLCBpbiwgJnQpOwotCSAgcHRyID0gKGZvcm1hbF9lbnRyeSAqKSBoYXNoX2ZpbmQgKGZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZ0KSk7Ci0JICBpZiAocHRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSByZXR1cm4gYSB3YXJuaW5nIHN0cmluZyBoZXJlLAotICAgICAgICAgICAgICAgICBidXQgd2UgY2FuJ3QsIGJlY2F1c2UgdGhlID09IG1pZ2h0IGJlIGluIHRoZSBNUkkKLSAgICAgICAgICAgICAgICAgY29tbWVudCBmaWVsZCwgYW5kLCBzaW5jZSB0aGUgbmF0dXJlIG9mIHRoZSBNUkkKLSAgICAgICAgICAgICAgICAgY29tbWVudCBmaWVsZCBkZXBlbmRzIHVwb24gdGhlIGV4YWN0IGluc3RydWN0aW9uCi0gICAgICAgICAgICAgICAgIGJlaW5nIHVzZWQsIHdlIGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIGhlcmUgdG8KLSAgICAgICAgICAgICAgICAgZmlndXJlIG91dCB3aGV0aGVyIGl0IGlzIG9yIG5vdC4gIEluc3RlYWQsIHdlIGxlYXZlCi0gICAgICAgICAgICAgICAgIHRoZSA9PSBpbiBwbGFjZSwgd2hpY2ggc2hvdWxkIGNhdXNlIGEgc3ludGF4IGVycm9yIGlmCi0gICAgICAgICAgICAgICAgIGl0IGlzIG5vdCBpbiBhIGNvbW1lbnQuICAqLwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICc9Jyk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJz0nKTsKLQkgICAgICBzYl9hZGRfc2IgKG91dCwgJnQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocHRyLT5hY3R1YWwubGVuKQotCQl7Ci0JCSAgc2JfYWRkX3N0cmluZyAob3V0LCAiLTEiKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNiX2FkZF9jaGFyIChvdXQsICcwJyk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW3NyYysrXSk7Ci0JfQotICAgIH0KLQotICBzYl9raWxsICgmdCk7Ci0KLSAgd2hpbGUgKGxvY2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3JtYWxfZW50cnkgKmY7Ci0KLSAgICAgIGYgPSBsb2NsaXN0LT5uZXh0OwotICAgICAgLyogU2V0dGluZyB0aGUgdmFsdWUgdG8gTlVMTCBlZmZlY3RpdmVseSBkZWxldGVzIHRoZSBlbnRyeS4gIFdlCi0gICAgICAgICBhdm9pZCBjYWxsaW5nIGhhc2hfZGVsZXRlIGJlY2F1c2UgaXQgZG9lc24ndCByZWNsYWltIG1lbW9yeS4gICovCi0gICAgICBoYXNoX2phbSAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJmxvY2xpc3QtPm5hbWUpLCBOVUxMKTsKLSAgICAgIHNiX2tpbGwgKCZsb2NsaXN0LT5uYW1lKTsKLSAgICAgIHNiX2tpbGwgKCZsb2NsaXN0LT5kZWYpOwotICAgICAgc2Jfa2lsbCAoJmxvY2xpc3QtPmFjdHVhbCk7Ci0gICAgICBmcmVlIChsb2NsaXN0KTsKLSAgICAgIGxvY2xpc3QgPSBmOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQXNzaWduIHZhbHVlcyB0byB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBtYWNybywgYW5kIGV4cGFuZCB0aGUKLSAgIGJvZHkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1tYWNyb19leHBhbmQgKGlkeCwgaW4sIG0sIG91dCwgY29tbWVudF9jaGFyKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIG1hY3JvX2VudHJ5ICptOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgY29tbWVudF9jaGFyOwotewotICBzYiB0OwotICBmb3JtYWxfZW50cnkgKnB0cjsKLSAgZm9ybWFsX2VudHJ5ICpmOwotICBpbnQgaXNfcG9zaXRpb25hbCA9IDA7Ci0gIGludCBpc19rZXl3b3JkID0gMDsKLSAgaW50IG5hcmcgPSAwOwotICBjb25zdCBjaGFyICplcnI7Ci0KLSAgc2JfbmV3ICgmdCk7Ci0gIAotICAvKiBSZXNldCBhbnkgb2xkIHZhbHVlIHRoZSBhY3R1YWxzIG1heSBoYXZlICovCi0gIGZvciAoZiA9IG0tPmZvcm1hbHM7IGY7IGYgPSBmLT5uZXh0KQotICAgICAgc2JfcmVzZXQgKCZmLT5hY3R1YWwpOwotICBmID0gbS0+Zm9ybWFsczsKLSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBmLT5pbmRleCA8IDApCi0gICAgZiA9IGYtPm5leHQ7Ci0KLSAgaWYgKG1hY3JvX21yaSkKLSAgICB7Ci0gICAgICAvKiBUaGUgbWFjcm8gbWF5IGJlIGNhbGxlZCB3aXRoIGFuIG9wdGlvbmFsIHF1YWxpZmllciwgd2hpY2ggbWF5Ci0gICAgICAgICBiZSByZWZlcnJlZCB0byBpbiB0aGUgbWFjcm8gYm9keSBhcyBcMC4gICovCi0gICAgICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJy4nKQotCXsKLQkgIGZvcm1hbF9lbnRyeSAqbjsKLQotCSAgbiA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKLQkgIHNiX25ldyAoJm4tPm5hbWUpOwotCSAgc2JfbmV3ICgmbi0+ZGVmKTsKLQkgIHNiX25ldyAoJm4tPmFjdHVhbCk7Ci0JICBuLT5pbmRleCA9IFFVQUxfSU5ERVg7Ci0KLQkgIG4tPm5leHQgPSBtLT5mb3JtYWxzOwotCSAgbS0+Zm9ybWFscyA9IG47Ci0KLQkgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHggKyAxLCBpbiwgJm4tPmFjdHVhbCwgMSwgMCk7Ci0JfQotICAgIH0KLQotICAvKiBQZWVsIG9mZiB0aGUgYWN0dWFscyBhbmQgc3RvcmUgdGhlbSBhd2F5IGluIHRoZSBoYXNoIHRhYmxlcycgYWN0dWFscyAqLwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdICE9IGNvbW1lbnRfY2hhcikKLSAgICB7Ci0gICAgICBpbnQgc2NhbjsKLQotICAgICAgLyogTG9vayBhbmQgc2VlIGlmIGl0J3MgYSBwb3NpdGlvbmFsIG9yIGtleXdvcmQgYXJnICovCi0gICAgICBzY2FuID0gaWR4OwotICAgICAgd2hpbGUgKHNjYW4gPCBpbi0+bGVuCi0JICAgICAmJiAhSVNTRVAgKGluLT5wdHJbc2Nhbl0pCi0JICAgICAmJiAhKG1hY3JvX21yaSAmJiBpbi0+cHRyW3NjYW5dID09ICdcJycpCi0JICAgICAmJiAoIW1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW3NjYW5dICE9ICc9JykpCi0Jc2NhbisrOwotICAgICAgaWYgKHNjYW4gPCBpbi0+bGVuICYmICFtYWNyb19hbHRlcm5hdGUgJiYgaW4tPnB0cltzY2FuXSA9PSAnPScpCi0JewotCSAgaXNfa2V5d29yZCA9IDE7Ci0KLQkgIC8qIEl0J3MgT0sgdG8gZ28gZnJvbSBwb3NpdGlvbmFsIHRvIGtleXdvcmQuICAqLwotCi0JICAvKiBUaGlzIGlzIGEga2V5d29yZCBhcmcsIGZldGNoIHRoZSBmb3JtYWwgbmFtZSBhbmQKLQkgICAgIHRoZW4gdGhlIGFjdHVhbCBzdHVmZiAqLwotCSAgc2JfcmVzZXQgKCZ0KTsKLQkgIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgJnQpOwotCSAgaWYgKGluLT5wdHJbaWR4XSAhPSAnPScpCi0JICAgIHJldHVybiBfKCJjb25mdXNpb24gaW4gZm9ybWFsIHBhcmFtZXRlcnMiKTsKLQotCSAgLyogTG9va3VwIHRoZSBmb3JtYWwgaW4gdGhlIG1hY3JvJ3MgbGlzdCAqLwotCSAgcHRyID0gKGZvcm1hbF9lbnRyeSAqKSBoYXNoX2ZpbmQgKG0tPmZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZ0KSk7Ci0JICBpZiAoIXB0cikKLQkgICAgcmV0dXJuIF8oIm1hY3JvIGZvcm1hbCBhcmd1bWVudCBkb2VzIG5vdCBleGlzdCIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSW5zZXJ0IHRoaXMgdmFsdWUgaW50byB0aGUgcmlnaHQgcGxhY2UgKi8KLQkgICAgICBzYl9yZXNldCAoJnB0ci0+YWN0dWFsKTsKLQkgICAgICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4ICsgMSwgaW4sICZwdHItPmFjdHVhbCwgMCwgMCk7Ci0JICAgICAgaWYgKHB0ci0+YWN0dWFsLmxlbiA+IDApCi0JCSsrbmFyZzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcG9zaXRpb25hbCBhcmcgKi8KLQkgIGlzX3Bvc2l0aW9uYWwgPSAxOwotCSAgaWYgKGlzX2tleXdvcmQpCi0JICAgIHJldHVybiBfKCJjYW4ndCBtaXggcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMiKTsKLQotCSAgaWYgKCFmKQotCSAgICB7Ci0JICAgICAgZm9ybWFsX2VudHJ5ICoqcGY7Ci0JICAgICAgaW50IGM7Ci0KLQkgICAgICBpZiAoIW1hY3JvX21yaSkKLQkJcmV0dXJuIF8oInRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIik7Ci0KLQkgICAgICBmID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOwotCSAgICAgIHNiX25ldyAoJmYtPm5hbWUpOwotCSAgICAgIHNiX25ldyAoJmYtPmRlZik7Ci0JICAgICAgc2JfbmV3ICgmZi0+YWN0dWFsKTsKLQkgICAgICBmLT5uZXh0ID0gTlVMTDsKLQotCSAgICAgIGMgPSAtMTsKLQkgICAgICBmb3IgKHBmID0gJm0tPmZvcm1hbHM7ICpwZiAhPSBOVUxMOyBwZiA9ICYoKnBmKS0+bmV4dCkKLQkJaWYgKCgqcGYpLT5pbmRleCA+PSBjKQotCQkgIGMgPSAoKnBmKS0+aW5kZXggKyAxOwotCSAgICAgIGlmIChjID09IC0xKQotCQljID0gMDsKLQkgICAgICAqcGYgPSBmOwotCSAgICAgIGYtPmluZGV4ID0gYzsKLQkgICAgfQotCi0JICBzYl9yZXNldCAoJmYtPmFjdHVhbCk7Ci0JICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgJmYtPmFjdHVhbCwgMSwgMCk7Ci0JICBpZiAoZi0+YWN0dWFsLmxlbiA+IDApCi0JICAgICsrbmFyZzsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBmID0gZi0+bmV4dDsKLQkgICAgfQotCSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBmLT5pbmRleCA8IDApOwotCX0KLQotICAgICAgaWYgKCEgbWFjcm9fbXJpKQotCWlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJywnKQotCSAgICArK2lkeDsKLQkgIGlmIChJU1dISVRFIChpbi0+cHRyW2lkeF0pKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChtYWNyb19tcmkpCi0gICAgewotICAgICAgY2hhciBidWZmZXJbMjBdOwotCi0gICAgICBzYl9yZXNldCAoJnQpOwotICAgICAgc2JfYWRkX3N0cmluZyAoJnQsIG1hY3JvX3N0cmlwX2F0ID8gIiROQVJHIiA6ICJOQVJHIik7Ci0gICAgICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAobS0+Zm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJnQpKTsKLSAgICAgIHNiX3Jlc2V0ICgmcHRyLT5hY3R1YWwpOwotICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBuYXJnKTsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZwdHItPmFjdHVhbCwgYnVmZmVyKTsKLSAgICB9Ci0KLSAgZXJyID0gbWFjcm9fZXhwYW5kX2JvZHkgKCZtLT5zdWIsIG91dCwgbS0+Zm9ybWFscywgbS0+Zm9ybWFsX2hhc2gsCi0JCQkgICBjb21tZW50X2NoYXIsIDEpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgcmV0dXJuIGVycjsKLQotICAvKiBEaXNjYXJkIGFueSB1bm5hbWVkIGZvcm1hbCBhcmd1bWVudHMuICAqLwotICBpZiAobWFjcm9fbXJpKQotICAgIHsKLSAgICAgIGZvcm1hbF9lbnRyeSAqKnBmOwotCi0gICAgICBwZiA9ICZtLT5mb3JtYWxzOwotICAgICAgd2hpbGUgKCpwZiAhPSBOVUxMKQotCXsKLQkgIGlmICgoKnBmKS0+bmFtZS5sZW4gIT0gMCkKLQkgICAgcGYgPSAmKCpwZiktPm5leHQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzYl9raWxsICgmKCpwZiktPm5hbWUpOwotCSAgICAgIHNiX2tpbGwgKCYoKnBmKS0+ZGVmKTsKLQkgICAgICBzYl9raWxsICgmKCpwZiktPmFjdHVhbCk7Ci0JICAgICAgZiA9ICgqcGYpLT5uZXh0OwotCSAgICAgIGZyZWUgKCpwZik7Ci0JICAgICAgKnBmID0gZjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc2Jfa2lsbCAoJnQpOwotICBtYWNyb19udW1iZXIrKzsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQ2hlY2sgZm9yIGEgbWFjcm8uICBJZiBvbmUgaXMgZm91bmQsIHB1dCB0aGUgZXhwYW5zaW9uIGludG8KLSAgICpFWFBBTkQuICBDT01NRU5UX0NIQVIgaXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLS10aGlzIGlzIHVzZWQgYnkKLSAgIGdhc3AuICBSZXR1cm4gMSBpZiBhIG1hY3JvIGlzIGZvdW5kLCAwIG90aGVyd2lzZS4gICovCi0KLWludAotY2hlY2tfbWFjcm8gKGxpbmUsIGV4cGFuZCwgY29tbWVudF9jaGFyLCBlcnJvciwgaW5mbykKLSAgICAgY29uc3QgY2hhciAqbGluZTsKLSAgICAgc2IgKmV4cGFuZDsKLSAgICAgaW50IGNvbW1lbnRfY2hhcjsKLSAgICAgY29uc3QgY2hhciAqKmVycm9yOwotICAgICBtYWNyb19lbnRyeSAqKmluZm87Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNoYXIgKmNvcHksICpjczsKLSAgbWFjcm9fZW50cnkgKm1hY3JvOwotICBzYiBsaW5lX3NiOwotCi0gIGlmICghIGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSAqbGluZSkKLSAgICAgICYmICpsaW5lICE9ICdfJwotICAgICAgJiYgKmxpbmUgIT0gJyQnCi0gICAgICAmJiAoISBtYWNyb19tcmkgfHwgKmxpbmUgIT0gJy4nKSkKLSAgICByZXR1cm4gMDsKLQotICBzID0gbGluZSArIDE7Ci0gIHdoaWxlIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnMpCi0JIHx8ICpzID09ICdfJwotCSB8fCAqcyA9PSAnJCcpCi0gICAgKytzOwotCi0gIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHMgLSBsaW5lICsgMSk7Ci0gIG1lbWNweSAoY29weSwgbGluZSwgcyAtIGxpbmUpOwotICBjb3B5W3MgLSBsaW5lXSA9ICdcMCc7Ci0gIGZvciAoY3MgPSBjb3B5OyAqY3MgIT0gJ1wwJzsgY3MrKykKLSAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpjcykpCi0gICAgICAqY3MgPSB0b2xvd2VyICgqY3MpOwotCi0gIG1hY3JvID0gKG1hY3JvX2VudHJ5ICopIGhhc2hfZmluZCAobWFjcm9faGFzaCwgY29weSk7Ci0KLSAgaWYgKG1hY3JvID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV3JhcCB0aGUgbGluZSB1cCBpbiBhbiBzYi4gICovCi0gIHNiX25ldyAoJmxpbmVfc2IpOwotICB3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAnXG4nICYmICpzICE9ICdccicpCi0gICAgc2JfYWRkX2NoYXIgKCZsaW5lX3NiLCAqcysrKTsKLQotICBzYl9uZXcgKGV4cGFuZCk7Ci0gICplcnJvciA9IG1hY3JvX2V4cGFuZCAoMCwgJmxpbmVfc2IsIG1hY3JvLCBleHBhbmQsIGNvbW1lbnRfY2hhcik7Ci0KLSAgc2Jfa2lsbCAoJmxpbmVfc2IpOwotCi0gIC8qIGV4cG9ydCB0aGUgbWFjcm8gaW5mb3JtYXRpb24gaWYgcmVxdWVzdGVkICovCi0gIGlmIChpbmZvKQotICAgICppbmZvID0gbWFjcm87Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlbGV0ZSBhIG1hY3JvLiAgKi8KLQotdm9pZAotZGVsZXRlX21hY3JvIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBoYXNoX2RlbGV0ZSAobWFjcm9faGFzaCwgbmFtZSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIElSUCBhbmQgSVJQQyBwc2V1ZG8tb3BzLiAgVGhlc2UgYXJlIGhhbmRsZWQgYXMgYQotICAgY29tYmluZWQgbWFjcm8gZGVmaW5pdGlvbiBhbmQgZXhlY3V0aW9uLiAgVGhpcyByZXR1cm5zIE5VTEwgb24KLSAgIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLiAgKi8KLQotY29uc3QgY2hhciAqCi1leHBhbmRfaXJwIChpcnBjLCBpZHgsIGluLCBvdXQsIGdldF9saW5lLCBjb21tZW50X2NoYXIpCi0gICAgIGludCBpcnBjOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCAoKmdldF9saW5lKSBQQVJBTVMgKChzYiAqKSk7Ci0gICAgIGludCBjb21tZW50X2NoYXI7Ci17Ci0gIGNvbnN0IGNoYXIgKm1uOwotICBzYiBzdWI7Ci0gIGZvcm1hbF9lbnRyeSBmOwotICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoOwotICBjb25zdCBjaGFyICplcnI7Ci0KLSAgaWYgKGlycGMpCi0gICAgbW4gPSAiSVJQQyI7Ci0gIGVsc2UKLSAgICBtbiA9ICJJUlAiOwotCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIHNiX25ldyAoJnN1Yik7Ci0gIGlmICghIGJ1ZmZlcl9hbmRfbmVzdCAobW4sICJFTkRSIiwgJnN1YiwgZ2V0X2xpbmUpKQotICAgIHJldHVybiBfKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGlycCBvciBpcnBjIik7Ci0gIAotICBzYl9uZXcgKCZmLm5hbWUpOwotICBzYl9uZXcgKCZmLmRlZik7Ci0gIHNiX25ldyAoJmYuYWN0dWFsKTsKLQotICBpZHggPSBnZXRfdG9rZW4gKGlkeCwgaW4sICZmLm5hbWUpOwotICBpZiAoZi5uYW1lLmxlbiA9PSAwKQotICAgIHJldHVybiBfKCJtaXNzaW5nIG1vZGVsIHBhcmFtZXRlciIpOwotCi0gIGggPSBoYXNoX25ldyAoKTsKLSAgZXJyID0gaGFzaF9qYW0gKGgsIHNiX3Rlcm1pbmF0ZSAoJmYubmFtZSksICZmKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIHJldHVybiBlcnI7Ci0KLSAgZi5pbmRleCA9IDE7Ci0gIGYubmV4dCA9IE5VTEw7Ci0KLSAgc2JfcmVzZXQgKG91dCk7Ci0KLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlmIChpZHggPj0gaW4tPmxlbiB8fCBpbi0+cHRyW2lkeF0gPT0gY29tbWVudF9jaGFyKQotICAgIHsKLSAgICAgIC8qIEV4cGFuZCBvbmNlIHdpdGggYSBudWxsIHN0cmluZy4gICovCi0gICAgICBlcnIgPSBtYWNyb19leHBhbmRfYm9keSAoJnN1Yiwgb3V0LCAmZiwgaCwgY29tbWVudF9jaGFyLCAwKTsKLSAgICAgIGlmIChlcnIgIT0gTlVMTCkKLQlyZXR1cm4gZXJyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpcnBjICYmIGluLT5wdHJbaWR4XSA9PSAnIicpCi0JKytpZHg7Ci0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gIT0gY29tbWVudF9jaGFyKQotCXsKLQkgIGlmICghaXJwYykKLQkgICAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sICZmLmFjdHVhbCwgMSwgMCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICciJykKLQkJewotCQkgIGludCBueHQ7Ci0KLQkJICBueHQgPSBzYl9za2lwX3doaXRlIChpZHggKyAxLCBpbik7Ci0JCSAgaWYgKG54dCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbbnh0XSA9PSBjb21tZW50X2NoYXIpCi0JCSAgICB7Ci0JCSAgICAgIGlkeCA9IG54dDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBzYl9yZXNldCAoJmYuYWN0dWFsKTsKLQkgICAgICBzYl9hZGRfY2hhciAoJmYuYWN0dWFsLCBpbi0+cHRyW2lkeF0pOwotCSAgICAgICsraWR4OwotCSAgICB9Ci0JICBlcnIgPSBtYWNyb19leHBhbmRfYm9keSAoJnN1Yiwgb3V0LCAmZiwgaCwgY29tbWVudF9jaGFyLCAwKTsKLQkgIGlmIChlcnIgIT0gTlVMTCkKLQkgICAgcmV0dXJuIGVycjsKLQkgIGlmICghaXJwYykKLQkgICAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0JICBlbHNlCi0JICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCX0KLSAgICB9Ci0KLSAgaGFzaF9kaWUgKGgpOwotICBzYl9raWxsICgmc3ViKTsKLQotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9tYWNyby5oIGIvZ2FzL21hY3JvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNjFhY2QuLjAwMDAwMDAKLS0tIGEvZ2FzL21hY3JvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiBtYWNyby5oIC0gaGVhZGVyIGZpbGUgZm9yIG1hY3JvIHN1cHBvcnQgZm9yIGdhcyBhbmQgZ2FzcAotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZuZGVmIE1BQ1JPX0gKLQotI2RlZmluZSBNQUNST19ICi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgInNiLmgiCi0KLS8qIFN0cnVjdHVyZXMgdXNlZCB0byBzdG9yZSBtYWNyb3MuIAotCi0gICBFYWNoIG1hY3JvIGtub3dzIGl0cyBuYW1lIGFuZCBpbmNsdWRlZCB0ZXh0LiAgSXQgZ2V0cyBidWlsdCB3aXRoIGEKLSAgIGxpc3Qgb2YgZm9ybWFsIGFyZ3VtZW50cywgYW5kIGFsc28ga2VlcHMgYSBoYXNoIHRhYmxlIHdoaWNoIHBvaW50cwotICAgaW50byB0aGUgbGlzdCB0byBzcGVlZCB1cCBmb3JtYWwgc2VhcmNoLiAgRWFjaCBmb3JtYWwga25vd3MgaXRzCi0gICBuYW1lIGFuZCBpdHMgZGVmYXVsdCB2YWx1ZS4gIEVhY2ggdGltZSB0aGUgbWFjcm8gaXMgZXhwYW5kZWQsIHRoZQotICAgZm9ybWFscyBnZXQgdGhlIGFjdHVhbCB2YWx1ZXMgYXR0YXRjaGVkIHRvIHRoZW0uICovCi0KLS8qIGRlc2NyaWJlIHRoZSBmb3JtYWwgYXJndW1lbnRzIHRvIGEgbWFjcm8gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZm9ybWFsX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IGZvcm1hbF9zdHJ1Y3QgKm5leHQ7CS8qIG5leHQgZm9ybWFsIGluIGxpc3QgKi8KLSAgICBzYiBuYW1lOwkJCS8qIG5hbWUgb2YgdGhlIGZvcm1hbCAqLwotICAgIHNiIGRlZjsJCQkvKiB0aGUgZGVmYXVsdCB2YWx1ZSAqLwotICAgIHNiIGFjdHVhbDsJCQkvKiB0aGUgYWN0dWFsIGFyZ3VtZW50IChjaGFuZ2VkIG9uIGVhY2ggZXhwYW5zaW9uKSAqLwotICAgIGludCBpbmRleDsJCQkvKiB0aGUgaW5kZXggb2YgdGhlIGZvcm1hbCAwLi5mb3JtYWxfY291bnQtMSAqLwotICB9Ci1mb3JtYWxfZW50cnk7Ci0KLS8qIE90aGVyIHZhbHVlcyBmb3VuZCBpbiB0aGUgaW5kZXggZmllbGQgb2YgYSBmb3JtYWxfZW50cnkuICAqLwotI2RlZmluZSBRVUFMX0lOREVYICgtMSkKLSNkZWZpbmUgTkFSR19JTkRFWCAoLTIpCi0jZGVmaW5lIExPQ0FMX0lOREVYICgtMykKLQotLyogZGVzY3JpYmUgdGhlIG1hY3JvLiAqLwotCi10eXBlZGVmIHN0cnVjdCBtYWNyb19zdHJ1Y3QKLSAgewotICAgIHNiIHN1YjsJCQkvKiBzdWJzdGl0dXRpb24gdGV4dC4gKi8KLSAgICBpbnQgZm9ybWFsX2NvdW50OwkJLyogbnVtYmVyIG9mIGZvcm1hbCBhcmdzLiAqLwotICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsczsJLyogcG9pbnRlciB0byBsaXN0IG9mIGZvcm1hbF9zdHJ1Y3RzICovCi0gICAgc3RydWN0IGhhc2hfY29udHJvbCAqZm9ybWFsX2hhc2g7IC8qIGhhc2ggdGFibGUgb2YgZm9ybWFscy4gKi8KLSAgfQotbWFjcm9fZW50cnk7Ci0KLS8qIFdoZXRoZXIgYW55IG1hY3JvcyBoYXZlIGJlZW4gZGVmaW5lZC4gICovCi0KLWV4dGVybiBpbnQgbWFjcm9fZGVmaW5lZDsKLQotLyogVGhlIG1hY3JvIG5lc3RpbmcgbGV2ZWwuICAqLwotCi1leHRlcm4gaW50IG1hY3JvX25lc3Q7Ci0KLWV4dGVybiBpbnQgYnVmZmVyX2FuZF9uZXN0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBzYiAqLCBpbnQgKCopIFBBUkFNUyAoKHNiICopKSkpOwotZXh0ZXJuIHZvaWQgbWFjcm9faW5pdAotICBQQVJBTVMgKChpbnQgYWx0ZXJuYXRlLCBpbnQgbXJpLCBpbnQgc3RyaXBfYXQsCi0JICAgaW50ICgqKSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKSkpOwotZXh0ZXJuIHZvaWQgbWFjcm9fbXJpX21vZGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gY29uc3QgY2hhciAqZGVmaW5lX21hY3JvCi0gIFBBUkFNUyAoKGludCBpZHgsIHNiICppbiwgc2IgKmxhYmVsLCBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpLAotCSAgIGNvbnN0IGNoYXIgKipuYW1lcCkpOwotZXh0ZXJuIGludCBjaGVja19tYWNybyBQQVJBTVMgKChjb25zdCBjaGFyICosIHNiICosIGludCwgY29uc3QgY2hhciAqKiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvX2VudHJ5ICoqKSk7Ci1leHRlcm4gdm9pZCBkZWxldGVfbWFjcm8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqZXhwYW5kX2lycAotICBQQVJBTVMgKChpbnQsIGludCwgc2IgKiwgc2IgKiwgaW50ICgqKSBQQVJBTVMgKChzYiAqKSksIGludCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9tYWtlZmlsZS52bXMgYi9nYXMvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGMzMGQ0Li4wMDAwMDAwCi0tLSBhL2dhcy9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIwotIyBtYWtlZmlsZSBmb3IgZ2FzCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHByb2dpcy5kZQotIwotQ0M9Z2NjCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotaWZlcSAoJChDQyksZ2NjKQotREVGUz0KLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uYmZkXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy1dKSQoREVGUykKLUxGTEFHUz0KLUxJQlM9LEdOVV9DQ19MSUJSQVJZOmxpYmdjYy9saWIsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYixHTlVfQ0NfTElCUkFSWTpjcnQwLm9iagotZWxzZQotREVGUz0vZGVmaW5lPSgidGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbiI9InRhYnNpel9mbG9udW1fcG93ZXJzX29mX3RlbiIsXAotIl9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3ciPSJfYmZkX2dlbmVyaWNfZ2V0X3dpbl9zZWN0aW9uX2NvbnQiLFwKLSJfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiI9Il9iZmRfZWxmX3NlY19mcm9tX2JmZF9zZWMiLCJjb25zdD0iKQotQ0ZMQUdTPS9ub29wdC9ub2RlYnVnL2luY2x1ZGU9KFtdLFstLmJmZF0sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLHB0cm1pc21hdGNoLHVuZGVmZXNjYXAsbG9uZ2V4dGVybixkdXB0eXBlc3BlYykKLUxGTEFHUz0KLUxJQlM9LHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIKLWVuZGlmCi0KLWVsc2UJIyBBUkNIIG5vdCBBTFBIQQotCi1pZmVxICgkKENDKSxnY2MpCi1ERUZTPQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy1dKSQoREVGUykKLUxGTEFHUz0KLUxJQlM9LEdOVV9DQ19MSUJSQVJZOmxpYmdjYy9saWIsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYixHTlVfQ0NfTElCUkFSWTpjcnRiZWdpbi5vYmosR05VX0NDX0xJQlJBUlk6Y3J0ZW5kLm9iagotI0xJQlM9LGdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIKLWVsc2UKLWVycm9yIERFQ0MgaXMgYnJva2VuIG9uIFZBWAotREVGUz0vZGVmaW5lPSgidGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbiI9InRhYnNpel9mbG9udW1fcG93ZXJzX29mX3RlbiIsImNvbnN0PSIpCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLV0pJChERUZTKVwKLS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxwdHJtaXNtYXRjaCx1bmRlZmVzY2FwLGxvbmdleHRlcm4sZHVwdHlwZXNwZWMpCi1MRkxBR1M9Ci1MSUJTPSxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi1lbmRpZgotZW5kaWYKLQotCi1PQkpTPXRhcmctY3B1Lm9iaixvYmotZm9ybWF0Lm9iaixhdG9mLXRhcmcub2JqLGFwcC5vYmosYXMub2JqLGF0b2YtZ2VuZXJpYy5vYmosXAotICBiaWdudW0tY29weS5vYmosY29uZC5vYmosZGVwZW5kLm9iaixleHByLm9iaixmbG9udW0ta29uc3Qub2JqLGZsb251bS1jb3B5Lm9iaixcCi0gIGZsb251bS1tdWx0Lm9iaixmcmFncy5vYmosaGFzaC5vYmosaW5wdXQtZmlsZS5vYmosaW5wdXQtc2NydWIub2JqLFwKLSAgbGl0ZXJhbC5vYmosbWVzc2FnZXMub2JqLG91dHB1dC1maWxlLm9iaixyZWFkLm9iaixzdWJzZWdzLm9iaixzeW1ib2xzLm9iaixcCi0gIHdyaXRlLm9iaixsaXN0aW5nLm9iaixlY29mZi5vYmosc3RhYnMub2JqLHNiLm9iaixtYWNyby5vYmosZWhvcHQub2JqCi0KLUdBU1BPQkpTID0gZ2FzcC5vYmosbWFjcm8ub2JqLHNiLm9iaixoYXNoLm9iagotCi1MSUJJQkVSVFkgPSBbLS5saWJpYmVydHldbGliaWJlcnR5Lm9sYgotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotTElCQkZEID0gWy0uYmZkXWxpYmJmZC5vbGIKLUxJQk9QQ09ERVMgPSBbLS5vcGNvZGVzXWxpYm9wY29kZXMub2xiCi1CRkRERVAgPSBbLS5iZmRdYmZkLmgKLWVsc2UKLUxJQkJGRCA9Ci1MSUJPUENPREVTID0KLUJGRERFUCA9Ci1lbmRpZgotCi1hbGw6IGNvbmZpZy5zdGF0dXMgJChCRkRERVApIGFzLmV4ZSBnYXNwLmV4ZQotCi1hcy5leGU6ICQoT0JKUykgJChMSUJPUENPREVTKSAkKExJQkJGRCkgJChMSUJJQkVSVFkpCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotCWxpbmskKExGTEFHUykvZXhlPSRAICQoT0JKUyksJChMSUJPUENPREVTKS9saWIsJChMSUJCRkQpL2xpYiwkKExJQklCRVJUWSkvbGliJChMSUJTKQotZWxzZQotCWxpbmskKExGTEFHUykvZXhlPSRAICQoT0JKUyksJChMSUJJQkVSVFkpL2xpYiQoTElCUykKLWVuZGlmCi0KLWdhc3AuZXhlOiAkKEdBU1BPQkpTKSAkKExJQkJGRCkgJChMSUJJQkVSVFkpCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotCWxpbmskKExGTEFHUykvZXhlPSRAICQoR0FTUE9CSlMpLCQoTElCQkZEKS9saWIsJChMSUJJQkVSVFkpL2xpYiQoTElCUykKLWVsc2UKLQlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKEdBU1BPQkpTKSwkKExJQklCRVJUWSkvbGliJChMSUJTKQotZW5kaWYKLQotY29uZmlnLnN0YXR1czoKLQkkJCBAY29uZmlnLWdhcwotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotQ1BVPWFscGhhCi1PQkpGT1JNQVQ9ZXZheAotRkxURk9STUFUPWllZWUKLWVsc2UKLUNQVT12YXgKLU9CSkZPUk1BVD12bXMKLUZMVEZPUk1BVD12YXgKLWVuZGlmCi0KLXRhcmctY3B1LmM6IFsuY29uZmlnXXRjLSQoQ1BVKS5jCi0JY29weSAkPCAkQAotdGFyZy1jcHUuaDogWy5jb25maWdddGMtJChDUFUpLmgKLQljb3B5ICQ8ICRACi10YXJnLWVudi5oOiBbLmNvbmZpZ110ZS1nZW5lcmljLmgKLQljb3B5ICQ8ICRACi1vYmotZm9ybWF0Lmg6IFsuY29uZmlnXW9iai0kKE9CSkZPUk1BVCkuaAotCWNvcHkgJDwgJEAKLW9iai1mb3JtYXQuYzogWy5jb25maWddb2JqLSQoT0JKRk9STUFUKS5jCi0JY29weSAkPCAkQAotYXRvZi10YXJnLmM6IFsuY29uZmlnXWF0b2YtJChGTFRGT1JNQVQpLmMKLQljb3B5ICQ8ICRACi0KLXRhcmctY3B1Lm9iajogdGFyZy1jcHUuYyB0YXJnLWNwdS5oIFsuY29uZmlnXWF0b2YtdmF4LmMKLQotWy0uYmZkXWJmZC5oOgotCSQoQ0QpIFstLmJmZF0KLQlnbWFrZSAtZiBtYWtlZmlsZS52bXMgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmdhc10KLQotaW5zdGFsbDogYXMuZXhlIGdhc3AuZXhlCi0JJChDUCkgJF4gR05VX1JPT1RcOltCSU5dCi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgKi5vYmo7Ci0JJChSTSkgKi5leGU7Ci0JJChSTSkgYXRvZi10YXJnLmM7Ci0JJChSTSkgb2JqLWZvcm1hdC5jOwotCSQoUk0pIG9iai1mb3JtYXQuaDsKLQkkKFJNKSB0YXJnLWVudi5oOwotCSQoUk0pIHRhcmctY3B1Lmg7Ci0JJChSTSkgdGFyZy1jcHUuYzsKLQkkKFJNKSBjb25maWcuc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZ2FzL21lc3NhZ2VzLmMgYi9nYXMvbWVzc2FnZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiN2FkMC4uMDAwMDAwMAotLS0gYS9nYXMvbWVzc2FnZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDU0MSArMCwwIEBACi0vKiBtZXNzYWdlcy5jIC0gZXJyb3IgcmVwb3J0ZXIgLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX0VSUk5PX0gKLSNpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfU1REQVJHCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9WQVJBUkdTCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoVVNFX1NUREFSRykgJiYgIWRlZmluZWQgKFVTRV9WQVJBUkdTKQotLyogUm9sbCBvdXIgb3duLiAgKi8KLSNkZWZpbmUgdmFfYWxpc3QgUkVTVAotI2RlZmluZSB2YV9kY2wKLXR5cGVkZWYgaW50ICogdmFfbGlzdDsKLSNkZWZpbmUgdmFfc3RhcnQoQVJHUykJQVJHUyA9ICZSRVNUCi0jZGVmaW5lIHZhX2VuZChBUkdTKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGlkZW50aWZ5IFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgYXNfc2hvd193aGVyZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBhc193YXJuX2ludGVybmFsIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGFzX2JhZF9pbnRlcm5hbCBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgY2hhciAqKSk7Ci0KLS8qCi0gKiBEZXNwaXRlIHRoZSByZXN0IG9mIHRoZSBjb21tZW50cyBpbiB0aGlzIGZpbGUsIChGSVhNRS1TT09OKSwKLSAqIGhlcmUgaXMgdGhlIGN1cnJlbnQgc2NoZW1lIGZvciBlcnJvciBtZXNzYWdlcyBldGM6Ci0gKgotICogYXNfZmF0YWwoKSBpcyB1c2VkIHdoZW4gZ2FzIGlzIHF1aXRlIGNvbmZ1c2VkIGFuZAotICogY29udGludWluZyB0aGUgYXNzZW1ibHkgaXMgcG9pbnRsZXNzLiAgSW4gdGhpcyBjYXNlIHdlCi0gKiBleGl0IGltbWVkaWF0ZWx5IHdpdGggZXJyb3Igc3RhdHVzLgotICoKLSAqIGFzX2JhZCgpIGlzIHVzZWQgdG8gbWFyayBlcnJvcnMgdGhhdCByZXN1bHQgaW4gd2hhdCB3ZQotICogcHJlc3VtZSB0byBiZSBhIHVzZWxlc3Mgb2JqZWN0IGZpbGUuICBTYXksIHdlIGlnbm9yZWQKLSAqIHNvbWV0aGluZyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiB2aXRhbC4gIElmIHdlIHNlZSBhbnkgb2YKLSAqIHRoZXNlLCBhc3NlbWJseSB3aWxsIGNvbnRpbnVlIHRvIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSwKLSAqIG5vIG9iamVjdCBmaWxlIHdpbGwgYmUgcHJvZHVjZWQsIGFuZCB3ZSB3aWxsIHRlcm1pbmF0ZQotICogd2l0aCBlcnJvciBzdGF0dXMuICBUaGUgbmV3IG9wdGlvbiwgLVosIHRlbGxzIHVzIHRvCi0gKiBwcm9kdWNlIGFuIG9iamVjdCBmaWxlIGFueXdheSBidXQgd2Ugc3RpbGwgZXhpdCB3aXRoCi0gKiBlcnJvciBzdGF0dXMuICBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgeW91IGRvbid0IHdhbnQKLSAqIHRoaXMgb2JqZWN0IGZpbGUgYnV0IHdlIGNvdWxkIGJlIHdyb25nLgotICoKLSAqIGFzX3dhcm4oKSBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBhbiBlcnJvciBmcm9tIHdoaWNoIHdlCi0gKiBoYXZlIGEgcGxhdXNpYmxlIGVycm9yIHJlY292ZXJ5LiAgZWcsIG1hc2tpbmcgdGhlIHRvcAotICogYml0cyBvZiBhIGNvbnN0YW50IHRoYXQgaXMgbG9uZ2VyIHRoYW4gd2lsbCBmaXQgaW4gdGhlCi0gKiBkZXN0aW5hdGlvbi4gIEluIHRoaXMgY2FzZSB3ZSB3aWxsIGNvbnRpbnVlIHRvIGFzc2VtYmxlCi0gKiB0aGUgc291cmNlLCBhbHRob3VnaCB3ZSBtYXkgaGF2ZSBtYWRlIGEgYmFkIGFzc3VtcHRpb24sCi0gKiBhbmQgd2Ugd2lsbCBwcm9kdWNlIGFuIG9iamVjdCBmaWxlIGFuZCByZXR1cm4gbm9ybWFsIGV4aXQKLSAqIHN0YXR1cyAoaWUsIG5vIGVycm9yKS4gIFRoZSBuZXcgb3B0aW9uIC1YIHRlbGxzIHVzIHRvCi0gKiB0cmVhdCBhbGwgYXNfd2FybigpIGVycm9ycyBhcyBhc19iYWQoKSBlcnJvcnMuICBUaGF0IGlzLAotICogbm8gb2JqZWN0IGZpbGUgd2lsbCBiZSBwcm9kdWNlZCBhbmQgd2Ugd2lsbCBleGl0IHdpdGgKLSAqIGVycm9yIHN0YXR1cy4gIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCB3ZSBkb24ndCBraWxsIGFuCi0gKiBlbnRpcmUgbWFrZSBiZWNhdXNlIG9mIGFuIGVycm9yIHRoYXQgd2Uga25ldyBob3cgdG8KLSAqIGNvcnJlY3QuICBPbiB0aGUgb3RoZXIgaGFuZCwgc29tZXRpbWVzIHlvdSBtaWdodCB3YW50IHRvCi0gKiBzdG9wIHRoZSBtYWtlIGF0IHRoZXNlIHBvaW50cy4KLSAqCi0gKiBhc190c2t0c2soKSBpcyB1c2VkIHdoZW4gd2Ugc2VlIGEgbWlub3IgZXJyb3IgZm9yIHdoaWNoCi0gKiBvdXIgZXJyb3IgcmVjb3ZlcnkgYWN0aW9uIGlzIGFsbW9zdCBjZXJ0YWlubHkgY29ycmVjdC4KLSAqIEluIHRoaXMgY2FzZSwgd2UgcHJpbnQgYSBtZXNzYWdlIGFuZCB0aGVuIGFzc2VtYmx5Ci0gKiBjb250aW51ZXMgYXMgdGhvdWdoIG5vIGVycm9yIG9jY3VycmVkLgotICovCi0KLXN0YXRpYyB2b2lkCi1pZGVudGlmeSAoZmlsZSkKLSAgICAgY2hhciAqZmlsZTsKLXsKLSAgc3RhdGljIGludCBpZGVudGlmaWVkOwotICBpZiAoaWRlbnRpZmllZCkKLSAgICByZXR1cm47Ci0gIGlkZW50aWZpZWQrKzsKLQotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHg7Ci0gICAgICBhc193aGVyZSAoJmZpbGUsICZ4KTsKLSAgICB9Ci0KLSAgaWYgKGZpbGUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIGZpbGUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkFzc2VtYmxlciBtZXNzYWdlczpcbiIpKTsKLX0KLQotc3RhdGljIGludCB3YXJuaW5nX2NvdW50OwkvKiBDb3VudCBvZiBudW1iZXIgb2Ygd2FybmluZ3MgaXNzdWVkICovCi0KLWludCAKLWhhZF93YXJuaW5ncyAoKQotewotICByZXR1cm4gKHdhcm5pbmdfY291bnQpOwotfQotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIGhpdCBhICdiYWQgZXJyb3InLCBhbmQgc2hvdWxkIG5vdCB3cml0ZSBhbiBvYmogZmlsZSwKLSAgIGFuZCBleGl0IHdpdGggYSBub256ZXJvIGVycm9yIGNvZGUgKi8KLQotc3RhdGljIGludCBlcnJvcl9jb3VudDsKLQotaW50IAotaGFkX2Vycm9ycyAoKQotewotICByZXR1cm4gKGVycm9yX2NvdW50KTsKLX0KLQotCi0vKiBQcmludCB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBzdGRlcnIuICAqLwotCi1zdGF0aWMgdm9pZAotYXNfc2hvd193aGVyZSAoKQotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLQotICBhc193aGVyZSAoJmZpbGUsICZsaW5lKTsKLSAgaWRlbnRpZnkgKGZpbGUpOwotICBpZiAoZmlsZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczoldTogIiwgZmlsZSwgbGluZSk7Ci19Ci0KLS8qCi0gKgkJCWEgcyBfIHAgZSByIHIgbyByCi0gKgotICogTGlrZSBwZXJyb3IoMyksIGJ1dCB3aXRoIG1vcmUgaW5mby4KLSAqLwotCi12b2lkIAotYXNfcGVycm9yIChncmlwZSwgZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmdyaXBlOwkJLyogVW5wdW5jdHVhdGVkIGVycm9yIHRoZW1lLiAqLwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqZXJydHh0OwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgZ3JpcGUsIGZpbGVuYW1lKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGVycnR4dCA9IGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpOwotI2Vsc2UKLSAgZXJydHh0ID0geHN0cmVycm9yIChlcnJubyk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RkZXJyLCAiOiAlc1xuIiwgZXJydHh0KTsKLSAgZXJybm8gPSAwOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLSNlbmRpZgotfQotCi0vKgotICoJCQlhIHMgXyB0IHMgayB0IHMgayAoKQotICoKLSAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgd2FybmluZywgYW5kIGxvY2F0ZSB3YXJuaW5nCi0gKiBpbiBpbnB1dCBmaWxlKHMpLgotICogUGxlYXNlIG9ubHkgdXNlIHRoaXMgZm9yIHdoZW4gd2UgaGF2ZSBzb21lIHJlY292ZXJ5IGFjdGlvbi4KLSAqIFBsZWFzZSBleHBsYWluIGluIHN0cmluZyAod2hpY2ggbWF5IGhhdmUgJ1xuJ3MpIHdoYXQgcmVjb3Zlcnkgd2FzIGRvbmUuCi0gKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc190c2t0c2sgKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBhc19zaG93X3doZXJlICgpOwotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci19CQkJCS8qIGFzX3Rza3RzaygpICovCi0jZWxzZQotdm9pZCAKLWFzX3Rza3RzayAoZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci19CQkJCS8qIGFzX3Rza3RzaygpICovCi0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKiBUaGUgY29tbW9uIHBvcnRpb24gb2YgYXNfd2FybiBhbmQgYXNfd2Fybl93aGVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hc193YXJuX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBjaGFyICpidWZmZXI7Ci17Ci0gICsrd2FybmluZ19jb3VudDsKLQotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIGlkZW50aWZ5IChmaWxlKTsKLSAgaWYgKGZpbGUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXU6ICIsIGZpbGUsIGxpbmUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIldhcm5pbmc6ICIpKTsKLSAgZnB1dHMgKGJ1ZmZlciwgc3RkZXJyKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgbGlzdGluZ193YXJuaW5nIChidWZmZXIpOwotI2VuZGlmCi19Ci0KLS8qCi0gKgkJCWEgcyBfIHcgYSByIG4gKCkKLSAqCi0gKiBTZW5kIHRvIHN0ZGVyciBhIHN0cmluZyBhcyBhIHdhcm5pbmcsIGFuZCBsb2NhdGUgd2FybmluZwotICogaW4gaW5wdXQgZmlsZShzKS4KLSAqIFBsZWFzZSBvbmx5IHVzZSB0aGlzIGZvciB3aGVuIHdlIGhhdmUgc29tZSByZWNvdmVyeSBhY3Rpb24uCi0gKiBQbGVhc2UgZXhwbGFpbiBpbiBzdHJpbmcgKHdoaWNoIG1heSBoYXZlICdcbidzKSB3aGF0IHJlY292ZXJ5IHdhcyBkb25lLgotICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfd2FybiAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCi0gICAgewotICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIGFzX3dhcm5faW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Ci0gICAgfQotfQkJCQkvKiBhc193YXJuKCkgKi8KLSNlbHNlCi0vKlZBUkFSR1MxICovCi12b2lkIAotYXNfd2FybiAoZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCi0gICAgewotICAgICAgdmFfc3RhcnQgKGFyZ3MpOwotICAgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgICBhc193YXJuX2ludGVybmFsICgoY2hhciAqKSBOVUxMLCAwLCBidWZmZXIpOwotICAgIH0KLX0JCQkJLyogYXNfd2FybigpICovCi0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKiBhc193YXJuX3doZXJlLCBsaWtlIGFzX2JhZCBidXQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlCi0gICBwYXNzZWQgaW4uICBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIHRvIHJlcGVhdCB0aGUgZnVuY3Rpb24gaW4gb3JkZXIKLSAgIHRvIGhhbmRsZSB0aGUgdmFyYXJncyBjb3JyZWN0bHkgYW5kIHBvcnRhYmx5LiAgKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc193YXJuX3doZXJlIChjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCi0gICAgewotICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIGFzX3dhcm5faW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcik7Ci0gICAgfQotfQkJCQkvKiBhc193YXJuKCkgKi8KLSNlbHNlCi0vKlZBUkFSR1MxICovCi12b2lkIAotYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgaWYgKCFmbGFnX25vX3dhcm5pbmdzKQotICAgIHsKLSAgICAgIHZhX3N0YXJ0IChhcmdzKTsKLSAgICAgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgICAgYXNfd2Fybl9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKLSAgICB9Ci19CQkJCS8qIGFzX3dhcm4oKSAqLwotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyogVGhlIGNvbW1vbiBwb3J0aW9uIG9mIGFzX2JhZCBhbmQgYXNfYmFkX3doZXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzX2JhZF9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgY2hhciAqYnVmZmVyOwotewotICArK2Vycm9yX2NvdW50OwotCi0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0KLSAgaWRlbnRpZnkgKGZpbGUpOwotICBpZiAoZmlsZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczoldTogIiwgZmlsZSwgbGluZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiRXJyb3I6ICIpKTsKLSAgZnB1dHMgKGJ1ZmZlciwgc3RkZXJyKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgbGlzdGluZ19lcnJvciAoYnVmZmVyKTsKLSNlbmRpZgotfQotCi0vKgotICoJCQlhIHMgXyBiIGEgZCAoKQotICoKLSAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgd2FybmluZywgYW5kIGxvY2F0ZSB3YXJuaW5nIGluIGlucHV0IGZpbGUocykuCi0gKiBQbGVhc2UgdXMgd2hlbiB0aGVyZSBpcyBubyByZWNvdmVyeSwgYnV0IHdlIHdhbnQgdG8gY29udGludWUgcHJvY2Vzc2luZwotICogYnV0IG5vdCBwcm9kdWNlIGFuIG9iamVjdCBmaWxlLgotICogUGxlYXNlIGV4cGxhaW4gaW4gc3RyaW5nICh3aGljaCBtYXkgaGF2ZSAnXG4ncykgd2hhdCByZWNvdmVyeSB3YXMgZG9uZS4KLSAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX2JhZCAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICBhc19iYWRfaW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Ci19Ci0KLSNlbHNlCi0vKlZBUkFSR1MxICovCi12b2lkIAotYXNfYmFkIChmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICBhc19iYWRfaW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Ci19Ci0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKiBhc19iYWRfd2hlcmUsIGxpa2UgYXNfYmFkIGJ1dCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUKLSAgIHBhc3NlZCBpbi4gIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgdG8gcmVwZWF0IHRoZSBmdW5jdGlvbiBpbiBvcmRlcgotICAgdG8gaGFuZGxlIHRoZSB2YXJhcmdzIGNvcnJlY3RseSBhbmQgcG9ydGFibHkuICAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX2JhZF93aGVyZSAoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgYXNfYmFkX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpOwotfQotCi0jZWxzZQotLypWQVJBUkdTMSAqLwotdm9pZCAKLWFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGFzX2JhZF9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKLX0KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qCi0gKgkJCWEgcyBfIGYgYSB0IGEgbCAoKQotICoKLSAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgZmF0YWwgbWVzc2FnZSwgYW5kIHByaW50IGxvY2F0aW9uIG9mIGVycm9yIGluCi0gKiBpbnB1dCBmaWxlKHMpLgotICogUGxlYXNlIG9ubHkgdXNlIHRoaXMgZm9yIHdoZW4gd2UgRE9OJ1QgaGF2ZSBzb21lIHJlY292ZXJ5IGFjdGlvbi4KLSAqIEl0IHhleGl0KClzIHdpdGggYSB3YXJuaW5nIHN0YXR1cy4KLSAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX2ZhdGFsIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiRmF0YWwgZXJyb3I6ICIpKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHhleGl0IChFWElUX0ZBSUxVUkUpOwotfQkJCQkvKiBhc19mYXRhbCgpICovCi0jZWxzZQotLypWQVJBUkdTMSovCi12b2lkIAotYXNfZmF0YWwgKGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBhc19zaG93X3doZXJlICgpOwotICB2YV9zdGFydCAoYXJncyk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiRmF0YWwgZXJyb3I6ICIpKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHhleGl0IChFWElUX0ZBSUxVUkUpOwotfQkJCQkvKiBhc19mYXRhbCgpICovCi0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKgotICogYXNfYXNzZXJ0OiBJbmRpY2F0ZSBhc3NlcnRpb24gZmFpbHVyZS4KLSAqIEFyZ3VtZW50czogRmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBvcHRpb25hbCBmdW5jdGlvbiBuYW1lLgotICovCi0KLXZvaWQKLWFzX2Fzc2VydCAoZmlsZSwgbGluZSwgZm4pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGUsICpmbjsKLSAgICAgaW50IGxpbmU7Ci17Ci0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IhXG4iKSk7Ci0gIGlmIChmbikKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkFzc2VydGlvbiBmYWlsdXJlIGluICVzIGF0ICVzIGxpbmUgJWQuXG4iKSwKLQkgICAgIGZuLCBmaWxlLCBsaW5lKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJXMgbGluZSAlZC5cbiIpLCBmaWxlLCBsaW5lKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0KLQotLyogYXNfYWJvcnQ6IFByaW50IGEgZnJpZW5kbHkgbWVzc2FnZSBzYXlpbmcgaG93IHRvdGFsbHkgaG9zZWQgd2UgYXJlLAotICAgYW5kIGV4aXQgd2l0aG91dCBwcm9kdWNpbmcgYSBjb3JlIGZpbGUuICAqLwotdm9pZAotYXNfYWJvcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlLCAqZm47Ci0gICAgIGludCBsaW5lOwotewotICBhc19zaG93X3doZXJlICgpOwotICBpZiAoZm4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIiksCi0JICAgICBmaWxlLCBsaW5lLCBmbik7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkXG4iKSwKLQkgICAgIGZpbGUsIGxpbmUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIlBsZWFzZSByZXBvcnQgdGhpcyBidWcuXG4iKSk7Ci0gIHhleGl0IChFWElUX0ZBSUxVUkUpOwotfQotCi0vKiBTdXBwb3J0IHJvdXRpbmVzLiAgKi8KLQotdm9pZAotZnByaW50X3ZhbHVlIChmaWxlLCB2YWwpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIHZhbHVlVCB2YWw7Ci17Ci0gIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mIChsb25nKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJWxkIiwgKGxvbmcpIHZhbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGJmZF92bWEpKQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCB2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICBhYm9ydCAoKTsKLX0KLQotdm9pZAotc3ByaW50X3ZhbHVlIChidWYsIHZhbCkKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotewotICBpZiAoc2l6ZW9mICh2YWwpIDw9IHNpemVvZiAobG9uZykpCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkIiwgKGxvbmcpIHZhbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGJmZF92bWEpKQotICAgIHsKLSAgICAgIHNwcmludGZfdm1hIChidWYsIHZhbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gIGFib3J0ICgpOwotfQotCi0vKiBlbmQgb2YgbWVzc2FnZXMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL21wdy1jb25maWcuaW4gYi9nYXMvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyOWIxZC4uMDAwMDAwMAotLS0gYS9nYXMvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIEdBUy4KLQotU2V0IHRhcmdldF9hcmNoIGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8tLiotLiovLydgCi0KLUlmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvcG93ZXJwYy8KLQlTZXQgc2hvcnRfYXJjaF9uYW1lICJwcGMiCi0JU2V0IHRhcmdldF9jcHUgInBvd2VycGMiCi1FbHNlCi0JU2V0IHNob3J0X2FyY2hfbmFtZSAie3RhcmdldF9hcmNofSIKLUVuZCBJZgotCi0jIFRoZSBmb2xsb3dpbmcgd29ya3MgZm9yIG1hbnkgY29uZmlndXJhdGlvbnMsIHRob3VnaCBub3QgYWxsLgotCi1TZXQgb2JqX2Zvcm1hdCBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLiotLiotLy8nYAotU2V0IHRhcmdldF9vcyBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLiotLiotLy8nYAotCi1TZXQgYmZkX2dhcyBubwotCi1TZXQgVERFRklORVMgIiIKLQotU2V0IEVYVFJBX09CSkVDVFMgIiIKLQotIyBEZWZhdWx0IGVtdWxhdGlvbi4KLQotU2V0IGVtIGdlbmVyaWMKLQotSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL202OGstYXBwbGUtbWFjb3MvCi0JU2V0IG9ial9mb3JtYXQgImNvZmYiCi0JU2V0IFRERUZJTkVTICctZCBNNjhLQ09GRicKLQlTZXQgRVhUUkFfT0JKRUNUUyAnIntvfSJtNjhrLXBhcnNlLmMubycKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvcG93ZXJwYy1hcHBsZS1tYWNvcy8KLQlTZXQgb2JqX2Zvcm1hdCAiY29mZiIKLQlTZXQgYmZkX2dhcyB5ZXMKLQlTZXQgZW0gbWFjb3MKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvaTM4Ni1cT3B0aW9uLXgtZ28zMi8KLQlTZXQgb2JqX2Zvcm1hdCAiY29mZiIKLQlTZXQgVERFRklORVMgJy1kIEkzODZDT0ZGJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLVxPcHRpb24teC1jb2ZmLwotCVNldCBUREVGSU5FUyAnLWQgTTY4S0NPRkYnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL21pcHMtaWR0LWVjb2ZmLwotCVNldCBiZmRfZ2FzIHllcwotCVNldCBUREVGSU5FUyAnLWQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU49MScKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtXE9wdGlvbi14LwotCSMgQXNzdW1lIG90aGVyIE9TZXMgZXRjIHVzZSBFTEYKLQlTZXQgb2JqX2Zvcm1hdCAiZWxmIgotCVNldCBiZmRfZ2FzIHllcwotCVNldCBUREVGSU5FUyAnLWQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU49MScKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJiZmQ6ZWxmLWJmZC5oICdiZmQvZWxmLWJmZC5oJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1cT3B0aW9uLXgtaG1zLwotCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9Im9wY29kZXM6c2gtb3BjLmggJ29wY29kZXMvc2gtb3BjLmgnCi1FbmQgSWYKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6dGMte3Nob3J0X2FyY2hfbmFtZX0uYyB0YXJnLWNwdS5jCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzp0Yy17c2hvcnRfYXJjaF9uYW1lfS5oIHRhcmctY3B1LmgKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6b2JqLXtvYmpfZm9ybWF0fS5jIG9iai1mb3JtYXQuYwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6b2JqLXtvYmpfZm9ybWF0fS5oIG9iai1mb3JtYXQuaAotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzp0ZS17ZW19LmggdGFyZy1lbnYuaAotCi0jIFNwZWNpYWwgY2FzZXMgZm9yIGZsb2F0IGhhbmRsaW5nLgotCi1JZiAie3RhcmdldF9hcmNofSIgPX4gL25zMzJrLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOmF0b2YtbnMzMmsuYyBhdG9mLXRhcmcuYwotRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL3RhaG9lLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOmF0b2YtdGFob2UuYyBhdG9mLXRhcmcuYwotRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL3ZheC8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzphdG9mLXZheC5jIGF0b2YtdGFyZy5jCi1FbHNlCi0JIyBVc2UgSUVFRSBieSBkZWZhdWx0LgotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOmF0b2YtaWVlZS5jIGF0b2YtdGFyZy5jCi1FbmQgSWYKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nICAgICAJCSA+ICJ7b30ibWsudG1wCi1FY2hvICJUREVGSU5FUyA9ICIge1RERUZJTkVTfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJFWFRSQV9PQkpFQ1RTID0gIiB7RVhUUkFfT0JKRUNUU30JCT4+ICJ7b30ibWsudG1wCi0jIChXZSB1c2UgdGhlIC1uIG9wdGlvbiBoZXJlIHNvIGFzIG5vdCB0byBnZXQgZXh0cmEgc3BhY2VzIGluc2VydGVkKQotRWNobyAtbiAnVEFSR19DUFVfREVQID0ge1RBUkdfQ1BVX0RFUF8nCQk+PiAie299Im1rLnRtcAotRWNobyAtbiB7c2hvcnRfYXJjaF9uYW1lfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvIC1uICd9JwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQk+PiAie299Im1rLnRtcAotCi1FY2hvICcvKiBjb25mLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycgPiAie299ImNvbmYubmV3Ci1FY2hvIC1uICcjZGVmaW5lIFRBUkdFVF9DUFUgICAgICAgIicgICAgICAgCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gInt0YXJnZXRfY3B1fSIgICAgICAgCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAgICAnIicgICAgICAgCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gJyNkZWZpbmUgVEFSR0VUX09TICAgICAgICInICAgICAgIAk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICJ7dGFyZ2V0X29zfSIgICAgICAgCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAgICAnIicgICAgICAgCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gJyNkZWZpbmUgVEFSR0VUX0FMSUFTICAgICAgICInICAgICAgIAk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICJ7dGFyZ2V0X2FsaWFzfSIgICAgICAgCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAgICAnIicgICAgICAgCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gJyNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTCAgICAgICAiJyAgICAgCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gInt0YXJnZXRfY2Fub25pY2FsfSIJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAnI2luY2x1ZGUgIm1wdy5oIicJCQkJPj4gIntvfSJjb25mLm5ldwotSWYgIntiZmRfZ2FzfSIgPX4gL3llcy8KLQlFY2hvICIjZGVmaW5lIEJGRF9BU1NFTUJMRVIiCQk+PiAie299ImNvbmYubmV3Ci1FbHNlCi0JRWNobyAiI2RlZmluZSBNQU5ZX1NFR01FTlRTIgkJPj4gIntvfSJjb25mLm5ldwotRW5kIElmCi1FY2hvICcjZGVmaW5lIENSX0VPTCcJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAnI2RlZmluZSBPQkpfQ09GRl9PTUlUX1RJTUVTVEFNUCcJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gJyNkZWZpbmUgTE9TSU5HX0NPTVBJTEVSJwkJCT4+ICJ7b30iY29uZi5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZi5uZXcgIntvfSJjb25mCi0KLXNlZCAtZSAicy9Ac3JjZGlyQC97c3JjZGlyfS8iICJ7c3JjZGlyfSJnZGJpbml0LmluID4gIntvfSJfZ2RiaW5pdApkaWZmIC0tZ2l0IGEvZ2FzL21wdy1tYWtlLnNlZCBiL2dhcy9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjEyYTUuLjAwMDAwMDAKLS0tIGEvZ2FzL21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0aGF0IGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgR0FTIFVuaXggTWFrZWZpbGUgdG8gTVBXIHN5bnRheC4KLQotL14jIEB0YXJnZXRfZnJhZ0AvYVwKLVwKLUhERUZJTkVTID0gXAotTE9DQUxfTE9BRExJQkVTID0gXAotCi0vXnNyY3Jvb3QgPSAvcy9eLyMvCi0vXnRhcmdldF9hbGlhcyA9IC9zL14vIy8KLQotL0lOQ0xVREVTL3MvLWkgIntzcmNkaXJ9IjpcKFthLXpdKlwpLy1pICJ7dG9wc3JjZGlyfSJcMS8KLS9JTkNMVURFUy9zLy1pICJ7c3JjZGlyfSJcLlwuLy1pICJ7dG9wc3JjZGlyfSIvCi0KLS9eSU5DTFVERVMgPSAuKiQvcy8kLyAtaSAie3RvcHNyY2Rpcn0iaW5jbHVkZTptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0KLS8kKFRBUkdfQ1BVX0RFUF9AdGFyZ2V0X2NwdV90eXBlQCkvcy8kKFRBUkdfQ1BVX0RFUF9AdGFyZ2V0X2NwdV90eXBlQCkve1RBUkdfQ1BVX0RFUH0vCi0KLS9AT1BDT0RFU19MSUJAL3MvQE9QQ09ERVNfTElCQC86Om9wY29kZXM6bGlib3Bjb2Rlcy5vLwotL0BCRkRMSUJAL3MvQEJGRExJQkAvOjpiZmQ6bGliYmZkLm8vCi0KLSMgUG9pbnQgYXQgdGhlIGxpYnJhcmllcyBkaXJlY3RseS4KLS9AT1BDT0RFU19ERVBAL3MvQE9QQ09ERVNfREVQQC86Om9wY29kZXM6bGlib3Bjb2Rlcy5vLwotL0BCRkRERVBAL3MvQEJGRERFUEAvOjpiZmQ6bGliYmZkLm8vCi0KLSMgRG9uJ3QgbmVlZCB0aGlzLgotL0BITERGTEFHU0Avcy9ASExERkxBR1NALy8KLQotL2V4dHJhX29iamVjdHNAL3MvZXh0cmFfb2JqZWN0c0Ave0VYVFJBX09CSkVDVFN9LwotCi0vTE9BRExJQkVTL3Mve0xPQURMSUJFU30ve0VYVFJBTElCU30vCi0KLS9AQUxMX09CSl9ERVBTQC9zL0BBTExfT0JKX0RFUFNALzo6YmZkOmJmZC5oLwotCi0jIFRoaXMgY2F1c2VzIHByb2JsZW1zIC0gbm90IHN1cmUgd2h5LgotL150YWdzIFRBR1MvLC9ldGFncyAvZAotCi0vXm1ha2UtZ2FzLmNvbS9zL14vIy8KLQotL3RydWUvcy8gOyBAdHJ1ZSQvLwotCi0jIFJlbW92ZSByZWZlcmVuY2VzIHRvIGNvbmYuaW4sIHdlIGRvbid0IG5lZWQgdGhlbS4KLS9jb25mXC5pbi9zL2NvbmZcLmluLy9nCi0KLSMgVXNlIF9nZGJpbml0IGV2ZXJ5d2hlcmUgaW5zdGVhZCBvZiAuZ2RiaW5pdC4KLS9nZGJpbml0L3MvXC5nZGJpbml0L19nZGJpbml0L2cKLQotL2F0b2YtdGFyZy9zLyJ7c30iYXRvZi10YXJnXC5jLyJ7b30iYXRvZi10YXJnLmMvZwotL2NvbmZpZy9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZwotL2NvbmZpZy9zL15jb25maWdcLmgvIntvfSJjb25maWcuaC8KLS9vYmotZm9ybWF0L3MvIntzfSJvYmotZm9ybWF0XC5jLyJ7b30ib2JqLWZvcm1hdC5jL2cKLS9vYmotZm9ybWF0L3MvIntzfSJvYmotZm9ybWF0XC5oLyJ7b30ib2JqLWZvcm1hdC5oL2cKLS90YXJnLWNwdS9zLyJ7c30idGFyZy1jcHVcLmMvIntvfSJ0YXJnLWNwdS5jL2cKLS90YXJnLWNwdS9zLyJ7c30idGFyZy1jcHVcLmgvIntvfSJ0YXJnLWNwdS5oL2cKLS90YXJnLWVudi9zLyJ7c30idGFyZy1lbnZcLmgvIntvfSJ0YXJnLWVudi5oL2cKLQotL202OGstcGFyc2UuYy9zLyJ7c30ibTY4ay1wYXJzZVwuYy8ie299Im02OGstcGFyc2UuYy9nCi0vbTY4ay1wYXJzZS5jL3MvXm02OGstcGFyc2VcLmMvIntvfSJtNjhrLXBhcnNlLmMvCi0KLSMgV2hhY2sgb3V0IHRoZSBjb25maWcuaCBkZXBlbmRlbmN5LCBpdCBvbmx5IGNhdXNlcyBleGNlc3MgcmVidWlsZHMuCi0ve09CSlN9L3Mve09CSlN9IFxcT3B0aW9uLWYgIntvfSJjb25maWcuaC97T0JKU30gXFxPcHRpb24tZi8KLS9nYXNwLmMvcy9nYXNwXC5jICJ7b30iY29uZmlnLmgvZ2FzcC5jLwotCi0jIEFMTF9DRkxBR1MgaW5jbHVkZXMgVERFRklORVMsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUgYXQgbGluayB0aW1lLgotL0NDX0xEL3MvQUxMX0NGTEFHUy9DRkxBR1MvZwotCi0jIFRoZSByZXNvdXJjZSBmaWxlIGlzIGNhbGxlZCBtYWMtYXMuci4KLS9hcy5uZXcuci9zL2FzXC5uZXdcLnIvbWFjLWFzLnIvCi0vZ2FzcC5uZXcuci9zL2dhc3BcLm5ld1wuci9tYWMtYXMuci8KLQotIyAuLi5hbmQgdGhlIFBST0dfTkFNRSBkb2Vzbid0IGhhdmUgYSAubmV3IGluIGl0LgotL1BST0dfTkFNRS9zL1BST0dfTkFNRT0nIidhcy5uZXcnIicvUFJPR19OQU1FPSciJ2FzJyInLwotL1BST0dfTkFNRS9zL1BST0dfTkFNRT0nIidnYXNwLm5ldyciJy9QUk9HX05BTUU9JyInZ2FzcCciJy8KLQotIyBXaGFjayBvdXQgcmVjdXJzaXZlIG1ha2VzLCB0aGV5IHdvbid0IHdvcmsuCi0vXlsgCV1bIAldKnNyY3Jvb3Q9LywvXlsgCV1bIAldKihjZCAvZAotCi0jIFdvcmsgYXJvdW5kIHF1b3RpbmcgcHJvYmxlbXMgYnkgdXNpbmcgbXVsdGlwbGUgZWNobyBjb21tYW5kcy4KLS8nI2RlZmluZSBHQVNfVkVSU0lPTiAie1ZFUlNJT059IicvY1wKLQlFY2hvIC1uICcjZGVmaW5lIEdBU19WRVJTSU9OICInID4+ICJ7b30iY29uZmlnLm5ld1wKLQlFY2hvIC1uICJ7VkVSU0lPTn0iID4+ICJ7b30iY29uZmlnLm5ld1wKLQlFY2hvIC1uICciJyA+PiAie299ImNvbmZpZy5uZXcKLQotIyBBZGQgYSAic3RhbXBzIiB0YXJnZXQuCi0kYVwKLXN0YW1wcyBcXE9wdGlvbi1mIGNvbmZpZy1zdGFtcFwKLQotL15pbnN0YWxsIFxcT3B0aW9uLWYvLC9eJC9jXAotaW5zdGFsbCBcXE9wdGlvbi1mIGFsbCBpbnN0YWxsLW9ubHlcCi1cCi1pbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKLQlEdXBsaWNhdGUgLXkgOmFzLm5ldyAie2JpbmRpcn0iYXNcCi0JRHVwbGljYXRlIC15IDpnYXNwLm5ldyAie2JpbmRpcn0iZ2FzcFwKLQotCi0jIFdoYWNrIG91dCBjb25maWctcmVidWlsZGluZyB0YXJnZXRzLCB0aGV5IHdvbid0IHdvcmsuCi0vXk1ha2VmaWxlIFxcT3B0aW9uLWYvLC9eJC9kCi0vXmNvbmZpZy5zdGF0dXMgXFxPcHRpb24tZi8sL14kL2QKLQotL14ie299ImNvbmZpZy5oIFxcT3B0aW9uLWYvcy9eLyMvCmRpZmYgLS1naXQgYS9nYXMvb2JqLmggYi9nYXMvb2JqLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZTU1NTEuLjAwMDAwMDAKLS0tIGEvZ2FzL29iai5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyogb2JqLmggLSBkZWZpbmVzIHRoZSBvYmplY3QgZGVwZW5kZW50IGhvb2tzIGZvciBhbGwgb2JqZWN0Ci0gICBmb3JtYXQgYmFja2VuZHMuCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotY2hhciAqb2JqX2RlZmF1bHRfb3V0cHV0X2ZpbGVfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIG9ial9lbWl0X3JlbG9jYXRpb25zIFBBUkFNUyAoKGNoYXIgKip3aGVyZSwgZml4UyAqIGZpeFAsCi0JCQkJICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpKTsKLXZvaWQgb2JqX2VtaXRfc3RyaW5ncyBQQVJBTVMgKChjaGFyICoqd2hlcmUpKTsKLXZvaWQgb2JqX2VtaXRfc3ltYm9scyBQQVJBTVMgKChjaGFyICoqd2hlcmUsIHN5bWJvbFMgKiBzeW1ib2xzKSk7Ci0jaWZuZGVmIG9ial9yZWFkX2JlZ2luX2hvb2sKLXZvaWQgb2JqX3JlYWRfYmVnaW5faG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZCBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotdm9pZCBvYmpfaGVhZGVyX2FwcGVuZCBQQVJBTVMgKChjaGFyICoqd2hlcmUsIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2lmbmRlZiBvYmpfcHJlX3dyaXRlX2hvb2sKLXZvaWQgb2JqX3ByZV93cml0ZV9ob29rIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBvYmpfc3ltYm9sX25ld19ob29rCi12b2lkIG9ial9zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFApKTsKLSNlbmRpZgotCi12b2lkIG9ial9zeW1ib2xfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqKndoZXJlLCBzeW1ib2xTICogc3ltYm9sUCkpOwotCi1leHRlcm4gY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0cnVjdCBmb3JtYXRfb3BzIHsKLSAgaW50IGZsYXZvcjsKLSAgdW5zaWduZWQgZGZsX2xlYWRpbmdfdW5kZXJzY29yZSA6IDE7Ci0gIHVuc2lnbmVkIGVtaXRfc2VjdGlvbl9zeW1ib2xzIDogMTsKLSAgdm9pZCAoKmZyb2Jfc3ltYm9sKSBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci0gIHZvaWQgKCpmcm9iX2ZpbGUpIFBBUkFNUyAoKHZvaWQpKTsKLSAgdm9pZCAoKmZyb2JfZmlsZV9hZnRlcl9yZWxvY3MpIFBBUkFNUyAoKHZvaWQpKTsKLSAgYmZkX3ZtYSAoKnNfZ2V0X3NpemUpIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotICB2b2lkICgqc19zZXRfc2l6ZSkgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci0gIGJmZF92bWEgKCpzX2dldF9hbGlnbikgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0gIHZvaWQgKCpzX3NldF9hbGlnbikgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci0gIGludCAoKnNfZ2V0X290aGVyKSBQQVJBTVMgKChzeW1ib2xTICopKTsKLSAgaW50ICgqc19nZXRfZGVzYykgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0gIHZvaWQgKCpjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKSBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotICB2b2lkICgqZ2VuZXJhdGVfYXNtX2xpbmVubykgUEFSQU1TICgodm9pZCkpOwotICB2b2lkICgqcHJvY2Vzc19zdGFiKSBQQVJBTVMgKChzZWdULCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCkpOwotICBpbnQgKCpzZWNfc3ltX29rX2Zvcl9yZWxvYykgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotICB2b2lkICgqcG9wX2luc2VydCkgUEFSQU1TICgodm9pZCkpOwotICAvKiBGb3IgY29uZmlndXJhdGlvbnMgdXNpbmcgRUNPRkZfREVCVUdHSU5HLCB0aGlzIGNhbGxiYWNrIGlzIHVzZWQuICAqLwotICB2b2lkICgqZWNvZmZfc2V0X2V4dCkgUEFSQU1TICgoc3ltYm9sUyAqLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqKSk7Ci0KLSAgdm9pZCAoKnJlYWRfYmVnaW5faG9vaykgUEFSQU1TICgodm9pZCkpOwotICB2b2lkICgqc3ltYm9sX25ld19ob29rKSBQQVJBTVMgKChzeW1ib2xTICopKTsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlbGZfZm9ybWF0X29wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlY29mZl9mb3JtYXRfb3BzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGNvZmZfZm9ybWF0X29wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBhb3V0X2Zvcm1hdF9vcHM7Ci0KLSNpZm5kZWYgdGhpc19mb3JtYXQKLUNPTU1PTiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyAqdGhpc19mb3JtYXQ7Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBlbmQgb2Ygb2JqLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9vdXRwdXQtZmlsZS5jIGIvZ2FzL291dHB1dC1maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZGY3MmYuLjAwMDAwMDAKLS0tIGEvZ2FzL291dHB1dC1maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyogb3V0cHV0LWZpbGUuYyAtICBEZWFsIHdpdGggdGhlIG91dHB1dCBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTMsIDkyLCA5NCwgOTUsIDk2LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgotCi0jaWZkZWYgQkZEX0hFQURFUlMKLSNkZWZpbmUgVVNFX0JGRAotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIFVTRV9CRkQKLSNpZm5kZWYgVEFSR0VUX01BQ0gKLSNkZWZpbmUgVEFSR0VUX01BQ0ggMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9CRkQKLSNpbmNsdWRlICJiZmQuaCIKLWJmZCAqc3Rkb3V0cHV0OwotCi12b2lkCi1vdXRwdXRfZmlsZV9jcmVhdGUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICctJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IG9wZW4gYSBiZmQgb24gc3Rkb3V0ICVzICIpLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEoc3Rkb3V0cHV0ID0gYmZkX29wZW53IChuYW1lLCBUQVJHRVRfRk9STUFUKSkpCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIiksIG5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIGJmZF9zZXRfZm9ybWF0IChzdGRvdXRwdXQsIGJmZF9vYmplY3QpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIFRBUkdFVF9NQUNIKTsKLSNlbmRpZgotICBpZiAoZmxhZ190cmFkaXRpb25hbF9mb3JtYXQpCi0gICAgc3Rkb3V0cHV0LT5mbGFncyB8PSBCRkRfVFJBRElUSU9OQUxfRk9STUFUOwotfQotCi12b2lkCi1vdXRwdXRfZmlsZV9jbG9zZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogQ2xvc2UgdGhlIGJmZC4gICovCi0gIGlmIChiZmRfY2xvc2UgKHN0ZG91dHB1dCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjbG9zZSAlc1xuIiksIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotI2Vsc2UKLSAgLyogQ2xvc2UgdGhlIGJmZCB3aXRob3V0IGdldHRpbmcgYmZkIHRvIHdyaXRlIG91dCBhbnl0aGluZyBieSBpdHNlbGYgKi8KLSAgaWYgKGJmZF9jbG9zZV9hbGxfZG9uZSAoc3Rkb3V0cHV0KSA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNsb3NlICVzXG4iKSwgZmlsZW5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0jZW5kaWYKLSAgc3Rkb3V0cHV0ID0gTlVMTDsJCS8qIFRydXN0IG5vYm9keSEgKi8KLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkCi1vdXRwdXRfZmlsZV9hcHBlbmQgKHdoZXJlLCBsZW5ndGgsIGZpbGVuYW1lKQotICAgICBjaGFyICp3aGVyZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBsb25nIGxlbmd0aCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpmaWxlbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi0jZWxzZQotCi1zdGF0aWMgRklMRSAqc3Rkb3V0cHV0OwotCi12b2lkCi1vdXRwdXRfZmlsZV9jcmVhdGUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICctJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgc3Rkb3V0cHV0ID0gc3Rkb3V0OwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdGRvdXRwdXQgPSBmb3BlbiAobmFtZSwgIndiIik7Ci0KLSAgLyogU29tZSBzeXN0ZW1zIGRvbid0IGdyb2sgImIiIGluIGZvcGVuIG1vZGVzLiAgKi8KLSAgaWYgKHN0ZG91dHB1dCA9PSBOVUxMKQotICAgIHN0ZG91dHB1dCA9IGZvcGVuIChuYW1lLCAidyIpOwotCi0gIGlmIChzdGRvdXRwdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiKSwgbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLX0KLQotdm9pZAotb3V0cHV0X2ZpbGVfY2xvc2UgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKEVPRiA9PSBmY2xvc2UgKHN0ZG91dHB1dCkpCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY2xvc2UgJXMiKSwgZmlsZW5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIHN0ZG91dHB1dCA9IE5VTEw7CQkvKiBUcnVzdCBub2JvZHkhICovCi19Ci0KLXZvaWQKLW91dHB1dF9maWxlX2FwcGVuZCAod2hlcmUsIGxlbmd0aCwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBsb25nIGxlbmd0aDsKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGZvciAoOyBsZW5ndGg7IGxlbmd0aC0tLCB3aGVyZSsrKQotICAgIHsKLSAgICAgICh2b2lkKSBwdXRjICgqd2hlcmUsIHN0ZG91dHB1dCk7Ci0gICAgICBpZiAoZmVycm9yIChzdGRvdXRwdXQpKQotCS8qIGlmICggRU9GID09IChwdXRjKCAqd2hlcmUsIHN0ZG91dHB1dCApKSApICovCi0JewotCSAgYXNfcGVycm9yIChfKCJGYWlsZWQgdG8gZW1pdCBhbiBvYmplY3QgYnl0ZSIpLCBmaWxlbmFtZSk7Ci0JICBhc19mYXRhbCAoXygiQ2FuJ3QgY29udGludWUiKSk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qIGVuZCBvZiBvdXRwdXQtZmlsZS5jICovCmRpZmYgLS1naXQgYS9nYXMvb3V0cHV0LWZpbGUuaCBiL2dhcy9vdXRwdXQtZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDJmMWVmLi4wMDAwMDAwCi0tLSBhL2dhcy9vdXRwdXQtZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG91dHB1dC1maWxlLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdm9pZCBvdXRwdXRfZmlsZV9hcHBlbmQgUEFSQU1TICgoY2hhciAqd2hlcmUsIGxvbmcgbGVuZ3RoLCBjaGFyICpmaWxlbmFtZSkpOwotdm9pZCBvdXRwdXRfZmlsZV9jbG9zZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotdm9pZCBvdXRwdXRfZmlsZV9jcmVhdGUgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotCi0vKiBlbmQgb2Ygb3V0cHV0LWZpbGUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3BvL01ha2UtaW4gYi9nYXMvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9nYXMvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9nYXMvcG8vUE9URklMRVMuaW4gYi9nYXMvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDIwYjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLWFwcC5jCi1hcHAuYwotYXMuYwotYXMuYwotYXMuaAotYXNpbnRsLmgKLWF0b2YtZ2VuZXJpYy5jCi1hdG9mLWdlbmVyaWMuYwotYmlnbnVtLWNvcHkuYwotYmlnbnVtLWNvcHkuYwotYmlnbnVtLmgKLWJpdF9maXguaAotY2dlbi5oCi1jb25kLmMKLWNvbmQuYwotY29uZmlnL2UtaTM4NmFvdXQuYwotY29uZmlnL2UtaTM4NmNvZmYuYwotY29uZmlnL2UtaTM4NmVsZi5jCi1jb25maWcvZS1taXBzZWNvZmYuYwotY29uZmlnL2UtbWlwc2VsZi5jCi1jb25maWcvb2JqLWFvdXQuYwotY29uZmlnL29iai1hb3V0LmgKLWNvbmZpZy9vYmotYm91dC5jCi1jb25maWcvb2JqLWJvdXQuaAotY29uZmlnL29iai1jb2ZmLmMKLWNvbmZpZy9vYmotY29mZi5oCi1jb25maWcvb2JqLWVjb2ZmLmMKLWNvbmZpZy9vYmotZWNvZmYuaAotY29uZmlnL29iai1lbGYuYwotY29uZmlnL29iai1lbGYuaAotY29uZmlnL29iai1ldmF4LmMKLWNvbmZpZy9vYmotZXZheC5oCi1jb25maWcvb2JqLWhwMzAwLmMKLWNvbmZpZy9vYmotaHAzMDAuaAotY29uZmlnL29iai1pZWVlLmMKLWNvbmZpZy9vYmotaWVlZS5oCi1jb25maWcvb2JqLXNvbS5jCi1jb25maWcvb2JqLXNvbS5oCi1jb25maWcvb2JqLXZtcy5jCi1jb25maWcvb2JqLXZtcy5oCi1jb25maWcvdGMtYTI5ay5jCi1jb25maWcvdGMtYTI5ay5oCi1jb25maWcvdGMtYWxwaGEuYwotY29uZmlnL3RjLWFscGhhLmgKLWNvbmZpZy90Yy1hcmMuYwotY29uZmlnL3RjLWFyYy5oCi1jb25maWcvdGMtYXJtLmMKLWNvbmZpZy90Yy1hcm0uaAotY29uZmlnL3RjLWQxMHYuYwotY29uZmlnL3RjLWQxMHYuaAotY29uZmlnL3RjLWQzMHYuYwotY29uZmlnL3RjLWQzMHYuaAotY29uZmlnL3RjLWZyMzAuYwotY29uZmlnL3RjLWZyMzAuaAotY29uZmlnL3RjLWg4MzAwLmMKLWNvbmZpZy90Yy1oODMwMC5oCi1jb25maWcvdGMtaDg1MDAuYwotY29uZmlnL3RjLWg4NTAwLmgKLWNvbmZpZy90Yy1ocHBhLmMKLWNvbmZpZy90Yy1ocHBhLmgKLWNvbmZpZy90Yy1pMzcwLmMKLWNvbmZpZy90Yy1pMzcwLmgKLWNvbmZpZy90Yy1pMzg2LmMKLWNvbmZpZy90Yy1pMzg2LmgKLWNvbmZpZy90Yy1pODYwLmMKLWNvbmZpZy90Yy1pODYwLmgKLWNvbmZpZy90Yy1pOTYwLmMKLWNvbmZpZy90Yy1pOTYwLmgKLWNvbmZpZy90Yy1tMzJyLmMKLWNvbmZpZy90Yy1tMzJyLmgKLWNvbmZpZy90Yy1tNjhrLmMKLWNvbmZpZy90Yy1tNjhrLmgKLWNvbmZpZy90Yy1tODhrLmMKLWNvbmZpZy90Yy1tODhrLmgKLWNvbmZpZy90Yy1tY29yZS5jCi1jb25maWcvdGMtbWNvcmUuaAotY29uZmlnL3RjLW1pcHMuYwotY29uZmlnL3RjLW1pcHMuaAotY29uZmlnL3RjLW1uMTAyMDAuYwotY29uZmlnL3RjLW1uMTAyMDAuaAotY29uZmlnL3RjLW1uMTAzMDAuYwotY29uZmlnL3RjLW1uMTAzMDAuaAotY29uZmlnL3RjLW5zMzJrLmMKLWNvbmZpZy90Yy1uczMyay5oCi1jb25maWcvdGMtcGouYwotY29uZmlnL3RjLXBqLmgKLWNvbmZpZy90Yy1wcGMuYwotY29uZmlnL3RjLXBwYy5oCi1jb25maWcvdGMtc2guYwotY29uZmlnL3RjLXNoLmgKLWNvbmZpZy90Yy1zcGFyYy5jCi1jb25maWcvdGMtc3BhcmMuaAotY29uZmlnL3RjLXRhaG9lLmMKLWNvbmZpZy90Yy10YWhvZS5oCi1jb25maWcvdGMtdGljMzAuYwotY29uZmlnL3RjLXRpYzMwLmgKLWNvbmZpZy90Yy10aWM4MC5jCi1jb25maWcvdGMtdGljODAuaAotY29uZmlnL3RjLXY4NTAuYwotY29uZmlnL3RjLXY4NTAuaAotY29uZmlnL3RjLXZheC5jCi1jb25maWcvdGMtdmF4LmgKLWNvbmZpZy90Yy13NjUuYwotY29uZmlnL3RjLXc2NS5oCi1jb25maWcvdGMtejhrLmMKLWNvbmZpZy90Yy16OGsuaAotZGVwZW5kLmMKLWRlcGVuZC5jCi1kd2FyZjJkYmcuYwotZHdhcmYyZGJnLmMKLWR3YXJmMmRiZy5oCi1lY29mZi5jCi1lY29mZi5jCi1lY29mZi5oCi1laG9wdC5jCi1laG9wdC5jCi1lbXVsLXRhcmdldC5oCi1lbXVsLmgKLWV4cHIuYwotZXhwci5jCi1leHByLmgKLWZsb251bS1jb3B5LmMKLWZsb251bS1jb3B5LmMKLWZsb251bS1rb25zdC5jCi1mbG9udW0ta29uc3QuYwotZmxvbnVtLW11bHQuYwotZmxvbnVtLW11bHQuYwotZmxvbnVtLmgKLWZyYWdzLmMKLWZyYWdzLmMKLWZyYWdzLmgKLWdhc3AuYwotaGFzaC5jCi1oYXNoLmMKLWhhc2guaAotaW5wdXQtZmlsZS5jCi1pbnB1dC1maWxlLmMKLWlucHV0LWZpbGUuaAotaW5wdXQtc2NydWIuYwotaW5wdXQtc2NydWIuYwotaXRibC1vcHMuYwotaXRibC1vcHMuaAotbGlzdGluZy5jCi1saXN0aW5nLmMKLWxpc3RpbmcuaAotbGl0ZXJhbC5jCi1saXRlcmFsLmMKLW1hY3JvLmMKLW1hY3JvLmMKLW1hY3JvLmgKLW1lc3NhZ2VzLmMKLW1lc3NhZ2VzLmMKLW9iai5oCi1vdXRwdXQtZmlsZS5jCi1vdXRwdXQtZmlsZS5jCi1vdXRwdXQtZmlsZS5oCi1yZWFkLmMKLXJlYWQuYwotcmVhZC5oCi1zYi5jCi1zYi5jCi1zYi5oCi1zdGFicy5jCi1zdGFicy5jCi1zdHJ1Yy1zeW1ib2wuaAotc3Vic2Vncy5jCi1zdWJzZWdzLmMKLXN1YnNlZ3MuaAotc3ltYm9scy5jCi1zeW1ib2xzLmMKLXN5bWJvbHMuaAotdGMuaAotd3JpdGUuYwotd3JpdGUuYwotd3JpdGUuaApkaWZmIC0tZ2l0IGEvZ2FzL3BvL2dhcy5wb3QgYi9nYXMvcG8vZ2FzLnBvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwNGNlYS4uMDAwMDAwMAotLS0gYS9nYXMvcG8vZ2FzLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDc3MDUgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDIwMDAtMDItMjcgMTE6MzctMDUwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGFwcC5jOjQ2NiBhcHAuYzo0ODAKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBjb21tZW50IgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjU1OQotbXNnaWQgImVuZCBvZiBmaWxlIGluIHN0cmluZzogaW5zZXJ0ZWQgJ1wiJyIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo2MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBlc2NhcGUgJ1xcJWMnIGluIHN0cmluZzogSWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo2MzQKLW1zZ2lkICJFbmQgb2YgZmlsZSBpbiBzdHJpbmc6ICdcIicgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6NzU0Ci1tc2dpZCAiZW5kIG9mIGZpbGUgbm90IGF0IGVuZCBvZiBhIGxpbmU7IG5ld2xpbmUgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6OTExCi1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gbXVsdGlsaW5lIGNvbW1lbnQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6OTYwCi1tc2dpZCAiZW5kIG9mIGZpbGUgYWZ0ZXIgYSBvbmUtY2hhcmFjdGVyIHF1b3RlOyBcXDAgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6OTY4Ci1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gZXNjYXBlIGNoYXJhY3RlciIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo5ODAKLW1zZ2lkICJNaXNzaW5nIGNsb3NlIHF1b3RlOiAoYXNzdW1lZCkiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6MTA0MyBhcHAuYzoxMDk3IGFwcC5jOjExNjYKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjExMDcKLW1zZ2lkICJFT0YgaW4gQ29tbWVudDogTmV3bGluZSBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjE0OAotbXNnaWQgIm1pc3NpbmcgZW11bGF0aW9uIG1vZGUgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjE2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgZW11bGF0aW9uIG5hbWUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjIxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSB1c2luZyBCRkQgdmVyc2lvbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjIyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgW29wdGlvbi4uLl0gW2FzbWZpbGUuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyMjQKLW1zZ2lkICIiCi0iT3B0aW9uczpcbiIKLSIgIC1hW3N1Yi1vcHRpb24uLi5dXHQgIHR1cm4gb24gbGlzdGluZ3NcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgXHQgIFN1Yi1vcHRpb25zIFtkZWZhdWx0IGhsc106XG4iCi0iICAgICAgICAgICAgICAgICAgICAgIFx0ICBjICAgICAgb21pdCBmYWxzZSBjb25kaXRpb25hbHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgXHQgIGQgICAgICBvbWl0IGRlYnVnZ2luZyBkaXJlY3RpdmVzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIFx0ICBoICAgICAgaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICBcdCAgbCAgICAgIGluY2x1ZGUgYXNzZW1ibHlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgXHQgIG0gICAgICBpbmNsdWRlIG1hY3JvIGV4cGFuc2lvbnNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgXHQgIG4gICAgICBvbWl0IGZvcm1zIHByb2Nlc3NpbmdcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgXHQgIHMgICAgICBpbmNsdWRlIHN5bWJvbHNcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgXHQgIEwgICAgICBpbmNsdWRlIGxpbmUgZGVidWcgc3RhdGlzdGljcyAoaWYgIgotImFwcGxpY2FibGUpXG4iCi0iICAgICAgICAgICAgICAgICAgICAgIFx0ICA9RklMRSAgbGlzdCB0byBGSUxFIChtdXN0IGJlIGxhc3Qgc3ViLW9wdGlvbilcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjIzOAotbXNnaWQgIiAgLUQgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZSBhc3NlbWJsZXIgZGVidWdnaW5nIG1lc3NhZ2VzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyNDAKLW1zZ2lkICIgIC0tZGVmc3ltIFNZTT1WQUwgICAgICAgIGRlZmluZSBzeW1ib2wgU1lNIHRvIGdpdmVuIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVsYXRlIG91dHB1dCAoZGVmYXVsdCAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI2MAotbXNnaWQgIiAgLWYgICAgICAgICAgICAgICAgICAgICAgc2tpcCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50IHByZXByb2Nlc3NpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI2MgotbXNnaWQgIiAgLS1nc3RhYnMgICAgICAgICAgICAgICAgZ2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyNjQKLW1zZ2lkICIgIC0tZ2R3YXJmMiAgICAgICAgICAgICAgIGdlbmVyYXRlIERXQVJGMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI2NgotbXNnaWQgIiAgLS1oZWxwICAgICAgICAgICAgICAgICAgc2hvdyB0aGlzIG1lc3NhZ2UgYW5kIGV4aXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI2OAotbXNnaWQgIiIKLSIgIC1JIERJUiAgICAgICAgICAgICAgICAgIGFkZCBESVIgdG8gc2VhcmNoIGxpc3QgZm9yIC5pbmNsdWRlIGRpcmVjdGl2ZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI3MAotbXNnaWQgIiAgLUogICAgICAgICAgICAgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI3MgotbXNnaWQgIiIKLSIgIC1LICAgICAgICAgICAgICAgICAgICAgIHdhcm4gd2hlbiBkaWZmZXJlbmNlcyBhbHRlcmVkIGZvciBsb25nICIKLSJkaXNwbGFjZW1lbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyNzQKLW1zZ2lkICIgIC1MLC0ta2VlcC1sb2NhbHMgICAgICAgIGtlZXAgbG9jYWwgc3ltYm9scyAoZS5nLiBzdGFydGluZyB3aXRoIGBMJylcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI3NgotbXNnaWQgIiAgLU0sLS1tcmkgICAgICAgICAgICAgICAgYXNzZW1ibGUgaW4gTVJJIGNvbXBhdGliaWxpdHkgbW9kZVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6Mjc4Ci1tc2dpZCAiIgotIiAgLS1NRCBGSUxFICAgICAgICAgICAgICAgd3JpdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpbiBGSUxFIChkZWZhdWx0ICIKLSJub25lKVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MjgwCi1tc2dpZCAiICAtbm9jcHAgICAgICAgICAgICAgICAgICBpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyODIKLW1zZ2lkICIiCi0iICAtbyBPQkpGSUxFICAgICAgICAgICAgICBuYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgT0JKRklMRSAoZGVmYXVsdCAiCi0iYS5vdXQpXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyODQKLW1zZ2lkICIgIC1SICAgICAgICAgICAgICAgICAgICAgIGZvbGQgZGF0YSBzZWN0aW9uIGludG8gdGV4dCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyODYKLW1zZ2lkICIiCi0iICAtLXN0YXRpc3RpY3MgICAgICAgICAgICBwcmludCB2YXJpb3VzIG1lYXN1cmVkIHN0YXRpc3RpY3MgZnJvbSBleGVjdXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI4OAotbXNnaWQgIiAgLS1zdHJpcC1sb2NhbC1hYnNvbHV0ZSAgc3RyaXAgbG9jYWwgYWJzb2x1dGUgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MjkwCi1tc2dpZCAiIgotIiAgLS10cmFkaXRpb25hbC1mb3JtYXQgICAgVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBhc3NlbWJsZXIgd2hlbiBwb3NzaWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MjkyCi1tc2dpZCAiICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI5NAotbXNnaWQgIiAgLVcgIC0tbm8td2FybiAgICAgICAgICAgc3VwcHJlc3Mgd2FybmluZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI5NgotbXNnaWQgIiAgLS13YXJuICAgICAgICAgICAgICAgICAgZG9uJ3Qgc3VwcHJlc3Mgd2FybmluZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI5OAotbXNnaWQgIiAgLS1mYXRhbC13YXJuaW5ncyAgICAgICAgdHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzozMDAKLW1zZ2lkICIiCi0iICAtLWl0YmwgSU5TVFRCTCAgICAgICAgICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGluZyB0aGUgc3BlY2lmaWNhdGlvbnMgZGVmaW5lZCBpbiBmaWxlICIKLSJJTlNUVEJMXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzozMDMKLW1zZ2lkICIgIC13ICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjMwNQotbXNnaWQgIiAgLVggICAgICAgICAgICAgICAgICAgICAgaWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MzA3Ci1tc2dpZCAiICAtWiAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBvYmplY3QgZmlsZSBldmVuIGFmdGVyIGVycm9yc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MzA5Ci1tc2dpZCAiIgotIiAgLS1saXN0aW5nLWxocy13aWR0aCAgICAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgb3V0cHV0IGRhdGEgY29sdW1uICIKLSJvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3RpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjMxMgotbXNnaWQgIiIKLSIgIC0tbGlzdGluZy1saHMtd2lkdGgyICAgIHNldCB0aGUgd2lkdGggaW4gd29yZHMgb2YgdGhlIGNvbnRpbnVhdGlvbiBsaW5lc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG91dHB1dCBkYXRhIGNvbHVtbjsgaWdub3JlZCBpZiBzbWFsbGVyICIKLSJ0aGFuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGZpcnN0IGxpbmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjMxNgotbXNnaWQgIiIKLSIgIC0tbGlzdGluZy1yaHMtd2lkdGggICAgIHNldCB0aGUgbWF4IHdpZHRoIGluIGNoYXJhY3RlcnMgb2YgdGhlIGxpbmVzIGZyb21cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb3VyY2UgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MzE5Ci1tc2dpZCAiIgotIiAgLS1saXN0aW5nLWNvbnQtbGluZXMgICAgc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250aW51YXRpb24gbGluZXMgdXNlZFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW4gb2YgdGhlIGxpc3RpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjMyNSBnYXNwLmM6MzU4OQotbXNnaWQgIiIKLSJcbiIKLSJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuCi0jOiBhcy5jOjUxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgYXNzZW1ibGVyICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo1MTYKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjUxNyBnYXNwLmM6MzY4MwotbXNnaWQgIiIKLSJUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG4iCi0idGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRoaXMgYXNzZW1ibGVyIHdhcyBjb25maWd1cmVkIGZvciBhIHRhcmdldCBvZiBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTI3Ci1tc2dpZCAibXVsdGlwbGUgZW11bGF0aW9uIG5hbWVzIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjUyOQotbXNnaWQgImVtdWxhdGlvbnMgbm90IGhhbmRsZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFsaWFzID0gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjUzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5vbmljYWwgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNwdS10eXBlID0gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjUzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJmb3JtYXQgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJmZC10YXJnZXQgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTU0Ci1tc2dpZCAiYmFkIGRlZnN5bTsgZm9ybWF0IGlzIC0tZGVmc3ltIG5hbWU9dmFsdWUiCi1tc2dzdHIgIiIKLQotIzogYXMuYzo1NzQKLW1zZ2lkICJObyBmaWxlIG5hbWUgZm9sbG93aW5nIC10IG9wdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZhaWxlZCB0byByZWFkIGluc3RydWN0aW9uIHRhYmxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo3MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBsaXN0aW5nIG9wdGlvbiBgJWMnIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6ODk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVkIHdhcm5pbmdzLCB0cmVhdGluZyB3YXJuaW5ncyBhcyBlcnJvcnMiCi1tc2dzdHIgIiIKLQotIzogYXMuYzo5MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHRvdGFsIHRpbWUgaW4gYXNzZW1ibHk6ICVsZC4lMDZsZFxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6OTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIy4KLSMuICogV2UgaGF2ZSBhIEdST1NTIGludGVybmFsIGVycm9yLgotIy4gKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCi0jLgotIzogYXRvZi1nZW5lcmljLmM6NDM4IGNvbmZpZy90Yy1hMjlrLmM6NTQ0IGNvbmZpZy90Yy1pODYwLmM6MzM1Ci0jOiBjb25maWcvdGMtaTg2MC5jOjcwOCBjb25maWcvdGMtbTY4ay5jOjMxMjQgY29uZmlnL3RjLW02OGsuYzozMTUzCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyNDUyCi1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjay4iCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjc1Ci1tc2dpZCAiaW52YWxpZCBpZGVudGlmaWVyIGZvciBcIi5pZmRlZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoxMjgKLW1zZ2lkICJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBcIi5pZlwiIHN0YXRlbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6MjI0Ci1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgaWZjIG9yIGlmbmMiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI1OAotbXNnaWQgIlwiLmVsc2VpZlwiIHdpdGhvdXQgbWF0Y2hpbmcgXCIuaWZcIiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI2MwotbXNnaWQgIlwiLmVsc2VpZlwiIGFmdGVyIFwiLmVsc2VcIiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI2NiBjb25kLmM6Mzc1Ci1tc2dpZCAiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJlbHNlXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI2OSBjb25kLmM6Mzc4Ci1tc2dpZCAiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJpZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzozMDIKLW1zZ2lkICJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBcIi5lbHNlaWZcIiBzdGF0ZW1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjMzNwotbXNnaWQgIlwiLmVuZGlmXCIgd2l0aG91dCBcIi5pZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzozNjcKLW1zZ2lkICIuZWxzZSB3aXRob3V0IG1hdGNoaW5nIC5pZiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjM3MgotbXNnaWQgImR1cGxpY2F0ZSBcImVsc2VcIiAtIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjQyMwotbXNnaWQgIi5pZmVxcyBzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjUwNgotbXNnaWQgImVuZCBvZiBtYWNybyBpbnNpZGUgY29uZGl0aW9uYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjUwOAotbXNnaWQgImVuZCBvZiBmaWxlIGluc2lkZSBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NTExCi1tc2dpZCAiaGVyZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NTE1Ci1tc2dpZCAiaGVyZSBpcyB0aGUgXCJlbHNlXCIgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzoxNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXR0ZW1wdCB0byBwdXQgYSBjb21tb24gc3ltYm9sIGludG8gc2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjE2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGludG8gc2V0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjE5OCBjb25maWcvb2JqLWNvZmYuYzoxMjA0IGNvbmZpZy9vYmotZWxmLmM6MTY3NQotIzogZWNvZmYuYzozNjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MjU2IGNvbmZpZy9vYmotY29mZi5jOjE5MTYKLW1zZ2lkICJ1bnJlc29sdmVkIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MjU4IGNvbmZpZy9vYmotY29mZi5jOjE5MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlbG9jYXRpb246IHN5bWJvbCBgJXMnIG5vdCBpbiBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgdHlwZSBmb3Igd2VhayBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6NDYyIGNvbmZpZy9vYmotY29mZi5jOjI4NDkgd3JpdGUuYzoxODA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzo1MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjYxNwotbXNnaWQgInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1ib3V0LmM6MzEzIGNvbmZpZy9vYmotdm1zLmM6NTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjE0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RydWN0dXJlIHRhYmxlIGZhaWxlZDogJXMiCi1tc2dzdHIgIiIKLQotIy4gWmVybyBpcyB1c2VkIGFzIGFuIGVuZCBtYXJrZXIgaW4gdGhlIGZpbGUuCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0NDQKLW1zZ2lkICJMaW5lIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vyc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQ3NyBjb25maWcvb2JqLWNvZmYuYzoyMjYzCi1tc2dpZCAiLmxuIHBzZXVkby1vcCBpbnNpZGUgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjUyMCBlY29mZi5jOjMzMDQKLW1zZ2lkICIubG9jIG91dHNpZGUgb2YgLnRleHQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NTI3Ci1tc2dpZCAiLmxvYyBwc2V1ZG8tb3AgaW5zaWRlIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo2MTUgY29uZmlnL29iai1jb2ZmLmM6MjMyMAotbXNnaWQgIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo2NjEgY29uZmlnL29iai1jb2ZmLmM6MjM3MwotbXNnaWQgIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo2OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYCVzJyBzeW1ib2wgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NzUzIGNvbmZpZy9vYmotY29mZi5jOjI0NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzdG9yYWdlIGNsYXNzICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjg2NiBjb25maWcvb2JqLWNvZmYuYzoyNTU1Ci1tc2dpZCAiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4ODYgY29uZmlnL29iai1jb2ZmLmM6MjU3NQotbXNnaWQgImJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjkzNyBjb25maWcvb2JqLWNvZmYuYzoyNjM4Ci1tc2dpZCAiLnNpemUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo5NTMgY29uZmlnL29iai1jb2ZmLmM6MjY1NAotbXNnaWQgIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo5NzEgY29uZmlnL29iai1jb2ZmLmM6MjY3MgotbXNnaWQgIi50YWcgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo5OTAgY29uZmlnL29iai1jb2ZmLmM6MjY5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ0YWcgbm90IGZvdW5kIGZvciAudGFnICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjEwMDUgY29uZmlnL29iai1jb2ZmLmM6MjcwNQotbXNnaWQgIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTAyNyBjb25maWcvb2JqLWNvZmYuYzoyNzI3Ci1tc2dpZCAiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjExNjUgY29uZmlnL29iai1jb2ZmLmM6MjkyMgotbXNnaWQgIm1pc21hdGNoZWQgLmViIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjExODMgY29uZmlnL29iai1jb2ZmLmM6Mjk2MgotbXNnaWQgIkNfRUZDTiBzeW1ib2wgb3V0IG9mIHNjb3BlIgotbXNnc3RyICIiCi0KLSMuIFNUWVBfSU5GTwotIy4gU1RZUF9MSUIKLSMuIFNUWVBfT1ZFUgotIzogY29uZmlnL29iai1jb2ZmLmM6MTQwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjE0MTAgY29uZmlnL29iai1jb2ZmLmM6MzY2OCBjb25maWcvdGMtcHBjLmM6Mzc5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTQzMiBjb25maWcvdGMtcHBjLmM6MzgwOSByZWFkLmM6MjQ5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIiVzXCI6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjE1NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMHglbHg6IFwiJXNcIiB0eXBlID0gJWxkLCBjbGFzcyA9ICVkLCBzZWdtZW50ID0gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxNzQzIGNvbmZpZy9vYmotaWVlZS5jOjY5Ci1tc2dpZCAiT3V0IG9mIHN0ZXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoyMTc4Ci1tc2dpZCAiYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoyNDA1Ci1tc2dpZCAiYC5iZicgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MzM2NSBjb25maWcvb2JqLWllZWUuYzo1MjIgb3V0cHV0LWZpbGUuYzo1MgotIzogb3V0cHV0LWZpbGUuYzoxMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozNTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGNsb3NlICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozNTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRvbyBtYW55IG5ldyBzZWN0aW9uczsgY2FuJ3QgYWRkIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozOTg2IGNvbmZpZy90Yy1tODhrLmM6MTI2MCBjb25maWcvdGMtc3BhcmMuYzozMzQ0Ci1tc2dpZCAiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozOTkyIHJlYWQuYzoxOTQ4Ci1tc2dpZCAiTWlzc2luZyBzaXplIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6Mzk5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJsY29tbSBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQwMjYgcmVhZC5jOjIxNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MTIwIGNvbmZpZy90Yy1pOTYwLmM6MzI1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJObyAnYmFsJyBlbnRyeSBwb2ludCBmb3IgbGVhZnByb2MgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDE5OSB3cml0ZS5jOjI1MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTmVnYXRpdmUgb2Ygbm9uLWFic29sdXRlIHN5bWJvbCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MjIwIHdyaXRlLmM6MjUyMQotbXNnaWQgImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQyNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgZW1pdCByZWxvYyB7LSAlcy1zZWcgc3ltYm9sIFwiJXNcIn0gQCBmaWxlIGFkZHJlc3MgJWxkLiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIGlzIGEgQ09CUiBpbnN0cnVjdGlvbi4gIFRoZXkgaGF2ZSBvbmx5IGEgMTMtYml0Ci0jLiBkaXNwbGFjZW1lbnQgYW5kIGFyZSBvbmx5IHRvIGJlIHVzZWQgZm9yIGxvY2FsIGJyYW5jaGVzOgotIy4gZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUgcmVsb2NhdGlvbi4KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQzNTYgY29uZmlnL3RjLWk5NjAuYzozMjc1IHdyaXRlLmM6MjY2NQotbXNnaWQgImNhbid0IHVzZSBDT0JSIGZvcm1hdCB3aXRoIGV4dGVybmFsIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQ0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFsdWUgb2YgJWxkIHRvbyBsYXJnZSBmb3IgZmllbGQgb2YgJWQgYnl0ZXMgYXQgMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDQ1MCB3cml0ZS5jOjI3NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2lnbmVkIC53b3JkIG92ZXJmbG93OyBzd2l0Y2ggbWF5IGJlIHRvbyBsYXJnZTsgJWxkIGF0IDB4JWx4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWNvZmYuYzoyNDAKLW1zZ2lkICJDYW4ndCBzZXQgR1AgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lY29mZi5jOjI0NwotbXNnaWQgIkNhbid0IHNldCByZWdpc3RlciBtYXNrcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjI5OSBjb25maWcvdGMtc3BhcmMuYzozNDg1IGNvbmZpZy90Yy12ODUwLmM6MjYzCi1tc2dpZCAiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzozMDYgY29uZmlnL3RjLWFyYy5jOjc3OSBjb25maWcvdGMtc3BhcmMuYzozNDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIi5DT01Nb24gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjMxNiBjb25maWcvdGMtYWxwaGEuYzo0MzIwIGNvbmZpZy90Yy1zcGFyYy5jOjM1MDIKLSM6IGNvbmZpZy90Yy12ODUwLmM6Mjg1Ci1tc2dpZCAiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MzI0IGNvbmZpZy90Yy1hcmMuYzo3OTcgY29uZmlnL3RjLXNwYXJjLmM6MzUxMAotIzogY29uZmlnL3RjLXY4NTAuYzoyOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MzQ3IGNvbmZpZy90Yy1hcmMuYzo4MTYgY29uZmlnL3RjLXY4NTAuYzozMjIKLW1zZ2lkICJDb21tb24gYWxpZ25tZW50IG5lZ2F0aXZlOyAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzozNjYgY29uZmlnL3RjLW0zMnIuYzoxMjYyIGNvbmZpZy90Yy1wcGMuYzoxMzk2Ci0jOiBjb25maWcvdGMtdjg1MC5jOjM4NQotbXNnaWQgIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjQyOSBjb25maWcvdGMtYXJjLmM6ODc2IGNvbmZpZy90Yy1zcGFyYy5jOjM2MzQKLSM6IGNvbmZpZy90Yy12ODUwLmM6NTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo2NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2V0dGluZyBpbmNvcnJlY3Qgc2VjdGlvbiB0eXBlIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIGF0dHJpYnV0ZXMgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NzI2Ci1tc2dpZCAiVW5yZWNvZ25pemVkIC5zZWN0aW9uIGF0dHJpYnV0ZTogd2FudCBhLHcseCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjc2NgotbXNnaWQgIlVucmVjb2duaXplZCBzZWN0aW9uIGF0dHJpYnV0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjc4OAotbXNnaWQgIlVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo4MzkKLW1zZ2lkICJNaXNzaW5nIHNlY3Rpb24gbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjkwNQotbXNnaWQgIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmUgLSBjaGFyYWN0ZXIgZm9sbG93aW5nIG5hbWUgaXMgbm90ICcjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjEwMDYKLW1zZ2lkICIucHJldmlvdXMgd2l0aG91dCBjb3JyZXNwb25kaW5nIC5zZWN0aW9uOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTAzMwotbXNnaWQgIi5wb3BzZWN0aW9uIHdpdGhvdXQgY29ycmVzcG9uZGluZyAucHVzaHNlY3Rpb247IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxMDg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm11bHRpcGxlIC5zeW12ZXIgZGlyZWN0aXZlcyBmb3Igc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxMDk0Ci1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAuc3ltdmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTExNQotIywgYy1mb3JtYXQKLW1zZ2lkICJtaXNzaW5nIHZlcnNpb24gbmFtZSBpbiBgJXMnIGZvciBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjEzMjQgY29uZmlnL29iai1zb20uYzoxNDggY29uZmlnL29iai1zb20uYzoxOTMKLW1zZ2lkICJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTM0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIGAlcycgaW4gLnNpemUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTM1NAotbXNnaWQgIm1pc3NpbmcgZXhwcmVzc2lvbiBpbiAuc2l6ZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNDIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIHVucmVjb2duaXplZCBzeW1ib2wgdHlwZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNTk5Ci1tc2dpZCAiLnNpemUgZXhwcmVzc2lvbiB0b28gY29tcGxpY2F0ZWQgdG8gZml4IHVwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTYzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iaW52YWxpZCBhdHRlbXB0IHRvIGRlY2xhcmUgZXh0ZXJuYWwgdmVyc2lvbiBuYW1lIGFzIGRlZmF1bHQgaW4gc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNzYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZhaWxlZCB0byBzZXQgdXAgZGVidWdnaW5nIGluZm9ybWF0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjE3ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgc3RhcnQgd3JpdGluZyAubWRlYnVnIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTc4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDb3VsZCBub3Qgd3JpdGUgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWllZWUuYzo0NjAKLW1zZ2lkICJ0b28gbWFueSBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjEzMQotbXNnaWQgIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1zb20uYzoxNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjE3NgotbXNnaWQgIk9ubHkgb25lIC5jb3B5cmlnaHQgcHNldWRvLW9wIHBlciBmaWxlISIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQXR0YWNoaW5nIGNvcHlyaWdodCBoZWFkZXIgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29tcGlsZXIgZW1pdHRlZCB6ZXJvLXNpemUgY29tbW9uIHN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjb21waWxlciByZWRlZmluZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjU5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJDb3VsZG4ndCBjcmVhdGUgVk1TIG9iamVjdCBmaWxlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjYyMwotbXNnaWQgIkkvTyBlcnJvciB3cml0aW5nIFZNUyBvYmplY3QgZmlsZSAobGVuZ3RoIHByZWZpeCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo2MzcKLW1zZ2lkICJJL08gZXJyb3Igd3JpdGluZyBWTVMgb2JqZWN0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoxMjQwCi1tc2dpZCAiQ291bGRuJ3QgZmluZCBzb3VyY2UgZmlsZSBcIiVzXCIsIHN0YXR1cz0lJVgleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjE3NDkgY29uZmlnL29iai12bXMuYzoyOTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIGZvcndhcmQgcmVmZXJlbmNlIGVycm9yLCBkYnggdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjE4MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFyaWFibGUgZGVzY3JpcHRvciAlZCB0b28gY29tcGxpY2F0ZWQuICBEZWZpbmVkIGFzIGB2b2lkIConLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjIxNDQKLW1zZ2lkICIiCi0iKioqV2FybmluZyAtIHRoZSBhc3NlbWJseSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIgaGFzIHBsYWNlZCBcbiIKLSIgZ2xvYmFsIGNvbnN0YW50KHMpIGluIHRoZSB0ZXh0IHBzZWN0LiAgVGhlc2Ugd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIFxuIgotIiBvdGhlciBtb2R1bGVzLCBzaW5jZSB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdCB3YXkgdG8gaGFuZGxlIHRoaXMuIFlvdSBcbiIKLSIgaGF2ZSB0d28gb3B0aW9uczogMSkgZ2V0IGEgcGF0Y2hlZCBjb21waWxlciB0aGF0IGRvZXMgbm90IHB1dCBnbG9iYWwgXG4iCi0iIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdCwgb3IgMikgcmVtb3ZlIHRoZSAnY29uc3QnIGtleXdvcmQgZnJvbSBcbiIKLSIgZGVmaW5pdGlvbnMgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbiB5b3VyIHNvdXJjZSBtb2R1bGUocykuICBEb24ndCBzYXkgXG4iCi0iIEkgZGlkbid0IHdhcm4geW91ISBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI0NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnaW5lciBvdXRwdXQ6ICVkIGlzIGFuIHVua25vd24gdW50eXBlZCB2YXJpYWJsZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoyNjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIG91dHB1dDogc3RydWN0dXJlIGVsZW1lbnQgYCVzJyBoYXMgdW5kZWZpbmVkIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoyNzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB0eXBlIG9mIHZhcmlhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI5MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnZXIgb3V0cHV0OiBVbmFibGUgdG8gcmVzb2x2ZSAlZCBjaXJjdWxhciByZWZlcmVuY2VzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjMxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTW9kdWxlIG5hbWUgdHJ1bmNhdGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MzQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIKLW1zZ3N0ciAiIgotCi0jLiBpbXBvc3NpYmxlCi0jOiBjb25maWcvb2JqLXZtcy5jOjM2OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBWTVMgcHNlY3QgdHlwZSAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjM3MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR2xvYmFsc3ltYm9sIGF0dHJpYnV0ZSBmb3Igc3ltYm9sICVzIHdhcyB1bmV4cGVjdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjM4ODUKLW1zZ2lkICJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZ2xvYmFsdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzozODk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgZ2xvYmFsdmFsdWUgb2YgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0MjQ3Ci1tc2dpZCAiQ291bGRuJ3QgZmluZCBmaXh1cCBmcmFnbWVudCB3aGVuIGNoZWNraW5nIGZvciBpbmRpcmVjdCByZWZlcmVuY2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NTkxIGNvbmZpZy9vYmotdm1zLmM6NDczMwotbXNnaWQgIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgdGhlIHNhbWUgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ1OTUgY29uZmlnL29iai12bXMuYzo0NzM3Ci1tc2dpZCAiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDU5OCBjb25maWcvb2JqLXZtcy5jOjQ3NDAKLW1zZ2lkICJGaXh1cCBkYXRhIGlzIGVycm9uZW91c2x5IFwicGNyZWxcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ2MTQgY29uZmlnL29iai12bXMuYzo0NzU5Ci1tc2dpZCAiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NjE4IGNvbmZpZy9vYmotdm1zLmM6NDc2MwotbXNnaWQgIkZpeHVwIGRhdHVtIGlzIG5vdCBcImZpeFAtPmZ4X2FkZHN5XCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0ODM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJnKysgd3JvdGUgYW4gZXh0ZXJuIHJlZmVyZW5jZSB0byBgJXMnIGFzIGEgcm91dGluZS5cbiIKLSJJIHdpbGwgZml4IGl0LCBidXQgSSBob3BlIHRoYXQgaXQgd2FzIG5vdGUgcmVhbGx5IGEgcm91dGluZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0OTY2Ci1tc2dpZCAiQ2FuJ3QgaGFuZGxlIGdsb2JhbCB4dG9ycyBzeW1ib2xzIHlldC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0OTY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gJXMiCi1tc2dzdHIgIiIKLQotIy4KLSMuICoJRXJyb3Igb3RoZXJ3aXNlLgotIy4KLSM6IGNvbmZpZy9vYmotdm1zLmM6NTA1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQgc3RhYiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTYwIGNvbmZpZy90Yy1zcGFyYy5jOjM2ODYKLW1zZ2lkICJVbmtub3duIHNlZ21lbnQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBQcm9iYWJseSBhIG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0/ICBHaXZlIHVwIG5vdy4KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MzMwIGNvbmZpZy90Yy1ocHBhLmM6MTM4NyBjb25maWcvdGMtaTg2MC5jOjIwMgotIzogY29uZmlnL3RjLW1pcHMuYzoxMDYyIGNvbmZpZy90Yy1taXBzLmM6MTEwNCBjb25maWcvdGMtc3BhcmMuYzo3NzkKLW1zZ2lkICJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjM3NSBjb25maWcvdGMtYXJjLmM6NTM1IGNvbmZpZy90Yy1kMTB2LmM6NTA3Ci0jOiBjb25maWcvdGMtZDMwdi5jOjU1MyBjb25maWcvdGMtaDgzMDAuYzozMDUgY29uZmlnL3RjLWg4NTAwLmM6Mjk3Ci0jOiBjb25maWcvdGMtbWNvcmUuYzo2NTYgY29uZmlnL3RjLW1uMTAyMDAuYzo5MzUgY29uZmlnL3RjLW1uMTAzMDAuYzoxMjk0Ci0jOiBjb25maWcvdGMtcHBjLmM6MTg1MiBjb25maWcvdGMtc2guYzo2MjggY29uZmlnL3RjLXRpYzgwLmM6MjkxCi0jOiBjb25maWcvdGMtdjg1MC5jOjIwMzMgY29uZmlnL3RjLXc2NS5jOjI1NyBjb25maWcvdGMtejhrLmM6MzQxCi1tc2dpZCAibWlzc2luZyBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDE1IGNvbmZpZy90Yy1ocHBhLmM6MTUzMyBjb25maWcvdGMtaTg2MC5jOjQwNwotIzogY29uZmlnL3RjLWk4NjAuYzo0MjMgY29uZmlnL3RjLXNwYXJjLmM6MTM0MiBjb25maWcvdGMtc3BhcmMuYzoxMzQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gb3Bjb2RlOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gb3Bjb2RlIGAlcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRvbyBtYW55IG9wZXJhbmRzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjQ3NCBjb25maWcvdGMtYTI5ay5jOjUwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjg5MiBjb25maWcvdGMtaTg2MC5jOjk0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo5MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibmVlZCAlbzNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjkzMgotbXNnaWQgImEyOWtfY29udmVydF9mcmFnXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo5NDEKLW1zZ2lkICJhMjlrX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzoxMDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImxhYmVsIFwiJCVkXCIgcmVkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTE2NQotbXNnaWQgIkludmFsaWQgZXhwcmVzc2lvbiBhZnRlciAlJSUlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzoxMTc2Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlciBpbiAmIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6ODM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG9wY29kZSBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo4NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggbWFjcm8gYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6OTUxIGNvbmZpZy90Yy1pOTYwLmM6MjczOAotbXNnaWQgInN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMDI1IGNvbmZpZy90Yy1hcm0uYzo1MTY5IGNvbmZpZy90Yy1oODMwMC5jOjE0MTMKLSM6IGNvbmZpZy90Yy1oODUwMC5jOjEyMjIgY29uZmlnL3RjLWhwcGEuYzozOTA0IGNvbmZpZy90Yy1pODYwLmM6ODEzCi0jOiBjb25maWcvdGMtbTY4ay5jOjQxMjUgY29uZmlnL3RjLW04OGsuYzoxMTA2IGNvbmZpZy90Yy1uczMyay5jOjE1ODkKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI3MzEgY29uZmlnL3RjLXo4ay5jOjEzNTUKLW1zZ2lkICJCYWQgY2FsbCB0byBNRF9BVE9GKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTA3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIENQVSBpZGVudGlmaWVyIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTExOQotbXNnaWQgIiIKLSJBbHBoYSBvcHRpb25zOlxuIgotIi0zMmFkZHJcdFx0XHR0cmVhdCBhZGRyZXNzZXMgYXMgMzItYml0IHZhbHVlc1xuIgotIi1GXHRcdFx0bGFjayBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgc3VwcG9ydFxuIgotIi1tZXY0IHwgLW1ldjQ1IHwgLW1ldjUgfCAtbWV2NTYgfCAtbXBjYTU2IHwgLW1ldjYgfCAtbWFsbFxuIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiBBbHBoYSBhcmNoaXRlY3R1cmVcbiIKLSItbTIxMDY0IHwgLW0yMTA2NiB8IC1tMjExNjQgfCAtbTIxMTY0YSB8IC1tMjExNjRwYyB8IC1tMjEyNjRcbiIKLSJcdFx0XHR0aGVzZSB2YXJpYW50cyBpbmNsdWRlIFBBTGNvZGUgb3Bjb2Rlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjExMjkKLW1zZ2lkICIiCi0iVk1TIG9wdGlvbnM6XG4iCi0iLStcdFx0XHRoYXNoIGVuY29kZSAoZG9uJ3QgdHJ1bmNhdGUpIG5hbWVzIGxvbmdlciB0aGFuIDY0IGNoYXJhY3RlcnNcbiIKLSItSFx0XHRcdHNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGUgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTMxMQotbXNnaWQgIm5vbi1hYnNvbHV0ZSBleHByZXNzaW9uIGluIGNvbnN0YW50IGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjEzMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidHlwZSAlZCByZWxvYyBkb25lP1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjEzNzYgY29uZmlnL3RjLWFscGhhLmM6MTM4MyBjb25maWcvdGMtbWlwcy5jOjczNjIKLW1zZ2lkICJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTU2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVwcmVzZW50IGAlcycgcmVsb2NhdGlvbiBpbiBvYmplY3QgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxNTY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yPyBjYW5ub3QgZ2VuZXJhdGUgYCVzJyByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE2MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZnJhbWUgcmVnIGV4cGVjdGVkLCB1c2luZyAkJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE3NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gIWxpdGVyYWwhJWQgd2FzIGZvdW5kIgotbXNnc3RyICIiCi0KLSMuIG9ubHkgc3VwcG9ydCBvbmUgcmVsb2NhdGlvbiBvcCBwZXIgaW5zbgotIzogY29uZmlnL3RjLWFscGhhLmM6MTkzNQotbXNnaWQgIk1vcmUgdGhhbiBvbmUgcmVsb2NhdGlvbiBvcCBwZXIgaW5zbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxOTUyCi1tc2dpZCAiTm8gcmVsb2NhdGlvbiBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE5NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gIXNlcXVlbmNlLW51bWJlciBhZnRlciAhJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTk3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIHJlbG9jYXRpb24gb3BlcmFuZDogISVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE5ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIHNlcXVlbmNlIG51bWJlcjogISVzISVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIzMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVkIGFuZCAlZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjQzNCBjb25maWcvdGMtYXJjLmM6NTQ4IGNvbmZpZy90Yy1kMTB2LmM6NTk2Ci0jOiBjb25maWcvdGMtZDMwdi5jOjYzNiBjb25maWcvdGMtbW4xMDIwMC5jOjk5MCBjb25maWcvdGMtbW4xMDMwMC5jOjEzNjUKLSM6IGNvbmZpZy90Yy1wcGMuYzoxODE4IGNvbmZpZy90Yy1wcGMuYzoxOTI2IGNvbmZpZy90Yy1wcGMuYzoxOTM4Ci0jOiBjb25maWcvdGMtdjg1MC5jOjE4MTkgY29uZmlnL3RjLXY4NTAuYzoxODQyIGNvbmZpZy90Yy12ODUwLmM6MjA1NQotbXNnaWQgInRvbyBtYW55IGZpeHVwcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyNjQ1IGNvbmZpZy90Yy1hbHBoYS5jOjI3MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI2NDcgY29uZmlnL3RjLWFscGhhLmM6MjcxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjY1MSBjb25maWcvdGMtYWxwaGEuYzoyNzE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3Bjb2RlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjY5MSBjb25maWcvdGMtYWxwaGEuYzoyNzU4IGNvbmZpZy90Yy1hbHBoYS5jOjMyNjkKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjMzMjkgY29uZmlnL3RjLWFscGhhLmM6MzM4MSBjb25maWcvdGMtYWxwaGEuYzozNDU2Ci0jOiBjb25maWcvdGMtYWxwaGEuYzozNTQxIGNvbmZpZy90Yy1hbHBoYS5jOjM2NjcgY29uZmlnL3RjLWFscGhhLmM6Mzg0NAotIzogY29uZmlnL3RjLWFscGhhLmM6MzkwMSBjb25maWcvdGMtYWxwaGEuYzo0MDExIGNvbmZpZy90Yy1hbHBoYS5jOjQxMTgKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQxOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyNzc5Ci1tc2dpZCAiY2FuIG5vdCByZXNvbHZlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjkyMSBjb25maWcvdGMtYWxwaGEuYzozMTEzCi1tc2dpZCAib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdGEpIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI5MjggY29uZmlnL3RjLWFscGhhLmM6Mjk1MSBjb25maWcvdGMtYWxwaGEuYzozMTI2Ci0jOiBjb25maWcvdGMtYWxwaGEuYzozNDcwIGNvbmZpZy90Yy1hbHBoYS5jOjM1NDggY29uZmlnL3RjLWFscGhhLmM6MzU5NgotIzogY29uZmlnL3RjLWFscGhhLmM6MzY5NiBjb25maWcvdGMtYWxwaGEuYzozOTIxIGNvbmZpZy90Yy1hbHBoYS5jOjQwMzMKLW1zZ2lkICJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjkzMCBjb25maWcvdGMtYWxwaGEuYzoyOTUzIGNvbmZpZy90Yy1hbHBoYS5jOjMxMjgKLW1zZ2lkICJtYWNybyByZXF1aXJlcyAkYXQgd2hpbGUgJGF0IGluIHVzZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozMDc1IGV4cHIuYzo4NiByZWFkLmM6MzE1MQotbXNnaWQgImJpZ251bSBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzA3NyBleHByLmM6ODggcmVhZC5jOjMxNTMgcmVhZC5jOjM0ODkgcmVhZC5jOjQzODcKLW1zZ2lkICJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjMwODIKLW1zZ2lkICJjYW4ndCBoYW5kbGUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozMTE5Ci1tc2dpZCAib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdDgpIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjMyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGluc3RydWN0aW9uIGZvcm1hdCBmb3IgbGRhICElcyElZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MjkxIGNvbmZpZy90Yy1wcGMuYzoxMzQ1IGNvbmZpZy90Yy1wcGMuYzozNTU1Ci0jOiByZWFkLmM6MTM2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzMjkgY29uZmlnL3RjLWFscGhhLmM6NDMzOCBjb25maWcvdGMtcHBjLmM6MzU5MgotIzogcmVhZC5jOjEzODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0NDQwIGVjb2ZmLmM6MzEwOQotbXNnaWQgIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ0NDgKLW1zZ2lkICJuZXN0ZWQgLmVudCBkaXJlY3RpdmVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ0ODQgZWNvZmYuYzozMDU3Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDQ5MwotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIG5hbWVzIGRpZmZlcmVudCBzeW1ib2wgdGhhbiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ1NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBhcmd1bWVudCAlZCB0byAucHJvbG9ndWUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ1OTYKLW1zZ2lkICJFQ09GRiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ2MTcKLW1zZ2lkICJVbmtub3duIHNlY3Rpb24gZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ2NTQKLW1zZ2lkICIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ2ODIKLW1zZ2lkICJCYWQgLmZyYW1lIGRpcmVjdGl2ZSAxLi8yLiBwYXJhbSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0Njk0Ci1tc2dpZCAiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMy4vNC4gcGFyYW0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDcxOQotbXNnaWQgIi5wZGVzYyBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ3MjcKLW1zZ2lkICIucGRlc2MgaGFzIG5vIG1hdGNoaW5nIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDczOAotbXNnaWQgIi5wZGVzYyBkaXJlY3RpdmUgaGFzIG5vIGVudHJ5IHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0NzUxCi1tc2dpZCAiTm8gY29tbWEgYWZ0ZXIgLnBkZXNjIDxlbnRyeW5hbWU+IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ3NzQKLW1zZ2lkICJ1bmtub3duIHByb2NlZHVyZSBraW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ4NjkKLW1zZ2lkICIubmFtZSBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ4NzcKLW1zZ2lkICIubmFtZSBkaXJlY3RpdmUgaGFzIG5vIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0OTEyCi1tc2dpZCAiTm8gc3ltYm9sIGFmdGVyIC5saW5rYWdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQ5NDEKLW1zZ2lkICJObyBzeW1ib2wgYWZ0ZXIgLmNvZGVfYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0OTc2IGVjb2ZmLmM6MzI3NAotbXNnaWQgIkJhZCAubWFzayBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDk5OCBlY29mZi5jOjMyMDUKLW1zZ2lkICJCYWQgLmZtYXNrIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo1MTY5IGNvbmZpZy90Yy1hcm0uYzoxMzI4IHJlYWQuYzoyMTQyIHJlYWQuYzoyNzIyCi0jOiBzdGFicy5jOjQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jLiAqc3ltYm9sX2dldF9vYmogKHN5bWJvbFApID0gKHNpZ25lZCBjaGFyKSB0ZW1wOwotIzogY29uZmlnL3RjLWFscGhhLmM6NTE4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQ6IC5wcm9jICVzLCVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjUyMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHJpZWQgdG8gLnNldCB1bnJlY29nbml6ZWQgbW9kZSBgJXMnIgotbXNnc3RyICIiCi0KLSMuIG5vdCBmYXRhbCwgYnV0IGl0IG1pZ2h0IG5vdCB3b3JrIGluIHRoZSBlbmQKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjUyMzIKLW1zZ2lkICJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NTI0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgYmFzZSByZWdpc3RlciwgdXNpbmcgJCVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo1MjcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjUyNzUgY29uZmlnL3RjLWQzMHYuYzoyMTgyCi1tc2dpZCAiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NTU4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDaG9zZSBHUCB2YWx1ZSBvZiAlbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTM3Ci1tc2dpZCAiIgotIkFSQyBvcHRpb25zOlxuIgotIi1FQlx0XHRcdGdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG4iCi0iLUVMXHRcdFx0Z2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBvdXRwdXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTU1IGNvbmZpZy90Yy1hcmMuYzoxNzggY29uZmlnL3RjLWFyYy5jOjkyMgotIzogY29uZmlnL3RjLWhwcGEuYzoxMzQ3IGNvbmZpZy90Yy1ocHBhLmM6NjczNCBjb25maWcvdGMtaHBwYS5jOjY3NDAKLSM6IGNvbmZpZy90Yy1ocHBhLmM6Njc0NiBjb25maWcvdGMtaHBwYS5jOjY3NTIgY29uZmlnL3RjLW1uMTAzMDAuYzo4ODMKLSM6IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTk5MwotbXNnaWQgImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxNzUKLW1zZ2lkICJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjI1NCBjb25maWcvdGMtbW4xMDIwMC5jOjEzNTQgY29uZmlnL3RjLW1uMTAzMDAuYzoxOTA0Ci0jOiBjb25maWcvdGMtcHBjLmM6MTEwMiBjb25maWcvdGMtdjg1MC5jOjE2MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6Mzg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gc3ludGF4IGZvcm1hdCBjaGFyYWN0ZXIgYCVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NDg4Ci1tc2dpZCAidG9vIG1hbnkgc3VmZml4ZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjUzMyBjb25maWcvdGMtZDEwdi5jOjUwNSBjb25maWcvdGMtZDMwdi5jOjU1MQotIzogY29uZmlnL3RjLW1uMTAyMDAuYzo5MzIgY29uZmlnL3RjLW1uMTAzMDAuYzoxMjkxIGNvbmZpZy90Yy1wcGMuYzoxODUwCi0jOiBjb25maWcvdGMtdGljODAuYzoyODcgY29uZmlnL3RjLXY4NTAuYzoyMDMwCi1tc2dpZCAiaWxsZWdhbCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2MjAgY29uZmlnL3RjLW1uMTAyMDAuYzoxMDMxIGNvbmZpZy90Yy1tbjEwMzAwLmM6MTQzNQotIzogY29uZmlnL3RjLXBwYy5jOjE5NzUgY29uZmlnL3RjLXY4NTAuYzoyMTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjY2MAotbXNnaWQgIjggYnl0ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2NjIKLW1zZ2lkICI4IGJ5dGUganVtcCBpbnN0cnVjdGlvbiB3aXRoIGRlbGF5IHNsb3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjY3MAotbXNnaWQgImNvbmRpdGlvbmFsIGJyYW5jaCBmb2xsb3dzIHNldCBvZiBmbGFncyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NzQ5IGNvbmZpZy90Yy1hcm0uYzo2MzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBpbnN0cnVjdGlvbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo3NzIKLW1zZ2lkICJleHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6Nzg5Ci1tc2dpZCAiaWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo4MDQKLW1zZ2lkICJleHBlY3RlZCBjb21tYSBhZnRlciBjb21tb24gbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo4OTcKLW1zZ2lkICIuY3B1IGNvbW1hbmQgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjkxNgotbXNnaWQgIi5jcHUgY29uZmxpY3RzIHdpdGggcHJldmlvdXMgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjkyNwotbXNnaWQgImJhZCAuY3B1IG9wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5NTEgY29uZmlnL3RjLXBwYy5jOjI2MjMKLW1zZ2lkICJtaXNzaW5nIHJlbmFtZSBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjk2MwotbXNnaWQgImludmFsaWQgc3ltYm9sIHRvIHJlbmFtZSB0byIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTAxMCBjb25maWcvdGMtZDEwdi5jOjI4NCBjb25maWcvdGMtZDMwdi5jOjM2NgotIzogY29uZmlnL3RjLW1pcHMuYzo4NzY5IGNvbmZpZy90Yy1tbjEwMjAwLmM6MzU1IGNvbmZpZy90Yy1wai5jOjM2NQotIzogY29uZmlnL3RjLXBwYy5jOjQzODQgY29uZmlnL3RjLXNoLmM6MTczNiBjb25maWcvdGMtdjg1MC5jOjEyNzYKLW1zZ2lkICJiYWQgY2FsbCB0byBtZF9hdG9mIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMDk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1pc3NpbmcgJyknIGluICUtb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjExMzEKLW1zZ2lkICJleHByZXNzaW9uIHRvbyBjb21wbGV4IGZvciAlJXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMzI2IGNvbmZpZy90Yy1hcm0uYzozMTQ2IGNvbmZpZy90Yy1kMTB2LmM6MTQ3NQotIzogY29uZmlnL3RjLWQzMHYuYzoxODI4IGNvbmZpZy90Yy1taXBzLmM6MzI1MiBjb25maWcvdGMtbWlwcy5jOjQxODQKLSM6IGNvbmZpZy90Yy1taXBzLmM6NDk2OSBjb25maWcvdGMtbWlwcy5jOjU1MTUgY29uZmlnL3RjLXBwYy5jOjQ3MjAKLSM6IGNvbmZpZy90Yy12ODUwLmM6MjMzOAotbXNnaWQgImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEzOTIgY29uZmlnL3RjLXBwYy5jOjQ4MjMgY29uZmlnL3RjLXY4NTAuYzoyMzgyCi1tc2dpZCAidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTQ1NyBjb25maWcvdGMtc3BhcmMuYzozMTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEwMjUKLW1zZ2lkICJMaXRlcmFsIFBvb2wgT3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExNjgKLW1zZ2lkICJJbnZhbGlkIHN5bnRheCBmb3IgLnJlcSBkaXJlY3RpdmUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMjQwIGNvbmZpZy90Yy1taXBzLmM6OTkyNCByZWFkLmM6MjAzMQotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEyNDMgcmVhZC5jOjIwMzYKLW1zZ2lkICJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEzNzcgY29uZmlnL3RjLW0zMnIuYzo0MTEgcmVhZC5jOjI3ODEgcmVhZC5jOjQ4NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDQ3Ci1tc2dpZCAic2VsZWN0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgVEhVTUIgb3Bjb2RlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTQ1OQotbXNnaWQgInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IEFSTSBvcGNvZGVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgaW5zdHJ1Y3Rpb24gc2l6ZSBzZWxlY3RlZCAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb3BlcmFuZCB0byAuY29kZSBkaXJlY3RpdmUgKCVkKSAoZXhwZWN0aW5nIDE2IG9yIDMyKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTUxNAotbXNnaWQgIkdhcmJhZ2UgZm9sbG93aW5nIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uCi0jOiBjb25maWcvdGMtYXJtLmM6MTU2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWdpc3RlciBleHBlY3RlZCwgbm90ICclLjEwMHMnIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uCi0jOiBjb25maWcvdGMtYXJtLmM6MTU5MAotbXNnaWQgIjxwc3IoZik+IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjIwCi1tc2dpZCAiSWxsZWdhbCBjby1wcm9jZXNzb3IgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjI3Ci1tc2dpZCAiQmFkIG9yIG1pc3NpbmcgY28tcHJvY2Vzc29yIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTY1MQotbXNnaWQgImJhZCBvciBtaXNzaW5nIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE2NTcKLW1zZ2lkICJpbW1lZGlhdGUgY28tcHJvY2Vzc29yIGV4cHJlc3Npb24gdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uCi0jOiBjb25maWcvdGMtYXJtLmM6MTY4MgotbXNnaWQgIkNvLXByb2Nlc3NvciByZWdpc3RlciBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jLiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0jLiB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuLgotIzogY29uZmlnL3RjLWFybS5jOjE3MDYKLW1zZ2lkICJGbG9hdGluZyBwb2ludCByZWdpc3RlciBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTcyMwotbXNnaWQgImltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNzM4Ci1tc2dpZCAiY28tcHJvY2Vzc29yIGFkZHJlc3MgbXVzdCBiZSB3b3JkIGFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE3NDQKLW1zZ2lkICJvZmZzZXQgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNzkyCi1tc2dpZCAicGMgbWF5IG5vdCBiZSB1c2VkIGluIHBvc3QtaW5jcmVtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxODA4IGNvbmZpZy90Yy1hcm0uYzoyOTM4Ci1tc2dpZCAicHJlLWluZGV4ZWQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTgyMSBjb25maWcvdGMtYXJtLmM6Mjk1MCBjb25maWcvdGMtYXJtLmM6MzI5MgotbXNnaWQgIm1pc3NpbmcgXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTgzMQotbXNnaWQgInBjIG1heSBub3QgYmUgdXNlZCB3aXRoIHdyaXRlLWJhY2siCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE4ODUKLW1zZ2lkICI8cHNyPiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTk0NiBjb25maWcvdGMtYXJtLmM6MjU2MAotbXNnaWQgIlJlZ2lzdGVyIG9yIHNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE5NjAgY29uZmlnL3RjLWFybS5jOjIyNzUgY29uZmlnL3RjLWFybS5jOjI1MjcKLSM6IGNvbmZpZy90Yy1hcm0uYzoyNTQ3Ci1tc2dpZCAiSW52YWxpZCBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTk3MQotbXNnaWQgIkVycm9yOiB1bnJlY29nbmlzZWQgc3ludGF4IGZvciBzZWNvbmQgYXJndW1lbnQgdG8gbXNyIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMDIwCi1tc2dpZCAicmRoaSwgcmRsbyBhbmQgcm0gbXVzdCBhbGwgYmUgZGlmZmVyZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMDc2Ci1tc2dpZCAicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbXVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMTMyCi1tc2dpZCAicmQgYW5kIHJtIHNob3VsZCBiZSBkaWZmZXJlbnQgaW4gbWxhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMjU5Ci1tc2dpZCAiYmFkX3NlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIzMDUgY29uZmlnL3RjLWFybS5jOjIzODIKLW1zZ2lkICJTaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMzQ2Ci1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgc2hpZnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIzNzUKLW1zZ2lkICJzaGlmdCByZXF1aXJlcyByZWdpc3RlciBvciAjZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjM3NgotbXNnaWQgInNoaWZ0IHJlcXVpcmVzICNleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNTE4IGNvbmZpZy90Yy1hcm0uYzoyOTc5Ci1tc2dpZCAiQ29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjYxMwotbXNnaWQgIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI2MTYKLW1zZ2lkICJGbG9hdGluZyBwb2ludCByZWdpc3RlciBvciBpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjc4NQotbXNnaWQgImFkZHJlc3Mgb2Zmc2V0IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjg1NwotbXNnaWQgIlByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IGhhbGZ3b3JkcyBvciBzaWduZWQgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI4NzgKLW1zZ2lkICJBZGRyZXNzIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyOTA4IGNvbmZpZy90Yy1hcm0uYzoyOTIyIGNvbmZpZy90Yy1hcm0uYzoyOTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyOTA5IGNvbmZpZy90Yy1hcm0uYzoyOTIzIGNvbmZpZy90Yy1hcm0uYzoyOTYwCi1tc2dpZCAiZGVzdGluYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI5MDkgY29uZmlnL3RjLWFybS5jOjI5MjMgY29uZmlnL3RjLWFybS5jOjI5NjAKLW1zZ2lkICJzb3VyY2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI5OTkKLW1zZ2lkICJsaXRlcmFsIHBvb2wgaW5zZXJ0aW9uIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzAzNwotbXNnaWQgIlByZS1pbmNyZW1lbnQgaW5zdHJ1Y3Rpb24gd2l0aCB0cmFuc2xhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjMwNzgKLW1zZ2lkICJCYWQgcmFuZ2UgaW4gcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzA4NiBjb25maWcvdGMtYXJtLmM6MzA5NSBjb25maWcvdGMtYXJtLmM6MzEzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjMwOTgKLW1zZ2lkICJXYXJuaW5nOiBSZWdpc3RlciByYW5nZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozMTA5Ci1tc2dpZCAiTWlzc2luZyBgfSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjMxMjUKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG1hc2siCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjMxODQKLW1zZ2lkICJyMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzI1MiBjb25maWcvdGMtYXJtLmM6MzI2NgotbXNnaWQgInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNjE5IGNvbmZpZy90Yy12ODUwLmM6MTkyMSBjb25maWcvdGMtdjg1MC5jOjE5NDIKLW1zZ2lkICJjb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNjI1Ci1tc2dpZCAiQ29uc3RhbnQgdmFsdWUgcmVxdWlyZWQgZm9yIG51bWJlciBvZiByZWdpc3RlcnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM2MzMKLW1zZ2lkICJudW1iZXIgb2YgcmVnaXN0ZXJzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFsxOjRdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNjkzCi1tc2dpZCAiUjE1IG5vdCBhbGxvd2VkIGFzIGJhc2UgcmVnaXN0ZXIgd2l0aCB3cml0ZS1iYWNrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozOTQwCi1tc2dpZCAibG8gcmVnaXN0ZXIgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM5NDgKLW1zZ2lkICJoaSByZWdpc3RlciByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDAxNwotbXNnaWQgImRlc3QgYW5kIHNvdXJjZTEgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDAyNAotbXNnaWQgInN1YnRyYWN0IHZhbGlkIG9ubHkgb24gbG8gcmVncyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDA0OAotbXNnaWQgImludmFsaWQgSGkgcmVnaXN0ZXIgd2l0aCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQwNzUgY29uZmlnL3RjLWFybS5jOjQxMDggY29uZmlnL3RjLWFybS5jOjQxMTgKLW1zZ2lkICJpbW1lZGlhdGUgdmFsdWUgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MDg2Ci1tc2dpZCAiaW52YWxpZCBpbW1lZGlhdGUgdmFsdWUgZm9yIHN0YWNrIGFkanVzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDA5NwotbXNnaWQgImludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MTg0Ci1tc2dpZCAic291cmNlMSBhbmQgZGVzdCBtdXN0IGJlIHNhbWUgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyMTkKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSBmb3Igc2hpZnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyOTgKLW1zZ2lkICJvbmx5IGxvIHJlZ3MgYWxsb3dlZCB3aXRoIGltbWVkaWF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDMxNwotbXNnaWQgImludmFsaWQgaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MzcxCi1tc2dpZCAiZXhwZWN0ZWQgJ10nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NDM3Ci1tc2dpZCAiYnl0ZSBvciBoYWxmd29yZCBub3QgdmFsaWQgZm9yIGJhc2UgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ0NDIKLW1zZ2lkICJSMTUgYmFzZWQgc3RvcmUgbm90IGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ0NDcKLW1zZ2lkICJJbnZhbGlkIGJhc2UgcmVnaXN0ZXIgZm9yIHJlZ2lzdGVyIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDQ2NQotbXNnaWQgImludmFsaWQgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NDc2Ci1tc2dpZCAiaW52YWxpZCBiYXNlIHJlZ2lzdGVyIGluIGxvYWQvc3RvcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ1MDAKLW1zZ2lkICJJbnZhbGlkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDU3NAotbXNnaWQgImRlc3QgYW5kIHNvdXJjZTEgb25lIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ1ODIKLW1zZ2lkICJScyBhbmQgUmQgbXVzdCBiZSBkaWZmZXJlbnQgaW4gTVVMIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NzI2Ci1tc2dpZCAiIgotIkluc2VydGVkIG1pc3NpbmcgJyEnOiBsb2FkL3N0b3JlIG11bHRpcGxlIGFsd2F5cyB3cml0ZXMgYmFjayBiYXNlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NzQyIGNvbmZpZy90Yy1hcm0uYzo0ODQyCi1tc2dpZCAiRXhwcmVzc2lvbiB0b28gY29tcGxleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDc0OAotbXNnaWQgIm9ubHkgbG8tcmVncyB2YWxpZCBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0Nzk0Ci1tc2dpZCAiU3ludGF4OiBsZHJzW2JdIFJkLCBbUmIsIFJvXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDg1OAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbGlzdCB0byBwdXNoL3BvcCBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDk5NAotbXNnaWQgIlZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTM5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNvbnN0YW50ICglbHgpIGFmdGVyIGZpeHVwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBjb21wdXRlIEFEUkwgaW5zdHJ1Y3Rpb25zIGZvciBQQyBvZmZzZXQgb2YgMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW1tZWRpYXRlIHZhbHVlIGZvciBvZmZzZXQgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU0NzkgY29uZmlnL3RjLWFybS5jOjU1MDEKLW1zZ2lkICJpbnZhbGlkIGxpdGVyYWwgY29uc3RhbnQ6IHBvb2wgbmVlZHMgdG8gYmUgY2xvc2VyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBpbW1lZGlhdGUgdmFsdWUgZm9yIGhhbGYtd29yZCBvZmZzZXQgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1MTgKLW1zZ2lkICJzaGlmdCBleHByZXNzaW9uIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTUzNiBjb25maWcvdGMtYXJtLmM6NTU0NQotbXNnaWQgIkludmFsaWQgc3dpIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1NTUKLW1zZ2lkICJJbnZhbGlkIGV4cHJlc3Npb24gaW4gbG9hZC9zdG9yZSBtdWx0aXBsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTU4NCBjb25maWcvdGMtYXJtLmM6NTYwMCBjb25maWcvdGMtbWlwcy5jOjk3NTEKLW1zZ2lkICJCcmFuY2ggb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NjIyCi1tc2dpZCAiQnJhbmNoIHdpdGggbGluayBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU2ODkKLW1zZ2lkICJJbGxlZ2FsIHZhbHVlIGZvciBjby1wcm9jZXNzb3Igb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NzEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb2Zmc2V0LCB0YXJnZXQgbm90IHdvcmQgYWxpZ25lZCAoMHglMDhYKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTcxNyBjb25maWcvdGMtYXJtLmM6NTcyNiBjb25maWcvdGMtYXJtLmM6NTczMwotIzogY29uZmlnL3RjLWFybS5jOjU3NDAgY29uZmlnL3RjLWFybS5jOjU3NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBvZmZzZXQsIHZhbHVlIHRvbyBiaWcgKDB4JTA4WCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU3ODQKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSBmb3Igc3RhY2sgYWRkcmVzcyBjYWxjdWxhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTc5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSBmb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiAodmFsdWUgPSAweCUwOGxYKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTgwMwotbXNnaWQgIkludmFsaWQgOGJpdCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU4MTEKLW1zZ2lkICJJbnZhbGlkIDNiaXQgaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1ODI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlOiAlbGQgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1ODQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgVGh1bWIgc2hpZnQgdmFsdWU6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTg1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgcmVsb2NhdGlvbiBmaXh1cCB0eXBlICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU5MjYKLW1zZ2lkICJMaXRlcmFsIHJlZmVyZW5jZWQgYWNyb3NzIHNlY3Rpb24gYm91bmRhcnkgKEltcGxpY2l0IGR1bXA/KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTkzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKElNTUVESUFURSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU5NDUKLW1zZ2lkICJBRFJMIHVzZWQgZm9yIGEgc3ltYm9sIG5vdCBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU5NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChPRkZTRVRfSU1NKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTk3MSBjb25maWcvdGMtbWNvcmUuYzoyMTEwIGNvbmZpZy90Yy1uczMyay5jOjIyODMKLW1zZ2lkICI8dW5rbm93bj4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1OTk1IGNvbmZpZy90Yy1taXBzLmM6MTEyNDEgY29uZmlnL3RjLXNoLmM6Mjg1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MDEzCi1tc2dpZCAibWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjA4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBvcGVyYXRvciAtLSBzdGF0ZW1lbnQgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MTA2Ci1tc2dpZCAic2VsZWN0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYxNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3Bjb2RlIGAlcycgbXVzdCBoYXZlIHN1ZmZpeCBmcm9tIGxpc3Q6IDwlcz4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYxODAKLW1zZ2lkICJXYXJuaW5nOiBVc2Ugb2YgdGhlICdudicgY29uZGl0aW9uYWwgaXMgZGVwcmVjYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9wY29kZSBgJXMnIGlzIHVuY29uZGl0aW9uYWxcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjIyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGNvZGUgYCVzJyBtdXN0IGhhdmUgc3VmZml4IGZyb20gPCVzPlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MzA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyICclcycgZG9lcyBub3QgZXhpc3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjMxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjMxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iaWdub3JpbmcgcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVyIGFsaWFzICclcycgdG8gbm9uLWV4aXN0YW50IHJlZ2lzdGVyICclcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYzMjIKLW1zZ2lkICJpZ25vcmluZyBpbmNvbXBsZXRlIC5yZXEgcHNldXNvIG9wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBBUENTIHN3aXRjaCAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NjM0IGNvbmZpZy90Yy1hcm0uYzo2NjQ1IGNvbmZpZy90Yy1hcm0uYzo2NjU2Ci0jOiBjb25maWcvdGMtYXJtLmM6NjY2NyBjb25maWcvdGMtYXJtLmM6NjY3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBwcm9jZXNzb3IgdmFyaWFudCAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NzAzCi1tc2dpZCAiIgotIiBBUk0gU3BlY2lmaWMgQXNzZW1ibGVyIE9wdGlvbnM6XG4iCi0iICAtbVthcm1dWzxwcm9jZXNzb3IgbmFtZT5dIHNlbGVjdCBwcm9jZXNzb3IgdmFyaWFudFxuIgotIiAgLW1bYXJtXXZbMnwyYXwzfDNtfDR8NHR8NVt0XVtlXV0gc2VsZWN0IGFyY2hpdGVjdHVyZSB2YXJpYW50XG4iCi0iICAtbXRodW1iICAgICAgICAgICAgICAgICAgIG9ubHkgYWxsb3cgVGh1bWIgaW5zdHJ1Y3Rpb25zXG4iCi0iICAtbXRodW1iLWludGVyd29yayAgICAgICAgIG1hcmsgdGhlIGFzc2VtYmxlZCBjb2RlIGFzIHN1cHBvcnRpbmcgIgotImludGVyd29ya2luZ1xuIgotIiAgLW1hbGwgICAgICAgICAgICAgICAgICAgICBhbGxvdyBhbnkgaW5zdHJ1Y3Rpb25cbiIKLSIgIC1tZnBhMTAsIC1tZnBhMTEgICAgICAgICAgc2VsZWN0IGZsb2F0aW5nIHBvaW50IGFyY2hpdGVjdHVyZVxuIgotIiAgLW1mcGUtb2xkICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBmbG9hdGluZy1wb2ludCBtdWx0aXBsZSAiCi0iaW5zdHJ1Y3Rpb25zXG4iCi0iICAtbW5vLWZwdSAgICAgICAgICAgICAgICAgIGRvbid0IGFsbG93IGFueSBmbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY3MTQKLW1zZ2lkICIgIC1rICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgUElDIGNvZGUuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY3MTgKLW1zZ2lkICIiCi0iICAtbWFwY3MtMzIsIC1tYXBjcy0yNiAgICAgIHNwZWNpZnkgd2hpY2ggQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkIHRvICIKLSJ1c2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjcyMQotbXNnaWQgIiAgLW1hcGNzLWZsb2F0ICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCBhcmdzIGFyZSBwYXNzZWQgaW4gRlAgcmVnc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NzI0Ci1tc2dpZCAiIgotIiAgLW1hcGNzLXJlZW50cmFudCAgICAgICAgICB0aGUgY29kZSBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudC9yZWVudHJhbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjcyOQotbXNnaWQgIiAgLW1vYWJpICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvbGQgRUxGIEFCSVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NzM0Ci1tc2dpZCAiIgotIiAgLUVCICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gY3B1XG4iCi0iICAtRUwgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBjcHVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Njg4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBmdW5jdGlvbiB0eXBlOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjIyOAotbXNnaWQgIiIKLSJEMTBWIG9wdGlvbnM6XG4iCi0iLU8gICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUuICBXaWxsIGRvIHNvbWUgb3BlcmF0aW9ucyBpbiBwYXJhbGxlbC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjU0NyBjb25maWcvdGMtZDEwdi5jOjYyOSBjb25maWcvdGMtZDMwdi5jOjY1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZTogJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo2OTAKLW1zZ2lkICJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIHdpdGggYW5vdGhlciBpbnN0cnVjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3NDIKLW1zZ2lkICJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzQ1Ci1tc2dpZCAiTG9uZyBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBjb21iaW5lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3ODUKLW1zZ2lkICJPbmUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzkwIGNvbmZpZy90Yy1kMzB2LmM6ODYwCi1tc2dpZCAiVHdvIElVIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzkyIGNvbmZpZy90Yy1kMTB2LmM6ODAwIGNvbmZpZy90Yy1kMTB2LmM6ODE1Ci0jOiBjb25maWcvdGMtZDEwdi5jOjgyOCBjb25maWcvdGMtZDMwdi5jOjg2MSBjb25maWcvdGMtZDMwdi5jOjg3MAotbXNnaWQgIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6Nzk4IGNvbmZpZy90Yy1kMzB2LmM6ODY3Ci1tc2dpZCAiVHdvIE1VIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6ODE5IGNvbmZpZy90Yy1kMzB2LmM6ODg2Ci1tc2dpZCAiSVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgbGVmdCBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo4MzIgY29uZmlnL3RjLWQzMHYuYzo4OTkKLW1zZ2lkICJNVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSByaWdodCBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo4MzYgY29uZmlnL3RjLWQzMHYuYzo5MDcKLW1zZ2lkICJ1bmtub3duIGV4ZWN1dGlvbiB0eXBlIHBhc3NlZCB0byB3cml0ZV8yX3Nob3J0KCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMDQ5IGNvbmZpZy90Yy1kMTB2LmM6MTA2MyBjb25maWcvdGMtaDgzMDAuYzoxMjc5Ci0jOiBjb25maWcvdGMtaDg1MDAuYzoxMTIyIGNvbmZpZy90Yy1tY29yZS5jOjk4OSBjb25maWcvdGMtcGouYzoyNzQKLSM6IGNvbmZpZy90Yy1zaC5jOjEzNDkgY29uZmlnL3RjLXo4ay5jOjEyMjMKLW1zZ2lkICJjYW4ndCBmaW5kIG9wY29kZSAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMDc2IGNvbmZpZy90Yy1kMTB2LmM6MTA5NCBjb25maWcvdGMtZDMwdi5jOjEzODUKLW1zZ2lkICJVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMTQyIGNvbmZpZy90Yy1kMzB2LmM6MTUyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wY29kZTogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMjIzIGNvbmZpZy90Yy1kMTB2LmM6MTM2OSBjb25maWcvdGMtdGljODAuYzo1MzcKLW1zZ2lkICJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTI3MiBjb25maWcvdGMtbTY4ay5jOjQyMzIKLW1zZ2lkICJ2YWx1ZSBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMzQ0Ci1tc2dpZCAiaWxsZWdhbCBvcGVyYW5kIC0gcmVnaXN0ZXIgbmFtZSBmb3VuZCB3aGVyZSBub25lIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTM4MCBjb25maWcvdGMtdGljODAuYzo1NDgKLW1zZ2lkICJSZWdpc3RlciBudW1iZXIgbXVzdCBiZSBFVkVOIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTQxMiBjb25maWcvdGMtZDMwdi5jOjE3NzIgY29uZmlnL3RjLW1uMTAyMDAuYzoxMjMzCi0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjE3NjEgY29uZmlnL3RjLXBwYy5jOjUwMjAgY29uZmlnL3RjLXY4NTAuYzoyMjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTUyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiByZXAgb3IgcmVwaSBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgNCBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxNTQ0IGNvbmZpZy90Yy1kMzB2LmM6MTk1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWdpc3RlciBuYW1lICVzIGNvbmZsaWN0cyB3aXRoIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6Mjg5Ci1tc2dpZCAiIgotIlxuIgotIkQzMFYgb3B0aW9uczpcbiIKLSItTyAgICAgICAgICAgICAgICAgICAgICBNYWtlIGFkamFjZW50IHNob3J0IGluc3RydWN0aW9ucyBwYXJhbGxlbCBpZiAiCi0icG9zc2libGUuXG4iCi0iLW4gICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBhbGwgTk9QcyBpbnNlcnRlZCBieSB0aGUgYXNzZW1ibGVyLlxuIgotIi1OXHRcdFx0V2FybiBhYm91dCBOT1BzIGluc2VydGVkIGFmdGVyIHdvcmQgbXVsdGlwbGllcy5cbiIKLSItYyAgICAgICAgICAgICAgICAgICAgICBXYXJuIGFib3V0IHN5bWJvbHMgd2hvZXMgbmFtZXMgbWF0Y2ggcmVnaXN0ZXIgIgotIm5hbWVzLlxuIgotIi1DICAgICAgICAgICAgICAgICAgICAgIE9wcG9zaXRlIG9mIC1DLiAgLWMgaXMgdGhlIGRlZmF1bHQuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo0NjMKLW1zZ2lkICJ1bmV4cGVjdGVkIDEyLWJpdCByZWxvYyB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NDcwCi1tc2dpZCAidW5leHBlY3RlZCAxOC1iaXQgcmVsb2MgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjcxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBOT1AgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo3MTUKLW1zZ2lkICJzZXF1ZW50aWFsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NzE1Ci1tc2dpZCAicGFyYWxsZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo4NTYKLW1zZ2lkICJJbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjg2OSBjb25maWcvdGMtZDMwdi5jOjg3NiBjb25maWcvdGMtZDMwdi5jOjg5MgotIzogY29uZmlnL3RjLWQzMHYuYzo5MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjg4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzcGVjaWFsIGxlZnQgaW5zdHJ1Y3Rpb24gYCVzJyBraWxscyBpbnN0cnVjdGlvbiBgJXMnIGluIHJpZ2h0IGNvbnRhaW5lciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEyNjcgY29uZmlnL3RjLWQzMHYuYzoxMjg0Ci1tc2dpZCAiQ2Fubm90IGFzc2VtYmxlIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTI2OQotbXNnaWQgIkZpcnN0IG9wY29kZSBpcyBsb25nLiAgVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEzMzcKLW1zZ2lkICJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCBsb2FkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTMzOQotbXNnaWQgIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIDE2LWJpdCBtdWx0aXBseSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEzNjkKLW1zZ2lkICJJbnN0cnVjdGlvbiB1c2VzIGxvbmcgdmVyc2lvbiwgc28gaXQgY2Fubm90IGJlIG1peGVkIGFzIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE0NTMgY29uZmlnL3RjLWQzMHYuYzoxNDkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gY29uZGl0aW9uIGNvZGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjbXB1IGRvZXNuJ3Qgc3VwcG9ydCBjb25kaXRpb24gY29kZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE1MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZHMgZm9yIG9wY29kZSBgJXMnIGRvIG5vdCBtYXRjaCBhbnkgdmFsaWQgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTc0NAotbXNnaWQgIk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIGJ5dGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgYnl0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIHNob3J0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTg1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIHNob3J0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTg2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgcXVhZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjIwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidmFsdWUgdG9vIGxhcmdlIHRvIGZpdCBpbiAlZCBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MjE3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1mcjMwLmM6ODQKLW1zZ2lkICIgRlIzMCBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZnIzMC5jOjE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnN0cnVjdGlvbiAlcyBub3QgYWxsb3dlZCBpbiBhIGRlbGF5IHNsb3QuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1mcjMwLmM6MzgwIGNvbmZpZy90Yy1tMzJyLmM6MTUzMAotbXNnaWQgIkFkZGVuZCB0byB1bnJlc29sdmVkIHN5bWJvbCBub3Qgb24gd29yZCBib3VuZGFyeS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWZyMzAuYzo1MzggY29uZmlnL3RjLWk5NjAuYzo3ODYgY29uZmlnL3RjLW0zMnIuYzoxODM3Ci1tc2dpZCAiQmFkIGNhbGwgdG8gbWRfYXRvZigpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjI1NCBjb25maWcvdGMtaDgzMDAuYzoyNjIKLW1zZ2lkICJSZWcgbm90IHZhbGlkIGZvciBIOC8zMDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6NDIzIGNvbmZpZy90Yy1oODMwMC5jOjQyNiBjb25maWcvdGMtaDgzMDAuYzo0MjkKLSM6IGNvbmZpZy90Yy1oODMwMC5jOjQzMwotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjQ5MCBjb25maWcvdGMtaDgzMDAuYzo1NTMgY29uZmlnL3RjLWg4MzAwLmM6NTYwCi1tc2dpZCAiV3Jvbmcgc2l6ZSBwb2ludGVyIHJlZ2lzdGVyIGZvciBhcmNoaXRlY3R1cmUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjUxOCBjb25maWcvdGMtaDgzMDAuYzo1MjcgY29uZmlnL3RjLWg4MzAwLmM6NTM3Ci1tc2dpZCAiZXhwZWN0ZWQgQChleHAsIHJlZzE2KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo2MTcKLW1zZ2lkICJleHBlY3QgOjggb3IgOjE2IGhlcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6ODIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgJXMweCVseCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjkxMAotbXNnaWQgIkNhbid0IHdvcmsgb3V0IHNpemUgb2Ygb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo5NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3Bjb2RlIGAlcycgd2l0aCB0aGVzZSBvcGVyYW5kIHR5cGVzIG5vdCBhdmFpbGFibGUgaW4gSDgvMzAwIG1vZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTAxNiBjb25maWcvdGMtaDgzMDAuYzoxMDM2Ci1tc2dpZCAiTmVlZCAjMSBvciAjMiBoZXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEwMzEKLW1zZ2lkICIjNCBub3QgdmFsaWQgb24gSDgvMzAwLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMTEyIGNvbmZpZy90Yy1oODMwMC5jOjExNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYnJhbmNoIG9wZXJhbmQgaGFzIG9kZCBvZmZzZXQgKCVseClcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMTkxCi1tc2dpZCAiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2IGJpdCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjAxCi1tc2dpZCAic291cmNlIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjA5Ci1tc2dpZCAiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTIxNgotbXNnaWQgImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjI1Ci1tc2dpZCAic291cmNlIG9wZXJhbmQgbXVzdCBiZSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMzMKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyOTAgY29uZmlnL3RjLWg4NTAwLmM6MTEyOSBjb25maWcvdGMtbWlwcy5jOjc5NjUKLSM6IGNvbmZpZy90Yy1zaC5jOjE1NzggY29uZmlnL3RjLXc2NS5jOjc1OSBjb25maWcvdGMtejhrLmM6MTIzNQotbXNnaWQgInVua25vd24gb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEzMzYKLW1zZ2lkICJtaXNtYXRjaCBiZXR3ZWVuIG9wY29kZSBzaXplIGFuZCBvcGVyYW5kIHNpemUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTM0OCBjb25maWcvdGMtaDg1MDAuYzoxMTU3IGNvbmZpZy90Yy1zaC5jOjE2OTIKLSM6IGNvbmZpZy90Yy13NjUuYzo3OTEgY29uZmlnL3RjLXo4ay5jOjEyOTAKLW1zZ2lkICJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMzYyIGNvbmZpZy90Yy1oODUwMC5jOjExNzEgY29uZmlnL3RjLXNoLmM6MTY5OQotIzogY29uZmlnL3RjLXc2NS5jOjgwNSBjb25maWcvdGMtejhrLmM6MTMwNAotbXNnaWQgImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjE0NTEgY29uZmlnL3RjLWg4NTAwLmM6MTI2MCBjb25maWcvdGMtejhrLmM6MTQxNQotbXNnaWQgImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTQ2MSBjb25maWcvdGMtejhrLmM6MTQyNQotbXNnaWQgImNhbGwgdG8gbWRfY29udmVydF9mcmFnIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjE1MDYgY29uZmlnL3RjLXo4ay5jOjE1MDAKLW1zZ2lkICJjYWxsIHRvbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6MzM3Ci1tc2dpZCAiOjI0IG5vdCB2YWxpZCBmb3IgdGhpcyBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6MzQ0Ci1tc2dpZCAiZXhwZWN0IDo4LDoxNiBvciA6MjQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NDAxCi1tc2dpZCAic3ludGF4IGVycm9yIGluIHJlZyBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjQxOQotbXNnaWQgIm1pc3NpbmcgZmluYWwgcmVnaXN0ZXIgaW4gcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NTA2IGNvbmZpZy90Yy1oODUwMC5jOjUxMyBjb25maWcvdGMtaDg1MDAuYzo1MTkKLW1zZ2lkICJleHBlY3RlZCBAKGV4cCwgUm4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjUzNQotbXNnaWQgIkBSbisgbmVlZHMgd29yZCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo1NDUKLW1zZ2lkICJAUm4gbmVlZHMgd29yZCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo4NDUgY29uZmlnL3RjLXNoLmM6MTE0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo4NzMgY29uZmlnL3RjLXNoLmM6MTE2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjk2MyBjb25maWcvdGMtc2guYzoxMjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCBmb3IgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzoxMTQ1IGNvbmZpZy90Yy1zaC5jOjEzODggY29uZmlnL3RjLXNoLmM6MTYyNgotIzogY29uZmlnL3RjLXc2NS5jOjc3OQotbXNnaWQgImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjExNDAKLW1zZ2lkICJNaXNzaW5nIC5leGl0XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMTQzCi1tc2dpZCAiTWlzc2luZyAucHJvY2VuZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTMyMgotbXNnaWQgIkludmFsaWQgZmllbGQgc2VsZWN0b3IuICBBc3N1bWluZyBGJSUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTM1MwotbXNnaWQgIi1SIG9wdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdGFyZ2V0LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEzNjkgY29uZmlnL3RjLXNwYXJjLmM6NzM2IGNvbmZpZy90Yy1zcGFyYy5jOjc3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTM3NyBjb25maWcvdGMtaTg2MC5jOjE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE0NDYgY29uZmlnL3RjLWhwcGEuYzo2ODczIGNvbmZpZy90Yy1ocHBhLmM6NjkyOAotbXNnaWQgIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MgKGNvcnJ1cHRlZCBsYWJlbCBjaGFpbikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNDQ5IGNvbmZpZy90Yy1ocHBhLmM6NjkzMQotbXNnaWQgIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNTcwIGNvbmZpZy90Yy1ocHBhLmM6NDcxNQotbXNnaWQgImNvdWxkIG5vdCB1cGRhdGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTc4MwotbXNnaWQgIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNzg4Ci1tc2dpZCAiSW52YWxpZCBJbmRleGVkIExvYWQgQ29tcGxldGVyIFN5bnRheC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxODI0Ci1tc2dpZCAiSW52YWxpZCBTaG9ydCBMb2FkL1N0b3JlIENvbXBsZXRlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxODgzIGNvbmZpZy90Yy1ocHBhLmM6MTg4OAotbXNnaWQgIkludmFsaWQgU3RvcmUgQnl0ZXMgU2hvcnQgQ29tcGxldGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjE5OSBjb25maWcvdGMtaHBwYS5jOjIyMDUKLW1zZ2lkICJJbnZhbGlkIGxlZnQvcmlnaHQgY29tYmluYXRpb24gY29tcGxldGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjI1NCBjb25maWcvdGMtaHBwYS5jOjIyNjEKLW1zZ2lkICJJbnZhbGlkIHBlcm11dGF0aW9uIGNvbXBsZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIzNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBBZGQgQ29uZGl0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIzNzMgY29uZmlnL3RjLWhwcGEuYzoyMzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgQWRkIGFuZCBCcmFuY2ggQ29uZGl0aW9uOiAlYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjI0MDQKLW1zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjQ0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIEJpdCBCcmFuY2ggQ29uZGl0aW9uOiAlYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjI1MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyNTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgQ29tcGFyZS9TdWJ0cmFjdCBDb25kaXRpb246ICVjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjU1NwotbXNnaWQgIkludmFsaWQgQ29tcGFyZSBhbmQgQnJhbmNoIENvbmRpdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyNjU1Ci1tc2dpZCAiSW52YWxpZCBMb2dpY2FsIEluc3RydWN0aW9uIENvbmRpdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyNzExCi1tc2dpZCAiSW52YWxpZCBTaGlmdC9FeHRyYWN0L0RlcG9zaXQgQ29uZGl0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjI4MjMKLW1zZ2lkICJJbnZhbGlkIFVuaXQgSW5zdHJ1Y3Rpb24gQ29uZGl0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjMwOTYgY29uZmlnL3RjLWhwcGEuYzozMTI5IGNvbmZpZy90Yy1ocHBhLmM6MzE2NgotIzogY29uZmlnL3RjLWhwcGEuYzozMjA1Ci1tc2dpZCAiQnJhbmNoIHRvIHVuYWxpZ25lZCBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzM4OQotbXNnaWQgIkludmFsaWQgU0ZVIGlkZW50aWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNDM5Ci1tc2dpZCAiSW52YWxpZCBDT1BSIGlkZW50aWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNTY4Ci1tc2dpZCAiSW52YWxpZCBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNzA2IGNvbmZpZy90Yy1ocHBhLmM6MzczMCBjb25maWcvdGMtaHBwYS5jOjM3NTMKLSM6IGNvbmZpZy90Yy1ocHBhLmM6Mzc3NiBjb25maWcvdGMtaHBwYS5jOjM3OTkKLW1zZ2lkICJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM4NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBvcGVyYW5kcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0MTUKLW1zZ2lkICJVbmtub3duIHJlbG9jYXRpb24gZW5jb3VudGVyZWQgaW4gbWRfYXBwbHlfZml4LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gaHBwYV9maXh1cCBlbnRyeSBmb3IgdGhpcyBmaXh1cCAoZml4UCA9IDB4JXgsIHR5cGUgPSAweCV4KVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDU2NyBjb25maWcvdGMtaHBwYS5jOjQ1OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5kZWZpbmVkIHJlZ2lzdGVyOiAnJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ2MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm9uLWFic29sdXRlIHN5bWJvbDogJyVzJy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZGVmaW5lZCBhYnNvbHV0ZSBjb25zdGFudDogJyVzJy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NzU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgRlAgQ29tcGFyZSBDb25kaXRpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIEZURVNUIGNvbXBsZXRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0ODc3IGNvbmZpZy90Yy1ocHBhLmM6NDkxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIEZQIE9wZXJhbmQgRm9ybWF0OiAlM3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0OTk0Ci1tc2dpZCAiQmFkIHNlZ21lbnQgaW4gZXhwcmVzc2lvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MDUzCi1tc2dpZCAiQmFkIHNlZ21lbnQgKHNob3VsZCBiZSBhYnNvbHV0ZSkuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGxvY2F0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTE4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGRlc2NyaXB0aW9uOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBOdWxsaWZpY2F0aW9uOiAoJWMpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTk1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIC5DQUxMIGFyZ3VtZW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjYwODIKLW1zZ2lkICIuY2FsbGluZm8gaXMgbm90IHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjEwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJGUkFNRSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDg6ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MTIxCi1tc2dpZCAiVmFsdWUgZm9yIEVOVFJZX0dSIG11c3QgYmUgaW4gdGhlIHJhbmdlIDMuLjE4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MTMzCi1tc2dpZCAiVmFsdWUgZm9yIEVOVFJZX0ZSIG11c3QgYmUgaW4gdGhlIHJhbmdlIDEyLi4yMVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjE0MwotbXNnaWQgIlZhbHVlIGZvciBFTlRSWV9TUiBtdXN0IGJlIDNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjYxOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCAuQ0FMTElORk8gYXJndW1lbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjI5MwotbXNnaWQgIlRoZSAuRU5URVIgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MzA5Ci1tc2dpZCAiTWlzcGxhY2VkIC5lbnRyeS4gSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2MzEzCi1tc2dpZCAiTWlzc2luZyAuY2FsbGluZm8uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjM2MQotbXNnaWQgIi5SRUcgbXVzdCB1c2UgYSBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjYzNjMKLW1zZ2lkICIuRVFVIG11c3QgdXNlIGEgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2NDE2Ci1tc2dpZCAiLkVYSVQgbXVzdCBhcHBlYXIgd2l0aGluIGEgcHJvY2VkdXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjQyMAotbXNnaWQgIk1pc3NpbmcgLmNhbGxpbmZvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjQyNAotbXNnaWQgIk5vIC5FTlRSWSBmb3IgdGhpcyAuRVhJVCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY0NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IGRlZmluZSBleHBvcnQgc3ltYm9sOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2luZyBFTlRSWSByYXRoZXIgdGhhbiBDT0RFIGluIGV4cG9ydCBkaXJlY3RpdmUgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjYxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmRlZmluZWQgLkVYUE9SVC8uSU1QT1JUIGFyZ3VtZW50IChpZ25vcmVkKTogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2Njk1Ci1tc2dpZCAiTWlzc2luZyBsYWJlbCBuYW1lIG9uIC5MQUJFTCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY3MDAKLW1zZ2lkICJleHRyYSAuTEFCRUwgYXJndW1lbnRzIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjcxNwotbXNnaWQgIlRoZSAuTEVBVkUgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2NzU2Ci1tc2dpZCAiVW5yZWNvZ25pemVkIC5MRVZFTCBhcmd1bWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6Njc5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgZGVmaW5lIHN0YXRpYyBzeW1ib2w6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2ODI3Ci1tc2dpZCAiTmVzdGVkIHByb2NlZHVyZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2ODM3Ci1tc2dpZCAiQ2Fubm90IGFsbG9jYXRlIHVud2luZCBkZXNjcmlwdG9yXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2OTM1Ci1tc2dpZCAibWlzcGxhY2VkIC5wcm9jZW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjkzOAotbXNnaWQgIk1pc3NpbmcgLmNhbGxpbmZvIGZvciB0aGlzIHByb2NlZHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY5NDEKLW1zZ2lkICJNaXNzaW5nIC5FWElUIGZvciBhIC5FTlRSWSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY5ODAKLW1zZ2lkICJOb3QgaW4gYSBzcGFjZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY5ODMKLW1zZ2lkICJOb3QgaW4gYSBzdWJzcGFjZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjcwNzMKLW1zZ2lkICJJbnZhbGlkIC5TUEFDRSBhcmd1bWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjcxMjEKLW1zZ2lkICJDYW4ndCBjaGFuZ2Ugc3BhY2VzIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLiBJZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NzI0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmRlZmluZWQgc3BhY2U6ICclcycgQXNzdW1pbmcgc3BhY2UgbnVtYmVyID0gMC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo3MjcyCi1tc2dpZCAiTXVzdCBiZSBpbiBhIHNwYWNlIGJlZm9yZSBjaGFuZ2luZyBvciBkZWNsYXJpbmcgc3Vic3BhY2VzLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NzI3NgotbXNnaWQgIkNhbid0IGNoYW5nZSBzdWJzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo3MzExCi1tc2dpZCAiUGFyYW1ldGVycyBvZiBhbiBleGlzdGluZyBzdWJzcGFjZSBjYW4ndCBiZSBtb2RpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjczNjIKLW1zZ2lkICJBbGlnbm1lbnQgbXVzdCBiZSBhIHBvd2VyIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo3NDA0Ci1tc2dpZCAiRklSU1Qgbm90IHN1cHBvcnRlZCBhcyBhIC5TVUJTUEFDRSBhcmd1bWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjc0MDYKLW1zZ2lkICJJbnZhbGlkIC5TVUJTUEFDRSBhcmd1bWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjc1ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IFVuYWJsZSB0byBmaW5kIGNvbnRhaW5pbmcgc3BhY2UgZm9yICVzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjc2MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3V0IG9mIG1lbW9yeTogY291bGQgbm90IGFsbG9jYXRlIG5ldyBzcGFjZSBjaGFpbiBlbnRyeTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjc3MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3V0IG9mIG1lbW9yeTogY291bGQgbm90IGFsbG9jYXRlIG5ldyBzdWJzcGFjZSBjaGFpbiBlbnRyeTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjgzODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sICclcycgY291bGQgbm90IGJlIGNyZWF0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6ODM4NwotbXNnaWQgIk5vIG1lbW9yeSBmb3Igc3ltYm9sIG5hbWUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NTA5Ci1tc2dpZCAic2FtZSB0eXBlIG9mIHByZWZpeCB1c2VkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NTUyCi1tc2dpZCAiQmFkIGFyZ3VtZW50IHRvIHN5bnRheCBkaXJlY3RpdmUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NjM2IGNvbmZpZy90Yy1tNjhrLmM6Mzc1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBFcnJvcjogIENhbid0IGhhc2ggJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6ODY2Ci1tc2dpZCAiVW5rbm93biIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjkxNCBjb25maWcvdGMtaTM4Ni5jOjQ0MDcgY29uZmlnL3RjLW02OGsuYzo3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo5MjQgY29uZmlnL3RjLWkzODYuYzo0NDIxIGNvbmZpZy90Yy1tNjhrLmM6Nzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTAzMCBjb25maWcvdGMtaTM4Ni5jOjExMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gc3VjaCAzODYgaW5zdHJ1Y3Rpb246IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY2hhcmFjdGVyICVzIGluIG1uZW1vbmljIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTA0NgotbXNnaWQgImV4cGVjdGluZyBwcmVmaXg7IGdvdCBub3RoaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTA0OAotbXNnaWQgImV4cGVjdGluZyBtbmVtb25pYzsgZ290IG5vdGhpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZHVuZGFudCAlcyBwcmVmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBzdHJpbmcgaW5zdHJ1Y3Rpb24gYWZ0ZXIgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjExNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlIG9wZXJhbmQgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gb3BlcmFuZCAlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuYmFsYW5jZWQgYnJhY2tldHMgaW4gb3BlcmFuZCAlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY2hhcmFjdGVyICVzIGluIG9wZXJhbmQgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNwdXJpb3VzIG9wZXJhbmRzOyAoJWQgb3BlcmFuZHMvaW5zdHJ1Y3Rpb24gbWF4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEyMTkKLW1zZ2lkICJleHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTIyNAotbXNnaWQgImV4cGVjdGluZyBvcGVyYW5kIGJlZm9yZSAnLCc7IGdvdCBub3RoaW5nIgotbXNnc3RyICIiCi0KLSMuIHdlIGZvdW5kIG5vIG1hdGNoCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE0NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3VmZml4IG9yIG9wZXJhbmRzIGludmFsaWQgZm9yIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkluZGlyZWN0ICVzIHdpdGhvdXQgYConIgotbXNnc3RyICIiCi0KLSMuIFdhcm4gdGhlbSB0aGF0IGEgZGF0YSBvciBhZGRyZXNzIHNpemUgcHJlZml4IGRvZXNuJ3QgYWZmZWN0Ci0jLiBhc3NlbWJseSBvZiB0aGUgbmV4dCBsaW5lIG9mIGNvZGUuCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE0NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhbmQtYWxvbmUgYCVzJyBwcmVmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNTExIGNvbmZpZy90Yy1pMzg2LmM6MTUyNgotbXNnaWQgImAlcycgb3BlcmFuZCAlZCBtdXN0IHVzZSBgJSVlcycgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE1OTMgY29uZmlnL3RjLWkzODYuYzoxNjM0IGNvbmZpZy90Yy1pMzg2LmM6MTY2MQotbXNnaWQgInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNjA2IGNvbmZpZy90Yy1pMzg2LmM6MTYyMyBjb25maWcvdGMtaTM4Ni5jOjE2NTAKLW1zZ2lkICJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNjk0IGNvbmZpZy90Yy1pMzg2LmM6MTcxNAotbXNnaWQgIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbjsgY2FuJ3QgZGV0ZXJtaW5lIGltbWVkaWF0ZSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTczOQotbXNnaWQgIiIKLSJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW4gYW5kIG5vIHJlZ2lzdGVyIG9wZXJhbmRzOyBjYW4ndCBzaXplICIKLSJpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiByZXZlcnNlZCBhcmd1bWVudHMgb24gZmFkZHAsIGZzdWJwLCBldGMuCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE4NDEKLW1zZ2lkICJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcywlJSVzJyIKLW1zZ3N0ciAiIgotCi0jLiBleHRyYW5lb3VzIGBsJyBzdWZmaXggb24gZnAgaW5zbgotIzogY29uZmlnL3RjLWkzODYuYzoxODQ4Ci1tc2dpZCAidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjA2MwotbXNnaWQgInlvdSBjYW4ndCBgcG9wICUlY3MnIgotbXNnc3RyICIiCi0KLSMuIFVuaXhXYXJlIGZzdWIgbm8gYXJncyBpcyBhbGlhcyBmb3IgZnN1YnAsIGZhZGQgLT4gZmFkZHAsIGV0Yy4KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjA5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ0cmFuc2xhdGluZyB0byBgJXNwJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIxNDMgY29uZmlnL3RjLWkzODYuYzoyMjA1IGNvbmZpZy90Yy1pMzg2LmM6MjI0NwotbXNnaWQgInNraXBwaW5nIHByZWZpeGVzIG9uIHRoaXMgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyMjYyCi1tc2dpZCAiMTYtYml0IGp1bXAgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjI3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBoYW5kbGUgbm9uIGFic29sdXRlIHNlZ21lbnQgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIzNzkgY29uZmlnL3RjLWkzODYuYzoyNDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVsZCBzaG9ydGVuZWQgdG8gJWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjQ5OQotbXNnaWQgIk9ubHkgMSBvciAyIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgYWxsb3dlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI1MzEgY29uZmlnL3RjLWkzODYuYzoyNzU1Ci1tc2dpZCAiR09UIHJlbG9jYXRpb25zIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNTUyIGNvbmZpZy90Yy1pMzg2LmM6Mjc3NgotbXNnaWQgIkJhZCByZWxvYyBzcGVjaWZpZXIgaW4gZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI1NzAgY29uZmlnL3RjLWkzODYuYzoyODEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIGp1bmsgYCVzJyBhZnRlciBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSMuIG1pc3Npbmcgb3IgYmFkIGV4cHIgYmVjb21lcyBhYnNvbHV0ZSAwCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI1NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTWlzc2luZyBvciBpbnZhbGlkIGltbWVkaWF0ZSBleHByZXNzaW9uIGAlcycgdGFrZW4gYXMgMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI2MDcgY29uZmlnL3RjLWkzODYuYzoyODUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuaW1wbGVtZW50ZWQgc2VnbWVudCAlcyBpbiBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjYwOSBjb25maWcvdGMtaTM4Ni5jOjI4NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5pbXBsZW1lbnRlZCBzZWdtZW50IHR5cGUgJWQgaW4gb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI2NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIHNjYWxlIGZhY3RvciBvZiAxLCAyLCA0LCBvciA4OiBnb3QgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI2NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2NhbGUgZmFjdG9yIG9mICVkIHdpdGhvdXQgYW4gaW5kZXggcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIy4gbWlzc2luZyBvciBiYWQgZXhwciBiZWNvbWVzIGFic29sdXRlIDAKLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjgyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJNaXNzaW5nIG9yIGludmFsaWQgZGlzcGxhY2VtZW50IGV4cHJlc3Npb24gYCVzJyB0YWtlbiBhcyAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzAzNSBjb25maWcvdGMtaTM4Ni5jOjMwNDEgY29uZmlnL3RjLWkzODYuYzozMDUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBzZWdtZW50IG5hbWUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjMxMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYCVzJyBpcyBub3QgYSB2YWxpZCBiYXNlL2luZGV4IGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozMTEyCi0jLCBjLWZvcm1hdAotbXNnaWQgImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjMxMzMgY29uZmlnL3RjLWkzODYuYzozNDg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRvbyBtYW55IG1lbW9yeSByZWZlcmVuY2VzIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzIxOSBjb25maWcvdGMtaTM4Ni5jOjMzNTQgY29uZmlnL3RjLWkzODYuYzozNDU3Ci0jOiBjb25maWcvdGMtaTM4Ni5jOjM1NzIgY29uZmlnL3RjLWkzODYuYzozNjA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCByZWdpc3RlciBuYW1lIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBtZW1vcnkgb3BlcmFuZCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzQ0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJKdW5rIGAlcycgYWZ0ZXIgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNDY1Ci1tc2dpZCAiSW1tZWRpYXRlIG9wZXJhbmQgaWxsZWdhbCB3aXRoIGFic29sdXRlIGp1bXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBgLCcgb3IgYCknIGFmdGVyIGluZGV4IHJlZ2lzdGVyIGluIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNTg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBgKScgYWZ0ZXIgc2NhbGUgZmFjdG9yIGluIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBpbmRleCByZWdpc3RlciBvciBzY2FsZSBmYWN0b3IgYWZ0ZXIgYCwnOyBnb3QgJyVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM2MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgYmFzZSByZWdpc3RlciBpbiBgJXMnIgotbXNnc3RyICIiCi0KLSMuIGl0J3Mgbm90IGEgbWVtb3J5IG9wZXJhbmQ7IGFyZ2ghCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM2NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjaGFyICVzIGJlZ2lubmluZyBvcGVyYW5kICVkIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo0MDk5Ci1tc2dpZCAiQmFkIGNhbGwgdG8gbWRfYXRvZiAoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQyNTAKLW1zZ2lkICIgIC1tXHRcdFx0ICBkbyBsb25nIGp1bXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQyNTMKLW1zZ2lkICIiCi0iICAtVlx0XHRcdCAgcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG4iCi0iICAta1x0XHRcdCAgaWdub3JlZFxuIgotIiAgLVF5LCAtUW5cdFx0ICBpZ25vcmVkXG4iCi0iICAtcVx0XHRcdCAgaWdub3JlZFxuIgotIiAgLXNcdFx0XHQgIGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQzMDcKLW1zZ2lkICJHT1QgYWxyZWFkeSBpbiBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo0NDU2IGNvbmZpZy90Yy1tY29yZS5jOjI0MjEgY29uZmlnL3RjLXBqLmM6NTg2Ci0jOiBjb25maWcvdGMtc2guYzoyOTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTU3IGNvbmZpZy90Yy1pODYwLmM6MTYxCi1tc2dpZCAiVW5rbm93biB0ZW1wb3JhcnkgcHNldWRvIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTgzIGNvbmZpZy90Yy1taXBzLmM6MTA1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MzQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkV4cGFuZGVkIG9wY29kZSBhZnRlciBkZWxheWVkIGJyYW5jaDogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjM0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJFeHBhbmRlZCBvcGNvZGUgaW4gZHVhbCBtb2RlOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6NTgwCi1tc2dpZCAiRnNyMSBlcXVhbHMgZmRlc3Qgd2l0aCBQaXBlbGluaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6NjMxCi1tc2dpZCAiNS1iaXQgaW1tZWRpYXRlIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjcyNQotbXNnaWQgIklsbGVnYWwgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo3NDkgY29uZmlnL3RjLXNwYXJjLmM6MjYzNAotbXNnaWQgImJhZCBzZWdtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6ODc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjI2LWJpdCBicmFuY2ggdy9vIHBjIHJlbGF0aXZlIHNldDogMHglMDh4IgotbXNnc3RyICIiCi0KLSMuIGFsaWduIHBjcmVsIG9mZnNldCwgc2VlIG1hbnVhbAotIy4gY2hlY2sgZm9yIG92ZXJmbG93Ci0jOiBjb25maWcvdGMtaTg2MC5jOjg4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIyNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6ODkxIGNvbmZpZy90Yy1pODYwLmM6OTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgNC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6ODk2IGNvbmZpZy90Yy1pODYwLmM6OTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgMi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBicmFuY2ggb2Zmc2V0IG92ZXJmbG93OiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMTYtYml0IGltbWVkaWF0ZSAxNi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgOC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgb3ZlcmZsb3c6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjk1MQotbXNnaWQgIm1kX251bWJlcl90b19kaXNwXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5NjEKLW1zZ2lkICJpODYwX251bWJlcl90b19maWVsZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTAwMQotbXNnaWQgImk4NjBfY29udmVydF9mcmFnXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzoxMDEwCi1tc2dpZCAiaTg2MF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6NTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkhhc2hpbmcgcmV0dXJuZWQgXCIlc1wiLiIKLW1zZ3N0ciAiIgotCi0jLiBPZmZzZXQgb2YgbGFzdCBjaGFyYWN0ZXIgaW4gb3Bjb2RlIG1uZW1vbmljCi0jOiBjb25maWcvdGMtaTk2MC5jOjU5MwotbXNnaWQgImJyYW5jaCBwcmVkaWN0aW9uIGludmFsaWQgb24gdGhpcyBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo2MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBvcGNvZGUsIFwiJXNcIi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo2NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW1wcm9wZXIgbnVtYmVyIG9mIG9wZXJhbmRzLiAgZXhwZWN0aW5nICVkLCBnb3QgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo4NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRml4dXAgb2YgJWxkIHRvbyBsYXJnZSBmb3IgZmllbGQgd2lkdGggb2YgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo5OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXRlY3R1cmUgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxMDE0Ci1tc2dpZCAiSTk2MCBvcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTAxNwotbXNnaWQgIiIKLSJcbiIKLSJcdFx0XHRzcGVjaWZ5IHZhcmlhbnQgb2YgOTYwIGFyY2hpdGVjdHVyZVxuIgotIi1iXHRcdFx0YWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuXG4iCi0iLWxpbmstcmVsYXhcdFx0cHJlc2VydmUgaW5kaXZpZHVhbCBhbGlnbm1lbnQgZGlyZWN0aXZlcyBzbyBsaW5rZXJcbiIKLSJcdFx0XHRjYW4gZG8gcmVsYXhpbmcgKGIub3V0IGZvcm1hdCBvbmx5KVxuIgotIi1uby1yZWxheFx0XHRkb24ndCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvclxuIgotIlx0XHRcdGxvbmcgZGlzcGxhY2VtZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTQyNQotbXNnaWQgInRvbyBtYW55IG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTQ4NSBjb25maWcvdGMtaTk2MC5jOjE3MTUKLW1zZ2lkICJleHByZXNzaW9uIHN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE1MjMKLW1zZ2lkICJhdHRlbXB0IHRvIGJyYW5jaCBpbnRvIGRpZmZlcmVudCBzZWdtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTUyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJ0YXJnZXQgb2YgJXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBhIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTU2NwotbXNnaWQgInVubWF0Y2hlZCAnWyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNTc4Ci1tc2dpZCAiZ2FyYmFnZSBhZnRlciBpbmRleCBzcGVjIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIy4gV2UgbmV2ZXIgbW92ZWQ6IHRoZXJlIHdhcyBubyBvcGNvZGUgZWl0aGVyIQotIzogY29uZmlnL3RjLWk5NjAuYzoxNjQ1Ci1tc2dpZCAibWlzc2luZyBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxOTUzCi1tc2dpZCAiaW52YWxpZCBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIwNjYKLW1zZ2lkICJpbnZhbGlkIGluZGV4IHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjA4OQotbXNnaWQgImludmFsaWQgc2NhbGUgZmFjdG9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjI3MgotbXNnaWQgInVuYWxpZ25lZCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIyOTUKLW1zZ2lkICJubyBzdWNoIHNmciBpbiB0aGlzIGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIzMzMKLW1zZ2lkICJpbGxlZ2FsIGxpdGVyYWwiCi1tc2dzdHIgIiIKLQotIy4gU2hvdWxkIG5vdCBoYXBwZW46IHNlZSBibG9jayBjb21tZW50IGFib3ZlCi0jOiBjb25maWcvdGMtaTk2MC5jOjI1NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHJ5aW5nIHRvICdiYWwnIHRvICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjU3NwotbXNnaWQgIkxvb2tzIGxpa2UgYSBwcm9jLCBidXQgY2FuJ3QgdGVsbCB3aGF0IGtpbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjA5Ci1tc2dpZCAic2hvdWxkIGhhdmUgMSBvciAyIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjYxOCBjb25maWcvdGMtaTk2MC5jOjI2MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVkZWZpbmluZyBsZWFmcHJvYyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI2NjkKLW1zZ2lkICJzaG91bGQgaGF2ZSB0d28gb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjc5Ci1tc2dpZCAiJ2VudHJ5X251bScgbXVzdCBiZSBhYnNvbHV0ZSBudW1iZXIgaW4gWzAsMzFdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWRlZmluaW5nIGVudHJ5bnVtIGZvciBzeXNwcm9jICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6Mjc5OQotbXNnaWQgImFyY2hpdGVjdHVyZSBvZiBvcGNvZGUgY29uZmxpY3RzIHdpdGggdGhhdCBvZiBlYXJsaWVyIGluc3RydWN0aW9uKHMpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjgyMAotbXNnaWQgImJpZyBlbmRpYW4gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjgyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJpZ25vcmluZyB1bnJlY29nbml6ZWQgLmVuZGlhbiB0eXBlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzozMTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxlYWZwcm9jIHN5bWJvbCAnJXMnIHVuZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjMxMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogbWFraW5nIGxlYWZwcm9jIGVudHJpZXMgJXMgYW5kICVzIGJvdGggZ2xvYmFsXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzozMjIzCi1tc2dpZCAib3B0aW9uIC0tbGluay1yZWxheCBpcyBvbmx5IHN1cHBvcnRlZCBpbiBiLm91dCBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzozMjY2Ci1tc2dpZCAiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jLiBQcmV0ZW5kIHRoYXQgd2UgZG8gbm90IHJlY29nbmlzZSB0aGlzIG9wdGlvbi4KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MjE4Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIG9wdGlvbjogLWhpZGRlbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjI1MQotbXNnaWQgIiBNMzJSIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MjUzCi1tc2dpZCAiICAtbTMycnggICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBleHRlbmRlZCBtMzJyeCBpbnN0cnVjdGlvbiBzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjI1NQotbXNnaWQgIiAgLU8gICAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGNvbWJpbmUgaW5zdHJ1Y3Rpb25zIGluIHBhcmFsbGVsXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyNTgKLW1zZ2lkICIiCi0iICAtd2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHMgICAgIHdhcm4gd2hlbiBwYXJhbGxlbCBpbnN0cnVjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjI2MAotbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZSBjb250cmFpbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyNjIKLW1zZ2lkICIgIC1uby13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0cyAgZG8gbm90IHdhcm4gd2hlbiBwYXJhbGxlbFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MjY0Ci1tc2dpZCAiIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zIHZpb2xhdGUgY29udHJhaW50c1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MjY2Ci1tc2dpZCAiIgotIiAgLVdwICAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyNjgKLW1zZ2lkICIiCi0iICAtV25wICAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtbm8td2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjI3MQotbXNnaWQgIiIKLSIgIC13YXJuLXVubWF0Y2hlZC1oaWdoICAgIHdhcm4gd2hlbiBhbiAocyloaWdoIHJlbG9jIGhhcyBubyBtYXRjaGluZyBsb3cgIgotInJlbG9jXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyNzMKLW1zZ2lkICIgIC1uby13YXJuLXVubWF0Y2hlZC1oaWdoIGRvIG5vdCB3YXJuIGFib3V0IG1pc3NpbmcgbG93IHJlbG9jc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6Mjc1Ci1tc2dpZCAiICAtV3VoICAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtd2Fybi11bm1hdGNoZWQtaGlnaFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6Mjc3Ci1tc2dpZCAiICAtV251aCAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtbm8td2Fybi11bm1hdGNoZWQtaGlnaFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MjgxCi1tc2dpZCAiICAtcmVsYXggICAgICAgICAgICAgICAgIGNyZWF0ZSBsaW5rZXIgcmVsYXhhYmxlIGNvZGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjI4MwotbXNnaWQgIiAgLWNwdS1kZXNjICAgICAgICAgICAgICBwcm92aWRlIHJ1bnRpbWUgY3B1IGRlc2NyaXB0aW9uIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjY3OAotbXNnaWQgIkluc3RydWN0aW9ucyB3cml0ZSB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo2ODYKLW1zZ2lkICJJbnN0cnVjdGlvbnMgZG8gbm90IHVzZSBwYXJhbGxlbCBleGVjdXRpb24gcGlwZWxpbmVzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjY5MwotbXNnaWQgIkluc3RydWN0aW9ucyBzaGFyZSB0aGUgc2FtZSBleGVjdXRpb24gcGlwZWxpbmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo3NjIgY29uZmlnL3RjLW0zMnIuYzo4NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm90IGEgMTYgYml0IGluc3RydWN0aW9uICclcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo3NjkgY29uZmlnL3RjLW0zMnIuYzo4NTUgY29uZmlnL3RjLW0zMnIuYzoxMDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gaW5zdHJ1Y3Rpb24gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjc3NyBjb25maWcvdGMtbTMyci5jOjg2MiBjb25maWcvdGMtbTMyci5jOjEwMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5zdHJ1Y3Rpb24gJyVzJyBpcyBmb3IgdGhlIE0zMlJYIG9ubHkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo3ODUgY29uZmlnL3RjLW0zMnIuYzo4NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5zdHJ1Y3Rpb24gJyVzJyBjYW5ub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6ODMyIGNvbmZpZy90Yy1tMzJyLmM6ODk1IGNvbmZpZy90Yy1tMzJyLmM6MTA2NwotbXNnaWQgImludGVybmFsIGVycm9yOiBsb29rdXAvZ2V0IG9wZXJhbmRzIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjg4MAotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnOiBvbmx5IHRoZSBOT1AgaW5zdHJ1Y3Rpb24gY2FuIGJlIGlzc3VlZCBpbiBwYXJhbGxlbCBvbiB0aGUgbTMyciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjkwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IG91dHB1dCBvZiAxc3QgaW5zdHJ1Y3Rpb24gaXMgdGhlIHNhbWUgYXMgYW4gaW5wdXQgdG8gMm5kIGluc3RydWN0aW9uIC0gIgotImlzIHRoaXMgaW50ZW50aW9uYWwgPyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjkxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IG91dHB1dCBvZiAybmQgaW5zdHJ1Y3Rpb24gaXMgdGhlIHNhbWUgYXMgYW4gaW5wdXQgdG8gMXN0IGluc3RydWN0aW9uIC0gIgotImlzIHRoaXMgaW50ZW50aW9uYWwgPyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjEyMjggY29uZmlnL3RjLXBwYy5jOjEzMzcgY29uZmlnL3RjLXBwYy5jOjM1NDcgcmVhZC5jOjEzNTkKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTIzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIuU0NPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjEyNTEgY29uZmlnL3RjLXBwYy5jOjEzNTkgY29uZmlnL3RjLXBwYy5jOjIyNjYKLSM6IGNvbmZpZy90Yy1wcGMuYzozNTcxCi1tc2dpZCAiaWdub3JpbmcgYmFkIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjEyNzcgY29uZmlnL3RjLXBwYy5jOjEzNzAgY29uZmlnL3RjLXBwYy5jOjM1ODMgcmVhZC5jOjEzNzkKLSM6IHJlYWQuYzoyMTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjEyODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5zY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoxNzU5Ci1tc2dpZCAiVW5tYXRjaGVkIGhpZ2gvc2hpZ2ggcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NDYKLW1zZ2lkICJVbmtub3duIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Nzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSBwaWMgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjc4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcGljIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo4ODUgY29uZmlnL3RjLW1pcHMuYzoxMTIyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgbWFrZSAlcyByZWxvY2F0aW9uIFBDIHJlbGF0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6OTk4IGNvbmZpZy90Yy10YWhvZS5jOjE1MDUgY29uZmlnL3RjLXZheC5jOjE3NzQKLW1zZ2lkICJObyBvcGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjEwMjggY29uZmlnL3RjLXRhaG9lLmM6MTUyMiBjb25maWcvdGMtdmF4LmM6MTc5MQotbXNnaWQgIlVua25vd24gb3BlcmF0b3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODAzCi1tc2dpZCAiaW52YWxpZCBpbnN0cnVjdGlvbiBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzICIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4MDgKLW1zZ2lkICJmcHUgKDY4MDQwLCA2ODA2MCBvciA2ODg4MS82ODg4MikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODExCi1tc2dpZCAibW11ICg2ODAzMCBvciA2ODg1MSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODE0Ci1tc2dpZCAiNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgxNwotbXNnaWQgIjY4MDAwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4MjAKLW1zZ2lkICI2ODAxMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODQ4Ci1tc2dpZCAib3BlcmFuZHMgbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxOTA1IGNvbmZpZy90Yy1tNjhrLmM6MTkxMSBjb25maWcvdGMtbTY4ay5jOjE5MTcKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmlnbnVtIHRvbyBiaWcgZm9yICVjIGZvcm1hdDsgdHJ1bmNhdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjA0MgotbXNnaWQgImRpc3BsYWNlbWVudCB0b28gbGFyZ2UgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMTUyCi1tc2dpZCAiIgotInNjYWxlIGZhY3RvciBpbnZhbGlkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyBjcHUzMiBvciA2ODAyMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMTU3Ci1tc2dpZCAiaW52YWxpZCBpbmRleCBzaXplIGZvciBjb2xkZmlyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIyMTAKLW1zZ2lkICJGb3JjaW5nIGJ5dGUgZGlzcGxhY2VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjIxMgotbXNnaWQgImJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIyNTkgY29uZmlnL3RjLW02OGsuYzoyMjk3Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIG1vZGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMjgzIGNvbmZpZy90Yy1tNjhrLmM6MjMxNwotbXNnaWQgIjpiIG5vdCBwZXJtaXR0ZWQ7IGRlZmF1bHRpbmcgdG8gOnciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMzk5Ci1tc2dpZCAidW5zdXBwb3J0ZWQgYnl0ZSB2YWx1ZTsgdXNlIGEgZGlmZmVyZW50IHN1ZmZpeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI0MTMKLW1zZ2lkICJ1bmtub3duL2luY29ycmVjdCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjQ0NiBjb25maWcvdGMtbTY4ay5jOjI0NTQgY29uZmlnL3RjLW02OGsuYzoyNDYxCi0jOiBjb25maWcvdGMtbTY4ay5jOjI0NjgKLW1zZ2lkICJvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNTE4Ci1tc2dpZCAiQ2FuJ3QgdXNlIGxvbmcgYnJhbmNoZXMgb24gNjgwMDAvNjgwMTAvNTIwMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI2MDYKLW1zZ2lkICJFeHByZXNzaW9uIG91dCBvZiByYW5nZSwgdXNpbmcgMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI3MTggY29uZmlnL3RjLW02OGsuYzoyNzM0Ci1tc2dpZCAiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI3MjQKLW1zZ2lkICJXcm9uZyByZWdpc3RlciBpbiBmbG9hdGluZy1wb2ludCByZWdsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mjc0MAotbXNnaWQgImluY29ycmVjdCByZWdpc3RlciBpbiByZWdsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mjc0NgotbXNnaWQgIndyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyODIyCi1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjayIKLW1zZ3N0ciAiIgotCi0jLiBFUlJPUgotIzogY29uZmlnL3RjLW02OGsuYzozMTg3Ci1tc2dpZCAiRXh0cmEgKSIKLW1zZ3N0ciAiIgotCi0jLiBFUlJPUgotIzogY29uZmlnL3RjLW02OGsuYzozMTk4Ci1tc2dpZCAiTWlzc2luZyApIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzIxNQotbXNnaWQgIk1pc3Npbmcgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM1NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgLS0gc3RhdGVtZW50IGAlcycgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM1OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRG9uJ3Qga25vdyBob3cgdG8gZmlndXJlIHdpZHRoIG9mICVjIGluIG1kX2Fzc2VtYmxlKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozNzU5IGNvbmZpZy90Yy1tNjhrLmM6Mzc5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgZmluZCAlcyBpbiBoYXNoIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mzc2MiBjb25maWcvdGMtbTY4ay5jOjM3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgRXJyb3I6IENhbid0IGhhc2ggJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzkyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgZGVmYXVsdCBjcHUgYCVzJyA/Pz8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozOTM4Ci1tc2dpZCAiNjgwNDAgYW5kIDY4ODUxIHNwZWNpZmllZDsgbW11IGluc3RydWN0aW9ucyBtYXkgYXNzZW1ibGUgaW5jb3JyZWN0bHkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozOTU4Ci1tc2dpZCAib3B0aW9ucyBmb3IgNjg4ODEgYW5kIG5vLTY4ODgxIGJvdGggZ2l2ZW4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozOTYwCi1tc2dpZCAib3B0aW9ucyBmb3IgNjg4NTEgYW5kIG5vLTY4ODUxIGJvdGggZ2l2ZW4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0MDMxCi0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgbGFiZWwgYCVzJyBhbGlnbmVkIHRvIG9kZCBib3VuZGFyeSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQyNDgKLW1zZ2lkICJpbnZhbGlkIGJ5dGUgYnJhbmNoIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQzMDUKLW1zZ2lkICJzaG9ydCBicmFuY2ggd2l0aCB6ZXJvIG9mZnNldDogdXNlIDp3IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDM1MQotbXNnaWQgIkxvbmcgYnJhbmNoIG9mZnNldCBub3Qgc3VwcG9ydGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ0MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IgKGxvbmcgUEMtcmVsYXRpdmUgb3BlcmFuZCkgZm9yIGluc24gMHglMDR4IGF0IDB4JWx4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDQ0MwotbXNnaWQgImRpc3BsYWNlbWVudCBkb2Vzbid0IGZpdCBpbiBvbmUgYnl0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ1NTYKLW1zZ2lkICJMb25nIGJyYW5jaCBvZmZzZXQgdG8gZXh0ZXJuIHN5bWJvbCBub3Qgc3VwcG9ydGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ5MDUgY29uZmlnL3RjLW02OGsuYzo0OTE2Ci1tc2dpZCAiZXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2U6IGRlZmF1bHRpbmcgdG8gMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ5NDgKLW1zZ2lkICJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDk4MSBjb25maWcvdGMtbTY4ay5jOjQ5OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgZGVhbCB3aXRoIGV4cHJlc3Npb247IGRlZmF1bHRpbmcgdG8gJWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTAwNwotbXNnaWQgImV4cHJlc3Npb24gZG9lc24ndCBmaXQgaW4gQllURSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUwMTEKLW1zZ2lkICJleHByZXNzaW9uIGRvZXNuJ3QgZml0IGluIFdPUkQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlY29nbml6ZWQgcHJvY2Vzc29yIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MTY5Ci1tc2dpZCAiYmFkIGNvcHJvY2Vzc29yIGlkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTE3NQotbXNnaWQgInVucmVjb2duaXplZCBmb3B0IG9wdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUzMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3B0aW9uIGAlcycgbWF5IG5vdCBiZSBuZWdhdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTMyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcHRpb24gYCVzJyBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUzNTMKLW1zZ2lkICJiYWQgZm9ybWF0IG9mIE9QVCBORVNUPWRlcHRoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTQxNgotbXNnaWQgIm1pc3NpbmcgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NDQwIGNvbmZpZy90Yy1tNjhrLmM6NTQ2OQotbXNnaWQgImJhZCByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTQ0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgcmVnaXN0ZXIgbGlzdDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NTQwCi1tc2dpZCAicmVzdG9yZSB3aXRob3V0IHNhdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NzE3IGNvbmZpZy90Yy1tNjhrLmM6NjA2NgotbXNnaWQgInN5bnRheCBlcnJvciBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTc2OAotbXNnaWQgIm1pc3NpbmcgY29uZGl0aW9uIGNvZGUgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYxMDAKLW1zZ2lkICJtaXNzaW5nIHRoZW4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MTgyCi1tc2dpZCAiZWxzZSB3aXRob3V0IG1hdGNoaW5nIGlmIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjIxNgotbXNnaWQgImVuZGkgd2l0aG91dCBtYXRjaGluZyBpZiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYyNTcKLW1zZ2lkICJicmVhayBvdXRzaWRlIG9mIHN0cnVjdHVyZWQgbG9vcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYyOTYKLW1zZ2lkICJuZXh0IG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjM0OAotbXNnaWQgIm1pc3NpbmcgPSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYzODYKLW1zZ2lkICJtaXNzaW5nIHRvIG9yIGRvd250byIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY0MjIgY29uZmlnL3RjLW02OGsuYzo2NDU2IGNvbmZpZy90Yy1tNjhrLmM6NjY2NgotbXNnaWQgIm1pc3NpbmcgZG8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NTU5Ci1tc2dpZCAiZW5kZiB3aXRob3V0IGZvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY2MTUKLW1zZ2lkICJ1bnRpbCB3aXRob3V0IHJlcGVhdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY3MDIKLW1zZ2lkICJlbmR3IHdpdGhvdXQgd2hpbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2ODE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBvcHRpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY4NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTMzCi1tc2dpZCAiIgotIjY4MFgwIG9wdGlvbnM6XG4iCi0iLWxcdFx0XHR1c2UgMSB3b3JkIGZvciByZWZzIHRvIHVuZGVmaW5lZCBzeW1ib2xzIFtkZWZhdWx0IDJdXG4iCi0iLW02ODAwMCB8IC1tNjgwMDggfCAtbTY4MDEwIHwgLW02ODAyMCB8IC1tNjgwMzAgfCAtbTY4MDQwIHwgLW02ODA2MFxuIgotIiB8IC1tNjgzMDIgfCAtbTY4MzMxIHwgLW02ODMzMiB8IC1tNjgzMzMgfCAtbTY4MzQwIHwgLW02ODM2MFxuIgotIiB8IC1tY3B1MzIgfCAtbTUyMDBcbiIKLSJcdFx0XHRzcGVjaWZ5IHZhcmlhbnQgb2YgNjgwWDAgYXJjaGl0ZWN0dXJlIFtkZWZhdWx0IDY4MDIwXVxuIgotIi1tNjg4ODEgfCAtbTY4ODgyIHwgLW1uby02ODg4MSB8IC1tbm8tNjg4ODJcbiIKLSJcdFx0XHR0YXJnZXQgaGFzL2xhY2tzIGZsb2F0aW5nLXBvaW50IGNvcHJvY2Vzc29yXG4iCi0iXHRcdFx0W2RlZmF1bHQgeWVzIGZvciA2ODAyMCwgNjgwMzAsIGFuZCBjcHUzMl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY5NDMKLW1zZ2lkICIiCi0iLW02ODg1MSB8IC1tbm8tNjg4NTFcbiIKLSJcdFx0XHR0YXJnZXQgaGFzL2xhY2tzIG1lbW9yeS1tYW5hZ2VtZW50IHVuaXQgY29wcm9jZXNzb3JcbiIKLSJcdFx0XHRbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwIGFuZCB1cF1cbiIKLSItcGljLCAta1x0XHRnZW5lcmF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG4iCi0iLVNcdFx0XHR0dXJuIGpic3IgaW50byBqc3JcbiIKLSItLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbFxuIgotIlx0XHRcdHJlY29nbml6ZSByZWdpc3RlciBuYW1lcyB3aXRob3V0IHByZWZpeCBjaGFyYWN0ZXJcbiIKLSItLWJpdHdpc2Utb3JcdFx0ZG8gbm90IHRyZWF0IGB8JyBhcyBhIGNvbW1lbnQgY2hhcmFjdGVyXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTUyCi1tc2dpZCAiIgotIi0tYmFzZS1zaXplLWRlZmF1bHQtMTZcdGJhc2UgcmVnIHdpdGhvdXQgc2l6ZSBpcyAxNiBiaXRzXG4iCi0iLS1iYXNlLXNpemUtZGVmYXVsdC0zMlx0YmFzZSByZWcgd2l0aG91dCBzaXplIGlzIDMyIGJpdHMgKGRlZmF1bHQpXG4iCi0iLS1kaXNwLXNpemUtZGVmYXVsdC0xNlx0ZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDE2IGJpdHNcbiIKLSItLWRpc3Atc2l6ZS1kZWZhdWx0LTMyXHRkaXNwbGFjZW1lbnQgd2l0aCB1bmtub3duIHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY5ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3IgJXMgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY5OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3Bjb2RlKCVkLiVzKTogIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MjA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGhhc2ggaW5zdHJ1Y3Rpb24gJyVzJzolcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjI1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG1uZW1vbmljICclcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoyNzgKLW1zZ2lkICJQYXJhbWV0ZXIgc3ludGF4IGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MzMzCi1tc2dpZCAiVW5rbm93biByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIy4gSGF2aW5nIHRoaXMgaGVyZSByZXBlYXRzIHRoZSB3YXJuaW5nIHNvbXRpbWVzLgotIy4gQnV0IGNhbid0IHdlIHN0YW5kIHRoYXQ/Ci0jOiBjb25maWcvdGMtbTg4ay5jOjQ0NgotbXNnaWQgIlVzZSBvZiBvYnNvbGV0ZSBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjU2MwotbXNnaWQgIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDE2IGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzo2MjkgY29uZmlnL3RjLW04OGsuYzo2NTEKLW1zZ2lkICJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA1IGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzo4NzMKLW1zZ2lkICJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA5IGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzo4OTUKLW1zZ2lkICJSZW1vdmVkIGxvd2VyIDIgYml0cyBvZiBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTAzNAotbXNnaWQgIkJhZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMDQ3Ci1tc2dpZCAibWRfbnVtYmVyX3RvX2Rpc3Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMDU3Ci1tc2dpZCAibWRfbnVtYmVyX3RvX2ZpZWxkIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTE3MAotbXNnaWQgIlJlbGF4YXRpb24gc2hvdWxkIG5ldmVyIG9jY3VyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTI2NyBjb25maWcvdGMtc3BhcmMuYzozMzUzIHJlYWQuYzoxOTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJTUyBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTMxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgJXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjUwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNvbnRyb2wgcmVnaXN0ZXIgZXhwZWN0ZWQsIGJ1dCBzYXcgJyUuNnMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjYzMQotbXNnaWQgImJhZC9taXNzaW5nIHBzciBzcGVjaWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NzkyCi1tc2dpZCAibW9yZSB0aGFuIDY1SyBsaXRlcmFsIHBvb2xzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjg0NgotbXNnaWQgIm1pc3NpbmcgJ10nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjg4NgotbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjg4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkLCBub3QgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6OTI2Ci1tc2dpZCAib3BlcmFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo5MzMKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjk0NyBjb25maWcvdGMtbWNvcmUuYzoxNDU5IGNvbmZpZy90Yy1tY29yZS5jOjE1MTMKLW1zZ2lkICJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wY29kZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTAzOQotbXNnaWQgImludmFsaWQgcmVnaXN0ZXI6IHIxNSBpbGxlZ2FsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEwODcgY29uZmlnL3RjLW1jb3JlLmM6MTY2MwotbXNnaWQgIk0zNDAgc3BlY2lmaWMgb3Bjb2RlIHVzZWQgd2hlbiBhc3NlbWJsaW5nIGZvciBNMjEwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjExMDUgY29uZmlnL3RjLW1jb3JlLmM6MTE0NCBjb25maWcvdGMtbWNvcmUuYzoxMTYzCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMTgyIGNvbmZpZy90Yy1tY29yZS5jOjEyMDkgY29uZmlnL3RjLW1jb3JlLmM6MTIzOAotIzogY29uZmlnL3RjLW1jb3JlLmM6MTI3NSBjb25maWcvdGMtbWNvcmUuYzoxMzEwIGNvbmZpZy90Yy1tY29yZS5jOjEzMjkKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzNDggY29uZmlnL3RjLW1jb3JlLmM6MTM4MCBjb25maWcvdGMtbWNvcmUuYzoxNDA1Ci0jOiBjb25maWcvdGMtbWNvcmUuYzoxNDYyIGNvbmZpZy90Yy1tY29yZS5jOjE1MTYgY29uZmlnL3RjLW1jb3JlLmM6MTU1MgotIzogY29uZmlnL3RjLW1jb3JlLmM6MTYxMCBjb25maWcvdGMtbWNvcmUuYzoxNjMyIGNvbmZpZy90Yy1tY29yZS5jOjE2NTUKLW1zZ2lkICJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjExMjAKLW1zZ2lkICJkZXN0aW5hdGlvbiByZWdpc3RlciBtdXN0IGJlIHIxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjExNDEKLW1zZ2lkICJzb3VyY2UgcmVnaXN0ZXIgbXVzdCBiZSByMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjA0IGNvbmZpZy90Yy1tY29yZS5jOjEyNjEKLW1zZ2lkICJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEyMzIKLW1zZ2lkICJ0cmFuc2xhdGluZyBiZ2VuaSB0byBtb3ZpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEyNjkKLW1zZ2lkICJ0cmFuc2xhdGluZyBtZ2VuaSB0byBtb3ZpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzMDEKLW1zZ2lkICJ0cmFuc2xhdGluZyBibWFza2kgdG8gbW92aSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMzc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRpc3BsYWNlbWVudCB0b28gbGFyZ2UgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMzg5Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlcjogcjAgYW5kIHIxNSBpbGxlZ2FsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE0MjAKLW1zZ2lkICJiYWQgc3RhcnRpbmcgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaW52YWxpZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNDMzCi1tc2dpZCAiZW5kaW5nIHJlZ2lzdGVyIG11c3QgYmUgcjE1IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE0NTMKLW1zZ2lkICJiYWQgYmFzZSByZWdpc3RlcjogbXVzdCBiZSByMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNDcxCi1tc2dpZCAiZmlyc3QgcmVnaXN0ZXIgbXVzdCBiZSByNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNDgyCi1tc2dpZCAibGFzdCByZWdpc3RlciBtdXN0IGJlIHI3IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE1MTkKLW1zZ2lkICJyZWctcmVnIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE2MjkKLW1zZ2lkICJzZWNvbmQgb3BlcmFuZCBtdXN0IGJlIDEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTY1MAotbXNnaWQgInplcm8gdXNlZCBhcyBpbW1lZGlhdGUgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTY3NwotbXNnaWQgImR1cGxpY2F0ZWQgcHNyIGJpdCBzcGVjaWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTY4MwotbXNnaWQgImBhZicgbXVzdCBhcHBlYXIgYWxvbmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTY5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmltcGxlbWVudGVkIG9wY29kZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTY5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJpZ25vcmluZyBvcGVyYW5kczogJXMgIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE3NjggY29uZmlnL3RjLXc2NS5jOjg1NgotbXNnaWQgIkJhZCBjYWxsIHRvIE1EX05UT0YoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODQxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXNlZCBjcHUgdHlwZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE4NjAKLW1zZ2lkICIiCi0iTUNPUkUgc3BlY2lmaWMgb3B0aW9uczpcbiIKLSIgIC17bm8tfWpzcmkyYnNyXHQgIHtkaXN9YWJsZSBqc3JpIHRvIGJzciB0cmFuc2Zvcm1hdGlvbiAoZGVmOiBkaXMpXG4iCi0iICAte25vLX1zaWZpbHRlclx0ICB7ZGlzfWFibGUgc2lsaWNvbiBmaWx0ZXIgYmVoYXZpb3IgKGRlZjogZGlzKVxuIgotIiAgLWNwdT1bMjEwfDM0MF0gICAgICAgICAgc2VsZWN0IENQVSB0eXBlXG4iCi0iICAtRUIgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSAoZGVmYXVsdClcbiIKLSIgIC1FTCAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGZvciBhIGxpdHRsZSBlbmRpYW4gc3lzdGVtXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTg3OQotbXNnaWQgImZhaWxlZCBzYW5pdHkgY2hlY2s6IHNob3J0X2p1bXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTg5MAotbXNnaWQgImZhaWxlZCBzYW5pdHkgY2hlY2s6IGxvbmdfanVtcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxOTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9kZCBkaXNwbGFjZW1lbnQgYXQgJXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MjEwNQotbXNnaWQgInVua25vd24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MjEzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJvZGQgZGlzdGFuY2UgYnJhbmNoICgweCV4IGJ5dGVzKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoyMTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInBjcmVsIGZvciBicmFuY2ggdG8gJXMgdG9vIGZhciAoMHgleCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MjE1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJwY3JlbCBmb3IgbHJ3L2ptcGkvanNyaSB0byAlcyB0b28gZmFyICgweCV4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoyMTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgInBjcmVsIGZvciBsb29wdCB0b28gZmFyICgweCV4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoyNDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSAlc3JlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MjQwNAotbXNnaWQgInBjLXJlbGF0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODYwCi1tc2dpZCAiLUcgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAwNQotbXNnaWQgInRyYXAgZXhjZXB0aW9uIG5vdCBzdXBwb3J0ZWQgYXQgSVNBIDEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDQ2Ci1tc2dpZCAiQ291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsOiBjYW4ndCBoYXNoIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTA5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogYmFkIG1pcHMxNiBvcGNvZGU6ICVzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMjYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInJldHVybmVkIGZyb20gbWlwc19pcCglcykgaW5zbl9vcGNvZGUgPSAweCV4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxODE2IGNvbmZpZy90Yy1taXBzLmM6MTEzNTQKLW1zZ2lkICJleHRlbmRlZCBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTgzOCBjb25maWcvdGMtbWlwcy5jOjE4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAianVtcCB0byBtaXNhbGlnbmVkIGFkZHJlc3MgKDB4JWx4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjI0OTUgY29uZmlnL3RjLW1pcHMuYzoyODM4Ci1tc2dpZCAiTWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoyODkxCi1tc2dpZCAidW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoyODkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkluc3RydWN0aW9uICVzIHJlcXVpcmVzIGFic29sdXRlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozMDM5Ci1tc2dpZCAiTnVtYmVyIGxhcmdlciB0aGFuIDMyIGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozMDYwCi1tc2dpZCAiTnVtYmVyIGxhcmdlciB0aGFuIDY0IGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozMzI2IGNvbmZpZy90Yy1taXBzLmM6MzM5OCBjb25maWcvdGMtbWlwcy5jOjUwNzcKLSM6IGNvbmZpZy90Yy1taXBzLmM6NTEyOCBjb25maWcvdGMtbWlwcy5jOjU2NjQgY29uZmlnL3RjLW1pcHMuYzo1NzI3Ci1tc2dpZCAiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MzYzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJCcmFuY2ggJXMgaXMgYWx3YXlzIGZhbHNlIChub3ApIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MzY0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJCcmFuY2ggbGlrZWx5ICVzIGlzIGFsd2F5cyBmYWxzZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjM2NDkgY29uZmlnL3RjLW1pcHMuYzozNzIzIGNvbmZpZy90Yy1taXBzLmM6MzgyNgotIzogY29uZmlnL3RjLW1pcHMuYzozODgxIGNvbmZpZy90Yy1taXBzLmM6Njc2NCBjb25maWcvdGMtbWlwcy5jOjY3NzMKLSM6IGNvbmZpZy90Yy1taXBzLmM6Njc4MSBjb25maWcvdGMtbWlwcy5jOjY4OTAKLW1zZ2lkICJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jLiByZXN1bHQgaXMgYWx3YXlzIHRydWUKLSM6IGNvbmZpZy90Yy1taXBzLmM6MzY4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJCcmFuY2ggJXMgaXMgYWx3YXlzIHRydWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozOTU3IGNvbmZpZy90Yy1taXBzLmM6NDA2NAotbXNnaWQgIkRpdmlkZSBieSB6ZXJvLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjQ2NDgKLW1zZ2lkICJNSVBTIFBJQyBjYWxsIHRvIHJlZ2lzdGVyIG90aGVyIHRoYW4gJDI1IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NDY1MyBjb25maWcvdGMtbWlwcy5jOjQ3NjUKLW1zZ2lkICJObyAuY3ByZXN0b3JlIHBzZXVkby1vcCB1c2VkIGluIFBJQyBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NDgzOCBjb25maWcvdGMtbWlwcy5jOjQ5MjcgY29uZmlnL3RjLW1pcHMuYzo1NDE1Ci0jOiBjb25maWcvdGMtbWlwcy5jOjU0NTYgY29uZmlnL3RjLW1pcHMuYzo1NDc0IGNvbmZpZy90Yy1taXBzLmM6NjEwMwotbXNnaWQgIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NTkzNCBjb25maWcvdGMtbWlwcy5jOjY2NTgKLW1zZ2lkICJNYWNybyB1c2VkICRhdCBhZnRlciBcIi5zZXQgbm9hdFwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjA3NCBjb25maWcvdGMtbWlwcy5jOjYwOTIKLW1zZ2lkICJyb3RhdGUgY291bnQgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnN0cnVjdGlvbiAlczogcmVzdWx0IGlzIGFsd2F5cyBmYWxzZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjYzMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgdHJ1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjY0NTEgY29uZmlnL3RjLW1pcHMuYzo2NDc4IGNvbmZpZy90Yy1taXBzLmM6NjU1MAotIzogY29uZmlnL3RjLW1pcHMuYzo2NTc1Ci1tc2dpZCAib3BlcmFuZCBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogQ2hlY2sgaWYgdGhpcyBpcyBvbmUgb2YgdGhlIGl0YmwgbWFjcm9zLCBzaW5jZSB0aGV5Ci0jLiBhcmUgYWRkZWQgZHluYW1pY2FsbHkuCi0jOiBjb25maWcvdGMtbWlwcy5jOjY2NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTWFjcm8gJXMgbm90IGltcGxlbWVudGVkIHlldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjY5MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAobWFzayBlcnJvcik6ICVzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Njk3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlICh1bmtub3duIG9wZXJhbmQgdHlwZSBgJWMnKTogJXMgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2OTgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKGJpdHMgMHglbHggdW5kZWZpbmVkKTogJXMgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MDkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yOiAlZCAoTUlQUyVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcxNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW1wcm9wZXIgc2hpZnQgYW1vdW50ICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzE4OCBjb25maWcvdGMtbWlwcy5jOjgzMDUgY29uZmlnL3RjLW1pcHMuYzo4NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgdmFsdWUgZm9yIGAlcycgKCVsdSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MjA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgYnJlYWsgY29kZSAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcyMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBsb3dlciBicmVhayBjb2RlICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzIzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIHN5c2NhbGwgY29kZSAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcyNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29wcm9jY2Vzb3IgY29kZSA+IDI1IGJpdHMgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWRhdGUgcGVyZm9ybWFuY2UgcmVnc3RlciAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcyOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlciBudW1iZXIgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc0NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBmbG9hdCByZWdpc3RlciBudW1iZXIgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc0NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmxvYXQgcmVnaXN0ZXIgc2hvdWxkIGJlIGV2ZW4sIHdhcyAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc1MTcgY29uZmlnL3RjLW1pcHMuYzo3NzQ5IGNvbmZpZy90Yy1taXBzLmM6Nzc4OAotbXNnaWQgImFic29sdXRlIGV4cHJlc3Npb24gcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3NTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJhZCBmbG9hdGluZyBwb2ludCBjb25zdGFudDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3Njk1Ci1tc2dpZCAiQ2FuJ3QgdXNlIGZsb2F0aW5nIHBvaW50IGluc24gaW4gdGhpcyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzc1MQotbXNnaWQgIjE2IGJpdCBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAwLi42NTUzNSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc3OTAKLW1zZ2lkICIxNiBiaXQgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgLTMyNzY4Li4zMjc2NyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc4NjIKLW1zZ2lkICJsdWkgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgMC4uNjU1MzUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3ODg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXIgJGZjYyVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzg5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgY2hhciA9ICclYydcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc5MDcgY29uZmlnL3RjLW1pcHMuYzo4NDQ1Ci1tc2dpZCAiaWxsZWdhbCBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc5NzQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODA4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODE2NAotbXNnaWQgInVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjgzMzkKLW1zZ2lkICJjYW4ndCBwYXJzZSByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODM3MyBjb25maWcvdGMtbWlwcy5jOjg0MDMKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4NTcwCi1tc2dpZCAiZXh0ZW5kZWQgb3BlcmFuZCByZXF1ZXN0ZWQgYnV0IG5vdCByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjg1NzIKLW1zZ2lkICJpbnZhbGlkIHVuZXh0ZW5kZWQgb3BlcmFuZCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjg2MDAKLW1zZ2lkICJvcGVyYW5kIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIGludmFsaWQgbGVhZGluZyAndicgaW4gLW1jcHU9JXMgc3dpdGNoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTA1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAtbWNwdT0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkxMDcKLW1zZ2lkICItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBlbWJlZGRlZCBQSUMgY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkxMTkKLW1zZ2lkICItY2FsbF9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MTI1IGNvbmZpZy90Yy1taXBzLmM6MTAxNjYgY29uZmlnL3RjLW1pcHMuYzoxMDMzNAotbXNnaWQgIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MTM0Ci1tc2dpZCAiLW5vbl9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MTUwCi1tc2dpZCAiLUcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb25maWd1cmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTE1NQotbXNnaWQgIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgb3IgZW1iZWRkZWQgUElDIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MTc5Ci1tc2dpZCAiTm8gY29tcGlsZWQgaW4gc3VwcG9ydCBmb3IgNjQgYml0IG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkyNjkKLW1zZ2lkICIiCi0iTUlQUyBvcHRpb25zOlxuIgotIi1tZW1iZWRkZWQtcGljXHRcdGdlbmVyYXRlIGVtYmVkZGVkIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcbiIKLSItRUJcdFx0XHRnZW5lcmF0ZSBiaWcgZW5kaWFuIG91dHB1dFxuIgotIi1FTFx0XHRcdGdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gb3V0cHV0XG4iCi0iLWcsIC1nMlx0XHRcdGRvIG5vdCByZW1vdmUgdW5lZWRlZCBOT1BzIG9yIHN3YXAgYnJhbmNoZXNcbiIKLSItRyBOVU1cdFx0XHRhbGxvdyByZWZlcmVuY2luZyBvYmplY3RzIHVwIHRvIE5VTSBieXRlc1xuIgotIlx0XHRcdGltcGxpY2l0bHkgd2l0aCB0aGUgZ3AgcmVnaXN0ZXIgW2RlZmF1bHQgOF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkyNzcKLW1zZ2lkICIiCi0iLW1pcHMxXHRcdFx0Z2VuZXJhdGUgTUlQUyBJU0EgSSBpbnN0cnVjdGlvbnNcbiIKLSItbWlwczJcdFx0XHRnZW5lcmF0ZSBNSVBTIElTQSBJSSBpbnN0cnVjdGlvbnNcbiIKLSItbWlwczNcdFx0XHRnZW5lcmF0ZSBNSVBTIElTQSBJSUkgaW5zdHJ1Y3Rpb25zXG4iCi0iLW1pcHM0XHRcdFx0Z2VuZXJhdGUgTUlQUyBJU0EgSVYgaW5zdHJ1Y3Rpb25zXG4iCi0iLW1jcHU9Q1BVXHRcdGdlbmVyYXRlIGNvZGUgZm9yIENQVSwgd2hlcmUgQ1BVIGlzIG9uZSBvZjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkzMDMKLW1zZ2lkICIiCi0iLW1DUFVcdFx0XHRlcXVpdmFsZW50IHRvIC1tY3B1PUNQVS5cbiIKLSItbm8tbUNQVVx0XHRkb24ndCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIENQVS5cbiIKLSJcdFx0XHRGb3IgLW1DUFUgYW5kIC1uby1tQ1BVLCBDUFUgbXVzdCBiZSBvbmUgb2Y6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MzE2Ci1tc2dpZCAiIgotIi1taXBzMTZcdFx0XHRnZW5lcmF0ZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zXG4iCi0iLW5vLW1pcHMxNlx0XHRkbyBub3QgZ2VuZXJhdGUgbWlwczE2IGluc3RydWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTMxOQotbXNnaWQgIiIKLSItTzBcdFx0XHRyZW1vdmUgdW5uZWVkZWQgTk9QcywgZG8gbm90IHN3YXAgYnJhbmNoZXNcbiIKLSItT1x0XHRcdHJlbW92ZSB1bm5lZWRlZCBOT1BzIGFuZCBzd2FwIGJyYW5jaGVzXG4iCi0iLS10cmFwLCAtLW5vLWJyZWFrXHR0cmFwIGV4Y2VwdGlvbiBvbiBkaXYgYnkgMCBhbmQgbXVsdCBvdmVyZmxvd1xuIgotIi0tYnJlYWssIC0tbm8tdHJhcFx0YnJlYWsgZXhjZXB0aW9uIG9uIGRpdiBieSAwIGFuZCBtdWx0IG92ZXJmbG93XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MzI1Ci1tc2dpZCAiIgotIi1LUElDLCAtY2FsbF9zaGFyZWRcdGdlbmVyYXRlIFNWUjQgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuIgotIi1ub25fc2hhcmVkXHRcdGRvIG5vdCBnZW5lcmF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG4iCi0iLXhnb3RcdFx0XHRhc3N1bWUgYSAzMiBiaXQgR09UXG4iCi0iLTMyXHRcdFx0Y3JlYXRlIDMyIGJpdCBvYmplY3QgZmlsZSAoZGVmYXVsdClcbiIKLSItNjRcdFx0XHRjcmVhdGUgNjQgYml0IG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MzgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuc3VwcG9ydGVkIHJlbG9jIHNpemUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5NDg1Ci1tc2dpZCAiVW5tYXRjaGVkICUlaGkgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5NTkwCi1tc2dpZCAiSW52YWxpZCBQQyByZWxhdGl2ZSByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk2OTAgY29uZmlnL3RjLXNwYXJjLmM6MjkxNSBjb25maWcvdGMtc3BhcmMuYzoyOTIyCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyOTI5IGNvbmZpZy90Yy1zcGFyYy5jOjI5MzYgY29uZmlnL3RjLXNwYXJjLmM6Mjk0MwotIzogY29uZmlnL3RjLXNwYXJjLmM6Mjk1MiBjb25maWcvdGMtc3BhcmMuYzoyOTYzIGNvbmZpZy90Yy1zcGFyYy5jOjI5ODkKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMwMTcgd3JpdGUuYzo5NzEgd3JpdGUuYzoxMDM1Ci1tc2dpZCAicmVsb2NhdGlvbiBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk3MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQnJhbmNoIHRvIG9kZCBhZGRyZXNzICglbHgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTg2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlMDhseCAgVU5ERUZJTkVEXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5OTI3Ci1tc2dpZCAiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAwMTUKLW1zZ2lkICJObyByZWFkIG9ubHkgZGF0YSBzZWN0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAwMzgKLW1zZ2lkICJHbG9iYWwgcG9pbnRlcnMgbm90IHN1cHBvcnRlZDsgcmVjb21waWxlIC1HIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDEyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gc3VjaCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAxNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLm9wdGlvbiBwaWMlZCBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAxNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIG9wdGlvbiBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDIzNQotbXNnaWQgImBub3Jlb3JkZXInIG11c3QgYmUgc2V0IGJlZm9yZSBgbm9tYWNybyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDI3MAotbXNnaWQgInVua25vd24gSVNBIGxldmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAyOTMKLW1zZ2lkICIuc2V0IHBvcCB3aXRoIG5vIC5zZXQgcHVzaCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMzE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRyaWVkIHRvIHNldCB1bnJlY29nbml6ZWQgc3ltYm9sOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAzNjcKLW1zZ2lkICIuY3Bsb2FkIG5vdCBpbiBub3Jlb3JkZXIgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNDQ5Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgdXNlIG9mIC5ncHdvcmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDU4NgotbXNnaWQgImV4cGVjdGVkIGAkJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNTk0Ci1tc2dpZCAiQmFkIHJlZ2lzdGVyIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNjEwCi1tc2dpZCAiVW5yZWNvZ25pemVkIHJlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDgwOQotbXNnaWQgInVuc3VwcG9ydGVkIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSB0byBkaWZmZXJlbnQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwOTE4Ci1tc2dpZCAidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExMDAxCi1tc2dpZCAiQVQgdXNlZCBhZnRlciBcIi5zZXQgbm9hdFwiIG9yIG1hY3JvIHVzZWQgYWZ0ZXIgXCIuc2V0IG5vbWFjcm9cIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExMDY0Ci1tc2dpZCAiRG91YmxlIGNoZWNrIGZ4X3JfdHlwZSBpbiB0Yy1taXBzLmM6dGNfZ2VuX3JlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE1NzUKLW1zZ2lkICJtaXNzaW5nIGAuZW5kJyBhdCBlbmQgb2YgYXNzZW1ibHkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTU5MAotbXNnaWQgIkV4cGVjdGVkIHNpbXBsZSBudW1iZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE2MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyVjJyAweCUwMnhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNjE4Ci1tc2dpZCAiSW52YWxpZCBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTY3MwotbXNnaWQgIi5lbmQgbm90IGluIHRleHQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNjc3Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTY4NgotbXNnaWQgIi5lbmQgc3ltYm9sIGRvZXMgbm90IG1hdGNoIC5lbnQgc3ltYm9sLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNjg5Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgbWlzc2luZyBvciB1bmtub3duIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNzY0Ci1tc2dpZCAiLmVudCBvciAuYWVudCBub3QgaW4gdGV4dCBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNzY3Ci1tc2dpZCAibWlzc2luZyBgLmVuZCciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTgwMCBlY29mZi5jOjMyMjcKLW1zZ2lkICIuZnJhbWUgb3V0c2lkZSBvZiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE4MTEgZWNvZmYuYzozMjM4Ci1tc2dpZCAiQmFkIC5mcmFtZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTg0MQotbXNnaWQgIi5tYXNrLy5mbWFzayBvdXRzaWRlIG9mIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTg0OAotbXNnaWQgIkJhZCAubWFzay8uZm1hc2sgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMjAwLmM6MzEzCi1tc2dpZCAiIgotIk1OMTAyMDAgb3B0aW9uczpcbiIKLSJub25lIHlldFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMjAwLmM6Nzg4IGNvbmZpZy90Yy1tbjEwMzAwLmM6OTEyIGNvbmZpZy90Yy1wcGMuYzoxNjE0Ci0jOiBjb25maWcvdGMtdjg1MC5jOjE2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjQ5NQotbXNnaWQgIiIKLSJNTjEwMzAwIG9wdGlvbnM6XG4iCi0ibm9uZSB5ZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjkzMAotbXNnaWQgIkludmFsaWQgb3Bjb2RlL29wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTQwNgotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NDQ0Ci1tc2dpZCAiSW52YWxpZCBzeW50YXggaW4gUEMtcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjQ2OAotbXNnaWQgIkludmFsaWQgc3ludGF4IGluIEV4dGVybmFsIGFkZHJlc3NpbmcgbW9kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo1MzcKLW1zZ2lkICJJbnZhbGlkIHN5bnRheCBpbiBNZW1vcnkgUmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjYwNAotbXNnaWQgIkludmFsaWQgc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIChiLHcsZCxxKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo2MDkKLW1zZ2lkICJTeW50YXggaW4gc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIFtSbjptXSB3aGVyZSBuPVswLi43XSBtPXtiLHcsZCxxfSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo2MTUKLW1zZ2lkICJTY2FsZWQtaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQtaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NjI0Ci1tc2dpZCAiSW52YWxpZCBvciBpbGxlZ2FsIGFkZHJlc3NpbmcgbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZC1pbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo3MzEKLW1zZ2lkICJQcmVtYXR1cmUgZW5kIG9mIHN1ZmZpeCAtLSBEZWZhdWx0aW5nIHRvIGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NzQ0Ci1tc2dpZCAiQmFkIHN1ZmZpeCBhZnRlciAnOicgdXNlIHtifHd8ZH0gRGVmYXVsdGluZyB0byBkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjc4NQotbXNnaWQgIlZlcnkgc2hvcnQgaW5zdHIgdG8gb3B0aW9uLCBpZSB5b3UgY2FuJ3QgZG8gaXQgb24gYSBOVUxMc3RyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjgyOQotbXNnaWQgIk5vIHN1Y2ggZW50cnkgaW4gbGlzdC4gKGNwdS9tbXUgcmVnaXN0ZXIpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjg3MAotbXNnaWQgIkludGVybmFsIGNvbnNpc3RlbmN5IGVycm9yLiAgY2hlY2sgbnMzMmstb3Bjb2RlLmgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6ODkxCi1tc2dpZCAiQWRkcmVzcyBvZiBpbW1lZGlhdGUgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo4OTIKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSB3cml0ZSBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMDE5Ci1tc2dpZCAiQmFkIG9wY29kZS10YWJsZS1vcHRpb24sIGNoZWNrIGluIGZpbGUgbnMzMmstb3Bjb2RlLmgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTA0OAotbXNnaWQgIk5vIHN1Y2ggb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjExMTYKLW1zZ2lkICJCYWQgc3VmZml4LCBkZWZhdWx0aW5nIHRvIGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTEzOAotbXNnaWQgIlRvbyBtYW55IG9wZXJhbmRzIHBhc3NlZCB0byBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiBjaGVjayBlcnJvciBpbiBkZWZhdWx0Ci0jOiBjb25maWcvdGMtbnMzMmsuYzoxMTQ5Ci1tc2dpZCAiV3JvbmcgbnVtYmVycyBvZiBvcGVyYW5kcyBpbiBkZWZhdWx0LCBjaGVjayBuczMyay1vcGNvZGVzLmgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTE1NAotbXNnaWQgIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMjczCi1tc2dpZCAiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvYmluYXJ5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjEyODkKLW1zZ2lkICJCaWdudW0gdG9vIGJpZyBmb3IgbG9uZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMzY0Ci1tc2dpZCAiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvcG9pbnRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMzY5Ci1tc2dpZCAiSW50ZXJuYWwgbG9naWMgZXJyb3IgaW4gaWlmLmlpZlBbbl0udHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBXZSBjYW50IHJlbGF4IHRoaXMgY2FzZQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTQwMwotbXNnaWQgIkNhbid0IHJlbGF4IGRpZmZlcmVuY2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTQ1MgotbXNnaWQgIkRpc3BsYWNlbWVudCB0byBsYXJnZSBmb3IgOmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTQ2MwotbXNnaWQgIkludGVybmFsIGxvZ2ljIGVycm9yIGluIGlpZi5paWZQW10udHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNTE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBzdG9yYWdlIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTUyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiBmb3Igc3RvcmFnZSB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE1NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgaGFzaCAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTYzNwotbXNnaWQgIkJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZS4gIGxpbmUgbnVtYmVyIG5vdCB2YWxpZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNjQ2Ci1tc2dpZCAiV29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlLiAgbGluZSBudW1iZXIgbm90IHZhbGlkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE2NjAKLW1zZ2lkICJEb3VibGUgd29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE2ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgbG9naWMgZXJyb3IuICBsaW5lICVzLCBmaWxlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGxvZ2ljIGVycm9yLiBsaW5lICVzLCBmaWxlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxODM5Ci1tc2dpZCAiQml0IGZpZWxkIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoyMDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIG9wdGlvbiAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjIxMDQKLW1zZ2lkICIiCi0iTlMzMksgb3B0aW9uczpcbiIKLSItbTMyMDMyIHwgLW0zMjUzMlx0c2VsZWN0IHZhcmlhbnQgb2YgTlMzMksgYXJjaGl0ZWN0dXJlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MjI4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgZmluZCByZWxvY2F0aW9uIHR5cGUgZm9yIHN5bWJvbCAlcywgY29kZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcGouYzo3MCBjb25maWcvdGMtcGouYzo3OAotbXNnaWQgImNvbmZ1c2luZyByZWxvY2F0aW9uIGV4cHJlc3Npb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wai5jOjE3MgotbXNnaWQgImNhbid0IGhhdmUgcmVsb2NhdGlvbiBmb3IgaXB1c2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBqLmM6MjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3Bjb2RlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wai5jOjQzMQotbXNnaWQgIiIKLSJQSiBvcHRpb25zOlxuIgotIi1saXR0bGVcdFx0XHRnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcbiIKLSItYmlnXHRcdFx0Z2VuZXJhdGUgYmlnIGVuZGlhbiBjb2RlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBqLmM6NDcyIGNvbmZpZy90Yy1zaC5jOjI1NzAgY29uZmlnL3RjLXNoLmM6MjU3NwotIzogY29uZmlnL3RjLXNoLmM6MjU4NCBjb25maWcvdGMtc2guYzoyNTkxCi1tc2dpZCAicGNyZWwgdG9vIGZhciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcGouYzo1NDEgY29uZmlnL3RjLXNoLmM6MjY2MwotbXNnaWQgIm9mZnNldCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjgzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHN3aXRjaCAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo4NzIKLW1zZ2lkICIiCi0iUG93ZXJQQyBvcHRpb25zOlxuIgotIi11XHRcdFx0aWdub3JlZFxuIgotIi1tcHdyeCwgLW1wd3IyXHRcdGdlbmVyYXRlIGNvZGUgZm9yIElCTSBQT1dFUi8yIChSSU9TMilcbiIKLSItbXB3clx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIElCTSBQT1dFUiAoUklPUzEpXG4iCi0iLW02MDFcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYwMVxuIgotIi1tcHBjLCAtbXBwYzMyLCAtbTQwMywgLW02MDMsIC1tNjA0XG4iCi0iXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MDMvNjA0XG4iCi0iLW1wcGM2NCwgLW02MjBcdFx0Z2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MjBcbiIKLSItbXBwYzY0YnJpZGdlXHRcdGdlbmVyYXRlIGNvZGUgZm9yIFBvd2VyUEMgNjQsIGluY2x1ZGluZyBicmlkZ2UgaW5zbnNcbiIKLSItbWNvbVx0XHRcdGdlbmVyYXRlIGNvZGUgUG93ZXIvUG93ZXJQQyBjb21tb24gaW5zdHJ1Y3Rpb25zXG4iCi0iLW1hbnlcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBhbnkgYXJjaGl0ZWN0dXJlIChQV1IvUFdSWC9QUEMpXG4iCi0iLW1yZWduYW1lc1x0XHRBbGxvdyBzeW1ib2xpYyBuYW1lcyBmb3IgcmVnaXN0ZXJzXG4iCi0iLW1uby1yZWduYW1lc1x0XHREbyBub3QgYWxsb3cgc3ltYm9saWMgbmFtZXMgZm9yIHJlZ2lzdGVyc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo4ODcKLW1zZ2lkICIiCi0iLW1yZWxvY2F0YWJsZVx0XHRzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUgb3B0aW9uXG4iCi0iLW1yZWxvY2F0YWJsZS1saWJcdHN1cHBvcnQgZm9yIEdDQydzIC1tcmVsb2NhdGJsZS1saWIgb3B0aW9uXG4iCi0iLW1lbWJcdFx0XHRzZXQgUFBDX0VNQiBiaXQgaW4gRUxGIGZsYWdzXG4iCi0iLW1saXR0bGUsIC1tbGl0dGxlLWVuZGlhblxuIgotIlx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lXG4iCi0iLW1iaWcsIC1tYmlnLWVuZGlhblx0Z2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcbiIKLSItbXNvbGFyaXNcdFx0Z2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuIgotIi1tbm8tc29sYXJpc1x0XHRkbyBub3QgZ2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuIgotIi1WXHRcdFx0cHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG4iCi0iLVF5LCAtUW5cdFx0aWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo5MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBkZWZhdWx0IGNwdSA9ICVzLCBvcyA9ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo5NDcKLW1zZ2lkICJOZWl0aGVyIFBvd2VyIG5vciBQb3dlclBDIG9wY29kZXMgd2VyZSBzZWxlY3RlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjk5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBhc3NlbWJsZXIgZXJyb3IgZm9yIGluc3RydWN0aW9uICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxMDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGFzc2VtYmxlciBlcnJvciBmb3IgbWFjcm8gJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjEyMjQKLW1zZ2lkICJpZGVudGlmaWVyK2NvbnN0YW50QGdvdCBtZWFucyBpZGVudGlmaWVyQGdvdCtjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTI3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyByZWxvY2F0aW9ucyBkbyBub3QgZml0IGluICVkIGJ5dGVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjEzNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5sY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE0NjAKLW1zZ2lkICJSZWxvY2F0aW9uIGNhbm5vdCBiZSBkb25lIHdoZW4gdXNpbmcgLW1yZWxvY2F0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTU0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW50YXggZXJyb3I6IGludmFsaWQgdG9jIHNwZWNpZmllciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxNTU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN5bnRheCBlcnJvcjogZXhwZWN0ZWQgYF0nLCBmb3VuZCAgYCVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTc5MAotbXNnaWQgIlt0b2N2XSBzeW1ib2wgaXMgbm90IGEgdG9jIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTgwMQotbXNnaWQgIlVuaW1wbGVtZW50ZWQgdG9jMzIgZXhwcmVzc2lvbiBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTgwNgotbXNnaWQgIlVuaW1wbGVtZW50ZWQgdG9jNjQgZXhwcmVzc2lvbiBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBbJWRdIGZyb20gcGFyc2VfdG9jX2VudHJ5IVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxOTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgInN5bnRheCBlcnJvcjsgZm91bmQgYCVjJyBidXQgZXhwZWN0ZWQgYCVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjA3MQotbXNnaWQgIndyb25nIG51bWJlciBvZiBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjEyNwotbXNnaWQgIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmU6IHdhbnQgYSx3LHgsZSBpbiBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIyNDEKLW1zZ2lkICJtaXNzaW5nIHNpemUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIyNTAKLW1zZ2lkICJuZWdhdGl2ZSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMjkxCi1tc2dpZCAibWlzc2luZyByZWFsIHN5bWJvbCBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMzEyCi1tc2dpZCAiYXR0ZW1wdCB0byByZWRlZmluZSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI1NDYKLW1zZ2lkICJUaGUgWENPRkYgZmlsZSBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI2NTQgY29uZmlnL3RjLXBwYy5jOjMxNzEgcmVhZC5jOjI5NzYKLW1zZ2lkICJtaXNzaW5nIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNjcyCi1tc2dpZCAiaWxsZWdhbCAuc3RhYnggZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNzA0Ci1tc2dpZCAibWlzc2luZyBjbGFzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjcxMwotbXNnaWQgIm1pc3NpbmcgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6Mjc3NAotbXNnaWQgIm1pc3Npbmcgc3ltYm9sIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI5NTAKLW1zZ2lkICJuZXN0ZWQgLmJzIGJsb2NrcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6Mjk4MwotbXNnaWQgIi5lcyB3aXRob3V0IHByZWNlZGluZyAuYnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjMxNjMKLW1zZ2lkICJub24tY29uc3RhbnQgYnl0ZSBjb3VudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MzIwOAotbXNnaWQgIi50YyBub3QgaW4gLnRvYyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzozMjI3Ci1tc2dpZCAiLnRjIHdpdGggbm8gbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjMzMDIKLW1zZ2lkICJObyBwcmV2aW91cyBzZWN0aW9uIHRvIHJldHVybiB0by4gRGlyZWN0aXZlIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSMuIFNlY3Rpb24gQ29udGVudHMKLSMuIHVua25vd24KLSM6IGNvbmZpZy90Yy1wcGMuYzozNzIxCi1tc2dpZCAiVW5zdXBwb3J0ZWQgc2VjdGlvbiBhdHRyaWJ1dGUgLS0gJ2EnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzozOTExCi1tc2dpZCAiYmFkIHN5bWJvbCBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQwMDQKLW1zZ2lkICJVbnJlY29nbml6ZWQgc3ltYm9sIHN1ZmZpeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDA4NgotbXNnaWQgInR3byAuZnVuY3Rpb24gcHNldWRvLW9wcyB3aXRoIG5vIGludGVydmVuaW5nIC5lZiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDA5OQotbXNnaWQgIi5lZiB3aXRoIG5vIHByZWNlZGluZyAuZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQyMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2FybmluZzogc3ltYm9sICVzIGhhcyBubyBjc2VjdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDUyOAotbXNnaWQgInN5bWJvbCBpbiAudG9jIGRvZXMgbm90IG1hdGNoIGFueSAudGMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ4MjYKLW1zZ2lkICJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ4ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0ODg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBlbWl0IFBDIHJlbGF0aXZlICVzIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ5NDcKLW1zZ2lkICJtdXN0IGJyYW5jaCB0byBhbiBhZGRyZXNzIGEgbXVsdGlwbGUgb2YgNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDk1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJAbG9jYWwgb3IgQHBsdCBicmFuY2ggZGVzdGluYXRpb24gaXMgdG9vIGZhciBhd2F5LCAlbGQgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ5NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR2FzIGZhaWx1cmUsIHJlbG9jIHZhbHVlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NjcxCi1tc2dpZCAiaWxsZWdhbCByZWdpc3RlciBhZnRlciBALSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzo2ODcKLW1zZ2lkICJtdXN0IGJlIEAocjAsLi4uKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzo3MDMKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gQChyMCwuLi4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjczNSBjb25maWcvdGMtc2guYzo3NDAKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gQChkaXNwLFtSbiwgZ2JyLCBwY10pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjc0NQotbXNnaWQgImV4cGVjdGluZyApIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjc1NAotbXNnaWQgImlsbGVnYWwgcmVnaXN0ZXIgYWZ0ZXIgQCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxMjU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXI6ICdyJWQnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjEzOTIKLW1zZ2lkICJpbnNuIGNhbid0IGJlIGNvbWJpbmVkIHdpdGggcGFyYWxsZWwgcHJvY2Vzc2luZyBpbnNuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjEzOTkgY29uZmlnL3RjLXNoLmM6MTQxMAotbXNnaWQgIm11bHRpcGxlIG1vdnggc3BlY2lmaWNhdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTQwNCBjb25maWcvdGMtc2guYzoxNDMxCi1tc2dpZCAibXVsdGlwbGUgbW92eSBzcGVjaWZpY2F0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNDEyCi1tc2dpZCAiaW52YWxpZCBtb3Z4IGFkZHJlc3MgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTQxOCBjb25maWcvdGMtc2guYzoxNDIzCi1tc2dpZCAiaW52YWxpZCBtb3Z4IGRzcCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNDQwIGNvbmZpZy90Yy1zaC5jOjE0NDUKLW1zZ2lkICJpbnZhbGlkIG1vdnkgZHNwIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE0NDkKLW1zZ2lkICJpbnZhbGlkIG1vdnkgYWRkcmVzcyByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNDU1Ci1tc2dpZCAiZHNwIGltbWVkaWF0ZSBzaGlmdCB2YWx1ZSBub3QgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTQ2MiBjb25maWcvdGMtc2guYzoxNDc1Ci1tc2dpZCAibXVsdGlwbGUgcGFyYWxsZWwgcHJvY2Vzc2luZyBzcGVjaWZpY2F0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNDY4Ci1tc2dpZCAibXVsdGlwbGUgY29uZGl0aW9uIHNwZWNpZmljYXRpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE0ODQKLW1zZ2lkICJpbnNuIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIHBtdWxzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE1MDEKLW1zZ2lkICJiYWQgcGFkZCAvIHBzdWIgcG11bHMgb3V0cHV0IG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTUxMQotbXNnaWQgImNvbmRpdGlvbiBub3QgZm9sbG93ZWQgYnkgY29uZGl0aW9uYWxpemFibGUgaW5zbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNTIxCi1tc2dpZCAidW5yZWNvZ25pemVkIGNoYXJhY3RlcnMgYXQgZW5kIG9mIHBhcmFsbGVsIHByb2Nlc3NpbmcgaW5zbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNjMxCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4Y2VzcyBvcGVyYW5kczogJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNzc3Ci1tc2dpZCAiLnVzZXMgcHNldWRvLW9wIHNlZW4gd2hlbiBub3QgcmVsYXhpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTc4MwotbXNnaWQgImJhZCAudXNlcyBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTg0NAotbXNnaWQgIiIKLSJTSCBvcHRpb25zOlxuIgotIi1saXR0bGVcdFx0XHRnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcbiIKLSItcmVsYXhcdFx0XHRhbHRlciBqdW1wIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzXG4iCi0iLXNtYWxsXHRcdFx0YWxpZ24gc2VjdGlvbnMgdG8gNCBieXRlIGJvdW5kYXJpZXMsIG5vdCAxNlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE4NTQgY29uZmlnL3RjLXc2NS5jOjg4MwotbXNnaWQgImNhbGwgdG8gdGNfTm91dF9maXhfdG9fY2hhcnMgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTk0MAotbXNnaWQgIi51c2VzIGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTk1OQotbXNnaWQgImNhbid0IGZpbmQgZml4dXAgcG9pbnRlZCB0byBieSAudXNlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxOTgyCi1tc2dpZCAiLnVzZXMgdGFyZ2V0IGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MjA3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IG92ZXJmbG93cyAxMi1iaXQgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MjA4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyAxMi1iaXQgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MjA4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIHVuZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDEyLWJpdCBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoyMjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgb3ZlcmZsb3dzIDgtYml0IGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjIyMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byBkZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgOC1iaXQgZmllbGQgIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjIyMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byB1bmRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MjI2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJvdmVyZmxvdyBpbiBicmFuY2ggdG8gJXM7IGNvbnZlcnRlZCBpbnRvIGxvbmdlciBpbnN0cnVjdGlvbiBzZXF1ZW5jZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoyMzM3IGNvbmZpZy90Yy1zaC5jOjIzNjUgY29uZmlnL3RjLXNwYXJjLmM6Mzg5MgotIzogY29uZmlnL3RjLXNwYXJjLmM6MzkxMQotbXNnaWQgIm1pc2FsaWduZWQgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoyNjU1Ci1tc2dpZCAibWlzYWxpZ25lZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjY4Ci1tc2dpZCAiSW52YWxpZCBkZWZhdWx0IGFyY2hpdGVjdHVyZSwgYnJva2VuIGFzc2VtYmxlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjcyIGNvbmZpZy90Yy1zcGFyYy5jOjQ2MwotbXNnaWQgIkJhZCBvcGNvZGUgdGFibGUsIGJyb2tlbiBhc3NlbWJsZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjQ0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAteGFyY2g9JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NDU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIC1BJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIGNvbXBpbGVkIGluIHN1cHBvcnQgZm9yICVkIGJpdCBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTYxCi1tc2dpZCAiVW5yZWNvZ25pemVkIG9wdGlvbiBmb2xsb3dpbmcgLUsiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTg5Ci1tc2dpZCAiU1BBUkMgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1OTcKLW1zZ2lkICIiCi0iXG4iCi0iLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTk4Ci1tc2dpZCAiIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiBTUEFSQyBhcmNoaXRlY3R1cmVcbiIKLSItYnVtcFx0XHRcdHdhcm4gd2hlbiBhc3NlbWJsZXIgc3dpdGNoZXMgYXJjaGl0ZWN0dXJlc1xuIgotIi1zcGFyY1x0XHRcdGlnbm9yZWRcbiIKLSItLWVuZm9yY2UtYWxpZ25lZC1kYXRhXHRmb3JjZSAubG9uZywgZXRjLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHlcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo2MDQKLW1zZ2lkICIta1x0XHRcdGdlbmVyYXRlIFBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjYwOAotbXNnaWQgIiIKLSItMzJcdFx0XHRjcmVhdGUgMzIgYml0IG9iamVjdCBmaWxlXG4iCi0iLTY0XHRcdFx0Y3JlYXRlIDY0IGJpdCBvYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjYxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJcdFx0XHRbZGVmYXVsdCBpcyAlZF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo2MTMKLW1zZ2lkICIiCi0iLVRTT1x0XHRcdHVzZSBUb3RhbCBTdG9yZSBPcmRlcmluZ1xuIgotIi1QU09cdFx0XHR1c2UgUGFydGlhbCBTdG9yZSBPcmRlcmluZ1xuIgotIi1STU9cdFx0XHR1c2UgUmVsYXhlZCBNZW1vcnkgT3JkZXJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo2MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHRcdFx0W2RlZmF1bHQgaXMgJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NjE5Ci1tc2dpZCAiIgotIi1LUElDXHRcdFx0Z2VuZXJhdGUgUElDXG4iCi0iLVZcdFx0XHRwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcbiIKLSItcVx0XHRcdGlnbm9yZWRcbiIKLSItUXksIC1Rblx0XHRpZ25vcmVkXG4iCi0iLXNcdFx0XHRpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NjI3Ci1tc2dpZCAiIgotIi1FTFx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lXG4iCi0iLUVCXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcbiIKLSItLWxpdHRsZS1lbmRpYW4tZGF0YVx0Z2VuZXJhdGUgY29kZSBmb3IgYSBtYWNoaW5lIGhhdmluZyBiaWcgZW5kaWFuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFuZCBsaXR0bGUgZW5kaWFuIGRhdGEuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjc0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo3NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGNhbid0IGZpbmQgb3Bjb2RlIGAlcycgZm9yIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo5MTEKLW1zZ2lkICJTdXBwb3J0IGZvciA2NC1iaXQgYXJpdGhtZXRpYyBub3QgY29tcGlsZWQgaW4uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjk1NwotbXNnaWQgInNldDogbnVtYmVyIG5vdCBpbiAwLi40Mjk0OTY3Mjk1IHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjk2NAotbXNnaWQgInNldDogbnVtYmVyIG5vdCBpbiAtMjE0NzQ4MzY0OC4uNDI5NDk2NzI5NSByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMDI0Ci1tc2dpZCAic2V0c3c6IG51bWJlciBub3QgaW4gLTIxNDc0ODM2NDguLjQyOTQ5NjcyOTUgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTA3MgotbXNnaWQgInNldHg6IHRlbXBvcmFyeSByZWdpc3RlciBzYW1lIGFzIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjExNDIKLW1zZ2lkICJzZXR4OiBpbGxlZ2FsIHRlbXBvcmFyeSByZWdpc3RlciBnMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMjM5Ci1tc2dpZCAiRlAgYnJhbmNoIGluIGRlbGF5IHNsb3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTI1NQotbXNnaWQgIkZQIGJyYW5jaCBwcmVjZWRlZCBieSBGUCBpbnN0cnVjdGlvbjsgTk9QIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEyOTUKLW1zZ2lkICJmYWlsZWQgc3BlY2lhbCBjYXNlIGluc24gc2FuaXR5IGNoZWNrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEzODYKLW1zZ2lkICI6IGludmFsaWQgbWVtYmFyIG1hc2sgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxNDAwCi1tc2dpZCAiOiBpbnZhbGlkIG1lbWJhciBtYXNrIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTQwNQotbXNnaWQgIjogaW52YWxpZCBtZW1iYXIgbWFzayBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTQyMwotbXNnaWQgIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjE0MzEKLW1zZ2lkICI6IGludmFsaWQgcHJlZmV0Y2ggZnVuY3Rpb24gZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxNDM2Ci1tc2dpZCAiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxNDY0IGNvbmZpZy90Yy1zcGFyYy5jOjE0NzYKLW1zZ2lkICI6IHVucmVjb2duaXphYmxlIHByaXZpbGVnZWQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTUwMCBjb25maWcvdGMtc3BhcmMuYzoxNTE3Ci1tc2dpZCAiOiB1bnJlY29nbml6YWJsZSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjE1MDUKLW1zZ2lkICI6IHJkIG9uIHdyaXRlIG9ubHkgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjE1NDEKLW1zZ2lkICI6IGFzciBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDE2IGFuZCAzMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxNTQ5Ci1tc2dpZCAiOiBhc3IgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxNTU5Ci1tc2dpZCAiOiBleHBlY3RpbmcgJWFzck4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTg4NwotbXNnaWQgImRldGVjdGVkIGdsb2JhbCByZWdpc3RlciB1c2Ugbm90IGNvdmVyZWQgYnkgLnJlZ2lzdGVyIHBzZXVkby1vcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxOTU5Ci1tc2dpZCAiOiBUaGVyZSBhcmUgb25seSA2NCBmIHJlZ2lzdGVyczsgWzAtNjNdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjE5NjEgY29uZmlnL3RjLXNwYXJjLmM6MTk3MwotbXNnaWQgIjogVGhlcmUgYXJlIG9ubHkgMzIgZiByZWdpc3RlcnM7IFswLTMxXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMDkyIGNvbmZpZy90Yy1zcGFyYy5jOjIxMjgKLW1zZ2lkICJJbGxlZ2FsIG9wZXJhbmRzOiAlJSVzIHJlcXVpcmVzIGFyZ3VtZW50cyBpbiAoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMTQwCi1tc2dpZCAiIgotIklsbGVnYWwgb3BlcmFuZHM6IENhbid0IGRvIGFyaXRobWV0aWNzIG90aGVyIHRoYW4gKyBhbmQgLSBpbnZvbHZpbmcgJSUlcygpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIyNDkKLW1zZ2lkICJJbGxlZ2FsIG9wZXJhbmRzOiBDYW4ndCBhZGQgbm9uLWNvbnN0YW50IGV4cHJlc3Npb24gdG8gJSUlcygpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIyNTkKLW1zZ2lkICIiCi0iSWxsZWdhbCBvcGVyYW5kczogQ2FuJ3QgZG8gYXJpdGhtZXRpY3MgaW52b2x2aW5nICUlJXMoKSBvZiBhIHJlbG9jYXRhYmxlICIKLSJzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjI3NwotbXNnaWQgIjogUEMtcmVsYXRpdmUgb3BlcmFuZCBjYW4ndCBiZSBhIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIzMTAKLW1zZ2lkICI6IGludmFsaWQgQVNJIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjMxOAotbXNnaWQgIjogaW52YWxpZCBBU0kgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMzIzCi1tc2dpZCAiOiBpbnZhbGlkIEFTSSBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjQyMAotbXNnaWQgIk9QRiBpbW1lZGlhdGUgb3BlcmFuZCBvdXQgb2YgcmFuZ2UgKDAtMHgxZmYpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI0MjUKLW1zZ2lkICJub24taW1tZWRpYXRlIE9QRiBvcGVyYW5kLCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI0NDQKLW1zZ2lkICI6IGludmFsaWQgY3ByZWcgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyNDczCi0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgb3BlcmFuZHMlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyNTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdGVjdHVyZSBidW1wZWQgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIG9uIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyNTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdGVjdHVyZSBtaXNtYXRjaCBvbiBcIiVzXCIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI1MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChSZXF1aXJlcyAlczsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyAlcy4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMwNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIG9yIHVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMzY1Ci1tc2dpZCAiYmFkIC5yZXNlcnZlIHNlZ21lbnQgLS0gZXhwZWN0ZWQgQlNTIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzM4MgotbXNnaWQgIm1pc3NpbmcgYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMzOTMgY29uZmlnL3RjLXNwYXJjLmM6MzUzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJhbGlnbm1lbnQgdG9vIGxhcmdlOyBhc3N1bWluZyAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMzk5IGNvbmZpZy90Yy1zcGFyYy5jOjM1NDQKLW1zZ2lkICJuZWdhdGl2ZSBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzQwOSBjb25maWcvdGMtc3BhcmMuYzozNTY3Ci1tc2dpZCAiYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzUyNAotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIGNvbW1vbiBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6Mzc1OSBjb25maWcvdGMtc3BhcmMuYzozNzY5Ci1tc2dpZCAicmVnaXN0ZXIgc3ludGF4IGlzIC5yZWdpc3RlciAlJWdbMjM2N10seyNzY3JhdGNofHN5bWJvbG5hbWV8I2lnbm9yZX0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6Mzc4NwotbXNnaWQgInJlZGVmaW5pdGlvbiBvZiBnbG9iYWwgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6Mzc5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWdpc3RlciBzeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzozODcKLW1zZ2lkICJUaGUgLWEgb3B0aW9uIGRvZXNuJ3QgZXhpc3QuIChEZXNwaXRlIHdoYXQgdGhlIG1hbiBwYWdlIHNheXMhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjM5MSBjb25maWcvdGMtdmF4LmM6MzE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJEaXNwbGFjZW1lbnQgbGVuZ3RoICVzIGlnbm9yZWQhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjM5NSBjb25maWcvdGMtdmF4LmM6MzEzMwotbXNnaWQgIlNZTUJPTCBUQUJMRSBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6Mzk5IGNvbmZpZy90Yy12YXguYzozMTM3Ci1tc2dpZCAiVE9LRU4gVFJBQ0Ugbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjQwMyBjb25maWcvdGMtdmF4LmM6MzE0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJJIGRvbid0IG5lZWQgb3IgdXNlIHRlbXAuIGZpbGUgXCIlc1wiLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzo0MDcgY29uZmlnL3RjLXZheC5jOjMxNDkKLW1zZ2lkICJJIGRvbid0IHVzZSBhbiBpbnRlcnBhc3MgZmlsZSEgLVYgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzo0MjEKLW1zZ2lkICIiCi0iVGFob2Ugb3B0aW9uczpcbiIKLSItYVx0XHRcdGlnbm9yZWRcbiIKLSItZCBMRU5HVEhcdFx0aWdub3JlZFxuIgotIi1KXHRcdFx0aWdub3JlZFxuIgotIi1TXHRcdFx0aWdub3JlZFxuIgotIi10IEZJTEVcdFx0XHRpZ25vcmVkXG4iCi0iLVRcdFx0XHRpZ25vcmVkXG4iCi0iLVZcdFx0XHRpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTA3NQotbXNnaWQgIkNhc3RpbmcgYSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGJhZCBmb3JtLCBhbmQgaXMgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTEzMQotbXNnaWQgIkNvdWxkbid0IHBhcnNlIHRoZSBbaW5kZXhdIGluIHRoaXMgb3BlcmFuZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTEzNwotbXNnaWQgIkNvdWxkbid0IGZpbmQgdGhlIG9wZW5pbmcgJ1snIGZvciB0aGUgaW5kZXggb2YgdGhpcyBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMTc3Ci1tc2dpZCAiQ291bGRuJ3QgZmluZCB0aGUgb3BlbmluZyAnKCcgZm9yIHRoZSBkZXJlZiBvZiB0aGlzIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjExODcKLW1zZ2lkICJPcGVyYW5kIGNhbid0IGJlIGJvdGggcHJlLWluYyBhbmQgcG9zdC1kZWMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEyMTcKLW1zZ2lkICJJIHBhcnNlZCAyIHJlZ2lzdGVycyBpbiB0aGlzIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEyNjcKLW1zZ2lkICJDYW4ndCByZWxvY2F0ZSBleHByZXNzaW9uIGVycm9yLiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIGlzIGFuIGVycm9yLiBUYWhvZSBkb2Vzbid0IGFsbG93IGFueSBleHByZXNzaW9ucwotIy4gYmlnZ2VyIHRoYXQgYSAzMiBiaXQgbG9uZyB3b3JkLiBBbnkgYmlnZ2VyIGhhcyB0byBiZSByZWZlcmVuY2VkCi0jLiBieSBhZGRyZXNzLgotIzogY29uZmlnL3RjLXRhaG9lLmM6MTI3NAotbXNnaWQgIkV4cHJlc3Npb24gaXMgdG9vIGxhcmdlIGZvciBhIDMyIGJpdHMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEyNzkKLW1zZ2lkICJKdW5rIGF0IGVuZCBvZiBleHByZXNzaW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzE5Ci1tc2dpZCAiU3ludGF4IGVycm9yIGluIGRpcmVjdCByZWdpc3RlciBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzIxCi1tc2dpZCAiWW91IGNhbid0IGluZGV4IGEgcmVnaXN0ZXIgaW4gZGlyZWN0IHJlZ2lzdGVyIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMjQKLW1zZ2lkICJTUCBjYW4ndCBiZSB0aGUgc291cmNlIG9wZXJhbmQgd2l0aCBkaXJlY3QgcmVnaXN0ZXIgYWRkcmVzc2luZy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMyNgotbXNnaWQgIkNhbid0IHRha2UgdGhlIGFkZHJlc3Mgb2YgYSByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMyOAotbXNnaWQgIkRpcmVjdCBSZWdpc3RlciBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzMwCi1tc2dpZCAiRm9yIHF1YWQgYWNjZXNzLCB0aGUgcmVnaXN0ZXIgbXVzdCBiZSBldmVuIGFuZCA8IDE0LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzMyCi1tc2dpZCAiWW91IGNhbid0IGNhc3QgYSBkaXJlY3QgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMzgKLW1zZ2lkICJVc2luZyByZWcgMTQgZm9yIHF1YWR3b3JkcyBjYW4gdHJvbXAgdGhlIEZQIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzUwCi1tc2dpZCAiU3ludGF4IGVycm9yIGluIGF1dG8tZGVjIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNTIKLW1zZ2lkICJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBhdXRvIGRlYyBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzU0Ci1tc2dpZCAiQXV0byBkZWMgbW9kZSBjYW50IGJlIHVzZWQgZm9yIHJlYWRpbmcuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNTYKLW1zZ2lkICJBdXRvIGRlYyBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM1OAotbXNnaWQgIkF1dG8gZGVjIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNjAKLW1zZ2lkICJBdXRvIGRlYyB3b24ndCB3b3JrIHdpdGggcXVhZHdvcmRzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzY3Ci1tc2dpZCAiU3ludGF4IGVycm9yIGluIG9uZSBvZiB0aGUgYXV0by1pbmMgbW9kZXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNzMKLW1zZ2lkICJBdXRvIGluYyBkZWZlcnJlZCBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM3NQotbXNnaWQgIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGF1dG8gaW5jIGRlZmVycmVkIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNzcgY29uZmlnL3RjLXRhaG9lLmM6MTM4OAotbXNnaWQgIkF1dG8gaW5jIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzODQKLW1zZ2lkICJZb3UgY2FuJ3Qgd3JpdGUgdG8gYW4gYXV0byBpbmMgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzODYKLW1zZ2lkICJBdXRvIGluYyBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM5MAotbXNnaWQgIkF1dG8gaW5jIHdvbid0IHdvcmsgd2l0aCBxdWFkd29yZHMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzOTIKLW1zZ2lkICJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBpbiBhdXRvIGluYyBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNDAwCi1tc2dpZCAiWW91IGNhbid0IGluZGV4IHRoZSBzcCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQwNgotbXNnaWQgIlN5bnRheCBlcnJvciBpbiByZWdpc3RlciBkaXNwbGFjZWQgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQyNQotbXNnaWQgIkFuIG9mZmVzdCBpcyBuZWVkZWQgZm9yIHRoaXMgb3BlcmFuZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQzNwotbXNnaWQgIllvdSBjYW4ndCBpbmRleCBhIHJlZ2lzdGVyIGluIGltbWVkaWF0ZSBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNDM5Ci1tc2dpZCAiSW1tZWRpYXRlIGFjY2VzcyBjYW4ndCBiZSB1c2VkIGFzIGFuIGFkZHJlc3MuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29tcGlsZXIgYnVnOiBPREQgbnVtYmVyIG9mIGJ5dGVzIGluIGFyZyBzdHJ1Y3R1cmUgJXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE1NzcgY29uZmlnL3RjLXZheC5jOjE4NDcKLW1zZ2lkICJOb3QgZW5vdWdoIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE1ODcgY29uZmlnL3RjLXZheC5jOjE4NTQKLW1zZ2lkICJUb28gbWFueSBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNjM4IGNvbmZpZy90Yy12YXguYzozNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3Jpbmcgc3RhdGVtZW50IGR1ZSB0byBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTczMwotIywgYy1mb3JtYXQKLW1zZ2lkICJDb21wbGlsZXIgYnVnOiBHb3QgYSBjYXNlICglZCkgSSB3YXNuJ3QgZXhwZWN0aW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxODI3Ci1tc2dpZCAiUmVhbCBicmFuY2ggZGlzcGxhY2VtZW50cyBtdXN0IGJlIGV4cHJlc3Npb25zLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxODMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNvbXBsaWVyIGVycm9yOiBJIGdvdCBhbiB1bmtub3duIHN5bnRoZXRpYyBicmFuY2ggOiVjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE5NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFyZiwgYmFkIG1vZGUgJXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo5MAotbXNnaWQgIlJlbGF4YXRpb24gaXMgYSBsdXh1cnkgd2UgY2FuJ3QgYWZmb3JkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjE0MQotbXNnaWQgImJhZCBjYWxsIHRvIG1kX2F0b2YgKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6MjQ1Ci1tc2dpZCAiJzonIG5vdCBmb2xsb3dlZCBieSAnbScgb3IgJ3MnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjI1OQotbXNnaWQgInBhcmVuIG5lc3RpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6Mjc0Ci1tc2dpZCAibWlzbWF0Y2hlZCBwYXJlbnRoZXNpcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo0NjcKLW1zZ2lkICJ1bmhhbmRsZWQgZXhwcmVzc2lvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjY4MgotbXNnaWQgInN5bWJvbCByZWxvYyB0aGF0IGlzIG5vdCBQQyByZWxhdGl2ZSBvciAzMiBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjcwNQotbXNnaWQgInVuaGFuZGxlZCBvcGVyYW5kIG1vZGlmaWVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjc0NgotbXNnaWQgInVuaGFuZGxlZCBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjc5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG1uZW1vbmljOiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjgxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG9wZXJhbmRzOiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjg5MAotbXNnaWQgInVuaGFuZGxlZCBwcmVkZWZpbmVkIHN5bWJvbCBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjk4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJQQyBvZmZzZXQgMHglbHggb3V0c2lkZSByYW5nZSAweCVseC0weCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoxMDAxCi1tc2dpZCAidW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZSBpbiBmaXh1cCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoxMDM4Ci1tc2dpZCAibWRfY29udmVydF9mcmFnKCkgbm90IGltcGxlbWVudGVkIHlldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjI3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8IDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTAwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wZXJhbmQgc2hpZnQ6ICV4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMDAxCi1tc2dpZCAiaW50ZXJuYWwgZmFpbHVyZSBpbiBwYXJzZV9yZWdpc3Rlcl9saXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTAxOQotbXNnaWQgImNvbnN0YW50IGV4cHJlc3Npb24gb3IgcmVnaXN0ZXIgbGlzdCBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEwMjQgY29uZmlnL3RjLXY4NTAuYzoxMDM3IGNvbmZpZy90Yy12ODUwLmM6MTA1NgotbXNnaWQgImhpZ2ggYml0cyBzZXQgaW4gcmVnaXN0ZXIgbGlzdCBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTA5NiBjb25maWcvdGMtdjg1MC5jOjExNjAKLW1zZ2lkICJpbGxlZ2FsIHJlZ2lzdGVyIGluY2x1ZGVkIGluIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTAzCi1tc2dpZCAic3lzdGVtIHJlZ2lzdGVycyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExMDgKLW1zZ2lkICJQU1cgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTE1Ci1tc2dpZCAiSGlnaCB2YWx1ZSBzeXN0ZW0gcmVnaXN0ZXJzIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTEzOQotbXNnaWQgInNlY29uZCByZWdpc3RlciBzaG91bGQgZm9sbG93IGRhc2ggaW4gcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExODcKLW1zZ2lkICIgVjg1MCBvcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE4OAotbXNnaWQgIiAgLW13YXJuLXNpZ25lZC1vdmVyZmxvdyAgICBXYXJuIGlmIHNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTg5Ci1tc2dpZCAiIgotIiAgLW13YXJuLXVuc2lnbmVkLW92ZXJmbG93ICBXYXJuIGlmIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExOTAKLW1zZ2lkICIgIC1tdjg1MCAgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExOTEKLW1zZ2lkICIgIC1tdjg1MGUgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTkyCi1tc2dpZCAiICAtbXY4NTBlYSAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwZWFcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExOTMKLW1zZ2lkICIiCi0iICAtbXY4NTBhbnkgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIGdlbmVyaWMsIGRlc3BpdGUgYW55IHByb2Nlc3NvciAiCi0ic3BlY2lmaWMgaW5zdHJ1Y3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMjA0IGNvbmZpZy90Yy12ODUwLmM6MTIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIGNvbW1hbmQgbGluZSBvcHRpb246IC0lYyVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgZGVmYXVsdCB0YXJnZXQgcHJvY2Vzc29yIGZyb20gc3RyaW5nOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE0NDIKLW1zZ2lkICJjdG9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTQ1OQotbXNnaWQgInNkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTQ3NgotbXNnaWQgInpkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTQ5NAotbXNnaWQgInRkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTcxMgotbXNnaWQgIlRhcmdldCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGluc3RydWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4MDIgY29uZmlnL3RjLXY4NTAuYzoxODMyIGNvbmZpZy90Yy12ODUwLmM6MjAxOAotbXNnaWQgImltbWVkaWF0ZSBvcGVyYW5kIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4MTQKLW1zZ2lkICJBQUFSRyAtPiB1bmhhbmRsZWQgY29uc3RhbnQgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODU4Ci1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTg2MwotbXNnaWQgInJlZ2lzdGVyIHIwIGNhbm5vdCBiZSB1c2VkIGhlcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODc1Ci1tc2dpZCAiaW52YWxpZCBzeXN0ZW0gcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4ODgKLW1zZ2lkICJleHBlY3RlZCBFUCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE5MDQKLW1zZ2lkICJpbnZhbGlkIGNvbmRpdGlvbiBjb2RlIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTI1IGNvbmZpZy90Yy12ODUwLmM6MTkyOQotbXNnaWQgImNvbnN0YW50IHRvbyBiaWcgdG8gZml0IGludG8gaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTgxCi1tc2dpZCAic3ludGF4IGVycm9yOiB2YWx1ZSBpcyBtaXNzaW5nIGJlZm9yZSB0aGUgcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE5ODMKLW1zZ2lkICJzeW50YXggZXJyb3I6IHJlZ2lzdGVyIG5vdCBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE5OTcKLW1zZ2lkICJzeW50YXggZXJyb3I6IHN5c3RlbSByZWdpc3RlciBub3QgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoyMDAyCi1tc2dpZCAic3ludGF4IGVycm9yOiBjb25kaXRpb24gY29kZSBub3QgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoyMDM4Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVklQX0JFR0lOIGVycm9yOiVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzozODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3Jpbmcgc3RhdGVtZW50IGJlY2F1c2UgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo0MzQKLW1zZ2lkICJDYW4ndCByZWxvY2F0ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo1MzcKLW1zZ2lkICJCaWdudW0gbm90IHBlcm1pdHRlZCBpbiBzaG9ydCBsaXRlcmFsLiBJbW1lZGlhdGUgbW9kZSBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6NTQ2Ci1tc2dpZCAiQ2FuJ3QgZG8gZmxvbnVtIHNob3J0IGxpdGVyYWw6IGltbWVkaWF0ZSBtb2RlIHVzZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo1OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQSBiaWdudW0vZmxvbnVtIG1heSBub3QgYmUgYSBkaXNwbGFjZW1lbnQ6IDB4JWx4IHVzZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjkxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJTaG9ydCBsaXRlcmFsIG92ZXJmbG93KCVsZC4pLCBpbW1lZGlhdGUgbW9kZSBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6OTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZvcmNlZCBzaG9ydCBsaXRlcmFsIHRvIGltbWVkaWF0ZSBtb2RlLiBub3dfc2VnPSVzIHRvX3NlZz0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6OTgxCi1tc2dpZCAiTGVuZ3RoIHNwZWNpZmljYXRpb24gaWdub3JlZC4gQWRkcmVzcyBtb2RlIDlGIHVzZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjEwMzAKLW1zZ2lkICJJbnZhbGlkIG9wZXJhbmQ6ICBpbW1lZGlhdGUgdmFsdWUgdXNlZCBhcyBiYXNlIGFkZHJlc3MuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoxMDMyCi1tc2dpZCAiSW52YWxpZCBvcGVyYW5kOiAgaW1tZWRpYXRlIHZhbHVlIHVzZWQgYXMgYWRkcmVzcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjE4MjYKLW1zZ2lkICJvZGQgbnVtYmVyIG9mIGJ5dGVzIGluIG9wZXJhbmQgZGVzY3JpcHRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjE4NDIKLW1zZ2lkICJCYWQgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjM5OQotbXNnaWQgIm5vICdbJyB0byBtYXRjaCAnXSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI0MTcKLW1zZ2lkICJiYWQgcmVnaXN0ZXIgaW4gW10iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI0MTkKLW1zZ2lkICJbUENdIGluZGV4IGJhbm5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjQ1NAotbXNnaWQgIm5vICcoJyB0byBtYXRjaCAnKSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI1ODkKLW1zZ2lkICJpbnZhbGlkIGJyYW5jaCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjE4Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgQCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYyMAotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzICMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MjQKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyAtKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MjYKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyAoKSsiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MjkKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyAoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYzMQotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzIFtdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjMzCi1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MzUKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyBkaXNwbGFjZW1lbnQgbGVuZ3RoIHNwZWNpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjY2NQotbXNnaWQgImludmFsaWQgb3BlcmFuZCBvZiBTXiMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2ODIKLW1zZ2lkICJTXiMgbmVlZHMgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjY4OQotbXNnaWQgIlNeIyBtYXkgb25seSByZWFkLWFjY2VzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjcxNAotbXNnaWQgImludmFsaWQgb3BlcmFuZCBvZiAtKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3MjAKLW1zZ2lkICItKFBDKSB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzIyCi1tc2dpZCAiW11pbmRleCBzYW1lIGFzIC0oKXJlZ2lzdGVyOiB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzU4Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIG9mICgpKyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjc2NAotbXNnaWQgIihQQykrIHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3NjYKLW1zZ2lkICJbXWluZGV4IHNhbWUgYXMgKCkrcmVnaXN0ZXI6IHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3OTEKLW1zZ2lkICIjIGNvbmZsaWN0cyBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3OTMKLW1zZ2lkICIjIGJhcnMgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4MTUKLW1zZ2lkICJ3cml0aW5nIG9yIG1vZGlmeWluZyAjIGlzIHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4NDUKLW1zZ2lkICJsZW5ndGggbm90IG5lZWRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjg1MgotbXNnaWQgImNhbid0IFtdaW5kZXggYSByZWdpc3RlciwgYmVjYXVzZSBpdCBoYXMgbm8gYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjg1NAotbXNnaWQgImEgcmVnaXN0ZXIgaGFzIG5vIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4NjUKLW1zZ2lkICJQQyBwYXJ0IG9mIG9wZXJhbmQgdW5wcmVkaWN0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MzE5NAotbXNnaWQgIiIKLSJWQVggb3B0aW9uczpcbiIKLSItZCBMRU5HVEhcdFx0aWdub3JlZFxuIgotIi1KXHRcdFx0aWdub3JlZFxuIgotIi1TXHRcdFx0aWdub3JlZFxuIgotIi10IEZJTEVcdFx0XHRpZ25vcmVkXG4iCi0iLVRcdFx0XHRpZ25vcmVkXG4iCi0iLVZcdFx0XHRpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjMyMDMKLW1zZ2lkICIiCi0iVk1TIG9wdGlvbnM6XG4iCi0iLStcdFx0XHRoYXNoIGVuY29kZSBuYW1lcyBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzXG4iCi0iLTFcdFx0XHRgY29uc3QnIGhhbmRsaW5nIGNvbXBhdGlibGUgd2l0aCBnY2MgMS54XG4iCi0iLUhcdFx0XHRzaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uXG4iCi0iLWggTlVNXHRcdFx0ZG9uJ3QgaGFzaCBtaXhlZC1jYXNlIG5hbWVzLCBhbmQgYWRqdXN0IGNhc2U6XG4iCi0iXHRcdFx0MCA9IHVwcGVyLCAyID0gbG93ZXIsIDMgPSBwcmVzZXJ2ZSBjYXNlXG4iCi0iLXZcIlZFUlNJT05cIlx0XHRjb2RlIGJlaW5nIGFzc2VtYmxlZCB3YXMgcHJvZHVjZWQgYnkgY29tcGlsZXIgXCJWRVJTSU9OXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdzY1LmM6MTM2Ci1tc2dpZCAibmVlZCBvbiBvciBvZmYuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy13NjUuYzozMjEgY29uZmlnL3RjLXc2NS5jOjM2NAotbXNnaWQgInN5bnRheCBlcnJvciBhZnRlciA8ZXhwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoyOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgcnIlZCwgb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6Mjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIHJoJWQsIG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjMwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciBybCVkLCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzozMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgcnElZCwgb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIHIlZCwgb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6Mzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGVkICVjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzozOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgaXMgd3Jvbmcgc2l6ZSBmb3IgYSB3b3JkICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzo0MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgaXMgd3Jvbmcgc2l6ZSBmb3IgYWRkcmVzcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6NjgwCi1tc2dpZCAiTWlzc2luZyApIGluIHJhKHJiKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6OTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgJXMweCV4IG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjEwODYKLW1zZ2lkICJpbW1lZGlhdGUgbXVzdCBiZSAxIG9yIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjEwOTEKLW1zZ2lkICJpbW1lZGlhdGUgMSBvciAyIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxMTE5Ci1tc2dpZCAiY2FuJ3QgdXNlIFIwIGhlcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjEyNzgKLW1zZ2lkICJDYW4ndCBmaW5kIG9wY29kZSB0byBtYXRjaCBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTM5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAteiVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxNDA2Ci1tc2dpZCAiIgotIlo4SyBvcHRpb25zOlxuIgotIi16ODAwMVx0XHRcdGdlbmVyYXRlIHNlZ21lbnRlZCBjb2RlXG4iCi0iLXo4MDAyXHRcdFx0Z2VuZXJhdGUgdW5zZWdtZW50ZWQgY29kZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxNTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IHN1YnRyYWN0IHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zICVzICVzIgotbXNnc3RyICIiCi0KLSM6IGRlcGVuZC5jOjE5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIGAlcycgZm9yIHdyaXRpbmciCi1tc2dzdHIgIiIKLQotIzogZGVwZW5kLmM6MjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGNsb3NlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNTc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN0cmluZyB0b28gYmlnICglbHUgYnl0ZXMpIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RyaW5nIGhhc2ggdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYzNSBlY29mZi5jOjE4MjggZWNvZmYuYzoxODU0IGVjb2ZmLmM6MTg4NiBlY29mZi5jOjIwNDIKLSM6IGVjb2ZmLmM6MjE1NgotbXNnaWQgIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTcyMgotbXNnaWQgInRvbyBtYW55IHN0X0VuZCdzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjA2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gdGFnIGhhc2ggdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjIzNAotbXNnaWQgImZha2UgLmZpbGUgYWZ0ZXIgcmVhbCBvbmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyMzIyCi1tc2dpZCAiRmlsZW5hbWUgZ29lcyBvdmVyIG9uZSBwYWdlIGJvdW5kYXJ5LiIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI0NTcKLW1zZ2lkICIuYmVnaW4gZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjQ2NAotbXNnaWQgIi5iZWdpbiBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI0OTYKLW1zZ2lkICIuYmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNTAzCi1tc2dpZCAiLmJlbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNTE2Ci1tc2dpZCAiLmJlbmQgZGlyZWN0aXZlIG5hbWVzIHVua25vd24gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjU2MAotbXNnaWQgIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjU2MgotbXNnaWQgIkVtcHR5IHN5bWJvbCBuYW1lIGluIC5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNjAwCi1tc2dpZCAiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjYxNQotbXNnaWQgIkJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI2MjgKLW1zZ2lkICJUb28gbWFueSAuZGltIGVudHJpZXMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNjQ5Ci1tc2dpZCAiLnNjbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjY3NQotbXNnaWQgIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNjkwCi1tc2dpZCAiQmFkbHkgZm9ybWVkIC5zaXplIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI3MDMKLW1zZ2lkICJUb28gbWFueSAuc2l6ZSBlbnRyaWVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjcyNgotbXNnaWQgIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IFdlIGNvdWxkIGhhbmRsZSB0aGlzIGJ5IHNldHRpbmcgdGhlIGNvbnRpbnVlZCBiaXQuCi0jLiBUaGVyZSB3b3VsZCBzdGlsbCBiZSBhIGxpbWl0OiB0aGUgLnR5cGUgYXJndW1lbnQgY2FuIG5vdAotIy4gYmUgaW5maW5pdGUuCi0jOiBlY29mZi5jOjI3NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhlIHR5cGUgb2YgJXMgaXMgdG9vIGNvbXBsZXg7IGl0IHdpbGwgYmUgc2ltcGxpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI3NTUKLW1zZ2lkICJVbnJlY29nbml6ZWQgLnR5cGUgYXJndW1lbnQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNzk0Ci1tc2dpZCAiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjgyMQotbXNnaWQgIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI4MjkKLW1zZ2lkICIudmFsIGV4cHJlc3Npb24gaXMgdG9vIGNvcG1sZXgiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyODYwCi1tc2dpZCAiLmVuZGVmIHBzZXVkby1vcCB1c2VkIGJlZm9yZSAuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6Mjg4NgotbXNnaWQgIkJhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjkzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJObyB0YWcgc3BlY2lmaWVkIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI5NjcKLW1zZ2lkICJCYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMDM5Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMDQ2Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMwNjkKLW1zZ2lkICIuZW5kIGRpcmVjdGl2ZSBuYW1lcyB1bmtub3duIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMwOTgKLW1zZ2lkICJzZWNvbmQgLmVudCBkaXJlY3RpdmUgZm91bmQgYmVmb3JlIC5lbmQgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzE3MwotbXNnaWQgIk5vIHdheSB0byBoYW5kbGUgLmZpbGUgd2l0aGluIC5lbnQvLmVuZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzE5OAotbXNnaWQgIi5mbWFzayBvdXRzaWRlIG9mIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMjY3Ci1tc2dpZCAiLm1hc2sgb3V0c2lkZSBvZiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzI5NwotbXNnaWQgIi5sb2MgYmVmb3JlIC5maWxlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzQyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCBgJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjM0MzYKLW1zZ2lkICJiYWQgLndlYWtleHQgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzUwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIuc3RhYiVjIGlzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5zdGFiJWM6IGlnbm9yaW5nIG5vbi16ZXJvIG90aGVyIGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzU0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iTGluZSBudW1iZXIgKCVkKSBmb3IgLnN0YWIlYyBkaXJlY3RpdmUgY2Fubm90IGZpdCBpbiBpbmRleCBmaWVsZCAoMjAgYml0cykiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgLnN0YWIlYyBkaXJlY3RpdmUsIGJhZCBjaGFyYWN0ZXIiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzo0MDQ3IGVjb2ZmLmM6NDIzNiBlY29mZi5jOjQyNjEKLW1zZ2lkICIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6NDc2MgotbXNnaWQgIk1pc3NpbmcgLmVuZCBvciAuYmVuZCBhdCBlbmQgb2YgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjUyNTMKLW1zZ2lkICJHUCBwcm9sb2d1ZSBzaXplIGV4Y2VlZHMgZmllbGQgc2l6ZSwgdXNpbmcgMCBpbnN0ZWFkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoyNTAKLW1zZ2lkICIiCi0iYmFkIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50OiBleHBvbmVudCBvdmVyZmxvdywgcHJvYmFibHkgYXNzZW1ibGluZyBqdW5rIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoyNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50OiB1bmtub3duIGVycm9yIGNvZGU9JWQuIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzo0MzQKLW1zZ2lkICIiCi0iQSBiaWdudW0gd2l0aCB1bmRlcnNjb3JlcyBtYXkgbm90IGhhdmUgbW9yZSB0aGFuIDggaGV4IGRpZ2l0cyBpbiBhbnkgd29yZC4iCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjQ1NAotbXNnaWQgIkEgYmlnbnVtIHdpdGggdW5kZXJzY29yZXMgbXVzdCBoYXZlIGV4YWN0bHkgNCB3b3Jkcy4iCi1tc2dzdHIgIiIKLQotIy4gZWl0aGVyIG5vdCBzZWVuIG9yIG5vdCBkZWZpbmVkLgotIy4gQEAgU2hvdWxkIHByaW50IG91dCB0aGUgb3JpZ2luYWwgc3RyaW5nIGluc3RlYWQgb2YKLSMuIHRoZSBwYXJzZWQgbnVtYmVyLgotIzogZXhwci5jOjU4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWNrdy4gcmVmIHRvIHVua25vd24gbGFiZWwgXCIlZDpcIiwgMCBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6NzA3Ci1tc2dpZCAiQ2hhcmFjdGVyIGNvbnN0YW50IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6OTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cHIuYyhvcGVyYW5kKTogYmFkIGF0b2ZfZ2VuZXJpYyByZXR1cm4gdmFsICVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxMDA2Ci1tc2dpZCAiTWlzc2luZyAnKScgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTAxNyByZWFkLmM6Mzg1NwotbXNnaWQgIkVCQ0RJQyBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjEwODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hcnkgb3BlcmF0b3IgJWMgaWdub3JlZCBiZWNhdXNlIGJhZCBvcGVyYW5kIGZvbGxvd3MiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjExMzMgZXhwci5jOjExNTgKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gLnN0YXJ0b2YuIG9yIC5zaXplb2YuIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxMzExCi1tc2dpZCAiQmFkIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE2NzYKLW1zZ2lkICJtaXNzaW5nIG9wZXJhbmQ7IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTcwOQotbXNnaWQgIm9wZXJhdGlvbiBjb21iaW5lcyBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWdtZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTcyNQotbXNnaWQgImxlZnQgb3BlcmFuZCBpcyBhIGJpZ251bTsgaW50ZWdlciAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE3MjcKLW1zZ2lkICJsZWZ0IG9wZXJhbmQgaXMgYSBmbG9hdDsgaW50ZWdlciAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE3MzYKLW1zZ2lkICJyaWdodCBvcGVyYW5kIGlzIGEgYmlnbnVtOyBpbnRlZ2VyIDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTczOAotbXNnaWQgInJpZ2h0IG9wZXJhbmQgaXMgYSBmbG9hdDsgaW50ZWdlciAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE3ODYgc3ltYm9scy5jOjExMDkKLW1zZ2lkICJkaXZpc2lvbiBieSB6ZXJvIgotbXNnc3RyICIiCi0KLSM6IGZyYWdzLmM6ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgZXh0ZW5kIGZyYWcgJWQuIGNoYXJzIgotbXNnc3RyICIiCi0KLSM6IGZyYWdzLmM6MTcwCi1tc2dpZCAiYXR0ZW1wdCB0byBhbGxvY2F0ZSBkYXRhIGluIGFic29sdXRlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZnJhZ3MuYzoxNzYKLW1zZ2lkICJhdHRlbXB0IHRvIGFsbG9jYXRlIGRhdGEgaW4gY29tbW9uIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjQ4NQotbXNnaWQgInJlZGVmaW5pdGlvbiBub3QgYWxsb3dlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo1NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGhlICVjIG9wZXJhdG9yIGNhbm5vdCB0YWtlIG5vbi1hYnNvbHV0ZSBhcmd1bWVudHMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjYzNgotbXNnaWQgInN0cmluZyB3aGVyZSBleHByZXNzaW9uIGV4cGVjdGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo2NDIKLW1zZ2lkICJjYW4ndCBmaW5kIHByaW1hcnkgaW4gZXhwcmVzc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NjgyCi1tc2dpZCAibWlzcGxhY2VkIGNsb3NpbmcgcGFyZW5zLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo3MTkKLW1zZ2lkICJhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo3NTEKLW1zZ2lkICJjYW4ndCBhZGQgdHdvIHJlbG9jYXRhYmxlIGV4cHJlc3Npb25zXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjk1NgotbXNnaWQgInVucmVhc29uYWJsZSBuZXN0aW5nLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxMDM0Ci1tc2dpZCAiRW5kIG9mIGZpbGUgbm90IGF0IHN0YXJ0IG9mIGxpbmUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjExNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBiYXNlIGNoYXJhY3RlciAlYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTI3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJyYWRpeCBpcyAlYyBtdXN0IGJlIG9uZSBvZiBiLCBxLCBkIG9yIGgiCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjEzMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2l6ZSBtdXN0IGJlIG9uZSBvZiBiLCB3IG9yIGwsIGlzICVjLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNDE0Ci1tc2dpZCAiZGF0YWIgcmVwZWF0IG11c3QgYmUgY29uc3RhbnQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0MTYKLW1zZ2lkICJkYXRhYiBkYXRhIG11c3QgYmUgYWJzb2x1dGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0MzAKLW1zZ2lkICJhbGlnbiBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNDM3Ci1tc2dpZCAiLmFsaWduIG5lZWRzIGFic29sdXRlIGZpbGwgdmFsdWUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0NDUKLW1zZ2lkICJhbGlnbm1lbnQgbXVzdCBiZSBvbmUgb2YgMSwgMiBvciA0LlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNDcwCi1tc2dpZCAicmVzIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24gZm9yIGZpbGwgY291bnQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE1NTAKLW1zZ2lkICJmb3JtIExJTj0gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE1NTMKLW1zZ2lkICJDT0w9IgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNTU2Ci1tc2dpZCAiZm9ybSBDT0w9IG5lZWRzIGFic29sdXRlIGV4cHJlc3NzaW9uLlxuIgotbXNnc3RyICIiCi0KLSMuIFR1cm5zIHRoZSBuZXh0IGV4cHJlc3Npb24gaW50byBhIHN0cmluZwotIzogZ2FzcC5jOjE1OTggbWFjcm8uYzo0MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSBvcGVyYXRvciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNjYwCi1tc2dpZCAibWlzcGxhY2VkICggLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNjc1Ci1tc2dpZCAibWlzcGxhY2VkICkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE3MjkKLW1zZ2lkICIuaW5zdHIgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc29uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNzY3Ci1tc2dpZCAibmVlZCBhYnNvbHV0ZSBwb3NpdGlvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTc2OQotbXNnaWQgIm5lZWQgYWJzb2x1dGUgbGVuZ3RoLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMDE4Ci1tc2dpZCAiRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjA0OAotbXNnaWQgIi5BU1NJR05BIG5lZWRzIGNvbnN0YW50IGV4cHJlc3Npb24gYXJndW1lbnQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIwNTIKLW1zZ2lkICIuQVNTSUdOQSB3aXRob3V0IGxhYmVsLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMDc3Ci1tc2dpZCAiLkFTU0lHTlMgd2l0aG91dCBsYWJlbC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjE0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBmaW5kIHByZXByb2Nlc3NvciB2YXJpYWJsZSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjIwOQotbXNnaWQgIkNvbXBhcmlzb24gb3BlcmF0b3IgbXVzdCBiZSBvbmUgb2YgRVEsIE5FLCBMVCwgTEUsIEdUIG9yIEdFLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMjQzCi1tc2dpZCAiQ29tcGFyaXNvbiBvcGVyYXRvciBmb3Igc3RyaW5ncyBtdXN0IGJlIEVRIG9yIE5FXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIyNTUgZ2FzcC5jOjIyNjUgZ2FzcC5jOjIzNjcKLW1zZ2lkICJDb25kaXRpb25hbCBvcGVyYXRvciBtdXN0IGhhdmUgYWJzb2x1dGUgb3BlcmFuZHMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIyNjAKLW1zZ2lkICJTdHJpbmcgY29tcGFyZWQgYWdhaW5zdCBleHByZXNzaW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMzEwCi1tc2dpZCAiQUlGIG5lc3RpbmcgdW5yZWFzb25hYmxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMzI1Ci1tc2dpZCAiTXVsdGlwbGUgQUVMU0VzIGluIEFJRi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjM0MQotbXNnaWQgIkFFTkRJIHdpdGhvdXQgQUlGLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMzY0IGdhc3AuYzoyNDQ2Ci1tc2dpZCAiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI0NTYKLW1zZ2lkICJCYWQgZm9ybWF0IGZvciBJRiBvciBJRk5DLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNDc2Ci1tc2dpZCAiQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI0NzgKLW1zZ2lkICJFTkRSIHdpdGhvdXQgYSBSRVBULlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFXSElMRSB3aXRob3V0IGEgQUVORFcgYXQgJWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI1MzkKLW1zZ2lkICJBRU5EVyB3aXRob3V0IGEgQUVORFcuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI1ODQKLW1zZ2lkICJBUkVQRUFUIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFSRVBFQVQgd2l0aG91dCBhIEFFTkRSIGF0ICVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNjMyCi1tc2dpZCAiLkVORE0gd2l0aG91dCBhIG1hdGNoaW5nIC5NQUNSTy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjY2NgotbXNnaWQgIkxPQ0FMIG91dHNpZGUgb2YgTUFDUk8iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibWFjcm8gYXQgbGluZSAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjcwMgotbXNnaWQgIm1hY3JvIGV4cGFuc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjc1NAotbXNnaWQgIkNoYXJhY3RlciBjb2RlIGluIHN0cmluZyBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI3NTkKLW1zZ2lkICJNaXNzaW5nID4gZm9yIGNoYXJhY3RlciBjb2RlLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyODE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0cmluZyBmb3IgU0RBVEFDIGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzICglZCkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI4NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWxsZWdhbCBjaGFyYWN0ZXIgaW4gU0RBVEEgbGluZSAoMHgleCkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI4NjcKLW1zZ2lkICJNdXN0IGhhdmUgYWJzb2x1dGUgU0RBVEFCIHJlcGVhdCBjb3VudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjg3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJNdXN0IGhhdmUgcG9zaXRpdmUgU0RBVEFCIHJlcGVhdCBjb3VudCAoJWQpLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyODk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVhc29uYWJsZSBpbmNsdWRlIGRlcHRoICglbGQpLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyOTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gaW5jbHVkZSBmaWxlIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjMwMjYKLW1zZ2lkICJVbnJlYXNvbmFibGUgZXhwYW5zaW9uICgtdSB0dXJucyBvZmYgY2hlY2spLlxuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgb25lIGNhdXNlcyBsb3RzIG9mIHBhaW4gd2hlbiB0cnlpbmcgdG8gcHJlcHJvY2VzcwotIy4gb3JkaW5hcnkgY29kZQotIzogZ2FzcC5jOjMyNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIHBzZXVkbyBvcCBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozMzE0Ci1tc2dpZCAiT1JHIGNvbW1hbmQgbm90IGFsbG93ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM1MzEKLW1zZ2lkICJJbnZhbGlkIGV4cHJlc3Npb24gb24gY29tbWFuZCBsaW5lLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgXG4iCi0iICBbLWFdICAgICAgWy0tYWx0ZXJuYXRlXSAgICAgICAgIGVudGVyIGFsdGVybmF0ZSBtYWNybyBtb2RlXG4iCi0iICBbLWMgY2hhcl0gWy0tY29tbWVudGNoYXIgY2hhcl0gIGNoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXIgZnJvbSAhXG4iCi0iICBbLWRdICAgICAgWy0tZGVidWddICAgICAgICAgICAgIHByaW50IHNvbWUgZGVidWdnaW5nIGluZm9cbiIKLSIgIFstaF0gICAgICBbLS1oZWxwXSAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlXG4iCi0iICBbLU1dICAgICAgWy0tbXJpXSAgICAgICAgICAgICAgIGVudGVyIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcbiIKLSIgIFstbyBvdXRdICBbLS1vdXRwdXQgb3V0XSAgICAgICAgc2V0IHRoZSBvdXRwdXQgZmlsZVxuIgotIiAgWy1wXSAgICAgIFstLXByaW50XSAgICAgICAgICAgICBwcmludCBsaW5lIG51bWJlcnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzU4MQotbXNnaWQgIiIKLSIgIFstc10gICAgICBbLS1jb3B5c291cmNlXSAgICAgICAgY29weSBzb3VyY2UgdGhyb3VnaCBhcyBjb21tZW50cyBcbiIKLSIgIFstdV0gICAgICBbLS11bnJlYXNvbmFibGVdICAgICAgYWxsb3cgdW5yZWFzb25hYmxlIG5lc3RpbmdcbiIKLSIgIFstdl0gICAgICBbLS12ZXJzaW9uXSAgICAgICAgICAgcHJpbnQgdGhlIHByb2dyYW0gdmVyc2lvblxuIgotIiAgWy1EbmFtZT12YWx1ZV0gICAgICAgICAgICAgICAgICBjcmVhdGUgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIGNhbGxlZCBuYW1lLCAiCi0id2l0aCB2YWx1ZVxuIgotIiAgWy1JcGF0aF0gICAgICAgICAgICAgICAgICAgICAgICBhZGQgdG8gaW5jbHVkZSBwYXRoIGxpc3RcbiIKLSIgIFtpbi1maWxlXVxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBHbnUgQXNzZW1ibGVyIE1hY3JvIFByZXByb2Nlc3NvclxuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4KLSM6IGdhc3AuYzozNjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBhc3NlbWJsZXIgcHJlLXByb2Nlc3NvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNjgyCi1tc2dpZCAiQ29weXJpZ2h0IDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM3MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gb3V0cHV0IGZpbGUgYCVzJy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzcyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM3NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQiCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM3NDkKLW1zZ2lkICIiCi0iXG4iCi0iUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIKLW1zZ3N0ciAiIgotCi0jLiBEZXRlY3QgaWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiBieSBleGFtaW5pbmcgdGhlIGZpbGUKLSMuIG5hbWUgcmV0dXJuZWQgYnkgYXNfd2hlcmUoKS4KLSMuCi0jLiBbRklYTUU6IFdlIHJlbHkgdXBvbiB0aGUgbmFtZSBpbiB0aGUgc3RyY21wIGJlbG93IGJlaW5nIHRoZQotIy4gc2FtZSBhcyB0aGUgb25lIHVzZWQgYnkgaW5wdXRfc2NydWJfbmV3X2ZpbGUoKSwgaWYgdGhhdCBpcwotIy4gbm90IHRydWUsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbF0uCi0jLgotIy4gSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiwgdGhlbiB3ZSBuZWVkIHRvIHNhdmUgZWFjaCBpbnB1dCBsaW5lCi0jLiBoZXJlIChhc3N1bWluZyBvZiBjb3Vyc2UgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgbGluZSBvZiBpbnB1dCB0byByZWFkKSwKLSMuIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdGluZyB0aGF0IGlzIHByb2R1Y2VkIGF0IHRoZSBlbmQKLSMuIG9mIHRoZSBhc3NlbWJseS4KLSM6IGlucHV0LWZpbGUuYzoxNTAgaW5wdXQtc2NydWIuYzoyMzMgbGlzdGluZy5jOjM1MwotbXNnaWQgIntzdGFuZGFyZCBpbnB1dH0iCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtZmlsZS5jOjE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuICVzIGZvciByZWFkaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1maWxlLmM6MjA1IGlucHV0LWZpbGUuYzoyMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgcmVhZCBmcm9tICVzIgotbXNnc3RyICIiCi0KLSM6IGlucHV0LWZpbGUuYzoyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgY2xvc2UgJXMiCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtc2NydWIuYzoyNjMKLW1zZ2lkICJtYWNyb3MgbmVzdGVkIHRvbyBkZWVwbHkiCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtc2NydWIuYzozNDkKLW1zZ2lkICJwYXJ0aWFsIGxpbmUgYXQgZW5kIG9mIGZpbGUgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1zY3J1Yi5jOjM3MQotbXNnaWQgIlBhcnRpYWwgbGluZSBhdCBlbmQgb2YgZmlsZSBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGl0Ymwtb3BzLmM6MzU5Ci1tc2dpZCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGluc3RydWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoyNTIKLW1zZ2lkICJXYXJuaW5nOiIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MjU5Ci1tc2dpZCAiRXJyb3I6IgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoxMTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IG9wZW4gbGlzdCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MTE2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciBjbG9zaW5nIGxpc3QgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjEyNTAKLW1zZ2lkICJzdHJhbmdlIHBhcGVyIGhlaWdodCwgc2V0IHRvIG5vIGZvcm0iCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjEzMTYKLW1zZ2lkICJOZXcgbGluZSBpbiB0aXRsZSIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjU2NQotbXNnaWQgInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gbWFjcm8gZGVmaW5pdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjU3NAotbXNnaWQgIm1pc3NpbmcgKSBhZnRlciBmb3JtYWxzIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6NzMxCi1tc2dpZCAibWlzc3BsYWNlZCApIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6OTkzCi1tc2dpZCAiY29uZnVzaW9uIGluIGZvcm1hbCBwYXJhbWV0ZXJzIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6OTk4Ci1tc2dpZCAibWFjcm8gZm9ybWFsIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6MTAxMwotbXNnaWQgImNhbid0IG1peCBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjEwMjEKLW1zZ2lkICJ0b28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjExOTYKLW1zZ2lkICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGlycCBvciBpcnBjIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6MTIwNAotbXNnaWQgIm1pc3NpbmcgbW9kZWwgcGFyYW1ldGVyIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6MTA1Ci1tc2dpZCAiQXNzZW1ibGVyIG1lc3NhZ2VzOlxuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6MjIyCi1tc2dpZCAiV2FybmluZzogIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6MzMxCi1tc2dpZCAiRXJyb3I6ICIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQzNSBtZXNzYWdlcy5jOjQ1MgotbXNnaWQgIkZhdGFsIGVycm9yOiAiCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0NzEKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciFcbiIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJBc3NlcnRpb24gZmFpbHVyZSBpbiAlcyBhdCAlcyBsaW5lICVkLlxuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFzc2VydGlvbiBmYWlsdXJlIGF0ICVzIGxpbmUgJWQuXG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0NzcgbWVzc2FnZXMuYzo0OTUKLW1zZ2lkICJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBvdXRwdXQtZmlsZS5jOjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gYSBiZmQgb24gc3Rkb3V0ICVzICIKLW1zZ3N0ciAiIgotCi0jOiBvdXRwdXQtZmlsZS5jOjcyIG91dHB1dC1maWxlLmM6NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IENhbid0IGNsb3NlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb3V0cHV0LWZpbGUuYzoxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IENhbid0IGNsb3NlICVzIgotbXNnc3RyICIiCi0KLSM6IG91dHB1dC1maWxlLmM6MTQ4Ci1tc2dpZCAiRmFpbGVkIHRvIGVtaXQgYW4gb2JqZWN0IGJ5dGUiCi1tc2dzdHIgIiIKLQotIzogb3V0cHV0LWZpbGUuYzoxNDkKLW1zZ2lkICJDYW4ndCBjb250aW51ZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIGNvbnN0cnVjdGluZyAlcyBwc2V1ZG8tb3AgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo4MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBwc2V1ZG8tb3A6ICBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo5MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGFiZWwgXCIlZCRcIiByZWRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjExNTAKLW1zZ2lkICIuYWJvcnQgZGV0ZWN0ZWQuICBBYmFuZG9uaW5nIHNoaXAuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxMjQxIHJlYWQuYzoyMDI0Ci1tc2dpZCAiQWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjEyNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWxpZ25tZW50IHRvbyBsYXJnZTogJXUgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTI4MQotbXNnaWQgImV4cGVjdGVkIGZpbGwgcGF0dGVybiBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSMuIFNvbWUgb2YgdGhlIGJhY2sgZW5kcyBjYW4ndCBkZWFsIHdpdGggbm9uLXBvc2l0aXZlIGxpbmUgbnVtYmVycy4KLSMuIEJlc2lkZXMsIGl0J3Mgc2lsbHkuCi0jOiByZWFkLmM6MTYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJMaW5lIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZTsgbGluZSBudW1iZXIgJWQgcmVqZWN0ZWQuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNjI5Ci1tc2dpZCAic3RhcnQgYWRkcmVzcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNjM5Ci1tc2dpZCAiLmVyciBlbmNvdW50ZXJlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTY1OCByZWFkLmM6MTY2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIuZmFpbCAlbGQgZW5jb3VudGVyZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLmZpbGwgc2l6ZSBjbGFtcGVkIHRvICVkLiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTcwMgotbXNnaWQgIlNpemUgbmVnYXRpdmU6IC5maWxsIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNzA4Ci1tc2dpZCAiUmVwZWF0IDwgMCwgLmZpbGwgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTg2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgLmxpbmtvbmNlIHR5cGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTg3OSByZWFkLmM6MTkwNQotbXNnaWQgIi5saW5rb25jZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTkwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJiZmRfc2V0X3NlY3Rpb25fZmxhZ3M6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxOTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiLnNic3NcIjogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIwMDIKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBzaXplIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMDEwCi1tc2dpZCAiTWlzc2luZyBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIxNTIKLW1zZ2lkICJiYWQgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjI4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJhdHRlbXB0IHRvIHJlZGVmaW5lIHBzZXVkby1vcCBgJXMnIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIzNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWdtZW50IFwiJXNcIjsgc2VnbWVudCBcIiVzXCIgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjM1NQotbXNnaWQgImlnbm9yaW5nIGZpbGwgdmFsdWUgaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjM1OAotbXNnaWQgIm9ubHkgY29uc3RhbnQgb2Zmc2V0cyBzdXBwb3J0ZWQgaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjM5MAotbXNnaWQgIk1SSSBzdHlsZSBPUkcgcHNldWRvLW9wIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI0NzgKLW1zZ2lkICJ1bnJlY29nbml6ZWQgc2VjdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyNTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjU2MAotbXNnaWQgImFic29sdXRlIHNlY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyNTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBzZWN0aW9uIGNvbW1hbmQgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyB3aXRob3V0ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyODY3Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgdmFyaWFibGUgc2l6ZSBvciBmaWxsIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyODkyCi1tc2dpZCAiLnNwYWNlIHJlcGVhdCBjb3VudCBpcyB6ZXJvLCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyODk0Ci1tc2dpZCAiLnNwYWNlIHJlcGVhdCBjb3VudCBpcyBuZWdhdGl2ZSwgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjkyMwotbXNnaWQgInNwYWNlIGFsbG9jYXRpb24gdG9vIGNvbXBsZXggaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjkyOAotbXNnaWQgInNwYWNlIGFsbG9jYXRpb24gdG9vIGNvbXBsZXggaW4gY29tbW9uIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjMwMTUgcmVhZC5jOjQxMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIGZsb2F0aW5nIGxpdGVyYWw6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozMDkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc3Qgb2YgbGluZSBpZ25vcmVkLiBGaXJzdCBpZ25vcmVkIGNoYXJhY3RlciBpcyBgJWMnLiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzA5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXN0IG9mIGxpbmUgaWdub3JlZC4gRmlyc3QgaWdub3JlZCBjaGFyYWN0ZXIgdmFsdWVkIDB4JXguIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozMTQ1Ci1tc2dpZCAiaWxsZWdhbCBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjMxNDcKLW1zZ2lkICJtaXNzaW5nIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzMyMAotbXNnaWQgInJ2YSB3aXRob3V0IHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzQ0NQotbXNnaWQgImF0dGVtcHQgdG8gc3RvcmUgdmFsdWUgaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzQ4MyByZWFkLmM6NDM4MQotbXNnaWQgInplcm8gYXNzdW1lZCBmb3IgbWlzc2luZyBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNDk1IHJlYWQuYzo0MzkzCi1tc2dpZCAicmVnaXN0ZXIgdmFsdWUgdXNlZCBhcyBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSMuIExlYWRpbmcgYml0cyBjb250YWluIGJvdGggMHMgJiAxcy4KLSM6IHJlYWQuYzozNTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlZhbHVlIDB4JWx4IHRydW5jYXRlZCB0byAweCVseC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM2MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmlnbnVtIHRydW5jYXRlZCB0byAlZCBieXRlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzY3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBCRkQgcmVsb2NhdGlvbiBzaXplICV1IgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNzY3Ci1tc2dpZCAidXNpbmcgYSBiaXQgZmllbGQgd2lkdGggb2YgemVybyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzc3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJmaWVsZCB3aWR0aCBcIiVzXCIgdG9vIGNvbXBsZXggZm9yIGEgYml0ZmllbGQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM3ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmllbGQgd2lkdGggJWx1IHRvbyBiaWcgdG8gZml0IGluICVkIGJ5dGVzOiB0cnVuY2F0ZWQgdG8gJWQgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzgwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJmaWVsZCB2YWx1ZSBcIiVzXCIgdG9vIGNvbXBsZXggZm9yIGEgYml0ZmllbGQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM5MjgKLW1zZ2lkICJVbnJlc29sdmFibGUgb3Igbm9ucG9zaXRpdmUgcmVwZWF0IGNvdW50OyB1c2luZyAxIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozOTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gZmxvYXRpbmcgdHlwZSB0eXBlICclYyciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQwMDEKLW1zZ2lkICJGbG9hdGluZyBwb2ludCBjb25zdGFudCB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQxMjYKLW1zZ2lkICJ1bnJlc29sdmFibGUgb3Igbm9ucG9zaXRpdmUgcmVwZWF0IGNvdW50OyB1c2luZyAxIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NTMwCi1tc2dpZCAiRXhwZWN0ZWQgPG5uPiIKLW1zZ3N0ciAiIgotCi0jLiBUbyBiZSBjb21wYXRpYmxlIHdpdGggQlNEIDQuMiBhczogZ2l2ZSB0aGUgbHVzZXIgYSBsaW5lZmVlZCEhCi0jOiByZWFkLmM6NDU2MyByZWFkLmM6NDY0NgotbXNnaWQgIlVudGVybWluYXRlZCBzdHJpbmc6IE5ld2xpbmUgaW5zZXJ0ZWQuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NjU0Ci1tc2dpZCAiQmFkIGVzY2FwZWQgY2hhcmFjdGVyIGluIHN0cmluZywgJz8nIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ2ODAKLW1zZ2lkICJleHBlY3RlZCBhZGRyZXNzIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDcwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgXCIlc1wiIHVuZGVmaW5lZDsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NzAzCi1tc2dpZCAic29tZSBzeW1ib2wgdW5kZWZpbmVkOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ3MjEKLW1zZ2lkICJiYWQgb3IgaXJyZWR1Y2libGUgYWJzb2x1dGUgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NzU5Ci1tc2dpZCAiVGhpcyBzdHJpbmcgbWF5IG5vdCBjb250YWluICdcXDAnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0Nzk4Ci1tc2dpZCAiTWlzc2luZyBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjUwMjkKLW1zZ2lkICJtaXNzaW5nIC5mdW5jIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo1MDQ2Ci1tc2dpZCAiLmVuZGZ1bmMgbWlzc2luZyBmb3IgcHJldmlvdXMgLmZ1bmMiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMDkKLW1zZ2lkICIuc3RhYnM6IE1pc3NpbmcgY29tbWEiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMTcgc3RhYnMuYzoyMjUgc3RhYnMuYzoyMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLnN0YWIlYzogTWlzc2luZyBjb21tYSIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjQxNQotbXNnaWQgImNvbW1hIG1pc3NpbmcgaW4gLnhzdGFicyIKLW1zZ3N0ciAiIgotCi0jOiBzdWJzZWdzLmM6Mzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkF0dGVtcHQgdG8gc3dpdGNoIHRvIG5vbmV4aXN0ZW50IHNlZ21lbnQgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzozNjUgc3ltYm9scy5jOjQ2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6NDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIFwiJXNcIi8lcyVsZC4iCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjUzNiBzeW1ib2xzLmM6NTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkluc2VydGluZyBcIiVzXCIgaW50byBzeW1ib2wgdGFibGUgZmFpbGVkOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6ODk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCBkZWZpbml0aW9uIGxvb3AgZW5jb3VudGVyZWQgYXQgJXMiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjEwNzEgc3ltYm9scy5jOjEwNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjEwNzkKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gZm9yIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTA4NCBzeW1ib2xzLmM6MTA4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiBzZXR0aW5nICVzIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxMDkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBmb3Igb3BlcmF0aW9uIHNldHRpbmcgJXMiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjExMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGl2aXNpb24gYnkgemVybyB3aGVuIHNldHRpbmcgJXMiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjExODMgd3JpdGUuYzoxODgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IHJlc29sdmUgdmFsdWUgZm9yIHN5bWJvbCBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjE1NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXCIlZFwiIChpbnN0YW5jZSBudW1iZXIgJWQgb2YgYSAlcyBsYWJlbCkiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjE2MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXR0ZW1wdCB0byBnZXQgdmFsdWUgb2YgdW5yZXNvbHZlZCBzeW1ib2wgJXMiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmllbGQgZnhfc2l6ZSB0b28gc21hbGwgdG8gaG9sZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjMwNgotbXNnaWQgInJ2YSBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6NTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImF0dGVtcHQgdG8gLm9yZy8uc3BhY2UgYmFja3dhcmRzPyAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjk3NAotbXNnaWQgInJlbG9jYXRpb24gb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6OTc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiV1OiBiYWQgcmV0dXJuIGZyb20gYmZkX2luc3RhbGxfcmVsb2NhdGlvbjogJXgiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxMDIyCi1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGZpeHVwIG5vdCBjb250YWluZWQgd2l0aGluIGZyYWciCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxMDM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiV1OiBiYWQgcmV0dXJuIGZyb20gYmZkX2luc3RhbGxfcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjExMjUgd3JpdGUuYzoxMTQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZBVEFMOiBDYW4ndCB3cml0ZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjExODAKLW1zZ2lkICJDYW5ub3Qgd3JpdGUgdG8gb3V0cHV0IGZpbGUuIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlZCBlcnJvciVzLCAlZCB3YXJuaW5nJXMsIGdlbmVyYXRpbmcgYmFkIG9iamVjdCBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTQxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlZCBlcnJvciVzLCAlZCB3YXJuaW5nJXMsIG5vIG9iamVjdCBmaWxlIGdlbmVyYXRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjE4MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9jYWwgbGFiZWwgJXMgaXMgbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyMTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImFsaWdubWVudCBwYWRkaW5nICglbHUgYnl0ZXMpIG5vdCBhIG11bHRpcGxlIG9mICVsZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjIyMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLndvcmQgJXMtJXMrJXMgZGlkbid0IGZpdCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjIzMDkKLW1zZ2lkICJhdHRlbXB0IHRvIC5vcmcgYmFja3dhcmRzIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyMzMyCi1tc2dpZCAiLnNwYWNlIHNwZWNpZmllcyBub24tYWJzb2x1dGUgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyMzM2Ci1tc2dpZCAiLnNwYWNlIG9yIC5maWxsIHdpdGggbmVnYXRpdmUgdmFsdWUsIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyNTg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJTdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgXCIlc1wiIHslcyBzZWN0aW9ufSAtICIKLSJcIiVzXCIgeyVzIHNlY3Rpb259IGF0IGZpbGUgYWRkcmVzcyAlcy4iCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyNzUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlZhbHVlIG9mICVzIHRvbyBsYXJnZSBmb3IgZmllbGQgb2YgJWQgYnl0ZXMgYXQgJXMiCi1tc2dzdHIgIiIKZGlmZiAtLWdpdCBhL2dhcy9yZWFkLmMgYi9nYXMvcmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTIyODQyLi4wMDAwMDAwCi0tLSBhL2dhcy9yZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUyICswLDAgQEAKLS8qIHJlYWQuYyAtIHJlYWQgYSBzb3VyY2UgZmlsZSAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwKLSAgIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmIDAKLSNkZWZpbmUgTUFTS19DSEFSICgweEZGKQkvKiBJZiB5b3VyIGNoYXJzIGFyZW4ndCA4IGJpdHMsIHlvdSB3aWxsCi0JCQkJICAgY2hhbmdlIHRoaXMgYSBiaXQuICBCdXQgdGhlbiwgR05VIGlzbid0Ci0JCQkJICAgc3BvemVkIHRvIHJ1biBvbiB5b3VyIG1hY2hpbmUgYW55d2F5LgotCQkJCSAgIChSTVMgaXMgc28gc2hvcnRzaWdodGVkIHNvbWV0aW1lcy4pCi0JCQkJICAgKi8KLSNlbHNlCi0jZGVmaW5lIE1BU0tfQ0hBUiAoKGludCkodW5zaWduZWQgY2hhciktMSkKLSNlbmRpZgotCi0KLS8qIFRoaXMgaXMgdGhlIGxhcmdlc3Qga25vd24gZmxvYXRpbmcgcG9pbnQgZm9ybWF0IChmb3Igbm93KS4gSXQgd2lsbAotICAgZ3JvdyB3aGVuIHdlIGRvIDQzNjEgc3R5bGUgZmxvbnVtcy4gKi8KLQotI2RlZmluZSBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgKDE2KQotCi0vKiBSb3V0aW5lcyB0aGF0IHJlYWQgYXNzZW1ibGVyIHNvdXJjZSB0ZXh0IHRvIGJ1aWxkIHNwYWdldHRpIGluIG1lbW9yeS4KLSAgIEFub3RoZXIgZ3JvdXAgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGluIHRoZSBleHByLmMgbW9kdWxlLiAgKi8KLQotLyogZm9yIGlzZGlnaXQoKSAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgImxpc3RpbmcuaCIKLSNpbmNsdWRlICJlY29mZi5oIgotCi0jaWZuZGVmIFRDX1NUQVJUX0xBQkVMCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKHgseSkgKHg9PSc6JykKLSNlbmRpZgotCi0vKiBTZXQgYnkgdGhlIG9iamVjdC1mb3JtYXQgb3IgdGhlIHRhcmdldC4gICovCi0jaWZuZGVmIFRDX0lNUExJQ0lUX0xDT01NX0FMSUdOTUVOVAotI2RlZmluZSBUQ19JTVBMSUNJVF9MQ09NTV9BTElHTk1FTlQoU0laRSwgUDJWQVIpICAgICAgICBcCi0gZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKChTSVpFKSA+PSA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChQMlZBUikgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgaWYgKChTSVpFKSA+PSA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoUDJWQVIpID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlIGlmICgoU0laRSkgPj0gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKFAyVkFSKSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChQMlZBUikgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0vKiBUaGUgTk9QX09QQ09ERSBpcyBmb3IgdGhlIGFsaWdubWVudCBmaWxsIHZhbHVlLgotICogZmlsbCBpdCBhIG5vcCBpbnN0cnVjdGlvbiBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgZG9lcyBub3QgY2hva2UKLSAqIG9uIGl0Ci0gKi8KLSNpZm5kZWYgTk9QX09QQ09ERQotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDAKLSNlbmRpZgotCi1jaGFyICppbnB1dF9saW5lX3BvaW50ZXI7CS8qLT5uZXh0IGNoYXIgb2Ygc291cmNlIGZpbGUgdG8gcGFyc2UuICovCi0KLSNpZiBCSVRTX1BFUl9DSEFSICE9IDgKLS8qICBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIGluZGV4ZWQgYnlbKGNoYXIpXSBhbmQgd2lsbCBicmVhayBpZgotICAgIGEgY2hhciBkb2VzIG5vdCBoYXZlIGV4YWN0bHkgMjU2IHN0YXRlcyAoaG9wZWZ1bGx5IDA6MjU1ISkhICAqLwotZGllIGhvcnJpYmx5OwotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX0FUCi0vKiBUaGUgbTg4ayB1bmZvcnR1bmF0ZWx5IHVzZXMgQCBhcyBhIGxhYmVsIGJlZ2lubmVyLiAgKi8KLSNkZWZpbmUgTEVYX0FUIDAKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9CUgotLyogVGhlIFJTLzYwMDAgYXNzZW1ibGVyIHVzZXMgeyx9LFssXSBhcyBwYXJ0cyBvZiBzeW1ib2wgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfQlIgMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX1BDVAotLyogVGhlIERlbHRhIDY4ayBhc3NlbWJsZXIgcGVybWl0cyAlIGluc2lkZSBsYWJlbCBuYW1lcy4gICovCi0jZGVmaW5lIExFWF9QQ1QgMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX1FNCi0vKiBUaGUgUG93ZXJQQyBXaW5kb3dzIE5UIGFzc2VtYmxlcnMgcGVybWl0cyA/IGluc2lkZSBsYWJlbCBuYW1lcy4gICovCi0jZGVmaW5lIExFWF9RTSAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfSEFTSAotI2RlZmluZSBMRVhfSEFTSCAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfRE9MTEFSCi0vKiBUaGUgYTI5ayBhc3NlbWJsZXIgZG9lcyBub3QgcGVybWl0cyBsYWJlbHMgdG8gc3RhcnQgd2l0aCAkLiAgKi8KLSNkZWZpbmUgTEVYX0RPTExBUiAzCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfVElMREUKLS8qIFRoZSBEZWx0YSA2OGsgYXNzZW1ibGVyIHBlcm1pdHMgfiBhdCBzdGFydCBvZiBsYWJlbCBuYW1lcy4gICovCi0jZGVmaW5lIExFWF9USUxERSAwCi0jZW5kaWYKLQotLyogdXNlZCBieSBpc18uLi4gbWFjcm9zLiBvdXIgY3R5cGVbXSAqLwotY2hhciBsZXhfdHlwZVsyNTZdID0KLXsKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogQEFCQ0RFRkdISUpLTE1OTyAqLwotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiBQUVJTVFVWV1hZWltcXV5fICovCi0gIDAsIDAsIDAsIExFWF9IQVNILCBMRVhfRE9MTEFSLCBMRVhfUENULCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAwLCAvKiBfISIjJCUmJygpKissLS4vICovCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIExFWF9RTSwJLyogMDEyMzQ1Njc4OTo7PD0+PyAqLwotICBMRVhfQVQsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCS8qIEBBQkNERUZHSElKS0xNTk8gKi8KLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgTEVYX0JSLCAwLCBMRVhfQlIsIDAsIDMsIC8qIFBRUlNUVVZXWFlaW1xdXl8gKi8KLSAgMCwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywJLyogYGFiY2RlZmdoaWprbG1ubyAqLwotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCBMRVhfQlIsIDAsIExFWF9CUiwgTEVYX1RJTERFLCAwLCAvKiBwcXJzdHV2d3h5ent8fX4uICovCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMKLX07Ci0KLQotLyoKLSAqIEluOiBhIGNoYXJhY3Rlci4KLSAqIE91dDogMSBpZiB0aGlzIGNoYXJhY3RlciBlbmRzIGEgbGluZS4KLSAqLwotI2RlZmluZSBaXyAoMCkKLWNoYXIgaXNfZW5kX29mX2xpbmVbMjU2XSA9Ci17Ci0jaWZkZWYgQ1JfRU9MCi0gIDk5LCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCA5OSwgWl8sIFpfLCA5OSwgWl8sIFpfLAkvKiBAYWJjZGVmZ2hpamtsbW5vICovCi0jZWxzZQotICA5OSwgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgOTksIFpfLCBaXywgWl8sIFpfLCBaXywJLyogQGFiY2RlZmdoaWprbG1ubyAqLwotI2VuZGlmCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotI2lmZGVmIFRDX0hQUEEKLSAgWl8sOTksIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogXyEiIyQlJicoKSorLC0uLyAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogMDEyMzQ1Njc4OTo7PD0+PyAqLwotI2Vsc2UKLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgOTksIFpfLCBaXywgWl8sIFpfLAkvKiAwMTIzNDU2Nzg5Ojs8PT4/ICovCi0jZW5kaWYKLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLX07Ci0jdW5kZWYgWl8KLQotLyogRnVuY3Rpb25zIHByaXZhdGUgdG8gdGhpcyBmaWxlLiAqLwotCi1zdGF0aWMgY2hhciAqYnVmZmVyOwkvKiAxc3QgY2hhciBvZiBlYWNoIGJ1ZmZlciBvZiBsaW5lcyBpcyBoZXJlLiAqLwotc3RhdGljIGNoYXIgKmJ1ZmZlcl9saW1pdDsJLyotPjEgKyBsYXN0IGNoYXIgaW4gYnVmZmVyLiAqLwotCi0vKiBUQVJHRVRfQllURVNfQklHX0VORElBTiBpcyByZXF1aXJlZCB0byBiZSBkZWZpbmVkIHRvIGVpdGhlciAwIG9yIDEgaW4gdGhlCi0gICB0Yy08Q1BVPi5oIGZpbGUuICBTZWUgdGhlICJQb3J0aW5nIEdBUyIgc2VjdGlvbiBvZiB0aGUgaW50ZXJuYWxzIG1hbnVhbC4gKi8KLWludCB0YXJnZXRfYmlnX2VuZGlhbiA9IFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOOwotCi1zdGF0aWMgY2hhciAqb2xkX2J1ZmZlcjsJLyogSkYgYSBoYWNrICovCi1zdGF0aWMgY2hhciAqb2xkX2lucHV0Owotc3RhdGljIGNoYXIgKm9sZF9saW1pdDsKLQotLyogVmFyaWFibGVzIGZvciBoYW5kbGluZyBpbmNsdWRlIGZpbGUgZGlyZWN0b3J5IHRhYmxlLiAqLwotCi1jaGFyICoqaW5jbHVkZV9kaXJzOwkvKiBUYWJsZSBvZiBwb2ludGVycyB0byBkaXJlY3RvcmllcyB0bwotCQkJICAgc2VhcmNoIGZvciAuaW5jbHVkZSdzICovCi1pbnQgaW5jbHVkZV9kaXJfY291bnQ7CS8qIEhvdyBtYW55IGFyZSBpbiB0aGUgdGFibGUgKi8KLWludCBpbmNsdWRlX2Rpcl9tYXhsZW4gPSAxOy8qIExlbmd0aCBvZiBsb25nZXN0IGluIHRhYmxlICovCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotc3RydWN0IGJyb2tlbl93b3JkICpicm9rZW5fd29yZHM7Ci1pbnQgbmV3X2Jyb2tlbl93b3JkczsKLSNlbmRpZgotCi0vKiBUaGUgY3VycmVudCBvZmZzZXQgaW50byB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gIFdlIGRvbid0IHRyeSB0bwotICAgYnVpbGQgZnJhZ3MgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIHNpbmNlIG5vIGRhdGEgY2FuIGJlIHN0b3JlZAotICAgdGhlcmUuICBXZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLWFkZHJlc3NUIGFic19zZWN0aW9uX29mZnNldDsKLQotLyogSWYgdGhpcyBsaW5lIGhhZCBhbiBNUkkgc3R5bGUgbGFiZWwsIGl0IGlzIHN0b3JlZCBpbiB0aGlzIHZhcmlhYmxlLgotICAgVGhpcyBpcyB1c2VkIGJ5IHNvbWUgb2YgdGhlIE1SSSBwc2V1ZG8tb3BzLiAgKi8KLXN5bWJvbFMgKmxpbmVfbGFiZWw7Ci0KLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgdG8gc3VwcG9ydCBNUkkgY29tbW9uIHNlY3Rpb25zLiAgV2UKLSAgIHRyYW5zbGF0ZSBzdWNoIHNlY3Rpb25zIGludG8gYSBjb21tb24gc3ltYm9sLiAgVGhpcyB2YXJpYWJsZSBpcwotICAgbm9uLU5VTEwgd2hlbiB3ZSBhcmUgaW4gYW4gTVJJIGNvbW1vbiBzZWN0aW9uLiAgKi8KLXN5bWJvbFMgKm1yaV9jb21tb25fc3ltYm9sOwotCi0vKiBJbiBNUkkgbW9kZSwgYWZ0ZXIgYSBkYy5iIHBzZXVkby1vcCB3aXRoIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsIHdlCi0gICBuZWVkIHRvIGFsaWduIHRvIGFuIGV2ZW4gYnl0ZSBib3VuZGFyeSB1bmxlc3MgdGhlIG5leHQgcHNldWRvLW9wIGlzCi0gICBkYy5iLCBkcy5iLCBvciBkY2IuYi4gIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIDEgaWYgYW4gYWxpZ25tZW50Ci0gICBtYXkgYmUgbmVlZGVkLiAgKi8KLXN0YXRpYyBpbnQgbXJpX3BlbmRpbmdfYWxpZ247Ci0KLSNpZm5kZWYgTk9fTElTVElORwotI2lmZGVmIE9CSl9FTEYKLS8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIGJlIG5vbi16ZXJvIGlmIHRoZSBuZXh0IHN0cmluZyB3ZSBzZWUgbWlnaHQKLSAgIGJlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBpbiBEV0FSRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTZWUKLSAgIHRoZSBjb21tZW50IGluIGVtaXRfZXhwciBmb3IgdGhlIGZvcm1hdCB3ZSBsb29rIGZvci4gICovCi1zdGF0aWMgaW50IGR3YXJmX2ZpbGVfc3RyaW5nOwotI2VuZGlmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgY29uc193b3JrZXIgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgc2NydWJfZnJvbV9zdHJpbmcgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX2FsaWduIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgc19hbGlnbiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgc19sY29tbV9pbnRlcm5hbCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIGludCBoZXhfZmxvYXQgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLXN0YXRpYyBpbmxpbmUgaW50IHNpemVvZl9zbGViMTI4IFBBUkFNUyAoKG9mZnNldFQpKTsKLXN0YXRpYyBpbmxpbmUgaW50IHNpemVvZl91bGViMTI4IFBBUkFNUyAoKHZhbHVlVCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X3NsZWIxMjggUEFSQU1TICgoY2hhciAqLCBvZmZzZXRUKSk7Ci1zdGF0aWMgaW5saW5lIGludCBvdXRwdXRfdWxlYjEyOCBQQVJBTVMgKChjaGFyICosIHZhbHVlVCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X2JpZ19zbGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgTElUVExFTlVNX1RZUEUgKiwgaW50KSk7Ci1zdGF0aWMgaW5saW5lIGludCBvdXRwdXRfYmlnX3VsZWIxMjggUEFSQU1TICgoY2hhciAqLCBMSVRUTEVOVU1fVFlQRSAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgb3V0cHV0X2JpZ19sZWIxMjggUEFSQU1TICgoY2hhciAqLCBMSVRUTEVOVU1fVFlQRSAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZG9fb3JnIFBBUkFNUyAoKHNlZ1QsIGV4cHJlc3Npb25TICosIGludCkpOwotY2hhciAqZGVtYW5kX2NvcHlfc3RyaW5nIFBBUkFNUyAoKGludCAqbGVuUCkpOwotc3RhdGljIHNlZ1QgZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHBQKSk7Ci1zdGF0aWMgc2VnVCBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHBQKSk7Ci1zdGF0aWMgdm9pZCBwb2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2V0X2xpbmVfc2IgUEFSQU1TICgoc2IgKikpOwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfZmlsZV9kZWJ1ZyBQQVJBTVMgKCh2b2lkKSk7Ci0MCi0KLXZvaWQKLXJlYWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqcDsKLQotICBwb2JlZ2luICgpOwotICBvYmpfcmVhZF9iZWdpbl9ob29rICgpOwotCi0gIC8qIFNvbWV0aGluZyBjbG9zZSAtLSBidXQgbm90IHRvbyBjbG9zZSAtLSB0byBhIG11bHRpcGxlIG9mIDEwMjQuCi0gICAgIFRoZSBkZWJ1Z2dpbmcgbWFsbG9jIEknbSB1c2luZyBoYXMgMjQgYnl0ZXMgb2Ygb3ZlcmhlYWQuICAqLwotICBvYnN0YWNrX2JlZ2luICgmbm90ZXMsIGNodW5rc2l6ZSk7Ci0gIG9ic3RhY2tfYmVnaW4gKCZjb25kX29ic3RhY2ssIGNodW5rc2l6ZSk7Ci0KLSAgLyogVXNlIG1hY2hpbmUgZGVwZW5kZW50IHN5bnRheCAqLwotICBmb3IgKHAgPSBsaW5lX3NlcGFyYXRvcl9jaGFyczsgKnA7IHArKykKLSAgICBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnBdID0gMTsKLSAgLyogVXNlIG1vcmUuICBGSVhNRS1TT01FREFZLiAqLwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBsZXhfdHlwZVsnPyddID0gMzsKLX0KLQwKLS8qIHNldCB1cCBwc2V1ZG8tb3AgdGFibGVzICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwb19oYXNoOwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIHBvdGFibGVbXSA9Ci17Ci0gIHsiYWJvcnQiLCBzX2Fib3J0LCAwfSwKLSAgeyJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0gIHsiYXNjaWkiLCBzdHJpbmdlciwgMH0sCi0gIHsiYXNjaXoiLCBzdHJpbmdlciwgMX0sCi0gIHsiYmFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCi0gIHsiYmFsaWdudyIsIHNfYWxpZ25fYnl0ZXMsIC0yfSwKLSAgeyJiYWxpZ25sIiwgc19hbGlnbl9ieXRlcywgLTR9LAotLyogYmxvY2sgKi8KLSAgeyJieXRlIiwgY29ucywgMX0sCi0gIHsiY29tbSIsIHNfY29tbSwgMH0sCi0gIHsiY29tbW9uIiwgc19tcmlfY29tbW9uLCAwfSwKLSAgeyJjb21tb24ucyIsIHNfbXJpX2NvbW1vbiwgMX0sCi0gIHsiZGF0YSIsIHNfZGF0YSwgMH0sCi0gIHsiZGMiLCBjb25zLCAyfSwKLSAgeyJkYy5iIiwgY29ucywgMX0sCi0gIHsiZGMuZCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsiZGMubCIsIGNvbnMsIDR9LAotICB7ImRjLnMiLCBmbG9hdF9jb25zLCAnZid9LAotICB7ImRjLnciLCBjb25zLCAyfSwKLSAgeyJkYy54IiwgZmxvYXRfY29ucywgJ3gnfSwKLSAgeyJkY2IiLCBzX3NwYWNlLCAyfSwKLSAgeyJkY2IuYiIsIHNfc3BhY2UsIDF9LAotICB7ImRjYi5kIiwgc19mbG9hdF9zcGFjZSwgJ2QnfSwKLSAgeyJkY2IubCIsIHNfc3BhY2UsIDR9LAotICB7ImRjYi5zIiwgc19mbG9hdF9zcGFjZSwgJ2YnfSwKLSAgeyJkY2IudyIsIHNfc3BhY2UsIDJ9LAotICB7ImRjYi54Iiwgc19mbG9hdF9zcGFjZSwgJ3gnfSwKLSAgeyJkcyIsIHNfc3BhY2UsIDJ9LAotICB7ImRzLmIiLCBzX3NwYWNlLCAxfSwKLSAgeyJkcy5kIiwgc19zcGFjZSwgOH0sCi0gIHsiZHMubCIsIHNfc3BhY2UsIDR9LAotICB7ImRzLnAiLCBzX3NwYWNlLCAxMn0sCi0gIHsiZHMucyIsIHNfc3BhY2UsIDR9LAotICB7ImRzLnciLCBzX3NwYWNlLCAyfSwKLSAgeyJkcy54Iiwgc19zcGFjZSwgMTJ9LAotICB7ImRlYnVnIiwgc19pZ25vcmUsIDB9LAotI2lmZGVmIFNfU0VUX0RFU0MKLSAgeyJkZXNjIiwgc19kZXNjLCAwfSwKLSNlbmRpZgotLyogZGltICovCi0gIHsiZG91YmxlIiwgZmxvYXRfY29ucywgJ2QnfSwKLS8qIGRzZWN0ICovCi0gIHsiZWplY3QiLCBsaXN0aW5nX2VqZWN0LCAwfSwJLyogRm9ybWZlZWQgbGlzdGluZyAqLwotICB7ImVsc2UiLCBzX2Vsc2UsIDB9LAotICB7ImVsc2VjIiwgc19lbHNlLCAwfSwKLSAgeyJlbHNlaWYiLCBzX2Vsc2VpZiwgKGludCkgT19uZX0sCi0gIHsiZW5kIiwgc19lbmQsIDB9LAotICB7ImVuZGMiLCBzX2VuZGlmLCAwfSwKLSAgeyJlbmRmdW5jIiwgc19mdW5jLCAxfSwKLSAgeyJlbmRpZiIsIHNfZW5kaWYsIDB9LAotLyogZW5kZWYgKi8KLSAgeyJlcXUiLCBzX3NldCwgMH0sCi0gIHsiZXF1aXYiLCBzX3NldCwgMX0sCi0gIHsiZXJyIiwgc19lcnIsIDB9LAotICB7ImV4aXRtIiwgc19tZXhpdCwgMH0sCi0vKiBleHRlbmQgKi8KLSAgeyJleHRlcm4iLCBzX2lnbm9yZSwgMH0sCS8qIFdlIHRyZWF0IGFsbCB1bmRlZiBhcyBleHQgKi8KLSAgeyJhcHBmaWxlIiwgc19hcHBfZmlsZSwgMX0sCi0gIHsiYXBwbGluZSIsIHNfYXBwX2xpbmUsIDB9LAotICB7ImZhaWwiLCBzX2ZhaWwsIDB9LAotICB7ImZpbGUiLCBzX2FwcF9maWxlLCAwfSwKLSAgeyJmaWxsIiwgc19maWxsLCAwfSwKLSAgeyJmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZm9ybWF0Iiwgc19pZ25vcmUsIDB9LAotICB7ImZ1bmMiLCBzX2Z1bmMsIDB9LAotICB7Imdsb2JhbCIsIHNfZ2xvYmwsIDB9LAotICB7Imdsb2JsIiwgc19nbG9ibCwgMH0sCi0gIHsiaHdvcmQiLCBjb25zLCAyfSwKLSAgeyJpZiIsIHNfaWYsIChpbnQpIE9fbmV9LAotICB7ImlmYyIsIHNfaWZjLCAwfSwKLSAgeyJpZmRlZiIsIHNfaWZkZWYsIDB9LAotICB7ImlmZXEiLCBzX2lmLCAoaW50KSBPX2VxfSwKLSAgeyJpZmVxcyIsIHNfaWZlcXMsIDB9LAotICB7ImlmZ2UiLCBzX2lmLCAoaW50KSBPX2dlfSwKLSAgeyJpZmd0Iiwgc19pZiwgKGludCkgT19ndH0sCi0gIHsiaWZsZSIsIHNfaWYsIChpbnQpIE9fbGV9LAotICB7ImlmbHQiLCBzX2lmLCAoaW50KSBPX2x0fSwKLSAgeyJpZm5jIiwgc19pZmMsIDF9LAotICB7ImlmbmRlZiIsIHNfaWZkZWYsIDF9LAotICB7ImlmbmUiLCBzX2lmLCAoaW50KSBPX25lfSwKLSAgeyJpZm5lcyIsIHNfaWZlcXMsIDF9LAotICB7Imlmbm90ZGVmIiwgc19pZmRlZiwgMX0sCi0gIHsiaW5jbHVkZSIsIHNfaW5jbHVkZSwgMH0sCi0gIHsiaW50IiwgY29ucywgNH0sCi0gIHsiaXJwIiwgc19pcnAsIDB9LAotICB7ImlyZXAiLCBzX2lycCwgMH0sCi0gIHsiaXJwYyIsIHNfaXJwLCAxfSwKLSAgeyJpcmVwYyIsIHNfaXJwLCAxfSwKLSAgeyJsY29tbSIsIHNfbGNvbW0sIDB9LAotICB7ImxmbGFncyIsIGxpc3RpbmdfZmxhZ3MsIDB9LAkvKiBMaXN0aW5nIGZsYWdzICovCi0gIHsibGlua29uY2UiLCBzX2xpbmtvbmNlLCAwfSwKLSAgeyJsaXN0IiwgbGlzdGluZ19saXN0LCAxfSwJLyogVHVybiBsaXN0aW5nIG9uICovCi0gIHsibGxlbiIsIGxpc3RpbmdfcHNpemUsIDF9LAotICB7ImxvbmciLCBjb25zLCA0fSwKLSAgeyJsc3ltIiwgc19sc3ltLCAwfSwKLSAgeyJtYWNybyIsIHNfbWFjcm8sIDB9LAotICB7Im1leGl0Iiwgc19tZXhpdCwgMH0sCi0gIHsibXJpIiwgc19tcmksIDB9LAotICB7Ii5tcmkiLCBzX21yaSwgMH0sCS8qIFNwZWNpYWwgY2FzZSBzbyAubXJpIHdvcmtzIGluIE1SSSBtb2RlLiAgKi8KLSAgeyJuYW1lIiwgc19pZ25vcmUsIDB9LAotICB7Im5vZm9ybWF0Iiwgc19pZ25vcmUsIDB9LAotICB7Im5vbGlzdCIsIGxpc3RpbmdfbGlzdCwgMH0sCS8qIFR1cm4gbGlzdGluZyBvZmYgKi8KLSAgeyJub3BhZ2UiLCBsaXN0aW5nX25vcGFnZSwgMH0sCi0gIHsib2N0YSIsIGNvbnMsIDE2fSwKLSAgeyJvZmZzZXQiLCBzX3N0cnVjdCwgMH0sCi0gIHsib3JnIiwgc19vcmcsIDB9LAotICB7InAyYWxpZ24iLCBzX2FsaWduX3B0d28sIDB9LAotICB7InAyYWxpZ253Iiwgc19hbGlnbl9wdHdvLCAtMn0sCi0gIHsicDJhbGlnbmwiLCBzX2FsaWduX3B0d28sIC00fSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicGxlbiIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7InByaW50Iiwgc19wcmludCwgMH0sCi0gIHsicHNpemUiLCBsaXN0aW5nX3BzaXplLCAwfSwJLyogc2V0IHBhcGVyIHNpemUgKi8KLSAgeyJwdXJnZW0iLCBzX3B1cmdlbSwgMH0sCi0gIHsicXVhZCIsIGNvbnMsIDh9LAotICB7InJlcCIsIHNfcmVwdCwgMH0sCi0gIHsicmVwdCIsIHNfcmVwdCwgMH0sCi0gIHsicnZhIiwgc19ydmEsIDR9LAotICB7InNidHRsIiwgbGlzdGluZ190aXRsZSwgMX0sCS8qIFN1YnRpdGxlIG9mIGxpc3RpbmcgKi8KLS8qIHNjbCAqLwotLyogc2VjdCAqLwotICB7InNldCIsIHNfc2V0LCAwfSwKLSAgeyJzaG9ydCIsIGNvbnMsIDJ9LAotICB7InNpbmdsZSIsIGZsb2F0X2NvbnMsICdmJ30sCi0vKiBzaXplICovCi0gIHsic3BhY2UiLCBzX3NwYWNlLCAwfSwKLSAgeyJza2lwIiwgc19zcGFjZSwgMH0sCi0gIHsic2xlYjEyOCIsIHNfbGViMTI4LCAxfSwKLSAgeyJzcGMiLCBzX2lnbm9yZSwgMH0sCi0gIHsic3RhYmQiLCBzX3N0YWIsICdkJ30sCi0gIHsic3RhYm4iLCBzX3N0YWIsICduJ30sCi0gIHsic3RhYnMiLCBzX3N0YWIsICdzJ30sCi0gIHsic3RyaW5nIiwgc3RyaW5nZXIsIDF9LAotICB7InN0cnVjdCIsIHNfc3RydWN0LCAwfSwKLS8qIHRhZyAqLwotICB7InRleHQiLCBzX3RleHQsIDB9LAotCi0gIC8qIFRoaXMgaXMgZm9yIGdjYyB0byB1c2UuICBJdCdzIG9ubHkganVzdCBiZWVuIGFkZGVkICgyLzk0KSwgc28gZ2NjCi0gICAgIHdvbid0IGJlIGFibGUgdG8gdXNlIGl0IGZvciBhIHdoaWxlIC0tIHByb2JhYmx5IGEgeWVhciBvciBtb3JlLgotICAgICBCdXQgb25jZSB0aGlzIGhhcyBiZWVuIHJlbGVhc2VkLCBjaGVjayB3aXRoIGdjYyBtYWludGFpbmVycwotICAgICBiZWZvcmUgZGVsZXRpbmcgaXQgb3IgZXZlbiBjaGFuZ2luZyB0aGUgc3BlbGxpbmcuICAqLwotICB7InRoaXNfR0NDX3JlcXVpcmVzX3RoZV9HTlVfYXNzZW1ibGVyIiwgc19pZ25vcmUsIDB9LAotICAvKiBJZiB3ZSdyZSBmb2xkaW5nIGNhc2UgLS0gZG9uZSBmb3Igc29tZSB0YXJnZXRzLCBub3QgbmVjZXNzYXJpbHkKLSAgICAgYWxsIC0tIHRoZSBhYm92ZSBzdHJpbmcgaW4gYW4gaW5wdXQgZmlsZSB3aWxsIGJlIGNvbnZlcnRlZCB0bwotICAgICB0aGlzIG9uZS4gIE1hdGNoIGl0IGVpdGhlciB3YXkuLi4gICovCi0gIHsidGhpc19nY2NfcmVxdWlyZXNfdGhlX2dudV9hc3NlbWJsZXIiLCBzX2lnbm9yZSwgMH0sCi0KLSAgeyJ0aXRsZSIsIGxpc3RpbmdfdGl0bGUsIDB9LAkvKiBMaXN0aW5nIHRpdGxlICovCi0gIHsidHRsIiwgbGlzdGluZ190aXRsZSwgMH0sCi0vKiB0eXBlICovCi0gIHsidWxlYjEyOCIsIHNfbGViMTI4LCAwfSwKLS8qIHVzZSAqLwotLyogdmFsICovCi0gIHsieGNvbSIsIHNfY29tbSwgMH0sCi0gIHsieGRlZiIsIHNfZ2xvYmwsIDB9LAotICB7InhyZWYiLCBzX2lnbm9yZSwgMH0sCi0gIHsieHN0YWJzIiwgc194c3RhYiwgJ3MnfSwKLSAgeyJ3b3JkIiwgY29ucywgMn0sCi0gIHsiemVybyIsIHNfc3BhY2UsIDB9LAotICB7TlVMTCwgTlVMTCwgMH0JCQkvKiBlbmQgc2VudGluZWwgKi8KLX07Ci0KLXN0YXRpYyBpbnQgcG9wX292ZXJyaWRlX29rID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpwb3BfdGFibGVfbmFtZTsKLQotdm9pZAotcG9wX2luc2VydCAodGFibGUpCi0gICAgIGNvbnN0IHBzZXVkb190eXBlUyAqdGFibGU7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycnR4dDsKLSAgY29uc3QgcHNldWRvX3R5cGVTICpwb3A7Ci0gIGZvciAocG9wID0gdGFibGU7IHBvcC0+cG9jX25hbWU7IHBvcCsrKQotICAgIHsKLSAgICAgIGVycnR4dCA9IGhhc2hfaW5zZXJ0IChwb19oYXNoLCBwb3AtPnBvY19uYW1lLCAoY2hhciAqKSBwb3ApOwotICAgICAgaWYgKGVycnR4dCAmJiAoIXBvcF9vdmVycmlkZV9vayB8fCBzdHJjbXAgKGVycnR4dCwgImV4aXN0cyIpKSkKLQlhc19mYXRhbCAoXygiZXJyb3IgY29uc3RydWN0aW5nICVzIHBzZXVkby1vcCB0YWJsZTogJXMiKSwgcG9wX3RhYmxlX25hbWUsCi0JCSAgZXJydHh0KTsKLSAgICB9Ci19Ci0KLSNpZm5kZWYgbWRfcG9wX2luc2VydAotI2RlZmluZSBtZF9wb3BfaW5zZXJ0KCkJCXBvcF9pbnNlcnQobWRfcHNldWRvX3RhYmxlKQotI2VuZGlmCi0KLSNpZm5kZWYgb2JqX3BvcF9pbnNlcnQKLSNkZWZpbmUgb2JqX3BvcF9pbnNlcnQoKQlwb3BfaW5zZXJ0KG9ial9wc2V1ZG9fdGFibGUpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgCi1wb2JlZ2luICgpCi17Ci0gIHBvX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICAvKiBEbyB0aGUgdGFyZ2V0LXNwZWNpZmljIHBzZXVkbyBvcHMuICovCi0gIHBvcF90YWJsZV9uYW1lID0gIm1kIjsKLSAgbWRfcG9wX2luc2VydCAoKTsKLQotICAvKiBOb3cgb2JqZWN0IHNwZWNpZmljLiAgU2tpcCBhbnkgdGhhdCB3ZXJlIGluIHRoZSB0YXJnZXQgdGFibGUuICovCi0gIHBvcF90YWJsZV9uYW1lID0gIm9iaiI7Ci0gIHBvcF9vdmVycmlkZV9vayA9IDE7Ci0gIG9ial9wb3BfaW5zZXJ0ICgpOwotCi0gIC8qIE5vdyBwb3J0YWJsZSBvbmVzLiAgU2tpcCBhbnkgdGhhdCB3ZSd2ZSBzZWVuIGFscmVhZHkuICovCi0gIHBvcF90YWJsZV9uYW1lID0gInN0YW5kYXJkIjsKLSAgcG9wX2luc2VydCAocG90YWJsZSk7Ci19Ci0MCi0jZGVmaW5lIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSgpCQkJCQlcCi0gIGlmIChpZ25vcmVfaW5wdXQgKCkpCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIrK10pCVwKLQlpZiAoaW5wdXRfbGluZV9wb2ludGVyID09IGJ1ZmZlcl9saW1pdCkJCQkJXAotCSAgYnJlYWs7CQkJCQkJCVwKLSAgICAgIGNvbnRpbnVlOwkJCQkJCQkJXAotICAgIH0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBzY3J1YmJpbmcgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiAjQVBQCi0gICBhbmQgI05PX0FQUC4gICovCi0KLXN0YXRpYyBjaGFyICpzY3J1Yl9zdHJpbmc7Ci1zdGF0aWMgY2hhciAqc2NydWJfc3RyaW5nX2VuZDsKLQotc3RhdGljIGludAotc2NydWJfZnJvbV9zdHJpbmcgKGJ1ZiwgYnVmbGVuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIGludCBjb3B5OwotCi0gIGNvcHkgPSBzY3J1Yl9zdHJpbmdfZW5kIC0gc2NydWJfc3RyaW5nOwotICBpZiAoY29weSA+IGJ1ZmxlbikKLSAgICBjb3B5ID0gYnVmbGVuOwotICBtZW1jcHkgKGJ1Ziwgc2NydWJfc3RyaW5nLCBjb3B5KTsKLSAgc2NydWJfc3RyaW5nICs9IGNvcHk7Ci0gIHJldHVybiBjb3B5OwotfQotCi0vKglyZWFkX2Ffc291cmNlX2ZpbGUoKQotICoKLSAqIFdlIHJlYWQgdGhlIGZpbGUsIHB1dHRpbmcgdGhpbmdzIGludG8gYSB3ZWIgdGhhdAotICogcmVwcmVzZW50cyB3aGF0IHdlIGhhdmUgYmVlbiByZWFkaW5nLgotICovCi12b2lkIAotcmVhZF9hX3NvdXJjZV9maWxlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnM7CQkvKiBzdHJpbmcgb2Ygc3ltYm9sLCAnXDAnIGFwcGVuZGVkICovCi0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICBwc2V1ZG9fdHlwZVMgKnBvcDsKLQotICBidWZmZXIgPSBpbnB1dF9zY3J1Yl9uZXdfZmlsZSAobmFtZSk7Ci0KLSAgbGlzdGluZ19maWxlIChuYW1lKTsKLSAgbGlzdGluZ19uZXdsaW5lIChOVUxMKTsKLSAgcmVnaXN0ZXJfZGVwZW5kZW5jeSAobmFtZSk7Ci0KLSAgLyogR2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJlZm9yZSB3ZSd2ZSByZWFkIGFueXRoaW5nIGluIHRvIGRlbm90ZQotICAgICB0aGlzIGZpbGUgYXMgdGhlICJtYWluIiBzb3VyY2UgZmlsZSBhbmQgbm90IGEgc3Vib3JkaW5hdGUgb25lCi0gICAgIChlLmcuIE5fU08gdnMgTl9TT0wgaW4gc3RhYnMpLiAgKi8KLSAgZ2VuZXJhdGVfZmlsZV9kZWJ1ZyAoKTsKLQotICB3aGlsZSAoKGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKSkgIT0gMCkKLSAgICB7CQkJCS8qIFdlIGhhdmUgYW5vdGhlciBsaW5lIHRvIHBhcnNlLiAqLwotICAgICAga25vdyAoYnVmZmVyX2xpbWl0Wy0xXSA9PSAnXG4nKTsJLyogTXVzdCBoYXZlIGEgc2VudGluZWwuICovCi0gICAgY29udGluOgkJCS8qIEpGIHRoaXMgZ290byBpcyBteSBmYXVsdCBJIGFkbWl0IGl0LgotCQkJCSAgIFNvbWVvbmUgYnJhdmUgcGxlYXNlIHJlLXdyaXRlIHRoZSB3aG9sZQotCQkJCSAgIGlucHV0IHNlY3Rpb24gaGVyZT8gIFBsZWV6ZT8/PyAgKi8KLSAgICAgIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQpCi0JewotCSAgLyogV2UgaGF2ZSBtb3JlIG9mIHRoaXMgYnVmZmVyIHRvIHBhcnNlLiAqLwotCi0JICAvKgotCSAgICogV2Ugbm93IGhhdmUgaW5wdXRfbGluZV9wb2ludGVyLT4xc3QgY2hhciBvZiBuZXh0IGxpbmUuCi0JICAgKiBJZiBpbnB1dF9saW5lX3BvaW50ZXIgWy0xXSA9PSAnXG4nIHRoZW4gd2UganVzdAotCSAgICogc2Nhbm5lZCBhbm90aGVyIGxpbmU6IHNvIGJ1bXAgbGluZSBjb3VudGVycy4KLQkgICAqLwotCSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdXSkKLQkgICAgewotI2lmZGVmIG1kX3N0YXJ0X2xpbmVfaG9vawotCSAgICAgIG1kX3N0YXJ0X2xpbmVfaG9vayAoKTsKLSNlbmRpZgotCi0JICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1xuJykKLQkJYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCi0JICAgICAgbGluZV9sYWJlbCA9IE5VTEw7Ci0KLQkgICAgICBpZiAoTEFCRUxTX1dJVEhPVVRfQ09MT05TIHx8IGZsYWdfbTY4a19tcmkpCi0JCXsKLQkJICAvKiBUZXh0IGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgbXVzdCBiZSBhIGxhYmVsLCB3ZQotCQkgICAgIHJ1biBkb3duIGFuZCBzdGljayBhIGNvbG9uIGluLiAgKi8KLQkJICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKmxpbmVfc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgICAgIGNoYXIgYzsKLQkJICAgICAgaW50IG1yaV9saW5lX21hY3JvOwotCi0JCSAgICAgIExJU1RJTkdfTkVXTElORSAoKTsKLQkJICAgICAgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZICgpOwotCi0JCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgdGhlIEVRVSBhbmQgTUFDUk8gcHNldWRvb3BzIG11c3QKLQkJCSBiZSBoYW5kbGVkIHNwZWNpYWxseS4gICovCi0JCSAgICAgIG1yaV9saW5lX21hY3JvID0gMDsKLQkJICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JCQl7Ci0JCQkgIGNoYXIgKnJlc3QgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxOwotCi0JCQkgIGlmICgqcmVzdCA9PSAnOicpCi0JCQkgICAgKytyZXN0OwotCQkJICBpZiAoKnJlc3QgPT0gJyAnIHx8ICpyZXN0ID09ICdcdCcpCi0JCQkgICAgKytyZXN0OwotCQkJICBpZiAoKHN0cm5jYXNlY21wIChyZXN0LCAiRVFVIiwgMykgPT0gMAotCQkJICAgICAgIHx8IHN0cm5jYXNlY21wIChyZXN0LCAiU0VUIiwgMykgPT0gMCkKLQkJCSAgICAgICYmIChyZXN0WzNdID09ICcgJyB8fCByZXN0WzNdID09ICdcdCcpKQotCQkJICAgIHsKLQkJCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHJlc3QgKyAzOwotCQkJICAgICAgZXF1YWxzIChsaW5lX3N0YXJ0LAotCQkJCSAgICAgIHN0cm5jYXNlY21wIChyZXN0LCAiU0VUIiwgMykgPT0gMCk7Ci0JCQkgICAgICBjb250aW51ZTsKLQkJCSAgICB9Ci0JCQkgIGlmIChzdHJuY2FzZWNtcCAocmVzdCwgIk1BQ1JPIiwgNSkgPT0gMAotCQkJICAgICAgJiYgKHJlc3RbNV0gPT0gJyAnCi0JCQkJICB8fCByZXN0WzVdID09ICdcdCcKLQkJCQkgIHx8IGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSByZXN0WzVdXSkpCi0JCQkgICAgbXJpX2xpbmVfbWFjcm8gPSAxOwotCQkJfQotCi0JCSAgICAgIC8qIEluIE1SSSBtb2RlLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgTUFDUk8KLSAgICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG8tb3Agc3BlY2lhbGx5OiB3ZSBkb24ndCB3YW50IHRvIHB1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0JCSAgICAgIGlmICghIG1yaV9saW5lX21hY3JvIAotI2lmZGVmIFRDX1NUQVJUX0xBQkVMX1dJVEhPVVRfQ09MT04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVENfU1RBUlRfTEFCRUxfV0lUSE9VVF9DT0xPTihjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9saW5lX3BvaW50ZXIpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKQotCQkJbGluZV9sYWJlbCA9IGNvbG9uIChsaW5lX3N0YXJ0KTsKLQkJICAgICAgZWxzZQotCQkJbGluZV9sYWJlbCA9IHN5bWJvbF9jcmVhdGUgKGxpbmVfc3RhcnQsCi0JCQkJCQkgICAgYWJzb2x1dGVfc2VjdGlvbiwKLQkJCQkJCSAgICAodmFsdWVUKSAwLAotCQkJCQkJICAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIGlmIChjID09ICc6JykKLQkJCWlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyoKLQkgICAqIFdlIGFyZSBhdCB0aGUgYmVnaW5pbmcgb2YgYSBsaW5lLCBvciBzaW1pbGFyIHBsYWNlLgotCSAgICogV2UgZXhwZWN0IGEgd2VsbC1mb3JtZWQgYXNzZW1ibGVyIHN0YXRlbWVudC4KLQkgICAqIEEgInN5bWJvbC1uYW1lOiIgaXMgYSBzdGF0ZW1lbnQuCi0JICAgKgotCSAgICogRGVwZW5kaW5nIG9uIHdoYXQgY29tcGlsZXIgaXMgdXNlZCwgdGhlIG9yZGVyIG9mIHRoZXNlIHRlc3RzCi0JICAgKiBtYXkgdmFyeSB0byBjYXRjaCBtb3N0IGNvbW1vbiBjYXNlIDFzdC4KLQkgICAqIEVhY2ggdGVzdCBpcyBpbmRlcGVuZGVudCBvZiBhbGwgb3RoZXIgdGVzdHMgYXQgdGhlICh0b3ApIGxldmVsLgotCSAgICogUExFQVNFIG1ha2UgYSBjb21waWxlciB0aGF0IGRvZXNuJ3QgdXNlIHRoaXMgYXNzZW1ibGVyLgotCSAgICogSXQgaXMgY3J1ZnR5IHRvIHdhc3RlIGEgY29tcGlsZXIncyB0aW1lIGVuY29kaW5nIHRoaW5ncyBmb3IgdGhpcwotCSAgICogYXNzZW1ibGVyLCB3aGljaCB0aGVuIHdhc3RlcyBtb3JlIHRpbWUgZGVjb2RpbmcgaXQuCi0JICAgKiAoQW5kIGNvbW11bmljYXRpbmcgdmlhIChsaW5lYXIpIGZpbGVzIGlzIHNpbGx5IQotCSAgICogSWYgeW91IG11c3QgcGFzcyBzdHVmZiwgcGxlYXNlIHBhc3MgYSB0cmVlISkKLQkgICAqLwotCSAgaWYgKChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKSA9PSAnXHQnCi0JICAgICAgfHwgYyA9PSAnICcKLQkgICAgICB8fCBjID09ICdcZicKLQkgICAgICB8fCBjID09IDApCi0JICAgIHsKLQkgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICB9Ci0JICBrbm93IChjICE9ICcgJyk7CS8qIE5vIGZ1cnRoZXIgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLQkgIC8qIElmIGxpc3RpbmcgaXMgb24sIGFuZCB3ZSBhcmUgZXhwYW5kaW5nIGEgbWFjcm8sIHRoZW4gZ2l2ZQotCSAgICAgdGhlIGxpc3RpbmcgY29kZSB0aGUgY29udGVudHMgb2YgdGhlIGV4cGFuZGVkIGxpbmUuICAqLwotCSAgaWYgKGxpc3RpbmcpCi0JICAgIHsKLQkgICAgICBpZiAoKGxpc3RpbmcgJiBMSVNUSU5HX01BQ0VYUCkgJiYgbWFjcm9fbmVzdCA+IDApCi0JCXsKLQkJICBjaGFyICpjb3B5OwotCQkgIGludCBsZW47Ci0KLQkJICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZXhwYW5kZWQgbWFjcm8gbGluZS4gICovCi0JCSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyLTE7ICpzIDsgKytzKQotCQkgICAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10pCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgLyogQ29weSBpdCBmb3Igc2FmZSBrZWVwaW5nLiAgQWxzbyBnaXZlIGFuIGluZGljYXRpb24gb2YKLQkJICAgICBob3cgbXVjaCBtYWNybyBuZXN0aW5nIGlzIGludm9sdmVkIGF0IHRoaXMgcG9pbnQuICAqLwotCQkgIGxlbiA9IHMgLSAoaW5wdXRfbGluZV9wb2ludGVyLTEpOwotCQkgIGNvcHkgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyBtYWNyb19uZXN0ICsgMik7Ci0JCSAgbWVtc2V0IChjb3B5LCAnPicsIG1hY3JvX25lc3QpOwotCQkgIGNvcHlbbWFjcm9fbmVzdF0gPSAnICc7Ci0JCSAgbWVtY3B5IChjb3B5ICsgbWFjcm9fbmVzdCArIDEsIGlucHV0X2xpbmVfcG9pbnRlci0xLCBsZW4pOwotCQkgIGNvcHlbbWFjcm9fbmVzdCsxK2xlbl0gPSAnXDAnOwotCi0JCSAgLyogSW5zdGFsbCB0aGUgbGluZSB3aXRoIHRoZSBsaXN0aW5nIGZhY2lsaXR5LiAgKi8KLQkJICBsaXN0aW5nX25ld2xpbmUgKGNvcHkpOwotCQl9Ci0JICAgICAgZWxzZQotCQlsaXN0aW5nX25ld2xpbmUgKE5VTEwpOwotCSAgICB9Ci0jZW5kaWYKLQotCSAgLyoKLQkgICAqIEMgaXMgdGhlIDFzdCBzaWduaWZpY2FudCBjaGFyYWN0ZXIuCi0JICAgKiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIGFmdGVyIHRoYXQgY2hhcmFjdGVyLgotCSAgICovCi0JICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoYykpCi0JICAgIHsKLQkgICAgICAvKiB3YW50IHVzZXItZGVmaW5lZCBsYWJlbCBvciBwc2V1ZG8vb3Bjb2RlICovCi0JICAgICAgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZICgpOwotCi0JICAgICAgcyA9IC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsJLyogbmFtZSdzIGRlbGltaXRlciAqLwotCSAgICAgIC8qCi0JICAgICAgICogQyBpcyBjaGFyYWN0ZXIgYWZ0ZXIgc3ltYm9sLgotCSAgICAgICAqIFRoYXQgY2hhcmFjdGVyJ3MgcGxhY2UgaW4gdGhlIGlucHV0IGxpbmUgaXMgbm93ICdcMCcuCi0JICAgICAgICogUyBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ltYm9sLgotCSAgICAgICAqICAgW0luIGNhc2Ugb2YgcHNldWRvLW9wLCBzLT4nLicuXQotCSAgICAgICAqIElucHV0X2xpbmVfcG9pbnRlci0+J1wwJyB3aGVyZSBjIHdhcy4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoVENfU1RBUlRfTEFCRUwoYywgaW5wdXRfbGluZV9wb2ludGVyKSkKLQkJewotCQkgIGlmIChmbGFnX202OGtfbXJpKQotCQkgICAgewotCQkgICAgICBjaGFyICpyZXN0ID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLQotCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgXHRzeW06IHNldCAwIGlzIHBlcm1pdHRlZC4gICovCi0KLQkJICAgICAgaWYgKCpyZXN0ID09ICc6JykKLQkJCSsrcmVzdDsKLQkJICAgICAgaWYgKCpyZXN0ID09ICcgJyB8fCAqcmVzdCA9PSAnXHQnKQotCQkJKytyZXN0OwotCQkgICAgICBpZiAoKHN0cm5jYXNlY21wIChyZXN0LCAiRVFVIiwgMykgPT0gMAotCQkJICAgfHwgc3RybmNhc2VjbXAgKHJlc3QsICJTRVQiLCAzKSA9PSAwKQotCQkJICAmJiAocmVzdFszXSA9PSAnICcgfHwgcmVzdFszXSA9PSAnXHQnKSkKLQkJCXsKLQkJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gcmVzdCArIDM7Ci0JCQkgIGVxdWFscyAocywgMSk7Ci0JCQkgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgfQotCi0JCSAgbGluZV9sYWJlbCA9IGNvbG9uIChzKTsJLyogdXNlci1kZWZpbmVkIGxhYmVsICovCi0JCSAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gJzonOwkvKiBQdXQgJzonIGJhY2sgZm9yIGVycm9yIG1lc3NhZ2VzJyBzYWtlLiAqLwotCQkgIC8qIElucHV0X2xpbmVfcG9pbnRlci0+YWZ0ZXIgJzonLiAqLwotCQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotCi0JCX0KLQkgICAgICBlbHNlIGlmIChjID09ICc9JwotCQkgICAgICAgfHwgKChjID09ICcgJyB8fCBjID09ICdcdCcpCi0JCQkgICAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJz0nCi0jaWZkZWYgVENfRVFVQUxfSU5fSU5TTgotCQkJICAgJiYgISBUQ19FUVVBTF9JTl9JTlNOIChjLCBpbnB1dF9saW5lX3BvaW50ZXIpCi0jZW5kaWYKLQkJCSAgICkpCi0JCXsKLQkJICBlcXVhbHMgKHMsIDEpOwotCQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsJCS8qIGV4cGVjdCBwc2V1ZG8tb3Agb3IgbWFjaGluZSBpbnN0cnVjdGlvbiAqLwotCQkgIHBvcCA9IE5VTEw7Ci0KLSNkZWZpbmUgSUdOT1JFX09QQ09ERV9DQVNFCi0jaWZkZWYgSUdOT1JFX09QQ09ERV9DQVNFCi0JCSAgewotCQkgICAgY2hhciAqczIgPSBzOwotCQkgICAgd2hpbGUgKCpzMikKLQkJICAgICAgewotCQkJaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSAqczIpKQotCQkJICAqczIgPSB0b2xvd2VyICgqczIpOwotCQkJczIrKzsKLQkJICAgICAgfQotCQkgIH0KLSNlbmRpZgotCi0JCSAgaWYgKE5PX1BTRVVET19ET1QgfHwgZmxhZ19tNjhrX21yaSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIE1SSSBhc3NlbWJsZXIgYW5kIHRoZSBtODhrIHVzZSBwc2V1ZG8tb3BzCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBhIHBlcmlvZC4gICovCi0JCSAgICAgIHBvcCA9IChwc2V1ZG9fdHlwZVMgKikgaGFzaF9maW5kIChwb19oYXNoLCBzKTsKLQkJICAgICAgaWYgKHBvcCAhPSBOVUxMICYmIHBvcC0+cG9jX2hhbmRsZXIgPT0gTlVMTCkKLQkJCXBvcCA9IE5VTEw7Ci0JCSAgICB9Ci0KLQkJICBpZiAocG9wICE9IE5VTEwKLQkJICAgICAgfHwgKCEgZmxhZ19tNjhrX21yaSAmJiAqcyA9PSAnLicpKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiBQU0VVRE8gLSBPUC4KLQkJICAgICAgICoKLQkJICAgICAgICogV0FSTklORzogYyBoYXMgbmV4dCBjaGFyLCB3aGljaCBtYXkgYmUgZW5kLW9mLWxpbmUuCi0JCSAgICAgICAqIFdlIGxvb2t1cCB0aGUgcHNldWRvLW9wIHRhYmxlIHdpdGggcysxIGJlY2F1c2Ugd2UKLQkJICAgICAgICogYWxyZWFkeSBrbm93IHRoYXQgdGhlIHBzZXVkby1vcCBiZWdpbnMgd2l0aCBhICcuJy4KLQkJICAgICAgICovCi0KLQkJICAgICAgaWYgKHBvcCA9PSBOVUxMKQotCQkJcG9wID0gKHBzZXVkb190eXBlUyAqKSBoYXNoX2ZpbmQgKHBvX2hhc2gsIHMgKyAxKTsKLQotCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgd2UgbWF5IG5lZWQgdG8gaW5zZXJ0IGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljIGFsaWdubWVudCBkaXJlY3RpdmUuICBXaGF0IGEgaGFjawotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMuICAqLwotCQkgICAgICBpZiAobXJpX3BlbmRpbmdfYWxpZ24KLQkJCSAgJiYgKHBvcCA9PSBOVUxMCi0JCQkgICAgICB8fCAhICgocG9wLT5wb2NfaGFuZGxlciA9PSBjb25zCi0JCQkJICAgICAmJiBwb3AtPnBvY192YWwgPT0gMSkKLQkJCQkgICAgfHwgKHBvcC0+cG9jX2hhbmRsZXIgPT0gc19zcGFjZQotCQkJCQkmJiBwb3AtPnBvY192YWwgPT0gMSkKLSNpZmRlZiB0Y19jb25kaXRpb25hbF9wc2V1ZG9vcAotCQkJCSAgICB8fCB0Y19jb25kaXRpb25hbF9wc2V1ZG9vcCAocG9wKQotI2VuZGlmCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZgotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWZkZWYKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2lmYwotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWZlcXMKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2Vsc2UKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2VuZGlmCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19nbG9ibAotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWdub3JlKSkpCi0JCQl7Ci0JCQkgIGRvX2FsaWduICgxLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkJCSAgbXJpX3BlbmRpbmdfYWxpZ24gPSAwOwotCQkJICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgZnJhZ19ub3cpOwotCQkJICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIC8qIFByaW50IHRoZSBlcnJvciBtc2cgbm93LCB3aGlsZSB3ZSBzdGlsbCBjYW4gKi8KLQkJICAgICAgaWYgKHBvcCA9PSBOVUxMKQotCQkJewotCQkJICBhc19iYWQgKF8oIlVua25vd24gcHNldWRvLW9wOiAgYCVzJyIpLCBzKTsKLQkJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCQkgIHNfaWdub3JlICgwKTsKLQkJCSAgY29udGludWU7Ci0JCQl9Ci0KLQkJICAgICAgLyogUHV0IGl0IGJhY2sgZm9yIGVycm9yIG1lc3NhZ2VzIGV0Yy4gKi8KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgc2tpcCBvZiB3aGl0ZXNwYWNlIGlzIGNvbXB1bHNvcnkuCi0JCQkgQSB3ZWxsIHNoYXBlZCBzcGFjZSBpcyBzb21ldGltZXMgYWxsIHRoYXQgc2VwYXJhdGVzCi0JCQkga2V5d29yZCBmcm9tIG9wZXJhbmRzLiAqLwotCQkgICAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQkJaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIElucHV0X2xpbmUgaXMgcmVzdG9yZWQuCi0JCSAgICAgICAqIElucHV0X2xpbmVfcG9pbnRlci0+MXN0IG5vbi1ibGFuayBjaGFyCi0JCSAgICAgICAqIGFmdGVyIHBzZXVkby1vcGVyYXRpb24uCi0JCSAgICAgICAqLwotCQkgICAgICAoKnBvcC0+cG9jX2hhbmRsZXIpIChwb3AtPnBvY192YWwpOwotCi0JCSAgICAgIC8qIElmIHRoYXQgd2FzIC5lbmQsIGp1c3QgZ2V0IG91dCBub3cuICAqLwotCQkgICAgICBpZiAocG9wLT5wb2NfaGFuZGxlciA9PSBzX2VuZCkKLQkJCWdvdG8gcXVpdDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGludCBpbnF1b3RlID0gMDsKLSNpZmRlZiBRVU9URVNfSU5fSU5TTgotCQkgICAgICBpbnQgaW5lc2NhcGUgPSAwOwotI2VuZGlmCi0KLQkJICAgICAgLyogV0FSTklORzogYyBoYXMgY2hhciwgd2hpY2ggbWF5IGJlIGVuZC1vZi1saW5lLiAqLwotCQkgICAgICAvKiBBbHNvOiBpbnB1dF9saW5lX3BvaW50ZXItPmBcMGAgd2hlcmUgYyB3YXMuICovCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCQkJICAgICB8fCBpbnF1b3RlCi0jaWZkZWYgVENfRU9MX0lOX0lOU04KLQkJCSAgICAgfHwgVENfRU9MX0lOX0lOU04gKGlucHV0X2xpbmVfcG9pbnRlcikKLSNlbmRpZgotCQkJICAgICApCi0JCQl7Ci0JCQkgIGlmIChmbGFnX202OGtfbXJpICYmICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLQkJCSAgICBpbnF1b3RlID0gISBpbnF1b3RlOwotI2lmZGVmIFFVT1RFU19JTl9JTlNOCi0JCQkgIGlmIChpbmVzY2FwZSkKLQkJCSAgICBpbmVzY2FwZSA9IDA7Ci0JCQkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCQkJICAgIGlucXVvdGUgPSAhIGlucXVvdGU7Ci0JCQkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xcJykKLQkJCSAgICBpbmVzY2FwZSA9IDE7Ci0jZW5kaWYKLQkJCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCQl9Ci0KLQkJICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCi0JCSAgICAgIGdlbmVyYXRlX2xpbmVub19kZWJ1ZyAoKTsKLQotCQkgICAgICBpZiAobWFjcm9fZGVmaW5lZCkKLQkJCXsKLQkJCSAgc2Igb3V0OwotCQkJICBjb25zdCBjaGFyICplcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvX2VudHJ5ICptYWNybzsKLQotCQkJICBpZiAoY2hlY2tfbWFjcm8gKHMsICZvdXQsICdcMCcsICZlcnIsICZtYWNybykpCi0JCQkgICAgewotCQkJICAgICAgaWYgKGVyciAhPSBOVUxMKQotCQkJCWFzX2JhZCAoIiVzIiwgZXJyKTsKLQkJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGM7Ci0JCQkgICAgICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmb3V0LAotCQkJCQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyLCAxKTsKLQkJCSAgICAgIHNiX2tpbGwgKCZvdXQpOwotCQkJICAgICAgYnVmZmVyX2xpbWl0ID0KLQkJCQlpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci0jaWZkZWYgbWRfbWFjcm9faW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRfbWFjcm9faW5mbyAobWFjcm8pOwotI2VuZGlmCi0JCQkgICAgICBjb250aW51ZTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgaWYgKG1yaV9wZW5kaW5nX2FsaWduKQotCQkJewotCQkJICBkb19hbGlnbiAoMSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7Ci0JCQkgIG1yaV9wZW5kaW5nX2FsaWduID0gMDsKLQkJCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxpbmVfbGFiZWwsIGZyYWdfbm93KTsKLQkJCSAgICAgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCBmcmFnX25vd19maXggKCkpOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBtZF9hc3NlbWJsZSAocyk7CS8qIEFzc2VtYmxlIDEgaW5zdHJ1Y3Rpb24uICovCi0KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKLQotCQkgICAgICAvKiBXZSByZXN1bWUgbG9vcCBBRlRFUiB0aGUgZW5kLW9mLWxpbmUgZnJvbQotCQkJIHRoaXMgaW5zdHJ1Y3Rpb24uICovCi0JCSAgICB9CQkvKiBpZiAoKnM9PScuJykgKi8KLQkJfQkJLyogaWYgYz09JzonICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0JCQkvKiBpZiAoaXNfbmFtZV9iZWdpbm5lcihjKSAqLwotCi0KLQkgIC8qIEVtcHR5IHN0YXRlbWVudD8gICovCi0JICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGNdKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKChMT0NBTF9MQUJFTFNfRE9MTEFSIHx8IExPQ0FMX0xBQkVMU19GQikKLQkgICAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykpCi0JICAgIHsKLQkgICAgICAvKiBsb2NhbCBsYWJlbCAgKCI0OiIpICovCi0JICAgICAgY2hhciAqYmFja3VwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0JICAgICAgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZICgpOwotCi0JICAgICAgdGVtcCA9IGMgLSAnMCc7Ci0KLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotCQl7Ci0JCSAgdGVtcCA9ICh0ZW1wICogMTApICsgKmlucHV0X2xpbmVfcG9pbnRlciAtICcwJzsKLQkJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkJfQkJLyogcmVhZCB0aGUgd2hvbGUgbnVtYmVyICovCi0KLQkgICAgICBpZiAoTE9DQUxfTEFCRUxTX0RPTExBUgotCQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyQnCi0JCSAgJiYgKihpbnB1dF9saW5lX3BvaW50ZXIgKyAxKSA9PSAnOicpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotCQkgIGlmIChkb2xsYXJfbGFiZWxfZGVmaW5lZCAodGVtcCkpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2ZhdGFsIChfKCJsYWJlbCBcIiVkJFwiIHJlZGVmaW5lZCIpLCB0ZW1wKTsKLQkJICAgIH0KLQotCQkgIGRlZmluZV9kb2xsYXJfbGFiZWwgKHRlbXApOwotCQkgIGNvbG9uIChkb2xsYXJfbGFiZWxfbmFtZSAodGVtcCwgMCkpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpZiAoTE9DQUxfTEFCRUxTX0ZCCi0JCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICc6JykKLQkJewotCQkgIGZiX2xhYmVsX2luc3RhbmNlX2luYyAodGVtcCk7Ci0JCSAgY29sb24gKGZiX2xhYmVsX25hbWUgKHRlbXAsIDApKTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYmFja3VwOwotCSAgICB9CQkJLyogbG9jYWwgbGFiZWwgICgiNDoiKSAqLwotCi0JICBpZiAoYyAmJiBzdHJjaHIgKGxpbmVfY29tbWVudF9jaGFycywgYykpCi0JICAgIHsJCQkvKiBJdHMgYSBjb21tZW50LiAgQmV0dGVyIHNheSBBUFAgb3IgTk9fQVBQICovCi0JICAgICAgY2hhciAqZW5kczsKLQkgICAgICBjaGFyICpuZXdfYnVmOwotCSAgICAgIGNoYXIgKm5ld190bXA7Ci0JICAgICAgdW5zaWduZWQgaW50IG5ld19sZW5ndGg7Ci0JICAgICAgY2hhciAqdG1wX2J1ZiA9IDA7Ci0KLQkgICAgICBidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0JICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpZiAoc3RybmNtcCAocywgIkFQUFxuIiwgNCkpCi0JCWNvbnRpbnVlOwkvKiBXZSBpZ25vcmUgaXQgKi8KLQkgICAgICBzICs9IDQ7Ci0KLQkgICAgICBlbmRzID0gc3Ryc3RyIChzLCAiI05PX0FQUFxuIik7Ci0KLQkgICAgICBpZiAoIWVuZHMpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdG1wX2xlbjsKLQkJICB1bnNpZ25lZCBpbnQgbnVtOwotCi0JCSAgLyogVGhlIGVuZCBvZiB0aGUgI0FQUCB3YXNuJ3QgaW4gdGhpcyBidWZmZXIuICBXZQotCQkgICAgIGtlZXAgcmVhZGluZyBpbiBidWZmZXJzIHVudGlsIHdlIGZpbmQgdGhlICNOT19BUFAKLQkJICAgICB0aGF0IGdvZXMgd2l0aCB0aGlzICNBUFAgIFRoZXJlIGlzIG9uZS4gIFRoZSBzcGVjcwotCQkgICAgIGd1YXJlbnRlZSBpdC4gLiAuICovCi0JCSAgdG1wX2xlbiA9IGJ1ZmZlcl9saW1pdCAtIHM7Ci0JCSAgdG1wX2J1ZiA9IHhtYWxsb2MgKHRtcF9sZW4gKyAxKTsKLQkJICBtZW1jcHkgKHRtcF9idWYsIHMsIHRtcF9sZW4pOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIG5ld190bXAgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmJ1ZmZlcik7Ci0JCSAgICAgIGlmICghbmV3X3RtcCkKLQkJCWJyZWFrOwotCQkgICAgICBlbHNlCi0JCQlidWZmZXJfbGltaXQgPSBuZXdfdG1wOwotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWZmZXI7Ci0JCSAgICAgIGVuZHMgPSBzdHJzdHIgKGJ1ZmZlciwgIiNOT19BUFBcbiIpOwotCQkgICAgICBpZiAoZW5kcykKLQkJCW51bSA9IGVuZHMgLSBidWZmZXI7Ci0JCSAgICAgIGVsc2UKLQkJCW51bSA9IGJ1ZmZlcl9saW1pdCAtIGJ1ZmZlcjsKLQotCQkgICAgICB0bXBfYnVmID0geHJlYWxsb2MgKHRtcF9idWYsIHRtcF9sZW4gKyBudW0pOwotCQkgICAgICBtZW1jcHkgKHRtcF9idWYgKyB0bXBfbGVuLCBidWZmZXIsIG51bSk7Ci0JCSAgICAgIHRtcF9sZW4gKz0gbnVtOwotCQkgICAgfQotCQkgIHdoaWxlICghZW5kcyk7Ci0KLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRzID8gZW5kcyArIDggOiBOVUxMOwotCi0JCSAgcyA9IHRtcF9idWY7Ci0JCSAgZW5kcyA9IHMgKyB0bXBfbGVuOwotCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRzICsgODsKLQkJfQotCi0JICAgICAgc2NydWJfc3RyaW5nID0gczsKLQkgICAgICBzY3J1Yl9zdHJpbmdfZW5kID0gZW5kczsKLQotCSAgICAgIG5ld19sZW5ndGggPSBlbmRzIC0gczsKLQkgICAgICBuZXdfYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobmV3X2xlbmd0aCk7Ci0JICAgICAgbmV3X3RtcCA9IG5ld19idWY7Ci0JICAgICAgZm9yICg7OykKLQkJewotCQkgIGludCBzcGFjZTsKLQkJICBpbnQgc2l6ZTsKLQotCQkgIHNwYWNlID0gKG5ld19idWYgKyBuZXdfbGVuZ3RoKSAtIG5ld190bXA7Ci0JCSAgc2l6ZSA9IGRvX3NjcnViX2NoYXJzIChzY3J1Yl9mcm9tX3N0cmluZywgbmV3X3RtcCwgc3BhY2UpOwotCi0JCSAgaWYgKHNpemUgPCBzcGFjZSkKLQkJICAgIHsKLQkJICAgICAgbmV3X3RtcCArPSBzaXplOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQkgIG5ld19idWYgPSB4cmVhbGxvYyAobmV3X2J1ZiwgbmV3X2xlbmd0aCArIDEwMCk7Ci0JCSAgbmV3X3RtcCA9IG5ld19idWYgKyBuZXdfbGVuZ3RoOwotCQkgIG5ld19sZW5ndGggKz0gMTAwOwotCQl9Ci0KLQkgICAgICBpZiAodG1wX2J1ZikKLQkJZnJlZSAodG1wX2J1Zik7Ci0JICAgICAgb2xkX2J1ZmZlciA9IGJ1ZmZlcjsKLQkgICAgICBvbGRfaW5wdXQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgb2xkX2xpbWl0ID0gYnVmZmVyX2xpbWl0OwotCSAgICAgIGJ1ZmZlciA9IG5ld19idWY7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gbmV3X2J1ZjsKLQkgICAgICBidWZmZXJfbGltaXQgPSBuZXdfdG1wOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKLQotI2lmZGVmIHRjX3VucmVjb2duaXplZF9saW5lCi0JICBpZiAodGNfdW5yZWNvZ25pemVkX2xpbmUgKGMpKQotCSAgICBjb250aW51ZTsKLSNlbmRpZgotCi0JICAvKiBhc193YXJuKCJKdW5rIGNoYXJhY3RlciAlZC4iLGMpOyAgTm93IGRvbmUgYnkgaWdub3JlX3Jlc3QgKi8KLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKiBSZXBvcnQgdW5rbm93biBjaGFyIGFzIGlnbm9yZWQuICovCi0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCX0JCQkvKiB3aGlsZSAoaW5wdXRfbGluZV9wb2ludGVyPGJ1ZmZlcl9saW1pdCkgKi8KLQotI2lmZGVmIG1kX2FmdGVyX3Bhc3NfaG9vawotICAgICAgbWRfYWZ0ZXJfcGFzc19ob29rICgpOwotI2VuZGlmCi0KLSAgICAgIGlmIChvbGRfYnVmZmVyKQotCXsKLQkgIGZyZWUgKGJ1ZmZlcik7Ci0JICBidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0JICBpZiAob2xkX2lucHV0ICE9IDApCi0JICAgIHsKLQkgICAgICBidWZmZXIgPSBvbGRfYnVmZmVyOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZF9pbnB1dDsKLQkgICAgICBidWZmZXJfbGltaXQgPSBvbGRfbGltaXQ7Ci0JICAgICAgb2xkX2J1ZmZlciA9IDA7Ci0JICAgICAgZ290byBjb250aW47Ci0JICAgIH0KLQl9Ci0gICAgfQkJCQkvKiB3aGlsZSAobW9yZSBidWZmZXJzIHRvIHNjYW4pICovCi0KLSBxdWl0OgotCi0jaWZkZWYgbWRfY2xlYW51cAotICBtZF9jbGVhbnVwKCk7Ci0jZW5kaWYKLSAgaW5wdXRfc2NydWJfY2xvc2UgKCk7CQkvKiBDbG9zZSB0aGUgaW5wdXQgZmlsZSAqLwotfQotCi0vKiBGb3IgbW9zdCBNUkkgcHNldWRvLW9wcywgdGhlIGxpbmUgYWN0dWFsbHkgZW5kcyBhdCB0aGUgZmlyc3QKLSAgIG5vbnF1b3RlZCBzcGFjZS4gIFRoaXMgZnVuY3Rpb24gbG9va3MgZm9yIHRoYXQgcG9pbnQsIHN0dWZmcyBhIG51bGwKLSAgIGluLCBhbmQgc2V0cyAqU1RPUENQIHRvIHRoZSBjaGFyYWN0ZXIgdGhhdCB1c2VkIHRvIGJlIHRoZXJlLCBhbmQKLSAgIHJldHVybnMgdGhlIGxvY2F0aW9uLgotCi0gICBVbnRpbCBJIGhlYXIgb3RoZXJ3aXNlLCBJIGFtIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoaXMgaXMgb25seSB0cnVlCi0gICBmb3IgdGhlIG02OGsgTVJJIGFzc2VtYmxlci4gICovCi0KLWNoYXIgKgotbXJpX2NvbW1lbnRfZmllbGQgKHN0b3BjcCkKLSAgICAgY2hhciAqc3RvcGNwOwotewotI2lmZGVmIFRDX002OEsKLQotICBjaGFyICpzOwotICBpbnQgaW5xdW90ZSA9IDA7Ci0KLSAga25vdyAoZmxhZ19tNjhrX21yaSk7Ci0KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgICgoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCXx8IGlucXVvdGUpOwotICAgICAgIHMrKykKLSAgICB7Ci0gICAgICBpZiAoKnMgPT0gJ1wnJykKLQlpbnF1b3RlID0gISBpbnF1b3RlOwotICAgIH0KLSAgKnN0b3BjcCA9ICpzOwotICAqcyA9ICdcMCc7Ci0gIHJldHVybiBzOwotCi0jZWxzZQotCi0gIGNoYXIgKnM7Ci0KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc107IHMrKykKLSAgICA7Ci0gICpzdG9wY3AgPSAqczsKLSAgKnMgPSAnXDAnOwotICByZXR1cm4gczsKLQotI2VuZGlmCi0KLX0KLQotLyogU2tpcCB0byB0aGUgZW5kIG9mIGFuIE1SSSBjb21tZW50IGZpZWxkLiAgKi8KLQotdm9pZAotbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYykKLSAgICAgY2hhciAqc3RvcDsKLSAgICAgaW50IHN0b3BjOwotewotICBrbm93IChmbGFnX21yaSk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RvcDsKLSAgKnN0b3AgPSBzdG9wYzsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi12b2lkIAotc19hYm9ydCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzX2ZhdGFsIChfKCIuYWJvcnQgZGV0ZWN0ZWQuICBBYmFuZG9uaW5nIHNoaXAuIikpOwotfQotCi0vKiBHdXRzIG9mIC5hbGlnbiBkaXJlY3RpdmUuICBOIGlzIHRoZSBwb3dlciBvZiB0d28gdG8gd2hpY2ggdG8gYWxpZ24uCi0gICBGSUxMIG1heSBiZSBOVUxMLCBvciBpdCBtYXkgcG9pbnQgdG8gdGhlIGJ5dGVzIG9mIHRoZSBmaWxsIHBhdHRlcm4uCi0gICBMRU4gaXMgdGhlIGxlbmd0aCBvZiB3aGF0ZXZlciBGSUxMIHBvaW50cyB0bywgaWYgYW55dGhpbmcuICBNQVggaXMKLSAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbiBkb2luZyB0aGUgYWxpZ25tZW50LAotICAgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLQotc3RhdGljIHZvaWQgCi1kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpCi0gICAgIGludCBuOwotICAgICBjaGFyICpmaWxsOwotICAgICBpbnQgbGVuOwotICAgICBpbnQgbWF4OwotewotICBjaGFyIGRlZmF1bHRfZmlsbDsKLQotI2lmZGVmIG1kX2RvX2FsaWduCi0gIG1kX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCwganVzdF9yZWNvcmRfYWxpZ25tZW50KTsKLSNlbmRpZgotCi0gIGlmIChmaWxsID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpKQotCWRlZmF1bHRfZmlsbCA9IE5PUF9PUENPREU7Ci0gICAgICBlbHNlCi0JZGVmYXVsdF9maWxsID0gMDsKLSAgICAgIGZpbGwgPSAmZGVmYXVsdF9maWxsOwotICAgICAgbGVuID0gMTsKLSAgICB9Ci0KLSAgLyogT25seSBtYWtlIGEgZnJhZyBpZiB3ZSBIQVZFIHRvLiAuIC4gKi8KLSAgaWYgKG4gIT0gMCAmJiAhbmVlZF9wYXNzXzIpCi0gICAgewotICAgICAgaWYgKGxlbiA8PSAxKQotCWZyYWdfYWxpZ24gKG4sICpmaWxsLCBtYXgpOwotICAgICAgZWxzZQotCWZyYWdfYWxpZ25fcGF0dGVybiAobiwgZmlsbCwgbGVuLCBtYXgpOwotICAgIH0KLQotI2lmZGVmIG1kX2RvX2FsaWduCi0ganVzdF9yZWNvcmRfYWxpZ25tZW50OgotI2VuZGlmCi0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbiAtIE9DVEVUU19QRVJfQllURV9QT1dFUik7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFsaWduIHBzZXVkby1vcC4gIEEgcG9zaXRpdmUgQVJHIGlzIGEgZGVmYXVsdCBhbGlnbm1lbnQKLSAgIChpbiBieXRlcykuICBBIG5lZ2F0aXZlIEFSRyBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIGxlbmd0aCBvZiB0aGUKLSAgIGZpbGwgcGF0dGVybi4gIEJZVEVTX1AgaXMgbm9uLXplcm8gaWYgdGhlIGFsaWdubWVudCB2YWx1ZSBzaG91bGQgYmUKLSAgIGludGVycHJldGVkIGFzIHRoZSBieXRlIGJvdW5kYXJ5LCByYXRoZXIgdGhhbiB0aGUgcG93ZXIgb2YgMi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FsaWduIChhcmcsIGJ5dGVzX3ApCi0gICAgIGludCBhcmc7Ci0gICAgIGludCBieXRlc19wOwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYWxpZ247Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotICBvZmZzZXRUIGZpbGwgPSAwOwotICBpbnQgbWF4OwotICBpbnQgZmlsbF9wOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoYXJnIDwgMCkKLQlhbGlnbiA9IDA7Ci0gICAgICBlbHNlCi0JYWxpZ24gPSBhcmc7CS8qIERlZmF1bHQgdmFsdWUgZnJvbSBwc2V1ZG8tb3AgdGFibGUgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLQotICBpZiAoYnl0ZXNfcCkKLSAgICB7Ci0gICAgICAvKiBDb252ZXJ0IHRvIGEgcG93ZXIgb2YgMi4gICovCi0gICAgICBpZiAoYWxpZ24gIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgKGFsaWduICYgMSkgPT0gMDsgYWxpZ24gPj49IDEsICsraSkKLQkgICAgOwotCSAgaWYgKGFsaWduICE9IDEpCi0JICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICBhbGlnbiA9IGk7Ci0JfQotICAgIH0KLQotICBpZiAoYWxpZ24gPiAxNSkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDE1OwotICAgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAldSBhc3N1bWVkIiksIGFsaWduKTsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGZpbGxfcCA9IDA7Ci0gICAgICBtYXggPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCWZpbGxfcCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgZmlsbF9wID0gMTsKLQl9Ci0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQltYXggPSAwOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgbWF4ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JfQotICAgIH0KLQotICBpZiAoISBmaWxsX3ApCi0gICAgewotICAgICAgaWYgKGFyZyA8IDApCi0JYXNfd2FybiAoXygiZXhwZWN0ZWQgZmlsbCBwYXR0ZXJuIG1pc3NpbmciKSk7Ci0gICAgICBkb19hbGlnbiAoYWxpZ24sIChjaGFyICopIE5VTEwsIDAsIG1heCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGZpbGxfbGVuOwotCi0gICAgICBpZiAoYXJnID49IDApCi0JZmlsbF9sZW4gPSAxOwotICAgICAgZWxzZQotCWZpbGxfbGVuID0gLSBhcmc7Ci0gICAgICBpZiAoZmlsbF9sZW4gPD0gMSkKLQl7Ci0JICBjaGFyIGZpbGxfY2hhcjsKLQotCSAgZmlsbF9jaGFyID0gZmlsbDsKLQkgIGRvX2FsaWduIChhbGlnbiwgJmZpbGxfY2hhciwgZmlsbF9sZW4sIG1heCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYWJbMTZdOwotCi0JICBpZiAoKHNpemVfdCkgZmlsbF9sZW4gPiBzaXplb2YgYWIpCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChhYiwgZmlsbCwgZmlsbF9sZW4pOwotCSAgZG9fYWxpZ24gKGFsaWduLCBhYiwgZmlsbF9sZW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wIG9uIG1hY2hpbmVzIHdoZXJlICIuYWxpZ24gNCIgbWVhbnMKLSAgIGFsaWduIHRvIGEgNCBieXRlIGJvdW5kYXJ5LiAgKi8KLQotdm9pZCAKLXNfYWxpZ25fYnl0ZXMgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgc19hbGlnbiAoYXJnLCAxKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wIG9uIG1hY2hpbmVzIHdoZXJlICIuYWxpZ24gNCIgbWVhbnMgYWxpZ24KLSAgIHRvIGEgMioqNCBib3VuZGFyeS4gICovCi0KLXZvaWQgCi1zX2FsaWduX3B0d28gKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgc19hbGlnbiAoYXJnLCAwKTsKLX0KLQotdm9pZCAKLXNfY29tbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgb2Zmc2V0VCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmIChmbGFnX21yaSkKLQltcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JCShsb25nKSB0ZW1wKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgdGVtcCk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgfQotI2lmZGVmIE9CSl9WTVMKLSAgewotICAgIGV4dGVybiBpbnQgZmxhZ19vbmU7Ci0gICAgaWYgKCAoIXRlbXApIHx8ICFmbGFnX29uZSkKLSAgICAgIFNfR0VUX09USEVSKHN5bWJvbFApID0gY29uc3RfZmxhZzsKLSAgfQotI2VuZGlmIC8qIG5vdCBPQkpfVk1TICovCi0gIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0JCQkJLyogc19jb21tKCkgKi8KLQotLyogVGhlIE1SSSBDT01NT04gcHNldWRvLW9wLiAgV2UgaGFuZGxlIHRoaXMgYnkgY3JlYXRpbmcgYSBjb21tb24KLSAgIHN5bWJvbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBuYW1lLiAgV2UgbWFrZSBzX3NwYWNlIGRvIHRoZSByaWdodAotICAgdGhpbmcgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZS4gICovCi0KLXZvaWQKLXNfbXJpX2NvbW1vbiAoc21hbGwpCi0gICAgIGludCBzbWFsbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKmFsYyA9IE5VTEw7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgb2Zmc2V0VCBhbGlnbjsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKCEgZmxhZ19tcmkpCi0gICAgewotICAgICAgc19jb21tICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKm5hbWUpKQotICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCi0gICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCXsKLQkgIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoU19HRVRfTkFNRSAobGluZV9sYWJlbCkpCi0JCQkJICArIChpbnB1dF9saW5lX3BvaW50ZXIgLSBuYW1lKQotCQkJCSAgKyAxKTsKLQkgIHNwcmludGYgKGFsYywgIiVzJXMiLCBuYW1lLCBTX0dFVF9OQU1FIChsaW5lX2xhYmVsKSk7Ci0JICBuYW1lID0gYWxjOwotCX0KLSAgICB9Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBpZiAoYWxjICE9IE5VTEwpCi0gICAgZnJlZSAoYWxjKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYWxpZ24gPSAwOwotICBlbHNlCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLQotICBpZiAoU19JU19ERUZJTkVEIChzeW0pICYmICEgU19JU19DT01NT04gKHN5bSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJyIpLCBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU19TRVRfRVhURVJOQUwgKHN5bSk7Ci0gIG1yaV9jb21tb25fc3ltYm9sID0gc3ltOwotCi0jaWZkZWYgU19TRVRfQUxJR04KLSAgaWYgKGFsaWduICE9IDApCi0gICAgU19TRVRfQUxJR04gKHN5bSwgYWxpZ24pOwotI2VuZGlmCi0KLSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgICBleHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgZXhwLlhfYWRkX3N5bWJvbCA9IHN5bTsKLSAgICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChsaW5lX2xhYmVsLCAmZXhwKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIGV4cHJfc2VjdGlvbik7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBXZSBqdXN0IGlnbm9yZSB0aGUgc21hbGwgYXJndW1lbnQsIHdoaWNoIGRpc3Rpbmd1aXNoZXMKLSAgICAgQ09NTU9OIGFuZCBDT01NT04uUy4gIEkgZG9uJ3Qga25vdyB3aGF0IHdlIGNhbiBkbyBhYm91dCBpdC4gICovCi0KLSAgLyogSWdub3JlIHRoZSB0eXBlIGFuZCBocHR5cGUuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi12b2lkCi1zX2RhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzZWdUIHNlY3Rpb247Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIHNlY3Rpb24gPSB0ZXh0X3NlY3Rpb247Ci0gICAgICB0ZW1wICs9IDEwMDA7Ci0gICAgfQotICBlbHNlCi0gICAgc2VjdGlvbiA9IGRhdGFfc2VjdGlvbjsKLQotICBzdWJzZWdfc2V0IChzZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0KLSNpZmRlZiBPQkpfVk1TCi0gIGNvbnN0X2ZsYWcgPSAwOwotI2VuZGlmCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFwcGZpbGUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQotICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuIHdpdGggYQotICAgZmlsZSBuYW1lLiAgVGhpcyBkZWZhdWx0IGRlZmluaXRpb24gbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIG9iamVjdAotICAgb3IgQ1BVIHNwZWNpZmljIHBzZXVkby1vcHMuICBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdGhlIGRlZmF1bHQKLSAgIGRlZmluaXRpb24gZm9yIC5maWxlOyB0aGUgQVBQRklMRSBhcmd1bWVudCBpcyAxIGZvciAuYXBwZmlsZSwgMCBmb3IKLSAgIC5maWxlLiAgKi8KLQotdm9pZCAKLXNfYXBwX2ZpbGUgKGFwcGZpbGUpCi0gICAgIGludCBhcHBmaWxlOwotewotICByZWdpc3RlciBjaGFyICpzOwotICBpbnQgbGVuZ3RoOwotCi0gIC8qIFNvbWUgYXNzZW1ibGVycyB0b2xlcmF0ZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgJyInICovCi0gIGlmICgocyA9IGRlbWFuZF9jb3B5X3N0cmluZyAoJmxlbmd0aCkpICE9IDApCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIGZha2UgLmFwcGZpbGUsIGEgZmFrZSBuZXdsaW5lIHdhcyBpbnNlcnRlZCBpbnRvCi0JIHRoZSBidWZmZXIuICBQYXNzaW5nIC0yIHRvIG5ld19sb2dpY2FsX2xpbmUgdGVsbHMgaXQgdG8KLQkgYWNjb3VudCBmb3IgaXQuICAqLwotICAgICAgaW50IG1heV9vbWl0Ci0JPSAoISBuZXdfbG9naWNhbF9saW5lIChzLCBhcHBmaWxlID8gLTIgOiAtMSkgJiYgYXBwZmlsZSk7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgcHJlcHJvY2Vzc29yIG1heSBoYXZlIGluc2VydGVkIGFuIGV4dHJhbmVvdXMKLSAgICAgICAgIGJhY2txdW90ZS4gICovCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaQotCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnCi0JICAmJiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmICghIG1heV9vbWl0KQotCXsKLSNpZmRlZiBMSVNUSU5HCi0JICBpZiAobGlzdGluZykKLQkgICAgbGlzdGluZ19zb3VyY2VfZmlsZSAocyk7Ci0jZW5kaWYKLQkgIHJlZ2lzdGVyX2RlcGVuZGVuY3kgKHMpOwotI2lmZGVmIG9ial9hcHBfZmlsZQotCSAgb2JqX2FwcF9maWxlIChzKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFwcGxpbmUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQotICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuLiAgVGhpcwotICAgZGVmYXVsdCBkZWZpbml0aW9uIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBvYmplY3Qgb3IgQ1BVIHNwZWNpZmljCi0gICBwc2V1ZG8tb3BzLiAgKi8KLQotdm9pZAotc19hcHBfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBsOwotCi0gIC8qIFRoZSBnaXZlbiBudW1iZXIgaXMgdGhhdCBvZiB0aGUgbmV4dCBsaW5lLiAgKi8KLSAgbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpIC0gMTsKLSAgaWYgKGwgPCAwKQotICAgIC8qIFNvbWUgb2YgdGhlIGJhY2sgZW5kcyBjYW4ndCBkZWFsIHdpdGggbm9uLXBvc2l0aXZlIGxpbmUgbnVtYmVycy4KLSAgICAgICBCZXNpZGVzLCBpdCdzIHNpbGx5LiAgKi8KLSAgICBhc193YXJuIChfKCJMaW5lIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZTsgbGluZSBudW1iZXIgJWQgcmVqZWN0ZWQuIiksIGwrMSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCBsKTsKLSNpZmRlZiBMSVNUSU5HCi0gICAgICBpZiAobGlzdGluZykKLQlsaXN0aW5nX3NvdXJjZV9saW5lIChsKTsKLSNlbmRpZgotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuZW5kIHBzZXVkby1vcC4gIEFjdHVhbGx5LCB0aGUgcmVhbCB3b3JrIGlzIGRvbmUgaW4KLSAgIHJlYWRfYV9zb3VyY2VfZmlsZS4gICovCi0KLXZvaWQKLXNfZW5kIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIC8qIFRoZSBNUkkgYXNzZW1ibGVyIHBlcm1pdHMgdGhlIHN0YXJ0IHN5bWJvbCB0byBmb2xsb3cgLmVuZCwKLSAgICAgICAgIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQuICAqLwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcqJwotCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIScpCi0JYXNfd2FybiAoXygic3RhcnQgYWRkcmVzcyBub3Qgc3VwcG9ydGVkIikpOwotICAgIH0KLX0KLQotLyogSGFuZGxlIHRoZSAuZXJyIHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfZXJyIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYXNfYmFkIChfKCIuZXJyIGVuY291bnRlcmVkIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBmYWlsIHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfZmFpbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIG9mZnNldFQgdGVtcDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICh0ZW1wID49IDUwMCkKLSAgICBhc193YXJuIChfKCIuZmFpbCAlbGQgZW5jb3VudGVyZWQiKSwgKGxvbmcpIHRlbXApOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCIuZmFpbCAlbGQgZW5jb3VudGVyZWQiKSwgKGxvbmcpIHRlbXApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi12b2lkIAotc19maWxsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZXhwcmVzc2lvblMgcmVwX2V4cDsKLSAgbG9uZyBzaXplID0gMTsKLSAgcmVnaXN0ZXIgbG9uZyBmaWxsID0gMDsKLSAgY2hhciAqcDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uICgmcmVwX2V4cCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIEJTRCA0LjIgQVMsIG5vdCBmb3IgYW55IHJhdGlvbmFsIHJlYXNvbi4gICovCi0jZGVmaW5lIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCAoOCkKLSAgaWYgKHNpemUgPiBCU0RfRklMTF9TSVpFX0NST0NLXzgpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmZpbGwgc2l6ZSBjbGFtcGVkIHRvICVkLiIpLCBCU0RfRklMTF9TSVpFX0NST0NLXzgpOwotICAgICAgc2l6ZSA9IEJTRF9GSUxMX1NJWkVfQ1JPQ0tfODsKLSAgICB9Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJTaXplIG5lZ2F0aXZlOiAuZmlsbCBpZ25vcmVkLiIpKTsKLSAgICAgIHNpemUgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAocmVwX2V4cC5YX29wID09IE9fY29uc3RhbnQgJiYgcmVwX2V4cC5YX2FkZF9udW1iZXIgPD0gMCkKLSAgICB7Ci0gICAgICBpZiAocmVwX2V4cC5YX2FkZF9udW1iZXIgPCAwKQotCWFzX3dhcm4gKF8oIlJlcGVhdCA8IDAsIC5maWxsIGlnbm9yZWQiKSk7Ci0gICAgICBzaXplID0gMDsKLSAgICB9Ci0KLSAgaWYgKHNpemUgJiYgIW5lZWRfcGFzc18yKQotICAgIHsKLSAgICAgIGlmIChyZXBfZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBwID0gZnJhZ192YXIgKHJzX2ZpbGwsIChpbnQpIHNpemUsIChpbnQpIHNpemUsCi0JCQkocmVsYXhfc3Vic3RhdGVUKSAwLCAoc3ltYm9sUyAqKSAwLAotCQkJKG9mZnNldFQpIHJlcF9leHAuWF9hZGRfbnVtYmVyLAotCQkJKGNoYXIgKikgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGRvbid0IGhhdmUgYSBjb25zdGFudCByZXBlYXQgY291bnQsIHNvIHdlIGNhbid0IHVzZQotCSAgICAgcnNfZmlsbC4gIFdlIGNhbiBnZXQgdGhlIHNhbWUgcmVzdWx0cyBvdXQgb2YgcnNfc3BhY2UsCi0JICAgICBidXQgaXRzIGFyZ3VtZW50IGlzIGluIGJ5dGVzLCBzbyB3ZSBtdXN0IG11bHRpcGx5IHRoZQotCSAgICAgcmVwZWF0IGNvdW50IGJ5IHNpemUuICAqLwotCi0JICBzeW1ib2xTICpyZXBfc3ltOwotCSAgcmVwX3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZyZXBfZXhwKTsKLQkgIGlmIChzaXplICE9IDEpCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUyBzaXplX2V4cDsKLQkgICAgICBzaXplX2V4cC5YX29wID0gT19jb25zdGFudDsKLQkgICAgICBzaXplX2V4cC5YX2FkZF9udW1iZXIgPSBzaXplOwotCi0JICAgICAgcmVwX2V4cC5YX29wID0gT19tdWx0aXBseTsKLQkgICAgICByZXBfZXhwLlhfYWRkX3N5bWJvbCA9IHJlcF9zeW07Ci0JICAgICAgcmVwX2V4cC5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZzaXplX2V4cCk7Ci0JICAgICAgcmVwX2V4cC5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIHJlcF9zeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmcmVwX2V4cCk7Ci0JICAgIH0KLQotCSAgcCA9IGZyYWdfdmFyIChyc19zcGFjZSwgKGludCkgc2l6ZSwgKGludCkgc2l6ZSwKLQkJCShyZWxheF9zdWJzdGF0ZVQpIDAsIHJlcF9zeW0sIChvZmZzZXRUKSAwLCAoY2hhciAqKSAwKTsKLQl9Ci0gICAgICBtZW1zZXQgKHAsIDAsICh1bnNpZ25lZCBpbnQpIHNpemUpOwotICAgICAgLyogVGhlIG1hZ2ljIG51bWJlciBCU0RfRklMTF9TSVpFX0NST0NLXzQgaXMgZnJvbSBCU0QgNC4yIFZBWAotICAgICAgICogZmxhdm91cmVkIEFTLiAgVGhlIGZvbGxvd2luZyBiaXp6YXJlIGJlaGF2aW91ciBpcyB0byBiZQotICAgICAgICogY29tcGF0aWJsZSB3aXRoIGFib3ZlLiAgSSBndWVzcyB0aGV5IHRyaWVkIHRvIHRha2UgdXAgdG8gOAotICAgICAgICogYnl0ZXMgZnJvbSBhIDQtYnl0ZSBleHByZXNzaW9uIGFuZCB0aGV5IGZvcmdvdCB0byBzaWduCi0gICAgICAgKiBleHRlbmQuIFVuKnggU3V4LiAqLwotI2RlZmluZSBCU0RfRklMTF9TSVpFX0NST0NLXzQgKDQpCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGZpbGwsCi0JCQkgIChzaXplID4gQlNEX0ZJTExfU0laRV9DUk9DS180Ci0JCQkgICA/IEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNAotCQkJICAgOiAoaW50KSBzaXplKSk7Ci0gICAgICAvKiBOb3RlOiAuZmlsbCAoKSwwIGVtaXRzIG5vIGZyYWcgKHNpbmNlIHdlIGFyZSBhc2tlZCB0byAuZmlsbCAwIGJ5dGVzKQotICAgICAgICogYnV0IGVtaXRzIG5vIGVycm9yIG1lc3NhZ2UgYmVjYXVzZSBpdCBzZWVtcyBhIGxlZ2FsIHRoaW5nIHRvIGRvLgotICAgICAgICogSXQgaXMgYSBkZWdlbmVyYXRlIGNhc2Ugb2YgLmZpbGwgYnV0IGNvdWxkIGJlIGVtaXR0ZWQgYnkgYSBjb21waWxlci4KLSAgICAgICAqLwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZCAKLXNfZ2xvYmwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBJUlAgYW5kIElSUEMgcHNldWRvLW9wcy4gICovCi0KLXZvaWQKLXNfaXJwIChpcnBjKQotICAgICBpbnQgaXJwYzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHNiIHM7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgc2Igb3V0OwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIHNiX25ldyAoJnMpOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgc2JfYWRkX2NoYXIgKCZzLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCi0gIHNiX25ldyAoJm91dCk7Ci0KLSAgZXJyID0gZXhwYW5kX2lycCAoaXJwYywgMCwgJnMsICZvdXQsIGdldF9saW5lX3NiLCAnXDAnKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgIiVzIiwgZXJyKTsKLQotICBzYl9raWxsICgmcyk7Ci0KLSAgaW5wdXRfc2NydWJfaW5jbHVkZV9zYiAoJm91dCwgaW5wdXRfbGluZV9wb2ludGVyLCAxKTsKLSAgc2Jfa2lsbCAoJm91dCk7Ci0gIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLX0KLQotLyogSGFuZGxlIHRoZSAubGlua29uY2UgcHNldWRvLW9wLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIG1hcmsKLSAgIHRoZSBzZWN0aW9uIHRvIG9ubHkgYmUgbGlua2VkIG9uY2UuICBIb3dldmVyLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQKLSAgIGJ5IG1vc3Qgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIFRoaXMgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQsCi0gICB3aGljaCBpcyB3aGF0IHRvIGRvIGFib3V0IGR1cGxpY2F0ZXMuICAqLwotCi12b2lkCi1zX2xpbmtvbmNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZW51bSBsaW5rb25jZV90eXBlIHR5cGU7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIHR5cGUgPSBMSU5LT05DRV9ESVNDQVJEOwotCi0gIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciBjOwotCi0gICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKHMsICJkaXNjYXJkIikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfRElTQ0FSRDsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJvbmVfb25seSIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX09ORV9PTkxZOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAocywgInNhbWVfc2l6ZSIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX1NBTUVfU0laRTsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJzYW1lX2NvbnRlbnRzIikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfU0FNRV9DT05URU5UUzsKLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgLmxpbmtvbmNlIHR5cGUgYCVzJyIpLCBzKTsKLQotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0jaWZkZWYgb2JqX2hhbmRsZV9saW5rX29uY2UKLSAgb2JqX2hhbmRsZV9saW5rX29uY2UgKHR5cGUpOwotI2Vsc2UgLyogISBkZWZpbmVkIChvYmpfaGFuZGxlX2xpbmtfb25jZSkgKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHsKLSAgICBmbGFnd29yZCBmbGFnczsKLQotICAgIGlmICgoYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KSAmIFNFQ19MSU5LX09OQ0UpID09IDApCi0gICAgICBhc193YXJuIChfKCIubGlua29uY2UgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSk7Ci0KLSAgICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKTsKLSAgICBmbGFncyB8PSBTRUNfTElOS19PTkNFOwotICAgIHN3aXRjaCAodHlwZSkKLSAgICAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0JYWJvcnQgKCk7Ci0gICAgICBjYXNlIExJTktPTkNFX0RJU0NBUkQ6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotCWJyZWFrOwotICAgICAgY2FzZSBMSU5LT05DRV9PTkVfT05MWToKLQlmbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOwotCWJyZWFrOwotICAgICAgY2FzZSBMSU5LT05DRV9TQU1FX1NJWkU6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIExJTktPTkNFX1NBTUVfQ09OVEVOVFM6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOwotCWJyZWFrOwotICAgICAgfQotICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnLCBmbGFncykpCi0gICAgICBhc19iYWQgKF8oImJmZF9zZXRfc2VjdGlvbl9mbGFnczogJXMiKSwKLQkgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIH0KLSNlbHNlIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KLSAgYXNfd2FybiAoXygiLmxpbmtvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKG9ial9oYW5kbGVfbGlua19vbmNlKSAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIAotc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIGJ5dGVzX3ApCi0gICAgIC8qIDEgaWYgdGhpcyB3YXMgYSAiLmJzcyIgZGlyZWN0aXZlLCB3aGljaCBtYXkgcmVxdWlyZSBhIDNyZCBhcmd1bWVudAotCShhbGlnbm1lbnQpOyAwIGlmIGl0IHdhcyBhbiAiLmxjb21tIiAoMiBhcmdzIG9ubHkpICAqLwotICAgICBpbnQgbmVlZHNfYWxpZ247Ci0gICAgIC8qIDEgaWYgdGhlIGFsaWdubWVudCB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGJ5dGUgYm91bmRhcnksCi0JcmF0aGVyIHRoYW4gdGhlIHBvd2VyIG9mIDIuICovCi0gICAgIGludCBieXRlc19wOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIGNvbnN0IGludCBtYXhfYWxpZ25tZW50ID0gMTU7Ci0gIGludCBhbGlnbiA9IDA7Ci0gIHNlZ1QgYnNzX3NlZyA9IGJzc19zZWN0aW9uOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgLyogQWNjZXB0IGFuIG9wdGlvbmFsIGNvbW1hIGFmdGVyIHRoZSBuYW1lLiAgVGhlIGNvbW1hIHVzZWQgdG8gYmUKLSAgICAgcmVxdWlyZWQsIGJ1dCBJcml4IDUgY2MgZG9lcyBub3QgZ2VuZXJhdGUgaXQuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoVENfTUlQUykgfHwgZGVmaW5lZCAoVENfQUxQSEEpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIC8qIEZvciBNSVBTIGFuZCBBbHBoYSBFQ09GRiBvciBFTEYsIHNtYWxsIG9iamVjdHMgYXJlIHB1dCBpbiAuc2Jzcy4gICovCi0gICAgICBpZiAodGVtcCA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCi0JewotCSAgYnNzX3NlZyA9IHN1YnNlZ19uZXcgKCIuc2JzcyIsIDEpOwotCSAgc2VnX2luZm8gKGJzc19zZWcpLT5ic3MgPSAxOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBic3Nfc2VnLCBTRUNfQUxMT0MpKQotCSAgICBhc193YXJuIChfKCJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIi5zYnNzXCI6ICVzIiksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotI2VuZGlmCi0JfQotICAgIH0KLSNlbmRpZgotCi0gICBpZiAoIW5lZWRzX2FsaWduKQotICAgICB7Ci0gICAgICAgVENfSU1QTElDSVRfTENPTU1fQUxJR05NRU5UICh0ZW1wLCBhbGlnbik7Ci0KLSAgICAgICAvKiBTdGlsbCB6ZXJvIHVubGVzcyBUQ19JTVBMSUNJVF9MQ09NTV9BTElHTk1FTlQgc2V0IGl0LiAgKi8KLSAgICAgICBpZiAoYWxpZ24pCi0gICAgICAgICByZWNvcmRfYWxpZ25tZW50KGJzc19zZWcsIGFsaWduKTsKLSAgICAgfQotCi0gIGlmIChuZWVkc19hbGlnbikKLSAgICB7Ci0gICAgICBhbGlnbiA9IDA7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JewotCSAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzaXplIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JewotCSAgYXNfYmFkIChfKCJNaXNzaW5nIGFsaWdubWVudCIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKGJ5dGVzX3ApCi0JewotCSAgLyogQ29udmVydCB0byBhIHBvd2VyIG9mIDIuICAqLwotCSAgaWYgKGFsaWduICE9IDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgICAgIGZvciAoaSA9IDA7IChhbGlnbiAmIDEpID09IDA7IGFsaWduID4+PSAxLCArK2kpCi0JCTsKLQkgICAgICBpZiAoYWxpZ24gIT0gMSkKLQkJYXNfYmFkIChfKCJBbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgICAgICBhbGlnbiA9IGk7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotCXsKLQkgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLQkgIGFzX3dhcm4gKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkLiIpLCBhbGlnbik7Ci0JfQotICAgICAgZWxzZSBpZiAoYWxpZ24gPCAwKQotCXsKLQkgIGFsaWduID0gMDsKLQkgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZS4gMCBhc3N1bWVkLiIpKTsKLQl9Ci0gICAgICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VnLCBhbGlnbik7Ci0gICAgfQkJCQkvKiBpZiBuZWVkcyBhbGlnbiAqLwotICBlbHNlCi0gICAgewotICAgICAgLyogQXNzdW1lIHNvbWUgb2JqZWN0cyBtYXkgcmVxdWlyZSBhbGlnbm1lbnQgb24gc29tZSBzeXN0ZW1zLiAgKi8KLSNpZiBkZWZpbmVkIChUQ19BTFBIQSkgJiYgISBkZWZpbmVkIChWTVMpCi0gICAgICBpZiAodGVtcCA+IDEpCi0JewotCSAgYWxpZ24gPSBmZnMgKHRlbXApIC0gMTsKLQkgIGlmICh0ZW1wICUgKDEgPDwgYWxpZ24pKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLQotICBpZiAoCi0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfQU9VVCkgXAotICAgICB8fCBkZWZpbmVkIChPQkpfQk9VVCkgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0JPVVQpKQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0gICAgICAgfHwgKFNfR0VUX09USEVSIChzeW1ib2xQKSA9PSAwICYmIFNfR0VUX0RFU0MgKHN5bWJvbFApID09IDApKSAmJgotI2Vsc2UKLSAgICAgIChTX0dFVF9PVEhFUiAoc3ltYm9sUCkgPT0gMCAmJiBTX0dFVF9ERVNDIChzeW1ib2xQKSA9PSAwKSAmJgotI2VuZGlmCi0jZW5kaWYKLSAgICAgIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VnCi0gICAgICAgfHwgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSAwKSkpCi0gICAgewotICAgICAgY2hhciAqcGZyYWc7Ci0KLSAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWcsIDEpOwotCi0gICAgICBpZiAoYWxpZ24pCi0JZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotCQkJCQkvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZwkqLwotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWcpCi0Jc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gTlVMTDsKLQotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0gICAgICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpMCwgc3ltYm9sUCwKLQkJCShvZmZzZXRUKSB0ZW1wLCAoY2hhciAqKSAwKTsKLSAgICAgICpwZnJhZyA9IDA7Ci0KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWcpOwotCi0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIC8qIFRoZSBzeW1ib2wgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHByZWNlZGluZwotICAgICAgICAgIi5nbG9ibCIgZGlyZWN0aXZlIC0tIGJlIGNhcmVmdWwgbm90IHRvIHN0ZXAgb24gc3RvcmFnZSBjbGFzcwotICAgICAgICAgaW4gdGhhdCBjYXNlLiAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gc3RhdGljLiAqLwotICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApICE9IENfRVhUKQotCXsKLQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU1RBVCk7Ci0JfQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSNpZmRlZiBTX1NFVF9TSVpFCi0gICAgICBTX1NFVF9TSVpFIChzeW1ib2xQLCB0ZW1wKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfbGNvbW1faW50ZXJuYWwoKSAqLwotCi12b2lkCi1zX2xjb21tIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotICBzX2xjb21tX2ludGVybmFsIChuZWVkc19hbGlnbiwgMCk7Ci19Ci0KLXZvaWQgc19sY29tbV9ieXRlcyAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSAgc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIDEpOwotfQotCi12b2lkIAotc19sc3ltIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogd2UgcGVybWl0IEFOWSBkZWZpbmVkIGV4cHJlc3Npb246IEJTRDQuMiBkZW1hbmRzIGNvbnN0YW50cyAqLwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKnAgPSAwOwotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICAmJiBleHAuWF9vcCAhPSBPX3JlZ2lzdGVyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIGV4cHJlc3Npb24iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgLyogRklYTUUtU09PTiBJIHB1bGxlZCBhICgmJiBzeW1ib2xQLT5zeV9vdGhlciA9PSAwICYmCi0gICAgIHN5bWJvbFAtPnN5X2Rlc2MgPT0gMCkgb3V0IG9mIHRoaXMgdGVzdCBiZWNhdXNlIGNvZmYgZG9lc24ndCBoYXZlCi0gICAgIHRob3NlIGZpZWxkcywgYW5kIEkgY2FuJ3Qgc2VlIHdoZW4gdGhleSdkIGV2ZXIgYmUgdHJpcHBlZC4gIEkKLSAgICAgZG9uJ3QgdGhpbmsgSSB1bmRlcnN0YW5kIHdoeSB0aGV5IHdlcmUgaGVyZSBzbyBJIG1heSBoYXZlCi0gICAgIGludHJvZHVjZWQgYSBidWcuIEFzIHJlY2VudGx5IGFzIDEuMzcgZGlkbid0IGhhdmUgdGhpcyB0ZXN0Ci0gICAgIGFueXdheS4gIHhveG9yaWNoLiAqLwotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB1bmRlZmluZWRfc2VjdGlvbgotICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IDApCi0gICAgewotICAgICAgLyogVGhlIG5hbWUgbWlnaHQgYmUgYW4gdW5kZWZpbmVkIC5nbG9iYWwgc3ltYm9sOyBiZSBzdXJlIHRvCi0JIGtlZXAgdGhlICJleHRlcm5hbCIgYml0LiAqLwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwKLQkJICAgICAoZXhwLlhfb3AgPT0gT19jb25zdGFudAotCQkgICAgICA/IGFic29sdXRlX3NlY3Rpb24KLQkJICAgICAgOiByZWdfc2VjdGlvbikpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiU3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZCIpLCBuYW1lKTsKLSAgICB9Ci0gICpwID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19sc3ltKCkgKi8KLQotLyogUmVhZCBhIGxpbmUgaW50byBhbiBzYi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9saW5lX3NiIChsaW5lKQotICAgICBzYiAqbGluZTsKLXsKLSAgY2hhciBxdW90ZTEsIHF1b3RlMiwgaW5xdW90ZTsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9PSAnXG4nKQotICAgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyID49IGJ1ZmZlcl9saW1pdCkKLSAgICB7Ci0gICAgICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBpZiAoYnVmZmVyX2xpbWl0ID09IDApCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIElmIGFwcC5jIHNldHMgYW55IG90aGVyIGNoYXJhY3RlcnMgdG8gTEVYX0lTX1NUUklOR1FVT1RFLCB0aGlzCi0gICAgIGNvZGUgbmVlZHMgdG8gYmUgY2hhbmdlZC4gICovCi0gIGlmICghIGZsYWdfbTY4a19tcmkpCi0gICAgcXVvdGUxID0gJyInOwotICBlbHNlCi0gICAgcXVvdGUxID0gJ1wwJzsKLQotICBxdW90ZTIgPSAnXDAnOwotICBpZiAoZmxhZ19tNjhrX21yaSkKLSAgICBxdW90ZTIgPSAnXCcnOwotI2lmZGVmIExFWF9JU19TVFJJTkdRVU9URQotICBxdW90ZTIgPSAnXCcnOwotI2VuZGlmCi0KLSAgaW5xdW90ZSA9ICdcMCc7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCSB8fCAoaW5xdW90ZSAhPSAnXDAnICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1xuJykpCi0gICAgewotICAgICAgaWYgKGlucXVvdGUgPT0gKmlucHV0X2xpbmVfcG9pbnRlcikKLQlpbnF1b3RlID0gJ1wwJzsKLSAgICAgIGVsc2UgaWYgKGlucXVvdGUgPT0gJ1wwJykKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSBxdW90ZTEpCi0JICAgIGlucXVvdGUgPSBxdW90ZTE7Ci0JICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09IHF1b3RlMikKLQkgICAgaW5xdW90ZSA9IHF1b3RlMjsKLQl9Ci0gICAgICBzYl9hZGRfY2hhciAobGluZSwgKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKLSAgICB9Ci0gIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQKLQkgJiYgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcbicpCi0JYnVtcF9saW5lX2NvdW50ZXJzICgpOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotLyogRGVmaW5lIGEgbWFjcm8uICBUaGlzIGlzIGFuIGludGVyZmFjZSB0byBtYWNyby5jLCB3aGljaCBpcyBzaGFyZWQKLSAgIGJldHdlZW4gZ2FzIGFuZCBnYXNwLiAgKi8KLQotdm9pZAotc19tYWNybyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICBzYiBzOwotICBzYiBsYWJlbDsKLSAgY29uc3QgY2hhciAqZXJyOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIHNiX25ldyAoJnMpOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgc2JfYWRkX2NoYXIgKCZzLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCi0gIHNiX25ldyAoJmxhYmVsKTsKLSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLSAgICBzYl9hZGRfc3RyaW5nICgmbGFiZWwsIFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKTsKLQotICBlcnIgPSBkZWZpbmVfbWFjcm8gKDAsICZzLCAmbGFiZWwsIGdldF9saW5lX3NiLCAmbmFtZSk7Ci0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsICIlcyIsIGVycik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCXsKLQkgIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIHVuZGVmaW5lZF9zZWN0aW9uKTsKLQkgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCAwKTsKLQkgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQl9Ci0KLSAgICAgIGlmICgoKE5PX1BTRVVET19ET1QgfHwgZmxhZ19tNjhrX21yaSkKLQkgICAmJiBoYXNoX2ZpbmQgKHBvX2hhc2gsIG5hbWUpICE9IE5VTEwpCi0JICB8fCAoISBmbGFnX202OGtfbXJpCi0JICAgICAgJiYgKm5hbWUgPT0gJy4nCi0JICAgICAgJiYgaGFzaF9maW5kIChwb19oYXNoLCBuYW1lICsgMSkgIT0gTlVMTCkpCi0JYXNfd2FybiAoXygiYXR0ZW1wdCB0byByZWRlZmluZSBwc2V1ZG8tb3AgYCVzJyBpZ25vcmVkIiksCi0JCSBuYW1lKTsKLSAgICB9Ci0KLSAgc2Jfa2lsbCAoJnMpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5tZXhpdCBwc2V1ZG8tb3AsIHdoaWNoIGltbWVkaWF0ZWx5IGV4aXRzIGEgbWFjcm8KLSAgIGV4cGFuc2lvbi4gICovCi0KLXZvaWQKLXNfbWV4aXQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjb25kX2V4aXRfbWFjcm8gKG1hY3JvX25lc3QpOwotICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci19Ci0KLS8qIFN3aXRjaCBpbiBhbmQgb3V0IG9mIE1SSSBtb2RlLiAgKi8KLQotdm9pZAotc19tcmkgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgb24sIG9sZF9mbGFnOwotCi0gIG9uID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIG9sZF9mbGFnID0gZmxhZ19tcmk7Ci0gIGlmIChvbiAhPSAwKQotICAgIHsKLSAgICAgIGZsYWdfbXJpID0gMTsKLSNpZmRlZiBUQ19NNjhLCi0gICAgICBmbGFnX202OGtfbXJpID0gMTsKLSNlbmRpZgotICAgICAgbWFjcm9fbXJpX21vZGUgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZsYWdfbXJpID0gMDsKLSNpZmRlZiBUQ19NNjhLCi0gICAgICBmbGFnX202OGtfbXJpID0gMDsKLSNlbmRpZgotICAgICAgbWFjcm9fbXJpX21vZGUgKDApOwotICAgIH0KLQotICAvKiBPcGVyYXRvciBwcmVjZWRlbmNlIGNoYW5nZXMgaW4gbTY4ayBNUkkgbW9kZSwgc28gd2UgbmVlZCB0bwotICAgICB1cGRhdGUgdGhlIG9wZXJhdG9yIHJhbmtpbmdzLiAgKi8KLSAgZXhwcl9zZXRfcHJlY2VkZW5jZSAoKTsKLQotI2lmZGVmIE1SSV9NT0RFX0NIQU5HRQotICBpZiAob24gIT0gb2xkX2ZsYWcpCi0gICAgTVJJX01PREVfQ0hBTkdFIChvbik7Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgY2hhbmdpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZG9fb3JnIChzZWdtZW50LCBleHAsIGZpbGwpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50IGZpbGw7Ci17Ci0gIGlmIChzZWdtZW50ICE9IG5vd19zZWcgJiYgc2VnbWVudCAhPSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIGFzX2JhZCAoXygiaW52YWxpZCBzZWdtZW50IFwiJXNcIjsgc2VnbWVudCBcIiVzXCIgYXNzdW1lZCIpLAotCSAgICBzZWdtZW50X25hbWUgKHNlZ21lbnQpLCBzZWdtZW50X25hbWUgKG5vd19zZWcpKTsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChmaWxsICE9IDApCi0JYXNfd2FybiAoXygiaWdub3JpbmcgZmlsbCB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotICAgICAgaWYgKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIGFzX2JhZCAoXygib25seSBjb25zdGFudCBvZmZzZXRzIHN1cHBvcnRlZCBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotCSAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotCX0KLSAgICAgIGFic19zZWN0aW9uX29mZnNldCA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHAgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBleHAtPlhfYWRkX3N5bWJvbCwKLQkJICAgIGV4cC0+WF9hZGRfbnVtYmVyICogT0NURVRTX1BFUl9CWVRFLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgICpwID0gZmlsbDsKLSAgICB9Ci19Ci0KLXZvaWQgCi1zX29yZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgLyogVGhlIG02OGsgTVJJIGFzc2VtYmxlciBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBmb3IgLm9yZy4gIEl0Ci0gICAgIG1lYW5zIHRvIGNyZWF0ZSBhbiBhYnNvbHV0ZSBzZWN0aW9uIGF0IGEgZ2l2ZW4gYWRkcmVzcy4gIFdlIGNhbid0Ci0gICAgIHN1cHBvcnQgdGhhdC0tdXNlIGEgbGlua2VyIHNjcmlwdCBpbnN0ZWFkLiAgKi8KLSAgaWYgKGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJNUkkgc3R5bGUgT1JHIHBzZXVkby1vcCBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgYmVsaWV2ZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCU0QgNC4yIEFTLiAgVGhlcmUgaXMgbm8gc3VjaAotICAgICB0aGluZyBhcyBhIHN1Yi1zZWdtZW50LXJlbGF0aXZlIG9yaWdpbi4gIEFueSBhYnNvbHV0ZSBvcmlnaW4gaXMKLSAgICAgZ2l2ZW4gYSB3YXJuaW5nLCB0aGVuIGFzc3VtZWQgdG8gYmUgc2VnbWVudC1yZWxhdGl2ZS4gIEFueQotICAgICBzZWdtZW50ZWQgb3JpZ2luIGV4cHJlc3Npb24gKCJmb28rNDIiKSBoYWQgYmV0dGVyIGJlIGluIHRoZSByaWdodAotICAgICBzZWdtZW50IG9yIHRoZSAub3JnIGlzIGlnbm9yZWQuCi0KLSAgICAgQlNEIDQuMiBBUyB3YXJucyBpZiB5b3UgdHJ5IHRvIC5vcmcgYmFja3dhcmRzLiBXZSBjYW5ub3QgYmVjYXVzZQotICAgICB3ZSBuZXZlciBrbm93IHN1Yi1zZWdtZW50IHNpemVzIHdoZW4gd2UgYXJlIHJlYWRpbmcgY29kZS4gIEJTRAotICAgICB3aWxsIGNyYXNoIHRyeWluZyB0byBlbWl0IG5lZ2F0aXZlIG51bWJlcnMgb2YgZmlsbGVyIGJ5dGVzIGluCi0gICAgIGNlcnRhaW4gLm9yZ3MuIFdlIGRvbid0IGNyYXNoLCBidXQgc2VlIGFzLXdyaXRlIGZvciB0aGF0IGNvZGUuCi0KLSAgICAgRG9uJ3QgbWFrZSBmcmFnIGlmIG5lZWRfcGFzc18yPT0xLiAgKi8KLSAgc2VnbWVudCA9IGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXBfZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHRlbXBfZmlsbCA9IDA7Ci0KLSAgaWYgKCFuZWVkX3Bhc3NfMikKLSAgICBkb19vcmcgKHNlZ21lbnQsICZleHAsIHRlbXBfZmlsbCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19vcmcoKSAqLwotCi0vKiBIYW5kbGUgcGFyc2luZyBmb3IgdGhlIE1SSSBTRUNUL1NFQ1RJT04gcHNldWRvLW9wLiAgVGhpcyBzaG91bGQgYmUKLSAgIGNhbGxlZCBieSB0aGUgb2JqLWZvcm1hdCByb3V0aW5lIHdoaWNoIGhhbmRsZXMgc2VjdGlvbiBjaGFuZ2luZwotICAgd2hlbiBpbiBNUkkgbW9kZS4gIEl0IHdpbGwgY3JlYXRlIGEgbmV3IHNlY3Rpb24sIGFuZCByZXR1cm4gaXQuICBJdAotICAgd2lsbCBzZXQgKlRZUEUgdG8gdGhlIHNlY3Rpb24gdHlwZTogb25lIG9mICdDJyAoY29kZSksICdEJyAoZGF0YSksCi0gICAnTScgKG1peGVkKSwgb3IgJ1InIChyb21hYmxlKS4gIElmIEJGRF9BU1NFTUJMRVIgaXMgZGVmaW5lZCwgdGhlCi0gICBmbGFncyB3aWxsIGJlIHNldCBpbiB0aGUgc2VjdGlvbi4gICovCi0KLXZvaWQKLXNfbXJpX3NlY3QgKHR5cGUpCi0gICAgIGNoYXIgKnR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBUQ19NNjhLCi0KLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzZWdUIHNlZzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIAotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKm5hbWUpKQotICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotICAgIH0KLQotICBuYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgc2VnID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGludCBhbGlnbjsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2VnLCBhbGlnbik7Ci0gICAgfQotCi0gICp0eXBlID0gJ0MnOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgYyA9ICorK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgYyk7Ci0gICAgICBpZiAoYyA9PSAnQycgfHwgYyA9PSAnRCcgfHwgYyA9PSAnTScgfHwgYyA9PSAnUicpCi0JKnR5cGUgPSBjOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSIpKTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgewotCWZsYWd3b3JkIGZsYWdzOwotCi0JZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0JaWYgKCp0eXBlID09ICdDJykKLQkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERTsKLQllbHNlIGlmICgqdHlwZSA9PSAnRCcgfHwgKnR5cGUgPT0gJ00nKQotCSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBOwotCWVsc2UgaWYgKCp0eXBlID09ICdSJykKLQkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19SRUFET05MWSB8IFNFQ19ST007Ci0JaWYgKGZsYWdzICE9IFNFQ19OT19GTEFHUykKLQkgIHsKLQkgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywgZmxhZ3MpKQotCSAgICAgIGFzX3dhcm4gKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiKSwKLQkJICAgICAgIGJmZF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgc2VnKSwKLQkJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICAvKiBJZ25vcmUgdGhlIEhQIHR5cGUuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotI2Vsc2UgLyogISBUQ19NNjhLICovCi0jaWZkZWYgVENfSTk2MAotCi0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgc2VnVCBzZWc7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBuYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgc2VnID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgICp0eXBlID0gJ0MnOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqc2VjdHlwZTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzZWN0eXBlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKCpzZWN0eXBlID09ICdcMCcpCi0JKnR5cGUgPSAnQyc7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAidGV4dCIpID09IDApCi0JKnR5cGUgPSAnQyc7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAiZGF0YSIpID09IDApCi0JKnR5cGUgPSAnRCc7Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAicm9tZGF0YSIpID09IDApCi0JKnR5cGUgPSAnUic7Ci0gICAgICBlbHNlCi0JYXNfd2FybiAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSBgJXMnIiksIHNlY3R5cGUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBjaGFyICpzZWNjbWQ7Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc2VjY21kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKHNlY2NtZCwgImFic29sdXRlIikgPT0gMCkKLQl7Ci0JICBhc19iYWQgKF8oImFic29sdXRlIHNlY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHNlY2NtZCwgImFsaWduIikgPT0gMCkKLQl7Ci0JICBpbnQgYWxpZ247Ci0KLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIHJlY29yZF9hbGlnbm1lbnQgKHNlZywgYWxpZ24pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgc2VjdGlvbiBjb21tYW5kIGAlcyciKSwgc2VjY21kKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsJICAKLQotI2Vsc2UgLyogISBUQ19JOTYwICovCi0gIC8qIFRoZSBNUkkgYXNzZW1ibGVyIHNlZW1zIHRvIHVzZSBkaWZmZXJlbnQgZm9ybXMgb2YgLnNlY3QgZm9yCi0gICAgIGRpZmZlcmVudCB0YXJnZXRzLiAgKi8KLSAgYXNfYmFkICgiTVJJIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0YXJnZXQiKTsKLSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSNlbmRpZiAvKiAhIFRDX0k5NjAgKi8KLSNlbmRpZiAvKiAhIFRDX002OEsgKi8KLX0KLQotLyogSGFuZGxlIHRoZSAucHJpbnQgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19wcmludCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBsZW47Ci0KLSAgcyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLSAgcHJpbnRmICgiJXNcbiIsIHMpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5wdXJnZW0gcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19wdXJnZW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBkZWxldGVfbWFjcm8gKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnJlcHQgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19yZXB0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGNvdW50OwotCi0gIGNvdW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZG9fcmVwZWF0KGNvdW50LCAiUkVQVCIsICJFTkRSIik7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBnZW5lcmljIHJlcGVhdCBibG9jayBpbXBsZW1lbnRhdGlvbi4gICBJdCBhbGxvd3MKLSAgIGRpZmZlcmVudCBkaXJlY3RpdmVzIHRvIGJlIHVzZWQgYXMgdGhlIHN0YXJ0L2VuZCBrZXlzLiAqLwotCi12b2lkCi1kb19yZXBlYXQgKGNvdW50LCBzdGFydCwgZW5kKQotICAgICAgaW50IGNvdW50OwotICAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgICBjb25zdCBjaGFyICplbmQ7Ci17Ci0gIHNiIG9uZTsKLSAgc2IgbWFueTsKLQotICBzYl9uZXcgKCZvbmUpOwotICBpZiAoISBidWZmZXJfYW5kX25lc3QgKHN0YXJ0LCBlbmQsICZvbmUsIGdldF9saW5lX3NiKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIiVzIHdpdGhvdXQgJXMiKSwgc3RhcnQsIGVuZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNiX25ldyAoJm1hbnkpOwotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgc2JfYWRkX3NiICgmbWFueSwgJm9uZSk7Ci0KLSAgc2Jfa2lsbCAoJm9uZSk7Ci0KLSAgaW5wdXRfc2NydWJfaW5jbHVkZV9zYiAoJm1hbnksIGlucHV0X2xpbmVfcG9pbnRlciwgMSk7Ci0gIHNiX2tpbGwgKCZtYW55KTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQotCi0vKiBTa2lwIHRvIGVuZCBvZiBjdXJyZW50IHJlcGVhdCBsb29wOyBFWFRSQSBpbmRpY2F0ZXMgaG93IG1hbnkgYWRkaXRpb25hbAotICAgaW5wdXQgYnVmZmVycyB0byBza2lwLiAgQXNzdW1lcyB0aGF0IGNvbmRpdGlvbmFscyBwcmVjZWRpbmcgdGhlIGxvb3AgZW5kCi0gICBhcmUgcHJvcGVybHkgbmVzdGVkLiAKLQotICAgVGhpcyBmdW5jdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gaW1wbGVtZW50IGEgcHJlbWF0dXJlICJicmVhayIgb3V0IG9mIHRoZQotICAgbG9vcC4gIFRoZSBFWFRSQSBhcmcgYWNjb3VudHMgZm9yIG90aGVyIGJ1ZmZlcnMgd2UgbWlnaHQgaGF2ZSBpbnNlcnRlZCwKLSAgIHN1Y2ggYXMgbGluZSBzdWJzdGl0dXRpb25zLiAqLwotCi12b2lkCi1lbmRfcmVwZWF0IChleHRyYSkKLSAgaW50IGV4dHJhOwotewotICBjb25kX2V4aXRfbWFjcm8gKG1hY3JvX25lc3QpOwotICB3aGlsZSAoZXh0cmEtLSA+PSAwKQotICAgIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuZXF1LCAuZXF1aXYgYW5kIC5zZXQgZGlyZWN0aXZlcy4gIElmIEVRVUlWIGlzIDEsIHRoZW4KLSAgIHRoaXMgaXMgLmVxdWl2LCBhbmQgaXQgaXMgYW4gZXJyb3IgaWYgdGhlIHN5bWJvbCBpcyBhbHJlYWR5Ci0gICBkZWZpbmVkLiAgKi8KLQotdm9pZCAKLXNfc2V0IChlcXVpdikKLSAgICAgaW50IGVxdWl2OwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGRlbGltOwotICByZWdpc3RlciBjaGFyICplbmRfbmFtZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAvKgotICAgKiBFc3BlY2lhbCBhcG9sb2dpZXMgZm9yIHRoZSByYW5kb20gbG9naWM6Ci0gICAqIHRoaXMganVzdCBncmV3LCBhbmQgY291bGQgYmUgcGFyc2VkIG11Y2ggbW9yZSBzaW1wbHkhCi0gICAqIERlYW4gaW4gaGFzdGUuCi0gICAqLwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBkZWxpbSA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbmRfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmVuZF9uYW1lID0gZGVsaW07Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKmVuZF9uYW1lID0gMDsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAqZW5kX25hbWUgPSAwOwotCi0gIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdcMCcpCi0gICAgewotICAgICAgLyogVHVybiAnLiA9IG11bWJsZScgaW50byBhIC5vcmcgbXVtYmxlICovCi0gICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnQ7Ci0gICAgICBleHByZXNzaW9uUyBleHA7Ci0KLSAgICAgIHNlZ21lbnQgPSBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKCZleHApOwotCi0gICAgICBpZiAoIW5lZWRfcGFzc18yKQotCWRvX29yZyAoc2VnbWVudCwgJmV4cCwgMCk7Ci0KLSAgICAgICplbmRfbmFtZSA9IGRlbGltOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSkpID09IE5VTEwKLSAgICAgICYmIChzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkpID09IE5VTEwpCi0gICAgewotI2lmbmRlZiBOT19MSVNUSU5HCi0gICAgICAvKiBXaGVuIGRvaW5nIHN5bWJvbCBsaXN0aW5ncywgcGxheSBnYW1lcyB3aXRoIGR1bW15IGZyYWdtZW50cyBsaXZpbmcKLQkgb3V0c2lkZSB0aGUgbm9ybWFsIGZyYWdtZW50IGNoYWluIHRvIHJlY29yZCB0aGUgZmlsZSBhbmQgbGluZSBpbmZvCi0gICAgICAgICBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX1NZTUJPTFMpCi0JewotCSAgZXh0ZXJuIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICpsaXN0aW5nX3RhaWw7Ci0JICBmcmFnUyAqZHVtbXlfZnJhZyA9IChmcmFnUyAqKSB4bWFsbG9jIChzaXplb2YoZnJhZ1MpKTsKLQkgIG1lbXNldCAoZHVtbXlfZnJhZywgMCwgc2l6ZW9mKGZyYWdTKSk7Ci0JICBkdW1teV9mcmFnLT5mcl90eXBlID0gcnNfZmlsbDsKLQkgIGR1bW15X2ZyYWctPmxpbmUgPSBsaXN0aW5nX3RhaWw7Ci0JICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sIDAsIGR1bW15X2ZyYWcpOwotCSAgZHVtbXlfZnJhZy0+ZnJfc3ltYm9sID0gc3ltYm9sUDsKLQl9Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCQkJICAgIAotI2lmZGVmIE9CSl9DT0ZGCi0gICAgICAvKiAic2V0IiBzeW1ib2xzIGFyZSBsb2NhbCB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gKi8KLSAgICAgIFNGX1NFVF9MT0NBTCAoc3ltYm9sUCk7Ci0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotICAgIH0JCQkJLyogbWFrZSBhIG5ldyBzeW1ib2wgKi8KLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLQotICAqZW5kX25hbWUgPSBkZWxpbTsKLQotICBpZiAoZXF1aXYKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotICAgIGFzX2JhZCAoXygic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQotICBwc2V1ZG9fc2V0IChzeW1ib2xQKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19zZXQoKSAqLwotCi12b2lkIAotc19zcGFjZSAobXVsdCkKLSAgICAgaW50IG11bHQ7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgZXhwcmVzc2lvblMgdmFsOwotICBjaGFyICpwID0gMDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0gIGludCBieXRlczsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICAvKiBJbiBtNjhrIE1SSSBtb2RlLCB3ZSBuZWVkIHRvIGFsaWduIHRvIGEgd29yZCBib3VuZGFyeSwgdW5sZXNzCi0gICAgIHRoaXMgaXMgZHMuYi4gICovCi0gIGlmIChmbGFnX202OGtfbXJpICYmIG11bHQgPiAxKQotICAgIHsKLSAgICAgIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0JewotCSAgYWJzX3NlY3Rpb25fb2Zmc2V0ICs9IGFic19zZWN0aW9uX29mZnNldCAmIDE7Ci0JICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCSAgICBTX1NFVF9WQUxVRSAobGluZV9sYWJlbCwgYWJzX3NlY3Rpb25fb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotCXsKLQkgIHZhbHVlVCB2YWw7Ci0KLQkgIHZhbCA9IFNfR0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCk7Ci0JICBpZiAoKHZhbCAmIDEpICE9IDApCi0JICAgIHsKLQkgICAgICBTX1NFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wsIHZhbCArIDEpOwotCSAgICAgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JCXsKLQkJICBleHByZXNzaW9uUyAqc3ltZXhwOwotCi0JCSAgc3ltZXhwID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChsaW5lX2xhYmVsKTsKLQkJICBrbm93IChzeW1leHAtPlhfb3AgPT0gT19zeW1ib2wpOwotCQkgIGtub3cgKHN5bWV4cC0+WF9hZGRfc3ltYm9sID09IG1yaV9jb21tb25fc3ltYm9sKTsKLQkJICBzeW1leHAtPlhfYWRkX251bWJlciArPSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZG9fYWxpZ24gKDEsIChjaGFyICopIE5VTEwsIDAsIDApOwotCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgZnJhZ19ub3cpOwotCSAgICAgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCBmcmFnX25vd19maXggKCkpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBieXRlcyA9IG11bHQ7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBleHByZXNzaW9uICgmdmFsKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICB2YWwuWF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0KLSAgaWYgKHZhbC5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IHZhbC5YX2FkZF9udW1iZXIgPCAtIDB4ODAKLSAgICAgIHx8IHZhbC5YX2FkZF9udW1iZXIgPiAweGZmCi0gICAgICB8fCAobXVsdCAhPSAwICYmIG11bHQgIT0gMSAmJiB2YWwuWF9hZGRfbnVtYmVyICE9IDApKQotICAgIHsKLSAgICAgIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgdmFyaWFibGUgc2l6ZSBvciBmaWxsIHZhbHVlIikpOwotICAgICAgZWxzZQotCXsKLQkgIG9mZnNldFQgaTsKLQotCSAgaWYgKG11bHQgPT0gMCkKLQkgICAgbXVsdCA9IDE7Ci0JICBieXRlcyA9IG11bHQgKiBleHAuWF9hZGRfbnVtYmVyOwotCSAgZm9yIChpID0gMDsgaSA8IGV4cC5YX2FkZF9udW1iZXI7IGkrKykKLQkgICAgZW1pdF9leHByICgmdmFsLCBtdWx0KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgbG9uZyByZXBlYXQ7Ci0KLQkgIHJlcGVhdCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JICBpZiAobXVsdCkKLQkgICAgcmVwZWF0ICo9IG11bHQ7Ci0JICBieXRlcyA9IHJlcGVhdDsKLQkgIGlmIChyZXBlYXQgPD0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGZsYWdfbXJpKQotCQlhc193YXJuIChfKCIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIHplcm8sIGlnbm9yZWQiKSk7Ci0JICAgICAgZWxzZSBpZiAocmVwZWF0IDwgMCkKLQkJYXNfd2FybiAoXygiLnNwYWNlIHJlcGVhdCBjb3VudCBpcyBuZWdhdGl2ZSwgaWdub3JlZCIpKTsKLQkgICAgICBnb3RvIGdldG91dDsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIGp1c3QgYnVtcCB0aGUgb2Zmc2V0LiAgKi8KLQkgIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBhYnNfc2VjdGlvbl9vZmZzZXQgKz0gcmVwZWF0OwotCSAgICAgIGdvdG8gZ2V0b3V0OwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBzZWNyZXRseSBpbiBhbiBNUkkgY29tbW9uIHNlY3Rpb24sIHRoZW4KLQkgICAgIGNyZWF0aW5nIHNwYWNlIGp1c3QgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBjb21tb24KLQkgICAgIHN5bWJvbC4gICovCi0JICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIFNfU0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCwKLQkJCSAgIFNfR0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCkgKyByZXBlYXQpOwotCSAgICAgIGdvdG8gZ2V0b3V0OwotCSAgICB9Ci0KLQkgIGlmICghbmVlZF9wYXNzXzIpCi0JICAgIHAgPSBmcmFnX3ZhciAocnNfZmlsbCwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgKHN5bWJvbFMgKikgMCwKLQkJCSAgKG9mZnNldFQpIHJlcGVhdCwgKGNoYXIgKikgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInNwYWNlIGFsbG9jYXRpb24gdG9vIGNvbXBsZXggaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKLQkgICAgICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotCSAgICB9Ci0JICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBjb21tb24gc2VjdGlvbiIpKTsKLQkgICAgICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci0JICAgIH0KLQkgIGlmICghbmVlZF9wYXNzXzIpCi0JICAgIHAgPSBmcmFnX3ZhciAocnNfc3BhY2UsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsCi0JCQkgIG1ha2VfZXhwcl9zeW1ib2wgKCZleHApLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgMCk7Ci0JfQotCi0gICAgICBpZiAocCkKLQkqcCA9IHZhbC5YX2FkZF9udW1iZXI7Ci0gICAgfQotCi0gZ2V0b3V0OgotCi0gIC8qIEluIE1SSSBtb2RlLCBhZnRlciBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLCB3ZSBtdXN0IGFsaWduIHRvIGFuCi0gICAgIGV2ZW4gd29yZCBib3VuZGFyeSwgdW5sZXNzIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGEgZGMuYiwgZHMuYgotICAgICBvciBkY2IuYi4gICovCi0gIGlmIChmbGFnX21yaSAmJiAoYnl0ZXMgJiAxKSAhPSAwKQotICAgIG1yaV9wZW5kaW5nX2FsaWduID0gMTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotLyogVGhpcyBpcyBsaWtlIHNfc3BhY2UsIGJ1dCB0aGUgdmFsdWUgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2l0aAotICAgdGhlIGdpdmVuIHByZWNpc2lvbi4gIFRoaXMgaXMgZm9yIHRoZSBNUkkgZGNiLnMgcHNldWRvLW9wIGFuZAotICAgZnJpZW5kcy4gICovCi0KLXZvaWQKLXNfZmxvYXRfc3BhY2UgKGZsb2F0X3R5cGUpCi0gICAgIGludCBmbG9hdF90eXBlOwotewotICBvZmZzZXRUIGNvdW50OwotICBpbnQgZmxlbjsKLSAgY2hhciB0ZW1wW01BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVF07Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgY291bnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmFsdWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgaWYgKGZsYWdfbXJpKQotCW1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgLyogU2tpcCBhbnkgMHtsZXR0ZXJ9IHRoYXQgbWF5IGJlIHByZXNlbnQuICBEb24ndCBldmVuIGNoZWNrIGlmIHRoZQotICAgKiBsZXR0ZXIgaXMgbGVnYWwuICAqLwotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJwotICAgICAgJiYgaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclsxXSkpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgLyogQWNjZXB0IDp4eHh4LCB3aGVyZSB0aGUgeCdzIGFyZSBoZXggZGlnaXRzLCBmb3IgYSBmbG9hdGluZyBwb2ludAotICAgICB3aXRoIHRoZSBleGFjdCBkaWdpdHMgc3BlY2lmaWVkLiAgKi8KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnOicpCi0gICAgewotICAgICAgZmxlbiA9IGhleF9mbG9hdCAoZmxvYXRfdHlwZSwgdGVtcCk7Ci0gICAgICBpZiAoZmxlbiA8IDApCi0JewotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIGlmIChmbGFnX21yaSkKLQkgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmVycjsKLQotICAgICAgZXJyID0gbWRfYXRvZiAoZmxvYXRfdHlwZSwgdGVtcCwgJmZsZW4pOwotICAgICAga25vdyAoZmxlbiA8PSBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQpOwotICAgICAga25vdyAoZmxlbiA+IDApOwotICAgICAgaWYgKGVycikKLQl7Ci0JICBhc19iYWQgKF8oIkJhZCBmbG9hdGluZyBsaXRlcmFsOiAlcyIpLCBlcnIpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIGlmIChmbGFnX21yaSkKLQkgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICB3aGlsZSAoLS1jb3VudCA+PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHAgPSBmcmFnX21vcmUgKGZsZW4pOwotICAgICAgbWVtY3B5IChwLCB0ZW1wLCAodW5zaWduZWQgaW50KSBmbGVuKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnN0cnVjdCBwc2V1ZG8tb3AsIGFzIGZvdW5kIGluIE1JUFMgYXNzZW1ibGVycy4gICovCi0KLXZvaWQKLXNfc3RydWN0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLSAgYWJzX3NlY3Rpb25fb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19zZXQgKGFic29sdXRlX3NlY3Rpb24sIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLXZvaWQKLXNfdGV4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0jaWZkZWYgT0JKX1ZNUwotICBjb25zdF9mbGFnICY9IH5JTl9ERUZBVUxUX1NFQ1RJT047Ci0jZW5kaWYKLX0JCQkJLyogc190ZXh0KCkgKi8KLQwKLQotdm9pZCAKLWRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCkKLXsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICAvKiBSZXR1cm4gaGF2aW5nIGFscmVhZHkgc3dhbGxvd2VkIGVuZC1vZi1saW5lLiAqLwotfQkJCQkvKiBSZXR1cm4gcG9pbnRpbmcganVzdCBhZnRlciBlbmQtb2YtbGluZS4gKi8KLQotdm9pZAotaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKQkJLyogRm9yIHN1c3BlY3QgbGluZXM6IGdpdmVzIHdhcm5pbmcuICovCi17Ci0gIGlmICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChpc3ByaW50ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JYXNfYmFkIChfKCJSZXN0IG9mIGxpbmUgaWdub3JlZC4gRmlyc3QgaWdub3JlZCBjaGFyYWN0ZXIgaXMgYCVjJy4iKSwKLQkJKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJSZXN0IG9mIGxpbmUgaWdub3JlZC4gRmlyc3QgaWdub3JlZCBjaGFyYWN0ZXIgdmFsdWVkIDB4JXguIiksCi0JCSppbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdAotCSAgICAgJiYgIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQl9Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIFJldHVybiBwb2ludGluZyBqdXN0IGFmdGVyIGVuZC1vZi1saW5lLiAqLwotICBrbm93IChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWy0xXV0pOwotfQotCi12b2lkCi1kaXNjYXJkX3Jlc3Rfb2ZfbGluZSAoKQotewotICB3aGlsZSAoaW5wdXRfbGluZV9wb2ludGVyIDwgYnVmZmVyX2xpbWl0Ci0gICAgICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7ICAgICAgICAgLyogUmV0dXJuIHBvaW50aW5nIGp1c3QgYWZ0ZXIgZW5kLW9mLWxpbmUuICovCi0gIGtub3cgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdXSk7Ci19Ci0KLS8qCi0gKgkJCXBzZXVkb19zZXQoKQotICoKLSAqIEluOglQb2ludGVyIHRvIGEgc3ltYm9sLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT5leHByZXNzaW9uLgotICoKLSAqIE91dDoJSW5wdXRfbGluZV9wb2ludGVyLT5qdXN0IGFmdGVyIGFueSB3aGl0ZXNwYWNlIGFmdGVyIGV4cHJlc3Npb24uCi0gKglUcmllZCB0byBzZXQgc3ltYm9sIHRvIHZhbHVlIG9mIGV4cHJlc3Npb24uCi0gKglXaWxsIGNoYW5nZSBzeW1ib2xzIHR5cGUsIHZhbHVlLCBhbmQgZnJhZzsKLSAqLwotdm9pZAotcHNldWRvX3NldCAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGludCBleHQ7Ci0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQotICBrbm93IChzeW1ib2xQKTsJCS8qIE5VTEwgcG9pbnRlciBpcyBsb2dpYyBlcnJvci4gKi8KLSNpZiAoZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKSkgJiYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBleHQgPSBTX0lTX0VYVEVSTkFMIChzeW1ib2xQKTsKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCi0gICh2b2lkKSBleHByZXNzaW9uICgmZXhwKTsKLQotICBpZiAoZXhwLlhfb3AgPT0gT19pbGxlZ2FsKQotICAgIGFzX2JhZCAoXygiaWxsZWdhbCBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gIGVsc2UgaWYgKGV4cC5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gIGVsc2UgaWYgKGV4cC5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIGlmIChleHAuWF9hZGRfbnVtYmVyID4gMCkKLQlhc19iYWQgKF8oImJpZ251bSBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgIH0KLSAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19zdWJ0cmFjdAotCSAgICYmIChTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKQotCSAgICAgICA9PSBTX0dFVF9TRUdNRU5UIChleHAuWF9vcF9zeW1ib2wpKQotCSAgICYmIFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpKQotCSAgICYmIChzeW1ib2xfZ2V0X2ZyYWcgKGV4cC5YX2FkZF9zeW1ib2wpCi0JICAgICAgID09IHN5bWJvbF9nZXRfZnJhZyAoZXhwLlhfb3Bfc3ltYm9sKSkpCi0gICAgewotICAgICAgZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IChTX0dFVF9WQUxVRSAoZXhwLlhfYWRkX3N5bWJvbCkKLQkJCSAgLSBTX0dFVF9WQUxVRSAoZXhwLlhfb3Bfc3ltYm9sKSk7Ci0gICAgfQotCi0gIHN3aXRjaCAoZXhwLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgIGNhc2UgT19hYnNlbnQ6Ci0gICAgY2FzZSBPX2JpZzoKLSAgICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSNpZiAoZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKSkgJiYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICAgICAgaWYgKGV4dCkKLQlTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgICBlbHNlCi0JU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBleHAuWF9hZGRfbnVtYmVyKTsKLSAgICAgIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19yZWdpc3RlcjoKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHJlZ19zZWN0aW9uKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBleHAuWF9hZGRfbnVtYmVyKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbgotCSAgfHwgZXhwLlhfYWRkX251bWJlciAhPSAwKQotCXN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltYm9sUCwgJmV4cCk7Ci0gICAgICBlbHNlIGlmIChzeW1ib2xfc2VjdGlvbl9wIChzeW1ib2xQKSkKLQlhc19iYWQgKCJpbnZhbGlkIGF0dGVtcHQgdG8gc2V0IHZhbHVlIG9mIHNlY3Rpb24gc3ltYm9sIik7Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sUyAqcyA9IGV4cC5YX2FkZF9zeW1ib2w7Ci0KLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIFNfR0VUX1NFR01FTlQgKHMpKTsKLSNpZiAoZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKSkgJiYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotCSAgaWYgKGV4dCkKLQkgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgZWxzZQotCSAgICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsCi0JCSAgICAgICBleHAuWF9hZGRfbnVtYmVyICsgU19HRVRfVkFMVUUgKHMpKTsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgc3ltYm9sX2dldF9mcmFnIChzKSk7Ci0JICBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChzeW1ib2xQLCBzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBUaGUgdmFsdWUgaXMgc29tZSBjb21wbGV4IGV4cHJlc3Npb24uCi0JIEZJWE1FOiBTaG91bGQgd2Ugc2V0IHRoZSBzZWdtZW50IHRvIGFueXRoaW5nPyAgKi8KLSAgICAgIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltYm9sUCwgJmV4cCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKgotICoJCQljb25zKCkKLSAqCi0gKiBDT05TdHJ1Y3QgbW9yZSBmcmFnIG9mIC5ieXRlcywgb3IgLndvcmRzIGV0Yy4KLSAqIFNob3VsZCBuZWVkX3Bhc3NfMiBiZSAxIHRoZW4gZW1pdCBubyBmcmFnKHMpLgotICogVGhpcyB1bmRlcnN0YW5kcyBFWFBSRVNTSU9OUy4KLSAqCi0gKiBCdWcgKD8pCi0gKgotICogVGhpcyBoYXMgYSBzcGxpdCBwZXJzb25hbGl0eS4gV2UgdXNlIGV4cHJlc3Npb24oKSB0byByZWFkIHRoZQotICogdmFsdWUuIFdlIGNhbiBkZXRlY3QgaWYgdGhlIHZhbHVlIHdvbid0IGZpdCBpbiBhIGJ5dGUgb3Igd29yZC4KLSAqIEJ1dCB3ZSBjYW4ndCBkZXRlY3QgaWYgZXhwcmVzc2lvbigpIGRpc2NhcmRlZCBzaWduaWZpY2FudCBkaWdpdHMKLSAqIGluIHRoZSBjYXNlIG9mIGEgbG9uZy4gTm90IHdvcnRoIHRoZSBjcm9ja3MgcmVxdWlyZWQgdG8gZml4IGl0LgotICovCi0KLS8qIFNlbGVjdCBhIHBhcnNlciBmb3IgY29ucyBleHByZXNzaW9ucy4gICovCi0KLS8qIFNvbWUgdGFyZ2V0cyBuZWVkIHRvIHBhcnNlIHRoZSBleHByZXNzaW9uIGluIHZhcmlvdXMgZmFuY3kgd2F5cy4KLSAgIFlvdSBjYW4gZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiB0byBkbyB3aGF0ZXZlciB5b3UgbGlrZQotICAgKGZvciBleGFtcGxlLCB0aGUgSFBQQSBkb2VzIHRoaXMpLiAgT3RoZXJ3aXNlLCB5b3UgY2FuIGRlZmluZQotICAgQklURklFTERfQ09OU19FWFBSRVNTSU9OUyB0byBwZXJtaXQgYml0ZmllbGRzIHRvIGJlIHNwZWNpZmllZCwgb3IKLSAgIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TIHRvIHBlcm1pdCByZXBlYXQgY291bnRzLiAgSWYgbm9uZSBvZiB0aGVzZQotICAgYXJlIGRlZmluZWQsIHdoaWNoIGlzIHRoZSBub3JtYWwgY2FzZSwgdGhlbiBvbmx5IHNpbXBsZSBleHByZXNzaW9ucwotICAgYXJlIHBlcm1pdHRlZC4gICovCi0KLSNpZmRlZiBUQ19NNjhLCi1zdGF0aWMgdm9pZAotcGFyc2VfbXJpX2NvbnMgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotI2VuZGlmCi0KLSNpZm5kZWYgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCi0jaWZkZWYgQklURklFTERfQ09OU19FWFBSRVNTSU9OUwotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIHBhcnNlX2JpdGZpZWxkX2NvbnMgKEVYUCwgTkJZVEVTKQotc3RhdGljIHZvaWQgCi1wYXJzZV9iaXRmaWVsZF9jb25zIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHAsIHVuc2lnbmVkIGludCBuYnl0ZXMpKTsKLSNlbmRpZgotI2lmZGVmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgcGFyc2VfcmVwZWF0X2NvbnMgKEVYUCwgTkJZVEVTKQotc3RhdGljIHZvaWQKLXBhcnNlX3JlcGVhdF9jb25zIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHAsIHVuc2lnbmVkIGludCBuYnl0ZXMpKTsKLSNlbmRpZgotCi0vKiBJZiB3ZSBoYXZlbid0IGdvdHRlbiBvbmUgeWV0LCBqdXN0IGNhbGwgZXhwcmVzc2lvbi4gICovCi0jaWZuZGVmIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTgotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIGV4cHJlc3Npb24gKEVYUCkKLSNlbmRpZgotI2VuZGlmCi0KLS8qIHdvcmtlciB0byBkbyAuYnl0ZSBldGMgc3RhdGVtZW50cyAqLwotLyogY2xvYmJlcnMgaW5wdXRfbGluZV9wb2ludGVyLCBjaGVja3MgKi8KLS8qIGVuZC1vZi1saW5lLiAqLwotc3RhdGljIHZvaWQgCi1jb25zX3dvcmtlciAobmJ5dGVzLCBydmEpCi0gICAgIHJlZ2lzdGVyIGludCBuYnl0ZXM7CS8qIDE9LmJ5dGUsIDI9LndvcmQsIDQ9LmxvbmcgKi8KLSAgICAgaW50IHJ2YTsKLXsKLSAgaW50IGM7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmIChmbGFnX21yaSkKLQltcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9jb25zX2FsaWduCi0gIG1kX2NvbnNfYWxpZ24gKG5ieXRlcyk7Ci0jZW5kaWYKLQotICBjID0gMDsKLSAgZG8KLSAgICB7Ci0jaWZkZWYgVENfTTY4SwotICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JcGFyc2VfbXJpX2NvbnMgKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04gKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7Ci0KLSAgICAgIGlmIChydmEpCi0JewotCSAgaWYgKGV4cC5YX29wID09IE9fc3ltYm9sKQotCSAgICBleHAuWF9vcCA9IE9fc3ltYm9sX3J2YTsKLQkgIGVsc2UKLQkgICAgYXNfZmF0YWwgKF8oInJ2YSB3aXRob3V0IHN5bWJvbCIpKTsKLQl9Ci0gICAgICBlbWl0X2V4cHIgKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7Ci0gICAgICArK2M7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgLyogSW4gTVJJIG1vZGUsIGFmdGVyIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsIHdlIG11c3QgYWxpZ24gdG8gYW4KLSAgICAgZXZlbiB3b3JkIGJvdW5kYXJ5LCB1bmxlc3MgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBkYy5iLCBkcy5iCi0gICAgIG9yIGRjYi5iLiAgKi8KLSAgaWYgKGZsYWdfbXJpICYmIG5ieXRlcyA9PSAxICYmIChjICYgMSkgIT0gMCkKLSAgICBtcmlfcGVuZGluZ19hbGlnbiA9IDE7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyLS07CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0KLXZvaWQKLWNvbnMgKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBjb25zX3dvcmtlciAoc2l6ZSwgMCk7Ci19Ci0KLXZvaWQgCi1zX3J2YSAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNvbnNfd29ya2VyIChzaXplLCAxKTsKLX0KLQotLyogUHV0IHRoZSBjb250ZW50cyBvZiBleHByZXNzaW9uIEVYUCBpbnRvIHRoZSBvYmplY3QgZmlsZSB1c2luZwotICAgTkJZVEVTIGJ5dGVzLiAgSWYgbmVlZF9wYXNzXzIgaXMgMSwgdGhpcyBkb2VzIG5vdGhpbmcuICAqLwotCi12b2lkCi1lbWl0X2V4cHIgKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotewotICBvcGVyYXRvclQgb3A7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHZhbHVlVCBleHRyYV9kaWdpdCA9IDA7Ci0KLSAgLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgYXJlIGdvaW5nIHRvIG1ha2UgYW5vdGhlciBwYXNzLiAgKi8KLSAgaWYgKG5lZWRfcGFzc18yKQotICAgIHJldHVybjsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0jaWZkZWYgT0JKX0VMRgotICAvKiBXaGVuIGdjYyBlbWl0cyBEV0FSRiAxIGRlYnVnZ2luZyBwc2V1ZG8tb3BzLCBhIGxpbmUgbnVtYmVyIHdpbGwKLSAgICAgYXBwZWFyIGFzIGEgZm91ciBieXRlIHBvc2l0aXZlIGNvbnN0YW50IGluIHRoZSAubGluZSBzZWN0aW9uLAotICAgICBmb2xsb3dlZCBieSBhIDIgYnl0ZSAweGZmZmYuICBMb29rIGZvciB0aGF0IGNhc2UgaGVyZS4gICovCi0gIHsKLSAgICBzdGF0aWMgaW50IGR3YXJmX2xpbmUgPSAtMTsKLQotICAgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIubGluZSIpICE9IDApCi0gICAgICBkd2FyZl9saW5lID0gLTE7Ci0gICAgZWxzZSBpZiAoZHdhcmZfbGluZSA+PSAwCi0JICAgICAmJiBuYnl0ZXMgPT0gMgotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIChleHAtPlhfYWRkX251bWJlciA9PSAtMSB8fCBleHAtPlhfYWRkX251bWJlciA9PSAweGZmZmYpKQotICAgICAgbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgZHdhcmZfbGluZSk7Ci0gICAgZWxzZSBpZiAobmJ5dGVzID09IDQKLQkgICAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAmJiBleHAtPlhfYWRkX251bWJlciA+PSAwKQotICAgICAgZHdhcmZfbGluZSA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgIGVsc2UKLSAgICAgIGR3YXJmX2xpbmUgPSAtMTsKLSAgfQotCi0gIC8qIFdoZW4gZ2NjIGVtaXRzIERXQVJGIDEgZGVidWdnaW5nIHBzZXVkby1vcHMsIGEgZmlsZSBuYW1lIHdpbGwKLSAgICAgYXBwZWFyIGFzIGEgMiBieXRlIFRBR19jb21waWxlX3VuaXQgKDB4MTEpIGZvbGxvd2VkIGJ5IGEgMiBieXRlCi0gICAgIEFUX3NpYmxpbmcgKDB4MTIpIGZvbGxvd2VkIGJ5IGEgZm91ciBieXRlIGFkZHJlc3Mgb2YgdGhlIHNpYmxpbmcKLSAgICAgZm9sbG93ZWQgYnkgYSAyIGJ5dGUgQVRfbmFtZSAoMHgzOCkgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlCi0gICAgIGZpbGUuICBXZSBsb29rIGZvciB0aGF0IGNhc2UgaGVyZS4gICovCi0gIHsKLSAgICBzdGF0aWMgaW50IGR3YXJmX2ZpbGUgPSAwOwotCi0gICAgaWYgKHN0cmNtcCAoc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5kZWJ1ZyIpICE9IDApCi0gICAgICBkd2FyZl9maWxlID0gMDsKLSAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDAKLQkgICAgICYmIG5ieXRlcyA9PSAyCi0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHgxMSkKLSAgICAgIGR3YXJmX2ZpbGUgPSAxOwotICAgIGVsc2UgaWYgKGR3YXJmX2ZpbGUgPT0gMQotCSAgICAgJiYgbmJ5dGVzID09IDIKLQkgICAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAweDEyKQotICAgICAgZHdhcmZfZmlsZSA9IDI7Ci0gICAgZWxzZSBpZiAoZHdhcmZfZmlsZSA9PSAyCi0JICAgICAmJiBuYnl0ZXMgPT0gNCkKLSAgICAgIGR3YXJmX2ZpbGUgPSAzOwotICAgIGVsc2UgaWYgKGR3YXJmX2ZpbGUgPT0gMwotCSAgICAgJiYgbmJ5dGVzID09IDIKLQkgICAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAweDM4KQotICAgICAgZHdhcmZfZmlsZSA9IDQ7Ci0gICAgZWxzZQotICAgICAgZHdhcmZfZmlsZSA9IDA7Ci0KLSAgICAvKiBUaGUgdmFyaWFibGUgZHdhcmZfZmlsZV9zdHJpbmcgdGVsbHMgc3RyaW5nZXIgdGhhdCB0aGUgc3RyaW5nCi0gICAgICAgbWF5IGJlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS4gICovCi0gICAgaWYgKGR3YXJmX2ZpbGUgPT0gNCkKLSAgICAgIGR3YXJmX2ZpbGVfc3RyaW5nID0gMTsKLSAgICBlbHNlCi0gICAgICBkd2FyZl9maWxlX3N0cmluZyA9IDA7Ci0gIH0KLSNlbmRpZgotI2VuZGlmCi0KLSAgaWYgKGNoZWNrX2VoX2ZyYW1lIChleHAsICZuYnl0ZXMpKQotICAgIHJldHVybjsKLQotICBvcCA9IGV4cC0+WF9vcDsKLQotICAvKiBBbGxvdyBgLndvcmQgMCcgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uICAqLwotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChvcCAhPSBPX2NvbnN0YW50IHx8IGV4cC0+WF9hZGRfbnVtYmVyICE9IDApCi0JYXNfYmFkIChfKCJhdHRlbXB0IHRvIHN0b3JlIHZhbHVlIGluIGFic29sdXRlIHNlY3Rpb24iKSk7Ci0gICAgICBhYnNfc2VjdGlvbl9vZmZzZXQgKz0gbmJ5dGVzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBIYW5kbGUgYSBuZWdhdGl2ZSBiaWdudW0uICAqLwotICBpZiAob3AgPT0gT191bWludXMKLSAgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDAKLSAgICAgICYmIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoZXhwLT5YX2FkZF9zeW1ib2wpLT5YX29wID09IE9fYmlnCi0gICAgICAmJiBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGV4cC0+WF9hZGRfc3ltYm9sKS0+WF9hZGRfbnVtYmVyID4gMCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgY2Fycnk7Ci0KLSAgICAgIGV4cCA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoZXhwLT5YX2FkZF9zeW1ib2wpOwotCi0gICAgICAvKiBOZWdhdGUgdGhlIGJpZ251bTogb25lJ3MgY29tcGxlbWVudCBlYWNoIGRpZ2l0IGFuZCBhZGQgMS4gICovCi0gICAgICBjYXJyeSA9IDE7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZXhwLT5YX2FkZF9udW1iZXI7IGkrKykKLQl7Ci0JICB1bnNpZ25lZCBsb25nIG5leHQ7Ci0KLQkgIG5leHQgPSAoKCh+IChnZW5lcmljX2JpZ251bVtpXSAmIExJVFRMRU5VTV9NQVNLKSkKLQkJICAgJiBMSVRUTEVOVU1fTUFTSykKLQkJICArIGNhcnJ5KTsKLQkgIGdlbmVyaWNfYmlnbnVtW2ldID0gbmV4dCAmIExJVFRMRU5VTV9NQVNLOwotCSAgY2FycnkgPSBuZXh0ID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQl9Ci0KLSAgICAgIC8qIFdlIGNhbiBpZ25vcmUgYW55IGNhcnJ5IG91dCwgYmVjYXVzZSBpdCB3aWxsIGJlIGhhbmRsZWQgYnkKLQkgZXh0cmFfZGlnaXQgaWYgaXQgaXMgbmVlZGVkLiAgKi8KLQotICAgICAgZXh0cmFfZGlnaXQgPSAodmFsdWVUKSAtMTsKLSAgICAgIG9wID0gT19iaWc7Ci0gICAgfQotCi0gIGlmIChvcCA9PSBPX2Fic2VudCB8fCBvcCA9PSBPX2lsbGVnYWwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiemVybyBhc3N1bWVkIGZvciBtaXNzaW5nIGV4cHJlc3Npb24iKSk7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX2JpZyAmJiBleHAtPlhfYWRkX251bWJlciA8PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fcmVnaXN0ZXIpCi0gICAgewotICAgICAgYXNfd2FybiAoXygicmVnaXN0ZXIgdmFsdWUgdXNlZCBhcyBleHByZXNzaW9uIikpOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLQotICBwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgLyogSWYgd2UgaGF2ZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiBhIHdvcmQsIHNhdmUgaXQgb24KLSAgICAgdGhlIGJyb2tlbl93b3JkcyBsaXN0LiAgU2VlIHRoZSBjb2RlIGluIHdyaXRlLmMuICAqLwotICBpZiAob3AgPT0gT19zdWJ0cmFjdCAmJiBuYnl0ZXMgPT0gMikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKng7Ci0KLSAgICAgIHggPSAoc3RydWN0IGJyb2tlbl93b3JkICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJyb2tlbl93b3JkKSk7Ci0gICAgICB4LT5uZXh0X2Jyb2tlbl93b3JkID0gYnJva2VuX3dvcmRzOwotICAgICAgYnJva2VuX3dvcmRzID0geDsKLSAgICAgIHgtPnNlZyA9IG5vd19zZWc7Ci0gICAgICB4LT5zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgeC0+ZnJhZyA9IGZyYWdfbm93OwotICAgICAgeC0+d29yZF9nb2VzX2hlcmUgPSBwOwotICAgICAgeC0+ZGlzcGZyYWcgPSAwOwotICAgICAgeC0+YWRkID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0gICAgICB4LT5zdWIgPSBleHAtPlhfb3Bfc3ltYm9sOwotICAgICAgeC0+YWRkbnVtID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICB4LT5hZGRlZCA9IDA7Ci0gICAgICBuZXdfYnJva2VuX3dvcmRzKys7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogSWYgd2UgaGF2ZSBhbiBpbnRlZ2VyLCBidXQgdGhlIG51bWJlciBvZiBieXRlcyBpcyB0b28gbGFyZ2UgdG8KLSAgICAgcGFzcyB0byBtZF9udW1iZXJfdG9fY2hhcnMsIGhhbmRsZSBpdCBhcyBhIGJpZ251bS4gICovCi0gIGlmIChvcCA9PSBPX2NvbnN0YW50ICYmIG5ieXRlcyA+IHNpemVvZiAodmFsdWVUKSkKLSAgICB7Ci0gICAgICB2YWx1ZVQgdmFsOwotICAgICAgaW50IGdlbmNudDsKLQotICAgICAgaWYgKCEgZXhwLT5YX3Vuc2lnbmVkICYmIGV4cC0+WF9hZGRfbnVtYmVyIDwgMCkKLQlleHRyYV9kaWdpdCA9ICh2YWx1ZVQpIC0xOwotICAgICAgdmFsID0gKHZhbHVlVCkgZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBnZW5jbnQgPSAwOwotICAgICAgZG8KLQl7Ci0JICBnZW5lcmljX2JpZ251bVtnZW5jbnRdID0gdmFsICYgTElUVExFTlVNX01BU0s7Ci0JICB2YWwgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICsrZ2VuY250OwotCX0KLSAgICAgIHdoaWxlICh2YWwgIT0gMCk7Ci0gICAgICBvcCA9IGV4cC0+WF9vcCA9IE9fYmlnOwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSBnZW5jbnQ7Ci0gICAgfQotCi0gIGlmIChvcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHZhbHVlVCBnZXQ7Ci0gICAgICByZWdpc3RlciB2YWx1ZVQgdXNlOwotICAgICAgcmVnaXN0ZXIgdmFsdWVUIG1hc2s7Ci0gICAgICB2YWx1ZVQgaGliaXQ7Ci0gICAgICByZWdpc3RlciB2YWx1ZVQgdW5tYXNrOwotCi0gICAgICAvKiBKRiA8PCBvZiA+PSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb2JqZWN0IGlzIHVuZGVmaW5lZC4gIEluCi0JIHBhcnRpY3VsYXIgU1BBUkMgKFN1biA0KSBoYXMgcHJvYmxlbXMgKi8KLSAgICAgIGlmIChuYnl0ZXMgPj0gc2l6ZW9mICh2YWx1ZVQpKQotCXsKLQkgIG1hc2sgPSAwOwotCSAgaWYgKG5ieXRlcyA+IHNpemVvZiAodmFsdWVUKSkKLQkgICAgaGliaXQgPSAwOwotCSAgZWxzZQotCSAgICBoaWJpdCA9ICh2YWx1ZVQpIDEgPDwgKG5ieXRlcyAqIEJJVFNfUEVSX0NIQVIgLSAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRG9uJ3Qgc3RvcmUgdGhlc2UgYml0cy4gKi8KLQkgIG1hc2sgPSB+KHZhbHVlVCkgMCA8PCAoQklUU19QRVJfQ0hBUiAqIG5ieXRlcyk7Ci0JICBoaWJpdCA9ICh2YWx1ZVQpIDEgPDwgKG5ieXRlcyAqIEJJVFNfUEVSX0NIQVIgLSAxKTsKLQl9Ci0KLSAgICAgIHVubWFzayA9IH5tYXNrOwkJLyogRG8gc3RvcmUgdGhlc2UgYml0cy4gKi8KLQotI2lmZGVmIE5FVkVSCi0gICAgICAiRG8gdGhpcyBtb2QgaWYgeW91IHdhbnQgZXZlcnkgb3ZlcmZsb3cgY2hlY2sgdG8gYXNzdW1lIFNJR05FRCAyJ3MgY29tcGxlbWVudCBkYXRhLiI7Ci0gICAgICBtYXNrID0gfih1bm1hc2sgPj4gMSk7CS8qIEluY2x1ZGVzIHNpZ24gYml0IG5vdy4gKi8KLSNlbmRpZgotCi0gICAgICBnZXQgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIHVzZSA9IGdldCAmIHVubWFzazsKLSAgICAgIGlmICgoZ2V0ICYgbWFzaykgIT0gMAotCSAgJiYgKChnZXQgJiBtYXNrKSAhPSBtYXNrCi0JICAgICAgfHwgKGdldCAmIGhpYml0KSA9PSAwKSkKLQl7CQkvKiBMZWFkaW5nIGJpdHMgY29udGFpbiBib3RoIDBzICYgMXMuICovCi0JICBhc193YXJuIChfKCJWYWx1ZSAweCVseCB0cnVuY2F0ZWQgdG8gMHglbHguIiksCi0JCSAgICh1bnNpZ25lZCBsb25nKSBnZXQsICh1bnNpZ25lZCBsb25nKSB1c2UpOwotCX0KLSAgICAgIC8qIHB1dCBieXRlcyBpbiByaWdodCBvcmRlci4gKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgdXNlLCAoaW50KSBuYnl0ZXMpOwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19iaWcpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgICBMSVRUTEVOVU1fVFlQRSAqbnVtczsKLQotICAgICAga25vdyAobmJ5dGVzICUgQ0hBUlNfUEVSX0xJVFRMRU5VTSA9PSAwKTsKLQotICAgICAgc2l6ZSA9IGV4cC0+WF9hZGRfbnVtYmVyICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLSAgICAgIGlmIChuYnl0ZXMgPCBzaXplKQotCXsKLQkgIGFzX3dhcm4gKF8oIkJpZ251bSB0cnVuY2F0ZWQgdG8gJWQgYnl0ZXMiKSwgbmJ5dGVzKTsKLQkgIHNpemUgPSBuYnl0ZXM7Ci0JfQotCi0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgd2hpbGUgKG5ieXRlcyA+IHNpemUpCi0JICAgIHsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIGV4dHJhX2RpZ2l0LCBDSEFSU19QRVJfTElUVExFTlVNKTsKLQkgICAgICBuYnl0ZXMgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBwICs9IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgIH0KLQotCSAgbnVtcyA9IGdlbmVyaWNfYmlnbnVtICsgc2l6ZSAvIENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICB3aGlsZSAoc2l6ZSA+IDApCi0JICAgIHsKLQkgICAgICAtLW51bXM7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSAqbnVtcywgQ0hBUlNfUEVSX0xJVFRMRU5VTSk7Ci0JICAgICAgc2l6ZSAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBudW1zID0gZ2VuZXJpY19iaWdudW07Ci0JICB3aGlsZSAoc2l6ZSA+IDApCi0JICAgIHsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpICpudW1zLCBDSEFSU19QRVJfTElUVExFTlVNKTsKLQkgICAgICArK251bXM7Ci0JICAgICAgc2l6ZSAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBuYnl0ZXMgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgfQotCi0JICB3aGlsZSAobmJ5dGVzID4gMCkKLQkgICAgewotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgZXh0cmFfZGlnaXQsIENIQVJTX1BFUl9MSVRUTEVOVU0pOwotCSAgICAgIG5ieXRlcyAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZW1zZXQgKHAsIDAsIG5ieXRlcyk7Ci0KLSAgICAgIC8qIE5vdyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4UyB0byByZWNvcmQgdGhlIHN5bWJvbCB2YWx1ZS4KLQkgVGhpcyBpcyBlYXN5IGZvciBCRkQuICBGb3Igb3RoZXIgdGFyZ2V0cyBpdCBjYW4gYmUgbW9yZQotCSBjb21wbGV4LiAgRm9yIHZlcnkgY29tcGxleCBjYXNlcyAoY3VycmVudGx5LCB0aGUgSFBQQSBhbmQKLQkgTlMzMkspLCB5b3UgY2FuIGRlZmluZSBUQ19DT05TX0ZJWF9ORVcgdG8gZG8gd2hhdGV2ZXIgeW91Ci0JIHdhbnQuICBGb3Igc2ltcGxlciBjYXNlcywgeW91IGNhbiBkZWZpbmUgVENfQ09OU19SRUxPQyB0byBiZQotCSB0aGUgbmFtZSBvZiB0aGUgcmVsb2MgY29kZSB0aGF0IHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIGZpeFMuCi0JIElmIG5laXRoZXIgaXMgZGVmaW5lZCwgdGhlIGNvZGUgdXNlcyBOT19SRUxPQyBpZiBpdCBpcwotCSBkZWZpbmVkLCBhbmQgb3RoZXJ3aXNlIHVzZXMgMC4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgVENfQ09OU19GSVhfTkVXCi0gICAgICBUQ19DT05TX0ZJWF9ORVcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIG5ieXRlcywgZXhwKTsKLSNlbHNlCi0gICAgICB7Ci0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0KLQlzd2l0Y2ggKG5ieXRlcykKLQkgIHsKLQkgIGNhc2UgMToKLQkgICAgciA9IEJGRF9SRUxPQ184OwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgciA9IEJGRF9SRUxPQ18xNjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHIgPSBCRkRfUkVMT0NfMzI7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA4OgotCSAgICByID0gQkZEX1JFTE9DXzY0OwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGFzX2JhZCAoXygidW5zdXBwb3J0ZWQgQkZEIHJlbG9jYXRpb24gc2l6ZSAldSIpLCBuYnl0ZXMpOwotCSAgICByID0gQkZEX1JFTE9DXzMyOwotCSAgICBicmVhazsKLQkgIH0KLQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgKGludCkgbmJ5dGVzLCBleHAsCi0JCSAgICAgMCwgcik7Ci0gICAgICB9Ci0jZW5kaWYKLSNlbHNlCi0jaWZkZWYgVENfQ09OU19GSVhfTkVXCi0gICAgICBUQ19DT05TX0ZJWF9ORVcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIG5ieXRlcywgZXhwKTsKLSNlbHNlCi0gICAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIHJlbG9jIG51bWJlciB0byB1c2UuICBVc2UgVENfQ09OU19SRUxPQyBpZgotCSBpdCBpcyBkZWZpbmVkLCBvdGhlcndpc2UgdXNlIE5PX1JFTE9DIGlmIGl0IGlzIGRlZmluZWQsCi0JIG90aGVyd2lzZSB1c2UgMC4gICovCi0jaWZuZGVmIFRDX0NPTlNfUkVMT0MKLSNpZmRlZiBOT19SRUxPQwotI2RlZmluZSBUQ19DT05TX1JFTE9DIE5PX1JFTE9DCi0jZWxzZQotI2RlZmluZSBUQ19DT05TX1JFTE9DIDAKLSNlbmRpZgotI2VuZGlmCi0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgKGludCkgbmJ5dGVzLCBleHAsIDAsCi0JCSAgIFRDX0NPTlNfUkVMT0MpOwotI2VuZGlmIC8qIFRDX0NPTlNfRklYX05FVyAqLwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLSAgICB9Ci19Ci0MCi0jaWZkZWYgQklURklFTERfQ09OU19FWFBSRVNTSU9OUwotCi0vKiBpOTYwIGFzc2VtYmxlcnMsIChlZywgYXNtOTYwKSwgYWxsb3cgYml0ZmllbGRzIGFmdGVyICIuYnl0ZSIgYXMKLSAgIHc6eCx5OnosIHdoZXJlIHcgYW5kIHkgYXJlIGJpdHdpZHRocyBhbmQgeCBhbmQgeSBhcmUgdmFsdWVzLiAgVGhleQotICAgdGhlbiBwYWNrIHRoZW0gYWxsIHRvZ2V0aGVyLiBXZSBkbyBhIGxpdHRsZSBiZXR0ZXIgaW4gdGhhdCB3ZSBhbGxvdwotICAgdGhlbSBpbiB3b3JkcywgbG9uZ3MsIGV0Yy4gYW5kIHdlJ2xsIHBhY2sgdGhlbSBpbiB0YXJnZXQgYnl0ZSBvcmRlcgotICAgZm9yIHlvdS4KLQotICAgVGhlIHJ1bGVzIGFyZTogcGFjayBsZWFzdCBzaWduaWZpY2F0IGJpdCBmaXJzdCwgaWYgYSBmaWVsZCBkb2Vzbid0Ci0gICBlbnRpcmVseSBmaXQsIHB1dCBpdCBpbiB0aGUgbmV4dCB1bml0LiAgT3ZlcmZsb3dpbmcgdGhlIGJpdGZpZWxkIGlzCi0gICBleHBsaWNpdGx5ICpub3QqIGV2ZW4gYSB3YXJuaW5nLiAgVGhlIGJpdHdpZHRoIHNob3VsZCBiZSBjb25zaWRlcmVkCi0gICBhICJtYXNrIi4KLQotICAgVG8gdXNlIHRoaXMgZnVuY3Rpb24gdGhlIHRjLVhYWC5oIGZpbGUgc2hvdWxkIGRlZmluZQotICAgQklURklFTERfQ09OU19FWFBSRVNTSU9OUy4gICovCi0KLXN0YXRpYyB2b2lkIAotcGFyc2VfYml0ZmllbGRfY29ucyAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci17Ci0gIHVuc2lnbmVkIGludCBiaXRzX2F2YWlsYWJsZSA9IEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXM7Ci0gIGNoYXIgKmhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzonKQotICAgIHsJCQkvKiBiaXRmaWVsZHMgKi8KLSAgICAgIGxvbmcgdmFsdWUgPSAwOwotCi0gICAgICBmb3IgKDs7KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgd2lkdGg7Ci0KLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc6JykKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JCQkvKiBuZXh0IHBpZWNlIGlzIG5vdCBhIGJpdGZpZWxkICovCi0KLQkgIC8qIEluIHRoZSBnZW5lcmFsIGNhc2UsIHdlIGNhbid0IGFsbG93Ci0JICAgICBmdWxsIGV4cHJlc3Npb25zIHdpdGggc3ltYm9sCi0JICAgICBkaWZmZXJlbmNlcyBhbmQgc3VjaC4gIFRoZSByZWxvY2F0aW9uCi0JICAgICBlbnRyaWVzIGZvciBzeW1ib2xzIG5vdCBkZWZpbmVkIGluIHRoaXMKLQkgICAgIGFzc2VtYmx5IHdvdWxkIHJlcXVpcmUgYXJiaXRyYXJ5IGZpZWxkCi0JICAgICB3aWR0aHMsIHBvc2l0aW9ucywgYW5kIG1hc2tzIHdoaWNoIG1vc3QKLQkgICAgIG9mIG91ciBjdXJyZW50IG9iamVjdCBmb3JtYXRzIGRvbid0Ci0JICAgICBzdXBwb3J0LgotCi0JICAgICBJbiB0aGUgc3BlY2lmaWMgY2FzZSB3aGVyZSBhIHN5bWJvbAotCSAgICAgKmlzKiBkZWZpbmVkIGluIHRoaXMgYXNzZW1ibHksIHdlCi0JICAgICAqY291bGQqIGJ1aWxkIGZpeHVwcyBhbmQgdHJhY2sgaXQsIGJ1dAotCSAgICAgdGhpcyBjb3VsZCBsZWFkIHRvIGNvbmZ1c2lvbiBmb3IgdGhlCi0JICAgICBiYWNrZW5kcy4gIEknbSBsYXp5LiBJJ2xsIHRha2UgYW55Ci0JICAgICBTRUdfQUJTT0xVVEUuIEkgdGhpbmsgdGhhdCBtZWFucyB0aGF0Ci0JICAgICB5b3UgY2FuIHVzZSBhIHByZXZpb3VzIC5zZXQgb3IKLQkgICAgIC5lcXUgdHlwZSBzeW1ib2wuICB4b3hvcmljaC4gKi8KLQotCSAgaWYgKGV4cC0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oInVzaW5nIGEgYml0IGZpZWxkIHdpZHRoIG9mIHplcm8iKSk7Ci0JICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgIH0JCQkvKiBpbXBsaWVkIHplcm8gd2lkdGggYml0ZmllbGQgKi8KLQotCSAgaWYgKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0JICAgICAgYXNfYmFkIChfKCJmaWVsZCB3aWR0aCBcIiVzXCIgdG9vIGNvbXBsZXggZm9yIGEgYml0ZmllbGQiKSwgaG9sZCk7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICc6JzsKLQkgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQkJCS8qIHRvbyBjb21wbGV4ICovCi0KLQkgIGlmICgod2lkdGggPSBleHAtPlhfYWRkX251bWJlcikgPiAoQklUU19QRVJfQ0hBUiAqIG5ieXRlcykpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJmaWVsZCB3aWR0aCAlbHUgdG9vIGJpZyB0byBmaXQgaW4gJWQgYnl0ZXM6IHRydW5jYXRlZCB0byAlZCBiaXRzIiksCi0JCSAgICAgICB3aWR0aCwgbmJ5dGVzLCAoQklUU19QRVJfQ0hBUiAqIG5ieXRlcykpOwotCSAgICAgIHdpZHRoID0gQklUU19QRVJfQ0hBUiAqIG5ieXRlczsKLQkgICAgfQkJCS8qIHRvbyBiaWcgKi8KLQotCSAgaWYgKHdpZHRoID4gYml0c19hdmFpbGFibGUpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRS1TT01FREFZOiBiYWNraW5nIHVwIGFuZCByZXBhcnNpbmcgaXMgd2FzdGVmdWwuICAqLwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSB2YWx1ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIHdvbid0IGZpdCAqLwotCi0JICBob2xkID0gKytpbnB1dF9saW5lX3BvaW50ZXI7IC8qIHNraXAgJzonICovCi0KLQkgICh2b2lkKSBleHByZXNzaW9uIChleHApOwotCSAgaWYgKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgY2hhciBjYWNoZSA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQkgICAgICBhc19iYWQgKF8oImZpZWxkIHZhbHVlIFwiJXNcIiB0b28gY29tcGxleCBmb3IgYSBiaXRmaWVsZCIpLCBob2xkKTsKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gY2FjaGU7Ci0JICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0JCQkvKiB0b28gY29tcGxleCAqLwotCi0JICB2YWx1ZSB8PSAoKH4oLTEgPDwgd2lkdGgpICYgZXhwLT5YX2FkZF9udW1iZXIpCi0JCSAgICA8PCAoKEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXMpIC0gYml0c19hdmFpbGFibGUpKTsKLQotCSAgaWYgKChiaXRzX2F2YWlsYWJsZSAtPSB3aWR0aCkgPT0gMAotCSAgICAgIHx8IGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkKLQkgICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9CQkJLyogYWxsIHRoZSBiaXRmaWVsZHMgd2UncmUgZ29ubmEgZ2V0ICovCi0KLQkgIGhvbGQgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICh2b2lkKSBleHByZXNzaW9uIChleHApOwotCX0JCQkvKiBmb3JldmVyIGxvb3AgKi8KLQotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSB2YWx1ZTsKLSAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAtPlhfdW5zaWduZWQgPSAxOwotICAgIH0JCQkJLyogaWYgbG9va3MgbGlrZSBhIGJpdGZpZWxkICovCi19CQkJCS8qIHBhcnNlX2JpdGZpZWxkX2NvbnMoKSAqLwotCi0jZW5kaWYgLyogQklURklFTERfQ09OU19FWFBSRVNTSU9OUyAqLwotDAotLyogSGFuZGxlIGFuIE1SSSBzdHlsZSBzdHJpbmcgZXhwcmVzc2lvbi4gICovCi0KLSNpZmRlZiBUQ19NNjhLCi1zdGF0aWMgdm9pZAotcGFyc2VfbXJpX2NvbnMgKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnCi0gICAgICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycKLQkgIHx8ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdBJwotCSAgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ0UnKSkpCi0gICAgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OIChleHAsIG5ieXRlcyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2NhbjsKLSAgICAgIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOwotCi0gICAgICAvKiBBbiBNUkkgc3R5bGUgc3RyaW5nLiAgQ3V0IGludG8gYXMgbWFueSBieXRlcyBhcyB3aWxsIGZpdCBpbnRvCi0JIGEgbmJ5dGUgY2h1bmssIGxlZnQganVzdGlmeSBpZiBuZWNlc3NhcnksIGFuZCBzZXBhcmF0ZSB3aXRoCi0JIGNvbW1hcyBzbyB3ZSBjYW4gdHJ5IGFnYWluIGxhdGVyLiAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdBJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ0UnKQotCXsKLQkgIGFzX2JhZCAoXygiRUJDRElDIGNvbnN0YW50cyBhcmUgbm90IHN1cHBvcnRlZCIpKTsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmb3IgKHNjYW4gPSAwOyBzY2FuIDwgbmJ5dGVzOyBzY2FuKyspCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLQkgICAgewotCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1wnJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQl9Ci0JICAgICAgZWxzZQotCQlicmVhazsKLQkgICAgfQotCSAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8ICgqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCX0KLQotICAgICAgLyogTGVmdCBqdXN0aWZ5ICovCi0gICAgICB3aGlsZSAoc2NhbiA8IG5ieXRlcykKLQl7Ci0JICByZXN1bHQgPDw9IDg7Ci0JICBzY2FuKys7Ci0JfQotICAgICAgLyogQ3JlYXRlIGNvcnJlY3QgZXhwcmVzc2lvbiAqLwotICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gcmVzdWx0OwotICAgICAgLyogRmFrZSBpdCBzbyB0aGF0IHdlIGNhbiByZWFkIHRoZSBuZXh0IGNoYXIgdG9vICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdICE9ICdcJycgfHwKLQkgIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJ1wnJyAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1wnJykpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyIC09IDI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXJbMF0gPSAnLCc7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPSAnXCcnOwotCX0KLSAgICAgIGVsc2UKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci19Ci0jZW5kaWYgLyogVENfTTY4SyAqLwotDAotI2lmZGVmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0KLS8qIFBhcnNlIGEgcmVwZWF0IGV4cHJlc3Npb24gZm9yIGNvbnMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIE1JUFMKLSAgIGFzc2VtYmxlci4gIFRoZSBmb3JtYXQgaXMgTlVNQkVSOkNPVU5UOyBOVU1CRVIgYXBwZWFycyBpbiB0aGUKLSAgIG9iamVjdCBmaWxlIENPVU5UIHRpbWVzLgotCi0gICBUbyB1c2UgdGhpcyBmb3IgYSB0YXJnZXQsIGRlZmluZSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYXJzZV9yZXBlYXRfY29ucyAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci17Ci0gIGV4cHJlc3Npb25TIGNvdW50OwotICByZWdpc3RlciBpbnQgaTsKLQotICBleHByZXNzaW9uIChleHApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc6JykKLSAgICB7Ci0gICAgICAvKiBObyByZXBlYXQgY291bnQuICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgZXhwcmVzc2lvbiAoJmNvdW50KTsKLSAgaWYgKGNvdW50Llhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgY291bnQuWF9hZGRfbnVtYmVyIDw9IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiVW5yZXNvbHZhYmxlIG9yIG5vbnBvc2l0aXZlIHJlcGVhdCBjb3VudDsgdXNpbmcgMSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlIGNvbnMgZnVuY3Rpb24gaXMgZ29pbmcgdG8gb3V0cHV0IHRoaXMgZXhwcmVzc2lvbiBvbmNlLiAgU28gd2UKLSAgICAgb3V0cHV0IGl0IGNvdW50IC0gMSB0aW1lcy4gICovCi0gIGZvciAoaSA9IGNvdW50LlhfYWRkX251bWJlciAtIDE7IGkgPiAwOyBpLS0pCi0gICAgZW1pdF9leHByIChleHAsIG5ieXRlcyk7Ci19Ci0KLSNlbmRpZiAvKiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyAqLwotDAotLyogUGFyc2UgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYXMgYSBoZXggY29uc3RhbnQuICBUaGlzCi0gICBwZXJtaXRzIHVzZXJzIHRvIHNwZWNpZnkgdGhlIGV4YWN0IGJpdHMgdGhleSB3YW50IGluIHRoZSBmbG9hdGluZwotICAgcG9pbnQgbnVtYmVyLiAgKi8KLQotc3RhdGljIGludAotaGV4X2Zsb2F0IChmbG9hdF90eXBlLCBieXRlcykKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci0gICAgIGNoYXIgKmJ5dGVzOwotewotICBpbnQgbGVuZ3RoOwotICBpbnQgaTsKLQotICBzd2l0Y2ggKGZsb2F0X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgbGVuZ3RoID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBsZW5ndGggPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIGxlbmd0aCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIGxlbmd0aCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJVbmtub3duIGZsb2F0aW5nIHR5cGUgdHlwZSAnJWMnIiksIGZsb2F0X3R5cGUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGdvIHRocm91Z2ggZXhwcmVzc2lvbiB0byBwYXJzZSB0aGUKLSAgICAgaGV4IGNvbnN0YW50LCBidXQgaWYgd2UgZ2V0IGEgYmlnbnVtIGl0J3MgYSBwYWluIHRvIHNvcnQgaXQgaW50bwotICAgICB0aGUgYnVmZmVyIGNvcnJlY3RseS4gICovCi0gIGkgPSAwOwotICB3aGlsZSAoaGV4X3AgKCppbnB1dF9saW5lX3BvaW50ZXIpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ18nKQotICAgIHsKLSAgICAgIGludCBkOwotCi0gICAgICAvKiBUaGUgTVJJIGFzc2VtYmxlciBhY2NlcHRzIGFyYml0cmFyeSB1bmRlcnNjb3JlcyBzdHJld24gYWJvdXQKLQkgdGhyb3VnaCB0aGUgaGV4IGNvbnN0YW50LCBzbyB3ZSBpZ25vcmUgdGhlbSBhcyB3ZWxsLiAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ18nKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoaSA+PSBsZW5ndGgpCi0JewotCSAgYXNfd2FybiAoXygiRmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgdG9vIGxhcmdlIikpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGQgPSBoZXhfdmFsdWUgKCppbnB1dF9saW5lX3BvaW50ZXIpIDw8IDQ7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdfJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlmIChoZXhfcCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgZCArPSBoZXhfdmFsdWUgKCppbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWJ5dGVzW2ldID0gZDsKLSAgICAgIGVsc2UKLQlieXRlc1tsZW5ndGggLSBpIC0gMV0gPSBkOwotICAgICAgKytpOwotICAgIH0KLQotICBpZiAoaSA8IGxlbmd0aCkKLSAgICB7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JbWVtc2V0IChieXRlcyArIGksIDAsIGxlbmd0aCAtIGkpOwotICAgICAgZWxzZQotCW1lbXNldCAoYnl0ZXMsIDAsIGxlbmd0aCAtIGkpOwotICAgIH0KLQotICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKgotICoJCQlmbG9hdF9jb25zKCkKLSAqCi0gKiBDT05TdHJ1Y3Qgc29tZSBtb3JlIGZyYWcgY2hhcnMgb2YgLmZsb2F0cyAuZmZsb2F0cyBldGMuCi0gKiBNYWtlcyAwIG9yIG1vcmUgbmV3IGZyYWdzLgotICogSWYgbmVlZF9wYXNzXzIgPT0gMSwgbm8gZnJhZ3MgYXJlIGVtaXR0ZWQuCi0gKiBUaGlzIHVuZGVyc3RhbmRzIG9ubHkgZmxvYXRpbmcgbGl0ZXJhbHMsIG5vdCBleHByZXNzaW9ucy4gU29ycnkuCi0gKgotICogQSBmbG9hdGluZyBjb25zdGFudCBpcyBkZWZpbmVkIGJ5IGF0b2ZfZ2VuZXJpYygpLCBleGNlcHQgaXQgaXMgcHJlY2VkZWQKLSAqIGJ5IDBkIDBmIDBnIG9yIDBoLiBBZnRlciBvYnNlcnZpbmcgdGhlIFNUUkFOR0Ugd2F5IG15IEJTRCBBUyBkb2VzIGl0cwotICogcmVhZGluZywgSSBkZWNpZGVkIHRvIGJlIGluY29tcGF0aWJsZS4gVGhpcyBhbHdheXMgdHJpZXMgdG8gZ2l2ZSB5b3UKLSAqIHJvdW5kZWQgYml0cyB0byB0aGUgcHJlY2lzaW9uIG9mIHRoZSBwc2V1ZG8tb3AuIEZvcm1lciBBUyBkaWQgcHJlbWF0dXJlCi0gKiB0cnVuY2F0YXRpb24sIHJlc3RvcmVkIG5vaXN5IGJpdHMgaW5zdGVhZCBvZiB0cmFpbGluZyAwcyBBTkQgZ2F2ZSB5b3UKLSAqIGEgY2hvaWNlIG9mIDIgZmxhdm91cnMgb2Ygbm9pc2UgYWNjb3JkaW5nIHRvIHdoaWNoIG9mIDIgZmxvYXRpbmctcG9pbnQKLSAqIHNjYW5uZXJzIHlvdSBkaXJlY3RlZCBBUyB0byB1c2UuCi0gKgotICogSW46CWlucHV0X2xpbmVfcG9pbnRlci0+d2hpdGVzcGFjZSBiZWZvcmUsIG9yICcwJyBvZiBmbG9udW0uCi0gKgotICovCi0KLXZvaWQKLWZsb2F0X2NvbnMgKGZsb2F0X3R5cGUpCi0gICAgIC8qIENsb2JiZXJzIGlucHV0X2xpbmUtcG9pbnRlciwgY2hlY2tzIGVuZC1vZi1saW5lLiAqLwotICAgICByZWdpc3RlciBpbnQgZmxvYXRfdHlwZTsJLyogJ2YnOi5mZmxvYXQgLi4uICdGJzouZmxvYXQgLi4uICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGludCBsZW5ndGg7CQkJLyogTnVtYmVyIG9mIGNoYXJzIGluIGFuIG9iamVjdC4gKi8KLSAgcmVnaXN0ZXIgY2hhciAqZXJyOwkJLyogRXJyb3IgZnJvbSBzY2FubmluZyBmbG9hdGluZyBsaXRlcmFsLiAqLwotICBjaGFyIHRlbXBbTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUXTsKLQotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZG8KLSAgICB7Ci0gICAgICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPjFzdCBjaGFyIG9mIGEgZmxvbnVtICh3ZSBob3BlISkuICovCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgICAgIC8qIFNraXAgYW55IDB7bGV0dGVyfSB0aGF0IG1heSBiZSBwcmVzZW50LiBEb24ndCBldmVuIGNoZWNrIGlmIHRoZQotICAgICAgICogbGV0dGVyIGlzIGxlZ2FsLiBTb21lb25lIG1heSBpbnZlbnQgYSAieiIgZm9ybWF0IGFuZCB0aGlzIHJvdXRpbmUKLSAgICAgICAqIGhhcyBubyB1c2UgZm9yIHN1Y2ggaW5mb3JtYXRpb24uIEx1c2VycyBiZXdhcmU6IHlvdSBnZXQKLSAgICAgICAqIGRpYWdub3N0aWNzIGlmIHlvdXIgaW5wdXQgaXMgaWxsLWNvbmRpdGlvbmVkLgotICAgICAgICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJwotCSAgJiYgaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclsxXSkpCi0JaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgICAgIC8qIEFjY2VwdCA6eHh4eCwgd2hlcmUgdGhlIHgncyBhcmUgaGV4IGRpZ2l0cywgZm9yIGEgZmxvYXRpbmcKLSAgICAgICAgIHBvaW50IHdpdGggdGhlIGV4YWN0IGRpZ2l0cyBzcGVjaWZpZWQuICAqLwotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnOicpCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBsZW5ndGggPSBoZXhfZmxvYXQgKGZsb2F0X3R5cGUsIHRlbXApOwotCSAgaWYgKGxlbmd0aCA8IDApCi0JICAgIHsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBlcnIgPSBtZF9hdG9mIChmbG9hdF90eXBlLCB0ZW1wLCAmbGVuZ3RoKTsKLQkgIGtub3cgKGxlbmd0aCA8PSBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQpOwotCSAga25vdyAobGVuZ3RoID4gMCk7Ci0JICBpZiAoZXJyKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJCYWQgZmxvYXRpbmcgbGl0ZXJhbDogJXMiKSwgZXJyKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCFuZWVkX3Bhc3NfMikKLQl7Ci0JICBpbnQgY291bnQ7Ci0KLQkgIGNvdW50ID0gMTsKLQotI2lmZGVmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnOicpCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUyBjb3VudF9leHA7Ci0KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBleHByZXNzaW9uICgmY291bnRfZXhwKTsKLQkgICAgICBpZiAoY291bnRfZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkgIHx8IGNvdW50X2V4cC5YX2FkZF9udW1iZXIgPD0gMCkKLQkJewotCQkgIGFzX3dhcm4gKF8oInVucmVzb2x2YWJsZSBvciBub25wb3NpdGl2ZSByZXBlYXQgY291bnQ7IHVzaW5nIDEiKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWNvdW50ID0gY291bnRfZXhwLlhfYWRkX251bWJlcjsKLQkgICAgfQotI2VuZGlmCi0KLQkgIHdoaWxlICgtLWNvdW50ID49IDApCi0JICAgIHsKLQkgICAgICBwID0gZnJhZ19tb3JlIChsZW5ndGgpOwotCSAgICAgIG1lbWNweSAocCwgdGVtcCwgKHVuc2lnbmVkIGludCkgbGVuZ3RoKTsKLQkgICAgfQotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICAtLWlucHV0X2xpbmVfcG9pbnRlcjsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBmbG9hdF9jb25zKCkgKi8KLQwKLS8qIFJldHVybiB0aGUgc2l6ZSBvZiBhIExFQjEyOCB2YWx1ZSAqLwotCi1zdGF0aWMgaW5saW5lIGludAotc2l6ZW9mX3NsZWIxMjggKHZhbHVlKQotICAgICBvZmZzZXRUIHZhbHVlOwotewotICByZWdpc3RlciBpbnQgc2l6ZSA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gKHZhbHVlICYgMHg3Zik7Ci0gICAgICAvKiBTYWRseSwgd2UgY2Fubm90IHJlbHkgb24gdHlwaWNhbCBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGJlaGF2aW91ci4KLQkgRm9ydHVuYXRlbHksIHdlIGNhbiBzdHJ1Y3R1cmUgdGhpbmdzIHNvIHRoYXQgdGhlIGV4dHJhIHdvcmsgcmVkdWNlcwotCSB0byBhIG5vb3Agb24gc3lzdGVtcyB0aGF0IGRvIHRoaW5ncyAicHJvcGVybHkiLiAgKi8KLSAgICAgIHZhbHVlID0gKHZhbHVlID4+IDcpIHwgfigtKG9mZnNldFQpMSA+PiA3KTsKLSAgICAgIHNpemUgKz0gMTsKLSAgICB9Ci0gIHdoaWxlICghKCgodmFsdWUgPT0gMCkgJiYgKChieXRlICYgMHg0MCkgPT0gMCkpCi0JICAgfHwgKCh2YWx1ZSA9PSAtMSkgJiYgKChieXRlICYgMHg0MCkgIT0gMCkpKSk7Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1zaXplb2ZfdWxlYjEyOCAodmFsdWUpCi0gICAgIHZhbHVlVCB2YWx1ZTsKLXsKLSAgcmVnaXN0ZXIgaW50IHNpemUgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBieXRlOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9ICh2YWx1ZSAmIDB4N2YpOwotICAgICAgdmFsdWUgPj49IDc7Ci0gICAgICBzaXplICs9IDE7Ci0gICAgfQotICB3aGlsZSAodmFsdWUgIT0gMCk7Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWludAotc2l6ZW9mX2xlYjEyOCAodmFsdWUsIHNpZ24pCi0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IHNpZ247Ci17Ci0gIGlmIChzaWduKQotICAgIHJldHVybiBzaXplb2Zfc2xlYjEyOCAoKG9mZnNldFQpIHZhbHVlKTsKLSAgZWxzZQotICAgIHJldHVybiBzaXplb2ZfdWxlYjEyOCAodmFsdWUpOwotfQotCi0vKiBPdXRwdXQgYSBMRUIxMjggdmFsdWUuICAqLwotCi1zdGF0aWMgaW5saW5lIGludAotb3V0cHV0X3NsZWIxMjggKHAsIHZhbHVlKQotICAgICBjaGFyICpwOwotICAgICBvZmZzZXRUIHZhbHVlOwotewotICByZWdpc3RlciBjaGFyICpvcmlnID0gcDsKLSAgcmVnaXN0ZXIgaW50IG1vcmU7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBieXRlID0gKHZhbHVlICYgMHg3Zik7Ci0KLSAgICAgIC8qIFNhZGx5LCB3ZSBjYW5ub3QgcmVseSBvbiB0eXBpY2FsIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgYmVoYXZpb3VyLgotCSBGb3J0dW5hdGVseSwgd2UgY2FuIHN0cnVjdHVyZSB0aGluZ3Mgc28gdGhhdCB0aGUgZXh0cmEgd29yayByZWR1Y2VzCi0JIHRvIGEgbm9vcCBvbiBzeXN0ZW1zIHRoYXQgZG8gdGhpbmdzICJwcm9wZXJseSIuICAqLwotICAgICAgdmFsdWUgPSAodmFsdWUgPj4gNykgfCB+KC0ob2Zmc2V0VCkxID4+IDcpOwotCi0gICAgICBtb3JlID0gISgoKCh2YWx1ZSA9PSAwKSAmJiAoKGJ5dGUgJiAweDQwKSA9PSAwKSkKLQkJfHwgKCh2YWx1ZSA9PSAtMSkgJiYgKChieXRlICYgMHg0MCkgIT0gMCkpKSk7Ci0gICAgICBpZiAobW9yZSkKLQlieXRlIHw9IDB4ODA7Ci0KLSAgICAgICpwKysgPSBieXRlOwotICAgIH0KLSAgd2hpbGUgKG1vcmUpOwotCi0gIHJldHVybiBwIC0gb3JpZzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW91dHB1dF91bGViMTI4IChwLCB2YWx1ZSkKLSAgICAgY2hhciAqcDsKLSAgICAgdmFsdWVUIHZhbHVlOwotewotICBjaGFyICpvcmlnID0gcDsKLQotICBkbwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGJ5dGUgPSAodmFsdWUgJiAweDdmKTsKLSAgICAgIHZhbHVlID4+PSA3OwotICAgICAgaWYgKHZhbHVlICE9IDApCi0JLyogTW9yZSBieXRlcyB0byBmb2xsb3cuICAqLwotCWJ5dGUgfD0gMHg4MDsKLQotICAgICAgKnArKyA9IGJ5dGU7Ci0gICAgfQotICB3aGlsZSAodmFsdWUgIT0gMCk7Ci0KLSAgcmV0dXJuIHAgLSBvcmlnOwotfQotCi1pbnQKLW91dHB1dF9sZWIxMjggKHAsIHZhbHVlLCBzaWduKQotICAgICBjaGFyICpwOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBzaWduOwotewotICBpZiAoc2lnbikKLSAgICByZXR1cm4gb3V0cHV0X3NsZWIxMjggKHAsIChvZmZzZXRUKSB2YWx1ZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gb3V0cHV0X3VsZWIxMjggKHAsIHZhbHVlKTsKLX0KLQotLyogRG8gdGhlIHNhbWUgZm9yIGJpZ251bXMuICBXZSBjb21iaW5lIHNpemVvZiB3aXRoIG91dHB1dCBoZXJlIGluIHRoYXQKLSAgIHdlIGRvbid0IG91dHB1dCBmb3IgTlVMTCB2YWx1ZXMgb2YgUC4gIEl0IGlzbid0IHJlYWxseSBhcyBjcml0aWNhbCBhcwotICAgZm9yICJub3JtYWwiIHZhbHVlcyB0aGF0IHRoaXMgYmUgc3RyZWFtbGluZWQuICAqLwotCi1zdGF0aWMgaW5saW5lIGludAotb3V0cHV0X2JpZ19zbGViMTI4IChwLCBiaWdudW0sIHNpemUpCi0gICAgIGNoYXIgKnA7Ci0gICAgIExJVFRMRU5VTV9UWVBFICpiaWdudW07Ci0gICAgIGludCBzaXplOwotewotICBjaGFyICpvcmlnID0gcDsKLSAgdmFsdWVUIHZhbCA9IDA7Ci0gIGludCBsb2FkZWQgPSAwOwotICB1bnNpZ25lZCBieXRlOwotCi0gIC8qIFN0cmlwIGxlYWRpbmcgc2lnbiBleHRlbnNpb25zIG9mZiB0aGUgYmlnbnVtLiAgKi8KLSAgd2hpbGUgKHNpemUgPiAwICYmIGJpZ251bVtzaXplLTFdID09IChMSVRUTEVOVU1fVFlQRSktMSkKLSAgICBzaXplLS07Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobG9hZGVkIDwgNyAmJiBzaXplID4gMCkKLQl7Ci0JICB2YWwgfD0gKCpiaWdudW0gPDwgbG9hZGVkKTsKLQkgIGxvYWRlZCArPSA4ICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgIHNpemUtLTsKLQkgIGJpZ251bSsrOwotCX0KLQotICAgICAgYnl0ZSA9IHZhbCAmIDB4N2Y7Ci0gICAgICBsb2FkZWQgLT0gNzsKLSAgICAgIHZhbCA+Pj0gNzsKLQotICAgICAgaWYgKHNpemUgPT0gMCkKLQl7Ci0JICBpZiAoKHZhbCA9PSAwICYmIChieXRlICYgMHg0MCkgPT0gMCkKLQkgICAgICB8fCAofih2YWwgfCB+KCgodmFsdWVUKTEgPDwgbG9hZGVkKSAtIDEpKSA9PSAwCi0JCSAgJiYgKGJ5dGUgJiAweDQwKSAhPSAwKSkKLQkgICAgYnl0ZSB8PSAweDgwOwotCX0KLQotICAgICAgaWYgKG9yaWcpCi0JKnAgPSBieXRlOwotICAgICAgcCsrOwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICByZXR1cm4gcCAtIG9yaWc7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdXRwdXRfYmlnX3VsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSkKLSAgICAgY2hhciAqcDsKLSAgICAgTElUVExFTlVNX1RZUEUgKmJpZ251bTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNoYXIgKm9yaWcgPSBwOwotICB2YWx1ZVQgdmFsID0gMDsKLSAgaW50IGxvYWRlZCA9IDA7Ci0gIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgLyogU3RyaXAgbGVhZGluZyB6ZXJvcyBvZmYgdGhlIGJpZ251bS4gICovCi0gIC8qIFhYWDogSXMgdGhpcyBuZWVkZWQ/ICAqLwotICB3aGlsZSAoc2l6ZSA+IDAgJiYgYmlnbnVtW3NpemUtMV0gPT0gMCkKLSAgICBzaXplLS07Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobG9hZGVkIDwgNyAmJiBzaXplID4gMCkKLQl7Ci0JICB2YWwgfD0gKCpiaWdudW0gPDwgbG9hZGVkKTsKLQkgIGxvYWRlZCArPSA4ICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgIHNpemUtLTsKLQkgIGJpZ251bSsrOwotCX0KLQotICAgICAgYnl0ZSA9IHZhbCAmIDB4N2Y7Ci0gICAgICBsb2FkZWQgLT0gNzsKLSAgICAgIHZhbCA+Pj0gNzsKLQotICAgICAgaWYgKHNpemUgPiAwIHx8IHZhbCkKLQlieXRlIHw9IDB4ODA7Ci0KLSAgICAgIGlmIChvcmlnKQotCSpwID0gYnl0ZTsKLSAgICAgIHArKzsKLSAgICB9Ci0gIHdoaWxlIChieXRlICYgMHg4MCk7Ci0KLSAgcmV0dXJuIHAgLSBvcmlnOwotfQotCi1zdGF0aWMgaW50Ci1vdXRwdXRfYmlnX2xlYjEyOCAocCwgYmlnbnVtLCBzaXplLCBzaWduKQotICAgICBjaGFyICpwOwotICAgICBMSVRUTEVOVU1fVFlQRSAqYmlnbnVtOwotICAgICBpbnQgc2l6ZSwgc2lnbjsKLXsKLSAgaWYgKHNpZ24pCi0gICAgcmV0dXJuIG91dHB1dF9iaWdfc2xlYjEyOCAocCwgYmlnbnVtLCBzaXplKTsKLSAgZWxzZQotICAgIHJldHVybiBvdXRwdXRfYmlnX3VsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSk7Ci19Ci0KLS8qIEdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBmcmFnbWVudHMgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbiB0byBlbWl0IGEKLSAgIGxlYjEyOCB2YWx1ZS4gICovCi0KLXZvaWQKLWVtaXRfbGViMTI4X2V4cHIoZXhwLCBzaWduKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgc2lnbjsKLXsKLSAgb3BlcmF0b3JUIG9wID0gZXhwLT5YX29wOwotCi0gIGlmIChvcCA9PSBPX2Fic2VudCB8fCBvcCA9PSBPX2lsbGVnYWwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiemVybyBhc3N1bWVkIGZvciBtaXNzaW5nIGV4cHJlc3Npb24iKSk7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX2JpZyAmJiBleHAtPlhfYWRkX251bWJlciA8PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fcmVnaXN0ZXIpCi0gICAgewotICAgICAgYXNfd2FybiAoXygicmVnaXN0ZXIgdmFsdWUgdXNlZCBhcyBleHByZXNzaW9uIikpOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLQotICBpZiAob3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSd2ZSBnb3QgYSBjb25zdGFudCwgZW1pdCB0aGUgdGhpbmcgZGlyZWN0bHkgcmlnaHQgbm93LiAgKi8KLQotICAgICAgdmFsdWVUIHZhbHVlID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHNpemUgPSBzaXplb2ZfbGViMTI4ICh2YWx1ZSwgc2lnbik7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplKTsKLSAgICAgIG91dHB1dF9sZWIxMjggKHAsIHZhbHVlLCBzaWduKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fYmlnKQotICAgIHsKLSAgICAgIC8qIE9fYmlnIGlzIGEgZGlmZmVyZW50IHNvcnQgb2YgY29uc3RhbnQuICAqLwotCi0gICAgICBpbnQgc2l6ZTsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHNpemUgPSBvdXRwdXRfYmlnX2xlYjEyOCAoTlVMTCwgZ2VuZXJpY19iaWdudW0sIGV4cC0+WF9hZGRfbnVtYmVyLCBzaWduKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHNpemUpOwotICAgICAgb3V0cHV0X2JpZ19sZWIxMjggKHAsIGdlbmVyaWNfYmlnbnVtLCBleHAtPlhfYWRkX251bWJlciwgc2lnbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGNyZWF0ZSBhIHZhcmlhYmxlIHNpemVkIGZyYWdtZW50IGFuZCAKLQkgcmVzb2x2ZSB0aGluZ3MgbGF0ZXIuICAqLwotCi0gICAgICBmcmFnX3ZhciAocnNfbGViMTI4LCBzaXplb2ZfdWxlYjEyOCAofih2YWx1ZVQpMCksIDAsIHNpZ24sCi0JCW1ha2VfZXhwcl9zeW1ib2wgKGV4cCksIDAsIChjaGFyICopIE5VTEwpOwotICAgIH0KLX0KLQotLyogUGFyc2UgdGhlIC5zbGViMTI4IGFuZCAudWxlYjEyOCBwc2V1ZG9zLiAgKi8KLQotdm9pZAotc19sZWIxMjggKHNpZ24pCi0gICAgIGludCBzaWduOwotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgZG8gewotICAgIGV4cHJlc3Npb24gKCZleHApOwotICAgIGVtaXRfbGViMTI4X2V4cHIgKCZleHAsIHNpZ24pOwotICB9IHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qCi0gKgkJCXN0cmluZ2VyKCkKLSAqCi0gKiBXZSByZWFkIDAgb3IgbW9yZSAnLCcgc2VwYXJhdGVkLCBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi0gKgotICogQ2FsbGVyIHNob3VsZCBoYXZlIGNoZWNrZWQgbmVlZF9wYXNzXzIgaXMgRkFMU0UgYmVjYXVzZSB3ZSBkb24ndCBjaGVjayBpdC4KLSAqLwotCi0KLXZvaWQgCi1zdHJpbmdlciAoYXBwZW5kX3plcm8pCQkvKiBXb3JrZXIgdG8gZG8gLmFzY2lpIGV0YyBzdGF0ZW1lbnRzLiAqLwotICAgICAvKiBDaGVja3MgZW5kLW9mLWxpbmUuICovCi0gICAgIHJlZ2lzdGVyIGludCBhcHBlbmRfemVybzsJLyogMDogZG9uJ3QgYXBwZW5kICdcMCcsIGVsc2UgMSAqLwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKLSAgY2hhciAqc3RhcnQ7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIC8qCi0gICAqIFRoZSBmb2xsb3dpbmcgYXdrd2FyZCBsb2dpYyBpcyB0byBwYXJzZSBaRVJPIG9yIG1vcmUgc3RyaW5ncywKLSAgICogY29tbWEgc2VwYXJhdGVkLiBSZWNhbGwgYSBzdHJpbmcgZXhwcmVzc2lvbiBpbmNsdWRlcyBzcGFjZXMKLSAgICogYmVmb3JlIHRoZSBvcGVuaW5nICdcIicgYW5kIHNwYWNlcyBhZnRlciB0aGUgY2xvc2luZyAnXCInLgotICAgKiBXZSBmYWtlIGEgbGVhZGluZyAnLCcgaWYgdGhlcmUgaXMgKHN1cHBvc2VkIHRvIGJlKQotICAgKiBhIDFzdCwgZXhwcmVzc2lvbi4gV2Uga2VlcCBkZW1hbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGVhY2gKLSAgICogJywnLgotICAgKi8KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgYyA9IDA7CQkJLyogU2tpcCBsb29wLiAqLwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CS8qIENvbXBlbnNhdGUgZm9yIGVuZCBvZiBsb29wLiAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGMgPSAnLCc7CQkJLyogRG8gbG9vcC4gKi8KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyB8fCBjID09ICc8JyB8fCBjID09ICciJykKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCWNhc2UgJ1wiJzoKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwkvKi0+MXN0IGNoYXIgb2Ygc3RyaW5nLiAqLwotCSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JICAgIHsKLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotCSAgICB9Ci0JICBpZiAoYXBwZW5kX3plcm8pCi0JICAgIHsKLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKDApOwotCSAgICB9Ci0JICBrbm93IChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcIicpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNpZmRlZiBPQkpfRUxGCi0JICAvKiBJbiBFTEYsIHdoZW4gZ2NjIGlzIGVtaXR0aW5nIERXQVJGIDEgZGVidWdnaW5nIG91dHB1dCwgaXQKLSAgICAgICAgICAgICB3aWxsIGVtaXQgLnN0cmluZyB3aXRoIGEgZmlsZW5hbWUgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uCi0gICAgICAgICAgICAgYWZ0ZXIgYSBzZXF1ZW5jZSBvZiBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnQgaW4KLSAgICAgICAgICAgICBlbWl0X2V4cHIgZm9yIHRoZSBzZXF1ZW5jZS4gIGVtaXRfZXhwciB3aWxsIHNldAotICAgICAgICAgICAgIGR3YXJmX2ZpbGVfc3RyaW5nIHRvIG5vbi16ZXJvIGlmIHRoaXMgc3RyaW5nIG1pZ2h0IGJlIGEKLSAgICAgICAgICAgICBzb3VyY2UgZmlsZSBuYW1lLiAgKi8KLQkgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZGVidWciKSAhPSAwKQotCSAgICBkd2FyZl9maWxlX3N0cmluZyA9IDA7Ci0JICBlbHNlIGlmIChkd2FyZl9maWxlX3N0cmluZykKLQkgICAgewotCSAgICAgIGMgPSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlclstMV0gPSAnXDAnOwotCSAgICAgIGxpc3Rpbmdfc291cmNlX2ZpbGUgKHN0YXJ0KTsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXJbLTFdID0gYzsKLQkgICAgfQotI2VuZGlmCi0jZW5kaWYKLQotCSAgYnJlYWs7Ci0JY2FzZSAnPCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGMgPSBnZXRfc2luZ2xlX251bWJlciAoKTsKLQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPicpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIDxubj4iKSk7Ci0JICAgIH0KLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0JY2FzZSAnLCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzdHJpbmdlcigpICovCi0MCi0vKiBGSVhNRS1TT01FREFZOiBJIGhhZCB0cm91YmxlIGhlcmUgb24gY2hhcmFjdGVycyB3aXRoIHRoZQotICAgIGhpZ2ggYml0cyBzZXQuICBXZSdsbCBwcm9iYWJseSBhbHNvIGhhdmUgdHJvdWJsZSB3aXRoCi0gICAgbXVsdGlieXRlIGNoYXJzLCB3aWRlIGNoYXJzLCBldGMuICBBbHNvIGJlIGNhcmVmdWwgYWJvdXQKLSAgICByZXR1cm5pbmcgdmFsdWVzIGJpZ2dlciB0aGFuIDEgYnl0ZS4gIHhveG9yaWNoLiAqLwotCi11bnNpZ25lZCBpbnQgCi1uZXh0X2NoYXJfb2Zfc3RyaW5nICgpCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKysgJiBDSEFSX01BU0s7Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnXCInOgotICAgICAgYyA9IE5PVF9BX0NIQVI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1xuJzoKLSAgICAgIGFzX3dhcm4gKF8oIlVudGVybWluYXRlZCBzdHJpbmc6IE5ld2xpbmUgaW5zZXJ0ZWQuIikpOwotICAgICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotICAgICAgYnJlYWs7Ci0KLSNpZm5kZWYgTk9fU1RSSU5HX0VTQ0FQRVMKLSAgICBjYXNlICdcXCc6Ci0gICAgICBzd2l0Y2ggKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0JewotCWNhc2UgJ2InOgotCSAgYyA9ICdcYic7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgYyA9ICdcZic7Ci0JICBicmVhazsKLQotCWNhc2UgJ24nOgotCSAgYyA9ICdcbic7Ci0JICBicmVhazsKLQotCWNhc2UgJ3InOgotCSAgYyA9ICdccic7Ci0JICBicmVhazsKLQotCWNhc2UgJ3QnOgotCSAgYyA9ICdcdCc7Ci0JICBicmVhazsKLQotCWNhc2UgJ3YnOgotCSAgYyA9ICdcMDEzJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXFwnOgotCWNhc2UgJyInOgotCSAgYnJlYWs7CQkvKiBBcyBpdHNlbGYuICovCi0KLQljYXNlICcwJzoKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQljYXNlICc3JzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQkgIHsKLQkgICAgbG9uZyBudW1iZXI7Ci0JICAgIGludCBpOwotCi0JICAgIGZvciAoaSA9IDAsIG51bWJlciA9IDA7IGlzZGlnaXQgKGMpICYmIGkgPCAzOyBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrLCBpKyspCi0JICAgICAgewotCQludW1iZXIgPSBudW1iZXIgKiA4ICsgYyAtICcwJzsKLQkgICAgICB9Ci0JICAgIGMgPSBudW1iZXIgJiAweGZmOwotCSAgfQotCSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBicmVhazsKLQotCWNhc2UgJ3gnOgotCWNhc2UgJ1gnOgotCSAgewotCSAgICBsb25nIG51bWJlcjsKLQotCSAgICBudW1iZXIgPSAwOwotCSAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICB3aGlsZSAoaXN4ZGlnaXQgKGMpKQotCSAgICAgIHsKLQkJaWYgKGlzZGlnaXQgKGMpKQotCQkgIG51bWJlciA9IG51bWJlciAqIDE2ICsgYyAtICcwJzsKLQkJZWxzZSBpZiAoaXN1cHBlciAoYykpCi0JCSAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBjIC0gJ0EnICsgMTA7Ci0JCWVsc2UKLQkJICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGMgLSAnYScgKyAxMDsKLQkJYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICB9Ci0JICAgIGMgPSBudW1iZXIgJiAweGZmOwotCSAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnXG4nOgotCSAgLyogVG8gYmUgY29tcGF0aWJsZSB3aXRoIEJTRCA0LjIgYXM6IGdpdmUgdGhlIGx1c2VyIGEgbGluZWZlZWQhISAqLwotCSAgYXNfd2FybiAoXygiVW50ZXJtaW5hdGVkIHN0cmluZzogTmV3bGluZSBpbnNlcnRlZC4iKSk7Ci0JICBjID0gJ1xuJzsKLQkgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQotI2lmZGVmIE9OTFlfU1RBTkRBUkRfRVNDQVBFUwotCSAgYXNfYmFkIChfKCJCYWQgZXNjYXBlZCBjaGFyYWN0ZXIgaW4gc3RyaW5nLCAnPycgYXNzdW1lZCIpKTsKLQkgIGMgPSAnPyc7Ci0jZW5kaWYgLyogT05MWV9TVEFOREFSRF9FU0NBUEVTICovCi0KLQkgIGJyZWFrOwotCX0JCQkvKiBzd2l0Y2ggb24gZXNjYXBlZCBjaGFyICovCi0gICAgICBicmVhazsKLSNlbmRpZiAvKiAhIGRlZmluZWQgKE5PX1NUUklOR19FU0NBUEVTKSAqLwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0JCQkJLyogc3dpdGNoIG9uIGNoYXIgKi8KLSAgcmV0dXJuIChjKTsKLX0JCQkJLyogbmV4dF9jaGFyX29mX3N0cmluZygpICovCi0MCi1zdGF0aWMgc2VnVAotZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uIChleHBQKQotICAgICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsKLXsKLSAgcmVnaXN0ZXIgc2VnVCByZXR2YWw7Ci0KLSAgcmV0dmFsID0gZXhwcmVzc2lvbiAoZXhwUCk7Ci0gIGlmIChleHBQLT5YX29wID09IE9faWxsZWdhbAotICAgICAgfHwgZXhwUC0+WF9vcCA9PSBPX2Fic2VudAotICAgICAgfHwgZXhwUC0+WF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGFkZHJlc3MgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgcmV0dmFsID0gYWJzb2x1dGVfc2VjdGlvbjsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBzZWdUIAotZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uIChleHBQKQotICAgICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsKLXsKLSAgcmVnaXN0ZXIgc2VnVCByZXR2YWw7Ci0KLSAgaWYgKChyZXR2YWwgPSBnZXRfc2VnbWVudGVkX2V4cHJlc3Npb24gKGV4cFApKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBleHRyYWN0IHRoZSB1bmRlZmluZWQgc3ltYm9sIGZyb20gdGhlCi0JIGV4cHJlc3Npb24uICAqLwotICAgICAgaWYgKGV4cFAtPlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0JICAmJiBTX0dFVF9TRUdNRU5UIChleHBQLT5YX2FkZF9zeW1ib2wpICE9IGV4cHJfc2VjdGlvbikKLQlhc193YXJuIChfKCJzeW1ib2wgXCIlc1wiIHVuZGVmaW5lZDsgemVybyBhc3N1bWVkIiksCi0JCSBTX0dFVF9OQU1FIChleHBQLT5YX2FkZF9zeW1ib2wpKTsKLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJzb21lIHN5bWJvbCB1bmRlZmluZWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIHJldHZhbCA9IGFic29sdXRlX3NlY3Rpb247Ci0gICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotICBrbm93IChyZXR2YWwgPT0gYWJzb2x1dGVfc2VjdGlvbiB8fCBTRUdfTk9STUFMIChyZXR2YWwpKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQkJCQkvKiBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24oKSAqLwotCi1vZmZzZXRUCi1nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKQotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGlmIChleHAuWF9vcCAhPSBPX2Fic2VudCkKLQlhc19iYWQgKF8oImJhZCBvciBpcnJlZHVjaWJsZSBhYnNvbHV0ZSBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gIHJldHVybiBleHAuWF9hZGRfbnVtYmVyOwotfQotCi1jaGFyCQkJCS8qIHJldHVybiB0ZXJtaW5hdG9yICovCi1nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAodmFsX3BvaW50ZXIpCi0gICAgIGxvbmcgKnZhbF9wb2ludGVyOwkJLyogcmV0dXJuIHZhbHVlIG9mIGV4cHJlc3Npb24gKi8KLXsKLSAgLyogRklYTUU6IHZhbF9wb2ludGVyIHNob3VsZCBwcm9iYWJseSBiZSBvZmZzZXRUICouICAqLwotICAqdmFsX3BvaW50ZXIgPSAobG9uZykgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHJldHVybiAoKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKLX0KLQwKLS8qCi0gKgkJCWRlbWFuZF9jb3B5X0Nfc3RyaW5nKCkKLSAqCi0gKiBMaWtlIGRlbWFuZF9jb3B5X3N0cmluZywgYnV0IHJldHVybiBOVUxMIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgYW55ICdcMCdzLgotICogR2l2ZSBhIHdhcm5pbmcgaWYgdGhhdCBoYXBwZW5zLgotICovCi1jaGFyICoKLWRlbWFuZF9jb3B5X0Nfc3RyaW5nIChsZW5fcG9pbnRlcikKLSAgICAgaW50ICpsZW5fcG9pbnRlcjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqczsKLQotICBpZiAoKHMgPSBkZW1hbmRfY29weV9zdHJpbmcgKGxlbl9wb2ludGVyKSkgIT0gMCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgbGVuOwotCi0gICAgICBmb3IgKGxlbiA9ICpsZW5fcG9pbnRlcjsgbGVuID4gMDsgbGVuLS0pCi0JewotCSAgaWYgKCpzID09IDApCi0JICAgIHsKLQkgICAgICBzID0gMDsKLQkgICAgICBsZW4gPSAxOwotCSAgICAgICpsZW5fcG9pbnRlciA9IDA7Ci0JICAgICAgYXNfYmFkIChfKCJUaGlzIHN0cmluZyBtYXkgbm90IGNvbnRhaW4gXCdcXDBcJyIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBzOwotfQotDAotLyoKLSAqCQkJZGVtYW5kX2NvcHlfc3RyaW5nKCkKLSAqCi0gKiBEZW1hbmQgc3RyaW5nLCBidXQgcmV0dXJuIGEgc2FmZSAoPXByaXZhdGUpIGNvcHkgb2YgdGhlIHN0cmluZy4KLSAqIFJldHVybiBOVUxMIGlmIHdlIGNhbid0IHJlYWQgYSBzdHJpbmcgaGVyZS4KLSAqLwotY2hhciAqCi1kZW1hbmRfY29weV9zdHJpbmcgKGxlblApCi0gICAgIGludCAqbGVuUDsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHJlZ2lzdGVyIGludCBsZW47Ci0gIGNoYXIgKnJldHZhbDsKLQotICBsZW4gPSAwOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CS8qIFNraXAgb3BlbmluZyBxdW90ZS4gKi8KLQotICAgICAgd2hpbGUgKGlzX2FfY2hhciAoYyA9IG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCXsKLQkgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgYyk7Ci0JICBsZW4rKzsKLQl9Ci0gICAgICAvKiBKRiB0aGlzIG5leHQgbGluZSBpcyBzbyBkZW1hbmRfY29weV9DX3N0cmluZyB3aWxsIHJldHVybiBhCi0JIG51bGwgdGVybWluYXRlZCBzdHJpbmcuICovCi0gICAgICBvYnN0YWNrXzFncm93ICgmbm90ZXMsICdcMCcpOwotICAgICAgcmV0dmFsID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBzdHJpbmciKSk7Ci0gICAgICByZXR2YWwgPSBOVUxMOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gICpsZW5QID0gbGVuOwotICByZXR1cm4gKHJldHZhbCk7Ci19CQkJCS8qIGRlbWFuZF9jb3B5X3N0cmluZygpICovCi0MCi0vKgotICoJCWlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQoKQotICoKLSAqIEluOglJbnB1dF9saW5lX3BvaW50ZXItPm5leHQgY2hhcmFjdGVyLgotICoKLSAqIERvOglTa2lwIGlucHV0X2xpbmVfcG9pbnRlciBvdmVyIGFsbCB3aGl0ZXNwYWNlLgotICoKLSAqIE91dDoJMSBpZiBpbnB1dF9saW5lX3BvaW50ZXItPmVuZC1vZi1saW5lLgotKi8KLWludCAKLWlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkKLXsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICByZXR1cm4gKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSk7Ci19CQkJCS8qIGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQoKSAqLwotCi12b2lkIAotZXF1YWxzIChzeW1fbmFtZSwgcmVhc3NpZ24pCi0gICAgIGNoYXIgKnN5bV9uYW1lOwotICAgICBpbnQgcmVhc3NpZ247Ci17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CS8qIHN5bWJvbCB3ZSBhcmUgd29ya2luZyB3aXRoICovCi0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPScpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGlmIChzeW1fbmFtZVswXSA9PSAnLicgJiYgc3ltX25hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBUdXJuICcuID0gbXVtYmxlJyBpbnRvIGEgLm9yZyBtdW1ibGUgKi8KLSAgICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLQotICAgICAgc2VnbWVudCA9IGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoIW5lZWRfcGFzc18yKQotCWRvX29yZyAoc2VnbWVudCwgJmV4cCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKHN5bV9uYW1lKTsKLSAgICAgIC8qIFBlcm1pdCByZWdpc3RlciBuYW1lcyB0byBiZSByZWRlZmluZWQuICAqLwotICAgICAgaWYgKCEgcmVhc3NpZ24KLQkgICYmIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLQkgICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotCWFzX2JhZCAoXygic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIHBzZXVkb19zZXQgKHN5bWJvbFApOwotICAgIH0KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgIHsKLSAgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOyAvKiBjaGVjayBnYXJiYWdlIGFmdGVyIHRoZSBleHByZXNzaW9uICovCi0gICAgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgIH0KLX0JCQkJLyogZXF1YWxzKCkgKi8KLQotLyogLmluY2x1ZGUgLS0gaW5jbHVkZSBhIGZpbGUgYXQgdGhpcyBwb2ludC4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQgCi1zX2luY2x1ZGUgKGFyZykKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpmaWxlbmFtZTsKLSAgaW50IGk7Ci0gIEZJTEUgKnRyeTsKLSAgY2hhciAqcGF0aDsKLQotICBpZiAoISBmbGFnX202OGtfbXJpKQotICAgIHsKLSAgICAgIGZpbGVuYW1lID0gZGVtYW5kX2NvcHlfc3RyaW5nICgmaSk7Ci0gICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBkZW1hbmRfY29weV9zdHJpbmcgaGFzIGFscmVhZHkgcHJpbnRlZCBhbiBlcnJvciBhbmQKLSAgICAgICAgICAgICBjYWxsZWQgaWdub3JlX3Jlc3Rfb2ZfbGluZS4gICovCi0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGkgPSAwOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJwotCSAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXHQnKQotCXsKLQkgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICsraTsKLQl9Ci0gICAgICBvYnN0YWNrXzFncm93ICgmbm90ZXMsICdcMCcpOwotICAgICAgZmlsZW5hbWUgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHBhdGggPSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgaSArIGluY2x1ZGVfZGlyX21heGxlbiArIDUgLyogc2xvcCAqLyApOwotICBmb3IgKGkgPSAwOyBpIDwgaW5jbHVkZV9kaXJfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzdHJjcHkgKHBhdGgsIGluY2x1ZGVfZGlyc1tpXSk7Ci0gICAgICBzdHJjYXQgKHBhdGgsICIvIik7Ci0gICAgICBzdHJjYXQgKHBhdGgsIGZpbGVuYW1lKTsKLSAgICAgIGlmICgwICE9ICh0cnkgPSBmb3BlbiAocGF0aCwgInIiKSkpCi0JewotCSAgZmNsb3NlICh0cnkpOwotCSAgZ290byBnb3RpdDsKLQl9Ci0gICAgfQotICBmcmVlIChwYXRoKTsKLSAgcGF0aCA9IGZpbGVuYW1lOwotZ290aXQ6Ci0gIC8qIG1hbGxvYyBTdG9yYWdlIGxlYWsgd2hlbiBmaWxlIGlzIGZvdW5kIG9uIHBhdGguICBGSVhNRS1TT01FREFZLiAqLwotICByZWdpc3Rlcl9kZXBlbmRlbmN5IChwYXRoKTsKLSAgaW5wdXRfc2NydWJfaW5zZXJ0X2ZpbGUgKHBhdGgpOwotfQkJCQkvKiBzX2luY2x1ZGUoKSAqLwotCi12b2lkIAotYWRkX2luY2x1ZGVfZGlyIChwYXRoKQotICAgICBjaGFyICpwYXRoOwotewotICBpbnQgaTsKLQotICBpZiAoaW5jbHVkZV9kaXJfY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBpbmNsdWRlX2RpcnMgPSAoY2hhciAqKikgeG1hbGxvYyAoMiAqIHNpemVvZiAoKmluY2x1ZGVfZGlycykpOwotICAgICAgaW5jbHVkZV9kaXJzWzBdID0gIi4iOwkvKiBDdXJyZW50IGRpciAqLwotICAgICAgaW5jbHVkZV9kaXJfY291bnQgPSAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluY2x1ZGVfZGlyX2NvdW50Kys7Ci0gICAgICBpbmNsdWRlX2RpcnMgPSAoY2hhciAqKikgcmVhbGxvYyAoaW5jbHVkZV9kaXJzLAotCQkJCWluY2x1ZGVfZGlyX2NvdW50ICogc2l6ZW9mICgqaW5jbHVkZV9kaXJzKSk7Ci0gICAgfQotCi0gIGluY2x1ZGVfZGlyc1tpbmNsdWRlX2Rpcl9jb3VudCAtIDFdID0gcGF0aDsJLyogTmV3IG9uZSAqLwotCi0gIGkgPSBzdHJsZW4gKHBhdGgpOwotICBpZiAoaSA+IGluY2x1ZGVfZGlyX21heGxlbikKLSAgICBpbmNsdWRlX2Rpcl9tYXhsZW4gPSBpOwotfQkJCQkvKiBhZGRfaW5jbHVkZV9kaXIoKSAqLwotDAotLyogT3V0cHV0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgdGhlIHNvdXJjZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2ZpbGVfZGVidWcgKCkKLXsKLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfU1RBQlMpCi0gICAgc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUgKCk7Ci19Ci0KLS8qIE91dHB1dCBsaW5lIG51bWJlciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IHNvdXJjZSBsaW5lLiAgKi8KLQotdm9pZAotZ2VuZXJhdGVfbGluZW5vX2RlYnVnICgpCi17Ci0jaWZkZWYgRUNPRkZfREVCVUdHSU5HCi0gIC8qIEVDT0ZGIGFzc2VtYmxlcnMgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIAotICAgICBGSVhNRTogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgaGFuZGxlZCBlbHNld2hlcmUuICAqLwotICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19VTlNQRUNJRklFRCkKLSAgICB7Ci0gICAgICBpZiAoRUNPRkZfREVCVUdHSU5HICYmIGVjb2ZmX25vX2N1cnJlbnRfZmlsZSAoKSkKLSAgICAgICAgZGVidWdfdHlwZSA9IERFQlVHX0VDT0ZGOwotICAgICAgZWxzZQotCWRlYnVnX3R5cGUgPSBERUJVR19OT05FOwotICAgIH0KLSNlbmRpZgotCi0gIHN3aXRjaCAoZGVidWdfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19VTlNQRUNJRklFRDoKLSAgICBjYXNlIERFQlVHX05PTkU6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1NUQUJTOgotICAgICAgc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfRUNPRkY6Ci0gICAgICBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19EV0FSRjoKLSAgICBjYXNlIERFQlVHX0RXQVJGMjoKLSAgICAgIC8qIEZJWE1FLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogT3V0cHV0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBtYXJrIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgb3IgZW5kIHBvaW50LgotICAgRU5EX1AgaXMgemVybyBmb3IgLmZ1bmMsIGFuZCBub24temVybyBmb3IgLmVuZGZ1bmMuICAqLwotCi12b2lkCi1zX2Z1bmMgKGVuZF9wKQotICAgICBpbnQgZW5kX3A7Ci17Ci0gIGRvX3NfZnVuYyAoZW5kX3AsIE5VTEwpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIHNfZnVuYyBzbyB0YXJnZXRzIGNhbiBjaG9vc2UgYSBkaWZmZXJlbnQgZGVmYXVsdCBwcmVmaXguCi0gICBJZiBERUZBVUxUX1BSRUZJWCBpcyBOVUxMLCB1c2UgdGhlIHRhcmdldCdzICJsZWFkaW5nIGNoYXIiLiAgKi8KLQotdm9pZAotZG9fc19mdW5jIChlbmRfcCwgZGVmYXVsdF9wcmVmaXgpCi0gICAgIGludCBlbmRfcDsKLSAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9wcmVmaXg7Ci17Ci0gIC8qIFJlY29yZCB0aGUgY3VycmVudCBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlIGZvcgotICAgICBtaXNwbGFjZWQgLmZ1bmMsLmVuZGZ1bmMsIGFuZCBhbHNvIHNvIHRoYXQgLmVuZGZ1bmMgbmVlZHMgbm8KLSAgICAgYXJndW1lbnRzLiAgKi8KLSAgc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKLSAgc3RhdGljIGNoYXIgKmN1cnJlbnRfbGFiZWw7Ci0KLSAgaWYgKGVuZF9wKQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X25hbWUgPT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgLmZ1bmMiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfU1RBQlMpCi0Jc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMgKGN1cnJlbnRfbmFtZSwgY3VycmVudF9sYWJlbCk7Ci0KLSAgICAgIGN1cnJlbnRfbmFtZSA9IGN1cnJlbnRfbGFiZWwgPSBOVUxMOwotICAgIH0KLSAgZWxzZSAvKiAhIGVuZF9wICovCi0gICAgewotICAgICAgY2hhciAqbmFtZSwqbGFiZWw7Ci0gICAgICBjaGFyIGRlbGltMSxkZWxpbTI7Ci0KLSAgICAgIGlmIChjdXJyZW50X25hbWUgIT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oIi5lbmRmdW5jIG1pc3NpbmcgZm9yIHByZXZpb3VzIC5mdW5jIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZWxpbTEgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIG5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBkZWxpbTE7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JewotCSAgaWYgKGRlZmF1bHRfcHJlZml4KQotCSAgICBhc3ByaW50ZiAoJmxhYmVsLCAiJXMlcyIsIGRlZmF1bHRfcHJlZml4LCBuYW1lKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgbGVhZGluZ19jaGFyID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgICAgbGVhZGluZ19jaGFyID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChzdGRvdXRwdXQpOwotI2VuZGlmCi0JICAgICAgLyogTWlzc2luZyBlbnRyeSBwb2ludCwgdXNlIGZ1bmN0aW9uJ3MgbmFtZSB3aXRoIHRoZSBsZWFkaW5nCi0JCSBjaGFyIHByZXBlbmRlZC4gICovCi0JICAgICAgaWYgKGxlYWRpbmdfY2hhcikKLQkJYXNwcmludGYgKCZsYWJlbCwgIiVjJXMiLCBsZWFkaW5nX2NoYXIsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJbGFiZWwgPSBuYW1lOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgbGFiZWwgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBkZWxpbTIgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGxhYmVsID0geHN0cmR1cCAobGFiZWwpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGRlbGltMjsKLQl9Ci0KLSAgICAgIGlmIChkZWJ1Z190eXBlID09IERFQlVHX1NUQUJTKQotCXN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jIChuYW1lLCBsYWJlbCk7Ci0KLSAgICAgIGN1cnJlbnRfbmFtZSA9IG5hbWU7Ci0gICAgICBjdXJyZW50X2xhYmVsID0gbGFiZWw7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi12b2lkIAotc19pZ25vcmUgKGFyZykKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0KLXZvaWQKLXJlYWRfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAicHNldWRvLW9wIHRhYmxlIiwgcG9faGFzaCk7Ci19Ci0KLS8qIEluc2VydHMgdGhlIGdpdmVuIGxpbmUgaW50byB0aGUgaW5wdXQgc3RyZWFtLiAgCi0gICAKLSAgIFRoaXMgY2FsbCBhdm9pZHMgbWFjcm8vY29uZGl0aW9uYWxzIG5lc3RpbmcgY2hlY2tpbmcsIHNpbmNlIHRoZSBjb250ZW50cyBvZgotICAgdGhlIGxpbmUgYXJlIGFzc3VtZWQgdG8gcmVwbGFjZSB0aGUgY29udGVudHMgb2YgYSBsaW5lIGFscmVhZHkgc2Nhbm5lZC4KLQotICAgQW4gYXBwcm9wcmlhdGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24gd291bGQgYmUgc3Vic3RpdGlvbiBvZiBpbnB1dCBsaW5lcyB3aGVuCi0gICBjYWxsZWQgYnkgbWRfc3RhcnRfbGluZV9ob29rKCkuICBUaGUgZ2l2ZW4gbGluZSBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUKLSAgIHByb3Blcmx5IHNjcnViYmVkLiAgKi8KLQotdm9pZAotaW5wdXRfc2NydWJfaW5zZXJ0X2xpbmUgKGxpbmUpCi0gIGNvbnN0IGNoYXIgKmxpbmU7Ci17Ci0gIHNiIG5ld2xpbmU7Ci0gIHNiX25ldyAoJm5ld2xpbmUpOwotICBzYl9hZGRfc3RyaW5nICgmbmV3bGluZSwgbGluZSk7Ci0gIGlucHV0X3NjcnViX2luY2x1ZGVfc2IgKCZuZXdsaW5lLCBpbnB1dF9saW5lX3BvaW50ZXIsIDApOwotICBzYl9raWxsICgmbmV3bGluZSk7Ci0gIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLX0KLQotLyogSW5zZXJ0IGEgZmlsZSBpbnRvIHRoZSBpbnB1dCBzdHJlYW07IHRoZSBwYXRoIG11c3QgcmVzb2x2ZSB0byBhbiBhY3R1YWwKLSAgIGZpbGU7IG5vIGluY2x1ZGUgcGF0aCBzZWFyY2hpbmcgb3IgZGVwZW5kZW5jeSByZWdpc3RlcmluZyBpcyBwZXJmb3JtZWQuICAqLyAKLQotdm9pZAotaW5wdXRfc2NydWJfaW5zZXJ0X2ZpbGUgKHBhdGgpCi0gIGNoYXIgKnBhdGg7Ci17Ci0gIGlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSAocGF0aCwgaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQotCi0vKiBlbmQgb2YgcmVhZC5jICovCmRpZmYgLS1naXQgYS9nYXMvcmVhZC5oIGIvZ2FzL3JlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxYjU5Yi4uMDAwMDAwMAotLS0gYS9nYXMvcmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qIHJlYWQuaCAtIG9mIHJlYWQuYwotICAgQ29weXJpZ2h0IChDKSAxOTg2LCA5MCwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1leHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOy8qIC0+IGNoYXIgd2UgYXJlIHBhcnNpbmcgbm93LiAqLwotCi0jZGVmaW5lIFBFUk1JVF9XSElURVNQQUNFCS8qIERlZmluZSB0byBtYWtlIHdoaXRlc3BhY2UgYmUgYWxsb3dlZCBpbiAqLwotLyogbWFueSBzeW50YWN0aWNhbGx5IHVubmVjZXNzYXJ5IHBsYWNlcy4gKi8KLS8qIE5vcm1hbGx5IHVuZGVmaW5lZC4gRm9yIGNvbXBhdGliaWxpdHkgKi8KLS8qIHdpdGggYW5jaWVudCBHTlUgY2MuICovCi0vKiAjdW5kZWYgUEVSTUlUX1dISVRFU1BBQ0UgKi8KLQotI2lmZGVmIFBFUk1JVF9XSElURVNQQUNFCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRSgpIHtpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnKSArKyBpbnB1dF9saW5lX3BvaW50ZXI7fQotI2Vsc2UKLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFKCkga25vdygqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyApCi0jZW5kaWYKLQotCi0jZGVmaW5lCUxFWF9OQU1FCSgxKQkvKiBtYXkgY29udGludWUgYSBuYW1lICovCi0jZGVmaW5lIExFWF9CRUdJTl9OQU1FCSgyKQkvKiBtYXkgYmVnaW4gYSBuYW1lICovCi0jZGVmaW5lIExFWF9FTkRfTkFNRQkoNCkJLyogZW5kcyBhIG5hbWUgKi8KLQotI2RlZmluZSBpc19uYW1lX2JlZ2lubmVyKGMpIFwKLSAgKCBsZXhfdHlwZVsodW5zaWduZWQgY2hhcikgKGMpXSAmIExFWF9CRUdJTl9OQU1FICkKLSNkZWZpbmUgaXNfcGFydF9vZl9uYW1lKGMpIFwKLSAgKCBsZXhfdHlwZVsodW5zaWduZWQgY2hhcikgKGMpXSAmIExFWF9OQU1FICAgICAgICkKLSNkZWZpbmUgaXNfbmFtZV9lbmRlcihjKSBcCi0gICggbGV4X3R5cGVbKHVuc2lnbmVkIGNoYXIpIChjKV0gJiBMRVhfRU5EX05BTUUgICApCi0KLSNpZm5kZWYgaXNfYV9jaGFyCi0jZGVmaW5lIENIQVJfTUFTSwkoMHhmZikKLSNkZWZpbmUgTk9UX0FfQ0hBUgkoQ0hBUl9NQVNLKzEpCi0jZGVmaW5lIGlzX2FfY2hhcihjKQkoKCh1bnNpZ25lZCkoYykpIDw9IENIQVJfTUFTSykKLSNlbmRpZiAvKiBpc19hX2NoYXIoKSAqLwotCi1leHRlcm4gY2hhciBsZXhfdHlwZVtdOwotZXh0ZXJuIGNoYXIgaXNfZW5kX29mX2xpbmVbXTsKLQotZXh0ZXJuIGludCBpc19pdF9lbmRfb2Zfc3RhdGVtZW50IFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLQotLyogVGhlc2UgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBDUFUgc3BlY2lmaWMgdGFyZ2V0IGZpbGVzICh0Yy0qLmMpLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXTsKLWV4dGVybiBjb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdOwotZXh0ZXJuIGNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXTsKLQotLyogVGFibGUgb2YgLUkgZGlyZWN0b3JpZXMuICAqLwotZXh0ZXJuIGNoYXIgKippbmNsdWRlX2RpcnM7Ci1leHRlcm4gaW50IGluY2x1ZGVfZGlyX2NvdW50OwotZXh0ZXJuIGludCBpbmNsdWRlX2Rpcl9tYXhsZW47Ci0KLS8qIFRoZSBvZmZzZXQgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uICAqLwotZXh0ZXJuIGFkZHJlc3NUIGFic19zZWN0aW9uX29mZnNldDsKLQotLyogVGhlIGxhYmVsIG9uIGEgbGluZSwgdXNlZCBieSBzb21lIG9mIHRoZSBwc2V1ZG8tb3BzLiAgKi8KLWV4dGVybiBzeW1ib2xTICpsaW5lX2xhYmVsOwotCi0vKiBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBNUkkgY29tbW9uIHNlY3Rpb25zLiAgKi8KLWV4dGVybiBzeW1ib2xTICptcmlfY29tbW9uX3N5bWJvbDsKLQotLyogUG9zc2libGUgYXJndW1lbnRzIHRvIC5saW5rb25jZS4gICovCi1lbnVtIGxpbmtvbmNlX3R5cGUKLXsKLSAgTElOS09OQ0VfVU5TRVQgPSAwLAotICBMSU5LT05DRV9ESVNDQVJELAotICBMSU5LT05DRV9PTkVfT05MWSwKLSAgTElOS09OQ0VfU0FNRV9TSVpFLAotICBMSU5LT05DRV9TQU1FX0NPTlRFTlRTCi19OwotCi1leHRlcm4gdm9pZCBwb3BfaW5zZXJ0IFBBUkFNUyAoKGNvbnN0IHBzZXVkb190eXBlUyAqKSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGdldF9zdGFiX3N0cmluZ19vZmZzZXQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpzdGFic3RyX3NlY25hbWUpKTsKLWV4dGVybiBjaGFyICpkZW1hbmRfY29weV9DX3N0cmluZyBQQVJBTVMgKChpbnQgKmxlbl9wb2ludGVyKSk7Ci1leHRlcm4gY2hhciBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvcgotICBQQVJBTVMgKChsb25nICp2YWxfcG9pbnRlcikpOwotZXh0ZXJuIG9mZnNldFQgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZXh0X2NoYXJfb2Zfc3RyaW5nIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHNfbXJpX3NlY3QgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gY2hhciAqbXJpX2NvbW1lbnRfZmllbGQgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBtcmlfY29tbWVudF9lbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGFkZF9pbmNsdWRlX2RpciBQQVJBTVMgKChjaGFyICpwYXRoKSk7Ci1leHRlcm4gdm9pZCBjb25zIFBBUkFNUyAoKGludCBuYnl0ZXMpKTsKLWV4dGVybiB2b2lkIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZW1pdF9leHByIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHAsIHVuc2lnbmVkIGludCBuYnl0ZXMpKTsKLWV4dGVybiB2b2lkIGVtaXRfbGViMTI4X2V4cHIgUEFSQU1TICgoZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBlcXVhbHMgUEFSQU1TICgoY2hhciAqc3ltX25hbWUsIGludCByZWFzc2lnbikpOwotZXh0ZXJuIHZvaWQgZmxvYXRfY29ucyBQQVJBTVMgKChpbnQgZmxvYXRfdHlwZSkpOwotZXh0ZXJuIHZvaWQgaWdub3JlX3Jlc3Rfb2ZfbGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gaW50IG91dHB1dF9sZWIxMjggUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCBzaWduKSk7Ci1leHRlcm4gdm9pZCBwc2V1ZG9fc2V0IFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci1leHRlcm4gdm9pZCByZWFkX2Ffc291cmNlX2ZpbGUgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgcmVhZF9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCByZWFkX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gaW50IHNpemVvZl9sZWIxMjggUEFSQU1TICgodmFsdWVULCBpbnQgc2lnbikpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzdGFic19nZW5lcmF0ZV9hc21fZnVuYyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRvX3JlcGVhdCBQQVJBTVMoKGludCxjb25zdCBjaGFyICosY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBlbmRfcmVwZWF0IFBBUkFNUygoaW50KSk7Ci0KLWV4dGVybiB2b2lkIGdlbmVyYXRlX2xpbmVub19kZWJ1ZyBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIHNfYWJvcnQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2FsaWduX2J5dGVzIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfYWxpZ25fcHR3byBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfYXBwX2ZpbGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2FwcF9saW5lIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19jb21tIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19kYXRhIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19kZXNjIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19lbHNlIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfZWxzZWlmIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfZW5kIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfZW5kaWYgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19lcnIgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2ZhaWwgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2ZpbGwgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2Zsb2F0X3NwYWNlIFBBUkFNUyAoKGludCBtdWx0KSk7Ci1leHRlcm4gdm9pZCBzX2Z1bmMgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBkb19zX2Z1bmMgUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHNfZ2xvYmwgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZiBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lmYyBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lmZGVmIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWZlcXMgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZ25vcmUgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pbmNsdWRlIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaXJwIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfbGNvbW0gUEFSQU1TICgoaW50IG5lZWRzX2FsaWduKSk7Ci1leHRlcm4gdm9pZCBzX2xjb21tX2J5dGVzIFBBUkFNUyAoKGludCBuZWVkc19hbGlnbikpOwotZXh0ZXJuIHZvaWQgc19sZWIxMjggUEFSQU1TICgoaW50IHNpZ24pKTsKLWV4dGVybiB2b2lkIHNfbGlua29uY2UgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2xzeW0gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX21hY3JvIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19tZXhpdCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbXJpIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19tcmlfY29tbW9uIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19vcmcgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3ByaW50IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19wdXJnZW0gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3JlcHQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3NldCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfc3BhY2UgUEFSQU1TICgoaW50IG11bHQpKTsKLWV4dGVybiB2b2lkIHNfc3RhYiBQQVJBTVMgKChpbnQgd2hhdCkpOwotZXh0ZXJuIHZvaWQgc19zdHJ1Y3QgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3RleHQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzdHJpbmdlciBQQVJBTVMgKChpbnQgYXBwZW5kX3plcm8pKTsKLWV4dGVybiB2b2lkIHNfeHN0YWIgUEFSQU1TICgoaW50IHdoYXQpKTsKLWV4dGVybiB2b2lkIHNfcnZhIFBBUkFNUyAoKGludCkpOwotCi0vKiBlbmQgb2YgcmVhZC5oICovCmRpZmYgLS1naXQgYS9nYXMvc2IuYyBiL2dhcy9zYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWMyM2ZjLi4wMDAwMDAwCi0tLSBhL2dhcy9zYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qIHNiLmMgLSBzdHJpbmcgYnVmZmVyIG1hbmlwdWxhdGlvbiByb3V0aW5lcwotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNiLmgiCi0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSBhYm91dCBtYW5pcHVsYXRpbmcgc3RyaW5ncy4KLQotICAgVGhleSBhcmUgbWFuYWdlZCBpbiB0aGluZ3MgY2FsbGVkIGBzYidzIHdoaWNoIGlzIGFuIGFiYnJldmlhdGlvbgotICAgZm9yIHN0cmluZyBidWZmZXJzLiAgQW4gc2IgaGFzIHRvIGJlIGNyZWF0ZWQsIHRoaW5ncyBjYW4gYmUgZ2x1ZWQKLSAgIG9uIHRvIGl0LCBhbmQgYXQgdGhlIGVuZCBvZiBpdCdzIGxpZmUgaXQgc2hvdWxkIGJlIGZyZWVkLiAgVGhlCi0gICBjb250ZW50cyBzaG91bGQgbmV2ZXIgYmUgcG9pbnRlZCBhdCB3aGlsc3QgaXQgaXMgc3RpbGwgZ3Jvd2luZywKLSAgIHNpbmNlIGl0IGNvdWxkIGJlIG1vdmVkIGF0IGFueSB0aW1lCi0KLSAgIGVnOgotICAgc2JfbmV3ICgmZm9vKTsKLSAgIHNiX2dyb3cuLi4gKCZmb28sLi4uKTsKLSAgIHVzZSBmb28tPnB0clsqXTsKLSAgIHNiX2tpbGwgKCZmb28pOwotCi0qLwotCi0jZGVmaW5lIGRzaXplIDUKLQotc3RhdGljIHZvaWQgc2JfY2hlY2sgUEFSQU1TICgoc2IgKiwgaW50KSk7Ci0KLS8qIFN0YXRpc3RpY3Mgb2Ygc2Igc3RydWN0dXJlcy4gICovCi0KLWludCBzdHJpbmdfY291bnRbc2JfbWF4X3Bvd2VyX3R3b107Ci0KLS8qIEZyZWUgbGlzdCBvZiBzYiBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RhdGljIHNiX2xpc3RfdmVjdG9yIGZyZWVfbGlzdDsKLQotLyogaW5pdGlhbGl6ZXMgYW4gc2IuICovCi0KLXZvaWQKLXNiX2J1aWxkIChwdHIsIHNpemUpCi0gICAgIHNiICpwdHI7Ci0gICAgIGludCBzaXplOwotewotICAvKiBzZWUgaWYgd2UgY2FuIGZpbmQgb25lIHRvIGFsbG9jYXRlICovCi0gIHNiX2VsZW1lbnQgKmU7Ci0KLSAgaWYgKHNpemUgPiBzYl9tYXhfcG93ZXJfdHdvKQotICAgIGFib3J0ICgpOwotCi0gIGUgPSBmcmVlX2xpc3Quc2l6ZVtzaXplXTsKLSAgaWYgKCFlKQotICAgIHsKLSAgICAgIC8qIG5vdGhpbmcgdGhlcmUsIGFsbG9jYXRlIG9uZSBhbmQgc3RpY2sgaW50byB0aGUgZnJlZSBsaXN0ICovCi0gICAgICBlID0gKHNiX2VsZW1lbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChzYl9lbGVtZW50KSArICgxIDw8IHNpemUpKTsKLSAgICAgIGUtPm5leHQgPSBmcmVlX2xpc3Quc2l6ZVtzaXplXTsKLSAgICAgIGUtPnNpemUgPSAxIDw8IHNpemU7Ci0gICAgICBmcmVlX2xpc3Quc2l6ZVtzaXplXSA9IGU7Ci0gICAgICBzdHJpbmdfY291bnRbc2l6ZV0rKzsKLSAgICB9Ci0KLSAgLyogcmVtb3ZlIGZyb20gZnJlZSBsaXN0ICovCi0KLSAgZnJlZV9saXN0LnNpemVbc2l6ZV0gPSBlLT5uZXh0OwotCi0gIC8qIGNvcHkgaW50byBjYWxsZXJzIHdvcmxkICovCi0gIHB0ci0+cHRyID0gZS0+ZGF0YTsKLSAgcHRyLT5wb3QgPSBzaXplOwotICBwdHItPmxlbiA9IDA7Ci0gIHB0ci0+aXRlbSA9IGU7Ci19Ci0KLQotdm9pZAotc2JfbmV3IChwdHIpCi0gICAgIHNiICpwdHI7Ci17Ci0gIHNiX2J1aWxkIChwdHIsIGRzaXplKTsKLX0KLQotLyogZGVhbGxvY2F0ZSB0aGUgc2IgYXQgcHRyICovCi0KLXZvaWQKLXNiX2tpbGwgKHB0cikKLSAgICAgc2IgKnB0cjsKLXsKLSAgLyogcmV0dXJuIGl0ZW0gdG8gZnJlZSBsaXN0ICovCi0gIHB0ci0+aXRlbS0+bmV4dCA9IGZyZWVfbGlzdC5zaXplW3B0ci0+cG90XTsKLSAgZnJlZV9saXN0LnNpemVbcHRyLT5wb3RdID0gcHRyLT5pdGVtOwotfQotCi0vKiBhZGQgdGhlIHNiIGF0IHMgdG8gdGhlIGVuZCBvZiB0aGUgc2IgYXQgcHRyICovCi0KLXZvaWQKLXNiX2FkZF9zYiAocHRyLCBzKQotICAgICBzYiAqcHRyOwotICAgICBzYiAqczsKLXsKLSAgc2JfY2hlY2sgKHB0ciwgcy0+bGVuKTsKLSAgbWVtY3B5IChwdHItPnB0ciArIHB0ci0+bGVuLCBzLT5wdHIsIHMtPmxlbik7Ci0gIHB0ci0+bGVuICs9IHMtPmxlbjsKLX0KLQotLyogbWFrZSBzdXJlIHRoYXQgdGhlIHNiIGF0IHB0ciBoYXMgcm9vbSBmb3IgYW5vdGhlciBsZW4gY2hhcmFjdGVycywKLSAgIGFuZCBncm93IGl0IGlmIGl0IGRvZXNuJ3QuICovCi0KLXN0YXRpYyB2b2lkCi1zYl9jaGVjayAocHRyLCBsZW4pCi0gICAgIHNiICpwdHI7Ci0gICAgIGludCBsZW47Ci17Ci0gIGlmIChwdHItPmxlbiArIGxlbiA+PSAxIDw8IHB0ci0+cG90KQotICAgIHsKLSAgICAgIHNiIHRtcDsKLSAgICAgIGludCBwb3QgPSBwdHItPnBvdDsKLSAgICAgIHdoaWxlIChwdHItPmxlbiArIGxlbiA+PSAxIDw8IHBvdCkKLQlwb3QrKzsKLSAgICAgIHNiX2J1aWxkICgmdG1wLCBwb3QpOwotICAgICAgc2JfYWRkX3NiICgmdG1wLCBwdHIpOwotICAgICAgc2Jfa2lsbCAocHRyKTsKLSAgICAgICpwdHIgPSB0bXA7Ci0gICAgfQotfQotCi0vKiBtYWtlIHRoZSBzYiBhdCBwdHIgcG9pbnQgYmFjayB0byB0aGUgYmVnaW5uaW5nLiAgKi8KLQotdm9pZAotc2JfcmVzZXQgKHB0cikKLSAgICAgc2IgKnB0cjsKLXsKLSAgcHRyLT5sZW4gPSAwOwotfQotCi0vKiBhZGQgY2hhcmFjdGVyIGMgdG8gdGhlIGVuZCBvZiB0aGUgc2IgYXQgcHRyLiAqLwotCi12b2lkCi1zYl9hZGRfY2hhciAocHRyLCBjKQotICAgICBzYiAqcHRyOwotICAgICBpbnQgYzsKLXsKLSAgc2JfY2hlY2sgKHB0ciwgMSk7Ci0gIHB0ci0+cHRyW3B0ci0+bGVuKytdID0gYzsKLX0KLQotLyogYWRkIG51bGwgdGVybWluYXRlZCBzdHJpbmcgcyB0byB0aGUgZW5kIG9mIHNiIGF0IHB0ci4gKi8KLQotdm9pZAotc2JfYWRkX3N0cmluZyAocHRyLCBzKQotICAgICBzYiAqcHRyOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpbnQgbGVuID0gc3RybGVuIChzKTsKLSAgc2JfY2hlY2sgKHB0ciwgbGVuKTsKLSAgbWVtY3B5IChwdHItPnB0ciArIHB0ci0+bGVuLCBzLCBsZW4pOwotICBwdHItPmxlbiArPSBsZW47Ci19Ci0KLS8qIGFkZCBzdHJpbmcgYXQgcyBvZiBsZW5ndGggbGVuIHRvIHNiIGF0IHB0ciAqLwotCi12b2lkCi1zYl9hZGRfYnVmZmVyIChwdHIsIHMsIGxlbikKLSAgICAgc2IgKnB0cjsKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IGxlbjsKLXsKLSAgc2JfY2hlY2sgKHB0ciwgbGVuKTsKLSAgbWVtY3B5IChwdHItPnB0ciArIHB0ci0+bGVuLCBzLCBsZW4pOwotICBwdHItPmxlbiArPSBsZW47Ci19Ci0KLS8qIHByaW50IHRoZSBzYiBhdCBwdHIgdG8gdGhlIG91dHB1dCBmaWxlICovCi0KLXZvaWQKLXNiX3ByaW50IChvdXRmaWxlLCBwdHIpCi0gICAgIEZJTEUgKm91dGZpbGU7Ci0gICAgIHNiICpwdHI7Ci17Ci0gIGludCBpOwotICBpbnQgbmMgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBwdHItPmxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChuYykKLQl7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiLCIpOwotCX0KLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlZCIsIHB0ci0+cHRyW2ldKTsKLSAgICAgIG5jID0gMTsKLSAgICB9Ci19Ci0KLXZvaWQgCi1zYl9wcmludF9hdCAob3V0ZmlsZSwgaWR4LCBwdHIpCi0gICAgIEZJTEUgKm91dGZpbGU7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICpwdHI7Ci17Ci0gIGludCBpOwotICBmb3IgKGkgPSBpZHg7IGkgPCBwdHItPmxlbjsgaSsrKQotICAgIHB1dGMgKHB0ci0+cHRyW2ldLCBvdXRmaWxlKTsKLX0KLQotLyogcHV0IGEgbnVsbCBhdCB0aGUgZW5kIG9mIHRoZSBzYiBhdCBpbiBhbmQgcmV0dXJuIHRoZSBzdGFydCBvZiB0aGUKLSAgIHN0cmluZywgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhbiBhcmcgdG8gcHJpbnRmICVzLiAqLwotCi1jaGFyICoKLXNiX25hbWUgKGluKQotICAgICBzYiAqaW47Ci17Ci0gIC8qIHN0aWNrIGEgbnVsbCBvbiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KLSAgc2JfYWRkX2NoYXIgKGluLCAwKTsKLSAgcmV0dXJuIGluLT5wdHI7Ci19Ci0KLS8qIGxpa2Ugc2JfbmFtZSwgYnV0IGRvbid0IGluY2x1ZGUgdGhlIG51bGwgYnl0ZSBpbiB0aGUgc3RyaW5nLiAgKi8KLQotY2hhciAqCi1zYl90ZXJtaW5hdGUgKGluKQotICAgICBzYiAqaW47Ci17Ci0gIHNiX2FkZF9jaGFyIChpbiwgMCk7Ci0gIC0taW4tPmxlbjsKLSAgcmV0dXJuIGluLT5wdHI7Ci19Ci0KLS8qIHN0YXJ0IGF0IHRoZSBpbmRleCBpZHggaW50byB0aGUgc3RyaW5nIGluIHNiIGF0IHB0ciBhbmQgc2tpcAotICAgd2hpdGVzcGFjZS4gcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uIHdoaXRlc3BhY2UgY2hhcmFjdGVyICovCi0KLWludAotc2Jfc2tpcF93aGl0ZSAoaWR4LCBwdHIpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpwdHI7Ci17Ci0gIHdoaWxlIChpZHggPCBwdHItPmxlbgotCSAmJiAocHRyLT5wdHJbaWR4XSA9PSAnICcKLQkgICAgIHx8IHB0ci0+cHRyW2lkeF0gPT0gJ1x0JykpCi0gICAgaWR4Kys7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIHN0YXJ0IGF0IHRoZSBpbmRleCBpZHggaW50byB0aGUgc2IgYXQgcHRyLiBza2lwcyB3aGl0ZXNwYWNlLAotICAgYSBjb21tYSBhbmQgYW55IGZvbGxvd2luZyB3aGl0ZXNwYWNlLiByZXR1cm5lcyB0aGUgaW5kZXggb2YgdGhlCi0gICBuZXh0IGNoYXJhY3Rlci4gKi8KLQotaW50Ci1zYl9za2lwX2NvbW1hIChpZHgsIHB0cikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnB0cjsKLXsKLSAgd2hpbGUgKGlkeCA8IHB0ci0+bGVuCi0JICYmIChwdHItPnB0cltpZHhdID09ICcgJwotCSAgICAgfHwgcHRyLT5wdHJbaWR4XSA9PSAnXHQnKSkKLSAgICBpZHgrKzsKLQotICBpZiAoaWR4IDwgcHRyLT5sZW4KLSAgICAgICYmIHB0ci0+cHRyW2lkeF0gPT0gJywnKQotICAgIGlkeCsrOwotCi0gIHdoaWxlIChpZHggPCBwdHItPmxlbgotCSAmJiAocHRyLT5wdHJbaWR4XSA9PSAnICcKLQkgICAgIHx8IHB0ci0+cHRyW2lkeF0gPT0gJ1x0JykpCi0gICAgaWR4Kys7Ci0KLSAgcmV0dXJuIGlkeDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9zYi5oIGIvZ2FzL3NiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYWVkMjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3NiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKiBzYi5oIC0gaGVhZGVyIGZpbGUgZm9yIHN0cmluZyBidWZmZXIgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCi0gICAgICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZm5kZWYgU0JfSAotCi0jZGVmaW5lIFNCX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogc3RyaW5nIGJsb2NrcwotCi0gICBJIGhhZCBhIGNvdXBsZSBvZiBjaG9pY2VzIHdoZW4gZGVjaWRpbmcgdXBvbiB0aGlzIGRhdGEgc3RydWN0dXJlLgotICAgZ2FzIHVzZXMgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MgZm9yIGFsbCBpdHMgaW50ZXJuYWwgd29yay4gIFRoaXMKLSAgIG9mdGVuIG1lYW5zIHRoYXQgcGFydHMgb2YgdGhlIHByb2dyYW0gdGhhdCB3YW50IHRvIGV4YW1pbmUKLSAgIHN1YnN0cmluZ3MgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBkYXRhIGluIHRoZSBzdHJpbmcgdG8gZG8gdGhlCi0gICByaWdodCB0aGluZyAoYSBjb21tb24gb3BlcmF0aW9uIGlzIHRvIHNpbmdsZSBvdXQgYSBiaXQgb2YgdGV4dCBieQotICAgc2F2aW5nIGF3YXkgdGhlIGNoYXJhY3RlciBhZnRlciBpdCwgbnVsbGluZyBpdCBvdXQsIG9wZXJhdGluZyBvbgotICAgdGhlIHN1YnN0cmluZyBhbmQgdGhlbiByZXBsYWNpbmcgdGhlIGNoYXJhY3RlciB3aGljaCB3YXMgdW5kZXIgdGhlCi0gICBudWxsKS4gIFRoaXMgaXMgYSBwYWluIGFuZCBJIHJlbWVtYmVyIGEgbG9hZCBvZiBwcm9ibGVtcyB0aGF0IEkgaGFkIHdpdGgKLSAgIGNvZGUgaW4gZ2FzIHdoaWNoIGFsbW9zdCBnb3QgdGhpcyByaWdodC4gIEFsc28sIGl0J3MgaGFyZGVyIHRvIGdyb3cgYW5kCi0gICBhbGxvY2F0ZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyBlZmZpY2llbnRseS4KLQotICAgT2JzdGFja3MgcHJvdmlkZSBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgbmVlZGVkLCBidXQgYXJlIHRvbwotICAgY29tcGxpY2F0ZWQsIGhlbmNlIHRoZSBzYi4KLQotICAgQW4gc2IgaXMgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIsIGFuZCBpcyBpbml0aWFsemVkIHRvIHBvaW50IHRvIGFuCi0gICBzYl9lbGVtZW50LiAgc2JfZWxlbWVudHMgYXJlIGtlcHQgb24gYSBmcmVlIGxpc3RzLCBhbmQgdXNlZCB3aGVuCi0gICBuZWVkZWQsIHJlcGxhY2VkIG9udG8gdGhlIGZyZWUgbGlzdCB3aGVuIHVudXNlZC4KLSAqLwotCi0jZGVmaW5lIHNiX21heF9wb3dlcl90d28gICAgMzAJLyogZG9uJ3QgYWxsb3cgc3RyaW5ncyBtb3JlIHRoYW4KLQkJCSAgICAgICAgICAgMl5zYl9tYXhfcG93ZXJfdHdvIGxvbmcgKi8KLS8qIHN0cnVjdHVyZSBvZiBhbiBzYiAqLwotdHlwZWRlZiBzdHJ1Y3Qgc2IKLSAgewotICAgIGNoYXIgKnB0cjsJCQkvKiBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYmxvY2suICovCi0gICAgaW50IGxlbjsJCQkvKiBob3cgbXVjaCBpcyB1c2VkLiAqLwotICAgIGludCBwb3Q7CQkJLyogdGhlIG1heGltdW0gbGVuZ3RoIGlzIDE8PHBvdCAqLwotICAgIHN0cnVjdCBsZSAqaXRlbTsKLSAgfQotc2I7Ci0KLS8qIFN0cnVjdHVyZSBvZiB0aGUgZnJlZSBsaXN0IG9iamVjdCBvZiBhbiBzYiAqLwotdHlwZWRlZiBzdHJ1Y3QgbGUKLSAgewotICAgIHN0cnVjdCBsZSAqbmV4dDsKLSAgICBpbnQgc2l6ZTsKLSAgICBjaGFyIGRhdGFbMV07Ci0gIH0KLXNiX2VsZW1lbnQ7Ci0KLS8qIFRoZSBmcmVlIGxpc3QgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBzYl9lbGVtZW50ICpzaXplW3NiX21heF9wb3dlcl90d29dOwotICB9IHNiX2xpc3RfdmVjdG9yOwotCi1leHRlcm4gaW50IHN0cmluZ19jb3VudFtzYl9tYXhfcG93ZXJfdHdvXTsKLQotZXh0ZXJuIHZvaWQgc2JfYnVpbGQgUEFSQU1TICgoc2IgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBzYl9uZXcgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIHZvaWQgc2Jfa2lsbCBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9hZGRfc2IgUEFSQU1TICgoc2IgKiwgc2IgKikpOwotZXh0ZXJuIHZvaWQgc2JfcmVzZXQgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIHZvaWQgc2JfYWRkX2NoYXIgUEFSQU1TICgoc2IgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBzYl9hZGRfc3RyaW5nIFBBUkFNUyAoKHNiICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgc2JfYWRkX2J1ZmZlciBQQVJBTVMgKChzYiAqLCBjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgc2JfcHJpbnQgUEFSQU1TICgoRklMRSAqLCBzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9wcmludF9hdCBQQVJBTVMgKChGSUxFICosIGludCwgc2IgKikpOwotZXh0ZXJuIGNoYXIgKnNiX25hbWUgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIGNoYXIgKnNiX3Rlcm1pbmF0ZSBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gaW50IHNiX3NraXBfd2hpdGUgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1leHRlcm4gaW50IHNiX3NraXBfY29tbWEgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci0KLS8qIEFjdHVhbGx5IGluIGlucHV0LXNjcnViLmMuICAqLwotZXh0ZXJuIHZvaWQgaW5wdXRfc2NydWJfaW5jbHVkZV9zYiBQQVJBTVMgKChzYiAqLCBjaGFyICosIGludCkpOwotCi0jZW5kaWYgLyogU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N0YWJzLmMgYi9nYXMvc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxM2MyZi4uMDAwMDAwMAotLS0gYS9nYXMvc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDY1MSArMCwwIEBACi0vKiBHZW5lcmljIHN0YWJzIHBhcnNpbmcgZm9yIGdhcy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLS8qIFdlIG5lZWQgdGhpcywgZGVzcGl0ZSB0aGUgYXBwYXJlbnQgb2JqZWN0IGZvcm1hdCBkZXBlbmRlbmN5LCBzaW5jZQotICAgaXQgZGVmaW5lcyBzdGFiIHR5cGVzLCB3aGljaCBhbGwgb2JqZWN0IGZvcm1hdHMgY2FuIHVzZSBub3cuICovCi0KLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLXN0YXRpYyB2b2lkIHNfc3RhYl9nZW5lcmljIFBBUkFNUyAoKGludCwgY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX2FzbV9maWxlIFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci0KLS8qIEFsbG93IGJhY2tlbmRzIHRvIG92ZXJyaWRlIHRoZSBuYW1lcyB1c2VkIGZvciB0aGUgc3RhYiBzZWN0aW9ucy4gICovCi0jaWZuZGVmIFNUQUJfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU0VDVElPTl9OQU1FICIuc3RhYiIKLSNlbmRpZgotCi0jaWZuZGVmIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRQotI2RlZmluZSBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUgIi5zdGFic3RyIgotI2VuZGlmCi0KLS8qIE5vbi16ZXJvIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSAuZnVuYyBmdW5jdGlvbiwgaW4gd2hpY2ggY2FzZQotICAgc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyBlbWl0cyBmdW5jdGlvbiByZWxhdGl2ZSBsaW5lIG51bWJlciBzdGFicy4KLSAgIE90aGVyd2lzZSBpdCBlbWl0cyBsaW5lIG51bWJlciBzdGFicyB3aXRoIGFic29sdXRlIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdAotICAgYm90aCBjYXNlcyBvbmx5IGFwcGx5IHRvIGFzc2VtYmxlciBjb2RlIGFzc2VtYmxlZCB3aXRoIC1nc3RhYnMuICAqLwotc3RhdGljIGludCBpbl9kb3RfZnVuY19wOwotCi0vKiBMYWJlbCBhdCBzdGFydCBvZiBjdXJyZW50IGZ1bmN0aW9uIGlmIGluX2RvdF9mdW5jX3AgIT0gMC4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY3VycmVudF9mdW5jdGlvbl9sYWJlbDsKLQotLyoKLSAqIEhhbmRsZSAuc3RhYlggZGlyZWN0aXZlcywgd2hpY2ggdXNlZCB0byBiZSBvcGVuLWNvZGVkLgotICogU28gbXVjaCBjcmVlcGluZyBmZWF0dXJpc20gb3ZlcmxvYWRlZCB0aGUgc2VtYW50aWNzIHRoYXQgd2UgZGVjaWRlZAotICogdG8gcHV0IGFsbCAuc3RhYlggdGhpbmtpbmcgaW4gb25lIHBsYWNlLiBIZXJlLgotICoKLSAqIFdlIHRyeSB0byBtYWtlIGFueSAuc3RhYlggZGlyZWN0aXZlIGxlZ2FsLiBPdGhlciBwZW9wbGUncyBBUyB3aWxsIG9mdGVuCi0gKiBkbyBhc3NlbWJseS10aW1lIGNvbnNpc3RlbmN5IGNoZWNrczogZWcgYXNzaWduaW5nIG1lYW5pbmcgdG8gbl90eXBlIGJpdHMKLSAqIGFuZCAicHJvdGVjdGluZyIgeW91IGZyb20gc2V0dGluZyB0aGVtIHRvIGNlcnRhaW4gdmFsdWVzLiAoVGhleSBhbHNvIHplcm8KLSAqIGNlcnRhaW4gYml0cyBiZWZvcmUgZW1pdHRpbmcgc3ltYm9scy4gVHV0IHR1dC4pCi0gKgotICogSWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgYWJzb2x1dGUgd2UgZWl0aGVyIGdyaXBlIG9yIHVzZSB0aGUgcmVsb2NhdGlvbgotICogaW5mb3JtYXRpb24uIE90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMgc2lsZW50bHkgZm9yZ2V0IGluZm9ybWF0aW9uIHRoZXkKLSAqIGRvbid0IG5lZWQgYW5kIGludmVudCBpbmZvcm1hdGlvbiB0aGV5IG5lZWQgdGhhdCB5b3UgZGlkbid0IHN1cHBseS4KLSAqLwotCi0vKgotICogQnVpbGQgYSBzdHJpbmcgZGljdGlvbmFyeSBlbnRyeSBmb3IgYSAuc3RhYlggc3ltYm9sLgotICogVGhlIHN5bWJvbCBpcyBhZGRlZCB0byB0aGUgLjxzZWNuYW1lPnN0ciBzZWN0aW9uLgotICovCi0KLSNpZm5kZWYgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIDAKLSNlbmRpZgotCi11bnNpZ25lZCBpbnQKLWdldF9zdGFiX3N0cmluZ19vZmZzZXQgKHN0cmluZywgc3RhYnN0cl9zZWNuYW1lKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YWJzdHJfc2VjbmFtZTsKLXsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSAgdW5zaWduZWQgaW50IHJldHZhbDsKLSAgc2VnVCBzYXZlX3NlZzsKLSAgc3Vic2VnVCBzYXZlX3N1YnNlZzsKLSAgc2VnVCBzZWc7Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKCEgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUykKLSAgICBhYm9ydCAoKTsKLQotICBsZW5ndGggPSBzdHJsZW4gKHN0cmluZyk7Ci0KLSAgc2F2ZV9zZWcgPSBub3dfc2VnOwotICBzYXZlX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uLiAgKi8KLSAgc2VnID0gc3Vic2VnX25ldyAoc3RhYnN0cl9zZWNuYW1lLCAwKTsKLQotICByZXR2YWwgPSBzZWdfaW5mbyAoc2VnKS0+c3RhYnUuc3RhYl9zdHJpbmdfc2l6ZTsKLSAgaWYgKHJldHZhbCA8PSAwKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZmlyc3Qgc3RyaW5nIGlzIGVtcHR5LiAgKi8KLSAgICAgIHAgPSBmcmFnX21vcmUgKDEpOwotICAgICAgKnAgPSAwOwotICAgICAgcmV0dmFsID0gc2VnX2luZm8gKHNlZyktPnN0YWJ1LnN0YWJfc3RyaW5nX3NpemUgPSAxOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsIFNFQ19SRUFET05MWSB8IFNFQ19ERUJVR0dJTkcpOwotICAgICAgaWYgKHNlZy0+bmFtZSA9PSBzdGFic3RyX3NlY25hbWUpCi0Jc2VnLT5uYW1lID0geHN0cmR1cCAoc3RhYnN0cl9zZWNuYW1lKTsKLSNlbmRpZgotICAgIH0KLQotICBpZiAobGVuZ3RoID4gMCkKLSAgICB7CQkJCS8qIE9yZGluYXJ5IGNhc2UuICovCi0gICAgICBwID0gZnJhZ19tb3JlIChsZW5ndGggKyAxKTsKLSAgICAgIHN0cmNweSAocCwgc3RyaW5nKTsKLQotICAgICAgc2VnX2luZm8gKHNlZyktPnN0YWJ1LnN0YWJfc3RyaW5nX3NpemUgKz0gbGVuZ3RoICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR2YWwgPSAwOwotCi0gIHN1YnNlZ19zZXQgKHNhdmVfc2VnLCBzYXZlX3N1YnNlZyk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotI2lmZGVmIEFPVVRfU1RBQlMKLSNpZm5kZWYgT0JKX1BST0NFU1NfU1RBQgotI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKFNFRyxXLFMsVCxPLEQpCWFvdXRfcHJvY2Vzc19zdGFiKFcsUyxULE8sRCkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBhb3V0X3Byb2Nlc3Nfc3RhYiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCkpOwotCi1zdGF0aWMgdm9pZAotYW91dF9wcm9jZXNzX3N0YWIgKHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpCi0gICAgIGludCB3aGF0OwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGludCB0eXBlLCBvdGhlciwgZGVzYzsKLXsKLSAgLyogUHV0IHRoZSBzdGFiIGluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzeW1ib2wgbm93LCBidXQgb25seSBpbnNlcnQgaXQgaW50byB0aGUgc3ltYm9sIGNoYWluCi0gICAgIGFmdGVyIGFueSBzeW1ib2xzIG1lbnRpb25lZCBpbiB0aGUgdmFsdWUgZXhwcmVzc2lvbiBnZXQgaW50byB0aGUKLSAgICAgc3ltYm9sIGNoYWluLiAgVGhpcyBpcyB0byBhdm9pZCAiY29udGludWF0aW9uIHN5bWJvbHMiICh3aGVyZSBvbmUKLSAgICAgZW5kcyBpbiAiXCIgYW5kIHRoZSBkZWJ1ZyBpbmZvIGlzIGNvbnRpbnVlZCBpbiB0aGUgbmV4dCAuc3RhYnMKLSAgICAgZGlyZWN0aXZlKSBmcm9tIGJlaW5nIHNlcGFyYXRlZCBieSBvdGhlciByYW5kb20gc3ltYm9scy4gICovCi0gIHN5bWJvbCA9IHN5bWJvbF9jcmVhdGUgKHN0cmluZywgdW5kZWZpbmVkX3NlY3Rpb24sIDAsCi0JCQkgIChzdHJ1Y3QgZnJhZyAqKSBOVUxMKTsKLSAgaWYgKHdoYXQgPT0gJ3MnIHx8IHdoYXQgPT0gJ24nKQotICAgIHsKLSAgICAgIC8qIFBpY2sgdXAgdGhlIHZhbHVlIGZyb20gdGhlIGlucHV0IGxpbmUuICAqLwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2wsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBwc2V1ZG9fc2V0IChzeW1ib2wpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIC5zdGFiZCBzZXRzIHRoZSBuYW1lIHRvIE5VTEwuICBXaHk/ICAqLwotICAgICAgU19TRVRfTkFNRSAoc3ltYm9sLCBOVUxMKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotICAgIH0KLQotICBzeW1ib2xfYXBwZW5kIChzeW1ib2wsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgU19TRVRfVFlQRSAoc3ltYm9sLCB0eXBlKTsKLSAgU19TRVRfT1RIRVIgKHN5bWJvbCwgb3RoZXIpOwotICBTX1NFVF9ERVNDIChzeW1ib2wsIGRlc2MpOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgY2FuIGhhbmRsZSBkaWZmZXJlbnQga2luZHMgb2Ygc3RhYnMgKHMsbixkKSBhbmQgZGlmZmVyZW50Ci0gICBraW5kcyBvZiBzdGFiIHNlY3Rpb25zLiAqLwotCi1zdGF0aWMgdm9pZCAKLXNfc3RhYl9nZW5lcmljICh3aGF0LCBzdGFiX3NlY25hbWUsIHN0YWJzdHJfc2VjbmFtZSkKLSAgICAgaW50IHdoYXQ7Ci0gICAgIGNoYXIgKnN0YWJfc2VjbmFtZTsKLSAgICAgY2hhciAqc3RhYnN0cl9zZWNuYW1lOwotewotICBsb25nIGxvbmdpbnQ7Ci0gIGNoYXIgKnN0cmluZzsKLSAgaW50IHR5cGU7Ci0gIGludCBvdGhlcjsKLSAgaW50IGRlc2M7Ci0KLSAgLyogVGhlIGdlbmVyYWwgZm9ybWF0IGlzOgotICAgICAuc3RhYnMgIlNUUklORyIsVFlQRSxPVEhFUixERVNDLFZBTFVFCi0gICAgIC5zdGFibiBUWVBFLE9USEVSLERFU0MsVkFMVUUKLSAgICAgLnN0YWJkIFRZUEUsT1RIRVIsREVTQwotICAgICBBdCB0aGlzIHBvaW50IGlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgYWZ0ZXIgdGhlIHBzZXVkby1vcCBhbmQKLSAgICAgYW55IHRyYWlsaW5nIHdoaXRlc3BhY2UuICBUaGUgYXJndW1lbnQgd2hhdCBpcyBvbmUgb2YgJ3MnLCAnbicgb3IKLSAgICAgJ2QnIGluZGljYXRpbmcgd2hpY2ggdHlwZSBvZiAuc3RhYiB0aGlzIGlzLiAgKi8KLQotICBpZiAod2hhdCAhPSAncycpCi0gICAgc3RyaW5nID0gIiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBzdHJpbmcgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbmd0aCk7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfd2FybiAoXygiLnN0YWJzOiBNaXNzaW5nIGNvbW1hIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJmxvbmdpbnQpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc3RhYiVjOiBNaXNzaW5nIGNvbW1hIiksIHdoYXQpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHR5cGUgPSBsb25naW50OwotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJmxvbmdpbnQpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc3RhYiVjOiBNaXNzaW5nIGNvbW1hIiksIHdoYXQpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIG90aGVyID0gbG9uZ2ludDsKLQotICBkZXNjID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICh3aGF0ID09ICdzJyB8fCB3aGF0ID09ICduJykKLSAgICB7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JewotCSAgYXNfd2FybiAoXygiLnN0YWIlYzogTWlzc2luZyBjb21tYSIpLCB3aGF0KTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotCi0jaWZkZWYgVENfUFBDCi0jaWZkZWYgT0JKX0VMRgotICAvKiBTb2xhcmlzIG9uIFBvd2VyUEMgaGFzIGRlY2lkZWQgdGhhdCAuc3RhYmQgY2FuIHRha2UgNCBhcmd1bWVudHMsIHNvIGlmIHdlIHdlcmUKLSAgICAgZ2l2ZW4gNCBhcmd1bWVudHMsIG1ha2UgaXQgYSAuc3RhYm4gKi8KLSAgZWxzZSBpZiAod2hhdCA9PSAnZCcpCi0gICAgewotICAgICAgY2hhciAqc2F2ZV9sb2NhdGlvbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgd2hhdCA9ICduJzsKLQl9Ci0gICAgICBlbHNlCi0JaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9sb2NhdGlvbjsKLSAgICB9Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotI2VuZGlmIC8qIFRDX1BQQyAqLwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKGxpc3RpbmcpCi0gICAgewotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIE5fU0xJTkU6Ci0JICBsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBkZXNjKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9TTzoKLQljYXNlIE5fU09MOgotCSAgbGlzdGluZ19zb3VyY2VfZmlsZSAoc3RyaW5nKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYgLyogISBOT19MSVNUSU5HICovCi0KLSAgLyogV2UgaGF2ZSBub3cgZ2F0aGVyZWQgdGhlIHR5cGUsIG90aGVyLCBhbmQgZGVzYyBpbmZvcm1hdGlvbi4gIEZvcgotICAgICAuc3RhYnMgb3IgLnN0YWJuLCBpbnB1dF9saW5lX3BvaW50ZXIgaXMgbm93IHBvaW50aW5nIGF0IHRoZQotICAgICB2YWx1ZS4gICovCi0KLSAgaWYgKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpCi0gICAgLyogT3V0cHV0IHRoZSBzdGFiIGluZm9ybWF0aW9uIGluIGEgc2VwYXJhdGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZAotICAgICAgIGF0IGxlYXN0IGZvciBDT0ZGIGFuZCBFTEYuICAqLwotICAgIHsKLSAgICAgIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgICAgIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIGZyYWdTICpzYXZlZF9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICB2YWx1ZVQgZG90OwotICAgICAgc2VnVCBzZWc7Ci0gICAgICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotICAgICAgY2hhciAqcDsKLQotICAgICAgc3RhdGljIHNlZ1QgY2FjaGVkX3NlYzsKLSAgICAgIHN0YXRpYyBjaGFyICpjYWNoZWRfc2VjbmFtZTsKLQotICAgICAgZG90ID0gZnJhZ19ub3dfZml4ICgpOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgICAgIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgICAgIGlmIChjYWNoZWRfc2VjbmFtZSAmJiAhc3RyY21wIChjYWNoZWRfc2VjbmFtZSwgc3RhYl9zZWNuYW1lKSkKLQl7Ci0JICBzZWcgPSBjYWNoZWRfc2VjOwotCSAgc3Vic2VnX3NldCAoc2VnLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2VnID0gc3Vic2VnX25ldyAoc3RhYl9zZWNuYW1lLCAwKTsKLQkgIGlmIChjYWNoZWRfc2VjbmFtZSkKLQkgICAgZnJlZSAoY2FjaGVkX3NlY25hbWUpOwotCSAgY2FjaGVkX3NlY25hbWUgPSB4c3RyZHVwIChzdGFiX3NlY25hbWUpOwotCSAgY2FjaGVkX3NlYyA9IHNlZzsKLQl9Ci0KLSAgICAgIGlmICghIHNlZ19pbmZvIChzZWcpLT5oYWRvbmUpCi0JewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsCi0JCQkJIFNFQ19SRUFET05MWSB8IFNFQ19SRUxPQyB8IFNFQ19ERUJVR0dJTkcpOwotI2VuZGlmCi0jaWZkZWYgSU5JVF9TVEFCX1NFQ1RJT04KLQkgIElOSVRfU1RBQl9TRUNUSU9OIChzZWcpOwotI2VuZGlmCi0JICBzZWdfaW5mbyAoc2VnKS0+aGFkb25lID0gMTsKLQl9Ci0KLSAgICAgIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKHN0cmluZywgc3RhYnN0cl9zZWNuYW1lKTsKLSAgICAgIGlmICh3aGF0ID09ICdzJykKLQl7Ci0JICAvKiByZWxlYXNlIHRoZSBzdHJpbmcgKi8KLQkgIG9ic3RhY2tfZnJlZSAoJm5vdGVzLCBzdHJpbmcpOwotCX0KLQotICAgICAgLyogQXQgbGVhc3QgZm9yIG5vdywgc3RhYnMgaW4gYSBzcGVjaWFsIHN0YWIgc2VjdGlvbiBhcmUgYWx3YXlzCi0JIG91dHB1dCBhcyAxMiBieXRlIGJsb2NrcyBvZiBpbmZvcm1hdGlvbi4gICovCi0gICAgICBwID0gZnJhZ19tb3JlICg4KTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgc3Ryb2ZmLCA0KTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDQsICh2YWx1ZVQpIHR5cGUsIDEpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNSwgKHZhbHVlVCkgb3RoZXIsIDEpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNiwgKHZhbHVlVCkgZGVzYywgMik7Ci0KLSAgICAgIGlmICh3aGF0ID09ICdzJyB8fCB3aGF0ID09ICduJykKLQl7Ci0JICAvKiBQaWNrIHVwIHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnB1dCBsaW5lLiAgKi8KLQkgIGNvbnMgKDQpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKmZha2U7Ci0JICBzeW1ib2xTICpzeW1ib2w7Ci0JICBleHByZXNzaW9uUyBleHA7Ci0KLQkgIC8qIEFycmFuZ2UgZm9yIGEgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLQkgIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7Ci0JICBzeW1ib2wgPSBzeW1ib2xfbmV3IChmYWtlLCBzYXZlZF9zZWcsIGRvdCwgc2F2ZWRfZnJhZyk7Ci0KLQkgIGV4cC5YX29wID0gT19zeW1ib2w7Ci0JICBleHAuWF9hZGRfc3ltYm9sID0gc3ltYm9sOwotCSAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0KLQkgIGVtaXRfZXhwciAoJmV4cCwgNCk7Ci0JfQotCi0jaWZkZWYgT0JKX1BST0NFU1NfU1RBQgotICAgICAgT0JKX1BST0NFU1NfU1RBQiAoc2VnLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKTsKLSNlbmRpZgotCi0gICAgICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmZGVmIE9CSl9QUk9DRVNTX1NUQUIKLSAgICAgIE9CSl9QUk9DRVNTX1NUQUIgKDAsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFJlZ3VsYXIgc3RhYiBkaXJlY3RpdmUuICovCi0KLXZvaWQKLXNfc3RhYiAod2hhdCkKLSAgICAgaW50IHdoYXQ7Ci17Ci0gIHNfc3RhYl9nZW5lcmljICh3aGF0LCBTVEFCX1NFQ1RJT05fTkFNRSwgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FKTsKLX0KLQotLyogIkV4dGVuZGVkIHN0YWJzIiwgdXNlZCBpbiBTb2xhcmlzIG9ubHkgbm93LiAqLwotCi12b2lkCi1zX3hzdGFiICh3aGF0KQotICAgICBpbnQgd2hhdDsKLXsKLSAgaW50IGxlbmd0aDsKLSAgY2hhciAqc3RhYl9zZWNuYW1lLCAqc3RhYnN0cl9zZWNuYW1lOwotICBzdGF0aWMgY2hhciAqc2F2ZWRfc2VjbmFtZSwgKnNhdmVkX3N0cnNlY25hbWU7Ci0KLSAgLyogQEAgTUVNT1JZIExFQUs6IFRoaXMgYWxsb2NhdGVzIGEgY29weSBvZiB0aGUgc3RyaW5nLCBidXQgaW4gbW9zdAotICAgICBjYXNlcyBpdCB3aWxsIGJlIHRoZSBzYW1lIHN0cmluZywgc28gd2UgY291bGQgcmVsZWFzZSB0aGUgc3RvcmFnZQotICAgICBiYWNrIHRvIHRoZSBvYnN0YWNrIGl0IGNhbWUgZnJvbS4gICovCi0gIHN0YWJfc2VjbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuZ3RoKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNvbW1hIG1pc3NpbmcgaW4gLnhzdGFicyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRvIGdldCB0aGUgbmFtZSBvZiB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbiwgc2ltcGx5IGFkZCAic3RyIiB0bwotICAgICB0aGUgc3RhYiBzZWN0aW9uIG5hbWUuICAqLwotICBpZiAoc2F2ZWRfc2VjbmFtZSA9PSAwIHx8IHN0cmNtcCAoc2F2ZWRfc2VjbmFtZSwgc3RhYl9zZWNuYW1lKSkKLSAgICB7Ci0gICAgICBzdGFic3RyX3NlY25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0YWJfc2VjbmFtZSkgKyA0KTsKLSAgICAgIHN0cmNweSAoc3RhYnN0cl9zZWNuYW1lLCBzdGFiX3NlY25hbWUpOwotICAgICAgc3RyY2F0IChzdGFic3RyX3NlY25hbWUsICJzdHIiKTsKLSAgICAgIGlmIChzYXZlZF9zZWNuYW1lKQotCXsKLQkgIGZyZWUgKHNhdmVkX3NlY25hbWUpOwotCSAgZnJlZSAoc2F2ZWRfc3Ryc2VjbmFtZSk7Ci0JfQotICAgICAgc2F2ZWRfc2VjbmFtZSA9IHN0YWJfc2VjbmFtZTsKLSAgICAgIHNhdmVkX3N0cnNlY25hbWUgPSBzdGFic3RyX3NlY25hbWU7Ci0gICAgfQotICBzX3N0YWJfZ2VuZXJpYyAod2hhdCwgc2F2ZWRfc2VjbmFtZSwgc2F2ZWRfc3Ryc2VjbmFtZSk7Ci19Ci0KLSNpZmRlZiBTX1NFVF9ERVNDCi0KLS8qIEZyb2IgaW52ZW50ZWQgYXQgUk1TJyByZXF1ZXN0LiBTZXQgdGhlIG5fZGVzYyBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQgCi1zX2Rlc2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgdGVtcDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKnAgPSAwOwotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBTX1NFVF9ERVNDIChzeW1ib2xQLCB0ZW1wKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfZGVzYygpICovCi0KLSNlbmRpZiAvKiBkZWZpbmVkIChTX1NFVF9ERVNDKSAqLwotCi0vKiBHZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gZGVub3RlIHRoZSBtYWluIHNvdXJjZSBmaWxlLiAgKi8KLQotdm9pZAotc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUgKCkKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLQotICBhc193aGVyZSAoJmZpbGUsICZsaW5lbm8pOwotICBnZW5lcmF0ZV9hc21fZmlsZSAoTl9TTywgZmlsZSk7Ci19Ci0KLS8qIEdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgdGhlIHNvdXJjZSBmaWxlLgotICAgVFlQRSBpcyBvbmUgb2YgTl9TTywgTl9TT0wuICAqLwotCi1zdGF0aWMgdm9pZAotZ2VuZXJhdGVfYXNtX2ZpbGUgKHR5cGUsIGZpbGUpCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpmaWxlOwotewotICBzdGF0aWMgY2hhciAqbGFzdF9maWxlOwotICBzdGF0aWMgaW50IGxhYmVsX2NvdW50OwotICBjaGFyICpob2xkOwotICBjaGFyICpidWYgPSB4bWFsbG9jICgyICogc3RybGVuIChmaWxlKSArIDEwKTsKLSAgY2hhciBzeW1bMzBdOwotCi0gIC8qIFJhdGhlciB0aGFuIHRyeSB0byBkbyB0aGlzIGluIHNvbWUgZWZmaWNpZW50IGZhc2hpb24sIHdlIGp1c3QKLSAgICAgZ2VuZXJhdGUgYSBzdHJpbmcgYW5kIHRoZW4gcGFyc2UgaXQgYWdhaW4uICBUaGF0IGxldHMgdXMgdXNlIHRoZQotICAgICBleGlzdGluZyBzdGFicyBob29rLCB3aGljaCBleHBlY3QgdG8gc2VlIGEgc3RyaW5nLCByYXRoZXIgdGhhbgotICAgICBpbnZlbnRpbmcgbmV3IG9uZXMuICAqLwotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMCi0gICAgICB8fCBzdHJjbXAgKGxhc3RfZmlsZSwgZmlsZSkgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICp0bXAgPSBmaWxlOwotICAgICAgY2hhciAqZW5kcCA9IGZpbGUgKyBzdHJsZW4oZmlsZSk7Ci0gICAgICBjaGFyICpidWZwID0gYnVmOwotCi0gICAgICBzcHJpbnRmIChzeW0sICIlc0YlZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQpOwotICAgICAgKytsYWJlbF9jb3VudDsKLQotICAgICAgKmJ1ZnArKyA9ICciJzsKLSAgICAgIHdoaWxlICh0bXAgPCBlbmRwKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAqYnNsYXNoID0gc3RyY2hyICh0bXAsICdcXCcpOwotICAgICAgICAgIGludCBsZW4gPSAoYnNsYXNoID8gKGJzbGFzaCAtIHRtcCArIDEpIDogc3RybGVuICh0bXApKTsKLSAgICAgICAgICAvKiBkb3VibGUgYWxsIGJhY2tzbGFzaGVzLCBzaW5jZSBkZW1hbmRfY29weV9DX3N0cmluZyAodXNlZCBieQotICAgICAgICAgICAgIHNfc3RhYiB0byBleHRyYWN0IHRoZSBwYXJ0IGluIHF1b3Rlcykgd2lsbCB0cnkgdG8gcmVwbGFjZSB0aGVtIGFzCi0gICAgICAgICAgICAgZXNjYXBlIHNlcXVlbmNlcy4gIGJhY2tzbGFzaCBtYXkgYXBwZWFyIGluIGEgZmlsZXNwZWMuICovCi0gICAgICAgICAgc3RybmNweSAoYnVmcCwgdG1wLCBsZW4pOwotICAgICAgICAgIHRtcCArPSBsZW47Ci0gICAgICAgICAgYnVmcCArPSBsZW47Ci0gICAgICAgICAgaWYgKGJzbGFzaCAhPSBOVUxMKQotICAgICAgICAgICAgKmJ1ZnArKyA9ICdcXCc7Ci0gICAgICAgIH0gCi0gICAgICBzcHJpbnRmIChidWZwLCAiXCIsJWQsMCwwLCVzXG4iLCB0eXBlLCBzeW0pOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmOwotICAgICAgc19zdGFiICgncycpOwotICAgICAgY29sb24gKHN5bSk7Ci0KLSAgICAgIGlmIChsYXN0X2ZpbGUgIT0gTlVMTCkKLQlmcmVlIChsYXN0X2ZpbGUpOwotICAgICAgbGFzdF9maWxlID0geHN0cmR1cCAoZmlsZSk7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0gIGZyZWUgKGJ1Zik7Ci19Ci0KLS8qIEdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgbGluZS4gIFRoaXMgaXMKLSAgIHVzZWQgdG8gcHJvZHVjZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmxlciBmaWxlLiAgKi8KLQotdm9pZAotc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKQotewotICBzdGF0aWMgaW50IGxhYmVsX2NvdW50OwotICBjaGFyICpob2xkOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICBjaGFyICpidWY7Ci0gIGNoYXIgc3ltWzMwXTsKLQotICAvKiBSYXRoZXIgdGhhbiB0cnkgdG8gZG8gdGhpcyBpbiBzb21lIGVmZmljaWVudCBmYXNoaW9uLCB3ZSBqdXN0Ci0gICAgIGdlbmVyYXRlIGEgc3RyaW5nIGFuZCB0aGVuIHBhcnNlIGl0IGFnYWluLiAgVGhhdCBsZXRzIHVzIHVzZSB0aGUKLSAgICAgZXhpc3Rpbmcgc3RhYnMgaG9vaywgd2hpY2ggZXhwZWN0IHRvIHNlZSBhIHN0cmluZywgcmF0aGVyIHRoYW4KLSAgICAgaW52ZW50aW5nIG5ldyBvbmVzLiAgKi8KLQotICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmVubyk7Ci0KLSAgZ2VuZXJhdGVfYXNtX2ZpbGUgKE5fU09MLCBmaWxlKTsKLQotICBzcHJpbnRmIChzeW0sICIlc0wlZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQpOwotICArK2xhYmVsX2NvdW50OwotCi0gIGlmIChpbl9kb3RfZnVuY19wKQotICAgIHsKLSAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoMTAwICsgc3RybGVuIChjdXJyZW50X2Z1bmN0aW9uX2xhYmVsKSk7Ci0gICAgICBzcHJpbnRmIChidWYsICIlZCwwLCVkLCVzLSVzXG4iLCBOX1NMSU5FLCBsaW5lbm8sCi0JICAgICAgIHN5bSwgY3VycmVudF9mdW5jdGlvbl9sYWJlbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgYWxsb2NhICgxMDApOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWQsMCwlZCwlc1xuIiwgTl9TTElORSwgbGluZW5vLCBzeW0pOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmOwotICBzX3N0YWIgKCduJyk7Ci0gIGNvbG9uIChzeW0pOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci19Ci0KLS8qIEVtaXQgYSBmdW5jdGlvbiBzdGFiLgotICAgQWxsIGFzc2VtYmxlciBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gaGF2ZSByZXR1cm4gdHlwZSBgdm9pZCcuICAqLwotCi12b2lkCi1zdGFic19nZW5lcmF0ZV9hc21fZnVuYyAoZnVuY25hbWUsIHN0YXJ0bGFibmFtZSkKLSAgICAgY29uc3QgY2hhciAqZnVuY25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0bGFibmFtZTsKLXsKLSAgc3RhdGljIGludCB2b2lkX2VtaXR0ZWRfcDsKLSAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqYnVmOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZW5vOwotCi0gIGlmICghIHZvaWRfZW1pdHRlZF9wKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9ICJcInZvaWQ6dDE9MVwiLDEyOCwwLDAsMCI7Ci0gICAgICBzX3N0YWIgKCdzJyk7Ci0gICAgICB2b2lkX2VtaXR0ZWRfcCA9IDE7Ci0gICAgfQotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmVubyk7Ci0gIGFzcHJpbnRmICgmYnVmLCAiXCIlczpGMVwiLCVkLDAsJWQsJXMiLAotCSAgICBmdW5jbmFtZSwgTl9GVU4sIGxpbmVubyArIDEsIHN0YXJ0bGFibmFtZSk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZjsKLSAgc19zdGFiICgncycpOwotICBmcmVlIChidWYpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0gIGN1cnJlbnRfZnVuY3Rpb25fbGFiZWwgPSB4c3RyZHVwIChzdGFydGxhYm5hbWUpOwotICBpbl9kb3RfZnVuY19wID0gMTsKLX0KLQotLyogRW1pdCBhIHN0YWIgdG8gcmVjb3JkIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4gICovCi0KLXZvaWQKLXN0YWJzX2dlbmVyYXRlX2FzbV9lbmRmdW5jIChmdW5jbmFtZSwgc3RhcnRsYWJuYW1lKQotICAgICBjb25zdCBjaGFyICpmdW5jbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpzdGFydGxhYm5hbWU7Ci17Ci0gIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7Ci0gIGNoYXIgKmhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBzeW1bMzBdOwotCi0gIHNwcmludGYgKHN5bSwgIiVzZW5kZnVuYyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCk7Ci0gICsrbGFiZWxfY291bnQ7Ci0gIGNvbG9uIChzeW0pOwotCi0gIGFzcHJpbnRmICgmYnVmLCAiXCJcIiwlZCwwLDAsJXMtJXMiLCBOX0ZVTiwgc3ltLCBzdGFydGxhYm5hbWUpOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7Ci0gIHNfc3RhYiAoJ3MnKTsKLSAgZnJlZSAoYnVmKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotICBpbl9kb3RfZnVuY19wID0gMDsKLSAgY3VycmVudF9mdW5jdGlvbl9sYWJlbCA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9nYXMvc3RhbXAtaC5pbiBiL2dhcy9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2dhcy9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9nYXMvc3RydWMtc3ltYm9sLmggYi9nYXMvc3RydWMtc3ltYm9sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzM1NjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3N0cnVjLXN5bWJvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qIHN0cnVjdF9zeW1ib2wuaCAtIEludGVybmFsIHN5bWJvbCBzdHJ1Y3R1cmUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9fc3RydWNfc3ltYm9sX2hfXwotI2RlZmluZSBfX3N0cnVjX3N5bWJvbF9oX18KLQotLyogVGhlIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgc3ltYm9sLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2wgdGFibGUKLSAgIGhvbGRzIHBvaW50ZXJzIGJvdGggdG8gdGhpcyBhbmQgdG8gbG9jYWxfc3ltYm9sIHN0cnVjdHVyZXMuICBTZWUKLSAgIGJlbG93LiAgKi8KLQotc3RydWN0IHN5bWJvbAotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogQkZEIHN5bWJvbCAqLwotICBhc3ltYm9sICpic3ltOwotI2Vsc2UKLSAgLyogVGhlICg0LW9yaWdpbikgcG9zaXRpb24gb2Ygc3lfbmFtZSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gIFRoaXMgd2lsbCBiZSAwIGZvciAobmFtZWxlc3MpIC5zdGFiZCBzeW1ib2xzLgotCi0gICAgIE5vdCB1c2VkIHVudGlsIHdyaXRlX29iamVjdF9maWxlKCkgdGltZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBzeV9uYW1lX29mZnNldDsKLQotICAvKiBXaGF0IHdlIHdyaXRlIGluIC5vIGZpbGUgKGlmIHBlcm1pdHRlZCkuICAqLwotICBvYmpfc3ltYm9sX3R5cGUgc3lfc3ltYm9sOwotCi0gIC8qIFRoZSAyNCBiaXQgc3ltYm9sIG51bWJlci4gIFN5bWJvbCBudW1iZXJzIHN0YXJ0IGF0IDAgYW5kIGFyZSB1bnNpZ25lZC4gKi8KLSAgbG9uZyBzeV9udW1iZXI7Ci0jZW5kaWYKLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gIGV4cHJlc3Npb25TIHN5X3ZhbHVlOwotCi0gIC8qIEZvcndhcmRzIGFuZCAob3B0aW9uYWxseSkgYmFja3dhcmRzIGNoYWluIHBvaW50ZXJzLiAgKi8KLSAgc3RydWN0IHN5bWJvbCAqc3lfbmV4dDsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gIHN0cnVjdCBzeW1ib2wgKnN5X3ByZXZpb3VzOwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotICAvKiBQb2ludGVyIHRvIHRoZSBmcmFnIHRoaXMgc3ltYm9sIGlzIGF0dGFjaGVkIHRvLCBpZiBhbnkuCi0gICAgIE90aGVyd2lzZSwgTlVMTC4gICovCi0gIHN0cnVjdCBmcmFnICpzeV9mcmFnOwotCi0gIHVuc2lnbmVkIGludCB3cml0dGVuIDogMTsKLSAgLyogV2hldGhlciBzeW1ib2wgdmFsdWUgaGFzIGJlZW4gY29tcGxldGVseSByZXNvbHZlZCAodXNlZCBkdXJpbmcKLSAgICAgZmluYWwgcGFzcyBvdmVyIHN5bWJvbCB0YWJsZSkuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfcmVzb2x2ZWQgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgdmFsdWUgaXMgY3VycmVudGx5IGJlaW5nIHJlc29sdmVkICh1c2VkIHRvCi0gICAgIGRldGVjdCBsb29wcyBpbiBzeW1ib2wgZGVwZW5kZW5jaWVzKS4gICovCi0gIHVuc2lnbmVkIGludCBzeV9yZXNvbHZpbmcgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgdmFsdWUgaXMgdXNlZCBpbiBhIHJlbG9jLiAgVGhpcyBpcyB1c2VkIHRvCi0gICAgIGVuc3VyZSB0aGF0IHN5bWJvbHMgdXNlZCBpbiByZWxvY3MgYXJlIHdyaXR0ZW4gb3V0LCBldmVuIGlmIHRoZXkKLSAgICAgYXJlIGxvY2FsIGFuZCB3b3VsZCBvdGhlcndpc2Ugbm90IGJlLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3VzZWRfaW5fcmVsb2MgOiAxOwotCi0gIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCBpcyB1c2VkIGFzIGFuIG9wZXJhbmQgb3IgaW4gYW4gZXhwcmVzc2lvbi4gIAotICAgICBOT1RFOiAgTm90IGFsbCB0aGUgYmFja2VuZHMga2VlcCB0aGlzIGluZm9ybWF0aW9uIGFjY3VyYXRlOwotICAgICBiYWNrZW5kcyB3aGljaCB1c2UgdGhpcyBiaXQgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIGl0IHdoZW4KLSAgICAgYSBzeW1ib2wgaXMgdXNlZCBpbiBiYWNrZW5kIHJvdXRpbmVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3VzZWQgOiAxOwotCi0gIC8qIFRoaXMgaXMgc2V0IGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhbiBNUkkgY29tbW9uIHNlY3Rpb24uCi0gICAgIFdlIGhhbmRsZSBzdWNoIHNlY3Rpb25zIGFzIHNpbmdsZSBjb21tb24gc3ltYm9scywgc28gc3ltYm9scwotICAgICBkZWZpbmVkIHdpdGhpbiB0aGVtIG11c3QgYmUgdHJlYXRlZCBzcGVjaWFsbHkgYnkgdGhlIHJlbG9jYXRpb24KLSAgICAgcm91dGluZXMuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfbXJpX2NvbW1vbiA6IDE7Ci0KLSNpZmRlZiBPQkpfU1lNRklFTERfVFlQRQotICBPQkpfU1lNRklFTERfVFlQRSBzeV9vYmo7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1NZTUZJRUxEX1RZUEUKLSAgVENfU1lNRklFTERfVFlQRSBzeV90YzsKLSNlbmRpZgotfTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogQSBwb2ludGVyIGluIHRoZSBzeW1ib2wgbWF5IHBvaW50IHRvIGVpdGhlciBhIGNvbXBsZXRlIHN5bWJvbAotICAgKHN0cnVjdCBzeW1ib2wgYWJvdmUpIG9yIHRvIGEgbG9jYWwgc3ltYm9sIChzdHJ1Y3QgbG9jYWxfc3ltYm9sCi0gICBkZWZpbmVkIGhlcmUpLiAgVGhlIHN5bWJvbCBjb2RlIGNhbiBkZXRlY3QgdGhlIGNhc2UgYnkgZXhhbWluaW5nCi0gICB0aGUgZmlyc3QgZmllbGQuICBJdCBpcyBhbHdheXMgTlVMTCBmb3IgYSBsb2NhbCBzeW1ib2wuCi0KLSAgIFdlIGRvIHRoaXMgYmVjYXVzZSB3ZSBvcmRpbmFyaWx5IG9ubHkgbmVlZCBhIHNtYWxsIGFtb3VudCBvZgotICAgaW5mb3JtYXRpb24gZm9yIGEgbG9jYWwgc3ltYm9sLiAgVGhlIHN5bWJvbCB0YWJsZSB0YWtlcyB1cCBhIGxvdCBvZgotICAgc3BhY2UsIGFuZCBzdG9yaW5nIGxlc3MgaW5mb3JtYXRpb24gZm9yIGEgbG9jYWwgc3ltYm9sIGNhbiBtYWtlIGEKLSAgIGJpZyBkaWZmZXJlbmNlIGluIGFzc2VtYmxlciBtZW1vcnkgdXNhZ2Ugd2hlbiBhc3NlbWJsaW5nIGEgbGFyZ2UKLSAgIGZpbGUuICAqLwotCi1zdHJ1Y3QgbG9jYWxfc3ltYm9sCi17Ci0gIC8qIFRoaXMgcG9pbnRlciBpcyBhbHdheXMgTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBsb2NhbAotICAgICBzeW1ib2wuICAqLwotICBhc3ltYm9sICpsc3lfbWFya2VyOwotCi0gIC8qIFRoZSBzeW1ib2wgc2VjdGlvbi4gIFRoaXMgYWxzbyBzZXJ2ZXMgYXMgYSBmbGFnLiAgSWYgdGhpcyBpcwotICAgICByZWdfc2VjdGlvbiwgdGhlbiB0aGlzIHN5bWJvbCBoYXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIHJlZ3VsYXIKLSAgICAgc3ltYm9sLCBhbmQgc3lfc3ltIHBvaW50cyB0byBpdC4gICovCi0gIHNlZ1QgbHN5X3NlY3Rpb247Ci0KLSAgLyogVGhlIHN5bWJvbCBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbHN5X25hbWU7Ci0KLSAgLyogVGhlIHN5bWJvbCBmcmFnIG9yIHRoZSByZWFsIHN5bWJvbCwgZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIGluCi0gICAgIHN5X3NlY3Rpb24uICBJZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGZ1bGx5IHJlc29sdmVkLCBsc3lfZnJhZyBpcwotICAgICBzZXQgdG8gTlVMTC4gICovCi0gIHVuaW9uCi0gIHsKLSAgICBmcmFnUyAqbHN5X2ZyYWc7Ci0gICAgc3ltYm9sUyAqbHN5X3N5bTsKLSAgfSB1OwotCi0gIC8qIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBmcmFnLiAgKi8KLSAgdmFsdWVUIGxzeV9vZmZzZXQ7Ci19OwotCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9jb252ZXJ0ZWRfcChsKSAoKGwpLT5sc3lfc2VjdGlvbiA9PSByZWdfc2VjdGlvbikKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX21hcmtfY29udmVydGVkKGwpICgobCktPmxzeV9zZWN0aW9uID0gcmVnX3NlY3Rpb24pCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wKGwpICgobCktPnUubHN5X2ZyYWcgPT0gTlVMTCkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX21hcmtfcmVzb2x2ZWQobCkgKChsKS0+dS5sc3lfZnJhZyA9IE5VTEwpCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyhsKSAoKGwpLT51LmxzeV9mcmFnKQotI2RlZmluZSBsb2NhbF9zeW1ib2xfc2V0X2ZyYWcobCwgZikgKChsKS0+dS5sc3lfZnJhZyA9IChmKSkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX2dldF9yZWFsX3N5bWJvbChsKSAoKGwpLT51LmxzeV9zeW0pCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9zZXRfcmVhbF9zeW1ib2wobCwgcykgKChsKS0+dS5sc3lfc3ltID0gKHMpKQotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jZW5kaWYgLyogX19zdHJ1Y19zeW1ib2xfaF9fICovCi0KLS8qIGVuZCBvZiBzdHJ1Yy1zeW1ib2wuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N1YnNlZ3MuYyBiL2dhcy9zdWJzZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYmY3MGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3N1YnNlZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDY2MyArMCwwIEBACi0vKiBzdWJzZWdzLmMgLSBzdWJzZWdtZW50cyAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogU2VnbWVudHMgJiBzdWItc2VnbWVudHMuCi0gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi1mcmNoYWluUyAqZnJjaGFpbl9yb290LCAqZnJjaGFpbl9ub3c7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBmcmNoYWluczsKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotc2VnbWVudF9pbmZvX3R5cGUgc2VnbWVudF9pbmZvW1NFR19NQVhJTVVNX09SRElOQUxdOwotCi0jZWxzZQotLyogQ29tbWVudGVkIGluICJzdWJzZWdzLmgiLiAqLwotZnJjaGFpblMgKmRhdGEwX2ZyY2hhaW5QLCAqYnNzMF9mcmNoYWluUDsKLQotI2VuZGlmIC8qIE1BTllfU0VHTUVOVFMgKi8KLWNoYXIgY29uc3QgKmNvbnN0IHNlZ19uYW1lW10gPQotewotICAiYWJzb2x1dGUiLAotI2lmZGVmIE1BTllfU0VHTUVOVFMKLSAgImUwIiwgImUxIiwgImUyIiwgImUzIiwgImU0IiwgImU1IiwgImU2IiwgImU3IiwgImU4IiwgImU5IiwKLSAgImUxMCIsICJlMTEiLCAiZTEyIiwgImUxMyIsICJlMTQiLCAiZTE1IiwgImUxNiIsICJlMTciLCAiZTE4IiwgImUxOSIsCi0gICJlMjAiLCAiZTIxIiwgImUyMiIsICJlMjMiLCAiZTI0IiwgImUyNSIsICJlMjYiLCAiZTI3IiwgImUyOCIsICJlMjkiLAotICAiZTMwIiwgImUzMSIsICJlMzIiLCAiZTMzIiwgImUzNCIsICJlMzUiLCAiZTM2IiwgImUzNyIsICJlMzgiLCAiZTM5IiwKLSNlbHNlCi0gICJ0ZXh0IiwKLSAgImRhdGEiLAotICAiYnNzIiwKLSNlbmRpZiAvKiBNQU5ZX1NFR01FTlRTICovCi0gICJ1bmtub3duIiwKLSAgIkFTU0VNQkxFUi1JTlRFUk5BTC1MT0dJQy1FUlJPUiEiLAotICAiZXhwciIsCi0gICJkZWJ1ZyIsCi0gICJ0cmFuc2ZlcnQgdmVjdG9yIHByZWxvYWQiLAotICAidHJhbnNmZXJ0IHZlY3RvciBwb3N0bG9hZCIsCi0gICJyZWdpc3RlciIsCi0gICIiLAotfTsJCQkJLyogVXNlZCBieSBlcnJvciByZXBvcnRlcnMsIGR1bXBlcnMgZXRjLiAqLwotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBHYXMgc2VnbWVudCBpbmZvcm1hdGlvbiBmb3IgYmZkX2Fic19zZWN0aW9uX3B0ciBhbmQKLSAgIGJmZF91bmRfc2VjdGlvbl9wdHIuICAqLwotc3RhdGljIHNlZ21lbnRfaW5mb190eXBlICphYnNfc2VnX2luZm87Ci1zdGF0aWMgc2VnbWVudF9pbmZvX3R5cGUgKnVuZF9zZWdfaW5mbzsKLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotc3RhdGljIHZvaWQgc3Vic2VnX3NldF9yZXN0IFBBUkFNUyAoKHNlZ1QsIHN1YnNlZ1QpKTsKLQotc3RhdGljIGZyYWdTIGR1bW15X2ZyYWc7Ci0KLXN0YXRpYyBmcmNoYWluUyBhYnNvbHV0ZV9mcmNoYWluOwotDAotdm9pZAotc3Vic2Vnc19iZWdpbiAoKQotewotICAvKiBDaGVjayB0YWJsZShzKSBzZWdfbmFtZVtdLCBzZWdfTl9UWVBFW10gaXMgaW4gY29ycmVjdCBvcmRlciAqLwotI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAga25vdyAoU0VHX0FCU09MVVRFID09IDApOwotICBrbm93IChTRUdfVEVYVCA9PSAxKTsKLSAga25vdyAoU0VHX0RBVEEgPT0gMik7Ci0gIGtub3cgKFNFR19CU1MgPT0gMyk7Ci0gIGtub3cgKFNFR19VTktOT1dOID09IDQpOwotICBrbm93IChTRUdfR09PRiA9PSA1KTsKLSAga25vdyAoU0VHX0VYUFIgPT0gNik7Ci0gIGtub3cgKFNFR19ERUJVRyA9PSA3KTsKLSAga25vdyAoU0VHX05UViA9PSA4KTsKLSAga25vdyAoU0VHX1BUViA9PSA5KTsKLSAga25vdyAoU0VHX1JFR0lTVEVSID09IDEwKTsKLSAga25vdyAoU0VHX01BWElNVU1fT1JESU5BTCA9PSBTRUdfUkVHSVNURVIpOwotI2VuZGlmCi0KLSAgb2JzdGFja19iZWdpbiAoJmZyY2hhaW5zLCBjaHVua3NpemUpOwotI2lmIF9fR05VQ19fID49IDIKLSAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAoJmZyY2hhaW5zKSA9IF9fYWxpZ25vZl9fIChmcmNoYWluUykgLSAxOwotI2VuZGlmCi0KLSAgZnJjaGFpbl9yb290ID0gTlVMTDsKLSAgZnJjaGFpbl9ub3cgPSBOVUxMOwkJLyogV2FybiBuZXdfc3Vic2VnKCkgdGhhdCB3ZSBhcmUgYm9vdGluZy4gKi8KLQotICBmcmFnX25vdyA9ICZkdW1teV9mcmFnOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgbm93X3N1YnNlZyA9IDQyOwkJLyogTGllIGZvciAxc3QgY2FsbCB0byBzdWJzZWdfbmV3LiAqLwotI2lmZGVmIE1BTllfU0VHTUVOVFMKLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgICB7Ci0Jc3Vic2VnX3NldCAoaSwgMCk7Ci0Jc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0gICAgICB9Ci0gIH0KLSNlbHNlCi0gIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAwKTsJLyogLmRhdGEgMCAqLwotICBkYXRhMF9mcmNoYWluUCA9IGZyY2hhaW5fbm93OwotCi0gIHN1YnNlZ19zZXQgKFNFR19CU1MsIDApOwotICBic3MwX2ZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0KLSNlbmRpZiAvKiAhIE1BTllfU0VHTUVOVFMgKi8KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKLSAgYWJzb2x1dGVfZnJjaGFpbi5mcmNoX3N1YnNlZyA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBhYnNvbHV0ZV9mcmNoYWluLmZpeF9yb290ID0gYWJzb2x1dGVfZnJjaGFpbi5maXhfdGFpbCA9IDA7Ci0jZW5kaWYKLSAgYWJzb2x1dGVfZnJjaGFpbi5mcmNoX2ZyYWdfbm93ID0gJnplcm9fYWRkcmVzc19mcmFnOwotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfcm9vdCA9IGFic29sdXRlX2ZyY2hhaW4uZnJjaF9sYXN0ID0gJnplcm9fYWRkcmVzc19mcmFnOwotfQotDAotLyoKLSAqCQkJc3Vic2VnX2NoYW5nZSgpCi0gKgotICogQ2hhbmdlIHRoZSBzdWJzZWdtZW50IHdlIGFyZSBpbiwgQlVUIERPIE5PVCBNQUtFIEEgTkVXIEZSQUcgZm9yIHRoZQotICogc3Vic2VnbWVudC4gSWYgd2UgYXJlIGFscmVhZHkgaW4gdGhlIGNvcnJlY3Qgc3Vic2VnbWVudCwgY2hhbmdlIG5vdGhpbmcuCi0gKiBUaGlzIGlzIHVzZWQgZWcgYXMgYSB3b3JrZXIgZm9yIHN1YnNlZ19zZXQgW3doaWNoIGRvZXMgbWFrZSBhIG5ldyBmcmFnX25vd10KLSAqIGFuZCBmb3IgY2hhbmdpbmcgc2VnbWVudHMgYWZ0ZXIgd2UgaGF2ZSByZWFkIHRoZSBzb3VyY2UuIFdlIGNvbnN0cnVjdCBlZwotICogZml4U3MgZXZlbiBhZnRlciB0aGUgc291cmNlIGZpbGUgaXMgcmVhZCwgc28gd2UgZG8gaGF2ZSB0byBrZWVwIHRoZQotICogc2VnbWVudCBjb250ZXh0IGNvcnJlY3QuCi0gKi8KLXZvaWQKLXN1YnNlZ19jaGFuZ2UgKHNlZywgc3Vic2VnKQotICAgICByZWdpc3RlciBzZWdUIHNlZzsKLSAgICAgcmVnaXN0ZXIgaW50IHN1YnNlZzsKLXsKLSAgbm93X3NlZyA9IHNlZzsKLSAgbm93X3N1YnNlZyA9IHN1YnNlZzsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHJldHVybjsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgewotICAgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICAgIHNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhIChzdGRvdXRwdXQsIHNlZyk7Ci0gICAgaWYgKCEgc2VnaW5mbykKLSAgICAgIHsKLQlzZWdpbmZvID0gKHNlZ21lbnRfaW5mb190eXBlICopIHhtYWxsb2MgKHNpemVvZiAoKnNlZ2luZm8pKTsKLQltZW1zZXQgKChQVFIpIHNlZ2luZm8sIDAsIHNpemVvZiAoKnNlZ2luZm8pKTsKLQlzZWdpbmZvLT5maXhfcm9vdCA9IE5VTEw7Ci0Jc2VnaW5mby0+Zml4X3RhaWwgPSBOVUxMOwotCXNlZ2luZm8tPmJmZF9zZWN0aW9uID0gc2VnOwotCXNlZ2luZm8tPnN5bSA9IDA7Ci0JaWYgKHNlZyA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotCSAgYWJzX3NlZ19pbmZvID0gc2VnaW5mbzsKLQllbHNlIGlmIChzZWcgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKLQkgIHVuZF9zZWdfaW5mbyA9IHNlZ2luZm87Ci0JZWxzZQotCSAgYmZkX3NldF9zZWN0aW9uX3VzZXJkYXRhIChzdGRvdXRwdXQsIHNlZywgKFBUUikgc2VnaW5mbyk7Ci0gICAgICB9Ci0gIH0KLSNlbHNlCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICBzZWdfZml4X3Jvb3RQID0gJnNlZ21lbnRfaW5mb1tzZWddLmZpeF9yb290OwotICBzZWdfZml4X3RhaWxQID0gJnNlZ21lbnRfaW5mb1tzZWddLmZpeF90YWlsOwotI2Vsc2UKLSAgaWYgKHNlZyA9PSBTRUdfREFUQSkKLSAgICB7Ci0gICAgICBzZWdfZml4X3Jvb3RQID0gJmRhdGFfZml4X3Jvb3Q7Ci0gICAgICBzZWdfZml4X3RhaWxQID0gJmRhdGFfZml4X3RhaWw7Ci0gICAgfQotICBlbHNlIGlmIChzZWcgPT0gU0VHX1RFWFQpCi0gICAgewotICAgICAgc2VnX2ZpeF9yb290UCA9ICZ0ZXh0X2ZpeF9yb290OwotICAgICAgc2VnX2ZpeF90YWlsUCA9ICZ0ZXh0X2ZpeF90YWlsOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKHNlZyA9PSBTRUdfQlNTKTsKLSAgICAgIHNlZ19maXhfcm9vdFAgPSAmYnNzX2ZpeF9yb290OwotICAgICAgc2VnX2ZpeF90YWlsUCA9ICZic3NfZml4X3RhaWw7Ci0gICAgfQotCi0jZW5kaWYKLSNlbmRpZgotfQotDAotc3RhdGljIHZvaWQKLXN1YnNlZ19zZXRfcmVzdCAoc2VnLCBzdWJzZWcpCi0gICAgIHNlZ1Qgc2VnOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgcmVnaXN0ZXIgZnJjaGFpblMgKmZyY1A7CS8qIGNyYXdsIGZyY2hhaW4gY2hhaW4gKi8KLSAgcmVnaXN0ZXIgZnJjaGFpblMgKipsYXN0UFA7CS8qIGFkZHJlc3Mgb2YgbGFzdCBwb2ludGVyICovCi0gIGZyY2hhaW5TICpuZXdQOwkJLyogYWRkcmVzcyBvZiBuZXcgZnJjaGFpbiAqLwotCi0gIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLQotICBpZiAoZnJhZ19ub3cgJiYgZnJjaGFpbl9ub3cpCi0gICAgZnJjaGFpbl9ub3ctPmZyY2hfZnJhZ19ub3cgPSBmcmFnX25vdzsKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93ID09IDAKLQkgIHx8IG5vd19zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgIHx8IG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbgotCSAgfHwgZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgc3Vic2VnX2NoYW5nZSAoc2VnLCAoaW50KSBzdWJzZWcpOwotCi0gIGlmIChzZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBmcmNoYWluX25vdyA9ICZhYnNvbHV0ZV9mcmNoYWluOwotICAgICAgZnJhZ19ub3cgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3cgPT0gMAotCSAgfHwgbm93X3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbgotCSAgfHwgZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgLyoKLSAgICogQXR0ZW1wdCB0byBmaW5kIG9yIG1ha2UgYSBmcmNoYWluIGZvciB0aGF0IHN1YiBzZWcuCi0gICAqIENyYXdsIGFsb25nIGNoYWluIG9mIGZyY2hhaW5TcywgYmVnaW5zIEAgZnJjaGFpbl9yb290LgotICAgKiBJZiB3ZSBuZWVkIHRvIG1ha2UgYSBmcmNoYWluUywgbGluayBpdCBpbnRvIGNvcnJlY3QKLSAgICogcG9zaXRpb24gb2YgY2hhaW4gcm9vdGVkIGluIGZyY2hhaW5fcm9vdC4KLSAgICovCi0gIGZvciAoZnJjUCA9ICoobGFzdFBQID0gJmZyY2hhaW5fcm9vdCk7Ci0gICAgICAgZnJjUCAmJiBmcmNQLT5mcmNoX3NlZyA8PSBzZWc7Ci0gICAgICAgZnJjUCA9ICoobGFzdFBQID0gJmZyY1AtPmZyY2hfbmV4dCkpCi0gICAgewotICAgICAgaWYgKGZyY1AtPmZyY2hfc2VnID09IHNlZwotCSAgJiYgZnJjUC0+ZnJjaF9zdWJzZWcgPj0gc3Vic2VnKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIGZyY1A6CQlBZGRyZXNzIG9mIHRoZSAxc3QgZnJjaGFpblMgaW4gY29ycmVjdCBzZWdtZW50IHdpdGgKLSAgICoJCWZyY2hfc3Vic2VnID49IHN1YnNlZy4KLSAgICoJCVdlIHdhbnQgdG8gZWl0aGVyIHVzZSB0aGlzIGZyY2hhaW5TLCBvciB3ZSB3YW50Ci0gICAqCQl0byBpbnNlcnQgYSBuZXcgZnJjaGFpblMganVzdCBiZWZvcmUgaXQuCi0gICAqCi0gICAqCQlJZiBmcmNQPT1OVUxMLCB0aGVuIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbgotICAgKgkJb2YgZnJjaGFpblMtcy4gQSBOVUxMIGZyY1AgbWVhbnMgd2UgZmVsbCBvZmYgdGhlIGVuZAotICAgKgkJb2YgdGhlIGNoYWluIGxvb2tpbmcgZm9yIGEKLSAgICoJCWZyY2hfc3Vic2VnID49IHN1YnNlZywgc28gd2UKLSAgICoJCW11c3QgbWFrZSBhIG5ldyBmcmNoYWluUy4KLSAgICoKLSAgICoJCUlmIHdlIGV2ZXIgbWFpbnRhaW4gYSBwb2ludGVyIHRvCi0gICAqCQl0aGUgbGFzdCBmcmNoYWluUyBpbiB0aGUgY2hhaW4sIHdlIGNoYW5nZSB0aGF0IHBvaW50ZXIKLSAgICoJCU9OTFkgd2hlbiBmcmNQPT1OVUxMLgotICAgKgotICAgKiBsYXN0UFA6CUFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgd2l0aCB2YWx1ZSBmcmNQOwotICAgKgkJTmV2ZXIgTlVMTC4KLSAgICoJCU1heSBwb2ludCB0byBmcmNoYWluX3Jvb3QuCi0gICAqCi0gICAqLwotICBpZiAoIWZyY1AKLSAgICAgIHx8IChmcmNQLT5mcmNoX3NlZyA+IHNlZwotCSAgfHwgZnJjUC0+ZnJjaF9zdWJzZWcgPiBzdWJzZWcpKQkvKiBLaW5reSBsb2dpYyBvbmx5IHdvcmtzIHdpdGggMiBzZWdtZW50cy4gKi8KLSAgICB7Ci0gICAgICAvKgotICAgICAgICogVGhpcyBzaG91bGQgYmUgdGhlIG9ubHkgY29kZSB0aGF0IGNyZWF0ZXMgYSBmcmNoYWluUy4KLSAgICAgICAqLwotICAgICAgbmV3UCA9IChmcmNoYWluUyAqKSBvYnN0YWNrX2FsbG9jICgmZnJjaGFpbnMsIHNpemVvZiAoZnJjaGFpblMpKTsKLSAgICAgIG5ld1AtPmZyY2hfc3Vic2VnID0gc3Vic2VnOwotICAgICAgbmV3UC0+ZnJjaF9zZWcgPSBzZWc7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgbmV3UC0+Zml4X3Jvb3QgPSBOVUxMOwotICAgICAgbmV3UC0+Zml4X3RhaWwgPSBOVUxMOwotI2VuZGlmCi0gICAgICBvYnN0YWNrX2JlZ2luICgmbmV3UC0+ZnJjaF9vYnN0YWNrLCBjaHVua3NpemUpOwotI2lmIF9fR05VQ19fID49IDIKLSAgICAgIG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKCZuZXdQLT5mcmNoX29ic3RhY2spID0gX19hbGlnbm9mX18gKGZyYWdTKSAtIDE7Ci0jZW5kaWYKLSAgICAgIG5ld1AtPmZyY2hfZnJhZ19ub3cgPSBmcmFnX2FsbG9jICgmbmV3UC0+ZnJjaF9vYnN0YWNrKTsKLSAgICAgIG5ld1AtPmZyY2hfZnJhZ19ub3ctPmZyX3R5cGUgPSByc19maWxsOwotCi0gICAgICBuZXdQLT5mcmNoX3Jvb3QgPSBuZXdQLT5mcmNoX2xhc3QgPSBuZXdQLT5mcmNoX2ZyYWdfbm93OwotCi0gICAgICAqbGFzdFBQID0gbmV3UDsKLSAgICAgIG5ld1AtPmZyY2hfbmV4dCA9IGZyY1A7CS8qIHBlcmhhcHMgTlVMTCAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgewotCXNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotCXNlZ2luZm8gPSBzZWdfaW5mbyAoc2VnKTsKLQlpZiAoc2VnaW5mbyAmJiBzZWdpbmZvLT5mcmNoYWluUCA9PSBmcmNQKQotCSAgc2VnaW5mby0+ZnJjaGFpblAgPSBuZXdQOwotICAgICAgfQotI2VuZGlmCi0gICAgICAKLSAgICAgIGZyY1AgPSBuZXdQOwotICAgIH0KLSAgLyoKLSAgICogSGVyZSB3aXRoIGZyY1AgcG9pbnRpbmcgdG8gdGhlIGZyY2hhaW5TIGZvciBzdWJzZWcuCi0gICAqLwotICBmcmNoYWluX25vdyA9IGZyY1A7Ci0gIGZyYWdfbm93ID0gZnJjUC0+ZnJjaF9mcmFnX25vdzsKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93LT5mcmNoX2xhc3QgPT0gZnJhZ19ub3cpOwotfQotCi0vKgotICoJCQlzdWJzZWdfc2V0KHNlZ1QsIHN1YnNlZ1QpCi0gKgotICogSWYgeW91IGF0dGVtcHQgdG8gY2hhbmdlIHRvIHRoZSBjdXJyZW50IHN1YnNlZ21lbnQsIG5vdGhpbmcgaGFwcGVucy4KLSAqCi0gKiBJbjoJc2VnVCwgc3Vic2VnVCBjb2RlIGZvciBuZXcgc3Vic2VnbWVudC4KLSAqCWZyYWdfbm93IC0+IGluY29tcGxldGUgZnJhZyBmb3IgY3VycmVudCBzdWJzZWdtZW50LgotICoJSWYgZnJhZ19ub3c9PU5VTEwsIHRoZW4gdGhlcmUgaXMgbm8gb2xkLCBpbmNvbXBsZXRlIGZyYWcsIHNvCi0gKgl0aGUgb2xkIGZyYWcgaXMgbm90IGNsb3NlZCBvZmYuCi0gKgotICogT3V0Oglub3dfc3Vic2VnLCBub3dfc2VnIHVwZGF0ZWQuCi0gKglGcmNoYWluX25vdyBwb2ludHMgdG8gdGhlIChwb3NzaWJseSBuZXcpIHN0cnVjdCBmcmNoYWluIGZvciB0aGlzCi0gKglzdWItc2VnbWVudC4KLSAqCUZyY2hhaW5fcm9vdCB1cGRhdGVkIGlmIG5lZWRlZC4KLSAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotc2VnVAotc3Vic2VnX25ldyAoc2VnbmFtZSwgc3Vic2VnKQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IChpbnQpIFNFR19NQVhJTVVNX09SRElOQUw7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzOwotCi0gICAgICBzID0gc2VnbWVudF9uYW1lICgoc2VnVCkgaSk7Ci0gICAgICBpZiAoc3RyY21wIChzZWduYW1lLCBzKSA9PSAwCi0JICB8fCAoc2VnbmFtZVswXSA9PSAnLicKLQkgICAgICAmJiBzdHJjbXAgKHNlZ25hbWUgKyAxLCBzKSA9PSAwKSkKLQl7Ci0JICBzdWJzZWdfc2V0ICgoc2VnVCkgaSwgc3Vic2VnKTsKLQkgIHJldHVybiAoc2VnVCkgaTsKLQl9Ci0jaWZkZWYgb2JqX3NlZ21lbnRfbmFtZQotICAgICAgcyA9IG9ial9zZWdtZW50X25hbWUgKChzZWdUKSBpKTsKLSAgICAgIGlmIChzdHJjbXAgKHNlZ25hbWUsIHMpID09IDAKLQkgIHx8IChzZWduYW1lWzBdID09ICcuJwotCSAgICAgICYmIHN0cmNtcCAoc2VnbmFtZSArIDEsIHMpID09IDApKQotCXsKLQkgIHN1YnNlZ19zZXQgKChzZWdUKSBpLCBzdWJzZWcpOwotCSAgcmV0dXJuIChzZWdUKSBpOwotCX0KLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIG9ial9hZGRfc2VnbWVudAotICB7Ci0gICAgc2VnVCBuZXdfc2VnOwotICAgIG5ld19zZWcgPSBvYmpfYWRkX3NlZ21lbnQgKHNlZ25hbWUpOwotICAgIHN1YnNlZ19zZXQgKG5ld19zZWcsIHN1YnNlZyk7Ci0gICAgcmV0dXJuIG5ld19zZWc7Ci0gIH0KLSNlbHNlCi0gIGFzX2JhZCAoXygiQXR0ZW1wdCB0byBzd2l0Y2ggdG8gbm9uZXhpc3RlbnQgc2VnbWVudCBcIiVzXCIiKSwgc2VnbmFtZSk7Ci0gIHJldHVybiBub3dfc2VnOwotI2VuZGlmCi19Ci0KLXZvaWQKLXN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKQkvKiBiZWdpbiBhc3NlbWJseSBmb3IgYSBuZXcgc3ViLXNlZ21lbnQgKi8KLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWc7CQkvKiBTRUdfREFUQSBvciBTRUdfVEVYVCAqLwotICAgICByZWdpc3RlciBzdWJzZWdUIHN1YnNlZzsKLXsKLSNpZm5kZWYgTUFOWV9TRUdNRU5UUwotICBrbm93IChzZWcgPT0gU0VHX0RBVEEKLQl8fCBzZWcgPT0gU0VHX1RFWFQKLQl8fCBzZWcgPT0gU0VHX0JTUwotCXx8IHNlZyA9PSBTRUdfQUJTT0xVVEUpOwotI2VuZGlmCi0KLSAgaWYgKHNlZyAhPSBub3dfc2VnIHx8IHN1YnNlZyAhPSBub3dfc3Vic2VnKQotICAgIHsJCQkJLyogd2UganVzdCBjaGFuZ2VkIHN1Yi1zZWdtZW50cyAqLwotICAgICAgc3Vic2VnX3NldF9yZXN0IChzZWcsIHN1YnNlZyk7Ci0gICAgfQotICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci19Ci0KLSNlbHNlIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotc2VnVAotc3Vic2VnX2dldCAoc2VnbmFtZSwgZm9yY2VfbmV3KQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBpbnQgZm9yY2VfbmV3OwotewotICBzZWdUIHNlY3B0cjsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gIGNvbnN0IGNoYXIgKm5vd19zZWdfbmFtZSA9IChub3dfc2VnCi0JCQkgICAgICA/IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIG5vd19zZWcpCi0JCQkgICAgICA6IDApOwotCi0gIGlmICghZm9yY2VfbmV3Ci0gICAgICAmJiBub3dfc2VnX25hbWUKLSAgICAgICYmIChub3dfc2VnX25hbWUgPT0gc2VnbmFtZQotCSAgfHwgIXN0cmNtcCAobm93X3NlZ19uYW1lLCBzZWduYW1lKSkpCi0gICAgcmV0dXJuIG5vd19zZWc7Ci0KLSAgaWYgKCFmb3JjZV9uZXcpCi0gICAgc2VjcHRyID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIHNlZ25hbWUpOwotICBlbHNlCi0gICAgc2VjcHRyID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKHN0ZG91dHB1dCwgc2VnbmFtZSk7Ci0KLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOwotICBpZiAoISBzZWdpbmZvKQotICAgIHsKLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3V0cHV0X3NlY3Rpb24gaXMgc2V0IGZpcnN0IGJlY2F1c2Ugc2VjcHRyIG1heQotICAgICAgICAgYmUgYmZkX2Fic19zZWN0aW9uX3B0ci4gICovCi0gICAgICBpZiAoc2VjcHRyLT5vdXRwdXRfc2VjdGlvbiAhPSBzZWNwdHIpCi0Jc2VjcHRyLT5vdXRwdXRfc2VjdGlvbiA9IHNlY3B0cjsKLSAgICAgIHNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2VnaW5mbykpOwotICAgICAgbWVtc2V0ICgoUFRSKSBzZWdpbmZvLCAwLCBzaXplb2YgKCpzZWdpbmZvKSk7Ci0gICAgICBzZWdpbmZvLT5maXhfcm9vdCA9IE5VTEw7Ci0gICAgICBzZWdpbmZvLT5maXhfdGFpbCA9IE5VTEw7Ci0gICAgICBzZWdpbmZvLT5iZmRfc2VjdGlvbiA9IHNlY3B0cjsKLSAgICAgIGlmIChzZWNwdHIgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLQlhYnNfc2VnX2luZm8gPSBzZWdpbmZvOwotICAgICAgZWxzZSBpZiAoc2VjcHRyID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0JdW5kX3NlZ19pbmZvID0gc2VnaW5mbzsKLSAgICAgIGVsc2UKLQliZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VjcHRyLCAoUFRSKSBzZWdpbmZvKTsKLSAgICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmxpbmVub19saXN0X2hlYWQgPSBzZWdpbmZvLT5saW5lbm9fbGlzdF90YWlsID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPnN5bSA9IE5VTEw7Ci0gICAgICBzZWdpbmZvLT5kb3QgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHNlY3B0cjsKLX0KLQotc2VnVAotc3Vic2VnX25ldyAoc2VnbmFtZSwgc3Vic2VnKQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgc2VnVCBzZWNwdHI7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotCi0gIHNlY3B0ciA9IHN1YnNlZ19nZXQgKHNlZ25hbWUsIDApOwotICBzdWJzZWdfc2V0X3Jlc3QgKHNlY3B0ciwgc3Vic2VnKTsKLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOwotICBpZiAoISBzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBzZWdpbmZvLT5mcmNoYWluUCA9IGZyY2hhaW5fbm93OwotICByZXR1cm4gc2VjcHRyOwotfQotCi0vKiBMaWtlIHN1YnNlZ19uZXcsIGV4Y2VwdCBhIG5ldyBzZWN0aW9uIGlzIGFsd2F5cyBjcmVhdGVkLCBldmVuIGlmCi0gICBhIHNlY3Rpb24gd2l0aCB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMuICAqLwotc2VnVAotc3Vic2VnX2ZvcmNlX25ldyAoc2VnbmFtZSwgc3Vic2VnKQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgc2VnVCBzZWNwdHI7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotCi0gIHNlY3B0ciA9IHN1YnNlZ19nZXQgKHNlZ25hbWUsIDEpOwotICBzdWJzZWdfc2V0X3Jlc3QgKHNlY3B0ciwgc3Vic2VnKTsKLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOwotICBpZiAoISBzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBzZWdpbmZvLT5mcmNoYWluUCA9IGZyY2hhaW5fbm93OwotICByZXR1cm4gc2VjcHRyOwotfQotCi12b2lkCi1zdWJzZWdfc2V0IChzZWNwdHIsIHN1YnNlZykKLSAgICAgc2VnVCBzZWNwdHI7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBpZiAoISAoc2VjcHRyID09IG5vd19zZWcgJiYgc3Vic2VnID09IG5vd19zdWJzZWcpKQotICAgIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOwotICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci19Ci0KLSNpZm5kZWYgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCi0jZGVmaW5lIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyhTRUMpCTAKLSNlbmRpZgotCi0vKiBHZXQgdGhlIGdhcyBpbmZvcm1hdGlvbiB3ZSBhcmUgc3RvcmluZyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc2VnbWVudF9pbmZvX3R5cGUgKgotc2VnX2luZm8gKHNlYykKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIGlmIChzZWMgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLSAgICByZXR1cm4gYWJzX3NlZ19pbmZvOwotICBlbHNlIGlmIChzZWMgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKLSAgICByZXR1cm4gdW5kX3NlZ19pbmZvOwotICBlbHNlCi0gICAgcmV0dXJuIChzZWdtZW50X2luZm9fdHlwZSAqKSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VjKTsKLX0KLQotc3ltYm9sUyAqCi1zZWN0aW9uX3N5bWJvbCAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgc3ltYm9sUyAqczsKLQotICBpZiAoc2VnaW5mbyA9PSAwKQotICAgIGFib3J0ICgpOwotICBpZiAoc2VnaW5mby0+c3ltKQotICAgIHJldHVybiBzZWdpbmZvLT5zeW07Ci0KLSNpZm5kZWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMKLSNkZWZpbmUgRU1JVF9TRUNUSU9OX1NZTUJPTFMgMQotI2VuZGlmCi0KLSAgaWYgKCEgRU1JVF9TRUNUSU9OX1NZTUJPTFMKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICB8fCBzeW1ib2xfdGFibGVfZnJvemVuCi0jZW5kaWYKLSAgICAgICkKLSAgICB7Ci0gICAgICAvKiBIZXJlIHdlIGtub3cgaXQgd29uJ3QgYmUgZ29pbmcgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIHMgPSBzeW1ib2xfY3JlYXRlIChzZWMtPm5hbWUsIHNlYywgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzID0gc3ltYm9sX2ZpbmRfYmFzZSAoc2VjLT5uYW1lLCAwKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcyA9IHN5bWJvbF9uZXcgKHNlYy0+bmFtZSwgc2VjLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgewotCSAgICAgIFNfU0VUX1NFR01FTlQgKHMsIHNlYyk7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChzLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBTX0NMRUFSX0VYVEVSTkFMIChzKTsKLQotICAvKiBVc2UgdGhlIEJGRCBzZWN0aW9uIHN5bWJvbCwgaWYgcG9zc2libGUuICAqLwotICBpZiAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpKQotICAgIHN5bWJvbF9zZXRfYmZkc3ltIChzLCBzZWMtPnN5bWJvbCk7Ci0KLSAgc2VnaW5mby0+c3ltID0gczsKLSAgcmV0dXJuIHM7Ci19Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLS8qIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBpcyB0aG91Z2h0IHRvIGhvbGQgdGV4dC4gICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotY29uc3QgY2hhciAqIGNvbnN0IG5vbnRleHRfc2VjdGlvbl9uYW1lc1tdID0KLXsKLSAgIi5laF9mcmFtZSIsCi0gICIuZ2NjX2V4Y2VwdF90YWJsZSIsCi0jaWZkZWYgT0JKX0NPRkYKLSNpZm5kZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgIi5laF9mcmFtIiwKLSAgIi5nY2NfZXhjIiwKLSNlbmRpZgotI2VuZGlmCi0gIE5VTEwKLX07Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLWludAotc3Vic2VnX3RleHRfcCAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHJldHVybiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYykgJiBTRUNfQ09ERSkgIT0gMDsKLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotICBjb25zdCBjaGFyICogY29uc3QgKnA7Ci0KLSAgaWYgKHNlYyA9PSBkYXRhX3NlY3Rpb24gfHwgc2VjID09IGJzc19zZWN0aW9uKQotICAgIHJldHVybiAwOwotCi0gIGZvciAocCA9IG5vbnRleHRfc2VjdGlvbl9uYW1lczsgKnAgIT0gTlVMTDsgKytwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VjKSwgKnApID09IDApCi0JcmV0dXJuIDA7Ci0KLSNpZmRlZiBvYmpfc2VnbWVudF9uYW1lCi0gICAgICBpZiAoc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChzZWMpLCAqcCkgPT0gMCkKLQlyZXR1cm4gMDsKLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gMTsKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotfQotCi12b2lkCi1zdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGZyY2hhaW5TICpmcmNocDsKLSAgZnByaW50ZiAoZmlsZSwgImZyYWcgY2hhaW5zOlxuIik7Ci0gIGZvciAoZnJjaHAgPSBmcmNoYWluX3Jvb3Q7IGZyY2hwOyBmcmNocCA9IGZyY2hwLT5mcmNoX25leHQpCi0gICAgewotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIGZyYWdTICpmcmFncDsKLQotICAgICAgLyogSWYgZnJjaF9zdWJzZWcgaXMgbm9uLXplcm8sIGl0J3MgcHJvYmFibHkgYmVlbiBjaGFpbmVkIG9udG8KLQkgdGhlIGVuZCBvZiBhIHByZXZpb3VzIHN1YnNlY3Rpb24uICBEb24ndCBjb3VudCBpdCBhZ2Fpbi4gICovCi0gICAgICBpZiAoZnJjaHAtPmZyY2hfc3Vic2VnICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNraXAgZ2FzLWludGVybmFsIHNlY3Rpb25zLiAgKi8KLSAgICAgIGlmIChzZWdtZW50X25hbWUgKGZyY2hwLT5mcmNoX3NlZylbMF0gPT0gJyonKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKGZyYWdwID0gZnJjaHAtPmZyY2hfcm9vdDsgZnJhZ3A7IGZyYWdwID0gZnJhZ3AtPmZyX25leHQpCi0JewotI2lmIDAKLQkgIHN3aXRjaCAoZnJhZ3AtPmZyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSByc19maWxsOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJmIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX2FsaWduOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJhIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX2FsaWduX2NvZGU6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgImMiKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfb3JnOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJvIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCSAgICAgIGZwcmludGYgKGZpbGUsICJtIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX3NwYWNlOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJzIik7IGJyZWFrOwotCSAgICBjYXNlIDA6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIjAiKTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIj8iKTsgYnJlYWs7Ci0JICAgIH0KLSNlbmRpZgotCSAgY291bnQrKzsKLQl9Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcdCVwICUtMTBzXHQlMTBkIGZyYWdzXG4iLCBmcmNocCwKLQkgICAgICAgc2VnbWVudF9uYW1lIChmcmNocC0+ZnJjaF9zZWcpLCBjb3VudCk7Ci0gICAgfQotfQotCi0vKiBlbmQgb2Ygc3Vic2Vncy5jICovCmRpZmYgLS1naXQgYS9nYXMvc3Vic2Vncy5oIGIvZ2FzL3N1YnNlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0MGQ1Yi4uMDAwMDAwMAotLS0gYS9nYXMvc3Vic2Vncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qIHN1YnNlZ3MuaCAtPiBzdWJzZWdzLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogRm9yIGV2ZXJ5IHN1Yi1zZWdtZW50IHRoZSB1c2VyIG1lbnRpb25zIGluIHRoZSBBU3NlbWJsZXIgcHJvZ3JhbSwKLSAqIHdlIG1ha2Ugb25lIHN0cnVjdCBmcmNoYWluLiBFYWNoIHN1Yi1zZWdtZW50IGhhcyBleGFjdGx5IG9uZSBzdHJ1Y3QgZnJjaGFpbgotICogYW5kIHZpY2UgdmVyc2EuCi0gKgotICogU3RydWN0IGZyY2hhaW4ncyBhcmUgZm9yd2FyZCBjaGFpbmVkIChpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc3ViLXNlZ21lbnQKLSAqIGNvZGUgbnVtYmVyKS4gVGhlIGNoYWluIHJ1bnMgdGhyb3VnaCBmcmNoX25leHQgb2YgZWFjaCBzdWJzZWdtZW50LgotICogVGhpcyBtYWtlcyBpdCBoYXJkIHRvIGZpbmQgYSBzdWJzZWdtZW50J3MgZnJhZ3MKLSAqIGlmIHByb2dyYW1tZXIgdXNlcyBhIGxvdCBvZiB0aGVtLiBNb3N0IHByb2dyYW1zIG9ubHkgdXNlIHRleHQwIGFuZAotICogZGF0YTAsIHNvIHRoZXkgZG9uJ3Qgc3VmZmVyLiBBdCBsZWFzdCB0aGlzIHdheToKLSAqICgxKQlUaGVyZSBhcmUgbm8gImFyYml0cmFyeSIgcmVzdHJpY3Rpb25zIG9uIGhvdyBtYW55IHN1YnNlZ21lbnRzCi0gKgljYW4gYmUgcHJvZ3JhbW1lZDsKLSAqICgyKQlTdWJzZWdtZW50cycgZnJjaGFpbi1zIGFyZSAobGF0ZXIpIGNoYWluZWQgdG9nZXRoZXIgaW4gdGhlIG9yZGVyIGluCi0gKgl3aGljaCB0aGV5IGFyZSBlbWl0dGVkIGZvciBvYmplY3QgZmlsZSB2aXogdGV4dCB0aGVuIGRhdGEuCi0gKgotICogRnJvbSBlYWNoIHN0cnVjdCBmcmNoYWluIGRhbmdsZXMgYSBjaGFpbiBvZiBzdHJ1Y3QgZnJhZ3MuIFRoZSBmcmFncwotICogcmVwcmVzZW50IGNvZGUgZnJhZ21lbnRzLCBmb3IgdGhhdCBzdWItc2VnbWVudCwgZm9yd2FyZCBjaGFpbmVkLgotICovCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLXN0cnVjdCBmcmNoYWluCQkJLyogY29udHJvbCBidWlsZGluZyBvZiBhIGZyYWcgY2hhaW4gKi8KLXsJCQkJLyogRlJDSCA9IEZSYWdtZW50IENIYWluIGNvbnRyb2wgKi8KLSAgc3RydWN0IGZyYWcgKmZyY2hfcm9vdDsJLyogMXN0IHN0cnVjdCBmcmFnIGluIGNoYWluLCBvciBOVUxMICovCi0gIHN0cnVjdCBmcmFnICpmcmNoX2xhc3Q7CS8qIGxhc3Qgc3RydWN0IGZyYWcgaW4gY2hhaW4sIG9yIE5VTEwgKi8KLSAgc3RydWN0IGZyY2hhaW4gKmZyY2hfbmV4dDsJLyogbmV4dCBpbiBjaGFpbiBvZiBzdHJ1Y3QgZnJjaGFpbi1zICovCi0gIHNlZ1QgZnJjaF9zZWc7CQkvKiBTRUdfVEVYVCBvciBTRUdfREFUQS4gKi8KLSAgc3Vic2VnVCBmcmNoX3N1YnNlZzsJCS8qIHN1YnNlZ21lbnQgbnVtYmVyIG9mIHRoaXMgY2hhaW4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGZpeFMgKmZpeF9yb290OwkJLyogUm9vdCBvZiBmaXh1cHMgZm9yIHRoaXMgc3Vic2VnbWVudC4gICovCi0gIGZpeFMgKmZpeF90YWlsOwkJLyogTGFzdCBmaXh1cCBmb3IgdGhpcyBzdWJzZWdtZW50LiAgKi8KLSNlbmRpZgotICBzdHJ1Y3Qgb2JzdGFjayBmcmNoX29ic3RhY2s7CS8qIGZvciBvYmplY3RzIGluIHRoaXMgZnJhZyBjaGFpbiAqLwotICBmcmFnUyAqZnJjaF9mcmFnX25vdzsJCS8qIGZyYWdfbm93IGZvciB0aGlzIHN1YnNlZ21lbnQgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGZyY2hhaW4gZnJjaGFpblM7Ci0KLS8qIEFsbCBzdWJzZWdtZW50cycgY2hhaW5zIGhhbmcgb2ZmIGhlcmUuICBOVUxMIG1lYW5zIG5vIGZyY2hhaW5zIHlldC4gICovCi1leHRlcm4gZnJjaGFpblMgKmZyY2hhaW5fcm9vdDsKLQotLyogRnJjaGFpbiB3ZSBhcmUgYXNzZW1ibGluZyBpbnRvIG5vdy4gIFRoYXQgaXMsIHRoZSBjdXJyZW50IHNlZ21lbnQncwotICAgZnJhZyBjaGFpbiwgZXZlbiBpZiBpdCBjb250YWlucyBubyAoY29tcGxldGUpIGZyYWdzLiAqLwotZXh0ZXJuIGZyY2hhaW5TICpmcmNoYWluX25vdzsKLQotCi10eXBlZGVmIHN0cnVjdCBzZWdtZW50X2luZm9fc3RydWN0Ci17Ci0gIGZyY2hhaW5TICpmcmNoYWluUDsKLSAgdW5zaWduZWQgaW50IGhhZG9uZSA6IDE7Ci0KLSAgLyogVGhpcyBmaWVsZCBpcyBzZXQgaWYgdGhpcyBpcyBhIC5ic3Mgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCByZWFsbHkKLSAgICAgaGF2ZSBhbnkgY29udGVudHMuICBPbmNlIHVwb24gYSB0aW1lIGEgLmJzcyBzZWN0aW9uIGRpZCBub3QgaGF2ZQotICAgICBhbnkgZnJhZ3MsIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciB0cnVlLiAgVGhpcyBmaWVsZCBwcmV2ZW50IHRoZQotICAgICBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgZnJvbSBiZWluZyBzZXQgZm9yIHRoZSBzZWN0aW9uIGV2ZW4gaWYKLSAgICAgdGhlcmUgYXJlIGZyYWdzLiAgKi8KLSAgdW5zaWduZWQgaW50IGJzcyA6IDE7Ci0KLSAgaW50IHVzZXJfc3R1ZmY7Ci0KLSAgLyogRml4dXBzIGZvciB0aGlzIHNlZ21lbnQuICBJZiBCRkRfQVNTRU1CTEVSLCB0aGlzIGlzIG9ubHkgdmFsaWQKLSAgICAgYWZ0ZXIgdGhlIGZyY2hhaW5zIGFyZSBydW4gdG9nZXRoZXIuICAqLwotICBmaXhTICpmaXhfcm9vdDsKLSAgZml4UyAqZml4X3RhaWw7Ci0KLSNpZiBkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciBzY25oZHI7Ci0gIGVudW0gbGlua29uY2VfdHlwZSBsaW5rb25jZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSNlbmRpZgotCi0gIHN5bWJvbFMgKmRvdDsKLQotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKmxpbmVub19saXN0X2hlYWQ7Ci0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbGluZW5vX2xpc3RfdGFpbDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogV2hpY2ggQkZEIHNlY3Rpb24gZG9lcyB0aGlzIGdhcyBzZWdtZW50IGNvcnJlc3BvbmQgdG8/ICAqLwotICBhc2VjdGlvbiAqYmZkX3NlY3Rpb247Ci0KLSAgLyogTlVMTCwgb3IgcG9pbnRlciB0byB0aGUgZ2FzIHN5bWJvbCB0aGF0IGlzIHRoZSBzZWN0aW9uIHN5bWJvbCBmb3IKLSAgICAgdGhpcyBzZWN0aW9uLiAgc3ltLT5ic3ltIGFuZCBiZmRfc2VjdGlvbi0+c3ltYm9sIHNob3VsZCBiZSB0aGUgc2FtZS4gICovCi0gIHN5bWJvbFMgKnN5bTsKLSNlbmRpZgotCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogQ3VycmVudCBzaXplIG9mIHNlY3Rpb24gaG9sZGluZyBzdGFicyBzdHJpbmdzLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhYl9zdHJpbmdfc2l6ZTsKLSAgICAgIC8qIEluaXRpYWwgZnJhZyBmb3IgRUxGLiAgKi8KLSAgICAgIGNoYXIgKnA7Ci0gICAgfQotICBzdGFidTsKLQotI2lmZGVmIE5FRURfTElURVJBTF9QT09MCi0gIHVuc2lnbmVkIGxvbmcgbGl0ZXJhbF9wb29sX3NpemU7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1NFR01FTlRfSU5GT19UWVBFCi0gIFRDX1NFR01FTlRfSU5GT19UWVBFIHRjX3NlZ21lbnRfaW5mb19kYXRhOwotI2VuZGlmCi19IHNlZ21lbnRfaW5mb190eXBlOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1leHRlcm4gc2VnbWVudF9pbmZvX3R5cGUgKnNlZ19pbmZvIFBBUkFNUyAoKHNlZ1QpKTsKLWV4dGVybiBzeW1ib2xTICpzZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChzZWdUKSk7Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotCi1leHRlcm4gc2VnbWVudF9pbmZvX3R5cGUgc2VnbWVudF9pbmZvW107Ci0KLSNkZWZpbmUgc2VnX2luZm8oU0VDKQkoJnNlZ21lbnRfaW5mb1tTRUNdKQotCi0jZWxzZQotCi0vKiBTZW50aW5lbCBmb3IgZnJjaGFpbiBjcmF3bGluZy4gIFBvaW50cyB0byB0aGUgMXN0IGRhdGEtc2VnbWVudAotICAgZnJjaGFpbi4gIChXaGljaCBpcyBwb2ludGVkIHRvIGJ5IHRoZSBsYXN0IHRleHQtc2VnbWVudCBmcmNoYWluLikgKi8KLWV4dGVybiBmcmNoYWluUyAqZGF0YTBfZnJjaGFpblA7Ci1leHRlcm4gZnJjaGFpblMgKmJzczBfZnJjaGFpblA7Ci0KLS8qIER1bW15IHNvIHN0dWZmIGNhbiBjb21waWxlLiAgU2hvdWxkIG5ldmVyIGJlIHVzZWQuICAqLwotc3RydWN0IHNlZ19pbmZvX3RyYXNoIHsKLSAgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBzdGFiX3N0cmluZ19zaXplIDogMTsKLSAgfSBzdGFidTsKLSAgdW5zaWduZWQgaGFkb25lIDogMTsKLX07Ci0jZGVmaW5lIHNlZ19pbmZvKFMpCShhYm9ydCAoKSwgKHN0cnVjdCBzZWdfaW5mb190cmFzaCAqKSAwKQotCi0jZW5kaWYKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi1leHRlcm4gdm9pZCBzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci0KLS8qIGVuZCBvZiBzdWJzZWdzLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9zeW1ib2xzLmMgYi9nYXMvc3ltYm9scy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTRhMmZkLi4wMDAwMDAwCi0tLSBhL2dhcy9zeW1ib2xzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEwICswLDAgQEAKLS8qIHN5bWJvbHMuYyAtc3ltYm9sIHRhYmxlLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qICNkZWZpbmUgREVCVUdfU1lNUyAvICogdG8gZGVidWcgc3ltYm9sIGxpc3QgbWFpbnRlbmFuY2UgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotCi0jaW5jbHVkZSAib2JzdGFjay5oIgkJLyogRm9yICJzeW1ib2xzLmgiICovCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSAic3RydWMtc3ltYm9sLmgiCi0KLS8qIFRoaXMgaXMgbm9uLXplcm8gaWYgc3ltYm9scyBhcmUgY2FzZSBzZW5zaXRpdmUsIHdoaWNoIGlzIHRoZQotICAgZGVmYXVsdC4gICovCi1pbnQgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSA9IDE7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotZXh0ZXJuIGludCBuZXdfYnJva2VuX3dvcmRzOwotI2VuZGlmCi0KLS8qIHN5bWJvbC1uYW1lID0+IHN0cnVjdCBzeW1ib2wgcG9pbnRlciAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnN5X2hhc2g7Ci0KLS8qIFRhYmxlIG9mIGxvY2FsIHN5bWJvbHMuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmxvY2FsX2hhc2g7Ci0KLS8qIEJlbG93IGFyZSBjb21tZW50ZWQgaW4gInN5bWJvbHMuaCIuICovCi1zeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci1zeW1ib2xTICpzeW1ib2xfbGFzdFA7Ci1zeW1ib2xTIGFic19zeW1ib2w7Ci0KLSNpZmRlZiBERUJVR19TWU1TCi0jZGVmaW5lIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiB2ZXJpZnlfc3ltYm9sX2NoYWluCi0jZWxzZQotI2RlZmluZSBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4ocm9vdCwgbGFzdCkgKCh2b2lkKSAwKQotI2VuZGlmCi0KLXN0cnVjdCBvYnN0YWNrIG5vdGVzOwotCi1zdGF0aWMgdm9pZCBmYl9sYWJlbF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBsb25nIGRvbGxhcl9sYWJlbF9pbnN0YW5jZSBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgbG9uZyBmYl9sYWJlbF9pbnN0YW5jZSBQQVJBTVMgKChsb25nKSk7Ci0KLXN0YXRpYyB2b2lkIHByaW50X2JpbmFyeSBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKiwgZXhwcmVzc2lvblMgKikpOwotCi0vKiBzeW1ib2xfbmV3KCkKLSAgCi0gICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3IHN5bWJvbC4gIERpZSBpZiB3ZSBjYW4ndCBtYWtlIGEgbmV3Ci0gICBzeW1ib2wuICBGaWxsIGluIHRoZSBzeW1ib2wncyB2YWx1ZXMuICBBZGQgc3ltYm9sIHRvIGVuZCBvZiBzeW1ib2wKLSAgIGNoYWluLgotIAotICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBnZW5lcmFsIGNhc2Ugb2YgY3JlYXRpbmcgYQotICAgc3ltYm9sLiAgSG93ZXZlciwgaWYgdGhlIG91dHB1dCBmaWxlIHN5bWJvbCB0YWJsZSBoYXMgYWxyZWFkeSBiZWVuCi0gICBzZXQsIGFuZCB5b3UgYXJlIGNlcnRhaW4gdGhhdCB0aGlzIHN5bWJvbCB3b24ndCBiZSB3YW50ZWQgaW4gdGhlCi0gICBvdXRwdXQgZmlsZSwgeW91IGNhbiBjYWxsIHN5bWJvbF9jcmVhdGUuICAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9uZXcgKG5hbWUsIHNlZ21lbnQsIHZhbHUsIGZyYWcpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHZhbHU7Ci0gICAgIGZyYWdTICpmcmFnOwotewotICBzeW1ib2xTICpzeW1ib2xQID0gc3ltYm9sX2NyZWF0ZSAobmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZyk7Ci0KLSAgLyoKLSAgICogTGluayB0byBlbmQgb2Ygc3ltYm9sIGNoYWluLgotICAgKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHsKLSAgICBleHRlcm4gaW50IHN5bWJvbF90YWJsZV9mcm96ZW47Ci0gICAgaWYgKHN5bWJvbF90YWJsZV9mcm96ZW4pCi0gICAgICBhYm9ydCAoKTsKLSAgfQotI2VuZGlmCi0gIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0KLS8qIFNhdmUgYSBzeW1ib2wgbmFtZSBvbiBhIHBlcm1hbmVudCBvYnN0YWNrLCBhbmQgY29udmVydCBpdCBhY2NvcmRpbmcKLSAgIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zYXZlX3N5bWJvbF9uYW1lIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICB1bnNpZ25lZCBpbnQgbmFtZV9sZW5ndGg7Ci0gIGNoYXIgKnJldDsKLQotICBuYW1lX2xlbmd0aCA9IHN0cmxlbiAobmFtZSkgKyAxOwkvKiArMSBmb3IgXDAgKi8KLSAgb2JzdGFja19ncm93ICgmbm90ZXMsIG5hbWUsIG5hbWVfbGVuZ3RoKTsKLSAgcmV0ID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7Ci0KLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmIChyZXRbMF0gPT0gJ18nKQotICAgICsrcmV0OwotI2VuZGlmCi0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgcmV0ID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChyZXQpOwotI2VuZGlmCi0KLSAgaWYgKCEgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpzOwotCi0gICAgICBmb3IgKHMgPSAodW5zaWduZWQgY2hhciAqKSByZXQ7ICpzICE9ICdcMCc7IHMrKykKLQlpZiAoaXNsb3dlciAoKnMpKQotCSAgKnMgPSB0b3VwcGVyICgqcyk7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN5bWJvbFMgKgotc3ltYm9sX2NyZWF0ZSAobmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIEl0IGlzIGNvcGllZCwgdGhlIGNhbGxlciBjYW4gZGVzdHJveS9tb2RpZnkgKi8KLSAgICAgc2VnVCBzZWdtZW50OwkJLyogU2VnbWVudCBpZGVudGlmaWVyIChTRUdfPHNvbWV0aGluZz4pICovCi0gICAgIHZhbHVlVCB2YWx1OwkJLyogU3ltYm9sIHZhbHVlICovCi0gICAgIGZyYWdTICpmcmFnOwkJLyogQXNzb2NpYXRlZCBmcmFnbWVudCAqLwotewotICBjaGFyICpwcmVzZXJ2ZWRfY29weV9vZl9uYW1lOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIHByZXNlcnZlZF9jb3B5X29mX25hbWUgPSBzYXZlX3N5bWJvbF9uYW1lIChuYW1lKTsKLQotICBzeW1ib2xQID0gKHN5bWJvbFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKHN5bWJvbFMpKTsKLQotICAvKiBzeW1ib2wgbXVzdCBiZSBib3JuIGluIHNvbWUgZml4ZWQgc3RhdGUuICBUaGlzIHNlZW1zIGFzIGdvb2QgYXMgYW55LiAqLwotICBtZW1zZXQgKHN5bWJvbFAsIDAsIHNpemVvZiAoc3ltYm9sUykpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBzeW1ib2xQLT5ic3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChzdGRvdXRwdXQpOwotICBpZiAoc3ltYm9sUC0+YnN5bSA9PSBOVUxMKQotICAgIGFzX3BlcnJvciAoIiVzIiwgImJmZF9tYWtlX2VtcHR5X3N5bWJvbCIpOwotICBzeW1ib2xQLT5ic3ltLT51ZGF0YS5wID0gKFBUUikgc3ltYm9sUDsKLSNlbmRpZgotICBTX1NFVF9OQU1FIChzeW1ib2xQLCBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKTsKLQotICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzZWdtZW50KTsKLSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIHZhbHUpOwotICBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyAoc3ltYm9sUCk7Ci0KLSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWc7Ci0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gfjA7Ci0gIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgfjA7Ci0jZW5kaWYKLQotICBvYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKLQotI2lmZGVmIHRjX3N5bWJvbF9uZXdfaG9vawotICB0Y19zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotI2VuZGlmCi0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0MCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBMb2NhbCBzeW1ib2wgc3VwcG9ydC4gIElmIHdlIGNhbiBnZXQgYXdheSB3aXRoIGl0LCB3ZSBrZWVwIG9ubHkgYQotICAgc21hbGwgYW1vdW50IG9mIGluZm9ybWF0aW9uIGZvciBsb2NhbCBzeW1ib2xzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY2FsX3N5bWJvbF9tYWtlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VnVCwKLQkJCQkJCSAgICAgICB2YWx1ZVQsIGZyYWdTICopKTsKLXN0YXRpYyBzeW1ib2xTICpsb2NhbF9zeW1ib2xfY29udmVydCBQQVJBTVMgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopKTsKLQotLyogVXNlZCBmb3Igc3RhdGlzdGljcy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvY2FsX3N5bWJvbF9jb3VudDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvY2FsX3N5bWJvbF9jb252ZXJzaW9uX2NvdW50OwotCi0vKiBUaGlzIG1hY3JvIGlzIGNhbGxlZCB3aXRoIGEgc3ltYm9sIGFyZ3VtZW50IHBhc3NlZCBieSByZWZlcmVuY2UuCi0gICBJdCByZXR1cm5zIHdoZXRoZXIgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbC4gIElmIG5lY2Vzc2FyeSwgaXQKLSAgIGNoYW5nZXMgaXRzIGFyZ3VtZW50IHRvIHRoZSByZWFsIHN5bWJvbC4gICovCi0KLSNkZWZpbmUgTE9DQUxfU1lNQk9MX0NIRUNLKHMpCQkJCQkJXAotICAocy0+YnN5bSA9PSBOVUxMCQkJCQkJCVwKLSAgID8gKGxvY2FsX3N5bWJvbF9jb252ZXJ0ZWRfcCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcykJCVwKLSAgICAgID8gKHMgPSBsb2NhbF9zeW1ib2xfZ2V0X3JlYWxfc3ltYm9sICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKSwJXAotCSAwKQkJCQkJCQkJXAotICAgICAgOiAxKQkJCQkJCQkJXAotICAgOiAwKQotCi0vKiBDcmVhdGUgYSBsb2NhbCBzeW1ib2wgYW5kIGluc2VydCBpdCBpbnRvIHRoZSBsb2NhbCBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBsb2NhbF9zeW1ib2wgKgotbG9jYWxfc3ltYm9sX21ha2UgKG5hbWUsIHNlY3Rpb24sIG9mZnNldCwgZnJhZykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc2VnVCBzZWN0aW9uOwotICAgICB2YWx1ZVQgb2Zmc2V0OwotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgY2hhciAqbmFtZV9jb3B5OwotICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpyZXQ7Ci0KLSAgKytsb2NhbF9zeW1ib2xfY291bnQ7Ci0KLSAgbmFtZV9jb3B5ID0gc2F2ZV9zeW1ib2xfbmFtZSAobmFtZSk7Ci0KLSAgcmV0ID0gKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKnJldCk7Ci0gIHJldC0+bHN5X21hcmtlciA9IE5VTEw7Ci0gIHJldC0+bHN5X25hbWUgPSBuYW1lX2NvcHk7Ci0gIHJldC0+bHN5X3NlY3Rpb24gPSBzZWN0aW9uOwotICBsb2NhbF9zeW1ib2xfc2V0X2ZyYWcgKHJldCwgZnJhZyk7Ci0gIHJldC0+bHN5X29mZnNldCA9IG9mZnNldDsKLQotICBoYXNoX2phbSAobG9jYWxfaGFzaCwgbmFtZV9jb3B5LCAoUFRSKSByZXQpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIENvbnZlcnQgYSBsb2NhbCBzeW1ib2wgaW50byBhIHJlYWwgc3ltYm9sLiAgTm90ZSB0aGF0IHdlIGRvIG5vdAotICAgcmVjbGFpbSB0aGUgc3BhY2UgdXNlZCBieSB0aGUgbG9jYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIHN5bWJvbFMgKgotbG9jYWxfc3ltYm9sX2NvbnZlcnQgKGxvY3N5bSkKLSAgICAgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jc3ltOwotewotICBzeW1ib2xTICpyZXQ7Ci0KLSAgYXNzZXJ0IChsb2NzeW0tPmxzeV9tYXJrZXIgPT0gTlVMTCk7Ci0gIGlmIChsb2NhbF9zeW1ib2xfY29udmVydGVkX3AgKGxvY3N5bSkpCi0gICAgcmV0dXJuIGxvY2FsX3N5bWJvbF9nZXRfcmVhbF9zeW1ib2wgKGxvY3N5bSk7Ci0KLSAgKytsb2NhbF9zeW1ib2xfY29udmVyc2lvbl9jb3VudDsKLQotICByZXQgPSBzeW1ib2xfbmV3IChsb2NzeW0tPmxzeV9uYW1lLCBsb2NzeW0tPmxzeV9zZWN0aW9uLCBsb2NzeW0tPmxzeV9vZmZzZXQsCi0JCSAgICBsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSkpOwotCi0gIGlmIChsb2NhbF9zeW1ib2xfcmVzb2x2ZWRfcCAobG9jc3ltKSkKLSAgICByZXQtPnN5X3Jlc29sdmVkID0gMTsKLQotICAvKiBMb2NhbCBzeW1ib2xzIGFyZSBhbHdheXMgZWl0aGVyIGRlZmluZWQgb3IgdXNlZC4gICovCi0gIHJldC0+c3lfdXNlZCA9IDE7Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAocmV0KTsKLQotICBsb2NhbF9zeW1ib2xfbWFya19jb252ZXJ0ZWQgKGxvY3N5bSk7Ci0gIGxvY2FsX3N5bWJvbF9zZXRfcmVhbF9zeW1ib2wgKGxvY3N5bSwgcmV0KTsKLQotICBoYXNoX2phbSAobG9jYWxfaGFzaCwgbG9jc3ltLT5sc3lfbmFtZSwgTlVMTCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNkZWZpbmUgTE9DQUxfU1lNQk9MX0NIRUNLKHMpIDAKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX2NvbnZlcnQocykgKChzeW1ib2xTICopIHMpCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQwKLQotLyoKLSAqCQkJY29sb24oKQotICoKLSAqIFdlIGhhdmUganVzdCBzZWVuICI8bmFtZT46Ii4KLSAqIENyZWF0ZXMgYSBzdHJ1Y3Qgc3ltYm9sIHVubGVzcyBpdCBhbHJlYWR5IGV4aXN0cy4KLSAqCi0gKiBHcmlwZXMgaWYgd2UgYXJlIHJlZGVmaW5pbmcgYSBzeW1ib2wgaW5jb21wYXRpYmx5IChhbmQgaWdub3JlcyBpdCkuCi0gKgotICovCi1zeW1ib2xTICoKLWNvbG9uIChzeW1fbmFtZSkJCS8qIGp1c3Qgc2VlbiAieDoiIC0gcmF0dGxlIHN5bWJvbHMgJiBmcmFncyAqLwotICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsJLyogc3ltYm9sIG5hbWUsIGFzIGEgY2Fubm9uaWNhbCBzdHJpbmcgKi8KLSAgICAgLyogV2UgY29weSB0aGlzIHN0cmluZzogT0sgdG8gYWx0ZXIgbGF0ZXIuICovCi17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CS8qIHN5bWJvbCB3ZSBhcmUgd29ya2luZyB3aXRoICovCi0KLSAgLyogU3VuIGxvY2FsIGxhYmVscyBnbyBvdXQgb2Ygc2NvcGUgd2hlbmV2ZXIgYSBub24tbG9jYWwgc3ltYm9sIGlzCi0gICAgIGRlZmluZWQuICAqLwotICBpZiAoTE9DQUxfTEFCRUxTX0RPTExBUikKLSAgICB7Ci0gICAgICBpbnQgbG9jYWw7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBsb2NhbCA9IGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChzdGRvdXRwdXQsIHN5bV9uYW1lKTsKLSNlbHNlCi0gICAgICBsb2NhbCA9IExPQ0FMX0xBQkVMIChzeW1fbmFtZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKCEgbG9jYWwpCi0JZG9sbGFyX2xhYmVsX2NsZWFyICgpOwotICAgIH0KLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0gIGlmIChuZXdfYnJva2VuX3dvcmRzKQotICAgIHsKLSAgICAgIHN0cnVjdCBicm9rZW5fd29yZCAqYTsKLSAgICAgIGludCBwb3NzaWJsZV9ieXRlczsKLSAgICAgIGZyYWdTICpmcmFnX3RtcDsKLSAgICAgIGNoYXIgKmZyYWdfb3Bjb2RlOwotCi0gICAgICBleHRlcm4gY29uc3QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLSAgICAgIGV4dGVybiBjb25zdCBpbnQgbWRfbG9uZ19qdW1wX3NpemU7Ci0gICAgICBwb3NzaWJsZV9ieXRlcyA9IChtZF9zaG9ydF9qdW1wX3NpemUKLQkJCSsgbmV3X2Jyb2tlbl93b3JkcyAqIG1kX2xvbmdfanVtcF9zaXplKTsKLQotICAgICAgZnJhZ190bXAgPSBmcmFnX25vdzsKLSAgICAgIGZyYWdfb3Bjb2RlID0gZnJhZ192YXIgKHJzX2Jyb2tlbl93b3JkLAotCQkJICAgICAgcG9zc2libGVfYnl0ZXMsCi0JCQkgICAgICBwb3NzaWJsZV9ieXRlcywKLQkJCSAgICAgIChyZWxheF9zdWJzdGF0ZVQpIDAsCi0JCQkgICAgICAoc3ltYm9sUyAqKSBicm9rZW5fd29yZHMsCi0JCQkgICAgICAob2Zmc2V0VCkgMCwKLQkJCSAgICAgIE5VTEwpOwotCi0gICAgICAvKiBXZSB3YW50IHRvIHN0b3JlIHRoZSBwb2ludGVyIHRvIHdoZXJlIHRvIGluc2VydCB0aGUganVtcCB0YWJsZSBpbiB0aGUKLQkgZnJfb3Bjb2RlIG9mIHRoZSByc19icm9rZW5fd29yZCBmcmFnLiAgVGhpcyByZXF1aXJlcyBhIGxpdHRsZQotCSBoYWNrZXJ5LiAgKi8KLSAgICAgIHdoaWxlIChmcmFnX3RtcAotCSAgICAgJiYgKGZyYWdfdG1wLT5mcl90eXBlICE9IHJzX2Jyb2tlbl93b3JkCi0JCSB8fCBmcmFnX3RtcC0+ZnJfb3Bjb2RlKSkKLQlmcmFnX3RtcCA9IGZyYWdfdG1wLT5mcl9uZXh0OwotICAgICAga25vdyAoZnJhZ190bXApOwotICAgICAgZnJhZ190bXAtPmZyX29wY29kZSA9IGZyYWdfb3Bjb2RlOwotICAgICAgbmV3X2Jyb2tlbl93b3JkcyA9IDA7Ci0KLSAgICAgIGZvciAoYSA9IGJyb2tlbl93b3JkczsgYSAmJiBhLT5kaXNwZnJhZyA9PSAwOyBhID0gYS0+bmV4dF9icm9rZW5fd29yZCkKLQlhLT5kaXNwZnJhZyA9IGZyYWdfdG1wOwotICAgIH0KLSNlbmRpZiAvKiBXT1JLSU5HX0RPVF9XT1JEICovCi0KLSAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKHN5bV9uYW1lKSkgIT0gMCkKLSAgICB7Ci0jaWZkZWYgUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OCi0gICAgICBpZiAoUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OIChzeW1ib2xQKSkKLQlyZXR1cm4gc3ltYm9sUDsKLSNlbmRpZgotICAgICAgLyoKLSAgICAgICAqCU5vdyBjaGVjayBmb3IgdW5kZWZpbmVkIHN5bWJvbHMKLSAgICAgICAqLwotICAgICAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoc3ltYm9sUCkpCi0JewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY3N5bSA9IChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHN5bWJvbFA7Ci0KLQkgIGlmIChsb2NzeW0tPmxzeV9zZWN0aW9uICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0JICAgICAgJiYgKGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAobG9jc3ltKSAhPSBmcmFnX25vdwotCQkgIHx8IGxvY3N5bS0+bHN5X3NlY3Rpb24gIT0gbm93X3NlZwotCQkgIHx8IGxvY3N5bS0+bHN5X29mZnNldCAhPSBmcmFnX25vd19maXggKCkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkLiIpLCBzeW1fbmFtZSk7Ci0JICAgICAgcmV0dXJuIHN5bWJvbFA7Ci0JICAgIH0KLQotCSAgbG9jc3ltLT5sc3lfc2VjdGlvbiA9IG5vd19zZWc7Ci0JICBsb2NhbF9zeW1ib2xfc2V0X2ZyYWcgKGxvY3N5bSwgZnJhZ19ub3cpOwotCSAgbG9jc3ltLT5sc3lfb2Zmc2V0ID0gZnJhZ19ub3dfZml4ICgpOwotI2VuZGlmCi0JfQotICAgICAgZWxzZSBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgU19JU19DT01NT04gKHN5bWJvbFApKQotCXsKLQkgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPT0gMCkKLQkgICAgewotCSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLSNpZmRlZiBPQkpfVk1TCi0JICAgICAgU19TRVRfT1RIRVIoc3ltYm9sUCwgY29uc3RfZmxhZyk7Ci0jZW5kaWYKLQkgICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBub3dfc2VnKTsKLSNpZmRlZiBOX1VOREYKLQkgICAgICBrbm93IChOX1VOREYgPT0gMCk7Ci0jZW5kaWYgLyogaWYgd2UgaGF2ZSBvbmUsIGl0IGJldHRlciBiZSB6ZXJvLiAqLwotCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICoJVGhlcmUgYXJlIHN0aWxsIHNldmVyYWwgY2FzZXMgdG8gY2hlY2s6Ci0JICAgICAgICoJCUEgLmNvbW0vLmxjb21tIHN5bWJvbCBiZWluZyByZWRlZmluZWQgYXMKLQkgICAgICAgKgkJCWluaXRpYWxpemVkIGRhdGEgaXMgT0sKLQkgICAgICAgKgkJQSAuY29tbS8ubGNvbW0gc3ltYm9sIGJlaW5nIHJlZGVmaW5lZCB3aXRoCi0JICAgICAgICoJCQlhIGxhcmdlciBzaXplIGlzIGFsc28gT0sKLQkgICAgICAgKgotCSAgICAgICAqIFRoaXMgb25seSB1c2VkIHRvIGJlIGFsbG93ZWQgb24gVk1TIGdhcywgYnV0IFN1biBjYwotCSAgICAgICAqIG9uIHRoZSBzcGFyYyBhbHNvIGRlcGVuZHMgb24gaXQuCi0JICAgICAgICovCi0KLQkgICAgICBpZiAoKCghU19JU19ERUJVRyAoc3ltYm9sUCkKLQkJICAgICYmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0JCSAgICAmJiBTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSkKLQkJICAgfHwgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0JCSAgJiYgKG5vd19zZWcgPT0gZGF0YV9zZWN0aW9uCi0JCSAgICAgIHx8IG5vd19zZWcgPT0gU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpKQotCQl7Ci0JCSAgLyoKLQkJICAgKglTZWxlY3Qgd2hpY2ggb2YgdGhlIDIgY2FzZXMgdGhpcyBpcwotCQkgICAqLwotCQkgIGlmIChub3dfc2VnICE9IGRhdGFfc2VjdGlvbikKLQkJICAgIHsKLQkJICAgICAgLyoKLQkJICAgICAgICogICBOZXcgLmNvbW0gZm9yIHByZXYgLmNvbW0gc3ltYm9sLgotCQkgICAgICAgKglJZiB0aGUgbmV3IHNpemUgaXMgbGFyZ2VyIHdlIGp1c3QKLQkJICAgICAgICoJY2hhbmdlIGl0cyB2YWx1ZS4gIElmIHRoZSBuZXcgc2l6ZQotCQkgICAgICAgKglpcyBzbWFsbGVyLCB3ZSBpZ25vcmUgdGhpcyBzeW1ib2wKLQkJICAgICAgICovCi0JCSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkKLQkJCSAgPCAoKHVuc2lnbmVkKSBmcmFnX25vd19maXggKCkpKQotCQkJewotCQkJICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIEl0IGlzIGEgLmNvbW0vLmxjb21tIGJlaW5nIGNvbnZlcnRlZCB0byBpbml0aWFsaXplZAotCQkJIGRhdGEuICAqLwotCQkgICAgICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0jaWZkZWYgT0JKX1ZNUwotCQkgICAgICBTX1NFVF9PVEhFUihzeW1ib2xQLCBjb25zdF9mbGFnKTsKLSNlbmRpZgotCQkgICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQkJICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgbm93X3NlZyk7CS8qIGtlZXAgTl9FWFQgYml0ICovCi0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLSNpZiAoIWRlZmluZWQgKE9CSl9BT1VUKSAmJiAhZGVmaW5lZCAoT0JKX01BWUJFX0FPVVQpIFwKLSAgICAgJiYgIWRlZmluZWQgKE9CSl9CT1VUKSAmJiAhZGVmaW5lZCAoT0JKX01BWUJFX0JPVVQpKQotCQkgIHN0YXRpYyBjb25zdCBjaGFyICpvZF9idWYgPSAiIjsKLSNlbHNlCi0JCSAgY2hhciBvZF9idWZbMTAwXTsKLQkJICBvZF9idWZbMF0gPSAnXDAnOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkJICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLSNlbmRpZgotCQkgICAgc3ByaW50ZihvZF9idWYsICIlZC4lZC4iLAotCQkJICAgIFNfR0VUX09USEVSIChzeW1ib2xQKSwKLQkJCSAgICBTX0dFVF9ERVNDIChzeW1ib2xQKSk7Ci0jZW5kaWYKLQkJICBhc19mYXRhbCAoXygiU3ltYm9sIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQgYXMgXCIlc1wiLyVzJWxkLiIpLAotCQkJICAgIHN5bV9uYW1lLAotCQkJICAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpLAotCQkJICAgIG9kX2J1ZiwKLQkJCSAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApKTsKLQkJfQotCSAgICB9CQkJLyogaWYgdGhlIHVuZGVmaW5lZCBzeW1ib2wgaGFzIG5vIHZhbHVlICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERvbid0IGJsb3cgdXAgaWYgdGhlIGRlZmluaXRpb24gaXMgdGhlIHNhbWUgKi8KLQkgIGlmICghKGZyYWdfbm93ID09IHN5bWJvbFAtPnN5X2ZyYWcKLQkJJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IGZyYWdfbm93X2ZpeCAoKQotCQkmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBub3dfc2VnKSkKLQkgICAgYXNfZmF0YWwgKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQuIiksIHN5bV9uYW1lKTsKLQl9CQkJLyogaWYgdGhpcyBzeW1ib2wgaXMgbm90IHlldCBkZWZpbmVkICovCi0KLSAgICB9Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBlbHNlIGlmICghIGZsYWdfa2VlcF9sb2NhbHMgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKHN0ZG91dHB1dCwgc3ltX25hbWUpKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBsb2NhbF9zeW1ib2xfbWFrZSAoc3ltX25hbWUsIG5vd19zZWcsCi0JCQkJCSAgICAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkJCSAgICAgICBmcmFnX25vdyk7Ci0gICAgfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChzeW1fbmFtZSwgbm93X3NlZywgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJICAgIGZyYWdfbm93KTsKLSNpZmRlZiBPQkpfVk1TCi0gICAgICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgY29uc3RfZmxhZyk7Ci0jZW5kaWYgLyogT0JKX1ZNUyAqLwotCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLSAgICB9CQkJCS8qIGlmIHdlIGhhdmUgc2VlbiB0aGlzIHN5bWJvbCBiZWZvcmUgKi8KLQotICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN5bWJvbCBpcyBhY3R1YWxseSBiZWluZyBkZWZpbmVkIHdpdGhpbiBhbiBNUkkgY29tbW9uCi0gICAgICAgICBzZWN0aW9uLiAgVGhpcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotCXN5bWJvbFAgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgc3ltYm9sUCk7Ci0gICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX29wID0gT19zeW1ib2w7Ci0gICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPSBtcmlfY29tbW9uX3N5bWJvbDsKLSAgICAgIHN5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCk7Ci0gICAgICBzeW1ib2xQLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgZXhwcl9zZWN0aW9uKTsKLSAgICAgIHN5bWJvbFAtPnN5X21yaV9jb21tb24gPSAxOwotICAgIH0KLQotI2lmZGVmIHRjX2Zyb2JfbGFiZWwKLSAgdGNfZnJvYl9sYWJlbCAoc3ltYm9sUCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9sYWJlbAotICBvYmpfZnJvYl9sYWJlbCAoc3ltYm9sUCk7Ci0jZW5kaWYKLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQwKLQotLyoKLSAqCQkJc3ltYm9sX3RhYmxlX2luc2VydCgpCi0gKgotICogRGllIGlmIHdlIGNhbid0IGluc2VydCB0aGUgc3ltYm9sLgotICoKLSAqLwotCi12b2lkIAotc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZXJyb3Jfc3RyaW5nOwotCi0gIGtub3cgKHN5bWJvbFApOwotICBrbm93IChTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoc3ltYm9sUCkpCi0gICAgewotICAgICAgZXJyb3Jfc3RyaW5nID0gaGFzaF9qYW0gKGxvY2FsX2hhc2gsIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkJICAgICAgIChQVFIpIHN5bWJvbFApOwotICAgICAgaWYgKGVycm9yX3N0cmluZyAhPSBOVUxMKQotCWFzX2ZhdGFsIChfKCJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3ltYm9sIHRhYmxlIGZhaWxlZDogJXMiKSwKLQkJICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgZXJyb3Jfc3RyaW5nKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKChlcnJvcl9zdHJpbmcgPSBoYXNoX2phbSAoc3lfaGFzaCwgU19HRVRfTkFNRSAoc3ltYm9sUCksIChQVFIpIHN5bWJvbFApKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN5bWJvbCB0YWJsZSBmYWlsZWQ6ICVzIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLCBlcnJvcl9zdHJpbmcpOwotICAgIH0JCQkJLyogb24gZXJyb3IgKi8KLX0JCQkJLyogc3ltYm9sX3RhYmxlX2luc2VydCgpICovCi0MCi0vKgotICoJCQlzeW1ib2xfZmluZF9vcl9tYWtlKCkKLSAqCi0gKiBJZiBhIHN5bWJvbCBuYW1lIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgaXQgYXMgdW5kZWZpbmVkLCBhbmQgaW5zZXJ0Ci0gKiBpdCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuIFJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0gKi8KLXN5bWJvbFMgKgotc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCi0gIGlmIChzeW1ib2xQID09IE5VTEwpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGlmICghIGZsYWdfa2VlcF9sb2NhbHMgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKHN0ZG91dHB1dCwgbmFtZSkpCi0JewotCSAgc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKChjaGFyICopIG5hbWUpOwotCSAgaWYgKHN5bWJvbFAgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHN5bWJvbFA7Ci0KLQkgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBsb2NhbF9zeW1ib2xfbWFrZSAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJCQkgICAodmFsdWVUKSAwLAotCQkJCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLQkgIHJldHVybiBzeW1ib2xQOwotCX0KLSNlbmRpZgotCi0gICAgICBzeW1ib2xQID0gc3ltYm9sX21ha2UgKG5hbWUpOwotCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLSAgICB9CQkJCS8qIGlmIHN5bWJvbCB3YXNuJ3QgZm91bmQgKi8KLQotICByZXR1cm4gKHN5bWJvbFApOwotfQkJCQkvKiBzeW1ib2xfZmluZF9vcl9tYWtlKCkgKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfbWFrZSAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAvKiBMZXQgdGhlIG1hY2hpbmUgZGVzY3JpcHRpb24gZGVmYXVsdCBpdCwgZS5nLiBmb3IgcmVnaXN0ZXIgbmFtZXMuICovCi0gIHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sICgoY2hhciAqKSBuYW1lKTsKLQotICBpZiAoIXN5bWJvbFApCi0gICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAodmFsdWVUKSAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIHJldHVybiAoc3ltYm9sUCk7Ci19CQkJCS8qIHN5bWJvbF9tYWtlKCkgKi8KLQotLyoKLSAqCQkJc3ltYm9sX2ZpbmQoKQotICoKLSAqIEltcGxlbWVudCBzeW1ib2wgdGFibGUgbG9va3VwLgotICogSW46CUEgc3ltYm9sJ3MgbmFtZSBhcyBhIHN0cmluZzogJ1wwJyBjYW4ndCBiZSBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuCi0gKiBPdXQ6CU5VTEwgaWYgdGhlIG5hbWUgd2FzIG5vdCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBlbHNlIHRoZSBhZGRyZXNzCi0gKglvZiBhIHN0cnVjdCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZS4KLSAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9maW5kIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgcmV0dXJuIChzeW1ib2xfZmluZF9iYXNlIChuYW1lLCAxKSk7Ci0jZWxzZSAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi0gIHJldHVybiAoc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgMCkpOwotI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLX0JCQkJLyogc3ltYm9sX2ZpbmQoKSAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9maW5kX2Jhc2UgKG5hbWUsIHN0cmlwX3VuZGVyc2NvcmUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzdHJpcF91bmRlcnNjb3JlOwotewotICBpZiAoc3RyaXBfdW5kZXJzY29yZSAmJiAqbmFtZSA9PSAnXycpCi0gICAgbmFtZSsrOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHsKLSAgICBjaGFyICpjb3B5OwotICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKG5hbWUpICsgMTsKLQotICAgIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKGxlbik7Ci0gICAgbWVtY3B5IChjb3B5LCBuYW1lLCBsZW4pOwotICAgIG5hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKGNvcHkpOwotICB9Ci0jZW5kaWYKLQotICBpZiAoISBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKQotICAgIHsKLSAgICAgIGNoYXIgKmNvcHk7Ci0gICAgICBjb25zdCBjaGFyICpvcmlnOwotICAgICAgdW5zaWduZWQgY2hhciBjOwotCi0gICAgICBvcmlnID0gbmFtZTsKLSAgICAgIG5hbWUgPSBjb3B5ID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIHdoaWxlICgoYyA9ICpvcmlnKyspICE9ICdcMCcpCi0JewotCSAgaWYgKGlzbG93ZXIgKGMpKQotCSAgICBjID0gdG91cHBlciAoYyk7Ci0JICAqY29weSsrID0gYzsKLQl9Ci0gICAgICAqY29weSA9ICdcMCc7Ci0gICAgfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7Ci0gICAgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jc3ltOwotCi0gICAgbG9jc3ltID0gKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgaGFzaF9maW5kIChsb2NhbF9oYXNoLCBuYW1lKTsKLSAgICBpZiAobG9jc3ltICE9IE5VTEwpCi0gICAgICByZXR1cm4gKHN5bWJvbFMgKikgbG9jc3ltOwotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gKChzeW1ib2xTICopIGhhc2hfZmluZCAoc3lfaGFzaCwgbmFtZSkpOwotfQotCi0vKgotICogT25jZSB1cG9uIGEgdGltZSwgc3ltYm9scyB3ZXJlIGtlcHQgaW4gYSBzaW5nbHkgbGlua2VkIGxpc3QuICBBdAotICogbGVhc3QgY29mZiBuZWVkcyB0byBiZSBhYmxlIHRvIHJlYXJyYW5nZSB0aGVtIGZyb20gdGltZSB0byB0aW1lLCBmb3IKLSAqIHdoaWNoIGEgZG91Ymx5IGxpbmtlZCBsaXN0IGlzIG11Y2ggbW9yZSBjb252ZW5pZW50LiAgTG9pYyBkaWQgdGhlc2UKLSAqIGFzIG1hY3JvcyB3aGljaCBzZWVtZWQgZGFuZ2Vyb3VzIHRvIG1lIHNvIHRoZXkncmUgbm93IGZ1bmN0aW9ucy4KLSAqIHhveG9yaWNoLgotICovCi0KLS8qIExpbmsgc3ltYm9sIEFERE1FIGFmdGVyIHN5bWJvbCBUQVJHRVQgaW4gdGhlIGNoYWluLiAqLwotdm9pZCAKLXN5bWJvbF9hcHBlbmQgKGFkZG1lLCB0YXJnZXQsIHJvb3RQUCwgbGFzdFBQKQotICAgICBzeW1ib2xTICphZGRtZTsKLSAgICAgc3ltYm9sUyAqdGFyZ2V0OwotICAgICBzeW1ib2xTICoqcm9vdFBQOwotICAgICBzeW1ib2xTICoqbGFzdFBQOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChhZGRtZSkpCi0gICAgYWJvcnQgKCk7Ci0gIGlmICh0YXJnZXQgIT0gTlVMTCAmJiBMT0NBTF9TWU1CT0xfQ0hFQ0sgKHRhcmdldCkpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHRhcmdldCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGtub3cgKCpyb290UFAgPT0gTlVMTCk7Ci0gICAgICBrbm93ICgqbGFzdFBQID09IE5VTEwpOwotICAgICAgYWRkbWUtPnN5X25leHQgPSBOVUxMOwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgICAgIGFkZG1lLT5zeV9wcmV2aW91cyA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgICpyb290UFAgPSBhZGRtZTsKLSAgICAgICpsYXN0UFAgPSBhZGRtZTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIHRoZSBsaXN0IGlzIGVtcHR5ICovCi0KLSAgaWYgKHRhcmdldC0+c3lfbmV4dCAhPSBOVUxMKQotICAgIHsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gICAgICB0YXJnZXQtPnN5X25leHQtPnN5X3ByZXZpb3VzID0gYWRkbWU7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKCpsYXN0UFAgPT0gdGFyZ2V0KTsKLSAgICAgICpsYXN0UFAgPSBhZGRtZTsKLSAgICB9CQkJCS8qIGlmIHdlIGhhdmUgYSBuZXh0ICovCi0KLSAgYWRkbWUtPnN5X25leHQgPSB0YXJnZXQtPnN5X25leHQ7Ci0gIHRhcmdldC0+c3lfbmV4dCA9IGFkZG1lOwotCi0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICBhZGRtZS0+c3lfcHJldmlvdXMgPSB0YXJnZXQ7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi0gIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiAoc3ltYm9sX3Jvb3RQLCBzeW1ib2xfbGFzdFApOwotfQotCi0vKiBTZXQgdGhlIGNoYWluIHBvaW50ZXJzIG9mIFNZTUJPTCB0byBudWxsLiAqLwotdm9pZCAKLXN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1ib2xQKSkKLSAgICBhYm9ydCAoKTsKLSAgc3ltYm9sUC0+c3lfbmV4dCA9IE5VTEw7Ci0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICBzeW1ib2xQLT5zeV9wcmV2aW91cyA9IE5VTEw7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLS8qIFJlbW92ZSBTWU1CT0xQIGZyb20gdGhlIGxpc3QuICovCi12b2lkIAotc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgcm9vdFBQLCBsYXN0UFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIHN5bWJvbFMgKipyb290UFA7Ci0gICAgIHN5bWJvbFMgKipsYXN0UFA7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChzeW1ib2xQID09ICpyb290UFApCi0gICAgewotICAgICAgKnJvb3RQUCA9IHN5bWJvbFAtPnN5X25leHQ7Ci0gICAgfQkJCQkvKiBpZiBpdCB3YXMgdGhlIHJvb3QgKi8KLQotICBpZiAoc3ltYm9sUCA9PSAqbGFzdFBQKQotICAgIHsKLSAgICAgICpsYXN0UFAgPSBzeW1ib2xQLT5zeV9wcmV2aW91czsKLSAgICB9CQkJCS8qIGlmIGl0IHdhcyB0aGUgdGFpbCAqLwotCi0gIGlmIChzeW1ib2xQLT5zeV9uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUC0+c3lfbmV4dC0+c3lfcHJldmlvdXMgPSBzeW1ib2xQLT5zeV9wcmV2aW91czsKLSAgICB9CQkJCS8qIGlmIG5vdCBsYXN0ICovCi0KLSAgaWYgKHN5bWJvbFAtPnN5X3ByZXZpb3VzICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUC0+c3lfcHJldmlvdXMtPnN5X25leHQgPSBzeW1ib2xQLT5zeV9uZXh0OwotICAgIH0JCQkJLyogaWYgbm90IGZpcnN0ICovCi0KLSAgZGVidWdfdmVyaWZ5X3N5bWNoYWluICgqcm9vdFBQLCAqbGFzdFBQKTsKLX0KLQotLyogTGluayBzeW1ib2wgQURETUUgYmVmb3JlIHN5bWJvbCBUQVJHRVQgaW4gdGhlIGNoYWluLiAqLwotdm9pZCAKLXN5bWJvbF9pbnNlcnQgKGFkZG1lLCB0YXJnZXQsIHJvb3RQUCwgbGFzdFBQKQotICAgICBzeW1ib2xTICphZGRtZTsKLSAgICAgc3ltYm9sUyAqdGFyZ2V0OwotICAgICBzeW1ib2xTICoqcm9vdFBQOwotICAgICBzeW1ib2xTICoqbGFzdFBQIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKGFkZG1lKSkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAodGFyZ2V0KSkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAodGFyZ2V0LT5zeV9wcmV2aW91cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHRhcmdldC0+c3lfcHJldmlvdXMtPnN5X25leHQgPSBhZGRtZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBrbm93ICgqcm9vdFBQID09IHRhcmdldCk7Ci0gICAgICAqcm9vdFBQID0gYWRkbWU7Ci0gICAgfQkJCQkvKiBpZiBub3QgZmlyc3QgKi8KLQotICBhZGRtZS0+c3lfcHJldmlvdXMgPSB0YXJnZXQtPnN5X3ByZXZpb3VzOwotICB0YXJnZXQtPnN5X3ByZXZpb3VzID0gYWRkbWU7Ci0gIGFkZG1lLT5zeV9uZXh0ID0gdGFyZ2V0OwotCi0gIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiAoKnJvb3RQUCwgKmxhc3RQUCk7Ci19Ci0KLSNlbmRpZiAvKiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTICovCi0KLXZvaWQgCi12ZXJpZnlfc3ltYm9sX2NoYWluIChyb290UCwgbGFzdFApCi0gICAgIHN5bWJvbFMgKnJvb3RQOwotICAgICBzeW1ib2xTICpsYXN0UDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUCA9IHJvb3RQOwotCi0gIGlmIChzeW1ib2xQID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoOyBzeW1ib2xfbmV4dCAoc3ltYm9sUCkgIT0gTlVMTDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYXNzZXJ0IChzeW1ib2xQLT5ic3ltICE9IE5VTEwpOwotI2VuZGlmCi0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICAgICAgYXNzZXJ0IChzeW1ib2xQLT5zeV9uZXh0LT5zeV9wcmV2aW91cyA9PSBzeW1ib2xQKTsKLSNlbHNlCi0gICAgICAvKiBXYWxrIHRoZSBsaXN0IGFueXdheXMsIHRvIG1ha2Ugc3VyZSBwb2ludGVycyBhcmUgc3RpbGwgZ29vZC4gICovCi0gICAgICA7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotICAgIH0KLQotICBhc3NlcnQgKGxhc3RQID09IHN5bWJvbFApOwotfQotCi12b2lkCi12ZXJpZnlfc3ltYm9sX2NoYWluXzIgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBzeW1ib2xTICpwID0gc3ltLCAqbiA9IHN5bTsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gIHdoaWxlIChzeW1ib2xfcHJldmlvdXMgKHApKQotICAgIHAgPSBzeW1ib2xfcHJldmlvdXMgKHApOwotI2VuZGlmCi0gIHdoaWxlIChzeW1ib2xfbmV4dCAobikpCi0gICAgbiA9IHN5bWJvbF9uZXh0IChuKTsKLSAgdmVyaWZ5X3N5bWJvbF9jaGFpbiAocCwgbik7Ci19Ci0KLS8qIFJlc29sdmUgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBmaW5hbAotICAgcGFzcyBvdmVyIHRoZSBzeW1ib2wgdGFibGUgdG8gcmVzb2x2ZSBhbnkgc3ltYm9scyB3aXRoIGNvbXBsZXgKLSAgIHZhbHVlcy4gICovCi0KLXZhbHVlVAotcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bXAsIGZpbmFsaXplKQotICAgICBzeW1ib2xTICpzeW1wOwotICAgICBpbnQgZmluYWxpemU7Ci17Ci0gIGludCByZXNvbHZlZDsKLSAgdmFsdWVUIGZpbmFsX3ZhbDsKLSAgc2VnVCBmaW5hbF9zZWc7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bXApKQotICAgIHsKLSAgICAgIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY3N5bSA9IChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHN5bXA7Ci0KLSAgICAgIGlmIChsb2NhbF9zeW1ib2xfcmVzb2x2ZWRfcCAobG9jc3ltKSkKLQlyZXR1cm4gbG9jc3ltLT5sc3lfb2Zmc2V0IC8gT0NURVRTX1BFUl9CWVRFOwotCi0gICAgICBmaW5hbF92YWwgPSAobG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pLT5mcl9hZGRyZXNzCi0JCSAgICsgbG9jc3ltLT5sc3lfb2Zmc2V0KSAvIE9DVEVUU19QRVJfQllURTsKLQotICAgICAgaWYgKGZpbmFsaXplKQotCXsKLQkgIGxvY3N5bS0+bHN5X29mZnNldCA9IGZpbmFsX3ZhbDsKLQkgIGxvY2FsX3N5bWJvbF9tYXJrX3Jlc29sdmVkIChsb2NzeW0pOwotCX0KLQotICAgICAgcmV0dXJuIGZpbmFsX3ZhbDsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoc3ltcC0+c3lfcmVzb2x2ZWQpCi0gICAgewotICAgICAgaWYgKHN5bXAtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudCkKLQlyZXR1cm4gKHZhbHVlVCkgc3ltcC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotICAgICAgZWxzZQotCXJldHVybiAwOwotICAgIH0KLQotICByZXNvbHZlZCA9IDA7Ci0gIGZpbmFsX3NlZyA9IFNfR0VUX1NFR01FTlQgKHN5bXApOwotCi0gIGlmIChzeW1wLT5zeV9yZXNvbHZpbmcpCi0gICAgewotICAgICAgaWYgKGZpbmFsaXplKQotCWFzX2JhZCAoXygiU3ltYm9sIGRlZmluaXRpb24gbG9vcCBlbmNvdW50ZXJlZCBhdCAlcyIpLCBTX0dFVF9OQU1FIChzeW1wKSk7Ci0gICAgICBmaW5hbF92YWwgPSAwOwotICAgICAgcmVzb2x2ZWQgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmFkZF9zeW1ib2wsICpvcF9zeW1ib2w7Ci0gICAgICBvZmZzZXRUIGxlZnQsIHJpZ2h0OwotICAgICAgc2VnVCBzZWdfbGVmdCwgc2VnX3JpZ2h0OwotICAgICAgb3BlcmF0b3JUIG9wOwotCi0gICAgICBzeW1wLT5zeV9yZXNvbHZpbmcgPSAxOwotCi0gICAgICAvKiBIZWxwIG91dCB3aXRoIENTRS4gICovCi0gICAgICBhZGRfc3ltYm9sID0gc3ltcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotICAgICAgb3Bfc3ltYm9sID0gc3ltcC0+c3lfdmFsdWUuWF9vcF9zeW1ib2w7Ci0gICAgICBmaW5hbF92YWwgPSBzeW1wLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0gICAgICBvcCA9IHN5bXAtPnN5X3ZhbHVlLlhfb3A7Ci0KLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWRlZmF1bHQ6Ci0JICBCQURfQ0FTRSAob3ApOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fYWJzZW50OgotCSAgZmluYWxfdmFsID0gMDsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0KLQljYXNlIE9fY29uc3RhbnQ6Ci0JICBmaW5hbF92YWwgKz0gc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzcyAvIE9DVEVUU19QRVJfQllURTsKLQkgIGlmIChmaW5hbF9zZWcgPT0gZXhwcl9zZWN0aW9uKQotCSAgICBmaW5hbF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCSAgcmVzb2x2ZWQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fc3ltYm9sOgotCWNhc2UgT19zeW1ib2xfcnZhOgotCSAgbGVmdCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0JZG9fc3ltYm9sOgotCi0JICBpZiAoc3ltcC0+c3lfbXJpX2NvbW1vbikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgaW5zaWRlIGFuIE1SSSBjb21tb24gc2VjdGlvbi4gIFRoZQotICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIHJvdXRpbmVzIGFyZSBnb2luZyB0byBoYW5kbGUgaXQgc3BlY2lhbGx5LgotICAgICAgICAgICAgICAgICBEb24ndCBjaGFuZ2UgdGhlIHZhbHVlLiAgKi8KLQkgICAgICByZXNvbHZlZCA9IHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoZmluYWxpemUgJiYgZmluYWxfdmFsID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChhZGRfc3ltYm9sKSkKLQkJYWRkX3N5bWJvbCA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKQotCQkJCQkJICAgYWRkX3N5bWJvbCk7Ci0JICAgICAgY29weV9zeW1ib2xfYXR0cmlidXRlcyAoc3ltcCwgYWRkX3N5bWJvbCk7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgaGF2ZSBlcXVhdGVkIHRoaXMgc3ltYm9sIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAga2VlcCBYX29wIHNldCB0byBPX3N5bWJvbCwgYW5kIHdlIGRvbid0IGNoYW5nZQotICAgICAgICAgICAgIFhfYWRkX251bWJlci4gIFRoaXMgcGVybWl0cyB0aGUgcm91dGluZSB3aGljaCB3cml0ZXMgb3V0Ci0gICAgICAgICAgICAgcmVsb2NhdGlvbiB0byBkZXRlY3QgdGhpcyBjYXNlLCBhbmQgY29udmVydCB0aGUKLSAgICAgICAgICAgICByZWxvY2F0aW9uIHRvIGJlIGFnYWluc3QgdGhlIHN5bWJvbCB0byB3aGljaCB0aGlzIHN5bWJvbAotICAgICAgICAgICAgIGlzIGVxdWF0ZWQuICAqLwotCSAgaWYgKCEgU19JU19ERUZJTkVEIChhZGRfc3ltYm9sKSB8fCBTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbCkpCi0JICAgIHsKLQkgICAgICBpZiAoZmluYWxpemUpCi0JCXsKLQkJICBTX1NFVF9TRUdNRU5UIChzeW1wLCBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sKSk7Ci0JCSAgc3ltcC0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOwotCQkgIHN5bXAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCA9IGFkZF9zeW1ib2w7Ci0JCSAgc3ltcC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID0gZmluYWxfdmFsOwotCQl9Ci0JICAgICAgZmluYWxfdmFsID0gMDsKLQkgICAgICByZXNvbHZlZCA9IHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKTsKLQkgICAgICBnb3RvIGV4aXRfZG9udF9zZXRfdmFsdWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpbmFsX3ZhbCArPSBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzICsgbGVmdDsKLQkgICAgICBpZiAoZmluYWxfc2VnID09IGV4cHJfc2VjdGlvbiB8fCBmaW5hbF9zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCWZpbmFsX3NlZyA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2wpOwotCSAgICB9Ci0KLQkgIHJlc29sdmVkID0gc3ltYm9sX3Jlc29sdmVkX3AgKGFkZF9zeW1ib2wpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fdW1pbnVzOgotCWNhc2UgT19iaXRfbm90OgotCWNhc2UgT19sb2dpY2FsX25vdDoKLQkgIGxlZnQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoYWRkX3N5bWJvbCwgZmluYWxpemUpOwotCi0JICBpZiAob3AgPT0gT191bWludXMpCi0JICAgIGxlZnQgPSAtbGVmdDsKLQkgIGVsc2UgaWYgKG9wID09IE9fbG9naWNhbF9ub3QpCi0JICAgIGxlZnQgPSAhbGVmdDsKLQkgIGVsc2UKLQkgICAgbGVmdCA9IH5sZWZ0OwotCi0JICBmaW5hbF92YWwgKz0gbGVmdCArIHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3M7Ci0JICBpZiAoZmluYWxfc2VnID09IGV4cHJfc2VjdGlvbiB8fCBmaW5hbF9zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JICAgIGZpbmFsX3NlZyA9IGFic29sdXRlX3NlY3Rpb247Ci0KLQkgIHJlc29sdmVkID0gc3ltYm9sX3Jlc29sdmVkX3AgKGFkZF9zeW1ib2wpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fbXVsdGlwbHk6Ci0JY2FzZSBPX2RpdmlkZToKLQljYXNlIE9fbW9kdWx1czoKLQljYXNlIE9fbGVmdF9zaGlmdDoKLQljYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6Ci0JY2FzZSBPX2JpdF9vcl9ub3Q6Ci0JY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6Ci0JY2FzZSBPX2JpdF9hbmQ6Ci0JY2FzZSBPX2FkZDoKLQljYXNlIE9fc3VidHJhY3Q6Ci0JY2FzZSBPX2VxOgotCWNhc2UgT19uZToKLQljYXNlIE9fbHQ6Ci0JY2FzZSBPX2xlOgotCWNhc2UgT19nZToKLQljYXNlIE9fZ3Q6Ci0JY2FzZSBPX2xvZ2ljYWxfYW5kOgotCWNhc2UgT19sb2dpY2FsX29yOgotCSAgbGVmdCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0JICByaWdodCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChvcF9zeW1ib2wsIGZpbmFsaXplKTsKLQkgIHNlZ19sZWZ0ID0gU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbCk7Ci0JICBzZWdfcmlnaHQgPSBTX0dFVF9TRUdNRU5UIChvcF9zeW1ib2wpOwotCi0JICAvKiBTaW1wbGlmeSBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvZiBhIGNvbnN0YW50IGJ5IGZvbGRpbmcgdGhlCi0JICAgICBjb25zdGFudCBpbnRvIFhfYWRkX251bWJlci4gICovCi0JICBpZiAob3AgPT0gT19hZGQgfHwgb3AgPT0gT19zdWJ0cmFjdCkKLQkgICAgewotCSAgICAgIGlmIChzZWdfcmlnaHQgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkJewotCQkgIGlmIChvcCA9PSBPX2FkZCkKLQkJICAgIGZpbmFsX3ZhbCArPSByaWdodDsKLQkJICBlbHNlCi0JCSAgICBmaW5hbF92YWwgLT0gcmlnaHQ7Ci0JCSAgb3AgPSBPX3N5bWJvbDsKLQkJICBvcF9zeW1ib2wgPSBOVUxMOwotCQkgIGdvdG8gZG9fc3ltYm9sOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc2VnX2xlZnQgPT0gYWJzb2x1dGVfc2VjdGlvbiAmJiBvcCA9PSBPX2FkZCkKLQkJewotCQkgIG9wID0gT19zeW1ib2w7Ci0JCSAgZmluYWxfdmFsICs9IGxlZnQ7Ci0JCSAgYWRkX3N5bWJvbCA9IG9wX3N5bWJvbDsKLQkJICBsZWZ0ID0gcmlnaHQ7Ci0JCSAgb3Bfc3ltYm9sID0gTlVMTDsKLQkJICBnb3RvIGRvX3N5bWJvbDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFN1YnRyYWN0aW9uIGlzIHBlcm1pdHRlZCBpZiBib3RoIG9wZXJhbmRzIGFyZSBpbiB0aGUgc2FtZQotCSAgICAgc2VjdGlvbi4gIE90aGVyd2lzZSwgYm90aCBvcGVyYW5kcyBtdXN0IGJlIGFic29sdXRlLiAgV2UKLQkgICAgIGFscmVhZHkgaGFuZGxlZCB0aGUgY2FzZSBvZiBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvZiBhCi0JICAgICBjb25zdGFudCBhYm92ZS4gIFRoaXMgd2lsbCBwcm9iYWJseSBuZWVkIHRvIGJlIGNoYW5nZWQKLQkgICAgIGZvciBhbiBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggc3VwcG9ydHMgYXJiaXRyYXJ5Ci0JICAgICBleHByZXNzaW9ucywgc3VjaCBhcyBJRUVFLTY5NS4gICovCi0JICAvKiBEb24ndCBlbWl0IG1lc3NhZ2VzIHVubGVzcyB3ZSdyZSBmaW5hbGl6aW5nIHRoZSBzeW1ib2wgdmFsdWUsCi0JICAgICBvdGhlcndpc2Ugd2UgbWF5IGdldCB0aGUgc2FtZSBtZXNzYWdlIG11bHRpcGxlIHRpbWVzLiAgKi8KLQkgIGlmICgoc2VnX2xlZnQgIT0gYWJzb2x1dGVfc2VjdGlvbgotCSAgICAgICB8fCBzZWdfcmlnaHQgIT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgICAmJiAob3AgIT0gT19zdWJ0cmFjdAotCQkgIHx8IHNlZ19sZWZ0ICE9IHNlZ19yaWdodAotCQkgIHx8IHNlZ19sZWZ0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICAgICYmIGZpbmFsaXplKQotCSAgICB7Ci0JICAgICAgY2hhciAqZmlsZTsKLQkgICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCSAgICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltcCwgJmZpbGUsICZsaW5lKSkKLQkJewotCQkgIGlmIChzZWdfbGVmdCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwKLQkJCQkgIF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIiksCi0JCQkJICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpKTsKLQkJICBpZiAoc2VnX3JpZ2h0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAotCQkJCSAgXygidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24iKSwKLQkJCQkgIFNfR0VUX05BTUUgKHN5bXAtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sKSk7Ci0JCSAgaWYgKHNlZ19sZWZ0ICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0JCSAgICAgICYmIHNlZ19yaWdodCAhPSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygiaW52YWxpZCBzZWN0aW9uIGZvciBvcGVyYXRpb24iKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoc2VnX2xlZnQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWQgKF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIHNldHRpbmcgJXMiKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJICBpZiAoc2VnX3JpZ2h0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkIChfKCJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcC0+c3lfdmFsdWUuWF9vcF9zeW1ib2wpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJICBpZiAoc2VnX2xlZnQgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkJICAgICAgJiYgc2VnX3JpZ2h0ICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIHNlY3Rpb24gZm9yIG9wZXJhdGlvbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgZm9yIGRpdmlzaW9uIGJ5IHplcm8uICAqLwotCSAgaWYgKChvcCA9PSBPX2RpdmlkZSB8fCBvcCA9PSBPX21vZHVsdXMpICYmIHJpZ2h0ID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiBzZWdfcmlnaHQgaXMgbm90IGFic29sdXRlX3NlY3Rpb24sIHRoZW4gd2UndmUKLSAgICAgICAgICAgICAgICAgYWxyZWFkeSBpc3N1ZWQgYSB3YXJuaW5nIGFib3V0IHVzaW5nIGEgYmFkIHN5bWJvbC4gICovCi0JICAgICAgaWYgKHNlZ19yaWdodCA9PSBhYnNvbHV0ZV9zZWN0aW9uICYmIGZpbmFsaXplKQotCQl7Ci0JCSAgY2hhciAqZmlsZTsKLQkJICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCQkgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltcCwgJmZpbGUsICZsaW5lKSkKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygiZGl2aXNpb24gYnkgemVybyIpKTsKLQkJICBlbHNlCi0JCSAgICBhc19iYWQgKF8oImRpdmlzaW9uIGJ5IHplcm8gd2hlbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCQl9Ci0KLQkgICAgICByaWdodCA9IDE7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChzeW1wLT5zeV92YWx1ZS5YX29wKQotCSAgICB7Ci0JICAgIGNhc2UgT19tdWx0aXBseToJCWxlZnQgKj0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fZGl2aWRlOgkJbGVmdCAvPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19tb2R1bHVzOgkJbGVmdCAlPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgkJbGVmdCA8PD0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6CQlsZWZ0ID4+PSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfaW5jbHVzaXZlX29yOglsZWZ0IHw9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9vcl9ub3Q6CQlsZWZ0IHw9IH5yaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOglsZWZ0IF49IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9hbmQ6CQlsZWZ0ICY9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2FkZDoJCQlsZWZ0ICs9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX3N1YnRyYWN0OgkJbGVmdCAtPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19lcToJbGVmdCA9IGxlZnQgPT0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19uZToJbGVmdCA9IGxlZnQgIT0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sdDoJbGVmdCA9IGxlZnQgPCAgcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sZToJbGVmdCA9IGxlZnQgPD0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19nZToJbGVmdCA9IGxlZnQgPj0gcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19ndDoJbGVmdCA9IGxlZnQgPiAgcmlnaHQgPyB+IChvZmZzZXRUKSAwIDogMDsgYnJlYWs7Ci0JICAgIGNhc2UgT19sb2dpY2FsX2FuZDoJbGVmdCA9IGxlZnQgJiYgcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9vcjoJbGVmdCA9IGxlZnQgfHwgcmlnaHQ7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkJYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgZmluYWxfdmFsICs9IHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3MgKyBsZWZ0OwotCSAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24gfHwgZmluYWxfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICBmaW5hbF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCSAgcmVzb2x2ZWQgPSAoc3ltYm9sX3Jlc29sdmVkX3AgKGFkZF9zeW1ib2wpCi0JCSAgICAgICYmIHN5bWJvbF9yZXNvbHZlZF9wIChvcF9zeW1ib2wpKTsKLSAgIAkgIGJyZWFrOwotCi0JY2FzZSBPX3JlZ2lzdGVyOgotCWNhc2UgT19iaWc6Ci0JY2FzZSBPX2lsbGVnYWw6Ci0JICAvKiBHaXZlIGFuIGVycm9yIChiZWxvdykgaWYgbm90IGluIGV4cHJfc2VjdGlvbi4gIFdlIGRvbid0Ci0JICAgICB3YW50IHRvIHdvcnJ5IGFib3V0IGV4cHJfc2VjdGlvbiBzeW1ib2xzLCBiZWNhdXNlIHRoZXkKLQkgICAgIGFyZSBmaWN0aW9uYWwgKHRoZXkgYXJlIGNyZWF0ZWQgYXMgcGFydCBvZiBleHByZXNzaW9uCi0JICAgICByZXNvbHV0aW9uKSwgYW5kIGFueSBwcm9ibGVtcyBtYXkgbm90IGFjdHVhbGx5IG1lYW4KLQkgICAgIGFueXRoaW5nLiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3ltcC0+c3lfcmVzb2x2aW5nID0gMDsKLSAgICB9Ci0KLSAgaWYgKGZpbmFsaXplKQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1wLCBmaW5hbF92YWwpOwotCi0jaWYgZGVmaW5lZCAoT0JKX0FPVVQpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgICAgIC8qIFRoZSBvbGQgYS5vdXQgYmFja2VuZCBkb2VzIG5vdCBoYW5kbGUgU19TRVRfU0VHTUVOVCBjb3JyZWN0bHkKLSAgICAgICAgIGZvciBhIHN0YWIgc3ltYm9sLCBzbyB3ZSB1c2UgdGhpcyBiYWQgaGFjay4gICovCi0gICAgICBpZiAoZmluYWxfc2VnICE9IFNfR0VUX1NFR01FTlQgKHN5bXApKQotI2VuZGlmCi0JU19TRVRfU0VHTUVOVCAoc3ltcCwgZmluYWxfc2VnKTsKLSAgICB9Ci0KLWV4aXRfZG9udF9zZXRfdmFsdWU6Ci0gIC8qIERvbid0IHdvcnJ5IGlmIHdlIGNhbid0IHJlc29sdmUgYW4gZXhwcl9zZWN0aW9uIHN5bWJvbC4gICovCi0gIGlmIChmaW5hbGl6ZSkKLSAgICB7Ci0gICAgICBpZiAocmVzb2x2ZWQpCi0Jc3ltcC0+c3lfcmVzb2x2ZWQgPSAxOwotICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ltcCkgIT0gZXhwcl9zZWN0aW9uKQotCXsKLQkgIGFzX2JhZCAoXygiY2FuJ3QgcmVzb2x2ZSB2YWx1ZSBmb3Igc3ltYm9sIFwiJXNcIiIpLCBTX0dFVF9OQU1FIChzeW1wKSk7Ci0JICBzeW1wLT5zeV9yZXNvbHZlZCA9IDE7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZmluYWxfdmFsOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1zdGF0aWMgdm9pZCByZXNvbHZlX2xvY2FsX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICosIFBUUikpOwotCi0vKiBBIHN0YXRpYyBmdW5jdGlvbiBwYXNzZWQgdG8gaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1yZXNvbHZlX2xvY2FsX3N5bWJvbCAoa2V5LCB2YWx1ZSkKLSAgICAgY29uc3QgY2hhciAqa2V5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiB2YWx1ZTsKLXsKLSAgaWYgKHZhbHVlICE9IE5VTEwpCi0gICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHZhbHVlLCAxKTsKLX0KLQotI2VuZGlmCi0KLS8qIFJlc29sdmUgYWxsIGxvY2FsIHN5bWJvbHMuICAqLwotCi12b2lkCi1yZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMgKCkKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGhhc2hfdHJhdmVyc2UgKGxvY2FsX2hhc2gsIHJlc29sdmVfbG9jYWxfc3ltYm9sKTsKLSNlbmRpZgotfQotCi0vKiBEb2xsYXIgbGFiZWxzIGxvb2sgbGlrZSBhIG51bWJlciBmb2xsb3dlZCBieSBhIGRvbGxhciBzaWduLiAgRWcsICI0MiQiLgotICAgVGhleSBhcmUgKnJlYWxseSogbG9jYWwuICBUaGF0IGlzLCB0aGV5IGdvIG91dCBvZiBzY29wZSB3aGVuZXZlciB3ZSBzZWUgYQotICAgbGFiZWwgdGhhdCBpc24ndCBsb2NhbC4gIEFsc28sIGxpa2UgZmIgbGFiZWxzLCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUKLSAgIGluc3RhbmNlcyBvZiBhIGRvbGxhciBsYWJlbC4gIFRoZXJlZm9yLCB3ZSBuYW1lIGVuY29kZSBlYWNoIGluc3RhbmNlIHdpdGgKLSAgIHRoZSBpbnN0YW5jZSBudW1iZXIsIGtlZXAgYSBsaXN0IG9mIGRlZmluZWQgc3ltYm9scyBzZXBhcmF0ZSBmcm9tIHRoZSByZWFsCi0gICBzeW1ib2wgdGFibGUsIGFuZCB3ZSB0cmVhdCB0aGVzZSBidWdnZXJzIGFzIGEgc3BhcnNlIGFycmF5LiAgKi8KLQotc3RhdGljIGxvbmcgKmRvbGxhcl9sYWJlbHM7Ci1zdGF0aWMgbG9uZyAqZG9sbGFyX2xhYmVsX2luc3RhbmNlczsKLXN0YXRpYyBjaGFyICpkb2xsYXJfbGFiZWxfZGVmaW5lczsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvbGxhcl9sYWJlbF9jb3VudDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvbGxhcl9sYWJlbF9tYXg7Ci0KLWludCAKLWRvbGxhcl9sYWJlbF9kZWZpbmVkIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBrbm93ICgoZG9sbGFyX2xhYmVscyAhPSBOVUxMKSB8fCAoZG9sbGFyX2xhYmVsX2NvdW50ID09IDApKTsKLQotICBmb3IgKGkgPSBkb2xsYXJfbGFiZWxzOyBpIDwgZG9sbGFyX2xhYmVscyArIGRvbGxhcl9sYWJlbF9jb3VudDsgKytpKQotICAgIGlmICgqaSA9PSBsYWJlbCkKLSAgICAgIHJldHVybiBkb2xsYXJfbGFiZWxfZGVmaW5lc1tpIC0gZG9sbGFyX2xhYmVsc107Ci0KLSAgLyogaWYgd2UgZ2V0IGhlcmUsIGxhYmVsIGlzbid0IGRlZmluZWQgKi8KLSAgcmV0dXJuIDA7Ci19CQkJCS8qIGRvbGxhcl9sYWJlbF9kZWZpbmVkKCkgKi8KLQotc3RhdGljIGxvbmcKLWRvbGxhcl9sYWJlbF9pbnN0YW5jZSAobGFiZWwpCi0gICAgIGxvbmcgbGFiZWw7Ci17Ci0gIGxvbmcgKmk7Ci0KLSAga25vdyAoKGRvbGxhcl9sYWJlbHMgIT0gTlVMTCkgfHwgKGRvbGxhcl9sYWJlbF9jb3VudCA9PSAwKSk7Ci0KLSAgZm9yIChpID0gZG9sbGFyX2xhYmVsczsgaSA8IGRvbGxhcl9sYWJlbHMgKyBkb2xsYXJfbGFiZWxfY291bnQ7ICsraSkKLSAgICBpZiAoKmkgPT0gbGFiZWwpCi0gICAgICByZXR1cm4gKGRvbGxhcl9sYWJlbF9pbnN0YW5jZXNbaSAtIGRvbGxhcl9sYWJlbHNdKTsKLQotICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZW4ndCBzZWVuIHRoZSBsYWJlbCBiZWZvcmUsIHRoZXJlZm9yZSBpdHMgaW5zdGFuY2UKLSAgICAgY291bnQgaXMgemVyby4gICovCi0gIHJldHVybiAwOwotfQotCi12b2lkIAotZG9sbGFyX2xhYmVsX2NsZWFyICgpCi17Ci0gIG1lbXNldCAoZG9sbGFyX2xhYmVsX2RlZmluZXMsICdcMCcsICh1bnNpZ25lZCBpbnQpIGRvbGxhcl9sYWJlbF9jb3VudCk7Ci19Ci0KLSNkZWZpbmUgRE9MTEFSX0xBQkVMX0JVTVBfQlkgMTAKLQotdm9pZCAKLWRlZmluZV9kb2xsYXJfbGFiZWwgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGZvciAoaSA9IGRvbGxhcl9sYWJlbHM7IGkgPCBkb2xsYXJfbGFiZWxzICsgZG9sbGFyX2xhYmVsX2NvdW50OyArK2kpCi0gICAgaWYgKCppID09IGxhYmVsKQotICAgICAgewotCSsrZG9sbGFyX2xhYmVsX2luc3RhbmNlc1tpIC0gZG9sbGFyX2xhYmVsc107Ci0JZG9sbGFyX2xhYmVsX2RlZmluZXNbaSAtIGRvbGxhcl9sYWJlbHNdID0gMTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgLyogaWYgd2UgZ2V0IHRvIGhlcmUsIHdlIGRvbid0IGhhdmUgbGFiZWwgbGlzdGVkIHlldC4gKi8KLQotICBpZiAoZG9sbGFyX2xhYmVscyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRvbGxhcl9sYWJlbHMgPSAobG9uZyAqKSB4bWFsbG9jIChET0xMQVJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZG9sbGFyX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhtYWxsb2MgKERPTExBUl9MQUJFTF9CVU1QX0JZICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBkb2xsYXJfbGFiZWxfZGVmaW5lcyA9IHhtYWxsb2MgKERPTExBUl9MQUJFTF9CVU1QX0JZKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9tYXggPSBET0xMQVJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGRvbGxhcl9sYWJlbF9jb3VudCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChkb2xsYXJfbGFiZWxfY291bnQgPT0gZG9sbGFyX2xhYmVsX21heCkKLSAgICB7Ci0gICAgICBkb2xsYXJfbGFiZWxfbWF4ICs9IERPTExBUl9MQUJFTF9CVU1QX0JZOwotICAgICAgZG9sbGFyX2xhYmVscyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBkb2xsYXJfbGFiZWxzLAotCQkJCQkgZG9sbGFyX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOwotICAgICAgZG9sbGFyX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBkb2xsYXJfbGFiZWxfaW5zdGFuY2VzLAotCQkJCQkgIGRvbGxhcl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9kZWZpbmVzID0geHJlYWxsb2MgKGRvbGxhcl9sYWJlbF9kZWZpbmVzLCBkb2xsYXJfbGFiZWxfbWF4KTsKLSAgICB9CQkJCS8qIGlmIHdlIG5lZWRlZCB0byBncm93ICovCi0KLSAgZG9sbGFyX2xhYmVsc1tkb2xsYXJfbGFiZWxfY291bnRdID0gbGFiZWw7Ci0gIGRvbGxhcl9sYWJlbF9pbnN0YW5jZXNbZG9sbGFyX2xhYmVsX2NvdW50XSA9IDE7Ci0gIGRvbGxhcl9sYWJlbF9kZWZpbmVzW2RvbGxhcl9sYWJlbF9jb3VudF0gPSAxOwotICArK2RvbGxhcl9sYWJlbF9jb3VudDsKLX0KLQotLyoKLSAqCQkJZG9sbGFyX2xhYmVsX25hbWUoKQotICoKLSAqIENhbGxlciBtdXN0IGNvcHkgcmV0dXJuZWQgbmFtZTogd2UgcmUtdXNlIHRoZSBhcmVhIGZvciB0aGUgbmV4dCBuYW1lLgotICoKLSAqIFRoZSBtdGggb2NjdXJlbmNlIG9mIGxhYmVsIG46IGlzIHR1cm5lZCBpbnRvIHRoZSBzeW1ib2wgIkxuXkFtIgotICogd2hlcmUgbiBpcyB0aGUgbGFiZWwgbnVtYmVyIGFuZCBtIGlzIHRoZSBpbnN0YW5jZSBudW1iZXIuICJMIiBtYWtlcwotICogaXQgYSBsYWJlbCBkaXNjYXJkZWQgdW5sZXNzIGRlYnVnZ2luZyBhbmQgIl5BIignXDEnKSBlbnN1cmVzIG5vCi0gKiBvcmRpbmFyeSBzeW1ib2wgU0hPVUxEIGdldCB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwgbGFiZWwKLSAqIHN5bWJvbC4gVGhlIGZpcnN0ICI0OiIgaXMgIkw0XkExIiAtIHRoZSBtIG51bWJlcnMgYmVnaW4gYXQgMS4KLSAqCi0gKiBmYiBsYWJlbHMgZ2V0IHRoZSBzYW1lIHRyZWF0bWVudCwgZXhjZXB0IHRoYXQgXkIgaXMgdXNlZCBpbiBwbGFjZSBvZiBeQS4KLSAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIGxvY2FsIGxhYmVsIG5hbWUuICovCi1kb2xsYXJfbGFiZWxfbmFtZSAobiwgYXVnZW5kKQotICAgICByZWdpc3RlciBsb25nIG47CQkvKiB3ZSBqdXN0IHNhdyAibiQ6IiA6IG4gYSBudW1iZXIgKi8KLSAgICAgcmVnaXN0ZXIgaW50IGF1Z2VuZDsJLyogMCBmb3IgY3VycmVudCBpbnN0YW5jZSwgMSBmb3IgbmV3IGluc3RhbmNlICovCi17Ci0gIGxvbmcgaTsKLSAgLyogUmV0dXJuZWQgdG8gY2FsbGVyLCB0aGVuIGNvcGllZC4gIHVzZWQgZm9yIGNyZWF0ZWQgbmFtZXMgKCI0ZiIpICovCi0gIHN0YXRpYyBjaGFyIHN5bWJvbF9uYW1lX2J1aWxkWzI0XTsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgcmVnaXN0ZXIgY2hhciAqcTsKLSAgY2hhciBzeW1ib2xfbmFtZV90ZW1wb3JhcnlbMjBdOwkvKiBidWlsZCB1cCBhIG51bWJlciwgQkFDS1dBUkRTICovCi0KLSAga25vdyAobiA+PSAwKTsKLSAga25vdyAoYXVnZW5kID09IDAgfHwgYXVnZW5kID09IDEpOwotICBwID0gc3ltYm9sX25hbWVfYnVpbGQ7Ci0jaWZkZWYgTE9DQUxfTEFCRUxfUFJFRklYCi0gICpwKysgPSBMT0NBTF9MQUJFTF9QUkVGSVg7Ci0jZW5kaWYKLSAgKnArKyA9ICdMJzsKLQotICAvKiBOZXh0IGNvZGUganVzdCBkb2VzIHNwcmludGYoIHt9LCAiJWQiLCBuKTsgKi8KLSAgLyogbGFiZWwgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBuOyBpOyArK3EpCi0gICAgewotICAgICAgKnEgPSBpICUgMTAgKyAnMCc7Ci0gICAgICBpIC89IDEwOwotICAgIH0KLSAgd2hpbGUgKCgqcCA9ICotLXEpICE9ICdcMCcpCi0gICAgKytwOwotCi0gICpwKysgPSAxOwkJCS8qIF5BICovCi0KLSAgLyogaW5zdGFuY2UgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBkb2xsYXJfbGFiZWxfaW5zdGFuY2UgKG4pICsgYXVnZW5kOyBpOyArK3EpCi0gICAgewotICAgICAgKnEgPSBpICUgMTAgKyAnMCc7Ci0gICAgICBpIC89IDEwOwotICAgIH0KLSAgd2hpbGUgKCgqcCsrID0gKi0tcSkgIT0gJ1wwJyk7OwotCi0gIC8qIFRoZSBsYWJlbCwgYXMgYSAnXDAnIGVuZGVkIHN0cmluZywgc3RhcnRzIGF0IHN5bWJvbF9uYW1lX2J1aWxkLiAqLwotICByZXR1cm4gc3ltYm9sX25hbWVfYnVpbGQ7Ci19Ci0KLS8qCi0gKiBTb21ib2R5IGVsc2UncyBpZGVhIG9mIGxvY2FsIGxhYmVscy4gVGhleSBhcmUgbWFkZSBieSAibjoiIHdoZXJlIG4KLSAqIGlzIGFueSBkZWNpbWFsIGRpZ2l0LiBSZWZlciB0byB0aGVtIHdpdGgKLSAqICAibmIiIGZvciBwcmV2aW91cyAoYmFja3dhcmQpIG46Ci0gKiAgb3IgIm5mIiBmb3IgbmV4dCAoZm9yd2FyZCkgbjouCi0gKgotICogV2UgZG8gYSBsaXR0bGUgYmV0dGVyIGFuZCBsZXQgbiBiZSBhbnkgbnVtYmVyLCBub3QganVzdCBhIHNpbmdsZSBkaWdpdCwgYnV0Ci0gKiBzaW5jZSB0aGUgb3RoZXIgZ3V5J3MgYXNzZW1ibGVyIG9ubHkgZG9lcyB0ZW4sIHdlIHRyZWF0IHRoZSBmaXJzdCB0ZW4KLSAqIHNwZWNpYWxseS4KLSAqCi0gKiBMaWtlIHNvbWVvbmUgZWxzZSdzIGFzc2VtYmxlciwgd2UgaGF2ZSBvbmUgc2V0IG9mIGxvY2FsIGxhYmVsIGNvdW50ZXJzIGZvcgotICogZW50aXJlIGFzc2VtYmx5LCBub3Qgb25lIHNldCBwZXIgKHN1YilzZWdtZW50IGxpa2UgaW4gbW9zdCBhc3NlbWJsZXJzLiBUaGlzCi0gKiBpbXBsaWVzIHRoYXQgb25lIGNhbiByZWZlciB0byBhIGxhYmVsIGluIGFub3RoZXIgc2VnbWVudCwgYW5kIGluZGVlZCBzb21lCi0gKiBjcnVmdHkgY29tcGlsZXJzIGhhdmUgZG9uZSBqdXN0IHRoYXQuCi0gKgotICogU2luY2UgdGhlcmUgY291bGQgYmUgYSBMT1Qgb2YgdGhlc2UgdGhpbmdzLCB0cmVhdCB0aGVtIGFzIGEgc3BhcnNlIGFycmF5LgotICovCi0KLSNkZWZpbmUgRkJfTEFCRUxfU1BFQ0lBTCAoMTApCi0KLXN0YXRpYyBsb25nIGZiX2xvd19jb3VudGVyW0ZCX0xBQkVMX1NQRUNJQUxdOwotc3RhdGljIGxvbmcgKmZiX2xhYmVsczsKLXN0YXRpYyBsb25nICpmYl9sYWJlbF9pbnN0YW5jZXM7Ci1zdGF0aWMgbG9uZyBmYl9sYWJlbF9jb3VudDsKLXN0YXRpYyBsb25nIGZiX2xhYmVsX21heDsKLQotLyogdGhpcyBtdXN0IGJlIG1vcmUgdGhhbiBGQl9MQUJFTF9TUEVDSUFMICovCi0jZGVmaW5lIEZCX0xBQkVMX0JVTVBfQlkgKEZCX0xBQkVMX1NQRUNJQUwgKyA2KQotCi1zdGF0aWMgdm9pZCAKLWZiX2xhYmVsX2luaXQgKCkKLXsKLSAgbWVtc2V0ICgodm9pZCAqKSBmYl9sb3dfY291bnRlciwgJ1wwJywgc2l6ZW9mIChmYl9sb3dfY291bnRlcikpOwotfQkJCQkvKiBmYl9sYWJlbF9pbml0KCkgKi8KLQotLyogYWRkIG9uZSB0byB0aGUgaW5zdGFuY2UgbnVtYmVyIG9mIHRoaXMgZmIgbGFiZWwgKi8KLXZvaWQgCi1mYl9sYWJlbF9pbnN0YW5jZV9pbmMgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGlmIChsYWJlbCA8IEZCX0xBQkVMX1NQRUNJQUwpCi0gICAgewotICAgICAgKytmYl9sb3dfY291bnRlcltsYWJlbF07Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChmYl9sYWJlbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBmYl9sYWJlbHMgKyBGQl9MQUJFTF9TUEVDSUFMOwotCSAgIGkgPCBmYl9sYWJlbHMgKyBmYl9sYWJlbF9jb3VudDsgKytpKQotCXsKLQkgIGlmICgqaSA9PSBsYWJlbCkKLQkgICAgewotCSAgICAgICsrZmJfbGFiZWxfaW5zdGFuY2VzW2kgLSBmYl9sYWJlbHNdOwotCSAgICAgIHJldHVybjsKLQkgICAgfQkJCS8qIGlmIHdlIGZpbmQgaXQgKi8KLQl9CQkJLyogZm9yIGVhY2ggZXhpc3RpbmcgbGFiZWwgKi8KLSAgICB9Ci0KLSAgLyogaWYgd2UgZ2V0IHRvIGhlcmUsIHdlIGRvbid0IGhhdmUgbGFiZWwgbGlzdGVkIHlldC4gKi8KLQotICBpZiAoZmJfbGFiZWxzID09IE5VTEwpCi0gICAgewotICAgICAgZmJfbGFiZWxzID0gKGxvbmcgKikgeG1hbGxvYyAoRkJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZmJfbGFiZWxfaW5zdGFuY2VzID0gKGxvbmcgKikgeG1hbGxvYyAoRkJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZmJfbGFiZWxfbWF4ID0gRkJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGZiX2xhYmVsX2NvdW50ID0gRkJfTEFCRUxfU1BFQ0lBTDsKLQotICAgIH0KLSAgZWxzZSBpZiAoZmJfbGFiZWxfY291bnQgPT0gZmJfbGFiZWxfbWF4KQotICAgIHsKLSAgICAgIGZiX2xhYmVsX21heCArPSBGQl9MQUJFTF9CVU1QX0JZOwotICAgICAgZmJfbGFiZWxzID0gKGxvbmcgKikgeHJlYWxsb2MgKChjaGFyICopIGZiX2xhYmVscywKLQkJCQkgICAgIGZiX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOwotICAgICAgZmJfbGFiZWxfaW5zdGFuY2VzID0gKGxvbmcgKikgeHJlYWxsb2MgKChjaGFyICopIGZiX2xhYmVsX2luc3RhbmNlcywKLQkJCQkJICAgICAgZmJfbGFiZWxfbWF4ICogc2l6ZW9mIChsb25nKSk7Ci0gICAgfQkJCQkvKiBpZiB3ZSBuZWVkZWQgdG8gZ3JvdyAqLwotCi0gIGZiX2xhYmVsc1tmYl9sYWJlbF9jb3VudF0gPSBsYWJlbDsKLSAgZmJfbGFiZWxfaW5zdGFuY2VzW2ZiX2xhYmVsX2NvdW50XSA9IDE7Ci0gICsrZmJfbGFiZWxfY291bnQ7Ci19Ci0KLXN0YXRpYyBsb25nIAotZmJfbGFiZWxfaW5zdGFuY2UgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGlmIChsYWJlbCA8IEZCX0xBQkVMX1NQRUNJQUwpCi0gICAgewotICAgICAgcmV0dXJuIChmYl9sb3dfY291bnRlcltsYWJlbF0pOwotICAgIH0KLQotICBpZiAoZmJfbGFiZWxzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gZmJfbGFiZWxzICsgRkJfTEFCRUxfU1BFQ0lBTDsKLQkgICBpIDwgZmJfbGFiZWxzICsgZmJfbGFiZWxfY291bnQ7ICsraSkKLQl7Ci0JICBpZiAoKmkgPT0gbGFiZWwpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKGZiX2xhYmVsX2luc3RhbmNlc1tpIC0gZmJfbGFiZWxzXSk7Ci0JICAgIH0JCQkvKiBpZiB3ZSBmaW5kIGl0ICovCi0JfQkJCS8qIGZvciBlYWNoIGV4aXN0aW5nIGxhYmVsICovCi0gICAgfQotCi0gIC8qIFdlIGRpZG4ndCBmaW5kIHRoZSBsYWJlbCwgc28gdGhpcyBtdXN0IGJlIGEgcmVmZXJlbmNlIHRvIHRoZQotICAgICBmaXJzdCBpbnN0YW5jZS4gICovCi0gIHJldHVybiAwOwotfQotCi0vKgotICoJCQlmYl9sYWJlbF9uYW1lKCkKLSAqCi0gKiBDYWxsZXIgbXVzdCBjb3B5IHJldHVybmVkIG5hbWU6IHdlIHJlLXVzZSB0aGUgYXJlYSBmb3IgdGhlIG5leHQgbmFtZS4KLSAqCi0gKiBUaGUgbXRoIG9jY3VyZW5jZSBvZiBsYWJlbCBuOiBpcyB0dXJuZWQgaW50byB0aGUgc3ltYm9sICJMbl5CbSIKLSAqIHdoZXJlIG4gaXMgdGhlIGxhYmVsIG51bWJlciBhbmQgbSBpcyB0aGUgaW5zdGFuY2UgbnVtYmVyLiAiTCIgbWFrZXMKLSAqIGl0IGEgbGFiZWwgZGlzY2FyZGVkIHVubGVzcyBkZWJ1Z2dpbmcgYW5kICJeQiIoJ1wyJykgZW5zdXJlcyBubwotICogb3JkaW5hcnkgc3ltYm9sIFNIT1VMRCBnZXQgdGhlIHNhbWUgbmFtZSBhcyBhIGxvY2FsIGxhYmVsCi0gKiBzeW1ib2wuIFRoZSBmaXJzdCAiNDoiIGlzICJMNF5CMSIgLSB0aGUgbSBudW1iZXJzIGJlZ2luIGF0IDEuCi0gKgotICogZG9sbGFyIGxhYmVscyBnZXQgdGhlIHNhbWUgdHJlYXRtZW50LCBleGNlcHQgdGhhdCBeQSBpcyB1c2VkIGluIHBsYWNlIG9mIF5CLiAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIGxvY2FsIGxhYmVsIG5hbWUuICovCi1mYl9sYWJlbF9uYW1lIChuLCBhdWdlbmQpCi0gICAgIGxvbmcgbjsJCQkvKiB3ZSBqdXN0IHNhdyAibjoiLCAibmYiIG9yICJuYiIgOiBuIGEgbnVtYmVyICovCi0gICAgIGxvbmcgYXVnZW5kOwkJLyogMCBmb3IgbmIsIDEgZm9yIG46LCBuZiAqLwotewotICBsb25nIGk7Ci0gIC8qIFJldHVybmVkIHRvIGNhbGxlciwgdGhlbiBjb3BpZWQuICB1c2VkIGZvciBjcmVhdGVkIG5hbWVzICgiNGYiKSAqLwotICBzdGF0aWMgY2hhciBzeW1ib2xfbmFtZV9idWlsZFsyNF07Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGNoYXIgKnE7Ci0gIGNoYXIgc3ltYm9sX25hbWVfdGVtcG9yYXJ5WzIwXTsJLyogYnVpbGQgdXAgYSBudW1iZXIsIEJBQ0tXQVJEUyAqLwotCi0gIGtub3cgKG4gPj0gMCk7Ci0gIGtub3cgKGF1Z2VuZCA9PSAwIHx8IGF1Z2VuZCA9PSAxKTsKLSAgcCA9IHN5bWJvbF9uYW1lX2J1aWxkOwotICAqcCsrID0gJ0wnOwotCi0gIC8qIE5leHQgY29kZSBqdXN0IGRvZXMgc3ByaW50Zigge30sICIlZCIsIG4pOyAqLwotICAvKiBsYWJlbCBudW1iZXIgKi8KLSAgcSA9IHN5bWJvbF9uYW1lX3RlbXBvcmFyeTsKLSAgZm9yICgqcSsrID0gMCwgaSA9IG47IGk7ICsrcSkKLSAgICB7Ci0gICAgICAqcSA9IGkgJSAxMCArICcwJzsKLSAgICAgIGkgLz0gMTA7Ci0gICAgfQotICB3aGlsZSAoKCpwID0gKi0tcSkgIT0gJ1wwJykKLSAgICArK3A7Ci0KLSAgKnArKyA9IDI7CQkJLyogXkIgKi8KLQotICAvKiBpbnN0YW5jZSBudW1iZXIgKi8KLSAgcSA9IHN5bWJvbF9uYW1lX3RlbXBvcmFyeTsKLSAgZm9yICgqcSsrID0gMCwgaSA9IGZiX2xhYmVsX2luc3RhbmNlIChuKSArIGF1Z2VuZDsgaTsgKytxKQotICAgIHsKLSAgICAgICpxID0gaSAlIDEwICsgJzAnOwotICAgICAgaSAvPSAxMDsKLSAgICB9Ci0gIHdoaWxlICgoKnArKyA9ICotLXEpICE9ICdcMCcpOzsKLQotICAvKiBUaGUgbGFiZWwsIGFzIGEgJ1wwJyBlbmRlZCBzdHJpbmcsIHN0YXJ0cyBhdCBzeW1ib2xfbmFtZV9idWlsZC4gKi8KLSAgcmV0dXJuIChzeW1ib2xfbmFtZV9idWlsZCk7Ci19CQkJCS8qIGZiX2xhYmVsX25hbWUoKSAqLwotCi0vKgotICogZGVjb2RlIG5hbWUgdGhhdCBtYXkgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSBmb29fbGFiZWxfbmFtZSgpIGFib3ZlLiAgSWYKLSAqIHRoZSBuYW1lIHdhc24ndCBnZW5lcmF0ZWQgYnkgZm9vX2xhYmVsX25hbWUoKSwgdGhlbiByZXR1cm4gaXQgdW5hbHRlcmVkLgotICogVGhpcyBpcyB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KLSAqLwotCi1jaGFyICoKLWRlY29kZV9sb2NhbF9sYWJlbF9uYW1lIChzKQotICAgICBjaGFyICpzOwotewotICBjaGFyICpwOwotICBjaGFyICpzeW1ib2xfZGVjb2RlOwotICBpbnQgbGFiZWxfbnVtYmVyOwotICBpbnQgaW5zdGFuY2VfbnVtYmVyOwotICBjaGFyICp0eXBlOwotICBjb25zdCBjaGFyICptZXNzYWdlX2Zvcm1hdCA9IF8oIlwiJWRcIiAoaW5zdGFuY2UgbnVtYmVyICVkIG9mIGEgJXMgbGFiZWwpIik7Ci0KLSAgaWYgKHNbMF0gIT0gJ0wnKQotICAgIHJldHVybiBzOwotCi0gIGZvciAobGFiZWxfbnVtYmVyID0gMCwgcCA9IHMgKyAxOyBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApOyArK3ApCi0gICAgbGFiZWxfbnVtYmVyID0gKDEwICogbGFiZWxfbnVtYmVyKSArICpwIC0gJzAnOwotCi0gIGlmICgqcCA9PSAxKQotICAgIHR5cGUgPSAiZG9sbGFyIjsKLSAgZWxzZSBpZiAoKnAgPT0gMikKLSAgICB0eXBlID0gImZiIjsKLSAgZWxzZQotICAgIHJldHVybiBzOwotCi0gIGZvciAoaW5zdGFuY2VfbnVtYmVyID0gMCwgcCsrOyBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApOyArK3ApCi0gICAgaW5zdGFuY2VfbnVtYmVyID0gKDEwICogaW5zdGFuY2VfbnVtYmVyKSArICpwIC0gJzAnOwotCi0gIHN5bWJvbF9kZWNvZGUgPSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHN0cmxlbiAobWVzc2FnZV9mb3JtYXQpICsgMzApOwotICBzcHJpbnRmIChzeW1ib2xfZGVjb2RlLCBtZXNzYWdlX2Zvcm1hdCwgbGFiZWxfbnVtYmVyLCBpbnN0YW5jZV9udW1iZXIsIHR5cGUpOwotCi0gIHJldHVybiBzeW1ib2xfZGVjb2RlOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLiAgKi8KLQotdmFsdWVUCi1TX0dFVF9WQUxVRSAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9vZmZzZXQ7Ci0jZW5kaWYKLQotICBpZiAoIXMtPnN5X3Jlc29sdmVkICYmIHMtPnN5X3ZhbHVlLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAocywgMSk7Ci0gIGlmIChzLT5zeV92YWx1ZS5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgc3RhdGljIHN5bWJvbFMgKnJlY3VyOwotCi0gICAgICAvKiBGSVhNRTogSW4gbm9uIEJGRCBhc3NlbWJsZXJzLCBTX0lTX0RFRklORUQgYW5kIFNfSVNfQ09NTU9OCi0gICAgICAgICBtYXkgY2FsbCBTX0dFVF9WQUxVRS4gIFdlIHVzZSBhIHN0YXRpYyBzeW1ib2wgdG8gYXZvaWQgdGhlCi0gICAgICAgICBpbW1lZGlhdGUgcmVjdXJzaW9uLiAgKi8KLSAgICAgIGlmIChyZWN1ciA9PSBzKQotCXJldHVybiAodmFsdWVUKSBzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0gICAgICByZWN1ciA9IHM7Ci0gICAgICBpZiAoISBzLT5zeV9yZXNvbHZlZAotCSAgfHwgcy0+c3lfdmFsdWUuWF9vcCAhPSBPX3N5bWJvbAotCSAgfHwgKFNfSVNfREVGSU5FRCAocykgJiYgISBTX0lTX0NPTU1PTiAocykpKQotCWFzX2JhZCAoXygiQXR0ZW1wdCB0byBnZXQgdmFsdWUgb2YgdW5yZXNvbHZlZCBzeW1ib2wgJXMiKSwKLQkJU19HRVRfTkFNRSAocykpOwotICAgICAgcmVjdXIgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICh2YWx1ZVQpIHMtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLX0KLQotLyogU2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLVNfU0VUX1ZBTFVFIChzLCB2YWwpCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIHZhbHVlVCB2YWw7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9vZmZzZXQgPSB2YWw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgcy0+c3lfdmFsdWUuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIHMtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IChvZmZzZXRUKSB2YWw7Ci0gIHMtPnN5X3ZhbHVlLlhfdW5zaWduZWQgPSAwOwotfQotCi12b2lkCi1jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChkZXN0LCBzcmMpCi0gICAgIHN5bWJvbFMgKmRlc3QsICpzcmM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKGRlc3QpKQotICAgIGRlc3QgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgZGVzdCk7Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHNyYykpCi0gICAgc3JjID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHNyYyk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIEluIGFuIGV4cHJlc3Npb24sIHRyYW5zZmVyIHRoZSBzZXR0aW5ncyBvZiB0aGVzZSBmbGFncy4KLSAgICAgVGhlIHVzZXIgY2FuIG92ZXJyaWRlIGxhdGVyLCBvZiBjb3Vyc2UuICAqLwotI2RlZmluZSBDT1BJRURfU1lNRkxBR1MJKEJTRl9GVU5DVElPTiB8IEJTRl9PQkpFQ1QpCi0gIGRlc3QtPmJzeW0tPmZsYWdzIHw9IHNyYy0+YnN5bS0+ZmxhZ3MgJiBDT1BJRURfU1lNRkxBR1M7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTCi0gIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTIChkZXN0LCBzcmMpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLWludAotU19JU19GVU5DVElPTiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgZmxhZ3MgPSBzLT5ic3ltLT5mbGFnczsKLQotICByZXR1cm4gKGZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwOwotfQotCi1pbnQKLVNfSVNfRVhURVJOQUwgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotCi0gIGZsYWdzID0gcy0+YnN5bS0+ZmxhZ3M7Ci0KLSAgLyogc2FuaXR5IGNoZWNrICovCi0gIGlmICgoZmxhZ3MgJiBCU0ZfTE9DQUwpICYmIChmbGFncyAmIEJTRl9HTE9CQUwpKQotICAgIGFib3J0ICgpOwotCi0gIHJldHVybiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwOwotfQotCi1pbnQKLVNfSVNfV0VBSyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMDsKLX0KLQotaW50Ci1TX0lTX0NPTU1PTiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBiZmRfaXNfY29tX3NlY3Rpb24gKHMtPmJzeW0tPnNlY3Rpb24pOwotfQotCi1pbnQKLVNfSVNfREVGSU5FRCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKS0+bHN5X3NlY3Rpb24gIT0gdW5kZWZpbmVkX3NlY3Rpb247Ci0gIHJldHVybiBzLT5ic3ltLT5zZWN0aW9uICE9IHVuZGVmaW5lZF9zZWN0aW9uOwotfQotCi1pbnQKLVNfSVNfREVCVUcgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICBpZiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1TX0lTX0xPQ0FMIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMTsKLQotICBmbGFncyA9IHMtPmJzeW0tPmZsYWdzOwotCi0gIC8qIHNhbml0eSBjaGVjayAqLwotICBpZiAoKGZsYWdzICYgQlNGX0xPQ0FMKSAmJiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uIChzLT5ic3ltKSA9PSByZWdfc2VjdGlvbikKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZQotICAgICAgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkgPT0gMAotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uIChzLT5ic3ltKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHJldHVybiAxOwotCi0gIG5hbWUgPSBTX0dFVF9OQU1FIChzKTsKLSAgcmV0dXJuIChuYW1lICE9IE5VTEwKLQkgICYmICEgU19JU19ERUJVRyAocykKLQkgICYmIChzdHJjaHIgKG5hbWUsICdcMDAxJykKLQkgICAgICB8fCBzdHJjaHIgKG5hbWUsICdcMDAyJykKLQkgICAgICB8fCAoISBmbGFnX2tlZXBfbG9jYWxzCi0JCSAgJiYgKGJmZF9pc19sb2NhbF9sYWJlbCAoc3Rkb3V0cHV0LCBzLT5ic3ltKQotCQkgICAgICB8fCAoZmxhZ19tcmkKLQkJCSAgJiYgbmFtZVswXSA9PSAnPycKLQkJCSAgJiYgbmFtZVsxXSA9PSAnPycpKSkpKTsKLX0KLQotaW50Ci1TX0lTX0VYVEVSTiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgcmV0dXJuIFNfSVNfRVhURVJOQUwgKHMpOwotfQotCi1pbnQKLVNfSVNfU1RBQkQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIHJldHVybiBTX0dFVF9OQU1FIChzKSA9PSAwOwotfQotCi1DT05TVCBjaGFyICoKLVNfR0VUX05BTUUgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9uYW1lOwotICByZXR1cm4gcy0+YnN5bS0+bmFtZTsKLX0KLQotc2VnVAotU19HRVRfU0VHTUVOVCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKS0+bHN5X3NlY3Rpb247Ci0gIHJldHVybiBzLT5ic3ltLT5zZWN0aW9uOwotfQotCi12b2lkCi1TX1NFVF9TRUdNRU5UIChzLCBzZWcpCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKiBEb24ndCByZWFzc2lnbiBzZWN0aW9uIHN5bWJvbHMuICBUaGUgZGlyZWN0IHJlYXNvbiBpcyB0byBwcmV2ZW50IHNlZwotICAgICBmYXVsdHMgYXNzaWduaW5nIGJhY2sgdG8gY29uc3QgZ2xvYmFsIHN5bWJvbHMgc3VjaCBhcyAqQUJTKiwgYnV0IGl0Ci0gICAgIHNob3VsZG4ndCBoYXBwZW4gYW55d2F5LiAgKi8KLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICBpZiAoc2VnID09IHJlZ19zZWN0aW9uKQotCXMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gICAgICBlbHNlCi0JewotCSAgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfc2VjdGlvbiA9IHNlZzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmIChzLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICB7Ci0gICAgICBpZiAocy0+YnN5bS0+c2VjdGlvbiAhPSBzZWcpCi0JYWJvcnQoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzLT5ic3ltLT5zZWN0aW9uID0gc2VnOwotfQotCi12b2lkCi1TX1NFVF9FWFRFUk5BTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgaWYgKChzLT5ic3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIExldCAud2VhayBvdmVycmlkZSAuZ2xvYmFsLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0xPQ0FMfEJTRl9XRUFLKTsKLX0KLQotdm9pZAotU19DTEVBUl9FWFRFUk5BTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuOwotICBpZiAoKHMtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDApCi0gICAgewotICAgICAgLyogTGV0IC53ZWFrIG92ZXJyaWRlLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9MT0NBTDsKLSAgcy0+YnN5bS0+ZmxhZ3MgJj0gfihCU0ZfR0xPQkFMfEJTRl9XRUFLKTsKLX0KLQotdm9pZAotU19TRVRfV0VBSyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+YnN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0dMT0JBTHxCU0ZfTE9DQUwpOwotfQotCi12b2lkCi1TX1NFVF9OQU1FIChzLCBuYW1lKQotICAgICBzeW1ib2xTICpzOwotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9uYW1lID0gbmFtZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPm5hbWUgPSBuYW1lOwotfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLQotLyogUmV0dXJuIHRoZSBwcmV2aW91cyBzeW1ib2wgaW4gYSBjaGFpbi4gICovCi0KLXN5bWJvbFMgKgotc3ltYm9sX3ByZXZpb3VzIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHMtPnN5X3ByZXZpb3VzOwotfQotCi0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi0vKiBSZXR1cm4gdGhlIG5leHQgc3ltYm9sIGluIGEgY2hhaW4uICAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9uZXh0IChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHMtPnN5X25leHQ7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGFzIGFuIGV4cHJlc3Npb24uICAqLwotCi1leHByZXNzaW9uUyAqCi1zeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHJldHVybiAmcy0+c3lfdmFsdWU7Ci19Ci0KLS8qIFNldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgdG8gYW4gZXhwcmVzc2lvbi4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAocywgZXhwKQotICAgICBzeW1ib2xTICpzOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqZXhwOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV92YWx1ZSA9ICpleHA7Ci19Ci0KLS8qIFNldCB0aGUgZnJhZyBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfZnJhZyAocywgZikKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgZnJhZ1MgKmY7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICBsb2NhbF9zeW1ib2xfc2V0X2ZyYWcgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMsIGYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICBzLT5zeV9mcmFnID0gZjsKLX0KLQotLyogUmV0dXJuIHRoZSBmcmFnIG9mIGEgc3ltYm9sLiAgKi8KLQotZnJhZ1MgKgotc3ltYm9sX2dldF9mcmFnIChzKQotICAgICBzeW1ib2xTICpzOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHMtPnN5X2ZyYWc7Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gdXNlZC4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3VzZWQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgcy0+c3lfdXNlZCA9IDE7Ci19Ci0KLS8qIENsZWFyIHRoZSBtYXJrIG9mIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gdXNlZC4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl91c2VkIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV91c2VkID0gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gdXNlZC4gICovCi0KLWludAotc3ltYm9sX3VzZWRfcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiBzLT5zeV91c2VkOwotfQotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIGhhdmluZyBiZWVuIHVzZWQgaW4gYSByZWxvYy4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPnN5X3VzZWRfaW5fcmVsb2MgPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHVzZWQgaW4gYSByZWxvYy4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPnN5X3VzZWRfaW5fcmVsb2MgPSAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiB1c2VkIGluIGEgcmVsb2MuICAqLwotCi1pbnQKLXN5bWJvbF91c2VkX2luX3JlbG9jX3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gcy0+c3lfdXNlZF9pbl9yZWxvYzsKLX0KLQotLyogTWFyayBhIHN5bWJvbCBhcyBhbiBNUkkgY29tbW9uIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX21yaV9jb21tb24gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPnN5X21yaV9jb21tb24gPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLiAgKi8KLQotdm9pZAotc3ltYm9sX2NsZWFyX21yaV9jb21tb24gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgcy0+c3lfbXJpX2NvbW1vbiA9IDA7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLiAgKi8KLQotaW50Ci1zeW1ib2xfbXJpX2NvbW1vbl9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHMtPnN5X21yaV9jb21tb247Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gd3JpdHRlbi4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3dyaXR0ZW4gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgcy0+d3JpdHRlbiA9IDE7Ci19Ci0KLS8qIENsZWFyIHRoZSBtYXJrIG9mIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbi4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl93cml0dGVuIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPndyaXR0ZW4gPSAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuLiAgKi8KLQotaW50Ci1zeW1ib2xfd3JpdHRlbl9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHMtPndyaXR0ZW47Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgaGFzIGhhdmluZyBiZWVuIHJlc29sdmVkLiAgKi8KLQotdm9pZAotc3ltYm9sX21hcmtfcmVzb2x2ZWQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICBsb2NhbF9zeW1ib2xfbWFya19yZXNvbHZlZCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gIHMtPnN5X3Jlc29sdmVkID0gMTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gcmVzb2x2ZWQuICAqLwotCi1pbnQKLXN5bWJvbF9yZXNvbHZlZF9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSNlbmRpZgotICByZXR1cm4gcy0+c3lfcmVzb2x2ZWQ7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGEgc2VjdGlvbiBzeW1ib2wuICAqLwotCi1pbnQKLXN5bWJvbF9zZWN0aW9uX3AgKHMpCi0gICAgIHN5bWJvbFMgKnMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICByZXR1cm4gKHMtPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwOwotI2Vsc2UKLSAgLyogRklYTUUgKi8KLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaXMgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbC4gICovCi0KLWludAotc3ltYm9sX2VxdWF0ZWRfcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBzLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYSBjb25zdGFudCB2YWx1ZS4gICovCi0KLWludAotc3ltYm9sX2NvbnN0YW50X3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAxOwotICByZXR1cm4gcy0+c3lfdmFsdWUuWF9vcCA9PSBPX2NvbnN0YW50OwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBSZXR1cm4gdGhlIEJGRCBzeW1ib2wgZm9yIGEgc3ltYm9sLiAgKi8KLQotYXN5bWJvbCAqCi1zeW1ib2xfZ2V0X2JmZHN5bSAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcmV0dXJuIHMtPmJzeW07Ci19Ci0KLS8qIFNldCB0aGUgQkZEIHN5bWJvbCBmb3IgYSBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X2JmZHN5bSAocywgYnN5bSkKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgYXN5bWJvbCAqYnN5bTsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+YnN5bSA9IGJzeW07Ci19Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZmRlZiBPQkpfU1lNRklFTERfVFlQRQotCi0vKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBvYmplY3QgZm9ybWF0IGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLU9CSl9TWU1GSUVMRF9UWVBFICoKLXN5bWJvbF9nZXRfb2JqIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICByZXR1cm4gJnMtPnN5X29iajsKLX0KLQotLyogU2V0IHRoZSBvYmplY3QgZm9ybWF0IGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfb2JqIChzLCBvKQotICAgICBzeW1ib2xTICpzOwotICAgICBPQkpfU1lNRklFTERfVFlQRSAqbzsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+c3lfb2JqID0gKm87Ci19Ci0KLSNlbmRpZiAvKiBPQkpfU1lNRklFTERfVFlQRSAqLwotCi0jaWZkZWYgVENfU1lNRklFTERfVFlQRQotCi0vKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBwcm9jZXNzb3IgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotVENfU1lNRklFTERfVFlQRSAqCi1zeW1ib2xfZ2V0X3RjIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICByZXR1cm4gJnMtPnN5X3RjOwotfQotCi0vKiBTZXQgdGhlIHByb2Nlc3NvciBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X3RjIChzLCBvKQotICAgICBzeW1ib2xTICpzOwotICAgICBUQ19TWU1GSUVMRF9UWVBFICpvOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV90YyA9ICpvOwotfQotCi0jZW5kaWYgLyogVENfU1lNRklFTERfVFlQRSAqLwotCi12b2lkCi1zeW1ib2xfYmVnaW4gKCkKLXsKLSAgc3ltYm9sX2xhc3RQID0gTlVMTDsKLSAgc3ltYm9sX3Jvb3RQID0gTlVMTDsJCS8qIEluIGNhc2Ugd2UgaGF2ZSAwIHN5bWJvbHMgKCEhKSAqLwotICBzeV9oYXNoID0gaGFzaF9uZXcgKCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBsb2NhbF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0jZW5kaWYKLQotICBtZW1zZXQgKChjaGFyICopICgmYWJzX3N5bWJvbCksICdcMCcsIHNpemVvZiAoYWJzX3N5bWJvbCkpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpZiBkZWZpbmVkIChFTUlUX1NFQ1RJT05fU1lNQk9MUykgfHwgIWRlZmluZWQgKFJFTE9DX1JFUVVJUkVTX1NZTUJPTCkKLSAgYWJzX3N5bWJvbC5ic3ltID0gYmZkX2Fic19zZWN0aW9uLnN5bWJvbDsKLSNlbmRpZgotI2Vsc2UKLSAgLyogQ2FuJ3QgaW5pdGlhbGlzZSBhIHVuaW9uLiBTaWdoLiAqLwotICBTX1NFVF9TRUdNRU5UICgmYWJzX3N5bWJvbCwgYWJzb2x1dGVfc2VjdGlvbik7Ci0jZW5kaWYKLSAgYWJzX3N5bWJvbC5zeV92YWx1ZS5YX29wID0gT19jb25zdGFudDsKLSAgYWJzX3N5bWJvbC5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotCi0gIGlmIChMT0NBTF9MQUJFTFNfRkIpCi0gICAgZmJfbGFiZWxfaW5pdCAoKTsKLX0KLQotCi0MCi1pbnQgaW5kZW50X2xldmVsOwotCi0vKiBNYXhpbXVtIGluZGVudCBsZXZlbC4KLSAgIEF2YWlsYWJsZSBmb3IgbW9kaWZpY2F0aW9uIGluc2lkZSBhIGdkYiBzZXNzaW9uLiAgKi8KLWludCBtYXhfaW5kZW50X2xldmVsID0gODsKLQotI2lmIDAKLQotc3RhdGljIHZvaWQKLWluZGVudCAoKQotewotICBwcmludGYgKCIlKnMiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci19Ci0KLSNlbmRpZgotCi12b2lkCi1wcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgc3ltKQotICAgICBGSUxFICpmaWxlOwotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBTX0dFVF9OQU1FIChzeW0pOwotICBpZiAoIW5hbWUgfHwgIW5hbWVbMF0pCi0gICAgbmFtZSA9ICIodW5uYW1lZCkiOwotICBmcHJpbnRmIChmaWxlLCAic3ltICVseCAlcyIsICh1bnNpZ25lZCBsb25nKSBzeW0sIG5hbWUpOwotCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bSkpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY3N5bSA9IChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHN5bTsKLSAgICAgIGlmIChsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSkgIT0gJnplcm9fYWRkcmVzc19mcmFnCi0JICAmJiBsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSkgIT0gTlVMTCkKLQlmcHJpbnRmIChmaWxlLCAiIGZyYWcgJWx4IiwgKGxvbmcpIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAobG9jc3ltKSk7Ci0gICAgICBpZiAobG9jYWxfc3ltYm9sX3Jlc29sdmVkX3AgKGxvY3N5bSkpCi0JZnByaW50ZiAoZmlsZSwgIiByZXNvbHZlZCIpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiBsb2NhbCIpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHN5bS0+c3lfZnJhZyAhPSAmemVyb19hZGRyZXNzX2ZyYWcpCi0JZnByaW50ZiAoZmlsZSwgIiBmcmFnICVseCIsIChsb25nKSBzeW0tPnN5X2ZyYWcpOwotICAgICAgaWYgKHN5bS0+d3JpdHRlbikKLQlmcHJpbnRmIChmaWxlLCAiIHdyaXR0ZW4iKTsKLSAgICAgIGlmIChzeW0tPnN5X3Jlc29sdmVkKQotCWZwcmludGYgKGZpbGUsICIgcmVzb2x2ZWQiKTsKLSAgICAgIGVsc2UgaWYgKHN5bS0+c3lfcmVzb2x2aW5nKQotCWZwcmludGYgKGZpbGUsICIgcmVzb2x2aW5nIik7Ci0gICAgICBpZiAoc3ltLT5zeV91c2VkX2luX3JlbG9jKQotCWZwcmludGYgKGZpbGUsICIgdXNlZC1pbi1yZWxvYyIpOwotICAgICAgaWYgKHN5bS0+c3lfdXNlZCkKLQlmcHJpbnRmIChmaWxlLCAiIHVzZWQiKTsKLSAgICAgIGlmIChTX0lTX0xPQ0FMIChzeW0pKQotCWZwcmludGYgKGZpbGUsICIgbG9jYWwiKTsKLSAgICAgIGlmIChTX0lTX0VYVEVSTiAoc3ltKSkKLQlmcHJpbnRmIChmaWxlLCAiIGV4dGVybiIpOwotICAgICAgaWYgKFNfSVNfREVCVUcgKHN5bSkpCi0JZnByaW50ZiAoZmlsZSwgIiBkZWJ1ZyIpOwotICAgICAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKSkKLQlmcHJpbnRmIChmaWxlLCAiIGRlZmluZWQiKTsKLSAgICB9Ci0gIGZwcmludGYgKGZpbGUsICIgJXMiLCBzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN5bSkpKTsKLSAgaWYgKHN5bWJvbF9yZXNvbHZlZF9wIChzeW0pKQotICAgIHsKLSAgICAgIHNlZ1QgcyA9IFNfR0VUX1NFR01FTlQgKHN5bSk7Ci0KLSAgICAgIGlmIChzICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAgICAgJiYgcyAhPSBleHByX3NlY3Rpb24pCi0JZnByaW50ZiAoZmlsZSwgIiAlbHgiLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bSkpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5kZW50X2xldmVsIDwgbWF4X2luZGVudF9sZXZlbAotCSAgICYmIFNfR0VUX1NFR01FTlQgKHN5bSkgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0gICAgewotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiXG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bSkpCi0JZnByaW50ZiAoZmlsZSwgImNvbnN0YW50ICVseCIsCi0JCSAobG9uZykgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHN5bSktPmxzeV9vZmZzZXQpOwotICAgICAgZWxzZQotI2VuZGlmCi0JcHJpbnRfZXhwcl8xIChmaWxlLCAmc3ltLT5zeV92YWx1ZSk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgICAgaW5kZW50X2xldmVsLS07Ci0gICAgfQotICBmZmx1c2ggKGZpbGUpOwotfQotCi12b2lkCi1wcmludF9zeW1ib2xfdmFsdWUgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpbmRlbnRfbGV2ZWwgPSAwOwotICBwcmludF9zeW1ib2xfdmFsdWVfMSAoc3RkZXJyLCBzeW0pOwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYmluYXJ5IChmaWxlLCBuYW1lLCBleHApCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBpbmRlbnRfbGV2ZWwrKzsKLSAgZnByaW50ZiAoZmlsZSwgIiVzXG4lKnM8IiwgbmFtZSwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICBmcHJpbnRmIChmaWxlLCAiPlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9vcF9zeW1ib2wpOwotICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICBpbmRlbnRfbGV2ZWwtLTsKLX0KLQotdm9pZAotcHJpbnRfZXhwcl8xIChmaWxlLCBleHApCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGZwcmludGYgKGZpbGUsICJleHByICVseCAiLCAobG9uZykgZXhwKTsKLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgICAgZnByaW50ZiAoZmlsZSwgImlsbGVnYWwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19hYnNlbnQ6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiYWJzZW50Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiY29uc3RhbnQgJWx4IiwgKGxvbmcpIGV4cC0+WF9hZGRfbnVtYmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIGZwcmludGYgKGZpbGUsICJzeW1ib2xcbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICBtYXliZV9wcmludF9hZGRudW06Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9udW1iZXIpCi0JZnByaW50ZiAoZmlsZSwgIlxuJSpzJWx4IiwgaW5kZW50X2xldmVsICogNCwgIiIsCi0JCSAobG9uZykgZXhwLT5YX2FkZF9udW1iZXIpOwotICAgICAgaW5kZW50X2xldmVsLS07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAicmVnaXN0ZXIgIyVkIiwgKGludCkgZXhwLT5YX2FkZF9udW1iZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2JpZzoKLSAgICAgIGZwcmludGYgKGZpbGUsICJiaWciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT191bWludXM6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAidW1pbnVzIC08Iik7Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPiIpOwotICAgICAgZ290byBtYXliZV9wcmludF9hZGRudW07Ci0gICAgY2FzZSBPX2JpdF9ub3Q6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiYml0X25vdCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX211bHRpcGx5OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibXVsdGlwbHkiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2RpdmlkZToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImRpdmlkZSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbW9kdWx1czoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgIm1vZHVsdXMiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2xlZnRfc2hpZnQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsc2hpZnQiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3JpZ2h0X3NoaWZ0OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAicnNoaWZ0IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiYml0X2lvciIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImJpdF94b3IiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2JpdF9hbmQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJiaXRfYW5kIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19lcToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImVxIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19uZToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgIm5lIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sdDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImx0IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sZToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImxlIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19nZToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImdlIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19ndDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImd0IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sb2dpY2FsX2FuZDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImxvZ2ljYWxfYW5kIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sb2dpY2FsX29yOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibG9naWNhbF9vciIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYWRkOgotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiYWRkXG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+XG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9vcF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICAgIGdvdG8gbWF5YmVfcHJpbnRfYWRkbnVtOwotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgZnByaW50ZiAoZmlsZSwgInN1YnRyYWN0XG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+XG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9vcF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICAgIGdvdG8gbWF5YmVfcHJpbnRfYWRkbnVtOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAie3Vua25vd24gb3Bjb2RlICVkfSIsIChpbnQpIGV4cC0+WF9vcCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGZmbHVzaCAoc3Rkb3V0KTsKLX0KLQotdm9pZAotcHJpbnRfZXhwciAoZXhwKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBwcmludF9leHByXzEgKHN0ZGVyciwgZXhwKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotdm9pZAotc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgInN5bWJvbCB0YWJsZSIsIHN5X2hhc2gpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAibWluaSBsb2NhbCBzeW1ib2wgdGFibGUiLCBsb2NhbF9oYXNoKTsKLSAgZnByaW50ZiAoZmlsZSwgIiVsdSBtaW5pIGxvY2FsIHN5bWJvbHMgY3JlYXRlZCwgJWx1IGNvbnZlcnRlZFxuIiwKLQkgICBsb2NhbF9zeW1ib2xfY291bnQsIGxvY2FsX3N5bWJvbF9jb252ZXJzaW9uX2NvdW50KTsKLSNlbmRpZgotfQotCi0vKiBlbmQgb2Ygc3ltYm9scy5jICovCmRpZmYgLS1naXQgYS9nYXMvc3ltYm9scy5oIGIvZ2FzL3N5bWJvbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiNzNhZi4uMDAwMDAwMAotLS0gYS9nYXMvc3ltYm9scy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qIHN5bWJvbHMuaCAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotLyogVGhlIEJGRCBjb2RlIHdhbnRzIHRvIHdhbGsgdGhlIGxpc3QgaW4gYm90aCBkaXJlY3Rpb25zLiAgKi8KLSN1bmRlZiAgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotI2RlZmluZSBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0jZW5kaWYKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBUaGUgbm9uLUJGRCBjb2RlIGV4cGVjdHMgdG8gYmUgYWJsZSB0byBtYW5pcHVsYXRlIHRoZSBzeW1ib2wgZmllbGRzCi0gICBkaXJlY3RseS4gICovCi0jaW5jbHVkZSAic3RydWMtc3ltYm9sLmgiCi0jZW5kaWYKLQotZXh0ZXJuIHN0cnVjdCBvYnN0YWNrIG5vdGVzOwkvKiBlZyBGaXhTIGxpdmUgaGVyZS4gKi8KLQotZXh0ZXJuIHN0cnVjdCBvYnN0YWNrIGNvbmRfb2JzdGFjazsJLyogdGhpcyBpcyB3aGVyZSB3ZSB0cmFjayAuaWZkZWYvLmVuZGlmCi0JCQkJICAgICAgIChpZiB3ZSBkbyB0aGF0IGF0IGFsbCkuICAqLwotCi1leHRlcm4gc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwkvKiBhbGwgdGhlIHN5bWJvbCBub2RlcyAqLwotZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9sYXN0UDsJLyogbGFzdCBzdHJ1Y3Qgc3ltYm9sIHdlIG1hZGUsIG9yIE5VTEwgKi8KLQotZXh0ZXJuIHN5bWJvbFMgYWJzX3N5bWJvbDsKLQotZXh0ZXJuIGludCBzeW1ib2xfdGFibGVfZnJvemVuOwotCi0vKiBUaGlzIGlzIG5vbi16ZXJvIGlmIHN5bWJvbHMgYXJlIGNhc2Ugc2Vuc2l0aXZlLCB3aGljaCBpcyB0aGUKLSAgIGRlZmF1bHQuICAqLwotZXh0ZXJuIGludCBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlOwotCi1jaGFyICpkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChjaGFyICpzKSk7Ci1zeW1ib2xTICpzeW1ib2xfZmluZCBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lKSk7Ci1zeW1ib2xTICpzeW1ib2xfZmluZF9iYXNlIFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUsIGludCBzdHJpcF91bmRlcnNjb3JlKSk7Ci1zeW1ib2xTICpzeW1ib2xfZmluZF9vcl9tYWtlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLXN5bWJvbFMgKnN5bWJvbF9tYWtlIFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUpKTsKLXN5bWJvbFMgKnN5bWJvbF9uZXcgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSwgc2VnVCBzZWdtZW50LCB2YWx1ZVQgdmFsdWUsCi0JCQkgICAgIGZyYWdTICogZnJhZykpOwotc3ltYm9sUyAqc3ltYm9sX2NyZWF0ZSBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lLCBzZWdUIHNlZ21lbnQsIHZhbHVlVCB2YWx1ZSwKLQkJCQlmcmFnUyAqIGZyYWcpKTsKLXN5bWJvbFMgKmNvbG9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN5bV9uYW1lKSk7Ci12b2lkIGxvY2FsX2NvbG9uIFBBUkFNUyAoKGludCBuKSk7Ci12b2lkIHN5bWJvbF9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIHN5bWJvbF9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOwotdm9pZCBzeW1ib2xfdGFibGVfaW5zZXJ0IFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci12YWx1ZVQgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLXZvaWQgcmVzb2x2ZV9sb2NhbF9zeW1ib2xfdmFsdWVzIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCBwcmludF9zeW1ib2xfdmFsdWUgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci12b2lkIHByaW50X2V4cHIgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotdm9pZCBwcmludF9leHByXzEgUEFSQU1TICgoRklMRSAqLCBleHByZXNzaW9uUyAqKSk7Ci12b2lkIHByaW50X3N5bWJvbF92YWx1ZV8xIFBBUkFNUyAoKEZJTEUgKiwgc3ltYm9sUyAqKSk7Ci0KLWludCBkb2xsYXJfbGFiZWxfZGVmaW5lZCBQQVJBTVMgKChsb25nIGwpKTsKLXZvaWQgZG9sbGFyX2xhYmVsX2NsZWFyIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgZGVmaW5lX2RvbGxhcl9sYWJlbCBQQVJBTVMgKChsb25nIGwpKTsKLWNoYXIgKmRvbGxhcl9sYWJlbF9uYW1lIFBBUkFNUyAoKGxvbmcgbCwgaW50IGF1Z2VuZCkpOwotCi12b2lkIGZiX2xhYmVsX2luc3RhbmNlX2luYyBQQVJBTVMgKChsb25nIGxhYmVsKSk7Ci1jaGFyICpmYl9sYWJlbF9uYW1lIFBBUkFNUyAoKGxvbmcgbiwgbG9uZyBhdWdlbmQpKTsKLQotZXh0ZXJuIHZvaWQgY29weV9zeW1ib2xfYXR0cmlidXRlcyBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotCi0vKiBHZXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIHN5bWJvbHMuICBUaGVzZSB1c2VkIHRvIGJlIG1hY3Jvcy4gICovCi1leHRlcm4gdmFsdWVUIFNfR0VUX1ZBTFVFIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgU19TRVRfVkFMVUUgUEFSQU1TICgoc3ltYm9sUyAqLCB2YWx1ZVQpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBpbnQgU19JU19GVU5DVElPTiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19FWFRFUk5BTCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19XRUFLIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0NPTU1PTiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19ERUZJTkVEIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0RFQlVHIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0xPQ0FMIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBTX0lTX0VYVEVSTiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19TVEFCRCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBDT05TVCBjaGFyICpTX0dFVF9OQU1FIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHNlZ1QgU19HRVRfU0VHTUVOVCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNfU0VUX1NFR01FTlQgUEFSQU1TICgoc3ltYm9sUyAqLCBzZWdUKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9FWFRFUk5BTCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNfU0VUX05BTUUgUEFSQU1TICgoc3ltYm9sUyAqLCBjaGFyICopKTsKLWV4dGVybiB2b2lkIFNfQ0xFQVJfRVhURVJOQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9XRUFLIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2VuZGlmCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotc3RydWN0IGJyb2tlbl93b3JkCi0gIHsKLSAgICAvKiBMaW5rZWQgbGlzdCAtLSBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBwZXIgIi53b3JkIHgteStDIgotICAgICAgIGV4cHJlc3Npb24uICAqLwotICAgIHN0cnVjdCBicm9rZW5fd29yZCAqbmV4dF9icm9rZW5fd29yZDsKLSAgICAvKiBTZWdtZW50IGFuZCBzdWJzZWdtZW50IGZvciBicm9rZW4gd29yZC4gICovCi0gICAgc2VnVCBzZWc7Ci0gICAgc3Vic2VnVCBzdWJzZWc7Ci0gICAgLyogV2hpY2ggZnJhZyBpcyB0aGlzIGJyb2tlbiB3b3JkIGluPyAgKi8KLSAgICBmcmFnUyAqZnJhZzsKLSAgICAvKiBXaGVyZSBpbiB0aGUgZnJhZyBpcyBpdD8gICovCi0gICAgY2hhciAqd29yZF9nb2VzX2hlcmU7Ci0gICAgLyogV2hlcmUgdG8gYWRkIHRoZSBicmVhay4gICovCi0gICAgZnJhZ1MgKmRpc3BmcmFnOwkJLyogd2hlcmUgdG8gYWRkIHRoZSBicmVhayAqLwotICAgIC8qIE9wZXJhbmRzIG9mIGV4cHJlc3Npb24uICAqLwotICAgIHN5bWJvbFMgKmFkZDsKLSAgICBzeW1ib2xTICpzdWI7Ci0gICAgb2Zmc2V0VCBhZGRudW07Ci0KLSAgICBpbnQgYWRkZWQ7CQkJLyogbmFzdHkgdGhpbmcgaGFwcGVuZCB5ZXQ/ICovCi0gICAgLyogMTogYWRkZWQgYW5kIGhhcyBhIGxvbmctanVtcCAqLwotICAgIC8qIDI6IGFkZGVkIGJ1dCB1c2VzIHNvbWVvbmUgZWxzZXMgbG9uZy1qdW1wICovCi0KLSAgICAvKiBQb2ludGVyIHRvIGJyb2tlbl93b3JkIHdpdGggYSBzaW1pbGFyIGxvbmctanVtcC4gICovCi0gICAgc3RydWN0IGJyb2tlbl93b3JkICp1c2VfanVtcDsKLSAgfTsKLWV4dGVybiBzdHJ1Y3QgYnJva2VuX3dvcmQgKmJyb2tlbl93b3JkczsKLSNlbmRpZiAvKiBuZGVmIFdPUktJTkdfRE9UX1dPUkQgKi8KLQotLyoKLSAqIEN1cnJlbnQgbWVhbnMgZm9yIGdldHRpbmcgZnJvbSBzeW1ib2xzIHRvIHNlZ21lbnRzIGFuZCB2aWNlIHZlcnNlLgotICogVGhpcyB3aWxsIGNoYW5nZSBmb3IgaW5maW5pdGUtc2VnbWVudHMgc3VwcG9ydCAoZS5nLiBDT0ZGKS4KLSAqLwotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwkvKiBzdWJzZWcuYyAqLwotCi0jZGVmaW5lCVNFR01FTlRfVE9fU1lNQk9MX1RZUEUoc2VnKSAgKCBzZWdfTl9UWVBFIFsoaW50KSAoc2VnKV0gKQotZXh0ZXJuIGNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXTsvKiBzdWJzZWcuYyAqLwotCi0jZGVmaW5lCU5fUkVHSVNURVIJMzAJLyogRmFrZSBOX1RZUEUgdmFsdWUgZm9yIFNFR19SRUdJU1RFUiAqLwotCi12b2lkIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci0KLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0KLXZvaWQgc3ltYm9sX2luc2VydCBQQVJBTVMgKChzeW1ib2xTICogYWRkbWUsIHN5bWJvbFMgKiB0YXJnZXQsCi0JCQkgICAgc3ltYm9sUyAqKiByb290UCwgc3ltYm9sUyAqKiBsYXN0UCkpOwotdm9pZCBzeW1ib2xfcmVtb3ZlIFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQLCBzeW1ib2xTICoqIHJvb3RQLAotCQkJICAgIHN5bWJvbFMgKiogbGFzdFApKTsKLQotZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9wcmV2aW91cyBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotdm9pZCB2ZXJpZnlfc3ltYm9sX2NoYWluIFBBUkFNUyAoKHN5bWJvbFMgKiByb290UCwgc3ltYm9sUyAqIGxhc3RQKSk7Ci12b2lkIHZlcmlmeV9zeW1ib2xfY2hhaW5fMiBQQVJBTVMgKChzeW1ib2xTICogc3ltUCkpOwotCi12b2lkIHN5bWJvbF9hcHBlbmQgUEFSQU1TICgoc3ltYm9sUyAqIGFkZG1lLCBzeW1ib2xTICogdGFyZ2V0LAotCQkJICAgIHN5bWJvbFMgKiogcm9vdFAsIHN5bWJvbFMgKiogbGFzdFApKTsKLQotZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9uZXh0IFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi1leHRlcm4gZXhwcmVzc2lvblMgKnN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiBQQVJBTVMgKChzeW1ib2xTICosCi0JCQkJCQkgY29uc3QgZXhwcmVzc2lvblMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX3NldF9mcmFnIFBBUkFNUyAoKHN5bWJvbFMgKiwgZnJhZ1MgKikpOwotZXh0ZXJuIGZyYWdTICpzeW1ib2xfZ2V0X2ZyYWcgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya191c2VkIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX2NsZWFyX3VzZWQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF91c2VkX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF91c2VkX2luX3JlbG9jX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya19tcmlfY29tbW9uIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX2NsZWFyX21yaV9jb21tb24gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9tcmlfY29tbW9uX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya193cml0dGVuIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX2NsZWFyX3dyaXR0ZW4gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF93cml0dGVuX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfbWFya19yZXNvbHZlZCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgc3ltYm9sX3Jlc29sdmVkX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9zZWN0aW9uX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9lcXVhdGVkX3AgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9jb25zdGFudF9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGFzeW1ib2wgKnN5bWJvbF9nZXRfYmZkc3ltIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX3NldF9iZmRzeW0gUEFSQU1TICgoc3ltYm9sUyAqLCBhc3ltYm9sICopKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX1NZTUZJRUxEX1RZUEUKLU9CSl9TWU1GSUVMRF9UWVBFICpzeW1ib2xfZ2V0X29iaiBQQVJBTVMgKChzeW1ib2xTICopKTsKLXZvaWQgc3ltYm9sX3NldF9vYmogUEFSQU1TICgoc3ltYm9sUyAqLCBPQkpfU1lNRklFTERfVFlQRSAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1NZTUZJRUxEX1RZUEUKLVRDX1NZTUZJRUxEX1RZUEUgKnN5bWJvbF9nZXRfdGMgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci12b2lkIHN5bWJvbF9zZXRfdGMgUEFSQU1TICgoc3ltYm9sUyAqLCBUQ19TWU1GSUVMRF9UWVBFICopKTsKLSNlbmRpZgotCi0vKiBlbmQgb2Ygc3ltYm9scy5oICovCmRpZmYgLS1naXQgYS9nYXMvdGMuaCBiL2dhcy90Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQwNDZjLi4wMDAwMDAwCi0tLSBhL2dhcy90Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qIHRjLmggLSB0YXJnZXQgY3B1IGRlcGVuZGVudAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW4gdGhlb3J5IChtaW5lLCBhdCBsZWFzdCEpIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIKLSAgIHNob3VsZCBvbmx5IGhhdmUgdG8gaW5jbHVkZSBvbmUgZmlsZS4gIFRoaXMgb25lLiAgLS0gSkYgKi8KLQotZXh0ZXJuIGNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXTsKLQotLyogSkYgbW92ZWQgdGhpcyBoZXJlIGZyb20gYXMuaCB1bmRlciB0aGUgdGhlb3J5IHRoYXQgbm9ib2R5IGV4Y2VwdCBNQUNISU5FLmMKLSAgIGFuZCB3cml0ZS5jIGNhcmUgYWJvdXQgaXQgYW55d2F5LiAqLwotCi1zdHJ1Y3QgcmVsYXhfdHlwZQotewotICAvKiBGb3J3YXJkIHJlYWNoLiBTaWduZWQgbnVtYmVyLiA+IDAuICovCi0gIGxvbmcgcmx4X2ZvcndhcmQ7Ci0gIC8qIEJhY2t3YXJkIHJlYWNoLiBTaWduZWQgbnVtYmVyLiA8IDAuICovCi0gIGxvbmcgcmx4X2JhY2t3YXJkOwotCi0gIC8qIEJ5dGVzIGxlbmd0aCBvZiB0aGlzIGFkZHJlc3MuICovCi0gIHVuc2lnbmVkIGNoYXIgcmx4X2xlbmd0aDsKLQotICAvKiBOZXh0IGxvbmdlciByZWxheC1zdGF0ZS4gIDAgbWVhbnMgdGhlcmUgaXMgbm8gJ25leHQnIHJlbGF4LXN0YXRlLiAqLwotICByZWxheF9zdWJzdGF0ZVQgcmx4X21vcmU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCByZWxheF90eXBlIHJlbGF4X3R5cGVTOwotCi1leHRlcm4gY29uc3QgaW50IG1kX3JlbG9jX3NpemU7CS8qIFNpemUgb2YgYSByZWxvY2F0aW9uIHJlY29yZCAqLwotCi1jaGFyICptZF9hdG9mIFBBUkFNUyAoKGludCB3aGF0X3N0YXRlbWVudF90eXBlLCBjaGFyICpsaXRlcmFsUCwgaW50ICpzaXplUCkpOwotI2lmbmRlZiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAotaW50IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFBBUkFNUyAoKGZyYWdTICogZnJhZ1AsIHNlZ1Qgc2VnbWVudCkpOwotI2VuZGlmCi1pbnQgbWRfcGFyc2Vfb3B0aW9uIFBBUkFNUyAoKGludCBjLCBjaGFyICphcmcpKTsKLXZvaWQgbWRfc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICopKTsKLWxvbmcgbWRfcGNyZWxfZnJvbSBQQVJBTVMgKChmaXhTICogZml4UCkpOwotc2hvcnQgdGNfY29mZl9maXgycnR5cGUgUEFSQU1TICgoZml4UyAqIGZpeFApKTsKLXZvaWQgbWRfYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyKSk7Ci12b2lkIG1kX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLSNpZm5kZWYgbWRfY3JlYXRlX2xvbmdfanVtcAotdm9pZCBtZF9jcmVhdGVfbG9uZ19qdW1wIFBBUkFNUyAoKGNoYXIgKnB0ciwgYWRkcmVzc1QgZnJvbV9hZGRyLAotCQkJCSAgYWRkcmVzc1QgdG9fYWRkciwgZnJhZ1MgKiBmcmFnLAotCQkJCSAgc3ltYm9sUyAqIHRvX3N5bWJvbCkpOwotI2VuZGlmCi0jaWZuZGVmIG1kX2NyZWF0ZV9zaG9ydF9qdW1wCi12b2lkIG1kX2NyZWF0ZV9zaG9ydF9qdW1wIFBBUkFNUyAoKGNoYXIgKnB0ciwgYWRkcmVzc1QgZnJvbV9hZGRyLAotCQkJCSAgIGFkZHJlc3NUIHRvX2FkZHIsIGZyYWdTICogZnJhZywKLQkJCQkgICBzeW1ib2xTICogdG9fc3ltYm9sKSk7Ci0jZW5kaWYKLXZvaWQgbWRfbnVtYmVyX3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgdmFsdWVUIHZhbCwgaW50IG4pKTsKLQotI2lmbmRlZiBtZF9vcGVyYW5kCi12b2lkIG1kX29wZXJhbmQgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotI2VuZGlmCi0KLSNpZmRlZiBNRF9BUFBMWV9GSVgzCi1pbnQgbWRfYXBwbHlfZml4MyBQQVJBTVMgKChmaXhTICogZml4UCwgdmFsdWVUICp2YWwsIHNlZ1Qgc2VnKSk7Ci0jZW5kaWYKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQgbWRfYXBwbHlfZml4IFBBUkFNUyAoKGZpeFMgKiBmaXhQLCB2YWx1ZVQgKnZhbCkpOwotI2lmbmRlZiBtZF9jb252ZXJ0X2ZyYWcKLXZvaWQgbWRfY29udmVydF9mcmFnIFBBUkFNUyAoKGJmZCAqIGhlYWRlcnMsIHNlZ1Qgc2VjLCBmcmFnUyAqIGZyYWdQKSk7Ci0jZW5kaWYKLSNpZm5kZWYgdGNfaGVhZGVyc19ob29rCi12b2lkIHRjX2hlYWRlcnNfaG9vayBQQVJBTVMgKChzZWdUICosIGZpeFMgKikpOwotI2VuZGlmCi0jaWZuZGVmIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotZXh0ZXJuIGFyZWxlbnQgKnRjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLSNlbHNlCi1leHRlcm4gYXJlbGVudCAqKnRjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLSNlbmRpZgotI2Vsc2UgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLXZvaWQgbWRfYXBwbHlfZml4IFBBUkFNUyAoKGZpeFMgKiBmaXhQLCBsb25nIHZhbCkpOwotI2lmbmRlZiBtZF9jb252ZXJ0X2ZyYWcKLXZvaWQgbWRfY29udmVydF9mcmFnIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycywgc2VnVCwgZnJhZ1MgKiBmcmFnUCkpOwotI2VuZGlmCi0KLSNpZm5kZWYgdGNfY3Jhd2xfc3ltYm9sX2NoYWluCi12b2lkIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLSNlbmRpZiAvKiB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gKi8KLQotI2lmbmRlZiB0Y19oZWFkZXJzX2hvb2sKLXZvaWQgdGNfaGVhZGVyc19ob29rIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2VuZGlmIC8qIHRjX2hlYWRlcnNfaG9vayAqLwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBtZF9zZWN0aW9uX2FsaWduCi12YWx1ZVQgbWRfc2VjdGlvbl9hbGlnbiBQQVJBTVMgKChzZWdUIHNlZywgdmFsdWVUIHNpemUpKTsKLSNlbmRpZgotCi0jaWZuZGVmIG1kX3VuZGVmaW5lZF9zeW1ib2wKLXN5bWJvbFMgKm1kX3VuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotI2VuZGlmCi0KLS8qIGVuZCBvZiB0Yy5oICovCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL0NoYW5nZUxvZyBiL2dhcy90ZXN0c3VpdGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTlmOTIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMjY4NSArMCwwIEBACi0yMDAwLTA0LTAxICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21uMTAzMDAvYW0zM181LnM6IENoZWNrIHRoYXQgbmVnYXRpdmUgU1Agb2Zmc2V0cyBhcmUgZW5jb2RlZAotCXdpdGggMzIgYml0cywgbm90IHdpdGggdGhlIHVuc2lnbmVkIHNob3J0ZXIgb3Bjb2Rlcy4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogTGlrZXdpc2UuCi0KLTIwMDAtMDMtMzEgIEFsZXhhbmRyZSBPbGl2YSAgPGFvbGl2YUBjeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChyZWdleHBfZGlmZik6IERvbid0IGJyZWFrIG9uIHRoZSBmaXJzdAotCWRpZmZlcmVuY2UsIGxpc3QgdGhlbSBhbGwuCi0KLTIwMDAtMDMtMjkgIE5pY2sgQ2xpZnRvbiA8bmlja2NAY3lnbnVzLmNvbQotCi0JKiBnYXMvYXJtL3RodW1iLnM6IEFkZCB0ZXN0IG9mIGJhbCBpbnN0cnVjdGlvbi4KLQotMjAwMC0wMy0yNyAgQWxhbiBNb2RyYSAgPGFsYW5AbGludXhjYXJlLmNvbS5hdT4KLQotCSogZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwIChkb3Rlc3QpOiBGaXggdGVzdCBmb3IKLQlMSVNUSU5HX1dPUkRfU0laRT09MS4KLQkqIGdhcy9hbGwvZ2FzLmV4cCAoZG9fOTMwNTA5YSk6IFNhbWUgaGVyZS4KLQkqIGdhcy9hbGwvY29uZC5kOiBBbmQgaGVyZS4KLQotMjAwMC0wMy0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9hcm0uZXhwOiBSdW4gYnJhbmNoLnMgdGVzdC4KLQlSdW4gdGVzdHMgaWYgdGFyZ2V0IGlzIHN0cm9uZ2FybS4KLQotCSogZ2FzL2FybS9icmFuY2guczogTmV3IHRlc3QuICBNYWtlIHN1cmUgdGhhdCBhc3NlbWJsZXIgY2FuIGhhbmRsZQotCXNhbWUtc2VjdGlvbiBicmFuY2ggcmVsb2NhdGlvbnMgcHJvcGVybHkuCi0KLQkqIGdhcy9hcm0vYnJhbmNoLmQ6IE5ldyBmaWxlLiAgRXhwZWN0ZWQgb3V0cHV0IGZyb20gYXNzZW1ibGluZwotCWJyYW5jaC5zLgotCi0yMDAwLTAzLTEwICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2VtcGljLmQ6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvZW1waWMuczogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9taXBzMTYtZS5kOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL21pcHMxNi1lLnM6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvbWlwczE2LWYuZDogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9taXBzMTYtZi5zOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGQgZW1waWMsIG1pcHMxNi1lLiAgQWRkIG1pcHMxNi1mIGFzIGFuCi0JZXhwZWN0ZWQgZmFpbHVyZS4KLQotMjAwMC0wMi0yNSAgSC5KLiBMdSA8aGpsQGdudS5vcmc+Ci0KLQkqIGdhcy9pMzg2L2dlbmVyYWwubDogU3VwcG9ydCBhLm91dCBhbmQgY29mZi4KLQotMjAwMC0wMi0yNSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9pbnRlbC5zOiBOZXcgZmlsZSwgaW50ZWwgdmVyc2lvbiBvZiBvcGNvZGUucwotCSogZ2FzL2kzODYvaW50ZWwuZDogTmV3IGZpbGUsIGNvcHkgb2Ygb3Bjb2RlLmQKLQkqIGdhcy9pMzg2L2kzODYuZXhwOiBDYWxsIGl0LgotCi0JKiBnYXMvaTM4Ni9nZW5lcmFsLnM6IEFkZCBleHRyYSAib3V0IiBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvaTM4Ni9nZW5lcmFsLmw6IExpa2V3aXNlLgotCi0yMDAwLTAxLTMxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2luc3QuczogSW5jbHVkZSB0ZXN0IG9mIEFUUENTIHJlZ2lzdGVyIG5hbWluZwotCWNvbnZlbnRpb25zLgotCi0JKiBnYXMvYXJtL2Zsb2F0LnM6IEluY2x1ZGUgdGVzdCBvZiBBVFBDUyByZWdpc3RlciBuYW1pbmcKLQljb252ZW50aW9ucy4KLQotRnJpIEphbiAyMSAxMjo0ODowNiAyMDAwICBILkouIEx1IDxoamxAZ251Lm9yZz4KLQotCSogZ2FzL2kzODYvZ2VuZXJhbC5sOiBTdXBwb3J0IGEub3V0LgotCSogZ2FzL2kzODYvanVtcC5kOiBMaWtld2lzZS4KLQkqIGdhcy9pMzg2L2p1bXAxNi5kOiBMaWtld2lzZS4KLQotMjAwMC0wMS0yMSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9nZW5lcmFsLntzLGx9OiBNb3ZlIDE2IGJpdCBqbXAgYW5kIGNhbGwgdGVzdHMgZnJvbSBoZXJlCi0JKiBnYXMvaTM4Ni9qdW1wMTYue3MsZH06IFRvIGhlcmUuCi0JKiBnYXMvaTM4Ni9qdW1wLntzLGR9OiBOZXcgZmlsZXMuICBEdXBsaWNhdGUgMzIgYml0IGptcCBhbmQgY2FsbAotCXRlc3RzIGluIGdlbmVyYWwucyBzbyB0aGF0IG9iamR1bXAgaXMgZXhlcmNpc2VkLgotCi0JKiBnYXMvaTM4Ni9pMzg2LmV4cDogQ2FsbCBuZXcgdGVzdHMuCi0KLTIwMDAtMDEtMTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvZ2VuZXJhbC57cyxsfTogQWRkIGptcCBhbmQgY2FsbCB0ZXN0cyBmb3IgLmNvZGUxNmdjYywKLQkuY29kZTE2LCBhbmQgLmNvZGUzMiBtb2Rlcy4KLQotVHVlIE5vdiAzMCAyMzowMjowMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL3thbTMzLnMsIGFtMzNfMi5zLCBhbTMzXzMuc306IE5ldyB0ZXN0IGZpbGVzLgotCSogZ2FzL21uMTAzMDAve2FtMzNfNC5zLCBhbTMzXzUucywgYW0zM182LnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL3thbTMzXzcucywgYW0zM184LnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogUnVuIHRoZSBhbTMzIHRlc3RzLgotCi0xOTk5LTExLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGEuZDogQWRqdXN0IGZvciBuZXcgbGEgbWFjcm8gZXhwYW5zaW9uLgotCUNoYW5nZSBtYXRjaGVzIGZvciBleHBsaWNpdCBhZGRyZXNzZXMgdG8gbWF0Y2hlcyBmb3IKLQlhbnkgYWRkcmVzcy4KLQkqIGdhcy9taXBzL2xhLXhnb3QuZDogU2FtZS4KLQkqIGdhcy9taXBzL2xhLXN2cjRwaWMuZDogU2FtZS4KLQotMTk5OS0xMS0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVJlbW92ZSByZWxvYyBnZW5lcmF0aW5nIHJlZmVyZW5jZXMgdG8gbG9jYWwgbGFiZWxzIGluIHRlc3QgY29kZS4KLQlTb21lIEFSTSB0YXJnZXRzIChlZyBQRSkgZ2VuZXJhdGUgYSByZWxvYyBiYXNlZCBvbiB0aGUgbGFiZWwsCi0Jd2hpbHN0IG90aGVycyAoZWcgRUxGKSBnZW5lcmF0ZSBhIHJlbG9jIGJhc2VkIG9uIHRoZSBzZWN0aW9uCi0Jc3ltYm9sLiAgVGhpcyBtZWFudCB0aGF0IHRoZSBkaXNhc3NlbWJsZWQgb3V0cHV0cyB3b3VsZCBkaWZmZXIuCi0JCi0JKiBnYXMvYXJtL2luc3QuczogQ2hhbmdlIHRlc3Qgb2YgQkxQTCBpbnN0cnVjdGlvbi4KLQkqIGdhcy9hcm0vaW5zdC5kOiBDaGFuZ2UgZXhwZWN0ZWQgZGVjb2RlIG9mIEJMUEwgaW5zdHJ1Y3Rpb24uCi0JKiBnYXMvYXJtL2FybTd0LnM6IFJlbW92ZSB1c2Ugb2YgLkxDMCBsYWJlbCBpbiAud29yZCBkaXJlY3RpdmUuCi0JUmVtb3ZlIC5yZGF0YSBzZWN0aW9uLCBzaW5jZSB0aGlzIGNhbm5vdCBleGlzdCBpbiBhbiBhcm0tYW91dAotCXRhcmdldC4KLQkqIGdhcy9hcm0vYXJtN3QuZDogQ2hhbmdlIGV4cGVjdGVkIHJlbG9jIGdlbmVyYXRlZCBmb3IgLndvcmQKLQlkaXJlY3RpdmUuCi0KLTE5OTktMTAtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuZDogVXBkYXRlIHRvIG1hdGNoIGxhdGVzdCBvYmpkdW1wIG91dHB1dC4KLQkqIGdhcy9hcm0vaW5zdC5zOiBGaXggZXJyb25lb3VzIHRlc3QgY2FzZS4KLQkqIGdhcy9hcm0vaW5zdC5kOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IG9iamR1bXAgb3V0cHV0LgotCi1Nb24gT2N0IDExIDEzOjM3OjUxIDE5OTkgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocmVnZXhwX2RpZmYpOiBBbGxvdyAnIy4uLicgdG8gbWVhbiAic29tZQotIAlpbmRldGVybWluYXRlIG51bWJlciBvZiBleHRyYSBsaW5lcyBoZXJlIi4KLQotCSogZ2FzL2VsZi9lbGYuZXhwOiBSZW1vdmUgWEZBSUxzLgotCSogZ2FzL2VsZi9zZWN0aW9uMC5kOiBNYWtlIHBhc3Mgb24gTUlQUyAoYW5kIGhvcGVmdWxseSBhbHBoYSkuCi0JKiBnYXMvZWxmL3NlY3Rpb24xLmQ6IExpa2V3aXNlLgotCi1UaHUgT2N0ICA3IDAwOjEyOjA0IE1EVCAxOTk5CURpZWdvIE5vdmlsbG8gPGRub3ZpbGxvQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMTB2OiBOZXcgZGlyZWN0b3J5LgotCSogZ2FzL2QxMHYvZDEwLmV4cDogTmV3IGZpbGUuCi0JKiBnYXMvZDEwdi9pbnN0LnM6IE5ldyBmaWxlLgotCSogZ2FzL2QxMHYvaW5zdC5kOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAgNyAxMjo1MjoyNSAxOTk5ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2VsZi1yZWwuczogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9lbGYtcmVsLmQ6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvZWxmLXJlbDIuZDogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9lMzItcmVsMi5kOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL2VsZi1yZWwyLnM6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkZCBlbGYtcmVsLCBlbGYtcmVsMi4KLQotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQ6IFR3ZWFrIGEgbGl0dGxlIHNvIGl0IHBhc3NlcwotCWV2ZW4gaWYgdGhlIENQVSBpcyBzZXQgdG8gc29tZXRoaW5nIGJ5IGRlZmF1bHQuCi0KLU1vbiBPY3QgIDQgMTg6MjU6NDkgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvZXJyb3IuZXhwOiBOZXcgdGVzdGNhc2UgZHJpdmVyLgotCSogZ2FzL20zMnIvbTMycnguZXhwOiBOZXcgdGVzdGNhc2UgZHJpdmVyLgotCSogZ2FzL20zMnIvZnNsb3R4LltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL20zMnJ4LltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL3JlbGF4LXMuW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvaW50ZXJmZXJlLnM6IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL3dyb25nc2l6ZS5zOiBOZXcgdGVzdGNhc2UuCi0KLTE5OTktMDktMTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvaTM4Ni5leHA6IEVuYWJsZSByZWxvYyBhbmQgd2hpdGUgdGVzdHMgZm9yIENPRkYuCi0JKiBnYXMvaTM4Ni9yZWxvYy5kOiBBY2NlcHQgZGlyMzIgcmVsb2NzLgotCi0xOTk5LTA5LTEyICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBSdW4gY29mZnRhZyB0ZXN0IGZvciBpKjg2LSotaW50ZXJpeCouCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBBZGQgcGVycm9yIGlmIGNhbiBub3QgcmVhZCAuZCBmaWxlLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIGdhcy9wai97cGouZXhwLCBvcHMuYywgb3BzLmR9OiBOZXcgdGVzdHMgZm9yIHBpY29KYXZhLgotCi0xOTk5LTA5LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvdnRhYmxlL3Z0YWJsZS5leHA6IEFkZCBbaXN0YXJnZXQgInN0cm9uZ2FybSotKi0qIl0gdG8gcnVuCi0JZHVtcCAgdGVzdCAiZW50cnkwIiBpbnN0ZWFkIG9mICJlbnRyeTEiLgotCQotMTk5OS0wOS0wMSAgU2NvdHQgQmFtYnJvdWdoICA8c2NvdHRiQG5ldHdpbmRlci5vcmc+Ci0gCi0gICAgICAgICogZ2FzL3Z0YWJsZS92dGFibGUuZXhwOiBBZGRlZCBbaXN0YXJnZXQgImFybSotKi0qIl0gdG8gcnVuIGR1bXAgCi0gICAgICAgIHRlc3QgImVudHJ5MCIgaW5zdGVhZCBvZiAiZW50cnkxIi4gIEFSTSB0YXJnZXRzIHVzZSBSRUwgcmVsb2NzLAotICAgICAgICBhbmQgc2hvdWxkIHVzZSB0aGUgdGVzdCBlbnRyeTAuCi0KLTE5OTktMDktMDEgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZ2FzL2kzODYvbmFrZWQuZDogRml4IGZvciBjb2ZmIHRhcmdldHMuCi0KLU1vbiBBdWcgMzAgMTI6MTg6NDAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC8qLnM6IFVzZSAuY29kZSBpbnN0ZWFkIG9mIC5TUEFDRS8uU1VCU1BBIGZvcgotCXNlY3Rpb25pbmcuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IERpc2FibGUgdGVzdHMgbm90IGFwcHJvcHJpYXRlIGZvcgotCVBBNjQuCi0KLQkqIGdhcy9ocHBhL3JlbG9jLyouczogVXNlIC5jb2RlIGluc3RlYWQgb2YgLlNQQUNFLy5TVUJTUEEgZm9yCi0Jc2VjdGlvbmluZy4KLQkqIGdhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cDogRGlzYWJsZSB0ZXN0cyBub3QgYXBwcm9wcmlhdGUgZm9yIFBBNjQuCi0JUmV2YW1wIGFkZHJlc3MgZXhwcmVzc2lvbnMgc2xpZ2h0bHkgdG8gaGFuZGxlIGFuIGFyYml0cmFyeSBzaXplZAotCWFkZHJlc3MuCi0KLQkqIGdhcy9ocHBhL3BhcnNlLyouczogVXNlIC5jb2RlIGluc3RlYWQgb2YgLlNQQUNFLy5TVUJTUEEgZm9yCi0Jc2VjdGlvbmluZy4KLQkqIGdhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cDogRGlzYWJsZSB0ZXN0cyBub3QgYXBwcm9wcmlhdGUgZm9yIFBBNjQuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljLyouczogVXNlIC5jb2RlIGluc3RlYWQgb2YgLlNQQUNFLy5TVUJTUEEgZm9yCi0Jc2VjdGlvbmluZy4KLQotMTk5OS0wOC0zMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9uYWtlZC5zLCBnYXMvaTM4Ni9uYWtlZC5kOiBUZXN0LXN1aXRlIGFkZGl0aW9uIGZvcgotCWFsbG93X25ha2VkX3JlZyBwYXJzaW5nLgotCSogZ2FzL2kzODYvaTM4Ni5leHA6IENhbGwgaXQuCi0KLTE5OTktMDgtMjkgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvd2hpdGUucywgZ2FzL2kzODYvd2hpdGUubDogQWRkIHNwYWNlIGluIEZQIHJlZyB0ZXN0cy4KLQotU2F0IEF1ZyAyOCAwMDoxNjoxMiAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiAgQWRkIG5ldyB0ZXN0cyBzaGlmdDIucywKLQlzaGlmdDMucywgZXh0cmFjdDIucywgZXh0cmFjdDMucywgZGVwb3NpdDIucywgYW5kIGRlcG9zaXQzLnMuCi0JKiBnYXMvaHBwYS9iYXNpYy9zaGlmdDIucywgc2hpZnQzLnMsIGV4dHJhY3QyLnMsCi0JZXh0cmFjdDMucywgZGVwb3NpdDIucywgZGVwb3NpdDMuczogIE5ldy4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYWRkLnMsYWRkaS5zLGRjb3IucyxzaGxhZGQucyxzdWIucyxzdWJpLnMsdW5pdC5zOgotCUFkZCBuZXcgc3ludGF4IHZlcnNpb25zIG9mIGluc3RydWN0aW9ucyB0byB0ZXN0cy4gCi0JKiBnYXMvaHBwYS9iYXNpYy9hZGQyLnMsZGNvcjIucyxwZXJmLnMscHVyZ2UyLnMsc2hsYWRkMi5zLHN1YjIucywKLQlzeXN0ZW0yLnMsIHVuaXQyLnM6ICBOZXcgdGVzdHMuCi0JKiBocHBhL2Jhc2ljL2Jhc2ljLmV4cDogQWRkIG5ldyB0ZXN0cy4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOgotCSogZ2FzL2hwcGEvYmFzaWMvbWVkaWEuczogIEFkZCB0ZXN0IGNhc2VzIGZvciBuZXcgaW5zdHJ1Y3Rpb25zLgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2JyYW5jaDIsZG9fbWVkaWEpOiBOZXcuCi0JKiBnYXMvaHBwYS9iYXNpYy9icmFuY2gyLnM6ICBOZXcuCi0JKiBnYXMvaHBwYS9iYXNpYy9tZWRpYS5zOiAgTmV3LgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2ZwX2NvbXAyKTogIE5ldy4KLQkqIGdhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAyLnM6ICBOZXcuCi0KLTE5OTktMDgtMjAgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvZ2VuZXJhbC5zLCBnYXMvaTM4Ni9nZW5lcmFsLmw6IEFkZCAuY29kZTE2Z2NjCi0JZGlzcGxhY2VtZW50IGNoZWNrcyB3aXRoIGF1dG8gYWRkcmVzcyBwcmVmaXguCi0KLTE5OTktMDgtMTcgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZ2FzL2VsZi9lbGYuZXhwOiBFeHBlY3RlZCB0byBmYWlsIG9uIGFscGhhKi0qLSouCi0KLTE5OTktMDgtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBnYXMvaTM4Ni9mbG9hdC5zLCBnYXMvaTM4Ni9mbG9hdC5sOiBNb2RpZnkgdG8gd29yayBjb3JyZWN0bHkKLQl3aGVuIGdhcyB1c2VzIDIqKjQgYWxpZ25tZW50IGZvciAudGV4dC4KLQkqIGdhcy9pMzg2L2dlbmVyYWwucywgZ2FzL2kzODYvZ2VuZXJhbC5sOiBMaWtld2lzZS4KLQkqIGdhcy9pMzg2L2thdG1haS5zLCBnYXMvaTM4Ni9rYXRtYWkuZDogTGlrZXdpc2UuCi0JKiBnYXMvaTM4Ni9tb2RybS5zLCBnYXMvaTM4Ni9tb2RybS5sOiBMaWtld2lzZS4KLQkqIGdhcy9pMzg2L3ByZWZpeC5zLCBnYXMvaTM4Ni9wcmVmaXguZDogTGlrZXdpc2UuCi0KLTE5OTktMDctMjcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvcmVsb2MuZDogRml4IHNvIHRoYXQgdGVzdCBwYXNzZXMgd2hlbiBlbmFibGUtdGFyZ2V0cwotCWluY2x1ZGVzIDY0LWJpdCBiZmQgdGFyZ2V0LgotCi0xOTk5LTA2LTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZ2FzL2kzODYva2F0bWFpLmQ6IFR3ZWFrIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBnYXMvZWxmL2VsZi5leHA6IERvbid0IHJ1biB0ZXN0cyBvbiAiKi0qLWxpbnV4KmFvdXQqIiBvcgotCSIqLSotbGludXgqb2xkbGQqIi4KLQkqIGdhcy92dGFibGUvdnRhYmxlLmV4cDogTGlrZXdpc2UuCi0JKiBnYXMvaTM4Ni9yZWxvYy5kOiBNb2RpZnkgZXhwZWN0ZWQgcmVsb2MgbmFtZXMgdG8gYWNjZXB0IGEub3V0Ci0JbmFtZXMuCi0KLQkqIGdhcy9pMzg2L2FtZC5zOiBBZGQgYSBzeW1ib2wgc28gYS5vdXQgdGVzdHMgd2lsbCB3b3JrLgotCSogZ2FzL2kzODYva2F0bWFpLnM6IExpa2V3aXNlLgotCSogZ2FzL2kzODYvYW1kLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCSogZ2FzL2kzODYva2F0bWFpLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0xOTk5LTA2LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZ2FzL21pcHMvc3luYy5kOiBQYXNzIC1taXBzMiB0byB0aGUgYXNzZW1ibGVyLgotCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFncy5zOiBUd2VhayBjb2RlIHNvIHRoYXQgdGhlIHRlc3RzIHBhc3MgZm9yCi0JbWlwcy1lbGYgdGFyZ2V0IGFzIHdlbGwgYXMgbWlwczY0LWVsZiB0YXJnZXQuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczEuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQ6IExpa2V3aXNlLgotCi0JKiBnYXMvZWxmL2VsZi5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgbWlwcyotKi0qLgotCi0JKiBnYXMvYWxsL2l0YmwtdGVzdC5jIChtYWluKTogVXBkYXRlIGl0YmxfZ2V0X3JlZ192YWwgY2FsbCBmb3IgbmV3Ci0JcGFyYW1ldGVyLgotCi0xOTk5LTA2LTEwICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGdhcy9zcGFyYy9zeW50aDY0LnM6IEFkZCBjaGVja3MgZm9yIHNpbmdsZSByZWdpc3RlciBzaWdueC9jbHJ1dy4KLQkqIGdhcy9zcGFyYy9zZXQ2NC5zOiBBZGQgdGVzdHMgZm9yIHNldHV3IGFuZCBzZXRzdyBzeW50aGV0aWMgaW5zbnMuCi0JKiBnYXMvc3BhcmMvcHJlZmV0Y2guZDogQWRkIC02NCBhcyBzd2l0Y2guCi0JKiBnYXMvc3BhcmMvcmRwci5kOiBEaXR0by4KLQkqIGdhcy9zcGFyYy93cnByLmQ6IERpdHRvLgotCSogZ2FzL3NwYXJjL3N5bnRoNjQuZDogRGl0dG8sIHJlZmxlY3Qgc3ludGg2NC5zIGNoYW5nZXMuCi0JKiBnYXMvc3BhcmMvcmVsb2M2NC5kOiBBZGQgLTY0IGFzIHN3aXRjaCwgYmUgbW9yZSB0b2xlcmFudCwgYXMKLQljdXJyZW50IGdhcyBvdXRwdXRzICVoaSgwKSBhbmQgbm90ICVoaSgweDApLgotCSogZ2FzL3NwYXJjL3NldDY0LmQ6IEFkZCAtNjQgYXMgc3dpdGNoLCByZWZsZWN0IHNldDY0LnMgY2hhbmdlcyBhbmQKLQlvcHRpbWl6YXRpb25zIGZvciBzZXR4IGluc3RydWN0aW9uLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogRG8gc3BhcmM2NCotKi0qIGNoZWNrcyBpZiBpdCBpcyBhbnkgb2YgdGhlCi0JY29tcGlsZWQtaW4gdGFyZ2V0cy4KLQotMTk5OS0wNi0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21hY3Jvcy9pcnAuczogVXNlIGBmb28nIGFuZCBgYmFyJyBpbnN0ZWFkIG9mIGByJyBhbmQgYHMnLgotCSogZ2FzL21hY3Jvcy9yZXB0LnMsIGdhcy9tYWNyb3MvdGVzdDIucywgZ2FzL21hY3Jvcy90ZXN0My5zOiBMaWtld2lzZS4KLQkqIGdhcy9tYWNyb3Mve2lycCxyZXB0LHRlc3QyLHRlc3QzfS5kOiBVcGRhdGUuCi0KLTE5OTktMDYtMDUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9lbGYvZWxmLmV4cDogTmV3IGRpcmVjdG9yeS4KLQkqIGdhcy9lbGYvc2VjdGlvbjAuW3NkXTogTmV3IHRlc3QuCi0JKiBnYXMvZWxmL3NlY3Rpb24xLltzZF06IE5ldyB0ZXN0LgotCi0xOTk5LTA2LTAzICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBnYXMvYXJtL2FybTd0LmQsIGdhcy9hcm0vaW5zdC5kOiBVcGRhdGUgdG8gbWF0Y2ggY3VycmVudCBnYXMsCi0gCWJmZCBhbmQgb3Bjb2Rlcy4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGdhcy92dGFibGUvdnRhYmxlLmV4cDogRG9uJ3QgcnVuIHRlc3QgZm9yIGk5NjAgeWV0LgotCi0xOTk5LTA1LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBvYmpkdW1wIG91dHB1dC4KLQotMTk5OS0wNS0xMiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9vcGNvZGUuZDogTW9kaWZ5IGNhbGx3IHRvIHN1aXQgZGlzYXNtIGZpeC4KLQotCSogZ2FzL2kzODYvYW1kLmQ6IE1vZGlmeSBhICcoYmFkKScgdG8gU0lNRCBpbnN0cnVjdGlvbi4KLQotCSogZ2FzL2kzODYvYW1kLnM6IFBhZCB0byBtdWx0aXBsZSBvZiA4Ci0JKiBnYXMvaTM4Ni9hbWQuZDogSGVyZSB0b28uCi0KLQkqIGdhcy9pMzg2L3ByZWZpeC5bc2RdOiBBbGlnbiB3aXRoIG5vcHMKLQkqIGdhcy9pMzg2L3JlbG9jLltzZF06IEhlcmUgdG9vLgotCi0JKiBnYXMvaTM4Ni9rYXRtYWkuW3NkXTogTmV3IGZvciBQSUlJIFNJTUQKLQkqIGdhcy9pMzg2L2kzODYuZXhwOiBDYWxsIGl0LgotCi0xOTk5LTA1LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5kOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlcgotCW9wZXJhdGlvbnMuIAotCi0xOTk5LTA0LTE2ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2kzODYvYW1kLnM6IEFkZCBOT1BzIHRvIGFsaWduIGZvciBjb2ZmIHRhcmdldHMKLQkqIGdhcy9pMzg2L2FtZC5kOiBhbmQgY2hlY2sgZm9yIHRoZW0uCi0KLVRodSBBcHIgMTUgMTU6MDM6NDMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2NvcHJtZW0pOiBObyBsb25nZXIgZXhwZWN0ZWQgdG8gZmlsZS4KLQotV2VkIEFwciAxNCAxMzo0MzowNiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2JyYW5jaC5zOiBEbyBub3QgdXNlIGltbWVkaWF0ZSB2YWx1ZSB3aGVyZSB3ZQotCXJlYWxseSB3YW50IGEgcmVnaXN0ZXIuCi0JKiBnYXMvaHBwYS9iYXNpYy9jb3BybWVtLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL2Jhc2ljL3Nwb3AuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9iYXNpYy9pbWVtLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9leHByYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvbGFiZWxidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3BsYWJlbGJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZS5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTIuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9sYXNiZWxkaWZmcy5zOiBMaWtld2lzZS4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwIChkb19pbWVtKTogSGFuZGxlIG11bHRpcGxlIGVuY29kaW5ncwotCWZvciBsb2FkcyBhbmQgc3RvcmVzIHVzaW5nIHJlZyArIHNtYWxsIGQgYWRkcmVzc2VzLgotCU5vIGxvbmdlciBleHBlY3QgZmFpbHVyZSBmb3IgbWlzLXBhcnNlIG9mIGltbSAlcmVnLgotCi0xOTk5LTA0LTEzICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL20zMnJ4LmQgKGNtcHVfX3JhY2gpOiBGaXggZXhwZWN0ZWQgb3V0cHV0LgotCSogZ2FzL20zMnIvbTMycngucyAoYmNfX2FkZCxhZGRfX2JjKTogRXhwbGljaXRseSBzcGVjaWZ5IHNob3J0IGJyYW5jaAotCXNvIGJyYW5jaCByZWxheGF0aW9uIHJlc3RyaWN0aW9ucyB3b24ndCBpbnRlcmZlcmUgd2l0aCBwYXJhbGxlbGl6YXRpb24KLQlhdHRlbXB0cy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21jb3JlOiBOZXcgRGlyZWN0b3J5LgotCSogZ2FzL21jb3JlL2FsbGluc24uZXhwOiBOZXcgRmlsZTogRXhwZWN0IGZpbGUgZm9yIE1Db3JlIGFzc2VtYmx5Ci0JdGVzdHMuCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5zOiBOZXcgRmlsZTogU291cmNlIGZpbGUgZm9yIE1Db3JlIGFzc2VtYmx5Ci0JdGVzdHMuCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5kOiBOZXcgRmlsZTogRXhwZWN0ZWQgb3V0cHV0IGZpbGUgZm9yIE1Db3JlCi0JYXNzZW1ibHkgdGVzdHMuCi0KLTE5OTktMDMtMjAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvbTMycnguW3NkXTogRml4IGEgZmV3IG1vcmUgdGVzdGNhc2VzLgotCi0xOTk5LTAzLTE2ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvZDMwLmV4cCAocnVuX2xpc3RfdGVzdCk6IEFkZCBuZXcgdGVzdHMsCi0gICAgICAgIGxhYmVsLCBndWFyZC1kZWJ1Zywgc2VyaWFsLCB3YXJuX29kZHJlZywgYml0dGVzdCwgYW5kIG11bC4KLQotCSogZ2FzL2QzMHYvb3B0LnM6IEZpeCBzb21lIHdhcm5pbmdzIGFuZCBhZGQgYSBmZXcgbGFiZWxzCi0gICAgICAgIHRvIGtlZXAgdGhpbmdzIGZyb20gcGFyYWxsZWxpemluZyB3aGVyZSB3ZSBkb24ndCB3YW50IHRoZW0gdG8uCi0KLQkqIGdhcy9kMzB2L3JlbG9jLnM6IEZpeCB3YXJuaW5nLgotICAgICAgICAKLQkqIGdhcy9kMzB2L29wdC5kLCByZWxvYy5kLCBpbnN0LmQ6IFJlYnVpbGQuCi0KLQkqIGdhcy9kMzB2L2xhYmVsLnM6IE5ldyB0ZXN0LiBDaGVjayB0aGF0IGxhYmVscyBhcmUgYWxpZ25lZCAKLSAgICAgICAgb24gOC1ieXRlIGJvdW5kYXJpZXMuCi0KLQkqIGdhcy9kMzB2L2d1YXJkLWRlYnVnLnM6IE5ldyB0ZXN0LiBUZXN0IG91dHB1dCB3aXRoICItZyIuCi0KLQkqIGdhcy9kMzB2L3NlcmlhbC5zOiBOZXcgdGVzdC4gQ2hlY2sgZm9yIHdhcm5pbmdzIHdpdGggCi0gICAgICAgIGlsbGVnYWwgc2VyaWFsIGluc3RydWN0aW9ucy4KLQotCSogZ2FzL2QzMHYvd2Fybl9vZGRyZWcuczogTmV3IHRlc3QuIENIZWNrIGZvciB3YXJuaW5ncyB3aGVuCi0gICAgICAgIG9kZC1udW1iZXJlZCByZWdpc3RlcnMgYXJlIHVzZWQgZm9yIHNvbWUgaW5zdHJ1Y3Rpb25zLgotCi0JKiBnYXMvZDMwdi9iaXR0ZXN0LnM6IE5ldyB0ZXN0LiBDaGVjayBmb3IgYml0IG9wZXJhdGlvbiAKLSAgICAgICAgaW5zdHJ1Y3Rpb25zIChCQ0xSLCBCTk9ULCBCU0VULCBCVFNUKSBpbiB0aGUgSVUuCi0KLQkqIGdhcy9kMzB2L211bC5zOiBOZXcgdGVzdC4gQ2hlY2sgZm9yIHJlc3RyaWN0ZWQgc2VxdWVuY2VzCi0gICAgICAgIGluIGEgYnVuY2ggb2YgZGlmZmVyZW50IG11bHRpcGx5IGluc3RydWN0aW9ucy4KLQkKLQkqIGdhcy92dGFibGUvdnRhYmxlLmV4cCAocnVuX2xpc3RfdGVzdCk6IERvbid0Ci0JcnVuIHRlc3Qgb24gRDMwVi4KLQotMTk5OS0wMy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBFeHBlY3Qgc3Ryb25nYXJtLWNvZmYgdGFyZ2V0IHRvIGZhaWwgY29mZnRhZwotCXRlc3QuIAotCi0xOTk5LTAyLTEzICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gdGhlIG5ldyB0ZXN0cywgYmVsb3cuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczEuZCwgZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQsCi0JZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQsIGdhcy9taXBzL2VsZl9lX2ZsYWdzNC5kOiBOZXcgZmlsZXMuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFncy5jLCBnYXMvbWlwcy9lbGZfZV9mbGFncy5zOiBOZXcgZmlsZXMuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBEb2N1bWVudC4gIEl0J3Mgbm90Ci0gCXJlYWxseSB0cml2aWFsLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogQ2xlYW4gdXAgbG9naWMgZm9yIGd1ZXNzaW5nCi0JJHByb2dyYW0gKHRoZSBkdW1wIHRvb2wpLgotCi0xOTk5LTAyLTEwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2FsbGluc24uZDogUHJlZml4IGFsbCB8IHdpdGggXC4KLQkocHVzaCxwb3ApOiBGaXggZXhwZWN0ZWQgb3V0cHV0LgotCSogZ2FzL20zMnIvcmVsYXgtMS5kOiBFbWl0dGVkIG5vcHMgYXJlIHNlcmlhbCwgbm90IHBhcmFsbGVsLgotCSogZ2FzL20zMnIvZnNsb3QuZDogUHJlZml4IGFsbCB8IHdpdGggXC4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3Z0YWJsZS9pbmhlcml0MC5zOiBEbyBub3QgdXNlICdAJyBwcmVmaXggdG8gLnR5cGUgb3BlcmF0b3IuCi0JU29tZSBwb3J0cyB1c2UgaXQgYXMgYSBjb21tZW50IGluaXRpYXRvci4KLQotCSogZ2FzL3Z0YWJsZS9lbnRyeTEuZDogRG8gbm90IGxvb2sgZm9yIGFuIGFkZGVuZC4gIFNvbWUgcG9ydHMgdXNlCi0JUkVMIHJlbG9jYXRpb25zIGFuZCBzbyBkbyBub3QgaGF2ZSBvbmUuCi0KLTE5OTgtMTItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogRml4IHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgc3ludGF4LgotCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBGaXggdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQKLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCi0xOTk4LTEyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IFJlcGxhY2UgaWxsZWdhbCBpbnNucyB3aXRoIGxlZ2FsIHZlcnNpb25zLgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQotVGh1IE5vdiAxOSAxNTo1OTo1MSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogUmVvcmRlciBpbnNucyBmb3IgYmV0dGVyIHNpbXVsYXRpb24uCi0KLVRodSBOb3YgMTkgMDc6NTA6NDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3N5bmMuW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBpdC4KLQotV2VkIE5vdiAxOCAxMToyNzo1NiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24ucyAoZG1vdik6IENvcnJlY3QgaGV4IGxpdGVyYWxzLgotCi1UdWUgTm92IDE3IDE1OjI0OjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogTW92ZWQgY3VycmVudGx5IHVuLWFzc2VtYmxpYWJsZSBpbnN0cnVjdGlvbnMKLQl0byBlbmQgb2YgZmlsZS4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBBZGRlZCBkaXNhc3NlbWJseSBvZiBjdXJyZW50bHkgYXNzZW1ibGlhYmxlCi0Jb3Bjb2Rlcy4KLQotTW9uIE5vdiAxNiAxNjo1MDoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IEZpeCBzeW50YXggZXJyb3JzLgotCi1Nb24gTm92IDE2IDE5OjI3OjUyIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBGaXhlZCBtb3JlIHR5cG9zLgotCi1GcmkgTm92IDEzIDEzOjE1OjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogRml4ZWQgdHlwb3MgYW5kIGFkZGVkIHNvbWUgdGVzdHMgb2YgdXBwZXIKLQljYXNlIHZzIGxvd2VyIGNhc2UuCi0KLVR1ZSBOb3YgMTAgMTQ6NTQ6NDcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBOZXcgZmlsZS4KLQkqIGdhcy9mcjMwL2FsbGluc24uZDogTmV3IGZpbGUuCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmV4cDogTmV3IGZpbGUuCi0JKiBnYXMvZnIzMC9mcjMwLmV4cDogTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDIgMjA6MTY6NTAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvZnNsb3QuW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvbTMyci5leHA6IFJ1biBpdC4KLQotVHVlIE9jdCAyMCAxMTozNTowNiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2L2kzODYuZXhwOiBSdW4gQU1EIGluc24gdGVzdC4KLQkqIGdhcy9pMzg2L2FtZC5zOiBOZXcgdGVzdC4KLQkqIGdhcy9pMzg2L2FtZC5kOiBOZXcgdGVzdCByZXN1bHRzLgotCi1TdW4gU2VwIDIwIDAxOjAwOjAxIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBnYXMvdnRhYmxlL2luaGVyaXQxLmw6IFJlcXVpcmUgb25seSB0aGUgd29yZCBHQVMgc29tZXdlcmUgaW4gdGhlCi0JZmlyc3QgbGluZSBvZiB0aGUgbGlzdGluZy4KLQotVHVlIFNlcCAgMSAxMDoyMDowMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvcHBjL2FzdGVzdC5kOiBBZGp1c3QgcmVnZXhwcyB0byBtYXRjaCBhIDY0LWJpdCBob3N0LgotCSogZ2FzL3BwYy9hc3Rlc3QyLmQ6IExpa2V3aXNlLgotCi1Nb24gQXVnIDMxIDEzOjI1OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy92dGFibGUve2VudHJ5MC5kLGVudHJ5MS5kLGluaGVyaXQwLmR9OiBGaXggcGF0dGVybiBtYXRjaGluZwotCW9mIHdoaXRlc3BhY2UgZm9yIDY0LWJpdCBob3N0cy4KLQotTW9uIEF1ZyAzMSAxMjo0NTo0OSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvdnRhYmxlL3Z0YWJsZS5leHA6IE5ldy4KLQkqIGdhcy92dGFibGUve2VudHJ5MC5zLGVudHJ5MC5kfTogTmV3LgotCSogZ2FzL3Z0YWJsZS97ZW50cnkxLnMsZW50cnkxLmR9OiBOZXcuCi0JKiBnYXMvdnRhYmxlL3tpbmhlcml0MC5zLGluaGVyaXQwLmR9OiBOZXcuCi0JKiBnYXMvdnRhYmxlL3tpbmhlcml0MS5zLGluaGVyaXQxLmx9OiBOZXcuCi0KLVRodSBBdWcgMjAgMjM6MTg6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvaTM4Ni93aGl0ZS5sOiBSZXZlcnQgcGF0Y2ggb2YgQXVndXN0IDEyLgotCi1XZWQgQXVnIDEyIDExOjU0OjM3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvdWRmLnM6IE5ldyB0ZXN0LgotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBSdW4gaXQuCi0KLVdlZCBBdWcgMTIgMTM6MjU6MzggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9nZW5lcmFsLmw6IFRlc3QgYW5kYiAkfjB4ODAsZm9vLgotCSogZ2FzL2kzODYvZ2VuZXJhbC5zOiBVcGRhdGUuCi0KLQkqIGdhcy9pMzg2L3doaXRlLmw6IEV4cGVjdCB3YXJuaW5nIGZvciBzdGFuZC1hbG9uZSBzcyBwcmVmaXguCi0KLVR1ZSBKdWwgMjEgMTI6NDY6NTkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni93aGl0ZS5zOiBBZGQgc29tZSBtb3JlIHdoaXRlc3BhY2UgdGVzdHMuCi0JKiBnYXMvaTM4Ni93aGl0ZS5sOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLU1vbiBKdWwgMTMgMTg6MTU6MTEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni8qOiBBbGwgbmV3IGkzODYgdGVzdHN1aXRlLgotCi0xOTk4LTA3LTAyICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZ2FzX2luaXQpOiBDb21wbGFpbiBpZiB0YXJnZXQgbmFtZSBpc24ndCBpbgotCWNhbm9uaWNhbCBmb3JtLgotCi1XZWQgSnVsICAxIDE1OjM1OjA5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogRXhwZWN0IEFSTSBhbmQgVGh1bWIgY29mZnRhZyB0ZXN0IHRvIGZhaWwuCi0KLVdlZCBKdWwgIDEgMTc6MzE6MzkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvcHBjL3NpbXBzaGZ0LnM6IEFkZCBhbGlnbm1lbnQgc28gdGhhdCBpdCB3b3JrcyBvbiBBSVguCi0JKiBnYXMvcHBjL3NpbXBzaGZ0LmQ6IENoYW5nZSBhY2NvcmRpbmdseS4gIE9ubHkgZHVtcCB0aGUgLnRleHQKLQlzZWN0aW9uLgotCi1UdWUgSnVuIDIzIDE1OjE0OjQzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy92ODUwL2hpbG8yLnM6IFVzZSByMSBhcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIG1vdmVhCi0JaW5zdHJ1Y3Rpb24sIHNpbmNlIHIwIGlzIHJlYWQgb25seS4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBGaXggbmFtZXMgb2Ygc3BlY2lhbCBhcmVhIHJlbG9jYXRpb25zLgotCVNldCAtbXdhcm4tc2lnbmVkLW92ZXJmbG93IGZsYWcgd2hlbiBydW5uaW5nIHJhbmdlLnMgdGVzdC4KLQotU3VuIEp1biAyMSAxMjo0NDo0MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9yZWxvYy5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCi1XZWQgSnVuIDE3IDE0OjAyOjEwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2RlbGF5LmQ6IEFkZCAtbWNwdT1OTk5OIHRvIGdhcyBmbGFncyB0byBsZXQgdGVzdCBjYXNlCi0gCXJ1biBvbiBkaWZmZXJlbnRseSB0YXJnZXRlZCBhc3NlbWJsZXIuCi0JKiBnYXMvbWlwcy97bGQtaWxvY2tzLWFkZHIzMixsZC1zdnI0cGljLmR9OiBEaXR0by4KLQkqIGdhcy9taXBzL3tsZC14Z290LmQsbGlmLXN2cjRwaWMuZCxsaWYteGdvdC5kfTogU2FtZS4KLQkqIGdhcy9taXBzL3ttaXBzMTYuZCxtaXBzNC5kLG5vZGVsYXkuZH06IEFnYWluLgotCSogZ2FzL21pcHMve3RydW5jLmQsdWxkLmQsdWxoLXhnb3QuZCx1c2QuZH06IEFuZCB0aGVuIHNvbWUuCi0JCi0JKiBnYXMvbWlwcy9sZC1pbG9ja3MuZDogUmVtb3ZlZCBkaXNhc3NlbWJsZXIgZmxhZ3MgdG8gbGV0IHRhcmdldAotIAlkZWZhdWx0cyBnbyB1bm1vZGlmaWVkLiAgUmVwbGFjZWQgJGY0LyRmNSB3aXRoICRmcFs0NV0sIGFzIHRoZQotCW9yaWdpbmFsIGBsZC5kJyBoYWQuICBGaW5kIGBsZC5zJy4KLQkqIGdhcy9taXBzL211bC1pbG9ja3MuZDogTmVhcmx5IGRpdHRvLgotCQotVGh1IEp1biAxMSAxNjo1MDo0NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9pbnN0LmQ6IEV4cGVjdCByZXBlYXRpIGluc3RydWNpdG9ucyB0byBiZSBjb21iaW5lZC4KLQotCSogZ2FzL2QzMHYvaW5zdC5zOiBBZGQgbm9wIHRvIGtlZXAgYXNzZW1ibGVkIGluc3RydWN0aW9ucyBhdAotCWV4cGVjdGVkIGFkZHJlc3Nlcy4KLQotTW9uIEp1biAgOCAxODo0NzoxMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9hcnJheS5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgcmVzdWx0cy4KLQkqIGdhcy9kMzB2L3JlbG9jLmQ6IFBhcnRpYWxseSB1cGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIKLQlyZXN1bHRzLiAKLQotRnJpIEp1biAgNSAxOToxNTo1OSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZ2FzL202OGsvb3BlcmFuZHMuczogRm9yIGFsbCBwYyByZWxhdGl2ZSBhZGRyZXNzZXMgY2hhbmdlIHRzdGwKLQl0byBwZWEgc2luY2UgdGhlIGZvcm1lciBkb2VzIG5vdCBhbGxvdyBwY3JlbCBvbiBtNjgwMDAuICBEbyBub3QKLQltYWtlIGxhYmVsIGZvbyBnbG9iYWwsIHNvIHRoYXQgcmVmZXJlbmNlcyB0byBpdCBjYW4gYmUgcmVsYXhlZCBvbgotCUVMRiB0YXJnZXRzLgotCSogZ2FzL202OGsvb3BlcmFuZHMuZCwgZ2FzL202OGsvb3A2ODAwMC5kOiBVcGRhdGVkLgotCi1UdWUgSnVuICAyIDE1OjA4OjM2IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGdhcy9wcGMvcHBjLmV4cDogUnVuIHNpbXBzaGZ0IHRlc3QuCi0JKiBnYXMvcHBjL3NpbXBzaGZ0LmQ6IE5ldyBmaWxlLgotCSogZ2FzL3BwYy9zaW1wc2hmdC5zOiBOZXcgZmlsZS4KLQotTW9uIEp1biAgMSAxNzowMDoyMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzL2Rpdi1pbG9ja3MuZDogSGFuZGxlIGJvdGggImJyZWFrIiBpbnN0cnVjdGlvbiB2YXJpYW50cy4KLQkqIGdhcy9taXBzL3tkaXYuZCwgbXVsLWlsb2Nrcy5kLCBtdWwuZH06IExpa2V3aXNlLgotCQotRnJpIE1heSAyOSAxMjowNzozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGp1c3QgaWxvY2tzIGluaXRpYWxpemF0aW9uIHRvIG1hdGNoIGN1cnJlbnQKLQlhc3NlbWJsZXIgZGVmYXVsdHMgbW9yZSBjbG9zZWx5LgotCi0JKiBnYXMvc2gvZnAuczogUmVtb3ZlIGZ0c3QvbmFuLiAgVGhlIGFzc2VtYmxlciBubyBsb25nZXIgc3VwcG9ydHMKLQl0aGUgaW5zdHJ1Y3Rpb24uCi0JKiBnYXMvc2gvYmFzaWMuZXhwOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVdlZCBNYXkgMjcgMTU6MjY6NTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvYWxpZ24uZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQkqIGdhcy9kMzB2L2luc3QuZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQkqIGdhcy9kMzB2L2luc3QuczogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIHJ1bGVzLgotCSogZ2FzL2QzMHYvb3B0LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0KLUZyaSBNYXkgMjIgMTU6NTY6NTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBIYW5kbGUgNjQgYml0IGJmZF92bWEuCi0JKiBnYXMvbTMyci91cHBlcmNhc2UuZDogTGlrZXdpc2UuCi0KLVRodSBNYXkgMjEgMTU6MDM6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS90aHVtYi5zOiBBZGQgcGVyaW9kIHRvIHN0YXJ0IG9mIGxhYmVscyB0byBwcmV2ZW50Ci0JYXNzZW1ibGVyIHRoaW5raW5nIHRoYXQgdGhleSBhcmUgZnVuY3Rpb24gZW50cnkgcG9pbnRzLgotCi1UdWUgTWF5IDE5IDE4OjE3OjEwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczE2LmQ6IENvcnJlY3QgdG8gcmVmbGVjdCBidWcgZml4IHRvIGRpc2Fzc2VtYmxlci4KLQotTW9uIE1heSAxOCAxMzoxMTo0NSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy97ZGl2LGxkLG11bH0uZDogQWRkIGFzc2VtYmxlciAtbWNwdT0gZmxhZyB0byBtYXRjaAotIAlkaXNhc3NlbWJsZXIuCi0JCi1GcmkgTWF5IDE1IDE0OjUxOjAxIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogRGlzdGluZ3Vpc2ggY2hhaW5zIHdpdGggMzItYml0IGFkZHJlc3Nlcy4KLQkqIGdhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZCA6IE5ldy4KLQotV2VkIE1heSAxMyAxNTowNjozMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci91cHBlcmNhc2UuW3NkXTogVGVzdCBmb3IgSElHSCxTSElHSCxMT1csU0RBLgotCi1UaHUgTWF5ICA3IDEzOjA1OjI1IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2JyZWFrMjAuW3NkXTogTmV3IHRlc3RzIGZvciAyMC1iaXQgb3BlcmFuZCBicmVhayBhbmQKLSAJc2RkYnAgaW5zdHJ1Y3Rpb25zLiAKLQkqIGdhcy9taXBzL3RyYXAyMC5bc2RdOiBOZXcgdGVzdHMgZm9yIDIwLWJpdCBvcGVyYW5kIHRyYXAKLSAJaW5zdHJ1Y3Rpb25zLiAKLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gdGhlbS4KLQotVGh1IEFwciAzMCAxMTo1NTowMSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi97aW5zdCxhcnJheSxvcHQscmVsb2N9LmQ6IEFjY2VwdCA8c3ltYm9sK29mZnNldD4gbGFiZWxzCi0gCWluIGRpc2Fzc2VtYmx5LCB3aGVyZSB0aGUgb2Zmc2V0IGlzIGluIGhleCBhbmQgaGFzIGEgIjB4IiBwcmVmaXguCi0JCi1UdWUgQXByIDI4IDE2OjM4OjM0IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xpbmVuby5bc2RdOiBBc3NlbWJseSBzb3VyY2UgbGluZSBudW1iZXIgdGVzdC4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGRlZCBsaW5lbm8gdGVzdC4KLQotV2VkIEFwciAgOCAxODo0NToxNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy90ZXN0c3VpdGUvYWxsL2dhcy5leHA6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMgZm9yCi0JZGlmZmVyZW5jZSBvZiB1bmRlZmluZWQgc3ltYm9scyBvbiBtbjEweDAwIHRhcmdldHMuCi0KLU1vbiBNYXIgMjMgMTA6NDc6MzMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9hbGlnbi5zOiBCYWNrIG91dCAiLnNlY3Rpb24gdGV4dCIgY2hhbmdlIGJlbG93OwotCXVzZSAiLnRleHQiIGFnYWluLgotCSogZ2FzL21hY3Jvcy9zZW1pLnM6IERpdHRvLgotCQotRnJpIE1hciAyMCAxODo1MTo0OSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2FsaWduLnM6IElkZW50aWZ5ICIudGV4dCIgc2VjdGlvbiBleHBsaWNpdGx5LgotCSogZ2FzL21hY3Jvcy9zZW1pLnM6IERpdHRvLgotCQotCQotCQotTW9uIE1hciAgMiAxMzozMDo0MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5bc2RdIChsZGk4YSxsZGkxNmEpOiBEZWxldGUuCi0JKGxkaTE2KTogSW1wcm92ZSB0ZXN0LgotCShub3ApOiBGaXggdGVzdC4KLQotVGh1IEZlYiAxMiAyMDoxMjozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AvbWFjcm8ub3V0OiBBZGp1c3QgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGtleXdvcmQKLQlhcmd1bWVudHMgYXJlIG5vdyBwZXJtaXR0ZWQgYWZ0ZXIgcG9zaXRpb25hbCBhcmd1bWVudHMuCi0KLVdlZCBGZWIgIDQgMTU6Mjc6NDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9hcm03dC5kOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0KLVdlZCBGZWIgIDQgMTU6NDA6MDAgMTk5OCAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZ2FzL3BwYy9wcGMuZXhwOiBOZXcgZmlsZS4KLQkqIGdhcy9wcGMvYXN0ZXN0LnMsIGdhcy9wcGMvYXN0ZXN0LmQ6IE5ldyB0ZXN0LgotCSogZ2FzL3BwYy9hc3Rlc3QyLnMsIGdhcy9wcGMvYXN0ZXN0Mi5kOiBOZXcgdGVzdC4KLQotU3VuIEZlYiAgMSAyMTo0Mzo1NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzLzQwMTAuczogUGFkIHRlc3QgY29kZSBvdXQgdG8gYSAxNmJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbWlwcy80MDEwLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGdhcy9taXBzLzQxMDAuczogUGFkIHRlc3QgY29kZSBvdXQgdG8gYSAxNmJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbWlwcy80MTAwLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGdhcy9taXBzLzQ2NTAuczogUGFkIHRlc3QgY29kZSBvdXQgdG8gYSAxNmJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbWlwcy80NjUwLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotRnJpIEphbiAzMCAxNDowOToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvbW92ZW1sLmQ6IEFkZCB0ZXN0IGNvbW1lbnRzLCBmaXggcmVnZXhwcy4KLQotVGh1IEphbiAyOSAxMzozNDo0OSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci97YWxsaW5zbixoaWdoLTF9LmQ6IEFsbG93ICMgY29uc3RhbnQgcHJlZml4IHRvIGJlIG1pc3NpbmcuCi0KLVRodSBKYW4gMjkgMDk6NDM6NTAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvbXJpX21vdmVtbC5bc2RdOiBNb3ZlZCB0byAuLi4KLQkqIGdhcy9tcmkvbW92ZW1sLltzZF06IC4uLiBoZXJlLgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCi0KLVR1ZSBKYW4gMjcgMjE6NTU6NDQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy80MDEwLnM6IEFkZCA0MDEwIHRlc3RzLgotCSogZ2FzL21pcHMvNDAxMC5kOiBFeHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbWlwcy80MTAwLnM6IEFkZCA0MDEwIHRlc3RzLgotCSogZ2FzL21pcHMvNDEwMC5kOiBFeHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbWlwcy80NjUwLnM6IEFkZCA0MDEwIHRlc3RzLgotCSogZ2FzL21pcHMvNDY1MC5kOiBFeHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIHRoZSBuZXcgdGVzdHMuCi0JKiBnYXMvbWlwcy8qLmQ6IFBhc3MgdGhlIHJpZ2h0IHByb2Nlc3NvciBtb2RlbCB0byBvYmpkdW1wLgotCUZpeCBtaW5vciBjYXNlcyB3aGVyZSBleHBlY3RlZCBvdXRwdXQgd2FzIHdyb25nIGR1ZSB0byBvcGNvZGUKLQljb25mbGljdHMuCi0KLVR1ZSBKYW4gMjcgMDU6MzU6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvbXJpX21vdmVtbC5bc2RdOiBOZXcgdGVzdGNhc2UuCi0KLVRodSBKYW4gMjIgMTc6Mjk6MDcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvaGlnaC0xLmQ6IEFkZCBoYXNoIHByZWZpeCB0byBjb25zdGFudHMuCi0KLQkqIGdhcy9tMzJyL2FsbGluc24uczogQWRkIGhhc2ggcHJlZml4IHRvIHNvbWUgY29uc3RhbnRzLgotCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBBZGQgaGFzaCBwcmVmaXggdG8gY29uc3RhbnRzLgotCi1XZWQgSmFuIDIxIDIxOjI0OjA4IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogZ2FzL204OGsvaW5pdC5kOiBGaXggaGV4YWRlY2ltYWwgb2Zmc2V0cy4KLQotV2VkIEphbiAxNCAxNzo0OToyMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci91cHBlcmNhc2UuZDogRml4IHdoaXRlIHNwYWNlIG1hdGNoaW5nLgotCSogZ2FzL20zMnIvcmVsYXgtMS5kOiBGaXggd2hpdGUgc3BhY2UgbWF0Y2hpbmcuCi0KLVdlZCBKYW4gMTQgMTU6NDQ6MzIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy9kaXYuZDogVXBkYXRlIGZvciByZWNlbnQgYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvbWlwcy9kaXYtaWxvY2tzLmQ6IExpa2V3aXNlLgotCi1XZWQgSmFuIDE0IDExOjEzOjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLmQgKGNtcHVpKTogVXBkYXRlIG91dHB1dCB0byBuZXcgZm9ybWF0LgotCi1UaHUgRGVjIDE4IDExOjEwOjQyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vaW5zdC5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotCSogZ2FzL2FybS9hcm03dC5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotVHVlIERlYyAxNiAyMjoxOToyNSAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGIteGdvdC5kLCBnYXMvbWlwcy9yb2wuZCwgZ2FzL21pcHMvamFsLXN2cjRwaWMuZCwKLQlnYXMvbWlwcy9qYWwteGdvdC5kOiBBZGQgYXNzZW1ibGVyIG9wdGlvbiB0byBzZWxlY3QgYSBzcGVjaWZpYwotCXRhcmdldCBjaGlwLCB0aGUgUjMwMDAuCi0JKiBnYXMvbWlwcy9sYi14Z290LWlsb2Nrcy5kOiBOZXcgdGVzdCwgc3BlY2lmaWNhbGx5IHNlbGVjdGluZwotCVIzOTAwLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwOiBEb24ndCBydW4gSUVFRSBGUCB0ZXN0cyBmb3IgVmF4Ci0JdGFyZ2V0cy4KLQotV2VkIE9jdCAxNSAxMDo0MDoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9pZWVlLWZwL3g5MzA1MDlhLnM6IFR3ZWFrIHNsaWdodGx5IHRvIHdvcmsgb24gdGhlIFBBLgotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFVwZGF0ZSBmb3IgcmVjZW50IGRpc2Fzc2VtYmxlcgotCWNoYW5nZXMuCi0KLVRodSBPY3QgIDkgMTg6MTA6NDQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3NldDY0LltzZF06IGBzZXQnIGRvZXNuJ3QgdGFrZSBuZWdhdGl2ZSBhcmd1bWVudHMuCi0KLVRodSBPY3QgIDkgMTI6NTk6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2FybTd0LmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL2g4MzAwL2ZmeHgxLmQ6IExpa2V3aXNlLgotCi1XZWQgT2N0ICA4IDE2OjIyOjUwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9yZWxvYzY0LltzZF06IEFkZCB0ZXN0Y2FzZXMgZm9yICVoaXgsJWxveC4KLQotV2VkIE9jdCAgOCAxNToxMjozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zeW50aC5kOiBVcGRhdGUgZm9yIHJlY2VudCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9zcGFyYy9zeW50aDY0LmQ6IExpa2V3aXNlLgotCi0JKiBnYXMvbWlwcy9iZXEuczogQWRkIC50ZXh0IHRvIC5nbG9ibCB0byBtYXJrIHRoZSBzeW1ib2wgdG8gYXMgYQotCWZ1bmN0aW9uIHN5bWJvbC4KLQkqIGdhcy9taXBzL2phbC5zOiBMaWtld2lzZS4KLQotVHVlIE9jdCAgNyAxMzozMDozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvcmVsb2M2NC5bc2RdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gaXQuCi0KLVNhdCBPY3QgIDQgMTk6MTQ6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvaWVlZS1mcC94OTMwNTA5YS5leHA6IEFjY2VwdCBtNjhrIGxpc3RpbmcgZm9ybWF0LgotCi1GcmkgT2N0ICAzIDE1OjQ2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwOiBSZW1vdmUgc2V0dXBfeGZhaWw7IGl0IHNob3VsZCBub3cKLQl3b3JrLiAgQ29ycmVjdCBmb3IgYmlnIGVuZGlhbiBhbmQgZm9yIHRhYnMgaW4gaW5wdXQgZmlsZS4KLQotCSogZ2FzL2FscGhhL2ZwLmV4cDogQ2hlY2sgZm9yIGFscGhhLSotb3NmKiwgbm90IGFscGhhLSotb3NmMSouCi0JKiBnYXMvYWxwaGEvZnAuczogQ2hhbmdlIGNvbW1lbnQgY2hhcmFjdGVycyBmcm9tICEgdG8gIy4KLQotVGh1IFNlcCAxOCAxMToxNzo1MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3BsZXQuZDogVXBkYXRlIHRvIG5ldyBvYmpkdW1wIG91dHB1dCBmb3JtYXQuCi0JKiBnYXMvc3BhcmMve2FzaS5kLG1lbWJhci5kLHByZWZldGNoLmQscmRwci5kLHdycHIuZH06IExpa2V3aXNlLgotCSogZ2FzL3NwYXJjL3NldDY0Lltkc106IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9zcGFyYy9zcGxldC0yLltkc106IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IFJ1biB0aGVtLgotCi1UdWUgU2VwIDE2IDE1OjI3OjA4IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBnYXMvZDMwdi9pbnN0LnM6IEFkZCBzb21lIG5ldyB0ZXN0cy4gCi0KLSAJKiBnYXMvZDMwdi97aW5zdCwgb3B0LCByZWxvY30uZDogVXBkYXRlIHJlc3VsdHMgd2l0aAotIAluZXcgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLQkqIGdhcy9kMzB2L2luc3QuW3NkXTogVXBkYXRlIGV4YW1wbGVzIGZvciBkKmkgaW5zdHJ1Y3Rpb25zLiAKLQotCSogZ2FzL2QzMHYvKi5kOiBVcGRhdGUgYWxsIHRlc3QgcmVzdWx0cyBiZWNhdXNlCi0gCW9mIG5ldyAiLnMiIGFuZCAiLmwiIGV4dGVuc2lvbnMuCi0KLQkqIGdhcy9kMzB2L2luc3QuW3NkXTogQ29ycmVjdCBlbnRyeSBmb3IgbXVseDJoLgotCSogZ2FzL2QzMHYvb3B0LltzZF06IENvcnJlY3Qgc3QydyBpbnN0cnVjdGlvbi4gCi0KLQkqIGdhcy9kMzB2L2FsaWduLmQ6IENoYW5nZSBleHBlY3RlZCBvdXRwdXQuCi0KLQkqIGdhcy9kMzB2L3JlbG9jLltzZF06IEFkZCB0ZXN0IGNhc2UuIAotCi0JKiBnYXMvZDMwdi9hcnJheS5bc2RdOiBOZXcgdGVzdCBjYXNlLgotCi0JKiBnYXMvZDMwdi9vcHQuW3NkXTogQWRkZWQgbW9yZSB0ZXN0IGNhc2VzLiAKLQotCSogZ2FzL2QzMHYvb3B0LnM6IEFkZCB0ZXN0IGNhc2VzLgotCSogZ2FzL2QzMHYvcmVsb2MuczogRml4IGEgdGVzdCBjYXNlLgkKLQkqIGdhcy9kMzB2L3tvcHQscmVsb2N9LmQ6IFJlZ2VuZXJhdGUuCi0KLU1vbiBTZXAgIDggMTQ6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvaGlnaC0xLltkc106IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL20zMnIuZXhwOiBSdW4gaXQuCi0KLU1vbiBBdWcgMjUgMTE6MDQ6MjQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvcmVsYXgtMS5bZHNdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvbTMyci9tMzJyLmV4cDogUnVuIGl0LgotCi1UaHUgQXVnIDE0IDIzOjQ5OjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcmM6IE5ldyBkaXJlY3RvcnkKLQkqIGdhcy9hcmMve2FyYy5leHAsYWxpYXMuW3NkXSxicmFuY2guW3NkXSxmbGFnLltzZF0saW5zbjMuW3NkXSxqLltzZF0sCi0JbGQuW3NkXSxtYXRoLltzZF0sc3NoaWZ0LltzZF0sc3QuW3NkXSx3YXJuLntleHAsc319OiBOZXcgZmlsZXMuCi0KLVdlZCBBdWcgIDYgMDA6MzM6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCBBUyBhbmQgR0FTUCB0byBhcy1uZXcsIG5vdCBhcy5uZXcuCi0KLVR1ZSBBdWcgIDUgMTI6MzM6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCBOTSB0byBubS1uZXcsIG5vdCBubS5uZXcsIHRvIG1hdGNoCi0JcmVjZW50IGNoYW5nZSBpbiBiaW51dGlscyBidWlsZCBkaXJlY3RvcnkuCi0KLVRodSBKdWwgMzEgMTU6MjE6NTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9yYW5nZS5zOiBOZXcgdGVzdC4KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cDogUnVuIGl0LgotCi1UdWUgSnVsIDI5IDE0OjM1OjAyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Y4NTAvaGlsbzIuczogTmV3IHRlc3QuCi0JKiBnYXMvdjg1MC9mZXBzdy5zOiBOZXcgdGVzdC4KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLVR1ZSBKdWwgMTUgMTM6MDM6MTcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvdXBwZXJjYXNlLltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL20zMnIuZXhwOiBOZXcgZmlsZS4KLQotTW9uIEp1biAxNiAxNDozMjoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL3BjcmVsLmQ6IFVwZGF0ZSBmb3IgbTY4ayBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9tNjhrL29wZXJhbmRzLmQ6IExpa2V3aXNlLgotCi1Nb24gSnVuICAyIDE2OjUwOjAzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vYXJtLmV4cDogQWRkZWQgY2hhbmdlcyBmcm9tIGFybVQtOTcwMzI4LWJyYW5jaC4KLQotTW9uIEp1biAgMiAxMjowOTowMiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IFRoZSByMzkwMCBoYXMgaW50ZXJsb2NrcyBmb3IgbXVsLCBidXQKLQlub3QgZGl2LgotCi1Nb24gSnVuICAyIDEyOjAzOjMyIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkAuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbXVsLntkLHN9OiBFbmQgdGhlIHRlc3RzIHdpdGggbm8tb3BzLiAKLQotTW9uIEp1biAgMiAxMTo0ODo1OCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocmVnZXhwX2RpZmYpOiBJbXByb3ZlIG1lc3NhZ2VzIHdoZW4gb25lCi0JZmlsZSBpcyBzaG9ydGVyIHRoYW4gdGhlIG90aGVyLgotCi1XZWQgTWF5ICA3IDE2OjE4OjMwIDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogZ2FzL204OGsvaW5pdC57cyxkfTogTmV3IGNoZWNrcyBmb3IgcHJvcGVyIHBhZGRpbmcgb2YKLQkuaW5pdCBzZWN0aW9ucy4KLQkqIGdhcy9tODhrL204OC5leHA6IFJ1biB0aGVtLgotCi0JKiBnYXMvbTY4ay90Mi5kOiBOZXcgZmlsZSBmb3IgY2hlY2sgb2YgcHJlc2VuY2Ugb2Ygc2VjdGlvbgotCXN5bWJvbHMgb24gdGhlIG02OGstbW90b3JvbGEtc3lzdi4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biB0MiBpZiBbaXN0YXJnZXQgbTY4Ki1tb3Rvcm9sYS1zeXN2XS4KLQotV2VkIE1heSAgNyAxNjoxMjoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogRG9uJ3QgcnVuIGNvZmZ0YWcgdGVzdCBmb3IgbTg4ay1jb2ZmLgotCi0JKiBnYXMvbWlwcy9saWZsb2F0LnM6IFVwZGF0ZSBmb3IgcmVjZW50IGNoYW5nZXMgdG8gZmxvYXRpbmcgcG9pbnQKLQloYW5kbGluZy4KLQkqIGdhcy9taXBzL2xpZi1lbXBpYy5kLCBnYXMvbWlwcy9saWYtc3ZyNHBpYy5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL2xpZi14Z290LmQsIGdhcy9taXBzL2xpZmxvYXQuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBIYW5kbGUgSXJpeCA2IGxpa2UgSXJpeCA1LgotCi1TYXQgQXByIDE5IDIzOjE2OjM1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAcGV0cmEuYXBwbGkuc2U+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBIYW5kbGUgT3BlbkJTRCBsaWtlIE5ldEJTRC4KLQotV2VkIEFwciAxNiAxMjoyMDoyNCAxOTk3ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvZDMwLmV4cDogQWRkIG9wdGltaXplciB0ZXN0IGNhc2UuCi0JKiBnYXMvZDMwdi9vcHQuczogQWRkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRlc3RzLgotCSogZ2FzL2QzMHYvb3B0LmQ6IFJlYnVpbGQuCi0KLVR1ZSBBcHIgMTUgMTg6MTA6MDEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3tkZWxheS5kLG5vZGVsYXkuZH06IGFkZGVkLgotCi1Nb24gQXByICA3IDEyOjU3OjQ1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2FsbGluc24uZDogVXBkYXRlIHRvIG5ldyBvYmpkdW1wIG91dHB1dCBzdHlsZS4KLQotRnJpIEFwciAgNCAxMzoxOTozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZmxvYXQuczogUHV0IGEgdGFiIGJlZm9yZSAudGV4dCwgdG8ga2VlcCB0aGUgUEEgaGFwcHkuCi0KLQkqIGdhcy9hcm0vYXJtLmV4cDogT25seSBydW4gaW5zdCBhbmQgYXJtN3Qgb24gdGFyZ2V0cyB3aGljaCBjYW4KLQloYW5kbGUgLUVMLiAgQWRkIHNldHVwX3hmYWlsIGZvciB0aHVtYi4KLQotCSogZ2FzL2g4MzAwL2ZmeHgxLmQ6IERvbid0IGZhaWwgaWYgQkZEIGlzIDY0IGJpdHMuCi0KLVRodSBBcHIgIDMgMTg6MjY6NTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi57ZXhwLHMuZH06IE5ldyB0ZXN0Y2FzZXMuCi0KLVRodSBNYXIgMjcgMDA6NDI6MjggMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L2QzMC5leHA6IEFkZCB0ZXN0IGNhc2UgcmVsb2MuCi0JKiBnYXMvZDMwdi9yZWxvYy5bc2RdOiBOZXcgZmlsZXMgdG8gdGVzdCByZWxvY2F0aW9ucy4KLQotU2F0IE1hciAxNSAxNzoyMTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vaW5zdC5kOiBVcGRhdGUgZm9yIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL2FybS9hcm03dC5kOiBMaWtld2lzZS4KLQotVHVlIE1hciAxMSAxMzozMTo1NiAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZ2FzL202OGsvb3A2ODAwMC5kOiBVcGRhdGUgZm9yIHJlY2VudCBhc3NlbWJsZXIgYnVnIGZpeC4KLQotV2VkIE1hciAgNSAxMzowMToyNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogeGZhaWwgYSBjb3VwbGUgdGVzdHMgZm9yIHRoZSBtbjEwMzAwLgotCi1Nb24gTWFyICAzIDExOjQxOjAwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2FkZC5kLCBmbG9hdC5kLCByZWdvcHMyLmQsIHJlbG9jczEuZCwgcmVsb2NzMWIuZCwKLQlyZWxvY3MyLmQsIHJlbG9jczJiLmR9OiBBZGp1c3QgdG8gb2JqZHVtcCBmb3JtYXQgdHdlYWtzLgotCi1UaHUgRmViIDI3IDE1OjIxOjQ2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2FsaWduLmQsIGFsaWduLmxzdCwgYWxpZ24uc30gTmV3IHRlc3QgZm9yIHRoZQotCSIuYWxpZ24iIHBzZXVkb3AuCi0JKiBnYXMvdGljODAvdGljODAuZXhwOiBSdW4gdGhlIGFsaWduIHRlc3QuCi0JCi1XZWQgRmViIDI2IDIwOjM2OjQ2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2Zsb2F0LmQsIGZsb2F0LmxzdCwgZmxvYXQuc306IE5ldyB0ZXN0cyBmb3IKLQlzaW1wbGUgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZHMuCi0JKiBnYXMvdGljODAvdGljODAuZXhwOiBSdW4gdGhlIGZsb2F0IHRlc3QuCi0KLVdlZCBGZWIgMjYgMTU6MTY6MDQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97cmVnb3BzMi5kLCByZWdvcHMyLmxzdCwgcmVnb3BzMi5zLCByZWdvcHMzLmQsCi0gCXJlZ29wczMubHN0LCByZWdvcHMzLnMsIHJlZ29wczQuZCwgcmVnb3BzNC5sc3QsIHJlZ29wczQuc306Ci0JTmV3IHRlc3RzIGZvciA6bSBhbmQgOnMgb3BlcmFuZCBtb2RpZmllcnMuCi0JKiBnYXMvdGljODAvdGljODAuZXhwOiBSdW4gdGhlIHJlZ29wczIsIHJlZ29wczMsIGFuZCByZWdvcHM0IHRlc3RzLgotCi1UdWUgRmViIDI1IDEzOjQ1OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21hY3Jvcy9zZW1pLnM6IEZvcmNlIHRoZSBmaW5hbCBhbGlnbm1lbnQgdG8gdXNlIGEgZmlsbCB2YWx1ZQotCW9mIDAuCi0KLQkqIGdhcy9hbGwvY29uZC5zLCBnYXMvYWxsL2NvbmQuZDogTmV3IHRlc3QuCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBpdC4KLQotTW9uIEZlYiAyNCAxMDo1MjoxMiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cChnYXNfaW5pdCk6IEFkZGVkIG5ldyBwYXJhbWV0ZXIgZm9yIHNjcmlwdAotCW5hbWUuCi0KLU1vbiBGZWIgMjQgMTA6NDA6MjggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97YWRkLmQsIGJpdG51bS5kLCBjY29kZS5kLCBjcmVnb3BzLmQsIGVuZG1hc2suZCwKLQlyZWdvcHMuZCwgcmVsb2NzMS5kLCAKLQkocmVsb2NzMS5jKTogQWRkIGZpbGUgZm9yIHJlZmVyZW5jZS4KLQkocmVsb2NzMWIuZCk6IFNwbGl0IHJlbG9jIHRhYmxlIGNvbnRlbnRzIHRlc3QgdG8gZGlmZmVyZW50IHRlc3QgZmlsZS4KLQkocmVsb2NzMi5jKTogQWRkIHRlc3QgdGhhdCB1c2VzIHZhcmlvdXMgdHlwZXMgKGNoYXIsIHNob3J0LCBpbnQsIC4uLikgb2YKLQlzdGF0aWMgYW5kIGdsb2JhbCB2YXJpYWJsZXMgd2l0aCBkYXRhIHNodWZmbGluZyB0byBnZW5lcmF0ZSBsb3RzIG9mIGxkL3N0Ci0JaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzLgotCShyZWxvY3MyLmQpOiBOZXcgZmlsZSwgZXhwZWN0ZWQgY29kZSBmb3IgcmVsb2NzMiB0ZXN0LgotCShyZWxvY3MyLmxzdCk6IE5ldyBmaWxlLCBUSSBhc3NlbWJsZXIgbGlzdGluZyBmb3IgcmVmZXJlbmNlLgotCShyZWxvY3MyLnMpOiBOZXcgZmlsZSwgYXNzZW1ibHkgc291cmNlIGZvciByZWxvY3MyIHRlc3QuCi0JKHJlbG9jczJiLmQpOiBOZXcgZmlsZSwgZXhwZWN0ZWQgcmVsb2MgdGFibGUgY29udGVudHMgZm9yIHJlbG9jczIgdGVzdC4KLQkodGljODAuZXhwKTogUnVuIHRoZSByZWxvY3MxYiwgcmVsb2NzMiwgYW5kIHJlbG9jczJiIHRlc3RzLgotCi1TdW4gRmViIDIzIDE3OjU0OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9pdGJsLXRlc3QuYyhtYWluKTogVXBkYXRlIGZ1bmN0aW9uIGNhbGxzLgotCVJlbW92ZSBwYXJhbWV0ZXJzIGZyb20gaXRibF9nZXRfcmVnX3ZhbCBhbmQKLQljaGFuZ2UgaXRibF9nZXRfaW5zbl9uYW1lIHRvIGl0YmxfZ2V0X2ZpZWxkLgotCi1TdW4gRmViIDIzIDE3OjIyOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvaXRibDogQWRkIGNvbW1lbnRzLgotCSogZ2FzL21pcHMvaXRibC5zOiBBZGQgY29tbWVudHMuICBQcmVmaXggcmVnaXN0ZXIgbmFtZXMgd2l0aCAkLgotCSogZ2FzL2FsbC9pdGJsOiBHZW5lcmljIHRhYmxlIGZvciB0ZXN0aW5nIGZvciBpdGJsIHN1cHBvcnQuCi0JKiBnYXMvYWxsL2l0YmwuczogR2VuZXJpYyBhc3NlbWJseSBmb3IgdGVzdGluZyBmb3IgaXRibCBzdXBwb3J0LgotCSogZ2FzL21pcHMvaXRibC10ZXN0LmM6IE1vdmVkIHRvIGdhcy9hbGwuCi0JKiBnYXMvYWxsL2l0YmwtdGVzdC5jOiBNb3ZlZCBmcm9tIGdhcy9taXBzLgotCi1TYXQgRmViIDIyIDIwOjI0OjIzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2FkZC5sc3QsIGJpdG51bS5sc3QsIGNjb2RlLmxzdCwgY3JlZ29wcy5sc3QsCi0gCWVuZG1hc2subHN0LCByZWdvcHMubHN0fTogUmVtb3ZlIF5NJ3MgZnJvbSBlbmQgb2YgbGluZXMuCi0JKiBnYXMvdGljODAvYml0bnVtLnM6IEFkZCBjb21tZW50IHRvIGVhY2ggbGluZSBzaG93aW5nIHZhbHVlCi0JdGhhdCBzeW1ib2xpYyBCSVROVU0gYXNzZW1ibGVzIHRvLiAgQWRkIGNvdmVyYWdlIGZvciByYXcKLQludW1lcmljIHZhbHVlcyBmb3IgdGhlIEJJVE5VTSBvcGVyYW5kLgotCSogZ2FzL3RpYzgwL2JpdG51bS5kOiBVcGRhdGUgZHVlIHRvIGJpdG51bS5zIGNoYW5nZXMuCi0JKiBnYXMvdGljODAvcmVnb3BzLmQ6IFVwZGF0ZSBkdWUgdG8gb3Bjb2RlIGxpYnJhcnkgYWRkaXRpb25zCi0Jb2YgZmxvYXRpbmcgcG9pbnQgdGVzdCBCSVROVU0gdmFsdWVzIHRoYXQgYXJlIGFtYmlndW91cyB3aXRoCi0JdGhlIGludGVncmFsIG9uZXMuCi0JKiBnYXMvdGljODAvcmVsb2NzMS5zOiBOZXcgdGVzdCBjYXNlIHRoYXQgdGVzdHMgc2ltcGxlIHJlbG9jcy4KLQkqIGdhcy90aWM4MC9yZWxvY3MxLmQ6IEV4cGVjdGVkIG91dHB1dCBmb3IgYWJvdmUuCi0JKiBnYXMvdGljODAvcmVsb2NzMS5sc3Q6IFRJIGFzc2VtYmxlciBsaXN0aW5nIGZvciBhYm92ZS4KLQkqIGdhcy90aWM4MC90aWM4MC5leHA6IEFkZCByZWxvY3MxIHRlc3QuCi0KLUZyaSBGZWIgMjEgMTQ6MjM6MTQgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L3thbGlnbi5kLCBhbGlnbi5zLCBkMzAuZXhwLCBndWFyZC5kLCBndWFyZC5zLAotCWluc3QuZCwgaW5zdC5zLCBvcHQuZCwgb3B0LnN9OiBUZXN0IGZpbGVzIGZvciBEMzBWLgotCi1XZWQgRmViIDE5IDAwOjU1OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21hY3Jvcy9zZW1pLnMsIGdhcy9tYWNyb3Mvc2VtaS5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tYWNyb3MvbWFjcm9zLmV4cDogUnVuIGl0LgotCSogZ2FzL21yaS9zZW1pLnMsIGdhcy9tcmkvc2VtaS5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIGl0LgotCi1UdWUgRmViIDE4IDEzOjM3OjA2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIChhbGlnbjQgdGVzdHMpOiBUd2VhayBleHBlY3RlZAotCW91dHB1dC4KLQkKLUZyaSBGZWIgMTQgMTc6NTY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2FsaWduLmQsIGdhcy9hbGwvYWxpZ24uczogTmV3IHRlc3QuCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBpdC4KLQotVGh1IEZlYiAxMyAxNDo0NDowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMxNi5kOiBDb3JyZWN0IFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIGJ5dGVzLgotCi1XZWQgRmViIDEyIDEyOjMzOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGlmLXN2cjRwaWMuZDogUGFzcyAtRUIgd2hlbiBydW5uaW5nIHRoZSBhc3NlbWJsZXIuCi0JKiBnYXMvbWlwcy9saWYteGdvdC5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3VsaC1zdnI0cGljLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdWxoLXhnb3QuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9taXBzL21pcHMxNi5kOiBVcGRhdGUgZm9yIHlldCBhbm90aGVyIGNoYW5nZSBpbiBkaXNhc3NlbWJseQotCW91dHB1dCAodGhpcyBvbmUgaXMgc3BhY2luZyBvbmx5KS4KLQotVHVlIEZlYiAxMSAxNDo0NTozOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3thZGQuZCwgYWRkLmxzdCwgYWRkLnMsIGJpdG51bS5kLCBiaXRudW0ubHN0LCBiaXRudW0ucywKLSAJY2NvZGUuZCwgY2NvZGUubHN0LCBjY29kZS5zLCBjcmVnb3BzLmQsIGNyZWdvcHMubHN0LCBjcmVnb3BzLnMsCi0JZW5kbWFzay5kLCBlbmRtYXNrLmxzdCwgZW5kbWFzay5zLCByZWdvcHMuZCwgcmVnb3BzLmxzdCwgcmVnb3BzLnMsCi0JdGljODAuZXhwfTogTmV3IGZpbGVzIGZvciBUSWM4MCB0ZXN0IGNhc2VzLgotCi1UdWUgRmViIDExIDE1OjQ2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczE2LmQ6IFVwZGF0ZSBmb3IgY2hhbmdlIGluIGRpc2Fzc2VtYmx5IG91dHB1dC4KLQotTW9uIEZlYiAxMCAyMjoyNDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBnYXMvbWlwcy9pdGJsLXRlc3QuYzogQWRkIGNvcHlyaWdodCBtZXNzYWdlIGFuZCBmaXggaW5kZW50YXRpb24uICAgCi0KLU1vbiBGZWIgMTAgMTc6NTQ6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9pdGJsLXRlc3QuYzogTmV3IGZpbGUuICBTdGFuZC1hbG9uZSBhc3NlbWJsZXIgYW5kIAotCWRpc3Nhc3NlbWJsZXIgZm9yIGl0Ymwgc3VwcG9ydC4KLQotTW9uIEZlYiAxMCAxNzoyMDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2l0Ymw6IE5ldyBmaWxlLiAgSW5zdHJ1Y3Rpb24gU3BlYyBmb3IgdGVzdGluZyAtLWl0YmwKLQlvcHRpb24uCi0JKiBnYXMvbWlwcy9pdGJsLnM6IE5ldyBmaWxlLiAgQXNzZW1ibHkgd2l0aCBuZTJ3IGluc3RydWN0aW9ucwotCXNwZWNpZmllZCBpbiBpdGJsLgotCi1GcmkgRmViICA3IDE2OjQyOjUzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBnYXNwL2dhc3AuZXhwOiBVc2UgcHJ1bmVfd2FybmluZ3MgaW5zdGVhZCBvZiBwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkqIGxpYi9nYXMtZGVmcy5leHA6IERpdHRvLgotCi1Nb24gRmViICAzIDE1OjQ2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9pbnN0LmQsIGdhcy9hcm0vYXJtN3QuZDogUGFzcyAtLXByZWZpeC1hZGRyZXNzZXMgdG8KLQlvYmpkdW1wLiAgVXBkYXRlIGZvciBjdXJyZW50IHJlbG9jYXRpb24gcHJpbnRpbmcgc3R5bGUuCi0KLVRodSBKYW4gMzAgMTE6NTc6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzMTYuZDogVXBkYXRlIGZvciBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotVGh1IEphbiAyMyAwMzoxNTowNiAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IHNldCBpbG9ja3MgZm9yIGFsbCA0MTAwLzQzMDAKLQotVGh1IEphbiAgMiAxNjo0OToxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMxNi5zLCBnYXMvbWlwcy9taXBzMTYuZDogTmV3IHRlc3QuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIG1pcHMxNiB0ZXN0LgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIGRsaSB0ZXN0IHVuY29uZGl0aW9uYWxseS4KLQkqIGdhcy9taXBzL2RsaS5zOiBBZGQgdGV4dCBzeW1ib2wuICBBZGQgbm9wcyB0byByb3VuZCB0byAxNiBieXRlCi0JYm91bmRhcnkuCi0JKiBnYXMvbWlwcy9kbGkuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UdWUgRGVjIDMxIDEzOjAzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3N5bnRoLmQ6IFVzZSAtLXByZWZpeC1hZGRyZXNzZXMgZm9yIG9iamR1bXAuCi0JKiBnYXMvc3BhcmMvc3ludGg2NC5kOiBMaWtld2lzZS4KLQotVHVlIERlYyAyNCAxNjozMDo1OCAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvKi1pbG9ja3MuZDogRml4IHJlZ2V4cHMgdG8gcmVzZW1ibGUgZGlzYXNzZW1ibGVkIG91dHB1dC4KLQotRnJpIERlYyAxMyAxMzowNTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzLyouW3NkXTogQWRkIGV4cGxpY2l0IG5vcHMsIHNvbWV0aW1lcyBjb250cm9sbGVkIGJ5Ci0JLmlmZGVmLCB0byBhY2NvbW9kYXRlIGNoYW5nZSB0byBhdm9pZCBkZWZhdWx0IGFsaWdubWVudCBvbgotCWVtYmVkZGVkIHN5c3RlbXMuCi0KLVdlZCBEZWMgMTEgMDk6MjY6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDIwMC9iYXNpYy5leHAgKGRvX21vdmIpOiBGaXggYml0IHBhdHRlcm4gZm9yCi0JIm1vdmIgZG0sKGFuKSIuCi0KLVR1ZSBEZWMgMTAgMTM6MDE6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFVwZGF0ZSBhZnRlciBlbmRpYW5uZXNzIGNoYW5nZXMgdG8KLQl0aGUgYXNzZW1ibGVyLgotCi0JKiBnYXMvbW4xMDIwMC97bW92MS5zLG1vdjIucyxtb3YzLnMsbW92NC5zLG1vdnguc306IE5ldyB0ZXN0cy4KLQkqIGdhcy9tbjEwMjAwL3ttb3ZiLnMsIG1vdmJ1LnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMjAwL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLU1vbiBEZWMgIDkgMTc6MDg6MzggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDIwMC8qLnM6IE5ldyB0ZXN0cyBmb3IgdGhlIG1uMTAyMDAgYXNzZW1ibGVyLgotCSogZ2FzL21uMTAyMDAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotRnJpIERlYyAgNiAxNTozNTowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwLyouczogUmVtb3ZlICckJyByZWdpc3RlciBwcmVmaXhpbmcuCi0KLU1vbiBOb3YgMjUgMTY6MzU6MzMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cDogRml4IHBhdHRlcm5zLCB5b3UgY2FuJ3QgYXNzdW1lCi0JXHIgd2lsbCBiZSBwcmVzZW50LgotCi1Nb24gTm92IDI1IDEzOjQ1OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvKi5kOiBVcGRhdGUgZm9yIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL21yaS8qLmQ6IExpa2V3aXNlLgotCi1Nb24gTm92IDI1IDExOjM4OjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvKi5zOiBVc2UgJyQnIGFzIHJlZ2lzdGVyIHByZWZpeCBmb3IKLQlhbGwgcmVnaXN0ZXIgb3BlcmFuZHMuCi0KLVRodSBOb3YgMjEgMTE6NTI6NTQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2dhcy5leHA6IHhmYWlsIGEgY291cGxlIHRlc3RzIGZvciB0aGUgbW4xMDMwMC4KLQotV2VkIE5vdiAyMCAxMTozMTo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL290aGVyLnM6IFVwZGF0ZSBmb3IgY29ycmVjdCBzeW50YXggb24gYQotCWZldyBpbnN0cnVjdGlvbnMgKHRob3NlIHdpdGggcmVnaXN0ZXIgbGlzdHMpLgotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBOb3YgMTkgMTM6MzY6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9tb3ZtLnM6IFVwZGF0ZSBmb3IgY29ycmVjdCBzeW50YXguCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFVwZGF0ZSBleHBlY3RlZCBtb3ZtIGJpdCBwYXR0ZXJucy4KLQotRnJpIE5vdiAxNSAxMzo1Nzo0MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL290aGVyLnM6IFB1dCBwYXJlbnMgYXJvdW5kIHJlZ2lzdGVyCi0JYXJndW1lbnQgaW4gY2FsbHMgYW5kIGptcCBpbnN0cnVjdGlvbnMuCi0KLVdlZCBOb3YgMTMgMTM6MTY6MDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvZmZ4eDEuZDogVXBkYXRlIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLU1vbiBOb3YgMTEgMTY6MDM6MjQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFBhc3MgIi0tcHJlZml4LWFkZHJlc3NlcyIgdG8gb2JqZHVtcAotCWFzIG5lZWRlZC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogTGlrZXdpc2UuCi0KLVRodSBOb3YgIDcgMDA6Mjc6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENoZWNrIG9wY29kZSBpbnNlcnRpb24gZm9yCi0JZXh0ZW5kZWQgaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL21uMTAzMDAvZXh0ZW5kLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyCi0JdGVzdHN1aXRlIGNvdmVyYWdlLgotCi1XZWQgTm92ICA2IDEzOjUwOjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBUZXN0IGluc2VydGlvbiBvZiBvcGVyYW5kcwotCWludG8gY2FsbCBhbmQgam1wIGluc3RydWN0aW9ucyB3aXRoIDMyYml0IG9mZnNldHMuCi0JRml4IHR5cG8gaW4gYml0IHRlc3QgcGF0dGVybnMuCi0JKiBnYXMvbW4xMDMwMC9vdGhlci5zOiBUd2VhayBjb25zdGFudHMgdG8gaW1wcm92ZQotCXRlc3RzdWl0ZSBjb3ZlcmFnZS4KLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBUZXN0IGluc2VydGlvbiBvZiAzMmJpdCBvcGVyYW5kCi0JaW4gY2FsbHMsIGJ0c3QsIGJjbHIgJiBic2V0IGluc3RydWN0aW9ucy4KLQotCSogZ2FzL21uMTAzMDAvKi5zOiBUd2VhayBjb25zdGFudHMgaW4gMzJiaXQgaW5zbnMgZm9yCi0JYmV0dGVyIHRlc3RpbmcgY292ZXJhZ2UuCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFRlc3QgaW5zZXJ0aW9uIG9mIG1vc3QgMzJiaXQKLQlvcGVyYW5kcy4KLQotVHVlIE5vdiAgNSAxMzozMzoxMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBpbmRleGVkIG1vdiwKLQltb3ZidSwgbW92aHUgaW5zdHJ1Y3Rpb25zLiAgQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBtb3JlIGJpdAotCW9wZXJhdGlvbnMuICBDaGVjayBiaXQgcGF0dGVybnMgZm9yIHZhcmlvdXMgMTZiaXQgY2FsbCwgcmV0ZgotCWFuZCByZXQgaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL21uMTAzMDAvb3RoZXIuczogVXBkYXRlIG9wZXJhbmRzIGZvciBiZXR0ZXIgdGVzdCBjb3ZlcmFnZS4KLQotTW9uIE5vdiAgNCAxMjo1NToxMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBhIGNvdXBsZSBtb3JlCi0JbW92IGFuZCBjbXAgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgT2N0IDI5IDE3OjA1OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvKi5kOiBVcGRhdGUgZm9yIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi1XZWQgT2N0IDE2IDIyOjM5OjUwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Y4NTAvcmVsb2MuczogTmV3IHRlc3RzLgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotTW9uIE9jdCAxNCAxMzo1Mjo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzOiBBZGQgc3ltYm9scyB0byBzZXZlcmFsIHRlc3RzdWl0ZXMsIHNpbmNlIHRoZSBFTEYKLQlhc3NlbWJsZXIgbm93IGFsd2F5cyBidWlsZHMgYSBzeW1ib2wgdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQKLQlvYmpkdW1wIHdpbGwgbm8gbG9uZ2VyIHJlcG9ydCBgTm8gc3ltYm9scyBpbiBGSUxFJy4gIENoYW5nZSB0aGUKLQlleHBlY3RlZCBvdXRwdXQgYWNjb3JkaW5nbHkuCi0KLVRodSBPY3QgMTAgMTM6MTE6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgaW5zdHJ1Y3Rpb25zCi0Jd2l0aCBhIHNpbmdsZSA4Yml0IG9yIDE2Yml0IGltbWVkaWF0ZSBvcGVyYW5kLgotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgbWFueQotCWluc3RydWN0aW9ucy4gIEFkZCBtaXNzaW5nIHRlc3QgaW4gZG9fbW92MS4KLQkqIGdhcy9tbjEwMzAwL21vdjEuczogQWRkIG1pc3NpbmcgdGVzdC4KLQotV2VkIE9jdCAgOSAxNDoxNToxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL3thZGQucywgYmNjLnMsIGJpdC5zLCBjbXAucywgZXh0LnN9OiBOZXcgdGVzdHMuCi0JKiBnYXMvbW4xMDMwMC97ZXh0ZW5kLnMgbG9naWNhbC5zLCBsb29wLnMsIG1vdjEuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAzMDAve21vdjIucywgbW92My5zLCBtb3Y0LnMsIG1vdmJ1LnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL3ttb3ZodS5zLCBtb3ZtLnMsIG11bGRpdi5zLCBvdGhlci5zfTogTGlrZXdpc2UuCi0JKiBnYXMvbW4xMDMwMC97c2hpZnQucywgc3ViLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLVRodSBPY3QgIDMgMDk6NTc6MDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDIwMCwgZ2FzL21uMTAzMDA6IE5ldyBkaXJlY3RvcmllcyBmb3IgTWF0c3VzaGl0YQotCW1uMTAyMDAgYW5kIG1uMTAzMDAgdGVzdHMuCi0KLVR1ZSBPY3QgIDEgMTU6Mzg6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfdmVyc2lvbik6IEZpeCBmb3IgY3VycmVudCB2ZXJzaW9uCi0JcHJpbnRpbmcuCi0KLVN1biBTZXAgMjkgMDc6NTU6NTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3NwbGV0LmQ6IEZpeCB0eXBvIGluIGNwdXNoYSByZXN1bHQuCi0KLU1vbiBTZXAgMjMgMTI6MzM6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9mbW92ZW1sLnMsIGdhcy9tNjhrL2Ztb3ZlbWwuZDogQWRkIHRlc3RzIGZvciBmbW92ZW14LgotCi1XZWQgU2VwIDE4IDEyOjE0OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9jb2ZmdGFnLnM6IFVzZSAucDJhbGlnbiByYXRoZXIgdGhhbiAuYWxpZ24uCi0KLUZyaSBTZXAgMTMgMTU6Mjg6MDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvbWFjcy5zOiBBZGQgInN0bWFjIiBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvaDgzMDAvYmFzaWMuZXhwOiBUZXN0IHRoZW0uCi0KLVRodSBTZXAgMTIgMTA6Mjg6NDQgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvYXJtL3RodW1iLnMgKGJhY2spOiBDaGVjayBhc3NlbWJseSBvZiBUaHVtYiBCTC4KLQotTW9uIFNlcCAgOSAxNDozNzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHM0LnMsIGdhcy9taXBzL21pcHM0LmQ6IFVzZSAkZmNjTiBmb3IgY29uZGl0aW9uIGNvZGUKLQlyZWdpc3RlcnMuCi0KLUZyaSBTZXAgIDYgMTg6MjM6NTQgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvbWlwcy9kbGkue3MsZH06IE1vcmUgdGVzdCBjYXNlcyBhZGRlZC4KLQotV2VkIFNlcCAgNCAxMTo0NzoyOSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGQgY2hlY2sgZm9yIGRsaSBtYWNybyBpbnN0cnVjdGlvbi4KLQkqIGdhcy9taXBzL2RsaS57cyxkfTogQWRkZWQuCi0KLVNhdCBBdWcgMzEgMDE6MjU6MDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21lbSk6IENoZWNrIGJpdCBwYXR0ZXJucyBmb3Igc2hvcnQKLQlsb2FkL3N0b3JlIGluc3RydWN0aW9ucy4gIFJlbW92ZSB4ZmFpbHMgZm9yIHNob3J0IGxvYWQvc3RvcmUKLQlpbnN0cnVjdGlvbnMuCi0JKiBnYXMvdjg1MC9tZW0uczogT2Zmc2V0cyBmb3Igc2hvcnQgbG9hZC9zdG9yZSBvcGVyYW5kcwotCWFyZSB1bnNpZ25lZC4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19icmFuY2gpOiBDaGVjayBvZmZzZXRzIGluIGJyYW5jaCBpbnNucy4KLQkoZG9fanVtcHMpOiBMaWtld2lzZS4KLQkKLUZyaSBBdWcgMzAgMDA6Mzc6NTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9taXNjLnM6IFR3ZWFrIHJlZ2lzdGVyIG51bWJlcnMgZm9yIGJldHRlciB0ZXN0aW5nLgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19taXNjKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi0JKiBnYXMvdjg1MC9oaWxvLnM6IE5ldyB0ZXN0ZmlsZS4KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cDogUnVuIGhpbG8gdGVzdHMuCi0KLVRodSBBdWcgMjkgMTE6MzI6MjMgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvYXJtL2FybTd0LmQ6IEV4cGxpY2l0bHkgZm9yY2UgbGl0dGxlLWVuZGlhbiBhc3NlbWJseS4KLQotRnJpIEF1ZyAyMyAxMTowMjo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbW92ZSk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgotCSogZ2FzL3Y4NTAvbW92ZS5zOiBUd2VhayBjb25zdGFudHMgZm9yIGJldHRlciB0ZXN0aW5nLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21lbSk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgotCXhmYWlsIHNzdCBhbmQgc2xkIHRlc3RzLgotCShkb19tb3YpOiBSZW1vdmUgYm9ndXMgeGZhaWwuCi0JKiBnYXMvdjg1MC9tZW0uczogc3N0IGFuZCBzbGQgaW5zdHJ1Y3Rpb25zIGNhbiBvbmx5IGluZGV4IGZyb20KLQkiZXAiIHJlZ2lzdGVyLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2xvZ2ljYWwpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4KLQlVcGRhdGUgYWRkcmVzc2VzLgotCSogZ2FzL3Y4NTAvbG9naWNhbC5zOiBUd2VhayBjb25zdGFudHMgZm9yIGJldHRlciB0ZXN0aW5nLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2p1bXApOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucywKLQlidXQgbm90IGRpc3BsYWNlbWVudHMgKHlldCkuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fY29tcGFyZSk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2JyYW5jaCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLAotCWJ1dCBub3QgZGlzcGxhY2VtZW50cyAoeWV0KS4KLQkKLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fYml0KTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fYXJpdGgpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4JCi0JKiBnYXMvdjg1MC9hcml0aC5zOiBUd2VhayBjb25zdGFudHMgZm9yIGJldHRlciB0ZXN0aW5nLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21pc2MpOiBObyBsb25nZXIgZXhwZWN0IGZhaWx1cmVzCi0JYXNzZW1ibGluZyAibGRzciIgYW5kICJzdHNyIiBvcGNvZGVzLgotCSogZ2FzL3Y4NTAvbWlzYy5zOiBSZS1lbmFibGUgYXNzZW1ibGluZyBvZiAibGRzciIgYW5kICJzdHNyIgotCW9wY29kZXMuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWlzYyk6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMKLQlhc3NlbWJsaW5nICJ0cmFwIiBvcGNvZGVzLgotCSogZ2FzL3Y4NTAvbWlzYy5zOiBSZS1lbmFibGUgYXNzZW1ibGluZyBvZiAidHJhcCIgb3Bjb2Rlcy4KLQotCSogZ2FzL3Y4NTA6IE5ldyBkaXJlY3Rvcnkgd2l0aCB2ODUwIHRlc3RzLgotCi1GcmkgQXVnIDE2IDAwOjE5OjEwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvcHVyZ2UuczogVXNlICIlc3I0IiBvbiBwaXRsYiwgcGl0bGJlCi0JZmljIGFuZCBmaWNlIGluc3RydWN0aW9ucyB0byB0ZXN0IDNiaXQgc3BhY2UgaWRlbnRpZmllcnMuCi0JKiBnYXMvaHBwYS9iYXNpYy9zeXN0ZW0uczogU2ltaWxhcmx5IGZvciBpaXRsYmEgYW5kCi0JaWl0bGJwLgotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVRodSBBdWcgMTUgMTY6MjU6MDUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvYXJtL2FybS5leHA6IENoYW5nZSBpbnN0LnMgdGVzdCB0byBjaGVjayBvYmpkdW1wLgotCSogZ2FzL2FybS9pbnN0LmQ6IEFkZGVkLgotCQotVGh1IEF1ZyAxNSAxNjowNjowMiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vdGh1bWIuczogQWRkZWQuCi0JKiBnYXMvYXJtL2ltbWVkLnM6IEFkZGVkLgotCSogZ2FzL2FybS9hcmNoNHQuczogQWRkZWQuCi0JKiBnYXMvYXJtL2FybS5leHA6IFVwZGF0ZWQgdG8gcnVuIHRoZSBuZXcgdGVzdHMuCi0KLVR1ZSBBdWcgIDYgMTE6MDY6MjkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvbWlzY2guczogUmVlbmFibGUgImVlcG1vdi53IiB0ZXN0LgotCSogZ2FzL2g4MzAwL21pc2NzLnM6IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogQ2hlY2sgZm9yIGNvcnJlY3QgYXNzZW1ibHkgb2YgImVlcG1vdi53IgotCW9uIHRoZSBIOC8zMDBIIGFuZCBIOC9TLiAgRG9uJ3QgZXhwZWN0IGl0IHRvIGZhaWwuCi0KLVdlZCBKdWwgMzEgMTA6NTc6NDQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL2FzaS5zOiBVcGRhdGUgQVNJX0FTX0lGX1VTRVJfe1BSSU1BUlksU0VDT05EQVJZfV9MSVRUTEUuCi0KLVdlZCBKdWwgMzEgMTU6NTU6MTIgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvYXJtL2FybTd0LnM6IEFkZGVkLgotCSogZ2FzL2FybS9hcm03dC5kOiBBZGRlZC4KLQkqIGdhcy9hcm0vYXJtLmV4cDogVXBkYXRlZCB0byBydW4gdGhlIG5ldyB0ZXN0LgotCi1Nb24gSnVsICA4IDE0OjI3OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvcGNyZWwuZDogUmVuYW1lIGZyb20gc2Nod2FiLmQuCi0JKiBnYXMvbTY4ay9wY3JlbC5zOiBSZW5hbWUgZnJvbSBzY2h3YWIucy4KLQotTW9uIEp1bCAgOCAxNDoyMzoyNiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZ2FzL202OGsvc2Nod2FiLmQ6IENvcnJlY3QgZm9yIEVMRiBmb3JtYXQuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gInNjaHdhYiIgdGVzdCBmb3IgYWxsIHRhcmdldHMuCi0KLVRodSBKdWwgIDQgMTQ6MjM6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQXZvaWQgRE9TIGZpbGUgbmFtaW5nIHByb2JsZW1zOgotCSogZ2FzL2g4MzAwL2JyYW5jaC5zOiBSZW5hbWUgZnJvbSBicmFuY2hlcy5zLgotCSogZ2FzL2g4MzAwL2JyYW5jaGguczogUmVuYW1lIGZyb20gYnJhbmNoZXNoLnMuCi0JKiBnYXMvaDgzMDAvYnJhbmNocy5zOiBSZW5hbWUgZnJvbSBicmFuY2hlc3Mucy4KLQkqIGdhcy9oODMwMC9yb3RzaC5zOiBSZW5hbWUgZnJvbSByb3RzaGlmdC5zLgotCSogZ2FzL2g4MzAwL3JvdHNoaC5zOiBSZW5hbWUgZnJvbSByb3RzaGlmdGgucy4KLQkqIGdhcy9oODMwMC9yb3RzaHMuczogUmVuYW1lIGZyb20gcm90c2hpZnRzLnMuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVRodSBKdWwgIDQgMTQ6MDE6NDYgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogQWRkIG5ldyB0ZXN0cyBmb3IgcHJvY2Vzc29ycyB3aXRoIGludGVybG9ja3MKLSAJb24gZGl2IGFuZCBtdWwuCi0JKiBnYXMvbWlwcy9kaXYtaWxvY2tzLmQ6IEFkZGVkLgotCSogZ2FzL21pcHMvbXVsLWlsb2Nrcy5kOiBBZGRlZC4KLQkKLVdlZCBKdWwgIDMgMTQ6MjA6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJlbW92ZSBzZXR1cF94ZmFpbCBmb3IgaDgzMDAqLSotKiBmb3IgdHdvIHRlc3RzCi0Jd2hpY2ggbm93IHBhc3MuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBGaXggcmVnZXhwIG9mIG1vdjMyYnVnIHRlc3QgdG8gd29yayBvbiBhIDY0Ci0JYml0IGhvc3QuCi0KLVNhdCBKdW4gMjkgMTg6MjE6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgdmF4Ki0qLXZtcyogZm9yIDkzMDUwOWEKLQl0ZXN0LgotCSogZ2FzL3ZheC9xdWFkLmV4cDogRXhwZWN0IGEgbm9wIGFmdGVyIHRoZSBtb3ZxLgotCi1UdWUgSnVuIDE4IDEyOjM5OjQ5IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBnYXMvaDgzMDAvY2JyYW5jaGguczogU3dpdGNoIGludG8gaDgzMDBoIG1vZGUuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwIChIOC8zMDBIIG1pc2MgdGVzdHMpOiBGaXggdGVzdCBuYW1lcy4KLQotCSogZ2FzL2g4MzAwL3thZGRzdWJzLnMsYml0b3BzMXMucyxiaXRvcHMycy5zfTogTmV3IHRlc3RzIGZvciB0aGUKLQlIOC9TLgotCSogZ2FzL2g4MzAwL3tiaXRvcHMzLnMsYml0b3BzNC5zLGNicmFuY2hzLnMsbG9naWNhbHMuc306IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL3ticmFuY2hlc3Mucyxjb21wYXJlcy5zLG1hY3MucyxkZWNpbWFscy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAve2luY2RlY3MucyxkaXZtdWxzLnMsbWlzY3MucyxtdWx0aXBsZXMuc306IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL3ttb3Zicy5zLG1vdndzLnMsbW92bHMucyxwdXNocG9wcy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAve3JvdHNoaWZ0cy5zLGV4dGVuZHMuc306IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogUnVuIHRoZW0uCi0KLU1vbiBKdW4gMTAgMTQ6MTQ6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2NvZmZ0YWcucywgZ2FzL2FsbC9jb2ZmdGFnLmQ6IE5ldyB0ZXN0IGZvciBDT0ZGIGVudW0gdGFnCi0Jd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgZ2xvYmFsIHZhcmlhYmxlLgotCSogZ2FzL2FsbC9nYXMuZXhwOiBSdW4gY29mZnRhZyB0ZXN0IGZvciBhbnkgQ09GRiB0YXJnZXQuCi0KLVRodSBKdW4gIDYgMTI6MzA6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBQYXNzIC1tNjgwMjAgd2hlbiBhc3NlbWJsaW5nIHRoZSBkaXNwZXJyLnMKLQl0ZXN0LgotCi1GcmkgTWF5IDMxIDEwOjExOjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogRml4IGFkZC5sIHRlc3QgZm9yIEg4LzMwMEguCi0KLVdlZCBNYXkgMjkgMTY6MzU6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9qYWwteGdvdC5kOiBDb3JyZWN0IGZvciA2NCBiaXQgb3V0cHV0LgotCi1UaHUgQXByIDI1IDE5OjMxOjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IE9ubHkgcnVuIHNwYXJjbGV0IHRlc3RzIGlmIHNwYXJjbGV0LgotCi1XZWQgQXByIDI0IDE3OjA2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvb3A2ODAwMC5kOiBBZGQgc3RhdGVtZW50cyBub3cgY2F1Z2h0IGJ5IGdhcy4KLQotTW9uIEFwciAyMiAxNjo0NToxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3BsZXQuW2RzXTogTmV3IHRlc3RzIGZvciBzcGFyY2xldCBleHRlbnNpb25zLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIHRoZW0uCi0KLU1vbiBBcHIgMTUgMTc6MjU6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sYS5kOiBVcGRhdGVkIGZvciBBcHJpbCA1IE1JUFMgYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvbWlwcy9sYi5kLCBnYXMvbWlwcy9sZC5kLCBnYXMvbWlwcy9zYi5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3VsZC5kLCBnYXMvbWlwcy91bGguZCwgZ2FzL21pcHMvdWx3LmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdXNkLmQsIGdhcy9taXBzL3VzaC5kLCBnYXMvbWlwcy91c3cuZDogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMTAgMTQ6Mjc6NTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvbW92MzJidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBSdW4gaXQuCi0KLUZyaSBBcHIgIDUgMTA6MTM6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAve2FkZHN1YmgucyxiaXRvcHMxaC5zLGJpdG9wczJoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tiaXRvcHMzaC5zLGJpdG9wczRoLnMsYnJhbmNoZXNoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tjYnJhbmNoaC5zLGNvbXBhcmVoLnMsZGVjaW1hbGguc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAve2Rpdm11bGgucyxpbmNkZWNoLnMsbG9naWNhbGguc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAve21pc2NoLnMsbW92Ymgucyxtb3Z3aC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97cHVzaHBvcGgucyxyb3RzaGlmdGguc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBSdW4gdGhlbS4KLQotCSogZ2FzL2g4MzAwL3ttb3ZiLnMsbW92dy5zfTogQ29ycmVjdCBwcmVkZWNyZW1lbnQgc3ludGF4LgotCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBGaXggdHlwb3MgaW4gYml0b3BzNCBhbmQgbW92YiB0ZXN0cy4KLQotCSogZ2FzL2g4MzAwL3thZGRzdWIucyxiaXRvcHMxLnMsYml0b3BzMi5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tiaXRvcHMzLnMsYml0b3BzNC5zLGJyYW5jaGVzLnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve2NicmFuY2gucyxjb21wYXJlLnMsZGVjaW1hbC5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tkaXZtdWwucyxpbmNkZWMucyxsb2dpY2FsLnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve21pc2Mucyxtb3ZiLnMsbW92dy5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL3twdXNocG9wLnMscm90c2hpZnQuc306IE5ldyBoODMwMCB0ZXN0cy4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IFJ1biB0aGVtLgotCi1GcmkgTWFyIDE1IDE3OjE2OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3N5bnRoLmQ6IERvbid0IHJlcXVpcmUgc3BhcmMgaW4gdGhlIGZpbGUgZm9ybWF0LCBzaW5jZQotCWl0IHdvbid0IGJlIHRoZXJlIG9uIFN1bk9TLgotCi1UaHUgTWFyICA3IDE0OjUxOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3ludGguW2RzXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIGl0LgotCi1GcmkgTWFyICAxIDEyOjAxOjQ4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiB4ZmFpbCBkaWZmZXJlbmNlIG9mIHR3byB1bmRlZmluZWQgc3ltYm9scwotCWFuZCBkaWZmZXJlbmNlIG9mIGZvcndhcmQgcmVmZXJlbmNlcyBmb3IgdGhlIGg4MzAwLgotCi1UaHUgRmViIDIyIDE2OjQwOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGIteGdvdC5kOiBDb3JyZWN0LgotCi1Nb24gRmViIDE5IDAyOjQzOjM2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMve2FzaSxtZW1iYXIscHJlZmV0Y2gscmRwcixzeW50aDY0LHdycHJ9LmQ6IFBhc3MgLUF2OQotCXRvIGdhcy4KLQkqIGdhcy9zcGFyYy9hZGRlbmQuZXhwOiBFeGVjdXRlIGZvciBhbnkgc3BhcmMgY3B1LgotCSogZ2FzL3NwYXJjL3ttaXNtYXRjaC5leHAsbWlzbS0xLnN9OiBOZXcgdGVzdC4KLQotV2VkIEZlYiAxNCAxMzo0OTo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2phbC14Z290LmQsIGdhcy9taXBzL2xhLXhnb3QuZDogTmV3IHRlc3RzLgotCSogZ2FzL21pcHMvbGIteGdvdC5kLCBnYXMvbWlwcy9sZC14Z290LmQ6IE5ldyB0ZXN0cy4KLQkqIGdhcy9taXBzL2xpZi14Z290LmQsIGdhcy9taXBzL3VsaC14Z290LmQ6IE5ldyB0ZXN0cy4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gbmV3IHRlc3RzIGlmIHN2cjRwaWMuCi0KLVNhdCBKYW4gMjcgMTM6Mjc6NDUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGcuZXhwIChnYXMtZGctdGVzdCk6IERlbGV0ZSBkZWZhdWx0X2ZsYWdzIGFuZCBsaWJzIGFyZ3MuCi0KLUZyaSBKYW4gMjYgMTQ6MjQ6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFVwZGF0ZSBmb3Igb2JqZHVtcCBjaGFuZ2VzLgotCi1XZWQgSmFuIDEwIDEyOjQwOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvKi5kOiBVcGRhdGUgZm9yIGNoYW5nZXMgdG8gZGlzYXNzZW1ibGVyLgotCi1XZWQgSmFuICAzIDIyOjU5OjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvdWxoLXN2cjRwaWMuZDogVXBkYXRlIGZvciB0Yy1taXBzLmMgbG9hZF9hZGRyZXNzCi0gCWNoYW5nZS4KLQotRnJpIE5vdiAxNyAxMDozMjoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvaW1tY29uc3QuZDogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KLQkqIGdhcy9tcmkvY29uc3RhbnRzLnM6IFRlc3QgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQkqIGdhcy9tcmkvY29uc3RhbnRzLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JKiBnYXMvbTY4ay9saW5rLnM6IEFkZCBub3AgdG8gcGFkIHRvIGVpZ2h0IGJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbTY4ay9saW5rLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1TdW4gTm92IDEyIDIxOjI4OjExIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotU3VuIE5vdiAgNSAxMjo0OToyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2JlcS5zOiBEZWNsYXJlIHRleHRfbGFiZWwgZ2xvYmFsLgotCSogZ2FzL21pcHMvamFsLnM6IExpa2V3aXNlLgotCi1GcmkgTm92ICAzIDEyOjM1OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvbGluay5zOiBVc2UgIiYiIGluc3RlYWQgb2YgIiMiIGZvciBpbW1lZGlhdGUgdmFsdWVzLgotCi0JKiBnYXMvbTY4ay9mbW92ZW1sLnMsIGdhcy9tNjhrL2Ztb3ZlbWwuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gaXQuCi0KLVRodSBOb3YgIDIgMjM6MTE6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9saW5rLnMsIGdhcy9tNjhrL2xpbmsuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gaXQuCi0KLVR1ZSBPY3QgMjQgMTA6NTc6MjAgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IFRlc3QgbGNpIGFuZCBzeW5jZG1hIGluc3RydWN0aW9ucy4KLQkqIGdhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLUZyaSBPY3QgIDYgMTc6MTM6MzUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL29wZXJhbmRzLmQ6IERvbid0IHJlcXVpcmUgYSBmaXhlZCBudW1iZXIgb2YgbGVhZGluZwotCXplcm9zIGluIGFueSBudW1iZXIuCi0KLQkqIGdhcy9tNjhrL29wZXJhbmRzLnMsIGdhcy9tNjhrL2JpdGZpZWxkLnM6IFVzZSAiJiIgaW5zdGVhZCBvZiAiIyIKLQlmb3IgaW1tZWRpYXRlIHZhbHVlcy4KLQotRnJpIE9jdCAgNiAxMDo1NDoxMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2FybS5leHA6IFJlbmFtZWQgZnJvbSBnYXMuZXhwLgotCSogZ2FzL2FybS9sZS1mcGNvbnN0LltzZF06IE5ldyB0ZXN0Y2FzZS4KLQotRnJpIFNlcCAyOSAxNToxMjoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvbXJpLmV4cDogT25seSBydW4gdGVzdHMgZm9yIG02OGsgdGFyZ2V0LgotCi1Nb24gU2VwIDI1IDEyOjMxOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGFybSotKi0qIGZvciBjb25zdGFudHMKLQl0ZXN0LgotCi1UaHUgU2VwIDIxIDAxOjI2OjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvc2gvZnAucyAoZm1hYyk6IFVwZGF0ZSBmb3IgbmV3IGFzc2VtYmx5IHN5bnRheC4KLQotTW9uIFNlcCAxOCAxNDowNDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc19ydW4pOiBDYWxsIHBydW5lX3N5c3RlbV9jcnVkLgotCShydW5fZHVtcF90ZXN0LCBvYmpkdW1wKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgMTQgMTM6MTA6MTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3t3cmRyLltkc10scmRwci5bZHNdfTogTmV3IHRlc3RzLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIHRoZW0uCi0KLVdlZCBTZXAgMTMgMTY6MzU6NTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBSZW1vdmU7IHRoZSB0ZXN0c3VpdGUgaXMgbm93IHJ1bgotCWRpcmVjdGx5IGZyb20gdGhlIGdhcyBNYWtlZmlsZS4KLQotTW9uIFNlcCAxMSAxMTo0NDoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvZW1wdHkuczogTmV3IGZpbGUuCi0JKiBnYXMvbXJpL21yaS5leHA6IFRlc3QgYXNzZW1ibGluZyBlbXB0eS5zLgotCSogZ2FzL21yaS9jb21tZW50LnM6IEFkZCBhIGNvdXBsZSBtb3JlIGNvbW1lbnQgdmFyaWFudHMuCi0KLQkqIGdhcy9tcmkvbXJpLmV4cDogQWRkIHhmYWlsIGZvciB0aGUgZXhwciB0ZXN0IGZvciBhbGwgaHBwYQotCXRhcmdldHMuCi0KLVdlZCBTZXAgIDYgMjE6Mzk6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2NvbW1lbnQucywgZ2FzL21yaS9jb21tZW50LmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCi0JKiBnYXMvbXJpL2V4cHIuczogUmVtb3ZlIHdoaXRlc3BhY2UgaW4gb3BlcmFuZCBmaWVsZC4KLQkqIGdhcy9tcmkvZm9yLnM6IEFkZCBjb21tZW50cyBmb3IgZnVydGhlciB0ZXN0aW5nLgotCSogZ2FzL21hY3Jvcy90ZXN0Mi5zOiBQdXQgaW4gYW4gdXBwZXIgY2FzZSBFTFNFIHRvIHRlc3QgY2FzZQotCWluc2Vuc2l0aXZpdHkuCi0KLVdlZCBBdWcgMzAgMTY6MTI6MDMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3twcmVmZXRjaC5bZHNdLHN5bnRoNjQuW2RzXX06IE5ldyB0ZXN0cy4KLQotVHVlIEF1ZyAyOSAxODo1OTozMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBOZXcgZmlsZS4KLQkqIGdhcy9zcGFyYy97YXNpLltkc10sbWVtYmFyLltkc119OiBOZXcgdGVzdHMuCi0KLU1vbiBBdWcgMjEgMTQ6Mzk6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWFjcm9zLyo6IE5ldyB0ZXN0cyBmb3IgbWFjcm9zLgotCi0JKiBnYXMvbXJpL2NvbW1vbi5zOiBVc2UgZGF0YSwgbm90IC5kYXRhLgotCi0JKiBnYXNwL3BsMy5vdXQ6IFVwZGF0ZSBmb3IgY2hhbmdlcyBpbiBjb21tZW50ZWQgc291cmNlIG91dHB1dCB3aGVuCi0JTE9DQUwgaXMgdXNlZC4KLQotU2F0IEF1ZyAxOSAxNzozNjoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AvZ2FzcC5leHAgKGdhc3BfdGVzdCk6IENhbGwgcHJ1bmVfc3lzdGVtX2NydWQgb24gdGhlIG91dHB1dAotCW9mIGRpZmYuCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBEZWZpbmUgcHJ1bmVfc3lzdGVtX2NydWQgaWYgaXQgaXMgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCi1GcmkgQXVnIDE4IDExOjA5OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC9tcmkvKi5vdXQ6IFVzZSA7LCBub3QgISwgZm9yIHRoZSBjb21tZW50IGNoYXJhY3Rlci4KLQotV2VkIEF1ZyAxNiAxMjoyNDoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvbXJpLmV4cDogQ2hhbmdlIGhwcGEqLSotKiBleHBlY3RlZCBmYWlsdXJlcyB0byBvbmx5Ci0JZXhwZWN0IGZhaWx1cmUgZm9yIHRhcmdldHMgd2hpY2ggdXNlIFNPTS4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IElmIHRoZSBwcm9ncmFtIHRvIHJ1biBkb2VzIG5vdAotICAgICAgICBleGlzdCwgbWFyayB0aGUgdGVzdCBhcyB1bnRlc3RlZC4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGk5NjAgYi5vdXQgdGFyZ2V0cyBmb3IKLQljb21tb24gdGVzdC4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IE5hbWUgdGhlIG91dHB1dCBmaWxlIGR1bXAubywKLQlyYXRoZXIgdGhhbiB1c2luZyBhbiBpbXBsaWNpdCBhLm91dC4KLQotCSogZ2FzL21yaS9mb3IuczogQWRkIG5vcCB0byByb3VuZCBvdXQgdG8gZm91ciBieXRlIGJvdW5kYXJ5LgotCSogZ2FzL21yaS9yZXBlYXQuczogTGlrZXdpc2UuCi0JKiBnYXMvbXJpL3doaWxlLnM6IExpa2V3aXNlLgotCSogZ2FzL21yaS9mb3IuZDogRXhwZWN0ZWQgYWRkZWQgbm9wLgotCSogZ2FzL21yaS9yZXBlYXQuZDogTGlrZXdpc2UuCi0JKiBnYXMvbXJpL3doaWxlLmQ6IExpa2V3aXNlLgotCi0JKiBnYXMvbWlwcy8qLmQ6IENoYW5nZSBhbGwgdGVzdCBuYW1lcyB0byBzYXkgTUlQUy4KLQotVHVlIEF1ZyAxNSAxNTo0MjozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvZm9yLmQsIGdhcy9tcmkvZm9yLnM6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9pZi5kLCBnYXMvbXJpL2lmLnM6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9yZXBlYXQuZCwgZ2FzL21yaS9yZXBlYXQuczogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL3doaWxlLmQsIGdhcy9tcmkvd2hpbGUuczogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biB0aGUgbmV3IHRlc3RzLgotCi1Nb24gQXVnIDE0IDE2OjAzOjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9leHByLmQ6IFBlcm1pdCBsZWFkaW5nIHplcm9lcywgaW4gY2FzZSB3ZSdyZSB1c2luZyBhCi0gICAgICAgIDY0LWJpdCBCRkQuCi0KLQkqIGdhc3AvbXJpLyo6IE5ldyB0ZXN0cy4KLQkqIGdhc3AvZ2FzcC5leHA6IFJ1biB0aGVtLiAgQWxzbywgY2xlYW4gdXAgdGhlIHRlc3QgbmFtZXMgdXNlZCBpbgotCXBhc3MgYW5kIGZhaWwuCi0KLVN1biBBdWcgMTMgMDA6Mzk6MjQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9zaC9iYXNpYy5leHA6IFVwZGF0ZSBub3cgdGhhdCB3ZSBrbm93IHRoZSByaWdodAotCWJpdCBwYXR0ZXJzIGZvciB0aGUgbmV3IHN0cyBpbnN0cnVjdGlvbnMuCi0KLVRodSBBdWcgMTAgMDA6NDY6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2NoYXIuZDogRml4IGZvciBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLgotCSogZ2FzL21yaS9mbG9hdC5kOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAgOSAxNTozNDozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvc3RydWN0LnMsIGdhcy9hbGwvc3RydWN0LmQ6IE5ldyB0ZXN0LgotCSogZ2FzL2FsbC9nYXMuZXhwOiBSdW4gaXQuCi0KLVR1ZSBBdWcgIDggMTc6MTE6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2NvbW1vbi5zLCBnYXMvbXJpL2NvbW1vbi5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIGl0LgotCi1Nb24gQXVnICA3IDIyOjM5OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGEyOWsqLSotKiBmb3IgY29uc3RhbnRzCi0JdGVzdC4KLQotCSogZ2FzcC9jcmFzaDEub3V0LCBnYXNwL21hY3JvLm91dCwgZ2FzcC9zZnVuYy5vdXQ6IENvbXBsZXRlCi0JdHJ1bmNhdGVkIGZpbGVzLCBzbyB0aGF0IHRoZSB0ZXN0cyBwYXNzLgotCi0JKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgaHBwYSotKi0qIGZvciBlcXUsCi0JY29uc3RhbnRzLCBhbmQgZXhwci4KLQotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIHNjaHdhYiB0ZXN0IG9uIGhwdXgqLCBub3QganVzdCBocHV4LiAgUnVuCi0Jb24gdnh3b3JrcyosIG5vdCBqdXN0IHZ4d29ya3M1LjEuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGZhaWxfcGhhc2UsIHBhc3NfcGhhc2UpOiBSZW1vdmUuCi0JKHJ1bl9kdW1wX3Rlc3QpOiBKdXN0IGNhbGwgcGFzcyBvciBmYWlsLgotCi0JKiBnYXMvbTY4ay9vcGVyYW5kcy5zLCBnYXMvbTY4ay9vcGVyYW5kcy5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL29wNjgwMDAuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9jYXMucywgZ2FzL202OGsvY2FzLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL202OGsvYml0ZmllbGQucywgZ2FzL202OGsvYml0ZmllbGQuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9zY2h3YWIuZDogUnVuIG9iamR1bXAgd2l0aCAtaiAudGV4dC4gIEFkanVzdCBmb3IKLQljaGFuZ2VzIHRvIGRpc2Fzc2VtYmxlci4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBuZXcgdGVzdHMuICBSdW4gc2Nod2FiIHRlc3QgZm9yCi0JbTY4ay0qLWNvZmYqLgotCi1Nb24gQXVnICA3IDAzOjAxOjMyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvc2gvKjogTmV3IHRlc3RzIGZvciB0aGUgaGl0YWNoaS1zaC4KLQotVHVlIEF1ZyAgMSAxODowMjo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvKjogTmV3IHRlc3RzIGZvciBNUkkgbW9kZS4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IFN1cHBvcnQgdXNpbmcgb2JqY29weS4gIER1bXAKLQlwcm9ncmFtIGV4ZWN1dGlvbnMgdG8gdGhlIGxvZyBmaWxlIGJlZm9yZSBydW5uaW5nIHRoZW0uICBVc2UgdGhlCi0Jc2ltcGxlIHByb2dyYW0gbmFtZSwgcmF0aGVyIHRoYW4gdGhlIHBhdGggdG8gdGhlIGJpbmFyeSBiZWluZyBydW4sCi0JaW4gcGFzcy9mYWlsIG1lc3NhZ2VzLgotCShyZWdleHBfZGlmZik6IElmIHRoZSByZWdleHAgZmlsZSBoYXMgdGhlIHNwZWNpYWwgY29tbWVudCAjcGFzcywKLQlzdG9wIGNoZWNraW5nIGF0IHRoYXQgcG9pbnQuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCBOTSwgTk1GTEFHUywgT0JKQ09QWSwgYW5kIE9CSkNPUFlGTEFHUywKLQlpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBzZXQuCi0KLVR1ZSBBdWcgIDEgMTE6NDE6MzAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBzdXBlcmZsdW91cyBydW50ZXN0IGdhc3AuCi0KLU1vbiBKdWwgMzEgMTg6MTk6MjYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotIAkqIGdhc3AvKjogTmV3LgotCSogTWFrZWZpbGUuaW46IFVzZSBnYXNwIHRlc3RzLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBBZGQgZ2FzcCBzdHVmZi4KLQotVGh1IEp1bCAyMCAxODo1Njo0OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBEaXNhYmxlIHRlc3RzIHRoYXQgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IKLQl0aGUgUEEuCi0KLVRodSBKdWwgMTMgMTg6MjI6NDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBzY2h3YWIgdGVzdCBmb3IgbTY4ayB2eHdvcmtzNS4xLgotCi1XZWQgSnVuIDIxIDIxOjI4OjU3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL3NjaHdhYi4qOiBOZXcgdGVzdCBiYXNlZCBvbiBhIHRlc3QgY2FzZSBmcm9tIEFuZHJlYXMKLQlTY2h3YWIuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gaXQgZm9yIHNvbWUgYW91dCBjb25maWd1cmF0aW9ucy4KLQotTW9uIEp1biAxMiAyMjoyNzoxOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi1TdW4gTWF5IDIxIDIwOjI2OjE4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IERpc2FibGUgYWxpZ240IHRlc3RzIGZvcgotCUVMRiB0YXJnZXRzLgotCi1XZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQkKLQotCSogYXJtL2FybTdkbS5zOiBOZXcgZmlsZSAtLSB0ZXN0cyBmb3IgQVJNN0RNIGluc3RydWN0aW9ucy4KLQkqIGFybS9hcm02LnM6IENvcnJlY3QgYm9ndXMgdGVzdHMuCi0JKiBhcm0vZ2FzLmV4cCAoYXJtNi5zKTogSXMgbm93IGEgdmFsaWQgdGVzdC4KLQkoYXJtN2RtLnMpOiBOZXcgdGVzdC4KLQkqIGFybS9mbG9hdC5zOiBBZGQgbG9hZC9zdG9yZSBtdWx0aXBsZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbiAKLQl0ZXN0cy4KLQotV2VkIE1heSAgMyAxMzoxNDo0NCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotVHVlIE1heSAgMiAxNjozNzo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sZC5kOiBNb2RpZmllZCBmb3IgZ2FzIGRlbGF5LXNsb3QgZml4ZXMuCi0KLVNhdCBBcHIgMjkgMjM6MzU6MTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRnLmV4cDogTmV3IGZpbGUuCi0KLVR1ZSBBcHIgMTEgMTM6NTc6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczQuZDogQWxsb3cgbW9yZSB0aGFuIGV4YWN0bHkgOCB6ZXJvcyBpbiBiYzEqCi0JdGFyZ2V0cy4KLQotTW9uIEFwciAxMCAxNTozNjozOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChwYXNzX3BoYXNlKTogTmV3IHByb2MuCi0JKHJ1bl9kdW1wX3Rlc3QpOiBOb3RlIHBhc3Npbmcgb3IgZmFpbGluZyBvZiBlYWNoIHBoYXNlIG9mIHRoaXMKLQl0ZXN0LCBpbnN0ZWFkIG9mIGZhaWx1cmUgb2YgcGhhc2VzIG9yIHBhc3Npbmcgb2YgY29tcGxldGUgdGVzdC4KLQlFbnN1cmUgdGVzdCBmaWxlIG5hbWUgaXMgaW4gcmVwb3J0ZWQgbWVzc2FnZS4KLQotU2F0IEFwciAgOCAxMjo0NjozMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBIYW5kbGUgYXJndW1lbnRzIHdpdGggcGF0aHMuCi0JQWx3YXlzIHJlc29sdmUgdGVzdGNhc2Ugc3RhdHVzIGJlZm9yZSByZXR1cm5pbmcuCi0JSWYgYHNsdXJwX29wdGlvbnMnIGZhaWxzLCByZXR1cm4gYW5kIGRvbid0IGRvIHRlc3QuCi0JKHNsdXJwX29wdGlvbnMpOiBGaXggImNhbid0IG9wZW4iIGVycm9yIG1lc3NhZ2UuCi0JUmV0dXJuIC0xIHRvIGluZGljYXRlIGVycm9yLgotCi1Nb24gTWFyIDIwIDIyOjQ1OjMwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9jb21tb24uczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotRnJpIE1hciAxMCAxOTowNzowOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvaDgzMDAvZmZ4eDEuczogQWRkIC53b3JkIDAgYXQgdGhlIGVuZCB0byBlbGltaW5hdGUKLQl1bmNlcnRhaW50eSBhcyB0byB3aGV0aGVyIHRoZXJlIHNob3VsZCBiZSB0cmFpbGluZyBieXRlcyBpbiB0aGUKLQlvdXRwdXQgZmlsZS4KLQkqIGdhcy9oODMwMC9mZnh4MS5kOiBBZGp1c3QgcmVsb2MgdmFsdWVzIHRvIHBlcm1pdCBhbiBhZGRlbmQgdmFsdWUKLQlvZiAweDAwMDAwMDAwZmZmZmZmZmYgb24gNjQtYml0IGhvc3RzLiAgKEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzCi0JY29ycmVjdC4pICBFbmQgd2l0aCAiLi4uIiB0byBtYXRjaCB0cmFpbGluZyB6ZXJvIGJ5dGVzLgotCi1XZWQgTWFyICA4IDE1OjUwOjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczQuZCwgZ2FzL21pcHMvbWlwczQuczogTmV3IGZpbGVzLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBuZXcgdGVzdC4KLQotVGh1IEZlYiAyMyAxNzo1ODo1MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnM6IEFkZCBpbmRleGluZyB2YXJpYW50cy4KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogVGVzdCB0aGVtLgotCi1XZWQgRmViIDE1IDE1OjQzOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvdWxkLmQ6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvdWxkLnM6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvdXNkLmQ6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvdXNkLnM6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBuZXcgdGVzdHMuCi0KLVRodSBGZWIgIDkgMTA6NTc6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChkb19hcHBseWJ1Z190ZXN0KTogUnVuIGl0LgotCi1UaHUgRmViICAyIDAwOjM0OjU1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX3BpY19yZWxvY2F0aW9uX3Rlc3QpOiBSdW4gaXQuCi0KLUZyaSBKYW4gMjcgMTQ6MDI6MDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL2g4MzAwL2ZmeHgxLmQsIGdhcy9oODMwMC9mZnh4MS5zLCBnYXMvaDgzMDAvY21wc2kyLnMsCi0JZ2FzL2g4MzAwL2g4MzAwLmV4cDogTmV3IHRlc3RzLgotCi1Nb24gSmFuIDIzIDIxOjQ0OjI2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX3N5c3RlbSk6IFVwZGF0ZS4KLQotV2VkIEphbiAxMSAxNzoyMDoyNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogRG9uJ3QgcnVuIHRoZSBtZW1vcnktYWNjZXNzIHRlc3RzIGlmIHRoZQotCWZvcm1hdCBpcyBhLm91dCwgYmVjYXVzZSB0aGUgZ2VuZXJhdGVkIGNvZGUgaXMgZGlmZmVyZW50IGZyb20gd2hhdAotCWlzIHVzZWQgd2l0aCBvdGhlciBmb3JtYXRzLgotCi1UdWUgSmFuIDEwIDExOjQyOjEzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgKGFsaWduNC5zKTogRml4IGdsaXRjaCBpbgotCXJlZ2V4cCB0byBhdm9pZCBsb3Npbmcgd2l0aG91dCBhIGNvbnRyb2xsaW5nIHR0eS4KLQotRnJpIERlYyAzMCAxODowODoyMCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvaTM4Ni9wdXNody5sOiBGaXhlZCB3aGl0ZXNwYWNlIHRvIG1hdGNoIGN1cnJlbnQgbGlzdGluZwotCXN0eWxlLgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IE1hcmsgdGVzdCBwMTQ4MC5zIGV4cGVjdGVkIHRvIHBhc3MsIGV2ZW4gd2l0aAotCWxpc3RpbmdzIGVuYWJsZWQuCi0KLVRodSBEZWMgMTUgMTg6MTQ6MjcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFTX0ZPUl9UQVJHRVQsIE9CSkRVTVBfRk9SX1RBUkdFVCk6IERvbid0IHNldC4KLQkodW5pbnN0YWxsKTogRG9uJ3Qgc2V0IE9CSkRVTVAgYW5kIE9CSkRVTVBGTEFHUyBpbiBzaXRlLmV4cC4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogRGVmYXVsdCBPQkpEVU1QIGFuZCBPQkpEVU1QRkxBR1MuICBVc2UKLQlmaW5kZmlsZSBhbmQgdHJhbnNmb3JtIHByb2NlZHVyZXMgdG8gZGV0ZXJtaW5lIG9iamR1bXAgcHJvZ3JhbQotCW5hbWUuCi0KLQkqIGdhcy9taXBzL2Ficy5zLCBnYXMvbWlwcy9kaXYuczogRm9yY2Ugc29tZSBwYWRkaW5nIGF0IHRoZSBlbmQsCi0JaW4gY2FzZSB0aGUgZm9ybWF0IGRvZXNuJ3QgYXV0b21hdGljYWxseSByZXF1aXJlIGl0LgotCSogZ2FzL21pcHMvYmVxLmQsIGdhcy9taXBzL2phbC5kOiBIYW5kbGUgTUlQU19KTVAgYXMgYW4gYWx0ZXJuYXRlCi0JbmFtZSBmb3IgdGhlIHJlbG9jIHR5cGUuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGZpbGVfY29udGVudHMsIHZlcmJvc2VfZXZhbCk6IE5ldyBwcm9jcy4KLQkocnVuX2R1bXBfdGVzdCk6IElmIHZlcmJvc2l0eSBsZXZlbCBpcyBvdmVyIDMsIHByaW50IG91dCBkdW1wCi0JY29tbWFuZCBhbmQgaXRzIG91dHB1dC4KLQotVHVlIERlYyAxMyAxODoyMTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2phbC1zdnI0cGljLmQ6IEZpeCAwLXN0cmluZ3MgdG8gd29yayB3aXRoIDY0LWJpdCBob3N0ZWQKLQlkaXNhc3NlbWJseS4KLQotRnJpIERlYyAgOSAxOTo1NDowNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHAgKGNvbW1lbnQucyB0ZXN0KTogTWFrZSB0aGUgIlxyIiBvcHRpb25hbCwgc2luY2UKLQlpdCBkZXBlbmRzIG9uIHR0eSBtb2Rlcy4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZ2FzX3N0YXJ0KTogVHJ5IHVzaW5nIC1ub3R0eWNvcHkgaW5zdGVhZCBvZgotCS1ub3R0eWluaXQuCi0KLQkqIGdhcy9hcm0vZ2FzLmV4cDogVGhlIGFybTYgdGVzdCBzaG91bGQgcmVwb3J0IGVycm9ycywgZm9yIG5vdy4KLQotVGh1IERlYyAgOCAyMDoxOTowOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBVc2UgLWkgaW4gZXhwZWN0X2FmdGVyIGNvbW1hbmQuCi0KLVdlZCBEZWMgIDcgMTY6NDk6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbXVsLmQsamFsLmQ6IEZpeCAwLXN0cmluZ3MgdG8gd29yayB3aXRoIDY0LWJpdCBob3N0ZWQKLQlkaXNhc3NlbWJseS4KLQotCSogZ2FzL2llZWUtZnA6IFJlbmFtZWQgZnJvbSBpZWVlLmZwLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBNYWtlIHN1cmUgdGltZW91dCBpcyBhdCBsZWFzdCAyIG1pbnV0ZXMuCi0KLVdlZCBOb3YgMzAgMTA6NDg6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3BhcnNlOiBSZW5hbWVkIGZyb20gZ2FzL2hwcGEvbW9yZS5wYXJzZS4KLQotTW9uIE5vdiAyOCAwMDo0MDoyNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHAgKG5vc3Vic3BhY2Uucyk6IE5vIGxvbmdlciBleHBlY3RlZAotCXRvIGZhaWwuICBGaXggY29tbWVudHMgZm9yIHRoZSB0ZXN0LiAgVHdlYWsgdGVzdCBuYW1lLgotCi1UdWUgTm92IDIyIDIzOjM4OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IE1pbm9yIHR3ZWFrcyB0byBtYXRjaCBjdXJyZW50IFBBIEVMRgotCW91dHB1dC4gCi0KLUZyaSBOb3YgMTggMTc6NTY6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sZC5kOiBBZGp1c3QgdG8gd29yayBmb3IgYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4KLQljb2RlLgotCSogZ2FzL21pcHMvbGQucywgZ2FzL21pcHMvbGlmLWVtcGljLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvbGlmbG9hdC5kLCBnYXMvbWlwcy91bGgtZW1waWMuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy91bGguZCwgZ2FzL21pcHMvdWx3LmQsIGdhcy9taXBzL3VzaC5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3Vzdy5kOiBMaWtld2lzZS4KLQotVHVlIE5vdiAxNSAxMTowOTo1NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCAoaW1wb3J0YnVnKTogVHdlYWsgdG8gbWF0Y2gKLQljdXJyZW50IGV4cGVjdGVkIFBBIEVMRiBvdXRwdXQuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX3Jfbm9fcmVsb2MpOiBMaWtld2lzZS4KLQkoZG9fcGxhYmVsX3JlbG9jYXRpb25fdGVzdCk6IExpa2V3aXNlLgotCi1UaHUgTm92ICAzIDE4OjE0OjA5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvcDE0ODAuczogVXNlIGxhcmdlciBjb25zdGFudCwgc28gZXhwcmVzc2lvbiBjYW4gaGF2ZSBhCi0JcG9zaXRpdmUgdmFsdWUuCi0JKiBnYXMvYWxsL2dhcy5leHA6IEV4cGVjdCBwMTQ4MC5zIHdpdGhvdXQgbGlzdGluZ3MgdG8gcGFzcy4KLQotVGh1IE5vdiAgMyAxNTo0Mzo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3VsaC5kLCBnYXMvbWlwcy91bHcuZCwgZ2FzL21pcHMvdXNoLmQsIGdhcy9taXBzL3Vzdy5kOgotCUNvcnJlY3QgdGVzdCBjYXNlcy4KLQotVGh1IE9jdCAyMCAwMDo1NToxMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi1Nb24gT2N0IDE3IDAyOjMzOjUzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLVN1biBPY3QgMTYgMjI6MjU6NTYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAocl9ub19yZWxvYyk6IFR3ZWFrIG91dHB1dCB0byBtYXRjaAotCWN1cnJlbnQgcmVhbGl0eS4KLQotV2VkIFNlcCAyOCAyMToyMTozNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnM6IFJlbmFtZWQgZnJvbSByZWxvY3JlZHVjZS5zCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UyLnM6IFJlbmFtZWQgZnJvbSByZWxvY3JlZHVjZTIucwotCSogZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zOiBSZW5hbWVkIGZyb20gcl9ub19yZWxvY2J1Zy5zCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0KLVdlZCBTZXAgMjggMTM6MjU6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy9iZXEuZCwgZ2FzL21pcHMvYmVxLnM6IFRlc3QgdGhhdCB1bmNvbmRpdGlvbmFsIGJyYW5jaAotCW92ZXJmbG93cyBhcmUgY29ycmVjdGx5IGNvbnZlcnRlZCB0byBqdW1wcy4KLQotTW9uIFNlcCAyNiAxNzo0MTo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzOiBBZGQgdGVzdCBjYXNlcyBmb3IgUElDIGNvZGUsIGJvdGggU1ZSNCBzdHlsZSBhbmQKLQktbWVtYmVkZGVkLXBpYyBzdHlsZS4KLQotRnJpIFNlcCAyMyAxNDo0NTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzOiBOZXcgZGlyZWN0b3J5IHdpdGggTUlQUyBzcGVjaWZpYyB0ZXN0IGNhc2VzLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogUGVybWl0IHRoZSAuZCBmaWxlIHRvIHNwZWNpZnkKLQl0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gYXNzZW1ibGUuCi0JKHJlZ2V4cF9kaWZmKTogUHV0IHRoZSByZWFzb24gZm9yIGZhaWx1cmUgaW4gdGhlIGxvZyBmaWxlLgotCi1XZWQgU2VwIDIxIDEzOjQ0OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGliL2dhcy1kZWZzLmV4cDogRG9uJ3QgdHJ5IHRvIHVzZSBzaGVsbCByZWRpcmVjdGlvbiwgc2luY2UgVENMCi0JZG9lc24ndCBzdXBwb3J0IGl0LiAgUmVkaXJlY3Qgc3Rkb3V0IHVzaW5nID4gaW5zdGVhZCBvZiAxPiwgYW5kCi0JZG9uJ3QgYm90aGVyIHRvIHJlZGlyZWN0IHN0ZGVyciBzaW5jZSBUQ0wgcmVkaXJlY3RzIGl0IGFueWhvdy4KLQkocnVuX2R1bXBfdGVzdCk6IFBhc3MgYXBwcm9wcmlhdGUgYXJndW1lbnRzIHRvIHByb2dyYW0sIGRlZmF1bHRpbmcKLQl0byAtci4KLQotU2F0IFNlcCAxNyAwMTowNDo1NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXMvdmF4OiBOZXcgZGlyZWN0b3J5LgotCSogZ2FzL3ZheC97cXVhZC5zLHF1YWQuZXhwfTogTmV3IHRlc3QsIGZvciBpbW1lZGlhdGUgcXVhZHdvcmQKLQl2YWx1ZXMuCi0KLU1vbiBTZXAgMTIgMjI6MTk6MTEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3Jfbm9fcmVsb2NidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChkb19mdW5jdGlvbl9yZWxvY19idWcpOiBVcGRhdGUKLQlleHBlY3RlZCBvdXRwdXQuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogZ2FzL2FybS8qOiBOZXcgc3VidHJlZS4gIEFkZCBBUk0gdGVzdHMuCi0KLU1vbiBBdWcgIDggMTI6MTM6MzEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogQWNjZXB0IGFueSBjaGFyYWN0ZXIKLQliZXR3ZWVuIGZvbydzIHR5cGUgYW5kIGZvbyBpdHNlbGYuCi0KLUZyaSBKdWwgMTUgMTk6MDk6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IE5ldyByb3V0aW5lIGZvciBydW5uaW5nIHRoZQotCWFzc2VtYmxlciwgcnVubmluZyBvYmpkdW1wIG9yIG5tIChub3QgZnVsbHkgc3VwcG9ydGVkKSBvbiB0aGUKLQlyZXN1bHRpbmcgb2JqZWN0IGZpbGUsIGFuZCBjb21wYXJpbmcgdGhlIHJlc3VsdHMgYWdhaW5zdCBhIGZpbGUgb2YKLQlyZWd1bGFyIGV4cHJlc3Npb25zIGluIHRoZSB0ZXN0IHN1aXRlLCBhbGwgaW4gb25lIGNvbW1hbmQuCi0JT3B0aW9ucyBmb3IgdGhlIGFzc2VtYmxlciBhbmQgb2JqZHVtcCBhcmUgcmVhZCBmcm9tIGNvbW1lbnRzIGF0Ci0JdGhlIHN0YXJ0IG9mIHRoZSAuZCBmaWxlLgotCShmYWlsX3BoYXNlLCBzbHVycF9vcHRpb25zKTogTmV3IGF1eGlsaWFyeSByb3V0aW5lcy4KLQkocmVnZXhwX2RpZmYpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuICBGaXggYnVncyBpbiBhY3R1YWxseSBkb2luZwotCXRoZSByZWdleHAgdGVzdC4KLQotCSogZ2FzL3N1bjQvYWRkZW5kLmV4cDogVXNlIHJ1bl9kdW1wX3Rlc3QuCi0JKiBnYXMvc3VuNC9hZGRlbmQuZDogRml4IHJlZ3VsYXIgZXhwcmVzc2lvbnMgc28gdGhhdCB0aGV5IHdvcmsuCi0KLVRodSBKdWwgIDcgMTE6NTU6MzMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jcmVkdWNlMi5zOiBNb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9uIHRlc3RzLgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gdGhlbS4KLQotVGh1IEp1biAzMCAxODo0OToyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IExvb2sgZm9yICJhcy5uZXciIGluICIkYmFzZV9kaXIvLi4iLCB3aGVyZQotCWl0IGdvdCBjb21waWxlZCwgbm90IGluICIkYmFzZV9kaXIiLgotCSogY29uZmlnL3Vua25vd24uZXhwOiBEZWxldGVkLgotCi1TdW4gSnVuIDI2IDEzOjIzOjU0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvbGliL2dhcy1kZWZzLmV4cCAoZ2FzX2ZpbmlzaCk6IENhbGwgImNsb3NlIiBhbmQgIndhaXQiCi0JYmVmb3JlIGV4aXRpbmcuICBFbmNsb3NlIGJvdGggY2FsbHMgaW5zaWRlIGEgImNhdGNoIi4KLQkob2JqZHVtcF9maW5pc2gpOiBMaWtld2lzZS4KLQotRnJpIEp1biAxMCAxMDoyMzozNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChyb3VuZG1vZGUgdGVzdCk6IFR3ZWFrIGV4cGVjdGVkIG91dHB1dAotCWZvciBTT00gdG8gbWF0Y2ggY3VycmVudCB0ZXN0Y2FzZS4KLQotVGh1IEp1biAgMiAxOTo0Njo1OCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXMvaTM4Ni97cHVzaHcucyxwdXNody5sfTogTmV3IHRlc3QuCi0JKiBnYXMvaTM4Ni9hbGwuZXhwOiBSdW4gaXQuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc2l0ZSBjb25maWcgZmlsZXMgYW5kIGdhcy5zdW0uCi0KLUZyaSBNYXkgMjcgMTI6MjQ6MTggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzL202OGsvZGlzcGVyci5zOiBVc2UgJSBmb3IgcmVnaXN0ZXJzLgotCi0JKiBnYXMvbTY4ay1jb2ZmL2dhcy5leHA6IEV4cGVjdCBmYWlsdXJlIGZvciBwMjM4OWEucy4KLQotVHVlIE1heSAxNyAxNDo1MzowOCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxpYi9nYXMtZGVmcy5leHA6IFJlcGxhY2UgZXJyb3IgcHJvYyBjYWxscyB3aXRoIHBlcnJvciBjYWxscy4KLQotTW9uIE1heSAxNiAxMzoxOToxNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBUd2VhayBleHBlY3RlZCBvdXRwdXQgdG8gbWF0Y2ggbmV3Ci0JRUxGIGNvZGUuCi0JKiBnYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUuczogQXZvaWQgIlMiIGFuZCAiRCIgbW9kZXMsIEVMRiBkb2VzCi0Jbm90IHN1cHBvcnQgdGhlbS4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogVHdlYWsgZXhwZWN0ZWQgb3V0cHV0IHRvIG1hdGNoCi0JbmV3IEVMRiBjb2RlLgotCi1UaHUgTWF5ICA1IDE3OjI3OjU0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVuYW1lZCBmcm9tIHVuaXgtZ2FzLmV4cC4KLQotTW9uIEFwciAxMSAxMDozMTowMCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFNldCBUQ0xfTElCUkFSWSBmb3IgcnVudGVzdC4KLQotTW9uIEFwciAxMSAwNzo1NDoxMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9jYWxsaW5mb2J1Zy5zOiBBZGQgbWlzc2luZyBuYW1lIGZvcgotCXByb2NlZHVyZS4KLQotCSogZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnM6IFBsYWNlIHRoZSB0cmFtcG9saW5lIGluIHRoZQotCSREQVRBJCByYXRoZXIgdGhhbiAkTElUJCBzdWJzcGFjZS4KLQotU3VuIE1hciAyNyAxNDowNTozMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLVRodSBNYXIgMTcgMTM6Mzg6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2ltcG9ydGJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi1XZWQgTWFyIDE2IDExOjU3OjA3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3JlZ3BvcGJ1Zy5zOiBBZGQgdHJpdmlhbCAuZXF1IHRlc3QuCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2dsb2JhbGJ1Zy5zOiBOZXcgdGVzdCAoZXhwZWN0ZWQgdG8gZmFpbCkuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9jYWxsaW5mb2J1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL29tcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcmVncG9wYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotTW9uIEZlYiAyOCAxNDoxMDowNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChvYmpkdW1wKTogTmV3IHByb2MuCi0JKG9iamR1bXBfc3RhcnQpOiBEZWxldGVkIHVudXNlZCBwcm9jLgotCShvYmpkdW1wX3N0YXJ0X2NvbW1vbik6IE1lcmdlZCBpbnRvIG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyLgotCi0JKiBnYXMvYWxwaGEvZnAuZXhwOiBVc2Ugb2JqZHVtcCBpbnN0ZWFkIG9mCi0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIsIHNpbmNlIHRoZSBmb3JtZXIgYWN0dWFsbHkgd2FpdHMgZm9yCi0Jb2JqZHVtcCB0byBmaW5pc2guICBTcGVjaWZ5IC5yZGF0YSBzZWN0aW9uIG9ubHkuICBNYWtlIGNvbW1lbnQKLQlpbmRpY2F0ZSBBbHBoYSBhcmNoaXRlY3R1cmUgcmF0aGVyIHRoYW4gU1BBUkMuCi0JKiBnYXMvYWxwaGEvZnAuZDogT21pdCAucmVnaW5mbyBwYXR0ZXJucy4gIEp1c3QgdXNlICIuIiB0byBtYXRjaAotCWFnYWluc3QgQVNDSUkgY29kZSAweDJhICgiKiIsIHNwZWNpYWwgaW4gcmVnZXhwKS4KLQkqIGdhcy9zdW40L2FkZGVuZC5leHA6IFVzZSBvYmpkdW1wIGluc3RlYWQgb2YKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpci4KLQotVGh1IEZlYiAyNCAwNzoxMTo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotICAgICAgICAqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwIChubyBzdWJzcGFjZSB0ZXN0KTogT25seSBleHBlY3QKLQlhIGZhaWx1cmUgaWYgZ2FzIGlzIG5vdCBwcm9kdWNpbmcgYW4gRUxGIG9iamVjdC4KLQotTW9uIEZlYiAxNCAwOToyNDowMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBSdW4gaXQuCi0KLVRodSBGZWIgMTAgMDA6MzQ6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FscGhhL2ZwLio6IE5ldyBmaWxlcy4KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJlZ2V4cF9kaWZmKTogUmVwb3J0IG5vdGVkIG1pc21hdGNoIGF0Ci0JdmVyYm9zaXR5IGxldmVsIDMgb3IgYWJvdmUgb25seS4KLQotTW9uIEZlYiAgNyAxNTo1MzoxMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvKi8qLmV4cDogQ2hhbmdlIHhmYWlscyB0byBjaGVjayBmb3IgUEEgRUxGIHJhdGhlciB0aGFuCi0JUEEgT1NGMS4KLQotRnJpIEZlYiAgNCAyMzo0MjoxNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS94bXB5dWJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCi0KLUZyaSBGZWIgIDQgMTc6MTM6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGliL2dhcy1kZWZzLmV4cCAocmVnZXhwX2RpZmYpOiBOZXcgcHJvY2VkdXJlLCB2YWd1ZWx5IGJhc2VkIG9uCi0JInNpbXBsZV9kaWZmIiBmcm9tIGxpbmtlciB0ZXN0IHN1aXRlLgotCSogZ2FzL3N1bjQvYWRkZW5kLmV4cDogVXNlIGl0LgotCSogZ2FzL3N1bjQvYWRkZW5kLmQ6IE5ldyBmaWxlLgotCi1TdW4gSmFuIDMwIDIzOjM0OjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogQWRqdXN0IHJlZ2V4cCBmb3IgeDkzMDUwOS5zIGZvciBjdXJyZW50IGxpc3RpbmcKLQlmb3JtYXQuCi0KLVRodSBKYW4gMjAgMTY6NDQ6NTEgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2dhcy5leHAsIGxpYi9nYXMtZGVmcy5leHAsIHN1bjQvYWRkZW5kLmV4cCwKLQlzcGFyYy1zb2xhcmlzL2FkZGVuZC5leHA6IFR3ZWFrZWQgdG8gZml4IGEgZmV3IGJ1Z3MgYW5kIHRvIHJ1bgotCXdlbGwgdW5kZXIgZWl0aGVyIHZlcnNpb24gb2YgZXhwZWN0LgotCi1Nb24gSmFuIDE3IDAwOjI1OjAzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9iYXNpYy9mcF9taXNjLnM6IERlbGV0ZSBjb3ByIGluc3RydWN0aW9uLiAgSXQncyB0ZXN0ZWQKLQllbHNld2hlcmUgbm93LgotCSogZ2FzL2hwcGEvYmFzaWMve2NvcHIsIGNvcHJtZW0sIHNwb3B9LnM6IE5ldyB0ZXN0cy4KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLVRodSBKYW4gMTMgMTE6NTk6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBkaWZmZXJlbmNlIG9mIGZvcndhcmQKLQlyZWZlcmVuY2VzIHRvIGZhaWwuCi0JKiBnYXMvYWxsL3g5MzA1MDkuczogRml4IHRlc3RjYXNlIHRvIG1hdGNoIGhvdyB0aGUgZXhwZWN0IGNvZGUgd2FzCi0Jd3JpdHRlbi4KLQotV2VkIEphbiAxMiAxMzo0MToxMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4gIExhdGVzdCB0ZXN0Ci0JZm9yIGNyb3NzLXN1YnNwYWNlIGNhbGwgYnVncyBpcyBubyBsb25nZXIgZXhwZWN0ZWQgdG8gZmFpbC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wcm9jYnVnLnM6IEFkZCB0ZXN0IGZvciBhbm90aGVyIGJ1ZyByZWxhdGluZwotCXRvIGhhdmluZyBhIGZ1bmN0aW9uJ3MgbGFiZWwgZm9sbG93IHRoZSAuUFJPQyBkaXJlY3RpdmUuCi0KLVR1ZSBKYW4gMTEgMjE6NDc6NDggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogQWRkIHRlc3QgZm9yIGNyb3NzLXN1YnNwYWNlIGNhbGwgYnVnCi0JZm91bmQgd2hpbGUgd29ya2luZyBvbiBtdWx0aXBsZSAkQ09ERSQgc3Vic3BhY2Ugc3VwcG9ydC4KLQotTW9uIEphbiAxMCAwOTo1NDoxNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IHByb2NidWcucyBpcyBubyBsb25nZXIgZXhwZWN0ZWQKLQl0byBmYWlsLgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wcm9jYnVnLnM6IEFkZCBtaXNzaW5nIC5wcm9jZW5kLgotCi1Nb24gSmFuICAzIDEwOjA3OjQ3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2xhYmVsYnVnLnM6IEFkZCB0ZXN0Y2FzZSBmb3IgYnVnIGluIGxhc3QKLQlhcHAuYyBjaGFuZ2UuCi0KLVdlZCBEZWMgMjkgMTE6MzI6MzkgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvbGFiZWxidWcuczogQWRkIG1vcmUgY29sb25sZXNzIGxhYmVsIHRlc3RzLgotCi1XZWQgRGVjIDE1IDA4OjI0OjMxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNpdGUuZXhwKTogRG9uJ3Qgc2V0IEFTRkxBR1MuICBRdW90ZSB2YWx1ZSBvZgotCU9CSkRVTVBGTEFHUyBpbiBjYXNlIGl0J3MgZW1wdHkuICBVc2UgdGVtcG9yYXJ5IG5hbWVzIHVudGlsIHRoZQotCWVuZDsgbWFrZSBjcmVhdGluZyBzaXRlLmV4cCB0aGUgZmluYWwgc3RlcC4KLQkoY2hlY2spOiBQYXNzIGluIEFTRkxBR1MuCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogVXNlIGFsbF9vbmVzIHByb2MuICBDaGFuZ2UgcmVnZXhwIGZvciBtYXRjaGluZwotCUMgY29tbWVudHMgdG8gYXZvaWQgYnVncyBpbiBsYXRlc3QgZXhwZWN0IGNvZGUuCi0KLVdlZCBEZWMgIDggMTQ6MzA6MTQgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9tNjhrL2Rpc3BlcnIuczogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gaXQuCi0KLVN1biBEZWMgIDUgMTk6MjQ6NTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LiAgRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCi0KLVdlZCBEZWMgIDEgMTA6NDQ6MTggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIHRoZSBmaXJzdCBoYWxmIG9mIGJvZ3VzIFJfRVhJVAotCXRlc3QgZm9yIEVMRi4gIAotCi1UdWUgTm92IDMwIDEzOjQzOjIxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogVGVzdCBmb3IgZXJyb3Igb24gZm9yIHN1YnNwYWNlCi0JZGlyZWN0aXZlIGlzIGFuIFhGQUlMIGZvciBTT00gYXNzbWVibGVycy4KLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSZW1vdmUgWEZBSUwgZm9yIHJlbG9jYXRpb24gb24KLQljcm9zcy1zdWJzcGFjZSBjYWxsIHRlc3QuCi0KLVN1biBOb3YgMjggMTI6MTI6NTAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvYXBwYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ24zLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLVNhdCBOb3YgMjcgMjI6NTA6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9hbGwvcDI0MjUuczogSW5zZXJ0IGEgdGFiIGJlZm9yZSBhc3NlbWJsZXIgZGlyZWN0aXZlcyBzbwotCXRoYXQgdGhlIGRpcmVjdGl2ZXMgYXJlIG5vdCBpbnRlcnByZXRlZCBhcyBsYWJlbHMuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL3dlaXJkLnM6IFN5bmMgd2l0aCBHREIgdmVyc2lvbi4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9sYWJlbGJ1Zy5zOiBOZXcgdGVzdC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotV2VkIE5vdiAyNCAwMToyNTowMyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvZml4dXBidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvcmVsb2MvZXhpdGJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi1TdW4gTm92IDIxIDIyOjExOjEwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IE1pbm9yIGZpeGVzIHNvIHRoYXQgU09NICYgRUxGIGNhbgotCXNoYXJlIHRoZSBzYW1lIHRlc3QgY29kZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jcmVkdWNlLnM6IExpa2V3aXNlLgotCi0JKiBnYXMvaHBwYS9iYXNpYy9mbWVtLnM6IEFkZCBxdWFkd29yZCBGUCBzdG9yZSBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IFRlc3QgcXVhZHdvcmQgRlAgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi1TdW4gTm92ICA3IDAwOjMxOjQxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZSBmb3IKLQlmaWVsZCBzZWxlY3RvciBvbiBibGUgaW5zdHJ1Y3Rpb24gdGVzdC4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBObyBsb25nZXIgZXhwZWN0IGZhaWx1cmVzIGZvcgotCXN5c3RlbSBpbnN0cnVjdGlvbiB0ZXN0cyBub3cgdGhhdCBwcm9iZWkgaXMgZml4ZWQuCi0KLVNhdCBOb3YgIDYgMjI6NDU6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3NlbGVjdG9yYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLVRodSBOb3YgIDQgMTc6MDE6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2ZyYWdidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotVGh1IE5vdiAwNCAwOTowOTo0OSAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBSVU5URVNURkxBR1MgdG8gUlVOVEVTVF9GTEFHUwotCi1UdWUgTm92ICAyIDIyOjEyOjMwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3tkZWZidWcucywgc3RkcmVnLnN9OiBOZXcgdGVzdHMuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIHRoZW0uCi0KLU1vbiBOb3YgIDEgMjM6Mzc6NTggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAocmVsb2NfcmVkdWNlKTogQ29ycmVjdCBvZmZzZXRzIGF0Ci0Jd2hpY2ggc3BlY2lmaWMgcmVsb2NhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlIGZvdW5kLgotCQotU2F0IE9jdCAzMCAxNDoxMjozMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIChzc19hbGlnbik6IFJlbW92ZSBPU0YgeGZhaWwuCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBBZGQgbmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3NzYnVnLnM6IE5ldyB0ZXN0IHRvIG1ha2Ugc3VyZSBub24tZGVmYXVsdAotCXNlY3Rpb25zIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBEaXNhYmxlIChhbmQgZmFpbCkgcDE0ODAucyBmb3IgYWxsIFBBIHRhcmdldHMuCi0KLUZyaSBPY3QgMjkgMTY6Mjk6MDYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvY2FsbGRhdGFidWcuczogQ29sb25pemUuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogRml4IHR5cG9zLgotCi1UaHUgT2N0IDI4IDIxOjQwOjA2IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS97YmFzaWMsIG1vcmUucGFyc2UsIHJlbG9jLCB1bnNvcnRlZH06IE5ldyBkaXJlY3Rvcmllcy4KLQkqIGdhcy9ocHBhLyovKi5leHA6IE5ldyB0ZXN0IGRyaXZlcnMuCi0JKiBnYXMvaHBwYS8qLyouczogTmV3IHRlc3QgZmlsZXMuCi0KLU1vbiBPY3QgMjUgMDk6NDA6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGdhcy9zdW40OiBOZXcgZGlyZWN0b3J5LgotCSogZ2FzL3N1bjQvYWRkZW5kLnMsYWRkZW5kLmV4cDogTmV3IHRlc3QgY2FzZS4KLQkqIGdhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5zLGFkZGVuZC5leHA6IFNvbGFyaXMgdmVyc2lvbiBvZiBzYW1lCi0JdGVzdCBjYXNlLgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IENoZWNrIGAqJyBpbiBDIGNvbW1lbnRzLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChhbGxfb25lcyk6IE5ldyBwcm9jZWR1cmUsIGZvciBhIHByZWRpY2F0ZSB0bwotCXNpbXBsaWZ5IHNvbWUgdGVzdHMuCi0JKHdhbnRfbm9fb3V0cHV0KTogUmV0dXJuIHplcm8gb3Igbm9uemVybywgZGVwZW5kaW5nIG9uIHN1Y2Nlc3Mgb3IKLQlmYWlsdXJlLgotCShnYXNfdGVzdF9vbGQpOiBSZXR1cm4gdmFsdWUgZnJvbSB3YW50X25vX291dHB1dC4KLQkob2JqZHVtcF9zdGFydF9jb21tb24pOiBTcGxpdCBvZmYgZnJvbSBvYmpkdW1wX3N0YXJ0LgotCShvYmpkdW1wX3N0YXJ0X25vX3N1YmRpcik6IE5ldyBwcm9jZWR1cmUuCi0KLVdlZCBPY3QgMjAgMDc6MjU6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZGlmZjEucywgZ2FzL202OGsvcGljMS5zOiBOZXcgdGVzdHMuCi0JKiBnYXMvYWxsL2dhcy5leHAsIGdhcy9tNjhrL2FsbC5leHA6IFJ1biB0aGVtLgotCi0JKiBNYWtlZmlsZS5pbiAoT0JKRFVNUF9GT1JfVEFSR0VUKTogRGVmaW5lIHNpbWlsYXIgdG8KLQlBU19GT1JfVEFSR0VULgotCShjaGVjayk6IERvbid0IHBhc3MgQVNGTEFHUyB2YXJpYWJsZS4KLQkoc2l0ZS5leHApOiBQdXQgQVNGTEFHUywgT0JKRFVNUCwgT0JKRFVNUEZMQUdTIGludG8gc2l0ZS5leHAuCi0KLQlGcm9tIEplZmYgTGF3OgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChvYmpkdW1wX3N0YXJ0LCBvYmpkdW1wX2ZpbmlzaCk6IE5ldyBmdW5jdGlvbnMKLQlzbyB0aGF0IHRlc3RzIGNhbiBwYXJzZSB0aGUgb3V0cHV0IG9mIG9iamR1bXAgbG9va2luZyBmb3IgZXJyb3JzCi0JaW4gcmVsb2NhdGlvbiBlbnRpcmVzLCBmaWxlIGhlYWRlcnMgYW5kIHRoZSBsaWtlLgotCi1UaHUgU2VwIDIzIDE2OjIwOjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZ2FzL2llZWUuZnAveDkzMDUwOWEuZXhwOiBDdXJyZW50bHkgZXhwZWN0ZWQgdG8gZmFpbCBhbHdheXMuCi0JKiBnYXMvYWxsL2dhcy5leHAgKHAxNDgwLnMsIHg5MzA1MDkucyk6IERpdHRvLiAgQnJlYWsgdXAgZ2FzX3Rlc3QKLQljYWxsIHNvIGl0IG5vIGxvbmdlciBwZXJmb3JtcyBtdWx0aXBsZSB0ZXN0cy4KLQkqIGdhcy9tNjhrL2FsbC5leHAgKHQyLnMpOiBEb24ndCBib3RoZXIgd2l0aCBsaXN0aW5ncy4KLQkocDI0MTAucyk6IERvbid0IHBhc3MgdW53YW50ZWQgYXJndW1lbnRzIHRvIGdhc190ZXN0X2Vycm9yLgotCi1XZWQgQXVnIDI1IDE2OjUwOjA4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGliL2RvKjogUmVtb3ZlIFJDUyBpZCBzdHJpbmdzLgotCi1Nb24gTWF5IDE3IDE1OjA5OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2Zsb2F0LnMsIGdhcy9hbGwvcDE0ODAucywgZ2FzL202OGsvcDI0MTAuczogTmV3IHRlc3RzLgotCSogZ2FzL2FsbC9nYXMuZXhwLCBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gdGhlbS4KLQkqIGdhcy9pMzg2OiBOZXcgZGlyZWN0b3J5LgotCi1Nb24gTWF5IDEwIDE0OjUwOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBBZGRlZCBkaXJlY3Rvcnkgc3RydWN0dXJlLCB0byBjYXRlZ29yaXplIHRlc3RzIGJ5IHRhcmdldHMuCi0JKiBBZGRlZCBuZXcgdGVzdHMgYWxsL3g5MzA1MDkucywgaWVlZS5mcC94OTMwNTA5YS5zLCBtNjhrL3AyNjYzLnMsCi0JYW5kIHJlZmluZWQgc29tZSB0byBleGFtaW5lIHRoZSBhc3NlbWJsZXIgbGlzdGluZyBvdXRwdXQuCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBSZW5hbWVkIGdhc19zdGFydCB0byBnYXNfcnVuLiAgQWRkZWQgc29tZQotCWV4cGVjdF9hZnRlciBwYXR0ZXJucy4KLQkoZ2FzX3N0YXJ0LCBnYXNfZmluaXNoKTogTmV3IHByb2NzLCBmb3IgdGVzdHMgdGhhdCBleGFtaW5lIHByb2Nlc3MKLQlvdXRwdXQuCi0JKiBjb25maWcvdW5peC1nYXMuZXhwOiBJbnZva2UgZ2FzX2luaXQgZGlyZWN0bHksIGluc3RlYWQgb2YKLQlyZXF1aXJpbmcgdGVzdCAuZXhwIGZpbGVzIGRvIGl0LgotCi1XZWQgQXByIDIxIDAxOjI0OjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZ2FzL2dhcy5leHA6IEhhbmRsZSBuZXcgdGVzdHMsIGFuZCBjaGFuZ2VzIHRvIHRlc3RpbmcgcHJvY3MuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHdhbnRfbm9fb3V0cHV0KTogTmV3IHByb2M7IHN1Y2Nlc3MgaWZmIG91dHB1dAotCWlzIGVtcHR5LgotCShnYXNfdGVzdF9vbGQpOiBGdW5jdGlvbmFsbHkgc2FtZSBhcyBvbGQgZ2FzX3Rlc3QuCi0JKGdhc190ZXN0X2lnbm9yZV9zdGRvdXQpOiBSZXdyaXR0ZW4gdG8gdXNlIHdhbnRfbm9fb3V0cHV0LgotCShnYXNfdGVzdCk6IE5ldyBhcmd1bWVudCBsaXN0cyBzZXQgb2Ygb3B0aW9ucyB0byBiZSB0cmllZCBpbgotCWNvbWJpbmF0aW9ucy4gIE9wdGlvbiB3aXRoIHRyYWlsaW5nICI+IiBpbmRpY2F0ZXMgc3RhbmRhcmQgb3V0cHV0Ci0Jc2hvdWxkIGJlIGlnbm9yZWQuCi0KLQkqIGdhcy9wMjQyNWEuczogVXNlICUtZm9ybSBmb3IgcmVnaXN0ZXJzLCBzbyB0aGlzIHRlc3QgY2FuIGJlIHJ1bgotCW9uIG02OGstY29mZiB0YXJnZXRzIHRvby4KLQotCSogZ2FzL3AyNDMwYS5zOiBOZXcgdGVzdCBjYXNlLCB3aGl0ZXNwYWNlICZjIG1hdGNoZXMgY3VzdG9tZXIKLQlyZXBvcnQgbW9yZSBjbG9zZWx5LiAgR2V0cyBkaWZmZXJlbnQgcmVzdWx0cyBmcm9tIHAyNDMwLnM7IHRoaXMgaXMKLQliYWQsIGFuZCBub3QgeWV0IHRlc3RlZCBmb3IuCi0KLU1vbiBBcHIgIDUgMTI6Mjc6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGdhcy9wMjM4OWEucywgZ2FzL3AyNDExLnMsIGdhcy90Mi5zOiBOZXcgdGVzdCBjYXNlcy4KLQkqIGxpYi9ydW46IE5ldyBzY3JpcHQuCi0JKiBnYXMvZ2FzLWRlZnMuZXhwIChnYXNfc3RhcnQpOiBUYWtlcyBuZXcgYXJncywgYXNzZW1ibGVyIG9wdGlvbnMKLQlhbmQgcmVkaXJlY3Rpb24gb3B0aW9ucy4gIFVzZSAicnVuIiBzY3JpcHQgc28gcmVkaXJlY3Rpb24gd29ya3MuCi0JKGdhc190ZXN0KTogTm93IHRha2VzIGFzc2VtYmxlciBvcHRpb25zIGFzIHNlcGFyYXRlIGFyZyBmcm9tIGlucHV0Ci0JZmlsZSBuYW1lLgotCShnYXNfdGVzdF9pZ25vcmVfc3Rkb3V0KTogTmV3IHByb2MuICBEaXNjYXJkcyBvdXRwdXQuCi0JKGdhc190ZXN0X2Vycm9yKTogTmV3IHByb2MuICBFeHBlY3RzIGFzc2VtYmxlciB0byBnZW5lcmF0ZSBvdXRwdXQuCi0JKHRhcmdldF9jcHVfZmFtaWx5IHNldHRpbmcpOiBIYW5kbGUgaTQ4Ni0+aTM4NiBhbHNvLgotCi0JKiBsaWIvZG8qOiBTY3JpcHRzIG1vdmVkIGhlcmUgZnJvbSBnYXMvdGVzdHNjcmlwdHMuICBNYXkgYmUgdXNlZnVsCi0Jc29tZWRheSBmb3Igd3JpdGluZyBtb3JlIHRlc3QgY2FzZXM7IG5vdCBjdXJyZW50bHkgdXNlZC4KLQotVHVlIE1hciAzMCAxMTo0NToyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGdhcy9zb2wtZ2NjLnMsIGdhcy9zb2wtY2MucywgZ2FzL3AyNDI1YS5zLCBnYXMvcDIzODkuczogTmV3IHRlc3QKLQljYXNlcy4KLQkqIGdhcy9nYXMuZXhwOiBFbmFibGUgdGhlbSBmb3IgYXBwcm9wcmlhdGUgdGFyZ2V0cy4gIFJlbW92ZWQgc29tZQotCXVzZWxlc3MgY29tbWVudHMgJmMuICBDaGFuZ2VkIG02OGsgdGFyZ2V0IHRlc3QgdG8gYmUgbW9yZSBnZW5lcmFsLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfZXhpdCwgZ2FzX2luaXQpOiBOZXcgcHJvY3MuCi0JKiBnYXMvZ2FzLmV4cDogQ2FsbCBnYXNfaW5pdC4KLQotTW9uIE1hciAyOSAwMDowMDowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogVGVzdCBzdWl0ZSBjcmVhdGVkLgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cCBiL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM0YTAzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotbG9hZF9saWIgZ2FzLWRlZnMuZXhwCi0KLWdsb2JhbCBBUwotaWYgIVtpbmZvIGV4aXN0cyBBU10gdGhlbiB7Ci0gICAgc2V0IEFTIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYXMtbmV3ICIuLi9hcy1uZXciIFt0cmFuc2Zvcm0gYXNdXQotfQotCi1nbG9iYWwgR0FTUAotaWYgIVtpbmZvIGV4aXN0cyBHQVNQXSB0aGVuIHsKLSAgICBzZXQgR0FTUCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2dhc3AtbmV3ICIuLi9nYXNwLW5ldyIgW3RyYW5zZm9ybSBnYXNwXV0KLX0KLQotZ2xvYmFsIEFTRkxBR1MKLWlmICFbaW5mbyBleGlzdHMgQVNGTEFHU10gdGhlbiB7Ci0gICAgc2V0IEFTRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpEVU1QXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL29iamR1bXAgXAotCQkJICAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvb2JqZHVtcCBcCi0JCQkgIFt0cmFuc2Zvcm0gb2JqZHVtcF1dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKRFVNUEZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUEZMQUdTIHt9Ci19Ci0KLWlmICFbaW5mbyBleGlzdHMgTk1dIHRoZW4gewotICAgIHNldCBOTSBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL25tLW5ldyBcCi0JCSAgICAgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL25tLW5ldyBcCi0JCSAgICAgW3RyYW5zZm9ybSBubV1dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgTk1GTEFHU10gdGhlbiB7Ci0gICAgc2V0IE5NRkxBR1Mge30KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZXSB0aGVuIHsKLSAgICBzZXQgT0JKQ09QWSBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL29iamNvcHldCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKQ09QWUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKQ09QWUZMQUdTIHt9Ci19Ci0KLWdhc19pbml0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVkZTYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI29iamR1bXA6IC1zIC1qIC50ZXh0Ci0jbmFtZTogYWxpZ24KLQotIyBUZXN0IHRoZSBhbGlnbm1lbnQgcHNldWRvLW9wLgotCi0uKjogLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIGZmMDBmZjAxIGZmMDIwMjAyIGZmZmYwMzAzIDA0MDQwNDA0ICAuLi4uLi4uLi4uLi4uLi4uCi0gMDAxMCBmZmZmZmZmZiAwNTA1MDUwNSBmZjA5MGEwYSAwYTBhMGEwYSAgLi4uLi4uLi4uLi4uLi4uLgotIDAwMjAgZmYwMGZmMDEgZmYwMjAyMDIgZmZmZjAzMDMgMDQwNDA0MDQgIC4uLi4uLi4uLi4uLi4uLi4KLSAwMDMwIGZmZmZmZmZmIDA1MDUwNTA1IGZmMDkwYTBhIDBhMGEwYTBhICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2NjYTEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5zCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogVGVzdCB0aGUgYWxpZ25tZW50IHBzZXVkby1vcHMuICAqLwotCS50ZXh0Ci0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMSwwCi0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMSwxCi0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMiwyCi0KLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWdudyAyLDB4MDMwMwotCi0JLnAyYWxpZ24gMyw0Ci0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWdubCAzLDB4MDUwNTA1MDUKLQotCS5wMmFsaWduIDEsNgotCS5wMmFsaWduIDEsNwotCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWduIDMsOCw1Ci0JLmJ5dGUJOQotCS5wMmFsaWduIDMsMHhhCi0KLQkuYnl0ZQkweGZmCi0JLmJhbGlnbgkyLDAKLQotCS5ieXRlCTB4ZmYKLQkuYmFsaWduCTIsMQotCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ24JNCwyCi0KLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ253IDQsMHgwMzAzCi0KLQkuYmFsaWduCTgsNAotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYmFsaWdubCA4LDB4MDUwNTA1MDUKLQotCS5iYWxpZ24gMiw2Ci0JLmJhbGlnbiAyLDcKLQotCS5ieXRlCTB4ZmYKLQkuYmFsaWduCTgsOCw1Ci0JLmJ5dGUJOQotCS5iYWxpZ24JOCwweGEKLQotCS5wMmFsaWduIDUKLQkuYmFsaWduIDMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4OThiNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI29iamR1bXA6IC10Ci0jbmFtZTogY29mZnRhZwotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLVNZTUJPTCBUQUJMRToKLVxbICAwXF1cKHNlYyAtMlwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgMTAzXCkgXChueCAxXCkgMHgwKzAwMDAgZm9vLmMKLUZpbGUgCi1cWyAgMlxdXChzZWMgIDFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgNlwpIFwobnggMFwpIDB4MCswMDAwIGdjYzJfY29tcGlsZWQuCi1cWyAgM1xdXChzZWMgIDFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgNlwpIFwobnggMFwpIDB4MCswMDAwIF9fX2dudV9jb21waWxlZF9jCi1cWyAgNFxdXChzZWMgLTJcKVwoZmwgMHgwMFwpXCh0eSAgIGFcKVwoc2NsICAxNVwpIFwobnggMVwpIDB4MCswMDAwIF90b2tlbgotQVVYIGxubm8gMCBzaXplIDB4NCB0YWduZHggMCBlbmRuZHggMTAKLVxbICA2XF1cKHNlYyAtMVwpXChmbCAweDAwXClcKHR5ICAgYlwpXChzY2wgIDE2XCkgXChueCAwXCkgMHgwKzAwMDAgX29wZXJhdG9yCi1cWyAgN1xdXChzZWMgLTFcKVwoZmwgMHgwMFwpXCh0eSAgIGJcKVwoc2NsICAxNlwpIFwobnggMFwpIDB4MCswMDAxIF9mbGFncwotXFsgIDhcXVwoc2VjIC0xXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAxMDJcKSBcKG54IDFcKSAweDArMDAwNCAuZW9zCi1BVVggbG5ubyAwIHNpemUgMHg0IHRhZ25keCA0Ci1cWyAxMFxdXChzZWMgIDFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgM1wpIFwobnggMVwpIDB4WzAtOWEtZl0rIC50ZXh0Ci1BVVggc2NubGVuIDB4WzAtOWEtZl0rIG5yZWxvYyAwIG5sbm5vIDAKLVxbIDEyXF1cKHNlYyAgMlwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICAzXCkgXChueCAxXCkgMHhbMC05YS1mXSsgLmRhdGEKLUFVWCBzY25sZW4gMHhbMC05YS1mXSsgbnJlbG9jIDAgbmxubm8gMAotXFsgMTRcXVwoc2VjICAzXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDNcKSBcKG54IDFcKSAweFswLTlhLWZdKyAuYnNzCi1BVVggc2NubGVuIDB4WzAtOWEtZl0rIG5yZWxvYyAwIG5sbm5vIDAKLVxbIDE2XF1cKHNlYyAgMlwpXChmbCAweDAwXClcKHR5ICAgMlwpXChzY2wgICAyXCkgXChueCAwXCkgMHgwKzAwMDAgX3Rva2VuCi1cWyAxN1xdXChzZWMgIDJcKVwoZmwgMHgwMFwpXCh0eSAgIGFcKVwoc2NsICAgMlwpIFwobnggMVwpIDB4WzAtOWEtZl0rIF93aGF0Ci1BVVggbG5ubyAwIHNpemUgMHg0IHRhZ25keCA0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1NjU5OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogVGhpcyBmaWxlIHdhcyBjb21waWxlZCBmcm9tIHRoaXMgQyBzb3VyY2U6Ci0JY2hhciB0b2tlbiA9MDsKLQllbnVtIHRva2VuIHsKLQkgICAgICAgIG9wZXJhdG9yLAotCSAgICAgICAgZmxhZ3MKLQl9OwotCSAKLQllbnVtIHRva2VuIHdoYXQ9IG9wZXJhdG9yOwotICovCi0KLQkuZmlsZQkiZm9vLmMiCi1nY2MyX2NvbXBpbGVkLjoKLV9fX2dudV9jb21waWxlZF9jOgotLmdsb2JsIF90b2tlbgotLmRhdGEKLV90b2tlbjoKLQkuYnl0ZSAwCi0udGV4dAotCS5kZWYJX3Rva2VuCi0JLnNjbAkxNQotCS50eXBlCTAxMgotCS5zaXplCTQKLQkuZW5kZWYKLQkuZGVmCV9vcGVyYXRvcgotCS52YWwJMAotCS5zY2wJMTYKLQkudHlwZQkwMTMKLQkuZW5kZWYKLQkuZGVmCV9mbGFncwotCS52YWwJMQotCS5zY2wJMTYKLQkudHlwZQkwMTMKLQkuZW5kZWYKLQkuZGVmCS5lb3MKLQkudmFsCTQKLQkuc2NsCTEwMgotCS50YWcJX3Rva2VuCi0JLnNpemUJNAotCS5lbmRlZgotLmdsb2JsIF93aGF0Ci0uZGF0YQotCS5wMmFsaWduIDIKLV93aGF0OgotCS5sb25nIDAKLS50ZXh0Ci0JLmRlZglfdG9rZW4KLQkudmFsCV90b2tlbgotCS5zY2wJMgotCS50eXBlCTAyCi0JLmVuZGVmCi0JLmRlZglfd2hhdAotCS52YWwJX3doYXQKLQkuc2NsCTIKLQkudGFnCV90b2tlbgotCS5zaXplCTQKLQkudHlwZQkwMTIKLQkuZW5kZWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb21tZW50LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29tbWVudC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmJjNjQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb21tZW50LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVGhpcyB0ZXN0IGZpbGUgaXMgdG8gc2VlIHdoZXRoZXIgY29tbWVudHMgZ2V0IHdyaXR0ZW4gaW50byBsaXN0aW5ncwotIyBjb3JyZWN0bHkuICBUaGUgZmlsZSBoYXMgbm8gcmVhbCBjb250ZW50cy4KLS8qIEMgY29tbWVudHMgdG9vISAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTYyODcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG91dHB1dCBvZiBnYXMgLWFsYyBjb25kLnMuCi0KLS4qY29uZC5zLioKLQotCi0gICAxWyAJXSsuaWYJMAotICAgOFsgCV0rLmVsc2UKLSAgIDlbIAldKy5pZgkxCi0gIDEwWyAJXSsuZW5kYwotICAxMSAwMDAwIDBbMDJdID8wMCA/MDAgPzBbMDJdWyAJXSsubG9uZ1sgCV0rMgotICAxMlsgCV0rLmlmCTAKLSAgMTRbIAldKy5lbHNlCi0gIDE1IDAwMDQgMFswNF0gPzAwID8wMCA/MFswNF1bIAldKy5sb25nWyAJXSs0Ci0gIDE2WyAJXSsuZW5kYwotICAxN1sgCV0rLmVuZGMKLSAgMTggMDAwOCAwMCA/MDAgPzAwID8wMFsgCV0rLnAyYWxpZ24gNSwwCi0gIDE4WyAJXSswMCA/MDAgPzAwID8wMCAKLSAgMThbIAldKzAwID8wMCA/MDAgPzAwIAotICAxOFsgCV0rMDAgPzAwID8wMCA/MDAgCi0gIDE4WyAJXSswMCA/MDAgPzAwID8wMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTU4MzIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmlmCTAKLQkuaWYJMQotCS5lbmRjCi0JLmxvbmcJMAotCS5pZgkwCi0JLmxvbmcJMQotCS5lbmRjCi0JLmVsc2UKLQkuaWYJMQotCS5lbmRjCi0JLmxvbmcJMgotCS5pZgkwCi0JLmxvbmcJMwotCS5lbHNlCi0JLmxvbmcJNAotCS5lbmRjCi0JLmVuZGMKLQkucDJhbGlnbiA1LDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9kaWZmMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2RpZmYxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTg5ZmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2RpZmYxLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgRGlmZmVyZW5jZSBvZiB0d28gdW5kZWZpbmVkIHN5bWJvbHMuCi0jIFRoZSBhc3NlbWJsZXIgc2hvdWxkIHJlamVjdCB0aGlzLgotCS50ZXh0Ci0JLmdsb2JsIF9mb28KLV9mb286CS5sb25nIF9hIC0gX2IKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9mbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2Zsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOThjYWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2Zsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQkudGV4dAotZm9vOgkuc2luZ2xlCTByMS4yMzQ1ZSswNgotCS5zaW5nbGUgMGYzLjE0MTU5Ci0JLmRvdWJsZSAwcjIuNzE4MjgyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZ2FzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9nYXMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQ5NDIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9nYXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMKLSMgVGhlc2UgdGVzdHMgc2hvdWxkIGJlIHZhbGlkIG9uIGFsbCB0YXJnZXRzLgotIwotCi0jIEkgdGhpbmsgY3VycmVudGx5IGFsbCB0YXJnZXRzIGZhaWwgdGhpcyBvbmUgd2hlbiBsaXN0aW5ncyBhcmUgZW5hYmxlZC4KLWdhc190ZXN0ICJwMjQyNS5zIiAiIiAgICIiICJwY3JlbCB2YWx1ZXMgaW4gYXNzaWdubWVudCIKLQotIyBwMTQ4MC5zIHVzZXMgYSAiLnNwYWNlIiBkaXJlY3RpdmUgd2hpY2ggZm9yIG1vc3QgYXNzZW1ibGVycyBtZWFucwotIyAiYWxsb2NhdGUgc29tZSBzcGFjZSIuICBPbiB0aGUgUEEgaXQgbWVhbnMgInN3aXRjaCBpbnRvIHRoaXMgc3BhY2UiLgotIwotIyBUaGVyZWZvcmUgdGhpcyB0ZXN0IChhcyBpdCBpcyBjdXJyZW50bHkgd3JpdHRlbikgaXMgY29tcGxldGVseSBib2d1cwotIyBmb3IgYW55IFBBIHRhcmdldC4gIERvIG5vdCBib3RoZXIgdHJ5aW5nIHRvIHJ1biBpdCBhbmQganVzdCBjbGFpbQotIyBpdCBmYWlscy4KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgIHNldHVwX3hmYWlsICotKi0qCi0gICAgZmFpbCAic2ltcGxpZmlhYmxlIGRvdWJsZSBzdWJ0cmFjdGlvbiIKLX0gZWxzZSB7Ci0gICAgZ2FzX3Rlc3QgInAxNDgwLnMiICIiICItYT4iICJzaW1wbGlmaWFibGUgZG91YmxlIHN1YnRyYWN0aW9uIgotfQotCi1nYXNfdGVzdCAiZmxvYXQucyIgIiIgICAiIiAic2ltcGxlIEZQIGNvbnN0YW50cyIKLQotIyBUaGlzIHRlc3QgaXMgbWVhbmluZ2xlc3MgZm9yIHRoZSBQQTsgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZAotIyBzeW1ib2xzIGlzIHNvbWV0aGluZyB0aGF0IGlzIChhbmQgbXVzdCBiZSkgc3VwcG9ydGVkIG9uIHRoZSBQQS4KLWlmICFbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICBnYXNfdGVzdF9lcnJvciAiZGlmZjEucyIgIiIgImRpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZCBzeW1ib2xzIgotfQotCi1wcm9jIGRvX2NvbW1lbnQge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tbWVudC5zOiBjb21tZW50cyBpbiBsaXN0aW5ncyIKLSAgICBzZXQgeDEgMAotICAgIHNldCB4MiAwCi0gICAgc2V0IHgzIDAKLSAgICBzZXQgd2hpdGUge1sgXHRdKn0KLSAgICBnYXNfc3RhcnQgImNvbW1lbnQucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLSMgQXBwYXJlbnRseSBDUkxGIGlzIHJlY2VpdmVkIHdoZW4gdXNpbmcgcHR5cyBmb3Igc3VicHJvY2Vzc2VzOyBoZW5jZSB0aGUKLSMgXHJcbiBmb3IgbGluZSAzLgotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArMVxbIFx0XF0rIyBUaGlzXFteXG5cXSpcbiIJCXsgc2V0IHgxIDEgfQotCSAgICAtcmUgIl4gKzJcWyBcdFxdKyMgY29ycmVjdGx5XFteXG5cXSpcbiIJeyBzZXQgeDIgMSB9Ci0JICAgIC1yZSAiXiArM1xbIFx0XF0rLy4gQyBjb21tZW50cyB0b28uIC4vXHI/XG4iIHsgc2V0IHgzIDEgfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLSAgICBnYXNfZmluaXNoCi0gICAgaWYgW2FsbF9vbmVzICR4MSAkeDIgJHgzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1kb19jb21tZW50Ci0KLSMKLSMgVGVzdCB4OTMwNTA5YSAtLSBjb3JyZWN0IGFzc2VtYmx5IG9mIGRpZmZlcmVuY2VzIGludm9sdmluZyBmb3J3YXJkCi0jIHJlZmVyZW5jZXMuCi0jCi0KLXByb2MgZG9fOTMwNTA5YSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkaWZmZXJlbmNlIGJldHdlZW4gZm9yd2FyZCByZWZlcmVuY2VzIgotICAgIHNldCB4IDAKLSAgICBnYXNfc3RhcnQgIng5MzA1MDkucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLSMgV2UgbmVlZCB0byBhY2NvbW9kYXRlIGJvdGggYnl0ZSBvcmRlcnMgaGVyZS4KLSMgSWYgIi5sb25nIiBtZWFucyBhbiA4LWJ5dGUgdmFsdWUgb24gc29tZSB0YXJnZXQgc29tZWRheSwgdGhpcyB0ZXN0IHdpbGwgaGF2ZQotIyB0byBiZSBmaXhlZC4KLQlleHBlY3QgewotCSAgICAtcmUgIl4gKzEgLi4uLiAwMCA/MDAgPzAwID8wMCIgeyBmYWlsICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXiArMSAuLi4uIDA0ID8wMCA/MDAgPzAwIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICJeICsxIC4uLi4gMDAgPzAwID8wMCA/MDQiIHsgcGFzcyAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iIHsgfQotCSAgICB0aW1lb3V0IHsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZiB7IGJyZWFrIH0KLQl9Ci0gICAgfQotICAgIGdhc19maW5pc2gKLSAgICBpZiAhJHggdGhlbiB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotIyBUaGlzIHRlc3QgaXMgbWVhbmluZ2xlc3MgZm9yIHRoZSBQQTsgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMKLSMgbXVzdCBub3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGFzc2VtYmxlci4KLWlmICFbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIHRoZSB2YXggZmFpbHMgYmVjYXVzZSBWTVMgY2FuIGFwcGFyZW50bHkgYWN0dWFsbHkgaGFuZGxlIHRoaXMKLSAgICAjIGNhc2UgaW4gcmVsb2NzLCBzbyBnYXMgZG9lc24ndCBoYW5kbGUgaXQgaXRzZWxmLgotICAgIHNldHVwX3hmYWlsICJ2YXgqLSotdm1zKiIKLSAgICBzZXR1cF94ZmFpbCAibW4xMDMwMCotKi0qIgotICAgIHNldHVwX3hmYWlsICJtbjEwMjAwKi0qLSoiCi0gICAgZG9fOTMwNTA5YQotfQotCi1jYXNlICR0YXJnZXRfdHJpcGxldCBpbiB7Ci0gICAgeyBocHBhKi0qLSogfSB7IH0KLSAgICBkZWZhdWx0IHsKLQlydW5fZHVtcF90ZXN0IHN0cnVjdAotCXJ1bl9kdW1wX3Rlc3QgYWxpZ24KLSAgICB9Ci19Ci0KLSMgVGhpcyB0ZXN0IGlzIGZvciBhbnkgQ09GRiB0YXJnZXQuCi0jIFdlIG9taXQgbTg4ayBDT0ZGIGJlY2F1c2UgaXQgdXNlcyB3ZWlyZCBwc2V1ZG8tb3AgbmFtZXMuCi0jIFdlIG9taXQgdGhlIEFSTSB0b29sY2hhaW5zIGJlY2F1c2UgdGhleSBkZWZpbmUgbG9jYWxzIHRvCi0jICBzdGFydCB3aXRoICcuJywgd2hpY2ggZWxpbWluYXRlcyAuZW9zLCAudGV4dCBldGMgZnJvbSB0aGUgb3V0cHV0LgotaWYgeyAgIChbaXN0YXJnZXQgKi0qLWNvZmYqXSAmJiAhW2lzdGFyZ2V0IG04OCotKi0qXSAmJiAhW2lzdGFyZ2V0ICphcm0qLSotY29mZl0gJiYgIVtpc3RhcmdldCB0aHVtYiotKi1jb2ZmXSkgXAotICAgICB8fChbaXN0YXJnZXQgKi0qLXBlKl0gJiYgIVtpc3RhcmdldCBhcm0qLSotcGUqXSAmJiAhW2lzdGFyZ2V0IHRodW1iKi0qLXBlKl0pIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi11ZGkqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBhMjlrLSotZWJtb24qXSBcCi0gICAgIHx8IFtpc3RhcmdldCBhMjlrLSotc3ltKl0gXAotICAgICB8fCBbaXN0YXJnZXQgYTI5ay0qLXZ4d29ya3MqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotYWl4Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLXNjbypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1pc2MqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotZ28zMipdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1jeWd3aW4qXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotKm50XSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotaW50ZXJpeCpdIFwKLSAgICAgfHwgKFtpc3RhcmdldCBpOTYwLSotdnh3b3JrczUuKl0gJiYgIVtpc3RhcmdldCBpOTYwLSotdnh3b3JrczUuMCpdKSB9IHsKLSAgICBydW5fZHVtcF90ZXN0IGNvZmZ0YWcKLX0KLQotIyBUZXN0IG9taXR0aW5nIGNvbmRpdGlvbmFscyBmcm9tIGxpc3RpbmdzLgotcHJvYyB0ZXN0X2NvbmQge30gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdG5hbWUgImNvbmRpdGlvbmFsIGxpc3RpbmdzIgotICAgIGdhc19ydW4gY29uZC5zICItYWxjIiAiPmR1bXAub3V0IgotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JaWYgeyBbcmVnZXhwX2RpZmYgZHVtcC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NvbmQuZF0gfSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgcGFzcyAkdGVzdG5hbWUKLQl9Ci0gICAgfQotfQotCi10ZXN0X2NvbmQKLQotIyBGSVhNRTogdGhpcyBpcyBoZXJlIGNhdXNlIG9mIGEgYnVnIGluIERlamFHbnUgMS4xLjEuIFdoZW4gaXQgaXMgbm8gbG9uZ2VyCi0jICAgICAgICBpbiB1c2UsIHRoZW4gdGhpcyBjYW4gYmUgcmVtb3ZlZC4KLWlmIFtpbmZvIGV4aXN0cyBlcnJvckluZm9dIHRoZW4gewotICAgIHVuc2V0IGVycm9ySW5mbwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2NmRmYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0gICAgOyBUaGUgInA8bj4iIHJlcHJlc2VudCBwcm9jZXNzb3JzIG9mIGEgbXVsdGktcHJvY2Vzc29yIHN5c3RlbS4KLQotICAgIHAxIGRyZWcgZDEgMSAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMSIgZm9yIENPUDEgaGFzIHZhbHVlIDEKLSAgICBwMSBjcmVnIGMzIDMgICAgICAgIDsgY3RybCByZWdpc3RlciAiYzMiIGZvciBDT1AxIGhhcyB2YWx1ZSAzCi0gICAgcDMgaW5zbiBmaWUgMHgxZToyNC0yMCAgICAgIDsgZnVuY3Rpb24gImZpbGwiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMQotICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLSAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotICAgIHAzIGluc24gZmVlIDB4MWU6MjQtMjAsZHJlZzoxNy0xMyxjcmVnOjEyLTgsaW1tZWQ6Ny0wCi0KLSAgICBwMyBkcmVnIGQzIDMgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0gICAgcDMgY3JlZyBjMiAyMiAgICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLSAgICBwMyBpbnNuIGZ1bSAweDAxZTAwMDAxIGRyZWc6MTctMTMgY3JlZzoxMi04Ci0gICAgcDMgaW5zbiBmb2ggMHhmOjI0LTIxIGRyZWc6MjAtMTYgaW1tZWQ6MTUtMAotCi0gICAgcDMgaW5zbiBwaWcgMHgxOjI0LTIxKlsweDEwMHwweDJdLCBkcmVnOjIwLTE2LCBpbW1lZDoxNS0wKjB4MTAwMDAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTc0NTRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0KLQotLyogaXRibC10ZXN0LmMKLQotICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFN0YW5kLWFsb25lIHRlc3QgZm9yIGluc3RydWN0aW9uIHNwZWNpZmljYXRpb24gdGFibGUgc3VwcG9ydC4KLSAgIFJ1biB1c2luZyAiaXRibC10ZXN0IDxpdGJsPiA8YXNtLnM+IgotICAgd2hlcmUgPGl0Ymw+IGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbiB0YWJsZSwKLSAgIGFuZCA8YXNtLnM+IGlzIHRoZSBuYW1lIG9mIHRoZSBhc3NlbWJsZXIgZmllLiAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0KLXN0YXRpYyBpbnQgdGVzdF9yZWcgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsCi0JCSAgICAgdW5zaWduZWQgbG9uZyB2YWwpOwotCi1pbnQgCi1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHVuc2lnbmVkIGludCBpbnNuOwotICBGSUxFICpmYXM7Ci0gIGludCBhbGluZSA9IDA7Ci0gIGNoYXIgc1s4MV0sICpuYW1lOwotCi0gIGlmIChhcmdjIDwgMykKLSAgICB7Ci0gICAgICBwcmludGYgKCJ1c2FnZTogJXMgaXRibCBhc20uc1xuIiwgYXJndlswXSk7Ci0gICAgICBleGl0ICgwKTsKLSAgICB9Ci0gIGlmIChpdGJsX3BhcnNlIChhcmd2WzFdKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWxlZCB0byBwYXJzZSBpdGJsXG4iKTsKLSAgICAgIGV4aXQgKDApOwotICAgIH0KLQotICBmYXMgPSBmb3BlbiAoYXJndlsyXSwgInIiKTsKLSAgaWYgKGZhcyA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWxlZCB0byBvcGVuIGFzbSBmaWxlICVzXG4iLCBhcmd2WzJdKTsKLSAgICAgIGV4aXQgKDApOwotICAgIH0KLSAgd2hpbGUgKGZnZXRzIChzLCA4MCwgZmFzKSkKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgYWxpbmUrKzsKLQotICAgICAgaWYgKHAgPSBzdHJjaHIgKHMsICc7JyksIHApCS8qIHN0cmlwIGNvbW1lbnRzICovCi0JKnAgPSAwOwotICAgICAgaWYgKHAgPSBzdHJjaHIgKHMsICcjJyksIHApCS8qIHN0cmlwIGNvbW1lbnRzICovCi0JKnAgPSAwOwotICAgICAgcCA9IHMgKyBzdHJsZW4gKHMpIC0gMTsKLSAgICAgIHdoaWxlIChwID49IHMgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcbicpKQkvKiBzdHJpcCB0cmFpbGluZyBzcGFjZXMgKi8KLQlwLS07Ci0gICAgICAqKHAgKyAxKSA9IDA7Ci0gICAgICBwID0gczsKLSAgICAgIHdoaWxlICgqcCAmJiAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1xuJykpCS8qIHN0cmlwIGxlYWRpbmcgc3BhY2VzICovCi0JcCsrOwotICAgICAgaWYgKCEqcCkKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IGl0YmxfZ2V0X2ZpZWxkICgmcCk7Ci0gICAgICBpbnNuID0gaXRibF9hc3NlbWJsZSAobmFtZSwgcCk7Ci0gICAgICBpZiAoaW5zbiA9PSAwKQotCXByaW50ZiAoImxpbmUgJWQ6IEludmFsaWQgaW5zdHJ1Y3Rpb24gKCVzKVxuIiwgYWxpbmUsIHMpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYnVmWzEyOF07Ci0JICBwcmludGYgKCJsaW5lICVkOiBpbnNuKCVzKSA9IDB4JXgpXG4iLCBhbGluZSwgcywgaW5zbik7Ci0JICBpZiAoIWl0YmxfZGlzYXNzZW1ibGUgKGJ1ZiwgaW5zbikpCi0JICAgIHByaW50ZiAoImxpbmUgJWQ6IENhbid0IGRpc2Fzc2VtYmxlIGluc3RydWN0aW9uICIKLQkJICAgICIoMHgleClcbiIsIGFsaW5lLCBpbnNuKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgibGluZSAlZDogZGlzYXNtKDB4JXgpID0gJXMpXG4iLCBhbGluZSwgaW5zbiwgYnVmKTsKLQl9Ci0gICAgfQotCi0gIHRlc3RfcmVnICgxLCBlX2RyZWcsICJkMSIsIDEpOwotICB0ZXN0X3JlZyAoMywgZV9jcmVnLCAiYzIiLCAyMik7Ci0gIHRlc3RfcmVnICgzLCBlX2RyZWcsICJkMyIsIDMpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IAotdGVzdF9yZWcgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsCi0JICB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLSAgY2hhciAqbjsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIG4gPSBpdGJsX2dldF9uYW1lIChwcm9jZXNzb3IsIHR5cGUsIHZhbCk7Ci0gIGlmICghbiB8fCBzdHJjbXAgKG4sIG5hbWUpKQotICAgIHByaW50ZiAoIkVycm9yIC0gcmVnIG5hbWUgbm90IGZvdW5kIGZvciBwcm9lc3Nvcj0lZCwgdHlwZT0lZCwgdmFsPSVkXG4iLAotCSAgICBwcm9jZXNzb3IsIHR5cGUsIHZhbCk7Ci0gIGVsc2UKLSAgICBwcmludGYgKCJuYW1lPSVzIGZvdW5kIGZvciBwcm9jZXNzb3I9JWQsIHR5cGU9JWQsIHZhbD0lZFxuIiwKLQkgICAgbiwgcHJvY2Vzc29yLCB0eXBlLCB2YWwpOwotCi0gIC8qIFdlIHJlcXVpcmUgdGhhdCBuYW1lcyBiZSB1bmlxdWUgYW1vdW5nIHByb2Nlc3NvcnMgYW5kIHR5cGVzLiAqLwotICBpZiAoISBpdGJsX2dldF9yZWdfdmFsIChuYW1lLCAmdikKLSAgICAgIHx8IHYgIT0gdmFsKQotICAgIHByaW50ZiAoIkVycm9yIC0gcmVnIHZhbCBub3QgZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgbmFtZT0lc1xuIiwKLQkgICAgcHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKLSAgZWxzZQotICAgIHByaW50ZiAoInZhbD0weCV4IGZvdW5kIGZvciBwcm9jZXNzb3I9JWQsIHR5cGU9JWQsIG5hbWU9JXNcbiIsCi0JICAgIHYsIHByb2Nlc3NvciwgdHlwZSwgbmFtZSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTFhYTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0KLSAgICA7IEFzc2VtYmxlIHByb2Nlc3NvciBpbnN0cnVjdGlvbnMgYXMgZGVmaW5lZCBpbiAiaXRibCIuCi0KLSAgICBmZWUgJGQzLCRjMiwweDEgCTsgIDB4NGZmMDc2MDEKLSAgICBmaWUgCSAgCTsgIDB4NGZmMDAwMDAKLSAgICBmb2ggJDIsMHgxMDAKLSAgICBmdW0gJGQzLCRjMiAgICAgCTsgIDB4NGZmMDc2MDEKLSAgICBwaWcgJDIsMHgxMDAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AxNDgwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwYmE4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc3RhcnQ6CS5sb25nIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcKLQkuc3BhY2UgMHg4MCAtICguIC0gc3RhcnQpCi1mb286CS5sb25nIDQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDI0MjUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMjQyNS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzlkYzk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMjQyNS5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmwgX2Zyb2JuaXR6Ci1fZnJvYm5pdHo6Ci0JLmxvbmcgMSwgMiwgMywgNCwgNSwgNiwgNywgR1JVTVAsIDQyCi0JR1JVTVA9Li1fZnJvYm5pdHoKLQlIQUxGR1JVTVA9R1JVTVAvMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM1ZGQ0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogc3RydWN0Ci0KLSMgVGVzdCB0aGUgLnN0cnVjdCBwc2V1ZG8tb3AuCi0KLTArMDAgQSB3MQotMCswMiBBIHcyCi0wKzA0IEEgdzMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZmQwYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmdsb2JsCXcxCi0JLmdsb2JsCXcyCi0JLmdsb2JsCXczCi0JLmxvbmcJMAotCS5zdHJ1Y3QJMAotdzE6CS5zaG9ydAkwCi13MjoJLnNob3J0CTAKLXczOgkuc2hvcnQJMAotCS50ZXh0Ci0JLmxvbmcJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3g5MzA1MDkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC94OTMwNTA5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTk5OTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3g5MzA1MDkucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCS5sb25nIEwyLUwxCi1MMToJLmxvbmcgMHgxMjM0Ci1MMjoJLmxvbmcgMHg1Njc4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2ZjdlOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgZWNvZmYtbGl0dGxlYWxwaGEKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAucmRhdGE6Ci0gMDAwMCA3MWEzNzkwOSA0ZjkzMGE0MCA1NDQxNzg5YSBjZDRiODgxYiAgcS55Lk8uLkBUQXguLksuLgotIDAwMTAgMmE0MDRmOTMgNzkwOTcxYTMgNzg5YTU0NDAgNTQ0MTc4OWEgIC5ATy55LnEueC5UQFRBeC4KLSAwMDIwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWM4ODEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIwotIyBBbHBoYSBPU0YvMSB0ZXN0cwotIwotCi1pZiBbaXN0YXJnZXQgYWxwaGEtKi1vc2YqXSB0aGVuIHsKLSAgICBzZXQgdGVzdG5hbWUgImZwIGNvbnN0YW50cyAocGFydCAyKSIKLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmcC5zIiAiIiAiZnAgY29uc3RhbnRzIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcCAiLXMgLWogLnJkYXRhID4gYS5kdW1wIgotCWlmIHsgW3JlZ2V4cF9kaWZmICJhLmR1bXAiICIkc3JjZGlyLyRzdWJkaXIvZnAuZCJdID09IDAgfSB0aGVuIHsKLQkgICAgcGFzcyAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBmYWlsICR0ZXN0bmFtZQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlYmJiZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5yZGF0YQotIyBUaGVzZSB0aHJlZSBmb3JtYXRzIGFyZSA4IGJ5dGVzIGVhY2guCi0JLnRfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4NzEsIDB4YTMsIDB4NzksIDB4MDksIDB4NGYsIDB4OTMsIDB4MGEsIDB4NDAKLQkuZF9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKLSMJLmJ5dGUgMHg1NCwgMHg0MSwgMHg3OCwgMHg5YSwgMHhjZCwgMHg0YiwgMHg4OCwgMHgxYgotCS5nX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAotIwkuYnl0ZSAweDJhLCAweDQwLCAweDRmLCAweDkzLCAweDc5LCAweDA5LCAweDcxLCAweGEzCi0jIFRoZSBuZXh0IHR3byBhcmUgZm91ciBieXRlcyBlYWNoLgotCS5zX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAotIwkuYnl0ZSAweDc4LCAweDlhLCAweDU0LCAweDQwLCAwLCAwLCAwLCAwCi0JLmZfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4NTQsIDB4NDEsIDB4NzgsIDB4OWEsIDAsIDAsIDAsIDAKLQkubG9uZyAwLCAwLCAwLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhY2Y2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIEBJQyswQDAwODIwMAlAT0NAIHIwLHIxCi0wMDAwMDAwNCBASUMrM0A2ZTM4MDAJQE9DQCBmcCxzcAotMDAwMDAwMDggQElDKzBAMWZmZTAwCUBPQ0AgcjAsMAotMDAwMDAwMGMgQElDKzBAM2ZmZmZmCUBPQ0AgcjEsLTEKLTAwMDAwMDEwIEBJQys3QGUxMDQwMAlAT0NAIDAscjIKLTAwMDAwMDE0IEBJQys3QGUxODdmZglAT0NAIC0xLHIzCi0wMDAwMDAxOCBASUMrMEA5ZmZlZmYJQE9DQCByNCwyNTUKLTAwMDAwMDFjIEBJQys3QGUyOGFmZglAT0NAIDI1NSxyNQotMDAwMDAwMjAgQElDKzBAZGZmZjAwCUBPQ0AgcjYsLTI1NgotMDAwMDAwMjQgQElDKzdAZTM4ZjAwCUBPQ0AgLTI1NixyNwotMDAwMDAwMjggQElDKzFAMWY3YzAwCUBPQ0AgcjgsMjU2Ci0wMDAwMDAzMCBASUMrMUAzZjdjMDAJQE9DQCByOSwtMjU3Ci0wMDAwMDAzOCBASUMrN0BjNTE0MDAJQE9DQCA1MTEscjEwCi0wMDAwMDA0MCBASUMrMUA3ZjdjMDAJQE9DQCByMTEsMTExMTYzODU5NAotMDAwMDAwNDggQElDKzdAYzYxODAwCUBPQ0AgMzA1NDE5ODk2LHIxMgotMDAwMDAwNTAgQElDKzdAZmY3Y2ZmCUBPQ0AgMjU1LDI1NgotMDAwMDAwNTggQElDKzdAZGZmZWZmCUBPQ0AgMjU2LDI1NQotMDAwMDAwNjAgQElDKzBAMWY3YzAwCUBPQ0AgcjAsMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCi0wMDAwMDA2OCBASUMrMEAwMDgyMDAJQE9DQCByMCxyMQotMDAwMDAwNmMgQElDKzBANjIwODAwCUBPQ0AgcjMscjQKLTAwMDAwMDcwIEBJQyswQGMzOGUwMQlAT0NALmVxIHI2LHI3Ci0wMDAwMDA3NCBASUMrMUAyNTE0MDEJQE9DQC5lcSByOSxyMTAKLTAwMDAwMDc4IEBJQysxQDg2OWEwMglAT0NALm5lIHIxMixyMTMKLTAwMDAwMDdjIEBJQysxQGU4MjAwMglAT0NALm5lIHIxNSxyMTYKLTAwMDAwMDgwIEBJQysyQDQ5YTYwMwlAT0NALnAgcjE4LHIxOQotMDAwMDAwODQgQElDKzJAYWIyYzAzCUBPQ0AucCByMjEscjIyCi0wMDAwMDA4OCBASUMrM0AwY2IyMDQJQE9DQC5uIHIyNCxyMjUKLTAwMDAwMDhjIEBJQyszQDZlMzgwNAlAT0NALm4gZnAsc3AKLTAwMDAwMDkwIEBJQyszQGNmYmUwNQlAT0NALmMgaWxpbmsyLGJsaW5rCi0wMDAwMDA5NCBASUMrNEAzMTQ0MDUJQE9DQC5jIHIzMyxyMzQKLTAwMDAwMDk4IEBJQys0QDkyY2EwNQlAT0NALmMgcjM2LHIzNwotMDAwMDAwOWMgQElDKzRAZjQ1MDA2CUBPQ0AubmMgcjM5LHI0MAotMDAwMDAwYTAgQElDKzVANTVkNjA2CUBPQ0AubmMgcjQyLHI0MwotMDAwMDAwYTQgQElDKzVAYjc1YzA2CUBPQ0AubmMgcjQ1LHI0NgotMDAwMDAwYTggQElDKzZAMThlMjA3CUBPQ0AudiByNDgscjQ5Ci0wMDAwMDBhYyBASUMrNkA3YTY4MDcJQE9DQC52IHI1MSxyNTIKLTAwMDAwMGIwIEBJQys2QGRiZWUwOAlAT0NALm52IHI1NCxyNTUKLTAwMDAwMGI0IEBJQys3QDNkNzQwOAlAT0NALm52IHI1NyxyNTgKLTAwMDAwMGI4IEBJQys3QDllNzgwOQlAT0NALmd0IGxwX2NvdW50LGxwX2NvdW50Ci0wMDAwMDBiYyBASUMrMEAxZjdjMGEJQE9DQC5nZSByMCwwCi0wMDAwMDBjNCBASUMrN0BjMDgyMGIJQE9DQC5sdCAxLHIxCi0wMDAwMDBjYyBASUMrN0BkZjdjMGMJQE9DQC5sZSAyLDIKLTAwMDAwMGQ0IEBJQyswQDYxODYwZAlAT0NALmhpIHIzLHIzCi0wMDAwMDBkOCBASUMrMEA4MjA4MGUJQE9DQC5scyByNCxyNAotMDAwMDAwZGMgQElDKzBAYTI4YTBmCUBPQ0AucG56IHI1LHI1Ci0wMDAwMDBlMCBASUMrMEAwMDgzMDAJQE9DQC5mIHIwLHIxCi0wMDAwMDBlNCBASUMrMEA1ZWZhMDEJQE9DQC5mIHIyLDEKLTAwMDAwMGU4IEBJQys3QGExODYwMQlAT0NALmYgMSxyMwotMDAwMDAwZWMgQElDKzdAYTIwODAwCUBPQ0AuZiAwLHI0Ci0wMDAwMDBmMCBASUMrMEBiZjdkMDAJQE9DQC5mIHI1LDUxMgotMDAwMDAwZjggQElDKzdAYzMwZDAwCUBPQ0AuZiA1MTIscjYKLTAwMDAwMTAwIEBJQys3QGRmN2QwMAlAT0NALmYgNTEyLDUxMgotMDAwMDAxMDggQElDKzBAMDA4MzAxCUBPQ0AuZXEuZiByMCxyMQotMDAwMDAxMGMgQElDKzBAM2Y3ZDAyCUBPQ0AubmUuZiByMSwwCi0wMDAwMDExNCBASUMrN0BjMTA1MGIJQE9DQC5sdC5mIDAscjIKLTAwMDAwMTFjIEBJQys3QGMxMDUwOQlAT0NALmd0LmYgMSxyMgotMDAwMDAxMjQgQElDKzBAMWY3ZDBjCUBPQ0AubGUuZiByMCw1MTIKLTAwMDAwMTJjIEBJQys3QGMxMDUwYQlAT0NALmdlLmYgNTEyLHIyCi0wMDAwMDEzNCBASUMrN0BkZjdkMDQJQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FsaWFzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyNDQ0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSMgQE9DQCB0ZXN0Ci0KLSMgcmVnLHJlZwotCUBPQ0AgcjAscjEKLQlAT0NAIGZwLHNwCi0KLSMgc2hpbW0gdmFsdWVzCi0JQE9DQCByMCwwCi0JQE9DQCByMSwtMQotCUBPQ0AgMCxyMgotCUBPQ0AgLTEscjMKLQlAT0NAIHI0LDI1NQotCUBPQ0AgMjU1LHI1Ci0JQE9DQCByNiwtMjU2Ci0JQE9DQCAtMjU2LHI3Ci0KLSMgbGltbSB2YWx1ZXMKLQlAT0NAIHI4LDI1NgotCUBPQ0AgcjksLTI1NwotCUBPQ0AgNTExLHIxMAotCUBPQ0AgcjExLDB4NDI0MjQyNDIKLQlAT0NAIDB4MTIzNDU2NzgscjEyCi0KLSMgc2hpbW0gYW5kIGxpbW0KLQlAT0NAIDI1NSwyNTYKLQlAT0NAIDI1NiwyNTUKLQotIyBzeW1ib2xzCi0JQE9DQCByMCxmb28KLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24KLQlAT0NALmFsIHIwLHIxCi0JQE9DQC5yYSByMyxyNAotCUBPQ0AuZXEgcjYscjcKLQlAT0NALnogcjkscjEwCi0JQE9DQC5uZSByMTIscjEzCi0JQE9DQC5ueiByMTUscjE2Ci0JQE9DQC5wbCByMTgscjE5Ci0JQE9DQC5wIHIyMSxyMjIKLQlAT0NALm1pIHIyNCxyMjUKLQlAT0NALm4gcjI3LHIyOAotCUBPQ0AuY3MgcjMwLHIzMQotCUBPQ0AuYyByMzMscjM0Ci0JQE9DQC5sbyByMzYscjM3Ci0JQE9DQC5jYyByMzkscjQwCi0JQE9DQC5uYyByNDIscjQzCi0JQE9DQC5ocyByNDUscjQ2Ci0JQE9DQC52cyByNDgscjQ5Ci0JQE9DQC52IHI1MSxyNTIKLQlAT0NALnZjIHI1NCxyNTUKLQlAT0NALm52IHI1NyxyNTgKLQlAT0NALmd0IHI2MCxyNjAKLQlAT0NALmdlIHIwLDAKLQlAT0NALmx0IDEscjEKLQlAT0NALmxlIDIsMgotCUBPQ0AuaGkgcjMscjMKLQlAT0NALmxzIHI0LHI0Ci0JQE9DQC5wbnogcjUscjUKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEKLQlAT0NALmYgcjIsMQotCUBPQ0AuZiAxLHIzCi0JQE9DQC5mIDAscjQKLQlAT0NALmYgcjUsNTEyCi0JQE9DQC5mIDUxMixyNgotCUBPQ0AuZiA1MTIsNTEyCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uICsgZmxhZyBzZXR0aW5nCi0JQE9DQC5lcS5mIHIwLHIxCi0JQE9DQC5uZS5mIHIxLDAKLQlAT0NALmx0LmYgMCxyMgotCUBPQ0AuZ3QuZiAxLHIyCi0JQE9DQC5sZS5mIHIwLDUxMgotCUBPQ0AuZ2UuZiA1MTIscjIKLQlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYXJjLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hcmMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk4NDUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hcmMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMgQVJDIGdhcyB0ZXN0c3VpdGUKLQotIyBUZXN0IGFuIGluc24gZnJvbSBhIHRlbXBsYXRlIC5zLy5kLgotIyBUaGUgYmVzdCB3YXkgdG8gY3JlYXRlIHRoZSAuZCBmaWxlIGlzIHRvIHJ1biB0aGUgdGVzdHMgd2l0aG91dCBpdCwgbGV0Ci0jIGRlamFnbnUgY3Jhc2gsIHJ1biBhcy5uZXcgb24gdGhlIGp1c3QgYnVpbHQgLnMgZmlsZSwgcnVuIG9iamR1bXAgLWRyIG9uCi0jIHRoZSByZXN1bHQgb2YgdGhhdCwgY29weSB0aGUgcmVzdWx0IGludG8gdGhlIC5kIGZpbGUsIGFuZCBlZGl0IGluIHRoZQotIyBuZWNlc3NhcnkgcGF0dGVybnMgKEBPQ0AsIGV0Yy4pLiAgU291bmRzIGNvbXBsaWNhdGVkIGJ1dCBpdCdzIGVhc3kuICBUaGUKLSMgY2F0Y2ggaXMgdGhhdCB3ZSBhc3N1bWUgYSB3b3JraW5nIGFzc2VtYmxlciBpcyB1c2VkIHRvIGJ1aWxkIGl0LiAgVGhhdCdzCi0jIG9idmlvdXNseSBub3QgZW50aXJlbHkga29zaGVyLCBidXQgb25jZSB0aGUgLmQgZmlsZSBpcyBjcmVhdGVkIG9uZSBjYW4KLSMgdmVyaWZ5IGl0J3MgY29udGVudHMgb3ZlciB0aW1lLgotIwotIyBUZW1wbGF0ZSBwYXR0ZXJuczoKLSMgQE9DQCAtIHBsYWNlaG9sZGVyIGZvciB0aGUgb3Bjb2RlCi0jIEBJQys/QCAtIHBsYWNlIGhvbGRlciBmb3IgdGhlIGluc24gY29kZQotIyBASTMrPz9AIC0gcGxhY2UgaG9sZGVyIGZvciB0aGUgb3BlcmF0aW9uIGNvZGUgb2YgY29kZSAzIGluc25zLgotCi1wcm9jIHRlc3RfdGVtcGxhdGVfaW5zbiB7IGNwdSB0bXBsIG9wY29kZSBpY29kZSB9IHsKLSAgICBnbG9iYWwgc3JjZGlyIHN1YmRpciBvYmpkaXIKLQotICAgICMgQ2hhbmdlIEBPQ0AgaW4gdGhlIHRlbXBsYXRlIGZpbGUgdG8gJG9wY29kZQotCi0gICAgc2V0IGluX2ZkIFtvcGVuICRzcmNkaXIvJHN1YmRpci8kdG1wbC5zIHJdCi0gICAgc2V0IG91dF9mZCBbb3BlbiAkb2JqZGlyLyRvcGNvZGUucyB3XQotICAgICMgRklYTUU6IGNoZWNrIHJldHVybiBjb2RlcwotCi0gICAgcHV0cyAkb3V0X2ZkICJcdC5jcHUgJGNwdVxuIgotICAgIHdoaWxlIHsgW2dldHMgJGluX2ZkIGxpbmVdID49IDAgfSB7Ci0JcmVnc3ViICJAT0NAIiAkbGluZSAkb3Bjb2RlIGxpbmUKLQlwdXRzICRvdXRfZmQgJGxpbmUKLSAgICB9Ci0KLSAgICBjbG9zZSAkaW5fZmQKLSAgICBjbG9zZSAkb3V0X2ZkCi0KLSAgICAjIENyZWF0ZSBvdXRwdXQgdGVtcGxhdGUuCi0KLSAgICBzZXQgaW5fZmQgW29wZW4gJHNyY2Rpci8kc3ViZGlyLyR0bXBsLmQgcl0KLSAgICBzZXQgb3V0X2ZkIFtvcGVuICRvYmpkaXIvJG9wY29kZS5kIHddCi0gICAgIyBGSVhNRTogY2hlY2sgcmV0dXJuIGNvZGVzCi0KLSAgICB3aGlsZSB7IFtnZXRzICRpbl9mZCBsaW5lXSA+PSAwIH0gewotCXJlZ3N1YiAiQE9DQCIgJGxpbmUgJG9wY29kZSBsaW5lCi0JI3NlbmRfdXNlciAiJGxpbmVcbiIKLQlpZiBbc3RyaW5nIG1hdGNoICIqQElDKz9AKiIgJGxpbmVdIHsKLQkgICAgIyBJbnNlcnQgdGhlIG9wY29kZS4gIEl0IG9jY3VwaWVzIHRoZSB0b3AgNSBiaXRzLgotCSAgICByZWdleHAgIl4oLiopQElDXFwrKC4pQCguKikkIiAkbGluZSBqdW5rIGxlZnRwYXJ0IG4gcmlnaHRwYXJ0Ci0JICAgIHNldCBuIFtleHByICgkaWNvZGUgPDwgMykgKyAkbl0KLQkgICAgc2V0IG4gW2Zvcm1hdCAiJTAyeCIgJG5dCi0JICAgIHB1dHMgJG91dF9mZCAiJGxlZnRwYXJ0JG4kcmlnaHRwYXJ0IgotCX0gZWxzZWlmIFtzdHJpbmcgbWF0Y2ggIipASTMrPz9AKiIgJGxpbmVdIHsKLQkgICAgIyBJbnNlcnQgaW5zbiAzIGNvZGUgKHJlZ2lzdGVyIEMgZmllbGQpCi0JICAgICMgYjE1PTgvMCwgYjg9MS8wICh0aGVpciByZXNwZWN0aXZlIGhleCB2YWx1ZXMgaW4gdGhlIG9iamR1bXApCi0JICAgIHJlZ2V4cCAiXiguKilASTNcXCsoLikoLilAKC4qKSQiICRsaW5lIGp1bmsgbGVmdHBhcnQgYjE1IGI4IHJpZ2h0cGFydAotCSAgICBzZXQgbiBbZXhwciAoJGljb2RlIDw8IDEpICsgKCRiMTUgPDwgNCkgKyAoJGI4IDw8IDApXQotCSAgICBzZXQgbiBbZm9ybWF0ICIlMDJ4IiAkbl0KLQkgICAgcHV0cyAkb3V0X2ZkICIkbGVmdHBhcnQkbiRyaWdodHBhcnQiCi0JfSBlbHNlIHsKLQkgICAgcHV0cyAkb3V0X2ZkICRsaW5lCi0JfQotICAgIH0KLQotICAgIGNsb3NlICRpbl9mZAotICAgIGNsb3NlICRvdXRfZmQKLQotICAgICMgRmluYWxseSwgcnVuIHRoZSB0ZXN0LgotCi0gICAgcnVuX2R1bXBfdGVzdCAkb2JqZGlyLyRvcGNvZGUKLQotICAgICMgIm1ha2UgY2xlYW4iIHdvbid0IGRlbGV0ZSB0aGVzZSwgc28gZm9yIG5vdyB3ZSBtdXN0LgotICAgIGNhdGNoICJleGVjIHJtIC1mICRvYmpkaXIvJG9wY29kZS5zICRvYmpkaXIvJG9wY29kZS5kIgotfQotCi0jIFJ1biB0aGUgdGVzdHMuCi0KLWlmIFtpc3RhcmdldCBhcmMqLSotKl0gdGhlbiB7Ci0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGFkYyA5Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBhZGQgOAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggYW5kIDEyCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBiaWMgMTQKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIG9yIDEzCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBzYmMgMTEKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIHN1YiAxMAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggeG9yIDE1Ci0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBhbGlhcyBtb3YgMTIKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBhbGlhcyBybGMgOQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIGFzbCA4Ci0jIGBsc2wnIGdldHMgZHVtcGVkIGFzIGBhc2wnIHNvIHRoaXMgbXVzdCBiZSB0ZXN0ZWQgZWxzZXdoZXJlLgotIyAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIGxzbCA4Ci0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgYXNyIDEKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgbHNyIDIKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgcm9yIDMKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgcnJjIDQKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBiIDQKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBicmFuY2ggYmwgNQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBscCA2Ci0KLSAgICBydW5fZHVtcF90ZXN0ICJqIgotCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgc2V4YiA1Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgc2V4dyA2Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgZXh0YiA3Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgZXh0dyA4Ci0KLSAgICBydW5fZHVtcF90ZXN0ICJmbGFnIgotIyAgICBydW5fZHVtcF90ZXN0ICJub3AiCi0KLSAgICBydW5fZHVtcF90ZXN0ICJsZCIKLSAgICBydW5fZHVtcF90ZXN0ICJzdCIKLQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzliMDE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2guZAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBAT0NACi0KLSMgVGVzdCB0aGUgQE9DQCBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8dGV4dF9sYWJlbD4gQElDKzdAZmZmZjgwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAwNCA8dGV4dF9sYWJlbFwrND4gQElDKzdAZmZmZjAwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAwOCA8dGV4dF9sYWJlbFwrOD4gQElDKzdAZmZmZTgwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAwYyA8dGV4dF9sYWJlbFwrYz4gQElDKzdAZmZmZTAxCUBPQ0BlcSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDEwIDx0ZXh0X2xhYmVsXCsxMD4gQElDKzdAZmZmZDgxCUBPQ0BlcSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDE0IDx0ZXh0X2xhYmVsXCsxND4gQElDKzdAZmZmZDAyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDE4IDx0ZXh0X2xhYmVsXCsxOD4gQElDKzdAZmZmYzgyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDFjIDx0ZXh0X2xhYmVsXCsxYz4gQElDKzdAZmZmYzAzCUBPQ0BwIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMjAgPHRleHRfbGFiZWxcKzIwPiBASUMrN0BmZmZiODMJQE9DQHAgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAyNCA8dGV4dF9sYWJlbFwrMjQ+IEBJQys3QGZmZmIwNAlAT0NAbiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDI4IDx0ZXh0X2xhYmVsXCsyOD4gQElDKzdAZmZmYTg0CUBPQ0BuIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMmMgPHRleHRfbGFiZWxcKzJjPiBASUMrN0BmZmZhMDUJQE9DQGMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAzMCA8dGV4dF9sYWJlbFwrMzA+IEBJQys3QGZmZjk4NQlAT0NAYyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDM0IDx0ZXh0X2xhYmVsXCszND4gQElDKzdAZmZmOTA1CUBPQ0BjIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMzggPHRleHRfbGFiZWxcKzM4PiBASUMrN0BmZmY4ODYJQE9DQG5jIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwM2MgPHRleHRfbGFiZWxcKzNjPiBASUMrN0BmZmY4MDYJQE9DQG5jIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNDAgPHRleHRfbGFiZWxcKzQwPiBASUMrN0BmZmY3ODYJQE9DQG5jIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNDQgPHRleHRfbGFiZWxcKzQ0PiBASUMrN0BmZmY3MDcJQE9DQHYgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA0OCA8dGV4dF9sYWJlbFwrNDg+IEBJQys3QGZmZjY4NwlAT0NAdiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDRjIDx0ZXh0X2xhYmVsXCs0Yz4gQElDKzdAZmZmNjA4CUBPQ0BudiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDUwIDx0ZXh0X2xhYmVsXCs1MD4gQElDKzdAZmZmNTg4CUBPQ0BudiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDU0IDx0ZXh0X2xhYmVsXCs1ND4gQElDKzdAZmZmNTA5CUBPQ0BndCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDU4IDx0ZXh0X2xhYmVsXCs1OD4gQElDKzdAZmZmNDhhCUBPQ0BnZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDVjIDx0ZXh0X2xhYmVsXCs1Yz4gQElDKzdAZmZmNDBiCUBPQ0BsdCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDYwIDx0ZXh0X2xhYmVsXCs2MD4gQElDKzdAZmZmMzhjCUBPQ0BsZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDY0IDx0ZXh0X2xhYmVsXCs2ND4gQElDKzdAZmZmMzBkCUBPQ0BoaSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDY4IDx0ZXh0X2xhYmVsXCs2OD4gQElDKzdAZmZmMjhlCUBPQ0BscyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDZjIDx0ZXh0X2xhYmVsXCs2Yz4gQElDKzdAZmZmMjBmCUBPQ0BwbnogMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA3MCA8dGV4dF9sYWJlbFwrNzA+IEBJQys3QGZmZmY4MAlAT0NAIDAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4KLQkJUkVMT0M6IDAwMDAwMDcwIFJfQVJDX0IyMl9QQ1JFTCBleHRlcm5hbF90ZXh0X2xhYmVsCi0wMDAwMDA3NCA8dGV4dF9sYWJlbFwrNzQ+IEBJQyswQDAwMDAwMAlAT0NAIDAwMDAwMDc4IDx0ZXh0X2xhYmVsXCs3OD4KLTAwMDAwMDc4IDx0ZXh0X2xhYmVsXCs3OD4gQElDKzdAZmZmMGEwCUBPQ0AuZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDdjIDx0ZXh0X2xhYmVsXCs3Yz4gQElDKzdAZmZmMDAwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4MCA8dGV4dF9sYWJlbFwrODA+IEBJQys3QGZmZWZjMAlAT0NALmpkIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwODQgPHRleHRfbGFiZWxcKzg0PiBASUMrN0BmZmVmMjEJQE9DQGVxLmQgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4OCA8dGV4dF9sYWJlbFwrODg+IEBJQys3QGZmZWU4MglAT0NAbmUgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4YyA8dGV4dF9sYWJlbFwrOGM+IEBJQys3QGZmZWU0NglAT0NAbmMuamQgMDAwMDAwMDAgPHRleHRfbGFiZWw+CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjE2MTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyBAT0NAIHRlc3QKLQkKLXRleHRfbGFiZWw6Ci0KLSMgQ29uZGl0aW9uIHRlc3RzCi0JQE9DQAl0ZXh0X2xhYmVsCi0JQE9DQGFsCXRleHRfbGFiZWwKLQlAT0NAcmEJdGV4dF9sYWJlbAotCUBPQ0BlcQl0ZXh0X2xhYmVsCi0JQE9DQHoJdGV4dF9sYWJlbAotCUBPQ0BuZQl0ZXh0X2xhYmVsCi0JQE9DQG56CXRleHRfbGFiZWwKLQlAT0NAcGwJdGV4dF9sYWJlbAotCUBPQ0BwCXRleHRfbGFiZWwKLQlAT0NAbWkJdGV4dF9sYWJlbAotCUBPQ0BuCXRleHRfbGFiZWwKLQlAT0NAY3MJdGV4dF9sYWJlbAotCUBPQ0BjCXRleHRfbGFiZWwKLQlAT0NAbG8JdGV4dF9sYWJlbAotCUBPQ0BjYwl0ZXh0X2xhYmVsCi0JQE9DQG5jCXRleHRfbGFiZWwKLQlAT0NAaHMJdGV4dF9sYWJlbAotCUBPQ0B2cwl0ZXh0X2xhYmVsCi0JQE9DQHYJdGV4dF9sYWJlbAotCUBPQ0B2Ywl0ZXh0X2xhYmVsCi0JQE9DQG52CXRleHRfbGFiZWwKLQlAT0NAZ3QJdGV4dF9sYWJlbAotCUBPQ0BnZQl0ZXh0X2xhYmVsCi0JQE9DQGx0CXRleHRfbGFiZWwKLQlAT0NAbGUJdGV4dF9sYWJlbAotCUBPQ0BoaQl0ZXh0X2xhYmVsCi0JQE9DQGxzCXRleHRfbGFiZWwKLQlAT0NAcG56CXRleHRfbGFiZWwKLQotCUBPQ0AJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCi0JQE9DQAkwCi0KLSMgRGVsYXkgc2xvdHMKLQlAT0NALmQJdGV4dF9sYWJlbAotCUBPQ0AubmQJdGV4dF9sYWJlbAotCUBPQ0AuamQJdGV4dF9sYWJlbAotCi0jIENvbmRpdGlvbiB0ZXN0cyBhbmQgZGVsYXkgc2xvdHMKLQlAT0NAZXEuZAl0ZXh0X2xhYmVsCi0JQE9DQG5lLm5kCXRleHRfbGFiZWwKLQlAT0NAY2MuamQJdGV4dF9sYWJlbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9mbGFnLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjM2ZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBmbGFnCi0KLSMgVGVzdCB0aGUgZmxhZyBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1ObyBzeW1ib2xzIGluICJhLm91dCIuCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgMWZhMDAwMDAJZmxhZyByMAotMDAwMDAwMDQgMWZiZjgwMDEJZmxhZyAxCi0wMDAwMDAwOCAxZmJmODAwMglmbGFnIDIKLTAwMDAwMDBjIDFmYmY4MDA0CWZsYWcgNAotMDAwMDAwMTAgMWZiZjgwMDgJZmxhZyA4Ci0wMDAwMDAxNCAxZmJmODAxMAlmbGFnIDE2Ci0wMDAwMDAxOCAxZmJmODAyMAlmbGFnIDMyCi0wMDAwMDAxYyAxZmJmODA0MAlmbGFnIDY0Ci0wMDAwMDAyMCAxZmJmODA4MAlmbGFnIDEyOAotMDAwMDAwMjQgMWZiZjAwMDAJZmxhZyAtMjE0NzQ4MzY0NwotMDAwMDAwMmMgMWZhMDAwMGIJZmxhZy5sdCByMAotMDAwMDAwMzAgMWZiZjAwMDkJZmxhZy5ndCAxCi0wMDAwMDAzOCAxZmJmMDAwOQlmbGFnLmd0IDIKLTAwMDAwMDQwIDFmYmYwMDA5CWZsYWcuZ3QgNAotMDAwMDAwNDggMWZiZjAwMDkJZmxhZy5ndCA4Ci0wMDAwMDA1MCAxZmJmMDAwOQlmbGFnLmd0IDE2Ci0wMDAwMDA1OCAxZmJmMDAwOQlmbGFnLmd0IDMyCi0wMDAwMDA2MCAxZmJmMDAwOQlmbGFnLmd0IDY0Ci0wMDAwMDA2OCAxZmJmMDAwOQlmbGFnLmd0IDEyOAotMDAwMDAwNzAgMWZiZjAwMGEJZmxhZy5nZSAtMjE0NzQ4MzY0NwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9mbGFnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjdhYTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgZmxhZyB0ZXN0Ci0KLQlmbGFnCXIwCi0KLQlmbGFnCTEKLQlmbGFnCTIKLQlmbGFnCTQKLQlmbGFnCTgKLQlmbGFnCTE2Ci0JZmxhZwkzMgotCWZsYWcJNjQKLQlmbGFnCTEyOAotCi0JZmxhZwkweDgwMDAwMDAxCi0KLQlmbGFnLmx0CXIwCi0KLQlmbGFnLmd0CTEKLQlmbGFnLmd0CTIKLQlmbGFnLmd0CTQKLQlmbGFnLmd0CTgKLQlmbGFnLmd0CTE2Ci0JZmxhZy5ndAkzMgotCWZsYWcuZ3QJNjQKLQlmbGFnLmd0CTEyOAotCi0JZmxhZy5nZQkweDgwMDAwMDAxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDIwN2E3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDE4MDBASTMrODBAMDAJQE9DQCByMCxyMQotMDAwMDAwMDQgMWI2ZUBJMyswMEAwMAlAT0NAIGZwLHNwCi0wMDAwMDAwOCAxODFmQEkzKzgwQDAwCUBPQ0AgcjAsMAotMDAwMDAwMGMgMTgzZkBJMys4MUBmZglAT0NAIHIxLC0xCi0wMDAwMDAxMCAxZmUxQEkzKzAwQDAwCUBPQ0AgMCxyMgotMDAwMDAwMTQgMWZlMUBJMys4MUBmZglAT0NAIC0xLHIzCi0wMDAwMDAxOCAxODlmQEkzKzgwQGZmCUBPQ0AgcjQsMjU1Ci0wMDAwMDAxYyAxZmUyQEkzKzgwQGZmCUBPQ0AgMjU1LHI1Ci0wMDAwMDAyMCAxOGRmQEkzKzgxQDAwCUBPQ0AgcjYsLTI1NgotMDAwMDAwMjQgMWZlM0BJMys4MUAwMAlAT0NAIC0yNTYscjcKLTAwMDAwMDI4IDE5MWZASTMrMDBAMDAJQE9DQCByOCwyNTYKLTAwMDAwMDMwIDE5M2ZASTMrMDBAMDAJQE9DQCByOSwtMjU3Ci0wMDAwMDAzOCAxZmM1QEkzKzAwQDAwCUBPQ0AgNTExLHIxMAotMDAwMDAwNDAgMTk3ZkBJMyswMEAwMAlAT0NAIHIxMSwxMTExNjM4NTk0Ci0wMDAwMDA0OCAxZmM2QEkzKzAwQDAwCUBPQ0AgMzA1NDE5ODk2LHIxMgotMDAwMDAwNTAgMWZmZkBJMyswMEBmZglAT0NAIDI1NSwyNTYKLTAwMDAwMDU4IDFmZGZASTMrODBAZmYJQE9DQCAyNTYsMjU1Ci0wMDAwMDA2MCAxODFmQEkzKzAwQDAwCUBPQ0AgcjAsMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCi0wMDAwMDA2OCAxOTQ1QEkzKzgwQDAxCUBPQ0AuZXEgcjEwLHIxMQotMDAwMDAwNmMgMTk4NkBJMys4MEAwMglAT0NALm5lIHIxMixyMTMKLTAwMDAwMDcwIDE5ZGZASTMrMDBAMGIJQE9DQC5sdCByMTQsMAotMDAwMDAwNzggMTlmZkBJMyswMEAwOQlAT0NALmd0IHIxNSw1MTIKLTAwMDAwMDgwIDE4MDBASTMrODFAMDAJQE9DQC5mIHIwLHIxCi0wMDAwMDA4NCAxODVlQEkzKzgwQDAxCUBPQ0AuZiByMiwxCi0wMDAwMDA4OCAxZmEyQEkzKzAwQDAwCUBPQ0AuZiAwLHI0Ci0wMDAwMDA4YyAxOGJmQEkzKzAxQDAwCUBPQ0AuZiByNSw1MTIKLTAwMDAwMDk0IDFmYzNASTMrMDFAMDAJQE9DQC5mIDUxMixyNgotMDAwMDAwOWMgMWZkZkBJMyswMUAwMAlAT0NALmYgNTEyLDUxMgotMDAwMDAwYTQgMTgwMEBJMys4MUAwMQlAT0NALmVxLmYgcjAscjEKLTAwMDAwMGE4IDE4M2ZASTMrMDFAMDIJQE9DQC5uZS5mIHIxLDAKLTAwMDAwMGIwIDFmYzFASTMrMDFAMGIJQE9DQC5sdC5mIDAscjIKLTAwMDAwMGI4IDFmYzFASTMrMDFAMDkJQE9DQC5ndC5mIDEscjIKLTAwMDAwMGMwIDE4MWZASTMrMDFAMGMJQE9DQC5sZS5mIHIwLDUxMgotMDAwMDAwYzggMWZjMUBJMyswMUAwYQlAT0NALmdlLmYgNTEyLHIyCi0wMDAwMDBkMCAxZmRmQEkzKzAxQDA0CUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMmZiODguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIEluc24gMyBAT0NAIHRlc3QKLQotIyByZWcscmVnCi0JQE9DQCByMCxyMQotCUBPQ0AgZnAsc3AKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLDAKLQlAT0NAIHIxLC0xCi0JQE9DQCAwLHIyCi0JQE9DQCAtMSxyMwotCUBPQ0AgcjQsMjU1Ci0JQE9DQCAyNTUscjUKLQlAT0NAIHI2LC0yNTYKLQlAT0NAIC0yNTYscjcKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjgsMjU2Ci0JQE9DQCByOSwtMjU3Ci0JQE9DQCA1MTEscjEwCi0JQE9DQCByMTEsMHg0MjQyNDI0MgotCUBPQ0AgMHgxMjM0NTY3OCxyMTIKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgMjU1LDI1NgotCUBPQ0AgMjU2LDI1NQotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuZXEgcjEwLHIxMQotCUBPQ0AubmUgcjEyLHIxMwotCUBPQ0AubHQgcjE0LDAKLQlAT0NALmd0IHIxNSw1MTIKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEKLQlAT0NALmYgcjIsMQotCUBPQ0AuZiAwLHI0Ci0JQE9DQC5mIHI1LDUxMgotCUBPQ0AuZiA1MTIscjYKLQlAT0NALmYgNTEyLDUxMgotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZwotCUBPQ0AuZXEuZiByMCxyMQotCUBPQ0AubmUuZiByMSwwCi0JQE9DQC5sdC5mIDAscjIKLQlAT0NALmd0LmYgMSxyMgotCUBPQ0AubGUuZiByMCw1MTIKLQlAT0NALmdlLmYgNTEyLHIyCi0JQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9qLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTAzZjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBqCi0KLSMgVGVzdCB0aGUgaiBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8dGV4dF9sYWJlbD4gMzgwMDAwMDAJaiByMAotMDAwMDAwMDQgPHRleHRfbGFiZWxcKzQ+IDM4MDAwMDIwCWouZCByMAotMDAwMDAwMDggPHRleHRfbGFiZWxcKzg+IDM4MDAwMDQwCWouamQgcjAKLTAwMDAwMDBjIDx0ZXh0X2xhYmVsXCtjPiAzODAwMDAwMAlqIHIwCi0wMDAwMDAxMCA8dGV4dF9sYWJlbFwrMTA+IDM4MDA4MDAwCWogcjEKLTAwMDAwMDE0IDx0ZXh0X2xhYmVsXCsxND4gMzgwMDgwMjAJai5kIHIxCi0wMDAwMDAxOCA8dGV4dF9sYWJlbFwrMTg+IDM4MDA4MDQwCWouamQgcjEKLTAwMDAwMDFjIDx0ZXh0X2xhYmVsXCsxYz4gMzgwMDgwMDAJaiByMQotMDAwMDAwMjAgPHRleHRfbGFiZWxcKzIwPiAzODFmMDAwMAlqIDAKLQkJUkVMT0M6IDAwMDAwMDI0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDAyOCA8dGV4dF9sYWJlbFwrMjg+IDM4MWYwMDAwCWogMAotCQlSRUxPQzogMDAwMDAwMmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDMwIDx0ZXh0X2xhYmVsXCszMD4gMzgxZjAwMDAJaiAwCi0JCVJFTE9DOiAwMDAwMDAzNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwMzggPHRleHRfbGFiZWxcKzM4PiAzODFmMDAwMQlqZXEgMAotCQlSRUxPQzogMDAwMDAwM2MgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDQwIDx0ZXh0X2xhYmVsXCs0MD4gMzgxZjAwMDEJamVxIDAKLQkJUkVMT0M6IDAwMDAwMDQ0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDA0OCA8dGV4dF9sYWJlbFwrNDg+IDM4MWYwMDAyCWpuZSAwCi0JCVJFTE9DOiAwMDAwMDA0YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNTAgPHRleHRfbGFiZWxcKzUwPiAzODFmMDAwMglqbmUgMAotCQlSRUxPQzogMDAwMDAwNTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDU4IDx0ZXh0X2xhYmVsXCs1OD4gMzgxZjAwMDMJanAgMAotCQlSRUxPQzogMDAwMDAwNWMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDYwIDx0ZXh0X2xhYmVsXCs2MD4gMzgxZjAwMDMJanAgMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDY4IDx0ZXh0X2xhYmVsXCs2OD4gMzgxZjAwMDQJam4gMAotCQlSRUxPQzogMDAwMDAwNmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4gMzgxZjAwMDQJam4gMAotCQlSRUxPQzogMDAwMDAwNzQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDc4IDx0ZXh0X2xhYmVsXCs3OD4gMzgxZjAwMDUJamMgMAotCQlSRUxPQzogMDAwMDAwN2MgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDgwIDx0ZXh0X2xhYmVsXCs4MD4gMzgxZjAwMDUJamMgMAotCQlSRUxPQzogMDAwMDAwODQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDg4IDx0ZXh0X2xhYmVsXCs4OD4gMzgxZjAwMDUJamMgMAotCQlSRUxPQzogMDAwMDAwOGMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDkwIDx0ZXh0X2xhYmVsXCs5MD4gMzgxZjAwMDYJam5jIDAKLQkJUkVMT0M6IDAwMDAwMDk0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDA5OCA8dGV4dF9sYWJlbFwrOTg+IDM4MWYwMDA2CWpuYyAwCi0JCVJFTE9DOiAwMDAwMDA5YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwYTAgPHRleHRfbGFiZWxcK2EwPiAzODFmMDAwNglqbmMgMAotCQlSRUxPQzogMDAwMDAwYTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGE4IDx0ZXh0X2xhYmVsXCthOD4gMzgxZjAwMDcJanYgMAotCQlSRUxPQzogMDAwMDAwYWMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGIwIDx0ZXh0X2xhYmVsXCtiMD4gMzgxZjAwMDcJanYgMAotCQlSRUxPQzogMDAwMDAwYjQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGI4IDx0ZXh0X2xhYmVsXCtiOD4gMzgxZjAwMDgJam52IDAKLQkJUkVMT0M6IDAwMDAwMGJjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBjMCA8dGV4dF9sYWJlbFwrYzA+IDM4MWYwMDA4CWpudiAwCi0JCVJFTE9DOiAwMDAwMDBjNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwYzggPHRleHRfbGFiZWxcK2M4PiAzODFmMDAwOQlqZ3QgMAotCQlSRUxPQzogMDAwMDAwY2MgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGQwIDx0ZXh0X2xhYmVsXCtkMD4gMzgxZjAwMGEJamdlIDAKLQkJUkVMT0M6IDAwMDAwMGQ0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBkOCA8dGV4dF9sYWJlbFwrZDg+IDM4MWYwMDBiCWpsdCAwCi0JCVJFTE9DOiAwMDAwMDBkYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwZTAgPHRleHRfbGFiZWxcK2UwPiAzODFmMDAwYwlqbGUgMAotCQlSRUxPQzogMDAwMDAwZTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGU4IDx0ZXh0X2xhYmVsXCtlOD4gMzgxZjAwMGQJamhpIDAKLQkJUkVMT0M6IDAwMDAwMGVjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBmMCA8dGV4dF9sYWJlbFwrZjA+IDM4MWYwMDBlCWpscyAwCi0JCVJFTE9DOiAwMDAwMDBmNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwZjggPHRleHRfbGFiZWxcK2Y4PiAzODFmMDAwZglqcG56IDAKLQkJUkVMT0M6IDAwMDAwMGZjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDEwMCA8dGV4dF9sYWJlbFwrMTAwPiAzODFmMDAwMAlqIDAKLQkJUkVMT0M6IDAwMDAwMTA0IFJfQVJDXzMyIGV4dGVybmFsX3RleHRfbGFiZWwKLTAwMDAwMTA4IDx0ZXh0X2xhYmVsXCsxMDg+IDM4MWYwMDAwCWogMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9qLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjFhZjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMgaiB0ZXN0Ci0JCi10ZXh0X2xhYmVsOgkKLQlqCXIwCi0Jai5kCXIwCi0Jai5qZAlyMAotCWoubmQJcjAKLQotCWouZglbcjFdCi0Jai5kLmYJW3IxXQotCWouamQuZglbcjFdCi0Jai5uZC5mCVtyMV0KLQotCWoJdGV4dF9sYWJlbAotCWphbAl0ZXh0X2xhYmVsCi0JanJhCXRleHRfbGFiZWwKLQlqZXEJdGV4dF9sYWJlbAotCWp6CXRleHRfbGFiZWwKLQlqbmUJdGV4dF9sYWJlbAotCWpuegl0ZXh0X2xhYmVsCi0JanBsCXRleHRfbGFiZWwKLQlqcAl0ZXh0X2xhYmVsCi0Jam1pCXRleHRfbGFiZWwKLQlqbgl0ZXh0X2xhYmVsCi0JamNzCXRleHRfbGFiZWwKLQlqYwl0ZXh0X2xhYmVsCi0JamxvCXRleHRfbGFiZWwKLQlqY2MJdGV4dF9sYWJlbAotCWpuYwl0ZXh0X2xhYmVsCi0JamhzCXRleHRfbGFiZWwKLQlqdnMJdGV4dF9sYWJlbAotCWp2CXRleHRfbGFiZWwKLQlqdmMJdGV4dF9sYWJlbAotCWpudgl0ZXh0X2xhYmVsCi0Jamd0CXRleHRfbGFiZWwKLQlqZ2UJdGV4dF9sYWJlbAotCWpsdAl0ZXh0X2xhYmVsCi0JamxlCXRleHRfbGFiZWwKLQlqaGkJdGV4dF9sYWJlbAotCWpscwl0ZXh0X2xhYmVsCi0JanBuegl0ZXh0X2xhYmVsCi0KLQlqCWV4dGVybmFsX3RleHRfbGFiZWwKLQotCWoJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkZDBhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBsZC9scgotCi0jIFRlc3QgdGhlIGxkL2xyIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDA4MDA4MDAwCWxkIHIwLFxbcjFcXQotMDAwMDAwMDQgMDA0MTg4MDAJbGQgcjIsXFtyMyxyNFxdCi0wMDAwMDAwOCAwOGEzMDAwMQlsZCByNSxcW3I2LDFcXQotMDAwMDAwMGMgMDhlNDAxZmYJbGQgcjcsXFtyOCwtMVxdCi0wMDAwMDAxMCAwOTI1MDBmZglsZCByOSxcW3IxMCwyNTVcXQotMDAwMDAwMTQgMDk2NjAxMDAJbGQgcjExLFxbcjEyLC0yNTZcXQotMDAwMDAwMTggMDFhNzdjMDAJbGQgcjEzLFxbcjE0LDI1NlxdCi0wMDAwMDAyMCAwMWU4N2MwMAlsZCByMTUsXFtyMTYsLTI1N1xdCi0wMDAwMDAyOCAwMjNmMzgwMAlsZCByMTcsXFszMDU0MTk4OTYsc3BcXQotMDAwMDAwMzAgMGE3ZjAwMDAJbGQgcjE5LFxbMFxdCi0JCVJFTE9DOiAwMDAwMDAzNCBSX0FSQ18zMiBmb28KLTAwMDAwMDM4IDBhOWYwMDAwCWxkIHIyMCxcWzRcXQotCQlSRUxPQzogMDAwMDAwM2MgUl9BUkNfMzIgZm9vCi0wMDAwMDA0MCAwODFmODQwMAlsZGIgcjAsXFswXF0KLTAwMDAwMDQ0IDA4MWY4ODAwCWxkdyByMCxcWzBcXQotMDAwMDAwNDggMDgxZjgyMDAJbGQueCByMCxcWzBcXQotMDAwMDAwNGMgMDgxZjkwMDAJbGQuYSByMCxcWzBcXQotMDAwMDAwNTAgMDgxZmMwMDAJbGQuZGkgcjAsXFswXF0KLTAwMDAwMDU0IDA4MDA1NjAwCWxkYi54LmEuZGkgcjAsXFtyMFxdCi0wMDAwMDA1OCAwODAwYTAwMAlsciByMCxcW3IxXF0KLTAwMDAwMDVjIDA4NWZhMDAwCWxyIHIyLFxbc3RhdHVzXF0KLTAwMDAwMDYwIDA4N2YyMDAwCWxyIHIzLFxbMzA1NDE5ODk2XF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjY3MTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIGxkL2xyIHRlc3QKLQkKLQlsZAlyMCxbcjFdCi0JbGQJcjIsW3IzLHI0XQotCWxkCXI1LFtyNiwxXQotCWxkCXI3LFtyOCwtMV0KLQlsZAlyOSxbcjEwLDI1NV0KLQlsZAlyMTEsW3IxMiwtMjU2XQotCWxkCXIxMyxbcjE0LDI1Nl0KLQlsZAlyMTUsW3IxNiwtMjU3XQotCWxkCXIxNyxbMHgxMjM0NTY3OCxyMjhdCi0JbGQJcjE5LFtmb29dCi0JbGQJcjIwLFtmb28rNF0KLQotCWxkYglyMCxbMF0KLQlsZHcJcjAsWzBdCi0JbGQueAlyMCxbMF0KLQlsZC5hCXIwLFswXQotCWxkLmRpCXIwLFswXQotCWxkYi54LmEuZGkgcjAsW3IwXQotCi0JbHIJcjAsW3IxXQotCWxyCXIyLFtzdGF0dXNdCi0JbHIJcjMsWzB4MTIzNDU2NzhdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGguZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiNzljNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIEBJQyswQDAwODQwMAlAT0NAIHIwLHIxLHIyCi0wMDAwMDAwNCBASUMrM0A0ZGI4MDAJQE9DQCByMjYsZnAsc3AKLTAwMDAwMDA4IEBJQyszQGFmM2UwMAlAT0NAIGlsaW5rMSxpbGluazIsYmxpbmsKLTAwMDAwMDBjIEBJQys3QDVkZjgwMAlAT0NAIHI1OCxyNTksbHBfY291bnQKLTAwMDAwMDEwIEBJQyswQDAwZmUwMAlAT0NAIHIwLHIxLDAKLTAwMDAwMDE0IEBJQyswQDFmODQwMAlAT0NAIHIwLDAscjIKLTAwMDAwMDE4IEBJQys3QGUwODQwMAlAT0NAIDAscjEscjIKLTAwMDAwMDFjIEBJQyswQDAwZmZmZglAT0NAIHIwLHIxLC0xCi0wMDAwMDAyMCBASUMrMEAxZjg1ZmYJQE9DQCByMCwtMSxyMgotMDAwMDAwMjQgQElDKzdAZTA4NWZmCUBPQ0AgLTEscjEscjIKLTAwMDAwMDI4IEBJQyswQDAwZmVmZglAT0NAIHIwLHIxLDI1NQotMDAwMDAwMmMgQElDKzBAMWY4NGZmCUBPQ0AgcjAsMjU1LHIyCi0wMDAwMDAzMCBASUMrN0BlMDg0ZmYJQE9DQCAyNTUscjEscjIKLTAwMDAwMDM0IEBJQyswQDAwZmYwMAlAT0NAIHIwLHIxLC0yNTYKLTAwMDAwMDM4IEBJQyswQDFmODUwMAlAT0NAIHIwLC0yNTYscjIKLTAwMDAwMDNjIEBJQys3QGUwODUwMAlAT0NAIC0yNTYscjEscjIKLTAwMDAwMDQwIEBJQyswQDAwZmMwMAlAT0NAIHIwLHIxLDI1NgotMDAwMDAwNDggQElDKzBAMWYwNDAwCUBPQ0AgcjAsLTI1NyxyMgotMDAwMDAwNTAgQElDKzdAYzA4NDAwCUBPQ0AgNTExLHIxLHIyCi0wMDAwMDA1OCBASUMrMEAxZjA0MDAJQE9DQCByMCwxMTExNjM4NTk0LHIyCi0wMDAwMDA2MCBASUMrN0BjMGZjMDAJQE9DQCAzMDU0MTk4OTYscjEsMzA1NDE5ODk2Ci0wMDAwMDA2OCBASUMrMEAxZmZjZmYJQE9DQCByMCwyNTUsMjU2Ci0wMDAwMDA3MCBASUMrMEAxZjdlZmYJQE9DQCByMCwyNTYsMjU1Ci0wMDAwMDA3OCBASUMrN0BlMGZjZmYJQE9DQCAyNTUscjEsMjU2Ci0wMDAwMDA4MCBASUMrN0BmZjA0ZmYJQE9DQCAyNTUsMjU2LHIyCi0wMDAwMDA4OCBASUMrN0BjMGZlZmYJQE9DQCAyNTYscjEsMjU1Ci0wMDAwMDA5MCBASUMrN0BkZjg0ZmYJQE9DQCAyNTYsMjU1LHIyCi0wMDAwMDA5OCBASUMrMEAwMGZjMDAJQE9DQCByMCxyMSwwCi0JCVJFTE9DOiAwMDAwMDA5YyBSX0FSQ18zMiBmb28KLTAwMDAwMGEwIEBJQyswQDAwODQwMAlAT0NAIHIwLHIxLHIyCi0wMDAwMDBhNCBASUMrMEA2MjBhMDAJQE9DQCByMyxyNCxyNQotMDAwMDAwYTggQElDKzBAYzM5MDAxCUBPQ0AuZXEgcjYscjcscjgKLTAwMDAwMGFjIEBJQysxQDI1MTYwMQlAT0NALmVxIHI5LHIxMCxyMTEKLTAwMDAwMGIwIEBJQysxQDg2OWMwMglAT0NALm5lIHIxMixyMTMscjE0Ci0wMDAwMDBiNCBASUMrMUBlODIyMDIJQE9DQC5uZSByMTUscjE2LHIxNwotMDAwMDAwYjggQElDKzJANDlhODAzCUBPQ0AucCByMTgscjE5LHIyMAotMDAwMDAwYmMgQElDKzJAYWIyZTAzCUBPQ0AucCByMjEscjIyLHIyMwotMDAwMDAwYzAgQElDKzNAMGNiNDA0CUBPQ0AubiByMjQscjI1LHIyNgotMDAwMDAwYzQgQElDKzNANmUzYTA0CUBPQ0AubiBmcCxzcCxpbGluazEKLTAwMDAwMGM4IEBJQyszQGNmYzAwNQlAT0NALmMgaWxpbmsyLGJsaW5rLHIzMgotMDAwMDAwY2MgQElDKzRAMzE0NjA1CUBPQ0AuYyByMzMscjM0LHIzNQotMDAwMDAwZDAgQElDKzRAOTJjYzA1CUBPQ0AuYyByMzYscjM3LHIzOAotMDAwMDAwZDQgQElDKzRAZjQ1MjA2CUBPQ0AubmMgcjM5LHI0MCxyNDEKLTAwMDAwMGQ4IEBJQys1QDU1ZDgwNglAT0NALm5jIHI0MixyNDMscjQ0Ci0wMDAwMDBkYyBASUMrNUBiNzVlMDYJQE9DQC5uYyByNDUscjQ2LHI0NwotMDAwMDAwZTAgQElDKzZAMThlNDA3CUBPQ0AudiByNDgscjQ5LHI1MAotMDAwMDAwZTQgQElDKzZAN2E2YTA3CUBPQ0AudiByNTEscjUyLHI1MwotMDAwMDAwZTggQElDKzZAZGJmMDA4CUBPQ0AubnYgcjU0LHI1NSxyNTYKLTAwMDAwMGVjIEBJQys3QDNkNzYwOAlAT0NALm52IHI1NyxyNTgscjU5Ci0wMDAwMDBmMCBASUMrN0A5ZTAwMDkJQE9DQC5ndCBscF9jb3VudCxscF9jb3VudCxyMAotMDAwMDAwZjQgQElDKzBAMDA3YzBhCUBPQ0AuZ2UgcjAscjAsMAotMDAwMDAwZmMgQElDKzBAM2YwMjBiCUBPQ0AubHQgcjEsMSxyMQotMDAwMDAxMDQgQElDKzdAYzA4NDBjCUBPQ0AubGUgMixyMSxyMgotMDAwMDAxMGMgQElDKzBAN2YwNjBkCUBPQ0AuaGkgcjMsMyxyMwotMDAwMDAxMTQgQElDKzdAZGYwODBlCUBPQ0AubHMgNCw0LHI0Ci0wMDAwMDExYyBASUMrN0BjMmZjMGYJQE9DQC5wbnogNSxyNSw1Ci0wMDAwMDEyNCBASUMrMEAwMDg1MDAJQE9DQC5mIHIwLHIxLHIyCi0wMDAwMDEyOCBASUMrMEAwMGZhMDEJQE9DQC5mIHIwLHIxLDEKLTAwMDAwMTJjIEBJQyswQDFlODQwMQlAT0NALmYgcjAsMSxyMgotMDAwMDAxMzAgQElDKzdAYTA4NDAwCUBPQ0AuZiAwLHIxLHIyCi0wMDAwMDEzNCBASUMrMEAwMGZkMDAJQE9DQC5mIHIwLHIxLDUxMgotMDAwMDAxM2MgQElDKzBAMWYwNTAwCUBPQ0AuZiByMCw1MTIscjIKLTAwMDAwMTQ0IEBJQys3QGMwODUwMAlAT0NALmYgNTEyLHIxLHIyCi0wMDAwMDE0YyBASUMrMEAwMDg1MDEJQE9DQC5lcS5mIHIwLHIxLHIyCi0wMDAwMDE1MCBASUMrMEAwMGZkMDIJQE9DQC5uZS5mIHIwLHIxLDAKLTAwMDAwMTU4IEBJQyswQDFmMDUwYglAT0NALmx0LmYgcjAsMCxyMgotMDAwMDAxNjAgQElDKzdAYzA4NTA5CUBPQ0AuZ3QuZiAwLHIxLHIyCi0wMDAwMDE2OCBASUMrMEAwMGZkMGMJQE9DQC5sZS5mIHIwLHIxLDUxMgotMDAwMDAxNzAgQElDKzBAMWYwNTBhCUBPQ0AuZ2UuZiByMCw1MTIscjIKLTAwMDAwMTc4IEBJQys3QGMwODUwNAlAT0NALm4uZiA1MTIscjEscjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzUxNjlhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIEBPQ0AgdGVzdAotCi0jIFN0YXkgYXdheSBmcm9tIG9wZXJhbmRzIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50cyAoZWc6CWFkZCByMCxyMSxyMSkuCi0jIFRoZXkgd2lsbCBiZSBkaXNhc3NlbWJsZWQgYXMgdGhleSdyZSBtYWNybyBjb3VudGVycGFydHMgKGVnOiBhc2wgcjAscjEpLgotCi0jIHJlZyxyZWcscmVnCi0JQE9DQCByMCxyMSxyMgotCUBPQ0AgcjI2LGZwLHNwCi0JQE9DQCBpbGluazEsaWxpbmsyLGJsaW5rCi0JQE9DQCByNTgscjU5LGxwX2NvdW50Ci0KLSMgc2hpbW0gdmFsdWVzCi0JQE9DQCByMCxyMSwwCi0JQE9DQCByMCwwLHIyCi0JQE9DQCAwLHIxLHIyCi0JQE9DQCByMCxyMSwtMQotCUBPQ0AgcjAsLTEscjIKLQlAT0NAIC0xLHIxLHIyCi0JQE9DQCByMCxyMSwyNTUKLQlAT0NAIHIwLDI1NSxyMgotCUBPQ0AgMjU1LHIxLHIyCi0JQE9DQCByMCxyMSwtMjU2Ci0JQE9DQCByMCwtMjU2LHIyCi0JQE9DQCAtMjU2LHIxLHIyCi0KLSMgbGltbSB2YWx1ZXMKLQlAT0NAIHIwLHIxLDI1NgotCUBPQ0AgcjAsLTI1NyxyMgotCUBPQ0AgNTExLHIxLHIyCi0JQE9DQCByMCwweDQyNDI0MjQyLHIyCi0JQE9DQCAweDEyMzQ1Njc4LHIxLDB4MTIzNDU2NzgKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgcjAsMjU1LDI1NgotCUBPQ0AgcjAsMjU2LDI1NQotCUBPQ0AgMjU1LHIxLDI1NgotCUBPQ0AgMjU1LDI1NixyMgotCUBPQ0AgMjU2LHIxLDI1NQotCUBPQ0AgMjU2LDI1NSxyMgotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLHIxLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuYWwgcjAscjEscjIKLQlAT0NALnJhIHIzLHI0LHI1Ci0JQE9DQC5lcSByNixyNyxyOAotCUBPQ0AueiByOSxyMTAscjExCi0JQE9DQC5uZSByMTIscjEzLHIxNAotCUBPQ0AubnogcjE1LHIxNixyMTcKLQlAT0NALnBsIHIxOCxyMTkscjIwCi0JQE9DQC5wIHIyMSxyMjIscjIzCi0JQE9DQC5taSByMjQscjI1LHIyNgotCUBPQ0AubiByMjcscjI4LHIyOQotCUBPQ0AuY3MgcjMwLHIzMSxyMzIKLQlAT0NALmMgcjMzLHIzNCxyMzUKLQlAT0NALmxvIHIzNixyMzcscjM4Ci0JQE9DQC5jYyByMzkscjQwLHI0MQotCUBPQ0AubmMgcjQyLHI0MyxyNDQKLQlAT0NALmhzIHI0NSxyNDYscjQ3Ci0JQE9DQC52cyByNDgscjQ5LHI1MAotCUBPQ0AudiByNTEscjUyLHI1MwotCUBPQ0AudmMgcjU0LHI1NSxyNTYKLQlAT0NALm52IHI1NyxyNTgscjU5Ci0JQE9DQC5ndCByNjAscjYwLHIwCi0JQE9DQC5nZSByMCxyMCwwCi0JQE9DQC5sdCByMSwxLHIxCi0JQE9DQC5sZSAyLHIxLHIyCi0JQE9DQC5oaSByMywzLHIzCi0JQE9DQC5scyA0LDQscjQKLQlAT0NALnBueiA1LHI1LDUKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEscjIKLQlAT0NALmYgcjAscjEsMQotCUBPQ0AuZiByMCwxLHIyCi0JQE9DQC5mIDAscjEscjIKLQlAT0NALmYgcjAscjEsNTEyCi0JQE9DQC5mIHIwLDUxMixyMgotCUBPQ0AuZiA1MTIscjEscjIKLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKLQlAT0NALmVxLmYgcjAscjEscjIKLQlAT0NALm5lLmYgcjAscjEsMAotCUBPQ0AubHQuZiByMCwwLHIyCi0JQE9DQC5ndC5mIDAscjEscjIKLQlAT0NALmxlLmYgcjAscjEsNTEyCi0JQE9DQC5nZS5mIHIwLDUxMixyMgotCUBPQ0Aubi5mIDUxMixyMSxyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDIwN2E3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQuZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBAT0NACi0KLSMgVGVzdCB0aGUgQE9DQCBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCAxODAwQEkzKzgwQDAwCUBPQ0AgcjAscjEKLTAwMDAwMDA0IDFiNmVASTMrMDBAMDAJQE9DQCBmcCxzcAotMDAwMDAwMDggMTgxZkBJMys4MEAwMAlAT0NAIHIwLDAKLTAwMDAwMDBjIDE4M2ZASTMrODFAZmYJQE9DQCByMSwtMQotMDAwMDAwMTAgMWZlMUBJMyswMEAwMAlAT0NAIDAscjIKLTAwMDAwMDE0IDFmZTFASTMrODFAZmYJQE9DQCAtMSxyMwotMDAwMDAwMTggMTg5ZkBJMys4MEBmZglAT0NAIHI0LDI1NQotMDAwMDAwMWMgMWZlMkBJMys4MEBmZglAT0NAIDI1NSxyNQotMDAwMDAwMjAgMThkZkBJMys4MUAwMAlAT0NAIHI2LC0yNTYKLTAwMDAwMDI0IDFmZTNASTMrODFAMDAJQE9DQCAtMjU2LHI3Ci0wMDAwMDAyOCAxOTFmQEkzKzAwQDAwCUBPQ0AgcjgsMjU2Ci0wMDAwMDAzMCAxOTNmQEkzKzAwQDAwCUBPQ0AgcjksLTI1NwotMDAwMDAwMzggMWZjNUBJMyswMEAwMAlAT0NAIDUxMSxyMTAKLTAwMDAwMDQwIDE5N2ZASTMrMDBAMDAJQE9DQCByMTEsMTExMTYzODU5NAotMDAwMDAwNDggMWZjNkBJMyswMEAwMAlAT0NAIDMwNTQxOTg5NixyMTIKLTAwMDAwMDUwIDFmZmZASTMrMDBAZmYJQE9DQCAyNTUsMjU2Ci0wMDAwMDA1OCAxZmRmQEkzKzgwQGZmCUBPQ0AgMjU2LDI1NQotMDAwMDAwNjAgMTgxZkBJMyswMEAwMAlAT0NAIHIwLDAKLQkJUkVMT0M6IDAwMDAwMDY0IFJfQVJDXzMyIGZvbwotMDAwMDAwNjggMTk0NUBJMys4MEAwMQlAT0NALmVxIHIxMCxyMTEKLTAwMDAwMDZjIDE5ODZASTMrODBAMDIJQE9DQC5uZSByMTIscjEzCi0wMDAwMDA3MCAxOWRmQEkzKzAwQDBiCUBPQ0AubHQgcjE0LDAKLTAwMDAwMDc4IDE5ZmZASTMrMDBAMDkJQE9DQC5ndCByMTUsNTEyCi0wMDAwMDA4MCAxODAwQEkzKzgxQDAwCUBPQ0AuZiByMCxyMQotMDAwMDAwODQgMTg1ZUBJMys4MEAwMQlAT0NALmYgcjIsMQotMDAwMDAwODggMWZhMkBJMyswMEAwMAlAT0NALmYgMCxyNAotMDAwMDAwOGMgMThiZkBJMyswMUAwMAlAT0NALmYgcjUsNTEyCi0wMDAwMDA5NCAxZmMzQEkzKzAxQDAwCUBPQ0AuZiA1MTIscjYKLTAwMDAwMDljIDFmZGZASTMrMDFAMDAJQE9DQC5mIDUxMiw1MTIKLTAwMDAwMGE0IDE4MDBASTMrODFAMDEJQE9DQC5lcS5mIHIwLHIxCi0wMDAwMDBhOCAxODNmQEkzKzAxQDAyCUBPQ0AubmUuZiByMSwwCi0wMDAwMDBiMCAxZmMxQEkzKzAxQDBiCUBPQ0AubHQuZiAwLHIyCi0wMDAwMDBiOCAxZmMxQEkzKzAxQDA5CUBPQ0AuZ3QuZiAxLHIyCi0wMDAwMDBjMCAxODFmQEkzKzAxQDBjCUBPQ0AubGUuZiByMCw1MTIKLTAwMDAwMGM4IDFmYzFASTMrMDFAMGEJQE9DQC5nZS5mIDUxMixyMgotMDAwMDAwZDAgMWZkZkBJMyswMUAwNAlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmE2NjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBTaW5nbGUgc2hpZnQgQE9DQCB0ZXN0Ci0KLSMgcmVnLHJlZwotCUBPQ0AgcjAscjEKLQlAT0NAIGZwLHNwCi0KLSMgc2hpbW0gdmFsdWVzCi0JQE9DQCByMCwwCi0JQE9DQCByMSwtMQotCUBPQ0AgMCxyMgotCUBPQ0AgLTEscjMKLQlAT0NAIHI0LDI1NQotCUBPQ0AgMjU1LHI1Ci0JQE9DQCByNiwtMjU2Ci0JQE9DQCAtMjU2LHI3Ci0KLSMgbGltbSB2YWx1ZXMKLQlAT0NAIHI4LDI1NgotCUBPQ0AgcjksLTI1NwotCUBPQ0AgNTExLHIxMAotCUBPQ0AgcjExLDB4NDI0MjQyNDIKLQlAT0NAIDB4MTIzNDU2NzgscjEyCi0KLSMgc2hpbW0gYW5kIGxpbW0KLQlAT0NAIDI1NSwyNTYKLQlAT0NAIDI1NiwyNTUKLQotIyBzeW1ib2xzCi0JQE9DQCByMCxmb28KLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24KLQlAT0NALmVxIHIxMCxyMTEKLQlAT0NALm5lIHIxMixyMTMKLQlAT0NALmx0IHIxNCwwCi0JQE9DQC5ndCByMTUsNTEyCi0KLSMgZmxhZyBzZXR0aW5nCi0JQE9DQC5mIHIwLHIxCi0JQE9DQC5mIHIyLDEKLQlAT0NALmYgMCxyNAotCUBPQ0AuZiByNSw1MTIKLQlAT0NALmYgNTEyLHI2Ci0JQE9DQC5mIDUxMiw1MTIKLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKLQlAT0NALmVxLmYgcjAscjEKLQlAT0NALm5lLmYgcjEsMAotCUBPQ0AubHQuZiAwLHIyCi0JQE9DQC5ndC5mIDEscjIKLQlAT0NALmxlLmYgcjAsNTEyCi0JQE9DQC5nZS5mIDUxMixyMgotCUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTk5YTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3Qvc3IKLQotIyBUZXN0IHRoZSBzdC9zciBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCAxMDAwODAwMAlzdCByMCxcW3IxXF0KLTAwMDAwMDA0IDEwMDMwYTAxCXN0IHI1LFxbcjYsMVxdCi0wMDAwMDAwOCAxMDA0MGZmZglzdCByNyxcW3I4LC0xXF0KLTAwMDAwMDBjIDEwMDUxMmZmCXN0IHI5LFxbcjEwLDI1NVxdCi0wMDAwMDAxMCAxMDA2MTcwMAlzdCByMTEsXFtyMTIsLTI1NlxdCi0wMDAwMDAxNCAxMDFmMjYwMAlzdCByMTksXFswXF0KLQkJUkVMT0M6IDAwMDAwMDE4IFJfQVJDXzMyIGZvbwotMDAwMDAwMWMgMTAxZjI4MDAJc3QgcjIwLFxbNFxdCi0JCVJFTE9DOiAwMDAwMDAyMCBSX0FSQ18zMiBmb28KLTAwMDAwMDI0IDEwNWYwMDAwCXN0YiByMCxcWzBcXQotMDAwMDAwMmMgMTA5ZjAwMDAJc3R3IHIwLFxbMFxdCi0wMDAwMDAzNCAxMTFmMDAwMAlzdC5hIHIwLFxbMFxdCi0wMDAwMDAzYyAxNDFmMDAwMAlzdC5kaSByMCxcWzBcXQotMDAwMDAwNDQgMTU0MDAwMDAJc3RiLmEuZGkgcjAsXFtyMFxdCi0wMDAwMDA0OCAxMjAwODAwMAlzciByMCxcW3IxXF0KLTAwMDAwMDRjIDEyMWY4NDAwCXNyIHIyLFxbc3RhdHVzXF0KLTAwMDAwMDUwIDEyMWYwNjAwCXNyIHIzLFxbMzA1NDE5ODk2XF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWYxOTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIHN0L3NyIHRlc3QKLQkKLQlzdAlyMCxbcjFdCi0Jc3QJcjUsW3I2LDFdCi0Jc3QJcjcsW3I4LC0xXQotCXN0CXI5LFtyMTAsMjU1XQotCXN0CXIxMSxbcjEyLC0yNTZdCi0Jc3QJcjE5LFtmb29dCi0Jc3QJcjIwLFtmb28rNF0KLQotCXN0YglyMCxbMF0KLQlzdHcJcjAsWzBdCi0Jc3QuYQlyMCxbMF0KLQlzdC5kaQlyMCxbMF0KLQlzdGIuYS5kaSByMCxbcjBdCi0KLQlzcglyMCxbcjFdCi0Jc3IJcjIsW3N0YXR1c10KLQlzcglyMyxbMHgxMjM0NTY3OF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmZjEyNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIFRlc3QgYXNzZW1ibGVyIHdhcm5pbmdzLgotCi1pZiBbaXN0YXJnZXQgYXJjKi0qLSpdIHsKLQotICAgIGxvYWRfbGliIGdhcy1kZy5leHAKLQotICAgIGRnLWluaXQKLQotICAgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci93YXJuKi5zXV0gIiIgIiIKLQotICAgIGRnLWZpbmlzaAotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjYjQzNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotOyBUZXN0IEFSQyBzcGVjaWZpYyBhc3NlbWJsZXIgd2FybmluZ3MKLTsKLTsgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBhcmMtKi0qIH0gfQotCi0JYi5kIGZvbwotCW1vdiByMCwyNTYJOyB7IGRnLXdhcm5pbmcgIjggYnl0ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IiAiOCBieXRlIGluc24gaW4gZGVsYXkgc2xvdCIgfQotCi0Jai5kIGZvbwkJOyB7IGRnLXdhcm5pbmcgIjggYnl0ZSBqdW1wIGluc3RydWN0aW9uIHdpdGggZGVsYXkgc2xvdCIgIjggYnl0ZSBqdW1wIHdpdGggZGVsYXkgc2xvdCIgfQotCW1vdiByMCxyMQotCi0Jc3ViLmYgMCxyMCxyMgotCWJlcSBmb28JCTsgeyBkZy13YXJuaW5nICJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiICJjYyBzZXQvYnJhbmNoIG5vcCB0ZXN0IiB9Ci0KLWZvbzoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyOGY3Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJjaDR0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0udGV4dAotLmFsaWduIDAKLQkKLQlieAlyMAotCWJ4ZXEJcjEKLQotZm9vOgkKLQlsZHJoCXIzLCBmb28KLQlsZHJzaAlyNCwgW3I1XQotCWxkcnNiCXI0LCBbcjEsIHIzXQotCWxkcnNoCXIxLCBbcjQsIHI0XSEKLQlsZHJlcXNiCXIxLCBbcjUsIC1yM10KLQlsZHJuZWgJcjIsIFtyNl0sIHI3Ci0JbGRyY2NzaCByMiwgW3I3XSwgK3I4Ci0JbGRyc2IJcjIsIFtyMywgIzI1NV0KLQlsZHJzaAlyMSwgW3I0LCAjLTI1MF0KLQlsZHJzYglyMSwgW3I1LCAjKzI0MF0KLQotCXN0cmgJcjIsIGJhcgotCXN0cm5laAlyMywgW3IzXQotYmFyOgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxYzU0ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgU29tZSBBUk0gdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBhcm0tKi0qXSB0aGVuIHsKLSAgICBydW5fZHVtcF90ZXN0ICJpbnN0IgotCi0gICAgZ2FzX3Rlc3QgImFybTMucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSAzIGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJhcm02LnMiICIiICRzdGRvcHRsaXN0ICJBcm0gNiBpbnN0cnVjdGlvbnMiCi0KLSAgICBnYXNfdGVzdCAiYXJtN2RtLnMiICIiICRzdGRvcHRsaXN0ICJBcm0gN0RNIGluc3RydWN0aW9ucyIKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImFybTd0IgotCi0gICAgZ2FzX3Rlc3QgInRodW1iLnMiICIiICRzdGRvcHRsaXN0ICJUaHVtYiBpbnN0cnVjdGlvbnMiCi0KLSAgICBnYXNfdGVzdCAiYXJjaDR0LnMiICIiICRzdGRvcHRsaXN0ICJBcm0gYXJjaGl0ZWN0dXJlIDR0IGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJjb3Byby5zIiAiIiAkc3Rkb3B0bGlzdCAiQ28gcHJvY2Vzc29yIGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJpbW1lZC5zIiAiIiAkc3Rkb3B0bGlzdCAiaW1tZWRpYXRlIGV4cHJlc3Npb25zIgotCi0gICAgZ2FzX3Rlc3QgImZsb2F0LnMiICIiICRzdGRvcHRsaXN0ICJDb3JlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyIKLX0KLQotIyBOb3QgYWxsIGFybSB0YXJnZXRzIGFyZSBiaS1lbmRpYW4sIHNvIG9ubHkgcnVuIHRoaXMgdGVzdCBvbiBvbmVzCi0jIHdlIGtub3cgdGhhdCBhcmUuICBGSVhNRTogV2Ugc2hvdWxkIHByb2JhYmx5IGFsc28ga2V5IG9mZiBhcm1lYi9hcm1lbC4KLQotaWYgW2lzdGFyZ2V0IGFybS0qLXBlXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAibGUtZnBjb25zdCIKLQotICAgICMgU2luY2UgYmlnLWVuZGlhbiBudW1iZXJzIGhhdmUgdGhlIG5vcm1hbCBmb3JtYXQsIHRoaXMgZG9lc24ndCBleGlzdC4KLSAgICAjcnVuX2R1bXBfdGVzdCAiYmUtZnBjb25zdCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0zLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNmOTE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCXN3cAlyMCwgcjEsIFtyOF0KLQlzd3BiCXIyLCByMywgW3IzXQotCXN3cGdlYglyNCwgcjEsIFtyNF0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm02LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTE3MTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCQotCW1ycwlyOCwgY3BzcgotCW1yc2VxCXI5LCBjcHNyX2FsbAotCW1ycwlyMiwgc3BzcgotCi0JbXNyCWNwc3IsIHIxCi0JbXNybmUJY3Bzcl9mbGcsICMweGYwMDAwMDAwCi0JbXNyCXNwc3JfZmxnLCByOAotCW1zcglzcHNyX2FsbCwgcjkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTdkbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTdkbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk2YzcwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03ZG0ucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCQotCXNtdWxsCXIwLCByMSwgcjIsIHIzCi0JdW11bGwJcjAsIHIxLCByMiwgcjMKLQlzbWxhbAlyMCwgcjEsIHIyLCByMwotCXVtbGFsCXIwLCByMSwgcjQsIHIzCi0KLQlzbXVsbG5lCXIwLCByMSwgcjMsIHI0Ci0Jc211bGxzCXIxLCByMCwgcjksIHIxMQotCXVtbGFsZXFzIHIyLCByOSwgcjQsIHI5Ci0Jc21sYWxnZSByMTQsIHIxMCwgcjgsIHIxNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMTRlZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgotI25hbWU6IEFSTSBhcm03dAotI2FzOiAtbWFybTd0IC1FTAotCi0jIFRlc3QgdGhlIGhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5kIG1lbW9yeSB0cmFuc2ZlcnM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgPFtePl0qPiBlMWQxMDBiMCA/CWxkcmgJcjAsIFxbcjFcXQotMDAwMDAwMDQgPFtePl0qPiBlMWYxMDBiMCA/CWxkcmgJcjAsIFxbcjFcXSEKLTAwMDAwMDA4IDxbXj5dKj4gZTE5MTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDAwYyA8W14+XSo+IGUxYjEwMGIyID8JbGRyaAlyMCwgXFtyMSwgcjJcXSEKLTAwMDAwMDEwIDxbXj5dKj4gZTFkMTAwYmMgPwlsZHJoCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwMTQgPFtePl0qPiBlMWYxMDBiYyA/CWxkcmgJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwMTggPFtePl0qPiBlMTUxMDBiYyA/CWxkcmgJcjAsIFxbcjEsIC0jMTJcXQotMDAwMDAwMWMgPFtePl0qPiBlMDkxMDBiMiA/CWxkcmgJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDIwIDxbXj5dKj4gZTNhMDBjZmYgPwltb3YJcjAsICM2NTI4MAk7IDB4ZmYwMAotMDAwMDAwMjQgPFtePl0qPiBlMWRmMGJiNCA/CWxkcmgJcjAsIFxbcGMsICNiNFxdCTsgMDAwMDAwZTAgPFtePl0qPgotMDAwMDAwMjggPFtePl0qPiBlMWRmMGFiYyA/CWxkcmgJcjAsIFxbcGMsICNhY1xdCTsgMDAwMDAwZGMgPFtePl0qPgotMDAwMDAwMmMgPFtePl0qPiBlMWMxMDBiMCA/CXN0cmgJcjAsIFxbcjFcXQotMDAwMDAwMzAgPFtePl0qPiBlMWUxMDBiMCA/CXN0cmgJcjAsIFxbcjFcXSEKLTAwMDAwMDM0IDxbXj5dKj4gZTE4MTAwYjIgPwlzdHJoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDAzOCA8W14+XSo+IGUxYTEwMGIyID8Jc3RyaAlyMCwgXFtyMSwgcjJcXSEKLTAwMDAwMDNjIDxbXj5dKj4gZTFjMTAwYmMgPwlzdHJoCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwNDAgPFtePl0qPiBlMWUxMDBiYyA/CXN0cmgJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwNDQgPFtePl0qPiBlMTQxMDBiYyA/CXN0cmgJcjAsIFxbcjEsIC0jMTJcXQotMDAwMDAwNDggPFtePl0qPiBlMDgxMDBiMiA/CXN0cmgJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDRjIDxbXj5dKj4gZTFjZjA4YjggPwlzdHJoCXIwLCBcW3BjLCAjODhcXQk7IDAwMDAwMGRjIDxbXj5dKj4KLTAwMDAwMDUwIDxbXj5dKj4gZTFkMTAwZDAgPwlsZHJzYglyMCwgXFtyMVxdCi0wMDAwMDA1NCA8W14+XSo+IGUxZjEwMGQwID8JbGRyc2IJcjAsIFxbcjFcXSEKLTAwMDAwMDU4IDxbXj5dKj4gZTE5MTAwZDIgPwlsZHJzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwNWMgPFtePl0qPiBlMWIxMDBkMiA/CWxkcnNiCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwNjAgPFtePl0qPiBlMWQxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwNjQgPFtePl0qPiBlMWYxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAjMTJcXSEKLTAwMDAwMDY4IDxbXj5dKj4gZTE1MTAwZGMgPwlsZHJzYglyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDA2YyA8W14+XSo+IGUwOTEwMGQyID8JbGRyc2IJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDcwIDxbXj5dKj4gZTNhMDAwZGUgPwltb3YJcjAsICMyMjIJOyAweGRlCi0wMDAwMDA3NCA8W14+XSo+IGUxZGYwNmQwID8JbGRyc2IJcjAsIFxbcGMsICM2MFxdCTsgMDAwMDAwZGMgPFtePl0qPgotMDAwMDAwNzggPFtePl0qPiBlMWQxMDBmMCA/CWxkcnNoCXIwLCBcW3IxXF0KLTAwMDAwMDdjIDxbXj5dKj4gZTFmMTAwZjAgPwlsZHJzaAlyMCwgXFtyMVxdIQotMDAwMDAwODAgPFtePl0qPiBlMTkxMDBmMiA/CWxkcnNoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDA4NCA8W14+XSo+IGUxYjEwMGYyID8JbGRyc2gJcjAsIFxbcjEsIHIyXF0hCi0wMDAwMDA4OCA8W14+XSo+IGUxZDEwMGZjID8JbGRyc2gJcjAsIFxbcjEsICMxMlxdCi0wMDAwMDA4YyA8W14+XSo+IGUxZjEwMGZjID8JbGRyc2gJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwOTAgPFtePl0qPiBlMTUxMDBmYyA/CWxkcnNoCXIwLCBcW3IxLCAtIzEyXF0KLTAwMDAwMDk0IDxbXj5dKj4gZTA5MTAwZjIgPwlsZHJzaAlyMCwgXFtyMVxdLCByMgotMDAwMDAwOTggPFtePl0qPiBlM2EwMGNmZiA/CW1vdglyMCwgIzY1MjgwCTsgMHhmZjAwCi0wMDAwMDA5YyA8W14+XSo+IGUxZGYwM2ZjID8JbGRyc2gJcjAsIFxbcGMsICMzY1xdCTsgMDAwMDAwZTAgPFtePl0qPgotMDAwMDAwYTAgPFtePl0qPiBlMWRmMDNmNCA/CWxkcnNoCXIwLCBcW3BjLCAjMzRcXQk7IDAwMDAwMGRjIDxbXj5dKj4KLTAwMDAwMGE0IDxbXj5dKj4gZTE5MTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBhOCA8W14+XSo+IDExOTEwMGIyID8JbGRybmVoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBhYyA8W14+XSo+IDgxOTEwMGIyID8JbGRyaGloCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiMCA8W14+XSo+IGIxOTEwMGIyID8JbGRybHRoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiNCA8W14+XSo+IGUxOTEwMGYyID8JbGRyc2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGI4IDxbXj5dKj4gMTE5MTAwZjIgPwlsZHJuZXNoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiYyA8W14+XSo+IDgxOTEwMGYyID8JbGRyaGlzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYzAgPFtePl0qPiBiMTkxMDBmMiA/CWxkcmx0c2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGM0IDxbXj5dKj4gZTE5MTAwZDIgPwlsZHJzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwYzggPFtePl0qPiAxMTkxMDBkMiA/CWxkcm5lc2IJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGNjIDxbXj5dKj4gODE5MTAwZDIgPwlsZHJoaXNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBkMCA8W14+XSo+IGIxOTEwMGQyID8JbGRybHRzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwZDQgPFtePl0qPiBlMWRmMDBmNCA/CWxkcnNoCXIwLCBcW3BjLCAjNFxdCTsgMDAwMDAwZTAgPFtePl0qPgotMDAwMDAwZDggPFtePl0qPiBlMWRmMDBmNCA/CWxkcnNoCXIwLCBcW3BjLCAjNFxdCTsgMDAwMDAwZTQgPFtePl0qPgotMDAwMDAwZGMgPFtePl0qPiAwMDAwMDAwMCA/CWFuZGVxCXIwLCByMCwgcjAKLVsJCV0qZGM6LipmcmVkCi0wMDAwMDBlMCA8W14+XSo+IDAwMDBjMGRlID8JLioKLTAwMDAwMGU0IDxbXj5dKj4gMDAwMGRlYWQgPwkuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NTc1Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QucworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLQkudGV4dAotCS5hbGlnbgkwCi0KLWxvYWRoYWxmd29yZHM6Ci0JbGRyaAlyMCwgW3IxXQotCWxkcmgJcjAsIFtyMV0hCi0JbGRyaAlyMCwgW3IxLCByMl0KLQlsZHJoCXIwLCBbcjEsIHIyXSEKLQlsZHJoCXIwLCBbcjEsIzB4MENdCi0JbGRyaAlyMCwgW3IxLCMweDBDXSEKLQlsZHJoCXIwLCBbcjEsIy0weDBDXQotCWxkcmgJcjAsIFtyMV0sIHIyCi0JbGRyaAlyMCwgPTB4RkYwMAotCWxkcmgJcjAsID0weEMwREUKLQlsZHJoCXIwLCAuTDIKLQotc3RvcmVoYWxmd29yZHM6Ci0Jc3RyaAlyMCwgW3IxXQotCXN0cmgJcjAsIFtyMV0hCi0Jc3RyaAlyMCwgW3IxLCByMl0KLQlzdHJoCXIwLCBbcjEsIHIyXSEKLQlzdHJoCXIwLCBbcjEsIzB4MENdCi0Jc3RyaAlyMCwgW3IxLCMweDBDXSEKLQlzdHJoCXIwLCBbcjEsIy0weDBDXQotCXN0cmgJcjAsIFtyMV0sIHIyCi0Jc3RyaAlyMCwgLkwyCi0KLWxvYWRzaWduZWRieXRlczoKLQlsZHJzYglyMCwgW3IxXQotCWxkcnNiCXIwLCBbcjFdIQotCWxkcnNiCXIwLCBbcjEsIHIyXQotCWxkcnNiCXIwLCBbcjEsIHIyXSEKLQlsZHJzYglyMCwgW3IxLCMweDBDXQotCWxkcnNiCXIwLCBbcjEsIzB4MENdIQotCWxkcnNiCXIwLCBbcjEsIy0weDBDXQotCWxkcnNiCXIwLCBbcjFdLCByMgotCWxkcnNiCXIwLCA9MHhERQotCWxkcnNiCXIwLCAuTDIKLQotbG9hZHNpZ25lZGhhbGZ3b3JkczoKLQlsZHJzaAlyMCwgW3IxXQotCWxkcnNoCXIwLCBbcjFdIQotCWxkcnNoCXIwLCBbcjEsIHIyXQotCWxkcnNoCXIwLCBbcjEsIHIyXSEKLQlsZHJzaAlyMCwgW3IxLCAjMHgwQ10KLQlsZHJzaAlyMCwgW3IxLCAjMHgwQ10hCi0JbGRyc2gJcjAsIFtyMSwgIy0weDBDXQotCWxkcnNoCXIwLCBbcjFdLCByMgotCWxkcnNoCXIwLCA9MHhGRjAwCi0JbGRyc2gJcjAsID0weEMwREUKLQlsZHJzaAlyMCwgLkwyCi0JCi1taXNjOgotCWxkcmFsaAlyMCwgW3IxLCByMl0KLQlsZHJuZWgJcjAsIFtyMSwgcjJdCi0JbGRyaGloCXIwLCBbcjEsIHIyXQotCWxkcmx0aAlyMCwgW3IxLCByMl0KLQotCWxkcmFsc2gJcjAsIFtyMSwgcjJdCi0JbGRybmVzaAlyMCwgW3IxLCByMl0KLQlsZHJoaXNoCXIwLCBbcjEsIHIyXQotCWxkcmx0c2gJcjAsIFtyMSwgcjJdCi0KLQlsZHJhbHNiCXIwLCBbcjEsIHIyXQotCWxkcm5lc2IJcjAsIFtyMSwgcjJdCi0JbGRyaGlzYglyMCwgW3IxLCByMl0KLQlsZHJsdHNiCXIwLCBbcjEsIHIyXQotCi0JbGRyc2gJcjAsID0weEMwREUKLQlsZHJzaAlyMCwgPTB4REVBRAotCi0JLmFsaWduCi0uTDI6Ci0JLndvcmQJZnJlZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2NvcHJvLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vY29wcm8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjOWI5Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vY29wcm8ucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCWNkcAlwMSwgNCwgY3IxLCBjcjIsIGNyMwotCWNkcGVxCTQsIDMsIGMxLCBjNCwgY3I1LCA1Ci0KLQlsZGMJNSwgY3I5LCBbcjNdCi0JbGRjbAkxLCBjcjE0LCBbcjEsICMzMl0KLQlsZGNtaQkwLCBjcjAsIFtyMiwgIzEwMjBdIQotCWxkY3BsbAlwNywgYzEsIFtyM10sICM2NAotCWxkYwlwMCwgYzgsIGZvbwotZm9vOgotCi0Jc3RjCTUsIGNyMCwgW3IzXQotCXN0Y2wJMywgY3IxNSwgW3IwLCAjOF0KLQlzdGNlcQlwNCwgY3IxMiwgW3IyLCAjMTAwXSEKLQlzdGNjYwlwNiwgYzgsIFtyNF0sICM0OAotCXN0YwlwMSwgYzcsIGJhcgotYmFyOgotCi0JbXJjCTIsIDMsIHI1LCBjMSwgYzIKLQltcmNnZQlwNCwgNSwgcjE1LCBjcjEsIGNyMiwgNwotCi0JbWNyCXA3LCAxLCByMTUsIGNyMSwgY3IxCi0JbWNybHQJNSwgMSwgcjgsIGNyMiwgY3I5LCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWRmNDU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCW12ZmUJZjAsIGYxCi0JbXZmZXFlCWYzLCBmNQotCW12ZmVxZAlmNCwgIzEuMAotCW12ZnMJZjQsIGY3Ci0JbXZmc3AJczAsIHMxCi0JbXZmZG0JczMsIHM0Ci0JbXZmZXoJczcsIHM3Ci0KLQlhZGZlCWYwLCBmMSwgIzIuMAotCWFkZmVxZQlmMSwgczIsICMwLjUKLQlhZGZzbQlmMywgZjQsIHM1Ci0JCi0Jc3VmZAlkMCwgZjAsICMyLjAKLQlzdWZzCWQxLCBkMiwgIzEwLjAKLQlzdWZuZWV6IGQzLCBkNCwgZDUKLQotCXJzZnMJZjEsIGYxLCAjMC4wCi0JcnNmZHAJZjMsIGYwLCAjNS4wCi0JcnNmbGVkCWY3LCBzNiwgZjAKLQotCW11ZmQJZjAsIGYwLCBmMAotCW11ZmV6CWYxLCBmMiwgIzMuMAotCW11ZmFscwlmMCwgZjAsICM0LjAKLQotCWR2ZmQJZjAsIGYwLCAjMS4wMDAwCi0JZHZmZXoJZjAsIGYxLCAjMTBlMAotCWR2Zm1pc20gZjMsIGY0LCBmNQotCi0JcmRmZQlmMCwgZjEsICMxLjBlMQotCXJkZnMJZjMsIGY3LCAjMGYxCi0JcmRmY2NkcAlmNCwgZjQsIGYzCi0KLQlwb3dkCWYwLCBmMiwgZjMKLQlwb3dzCWYxLCBmMywgIzBlMWUxCi0JcG93Y3NleglmNCwgZDcsICMxCi0KLQlycHdzCWY3LCBkNiwgZjcKLQlycHdlcWQJZjAsIGYxLCBmMgotCXJwd2VtCWYyLCBmMiwgZjMKLQotCXJtZmQJZjEsIGYyLCAjMwotCXJtZnZzcwlmMywgZjQsIGY0Ci0Jcm1mZXAJZjQsIGY3LCBmMAotCi0JZm1scwlmMCwgZjEsIGYyCi0JZm1sZXFzCWYxLCBmMywgZjUKLQlmbWxwbHN6CWY0LCBmNiwgZjAKLQotCWZkdnMJZjEsIGYzLCAjMTAKLQlmZHZzcAlmMCwgZjEsIGYyCi0JZmR2aHNzbQlmNCwgZjQsIGY0Ci0KLQlmcmRzCWYxLCBmMSwgIzEuMAotCWZyZGd0cwlmMiwgZjEsIGYwCi0JZnJkZ3RzeglmNCwgZjQsIGY1Ci0KLQlwb2xkCWYwLCBmMSwgZjIKLQlwb2xzeglmNCwgZjYsICMzLjAKLQlwb2xlcWUJZjUsIGY2LCBmNwotCi0JbW5mcwlmMCwgZjEKLQltbmZkCWYwLCAjMy4wCi0JbW5mZXoJZjAsICM0LjAKLQltbmZlcWV6IGYwLCBmNQotCW1uZnNwCWYwLCBmNAotCW1uZmRtCWYxLCBmNwotCi0JYWJzZAlmMCwgZjEKLQlhYnNzcAlmMSwgIzMuMAotCWFic2VxZQlmNCwgZjUKLQotCXJuZHMJZjEsIGYyCi0Jcm5kZAlmMywgZjQKLQlybmRlcWV6CWY2LCAjNC4wCi0KLQlzcXRzCWY1LCBmNQotCXNxdGRwCWY2LCBmNgotCXNxdHBsZXogZjcsIGY2Ci0KLQlsb2dzCWYwLCAjMTAKLQlsb2dlCWYwLCAjMGYxMAotCWxvZ25lZHoJZjAsIGYxCi0KLQlsZ25lCWYxLCBmMgotCWxnbmR6CWYxLCBmMwotCWxnbnZjcwlmMywgZjQKLQotCWV4cHMJZjEsIGYzCi0JZXhwZW0JZjMsICMxMC4wCi0JZXhwcGxkCWY2LCBmNwotCi0Jc2luZAlmMCwgZjEKLQlzaW5zbQlmMSwgZjIKLQlzaW5ndGUJZjQsICM1Ci0KLQljb3NkCWYxLCBmMwotCWNvc2VtCWY0LCBmNQotCWNvc25lZHAJZjYsIGYxCi0KLQl0YW5lCWYxLCBmNQotCXRhbnN6CWY0LCBmNwotCXRhbmdlZHoJZjEsICM0LjAKLQotCWFzbmUJZjQsIGY1Ci0JYXNuc3AJZjYsICM1ZS0xCi0JYXNubWlkeglmNSwgZjUKLQotCWFjc3MJZjUsIGY2Ci0JYWNzZAlmNiwgZjAKLQlhY3Noc2VtCWYxLCAjMC4wNWUxCi0KLQlhdG5lCWYwLCBmNQotCWF0bnN6CWYxLCAjNQotCWF0bmx0ZAlmMywgZjIKLQotCXVyZGUJZjUsIGY0Ci0JbnJtZQlmNiwgZjUKLQlucm1wbGR6CWY3LCBmNQotCi0JZmx0c3AJZjAsIHI4Ci0JZmx0ZQlmMSwgcjAKLQlmbHRlcWR6CWY1LCByNwotCi0JZml4CXIwLCBmMQotCWZpeHoJcjEsIGY3Ci0JZml4Y3NtCXI1LCBmNQotCi0Jd2ZjCXIwCi0Jd2ZzCXIxCi0JcmZzZXEJcjIKLQlyZmMJcjQKLQotCWNtZglmMCwgIzEKLQljbWYJZjEsIGYyCi0JY21mZXEJZjAsIGYxCi0KLQljbmYJZjAsICMzCi0JY25mCWYxLCAjMC41Ci0JY25mdnMJZjMsIGY0Ci0KLQljbWZlCWYwLCBmMQotCWNtZmVlcQlmMSwgZjIKLQljbWZlcWUJZjMsICM1LjAKLQotCWNuZmUJZjEsIGYzCi0JY25mZWVxCWYzLCBmNAotCWNuZmVxZQlmNCwgZjcKLQljbmZhbGUJZjQsICM1LjAKLQotCWxmbQlmMCwgNCwgW3IwXQotCWxmbQlmMCwgNCwgW3IwLCAjMF0KLQlsZm0JZjEsIDQsIFtyMSwgIzY0XQotCXNmbQlmMiwgNCwgW3IxNCwgIzEwMjBdIQotCXNmbWVxCWY3LCAzLCBbcjhdLCAjLTEwMjAKLQotCWxmbWZkCWY2LCAyLCBbcjE1XQotCXNmbWVhCWY3LCAxLCBbcjhdIQotCWxmbWVxZWEJZjUsIDQsIFtyNl0KLQlzZm1uZWZkCWY0LCAzLCBbcjJdCi0Jc2ZtbmVmZAlmNCwgMywgW3IyXSEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbW1lZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2ltbWVkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjA5MmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2ltbWVkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1ACVRlc3RzIGZvciBjb21wbGV4IGltbWVkaWF0ZSBleHByZXNzaW9ucyAtIG5vbmUgb2YgdGhlc2UgbmVlZCAKLUAJcmVsb2NhdGlvbnMKLQkudGV4dAotYmFyOgotCW1vdglyMCwgIzAKLQltb3YJcjAsICMoLiAtIGJhciAtIDgpCi0JbGRyCXIwLCBiYXIKLQlsZHIJcjAsIFtwYywgIyAoYmFyIC0gLiAtOCldCi0JLnNwYWNlIDQwOTYKLQltb3YJcjAsICMoLiAtIGJhciAtIDgpICYgMHhmZgotCWxkcglyMCwgW3BjLCAjIChiYXIgLSAuIC04KSAmIDB4ZmZdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2NmFkYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgotI25hbWU6IEFSTSBiYXNpYyBpbnN0cnVjdGlvbnMKLSNhczogLW1hcm0yIC1FTAotCi0jIFRlc3QgdGhlIHN0YW5kYXJkIEFSTSBpbnN0cnVjdGlvbnM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgPFtePl0qPiBlM2EwMDAwMCA/CW1vdglyMCwgIzAJOyAweDAKLTAwMDAwMDA0IDxbXj5dKj4gZTFhMDEwMDIgPwltb3YJcjEsIHIyCi0wMDAwMDAwOCA8W14+XSo+IGUxYTAzMTg0ID8JbW92CXIzLCByNCwgbHNsICMzCi0wMDAwMDAwYyA8W14+XSo+IGUxYTA1NzM2ID8JbW92CXI1LCByNiwgbHNyIHI3Ci0wMDAwMDAxMCA8W14+XSo+IGUxYTA4YTU5ID8JbW92CXI4LCByOSwgYXNyIHIxMAotMDAwMDAwMTQgPFtePl0qPiBlMWEwYmQxYyA/CW1vdglyMTEsIHIxMiwgbHNsIHNwCi0wMDAwMDAxOCA8W14+XSo+IGUxYTBlMDZmID8JbW92CWxyLCBwYywgcnJ4Ci0wMDAwMDAxYyA8W14+XSo+IGUxYTAxMDAyID8JbW92CXIxLCByMgotMDAwMDAwMjAgPFtePl0qPiAwMWEwMjAwMyA/CW1vdmVxCXIyLCByMwotMDAwMDAwMjQgPFtePl0qPiAxMWEwNDAwNSA/CW1vdm5lCXI0LCByNQotMDAwMDAwMjggPFtePl0qPiBiMWEwNjAwNyA/CW1vdmx0CXI2LCByNwotMDAwMDAwMmMgPFtePl0qPiBhMWEwODAwOSA/CW1vdmdlCXI4LCByOQotMDAwMDAwMzAgPFtePl0qPiBkMWEwYTAwYiA/CW1vdmxlCXIxMCwgcjExCi0wMDAwMDAzNCA8W14+XSo+IGMxYTBjMDBkID8JbW92Z3QJcjEyLCBzcAotMDAwMDAwMzggPFtePl0qPiAzMWEwMTAwMiA/CW1vdmNjCXIxLCByMgotMDAwMDAwM2MgPFtePl0qPiAyMWEwMTAwMyA/CW1vdmNzCXIxLCByMwotMDAwMDAwNDAgPFtePl0qPiA0MWEwMzAwNiA/CW1vdm1pCXIzLCByNgotMDAwMDAwNDQgPFtePl0qPiA1MWEwNzAwOSA/CW1vdnBsCXI3LCByOQotMDAwMDAwNDggPFtePl0qPiA2MWEwMTAwOCA/CW1vdnZzCXIxLCByOAotMDAwMDAwNGMgPFtePl0qPiA3MWEwOWZhMSA/CW1vdnZjCXI5LCByMSwgbHNyICMzMQotMDAwMDAwNTAgPFtePl0qPiA4MWEwODAwZiA/CW1vdmhpCXI4LCBwYwotMDAwMDAwNTQgPFtePl0qPiA5MWEwZjAwZSA/CW1vdmxzCXBjLCBscgotMDAwMDAwNTggPFtePl0qPiAyMWEwOTAwOCA/CW1vdmNzCXI5LCByOAotMDAwMDAwNWMgPFtePl0qPiAzMWEwMTAwMyA/CW1vdmNjCXIxLCByMwotMDAwMDAwNjAgPFtePl0qPiBlMWIwMDAwOCA/CW1vdnMJcjAsIHI4Ci0wMDAwMDA2NCA8W14+XSo+IDMxYjAwMDA3ID8JbW92Y2NzCXIwLCByNwotMDAwMDAwNjggPFtePl0qPiBlMjgxMDAwYSA/CWFkZAlyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwNmMgPFtePl0qPiBlMDgzMjAwNCA/CWFkZAlyMiwgcjMsIHI0Ci0wMDAwMDA3MCA8W14+XSo+IGUwODY1Mjg3ID8JYWRkCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwNzQgPFtePl0qPiBlMDgyMTExMyA/CWFkZAlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMDc4IDxbXj5dKj4gZTIwMTAwMGEgPwlhbmQJcjAsIHIxLCAjMTAJOyAweGEKLTAwMDAwMDdjIDxbXj5dKj4gZTAwMzIwMDQgPwlhbmQJcjIsIHIzLCByNAotMDAwMDAwODAgPFtePl0qPiBlMDA2NTI4NyA/CWFuZAlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMDg0IDxbXj5dKj4gZTAwMjExMTMgPwlhbmQJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDA4OCA8W14+XSo+IGUyMjEwMDBhID8JZW9yCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDA4YyA8W14+XSo+IGUwMjMyMDA0ID8JZW9yCXIyLCByMywgcjQKLTAwMDAwMDkwIDxbXj5dKj4gZTAyNjUyODcgPwllb3IJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDA5NCA8W14+XSo+IGUwMjIxMTEzID8JZW9yCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwOTggPFtePl0qPiBlMjQxMDAwYSA/CXN1YglyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwOWMgPFtePl0qPiBlMDQzMjAwNCA/CXN1YglyMiwgcjMsIHI0Ci0wMDAwMDBhMCA8W14+XSo+IGUwNDY1Mjg3ID8Jc3ViCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwYTQgPFtePl0qPiBlMDQyMTExMyA/CXN1YglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGE4IDxbXj5dKj4gZTJhMTAwMGEgPwlhZGMJcjAsIHIxLCAjMTAJOyAweGEKLTAwMDAwMGFjIDxbXj5dKj4gZTBhMzIwMDQgPwlhZGMJcjIsIHIzLCByNAotMDAwMDAwYjAgPFtePl0qPiBlMGE2NTI4NyA/CWFkYwlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGI0IDxbXj5dKj4gZTBhMjExMTMgPwlhZGMJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBiOCA8W14+XSo+IGUyYzEwMDBhID8Jc2JjCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDBiYyA8W14+XSo+IGUwYzMyMDA0ID8Jc2JjCXIyLCByMywgcjQKLTAwMDAwMGMwIDxbXj5dKj4gZTBjNjUyODcgPwlzYmMJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBjNCA8W14+XSo+IGUwYzIxMTEzID8Jc2JjCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwYzggPFtePl0qPiBlMjYxMDAwYSA/CXJzYglyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwY2MgPFtePl0qPiBlMDYzMjAwNCA/CXJzYglyMiwgcjMsIHI0Ci0wMDAwMDBkMCA8W14+XSo+IGUwNjY1Mjg3ID8JcnNiCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwZDQgPFtePl0qPiBlMDYyMTExMyA/CXJzYglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGQ4IDxbXj5dKj4gZTJlMTAwMGEgPwlyc2MJcjAsIHIxLCAjMTAJOyAweGEKLTAwMDAwMGRjIDxbXj5dKj4gZTBlMzIwMDQgPwlyc2MJcjIsIHIzLCByNAotMDAwMDAwZTAgPFtePl0qPiBlMGU2NTI4NyA/CXJzYwlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGU0IDxbXj5dKj4gZTBlMjExMTMgPwlyc2MJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBlOCA8W14+XSo+IGUzODEwMDBhID8Jb3JyCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDBlYyA8W14+XSo+IGUxODMyMDA0ID8Jb3JyCXIyLCByMywgcjQKLTAwMDAwMGYwIDxbXj5dKj4gZTE4NjUyODcgPwlvcnIJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBmNCA8W14+XSo+IGUxODIxMTEzID8Jb3JyCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwZjggPFtePl0qPiBlM2MxMDAwYSA/CWJpYwlyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwZmMgPFtePl0qPiBlMWMzMjAwNCA/CWJpYwlyMiwgcjMsIHI0Ci0wMDAwMDEwMCA8W14+XSo+IGUxYzY1Mjg3ID8JYmljCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAxMDQgPFtePl0qPiBlMWMyMTExMyA/CWJpYwlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMTA4IDxbXj5dKj4gZTNlMDAwMGEgPwltdm4JcjAsICMxMAk7IDB4YQotMDAwMDAxMGMgPFtePl0qPiBlMWUwMjAwNCA/CW12bglyMiwgcjQKLTAwMDAwMTEwIDxbXj5dKj4gZTFlMDUyODcgPwltdm4JcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTE0IDxbXj5dKj4gZTFlMDExMTMgPwltdm4JcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTE4IDxbXj5dKj4gZTMxMDAwMGEgPwl0c3QJcjAsICMxMAk7IDB4YQotMDAwMDAxMWMgPFtePl0qPiBlMTEyMDAwNCA/CXRzdAlyMiwgcjQKLTAwMDAwMTIwIDxbXj5dKj4gZTExNTAyODcgPwl0c3QJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTI0IDxbXj5dKj4gZTExMTAxMTMgPwl0c3QJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTI4IDxbXj5dKj4gZTMzMDAwMGEgPwl0ZXEJcjAsICMxMAk7IDB4YQotMDAwMDAxMmMgPFtePl0qPiBlMTMyMDAwNCA/CXRlcQlyMiwgcjQKLTAwMDAwMTMwIDxbXj5dKj4gZTEzNTAyODcgPwl0ZXEJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTM0IDxbXj5dKj4gZTEzMTAxMTMgPwl0ZXEJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTM4IDxbXj5dKj4gZTM1MDAwMGEgPwljbXAJcjAsICMxMAk7IDB4YQotMDAwMDAxM2MgPFtePl0qPiBlMTUyMDAwNCA/CWNtcAlyMiwgcjQKLTAwMDAwMTQwIDxbXj5dKj4gZTE1NTAyODcgPwljbXAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTQ0IDxbXj5dKj4gZTE1MTAxMTMgPwljbXAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTQ4IDxbXj5dKj4gZTM3MDAwMGEgPwljbW4JcjAsICMxMAk7IDB4YQotMDAwMDAxNGMgPFtePl0qPiBlMTcyMDAwNCA/CWNtbglyMiwgcjQKLTAwMDAwMTUwIDxbXj5dKj4gZTE3NTAyODcgPwljbW4JcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTU0IDxbXj5dKj4gZTE3MTAxMTMgPwljbW4JcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTU4IDxbXj5dKj4gZTMzMGYwMGEgPwl0ZXFwCXIwLCAjMTAJOyAweGEKLTAwMDAwMTVjIDxbXj5dKj4gZTEzMmYwMDQgPwl0ZXFwCXIyLCByNAotMDAwMDAxNjAgPFtePl0qPiBlMTM1ZjI4NyA/CXRlcXAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTY0IDxbXj5dKj4gZTEzMWYxMTMgPwl0ZXFwCXIxLCByMywgbHNsIHIxCi0wMDAwMDE2OCA8W14+XSo+IGUzNzBmMDBhID8JY21ucAlyMCwgIzEwCTsgMHhhCi0wMDAwMDE2YyA8W14+XSo+IGUxNzJmMDA0ID8JY21ucAlyMiwgcjQKLTAwMDAwMTcwIDxbXj5dKj4gZTE3NWYyODcgPwljbW5wCXI1LCByNywgbHNsICM1Ci0wMDAwMDE3NCA8W14+XSo+IGUxNzFmMTEzID8JY21ucAlyMSwgcjMsIGxzbCByMQotMDAwMDAxNzggPFtePl0qPiBlMzUwZjAwYSA/CWNtcHAJcjAsICMxMAk7IDB4YQotMDAwMDAxN2MgPFtePl0qPiBlMTUyZjAwNCA/CWNtcHAJcjIsIHI0Ci0wMDAwMDE4MCA8W14+XSo+IGUxNTVmMjg3ID8JY21wcAlyNSwgcjcsIGxzbCAjNQotMDAwMDAxODQgPFtePl0qPiBlMTUxZjExMyA/CWNtcHAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTg4IDxbXj5dKj4gZTMxMGYwMGEgPwl0c3RwCXIwLCAjMTAJOyAweGEKLTAwMDAwMThjIDxbXj5dKj4gZTExMmYwMDQgPwl0c3RwCXIyLCByNAotMDAwMDAxOTAgPFtePl0qPiBlMTE1ZjI4NyA/CXRzdHAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTk0IDxbXj5dKj4gZTExMWYxMTMgPwl0c3RwCXIxLCByMywgbHNsIHIxCi0wMDAwMDE5OCA8W14+XSo+IGUwMDAwMjkxID8JbXVsCXIwLCByMSwgcjIKLTAwMDAwMTljIDxbXj5dKj4gZTAxMTAzOTIgPwltdWxzCXIxLCByMiwgcjMKLTAwMDAwMWEwIDxbXj5dKj4gMTAwMDAwOTEgPwltdWxuZQlyMCwgcjEsIHIwCi0wMDAwMDFhNCA8W14+XSo+IDkwMTkwNzk4ID8JbXVsbHNzCXI5LCByOCwgcjcKLTAwMDAwMWE4IDxbXj5dKj4gZTAyMWJhOTkgPwltbGEJcjEsIHI5LCByMTAsIHIxMQotMDAwMDAxYWMgPFtePl0qPiBlMDMzYzk5NCA/CW1sYXMJcjMsIHI0LCByOSwgcjEyCi0wMDAwMDFiMCA8W14+XSo+IGIwMjlkNzk4ID8JbWxhbHQJcjksIHI4LCByNywgc3AKLTAwMDAwMWI0IDxbXj5dKj4gYTAzNGUzOTEgPwltbGFnZXMJcjQsIHIxLCByMywgbHIKLTAwMDAwMWI4IDxbXj5dKj4gZTU5MTAwMDAgPwlsZHIJcjAsIFxbcjFcXQotMDAwMDAxYmMgPFtePl0qPiBlNzkxMTAwMiA/CWxkcglyMSwgXFtyMSwgcjJcXQotMDAwMDAxYzAgPFtePl0qPiBlN2IzMjAwNCA/CWxkcglyMiwgXFtyMywgcjRcXSEKLTAwMDAwMWM0IDxbXj5dKj4gZTU5MjIwMjAgPwlsZHIJcjIsIFxbcjIsICMzMlxdCi0wMDAwMDFjOCA8W14+XSo+IGU3OTMyNDI0ID8JbGRyCXIyLCBcW3IzLCByNCwgbHNyICM4XF0KLTAwMDAwMWNjIDxbXj5dKj4gMDdiNTQ0ODQgPwlsZHJlcQlyNCwgXFtyNSwgcjQsIGxzbCAjOVxdIQotMDAwMDAxZDAgPFtePl0qPiAxNDk1NDAwNiA/CWxkcm5lCXI0LCBcW3I1XF0sICM2Ci0wMDAwMDFkNCA8W14+XSo+IGU2YjIxMDAzID8JbGRydAlyMSwgXFtyMlxdLCByMwotMDAwMDAxZDggPFtePl0qPiBlNjk0MjQyNSA/CWxkcglyMiwgXFtyNFxdLCByNSwgbHNyICM4Ci0wMDAwMDFkYyA8W14+XSo+IGU1MWYwMDA4ID8JbGRyCXIwLCBcW3BjLCAjZmZmZmZmZjhcXQk7IDAwMDAwMWRjIDxbXj5dKj4KLTAwMDAwMWUwIDxbXj5dKj4gZTVkNDMwMDAgPwlsZHJiCXIzLCBcW3I0XF0KLTAwMDAwMWU0IDxbXj5dKj4gMTRmODUwMDAgPwlsZHJuZWJ0CXI1LCBcW3I4XF0KLTAwMDAwMWU4IDxbXj5dKj4gZTU4MTAwMDAgPwlzdHIJcjAsIFxbcjFcXQotMDAwMDAxZWMgPFtePl0qPiBlNzgxMTAwMiA/CXN0cglyMSwgXFtyMSwgcjJcXQotMDAwMDAxZjAgPFtePl0qPiBlN2E0MzAwMyA/CXN0cglyMywgXFtyNCwgcjNcXSEKLTAwMDAwMWY0IDxbXj5dKj4gZTU4MjIwMjAgPwlzdHIJcjIsIFxbcjIsICMzMlxdCi0wMDAwMDFmOCA8W14+XSo+IGU3ODMyNDI0ID8Jc3RyCXIyLCBcW3IzLCByNCwgbHNyICM4XF0KLTAwMDAwMWZjIDxbXj5dKj4gMDdhNTQ0ODQgPwlzdHJlcQlyNCwgXFtyNSwgcjQsIGxzbCAjOVxdIQotMDAwMDAyMDAgPFtePl0qPiAxNDg1NDAwNiA/CXN0cm5lCXI0LCBcW3I1XF0sICM2Ci0wMDAwMDIwNCA8W14+XSo+IGU2ODIxMDAzID8Jc3RyCXIxLCBcW3IyXF0sIHIzCi0wMDAwMDIwOCA8W14+XSo+IGU2YTQyNDI1ID8Jc3RydAlyMiwgXFtyNFxdLCByNSwgbHNyICM4Ci0wMDAwMDIwYyA8W14+XSo+IGU1MGYxMDA0ID8Jc3RyCXIxLCBcW3BjLCAjZmZmZmZmZmNcXQk7IDAwMDAwMjEwIDxbXj5dKj4KLTAwMDAwMjEwIDxbXj5dKj4gZTVjNzEwMDAgPwlzdHJiCXIxLCBcW3I3XF0KLTAwMDAwMjE0IDxbXj5dKj4gZTRlMDIwMDAgPwlzdHJidAlyMiwgXFtyMFxdCi0wMDAwMDIxOCA8W14+XSo+IGU4OTAwMDAyID8JbGRtaWEJcjAsIHtyMX0KLTAwMDAwMjFjIDxbXj5dKj4gMDk5MjAwMzggPwlsZG1lcWliCXIyLCB7cjMsIHI0LCByNX0KLTAwMDAwMjIwIDxbXj5dKj4gZTg1M2ZmZmYgPwlsZG1kYQlyMywge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCBzcCwgbHIsIHBjfVxeCi0wMDAwMDIyNCA8W14+XSo+IGU5M2IwNWZmID8JbGRtZGIJcjExISwge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHIxMH0KLTAwMDAwMjI4IDxbXj5dKj4gZTk5MTAwZjcgPwlsZG1pYglyMSwge3IwLCByMSwgcjIsIHI0LCByNSwgcjYsIHI3fQotMDAwMDAyMmMgPFtePl0qPiBlODkyMDFmOCA/CWxkbWlhCXIyLCB7cjMsIHI0LCByNSwgcjYsIHI3LCByOH0KLTAwMDAwMjMwIDxbXj5dKj4gZTkxMzAwMDMgPwlsZG1kYglyMywge3IwLCByMX0KLTAwMDAwMjM0IDxbXj5dKj4gZTg3NDAzMDAgPwlsZG1kYQlyNCEsIHtyOCwgcjl9XF4KLTAwMDAwMjM4IDxbXj5dKj4gZTg4MDAwMDIgPwlzdG1pYQlyMCwge3IxfQotMDAwMDAyM2MgPFtePl0qPiAwOTgyMDAzOCA/CXN0bWVxaWIJcjIsIHtyMywgcjQsIHI1fQotMDAwMDAyNDAgPFtePl0qPiBlODQzZmZmZiA/CXN0bWRhCXIzLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCByMTIsIHNwLCBsciwgcGN9XF4KLTAwMDAwMjQ0IDxbXj5dKj4gZTkyYTA1ZmYgPwlzdG1kYglyMTAhLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjEwfQotMDAwMDAyNDggPFtePl0qPiBlODAxMDAwNyA/CXN0bWRhCXIxLCB7cjAsIHIxLCByMn0KLTAwMDAwMjRjIDxbXj5dKj4gZTkwMjAwMTggPwlzdG1kYglyMiwge3IzLCByNH0KLTAwMDAwMjUwIDxbXj5dKj4gZTg4MzAwMDMgPwlzdG1pYQlyMywge3IwLCByMX0KLTAwMDAwMjU0IDxbXj5dKj4gZTllNDAzMDAgPwlzdG1pYglyNCEsIHtyOCwgcjl9XF4KLTAwMDAwMjU4IDxbXj5dKj4gZWYxMjM0NTYgPwlzd2kJMHgwMDEyMzQ1NgotMDAwMDAyNWMgPFtePl0qPiAyZjAwMDAzMyA/CXN3aWNzCTB4MDAwMDAwMzMKLTAwMDAwMjYwIDxbXj5dKj4gZWJmZmZmZmUgPwlibAkwMDAwMDI2MCA8W14+XSo+Ci1bCQldKjI2MDouKl93b21iYXQuKgotMDAwMDAyNjQgPFtePl0qPiA1YmZmZmZmZSA/CWJscGwJMDAwMDAyNjQgPFtePl0qPgotWwkJXSoyNjQ6LipBUk0uKmhvaHVtCi0wMDAwMDI2OCA8W14+XSo+IGVhZmZmZmZlID8JYgkwMDAwMDI2OCA8W14+XSo+Ci1bCQldKjI2ODouKl93aWJibGUuKgotMDAwMDAyNmMgPFtePl0qPiBkYWZmZmZmZSA/CWJsZQkwMDAwMDI2YyA8W14+XSo+Ci1bCQldKjI2YzouKnRlc3RlcmZ1bmMuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmJhYzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QucworKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi1ACVRlc3QgZmlsZSBmb3IgQVJNL0dBUyAtLSBiYXNpYyBpbnN0cnVjdGlvbnMKLQotLnRleHQKLS5hbGlnbgotCW1vdglyMCwgIzAKLQltb3YJcjEsIHIyCi0JbW92CXIzLCByNCwgbHNsICMzCi0JbW92CXI1LCByNiwgbHNyIHI3Ci0JbW92CXI4LCByOSwgYXNyIHIxMAotCW1vdglyMTEsIHIxMiwgYXNsIHIxMwotCW1vdglyMTQsIHIxNSwgcnJ4Ci0JbW92YWwJYTIsIGEzCi0JbW92ZXEJYTMsIGE0Ci0JbW92bmUJdjEsIHYyCi0JbW92bHQJdjMsIHY0Ci0JbW92Z2UJdjUsIHY2Ci0JbW92bGUJdjcsIHY4Ci0JbW92Z3QJaXAsIHNwCi0JbW92Y2MJcjEsIHIyCi0JbW92Y3MJcjEsIHIzCi0JbW92bWkJcjMsIHI2Ci0JbW92cGwJd3IsIHNiCi0JbW92dnMJcjEsIHI4Ci0JbW92dmMJU0IsIHIxLCBsc3IgIzMxCi0JbW92aGkJcjgsIHBjCi0JbW92bHMJUEMsIGxyCi0JbW92aHMJcjksIHI4Ci0JbW92dWwJcjEsIHIzCi0JbW92cwlyMCwgcjgKLQltb3Z1bHMJcjAsIFdSCi0JCi0JYWRkCXIwLCByMSwgIzEwCi0JYWRkCXIyLCByMywgcjQKLQlhZGQJcjUsIHI2LCByNywgYXNsICM1Ci0JYWRkCXIxLCByMiwgcjMsIGxzbCByMQotCi0JYW5kCXIwLCByMSwgIzEwCi0JYW5kCXIyLCByMywgcjQKLQlhbmQJcjUsIHI2LCByNywgYXNsICM1Ci0JYW5kCXIxLCByMiwgcjMsIGxzbCByMQotCi0JZW9yCXIwLCByMSwgIzEwCi0JZW9yCXIyLCByMywgcjQKLQllb3IJcjUsIHI2LCByNywgYXNsICM1Ci0JZW9yCXIxLCByMiwgcjMsIGxzbCByMQotCi0Jc3ViCXIwLCByMSwgIzEwCi0Jc3ViCXIyLCByMywgcjQKLQlzdWIJcjUsIHI2LCByNywgYXNsICM1Ci0Jc3ViCXIxLCByMiwgcjMsIGxzbCByMQotCi0JYWRjCXIwLCByMSwgIzEwCi0JYWRjCXIyLCByMywgcjQKLQlhZGMJcjUsIHI2LCByNywgYXNsICM1Ci0JYWRjCXIxLCByMiwgcjMsIGxzbCByMQotCi0Jc2JjCXIwLCByMSwgIzEwCi0Jc2JjCXIyLCByMywgcjQKLQlzYmMJcjUsIHI2LCByNywgYXNsICM1Ci0Jc2JjCXIxLCByMiwgcjMsIGxzbCByMQotCi0JcnNiCXIwLCByMSwgIzEwCi0JcnNiCXIyLCByMywgcjQKLQlyc2IJcjUsIHI2LCByNywgYXNsICM1Ci0JcnNiCXIxLCByMiwgcjMsIGxzbCByMQotCi0JcnNjCXIwLCByMSwgIzEwCi0JcnNjCXIyLCByMywgcjQKLQlyc2MJcjUsIHI2LCByNywgYXNsICM1Ci0JcnNjCXIxLCByMiwgcjMsIGxzbCByMQotCi0Jb3JyCXIwLCByMSwgIzEwCi0Jb3JyCXIyLCByMywgcjQKLQlvcnIJcjUsIHI2LCByNywgYXNsICM1Ci0Jb3JyCXIxLCByMiwgcjMsIGxzbCByMQotCi0JYmljCXIwLCByMSwgIzEwCi0JYmljCXIyLCByMywgcjQKLQliaWMJcjUsIHI2LCByNywgYXNsICM1Ci0JYmljCXIxLCByMiwgcjMsIGxzbCByMQotCi0JbXZuCXIwLCAjMTAKLQltdm4JcjIsIHI0Ci0JbXZuCXI1LCByNywgYXNsICM1Ci0JbXZuCXIxLCByMywgbHNsIHIxCi0KLQl0c3QJcjAsICMxMAotCXRzdAlyMiwgcjQKLQl0c3QJcjUsIHI3LCBhc2wgIzUKLQl0c3QJcjEsIHIzLCBsc2wgcjEKLQotCXRlcQlyMCwgIzEwCi0JdGVxCXIyLCByNAotCXRlcQlyNSwgcjcsIGFzbCAjNQotCXRlcQlyMSwgcjMsIGxzbCByMQotCi0JY21wCXIwLCAjMTAKLQljbXAJcjIsIHI0Ci0JY21wCXI1LCByNywgYXNsICM1Ci0JY21wCXIxLCByMywgbHNsIHIxCi0KLQljbW4JcjAsICMxMAotCWNtbglyMiwgcjQKLQljbW4JcjUsIHI3LCBhc2wgIzUKLQljbW4JcjEsIHIzLCBsc2wgcjEKLQotCXRlcXAJcjAsICMxMAotCXRlcXAJcjIsIHI0Ci0JdGVxcAlyNSwgcjcsIGFzbCAjNQotCXRlcXAJcjEsIHIzLCBsc2wgcjEKLQotCWNtbnAJcjAsICMxMAotCWNtbnAJcjIsIHI0Ci0JY21ucAlyNSwgcjcsIGFzbCAjNQotCWNtbnAJcjEsIHIzLCBsc2wgcjEKLQotCWNtcHAJcjAsICMxMAotCWNtcHAJcjIsIHI0Ci0JY21wcAlyNSwgcjcsIGFzbCAjNQotCWNtcHAJcjEsIHIzLCBsc2wgcjEKLQotCXRzdHAJcjAsICMxMAotCXRzdHAJcjIsIHI0Ci0JdHN0cAlyNSwgcjcsIGFzbCAjNQotCXRzdHAJcjEsIHIzLCBsc2wgcjEKLQotCW11bAlyMCwgcjEsIHIyCi0JbXVscwlyMSwgcjIsIHIzCi0JbXVsbmUJcjAsIHIxLCByMAotCW11bGxzcwlyOSwgcjgsIHI3Ci0KLQltbGEJcjEsIHI5LCBzbCwgZnAKLQltbGFzCXIzLCByNCwgcjksIElQCi0JbWxhbHQJcjksIHI4LCByNywgU1AKLQltbGFnZXMJcjQsIHIxLCByMywgTFIKLQotCWxkcglyMCwgW3IxXQotCWxkcglyMSwgW3IxLCByMl0KLQlsZHIJcjIsIFtyMywgcjRdIQotCWxkcglyMiwgW3IyLCAjMzJdCi0JbGRyCXIyLCBbcjMsIHI0LCBsc3IgIzhdCi0JbGRyZXEJcjQsIFtyNSwgcjQsIGFzbCAjOV0hCi0JbGRybmUJcjQsIFtyNV0sICM2Ci0JbGRydAlyMSwgW3IyXSwgcjMKLQlsZHIJcjIsIFtyNF0sIHI1LCBsc3IgIzgKLWZvbzoKLQlsZHIJcjAsIGZvbwotCWxkcmIJcjMsIFtyNF0KLQlsZHJuZWJ0CXI1LCBbcjhdCi0JCi0Jc3RyCXIwLCBbcjFdCi0Jc3RyCXIxLCBbcjEsIHIyXQotCXN0cglyMywgW3I0LCByM10hCi0Jc3RyCXIyLCBbcjIsICMzMl0KLQlzdHIJcjIsIFtyMywgcjQsIGxzciAjOF0KLQlzdHJlcQlyNCwgW3I1LCByNCwgYXNsICM5XSEKLQlzdHJuZQlyNCwgW3I1XSwgIzYKLQlzdHIJcjEsIFtyMl0sIHIzCi0Jc3RydAlyMiwgW3I0XSwgcjUsIGxzciAjOAotCXN0cglyMSwgYmFyCi1iYXI6Ci0Jc3RyYWxiCXIxLCBbcjddCi0Jc3RyYnQJcjIsIFtyMF0KLQotCWxkbWlhCXIwLCB7cjF9Ci0JbGRtZXFpYglyMiwge3IzLCByNCwgcjV9Ci0JbGRtYWxkYQlyMywge3IwLXIxNX1eCi0JbGRtZGIJRlAhLCB7cjAtcjgsIFNMfQotCWxkbWVkCXIxLCB7cjAsIHIxLCByMn18MHhmMAotCWxkbWZkCXIyLCB7cjMsIHI0fSt7cjUsIHI2LCByNywgcjh9Ci0JbGRtZWEJcjMsIDMKLQlsZG1mYQlyNCEsIHtyOCwgcjl9XgotCQotCXN0bWlhCXIwLCB7cjF9Ci0Jc3RtZXFpYglyMiwge3IzLCByNCwgcjV9Ci0Jc3RtYWxkYQlyMywge3IwLXIxNX1eCi0Jc3RtZGIJcjEwISwge3IwLXI4LCByMTB9Ci0Jc3RtZWQJcjEsIHtyMCwgcjEsIHIyfQotCXN0bWZkCXIyLCB7cjMsIHI0fQotCXN0bWVhCXIzLCAzCi0Jc3RtZmEJcjQhLCB7cjgsIHI5fV4KLQotCXN3aQkweDEyMzQ1NgotCXN3aWhzCTB4MzMKLQotCWJsCV93b21iYXQKLQlibHBsCWhvaHVtCi0JYglfd2liYmxlCi0JYmxlCXRlc3RlcmZ1bmMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTRlMGUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNvYmpkdW1wOiAtcwotI2FzOiAtRUwKLSNuYW1lOiBhcm0gbGl0dGxlLWVuZGlhbiBmcGNvbnN0Ci0KLS4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgY2RjYzhjM2YgMDAwMDAwMDAgOTk5OWYxM2YgOWE5OTk5OTkgLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTNjM2Q3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgVGVzdCBmcCBjb25zdGFudHMuCi0jIFRoZXNlIG5lZWQgQVJNIHNwZWNpZmljIHN1cHBvcnQgYmVjYXVzZSA4IGJ5dGUgZnAgY29uc3RhbnRzIGluIGxpdHRsZQotIyBlbmRpYW4gbW9kZSBhcmUgcmVwcmVzZW50ZWQgYWJub3JtYWxseS4KLQkKLQkudGV4dAotCS5mbG9hdCAxLjEKLQkuZmxvYXQgMAotCS5kb3VibGUgMS4xCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS90aHVtYi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjJiMDg4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS90aHVtYi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLQkudGV4dAotCS5jb2RlIDE2Ci0uZm9vOgkKLQlsc2wJcjIsIHIxLCAjMwotCWxzcglyMywgcjQsICMzMQotd2liYmxlL2RhdGE6CQotCWFzcglyNywgcjAsICM1Ci0KLQlsc2wJcjEsIHIyLCAjMAotCWxzcglyMywgcjQsICMwCi0JYXNyCXI0LCByNSwgIzAKLQotCWxzcglyNiwgcjcsICMzMgotCWFzcglyMCwgcjEsICMzMgotCi0JYWRkCXIxLCByMiwgcjMKLQlhZGQJcjIsIHI0LCAjMgotCXN1YglyMywgcjUsIHI3Ci0Jc3ViCXIyLCByNCwgIzcKLQotCW1vdglyNCwgIzI1NQotCWNtcAlyMywgIzI1MAotCWFkZAlyNiwgIzEyMwotCXN1YglyNSwgIzEyOAotCi0JYW5kCXIzLCByNQotCWVvcglyNCwgcjYKLQlsc2wJcjEsIHIwCi0JbHNyCXIyLCByMwotCWFzcglyNCwgcjYKLQlhZGMJcjUsIHI3Ci0Jc2JjCXIwLCByNAotCXJvcglyMSwgcjQKLQl0c3QJcjIsIHI1Ci0JbmVnCXIxLCByMQotCWNtcAlyMiwgcjMKLQljbW4JcjEsIHI0Ci0Jb3JyCXIwLCByMwotCW11bAlyNCwgcjUKLQliaWMJcjUsIHI3Ci0JbXZuCXI1LCByNQotCi0JYWRkCXIxLCByMTMKLQlhZGQJcjEyLCByMgotCWFkZAlyOSwgcjkKLQljbXAJcjEsIHIxNAotCWNtcAlyOCwgcjAKLQljbXAJcjEyLCByMTQKLQltb3YJcjAsIHI5Ci0JbW92CXI5LCByNAotCW1vdglyOCwgcjgKLQlieAlyNwotCWJ4CXI4Ci0JLmFsaWduIDAKLQlieAlwYwotCi0JbGRyCXIzLCBbcGMsICMxMjhdCi0JbGRyCXI0LCBiYXIKLQotCXN0cglyMCwgW3IxLCByMl0KLQlzdHJiCXIxLCBbcjIsIHI0XQotCWxkcglyNSwgW3I2LCByN10KLQlsZHJiCXIyLCBbcjQsIHI1XQotCQotCS5hbGlnbiAwCi1iYXI6CQotCXN0cmgJcjEsIFtyMiwgcjNdCi0JbGRyaAlyMywgW3I0LCByMF0KLQlsZHNiCXIxLCBbcjYsIHI3XQotCWxkc2gJcjIsIFtyMCwgcjVdCi0KLQlzdHIJcjMsIFtyMywgIzEyNF0KLQlsZHIJcjEsIFtyNCwgIzEyNF0KLQlsZHIJcjUsIFtyNV0KLQlzdHJiCXIxLCBbcjUsICMzMV0KLQlzdHJiCXIxLCBbcjQsICM1XQotCXN0cmIJcjIsIFtyNl0KLQotCXN0cmgJcjQsIFtyNSwgIzYyXQotCWxkcmgJcjUsIFtyMCwgIzRdCi0JbGRyaAlyMywgW3IyXQotCi0Jc3RyCXIzLCBbcjEzLCAjMTAyMF0KLQlsZHIJcjEsIFtyMTMsICM0NF0KLQlsZHIJcjIsIFtyMTNdCi0KLQlhZGQJcjcsIHIxNSwgIzEwMjAKLQlhZGQJcjQsIHIxMywgIzUxMgotCi0JYWRkCXIxMywgIzI2OAotCWFkZAlyMTMsICMtMTA0Ci0Jc3ViCXIxMywgIzI2OAotCXN1YglyMTMsICMtMTA4Ci0KLQlwdXNoCXtyMCwgcjEsIHIyLCByNH0KLQlwdXNoCXtyMCwgcjMtcjcsIGxyfQotCXBvcAl7cjMsIHI0LCByN30KLQlwb3AJe3IwLXI3LCByMTV9Ci0KLQlzdG1pYQlyMyEsIHtyMCwgcjEsIHI0LXI3fQotCWxkbWlhCXIwISwge3IxLXI3fQotCi0JYmVxCWJhcgotCWJuZQliYXIKLQliY3MJYmFyCi0JYmNjCWJhcgotCWJtaQliYXIKLQlicGwJYmFyCi0JYnZzCWJhcgotCWJ2YwliYXIKLQliaGkJYmFyCi0JYmxzCWJhcgotCWJnZQliYXIKLQliZ3QJYmFyCi0JYmx0CWJhcgotCWJndAliYXIKLQlibGUJYmFyCi0JYmhpCWJhcgotCWJsbwliYXIKLQlidWwJYmFyCi0JYmFsCWJhcgotCi1jbG9zZToKLQlsc2wJcjQsIHI1LCAjbmVhciAtIGNsb3NlCi1uZWFyOgotCWFkZAlyMiwgcjMsICNuZWFyIC0gY2xvc2UKLQotCWFkZAlzcCwgc3AsICMxMjcgPDwgMgotCXN1YglzcCwgc3AsICMxMjcgPDwgMgotCWFkZAlyMCwgc3AsICMyNTUgPDwgMgotCWFkZAlyMCwgcGMsICMyNTUgPDwgMgotCi0JYWRkCXNwLCBzcCwgI2JhciAtIC5mb28KLQlzdWIJc3AsIHNwLCAjYmFyIC0gLmZvbwotCWFkZAlyMCwgc3AsICNiYXIgLSAuZm9vCi0JYWRkCXIwLCBwYywgI2JhciAtIC5mb28KLQotCWFkZAlyMSwgI2JhciAtIC5mb28KLQltb3YJcjYsICNiYXIgLSAuZm9vCi0JY21wCXI3LCAjYmFyIC0gLmZvbwotCi0Jbm9wCi0Jbm9wCi0KLQkuYXJtCi0ubG9jYWxiYXI6Ci0JYgkubG9jYWxiYXIKLQliCS53b21iYXQKLQlibAkubG9jYWxiYXIKLQlibAkud29tYmF0Ci0KLQlieAlyMAotCXN3aQkweDEyMzQ1NgotCi0JLnRodW1iCi0JQCBUaGUgZm9sbG93aW5nIHdpbGwgYmUgZGlzYXNzZW1ibGVkIGluY29ycmVjdGx5IGlmIHdlIGRvIG5vdAotCUAgaGF2ZSBhIFRodW1iIHN5bWJvbCBkZWZpbmVkIGJlZm9yZSB0aGUgZmlyc3QgVGh1bWIgaW5zdHJ1Y3Rpb246Ci1tb3JldGh1bWI6Ci0JYWRyCXIwLCBmb3J3YXJkb25seQotCi0JYgkuZm9vCi0JYgkud29tYmF0Ci0JYmwJLmZvbwotCWJsCS53b21iYXQKLQotCWJ4CXIwCi0KLQlzd2kJMHhmZgotCS5hbGlnbgkwCi1mb3J3YXJkb25seToKLQliZXEJLndvbWJhdAotCWJuZQkud29tYmF0Ci0JYmNzCS53b21iYXQKLQliY2MJLndvbWJhdAotCWJtaQkud29tYmF0Ci0JYnBsCS53b21iYXQKLQlidnMJLndvbWJhdAotCWJ2Ywkud29tYmF0Ci0JYmhpCS53b21iYXQKLQlibHMJLndvbWJhdAotCWJnZQkud29tYmF0Ci0JYmd0CS53b21iYXQKLQlibHQJLndvbWJhdAotCWJndAkud29tYmF0Ci0JYmxlCS53b21iYXQKLQliaGkJLndvbWJhdAotCWJsbwkud29tYmF0Ci0JYnVsCS53b21iYXQKLQotLmJhY2s6Ci0JYmwJLmxvY2FsCi0JLnNwYWNlCSgxIDw8IDExKQlAIGxlYXZlIHNwYWNlIHRvIGZvcmNlIGxvbmcgb2Zmc2V0cwotLmxvY2FsOgotCWJsCS5iYWNrCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMTB2L2QxMC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMTB2L2QxMC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDM3MjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDEwdi9kMTAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIwotIyBEcml2ZXIgZm9yIEQxMFYgYXNzZW1ibGVyIHRlc3RzdWl0ZQotIwotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICBnbG9iYWwgc3JjZGlyIHN1YmRpcgotICBzZXQgdGVzdG5hbWUgIkQxMFYgJG5hbWUiCi0gIHNldCBmaWxlICRzcmNkaXIvJHN1YmRpci8kbmFtZQotICBnYXNfcnVuICR7bmFtZX0ucyAkb3B0cyAiPiZkdW1wLm91dCIKLSAgaWYge1tyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmwiXSB9IHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotICAgIHJldHVybgotICB9Ci0gIHBhc3MgJHRlc3RuYW1lCi19Ci0KLWlmIHtbaXN0YXJnZXQgZDEwdi0qLSpdfSB7Ci0gIHJ1bl9kdW1wX3Rlc3QgImluc3QiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMTB2L2luc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QxMHYvaW5zdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNkYWZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QxMHYvaW5zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQxMFYgYmFzaWMgaW5zdHJ1Y3Rpb24gdGVzdCBvdXRwdXQKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMTB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxzdGFydD46Ci0gICAwOglhOSAwNCBjMiAyOSAJc2FjCXIwLCBhMAk8LQlzYWNoaQlyMSwgYTAKLSAgIDQ6CWE5IDA2IGMyIDJkIAlyYWMJcjAsIGEwLCAtMHgyCTwtCXJhY2hpCXIxLCBhMCwgLTB4MgotICAgODoJMmYgMDAgMzIgMjYgCW5vcAkJfHwJc2xhZQlhMCwgcjMKLSAgIGM6CWYyIDExIDA4IDAwIAlsZAlyMSwgQDB4ODAwCi0gIDEwOglmMyAwMSAwOCAwMCAJbGQydwlyMCwgQDB4ODAwCi0gIDE0OglmNyAwMSAwOCAwMCAJc3QydwlyMCwgQDB4ODAwCi0gIDE4OglmNiAxMSAwOCAwMCAJc3QJcjEsIEAweDgwMAotICAxYzoJNmYgMDAgNWUgMDAgCW5vcAkJLT4Jbm9wCQotICAyMDoJNmYgMDAgNWUgMDAgCW5vcAkJLT4Jbm9wCQotICAyNDoJMmYgMDAgNWUgMDAgCW5vcAkJfHwJbm9wCQotICAyODoJYWYgMDAgNWUgMDAgCW5vcAkJPC0Jbm9wCQotICAyYzoJMjMgMTEgZGUgMDAgCW5vdAlyMQl8fAlub3AJCi0gIDMwOgk2MyAyMSBkZSAwMCAJbm90CXIyCS0+CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QxMHYvaW5zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDEwdi9pbnN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGZhNzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDEwdi9pbnN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIHRlc3QgYWxsIGluc3RydWN0aW9ucy4gRklYTUU6IG1hbnkgaW5zdHJ1Y3Rpb25zIG1pc3NpbmcuCi0KLXN0YXJ0OgotCXNhY2hpCXIxLCBhMAotCXNhYwlyMCwgYTAKLQkjCi0JIyBkaXNhc3NlbWJsZXIgdGVzdC4gc2FjaGkmc2FjIHNob3VsZCBub3QgCi0JIyBiZSBjb25mdXNlZCB3aXRoIHJhY2hpJnJhYwotCSMKLQlyYWNoaQlyMSwgYTAsIC0weDIKLQlyYWMJcjAsIGEwLCAtMHgyCi0Jc2xhZQlhMCwgcjMKLQlsZAlyMSwgQDB4MDgwMAotCWxkMncJcjAsIEAweDA4MDAKLQlzdDJ3CXIwLCBAMHgwODAwCi0Jc3QJcjEsIEAweDA4MDAKLQotIyBWTElXIHN5bnRheCB0ZXN0Ci0Jbm9wCi0Jbm9wCi0Jbm9wCS0+CW5vcAotCW5vcAl8fAlub3AKLQlub3AJPC0Jbm9wCi0KLSMgdHJ5IGNoYW5naW5nIHNlY3Rpb25zCi0Jbm90CXIxCi0JLnNlY3Rpb24gLmZvbwotCWFkZDMJcjEwLHIxMiw2Ci0JLnRleHQKLQlub3QJcjIKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2NzY4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBhbGlnbm1lbnQgdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxzdGFydD46Ci0gICAwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgIDg6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAxMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gIDE4OgkwMGYwMDAwMCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgMjA6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAyODoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gIDMwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMDM5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIHRlc3RzIHByb3BlciBoYW5kbGluZyBvZiBhbGlnbnMgb24gRDMwVgotCi0JLnRleHQKLQkuYWxpZ24gMwotc3RhcnQ6Ci0JYWJzCXIyMSxyNDIKLQkuYWxpZ24gMwotCWFicwlyMjEscjQyCi0JLmFsaWduIDQKLQlhYnMJcjIxLHI0MgotCS5hbGlnbiA0Ci0JYWJzCXIyMSxyNDIKLQkKLQkuZGF0YQotCS5sb25nCTB4ZGVhZGJlZWYKLQkKLQkudGV4dAotCWFicwlyMjEscjQyCi0KLQkuZGF0YQotCS5hbGlnbiA0Ci0JLmxvbmcJMHhkZWFkYmVlZgotCQotCS50ZXh0Ci0JLmFsaWduIDMKLQlhYnMJcjIxLHI0MgotCS5lbmQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFiYzMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkuZAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIGFycmF5IHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8X19mb28tMHg0OD46Ci0gICAwOgk4ODA4MjBjMCA4MDAwMDA0OCAJYWRkLmwJcjIsIHIzLCAweDQ4Ci0JCQkwOiBSX0QzMFZfMzIJLnRleHQKLSAgIDg6CTg4MDgyMGMwIDgwMDAwMDQ5IAlhZGQubAlyMiwgcjMsIDB4NDkKLQkJCTg6IFJfRDMwVl8zMgkudGV4dAotICAxMDoJODgwODIwYzAgODAwMDAwNGEgCWFkZC5sCXIyLCByMywgMHg0YQotCQkJMTA6IFJfRDMwVl8zMgkudGV4dAotICAxODoJODgwODIwYzAgODAwMDAwNGIgCWFkZC5sCXIyLCByMywgMHg0YgotCQkJMTg6IFJfRDMwVl8zMgkudGV4dAotICAyMDoJODgwODIwYzAgODAwMDAwNGMgCWFkZC5sCXIyLCByMywgMHg0YwotCQkJMjA6IFJfRDMwVl8zMgkudGV4dAotICAyODoJODgwODIwYzAgODAwMDAwNGQgCWFkZC5sCXIyLCByMywgMHg0ZAotCQkJMjg6IFJfRDMwVl8zMgkudGV4dAotICAzMDoJODgwODIwYzAgODAwMDAwNGUgCWFkZC5sCXIyLCByMywgMHg0ZQotCQkJMzA6IFJfRDMwVl8zMgkudGV4dAotICAzODoJODgwODIwYzAgODAwMDAwNGYgCWFkZC5sCXIyLCByMywgMHg0ZgotCQkJMzg6IFJfRDMwVl8zMgkudGV4dAotICA0MDoJODgwODIwYzAgODAwMDAwNTAgCWFkZC5sCXIyLCByMywgMHg1MAotCQkJNDA6IFJfRDMwVl8zMgkudGV4dAotCi0wKzAwNDggPF9fZm9vPjoKLSAgNDg6CTEyMzQ1Njc4IDEyMzQ1Njc4IAkubG9uZwkweDEyMzQ1Njc4CXx8CS5sb25nCTB4MTIzNDU2NzgKLSAgNTA6CTEyMzQ1Njc4IDAwMDAwMDAwICAgICAgCS5sb25nCTB4MTIzNDU2NzgJfHwJYnJhLnMJcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExODdkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIEQzMFYgYXJyYXkgdGVzdAotCS50ZXh0Ci0JYWRkIHIyLCByMyAsIF9fZm9vCi0JYWRkIHIyLCByMyAsIF9fZm9vKzEKLQlhZGQgcjIsIHIzICwgX19mb28rMgotCWFkZCByMiwgcjMgLCBfX2ZvbyszCi0JYWRkIHIyLCByMyAsIF9fZm9vKzQKLQlhZGQgcjIsIHIzICwgX19mb28rNQotCWFkZCByMiwgcjMgLCBfX2Zvbys2Ci0JYWRkIHIyLCByMyAsIF9fZm9vKzcKLQlhZGQgcjIsIHIzICwgX19mb28rOAotX19mb286Ci0JLmludCAweDEyMzQ1Njc4Ci0gICAgICAgIC5pbnQgMHgxMjM0NTY3OAotICAgICAgICAuaW50IDB4MTIzNDU2NzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmFiNDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBiaXR0ZXN0IG9wdAotI2FzOiAtV08KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwMGYwMDAwMCA4NDQwMTA4MyAJbm9wCQktPglsZHcucwlyMSwgQFwocjIsIHIzXCkKLSAgIDg6CTA0NDA2MTQ0IDAwZjAwMDAwIAlsZHcucwlyNiwgQFwocjUsIHI0XCkJfHwJbm9wCQotICAxMDoJMDBmMDAwMDAgODIyMDEwODMgCW5vcAkJLT4JYnNldAlyMSwgcjIsIHIzCi0gIDE4Ogk4MGYwMDAwMCAwMjAwMTA4MyAJbm9wCQk8LQlidHN0CWYxLCByMiwgcjMKLSAgMjA6CTAwZjAwMDAwIDAyMzAxMDgzIAlub3AJCXx8CWJjbHIJcjEsIHIyLCByMwotICAyODoJMDBmMDAwMDAgODIxMDEwODMgCW5vcAkJLT4JYm5vdAlyMSwgcjIsIHIzCi0gIDMwOgkwMjEwMTA4MyA4MGYwMDAwMCAJYm5vdAlyMSwgcjIsIHIzCS0+CW5vcAkKLSAgMzg6CTA0N2MwMTA1IDAyMjAxMDgzIAltb2RkZWMJcjQsIDB4NQl8fAlic2V0CXIxLCByMiwgcjMKLSAgNDA6CTAyMjAxMDgzIDg0N2MwMTA1IAlic2V0CXIxLCByMiwgcjMJLT4JbW9kZGVjCXI0LCAweDUKLSAgNDg6CTAyMjAxMDgzIDA4YzA0MTQ2IAlic2V0CXIxLCByMiwgcjMJfHwJam9pbmxsLnMJcjQsIHI1LCByNgotICA1MDoJMDIyMDEwODMgMDhjMDQxNDYgCWJzZXQJcjEsIHIyLCByMwl8fAlqb2lubGwucwlyNCwgcjUsIHI2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkMWI3ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QubAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjogV2FybmluZzogU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYnNldCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYnRzdCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYmNsciBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYm5vdCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYnNldCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlcgotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAJIyBiaXR0ZXN0LnMKLSAgIDIgICAgICAgICAgICAgIAkjCi0gICAzICAgICAgICAgICAgICAJIyBCaXQgb3BlcmF0aW9uIGluc3RydWN0aW9ucyBcKEJDTFIsIEJOT1QsIEJTRVQsIEJUU1RcKSBzaG91bGQgbm90IGJlIHBsYWNlZCBpbiBJVS4KLSAgIDQgICAgICAgICAgICAgIAkjIElmIHRoZSB1c2VyIHNwZWNpZmljYWxseSBpbmRpY2F0ZXMgdGhleSBzaG91bGQgYmUgaW4gdGhlIElVLCBHQVMgd2lsbAotICAgNSAgICAgICAgICAgICAgCSMgZ2VuZXJhdGUgd2FybmluZ3MuIFRoZSByZWFzb24gd2h5IHRoaXMgaXMgbm90IGFuIGVycm9yIGlzIHRoYXQgdGhvc2UgaW5zdHJ1Y3Rpb25zIAotICAgNiAgICAgICAgICAgICAgCSMgd2lsbCBmYWlsIGluIElVIG9ubHkgb2NjYXNpb25hbGx5LiBUaHVzIEdBUyBzaG91bGQgcGFjayB0aGVtIGluIE1VIGZvcgotICAgNyAgICAgICAgICAgICAgCSMgc2FmZXR5LCBhbmQgaXQganVzdCBuZWVkcyB0byBkcmF3IGF0dGVudGlvbiB3aGVuIGEgdmlvbGF0aW9uIGlzIGdpdmVuLiAKLSAgIDggICAgICAgICAgICAgIAkKLSAgIDkgICAgICAgICAgICAgIAkJCi0gIDEwIDAwMDAgMDBGMDAwMDAgCQlub3AgLT4gbGR3IFIxLCBAXChSMixSM1wpCi0gIDEwICAgICAgODQ0MDEwODMgCi0gIDExIDAwMDggMDQ0MDYxNDQgCSAgICAgICAgbm9wIHx8IGxkdyBSNiwgQFwoUjUsUjRcKQotLiogIFdhcm5pbmc6U3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgICAgICAgICAgICAgIAkgICAgICAgIAotICAxMyAwMDEwIDAwRjAwMDAwIAkgICAgICAgIG5vcCAtPiBCU0VUIFIxLCBSMiwgUjMgCi0uKiAgV2FybmluZzpFeGVjdXRpbmcgYnNldCBpbiBJVSBtYXkgbm90IHdvcmsKLSAgMTMgICAgICA4MjIwMTA4MyAKLSAgMTQgMDAxOCA4MEYwMDAwMCAJICAgICAgICBub3AgPC0gQlRTVCBGMSwgUjIsIFIzIAotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJ0c3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDE0ICAgICAgMDIwMDEwODMgCi0gIDE1IDAwMjAgMDBGMDAwMDAgCSAgICAgICAgbm9wIHx8IEJDTFIgUjEsIFIyLCBSMwotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJjbHIgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDE1ICAgICAgMDIzMDEwODMgCi0gIDE2IDAwMjggMDBGMDAwMDAgCSAgICAgICAgbm9wIC0+IEJOT1QgUjEsIFIyLCBSMwotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJub3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDE2ICAgICAgODIxMDEwODMgCi0gIDE3IDAwMzAgMDIxMDEwODMgCSAgICAgICAgQk5PVCByMSwgcjIsIHIzIC0+IG5vcAotICAxNyAgICAgIDgwRjAwMDAwIAotICAxOCAgICAgICAgICAgICAgCSAgICAgICAgCi0gIDE5IDAwMzggMDQ3QzAxMDUgCSAgICAgICAgYnNldCByMSwgcjIsIHIzIHx8IG1vZGRlYyByNCwgNQotLiogIFdhcm5pbmc6U3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLSAgMTkgICAgICAwMjIwMTA4MyAKLSAgMjAgICAgICAgICAgICAgIAkKLSAgMjEgICAgICAgICAgICAgIAkgICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAyMiAwMDQwIDAyMjAxMDgzIAkgICAgICAgIG1vZGRlYyByNCwgNQotICAyMiAgICAgIDg0N0MwMTA1IAotICAyMyAgICAgICAgICAgICAgCQotICAyNCAgICAgICAgICAgICAgCSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gIDI1IDAwNDggMDIyMDEwODMgCSAgICAgICAgam9pbmxsIHI0LCByNSwgcjYKLSAgMjUgICAgICA4OEMwNDE0NiAKLSAgMjYgICAgICAgICAgICAgIAkKLSAgMjcgICAgICAgICAgICAgIAkgICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0gIDI4IDAwNTAgODIyMDEwODMgCSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gIDI4ICAgICAgMDhDMDQxNDYgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzlhNTZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBiaXR0ZXN0LnMKLSMKLSMgQml0IG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKEJDTFIsIEJOT1QsIEJTRVQsIEJUU1QpIHNob3VsZCBub3QgYmUgcGxhY2VkIGluIElVLgotIyBJZiB0aGUgdXNlciBzcGVjaWZpY2FsbHkgaW5kaWNhdGVzIHRoZXkgc2hvdWxkIGJlIGluIHRoZSBJVSwgR0FTIHdpbGwKLSMgZ2VuZXJhdGUgd2FybmluZ3MuIFRoZSByZWFzb24gd2h5IHRoaXMgaXMgbm90IGFuIGVycm9yIGlzIHRoYXQgdGhvc2UgaW5zdHJ1Y3Rpb25zIAotIyB3aWxsIGZhaWwgaW4gSVUgb25seSBvY2Nhc2lvbmFsbHkuIFRodXMgR0FTIHNob3VsZCBwYWNrIHRoZW0gaW4gTVUgZm9yCi0jIHNhZmV0eSwgYW5kIGl0IGp1c3QgbmVlZHMgdG8gZHJhdyBhdHRlbnRpb24gd2hlbiBhIHZpb2xhdGlvbiBpcyBnaXZlbi4gCi0KLQkKLQlub3AgLT4gbGR3IFIxLCBAKFIyLFIzKQotICAgICAgICBub3AgfHwgbGR3IFI2LCBAKFI1LFI0KQotICAgICAgICAKLSAgICAgICAgbm9wIC0+IEJTRVQgUjEsIFIyLCBSMyAKLSAgICAgICAgbm9wIDwtIEJUU1QgRjEsIFIyLCBSMyAKLSAgICAgICAgbm9wIHx8IEJDTFIgUjEsIFIyLCBSMwotICAgICAgICBub3AgLT4gQk5PVCBSMSwgUjIsIFIzCi0gICAgICAgIEJOT1QgcjEsIHIyLCByMyAtPiBub3AKLSAgICAgICAgCi0gICAgICAgIGJzZXQgcjEsIHIyLCByMyB8fCBtb2RkZWMgcjQsIDUKLQotICAgICAgICBic2V0IHIxLCByMiwgcjMKLSAgICAgICAgbW9kZGVjIHI0LCA1Ci0KLSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0KLSAgICAgICAgam9pbmxsIHI0LCByNSwgcjYKLSAgICAgICAgYnNldCByMSwgcjIsIHIzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2QzMC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2QzMC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIwZTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIyBEMzBWIGFzc2VtYmxlciB0ZXN0cwotIwotCi1wcm9jIHJ1bl9saXN0X3Rlc3QgeyBuYW1lIG9wdHMgfSB7Ci0gIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gIHNldCB0ZXN0bmFtZSAiRDMwViAkbmFtZSIKLSAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gIGdhc19ydW4gJHtuYW1lfS5zICRvcHRzICI+JmR1bXAub3V0IgotICBpZiB7W3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0ubCJdIH0gewotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgdmVyYm9zZSAib3V0cHV0IGlzIFtmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdIiAyCi0gICAgcmV0dXJuCi0gIH0KLSAgcGFzcyAkdGVzdG5hbWUKLX0KLQotaWYge1tpc3RhcmdldCBkMzB2LSotKl19IHsKLSAgcnVuX2R1bXBfdGVzdCAiaW5zdCIKLSAgcnVuX2R1bXBfdGVzdCAiYWxpZ24iCi0gIHJ1bl9kdW1wX3Rlc3QgImd1YXJkIgotICBydW5fZHVtcF90ZXN0ICJndWFyZC1kZWJ1ZyIKLSAgcnVuX2R1bXBfdGVzdCAicmVsb2MiCi0gIHJ1bl9kdW1wX3Rlc3QgIm9wdCIKLSAgcnVuX2R1bXBfdGVzdCAiYXJyYXkiCi0gIHJ1bl9kdW1wX3Rlc3QgImxhYmVsIgotICBydW5fbGlzdF90ZXN0ICJ3YXJuX29kZHJlZyIgIi1hbCIKLSAgcnVuX2xpc3RfdGVzdCAiYml0dGVzdCIgIi1hbCIKLSAgcnVuX2R1bXBfdGVzdCAiYml0dGVzdCIKLSAgcnVuX2xpc3RfdGVzdCAic2VyaWFsIiAiLWFsIgotICBydW5fbGlzdF90ZXN0ICJzZXJpYWwyIiAiLWFsIgotICBydW5fbGlzdF90ZXN0ICJzZXJpYWwyTyIgIi1hbCAtTyIKLSAgcnVuX2R1bXBfdGVzdCAibXVsIgotfQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTE1NGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI29iamR1bXA6IC1sZHIKLSNuYW1lOiBEMzBWIGRlYnVnICgtZykgdGVzdAotI2FzOiAtZwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLS4qOlswLTldKwotICAgMDoJMDgwMDEwODMgMDBmMDAwMDAgCWFkZC5zCXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gICA4OgkwODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMTA6CTE4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy90eAlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAxODoJMjgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL2Z4CXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDIwOgkzODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMveHQJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMjg6CTQ4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy94ZglyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAzMDoJNTgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3R0CXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDM4Ogk2ODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMvdGYJcjEsIHIyLCByMwl8fAlub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjBmN2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBTYW1lIGFzIGd1YXJkLnMgYnV0IGhlcmUgd2UgYXJlIHRlc3RpbmcgZGVidWcgKC1nKSBhc3NlbWJseQotIyBPbiB0aGUgRDMwViwgYXNzZW1ibGluZyB3aXRoIC1nIHNob3VsZCBkaXNhYmxlIHRoZSBWTElXIHBhY2tpbmcKLSMgYW5kIHB1dCBvbmx5IG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZS4JCi0KLQkudGV4dAotCi0JYWRkCXIxLHIyLHIzCi0JYWRkL2FsCXIxLHIyLHIzCi0JYWRkL3R4CXIxLHIyLHIzCi0JYWRkL2Z4CXIxLHIyLHIzCi0JYWRkL3h0CXIxLHIyLHIzCi0JYWRkL3hmCXIxLHIyLHIzCi0JYWRkL3R0CXIxLHIyLHIzCi0JYWRkL3RmCXIxLHIyLHIzCi0KLQkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZhMmRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIGd1YXJkZWQgZXhlY3V0aW9uIHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8LnRleHQ+OgotICAgMDoJMDgwMDEwODMgODgwMDEwODMgCWFkZC5zCXIxLCByMiwgcjMJLT4JYWRkLnMJcjEsIHIyLCByMwotICAgODoJMTgwMDEwODMgYTgwMDEwODMgCWFkZC5zL3R4CXIxLCByMiwgcjMJLT4JYWRkLnMvZngJcjEsIHIyLCByMwotICAxMDoJMzgwMDEwODMgYzgwMDEwODMgCWFkZC5zL3h0CXIxLCByMiwgcjMJLT4JYWRkLnMveGYJcjEsIHIyLCByMwotICAxODoJNTgwMDEwODMgZTgwMDEwODMgCWFkZC5zL3R0CXIxLCByMiwgcjMJLT4JYWRkLnMvdGYJcjEsIHIyLCByMwotICAyMDoJMDgwMDEwODMgODgwMDEwODMgCWFkZC5zCXIxLCByMiwgcjMJLT4JYWRkLnMJcjEsIHIyLCByMwotICAyODoJMTgwMDEwODMgYTgwMDEwODMgCWFkZC5zL3R4CXIxLCByMiwgcjMJLT4JYWRkLnMvZngJcjEsIHIyLCByMwotICAzMDoJMzgwMDEwODMgYzgwMDEwODMgCWFkZC5zL3h0CXIxLCByMiwgcjMJLT4JYWRkLnMveGYJcjEsIHIyLCByMwotICAzODoJNTgwMDEwODMgZTgwMDEwODMgCWFkZC5zL3R0CXIxLCByMiwgcjMJLT4JYWRkLnMvdGYJcjEsIHIyLCByMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDljZDMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgRDMwViBndWFyZGVkIGV4ZWN1dGlvbiBhc3NlbWJseSB0ZXN0Ci0KLQkudGV4dAotCi0JYWRkCXIxLHIyLHIzCi0JYWRkL2FsCXIxLHIyLHIzCi0JYWRkL3R4CXIxLHIyLHIzCi0JYWRkL2Z4CXIxLHIyLHIzCi0JYWRkL3h0CXIxLHIyLHIzCi0JYWRkL3hmCXIxLHIyLHIzCi0JYWRkL3R0CXIxLHIyLHIzCi0JYWRkL3RmCXIxLHIyLHIzCi0KLSMgY2hlY2sgY2FzZSBzZW5zaXRpdml0eSB0b28KLQlBREQJcjEscjIscjMKLQlBREQvQUwJcjEscjIscjMKLQlBREQvdHgJcjEscjIscjMKLQlhZGQvRlgJcjEscjIscjMKLQlBREQvWFQJcjEscjIscjMKLQlBREQvWEYJcjEscjIscjMKLQlhZGQvVFQJcjEscjIscjMKLQlBREQvdGYJcjEscjIscjMKLQkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2MWNiZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBiYXNpYyBpbnN0cnVjdGlvbiB0ZXN0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8c3RhcnQ+OgotICAgMDoJMDg4MTVhODAgODgwMDEwODMgCWFicwlyMjEsIHI0MgktPglhZGQucwlyMSwgcjIsIHIzCi0gICA4OgkwODBiMmNkYSAwMGYwMDAwMCAJYWRkLnMJcjUwLCByNTEsIDB4MWEJfHwJbm9wCQotICAxMDoJODgwYjJjZjcgOGFiMWJlZWYgCWFkZC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDE4OgkwODEwMTA4MyA4ODFiMmNkYSAJYWRkMmgucwlyMSwgcjIsIHIzCS0+CWFkZDJoLnMJcjUwLCByNTEsIDB4MWEKLSAgMjA6CTg4MWIyY2Y3IDhhYjFiZWVmIAlhZGQyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDI4OgkwODQwMTA4MyA4ODRiMmNkYSAJYWRkYy5zCXIxLCByMiwgcjMJLT4JYWRkYy5zCXI1MCwgcjUxLCAweDFhCi0gIDMwOgk4ODRiMmNmNyA4YWIxYmVlZiAJYWRkYy5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDM4OgkwOTAwMTA4MyA4OTBiMmNkYSAJYWRkaGxsbC5zCXIxLCByMiwgcjMJLT4JYWRkaGxsbC5zCXI1MCwgcjUxLCAweDFhCi0gIDQwOgk4OTBiMmNmNyA4YWIxYmVlZiAJYWRkaGxsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDQ4OgkwOTEwMTA4MyA4OTFiMmNkYSAJYWRkaGxsaC5zCXIxLCByMiwgcjMJLT4JYWRkaGxsaC5zCXI1MCwgcjUxLCAweDFhCi0gIDUwOgk4OTFiMmNmNyA4YWIxYmVlZiAJYWRkaGxsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDU4OgkwOTIwMTA4MyA4OTJiMmNkYSAJYWRkaGxobC5zCXIxLCByMiwgcjMJLT4JYWRkaGxobC5zCXI1MCwgcjUxLCAweDFhCi0gIDYwOgk4OTJiMmNmNyA4YWIxYmVlZiAJYWRkaGxobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDY4OgkwOTMwMTA4MyA4OTNiMmNkYSAJYWRkaGxoaC5zCXIxLCByMiwgcjMJLT4JYWRkaGxoaC5zCXI1MCwgcjUxLCAweDFhCi0gIDcwOgk4OTNiMmNmNyA4YWIxYmVlZiAJYWRkaGxoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDc4OgkwOTQwMTA4MyA4OTRiMmNkYSAJYWRkaGhsbC5zCXIxLCByMiwgcjMJLT4JYWRkaGhsbC5zCXI1MCwgcjUxLCAweDFhCi0gIDgwOgk4OTRiMmNmNyA4YWIxYmVlZiAJYWRkaGhsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDg4OgkwOTUwMTA4MyA4OTViMmNkYSAJYWRkaGhsaC5zCXIxLCByMiwgcjMJLT4JYWRkaGhsaC5zCXI1MCwgcjUxLCAweDFhCi0gIDkwOgk4OTViMmNmNyA4YWIxYmVlZiAJYWRkaGhsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDk4OgkwOTYwMTA4MyA4OTZiMmNkYSAJYWRkaGhobC5zCXIxLCByMiwgcjMJLT4JYWRkaGhobC5zCXI1MCwgcjUxLCAweDFhCi0gIGEwOgk4OTZiMmNmNyA4YWIxYmVlZiAJYWRkaGhobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGE4OgkwOTcwMTA4MyA4OTdiMmNkYSAJYWRkaGhoaC5zCXIxLCByMiwgcjMJLT4JYWRkaGhoaC5zCXI1MCwgcjUxLCAweDFhCi0gIGIwOgk4OTdiMmNmNyA4YWIxYmVlZiAJYWRkaGhoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGI4OgkwODYwMTA4MyA4ODZiMmNkYSAJYWRkcy5zCXIxLCByMiwgcjMJLT4JYWRkcy5zCXI1MCwgcjUxLCAweDFhCi0gIGMwOgk4ODZiMmNmNyA4YWIxYmVlZiAJYWRkcy5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGM4OgkwODcwMTA4MyA4ODdiMmNkYSAJYWRkczJoLnMJcjEsIHIyLCByMwktPglhZGRzMmgucwlyNTAsIHI1MSwgMHgxYQotICBkMDoJODg3YjJjZjcgOGFiMWJlZWYgCWFkZHMyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGQ4OgkwMzgwMTA4MyA4MzhiMmNkYSAJYW5kLnMJcjEsIHIyLCByMwktPglhbmQucwlyNTAsIHI1MSwgMHgxYQotICBlMDoJODM4YjJjZjcgOGFiMWJlZWYgCWFuZC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGU4OgkwMjgwMDA0MiA4Mjg4MzEwNSAJYW5kZmcJZjAsIGYxLCBmMgktPglhbmRmZwlmMywgcywgMHg1Ci0gIGYwOgkwOGEwMTA4MyA4OGE4NDE0NiAJYXZnLnMJcjEsIHIyLCByMwktPglhdmcucwlyNCwgcjUsIDB4NgotICBmODoJODhhYjJjZjcgOGFiMWJlZWYgCWF2Zy5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gMTAwOgkwOGIwMTA4MyA4OGI4NDE0NiAJYXZnMmgucwlyMSwgcjIsIHIzCS0+CWF2ZzJoLnMJcjQsIHI1LCAweDYKLSAxMDg6CTg4YmIyY2Y3IDhhYjFiZWVmIAlhdmcyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gMTEwOgkwMjMwMTA4MyA4MjM4NDE0NiAJYmNscglyMSwgcjIsIHIzCS0+CWJjbHIJcjQsIHI1LCAweDYKLSAxMTg6CTAyMTAxMDgzIDgyMTg1Y2M2IAlibm90CXIxLCByMiwgcjMJLT4JYm5vdAlyNSwgcjUxLCAweDYKLSAxMjA6CTAwMDAwMDI5IDAwZjAwMDAwIAlicmEucwlyNDEJfHwJbm9wCQotIDEyODoJMDAwODAwMDggMDBmMDAwMDAgCWJyYS5zCTQwCVwoMTY4IDxzdGFydFwrMHgxNjg+XCkJfHwJbm9wCQotIDEzMDoJMDAwODFlMDEgMDBmMDAwMDAgCWJyYS5zCWYwMDgJXChmMTM4IDxzdGFydFwrMHhmMTM4PlwpCXx8CW5vcAkKLSAxMzg6CTAwNDY5MDJhIDAwZjAwMDAwIAlicmF0bnoucwlyNDEsIHI0Mgl8fAlub3AJCi0gMTQwOgk4MDRjMTAwMCA4MDAwZjAwZCAJYnJhdG56LmwJcjEsIGYwMGQJXChmMTRkIDxzdGFydFwrMHhmMTRkPlwpCi0gMTQ4Ogk4MDRjMTAzNyA4YWIxZjAwZCAJYnJhdG56LmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMTU1IDxzdGFydFwrMHhkZWFkZjE1NT5cKQotIDE1MDoJMDA0MjkwMmEgMDBmMDAwMDAgCWJyYXR6ci5zCXI0MSwgcjQyCXx8CW5vcAkKLSAxNTg6CTgwNDgxMDAwIDgwMDBmMDBkIAlicmF0enIubAlyMSwgZjAwZAlcKGYxNjUgPHN0YXJ0XCsweGYxNjU+XCkKLSAxNjA6CTgwNDgxMDM3IDhhYjFmMDBkIAlicmF0enIubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYxNmQgPHN0YXJ0XCsweGRlYWRmMTZkPlwpCi0gMTY4OgkwMjIwMTA4MyA4MjI4NWNjNiAJYnNldAlyMSwgcjIsIHIzCS0+CWJzZXQJcjUsIHI1MSwgMHg2Ci0gMTcwOgkwMDIwMDAyOSAwMGYwMDAwMCAJYnNyLnMJcjQxCXx8CW5vcAkKLSAxNzg6CTAwMjgxZTAxIDAwZjAwMDAwIAlic3IucwlmMDA4CVwoZjE4MCA8c3RhcnRcKzB4ZjE4MD5cKQl8fAlub3AJCi0gMTgwOgk4MDI4MDAzNyA4YWIxZjAwZCAJYnNyLmwJLTIxNTIwZmYzCVwoZGVhZGYxOGQgPHN0YXJ0XCsweGRlYWRmMThkPlwpCi0gMTg4OgkwMDY2OTAyYSAwMGYwMDAwMCAJYnNydG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDE5MDoJODA2YzEwMDAgODAwMGYwMGQgCWJzcnRuei5sCXIxLCBmMDBkCVwoZjE5ZCA8c3RhcnRcKzB4ZjE5ZD5cKQotIDE5ODoJODA2YzEwMzcgOGFiMWYwMGQgCWJzcnRuei5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjFhNSA8c3RhcnRcKzB4ZGVhZGYxYTU+XCkKLSAxYTA6CTAwNjI5MDJhIDAwZjAwMDAwIAlic3J0enIucwlyNDEsIHI0Mgl8fAlub3AJCi0gMWE4Ogk4MDY4MTAwMCA4MDAwZjAwZCAJYnNydHpyLmwJcjEsIGYwMGQJXChmMWI1IDxzdGFydFwrMHhmMWI1PlwpCi0gMWIwOgk4MDY4MTAzNyA4YWIxZjAwZCAJYnNydHpyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMWJkIDxzdGFydFwrMHhkZWFkZjFiZD5cKQotIDFiODoJMDIwMDEwODMgODIwODVjYzYgCWJ0c3QJZjEsIHIyLCByMwktPglidHN0CXYsIHI1MSwgMHg2Ci0gMWMwOgkwMmMwMDBjMSA4MmMwOTUxNSAJY21wZXEucwlmMCwgcjMsIHIxCS0+CWNtcG5lLnMJZjEsIHIyMCwgcjIxCi0gMWM4OgkwMmMxMjdlMCA4MmMxYjBjNCAJY21wZ3QucwlmMiwgcjMxLCByMzIJLT4JY21wZ2UucwlmMywgcjMsIHI0Ci0gMWQwOgkwMmMyNDBjNCA4MmMyZDBjNCAJY21wbHQucwlzLCByMywgcjQJLT4JY21wbGUucwl2LCByMywgcjQKLSAxZDg6CTAyYzM2MGM0IDgyYzNmMGM0IAljbXBwcy5zCXZhLCByMywgcjQJLT4JY21wbmcucwljLCByMywgcjQKLSAxZTA6CTAyZDEyN2UwIDgyZDFiMGM0IAljbXB1Z3QucwlmMiwgcjMxLCByMzIJLT4JY21wdWdlLnMJZjMsIHIzLCByNAotIDFlODoJMDJkMjQwYzQgODJkMmQwYzQgCWNtcHVsdC5zCXMsIHIzLCByNAktPgljbXB1bGUucwl2LCByMywgcjQKLSAxZjA6CTAxMDAxMDA4IDgxMDgxMDIwIAlkYnJhLnMJcjEsIHI4CS0+CWRicmEucwlyMSwgMTAwCVwoMmYwIDxzdGFydFwrMHgyZjA+XCkKLSAxZjg6CTgxMDgxMDM3IDhhYjFmMDBkIAlkYnJhLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMjA1IDxzdGFydFwrMHhkZWFkZjIwNT5cKQotIDIwMDoJMDE0MDIwMWYgODE0ODIwMjAgCWRicmFpLnMJMTAsIHIzMQktPglkYnJhaS5zCTEwLCAxMDAJXCgzMDAgPHN0YXJ0XCsweDMwMD5cKQotIDIwODoJODE0ODIwMzcgOGFiMWYwMGQgCWRicmFpLmwJMTAsIC0yMTUyMGZmMwlcKGRlYWRmMjE1IDxzdGFydFwrMHhkZWFkZjIxNT5cKQotIDIxMDoJMDEyMDEwMDggMDBmMDAwMDAgCWRic3IucwlyMSwgcjgJfHwJbm9wCQotIDIxODoJMDEyODEwMjAgMDBmMDAwMDAgCWRic3IucwlyMSwgMTAwCVwoMzE4IDxzdGFydFwrMHgzMTg+XCkJfHwJbm9wCQotIDIyMDoJODEyODEwMzcgOGFiMWYwMGQgCWRic3IubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYyMmQgPHN0YXJ0XCsweGRlYWRmMjJkPlwpCi0gMjI4OgkwMTYwNDAxZiAwMGYwMDAwMCAJZGJzcmkucwkyMCwgcjMxCXx8CW5vcAkKLSAyMzA6CTAxNjg0MDIwIDAwZjAwMDAwIAlkYnNyaS5zCTIwLCAxMDAJXCgzMzAgPHN0YXJ0XCsweDMzMD5cKQl8fAlub3AJCi0gMjM4Ogk4MTY4NDAzNyA4YWIxZjAwZCAJZGJzcmkubAkyMCwgLTIxNTIwZmYzCVwoZGVhZGYyNDUgPHN0YXJ0XCsweGRlYWRmMjQ1PlwpCi0gMjQwOgkwMTEwMTAyMCAwMGYwMDAwMCAJZGptcC5zCXIxLCByMzIJfHwJbm9wCQotIDI0ODoJODExODEwMDAgODAwMGYwMGQgCWRqbXAubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyNTA6CTgxMTgxMDM3IDhhYjFmMDBkIAlkam1wLmwJcjEsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAyNTg6CTAxNTA2MDIwIDAwZjAwMDAwIAlkam1waS5zCTMwLCByMzIJfHwJbm9wCQotIDI2MDoJODE1ODYwMDAgODAwMGYwMGQgCWRqbXBpLmwJMzAsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMjY4Ogk4MTU4NjAzNyA4YWIxZjAwZCAJZGptcGkubAkzMCwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDI3MDoJMDEzMDEwMjAgMDBmMDAwMDAgCWRqc3IucwlyMSwgcjMyCXx8CW5vcAkKLSAyNzg6CTgxMzgxMDAwIDgwMDBmMDBkIAlkanNyLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMjgwOgk4MTM4MTAzNyA4YWIxZjAwZCAJZGpzci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMjg4OgkwMTcwMjAyMCAwMGYwMDAwMCAJZGpzcmkucwkxMCwgcjMyCXx8CW5vcAkKLSAyOTA6CTgxNzg0MDAwIDgwMDBmMDBkIAlkanNyaS5sCTIwLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDI5ODoJODE3ODgwMzcgOGFiMWYwMGQgCWRqc3JpLmwJNDAsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAyYTA6CTAwMTAwMDI5IDAwZjAwMDAwIAlqbXAucwlyNDEJfHwJbm9wCQotIDJhODoJMDAxODFlMDEgMDBmMDAwMDAgCWptcC5zCWYwMDggPHN0YXJ0XCsweGYwMDg+CXx8CW5vcAkKLSAyYjA6CTgwMTgwMDM3IDhhYjFmMDBkIAlqbXAubAlkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmI4OgkwMDU2OTAyYSAwMGYwMDAwMCAJam1wdG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDJjMDoJODA1YzEwMDAgODAwMGYwMGQgCWptcHRuei5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDJjODoJODA1YzEwMzcgOGFiMWYwMGQgCWptcHRuei5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmQwOgkwMDUyOTAyYSAwMGYwMDAwMCAJam1wdHpyLnMJcjQxLCByNDIJfHwJbm9wCQotIDJkODoJODA1ODEwMDAgODAwMGYwMGQgCWptcHR6ci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDJlMDoJODA1ODEwMzcgOGFiMWYwMGQgCWptcHR6ci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmU4OgkwOGMwMTA4NCA4OGM4MTA4ZiAJam9pbmxsLnMJcjEsIHIyLCByNAktPglqb2lubGwucwlyMSwgcjIsIDB4ZgotIDJmMDoJODhjODEwYjcgOGFiMWYwMGQgCWpvaW5sbC5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDJmODoJMDhkMDEwODQgODhkODEwOGYgCWpvaW5saC5zCXIxLCByMiwgcjQJLT4Jam9pbmxoLnMJcjEsIHIyLCAweGYKLSAzMDA6CTg4ZDgxMGI3IDhhYjFmMDBkIAlqb2lubGgubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSAzMDg6CTA4ZTAxMDg0IDg4ZTgxMDhmIAlqb2luaGwucwlyMSwgcjIsIHI0CS0+CWpvaW5obC5zCXIxLCByMiwgMHhmCi0gMzEwOgk4OGU4MTBiNyA4YWIxZjAwZCAJam9pbmhsLmwJcjEsIHIyLCAweGRlYWRmMDBkCi0gMzE4OgkwOGYwMTA4NCA4OGY4MTA4ZiAJam9pbmhoLnMJcjEsIHIyLCByNAktPglqb2luaGgucwlyMSwgcjIsIDB4ZgotIDMyMDoJODhmODEwYjcgOGFiMWYwMGQgCWpvaW5oaC5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDMyODoJMDAzMDAwMjkgMDBmMDAwMDAgCWpzci5zCXI0MQl8fAlub3AJCi0gMzMwOgkwMDM4MWUwMSAwMGYwMDAwMCAJanNyLnMJZjAwOCA8c3RhcnRcKzB4ZjAwOD4JfHwJbm9wCQotIDMzODoJODAzODAwMzcgOGFiMWYwMGQgCWpzci5sCWRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAzNDA6CTAwNzY5MDJhIDAwZjAwMDAwIAlqc3J0bnoucwlyNDEsIHI0Mgl8fAlub3AJCi0gMzQ4Ogk4MDdjMTAwMCA4MDAwZjAwZCAJanNydG56LmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMzUwOgk4MDdjMTAzNyA4YWIxZjAwZCAJanNydG56LmwJcjEsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAzNTg6CTAwNzI5MDJhIDAwZjAwMDAwIAlqc3J0enIucwlyNDEsIHI0Mgl8fAlub3AJCi0gMzYwOgk4MDc4MTAwMCA4MDAwZjAwZCAJanNydHpyLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMzY4Ogk4MDc4MTAzNyA4YWIxZjAwZCAJanNydHpyLmwJcjEsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAzNzA6CTA0MzA2MWM4IDg0MzQ2MWM4IAlsZDJoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkMmgucwlyNiwgQFwocjdcKywgcjhcKQotIDM3ODoJMDQzYzYxYzggODQzODYxZGEgCWxkMmgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkMmgucwlyNiwgQFwocjcsIDB4MWFcKQotIDM4MDoJODQzODYxYzAgODAwMDEyMzQgCWxkMmgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gMzg4OgkwNDYwNjFjOCA4NDY0NjFjOCAJbGQydy5zCXI2LCBAXChyNywgcjhcKQktPglsZDJ3LnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzOTA6CTA0NmM2MWM4IDg0Njg2MWRhIAlsZDJ3LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZDJ3LnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzOTg6CTg0Njg2MWMwIDgwMDAxMjM0IAlsZDJ3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDNhMDoJMDQ1MDYxYzggODQ1NDYxYzggCWxkNGJoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkNGJoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzYTg6CTA0NWM2MWM4IDg0NTg2MWRhIAlsZDRiaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQ0YmgucwlyNiwgQFwocjcsIDB4MWFcKQotIDNiMDoJODQ1ODYxYzAgODAwMDEyMzQgCWxkNGJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDNiODoJMDRkMDYxYzggODRkNDYxYzggCWxkNGJodS5zCXI2LCBAXChyNywgcjhcKQktPglsZDRiaHUucwlyNiwgQFwocjdcKywgcjhcKQotIDNjMDoJMDRkYzYxYzggODRkODYxZGEgCWxkNGJodS5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQ0Ymh1LnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzYzg6CTg0ZDg2MWMwIDgwMDAxMjM0IAlsZDRiaHUubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gM2QwOgkwNDAwNjFjOCA4NDA0NjFjOCAJbGRiLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkYi5zCXI2LCBAXChyN1wrLCByOFwpCi0gM2Q4OgkwNDBjNjFjOCA4NDA4NjFkYSAJbGRiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGIucwlyNiwgQFwocjcsIDB4MWFcKQotIDNlMDoJODQwODYxYzAgODAwMDEyMzQgCWxkYi5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSAzZTg6CTA0OTA2MWM4IDg0OTQ2MWM4IAlsZGJ1LnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkYnUucwlyNiwgQFwocjdcKywgcjhcKQotIDNmMDoJMDQ5YzYxYzggODQ5ODYxZGEgCWxkYnUucwlyNiwgQFwocjctLCByOFwpCS0+CWxkYnUucwlyNiwgQFwocjcsIDB4MWFcKQotIDNmODoJODQ5ODYxYzAgODAwMDEyMzQgCWxkYnUubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDAwOgkwNDIwNjFjOCA4NDI0NjFjOCAJbGRoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gNDA4OgkwNDJjNjFjOCA4NDI4NjFkYSAJbGRoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGgucwlyNiwgQFwocjcsIDB4MWFcKQotIDQxMDoJODQyODYxYzAgODAwMDEyMzQgCWxkaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA0MTg6CTA0MTA2MWM4IDg0MTQ2MWM4IAlsZGhoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkaGgucwlyNiwgQFwocjdcKywgcjhcKQotIDQyMDoJMDQxYzYxYzggODQxODYxZGEgCWxkaGgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkaGgucwlyNiwgQFwocjcsIDB4MWFcKQotIDQyODoJODQxODYxYzAgODAwMDEyMzQgCWxkaGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDMwOgkwNGEwNjFjOCA4NGE0NjFjOCAJbGRodS5zCXI2LCBAXChyNywgcjhcKQktPglsZGh1LnMJcjYsIEBcKHI3XCssIHI4XCkKLSA0Mzg6CTA0YWM2MWM4IDg0YTg2MWRhIAlsZGh1LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGh1LnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0NDA6CTg0YTg2MWMwIDgwMDAxMjM0IAlsZGh1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQ0ODoJMDQ0MDYxYzggODQ0NDYxYzggCWxkdy5zCXI2LCBAXChyNywgcjhcKQktPglsZHcucwlyNiwgQFwocjdcKywgcjhcKQotIDQ1MDoJMDQ0YzYxYzggODQ0ODYxZGEgCWxkdy5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGR3LnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0NTg6CTg0NDg2MWMwIDgwMDAxMjM0IAlsZHcubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDYwOgk4YjQ4MTA5ZiAwYjQwMTA4NCAJbWFjMAlyMSwgcjIsIDB4MWYJPC0JbWFjMAlyMSwgcjIsIHI0Ci0gNDY4Ogk4YjRjMTA5ZiAwYjQ0MTA4NCAJbWFjMQlyMSwgcjIsIDB4MWYJPC0JbWFjMQlyMSwgcjIsIHI0Ci0gNDcwOgk4YjU4MTA5ZiAwYjUwMTA4NCAJbWFjczAJcjEsIHIyLCAweDFmCTwtCW1hY3MwCXIxLCByMiwgcjQKLSA0Nzg6CThiNWMxMDlmIDBiNTQxMDg0IAltYWNzMQlyMSwgcjIsIDB4MWYJPC0JbWFjczEJcjEsIHIyLCByNAotIDQ4MDoJMDQ3YzAwNGEgODQ3NDAwNGEgCW1vZGRlYwlyMSwgMHhhCS0+CW1vZGluYwlyMSwgMHhhCi0gNDg4Ogk4YjY4MTA5ZiAwYjYwMTA4NCAJbXN1YjAJcjEsIHIyLCAweDFmCTwtCW1zdWIwCXIxLCByMiwgcjQKLSA0OTA6CThiNmMxMDlmIDBiNjQxMDg0IAltc3ViMQlyMSwgcjIsIDB4MWYJPC0JbXN1YjEJcjEsIHIyLCByNAotIDQ5ODoJOGIwODEwOGEgMGIwMDEwODQgCW11bAlyMSwgcjIsIDB4YQk8LQltdWwJcjEsIHIyLCByNAotIDRhMDoJOGI3ODEwOWYgMGI3MDEwODQgCW1zdWJzMAlyMSwgcjIsIDB4MWYJPC0JbXN1YnMwCXIxLCByMiwgcjQKLSA0YTg6CThiN2MxMDlmIDBiNzQxMDg0IAltc3ViczEJcjEsIHIyLCAweDFmCTwtCW1zdWJzMQlyMSwgcjIsIHI0Ci0gNGIwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gNGI4Ogk4YTA4MTA4YSAwYTAwMTA4NCAJbXVsMmgJcjEsIHIyLCAweGEJPC0JbXVsMmgJcjEsIHIyLCByNAotIDRjMDoJOGE0ODEwOGEgMGE0MDEwODQgCW11bGh4bGwJcjEsIHIyLCAweGEJPC0JbXVsaHhsbAlyMSwgcjIsIHI0Ci0gNGM4Ogk4YTU4MTA4YSAwYTUwMTA4NCAJbXVsaHhsaAlyMSwgcjIsIDB4YQk8LQltdWxoeGxoCXIxLCByMiwgcjQKLSA0ZDA6CThhNjgxMDhhIDBhNjAxMDg0IAltdWxoeGhsCXIxLCByMiwgMHhhCTwtCW11bGh4aGwJcjEsIHIyLCByNAotIDRkODoJOGE3ODEwOGEgMGE3MDEwODQgCW11bGh4aGgJcjEsIHIyLCAweGEJPC0JbXVsaHhoaAlyMSwgcjIsIHI0Ci0gNGUwOgk4YjkwMDA0NCAwYTEwODA4NCAJbXVseHMJYTAsIHIxLCByNAk8LQltdWx4MmgJcjgsIHIyLCByNAotIDRlODoJOGI4ODEwOGEgMGI4MDAwNDQgCW11bHgJYTEsIHIyLCAweGEJPC0JbXVseAlhMCwgcjEsIHI0Ci0gNGYwOgk4YmY4MjA0YSAwYmYwMTAwNCAJbXZmYWNjCXIyLCBhMSwgMHhhCTwtCW12ZmFjYwlyMSwgYTAsIHI0Ci0gNGY4Ogk4Yjk4MTA4YSAwYTE4ODA4YSAJbXVseHMJYTEsIHIyLCAweGEJPC0JbXVseDJoCXI4LCByMiwgMHhhCi0gNTAwOgkwMWUwYTA4MCA4MWUwYTFjMCAJbXZmc3lzCXIxMCwgcGMJLT4JbXZmc3lzCXIxMCwgcnB0X2MKLSA1MDg6CTAxZTBhMDAwIDgxZTBhMDAyIAltdmZzeXMJcjEwLCBwc3cJLT4JbXZmc3lzCXIxMCwgcHN3aAotIDUxMDoJMDFlMGEwMDEgODFlMGEwMDMgCW12ZnN5cwlyMTAsIHBzd2wJLT4JbXZmc3lzCXIxMCwgZjAKLSA1MTg6CTAxZTBhMTAzIDhhZjAxMDg0IAltdmZzeXMJcjEwLCBzCS0+CW12dGFjYwlhMSwgcjIsIHI0Ci0gNTIwOgkwMGUwNzI4MCA4MGUwMDI4MCAJbXZ0c3lzCXJwdF9jLCByMTAJLT4JbXZ0c3lzCXBzdywgcjEwCi0gNTI4OgkwMGUwMDI4MiA4MGUwMDI4MSAJbXZ0c3lzCXBzd2gsIHIxMAktPgltdnRzeXMJcHN3bCwgcjEwCi0gNTMwOgkwMGUwMDI4MyA4MGUwMzI4MyAJbXZ0c3lzCWYwLCByMTAJLT4JbXZ0c3lzCWYzLCByMTAKLSA1Mzg6CTAwZTA0MjgzIDgwZTA1MjgzIAltdnRzeXMJcywgcjEwCS0+CW12dHN5cwl2LCByMTAKLSA1NDA6CTAwZTA2MjgzIDgwZTA3MjgzIAltdnRzeXMJdmEsIHIxMAktPgltdnRzeXMJYywgcjEwCi0gNTQ4OgkwMGYwMDAwMCA4MzkwMTA4MCAJbm9wCQktPglub3QJcjEsIHIyCi0gNTUwOgkwMjkwMTA4MCA4M2EwMTA4NCAJbm90ZmcJZjEsIGYyCS0+CW9yLnMJcjEsIHIyLCByNAotIDU1ODoJMDNhODEwOWEgMDBmMDAwMDAgCW9yLnMJcjEsIHIyLCAweDFhCXx8CW5vcAkKLSA1NjA6CTgzYTgxMGI3IDhhYjFmMDBkIAlvci5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDU2ODoJMDJhMDEwODQgODJhODQwODEgCW9yZmcJZjEsIGYyLCBzCS0+CW9yZmcJcywgZjIsIDB4MQotIDU3MDoJMDA4MDAwMDAgMDBmMDAwMDAgCXJlaXQJCXx8CW5vcAkKLSA1Nzg6CTAxODAxMDAyIDAwZjAwMDAwIAlyZXBlYXQucwlyMSwgcjIJfHwJbm9wCQotIDU4MDoJODE4ODQwMDAgODAwMGRlYWQgCXJlcGVhdC5sCXI0LCBkZWFkCVwoZTQyZCA8c3RhcnRcKzB4ZTQyZD5cKQotIDU4ODoJODE4ODQwMzcgOGFiMWYwMGQgCXJlcGVhdC5sCXI0LCAtMjE1MjBmZjMJXChkZWFkZjU5NSA8c3RhcnRcKzB4ZGVhZGY1OTU+XCkKLSA1OTA6CTAxYTBhMDAxIDgxYThhMjAwIAlyZXBlYXRpLnMJYQlcKDU5YSA8c3RhcnRcKzB4NTlhPlwpLCByMQktPglyZXBlYXRpLnMJYQlcKDU5YSA8c3RhcnRcKzB4NTlhPlwpLCAxMDAwCVwoMTU5MCA8c3RhcnRcKzB4MTU5MD5cKQotIDU5ODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotIDVhMDoJMDM0MDEwODQgODM0ODEwOGEgCXJvdAlyMSwgcjIsIHI0CS0+CXJvdAlyMSwgcjIsIDB4YQotIDVhODoJMDM1MDEwODQgODM1ODEwOGEgCXJvdDJoCXIxLCByMiwgcjQJLT4Jcm90MmgJcjEsIHIyLCAweGEKLSA1YjA6CThhODgxMDhhIDBhODAxMDg0IAlzYXQJcjEsIHIyLCAweGEJPC0Jc2F0CXIxLCByMiwgcjQKLSA1Yjg6CThhOTgxMDhhIDBhOTAxMDg0IAlzYXQyaAlyMSwgcjIsIDB4YQk8LQlzYXQyaAlyMSwgcjIsIHI0Ci0gNWMwOgk4YmM4MTA4YSAwYmMwMTA4NCAJc2F0aGwJcjEsIHIyLCAweGEJPC0Jc2F0aGwJcjEsIHIyLCByNAotIDVjODoJOGJkODEwOGEgMGJkMDEwODQgCXNhdGhoCXIxLCByMiwgMHhhCTwtCXNhdGhoCXIxLCByMiwgcjQKLSA1ZDA6CThhYTgxMDhhIDBhYTAxMDg0IAlzYXR6CXIxLCByMiwgMHhhCTwtCXNhdHoJcjEsIHIyLCByNAotIDVkODoJOGFiODEwOGEgMGFiMDEwODQgCXNhdHoyaAlyMSwgcjIsIDB4YQk8LQlzYXR6MmgJcjEsIHIyLCByNAotIDVlMDoJMDMwMDEwODQgODMwODEwOGEgCXNyYQlyMSwgcjIsIHI0CS0+CXNyYQlyMSwgcjIsIDB4YQotIDVlODoJMDMxMDEwODQgODMxODEwOGEgCXNyYTJoCXIxLCByMiwgcjQJLT4Jc3JhMmgJcjEsIHIyLCAweGEKLSA1ZjA6CTAzNjAxMDg0IDgzNjgxMDhhIAlzcmMJcjEsIHIyLCByNAktPglzcmMJcjEsIHIyLCAweGEKLSA1Zjg6CTAzMjAxMDg0IDgzMjgxMDhhIAlzcmwJcjEsIHIyLCByNAktPglzcmwJcjEsIHIyLCAweGEKLSA2MDA6CTAzMzAxMDg0IDgzMzgxMDhhIAlzcmwyaAlyMSwgcjIsIHI0CS0+CXNybDJoCXIxLCByMiwgMHhhCi0gNjA4OgkwNTMwNjFjOCA4NTM0NjFjOCAJc3QyaC5zCXI2LCBAXChyNywgcjhcKQktPglzdDJoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2MTA6CTA1M2M2MWM4IDg1Mzg2MWRhIAlzdDJoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdDJoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2MTg6CTg1Mzg2MWMwIDgwMDAxMjM0IAlzdDJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDYyMDoJMDU2MDYxYzggODU2NDYxYzggCXN0MncucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3Qydy5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjI4OgkwNTZjNjFjOCA4NTY4NjFkYSAJc3Qydy5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3Qydy5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjMwOgk4NTY4NjFjMCA4MDAwMTIzNCAJc3Qydy5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2Mzg6CTA1NTA2MWM4IDg1NTQ2MWM4IAlzdDRoYi5zCXI2LCBAXChyNywgcjhcKQktPglzdDRoYi5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjQwOgkwNTVjNjFjOCA4NTU4NjFkYSAJc3Q0aGIucwlyNiwgQFwocjctLCByOFwpCS0+CXN0NGhiLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2NDg6CTg1NTg2MWMwIDgwMDAxMjM0IAlzdDRoYi5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2NTA6CTA1MDA2MWM4IDg1MDQ2MWM4IAlzdGIucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RiLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2NTg6CTA1MGM2MWM4IDg1MDg2MWRhIAlzdGIucwlyNiwgQFwocjctLCByOFwpCS0+CXN0Yi5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjYwOgk4NTA4NjFjMCA4MDAwMTIzNCAJc3RiLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDY2ODoJMDUyMDYxYzggODUyNDYxYzggCXN0aC5zCXI2LCBAXChyNywgcjhcKQktPglzdGgucwlyNiwgQFwocjdcKywgcjhcKQotIDY3MDoJMDUyYzYxYzggODUyODYxZGEgCXN0aC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3RoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2Nzg6CTg1Mjg2MWMwIDgwMDAxMjM0IAlzdGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNjgwOgkwNTEwNjFjOCA4NTE0NjFjOCAJc3RoaC5zCXI2LCBAXChyNywgcjhcKQktPglzdGhoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2ODg6CTA1MWM2MWM4IDg1MTg2MWRhIAlzdGhoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdGhoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2OTA6CTg1MTg2MWMwIDgwMDAxMjM0IAlzdGhoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDY5ODoJMDU0MDYxYzggODU0NDYxYzggCXN0dy5zCXI2LCBAXChyNywgcjhcKQktPglzdHcucwlyNiwgQFwocjdcKywgcjhcKQotIDZhMDoJMDU0YzYxYzggODU0ODYxZGEgCXN0dy5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3R3LnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2YTg6CTg1NDg2MWMwIDgwMDAxMjM0IAlzdHcubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNmIwOgkwODIwMTA4MyA4ODJiMmNkYSAJc3ViLnMJcjEsIHIyLCByMwktPglzdWIucwlyNTAsIHI1MSwgMHgxYQotIDZiODoJODgyYjJjZjcgOGFiMWJlZWYgCXN1Yi5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmMwOgkwODMwMTA4MyA4ODNiMmNkYSAJc3ViMmgucwlyMSwgcjIsIHIzCS0+CXN1YjJoLnMJcjUwLCByNTEsIDB4MWEKLSA2Yzg6CTg4M2IyY2Y3IDhhYjFiZWVmIAlzdWIyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmQwOgkwODUwMTA4MyA4ODViMmNkYSAJc3ViYi5zCXIxLCByMiwgcjMJLT4Jc3ViYi5zCXI1MCwgcjUxLCAweDFhCi0gNmQ4Ogk4ODViMmNmNyA4YWIxYmVlZiAJc3ViYi5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmUwOgkwOTgwMTA4MyA4OThiMmNkYSAJc3ViaGxsbC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxsbC5zCXI1MCwgcjUxLCAweDFhCi0gNmU4Ogk4OThiMmNmNyA4YWIxYmVlZiAJc3ViaGxsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmYwOgkwOTkwMTA4MyA4OTliMmNkYSAJc3ViaGxsaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxsaC5zCXI1MCwgcjUxLCAweDFhCi0gNmY4Ogk4OTliMmNmNyA4YWIxYmVlZiAJc3ViaGxsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzAwOgkwOWEwMTA4MyA4OWFiMmNkYSAJc3ViaGxobC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxobC5zCXI1MCwgcjUxLCAweDFhCi0gNzA4Ogk4OWFiMmNmNyA4YWIxYmVlZiAJc3ViaGxobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzEwOgkwOWIwMTA4MyA4OWJiMmNkYSAJc3ViaGxoaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxoaC5zCXI1MCwgcjUxLCAweDFhCi0gNzE4Ogk4OWJiMmNmNyA4YWIxYmVlZiAJc3ViaGxoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzIwOgkwOWMwMTA4MyA4OWNiMmNkYSAJc3ViaGhsbC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhsbC5zCXI1MCwgcjUxLCAweDFhCi0gNzI4Ogk4OWNiMmNmNyA4YWIxYmVlZiAJc3ViaGhsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzMwOgkwOWQwMTA4MyA4OWRiMmNkYSAJc3ViaGhsaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhsaC5zCXI1MCwgcjUxLCAweDFhCi0gNzM4Ogk4OWRiMmNmNyA4YWIxYmVlZiAJc3ViaGhsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzQwOgkwOWUwMTA4MyA4OWViMmNkYSAJc3ViaGhobC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhobC5zCXI1MCwgcjUxLCAweDFhCi0gNzQ4Ogk4OWViMmNmNyA4YWIxYmVlZiAJc3ViaGhobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzUwOgkwOWYwMTA4MyA4OWZiMmNkYSAJc3ViaGhoaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhoaC5zCXI1MCwgcjUxLCAweDFhCi0gNzU4Ogk4OWZiMmNmNyA4YWIxYmVlZiAJc3ViaGhoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzYwOgkwMDkwMDAwMSAwMGYwMDAwMCAJdHJhcC5zCXIxCXx8CW5vcAkKLSA3Njg6CTAwOTgwMDBhIDAwZjAwMDAwIAl0cmFwLnMJMHhhCXx8CW5vcAkKLSA3NzA6CTAzYjAxMDg0IDgzYjgxMDhhIAl4b3IucwlyMSwgcjIsIHI0CS0+CXhvci5zCXIxLCByMiwgMHhhCi0gNzc4Ogk4M2I4MTBiNyA4YWIxZjAwZCAJeG9yLmwJcjEsIHIyLCAweGRlYWRmMDBkCi0gNzgwOgkwMmIwMTA4NCA4MmI4MTEwYSAJeG9yZmcJZjEsIGYyLCBzCS0+CXhvcmZnCWYxLCBzLCAweGEKLSA3ODg6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKLSA3OTA6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKLSA3OTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLSA3YTA6CTgwZjAwMDAwIDAwZjAwMDAwIAlub3AJCTwtCW5vcAkKLSA3YTg6CTAzOTAxMDgwIDAwZjAwMDAwIAlub3QJcjEsIHIyCXx8CW5vcAkKLSA3YjA6CTAzOTAyMGMwIDgwZjAwMDAwIAlub3QJcjIsIHIzCS0+CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNjYxMWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotIyB0ZXN0IGFsbCBpbnN0cnVjdGlvbnMKLQotc3RhcnQ6Ci0JYWJzCXIyMSxyNDIKLQotCWFkZAlyMSxyMixyMwotCWFkZAlyNTAscjUxLDB4MWEKLQlhZGQJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGQyaAlyMSxyMixyMwotCWFkZDJoCXI1MCxyNTEsMHgxYQotCWFkZDJoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkYwlyMSxyMixyMwotCWFkZGMJcjUwLHI1MSwweDFhCi0JYWRkYwlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhsbGwJcjEscjIscjMKLQlhZGRobGxsCXI1MCxyNTEsMHgxYQotCWFkZGhsbGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRobGxoCXIxLHIyLHIzCi0JYWRkaGxsaAlyNTAscjUxLDB4MWEKLQlhZGRobGxoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGxobAlyMSxyMixyMwotCWFkZGhsaGwJcjUwLHI1MSwweDFhCi0JYWRkaGxobAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhsaGgJcjEscjIscjMKLQlhZGRobGhoCXI1MCxyNTEsMHgxYQotCWFkZGhsaGgJcjUwLHI1MSwweGRlYWRiZWVmCi0JCQotCWFkZGhobGwJcjEscjIscjMKLQlhZGRoaGxsCXI1MCxyNTEsMHgxYQotCWFkZGhobGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRoaGxoCXIxLHIyLHIzCi0JYWRkaGhsaAlyNTAscjUxLDB4MWEKLQlhZGRoaGxoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGhobAlyMSxyMixyMwotCWFkZGhoaGwJcjUwLHI1MSwweDFhCi0JYWRkaGhobAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhoaGgJcjEscjIscjMKLQlhZGRoaGhoCXI1MCxyNTEsMHgxYQotCWFkZGhoaGgJcjUwLHI1MSwweGRlYWRiZWVmCi0JCi0JYWRkcwlyMSxyMixyMwotCWFkZHMJcjUwLHI1MSwweDFhCi0JYWRkcwlyNTAscjUxLDB4ZGVhZGJlZWYKLQkJCi0JYWRkczJoCXIxLHIyLHIzCi0JYWRkczJoCXI1MCxyNTEsMHgxYQotCWFkZHMyaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQkJCi0JYW5kCXIxLHIyLHIzCi0JYW5kCXI1MCxyNTEsMHgxYQotCWFuZAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFuZGZnCWYwLGYxLGYyCi0JYW5kZmcJZjMsZjQsNQotCQotCWF2ZwlyMSxyMixyMwotCWF2ZwlyNCxyNSw2Ci0JYXZnCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYXZnMmgJcjEscjIscjMKLQlhdmcyaAlyNCxyNSw2Ci0JYXZnMmgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQliY2xyCXIxLHIyLHIzCi0JYmNscglyNCxyNSw2Ci0JCi0JYm5vdAlyMSxyMixyMwotCWJub3QJcjUscjUxLDYKLQkJCQotCWJyYQlyNDEKLQlicmEJMHg0MAotCWJyYQkweGYwMGQKLQotCWJyYXRueglyNDEscjQyCi0JYnJhdG56CXIxLDB4ZjAwZAotCWJyYXRueglyMSwweGRlYWRmMDBkCi0KLQlicmF0enIJcjQxLHI0MgotCWJyYXR6cglyMSwweGYwMGQKLQlicmF0enIJcjEsMHhkZWFkZjAwZAotCi0JYnNldAlyMSxyMixyMwotCWJzZXQJcjUscjUxLDYKLQotCWJzcglyNDEKLQlic3IJMHhmMDBkCi0JYnNyCTB4ZGVhZGYwMGQKLQotCWJzcnRueglyNDEscjQyCi0JYnNydG56CXIxLDB4ZjAwZAotCWJzcnRueglyMSwweGRlYWRmMDBkCi0KLQlic3J0enIJcjQxLHI0MgotCWJzcnR6cglyMSwweGYwMGQKLQlic3J0enIJcjEsMHhkZWFkZjAwZAotCi0JYnRzdAlmMSxyMixyMwotCWJ0c3QJZjUscjUxLDYKLQkJCQkJCQotCWNtcGVxCWYwLHIzLHIxCi0JY21wbmUJZjEscjIwLHIyMQotCWNtcGd0CWYyLHIzMSxyMzIKLQljbXBnZQlmMyxyMyxyNAotCWNtcGx0CWY0LHIzLHI0Ci0JY21wbGUJZjUscjMscjQKLQljbXBwcwlmNixyMyxyNAotCWNtcG5nCWY3LHIzLHI0CQkJCQotCi0JY21wdWd0CWYyLHIzMSxyMzIKLQljbXB1Z2UJZjMscjMscjQKLQljbXB1bHQJZjQscjMscjQKLQljbXB1bGUJZjUscjMscjQKLQkJCi0JZGJyYQlyMSxyOCAKLQlkYnJhCXIxLDB4MTAwCi0JZGJyYQlyMSwweGRlYWRmMDBkCi0KLQlkYnJhaQkweDEwLHIzMQotCWRicmFpCTB4MTAsMHgxMDAKLQlkYnJhaQkweDEwLDB4ZGVhZGYwMGQKLQotCWRic3IJcjEscjggfHwgbm9wCi0JZGJzcglyMSwweDEwMCB8fCBub3AKLQlkYnNyCXIxLDB4ZGVhZGYwMGQKLQotCWRic3JpCTB4MjAscjMxIHx8IG5vcAotCWRic3JpCTB4MjAsMHgxMDAgfHwgbm9wCi0JZGJzcmkJMHgyMCwweGRlYWRmMDBkCi0KLQlkam1wCXIxLHIzMgotCWRqbXAJcjEsMHhmMDBkCi0JZGptcAlyMSwweGRlYWRmMDBkCi0KLQlkam1waQkweDMwLHIzMgotCWRqbXBpCTB4MzAsMHhmMDBkCi0JZGptcGkJMHgzMCwweGRlYWRmMDBkCi0KLQlkanNyCXIxLHIzMgotCWRqc3IJcjEsMHhmMDBkCi0JZGpzcglyMSwweGRlYWRmMDBkCi0KLQlkanNyaQkweDEwLHIzMgotCWRqc3JpCTB4MjAsMHhmMDBkCi0JZGpzcmkJMHg0MCwweGRlYWRmMDBkCi0JCi0Jam1wCXI0MQotCWptcAkweGYwMGQKLQlqbXAJMHhkZWFkZjAwZAotCi0Jam1wdG56CXI0MSxyNDIKLQlqbXB0bnoJcjEsMHhmMDBkCi0Jam1wdG56CXIxLDB4ZGVhZGYwMGQKLQotCWptcHR6cglyNDEscjQyCi0Jam1wdHpyCXIxLDB4ZjAwZAotCWptcHR6cglyMSwweGRlYWRmMDBkCi0KLQlqb2lubGwJcjEscjIscjQKLQlqb2lubGwJcjEscjIsMHhmCi0Jam9pbmxsCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqb2lubGgJcjEscjIscjQKLQlqb2lubGgJcjEscjIsMHhmCi0Jam9pbmxoCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqb2luaGwJcjEscjIscjQKLQlqb2luaGwJcjEscjIsMHhmCi0Jam9pbmhsCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqb2luaGgJcjEscjIscjQKLQlqb2luaGgJcjEscjIsMHhmCi0Jam9pbmhoCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqc3IJcjQxCi0JanNyCTB4ZjAwZAotCWpzcgkweGRlYWRmMDBkCi0KLQlqc3J0bnoJcjQxLHI0MgotCWpzcnRueglyMSwweGYwMGQKLQlqc3J0bnoJcjEsMHhkZWFkZjAwZAotCi0JanNydHpyCXI0MSxyNDIKLQlqc3J0enIJcjEsMHhmMDBkCi0JanNydHpyCXIxLDB4ZGVhZGYwMGQKLQkJCQkJCi0JbGQyaAlyNixAKHI3LHI4KQotCWxkMmgJcjYsQChyNysscjgpCi0JbGQyaAlyNixAKHI3LSxyOCkKLQlsZDJoCXI2LEAocjcsMHgxYSkKLQlsZDJoCXI2LEAocjcsMHgxMjM0KQotCQotCWxkMncJcjYsQChyNyxyOCkKLQlsZDJ3CXI2LEAocjcrLHI4KQotCWxkMncJcjYsQChyNy0scjgpCi0JbGQydwlyNixAKHI3LDB4MWEpCi0JbGQydwlyNixAKHI3LDB4MTIzNCkKLQkKLQlsZDRiaAlyNixAKHI3LHI4KQotCWxkNGJoCXI2LEAocjcrLHI4KQotCWxkNGJoCXI2LEAocjctLHI4KQotCWxkNGJoCXI2LEAocjcsMHgxYSkKLQlsZDRiaAlyNixAKHI3LDB4MTIzNCkKLQotCWxkNGJodQlyNixAKHI3LHI4KQotCWxkNGJodQlyNixAKHI3KyxyOCkKLQlsZDRiaHUJcjYsQChyNy0scjgpCi0JbGQ0Ymh1CXI2LEAocjcsMHgxYSkKLQlsZDRiaHUJcjYsQChyNywweDEyMzQpCi0KLQlsZGIJcjYsQChyNyxyOCkKLQlsZGIJcjYsQChyNysscjgpCi0JbGRiCXI2LEAocjctLHI4KQotCWxkYglyNixAKHI3LDB4MWEpCi0JbGRiCXI2LEAocjcsMHgxMjM0KQotCi0JbGRidQlyNixAKHI3LHI4KQotCWxkYnUJcjYsQChyNysscjgpCi0JbGRidQlyNixAKHI3LSxyOCkKLQlsZGJ1CXI2LEAocjcsMHgxYSkKLQlsZGJ1CXI2LEAocjcsMHgxMjM0KQotCi0JbGRoCXI2LEAocjcscjgpCi0JbGRoCXI2LEAocjcrLHI4KQotCWxkaAlyNixAKHI3LSxyOCkKLQlsZGgJcjYsQChyNywweDFhKQotCWxkaAlyNixAKHI3LDB4MTIzNCkKLQotCWxkaGgJcjYsQChyNyxyOCkKLQlsZGhoCXI2LEAocjcrLHI4KQotCWxkaGgJcjYsQChyNy0scjgpCi0JbGRoaAlyNixAKHI3LDB4MWEpCi0JbGRoaAlyNixAKHI3LDB4MTIzNCkKLQotCWxkaHUJcjYsQChyNyxyOCkKLQlsZGh1CXI2LEAocjcrLHI4KQotCWxkaHUJcjYsQChyNy0scjgpCi0JbGRodQlyNixAKHI3LDB4MWEpCi0JbGRodQlyNixAKHI3LDB4MTIzNCkKLQotCWxkdwlyNixAKHI3LHI4KQotCWxkdwlyNixAKHI3KyxyOCkKLQlsZHcJcjYsQChyNy0scjgpCi0JbGR3CXI2LEAocjcsMHgxYSkKLQlsZHcJcjYsQChyNywweDEyMzQpCi0JCQkJCQkJCi0JbWFjMAlyMSxyMixyNAotCW1hYzAJcjEscjIsMHgxZgotCW1hYzEJcjEscjIscjQKLQltYWMxCXIxLHIyLDB4MWYKLQotCW1hY3MwCXIxLHIyLHI0Ci0JbWFjczAJcjEscjIsMHgxZgotCW1hY3MxCXIxLHIyLHI0Ci0JbWFjczEJcjEscjIsMHgxZgotCi0JbW9kZGVjCXIxLDB4YQotCi0JbW9kaW5jCXIxLDB4YQotCi0JbXN1YjAJcjEscjIscjQKLQltc3ViMAlyMSxyMiwweDFmCi0JbXN1YjEJcjEscjIscjQKLQltc3ViMQlyMSxyMiwweDFmCi0KLQltdWwJcjEscjIscjQKLQltdWwJcjEscjIsMHhhCi0KLQltc3ViczAJcjEscjIscjQKLQltc3ViczAJcjEscjIsMHgxZgotCW1zdWJzMQlyMSxyMixyNAotCW1zdWJzMQlyMSxyMiwweDFmCi0KLQltdWwyaAlyMSxyMixyNAotCW11bDJoCXIxLHIyLDB4YQotCQotCW11bGh4bGwJcjEscjIscjQKLQltdWxoeGxsCXIxLHIyLDB4YQotCi0JbXVsaHhsaAlyMSxyMixyNAotCW11bGh4bGgJcjEscjIsMHhhCi0KLQltdWxoeGhsCXIxLHIyLHI0Ci0JbXVsaHhobAlyMSxyMiwweGEKLQotCW11bGh4aGgJcjEscjIscjQKLQltdWxoeGhoCXIxLHIyLDB4YQotCi0JbXVseDJoCXI4LHIyLHI0Ci0JbXVseHMJYTAscjEscjQKLQkKLQltdWx4CWEwLHIxLHI0Ci0JbXVseAlhMSxyMiwweGEKLQotCW12ZmFjYwlyMSxhMCxyNAotCW12ZmFjYwlyMixhMSwweGEKLQotCW11bHgyaAlyOCxyMiwweGEKLQltdWx4cwlhMSxyMiwweGEKLQkJCi0JbXZmc3lzCXIxMCxwYwotCW12ZnN5cwlyMTAscnB0X2MKLQltdmZzeXMJcjEwLHBzdwotCW12ZnN5cwlyMTAscHN3aAotCW12ZnN5cwlyMTAscHN3bAotCW12ZnN5cwlyMTAsZjAKLQltdmZzeXMJcjEwLFMKLQotCW12dGFjYwlhMSxyMixyNAotCi0JbXZ0c3lzCXJwdF9jLCByMTAKLQltdnRzeXMJcHN3LCByMTAKLQltdnRzeXMJcHN3aCwgcjEwCi0JbXZ0c3lzCXBzd2wsIHIxMAotCW12dHN5cwlmMCwgcjEwCi0JbXZ0c3lzCWYzLCByMTAKLQltdnRzeXMJUywgcjEwCi0JbXZ0c3lzCVYsIHIxMAotCW12dHN5cwlWQSwgcjEwCi0JbXZ0c3lzCUMsIHIxMAotCi0Jbm9wCi0KLQlub3QJcjEscjIKLQotCW5vdGZnCWYxLGYyCi0KLQlvcglyMSxyMixyNAotCW9yCXIxLHIyLDB4MWEKLQlvcglyMSxyMiwweGRlYWRmMDBkCi0KLQlvcmZnCWYxLGYyLGY0Ci0Jb3JmZwlmNCxmMiwweDEKLQkKLQlyZWl0Ci0KLQlyZXBlYXQJcjEscjIKLQlyZXBlYXQJcjQsMHhkZWFkCi0JcmVwZWF0CXI0LDB4ZGVhZGYwMGQKLQotCXJlcGVhdGkJMHhhLHIxCi0JcmVwZWF0aQkweGEsMHgxMDAxCi0KLQlub3AgfHwgbm9wCi0JCi0Jcm90CXIxLHIyLHI0Ci0Jcm90CXIxLHIyLDB4YQotCi0Jcm90MmgJcjEscjIscjQKLQlyb3QyaAlyMSxyMiwweGEKLQotCXNhdAlyMSxyMixyNAotCXNhdAlyMSxyMiwweGEKLQotCXNhdDJoCXIxLHIyLHI0Ci0Jc2F0MmgJcjEscjIsMHhhCi0KLQlzYXRobAlyMSxyMixyNAotCXNhdGhsCXIxLHIyLDB4YQotCi0Jc2F0aGgJcjEscjIscjQKLQlzYXRoaAlyMSxyMiwweGEKLQkJCi0Jc2F0eglyMSxyMixyNAotCXNhdHoJcjEscjIsMHhhCi0KLQlzYXR6MmgJcjEscjIscjQKLQlzYXR6MmgJcjEscjIsMHhhCi0JCQkKLQlzcmEJcjEscjIscjQKLQlzcmEJcjEscjIsMHhhCi0KLQlzcmEyaAlyMSxyMixyNAotCXNyYTJoCXIxLHIyLDB4YQotCi0Jc3JjCXIxLHIyLHI0Ci0Jc3JjCXIxLHIyLDB4YQotCQotCXNybAlyMSxyMixyNAotCXNybAlyMSxyMiwweGEKLQotCXNybDJoCXIxLHIyLHI0Ci0Jc3JsMmgJcjEscjIsMHhhCi0KLQkKLQlzdDJoCXI2LEAocjcscjgpCi0Jc3QyaAlyNixAKHI3KyxyOCkKLQlzdDJoCXI2LEAocjctLHI4KQotCXN0MmgJcjYsQChyNywweDFhKQotCXN0MmgJcjYsQChyNywweDEyMzQpCi0JCQotCXN0MncJcjYsQChyNyxyOCkKLQlzdDJ3CXI2LEAocjcrLHI4KQotCXN0MncJcjYsQChyNy0scjgpCi0Jc3QydwlyNixAKHI3LDB4MWEpCi0Jc3QydwlyNixAKHI3LDB4MTIzNCkKLQotCXN0NGhiCXI2LEAocjcscjgpCi0Jc3Q0aGIJcjYsQChyNysscjgpCi0Jc3Q0aGIJcjYsQChyNy0scjgpCi0Jc3Q0aGIJcjYsQChyNywweDFhKQotCXN0NGhiCXI2LEAocjcsMHgxMjM0KQotCi0Jc3RiCXI2LEAocjcscjgpCi0Jc3RiCXI2LEAocjcrLHI4KQotCXN0YglyNixAKHI3LSxyOCkKLQlzdGIJcjYsQChyNywweDFhKQotCXN0YglyNixAKHI3LDB4MTIzNCkKLQotCXN0aAlyNixAKHI3LHI4KQotCXN0aAlyNixAKHI3KyxyOCkKLQlzdGgJcjYsQChyNy0scjgpCi0Jc3RoCXI2LEAocjcsMHgxYSkKLQlzdGgJcjYsQChyNywweDEyMzQpCi0KLQlzdGhoCXI2LEAocjcscjgpCi0Jc3RoaAlyNixAKHI3KyxyOCkKLQlzdGhoCXI2LEAocjctLHI4KQotCXN0aGgJcjYsQChyNywweDFhKQotCXN0aGgJcjYsQChyNywweDEyMzQpCi0KLQlzdHcJcjYsQChyNyxyOCkKLQlzdHcJcjYsQChyNysscjgpCi0Jc3R3CXI2LEAocjctLHI4KQotCXN0dwlyNixAKHI3LDB4MWEpCi0Jc3R3CXI2LEAocjcsMHgxMjM0KQotCQkJCQkJCQkKLQlzdWIJcjEscjIscjMKLQlzdWIJcjUwLHI1MSwweDFhCi0Jc3ViCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViMmgJcjEscjIscjMKLQlzdWIyaAlyNTAscjUxLDB4MWEKLQlzdWIyaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmIJcjEscjIscjMKLQlzdWJiCXI1MCxyNTEsMHgxYQotCXN1YmIJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJobGxsCXIxLHIyLHIzCi0Jc3ViaGxsbAlyNTAscjUxLDB4MWEKLQlzdWJobGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGxsaAlyMSxyMixyMwotCXN1YmhsbGgJcjUwLHI1MSwweDFhCi0Jc3ViaGxsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhsaGwJcjEscjIscjMKLQlzdWJobGhsCXI1MCxyNTEsMHgxYQotCXN1YmhsaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJobGhoCXIxLHIyLHIzCi0Jc3ViaGxoaAlyNTAscjUxLDB4MWEKLQlzdWJobGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQkKLQlzdWJoaGxsCXIxLHIyLHIzCi0Jc3ViaGhsbAlyNTAscjUxLDB4MWEKLQlzdWJoaGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGhsaAlyMSxyMixyMwotCXN1YmhobGgJcjUwLHI1MSwweDFhCi0Jc3ViaGhsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhoaGwJcjEscjIscjMKLQlzdWJoaGhsCXI1MCxyNTEsMHgxYQotCXN1YmhoaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJoaGhoCXIxLHIyLHIzCi0Jc3ViaGhoaAlyNTAscjUxLDB4MWEKLQlzdWJoaGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQotCXRyYXAJcjEKLQl0cmFwCTB4YQotCi0JeG9yCXIxLHIyLHI0Ci0JeG9yCXIxLHIyLDB4YQotCXhvcglyMSxyMiwweGRlYWRmMDBkCi0KLQl4b3JmZwlmMSxmMixmNAotCXhvcmZnCWYxLGY0LDB4YQotCi0jIFZMSVcgc3ludGF4IHRlc3QKLQlub3AKLQlub3AKLQlub3AJLT4Jbm9wCi0Jbm9wCXx8CW5vcAotCW5vcAk8LQlub3AKLQotIyB0cnkgY2hhbmdpbmcgc2VjdGlvbnMKLQlub3QJcjEscjIKLQkuc2VjdGlvbiAuZm9vCi0JYWRkCXIxMCxyMTIsNgotCS50ZXh0Ci0Jbm90CXIyLHIzCi0Jbm9wCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI5ZjgxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNvYmpkdW1wOiAtbGRyCi0jbmFtZTogRDMwViBkZWJ1ZyAoLWcpIHRlc3QKLSNhczogLWcKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxfYWJjLTB4MTg+OgotLipsYWJlbC1kZWJ1Zy5zOjQKLSAgIDA6CTEwMDgwMDAzIDAwZjAwMDAwIAlicmEuc1wvdHgJMTgJXCgxOCA8X2FiYz5cKQlcfFx8CW5vcAkKLS4qbGFiZWwtZGVidWcuczo1Ci0gICA4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gIDEwOgkwZTAwMDAwNCAwMGYwMDAwMCAJLmxvbmcJMHhlMDAwMDA0CXx8CW5vcAkKLQotMDAwMDAwMTggPF9hYmM+OgotLipsYWJlbC1kZWJ1Zy5zOjgKLSAgMTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLS4qbGFiZWwtZGVidWcuczo5Ci0gIDIwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6MTAKLSAgMjg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLS4qbGFiZWwtZGVidWcuczoxMQotICAzMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQwYWE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgbGFiZWxzIHNob3VsZCBiZSBhbGlnbmVkIG9uIDgtYnl0ZSBib3VuZHJpZXMKLQkKLQkudGV4dAotCWJyYS5zL3R4IF9hYmMgICB8fCBub3AgCi0Jbm9wICAgICB8fCBub3AgCi0JLndvcmQgMHgwZTAwMDAwNAotX2FiYzoKLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjZmNkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBsYWJlbCBhbGlnbm1lbnQgdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPF9hYmMtMHgxOD46Ci0gICAwOgkxMDA4MDAwMyAwMGYwMDAwMCAJYnJhLnMvdHgJMTgJKDE4IDxfYWJjPikJfHwJbm9wCQotICAgODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotICAxMDoJMGUwMDAwMDQgMDBmMDAwMDAgCS5sb25nCTB4ZTAwMDAwNAl8fAlub3AJCi0KLTAwMDAwMDE4IDxfYWJjPjoKLSAgMTg6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKLSAgMjA6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0MGFhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIGxhYmVscyBzaG91bGQgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRyaWVzCi0JCi0JLnRleHQKLQlicmEucy90eCBfYWJjICAgfHwgbm9wIAotCW5vcCAgICAgfHwgbm9wIAotCS53b3JkIDB4MGUwMDAwMDQKLV9hYmM6Ci0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMGE1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYWxpZ25tZW50IHRlc3QKLSNhczogLVdPCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJOGExMDUxODcgMGExMDIwYzQgCW11bHgyaAlyNSwgcjYsIHI3CTwtCW11bHgyaAlyMiwgcjMsIHI0Ci0gICA4OgkwMGYwMDAwMCAwYTEwODI0YSAJbm9wCQl8fAltdWx4MmgJcjgsIHI5LCByMTAKLSAgMTA6CTAwZjAwMDAwIDBhMTBiMzBkIAlub3AJCXx8CW11bHgyaAlyMTEsIHIxMiwgcjEzCi0gIDE4Ogk4YTExMTQ5MyAwYTEwZTNkMCAJbXVseDJoCXIxNywgcjE4LCByMTkJPC0JbXVseDJoCXIxNCwgcjE1LCByMTYKLSAgMjA6CThhMTE3NjE5IDBhMTE0NTU2IAltdWx4MmgJcjIzLCByMjQsIHIyNQk8LQltdWx4MmgJcjIwLCByMjEsIHIyMgotICAyODoJOGIwMWQ3OWYgMGExMWE2ZGMgCW11bAlyMjksIHIzMCwgcjMxCTwtCW11bHgyaAlyMjYsIHIyNywgcjI4Ci0gIDMwOgk4YjAwNTE4NyAwYjAwMjBjNCAJbXVsCXI1LCByNiwgcjcJPC0JbXVsCXIyLCByMywgcjQKLSAgMzg6CThhMTBiMzBkIDBhMTA4MjRhIAltdWx4MmgJcjExLCByMTIsIHIxMwk8LQltdWx4MmgJcjgsIHI5LCByMTAKLSAgNDA6CTgwZjAwMDAwIDBiMDBlM2QwIAlub3AJCTwtCW11bAlyMTQsIHIxNSwgcjE2Ci0gIDQ4OgkwMGYwMDAwMCAwYTExMTQ5MyAJbm9wCQl8fAltdWx4MmgJcjE3LCByMTgsIHIxOQotICA1MDoJOGIwMTc2MTkgMGExMTQ1NTYgCW11bAlyMjMsIHIyNCwgcjI1CTwtCW11bHgyaAlyMjAsIHIyMSwgcjIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2Nzg1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyAgT25lIG9mIHRoZSBydWxlIG9uIHJlc3RyaWN0ZWQgc2VxdWVuY2UgaXMgY29uc2VjdXRpdmUgSVUgaW5zdHJ1Y3Rpb24gCi0jICAgICAgIElVOiBNVUwsIE1BQywgTUFDUywgTVNVQiwgTVNVQlMgIChhKSAgICAKLSMgICAgICAgSVU6IE1VTEhYcHAsIE1VTFgySCwgTVVMMkggICAgICAoYikKLSMgVGhpcyBtZWFucyB0aGF0IGluc3RydWN0aW9ucyBpbiBncm91cCAoYSkgYW5kIGluIChiKSBzaG91bGQgbm90IGJlIGV4ZWN1dGVkCi0jIGluIElVIGluIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiB0aGUgb3JkZXIgKGEpLT4oYikuIEl0IGRvZXMgbmVpdGhlciBwcm9oaWJpdAotIyBleGVjdXRpb25zIGluIHRoZSByZXZlcnNlIG9yZGVyIChiKS0+IChhKSBub3IgY29uc2VjdXRpdmUgZXhlY3V0aW9uIG9mCi0jIGdyb3VwIChhKS0+KGEpIG9yIChiKS0+KGIpCi0KLQltdWx4MmggcjUscjYscjcJCTwtCW11bHgyaCByMixyMyxyNAotCW5vcAl8fAltdWx4MmggcjgscjkscjEwCi0Jbm9wCXx8CW11bHgyaCByMTEscjEyLHIxMyAgICAgICAKLQltdWx4MmggcjE0LHIxNSxyMTYKLQltdWx4MmggcjE3LHIxOCxyMTkgICAgICAKLQltdWx4MmggcjIzLHIyNCxyMjUgICAgIDwtCW11bHgyaCByMjAscjIxLHIyMgotCW11bCAgICByMjkscjMwLHIzMSAgICAgPC0JbXVseDJoIHIyNixyMjcscjI4Ci0JbXVsICAgIHI1LCByNiwgcjcgICAgICA8LQltdWwgcjIsIHIzLCByNAotCW11bHgyaCByMTEsIHIxMiwgcjEzICAgPC0JbXVseDJoIHI4LCByOSwgcjEwCi0JbXVseDJoIHIxNywgcjE4LCByMTkgICA8LQltdWwgcjE0LCByMTUsIHIxNgotCW11bCAgICByMjMsIHIyNCwgcjI1ICAgPC0JbXVseDJoIHIyMCwgcjIxLCByMjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJmYTljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBvcHRpbWl6YXRpb24gdGVzdAotI2FzOiAtTwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPHN0YXJ0PjoKLSAgIDA6CTA4ODAxMDgwIDA4ODAzMTAwIAlhYnMJcjEsIHIyCXx8CWFicwlyMywgcjQKLSAgIDg6CTAyOTAwMTAwIDAyOTAxMDgwIAlub3RmZwlmMCwgcwl8fAlub3RmZwlmMSwgZjIKLSAgMTA6CTA4ODAxMDgwIDAyOTAxMDgwIAlhYnMJcjEsIHIyCXx8CW5vdGZnCWYxLCBmMgotICAxODoJMDgwMDEwODMgODI5MDcwMDAgCWFkZC5zCXIxLCByMiwgcjMJLT4Jbm90ZmcJYywgZjAKLSAgMjA6CTA4MDAxMDgzIDgyOTAwMWMwIAlhZGQucwlyMSwgcjIsIHIzCS0+CW5vdGZnCWYwLCBjCi0gIDI4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDI4IDxzdGFydFwrMHgyOD5cKQl8fAlub3AJCi0gIDMwOgkwODgwMTA4MCA4ODgwMTA4MCAJYWJzCXIxLCByMgktPglhYnMJcjEsIHIyCi0gIDM4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDM4IDxzdGFydFwrMHgzOD5cKQl8fAlub3AJCi0gIDQwOgkwMDJiZmZmZiAwMGYwMDAwMCAJYnNyLnMJLTgJXCgzOCA8c3RhcnRcKzB4Mzg+XCkJfHwJbm9wCQotICA0ODoJMDg4MDEwODAgODg4MDEwODAgCWFicwlyMSwgcjIJLT4JYWJzCXIxLCByMgotICA1MDoJMDAyODAwMDAgMDg4MDEwODAgCWJzci5zCTAJXCg1MCA8c3RhcnRcKzB4NTA+XCkJfHwJYWJzCXIxLCByMgotICA1ODoJMDQwMDEwODMgODUwMDcyMDkgCWxkYi5zCXIxLCBAXChyMiwgcjNcKQktPglzdGIucwlyNywgQFwocjgsIHI5XCkKLSAgNjA6CTA1MDA3MjA5IDg0MDAxMDgzIAlzdGIucwlyNywgQFwocjgsIHI5XCkJLT4JbGRiLnMJcjEsIEBcKHIyLCByM1wpCi0gIDY4OgkwNDAwNzIwOSA4NDAwMTA4MyAJbGRiLnMJcjcsIEBcKHI4LCByOVwpCS0+CWxkYi5zCXIxLCBAXChyMiwgcjNcKQotICA3MDoJMDUwMDcyMDkgODUwMDEwODMgCXN0Yi5zCXI3LCBAXChyOCwgcjlcKQktPglzdGIucwlyMSwgQFwocjIsIHIzXCkKLSAgNzg6CTA4MDAzMGM2IDg1NDgyMGMwIAlhZGQucwlyMywgcjMsIHI2CS0+CXN0dy5zCXIyLCBAXChyMywgMHgwXCkKLSAgODA6CTAyYzI4MTA1IDkwMTgwMDAwIAljbXBsZS5zCWYwLCByNCwgcjUJLT4Jam1wLnMvdHgJMCA8c3RhcnQ+Ci0gIDg4OgkwMmMyODEwNSBhMDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL2Z4CTAgPHN0YXJ0PgotICA5MDoJMzAxODAwMDAgMDJjMjgxMDUgCWptcC5zL3h0CTAgPHN0YXJ0Pgl8fAljbXBsZS5zCWYwLCByNCwgcjUKLSAgOTg6CTQwMTgwMDAwIDAyYzI4MTA1IAlqbXAucy94ZgkwIDxzdGFydD4JfHwJY21wbGUucwlmMCwgcjQsIHI1Ci0gIGEwOgkwMmMyODEwNSBkMDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL3R0CTAgPHN0YXJ0PgotICBhODoJMDJjMjgxMDUgZTAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy90ZgkwIDxzdGFydD4KLSAgYjA6CTEwMTgwMDAwIDAyYzI5MTA1IAlqbXAucy90eAkwIDxzdGFydD4JfHwJY21wbGUucwlmMSwgcjQsIHI1Ci0gIGI4OgkwMmMyOTEwNSBiMDE4MDAwMCAJY21wbGUucwlmMSwgcjQsIHI1CS0+CWptcC5zL3h0CTAgPHN0YXJ0PgotICBjMDoJMDgwODQwMDEgODJjMjgxMDUgCWFkZC5zCXI0LCByMCwgMHgxCS0+CWNtcGxlLnMJZjAsIHI0LCByNQotICBjODoJMDgwODQwMDEgMDJjMjgwYzUgCWFkZC5zCXI0LCByMCwgMHgxCXx8CWNtcGxlLnMJZjAsIHIzLCByNQotICBkMDoJMDQ2MDQwMDYgODg2MDU0ZDQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJLT4JYWRkcy5zCXI1LCByMTksIHIyMAotICBkODoJMDQ2MDQwMDYgODg2MDMxNTQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJLT4JYWRkcy5zCXIzLCByNSwgcjIwCi0gIGUwOgkwNDYwNDAwNiAwODYwNjRkNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjYsIHIxOSwgcjIwCi0gIGU4OgkwNDYwNDAwNiAwODYwNzRkNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjcsIHIxOSwgcjIwCi0gIGYwOgkwNDYwNDAwNiAwODYwNzAxNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjcsIHIwLCByMjAKLSAgZjg6CTA1NjA0MDA2IDA4NjA1NGQ0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNSwgcjE5LCByMjAKLSAxMDA6CTA1NjA0MDA2IDA4NjAzMTU0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyMywgcjUsIHIyMAotIDEwODoJMDU2MDQwMDYgMDg2MDY0ZDQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI2LCByMTksIHIyMAotIDExMDoJMDU2MDQwMDYgMDg2MDc0ZDQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMTksIHIyMAotIDExODoJMDU2MDQwMDYgMDg2MDcwMTQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMCwgcjIwCi0gMTIwOgkwNTYwYTBjNCA4NTYyOGFlYyAJc3Qydy5zCXIxMCwgQFwocjMsIHI0XCkJLT4Jc3Qydy5zCXI0MCwgQFwocjQzLCByNDRcKQotIDEyODoJMDU0MDEwODMgODQ0MjlhYWIgCXN0dy5zCXIxLCBAXChyMiwgcjNcKQktPglsZHcucwlyNDEsIEBcKHI0MiwgcjQzXCkKLSAxMzA6CTA0NDAxMDgzIDg0MDI5YWFiIAlsZHcucwlyMSwgQFwocjIsIHIzXCkJLT4JbGRiLnMJcjQxLCBAXChyNDIsIHI0M1wpCi0gMTM4OgkwNDQ0NDE4YiA4ODY4OTE4MiAJbGR3LnMJcjQsIEBcKHI2XCssIHIxMVwpCS0+CWFkZHMucwlyOSwgcjYsIDB4MgotIDE0MDoJMDQ0YzQxOGIgMDg2ODkxODIgCWxkdy5zCXI0LCBAXChyNi0sIHIxMVwpCXx8CWFkZHMucwlyOSwgcjYsIDB4MgotIDE0ODoJMDU0YzQxOGIgODg2ODkxODIgCXN0dy5zCXI0LCBAXChyNi0sIHIxMVwpCS0+CWFkZHMucwlyOSwgcjYsIDB4MgotIDE1MDoJMDQ0MDQxOGIgMDg2ODkxODIgCWxkdy5zCXI0LCBAXChyNiwgcjExXCkJfHwJYWRkcy5zCXI5LCByNiwgMHgyCi0gMTU4OgkwNDQwNDE4YiAwODY4OTE4MiAJbGR3LnMJcjQsIEBcKHI2LCByMTFcKQl8fAlhZGRzLnMJcjksIHI2LCAweDIKLSAxNjA6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQotIDE2ODoJMDAzODAwMDAgMDg4MDEwODAgCWpzci5zCTAgPHN0YXJ0Pgl8fAlhYnMJcjEsIHIyCi0gMTcwOgkwODgwMTA4MCAwMGYwMDAwMCAJYWJzCXIxLCByMgl8fAlub3AJCi0gMTc4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDE3OCA8c3RhcnRcKzB4MTc4PlwpCXx8CW5vcAkKLSAxODA6CTAwMjgwMDAwIDA4ODAxMDgwIAlic3IucwkwCVwoMTgwIDxzdGFydFwrMHgxODA+XCkJfHwJYWJzCXIxLCByMgotIDE4ODoJMDg4MDEwODAgMDBmMDAwMDAgCWFicwlyMSwgcjIJfHwJbm9wCQotCi0wMDAwMDE5MCA8bGFiZWwxPjoKLSAxOTA6CTA1NjAyMDgzIDg5MDA0MTQ2IAlzdDJ3LnMJcjIsIEBcKHIyLCByM1wpCS0+CWFkZGhsbGwucwlyNCwgcjUsIHI2Ci0KLTAwMDAwMTk4IDxsYWJlbDI+OgotIDE5ODoJMDU1MDgyMDkgODk5MGEyY2MgCXN0NGhiLnMJcjgsIEBcKHI4LCByOVwpCS0+CXN1YmhsbGgucwlyMTAsIHIxMSwgcjEyCi0KLTAwMDAwMWEwIDxsYWJlbDM+OgotIDFhMDoJMDQ2MGUzOGYgOGE2MTA0NTIgCWxkMncucwlyMTQsIEBcKHIxNCwgcjE1XCkJLT4JbXVsaHhobAlyMTYsIHIxNywgcjE4Ci0KLTAwMDAwMWE4IDxsYWJlbDQ+OgotIDFhODoJMDQ0MTM1MTUgOGExMTY1ZDggCWxkdy5zCXIxOSwgQFwocjIwLCByMjFcKQktPgltdWx4MmgJcjIyLCByMjMsIHIyNAotCi0wMDAwMDFiMCA8bGFiZWw1PjoKLSAxYjA6CTA0MjE5NjliIDhhMDFjNzVlIAlsZGgucwlyMjUsIEBcKHIyNiwgcjI3XCkJLT4JbXVsMmgJcjI4LCByMjksIHIzMAotCi0wMDAwMDFiOCA8bGFiZWw2PjoKLSAxYjg6CTgwZjAwMDAwIDBiMDAxMDgzIAlub3AJCTwtCW11bAlyMSwgcjIsIHIzCi0gMWMwOgkwODAwNzIwOSAwYTQwNDE0NiAJYWRkLnMJcjcsIHI4LCByOQl8fAltdWxoeGxsCXI0LCByNSwgcjYKLQotMDAwMDAxYzggPGxhYmVsNz46Ci0gMWM4OgkwNDQwNTE4MCAwYjAwMjBjNCAJbGR3LnMJcjUsIEBcKHI2LCByMFwpCXx8CW11bAlyMiwgcjMsIHI0Ci0gMWQwOgk4MGYwMDAwMCAwYjAwNzIwOSAJbm9wCQk8LQltdWwJcjcsIHI4LCByOQotIDFkODoJMDQ0MGEyYzAgMDBmMDAwMDAgCWxkdy5zCXIxMCwgQFwocjExLCByMFwpCXx8CW5vcAkKLSAxZTA6CTgwZjAwMDAwIDBiMDBjMzRlIAlub3AJCTwtCW11bAlyMTIsIHIxMywgcjE0Ci0gMWU4OgkwNDQwZjQwMCAwYjQ0MjBjNCAJbGR3LnMJcjE1LCBAXChyMTYsIHIwXCkJfHwJbWFjMQlyMiwgcjMsIHI0Ci0gMWYwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gMWY4OgkwNDQwNTE4MCAwMGYwMDAwMCAJbGR3LnMJcjUsIEBcKHI2LCByMFwpCXx8CW5vcAkKLSAyMDA6CTgwZjAwMDAwIDBiNDA3MjA5IAlub3AJCTwtCW1hYzAJcjcsIHI4LCByOQotIDIwODoJMDQ0MGEyYzAgODQ0MGEyYzAgCWxkdy5zCXIxMCwgQFwocjExLCByMFwpCS0+CWxkdy5zCXIxMCwgQFwocjExLCByMFwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczMzMwMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLSMgRDMwViBwYXJhbGxlbCBvcHRpbWl6YXRpb24gdGVzdAotIyBhc3NlbWJsZSB3aXRoICItTyIKLQkKLQkudGV4dAotc3RhcnQ6CQotCWFicwlyMSxyMgotCWFicwlyMyxyNAotCi0Jbm90ZmcJZjAsZjQKLQlub3RmZwlmMSxmMgotCQkKLQlhYnMJcjEscjIKLQlub3RmZwlmMSxmMgotCi0jIGJvdGggY2hhbmdlIEMgZmxhZwotCWFkZAlyMSxyMixyMwotCW5vdGZnCUMsZjAKLQotIyBvbmUgdXNlcyBhbmQgb25lIGNoYW5nZXMgQyBmbGFnCQotCWFkZAlyMSxyMixyMwotCW5vdGZnCWYwLEMKLQotCWJyYQkuCi0JYWJzCXIxLHIyCi0KLQlhYnMJcjEscjIJCi0JYnJhCS4KLQotCWJzcgkuCi0JYWJzCXIxLHIyCi0JCi0JYWJzCXIxLHIyCQotCWFicwlyMSxyMgkKLQlic3IJLgotCQotCWxkYglyMSxAKHIyLHIzKQotCXN0YglyNyxAKHI4LHI5KQotCi0Jc3RiCXI3LEAocjgscjkpCQotCWxkYglyMSxAKHIyLHIzKQotCi0JbGRiCXI3LEAocjgscjkpCQotCWxkYglyMSxAKHIyLHIzKQotCi0Jc3RiCXI3LEAocjgscjkpCQotCXN0YglyMSxAKHIyLHIzKQotCi0JYWRkICAgICByMywgcjMsIHI2Ci0Jc3R3ICAgICByMiwgQChyMywgMCkKLQkJCQotIyBzaG91bGQgYmUgc2VyaWFsIGJlY2F1c2Ugb2YgY29uZGl0aW9uYWwgZXhlY3V0aW9uCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3R4ICAweDAKLQotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC9meCAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAveHQgIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3hmICAweDAKLQotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC90dCAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAvdGYgIDB4MAotCQkJCQkKLSAgICAgICAgY21wbGUgICBmMSxyNCxyNQotICAgICAgICBqbXAvdHggIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjEscjQscjUKLSAgICAgICAgam1wL3h0ICAweDAKLQotCSMgc2VyaWFsIGJlY2F1c2Ugb2YgdGhlIHI0IGRlcGVuZGVuY3kKLQlhZGQJcjQsIHIwLCAxCi0JY21wbGUJZjAsIHI0LCByNQotCi0JIyBwYXJhbGxlbAotCWFkZAlyNCwgcjAsIDEKLQljbXBsZQlmMCwgcjMsIHI1Ci0KLQkjIHNlcmlhbCBiZWNhdXNlIGxkMncgbG9hZHMgcjUKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNSxyMTkscjIwCi0KLQkjIHNlcmlhbCBiZWNhdXNlIGxkMncgbG9hZHMgcjUKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyMyxyNSxyMjAKLQotCSMgcGFyYWxsZWwgZXZlbiB0aG91Z2ggbGQydyB1c2VzIHI2IGFuZCBhZGRzIGNoYW5nZXMgaXQKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNixyMTkscjIwCi0KLQkjIHBhcmFsbGVsCi0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjcscjE5LHIyMAotCi0JIyBwYXJhbGxlbAotCWxkMncJcjQsQChyMCxyNikKLQlhZGRzCXI3LHIwLHIyMAotCi0JIyBwYXJhbGxlbCBldmVuIHRob3VnaCBzdDJ3IHVzZXMgcjUgYW5kIGFkZHMgbW9kaWZpZXMgaXQKLQlzdDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNSxyMTkscjIwCi0KLQkjIHBhcmFsbGVsLCBib3RoIHVzZSBidXQgZG9uJ3QgbW9kaWZ5IHI1Ci0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjMscjUscjIwCi0KLQkjIHBhcmFsbGVsIGV2ZW4gdGhvdWdoIHN0MncgdXNlcyByNiBhbmQgYWRkcyBjaGFuZ2VzIGl0Ci0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjYscjE5LHIyMAotCi0JIyBwYXJhbGxlbAotCXN0MncJcjQsQChyMCxyNikKLQlhZGRzCXI3LHIxOSxyMjAKLQotCSMgcGFyYWxsZWwKLQlzdDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNyxyMCxyMjAKLQkJCQkJCQotIyB0ZXN0IG1lbW9yeSBkZXBlbmRlbmNpZXMKLQotCSMgYWx3YXlzIHNlcmlhbCBiZWNhdXNlIG9uZSBjb3VsZCBvdmVyd3JpdGUgdGhlIG90aGVyCi0Jc3QydwlyMTAsQChyMyxyNCkKLQlzdDJ3CXI0MCxAKHI0MyxyNDQpCi0KLQkjIGFsd2F5cyBzZXJpYWwKLQlzdHcJcjEsQChyMixyMykKLQlsZHcJcjQxLEAocjQyLHI0MykJCQkKLQotCSMgcmVhZHMgY2FuIGhhcHBlbiBpbiBwYXJhbGxlbCBidXQgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIAotCSMgZG9lc24ndCBzdXBwb3J0IGl0Ci0JbGR3CXIxLEAocjIscjMpCi0JbGRiCXI0MSxAKHI0MixyNDMpCQkJCi0KLSMgdGVzdCBwb3N0IGluY3JlbWVudCBhbmQgZGVjcmVtZW50IGRlcGVuZGVuY2llcwotCi0JIyBzZXJpYWwKLQlsZHcJcjQsQChyNisscjExKQotCWFkZHMJcjkscjYsMgotCi0JIyBwYXJhbGxlbCwgbW9kaWZpY2F0aW9uIHRvIHI2IGhhcHBlbnMgbGFzdAotCWFkZHMJcjkscjYsMgkKLQlsZHcJcjQsQChyNi0scjExKQotCi0JIyBzZXJpYWwKLQlzdHcJcjQsQChyNi0scjExKQotCWFkZHMJcjkscjYsMgotCQotCSMgcGFyYWxsZWwKLQlsZHcJcjQsQChyNixyMTEpCi0JYWRkcwlyOSxyNiwyCi0KLQkjIHBhcmFsbGVsCi0JYWRkcwlyOSxyNiwyCQotCWxkdwlyNCxAKHI2LHIxMSkKLQkKLSMgaWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIGEgam1wLCBkb24ndCBwYXJhbGxlbGl6ZQotCWptcAkwCi0JYWJzCXIxLHIyCQotCi0JanNyCTAKLQlhYnMJcjEscjIJCi0KLQkuYWxpZ24JMwotCQotCWJyYQkwCi0JYWJzCXIxLHIyCQotCQotCWJzcgkwCi0JYWJzCXIxLHIyCQotCi0jIEV4cGxpY2l0bHkgcHJvaGliaXRlZCBmcm9tIHBhcmFsbGVsIGV4ZWN1dGlvbi4KLSMgVGhlIGxhYmVscyBhcmUgaGVyZSB0byBwcmV2ZW50IGluc3RydWN0aW9uIHBhaXJzCi0jICBmcm9tIGJlaW5nIG1lcmdlZCB3aXRoIGZvbGxvd2luZyBwYWlycy4KLQkKLWxhYmVsMToJCi0Jc3QydyAgICAgcjIsIEAocjIsIHIzKQotCWFkZGhsbGwgIHI0LCByNSwgcjYKLWxhYmVsMjoKLQlzdDRoYiAgICByOCwgQChyOCwgcjkpCi0Jc3ViaGxsaCAgcjEwLCByMTEsIHIxMgotbGFiZWwzOgotCWxkMncgICAgIHIxNCwgQChyMTQsIHIxNSkKLQltdWxoeGhsICByMTYsIHIxNywgcjE4Ci1sYWJlbDQ6Ci0JbGR3ICAgICAgcjE5LCBAKHIyMCwgcjIxKQotCW11bHgyaCAgIHIyMiwgcjIzLCByMjQKLWxhYmVsNToKLQlsZGggICAgICByMjUsIEAocjI2LCByMjcpCi0JbXVsMmggICAgcjI4LCByMjksIHIzMAotCi0jIEluc2VydGlvbiBvZiBOT1BzIHJlcXVpcmVkIHRvIHByZXZlbnQgcGlwZWxpbmUgY2xhc2hlcy4KLQotbGFiZWw2OgotCW11bCByMSxyMixyMwotCW11bGh4bGwgcjQscjUscjYKLSAgICAgICAgYWRkIHI3LCByOCwgcjkKLWxhYmVsNzoKLQkKLSAgICAgICAgbXVsICByMixyMyxyNAotICAgICAgICBsZHcgIHI1LCBAKHI2LHIwKQotIAotICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSA8LSBtdWwgcjcscjgscjkKLQkKLSAgICAgICAgbXVsICByMTIscjEzLHIxNCAtPiBsZHcgcjE1LCBAKHIxNiwgcjApCi0KLSAgICAgICAgbWFjMSByMixyMyxyNAotICAgICAgICBsZHcgIHI1LCBAKHI2LHIwKQotIAotICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSA8LSBtYWMwIHI3LHI4LHI5Ci0gICAgICAgIGxkdyAgcjEwLCBAKHIxMSwgcjApIAotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGUyNzgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIHJlbG9jYXRpb24gdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPHN0YXJ0PjoKLSAgICAgICAwOgk4ODA4MjAwMCA4MDAwMDAyOCAJYWRkLmwJcjIsIHIwLCAweDI4Ci0JCQkwOiBSX0QzMFZfMzIJLnRleHQKLSAgICAgICA4Ogk4ODA4NDAwMCA4MDAwMDAwMCAJYWRkLmwJcjQsIHIwLCAweDAKLQkJCTg6IFJfRDMwVl8zMgkuZGF0YQotICAgICAgMTA6CTg4MDg0MDAwIDgwMDAwMDA2IAlhZGQubAlyNCwgcjAsIDB4NgotCQkJMTA6IFJfRDMwVl8zMgkuZGF0YQotICAgICAgMTg6CTg4MDg0MDAwIDgwMDAwMDAwIAlhZGQubAlyNCwgcjAsIDB4MAotCQkJMTg6IFJfRDMwVl8zMgl1bmsKLSAgICAgIDIwOgk4MDA4MDAwMCA4MDAwMDAxOCAJYnJhLmwJMTgJXCgzOCA8Y29udD5cKQotCi0wMDAwMDAyOCA8aGVsbG8+OgotICAgICAgMjg6CTQ4NjU2YzZjIDZmMjA1NzZmIAkubG9uZwkweDQ4NjU2YzZjCXx8CS5sb25nCTB4NmYyMDU3NmYKLSAgICAgIDMwOgk3MjZjNjQwYSAwMGYwMDAwMCAJLmxvbmcJMHg3MjZjNjQwYQl8fAlub3AJCi0KLTAwMDAwMDM4IDxjb250PjoKLSAgICAgIDM4Ogk4MDE4MDAwMCA4MDAwMDA0OCAJam1wLmwJNDggPGNvbnQyPgotCQkJMzg6IFJfRDMwVl8zMgkudGV4dAotICAgICAgNDA6CTA4ODAyMGMwIDAwZjAwMDAwIAlhYnMJcjIsIHIzCXx8CW5vcAkKLQotMDAwMDAwNDggPGNvbnQyPjoKLSAgICAgIDQ4OgkwMDBiZmZmNyAwMGYwMDAwMCAJYnJhLnMJLTQ4CVwoMCA8c3RhcnQ+XCkJfHwJbm9wCQotICAgICAgNTA6CTAwMDgwMjA1IDAwZjAwMDAwIAlicmEucwkxMDI4CVwoMTA3OCA8ZXhpdD5cKQl8fAlub3AJCi0gICAgICA1ODoJMDAxODAwMDAgMDBmMDAwMDAgCWptcC5zCTAgPHN0YXJ0Pgl8fAlub3AJCi0gICAgICA2MDoJMDA2YzFmZmIgMDBmMDAwMDAgCWJzcnRuei5zCXIxLCAtMjgJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA2ODoJMDA2YzFmZmEgMDBmMDAwMDAgCWJzcnRuei5zCXIxLCAtMzAJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA3MDoJMDA0YzFmZjkgMDBmMDAwMDAgCWJyYXRuei5zCXIxLCAtMzgJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA3ODoJMDA0YzFmZjggMDBmMDAwMDAgCWJyYXRuei5zCXIxLCAtNDAJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA4MDoJMDA1YzEwMDcgMDBmMDAwMDAgCWptcHRuei5zCXIxLCAzOCA8Y29udD4JfHwJbm9wCQotCQkJODA6IFJfRDMwVl8xNQkudGV4dAotICAgICAgODg6CTAwNmMxMWYxIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgZjg4CVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKLSAgICAgIDkwOgkwMDVjMTAwMCAwMGYwMDAwMCAJam1wdG56LnMJcjEsIDAgPHN0YXJ0Pgl8fAlub3AJCi0JCQk5MDogUl9EMzBWXzE1CXVuawotICAgICAgOTg6CTAwNmMxMDAwIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgMAlcKDk4IDxjb250MlwrMHg1MD5cKQl8fAlub3AJCi0JCQk5ODogUl9EMzBWXzE1X1BDUkVMCXVuawotICAgICAgYTA6CTgwNWMxMDAwIDgwMDAwMDAwIAlqbXB0bnoubAlyMSwgMCA8c3RhcnQ+Ci0JCQlhMDogUl9EMzBWXzMyCXVuawotICAgICAgYTg6CTgwNmMxMDAwIDgwMDAwMDAwIAlic3J0bnoubAlyMSwgMAlcKGE4IDxjb250MlwrMHg2MD5cKQotCQkJYTg6IFJfRDMwVl8zMl9QQ1JFTAl1bmsKLSAgICAgIGIwOgkwMDA4MDFlYyAwMGYwMDAwMCAJYnJhLnMJZjYwCVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKLSAgICAgIGI4Ogk4MDA4MDAwMCA4MDAwMGY1OCAJYnJhLmwJZjU4CVwoMTAxMCA8Zm9vPlwpCi0gICAgICBjMDoJMDAwYmZmZTggMDBmMDAwMDAgCWJyYS5zCS1jMAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKLSAgICAgIGM4Ogk4MDE4MDAwMCA4MDAwMDAwMCAJam1wLmwJMCA8c3RhcnQ+Ci0JCQljODogUl9EMzBWXzMyCS50ZXh0Ci0gICAgICBkMDoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgotCQkJZDA6IFJfRDMwVl8zMgkudGV4dAotICAgICAgZDg6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQotCQkJZDg6IFJfRDMwVl8yMQkudGV4dAotICAgICAgZTA6CTAwMTgwMjAyIDAwZjAwMDAwIAlqbXAucwkxMDEwIDxmb28+CXx8CW5vcAkKLQkJCWUwOiBSX0QzMFZfMjEJLnRleHQKLSAgICAgIGU4OgkwMDBiZmZlMyAwMGYwMDAwMCAJYnJhLnMJLWU4CVwoMCA8c3RhcnQ+XCkJfHwJbm9wCQotICAgICAgZjA6CTgwMDgwMDAwIDgwMDAwMDAwIAlicmEubAkwCVwoZjAgPGNvbnQyXCsweGE4PlwpCi0JCQlmMDogUl9EMzBWXzMyX1BDUkVMCXVua25vd24KLSAgICAgIGY4Ogk4MDE4MDAwMCA4MDAwMDAwMCAJam1wLmwJMCA8c3RhcnQ+Ci0JCQlmODogUl9EMzBWXzMyCXVua25vd24KLSAgICAgMTAwOgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKLQkJCTEwMDogUl9EMzBWXzIxCXVua25vd24KLSAgICAgMTA4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDEwOCA8Y29udDJcKzB4YzA+XCkJfHwJbm9wCQotCQkJMTA4OiBSX0QzMFZfMjFfUENSRUwJdW5rbm93bgotCS4uLgotCi0wMDAwMTAxMCA8Zm9vPjoKLSAgICAxMDEwOgkwODAwMTAwMCAwMGYwMDAwMCAJYWRkLnMJcjEsIHIwLCByMAl8fAlub3AJCi0gICAgMTAxODoJODQ2YmMwMDAgODAwMDEwNzAgCWxkMncubAlyNjAsIEBcKHIwLCAweDEwNzBcKQotCQkJMTAxODogUl9EMzBWXzMyCS50ZXh0Ci0gICAgMTAyMDoJMDgwM2UwMDAgODAyODAwMGIgCWFkZC5zCXI2MiwgcjAsIHIwCS0+CWJzci5zCTU4CVwoMTA3OCA8ZXhpdD5cKQotICAgIDEwMjg6CTAwMmJmZmZkIDAwZjAwMDAwIAlic3IucwktMTgJXCgxMDEwIDxmb28+XCkJfHwJbm9wCQotICAgIDEwMzA6CTAwMGJmZTAzIDAwZjAwMDAwIAlicmEucwktZmU4CVwoNDggPGNvbnQyPlwpCXx8CW5vcAkKLSAgICAxMDM4OgkwMDBiZmUwMiAwMGYwMDAwMCAJYnJhLnMJLWZmMAlcKDQ4IDxjb250Mj5cKQl8fAlub3AJCi0gICAgMTA0MDoJMDAyODAwMDcgMDBmMDAwMDAgCWJzci5zCTM4CVwoMTA3OCA8ZXhpdD5cKQl8fAlub3AJCi0gICAgMTA0ODoJMDAxODAyMGYgMDBmMDAwMDAgCWptcC5zCTEwNzggPGV4aXQ+CXx8CW5vcAkKLQkJCTEwNDg6IFJfRDMwVl8yMQkudGV4dAotICAgIDEwNTA6CTAwMTgwMjBmIDAwZjAwMDAwIAlqbXAucwkxMDc4IDxleGl0Pgl8fAlub3AJCi0JCQkxMDUwOiBSX0QzMFZfMjEJLnRleHQKLSAgICAxMDU4OgkwMDE4MDIwZiAwMGYwMDAwMCAJam1wLnMJMTA3OCA8ZXhpdD4JfHwJbm9wCQotCQkJMTA1ODogUl9EMzBWXzIxCS50ZXh0Ci0gICAgMTA2MDoJODAyODAwMDAgODAwMDAwMTggCWJzci5sCTE4CVwoMTA3OCA8ZXhpdD5cKQotICAgIDEwNjg6CTgwMTgwMDAwIDgwMDAxMDc4IAlqbXAubAkxMDc4IDxleGl0PgotCQkJMTA2ODogUl9EMzBWXzMyCS50ZXh0Ci0KLTAwMDAxMDcwIDxsb25nemVybz46Ci0JLi4uCi0KLTAwMDAxMDc4IDxleGl0PjoKLSAgICAxMDc4OgkwMDEwMDAzZSAwMGYwMDAwMCAJam1wLnMJcjYyCXx8CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5OWJmOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jIEQzMFYgcmVsb2NhdGlvbiB0ZXN0Ci0JCi0JLnRleHQKLXN0YXJ0OgotCWFkZAlyMiwgcjAsIGhlbGxvCi0JYWRkCXI0LCByMCwgYmFyCi0JYWRkCXI0LCByMCwgYmFyMgotCWFkZAlyNCwgcjAsIHVuawkKLQlicmEJY29udAotaGVsbG86CS5hc2NpaSAiSGVsbG8gV29ybGRcbiIKLQkuYWxpZ24gMwotY29udDoJam1wCWNvbnQyCi0JYWJzCXIyLHIzCi1jb250MjoKLQlicmEJc3RhcnQJfHwJbm9wCi0JYnJhLnMJZXhpdAotCWptcAkwCXx8CW5vcAotCWJzcnRuei5zCXIxLGNvbnQKLQlic3J0bnoJcjEsY29udAkKLQlicmF0bnoucwlyMSxjb250Ci0JYnJhdG56CXIxLGNvbnQKLQlqbXB0bnoucwlyMSxjb250CQkKLQlic3J0bnoucwlyMSwgZm9vCi0Jam1wdG56LnMJcjEsIHVuawkKLQlic3J0bnoucwlyMSwgdW5rCi0Jam1wdG56CXIxLCB1bmsJCi0JYnNydG56CXIxLCB1bmsKLQlicmEucwlmb28KLQlicmEJZm9vCQotCWJyYQlzdGFydAotCWptcAlzdGFydAotCWptcAlzdGFydAotCWptcC5zCXN0YXJ0Ci0Jam1wLnMJZm9vCi0JYnJhCXN0YXJ0Ci0JYnJhCXVua25vd24KLQlqbXAJdW5rbm93bgotCWptcC5zCXVua25vd24JCi0JYnJhLnMJdW5rbm93bgotCQotCS5kYXRhCi1iYXI6CS5hc2NpegkiWFlaWlkiCi1iYXIyOgkubG9uZwkweGRlYWRiZWVmCi0JCi0JLnRleHQKLQkuc3BhY2UgMHhGMDAsMAotCi1mb286Ci0JYWRkCXIxLHIwLHIwCi0JbGQydwlyNjAsIEAocjAsbG9uZ3plcm8pCi0JYWRkCXI2MixyMCxyMAotCWJzci5zCWV4aXQKLQlic3Iucwlmb28KLQlicmEucwljb250MgotCWJyYS5zCWNvbnQyCQkJCQotCWJzci5zCWV4aXQJCi0Jam1wLnMJZXhpdAotCWptcC5zCWV4aXQKLQlqbXAucwlleGl0CQkKLQlic3IJZXhpdAotCWptcAlleGl0Ci0KLWxvbmd6ZXJvOgotCS5xdWFkCTAKLQotCS50ZXh0Ci1leGl0OgkKLQlqbXAJcjYyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhNWE2Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgCSMgc2VyaWFsLnMKLSAgIDIgICAgICAgICAgICAgIAkjCi0gICAzICAgICAgICAgICAgICAJIyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCB0aGUgcmlnaHQtc3ViaW5zdHJ1Y3Rpb25zCi0gICA0ICAgICAgICAgICAgICAJIyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLiAgR0FTIHNob3VsZCBkZXRlY3QgdGhpcy4KLSAgIDUgICAgICAgICAgICAgIAkJCi0gICA2IFw/XD9cP1w/IDAwMDAwMEYwIAkJdHJhcCByMjEgLT4gYWRkIHIyLCByMCwgcjAgOyByaWdodCBpbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLgotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNiAgICAgIDAwMDAwMEYwIAotICAgNiAgICAgIDAwMDAwMEYwIAotICAgNiAgICAgIDAwMDAwMDkwIAotICAgNiAgICAgIDAwMTUwMEYwIAotICAgNyBcP1w/XD9cPyAwODAwMjAwMCAJCWRidCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA3ICAgICAgMDBGMDAwMDAgCi0gICA3ICAgICAgMDBCMDAwMDAgCi0gICA3ICAgICAgMDBGMDAwMDAgCi0gICA4IFw/XD9cP1w/IDA4MDAyMDAwIAkJcnRkICAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDggICAgICAwMEYwMDAwMCAKLSAgIDggICAgICAwMEEwMDAwMCAKLSAgIDggICAgICAwMEYwMDAwMCAKLSAgIDkgXD9cP1w/XD8gMDgwMDIwMDAgCQlyZWl0ICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgOSAgICAgIDAwRjAwMDAwIAotICAgOSAgICAgIDAwODAwMDAwIAotICAgOSAgICAgIDAwRjAwMDAwIAotICAxMCBcP1w/XD9cPyAwODAwMjAwMCAJCW12dHN5cyBwc3csICByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0gIDEwICAgICAgMDBGMDAwMDAgCi0gIDEwICAgICAgMDBFMDAwNDAgCi0gIDEwICAgICAgODgwMDIwMDAgCi0gIDExIFw/XD9cP1w/IDAwRTAwMDQyIAkJbXZ0c3lzIHBzd2gsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLSAgMTEgICAgICA4ODAwMjAwMCAKLSAgMTIgXD9cP1w/XD8gMDBFMDAwNDEgCQltdnRzeXMgcHN3bCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotICAxMiAgICAgIDg4MDAyMDAwIAotICAxMyBcP1w/XD9cPyAwMEUwMDA0MyAJCW12dHN5cyBmMCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICA7IE9LCi0gIDEzICAgICAgODgwMDIwMDAgCi0gIDE0IFw/XD9cP1w/IDAwRTBBMDQwIAkJbXZ0c3lzIG1vZF9zLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgIDsgT0sKLSAgMTQgICAgICA4ODAwMjAwMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTk1ZDYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIHNlcmlhbC5zCi0jCi0jIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMsIHRoZSByaWdodC1zdWJpbnN0cnVjdGlvbnMKLSMgd2lsbCBuZXZlciBiZSBleGVjdXRlZC4gIEdBUyBzaG91bGQgZGV0ZWN0IHRoaXMuCi0JCi0JdHJhcCByMjEgLT4gYWRkIHIyLCByMCwgcjAgOyByaWdodCBpbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLgotCWRidCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi0JcnRkICAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLQlyZWl0ICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotCW12dHN5cyBwc3csICByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0JbXZ0c3lzIHBzd2gsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLQltdnRzeXMgcHN3bCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotCW12dHN5cyBmMCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICA7IE9LCi0JbXZ0c3lzIG1vZF9zLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgIDsgT0sKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZTA0ZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLmwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjU6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjExOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxMjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTM6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE0OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxOTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyMzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjQ6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyNzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6Mjg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0Ci0gICAyICAgICAgICAgICAgICAJCQotICAgMyAgICAgICAgICAgICAgCQkudGV4dAotICAgNCAgICAgICAgICAgICAgCQkKLSAgIDUgXD9cP1w/XD8gMDAwMDAwRjAgCQlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwMEIgCi0gICA1ICAgICAgRkZGRjAwRjAgCi0gICA2IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNiAgICAgIDAwMkJGRkZGIAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNyAgICAgICAgICAgICAgCQotICAgOCBcP1w/XD9cPyAwODA4MzAwMCAJCWJyYS90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA4ICAgICAgMTAwQkZGRkYgCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA5IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgIDkgICAgICAxMDJCRkZGRiAKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgMTAgICAgICAgICAgICAgIAkKLSAgMTEgXD9cP1w/XD8gMDgwODMwMDAgCQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTEgICAgICAwMDJCRkZGRiAKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgXD9cP1w/XD8gMDAyQkZGRkUgCQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTIgICAgICAwMDJCRkZGRiAKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTMgXD9cP1w/XD8gMzAyQkZGRkUgCQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDEzICAgICAgMDBGMDAwMDAgCi0gIDEzICAgICAgMTAyQkZGRkYgCi0gIDEzICAgICAgMDBGMDAwMDAgCi0gIDE0IFw/XD9cP1w/IDAwMkJGRkZFIAkJYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxNCAgICAgIDAwRjAwMDAwIAotICAxNCAgICAgIDEwMkJGRkZGIAotICAxNCAgICAgIDAwRjAwMDAwIAotICAxNSAgICAgICAgICAgICAgCQotICAxNiBcP1w/XD9cPyAyMDJCRkZGRSAJCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE2ICAgICAgMDBGMDAwMDAgCi0gIDE2ICAgICAgMDAwQkZGRkYgCi0gIDE2ICAgICAgMDBGMDAwMDAgCi0gIDE3IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTcgICAgICAwMDBCRkZGRiAKLQxHQVMgTElTVElORyAuKgotCi0KLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTggXD9cP1w/XD8gMTAwODAwMDEgCQlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTggICAgICAwMEYwMDAwMCAKLSAgMTggICAgICAxMDBCRkZGRiAKLSAgMTggICAgICAwMEYwMDAwMCAKLSAgMTkgXD9cP1w/XD8gMDAwODAwMDEgCQlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTkgICAgICAwMEYwMDAwMCAKLSAgMTkgICAgICAxMDBCRkZGRiAKLSAgMTkgICAgICAwMEYwMDAwMCAKLSAgMjAgICAgICAgICAgICAgIAkKLSAgMjEgXD9cP1w/XD8gMjAwODAwMDEgCQlic3IgLTMgLT4gYnJhIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMSAgICAgIDAwRjAwMDAwIAotICAyMSAgICAgIDAwMkJGRkZGIAotICAyMSAgICAgIDAwRjAwMDAwIAotICAyMiBcP1w/XD9cPyAwMDA4MDAwMSAJCWJzciAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIyICAgICAgMDAyQkZGRkYgCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIzIFw/XD9cP1w/IDEwMDgwMDAxIAkJYnNyL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIzICAgICAgMDBGMDAwMDAgCi0gIDIzICAgICAgMTAyQkZGRkYgCi0gIDIzICAgICAgMDBGMDAwMDAgCi0gIDI0IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnNyL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDI0ICAgICAgMDBGMDAwMDAgCi0gIDI0ICAgICAgMTAyQkZGRkYgCi0gIDI0ICAgICAgMDBGMDAwMDAgCi0gIDI1ICAgICAgICAgICAgICAJCi0gIDI2IFw/XD9cP1w/IDIwMDgwMDAxIAkJYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjYgICAgICAwMEYwMDAwMCAKLSAgMjYgICAgICAwMDBCRkZGRiAKLSAgMjYgICAgICAwMEYwMDAwMCAKLSAgMjcgXD9cP1w/XD8gMDAyODAwMDEgCQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyNyAgICAgIDAwMEJGRkZGIAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyOCBcP1w/XD9cPyAxMDI4MDAwMSAJCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyOCAgICAgIDAwRjAwMDAwIAotICAyOCAgICAgIDEwMEJGRkZGIAotICAyOCAgICAgIDAwRjAwMDAwIAotICAyOSBcP1w/XD9cPyAwMDI4MDAwMSAJCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyOSAgICAgIDAwRjAwMDAwIAotICAyOSAgICAgIDEwMEJGRkZGIAotICAyOSAgICAgIDAwRjAwMDAwIAotICAyOSAgICAgIDIwMjgwMDAxIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MzE1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKLQkKLQkudGV4dAotCQotCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi0KLQlicmEvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0KLQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnNyIC0zIC0+IGJyYSAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJzci90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWViMDVjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo1OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxMTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTI6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6Mjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgCSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKLSAgIDIgICAgICAgICAgICAgIAkJCi0gICAzICAgICAgICAgICAgICAJCS50ZXh0Ci0gICA0ICAgICAgICAgICAgICAJCQotICAgNSBcP1w/XD9cPyAwMDAwMDBGMCAJCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDUgICAgICAwMDAwMDBGMCAKLSAgIDUgICAgICAwMDAwMDBGMCAKLSAgIDUgICAgICAwMDAwMDAwQiAKLSAgIDUgICAgICBGRkZGMDBGMCAKLSAgIDYgXD9cP1w/XD8gMDgwODMwMDAgCQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA2ICAgICAgMDBGMDAwMDAgCi0gICA2ICAgICAgMDAyQkZGRkYgCi0gICA2ICAgICAgMDBGMDAwMDAgCi0gICA3ICAgICAgICAgICAgICAJCi0gICA4IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLSAgIDggICAgICAwMEYwMDAwMCAKLSAgIDggICAgICAxMDBCRkZGRiAKLSAgIDggICAgICA4ODA4MzAwMCAKLSAgIDkgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotICAgOSAgICAgIDg4MDgzMDAwIAotICAxMCAgICAgICAgICAgICAgCQotICAxMSBcP1w/XD9cPyAwMDJCRkZGRiAJCWJzciAtMyAtPiBic3IgLTEwCTsgICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxMSAgICAgIDAwRjAwMDAwIAotICAxMiBcP1w/XD9cPyAwMDJCRkZGRSAJCWJzciAtMyAtPiBic3IveHQgLTEwICAgIDsgICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxMiAgICAgIDAwRjAwMDAwIAotICAxMiAgICAgIDAwMkJGRkZGIAotICAxMiAgICAgIDAwRjAwMDAwIAotICAxMyBcP1w/XD9cPyAzMDJCRkZGRSAJCWJzci90eCAtMyAtPiBic3IgLTEwICAgIDsgICAgICAgVmFsaWQKLSAgMTMgICAgICAwMEYwMDAwMCAKLSAgMTMgICAgICAxMDJCRkZGRiAKLSAgMTMgICAgICA4MDJCRkZGRSAKLSAgMTQgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYnNyL2Z4IC0xMCA7ICAgICAgIFZhbGlkCi0gIDE0ICAgICAgQTAyQkZGRkUgCi0gIDE1ICAgICAgICAgICAgICAJCi0gIDE2IFw/XD9cP1w/IDAwMEJGRkZGIAkJYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTYgICAgICAwMEYwMDAwMCAKLSAgMTcgXD9cP1w/XD8gMDAwODAwMDEgCQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxNyAgICAgIDAwRjAwMDAwIAotICAxNyAgICAgIDAwMEJGRkZGIAotICAxNyAgICAgIDAwRjAwMDAwIAotICAxOCBcP1w/XD9cPyAxMDA4MDAwMSAJCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotICAxOCAgICAgIDAwRjAwMDAwIAotICAxOCAgICAgIDEwMEJGRkZGIAotICAxOCAgICAgIDgwMDgwMDAxIAotICAxOSBcP1w/XD9cPyAxMDBCRkZGRiAJCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotICAxOSAgICAgIEEwMDgwMDAxIAotICAyMCAgICAgICAgICAgICAgCQotICAyMSBcP1w/XD9cPyAwMDJCRkZGRiAJCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIxICAgICAgMDBGMDAwMDAgCi0gIDIyIFw/XD9cP1w/IDAwMDgwMDAxIAkJYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQxHQVMgTElTVElORyAuKgotCi0KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjIgICAgICAwMEYwMDAwMCAKLSAgMjIgICAgICAwMDJCRkZGRiAKLSAgMjIgICAgICAwMEYwMDAwMCAKLSAgMjMgXD9cP1w/XD8gMTAwODAwMDEgCQlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLSAgMjMgICAgICAwMEYwMDAwMCAKLSAgMjMgICAgICAxMDJCRkZGRiAKLSAgMjMgICAgICA4MDA4MDAwMSAKLSAgMjQgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLSAgMjQgICAgICBBMDA4MDAwMSAKLSAgMjUgICAgICAgICAgICAgIAkKLSAgMjYgXD9cP1w/XD8gMDAwQkZGRkYgCQlicmEgLTMgLT4gYnNyIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNiAgICAgIDAwRjAwMDAwIAotICAyNyBcP1w/XD9cPyAwMDI4MDAwMSAJCWJyYSAtMyAtPiBic3IvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDI3ICAgICAgMDBGMDAwMDAgCi0gIDI3ICAgICAgMDAwQkZGRkYgCi0gIDI3ICAgICAgMDBGMDAwMDAgCi0gIDI4IFw/XD9cP1w/IDEwMjgwMDAxIAkJYnJhL3R4IC0zIC0+IGJzciAxMCAgICAgOyAgICAgIFZhbGlkCi0gIDI4ICAgICAgMDBGMDAwMDAgCi0gIDI4ICAgICAgMTAwQkZGRkYgCi0gIDI4ICAgICAgODAyODAwMDEgCi0gIDI5IFw/XD9cP1w/IDEwMEJGRkZGIAkJYnJhL3R4IC0zIC0+IGJzci9meCAxMCAgOyAgICAgIFZhbGlkCi0gIDI5ICAgICAgQTAyODAwMDEgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTMxNTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBEMzBWIHNlcmlhbCBleGVjdXRpb24gdGVzdAotCQotCS50ZXh0Ci0JCi0JYnJhIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotCWJzciAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLQotCWJyYS90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLQotCWJzciAtMyAtPiBic3IgLTEwCTsgICAgICAgSW52YWxpZAotCWJzciAtMyAtPiBic3IveHQgLTEwICAgIDsgICAgICAgSW52YWxpZAotCWJzci90eCAtMyAtPiBic3IgLTEwICAgIDsgICAgICAgVmFsaWQKLQlic3IvdHggLTMgLT4gYnNyL2Z4IC0xMCA7ICAgICAgIFZhbGlkCi0KLQlicmEgLTMgLT4gYnJhICAxMCAgICAgICA7ICAgICAgSW52YWxpZAotCWJyYSAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi0JYnJhL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi0KLQlic3IgLTMgLT4gYnJhIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotCWJzciAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0JYnNyL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi0KLQlicmEgLTMgLT4gYnNyIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotCWJyYSAtMyAtPiBic3IvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhL3R4IC0zIC0+IGJzciAxMCAgICAgOyAgICAgIFZhbGlkCi0JYnJhL3R4IC0zIC0+IGJzci9meCAxMCAgOyAgICAgIFZhbGlkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3dhcm5fb2RkcmVnLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3dhcm5fb2RkcmVnLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmI0M2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjU6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6NjogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjo3OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLS4qOjg6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6OTogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjoxMDogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjoxMTogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjoxMjogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIEdBUyBzaG91bGQgcHJpbnQgYSB3YXJuaW5nICB3aGVuIGFuIG9kZCByZWdpc3RlciBpcyB1c2VkIGFzIGEgdGFyZ2V0IAotICAgMiAgICAgICAgICAgICAgCSMgb2YgbXVsdGktd29yZCBpbnN0cnVjdGlvbnM6IGxkMncsIGxkNGJoLCBsZDRiaHUsIGxkMmgsIHN0MncsIHN0NGhiLCBzdDJoLCAKLSAgIDMgICAgICAgICAgICAgIAkjIGFuZCBtdWx4MmgKLSAgIDQgICAgICAgICAgICAgIAkKLSAgIDUgMDAwMCAwNTY4MTAwMCAJc3QydyByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gICA1ICAgICAgMDBGMDAwMDAgCi0gICA2IDAwMDggMDQ2ODEwMDAgCWxkMncgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNyAwMDEwIDA0NTgxMDAwIAlsZDRiaCByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gICA3ICAgICAgMDBGMDAwMDAgCi0gICA4IDAwMTggMDREODEwMDAgCWxkNGJodSByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA5IDAwMjAgMDQzODEwMDAgCWxkMmggcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgOSAgICAgIDAwRjAwMDAwIAotICAxMCAwMDI4IDA1NTgxMDAwIAlzdDRoYiByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gIDEwICAgICAgMDBGMDAwMDAgCi0gIDExIDAwMzAgMDUzODEwMDAgCXN0MmggcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAxMSAgICAgIDAwRjAwMDAwIAotICAxMiAwMDM4IDAwRjAwMDAwIAlub3AJfHwJbXVseDJoIHIxLCByNSwgcjYgICAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAxMiAgICAgIDBBMTAxMTQ2IApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDlmNzUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgR0FTIHNob3VsZCBwcmludCBhIHdhcm5pbmcgIHdoZW4gYW4gb2RkIHJlZ2lzdGVyIGlzIHVzZWQgYXMgYSB0YXJnZXQgCi0jIG9mIG11bHRpLXdvcmQgaW5zdHJ1Y3Rpb25zOiBsZDJ3LCBsZDRiaCwgbGQ0Ymh1LCBsZDJoLCBzdDJ3LCBzdDRoYiwgc3QyaCwgCi0jIGFuZCBtdWx4MmgKLQotc3QydyByMSwgQChyMCwgMCkJfHwJbm9wIAotbGQydyByMSwgQChyMCwgMCkJfHwJbm9wIAotbGQ0YmggcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkNGJodSByMSwgQChyMCwgMCkJfHwJbm9wIAotbGQyaCByMSwgQChyMCwgMCkJfHwJbm9wIAotc3Q0aGIgcjEsIEAocjAsIDApCXx8CW5vcCAKLXN0MmggcjEsIEAocjAsIDApCXx8CW5vcCAKLW5vcAl8fAltdWx4MmggcjEsIHI1LCByNiAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL2VsZi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvZWxmLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2ZjJhYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvZWxmLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMKLSMgZWxmIHRlc3RzCi0jCi0KLSMgV2UncmUgdGVzdGluZyBiaXRzIGluIG9iai1lbGYgLS0gZG9uJ3QgcnVuIG9uIGFueXRoaW5nIGVsc2UuCi1pZiB7IChbaXN0YXJnZXQgIiotKi1lbGYqIl0JCQotICAgICAgfHwgW2lzdGFyZ2V0ICIqLSotbGludXgqIl0KLSAgICAgIHx8IFtpc3RhcmdldCAic3BhcmMqLSotc29sYXJpcyoiXQotICAgICAgfHwgW2lzdGFyZ2V0ICJtaXBzKi0qLWlyaXg2KiJdKQotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0KLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqb2xkbGQqXQotfSB0aGVuIHsKLSAgICBydW5fZHVtcF90ZXN0ICJzZWN0aW9uMCIgCi0gICAgcnVuX2R1bXBfdGVzdCAic2VjdGlvbjEiIAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3NGE2NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjAuZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNvYmpkdW1wOiAtcwotI25hbWU6IGVsZiBzZWN0aW9uMAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci1Db250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOgotIDAwMDAgMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uICAgICAgICAgICAgICAKLSMgVGhlIE1JUFMgaW5jbHVkZXMgYSAnc2VjdGlvbiAucmVnaW5mbycgYW5kIHN1Y2ggaGVyZS4KLSMuLi4KLUNvbnRlbnRzIG9mIHNlY3Rpb24gQToKLSAwMDAwIDAxMDEwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgCi1Db250ZW50cyBvZiBzZWN0aW9uIEI6Ci0gMDAwMCAwMjAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4gICAgICAgICAgICAgIAotQ29udGVudHMgb2Ygc2VjdGlvbiBDOgotIDAwMDAgMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzhmMGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0uZGF0YQotCS5ieXRlIDAKLS5zZWN0aW9uIEEKLQkuYnl0ZSAxCi0ucHVzaHNlY3Rpb24gQgotCS5ieXRlIDIKLS5wdXNoc2VjdGlvbiBDCi0JLmJ5dGUgMwotLnBvcHNlY3Rpb24KLQkuYnl0ZSAyCi0ucG9wc2VjdGlvbgotCS5ieXRlIDEKLS5wcmV2aW91cwotCS5ieXRlIDAKLS5wcmV2aW91cwotCS5ieXRlIDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24xLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDUyZjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24xLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLXMKLSNuYW1lOiBlbGYgc2VjdGlvbjEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotQ29udGVudHMgb2Ygc2VjdGlvbiAuZGF0YToKLSAwMDAwIDAwMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgCi0jIFRoZSBNSVBTIGluY2x1ZGVzIGEgJ3NlY3Rpb24gLnJlZ2luZm8nIGFuZCBzdWNoIGhlcmUuCi0jLi4uCi1Db250ZW50cyBvZiBzZWN0aW9uIEE6Ci0gMDAwMCAwMTAxMDEwMSAwMTAxICAgICAgICAgICAgICAgICAgICAgICAgLi4uLi4uICAgICAgICAgIAotQ29udGVudHMgb2Ygc2VjdGlvbiBCOgotIDAwMDAgMDIwMjAyMDIgMDIgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4uICAgICAgICAgICAKLUNvbnRlbnRzIG9mIHNlY3Rpb24gQzoKLSAwMDAwIDAzMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLiAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTkyYWRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLmRhdGEKLQkuYnl0ZSAwCi0uc2VjdGlvbiBBCi0JLmJ5dGUgMQotLnByZXZpb3VzCi0JLmJ5dGUgMAotLnByZXZpb3VzCi0JLmJ5dGUgMQotLnB1c2hzZWN0aW9uIEIKLQkuYnl0ZSAyCi0ucHJldmlvdXMKLQkuYnl0ZSAxCi0ucHJldmlvdXMKLQkuYnl0ZSAyCi0ucHVzaHNlY3Rpb24gQwotCS5ieXRlIDMKLS5wcmV2aW91cwotCS5ieXRlIDIKLS5wcmV2aW91cwotCS5ieXRlIDMKLS5wb3BzZWN0aW9uCi0JLmJ5dGUgMgotLnByZXZpb3VzCi0JLmJ5dGUgMQotLnByZXZpb3VzCi0JLmJ5dGUgMgotLnBvcHNlY3Rpb24KLQkuYnl0ZSAxCi0ucHJldmlvdXMKLQkuYnl0ZSAwCi0ucHJldmlvdXMKLQkuYnl0ZSAxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFjNzYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5kCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBhbGxpbnNuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxhZGQ+OgotICAgMDoJYTYgMDEgICAgICAgCWFkZCByMCxyMQotICAgMjoJYTQgMDIgICAgICAgCWFkZCAweDAscjIKLQotMCswMDA0IDxhZGQyPjoKLSAgIDQ6CWE1IGYzICAgICAgIAlhZGQyIC0xLHIzCi0KLTArMDAwNiA8YWRkYz46Ci0gICA2OglhNyA0NSAgICAgICAJYWRkYyByNCxyNQotCi0wKzAwMDggPGFkZG4+OgotICAgODoJYTIgNjcgICAgICAgCWFkZG4gcjYscjcKLSAgIGE6CWEwIGY4ICAgICAgIAlhZGRuIDB4ZixyOAotCi0wKzAwMGMgPGFkZG4yPjoKLSAgIGM6CWExIDA5ICAgICAgIAlhZGRuMiAtMTYscjkKLQotMCswMDBlIDxzdWI+OgotICAgZToJYWMgYWIgICAgICAgCXN1YiByMTAscjExCi0KLTArMDAxMCA8c3ViYz46Ci0gIDEwOglhZCBjZCAgICAgICAJc3ViYyByMTIscjEzCi0KLTArMDAxMiA8c3Vibj46Ci0gIDEyOglhZSBlZiAgICAgICAJc3VibiByMTQscjE1Ci0KLTArMDAxNCA8Y21wPjoKLSAgMTQ6CWFhIGRlICAgICAgIAljbXAgcjEzLHIxNAotICAxNjoJYTggMWYgICAgICAgCWNtcCAweDEscjE1Ci0KLTArMDAxOCA8Y21wMj46Ci0gIDE4OglhOSAxMCAgICAgICAJY21wMiAtMTUscjAKLQotMCswMDFhIDxhbmQ+OgotICAxYToJODIgMTIgICAgICAgCWFuZCByMSxyMgotICAxYzoJODQgMzQgICAgICAgCWFuZCByMyxAcjQKLQotMCswMDFlIDxhbmRoPjoKLSAgMWU6CTg1IDU2ICAgICAgIAlhbmRoIHI1LEByNgotCi0wKzAwMjAgPGFuZGI+OgotICAyMDoJODYgNzggICAgICAgCWFuZGIgcjcsQHI4Ci0KLTArMDAyMiA8b3I+OgotICAyMjoJOTIgOWEgICAgICAgCW9yIHI5LHIxMAotICAyNDoJOTQgYmMgICAgICAgCW9yIHIxMSxAcjEyCi0KLTArMDAyNiA8b3JoPjoKLSAgMjY6CTk1IGRlICAgICAgIAlvcmggcjEzLEByMTQKLQotMCswMDI4IDxvcmI+OgotICAyODoJOTYgZmQgICAgICAgCW9yYiByMTUsQHIxMwotCi0wKzAwMmEgPGVvcj46Ci0gIDJhOgk5YSBlZiAgICAgICAJZW9yIHIxNCxyMTUKLSAgMmM6CTljIDAxICAgICAgIAllb3IgcjAsQHIxCi0KLTArMDAyZSA8ZW9yaD46Ci0gIDJlOgk5ZCAyMyAgICAgICAJZW9yaCByMixAcjMKLQotMCswMDMwIDxlb3JiPjoKLSAgMzA6CTllIDQ1ICAgICAgIAllb3JiIHI0LEByNQotCi0wKzAwMzIgPGJhbmRsPjoKLSAgMzI6CTgwIGY2ICAgICAgIAliYW5kbCAweGYsQHI2Ci0KLTArMDAzNCA8bmFkaD46Ci0gIDM0Ogk4MSA3NyAgICAgICAJYmFuZGggMHg3LEByNwotCi0wKzAwMzYgPGJvcmw+OgotICAzNjoJOTAgMzggICAgICAgCWJvcmwgMHgzLEByOAotCi0wKzAwMzggPGJvcmg+OgotICAzODoJOTEgZDkgICAgICAgCWJvcmggMHhkLEByOQotCi0wKzAwM2EgPGJlb3JsPjoKLSAgM2E6CTk4IGZhICAgICAgIAliZW9ybCAweGYsQHIxMAotCi0wKzAwM2MgPGJlb3JoPjoKLSAgM2M6CTk5IDFiICAgICAgIAliZW9yaCAweDEsQHIxMQotCi0wKzAwM2UgPGJ0c3RsPjoKLSAgM2U6CTg4IDBjICAgICAgIAlidHN0bCAweDAsQHIxMgotCi0wKzAwNDAgPGJ0c3RoPjoKLSAgNDA6CTg5IDhkICAgICAgIAlidHN0aCAweDgsQHIxMwotCi0wKzAwNDIgPG11bD46Ci0gIDQyOglhZiBlZiAgICAgICAJbXVsIHIxNCxyMTUKLQotMCswMDQ0IDxtdWx1PjoKLSAgNDQ6CWFiIGRlICAgICAgIAltdWx1IHIxMyxyMTQKLQotMCswMDQ2IDxtdWx1aD46Ci0gIDQ2OgliYiBmMCAgICAgICAJbXVsdWggcjE1LHIwCi0KLTArMDA0OCA8bXVsaD46Ci0gIDQ4OgliZiAxMiAgICAgICAJbXVsaCByMSxyMgotCi0wKzAwNGEgPGRpdjBzPjoKLSAgNGE6CTk3IDQzICAgICAgIAlkaXYwcyByMwotCi0wKzAwNGMgPGRpdjB1PjoKLSAgNGM6CTk3IDU0ICAgICAgIAlkaXYwdSByNAotCi0wKzAwNGUgPGRpdjE+OgotICA0ZToJOTcgNjUgICAgICAgCWRpdjEgcjUKLQotMCswMDUwIDxkaXYyPjoKLSAgNTA6CTk3IDc2ICAgICAgIAlkaXYyIHI2Ci0KLTArMDA1MiA8ZGl2Mz46Ci0gIDUyOgk5ZiA2MCAgICAgICAJZGl2MwotCi0wKzAwNTQgPGRpdjRzPjoKLSAgNTQ6CTlmIDcwICAgICAgIAlkaXY0cwotCi0wKzAwNTYgPGxzbD46Ci0gIDU2OgliNiA3OCAgICAgICAJbHNsIHI3LHI4Ci0gIDU4OgliNCAzOSAgICAgICAJbHNsIDB4MyxyOQotCi0wKzAwNWEgPGxzbDI+OgotICA1YToJYjUgMGEgICAgICAgCWxzbDIgMHgwLHIxMAotCi0wKzAwNWMgPGxzcj46Ci0gIDVjOgliMiBiYyAgICAgICAJbHNyIHIxMSxyMTIKLSAgNWU6CWIwIGZkICAgICAgIAlsc3IgMHhmLHIxMwotCi0wKzAwNjAgPGxzcjI+OgotICA2MDoJYjEgZmUgICAgICAgCWxzcjIgMHhmLHIxNAotCi0wKzAwNjIgPGFzcj46Ci0gIDYyOgliYSBmZCAgICAgICAJYXNyIHIxNSxyMTMKLSAgNjQ6CWI4IDZlICAgICAgIAlhc3IgMHg2LHIxNAotCi0wKzAwNjYgPGFzcjI+OgotICA2NjoJYjkgN2YgICAgICAgCWFzcjIgMHg3LHIxNQotCi0wKzAwNjggPGxkaV84PjoKLSAgNjg6CWNmIGYyICAgICAgIAlsZGk6OCAweGZmLHIyCi0KLTArMDA2YSA8bGQ+OgotICA2YToJMDQgMzQgICAgICAgCWxkIEByMyxyNAotICA2YzoJMDAgNTYgICAgICAgCWxkIEBcKHIxMyxyNVwpLHI2Ci0gIDZlOgkyNyBmNyAgICAgICAJbGQgQFwocjE0LDUwOFwpLHI3Ci0gIDcwOgkwMyBmOCAgICAgICAJbGQgQFwocjE1LDB4M2NcKSxyOAotICA3MjoJMDcgMDkgICAgICAgCWxkIEByMTVcKyxyOQotICA3NDoJMDcgOTAgICAgICAgCWxkIEByMTVcKyxwcwotICA3NjoJMDcgODAgICAgICAgCWxkIEByMTVcKyx0YnIKLSAgNzg6CTA3IDgxICAgICAgIAlsZCBAcjE1XCsscnAKLSAgN2E6CTA3IDgyICAgICAgIAlsZCBAcjE1XCssc3NwCi0KLTArMDA3YyA8bGR1aD46Ci0gIDdjOgkwNSBhYiAgICAgICAJbGR1aCBAcjEwLHIxMQotICA3ZToJMDEgY2QgICAgICAgCWxkdWggQFwocjEzLHIxMlwpLHIxMwotICA4MDoJNDggMGYgICAgICAgCWxkdWggQFwocjE0LC0yNTZcKSxyMTUKLQotMCswMDgyIDxsZHViPjoKLSAgODI6CTA2IGRlICAgICAgIAlsZHViIEByMTMscjE0Ci0gIDg0OgkwMiBmMCAgICAgICAJbGR1YiBAXChyMTMscjE1XCkscjAKLSAgODY6CTY4IDAxICAgICAgIAlsZHViIEBcKHIxNCwtMTI4XCkscjEKLQotMCswMDg4IDxzdD46Ci0gIDg4OgkxNCAzMiAgICAgICAJc3QgcjIsQHIzCi0gIDhhOgkxMCA1NCAgICAgICAJc3QgcjQsQFwocjEzLHI1XCkKLSAgOGM6CTM4IDA2ICAgICAgIAlzdCByNixAXChyMTQsLTUxMlwpCi0gIDhlOgkxMyBmNyAgICAgICAJc3QgcjcsQFwocjE1LDB4M2NcKQotICA5MDoJMTcgMDggICAgICAgCXN0IHI4LEAtcjE1Ci0gIDkyOgkxNyA4NCAgICAgICAJc3QgbWRoLEAtcjE1Ci0gIDk0OgkxNyA5MCAgICAgICAJc3QgcHMsQC1yMTUKLQotMCswMDk2IDxzdGg+OgotICA5NjoJMTUgYTkgICAgICAgCXN0aCByOSxAcjEwCi0gIDk4OgkxMSBjYiAgICAgICAJc3RoIHIxMSxAXChyMTMscjEyXCkKLSAgOWE6CTU0IDBkICAgICAgIAlzdGggcjEzLEBcKHIxNCwxMjhcKQotCi0wKzAwOWMgPHN0Yj46Ci0gIDljOgkxNiBmZSAgICAgICAJc3RiIHIxNCxAcjE1Ci0gIDllOgkxMiAxMCAgICAgICAJc3RiIHIwLEBcKHIxMyxyMVwpCi0gIGEwOgk3OCAwMiAgICAgICAJc3RiIHIyLEBcKHIxNCwtMTI4XCkKLQotMCswMGEyIDxtb3Y+OgotICBhMjoJOGIgMzQgICAgICAgCW1vdiByMyxyNAotICBhNDoJYjcgNTUgICAgICAgCW1vdiBtZGwscjUKLSAgYTY6CTE3IDE2ICAgICAgIAltb3YgcHMscjYKLSAgYTg6CWIzIDM3ICAgICAgIAltb3YgcjcsdXNwCi0gIGFhOgkwNyAxOCAgICAgICAJbW92IHI4LHBzCi0KLTArMDBhYyA8am1wPjoKLSAgYWM6CTk3IDA5ICAgICAgIAlqbXAgQHI5Ci0KLTArMDBhZSA8cmV0PjoKLSAgYWU6CTk3IDIwICAgICAgIAlyZXQKLQotMCswMGIwIDxicmE+OgotICBiMDoJZTAgYTcgICAgICAgCWJyYSAwIFw8YWRkXD4KLQotMCswMGIyIDxibm8+OgotICBiMjoJZTEgYTYgICAgICAgCWJubyAwIFw8YWRkXD4KLQotMCswMGI0IDxiZXE+OgotICBiNDoJZTIgYTUgICAgICAgCWJlcSAwIFw8YWRkXD4KLQotMCswMGI2IDxibmU+OgotICBiNjoJZTMgYTQgICAgICAgCWJuZSAwIFw8YWRkXD4KLQotMCswMGI4IDxiYz46Ci0gIGI4OgllNCBhMyAgICAgICAJYmMgMCBcPGFkZFw+Ci0KLTArMDBiYSA8Ym5jPjoKLSAgYmE6CWU1IGEyICAgICAgIAlibmMgMCBcPGFkZFw+Ci0KLTArMDBiYyA8Ym4+OgotICBiYzoJZTYgYTEgICAgICAgCWJuIDAgXDxhZGRcPgotCi0wKzAwYmUgPGJwPjoKLSAgYmU6CWU3IGEwICAgICAgIAlicCAwIFw8YWRkXD4KLQotMCswMGMwIDxidj46Ci0gIGMwOgllOCA5ZiAgICAgICAJYnYgMCBcPGFkZFw+Ci0KLTArMDBjMiA8Ym52PjoKLSAgYzI6CWU5IDllICAgICAgIAlibnYgMCBcPGFkZFw+Ci0KLTArMDBjNCA8Ymx0PjoKLSAgYzQ6CWVhIDlkICAgICAgIAlibHQgMCBcPGFkZFw+Ci0KLTArMDBjNiA8YmdlPjoKLSAgYzY6CWViIDljICAgICAgIAliZ2UgMCBcPGFkZFw+Ci0KLTArMDBjOCA8YmxlPjoKLSAgYzg6CWVjIDliICAgICAgIAlibGUgMCBcPGFkZFw+Ci0KLTArMDBjYSA8Ymd0PjoKLSAgY2E6CWVkIDlhICAgICAgIAliZ3QgMCBcPGFkZFw+Ci0KLTArMDBjYyA8YmxzPjoKLSAgY2M6CWVlIDk5ICAgICAgIAlibHMgMCBcPGFkZFw+Ci0KLTArMDBjZSA8YmhpPjoKLSAgY2U6CWVmIDk4ICAgICAgIAliaGkgMCBcPGFkZFw+Ci0KLTArMDBkMCA8am1wX2Q+OgotICBkMDoJOWYgMGIgICAgICAgCWptcDpkIEByMTEKLSAgZDI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGQ0IDxyZXRfZD46Ci0gIGQ0Ogk5ZiAyMCAgICAgICAJcmV0OmQKLSAgZDY6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGQ4IDxicmFfZD46Ci0gIGQ4OglmMCBmYiAgICAgICAJYnJhOmQgZDAgXDxqbXBfZFw+Ci0gIGRhOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBkYyA8Ym5vX2Q+OgotICBkYzoJZjEgZjkgICAgICAgCWJubzpkIGQwIFw8am1wX2RcPgotICBkZToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZTAgPGJlcV9kPjoKLSAgZTA6CWYyIGY3ICAgICAgIAliZXE6ZCBkMCBcPGptcF9kXD4KLSAgZTI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGU0IDxibmVfZD46Ci0gIGU0OglmMyBmNSAgICAgICAJYm5lOmQgZDAgXDxqbXBfZFw+Ci0gIGU2Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBlOCA8YmNfZD46Ci0gIGU4OglmNCBmMyAgICAgICAJYmM6ZCBkMCBcPGptcF9kXD4KLSAgZWE6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGVjIDxibmNfZD46Ci0gIGVjOglmNSBmMSAgICAgICAJYm5jOmQgZDAgXDxqbXBfZFw+Ci0gIGVlOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBmMCA8Ym5fZD46Ci0gIGYwOglmNiBlZiAgICAgICAJYm46ZCBkMCBcPGptcF9kXD4KLSAgZjI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGY0IDxicF9kPjoKLSAgZjQ6CWY3IGVkICAgICAgIAlicDpkIGQwIFw8am1wX2RcPgotICBmNjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZjggPGJ2X2Q+OgotICBmODoJZjggZWIgICAgICAgCWJ2OmQgZDAgXDxqbXBfZFw+Ci0gIGZhOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBmYyA8Ym52X2Q+OgotICBmYzoJZjkgZTkgICAgICAgCWJudjpkIGQwIFw8am1wX2RcPgotICBmZToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMDAgPGJsdF9kPjoKLSAxMDA6CWZhIGU3ICAgICAgIAlibHQ6ZCBkMCBcPGptcF9kXD4KLSAxMDI6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTA0IDxiZ2VfZD46Ci0gMTA0OglmYiBlNSAgICAgICAJYmdlOmQgZDAgXDxqbXBfZFw+Ci0gMTA2Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDEwOCA8YmxlX2Q+OgotIDEwODoJZmMgZTMgICAgICAgCWJsZTpkIGQwIFw8am1wX2RcPgotIDEwYToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMGMgPGJndF9kPjoKLSAxMGM6CWZkIGUxICAgICAgIAliZ3Q6ZCBkMCBcPGptcF9kXD4KLSAxMGU6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTEwIDxibHNfZD46Ci0gMTEwOglmZSBkZiAgICAgICAJYmxzOmQgZDAgXDxqbXBfZFw+Ci0gMTEyOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDExNCA8YmhpX2Q+OgotIDExNDoJZmYgZGQgICAgICAgCWJoaTpkIGQwIFw8am1wX2RcPgotIDExNjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMTggPGxkcmVzPjoKLSAxMTg6CWJjIDgyICAgICAgIAlsZHJlcyBAcjJcKywweDgKLQotMCswMTFhIDxzdHJlcz46Ci0gMTFhOgliZCBmMyAgICAgICAJc3RyZXMgMHhmLEByM1wrCi0KLTArMDExYyA8bm9wPjoKLSAxMWM6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTFlIDxhbmRjY3I+OgotIDExZToJODMgZmYgICAgICAgCWFuZGNjciAweGZmCi0KLTArMDEyMCA8b3JjY3I+OgotIDEyMDoJOTMgN2QgICAgICAgCW9yY2NyIDB4N2QKLQotMCswMTIyIDxzdGlsbT46Ci0gMTIyOgk4NyA2MSAgICAgICAJc3RpbG0gMHg2MQotCi0wKzAxMjQgPGFkZHNwPjoKLSAxMjQ6CWEzIDgwICAgICAgIAlhZGRzcCAtNTEyCi0KLTArMDEyNiA8ZXh0c2I+OgotIDEyNjoJOTcgODkgICAgICAgCWV4dHNiIHI5Ci0KLTArMDEyOCA8ZXh0dWI+OgotIDEyODoJOTcgOWEgICAgICAgCWV4dHViIHIxMAotCi0wKzAxMmEgPGV4dHNoPjoKLSAxMmE6CTk3IGFiICAgICAgIAlleHRzaCByMTEKLQotMCswMTJjIDxleHR1aD46Ci0gMTJjOgk5NyBiYyAgICAgICAJZXh0dWggcjEyCi0KLTArMDEyZSA8ZW50ZXI+OgotIDEyZToJMGYgZmYgICAgICAgCWVudGVyIDB4M2ZjCi0KLTArMDEzMCA8bGVhdmU+OgotIDEzMDoJOWYgOTAgICAgICAgCWxlYXZlCi0KLTArMDEzMiA8eGNoYj46Ci0gMTMyOgk4YSBlZiAgICAgICAJeGNoYiBAcjE0LHIxNQotCi0wKzAxMzQgPGxkaV8zMj46Ci0gMTM0Ogk5ZiA4MCAxMiAzNCAJbGRpOjMyIDB4MTIzNDU2NzgscjAKLSAxMzg6CTU2IDc4IAotCi0wKzAxM2EgPGNvcG9wPjoKLSAxM2E6CTlmIGNmIDAxIDM0IAljb3BvcCAweGYsMHgxLGNyMyxjcjQKLSAxM2U6CTlmIGNmIDA0IDU2IAljb3BvcCAweGYsMHg0LGNyNSxjcjYKLSAxNDI6CTlmIGNmIGZmIDcwIAljb3BvcCAweGYsMHhmZixjcjcsY3IwCi0KLTArMDE0NiA8Y29wbGQ+OgotIDE0NjoJOWYgZDAgMDAgNDAgCWNvcGxkIDB4MCwweDAscjQsY3IwCi0KLTArMDE0YSA8Y29wc3Q+OgotIDE0YToJOWYgZTcgMDIgMTUgCWNvcHN0IDB4NywweDIsY3IxLHI1Ci0KLTArMDE0ZSA8Y29wc3Y+OgotIDE0ZToJOWYgZjggMDMgMjYgCWNvcHN2IDB4OCwweDMsY3IyLHI2Ci0KLTArMDE1MiA8bGRtMD46Ci0gMTUyOgk4YyA4ZCAgICAgICAJbGRtMCBcKHIwLHIyLHIzLHI3XCkKLQotMCswMTU0IDxsZG0xPjoKLSAxNTQ6CThkIDg5ICAgICAgIAlsZG0xIFwocjgscjExLHIxNVwpCi0KLTArMDE1NiA8c3RtMD46Ci0gMTU2Ogk4ZSAzMCAgICAgICAJc3RtMCBcKHIyLHIzXCkKLQotMCswMTU4IDxzdG0xPjoKLSAxNTg6CThmIDA2ICAgICAgIAlzdG0xIFwocjEzLHIxNFwpCi0KLTArMDE1YSA8Y2FsbD46Ci0gMTVhOglkNyA1MiAgICAgICAJY2FsbCAwIFw8YWRkXD4KLSAxNWM6CTk3IDFhICAgICAgIAljYWxsIEByMTAKLQotMCswMTVlIDxjYWxsX2Q+OgotIDE1ZToJZGYgNTAgICAgICAgCWNhbGw6ZCAwIFw8YWRkXD4KLSAxNjA6CTlmIGEwICAgICAgIAlub3AKLSAxNjI6CTlmIDFjICAgICAgIAljYWxsOmQgQHIxMgotIDE2NDoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxNjYgPGRtb3Y+OgotIDE2NjoJMDggMjIgICAgICAgCWRtb3YgQDB4ODgscjEzCi0gMTY4OgkxOCAxNSAgICAgICAJZG1vdiByMTMsQDB4NTQKLSAxNmE6CTBjIDExICAgICAgIAlkbW92IEAweDQ0LEByMTNcKwotIDE2YzoJMWMgMDAgICAgICAgCWRtb3YgQHIxM1wrLEAweDAKLSAxNmU6CTBiIDBiICAgICAgIAlkbW92IEAweDJjLEAtcjE1Ci0gMTcwOgkxYiAwOSAgICAgICAJZG1vdiBAcjE1XCssQDB4MjQKLQotMCswMTcyIDxkbW92aD46Ci0gMTcyOgkwOSA0NCAgICAgICAJZG1vdmggQDB4ODgscjEzCi0gMTc0OgkxOSAyOSAgICAgICAJZG1vdmggcjEzLEAweDUyCi0gMTc2OgkwZCAxYSAgICAgICAJZG1vdmggQDB4MzQsQHIxM1wrCi0gMTc4OgkxZCAyOSAgICAgICAJZG1vdmggQHIxM1wrLEAweDUyCi0KLTArMDE3YSA8ZG1vdmI+OgotIDE3YToJMGEgOTEgICAgICAgCWRtb3ZiIEAweDkxLHIxMwotIDE3YzoJMWEgNTMgICAgICAgCWRtb3ZiIHIxMyxAMHg1MwotIDE3ZToJMGUgNDcgICAgICAgCWRtb3ZiIEAweDQ3LEByMTNcKwotIDE4MDoJMWUgMDAgICAgICAgCWRtb3ZiIEByMTNcKyxAMHgwCi0KLTArMDE4MiA8bGRpXzIwPjoKLSAxODI6CTliIGYxIGZmIGZmIAlsZGk6MjAgMHhmZmZmZixyMQotCi0wKzAxODYgPGZpbmlzaD46Ci0gMTg2Ogk5ZiA4MCAwMCAwMCAJbGRpOjMyIDB4ODAwMCxyMAotIDE4YToJODAgMDAgCi0gMThjOgliMyAyMCAgICAgICAJbW92IHIwLHNzcAotIDE4ZToJOWYgODAgMDAgMDAgCWxkaTozMiAweDEscjAKLSAxOTI6CTAwIDAxIAotIDE5NDoJMWYgMGEgICAgICAgCWludCAweGEKLQotMCswMTk2IDxpbnRlPjoKLSAxOTY6CTlmIDMwICAgICAgIAlpbnRlCi0KLTArMDE5OCA8cmV0aT46Ci0gMTk4Ogk5NyAzMCAgICAgICAJcmV0aQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjY2ZlMTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBGUjMwIGFzc2VtYmxlciB0ZXN0c3VpdGUuCi0KLWlmIFtpc3RhcmdldCBmcjMwKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJhbGxpbnNuIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzZDI0YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24ucworKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0gLmRhdGEKLWZvb2RhdGE6IC53b3JkIDQyCi0JIC50ZXh0Ci1mb290ZXh0OgotCS5nbG9iYWwgYWRkCi1hZGQ6Ci0JYWRkIHIwLCByMQotCWFkZCAjMCwgcjIKLQkuZ2xvYmFsIGFkZDIKLWFkZDI6Ci0JYWRkMiAjLTEsIHIzCi0JLmdsb2JhbCBhZGRjCi1hZGRjOgotCWFkZGMgcjQsIHI1Ci0JLmdsb2JhbCBhZGRuCi1hZGRuOgotCWFkZG4gcjYsIHI3Ci0JYWRkbiAjMTUsIHI4Ci0JLmdsb2JhbCBhZGRuMgotYWRkbjI6Ci0JYWRkbjIgIy0xNiwgcjkKLQkuZ2xvYmFsIHN1Ygotc3ViOgotCXN1YiByMTAsIHIxMQotCS5nbG9iYWwgc3ViYwotc3ViYzoKLQlzdWJjIHIxMiwgcjEzCi0JLmdsb2JhbCBzdWJuCi1zdWJuOgotCXN1Ym4gcjE0LCByMTUKLQkuZ2xvYmFsIGNtcAotY21wOgotCWNtcCBhYywgZnAKLQljbXAgIzEsIHNwCi0JLmdsb2JhbCBjbXAyCi1jbXAyOgotCWNtcDIgIy0xNSwgcjAKLQkuZ2xvYmFsIGFuZAotYW5kOgotCWFuZCByMSwgcjIKLQlhbmQgcjMsIEByNAotCS5nbG9iYWwgYW5kaAotYW5kaDoKLQlhbmRoIHI1LCBAcjYKLQkuZ2xvYmFsIGFuZGIKLWFuZGI6Ci0JYW5kYiByNywgQHI4Ci0JLmdsb2JhbCBvcgotb3I6Ci0Jb3IgcjksIHIxMAotCW9yIHIxMSwgQHIxMgotCS5nbG9iYWwgb3JoCi1vcmg6Ci0Jb3JoIHIxMywgQHIxNAotCS5nbG9iYWwgb3JiCi1vcmI6Ci0Jb3JiIHIxNSwgQGFjCi0JLmdsb2JhbCBlb3IKLWVvcjoKLQllb3IgZnAsIHNwCi0JZW9yIHIwLCBAcjEKLQkuZ2xvYmFsIGVvcmgKLWVvcmg6Ci0JZW9yaCByMiwgQHIzCi0JLmdsb2JhbCBlb3JiCi1lb3JiOgotCWVvcmIgcjQsIEByNQotCS5nbG9iYWwgYmFuZGwKLWJhbmRsOgotCWJhbmRsICMxNSwgQHI2Ci0JLmdsb2JhbCBiYW5kaAotbmFkaDoKLQliYW5kaCAjNywgQHI3Ci0JLmdsb2JhbCBib3JsCi1ib3JsOgotCWJvcmwgIzMsIEByOAotCS5nbG9iYWwgYm9yaAotYm9yaDoKLQlib3JoICMxMywgQHI5Ci0JLmdsb2JhbCBiZW9ybAotYmVvcmw6Ci0JYmVvcmwgIzE1LCBAcjEwCi0JLmdsb2JhbCBiZW9yaAotYmVvcmg6Ci0JYmVvcmggIzEsIEByMTEKLQkuZ2xvYmFsIGJ0c3RsCi1idHN0bDoKLQlidHN0bCAjMCwgQHIxMgotCS5nbG9iYWwgYnRzdGgKLWJ0c3RoOgotCWJ0c3RoICM4LCBAcjEzCi0JLmdsb2JhbCBtdWwKLW11bDoKLQltdWwgcjE0LCByMTUKLQkuZ2xvYmFsIG11bHUKLW11bHU6Ci0JbXVsdSBhYywgZnAKLQkuZ2xvYmFsIG11bHVoCi1tdWx1aDoJCi0JbXVsdWggc3AsIHIwCi0JLmdsb2JhbCBtdWxoCi1tdWxoOgkKLQltdWxoIHIxLCByMgotCS5nbG9iYWwgZGl2MHMKLWRpdjBzOgotCWRpdjBzIHIzCi0JLmdsb2JhbCBkaXYwdQotZGl2MHU6Ci0JZGl2MHUgcjQKLQkuZ2xvYmFsIGRpdjEKLWRpdjE6Ci0JZGl2MSByNQotCS5nbG9iYWwgZGl2MgotZGl2MjoKLQlkaXYyIHI2Ci0JLmdsb2JhbCBkaXYzCi1kaXYzOgotCWRpdjMKLQkuZ2xvYmFsIGRpdjRzCi1kaXY0czoKLQlkaXY0cwotCS5nbG9iYWwgbHNsCi1sc2w6Ci0JbHNsIHI3LCByOAotCWxzbCAjMywgcjkKLQkuZ2xvYmFsIGxzbDIKLWxzbDI6Ci0JbHNsMiAjMCwgcjEwCi0JLmdsb2JhbCBsc3IKLWxzcjoKLQlsc3IgcjExLCByMTIKLQlsc3IgIzE1LCByMTMKLQkuZ2xvYmFsIGxzcjIKLWxzcjI6Ci0JbHNyMiAjMTUsIHIxNAotCS5nbG9iYWwgYXNyCi1hc3I6Ci0JYXNyIHIxNSwgYWMKLQlhc3IgIzYsIGZwCi0JLmdsb2JhbCBhc3IyCi1hc3IyOgotCWFzcjIgIzcsIHNwCi0JLmdsb2JhbCBsZGlfOAotbGRpXzg6Ci0JbGRpOjggIzB4ZmYsIHIyCi0JLmdsb2JhbCBsZAotbGQ6Ci0JbGQgQHIzLCByNAotCWxkIEAoUjEzLCByNSksIHI2Ci0JbGQgQChSMTQsIDB4MWZjKSwgcjcKLQlsZCBAKFIxNSwgMHgzYyksIHI4Ci0JbGQgQHIxNSssIHI5Ci0JbGQgQHIxNSssIHBzCi0JbGQgQFIxNSssIHRicgotCWxkIEByMTUrLCBycAotCWxkIEBSMTUrLCBzc3AKLQkuZ2xvYmFsIGxkdWgKLWxkdWg6Ci0JbGR1aCBAcjEwLCByMTEKLQlsZHVoIEAocjEzLCByMTIpLCByMTMKLQlsZHVoIEAocjE0LCAjLTI1NiksIHIxNQotCS5nbG9iYWwgbGR1YgotbGR1YjoKLQlsZHViIEBhYywgZnAKLQlsZHViIEAocjEzLCBzcCksIHIwCi0JbGR1YiBAKHIxNCwgLTEyOCksIHIxCi0JLmdsb2JhbCBzdAotc3Q6Ci0Jc3QgcjIsIEByMwotCXN0IHI0LCBAKHIxMywgcjUpCi0Jc3QgcjYsIEAocjE0LCAtNTEyKQotCXN0IHI3LCBAKHIxNSwgMHgzYykKLQlzdCByOCwgQCAtIHIxNQotCXN0IE1ESCwgQC1yMTUKLQlzdCBQUywgQCAtIHIxNQotCS5nbG9iYWwgbHN0aAotc3RoOgotCXN0aCByOSwgQHIxMAotCXN0aCByMTEsIEAocjEzLCByMTIpCi0Jc3RoIHIxMywgQChyMTQsIDEyOCkKLQkuZ2xvYmFsIHN0Ygotc3RiOgotCVNUQiByMTQsIEByMTUKLQlzdGIgcjAsIEAocjEzLCByMSkKLQlTVEIgcjIsIEAocjE0LCAtMTI4KQotCS5nbG9iYWwgbW92Ci1tb3Y6Ci0JbW92IHIzLCByNAotCU1PViBtZGwsIHI1Ci0JbW92IHBzLCByNgotCW1vdiByNywgdXNwCi0JbW92IHI4LCBwcwotCS5nbG9iYWwgam1wCi1qbXA6Ci0Jam1wIEByOQotCS5nbG9iYWwgcmV0Ci1yZXQ6Ci0JcmV0Ci0JLmdsb2JhbCBicmEKLWJyYToKLQlicmEgZm9vdGV4dAotCS5nbG9iYWwgYm5vCi1ibm86Ci0JYm5vIGZvb3RleHQKLQkuZ2xvYmFsIGJlcQotYmVxOgotCWJlcSBmb290ZXh0Ci0JLmdsb2JhbCBibmUKLWJuZToKLQlibmUgZm9vdGV4dAotCS5nbG9iYWwgYmMKLWJjOgotCWJjIGZvb3RleHQKLQkuZ2xvYmFsIGJuYwotYm5jOgotCWJuYyBmb290ZXh0Ci0JLmdsb2JhbCBibgotYm46Ci0JYm4gZm9vdGV4dAotCS5nbG9iYWwgYnAKLWJwOgotCWJwIGZvb3RleHQKLQkuZ2xvYmFsIGJ2Ci1idjoKLQlidiBmb290ZXh0Ci0JLmdsb2JhbCBibnYKLWJudjoKLQlibnYgZm9vdGV4dAotCS5nbG9iYWwgYmx0Ci1ibHQ6Ci0JYmx0IGZvb3RleHQKLQkuZ2xvYmFsIGJnZQotYmdlOgotCWJnZSBmb290ZXh0Ci0JLmdsb2JhbCBibGUKLWJsZToKLQlibGUgZm9vdGV4dAotCS5nbG9iYWwgYmd0Ci1iZ3Q6Ci0JYmd0IGZvb3RleHQKLQkuZ2xvYmFsIGJscwotYmxzOgotCWJscyBmb290ZXh0Ci0JLmdsb2JhbCBiaGkKLWJoaToKLQliaGkgZm9vdGV4dAotZGVsYXlfZm9vdGV4dDoJCQotCS5nbG9iYWwgam1wX2QKLWptcF9kOgotCWptcDpkIEByMTEKLQlub3AKLQkuZ2xvYmFsIHJldF9kCi1yZXRfZDoKLQlyZXQ6ZAotCW5vcAotCS5nbG9iYWwgYnJhX2QKLWJyYV9kOgotCWJyYTpEIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJub19kCi1ibm9fZDoKLQlibm86ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBiZXFfZAotYmVxX2Q6Ci0JYmVxOkQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYm5lX2QKLWJuZV9kOgotCWJuZTpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJjX2QKLWJjX2Q6Ci0JYmM6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibmNfZAotYm5jX2Q6Ci0JYm5jOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYm5fZAotYm5fZDoKLQlibjpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJwX2QKLWJwX2Q6Ci0JYnA6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBidl9kCi1idl9kOgotCWJ2OmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYm52X2QKLWJudl9kOgotCWJudjpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJsdF9kCi1ibHRfZDoKLQlibHQ6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBiZ2VfZAotYmdlX2Q6Ci0JYmdlOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmxlX2QKLWJsZV9kOgotCWJsZTpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJndF9kCi1iZ3RfZDoKLQliZ3Q6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibHNfZAotYmxzX2Q6Ci0JYmxzOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmhpX2QKLWJoaV9kOgotCWJoaTpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGxkcmVzCi1sZHJlczoKLQlsZHJlcyBAcjIrLCAjOAotCS5nbG9iYWwgc3RyZXMKLXN0cmVzOgotCXN0cmVzICMxNSwgQHIzKwotCS5nbG9iYWwgbm9wCi1ub3A6Ci0Jbm9wCi0JLmdsb2JhbCBhbmRjY3IKLWFuZGNjcjoKLQlhbmRjY3IgIzI1NQotCS5nbG9iYWwgb3JjY3IKLW9yY2NyOgotCW9yY2NyICMxMjUKLQkuZ2xvYmFsIHN0aWxtCi1zdGlsbToKLQlzdGlsbSAjOTcKLQkuZ2xvYmFsIGFkZHNwCi1hZGRzcDoKLQlhZGRzcCAjLTUxMgotCS5nbG9iYWwgZXh0c2IKLWV4dHNiOgotCWV4dHNiIHI5Ci0JLmdsb2JhbCBleHR1YgotZXh0dWI6Ci0JZXh0dWIgcjEwCi0JLmdsb2JhbCBleHRzaAotZXh0c2g6Ci0JZXh0c2ggcjExCi0JLmdsb2JhbCBleHR1aAotZXh0dWg6Ci0JZXh0dWggcjEyCi0JLmdsb2JhbCBlbnRlcgotZW50ZXI6Ci0JZW50ZXIgIzEwMjAKLQkuZ2xvYmFsIGxlYXZlCi1sZWF2ZToKLQlsZWF2ZSAKLQkuZ2xvYmFsIHhjaGIKLXhjaGI6Ci0JeGNoYiBAcjE0LCByMTUKLQkuZ2xvYmFsIGxkaV8zMgotbGRpXzMyOgotCWxkaTozMiAjMHgxMjM0NTY3OCwgcjAKLQkuZ2xvYmFsIGNvcG9wCi1jb3BvcDoKLQljb3BvcCAjMTUsICMxLCBjcjMsIGNyNAotCWNvcG9wICMxNSwgIzQsIGNyNSwgY3I2Ci0JY29wb3AgIzE1LCAjMjU1LCBjcjcsIGNyMAotCS5nbG9iYWwgY29wbGQKLWNvcGxkOgotCWNvcGxkICMwLCAjMCwgcjQsIGNyMAotCS5nbG9iYWwgY29wc3QKLWNvcHN0OgotCWNvcHN0ICM3LCAjMiwgY3IxLCByNQotCS5nbG9iYWwgY29wc3YKLWNvcHN2OgotCWNvcHN2ICM4LCAjMywgY3IyLCByNgotCS5nbG9iYWwgbGRtMAotbGRtMDoKLQlsZG0wIChyMCwgcjIsIHIzLCByNykKLQkuZ2xvYmFsIGxkbTEKLWxkbTE6Ci0JbGRtMSAocjgsIHIxMSwgcjE1KQotCS5nbG9iYWwgc3RtMAotc3RtMDoKLQlzdG0wIChyMiwgcjMpCi0JLmdsb2JhbCBzdG0xCi1zdG0xOgotCXN0bTEgKHIxMywgcjE0KQotCS5nbG9iYWwgY2FsbAotY2FsbDoKLQljYWxsIGZvb3RleHQKLQljYWxsIEByMTAKLQkuZ2xvYmFsIGNhbGxfZAotY2FsbF9kOgotCWNhbGw6RCBmb290ZXh0Ci0Jbm9wCi0JY2FsbDpkIEByMTIKLQlub3AKLQkuZ2xvYmFsIGRtb3YKLWRtb3Y6Ci0JZG1vdiBAMHg4OCwgcjEzCi0JZG1vdiByMTMsIEAweDU0Ci0JZG1vdiBAMHg0NCwgQHIxMysKLQlkbW92IEBSMTMrLCBAMHgyCi0JZG1vdiBAMHgyYywgQC1yMTUKLQlkbW92IEByMTUrLCBAMzgKLQkuZ2xvYmFsIGRtb3ZoCi1kbW92aDoKLQlkbW92aCBAMHg4OCwgcjEzCi0JZG1vdmggcjEzLCBAMHg1MgotCWRtb3ZoIEAweDM0LCBAcjEzICsKLQlkbW92aCBAcjEzKywgQDB4NTIKLQkuZ2xvYmFsIGRtb3ZiCi1kbW92YjoKLQlkbW92YiBAMHg5MSwgcjEzCi0JZG1vdmIgcjEzLCBAMHg1MwotCWRtb3ZiIEA3MSwgQHIxMysKLQlkbW92YiBAcjEzKywgQDB4MAotCS5nbG9iYWwgbGRpXzIwCi1sZGlfMjA6Ci0gCWxkaToyMCAjMHgwMDBmZmZmZiwgcjEKLWZpbmlzaDoJCi0gICAgICAgIGxkaTozMiAjMHg4MDAwLHIwCi0JbW92ICAgIHIwLHNzcAotICAgICAgICBsZGk6MzIgIzEscjAKLQlpbnQgICAgIzEwCi0JLmdsb2JhbCBpbnRlCi1pbnRlOgotCWludGUKLQkuZ2xvYmFsIHJldGkKLXJldGk6Ci0JcmV0aQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9mcjMwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvZnIzMC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Mjg2YjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9mcjMwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBGUjMwIHRlc3RjYXNlcwotCi1pZiBbaXN0YXJnZXQgZnIzMCotKi0qXSB7Ci0jICAgIHJ1bl9kdW1wX3Rlc3QgImhpZ2gtMSIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMmIwZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLnRleHQKLWg4MzAwX2FkZF9zdWI6Ci0JYWRkLmIgIzE2LHIxbAotCWFkZC5iIHIxaCxyMWwKLQlhZGQudyByMSxyMgotCWFkZHMgIzEscjQKLQlhZGRzICMyLHI1Ci0JYWRkeCByMGwscjFsCi0JYWRkeCAjMTYscjJoCi0Jc3ViLmIgcjBsLHIxbAotCXN1Yi53IHIwLHIxCi0Jc3VicyAjMSxyNAotCXN1YnMgIzIscjUKLQlzdWJ4IHIwbCxyMWwKLQlzdWJ4ICMxNixyMmgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjg4NWQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YmgucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9hZGRfc3ViOgotCWFkZC5iICMxNixyMWwKLQlhZGQuYiByMWgscjFsCi0JYWRkLncgIzMyLHIxCi0JYWRkLncgcjEscjIKLQlhZGQubCAjNjQsZXIxCi0JYWRkLmwgZXIxLGVyMgotCWFkZHMgIzEsZXI0Ci0JYWRkcyAjMixlcjUKLQlhZGRzICM0LGVyNgotCWFkZHggcjBsLHIxbAotCWFkZHggIzE2LHIyaAotCXN1Yi5iIHIwbCxyMWwKLQlzdWIudyAjMTYscjEKLQlzdWIudyByMCxyMQotCXN1Yi5sICM2NCxlcjEKLQlzdWIubCBlcjEsZXIyCi0Jc3VicyAjMSxlcjQKLQlzdWJzICMyLGVyNQotCXN1YnMgIzQsZXI2Ci0Jc3VieCByMGwscjFsCi0Jc3VieCAjMTYscjJoCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiMzY5OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYWRkX3N1YjoKLQlhZGQuYiAjMTYscjFsCi0JYWRkLmIgcjFoLHIxbAotCWFkZC53ICMzMixyMQotCWFkZC53IHIxLHIyCi0JYWRkLmwgIzY0LGVyMQotCWFkZC5sIGVyMSxlcjIKLQlhZGRzICMxLGVyNAotCWFkZHMgIzIsZXI1Ci0JYWRkcyAjNCxlcjYKLQlhZGR4IHIwbCxyMWwKLQlhZGR4ICMxNixyMmgKLQlzdWIuYiByMGwscjFsCi0Jc3ViLncgIzE2LHIxCi0Jc3ViLncgcjAscjEKLQlzdWIubCAjNjQsZXIxCi0Jc3ViLmwgZXIxLGVyMgotCXN1YnMgIzEsZXI0Ci0Jc3VicyAjMixlcjUKLQlzdWJzICM0LGVyNgotCXN1YnggcjBsLHIxbAotCXN1YnggIzE2LHIyaAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTA3YTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9iaXRfb3BzXzE6Ci0JYmFuZCAjMCxyMGwKLQliYW5kICMwLEByMAotCWJhbmQgIzAsQDY0OjgKLQliY2xyICMwLHIwbAotCWJjbHIgIzAsQHIwCi0JYmNsciAjMCxANjQ6OAotCWJjbHIgcjFsLHIwbAotCWJjbHIgcjFsLEByMAotCWJjbHIgcjFsLEA2NDo4Ci0JYmlhbmQgIzAscjBsCi0JYmlhbmQgIzAsQHIwCi0JYmlhbmQgIzAsQDY0OjgKLQliaWxkICMwLHIwbAotCWJpbGQgIzAsQHIwCi0JYmlsZCAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMWgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzOWE1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2JpdF9vcHNfMToKLQliYW5kICMwLHIwbAotCWJhbmQgIzAsQGVyMAotCWJhbmQgIzAsQDY0OjgKLQliY2xyICMwLHIwbAotCWJjbHIgIzAsQGVyMAotCWJjbHIgIzAsQDY0OjgKLQliY2xyIHIxbCxyMGwKLQliY2xyIHIxbCxAZXIwCi0JYmNsciByMWwsQDY0OjgKLQliaWFuZCAjMCxyMGwKLQliaWFuZCAjMCxAZXIwCi0JYmlhbmQgIzAsQDY0OjgKLQliaWxkICMwLHIwbAotCWJpbGQgIzAsQGVyMAotCWJpbGQgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NTk5ZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMXMucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19iaXRfb3BzXzE6Ci0JYmFuZCAjMCxyMGwKLQliYW5kICMwLEBlcjAKLQliYW5kICMwLEA2NDo4Ci0JYmFuZCAjMCxAMTI4OjE2Ci0JYmFuZCAjMCxANjU1MzY6MzIKLQliY2xyICMwLHIwbAotCWJjbHIgIzAsQGVyMAotCWJjbHIgIzAsQDY0OjgKLQliY2xyICMwLEAxMjg6MTYKLQliY2xyICMwLEA2NTUzNjozMgotCWJjbHIgcjFsLHIwbAotCWJjbHIgcjFsLEBlcjAKLQliY2xyIHIxbCxANjQ6OAotCWJjbHIgcjFsLEAxMjg6MTYKLQliY2xyIHIxbCxANjU1MzY6MzIKLQliaWFuZCAjMCxyMGwKLQliaWFuZCAjMCxAZXIwCi0JYmlhbmQgIzAsQDY0OjgKLQliaWFuZCAjMCxAMTI4OjE2Ci0JYmlhbmQgIzAsQDY1NTM2OjMyCi0JYmlsZCAjMCxyMGwKLQliaWxkICMwLEBlcjAKLQliaWxkICMwLEA2NDo4Ci0JYmlsZCAjMCxAMTI4OjE2Ci0JYmlsZCAjMCxANjU1MzY6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTk2ZTVhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczIucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfYml0X29wc18yOgotCWJpb3IgIzAscjBsCi0JYmlvciAjMCxAcjAKLQliaW9yICMwLEA2NDo4Ci0JYmlzdCAjMCxyMGwKLQliaXN0ICMwLEByMAotCWJpc3QgIzAsQDY0OjgKLQliaXhvciAjMCxyMGwKLQliaXhvciAjMCxAcjAKLQliaXhvciAjMCxANjQ6OAotCWJsZCAjMCxyMGwKLQlibGQgIzAsQHIwCi0JYmxkICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmJlNzRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfYml0X29wc18yOgotCWJpb3IgIzAscjBsCi0JYmlvciAjMCxAZXIwCi0JYmlvciAjMCxANjQ6OAotCWJpc3QgIzAscjBsCi0JYmlzdCAjMCxAZXIwCi0JYmlzdCAjMCxANjQ6OAotCWJpeG9yICMwLHIwbAotCWJpeG9yICMwLEBlcjAKLQliaXhvciAjMCxANjQ6OAotCWJsZCAjMCxyMGwKLQlibGQgIzAsQGVyMAotCWJsZCAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMycy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3MDUyMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMycy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2JpdF9vcHNfMjoKLQliaW9yICMwLHIwbAotCWJpb3IgIzAsQGVyMAotCWJpb3IgIzAsQDY0OjgKLQliaW9yICMwLEAxMjg6MTYKLQliaW9yICMwLEA2NTUzNjozMgotCWJpc3QgIzAscjBsCi0JYmlzdCAjMCxAZXIwCi0JYmlzdCAjMCxANjQ6OAotCWJpc3QgIzAsQDEyODoxNgotCWJpc3QgIzAsQDY1NTM2OjMyCi0JYml4b3IgIzAscjBsCi0JYml4b3IgIzAsQGVyMAotCWJpeG9yICMwLEA2NDo4Ci0JYml4b3IgIzAsQDEyODoxNgotCWJpeG9yICMwLEA2NTUzNjozMgotCWJsZCAjMCxyMGwKLQlibGQgIzAsQGVyMAotCWJsZCAjMCxANjQ6OAotCWJsZCAjMCxAMTI4OjE2Ci0JYmxkICMwLEA2NTUzNjozMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM5YmZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczMucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfYml0X29wc18zOgotCWJub3QgIzAscjBsCi0JYm5vdCAjMCxAcjAKLQlibm90ICMwLEA2NDo4Ci0JYm5vdCByMWwscjBsCi0JYm5vdCByMWwsQHIwCi0JYm5vdCByMWwsQDY0OjgKLQlic2V0ICMwLHIwbAotCWJzZXQgIzAsQHIwCi0JYnNldCAjMCxANjQ6OAotCWJzZXQgcjFsLHIwbAotCWJzZXQgcjFsLEByMAotCWJzZXQgcjFsLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGVkYTYwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfYml0X29wc18zOgotCWJub3QgIzAscjBsCi0JYm5vdCAjMCxAZXIwCi0JYm5vdCAjMCxANjQ6OAotCWJub3QgcjFsLHIwbAotCWJub3QgcjFsLEBlcjAKLQlibm90IHIxbCxANjQ6OAotCWJzZXQgIzAscjBsCi0JYnNldCAjMCxAZXIwCi0JYnNldCAjMCxANjQ6OAotCWJzZXQgcjFsLHIwbAotCWJzZXQgcjFsLEBlcjAKLQlic2V0IHIxbCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2NGUwNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2JpdF9vcHNfMzoKLQlibm90ICMwLHIwbAotCWJub3QgIzAsQGVyMAotCWJub3QgIzAsQDY0OjgKLQlibm90ICMwLEAxMjg6MTYKLQlibm90ICMwLEA2NTUzNjozMgotCWJub3QgcjFsLHIwbAotCWJub3QgcjFsLEBlcjAKLQlibm90IHIxbCxANjQ6OAotCWJub3QgcjFsLEAxMjg6MTYKLQlibm90IHIxbCxANjU1MzY6MzIKLQlic2V0ICMwLHIwbAotCWJzZXQgIzAsQGVyMAotCWJzZXQgIzAsQDY0OjgKLQlic2V0ICMwLEAxMjg6MTYKLQlic2V0ICMwLEA2NTUzNjozMgotCWJzZXQgcjFsLHIwbAotCWJzZXQgcjFsLEBlcjAKLQlic2V0IHIxbCxANjQ6OAotCWJzZXQgcjFsLEAxMjg6MTYKLQlic2V0IHIxbCxANjU1MzY6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2U2NmQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczQucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkudGV4dAotaDgzMDBfYml0X29wc180OgotCWJvciAjMCxyMGwKLQlib3IgIzAsQHIwCi0JYm9yICMwLEA2NDo4Ci0JYnN0ICMwLHIwbAotCWJzdCAjMCxAcjAKLQlic3QgIzAsQDY0OjgKLQlidHN0ICMwLHIwbAotCWJ0c3QgIzAsQHIwCi0JYnRzdCAjMCxANjQ6OAotCWJ0c3QgcjFsLHIwbAotCWJ0c3QgcjFsLEByMAotCWJ0c3QgcjFsLEA2NDo4Ci0JYnhvciAjMCxyMGwKLQlieG9yICMwLEByMAotCWJ4b3IgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzVlMTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNGgucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9iaXRfb3BzXzQ6Ci0JYm9yICMwLHIwbAotCWJvciAjMCxAZXIwCi0JYm9yICMwLEA2NDo4Ci0JYnN0ICMwLHIwbAotCWJzdCAjMCxAZXIwCi0JYnN0ICMwLEA2NDo4Ci0JYnRzdCAjMCxyMGwKLQlidHN0ICMwLEBlcjAKLQlidHN0ICMwLEA2NDo4Ci0JYnRzdCByMWwscjBsCi0JYnRzdCByMWwsQGVyMAotCWJ0c3QgcjFsLEA2NDo4Ci0JYnhvciAjMCxyMGwKLQlieG9yICMwLEBlcjAKLQlieG9yICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0cy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY0N2I2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYml0X29wc180OgotCWJvciAjMCxyMGwKLQlib3IgIzAsQGVyMAotCWJvciAjMCxANjQ6OAotCWJvciAjMCxAMTI4OjE2Ci0JYm9yICMwLEA2NTUzNjozMgotCWJzdCAjMCxyMGwKLQlic3QgIzAsQGVyMAotCWJzdCAjMCxANjQ6OAotCWJzdCAjMCxAMTI4OjE2Ci0JYnN0ICMwLEA2NTUzNjozMgotCWJ0c3QgIzAscjBsCi0JYnRzdCAjMCxAZXIwCi0JYnRzdCAjMCxANjQ6OAotCWJ0c3QgIzAsQDEyODoxNgotCWJ0c3QgIzAsQDY1NTM2OjMyCi0JYnRzdCByMWwscjBsCi0JYnRzdCByMWwsQGVyMAotCWJ0c3QgcjFsLEA2NDo4Ci0JYnRzdCByMWwsQDEyODoxNgotCWJ0c3QgcjFsLEA2NTUzNjozMgotCWJ4b3IgIzAscjBsCi0JYnhvciAjMCxAZXIwCi0JYnhvciAjMCxANjQ6OAotCWJ4b3IgIzAsQDEyODoxNgotCWJ4b3IgIzAsQDY1NTM2OjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODA2MTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLWg4MzAwX2JyYW5jaGVzOgotCWJzciBoODMwMF9icmFuY2hlcwotCWptcCBoODMwMF9icmFuY2hlcwotCWptcCBAcjAKLQlqbXAgQEAxNjo4Ci0JanNyIGg4MzAwX2JyYW5jaGVzCi0JanNyIEByMAotCWpzciBAQDE2OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2JjNjJmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaGgucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9icmFuY2hlczoKLQlic3IgaDgzMDBoX2JyYW5jaGVzOjgKLQlic3IgaDgzMDBoX2JyYW5jaGVzOjE2Ci0Jam1wIGg4MzAwaF9icmFuY2hlcwotCWptcCBAZXIwCi0Jam1wIEBAMTY6OAotCWpzciBoODMwMGhfYnJhbmNoZXMKLQlqc3IgQGVyMAotCWpzciBAQDE2OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNocy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNocy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjMzZTE3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaHMucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19icmFuY2hlczoKLQlic3IgaDgzMDBzX2JyYW5jaGVzOjgKLQlic3IgaDgzMDBzX2JyYW5jaGVzOjE2Ci0Jam1wIGg4MzAwc19icmFuY2hlcwotCWptcCBAZXIwCi0Jam1wIEBAMTY6OAotCWpzciBoODMwMHNfYnJhbmNoZXMKLQlqc3IgQGVyMAotCWpzciBAQDE2OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNkNTNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2gucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQkudGV4dAotaDgzMDBfY2JyYW5jaDoKLQlicmEgaDgzMDBfY2JyYW5jaAotCWJ0IGg4MzAwX2NicmFuY2gKLQlicm4gaDgzMDBfY2JyYW5jaAotCWJmIGg4MzAwX2NicmFuY2gKLQliaGkgaDgzMDBfY2JyYW5jaAotCWJscyBoODMwMF9jYnJhbmNoCi0JYmNjIGg4MzAwX2NicmFuY2gKLQliaHMgaDgzMDBfY2JyYW5jaAotCWJjcyBoODMwMF9jYnJhbmNoCi0JYmxvIGg4MzAwX2NicmFuY2gKLQlibmUgaDgzMDBfY2JyYW5jaAotCWJlcSBoODMwMF9jYnJhbmNoCi0JYnZjIGg4MzAwX2NicmFuY2gKLQlidnMgaDgzMDBfY2JyYW5jaAotCWJwbCBoODMwMF9jYnJhbmNoCi0JYm1pIGg4MzAwX2NicmFuY2gKLQliZ2UgaDgzMDBfY2JyYW5jaAotCWJsdCBoODMwMF9jYnJhbmNoCi0JYmd0IGg4MzAwX2NicmFuY2gKLQlibGUgaDgzMDBfY2JyYW5jaAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0ZTFhMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoaC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCS50ZXh0Ci0JLmg4MzAwaAotaDgzMDBoX2NicmFuY2g6Ci0JYnJhIGg4MzAwaF9jYnJhbmNoOjgKLQlidCBoODMwMGhfY2JyYW5jaDo4Ci0JYnJuIGg4MzAwaF9jYnJhbmNoOjgKLQliZiBoODMwMGhfY2JyYW5jaDo4Ci0JYmhpIGg4MzAwaF9jYnJhbmNoOjgKLQlibHMgaDgzMDBoX2NicmFuY2g6OAotCWJjYyBoODMwMGhfY2JyYW5jaDo4Ci0JYmhzIGg4MzAwaF9jYnJhbmNoOjgKLQliY3MgaDgzMDBoX2NicmFuY2g6OAotCWJsbyBoODMwMGhfY2JyYW5jaDo4Ci0JYm5lIGg4MzAwaF9jYnJhbmNoOjgKLQliZXEgaDgzMDBoX2NicmFuY2g6OAotCWJ2YyBoODMwMGhfY2JyYW5jaDo4Ci0JYnZzIGg4MzAwaF9jYnJhbmNoOjgKLQlicGwgaDgzMDBoX2NicmFuY2g6OAotCWJtaSBoODMwMGhfY2JyYW5jaDo4Ci0JYmdlIGg4MzAwaF9jYnJhbmNoOjgKLQlibHQgaDgzMDBoX2NicmFuY2g6OAotCWJndCBoODMwMGhfY2JyYW5jaDo4Ci0JYmxlIGg4MzAwaF9jYnJhbmNoOjgKLQlicmEgaDgzMDBoX2NicmFuY2g6MTYKLQlidCBoODMwMGhfY2JyYW5jaDoxNgotCWJybiBoODMwMGhfY2JyYW5jaDoxNgotCWJmIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmhpIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmxzIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmNjIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmhzIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmNzIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmxvIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYm5lIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmVxIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYnZjIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYnZzIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYnBsIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYm1pIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmdlIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmx0IGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmd0IGg4MzAwaF9jYnJhbmNoOjE2Ci0JYmxlIGg4MzAwaF9jYnJhbmNoOjE2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNocy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDIyMmVhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0JLnRleHQKLQkuaDgzMDBzCi1oODMwMHNfY2JyYW5jaDoKLQlicmEgaDgzMDBzX2NicmFuY2g6OAotCWJ0IGg4MzAwc19jYnJhbmNoOjgKLQlicm4gaDgzMDBzX2NicmFuY2g6OAotCWJmIGg4MzAwc19jYnJhbmNoOjgKLQliaGkgaDgzMDBzX2NicmFuY2g6OAotCWJscyBoODMwMHNfY2JyYW5jaDo4Ci0JYmNjIGg4MzAwc19jYnJhbmNoOjgKLQliaHMgaDgzMDBzX2NicmFuY2g6OAotCWJjcyBoODMwMHNfY2JyYW5jaDo4Ci0JYmxvIGg4MzAwc19jYnJhbmNoOjgKLQlibmUgaDgzMDBzX2NicmFuY2g6OAotCWJlcSBoODMwMHNfY2JyYW5jaDo4Ci0JYnZjIGg4MzAwc19jYnJhbmNoOjgKLQlidnMgaDgzMDBzX2NicmFuY2g6OAotCWJwbCBoODMwMHNfY2JyYW5jaDo4Ci0JYm1pIGg4MzAwc19jYnJhbmNoOjgKLQliZ2UgaDgzMDBzX2NicmFuY2g6OAotCWJsdCBoODMwMHNfY2JyYW5jaDo4Ci0JYmd0IGg4MzAwc19jYnJhbmNoOjgKLQlibGUgaDgzMDBzX2NicmFuY2g6OAotCWJyYSBoODMwMHNfY2JyYW5jaDoxNgotCWJ0IGg4MzAwc19jYnJhbmNoOjE2Ci0JYnJuIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmYgaDgzMDBzX2NicmFuY2g6MTYKLQliaGkgaDgzMDBzX2NicmFuY2g6MTYKLQlibHMgaDgzMDBzX2NicmFuY2g6MTYKLQliY2MgaDgzMDBzX2NicmFuY2g6MTYKLQliaHMgaDgzMDBzX2NicmFuY2g6MTYKLQliY3MgaDgzMDBzX2NicmFuY2g6MTYKLQlibG8gaDgzMDBzX2NicmFuY2g6MTYKLQlibmUgaDgzMDBzX2NicmFuY2g6MTYKLQliZXEgaDgzMDBzX2NicmFuY2g6MTYKLQlidmMgaDgzMDBzX2NicmFuY2g6MTYKLQlidnMgaDgzMDBzX2NicmFuY2g6MTYKLQlicGwgaDgzMDBzX2NicmFuY2g6MTYKLQlibWkgaDgzMDBzX2NicmFuY2g6MTYKLQliZ2UgaDgzMDBzX2NicmFuY2g6MTYKLQlibHQgaDgzMDBzX2NicmFuY2g6MTYKLQliZ3QgaDgzMDBzX2NicmFuY2g6MTYKLQlibGUgaDgzMDBzX2NicmFuY2g6MTYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY21wc2kyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jbXBzaTIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3ZjAzYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jbXBzaTIucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgMSAibGliZ2NjMS5TIgotOzsgbGliZ2NjMSByb3V0aW5lcyBmb3IgdGhlIEhpdGFjaGkgaDgvMzAwIGNwdS4KLTs7IENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluLgotOzsgc2FjQGN5Z251cy5jb20KLQkuc2VjdGlvbiAudGV4dAotCS5hbGlnbiAyCi0JLmdsb2JhbCBfX19jbXBzaTIKLV9fX2NtcHNpMjoKLQljbXAudwlyMiAscjAgCi0JYm5lCS5MMgotCWNtcC53CXIzICxyMSAKLQlibmUJLkwyCi0JbW92LncJIzEscjAgCi0JcnRzCi0uTDI6Ci0JY21wLncJcjAgLHIyIAotCWJndAkuTDQKLQlibmUJLkwzCi0JY21wLncJcjEgLHIzIAotCWJscwkuTDMKLS5MNDoKLQlzdWIudwlyMCAscjAgCi0JcnRzCi0uTDM6Ci0JbW92LncJIzIscjAgCi0uTDU6Ci0JcnRzCi0JLmVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMxYTQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmUucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9jbXA6Ci0JY21wLmIgIzAscjBsCi0JY21wLmIgcjBoLHIwbAotCWNtcC53IHIwLHIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODFlODhlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfY21wOgotCWNtcC5iICMwLHIwbAotCWNtcC5iIHIwaCxyMGwKLQljbXAudyAjMzIscjAKLQljbXAudyByMCxyMQotCWNtcC5sICM2NCxlcjAKLQljbXAubCBlcjAsZXIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNmM2ZlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfY21wOgotCWNtcC5iICMwLHIwbAotCWNtcC5iIHIwaCxyMGwKLQljbXAudyAjMzIscjAKLQljbXAudyByMCxyMQotCWNtcC5sICM2NCxlcjAKLQljbXAubCBlcjAsZXIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0YzBhMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfZGVjaW1hbDoKLQlkYWEgcjBsCi0JZGFzIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5MjQwNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsaC5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfZGVjaW1hbDoKLQlkYWEgcjBsCi0JZGFzIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFscy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4MDJmYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFscy5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfZGVjaW1hbDoKLQlkYWEgcjBsCi0JZGFzIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzM3MmNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX2Rpdl9tdWw6Ci0JZGl2eHUgcjBsLHIxCi0JbXVseHUgcjBsLHIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2MGY4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfZGl2X211bDoKLQlkaXZ4dS5iIHIwbCxyMQotCWRpdnh1LncgcjAsZXIxCi0JZGl2eHMuYiByMGwscjEKLQlkaXZ4cy53IHIwLGVyMQotCW11bHh1LmIgcjBsLHIxCi0JbXVseHUudyByMCxlcjEKLQltdWx4cy5iIHIwbCxyMQotCW11bHhzLncgcjAsZXIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2MGY4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfZGl2X211bDoKLQlkaXZ4dS5iIHIwbCxyMQotCWRpdnh1LncgcjAsZXIxCi0JZGl2eHMuYiByMGwscjEKLQlkaXZ4cy53IHIwLGVyMQotCW11bHh1LmIgcjBsLHIxCi0JbXVseHUudyByMCxlcjEKLQltdWx4cy5iIHIwbCxyMQotCW11bHhzLncgcjAsZXIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzNGM4My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9leHRlbmQ6Ci0JZXh0cy53IHIwCi0JZXh0cy5sIGVyMAotCWV4dHUudyByMAotCWV4dHUubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjZlOWJhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZHMucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2V4dGVuZDoKLQlleHRzLncgcjAKLQlleHRzLmwgZXIwCi0JZXh0dS53IHIwCi0JZXh0dS5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0NTVkNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI29iamR1bXA6IC0tcHJlZml4LWFkZHJlc3NlcyAtZHIKLSNuYW1lOiBGRnh4MQotCi0jIFRlc3QgZm9yIEZGeHg6OCBhZGRyZXNzaW5nLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qaDgzMDAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCS4uLgotCQkJMDogMTYJbWFpbgotMCswNDAwIDxtYWluPiBmOCA3ZiAgICAgICAgICAgICBtb3YuYgkjMHg3ZixyMGwKLTArMDQwMiA8bWFpblsrXSgweHwpMj4gMjggYmIgICAgICAgICAgICAgbW92LmIJQDB4YmI6OCxyMGwKLTArMDQwNCA8bWFpblsrXSgweHwpND4gNmEgODggZmYgYjkgICAgICAgbW92LmIJcjBsLEAweGZmYjk6MTYKLTArMDQwOCA8bWFpblsrXSgweHwpOD4gZjggMDEgICAgICAgICAgICAgbW92LmIJIzB4MSxyMGwKLTArMDQwYSA8bG9vcD4gNmEgODggZmYgYmIgICAgICAgbW92LmIJcjBsLEAweGZmYmI6MTYKLTArMDQwZSA8ZGVsYXk+IDc5IDAxIDAwIDAwICAgICAgIG1vdi53CSMweDAscjEKLTArMDQxMiA8ZGVsb29wPiAwYiAwMSAgICAgICAgICAgICBhZGRzCSMweDEsZXIxCi0wKzA0MTQgPGRlbG9vcFsrXSgweHwpMj4gNDYgMDAgICAgICAgICAgICAgYm5lCS4wIFwoNDE2XCkKLQkJCTQxNTogRElTUDgJZGVsb29wWytdMHhmZmZmZmZmZgotMCswNDE2IDxkZWxvb3BbK10oMHh8KTQ+IDEyIDg4ICAgICAgICAgICAgIHJvdGwJcjBsCi0wKzA0MTggPGRlbG9vcFsrXSgweHwpNj4gNDAgMDAgICAgICAgICAgICAgYnJhCS4wIFwoNDFhXCkKLQkJCTQxOTogRElTUDgJbG9vcFsrXTB4ZmZmZmZmZmYKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2ZjODQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLmVxdSAgICBwNmRkciwgIDB4ZmZiOSAgICAgICAgICA7MHg3ZiBmb3Igb3V0cHV0IAotCS5lcXUgICAgcDZkciwgICAgMHhmZmJiCi0JLmVxdSAgICBzZWVkLCAgICAweDAxCi0JLnRleHQKLQkub3JnICAgIDAKLXJlc2V0OiAgLndvcmQgICBtYWluICAgICAgICAgICAgO3Jlc2V0IHZlY3RvciAKLTsKLQkub3JnICAgIDB4NDAwCi1tYWluOiAgIG1vdi5iICAgIzB4N2YscjBsICAgICAgIDtwb3J0IDYgZGRyID0gN0YgCi0JbW92LmIgICBAMHhmZmJiOjgscjBsICAgOyoqKnRlc3QqKioKLQltb3YuYiAgIHIwbCxAcDZkZHI6MTYKLTsKLQltb3YuYiAgICNzZWVkLHIwbCAgICAgICA7c3RhcnQgd2l0aCAwMDAwMDAxCi1sb29wOiAgIG1vdi5iICAgcjBsLEBwNmRyOjE2ICAgIDtvdXRwdXQgdG8gcG9ydCA2IAotZGVsYXk6ICBtb3YudyAgICMweDAwMDAscjEKLWRlbG9vcDogYWRkcy53ICAjMSxyMQotCWJuZSAgICAgZGVsb29wOjggICAgICAgIDtub3QgPSAwCi0Jcm90bCAgICByMGwKLSAgICAgICAgYnJhICAgICBsb29wOjgKLQkud29yZAkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9oODMwMC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9oODMwMC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiN2Q0MWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaDgzMDAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjE4MyArMCwwIEBACi0jCi0jIFNvbWUgSDgvMzAwIHRlc3RzCi0jCi1wcm9jIGRvX2g4MzAwX2FkZF9zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkc3ViLnM6IGg4MzAwIGFkZC9zdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGRzdWIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDg5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwODE5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDkxMlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDBCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMEU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDkyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxODg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMTkwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDFCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMUU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IEIyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogaDgzMDAgbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEU5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxNjkxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDYxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IEM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxNDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIEQ4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxNTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDUxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDE3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxNzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfY2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjYnJhbmNoLnM6IGg4MzAwIGNvbmRpdGlvbmFsIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNicmFuY2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA0MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNDMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA0NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDQ4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA0OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgNEEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDRCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA0QzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNEQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDRFMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA0RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfYml0b3BzMSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMxLnM6IGg4MzAwIGJpdG9wcyB0ZXN0cyAjMSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczEucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc2MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNzIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2Mjk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0QwMDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RjQwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc2ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QzAwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdFNDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNzc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDdDMDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgN0U0MDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9iaXRvcHMyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczIuczogaDgzMDAgYml0b3BzIHRlc3RzICMyIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQ4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDc1ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9iaXRvcHMzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczMuczogaDgzMDAgYml0b3BzIHRlc3RzICMzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdEMDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0Y0MDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2MTk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDcwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjA5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdEMDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0Y0MDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9iaXRvcHM0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczQuczogaDgzMDAgYml0b3BzIHRlc3RzICM0IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzNC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDczMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA3NTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgN0MwMDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA3RTQwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2guczogaDgzMDAgYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNUEwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA1OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNUIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDVFMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNUQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDVGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2NvbXBhcmUge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tcGFyZS5zOiBoODMwMCBjb21wYXJlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29tcGFyZS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgQTgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFDMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9kZWNpbWFsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRlY2ltYWwuczogaDgzMDAgZGVjaW1hbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRlY2ltYWwucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfaW5jZGVjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImluY2RlYy5zOiBoODMwMCBpbmNkZWMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJpbmNkZWMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDFBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfZGl2bXVsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRpdm11bC5zOiBoODMwMCBkaXZtdWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkaXZtdWwucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfbWlzYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtaXNjLnM6IGg4MzAwIG1pc2MgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtaXNjLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3QjVDNTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDA3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAwMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDU2NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1NDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMDE4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldHVwX3hmYWlsICJoODMwMCotKi0qIgotICAgIGZhaWwgImg4MzAwIG1vdmZwZS9tb3Z0cGUgdGVzdHMiCi19Ci0KLXByb2MgZG9faDgzMDBfbW92YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZiLnM6IGg4MzAwIG1vdmIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZiLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwQzg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgRjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDY4MThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2RTE4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDZDMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAyODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNkEwODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2ODk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNkU5ODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2Qzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgMzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDZBODgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX21vdncge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92dy5zOiBoODMwMCBtb3Z3IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92dy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDc5MDAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDZGMTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNkQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDZCMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDZGOTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNkQ5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZCODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX3B1c2hwb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAicHVzaHBvcC5zOiBoODMwMCBwdXNocG9wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVzaHBvcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9yb3RhdGVfc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAicm90c2guczogaDgzMDAgcm90YXRlIGFuZCBzaGlmdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInJvdHNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxMjg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTM4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDEyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTA4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDExODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAxMDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9hZGRfc3ViIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZHN1YmguczogaDgzMDBoIGFkZC9zdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGRzdWJoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA4OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDgxOVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5MTEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDkxMlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBMTEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwQTkyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMEIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDBCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwQjk2XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggMEU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDkyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAxODg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzkzMTAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiAxOTAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0EzMTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDFBOTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyAxQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMUI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDFCOTZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAxRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgQjIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWxoLnM6IGg4MzAwaCBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEU5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxNjkxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzk2MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA2NjExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0E2MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxRjA2NjExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDYxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IEM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAxNDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNzk0MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0E0MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxRjA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIEQ4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxNTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNzk1MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA2NTExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0E1MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDAxRjA2NTExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgMDUxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDE3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCAxNzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMTdCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDE3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSAxNzEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMTczMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDI3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9jYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNicmFuY2hoLnM6IGg4MzAwaCBjb25kaXRpb25hbCBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjYnJhbmNoaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDQyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA0MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDQ2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA0NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNDgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDQ5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyA0QTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNEIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDRDMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA0RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgNEUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDRGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA1ODAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDU4MDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNTgxMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA1ODEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDU4MjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgNTgzMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA1ODQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ0IDU4NDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNTg1MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyA1ODUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDU4NjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTQgNTg3MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA1ODgwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVjIDU4OTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNThBMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NCA1OEIwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY4IDU4QzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmMgNThEMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA1OEUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDc0IDU4RjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNDBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci1wcm9jIGRvX2g4MzAwaF9iaXRvcHMxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczFoLnM6IGg4MzAwaCBiaXRvcHMgdGVzdHMgIzEiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMxaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3MjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDYyOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzY4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA3Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgN0MwMDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA3RTQwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9iaXRvcHMyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczJoLnM6IGg4MzAwaCBiaXRvcHMgdGVzdHMgIzIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMyaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQ4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDc1ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfYml0b3BzMyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMzaC5zOiBoODMwMGggYml0b3BzIHRlc3RzICMzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzM2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDcxMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3RDAwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdGNDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNjE5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA3MDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0QwMDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RjQwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDYwOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3RDAwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdGNDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2JpdG9wczQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzNGguczogaDgzMDBoIGJpdG9wcyB0ZXN0cyAjNCIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczRoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDY3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdDMDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0U0MDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2Mzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDc1MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSA3QzAwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDdFNDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2hoLnM6IGg4MzAwaCBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2hoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNUMwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA1QTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDU5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNUUwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA1RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNUYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2NvbXBhcmUge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tcGFyZWguczogaDgzMDBoIGNvbXBhcmUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21wYXJlaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgQTgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFDMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTIwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMUY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2RlY2ltYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGVjaW1hbGguczogaDgzMDBoIGRlY2ltYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZWNpbWFsaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfaW5jZGVjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImluY2RlY2guczogaDgzMDBoIGluY2RlYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImluY2RlY2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDFBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxQjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMUJEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDFCNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxQkYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMEEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDBCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAwQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMEI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDBCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2Rpdm11bCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkaXZtdWxoLnM6IGg4MzAwaCBkaXZtdWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkaXZtdWxoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAxRDA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDFEMDUzMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxQzA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDFDMDUyMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfbWlzYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtaXNjaC5zOiBoODMwMGggbWlzYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1pc2NoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3QjVDNTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDdCRDQ1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDAzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTQwNjkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxNDA2RjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMDE0MDZEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCAwMTQwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMDE0MDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNTY3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDU0NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgMDIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDAxNDA2OTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgMDE0MDZGODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ2IDAxNDA3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAwMTQwNkQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDAxNDA2QjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YSAwMTQwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldHVwX3hmYWlsICJoODMwMCotKi0qIgotICAgIGZhaWwgImg4MzAwaCBtb3ZmcGUvbW92dHBlIHRlc3RzIgotfQotCi1wcm9jIGRvX2g4MzAwaF9tb3ZiIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmJoLnM6IGg4MzAwaCBtb3ZiIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92YmgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBDODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiBGODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNjgxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZFMTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNzgxMDZBMjhcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2QzE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDZBMDgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkEyODAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDY4OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2RTk4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDc4MTA2QUE4XFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgNkM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA2QTg4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDZBQTgwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX21vdncge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92d2guczogaDgzMDBoIG1vdncgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Z3aC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDc5MDAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDZGMTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNzgxMDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNkIwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZGOTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNzgxMDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNkI4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9tb3ZsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmxoLnM6IGg4MzAwaCBtb3ZsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92bGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QTAwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEwMDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTAwNkYxMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMDEwMDc4MTBcW15cblxdKlxuICtcWzAtOVxdKyArNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDAxMDA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMDEwMDZCMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxMDA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMDEwMDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAwMTAwNkY5MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMDEwMDc4OTBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDAxMDA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMDEwMDZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDAxMDA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9wdXNocG9wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInB1c2hwb3BoLnM6IGg4MzAwaCBwdXNocG9wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVzaHBvcGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDZENzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwMTAwNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9yb3RhdGVfc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAicm90c2hoLnM6IGg4MzAwaCByb3RhdGUgYW5kIHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicm90c2hoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxMjg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDEyQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxMzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDEzQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAxMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDEyMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAxMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMTMxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDEzMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAxMDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgMTA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDEwQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSAxMTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMTE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDExQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCAxMDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMTAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDEwMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAxMTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgMTExMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDExMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2V4dGVuZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRlbmRoLnM6IGg4MzAwaCBleHRlbmQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRlbmRoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxN0QwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTdGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDE3NTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxNzcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2FkZF9zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkc3Vicy5zOiBoODMwMHMgYWRkL3N1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZHN1YnMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDg5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwODE5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzkxMTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwOTEyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0ExMTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDBBOTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMEI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDBCOTZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAwRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgOTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDE4ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3OTMxMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDE5MDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3QTMxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMUE5MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDFCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMUI5NlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDFFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCBCMjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbHMuczogaDgzMDBzIGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2Fscy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgRTkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE2OTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTYxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTYxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDFGMDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwNjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMDE0MTA2MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSBDODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTQ5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc5NDEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNjQxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdBNDEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwMUYwNjQxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDA0MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAwMTQxMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgRDgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDE1ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCA3OTUxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzZSA3QTUxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgMDFGMDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCAwNTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgMDE0MTA1MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSAxNzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgMTc5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDE3QjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCAxNzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTYgMTcxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDE3MzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAzMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfY2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjYnJhbmNocy5zOiBoODMwMHMgY29uZGl0aW9uYWwgYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY2JyYW5jaHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA0MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNDMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA0NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDQ4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA0OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgNEEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDRCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA0QzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNEQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDRFMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA0RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNTgwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyA1ODAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDU4MTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNTgxMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCA1ODIwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDU4MzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNTg0MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCA1ODQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDU4NTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgNTg1MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCA1ODYwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDU4NzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNTg4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YyA1ODkwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYwIDU4QTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjQgNThCMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2OCA1OEMwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZjIDU4RDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzAgNThFMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3NCA1OEYwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDQwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotcHJvYyBkb19oODMwMHNfYml0b3BzMSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMxcy5zOiBoODMwMHMgYml0b3BzIHRlc3RzICMxIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMXMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc2MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzYwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc2MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDcyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RDAwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDdGNDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzIwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDcyMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDYyOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA3RDAwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdGNDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjI5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYyOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDc2ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSA3QzAwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDdFNDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzY4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc2ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYwIDc3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MiA3QzAwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY2IDdFNDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmEgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzc4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc3ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDI1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19iaXRvcHMyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczJzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMycy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQ4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NDgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzQ4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNjc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2NzgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjc4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA3NTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgN0MwMDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA3RTQwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc1ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NTgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA3NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgN0MwMDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSA3RTQwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc3MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfYml0b3BzMyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMzcy5zOiBoODMwMHMgYml0b3BzIHRlc3RzICMzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzM3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDcxMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3RDAwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdGNDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzEwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDcxMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDYxOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RDAwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDdGNDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjE5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYxOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDcwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA3RDAwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdGNDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzAwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDcwMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDYwOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSA3RDAwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDdGNDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjA5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYwOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19iaXRvcHM0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczRzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzQiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHM0cy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NDAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzQwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNjcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2NzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjcwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNzMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDdDMDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0U0MDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3MzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzMwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNjM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDdDMDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgN0U0MDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2MzkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjM5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNzUwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYyIDdDMDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjYgN0U0MDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NTAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzUwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2hzLnM6IGg4MzAwcyBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2hzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNUMwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA1QTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDU5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNUUwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA1RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNUYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2NvbXBhcmUge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tcGFyZXMuczogaDgzMDBzIGNvbXBhcmUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21wYXJlcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgQTgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFDMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTIwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMUY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2RlY2ltYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGVjaW1hbHMuczogaDgzMDBzIGRlY2ltYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZWNpbWFscy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfaW5jZGVjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImluY2RlY3MuczogaDgzMDBzIGluY2RlYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImluY2RlY3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDFBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxQjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMUJEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDFCNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxQkYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMEEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDBCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAwQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMEI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDBCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2Rpdm11bCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkaXZtdWxzLnM6IGg4MzAwcyBkaXZtdWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkaXZtdWxzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAxRDA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDFEMDUzMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxQzA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDFDMDUyMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfbWlzYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtaXNjcy5zOiBoODMwMHMgbWlzYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1pc2NzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3QjVDNTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDdCRDQ1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDAzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTQxMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAzMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwMTQwNjkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDAxNDA2RjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMDE0MDZEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwMTQwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMDE0MDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTQxNjkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDAxNDE2RjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MiAwMTQxNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMDE0MTZEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAwMTQxNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTYgMDE0MTZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1ZSAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNTY3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYyIDU0NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NCAwMTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjYgMDIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY4IDAyMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YSAwMTQwNjk4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZlIDAxNDA2RjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3NCAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwN2UgMDE0MDZEODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA4MiAwMTQwNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwODggMDE0MDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA5MCAwMTQxNjk4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDk0IDAxNDE2RjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA5YSAwMTQxNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwYTQgMDE0MTZEODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDBhOCAwMTQxNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwYWUgMDE0MTZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMzZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLSAgICBzZXR1cF94ZmFpbCAiaDgzMDAqLSotKiIKLSAgICBmYWlsICJoODMwMHMgbW92ZnBlL21vdnRwZSB0ZXN0cyIKLX0KLQotcHJvYyBkb19oODMwMHNfbW92YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Zicy5zOiBoODMwMHMgbW92YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmJzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwQzg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgRjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDY4MThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2RTE4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDc4MTA2QTI4XFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNkMxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDI4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA2QTA4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZBMjgwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA2ODk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkU5ODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA3ODEwNkFBOFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDZDOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAzODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgNkE4ODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA2QUE4MDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19tb3Z3IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdndzLnM6IGg4MzAwcyBtb3Z3IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92d3MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3OTAwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA2RjEwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDc4MTA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNkQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDZCMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2RjkwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDc4MTA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgNkQ5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDZCODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotCi1wcm9jIGRvX2g4MzAwc19tb3ZsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmxzLnM6IGg4MzAwcyBtb3ZsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92bHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QTAwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEwMDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTAwNkYxMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMDEwMDc4MTBcW15cblxdKlxuICtcWzAtOVxdKyArNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDAxMDA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMDEwMDZCMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxMDA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMDEwMDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAwMTAwNkY5MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMDEwMDc4OTBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDAxMDA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMDEwMDZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDAxMDA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19wdXNocG9wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInB1c2hwb3BzLnM6IGg4MzAwcyBwdXNocG9wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVzaHBvcHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDZENzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwMTAwNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19yb3RhdGVfc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAicm90c2hzLnM6IGg4MzAwcyByb3RhdGUgYW5kIHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicm90c2hzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxMjg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTJDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDEyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxMkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTJCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDEyRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAxMzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTNDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDEzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAxM0QwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMTNCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDEzRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAxMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgMTI0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDEyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSAxMjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMTIzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDEyNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCAxMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMTM0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDEzMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAxMzUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgMTMzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDEzNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAxMDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgMTBDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDEwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiAxMEQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMTBCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDEwRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyAxMTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2UgMTFDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDExOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MiAxMUQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgMTFCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ2IDExRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCAxMDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgMTA0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDEwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSAxMDUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgMTAzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDEwNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCAxMTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTYgMTE0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDExMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YSAxMTUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWMgMTEzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVlIDExNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2V4dGVuZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRlbmRzLnM6IGg4MzAwcyBleHRlbmQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRlbmRzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxN0QwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTdGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDE3NTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxNzcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX21hYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtYWNzLnM6IGg4MzAwcyBtYWMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtYWNzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwMUEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDMyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAzMzFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAwMTYwNkQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDAyMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMjMxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX211bHRpcGxlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm11bHRpcGxlcy5zOiBoODMwMHMgbXVsdGlwbGUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtdWx0aXBsZXMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDAxMTA2RDcxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDEyMDZENzJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTMwNkQ3M1xbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxMTA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDEyMDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwMTMwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9tb3YzMmJ1ZyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YzMmJ1Zy5zOiBoODMwMGggbW92MzJidWcgdGVzdCIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJtb3YzMmJ1Zy5zIiAiIiAiUHJvcGVyIHJlbG9jYXRpb24gZm9yIG1vdi5sIChwYXJ0IDEpIl0gdGhlbiB7Ci0gICAgICAgIG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiMDAwMDAwMDJcW15cblxdKjMyXFteXG5cXSpfYS4weDAqODhjYTZjMDBcW15cblxdKlxuIgotCQkJCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCXRpbWVvdXQgCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgaDgzMDAqLSotKl0gdGhlbiB7Ci0gICAgIyBUZXN0IHRoZSBiYXNpYyBoODMwMCBpbnN0cnVjdGlvbiBwYXJzZXIKLSAgICBkb19oODMwMF9hZGRfc3ViCi0gICAgZG9faDgzMDBfbG9naWNhbAotICAgIGRvX2g4MzAwX2NicmFuY2gKLSAgICBkb19oODMwMF9iaXRvcHMxCi0gICAgZG9faDgzMDBfYml0b3BzMgotICAgIGRvX2g4MzAwX2JpdG9wczMKLSAgICBkb19oODMwMF9iaXRvcHM0Ci0gICAgZG9faDgzMDBfYnJhbmNoCi0gICAgZG9faDgzMDBfY29tcGFyZQotICAgIGRvX2g4MzAwX2RlY2ltYWwKLSAgICBkb19oODMwMF9pbmNkZWMKLSAgICBkb19oODMwMF9kaXZtdWwKLSAgICBkb19oODMwMF9taXNjCi0gICAgZG9faDgzMDBfbW92YgotICAgIGRvX2g4MzAwX21vdncKLSAgICBkb19oODMwMF9wdXNocG9wCi0gICAgZG9faDgzMDBfcm90YXRlX3NoaWZ0Ci0KLSAgICAjIE5vdyB0ZXN0IHRoZSBoODMwMGggaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICAgZG9faDgzMDBoX2FkZF9zdWIKLSAgICBkb19oODMwMGhfbG9naWNhbAotICAgIGRvX2g4MzAwaF9jYnJhbmNoCi0gICAgZG9faDgzMDBoX2JpdG9wczEKLSAgICBkb19oODMwMGhfYml0b3BzMgotICAgIGRvX2g4MzAwaF9iaXRvcHMzCi0gICAgZG9faDgzMDBoX2JpdG9wczQKLSAgICBkb19oODMwMGhfYnJhbmNoCi0gICAgZG9faDgzMDBoX2NvbXBhcmUKLSAgICBkb19oODMwMGhfZGVjaW1hbAotICAgIGRvX2g4MzAwaF9pbmNkZWMKLSAgICBkb19oODMwMGhfZGl2bXVsCi0gICAgZG9faDgzMDBoX21pc2MKLSAgICBkb19oODMwMGhfbW92YgotICAgIGRvX2g4MzAwaF9tb3Z3Ci0gICAgZG9faDgzMDBoX21vdmwKLSAgICBkb19oODMwMF9wdXNocG9wCi0gICAgZG9faDgzMDBoX3JvdGF0ZV9zaGlmdAotICAgIGRvX2g4MzAwaF9leHRlbmQKLQotICAgICMgTm93IHRlc3QgdGhlIGg4MzAwcyBpbnN0cnVjdGlvbiBwYXJzZXIKLSAgICBkb19oODMwMHNfYWRkX3N1YgotICAgIGRvX2g4MzAwc19sb2dpY2FsCi0gICAgZG9faDgzMDBzX2NicmFuY2gKLSAgICBkb19oODMwMHNfYml0b3BzMQotICAgIGRvX2g4MzAwc19iaXRvcHMyCi0gICAgZG9faDgzMDBzX2JpdG9wczMKLSAgICBkb19oODMwMHNfYml0b3BzNAotICAgIGRvX2g4MzAwc19icmFuY2gKLSAgICBkb19oODMwMHNfY29tcGFyZQotICAgIGRvX2g4MzAwc19kZWNpbWFsCi0gICAgZG9faDgzMDBzX2luY2RlYwotICAgIGRvX2g4MzAwc19kaXZtdWwKLSAgICBkb19oODMwMHNfbWlzYwotICAgIGRvX2g4MzAwc19tb3ZiCi0gICAgZG9faDgzMDBzX21vdncKLSAgICBkb19oODMwMHNfbW92bAotICAgIGRvX2g4MzAwX3B1c2hwb3AKLSAgICBkb19oODMwMHNfcm90YXRlX3NoaWZ0Ci0gICAgZG9faDgzMDBzX2V4dGVuZAotICAgIGRvX2g4MzAwc19tYWMKLSAgICBkb19oODMwMHNfbXVsdGlwbGUKLQotICAgIGRvX2g4MzAwaF9tb3YzMmJ1ZwotCi0gICAgIyBOb3cgc29tZSByYW5kb20gdGVzdHMKLSAgICBzZXQgc3ZyNHBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVsZipdIHx8IFtpc3RhcmdldCAqLSotaXJpeDUqXSBdCi0gICAgc2V0IGVtcGljIFtleHByIFtpc3RhcmdldCAqLSotZWNvZmYqXSB8fCBbaXN0YXJnZXQgKi0qLXVsdHJpeCpdIHx8IFtpc3RhcmdldCAqLSotaXJpeFxbMS00XF0qXSBdCi0gICAgc2V0IGFvdXQgW2V4cHIgW2lzdGFyZ2V0ICotKi1ic2QqXSB8fCBbaXN0YXJnZXQgKi0qLW5ldGJzZCpdXQotCi0gICAgcnVuX2R1bXBfdGVzdCAiZmZ4eDEiCi0gICAgZ2FzX3Rlc3QgImNtcHNpMi5zIiAiIiAiIiAiY21wc2kyLnMiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE4ODI3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX2luY2RlYzoKLQlkZWMgcjBsCi0JaW5jIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOTNmYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2luY2RlYzoKLQlkZWMuYiByMGwKLQlkZWMudyAjMSxyMAotCWRlYy53ICMyLHIwCi0JZGVjLmwgIzEsZXIwCi0JZGVjLmwgIzIsZXIwCi0JaW5jLmIgcjBsCi0JaW5jLncgIzEscjAKLQlpbmMudyAjMixyMAotCWluYy5sICMxLGVyMAotCWluYy5sICMyLGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDU3MDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2luY2RlYzoKLQlkZWMuYiByMGwKLQlkZWMudyAjMSxyMAotCWRlYy53ICMyLHIwCi0JZGVjLmwgIzEsZXIwCi0JZGVjLmwgIzIsZXIwCi0JaW5jLmIgcjBsCi0JaW5jLncgIzEscjAKLQlpbmMudyAjMixyMAotCWluYy5sICMxLGVyMAotCWluYy5sICMyLGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmN2UzYjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9sb2dpY2FsOgotCWFuZCAjMTYscjFsCi0JYW5kIHIxbCxyMWgKLQlhbmRjICMxNixjY3IKLQlvciAjMTYscjBsCi0Jb3IgcjFsLHIwbAotCW9yYyAjMTYsY2NyCi0JeG9yICMxNixyMGwKLQl4b3IgcjBsLHIxbAotCXhvcmMgIzE2LGNjcgotCW5lZyByMGwKLQlub3QgcjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTk1ZjExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbG9naWNhbDoKLQlhbmQuYiAjMTYscjFsCi0JYW5kLmIgcjFsLHIxaAotCWFuZC53ICMzMixyMQotCWFuZC53IHIxLHIxCi0JYW5kLmwgIzY0LGVyMQotCWFuZC5sIGVyMSxlcjEKLQlhbmRjICMxNixjY3IKLQlvci5iICMxNixyMGwKLQlvci5iIHIxbCxyMGwKLQlvci53ICMzMixyMQotCW9yLncgcjEscjEKLQlvci5sICM2NCxlcjEKLQlvci5sIGVyMSxlcjEKLQlvcmMgIzE2LGNjcgotCXhvci5iICMxNixyMGwKLQl4b3IuYiByMGwscjFsCi0JeG9yLncgIzMyLHIxCi0JeG9yLncgcjEscjEKLQl4b3IubCAjNjQsZXIxCi0JeG9yLmwgZXIxLGVyMQotCXhvcmMgIzE2LGNjcgotCW5lZy5iIHIwbAotCW5lZy53IHIwCi0JbmVnLmwgZXIwCi0Jbm90LmIgcjBsCi0Jbm90LncgcjAKLQlub3QubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzRjYmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbHMucworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19sb2dpY2FsOgotCWFuZC5iICMxNixyMWwKLQlhbmQuYiByMWwscjFoCi0JYW5kLncgIzMyLHIxCi0JYW5kLncgcjEscjEKLQlhbmQubCAjNjQsZXIxCi0JYW5kLmwgZXIxLGVyMQotCWFuZGMgIzE2LGNjcgotCWFuZGMgIzE2LGV4cgotCW9yLmIgIzE2LHIwbAotCW9yLmIgcjFsLHIwbAotCW9yLncgIzMyLHIxCi0Jb3IudyByMSxyMQotCW9yLmwgIzY0LGVyMQotCW9yLmwgZXIxLGVyMQotCW9yYyAjMTYsY2NyCi0Jb3JjICMxNixleHIKLQl4b3IuYiAjMTYscjBsCi0JeG9yLmIgcjBsLHIxbAotCXhvci53ICMzMixyMQotCXhvci53IHIxLHIxCi0JeG9yLmwgIzY0LGVyMQotCXhvci5sIGVyMSxlcjEKLQl4b3JjICMxNixjY3IKLQl4b3JjICMxNixleHIKLQluZWcuYiByMGwKLQluZWcudyByMAotCW5lZy5sIGVyMAotCW5vdC5iIHIwbAotCW5vdC53IHIwCi0Jbm90LmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21hY3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21hY3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkZjZkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tYWNzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbWFjOgotCWNscm1hYwotCWxkbWFjIGVyMCxtYWNoCi0JbGRtYWMgZXIxLG1hY2wKLQltYWMgQGVyMCssQGVyMSsKLQlzdG1hYyBtYWNoLGVyMAotCXN0bWFjIG1hY2wsZXIxCi0JCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2ZjgwOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLWg4MzAwX21pc2M6Ci0JZWVwbW92Ci0JbGRjICMwLGNjcgotCWxkYyByMGwsY2NyCi07CW1vdmZwZSAxNjoxNixyMGwKLTsJbW92dHBlIHIwbCwxNjoxNgotCW5vcAotCXJ0ZQotCXJ0cwotCXNsZWVwCi0Jc3RjIGNjcixyMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZWNiM2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY2gucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9taXNjOgotCWVlcG1vdi5iCi0gCWVlcG1vdi53Ci0JbGRjLmIgIzAsY2NyCi0JbGRjLmIgcjBsLGNjcgotCWxkYy53IEBlcjAsY2NyCi0JbGRjLncgQCgxNjoxNixlcjApLGNjcgotCWxkYy53IEAoMzI6MjQsZXIwKSxjY3IKLQlsZGMudyBAZXIwKyxjY3IKLQlsZGMudyBAaDgzMDBoX21pc2M6MTYsY2NyCi0JbGRjLncgQGg4MzAwaF9taXNjOjI0LGNjcgotOwltb3ZmcGUgMTY6MTYscjBsCi07CW1vdnRwZSByMGwsMTY6MTYKLQlub3AKLQlydGUKLQlydHMKLQlzbGVlcAotCXN0Yy5iIGNjcixyMGwKLQlzdGMudyBjY3IsQGVyMAotCXN0Yy53IGNjcixAKDE2OjE2LGVyMCkKLQlzdGMudyBjY3IsQCgzMjoyNCxlcjApCi0Jc3RjLncgY2NyLEAtZXIwCi0Jc3RjLncgY2NyLEBoODMwMGhfbWlzYzoxNgotCXN0Yy53IGNjcixAaDgzMDBoX21pc2M6MjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzN2ExNzcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY3MucworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19taXNjOgotCWVlcG1vdi5iCi0gCWVlcG1vdi53Ci0JbGRjLmIgIzAsY2NyCi0JbGRjLmIgcjBsLGNjcgotCWxkYy5iICMwLGV4cgotCWxkYy5iIHIwbCxleHIKLQlsZGMudyBAZXIwLGNjcgotCWxkYy53IEAoMTY6MTYsZXIwKSxjY3IKLQlsZGMudyBAKDMyOjMyLGVyMCksY2NyCi0JbGRjLncgQGVyMCssY2NyCi0JbGRjLncgQGg4MzAwc19taXNjOjE2LGNjcgotCWxkYy53IEBoODMwMHNfbWlzYzozMixjY3IKLQlsZGMudyBAZXIwLGV4cgotCWxkYy53IEAoMTY6MTYsZXIwKSxleHIKLQlsZGMudyBAKDMyOjMyLGVyMCksZXhyCi0JbGRjLncgQGVyMCssZXhyCi0JbGRjLncgQGg4MzAwc19taXNjOjE2LGV4cgotCWxkYy53IEBoODMwMHNfbWlzYzozMixleHIKLTsJbW92ZnBlIDE2OjE2LHIwbAotOwltb3Z0cGUgcjBsLDE2OjE2Ci0Jbm9wCi0JcnRlCi0JcnRzCi0Jc2xlZXAKLQlzdGMuYiBjY3IscjBsCi0Jc3RjLmIgZXhyLHIwbAotCXN0Yy53IGNjcixAZXIwCi0Jc3RjLncgY2NyLEAoMTY6MTYsZXIwKQotCXN0Yy53IGNjcixAKDMyOjMyLGVyMCkKLQlzdGMudyBjY3IsQC1lcjAKLQlzdGMudyBjY3IsQGg4MzAwc19taXNjOjE2Ci0Jc3RjLncgY2NyLEBoODMwMHNfbWlzYzozMgotCXN0Yy53IGV4cixAZXIwCi0Jc3RjLncgZXhyLEAoMTY6MTYsZXIwKQotCXN0Yy53IGV4cixAKDMyOjMyLGVyMCkKLQlzdGMudyBleHIsQC1lcjAKLQlzdGMudyBleHIsQGg4MzAwc19taXNjOjE2Ci0Jc3RjLncgZXhyLEBoODMwMHNfbWlzYzozMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92MzJidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdjMyYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzkzZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92MzJidWcucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS5oODMwMGgKLQkuZ2xvYmFsIF9hCi1ibGFoOgotCW1vdi5sICAgI19hLTIwMDAwMDAwMDAsZXIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDQwYzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9tb3ZiOgotCW1vdi5iIHIwbCxyMWwKLQltb3YuYiAjMTYscjBsCi0JbW92LmIgQHIxLHIwbAotCW1vdi5iIEAoMTY6MTYscjEpLHIwbAotCW1vdi5iIEByMSsscjBsCi0JbW92LmIgQDE2OjgscjBsCi0JbW92LmIgQGg4MzAwX21vdmI6MTYscjBsCi0JbW92LmIgcjBsLEByMQotCW1vdi5iIHIwbCxAKDE2OjE2LHIxKQotCW1vdi5iIHIwbCxALXIxCi0JbW92LmIgcjBsLEAxNjo4Ci0JbW92LmIgcjBsLEBoODMwMF9tb3ZiOjE2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDcxMWY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbW92YjoKLQltb3YuYiByMGwscjFsCi0JbW92LmIgIzE2LHIwbAotCW1vdi5iIEBlcjEscjBsCi0JbW92LmIgQCgxNjoxNixlcjEpLHIwbAotCW1vdi5iIEAoMzI6MjQsZXIxKSxyMGwKLQltb3YuYiBAZXIxKyxyMGwKLQltb3YuYiBAMTY6OCxyMGwKLQltb3YuYiBAaDgzMDBoX21vdmI6MTYscjBsCi0JbW92LmIgQGg4MzAwaF9tb3ZiOjI0LHIwbAotCW1vdi5iIHIwbCxAZXIxCi0JbW92LmIgcjBsLEAoMTY6MTYsZXIxKQotCW1vdi5iIHIwbCxAKDMyOjI0LGVyMSkKLQltb3YuYiByMGwsQC1lcjEKLQltb3YuYiByMGwsQDE2OjgKLQltb3YuYiByMGwsQGg4MzAwaF9tb3ZiOjE2Ci0JbW92LmIgcjBsLEBoODMwMGhfbW92YjoyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zicy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1MDAyYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zicy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21vdmI6Ci0JbW92LmIgcjBsLHIxbAotCW1vdi5iICMxNixyMGwKLQltb3YuYiBAZXIxLHIwbAotCW1vdi5iIEAoMTY6MTYsZXIxKSxyMGwKLQltb3YuYiBAKDMyOjMyLGVyMSkscjBsCi0JbW92LmIgQGVyMSsscjBsCi0JbW92LmIgQDE2OjgscjBsCi0JbW92LmIgQGg4MzAwc19tb3ZiOjE2LHIwbAotCW1vdi5iIEBoODMwMHNfbW92YjozMixyMGwKLQltb3YuYiByMGwsQGVyMQotCW1vdi5iIHIwbCxAKDE2OjE2LGVyMSkKLQltb3YuYiByMGwsQCgzMjozMixlcjEpCi0JbW92LmIgcjBsLEAtZXIxCi0JbW92LmIgcjBsLEAxNjo4Ci0JbW92LmIgcjBsLEBoODMwMHNfbW92YjoxNgotCW1vdi5iIHIwbCxAaDgzMDBzX21vdmI6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzc4ZTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bGgucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9tb3ZsOgotCW1vdi5sIGVyMCxlcjEKLQltb3YubCAjNjQsZXIwCi0JbW92LmwgQGVyMSxlcjAKLQltb3YubCBAKDE2OjE2LGVyMSksZXIwCi0JbW92LmwgQCgzMjoyNCxlcjEpLGVyMAotCW1vdi5sIEBlcjErLGVyMAotCW1vdi5sIEBoODMwMGhfbW92bDoxNixlcjAKLQltb3YubCBAaDgzMDBoX21vdmw6MjQsZXIwCi0JbW92LmwgZXIwLEBlcjEKLQltb3YubCBlcjAsQCgxNjoxNixlcjEpCi0JbW92LmwgZXIwLEAoMzI6MjQsZXIxKQotCW1vdi5sIGVyMCxALWVyMQotCW1vdi5sIGVyMCxAaDgzMDBoX21vdmw6MTYKLQltb3YubCBlcjAsQGg4MzAwaF9tb3ZsOjI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zscy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQzNzY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbW92bDoKLQltb3YubCBlcjAsZXIxCi0JbW92LmwgIzY0LGVyMAotCW1vdi5sIEBlcjEsZXIwCi0JbW92LmwgQCgxNjoxNixlcjEpLGVyMAotCW1vdi5sIEAoMzI6MzIsZXIxKSxlcjAKLQltb3YubCBAZXIxKyxlcjAKLQltb3YubCBAaDgzMDBzX21vdmw6MTYsZXIwCi0JbW92LmwgQGg4MzAwc19tb3ZsOjMyLGVyMAotCW1vdi5sIGVyMCxAZXIxCi0JbW92LmwgZXIwLEAoMTY6MTYsZXIxKQotCW1vdi5sIGVyMCxAKDMyOjMyLGVyMSkKLQltb3YubCBlcjAsQC1lcjEKLQltb3YubCBlcjAsQGg4MzAwc19tb3ZsOjE2Ci0JbW92LmwgZXIwLEBoODMwMHNfbW92bDozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzY0ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92dy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9tb3Z3OgotCW1vdi53IHIwLHIxCi0JbW92LncgIzE2LHIwCi0JbW92LncgQHIxLHIwCi0JbW92LncgQCgxNjoxNixyMSkscjAKLQltb3YudyBAcjErLHIwCi0JbW92LncgQGg4MzAwX21vdnc6MTYscjAKLQltb3YudyByMCxAcjEKLQltb3YudyByMCxAKDE2OjE2LHIxKQotCW1vdi53IHIwLEAtcjEKLQltb3YudyByMCxAaDgzMDBfbW92dzoxNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1MDU3Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3aC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX21vdnc6Ci0JbW92LncgcjAscjEKLQltb3YudyAjMTYscjAKLQltb3YudyBAZXIxLHIwCi0JbW92LncgQCgxNjoxNixlcjEpLHIwCi0JbW92LncgQCgzMjoyNCxlcjEpLHIwCi0JbW92LncgQGVyMSsscjAKLQltb3YudyBAaDgzMDBoX21vdnc6MTYscjAKLQltb3YudyBAaDgzMDBoX21vdnc6MjQscjAKLQltb3YudyByMCxAZXIxCi0JbW92LncgcjAsQCgxNjoxNixlcjEpCi0JbW92LncgcjAsQCgzMjoyNCxlcjEpCi0JbW92LncgcjAsQC1lcjEKLQltb3YudyByMCxAaDgzMDBoX21vdnc6MTYKLQltb3YudyByMCxAaDgzMDBoX21vdnc6MjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjIxZGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d3MucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tb3Z3OgotCW1vdi53IHIwLHIxCi0JbW92LncgIzE2LHIwCi0JbW92LncgQGVyMSxyMAotCW1vdi53IEAoMTY6MTYsZXIxKSxyMAotCW1vdi53IEAoMzI6MzIsZXIxKSxyMAotCW1vdi53IEBlcjErLHIwCi0JbW92LncgQGg4MzAwc19tb3Z3OjE2LHIwCi0JbW92LncgQGg4MzAwc19tb3Z3OjMyLHIwCi0JbW92LncgcjAsQGVyMQotCW1vdi53IHIwLEAoMTY6MTYsZXIxKQotCW1vdi53IHIwLEAoMzI6MzIsZXIxKQotCW1vdi53IHIwLEAtZXIxCi0JbW92LncgcjAsQGg4MzAwc19tb3Z3OjE2Ci0JbW92LncgcjAsQGg4MzAwc19tb3Z3OjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL211bHRpcGxlcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbXVsdGlwbGVzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDc5YjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbXVsdGlwbGVzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbXVsdGlwbGU6Ci0JbGRtLmwgQHNwKyxlcjAtZXIxCi0JbGRtLmwgQHNwKyxlcjAtZXIyCi0JbGRtLmwgQHNwKyxlcjAtZXIzCi0Jc3RtLmwgZXIwLWVyMSxALXNwCi0Jc3RtLmwgZXIwLWVyMixALXNwCi0Jc3RtLmwgZXIwLWVyMyxALXNwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3AucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3AucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxYjczNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfcHVzaF9wb3A6Ci0JcG9wIHIwCi0JcHVzaCByMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9waC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0OTYzOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9waC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfcHVzaF9wb3A6Ci0JcG9wLncgcjAKLQlwb3AubCBlcjAKLQlwdXNoLncgcjAKLQlwdXNoLmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDFkZjA0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19wdXNoX3BvcDoKLQlwb3AudyByMAotCXBvcC5sIGVyMAotCXB1c2gudyByMAotCXB1c2gubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YWE4N2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2gucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkudGV4dAotaDgzMDBfcm90YXRlX3NoaWZ0OgotCXJvdGwgcjBsCi0Jcm90ciByMGwKLQlyb3R4bCByMGwKLQlyb3R4ciByMGwKLQlzaGFsIHIwbAotCXNoYXIgcjBsCi0Jc2hsbCByMGwKLQlzaGxyIHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2FiZTQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX3JvdGF0ZV9zaGlmdDoKLQlyb3RsLmIgcjBsCi0Jcm90bC53IHIwCi0Jcm90bC5sIGVyMAotCXJvdHIuYiByMGwKLQlyb3RyLncgcjAKLQlyb3RyLmwgZXIwCi0Jcm90eGwuYiByMGwKLQlyb3R4bC53IHIwCi0Jcm90eGwubCBlcjAKLQlyb3R4ci5iIHIwbAotCXJvdHhyLncgcjAKLQlyb3R4ci5sIGVyMAotCXNoYWwuYiByMGwKLQlzaGFsLncgcjAKLQlzaGFsLmwgZXIwCi0Jc2hhci5iIHIwbAotCXNoYXIudyByMAotCXNoYXIubCBlcjAKLQlzaGxsLmIgcjBsCi0Jc2hsbC53IHIwCi0Jc2hsbC5sIGVyMAotCXNobHIuYiByMGwKLQlzaGxyLncgcjAKLQlzaGxyLmwgZXIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNocy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM0MWNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNocy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX3JvdGF0ZV9zaGlmdDoKLQlyb3RsLmIgcjBsCi0Jcm90bC5iICMyLHIwbAotCXJvdGwudyByMAotCXJvdGwudyAjMixyMAotCXJvdGwubCBlcjAKLQlyb3RsLmwgIzIsZXIwCi0Jcm90ci5iIHIwbAotCXJvdHIuYiAjMixyMGwKLQlyb3RyLncgcjAKLQlyb3RyLncgIzIscjAKLQlyb3RyLmwgZXIwCi0Jcm90ci5sICMyLGVyMAotCXJvdHhsLmIgcjBsCi0Jcm90eGwuYiAjMixyMGwKLQlyb3R4bC53IHIwCi0Jcm90eGwudyAjMixyMAotCXJvdHhsLmwgZXIwCi0Jcm90eGwubCAjMixlcjAKLQlyb3R4ci5iIHIwbAotCXJvdHhyLmIgIzIscjBsCi0Jcm90eHIudyByMAotCXJvdHhyLncgIzIscjAKLQlyb3R4ci5sIGVyMAotCXJvdHhyLmwgIzIsZXIwCi0Jc2hhbC5iIHIwbAotCXNoYWwuYiAjMixyMGwKLQlzaGFsLncgcjAKLQlzaGFsLncgIzIscjAKLQlzaGFsLmwgZXIwCi0Jc2hhbC5sICMyLGVyMAotCXNoYXIuYiByMGwKLQlzaGFyLmIgIzIscjBsCi0Jc2hhci53IHIwCi0Jc2hhci53ICMyLHIwCi0Jc2hhci5sIGVyMAotCXNoYXIubCAjMixlcjAKLQlzaGxsLmIgcjBsCi0Jc2hsbC5iICMyLHIwbAotCXNobGwudyByMAotCXNobGwudyAjMixyMAotCXNobGwubCBlcjAKLQlzaGxsLmwgIzIsZXIwCi0Jc2hsci5iIHIwbAotCXNobHIuYiAjMixyMGwKLQlzaGxyLncgcjAKLQlzaGxyLncgIzIscjAKLQlzaGxyLmwgZXIwCi0Jc2hsci5sICMyLGVyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9SRUFETUUgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiMTc0YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLU5vdGVzIG9uIGhvdyB0aGUgSFBQQSB0ZXN0c3VpdGUgaXMgb3JnYW5pemVkOgotCi1iYXNpYy5wYXJzZSAtLSB0aGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2luZwotdGVzdHMgYW5kIGEgc2ltcGxlIC5zdGFiIHBhcnNpbmcgdGVzdC4gIFRoaXMgd291bGQgYmUgd2hlcmUgeW91J2QKLWFkZCBjb2RlIHRvIG1ha2Ugc3VyZSBuZXcgaW5zdHJ1Y3Rpb25zIGFyZSBwYXJzZWQgY29ycmVjdGx5LCBuZXcKLWNvbXBsZXRlcnMgKHN1Y2ggYXMgY2FjaGUgaGl0cykgYXJlIHBhcnNlZCBjb3JyZWN0bHksIGV0Yy4KLQotSXQncyBhbHNvIGEgcmVhc29uYWJsZSBwbGFjZSB0byBtYWtlIHN1cmUgcGFyc2luZyBvZiB0aGUgdmFyaW91cwotYXNzZW1ibGVyIGRpcmVjdGl2ZXMgaXMgaGFuZGxlZCBjb3JyZWN0bHkuICBJZiB5b3UncmUgZ29pbmcgdG8gYWRkCi1zdWNoIGNvZGUsIHRyeSB0byBiZSByZWFzb25hYmx5IGNvbXBsZXRlLiAgQWRkIHRlc3QgY29kZSBmb3IgZWFjaAotYmFzaWMgZGlyZWN0aXZlIGFuZCB0ZXN0IGFsbCAob3IgYSBub3Rld29ydGh5KSBzdWJzZXQgb2YgYXJndW1lbnRzLgotCi1JdCBzaG91bGQgb25seSBiZSBuZWNlc3NhcnkgdG8gaGF2ZSBhbiBhc3NlbWJsZXIgdG8gcnVuIHRoZXNlIHRlc3RzOwotY2FsbGluZyBvYmpkdW1wX3N0YXJ0IG9yIHNvbWV0aGluZyBzaW1pbGFyIHNob3VsZCBub3QgYmUgZG9uZSBmcm9tCi10aGlzIGRpcmVjdG9yeS4KLQotCi1tb3JlLnBhcnNlIC0tIHRoaXMgaXMgd2hlcmUgeW91IHNob3VsZCBwdXQgYWRkaXRpb25hbCBwYXJzaW5nIHRlc3RzLCBzdWNoCi1hcyB0ZXN0cyB0byBjaGVjayBtb2RlIHNlbGVjdG9yIHBhcnNpbmcsIHN0cmluZyBwYXJzaW5nLCBleHByZXNzaW9uIHBhcnNpbmcsCi1ldGMuICBJdCdzIGFsc28gYSByZWFzb25hYmxlIHBsYWNlIHRvIHB1dCBwYXJzaW5nIHRlc3RzIHdoaWNoIGFyZSBub3QgY29tcGxldGUKLWVub3VnaCAod2hhdGV2ZXIgdGhhdCBtZWFucykgZm9yIGJhc2ljLnBhcnNlLiAgCi0KLUl0IHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSB0byBoYXZlIGFuIGFzc2VtYmxlciB0byBydW4gdGhlc2UgdGVzdHM7Ci1jYWxsaW5nIG9iamR1bXBfc3RhcnQgb3Igc29tZXRoaW5nIHNpbWlsYXIgc2hvdWxkIG5vdCBiZSBkb25lIGZyb20KLXRoaXMgZGlyZWN0b3J5LgotCi0KLXJlbG9jIC0tIHRoaXMgaXMgd2hlcmUgeW91IHRlc3RzIHdoaWNoIGV4YW1pbmUgcmVsb2NhdGlvbnMgcHJvZHVjZWQKLWJ5IEdBUyBiZWxvbmcuICBUbyBydW4gdGhlc2UgdGVzdHMgeW91IG11c3QgaGF2ZSBhIGZ1bmN0aW9uaW5nIG9iamR1bXAuCi0KLQotdW5zb3J0ZWQgLS0gdGhpcyBpcyB3aGVyZSBldmVyeXRoaW5nIGVsc2UgZ29lcy4gIEFzIGdyb3VwcyBvZiByZWxhdGVkIHRlc3RzCi1lbmQgdXAgaW4gdGhpcyBkaXJlY3RvcnksIHRoZXkgc2hvdWxkIGJlIGJyb2tlbiBvdXQgaW50byBhIG5ldyBjbGFzcyBvZgotdGVzdHMuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3ZjIzYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGFkZC9zaD9hZGQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWFkZCAgJXI0LCVyNSwlcjYKLQlhZGQsPSAgJXI0LCVyNSwlcjYKLQlhZGQsPCAgJXI0LCVyNSwlcjYKLQlhZGQsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLG51diAgJXI0LCVyNSwlcjYKLQlhZGQsem52ICAlcjQsJXI1LCVyNgotCWFkZCxzdiAgJXI0LCVyNSwlcjYKLQlhZGQsb2QgICVyNCwlcjUsJXI2Ci0JYWRkLHRyICAlcjQsJXI1LCVyNgotCWFkZCw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsPj0gICVyNCwlcjUsJXI2Ci0JYWRkLD4gICVyNCwlcjUsJXI2Ci0JYWRkLHV2ICAlcjQsJXI1LCVyNgotCWFkZCx2bnogICVyNCwlcjUsJXI2Ci0JYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRsICAlcjQsJXI1LCVyNgotCWFkZGwsPSAgJXI0LCVyNSwlcjYKLQlhZGRsLDwgICVyNCwlcjUsJXI2Ci0JYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRsLHN2ICAlcjQsJXI1LCVyNgotCWFkZGwsb2QgICVyNCwlcjUsJXI2Ci0JYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlhZGRsLDw+ICAlcjQsJXI1LCVyNgotCWFkZGwsPj0gICVyNCwlcjUsJXI2Ci0JYWRkbCw+ICAlcjQsJXI1LCVyNgotCWFkZGwsdXYgICVyNCwlcjUsJXI2Ci0JYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0JYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCWFkZG8gICVyNCwlcjUsJXI2Ci0JYWRkbyw9ICAlcjQsJXI1LCVyNgotCWFkZG8sPCAgJXI0LCVyNSwlcjYKLQlhZGRvLDw9ICAlcjQsJXI1LCVyNgotCWFkZG8sbnV2ICAlcjQsJXI1LCVyNgotCWFkZG8sem52ICAlcjQsJXI1LCVyNgotCWFkZG8sc3YgICVyNCwlcjUsJXI2Ci0JYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlhZGRvLHRyICAlcjQsJXI1LCVyNgotCWFkZG8sPD4gICVyNCwlcjUsJXI2Ci0JYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlhZGRvLD4gICVyNCwlcjUsJXI2Ci0JYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGRvLGV2ICAlcjQsJXI1LCVyNgotCi0JYWRkYyAgJXI0LCVyNSwlcjYKLQlhZGRjLD0gICVyNCwlcjUsJXI2Ci0JYWRkYyw8ICAlcjQsJXI1LCVyNgotCWFkZGMsPD0gICVyNCwlcjUsJXI2Ci0JYWRkYyxudXYgICVyNCwlcjUsJXI2Ci0JYWRkYyx6bnYgICVyNCwlcjUsJXI2Ci0JYWRkYyxzdiAgJXI0LCVyNSwlcjYKLQlhZGRjLG9kICAlcjQsJXI1LCVyNgotCWFkZGMsdHIgICVyNCwlcjUsJXI2Ci0JYWRkYyw8PiAgJXI0LCVyNSwlcjYKLQlhZGRjLD49ICAlcjQsJXI1LCVyNgotCWFkZGMsPiAgJXI0LCVyNSwlcjYKLQlhZGRjLHV2ICAlcjQsJXI1LCVyNgotCWFkZGMsdm56ICAlcjQsJXI1LCVyNgotCWFkZGMsbnN2ICAlcjQsJXI1LCVyNgotCWFkZGMsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRjbyAgJXI0LCVyNSwlcjYKLQlhZGRjbyw9ICAlcjQsJXI1LCVyNgotCWFkZGNvLDwgICVyNCwlcjUsJXI2Ci0JYWRkY28sPD0gICVyNCwlcjUsJXI2Ci0JYWRkY28sbnV2ICAlcjQsJXI1LCVyNgotCWFkZGNvLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxzdiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxvZCAgJXI0LCVyNSwlcjYKLQlhZGRjbyx0ciAgJXI0LCVyNSwlcjYKLQlhZGRjbyw8PiAgJXI0LCVyNSwlcjYKLQlhZGRjbyw+PSAgJXI0LCVyNSwlcjYKLQlhZGRjbyw+ICAlcjQsJXI1LCVyNgotCWFkZGNvLHV2ICAlcjQsJXI1LCVyNgotCWFkZGNvLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkY28sZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGQsbCAgJXI0LCVyNSwlcjYKLQlhZGQsbCw9ICAlcjQsJXI1LCVyNgotCWFkZCxsLDwgICVyNCwlcjUsJXI2Ci0JYWRkLGwsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLGwsbnV2ICAlcjQsJXI1LCVyNgotCWFkZCxsLHpudiAgJXI0LCVyNSwlcjYKLQlhZGQsbCxzdiAgJXI0LCVyNSwlcjYKLQlhZGQsbCxvZCAgJXI0LCVyNSwlcjYKLQlhZGQsbCx0ciAgJXI0LCVyNSwlcjYKLQlhZGQsbCw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsbCw+PSAgJXI0LCVyNSwlcjYKLQlhZGQsbCw+ICAlcjQsJXI1LCVyNgotCWFkZCxsLHV2ICAlcjQsJXI1LCVyNgotCWFkZCxsLHZueiAgJXI0LCVyNSwlcjYKLQlhZGQsbCxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGwsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGQsdHN2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsPSAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LDwgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiw8PSAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LG51diAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LHpudiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LHN2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3Ysb2QgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdix0ciAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LDw+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsPj0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiw+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsdXYgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdix2bnogICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxjICAlcjQsJXI1LCVyNgotCWFkZCxjLD0gICVyNCwlcjUsJXI2Ci0JYWRkLGMsPCAgJXI0LCVyNSwlcjYKLQlhZGQsYyw8PSAgJXI0LCVyNSwlcjYKLQlhZGQsYyxudXYgICVyNCwlcjUsJXI2Ci0JYWRkLGMsem52ICAlcjQsJXI1LCVyNgotCWFkZCxjLHN2ICAlcjQsJXI1LCVyNgotCWFkZCxjLG9kICAlcjQsJXI1LCVyNgotCWFkZCxjLHRyICAlcjQsJXI1LCVyNgotCWFkZCxjLDw+ICAlcjQsJXI1LCVyNgotCWFkZCxjLD49ICAlcjQsJXI1LCVyNgotCWFkZCxjLD4gICVyNCwlcjUsJXI2Ci0JYWRkLGMsdXYgICVyNCwlcjUsJXI2Ci0JYWRkLGMsdm56ICAlcjQsJXI1LCVyNgotCWFkZCxjLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsYyxldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxjLHRzdiAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3YsPSAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3YsPCAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3YsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLGMsdHN2LG51diAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3Ysem52ICAlcjQsJXI1LCVyNgotCWFkZCxjLHRzdixzdiAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3Ysb2QgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLHRyICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsYyw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGMsPj0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLD4gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLHV2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsYyx2bnogICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGMsZXYgICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTBmNTE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkMi5zCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGFkZC9zaD9hZGQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWFkZCwqICAlcjQsJXI1LCVyNgotCWFkZCwqPSAgJXI0LCVyNSwlcjYKLQlhZGQsKjwgICVyNCwlcjUsJXI2Ci0JYWRkLCo8PSAgJXI0LCVyNSwlcjYKLQlhZGQsKm51diAgJXI0LCVyNSwlcjYKLQlhZGQsKnpudiAgJXI0LCVyNSwlcjYKLQlhZGQsKnN2ICAlcjQsJXI1LCVyNgotCWFkZCwqb2QgICVyNCwlcjUsJXI2Ci0JYWRkLCp0ciAgJXI0LCVyNSwlcjYKLQlhZGQsKjw+ICAlcjQsJXI1LCVyNgotCWFkZCwqPj0gICVyNCwlcjUsJXI2Ci0JYWRkLCo+ICAlcjQsJXI1LCVyNgotCWFkZCwqdXYgICVyNCwlcjUsJXI2Ci0JYWRkLCp2bnogICVyNCwlcjUsJXI2Ci0JYWRkLCpuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLCpldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxsLCogICVyNCwlcjUsJXI2Ci0JYWRkLGwsKj0gICVyNCwlcjUsJXI2Ci0JYWRkLGwsKjwgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKjw9ICAlcjQsJXI1LCVyNgotCWFkZCxsLCpudXYgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKnpudiAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKm9kICAlcjQsJXI1LCVyNgotCWFkZCxsLCp0ciAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqPD4gICVyNCwlcjUsJXI2Ci0JYWRkLGwsKj49ICAlcjQsJXI1LCVyNgotCWFkZCxsLCo+ICAlcjQsJXI1LCVyNgotCWFkZCxsLCp1diAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqdm56ICAlcjQsJXI1LCVyNgotCWFkZCxsLCpuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKmV2ICAlcjQsJXI1LCVyNgotCi0JYWRkLHRzdiwqICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKj0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqPCAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCo8PSAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCpudXYgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqem52ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKnN2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKm9kICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKnRyICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKjw+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKj49ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKj4gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqdXYgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqdm56ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKm5zdiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCpldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxkYywqICAlcjQsJXI1LCVyNgotCWFkZCxkYywqPSAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKjwgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCo8PSAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKm51diAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKnpudiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKnN2ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqb2QgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCp0ciAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKjw+ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqPj0gICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCo+ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqdXYgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCp2bnogICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCpuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCpldiAgJXI0LCVyNSwlcjYKLQotCWFkZCxkYyx0c3YsKiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsdHN2LCo9ICAlcjQsJXI1LCVyNgotCWFkZCxkYyx0c3YsKjwgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLHRzdiwqPD0gICVyNCwlcjUsJXI2Ci0JYWRkLGRjLHRzdiwqbnV2ICAlcjQsJXI1LCVyNgotCWFkZCxkYyx0c3YsKnpudiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsdHN2LCpzdiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsdHN2LCpvZCAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCp0ciAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCo8PiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCo+PSAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCo+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsZGMsKnV2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsZGMsKnZueiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCpuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixkYywqZXYgICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDUxNzFjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGFkZCBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWFkZGkgIDEyMywlcjUsJXI2Ci0JYWRkaSw9ICAxMjMsJXI1LCVyNgotCWFkZGksPCAgMTIzLCVyNSwlcjYKLQlhZGRpLDw9ICAxMjMsJXI1LCVyNgotCWFkZGksbnV2ICAxMjMsJXI1LCVyNgotCWFkZGksem52ICAxMjMsJXI1LCVyNgotCWFkZGksc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRyICAxMjMsJXI1LCVyNgotCWFkZGksPD4gIDEyMywlcjUsJXI2Ci0JYWRkaSw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpLD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx1diAgMTIzLCVyNSwlcjYKLQlhZGRpLHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpLG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpLGV2ICAxMjMsJXI1LCVyNgotCi0JYWRkaW8gIDEyMywlcjUsJXI2Ci0JYWRkaW8sPSAgMTIzLCVyNSwlcjYKLQlhZGRpbyw8ICAxMjMsJXI1LCVyNgotCWFkZGlvLDw9ICAxMjMsJXI1LCVyNgotCWFkZGlvLG51diAgMTIzLCVyNSwlcjYKLQlhZGRpbyx6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaW8sc3YgIDEyMywlcjUsJXI2Ci0JYWRkaW8sb2QgIDEyMywlcjUsJXI2Ci0JYWRkaW8sdHIgIDEyMywlcjUsJXI2Ci0JYWRkaW8sPD4gIDEyMywlcjUsJXI2Ci0JYWRkaW8sPj0gIDEyMywlcjUsJXI2Ci0JYWRkaW8sPiAgMTIzLCVyNSwlcjYKLQlhZGRpbyx1diAgMTIzLCVyNSwlcjYKLQlhZGRpbyx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaW8sbnN2ICAxMjMsJXI1LCVyNgotCWFkZGlvLGV2ICAxMjMsJXI1LCVyNgotCi0JYWRkaXQgIDEyMywlcjUsJXI2Ci0JYWRkaXQsPSAgMTIzLCVyNSwlcjYKLQlhZGRpdCw8ICAxMjMsJXI1LCVyNgotCWFkZGl0LDw9ICAxMjMsJXI1LCVyNgotCWFkZGl0LG51diAgMTIzLCVyNSwlcjYKLQlhZGRpdCx6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaXQsc3YgIDEyMywlcjUsJXI2Ci0JYWRkaXQsb2QgIDEyMywlcjUsJXI2Ci0JYWRkaXQsdHIgIDEyMywlcjUsJXI2Ci0JYWRkaXQsPD4gIDEyMywlcjUsJXI2Ci0JYWRkaXQsPj0gIDEyMywlcjUsJXI2Ci0JYWRkaXQsPiAgMTIzLCVyNSwlcjYKLQlhZGRpdCx1diAgMTIzLCVyNSwlcjYKLQlhZGRpdCx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaXQsbnN2ICAxMjMsJXI1LCVyNgotCWFkZGl0LGV2ICAxMjMsJXI1LCVyNgotCi0JYWRkaXRvICAxMjMsJXI1LCVyNgotCWFkZGl0byw9ICAxMjMsJXI1LCVyNgotCWFkZGl0byw8ICAxMjMsJXI1LCVyNgotCWFkZGl0byw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sbnV2ICAxMjMsJXI1LCVyNgotCWFkZGl0byx6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHN2ICAxMjMsJXI1LCVyNgotCWFkZGl0byxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sdHIgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLDw+ICAxMjMsJXI1LCVyNgotCWFkZGl0byw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sdXYgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sbnN2ICAxMjMsJXI1LCVyNgotCWFkZGl0byxldiAgMTIzLCVyNSwlcjYKLQotCWFkZGksdHN2ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LD0gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsPCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdiw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdixudXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3Ysem52ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHN2ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LG9kICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHRyICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LDw+ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LD49ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3Ysdm56ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdixldiAgMTIzLCVyNSwlcjYKLQotCWFkZGksdGMgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyw9ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsPCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLDw9ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsbnV2ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsem52ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSx0YyxvZCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHRyICAxMjMsJXI1LCVyNgotCWFkZGksdGMsPD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx1diAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLGV2ICAxMjMsJXI1LCVyNgotCi0JYWRkaSx0Yyx0c3YgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx0c3YsPSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHRzdiw8ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsdHN2LDw9ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsdHN2LG51diAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHRzdix6bnYgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx0c3Ysc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx0c3Ysb2QgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsdHIgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsPD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsPj0gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsPiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdix0Yyx1diAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdix0Yyx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsbnN2ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHRjLGV2ICAxMjMsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiMDY4NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM4NjQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyaXN0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19pbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImltZW0uczogaW50ZWdlciBtZW1vcnkgbG9hZHMgYW5kIHN0b3JlcyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImltZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA0ODlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMEM4MDEwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDQ0OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwQzgwMTA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDA5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDBDODAxMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyA2ODlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMEM5QTEyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDY0OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwQzlBMTI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgNjA5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDBDOUExMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCA0QzlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgNkM5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDBDODUwMDlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwQzg1MjA5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMEM4NTAwQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDBDODUyMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwQzg1MDA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMEM4NTIwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDBDODUwMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwQzg1MjA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMEM4NTAwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDBDODUyMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwQzg1MDAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMEM4NTIwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDBDODUwMTlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwQzg1MjE5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMEM4NTAxQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDBDODUyMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwQzg1MDFEQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMEM4NTIxREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDBDODUwMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwQzg1MjFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMEM4MDEwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDBDODAzMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwQzgwMTBCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMEM4MDEwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDBDODAzMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwQzgwMTA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMEM4MDEwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDBDODAzMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwQzgwMTAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMEM4MDExOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDBDODAzMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwQzgwMTFCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMEM4MDExREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDBDODAzMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwQzgwMTFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMEM5QTEyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDBDOUEzMkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwQzlBMTJBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMEM5QTEyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDBDOUEzMjYwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwQzlBMTI2MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMEM5QTEyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDBDOUEzMjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwQzlBMTIyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMEM5QTEzODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDBDOUEzM0EwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwQzlBMTNBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMEM5QTEzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDBDOUExMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwQzlBMzMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMEM5QTEzMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDBDOUEzMzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19pbW1lZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbW1lZC5zOiBpbW1lZGlhdGUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJpbW1lZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDM3NUEwMDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyMzRERkJENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjhBREZCRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQgCi0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2guczogYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTg1RjFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEU4NUYxRkVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFODFGMUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRTgxRjFGREZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEU4NUYzRkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBFODVGM0ZDRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRTg0NDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEU4NDQ0MDAyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBFODA0NDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTgwNDQwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEU4NDBDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBFODQwQzAwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRTA0MDQ0NkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEUwNDA0NDZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBFNDQwNDQ2Q1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRTQ0MDQ0NkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIENCNDQxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBDQjQ0M0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggQ0I0NDVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIENCNDQ3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBDQjQ0OUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgQ0I0NEJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IENCNDRERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBDQjQ0RkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgQ0I0NDFGQjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IENCNDQzRkFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBDQjQ0NUZBN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgQ0I0NDdGOUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIENCNDQ5Rjk3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBDQjQ0QkY4RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggQ0I0NERGODdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIENCNDRGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBDRjRBMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgQ0Y0QTNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IENGNEE1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBDRjRBN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgQ0Y0QTlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IENGNEFCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBDRjRBREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgQ0Y0QUZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIENGNEExRkI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBDRjRBM0ZBRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggQ0Y0QTVGQTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIENGNEE3RjlGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBDRjRBOUY5N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgQ0Y0QUJGOEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IENGNEFERjg3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBDRjRBRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgODA4MDFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDgwODAzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCA4MDgwNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgODA4MDdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDgwODA5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCA4MDgwQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggODA4MERGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDgwODBGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCA4ODgwMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgODg4MDNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDg4ODA1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyA4ODgwN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgODg4MDlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDg4ODBCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCA4ODgwREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgODg4MEZGN0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDgwODAxRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCA4MDgwM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggODA4MDVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDgwODA3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCA4MDgwOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgODA4MEJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDgwODBERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyA4MDgwRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgODg4MDFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDg4ODAzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCA4ODgwNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgODg4MDdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDg4ODA5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCA4ODgwQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggODg4MERGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDg4ODBGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCA4NDgwMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgODQ4MDVGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IDg0ODA3RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyA4NDgwOUZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgODQ4MEJGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IDg0ODBERkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCA4NDgwRkZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgOEM4MDFGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIDhDODAzRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCA4QzgwNUZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggOEM4MDdGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIDhDODA5RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCA4QzgwQkY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgOEM4MERGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IDhDODBGRTg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyA4NDgwMUY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODAgODQ4MDNGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg0IDg0ODA1RjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4OCA4NDgwN0Y2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOGMgODQ4MDlGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTkwIDg0ODBCRjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5NCA4NDgwREY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTggODQ4MEZGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTljIDhDODAxRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhMCA4QzgwM0YzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTQgOEM4MDVGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE4IDhDODA3RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhYyA4QzgwOUYxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjAgOEM4MEJGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI0IDhDODBERjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiOCA4QzgwRkYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYmMgQTA4MTFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWMwIEEwODEzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjNCBBMDgxNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzggQTA4MTdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWNjIEEwODE5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkMCBBMDgxQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDQgQTA4MURGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ4IEEwODFGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkYyBBODgxMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTAgQTg4MTNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU0IEE4ODE1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlOCBBODgxN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZWMgQTg4MTlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWYwIEE4ODFCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmNCBBODgxREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjggQTg4MUZGN0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWZjIEEwODExRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwMCBBMDgxM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDQgQTA4MTVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA4IEEwODE3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwYyBBMDgxOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTAgQTA4MUJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE0IEEwODFERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxOCBBMDgxRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMWMgQTg4MTFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjIwIEE4ODEzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyNCBBODgxNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjggQTg4MTdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjJjIEE4ODE5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzMCBBODgxQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzQgQTg4MURGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM4IEE4ODFGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzYyBBNDlGMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDAgQTQ5RjNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQ0IEE0OUY1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0OCBBNDlGN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNGMgQTQ5RjlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjUwIEE0OUZCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1NCBBNDlGREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTggQTQ5RkZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjVjIEFDOUYxRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2MCBBQzlGM0ZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjQgQUM5RjVGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjY4IEFDOUY3RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2YyBBQzlGOUY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzAgQUM5RkJGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjc0IEFDOUZERjg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3OCBBQzlGRkM4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyN2MgQTQ5RjFGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjgwIEE0OUYzRjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4NCBBNDlGNUY2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODggQTQ5RjdGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjhjIEE0OUY5RjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5MCBBNDlGQkY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTQgQTQ5RkRGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjk4IEE0OUZGRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5YyBBQzlGMUYzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTAgQUM5RjNGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmE0IEFDOUY1RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhOCBBQzlGN0YxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYWMgQUM5RjlGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmIwIEFDOUZCRjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiNCBBQzlGREYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjggQUM5RkZFRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmJjIEMwMDQ1RkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjMCBDMDA0REZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYzQgQzAwNDVGRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmM4IEMwMDRERkRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjYyBDNEE0NUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyZDAgQzRBNERGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmQ0IEM0QTQ1RkM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJkOCBDNEE0REZCRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTgzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JyYW5jaDIge30gewotICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoMi5zOiBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2gyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQzAwNDVGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEMwMDRERkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBDMDA0NUZFN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQzAwNERGREZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEMwMDQ3RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBDMDA0RkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQzAwNDdGQzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEMwMDRGRkJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBDNEE0N0ZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgQzRBNEZGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEM0QTQ3RkE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBDNEE0RkY5RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRTgwMDQwMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEU4MDA0MDBEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBFODAwNEY5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRTgwMDQwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEU4MDQ0MDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkLnM6IGFkZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0UwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDQ3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0ODcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEE3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDE3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDc3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEQ3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDJGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDhGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0Q0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEVGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0M0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDVGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEJGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTRERjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0REEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIDA4QTQwRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCAwOEE0MkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggMDhBNDRFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIDA4QTQ2RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCAwOEE0OEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgMDhBNEFFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IDA4QTRDRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyAwOEE0RUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgMDhBNDFFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IDA4QTQzRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCAwOEE0NUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgMDhBNDdFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIDA4QTQ5RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCAwOEE0QkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggMDhBNERFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIDA4QTRGRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMCAwOEE0MDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzQgMDhBNDI3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IDA4QTQ0NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjYyAwOEE0NjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDAgMDhBNDg3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IDA4QTRBNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkOCAwOEE0QzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGMgMDhBNEU3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWUwIDA4QTQxNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlNCAwOEE0MzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTggMDhBNDU3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWVjIDA4QTQ3NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmMCAwOEE0OTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjQgMDhBNEI3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY4IDA4QTRENzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmYyAwOEE0RjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDAgMDhBNDBGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA0IDA4QTQyRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwOCAwOEE0NEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMGMgMDhBNDZGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjEwIDA4QTQ4RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxNCAwOEE0QUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTggMDhBNENGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjFjIDA4QTRFRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyMCAwOEE0MUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjQgMDhBNDNGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI4IDA4QTQ1RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyYyAwOEE0N0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzAgMDhBNDlGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM0IDA4QTRCRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzOCAwOEE0REYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyM2MgMDhBNEZGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE0NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hZGQyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZDIuczogYWRkMiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0EyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwOEE0MDcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDhBNDI3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDA4QTQ0NzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwOEE0NjcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMDhBNDg3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDA4QTRBNzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwOEE0QzcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMDhBNEU3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDA4QTQxNzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwOEE0MzcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMDhBNDU3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDA4QTQ3NzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAwOEE0OTcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMDhBNEI3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDA4QTRENzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAwOEE0RjcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMDhBNDBGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDA4QTQyRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAwOEE0NEYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMDhBNDZGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDA4QTQ4RjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAwOEE0QUYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMDhBNENGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDA4QTRFRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAwOEE0MUYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMDhBNDNGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDA4QTQ1RjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAwOEE0N0YyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMDhBNDlGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDA4QTRCRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAwOEE0REYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMDhBNEZGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTgwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoMWFkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaDFhZGQuczogc2gxYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2gxYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2gyYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoMmFkZC5zOiBzaDJhZGQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaDJhZGQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0E4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaDNhZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2gzYWRkLnM6IHNoM2FkZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoM2FkZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NobGFkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaGxhZGQuczogc2hsYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hsYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMDhBNDA2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDA4QTQyNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAwOEE0NDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMDhBNDY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDA4QTQ4Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAwOEE0QTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMDhBNEM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDA4QTRFNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAwOEE0MTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMDhBNDM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDA4QTQ1Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAwOEE0NzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMDhBNDk2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDA4QTRCNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAwOEE0RDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMDhBNEY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDA4QTQwQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAwOEE0MkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMDhBNDRBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDA4QTQ2QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAwOEE0OEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMDhBNEFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDA4QTRDQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAwOEE0RUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgMDhBNDFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDA4QTQzQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAwOEE0NUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgMDhBNDdBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDA4QTQ5QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAwOEE0QkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggMDhBNERBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDA4QTRGQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCAwOEE0MEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgMDhBNDJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IDA4QTQ0RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyAwOEE0NkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgMDhBNDhFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IDA4QTRBRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCAwOEE0Q0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgMDhBNEVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIDA4QTQxRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCAwOEE0M0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggMDhBNDVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIDA4QTQ3RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCAwOEE0OUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgMDhBNEJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IDA4QTRERTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyAwOEE0RkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODAgMDhBNDA2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg0IDA4QTQyNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4OCAwOEE0NDZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOGMgMDhBNDY2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTkwIDA4QTQ4NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5NCAwOEE0QTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTggMDhBNEM2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTljIDA4QTRFNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhMCAwOEE0MTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTQgMDhBNDM2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE4IDA4QTQ1NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhYyAwOEE0NzZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjAgMDhBNDk2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI0IDA4QTRCNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiOCAwOEE0RDZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYmMgMDhBNEY2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWMwIDA4QTQwQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjNCAwOEE0MkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzggMDhBNDRBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWNjIDA4QTQ2QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkMCAwOEE0OEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDQgMDhBNEFBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ4IDA4QTRDQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkYyAwOEE0RUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTAgMDhBNDFBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU0IDA4QTQzQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlOCAwOEE0NUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZWMgMDhBNDdBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWYwIDA4QTQ5QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmNCAwOEE0QkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjggMDhBNERBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWZjIDA4QTRGQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwMCAwOEE0MEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDQgMDhBNDJFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA4IDA4QTQ0RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwYyAwOEE0NkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTAgMDhBNDhFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE0IDA4QTRBRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxOCAwOEE0Q0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMWMgMDhBNEVFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjIwIDA4QTQxRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyNCAwOEE0M0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjggMDhBNDVFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjJjIDA4QTQ3RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzMCAwOEE0OUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzQgMDhBNEJFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM4IDA4QTRERUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzYyAwOEE0RkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTQ0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NobGFkZDIge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hsYWRkMi5zOiBzaGxhZGQyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hsYWRkMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0E2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0E2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0U2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MjZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDQ2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2NkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0ODZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEE2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RTZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDE2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NTZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDc2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5NkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QjZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEQ2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MEFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDJBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0QUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NkFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDhBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBQUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0Q0FBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEVBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxQUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0M0FBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDVBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3QUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OUFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEJBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTREQUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RkFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NEVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4RUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1RUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0VBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0REVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIDA4QTQwNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCAwOEE0MjZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggMDhBNDQ2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIDA4QTQ2NkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCAwOEE0ODZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgMDhBNEE2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IDA4QTRDNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyAwOEE0RTZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgMDhBNDE2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IDA4QTQzNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCAwOEE0NTZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgMDhBNDc2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIDA4QTQ5NkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCAwOEE0QjZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggMDhBNEQ2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIDA4QTRGNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMCAwOEE0MEFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzQgMDhBNDJBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IDA4QTQ0QUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjYyAwOEE0NkFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDAgMDhBNDhBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IDA4QTRBQUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkOCAwOEE0Q0FFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGMgMDhBNEVBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWUwIDA4QTQxQUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlNCAwOEE0M0FFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTggMDhBNDVBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWVjIDA4QTQ3QUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmMCAwOEE0OUFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjQgMDhBNEJBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY4IDA4QTREQUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmYyAwOEE0RkFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDAgMDhBNDBFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA0IDA4QTQyRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwOCAwOEE0NEVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMGMgMDhBNDZFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjEwIDA4QTQ4RUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxNCAwOEE0QUVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTggMDhBNENFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjFjIDA4QTRFRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyMCAwOEE0MUVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjQgMDhBNDNFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI4IDA4QTQ1RUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyYyAwOEE0N0VFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzAgMDhBNDlFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM0IDA4QTRCRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzOCAwOEE0REVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyM2MgMDhBNEZFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE0NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViLnM6IHN1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1Yi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDA1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNEM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0NzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDk1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0RDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0OEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDdEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MDRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDg0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0QzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0MzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTRENEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0RENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIDA4QTQwQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCAwOEE0MkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggMDhBNDRDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIDA4QTQ2QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCAwOEE0OEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgMDhBNEFDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IDA4QTRDQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyAwOEE0RUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgMDhBNDFDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IDA4QTQzQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCAwOEE0NUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgMDhBNDdDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIDA4QTQ5QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCAwOEE0QkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggMDhBNERDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIDA4QTRGQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMCAwOEE0MDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzQgMDhBNDI1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IDA4QTQ0NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjYyAwOEE0NjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDAgMDhBNDg1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IDA4QTRBNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkOCAwOEE0QzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGMgMDhBNEU1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWUwIDA4QTQxNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlNCAwOEE0MzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTggMDhBNDU1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWVjIDA4QTQ3NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmMCAwOEE0OTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjQgMDhBNEI1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY4IDA4QTRENTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmYyAwOEE0RjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDAgMDhBNDBEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA0IDA4QTQyRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwOCAwOEE0NEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMGMgMDhBNDZEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjEwIDA4QTQ4RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxNCAwOEE0QUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTggMDhBNENEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjFjIDA4QTRFRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyMCAwOEE0MUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjQgMDhBNDNEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI4IDA4QTQ1RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyYyAwOEE0N0QwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzAgMDhBNDlEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM0IDA4QTRCRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzOCAwOEE0REQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyM2MgMDhBNEZEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQwIDA4QTQwNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0NCAwOEE0MjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDggMDhBNDQ0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjRjIDA4QTQ2NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1MCAwOEE0ODRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTQgMDhBNEE0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjU4IDA4QTRDNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1YyAwOEE0RTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjAgMDhBNDE0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjY0IDA4QTQzNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2OCAwOEE0NTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNmMgMDhBNDc0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjcwIDA4QTQ5NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3NCAwOEE0QjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzggMDhBNEQ0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjdjIDA4QTRGNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4MCAwOEE0MENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODQgMDhBNDJDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjg4IDA4QTQ0Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4YyAwOEE0NkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTAgMDhBNDhDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjk0IDA4QTRBQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5OCAwOEE0Q0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOWMgMDhBNEVDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmEwIDA4QTQxQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhNCAwOEE0M0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTggMDhBNDVDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmFjIDA4QTQ3Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiMCAwOEE0OUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjQgMDhBNEJDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmI4IDA4QTREQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiYyAwOEE0RkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTc2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3N1YjIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViMi5zOiBzdWIyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3ViMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0MyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0MyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDA1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NDUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDY1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4NTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QTUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNEM1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MTUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDM1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1NTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0NzUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDk1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0RDUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEY1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MkQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDREMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2RDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0OEQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEFEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RUQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDFEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NUQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDdEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5RDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QkQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEREMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MDRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDI0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0NEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NjRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDg0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBNEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0QzRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEU0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxNEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0MzRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDU0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3NEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OTRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEI0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTRENEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RjRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NENFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4Q0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUNFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUNFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1Q0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0NFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0RENFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTk2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRzLnM6IGRzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29tY2xyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbWNsci5zOiBjb21jbHIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb21jbHIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0Njg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0Qzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0Mzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTREODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0Rjg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgOTBBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDkwQTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCA5MEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgOTBBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDkwQTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCA5MEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggOTBBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDkwQTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCA5MEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgOTBBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDkwQTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyA5MEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgOTBBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDkwQTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCA5MEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgOTBBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2MjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0RTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTQzMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0NTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDcyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTRGMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0MDI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDIyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ0Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0NjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEUyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTQxMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MzI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDUyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ3Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0RjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0NDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNDYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTRFMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0MTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDMyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ1MjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0NzIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTQwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0MjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDQwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQ2MDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0RTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQzMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0NTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNDcwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRGMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb191bml0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInVuaXQuczogdW5pdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInVuaXQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0NDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NjM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0ODM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0QzM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0RTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0MTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0NTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0NzM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0OTM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0RDM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0RjM4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0MDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0NDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0Njk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0ODk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0Qzk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0RTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0MTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0Nzk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0OTk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0RDk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0Rjk4NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0NDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0ODlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0QzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0RTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0MTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0NTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0NzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0OTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0RDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0RjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0MDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0NDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0NjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0ODlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0QzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0RTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0MTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0NTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0NzlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0OTlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0RDlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RjlDNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb191bml0MiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJ1bml0Mi5zOiB1bml0MiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInVuaXQyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDAzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDQzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDYzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDgzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNEMzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEUzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNDEzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNDUzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDczQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDkzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNEQzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNEYzQTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDA5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNDQ5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNDY5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNDg5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNEM5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNEU5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDE5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDU5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDc5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNDk5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNEQ5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEY5QTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDA5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDQ5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDY5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDg5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNEM5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEU5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNDE5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNDU5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDc5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDk5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNEQ5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNEY5RTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGNvciB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkY29yLnM6IGRjb3IgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkY29yLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDg4MDBCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDg4MDRCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDg4MDZCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDg4MDhCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDg4MENCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDg4MEVCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDg4MDFCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDg4MDVCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDg4MDdCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDg4MDlCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDg4MERCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDg4MEZCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDg4MDBCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDg4MDRCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDg4MDZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDg4MDhCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDg4MENCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDg4MEVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDg4MDFCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDg4MDVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDg4MDdCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDg4MDlCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDg4MERCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDg4MEZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDg4MDBCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDg4MDRCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDg4MDZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDg4MDhCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDg4MENCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDg4MEVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDg4MDFCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDg4MDVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDg4MDdCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDg4MDlCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDg4MERCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDg4MEZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGNvcjIge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGNvcjIuczogZGNvcjIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkY29yMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4ODAwQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4ODA0QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4ODA2QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4ODA4QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4ODBDQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4ODBFQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4ODAxQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4ODA1QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4ODA3QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4ODA5QkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4ODBEQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4ODBGQkE1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4ODAwQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4ODA0QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4ODA2QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4ODA4QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4ODBDQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4ODBFQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4ODAxQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4ODA1QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4ODA3QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4ODA5QkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4ODBEQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4ODBGQkU1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FkZGkge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkaS5zOiBhZGRpIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkaS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEI0QTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBCNEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQjRBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEI0QTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBCNEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgQjRBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEI0QTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBCNEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgQjRBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEI0QTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBCNEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgQjRBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEI0QTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBCNEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggQjRBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEI0QTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBCNEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgQjRBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEI0QTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBCNEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgQjRBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEI0QTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBCNEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgQjRBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEI0QTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBCNEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggQjRBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEI0QTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBCNEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgQjRBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEI0QTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBCNEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgQjBBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEIwQTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBCMEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgQjBBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEIwQTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBCMEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggQjBBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEIwQTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBCMEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgQjBBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEIwQTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBCMEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgQjBBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEIwQTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBCMEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgQjBBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEIwQTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBCMEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggQjBBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEIwQTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBCMEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgQjBBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEIwQTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBCMEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgQjBBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEIwQTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBCMEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgQjBBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEIwQTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBCMEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggQjBBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEIwQTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCBCNEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgQjRBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IEI0QTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyBCNEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgQjRBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IEI0QTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCBCNEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgQjRBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIEI0QTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCBCNEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggQjRBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIEI0QTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCBCNEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgQjRBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IEI0QTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyBCNEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgQjBBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IEIwQTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCBCMEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgQjBBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIEIwQTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCBCMEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggQjBBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIEIwQTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCBCMEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgQjBBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IEIwQTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyBCMEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgQjBBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IEIwQTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCBCMEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgQjBBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIEIwQTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCBCMEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggQjBBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIEIwQTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCBCMEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgQjBBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IEIwQTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyBCMEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgQjBBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IEIwQTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCBCMEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgQjBBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIEIwQTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCBCMEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggQjBBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIEIwQTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3ViaSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdWJpLnM6IHN1YmkgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzdWJpLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOTRBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDk0QTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA5NEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgOTRBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDk0QTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCA5NEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggOTRBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDk0QTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCA5NEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgOTRBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDk0QTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyA5NEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgOTRBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDk0QTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCA5NEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgOTRBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDk0QTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCA5NEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggOTRBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDk0QTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCA5NEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgOTRBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDk0QTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyA5NEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgOTRBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDk0QTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCA5NEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgOTRBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDk0QTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCA5NEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggOTRBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDk0QTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCA5NEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgOTRBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDk0QTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyA5NEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgOTRBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDk0QTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCA5NEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgOTRBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDk0QTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCA5NEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggOTRBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDk0QTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCA5NEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgOTRBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDk0QTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyA5NEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQuczogc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQwQTQwMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQwQTQyMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQwQTQ0MDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQwQTQ2MDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQwQTQ4MDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQwQTRBMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQwQTRDMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQwQTRFMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQwQTQwQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQwQTQyQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQwQTQ0QjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQwQTQ2QjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQwQTQ4QjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQwQTRBQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQwQTRDQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQwQTRFQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoaWZ0MiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaGlmdDIuczogc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEMEE0MDAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEMEE0MjAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEMEE0NDAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBEMEE0NjAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBEMEE0ODAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBEMEE0QTAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBEMEE0QzAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBEMEE0RTAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBEMEE0MEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBEMEE0MkI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBEMEE0NEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBEMEE0NkI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBEMEE0OEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBEMEE0QUI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBEMEE0Q0I0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBEMEE0RUI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGlmdDMge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQzLnM6IHNoaWZ0MyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoaWZ0My5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQwQTQwMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQwQTQyMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQwQTQ0MjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQwQTQ2MjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQwQTQ4MjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQwQTRBMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQwQTRDMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQwQTRFMjA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQwQTQwRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQwQTQyRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQwQTQ0RjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQwQTQ2RjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQwQTQ4RjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQwQTRBRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQwQTRDRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQwQTRFRjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dHJhY3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0cmFjdC5zOiBleHRyYWN0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0cmFjdC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQwODYxOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQwODYzOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQwODY1OEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQwODY3OEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQwODY5OEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQwODZCOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQwODZEOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQwODZGOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQwODYxQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQwODYzQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQwODY1Q0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQwODY3Q0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQwODY5Q0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQwODZCQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQwODZEQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQwODZGQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEQwODYxMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQwODYzMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEQwODY1MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEQwODY3MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQwODY5MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEQwODZCMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEQwODZEMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQwODZGMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEQwODYxNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEQwODYzNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQwODY1NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEQwODY3NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEQwODY5NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQwODZCNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEQwODZENDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEQwODZGNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dHJhY3QyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dHJhY3QyLnM6IGV4dHJhY3QyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0cmFjdDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEMDg2MThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEMDg2MzhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEMDg2NThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBEMDg2NzhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBEMDg2OThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBEMDg2QjhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBEMDg2RDhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBEMDg2RjhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBEMDg2MUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBEMDg2M0NCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBEMDg2NUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBEMDg2N0NCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBEMDg2OUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBEMDg2QkNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBEMDg2RENCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBEMDg2RkNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBEMDg2MTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBEMDg2MzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBEMDg2NTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBEMDg2NzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBEMDg2OTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBEMDg2QjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBEMDg2RDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBEMDg2RjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBEMDg2MTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBEMDg2MzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBEMDg2NTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBEMDg2NzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBEMDg2OTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBEMDg2QjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBEMDg2RDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBEMDg2RjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHRyYWN0MyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRyYWN0My5zOiBleHRyYWN0MyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dHJhY3QzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDg4NjAxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDg4NjIxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDg4NjQxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDg4NjYxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDg4NjgxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDg4NkExNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDg4NkMxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDg4NkUxNUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDg4NjA1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDg4NjI1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDg4NjQ1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDg4NjY1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDg4Njg1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDg4NkE1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDg4NkM1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDg4NkU1NUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDA4NjEyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRDA4NjMyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDA4NjUyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDA4NjcyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRDA4NjkyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDA4NkIyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDA4NkQyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRDA4NkYyMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDA4NjE2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDA4NjM2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRDA4NjU2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDA4Njc2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDA4Njk2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRDA4NkI2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDA4NkQ2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDA4NkY2MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGVwb3NpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZXBvc2l0LnM6IGRlcG9zaXQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZXBvc2l0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDRDNDBCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDRDNDJCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDRDNDRCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDRDNDZCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDRDNDhCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDRDNEFCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDRDNENCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDRDNEVCNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDRDNDBGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDRDNDJGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDRDNDRGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDRDNDZGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDRDNDhGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDRDNEFGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDRDNENGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDRDNEVGNTZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDRDNDAwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRDRDNDIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDRDNDQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDRDNDYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRDRDNDgwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDRDNEEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDRDNEMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRDRDNEUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDRDNDA0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDRDNDI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRDRDNDQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDRDNDY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDRDNDg0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRDRDNEE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDRDNEM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDRDNEU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRDRERjE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRDRERjM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggRDRERjU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRDRERjc0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRDRERjk0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgRDRERkI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRDRERkQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRDRERkY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgRDRERjEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRDRERjMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRDRERjUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgRDRERjcwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRDRERjkwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRDRERkIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggRDRERkQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRDRERkYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRDRERjFGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgRDRERjNGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRDRERjVGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgRDRERjdGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgRDRERjlGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRDRERkJGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRDRERkRGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgRDRERkZGNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRDRERjFCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgRDRERjNCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggRDRERjVCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRDRERjdCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgRDRERjlCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgRDRERkJCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRDRERkRCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRDRERkZCNzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZGVwb3NpdDIge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGVwb3NpdDIuczogZGVwb3NpdDIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZXBvc2l0Mi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQ0QzQwQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQ0QzQyQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQ0QzQ0QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQ0QzQ2QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQ0QzQ4QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQ0QzRBQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQ0QzRDQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQ0QzRFQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQ0QzQwRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQ0QzQyRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQ0QzQ0RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQ0QzQ2RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQ0QzQ4RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQ0QzRBRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQ0QzRDRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQ0QzRFRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEQ0QzQwMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQ0QzQyMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEQ0QzQ0MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEQ0QzQ2MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQ0QzQ4MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEQ0QzRBMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEQ0QzRDMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQ0QzRFMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEQ0QzQwNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEQ0QzQyNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQ0QzQ0NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEQ0QzQ2NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEQ0QzQ4NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQ0QzRBNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEQ0QzRDNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEQ0QzRFNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEQ0REYxNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEQ0REYzNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEQ0REY1NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEQ0REY3NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEQ0REY5NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEQ0REZCNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEQ0REZENDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEQ0REZGNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEQ0REYxMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEQ0REYzMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEQ0REY1MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEQ0REY3MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEQ0REY5MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEQ0REZCMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IEQ0REZEMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEQ0REZGMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEQ0REYxRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IEQ0REYzRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEQ0REY1Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEQ0REY3Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIEQ0REY5Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEQ0REZCRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEQ0REZERjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIEQ0REZGRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEQ0REYxQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEQ0REYzQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IEQ0REY1Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEQ0REY3Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEQ0REY5Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IEQ0REZCQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEQ0REZEQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEQ0REZGQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTY0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2RlcG9zaXQzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRlcG9zaXQzLnM6IGRlcG9zaXQzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGVwb3NpdDMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMEM0MEFCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjBDNDJBQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEYwQzQ0QUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGMEM0NkFCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjBDNDhBQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYwQzRBQUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGMEM0Q0FCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjBDNEVBQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYwQzQwRUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGMEM0MkVCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRjBDNDRFQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwQzQ2RUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGMEM0OEVCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRjBDNEFFQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEYwQzRDRUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBGMEM0RUVCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDRDNDAyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQ0QzQyMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBENEM0NDIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDRDNDYyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQ0QzQ4MjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBENEM0QTIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDRDNEMyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQ0QzRFMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBENEM0MDYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDRDNDI2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQ0QzQ0NjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBENEM0NjYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDRDNDg2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQ0QzRBNjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBENEM0QzYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDRDNEU2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEQ0REYxNjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBENERGMzYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggRDRERjU2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEQ0REY3NjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBENERGOTYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgRDRERkI2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEQ0REZENjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBENERGRjYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgRDRERjEyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEQ0REYzMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBENERGNTIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgRDRERjcyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEQ0REY5MjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBENERGQjIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggRDRERkQyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEQ0REZGMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBGNERGMEVCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgRjRERjJFQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEY0REY0RUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyBGNERGNkVCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgRjRERjhFQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEY0REZBRUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCBGNERGQ0VCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgRjRERkVFQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEY0REYwQUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCBGNERGMkFCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggRjRERjRBQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEY0REY2QUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCBGNERGOEFCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgRjRERkFBQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEY0REZDQUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyBGNERGRUFCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3lzdGVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN5c3RlbS5zOiBzeXN0ZW0gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzeXN0ZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAxODAwNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwMDAwMEMwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwMDAwMENBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwMDA1MEQ2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwMDA1MEU2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwMDA0MTg2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwMEEwMTBBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwMDA0MTgyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwMTQ0MTg0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwMDAwMDRBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwMTQwMDhBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwMDAwMDQwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwMDEwMDQwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAxNDAwMDREMlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwNEE2MTE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwNEExMzE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwNEE2MTFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwNEExMzFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwNEE0MTM0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwNEE0MTM2NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwNEE0MTMwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwNEE0MTMyNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwNEE0MTMwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwNEE0MTA0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwNEE0MjA0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwNEE0MTAwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwNEE0MjAwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zeXN0ZW0yIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN5c3RlbTIuczogc3lzdGVtMiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN5c3RlbTIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAwMEMwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwMDAwMENBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwMzlCMEQ2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwMzlCMEU2NFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwMTYwNDhBNFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwNEE2MTE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwNEExMzE4N1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwNEE2MTFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwNEExMzFDN1xbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3B1cmdlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInB1cmdlLnM6IHB1cmdlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVyZ2UucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwNEE0MTIwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwNEE0MTIyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNEE0MjIwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwNEE0MjIyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwNEE0MTI0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwNEE0MTI2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwNEE0MjI0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwNEE0MjI2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwNEE0MTM4MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwNEE0MTNBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwNEE0MTI4MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwNEE0MTJBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwNEE0MjI4MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwNEE0MjJBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwNEE0MTJDMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwNEE0MTJFMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwNEE0MjJDMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwNEE0MjJFMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3B1cmdlMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwdXJnZTIuczogcHVyZ2UyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVyZ2UyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDRBNDE2MDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDRBNDE2MjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDRBNDI2MDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDRBNDI2MjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCi0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX21pc2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnBfbWlzYy5zOiBmcF9taXNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfbWlzYy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwMDAyNDIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZtZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAiZm1lbS5zOiBmbWVtIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZm1lbS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDI0QTQwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNEE0MjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjRBNDAwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDI0QTQyMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAyQ0E0MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMkNBNDIwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDJDQTQwMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAyQ0E0MjAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMjRBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDI0QTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAyNEE0MDIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMjRBNDIyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDJDQTQwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAyQ0E0MjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMkNBNDAyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDJDQTQyMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzQ0E0MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgM0NBNDIyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDNDQTQwMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzQ0E0MjIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMjRBMDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDI0QTAzMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAyNEEwMTAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMkNBMDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDJDQTAzMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAyQ0EwMTAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMjRBMDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDI0QTAzMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAyNEEwMTIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMkNBMDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDJDQTAzMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAyQ0EwMTIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgM0NBMDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDNDQTAzMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzQ0EwMTIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZnBfY29tcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcF9jb21wLnM6IGZwX2NvbXAgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmcF9jb21wLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzBBMDQwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwQTA0ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMEEwNTgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzI4MDQwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDMyODA0ODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAzMEEwNjAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMzBBMDY4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDMwQTA3ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzMjgwNjAxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMzI4MDY4MThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDMwQTA4MDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzMEEwODgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMzBBMDk4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDMyODA4MDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMjgwODgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMzBBMEEwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDMwQTBBODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMEEwQjgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMzI4MEEwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDMyODBBODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAzMDg4MDYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMzA4ODBFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDMwODgxRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAzMjk4MDYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMzI5ODBFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDMyOTgxRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAzMDg4MjYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMzA4ODJFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDMwODgzRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAzMjk4MjYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMzI5ODJFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDMyOTgzRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzMDg4NDYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMzA4ODRFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDMwODg1RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAzMjk4NDYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMzI5ODRFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDMyOTg1RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAzMDg4NjYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMzA4ODZFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDMwODg3RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAzMjk4NjYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMzI5ODZFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDMyOTg3RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAzMDg4ODYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMzA4ODhFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDMwODg5RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAzMjk4ODYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMzI5ODhFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDMyOTg5RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAxODAxMjBFMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMUExMUE0RDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDk4MDEyMEUyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCA5QTExQTREMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMzg4NTQ3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTU1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX2NvbXAyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2NvbXAyLnM6IGZwX2NvbXAyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfY29tcDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBCOEFBNjM4RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQjhBQTZBMEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEJBNUIyNTk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBCQTVCMkMxNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQjhBQTYzQUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEI4QUE2QTJFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBCQTVCMjVCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQkE1QjJDMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDM4QTBDMDRBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMEEwQzgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMzBBMEQ4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDNBODBDMDk4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMjgwQzgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMzhBMEUwNEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDMwQTBFODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMEEwRjgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgM0E4MEUwOThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDMyODBFODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9jb252IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2NvbnYuczogZnBfY29udiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX2NvbnYucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMEEwMDIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzBBMDIyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMwQTA2MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMEEwMEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMzBBMDJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDMwQTA2QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAzMEEwMUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMzBBMDNBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDMwQTA3QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMjgwMDIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMzI4MDIyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDMyODA2MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMjgwMEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMzI4MDJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDMyODA2QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMjgwMUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMzI4MDNBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDMyODA3QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzMEEwODIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMzBBMEEyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDMwQTBFMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAzMEEwOEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMzBBMEFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDMwQTBFQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAzMEEwOUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMzBBMEJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDMwQTBGQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAzMjgwODIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMzI4MEEyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDMyODBFMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAzMjgwOEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMzI4MEFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDMyODBFQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzMjgwOUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMzI4MEJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDMyODBGQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAzMEExMDIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMzBBMTIyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDMwQTE2MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAzMEExMEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMzBBMTJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDMwQTE2QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAzMEExMUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMzBBMTNBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDMwQTE3QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAzMjgxMDIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMzI4MTIyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDMyODE2MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAzMjgxMEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMzI4MTJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDMyODE2QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAzMjgxMUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMzI4MTNBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDMyODE3QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAzMEExODIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMzBBMUEyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDMwQTFFMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAzMEExOEEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMzBBMUFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDMwQTFFQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAzMEExOUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMzBBMUJBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDMwQTFGQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAzMjgxODIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMzI4MUEyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDMyODFFMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAzMjgxOEExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMzI4MUFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDMyODFFQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAzMjgxOUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMzI4MUJBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDMyODFGQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT03Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9mY21wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX2ZjbXAuczogZnBfZmNtcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX2ZjbXAucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDg1MDQwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMDg1MDQwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMDg1MDQwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMDg1MDQwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAzMDg1MDQwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAzMDg1MDQwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAzMDg1MDQwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAzMDg1MDQwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzMDg1MDQwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMDg1MDQwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAzMDg1MDQwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzMDg1MDQwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMDg1MDQwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAzMDg1MDQwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMDg1MDQwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMDg1MDQwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzMDg1MDQxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMDg1MDQxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzMDg1MDQxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzMDg1MDQxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAzMDg1MDQxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAzMDg1MDQxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAzMDg1MDQxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAzMDg1MDQxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAzMDg1MDQxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAzMDg1MDQxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAzMDg1MDQxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAzMDg1MDQxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAzMDg1MDQxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAzMDg1MDQxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAzMDg1MDQxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAzMDg1MDQxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzMDg1MEMwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzMDg1MEMwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzMDg1MEMwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAzMDg1MEMwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAzMDg1MEMwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAzMDg1MEMwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAzMDg1MEMwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAzMDg1MEMwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAzMDg1MEMwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAzMDg1MEMwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAzMDg1MEMwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAzMDg1MEMwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAzMDg1MEMwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAzMDg1MEMwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAzMDg1MEMwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAzMDg1MEMwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAzMDg1MEMxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAzMDg1MEMxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAzMDg1MEMxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAzMDg1MEMxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAzMDg1MEMxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAzMDg1MEMxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAzMDg1MEMxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAzMDg1MEMxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAzMDg1MEMxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAzMDg1MEMxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAzMDg1MEMxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAzMDg1MEMxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAzMDg1MEMxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAzMDg1MEMxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAzMDg1MEMxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAzMDg1MEMxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAzMDg1MUMwMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAzMDg1MUMwMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAzMDg1MUMwMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAzMDg1MUMwM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAzMDg1MUMwNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAzMDg1MUMwNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAzMDg1MUMwNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAzMDg1MUMwN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAzMDg1MUMwOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAzMDg1MUMwOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAzMDg1MUMwQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAzMDg1MUMwQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAzMDg1MUMwQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAzMDg1MUMwRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAzMDg1MUMwRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAzMDg1MUMwRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCAzMDg1MUMxMFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCAzMDg1MUMxMVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAzMDg1MUMxMlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyAzMDg1MUMxM1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCAzMDg1MUMxNFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAzMDg1MUMxNVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCAzMDg1MUMxNlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyAzMDg1MUMxN1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAzMDg1MUMxOFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCAzMDg1MUMxOVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCAzMDg1MUMxQVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAzMDg1MUMxQlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCAzMDg1MUMxQ1xbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCAzMDg1MUMxRFxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAzMDg1MUMxRVxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyAzMDg1MUMxRlxbXlxuXF0qXG4iCXtzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05Nl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tZWRpYSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtZWRpYS5zOiBtZWRpYSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1lZGlhLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDk2NzAzQ0NcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDk2NzAzNENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDk2NzAzMENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDk2NzAyQ0NcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjgwNzhCNEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDk2NzA3NENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDk2NzA3OENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDk2NzA3Q0NcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjhFMENGNEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjhFMENGNEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRjhFMENCNEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDk2NzA1NENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDk2NzA1OENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDk2NzA1Q0NcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMEFDRTAxQzlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMEFDRTAxNDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMEFDRTAxMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRkFDRTg0MDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkFDRUM0MDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRkFDRTgwMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRkFDRUMwMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRkFENjBFNDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRkFENjRBODlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRkFENjYzMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3BlY2lhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzcGVjaWFsLnM6IHNwZWNpYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzcGVjaWFsLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDRBNDE2ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA0QTQxNkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNEE0MUE4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDRBNDFBQTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcGVyZiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwZXJmLnM6IHBlcmYgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJwZXJmLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLQotICAgICMgVGhlIHRoaXJkIG9uZSBpcyBxdWVzdGlvbmFibGUuICBIUCBhcyBkb2Vzbid0IGdlbmVyYXRlIHdoYXQgdGhlIGJvb2sKLSAgICAjIHNheXMuICBJdCBvdXRwdXRzIHRoZSBudWxsaWZ5IGZsYWcgYXQgMzAgaW5zdGVhZC4KLQotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDAwMDY4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzAwMDAyODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMwMDAwMkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3Nwb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAic3BvcC5zOiBzcG9wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgICMgVGhpcyB0aWNrbGVzIGEgYnVnIGluIHRoZSBleHByZXNzaW9uIHBhcnNlci4KLSAgICBnYXNfc3RhcnQgInNwb3AucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAxMDAwMDEwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMTAwMDE5MTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDEwMDAwMTI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAxMDAwMTkzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMTAwMDJCMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDEwMDM5QjA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAxMDAwMkIyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMTAwMzlCMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDEwQTAwNTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAxMEEwMUQxM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMTBBMDA1MjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDEwQTAxRDMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAxMEM1MDcwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMTBDNTFGMTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDEwQzUwNzI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAxMEM1MUYzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29wciB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb3ByLnM6IGNvcHIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb3ByLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzAwMDAxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwMDAwNzEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMDAwMDEyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzAwMDA3MzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29wcm1lbSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb3BybWVtLnM6IGNvcHIgbWVtb3J5IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29wcm1lbS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDI0ODUwMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNDg1MjExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjQ4NTAxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDI0ODUyMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAyQzg1MDExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMkM4NTIxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDJDODUwMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAyQzg1MjEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMjQ4NTAzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDI0ODUyMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAyNDg1MDMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMjQ4NTIzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDJDODUwMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAyQzg1MjMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMkM4NTAzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDJDODUyMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAyNDgwMTExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMjQ4MDMxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDI0ODAxMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAyQzgwMTExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMkM4MDMxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDJDODAxMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAyNDgwMTMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMjQ4MDMzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDI0ODAxMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAyQzgwMTMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMkM4MDMzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDJDODAxMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mbWVtX0xSX3Rlc3RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZtZW1MUmJ1Zy5zOiBMUiByZWdpc3RlciBzZWxlY3Rpb24gb24gZnAgbWVtIGluc3RydWN0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZtZW1MUmJ1Zy5zIiAiLWFsIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgY29ycmVjdGx5IGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuIAotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyNzQwMTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjc0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI3NTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAyRjQwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMkY0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDJGNTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAyNzQwMTA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMjc0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDI3NTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAyRjQwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMkY0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDJGNTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAyNzQwMTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMjc0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDI3NTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAyRjQwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMkY0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDJGNTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAyNzQwMTA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMjc0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDI3NTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAyRjQwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMkY0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDJGNTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAyNzU5MDI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMjc1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAyNzU5MDA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMjc1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAyNzU5MDI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMjc1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAyNzU5MDA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMjc1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBFODQwQzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTUwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19pbWVtCi0gICAgZG9faW1tZWQKLSAgICBkb19icmFuY2gKLSAgICBkb19hZGQKLSAgICBkb19hZGQyCi0gICAgZG9fc2gxYWRkCi0gICAgZG9fc2gyYWRkCi0gICAgZG9fc2gzYWRkCi0gICAgZG9fc2hsYWRkCi0gICAgZG9fc2hsYWRkMgotICAgIGRvX3N1YgotICAgIGRvX3N1YjIKLSAgICBkb19kcwotICAgIGRvX2NvbWNscgotICAgIGRvX2xvZ2ljYWwKLSAgICBkb191bml0Ci0gICAgZG9fdW5pdDIKLSAgICBkb19kY29yCi0gICAgZG9fZGNvcjIKLSAgICBkb19hZGRpCi0gICAgZG9fc3ViaQotICAgIGRvX3NoaWZ0Ci0gICAgZG9fc2hpZnQyCi0gICAgZG9fc2hpZnQzCi0gICAgZG9fZXh0cmFjdAotICAgIGRvX2V4dHJhY3QyCi0gICAgZG9fZXh0cmFjdDMKLSAgICBkb19kZXBvc2l0Ci0gICAgZG9fZGVwb3NpdDIKLSAgICBkb19kZXBvc2l0MwotICAgIGRvX3N5c3RlbQotICAgIGRvX3N5c3RlbTIKLSAgICBkb19wdXJnZQotICAgIGRvX3B1cmdlMgotICAgIGRvX2ZwX21pc2MKLSAgICBkb19mbWVtCi0gICAgZG9fZnBfY29tcAotICAgIGRvX2ZwX2NvbnYKLSAgICBkb19mcF9mY21wCi0gICAgZG9fc3BlY2lhbAotICAgIGRvX3BlcmYKLSAgICBkb19zcG9wCi0gICAgZG9fY29wcgotICAgIGRvX2NvcHJtZW0KLQotICAgICMgVGhlICJ3ZWlyZC5zIiBmaWxlIGZyb20gdGhlIGdkYiB0ZXN0c3VpdGUuICBTaW1wbHkgdmVyaWZ5IGl0Ci0gICAgIyBhc3NlbWJsZXMuCi0gICAgZ2FzX3Rlc3QgIndlaXJkLnMiICIiICIiICJzdGFicyBwYXJzaW5nIgotCi0gICAgIyBUZXN0IHRoYXQgd2UgY29ycmVjdGx5IGFzc2VtYmxlIHNvbWUgRlAgbWVtb3J5IHRlc3RzIHdoaWNoCi0gICAgIyBML1IgcmVnaXN0ZXIgc2VsZWN0cy4gIChSZWdyZXNzaW9uIHRlc3QgZm9yIGEgYnVnIFRlZ2UgZm91bmQpLgotICAgIGRvX2ZtZW1fTFJfdGVzdHMKLQotICAgICMgUEEyLjAgdGVzdHMKLSAgICBkb19mcF9jb21wMgotICAgIGRvX2JyYW5jaDIKLSAgICBkb19tZWRpYQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNDk2MTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gucworKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBNb3JlIGJyYW5jaGluZyBpbnN0cnVjdGlvbnMgdGhhbiB5b3UgZXZlciBrbmV3IHdoYXQgdG8gZG8gd2l0aC4KLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotYnJhbmNoX3Rlc3RzOiAKLQlibCBicmFuY2hfdGVzdHMsJXIyCi0JYmwsbiBicmFuY2hfdGVzdHMsJXIyCi0JYiBicmFuY2hfdGVzdHMKLQliLG4gYnJhbmNoX3Rlc3RzCi0JZ2F0ZSBicmFuY2hfdGVzdHMsJXIyCi0JZ2F0ZSxuIGJyYW5jaF90ZXN0cywlcjIKLQlibHIgJXI0LCVyMgotCWJscixuICVyNCwlcjIKLQlibHIgJXI0LCVyMAotCWJscixuICVyNCwlcjAKLQlidiAlcjAoJXIyKQotCWJ2LG4gJXIwKCVyMikKLQliZSAweDEyMzQoJXNyMSwlcjIpCi0JYmUsbiAweDEyMzQoJXNyMSwlcjIpCi0JYmxlIDB4MTIzNCglc3IxLCVyMikKLQlibGUsbiAweDEyMzQoJXNyMSwlcjIpCi0KLW1vdmJfdGVzdHM6IAotCW1vdmIgJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPSAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw8ICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLG9kICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLHRyICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLDw+ICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLD49ICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLGV2ICVyNCwlcjI2LG1vdmJfdGVzdHMKLW1vdmJfbnVsbGlmaWVkX3Rlc3RzOiAKLQltb3ZiLG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPSxuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLDwsbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixvZCxuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLHRyLG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPD4sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw+PSxuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLGV2LG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCi1tb3ZpYl90ZXN0czogCi0JbW92aWIgNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPSA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8IDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLG9kIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLHRyIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLDw+IDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD49IDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLGV2IDUsJXIyNixtb3ZpYl90ZXN0cwotbW92aWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQltb3ZpYixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD0sbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsb2QsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYix0cixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLDw+LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPj0sbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYixldixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCi1jb21iX3Rlc3RzOiAKLQljb21iICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDwgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw8ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPDw9ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsc3YgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixvZCAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLHRyICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPD4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+PSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+Pj0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+PiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLG5zdiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLGV2ICVyMCwlcjQsY29tYl90ZXN0cwotY29tYl9udWxsaWZpZWRfdGVzdHM6IAotCWNvbWIsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDwsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PCxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPDw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixzdixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsb2QsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLHRyLG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4+PSxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLG5zdixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsZXYsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQotY29taWJfdGVzdHM6IAotCWNvbWliIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPCAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw9IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPDwgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PD0gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixzdiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLG9kIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsdHIgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD49IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4+PSAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4+IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsbnN2IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsZXYgMCwlcjQsY29tYl90ZXN0cwotCi1jb21pYl9udWxsaWZpZWRfdGVzdHM6IAotCWNvbWliLG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw9LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPDwsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw8PSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsc3YsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLG9kLG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYix0cixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPD4sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD49LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+Pj0sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4+LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixuc3YsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLGV2LG4gMCwlcjQsY29taWJfdGVzdHMKLQotCi0KLWFkZGJfdGVzdHM6IAotCWFkZGIgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw9ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPCAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw9ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsbnV2ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsem52ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsc3YgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixvZCAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHRyICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPD4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+PSAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLD4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix1diAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHZueiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLG5zdiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLGV2ICVyMSwlcjQsYWRkYl90ZXN0cwotYWRkYl9udWxsaWZpZWRfdGVzdHM6IAotCWFkZGIsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLD0sbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDwsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw9LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixudXYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHpudixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsc3YsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLG9kLG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix0cixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPD4sbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLD49LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix1dixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdm56LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixuc3YsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLGV2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0KLWFkZGliX3Rlc3RzOiAKLQlhZGRpYiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw9IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLDwgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD0gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnV2IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHpudiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixzdiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixvZCAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix0ciAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8PiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw+PSAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw+IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHV2IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHZueiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixuc3YgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsZXYgLTEsJXI0LGNvbWJfdGVzdHMKLQotYWRkaWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQlhZGRpYixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLD0sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD0sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixudXYsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix6bnYsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixzdixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLG9kLG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsdHIsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8PixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLD49LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsdm56LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnN2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsZXYsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQotCi07IE5lZWRzIHRvIGNoZWNrIGxvdHMgb2Ygc3R1ZmYgKGxpa2UgY29ybmVyIGJpdCBjYXNlcykKLWJiX3Rlc3RzOiAKLQlidmIsPCAlcjQsYmJfdGVzdHMKLQlidmIsPj0gJXI0LGJiX3Rlc3RzCi0JYnZiLDwsbiAlcjQsYmJfdGVzdHMKLQlidmIsPj0sbiAlcjQsYmJfdGVzdHMKLQliYiw8ICVyNCw1LGJiX3Rlc3RzCi0JYmIsPj0gJXI0LDUsYmJfdGVzdHMKLQliYiw8LG4gJXI0LDUsYmJfdGVzdHMKLQliYiw+PSxuICVyNCw1LGJiX3Rlc3RzCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2JyYW5jaDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTUwYmQ1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IE1vcmUgYnJhbmNoaW5nIGluc3RydWN0aW9ucyB0aGFuIHlvdSBldmVyIGtuZXcgd2hhdCB0byBkbyB3aXRoLgotOyBQQSAyLjAgdmVyc2lvbnMgYW5kIG5ldyBzeW50YXguCi0KLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi1iYl90ZXN0czoJCi0JYmIsPCAlcjQsJXNhcixiYl90ZXN0cwotCWJiLD49ICVyNCwlc2FyLGJiX3Rlc3RzCi0JYmIsPCxuICVyNCwlY3IxMSxiYl90ZXN0cwotCWJiLD49LG4gJXI0LCVjcjExLGJiX3Rlc3RzCi0JYmIsKjwgJXI0LCVzYXIsYmJfdGVzdHMKLQliYiwqPj0gJXI0LCVzYXIsYmJfdGVzdHMKLQliYiwqPCxuICVyNCwlY3IxMSxiYl90ZXN0cwotCWJiLCo+PSxuICVyNCwlY3IxMSxiYl90ZXN0cwotCWJiLCo8ICVyNCw1LGJiX3Rlc3RzCi0JYmIsKj49ICVyNCw1LGJiX3Rlc3RzCi0JYmIsKjwsbiAlcjQsNSxiYl90ZXN0cwotCWJiLCo+PSxuICVyNCw1LGJiX3Rlc3RzCi0JCi1icmFuY2hfc3RhY2s6CQotCWNscmJ0cwotCXBvcGJ0cyAxCi0JcG9wYnRzIDQ5OQotCXB1c2hub20KLQlwdXNoYnRzICVyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvbWNsci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiZmJhZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvbWNsci5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQljb21jbHIgJXI0LCVyNSwlcjYKLQljb21jbHIsPSAlcjQsJXI1LCVyNgotCWNvbWNsciw8ICVyNCwlcjUsJXI2Ci0JY29tY2xyLDw9ICVyNCwlcjUsJXI2Ci0JY29tY2xyLDw8ICVyNCwlcjUsJXI2Ci0JY29tY2xyLDw8PSAlcjQsJXI1LCVyNgotCWNvbWNscixzdiAlcjQsJXI1LCVyNgotCWNvbWNscixvZCAlcjQsJXI1LCVyNgotCWNvbWNscix0ciAlcjQsJXI1LCVyNgotCWNvbWNsciw8PiAlcjQsJXI1LCVyNgotCWNvbWNsciw+PSAlcjQsJXI1LCVyNgotCWNvbWNsciw+ICVyNCwlcjUsJXI2Ci0JY29tY2xyLD4+PSAlcjQsJXI1LCVyNgotCWNvbWNsciw+PiAlcjQsJXI1LCVyNgotCWNvbWNscixuc3YgJXI0LCVyNSwlcjYKLQljb21jbHIsZXYgJXI0LCVyNSwlcjYKLQotCWNvbWljbHIgMTIzLCVyNSwlcjYKLQljb21pY2xyLD0gMTIzLCVyNSwlcjYKLQljb21pY2xyLDwgMTIzLCVyNSwlcjYKLQljb21pY2xyLDw9IDEyMywlcjUsJXI2Ci0JY29taWNsciw8PCAxMjMsJXI1LCVyNgotCWNvbWljbHIsPDw9IDEyMywlcjUsJXI2Ci0JY29taWNscixzdiAxMjMsJXI1LCVyNgotCWNvbWljbHIsb2QgMTIzLCVyNSwlcjYKLQljb21pY2xyLHRyIDEyMywlcjUsJXI2Ci0JY29taWNsciw8PiAxMjMsJXI1LCVyNgotCWNvbWljbHIsPj0gMTIzLCVyNSwlcjYKLQljb21pY2xyLD4gMTIzLCVyNSwlcjYKLQljb21pY2xyLD4+PSAxMjMsJXI1LCVyNgotCWNvbWljbHIsPj4gMTIzLCVyNSwlcjYKLQljb21pY2xyLG5zdiAxMjMsJXI1LCVyNgotCWNvbWljbHIsZXYgMTIzLCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3ByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxNDZhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHIucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWNvcHJfdGVzdHM6IAotCWNvcHIsNCw1Ci0JY29wciw0LDExNQotCWNvcHIsNCw1LG4KLQljb3ByLDQsMTE1LG4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3BybWVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDU2Y2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3BybWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBjb3ByIG1lbW9yeSB0ZXN0cyB3aGljaCBhbHNvIHRlc3QgdGhlIHZhcmlvdXMgCi07IGFkZHJlc3NpbmcgbW9kZXMgYW5kIGNvbXBsZXRlcnMuCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLTsgCi1jb3ByX2luZGV4aW5nX2xvYWQgCi0KLQljbGR3eCw0ICVyNSglc3IwLCVyNCksJXIyNgotCWNsZHd4LDQscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGR3eCw0LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3gsNCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGRkeCw0ICVyNSglc3IwLCVyNCksJXIyNgotCWNsZGR4LDQscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGRkeCw0LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHgsNCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQotY29wcl9pbmRleGluZ19zdG9yZSAKLQljc3R3eCw0ICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdHd4LDQscyAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3R3eCw0LG0gJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0d3gsNCxzbSAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3RkeCw0ICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdGR4LDQscyAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3RkeCw0LG0gJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0ZHgsNCxzbSAlcjI2LCVyNSglc3IwLCVyNCkKLQotY29wcl9zaG9ydF9tZW1vcnkgCi0JY2xkd3MsNCAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3MsNCxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3MsNCxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHMsNCAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHMsNCxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHMsNCxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JY3N0d3MsNCAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0d3MsNCxtYiAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0d3MsNCxtYSAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0ZHMsNCAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0ZHMsNCxtYiAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0ZHMsNCxtYSAlcjI2LDAoJXNyMCwlcjQpCi0KLTsgZ2FzIGZ1Y2tzIHRoaXMgdXAgdGhpbmtzIGl0IGdldHMgdGhlIGV4cHJlc3Npb24gNCBtb2R1bG8gNQotOwljbGR3eCw0ICVyNSgwLCVyNCksJXIlcjI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWJmYzNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvci5zCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgZGVjaW1hbCBjb3JyZWN0aW9uIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlkY29yICVyNCwlcjUKLQlkY29yLHNieiAlcjQsJXI1Ci0JZGNvcixzaHogJXI0LCVyNQotCWRjb3Isc2RjICVyNCwlcjUKLQlkY29yLHNiYyAlcjQsJXI1Ci0JZGNvcixzaGMgJXI0LCVyNQotCWRjb3IsdHIgJXI0LCVyNQotCWRjb3IsbmJ6ICVyNCwlcjUKLQlkY29yLG5oeiAlcjQsJXI1Ci0JZGNvcixuZGMgJXI0LCVyNQotCWRjb3IsbmJjICVyNCwlcjUKLQlkY29yLG5oYyAlcjQsJXI1Ci0KLQlpZGNvciAlcjQsJXI1Ci0JaWRjb3Isc2J6ICVyNCwlcjUKLQlpZGNvcixzaHogJXI0LCVyNQotCWlkY29yLHNkYyAlcjQsJXI1Ci0JaWRjb3Isc2JjICVyNCwlcjUKLQlpZGNvcixzaGMgJXI0LCVyNQotCWlkY29yLHRyICVyNCwlcjUKLQlpZGNvcixuYnogJXI0LCVyNQotCWlkY29yLG5oeiAlcjQsJXI1Ci0JaWRjb3IsbmRjICVyNCwlcjUKLQlpZGNvcixuYmMgJXI0LCVyNQotCWlkY29yLG5oYyAlcjQsJXI1Ci0KLQlkY29yLGkgJXI0LCVyNQotCWRjb3IsaSxzYnogJXI0LCVyNQotCWRjb3IsaSxzaHogJXI0LCVyNQotCWRjb3IsaSxzZGMgJXI0LCVyNQotCWRjb3IsaSxzYmMgJXI0LCVyNQotCWRjb3IsaSxzaGMgJXI0LCVyNQotCWRjb3IsaSx0ciAlcjQsJXI1Ci0JZGNvcixpLG5ieiAlcjQsJXI1Ci0JZGNvcixpLG5oeiAlcjQsJXI1Ci0JZGNvcixpLG5kYyAlcjQsJXI1Ci0JZGNvcixpLG5iYyAlcjQsJXI1Ci0JZGNvcixpLG5oYyAlcjQsJXI1Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvcjIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvcjIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkZGMxZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEyLjAgZGVjaW1hbCBjb3JyZWN0aW9uIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlkY29yLCogJXI0LCVyNQotCWRjb3IsKnNieiAlcjQsJXI1Ci0JZGNvciwqc2h6ICVyNCwlcjUKLQlkY29yLCpzZGMgJXI0LCVyNQotCWRjb3IsKnNiYyAlcjQsJXI1Ci0JZGNvciwqc2hjICVyNCwlcjUKLQlkY29yLCp0ciAlcjQsJXI1Ci0JZGNvciwqbmJ6ICVyNCwlcjUKLQlkY29yLCpuaHogJXI0LCVyNQotCWRjb3IsKm5kYyAlcjQsJXI1Ci0JZGNvciwqbmJjICVyNCwlcjUKLQlkY29yLCpuaGMgJXI0LCVyNQotCi0JZGNvcixpLCogJXI0LCVyNQotCWRjb3IsaSwqc2J6ICVyNCwlcjUKLQlkY29yLGksKnNoeiAlcjQsJXI1Ci0JZGNvcixpLCpzZGMgJXI0LCVyNQotCWRjb3IsaSwqc2JjICVyNCwlcjUKLQlkY29yLGksKnNoYyAlcjQsJXI1Ci0JZGNvcixpLCp0ciAlcjQsJXI1Ci0JZGNvcixpLCpuYnogJXI0LCVyNQotCWRjb3IsaSwqbmh6ICVyNCwlcjUKLQlkY29yLGksKm5kYyAlcjQsJXI1Ci0JZGNvcixpLCpuYmMgJXI0LCVyNQotCWRjb3IsaSwqbmhjICVyNCwlcjUKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhN2RjYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQucworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JemRlcCAlcjQsNSwxMCwlcjYKLQl6ZGVwLD0gJXI0LDUsMTAsJXI2Ci0JemRlcCw8ICVyNCw1LDEwLCVyNgotCXpkZXAsb2QgJXI0LDUsMTAsJXI2Ci0JemRlcCx0ciAlcjQsNSwxMCwlcjYKLQl6ZGVwLDw+ICVyNCw1LDEwLCVyNgotCXpkZXAsPj0gJXI0LDUsMTAsJXI2Ci0JemRlcCxldiAlcjQsNSwxMCwlcjYKLQotCWRlcCAlcjQsNSwxMCwlcjYKLQlkZXAsPSAlcjQsNSwxMCwlcjYKLQlkZXAsPCAlcjQsNSwxMCwlcjYKLQlkZXAsb2QgJXI0LDUsMTAsJXI2Ci0JZGVwLHRyICVyNCw1LDEwLCVyNgotCWRlcCw8PiAlcjQsNSwxMCwlcjYKLQlkZXAsPj0gJXI0LDUsMTAsJXI2Ci0JZGVwLGV2ICVyNCw1LDEwLCVyNgotCi0JenZkZXAgJXI0LDUsJXI2Ci0JenZkZXAsPSAlcjQsNSwlcjYKLQl6dmRlcCw8ICVyNCw1LCVyNgotCXp2ZGVwLG9kICVyNCw1LCVyNgotCXp2ZGVwLHRyICVyNCw1LCVyNgotCXp2ZGVwLDw+ICVyNCw1LCVyNgotCXp2ZGVwLD49ICVyNCw1LCVyNgotCXp2ZGVwLGV2ICVyNCw1LCVyNgotCi0JdmRlcCAlcjQsNSwlcjYKLQl2ZGVwLD0gJXI0LDUsJXI2Ci0JdmRlcCw8ICVyNCw1LCVyNgotCXZkZXAsb2QgJXI0LDUsJXI2Ci0JdmRlcCx0ciAlcjQsNSwlcjYKLQl2ZGVwLDw+ICVyNCw1LCVyNgotCXZkZXAsPj0gJXI0LDUsJXI2Ci0JdmRlcCxldiAlcjQsNSwlcjYKLQotCXZkZXBpIC0xLDUsJXI2Ci0JdmRlcGksPSAtMSw1LCVyNgotCXZkZXBpLDwgLTEsNSwlcjYKLQl2ZGVwaSxvZCAtMSw1LCVyNgotCXZkZXBpLHRyIC0xLDUsJXI2Ci0JdmRlcGksPD4gLTEsNSwlcjYKLQl2ZGVwaSw+PSAtMSw1LCVyNgotCXZkZXBpLGV2IC0xLDUsJXI2Ci0KLQl6dmRlcGkgLTEsNSwlcjYKLQl6dmRlcGksPSAtMSw1LCVyNgotCXp2ZGVwaSw8IC0xLDUsJXI2Ci0JenZkZXBpLG9kIC0xLDUsJXI2Ci0JenZkZXBpLHRyIC0xLDUsJXI2Ci0JenZkZXBpLDw+IC0xLDUsJXI2Ci0JenZkZXBpLD49IC0xLDUsJXI2Ci0JenZkZXBpLGV2IC0xLDUsJXI2Ci0KLQlkZXBpIC0xLDQsMTAsJXI2Ci0JZGVwaSw9IC0xLDQsMTAsJXI2Ci0JZGVwaSw8IC0xLDQsMTAsJXI2Ci0JZGVwaSxvZCAtMSw0LDEwLCVyNgotCWRlcGksdHIgLTEsNCwxMCwlcjYKLQlkZXBpLDw+IC0xLDQsMTAsJXI2Ci0JZGVwaSw+PSAtMSw0LDEwLCVyNgotCWRlcGksZXYgLTEsNCwxMCwlcjYKLQotCXpkZXBpIC0xLDQsMTAsJXI2Ci0JemRlcGksPSAtMSw0LDEwLCVyNgotCXpkZXBpLDwgLTEsNCwxMCwlcjYKLQl6ZGVwaSxvZCAtMSw0LDEwLCVyNgotCXpkZXBpLHRyIC0xLDQsMTAsJXI2Ci0JemRlcGksPD4gLTEsNCwxMCwlcjYKLQl6ZGVwaSw+PSAtMSw0LDEwLCVyNgotCXpkZXBpLGV2IC0xLDQsMTAsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiNzU5Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBEZXBvc2l0IGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlkZXB3LHogJXI0LDUsMTAsJXI2Ci0JZGVwdyx6LD0gJXI0LDUsMTAsJXI2Ci0JZGVwdyx6LDwgJXI0LDUsMTAsJXI2Ci0JZGVwdyx6LG9kICVyNCw1LDEwLCVyNgotCWRlcHcseix0ciAlcjQsNSwxMCwlcjYKLQlkZXB3LHosPD4gJXI0LDUsMTAsJXI2Ci0JZGVwdyx6LD49ICVyNCw1LDEwLCVyNgotCWRlcHcseixldiAlcjQsNSwxMCwlcjYKLQotCWRlcHcgJXI0LDUsMTAsJXI2Ci0JZGVwdyw9ICVyNCw1LDEwLCVyNgotCWRlcHcsPCAlcjQsNSwxMCwlcjYKLQlkZXB3LG9kICVyNCw1LDEwLCVyNgotCWRlcHcsdHIgJXI0LDUsMTAsJXI2Ci0JZGVwdyw8PiAlcjQsNSwxMCwlcjYKLQlkZXB3LD49ICVyNCw1LDEwLCVyNgotCWRlcHcsZXYgJXI0LDUsMTAsJXI2Ci0KLQlkZXB3LHoJJXI0LCVzYXIsNSwlcjYKLQlkZXB3LHosPSAlcjQsJXNhciw1LCVyNgotCWRlcHcseiw8ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LG9kICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LHRyICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LDw+ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LD49ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LGV2ICVyNCwlc2FyLDUsJXI2Ci0KLQlkZXB3ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyw9ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyw8ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyxvZCAlcjQsJXNhciw1LCVyNgotCWRlcHcsdHIgJXI0LCVzYXIsNSwlcjYKLQlkZXB3LDw+ICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyw+PSAlcjQsJXNhciw1LCVyNgotCWRlcHcsZXYgJXI0LCVzYXIsNSwlcjYKLQotCWRlcHdpIC0xLCVzYXIsNSwlcjYKLQlkZXB3aSw9IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSw8IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSxvZCAtMSwlc2FyLDUsJXI2Ci0JZGVwd2ksdHIgLTEsJXNhciw1LCVyNgotCWRlcHdpLDw+IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSw+PSAtMSwlc2FyLDUsJXI2Ci0JZGVwd2ksZXYgLTEsJXNhciw1LCVyNgotCi0JZGVwd2kseiAtMSwlc2FyLDUsJXI2Ci0JZGVwd2kseiw9IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSx6LDwgLTEsJXNhciw1LCVyNgotCWRlcHdpLHosb2QgLTEsJXNhciw1LCVyNgotCWRlcHdpLHosdHIgLTEsJXNhciw1LCVyNgotCWRlcHdpLHosPD4gLTEsJXNhciw1LCVyNgotCWRlcHdpLHosPj0gLTEsJXNhciw1LCVyNgotCWRlcHdpLHosZXYgLTEsJXNhciw1LCVyNgotCi0JZGVwd2kgLTEsNCwxMCwlcjYKLQlkZXB3aSw9IC0xLDQsMTAsJXI2Ci0JZGVwd2ksPCAtMSw0LDEwLCVyNgotCWRlcHdpLG9kIC0xLDQsMTAsJXI2Ci0JZGVwd2ksdHIgLTEsNCwxMCwlcjYKLQlkZXB3aSw8PiAtMSw0LDEwLCVyNgotCWRlcHdpLD49IC0xLDQsMTAsJXI2Ci0JZGVwd2ksZXYgLTEsNCwxMCwlcjYKLQotCWRlcHdpLHoJLTEsNCwxMCwlcjYKLQlkZXB3aSx6LD0gLTEsNCwxMCwlcjYKLQlkZXB3aSx6LDwgLTEsNCwxMCwlcjYKLQlkZXB3aSx6LG9kIC0xLDQsMTAsJXI2Ci0JZGVwd2kseix0ciAtMSw0LDEwLCVyNgotCWRlcHdpLHosPD4gLTEsNCwxMCwlcjYKLQlkZXB3aSx6LD49IC0xLDQsMTAsJXI2Ci0JZGVwd2kseixldiAtMSw0LDEwLCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI3MTE3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdDMucworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQSAyLjAgRGVwb3NpdCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZGVwZCx6LCogJXI0LDEwLDUsJXI2Ci0JZGVwZCx6LCo9ICVyNCwxMCw1LCVyNgotCWRlcGQseiwqPCAlcjQsMTAsNSwlcjYKLQlkZXBkLHosKm9kICVyNCwxMCw1LCVyNgotCWRlcGQseiwqdHIgJXI0LDEwLDUsJXI2Ci0JZGVwZCx6LCo8PiAlcjQsMTAsNSwlcjYKLQlkZXBkLHosKj49ICVyNCwxMCw1LCVyNgotCWRlcGQseiwqZXYgJXI0LDEwLDUsJXI2Ci0KLQlkZXBkLCogJXI0LDEwLDUsJXI2Ci0JZGVwZCwqPSAlcjQsMTAsNSwlcjYKLQlkZXBkLCo8ICVyNCwxMCw1LCVyNgotCWRlcGQsKm9kICVyNCwxMCw1LCVyNgotCWRlcGQsKnRyICVyNCwxMCw1LCVyNgotCWRlcGQsKjw+ICVyNCwxMCw1LCVyNgotCWRlcGQsKj49ICVyNCwxMCw1LCVyNgotCWRlcGQsKmV2ICVyNCwxMCw1LCVyNgotCi0JZGVwZCx6LCogJXI0LCVzYXIsNSwlcjYKLQlkZXBkLHosKj0gJXI0LCVzYXIsNSwlcjYKLQlkZXBkLHosKjwgJXI0LCVzYXIsNSwlcjYKLQlkZXBkLHosKm9kICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCx6LCp0ciAlcjQsJXNhciw1LCVyNgotCWRlcGQseiwqPD4gJXI0LCVzYXIsNSwlcjYKLQlkZXBkLHosKj49ICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCx6LCpldiAlcjQsJXNhciw1LCVyNgotCi0JZGVwZCwqICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCwqPSAlcjQsJXNhciw1LCVyNgotCWRlcGQsKjwgJXI0LCVzYXIsNSwlcjYKLQlkZXBkLCpvZCAlcjQsJXNhciw1LCVyNgotCWRlcGQsKnRyICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCwqPD4gJXI0LCVzYXIsNSwlcjYKLQlkZXBkLCo+PSAlcjQsJXNhciw1LCVyNgotCWRlcGQsKmV2ICVyNCwlc2FyLDUsJXI2Ci0KLQlkZXBkaSwqIC0xLCVzYXIsNSwlcjYKLQlkZXBkaSwqPSAtMSwlc2FyLDUsJXI2Ci0JZGVwZGksKjwgLTEsJXNhciw1LCVyNgotCWRlcGRpLCpvZCAtMSwlc2FyLDUsJXI2Ci0JZGVwZGksKnRyIC0xLCVzYXIsNSwlcjYKLQlkZXBkaSwqPD4gLTEsJXNhciw1LCVyNgotCWRlcGRpLCo+PSAtMSwlc2FyLDUsJXI2Ci0JZGVwZGksKmV2IC0xLCVzYXIsNSwlcjYKLQotCWRlcGRpLHosKiAtMSwlc2FyLDUsJXI2Ci0JZGVwZGkseiwqPSAtMSwlc2FyLDUsJXI2Ci0JZGVwZGkseiwqPCAtMSwlc2FyLDUsJXI2Ci0JZGVwZGkseiwqb2QgLTEsJXNhciw1LCVyNgotCWRlcGRpLHosKnRyIC0xLCVzYXIsNSwlcjYKLQlkZXBkaSx6LCo8PiAtMSwlc2FyLDUsJXI2Ci0JZGVwZGkseiwqPj0gLTEsJXNhciw1LCVyNgotCWRlcGRpLHosKmV2IC0xLCVzYXIsNSwlcjYKLQotCWRlcGRpLCogLTEsMTAsNCwlcjYKLQlkZXBkaSwqPSAtMSwxMCw0LCVyNgotCWRlcGRpLCo8IC0xLDEwLDQsJXI2Ci0JZGVwZGksKm9kIC0xLDEwLDQsJXI2Ci0JZGVwZGksKnRyIC0xLDEwLDQsJXI2Ci0JZGVwZGksKjw+IC0xLDEwLDQsJXI2Ci0JZGVwZGksKj49IC0xLDEwLDQsJXI2Ci0JZGVwZGksKmV2IC0xLDEwLDQsJXI2Ci0KLQlkZXBkaSx6LCogLTEsMTAsNCwlcjYKLQlkZXBkaSx6LCo9IC0xLDEwLDQsJXI2Ci0JZGVwZGkseiwqPCAtMSwxMCw0LCVyNgotCWRlcGRpLHosKm9kIC0xLDEwLDQsJXI2Ci0JZGVwZGkseiwqdHIgLTEsMTAsNCwlcjYKLQlkZXBkaSx6LCo8PiAtMSwxMCw0LCVyNgotCWRlcGRpLHosKj49IC0xLDEwLDQsJXI2Ci0JZGVwZGkseiwqZXYgLTEsMTAsNCwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5ZDQ0NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWRzICVyNCwlcjUsJXI2Ci0JZHMsPSAlcjQsJXI1LCVyNgotCWRzLDwgJXI0LCVyNSwlcjYKLQlkcyw8PSAlcjQsJXI1LCVyNgotCWRzLDw8ICVyNCwlcjUsJXI2Ci0JZHMsPDw9ICVyNCwlcjUsJXI2Ci0JZHMsc3YgJXI0LCVyNSwlcjYKLQlkcyxvZCAlcjQsJXI1LCVyNgotCWRzLHRyICVyNCwlcjUsJXI2Ci0JZHMsPD4gJXI0LCVyNSwlcjYKLQlkcyw+PSAlcjQsJXI1LCVyNgotCWRzLD4gJXI0LCVyNSwlcjYKLQlkcyw+Pj0gJXI0LCVyNSwlcjYKLQlkcyw+PiAlcjQsJXI1LCVyNgotCWRzLG5zdiAlcjQsJXI1LCVyNgotCWRzLGV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2I1YThkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlleHRydSAlcjQsNSwxMCwlcjYKLQlleHRydSw9ICVyNCw1LDEwLCVyNgotCWV4dHJ1LDwgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsb2QgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsdHIgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsPD4gJXI0LDUsMTAsJXI2Ci0JZXh0cnUsPj0gJXI0LDUsMTAsJXI2Ci0JZXh0cnUsZXYgJXI0LDUsMTAsJXI2Ci0KLQlleHRycyAlcjQsNSwxMCwlcjYKLQlleHRycyw9ICVyNCw1LDEwLCVyNgotCWV4dHJzLDwgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsb2QgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsdHIgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsPD4gJXI0LDUsMTAsJXI2Ci0JZXh0cnMsPj0gJXI0LDUsMTAsJXI2Ci0JZXh0cnMsZXYgJXI0LDUsMTAsJXI2Ci0KLQl2ZXh0cnUgJXI0LDUsJXI2Ci0JdmV4dHJ1LD0gJXI0LDUsJXI2Ci0JdmV4dHJ1LDwgJXI0LDUsJXI2Ci0JdmV4dHJ1LG9kICVyNCw1LCVyNgotCXZleHRydSx0ciAlcjQsNSwlcjYKLQl2ZXh0cnUsPD4gJXI0LDUsJXI2Ci0JdmV4dHJ1LD49ICVyNCw1LCVyNgotCXZleHRydSxldiAlcjQsNSwlcjYKLQotCXZleHRycyAlcjQsNSwlcjYKLQl2ZXh0cnMsPSAlcjQsNSwlcjYKLQl2ZXh0cnMsPCAlcjQsNSwlcjYKLQl2ZXh0cnMsb2QgJXI0LDUsJXI2Ci0JdmV4dHJzLHRyICVyNCw1LCVyNgotCXZleHRycyw8PiAlcjQsNSwlcjYKLQl2ZXh0cnMsPj0gJXI0LDUsJXI2Ci0JdmV4dHJzLGV2ICVyNCw1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc1YmE3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdDIucworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZXh0cncsdSAlcjQsNSwxMCwlcjYKLQlleHRydyx1LD0gJXI0LDUsMTAsJXI2Ci0JZXh0cncsdSw8ICVyNCw1LDEwLCVyNgotCWV4dHJ3LHUsb2QgJXI0LDUsMTAsJXI2Ci0JZXh0cncsdSx0ciAlcjQsNSwxMCwlcjYKLQlleHRydyx1LDw+ICVyNCw1LDEwLCVyNgotCWV4dHJ3LHUsPj0gJXI0LDUsMTAsJXI2Ci0JZXh0cncsdSxldiAlcjQsNSwxMCwlcjYKLQotCWV4dHJ3LHMgJXI0LDUsMTAsJXI2Ci0JZXh0cncscyw9ICVyNCw1LDEwLCVyNgotCWV4dHJ3LHMsPCAlcjQsNSwxMCwlcjYKLQlleHRydyxzLG9kICVyNCw1LDEwLCVyNgotCWV4dHJ3LHRyICVyNCw1LDEwLCVyNgotCWV4dHJ3LDw+ICVyNCw1LDEwLCVyNgotCWV4dHJ3LD49ICVyNCw1LDEwLCVyNgotCWV4dHJ3LGV2ICVyNCw1LDEwLCVyNgotCi0JZXh0cncsdSAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHUsPSAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHUsPCAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHUsb2QgJXI0LCVzYXIsNSwlcjYKLQlleHRydyx1LHRyICVyNCwlc2FyLDUsJXI2Ci0JZXh0cncsdSw8PiAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHUsPj0gJXI0LCVzYXIsNSwlcjYKLQlleHRydyx1LGV2ICVyNCwlc2FyLDUsJXI2Ci0JCi0JZXh0cncscyAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHMsPSAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHMsPCAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHMsb2QgJXI0LCVzYXIsNSwlcjYKLQlleHRydyx0ciAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LDw+ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cncsPj0gJXI0LCVzYXIsNSwlcjYKLQlleHRydyxldiAlcjQsJXNhciw1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTAxY2ViLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdDMucworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWV4dHJkLHUsKiAlcjQsMTAsNSwlcjYKLQlleHRyZCx1LCo9ICVyNCwxMCw1LCVyNgotCWV4dHJkLHUsKjwgJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqb2QgJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqdHIgJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqPD4gJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqPj0gJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqZXYgJXI0LDEwLDUsJXI2Ci0KLQlleHRyZCxzLCogJXI0LDEwLDUsJXI2Ci0JZXh0cmQscywqPSAlcjQsMTAsNSwlcjYKLQlleHRyZCxzLCo8ICVyNCwxMCw1LCVyNgotCWV4dHJkLHMsKm9kICVyNCwxMCw1LCVyNgotCWV4dHJkLCp0ciAlcjQsMTAsNSwlcjYKLQlleHRyZCwqPD4gJXI0LDEwLDUsJXI2Ci0JZXh0cmQsKj49ICVyNCwxMCw1LCVyNgotCWV4dHJkLCpldiAlcjQsMTAsNSwlcjYKLQotCWV4dHJkLHUsKiAlcjQsJXNhciw1LCVyNgotCWV4dHJkLHUsKj0gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCx1LCo8ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsdSwqb2QgJXI0LCVzYXIsNSwlcjYKLQlleHRyZCx1LCp0ciAlcjQsJXNhciw1LCVyNgotCWV4dHJkLHUsKjw+ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsdSwqPj0gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCx1LCpldiAlcjQsJXNhciw1LCVyNgotCQotCWV4dHJkLHMsKiAlcjQsJXNhciw1LCVyNgotCWV4dHJkLHMsKj0gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCxzLCo8ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQscywqb2QgJXI0LCVzYXIsNSwlcjYKLQlleHRyZCwqdHIgJXI0LCVzYXIsNSwlcjYKLQlleHRyZCwqPD4gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCwqPj0gJXI0LCVzYXIsNSwlcjYKLQlleHRyZCwqZXYgJXI0LCVzYXIsNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDJiZTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZsZHd4ICVyNCglc3IwLCVyNSksJWZyNgotCWZsZHd4LHMgJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkd3gsbSAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGR3eCxzbSAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGRkeCAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGRkeCxzICVyNCglc3IwLCVyNSksJWZyNgotCWZsZGR4LG0gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHgsc20gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZnN0d3ggJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0d3gscyAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3R3eCxtICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHd4LHNtICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdGR4ICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdGR4LHMgJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0ZHgsbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RkeCxzbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RxeCAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RxeCxzICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHF4LG0gJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0cXgsc20gJWZyNiwlcjQoJXNyMCwlcjUpCi0KLQlmbGR3cyAwKCVzcjAsJXI1KSwlZnI2Ci0JZmxkd3MsbWIgMCglc3IwLCVyNSksJWZyNgotCWZsZHdzLG1hIDAoJXNyMCwlcjUpLCVmcjYKLQlmbGRkcyAwKCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHMsbWIgMCglc3IwLCVyNSksJWZyNgotCWZsZGRzLG1hIDAoJXNyMCwlcjUpLCVmcjYKLQlmc3R3cyAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0d3MsbWIgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHdzLG1hICVmcjYsMCglc3IwLCVyNSkKLQlmc3RkcyAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0ZHMsbWIgJWZyNiwwKCVzcjAsJXI1KQotCWZzdGRzLG1hICVmcjYsMCglc3IwLCVyNSkKLQlmc3RxcyAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0cXMsbWIgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHFzLG1hICVmcjYsMCglc3IwLCVyNSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMzMGJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0JLmNvZGUKLQkuZXhwb3J0CQlmCi1mCi0JLnByb2MKLQkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscwotCS5lbnRyeQotCi0JZnN0d3MJCSVmcjZSLDAoJXIyNikKLQlmc3R3cwkJJWZyNkwsNCglcjI2KQotCWZzdHdzCQklZnI2LDgoJXIyNikKLQotCWZzdGRzCQklZnI2UiwwKCVyMjYpCi0JZnN0ZHMJCSVmcjZMLDQoJXIyNikKLQlmc3RkcwkJJWZyNiw4KCVyMjYpCi0KLQlmbGR3cwkJMCglcjI2KSwlZnI2UgotCWZsZHdzCQk0KCVyMjYpLCVmcjZMCi0JZmxkd3MJCTgoJXIyNiksJWZyNgotCi0JZmxkZHMJCTAoJXIyNiksJWZyNlIKLQlmbGRkcwkJNCglcjI2KSwlZnI2TAotCWZsZGRzCQk4KCVyMjYpLCVmcjYKLQotCWZzdHdzCQklZnI2UiwwKCVzcjAsJXIyNikKLQlmc3R3cwkJJWZyNkwsNCglc3IwLCVyMjYpCi0JZnN0d3MJCSVmcjYsOCglc3IwLCVyMjYpCi0KLQlmc3RkcwkJJWZyNlIsMCglc3IwLCVyMjYpCi0JZnN0ZHMJCSVmcjZMLDQoJXNyMCwlcjI2KQotCWZzdGRzCQklZnI2LDgoJXNyMCwlcjI2KQotCi0JZmxkd3MJCTAoJXNyMCwlcjI2KSwlZnI2UgotCWZsZHdzCQk0KCVzcjAsJXIyNiksJWZyNkwKLQlmbGR3cwkJOCglc3IwLCVyMjYpLCVmcjYKLQotCWZsZGRzCQkwKCVzcjAsJXIyNiksJWZyNlIKLQlmbGRkcwkJNCglc3IwLCVyMjYpLCVmcjZMCi0JZmxkZHMJCTgoJXNyMCwlcjI2KSwlZnI2Ci0KLQlmc3R3eAkJJWZyNlIsJXIyNSglcjI2KQotCWZzdHd4CQklZnI2TCwlcjI1KCVyMjYpCi0JZnN0d3gJCSVmcjYsJXIyNSglcjI2KQotCi0JZnN0ZHgJCSVmcjZSLCVyMjUoJXIyNikKLQlmc3RkeAkJJWZyNkwsJXIyNSglcjI2KQotCWZzdGR4CQklZnI2LCVyMjUoJXIyNikKLQotCWZsZHd4CQklcjI1KCVyMjYpLCVmcjZSCi0JZmxkd3gJCSVyMjUoJXIyNiksJWZyNkwKLQlmbGR3eAkJJXIyNSglcjI2KSwlZnI2Ci0KLQlmbGRkeAkJJXIyNSglcjI2KSwlZnI2UgotCWZsZGR4CQklcjI1KCVyMjYpLCVmcjZMCi0JZmxkZHgJCSVyMjUoJXIyNiksJWZyNgotCi0JZnN0d3gJCSVmcjZSLCVyMjUoJXNyMCwlcjI2KQotCWZzdHd4CQklZnI2TCwlcjI1KCVzcjAsJXIyNikKLQlmc3R3eAkJJWZyNiwlcjI1KCVzcjAsJXIyNikKLQotCWZzdGR4CQklZnI2UiwlcjI1KCVzcjAsJXIyNikKLQlmc3RkeAkJJWZyNkwsJXIyNSglc3IwLCVyMjYpCi0JZnN0ZHgJCSVmcjYsJXIyNSglc3IwLCVyMjYpCi0KLQlmbGR3eAkJJXIyNSglc3IwLCVyMjYpLCVmcjZSCi0JZmxkd3gJCSVyMjUoJXNyMCwlcjI2KSwlZnI2TAotCWZsZHd4CQklcjI1KCVzcjAsJXIyNiksJWZyNgotCi0JZmxkZHgJCSVyMjUoJXNyMCwlcjI2KSwlZnI2UgotCWZsZGR4CQklcjI1KCVzcjAsJXIyNiksJWZyNkwKLQlmbGRkeAkJJXIyNSglc3IwLCVyMjYpLCVmcjYKLQotCWJ2CQklcjAoJXIyKQotCW5vcAotCi0JLmV4aXQKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4ZTJkNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAucworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZmNweSxzZ2wgJWZyNSwlZnIxMAotCWZjcHksZGJsICVmcjUsJWZyMTAKLQlmY3B5LHF1YWQgJWZyNSwlZnIxMAotCWZjcHksc2dsICVmcjIwLCVmcjI0Ci0JZmNweSxkYmwgJWZyMjAsJWZyMjQKLQotCWZhYnMsc2dsICVmcjUsJWZyMTAKLQlmYWJzLGRibCAlZnI1LCVmcjEwCi0JZmFicyxxdWFkICVmcjUsJWZyMTAKLQlmYWJzLHNnbCAlZnIyMCwlZnIyNAotCWZhYnMsZGJsICVmcjIwLCVmcjI0Ci0KLQlmc3FydCxzZ2wgJWZyNSwlZnIxMAotCWZzcXJ0LGRibCAlZnI1LCVmcjEwCi0JZnNxcnQscXVhZCAlZnI1LCVmcjEwCi0JZnNxcnQsc2dsICVmcjIwLCVmcjI0Ci0JZnNxcnQsZGJsICVmcjIwLCVmcjI0Ci0KLQlmcm5kLHNnbCAlZnI1LCVmcjEwCi0JZnJuZCxkYmwgJWZyNSwlZnIxMAotCWZybmQscXVhZCAlZnI1LCVmcjEwCi0JZnJuZCxzZ2wgJWZyMjAsJWZyMjQKLQlmcm5kLGRibCAlZnIyMCwlZnIyNAotCQotCWZhZGQsc2dsICVmcjQsJWZyOCwlZnIxMgotCWZhZGQsZGJsICVmcjQsJWZyOCwlZnIxMgotCWZhZGQscXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmYWRkLHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZhZGQsZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZmFkZCxxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmc3ViLHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmc3ViLGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmc3ViLHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZnN1YixzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmc3ViLGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZzdWIscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZm1weSxzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZm1weSxkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZm1weSxxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZtcHksc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZm1weSxkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmbXB5LHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZkaXYsc2dsICVmcjQsJWZyOCwlZnIxMgotCWZkaXYsZGJsICVmcjQsJWZyOCwlZnIxMgotCWZkaXYscXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmZGl2LHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZkaXYsZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZmRpdixxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmcmVtLHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmcmVtLGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmcmVtLHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZnJlbSxzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmcmVtLGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZyZW0scXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZm1weWFkZCxzZ2wgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKLQlmbXB5YWRkLGRibCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAotCWZtcHlzdWIsc2dsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCi0JZm1weXN1YixkYmwgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKLQotCXhtcHl1ICVmcjQsJWZyNSwlZnI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTAyYjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZm1weWZhZGQsc2dsICVmcjVSLCVmcjEwTCwlZnIxM1IsJWZyMTRMCi0JZm1weWZhZGQsZGJsICVmcjUsJWZyMTAsJWZyMTMsJWZyMTQKLQlmbXB5ZmFkZCxzZ2wgJWZyMThSLCVmcjI3TCwlZnI2UiwlZnIyMUwKLQlmbXB5ZmFkZCxkYmwgJWZyMTgsJWZyMjcsJWZyNiwlZnIyMQotCi0JZm1weW5mYWRkLHNnbCAlZnI1UiwlZnIxMEwsJWZyMTNSLCVmcjE0TAotCWZtcHluZmFkZCxkYmwgJWZyNSwlZnIxMCwlZnIxMywlZnIxNAotCWZtcHluZmFkZCxzZ2wgJWZyMThSLCVmcjI3TCwlZnI2UiwlZnIyMUwKLQlmbXB5bmZhZGQsZGJsICVmcjE4LCVmcjI3LCVmcjYsJWZyMjEKLQotCWZuZWcsc2dsICVmcjUsJWZyMTBSCi0JZm5lZyxkYmwgJWZyNSwlZnIxMAotCWZuZWcscXVhZCAlZnI1LCVmcjEwCi0JZm5lZyxzZ2wgJWZyMjBSLCVmcjI0TAotCWZuZWcsZGJsICVmcjIwLCVmcjI0Ci0KLQlmbmVnYWJzLHNnbCAlZnI1LCVmcjEwUgotCWZuZWdhYnMsZGJsICVmcjUsJWZyMTAKLQlmbmVnYWJzLHF1YWQgJWZyNSwlZnIxMAotCWZuZWdhYnMsc2dsICVmcjIwUiwlZnIyNEwKLQlmbmVnYWJzLGRibCAlZnIyMCwlZnIyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbnYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29udi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmU4YTFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29udi5zCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmY252ZmYsc2dsLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZmLHNnbCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmZixzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZmLGRibCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmZixkYmwsZGJsICVmcjUsJWZyMTAKLQlmY252ZmYsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmZixxdWFkLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZmLHF1YWQsZGJsICVmcjUsJWZyMTAKLQlmY252ZmYscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZmYsc2dsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmZixzZ2wsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZmLHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZmLGRibCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZmYsZGJsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmZixkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmZixxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQotCWZjbnZ4ZixzZ2wsc2dsICVmcjUsJWZyMTAKLQlmY252eGYsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudnhmLHNnbCxxdWFkICVmcjUsJWZyMTAKLQlmY252eGYsZGJsLHNnbCAlZnI1LCVmcjEwCi0JZmNudnhmLGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZ4ZixkYmwscXVhZCAlZnI1LCVmcjEwCi0JZmNudnhmLHF1YWQsc2dsICVmcjUsJWZyMTAKLQlmY252eGYscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZ4ZixxdWFkLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZ4ZixzZ2wsc2dsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252eGYsc2dsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252eGYsZGJsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudnhmLGRibCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQsc2dsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHF1YWQscXVhZCAlZnIyMCwlZnIyNAotCi0JZmNudmZ4LHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeCxzZ2wsZGJsICVmcjUsJWZyMTAKLQlmY252Zngsc2dsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeCxkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252ZngsZGJsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4LGRibCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZngscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeCxxdWFkLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4LHF1YWQscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4LHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Zngsc2dsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmeCxzZ2wscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeCxkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4LGRibCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZngsZGJsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZngscXVhZCxxdWFkICVmcjIwLCVmcjI0Ci0KLQlmY252Znh0LHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeHQsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252Znh0LGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeHQsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeHQscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252Znh0LHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Znh0LHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252Znh0LHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeHQscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Znh0LHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9mY21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2ZjbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzMTQ5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2ZjbXAucworKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZjbXAsc2dsLGZhbHNlPyAlZnI0LCVmcjUKLQlmY21wLHNnbCxmYWxzZSAlZnI0LCVmcjUKLQlmY21wLHNnbCw/ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE8PT4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPSAlZnI0LCVmcjUKLQlmY21wLHNnbCw9VCAlZnI0LCVmcjUKLQlmY21wLHNnbCw/PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPD4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT8+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCw8ICVmcjQsJWZyNQotCWZjbXAsc2dsLD88ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPz4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPzw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE+ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/PD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPiAlZnI0LCVmcjUKLQlmY21wLHNnbCw/PiAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT88ICVmcjQsJWZyNQotCWZjbXAsc2dsLD49ICVmcjQsJWZyNQotCWZjbXAsc2dsLD8+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPCAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPz0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPD4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT1UICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/ICVmcjQsJWZyNQotCWZjbXAsc2dsLDw9PiAlZnI0LCVmcjUKLQlmY21wLHNnbCx0cnVlPyAlZnI0LCVmcjUKLQlmY21wLHNnbCx0cnVlICVmcjQsJWZyNQotCi0JZmNtcCxkYmwsZmFsc2U/ICVmcjQsJWZyNQotCWZjbXAsZGJsLGZhbHNlICVmcjQsJWZyNQotCWZjbXAsZGJsLD8gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsITw9PiAlZnI0LCVmcjUKLQlmY21wLGRibCw9ICVmcjQsJWZyNQotCWZjbXAsZGJsLD1UICVmcjQsJWZyNQotCWZjbXAsZGJsLD89ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8PiAlZnI0LCVmcjUKLQlmY21wLGRibCwhPz49ICVmcjQsJWZyNQotCWZjbXAsZGJsLDwgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPzwgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT49ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/PiAlZnI0LCVmcjUKLQlmY21wLGRibCw8PSAlZnI0LCVmcjUKLQlmY21wLGRibCw/PD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT88PSAlZnI0LCVmcjUKLQlmY21wLGRibCw+ICVmcjQsJWZyNQotCWZjbXAsZGJsLD8+ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPzwgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPj0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPz49ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/PSAlZnI0LCVmcjUKLQlmY21wLGRibCw8PiAlZnI0LCVmcjUKLQlmY21wLGRibCwhPSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPVQgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT8gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPD0+ICVmcjQsJWZyNQotCWZjbXAsZGJsLHRydWU/ICVmcjQsJWZyNQotCWZjbXAsZGJsLHRydWUgJWZyNCwlZnI1Ci0KLQlmY21wLHF1YWQsZmFsc2U/ICVmcjQsJWZyNQotCWZjbXAscXVhZCxmYWxzZSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITw9PiAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPVQgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD89ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPD4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLDwgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD88ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PiAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD88PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsIT4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD8+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PCAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD8+PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITwgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPD4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE9ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPVQgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/ICVmcjQsJWZyNQotCWZjbXAscXVhZCw8PT4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLHRydWU/ICVmcjQsJWZyNQotCWZjbXAscXVhZCx0cnVlICVmcjQsJWZyNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX21pc2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyNDkzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX21pc2MucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWZwdV9taXNjX3Rlc3RzOiAKLQlmdGVzdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbWVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4YjA4MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBpbnRlZ2VyX21lbW9yeV90ZXN0cyxDT0RFCi0JLkVYUE9SVCBpbnRlZ2VyX2luZGV4aW5nX2xvYWQsQ09ERQotCS5FWFBPUlQgaW50ZWdlcl9sb2FkX3Nob3J0X21lbW9yeSxDT0RFCi0JLkVYUE9SVCBpbnRlZ2VyX3N0b3JlX3Nob3J0X21lbW9yeSxDT0RFCi0JLkVYUE9SVCBtYWluLENPREUKLQkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLTsgQmFzaWMgaW50ZWdlciBtZW1vcnkgdGVzdHMgd2hpY2ggYWxzbyB0ZXN0IHRoZSB2YXJpb3VzIAotOyBhZGRyZXNzaW5nIG1vZGVzIGFuZCBjb21wbGV0ZXJzLgotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi07IAotaW50ZWdlcl9tZW1vcnlfdGVzdHM6IAotCWxkdyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRoIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGIgMCglc3IwLCVyNCksJXIyNgotCXN0dyAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RoICVyMjYsMCglc3IwLCVyNCkKLQlzdGIgJXIyNiwwKCVzcjAsJXI0KQotCi07IFNob3VsZCBtYWtlIHN1cmUgcHJlL3Bvc3QgbW9kZXMgYXJlIHJlY29nbml6ZWQgY29ycmVjdGx5LgotCWxkd20gMCglc3IwLCVyNCksJXIyNgotCXN0d20gJXIyNiwwKCVzcjAsJXI0KQotCi1pbnRlZ2VyX2luZGV4aW5nX2xvYWQ6IAotCWxkd3ggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGR3eCxzICVyNSglc3IwLCVyNCksJXIyNgotCWxkd3gsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZHd4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCWxkaHggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRoeCxzICVyNSglc3IwLCVyNCksJXIyNgotCWxkaHgsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGh4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCWxkYnggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRieCxzICVyNSglc3IwLCVyNCksJXIyNgotCWxkYngsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGJ4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCWxkd2F4ICVyNSglcjQpLCVyMjYKLQlsZHdheCxzICVyNSglcjQpLCVyMjYKLQlsZHdheCxtICVyNSglcjQpLCVyMjYKLQlsZHdheCxzbSAlcjUoJXI0KSwlcjI2Ci0JbGRjd3ggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRjd3gscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGN3eCxtICVyNSglc3IwLCVyNCksJXIyNgotCWxkY3d4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCi1pbnRlZ2VyX2xvYWRfc2hvcnRfbWVtb3J5OiAKLQlsZHdzIDAoJXNyMCwlcjQpLCVyMjYKLQlsZHdzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZHdzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGhzIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGhzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGhzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGJzIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGJzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGJzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQlsZHdhcyAwKCVyNCksJXIyNgotCWxkd2FzLG1iIDAoJXI0KSwlcjI2Ci0JbGR3YXMsbWEgMCglcjQpLCVyMjYKLQlsZGN3cyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRjd3MsbWIgMCglc3IwLCVyNCksJXIyNgotCWxkY3dzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQotaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnk6IAotCXN0d3MgJXIyNiwwKCVzcjAsJXI0KQotCXN0d3MsbWIgJXIyNiwwKCVzcjAsJXI0KQotCXN0d3MsbWEgJXIyNiwwKCVzcjAsJXI0KQotCXN0aHMgJXIyNiwwKCVzcjAsJXI0KQotCXN0aHMsbWIgJXIyNiwwKCVzcjAsJXI0KQotCXN0aHMsbWEgJXIyNiwwKCVzcjAsJXI0KQotCXN0YnMgJXIyNiwwKCVzcjAsJXI0KQotCXN0YnMsbWIgJXIyNiwwKCVzcjAsJXI0KQotCXN0YnMsbWEgJXIyNiwwKCVzcjAsJXI0KQotCXN0d2FzICVyMjYsMCglcjQpCi0Jc3R3YXMsbWIgJXIyNiwwKCVyNCkKLQlzdHdhcyxtYSAlcjI2LDAoJXI0KQotCXN0YnlzICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxiICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxlICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxiLG0gJXIyNiwwKCVzcjAsJXI0KQotCXN0YnlzLGUsbSAlcjI2LDAoJXNyMCwlcjQpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltbWVkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltbWVkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDAwMTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWltbWVkaWF0ZV90ZXN0czogCi0JbGRvIDUoJXIyNiksJXIyNgotCWxkaWwgTCUweGRlYWRiZWVmLCVyMjYKLQlhZGRpbCBMJTB4ZGVhZGJlZWYsJXI1Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjJjNTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCW9yICVyNCwlcjUsJXI2Ci0Jb3IsPSAlcjQsJXI1LCVyNgotCW9yLDwgJXI0LCVyNSwlcjYKLQlvciw8PSAlcjQsJXI1LCVyNgotCW9yLG9kICVyNCwlcjUsJXI2Ci0Jb3IsdHIgJXI0LCVyNSwlcjYKLQlvciw8PiAlcjQsJXI1LCVyNgotCW9yLD49ICVyNCwlcjUsJXI2Ci0Jb3IsPiAlcjQsJXI1LCVyNgotCW9yLGV2ICVyNCwlcjUsJXI2Ci0KLQl4b3IgJXI0LCVyNSwlcjYKLQl4b3IsPSAlcjQsJXI1LCVyNgotCXhvciw8ICVyNCwlcjUsJXI2Ci0JeG9yLDw9ICVyNCwlcjUsJXI2Ci0JeG9yLG9kICVyNCwlcjUsJXI2Ci0JeG9yLHRyICVyNCwlcjUsJXI2Ci0JeG9yLDw+ICVyNCwlcjUsJXI2Ci0JeG9yLD49ICVyNCwlcjUsJXI2Ci0JeG9yLD4gJXI0LCVyNSwlcjYKLQl4b3IsZXYgJXI0LCVyNSwlcjYKLQotCWFuZCAlcjQsJXI1LCVyNgotCWFuZCw9ICVyNCwlcjUsJXI2Ci0JYW5kLDwgJXI0LCVyNSwlcjYKLQlhbmQsPD0gJXI0LCVyNSwlcjYKLQlhbmQsb2QgJXI0LCVyNSwlcjYKLQlhbmQsdHIgJXI0LCVyNSwlcjYKLQlhbmQsPD4gJXI0LCVyNSwlcjYKLQlhbmQsPj0gJXI0LCVyNSwlcjYKLQlhbmQsPiAlcjQsJXI1LCVyNgotCWFuZCxldiAlcjQsJXI1LCVyNgotCi0JYW5kY20gJXI0LCVyNSwlcjYKLQlhbmRjbSw9ICVyNCwlcjUsJXI2Ci0JYW5kY20sPCAlcjQsJXI1LCVyNgotCWFuZGNtLDw9ICVyNCwlcjUsJXI2Ci0JYW5kY20sb2QgJXI0LCVyNSwlcjYKLQlhbmRjbSx0ciAlcjQsJXI1LCVyNgotCWFuZGNtLDw+ICVyNCwlcjUsJXI2Ci0JYW5kY20sPj0gJXI0LCVyNSwlcjYKLQlhbmRjbSw+ICVyNCwlcjUsJXI2Ci0JYW5kY20sZXYgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9tZWRpYS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9tZWRpYS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA5NzdlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbWVkaWEucworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQTIuMCBtdWx0aW1lZGlhIChoYWxmd29yZCkgaW5zdHJ1Y3Rpb24gdGVzdHMKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0JaGFkZCAlcjcsJXIxMSwlcjEyCi0JaGFkZCxzcyAlcjcsJXIxMSwlcjEyCi0JaGFkZCx1cyAlcjcsJXIxMSwlcjEyCi0KLQloYXZnICVyNywlcjExLCVyMTIKLQloc2hsICVyNywxMywlcjExCi0JaHNobGFkZCAlcjcsMSwlcjExLCVyMTIKLQloc2hsYWRkICVyNywyLCVyMTEsJXIxMgotCWhzaGxhZGQgJXI3LDMsJXIxMSwlcjEyCi0JaHNociAlcjcsMTMsJXIxMQotCWhzaHIscyAlcjcsMTMsJXIxMQotCWhzaHIsdSAlcjcsMTMsJXIxMQotCWhzaHJhZGQgJXI3LDEsJXIxMSwlcjEyCi0JaHNocmFkZCAlcjcsMiwlcjExLCVyMTIKLQloc2hyYWRkICVyNywzLCVyMTEsJXIxMgotCi0JaHN1YiAlcjE0LCVyMjIsJXI5Ci0JaHN1YixzcyAlcjE0LCVyMjIsJXI5Ci0JaHN1Yix1cyAlcjE0LCVyMjIsJXI5Ci0KLQltaXhoLGwgJXIxNCwlcjIyLCVyOQotCW1peGgsciAlcjE0LCVyMjIsJXI5Ci0JbWl4dyxsICVyMTQsJXIyMiwlcjkKLQltaXh3LHIgJXIxNCwlcjIyLCVyOQotCi0JcGVybWgsMDMyMSAlcjIyLCVyOQotCXBlcm1oLDIyMjIgJXIyMiwlcjkKLQlwZXJtaCwzMDMwICVyMjIsJXI5Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcGVyZi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wZXJmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDAyZTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wZXJmLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEyLjAgcGVyZm9ybWFuY2UgbW9uaXRvciBpbnN0cnVjdGlvbiB0ZXN0cwotCi0KLQlwbWVuYgotCXBtZGlzCi0JcG1kaXMsbgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3B1cmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3B1cmdlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzJlZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlwZHRsYiAlcjQoJXNyMCwlcjUpCi0JcGR0bGIsbSAlcjQoJXNyMCwlcjUpCi0JcGl0bGIgJXI0KCVzcjQsJXI1KQotCXBpdGxiLG0gJXI0KCVzcjQsJXI1KQotCXBkdGxiZSAlcjQoJXNyMCwlcjUpCi0JcGR0bGJlLG0gJXI0KCVzcjAsJXI1KQotCXBpdGxiZSAlcjQoJXNyNCwlcjUpCi0JcGl0bGJlLG0gJXI0KCVzcjQsJXI1KQotCXBkYyAlcjQoJXNyMCwlcjUpCi0JcGRjLG0gJXI0KCVzcjAsJXI1KQotCWZkYyAlcjQoJXNyMCwlcjUpCi0JZmRjLG0gJXI0KCVzcjAsJXI1KQotCWZpYyAlcjQoJXNyNCwlcjUpCi0JZmljLG0gJXI0KCVzcjQsJXI1KQotCWZkY2UgJXI0KCVzcjAsJXI1KQotCWZkY2UsbSAlcjQoJXNyMCwlcjUpCi0JZmljZSAlcjQoJXNyNCwlcjUpCi0JZmljZSxtICVyNCglc3I0LCVyNSkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcHVyZ2UyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZTI4ODUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZTIucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkubGV2ZWwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQTIuMCBwdXJnZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JcGR0bGIsbCAlcjQoJXNyMCwlcjUpCi0JcGR0bGIsbCxtICVyNCglc3IwLCVyNSkKLQlwaXRsYixsICVyNCglc3I0LCVyNSkKLQlwaXRsYixsLG0gJXI0KCVzcjQsJXI1KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDFhZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gxYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTlkMWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDFhZGQucworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2gxYWRkICAlcjQsJXI1LCVyNgotCXNoMWFkZCw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw8ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw8PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsbnV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxvZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsdHIgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLDw+ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw+PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsPiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsdXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHZueiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsbnN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxldiAgJXI0LCVyNSwlcjYKLQotCXNoMWFkZGwgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLDw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsbnV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsem52ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsc3YgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCxvZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHRyICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw+PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCx1diAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHZueiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gxYWRkbyAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw8ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxudXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxzdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLG9kICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sdHIgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw8PiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLD49ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLHV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sdm56ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sbnN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sZXYgICVyNCwlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMmFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBjOGQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXNoMmFkZCAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPSAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPCAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLG51diAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsem52ICAlcjQsJXI1LCVyNgotCXNoMmFkZCxzdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsb2QgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLHRyICAlcjQsJXI1LCVyNgotCXNoMmFkZCw8PiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPj0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLHV2ICAlcjQsJXI1LCVyNgotCXNoMmFkZCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDJhZGRsICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLDwgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLHN2ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsb2QgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLDw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPj0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsdXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCXNoMmFkZG8gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw9ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPCAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLDw9ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sbnV2ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sem52ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHRyICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLGV2ICAlcjQsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoM2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIwYzk3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoM2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzaDNhZGQgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLDwgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLDw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHpudiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLG9kICAlcjQsJXI1LCVyNgotCXNoM2FkZCx0ciAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLD49ICAlcjQsJXI1LCVyNgotCXNoM2FkZCw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZCx1diAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsdm56ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gzYWRkbCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw8ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxzdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLG9kICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsdHIgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw8PiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLD49ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsdm56ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsbnN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDNhZGRvICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLDwgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw8PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLG51diAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHpudiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sb2QgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyx0ciAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLDw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPj0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sdXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyx2bnogICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxldiAgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODM4YzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hpZnQucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JdnNoZCAlcjQsJXI1LCVyNgotCXZzaGQsPSAlcjQsJXI1LCVyNgotCXZzaGQsPCAlcjQsJXI1LCVyNgotCXZzaGQsb2QgJXI0LCVyNSwlcjYKLQl2c2hkLHRyICVyNCwlcjUsJXI2Ci0JdnNoZCw8PiAlcjQsJXI1LCVyNgotCXZzaGQsPj0gJXI0LCVyNSwlcjYKLQl2c2hkLGV2ICVyNCwlcjUsJXI2Ci0KLQlzaGQgJXI0LCVyNSw1LCVyNgotCXNoZCw9ICVyNCwlcjUsNSwlcjYKLQlzaGQsPCAlcjQsJXI1LDUsJXI2Ci0Jc2hkLG9kICVyNCwlcjUsNSwlcjYKLQlzaGQsdHIgJXI0LCVyNSw1LCVyNgotCXNoZCw8PiAlcjQsJXI1LDUsJXI2Ci0Jc2hkLD49ICVyNCwlcjUsNSwlcjYKLQlzaGQsZXYgJXI0LCVyNSw1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiZWUzYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEgMi4wIGZvcm1hdCBzaGlmdCByaWdodCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2hycHcgJXI0LCVyNSwlc2FyLCVyNgotCXNocnB3LD0gJXI0LCVyNSwlc2FyLCVyNgotCXNocnB3LDwgJXI0LCVyNSwlc2FyLCVyNgotCXNocnB3LG9kICVyNCwlcjUsJXNhciwlcjYKLQlzaHJwdyx0ciAlcjQsJXI1LCVjcjExLCVyNgotCXNocnB3LDw+ICVyNCwlcjUsJWNyMTEsJXI2Ci0Jc2hycHcsPj0gJXI0LCVyNSwlY3IxMSwlcjYKLQlzaHJwdyxldiAlcjQsJXI1LCVjcjExLCVyNgotCi0Jc2hycHcgJXI0LCVyNSw1LCVyNgotCXNocnB3LD0gJXI0LCVyNSw1LCVyNgotCXNocnB3LDwgJXI0LCVyNSw1LCVyNgotCXNocnB3LG9kICVyNCwlcjUsNSwlcjYKLQlzaHJwdyx0ciAlcjQsJXI1LDUsJXI2Ci0Jc2hycHcsPD4gJXI0LCVyNSw1LCVyNgotCXNocnB3LD49ICVyNCwlcjUsNSwlcjYKLQlzaHJwdyxldiAlcjQsJXI1LDUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdDMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwMDAzOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0My5zCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFBBIDIuMCBzaGlmdCByaWdodCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2hycGQsKiAlcjQsJXI1LCVzYXIsJXI2Ci0Jc2hycGQsKj0gJXI0LCVyNSwlc2FyLCVyNgotCXNocnBkLCo8ICVyNCwlcjUsJXNhciwlcjYKLQlzaHJwZCwqb2QgJXI0LCVyNSwlc2FyLCVyNgotCXNocnBkLCp0ciAlcjQsJXI1LCVjcjExLCVyNgotCXNocnBkLCo8PiAlcjQsJXI1LCVjcjExLCVyNgotCXNocnBkLCo+PSAlcjQsJXI1LCVjcjExLCVyNgotCXNocnBkLCpldiAlcjQsJXI1LCVjcjExLCVyNgotCi0Jc2hycGQsKiAlcjQsJXI1LDUsJXI2Ci0Jc2hycGQsKj0gJXI0LCVyNSw1LCVyNgotCXNocnBkLCo8ICVyNCwlcjUsNSwlcjYKLQlzaHJwZCwqb2QgJXI0LCVyNSw1LCVyNgotCXNocnBkLCp0ciAlcjQsJXI1LDUsJXI2Ci0Jc2hycGQsKjw+ICVyNCwlcjUsNSwlcjYKLQlzaHJwZCwqPj0gJXI0LCVyNSw1LCVyNgotCXNocnBkLCpldiAlcjQsJXI1LDUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hsYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NobGFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjA4NDc4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hsYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgc2hsYWRkIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzaGxhZGQgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsPSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCw8ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLDw9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLG51diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx6bnYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsb2QgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHIgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsPD4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsPj0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsPiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx1diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx2bnogICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGV2ICAlcjQsMSwlcjUsJXI2Ci0KLQlzaGxhZGQsbCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLD0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCw8ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsPD0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCxudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCx6bnYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCxzdiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLG9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsdHIgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCw8PiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLD49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsPiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLHV2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsbnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsZXYgICVyNCwxLCVyNSwlcjYKLQotCXNobGFkZCx0c3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDwgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDw9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHpudiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3Ysc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LG9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix0ciAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsPD4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix1diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3Ysdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixuc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LGV2ICAlcjQsMSwlcjUsJXI2Ci0KLQlzaGxhZGQgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsPSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCw8ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLDw9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLG51diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx6bnYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsb2QgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHIgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsPD4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsPj0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsPiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx1diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx2bnogICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGV2ICAlcjQsMiwlcjUsJXI2Ci0KLQlzaGxhZGQsbCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLD0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCw8ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsPD0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCxudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCx6bnYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCxzdiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLG9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsdHIgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCw8PiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLD49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsPiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLHV2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsbnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsZXYgICVyNCwyLCVyNSwlcjYKLQotCXNobGFkZCx0c3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDwgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDw9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHpudiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3Ysc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LG9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix0ciAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsPD4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix1diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3Ysdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixuc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LGV2ICAlcjQsMiwlcjUsJXI2Ci0KLQlzaGxhZGQgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsPSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCw8ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLDw9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLG51diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx6bnYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsb2QgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHIgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsPD4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsPj0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsPiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx1diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx2bnogICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGV2ICAlcjQsMywlcjUsJXI2Ci0KLQlzaGxhZGQsbCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLD0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCw8ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsPD0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCxudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCx6bnYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCxzdiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLG9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsdHIgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCw8PiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLD49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsPiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLHV2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsbnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsZXYgICVyNCwzLCVyNSwlcjYKLQotCXNobGFkZCx0c3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDwgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDw9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdixudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHpudiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3Ysc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LG9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdix0ciAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsPD4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LD49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdix1diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3Ysdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdixuc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LGV2ICAlcjQsMywlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hsYWRkMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGxhZGQyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYmI2N2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGxhZGQyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFBBMi4wIHNobGFkZCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2hsYWRkLCogICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKj0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKjwgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKjw9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCpudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKnpudiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKm9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCp0ciAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqPD4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKj49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCo+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCp1diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCpuc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKmV2ICAlcjQsMSwlcjUsJXI2Ci0KLQlzaGxhZGQsbCwqICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqPCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCo8PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCpudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqem52ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKm9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnRyICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKjw+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqdXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKm5zdiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCpldiAgJXI0LDEsJXI1LCVyNgotCi0Jc2hsYWRkLHRzdiwqICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKjwgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKm51diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKnpudiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqb2QgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp0ciAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKjw+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPj0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp2bnogICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpuc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpldiAgJXI0LDEsJXI1LCVyNgotCi0Jc2hsYWRkLCogICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKj0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKjwgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKjw9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCpudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKnpudiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKm9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCp0ciAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqPD4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKj49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCo+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCp1diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCpuc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKmV2ICAlcjQsMiwlcjUsJXI2Ci0KLQlzaGxhZGQsbCwqICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqPCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCo8PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCpudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqem52ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKm9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnRyICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKjw+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKj4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqdXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKm5zdiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCpldiAgJXI0LDIsJXI1LCVyNgotCi0Jc2hsYWRkLHRzdiwqICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKjwgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKm51diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKnpudiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqb2QgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp0ciAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKjw+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPj0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp2bnogICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpuc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpldiAgJXI0LDIsJXI1LCVyNgotCi0Jc2hsYWRkLCogICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKj0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKjwgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKjw9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCpudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKnpudiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKm9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCp0ciAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqPD4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKj49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCo+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCp1diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCpuc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKmV2ICAlcjQsMywlcjUsJXI2Ci0KLQlzaGxhZGQsbCwqICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKj0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqPCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCo8PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCpudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqem52ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKm9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKnRyICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKjw+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKj49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKj4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqdXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKm5zdiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCpldiAgJXI0LDMsJXI1LCVyNgotCi0Jc2hsYWRkLHRzdiwqICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKjwgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKm51diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKnpudiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqb2QgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp0ciAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKjw+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPj0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp2bnogICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpuc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpldiAgJXI0LDMsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NwZWNpYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFjZTlhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCWdmdyAlcjQoJXNyMCwlcjUpCi0JZ2Z3LG0gJXI0KCVzcjAsJXI1KQotCWdmciAlcjQoJXNyMCwlcjUpCi0JZ2ZyLG0gJXI0KCVzcjAsJXI1KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcG9wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3Nwb3AucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmNjRkNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3Nwb3AucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLXNwb3BfdGVzdHM6IAotCXNwb3AwLDQsNQotCXNwb3AwLDQsMTE1Ci0Jc3BvcDAsNCw1LG4KLQlzcG9wMCw0LDExNSxuCi0Jc3BvcDEsNCw1ICVyNQotCXNwb3AxLDQsMTE1ICVyNQotCXNwb3AxLDQsNSxuICVyNQotCXNwb3AxLDQsMTE1LG4gJXI1Ci0Jc3BvcDIsNCw1ICVyNQotCXNwb3AyLDQsMTE1ICVyNQotCXNwb3AyLDQsNSxuICVyNQotCXNwb3AyLDQsMTE1LG4gJXI1Ci0Jc3BvcDMsNCw1ICVyNSwlcjYKLQlzcG9wMyw0LDExNSAlcjUsJXI2Ci0Jc3BvcDMsNCw1LG4gJXI1LCVyNgotCXNwb3AzLDQsMTE1LG4gJXI1LCVyNgotCi07IEdhcyBmdWNrcyB0aGlzIHVwLi4uICBUaGlua3MgaXQgaGFzIHRoZSBleHByZXNzaW9uIDUgbW9kIHI1LgotOwlzcG9wMSw0LDUgJXI1CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjMmNhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc3ViICVyNCwlcjUsJXI2Ci0Jc3ViLD0gJXI0LCVyNSwlcjYKLQlzdWIsPCAlcjQsJXI1LCVyNgotCXN1Yiw8PSAlcjQsJXI1LCVyNgotCXN1Yiw8PCAlcjQsJXI1LCVyNgotCXN1Yiw8PD0gJXI0LCVyNSwlcjYKLQlzdWIsc3YgJXI0LCVyNSwlcjYKLQlzdWIsb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHIgJXI0LCVyNSwlcjYKLQlzdWIsPD4gJXI0LCVyNSwlcjYKLQlzdWIsPj0gJXI0LCVyNSwlcjYKLQlzdWIsPiAlcjQsJXI1LCVyNgotCXN1Yiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsPj4gJXI0LCVyNSwlcjYKLQlzdWIsbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWJvICVyNCwlcjUsJXI2Ci0Jc3Vibyw9ICVyNCwlcjUsJXI2Ci0Jc3Vibyw8ICVyNCwlcjUsJXI2Ci0Jc3Vibyw8PSAlcjQsJXI1LCVyNgotCXN1Ym8sPDwgJXI0LCVyNSwlcjYKLQlzdWJvLDw8PSAlcjQsJXI1LCVyNgotCXN1Ym8sc3YgJXI0LCVyNSwlcjYKLQlzdWJvLG9kICVyNCwlcjUsJXI2Ci0Jc3Vibyx0ciAlcjQsJXI1LCVyNgotCXN1Ym8sPD4gJXI0LCVyNSwlcjYKLQlzdWJvLD49ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+Pj0gJXI0LCVyNSwlcjYKLQlzdWJvLD4+ICVyNCwlcjUsJXI2Ci0Jc3Vibyxuc3YgJXI0LCVyNSwlcjYKLQlzdWJvLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWJiICVyNCwlcjUsJXI2Ci0Jc3ViYiw9ICVyNCwlcjUsJXI2Ci0Jc3ViYiw8ICVyNCwlcjUsJXI2Ci0Jc3ViYiw8PSAlcjQsJXI1LCVyNgotCXN1YmIsPDwgJXI0LCVyNSwlcjYKLQlzdWJiLDw8PSAlcjQsJXI1LCVyNgotCXN1YmIsc3YgJXI0LCVyNSwlcjYKLQlzdWJiLG9kICVyNCwlcjUsJXI2Ci0Jc3ViYix0ciAlcjQsJXI1LCVyNgotCXN1YmIsPD4gJXI0LCVyNSwlcjYKLQlzdWJiLD49ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWJiLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViYixuc3YgJXI0LCVyNSwlcjYKLQlzdWJiLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWJibyAlcjQsJXI1LCVyNgotCXN1YmJvLD0gJXI0LCVyNSwlcjYKLQlzdWJibyw8ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPD0gJXI0LCVyNSwlcjYKLQlzdWJibyw8PCAlcjQsJXI1LCVyNgotCXN1YmJvLDw8PSAlcjQsJXI1LCVyNgotCXN1YmJvLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sb2QgJXI0LCVyNSwlcjYKLQlzdWJibyx0ciAlcjQsJXI1LCVyNgotCXN1YmJvLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPj0gJXI0LCVyNSwlcjYKLQlzdWJibyw+ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPj49ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPj4gJXI0LCVyNSwlcjYKLQlzdWJibyxuc3YgJXI0LCVyNSwlcjYKLQlzdWJibyxldiAlcjQsJXI1LCVyNgotCi0Jc3VidCAlcjQsJXI1LCVyNgotCXN1YnQsPSAlcjQsJXI1LCVyNgotCXN1YnQsPCAlcjQsJXI1LCVyNgotCXN1YnQsPD0gJXI0LCVyNSwlcjYKLQlzdWJ0LDw8ICVyNCwlcjUsJXI2Ci0Jc3VidCw8PD0gJXI0LCVyNSwlcjYKLQlzdWJ0LHN2ICVyNCwlcjUsJXI2Ci0Jc3VidCxvZCAlcjQsJXI1LCVyNgotCXN1YnQsdHIgJXI0LCVyNSwlcjYKLQlzdWJ0LDw+ICVyNCwlcjUsJXI2Ci0Jc3VidCw+PSAlcjQsJXI1LCVyNgotCXN1YnQsPiAlcjQsJXI1LCVyNgotCXN1YnQsPj49ICVyNCwlcjUsJXI2Ci0Jc3VidCw+PiAlcjQsJXI1LCVyNgotCXN1YnQsbnN2ICVyNCwlcjUsJXI2Ci0Jc3VidCxldiAlcjQsJXI1LCVyNgotCi0Jc3VidG8gJXI0LCVyNSwlcjYKLQlzdWJ0byw9ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPCAlcjQsJXI1LCVyNgotCXN1YnRvLDw9ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPDwgJXI0LCVyNSwlcjYKLQlzdWJ0byw8PD0gJXI0LCVyNSwlcjYKLQlzdWJ0byxzdiAlcjQsJXI1LCVyNgotCXN1YnRvLG9kICVyNCwlcjUsJXI2Ci0Jc3VidG8sdHIgJXI0LCVyNSwlcjYKLQlzdWJ0byw8PiAlcjQsJXI1LCVyNgotCXN1YnRvLD49ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPiAlcjQsJXI1LCVyNgotCXN1YnRvLD4+PSAlcjQsJXI1LCVyNgotCXN1YnRvLD4+ICVyNCwlcjUsJXI2Ci0Jc3VidG8sbnN2ICVyNCwlcjUsJXI2Ci0Jc3VidG8sZXYgJXI0LCVyNSwlcjYKLQotCXN1Yix0c3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LD0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LDwgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiw8PCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixzdiAlcjQsJXI1LCVyNgotCXN1Yix0c3Ysb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiw8PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsPj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LD4+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsPj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LG5zdiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZXYgJXI0LCVyNSwlcjYKLQotCXN1YixiICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPSAlcjQsJXI1LCVyNgotCXN1YixiLDwgJXI0LCVyNSwlcjYKLQlzdWIsYiw8PSAlcjQsJXI1LCVyNgotCXN1YixiLDw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsc3YgJXI0LCVyNSwlcjYKLQlzdWIsYixvZCAlcjQsJXI1LCVyNgotCXN1YixiLHRyICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPD4gJXI0LCVyNSwlcjYKLQlzdWIsYiw+PSAlcjQsJXI1LCVyNgotCXN1YixiLD4gJXI0LCVyNSwlcjYKLQlzdWIsYiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsYiw+PiAlcjQsJXI1LCVyNgotCXN1YixiLG5zdiAlcjQsJXI1LCVyNgotCXN1YixiLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWIsYix0c3YgJXI0LCVyNSwlcjYKLQlzdWIsYix0c3YsPSAlcjQsJXI1LCVyNgotCXN1YixiLHRzdiw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsdHN2LDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsdHN2LDw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsdHN2LDw8PSAlcjQsJXI1LCVyNgotCXN1YixiLHRzdixzdiAlcjQsJXI1LCVyNgotCXN1YixiLHRzdixvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYix0ciAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYiw8PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYiw+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYiw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixiLD4+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYiw+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYixuc3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGIsZXYgJXI0LCVyNSwlcjYKLQotCXN1Yix0YyAlcjQsJXI1LCVyNgotCXN1Yix0Yyw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLDwgJXI0LCVyNSwlcjYKLQlzdWIsdGMsPD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsPDwgJXI0LCVyNSwlcjYKLQlzdWIsdGMsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLG9kICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLD49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLD4gJXI0LCVyNSwlcjYKLQlzdWIsdGMsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLG5zdiAlcjQsJXI1LCVyNgotCXN1Yix0YyxldiAlcjQsJXI1LCVyNgotCi0Jc3ViLHRjLHRzdiAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsPSAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsPCAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsPD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LDw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiw8PD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdixvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsdHIgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0Yyw+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsPiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0Yyw+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0YyxldiAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YjIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwNDM1ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YjIucworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzdWIsKiAlcjQsJXI1LCVyNgotCXN1YiwqPSAlcjQsJXI1LCVyNgotCXN1YiwqPCAlcjQsJXI1LCVyNgotCXN1YiwqPD0gJXI0LCVyNSwlcjYKLQlzdWIsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLCo8PD0gJXI0LCVyNSwlcjYKLQlzdWIsKnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLCpvZCAlcjQsJXI1LCVyNgotCXN1YiwqdHIgJXI0LCVyNSwlcjYKLQlzdWIsKjw+ICVyNCwlcjUsJXI2Ci0Jc3ViLCo+PSAlcjQsJXI1LCVyNgotCXN1YiwqPiAlcjQsJXI1LCVyNgotCXN1YiwqPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLCo+PiAlcjQsJXI1LCVyNgotCXN1YiwqbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLCpldiAlcjQsJXI1LCVyNgotCi0Jc3ViLHRzdiwqICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKjwgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo8PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqc3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCpvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKnRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKm5zdiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKmV2ICVyNCwlcjUsJXI2Ci0KLQlzdWIsZGIsKiAlcjQsJXI1LCVyNgotCXN1YixkYiwqPSAlcjQsJXI1LCVyNgotCXN1YixkYiwqPCAlcjQsJXI1LCVyNgotCXN1YixkYiwqPD0gJXI0LCVyNSwlcjYKLQlzdWIsZGIsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCo8PD0gJXI0LCVyNSwlcjYKLQlzdWIsZGIsKnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCpvZCAlcjQsJXI1LCVyNgotCXN1YixkYiwqdHIgJXI0LCVyNSwlcjYKLQlzdWIsZGIsKjw+ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCo+PSAlcjQsJXI1LCVyNgotCXN1YixkYiwqPiAlcjQsJXI1LCVyNgotCXN1YixkYiwqPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCo+PiAlcjQsJXI1LCVyNgotCXN1YixkYiwqbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCpldiAlcjQsJXI1LCVyNgotCi0Jc3ViLGRiLHRzdiwqICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLHRzdiwqPSAlcjQsJXI1LCVyNgotCXN1YixkYix0c3YsKjwgJXI0LCVyNSwlcjYKLQlzdWIsZGIsdHN2LCo8PSAlcjQsJXI1LCVyNgotCXN1YixkYix0c3YsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLHRzdiwqPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLHRzdiwqc3YgJXI0LCVyNSwlcjYKLQlzdWIsZGIsdHN2LCpvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZGIsKnRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixkYiwqPD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCo+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZGIsKj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCo+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCo+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZGIsKm5zdiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZGIsKmV2ICVyNCwlcjUsJXI2Ci0KLQlzdWIsdGMsKiAlcjQsJXI1LCVyNgotCXN1Yix0YywqPSAlcjQsJXI1LCVyNgotCXN1Yix0YywqPCAlcjQsJXI1LCVyNgotCXN1Yix0YywqPD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCo8PD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsKnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCpvZCAlcjQsJXI1LCVyNgotCXN1Yix0YywqdHIgJXI0LCVyNSwlcjYKLQlzdWIsdGMsKjw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCo+PSAlcjQsJXI1LCVyNgotCXN1Yix0YywqPiAlcjQsJXI1LCVyNgotCXN1Yix0YywqPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCo+PiAlcjQsJXI1LCVyNgotCXN1Yix0YywqbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCpldiAlcjQsJXI1LCVyNgotCi0Jc3ViLHRjLHRzdiwqICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiwqPSAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsKjwgJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LCo8PSAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsKjw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiwqPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiwqc3YgJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LCpvZCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsKnRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0YywqPD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCo+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsKj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCo+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCo+PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsKm5zdiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsKmV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YmkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTA0M2RhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzdWJpIDEyMywlcjUsJXI2Ci0Jc3ViaSw9IDEyMywlcjUsJXI2Ci0Jc3ViaSw8IDEyMywlcjUsJXI2Ci0Jc3ViaSw8PSAxMjMsJXI1LCVyNgotCXN1YmksPDwgMTIzLCVyNSwlcjYKLQlzdWJpLDw8PSAxMjMsJXI1LCVyNgotCXN1Ymksc3YgMTIzLCVyNSwlcjYKLQlzdWJpLG9kIDEyMywlcjUsJXI2Ci0Jc3ViaSx0ciAxMjMsJXI1LCVyNgotCXN1YmksPD4gMTIzLCVyNSwlcjYKLQlzdWJpLD49IDEyMywlcjUsJXI2Ci0Jc3ViaSw+IDEyMywlcjUsJXI2Ci0Jc3ViaSw+Pj0gMTIzLCVyNSwlcjYKLQlzdWJpLD4+IDEyMywlcjUsJXI2Ci0Jc3ViaSxuc3YgMTIzLCVyNSwlcjYKLQlzdWJpLGV2IDEyMywlcjUsJXI2Ci0KLQlzdWJpbyAxMjMsJXI1LCVyNgotCXN1YmlvLD0gMTIzLCVyNSwlcjYKLQlzdWJpbyw8IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPD0gMTIzLCVyNSwlcjYKLQlzdWJpbyw8PCAxMjMsJXI1LCVyNgotCXN1YmlvLDw8PSAxMjMsJXI1LCVyNgotCXN1YmlvLHN2IDEyMywlcjUsJXI2Ci0Jc3ViaW8sb2QgMTIzLCVyNSwlcjYKLQlzdWJpbyx0ciAxMjMsJXI1LCVyNgotCXN1YmlvLDw+IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPj0gMTIzLCVyNSwlcjYKLQlzdWJpbyw+IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPj49IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPj4gMTIzLCVyNSwlcjYKLQlzdWJpbyxuc3YgMTIzLCVyNSwlcjYKLQlzdWJpbyxldiAxMjMsJXI1LCVyNgotCi0Jc3ViaSx0c3YgMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw9IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsPCAxMjMsJXI1LCVyNgotCXN1YmksdHN2LDw9IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsPDwgMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw8PD0gMTIzLCVyNSwlcjYKLQlzdWJpLHRzdixzdiAxMjMsJXI1LCVyNgotCXN1YmksdHN2LG9kIDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsdHIgMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw8PiAxMjMsJXI1LCVyNgotCXN1YmksdHN2LD49IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsPiAxMjMsJXI1LCVyNgotCXN1YmksdHN2LD4+PSAxMjMsJXI1LCVyNgotCXN1YmksdHN2LD4+IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsbnN2IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsZXYgMTIzLCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTg0NmI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWJyZWFrIDUsMTIKLQlyZmkKLQlyZmlyCi0Jc3NtIDUsJXI0Ci0JcnNtIDUsJXI0Ci0JbXRzbSAlcjQKLQlsZHNpZCAoJXNyMCwlcjUpLCVyNAotCW10c3AgJXI0LCVzcjAKLQltdGN0bCAlcjQsJWNyMTAKLQltZnNwICVzcjAsJXI0Ci0JbWZjdGwgJWNyMTAsJXI0Ci0Jc3luYwotCXN5bmNkbWEKLQlkaWFnIDEyMzQKLQotCXByb2JlciAoJXNyMCwlcjUpLCVyNiwlcjcKLQlwcm9iZXJpICglc3IwLCVyNSksMSwlcjcKLQlwcm9iZXcgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmV3aSAoJXNyMCwlcjUpLDEsJXI3Ci0JCi0JbHBhICVyNCglc3IwLCVyNSksJXI2Ci0JbHBhLG0gJXI0KCVzcjAsJXI1KSwlcjYKLQlsaGEgJXI0KCVzcjAsJXI1KSwlcjYKLQlsaGEsbSAlcjQoJXNyMCwlcjUpLCVyNgotCWxjaSAlcjQoJXNyMCwlcjUpLCVyNgotCi0JaWR0bGJhICVyNCwoJXNyMCwlcjUpCi0JaWl0bGJhICVyNCwoJXNyNCwlcjUpCi0JaWR0bGJwICVyNCwoJXNyMCwlcjUpCi0JaWl0bGJwICVyNCwoJXNyNCwlcjUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjczM2E4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFBBMi4wIHN5c3RlbSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JcmZpCi0JcmZpLHIKLQlzc20gOTIzLCVyNAotCXJzbSA5MjMsJXI0Ci0JbWZjdGwsdyAlY3IxMSwlcjQKLQotCXByb2JlLHIgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmVpLHIgKCVzcjAsJXI1KSwxLCVyNwotCXByb2JlLHcgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmVpLHcgKCVzcjAsJXI1KSwxLCVyNwotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyZmVmZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQucworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIHVuaXQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0JdXhvciAlcjQsJXI1LCVyNgotCXV4b3Isc2J6ICVyNCwlcjUsJXI2Ci0JdXhvcixzaHogJXI0LCVyNSwlcjYKLQl1eG9yLHNkYyAlcjQsJXI1LCVyNgotCXV4b3Isc2JjICVyNCwlcjUsJXI2Ci0JdXhvcixzaGMgJXI0LCVyNSwlcjYKLQl1eG9yLHRyICVyNCwlcjUsJXI2Ci0JdXhvcixuYnogJXI0LCVyNSwlcjYKLQl1eG9yLG5oeiAlcjQsJXI1LCVyNgotCXV4b3IsbmRjICVyNCwlcjUsJXI2Ci0JdXhvcixuYmMgJXI0LCVyNSwlcjYKLQl1eG9yLG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNieiAlcjQsJXI1LCVyNgotCXVhZGRjbSxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sc2RjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbSxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdHIgJXI0LCVyNSwlcjYKLQl1YWRkY20sbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbSxuZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtdCAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2J6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY210LHNkYyAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2JjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY210LHRyICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuYnogJXI0LCVyNSwlcjYKLQl1YWRkY210LG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbXQsbmRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuYmMgJXI0LCVyNSwlcjYKLQl1YWRkY210LG5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtLHRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLHNieiAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxzaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsc2RjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLHNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsdHIgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLG5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxuZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLG5oYyAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA3ZGFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvdW5pdDIucworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQTIuMCB1bml0IGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotCXV4b3IsKiAlcjQsJXI1LCVyNgotCXV4b3IsKnNieiAlcjQsJXI1LCVyNgotCXV4b3IsKnNoeiAlcjQsJXI1LCVyNgotCXV4b3IsKnNkYyAlcjQsJXI1LCVyNgotCXV4b3IsKnNiYyAlcjQsJXI1LCVyNgotCXV4b3IsKnNoYyAlcjQsJXI1LCVyNgotCXV4b3IsKnRyICVyNCwlcjUsJXI2Ci0JdXhvciwqbmJ6ICVyNCwlcjUsJXI2Ci0JdXhvciwqbmh6ICVyNCwlcjUsJXI2Ci0JdXhvciwqbmRjICVyNCwlcjUsJXI2Ci0JdXhvciwqbmJjICVyNCwlcjUsJXI2Ci0JdXhvciwqbmhjICVyNCwlcjUsJXI2Ci0KLQl1YWRkY20sKiAlcjQsJXI1LCVyNgotCXVhZGRjbSwqc2J6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpzaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sKnNkYyAlcjQsJXI1LCVyNgotCXVhZGRjbSwqc2JjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpzaGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sKnRyICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpuYnogJXI0LCVyNSwlcjYKLQl1YWRkY20sKm5oeiAlcjQsJXI1LCVyNgotCXVhZGRjbSwqbmRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpuYmMgJXI0LCVyNSwlcjYKLQl1YWRkY20sKm5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtLHRjLCogJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKnNieiAlcjQsJXI1LCVyNgotCXVhZGRjbSx0Yywqc2h6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCpzZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKnNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0Yywqc2hjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCp0ciAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YywqbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCpuaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKm5kYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YywqbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCpuaGMgJXI0LCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvd2VpcmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvd2VpcmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmNGVhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3dlaXJkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4NzAgKzAsMCBAQAotCS5zdGFicyAid2VpcmQuYyIsMHg2NCwwLDAsTGFiZWwwCi1MYWJlbDA6Ci0JLnN0YWJzICJpbnR0eXBlOnQxPWJ1NDswOzMyOyIsMHg4MCwwLDAsMAotCi0KLQkuc3RhYnMgInN5bTMyOiAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAidHlwZTMyOnQzMj0gICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQotCS5zdGFicyAiYXR0cjEwNDpHNDA0PUBoICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDU6RzQwNT1AaSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgInZhcjA6RzMwMD1AYTg7MSIsMHgyMCwwLDAsIDAKLQkuZXhwb3J0IHZhcjAKLQkuZGF0YQotCS5hbGlnbiA0Ci12YXIwOgotCS5sb25nIDQyCi0KLQkuc3RhYnMgInN5bTMzOiEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM1OiMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM2OiQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM3OiUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM4OiYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTM5OicgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQwOiggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQxOikgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQyOiogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQzOisgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ0OiwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTQ1Oi0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5leHBvcnQgYXR0cjEyMgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTIzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTI0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyNDoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJzeW00NjouICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00NzovICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00ODowICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00OToxICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW01MDoyICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgImF0dHI5NjpHMzk2PUBgICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5NzpHMzk3PUBhICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5ODpHMzk4PUBiICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5OTpHMzk5PUBjICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAic3ltNTE6MyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTI6NCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTM6NSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTQ6NiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTU6NyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTY6OCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTc6OSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTg6OiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTk6OyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjA6PCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjE6PSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjI6PiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjM6PyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjQ6QCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjU6QSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjY6QiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjc6QyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjg6RCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNjk6RSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzA6RiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzE6RyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzI6SCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzM6SSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzQ6SiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzU6SyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzY6TCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzc6TSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzg6TiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNzk6TyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODA6UCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODE6USAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODI6UiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODM6UyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODQ6VCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODU6VSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODY6ViAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODc6VyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODg6WCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltODk6WSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTA6WiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTE6WyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJzeW05MzpdICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05NDpeICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05NTpfICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05NjpgICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05NzphICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05ODpiICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW05OTpjICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDA6ZCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTAxOmUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwMjpmICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDM6ZyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA0OmggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwNTppICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDY6aiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA3OmsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwODpsICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDk6bSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTEwOm4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExMTpvICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTI6cCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTEzOnEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExNDpyICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTU6cyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE2OnQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExNzp1ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTg6diAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE5OncgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyMDp4ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjE6eSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTIyOnogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyMzp7ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjQ6fCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTI1On0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyNjp+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgInR5cGUzMzp0MzM9ISAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTM1OnQzNT0jICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMzY6dDM2PSQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUzNzp0Mzc9JSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTM4OnQzOD0mICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMzk6dDM5PScgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0MDp0NDA9KCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQxOnQ0MT0pICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDI6dDQyPSogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0Mzp0NDM9KyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ0OnQ0ND0sICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDU6dDQ1PS0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0Njp0NDY9LiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ3OnQ0Nz0vICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDg6dDQ4PTAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0OTp0NDk9MSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTUwOnQ1MD0yICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTE6dDUxPTMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1Mjp0NTI9NCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTUzOnQ1Mz01ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTQ6dDU0PTYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1NTp0NTU9NyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU2OnQ1Nj04ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTc6dDU3PTkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1ODp0NTg9OiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU5OnQ1OT07ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjA6dDYwPTwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2MTp0NjE9PSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTYyOnQ2Mj0+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjM6dDYzPT8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2NDp0NjQ9QCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTY1OnQ2NT1BICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjY6dDY2PUIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2Nzp0Njc9QyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLmV4cG9ydCBhdHRyNjYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2NwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2NzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjY4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjY4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjk6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAidHlwZTY4OnQ2OD1EICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjk6dDY5PUUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3MDp0NzA9RiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTcxOnQ3MT1HICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzI6dDcyPUggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3Mzp0NzM9SSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc0OnQ3ND1KICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzU6dDc1PUsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3Njp0NzY9TCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc3OnQ3Nz1NICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzg6dDc4PU4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3OTp0Nzk9TyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTgwOnQ4MD1QICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODE6dDgxPVEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4Mjp0ODI9UiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTgzOnQ4Mz1TICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODQ6dDg0PVQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4NTp0ODU9VSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTg2OnQ4Nj1WICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODc6dDg3PVcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAiYXR0cjY5OkczNjk9QEUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjcwOkczNzA9QEYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjcxOkczNzE9QEcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJ0eXBlODg6dDg4PVggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4OTp0ODk9WSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTkwOnQ5MD1aICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTE6dDkxPVsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAidHlwZTkzOnQ5Mz1dICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTQ6dDk0PV4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5NTp0OTU9XyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk2OnQ5Nj1gICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTc6dDk3PWEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5ODp0OTg9YiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk5OnQ5OT1jICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTAwOnQxMDA9ZCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwMTp0MTAxPWUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDI6dDEwMj1mICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTAzOnQxMDM9ZyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwNDp0MTA0PWggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDU6dDEwNT1pICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA2OnQxMDY9aiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwNzp0MTA3PWsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDg6dDEwOD1sICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA5OnQxMDk9bSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExMDp0MTEwPW4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTE6dDExMT1vICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTEyOnQxMTI9cCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExMzp0MTEzPXEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTQ6dDExND1yICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE1OnQxMTU9cyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExNjp0MTE2PXQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTc6dDExNz11ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE4OnQxMTg9diAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExOTp0MTE5PXcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjA6dDEyMD14ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTIxOnQxMjE9eSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyMjp0MTIyPXogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjM6dDEyMz17ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTI0OnQxMjQ9fCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyNTp0MTI1PX0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjY6dDEyNj1+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgImF0dHIzMjpHMzMyPUAgICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIzMzpHMzMzPUAhICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIzNTpHMzM0PUAjICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAicHJpbWFyeTpHMjAwPWVyZWQ6MCxncmVlbjoxLGJsdWU6Miw7IiwgMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiYXR0cjM2OkczMzU9QCQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLmV4cG9ydCBwcmltYXJ5Ci0JLmRhdGEKLQkuYWxpZ24gNAotcHJpbWFyeToKLQkubG9uZyA0MgotCi0JLnN0YWJzICJhdHRyMzc6RzMzNz1AJSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgImNvbnN0Njk6Yz1lMSw2OSIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImNvbnN0NzA6Yz1lMTkwPWJzMjswOzE2Oyw3MCIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImF0dHIzODpHMzM4PUAmICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiYmFkX25lZzB0eXBlOnQyMDE9czhmaWVsZDA6MSwwLDMyO2ZpZWxkMjotNTM0LDMyLDY0O2ZpZWxkMzotMSw5NiwzMjs7IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYmFkX25lZzA6RzIwMSIsIDB4MjAsMCwwLCAwCi0KLQkuZXhwb3J0IGJhZF9uZWcwCi0JLmRhdGEKLQkuYWxpZ24gNAotYmFkX25lZzA6Ci0JLmxvbmcgNDIKLQkubG9uZyA0MywgNDQsIDQ1Ci0KLQkuc3RhYnMgImF0dHIzOTpHMzM5PUAnICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0MTpHMzQxPUApICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0MjpHMzQyPUAqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0MzpHMzQzPUArICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0NDpHMzQ0PUAsICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0NjpHMzQ2PUAuICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI0NzpHMzQ3PUAvICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI1ODpHMzU4PUA6ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiYXR0cjU5OkczNTk9QDtAICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiYXR0cjYwOkczNjA9QDwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjYxOkczNjE9QD0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjYyOkczNjI9QD4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjYzOkczNjM9QD8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY0OkczNjQ9QEAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY1OkczNjU9QEEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY2OkczNjY9QEIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY3OkczNjc9QEMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjY4OkczNjg9QEQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjcyOkczNzI9QEggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjczOkczNzM9QEkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc0OkczNzQ9QEogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc1OkczNzU9QEsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc2OkczNzY9QEwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc3OkczNzc9QE0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc4OkczNzg9QE4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjc5OkczNzk9QE8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjgwOkczODA9QFAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjgxOkczODE9QFEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjgyOkczODI9QFIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjgzOkczODM9QFMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg0OkczODQ9QFQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg1OkczODU9QFUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg2OkczODY9QFYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg3OkczODc9QFcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg4OkczODg9QFggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjg5OkczODk9QFkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjkwOkczOTA9QFogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjkxOkczOTE9QFsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJhdHRyOTM6RzM5Mz1AXSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQotCS5leHBvcnQgX2NvbW1vbjAKLQkuZGF0YQotCS5hbGlnbiA0Ci1fY29tbW9uMDoKLQkubG9uZyA0MgotCS5sb25nIDI0Ci0JLmxvbmcgMjIKLQkuZXhwb3J0IGNvbW1vbjAKLQkuZGF0YQotCS5hbGlnbiA0Ci1jb21tb24wOgotCS5sb25nIDQyCi0JLmxvbmcgMjQKLQkubG9uZyAyMgotCS5zdGFicyAgImNvbW1vbjAiLDB4ZTIsMCwwLDAKLQkuc3RhYnMgImNvbW1vbjB2YXIwOlMxIiwgMHgyMCwwLDAsIDAKLQkuc3RhYnMgImNvbW1vbjB2YXIxOlMxIiwgMHgyMCwwLDAsIDQKLQkuc3RhYnMgImNvbW1vbjB2YXIyOlMxIiwgMHgyMCwwLDAsIDgKLQkuc3RhYnMgICJjb21tb24wIiwweGU0LDAsMCwwCi0KLQkuc3RhYnMgImF0dHI5NDpHMzk0PUBeICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5NTpHMzk1PUBfICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDA6RzQwMD1AZCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTAxOkc0MDE9QGUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwMjpHNDAyPUBmICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDM6RzQwMz1AZyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTA2Okc0MDY9QGogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwNzpHNDA3PUBrICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDg6RzQwOD1AbCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTA5Okc0MDk9QG0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExMDpHNDEwPUBuICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTE6RzQxMT1AbyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTEyOkc0MTI9QHAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExMzpHNDEzPUBxICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTQ6RzQxND1AciAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE1Okc0MTU9QHMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExNjpHNDE2PUB0ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTc6RzQxNz1AdSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE4Okc0MTg9QHYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExOTpHNDE5PUB3ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjA6RzQyMD1AeCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTIxOkc0MjE9QHkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyMjpHNDIyPUB6ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjM6RzQyMz1AeyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTI0Okc0MjQ9QHwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyNTpHNDI1PUB9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjY6RzQyNj1AfiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuZXhwb3J0IGF0dHIzMgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzMjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjMzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjMzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzNgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzNjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjM3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjM3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzOQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzOToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0MwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0MzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQ0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQ0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0NwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0NzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjU4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjU4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNTkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNTk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2MAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2MDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjYxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjYxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2MwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2MzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjY0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjY0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3MAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3MDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjcxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjcxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3MwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3MzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3OToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjgwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjgwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4MgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4MjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjgzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjgzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODQ6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAiZmxvYXQ3MnR5cGU6dDIwMj1SODc7OTsiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJpbnQyNTZ2YXI6RzIwMz1idTMyOzA7MjU2OyIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBpbnQyNTZ2YXIKLQkuZGF0YQotCS5hbGlnbiA0Ci1pbnQyNTZ2YXI6Ci0JLmxvbmcgNDIKLQkubG9uZyAweDJiLCAweDJjLCAweDJkLCAweDJkLCAweDJjLCAweDJiLCAweDJhCi0KLQotCS5zdGFicyAiY29uc3RoOmM9ZTEsNDI5NDk2NzI5NiIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImNvbnN0aDI6Yz1lMSwtNzM0NzIzOTg1NzMyNjQyNzU4OTI4NDc1Njc4OTg3MjM0NTYzMjg0OTM3NDU2IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYmFkX25lZzBjb25zdDpjPVMyMDEsMTI4LDEyOCwxMTIyMjIxMTM0MzQzNDM0NTY1NjU2NTY3Nzg4ODg3NyIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImJhZF90eXBlMDp0KC0zLDcpIiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgImJhZF90eXBlMTp0KDQyLDYpIiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiYXJyYXlfaW5kZXgwOnQyMDU9cjE7MDs1OyIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJhcnJheTA6RzIwNj1hMjA1OzEiLCAweDIwLDAsMCwgMAotCS5leHBvcnQgYXJyYXkwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXJyYXkwOgotCS5sb25nIDQyCi0JLmxvbmcgNDMsIDQ0LCA0NSwgNDYsIDQ3Ci0KLQkuc3RhYnMgImFycmF5X2luZGV4MTp0MjA3PSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJhcnJheTE6RzIwOD1hZWFpMV9yZWQ6MCxhaTFfZ3JlZW46MSxhaTFfYmx1ZToyLDs7MSIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBhcnJheTEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hcnJheTE6Ci0JLmxvbmcgNDIKLQkubG9uZyA0MywgNDQKLQotCS5zdGFicyAiaW50dHlwZV9vbmU6dDIwOT0xIiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgImludHR5cGVfdHdvOnQyMTA9MSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJvbmVfdmFyOkcyMDkiLCAweDIwLDAsMCwgMAotCS5leHBvcnQgb25lX3ZhcgotCS5kYXRhCi0JLmFsaWduIDQKLW9uZV92YXI6Ci0JLmxvbmcgNDIKLQkuc3RhYnMgInR3b192YXI6RzIxMCIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCB0d29fdmFyCi0JLmRhdGEKLQkuYWxpZ24gNAotdHdvX3ZhcjoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJpbnRwOnQyMTE9KjEiLCAweDgwLDAsMCwgMAotCS5zdGFicyAicG9pbnRlcl90b19pbnRfdmFyOkcyMTI9KjEiLCAweDgwLDAsMCwgMAotCS5zdGFicyAiaW50cF92YXI6RzIxMSIsIDB4MjAsMCwwLCAwCi0JLmV4cG9ydCBpbnRwX3ZhcgotCS5kYXRhCi0JLmFsaWduIDQKLWludHBfdmFyOgotCS5sb25nIDQyCi0KLQkuc3RhYnMgInVucmVjb2dfY29uc3Q6Yz14amtzZGZsc2tkMzMsNDs0NzM7IiwgMHg4MCwwLDAsIDAKLQotCS5leHBvcnQgYXR0cjg1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjg1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4NwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4NzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjg4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjg4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5MAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5MDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjkxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjkxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5MwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5MzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5NgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5NjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5OQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5OToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwMAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTAxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTAyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwMjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwMwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDQKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA0OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwNToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwNgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA3OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwOQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTEwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTExCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExMToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExMgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTEzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExNDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExNQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExNzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExOAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTIwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyMDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEyMQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTI1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTI2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyNjoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJ2YXIxOkczMDE9QHMzMjsxIiwweDIwLDAsMCwgMAotCS5leHBvcnQgdmFyMQotCS5kYXRhCi0JLmFsaWduIDQKLXZhcjE6Ci0JLmxvbmcgNDIKLQkuc3RhYnMgInZhcjI6RzMwMj1AcDQyOzEiLDB4MjAsMCwwLCAwCi0JLmV4cG9ydCB2YXIyCi0JLmRhdGEKLQkuYWxpZ24gNAotdmFyMjoKLQkubG9uZyA0MgotCS5zdGFicyAidmFyMzpHMzAzPUBQOzEiLDB4MjAsMCwwLCAwCi0JLmV4cG9ydCB2YXIzCi0JLmRhdGEKLQkuYWxpZ24gNAotdmFyMzoKLQkubG9uZyA0MgotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCS5zdGFicyAidl9jb21iOkc0NDg9czI0ITIsMDIwLDQ0NT1zMTIhMSwxMjAsNDQ0PXM0eDoxLDAsMzI7OzskdmI0NDQ6NDQ2PSo0NDQsMDthOi8wMSwzMiwzMjs7OzAyNjQsNDQ3PXMxMiExLDEyMCw0NDQ7JHZiNDQ0OjQ0NiwwO2I6LzAxLDMyLDMyOzs7Y29tYjovMDEsMTI4LDMyOzsiLCAweDIwLDAsMCwgMAotCi0JLmV4cG9ydCB2X2NvbWIKLQkuYWxpZ24gMQotdl9jb21iOgotCS5sb25nIHZfY29tYl9zaGFyZWQgCi0JLmxvbmcgNDMgCi0JLmxvbmcgdl9jb21iX3NoYXJlZCAKLQkubG9uZyA0NCAKLQkubG9uZyA0NSAKLXZfY29tYl9zaGFyZWQ6Ci0JLmxvbmcgNDIgCi0KLQkuc3RhYnMgInN5bTkyOlxcICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTI6dDkyPVxcICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJhdHRyOTI6RzM5Mj1AXFwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24xLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTRhZjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjEucworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiAxCi0JLmFsaWduIDgKLQlub3AKLTsgIjgiIGFzc3VtZWQgaWYgbm8gYWxpZ25tZW50IGdpdmVuLgotCS5hbGlnbgotCW5vcAotCS5hbGlnbiA0MDk2Ci0Jbm9wCi0KLQotCS5kYXRhCi0KLSAgICAgICAgLkFMSUdOICA4Ci0kTDAwQlNTOgotaG9tZV9idWZmOgotICAgICAgICAuQkxPQ0sgIDEwMjQKLSAgICAgICAgLkFMSUdOICA4Ci1jdXJyZW50X2J1ZmY6Ci0gICAgICAgIC5CTE9DSyAgMTAyNAotICAgICAgICAuQUxJR04gIDQKLWxvY2tfZmlsZToKLSAgICAgICAgLkJMT0NLICA0Ci0gICAgICAgIC5BTElHTiAgOAotTDMzMi5uYW1lOgotICAgICAgICAuQkxPQ0sgIDMwCi0gICAgICAgIC5BTElHTiAgNAotTDM1Mi5sYXN0X2Nhc2Vfd2E6Ci0gICAgICAgIC5CTE9DSyAgNAotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmEzNThlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24yLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiAzCi0KLQkKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FwcGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hcHBidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzN2Y5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FwcGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyAxICJjcnQwLnMiCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2JhZGZtcHlhZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTNmNDI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvb2JhcixFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUZSLEFSR1cxPUZVLEFSR1cyPUZSLEFSR1czPUZVLFJUTlZBTD1GUgotZm9vYmFyCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCWxkbyAtNjQoJXIzMCksJXIyMAotCWFkZGlsIExSJ3gtJGdsb2JhbCQsJXIyNwotCWZsZGRzIDgoJXIyMCksJWZyNAotCWZsZGRzIDAoJXIyMCksJWZyMjIKLQlsZG8gUlIneC0kZ2xvYmFsJCglcjEpLCVyMTkKLQlmbXB5c3ViLHNnbCAlZnI1TCwlZnI3TCwlZnI1TCwlZnIyMkwsJWZyNEwKLQlidiAlcjAoJXIyKQotCWZzdGRzICVmcjUsMCglcjE5KQotCS5FWElUCi0JLlBST0NFTkQKLQkuYnNzCi0KLXgJLmNvbW0gOAoteQkuY29tbSA4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxMmFiNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS5kYXRhCi0KLQotZm9vOgotCS5ibG9jawotYmFyOgotCS5ibG9jayAweDdmZmZmZmZmCi1jb206Ci0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmZDE5OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLmRhdGEKLWZvbzoKLQkuYmxvY2sgLTEKLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwNmEwZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLUxDJDAwMDA6Ci0JLlNUUklORyAiJWQgJWxmICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGVycm9yX18zQUFBaWlkaQotCS5FWFBPUlQgZXJyb3JfXzNBQUFpaWRpLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9RlIsQVJHVzQ9RlUsUlROVkFMPUdSCi1lcnJvcl9fM0FBQWlpZGk6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWNvcHkgJXIyNiwlcjUKLQlsZG8gLTgoJXIwKSwlcjYKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNiwlcjcKLQlzdHcgJXIyNSwwKCVyNykKLQlsZG8gLTEyKCVyMCksJXI4Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjgsJXI5Ci0Jc3R3ICVyMjQsMCglcjkpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC0yNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkbyAtMjgoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTUyKCVyMzApCi0JbGRpbCBMJ0xDJDAwMDAsJXIyNgotCWxkbyBSJ0xDJDAwMDAoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQlmbGRkcyAwKCVyMjApLCVmcjcKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1GUixBUkdXMz1GVQotCWJsIHByaW50ZiwlcjIKLQlub3AKLQlibCxuIEwkMDAwMiwlcjAKLQlibCxuIEwkMDAwMSwlcjAKLUwkMDAwMjoKLUwkMDAwMToKLQlsZHcgOCglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyOAotCWxkdyAxNiglcjQpLCVyNwotCWxkdyAyMCglcjQpLCVyNgotCWxkdyAyNCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgb2tfXzNBQUFpZGkKLQkuRVhQT1JUIG9rX18zQUFBaWRpLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUsUlROVkFMPUdSCi1va19fM0FBQWlkaToKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjksOCglcjQpCi0Jc3R3ICVyOCwxMiglcjQpCi0Jc3R3ICVyNywxNiglcjQpCi0Jc3R3ICVyNiwyMCglcjQpCi0Jc3R3ICVyNSwyNCglcjQpCi0JY29weSAlcjI2LCVyNQotCWxkbyAtOCglcjApLCVyNgotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI2LCVyNwotCXN0dyAlcjI1LDAoJXI3KQotCWxkbyAtMTYoJXIwKSwlcjgKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOCwlcjkKLQlmc3RkcyAlZnI3LDAoJXI5KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtMTYoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTIwKCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkaWwgTCdMQyQwMDAwLCVyMjYKLQlsZG8gUidMQyQwMDAwKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JZmxkZHMgMCglcjIwKSwlZnI3Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUKLQlibCBwcmludGYsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwMDQsJXIwCi0JYmwsbiBMJDAwMDMsJXIwCi1MJDAwMDQ6Ci1MJDAwMDM6Ci0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5hbGlnbiA4Ci1MQyQwMDAxOgotCTsgLmRvdWJsZSA1LjUwMDAwMDAwMDAwMDAwMDAwMDAwZSswMAotCS53b3JkIDEwNzUxODM2MTYgOyA9IDB4NDAxNjAwMDAKLQkud29yZCAwIDsgPSAweDAKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbgotCS5FWFBPUlQgbWFpbixQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCS5DQUxMIAotCWJsIF9fbWFpbiwlcjIKLQlub3AKLQlsZG8gLTI0KCVyMCksJXIxOQotCWxkbyAtMzIoJXIzMCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDAxLCVyMjAKLQlsZG8gUidMQyQwMDAxKCVyMjApLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQoJXIyMSksJXIyMwotCXN0dyAlcjIyLDAoJXIxOSkKLQlzdHcgJXIyMyw0KCVyMTkpCi0JbGRvIDMoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksLTYwKCVyMzApCi0JbGRvIDgoJXI0KSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JbGRvIDQoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBlcnJvcl9fM0FBQWlpZGksJXIyCi0Jbm9wCi0JbGRvIDMoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksLTUyKCVyMzApCi0JbGRvIDgoJXI0KSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JbGRpbCBMJ0xDJDAwMDEsJXIxOQotCWxkbyBSJ0xDJDAwMDEoJXIxOSksJXIyMAotCWZsZGRzIDAoJXIyMCksJWZyNwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVCi0JYmwgb2tfXzNBQUFpZGksJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIyOAotCWJsLG4gTCQwMDA1LCVyMAotCWJsLG4gTCQwMDA1LCVyMAotTCQwMDA1OgotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsaW5mb2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsaW5mb2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzY4ZTg3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuZXhwb3J0IGRpdnUsbWlsbGljb2RlCi0JLnByb2MKLQkuY2FsbGluZm8gbWlsbGljb2RlCi1kaXZ1Ci0JLnByb2NlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZGVmYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2RlZmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDgyNjU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZGVmYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLmltcG9ydAlfc2V0ZXJybm8KLSAJLmV4cG9ydCAgIHZmb3JrICAhCS5sYWJlbCAgIHZmb3JrICAhCS5wcm9jIQkuY2FsbGluZm8gbm9fY2FsbHMhCS5lbnRyeSAhCSAJLmxhYmVsCV9fdmZvcmsgICEJbXRzcAklcjAsJXNyMCEJbGRpbAlMJTB4YzAwMDAwMDQsJXIxIQlibGUJUiUweGMwMDAwMDA0KCVzcjAsJXIxKSEJbGRpCTY2ICAgLCVyMjIgIQliLG4JeXl5IQliLG4JX192Zm9yayAhCWIJX3NldGVycm5vIQljb3B5CSVyMjgsJXIyNiEJLmxhYmVsCXl5eSAKLQlhZGQsPQklcjAsJXIyOSwlcjAJCSAKLQljb3B5CSVyMCwlcjI4CQkgCi0JYnYsbgkoJXIyKQotCS5leGl0Ci0gCS5wcm9jZW5kIAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0ZjczNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLlBBUkFNIGZvbyxSVE5WQUw9R1IKLWZvbzoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsTk9fQ0FMTFMsRU5UUllfR1I9MSxFTlRSWV9GUj0xMQotCS5FTlRSWQotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwb3J0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cG9ydGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjkwNDFmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwb3J0YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0gICAgICAgIC5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwcmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHByYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDRkMmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHByYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbgk4Ci0JLmV4cG9ydAlpY29kZSxkYXRhCi1pY29kZToKLQkucHJvYwotCS5jYWxsaW5mbwlmcmFtZT0wLG5vX2NhbGxzCi0JLmVudHJ5Ci0JYnYsbgklcjAoJXIyKQotCS5leGl0Ci0Jbm9wCi0JLnByb2NlbmQKLQotCTsKLQk7IEZJUlNULCBhcmd2IGFycmF5IG9mIHBvaW50ZXJzIHRvIGFyZ3MsIDFzdCBpcyBzYW1lIGFzIHBhdGguCi0JOwotCS5hbGlnbgk4Ci1pY19hcmd2OgotCS53b3JkCWljX2FyZ3YxLWljb2RlCTsgc2Vjb25kLCBwb2ludGVyIHRvIDFzdCBhcmd1bWVudAotCS53b3JkCWljX3BhdGgtaWNvZGUJCTsgZmlyc3QsICBwb2ludGVyIHRvIGluaXQgcGF0aAotCS53b3JkCTAJCQk7IGZvdXJ0aCwgTlVMTCBhcmd2IHRlcm1pbmF0b3IgKHBhZCkKLQkud29yZAkwCQkJOyB0aGlyZCwgIE5VTEwgYXJndiB0ZXJtaW5hdG9yCi0KLWljX3BhdGg6Ci0JLmJsb2Nregk0MDk2CQkJOyBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKLQkud29yZAkwCQkJOyBpbiBjYXNlIGZ1bGwgc3RyaW5nIGlzIHVzZWQKLQkud29yZAkwCQkJOyB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyB0ZXJtaW5hdG9yCi0KLWljX2FyZ3YxOgotCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCi0JLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCi0JLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgotCi0JLmV4cG9ydAlzemljb2RlLGRhdGEKLXN6aWNvZGU6Ci0JLndvcmQJc3ppY29kZS1pY29kZQotCS53b3JkCTAJCQk7IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZmlsbGVyIGF0IGVuZAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2ZpeHVwN2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9maXh1cDdidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4NDJiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2ZpeHVwN2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjE2NyArMCwwIEBACi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi0JLmNvZGUKLQkuYWxpZ24gNAotCS5FWFBPUlQgYWxsb2NfdHlwZSxDT0RFCi0JLkVYUE9SVCBhbGxvY190eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1hbGxvY190eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjcsMzIoJXI0KQotCXN0dyAlcjYsMzYoJXI0KQotCXN0dyAlcjUsNDAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAwMiwlcjAKLQlub3AKLQlsZG8gNTIoJXIwKSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCB4bWFsbG9jLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjcKLQlibCxuIEwkMDAwMywlcjAKLUwkMDAwMjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxMjAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyNCkKLQlsZG8gNTIoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMTYoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAxNiglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDA0LCVyMAotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZHcgMTYoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAwMDUsJXIwCi1MJDAwMDQ6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDAwNTogCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyAxNiglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMjAoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkdyAyNCglcjQpLCVyMTkKLQljb21jbHIsPSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMDA2LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgNDAoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0JZGVwaSAtMSwxLDEsJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi1MJDAwMDY6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxMiglcjIwKSwlcjIwCi0JbGR3IDI0KCVyMjEpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDI0KCVyMjEpLCVyMjIKLQl1YWRkY20gJXIwLCVyMjIsJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjE5KSwlcjE5Ci0JbGR3IDQoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDE2KCVyMjApLCVyMjAKLQlsZHcgNCglcjIxKSwlcjIxCi0Jc3ViICVyMjAsJXIyMSwlcjIwCi0JY29tY2xyLD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDAwNywlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQljb3B5ICVyMjEsJXIxOQotCWJsLG4gTCQwMDA4LCVyMAotTCQwMDA3OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwMDg6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw4KCVyMTkpCi0JbGR3IDI0KCVyNCksJXI3Ci1MJDAwMDM6IAotCWNvcHkgJXI3LCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCXN0dyAlcjAsMCglcjcpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDEyKCVyNykKLQlsZG8gLTEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI3KQotCWNvcHkgJXI3LCVyMjgKLQlibCxuIEwkMDAwMSwlcjAKLUwkMDAwMTogCi0JbGR3IDMyKCVyNCksJXI3Ci0JbGR3IDM2KCVyNCksJXI2Ci0JbGR3IDQwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWtlX3BvaW50ZXJfdHlwZSxDT0RFCi0JLkVYUE9SVCBtYWtlX3BvaW50ZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbWFrZV9wb2ludGVyX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOSwxNiglcjQpCi0Jc3R3ICVyOCwyMCglcjQpCi0Jc3R3ICVyNywyNCglcjQpCi0Jc3R3ICVyNiwyOCglcjQpCi0Jc3R3ICVyNSwzMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAyMCglcjE5KSwlcjkKLQljb21pY2xyLDw+IDAsJXI5LCVyMAotCWJsIEwkMDAxMCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMTEsJXIwCi0Jbm9wCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDA5LCVyMAotCWJsLG4gTCQwMDEyLCVyMAotTCQwMDExOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDEzLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMDksJXIwCi1MJDAwMTM6IAotTCQwMDEyOiAKLUwkMDAxMDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAxNSwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDE0LCVyMAotCW5vcAotCWJsLG4gTCQwMDE1LCVyMAotTCQwMDE1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMTYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotTCQwMDE2OiAKLQlibCxuIEwkMDAxNywlcjAKLUwkMDAxNDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyOQotCWxkdyAxMiglcjkpLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLQljb3B5ICVyOSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjkpCi1MJDAwMTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMjAoJXIxOSkKLQlsZG8gNCglcjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyOSkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSwwKCVyOSkKLQlsZGggMzIoJXI5KSwlcjE5Ci0JY29weSAlcjE5LCVyMjAKLQlkZXBpIC0xLDMxLDEsJXIyMAotCXN0aCAlcjIwLDMyKCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDIwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAxOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyMCglcjE5KQotTCQwMDE4OiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMDksJXIwCi1MJDAwMDk6IAotCWxkdyAxNiglcjQpLCVyOQotCWxkdyAyMCglcjQpLCVyOAotCWxkdyAyNCglcjQpLCVyNwotCWxkdyAyOCglcjQpLCVyNgotCWxkdyAzMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3BvaW50ZXJfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfcG9pbnRlcl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfcG9pbnRlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIG1ha2VfcG9pbnRlcl90eXBlLCVyMgotCW5vcAotCWJsLG4gTCQwMDE5LCVyMAotTCQwMDE5OiAKLQlsZHcgOCglcjQpLCVyNgotCWxkdyAxMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFrZV9yZWZlcmVuY2VfdHlwZSxDT0RFCi0JLkVYUE9SVCBtYWtlX3JlZmVyZW5jZV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1tYWtlX3JlZmVyZW5jZV90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjksMTYoJXI0KQotCXN0dyAlcjgsMjAoJXI0KQotCXN0dyAlcjcsMjQoJXI0KQotCXN0dyAlcjYsMjgoJXI0KQotCXN0dyAlcjUsMzIoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjQoJXIxOSksJXI5Ci0JY29taWNsciw8PiAwLCVyOSwlcjAKLQlibCBMJDAwMjEsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDIyLCVyMAotCW5vcAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAyMCwlcjAKLQlibCxuIEwkMDAyMywlcjAKLUwkMDAyMjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyNCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDIwLCVyMAotTCQwMDI0OiAKLUwkMDAyMzogCi1MJDAwMjE6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMjYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyNSwlcjAKLQlub3AKLQlibCxuIEwkMDAyNiwlcjAKLUwkMDAyNjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDI3LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLUwkMDAyNzogCi0JYmwsbiBMJDAwMjgsJXIwCi1MJDAwMjU6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjkKLQlsZHcgMTIoJXI5KSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JY29weSAlcjksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI5KQotTCQwMDI4OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDI0KCVyMTkpCi0JbGRvIDQoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjkpCi0JbGRvIDE2KCVyMCksJXIxOQotCXN0dyAlcjE5LDAoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjQoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDI5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDI0KCVyMTkpCi1MJDAwMjk6IAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAyMCwlcjAKLUwkMDAyMDogCi0JbGR3IDE2KCVyNCksJXI5Ci0JbGR3IDIwKCVyNCksJXI4Ci0JbGR3IDI0KCVyNCksJXI3Ci0JbGR3IDI4KCVyNCksJXI2Ci0JbGR3IDMyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfcmVmZXJlbmNlX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3JlZmVyZW5jZV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfcmVmZXJlbmNlX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiw4KCVyNCkKLQlzdHcgJXI1LDEyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgbWFrZV9yZWZlcmVuY2VfdHlwZSwlcjIKLQlub3AKLQlibCxuIEwkMDAzMCwlcjAKLUwkMDAzMDogCi0JbGR3IDgoJXI0KSwlcjYKLQlsZHcgMTIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIG1ha2VfZnVuY3Rpb25fdHlwZSxDT0RFCi0JLkVYUE9SVCBtYWtlX2Z1bmN0aW9uX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLW1ha2VfZnVuY3Rpb25fdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI5LDE2KCVyNCkKLQlzdHcgJXI4LDIwKCVyNCkKLQlzdHcgJXI3LDI0KCVyNCkKLQlzdHcgJXI2LDI4KCVyNCkKLQlzdHcgJXI1LDMyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI4KCVyMTkpLCVyOQotCWNvbWljbHIsPD4gMCwlcjksJXIwCi0JYmwgTCQwMDMyLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAzMywlcjAKLQlub3AKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMzEsJXIwCi0JYmwsbiBMJDAwMzQsJXIwCi1MJDAwMzM6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMzUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAzMSwlcjAKLUwkMDAzNTogCi1MJDAwMzQ6IAotTCQwMDMyOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDM3LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMzYsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwMzcsJXIwCi1MJDAwMzc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAzOCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi1MJDAwMzg6IAotCWJsLG4gTCQwMDM5LCVyMAotTCQwMDM2OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXI5Ci0JbGR3IDEyKCVyOSksJXIxOQotCXN0dyAlcjE5LDgoJXI0KQotCWNvcHkgJXI5LCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyOSkKLUwkMDAzOTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDE2KCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyOCglcjE5KQotCWxkbyAxKCVyMCksJXIxOQotCXN0dyAlcjE5LDgoJXI5KQotCWxkbyA2KCVyMCksJXIxOQotCXN0dyAlcjE5LDAoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjgoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDQwLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDI4KCVyMTkpCi1MJDAwNDA6IAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAzMSwlcjAKLUwkMDAzMTogCi0JbGR3IDE2KCVyNCksJXI5Ci0JbGR3IDIwKCVyNCksJXI4Ci0JbGR3IDI0KCVyNCksJXI3Ci0JbGR3IDI4KCVyNCksJXI2Ci0JbGR3IDMyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfZnVuY3Rpb25fdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfZnVuY3Rpb25fdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX2Z1bmN0aW9uX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiw4KCVyNCkKLQlzdHcgJXI1LDEyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgbWFrZV9mdW5jdGlvbl90eXBlLCVyMgotCW5vcAotCWJsLG4gTCQwMDQxLCVyMAotTCQwMDQxOiAKLQlsZHcgOCglcjQpLCVyNgotCWxkdyAxMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIHNtYXNoX3RvX21lbWJlcl90eXBlLENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX21lbWJlcl90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9tZW1iZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX21lbWJlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsOCglcjQpCi0Jc3R3ICVyNywxMiglcjQpCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIDI0KCVyNCksJXIxCi0JZnN0ZHMsbWEgJWZyMTIsOCglcjEpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LC0xNiglcjMwKQotCWZsZHdzIC0xNiglcjMwKSwlZnIxMgotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWZzdHdzICVmcjEyLC0xNiglcjMwKQotCWxkdyAtMTYoJXIzMCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQlsZHcgMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzbWFzaF90b19tZW1iZXJfdHlwZSwlcjIKLQlub3AKLQlmc3R3cyAlZnIxMiwtMTYoJXIzMCkKLQlsZHcgLTE2KCVyMzApLCVyMjgKLQlibCxuIEwkMDA0MiwlcjAKLUwkMDA0MjogCi0JbGR3IDgoJXI0KSwlcjgKLQlsZHcgMTIoJXI0KSwlcjcKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gMjQoJXI0KSwlcjEKLQlmbGRkcyxtYSA4KCVyMSksJWZyMTIKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGFsbG9jYXRlX3N0dWJfbWV0aG9kLENPREUKLQkuRVhQT1JUIGFsbG9jYXRlX3N0dWJfbWV0aG9kLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1hbGxvY2F0ZV9zdHViX21ldGhvZDogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDQoJXIwKSwlcjIwCi0Jc3RoICVyMjAsMzIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMTUoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMCksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgOCglcjQpLCVyMjgKLQlibCxuIEwkMDA0MywlcjAKLUwkMDA0MzogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgYnVpbHRpbl90eXBlX2ludCxEQVRBCi0JLmFsaWduIDQKLQkuRVhQT1JUIGNyZWF0ZV9hcnJheV90eXBlLENPREUKLQkuRVhQT1JUIGNyZWF0ZV9hcnJheV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1jcmVhdGVfYXJyYXlfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMCw1NiglcjQpCi0Jc3R3ICVyOSw2MCglcjQpCi0Jc3R3ICVyOCw2NCglcjQpCi0Jc3R3ICVyNyw2OCglcjQpCi0Jc3R3ICVyNiw3MiglcjQpCi0Jc3R3ICVyNSw3NiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAyKCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTYoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDAoJXIyMCksJXIyMAotCWxkdyA4KCVyMjEpLCVyMjEKLQlzdHcgJXIyMCwtMTYoJXIzMCkKLQlmbGR3cyAtMTYoJXIzMCksJWZyNQotCXN0dyAlcjIxLC0xNiglcjMwKQotCWZsZHdzIC0xNiglcjMwKSwlZnI1UgotCXhtcHl1ICVmcjUsJWZyNVIsJWZyNAotCWZzdHdzICVmcjRSLC0xNiglcjMwKQotCWxkdyAtMTYoJXIzMCksJXIyNAotCXN0dyAlcjI0LDgoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjApLCVyMjAKLQlzdGggJXIyMCwzNCglcjE5KQotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwNTAsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZG8gMTIwKCVyMjApLCVyMTkKLQlzdHcgJXIxOSwxNiglcjQpCi0JbGR3IDE2KCVyNCksJXIxOQotCXN0dyAlcjE5LDIwKCVyNCkKLQlsZG8gMTYoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMjQoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAyNCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDQ1LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMjYKLQlsZHcgMjQoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAwNDYsJXIwCi1MJDAwNDU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA0NjogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyAyNCglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDE2KCVyNCksJXIxOQotCXN0dyAlcjE5LDI4KCVyNCkKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDMyKCVyNCkKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMzIoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDA0NywlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMDQ3OiAKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDI4KCVyNCksJXIyMAotCWxkdyAyOCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDI4KCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjgoJXI0KSwlcjIwCi0JbGR3IDI4KCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAwNDgsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDA0OSwlcjAKLUwkMDA0ODogCi0JY29weSAlcjAsJXIxOQotTCQwMDQ5OiAKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDI4KCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyAzMiglcjQpLCVyMTAKLQlibCxuIEwkMDA1MSwlcjAKLUwkMDA1MDogCi0JbGRvIDE2KCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMAotTCQwMDUxOiAKLQlzdHcgJXIxMCwzNiglcjkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMTEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDQoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMiglcjApLCVyMjAKLQlzdGggJXIyMCwzNCglcjE5KQotCWxkdyAxMiglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDA1NywlcjAKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZG8gMTIwKCVyMjApLCVyMTkKLQlzdHcgJXIxOSwzNiglcjQpCi0JbGR3IDM2KCVyNCksJXIxOQotCXN0dyAlcjE5LDQwKCVyNCkKLQlsZG8gMzIoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI0KQotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyA0NCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDUyLCVyMAotCW5vcAotCWxkdyA0MCglcjQpLCVyMjYKLQlsZHcgNDQoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAwNTMsJXIwCi1MJDAwNTI6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA1MzogCi0JbGR3IDQwKCVyNCksJXIxOQotCWxkdyA0MCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyA0NCglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDM2KCVyNCksJXIxOQotCXN0dyAlcjE5LDQ4KCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDUyKCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgNTIoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDA1NCwlcjAKLQlub3AKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMDU0OiAKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyA0OCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDQ4KCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDQ4KCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAwNTUsJXIwCi0Jbm9wCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDA1NiwlcjAKLUwkMDA1NTogCi0JY29weSAlcjAsJXIxOQotTCQwMDU2OiAKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyA1MiglcjQpLCVyMTAKLQlibCxuIEwkMDA1OCwlcjAKLUwkMDA1NzogCi0JbGRvIDMyKCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMAotTCQwMDU4OiAKLQlzdHcgJXIxMCwzNiglcjkpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAzNiglcjE5KSwlcjIwCi0Jc3R3ICVyMCwwKCVyMjApCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyAxNiglcjApLCVyMjAKLQlsZHcgMzYoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZG8gLTEoJXIyMCksJXIyMQotCXN0dyAlcjIxLDAoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDM2KCVyMjApLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMTYoJXIwKSwlcjIwCi0JbGR3IDM2KCVyMTkpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAzNiglcjE5KSwlcjIwCi0JbGR3IDEyKCVyNCksJXIxOQotCXN0dyAlcjE5LDgoJXIyMCkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsNDQoJXIxOSkKLQlsZHcgOCglcjQpLCVyMjgKLQlibCxuIEwkMDA0NCwlcjAKLUwkMDA0NDogCi0JbGR3IDU2KCVyNCksJXIxMAotCWxkdyA2MCglcjQpLCVyOQotCWxkdyA2NCglcjQpLCVyOAotCWxkdyA2OCglcjQpLCVyNwotCWxkdyA3MiglcjQpLCVyNgotCWxkdyA3NiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgc21hc2hfdG9fbWVtYmVyX3R5cGUsQ09ERQotCS5FWFBPUlQgc21hc2hfdG9fbWVtYmVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotc21hc2hfdG9fbWVtYmVyX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTAsMTYoJXI0KQotCXN0dyAlcjksMjAoJXI0KQotCXN0dyAlcjgsMjQoJXI0KQotCXN0dyAlcjcsMjgoJXI0KQotCXN0dyAlcjYsMzIoJXI0KQotCXN0dyAlcjUsMzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTEyKCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMSglcjApLCVyMjAKLQlzdHcgJXIyMCw4KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxNCglcjApLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi1MJDAwNTk6IAotCWxkdyAxNiglcjQpLCVyMTAKLQlsZHcgMjAoJXI0KSwlcjkKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIHNtYXNoX3RvX21ldGhvZF90eXBlLENPREUKLQkuRVhQT1JUIHNtYXNoX3RvX21ldGhvZF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLXNtYXNoX3RvX21ldGhvZF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEyLDE2KCVyNCkKLQlzdHcgJXIxMSwyMCglcjQpCi0Jc3R3ICVyMTAsMjQoJXI0KQotCXN0dyAlcjksMjgoJXI0KQotCXN0dyAlcjgsMzIoJXI0KQotCXN0dyAlcjcsMzYoJXI0KQotCXN0dyAlcjYsNDAoJXI0KQotCXN0dyAlcjUsNDQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtMTYoJXIwKSwlcjExCi0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjExLCVyMTIKLQlzdHcgJXIyMywwKCVyMTIpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXN0dyAlcjIwLDEyKCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtMTIoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTYoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtMTYoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsNDgoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTUoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotTCQwMDYwOiAKLQlsZHcgMTYoJXI0KSwlcjEyCi0JbGR3IDIwKCVyNCksJXIxMQotCWxkdyAyNCglcjQpLCVyMTAKLQlsZHcgMjgoJXI0KSwlcjkKLQlsZHcgMzIoJXI0KSwlcjgKLQlsZHcgMzYoJXI0KSwlcjcKLQlsZHcgNDAoJXI0KSwlcjYKLQlsZHcgNDQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBzdHJuY21wLENPREUKLQkuYWxpZ24gNAotTEMkMDAwMDogCi0JLlNUUklORyAic3RydWN0IFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDE6IAotCS5TVFJJTkcgInVuaW9uIFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDI6IAotCS5TVFJJTkcgImVudW0gXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgdHlwZV9uYW1lX25vX3RhZyxDT0RFCi0JLkVYUE9SVCB0eXBlX25hbWVfbm9fdGFnLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi10eXBlX25hbWVfbm9fdGFnOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JY29weSAlcjI2LCVyNQotCWxkdyA0KCVyNSksJXI2Ci0JY29taWNsciw8PiAwLCVyNiwlcjAKLQlibCBMJDAwNjIsJXIwCi0Jbm9wCi0JbGR3IDAoJXI1KSwlcjE5Ci0JY29taWNsciw8PiA0LCVyMTksJXIwCi0JYmwgTCQwMDY2LCVyMAotCW5vcAotCWNvbWljbHIsPj0gNCwlcjE5LCVyMAotCWJsIEwkMDA3MiwlcjAKLQlub3AKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAwNjQsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwNzAsJXIwCi1MJDAwNzI6IAotCWNvbWljbHIsPD4gNSwlcjE5LCVyMAotCWJsIEwkMDA2OCwlcjAKLQlub3AKLQlibCxuIEwkMDA3MCwlcjAKLUwkMDA2NDogCi0JY29weSAlcjYsJXIyNgotCWxkaWwgTCdMQyQwMDAwLCVyMjUKLQlsZG8gUidMQyQwMDAwKCVyMjUpLCVyMjUKLQlsZG8gNyglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0cm5jbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA2NSwlcjAKLQlub3AKLQlsZG8gNyglcjYpLCVyNgotTCQwMDY1OiAKLQlibCxuIEwkMDA2MywlcjAKLUwkMDA2NjogCi0JY29weSAlcjYsJXIyNgotCWxkaWwgTCdMQyQwMDAxLCVyMjUKLQlsZG8gUidMQyQwMDAxKCVyMjUpLCVyMjUKLQlsZG8gNiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0cm5jbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA2NywlcjAKLQlub3AKLQlsZG8gNiglcjYpLCVyNgotTCQwMDY3OiAKLQlibCxuIEwkMDA2MywlcjAKLUwkMDA2ODogCi0JY29weSAlcjYsJXIyNgotCWxkaWwgTCdMQyQwMDAyLCVyMjUKLQlsZG8gUidMQyQwMDAyKCVyMjUpLCVyMjUKLQlsZG8gNSglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0cm5jbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA2OSwlcjAKLQlub3AKLQlsZG8gNSglcjYpLCVyNgotTCQwMDY5OiAKLQlibCxuIEwkMDA2MywlcjAKLUwkMDA3MDogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNjM6IAotTCQwMDYyOiAKLQljb3B5ICVyNiwlcjI4Ci0JYmwsbiBMJDAwNjEsJXIwCi1MJDAwNjE6IAotCWxkdyA4KCVyNCksJXI2Ci0JbGR3IDEyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgY3VycmVudF9sYW5ndWFnZSxEQVRBCi0JLklNUE9SVCBzdHJjbXAsQ09ERQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lLENPREUKLQkuRVhQT1JUIGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JYWRkaWwgTCdjdXJyZW50X2xhbmd1YWdlLSRnbG9iYWwkLCVyMjcKLQlsZHcgUidjdXJyZW50X2xhbmd1YWdlLSRnbG9iYWwkKCVyMSksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLUwkMDA3NDogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDA3NSwlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyA0KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA3NywlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDAoJXIyMCksJXIyOAotCWJsLG4gTCQwMDczLCVyMAotTCQwMDc3OiAKLUwkMDA3NjogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDQoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMDc0LCVyMAotTCQwMDc1OiAKLQljb3B5ICVyMCwlcjI4Ci0JYmwsbiBMJDAwNzMsJXIwCi1MJDAwNzM6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGxvb2t1cF9zeW1ib2wsQ09ERQotCS5JTVBPUlQgZXJyb3IsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDAzOiAKLQkuU1RSSU5HICJObyB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixSVE5WQUw9R1IKLWxvb2t1cF90eXBlbmFtZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMiw4KCVyNCkKLQlzdHcgJXIxMSwxMiglcjQpCi0Jc3R3ICVyMTAsMTYoJXI0KQotCXN0dyAlcjksMjAoJXI0KQotCXN0dyAlcjgsMjQoJXI0KQotCXN0dyAlcjcsMjgoJXI0KQotCXN0dyAlcjYsMzIoJXI0KQotCXN0dyAlcjUsMzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjExCi0JY29taWNsciw8PiAwLCVyMTEsJXIwCi0JYmwgTCQwMDgwLCVyMAotCW5vcAotCWxkdyA4KCVyMTEpLCVyMTkKLQljb21pY2xyLD0gOCwlcjE5LCVyMAotCWJsIEwkMDA4MCwlcjAKLQlub3AKLQlibCxuIEwkMDA3OSwlcjAKLUwkMDA4MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMgotCWNvbWljbHIsPD4gMCwlcjEyLCVyMAotCWJsIEwkMDA4MSwlcjAKLQlub3AKLQljb3B5ICVyMTIsJXIyOAotCWJsLG4gTCQwMDc4LCVyMAotCWJsLG4gTCQwMDgyLCVyMAotTCQwMDgxOiAKLQljb21pY2xyLD0gMCwlcjEyLCVyMAotCWJsIEwkMDA4MywlcjAKLQlub3AKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDA4MywlcjAKLQlub3AKLQljb3B5ICVyMCwlcjI4Ci0JYmwsbiBMJDAwNzgsJXIwCi0JYmwsbiBMJDAwODQsJXIwCi1MJDAwODM6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDAzLCVyMjYKLQlsZG8gUidMQyQwMDAzKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA4NDogCi1MJDAwODI6IAotTCQwMDc5OiAKLQlsZHcgMTIoJXIxMSksJXIyOAotCWJsLG4gTCQwMDc4LCVyMAotTCQwMDc4OiAKLQlsZHcgOCglcjQpLCVyMTIKLQlsZHcgMTIoJXI0KSwlcjExCi0JbGR3IDE2KCVyNCksJXIxMAotCWxkdyAyMCglcjQpLCVyOQotCWxkdyAyNCglcjQpLCVyOAotCWxkdyAyOCglcjQpLCVyNwotCWxkdyAzMiglcjQpLCVyNgotCWxkdyAzNiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGFsbG9jYSxDT0RFCi0JLklNUE9SVCBzdHJsZW4sQ09ERQotCS5JTVBPUlQgc3RyY3B5LENPREUKLQkuYWxpZ24gNAotTEMkMDAwNDogCi0JLlNUUklORyAidW5zaWduZWQgXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lLENPREUKLQkuRVhQT1JUIGxvb2t1cF91bnNpZ25lZF90eXBlbmFtZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkbyAxMCglcjE5KSwlcjIwCi0JbGRvIDcoJXIyMCksJXIyMQotCWNvcHkgJXIyMSwlcjE5Ci0JbGRvIDYzKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI1LDI2LCVyMTkKLQl6ZGVwICVyMTksMjUsMjYsJXIyMAotCWxkbyAtOTYoJXIzMCksJXIxOQotCWFkZCAlcjMwLCVyMjAsJXIzMAotCWxkbyA3KCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIyNgotCWxkaWwgTCdMQyQwMDA0LCVyMjUKLQlsZG8gUidMQyQwMDA0KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNweSwlcjIKLQlub3AKLQlsZHcgOCglcjQpLCVyMjAKLQlsZG8gOSglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWNvcHkgJXIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGxvb2t1cF90eXBlbmFtZSwlcjIKLQlub3AKLQlibCxuIEwkMDA4NSwlcjAKLUwkMDA4NTogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDA1OiAKLQkuU1RSSU5HICJzaWduZWQgXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3NpZ25lZF90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfc2lnbmVkX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfc2lnbmVkX3R5cGVuYW1lOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkbyA4KCVyMTkpLCVyMjAKLQlsZG8gNyglcjIwKSwlcjIxCi0JY29weSAlcjIxLCVyMTkKLQlsZG8gNjMoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMjUsMjYsJXIxOQotCXpkZXAgJXIxOSwyNSwyNiwlcjIwCi0JbGRvIC05NiglcjMwKSwlcjE5Ci0JYWRkICVyMzAsJXIyMCwlcjMwCi0JbGRvIDcoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMjgsMjksJXIxOQotCXpkZXAgJXIxOSwyOCwyOSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAwNSwlcjI1Ci0JbGRvIFInTEMkMDAwNSglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyMAotCWxkbyA3KCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNweSwlcjIKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbG9va3VwX3R5cGVuYW1lLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDA4NywlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMjgKLQlibCxuIEwkMDA4NiwlcjAKLUwkMDA4NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBsb29rdXBfdHlwZW5hbWUsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwODYsJXIwCi1MJDAwODY6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAwNjogCi0JLlNUUklORyAiTm8gc3RydWN0IHR5cGUgbmFtZWQgJXMuXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAwNzogCi0JLlNUUklORyAiVGhpcyBjb250ZXh0IGhhcyBjbGFzcywgdW5pb24gb3IgZW51bSAlcywgbm90IGEgc3RydWN0Llx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3QsQ09ERQotCS5FWFBPUlQgbG9va3VwX3N0cnVjdCxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX3N0cnVjdDogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQljb21pY2xyLD0gMCwlcjksJXIwCi0JYmwgTCQwMDg5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA2LCVyMjYKLQlsZG8gUidMQyQwMDA2KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA4OTogCi0JbGR3IDEyKCVyOSksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDMsJXIyMCwlcjAKLQlibCBMJDAwOTAsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMDcsJXIyNgotCWxkbyBSJ0xDJDAwMDcoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDkwOiAKLQlsZHcgMTIoJXI5KSwlcjI4Ci0JYmwsbiBMJDAwODgsJXIwCi1MJDAwODg6IAotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDEyKCVyNCksJXI4Ci0JbGR3IDE2KCVyNCksJXI3Ci0JbGR3IDIwKCVyNCksJXI2Ci0JbGR3IDI0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDA4OiAKLQkuU1RSSU5HICJObyB1bmlvbiB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDk6IAotCS5TVFJJTkcgIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHN0cnVjdCBvciBlbnVtICVzLCBub3QgYSB1bmlvbi5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfdW5pb24sQ09ERQotCS5FWFBPUlQgbG9va3VwX3VuaW9uLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1sb29rdXBfdW5pb246IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOSw4KCVyNCkKLQlzdHcgJXI4LDEyKCVyNCkKLQlzdHcgJXI3LDE2KCVyNCkKLQlzdHcgJXI2LDIwKCVyNCkKLQlzdHcgJXI1LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDA5MiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwOCwlcjI2Ci0JbGRvIFInTEMkMDAwOCglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwOTI6IAotCWxkdyAxMiglcjkpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMDkzLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA5LCVyMjYKLQlsZG8gUidMQyQwMDA5KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5MzogCi0JbGR3IDEyKCVyOSksJXIyOAotCWJsLG4gTCQwMDkxLCVyMAotTCQwMDkxOiAKLQlsZHcgOCglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyOAotCWxkdyAxNiglcjQpLCVyNwotCWxkdyAyMCglcjQpLCVyNgotCWxkdyAyNCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAxMDogCi0JLlNUUklORyAiTm8gZW51bSB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMTE6IAotCS5TVFJJTkcgIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHN0cnVjdCBvciB1bmlvbiAlcywgbm90IGFuIGVudW0uXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2VudW0sQ09ERQotCS5FWFBPUlQgbG9va3VwX2VudW0sRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9lbnVtOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjksOCglcjQpCi0Jc3R3ICVyOCwxMiglcjQpCi0Jc3R3ICVyNywxNiglcjQpCi0Jc3R3ICVyNiwyMCglcjQpCi0Jc3R3ICVyNSwyNCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWNvbWljbHIsPSAwLCVyOSwlcjAKLQlibCBMJDAwOTUsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMTAsJXIyNgotCWxkbyBSJ0xDJDAwMTAoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk1OiAKLQlsZHcgMTIoJXI5KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNSwlcjIwLCVyMAotCWJsIEwkMDA5NiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAxMSwlcjI2Ci0JbGRvIFInTEMkMDAxMSglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwOTY6IAotCWxkdyAxMiglcjkpLCVyMjgKLQlibCxuIEwkMDA5NCwlcjAKLUwkMDA5NDogCi0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBzdHJjYXQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDEyOiAKLQkuU1RSSU5HICI8XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAxMzogCi0JLlNUUklORyAiID5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDE0OiAKLQkuU1RSSU5HICJObyB0ZW1wbGF0ZSB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF90ZW1wbGF0ZV90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF90ZW1wbGF0ZV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSCi1sb29rdXBfdGVtcGxhdGVfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMSwxNiglcjQpCi0Jc3R3ICVyMTAsMjAoJXI0KQotCXN0dyAlcjksMjQoJXI0KQotCXN0dyAlcjgsMjgoJXI0KQotCXN0dyAlcjcsMzIoJXI0KQotCXN0dyAlcjYsMzYoJXI0KQotCXN0dyAlcjUsNDAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlhZGQgJXIxMSwlcjE5LCVyMjAKLQlsZG8gNCglcjIwKSwlcjE5Ci0JbGRvIDcoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjE5Ci0JbGRvIDYzKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI1LDI2LCVyMTkKLQl6ZGVwICVyMTksMjUsMjYsJXIyMAotCWxkbyAtOTYoJXIzMCksJXIxOQotCWFkZCAlcjMwLCVyMjAsJXIzMAotCWxkbyA3KCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMAotCXN0dyAlcjIwLDEyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY3B5LCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAxMiwlcjI1Ci0JbGRvIFInTEMkMDAxMiglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjYXQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjYKLQlsZHcgNCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjYXQsJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkaWwgTCdMQyQwMDEzLCVyMjUKLQlsZG8gUidMQyQwMDEzKCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNhdCwlcjIKLQlub3AKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwOTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMTQsJXIyNgotCWxkbyBSJ0xDJDAwMTQoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk4OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAwOTksJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMDcsJXIyNgotCWxkbyBSJ0xDJDAwMDcoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk5OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyOAotCWJsLG4gTCQwMDk3LCVyMAotTCQwMDk3OiAKLQlsZHcgMTYoJXI0KSwlcjExCi0JbGR3IDIwKCVyNCksJXIxMAotCWxkdyAyNCglcjQpLCVyOQotCWxkdyAyOCglcjQpLCVyOAotCWxkdyAzMiglcjQpLCVyNwotCWxkdyAzNiglcjQpLCVyNgotCWxkdyA0MCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGN1cnJlbnRfdGFyZ2V0LERBVEEKLQkuSU1QT1JUIGZmbHVzaCxDT0RFCi0JLklNUE9SVCBfX2lvYixEQVRBCi0JLklNUE9SVCBmcHJpbnRmLENPREUKLQkuYWxpZ24gNAotTEMkMDAxNTogCi0JLlNUUklORyAiVHlwZSBceDAwIgotCS5JTVBPUlQgdHlwZV9wcmludCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTY6IAotCS5TVFJJTkcgIlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMTc6IAotCS5TVFJJTkcgIiBpcyBub3QgYSBzdHJ1Y3R1cmUgb3IgdW5pb24gdHlwZS5ceDAwIgotCS5JTVBPUlQgY2hlY2tfc3R1Yl90eXBlLENPREUKLQkuYWxpZ24gNAotTEMkMDAxODogCi0JLlNUUklORyAiIGhhcyBubyBjb21wb25lbnQgbmFtZWQgXHgwMCIKLQkuSU1QT1JUIGZwdXRzX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDAxOTogCi0JLlNUUklORyAiLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3N0cnVjdF9lbHRfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgotbG9va3VwX3N0cnVjdF9lbHRfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMSwyNCglcjQpCi0Jc3R3ICVyMTAsMjgoJXI0KQotCXN0dyAlcjksMzIoJXI0KQotCXN0dyAlcjgsMzYoJXI0KQotCXN0dyAlcjcsNDAoJXI0KQotCXN0dyAlcjYsNDQoJXI0KQotCXN0dyAlcjUsNDgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAxLCVyMjAsJXIwCi0JYmwgTCQwMTAyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDE2KCVyMCksJXIxOQotCWNvbWNsciw8PiAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTAyLCVyMAotCW5vcAotCWJsLG4gTCQwMTAxLCVyMAotTCQwMTAyOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi1MJDAxMDE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAzLCVyMjAsJXIwCi0JYmwgTCQwMTAzLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMTAzLCVyMAotCW5vcAotCWFkZGlsIEwnY3VycmVudF90YXJnZXQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkKCVyMSksJXIxOQotCWxkdyA3NiglcjE5KSwlcjExCi0JY29weSAlcjExLCVyMjIKLQkuQ0FMTAlBUkdXMD1HUgotCWJsICQkZHluY2FsbCwlcjMxCi0JY29weSAlcjMxLCVyMgotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMTYsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzE2KCVyMSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZmZsdXNoLCVyMgotCW5vcAotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNgotCWxkaWwgTCdMQyQwMDE1LCVyMjUKLQlsZG8gUidMQyQwMDE1KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGZwcmludGYsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDE2LCVyMjUKLQlsZG8gUidMQyQwMDE2KCVyMjUpLCVyMjUKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjQKLQlsZG8gLTEoJXIwKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCB0eXBlX3ByaW50LCVyMgotCW5vcAotCWxkaWwgTCdMQyQwMDE3LCVyMjYKLQlsZG8gUidMQyQwMDE3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMTAzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBjaGVja19zdHViX3R5cGUsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzNCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSwxNiwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLUwkMDEwNDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw+PSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTA1LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDEwNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAxMDcsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMDc6IAotTCQwMTA2OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMTA0LCVyMAotTCQwMTA1OiAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZGggMCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLUwkMDEwODogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JY29taWNsciw8PSAwLCVyMTksJXIwCi0JYmwgTCQwMTA5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDgoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBsb29rdXBfc3RydWN0X2VsdF90eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDE2KCVyNCkKLQlsZHcgMTYoJXI0KSwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMTExLCVyMAotCW5vcAotCWxkdyAxNiglcjQpLCVyMjgKLQlibCxuIEwkMDEwMCwlcjAKLUwkMDExMTogCi1MJDAxMTA6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAxMDgsJXIwCi1MJDAxMDk6IAotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTEyLCVyMAotCW5vcAotCWNvcHkgJXIwLCVyMjgKLQlibCxuIEwkMDEwMCwlcjAKLUwkMDExMjogCi0JYWRkaWwgTCdjdXJyZW50X3RhcmdldC0kZ2xvYmFsJCwlcjI3Ci0JbGR3IFInY3VycmVudF90YXJnZXQtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JbGR3IDc2KCVyMTkpLCVyMTEKLQljb3B5ICVyMTEsJXIyMgotCS5DQUxMCUFSR1cwPUdSCi0JYmwgJCRkeW5jYWxsLCVyMzEKLQljb3B5ICVyMzEsJXIyCi0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCsxNiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMTYoJXIxKSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmZmx1c2gsJXIyCi0Jbm9wCi0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTUsJXIyNQotCWxkbyBSJ0xDJDAwMTUoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZnByaW50ZiwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTYsJXIyNQotCWxkbyBSJ0xDJDAwMTYoJXIyNSksJXIyNQotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNAotCWxkbyAtMSglcjApLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHR5cGVfcHJpbnQsJXIyCi0Jbm9wCi0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTgsJXIyNQotCWxkbyBSJ0xDJDAwMTgoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZnByaW50ZiwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBmcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZGlsIEwnTEMkMDAxOSwlcjI2Ci0JbGRvIFInTEMkMDAxOSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLQlsZG8gLTEoJXIwKSwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMDA6IAotCWxkdyAyNCglcjQpLCVyMTEKLQlsZHcgMjgoJXI0KSwlcjEwCi0JbGR3IDMyKCVyNCksJXI5Ci0JbGR3IDM2KCVyNCksJXI4Ci0JbGR3IDQwKCVyNCksJXI3Ci0JbGR3IDQ0KCVyNCksJXI2Ci0JbGR3IDQ4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmaWxsX2luX3ZwdHJfZmllbGRubyxDT0RFCi0JLkVYUE9SVCBmaWxsX2luX3ZwdHJfZmllbGRubyxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSCi1maWxsX2luX3ZwdHJfZmllbGRubzogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ0KCVyMTkpLCVyMjAKLQljb21pY2xyLD4gMCwlcjIwLCVyMAotCWJsIEwkMDExNCwlcjAKLQlub3AKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLUwkMDExNTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxMTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmaWxsX2luX3ZwdHJfZmllbGRubywlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlsZHcgNDQoJXIyMCksJXIxOQotCWNvbWljbHIsPD0gMCwlcjE5LCVyMAotCWJsIEwkMDExOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwyNywyOCwlcjIyCi0JbGR3IDM2KCVyMjApLCVyMjEKLQlhZGQgJXIyMiwlcjIxLCVyMjAKLQlsZHcgOCglcjIwKSwlcjIxCi0JbGR3IDQ0KCVyMjEpLCVyMjAKLQlzdHcgJXIyMCw0NCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDgoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI3LDI4LCVyMjIKLQlsZHcgMzYoJXIyMCksJXIyMQotCWFkZCAlcjIyLCVyMjEsJXIyMAotCWxkdyA4KCVyMjApLCVyMjEKLQlsZHcgNDAoJXIyMSksJXIyMAotCXN0dyAlcjIwLDQwKCVyMTkpCi0JYmwsbiBMJDAxMTYsJXIwCi1MJDAxMTg6IAotTCQwMTE3OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAxMTUsJXIwCi1MJDAxMTY6IAotTCQwMTE0OiAKLUwkMDExMzogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5FWFBPUlQgc3R1Yl9ub25hbWVfY29tcGxhaW50LERBVEEKLQkuYWxpZ24gNAotTEMkMDAyMDogCi0JLlNUUklORyAic3R1YiB0eXBlIGhhcyBOVUxMIG5hbWVceDAwIgotCS5kYXRhCi0KLQkuYWxpZ24gNAotc3R1Yl9ub25hbWVfY29tcGxhaW50OiAKLQkud29yZCBMQyQwMDIwCi0JLndvcmQgMAotCS53b3JkIDAKLQkuSU1QT1JUIGNvbXBsYWluLENPREUKLQkuSU1QT1JUIG1lbWNweSxDT0RFCi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBjaGVja19zdHViX3R5cGUsQ09ERQotCS5FWFBPUlQgY2hlY2tfc3R1Yl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IKLWNoZWNrX3N0dWJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlsZG8gNCglcjApLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMjAsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgdHlwZV9uYW1lX25vX3RhZywlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDEyMSwlcjAKLQlub3AKLQlhZGRpbCBMJ3N0dWJfbm9uYW1lX2NvbXBsYWludC0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInc3R1Yl9ub25hbWVfY29tcGxhaW50LSRnbG9iYWwkKCVyMSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGNvbXBsYWluLCVyMgotCW5vcAotCWJsLG4gTCQwMTE5LCVyMAotTCQwMTIxOiAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyA4KCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMTIyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDEyKCVyMjApLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1jcHksJXIyCi0Jbm9wCi1MJDAxMjI6IAotTCQwMTIwOiAKLUwkMDExOTogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgZ2RiX21hbmdsZV9uYW1lLENPREUKLQkuSU1QT1JUIGNwbHVzX2RlbWFuZ2xlLENPREUKLQkuYWxpZ24gNAotTEMkMDAyMTogCi0JLlNUUklORyAiSW50ZXJuYWw6IENhbm5vdCBkZW1hbmdsZSBtYW5nbGVkIG5hbWUgYCVzJy5ceDAwIgotCS5JTVBPUlQgc3RyY2hyLENPREUKLQkuSU1QT1JUIHBhcnNlX2FuZF9ldmFsX3R5cGUsQ09ERQotCS5JTVBPUlQgYnVpbHRpbl90eXBlX3ZvaWQsREFUQQotCS5JTVBPUlQgZnJlZSxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGNoZWNrX3N0dWJfbWV0aG9kLENPREUKLQkuRVhQT1JUIGNoZWNrX3N0dWJfbWV0aG9kLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLWNoZWNrX3N0dWJfbWV0aG9kOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjExLDY0KCVyNCkKLQlzdHcgJXIxMCw2OCglcjQpCi0Jc3R3ICVyOSw3MiglcjQpCi0Jc3R3ICVyOCw3NiglcjQpCi0Jc3R3ICVyNyw4MCglcjQpCi0Jc3R3ICVyNiw4NCglcjQpCi0Jc3R3ICVyNSw4OCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC0xMiglcjApLCVyOQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI5LCVyMTAKLQlzdHcgJXIyNCwwKCVyMTApCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC0xMiglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGR3IDAoJXIyMSksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgZ2RiX21hbmdsZV9uYW1lLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRvIDMoJXIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBjcGx1c19kZW1hbmdsZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwxNiglcjQpCi0Jc3R3ICVyMCwyOCglcjQpCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMzIoJXI0KQotCWxkdyAxNiglcjQpLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDEyNCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDAyMSwlcjI2Ci0JbGRvIFInTEMkMDAyMSglcjI2KSwlcjI2Ci0JbGR3IDEyKCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAxMjQ6IAotCWxkdyAxNiglcjQpLCVyMjYKLQlsZG8gNDAoJXIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjaHIsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjAoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyNCglcjQpCi1MJDAxMjU6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAxMjYsJXIwCi0Jbm9wCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MCglcjApLCVyMjAKLQljb21jbHIsPSAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTI3LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotCWJsLG4gTCQwMTI4LCVyMAotTCQwMTI3OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQxKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMjksJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotCWJsLG4gTCQwMTMwLCVyMAotTCQwMTI5OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQ0KCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMzEsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMTMxLCVyMAotCW5vcAotCWxkdyAzMiglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMzIoJXI0KQotTCQwMTMxOiAKLUwkMDEzMDogCi1MJDAxMjg6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWJsLG4gTCQwMTI1LCVyMAotTCQwMTI2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMzcsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI0KQotCWxkdyA0NCglcjQpLCVyMTkKLQlzdHcgJXIxOSw0OCglcjQpCi0JbGR3IDMyKCVyNCksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCXN0dyAlcjIwLDUyKCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNTIoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzMiwlcjAKLQlub3AKLQlsZHcgNDgoJXI0KSwlcjI2Ci0JbGR3IDUyKCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMTMzLCVyMAotTCQwMTMyOiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAxMzM6IAotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgNTIoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA0NCglcjQpLCVyMTkKLQlzdHcgJXIxOSw1NiglcjQpCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw2MCglcjQpCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDYwKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxMzQsJXIwCi0Jbm9wCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDEzNDogCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgNTYoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyA1NiglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDU2KCVyNCksJXIyMAotCWxkdyA1NiglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTM1LCVyMAotCW5vcAotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxMzYsJXIwCi1MJDAxMzU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDEzNjogCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgNjAoJXI0KSwlcjExCi0JYmwsbiBMJDAxMzgsJXIwCi1MJDAxMzc6IAotCWxkdyAzMiglcjQpLCVyMjAKLQlsZG8gMiglcjIwKSwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMjAKLQljb3B5ICVyMjAsJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotTCQwMTM4OiAKLQlzdHcgJXIxMSwzNiglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCXN0dyAlcjE5LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBsb29rdXBfcG9pbnRlcl90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGR3IDM2KCVyNCksJXIyMAotCXN0dyAlcjE5LDAoJXIyMCkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSwzMiglcjQpCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzOSwlcjAKLQlub3AKLQlzdHcgJXIwLDI4KCVyNCkKLUwkMDE0MDogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDE0MSwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JY29taWNsciw+PSAwLCVyMTksJXIwCi0JYmwgTCQwMTQyLCVyMAotCW5vcAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDQoJXIwKSwlcjIwCi0JY29tY2xyLDw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDMsJXIwCi0Jbm9wCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0MywlcjAKLQlub3AKLQlibCxuIEwkMDE0MiwlcjAKLUwkMDE0MzogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjI2Ci0JY29weSAlcjE5LCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHBhcnNlX2FuZF9ldmFsX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZHcgMzIoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjEKLQlsZHcgMzYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0Jc3R3ICVyMTksMCglcjIwKQotCWxkdyAzMiglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMzIoJXI0KQotCWxkdyAyNCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjAoJXI0KQotTCQwMTQyOiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQwKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDQsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi0JYmwsbiBMJDAxNDUsJXIwCi1MJDAxNDQ6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDEoJXIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0NiwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi1MJDAxNDY6IAotTCQwMTQ1OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlibCxuIEwkMDE0MCwlcjAKLUwkMDE0MTogCi1MJDAxMzk6IAotCWxkbyAtMiglcjApLCVyMTkKLQlsZHcgMjQoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQ2KCVyMCksJXIyMAotCWNvbWNsciw8PiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTQ3LCVyMAotCW5vcAotCWxkdyAzMiglcjQpLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCWxkdyAzNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV92b2lkLSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfdm9pZC0kZ2xvYmFsJCglcjEpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JYmwsbiBMJDAxNDgsJXIwCi1MJDAxNDc6IAotCWxkdyAzMiglcjQpLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCWxkdyAzNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlzdHcgJXIwLDAoJXIxOSkKLUwkMDE0ODogCi0JbGR3IDE2KCVyNCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JemRlcCAlcjIxLDMwLDMxLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAyMCglcjE5KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGR3IDQoJXIxOSksJXIyMAotCXN0dyAlcjIwLDQwKCVyNCkKLQlsZHcgNDAoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi0JbGR3IDQwKCVyNCksJXIxOQotCWxkdyAzNiglcjQpLCVyMjAKLQlzdHcgJXIyMCw0OCglcjE5KQotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGRoIDMyKCVyMjApLCVyMjEKLQljb3B5ICVyMjEsJXIyMAotCWRlcGkgMCwyOSwxLCVyMjAKLQlzdGggJXIyMCwzMiglcjE5KQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkdyAxNiglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIDAsNCwxLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotTCQwMTIzOiAKLQlsZHcgNjQoJXI0KSwlcjExCi0JbGR3IDY4KCVyNCksJXIxMAotCWxkdyA3MiglcjQpLCVyOQotCWxkdyA3NiglcjQpLCVyOAotCWxkdyA4MCglcjQpLCVyNwotCWxkdyA4NCglcjQpLCVyNgotCWxkdyA4OCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUsQ09ERQotCS5FWFBPUlQgYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUgotYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOCwzMiglcjQpCi0Jc3R3ICVyNywzNiglcjQpCi0Jc3R3ICVyNiw0MCglcjQpCi0Jc3R3ICVyNSw0NCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE1MCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjcKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxNTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI0KQotCWxkbyAyNCglcjApLCVyMTkKLQlzdHcgJXIxOSwxNiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIxOQotCWxkdyAxMiglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNTEsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAxNiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMTkKLQlibCxuIEwkMDE1MiwlcjAKLUwkMDE1MTogCi0JY29weSAlcjAsJXIxOQotTCQwMTUyOiAKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDI0KCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxNTMsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDE1MzogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTU0LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxNTUsJXIwCi1MJDAxNTQ6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE1NTogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMjQoJXI0KSwlcjgKLQlibCxuIEwkMDE1NywlcjAKLUwkMDE1NjogCi0JbGRvIDI0KCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI4Ci1MJDAxNTc6IAotCXN0dyAlcjgsNDgoJXI3KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0JbGR3cyxtYSA0KCVyMjIpLCVyMTkKLQlsZHdzLG1hIDQoJXIyMiksJXIyMAotCXN0d3MsbWEgJXIxOSw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMTkKLQlzdHdzLG1hICVyMjAsNCglcjIxKQotCWxkd3MsbWEgNCglcjIyKSwlcjIwCi0Jc3R3cyxtYSAlcjE5LDQoJXIyMSkKLQlsZHdzLG1hIDQoJXIyMiksJXIxOQotCXN0d3MsbWEgJXIyMCw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMjAKLQlzdHdzLG1hICVyMTksNCglcjIxKQotCXN0dyAlcjIwLDAoJXIyMSkKLUwkMDE1MDogCi1MJDAxNDk6IAotCWxkdyAzMiglcjQpLCVyOAotCWxkdyAzNiglcjQpLCVyNwotCWxkdyA0MCglcjQpLCVyNgotCWxkdyA0NCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIG9ic2F2ZXN0cmluZyxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGluaXRfdHlwZSxDT0RFCi0JLkVYUE9SVCBpbml0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUixSVE5WQUw9R1IKLWluaXRfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxNCw4KCVyNCkKLQlzdHcgJXIxMywxMiglcjQpCi0Jc3R3ICVyMTIsMTYoJXI0KQotCXN0dyAlcjExLDIwKCVyNCkKLQlzdHcgJXIxMCwyNCglcjQpCi0Jc3R3ICVyOSwyOCglcjQpCi0Jc3R3ICVyOCwzMiglcjQpCi0Jc3R3ICVyNywzNiglcjQpCi0Jc3R3ICVyNiw0MCglcjQpCi0Jc3R3ICVyNSw0NCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC0xMiglcjApLCVyOQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI5LCVyMTAKLQlzdHcgJXIyNCwwKCVyMTApCi0JbGRvIC0xNiglcjApLCVyMTEKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyMTEsJXIxMgotCXN0dyAlcjIzLDAoJXIxMikKLQlsZG8gLTIwKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMwotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTMpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXIxMykKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRoIDMyKCVyMTMpLCVyMjAKLQlsZGggMiglcjE5KSwlcjE5Ci0Jb3IgJXIyMCwlcjE5LCVyMjAKLQlzdGggJXIyMCwzMiglcjEzKQotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTU5LCVyMAotCW5vcAotCWxkbyAtMjAoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTU5LCVyMAotCW5vcAotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTQKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgc3RybGVuLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGRvIC0yMCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZG8gMTIwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE0KSwlcjI2Ci0JY29weSAlcjE5LCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgb2JzYXZlc3RyaW5nLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0Jc3R3ICVyMTksNCglcjEzKQotCWJsLG4gTCQwMTYwLCVyMAotTCQwMTU5OiAKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDQoJXIxMykKLUwkMDE2MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMywlcjIwLCVyMAotCWJsIEwkMDE2MiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMTYyLCVyMAotCW5vcAotCWJsLG4gTCQwMTYxLCVyMAotTCQwMTYyOiAKLQlzdHcgJXIxOSw0OCglcjEzKQotTCQwMTYxOiAKLQljb3B5ICVyMTMsJXIyOAotCWJsLG4gTCQwMTU4LCVyMAotTCQwMTU4OiAKLQlsZHcgOCglcjQpLCVyMTQKLQlsZHcgMTIoJXI0KSwlcjEzCi0JbGR3IDE2KCVyNCksJXIxMgotCWxkdyAyMCglcjQpLCVyMTEKLQlsZHcgMjQoJXI0KSwlcjEwCi0JbGR3IDI4KCVyNCksJXI5Ci0JbGR3IDMyKCVyNCksJXI4Ci0JbGR3IDM2KCVyNCksJXI3Ci0JbGR3IDQwKCVyNCksJXI2Ci0JbGR3IDQ0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDIyOiAKLQkuU1RSSU5HICJpbnRlcm5hbCBlcnJvciAtIGludmFsaWQgZnVuZGFtZW50YWwgdHlwZSBpZCAlZFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjM6IAotCS5TVFJJTkcgImludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgdHlwZSBpZCAlZFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjQ6IAotCS5TVFJJTkcgInZvaWRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDI1OiAKLQkuU1RSSU5HICJib29sZWFuXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNjogCi0JLlNUUklORyAic3RyaW5nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNzogCi0JLlNUUklORyAiY2hhclx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjg6IAotCS5TVFJJTkcgInNpZ25lZCBjaGFyXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyOTogCi0JLlNUUklORyAidW5zaWduZWQgY2hhclx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzA6IAotCS5TVFJJTkcgInNob3J0XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzMTogCi0JLlNUUklORyAidW5zaWduZWQgc2hvcnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMyOiAKLQkuU1RSSU5HICJpbnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMzOiAKLQkuU1RSSU5HICJ1bnNpZ25lZCBpbnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM0OiAKLQkuU1RSSU5HICJmaXhlZCBkZWNpbWFsXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzNTogCi0JLlNUUklORyAibG9uZ1x4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzY6IAotCS5TVFJJTkcgInVuc2lnbmVkIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM3OiAKLQkuU1RSSU5HICJsb25nIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM4OiAKLQkuU1RSSU5HICJzaWduZWQgbG9uZyBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzOTogCi0JLlNUUklORyAidW5zaWduZWQgbG9uZyBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MDogCi0JLlNUUklORyAiZmxvYXRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQxOiAKLQkuU1RSSU5HICJkb3VibGVceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQyOiAKLQkuU1RSSU5HICJmbG9hdGluZyBkZWNpbWFsXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MzogCi0JLlNUUklORyAibG9uZyBkb3VibGVceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ0OiAKLQkuU1RSSU5HICJjb21wbGV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0NTogCi0JLlNUUklORyAiZG91YmxlIGNvbXBsZXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ2OiAKLQkuU1RSSU5HICJsb25nIGRvdWJsZSBjb21wbGV4XHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9mdW5kYW1lbnRhbF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEyLDMyKCVyNCkKLQlzdHcgJXIxMSwzNiglcjQpCi0Jc3R3ICVyMTAsNDAoJXI0KQotCXN0dyAlcjksNDQoJXI0KQotCXN0dyAlcjgsNDgoJXI0KQotCXN0dyAlcjcsNTIoJXI0KQotCXN0dyAlcjYsNTYoJXI0KQotCXN0dyAlcjUsNjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWNvcHkgJXIwLCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw9IDAsJXIyMCwlcjAKLQlibCBMJDAxNjUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyNSglcjApLCVyMTkKLQljb21jbHIsPD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDE2NSwlcjAKLQlub3AKLQlibCxuIEwkMDE2NCwlcjAKLUwkMDE2NTogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMjIsJXIyNgotCWxkbyBSJ0xDJDAwMjIoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotCWJsLG4gTCQwMTY2LCVyMAotTCQwMTY0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDE5NiglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAxNjcsJXIwCi0Jbm9wCi0JbGRvIDEwNCglcjApLCVyMTEKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjEyCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxMjAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyNCkKLQlzdHcgJXIxMSwxNiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIxOQotCWxkdyAxMiglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNjgsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAxNiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMTkKLQlibCxuIEwkMDE2OSwlcjAKLUwkMDE2ODogCi0JY29weSAlcjAsJXIxOQotTCQwMTY5OiAKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDI0KCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxNzAsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDE3MDogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTcxLCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAxNzIsJXIwCi1MJDAxNzE6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE3MjogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMjQoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTk2KCVyMTIpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxOTYoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMTEsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotTCQwMTY3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JbGR3IDE5NiglcjE5KSwlcjE5Ci0JYWRkICVyMjAsJXIxOSwlcjEwCi0JbGR3IDAoJXIxMCksJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDE3MywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JYWRkaSx1diAtMjYsJXIyMCwlcjAKLQlibHIsbiAlcjIwLCVyMAotCWIsbiBMJDAxNzUKLUwkMDIwMjogCi0JYiBMJDAxNzYKLQlub3AKLQliIEwkMDE3NwotCW5vcAotCWIgTCQwMTc5Ci0Jbm9wCi0JYiBMJDAxODAKLQlub3AKLQliIEwkMDE4MQotCW5vcAotCWIgTCQwMTgyCi0Jbm9wCi0JYiBMJDAxODMKLQlub3AKLQliIEwkMDE4NAotCW5vcAotCWIgTCQwMTg1Ci0Jbm9wCi0JYiBMJDAxODYKLQlub3AKLQliIEwkMDE4NwotCW5vcAotCWIgTCQwMTg5Ci0Jbm9wCi0JYiBMJDAxOTAKLQlub3AKLQliIEwkMDE5MQotCW5vcAotCWIgTCQwMTkyCi0Jbm9wCi0JYiBMJDAxOTMKLQlub3AKLQliIEwkMDE5NAotCW5vcAotCWIgTCQwMTk1Ci0Jbm9wCi0JYiBMJDAxOTYKLQlub3AKLQliIEwkMDE5OAotCW5vcAotCWIgTCQwMTk5Ci0Jbm9wCi0JYiBMJDAyMDAKLQlub3AKLQliIEwkMDIwMQotCW5vcAotCWIgTCQwMTc4Ci0Jbm9wCi0JYiBMJDAxODgKLQlub3AKLQliIEwkMDE5NwotCW5vcAotTCQwMTc1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAyMywlcjI2Ci0JbGRvIFInTEMkMDAyMyglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOSglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjQsJXIyMwotCWxkbyBSJ0xDJDAwMjQoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE3NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDI1LCVyMjMKLQlsZG8gUidMQyQwMDI1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzg6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gMTIoJXIwKSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDI2LCVyMjMKLQlsZG8gUidMQyQwMDI2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzk6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjcsJXIyMwotCWxkbyBSJ0xDJDAwMjcoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDI4LCVyMjMKLQlsZG8gUidMQyQwMDI4KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAyOSwlcjIzCi0JbGRvIFInTEMkMDAyOSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTgyOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDIoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDMwLCVyMjMKLQlsZG8gUidMQyQwMDMwKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODM6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMiglcjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzMCwlcjIzCi0JbGRvIFInTEMkMDAzMCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDIoJXIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzEsJXIyMwotCWxkbyBSJ0xDJDAwMzEoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzMiwlcjIzCi0JbGRvIFInTEMkMDAzMiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzIsJXIyMwotCWxkbyBSJ0xDJDAwMzIoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDMzLCVyMjMKLQlsZG8gUidMQyQwMDMzKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODg6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzQsJXIyMwotCWxkbyBSJ0xDJDAwMzQoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4OTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzNSwlcjIzCi0JbGRvIFInTEMkMDAzNSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTkwOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzUsJXIyMwotCWxkbyBSJ0xDJDAwMzUoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM2LCVyMjMKLQlsZG8gUidMQyQwMDM2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTI6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzcsJXIyMwotCWxkbyBSJ0xDJDAwMzcoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM4LCVyMjMKLQlsZG8gUidMQyQwMDM4KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzOSwlcjIzCi0JbGRvIFInTEMkMDAzOSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQwLCVyMjMKLQlsZG8gUidMQyQwMDQwKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDEsJXIyMwotCWxkbyBSJ0xDJDAwNDEoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MiwlcjIzCi0JbGRvIFInTEMkMDA0MiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk4OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDE2KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MywlcjIzCi0JbGRvIFInTEMkMDA0MyglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk5OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDgoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ0LCVyMjMKLQlsZG8gUidMQyQwMDQ0KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAyMDA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gMTYoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ1LCVyMjMKLQlsZG8gUidMQyQwMDQ1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAyMDE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gMTYoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQ2LCVyMjMKLQlsZG8gUidMQyQwMDQ2KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzQ6IAotCXN0dyAlcjksMCglcjEwKQotTCQwMTczOiAKLUwkMDE2NjogCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMTYzLCVyMAotTCQwMTYzOiAKLQlsZHcgMzIoJXI0KSwlcjEyCi0JbGR3IDM2KCVyNCksJXIxMQotCWxkdyA0MCglcjQpLCVyMTAKLQlsZHcgNDQoJXI0KSwlcjkKLQlsZHcgNDgoJXI0KSwlcjgKLQlsZHcgNTIoJXI0KSwlcjcKLQlsZHcgNTYoJXI0KSwlcjYKLQlsZHcgNjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBwdXRzX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDA0NzogCi0JLlNUUklORyAiIFx4MDAiCi0JLklNUE9SVCBwcmludGZfZmlsdGVyZWQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDQ4OiAKLQkuU1RSSU5HICIxXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0OTogCi0JLlNUUklORyAiMFx4MDAiCi0JLmFsaWduIDQKLXByaW50X2JpdF92ZWN0b3I6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCwxNiglcjQpCi0Jc3R3ICVyNywyMCglcjQpCi0Jc3R3ICVyNiwyNCglcjQpCi0Jc3R3ICVyNSwyOCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0Jc3R3ICVyMCw4KCVyNCkKLUwkMDIwNDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JbGR3IDAoJXIxOSksJXIxOQotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyMDUsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JY29taWNsciw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMDgsJXIwCi0Jbm9wCi0JbGRvIDcoJXIxOSksJXIxOQotTCQwMjA4OiAKLQlleHRycyAlcjE5LDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMjA3LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDQ3LCVyMjYKLQlsZG8gUidMQyQwMDQ3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyMDc6IAotCWxkdyA4KCVyNCksJXIyMAotCWV4dHJzICVyMjAsMjgsMjksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlhZGQgJXIxOSwlcjIxLCVyMjAKLQlsZGIgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JZXh0cnUgJXIyMCwzMSwzLCVyMjEKLQlzdWJpLD4+PSAzMSwlcjIxLCVyMjAKLQljb3B5ICVyMCwlcjIwCi0JbXRzYXIgJXIyMAotCXZleHRycyAlcjE5LDMyLCVyMTkKLQlleHRydSAlcjE5LDMxLDEsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDIwOSwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA0OCwlcjI2Ci0JbGRvIFInTEMkMDA0OCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMTAsJXIwCi1MJDAyMDk6IAotCWxkaWwgTCdMQyQwMDQ5LCVyMjYKLQlsZG8gUidMQyQwMDQ5KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIxMDogCi1MJDAyMDY6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDIwNCwlcjAKLUwkMDIwNTogCi1MJDAyMDM6IAotCWxkdyAxNiglcjQpLCVyOAotCWxkdyAyMCglcjQpLCVyNwotCWxkdyAyNCglcjQpLCVyNgotCWxkdyAyOCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsQ09ERQotCS5hbGlnbiA0Ci1wcmludF9hcmdfdHlwZXM6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCw4KCVyNCkKLQlzdHcgJXI3LDEyKCVyNCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjEyLCVyMAotCW5vcAotTCQwMjEzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDIxNCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAyKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA0KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gOSwlcjIwLCVyMAotCWJsIEwkMDIxNSwlcjAKLQlub3AKLQlibCxuIEwkMDIxNCwlcjAKLUwkMDIxNTogCi0JYmwsbiBMJDAyMTMsJXIwCi1MJDAyMTQ6IAotTCQwMjEyOiAKLUwkMDIxMTogCi0JbGR3IDgoJXI0KSwlcjgKLQlsZHcgMTIoJXI0KSwlcjcKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBwcmludGZpX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDA1MDogCi0JLlNUUklORyAiZm5fZmllbGRsaXN0cyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTE6IAotCS5TVFJJTkcgIlslZF0gbmFtZSAnJXMnICgweCV4KSBsZW5ndGggJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1MjogCi0JLlNUUklORyAiWyVkXSBwaHlzbmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDUzOiAKLQkuU1RSSU5HICJ0eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NDogCi0JLlNUUklORyAiYXJncyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTU6IAotCS5TVFJJTkcgImZjb250ZXh0IDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NjogCi0JLlNUUklORyAiaXNfY29uc3QgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NzogCi0JLlNUUklORyAiaXNfdm9sYXRpbGUgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1ODogCi0JLlNUUklORyAiaXNfcHJpdmF0ZSAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDU5OiAKLQkuU1RSSU5HICJpc19wcm90ZWN0ZWQgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2MDogCi0JLlNUUklORyAiaXNfc3R1YiAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDYxOiAKLQkuU1RSSU5HICJ2b2Zmc2V0ICV1XHgwYVx4MDAiCi0JLmFsaWduIDQKLWR1bXBfZm5fZmllbGRsaXN0czogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGR3IDQ4KCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTAsJXIyNQotCWxkbyBSJ0xDJDAwNTAoJXIyNSksJXIyNQotCWxkdyAyMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCXN0dyAlcjAsOCglcjQpCi1MJDAyMTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMjE4LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwzMCwzMSwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMjAoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjQpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGR3IDQ4KCVyMjEpLCVyMjAKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMzAsMzEsJXIyMQotCWFkZCAlcjIxLCVyMjIsJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIxCi0JbGR3IDIwKCVyMjApLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQ4KCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjMKLQl6ZGVwICVyMjMsMzAsMzEsJXIyMgotCWFkZCAlcjIyLCVyMjMsJXIyMgotCXpkZXAgJXIyMiwyOSwzMCwlcjIyCi0JbGR3IDIwKCVyMjEpLCVyMjMKLQlhZGQgJXIyMiwlcjIzLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTUyKCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIzCi0JemRlcCAlcjIzLDMwLDMxLCVyMjIKLQlhZGQgJXIyMiwlcjIzLCVyMjIKLQl6ZGVwICVyMjIsMjksMzAsJXIyMgotCWxkdyAyMCglcjIxKSwlcjIzCi0JYWRkICVyMjIsJXIyMywlcjIxCi0JbGR3IDQoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01NiglcjMwKQotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTEsJXIyNQotCWxkbyBSJ0xDJDAwNTEoJXIyNSksJXIyNQotCWxkdyA4KCVyNCksJXIyNAotCWxkdyAwKCVyMjApLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0Jc3R3ICVyMCwxMiglcjQpCi1MJDAyMjA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwzMCwzMSwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMjAoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgNCglcjE5KSwlcjE5Ci0JY29tY2xyLDwgJXIyMCwlcjE5LCVyMAotCWJsIEwkMDIyMSwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDQoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxMiglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjksMzAsJXIyMQotCWFkZCAlcjIxLCVyMjIsJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIxCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTIoJXIzMCkKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDUyLCVyMjUKLQlsZG8gUidMQyQwMDUyKCVyMjUpLCVyMjUKLQlsZHcgMTIoJXI0KSwlcjI0Ci0JbGR3IDAoJXIyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTMsJXIyNQotCWxkbyBSJ0xDJDAwNTMoJXIyNSksJXIyNQotCWxkdyA0KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjE5Ci0JYWRkICVyMTksJXIyMCwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAxMCglcjIxKSwlcjIwCi0JbGR3IDQoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjAsJXIyMiwlcjIxCi0JbGR3IDQoJXIyMSksJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTQsJXIyNQotCWxkbyBSJ0xDJDAwNTQoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjE5LCVyMjEsJXIyMAotCWxkdyA0KCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgNDgoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2FyZ190eXBlcywlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTUsJXIyNQotCWxkbyBSJ0xDJDAwNTUoJXIyNSksJXIyNQotCWxkdyAxMiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDArMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTYsJXIyNQotCWxkbyBSJ0xDJDAwNTYoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDErMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTcsJXIyNQotCWxkbyBSJ0xDJDAwNTcoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDIrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTgsJXIyNQotCWxkbyBSJ0xDJDAwNTgoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDMrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTksJXIyNQotCWxkbyBSJ0xDJDAwNTkoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDQrMS0xLDEsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjAsJXIyNQotCWxkbyBSJ0xDJDAwNjAoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlleHRydSAlcjIxLDgrMjQtMSwyNCwlcjIyCi0JbGRvIC0yKCVyMjIpLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDYxLCVyMjUKLQlsZG8gUidMQyQwMDYxKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyMjogCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JYmwsbiBMJDAyMjAsJXIwCi1MJDAyMjE6IAotTCQwMjE5OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAyMTcsJXIwCi1MJDAyMTg6IAotTCQwMjE2OiAKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwNjI6IAotCS5TVFJJTkcgIm5fYmFzZWNsYXNzZXMgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2MzogCi0JLlNUUklORyAibmZuX2ZpZWxkcyAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY0OiAKLQkuU1RSSU5HICJuZm5fZmllbGRzX3RvdGFsICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjU6IAotCS5TVFJJTkcgInZpcnR1YWxfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqMHgleClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY2OiAKLQkuU1RSSU5HICJceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2NzogCi0JLlNUUklORyAicHJpdmF0ZV9maWVsZF9iaXRzICglZCBiaXRzIGF0ICoweCV4KVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjg6IAotCS5TVFJJTkcgInByb3RlY3RlZF9maWVsZF9iaXRzICglZCBiaXRzIGF0ICoweCV4KVx4MDAiCi0JLmFsaWduIDQKLXByaW50X2NwbHVzX3N0dWZmOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsMTYoJXI0KQotCXN0dyAlcjcsMjAoJXI0KQotCXN0dyAlcjYsMjQoJXI0KQotCXN0dyAlcjUsMjgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAwKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjIsJXIyNQotCWxkbyBSJ0xDJDAwNjIoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAyKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjMsJXIyNQotCWxkbyBSJ0xDJDAwNjMoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZHcgNDgoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2NCwlcjI1Ci0JbGRvIFInTEMkMDA2NCglcjI1KSwlcjI1Ci0JbGR3IDQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZGggMCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjE5Ci0JY29taWNsciw8IDAsJXIxOSwlcjAKLQlibCBMJDAyMjQsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjIxCi0JbGRoIDAoJXIyMSksJXIyMgotCWV4dHJzICVyMjIsMzEsMTYsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNDgoJXIyMiksJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2NSwlcjI1Ci0JbGRvIFInTEMkMDA2NSglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQlsZHcgOCglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAwKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZHcgOCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzNCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSwxNiwlcjE5Ci0JY29taWNsciw8IDAsJXIxOSwlcjAKLQlibCBMJDAyMjUsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMjYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY3LCVyMjUKLQlsZG8gUidMQyQwMDY3KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAxMiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkdyAxMiglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAyMjcsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY4LCVyMjUKLQlsZG8gUidMQyQwMDY4KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAxNiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkdyAxNiglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2JpdF92ZWN0b3IsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIyNzogCi1MJDAyMjU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQljb21pY2xyLDwgMCwlcjE5LCVyMAotCWJsIEwkMDIyOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZHVtcF9mbl9maWVsZGxpc3RzLCVyMgotCW5vcAotTCQwMjI4OiAKLUwkMDIyMzogCi0JbGR3IDE2KCVyNCksJXI4Ci0JbGR3IDIwKCVyNCksJXI3Ci0JbGR3IDI0KCVyNCksJXI2Ci0JbGR3IDI4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDY5OiAKLQkuU1RSSU5HICJ0eXBlIG5vZGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDcwOiAKLQkuU1RSSU5HICJuYW1lICclcycgKDB4JXgpXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzE6IAotCS5TVFJJTkcgIjxOVUxMPlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzI6IAotCS5TVFJJTkcgImNvZGUgMHgleCBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDczOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1VOREVGKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzQ6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUFRSKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzU6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfQVJSQVkpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NjogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9TVFJVQ1QpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9VTklPTilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDc4OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0VOVU0pXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3OTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9GVU5DKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODA6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfSU5UKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODE6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRkxUKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODI6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfVk9JRClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDgzOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1NFVClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDg0OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1JBTkdFKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODU6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUEFTQ0FMX0FSUkFZKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODY6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRVJST1IpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4NzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9NRU1CRVIpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4ODogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9NRVRIT0QpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4OTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9SRUYpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MDogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9DSEFSKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTE6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfQk9PTClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDkyOiAKLQkuU1RSSU5HICIoVU5LTk9XTiBUWVBFIENPREUpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MzogCi0JLlNUUklORyAibGVuZ3RoICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTQ6IAotCS5TVFJJTkcgIm9iamZpbGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDk1OiAKLQkuU1RSSU5HICJ0YXJnZXRfdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTY6IAotCS5TVFJJTkcgInBvaW50ZXJfdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTc6IAotCS5TVFJJTkcgInJlZmVyZW5jZV90eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5ODogCi0JLlNUUklORyAiZnVuY3Rpb25fdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTk6IAotCS5TVFJJTkcgImZsYWdzIDB4JXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAwOiAKLQkuU1RSSU5HICIgVFlQRV9GTEFHX1VOU0lHTkVEXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwMTogCi0JLlNUUklORyAiIFRZUEVfRkxBR19TSUdORURceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAyOiAKLQkuU1RSSU5HICIgVFlQRV9GTEFHX1NUVUJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAzOiAKLQkuU1RSSU5HICJuZmllbGRzICVkIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNDogCi0JLlNUUklORyAiWyVkXSBiaXRwb3MgJWQgYml0c2l6ZSAlZCB0eXBlIDB4JXggbmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTA1OiAKLQkuU1RSSU5HICJ2cHRyX2Jhc2V0eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNjogCi0JLlNUUklORyAidnB0cl9maWVsZG5vICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDc6IAotCS5TVFJJTkcgImFyZ190eXBlcyAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDg6IAotCS5TVFJJTkcgImNwbHVzX3N0dWZmIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwOTogCi0JLlNUUklORyAidHlwZV9zcGVjaWZpYyAweCV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDExMDogCi0JLlNUUklORyAiICh1bmtub3duIGRhdGEgZm9ybSlceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCByZWN1cnNpdmVfZHVtcF90eXBlLENPREUKLQkuRVhQT1JUIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUgotcmVjdXJzaXZlX2R1bXBfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDE2KCVyNCkKLQlzdHcgJXI3LDIwKCVyNCkKLQlzdHcgJXI2LDI0KCVyNCkKLQlzdHcgJXI1LDI4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjksJXIyNQotCWxkbyBSJ0xDJDAwNjkoJXIyNSksJXIyNQotCWxkdyAwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNCglcjIyKSwlcjIxCi0JbGRvIC00KCVyMCksJXIyMgotCWxkbyAtMzIoJXI0KSwlcjI0Ci0JYWRkICVyMjQsJXIyMiwlcjIzCi0JbGR3IDAoJXIyMyksJXIyMgotCWxkdyA0KCVyMjIpLCVyMjMKLQljb21pY2xyLD0gMCwlcjIzLCVyMAotCWJsIEwkMDIzMCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA3MSwlcjIxCi0JbGRvIFInTEMkMDA3MSglcjIxKSwlcjIxCi1MJDAyMzA6IAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA3MCwlcjI1Ci0JbGRvIFInTEMkMDA3MCglcjI1KSwlcjI1Ci0JbGR3IDQoJXIyMCksJXIyNAotCWNvcHkgJXIyMSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNzIsJXIyNQotCWxkbyBSJ0xDJDAwNzIoJXIyNSksJXIyNQotCWxkdyAwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlhZGRpLHV2IC0xOSwlcjIwLCVyMAotCWJscixuICVyMjAsJXIwCi0JYixuIEwkMDI1MQotTCQwMjUyOiAKLQliIEwkMDIzMgotCW5vcAotCWIgTCQwMjMzCi0Jbm9wCi0JYiBMJDAyMzQKLQlub3AKLQliIEwkMDIzNQotCW5vcAotCWIgTCQwMjM2Ci0Jbm9wCi0JYiBMJDAyMzcKLQlub3AKLQliIEwkMDIzOAotCW5vcAotCWIgTCQwMjM5Ci0Jbm9wCi0JYiBMJDAyNDAKLQlub3AKLQliIEwkMDI0MQotCW5vcAotCWIgTCQwMjQyCi0Jbm9wCi0JYiBMJDAyNDMKLQlub3AKLQliIEwkMDI0NAotCW5vcAotCWIgTCQwMjQ1Ci0Jbm9wCi0JYiBMJDAyNDYKLQlub3AKLQliIEwkMDI0NwotCW5vcAotCWIgTCQwMjQ4Ci0Jbm9wCi0JYiBMJDAyNDkKLQlub3AKLQliIEwkMDI1MAotCW5vcAotTCQwMjMyOiAKLQlsZGlsIEwnTEMkMDA3MywlcjI2Ci0JbGRvIFInTEMkMDA3MyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzM6IAotCWxkaWwgTCdMQyQwMDc0LCVyMjYKLQlsZG8gUidMQyQwMDc0KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNDogCi0JbGRpbCBMJ0xDJDAwNzUsJXIyNgotCWxkbyBSJ0xDJDAwNzUoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM1OiAKLQlsZGlsIEwnTEMkMDA3NiwlcjI2Ci0JbGRvIFInTEMkMDA3NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzY6IAotCWxkaWwgTCdMQyQwMDc3LCVyMjYKLQlsZG8gUidMQyQwMDc3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNzogCi0JbGRpbCBMJ0xDJDAwNzgsJXIyNgotCWxkbyBSJ0xDJDAwNzgoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM4OiAKLQlsZGlsIEwnTEMkMDA3OSwlcjI2Ci0JbGRvIFInTEMkMDA3OSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzk6IAotCWxkaWwgTCdMQyQwMDgwLCVyMjYKLQlsZG8gUidMQyQwMDgwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MDogCi0JbGRpbCBMJ0xDJDAwODEsJXIyNgotCWxkbyBSJ0xDJDAwODEoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQxOiAKLQlsZGlsIEwnTEMkMDA4MiwlcjI2Ci0JbGRvIFInTEMkMDA4MiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDI6IAotCWxkaWwgTCdMQyQwMDgzLCVyMjYKLQlsZG8gUidMQyQwMDgzKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MzogCi0JbGRpbCBMJ0xDJDAwODQsJXIyNgotCWxkbyBSJ0xDJDAwODQoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ0OiAKLQlsZGlsIEwnTEMkMDA4NSwlcjI2Ci0JbGRvIFInTEMkMDA4NSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDU6IAotCWxkaWwgTCdMQyQwMDg2LCVyMjYKLQlsZG8gUidMQyQwMDg2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0NjogCi0JbGRpbCBMJ0xDJDAwODcsJXIyNgotCWxkbyBSJ0xDJDAwODcoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ3OiAKLQlsZGlsIEwnTEMkMDA4OCwlcjI2Ci0JbGRvIFInTEMkMDA4OCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDg6IAotCWxkaWwgTCdMQyQwMDg5LCVyMjYKLQlsZG8gUidMQyQwMDg5KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0OTogCi0JbGRpbCBMJ0xDJDAwOTAsJXIyNgotCWxkbyBSJ0xDJDAwOTAoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjUwOiAKLQlsZGlsIEwnTEMkMDA5MSwlcjI2Ci0JbGRvIFInTEMkMDA5MSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNTE6IAotCWxkaWwgTCdMQyQwMDkyLCVyMjYKLQlsZG8gUidMQyQwMDkyKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzMTogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDkzLCVyMjUKLQlsZG8gUidMQyQwMDkzKCVyMjUpLCVyMjUKLQlsZHcgOCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTQsJXIyNQotCWxkbyBSJ0xDJDAwOTQoJXIyNSksJXIyNQotCWxkdyAxMiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTUsJXIyNQotCWxkbyBSJ0xDJDAwOTUoJXIyNSksJXIyNQotCWxkdyAxNiglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTYoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1MywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAyKCVyMjEpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotTCQwMjUzOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk2LCVyMjUKLQlsZG8gUidMQyQwMDk2KCVyMjUpLCVyMjUKLQlsZHcgMjAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk3LCVyMjUKLQlsZG8gUidMQyQwMDk3KCVyMjUpLCVyMjUKLQlsZHcgMjQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk4LCVyMjUKLQlsZG8gUidMQyQwMDk4KCVyMjUpLCVyMjUKLQlsZHcgMjgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDMyKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTksJXIyNQotCWxkbyBSJ0xDJDAwOTkoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMzEsMSwlcjE5Ci0JZXh0cnMgJXIxOSwzMSwxNiwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjU0LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTAwLCVyMjYKLQlsZG8gUidMQyQwMTAwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyNTQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWxkbyAyKCVyMCksJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIxOQotCWV4dHJzICVyMTksMzEsMTYsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1NSwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDEwMSwlcjI2Ci0JbGRvIFInTEMkMDEwMSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjU1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlsZG8gNCglcjApLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNTYsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAxMDIsJXIyNgotCWxkbyBSJ0xDJDAxMDIoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI1NjogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDM0KCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTAzLCVyMjUKLQlsZG8gUidMQyQwMTAzKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyAzNiglcjIxKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCXN0dyAlcjAsOCglcjQpCi1MJDAyNTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzQoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyNTgsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDgoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI3LDI4LCVyMjIKLQlsZHcgMzYoJXIyMCksJXIyMQotCWFkZCAlcjIyLCVyMjEsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDQoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDgoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01NiglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDEyKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNjAoJXIzMCkKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDI3LDI4LCVyMjMKLQlsZHcgMzYoJXIyMSksJXIyMgotCWFkZCAlcjIzLCVyMjIsJXIyMQotCWxkdyAxMiglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTY0KCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMgotCXpkZXAgJXIyMiwyNywyOCwlcjIzCi0JbGR3IDM2KCVyMjEpLCVyMjIKLQlhZGQgJXIyMywlcjIyLCVyMjEKLQlsZHcgMTIoJXIyMSksJXIyMgotCWNvbWljbHIsPSAwLCVyMjIsJXIwCi0JYmwgTCQwMjYwLCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDcxLCVyMjEKLQlsZG8gUidMQyQwMDcxKCVyMjEpLCVyMjEKLQlzdHcgJXIyMSwtNjQoJXIzMCkKLUwkMDI2MDogCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDEwNCwlcjI1Ci0JbGRvIFInTEMkMDEwNCglcjI1KSwlcjI1Ci0JbGR3IDgoJXI0KSwlcjI0Ci0JbGR3IDAoJXIyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNjEsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDQoJXIyMSksJXIyMAotCWxkdyA4KCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKLQlub3AKLUwkMDI2MTogCi1MJDAyNTk6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDI1NywlcjAKLUwkMDI1ODogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwNSwlcjI1Ci0JbGRvIFInTEMkMDEwNSglcjI1KSwlcjI1Ci0JbGR3IDQwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjYyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDIoJXIyMSksJXIyMAotCWxkdyA0MCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi1MJDAyNjI6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDYsJXIyNQotCWxkbyBSJ0xDJDAxMDYoJXIyNSksJXIyNQotCWxkdyA0NCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JY29taWNsciw8PiA2LCVyMTksJXIwCi0JYmwgTCQwMjY1LCVyMAotCW5vcAotCWNvbWljbHIsPj0gNiwlcjE5LCVyMAotCWJsIEwkMDI3MCwlcjAKLQlub3AKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAyNjYsJXIwCi0Jbm9wCi0JYmwsbiBMJDAyNjcsJXIwCi1MJDAyNzA6IAotCWNvbWljbHIsPD4gMTUsJXIxOSwlcjAKLQlibCBMJDAyNjQsJXIwCi0Jbm9wCi0JYmwsbiBMJDAyNjcsJXIwCi1MJDAyNjQ6IAotTCQwMjY1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTA3LCVyMjUKLQlsZG8gUidMQyQwMTA3KCVyMjUpLCVyMjUKLQlsZHcgNDgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDQ4KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9hcmdfdHlwZXMsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyNjMsJXIwCi1MJDAyNjY6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDgsJXIyNQotCWxkbyBSJ0xDJDAxMDgoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9jcGx1c19zdHVmZiwlcjIKLQlub3AKLQlibCxuIEwkMDI2MywlcjAKLUwkMDI2NzogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwOSwlcjI1Ci0JbGRvIFInTEMkMDEwOSglcjI1KSwlcjI1Ci0JbGR3IDQ4KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjY4LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTEwLCVyMjYKLQlsZG8gUidMQyQwMTEwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI2ODogCi0JbGRpbCBMJ0xDJDAwNjYsJXIyNgotCWxkbyBSJ0xDJDAwNjYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjYzLCVyMAotTCQwMjYzOiAKLUwkMDIyOTogCi0JbGR3IDE2KCVyNCksJXI4Ci0JbGR3IDIwKCVyNCksJXI3Ci0JbGR3IDI0KCVyNCksJXI2Ci0JbGR3IDI4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9nbG9iYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZ2xvYmFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODJmNDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9nbG9iYWwucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5jb2RlCi0JLklNUE9SVCBmb28sZGF0YQotCi0JLmFsaWduIDQKLTsgT2ZmaWNpYWwgZ2FzIGNvZGUgd2lsbCBub3QgYWNjZXB0IHN5bS0kZ2xvYmFsJC4KLQlhZGRpbCBMJWZvby0kZ2xvYmFsJCwlcjI3Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGFiZWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGFiZWxidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhZjlkMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xhYmVsYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci07IEEgY29tbWVudC4gIFRoaXMgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBhIGxhYmVsLCBidXQgYm90aCBvZiB0aGUKLTsgZm9sbG93aW5nIHN0YXRlbWVudHMgc2hvdWxkLgotbGFiZWxfd2l0aG91dF9jb2xvbgotbGFiZWxfd2l0aF9jb2xvbjoKLQotOyBBIHByb2JsZW0gdGVnZSBmb3VuZC4uLgotOyBJbnB1dCBzY3J1YmJpbmcgaW4gZ2FzIG1ha2VzIGxpZmUgYSByZWFsIG5pZ2h0bWFyZSBmb3IgYXNzZW1ibGVycwotOyBpbiB3aGljaCB0aGUgKnBvc2l0aW9uKiB3aXRoaW4gYSBsaW5lIGRldGVybWluZXMgaG93IHRvIGludGVycHJldAotOyBhIHN0cmVhbSBhIGNoYXJhY3RlcnMuICBUaGVzZSB0ZXN0IG9uZSBwYXJ0aWN1bGFyIGNhc2Ugd2hlcmUgZ2FzCi07IGhhZCB0aGUgdGVuZGVuY3kgdG8gZGVsZXRlIHRoZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIG9wY29kZSBhbmQKLTsgb3BlcmFuZHMgaWYgYSBsYWJlbCB3aXRob3V0IGEgY29sb24gYmVnYW4gYSBsaW5lLCBhbmQgdGhlIG9wZXJhbmRzCi07IHN0YXJ0ZWQgd2l0aCBhIG5vbi1udW1lcmljIGNoYXJhY3Rlci4KLUwkMQlhZGQgJXIyLCVyMiwlcjIKLUwkMjoJYWRkICVyMiwlcjIsJXIyCi1MJDMKLQlhZGQgJXIyLCVyMiwlcjIKLQotTCQ0CWFkZCAlcjIsJXIyLCVyMgotTCQ1OglhZGQgJXIyLCVyMiwlcjIKLUwkNgotCWFkZCAlcjIsJXIyLCVyMgotCi07IEFuIGluc3RydWN0aW9uIG9yIHBzZXVkby1vcCBtYXkgYmVnaW4gYW55d2hlcmUgYWZ0ZXIgY29sdW1uIDAuCi0gYixuIGxhYmVsX3dpdGhvdXRfY29sb24KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGluZXNlcGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjg0YjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLWZvbzoKLQkuV09SRCAwICEuSU1QT1JUICRiYXIkLERBVEEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sc2VsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xzZWxidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzN2U4Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xzZWxidWcucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuY29kZQotCi0JLmFsaWduIDQKLTsgSW4gZ2FzLTEuMzYgdGhlIGxkaWwgaW5zdHJ1Y3Rpb24gdXNpbmcgcGFyZW50aGVzaXMgZ2VuZXJhdGVkCi07IGdhcmJhZ2UgYml0cyB3aGlsZSB0aGUgb25lIHdpdGhvdXQgcGFyZW5zIHdvcmtlZCBmaW5lLgotCWxkaWwgTCUoMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyKSwlcjIxCi0JbGRvIEwlKDB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMikgKCVyMjEpLCVyMjEKLQlsZGlsIEwlMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyLCVyMjEKLQlsZG8gTCUweDAwMDQwMDAwIHwgMHgwMDAwMDAwOCB8IDB4MDAwMDAwMDIgKCVyMjEpLCVyMjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL25vc3Vic3BhY2UucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwNDYwMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL25vc3Vic3BhY2UucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuU1BBQ0UgJFRFWFQkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgbXBuX2FkZF9uCi0JLkVYUE9SVCBtcG5fYWRkX24sUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUixSVE5WQUw9R1IKLW1wbl9hZGRfbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0KLQlhZGQJJXIwLCVyMCwlcjAJCTsgcmVzZXQgY3kKLUxvb3A6Ci0JbGR3cyxtYQkgNCgwLCVyMjUpLCVyMjAKLQlsZHdzLG1hCSA0KDAsJXIyNCksJXIxOQotCi0JYWRkYwkgJXIxOSwlcjIwLCVyMTkKLQlhZGRpYiw8PiAtMSwlcjIzLExvb3AKLQlzdHdzLG1hCSAlcjE5LDQoMCwlcjI2KQotCi0JYnYJMCgyKQotCSBhZGRjCSVyMCwlcjAsJXIyOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkNjc0ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX3N0cmluZ190ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdHJpbmdlci5zOiBUZXN0IGVtYmVkZGVkIHF1b3RlcyBhbmQgb2N0YWwgZXNjYXBlcyBpbiBzdHJpbmdzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3RyaW5nZXIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyMzY5NkU2M1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rICAgICAgNkM3NTY0NjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDZCMkU2NDY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgICAgICA2NjIyMEEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDkzMDc4MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDMyMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbHNlbF90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxzZWxidWdzLnM6IGxzZWxidWciCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsc2VsYnVnLnMiICItYWwiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBjb3JyZWN0bHkgaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4gCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIyQTA0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzNkI1MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjJBMDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDM2QjUwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3ZhbGlkX2FsaWduX3Rlc3RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFsaWduMS5zOiB2YWxpZCBhbGlnbm1lbnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhbGlnbjEucyIgIi1hbCIKLQotICAgICMgTWFrZSBzdXJlIHdlIGNvcnJlY3RseSBoYW5kbGUgZmllbGQgc2VsZWN0b3JzLiAKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMTAwMCAwODAwMDI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDBcW15cblxdKkJMT0NLXFteXG5cXSoxMDI0XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDQwMFxbXlxuXF0qQkxPQ0tcW15cblxdKjEwMjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwODAwXFteXG5cXSpCTE9DS1xbXlxuXF0qNFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MDRcW15cblxdKkFMSUdOXFteXG5cXSo4XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgwOFxbXlxuXF0qQkxPQ0tcW15cblxdKjMwXFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgyNlxbXlxuXF0qQUxJR05cW15cblxdKjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwODI4XFteXG5cXSpCTE9DS1xbXlxuXF0qNFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgICMgR0FTLTIuMCBkb2VzIG5vdCBhbHdheXMgcGFyc2UgISBhcyBhIGxpbmUgc2VwYXJhdG9yIHdoZW4gaXQgc2hvdWxkLgotICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKgotICAgIGdhc190ZXN0ICJsaW5lc2VwYnVnLnMiICIiICIiICJsaW5lIHNlcGFyYXRvciBidWciCi0KLSAgICAjIE1ha2Ugc3VyZSBHQVMgYWNjZXB0cyBzeW50YXggZm9yIGFjY2Vzc2luZyBzdGF0aWMgZGF0YS4KLSAgICBnYXNfdGVzdCAiZ2xvYmFsLnMiICIiICIiICJjaGVjayBmb3Igc3ltLVwkZ2xvYmFsXCQgYWNjZXB0YW5jZSIKLQotICAgICMgR0FTLTIuMCAoYW5kIDEuMzYgZm9yIHRoYXQgbWF0dGVyKSBjYW4gbm90IGhhbmRsZSBhIC5wcm9jIHdoaWNoCi0gICAgIyBoYXMgbm8gbGFiZWwgYmVmb3JlIGl0LgotICAgIGdhc190ZXN0ICJwcm9jYnVnLnMiICIiICIiICJMYWJlbCBmb2xsb3dpbmcgLnByb2MiCi0KLSAgICAjIE9uZSBpcyByZXF1aXJlZCB0byBleHBsaWNpdGx5IElNUE9SVCBhbnkgbm9uLWxvY2FsIHN5bWJvbCB1c2VkCi0gICAgIyBpbiBhbiBhc3NlbWJseSBmaWxlLiAgTWFrZSBzdXJlIHdlIGdpdmUgYW4gZXJyb3IgaWYgd2UgdXNlCi0gICAgIyBhbiB1bmRlZmluZWQgc3ltYm9sLgotICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKgotICAgIGdhc190ZXN0X2Vycm9yICJ1bmRlZmJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIHdoZW4gdXNpbmcgdW5kZWZpbmVkIHN5bWJvbCIKLQotICAgICMgVGhpcyBmaWxlIGhhcyBjb2RlIGFuZCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBiZWZvcmUgc3dpdGNoaW5nIGludG8gYW55Ci0gICAgIyBzcGFjZS9zdWJzcGFjZSBwYWlyLiAgVGhpcyBzaG91bGQgcmVwb3J0IGFuIGVycm9yIGZvciBTT00gKGl0IGlzIG5vdAotICAgICMgYW4gZXJyb3IgZm9yIEVMRi4gIFRoZSBmaWxlIGFsc28gaGFzIG1pc21hdGNoZWQgZW50cnkvZXhpdCBhbmQKLSAgICAjIHByb2MvcHJvY2VuZCBwYWlycyB3aGljaCBhcmUgZXJyb3JzIGZvciBib3RoIFNPTSBhbmQgRUxGLgotICAgIGdhc190ZXN0X2Vycm9yICJub3N1YnNwYWNlLnMiICIiICJDaGVjayBmb3IgZXJyb3IocykgaW4gaW5wdXQgZmlsZSAiCi0KLSAgICAjIFRoaXMgZmlsZSBzaG91bGQgcmV0dXJuIGVycm9ycyBmb3IgYm90aCB0aGUgRU5UUllfR1IgYW5kIEVOVFJZX0ZSCi0gICAgIyBkaXJlY3RpdmVzICh0aGV5IGFyZSBvdXQtb2YtcmFuZ2UpCi0gICAgZ2FzX3Rlc3RfZXJyb3IgImVudHJ5YnVnLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gZW50cnlfZ3IgYW5kIGVudHJ5X2ZyIgotCi0gICAgIyBNYWtlIHN1cmUgZW1iZWRkZWQgcXVvdGVzIGFuZCBvY3RhbCBlc2NhcGVzIGluIHN0cmluZ3Mgd29yawotICAgIGRvX3N0cmluZ190ZXN0cwotCi0gICAgIyBNYWtlIHN1cmUgd2UgZG8gbm90IGRpZSBvbiBhIC52ZXJzaW9uIGRpcmVjdGl2ZQotICAgIGdhc190ZXN0ICJ2ZXJzaW9uYnVnLnMiICIiICIiICIudmVyc2lvbiBkaXJlY3RpdmUiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBnaXZlIGFuIGVycm9yIG9uIGEgYm9ndXMgLnNwYWNlIGRpcmVjdGl2ZS4KLSAgICAjIHJlY2VudCB2ZXJzaW9uIG9mIGdhczIgd2VudCBpbnRvIGluZmluaXRlIGxvb3BzIHByaW50aW5nCi0gICAgIyBlcnJvcnMgb24gdGhpcyB0ZXN0LgotICAgIGdhc190ZXN0X2Vycm9yICJzcGFjZWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIC5zcGFjZSBkaXJlY3RpdmUiCi0KLSAgICAjIEdBUyBzaG91bGQgZ2l2ZSBhbiBlcnJvciBmb3IgdGhpcyB0ZXN0LgotICAgIGdhc190ZXN0X2Vycm9yICJjYWxsZGF0YWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGludmFsaWQgYWd1bWVudHMgb24gLmNhbGwiCi0KLSAgICAjIE9sZCB2ZXJzaW9ucyBvZiBnYXMgaW5jb3JyZWN0bHkgZ2F2ZSBlcnJvcnMgb24gc29tZSB2YWxpZCAuRVhQT1JUIGxpbmVzCi0gICAgZ2FzX3Rlc3QgImV4cG9ydGJ1Zy5zIiAiIiAiIiAic3ludGF4IGNoZWNrIGZvciBhbiBvbGQgLkVYUE9SVCBidWciCi0KLSAgICAjIE9sZCB2ZXJzaW9ucyBvZiBnYXMgY2hva2VkIG9uIHRoaXMgZmlsZSBmb3Igc29tZSByZWFzb24KLSAgICBnYXNfdGVzdCAiZml4dXA3YnVnLnMiICIiICIiICJjaGVjayBmb3Igb2xkIFwiZml4dXA3XCIgZ2FzIGJ1ZyIKLQotICAgICMgVGVzdCBhbiBMJSBzZWxlY3RvciBwYXJzaW5nIGJ1ZyB3aGljaCBleGlzdGVkIGluIGdhcy0xLjM2ICAgCi0gICAgZG9fbHNlbF90ZXN0Ci0KLSAgICAjIEZpcnN0IGNoZWNrIGhvdyBzb21lIHZhbGlkIGFsaWdubWVudHMgYXJlIGhhbmRsZWQuCi0gICAgZG9fdmFsaWRfYWxpZ25fdGVzdHMKLQotICAgICMgTm93IGNoZWNrIHRvIG1ha2Ugc3VyZSBhbiBpbnZhbGlkIGFyZ3VtZW50IGlzIGZsYWdnZWQgYXMgYW4gZXJyb3IuCi0gICAgZ2FzX3Rlc3RfZXJyb3IgImFsaWduMi5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIGFyZ3VtZW50IHRvIC5hbGlnbiIKLQotICAgICMgR0FTIGNhbid0IGhhbmRsZSB1cHBlciBib3VuZCBmb3IgYSBQQSAuYmxvY2tbel0gZGlyZWN0aXZlCi0gICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qCi0gICAgZ2FzX3Rlc3QgImJsb2NrMS5zIiAiIiAiIiAiQ2hlY2sgbWluL21heCB2YWx1ZXMgZm9yIC5ibG9jayIKLQotICAgICMgTm93IGNoZWNrIGZvciBhbiBpbnZhbGlkIGFyZ3VtZW50Ci0gICAgZ2FzX3Rlc3RfZXJyb3IgImJsb2NrMi5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIGFyZ3VtZW50IHRvIC5ibG9jayIKLQotICAgICMgR0FTLTEuMzYgY2hva2VkIG9uIHRoaXMgZmlsZS4KLSAgICAjIEZJWE1FLiAgU2hvdWxkIGNoZWNrIHJlbG9jYXRpb25zIG1hZGUgZm9yIHRoaXMgdGVzdCEKLSAgICBnYXNfdGVzdCAiZXhwcmJ1Zy5zIiAiIiAiIiAiQ2hlY2sgZm9yIHN5bTEtc3ltMiBhY2NlcHRhbmNlIgotCi0gICAgIyBCYWQgdGhpbmdzIGhhcHBlbiBpbiB0aGUgUEEgRUxGIGJhY2tlbmQgKG90aGVycyB0b28/KSBpZiBhIG5vbi1kZWZhdWx0Ci0gICAgIyBzZWN0aW9uIGlzIGNyZWF0ZWQuLi4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSplbGYqCi0gICAgc2V0dXBfeGZhaWwgaHBwYSp3LSotKgotICAgIGdhc190ZXN0ICJzc2J1Zy5zIiAiIiAiIiAiQ2hlY2sgZm9yIGFjY2VwdGFuY2Ugb2Ygbm9uLWRlZmF1bHQgc3Vic3BhY2VzIgotCi0gICAgIyBUbyBiZSBjb21wYXRhYmxlIHdpdGggY2VydGFpbiAiZmVhdHVyZXMiIG9mIHRoZSBIUCBjb21waWxlcgotICAgICMgbm9uLWV4aXN0YW50IHJlZ2lzdGVycyBzaG91bGQgZGVmYXVsdCB0byAlcjAuCi0gICAgZ2FzX3Rlc3QgImRlZmJ1Zy5zIiAiIiAiIiAiTWlzc2luZyByZWdpc3RlciBzaG91bGQgZGVmYXVsdCB0byAlJXIwIgotCi0gICAgIyBNYWtlIHN1cmUgR0FTIHVuZGVyc3RhbmRzIGEgcmVhc29uYWJsZSBzZXQgb2Ygc3RhbmRhcmQgcHJlZGVmaW5lZAotICAgICMgcmVnaXN0ZXJzLiAgZWcgJXJwLCAlZHAsICVzcCwgZXRjLgotICAgIGdhc190ZXN0ICJzdGRyZWcucyIgIiIgIiIgIlRlc3Qgc3RhbmRhcmQgcHJlZGVmaW5lZCByZWdpc3RlcnMiCi0KLSAgICAjIE1ha2Ugc3VyZSBHQVMgd2lsbCBhY2NlcHQgYSBsYWJlbCB3aXRob3V0IGEgY29sb24uCi0gICAgZ2FzX3Rlc3QgImxhYmVsYnVnLnMiICIiICIiICJUZXN0IGxhYmVsIHdpdGhvdXQgY29sb24iCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBncm9rICMgbGluZSBkaXJlY3RpdmVzLgotICAgIGdhc190ZXN0ICJhcHBidWcucyIgIiIgIiIgIlRlc3QgYWNjZXB0YW5jZSBvZiAjbGluZSBkaXJlY3RpdmVzIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgZ2l2ZSBlcnJvcnMgaWYgYSBmbG9hdGluZyBwb2ludCBmb3JtYXQgaXMgc3BlY2lmaWVkCi0gICAgIyBmb3IgYW4geG1weXUgaW5zdHJ1Y3Rpb24gKGludGVnZXIgbXVsdGlwbGUpCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInhtcHl1YnVnLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gYm9ndXMgYXJndW1lbnQgdG8geG1weXUiCi0KLSAgICAjIE1ha2Ugc3VyZSBnYXMgaGFuZGxlcyB2YXJpb3VzIGtpbmRzIG9mIC5yZWcgcHNldWRvLW9wcwotICAgIGdhc190ZXN0ICJyZWdwb3BidWcucyIgIiIgIiIgIlRlc3QgZm9yIGJ1Z3MgaW4gLnJlZyBwc2V1ZG8tb3AiCi0KLSAgICAjIENoZWNrIHNvbWUgYnVncyB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gcGFyc2luZyAuY2FsbGluZm8gZGlyZWN0aXZlcwotICAgIGdhc190ZXN0ICJjYWxsaW5mb2J1Zy5zIiAiIiAiIiAiVGVzdCBmb3IgYnVncyBpbiAuY2FsbGluZm8gZGlyZWN0aXZlIgotCi0gICAgIyBDaGVjayBmb3IgYm9ndXMgcmVnaXN0ZXJzIGluIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZC9mbXB5c3ViCi0gICAgIyBpbnN0cnVjdGlvbnMKLSAgICBnYXNfdGVzdF9lcnJvciAiYmFkZm1weWFkZC5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJhZCBmbXB5YWRkIGluc24iCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcHJvY2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wcm9jYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTM1OGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wcm9jYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCS5leHBvcnQgZGl2dSxlbnRyeQotCS5wcm9jCi0JLmNhbGxpbmZvCi1kaXZ1OglzdHdzLG1hCQklcjQsNCglcjUpCQk7IHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JLnByb2NlbmQKLQotCS5leHBvcnQgZGl2dTIsZW50cnkKLQkucHJvYwotCS5jYWxsaW5mbwotCS5lbnRyeQotZGl2dTI6CXN0d3MsbWEJCSVyNCw0KCVyNSkJCTsgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKLQkuZXhpdAotCS5wcm9jZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3JlZ3BvcGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1N2Q5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3JlZ3BvcGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0JLmNvZGUKLQotcjAJLnJlZwklcjAKLXNoaWZ0CS5yZWcJJXNhcgotZnByZWcxMAkucmVnCSVmcjEwCi1zaGlmdDIJLnJlZwlzaGlmdAotCi07IE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgYm90Y2ggLmVxdS4uLgoteWFiYmEJLmVxdQlyMCArIHNoaWZ0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NwYWNlYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NwYWNlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2I0MDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zcGFjZWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zdGFydDoJLmxvbmcgMCwgMSwgMiwgMywgNCwgNSwgNiwgNwotCS5zcGFjZSAweDIwIC0gKC4gLSBzdGFydCkKLWZvbzoJLmxvbmcgNDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3NidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3NidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2MGUwZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TVUJTUEEgJFNIT1JUQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgwCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdGRyZWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZjY2OGM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCS5leHBvcnQgZm9vCi1mb286Ci0JLnByb2MKLQkuY2FsbGluZm8gbm9fY2FsbHMKLQkuZW50cnkKLQlsZGkgMTUsJXNwCi0JbGRpIDE1LCVycAotCWxkaSAxNSwlZHAKLQlsZGkgMTUsJXJldDAKLQlsZGkgMTUsJXJldDEKLQlsZGkgMTUsJWFyZzAKLQlsZGkgMTUsJWFyZzEKLQlsZGkgMTUsJWFyZzIKLQlsZGkgMTUsJWFyZzMKLQkuZXhpdAotIAkucHJvY2VuZCAJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0cmluZ2VyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0cmluZ2VyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDBiMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdHJpbmdlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS5kYXRhCi0KLQotOyBHQVMgdXNlZCB0byBtaXMtcGFyc2UgdGhlIGVtYmVkZGVkIHF1b3RlcwotCS5TVFJJTkcgIiNpbmNsdWRlIFwiYXdrLmRlZlwiXHgwYVx4MDAiCi0KLTsgT2N0YWwgZXNjYXBlcyB1c2VkIHRvIGNvbnN1bWUgPiAzIGNoYXJzIHdoaWNoIGxlZCB0byB0aGlzCi07IHN0cmluZyBiZWluZyBzY3Jld2VkIGluIGEgYmlnIHdheS4KLQkuU1RSSU5HICJcMDExMHgxMjMiCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmNhNTNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdW5kZWZidWcucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS5jb2RlCi0KLQkuYWxpZ24gNAotCWJsIHNvbWV3aGVyZSwlcjIKLQlub3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS92ZXJzaW9uYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZiMjIxOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS5jb2RlCi0KLQkuVkVSU0lPTiAiYWJjMTIzIgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3htcHl1YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3htcHl1YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTA4NDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS94bXB5dWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBObyBmb3JtYXQgc2VsZWN0b3IgZm9yIHhtcHl1IQotCXhtcHl1LHNnbCAlZnI0LCVmcjUsJWZyNgotCXhtcHl1LGRibCAlZnI0LCVmcjUsJWZyNgotCXhtcHl1LHF1YWQgJWZyNCwlZnI1LCVmcjYKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2I3Y2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuZGF0YQotCi0JLmFsaWduIDQKLXRhYl9fXzIKLQkud29yZCBMJDAwMDIKLQkud29yZCBMJDAwMDMKLQkud29yZCBMJDAwMDQKLQkuY29kZQotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGV4ZWN1dGUsQ09ERQotCS5FWFBPUlQgZXhlY3V0ZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotZXhlY3V0ZQotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlhZGRpbCBMJ2J1Zi0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInYnVmLSRnbG9iYWwkKCVyMSksJXIyMAotCWxkaWwgTCdMJDAwMDIsJXIxOQotCW1vdmIsPD4gJXIyNiwlcjI2LEwkMDAwMgotCWxkbyBSJ0wkMDAwMiglcjE5KSwlcjIyCi0JY29weSAlcjAsJXIyMQotCWFkZGlsIEwndGFiX19fMi0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFIndGFiX19fMi0kZ2xvYmFsJCglcjEpLCVyMjMKLQlhZGRpbCBMJ29wdGFiLSRnbG9iYWwkLCVyMjcKLQlsZG8gUidvcHRhYi0kZ2xvYmFsJCglcjEpLCVyMjAKLUwkMDAwOQotCXNoMmFkZCAlcjIxLCVyMjMsJXIxOQotCWxkaCAyKCVyMTkpLCVyMTkKLQlsZG8gMSglcjIxKSwlcjIxCi0Jc3ViICVyMTksJXIyMiwlcjE5Ci0JY29taWIsPj0gMiwlcjIxLEwkMDAwOQotCXN0aHMsbWEgJXIxOSwyKCVyMjApCi0JYnYsbiAlcjAoJXIyKQotTCQwMDAyCi0JbGRpIDEyMCwlcjE5Ci0Jc3RicyxtYSAlcjE5LDEoJXIyMCkKLQlsZGhzLG1hIDIoJXIyNiksJXIxOQotCWFkZCAlcjIyLCVyMTksJXIxOQotCWJ2LG4gJXIwKCVyMTkpCi1MJDAwMDMKLQlsZGkgMTIxLCVyMTkKLQlzdGJzLG1hICVyMTksMSglcjIwKQotCWxkaHMsbWEgMiglcjI2KSwlcjE5Ci0JYWRkICVyMjIsJXIxOSwlcjE5Ci0JYnYsbiAlcjAoJXIxOSkKLUwkMDAwNAotCWxkaSAxMjIsJXIxOQotCXN0YiAlcjE5LDAoJXIyMCkKLQlidiAlcjAoJXIyKQotCXN0YnMsbWIgJXIwLDEoJXIyMCkKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgc3RyY21wLENPREUKLQotCS5hbGlnbiA0Ci1MJEMwMDAwCi0JLlNUUklORyAieHl4eXpceDAwIgotCS5JTVBPUlQgYWJvcnQsQ09ERQotCS5JTVBPUlQgZXhpdCxDT0RFCi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWluLENPREUKLQkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLW1haW4KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JLkNBTEwgCi0JYmwgX19tYWluLCVyMgotCWxkbyAxMjgoJXIzMCksJXIzMAotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXhlY3V0ZSwlcjIKLQljb3B5ICVyMCwlcjI2Ci0JYWRkaWwgTCdvcHRhYi0kZ2xvYmFsJCwlcjI3Ci0JY29weSAlcjEsJXIxOQotCWxkbyBSJ29wdGFiLSRnbG9iYWwkKCVyMTkpLCVyMjEKLQlsZGggMiglcjIxKSwlcjIwCi0JbGRoIFInb3B0YWItJGdsb2JhbCQoJXIxOSksJXIxOQotCWFkZGlsIEwncC0kZ2xvYmFsJCwlcjI3Ci0JY29weSAlcjEsJXIyMgotCXN0aCAlcjIwLFIncC0kZ2xvYmFsJCglcjIyKQotCWxkbyBSJ3AtJGdsb2JhbCQoJXIyMiksJXIyNgotCXN0aCAlcjIwLDQoJXIyNikKLQlzdGggJXIxOSwyKCVyMjYpCi0JbGRoIDQoJXIyMSksJXIxOQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXhlY3V0ZSwlcjIKLQlzdGggJXIxOSw2KCVyMjYpCi0JYWRkaWwgTCdidWYtJGdsb2JhbCQsJXIyNwotCWNvcHkgJXIxLCVyMTkKLQlsZG8gUididWYtJGdsb2JhbCQoJXIxOSksJXIyNgotCWxkaWwgTCdMJEMwMDAwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIKLQlsZG8gUidMJEMwMDAwKCVyMjUpLCVyMjUKLQljb21pYiw9LG4gMCwlcjI4LEwkMDAxMQotCS5DQUxMIAotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDExCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBleGl0LCVyMgotCWNvcHkgJXIwLCVyMjYKLQlub3AKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmRhdGEKLQotb3B0YWIJLmNvbW0gMTAKLWJ1ZgkuY29tbSAxMAotcAkuY29tbSAxMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmRlN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuSU1QT1JUCSQkZHluY2FsbCxNSUxMSUNPREUgOyBDb2RlIGZvciBkeW5hbWljIGZ1bmN0aW9uIGNhbGxzLgotCi1fc2lndHJhbXA6Ci0JbGRpbAlMJSQkZHluY2FsbCwlcjIJOyAgIHdob3NlIGFkZHJlc3MgaXMgaW4gcjIyLgotCWJsZQlSJSQkZHluY2FsbCglc3I0LCVyMikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDQ0MzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0KLSAgCWxkaWwJTCUweGMwMDAxMDA0LCVyMQotICAJYmxlCVIlMHhjMDAwMTAwNCglc3I3LCVyMSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWczLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTgxY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWczLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLmltcG9ydCB5YWJiYSxjb2RlCi0KLSAgCWJsZQlSJXlhYmJhKCVzcjQsJXIwKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9leGl0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0Zjc4YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvbyxDT0RFCi0JLkVYUE9SVCBmb28sRU5UUlksUFJJVl9MRVY9MwotZm9vOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ2ZTQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZml4dXBidWcucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS5jb2RlCi0JYixuCSQkZm9vCi0Jbm9wCi0Jbm9wCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTUlMTElDT0RFJAotJCRmb286Ci0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmZTkzYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBnLENPREUKLQkuRVhQT1JUIGcsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixSVE5WQUw9R1IKLWcKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUCxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXIyNiwtMzYoJXIzKQotCXN0dyAlcjI1LC00MCglcjMpCi0Jc3R3ICVyMjQsLTQ0KCVyMykKLQlsZHcgLTM2KCVyMyksJXIyNgotCWxkdyAtNDAoJXIzKSwlcjI1Ci0JbGR3IC00NCglcjMpLCVyMTkKLQljb3B5ICVyMTksJXIyMgotCS5DQUxMCUFSR1cwPUdSCi0JYmwgJCRkeW5jYWxsLCVyMzEKLQljb3B5ICVyMzEsJXIyCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCxuIEwkMDAwMiwlcjAKLQlsZHcgLTM2KCVyMyksJXIyOAotCWJsLG4gTCQwMDAxLCVyMAotCWJsLG4gTCQwMDAzLCVyMAotTCQwMDAyCi0JbGR3IC00MCglcjMpLCVyMjgKLQlibCxuIEwkMDAwMSwlcjAKLUwkMDAwMwotTCQwMDAxCi0JbGR3IC0yMCglcjMpLCVyMgotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1mMl9fXzQKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxOT19DQUxMUyxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsNjQoJXIzMCkKLQlzdHcgJXIyOSw4KCVyMykKLQlzdHcgJXIyNiwtMzYoJXIzKQotCXN0dyAlcjI1LC00MCglcjMpCi0JbGR3IC0zNiglcjMpLCVyMTkKLQlsZHcgLTQwKCVyMyksJXIyMAotCWNvbWNsciw+PSAlcjIwLCVyMTksJXIxOQotCWxkaSAxLCVyMTkKLQljb3B5ICVyMTksJXIyOAotCWJsLG4gTCQwMDA1LCVyMAotTCQwMDA1Ci0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLmRhdGEKLQotCS5hbGlnbiA0Ci1MJFRSQU1QMDAwMAotCWxkdwkzNiglcjIyKSwlcjIxCi0JYmIsPj0sbgklcjIxLDMwLC4rMTYKLQlkZXBpCTAsMzEsMiwlcjIxCi0JbGR3CTQoJXIyMSksJXIxOQotCWxkdwkwKCVyMjEpLCVyMjEKLQlsZHNpZAkoJXIyMSksJXIxCi0JbXRzcAklcjEsJXNyMAotCWJlCTAoJXNyMCwlcjIxKQotCWxkdwk0MCglcjIyKSwlcjI5Ci0JLndvcmQJMAotCS53b3JkCTAKLQkuY29kZQotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGYsQ09ERQotCS5FWFBPUlQgZixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotZgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDE5MiglcjMwKQotCWxkbyAxNiglcjMpLCVyMTkKLQlhZGRpbCBMJ0wkVFJBTVAwMDAwLSRnbG9iYWwkLCVyMjcKLQlsZG8gUidMJFRSQU1QMDAwMC0kZ2xvYmFsJCglcjEpLCVyMjIKLQlsZG8gNDAoJXIwKSwlcjIwCi0JbGR3cyxtYSA0KCVyMjIpLCVyMjEKLQlhZGRpYiw+PSAtNCwlcjIwLC4tNAotCXN0d3MsbWEgJXIyMSw0KCVyMTkpCi0JbGRpbCBMJ2YyX19fNCwlcjIwCi0JbGRvIFInZjJfX180KCVyMjApLCVyMTkKLQlzdHcgJXIxOSw1MiglcjMpCi0JbGRvIDgoJXIzKSwlcjE5Ci0Jc3R3ICVyMTksNTYoJXIzKQotCWxkbyAxNiglcjMpLCVyMTkKLQlsZG8gNDgoJXIzKSwlcjIwCi0JZmRjICVyMCglcjE5KQotCWZkYyAlcjAoJXIyMCkKLQlzeW5jCi0JbGRvIDMyKCVyMTkpLCVyMjIKLQltZnNwICVzcjAsJXIyMQotCWxkc2lkICglcjE5KSwlcjIwCi0JbXRzcCAlcjIwLCVzcjAKLQlmaWMgJXIwKCVzcjAsJXIxOSkKLQlmaWMgJXIwKCVzcjAsJXIyMikKLQlzeW5jCi0JbXRzcCAlcjIxLCVzcjAKLQlub3AKLQlub3AKLQlub3AKLQlub3AKLQlub3AKLQlub3AKLQlsZG8gMTYoJXIzKSwlcjE5Ci0JbGRpIDEsJXIyNgotCWxkaSAyLCVyMjUKLQljb3B5ICVyMTksJXIyNAotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgZywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWNvbWljbHIsPD4gMiwlcjE5LCVyMAotCWJsLG4gTCQwMDA2LCVyMAotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgYWJvcnQsJXIyCi0Jbm9wCi1MJDAwMDYKLUwkMDAwNAotCWxkdyAtMjAoJXIzKSwlcjIKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIF9fbWFpbixDT0RFCi0JLklNUE9SVCBleGl0LENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsMTI4KCVyMzApCi0JLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KLQlibCBfX21haW4sJXIyCi0Jbm9wCi0JLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KLQlibCBmLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMjYKLQkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTwotCWJsIGV4aXQsJXIyCi0Jbm9wCi1MJDAwMDcKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbGFiZWxvcGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTE2Yjg3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbGFiZWxvcGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLXM6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXIzMCwxMiglcjQpCi0JbGRpbCBMJ0wkMDAwNywlcjE5Ci0JbGRvIFInTCQwMDA3KCVyMTkpLCVyMTkKLQljb21pYiw+PSAwLCVyMjYsTCQwMDAyCi0Jc3R3ICVyMTksOCglcjQpCi1MJDAwMDM6Ci1MJDAwMDI6Ci0JYiBMJDAwMDEKLQlsZG8gMSglcjApLCVyMjgKLUwkMDAwNzoKLQlsZGlsIEwnTCQwMDAyLCVyMTkKLQlsZG8gUidMJDAwMDIoJXIxOSksJXIxOQotCWNvbWIsPSAlcjI5LCVyMTksTCQwMDAyCi0JbGRvIC04KCVyNCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkxMzhiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb28sQ09ERQotCS5FWFBPUlQgZm9vLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1mb28KLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQkuQ0FMTCAKLQlibCBiYXIsJXIyCi0JbGRvIDY0KCVyMzApLCVyMzAKLQkuYmxvY2t6IDI2MjE0NAotCWxkdyAtODQoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZG8gLTY0KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGJhcixDT0RFCi0JLkVYUE9SVCBiYXIsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWJhcgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGYzYWJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi0JLmRhdGEKLWJvZ28KLQkuQUxJR04JOAotCS5XT1JEICBib2dvKzQJOyA9IDB4NAotCS5TVFJJTkcJIlx4MDBceDAwXHgwMHtceDAwXHgwMFx4MDFceEM4XHgwMFx4MDBceDAzXHgxNSIKLQkuZGF0YQotCS5FWFBPUlQJYm9nbwotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3BsYWJlbGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjRhNDY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLkVYUE9SVCBmLERBVEEKLQkuZGF0YQotCS5hbGlnbiA0Ci1mOgotCS53b3JkIFAlYWJvcnQKLQkud29yZCBQJWFib3J0Ci0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgcHJpbnRmLENPREUKLQkuY29kZQotCS5hbGlnbiA0Ci1MQyQwMDAwOgotCS5TVFJJTkcgImZyb2JceDBhXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQlsZG8gMTI4KCVyMzApLCVyMzAKLQkuQ0FMTCAKLQlibCBfX21haW4sJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwMDAsJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmLCVyMgotCWxkbyBSJ0xDJDAwMDAoJXIyNiksJXIyNgotCWxkdyAtMTQ4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGRvIC0xMjgoJXIzMCksJXIzMAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNWRlYmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0JLkNPUFlSSUdIVCAiTWV0YVdhcmUgSW5jb3Jwb3JhdGVkLCAxOTkyIgotCS5WRVJTSU9OCSJoYzIuNmEgLU8xIHQzLmNcbiIKLQotCS5kYXRhCi0JLkFMSUdOCTgKLSRMMDBEQVRBCi0JLkFMSUdOCTgKLQkuRVhQT1JUCXMKLXMKLQkuV09SRAkweDAKLQkuQkxPQ0taCTc4NjQyNQotCS5CTE9DS1oJNwotCi0JLmNvZGUKLUwkMDAxLjMKLWcJLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCTtsZG8JMTIwKCVyMCksJXIyOCAtLT4gdG8gZGVsYXkgc2xvdAotCWJ2CSVyMCglcjIpCi0JLkVYSVQKLQlsZG8JMTIwKCVyMCksJXIyOAotCS5QUk9DRU5ECi0KLQotCS5kYXRhCi0JLkFMSUdOCTQKLQkuRVhQT1JUCWwKLWwKLQkuV09SRAlQJ2cKLQkuSU1QT1JUCWNvbW1vbixEQVRBCTsgY29tbW9uIHNlY3Rpb24sIHNpemU9MAotCS5JTVBPUlQJJGdsb2JhbCQsREFUQQotCS5FWFBPUlQJZyxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjI2ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UucworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQotCS5jb2RlCi0JLmFsaWduIDQKLQkuUEFSQU0gZm9vLFJUTlZBTD1HUgotZm9vOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCi0JLmFsaWduIDQKLUxDJDAwMDA6Ci0JLndvcmQgUCVmb28KLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBiYXIsQ09ERQotCS5FWFBPUlQgYmFyLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1iYXI6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlsZGlsIEwnTEMkMDAwMCwlcjE5Ci0JbGR3IFInTEMkMDAwMCglcjE5KSwlcjI2Ci0Jc3R3ICVyMiwtMjAoJXIzMCkKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZvbywlcjIKLQlsZG8gMTI4KCVyMzApLCVyMzAKLQlsZHcgLTE0OCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkbyAtMTI4KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzNmYTM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQKLQotCS5hbGlnbiA4Ci1MJFAwMDAwCi0JLndvcmQgMHgxMjM0NTY3OAotCS53b3JkIDB4MAotCi0JLmFsaWduIDgKLUwkQzAwMDAKLQkud29yZCAweDNmZjAwMDAwCi0JLndvcmQgMHgwCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgZyxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1GUgotZwotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlzdHcgJXIxOSwtMzIoJXIzMCkKLQlsZHcgVCdMJEMwMDAwKCVyMTkpLCVyMjAKLQlidiAlcjAoJXIyKQotCWZsZGRzIDAoJXIyMCksJWZyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGFib3J0LENPREUKLQkuSU1QT1JUIGV4aXQsQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkCi0KLQkuYWxpZ24gOAotTCRDMDAwMQotCS53b3JkIDB4M2ZmMDAwMDAKLQkud29yZCAweDAKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0Jc3R3ICVyMTksLTMyKCVyMzApCi0Jc3R3ICVyNCwtMTI4KCVyMzApCi0KLQljb3B5ICVyMTksJXI0Ci0JLkNBTEwgCi0JYmwgZywlcjIKLQljb3B5ICVyNCwlcjE5Ci0JY29weSAlcjQsJXIxOQotCWxkdyBUJ0wkQzAwMDEoJXIxOSksJXIyMAotCWZsZGRzIDAoJXIyMCksJWZyOAotCWZjbXAsZGJsLD0gJWZyNCwlZnI4Ci0JZnRlc3QKLQlhZGQsdHIgJXIwLCVyMCwlcjAKLQliLG4gTCQwMDAzCi0JLkNBTEwgCi0JYmwgYWJvcnQsJXIyCi0Jbm9wCi1MJDAwMDMKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGV4aXQsJXIyCi0JbGRpIDAsJXIyNgotCW5vcAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NmE3OTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0JLmRhdGEKLQkuYWxpZ24gOAotYmxhaAotCTsgLmRvdWJsZSAwZSswMAotCS53b3JkIDAgOyA9IDB4MAotCS53b3JkIDAgOyA9IDB4MAotCS5FWFBPUlQgZm9vLERBVEEKLQkuYWxpZ24gOAotZm9vCi0JOyAuZG91YmxlIDBlKzAwCi0JLndvcmQgMCA7ID0gMHgwCi0JLndvcmQgMCA7ID0gMHgwCi0JLkVYUE9SVCB5YWJiYSxEQVRBCi0JLmFsaWduIDQKLXlhYmJhCi0JLndvcmQgMQotCS5jb2RlCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgYmFyLENPREUKLQkuRVhQT1JUIGJhcixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotYmFyCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsTk9fQ0FMTFMsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDY0KCVyMzApCi0JYWRkaWwgTCd5YWJiYS0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFIneWFiYmEtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JbGRpIDIsJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLUwkMDAwMQotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4MWJkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDY5OSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmxlYnVnLnM6IFRlc3QgZm9yIHByb3BlciByZWxvY2F0aW9uIGZvciBCTEUgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYmxlYnVnLnMiICIiICJQcm9wZXIgcmVsb2NhdGlvbiBmb3IgQkxFIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLSAgICAgICAgaWYgIVtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgIyBBdCBvbmUgdGltZSBib3RoIHZlcnNpb25zIG9mIHRoZSBhc3NlbWJsZXIgd291bGQgaW5jb3JyZWN0bHkgdXNlIAotCSAgICAjIGEgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3IgYSBCTEUgaW5zdHJ1Y3Rpb24uCi0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCQkgICAgLXJlICJeMCs0XFteXG5cXSpBQlNfQ0FMTFxbXlxuXF0qXG4iCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQkgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCSAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgICMgQXQgb25lIHRpbWUgYm90aCB2ZXJzaW9ucyBvZiB0aGUgYXNzZW1ibGVyIHdvdWxkIGluY29ycmVjdGx5IHVzZSAKLQkgICAgIyBhIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIGEgQkxFIGluc3RydWN0aW9uLgotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0IHsKLQkJICAgIC1yZSAiXjArXFteXG5cXSpESVIyMUxcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQkgICAgLXJlICJeMCs0XFteXG5cXSpESVIxN1JcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQkgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19yZWxvY2F0aW9uX3JlZHVjdGlvbl90ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyZWR1Y2UuczogVGVzdCByZWxvY2F0aW9uIHJlZHVjdGlvbnMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIHRoZW4gewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZS5zIiAiIiAiUmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0MSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHJlbG9jYXRpb25zIGludm9sdmluZyBwcm9jZWR1cmUgbGFiZWxzIAotCSMgYXJlIG5vdCByZWR1Y2VkIHRvIGEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgc29tZSBvdGhlciBzeW1ib2wuCi0JIyBEb2luZyBzbyBtYWtlcyBnZW5lcmF0aW5nIHBhcmFtZXRlciByZWxvY2F0aW9uIHN0dWJzIGltcG9zc2libGUuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjArNFxbXlxuXF0qUExBQkVMXFteXG5cXSpmb29cW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjArMTRcW15cblxdKlBDUkVMXFteXG5cXSpmb29cW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlMi5zOiBNb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9uIHRlc3RzIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZTIucyIgIiIgIk1vcmUgcmVsb2NhdGlvbiAgcmVkdWN0aW9ucyAocGFydDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRvIG1ha2Ugc3VyZSBETFQgcmVsYXRpdmUgcmVsb2NzIGFyZSBub3QgcmVkdWNlZCB0byBzeW0rYWRkZW5kCi0JIyBEb2luZyBzbyBkb2Vzbid0IHdvcmsgYXMgb25lIG1pZ2h0IGV4cGVjdAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wKzRcW15cblxdKkRMVFxbXlxuXF0qTC5DMDAwMFxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMCsxY1xbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAwXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wKzMwXFteXG5cXSpETFRcW15cblxdKkwuQzAwMDFcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjArNDhcW15cblxdKkRMVFxbXlxuXF0qTC5DMDAwMVxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0gICAgc2V0IHRlc3RuYW1lICJyZWR1Y2UzLnM6IFRlc3QgZXZlbiBtb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9ucyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyZWR1Y2UzLnMiICIiICJFdmVuIG1vcmUgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0MSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHJlbG9jYXRpb25zIGludm9sdmluZyBwcm9jZWR1cmUgbGFiZWxzIAotCSMgYXJlIG5vdCByZWR1Y2VkIHRvIGEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgc29tZSBvdGhlciBzeW1ib2wuCi0JIyBEb2luZyBzbyBtYWtlcyBnZW5lcmF0aW5nIHBhcmFtZXRlciByZWxvY2F0aW9uIHN0dWJzIGltcG9zc2libGUuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjArY1xbXlxuXF0qeWFiYmFcW15cblwrXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMCtjXFteXG5cXSp5YWJiYVwrXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggMDsgYnJlYWsgfQotCQktcmUgIl4wKzEwXFteXG5cXSp5YWJiYVxbXlxuXCtcXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wKzEwXFteXG5cXSp5YWJiYVwrXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggMDsgYnJlYWsgfQotCQktcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmxlX21vZGVfc2VsZWN0b3JfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJibGVidWcyLnM6IGJsZWJ1ZzIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJibGVidWcyLnMiICItYWwiCi0KLSAgICAjIEdBUyB1c2VzIHRvbyBtYW55IGJpdHMgb24gdGhlIEJMRSBpbnN0cnVjdGlvbi4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjAyMDI4MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEU0MjBFMDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmxlYnVnMy5zOiBibGVidWczIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmxlYnVnMy5zIiAiLWFsIgotCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU0MDAyMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3BsYWJlbF9yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAicGxhYmVsYnVnLnM6IE9sZCBnYXMtMS4zNiBwbGFiZWwgYnVnIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInBsYWJlbGJ1Zy5zIiAiIiAiT2xkIGdhcy0xLjM2IHBsYWJlbCBidWcgKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRoYXQgd2UgbWFrZSBQTEFCRUwgcmVsb2NhdGlvbiBlbnRyaWVzIHdoZW4gdGhleSdyZSBuZWVkZWQuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjArXFteXG5cXSpQTEFCRUxcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjArNFxbXlxuXF0qUExBQkVMXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotICAgIAkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX3NlbGVjdG9yX3Njb3BlX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAic2VsZWN0b3JidWcuczogVGVzdCBzY29wZSBvZiBmaWVsZCBzZWxlY3RvciIgCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIHRoZW4gewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInNlbGVjdG9yYnVnLnMiICIiICJUZXN0IHNjb3BlIG9mIGZpZWxkIHNlbGVjdG9yIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHJlbG9jYXRpb24gZW50cnkgYWZ0ZXIgdGhlIHBsYWJlbCBpcyBjb3JyZWN0LgotCSMgSWYgYW4gb2xkIGZpZWxkIHNlbGVjdG9yIHdhcyBpbmNvcnJlY3RseSAiY2FycmllZCIgb3ZlciwgdGhlbiAKLQkjIHRoaXMgdGVzdCB3aWxsIGZhaWwuCi0gICAgICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMCsxNFxbXlxuXF0qRElSMzJcW15cblxdKlxuIgotCQkJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXjArMTRcW15cblxdKlBMQUJFTFxbXlxuXF0qZm9vXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggMCB9Ci0JICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICAgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0gICAgICAgICAgICB9Ci0JfSBlbHNlIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMCsxNFxbXlxuXF0qREFUQV9PTkVcW15cblxdKlxuIgotCQkJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXjArMTRcW15cblxdKlBMQUJFTFxbXlxuXF0qZm9vXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggMCB9Ci0JICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICAgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fbG9jYWxfbGFiZWxfYXNfb3BlcmFuZF90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxhYmVsb3BidWcuczogVGVzdCBsb2NhbCBsYWJlbCBhcyBvcGVyYW5kIChub24tYnJhbmNoaW5nKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJsYWJlbG9wYnVnLnMiICIiICJMb2NhbCBsYWJlbCBhcyBvcGVyYW5kIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGFuZGxlIGRpZmZlcmVuY2Ugb2YgbG9jYWwgbGFibGVzIGFzIGFuIG9wZXJhbmQKLQkjIHRvIGEgbm9uLWJyYW5jaGluZyBpbnN0cnVjdGlvbiBjb3JyZWN0bHkuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wKzJjXFteXG5cXSoweDArMjRcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJeMCszMFxbXlxuXF0qMHgwKzI0XFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2V4aXRfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4aXRidWcuczogVGVzdCBmb3IgYm9ndXMgUl9FWElUIHJlbG9jYXRpb24gKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgIyBFbGYgKG9zZikgZG9lcyBub3QgdXNlIEVOVFJZL0VYSVQgcmVsb2NhdGlvbnMuCi0gICAgIyBJIGd1ZXNzIHdlIGNvdWxkIGxvb2sgYXQgdGhlIHVud2luZCBzdWJzcGFjZXMgaXQgYnVpbGRzLi4uCi0gICAgIyBVbnRpbCB0aGVuLCBtYWtlIHN1cmUgaXQgc3RpbGwgYXNzZW1ibGVzLgotICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQlnYXNfdGVzdF9vbGQgImV4aXRidWcucyIgIiIgIlRlc3QgZm9yIGJvZ3VzIFJfRVhJVCByZWxvY2F0aW9uIChwYXJ0IDEpIgotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJleGl0YnVnLnMiICIiICJUZXN0IGZvciBib2d1cyBSX0VYSVQgcmVsb2NhdGlvbiAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgTm90ZSB0aGF0IGEgbWF0Y2ggaGVyZSBpcyByZWFsbHkgYSBGQUlMVVJFIQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCtcW15cblxdKlJfRVhJVFxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0wXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19jcm9zc19zcGFjZV9maXh1cF90ZXN0XzEge30gewotICAgIHNldCB0ZXN0bmFtZSAiZml4dXBidWcuczogVGVzdCBjcm9zcyBzcGFjZSBqdW1wL2NhbGwgZml4dXAgYnVnIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtpc3RhcmdldCBocHBhKnctKi0qXSB0aGVuIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAjIEVMRiAob3NmKSBkb2Vzbid0IHJlYWxseSBoYW5kbGUgZXh0cmEgc2VjdGlvbnMgdG9vIHdlbGwuLi4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZpeHVwYnVnLnMiICIiICJUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGEgZml4dXAvcmVsb2NhdGlvbiBmb3IgdGhlIGNyb3NzLXNwYWNlCi0JIyBicmFuY2gvY2FsbAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCtcW15cblxdKlBDUkVMX0NBTExcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fY3Jvc3Nfc3BhY2VfZml4dXBfdGVzdF8yIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZpeHVwYnVnLnM6IFRlc3QgY3Jvc3Mgc3BhY2UganVtcC9jYWxsIGZpeHVwIGJ1ZyAocGFydCAzKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSp3LSotKl0gdGhlbiB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBnYXNfc3RhcnQgImZpeHVwYnVnLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTgwMDAwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcm91bmRfbW9kZV90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInJvdW5kbW9kZS5zOiBUZXN0IHN3aXRjaGluZyBvZiByb3VuZGluZyBtb2RlcyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyb3VuZG1vZGUucyIgIiIgIlRlc3Qgc3dpdGNoIG9mIHJvdW5kaW5nIG1vZGVzKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGNvcnJlY3QgcmVsb2NhdGlvbnMgdG8gc3dpdGNoIHJvdW5kaW5nIG1vZGVzLgotCSMgQWxzbyBtYWtlIHN1cmUgKGZvciBTT00pIHRoYXQgcmVkdW5kYW50IHJvdW5kaW5nIG1vZGUgcmVsb2NhdGlvbnMKLQkjIHdlcmUgZWxpbWluYXRlZC4KLQlpZiB7IFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB8fCBbaXN0YXJnZXQgaHBwYSp3LSotKl0gfSB0aGVuIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMCtcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzRcW15cblxdKkRJUjE0UlxbXlxuXF0qXG4iIAotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCs4XFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCtjXFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArMTBcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzE0XFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArMThcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzFjXFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0gICAgICAgICAgICB9Ci0JfSBlbHNlIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMCtcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArNFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXjArOFxbXlxuXF0qUl9OX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCtjXFteXG5cXSpSX05fTU9ERVxbXlxuXF0qXG4iIAotCQkJeyBmYWlsICR0ZXN0bmFtZSB9Ci0JICAgICAgICAgICAgLXJlICJeMCsxMFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCsxNFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXjArMWNcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiB7W2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHx8IFtpc3RhcmdldCBocHBhKnctKi0qXSB9IHRoZW4gewotCSAgICBpZiBbZXhwciAkeD09OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQl9IGVsc2UgewotCSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQl9Ci0gICAgfQotfQotCi1wcm9jIGRvX2Z1bmN0aW9uX3JlbG9jX2J1ZyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmdW5jcmVsb2NidWcuczogVGVzdCBmb3IgcmVsb2MgYnVnIGluIG5vbi1wbGFiZWwgZnVuY3Rpb24gcmVmZXJlbmNlIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZ1bmNyZWxvY2J1Zy5zIiAiIiAiVGVzdCBmb3IgcmVsb2MgYnVnIGluIG5vbi1wbGFiZWwgZnVuY3Rpb24gcmVmZXJlbmNlIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBhIGNvcnJlY3QgcmVsb2NhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZS4KLQkjIGJyYW5jaC9jYWxsCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wK2NjXFteXG5cXSpmMl9fXzRcW15cbitcXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXjArZDBcW15cblxdKmYyX19fNFxbXlxuK1xdKlxuIiAgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLQlzZXQgdGVzdG5hbWUgImZ1bmNyZWxvY2J1Zy5zOiBUZXN0IGZvciByZWxvYyBidWcgaW4gbm9uLXBsYWJlbCBmdW5jdGlvbiByZWZlcmVuY2UgKHBhcnQzKSIKLQlzZXQgeCAwCi0KLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXByZWZpeC1hZGRyZXNzZXMgLWQiCi0JIyBNYWtlIHN1cmUgd2UgZGlkbid0IHB1dCBhbnl0aGluZyBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmIQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCtjY1xbXlxuXF0qbGRpbCAwLHIyMFxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIl4wK2QwXFteXG5cXSpsZG8gMFxbXChcXStyMjBcW1wpXF0rLHIxOVxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotCi19Ci0KLXByb2MgZG9fcl9ub19yZWxvYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyX25vX3JlbG9jLnM6IFRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiA0LWJ5dGUgUl9OT19SRUxDT0FUSU9OIGZpeHVwcyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyX25vX3JlbG9jLnMiICIiICJUZXN0IGZvciByZWxvYyBidWcgaW4gNC1ieXRlIFJfTk9fUkVMT0NBVElPTiBmaXh1cHMgKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGEgY29ycmVjdCByZWxvY2F0aW9uIGZvciB0aGUgcmVmZXJlbmNlLgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCtjMDAwNFxbXlxuXF0qUExBQkVMXFteXG5dKmdcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIH0KLX0KLQotcHJvYyBkb19waWNfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInBpY3JlbG9jLnM6IFRlc3QgZm9yIHByb3BlciBQSUMgcmVsb2NhdGlvbiAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSp3LSotKl0gdGhlbiB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBnYXNfc3RhcnQgInBpY3JlbG9jLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMDAwMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYXBwbHlfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhcHBseWJ1Zy5zOiBUZXN0IGZvciBwcm9wZXIgZml4dXAgYXBwbGlhdGlvbiAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICAjIEVMRiAob3NmKSBkb2Vzbid0IHJlYWxseSBoYW5kbGUgZXh0cmEgc2VjdGlvbnMgdG9vIHdlbGwuLi4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGdhc19zdGFydCAiYXBwbHlidWcucyIgIi1hbCIKLQotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAwMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDAwMDAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDAwMDAwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyBNYWtlIHN1cmUgd2UgcHV0IHRoZSByaWdodCByZWxvY2F0aW9uIGVudHJ5IG9uIGEgQkxFIGluc3RydWN0aW9uLgotICAgIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgTWFrZSBzdXJlIHJlbG9jYXRpb24gcmVkdWN0aW9ucyBhcmUgbm90IHRvbyBhZ3Jlc3NpdmUgYWJvdXQKLSAgICAjIGFkanVzdGluZyByZWxvY2F0aW9ucyBhZ2FpbnN0IHNvbWUgc3ltYm9scy4KLSAgICBkb19yZWxvY2F0aW9uX3JlZHVjdGlvbl90ZXN0cwotCi0gICAgIyBDaGVjayB0aGF0IG1vZGUgc2VsZWN0b3JzIG9uIGEgYmxlIGluc3RydWN0aW9uIGFjdHVhbGx5IHdvcmsuCi0gICAgZG9fYmxlX21vZGVfc2VsZWN0b3JfdGVzdAotCi0gICAgIyBDaGVjayB0aGF0IHdlIHRha2UgdGhlIC04IGFkanVzdG1lbnQgaW50byBhY2NvdW50IHdoZW4gemVyb2luZwotICAgICMgb3V0IHRoZSBkaXNwbGFjZW1lbnQgZmllbGQgaW4gYSBibGUgaW5zdHJ1Y3Rpb24gd2l0aCBhIHJlbG9jCi0gICAgZG9fYmxlX3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyAxLjM2IHNpbXBseSBkaWRuJ3QgZ2VuZXJhdGUgYWxsIHRoZSBwbGFiZWxzIGl0IHNob3VsZCBoYXZlLiAgTWFrZQotICAgICMgc3VyZSBnYXMtMiBkb2VzLgotICAgIGRvX3BsYWJlbF9yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgTWFrZSBzdXJlIGEgZmllbGQgc2VsZWN0b3Igb25seSBlZmZlY3RzIHRoZSBjdXJyZW50IGluc3RydWN0aW9uCi0gICAgIyBvciBhc3NlbWJsZXIgZGlyZWN0aXZlLgotICAgIGRvX3NlbGVjdG9yX3Njb3BlX3Rlc3QKLQotICAgICMgVGhpcyBzaG91bGQgcmVhbGx5IGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gIEl0IHdvdWxkIG1ha2UgbGlmZSBtdWNoCi0gICAgIyBlYXNpZXIgb24gdGhlIG9wdGltaXppbmcgbGlua2VyLiAgVW50aWwgdGhlbiBqdXN0IG1ha2Ugc3VyZSB0aGUgCi0gICAgIyBkaWZmZXJlbmNlIGlzIGNvbXB1dGVkIGNvcnJlY3RseS4KLSAgICBkb19sb2NhbF9sYWJlbF9hc19vcGVyYW5kX3Rlc3QKLQotICAgICMgR0FTMiBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgUl9FWElUIHJlbG9jYXRpb25zIHdoZW4gLmV4aXQgZGlyZWN0aXZlcwotICAgICMgd2VyZSBub3QgaW4gdGhlIHNvdXJjZSBjb2RlLgotICAgIGRvX2V4aXRfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIEdBUzIgaW5jb3JyZWN0bHkgdGhvdWdodCBpdCBjb3VsZCBhcHBseSBhIGZpeHVwIGZvciBhIHBjLXJlbGF0aXZlCi0gICAgIyBicmFuY2gvY2FsbCB3aGljaCBjcm9zc2VkIGRpZmZlcmVudCBzdWJzcGFjZXMuCi0gICAgIyBBbHNvIGNoZWNrIHRoYXQgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBpcyBjb3JyZWN0Ci0gICAgZG9fY3Jvc3Nfc3BhY2VfZml4dXBfdGVzdF8xCi0gICAgZG9fY3Jvc3Nfc3BhY2VfZml4dXBfdGVzdF8yCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBzd2l0Y2ggcm91bmRpbmcgbW9kZXMgY29ycmVjdGx5Ci0gICAgZG9fcm91bmRfbW9kZV90ZXN0Ci0KLSAgICAjIFRlc3QgZm9yIGEgYnVnIGZvdW5kIHdoZW4gYSBmdW5jdGlvbiB3YXMgdXNlZCBpbiBhIG5vbi1icmFuY2hpbmcKLSAgICAjIGluc3RydWN0aW9uICp3aXRob3V0KiBhIHBsYWJlbCAoZm9yIHBvcnRhYmxlIHJ1bnRpbWUgbW9kZWwpCi0gICAgZG9fZnVuY3Rpb25fcmVsb2NfYnVnCi0KLSAgICAjIFRlc3QgZm9yIGFuIG9mZi1ieS1vbmUgYnVnIGluIHRoZSBoYW5kbGluZyBvZiA0LWJ5dGUgUl9OT19SRUxPQ0FUSU9OCi0gICAgIyBmaXh1cHMuCi0gICAgZG9fcl9ub19yZWxvYwotCi0gICAgIyBUZXN0IGEgcmVsb2NhdGlvbiBwcm9ibGVtIHdoaWNoIHNob3dzIHVwIHdoZW4gYnVpbGRpbmcgc2hhcmVkCi0gICAgIyBsaWJyYXJpZXMgaW4gU09NCi0gICAgZG9fcGljX3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyBUZXN0IGEgcHJvYmxlbSB3aXRoIG1kX2FwcGx5X2ZpeCB0aGF0IHdhcyBpbnRyb2R1Y2VkIHdoZW4gZml4aW5nCi0gICAgIyB0aGUgcGljIHJlbG9jYXRpb24gdGVzdC4KLSAgICBkb19hcHBseV90ZXN0Ci0KLSAgICAjIE1ha2Ugc3VyZSBnYXMgZG9lc24ndCByZXNvbHZlIGxvbmctY2FsbHMgd2hpY2ggYXJlIHRvIGJlIGZpeGVkCi0gICAgIyBieSB0aGUgbGlua2VyCi0gICAgZ2FzX3Rlc3QgImxvbmdjYWxsLnMiICIiICIiICJBdm9pZCByZXNvbHZpbmcgbG9uZy1jYWxscyIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY1MzczLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLklNUE9SVCBmb28sZGF0YQotCi07IFN3aXRjaCBpbi9vdXQgb2YgZGlmZmVyZW50IHJvdW5kaW5nIG1vZGVzLgotOyBBbHNvIG1ha2Ugc3VyZSB3ZSAib3B0aW1pemUiIGF3YXkgdXNlbGVzcyByb3VuZGluZyBtb2RlIHJlbG9jYXRpb25zCi0JYWRkaWwgICBMUidmb28tMHgxMjM0NSwlcjI3Ci0JbGRvCVJSJ2Zvby0weDEyMzQ1KCVyMSksJXIxCi0JYWRkaWwgICBMJ2Zvby0weDEyMzQ1LCVyMjcKLQlsZG8JUidmb28tMHgxMjM0NSglcjEpLCVyMQotCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNwotCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQotCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNwotCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9zZWxlY3RvcmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9zZWxlY3RvcmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYyNzgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuRVhQT1JUIGludFZlY19lcnJvcl9oYW5kbGVyLERBVEEKLQkuZGF0YQotCi1pbnRWZWNfZXJyb3JfaGFuZGxlcjoKLQkud29yZCBQJWRlZmF1bHRfaW50VmVjX2Vycm9yX2hhbmRsZXJfX0ZQQ2MKLQotCS5jb2RlCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvbyxDT0RFCi0JLkVYUE9SVCBmb28sRU5UUlksUFJJVl9MRVY9MwotZm9vOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAKLQkuRU5UUlkKLQkuc3RhYmQgNjgsMCw0MQotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ24zLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQyNDA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ24zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuYmxvY2t6IDQKLQotbWFpbjoKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MAotCS5FTlRSWQotCW5vcAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduNC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjJmOTliLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQkuc3BhY2UgJFRFWFQkCi0JLnN1YnNwYSAkWUFCQkEkCi0JLnN1YnNwYSAkTUlMTElDT0RFJAotCS5hbGlnbiA2NApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIwY2MzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcucworKysgL2Rldi9udWxsCkBAIC0xLDM0ODggKzAsMCBAQAotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5kYXRhCi0KLQkuYWxpZ24gNAotZG9uZV9fXzIKLQkud29yZCAwCi0JLklNUE9SVCBtZW1zZXQsQ09ERQotCS5FWFBPUlQgcmVfc3ludGF4X29wdGlvbnMsREFUQQotCS5hbGlnbiA0Ci1yZV9zeW50YXhfb3B0aW9ucwotCS53b3JkIDAKLQotCS5hbGlnbiA0Ci1yZV9lcnJvcl9tc2cKLQkud29yZCAwCi0JLndvcmQgTCRDMDAwMAotCS53b3JkIEwkQzAwMDEKLQkud29yZCBMJEMwMDAyCi0JLndvcmQgTCRDMDAwMwotCS53b3JkIEwkQzAwMDQKLQkud29yZCBMJEMwMDA1Ci0JLndvcmQgTCRDMDAwNgotCS53b3JkIEwkQzAwMDcKLQkud29yZCBMJEMwMDA4Ci0JLndvcmQgTCRDMDAwOQotCS53b3JkIEwkQzAwMTAKLQkud29yZCBMJEMwMDExCi0JLndvcmQgTCRDMDAxMgotCS53b3JkIEwkQzAwMTMKLQkud29yZCBMJEMwMDE0Ci0JLndvcmQgTCRDMDAxNQotCS5jb2RlCi0KLQkuYWxpZ24gNAotTCRDMDAxNQotCS5TVFJJTkcgIlVubWF0Y2hlZCApIG9yIFxcKVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTQKLQkuU1RSSU5HICJSZWd1bGFyIGV4cHJlc3Npb24gdG9vIGJpZ1x4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTMKLQkuU1RSSU5HICJQcmVtYXR1cmUgZW5kIG9mIHJlZ3VsYXIgZXhwcmVzc2lvblx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTIKLQkuU1RSSU5HICJJbnZhbGlkIHByZWNlZGluZyByZWd1bGFyIGV4cHJlc3Npb25ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDExCi0JLlNUUklORyAiTWVtb3J5IGV4aGF1c3RlZFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTAKLQkuU1RSSU5HICJJbnZhbGlkIHJhbmdlIGVuZFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDkKLQkuU1RSSU5HICJJbnZhbGlkIGNvbnRlbnQgb2YgXFx7XFx9XHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwOAotCS5TVFJJTkcgIlVubWF0Y2hlZCBcXHtceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA3Ci0JLlNUUklORyAiVW5tYXRjaGVkICggb3IgXFwoXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwNgotCS5TVFJJTkcgIlVubWF0Y2hlZCBbIG9yIFteXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwNQotCS5TVFJJTkcgIkludmFsaWQgYmFjayByZWZlcmVuY2VceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA0Ci0JLlNUUklORyAiVHJhaWxpbmcgYmFja3NsYXNoXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwMwotCS5TVFJJTkcgIkludmFsaWQgY2hhcmFjdGVyIGNsYXNzIG5hbWVceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDAyCi0JLlNUUklORyAiSW52YWxpZCBjb2xsYXRpb24gY2hhcmFjdGVyXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwMQotCS5TVFJJTkcgIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwMAotCS5TVFJJTkcgIk5vIG1hdGNoXHgwMCIKLQkuRVhQT1JUIHJlX21heF9mYWlsdXJlcyxEQVRBCi0JLmRhdGEKLQotCS5hbGlnbiA0Ci1yZV9tYXhfZmFpbHVyZXMKLQkud29yZCAyMDAwCi0JLklNUE9SVCBtYWxsb2MsQ09ERQotCS5JTVBPUlQgcmVhbGxvYyxDT0RFCi0JLklNUE9SVCBmcmVlLENPREUKLQkuSU1QT1JUIHN0cmNtcCxDT0RFCi0JLmNvZGUKLQotCS5hbGlnbiA0Ci1MJEMwMDE2Ci0JLlNUUklORyAiYWxudW1ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE3Ci0JLlNUUklORyAiYWxwaGFceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE4Ci0JLlNUUklORyAiYmxhbmtceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE5Ci0JLlNUUklORyAiY250cmxceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIwCi0JLlNUUklORyAiZGlnaXRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIxCi0JLlNUUklORyAiZ3JhcGhceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIyCi0JLlNUUklORyAibG93ZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDIzCi0JLlNUUklORyAicHJpbnRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI0Ci0JLlNUUklORyAicHVuY3RceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI1Ci0JLlNUUklORyAic3BhY2VceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI2Ci0JLlNUUklORyAidXBwZXJceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDI3Ci0JLlNUUklORyAieGRpZ2l0XHgwMCIKLQkuSU1QT1JUIF9fYWxudW0sREFUQQotCS5JTVBPUlQgX19jdHlwZTIsREFUQQotCS5JTVBPUlQgX19jdHlwZSxEQVRBCi0JLklNUE9SVCBhdF9iZWdsaW5lX2xvY19wLENPREUKLQkuSU1QT1JUIGF0X2VuZGxpbmVfbG9jX3AsQ09ERQotCS5JTVBPUlQgc3RvcmVfb3AxLENPREUKLQkuSU1QT1JUIGluc2VydF9vcDEsQ09ERQotCS5JTVBPUlQgc3RvcmVfb3AyLENPREUKLQkuSU1QT1JUIGluc2VydF9vcDIsQ09ERQotCS5JTVBPUlQgY29tcGlsZV9yYW5nZSxDT0RFCi0JLklNUE9SVCBncm91cF9pbl9jb21waWxlX3N0YWNrLENPREUKLQkuY29kZQotCi0JLmFsaWduIDQKLXJlZ2V4X2NvbXBpbGUKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0zMjAsQ0FMTFMsU0FWRV9SUCxFTlRSWV9HUj0xOAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApIDsjIDg5ODkgcmVsb2FkX291dHNpKzIvNgotCWxkbyAzMjAoJXIzMCksJXIzMCA7IyA4OTkxIGFkZHNpMy8yCi0Jc3R3ICVyMTgsLTE2OCglcjMwKSA7IyA4OTkzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNywtMTY0KCVyMzApIDsjIDg5OTUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjE2LC0xNjAoJXIzMCkgOyMgODk5NyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTUsLTE1NiglcjMwKSA7IyA4OTk5IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNCwtMTUyKCVyMzApIDsjIDkwMDEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjEzLC0xNDgoJXIzMCkgOyMgOTAwMyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTIsLTE0NCglcjMwKSA7IyA5MDA1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxMSwtMTQwKCVyMzApIDsjIDkwMDcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjEwLC0xMzYoJXIzMCkgOyMgOTAwOSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyOSwtMTMyKCVyMzApIDsjIDkwMTEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjgsLTEyOCglcjMwKSA7IyA5MDEzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI3LC0xMjQoJXIzMCkgOyMgOTAxNSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNiwtMTIwKCVyMzApIDsjIDkwMTcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjUsLTExNiglcjMwKSA7IyA5MDE5IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LC0xMTIoJXIzMCkgOyMgOTAyMSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMywtMTA4KCVyMzApIDsjIDkwMjMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjI2LC0yNzYoJXIzMCkgOyMgNCByZWxvYWRfb3V0c2krMi82Ci0JbGRpIDAsJXI5IDsjIDI1IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMCwlcjggOyMgMjggcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjAsLTI2MCglcjMwKSA7IyAzNCByZWxvYWRfb3V0c2krMi82Ci0JbGRpIDAsJXIxMCA7IyAzMSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDY0MCwlcjI2IDsjIDM3IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODc3NCByZWxvYWRfb3V0c2krMi81Ci0JY29weSAlcjI0LCVyMTUgOyMgOCByZWxvYWRfb3V0c2krMi8xCi0Jc3R3ICVyMSwtMjk2KCVyMzApIDsjIDIzMjUgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIyMywlcjUgOyMgMTAgcmVsb2FkX291dHNpKzIvMQotCWFkZGwgJXIxLCVyMjUsJXIxNiA7IyAxOSBhZGRzaTMvMQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbWFsbG9jLCVyMiA7IyAzOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyAyMCglcjUpLCVyMTQgOyMgMjIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+IDAsJXIyOCxMJDAwMjEgOyMgNDggYmxldSsxCi0Jc3R3ICVyMjgsLTMxMiglcjMwKSA7IyA0MyByZWxvYWRfb3V0c2krMi82Ci1MJDA5NTMKLQlibCBMJDA4NjcsJXIwIDsjIDUzIGp1bXAKLQlsZGkgMTIsJXIyOCA7IyA1MSByZWxvYWRfb3V0c2krMi8yCi1MJDAwMjEKLQlsZGkgMzIsJXIxOSA7IyA1OCByZWxvYWRfb3V0c2krMi8yCi0Jc3R3ICVyMTksLTMwOCglcjMwKSA7IyA1OSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMCwtMzA0KCVyMzApIDsjIDYyIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNSwxMiglcjUpIDsjIDY1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIwLDgoJXI1KSA7IyA4NSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMCwyNCglcjUpIDsjIDg4IHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRpbCBMUidkb25lX19fMi0kZ2xvYmFsJCwlcjI3IDsjIDkyIHBpYzJfbG9fc3VtKzEKLQlsZHcgMjgoJXI1KSwlcjE5IDsjIDY4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgUlInZG9uZV9fXzItJGdsb2JhbCQoJXIxKSwlcjIwIDsjIDk0IHJlbG9hZF9vdXRzaSsyLzUKLQlkZXBpIDAsMywxLCVyMTkgOyMgNjkgYW5kc2kzLzIKLQlkZXBpIDAsNiwyLCVyMTkgOyMgODAgYW5kc2kzLzIKLQljb21pYiw8PiAwLCVyMjAsTCQwMDIyIDsjIDk1IGJsZXUrMQotCXN0dyAlcjE5LDI4KCVyNSkgOyMgODIgcmVsb2FkX291dHNpKzIvNgotCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCwlcjI3IDsjIDk5IHBpYzJfbG9fc3VtKzEKLQlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKCVyMSksJXI0IDsjIDEwMCBtb3ZoaS0yCi0JY29weSAlcjQsJXIyNiA7IyAxMDEgcmVsb2FkX291dHNpKzIvMQotCWxkaSAwLCVyMjUgOyMgMTAyIHJlbG9hZF9vdXRzaSsyLzIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIgOyMgMTA0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDI1NiwlcjI0IDsjIDEwMyByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEsJXIyMCA7IyA4NzMyIG1vdnFpKzEvMgotCWxkbyA5NyglcjQpLCVyMTkgOyMgODczNiBhZGRzaTMvMgotCWxkbyAxMjIoJXI0KSwlcjQgOyMgODczOCBhZGRzaTMvMgotCXN0YnMsbWEgJXIyMCwxKCVyMTkpIDsjIDExNSBtb3ZxaSsxLzYKLUwkMTE1NQotCWNvbWIsPj0sbiAlcjQsJXIxOSxMJDExNTUgOyMgMTIxIGJsZXUrMQotCXN0YnMsbWEgJXIyMCwxKCVyMTkpIDsjIDExNSBtb3ZxaSsxLzYKLQlsZGkgMSwlcjIxIDsjIDg3MTcgbW92cWkrMS8yCi0JYWRkaWwgTFIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkLCVyMjcgOyMgODcxMiBwaWMyX2xvX3N1bSsxCi0JbGRvIFJSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCglcjEpLCVyMTkgOyMgODcxNSBtb3ZoaS0yCi0JbGRvIDY1KCVyMTkpLCVyMjAgOyMgODcyMSBhZGRzaTMvMgotCWxkbyA5MCglcjE5KSwlcjE5IDsjIDg3MjMgYWRkc2kzLzIKLQlzdGJzLG1hICVyMjEsMSglcjIwKSA7IyAxMzggbW92cWkrMS82Ci1MJDExNTYKLQljb21iLD49LG4gJXIxOSwlcjIwLEwkMTE1NiA7IyAxNDQgYmxldSsxCi0Jc3RicyxtYSAlcjIxLDEoJXIyMCkgOyMgMTM4IG1vdnFpKzEvNgotCWxkaSA0OCwlcjIwIDsjIDE1MSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDU3LCVyMjIgOyMgNzk3NiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEsJXIyMSA7IyA4NzA3IG1vdnFpKzEvMgotCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCs0OCwlcjI3IDsjIDg3MDUgcGljMl9sb19zdW0rMQotCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQrNDgoJXIxKSwlcjE5IDsjIDg3MTEgbW92aGktMgotTCQwMDM3Ci0JbGRvIDEoJXIyMCksJXIyMCA7IyAxNjQgYWRkc2kzLzIKLQljb21iLD49ICVyMjIsJXIyMCxMJDAwMzcgOyMgMTY3IGJsZXUrMQotCXN0YnMsbWEgJXIyMSwxKCVyMTkpIDsjIDE2MSBtb3ZxaSsxLzYKLQlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQsJXIyNyA7IyAxNzQgcGljMl9sb19zdW0rMQotCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQoJXIxKSwlcjE5IDsjIDE3NSBtb3ZoaS0yCi0JbGRpIDEsJXIyMCA7IyAxNzYgbW92cWkrMS8yCi0Jc3RiICVyMjAsOTUoJXIxOSkgOyMgMTc3IG1vdnFpKzEvNgotCWFkZGlsIExSJ2RvbmVfX18yLSRnbG9iYWwkLCVyMjcgOyMgMTc4IHBpYzJfbG9fc3VtKzEKLQlsZGkgMSwlcjE5IDsjIDE4MCByZWxvYWRfb3V0c2krMi8yCi0Jc3R3ICVyMTksUlInZG9uZV9fXzItJGdsb2JhbCQoJXIxKSA7IyAxODEgcmVsb2FkX291dHNpKzIvNgotTCQwMDIyCi0JbGR3IDQoJXI1KSwlcjE5IDsjIDE4NyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwMDM5IDsjIDE4OSBibGV1KzEKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTkzIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9LG4gMCwlcjI2LEwkMDA0MCA7IyAxOTUgYmxldSsxCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAyMDUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZGkgMzIsJXIyNSA7IyAyMDMgcmVsb2FkX291dHNpKzIvMgotCWJsIEwkMTE1NywlcjAgOyMgMjExIGp1bXAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMjIzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDA0MAotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbWFsbG9jLCVyMiA7IyAyMTkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZGkgMzIsJXIyNiA7IyAyMTcgcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjI4LDAoJXI1KSA7IyAyMjMgcmVsb2FkX291dHNpKzIvNgotTCQxMTU3Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDIyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4gMCwlcjE5LEwkMDA0MiA7IyAyMzAgYmxldSsxCi0JbGRpIDMyLCVyMTkgOyMgMjQzIHJlbG9hZF9vdXRzaSsyLzIKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDIzNCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMjMyIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDIzOCBqdW1wCi0JbGRpIDEyLCVyMjggOyMgNTEgcmVsb2FkX291dHNpKzIvMgotTCQwMDQyCi0Jc3R3ICVyMTksNCglcjUpIDsjIDI0NCByZWxvYWRfb3V0c2krMi82Ci1MJDAwMzkKLQlsZHcgMCglcjUpLCVyNiA7IyAyNDkgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgNzk4MSByZWxvYWRfb3V0c2krMi81Ci0JY29tY2xyLDw+ICVyMTYsJXIxOSwlcjAgOyMgNzk4MiBibGV1KzEKLQlibCBMJDAwNDQsJXIwCi0JY29weSAlcjYsJXIxMiA7IyAyNTMgcmVsb2FkX291dHNpKzIvMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMzNCByZWxvYWRfb3V0c2krMi81Ci1MJDExNzgKLQlsZGJzLG1hIDEoJXIxOSksJXI3IDsjIDI3NyB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw9IDAsJXIxNCxMJDAwNDcgOyMgMjgyIGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjMzNyByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDI4MyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyAyODYgemVyb19leHRlbmRxaXNpMi8yCi1MJDAwNDcKLQlsZG8gLTEwKCVyNyksJXIxOSA7IyA3ODk1IGFkZHNpMy8yCi0JYWRkaSx1diAtMTE1LCVyMTksJXIwIDsjIDc4OTYgY2FzZXNpMAotCWJscixuICVyMTksJXIwCi0JYixuIEwkMDA3NgotTCQwODYzCi0JYmwgTCQwMzc2LCVyMAotCW5vcCA7IyA5MDkyIHN3aXRjaF9qdW1wCi1MJDA5NTQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkwOTUgc3dpdGNoX2p1bXAKLUwkMDk1NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTA5OCBzd2l0Y2hfanVtcAotTCQwOTU2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTAxIHN3aXRjaF9qdW1wCi1MJDA5NTcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMDQgc3dpdGNoX2p1bXAKLUwkMDk1OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEwNyBzd2l0Y2hfanVtcAotTCQwOTU5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTEwIHN3aXRjaF9qdW1wCi1MJDA5NjAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMTMgc3dpdGNoX2p1bXAKLUwkMDk2MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTExNiBzd2l0Y2hfanVtcAotTCQwOTYyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTE5IHN3aXRjaF9qdW1wCi1MJDA5NjMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMjIgc3dpdGNoX2p1bXAKLUwkMDk2NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEyNSBzd2l0Y2hfanVtcAotTCQwOTY1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTI4IHN3aXRjaF9qdW1wCi1MJDA5NjYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMzEgc3dpdGNoX2p1bXAKLUwkMDk2NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEzNCBzd2l0Y2hfanVtcAotTCQwOTY4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTM3IHN3aXRjaF9qdW1wCi1MJDA5NjkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNDAgc3dpdGNoX2p1bXAKLUwkMDk3MAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE0MyBzd2l0Y2hfanVtcAotTCQwOTcxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTQ2IHN3aXRjaF9qdW1wCi1MJDA5NzIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNDkgc3dpdGNoX2p1bXAKLUwkMDk3MwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE1MiBzd2l0Y2hfanVtcAotTCQwOTc0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTU1IHN3aXRjaF9qdW1wCi1MJDA5NzUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNTggc3dpdGNoX2p1bXAKLUwkMDk3NgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE2MSBzd2l0Y2hfanVtcAotTCQwOTc3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTY0IHN3aXRjaF9qdW1wCi1MJDA5NzgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNjcgc3dpdGNoX2p1bXAKLUwkMDk3OQotCWJsIEwkMDA3NywlcjAgOyMgOTE3MCBzd2l0Y2hfanVtcAotCWxkdyAtMjk2KCVyMzApLCVyMjYgOyMgMjM0OSByZWxvYWRfb3V0c2krMi81Ci1MJDA5ODAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNzMgc3dpdGNoX2p1bXAKLUwkMDk4MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE3NiBzd2l0Y2hfanVtcAotTCQwOTgyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTc5IHN3aXRjaF9qdW1wCi1MJDA5ODMKLQlibCBMJDAzNjgsJXIwCi0Jbm9wIDsjIDkxODIgc3dpdGNoX2p1bXAKLUwkMDk4NAotCWJsIEwkMDM3MiwlcjAKLQlub3AgOyMgOTE4NSBzd2l0Y2hfanVtcAotTCQwOTg1Ci0JYmwgTCQwMTA0LCVyMAotCW5vcCA7IyA5MTg4IHN3aXRjaF9qdW1wCi1MJDA5ODYKLQlibCBMJDExNTgsJXIwIDsjIDkxOTEgc3dpdGNoX2p1bXAKLQlsZGkgMTAyNiwlcjE5IDsjIDY2MiByZWxvYWRfb3V0c2krMi8yCi1MJDA5ODcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxOTQgc3dpdGNoX2p1bXAKLUwkMDk4OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE5NyBzd2l0Y2hfanVtcAotTCQwOTg5Ci0JYmwgTCQwMTk2LCVyMCA7IyA5MjAwIHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODAyNyByZWxvYWRfb3V0c2krMi81Ci1MJDA5OTAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMDMgc3dpdGNoX2p1bXAKLUwkMDk5MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIwNiBzd2l0Y2hfanVtcAotTCQwOTkyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjA5IHN3aXRjaF9qdW1wCi1MJDA5OTMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMTIgc3dpdGNoX2p1bXAKLUwkMDk5NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIxNSBzd2l0Y2hfanVtcAotTCQwOTk1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjE4IHN3aXRjaF9qdW1wCi1MJDA5OTYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMjEgc3dpdGNoX2p1bXAKLUwkMDk5NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIyNCBzd2l0Y2hfanVtcAotTCQwOTk4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjI3IHN3aXRjaF9qdW1wCi1MJDA5OTkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMzAgc3dpdGNoX2p1bXAKLUwkMTAwMAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIzMyBzd2l0Y2hfanVtcAotTCQxMDAxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjM2IHN3aXRjaF9qdW1wCi1MJDEwMDIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMzkgc3dpdGNoX2p1bXAKLUwkMTAwMwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI0MiBzd2l0Y2hfanVtcAotTCQxMDA0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjQ1IHN3aXRjaF9qdW1wCi1MJDEwMDUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNDggc3dpdGNoX2p1bXAKLUwkMTAwNgotCWJsIEwkMDEwMSwlcjAgOyMgOTI1MSBzd2l0Y2hfanVtcAotCWxkaSAxMDI2LCVyMTkgOyMgNjYyIHJlbG9hZF9vdXRzaSsyLzIKLUwkMTAwNwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI1NCBzd2l0Y2hfanVtcAotTCQxMDA4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjU3IHN3aXRjaF9qdW1wCi1MJDEwMDkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNjAgc3dpdGNoX2p1bXAKLUwkMTAxMAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI2MyBzd2l0Y2hfanVtcAotTCQxMDExCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjY2IHN3aXRjaF9qdW1wCi1MJDEwMTIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNjkgc3dpdGNoX2p1bXAKLUwkMTAxMwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI3MiBzd2l0Y2hfanVtcAotTCQxMDE0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjc1IHN3aXRjaF9qdW1wCi1MJDEwMTUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNzggc3dpdGNoX2p1bXAKLUwkMTAxNgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI4MSBzd2l0Y2hfanVtcAotTCQxMDE3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjg0IHN3aXRjaF9qdW1wCi1MJDEwMTgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyODcgc3dpdGNoX2p1bXAKLUwkMTAxOQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI5MCBzd2l0Y2hfanVtcAotTCQxMDIwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjkzIHN3aXRjaF9qdW1wCi1MJDEwMjEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyOTYgc3dpdGNoX2p1bXAKLUwkMTAyMgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI5OSBzd2l0Y2hfanVtcAotTCQxMDIzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzAyIHN3aXRjaF9qdW1wCi1MJDEwMjQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMDUgc3dpdGNoX2p1bXAKLUwkMTAyNQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMwOCBzd2l0Y2hfanVtcAotTCQxMDI2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzExIHN3aXRjaF9qdW1wCi1MJDEwMjcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMTQgc3dpdGNoX2p1bXAKLUwkMTAyOAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMxNyBzd2l0Y2hfanVtcAotTCQxMDI5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzIwIHN3aXRjaF9qdW1wCi1MJDEwMzAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMjMgc3dpdGNoX2p1bXAKLUwkMTAzMQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMyNiBzd2l0Y2hfanVtcAotTCQxMDMyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzI5IHN3aXRjaF9qdW1wCi1MJDEwMzMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMzIgc3dpdGNoX2p1bXAKLUwkMTAzNAotCWJsIEwkMDIxNiwlcjAgOyMgOTMzNSBzd2l0Y2hfanVtcAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQxOCByZWxvYWRfb3V0c2krMi81Ci1MJDEwMzUKLQlibCBMJDAzODcsJXIwIDsjIDkzMzggc3dpdGNoX2p1bXAKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDM3OTcgcmVsb2FkX291dHNpKzIvNQotTCQxMDM2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzQxIHN3aXRjaF9qdW1wCi1MJDEwMzcKLQlibCBMJDAwNTMsJXIwIDsjIDkzNDQgc3dpdGNoX2p1bXAKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODc3NyByZWxvYWRfb3V0c2krMi81Ci1MJDEwMzgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNDcgc3dpdGNoX2p1bXAKLUwkMTAzOQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM1MCBzd2l0Y2hfanVtcAotTCQxMDQwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzUzIHN3aXRjaF9qdW1wCi1MJDEwNDEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNTYgc3dpdGNoX2p1bXAKLUwkMTA0MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM1OSBzd2l0Y2hfanVtcAotTCQxMDQzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzYyIHN3aXRjaF9qdW1wCi1MJDEwNDQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNjUgc3dpdGNoX2p1bXAKLUwkMTA0NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM2OCBzd2l0Y2hfanVtcAotTCQxMDQ2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzcxIHN3aXRjaF9qdW1wCi1MJDEwNDcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNzQgc3dpdGNoX2p1bXAKLUwkMTA0OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM3NyBzd2l0Y2hfanVtcAotTCQxMDQ5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzgwIHN3aXRjaF9qdW1wCi1MJDEwNTAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzODMgc3dpdGNoX2p1bXAKLUwkMTA1MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM4NiBzd2l0Y2hfanVtcAotTCQxMDUyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mzg5IHN3aXRjaF9qdW1wCi1MJDEwNTMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzOTIgc3dpdGNoX2p1bXAKLUwkMTA1NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM5NSBzd2l0Y2hfanVtcAotTCQxMDU1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mzk4IHN3aXRjaF9qdW1wCi1MJDEwNTYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MDEgc3dpdGNoX2p1bXAKLUwkMTA1NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQwNCBzd2l0Y2hfanVtcAotTCQxMDU4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDA3IHN3aXRjaF9qdW1wCi1MJDEwNTkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MTAgc3dpdGNoX2p1bXAKLUwkMTA2MAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQxMyBzd2l0Y2hfanVtcAotTCQxMDYxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDE2IHN3aXRjaF9qdW1wCi1MJDEwNjIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MTkgc3dpdGNoX2p1bXAKLUwkMTA2MwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQyMiBzd2l0Y2hfanVtcAotTCQxMDY0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDI1IHN3aXRjaF9qdW1wCi1MJDEwNjUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0Mjggc3dpdGNoX2p1bXAKLUwkMTA2NgotCWJsIEwkMDM4MywlcjAgOyMgOTQzMSBzd2l0Y2hfanVtcAotCWxkaSA0NjA4LCVyMjAgOyMgMzc3OCByZWxvYWRfb3V0c2krMi8yCi1MJDEwNjcKLQlibCBMJDAzODAsJXIwCi0Jbm9wIDsjIDk0MzQgc3dpdGNoX2p1bXAKLUwkMTA2OAotCWJsLG4gTCQwMDc2LCVyMCA7IyA3ODk5IGp1bXAKLUwkMDA1MwotCWxkdyAtMjk2KCVyMzApLCVyMjUgOyMgMjM0MyByZWxvYWRfb3V0c2krMi81Ci0JbGRvIDEoJXIxKSwlcjE5IDsjIDMwNiBhZGRzaTMvMgotCWNvbWIsPSxuICVyMTksJXIyNSxMJDAwNTUgOyMgMzA4IGJsZXUrMQotCWJiLDwgJXIxNSwyOCxMJDAwNTUgOyMgMzEzIGJsZXUrMwotCWxkdyAtMjc2KCVyMzApLCVyMjYgOyMgMzE1IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGF0X2JlZ2xpbmVfbG9jX3AsJXIyIDsjIDMyMSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxNSwlcjI0IDsjIDMxOSByZWxvYWRfb3V0c2krMi8xCi0JZXh0cnMgJXIyOCwzMSw4LCVyMjggOyMgMzI0IGV4dGVuZHFpc2kyCi0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDMyNiBibGV1KzEKLQlibCxuIEwkMDA3NiwlcjAKLUwkMDA1NQotCWxkdyAwKCVyNSksJXI0IDsjIDc5ODYgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3OTg5IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc5ODcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDc5ODggYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAwNjAgOyMgNzk5MCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg3MDEgcmVsb2FkX291dHNpKzIvMwotTCQwMDYxCi0JY29tY2xyLDw+ICVyMywlcjIwLCVyMCA7IyAzNTcgYmxldSsxCi0JYmwgTCQwOTQ0LCVyMAotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDM2NyBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAwNjYgOyMgMzc1IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAzNjkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDM3OCByZWxvYWRfb3V0c2krMi82Ci1MJDAwNjYKLQlsZHcgMCglcjUpLCVyMjYgOyMgMzg1IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDM4OSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAzODcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAzOTcgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDM5MyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDA1OSA7IyA0MDcgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA0MDkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDEyIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNDEzIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMDY5IDsjIDQxOCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQxNiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQxOSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDIyIGFkZHNpMy8xCi1MJDAwNjkKLQljb21pYiw9IDAsJXI4LEwkMDA3MCA7IyA0MjUgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0MjYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDI5IGFkZHNpMy8xCi1MJDAwNzAKLQljb21pYiw9IDAsJXI5LEwkMDA1OSA7IyA0MzIgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0MzMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDM2IGFkZHNpMy8xCi1MJDAwNTkKLQlsZHcgMCglcjUpLCVyNCA7IyAzMzcgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAzNDEgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMzM4IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzMzkgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAwNjEKLQlub3AgOyMgMzQzIGJsZXUrMQotTCQwMDYwCi0JbGRpIDgsJXIxOSA7IyA0NTggbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA0NzkganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDU5IG1vdnFpKzEvNgotTCQwMDc3Ci0JY29tYiw9LG4gJXIxNiwlcjI2LEwkMDA3OSA7IyA0ODUgYmxldSsxCi0JYmIsPCAlcjE1LDI4LEwkMDA3OSA7IyA0OTAgYmxldSszCi0JY29weSAlcjE2LCVyMjUgOyMgNDk0IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGF0X2VuZGxpbmVfbG9jX3AsJXIyIDsjIDQ5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxNSwlcjI0IDsjIDQ5NiByZWxvYWRfb3V0c2krMi8xCi0JZXh0cnMgJXIyOCwzMSw4LCVyMjggOyMgNTAxIGV4dGVuZHFpc2kyCi0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDUwMyBibGV1KzEKLQlibCxuIEwkMDA3NiwlcjAKLUwkMDA3OQotCWxkdyAwKCVyNSksJXI0IDsjIDc5OTQgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3OTk3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc5OTUgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDc5OTYgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAwODQgOyMgNzk5OCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2OTkgcmVsb2FkX291dHNpKzIvMwotTCQwMDg1Ci0JY29tY2xyLDw+ICVyMywlcjIwLCVyMCA7IyA1MzQgYmxldSsxCi0JYmwgTCQwOTQ0LCVyMAotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDU0NCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAwOTAgOyMgNTUyIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA1NDYgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDU1NSByZWxvYWRfb3V0c2krMi82Ci1MJDAwOTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNTYyIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDU2NiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA1NjQgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA1NzQgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDU3MCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDA4MyA7IyA1ODQgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA1ODYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNTg5IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNTkwIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMDkzIDsjIDU5NSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDU5MyBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDU5NiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNTk5IGFkZHNpMy8xCi1MJDAwOTMKLQljb21pYiw9IDAsJXI4LEwkMDA5NCA7IyA2MDIgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2MDMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjA2IGFkZHNpMy8xCi1MJDAwOTQKLQljb21pYiw9IDAsJXI5LEwkMDA4MyA7IyA2MDkgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2MTAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjEzIGFkZHNpMy8xCi1MJDAwODMKLQlsZHcgMCglcjUpLCVyNCA7IyA1MTQgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA1MTggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNTE1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA1MTYgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAwODUKLQlub3AgOyMgNTIwIGJsZXUrMQotTCQwMDg0Ci0JbGRpIDksJXIxOSA7IyA2MzUgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2NTYganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjM2IG1vdnFpKzEvNgotTCQwODc3Ci0JYmwgTCQwMTEwLCVyMCA7IyA4OTcganVtcAotCXN0dyAlcjIxLC0yOTYoJXIzMCkgOyMgMjM5MSByZWxvYWRfb3V0c2krMi82Ci1MJDAxMDEKLUwkMTE1OAotCWFuZCAlcjE1LCVyMTksJXIxOSA7IyA2NjMgYW5kc2kzLzEKLQljb21pY2xyLD0gMCwlcjE5LCVyMCA7IyA2NjUgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAxMDQKLQljb21pYiw8PiAwLCVyOCxMJDAxMDUgOyMgNjc0IGJsZXUrMQotCWxkaSAwLCVyMTMgOyMgNzExIHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyw+PSAlcjE1LDI2LDEsJXIwIDsjIDY4MSBibGV1KzMKLQlleHRycyw8ICVyMTUsMjcsMSwlcjAgOyMgNzAwIG1vdnNpLTQKLQlub3AKLQlibCxuIEwkMDA3NiwlcjAKLUwkMDEwNQotCWxkaSAwLCVyMTEgOyMgNzE0IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMCwlcjIyIDsjIDcxNiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDQzLCVyMjQgOyMgODY4OCByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDYzLCVyMjMgOyMgODY5MCByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDQyLCVyMjggOyMgODY5MiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDIsJXIxOSA7IyA4Njk0IHJlbG9hZF9vdXRzaSsyLzIKLQlhbmQgJXIxNSwlcjE5LCVyMjUgOyMgODY5NSBhbmRzaTMvMQotCWxkaSA5MiwlcjI2IDsjIDg2OTcgcmVsb2FkX291dHNpKzIvMgotTCQwMTA5Ci0JY29tYiw9ICVyMjQsJXI3LEwkMDExMiA7IyA3MjcgYmxldSsxCi0JY29weSAlcjExLCVyMTkgOyMgODc4MCByZWxvYWRfb3V0c2krMi8xCi0JZGVwaSAtMSwzMSwxLCVyMTkgOyMgNzI5IGlvcnNpMysxLzIKLQlibCBMJDAxMTMsJXIwIDsjIDczMSBqdW1wCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzMwIGV4dGVuZHFpc2kyCi1MJDAxMTIKLQlleHRycyAlcjExLDMxLDgsJXIxOSA7IyA3MzQgZXh0ZW5kcWlzaTIKLUwkMDExMwotTCQxMTU5Ci0JY29tYiw9ICVyMjMsJXI3LEwkMDExNCA7IyA3NDQgYmxldSsxCi0JY29weSAlcjE5LCVyMTEgOyMgNzM3IHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMjIsJXIxOSA7IyA4NzgzIHJlbG9hZF9vdXRzaSsyLzEKLQlkZXBpIC0xLDMxLDEsJXIxOSA7IyA3NDYgaW9yc2kzKzEvMgotCWJsIEwkMDExNSwlcjAgOyMgNzQ4IGp1bXAKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NDcgZXh0ZW5kcWlzaTIKLUwkMDExNAotCWV4dHJzICVyMjIsMzEsOCwlcjE5IDsjIDc1MSBleHRlbmRxaXNpMgotTCQwMTE1Ci0JbGR3IC0yOTYoJXIzMCksJXIyMSA7IyAyMzU1IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIxLEwkMDExMCA7IyA3NTcgYmxldSsxCi0JY29weSAlcjE5LCVyMjIgOyMgNzU0IHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMjEsJXIyMCA7IyA4NzQzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGJzLG1hIDEoJXIyMCksJXI3IDsjIDc3NiB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw9IDAsJXIxNCxMJDAxMTggOyMgNzgxIGJsZXUrMQotCXN0dyAlcjIwLC0yOTYoJXIzMCkgOyMgMjM2NCByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDc4MiBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyA3ODUgemVyb19leHRlbmRxaXNpMi8yCi1MJDAxMTgKLQljb21iLD0gJXIyOCwlcjcsTCQwMTA5Ci0Jbm9wIDsjIDgwMiBibGV1KzEKLQljb21pYiw8PixuIDAsJXIyNSxMJDA4NjkgOyMgODA3IGJsZXUrMQotCWNvbWIsPSAlcjI0LCVyNyxMJDExNTkgOyMgODExIGJsZXUrMQotCWV4dHJzICVyMTEsMzEsOCwlcjE5IDsjIDczNCBleHRlbmRxaXNpMgotCWNvbWIsPSAlcjIzLCVyNyxMJDAxMDkgOyMgODE1IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwMCByZWxvYWRfb3V0c2krMi81Ci0JYmwsbiBMJDExNjAsJXIwIDsjIDgyNyBqdW1wCi1MJDA4NjkKLQljb21iLDw+ICVyMjYsJXI3LEwkMDEyNiA7IyA4MzEgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDAwIHJlbG9hZF9vdXRzaSsyLzUKLQljb21jbHIsPD4gJXIxNiwlcjIwLCVyMCA7IyA4MzUgYmxldSsxCi0JYmwgTCQwOTAzLCVyMAotCWxkbyAxKCVyMjApLCVyMTkgOyMgODYzIGFkZHNpMy8yCi0JbGRiIDEoJXIyMSksJXIzIDsjIDg2MCB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw9IDAsJXIxNCxMJDAxMjkgOyMgODY1IGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjM3OSByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyMywlcjE5IDsjIDg2NiBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMyA7IyA4NjkgemVyb19leHRlbmRxaXNpMi8yCi1MJDAxMjkKLQljb21iLD0gJXIyNCwlcjMsTCQwMTA5IDsjIDg4NiBibGV1KzEKLQljb3B5ICVyMywlcjcgOyMgOTAzIHJlbG9hZF9vdXRzaSsyLzEKLQljb21iLDw+ICVyMjMsJXIzLEwkMDg3NwotCW5vcCA7IyA4OTAgYmxldSsxCi0JYmwsbiBMJDAxMDksJXIwIDsjIDkwNSBqdW1wCi1MJDAxMjYKLUwkMTE2MAotCWxkbyAtMSglcjE5KSwlcjE5IDsjIDkxMCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjM5NyByZWxvYWRfb3V0c2krMi82Ci1MJDAxMTAKLQljb21pY2xyLDw+IDAsJXI4LCVyMCA7IyA5MjcgYmxldSsxCi0JYmwgTCQxMTYxLCVyMAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSxuIDAsJXIyMixMJDAxMzcgOyMgOTM0IGJsZXUrMQotCWxkdyAwKCVyNSksJXIzIDsjIDgwMDIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDA1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMDMgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgwMDQgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAxMzkgOyMgODAwNiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2ODYgcmVsb2FkX291dHNpKzIvMwotTCQwMTQwCi0JY29tY2xyLDw+ICVyNCwlcjIwLCVyMCA7IyA5NjEgYmxldSsxCi0JYmwgTCQwOTQ0LCVyMAotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDk3MSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAxNDUgOyMgOTc5IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA5NzMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDk4MiByZWxvYWRfb3V0c2krMi82Ci1MJDAxNDUKLQlsZHcgMCglcjUpLCVyMjYgOyMgOTg5IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDk5MyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA5OTEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxMDAxIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA5OTcgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDAxMzggOyMgMTAxMSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDEwMTMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTAxNiBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDEwMTcgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAxNDggOyMgMTAyMiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDEwMjAgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxMDIzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxMDI2IGFkZHNpMy8xCi1MJDAxNDgKLQljb21pYiw9IDAsJXI4LEwkMDE0OSA7IyAxMDI5IGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTAzMCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxMDMzIGFkZHNpMy8xCi1MJDAxNDkKLQljb21pYiw9IDAsJXI5LEwkMDEzOCA7IyAxMDM2IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgMTAzNyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxMDQwIGFkZHNpMy8xCi1MJDAxMzgKLQlsZHcgMCglcjUpLCVyMyA7IyA5NDEgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA5NDUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgOTQyIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA5NDMgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAxNDAKLQlub3AgOyMgOTQ3IGJsZXUrMQotTCQwMTM5Ci0JY29taWIsPSAwLCVyMTQsTCQwMTU0IDsjIDEwNjMgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDAzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgLTIoJXIxOSksJXIxOSA7IyAxMDY2IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjE5LCVyMTkgOyMgMTA2NyBhZGRzaTMvMQotCWJsIEwkMDk0NywlcjAgOyMgMTA3MSBqdW1wCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAxMDY5IG1vdnFpKzEvNQotTCQwMTU0Ci0JbGRiIC0yKCVyMTkpLCVyMTkgOyMgMTA3NSBtb3ZxaSsxLzUKLUwkMDk0NwotCWNvbWliLD0gMCwlcjE0LEwkMDE1NiA7IyAxMDc5IGJsZXUrMQotCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDEwNzYgZXh0ZW5kcWlzaTIKLQlsZGIgNDYoJXIxNCksJXIxOSA7IyAxMDgxIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDEwODIgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIxOSwlcjIwLEwkMDE1NyA7IyAxMDg0IGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotCWJsLG4gTCQxMTYyLCVyMCA7IyAxMDg1IGp1bXAKLUwkMDE1NgotCWxkaSA0NiwlcjE5IDsjIDEwODkgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxOSwlcjIwLEwkMTE2MiA7IyAxMDkxIGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotTCQwMTU3Ci0JY29taWIsPSAwLCVyMTEsTCQwMTUzIDsjIDEwOTYgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDA5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLDw8PSAlcjE2LCVyMTksTCQxMTYyIDsjIDEwOTggYmxldSsxCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi0JY29taWIsPSxuIDAsJXIxNCxMJDAxNTggOyMgMTEwMCBibGV1KzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDExMDMgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyMTksJXIxOSA7IyAxMTA0IGFkZHNpMy8xCi1MJDAxNTgKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDExMTIgbW92cWkrMS81Ci0JY29taWIsPSAwLCVyMTQsTCQwMTYwIDsjIDExMTYgYmxldSsxCi0JZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgMTExMyBleHRlbmRxaXNpMgotCWxkYiAxMCglcjE0KSwlcjE5IDsjIDExMTggbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTExOSBleHRlbmRxaXNpMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwMTYxIDsjIDExMjEgYmxldSsxCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi0JYmwsbiBMJDExNjIsJXIwIDsjIDExMjIganVtcAotTCQwMTYwCi0JY29taWIsPD4gMTAsJXIyMCxMJDExNjIgOyMgMTEyNiBibGV1KzEKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDE2MQotCWJiLDwgJXIxNSwyNSxMJDExNjIgOyMgMTEzNCBibGV1KzMKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMTIsJXIyNiA7IyAxMTQwIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyNiwlcjI1IDsjIDExNDIgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjgsJXI2LCVyMjQgOyMgMTEzNyBzdWJzaTMvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgc3RvcmVfb3AxLCVyMiA7IyAxMTQ2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGRvIC0zKCVyMjQpLCVyMjQgOyMgMTE0NCBhZGRzaTMvMgotCWJsIEwkMDE2MiwlcjAgOyMgMTE1MSBqdW1wCi0JbGRpIDEsJXIxMyA7IyAxMTQ5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDE1MwotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotTCQxMTYyCi0JY29weSAlcjYsJXIyNSA7IyAxMTYxIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI4LCVyNiwlcjI0IDsjIDExNTYgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgMTE2NSBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtNiglcjI0KSwlcjI0IDsjIDExNjMgYWRkc2kzLzIKLUwkMDE2MgotCWxkbyAzKCVyNiksJXI2IDsjIDExNjggYWRkc2kzLzIKLUwkMDEzNwotCWxkdyAwKCVyNSksJXIzIDsjIDgwMTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDEzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMTEgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgwMTIgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAxNjQgOyMgODAxNCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2ODQgcmVsb2FkX291dHNpKzIvMwotTCQwMTY1Ci0JY29tY2xyLDw+ICVyNCwlcjIwLCVyMCA7IyAxMTk1IGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxMjA1IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDE3MCA7IyAxMjEzIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAxMjA3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyAxMjE2IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDE3MAotCWxkdyAwKCVyNSksJXIyNiA7IyAxMjIzIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDEyMjcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMTIyNSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDEyMzUgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDEyMzEgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDAxNjMgOyMgMTI0NSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDEyNDcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTI1MCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDEyNTEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAxNzMgOyMgMTI1NiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDEyNTQgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxMjU3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxMjYwIGFkZHNpMy8xCi1MJDAxNzMKLQljb21pYiw9IDAsJXI4LEwkMDE3NCA7IyAxMjYzIGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTI2NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxMjY3IGFkZHNpMy8xCi1MJDAxNzQKLQljb21pYiw9IDAsJXI5LEwkMDE2MyA7IyAxMjcwIGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgMTI3MSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxMjc0IGFkZHNpMy8xCi1MJDAxNjMKLQlsZHcgMCglcjUpLCVyMyA7IyAxMTc1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMTE3OSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMTc2IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyAxMTc3IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMTY1Ci0Jbm9wIDsjIDExODEgYmxldSsxCi1MJDAxNjQKLQlsZGkgMTQsJXIyNiA7IyA4Nzg2IHJlbG9hZF9vdXRzaSsyLzIKLQljb21pY2xyLD0gMCwlcjEzLCVyMCA7IyAxMzEwIGJlcS0xLzIKLQlsZGkgMTUsJXIyNgotCWNvcHkgJXI4LCVyMjUgOyMgMTMxMiByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjgsJXIyNCA7IyAxMzE0IHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyAxMzE4IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyAxMzE2IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjkgOyMgMTMyMSByZWxvYWRfb3V0c2krMi8yCi0JY29taWIsPD4gMCwlcjExLEwkMDA0MyA7IyAxMzI2IGJsZXUrMQotCWxkbyAzKCVyNiksJXI2IDsjIDEzMjMgYWRkc2kzLzIKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDE5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAyMiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDIwIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDIxIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMTgyIDsjIDgwMjMgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NjgyIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDE4MwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgMTM1MiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxMzYyIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDE4OCA7IyAxMzcwIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAxMzY0IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyAxMzczIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDE4OAotCWxkdyAwKCVyNSksJXIyNiA7IyAxMzgwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDEzODQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMTM4MiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDEzOTIgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDEzODggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDAxODEgOyMgMTQwMiBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDE0MDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTQwNyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDE0MDggc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAxOTEgOyMgMTQxMyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDE0MTEgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxNDE0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxNDE3IGFkZHNpMy8xCi1MJDAxOTEKLQljb21pYiw9IDAsJXI4LEwkMDE5MiA7IyAxNDIwIGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTQyMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxNDI0IGFkZHNpMy8xCi1MJDAxOTIKLQljb21pYiw9IDAsJXI5LEwkMDE4MSA7IyAxNDI3IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgMTQyOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxNDMxIGFkZHNpMy8xCi1MJDAxODEKLQlsZHcgMCglcjUpLCVyMyA7IyAxMzMyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMTMzNiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMzMzIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyAxMzM0IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMTgzCi0Jbm9wIDsjIDEzMzggYmxldSsxCi1MJDAxODIKLQlsZGkgMTgsJXIyNiA7IyAxNDU0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDE0NTYgcmVsb2FkX291dHNpKzIvMQotCWxkaSAzLCVyMjQgOyMgMTQ1OCByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyAxNDYyIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyAxNDYwIHJlbG9hZF9vdXRzaSsyLzEKLQlibCBMJDAwNDMsJXIwIDsjIDE0NzAganVtcAotCWxkbyAzKCVyNiksJXI2IDsjIDE0NjQgYWRkc2kzLzIKLUwkMDE5NgotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDMwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwMjggc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwMjkgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwMjAxIDsjIDgwMzEgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDE0NzUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY4MCByZWxvYWRfb3V0c2krMi8zCi1MJDAyMDIKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDE1MDMgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTUxMyBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAyMDcgOyMgMTUyMSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTUxNSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgMTUyNCByZWxvYWRfb3V0c2krMi82Ci1MJDAyMDcKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTUzMSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxNTM1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE1MzMgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxNTQzIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxNTM5IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwMjAwIDsjIDE1NTMgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyAxNTU1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE1NTggYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyAxNTU5IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjEwIDsjIDE1NjQgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxNTYyIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgMTU2NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTU2OCBhZGRzaTMvMQotTCQwMjEwCi0JY29taWIsPSAwLCVyOCxMJDAyMTEgOyMgMTU3MSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDE1NzIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTU3NSBhZGRzaTMvMQotTCQwMjExCi0JY29taWIsPSAwLCVyOSxMJDAyMDAgOyMgMTU3OCBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDE1Nzkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTU4MiBhZGRzaTMvMQotTCQwMjAwCi0JbGR3IDAoJXI1KSwlcjQgOyMgMTQ4MyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE0ODcgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTQ4NCBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMTQ4NSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDIwMgotCW5vcCA7IyAxNDg5IGJsZXUrMQotTCQwMjAxCi0JbGRpIDIsJXIxOSA7IyAxNjA0IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgMTYxNyBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyAxNjA1IG1vdnFpKzEvNgotTCQwMjE2Ci0JY29tYiw9ICVyMTYsJXIxOSxMJDA5MDIgOyMgMTYyNiBibGV1KzEKLQlsZGkgMCwlcjEzIDsjIDE2MjMgcmVsb2FkX291dHNpKzIvMgotCWxkdyAwKCVyNSksJXIzIDsjIDgwMzUgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDM4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMzYgc3Vic2kzLzEKLQlsZG8gMzQoJXIxOSksJXIxOSA7IyA4MDM3IGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDIxOSA7IyA4MDM5IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjQgOyMgODY3OCByZWxvYWRfb3V0c2krMi8zCi1MJDAyMjAKLQljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDE2NjEgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTY3MSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAyMjUgOyMgMTY3OSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTY3MyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgMTY4MiByZWxvYWRfb3V0c2krMi82Ci1MJDAyMjUKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTY4OSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxNjkzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE2OTEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxNzAxIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxNjk3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMjE4IDsjIDE3MTEgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxNzEzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE3MTYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxNzE3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjI4IDsjIDE3MjIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxNzIwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTcyMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTcyNiBhZGRzaTMvMQotTCQwMjI4Ci0JY29taWIsPSAwLCVyOCxMJDAyMjkgOyMgMTcyOSBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDE3MzAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTczMyBhZGRzaTMvMQotTCQwMjI5Ci0JY29taWIsPSAwLCVyOSxMJDAyMTggOyMgMTczNiBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDE3Mzcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTc0MCBhZGRzaTMvMQotTCQwMjE4Ci0JbGR3IDAoJXI1KSwlcjMgOyMgMTY0MSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE2NDUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTY0MiBzdWJzaTMvMQotCWxkbyAzNCglcjE5KSwlcjE5IDsjIDE2NDMgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAyMjAKLQlub3AgOyMgMTY0NyBibGV1KzEKLUwkMDIxOQotCWxkdyAwKCVyNSksJXI0IDsjIDgwNDMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwNDQgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwNDUgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwMjM3IDsjIDgwNDcgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDE3NjMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY3NiByZWxvYWRfb3V0c2krMi8zCi1MJDAyMzgKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDE3OTEgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTgwMSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAyNDMgOyMgMTgwOSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTgwMyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgMTgxMiByZWxvYWRfb3V0c2krMi82Ci1MJDAyNDMKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTgxOSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxODIzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE4MjEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxODMxIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxODI3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwMjM2IDsjIDE4NDEgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyAxODQzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE4NDYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyAxODQ3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjQ2IDsjIDE4NTIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxODUwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgMTg1MyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTg1NiBhZGRzaTMvMQotTCQwMjQ2Ci0JY29taWIsPSAwLCVyOCxMJDAyNDcgOyMgMTg1OSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDE4NjAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTg2MyBhZGRzaTMvMQotTCQwMjQ3Ci0JY29taWIsPSAwLCVyOSxMJDAyMzYgOyMgMTg2NiBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDE4Njcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTg3MCBhZGRzaTMvMQotTCQwMjM2Ci0JbGR3IDAoJXI1KSwlcjQgOyMgMTc3MSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE3NzUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTc3MiBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMTc3MyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDIzOAotCW5vcCA7IyAxNzc3IGJsZXUrMQotTCQwMjM3Ci0JY29weSAlcjYsJXIyMiA7IyAxOTA5IHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gMSglcjYpLCVyNiA7IyAxODkxIGFkZHNpMy8yCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDIxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDE4OTMgbW92cWkrMS81Ci0JbGRpIDk0LCVyMjEgOyMgMTg5NiByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTg5NCBleHRlbmRxaXNpMgotCWNvbWIsPD4gJXIyMSwlcjE5LEwkMDI1MSA7IyAxODk4IGJsZXUrMQotCWxkaSAzLCVyMjAgOyMgODA1MSBtb3ZxaSsxLzIKLQlsZGkgNCwlcjIwIDsjIDE5MDAgbW92cWkrMS8yCi1MJDAyNTEKLQlzdGIgJXIyMCwwKCVyMjIpIDsjIDE5MTEgbW92cWkrMS82Ci0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDI0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjIwKSwlcjE5IDsjIDE5MjMgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTkyNCBleHRlbmRxaXNpMgotCWNvbWIsPD4gJXIyMSwlcjE5LEwkMDI1NCA7IyAxOTI4IGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgMTkzMCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjQyNyByZWxvYWRfb3V0c2krMi82Ci1MJDAyNTQKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDUyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA1NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0yOTYoJXIzMCksJXIxIDsjIDI0MzMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODA1MyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODA1NCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDAyNTkgOyMgODA1NiBibGV1KzEKLQlzdHcgJXIxLC0yNjgoJXIzMCkgOyMgODc4OSByZWxvYWRfb3V0c2krMi82Ci0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4Njc0IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDI2MAotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgMTk2MiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxOTcyIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDI2NSA7IyAxOTgwIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAxOTc0IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyAxOTgzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDI2NQotCWxkdyAwKCVyNSksJXIyNiA7IyAxOTkwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDE5OTQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMTk5MiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDIwMDIgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDE5OTggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDAyNTggOyMgMjAxMiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDIwMTQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMjAxNyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDIwMTggc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAyNjggOyMgMjAyMyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDIwMjEgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyAyMDI0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAyMDI3IGFkZHNpMy8xCi1MJDAyNjgKLQljb21pYiw9IDAsJXI4LEwkMDI2OSA7IyAyMDMwIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgMjAzMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAyMDM0IGFkZHNpMy8xCi1MJDAyNjkKLQljb21pYiw9IDAsJXI5LEwkMDI1OCA7IyAyMDM3IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgMjAzOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAyMDQxIGFkZHNpMy8xCi1MJDAyNTgKLQlsZHcgMCglcjUpLCVyNCA7IyAxOTQyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMTk0NiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyAxOTQzIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAxOTQ0IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMjYwCi0Jbm9wIDsjIDE5NDggYmxldSsxCi1MJDAyNTkKLQlsZGkgMzIsJXIxOSA7IyAyMDYzIG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgMjA2NCBtb3ZxaSsxLzYKLQljb3B5ICVyNiwlcjI2IDsjIDIwNzcgcmVsb2FkX291dHNpKzIvMQotCWxkaSAwLCVyMjUgOyMgMjA3OSByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyIDsjIDIwODMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZGkgMzIsJXIyNCA7IyAyMDgxIHJlbG9hZF9vdXRzaSsyLzIKLQlsZGIgLTIoJXI2KSwlcjE5IDsjIDIwODcgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPD4gNCwlcjE5LEwkMDI3NCA7IyAyMDg5IGJsZXUrMQotCWxkaSA5MywlcjE3IDsjIDg2MjIgcmVsb2FkX291dHNpKzIvMgotCWJiLD49LG4gJXIxNSwyMyxMJDAyNzQgOyMgMjA5NCBtb3ZzaS00Ci0JbGRiIDEoJXI2KSwlcjE5IDsjIDIwOTcgbW92cWkrMS81Ci0JZGVwaSAtMSwyOSwxLCVyMTkgOyMgMjA5OSBpb3JzaTMrMS8yCi0Jc3RiICVyMTksMSglcjYpIDsjIDIxMDEgbW92cWkrMS82Ci1MJDAyNzQKLQlsZGkgNCwlcjE4IDsjIDg2MjggcmVsb2FkX291dHNpKzIvMgotCWFuZCAlcjE1LCVyMTgsJXIxIDsjIDg2MjkgYW5kc2kzLzEKLQlzdHcgJXIxLC0yNTIoJXIzMCkgOyMgODc5MiByZWxvYWRfb3V0c2krMi82Ci0JbGRvIC0yODgoJXIzMCksJXIxMSA7IyA4NjMyIGFkZHNpMy8yCi1MJDAyNzUKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0MzYgcmVsb2FkX291dHNpKzIvNQotTCQxMTY1Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MDIgOyMgMjEwOSBibGV1KzEKLQljb3B5ICVyMjAsJXIyMSA7IyA4NzQ1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGJzLG1hIDEoJXIyMSksJXI3IDsjIDIxMzQgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMjgwIDsjIDIxMzkgYmxldSsxCi0Jc3R3ICVyMjEsLTI5NiglcjMwKSA7IyAyNDQ1IHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRsICVyMTQsJXI3LCVyMTkgOyMgMjE0MCBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyAyMTQzIHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMjgwCi0JYmIsPj0gJXIxNSwzMSxMJDAyODUgOyMgMjE1OSBtb3ZzaS00Ci0JbGRpIDkyLCVyMTkgOyMgMjE2MSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PixuICVyMTksJXI3LEwkMDI4NSA7IyAyMTYzIGJsZXUrMQotCWNvbWIsPSAlcjE2LCVyMjEsTCQwOTAzIDsjIDIxNjcgYmxldSsxCi0JbGRvIDEoJXIyMSksJXIxOSA7IyAyMTk1IGFkZHNpMy8yCi0JbGRiIDEoJXIyMCksJXIzIDsjIDIxOTIgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMjg4IDsjIDIxOTcgYmxldSsxCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyNDYwIHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRsICVyMTQsJXIzLCVyMTkgOyMgMjE5OCBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMyA7IyAyMjAxIHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMjg4Ci0JZXh0cnUgJXIzLDI4LDI5LCVyMTkgOyMgMjIxNiBsc2hyc2kzLzIKLQlhZGRsICVyNiwlcjE5LCVyMTkgOyMgMjIxOSBhZGRzaTMvMQotCWJsIEwkMDk0OCwlcjAgOyMgMjIzNSBqdW1wCi0JZXh0cnUgJXIzLDMxLDMsJXIyMCA7IyAyMjIyIGFuZHNpMy8xCi1MJDAyODUKLQljb21iLDw+LG4gJXIxNywlcjcsTCQwMjkzIDsjIDIyNDMgYmxldSsxCi0JbGR3IC0yNjgoJXIzMCksJXIxIDsjIDg3OTggcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjQ2NiByZWxvYWRfb3V0c2krMi81Ci0JbGRvIDEoJXIxKSwlcjE5IDsjIDIyNDQgYWRkc2kzLzIKLQljb21iLDw+LG4gJXIxOSwlcjIwLEwkMDI3NiA7IyAyMjQ2IGJsZXUrMQotTCQwMjkzCi0JY29taWIsPSAwLCVyMTMsTCQwMjk0IDsjIDIyNTMgYmxldSsxCi0JbGRpIDQ1LCVyMSA7IyA4ODAxIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMSwlcjcsTCQxMTYzIDsjIDIyNTcgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNTI0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0NjkgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMjI1OSBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMjYwIGV4dGVuZHFpc2kyCi0JY29tYiw8PixuICVyMTcsJXIxOSxMJDA4OTUgOyMgMjI2NCBibGV1KzEKLUwkMDI5NAotCWxkaSA0NSwlcjEgOyMgODgwNCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PiAlcjEsJXI3LEwkMTE2MyA7IyAyMjgwIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg4MDcgcmVsb2FkX291dHNpKzIvNQotCWxkbyAtMiglcjIwKSwlcjE5IDsjIDIyODEgYWRkc2kzLzIKLQljb21iLD4+LG4gJXIxLCVyMTksTCQxMTc5IDsjIDIyODMgYmxldSsxCi0JbGRiIC0yKCVyMjApLCVyMTkgOyMgMjI4NSBtb3ZxaSsxLzUKLQlsZGkgOTEsJXIxIDsjIDg4MTAgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIyODYgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIxLCVyMTksTCQxMTYzIDsjIDIyOTAgYmxldSsxCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg4MTMgcmVsb2FkX291dHNpKzIvNQotTCQxMTc5Ci0JbGRvIC0zKCVyMjApLCVyMTkgOyMgMjI5NCBhZGRzaTMvMgotCWNvbWIsPj4sbiAlcjEsJXIxOSxMJDAyOTcgOyMgMjI5NiBibGV1KzEKLQlsZGIgLTMoJXIyMCksJXIxOSA7IyAyMjk4IG1vdnFpKzEvNQotCWxkaSA5MSwlcjEgOyMgODgxNiByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjI5OSBleHRlbmRxaXNpMgotCWNvbWIsPD4gJXIxLCVyMTksTCQxMTY0IDsjIDIzMDMgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDg3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgLTIoJXIyMCksJXIxOSA7IyAyMzA1IG1vdnFpKzEvNQotCWxkaSA5NCwlcjIwIDsjIDIzMDggcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIzMDYgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIyMCwlcjE5LEwkMTE2MyA7IyAyMzEwIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81Ci1MJDAyOTcKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0ODcgcmVsb2FkX291dHNpKzIvNQotTCQxMTY0Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAyMzE1IG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIzMTYgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMTcsJXIxOSxMJDAzMDIgOyMgMjMyMCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQotTCQxMTYzCi0JbGRiIDAoJXIyMCksJXIxOSA7IyAyNTI2IG1vdnFpKzEvNQotCWxkaSA0NSwlcjEgOyMgODgxOSByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjUyNyBleHRlbmRxaXNpMgotCWNvbWIsPD4sbiAlcjEsJXIxOSxMJDAzMDAgOyMgMjUzMSBibGV1KzEKLQlsZGIgMSglcjIwKSwlcjE5IDsjIDI1MzUgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjUzNiBleHRlbmRxaXNpMgotCWNvbWIsPSxuICVyMTcsJXIxOSxMJDAzMDAgOyMgMjU0MCBibGV1KzEKLQljb21iLD0gJXIxNiwlcjIwLEwkMDkyMiA7IyAyNTUwIGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgMjU1OSBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjU2MSByZWxvYWRfb3V0c2krMi82Ci1MJDAzMDIKLQlzdHcgJXI2LC01MiglcjMwKSA7IyAyNTg4IHJlbG9hZF9vdXRzaSsyLzYKLQlsZG8gLTI5NiglcjMwKSwlcjI2IDsjIDI1OTAgYWRkc2kzLzIKLQljb3B5ICVyMTYsJXIyNSA7IyAyNTkyIHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMTQsJXIyNCA7IyAyNTk0IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGNvbXBpbGVfcmFuZ2UsJXIyIDsjIDI1OTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMTUsJXIyMyA7IyAyNTk2IHJlbG9hZF9vdXRzaSsyLzEKLQltb3ZiLD0gJXIyOCwlcjQsTCQxMTY1IDsjIDI2MDMgZGVjcmVtZW50X2FuZF9icmFuY2hfdW50aWxfemVybysyLzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0MzYgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgMjYwNyBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMjYwNSByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAyNjExIGp1bXAKLQljb3B5ICVyNCwlcjI4IDsjIDI2MDkgcmVsb2FkX291dHNpKzIvMQotTCQwMzAwCi0JbGR3IC0yNTIoJXIzMCksJXIxIDsjIDg4MjIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzA5IDsjIDI2MjQgYmxldSsxCi0JbGRpIDkxLCVyMSA7IyA4ODI1IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMSwlcjcsTCQxMTY2IDsjIDI2MjggYmxldSsxCi0JbGRpIDAsJXIxMyA7IyAzNjI0IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI2MzAgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMjApLCVyMTkgOyMgMjYzMiBtb3ZxaSsxLzUKLQlsZGkgNTgsJXIxIDsjIDg4MjggcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI2MzMgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIxLCVyMTksTCQxMTY2IDsjIDI2MzcgYmxldSsxCi0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgMjY0NyBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDI2NTYgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI2NTggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTAyIDsjIDI2ODkgYmxldSsxCi0JbGRpIDAsJXIzIDsjIDI2ODQgcmVsb2FkX291dHNpKzIvMgotTCQwMzE3Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNzA5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjE5LEwkMDkyMiA7IyAyNzExIGJsZXUrMQotCWxkbyAxKCVyMTkpLCVyMjAgOyMgMjcyMCBhZGRzaTMvMgotCXN0dyAlcjIwLC0yOTYoJXIzMCkgOyMgMjcyMiByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwMzIxIDsjIDI3MjkgYmxldSsxCi0JbGRiIDAoJXIxOSksJXI3IDsjIDI3MjUgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDI3MzAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMjczMyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDMyMQotCWxkaSA1OCwlcjEgOyMgODgzMSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMSwlcjcsTCQxMTY3IDsjIDI3NTAgYmxldSsxCi0JYWRkbCAlcjExLCVyMywlcjE5IDsjIDI3ODkgYWRkc2kzLzEKLQljb21iLD0sbiAlcjE3LCVyNyxMJDExNjcgOyMgMjc1NCBibGV1KzEKLQljb21iLD0sbiAlcjE2LCVyMjAsTCQxMTY3IDsjIDI3NTggYmxldSsxCi0JY29taWIsPSA2LCVyMyxMJDExNjcgOyMgMjc2MCBibGV1KzEKLQljb3B5ICVyMywlcjIwIDsjIDI3NzAgcmVsb2FkX291dHNpKzIvMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgMjc3MSBhZGRzaTMvMgotCWV4dHJ1ICVyMTksMzEsOCwlcjMgOyMgMjc3MiB6ZXJvX2V4dGVuZHFpc2kyLzEKLQlhZGRsICVyMTEsJXIyMCwlcjIwIDsjIDI3NzYgYWRkc2kzLzEKLQlibCBMJDAzMTcsJXIwIDsjIDI3ODMganVtcAotCXN0YiAlcjcsMCglcjIwKSA7IyAyNzc4IG1vdnFpKzEvNgotTCQxMTY3Ci0JY29tYiw8PiAlcjEsJXI3LEwkMDMyOCA7IyAyNzk2IGJsZXUrMQotCXN0YiAlcjAsMCglcjE5KSA7IyAyNzkxIG1vdnFpKzEvNgotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjc5OCByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAyODAwIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI4MDEgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMTcsJXIxOSxMJDExNjggOyMgMjgwNSBibGV1KzEKLQlsZGkgMjU1LCVyMTkgOyMgODA2OSByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjExLCVyMjYgOyMgMjgxMyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE2LCVyMSA7IyA4ODM1IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxNiglcjEpLCVyMSA7IyA4ODM2IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjgxNyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMjgxNSByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjExLCVyMjYgOyMgMjgyOSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE3LCVyMSA7IyA4ODM3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxNyglcjEpLCVyMSA7IyA4ODM4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI4MzEgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjgyMSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4MzMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjQ0KCVyMzApIDsjIDg4NDEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4NDUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxOCwlcjEgOyMgODg0MiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTgoJXIxKSwlcjEgOyMgODg0MyBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODQ3IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4Mzcgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODQ5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTIzNiglcjMwKSA7IyA4ODQ2IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyODYxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTksJXIxIDsjIDg4NDcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE5KCVyMSksJXIxIDsjIDg4NDggbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjg2MyByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODUzIHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjg2NSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMjgoJXIzMCkgOyMgODg1MSByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjg3NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIwLCVyMSA7IyA4ODUyIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMCglcjEpLCVyMSA7IyA4ODUzIG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI4NzkgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjg2OSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4ODEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjIwKCVyMzApIDsjIDg4NTYgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4OTMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMSwlcjEgOyMgODg1NyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjEoJXIxKSwlcjEgOyMgODg1OCBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODk1IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4ODUgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODk3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTIxMiglcjMwKSA7IyA4ODYxIHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyOTA5IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjIsJXIxIDsjIDg4NjIgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIyKCVyMSksJXIxIDsjIDg4NjMgbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjkxMSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTAxIHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjkxMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMDQoJXIzMCkgOyMgODg2NiByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjkyNSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIzLCVyMSA7IyA4ODY3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMyglcjEpLCVyMSA7IyA4ODY4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI5MjcgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjkxNyBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5MjkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMTk2KCVyMzApIDsjIDg4NzEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5NDEgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNCwlcjEgOyMgODg3MiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjQoJXIxKSwlcjEgOyMgODg3MyBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyOTQzIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI5MzMgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyOTQ1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTE4OCglcjMwKSA7IyA4ODc2IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyOTU3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjUsJXIxIDsjIDg4NzcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI1KCVyMSksJXIxIDsjIDg4NzggbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjk1OSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTQ5IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjk2MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0xODAoJXIzMCkgOyMgODg4MSByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjk3MyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI2LCVyMTkgOyMgMjk3MCBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjYoJXIxOSksJXIzIDsjIDI5NzEgbW92aGktMgotCWNvcHkgJXIzLCVyMjUgOyMgMjk3NSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTY1IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjk3NyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0xNzIoJXIzMCkgOyMgODg4NCByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjk4OSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI3LCVyMTkgOyMgMjk4NiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjcoJXIxOSksJXI0IDsjIDI5ODcgbW92aGktMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyMTMgOyMgMjk4MSBzY2MKLQlsZGkgMSwlcjEzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5OTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyNCwlcjI1IDsjIDI5OTEgcmVsb2FkX291dHNpKzIvMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwMDUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxNywlcjEgOyMgODg4NSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTcoJXIxKSwlcjEgOyMgODg4NiBtb3ZoaS0yCi0JY29taWNsciw8PiAwLCVyMjgsJXI3IDsjIDI5OTcgc2NjCi0JbGRpIDEsJXI3Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMwMDkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMwMDcgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDEzIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwMTggcmVsb2FkX291dHNpKzIvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDIyIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjMsJXIyNSA7IyAzMDIwIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzAyNiBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDMxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjIsJXIxIDsjIDg4ODcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIyKCVyMSksJXIxIDsjIDg4ODggbW92aGktMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDM1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDMzIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzAzOSBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDQ0IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjAsJXIxIDsjIDg4ODkgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIwKCVyMSksJXIxIDsjIDg4OTAgbW92aGktMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDQ4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDQ2IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzA1MiBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDU3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTYsJXIxIDsjIDg4OTEgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE2KCVyMSksJXIxIDsjIDg4OTIgbW92aGktMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDYxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDU5IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzA2NSBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDcwIHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA3NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI0LCVyMjUgOyMgMzA3MiByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwNzggYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA4MyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI1LCVyMSA7IyA4ODkzIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyNSglcjEpLCVyMSA7IyA4ODk0IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA4NyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA4NSByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwOTEgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA5NiByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIzLCVyMSA7IyA4ODk1IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMyglcjEpLCVyMSA7IyA4ODk2IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzEwMCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA5OCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxMDQgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzEwOSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI0LCVyMSA7IyA4ODk3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyNCglcjEpLCVyMSA7IyA4ODk4IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzExMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzExMSByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxMTcgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzEyMiByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIxLCVyMSA7IyA4ODk5IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMSglcjEpLCVyMSA7IyA4OTAwIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzEyNiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzEyNCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxMzAgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzEzNSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE5LCVyMSA7IyA4OTAxIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxOSglcjEpLCVyMSA7IyA4OTAyIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzEzOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzEzNyByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxNDMgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzE0OCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE4LCVyMSA7IyA4OTAzIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxOCglcjEpLCVyMSA7IyA4OTA0IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzE1MiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzE1MCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPD4sbiAwLCVyMjgsTCQwOTAwIDsjIDMxNTYgYmxldSsxCi1MJDAzMjkKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDMxNzMgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTIyIDsjIDMxNzUgYmxldSsxCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzMTg0IGFkZHNpMy8yCi0JY29tYiw9ICVyMTYsJXIxOSxMJDA5MDIgOyMgMzIxNCBibGV1KzEKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDMxODYgcmVsb2FkX291dHNpKzIvNgotCWxkaSAwLCVyMjIgOyMgMzIyNyByZWxvYWRfb3V0c2krMi8yCi0JYWRkaWwgTFInX19hbG51bS0kZ2xvYmFsJCwlcjI3IDsjIDg1OTYgcGljMl9sb19zdW0rMQotCWNvcHkgJXIxLCVyMiA7IyA4OTA3IHJlbG9hZF9vdXRzaSsyLzEKLQlhZGRpbCBMUidfX2N0eXBlMi0kZ2xvYmFsJCwlcjI3IDsjIDg1OTggcGljMl9sb19zdW0rMQotCWNvcHkgJXIxLCVyMjMgOyMgODkxMCByZWxvYWRfb3V0c2krMi8xCi0JYWRkaWwgTFInX19jdHlwZS0kZ2xvYmFsJCwlcjI3IDsjIDg2MDAgcGljMl9sb19zdW0rMQotCWNvcHkgJXIxLCVyNCA7IyA4OTEzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMzIsJXIyNSA7IyA4NjA1IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMiwlcjI0IDsjIDg2MDcgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxNiwlcjMxIDsjIDg2MDkgcmVsb2FkX291dHNpKzIvMgotCWxkaSA4LCVyMjkgOyMgODYxMSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEyOCwlcjI4IDsjIDg2MTMgcmVsb2FkX291dHNpKzIvMgotCWxkaSAyNTUsJXIyNiA7IyA4NjE1IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgLTI0NCglcjMwKSwlcjEgOyMgODkxNiByZWxvYWRfb3V0c2krMi81Ci1MJDExNzMKLQljb21pYiw9LG4gMCwlcjEsTCQwMzQzIDsjIDMyNDAgYmxldSsxCi0Jc3R3ICVyMjIsUlInX19hbG51bS0kZ2xvYmFsJCglcjIpIDsjIDMyNDQgcmVsb2FkX291dHNpKzIvNgotCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDMyNDggcmVsb2FkX291dHNpKzIvNQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIyMSA7IyAzMjYwIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMyNTMgYWRkc2kzLzEKLQlhZGRsICVyMjEsJXIyMiwlcjIxIDsjIDMyNjUgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjIwIDsjIDMyNTUgbW92cWkrMS81Ci0JbGRiIDAoJXIyMSksJXIxOSA7IyAzMjY3IG1vdnFpKzEvNQotCWV4dHJ1ICVyMjAsMzEsMSwlcjIwIDsjIDMyNTYgYW5kc2kzLzEKLQlhbmQgJXIxOSwlcjE4LCVyMTkgOyMgMzI3MCBhbmRzaTMvMQotCW9yICVyMjAsJXIxOSwlcjIwIDsjIDMyNzggeG9yZGkzLTEKLQljb21pYiw8PiAwLCVyMjAsTCQxMTY5IDsjIDMyODAgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM0MwotCWxkdyAtMjM2KCVyMzApLCVyMSA7IyA4OTE5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM0NCA7IyAzMjg1IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDMyODkgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzI5MCBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzI5MiBtb3ZxaSsxLzUKLQliYiw8ICVyMTksMzEsTCQxMTY5IDsjIDMyOTYgYmxldSszCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM0NAotCWxkdyAtMjI4KCVyMzApLCVyMSA7IyA4OTIyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9LG4gMCwlcjEsTCQwMzQ1IDsjIDMzMDEgYmxldSsxCi0JY29tYiw9ICVyMjUsJXIyMixMJDExNjkgOyMgMzMwNSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzMzMwIHplcm9fZXh0ZW5kcWlzaTIvMQotCWNvbWliLD0gOSwlcjIyLEwkMTE3MCA7IyAzMzA3IGJsZXUrMQotCWV4dHJ1ICVyMTksMjgsMjksJXIyMSA7IyAzMzMyIGxzaHJzaTMvMgotTCQwMzQ1Ci0JbGR3IC0yMjAoJXIzMCksJXIxIDsjIDg5MjUgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzQxIDsjIDMzMTIgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDMzMTYgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzMxNyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzMxOSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjI1LCVyMTkgOyMgMzMyMiBhbmRzaTMvMQotCWNvbWliLD0gMCwlcjE5LEwkMDM0MSA7IyAzMzI1IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCi1MJDExNjkKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzMzMiBsc2hyc2kzLzIKLUwkMTE3MAotCWFkZGwgJXI2LCVyMjEsJXIyMSA7IyAzMzM1IGFkZHNpMy8xCi0JZXh0cnUgJXIxOSwzMSwzLCVyMTkgOyMgMzMzOSBhbmRzaTMvMQotCXN1YmkgMzEsJXIxOSwlcjE5IDsjIDMzNDAgc3Vic2kzLzIKLQlsZGIgMCglcjIxKSwlcjIwIDsjIDMzNDMgbW92cWkrMS81Ci0JbXRzYXIgJXIxOSA7IyA4OTI4IHJlbG9hZF9vdXRzaSsyLzcKLQl2ZGVwaSAtMSwxLCVyMjAgOyMgMzM0OCB2ZGVwaV9pb3IKLQlzdGIgJXIyMCwwKCVyMjEpIDsjIDMzNTAgbW92cWkrMS82Ci1MJDAzNDEKLQlsZHcgLTIxMiglcjMwKSwlcjEgOyMgODkzMSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDggOyMgMzM1NCBibGV1KzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzM1OCByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzU5IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAzMzYxIG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMTgsJXIxOSA7IyAzMzY0IGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMTE3MSA7IyAzMzY3IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDgKLQlsZHcgLTIwNCglcjMwKSwlcjEgOyMgODkzNCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDkgOyMgMzM3MiBibGV1KzEKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzMzc2IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzNzcgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMzNzkgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyNCwlcjE5IDsjIDMzODIgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcxIDsjIDMzODUgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzQyNiB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM0OQotCWxkdyAtMTk2KCVyMzApLCVyMSA7IyA4OTM3IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM1MCA7IyAzMzkwIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzMzk0IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzOTUgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMzOTcgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyNCwlcjE5IDsjIDM0MDAgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcxIDsjIDM0MDMgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzQyNiB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1MAotCWxkdyAtMTg4KCVyMzApLCVyMSA7IyA4OTQwIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM0NiA7IyAzNDA4IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDM0MTIgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQxMyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQxNSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjE4LCVyMTkgOyMgMzQxOCBhbmRzaTMvMQotCWNvbWliLD0gMCwlcjE5LEwkMDM0NiA7IyAzNDIxIGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDExNzEKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzQyOCBsc2hyc2kzLzIKLQlhZGRsICVyNiwlcjIxLCVyMjEgOyMgMzQzMSBhZGRzaTMvMQotCWV4dHJ1ICVyMTksMzEsMywlcjE5IDsjIDM0MzUgYW5kc2kzLzEKLQlzdWJpIDMxLCVyMTksJXIxOSA7IyAzNDM2IHN1YnNpMy8yCi0JbGRiIDAoJXIyMSksJXIyMCA7IyAzNDM5IG1vdnFpKzEvNQotCW10c2FyICVyMTkgOyMgODk0MyByZWxvYWRfb3V0c2krMi83Ci0JdmRlcGkgLTEsMSwlcjIwIDsjIDM0NDQgdmRlcGlfaW9yCi0Jc3RiICVyMjAsMCglcjIxKSA7IyAzNDQ2IG1vdnFpKzEvNgotTCQwMzQ2Ci0JbGR3IC0xODAoJXIzMCksJXIxIDsjIDg5NDYgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzUzIDsjIDM0NTAgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM0NTQgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQ1NSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQ1NyBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjMxLCVyMTkgOyMgMzQ2MCBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDExNzIgOyMgMzQ2MyBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQwMzUzCi0JbGR3IC0xNzIoJXIzMCksJXIxIDsjIDg5NDkgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzU0IDsjIDM0NjggYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM0NzIgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQ3MyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQ3NSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjI5LCVyMTkgOyMgMzQ3OCBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDExNzIgOyMgMzQ4MSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQwMzU0Ci0JY29taWIsPSAwLCVyMTMsTCQwMzU1IDsjIDM0ODYgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM0OTAgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQ5MSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQ5MyBtb3ZxaSsxLzUKLQliYiw8ICVyMTksMzEsTCQxMTcyIDsjIDM0OTcgYmxldSszCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1NQotCWNvbWliLD0gMCwlcjcsTCQwMzM5IDsjIDM1MDIgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM1MDYgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzUwNyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzUwOSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjI4LCVyMTkgOyMgMzUxMiBhbmRzaTMvMQotCWNvbWliLD0gMCwlcjE5LEwkMDMzOSA7IyAzNTE1IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM1MjAgemVyb19leHRlbmRxaXNpMi8xCi1MJDExNzIKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzUyMiBsc2hyc2kzLzIKLQlhZGRsICVyNiwlcjIxLCVyMjEgOyMgMzUyNSBhZGRzaTMvMQotCWV4dHJ1ICVyMTksMzEsMywlcjE5IDsjIDM1MjkgYW5kc2kzLzEKLQlzdWJpIDMxLCVyMTksJXIxOSA7IyAzNTMwIHN1YnNpMy8yCi0JbGRiIDAoJXIyMSksJXIyMCA7IyAzNTMzIG1vdnFpKzEvNQotCW10c2FyICVyMTkgOyMgODk1MiByZWxvYWRfb3V0c2krMi83Ci0JdmRlcGkgLTEsMSwlcjIwIDsjIDM1MzggdmRlcGlfaW9yCi0Jc3RiICVyMjAsMCglcjIxKSA7IyAzNTQwIG1vdnFpKzEvNgotTCQwMzM5Ci0JbGRvIDEoJXIyMiksJXIyMiA7IyAzNTQ2IGFkZHNpMy8yCi0JY29tYiw+PSxuICVyMjYsJXIyMixMJDExNzMgOyMgMzIzMyBibGV1KzEKLQlsZHcgLTI0NCglcjMwKSwlcjEgOyMgODkxNiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwMjc1LCVyMCA7IyAzNTU5IGp1bXAKLQlsZGkgMSwlcjEzIDsjIDM1NTYgcmVsb2FkX291dHNpKzIvMgotTCQwMzI4Ci0JbGRpIDI1NSwlcjE5IDsjIDgwNjkgcmVsb2FkX291dHNpKzIvMgotTCQxMTY4Ci0JY29tYiw9ICVyMTksJXIzLEwkMDM1OSA7IyA4MDcwIGJsZXUrMQotCWNvcHkgJXIxOSwlcjIxIDsjIDg1OTUgcmVsb2FkX291dHNpKzIvMQotTCQwMzYwCi0JbGRvIC0xKCVyMyksJXIyMCA7IyAzNTcxIGFkZHNpMy8yCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAzNTgzIHJlbG9hZF9vdXRzaSsyLzUKLQlleHRydSAlcjIwLDMxLDgsJXIzIDsjIDM1NzIgemVyb19leHRlbmRxaXNpMi8xCi0JbGRvIC0xKCVyMTkpLCVyMTkgOyMgMzU4NCBhZGRzaTMvMgotCWNvbWIsPD4gJXIyMSwlcjMsTCQwMzYwIDsjIDM1NzcgYmxldSsxCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAzNTg4IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDM1OQotCWxkYiAxMSglcjYpLCVyMTkgOyMgMzU5OSBtb3ZxaSsxLzUKLQlkZXBpIC0xLDI4LDEsJXIxOSA7IyAzNjAxIGlvcnNpMysxLzIKLQlzdGIgJXIxOSwxMSglcjYpIDsjIDM2MDMgbW92cWkrMS82Ci0JbGRiIDcoJXI2KSwlcjE5IDsjIDM2MDYgbW92cWkrMS81Ci0JbGRpIDAsJXIxMyA7IyAzNjEzIHJlbG9hZF9vdXRzaSsyLzIKLQlkZXBpIC0xLDI5LDEsJXIxOSA7IyAzNjA4IGlvcnNpMysxLzIKLQlibCBMJDAyNzUsJXIwIDsjIDM2MTgganVtcAotCXN0YiAlcjE5LDcoJXI2KSA7IyAzNjEwIG1vdnFpKzEvNgotTCQwMzA5Ci0JbGRpIDAsJXIxMyA7IyAzNjI0IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE2NgotCWV4dHJ1ICVyNywyMSs4LTEsOCwlcjE5IDsjIDM2MjcgZXh0enYKLQlhZGRsICVyNiwlcjE5LCVyMTkgOyMgMzYzMCBhZGRzaTMvMQotCWV4dHJ1ICVyNywzMSwzLCVyMjAgOyMgMzYzMyBhbmRzaTMvMQotTCQwOTQ4Ci0Jc3ViaSAzMSwlcjIwLCVyMjAgOyMgMzYzNCBzdWJzaTMvMgotCWxkYiAwKCVyMTkpLCVyMjEgOyMgMzYzNyBtb3ZxaSsxLzUKLQltdHNhciAlcjIwIDsjIDg5NTUgcmVsb2FkX291dHNpKzIvNwotCXZkZXBpIC0xLDEsJXIyMSA7IyAzNjQyIHZkZXBpX2lvcgotCWJsIEwkMDI3NSwlcjAgOyMgMzY1MyBqdW1wCi0Jc3RiICVyMjEsMCglcjE5KSA7IyAzNjQ0IG1vdnFpKzEvNgotTCQwMjc2Ci0JbGRiIC0xKCVyNiksJXIyMCA7IyA4MDc0IG1vdnFpKzEvNQotCWV4dHJ1ICVyMjAsMzEsOCwlcjE5IDsjIDgwNzUgemVyb19leHRlbmRxaXNpMi8xCi0JY29taWIsPSAwLCVyMTksTCQwMzY0IDsjIDgwNzYgYmxldSsxCi0JYWRkbCAlcjE5LCVyNiwlcjE5IDsjIDgwNzkgYWRkc2kzLzEKLQlsZGIgLTEoJXIxOSksJXIxOSA7IyA4MDgyIHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLDw+IDAsJXIxOSxMJDAzNjQgOyMgODA4MyBibGV1KzEKLQlsZG8gLTEoJXIyMCksJXIxOSA7IyA4MjQyIGFkZHNpMy8yCi0JYmwgTCQxMTgzLCVyMCA7IyA4MjUzIGp1bXAKLQlzdGIgJXIxOSwtMSglcjYpIDsjIDM2ODggbW92cWkrMS82Ci1MJDAzNjUKLQlsZG8gLTEoJXIxOSksJXIxOSA7IyAzNjg2IGFkZHNpMy8yCi0Jc3RiICVyMTksLTEoJXI2KSA7IyAzNjg4IG1vdnFpKzEvNgotTCQxMTgzCi0JZXh0cnUgJXIxOSwzMSw4LCVyMTkgOyMgMzY2MiB6ZXJvX2V4dGVuZHFpc2kyLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzNjQgOyMgMzY2NCBibGV1KzEKLQlhZGRsICVyMTksJXI2LCVyMTkgOyMgMzY2OCBhZGRzaTMvMQotCWxkYiAtMSglcjE5KSwlcjE5IDsjIDM2NzIgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSxuIDAsJXIxOSxMJDAzNjUgOyMgMzY3NCBibGV1KzEKLQlsZGIgLTEoJXI2KSwlcjE5IDsjIDM2ODMgbW92cWkrMS81Ci1MJDAzNjQKLQlsZGIgLTEoJXI2KSwlcjE5IDsjIDM3MDAgemVyb19leHRlbmRxaXNpMi8yCi0JYmwgTCQwMDQzLCVyMCA7IyAzNzA1IGp1bXAKLQlhZGRsICVyNiwlcjE5LCVyNiA7IyAzNzAxIGFkZHNpMy8xCi1MJDAzNjgKLQliYiw+PSxuICVyMTUsMTgsTCQwMDc2IDsjIDM3MTMgbW92c2ktNAotCWJsIEwkMTE4MSwlcjAgOyMgMzcyMSBqdW1wCi0JbGR3IDI0KCVyNSksJXIxOSA7IyAzODYxIHJlbG9hZF9vdXRzaSsyLzUKLUwkMDM3MgotCWJiLD49LG4gJXIxNSwxOCxMJDAwNzYgOyMgMzczMCBtb3ZzaS00Ci0JYmwsbiBMJDAzNzQsJXIwIDsjIDM3MzgganVtcAotTCQwMzc2Ci0JYmIsPj0sbiAlcjE1LDIwLEwkMDA3NiA7IyAzNzQ3IG1vdnNpLTQKLQlibCxuIEwkMDM3OCwlcjAgOyMgMzc1NSBqdW1wCi1MJDAzODAKLQliYiw+PSxuICVyMTUsMTYsTCQwMDc2IDsjIDM3NjQgbW92c2ktNAotCWJsLG4gTCQwMzc4LCVyMCA7IyAzNzcyIGp1bXAKLUwkMDM4MwotCWFuZCAlcjE1LCVyMjAsJXIxOSA7IyAzNzc5IGFuZHNpMy8xCi0JY29tYiw9ICVyMjAsJXIxOSxMJDExNzQgOyMgMzc4MyBibGV1KzEKLQlsZGkgLTEsJXI0IDsjIDUwNzQgcmVsb2FkX291dHNpKzIvMgotCWJsLG4gTCQwMDc2LCVyMCA7IyAzNzkxIGp1bXAKLUwkMDM4NwotCWNvbWIsPSxuICVyMTYsJXIxOSxMJDA5MDMgOyMgMzc5OSBibGV1KzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMzgzMSB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDM4MjYgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDM4MjggcmVsb2FkX291dHNpKzIvNgotCWxkbyAtMzkoJXI3KSwlcjE5IDsjIDc0NDYgYWRkc2kzLzIKLQlhZGRpLHV2IC04NiwlcjE5LCVyMCA7IyA3NDQ3IGNhc2VzaTAKLQlibHIsbiAlcjE5LCVyMAotCWIsbiBMJDAzOTcKLUwkMDgxNwotCWJsIEwkMDc1OSwlcjAgOyMgOTQzNyBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgyMDQgcmVsb2FkX291dHNpKzIvNQotTCQxMDY5Ci0JYmwgTCQwMzk1LCVyMAotCW5vcCA7IyA5NDQwIHN3aXRjaF9qdW1wCi1MJDEwNzAKLQlibCBMJDA0MjIsJXIwCi0Jbm9wIDsjIDk0NDMgc3dpdGNoX2p1bXAKLUwkMTA3MQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ0NiBzd2l0Y2hfanVtcAotTCQxMDcyCi0JYmwgTCQwODExLCVyMAotCW5vcCA7IyA5NDQ5IHN3aXRjaF9qdW1wCi1MJDEwNzMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NTIgc3dpdGNoX2p1bXAKLUwkMTA3NAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ1NSBzd2l0Y2hfanVtcAotTCQxMDc1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDU4IHN3aXRjaF9qdW1wCi1MJDEwNzYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NjEgc3dpdGNoX2p1bXAKLUwkMTA3NwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ2NCBzd2l0Y2hfanVtcAotTCQxMDc4Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDY3IHN3aXRjaF9qdW1wCi1MJDEwNzkKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0NzAgc3dpdGNoX2p1bXAKLUwkMTA4MAotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ3MyBzd2l0Y2hfanVtcAotTCQxMDgxCi0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDc2IHN3aXRjaF9qdW1wCi1MJDEwODIKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0Nzkgc3dpdGNoX2p1bXAKLUwkMTA4MwotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ4MiBzd2l0Y2hfanVtcAotTCQxMDg0Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDg1IHN3aXRjaF9qdW1wCi1MJDEwODUKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0ODggc3dpdGNoX2p1bXAKLUwkMTA4NgotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ5MSBzd2l0Y2hfanVtcAotTCQxMDg3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDk0IHN3aXRjaF9qdW1wCi1MJDEwODgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0OTcgc3dpdGNoX2p1bXAKLUwkMTA4OQotCWJsIEwkMDY1OSwlcjAgOyMgOTUwMCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxNjQgcmVsb2FkX291dHNpKzIvNQotTCQxMDkwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTAzIHN3aXRjaF9qdW1wCi1MJDEwOTEKLQlibCBMJDA2NzksJXIwIDsjIDk1MDYgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTcyIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA5MgotCWJsIEwkMDgxMSwlcjAKLQlub3AgOyMgOTUwOSBzd2l0Y2hfanVtcAotTCQxMDkzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTEyIHN3aXRjaF9qdW1wCi1MJDEwOTQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MTUgc3dpdGNoX2p1bXAKLUwkMTA5NQotCWJsIEwkMDcxOSwlcjAgOyMgOTUxOCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxODggcmVsb2FkX291dHNpKzIvNQotTCQxMDk2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTIxIHN3aXRjaF9qdW1wCi1MJDEwOTcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MjQgc3dpdGNoX2p1bXAKLUwkMTA5OAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUyNyBzd2l0Y2hfanVtcAotTCQxMDk5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTMwIHN3aXRjaF9qdW1wCi1MJDExMDAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MzMgc3dpdGNoX2p1bXAKLUwkMTEwMQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUzNiBzd2l0Y2hfanVtcAotTCQxMTAyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTM5IHN3aXRjaF9qdW1wCi1MJDExMDMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NDIgc3dpdGNoX2p1bXAKLUwkMTEwNAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU0NSBzd2l0Y2hfanVtcAotTCQxMTA1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTQ4IHN3aXRjaF9qdW1wCi1MJDExMDYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NTEgc3dpdGNoX2p1bXAKLUwkMTEwNwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU1NCBzd2l0Y2hfanVtcAotTCQxMTA4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTU3IHN3aXRjaF9qdW1wCi1MJDExMDkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NjAgc3dpdGNoX2p1bXAKLUwkMTExMAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU2MyBzd2l0Y2hfanVtcAotTCQxMTExCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTY2IHN3aXRjaF9qdW1wCi1MJDExMTIKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1Njkgc3dpdGNoX2p1bXAKLUwkMTExMwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU3MiBzd2l0Y2hfanVtcAotTCQxMTE0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTc1IHN3aXRjaF9qdW1wCi1MJDExMTUKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1Nzggc3dpdGNoX2p1bXAKLUwkMTExNgotCWJsIEwkMDYzOSwlcjAgOyMgOTU4MSBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxNTYgcmVsb2FkX291dHNpKzIvNQotTCQxMTE3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTg0IHN3aXRjaF9qdW1wCi1MJDExMTgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1ODcgc3dpdGNoX2p1bXAKLUwkMTExOQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU5MCBzd2l0Y2hfanVtcAotTCQxMTIwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTkzIHN3aXRjaF9qdW1wCi1MJDExMjEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1OTYgc3dpdGNoX2p1bXAKLUwkMTEyMgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU5OSBzd2l0Y2hfanVtcAotTCQxMTIzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjAyIHN3aXRjaF9qdW1wCi1MJDExMjQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MDUgc3dpdGNoX2p1bXAKLUwkMTEyNQotCWJsIEwkMDczOSwlcjAgOyMgOTYwOCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxOTYgcmVsb2FkX291dHNpKzIvNQotTCQxMTI2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjExIHN3aXRjaF9qdW1wCi1MJDExMjcKLQlibCBMJDA2OTksJXIwIDsjIDk2MTQgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTgwIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTEyOAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYxNyBzd2l0Y2hfanVtcAotTCQxMTI5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjIwIHN3aXRjaF9qdW1wCi1MJDExMzAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MjMgc3dpdGNoX2p1bXAKLUwkMTEzMQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYyNiBzd2l0Y2hfanVtcAotTCQxMTMyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjI5IHN3aXRjaF9qdW1wCi1MJDExMzMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MzIgc3dpdGNoX2p1bXAKLUwkMTEzNAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYzNSBzd2l0Y2hfanVtcAotTCQxMTM1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjM4IHN3aXRjaF9qdW1wCi1MJDExMzYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NDEgc3dpdGNoX2p1bXAKLUwkMTEzNwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY0NCBzd2l0Y2hfanVtcAotTCQxMTM4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjQ3IHN3aXRjaF9qdW1wCi1MJDExMzkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NTAgc3dpdGNoX2p1bXAKLUwkMTE0MAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY1MyBzd2l0Y2hfanVtcAotTCQxMTQxCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjU2IHN3aXRjaF9qdW1wCi1MJDExNDIKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NTkgc3dpdGNoX2p1bXAKLUwkMTE0MwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY2MiBzd2l0Y2hfanVtcAotTCQxMTQ0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjY1IHN3aXRjaF9qdW1wCi1MJDExNDUKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2Njggc3dpdGNoX2p1bXAKLUwkMTE0NgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY3MSBzd2l0Y2hfanVtcAotTCQxMTQ3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5Njc0IHN3aXRjaF9qdW1wCi1MJDExNDgKLQlibCBMJDA2MTksJXIwIDsjIDk2Nzcgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTQ4IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE0OQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY4MCBzd2l0Y2hfanVtcAotTCQxMTUwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjgzIHN3aXRjaF9qdW1wCi1MJDExNTEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2ODYgc3dpdGNoX2p1bXAKLUwkMTE1MgotCWJsIEwkMDUwNiwlcjAKLQlub3AgOyMgOTY4OSBzd2l0Y2hfanVtcAotTCQxMTUzCi0JYmwgTCQwNDcyLCVyMCA7IyA5NjkyIHN3aXRjaF9qdW1wCi0JbGRpbCBMJzMzNzkyLCVyMTkgOyMgNDcyNCBhZGRfaGlnaF9jb25zdCszCi1MJDExNTQKLQlibCxuIEwkMDM5NywlcjAgOyMgNzQ1MCBqdW1wCi1MJDAzOTUKLQliYiw8LG4gJXIxNSwxOCxMJDAzOTcgOyMgMzg1MyBibGV1KzMKLQlsZHcgMjQoJXI1KSwlcjE5IDsjIDM4NjEgcmVsb2FkX291dHNpKzIvNQotTCQxMTgxCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzODYyIGFkZHNpMy8yCi0Jc3R3ICVyMTksMjQoJXI1KSA7IyAzODY2IHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDM4NzEgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTU4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMwOCglcjMwKSwlcjE5IDsjIDM4NzMgcmVsb2FkX291dHNpKzIvNQotCWxkbyAxKCVyMSksJXIxIDsjIDM4NjggYWRkc2kzLzIKLQljb21iLDw+ICVyMTksJXIyMCxMJDAzOTggOyMgMzg3NSBibGV1KzEKLQlzdHcgJXIxLC0yNjAoJXIzMCkgOyMgODk2MSByZWxvYWRfb3V0c2krMi82Ci0JemRlcCAlcjIwLDI4LDI5LCVyMjUgOyMgMzg4NSBhc2hsc2kzKzEKLQlzaDFhZGRsICVyMjAsJXIyNSwlcjI1IDsjIDM4ODYgYXNobHNpMy0yCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzODkwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDM4OTQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQl6ZGVwICVyMjUsMjksMzAsJXIyNSA7IyAzODkyIGFzaGxzaTMrMQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAzOTAzIGJsZXUrMQotCXN0dyAlcjI4LC0zMTIoJXIzMCkgOyMgMzg5OCByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDgoJXIzMCksJXIxOSA7IyAzOTEyIHJlbG9hZF9vdXRzaSsyLzUKLQl6ZGVwICVyMTksMzAsMzEsJXIxOSA7IyAzOTE0IGFzaGxzaTMrMQotCXN0dyAlcjE5LC0zMDgoJXIzMCkgOyMgMzkxNiByZWxvYWRfb3V0c2krMi82Ci1MJDAzOTgKLQlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDM5MjEgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjEgOyMgMzkyMyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDM5MzMgcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIyMCwlcjIwLCVyMjAgOyMgMzkyOCBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMjAsJXIyMSwlcjIxIDsjIDM5MzEgYXNobHNpMy0yCi0Jc3ViICVyMTIsJXIxOSwlcjE5IDsjIDM5MzQgc3Vic2kzLzEKLQlzdHcgJXIxOSwwKCVyMjEpIDsjIDM5MzYgcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgMzkzOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMCA7IyAzOTQxIHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDM5NDYgYXNobHNpMy0yCi0JY29taWIsPSAwLCVyMTAsTCQwNDAwIDsjIDM5NTEgYmxldSsxCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyAzOTQ5IGFzaGxzaTMtMgotCWxkdyAwKCVyNSksJXIxOSA7IyAzOTUzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXIxMCwlcjE5LCVyMTkgOyMgMzk1NCBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzk1NSBhZGRzaTMvMgotCWJsIEwkMDQwMSwlcjAgOyMgMzk1OCBqdW1wCi0Jc3R3ICVyMTksNCglcjIwKSA7IyAzOTU3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQwMAotCXN0dyAlcjAsNCglcjIwKSA7IyAzOTYyIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQwMQotCWxkdyAtMzA0KCVyMzApLCVyMjAgOyMgMzk2NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMSA7IyAzOTY4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjUpLCVyMTkgOyMgMzk3OCByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjIwLCVyMjAsJXIyMCA7IyAzOTczIGFzaGxzaTMtMgotCXNoMmFkZGwgJXIyMCwlcjIxLCVyMjEgOyMgMzk3NiBhc2hsc2kzLTIKLQlzdWIgJXI2LCVyMTksJXIxOSA7IyAzOTc5IHN1YnNpMy8xCi0Jc3R3ICVyMTksMTIoJXIyMSkgOyMgMzk4MSByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDQoJXIzMCksJXIxOSA7IyAzOTg0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDM5ODYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTY0IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDM5OTEgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyAzOTk0IGFzaGxzaTMtMgotCWxkaSAyNTUsJXIxOSA7IyAzOTk5IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw8ICVyMTksJXIxLEwkMDQwMiA7IyA0MDAxIGJsZXUrMQotCXN0dyAlcjEsMTYoJXIyMCkgOyMgMzk5NiByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDQoJXIzMCksJXIyMCA7IyA0MDA1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIxIDsjIDQwMDcgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyNSksJXIxOSA7IyA0MDE3IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMjAsJXIyMCwlcjIwIDsjIDQwMTIgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjIwLCVyMjEsJXIyMSA7IyA0MDE1IGFzaGxzaTMtMgotCXN1YiAlcjYsJXIxOSwlcjE5IDsjIDQwMTggc3Vic2kzLzEKLQlsZG8gMiglcjE5KSwlcjE5IDsjIDQwMTkgYWRkc2kzLzIKLQlzdHcgJXIxOSw4KCVyMjEpIDsjIDQwMjEgcmVsb2FkX291dHNpKzIvNgotCWxkdyAwKCVyNSksJXI0IDsjIDgwODcgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDkwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwODggc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgwODkgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0MDcgOyMgODA5MSBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1OTMgcmVsb2FkX291dHNpKzIvMwotTCQwNDA4Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA0MDQ5IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQwNTkgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNDEzIDsjIDQwNjcgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQwNjEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDQwNzAgcmVsb2FkX291dHNpKzIvNgotTCQwNDEzCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDQwNzcgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDA4MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0MDc5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDA4OSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDA4NSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDQwNiA7IyA0MDk5IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDEwMSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDQxNiA7IyA0MTEwIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0MTA0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNDExMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDExNCBhZGRzaTMvMQotTCQwNDE2Ci0JY29taWIsPSAwLCVyOCxMJDA0MTcgOyMgNDExNyBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDQxMTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDEyMSBhZGRzaTMvMQotTCQwNDE3Ci0JY29taWIsPSAwLCVyOSxMJDA0MDYgOyMgNDEyNCBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDQxMjUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDEyOCBhZGRzaTMvMQotTCQwNDA2Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNDAyOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQwMzMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDAzMCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDAzMSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQwOAotCW5vcCA7IyA0MDM1IGJsZXUrMQotTCQwNDA3Ci0JbGRpIDUsJXIxOSA7IyA0MTUwIG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDE1MSBtb3ZxaSsxLzYKLQlsZGIgLTI1NyglcjMwKSwlcjEgOyMgNDE1NiBtb3ZxaSsxLzUKLQlzdGJzLG1hICVyMSwxKCVyNikgOyMgODk2OCBtb3ZxaSsxLzYKLQlzdGJzLG1hICVyMCwxKCVyNikgOyMgNDE1OSBtb3ZxaSsxLzYKLUwkMDQwMgotCWxkaSAwLCVyMTAgOyMgNDE4MiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDAsJXI4IDsjIDQxODUgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI2LCVyMTIgOyMgNDE4OCByZWxvYWRfb3V0c2krMi8xCi0JbGR3IC0zMDQoJXIzMCksJXIxOSA7IyA0MTc0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGkgMCwlcjkgOyMgNDE5MSByZWxvYWRfb3V0c2krMi8yCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA0MTc1IGFkZHNpMy8yCi0JYmwgTCQwMDQzLCVyMCA7IyA0MTkzIGp1bXAKLQlzdHcgJXIxOSwtMzA0KCVyMzApIDsjIDQxNzkgcmVsb2FkX291dHNpKzIvNgotTCQwNDIyCi0JYmIsPCAlcjE1LDE4LEwkMDM5NyA7IyA0MjAxIGJsZXUrMwotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDIwNyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwMzc0IDsjIDQyMDkgYmxldSsxCi0JYmIsPj0sbiAlcjE1LDE0LEwkMDk1MCA7IyA0MjE1IG1vdnNpLTQKLQlibCxuIEwkMDM5NywlcjAgOyMgNDIzMCBqdW1wCi1MJDAzNzQKLQljb21pYiw9LG4gMCwlcjEwLEwkMDQyNyA7IyA0MjM3IGJsZXUrMQotCWxkdyAwKCVyNSksJXI0IDsjIDgwOTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDk4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwOTYgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwOTcgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0MzIgOyMgODA5OSBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1OTEgcmVsb2FkX291dHNpKzIvMwotTCQwNDMzCi0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA0MjY2IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQyNzYgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNDM4IDsjIDQyODQgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQyNzggcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDQyODcgcmVsb2FkX291dHNpKzIvNgotTCQwNDM4Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDQyOTQgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDI5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0Mjk2IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDMwNiBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDMwMiByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDQzMSA7IyA0MzE2IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDMxOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0MzIxIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNDMyMiBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDQ0MSA7IyA0MzI3IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNDMyNSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQzMjggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQzMzEgYWRkc2kzLzEKLUwkMDQ0MQotCWNvbWliLD0gMCwlcjgsTCQwNDQyIDsjIDQzMzQgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0MzM1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQzMzggYWRkc2kzLzEKLUwkMDQ0MgotCWNvbWliLD0gMCwlcjksTCQwNDMxIDsjIDQzNDEgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0MzQyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQzNDUgYWRkc2kzLzEKLUwkMDQzMQotCWxkdyAwKCVyNSksJXI0IDsjIDQyNDYgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0MjUwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQyNDcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDQyNDggYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0MzMKLQlub3AgOyMgNDI1MiBibGV1KzEKLUwkMDQzMgotCWxkaSAxOSwlcjE5IDsjIDQzNjcgbW92cWkrMS8yCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA0MzY4IG1vdnFpKzEvNgotCXVhZGRjbSAlcjYsJXIxMCwlcjI0IDsjIDQzODEgYWRkZGkzKzEKLQlsZGkgMTMsJXIyNiA7IyA0Mzg0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTAsJXIyNSA7IyA0Mzg2IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgNDM5MCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDQzODggYWRkc2kzLzIKLUwkMDQyNwotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDM5NSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwNDQ3IDsjIDQzOTcgYmxldSsxCi0JYmIsPCxuICVyMTUsMTQsTCQwMDc2IDsjIDQ0MDMgYmxldSszCi1MJDA5NTAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDQ0MTQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDQ0MTIgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNDQxOCBqdW1wCi0JbGRpIDE2LCVyMjggOyMgNDQxNiByZWxvYWRfb3V0c2krMi8yCi1MJDA0NDcKLQlsZG8gLTEoJXIxOSksJXIxOSA7IyA0NDI3IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTMwNCglcjMwKSA7IyA0NDMxIHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDQ0MzYgcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIxOSwlcjE5LCVyMTkgOyMgNDQ0MSBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMTksJXIyMCwlcjIwIDsjIDQ0NDQgYXNobHNpMy0yCi0JbGR3IDAoJXI1KSwlcjIxIDsjIDQ0NDYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyMjApLCVyMTkgOyMgNDQ0OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXIyMCksJXIyMCA7IyA0NDY0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyMCxMJDA0NTAgOyMgNDQ2NiBibGV1KzEKLQlhZGRsICVyMjEsJXIxOSwlcjEyIDsjIDQ0NDkgYWRkc2kzLzEKLQlhZGRsICVyMjEsJXIyMCwlcjE5IDsjIDQ0ODMgYWRkc2kzLzEKLQlibCBMJDA0NTEsJXIwIDsjIDQ0ODUganVtcAotCWxkbyAtMSglcjE5KSwlcjEwIDsjIDQ0ODQgYWRkc2kzLzIKLUwkMDQ1MAotCWxkaSAwLCVyMTAgOyMgNDQ4OSByZWxvYWRfb3V0c2krMi8yCi1MJDA0NTEKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQ0OTMgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjAgOyMgNDQ5NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjIxIDsjIDQ1MDUgcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIxOSwlcjE5LCVyMTkgOyMgNDUwMCBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMTksJXIyMCwlcjIwIDsjIDQ1MDMgYXNobHNpMy0yCi0JbGR3IDEyKCVyMjApLCVyMTkgOyMgNDUwNyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDE2KCVyMjApLCVyNyA7IyA0NTIzIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMjEsJXIxOSwlcjggOyMgNDUwOCBhZGRzaTMvMQotCWxkaSAyNTUsJXIxOSA7IyA0NTI5IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw8ICVyMTksJXI3LEwkMDA0MyA7IyA0NTMxIGJsZXUrMQotCWxkaSAwLCVyOSA7IyA0NTI2IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgOCglcjIwKSwlcjE5IDsjIDQ1NTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTcxIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMjEsJXIxOSwlcjE5IDsjIDQ1NTEgYWRkc2kzLzEKLQlzdWIgJXIxLCVyNywlcjIwIDsjIDQ1NTcgc3Vic2kzLzEKLQlzdGIgJXIyMCwwKCVyMTkpIDsjIDQ1NTkgbW92cWkrMS82Ci0JbGR3IDAoJXI1KSwlcjQgOyMgODEwMyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxMDYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODEwNCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgODEwNSBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDQ1NyA7IyA4MTA3IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU4OSByZWxvYWRfb3V0c2krMi8zCi1MJDA0NTgKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDQ1ODcgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNDU5NyBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA0NjMgOyMgNDYwNSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNDU5OSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNDYwOCByZWxvYWRfb3V0c2krMi82Ci1MJDA0NjMKLQlsZHcgMCglcjUpLCVyMjYgOyMgNDYxNSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA0NjE5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDQ2MTcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA0NjI3IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA0NjIzIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNDU2IDsjIDQ2MzcgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA0NjM5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQ2NDIgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA0NjQzIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNDY2IDsjIDQ2NDggYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0NjQ2IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNDY0OSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDY1MiBhZGRzaTMvMQotTCQwNDY2Ci0JY29taWIsPSAwLCVyOCxMJDA0NjcgOyMgNDY1NSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDQ2NTYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDY1OSBhZGRzaTMvMQotTCQwNDY3Ci0JY29taWIsPSAwLCVyOSxMJDA0NTYgOyMgNDY2MiBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDQ2NjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDY2NiBhZGRzaTMvMQotTCQwNDU2Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNDU2NyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQ1NzEgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDU2OCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDU2OSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQ1OAotCW5vcCA7IyA0NTczIGJsZXUrMQotTCQwNDU3Ci0JbGRpIDYsJXIxOSA7IyA0Njg4IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDY4OSBtb3ZxaSsxLzYKLQlzdGJzLG1hICVyNywxKCVyNikgOyMgNDY5NCBtb3ZxaSsxLzYKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk3NCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyMSwlcjcsJXIxOSA7IyA0NzAwIHN1YnNpMy8xCi0JYmwgTCQwMDQzLCVyMCA7IyA0NzIwIGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQ3MDIgbW92cWkrMS82Ci1MJDA0NzIKLQlsZG8gUiczMzc5MiglcjE5KSwlcjE5IDsjIDQ3MjUgbW92aGktMgotCWFuZCAlcjE1LCVyMTksJXIxOSA7IyA0NzI2IGFuZHNpMy8xCi0JY29taWIsPD4sbiAwLCVyMTksTCQwMzk3IDsjIDQ3MjggYmxldSsxCi1MJDAzNzgKLQliYiw8LG4gJXIxNSwyMSxMJDAwNzYgOyMgNDczOSBibGV1KzMKLQlsZHcgMCglcjUpLCVyMyA7IyA4MTExIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODExNCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MTEyIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MTEzIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDc2IDsjIDgxMTUgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NTg3IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQ3NwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgNDc2OCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0Nzc4IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDQ4MiA7IyA0Nzg2IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0NzgwIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA0Nzg5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQ4MgotCWxkdyAwKCVyNSksJXIyNiA7IyA0Nzk2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQ4MDAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDc5OCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQ4MDggYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQ4MDQgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA0NzUgOyMgNDgxOCBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDQ4MjAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDgyMyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDQ4MjQgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA0ODUgOyMgNDgyOSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQ4MjcgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyA0ODMwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0ODMzIGFkZHNpMy8xCi1MJDA0ODUKLQljb21pYiw9IDAsJXI4LEwkMDQ4NiA7IyA0ODM2IGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgNDgzNyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA0ODQwIGFkZHNpMy8xCi1MJDA0ODYKLQljb21pYiw9IDAsJXI5LEwkMDQ3NSA7IyA0ODQzIGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgNDg0NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA0ODQ3IGFkZHNpMy8xCi1MJDA0NzUKLQlsZHcgMCglcjUpLCVyMyA7IyA0NzQ4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNDc1MiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA0NzQ5IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA0NzUwIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNDc3Ci0Jbm9wIDsjIDQ3NTQgYmxldSsxCi1MJDA0NzYKLQlsZGkgMTQsJXIyNiA7IyA0ODczIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTIsJXIyNSA7IyA0ODc1IHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyMjUsJXIyNCA7IyA0ODcwIHN1YnNpMy8xCi0JbGRvIDMoJXIyNCksJXIyNCA7IyA0ODc3IGFkZHNpMy8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyA0ODgxIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyA0ODc5IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjkgOyMgNDg4NCByZWxvYWRfb3V0c2krMi8yCi0JY29taWIsPSAwLCVyMTAsTCQwNDkwIDsjIDQ4ODkgYmxldSsxCi0JbGRvIDMoJXI2KSwlcjYgOyMgNDg4NiBhZGRzaTMvMgotCWxkaSAxMywlcjI2IDsjIDQ4OTQgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXIxMCwlcjI1IDsjIDQ4OTYgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXIyNSwlcjI0IDsjIDQ4OTEgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgNDkwMCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDQ4OTggYWRkc2kzLzIKLUwkMDQ5MAotCWxkdyAwKCVyNSksJXIzIDsjIDgxMTkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTIyIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgxMjAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgxMjEgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwNDkyIDsjIDgxMjMgYmxldSsxCi0JY29weSAlcjYsJXIxMCA7IyA0OTA0IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg1ODUgcmVsb2FkX291dHNpKzIvMwotTCQwNDkzCi0JY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyA0OTI5IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQ5MzkgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwNDk4IDsjIDQ5NDcgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQ5NDEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDQ5NTAgcmVsb2FkX291dHNpKzIvNgotTCQwNDk4Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDQ5NTcgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDk2MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0OTU5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDk2OSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDk2NSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXIzLEwkMDQ5MSA7IyA0OTc5IGJsZXUrMQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDk4MSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDUwMSA7IyA0OTkwIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0OTg0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgNDk5MSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDk5NCBhZGRzaTMvMQotTCQwNTAxCi0JY29taWIsPSAwLCVyOCxMJDA1MDIgOyMgNDk5NyBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDQ5OTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNTAwMSBhZGRzaTMvMQotTCQwNTAyCi0JY29taWIsPSAwLCVyOSxMJDA0OTEgOyMgNTAwNCBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDUwMDUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNTAwOCBhZGRzaTMvMQotTCQwNDkxCi0JbGR3IDAoJXI1KSwlcjMgOyMgNDkwOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQ5MTMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDkxMCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDkxMSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQ5MwotCW5vcCA7IyA0OTE1IGJsZXUrMQotTCQwNDkyCi0JbGRvIDMoJXI2KSwlcjYgOyMgNTAzMCBhZGRzaTMvMgotCWxkaSAwLCVyOCA7IyA1MDMzIHJlbG9hZF9vdXRzaSsyLzIKLQlibCBMJDAwNDMsJXIwIDsjIDUwMzgganVtcAotCWNvcHkgJXI2LCVyMTIgOyMgNTAzNiByZWxvYWRfb3V0c2krMi8xCi1MJDA1MDYKLQliYiw+PSAlcjE1LDIyLEwkMDM5NyA7IyA1MDQ2IG1vdnNpLTQKLQlsZGkgNDYwOCwlcjIwIDsjIDUwNDggcmVsb2FkX291dHNpKzIvMgotCWFuZCAlcjE1LCVyMjAsJXIxOSA7IyA1MDQ5IGFuZHNpMy8xCi0JY29tYiw9ICVyMjAsJXIxOSxMJDAzOTcgOyMgNTA1MyBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUwNTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4OTc3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZG8gLTIoJXIyMCksJXIxOSA7IyA1MDU2IGFkZHNpMy8yCi0JY29tYiw8PiAlcjEsJXIxOSxMJDExNzUgOyMgNTA1OCBibGV1KzEKLQlsZGkgLTEsJXI0IDsjIDUwNzQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSxuICVyMTYsJXIyMCxMJDAzOTcgOyMgNTA2MiBibGV1KzEKLUwkMTE3NAotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTA3OSByZWxvYWRfb3V0c2krMi81Ci1MJDExNzUKLQljb3B5ICVyNCwlcjExIDsjIDUwNzYgcmVsb2FkX291dHNpKzIvMQotCWNvbWIsPD4gJXIxNiwlcjIwLEwkMDUxNyA7IyA1MDg1IGJsZXUrMQotCWxkbyAtMSglcjIwKSwlcjIzIDsjIDUwODAgYWRkc2kzLzIKLQliYiw+PSxuICVyMTUsMTksTCQwOTE1IDsjIDUwOTIgbW92c2ktNAotCWJsIEwkMTE4MiwlcjAgOyMgNTEwNyBqdW1wCi0Jc3R3ICVyMjMsLTI5NiglcjMwKSA7IyA1OTY4IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDUxNwotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTEzNCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTEzNiByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTE1IDsjIDUxNDMgYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDUxMzkgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUxNDQgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTE0NyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDUxNQotCWFkZGlsIExSJ19fY3R5cGUtJGdsb2JhbCQsJXIyNyA7IyA4MjU3IHBpYzJfbG9fc3VtKzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjEpLCVyMjEgOyMgODI1OSByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDgyNjAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDgyNjEgbW92cWkrMS81Ci0JYmIsPj0gJXIxOSwyOSxMJDA1MTMgOyMgODI2NSBtb3ZzaS00Ci0JbGRpIDQsJXIyMCA7IyA4MjYzIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMjAsJXIyMiA7IyA4NTgzIHJlbG9hZF9vdXRzaSsyLzEKLUwkMDUyMgotCWNvbWljbHIsPCAtMSwlcjExLCVyMCA7IyA4MTI4IG1vdnNpY2MrMS8xCi0JbGRpIDAsJXIxMQotCXNoMmFkZGwgJXIxMSwlcjExLCVyMTkgOyMgNTE4OCBhc2hsc2kzLTIKLQlzaDFhZGRsICVyMTksJXI3LCVyMTkgOyMgNTE5MSBhc2hsc2kzLTIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUxOTQgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwNTEzIDsjIDUxOTYgYmxldSsxCi0JbGRvIC00OCglcjE5KSwlcjExIDsjIDUxOTIgYWRkc2kzLzIKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDUyMTUgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUyMTcgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDUyMCA7IyA1MjI0IGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1MjIwIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1MjI1IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDUyMjggemVyb19leHRlbmRxaXNpMi8yCi1MJDA1MjAKLQlhZGRsICVyMjEsJXI3LCVyMTkgOyMgNTE2NiBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgNTE2OCBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjIyLCVyMTkgOyMgNTE3MiBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDA1MjIKLQlub3AgOyMgNTE3NCBibGV1KzEKLUwkMDUxMwotCWxkaSA0NCwlcjE5IDsjIDUyNTIgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxOSwlcjcsTCQwNTMyIDsjIDUyNTQgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MjU5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIwLEwkMDUzMyA7IyA1MjYxIGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTI3OCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTI4MCByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTM1IDsjIDUyODcgYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDUyODMgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUyODggYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTI5MSB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDUzNQotCWFkZGlsIExSJ19fY3R5cGUtJGdsb2JhbCQsJXIyNyA7IyA4MjY5IHBpYzJfbG9fc3VtKzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjEpLCVyMjEgOyMgODI3MSByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDgyNzIgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDgyNzMgbW92cWkrMS81Ci0JYmIsPj0gJXIxOSwyOSxMJDA1MzMgOyMgODI3NyBtb3ZzaS00Ci0JbGRpIDQsJXIyMCA7IyA4Mjc1IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMjAsJXIyMiA7IyA4NTc4IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDU0MgotCWNvbWljbHIsPCAtMSwlcjQsJXIwIDsjIDgxMzIgbW92c2ljYysxLzEKLQlsZGkgMCwlcjQKLQlzaDJhZGRsICVyNCwlcjQsJXIxOSA7IyA1MzMyIGFzaGxzaTMtMgotCXNoMWFkZGwgJXIxOSwlcjcsJXIxOSA7IyA1MzM1IGFzaGxzaTMtMgotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTMzOCByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA1MzMgOyMgNTM0MCBibGV1KzEKLQlsZG8gLTQ4KCVyMTkpLCVyNCA7IyA1MzM2IGFkZHNpMy8yCi0JbGRvIDEoJXIyMCksJXIxOSA7IyA1MzU5IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyA1MzYxIHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw9IDAsJXIxNCxMJDA1NDAgOyMgNTM2OCBibGV1KzEKLQlsZGIgMCglcjIwKSwlcjcgOyMgNTM2NCB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTM2OSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyA1MzcyIHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwNTQwCi0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDUzMTAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDUzMTIgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyMiwlcjE5IDsjIDUzMTYgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQwNTQyCi0Jbm9wIDsjIDUzMTggYmxldSsxCi1MJDA1MzMKLQljb21pY2xyLDwgLTEsJXI0LCVyMCA7IyA4MTM2IGJlcS0xLzQKLQl6ZGVwaSAtMSwzMSwxNSwlcjQKLQlibCxuIEwkMDU1MywlcjAgOyMgNTQwMSBqdW1wCi1MJDA1MzIKLQljb3B5ICVyMTEsJXI0IDsjIDU0MDYgcmVsb2FkX291dHNpKzIvMQotTCQwNTUzCi0JY29taWIsPiAwLCVyMTEsTCQwOTUxIDsjIDU0MTAgYmxldSsxCi0JemRlcGkgLTEsMzEsMTUsJXIxOSA7IyA1NDEyIHJlbG9hZF9vdXRzaSsyLzQKLQljb21iLDwsbiAlcjE5LCVyNCxMJDA5NTEgOyMgNTQxNCBibGV1KzEKLQljb21iLDwsbiAlcjQsJXIxMSxMJDA5NTEgOyMgNTQxNiBibGV1KzEKLQliYiw8ICVyMTUsMTksTCQxMTc2IDsjIDU0NTEgYmxldSszCi0JbGRpIDEyNSwlcjE5IDsjIDU1MTQgcmVsb2FkX291dHNpKzIvMgotCWxkaSA5MiwlcjE5IDsjIDU0NTUgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxOSwlcjcsTCQwOTE1IDsjIDU0NTcgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1NDczIHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIwLEwkMDkyMiA7IyA1NDc1IGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTQ4NCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTQ4NiByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTU4IDsjIDU0OTMgYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDU0ODkgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDU0OTQgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTQ5NyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDU1OAotCWxkaSAxMjUsJXIxOSA7IyA1NTE0IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE3NgotCWNvbWIsPSxuICVyMTksJXI3LEwkMDU2NiA7IyA1NTE2IGJsZXUrMQotTCQwOTUxCi0JYmIsPCxuICVyMTUsMTksTCQwNTExIDsjIDU1MjMgYmxldSszCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA1NTM0IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA1NTMyIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDU1MzgganVtcAotCWxkaSAxMCwlcjI4IDsjIDU1MzYgcmVsb2FkX291dHNpKzIvMgotTCQwNTY2Ci0JY29taWIsPD4sbiAwLCVyOCxMJDA1NjkgOyMgNTU0NSBibGV1KzEKLQliYiw8LG4gJXIxNSwyNixMJDA5MTcgOyMgNTU1MiBibGV1KzMKLQliYiw+PSxuICVyMTUsMjcsTCQwNTExIDsjIDU1NzEgbW92c2ktNAotCWNvcHkgJXI2LCVyOCA7IyA1NTc0IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDU2OQotCWNvbWliLDw+IDAsJXI0LEwkMDU3NCA7IyA1NTg3IGJsZXUrMQotCWxkaSAxMCwlcjEzIDsjIDg5ODAgcmVsb2FkX291dHNpKzIvMgotCWxkdyAwKCVyNSksJXIzIDsjIDgxMzkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTQyIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgxNDAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgxNDEgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA1NzYgOyMgODE0MyBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg1NzMgcmVsb2FkX291dHNpKzIvMwotTCQwNTc3Ci0JY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyA1NjEzIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDU2MjMgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwNTgyIDsjIDU2MzEgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDU2MjUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDU2MzQgcmVsb2FkX291dHNpKzIvNgotTCQwNTgyCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDU2NDEgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNTY0NSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA1NjQzIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNTY1MyBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNTY0OSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXIzLEwkMDU3NSA7IyA1NjYzIGJsZXUrMQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNTY2NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA1NjY4IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXIzLCVyMTkgOyMgNTY2OSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDU4NSA7IyA1Njc0IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNTY3MiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyMywlcjE5IDsjIDU2NzUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDU2NzggYWRkc2kzLzEKLUwkMDU4NQotCWNvbWliLD0gMCwlcjgsTCQwNTg2IDsjIDU2ODEgYmxldSsxCi0Jc3ViICVyOCwlcjMsJXIxOSA7IyA1NjgyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDU2ODUgYWRkc2kzLzEKLUwkMDU4NgotCWNvbWliLD0gMCwlcjksTCQwNTc1IDsjIDU2ODggYmxldSsxCi0Jc3ViICVyOSwlcjMsJXIxOSA7IyA1Njg5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDU2OTIgYWRkc2kzLzEKLUwkMDU3NQotCWxkdyAwKCVyNSksJXIzIDsjIDU1OTMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA1NTk3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDU1OTQgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDU1OTUgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA1NzcKLQlub3AgOyMgNTU5OSBibGV1KzEKLUwkMDU3NgotCWxkaSAxMiwlcjI2IDsjIDU3MTggcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTcyMCByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjgsJXIyNCA7IyA1NzIyIHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyA1NzI2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyA1NzI0IHJlbG9hZF9vdXRzaSsyLzEKLQlibCBMJDA1OTAsJXIwIDsjIDU3MzAganVtcAotCWxkbyAzKCVyNiksJXI2IDsjIDU3MjggYWRkc2kzLzIKLUwkMDU3NAotCWNvbWljbHIsPiAyLCVyNCwlcjAgOyMgODI4MiBiZXEtMS8yCi0JbGRpIDIwLCVyMTMKLQlsZHcgMCglcjUpLCVyMyA7IyA4Mjg1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODI4OCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4Mjg2IHN1YnNpMy8xCi0JYWRkbCAlcjE5LCVyMTMsJXIxOSA7IyA4Mjg3IGFkZHNpMy8xCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwODY4IDsjIDgyODkgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNyA7IyA4NTcxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDU5NQotCWNvbWIsPSAlcjcsJXIyMCxMJDA5NDQgOyMgNTc2OSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA1Nzc5IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNywlcjE5LEwkMDYwMCA7IyA1Nzg3IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA1NzgxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI3LDQoJXI1KSA7IyA1NzkwIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDYwMAotCWxkdyAwKCVyNSksJXIyNiA7IyA1Nzk3IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDU4MDEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNTc5OSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDU4MDkgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDU4MDUgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA1OTMgOyMgNTgxOSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDU4MjEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNTgyNCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDU4MjUgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2MDMgOyMgNTgzMCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDU4MjggYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyA1ODMxIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA1ODM0IGFkZHNpMy8xCi1MJDA2MDMKLQljb21pYiw9IDAsJXI4LEwkMDYwNCA7IyA1ODM3IGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgNTgzOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA1ODQxIGFkZHNpMy8xCi1MJDA2MDQKLQljb21pYiw9IDAsJXI5LEwkMDU5MyA7IyA1ODQ0IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgNTg0NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA1ODQ4IGFkZHNpMy8xCi1MJDA1OTMKLQlsZHcgMCglcjUpLCVyMyA7IyA1NzQ5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNTc1MyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA1NzUwIHN1YnNpMy8xCi0JYWRkbCAlcjE5LCVyMTMsJXIxOSA7IyA1NzUxIGFkZHNpMy8xCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNTk1Ci0Jbm9wIDsjIDU3NTUgYmxldSsxCi1MJDA4NjgKLQljb21pYiw+PSAxLCVyNCxMJDA2MDggOyMgNTg3MiBibGV1KzEKLQlsZG8gNSglcjYpLCVyMTkgOyMgNTg3MCBhZGRzaTMvMgotCXN1YiAlcjE5LCVyOCwlcjE5IDsjIDU4NzQgc3Vic2kzLzEKLQlibCBMJDA2MDksJXIwIDsjIDU4NzYganVtcAotCWxkbyAyKCVyMTkpLCVyMjQgOyMgNTg3NSBhZGRzaTMvMgotTCQwNjA4Ci0Jc3ViICVyMTksJXI4LCVyMTkgOyMgNTg3OSBzdWJzaTMvMQotCWxkbyAtMyglcjE5KSwlcjI0IDsjIDU4ODAgYWRkc2kzLzIKLUwkMDYwOQotCWxkaSAyMCwlcjI2IDsjIDU4ODUgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTg4NyByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjExLCVyMjMgOyMgNTg5MSByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AyLCVyMiA7IyA1ODkzIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgNTg4MyByZWxvYWRfb3V0c2krMi82Ci0JbGRvIDUoJXI2KSwlcjYgOyMgNTg5NSBhZGRzaTMvMgotCWxkaSAyMiwlcjI2IDsjIDU5MDAgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTkwMiByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDUsJXIyNCA7IyA1OTA0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTEsJXIyMyA7IyA1OTA2IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluc2VydF9vcDIsJXIyIDsjIDU5MDggY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXI2LC01MiglcjMwKSA7IyA1ODk4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw+PSAxLCVyNCxMJDA1OTAgOyMgNTkxMyBibGV1KzEKLQlsZG8gNSglcjYpLCVyNiA7IyA1OTEwIGFkZHNpMy8yCi0JbGRpIDIxLCVyMjYgOyMgNTkyMSByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjYsJXIyNSA7IyA1OTIzIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI4LCVyNiwlcjI0IDsjIDU5MTcgc3Vic2kzLzEKLQlsZG8gMiglcjI0KSwlcjI0IDsjIDU5MjUgYWRkc2kzLzIKLQlsZG8gLTEoJXI0KSwlcjQgOyMgNTkxOSBhZGRzaTMvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgc3RvcmVfb3AyLCVyMiA7IyA1OTI5IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjQsJXIyMyA7IyA1OTI3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gNSglcjYpLCVyNiA7IyA1OTMxIGFkZHNpMy8yCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgNTkzNiByZWxvYWRfb3V0c2krMi82Ci0JbGRpIDIyLCVyMjYgOyMgNTkzOCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjgsJXIyNSA7IyA1OTQwIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyOCwlcjI0IDsjIDU5NDIgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluc2VydF9vcDIsJXIyIDsjIDU5NDYgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyNCwlcjIzIDsjIDU5NDQgcmVsb2FkX291dHNpKzIvMQotCWxkbyA1KCVyNiksJXI2IDsjIDU5NDggYWRkc2kzLzIKLUwkMDU5MAotCWJsIEwkMDA0MywlcjAgOyMgNTk2MyBqdW1wCi0JbGRpIDAsJXI5IDsjIDU5NTYgcmVsb2FkX291dHNpKzIvMgotTCQwNTExCi0Jc3R3ICVyMjMsLTI5NiglcjMwKSA7IyA1OTY4IHJlbG9hZF9vdXRzaSsyLzYKLUwkMTE4MgotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTk3NyByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgNTk3OSBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjIxIDsjIDU5ODggYWRkc2kzLzIKLQlsZGIgMCglcjIwKSwlcjIwIDsjIDU5OTIgbW92cWkrMS81Ci0Jc3R3ICVyMjEsLTI5NiglcjMwKSA7IyA1OTkwIHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw9IDAsJXIxNCxMJDA2MTIgOyMgNTk5NyBibGV1KzEKLQlleHRydSAlcjIwLDMxLDgsJXI3IDsjIDU5OTMgemVyb19leHRlbmRxaXNpMi8xCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDU5OTggYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNjAwMSB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDYxMgotCWJiLDwgJXIxNSwxOSxMJDAwNzYgOyMgNjAxOSBibGV1KzMKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODk4MyByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw+Pj0gJXIxLCVyMjEsTCQwMDc2IDsjIDYwMjUgYmxldSsxCi0JZXh0cnMgJXIyMCwzMSw4LCVyMjAgOyMgNjAzMCBleHRlbmRxaXNpMgotCWxkaSA5MiwlcjE5IDsjIDYwMzIgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSxuICVyMTksJXIyMCxMJDAzOTcgOyMgNjAzNCBibGV1KzEKLQlibCxuIEwkMDA3NiwlcjAgOyMgNjA0MiBqdW1wCi1MJDA2MTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE1MSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTQ5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTUwIGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDYyNCA7IyA4MTUyIGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyA2MDQ3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjkgcmVsb2FkX291dHNpKzIvMwotTCQwNjI1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2MDc1IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDYwODUgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNjMwIDsjIDYwOTMgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDYwODcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDYwOTYgcmVsb2FkX291dHNpKzIvNgotTCQwNjMwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDYxMDMgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjEwNyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2MTA1IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjExNSBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDYxMTEgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA2MjMgOyMgNjEyNSBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDYxMjcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjEzMCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDYxMzEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2MzMgOyMgNjEzNiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDYxMzQgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2MTM3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2MTQwIGFkZHNpMy8xCi1MJDA2MzMKLQljb21pYiw9IDAsJXI4LEwkMDYzNCA7IyA2MTQzIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjE0NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2MTQ3IGFkZHNpMy8xCi1MJDA2MzQKLQljb21pYiw9IDAsJXI5LEwkMDYyMyA7IyA2MTUwIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjE1MSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2MTU0IGFkZHNpMy8xCi1MJDA2MjMKLQlsZHcgMCglcjUpLCVyNCA7IyA2MDU1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjA1OSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2MDU2IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2MDU3IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNjI1Ci0Jbm9wIDsjIDYwNjEgYmxldSsxCi1MJDA2MjQKLQlsZGkgMjMsJXIxOSA7IyA2MTc2IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjE4OSBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2MTc3IG1vdnFpKzEvNgotTCQwNjM5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxNTkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE1NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE1OCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA2NDQgOyMgODE2MCBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNjE5NCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTY3IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDY0NQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjIyMiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2MjMyIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDY1MCA7IyA2MjQwIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2MjM0IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2MjQzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDY1MAotCWxkdyAwKCVyNSksJXIyNiA7IyA2MjUwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDYyNTQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjI1MiByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDYyNjIgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2MjU4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNjQzIDsjIDYyNzIgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2Mjc0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDYyNzcgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2Mjc4IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjUzIDsjIDYyODMgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2MjgxIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjI4NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjI4NyBhZGRzaTMvMQotTCQwNjUzCi0JY29taWIsPSAwLCVyOCxMJDA2NTQgOyMgNjI5MCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDYyOTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjI5NCBhZGRzaTMvMQotTCQwNjU0Ci0JY29taWIsPSAwLCVyOSxMJDA2NDMgOyMgNjI5NyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDYyOTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjMwMSBhZGRzaTMvMQotTCQwNjQzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjIwMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDYyMDYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjIwMyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjIwNCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDY0NQotCW5vcCA7IyA2MjA4IGJsZXUrMQotTCQwNjQ0Ci0JbGRpIDI0LCVyMTkgOyMgNjMyMyBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDYzMzYganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjMyNCBtb3ZxaSsxLzYKLUwkMDY1OQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTY3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNjUgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNjYgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA2NjQgOyMgODE2OCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjUgcmVsb2FkX291dHNpKzIvMwotTCQwNjY1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2MzY2IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDYzNzYgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNjcwIDsjIDYzODQgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDYzNzggcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDYzODcgcmVsb2FkX291dHNpKzIvNgotTCQwNjcwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDYzOTQgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjM5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2Mzk2IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjQwNiBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY0MDIgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA2NjMgOyMgNjQxNiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY0MTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjQyMSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY0MjIgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2NzMgOyMgNjQyNyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY0MjUgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2NDI4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2NDMxIGFkZHNpMy8xCi1MJDA2NzMKLQljb21pYiw9IDAsJXI4LEwkMDY3NCA7IyA2NDM0IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjQzNSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2NDM4IGFkZHNpMy8xCi1MJDA2NzQKLQljb21pYiw9IDAsJXI5LEwkMDY2MyA7IyA2NDQxIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjQ0MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2NDQ1IGFkZHNpMy8xCi1MJDA2NjMKLQlsZHcgMCglcjUpLCVyNCA7IyA2MzQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjM1MCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2MzQ3IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2MzQ4IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNjY1Ci0Jbm9wIDsjIDYzNTIgYmxldSsxCi1MJDA2NjQKLQlsZGkgMjUsJXIxOSA7IyA2NDY3IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjQ4MCBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2NDY4IG1vdnFpKzEvNgotTCQwNjc5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxNzUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE3MyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE3NCBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDY4NCA7IyA4MTc2IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2MyByZWxvYWRfb3V0c2krMi8zCi1MJDA2ODUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY1MTAgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjUyMCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA2OTAgOyMgNjUyOCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjUyMiByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjUzMSByZWxvYWRfb3V0c2krMi82Ci1MJDA2OTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjUzOCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2NTQyIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDY1NDAgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2NTUwIGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjU0NiByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDY4MyA7IyA2NTYwIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjU2MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2NTY1IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjU2NiBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDY5MyA7IyA2NTcxIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjU2OSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDY1NzIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDY1NzUgYWRkc2kzLzEKLUwkMDY5MwotCWNvbWliLD0gMCwlcjgsTCQwNjk0IDsjIDY1NzggYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2NTc5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDY1ODIgYWRkc2kzLzEKLUwkMDY5NAotCWNvbWliLD0gMCwlcjksTCQwNjgzIDsjIDY1ODUgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2NTg2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDY1ODkgYWRkc2kzLzEKLUwkMDY4MwotCWxkdyAwKCVyNSksJXI0IDsjIDY0OTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2NDk0IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY0OTEgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDY0OTIgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA2ODUKLQlub3AgOyMgNjQ5NiBibGV1KzEKLUwkMDY4NAotCWxkaSAyNiwlcjE5IDsjIDY2MTEgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2NjI0IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDY2MTIgbW92cWkrMS82Ci1MJDA2OTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE4MyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTgxIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTgyIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzA0IDsjIDgxODQgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTYxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDcwNQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjY1NCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2NjY0IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDcxMCA7IyA2NjcyIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2NjY2IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2Njc1IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDcxMAotCWxkdyAwKCVyNSksJXIyNiA7IyA2NjgyIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDY2ODYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjY4NCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY2OTQgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2NjkwIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzAzIDsjIDY3MDQgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2NzA2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY3MDkgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2NzEwIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNzEzIDsjIDY3MTUgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2NzEzIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjcxNiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjcxOSBhZGRzaTMvMQotTCQwNzEzCi0JY29taWIsPSAwLCVyOCxMJDA3MTQgOyMgNjcyMiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDY3MjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjcyNiBhZGRzaTMvMQotTCQwNzE0Ci0JY29taWIsPSAwLCVyOSxMJDA3MDMgOyMgNjcyOSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDY3MzAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjczMyBhZGRzaTMvMQotTCQwNzAzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjYzNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDY2MzggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjYzNSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjYzNiBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDcwNQotCW5vcCA7IyA2NjQwIGJsZXUrMQotTCQwNzA0Ci0JbGRpIDI3LCVyMTkgOyMgNjc1NSBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDY3NjgganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjc1NiBtb3ZxaSsxLzYKLUwkMDcxOQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTkxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxODkgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxOTAgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA3MjQgOyMgODE5MiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTkgcmVsb2FkX291dHNpKzIvMwotTCQwNzI1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2Nzk4IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY4MDggYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNzMwIDsjIDY4MTYgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDY4MTAgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDY4MTkgcmVsb2FkX291dHNpKzIvNgotTCQwNzMwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDY4MjYgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjgzMCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2ODI4IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjgzOCBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY4MzQgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA3MjMgOyMgNjg0OCBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY4NTAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjg1MyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY4NTQgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA3MzMgOyMgNjg1OSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY4NTcgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2ODYwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2ODYzIGFkZHNpMy8xCi1MJDA3MzMKLQljb21pYiw9IDAsJXI4LEwkMDczNCA7IyA2ODY2IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjg2NyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2ODcwIGFkZHNpMy8xCi1MJDA3MzQKLQljb21pYiw9IDAsJXI5LEwkMDcyMyA7IyA2ODczIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjg3NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2ODc3IGFkZHNpMy8xCi1MJDA3MjMKLQlsZHcgMCglcjUpLCVyNCA7IyA2Nzc4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjc4MiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2Nzc5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2NzgwIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNzI1Ci0Jbm9wIDsjIDY3ODQgYmxldSsxCi1MJDA3MjQKLQlsZGkgMjgsJXIxOSA7IyA2ODk5IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjkxMiBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2OTAwIG1vdnFpKzEvNgotTCQwNzM5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxOTkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE5NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE5OCBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDc0NCA7IyA4MjAwIGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU1NyByZWxvYWRfb3V0c2krMi8zCi1MJDA3NDUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY5NDIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjk1MiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA3NTAgOyMgNjk2MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjk1NCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjk2MyByZWxvYWRfb3V0c2krMi82Ci1MJDA3NTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjk3MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2OTc0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDY5NzIgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2OTgyIGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjk3OCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDc0MyA7IyA2OTkyIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjk5NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2OTk3IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjk5OCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDc1MyA7IyA3MDAzIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzAwMSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDcwMDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDcwMDcgYWRkc2kzLzEKLUwkMDc1MwotCWNvbWliLD0gMCwlcjgsTCQwNzU0IDsjIDcwMTAgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA3MDExIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDcwMTQgYWRkc2kzLzEKLUwkMDc1NAotCWNvbWliLD0gMCwlcjksTCQwNzQzIDsjIDcwMTcgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA3MDE4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDcwMjEgYWRkc2kzLzEKLUwkMDc0MwotCWxkdyAwKCVyNSksJXI0IDsjIDY5MjIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2OTI2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY5MjMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDY5MjQgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3NDUKLQlub3AgOyMgNjkyOCBibGV1KzEKLUwkMDc0NAotCWxkaSAxMCwlcjE5IDsjIDcwNDMgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA3MDU2IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDcwNDQgbW92cWkrMS82Ci1MJDA3NTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODIwNyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MjA1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MjA2IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzY0IDsjIDgyMDggYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTU1IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDc2NQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNzA4NiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3MDk2IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDc3MCA7IyA3MTA0IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3MDk4IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA3MTA3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDc3MAotCWxkdyAwKCVyNSksJXIyNiA7IyA3MTE0IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDcxMTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzExNiByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDcxMjYgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3MTIyIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzYzIDsjIDcxMzYgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3MTM4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDcxNDEgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3MTQyIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNzczIDsjIDcxNDcgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3MTQ1IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzE0OCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzE1MSBhZGRzaTMvMQotTCQwNzczCi0JY29taWIsPSAwLCVyOCxMJDA3NzQgOyMgNzE1NCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDcxNTUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzE1OCBhZGRzaTMvMQotTCQwNzc0Ci0JY29taWIsPSAwLCVyOSxMJDA3NjMgOyMgNzE2MSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDcxNjIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzE2NSBhZGRzaTMvMQotTCQwNzYzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNzA2NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDcwNzAgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzA2NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzA2OCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDc2NQotCW5vcCA7IyA3MDcyIGJsZXUrMQotTCQwNzY0Ci0JbGRpIDExLCVyMTkgOyMgNzE4NyBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDcyMDAganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzE4OCBtb3ZxaSsxLzYKLUwkMDc4NwotCWJiLDwgJXIxNSwxNyxMJDAwNzYgOyMgNzIxNiBibGV1KzMKLQlsZG8gLTQ4KCVyNyksJXIxOSA7IyA3MjI0IGFkZHNpMy8yCi0JbGR3IC0yNjAoJXIzMCksJXIxIDsjIDg5ODYgcmVsb2FkX291dHNpKzIvNQotCWV4dHJ1ICVyMTksMzEsOCwlcjMgOyMgNzIyNSB6ZXJvX2V4dGVuZHFpc2kyLzEKLQljb21iLDw8ICVyMSwlcjMsTCQwOTM5IDsjIDcyMzAgYmxldSsxCi0JbGRvIC0zMTIoJXIzMCksJXIyNiA7IyA3MjQ0IGFkZHNpMy8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBncm91cF9pbl9jb21waWxlX3N0YWNrLCVyMiA7IyA3MjQ4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjMsJXIyNSA7IyA3MjQ2IHJlbG9hZF9vdXRzaSsyLzEKLQlleHRycyAlcjI4LDMxLDgsJXIyOCA7IyA3MjUxIGV4dGVuZHFpc2kyCi0JY29taWIsPD4sbiAwLCVyMjgsTCQwMDc2IDsjIDcyNTMgYmxldSsxCi0JbGR3IDAoJXI1KSwlcjQgOyMgODIxMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyMTUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIxMyBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgODIxNCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA3OTUgOyMgODIxNiBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNzI2MCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyNyA7IyA4NTUzIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDc5NgotCWNvbWIsPSAlcjcsJXIyMCxMJDA5NDQgOyMgNzI4OCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3Mjk4IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNywlcjE5LEwkMDgwMSA7IyA3MzA2IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3MzAwIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI3LDQoJXI1KSA7IyA3MzA5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDgwMQotCWxkdyAwKCVyNSksJXIyNiA7IyA3MzE2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDczMjAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzMxOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDczMjggYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3MzI0IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzk0IDsjIDczMzggYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3MzQwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDczNDMgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3MzQ0IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwODA0IDsjIDczNDkgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3MzQ3IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzM1MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzM1MyBhZGRzaTMvMQotTCQwODA0Ci0JY29taWIsPSAwLCVyOCxMJDA4MDUgOyMgNzM1NiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDczNTcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzM2MCBhZGRzaTMvMQotTCQwODA1Ci0JY29taWIsPSAwLCVyOSxMJDA3OTQgOyMgNzM2MyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDczNjQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzM2NyBhZGRzaTMvMQotTCQwNzk0Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNzI2OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDcyNzIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzI2OSBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgNzI3MCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDc5NgotCW5vcCA7IyA3Mjc0IGJsZXUrMQotTCQwNzk1Ci0JbGRpIDcsJXIxOSA7IyA3Mzg5IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzM5MCBtb3ZxaSsxLzYKLQlibCBMJDAwNDMsJXIwIDsjIDc0MDUganVtcAotCXN0YnMsbWEgJXIzLDEoJXI2KSA7IyA3MzkzIG1vdnFpKzEvNgotTCQwODExCi0JYmIsPCAlcjE1LDMwLEwkMDEwNAotCW5vcCA7IyA3NDE0IGJsZXUrMwotTCQwMzk3Ci0JY29taWIsPSAwLCVyMTQsTCQwODE1IDsjIDc0MjkgYmxldSsxCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDc0MzAgYWRkc2kzLzEKLQlibCBMJDA4MTYsJXIwIDsjIDc0MzQganVtcAotCWxkYiAwKCVyMTkpLCVyMTkgOyMgNzQzMyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDgxNQotCWNvcHkgJXI3LCVyMTkgOyMgNzQzOCByZWxvYWRfb3V0c2krMi8xCi1MJDA4MTYKLQljb3B5ICVyMTksJXI3IDsjIDc0NDEgcmVsb2FkX291dHNpKzIvMQotTCQwMDc2Ci0JY29taWIsPSxuIDAsJXI5LEwkMDgyMCA7IyA3NDYwIGJsZXUrMQotCWxkYiAwKCVyOSksJXIyMCA7IyA3NDYzIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXI5LCVyMjAsJXIxOSA7IyA3NDY0IGFkZHNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3NDY1IGFkZHNpMy8yCi0JY29tYiw8PiAlcjYsJXIxOSxMJDA4MjAgOyMgNzQ2NyBibGV1KzEKLQlsZGkgMjU1LCVyMTkgOyMgNzQ3MiByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMTksJXIyMCxMJDA4MjAgOyMgNzQ3NCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIxIDsjIDc0NzYgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMjEpLCVyMTkgOyMgNzQ3OCBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIyMCA7IyA3NDc5IGV4dGVuZHFpc2kyCi0JbGRpIDQyLCVyMTkgOyMgNzQ4MSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMTksJXIyMCxMJDA4MjAgOyMgNzQ4MyBibGV1KzEKLQlsZGkgOTQsJXIxOSA7IyA3NDkwIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE5LCVyMjAsTCQwODIwIDsjIDc0OTIgYmxldSsxCi0JYmIsPj0gJXIxNSwzMCxMJDA4MjEgOyMgNzQ5NyBtb3ZzaS00Ci0JbGRpIDkyLCVyMTkgOyMgNzUwNCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PixuICVyMTksJXIyMCxMJDA4MjIgOyMgNzUwNiBibGV1KzEKLQlsZGIgMSglcjIxKSwlcjE5IDsjIDc1MTAgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgNzUxMSBleHRlbmRxaXNpMgotTCQwODIxCi0JbGRpIDQzLCVyMTkgOyMgNzUzNCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMTksJXIyMCxMJDA4MjAgOyMgNzUzNiBibGV1KzEKLQlsZGkgNjMsJXIxOSA7IyA3NTQzIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE5LCVyMjAsTCQwODIwIDsjIDc1NDUgYmxldSsxCi1MJDA4MjIKLQliYiw+PSxuICVyMTUsMjIsTCQwODE5IDsjIDc1NTMgbW92c2ktNAotCWJiLD49ICVyMTUsMTksTCQwODIzIDsjIDc1NTggbW92c2ktNAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgNzU2MCByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyA3NTYyIG1vdnFpKzEvNQotCWxkaSAxMjMsJXIyMCA7IyA3NTY1IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NTYzIGV4dGVuZHFpc2kyCi0JY29tYiw9LG4gJXIyMCwlcjE5LEwkMDgyMCA7IyA3NTY3IGJsZXUrMQotCWxkdyAwKCVyNSksJXI0IDsjIDgyMjggcmVsb2FkX291dHNpKzIvNQotCWJsLG4gTCQxMTc3LCVyMCA7IyA3NTY4IGp1bXAKLUwkMDgyMwotCWxkdyAtMjk2KCVyMzApLCVyMjEgOyMgNzU3MiByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIyMSksJXIxOSA7IyA3NTc0IG1vdnFpKzEvNQotCWxkaSA5MiwlcjIwIDsjIDc1NzcgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDc1NzUgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIyMCwlcjE5LEwkMDgxOSA7IyA3NTc5IGJsZXUrMQotCWxkYiAxKCVyMjEpLCVyMTkgOyMgNzU4MyBtb3ZxaSsxLzUKLQlsZGkgMTIzLCVyMjAgOyMgNzU4NiByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzU4NCBleHRlbmRxaXNpMgotCWNvbWIsPD4sbiAlcjIwLCVyMTksTCQwODE5IDsjIDc1ODggYmxldSsxCi1MJDA4MjAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjIwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODIyMyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MjIxIHN1YnNpMy8xCi0JbGRvIDIoJXIxOSksJXIxOSA7IyA4MjIyIGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDgyOSA7IyA4MjI0IGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyA3NTk2IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTEgcmVsb2FkX291dHNpKzIvMwotTCQwODMwCi0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA3NjI0IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDc2MzQgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwODM1IDsjIDc2NDIgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDc2MzYgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDc2NDUgcmVsb2FkX291dHNpKzIvNgotTCQwODM1Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDc2NTIgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNzY1NiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA3NjU0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNzY2NCBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDc2NjAgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA4MjggOyMgNzY3NCBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc2NzYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNzY3OSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDc2ODAgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA4MzggOyMgNzY4NSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDc2ODMgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3Njg2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3Njg5IGFkZHNpMy8xCi1MJDA4MzgKLQljb21pYiw9IDAsJXI4LEwkMDgzOSA7IyA3NjkyIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzY5MyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3Njk2IGFkZHNpMy8xCi1MJDA4MzkKLQljb21pYiw9IDAsJXI5LEwkMDgyOCA7IyA3Njk5IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNzcwMCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3NzAzIGFkZHNpMy8xCi1MJDA4MjgKLQlsZHcgMCglcjUpLCVyNCA7IyA3NjA0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzYwOCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3NjA1IHN1YnNpMy8xCi0JbGRvIDIoJXIxOSksJXIxOSA7IyA3NjA2IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwODMwCi0Jbm9wIDsjIDc2MTAgYmxldSsxCi1MJDA4MjkKLQlsZGkgMSwlcjE5IDsjIDc3MjUgbW92cWkrMS8yCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA3NzI2IG1vdnFpKzEvNgotCXN0YnMsbWEgJXIwLDEoJXI2KSA7IyA3NzI5IG1vdnFpKzEvNgotCWxkbyAtMSglcjYpLCVyOSA7IyA3NzQxIGFkZHNpMy8yCi1MJDA4MTkKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjI4IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE3NwotCWxkdyA0KCVyNSksJXIyMCA7IyA4MjMxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgyMjkgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgyMzAgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA4NDggOyMgODIzMiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NDkgcmVsb2FkX291dHNpKzIvMwotTCQwODQ5Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA3NzcxIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDc3ODEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwODU0IDsjIDc3ODkgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDc3ODMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDc3OTIgcmVsb2FkX291dHNpKzIvNgotTCQwODU0Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDc3OTkgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNzgwMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA3ODAxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNzgxMSBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDc4MDcgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA4NDcgOyMgNzgyMSBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc4MjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNzgyNiBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDc4Mjcgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA4NTcgOyMgNzgzMiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDc4MzAgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3ODMzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3ODM2IGFkZHNpMy8xCi1MJDA4NTcKLQljb21pYiw9IDAsJXI4LEwkMDg1OCA7IyA3ODM5IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzg0MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3ODQzIGFkZHNpMy8xCi1MJDA4NTgKLQljb21pYiw9IDAsJXI5LEwkMDg0NyA7IyA3ODQ2IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNzg0NyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3ODUwIGFkZHNpMy8xCi1MJDA4NDcKLQlsZHcgMCglcjUpLCVyNCA7IyA3NzUxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzc1NSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3NzUyIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3NzUzIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwODQ5Ci0Jbm9wIDsjIDc3NTcgYmxldSsxCi1MJDA4NDgKLQlzdGJzLG1hICVyNywxKCVyNikgOyMgNzg3MiBtb3ZxaSsxLzYKLQlsZGIgMCglcjkpLCVyMTkgOyMgNzg4NSBtb3ZxaSsxLzUKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDc4ODggYWRkc2kzLzIKLQlzdGIgJXIxOSwwKCVyOSkgOyMgNzg5MCBtb3ZxaSsxLzYKLUwkMDA0MwotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMyOCByZWxvYWRfb3V0c2krMi81Ci1MJDExNjEKLQljb21jbHIsPSAlcjE2LCVyMTksJXIwIDsjIDI1OCBibGV1KzEKLQlibCBMJDExNzgsJXIwCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyMzM0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMDA0NAotCWNvbWliLD0gMCwlcjEwLEwkMDg2NSA7IyA3OTEzIGJsZXUrMQotCWxkaSAxMywlcjI2IDsjIDc5MTggcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXIxMCwlcjI1IDsjIDc5MjAgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXIyNSwlcjI0IDsjIDc5MTUgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgNzkyNCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDc5MjIgYWRkc2kzLzIKLUwkMDg2NQotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNzkyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwODY2IDsjIDc5MzAgYmxldSsxCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA3OTQ2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA3OTQ0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjUpLCVyMTkgOyMgNzk0OSByZWxvYWRfb3V0c2krMi81Ci0JbGRpIDAsJXIyOCA7IyA3OTU1IHJlbG9hZF9vdXRzaSsyLzIKLQlzdWIgJXI2LCVyMTksJXIxOSA7IyA3OTUwIHN1YnNpMy8xCi0JYmwgTCQwODY3LCVyMCA7IyA3OTU3IGp1bXAKLQlzdHcgJXIxOSw4KCVyNSkgOyMgNzk1MiByZWxvYWRfb3V0c2krMi82Ci1MJDA4OTUKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDIyNjkgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDIyNjcgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMjI3MyBqdW1wCi0JbGRpIDExLCVyMjggOyMgMjI3MSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MDAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDMxNjEgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDMxNTkgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMzE2NSBqdW1wCi0JbGRpIDQsJXIyOCA7IyAzMTYzIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkwMgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgMzIxOCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzIxNiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAzMjIyIGp1bXAKLQlsZGkgNywlcjI4IDsjIDMyMjAgcmVsb2FkX291dHNpKzIvMgotTCQwOTAzCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAzODAzIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzODAxIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDM4MDcganVtcAotCWxkaSA1LCVyMjggOyMgMzgwNSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MTUKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDU0NjEgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDU0NTkgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNTQ2NSBqdW1wCi0JbGRpIDksJXIyOCA7IyA1NDYzIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkxNwotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgNTU1NyBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNTU1NSByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyA1NTYxIGp1bXAKLQlsZGkgMTMsJXIyOCA7IyA1NTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkyMgotCWJsIEwkMDg2NywlcjAgOyMgNTk4MyBqdW1wCi0JbGRpIDE0LCVyMjggOyMgNTk4MSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MzkKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDcyMzUgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDcyMzMgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNzIzOSBqdW1wCi0JbGRpIDYsJXIyOCA7IyA3MjM3IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDk0NAotCWJsIEwkMDg2NywlcjAgOyMgNzc3NSBqdW1wCi0JbGRpIDE1LCVyMjggOyMgNzc3MyByZWxvYWRfb3V0c2krMi8yCi1MJDA4NjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDc5MzUgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDc5MzMgcmVsb2FkX291dHNpKzIvNQotCWxkaSA4LCVyMjggOyMgNzkzNyByZWxvYWRfb3V0c2krMi8yCi1MJDA4NjcKLQlsZHcgLTM0MCglcjMwKSwlcjIgOyMgOTAyNiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNjgoJXIzMCksJXIxOCA7IyA5MDI4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE2NCglcjMwKSwlcjE3IDsjIDkwMzAgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTYwKCVyMzApLCVyMTYgOyMgOTAzMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNTYoJXIzMCksJXIxNSA7IyA5MDM0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE1MiglcjMwKSwlcjE0IDsjIDkwMzYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTQ4KCVyMzApLCVyMTMgOyMgOTAzOCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNDQoJXIzMCksJXIxMiA7IyA5MDQwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE0MCglcjMwKSwlcjExIDsjIDkwNDIgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTM2KCVyMzApLCVyMTAgOyMgOTA0NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMzIoJXIzMCksJXI5IDsjIDkwNDYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTI4KCVyMzApLCVyOCA7IyA5MDQ4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTEyNCglcjMwKSwlcjcgOyMgOTA1MCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMjAoJXIzMCksJXI2IDsjIDkwNTIgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTE2KCVyMzApLCVyNSA7IyA5MDU0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTExMiglcjMwKSwlcjQgOyMgOTA1NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMDgoJXIzMCksJXIzIDsjIDkwNTggcmVsb2FkX291dHNpKzIvNQotCWJ2ICVyMCglcjIpIDsjIDkwNjEgcmV0dXJuX2ludGVybmFsCi0JbGRvIC0zMjAoJXIzMCksJXIzMCA7IyA5MDYwIGFkZHNpMy8yCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5kYXRhCi0KLQkuYWxpZ24gMQotcmVfc3ludGF4X3RhYmxlCi0JLmJsb2NrIDI1NgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9jb21tb24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwN2ZkMDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9jb21tb24ucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5jb2RlCi10ZXh0X3N5bWJvbDoJCi0JLmxvbmcJMQotCS5sb25nCWV4dGVybmFsX3N5bWJvbAotCS5kYXRhCi1kYXRhX3N5bWJvbDoKLQkubG9uZwkyCi1jb21tb25fc3ltYm9sCS5jb21tCTQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9mcmFnYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjlhODYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9mcmFnYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQkuY29kZQotCW5vcAkJCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9nbG9iYWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZjA1ZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9nbG9iYWxidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQotCS5zcGFjZSAkUFJJVkFURSQKLQkuc3Vic3BhICRHTE9CQUwkCi0JLmV4cG9ydCAkZ2xvYmFsJAotJGdsb2JhbCQKLQkuc3BhY2UgJFRFWFQkCi0JLnN1YnNwYSAkQ09ERSQKLQotCS5wcm9jCi0JLmNhbGxpbmZvCi1pdmFhZGRyCi0Jbm9wCi0Jbm9wCi0JYWRkaWwgTCVpdmFhZGRyLSRnbG9iYWwkLCVkcAotCWxkbyAgIFIlaXZhYWRkci0kZ2xvYmFsJCglcjEpLCVyMTkKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlN2UwNGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuRVhQT1JUIGZvbyxEQVRBCi0JLmRhdGEKLQotCS5hbGlnbiA0Ci1mb286Ci0JLndvcmQgMAotCS5JTVBPUlQgX19tYWluLENPREUKLQotCS5jb2RlCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4sQ09ERQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCS5pbXBvcnQgZm9vCi0Jc3R3ICVyMiwtMjAoMCwlcjMwKQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSw2NCglcjMwKQotCS5DQUxMIAotCWJsIF9fbWFpbiwlcjIKLQlub3AKLUwkMDAwMToKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xhYmVsZGlmZnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbGFiZWxkaWZmcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQ3ZWMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbGFiZWxkaWZmcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotOyBTaG91bGQgY2hlY2sgdG8gbWFrZSBzdXJlIHNvbWV0aGluZyB1c2VmdWwgZ2V0cyBwdXQgb24gdGhvc2UgLndvcmQKLTsgc3RhdGVtZW50cy4KLQkuY29kZQotCi0JLmFsaWduCTgKLQkuZXhwb3J0CWljb2RlLGRhdGEKLWljb2RlOgotCS5wcm9jCi0JLmNhbGxpbmZvCWZyYW1lPTAsbm9fY2FsbHMKLQkuZW50cnkKLQlidixuCSVyMCglcjIpCi0JLmV4aXQKLQlub3AKLQkucHJvY2VuZAotCi0JOwotCTsgRklSU1QsIGFyZ3YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYXJncywgMXN0IGlzIHNhbWUgYXMgcGF0aC4KLQk7Ci0JLmFsaWduCTgKLWljX2FyZ3Y6Ci0JLndvcmQJaWNfYXJndjEtaWNvZGUJOyBzZWNvbmQsIHBvaW50ZXIgdG8gMXN0IGFyZ3VtZW50Ci0JLndvcmQJaWNfcGF0aC1pY29kZQkJOyBmaXJzdCwgIHBvaW50ZXIgdG8gaW5pdCBwYXRoCi0JLndvcmQJMAkJCTsgZm91cnRoLCBOVUxMIGFyZ3YgdGVybWluYXRvciAocGFkKQotCS53b3JkCTAJCQk7IHRoaXJkLCAgTlVMTCBhcmd2IHRlcm1pbmF0b3IKLQotaWNfcGF0aDoKLQkuYmxvY2t6CTQwOTYJCQk7IG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcwotCS53b3JkCTAJCQk7IGluIGNhc2UgZnVsbCBzdHJpbmcgaXMgdXNlZAotCS53b3JkCTAJCQk7IHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHRlcm1pbmF0b3IKLQotaWNfYXJndjE6Ci0JLmJsb2Nregk0MDk2CQkJOyBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKLQkud29yZAkwCQkJOyBpbiBjYXNlIGZ1bGwgc3RyaW5nIGlzIHVzZWQKLQkud29yZAkwCQkJOyB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyB0ZXJtaW5hdG9yCi0KLQkuZXhwb3J0CXN6aWNvZGUsZGF0YQotc3ppY29kZToKLQkud29yZAlzemljb2RlLWljb2RlCi0JLndvcmQJMAkJCTsgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBmaWxsZXIgYXQgZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xvY2FsbGFiZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbG9jYWxsYWJlbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM1N2I5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbG9jYWxsYWJlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0KLUxhYmVsOgotTCQwMTIzNDoKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9zc19hbGlnbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9zc19hbGlnbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTk4ZWIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvc3NfYWxpZ24ucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTY0LEFDQ0VTUz0zMQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLXN5bTE6CS5XT1JEIDIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4N2ZkOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX3N1YnNwYWNlX2FsaWduX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAic3NfYWxpZ24uczogVGVzdCBzdWJzcGFjZSBhbGlnbm1lbnQgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgeyBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gfHwgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIH0gdGhlbiB7Ci0gICAgICByZXR1cm4gCi0gICAgfQotCi0gICAgaWYgW2dhc190ZXN0X29sZCAic3NfYWxpZ24ucyIgIiIgInN1YnNwYWNlIGFsaWdubWVudCAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1oIgotCi0gICAgIyBDaGVjayB0aGUgaGVhZGVycyBmb3IgdGhlIGNvcnJlY3QgYWxpZ25tZW50IHZhbHVlIGZvciB0aGUKLSAgICAjIHRoZSAkREFUQSQgc3Vic3BhY2UgKHNvbSkuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCAgewotCQktcmUgIkRBVEFcW15cblxdKiAyLi42XFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2xvY2FsX2xhYmVsX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9jYWxsYWJlbC5zOiBFbGltaW5hdGlvbiBvZiBsb2NhbCBsYWJlbHMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAibG9jYWxsYWJlbC5zIiAiIiAiRWxpbWluYXRpb24gb2YgbG9jYWwgbGFiZWxzIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXQiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMDBcW15cblxdKkxhYmVsXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXjAwMDAwMDAwXFteXG5cXSpMXCQwMTIzNFxbXlxuXF0qXG4iCXsgc2V0IHggMCB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fZnJjaGFpbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZyYWdidWcuczogVGVzdCBidWcgaW4gZnJhZyBjaGFpbmluZyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmcmFnYnVnLnMiICIiICJUZXN0IGJ1ZyBpbiBmcmFnIGNoYWluaW5nIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1wcmVmaXgtYWRkcmVzc2VzIC1kIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjB4MDAwMDAwMDBcW15cblxdKm5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIl4weDAwMDAwMDA0XFteXG5cXSpub3BcW15cblxdKlxuIgkJeyBzZXQgeCAwIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19hbGlnbjNfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbGlnbjMuczogVGVzdCBmb3IgYWxpZ25tZW50IGJ1ZyB3aGVuIHN3aXRjaGluZyBzdWJzcGFjZXMgKHBhcnQyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiB7IFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB8fCBbaXN0YXJnZXQgaHBwYSp3LSotKl0gfSB0aGVuIHsKLSAgICAgIHJldHVybiAKLSAgICB9Ci0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJhbGlnbjMucyIgIiIgIlRlc3QgZm9yIGFsaWdubWVudCBidWcgd2hlbiBzd2l0Y2hpbmcgc3Vic3BhY2VzIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1wcmVmaXgtYWRkcmVzc2VzIC1kIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSogPG1haW4+IG5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIlxbXlxuXF0qIDwuKmVuZF9tYWluPiBub3BcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKiA8bWFpbisuKj4gbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMCB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fYWxpZ240X3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWxpZ240LnM6IE1vcmUgc3Vic3BhY2UgYWxpZ25tZW50IHRlc3RzIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgeyBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gfHwgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIH0gdGhlbiB7Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYWxpZ240LnMiICIiICJNb3JlIHN1YnNwYWNlIGFsaWdubWVudCB0ZXN0cyAocGFydDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1oIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSpNSUxMSUNPREVcW15cblxdKjIuLjZcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXFteXG5cXSpZQUJCQVxbXlxuXF0qMi4uM1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19pbXBvcnRfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbXBvcnRidWcuczogVGVzdCBmb3IgYnVnIGluIC5pbXBvcnQgZGlyZWN0aXZlIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiaW1wb3J0YnVnLnMiICIiICJUZXN0IGZvciBidWcgaW4gLmltcG9ydCBkaXJlY3RpdmUgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXN5bXMiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJcW15cblxdKi5EQVRBLi5mb29cW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKi5kYXRhLipmb29cW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19jb21tb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21tb24uczogVGVzdCBmb3IgYnVnIGluIC5jb21tIGhhbmRsaW5nIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiY29tbW9uLnMiICIiICJUZXN0IGZvciBidWcgaW4gLmNvbW0gaGFuZGxpbmcgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXN5bXMiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJcW15cblxdKi5DT00uKmNvbW1vbl9zeW1ib2xcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIE1ha2Ugc3VyZSBzdWJzcGFjZSBhbGlnbm1lbnQgcmVxdWVzdHMgZnJvbSB0aGUgc3Vic3BhY2UgZGlyZWN0aXZlcwotICAgICMgYXJlIGhvbm9yZWQKLSAgICBkb19zdWJzcGFjZV9hbGlnbl90ZXN0Ci0KLSAgICAjIE1ha2Ugc3VyZSB0aGUgY29ycmVjdCBsYWJlbHMgZW5kIHVwIGluIHRoZSBzeW1ib2wgdGFibGUKLSAgICBkb19sb2NhbF9sYWJlbF90ZXN0Ci0KLSAgICAjIEdBUy0xLjM2IGNob2tlZCBvbiB0aGlzIGZpbGUuCi0gICAgZ2FzX3Rlc3QgImxhYmVsZGlmZnMucyIgIiIgIiIgIkRpZmZlcmVuY2Ugb2YgbGFiZWxzIgotCi0gICAgIyBUZXN0IGEgcmVjZW50IGJ1ZyB3aGVyZSBmcmFnIGNoYWluaW5nIHdhc24ndCB3b3JraW5nIGNvcnJlY3RseS4KLSAgICBkb19mcmNoYWluX3Rlc3QKLQotICAgICMgVGVzdCBidWcgd2hlcmUgc3dpdGNoaW5nIGJldHdlZW4gc3Vic3BhY2VzIGNyZWF0ZXMgYm9ndXMgYWxpZ25tZW50cwotICAgIGRvX2FsaWduM190ZXN0Ci0KLSAgICAjIFRlc3QgYnVnIHdoZXJlIHN3aXRjaGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBjcmVhdGVzIGJvZ3VzIGFsaWdubWVudHMKLSAgICBkb19hbGlnbjRfdGVzdAotCi0gICAgIyBUZXN0IGEgcHJvYmxlbSB3aGVyZSAkZ2xvYmFsJCBpcyBkZWZpbmVkLCB0aGVuIHVzZWQgd2l0aGluIHRoZQotICAgICMgc2FtZSBzb3VyY2UgZmlsZS4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKLSAgICBnYXNfdGVzdCAiZ2xvYmFsYnVnLnMiICIiICIiICJVc2UgXCRnbG9iYWxcJCBpbiBmaWxlIHdoaWNoIGRlZmluZXMgaXQiCi0KLSAgICAjIFRlc3QgdGhhdCBpbXBvcnRpbmcgYSBkZWZpbmVkIHN5bWJvbCBkb2Vzbid0IHNjcmV3IHVwIHRoZSBzeW1ib2wncwotICAgICMgc3BhY2Uvc3Vic3BhY2UuCi0gICAgZG9faW1wb3J0X3Rlc3QKLQotICAgICMgVGVzdCBmb3IgYSBidWdsZXQgaW4gdGhlIGhhbmRsaW5nIG9mIGNvbW1vbiBzeW1ib2xzCi0gICAgZG9fY29tbW9uX3Rlc3QKLQotICAgICMgVGVzdCBmb3IgYW4gb2ZmLWJ5LTIgYnVnIGluIHJhbmdlIGNoZWNrIGZvciBjb25kaXRpb25hbCBicmFuY2hlcwotICAgIGdhc190ZXN0X2Vycm9yICJicmxlbmJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yKHMpIGluIGJyYW5jaCBsZW5ndGgiCi0KLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjE2NzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQuZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IGFtZAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJMGYgMGQgMDMgWyAJXSpwcmVmZXRjaCBcKCVlYnhcKQotICAgMzoJMGYgMGQgMGMgNzUgMDAgMTAgMDAgMDAgWyAJXSpwcmVmZXRjaHcgMHgxMDAwXCgsJWVzaSwyXCkKLSAgIGI6CTBmIDBlIFsgCV0qZmVtbXMgIAotICAgZDoJMGYgMGYgMDAgYmYgWyAJXSpwYXZndXNiIFwoJWVheFwpLCVtbTAKLSAgMTE6CTBmIDBmIDQ4IDAyIDFkIFsgCV0qcGYyaWQgIDB4MlwoJWVheFwpLCVtbTEKLSAgMTY6CTBmIDBmIDkwIDAwIDAxIDAwIDAwIGFlIFsgCV0qcGZhY2MgIDB4MTAwXCglZWF4XCksJW1tMgotICAxZToJMGYgMGYgMWUgOWUgWyAJXSpwZmFkZCAgXCglZXNpXCksJW1tMwotICAyMjoJMGYgMGYgNjYgMDIgYjAgWyAJXSpwZmNtcGVxIDB4MlwoJWVzaVwpLCVtbTQKLSAgMjc6CTBmIDBmIGFlIDkwIDkwIDAwIDAwIDkwIFsgCV0qcGZjbXBnZSAweDkwOTBcKCVlc2lcKSwlbW01Ci0gIDJmOgkwZiAwZiA3NCA3NSAwMCBhMCBbIAldKnBmY21wZ3QgMHgwXCglZWJwLCVlc2ksMlwpLCVtbTYKLSAgMzU6CTBmIDBmIDdjIDc1IDAyIGE0IFsgCV0qcGZtYXggIDB4MlwoJWVicCwlZXNpLDJcKSwlbW03Ci0gIDNiOgkwZiAwZiA4NCA3NSA5MCA5MCA5MCA5MCA5NCBbIAldKnBmbWluICAweDkwOTA5MDkwXCglZWJwLCVlc2ksMlwpLCVtbTAKLSAgNDQ6CTBmIDBmIDBkIDA0IDAwIDAwIDAwIGI0IFsgCV0qcGZtdWwgIDB4NCwlbW0xCi0gIDRjOgkyZSAwZiAwZiA1NCBjMyAwNyA5NiBbIAldKnBmcmNwICAlY3M6MHg3XCglZWJ4LCVlYXgsOFwpLCVtbTIKLSAgNTM6CTBmIDBmIGQ4IGE2IFsgCV0qcGZyY3BpdDEgJW1tMCwlbW0zCi0gIDU3OgkwZiAwZiBlMSBiNiBbIAldKnBmcmNwaXQyICVtbTEsJW1tNAotICA1YjoJMGYgMGYgZWEgYTcgWyAJXSpwZnJzcWl0MSAlbW0yLCVtbTUKLSAgNWY6CTBmIDBmIGYzIDk3IFsgCV0qcGZyc3FydCAlbW0zLCVtbTYKLSAgNjM6CTBmIDBmIGZjIDlhIFsgCV0qcGZzdWIgICVtbTQsJW1tNwotICA2NzoJMGYgMGYgYzUgYWEgWyAJXSpwZnN1YnIgJW1tNSwlbW0wCi0gIDZiOgkwZiAwZiBjZSAwZCBbIAldKnBpMmZkICAlbW02LCVtbTEKLSAgNmY6CTBmIDBmIGQ3IGI3IFsgCV0qcGZtdWxocncgJW1tNywlbW0yCi0gIDczOgkyZSAwZiBbIAldKlwoYmFkXCkgIAotICA3NToJMGYgNTQgYzMgWyAJXSphbmRwcyAgJXhtbTMsJXhtbTAKLSAgNzg6CTA3IFsgCV0qcG9wICAgICVlcwotICA3OToJYzMgWyAJXSpyZXQgICAgCi0gIDdhOgk5MCBbIAldKm5vcCAgICAKLSAgN2I6CTkwIFsgCV0qbm9wICAgIAotICA3YzoJOTAgWyAJXSpub3AgICAgCi0gIDdkOgk5MCBbIAldKm5vcCAgICAKLSAgN2U6CTkwIFsgCV0qbm9wICAgIAotICA3ZjoJOTAgWyAJXSpub3AgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOWM2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotI0FNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zCi0KLS50ZXh0Ci1mb286Ci0gcHJlZmV0Y2gJKCVlYngpCi0gcHJlZmV0Y2h3CTB4MTAwMCgsJWVzaSwyKQotIGZlbW1zCi0gcGF2Z3VzYgkoJWVheCksJW1tMAotIHBmMmlkCQkyKCVlYXgpLCVtbTEKLSBwZmFjYwkJMHgxMDAoJWVheCksJW1tMgotIHBmYWRkCQkoJWVzaSksJW1tMwotIHBmY21wZXEJMiglZXNpKSwlbW00Ci0gcGZjbXBnZQkweDkwOTAoJWVzaSksJW1tNQotIHBmY21wZ3QJKCVlYnAsJWVzaSwyKSwlbW02Ci0gcGZtYXgJCTIoJWVicCwlZXNpLDIpLCVtbTcKLSBwZm1pbgkJMHg5MDkwOTA5MCglZWJwLCVlc2ksMiksJW1tMAotIHBmbXVsCQk0LCVtbTEKLSBwZnJjcAkJJWNzOjcoJWVieCwlZWF4LDgpLCVtbTIKLSBwZnJjcGl0MQklbW0wLCVtbTMKLSBwZnJjcGl0MgklbW0xLCVtbTQKLSBwZnJzcWl0MQklbW0yLCVtbTUKLSBwZnJzcXJ0CSVtbTMsJW1tNgotIHBmc3ViCQklbW00LCVtbTcKLSBwZnN1YnIJCSVtbTUsJW1tMAotIHBpMmZkCQklbW02LCVtbTEKLSBwbXVsaHJ3CSVtbTcsJW1tMgotCi0jIFRoaXMgaXMgYSAzRE5vdyEgaW5zdHJ1Y3Rpb24sIHdpdGggYSBwcmVmaXgsIHRoYXQgaXNuJ3QgcXVpdGUgcmlnaHQKLSMgRXZlcnl0aGluZydzIGdvb2QgYmFyIHRoZSBvcGNvZGUgc3VmZml4Ci0uYnl0ZSAweDJlLCAweDBmLCAweDBmLCAweDU0LCAweGMzLCAweDA3LCAweGMzCi0KLSMgUGFkIG91dCB0byBhIGdvb2QgYWxpZ25tZW50Ci0gLmJ5dGUgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1NmY1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LmwKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6MzogV2FybmluZzouKmZhZGRwLioKLS4qOjE0OiBXYXJuaW5nOi4qZnN1YnAuKgotLio6MjU6IFdhcm5pbmc6Lipmc3VicnAuKgotLio6MzY6IFdhcm5pbmc6LipmbXVscC4qCi0uKjo0NzogV2FybmluZzouKmZkaXZwLioKLS4qOjU4OiBXYXJuaW5nOi4qZmRpdnJwLioKLSAgIDEgWyAJXSoucHNpemUgMAotICAgMiBbIAldKi50ZXh0Ci0gICAzIDAwMDAgREVDMSBbIAldKmZhZGQKLS4qV2FybmluZzouKmZhZGRwLioKLSAgIDQgMDAwMiBEOEMzIFsgCV0qZmFkZAklc3RcKDNcKQotICAgNSAwMDA0IEQ4QzMgWyAJXSpmYWRkCSVzdFwoM1wpLCVzdAotICAgNiAwMDA2IERDQzMgWyAJXSpmYWRkCSVzdCwlc3RcKDNcKQotICAgNyAwMDA4IEQ4MDMgWyAJXSpmYWRkcwlcKCVlYnhcKQotICAgOCAwMDBhIERDMDMgWyAJXSpmYWRkbAlcKCVlYnhcKQotICAgOSAwMDBjIERFMDMgWyAJXSpmaWFkZHMJXCglZWJ4XCkKLSAgMTAgMDAwZSBEQTAzIFsgCV0qZmlhZGRsCVwoJWVieFwpCi0gIDExIDAwMTAgREVDMSBbIAldKmZhZGRwCi0gIDEyIDAwMTIgREVDMyBbIAldKmZhZGRwCSVzdFwoM1wpCi0gIDEzIDAwMTQgREVDMyBbIAldKmZhZGRwCSVzdCwlc3RcKDNcKQotICAxNCAwMDE2IERFRTEgWyAJXSpmc3ViCi0uKldhcm5pbmc6Lipmc3VicC4qCi0gIDE1IDAwMTggRDhFMyBbIAldKmZzdWIJJXN0XCgzXCkKLSAgMTYgMDAxYSBEOEUzIFsgCV0qZnN1Ygklc3RcKDNcKSwlc3QKLSAgMTcgMDAxYyBEQ0UzIFsgCV0qZnN1Ygklc3QsJXN0XCgzXCkKLSAgMTggMDAxZSBEODIzIFsgCV0qZnN1YnMJXCglZWJ4XCkKLSAgMTkgMDAyMCBEQzIzIFsgCV0qZnN1YmwJXCglZWJ4XCkKLSAgMjAgMDAyMiBERTIzIFsgCV0qZmlzdWJzCVwoJWVieFwpCi0gIDIxIDAwMjQgREEyMyBbIAldKmZpc3VibAlcKCVlYnhcKQotICAyMiAwMDI2IERFRTEgWyAJXSpmc3VicAotICAyMyAwMDI4IERFRTMgWyAJXSpmc3VicAklc3RcKDNcKQotICAyNCAwMDJhIERFRTMgWyAJXSpmc3VicAklc3QsJXN0XCgzXCkKLSAgMjUgMDAyYyBERUU5IFsgCV0qZnN1YnIKLS4qV2FybmluZzouKmZzdWJycC4qCi0gIDI2IDAwMmUgRDhFQiBbIAldKmZzdWJyCSVzdFwoM1wpCi0gIDI3IDAwMzAgRDhFQiBbIAldKmZzdWJyCSVzdFwoM1wpLCVzdAotICAyOCAwMDMyIERDRUIgWyAJXSpmc3Vicgklc3QsJXN0XCgzXCkKLSAgMjkgMDAzNCBEODJCIFsgCV0qZnN1YnJzCVwoJWVieFwpCi0gIDMwIDAwMzYgREMyQiBbIAldKmZzdWJybAlcKCVlYnhcKQotICAzMSAwMDM4IERFMkIgWyAJXSpmaXN1YnJzCVwoJWVieFwpCi0gIDMyIDAwM2EgREEyQiBbIAldKmZpc3VicmwJXCglZWJ4XCkKLSAgMzMgMDAzYyBERUU5IFsgCV0qZnN1YnJwCi0gIDM0IDAwM2UgREVFQiBbIAldKmZzdWJycAklc3RcKDNcKQotICAzNSAwMDQwIERFRUIgWyAJXSpmc3VicnAJJXN0LCVzdFwoM1wpCi0gIDM2IDAwNDIgREVDOSBbIAldKmZtdWwKLS4qV2FybmluZzouKmZtdWxwLioKLSAgMzcgMDA0NCBEOENCIFsgCV0qZm11bAklc3RcKDNcKQotICAzOCAwMDQ2IEQ4Q0IgWyAJXSpmbXVsCSVzdFwoM1wpLCVzdAotICAzOSAwMDQ4IERDQ0IgWyAJXSpmbXVsCSVzdCwlc3RcKDNcKQotICA0MCAwMDRhIEQ4MEIgWyAJXSpmbXVscwlcKCVlYnhcKQotICA0MSAwMDRjIERDMEIgWyAJXSpmbXVsbAlcKCVlYnhcKQotICA0MiAwMDRlIERFMEIgWyAJXSpmaW11bHMJXCglZWJ4XCkKLSAgNDMgMDA1MCBEQTBCIFsgCV0qZmltdWxsCVwoJWVieFwpCi0gIDQ0IDAwNTIgREVDOSBbIAldKmZtdWxwCi0gIDQ1IDAwNTQgREVDQiBbIAldKmZtdWxwCSVzdFwoM1wpCi0gIDQ2IDAwNTYgREVDQiBbIAldKmZtdWxwCSVzdCwlc3RcKDNcKQotICA0NyAwMDU4IERFRjEgWyAJXSpmZGl2Ci0uKldhcm5pbmc6LipmZGl2cC4qCi0gIDQ4IDAwNWEgRDhGMyBbIAldKmZkaXYJJXN0XCgzXCkKLSAgNDkgMDA1YyBEOEYzIFsgCV0qZmRpdgklc3RcKDNcKSwlc3QKLSAgNTAgMDA1ZSBEQ0YzIFsgCV0qZmRpdgklc3QsJXN0XCgzXCkKLSAgNTEgMDA2MCBEODMzIFsgCV0qZmRpdnMJXCglZWJ4XCkKLSAgNTIgMDA2MiBEQzMzIFsgCV0qZmRpdmwJXCglZWJ4XCkKLSAgNTMgMDA2NCBERTMzIFsgCV0qZmlkaXZzCVwoJWVieFwpCi0gIDU0IDAwNjYgREEzMyBbIAldKmZpZGl2bAlcKCVlYnhcKQotICA1NSAwMDY4IERFRjEgWyAJXSpmZGl2cAotICA1NiAwMDZhIERFRjMgWyAJXSpmZGl2cAklc3RcKDNcKQotICA1NyAwMDZjIERFRjMgWyAJXSpmZGl2cAklc3QsJXN0XCgzXCkKLSAgNTggMDA2ZSBERUY5IFsgCV0qZmRpdnIKLS4qV2FybmluZzouKmZkaXZycC4qCi0gIDU5IDAwNzAgRDhGQiBbIAldKmZkaXZyCSVzdFwoM1wpCi0gIDYwIDAwNzIgRDhGQiBbIAldKmZkaXZyCSVzdFwoM1wpLCVzdAotICA2MSAwMDc0IERDRkIgWyAJXSpmZGl2cgklc3QsJXN0XCgzXCkKLSAgNjIgMDA3NiBEODNCIFsgCV0qZmRpdnJzCVwoJWVieFwpCi0gIDYzIDAwNzggREMzQiBbIAldKmZkaXZybAlcKCVlYnhcKQotICA2NCAwMDdhIERFM0IgWyAJXSpmaWRpdnJzCVwoJWVieFwpCi0gIDY1IDAwN2MgREEzQiBbIAldKmZpZGl2cmwJXCglZWJ4XCkKLSAgNjYgMDA3ZSBERUY5IFsgCV0qZmRpdnJwCi0gIDY3IDAwODAgREVGQiBbIAldKmZkaXZycAklc3RcKDNcKQotICA2OCAwMDgyIERFRkIgWyAJXSpmZGl2cnAJJXN0LCVzdFwoM1wpCi0gIDY5IFsgCV0qCi0gIDcwIDAwODQgMDAwMDAwMDAgWyAJXSoucDJhbGlnbgk0LDAKLSAgNzAgICAgICAwMDAwMDAwMCAKLSAgNzAgICAgICAwMDAwMDAwMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkMzBiNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0ucHNpemUgMAotLnRleHQKLQlmYWRkCi0JZmFkZAklc3QoMykKLQlmYWRkCSVzdCgzKSwlc3QKLQlmYWRkCSVzdCwlc3QoMykKLQlmYWRkcwkoJWVieCkKLQlmYWRkbAkoJWVieCkKLQlmaWFkZHMJKCVlYngpCi0JZmlhZGRsCSglZWJ4KQotCWZhZGRwCi0JZmFkZHAJJXN0KDMpCi0JZmFkZHAJJXN0LCVzdCgzKQotCWZzdWIKLQlmc3ViCSVzdCgzKQotCWZzdWIJJXN0KDMpLCVzdAotCWZzdWIJJXN0LCVzdCgzKQotCWZzdWJzCSglZWJ4KQotCWZzdWJsCSglZWJ4KQotCWZpc3VicwkoJWVieCkKLQlmaXN1YmwJKCVlYngpCi0JZnN1YnAKLQlmc3VicAklc3QoMykKLQlmc3VicAklc3QsJXN0KDMpCi0JZnN1YnIKLQlmc3Vicgklc3QoMykKLQlmc3Vicgklc3QoMyksJXN0Ci0JZnN1YnIJJXN0LCVzdCgzKQotCWZzdWJycwkoJWVieCkKLQlmc3VicmwJKCVlYngpCi0JZmlzdWJycwkoJWVieCkKLQlmaXN1YnJsCSglZWJ4KQotCWZzdWJycAotCWZzdWJycAklc3QoMykKLQlmc3VicnAJJXN0LCVzdCgzKQotCWZtdWwKLQlmbXVsCSVzdCgzKQotCWZtdWwJJXN0KDMpLCVzdAotCWZtdWwJJXN0LCVzdCgzKQotCWZtdWxzCSglZWJ4KQotCWZtdWxsCSglZWJ4KQotCWZpbXVscwkoJWVieCkKLQlmaW11bGwJKCVlYngpCi0JZm11bHAKLQlmbXVscAklc3QoMykKLQlmbXVscAklc3QsJXN0KDMpCi0JZmRpdgotCWZkaXYJJXN0KDMpCi0JZmRpdgklc3QoMyksJXN0Ci0JZmRpdgklc3QsJXN0KDMpCi0JZmRpdnMJKCVlYngpCi0JZmRpdmwJKCVlYngpCi0JZmlkaXZzCSglZWJ4KQotCWZpZGl2bAkoJWVieCkKLQlmZGl2cAotCWZkaXZwCSVzdCgzKQotCWZkaXZwCSVzdCwlc3QoMykKLQlmZGl2cgotCWZkaXZyCSVzdCgzKQotCWZkaXZyCSVzdCgzKSwlc3QKLQlmZGl2cgklc3QsJXN0KDMpCi0JZmRpdnJzCSglZWJ4KQotCWZkaXZybAkoJWVieCkKLQlmaWRpdnJzCSglZWJ4KQotCWZpZGl2cmwJKCVlYngpCi0JZmRpdnJwCi0JZmRpdnJwCSVzdCgzKQotCWZkaXZycAklc3QsJXN0KDMpCi0KLQkucDJhbGlnbgk0LDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YTcyNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLmwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjEwOiBXYXJuaW5nOi4qCi0uKjoxMjogV2FybmluZzouKgotLio6MTk6IFdhcm5pbmc6LioKLS4qOjIyOiBXYXJuaW5nOi4qCi0uKjo5NTogV2FybmluZzouKgotLio6OTY6IFdhcm5pbmc6LioKLS4qOjk3OiBXYXJuaW5nOi4qCi0uKjo5ODogV2FybmluZzouKgotLio6OTk6IFdhcm5pbmc6LioKLS4qOjEwMDogV2FybmluZzouKgotLio6MTAxOiBXYXJuaW5nOi4qCi0uKjoxMDI6IFdhcm5pbmc6LioKLS4qOjEwMzogV2FybmluZzouKgotLio6MTA0OiBXYXJuaW5nOi4qCi0uKjoxMDU6IFdhcm5pbmc6LioKLS4qOjEwNjogV2FybmluZzouKgotLio6MTA3OiBXYXJuaW5nOi4qCi0uKjoxMDg6IFdhcm5pbmc6LioKLS4qOjEwOTogV2FybmluZzouKgotLio6MTEwOiBXYXJuaW5nOi4qCi0uKjoxMTE6IFdhcm5pbmc6LioKLS4qOjExMjogV2FybmluZzouKgotLio6MTEzOiBXYXJuaW5nOi4qCi0uKjoxMTQ6IFdhcm5pbmc6LioKLS4qOjExNTogV2FybmluZzouKgotLio6MTQ5OiBXYXJuaW5nOi4qCi0uKjoxNzY6IFdhcm5pbmc6LioKLS4qOjE3ODogV2FybmluZzouKgotLio6MTgwOiBXYXJuaW5nOi4qCi0uKjoxODI6IFdhcm5pbmc6LioKLS4qOjE4NDogV2FybmluZzouKgotLio6MTkwOiBXYXJuaW5nOi4qCi0uKjoxOTI6IFdhcm5pbmc6LioKLS4qOjE5NDogV2FybmluZzouKgotLio6MTk2OiBXYXJuaW5nOi4qCi0uKjoxOTg6IFdhcm5pbmc6LioKLSAgIDEgICAgICAgICAgICAgICAgICAgICAgIAkucHNpemUgMAotICAgMiAgICAgICAgICAgICAgICAgICAgICAgCS50ZXh0Ci0gICAzICAgICAgICAgICAgICAgICAgICAgICAJIyB0ZXN0IHZhcmlvdXMgc2VnbWVudCByZWcgaW5zbnMKLSAgIDQgMDAwMCAxRSAgICAgICAgICAgICAgICAJCXB1c2gJJWRzCi0gICA1IDAwMDEgMUUgICAgICAgICAgICAgICAgCQlwdXNobAklZHMKLSAgIDYgMDAwMiAxRiAgICAgICAgICAgICAgICAJCXBvcAklZHMKLSAgIDcgMDAwMyAxRiAgICAgICAgICAgICAgICAJCXBvcGwJJWRzCi0gICA4IDAwMDQgOENEOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYXgKLSAgIDkgMDAwNiA4Q0Q4ICAgICAgICAgICAgICAJCW1vdmwJJWRzLCVlYXgKLSAgMTAgMDAwOCA4Q0Q4ICAgICAgICAgICAgICAJCW1vdmwJJWRzLCVheAotLipXYXJuaW5nOi4qCi0gIDExIDAwMGEgOEVEOCAgICAgICAgICAgICAgCQltb3YJJWVheCwlZHMKLSAgMTIgMDAwYyA4RUQ4ICAgICAgICAgICAgICAJCW1vdmwJJWF4LCVkcwotLipXYXJuaW5nOi4qCi0gIDEzIDAwMGUgOEVEOCAgICAgICAgICAgICAgCQltb3ZsCSVlYXgsJWRzCi0gIDE0ICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDE1IDAwMTAgNjYxRSAgICAgICAgICAgICAgCQlwdXNodwklZHMKLSAgMTYgMDAxMiA2NjFGICAgICAgICAgICAgICAJCXBvcHcJJWRzCi0gIDE3IDAwMTQgNjY4Q0Q4ICAgICAgICAgICAgCQltb3YJJWRzLCVheAotICAxOCAwMDE3IDY2OENEOCAgICAgICAgICAgIAkJbW92dwklZHMsJWF4Ci0gIDE5IDAwMWEgNjY4Q0Q4ICAgICAgICAgICAgCQltb3Z3CSVkcywlZWF4Ci0uKldhcm5pbmc6LioKLSAgMjAgMDAxZCA4RUQ4ICAgICAgICAgICAgICAJCW1vdgklYXgsJWRzCi0gIDIxIDAwMWYgOEVEOCAgICAgICAgICAgICAgCQltb3Z3CSVheCwlZHMKLSAgMjIgMDAyMSA4RUQ4ICAgICAgICAgICAgICAJCW1vdncJJWVheCwlZHMKLS4qV2FybmluZzouKgotICAyMyAgICAgICAgICAgICAgICAgICAgICAgCQotICAyNCAgICAgICAgICAgICAgICAgICAgICAgCSMgdGVzdCB2YXJpb3VzIHB1c2hlcwotICAyNSAwMDIzIDZBMEEgICAgICAgICAgICAgIAkJcHVzaGwJXCQxMAotICAyNiAwMDI1IDY2NkEwQSAgICAgICAgICAgIAkJcHVzaHcJXCQxMAotICAyNyAwMDI4IDZBMEEgICAgICAgICAgICAgIAkJcHVzaAlcJDEwCi0gIDI4IDAwMmEgNjhFODAzMDAgMDAgICAgICAgCQlwdXNobAlcJDEwMDAKLSAgMjkgMDAyZiA2NjY4RTgwMyAgICAgICAgICAJCXB1c2h3CVwkMTAwMAotICAzMCAwMDMzIDY4RTgwMzAwIDAwICAgICAgIAkJcHVzaAlcJDEwMDAKLSAgMzEgMDAzOCBGRjM1NTcwMCAwMDAwICAgICAJCXB1c2hsCTFmCi0gIDMyIDAwM2UgNjZGRjM1NTcgMDAwMDAwICAgCQlwdXNodwkxZgotICAzMyAwMDQ1IEZGMzU1NzAwIDAwMDAgICAgIAkJcHVzaAkxZgotICAzNCAwMDRiIEZGQjMwQzAwIDAwMDAgICAgIAkJcHVzaAlcKDFmLS5cKVwoJWVieFwpCi0gIDM1IDAwNTEgRkYzNTA2MDAgMDAwMCAgICAgCQlwdXNoCTFmLS4KLSAgMzYgICAgICAgICAgICAgICAgICAgICAgIAkjIHRoZXNlLCBhbmQgb3RoZXJzIGxpa2UgdGhlbSBzaG91bGQgaGF2ZSBubyBvcGVyYW5kIHNpemUgcHJlZml4Ci0gIDM3IDAwNTcgMEYwMEQxICAgICAgICAgICAgCTE6CWxsZHQJJWN4Ci0gIDM4IDAwNWEgMEYwMUYwICAgICAgICAgICAgCQlsbXN3CSVheAotICAzOSAgICAgICAgICAgICAgICAgICAgICAgCQotICA0MCAgICAgICAgICAgICAgICAgICAgICAgCSMgSnVzdCB0byBtYWtlIHN1cmUgdGhlc2UgZG9uJ3QgYmVjb21lIGlsbGVnYWwgZHVlIHRvIG92ZXItZW50aHVzaWFzdGljCi0gIDQxICAgICAgICAgICAgICAgICAgICAgICAJIyByZWdpc3RlciBjaGVja2luZwotICA0MiAwMDVkIDY2MEZCRUY4ICAgICAgICAgIAkJbW92c2J3CSVhbCwlZGkKLSAgNDMgMDA2MSAwRkJFQzggICAgICAgICAgICAJCW1vdnNibAklYWwsJWVjeAotICA0NCAwMDY0IDBGQkZDOCAgICAgICAgICAgIAkJbW92c3dsCSVheCwlZWN4Ci0gIDQ1IDAwNjcgNjYwRkI2RjggICAgICAgICAgCQltb3Z6YncJJWFsLCVkaQotICA0NiAwMDZiIDBGQjZDOCAgICAgICAgICAgIAkJbW92emJsCSVhbCwlZWN4Ci0gIDQ3IDAwNmUgMEZCN0M4ICAgICAgICAgICAgCQltb3Z6d2wJJWF4LCVlY3gKLSAgNDggICAgICAgICAgICAgICAgICAgICAgIAkKLSAgNDkgMDA3MSBFQyAgICAgICAgICAgICAgICAJCWluCSVkeCwlYWwKLSAgNTAgMDA3MiA2NkVEICAgICAgICAgICAgICAJCWluCSVkeCwlYXgKLSAgNTEgMDA3NCBFRCAgICAgICAgICAgICAgICAJCWluCSVkeCwlZWF4Ci0gIDUyIDAwNzUgRUMgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVhbAotICA1MyAwMDc2IDY2RUQgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYXgKLSAgNTQgMDA3OCBFRCAgICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWVheAotICA1NSAwMDc5IEVDICAgICAgICAgICAgICAgIAkJaW5iCSVkeCwlYWwKLSAgNTYgMDA3YSA2NkVEICAgICAgICAgICAgICAJCWludwklZHgsJWF4Ci0gIDU3IDAwN2MgRUQgICAgICAgICAgICAgICAgCQlpbmwJJWR4LCVlYXgKLSAgNTggMDA3ZCBFQyAgICAgICAgICAgICAgICAJCWluYgklZHgKLSAgNTkgMDA3ZSA2NkVEICAgICAgICAgICAgICAJCWludwklZHgKLSAgNjAgMDA4MCBFRCAgICAgICAgICAgICAgICAJCWlubAklZHgKLSAgNjEgMDA4MSBFNEZGICAgICAgICAgICAgICAJCWluYglcJDI1NQotICA2MiAwMDgzIDY2RTUwMiAgICAgICAgICAgIAkJaW53CVwkMgotICA2MyAwMDg2IEU1MDQgICAgICAgICAgICAgIAkJaW5sCVwkNAotICA2NCAwMDg4IDY2RTUwRCAgICAgICAgICAgIAkJaW4JXCQxMywgJWF4Ci0gIDY1IDAwOGIgRUUgICAgICAgICAgICAgICAgCQlvdXQJJWFsLCVkeAotICA2NiAwMDhjIDY2RUYgICAgICAgICAgICAgIAkJb3V0CSVheCwlZHgKLSAgNjcgMDA4ZSBFRiAgICAgICAgICAgICAgICAJCW91dAklZWF4LCVkeAotICA2OCAwMDhmIEVFICAgICAgICAgICAgICAgIAkJb3V0CSVhbCxcKCVkeFwpCi0gIDY5IDAwOTAgNjZFRiAgICAgICAgICAgICAgCQlvdXQJJWF4LFwoJWR4XCkKLSAgNzAgMDA5MiBFRiAgICAgICAgICAgICAgICAJCW91dAklZWF4LFwoJWR4XCkKLSAgNzEgMDA5MyBFRSAgICAgICAgICAgICAgICAJCW91dGIJJWFsLCVkeAotICA3MiAwMDk0IDY2RUYgICAgICAgICAgICAgIAkJb3V0dwklYXgsJWR4Ci0gIDczIDAwOTYgRUYgICAgICAgICAgICAgICAgCQlvdXRsCSVlYXgsJWR4Ci0gIDc0IDAwOTcgRUUgICAgICAgICAgICAgICAgCQlvdXRiCSVkeAotICA3NSAwMDk4IDY2RUYgICAgICAgICAgICAgIAkJb3V0dwklZHgKLSAgNzYgMDA5YSBFRiAgICAgICAgICAgICAgICAJCW91dGwJJWR4Ci0gIDc3IDAwOWIgRTZGRiAgICAgICAgICAgICAgCQlvdXRiCVwkMjU1Ci0gIDc4IDAwOWQgNjZFNzAyICAgICAgICAgICAgCQlvdXR3CVwkMgotICA3OSAwMGEwIEU3MDQgICAgICAgICAgICAgIAkJb3V0bAlcJDQKLSAgODAgMDBhMiA2NkU3MEQgICAgICAgICAgICAJCW91dAklYXgsIFwkMTMKLSAgODEgICAgICAgICAgICAgICAgICAgICAgIAkjIFRoZXNlIGFyZSB1c2VkIGluIEFJWC4KLSAgODIgMDBhNSA2NkVEICAgICAgICAgICAgICAJCWludwlcKCVkeFwpCi0gIDgzIDAwYTcgNjZFRiAgICAgICAgICAgICAgCQlvdXR3CVwoJWR4XCkKLSAgODQgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgODUgMDBhOSBBNCAgICAgICAgICAgICAgICAJCW1vdnNiCi0gIDg2IDAwYWEgNjZBNyAgICAgICAgICAgICAgCQljbXBzdwotICA4NyAwMGFjIEFGICAgICAgICAgICAgICAgIAkJc2Nhc2wKLSAgODggMDBhZCBENyAgICAgICAgICAgICAgICAJCXhsYXRiCi0gIDg5IDAwYWUgMkVBNSAgICAgICAgICAgICAgCQltb3ZzbAklY3M6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gIDkwIDAwYjAgMEY5MzAzICAgICAgICAgICAgCQlzZXRhZQlcKCVlYnhcKQotICA5MSAwMGIzIDBGOTMwMyAgICAgICAgICAgIAkJc2V0YWViCVwoJWVieFwpCi0gIDkyIDAwYjYgMEY5M0MwICAgICAgICAgICAgCQlzZXRhZQklYWwKLSAgOTMgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgOTQgICAgICAgICAgICAgICAgICAgICAgIAkjdGhlc2Ugc2hvdWxkIGdpdmUgd2FybmluZ3MKLSAgOTUgMDBiOSAwQzAxICAgICAgICAgICAgICAJCW9yYglcJDEsJWF4Ci0uKldhcm5pbmc6LioKLSAgOTYgMDBiYiAwQzAxICAgICAgICAgICAgICAJCW9yYglcJDEsJWVheAotLipXYXJuaW5nOi4qCi0gIDk3IDAwYmQgODBDQjAxICAgICAgICAgICAgCQlvcmIJXCQxLCVieAotLipXYXJuaW5nOi4qCi0gIDk4IDAwYzAgODBDQjAxICAgICAgICAgICAgCQlvcmIJXCQxLCVlYngKLS4qV2FybmluZzouKgotICA5OSAwMGMzIEQ5QzEgICAgICAgICAgICAgIAkJZmxkbAklc3RcKDFcKQotLipXYXJuaW5nOi4qCi0gMTAwIDAwYzUgREREMiAgICAgICAgICAgICAgCQlmc3RsCSVzdFwoMlwpCi0uKldhcm5pbmc6LioKLSAxMDEgMDBjNyBERERCICAgICAgICAgICAgICAJCWZzdHBsCSVzdFwoM1wpCi0uKldhcm5pbmc6LioKLSAxMDIgMDBjOSBEOEQ0ICAgICAgICAgICAgICAJCWZjb21sCSVzdFwoNFwpCi0uKldhcm5pbmc6LioKLSAxMDMgMDBjYiBEOEREICAgICAgICAgICAgICAJCWZjb21wbAklc3RcKDVcKQotLipXYXJuaW5nOi4qCi0gMTA0IDAwY2QgREVDMSAgICAgICAgICAgICAgCQlmYWRkcAklc3RcKDFcKSwlc3QKLS4qV2FybmluZzouKgotIDEwNSAwMGNmIERFQ0EgICAgICAgICAgICAgIAkJZm11bHAJJXN0XCgyXCksJXN0Ci0uKldhcm5pbmc6LioKLSAxMDYgMDBkMSBERUUzICAgICAgICAgICAgICAJCWZzdWJwCSVzdFwoM1wpLCVzdAotLipXYXJuaW5nOi4qCi0gMTA3IDAwZDMgREVFQyAgICAgICAgICAgICAgCQlmc3VicnAJJXN0XCg0XCksJXN0Ci0uKldhcm5pbmc6LioKLSAxMDggMDBkNSBERUY1ICAgICAgICAgICAgICAJCWZkaXZwCSVzdFwoNVwpLCVzdAotLipXYXJuaW5nOi4qCi0gMTA5IDAwZDcgREVGRSAgICAgICAgICAgICAgCQlmZGl2cnAJJXN0XCg2XCksJXN0Ci0uKldhcm5pbmc6LioKLSAxMTAgMDBkOSBERUMxICAgICAgICAgICAgICAJCWZhZGQKLS4qV2FybmluZzouKgotIDExMSAwMGRiIERFRTEgICAgICAgICAgICAgIAkJZnN1YgotLipXYXJuaW5nOi4qCi0gMTEyIDAwZGQgREVDOSAgICAgICAgICAgICAgCQlmbXVsCi0uKldhcm5pbmc6LioKLSAxMTMgMDBkZiBERUYxICAgICAgICAgICAgICAJCWZkaXYKLS4qV2FybmluZzouKgotIDExNCAwMGUxIERFRTkgICAgICAgICAgICAgIAkJZnN1YnIKLS4qV2FybmluZzouKgotIDExNSAwMGUzIERFRjkgICAgICAgICAgICAgIAkJZmRpdnIKLS4qV2FybmluZzouKgotIDExNiAgICAgICAgICAgICAgICAgICAgICAgCSN0aGVzZSBzaG91bGQgYWxsIGJlIGxlZ2FsCi0gMTE3IDAwZTUgMEZBMzE1NTYgMzQxMjAwICAgCQlidGwJJWVkeCwgMHgxMjM0NTYKLSAxMTggMDBlYyAwRkEzRDAgICAgICAgICAgICAJCWJ0bAklZWR4LCAlZWF4Ci0gMTE5IDAwZWYgMEMwMSAgICAgICAgICAgICAgCQlvcmIJXCQxLCVhbAotIDEyMCAwMGYxIDgwQ0IwMSAgICAgICAgICAgIAkJb3JiCVwkMSwlYmwKLSAxMjEgMDBmNCBBMTExMDAwMCAwMCAgICAgICAJCW1vdmwJMTcsJWVheAotIDEyMiAwMGY5IEExMTEwMDAwIDAwICAgICAgIAkJbW92CTE3LCVlYXgKLSAxMjMgMDBmZSA2NkVEICAgICAgICAgICAgICAJCWludwklZHgsJWF4Ci0gMTI0IDAxMDAgRUQgICAgICAgICAgICAgICAgCQlpbmwJJWR4LCVlYXgKLSAxMjUgMDEwMSA2NkVEICAgICAgICAgICAgICAJCWludwlcKCVkeFwpLCVheAotIDEyNiAwMTAzIEVEICAgICAgICAgICAgICAgIAkJaW5sCVwoJWR4XCksJWVheAotIDEyNyAwMTA0IEVDICAgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYWwKLSAxMjggMDEwNSA2NkVEICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWF4Ci0gMTI5IDAxMDcgRUQgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVlYXgKLSAxMzAgMDEwOCAwRkI2MTQzNyAgICAgICAgICAJCW1vdnpibAlcKCVlZGksJWVzaVwpLCVlZHgKLSAxMzEgMDEwYyAwRkI2NDUxQyAgICAgICAgICAJCW1vdnpibAkyOFwoJWVicFwpLCVlYXgKLSAxMzIgMDExMCAwRkI2QzAgICAgICAgICAgICAJCW1vdnpibAklYWwsJWVheAotIDEzMyAwMTEzIDBGQjZGMSAgICAgICAgICAgIAkJbW92emJsCSVjbCwlZXNpCi0gMTM0IDAxMTYgMjZENyAgICAgICAgICAgICAgCQl4bGF0CSVlczpcKCVlYnhcKQotIDEzNSAwMTE4IEQ3ICAgICAgICAgICAgICAgIAkJeGxhdAotIDEzNiAwMTE5IEQ3ICAgICAgICAgICAgICAgIAkJeGxhdGIKLSAxMzcgMDExYSBEREQ4ICAgICAgICAgICAgICAJMToJZnN0cAklc3RcKDBcKQotIDEzOCAwMTFjIEUyRkMgICAgICAgICAgICAgIAkJbG9vcAkxYgotIDEzOSAwMTFlIEY2RjEgICAgICAgICAgICAgIAkJZGl2YiAgICAlY2wgCi0gMTQwIDAxMjAgNjZGN0YxICAgICAgICAgICAgCQlkaXZ3ICAgICVjeCAKLSAxNDEgMDEyMyBGN0YxICAgICAgICAgICAgICAJCWRpdmwgICAgJWVjeAotIDE0MiAwMTI1IEY2RjEgICAgICAgICAgICAgIAkJZGl2CSVjbAotIDE0MyAwMTI3IDY2RjdGMSAgICAgICAgICAgIAkJZGl2CSVjeAotIDE0NCAwMTJhIEY3RjEgICAgICAgICAgICAgIAkJZGl2CSVlY3gKLSAxNDUgMDEyYyBGNkYxICAgICAgICAgICAgICAJCWRpdgklY2wsJWFsCi0gMTQ2IDAxMmUgNjZGN0YxICAgICAgICAgICAgCQlkaXYJJWN4LCVheAotIDE0NyAwMTMxIEY3RjEgICAgICAgICAgICAgIAkJZGl2CSVlY3gsJWVheAotIDE0OCAwMTMzIDhFREUgICAgICAgICAgICAgIAkJbW92CSVzaSwlZHMKLSAxNDkgMDEzNSA4RURFICAgICAgICAgICAgICAJCW1vdmwJJXNpLCVkcwkJIyB3YXJuaW5nIGhlcmUKLS4qV2FybmluZzouKgotIDE1MCAwMTM3IDFFICAgICAgICAgICAgICAgIAkJcHVzaGwJJWRzCi0gMTUxIDAxMzggMUUgICAgICAgICAgICAgICAgCQlwdXNoCSVkcwotIDE1MiAwMTM5IEEwMDAwMDAwIDAwICAgICAgIAkJbW92CTAsJWFsCi0gMTUzIDAxM2UgNjZBMTAwMDAgMDEwMCAgICAgCQltb3YJMHgxMDAwMCwlYXgKLSAxNTQgMDE0NCA4OUMzICAgICAgICAgICAgICAJCW1vdgklZWF4LCVlYngKLSAxNTUgMDE0NiA5QyAgICAgICAgICAgICAgICAJCXB1c2hmCi0gMTU2IDAxNDcgOUMgICAgICAgICAgICAgICAgCQlwdXNoZmwKLSAxNTcgMDE0OCA2NjlDICAgICAgICAgICAgICAJCXB1c2hmdwotIDE1OCAwMTRhIDlEICAgICAgICAgICAgICAgIAkJcG9wZgotIDE1OSAwMTRiIDlEICAgICAgICAgICAgICAgIAkJcG9wZmwKLSAxNjAgMDE0YyA2NjlEICAgICAgICAgICAgICAJCXBvcGZ3Ci0gMTYxIDAxNGUgODkzNDFEMDAgMDAwMDAwICAgCQltb3YJJWVzaSxcKCwlZWJ4LDFcKQotIDE2MiAwMTU1IDgwMjUwMDAwIDAwMDA3RiAgIAkJYW5kYglcJH4weDgwLGZvbwotIDE2MyAgICAgICAgICAgICAgICAgICAgICAgCQotIDE2NCAgICAgICAgICAgICAgICAgICAgICAgCSNjaGVjayAxNi1iaXQgY29kZSBhdXRvIGFkZHJlc3MgcHJlZml4Ci0gMTY1ICAgICAgICAgICAgICAgICAgICAgICAJLmNvZGUxNmdjYwotIDE2NiAwMTVjIDY3NjY4RDk1IDAwRkZGRkZGIAkJbGVhbAktMjU2XCglZWJwXCksJWVkeAotIDE2NyAwMTY0IDY3ODg4NTdGIEZGRkZGRiAgIAkJbW92CSVhbCwtMTI5XCglZWJwXCkKLSAxNjggMDE2YiA2Nzg4NjU4MCAgICAgICAgICAJCW1vdgklYWgsLTEyOFwoJWVicFwpCi0gMTY5IDAxNmYgNjc2NjhEOUQgMjBGOUZGRkYgCQlsZWFsCS0xNzYwXCglZWJwXCksJWVieAotIDE3MCAwMTc3IDY3NjY4OTg0IDI0OEMwMDAwIAkJbW92bAklZWF4LDE0MFwoJWVzcFwpCi0gMTcwICAgICAgMDAKLSAxNzEgICAgICAgICAgICAgICAgICAgICAgIAkKLSAxNzIgICAgICAgICAgICAgICAgICAgICAgIAkuY29kZTMyCi0gMTczIDAxODAgRUI5OCAgICAgICAgICAgICAgCQlqbXAJMWIKLSAxNzQgMDE4MiBFOShGQ0ZGfDc5RkUpRkYgRkYgICAgICAgCQlqbXAJeHh4Ci0gMTc1IDAxODcgRkYyNTAwMDAgMDAwMCAgICAgCQlqbXAJXCp4eHgKLSAxNzYgMDE4ZCBGRjI1MDAwMCAwMDAwICAgICAJCWptcAl4eHhcKCwxXCkKLS4qV2FybmluZzouKgotIDE3NyAwMTkzIEZGRTcgICAgICAgICAgICAgIAkJam1wCVwqJWVkaQotIDE3OCAwMTk1IEZGRTcgICAgICAgICAgICAgIAkJam1wCSVlZGkKLS4qV2FybmluZzouKgotIDE3OSAwMTk3IEZGMjcgICAgICAgICAgICAgIAkJam1wCVwqXCglZWRpXCkKLSAxODAgMDE5OSBGRjI3ICAgICAgICAgICAgICAJCWptcAlcKCVlZGlcKQotLipXYXJuaW5nOi4qCi0gMTgxIDAxOWIgRkYyQ0JEMDAgMDAwMDAwICAgCQlsam1wCVwqeHh4XCgsJWVkaSw0XCkKLSAxODIgMDFhMiBGRjJDQkQwMCAwMDAwMDAgICAJCWxqbXAJeHh4XCgsJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDE4MyAwMWE5IEZGMkQwMDAwIDAwMDAgICAgIAkJbGptcAlcKnh4eAotIDE4NCAwMWFmIEZGMkQwMDAwIDAwMDAgICAgIAkJbGptcAl4eHhcKCwxXCkKLS4qV2FybmluZzouKgotIDE4NSAwMWI1IEVBMDAwMDAwIDAwMzQxMiAgIAkJbGptcAlcJDB4MTIzNCxcJHh4eAotIDE4NiAgICAgICAgICAgICAgICAgICAgICAgCQotIDE4NyAwMWJjIEU4NTlGRkZGIEZGICAgICAgIAkJY2FsbAkxYgotIDE4OCAwMWMxIEU4KEZDRkZ8M0FGRSlGRiBGRiAgICAgICAJCWNhbGwJeHh4Ci0gMTg5IDAxYzYgRkYxNTAwMDAgMDAwMCAgICAgCQljYWxsCVwqeHh4Ci0gMTkwIDAxY2MgRkYxNTAwMDAgMDAwMCAgICAgCQljYWxsCXh4eFwoLDFcKQotLipXYXJuaW5nOi4qCi0gMTkxIDAxZDIgRkZENyAgICAgICAgICAgICAgCQljYWxsCVwqJWVkaQotIDE5MiAwMWQ0IEZGRDcgICAgICAgICAgICAgIAkJY2FsbAklZWRpCi0uKldhcm5pbmc6LioKLSAxOTMgMDFkNiBGRjE3ICAgICAgICAgICAgICAJCWNhbGwJXCpcKCVlZGlcKQotIDE5NCAwMWQ4IEZGMTcgICAgICAgICAgICAgIAkJY2FsbAlcKCVlZGlcKQotLipXYXJuaW5nOi4qCi0gMTk1IDAxZGEgRkYxQ0JEMDAgMDAwMDAwICAgCQlsY2FsbAlcKnh4eFwoLCVlZGksNFwpCi0gMTk2IDAxZTEgRkYxQ0JEMDAgMDAwMDAwICAgCQlsY2FsbAl4eHhcKCwlZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTk3IDAxZTggRkYxRDAwMDAgMDAwMCAgICAgCQlsY2FsbAlcKnh4eAotIDE5OCAwMWVlIEZGMUQwMDAwIDAwMDAgICAgIAkJbGNhbGwJeHh4XCgsMVwpCi0uKldhcm5pbmc6LioKLSAxOTkgMDFmNCA5QTAwMDAwMCAwMDM0MTIgICAJCWxjYWxsCVwkMHgxMjM0LFwkeHh4Ci0gMjAwICAgICAgICAgICAgICAgICAgICAgICAJCi0gMjAxICAgICAgICAgICAgICAgICAgICAgICAJCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLSAyMDIgMDFmYiAwMDAwMDAwMCAwMCAgICAgICAJCS5wMmFsaWduCTQsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwOGRiZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwucworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0ucHNpemUgMAotLnRleHQKLSMgdGVzdCB2YXJpb3VzIHNlZ21lbnQgcmVnIGluc25zCi0JcHVzaAklZHMKLQlwdXNobAklZHMKLQlwb3AJJWRzCi0JcG9wbAklZHMKLQltb3YJJWRzLCVlYXgKLQltb3ZsCSVkcywlZWF4Ci0JbW92bAklZHMsJWF4Ci0JbW92CSVlYXgsJWRzCi0JbW92bAklYXgsJWRzCi0JbW92bAklZWF4LCVkcwotCi0JcHVzaHcJJWRzCi0JcG9wdwklZHMKLQltb3YJJWRzLCVheAotCW1vdncJJWRzLCVheAotCW1vdncJJWRzLCVlYXgKLQltb3YJJWF4LCVkcwotCW1vdncJJWF4LCVkcwotCW1vdncJJWVheCwlZHMKLQotIyB0ZXN0IHZhcmlvdXMgcHVzaGVzCi0JcHVzaGwJJDEwCi0JcHVzaHcJJDEwCi0JcHVzaAkkMTAKLQlwdXNobAkkMTAwMAotCXB1c2h3CSQxMDAwCi0JcHVzaAkkMTAwMAotCXB1c2hsCTFmCi0JcHVzaHcJMWYKLQlwdXNoCTFmCi0JcHVzaAkoMWYtLikoJWVieCkKLQlwdXNoCTFmLS4KLSMgdGhlc2UsIGFuZCBvdGhlcnMgbGlrZSB0aGVtIHNob3VsZCBoYXZlIG5vIG9wZXJhbmQgc2l6ZSBwcmVmaXgKLTE6CWxsZHQJJWN4Ci0JbG1zdwklYXgKLQotIyBKdXN0IHRvIG1ha2Ugc3VyZSB0aGVzZSBkb24ndCBiZWNvbWUgaWxsZWdhbCBkdWUgdG8gb3Zlci1lbnRodXNpYXN0aWMKLSMgcmVnaXN0ZXIgY2hlY2tpbmcKLQltb3ZzYncJJWFsLCVkaQotCW1vdnNibAklYWwsJWVjeAotCW1vdnN3bAklYXgsJWVjeAotCW1vdnpidwklYWwsJWRpCi0JbW92emJsCSVhbCwlZWN4Ci0JbW92endsCSVheCwlZWN4Ci0KLQlpbgklZHgsJWFsCi0JaW4JJWR4LCVheAotCWluCSVkeCwlZWF4Ci0JaW4JKCVkeCksJWFsCi0JaW4JKCVkeCksJWF4Ci0JaW4JKCVkeCksJWVheAotCWluYgklZHgsJWFsCi0JaW53CSVkeCwlYXgKLQlpbmwJJWR4LCVlYXgKLQlpbmIJJWR4Ci0JaW53CSVkeAotCWlubAklZHgKLQlpbmIJJDI1NQotCWludwkkMgotCWlubAkkNAotCWluCSQxMywgJWF4Ci0Jb3V0CSVhbCwlZHgKLQlvdXQJJWF4LCVkeAotCW91dAklZWF4LCVkeAotCW91dAklYWwsKCVkeCkKLQlvdXQJJWF4LCglZHgpCi0Jb3V0CSVlYXgsKCVkeCkKLQlvdXRiCSVhbCwlZHgKLQlvdXR3CSVheCwlZHgKLQlvdXRsCSVlYXgsJWR4Ci0Jb3V0YgklZHgKLQlvdXR3CSVkeAotCW91dGwJJWR4Ci0Jb3V0YgkkMjU1Ci0Jb3V0dwkkMgotCW91dGwJJDQKLQlvdXQJJWF4LCAkMTMKLSMgVGhlc2UgYXJlIHVzZWQgaW4gQUlYLgotCWludwkoJWR4KQotCW91dHcJKCVkeCkKLQotCW1vdnNiCi0JY21wc3cKLQlzY2FzbAotCXhsYXRiCi0JbW92c2wJJWNzOiglZXNpKSwlZXM6KCVlZGkpCi0Jc2V0YWUJKCVlYngpCi0Jc2V0YWViCSglZWJ4KQotCXNldGFlCSVhbAotCi0jdGhlc2Ugc2hvdWxkIGdpdmUgd2FybmluZ3MKLQlvcmIJJDEsJWF4Ci0Jb3JiCSQxLCVlYXgKLQlvcmIJJDEsJWJ4Ci0Jb3JiCSQxLCVlYngKLQlmbGRsCSVzdCgxKQotCWZzdGwJJXN0KDIpCi0JZnN0cGwJJXN0KDMpCi0JZmNvbWwJJXN0KDQpCi0JZmNvbXBsCSVzdCg1KQotCWZhZGRwCSVzdCgxKSwlc3QKLQlmbXVscAklc3QoMiksJXN0Ci0JZnN1YnAJJXN0KDMpLCVzdAotCWZzdWJycAklc3QoNCksJXN0Ci0JZmRpdnAJJXN0KDUpLCVzdAotCWZkaXZycAklc3QoNiksJXN0Ci0JZmFkZAotCWZzdWIKLQlmbXVsCi0JZmRpdgotCWZzdWJyCi0JZmRpdnIKLSN0aGVzZSBzaG91bGQgYWxsIGJlIGxlZ2FsCi0JYnRsCSVlZHgsIDB4MTIzNDU2Ci0JYnRsCSVlZHgsICVlYXgKLQlvcmIJJDEsJWFsCi0Jb3JiCSQxLCVibAotCW1vdmwJMTcsJWVheAotCW1vdgkxNywlZWF4Ci0JaW53CSVkeCwlYXgKLQlpbmwJJWR4LCVlYXgKLQlpbncJKCVkeCksJWF4Ci0JaW5sCSglZHgpLCVlYXgKLQlpbgkoJWR4KSwlYWwKLQlpbgkoJWR4KSwlYXgKLQlpbgkoJWR4KSwlZWF4Ci0JbW92emJsCSglZWRpLCVlc2kpLCVlZHgKLQltb3Z6YmwJMjgoJWVicCksJWVheAotCW1vdnpibAklYWwsJWVheAotCW1vdnpibAklY2wsJWVzaQotCXhsYXQJJWVzOiglZWJ4KQotCXhsYXQKLQl4bGF0YgotMToJZnN0cAklc3QoMCkKLQlsb29wCTFiCi0JZGl2YiAgICAlY2wgCi0JZGl2dyAgICAlY3ggCi0JZGl2bCAgICAlZWN4Ci0JZGl2CSVjbAotCWRpdgklY3gKLQlkaXYJJWVjeAotCWRpdgklY2wsJWFsCi0JZGl2CSVjeCwlYXgKLQlkaXYJJWVjeCwlZWF4Ci0JbW92CSVzaSwlZHMKLQltb3ZsCSVzaSwlZHMJCSMgd2FybmluZyBoZXJlCi0JcHVzaGwJJWRzCi0JcHVzaAklZHMKLQltb3YJMCwlYWwKLQltb3YJMHgxMDAwMCwlYXgKLQltb3YJJWVheCwlZWJ4Ci0JcHVzaGYKLQlwdXNoZmwKLQlwdXNoZncKLQlwb3BmCi0JcG9wZmwKLQlwb3BmdwotCW1vdgklZXNpLCgsJWVieCwxKQotCWFuZGIJJH4weDgwLGZvbwotCi0jY2hlY2sgMTYtYml0IGNvZGUgYXV0byBhZGRyZXNzIHByZWZpeAotLmNvZGUxNmdjYwotCWxlYWwJLTI1NiglZWJwKSwlZWR4Ci0JbW92CSVhbCwtMTI5KCVlYnApCi0JbW92CSVhaCwtMTI4KCVlYnApCi0JbGVhbAktMTc2MCglZWJwKSwlZWJ4Ci0JbW92bAklZWF4LDE0MCglZXNwKQotCi0uY29kZTMyCi0Jam1wCTFiCi0Jam1wCXh4eAotCWptcAkqeHh4Ci0Jam1wCXh4eCgsMSkKLQlqbXAJKiVlZGkKLQlqbXAJJWVkaQotCWptcAkqKCVlZGkpCi0Jam1wCSglZWRpKQotCWxqbXAJKnh4eCgsJWVkaSw0KQotCWxqbXAJeHh4KCwlZWRpLDQpCi0JbGptcAkqeHh4Ci0JbGptcAl4eHgoLDEpCi0JbGptcAkkMHgxMjM0LCR4eHgKLQotCWNhbGwJMWIKLQljYWxsCXh4eAotCWNhbGwJKnh4eAotCWNhbGwJeHh4KCwxKQotCWNhbGwJKiVlZGkKLQljYWxsCSVlZGkKLQljYWxsCSooJWVkaSkKLQljYWxsCSglZWRpKQotCWxjYWxsCSp4eHgoLCVlZGksNCkKLQlsY2FsbAl4eHgoLCVlZGksNCkKLQlsY2FsbAkqeHh4Ci0JbGNhbGwJeHh4KCwxKQotCWxjYWxsCSQweDEyMzQsJHh4eAotCi0JIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotCS5wMmFsaWduCTQsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pMzg2LmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaTM4Ni5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYWM4ZWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pMzg2LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMKLSMgaTM4NiB0ZXN0cwotIwotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gICAgc2V0IHRlc3RuYW1lICJpMzg2ICRuYW1lIgotICAgIHNldCBmaWxlICRzcmNkaXIvJHN1YmRpci8kbmFtZQotICAgIGdhc19ydW4gJHtuYW1lfS5zICRvcHRzICI+JmR1bXAub3V0IgotICAgIGlmIHsgW3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0ubCJdIH0gdGhlbiB7Ci0JZmFpbCAkdGVzdG5hbWUKLQl2ZXJib3NlICJvdXRwdXQgaXMgW2ZpbGVfY29udGVudHMgImR1bXAub3V0Il0iIDIKLQlyZXR1cm4KLSAgICB9Ci0gICAgcGFzcyAkdGVzdG5hbWUKLX0KLQotCi1pZiBbaXN0YXJnZXQgImkqODYtKi0qIl0gdGhlbiB7Ci0KLSAgICBydW5fbGlzdF90ZXN0ICJmbG9hdCIgIi1hbCIKLSAgICBydW5fbGlzdF90ZXN0ICJnZW5lcmFsIiAiLWFsIC0tbGlzdGluZy1saHMtd2lkdGg9MiIKLSAgICBydW5fbGlzdF90ZXN0ICJpbnZhbCIgIi1hbCIKLSAgICBydW5fbGlzdF90ZXN0ICJtb2RybSIgIi1hbCAtLWxpc3RpbmctbGhzLXdpZHRoPTIiCi0gICAgcnVuX2R1bXBfdGVzdCAibmFrZWQiCi0gICAgcnVuX2R1bXBfdGVzdCAib3Bjb2RlIgotICAgIHJ1bl9kdW1wX3Rlc3QgImludGVsIgotICAgIHJ1bl9kdW1wX3Rlc3QgInByZWZpeCIKLSAgICBydW5fZHVtcF90ZXN0ICJhbWQiCi0gICAgcnVuX2R1bXBfdGVzdCAia2F0bWFpIgotICAgIHJ1bl9kdW1wX3Rlc3QgImp1bXAiCi0KLSAgICAjIFRoZXNlIHRlc3RzIHJlcXVpcmUgc3VwcG9ydCBmb3IgOCBhbmQgMTYgYml0IHJlbG9jcywKLSAgICAjIHNvIHdlIG9ubHkgcnVuIHRoZW0gZm9yIEVMRiBhbmQgQ09GRiB0YXJnZXRzLgotICAgIGlmIHtbaXN0YXJnZXQgIiotKi1lbGYqIl0gfHwgW2lzdGFyZ2V0ICIqLSotbGludXgqIl0gfHwgW2lzdGFyZ2V0ICIqLSotY29mZioiXX0gdGhlbiB7Ci0JcnVuX2R1bXBfdGVzdCAicmVsb2MiCi0JcnVuX2R1bXBfdGVzdCAianVtcDE2IgotCXJ1bl9saXN0X3Rlc3QgIndoaXRlIiAiLWFsIC0tbGlzdGluZy1saHMtd2lkdGg9MyIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludGVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludGVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjBmOGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnRlbC5kCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLSNhczogLUoKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IGludGVsCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPGZvbz46Ci0gICAwOgkwMCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gICA2OgkwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICAgYzoJMDIgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICAxMjoJMDMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgMTg6CTA0IDkwIFsgCV0qYWRkICAgIFwkMHg5MCwlYWwKLSAgMWE6CTA1IDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIDFmOgkwNiBbIAldKnB1c2ggICAlZXMKLSAgMjA6CTA3IFsgCV0qcG9wICAgICVlcwotICAyMToJMDggOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICAyNzoJMDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgMmQ6CTBhIDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgMzM6CTBiIDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDM5OgkwYyA5MCBbIAldKm9yICAgICBcJDB4OTAsJWFsCi0gIDNiOgkwZCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICBcJDB4OTA5MDkwOTAsJWVheAotICA0MDoJMGUgWyAJXSpwdXNoICAgJWNzCi0gIDQxOgkxMCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDQ3OgkxMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICA0ZDoJMTIgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICA1MzoJMTMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgNTk6CTE0IDkwIFsgCV0qYWRjICAgIFwkMHg5MCwlYWwKLSAgNWI6CTE1IDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIDYwOgkxNiBbIAldKnB1c2ggICAlc3MKLSAgNjE6CTE3IFsgCV0qcG9wICAgICVzcwotICA2MjoJMTggOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICA2ODoJMTkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNmU6CTFhIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgNzQ6CTFiIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDdhOgkxYyA5MCBbIAldKnNiYiAgICBcJDB4OTAsJWFsCi0gIDdjOgkxZCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICBcJDB4OTA5MDkwOTAsJWVheAotICA4MToJMWUgWyAJXSpwdXNoICAgJWRzCi0gIDgyOgkxZiBbIAldKnBvcCAgICAlZHMKLSAgODM6CTIwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgODk6CTIxIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDhmOgkyMiA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDk1OgkyMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICA5YjoJMjQgOTAgWyAJXSphbmQgICAgXCQweDkwLCVhbAotICA5ZDoJMjUgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgYTI6CTI3IFsgCV0qZGFhICAgIAotICBhMzoJMjggOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICBhOToJMjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgYWY6CTJhIDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgYjU6CTJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIGJiOgkyYyA5MCBbIAldKnN1YiAgICBcJDB4OTAsJWFsCi0gIGJkOgkyZCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICBcJDB4OTA5MDkwOTAsJWVheAotICBjMjoJMmYgWyAJXSpkYXMgICAgCi0gIGMzOgkzMCA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGM5OgkzMSA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICBjZjoJMzIgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICBkNToJMzMgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgZGI6CTM0IDkwIFsgCV0qeG9yICAgIFwkMHg5MCwlYWwKLSAgZGQ6CTM1IDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIGUyOgkzNyBbIAldKmFhYSAgICAKLSAgZTM6CTM4IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgZTk6CTM5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGVmOgkzYSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIGY1OgkzYiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICBmYjoJM2MgOTAgWyAJXSpjbXAgICAgXCQweDkwLCVhbAotICBmZDoJM2QgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAxMDI6CTNmIFsgCV0qYWFzICAgIAotIDEwMzoJNDAgWyAJXSppbmMgICAgJWVheAotIDEwNDoJNDEgWyAJXSppbmMgICAgJWVjeAotIDEwNToJNDIgWyAJXSppbmMgICAgJWVkeAotIDEwNjoJNDMgWyAJXSppbmMgICAgJWVieAotIDEwNzoJNDQgWyAJXSppbmMgICAgJWVzcAotIDEwODoJNDUgWyAJXSppbmMgICAgJWVicAotIDEwOToJNDYgWyAJXSppbmMgICAgJWVzaQotIDEwYToJNDcgWyAJXSppbmMgICAgJWVkaQotIDEwYjoJNDggWyAJXSpkZWMgICAgJWVheAotIDEwYzoJNDkgWyAJXSpkZWMgICAgJWVjeAotIDEwZDoJNGEgWyAJXSpkZWMgICAgJWVkeAotIDEwZToJNGIgWyAJXSpkZWMgICAgJWVieAotIDEwZjoJNGMgWyAJXSpkZWMgICAgJWVzcAotIDExMDoJNGQgWyAJXSpkZWMgICAgJWVicAotIDExMToJNGUgWyAJXSpkZWMgICAgJWVzaQotIDExMjoJNGYgWyAJXSpkZWMgICAgJWVkaQotIDExMzoJNTAgWyAJXSpwdXNoICAgJWVheAotIDExNDoJNTEgWyAJXSpwdXNoICAgJWVjeAotIDExNToJNTIgWyAJXSpwdXNoICAgJWVkeAotIDExNjoJNTMgWyAJXSpwdXNoICAgJWVieAotIDExNzoJNTQgWyAJXSpwdXNoICAgJWVzcAotIDExODoJNTUgWyAJXSpwdXNoICAgJWVicAotIDExOToJNTYgWyAJXSpwdXNoICAgJWVzaQotIDExYToJNTcgWyAJXSpwdXNoICAgJWVkaQotIDExYjoJNTggWyAJXSpwb3AgICAgJWVheAotIDExYzoJNTkgWyAJXSpwb3AgICAgJWVjeAotIDExZDoJNWEgWyAJXSpwb3AgICAgJWVkeAotIDExZToJNWIgWyAJXSpwb3AgICAgJWVieAotIDExZjoJNWMgWyAJXSpwb3AgICAgJWVzcAotIDEyMDoJNWQgWyAJXSpwb3AgICAgJWVicAotIDEyMToJNWUgWyAJXSpwb3AgICAgJWVzaQotIDEyMjoJNWYgWyAJXSpwb3AgICAgJWVkaQotIDEyMzoJNjAgWyAJXSpwdXNoYSAgCi0gMTI0Ogk2MSBbIAldKnBvcGEgICAKLSAxMjU6CTYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYm91bmQgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTJiOgk2MyA5MCA5MCA5MCA5MCA5MCBbIAldKmFycGwgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTMxOgk2OCA5MCA5MCA5MCA5MCBbIAldKnB1c2ggICBcJDB4OTA5MDkwOTAKLSAxMzY6CTY5IDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHg5MDkwOTA5MCwweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDE0MDoJNmEgOTAgWyAJXSpwdXNoICAgXCQweGZmZmZmZjkwCi0gMTQyOgk2YiA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxNDk6CTZjIFsgCV0qaW5zYiAgIFwoJWR4XCksJWVzOlwoJWVkaVwpCi0gMTRhOgk2ZCBbIAldKmluc2wgICBcKCVkeFwpLCVlczpcKCVlZGlcKQotIDE0YjoJNmUgWyAJXSpvdXRzYiAgJWRzOlwoJWVzaVwpLFwoJWR4XCkKLSAxNGM6CTZmIFsgCV0qb3V0c2wgICVkczpcKCVlc2lcKSxcKCVkeFwpCi0gMTRkOgk3MCA5MCBbIAldKmpvICAgICAoMHgpP2RmLioKLSAxNGY6CTcxIDkwIFsgCV0qam5vICAgICgweCk/ZTEuKgotIDE1MToJNzIgOTAgWyAJXSpqYiAgICAgKDB4KT9lMy4qCi0gMTUzOgk3MyA5MCBbIAldKmphZSAgICAoMHgpP2U1LioKLSAxNTU6CTc0IDkwIFsgCV0qamUgICAgICgweCk/ZTcuKgotIDE1NzoJNzUgOTAgWyAJXSpqbmUgICAgKDB4KT9lOS4qCi0gMTU5Ogk3NiA5MCBbIAldKmpiZSAgICAoMHgpP2ViLioKLSAxNWI6CTc3IDkwIFsgCV0qamEgICAgICgweCk/ZWQuKgotIDE1ZDoJNzggOTAgWyAJXSpqcyAgICAgKDB4KT9lZi4qCi0gMTVmOgk3OSA5MCBbIAldKmpucyAgICAoMHgpP2YxLioKLSAxNjE6CTdhIDkwIFsgCV0qanAgICAgICgweCk/ZjMuKgotIDE2MzoJN2IgOTAgWyAJXSpqbnAgICAgKDB4KT9mNS4qCi0gMTY1Ogk3YyA5MCBbIAldKmpsICAgICAoMHgpP2Y3LioKLSAxNjc6CTdkIDkwIFsgCV0qamdlICAgICgweCk/ZjkuKgotIDE2OToJN2UgOTAgWyAJXSpqbGUgICAgKDB4KT9mYi4qCi0gMTZiOgk3ZiA5MCBbIAldKmpnICAgICAoMHgpP2ZkLioKLSAxNmQ6CTgwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjYiAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAxNzQ6CTgxIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjbCAgIFwkMHg5MDkwOTA5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAxN2U6CTgzIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjbCAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAxODU6CTg0IDkwIDkwIDkwIDkwIDkwIFsgCV0qdGVzdCAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAxOGI6CTg1IDkwIDkwIDkwIDkwIDkwIFsgCV0qdGVzdCAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTkxOgk4NiA5MCA5MCA5MCA5MCA5MCBbIAldKnhjaGcgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTk3Ogk4NyA5MCA5MCA5MCA5MCA5MCBbIAldKnhjaGcgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDE5ZDoJODggOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDFhMzoJODkgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxYTk6CThhIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAxYWY6CThiIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMWI1Ogk4YyA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmwgICAlc3MsMHg5MDkwOTA5MFwoJWVheFwpCi0gMWJiOgk4ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmxlYSAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDFjMToJOGUgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZsICAgMHg5MDkwOTA5MFwoJWVheFwpLCVzcwotIDFjNzoJOGYgODAgOTAgOTAgOTAgOTAgWyAJXSpwb3BsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMWNkOgk5MCBbIAldKm5vcCAgICAKLSAxY2U6CTkxIFsgCV0qeGNoZyAgICVlYXgsJWVjeAotIDFjZjoJOTIgWyAJXSp4Y2hnICAgJWVheCwlZWR4Ci0gMWQwOgk5MyBbIAldKnhjaGcgICAlZWF4LCVlYngKLSAxZDE6CTk0IFsgCV0qeGNoZyAgICVlYXgsJWVzcAotIDFkMjoJOTUgWyAJXSp4Y2hnICAgJWVheCwlZWJwCi0gMWQzOgk5NiBbIAldKnhjaGcgICAlZWF4LCVlc2kKLSAxZDQ6CTk3IFsgCV0qeGNoZyAgICVlYXgsJWVkaQotIDFkNToJOTggWyAJXSpjd3RsICAgCi0gMWQ2Ogk5OSBbIAldKmNsdGQgICAKLSAxZDc6CTlhIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGNhbGwgIFwkMHg5MDkwLFwkMHg5MDkwOTA5MAotIDFkZToJOWIgWyAJXSpmd2FpdAotIDFkZjoJOWMgWyAJXSpwdXNoZiAgCi0gMWUwOgk5ZCBbIAldKnBvcGYgICAKLSAxZTE6CTllIFsgCV0qc2FoZiAgIAotIDFlMjoJOWYgWyAJXSpsYWhmICAgCi0gMWUzOglhMCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwLCVhbAotIDFlODoJYTEgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MCwlZWF4Ci0gMWVkOglhMiA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlYWwsMHg5MDkwOTA5MAotIDFmMjoJYTMgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWVheCwweDkwOTA5MDkwCi0gMWY3OglhNCBbIAldKm1vdnNiICAlZHM6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gMWY4OglhNSBbIAldKm1vdnNsICAlZHM6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gMWY5OglhNiBbIAldKmNtcHNiICAlZXM6XCglZWRpXCksJWRzOlwoJWVzaVwpCi0gMWZhOglhNyBbIAldKmNtcHNsICAlZXM6XCglZWRpXCksJWRzOlwoJWVzaVwpCi0gMWZiOglhOCA5MCBbIAldKnRlc3QgICBcJDB4OTAsJWFsCi0gMWZkOglhOSA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICBcJDB4OTA5MDkwOTAsJWVheAotIDIwMjoJYWEgWyAJXSpzdG9zICAgJWFsLCVlczpcKCVlZGlcKQotIDIwMzoJYWIgWyAJXSpzdG9zICAgJWVheCwlZXM6XCglZWRpXCkKLSAyMDQ6CWFjIFsgCV0qbG9kcyAgICVkczpcKCVlc2lcKSwlYWwKLSAyMDU6CWFkIFsgCV0qbG9kcyAgICVkczpcKCVlc2lcKSwlZWF4Ci0gMjA2OglhZSBbIAldKnNjYXMgICAlZXM6XCglZWRpXCksJWFsCi0gMjA3OglhZiBbIAldKnNjYXMgICAlZXM6XCglZWRpXCksJWVheAotIDIwODoJYjAgOTAgWyAJXSptb3YgICAgXCQweDkwLCVhbAotIDIwYToJYjEgOTAgWyAJXSptb3YgICAgXCQweDkwLCVjbAotIDIwYzoJYjIgOTAgWyAJXSptb3YgICAgXCQweDkwLCVkbAotIDIwZToJYjMgOTAgWyAJXSptb3YgICAgXCQweDkwLCVibAotIDIxMDoJYjQgOTAgWyAJXSptb3YgICAgXCQweDkwLCVhaAotIDIxMjoJYjUgOTAgWyAJXSptb3YgICAgXCQweDkwLCVjaAotIDIxNDoJYjYgOTAgWyAJXSptb3YgICAgXCQweDkwLCVkaAotIDIxNjoJYjcgOTAgWyAJXSptb3YgICAgXCQweDkwLCViaAotIDIxODoJYjggOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAyMWQ6CWI5IDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWN4Ci0gMjIyOgliYSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVkeAotIDIyNzoJYmIgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlYngKLSAyMmM6CWJjIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZXNwCi0gMjMxOgliZCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVicAotIDIzNjoJYmUgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlc2kKLSAyM2I6CWJmIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWRpCi0gMjQwOgljMCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGIgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjQ3OgljMSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGwgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjRlOgljMiA5MCA5MCBbIAldKnJldCAgICBcJDB4OTA5MAotIDI1MToJYzMgWyAJXSpyZXQgICAgCi0gMjUyOgljNCA5MCA5MCA5MCA5MCA5MCBbIAldKmxlcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDI1ODoJYzUgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZHMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAyNWU6CWM2IDgwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92YiAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAyNjU6CWM3IDgwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92bCAgIFwkMHg5MDkwOTA5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAyNmY6CWM4IDkwIDkwIDkwIFsgCV0qZW50ZXIgIFwkMHg5MDkwLFwkMHg5MAotIDI3MzoJYzkgWyAJXSpsZWF2ZSAgCi0gMjc0OgljYSA5MCA5MCBbIAldKmxyZXQgICBcJDB4OTA5MAotIDI3NzoJY2IgWyAJXSpscmV0ICAgCi0gMjc4OgljYyBbIAldKmludDMgICAKLSAyNzk6CWNkIDkwIFsgCV0qaW50ICAgIFwkMHg5MAotIDI3YjoJY2UgWyAJXSppbnRvICAgCi0gMjdjOgljZiBbIAldKmlyZXQgICAKLSAyN2Q6CWQwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsYiAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDI4MzoJZDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMjg5OglkMiA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGIgICAlY2wsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjhmOglkMyA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGwgICAlY2wsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjk1OglkNCA5MCBbIAldKmFhbSAgICBcJDB4ZmZmZmZmOTAKLSAyOTc6CWQ1IDkwIFsgCV0qYWFkICAgIFwkMHhmZmZmZmY5MAotIDI5OToJZDcgWyAJXSp4bGF0ICAgJWRzOlwoJWVieFwpCi0gMjlhOglkOCA5MCA5MCA5MCA5MCA5MCBbIAldKmZjb21zICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYTA6CWQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qZnN0cyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJhNjoJZGEgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaWNvbWwgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmFjOglkYiA5MCA5MCA5MCA5MCA5MCBbIAldKmZpc3RsICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYjI6CWRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmNvbWwgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJiODoJZGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpmc3RsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmJlOglkZSA5MCA5MCA5MCA5MCA5MCBbIAldKmZpY29tICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYzQ6CWRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmlzdCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJjYToJZTAgOTAgWyAJXSpsb29wbmUgKDB4KT8yNWMuKgotIDJjYzoJZTEgOTAgWyAJXSpsb29wZSAgKDB4KT8yNWUuKgotIDJjZToJZTIgOTAgWyAJXSpsb29wICAgKDB4KT8yNjAuKgotIDJkMDoJZTMgOTAgWyAJXSpqZWN4eiAgKDB4KT8yNjIuKgotIDJkMjoJZTQgOTAgWyAJXSppbiAgICAgXCQweDkwLCVhbAotIDJkNDoJZTUgOTAgWyAJXSppbiAgICAgXCQweDkwLCVlYXgKLSAyZDY6CWU2IDkwIFsgCV0qb3V0ICAgICVhbCxcJDB4OTAKLSAyZDg6CWU3IDkwIFsgCV0qb3V0ICAgICVlYXgsXCQweDkwCi0gMmRhOgllOCA5MCA5MCA5MCA5MCBbIAldKmNhbGwgICAoMHgpPzkwOTA5MzZmLioKLSAyZGY6CWU5IDkwIDkwIDkwIDkwIFsgCV0qam1wICAgICgweCk/OTA5MDkzNzQuKgotIDJlNDoJZWEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpsam1wICAgXCQweDkwOTAsXCQweDkwOTA5MDkwCi0gMmViOgllYiA5MCBbIAldKmptcCAgICAoMHgpPzI3ZC4qCi0gMmVkOgllYyBbIAldKmluICAgICBcKCVkeFwpLCVhbAotIDJlZToJZWQgWyAJXSppbiAgICAgXCglZHhcKSwlZWF4Ci0gMmVmOgllZSBbIAldKm91dCAgICAlYWwsXCglZHhcKQotIDJmMDoJZWYgWyAJXSpvdXQgICAgJWVheCxcKCVkeFwpCi0gMmYxOglmNCBbIAldKmhsdCAgICAKLSAyZjI6CWY1IFsgCV0qY21jICAgIAotIDJmMzoJZjYgOTAgOTAgOTAgOTAgOTAgWyAJXSpub3RiICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmY5OglmNyA5MCA5MCA5MCA5MCA5MCBbIAldKm5vdGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyZmY6CWY4IFsgCV0qY2xjICAgIAotIDMwMDoJZjkgWyAJXSpzdGMgICAgCi0gMzAxOglmYSBbIAldKmNsaSAgICAKLSAzMDI6CWZiIFsgCV0qc3RpICAgIAotIDMwMzoJZmMgWyAJXSpjbGQgICAgCi0gMzA0OglmZCBbIAldKnN0ZCAgICAKLSAzMDU6CWZmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY2FsbCAgIFwqMHg5MDkwOTA5MFwoJWVheFwpCi0gMzBiOgkwZiAwMCA5MCA5MCA5MCA5MCA5MCBbIAldKmxsZHQgICAweDkwOTA5MDkwXCglZWF4XCkKLSAzMTI6CTBmIDAxIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGdkdCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDMxOToJMGYgMDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpsYXIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzMjA6CTBmIDAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNsICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzI3OgkwZiAwNiBbIAldKmNsdHMgICAKLSAzMjk6CTBmIDA4IFsgCV0qaW52ZCAgIAotIDMyYjoJMGYgMDkgWyAJXSp3YmludmQgCi0gMzJkOgkwZiAwYiBbIAldKnVkMmEgICAKLSAzMmY6CTBmIDIwIGQwIFsgCV0qbW92ICAgICVjcjIsJWVheAotIDMzMjoJMGYgMjEgZDAgWyAJXSptb3YgICAgJWRiMiwlZWF4Ci0gMzM1OgkwZiAyMiBkMCBbIAldKm1vdiAgICAlZWF4LCVjcjIKLSAzMzg6CTBmIDIzIGQwIFsgCV0qbW92ICAgICVlYXgsJWRiMgotIDMzYjoJMGYgMjQgZDAgWyAJXSptb3YgICAgJXRyMiwlZWF4Ci0gMzNlOgkwZiAyNiBkMCBbIAldKm1vdiAgICAlZWF4LCV0cjIKLSAzNDE6CTBmIDMwIFsgCV0qd3Jtc3IgIAotIDM0MzoJMGYgMzEgWyAJXSpyZHRzYyAgCi0gMzQ1OgkwZiAzMiBbIAldKnJkbXNyICAKLSAzNDc6CTBmIDMzIFsgCV0qcmRwbWMgIAotIDM0OToJMGYgNDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92byAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNTA6CTBmIDQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5vIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzU3OgkwZiA0MiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZiICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM1ZToJMGYgNDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YWUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNjU6CTBmIDQ0IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmUgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzZjOgkwZiA0NSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZuZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM3MzoJMGYgNDYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YmUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzN2E6CTBmIDQ3IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmEgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzgxOgkwZiA0OCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZzICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM4ODoJMGYgNDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnMgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzOGY6CTBmIDRhIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzk2OgkwZiA0YiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZucCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM5ZDoJMGYgNGMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bCAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzYTQ6CTBmIDRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmdlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2FiOgkwZiA0ZSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZsZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDNiMjoJMGYgNGYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZyAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzYjk6CTBmIDYwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNrbGJ3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2MwOgkwZiA2MSA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2x3ZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNjNzoJMGYgNjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tsZHEgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzY2U6CTBmIDYzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFja3Nzd2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZDU6CTBmIDY0IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGd0YiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNkYzoJMGYgNjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZ3R3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2UzOgkwZiA2NiA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBndGQgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZWE6CTBmIDY3IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFja3Vzd2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZjE6CTBmIDY4IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNraGJ3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2Y4OgkwZiA2OSA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2h3ZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNmZjoJMGYgNmEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2toZHEgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MDY6CTBmIDZiIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFja3NzZHcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MGQ6CTBmIDZlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ZCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDE0OgkwZiA2ZiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnEgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQxYjoJMGYgNzEgZDAgOTAgWyAJXSpwc3JsdyAgXCQweDkwLCVtbTAKLSA0MWY6CTBmIDcyIGQwIDkwIFsgCV0qcHNybGQgIFwkMHg5MCwlbW0wCi0gNDIzOgkwZiA3MyBkMCA5MCBbIAldKnBzcmxxICBcJDB4OTAsJW1tMAotIDQyNzoJMGYgNzQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZXFiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDJlOgkwZiA3NSA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBlcXcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MzU6CTBmIDc2IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGVxZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQzYzoJMGYgNzcgWyAJXSplbW1zICAgCi0gNDNlOgkwZiA3ZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmQgICAlbW0yLDB4OTA5MDkwOTBcKCVlYXhcKQotIDQ0NToJMGYgN2YgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZxICAgJW1tMiwweDkwOTA5MDkwXCglZWF4XCkKLSA0NGM6CTBmIDgwIDkwIDkwIDkwIDkwIFsgCV0qam8gICAgICgweCk/OTA5MDk0ZTIuKgotIDQ1MjoJMGYgODEgOTAgOTAgOTAgOTAgWyAJXSpqbm8gICAgKDB4KT85MDkwOTRlOC4qCi0gNDU4OgkwZiA4MiA5MCA5MCA5MCA5MCBbIAldKmpiICAgICAoMHgpPzkwOTA5NGVlLioKLSA0NWU6CTBmIDgzIDkwIDkwIDkwIDkwIFsgCV0qamFlICAgICgweCk/OTA5MDk0ZjQuKgotIDQ2NDoJMGYgODQgOTAgOTAgOTAgOTAgWyAJXSpqZSAgICAgKDB4KT85MDkwOTRmYS4qCi0gNDZhOgkwZiA4NSA5MCA5MCA5MCA5MCBbIAldKmpuZSAgICAoMHgpPzkwOTA5NTAwLioKLSA0NzA6CTBmIDg2IDkwIDkwIDkwIDkwIFsgCV0qamJlICAgICgweCk/OTA5MDk1MDYuKgotIDQ3NjoJMGYgODcgOTAgOTAgOTAgOTAgWyAJXSpqYSAgICAgKDB4KT85MDkwOTUwYy4qCi0gNDdjOgkwZiA4OCA5MCA5MCA5MCA5MCBbIAldKmpzICAgICAoMHgpPzkwOTA5NTEyLioKLSA0ODI6CTBmIDg5IDkwIDkwIDkwIDkwIFsgCV0qam5zICAgICgweCk/OTA5MDk1MTguKgotIDQ4ODoJMGYgOGEgOTAgOTAgOTAgOTAgWyAJXSpqcCAgICAgKDB4KT85MDkwOTUxZS4qCi0gNDhlOgkwZiA4YiA5MCA5MCA5MCA5MCBbIAldKmpucCAgICAoMHgpPzkwOTA5NTI0LioKLSA0OTQ6CTBmIDhjIDkwIDkwIDkwIDkwIFsgCV0qamwgICAgICgweCk/OTA5MDk1MmEuKgotIDQ5YToJMGYgOGQgOTAgOTAgOTAgOTAgWyAJXSpqZ2UgICAgKDB4KT85MDkwOTUzMC4qCi0gNGEwOgkwZiA4ZSA5MCA5MCA5MCA5MCBbIAldKmpsZSAgICAoMHgpPzkwOTA5NTM2LioKLSA0YTY6CTBmIDhmIDkwIDkwIDkwIDkwIFsgCV0qamcgICAgICgweCk/OTA5MDk1M2MuKgotIDRhYzoJMGYgOTAgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRvICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGIzOgkwZiA5MSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5vICAweDkwOTA5MDkwXCglZWF4XCkKLSA0YmE6CTBmIDkyIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YiAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRjMToJMGYgOTMgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRhZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGM4OgkwZiA5NCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGUgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0Y2Y6CTBmIDk1IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bmUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRkNjoJMGYgOTYgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRiZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGRkOgkwZiA5NyA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGEgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZTQ6CTBmIDk4IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0cyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRlYjoJMGYgOTkgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRucyAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGYyOgkwZiA5YSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldHAgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0Zjk6CTBmIDliIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bnAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUwMDoJMGYgOWMgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTA3OgkwZiA5ZCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGdlICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MGU6CTBmIDllIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bGUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUxNToJMGYgOWYgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRnICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTFjOgkwZiBhMCBbIAldKnB1c2ggICAlZnMKLSA1MWU6CTBmIGExIFsgCV0qcG9wICAgICVmcwotIDUyMDoJMGYgYTIgWyAJXSpjcHVpZCAgCi0gNTIyOgkwZiBhMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ICAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDUyOToJMGYgYTQgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgXCQweDkwLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTMxOgkwZiBhNSA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICAlY2wsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Mzg6CTBmIGE4IFsgCV0qcHVzaCAgICVncwotIDUzYToJMGYgYTkgWyAJXSpwb3AgICAgJWdzCi0gNTNjOgkwZiBhYSBbIAldKnJzbSAgICAKLSA1M2U6CTBmIGFiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRzICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTQ1OgkwZiBhYyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICBcJDB4OTAsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1NGQ6CTBmIGFkIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hyZCAgICVjbCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU1NDoJMGYgYWYgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1NWI6CTBmIGIwIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21weGNoZyAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTYyOgkwZiBiMSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcHhjaGcgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Njk6CTBmIGIyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTcwOgkwZiBiMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ciAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU3NzoJMGYgYjQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZnMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1N2U6CTBmIGI1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGdzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTg1OgkwZiBiNiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnpibCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU4YzoJMGYgYjcgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z6d2wgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1OTM6CTBmIGI5IFsgCV0qdWQyYiAgIAotIDU5NToJMGYgYmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpidGMgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1OWM6CTBmIGJjIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNmICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNWEzOgkwZiBiZCA5MCA5MCA5MCA5MCA5MCBbIAldKmJzciAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDVhYToJMGYgYmUgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZzYmwgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1YjE6CTBmIGJmIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92c3dsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNWI4OgkwZiBjMCA5MCA5MCA5MCA5MCA5MCBbIAldKnhhZGQgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gNWJmOgkwZiBjMSA5MCA5MCA5MCA5MCA5MCBbIAldKnhhZGQgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDVjNjoJMGYgYzggWyAJXSpic3dhcCAgJWVheAotIDVjODoJMGYgYzkgWyAJXSpic3dhcCAgJWVjeAotIDVjYToJMGYgY2EgWyAJXSpic3dhcCAgJWVkeAotIDVjYzoJMGYgY2IgWyAJXSpic3dhcCAgJWVieAotIDVjZToJMGYgY2MgWyAJXSpic3dhcCAgJWVzcAotIDVkMDoJMGYgY2QgWyAJXSpic3dhcCAgJWVicAotIDVkMjoJMGYgY2UgWyAJXSpic3dhcCAgJWVzaQotIDVkNDoJMGYgY2YgWyAJXSpic3dhcCAgJWVkaQotIDVkNjoJMGYgZDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JsdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1ZGQ6CTBmIGQyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNybGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWU0OgkwZiBkMyA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmxxICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVlYjoJMGYgZDUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwbXVsbHcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1ZjI6CTBmIGQ4IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnVzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVmOToJMGYgZDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3VidXN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjAwOgkwZiBkYiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhbmQgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYwNzoJMGYgZGMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdXNiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjBlOgkwZiBkZCA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGR1c3cgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MTU6CTBmIGRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFuZG4gIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjFjOgkwZiBlMSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmF3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYyMzoJMGYgZTIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JhZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MmE6CTBmIGU1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcG11bGh3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjMxOgkwZiBlOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYzODoJMGYgZTkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3Vic3cgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2M2Y6CTBmIGViIDkwIDkwIDkwIDkwIDkwIFsgCV0qcG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjQ2OgkwZiBlYyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY0ZDoJMGYgZWQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkc3cgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NTQ6CTBmIGVmIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHhvciAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjViOgkwZiBmMSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzbGx3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY2MjoJMGYgZjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc2xsZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2Njk6CTBmIGYzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNsbHEgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjcwOgkwZiBmNSA5MCA5MCA5MCA5MCA5MCBbIAldKnBtYWRkd2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2Nzc6CTBmIGY4IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YmIgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjdlOgkwZiBmOSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJ3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY4NToJMGYgZmEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3ViZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2OGM6CTBmIGZjIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZGIgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjkzOgkwZiBmZCA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGR3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY5YToJMGYgZmUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2YTE6CTY2IDAxIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2YTg6CTY2IDAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA2YWY6CTY2IDA1IDkwIDkwIFsgCV0qYWRkICAgIFwkMHg5MDkwLCVheAotIDZiMzoJNjYgMDYgWyAJXSpwdXNodyAgJWVzCi0gNmI1Ogk2NiAwNyBbIAldKnBvcHcgICAlZXMKLSA2Yjc6CTY2IDA5IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2YmU6CTY2IDBiIDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA2YzU6CTY2IDBkIDkwIDkwIFsgCV0qb3IgICAgIFwkMHg5MDkwLCVheAotIDZjOToJNjYgMGUgWyAJXSpwdXNodyAgJWNzCi0gNmNiOgk2NiAxMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmQyOgk2NiAxMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmQ5Ogk2NiAxNSA5MCA5MCBbIAldKmFkYyAgICBcJDB4OTA5MCwlYXgKLSA2ZGQ6CTY2IDE2IFsgCV0qcHVzaHcgICVzcwotIDZkZjoJNjYgMTcgWyAJXSpwb3B3ICAgJXNzCi0gNmUxOgk2NiAxOSA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmU4Ogk2NiAxYiA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmVmOgk2NiAxZCA5MCA5MCBbIAldKnNiYiAgICBcJDB4OTA5MCwlYXgKLSA2ZjM6CTY2IDFlIFsgCV0qcHVzaHcgICVkcwotIDZmNToJNjYgMWYgWyAJXSpwb3B3ICAgJWRzCi0gNmY3Ogk2NiAyMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmZlOgk2NiAyMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzA1Ogk2NiAyNSA5MCA5MCBbIAldKmFuZCAgICBcJDB4OTA5MCwlYXgKLSA3MDk6CTY2IDI5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3MTA6CTY2IDJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3MTc6CTY2IDJkIDkwIDkwIFsgCV0qc3ViICAgIFwkMHg5MDkwLCVheAotIDcxYjoJNjYgMzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDcyMjoJNjYgMzMgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDcyOToJNjYgMzUgOTAgOTAgWyAJXSp4b3IgICAgXCQweDkwOTAsJWF4Ci0gNzJkOgk2NiAzOSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNzM0Ogk2NiAzYiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzNiOgk2NiAzZCA5MCA5MCBbIAldKmNtcCAgICBcJDB4OTA5MCwlYXgKLSA3M2Y6CTY2IDQwIFsgCV0qaW5jICAgICVheAotIDc0MToJNjYgNDEgWyAJXSppbmMgICAgJWN4Ci0gNzQzOgk2NiA0MiBbIAldKmluYyAgICAlZHgKLSA3NDU6CTY2IDQzIFsgCV0qaW5jICAgICVieAotIDc0NzoJNjYgNDQgWyAJXSppbmMgICAgJXNwCi0gNzQ5Ogk2NiA0NSBbIAldKmluYyAgICAlYnAKLSA3NGI6CTY2IDQ2IFsgCV0qaW5jICAgICVzaQotIDc0ZDoJNjYgNDcgWyAJXSppbmMgICAgJWRpCi0gNzRmOgk2NiA0OCBbIAldKmRlYyAgICAlYXgKLSA3NTE6CTY2IDQ5IFsgCV0qZGVjICAgICVjeAotIDc1MzoJNjYgNGEgWyAJXSpkZWMgICAgJWR4Ci0gNzU1Ogk2NiA0YiBbIAldKmRlYyAgICAlYngKLSA3NTc6CTY2IDRjIFsgCV0qZGVjICAgICVzcAotIDc1OToJNjYgNGQgWyAJXSpkZWMgICAgJWJwCi0gNzViOgk2NiA0ZSBbIAldKmRlYyAgICAlc2kKLSA3NWQ6CTY2IDRmIFsgCV0qZGVjICAgICVkaQotIDc1ZjoJNjYgNTAgWyAJXSpwdXNoICAgJWF4Ci0gNzYxOgk2NiA1MSBbIAldKnB1c2ggICAlY3gKLSA3NjM6CTY2IDUyIFsgCV0qcHVzaCAgICVkeAotIDc2NToJNjYgNTMgWyAJXSpwdXNoICAgJWJ4Ci0gNzY3Ogk2NiA1NCBbIAldKnB1c2ggICAlc3AKLSA3Njk6CTY2IDU1IFsgCV0qcHVzaCAgICVicAotIDc2YjoJNjYgNTYgWyAJXSpwdXNoICAgJXNpCi0gNzZkOgk2NiA1NyBbIAldKnB1c2ggICAlZGkKLSA3NmY6CTY2IDU4IFsgCV0qcG9wICAgICVheAotIDc3MToJNjYgNTkgWyAJXSpwb3AgICAgJWN4Ci0gNzczOgk2NiA1YSBbIAldKnBvcCAgICAlZHgKLSA3NzU6CTY2IDViIFsgCV0qcG9wICAgICVieAotIDc3NzoJNjYgNWMgWyAJXSpwb3AgICAgJXNwCi0gNzc5Ogk2NiA1ZCBbIAldKnBvcCAgICAlYnAKLSA3N2I6CTY2IDVlIFsgCV0qcG9wICAgICVzaQotIDc3ZDoJNjYgNWYgWyAJXSpwb3AgICAgJWRpCi0gNzdmOgk2NiA2MCBbIAldKnB1c2hhdyAKLSA3ODE6CTY2IDYxIFsgCV0qcG9wYXcgIAotIDc4MzoJNjYgNjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpib3VuZCAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDc4YToJNjYgNjggOTAgOTAgWyAJXSpwdXNodyAgXCQweDkwOTAKLSA3OGU6CTY2IDY5IDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3OTc6CTY2IDZhIDkwIFsgCV0qcHVzaHcgIFwkMHhmZmZmZmY5MAotIDc5YToJNjYgNmIgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3YTI6CTY2IDZkIFsgCV0qaW5zdyAgIFwoJWR4XCksJWVzOlwoJWVkaVwpCi0gN2E0Ogk2NiA2ZiBbIAldKm91dHN3ICAlZHM6XCglZXNpXCksXCglZHhcKQotIDdhNjoJNjYgODEgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGN3ICAgXCQweDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2FmOgk2NiA4MyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY3cgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2I3Ogk2NiA4NSA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2JlOgk2NiA4NyA5MCA5MCA5MCA5MCA5MCBbIAldKnhjaGcgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2M1Ogk2NiA4OSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2NjOgk2NiA4YiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gN2QzOgk2NiA4YyA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdncgICAlc3MsMHg5MDkwOTA5MFwoJWVheFwpCi0gN2RhOgk2NiA4ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmxlYSAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gN2UxOgk2NiA4ZiA4MCA5MCA5MCA5MCA5MCBbIAldKnBvcHcgICAweDkwOTA5MDkwXCglZWF4XCkKLSA3ZTg6CTY2IDkxIFsgCV0qeGNoZyAgICVheCwlY3gKLSA3ZWE6CTY2IDkyIFsgCV0qeGNoZyAgICVheCwlZHgKLSA3ZWM6CTY2IDkzIFsgCV0qeGNoZyAgICVheCwlYngKLSA3ZWU6CTY2IDk0IFsgCV0qeGNoZyAgICVheCwlc3AKLSA3ZjA6CTY2IDk1IFsgCV0qeGNoZyAgICVheCwlYnAKLSA3ZjI6CTY2IDk2IFsgCV0qeGNoZyAgICVheCwlc2kKLSA3ZjQ6CTY2IDk3IFsgCV0qeGNoZyAgICVheCwlZGkKLSA3ZjY6CTY2IDk4IFsgCV0qY2J0dyAgIAotIDdmODoJNjYgOTkgWyAJXSpjd3RkICAgCi0gN2ZhOgk2NiA5YSA5MCA5MCA5MCA5MCBbIAldKmxjYWxsdyBcJDB4OTA5MCxcJDB4OTA5MAotIDgwMDoJNjYgOWMgWyAJXSpwdXNoZncgCi0gODAyOgk2NiA5ZCBbIAldKnBvcGZ3ICAKLSA4MDQ6CTY2IGExIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTAsJWF4Ci0gODBhOgk2NiBhMyA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlYXgsMHg5MDkwOTA5MAotIDgxMDoJNjYgYTUgWyAJXSptb3ZzdyAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQotIDgxMjoJNjYgYTcgWyAJXSpjbXBzdyAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQotIDgxNDoJNjYgYTkgOTAgOTAgWyAJXSp0ZXN0ICAgXCQweDkwOTAsJWF4Ci0gODE4Ogk2NiBhYiBbIAldKnN0b3MgICAlYXgsJWVzOlwoJWVkaVwpCi0gODFhOgk2NiBhZCBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWF4Ci0gODFjOgk2NiBhZiBbIAldKnNjYXMgICAlZXM6XCglZWRpXCksJWF4Ci0gODFlOgk2NiBiOCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlYXgKLSA4MjI6CTY2IGI5IDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVjeAotIDgyNjoJNjYgYmEgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWR4Ci0gODJhOgk2NiBiYiA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlYngKLSA4MmU6CTY2IGJjIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVzcAotIDgzMjoJNjYgYmQgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWJwCi0gODM2Ogk2NiBiZSA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlc2kKLSA4M2E6CTY2IGJmIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVkaQotIDgzZToJNjYgYzEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2x3ICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDg0NjoJNjYgYzIgOTAgOTAgWyAJXSpyZXR3ICAgXCQweDkwOTAKLSA4NGE6CTY2IGMzIFsgCV0qcmV0dyAgIAotIDg0YzoJNjYgYzQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZXMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDg1MzoJNjYgYzUgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZHMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDg1YToJNjYgYzcgODAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z3ICAgXCQweDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gODYzOgk2NiBjOCA5MCA5MCA5MCBbIAldKmVudGVydyBcJDB4OTA5MCxcJDB4OTAKLSA4Njg6CTY2IGM5IFsgCV0qbGVhdmV3IAotIDg2YToJNjYgY2EgOTAgOTAgWyAJXSpscmV0dyAgXCQweDkwOTAKLSA4NmU6CTY2IGNiIFsgCV0qbHJldHcgIAotIDg3MDoJNjYgY2YgWyAJXSppcmV0dyAgCi0gODcyOgk2NiBkMSA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbHcgICAweDkwOTA5MDkwXCglZWF4XCkKLSA4Nzk6CTY2IGQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsdyAgICVjbCwweDkwOTA5MDkwXCglZWF4XCkKLSA4ODA6CTY2IGU1IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlYXgKLSA4ODM6CTY2IGU3IDkwIFsgCV0qb3V0ICAgICVheCxcJDB4OTAKLSA4ODY6CTY2IGU4IDhmIDkwIFsgCV0qY2FsbHcgICgweCk/OTkxOS4qCi0gODhhOgk2NiBlYSA5MCA5MCA5MCA5MCBbIAldKmxqbXB3ICBcJDB4OTA5MCxcJDB4OTA5MAotIDg5MDoJNjYgZWQgWyAJXSppbiAgICAgXCglZHhcKSwlYXgKLSA4OTI6CTY2IGVmIFsgCV0qb3V0ICAgICVheCxcKCVkeFwpCi0gODk0Ogk2NiBmNyA5MCA5MCA5MCA5MCA5MCBbIAldKm5vdHcgICAweDkwOTA5MDkwXCglZWF4XCkKLSA4OWI6CTY2IGZmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY2FsbHcgIFwqMHg5MDkwOTA5MFwoJWVheFwpCi0gOGEyOgk2NiAwZiAwMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxhciAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGFhOgk2NiAwZiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmxzbCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGIyOgk2NiAwZiA0MCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZvICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGJhOgk2NiAwZiA0MSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZubyAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGMyOgk2NiAwZiA0MiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZiICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGNhOgk2NiAwZiA0MyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGQyOgk2NiAwZiA0NCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZlICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGRhOgk2NiAwZiA0NSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZuZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGUyOgk2NiAwZiA0NiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZiZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGVhOgk2NiAwZiA0NyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGYyOgk2NiAwZiA0OCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZzICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOGZhOgk2NiAwZiA0OSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZucyAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTAyOgk2NiAwZiA0YSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZwICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTBhOgk2NiAwZiA0YiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZucCAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTEyOgk2NiAwZiA0YyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZsICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTFhOgk2NiAwZiA0ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTIyOgk2NiAwZiA0ZSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZsZSAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTJhOgk2NiAwZiA0ZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTMyOgk2NiAwZiBhMCBbIAldKnB1c2h3ICAlZnMKLSA5MzU6CTY2IDBmIGExIFsgCV0qcG9wdyAgICVmcwotIDkzODoJNjYgMGYgYTMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidCAgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk0MDoJNjYgMGYgYTQgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgXCQweDkwLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NDk6CTY2IDBmIGE1IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgICVjbCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTUxOgk2NiAwZiBhOCBbIAldKnB1c2h3ICAlZ3MKLSA5NTQ6CTY2IDBmIGE5IFsgCV0qcG9wdyAgICVncwotIDk1NzoJNjYgMGYgYWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHMgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk1ZjoJNjYgMGYgYWMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgXCQweDkwLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5Njg6CTY2IDBmIGFkIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hyZCAgICVjbCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTcwOgk2NiAwZiBhZiA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTc4Ogk2NiAwZiBiMSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcHhjaGcgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk4MDoJNjYgMGYgYjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpsc3MgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDk4ODoJNjYgMGYgYjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHIgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk5MDoJNjYgMGYgYjQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZnMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDk5ODoJNjYgMGYgYjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZ3MgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDlhMDoJNjYgMGYgYjYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z6YncgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDlhODoJNjYgMGYgYmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpidGMgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDliMDoJNjYgMGYgYmMgOTAgOTAgOTAgOTAgOTAgWyAJXSpic2YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDliODoJNjYgMGYgYmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpic3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDljMDoJNjYgMGYgYmUgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZzYncgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDljODoJNjYgMGYgYzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnRlbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnRlbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQxZGJmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW50ZWwucworKysgL2Rldi9udWxsCkBAIC0xLDU2OCArMCwwIEBACi0udGV4dAotLmludGVsX3N5bnRheCBub3ByZWZpeAotZm9vOgotIGFkZCAgICBieXRlIHB0ciAweDkwOTA5MDkwW2VheF0sIGRsCi0gYWRkICAgIGR3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0sIGVkeAotIGFkZCAgICBkbCwgYnl0ZSBwdHIgMHg5MDkwOTA5MFtlYXhdCi0gYWRkICAgIGVkeCwgZHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XQotIGFkZCAgICBhbCwgMHg5MAotIGFkZCAgICBlYXgsIDB4OTA5MDkwOTAKLSBwdXNoICAgZXMKLSBwb3AgICAgZXMKLSBvciAgICAgW2VheCsweDkwOTA5MDkwXSwgZGwKLSBvciAgICAgW2VheCsweDkwOTA5MDkwXSwgZWR4Ci0gb3IgICAgIGRsLCBbZWF4KzB4OTA5MDkwOTBdCi0gb3IgICAgIGVkeCwgW2VheCsweDkwOTA5MDkwXQotIG9yICAgICBhbCwgMHg5MAotIG9yICAgICBlYXgsIDB4OTA5MDkwOTAKLSBwdXNoICAgY3MKLSBhZGMgICAgYnl0ZSBwdHIgW2VheCsweDkwOTA5MDkwXSwgZGwKLSBhZGMgICAgZHdvcmQgcHRyIFtlYXgrMHg5MDkwOTA5MF0sIGVkeAotIGFkYyAgICBkbCwgYnl0ZSBwdHIgW2VheCsweDkwOTA5MDkwXQotIGFkYyAgICBlZHgsIGR3b3JkIHB0ciBbZWF4KzB4OTA5MDkwOTBdCi0gYWRjICAgIGFsLCAweDkwCi0gYWRjICAgIGVheCwgMHg5MDkwOTA5MAotIHB1c2ggICBzcwotIHBvcCAgICBzcwotIHNiYiAgICAweDkwOTA5MDkwW2VheF0sIGRsCi0gc2JiICAgIDB4OTA5MDkwOTBbZWF4XSwgZWR4Ci0gc2JiICAgIGRsLCAweDkwOTA5MDkwW2VheF0KLSBzYmIgICAgZWR4LCAweDkwOTA5MDkwW2VheF0KLSBzYmIgICAgYWwsIDB4OTAKLSBzYmIgICAgZWF4LCAweDkwOTA5MDkwCi0gcHVzaCAgIGRzCi0gcG9wICAgIGRzCi0gYW5kICAgIDB4OTA5MDkwOTBbZWF4XSwgZGwKLSBhbmQgICAgMHg5MDkwOTA5MFtlYXhdLCBlZHgKLSBhbmQgICAgZGwsIDB4OTA5MDkwOTBbZWF4XQotIGFuZCAgICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIGFuZCAgICBhbCwgMHg5MAotIGFuZCAgICBlYXgsIDB4OTA5MDkwOTAKLSBkYWEKLSBzdWIgICAgMHg5MDkwOTA5MFtlYXhdLCBkbAotIHN1YiAgICAweDkwOTA5MDkwW2VheF0sIGVkeAotIHN1YiAgICBkbCwgMHg5MDkwOTA5MFtlYXhdCi0gc3ViICAgIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gc3ViICAgIGFsLCAweDkwCi0gc3ViICAgIGVheCwgMHg5MDkwOTA5MAotIGRhcwotIHhvciAgICAweDkwOTA5MDkwW2VheF0sIGRsCi0geG9yICAgIDB4OTA5MDkwOTBbZWF4XSwgZWR4Ci0geG9yICAgIGRsLCAweDkwOTA5MDkwW2VheF0KLSB4b3IgICAgZWR4LCAweDkwOTA5MDkwW2VheF0KLSB4b3IgICAgYWwsIDB4OTAKLSB4b3IgICAgZWF4LCAweDkwOTA5MDkwCi0gYWFhCi0gY21wICAgIDB4OTA5MDkwOTBbZWF4XSwgZGwKLSBjbXAgICAgMHg5MDkwOTA5MFtlYXhdLCBlZHgKLSBjbXAgICAgZGwsIDB4OTA5MDkwOTBbZWF4XQotIGNtcCAgICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIGNtcCAgICBhbCwgMHg5MAotIGNtcCAgICBlYXgsIDB4OTA5MDkwOTAKLSBhYXMKLSBpbmMgICAgZWF4Ci0gaW5jICAgIGVjeAotIGluYyAgICBlZHgKLSBpbmMgICAgZWJ4Ci0gaW5jICAgIGVzcAotIGluYyAgICBlYnAKLSBpbmMgICAgZXNpCi0gaW5jICAgIGVkaQotIGRlYyAgICBlYXgKLSBkZWMgICAgZWN4Ci0gZGVjICAgIGVkeAotIGRlYyAgICBlYngKLSBkZWMgICAgZXNwCi0gZGVjICAgIGVicAotIGRlYyAgICBlc2kKLSBkZWMgICAgZWRpCi0gcHVzaCAgIGVheAotIHB1c2ggICBlY3gKLSBwdXNoICAgZWR4Ci0gcHVzaCAgIGVieAotIHB1c2ggICBlc3AKLSBwdXNoICAgZWJwCi0gcHVzaCAgIGVzaQotIHB1c2ggICBlZGkKLSBwb3AgICAgZWF4Ci0gcG9wICAgIGVjeAotIHBvcCAgICBlZHgKLSBwb3AgICAgZWJ4Ci0gcG9wICAgIGVzcAotIHBvcCAgICBlYnAKLSBwb3AgICAgZXNpCi0gcG9wICAgIGVkaQotIHB1c2hhCi0gcG9wYQotIGJvdW5kICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIGFycGwgICAweDkwOTA5MDkwW2VheF0sIGR4Ci0gcHVzaCAgIDB4OTA5MDkwOTAKLSBpbXVsICAgZWR4LCAweDkwOTA5MDkwW2VheF0sIDB4OTA5MDkwOTAKLSBwdXNoICAgMHhmZmZmZmY5MAotIGltdWwgICBlZHgsIDB4OTA5MDkwOTBbZWF4XSwgMHhmZmZmZmY5MAotIGlucyAgICBieXRlIHB0ciBlczpbZWRpXSwgZHgKLSBpbnMgICAgZHdvcmQgcHRyIGVzOltlZGldLCBkeAotIG91dHMgICBkeCwgYnl0ZSBwdHIgZHM6W2VzaV0KLSBvdXRzICAgZHgsIGR3b3JkIHB0ciBkczpbZXNpXQotIGpvICAgICAuKzItMHg3MAotIGpubyAgICAuKzItMHg3MAotIGpiICAgICAuKzItMHg3MAotIGphZSAgICAuKzItMHg3MAotIGplICAgICAuKzItMHg3MAotIGpuZSAgICAuKzItMHg3MAotIGpiZSAgICAuKzItMHg3MAotIGphICAgICAuKzItMHg3MAotIGpzICAgICAuKzItMHg3MAotIGpucyAgICAuKzItMHg3MAotIGpwICAgICAuKzItMHg3MAotIGpucCAgICAuKzItMHg3MAotIGpsICAgICAuKzItMHg3MAotIGpnZSAgICAuKzItMHg3MAotIGpsZSAgICAuKzItMHg3MAotIGpnICAgICAuKzItMHg3MAotIGFkYyAgICBieXRlIHB0ciAweDkwOTA5MDkwW2VheF0sIDB4OTAKLSBhZGMgICAgZHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XSwgMHg5MDkwOTA5MAotIGFkYyAgICBkd29yZCBwdHIgMHg5MDkwOTA5MFtlYXhdLCAweGZmZmZmZjkwCi0gdGVzdCAgIDB4OTA5MDkwOTBbZWF4XSwgZGwKLSB0ZXN0ICAgMHg5MDkwOTA5MFtlYXhdLCBlZHgKLSB4Y2hnICAgMHg5MDkwOTA5MFtlYXhdLCBkbAotIHhjaGcgICAweDkwOTA5MDkwW2VheF0sIGVkeAotIG1vdiAgICAweDkwOTA5MDkwW2VheF0sIGRsCi0gbW92ICAgIDB4OTA5MDkwOTBbZWF4XSwgZWR4Ci0gbW92ICAgIGRsLCAweDkwOTA5MDkwW2VheF0KLSBtb3YgICAgZWR4LCAweDkwOTA5MDkwW2VheF0KLSBtb3YgICAgZHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XSwgc3MKLSBsZWEgICAgZWR4LCAweDkwOTA5MDkwW2VheF0KLSBtb3YgICAgc3MsIGR3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0KLSBwb3AgICAgZHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XQotIHhjaGcgICBlYXgsIGVheAotIHhjaGcgICBlY3gsIGVheAotIHhjaGcgICBlZHgsIGVheAotIHhjaGcgICBlYngsIGVheAotIHhjaGcgICBlc3AsIGVheAotIHhjaGcgICBlYnAsIGVheAotIHhjaGcgICBlc2ksIGVheAotIHhjaGcgICBlZGksIGVheAotIGN3ZGUKLSBjZHEKLSBjYWxsICAgMHg5MDkwLDB4OTA5MDkwOTAKLSBmd2FpdAotIHB1c2hmCi0gcG9wZgotIHNhaGYKLSBsYWhmCi0gbW92ICAgIGFsLCBbMHg5MDkwOTA5MF0KLSBtb3YgICAgZWF4LCBbMHg5MDkwOTA5MF0KLSBtb3YgICAgWzB4OTA5MDkwOTBdLCBhbAotIG1vdiAgICBbMHg5MDkwOTA5MF0sIGVheAotIG1vdnMgICBieXRlIHB0ciBlczpbZWRpXSwgYnl0ZSBwdHIgZHM6W2VzaV0KLSBtb3ZzICAgZHdvcmQgcHRyIGVzOltlZGldLCBkd29yZCBwdHIgZHM6W2VzaV0KLSBjbXBzICAgYnl0ZSBwdHIgZHM6W2VzaV0sIGJ5dGUgcHRyIGVzOltlZGldCi0gY21wcyAgIGR3b3JkIHB0ciBkczpbZXNpXSwgZHdvcmQgcHRyIGVzOltlZGldCi0gdGVzdCAgIGFsLCAweDkwCi0gdGVzdCAgIGVheCwgMHg5MDkwOTA5MAotIHN0b3MgICBieXRlIHB0ciBlczpbZWRpXSwgYWwKLSBzdG9zICAgZHdvcmQgcHRyIGVzOltlZGldLCBlYXgKLSBsb2RzICAgYWwsIGJ5dGUgcHRyIGRzOltlc2ldCi0gbG9kcyAgIGVheCwgZHdvcmQgcHRyIGRzOltlc2ldCi0gc2NhcyAgIGFsLCBieXRlIHB0ciBlczpbZWRpXQotIHNjYXMgICBlYXgsIGR3b3JkIHB0ciBlczpbZWRpXQotIG1vdiAgICBhbCwgMHg5MAotIG1vdiAgICBjbCwgMHg5MAotIG1vdiAgICBkbCwgMHg5MAotIG1vdiAgICBibCwgMHg5MAotIG1vdiAgICBhaCwgMHg5MAotIG1vdiAgICBjaCwgMHg5MAotIG1vdiAgICBkaCwgMHg5MAotIG1vdiAgICBiaCwgMHg5MAotIG1vdiAgICBlYXgsIDB4OTA5MDkwOTAKLSBtb3YgICAgZWN4LCAweDkwOTA5MDkwCi0gbW92ICAgIGVkeCwgMHg5MDkwOTA5MAotIG1vdiAgICBlYngsIDB4OTA5MDkwOTAKLSBtb3YgICAgZXNwLCAweDkwOTA5MDkwCi0gbW92ICAgIGVicCwgMHg5MDkwOTA5MAotIG1vdiAgICBlc2ksIDB4OTA5MDkwOTAKLSBtb3YgICAgZWRpLCAweDkwOTA5MDkwCi0gcmNsICAgIGJ5dGUgcHRyIDB4OTA5MDkwOTBbZWF4XSwgMHg5MAotIHJjbCAgICBkd29yZCBwdHIgMHg5MDkwOTA5MFtlYXhdLCAweDkwCi0gcmV0ICAgIDB4OTA5MAotIHJldAotIGxlcyAgICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIGxkcyAgICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIG1vdiAgICBieXRlIHB0ciAweDkwOTA5MDkwW2VheF0sIDB4OTAKLSBtb3YgICAgZHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XSwgMHg5MDkwOTA5MAotIGVudGVyICAweDkwOTAsIDB4OTAKLSBsZWF2ZQotIGxyZXQgICAweDkwOTAKLSBscmV0Ci0gaW50MwotIGludCAgICAweDkwCi0gaW50bwotIGlyZXQKLSByY2wgICAgYnl0ZSBwdHIgMHg5MDkwOTA5MFtlYXhdCi0gcmNsICAgIGR3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0KLSByY2wgICAgYnl0ZSBwdHIgMHg5MDkwOTA5MFtlYXhdLCBjbAotIHJjbCAgICBkd29yZCBwdHIgMHg5MDkwOTA5MFtlYXhdLCBjbAotIGFhbSAgICAweGZmZmZmZjkwCi0gYWFkICAgIDB4ZmZmZmZmOTAKLSB4bGF0ICAgYnl0ZSBwdHIgZHM6W2VieF0KLSBmY29tICAgZHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XQotIGZzdCAgICBkd29yZCBwdHIgMHg5MDkwOTA5MFtlYXhdCi0gZmljb20gIGR3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0KLSBmaXN0ICAgZHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XQotIGZjb20gICBxd29yZCBwdHIgMHg5MDkwOTA5MFtlYXhdCi0gZnN0ICAgIHF3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0KLSBmaWNvbSAgd29yZCBwdHIgMHg5MDkwOTA5MFtlYXhdCi0gZmlzdCAgIHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XQotIGxvb3BuZSAuKzItMHg3MAotIGxvb3BlICAuKzItMHg3MAotIGxvb3AgICAuKzItMHg3MAotIGplY3h6ICAuKzItMHg3MAotIGluICAgICBhbCwgMHg5MAotIGluICAgICBlYXgsIDB4OTAKLSBvdXQgICAgMHg5MCwgYWwKLSBvdXQgICAgMHg5MCwgZWF4Ci0gY2FsbCAgIC4rNSsweDkwOTA5MDkwCi0gam1wICAgIC4rNSsweDkwOTA5MDkwCi0gam1wICAgIDB4OTA5MCwweDkwOTA5MDkwCi0gam1wICAgIC4rMi0weDcwCi0gaW4gICAgIGFsLCBkeAotIGluICAgICBlYXgsIGR4Ci0gb3V0ICAgIGR4LCBhbAotIG91dCAgICBkeCwgZWF4Ci0gaGx0Ci0gY21jCi0gbm90ICAgIGJ5dGUgcHRyIDB4OTA5MDkwOTBbZWF4XQotIG5vdCAgICBkd29yZCBwdHIgMHg5MDkwOTA5MFtlYXhdCi0gY2xjCi0gc3RjCi0gY2xpCi0gc3RpCi0gY2xkCi0gc3RkCi0gY2FsbCAgIGR3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0KLSBsbGR0ICAgMHg5MDkwOTA5MFtlYXhdCi0gbGdkdCAgIDB4OTA5MDkwOTBbZWF4XQotIGxhciAgICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIGxzbCAgICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIGNsdHMKLSBpbnZkCi0gd2JpbnZkCi0gdWQyYQotIG1vdiAgICBlYXgsIGNyMgotIG1vdiAgICBlYXgsIGRiMgotIG1vdiAgICBjcjIsIGVheAotIG1vdiAgICBkYjIsIGVheAotIG1vdiAgICBlYXgsIHRyMgotIG1vdiAgICB0cjIsIGVheAotIHdybXNyCi0gcmR0c2MKLSByZG1zcgotIHJkcG1jCi0gY21vdm8gIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdm5vIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmIgIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmFlIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmUgIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdm5lIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmJlIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmEgIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdnMgIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdm5zIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdnAgIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdm5wIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmwgIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmdlIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmxlIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmcgIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gcHVucGNrbGJ3IG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcHVucGNrbHdkIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcHVucGNrbGRxIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcGFja3Nzd2IgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwY21wZ3RiIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcGNtcGd0dyBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBjbXBndGQgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwYWNrdXN3YiBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHB1bnBja2hidyBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHB1bnBja2h3ZCBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHB1bnBja2hkcSBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBhY2tzc2R3IG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gbW92ZCAgIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gbW92cSAgIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcHNybHcgIG1tMCwgMHg5MAotIHBzcmxkICBtbTAsIDB4OTAKLSBwc3JscSAgbW0wLCAweDkwCi0gcGNtcGVxYiBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBjbXBlcXcgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwY21wZXFkIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gZW1tcwotIG1vdmQgICAweDkwOTA5MDkwW2VheF0sIG1tMgotIG1vdnEgICAweDkwOTA5MDkwW2VheF0sIG1tMgotIGpvICAgICAuKzYrMHg5MDkwOTA5MAotIGpubyAgICAuKzYrMHg5MDkwOTA5MAotIGpiICAgICAuKzYrMHg5MDkwOTA5MAotIGphZSAgICAuKzYrMHg5MDkwOTA5MAotIGplICAgICAuKzYrMHg5MDkwOTA5MAotIGpuZSAgICAuKzYrMHg5MDkwOTA5MAotIGpiZSAgICAuKzYrMHg5MDkwOTA5MAotIGphICAgICAuKzYrMHg5MDkwOTA5MAotIGpzICAgICAuKzYrMHg5MDkwOTA5MAotIGpucyAgICAuKzYrMHg5MDkwOTA5MAotIGpwICAgICAuKzYrMHg5MDkwOTA5MAotIGpucCAgICAuKzYrMHg5MDkwOTA5MAotIGpsICAgICAuKzYrMHg5MDkwOTA5MAotIGpnZSAgICAuKzYrMHg5MDkwOTA5MAotIGpsZSAgICAuKzYrMHg5MDkwOTA5MAotIGpnICAgICAuKzYrMHg5MDkwOTA5MAotIHNldG8gICAweDkwOTA5MDkwW2VheF0KLSBzZXRubyAgMHg5MDkwOTA5MFtlYXhdCi0gc2V0YiAgIDB4OTA5MDkwOTBbZWF4XQotIHNldGFlICAweDkwOTA5MDkwW2VheF0KLSBzZXRlICAgMHg5MDkwOTA5MFtlYXhdCi0gc2V0bmUgIDB4OTA5MDkwOTBbZWF4XQotIHNldGJlICAweDkwOTA5MDkwW2VheF0KLSBzZXRhICAgMHg5MDkwOTA5MFtlYXhdCi0gc2V0cyAgIDB4OTA5MDkwOTBbZWF4XQotIHNldG5zICAweDkwOTA5MDkwW2VheF0KLSBzZXRwICAgMHg5MDkwOTA5MFtlYXhdCi0gc2V0bnAgIDB4OTA5MDkwOTBbZWF4XQotIHNldGwgICAweDkwOTA5MDkwW2VheF0KLSBzZXRnZSAgMHg5MDkwOTA5MFtlYXhdCi0gc2V0bGUgIDB4OTA5MDkwOTBbZWF4XQotIHNldGcgICAweDkwOTA5MDkwW2VheF0KLSBwdXNoICAgZnMKLSBwb3AgICAgZnMKLSBjcHVpZAotIGJ0ICAgICAweDkwOTA5MDkwW2VheF0sIGVkeAotIHNobGQgICAweDkwOTA5MDkwW2VheF0sIGVkeCwgMHg5MAotIHNobGQgICAweDkwOTA5MDkwW2VheF0sIGVkeCwgY2wKLSBwdXNoICAgZ3MKLSBwb3AgICAgZ3MKLSByc20KLSBidHMgICAgMHg5MDkwOTA5MFtlYXhdLCBlZHgKLSBzaHJkICAgMHg5MDkwOTA5MFtlYXhdLCBlZHgsIDB4OTAKLSBzaHJkICAgMHg5MDkwOTA5MFtlYXhdLCBlZHgsIGNsCi0gaW11bCAgIGVkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21weGNoZyAweDkwOTA5MDkwW2VheF0sIGRsCi0gY21weGNoZyAweDkwOTA5MDkwW2VheF0sIGVkeAotIGxzcyAgICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIGJ0ciAgICAweDkwOTA5MDkwW2VheF0sIGVkeAotIGxmcyAgICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIGxncyAgICBlZHgsIDB4OTA5MDkwOTBbZWF4XQotIG1vdnp4ICBlZHgsIGJ5dGUgcHRyIDB4OTA5MDkwOTBbZWF4XQotIG1vdnp4ICBlZHgsIHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XQotIHVkMmIKLSBidGMgICAgMHg5MDkwOTA5MFtlYXhdLCBlZHgKLSBic2YgICAgZWR4LCAweDkwOTA5MDkwW2VheF0KLSBic3IgICAgZWR4LCAweDkwOTA5MDkwW2VheF0KLSBtb3ZzeCAgZWR4LCBieXRlIHB0ciAweDkwOTA5MDkwW2VheF0KLSBtb3ZzeCAgZWR4LCB3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0KLSB4YWRkICAgMHg5MDkwOTA5MFtlYXhdLCBkbAotIHhhZGQgICAweDkwOTA5MDkwW2VheF0sIGVkeAotIGJzd2FwICBlYXgKLSBic3dhcCAgZWN4Ci0gYnN3YXAgIGVkeAotIGJzd2FwICBlYngKLSBic3dhcCAgZXNwCi0gYnN3YXAgIGVicAotIGJzd2FwICBlc2kKLSBic3dhcCAgZWRpCi0gcHNybHcgIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcHNybGQgIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcHNybHEgIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcG11bGx3IG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcHN1YnVzYiBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBzdWJ1c3cgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwYW5kICAgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwYWRkdXNiIG1tMiwgMHg5MDkwOTA5MFtlYXhdCi0gcGFkZHVzdyBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBhbmRuICBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBzcmF3ICBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBzcmFkICBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBtdWxodyBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBzdWJzYiBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBzdWJzdyBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBvciAgICBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBhZGRzYiBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBhZGRzdyBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHB4b3IgICBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBzbGx3ICBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBzbGxkICBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBzbGxxICBtbTIsIDB4OTA5MDkwOTBbZWF4XQotIHBtYWRkd2QgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwc3ViYiAgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwc3VidyAgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwc3ViZCAgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwYWRkYiAgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwYWRkdyAgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBwYWRkZCAgbW0yLCAweDkwOTA5MDkwW2VheF0KLSBhZGQgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIGFkZCAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gYWRkICAgIGF4LCAweDkwOTAKLSBwdXNodyAgZXMKLSBwb3B3ICAgZXMKLSBvciAgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIG9yICAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gb3IgICAgIGF4LCAweDkwOTAKLSBwdXNodyAgY3MKLSBhZGMgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIGFkYyAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gYWRjICAgIGF4LCAweDkwOTAKLSBwdXNodyAgc3MKLSBwb3B3ICAgc3MKLSBzYmIgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIHNiYiAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gc2JiICAgIGF4LCAweDkwOTAKLSBwdXNodyAgZHMKLSBwb3B3ICAgZHMKLSBhbmQgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIGFuZCAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gYW5kICAgIGF4LCAweDkwOTAKLSBzdWIgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIHN1YiAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gc3ViICAgIGF4LCAweDkwOTAKLSB4b3IgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIHhvciAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0geG9yICAgIGF4LCAweDkwOTAKLSBjbXAgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIGNtcCAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21wICAgIGF4LCAweDkwOTAKLSBpbmMgICAgYXgKLSBpbmMgICAgY3gKLSBpbmMgICAgZHgKLSBpbmMgICAgYngKLSBpbmMgICAgc3AKLSBpbmMgICAgYnAKLSBpbmMgICAgc2kKLSBpbmMgICAgZGkKLSBkZWMgICAgYXgKLSBkZWMgICAgY3gKLSBkZWMgICAgZHgKLSBkZWMgICAgYngKLSBkZWMgICAgc3AKLSBkZWMgICAgYnAKLSBkZWMgICAgc2kKLSBkZWMgICAgZGkKLSBwdXNoICAgYXgKLSBwdXNoICAgY3gKLSBwdXNoICAgZHgKLSBwdXNoICAgYngKLSBwdXNoICAgc3AKLSBwdXNoICAgYnAKLSBwdXNoICAgc2kKLSBwdXNoICAgZGkKLSBwb3AgICAgYXgKLSBwb3AgICAgY3gKLSBwb3AgICAgZHgKLSBwb3AgICAgYngKLSBwb3AgICAgc3AKLSBwb3AgICAgYnAKLSBwb3AgICAgc2kKLSBwb3AgICAgZGkKLSBwdXNoYXcJCQkjIGhvdyBzaG91bGQgd2Ugc3BlY2lmeSBhIHdvcmQgcHVzaCBhbGwgcmVncz8KLSBwb3BhdwkJCSMgZGl0dG8gZm9yIHBvcGEKLSBib3VuZCAgZHgsIDB4OTA5MDkwOTBbZWF4XQotIHB1c2h3ICAweDkwOTAKLSBpbXVsICAgZHgsIDB4OTA5MDkwOTBbZWF4XSwgMHg5MDkwCi0gcHVzaHcgIDB4ZmZmZmZmOTAKLSBpbXVsICAgZHgsIDB4OTA5MDkwOTBbZWF4XSwgMHhmZmZmZmY5MAotIGlucyAgICB3b3JkIHB0ciBlczpbZWRpXSwgZHgKLSBvdXRzICAgZHgsIHdvcmQgcHRyIGRzOltlc2ldCi0gYWRjICAgIHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XSwgMHg5MDkwCi0gYWRjICAgIHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XSwgMHhmZmZmZmY5MAotIHRlc3QgICAweDkwOTA5MDkwW2VheF0sIGR4Ci0geGNoZyAgIDB4OTA5MDkwOTBbZWF4XSwgZHgKLSBtb3YgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIG1vdiAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gbW92ICAgIHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XSwgc3MKLSBsZWEgICAgZHgsIDB4OTA5MDkwOTBbZWF4XQotIHBvcCAgICB3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0KLSB4Y2hnICAgY3gsIGF4Ci0geGNoZyAgIGR4LCBheAotIHhjaGcgICBieCwgYXgKLSB4Y2hnICAgc3AsIGF4Ci0geGNoZyAgIGJwLCBheAotIHhjaGcgICBzaSwgYXgKLSB4Y2hnICAgZGksIGF4Ci0gY2J0dwotIGN3dGQKLSBjYWxsdyAgMHg5MDkwLDB4OTA5MAotIHB1c2hmdwotIHBvcGZ3Ci0gbW92ICAgIGF4LCBbMHg5MDkwOTA5MF0KLSBtb3YgICAgWzB4OTA5MDkwOTBdLCBheAotIG1vdnMgICB3b3JkIHB0ciBlczpbZWRpXSwgd29yZCBwdHIgZHM6W2VzaV0KLSBjbXBzICAgd29yZCBwdHIgZHM6W2VzaV0sIHdvcmQgcHRyIGVzOltlZGldCi0gdGVzdCAgIGF4LCAweDkwOTAKLSBzdG9zICAgd29yZCBwdHIgZXM6W2VkaV0sIGF4Ci0gbG9kcyAgIGF4LCB3b3JkIHB0ciBkczpbZXNpXQotIHNjYXMgICBheCwgd29yZCBwdHIgZXM6W2VkaV0KLSBtb3YgICAgYXgsIDB4OTA5MAotIG1vdiAgICBjeCwgMHg5MDkwCi0gbW92ICAgIGR4LCAweDkwOTAKLSBtb3YgICAgYngsIDB4OTA5MAotIG1vdiAgICBzcCwgMHg5MDkwCi0gbW92ICAgIGJwLCAweDkwOTAKLSBtb3YgICAgc2ksIDB4OTA5MAotIG1vdiAgICBkaSwgMHg5MDkwCi0gcmNsICAgIHdvcmQgcHRyIDB4OTA5MDkwOTBbZWF4XSwgMHg5MAotIHJldHcgICAweDkwOTAKLSByZXR3Ci0gbGVzICAgIGR4LCAweDkwOTA5MDkwW2VheF0KLSBsZHMgICAgZHgsIDB4OTA5MDkwOTBbZWF4XQotIG1vdiAgICB3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0sIDB4OTA5MAotIGVudGVydyAweDkwOTAsIDB4OTAKLSBsZWF2ZXcKLSBscmV0dyAgMHg5MDkwCi0gbHJldHcKLSBpcmV0dwotIHJjbCAgICB3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0KLSByY2wgICAgd29yZCBwdHIgMHg5MDkwOTA5MFtlYXhdLCBjbAotIGluICAgICBheCwgMHg5MAotIG91dCAgICAweDkwLCBheAotIGNhbGwgICB3b3JkIHB0ciAuKzMrMHg5MDkwCi0gam1wdyAgIDB4OTA5MCwweDkwOTAKLSBpbiAgICAgYXgsIGR4Ci0gb3V0ICAgIGR4LCBheAotIG5vdCAgICB3b3JkIHB0ciAweDkwOTA5MDkwW2VheF0KLSBjYWxsICAgd29yZCBwdHIgMHg5MDkwOTA5MFtlYXhdCi0gbGFyICAgIGR4LCAweDkwOTA5MDkwW2VheF0KLSBsc2wgICAgZHgsIDB4OTA5MDkwOTBbZWF4XQotIGNtb3ZvICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdm5vIGR4LCAweDkwOTA5MDkwW2VheF0KLSBjbW92YiAgZHgsIDB4OTA5MDkwOTBbZWF4XQotIGNtb3ZhZSBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmUgIGR4LCAweDkwOTA5MDkwW2VheF0KLSBjbW92bmUgZHgsIDB4OTA5MDkwOTBbZWF4XQotIGNtb3ZiZSBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmEgIGR4LCAweDkwOTA5MDkwW2VheF0KLSBjbW92cyAgZHgsIDB4OTA5MDkwOTBbZWF4XQotIGNtb3ZucyBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdnAgIGR4LCAweDkwOTA5MDkwW2VheF0KLSBjbW92bnAgZHgsIDB4OTA5MDkwOTBbZWF4XQotIGNtb3ZsICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gY21vdmdlIGR4LCAweDkwOTA5MDkwW2VheF0KLSBjbW92bGUgZHgsIDB4OTA5MDkwOTBbZWF4XQotIGNtb3ZnICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gcHVzaHcgIGZzCi0gcG9wdyAgIGZzCi0gYnQgICAgIDB4OTA5MDkwOTBbZWF4XSwgZHgKLSBzaGxkICAgMHg5MDkwOTA5MFtlYXhdLCBkeCwgMHg5MAotIHNobGQgICAweDkwOTA5MDkwW2VheF0sIGR4LCBjbAotIHB1c2h3ICBncwotIHBvcHcgICBncwotIGJ0cyAgICAweDkwOTA5MDkwW2VheF0sIGR4Ci0gc2hyZCAgIDB4OTA5MDkwOTBbZWF4XSwgZHgsIDB4OTAKLSBzaHJkICAgMHg5MDkwOTA5MFtlYXhdLCBkeCwgY2wKLSBpbXVsICAgZHgsIDB4OTA5MDkwOTBbZWF4XQotIGNtcHhjaGcgMHg5MDkwOTA5MFtlYXhdLCBkeAotIGxzcyAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gYnRyICAgIDB4OTA5MDkwOTBbZWF4XSwgZHgKLSBsZnMgICAgZHgsIDB4OTA5MDkwOTBbZWF4XQotIGxncyAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gbW92enggIGR4LCBieXRlIHB0ciAweDkwOTA5MDkwW2VheF0KLSBidGMgICAgMHg5MDkwOTA5MFtlYXhdLCBkeAotIGJzZiAgICBkeCwgMHg5MDkwOTA5MFtlYXhdCi0gYnNyICAgIGR4LCAweDkwOTA5MDkwW2VheF0KLSBtb3ZzeCAgZHgsIGJ5dGUgcHRyIDB4OTA5MDkwOTBbZWF4XQotIHhhZGQgICAweDkwOTA5MDkwW2VheF0sIGR4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODk0OTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjM6IEVycm9yOiAuKgotLio6NDogRXJyb3I6IC4qCi0uKjo1OiBFcnJvcjogLioKLS4qOjY6IEVycm9yOiAuKgotLio6NzogRXJyb3I6IC4qCi0uKjo4OiBFcnJvcjogLioKLS4qOjk6IEVycm9yOiAuKgotLio6MTA6IEVycm9yOiAuKgotLio6MTE6IEVycm9yOiAuKgotLio6MTI6IEVycm9yOiAuKgotLio6MTM6IEVycm9yOiAuKgotLio6MTQ6IEVycm9yOiAuKgotLio6MTU6IEVycm9yOiAuKgotLio6MTY6IEVycm9yOiAuKgotLio6MTc6IEVycm9yOiAuKgotLio6MTg6IEVycm9yOiAuKgotLio6MTk6IEVycm9yOiAuKgotLio6MjA6IEVycm9yOiAuKgotLio6MjE6IEVycm9yOiAuKgotLio6MjI6IEVycm9yOiAuKgotLio6MjM6IEVycm9yOiAuKgotLio6MjQ6IEVycm9yOiAuKgotLio6MjU6IEVycm9yOiAuKgotLio6MjY6IEVycm9yOiAuKgotLio6Mjc6IEVycm9yOiAuKgotLio6Mjg6IEVycm9yOiAuKgotLio6Mjk6IEVycm9yOiAuKgotLio6MzA6IEVycm9yOiAuKgotLio6MzE6IEVycm9yOiAuKgotLio6MzI6IEVycm9yOiAuKgotLio6MzM6IEVycm9yOiAuKgotLio6MzQ6IEVycm9yOiAuKgotLio6MzU6IEVycm9yOiAuKgotLio6MzY6IEVycm9yOiAuKgotLio6Mzc6IEVycm9yOiAuKgotLio6Mzg6IEVycm9yOiAuKgotLio6Mzk6IEVycm9yOiAuKgotLio6NDA6IEVycm9yOiAuKgotLio6NDE6IEVycm9yOiAuKgotLio6NDI6IEVycm9yOiAuKgotLio6NDM6IEVycm9yOiAuKgotLio6NDQ6IEVycm9yOiAuKgotLio6NDU6IEVycm9yOiAuKgotLio6NDY6IEVycm9yOiAuKgotLio6NDc6IEVycm9yOiAuKgotLio6NDg6IEVycm9yOiAuKgotR0FTIExJU1RJTkcgLioKLQotCi0gICAxIFsgCV0qCS50ZXh0Ci0gICAyIFsgCV0qIyBBbGwgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgaWxsZWdhbAotICAgMyBbIAldKgltb3YJXCglZHhcKSwlYWwKLSAgIDQgWyAJXSoJbW92CVwoJWVheCwlZXNwLDJcKSwlYWwKLSAgIDUgWyAJXSoJc2V0YWUJJWVheAotICAgNiBbIAldKglwdXNoYgklZHMKLSAgIDcgWyAJXSoJcG9wYgklZHMKLSAgIDggWyAJXSoJcHVzaGIJJWFsCi0gICA5IFsgCV0qCXBvcGIJJWFsCi0gIDEwIFsgCV0qCXB1c2hiCSVhaAotICAxMSBbIAldKglwb3BiCSVhaAotICAxMiBbIAldKglwdXNoYgklYXgKLSAgMTMgWyAJXSoJcG9wYgklYXgKLSAgMTQgWyAJXSoJcHVzaGIJJWVheAotICAxNSBbIAldKglwb3BiCSVlYXgKLSAgMTYgWyAJXSoJbW92YgklZHMsJWF4Ci0gIDE3IFsgCV0qCW1vdmIJJWRzLCVlYXgKLSAgMTggWyAJXSoJbW92YgklYXgsJWRzCi0gIDE5IFsgCV0qCW1vdmIJJWVheCwlZHMKLSAgMjAgWyAJXSoJbW92ZGIJJWVheCwlbW0wCi0gIDIxIFsgCV0qCW1vdnFiCTAsJW1tMAotICAyMiBbIAldKglsZHNiCTAsJWVheAotICAyMyBbIAldKglzZXRuZXcJMAotICAyNCBbIAldKgltb3ZkdwklZWF4LCVtbTAKLSAgMjUgWyAJXSoJbW92cXcJMCwlbW0wCi0gIDI2IFsgCV0qCWRpdgklY3gsJWFsCi0gIDI3IFsgCV0qCWRpdgklY2wsJWF4Ci0gIDI4IFsgCV0qCWRpdgklZWN4LCVhbAotICAyOSBbIAldKglpbXVsCTEwLCVieCwlZWN4Ci0gIDMwIFsgCV0qCWltdWwJMTAsJWJ4LCVhbAotICAzMSBbIAldKglwb3BhYgotICAzMiBbIAldKglzdGlsCi0gIDMzIFsgCV0qCWFhYWIKLSAgMzQgWyAJXSoJY3dkZWwKLSAgMzUgWyAJXSoJY3dkdwotICAzNiBbIAldKgljYWxsd3cJMAotICAzNyBbIAldKmZvbzoJamF3CWZvbwotICAzOCBbIAldKglqY3h6dwlmb28KLSAgMzkgWyAJXSoJamVjeHpsCWZvbwotICA0MCBbIAldKglsb29wYglmb28KLSAgNDEgWyAJXSoJeGxhdHcJJWVzOiVieAotICA0MiBbIAldKgl4bGF0bAklZXM6JWJ4Ci0gIDQzIFsgCV0qCWludGwJMgotICA0NCBbIAldKglpbnQzYgotICA0NSBbIAldKglobHRiCi0gIDQ2IFsgCV0qCWZzdGIJJXN0XCgwXCkKLSAgNDcgWyAJXSoJZmNvbXBsbAkyOFwoJWVicFwpCi0gIDQ4IFsgCV0qCWZsZGx3CVwoJWVheFwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzN2ExOGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotCS50ZXh0Ci0jIEFsbCB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBpbGxlZ2FsCi0JbW92CSglZHgpLCVhbAotCW1vdgkoJWVheCwlZXNwLDIpLCVhbAotCXNldGFlCSVlYXgKLQlwdXNoYgklZHMKLQlwb3BiCSVkcwotCXB1c2hiCSVhbAotCXBvcGIJJWFsCi0JcHVzaGIJJWFoCi0JcG9wYgklYWgKLQlwdXNoYgklYXgKLQlwb3BiCSVheAotCXB1c2hiCSVlYXgKLQlwb3BiCSVlYXgKLQltb3ZiCSVkcywlYXgKLQltb3ZiCSVkcywlZWF4Ci0JbW92YgklYXgsJWRzCi0JbW92YgklZWF4LCVkcwotCW1vdmRiCSVlYXgsJW1tMAotCW1vdnFiCTAsJW1tMAotCWxkc2IJMCwlZWF4Ci0Jc2V0bmV3CTAKLQltb3ZkdwklZWF4LCVtbTAKLQltb3ZxdwkwLCVtbTAKLQlkaXYJJWN4LCVhbAotCWRpdgklY2wsJWF4Ci0JZGl2CSVlY3gsJWFsCi0JaW11bAkxMCwlYngsJWVjeAotCWltdWwJMTAsJWJ4LCVhbAotCXBvcGFiCi0Jc3RpbAotCWFhYWIKLQljd2RlbAotCWN3ZHcKLQljYWxsd3cJMAotZm9vOglqYXcJZm9vCi0JamN4encJZm9vCi0JamVjeHpsCWZvbwotCWxvb3BiCWZvbwotCXhsYXR3CSVlczolYngKLQl4bGF0bAklZXM6JWJ4Ci0JaW50bAkyCi0JaW50M2IKLQlobHRiCi0JZnN0Ygklc3QoMCkKLQlmY29tcGxsCTI4KCVlYnApCi0JZmxkbHcJKCVlYXgpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2p1bXAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvanVtcC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTlmZTRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvanVtcC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI25hbWU6IGkzODYganVtcAotI29iamR1bXA6IC1kcncKLQotLio6ICtmaWxlIGZvcm1hdCAuKmkzODYuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8LnRleHQ+OgotICAgMDoJZWIgZmUgWyAJXSpqbXAgICAgKDB4MHwwIDwudGV4dD4pCi0gICAyOgllOSAoZmN8ZjkpIGZmIGZmIGZmIFsgCV0qam1wICAgICgweDN8MHgwfDAgPC50ZXh0PikJMzogKFJfMzg2X1BDKT8oRElTUCk/MzIJeHh4Ci0gICA3OglmZiAyNSAwMCAwMCAwMCAwMCBbIAldKmptcCAgICBcKjB4MAk5OiAoUl8zODZfKT8oZGlyKT8zMgl4eHgKLSAgIGQ6CWZmIGU3IFsgCV0qam1wICAgIFwqJWVkaQotICAgZjoJZmYgMjcgWyAJXSpqbXAgICAgXCpcKCVlZGlcKQotICAxMToJZmYgMmMgYmQgMDAgMDAgMDAgMDAgWyAJXSpsam1wICAgXCoweDBcKCwlZWRpLDRcKQkxNDogKFJfMzg2Xyk/KGRpcik/MzIJeHh4Ci0gIDE4OglmZiAyZCAwMCAwMCAwMCAwMCBbIAldKmxqbXAgICBcKjB4MAkxYTogKFJfMzg2Xyk/KGRpcik/MzIJeHh4Ci0gIDFlOgllYSAwMCAwMCAwMCAwMCAzNCAxMiBbIAldKmxqbXAgICBcJDB4MTIzNCxcJDB4MAkxZjogKFJfMzg2Xyk/KGRpcik/MzIJeHh4Ci0gIDI1OgllOCBkNiBmZiBmZiBmZiBbIAldKmNhbGwgICAoMHgwfDAgPC50ZXh0PikKLSAgMmE6CWU4IChmY3xkMSkgZmYgZmYgZmYgWyAJXSpjYWxsICAgKDB4MmJ8MHgwfDAgPC50ZXh0PikJMmI6IChSXzM4Nl9QQyk/KERJU1ApPzMyCXh4eAotICAyZjoJZmYgMTUgMDAgMDAgMDAgMDAgWyAJXSpjYWxsICAgXCoweDAJMzE6IChSXzM4Nl8pPyhkaXIpPzMyCXh4eAotICAzNToJZmYgZDcgWyAJXSpjYWxsICAgXColZWRpCi0gIDM3OglmZiAxNyBbIAldKmNhbGwgICBcKlwoJWVkaVwpCi0gIDM5OglmZiAxYyBiZCAwMCAwMCAwMCAwMCBbIAldKmxjYWxsICBcKjB4MFwoLCVlZGksNFwpCTNjOiAoUl8zODZfKT8oZGlyKT8zMgl4eHgKLSAgNDA6CWZmIDFkIDAwIDAwIDAwIDAwIFsgCV0qbGNhbGwgIFwqMHgwCTQyOiAoUl8zODZfKT8oZGlyKT8zMgl4eHgKLSAgNDY6CTlhIDAwIDAwIDAwIDAwIDM0IDEyIFsgCV0qbGNhbGwgIFwkMHgxMjM0LFwkMHgwCTQ3OiAoUl8zODZfKT8oZGlyKT8zMgl4eHgKLSAgNGQ6LioKLS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2p1bXAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvanVtcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjExY2QzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvanVtcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLnBzaXplIDAKLS50ZXh0Ci0uZXh0ZXJuIHh4eAotCi0xOglqbXAJMWIKLQlqbXAJeHh4Ci0Jam1wCSp4eHgKLQlqbXAJKiVlZGkKLQlqbXAJKiglZWRpKQotCWxqbXAJKnh4eCgsJWVkaSw0KQotCWxqbXAJKnh4eAotCWxqbXAJJDB4MTIzNCwkeHh4Ci0KLQljYWxsCTFiCi0JY2FsbAl4eHgKLQljYWxsCSp4eHgKLQljYWxsCSolZWRpCi0JY2FsbAkqKCVlZGkpCi0JbGNhbGwJKnh4eCgsJWVkaSw0KQotCWxjYWxsCSp4eHgKLQlsY2FsbAkkMHgxMjM0LCR4eHgKLQotCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLQkucDJhbGlnbgk0LDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvanVtcDE2LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2p1bXAxNi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDVkNmJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvanVtcDE2LmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jbmFtZTogaTM4NiBqdW1wMTYKLSNvYmpkdW1wOiAtZHJ3IC1taTgwODYKLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKmkzODYuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8LnRleHQ+OgotICAgMDoJZWIgZmUgWyAJXSpqbXAgICAgKDB4MHwwIDwudGV4dD4pCi0gICAyOgllOSAoZmV8ZmIpIGZmIFsgCV0qam1wICAgICgweDN8MHgwfDAgPC50ZXh0PikJMzogKFJfMzg2X1BDKT8oRElTUCk/MTYJeHh4Ci0gICA1OglmZiAyNiAwMCAwMCBbIAldKmptcCAgICBcKjAJNzogKFJfMzg2Xyk/KGRpcik/MTYJeHh4Ci0gICA5Ogk2NiBmZiBlNyBbIAldKmptcGwgICBcKiVlZGkKLSAgIGM6CTY3IGZmIDI3IFsgCV0qYWRkcjMyIGptcCBcKlwoJWVkaVwpCi0gICBmOgk2NyBmZiBhZiAwMCAwMCAwMCAwMCBbIAldKmFkZHIzMiBsam1wIFwqMHgwXCglZWRpXCkJMTI6IChSXzM4Nl8pPyhkaXIpPzMyCXh4eAotICAxNjoJZmYgMmUgMDAgMDAgWyAJXSpsam1wICAgXCowCTE4OiAoUl8zODZfKT8oZGlyKT8xNgl4eHgKLSAgMWE6CWVhIDAwIDAwIDM0IDEyIFsgCV0qbGptcCAgIFwkMHgxMjM0LFwkMHgwCTFiOiAoUl8zODZfKT8oZGlyKT8xNgl4eHgKLSAgMWY6CTY2IGU4IGRiIGZmIGZmIGZmIFsgCV0qY2FsbGwgICgweDB8MCA8LnRleHQ+KQotICAyNToJNjYgZTggKGZjfGQ1KSBmZiBmZiBmZiBbIAldKmNhbGxsICAoMHgyN3wweDB8MCA8LnRleHQ+KQkyNzogKFJfMzg2X1BDKT8oRElTUCk/MzIJeHh4Ci0gIDJiOgk2NiBmZiAxNiAwMCAwMCBbIAldKmNhbGxsICBcKjAJMmU6IChSXzM4Nl8pPyhkaXIpPzE2CXh4eAotICAzMDoJNjYgZmYgZDcgWyAJXSpjYWxsbCAgXColZWRpCi0gIDMzOgk2NyA2NiBmZiAxNyBbIAldKmFkZHIzMiBjYWxsbCBcKlwoJWVkaVwpCi0gIDM3Ogk2NyA2NiBmZiA5ZiAwMCAwMCAwMCAwMCBbIAldKmFkZHIzMiBsY2FsbGwgXCoweDBcKCVlZGlcKQkzYjogKFJfMzg2Xyk/KGRpcik/MzIJeHh4Ci0gIDNmOgk2NiBmZiAxZSAwMCAwMCBbIAldKmxjYWxsbCBcKjAJNDI6IChSXzM4Nl8pPyhkaXIpPzE2CXh4eAotICA0NDoJNjYgOWEgMDAgMDAgMDAgMDAgMzQgMTIgWyAJXSpsY2FsbGwgXCQweDEyMzQsXCQweDAJNDY6IChSXzM4Nl8pPyhkaXIpPzMyCXh4eAotICA0YzoJZWIgYjIgWyAJXSpqbXAgICAgKDB4MHwwIDwudGV4dD4pCi0gIDRlOglmZiAyNiAwMCAwMCBbIAldKmptcCAgICBcKjAJNTA6IChSXzM4Nl8pPyhkaXIpPzE2CXh4eAotICA1MjoJZmYgZTcgWyAJXSpqbXAgICAgXColZGkKLSAgNTQ6CWZmIDI1IFsgCV0qam1wICAgIFwqXCglZGlcKQotICA1NjoJZmYgYWQgMDAgMDAgWyAJXSpsam1wICAgXCowXCglZGlcKQk1ODogKFJfMzg2Xyk/KGRpcik/MTYJeHh4Ci0gIDVhOglmZiAyZSAwMCAwMCBbIAldKmxqbXAgICBcKjAJNWM6IChSXzM4Nl8pPyhkaXIpPzE2CXh4eAotICA1ZToJZWEgMDAgMDAgMzQgMTIgWyAJXSpsam1wICAgXCQweDEyMzQsXCQweDAJNWY6IChSXzM4Nl8pPyhkaXIpPzE2CXh4eAotICA2MzoJZTggOWEgZmYgWyAJXSpjYWxsICAgKDB4MHwwIDwudGV4dD4pCi0gIDY2OgllOCAoZmV8OTcpIGZmIFsgCV0qY2FsbCAgICgweDY3fDB4MHwwIDwudGV4dD4pCTY3OiAoUl8zODZfUEMpPyhESVNQKT8xNgl4eHgKLSAgNjk6CWZmIDE2IDAwIDAwIFsgCV0qY2FsbCAgIFwqMAk2YjogKFJfMzg2Xyk/KGRpcik/MTYJeHh4Ci0gIDZkOglmZiBkNyBbIAldKmNhbGwgICBcKiVkaQotICA2ZjoJZmYgMTUgWyAJXSpjYWxsICAgXCpcKCVkaVwpCi0gIDcxOglmZiA5ZCAwMCAwMCBbIAldKmxjYWxsICBcKjBcKCVkaVwpCTczOiAoUl8zODZfKT8oZGlyKT8xNgl4eHgKLSAgNzU6CWZmIDFlIDAwIDAwIFsgCV0qbGNhbGwgIFwqMAk3NzogKFJfMzg2Xyk/KGRpcik/MTYJeHh4Ci0gIDc5Ogk5YSAwMCAwMCAzNCAxMiBbIAldKmxjYWxsICBcJDB4MTIzNCxcJDB4MAk3YTogKFJfMzg2Xyk/KGRpcik/MTYJeHh4Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2p1bXAxNi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9qdW1wMTYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlZTI0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2p1bXAxNi5zCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLnBzaXplIDAKLS50ZXh0Ci0uZXh0ZXJuIHh4eAotCi0uY29kZTE2Z2NjCi0xOglqbXAJMWIKLQlqbXAJeHh4Ci0Jam1wCSp4eHgKLQlqbXAJKiVlZGkKLQlqbXAJKiglZWRpKQotCWxqbXAJKnh4eCglZWRpKQotCWxqbXAJKnh4eAotCWxqbXAJJDB4MTIzNCwkeHh4Ci0KLQljYWxsCTFiCi0JY2FsbAl4eHgKLQljYWxsCSp4eHgKLQljYWxsCSolZWRpCi0JY2FsbAkqKCVlZGkpCi0JbGNhbGwJKnh4eCglZWRpKQotCWxjYWxsCSp4eHgKLQlsY2FsbAkkMHgxMjM0LCR4eHgKLQotLmNvZGUxNgotCWptcAkxYgotCWptcAkqeHh4Ci0Jam1wCSolZGkKLQlqbXAJKiglZGkpCi0JbGptcAkqeHh4KCVkaSkKLQlsam1wCSp4eHgKLQlsam1wCSQweDEyMzQsJHh4eAotCi0JY2FsbAkxYgotCWNhbGwJeHh4Ci0JY2FsbAkqeHh4Ci0JY2FsbAkqJWRpCi0JY2FsbAkqKCVkaSkKLQlsY2FsbAkqeHh4KCVkaSkKLQlsY2FsbAkqeHh4Ci0JbGNhbGwJJDB4MTIzNCwkeHh4Ci0KLQkjIEZvcmNlIGEgZ29vZCBhbGlnbm1lbnQuCi0JLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwODU4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IGthdG1haQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJMGYgNTggMDEgWyAJXSphZGRwcyAgXCglZWN4XCksJXhtbTAKLSAgIDM6CTBmIDU4IGNhIFsgCV0qYWRkcHMgICV4bW0yLCV4bW0xCi0gICA2OglmMyAwZiA1OCAxMyBbIAldKmFkZHNzICBcKCVlYnhcKSwleG1tMgotICAgYToJZjMgMGYgNTggZGMgWyAJXSphZGRzcyAgJXhtbTQsJXhtbTMKLSAgIGU6CTBmIDU1IDY1IDAwIFsgCV0qYW5kbnBzIDB4MFwoJWVicFwpLCV4bW00Ci0gIDEyOgkwZiA1NSBlZSBbIAldKmFuZG5wcyAleG1tNiwleG1tNQotICAxNToJMGYgNTQgMzcgWyAJXSphbmRwcyAgXCglZWRpXCksJXhtbTYKLSAgMTg6CTBmIDU0IGY4IFsgCV0qYW5kcHMgICV4bW0wLCV4bW03Ci0gIDFiOgkwZiBjMiBjMSAwMiBbIAldKmNtcGxlcHMgJXhtbTEsJXhtbTAKLSAgMWY6CTBmIGMyIDBhIDAzIFsgCV0qY21wdW5vcmRwcyBcKCVlZHhcKSwleG1tMQotICAyMzoJZjMgMGYgYzIgZDIgMDQgWyAJXSpjbXBuZXFzcyAleG1tMiwleG1tMgotICAyODoJZjMgMGYgYzIgMWMgMjQgMDUgWyAJXSpjbXBubHRzcyBcKCVlc3AsMVwpLCV4bW0zCi0gIDJlOgkwZiBjMiBlNSAwNiBbIAldKmNtcG5sZXBzICV4bW01LCV4bW00Ci0gIDMyOgkwZiBjMiAyZSAwNyBbIAldKmNtcG9yZHBzIFwoJWVzaVwpLCV4bW01Ci0gIDM2OglmMyAwZiBjMiBmNyAwMCBbIAldKmNtcGVxc3MgJXhtbTcsJXhtbTYKLSAgM2I6CWYzIDBmIGMyIDM4IDAxIFsgCV0qY21wbHRzcyBcKCVlYXhcKSwleG1tNwotICA0MDoJMGYgYzIgYzEgMDAgWyAJXSpjbXBlcXBzICV4bW0xLCV4bW0wCi0gIDQ0OgkwZiBjMiAwYSAwMCBbIAldKmNtcGVxcHMgXCglZWR4XCksJXhtbTEKLSAgNDg6CWYzIDBmIGMyIGQyIDAwIFsgCV0qY21wZXFzcyAleG1tMiwleG1tMgotICA0ZDoJZjMgMGYgYzIgMWMgMjQgMDAgWyAJXSpjbXBlcXNzIFwoJWVzcCwxXCksJXhtbTMKLSAgNTM6CTBmIGMyIGU1IDAxIFsgCV0qY21wbHRwcyAleG1tNSwleG1tNAotICA1NzoJMGYgYzIgMmUgMDEgWyAJXSpjbXBsdHBzIFwoJWVzaVwpLCV4bW01Ci0gIDViOglmMyAwZiBjMiBmNyAwMSBbIAldKmNtcGx0c3MgJXhtbTcsJXhtbTYKLSAgNjA6CWYzIDBmIGMyIDM4IDAxIFsgCV0qY21wbHRzcyBcKCVlYXhcKSwleG1tNwotICA2NToJMGYgYzIgMDEgMDIgWyAJXSpjbXBsZXBzIFwoJWVjeFwpLCV4bW0wCi0gIDY5OgkwZiBjMiBjYSAwMiBbIAldKmNtcGxlcHMgJXhtbTIsJXhtbTEKLSAgNmQ6CWYzIDBmIGMyIDEzIDAyIFsgCV0qY21wbGVzcyBcKCVlYnhcKSwleG1tMgotICA3MjoJZjMgMGYgYzIgZGMgMDIgWyAJXSpjbXBsZXNzICV4bW00LCV4bW0zCi0gIDc3OgkwZiBjMiA2NSAwMCAwMyBbIAldKmNtcHVub3JkcHMgMHgwXCglZWJwXCksJXhtbTQKLSAgN2M6CTBmIGMyIGVlIDAzIFsgCV0qY21wdW5vcmRwcyAleG1tNiwleG1tNQotICA4MDoJZjMgMGYgYzIgMzcgMDMgWyAJXSpjbXB1bm9yZHNzIFwoJWVkaVwpLCV4bW02Ci0gIDg1OglmMyAwZiBjMiBmOCAwMyBbIAldKmNtcHVub3Jkc3MgJXhtbTAsJXhtbTcKLSAgOGE6CTBmIGMyIGMxIDA0IFsgCV0qY21wbmVxcHMgJXhtbTEsJXhtbTAKLSAgOGU6CTBmIGMyIDBhIDA0IFsgCV0qY21wbmVxcHMgXCglZWR4XCksJXhtbTEKLSAgOTI6CWYzIDBmIGMyIGQyIDA0IFsgCV0qY21wbmVxc3MgJXhtbTIsJXhtbTIKLSAgOTc6CWYzIDBmIGMyIDFjIDI0IDA0IFsgCV0qY21wbmVxc3MgXCglZXNwLDFcKSwleG1tMwotICA5ZDoJMGYgYzIgZTUgMDUgWyAJXSpjbXBubHRwcyAleG1tNSwleG1tNAotICBhMToJMGYgYzIgMmUgMDUgWyAJXSpjbXBubHRwcyBcKCVlc2lcKSwleG1tNQotICBhNToJZjMgMGYgYzIgZjcgMDUgWyAJXSpjbXBubHRzcyAleG1tNywleG1tNgotICBhYToJZjMgMGYgYzIgMzggMDUgWyAJXSpjbXBubHRzcyBcKCVlYXhcKSwleG1tNwotICBhZjoJMGYgYzIgMDEgMDYgWyAJXSpjbXBubGVwcyBcKCVlY3hcKSwleG1tMAotICBiMzoJMGYgYzIgY2EgMDYgWyAJXSpjbXBubGVwcyAleG1tMiwleG1tMQotICBiNzoJZjMgMGYgYzIgMTMgMDYgWyAJXSpjbXBubGVzcyBcKCVlYnhcKSwleG1tMgotICBiYzoJZjMgMGYgYzIgZGMgMDYgWyAJXSpjbXBubGVzcyAleG1tNCwleG1tMwotICBjMToJMGYgYzIgNjUgMDAgMDcgWyAJXSpjbXBvcmRwcyAweDBcKCVlYnBcKSwleG1tNAotICBjNjoJMGYgYzIgZWUgMDcgWyAJXSpjbXBvcmRwcyAleG1tNiwleG1tNQotICBjYToJZjMgMGYgYzIgMzcgMDcgWyAJXSpjbXBvcmRzcyBcKCVlZGlcKSwleG1tNgotICBjZjoJZjMgMGYgYzIgZjggMDcgWyAJXSpjbXBvcmRzcyAleG1tMCwleG1tNwotICBkNDoJMGYgMmYgYzEgWyAJXSpjb21pc3MgJXhtbTEsJXhtbTAKLSAgZDc6CTBmIDJmIDBhIFsgCV0qY29taXNzIFwoJWVkeFwpLCV4bW0xCi0gIGRhOgkwZiAyYSBkMyBbIAldKmN2dHBpMnBzICVtbTMsJXhtbTIKLSAgZGQ6CTBmIDJhIDFjIDI0IFsgCV0qY3Z0cGkycHMgXCglZXNwLDFcKSwleG1tMwotICBlMToJZjMgMGYgMmEgZTUgWyAJXSpjdnRzaTJzcyAlZWJwLCV4bW00Ci0gIGU1OglmMyAwZiAyYSAyZSBbIAldKmN2dHNpMnNzIFwoJWVzaVwpLCV4bW01Ci0gIGU5OgkwZiAyZCBmNyBbIAldKmN2dHBzMnBpICV4bW03LCVtbTYKLSAgZWM6CTBmIDJkIDM4IFsgCV0qY3Z0cHMycGkgXCglZWF4XCksJW1tNwotICBlZjoJZjMgMGYgMmQgMDEgWyAJXSpjdnRzczJzaSBcKCVlY3hcKSwlZWF4Ci0gIGYzOglmMyAwZiAyZCBjYSBbIAldKmN2dHNzMnNpICV4bW0yLCVlY3gKLSAgZjc6CTBmIDJjIDEzIFsgCV0qY3Z0dHBzMnBpIFwoJWVieFwpLCVtbTIKLSAgZmE6CTBmIDJjIGRjIFsgCV0qY3Z0dHBzMnBpICV4bW00LCVtbTMKLSAgZmQ6CWYzIDBmIDJjIDY1IDAwIFsgCV0qY3Z0dHNzMnNpIDB4MFwoJWVicFwpLCVlc3AKLSAxMDI6CWYzIDBmIDJjIGVlIFsgCV0qY3Z0dHNzMnNpICV4bW02LCVlYnAKLSAxMDY6CTBmIDVlIGMxIFsgCV0qZGl2cHMgICV4bW0xLCV4bW0wCi0gMTA5OgkwZiA1ZSAwYSBbIAldKmRpdnBzICBcKCVlZHhcKSwleG1tMQotIDEwYzoJZjMgMGYgNWUgZDMgWyAJXSpkaXZzcyAgJXhtbTMsJXhtbTIKLSAxMTA6CWYzIDBmIDVlIDFjIDI0IFsgCV0qZGl2c3MgIFwoJWVzcCwxXCksJXhtbTMKLSAxMTU6CTBmIGFlIDU1IDAwIFsgCV0qbGRteGNzciAweDBcKCVlYnBcKQotIDExOToJMGYgYWUgMWUgWyAJXSpzdG14Y3NyIFwoJWVzaVwpCi0gMTFjOgkwZiBhZSBmOCBbIAldKnNmZW5jZSAKLSAxMWY6CTBmIDVmIGMxIFsgCV0qbWF4cHMgICV4bW0xLCV4bW0wCi0gMTIyOgkwZiA1ZiAwYSBbIAldKm1heHBzICBcKCVlZHhcKSwleG1tMQotIDEyNToJZjMgMGYgNWYgZDMgWyAJXSptYXhzcyAgJXhtbTMsJXhtbTIKLSAxMjk6CWYzIDBmIDVmIDFjIDI0IFsgCV0qbWF4c3MgIFwoJWVzcCwxXCksJXhtbTMKLSAxMmU6CTBmIDVkIGU1IFsgCV0qbWlucHMgICV4bW01LCV4bW00Ci0gMTMxOgkwZiA1ZCAyZSBbIAldKm1pbnBzICBcKCVlc2lcKSwleG1tNQotIDEzNDoJZjMgMGYgNWQgZjcgWyAJXSptaW5zcyAgJXhtbTcsJXhtbTYKLSAxMzg6CWYzIDBmIDVkIDM4IFsgCV0qbWluc3MgIFwoJWVheFwpLCV4bW03Ci0gMTNjOgkwZiAyOCBjMSBbIAldKm1vdmFwcyAleG1tMSwleG1tMAotIDEzZjoJMGYgMjkgMTEgWyAJXSptb3ZhcHMgJXhtbTIsXCglZWN4XCkKLSAxNDI6CTBmIDI4IDEyIFsgCV0qbW92YXBzIFwoJWVkeFwpLCV4bW0yCi0gMTQ1OgkwZiAxNiBkYyBbIAldKm1vdmxocHMgJXhtbTQsJXhtbTMKLSAxNDg6CTBmIDE3IDJjIDI0IFsgCV0qbW92aHBzICV4bW01LFwoJWVzcCwxXCkKLSAxNGM6CTBmIDE2IDJlIFsgCV0qbW92aHBzIFwoJWVzaVwpLCV4bW01Ci0gMTRmOgkwZiAxMiBmNyBbIAldKm1vdmhscHMgJXhtbTcsJXhtbTYKLSAxNTI6CTBmIDEzIDA3IFsgCV0qbW92bHBzICV4bW0wLFwoJWVkaVwpCi0gMTU1OgkwZiAxMiAwMCBbIAldKm1vdmxwcyBcKCVlYXhcKSwleG1tMAotIDE1ODoJMGYgNTAgY2EgWyAJXSptb3Ztc2twcyAleG1tMiwlZWN4Ci0gMTViOgkwZiAxMCBkMyBbIAldKm1vdnVwcyAleG1tMywleG1tMgotIDE1ZToJMGYgMTEgMjIgWyAJXSptb3Z1cHMgJXhtbTQsXCglZWR4XCkKLSAxNjE6CTBmIDEwIDY1IDAwIFsgCV0qbW92dXBzIDB4MFwoJWVicFwpLCV4bW00Ci0gMTY1OglmMyAwZiAxMCBlZSBbIAldKm1vdnNzICAleG1tNiwleG1tNQotIDE2OToJZjMgMGYgMTEgM2UgWyAJXSptb3ZzcyAgJXhtbTcsXCglZXNpXCkKLSAxNmQ6CWYzIDBmIDEwIDM4IFsgCV0qbW92c3MgIFwoJWVheFwpLCV4bW03Ci0gMTcxOgkwZiA1OSBjMSBbIAldKm11bHBzICAleG1tMSwleG1tMAotIDE3NDoJMGYgNTkgMGEgWyAJXSptdWxwcyAgXCglZWR4XCksJXhtbTEKLSAxNzc6CWYzIDBmIDU5IGQyIFsgCV0qbXVsc3MgICV4bW0yLCV4bW0yCi0gMTdiOglmMyAwZiA1OSAxYyAyNCBbIAldKm11bHNzICBcKCVlc3AsMVwpLCV4bW0zCi0gMTgwOgkwZiA1NiBlNSBbIAldKm9ycHMgICAleG1tNSwleG1tNAotIDE4MzoJMGYgNTYgMmUgWyAJXSpvcnBzICAgXCglZXNpXCksJXhtbTUKLSAxODY6CTBmIDUzIGY3IFsgCV0qcmNwcHMgICV4bW03LCV4bW02Ci0gMTg5OgkwZiA1MyAzOCBbIAldKnJjcHBzICBcKCVlYXhcKSwleG1tNwotIDE4YzoJZjMgMGYgNTMgMDEgWyAJXSpyY3BzcyAgXCglZWN4XCksJXhtbTAKLSAxOTA6CWYzIDBmIDUzIGNhIFsgCV0qcmNwc3MgICV4bW0yLCV4bW0xCi0gMTk0OgkwZiA1MiAxMyBbIAldKnJzcXJ0cHMgXCglZWJ4XCksJXhtbTIKLSAxOTc6CTBmIDUyIGRjIFsgCV0qcnNxcnRwcyAleG1tNCwleG1tMwotIDE5YToJZjMgMGYgNTIgNjUgMDAgWyAJXSpyc3FydHNzIDB4MFwoJWVicFwpLCV4bW00Ci0gMTlmOglmMyAwZiA1MiBlZSBbIAldKnJzcXJ0c3MgJXhtbTYsJXhtbTUKLSAxYTM6CTBmIGM2IDM3IDAyIFsgCV0qc2h1ZnBzIFwkMHgyLFwoJWVkaVwpLCV4bW02Ci0gMWE3OgkwZiBjNiBmOCAwMyBbIAldKnNodWZwcyBcJDB4MywleG1tMCwleG1tNwotIDFhYjoJMGYgNTEgYzEgWyAJXSpzcXJ0cHMgJXhtbTEsJXhtbTAKLSAxYWU6CTBmIDUxIDBhIFsgCV0qc3FydHBzIFwoJWVkeFwpLCV4bW0xCi0gMWIxOglmMyAwZiA1MSBkMiBbIAldKnNxcnRzcyAleG1tMiwleG1tMgotIDFiNToJZjMgMGYgNTEgMWMgMjQgWyAJXSpzcXJ0c3MgXCglZXNwLDFcKSwleG1tMwotIDFiYToJMGYgNWMgZTUgWyAJXSpzdWJwcyAgJXhtbTUsJXhtbTQKLSAxYmQ6CTBmIDVjIDJlIFsgCV0qc3VicHMgIFwoJWVzaVwpLCV4bW01Ci0gMWMwOglmMyAwZiA1YyBmNyBbIAldKnN1YnNzICAleG1tNywleG1tNgotIDFjNDoJZjMgMGYgNWMgMzggWyAJXSpzdWJzcyAgXCglZWF4XCksJXhtbTcKLSAxYzg6CTBmIDJlIDAxIFsgCV0qdWNvbWlzcyBcKCVlY3hcKSwleG1tMAotIDFjYjoJMGYgMmUgY2EgWyAJXSp1Y29taXNzICV4bW0yLCV4bW0xCi0gMWNlOgkwZiAxNSAxMyBbIAldKnVucGNraHBzIFwoJWVieFwpLCV4bW0yCi0gMWQxOgkwZiAxNSBkYyBbIAldKnVucGNraHBzICV4bW00LCV4bW0zCi0gMWQ0OgkwZiAxNCA2NSAwMCBbIAldKnVucGNrbHBzIDB4MFwoJWVicFwpLCV4bW00Ci0gMWQ4OgkwZiAxNCBlZSBbIAldKnVucGNrbHBzICV4bW02LCV4bW01Ci0gMWRiOgkwZiA1NyAzNyBbIAldKnhvcnBzICBcKCVlZGlcKSwleG1tNgotIDFkZToJMGYgNTcgZjggWyAJXSp4b3JwcyAgJXhtbTAsJXhtbTcKLSAxZTE6CTBmIGUwIGMxIFsgCV0qcGF2Z2IgICVtbTEsJW1tMAotIDFlNDoJMGYgZTAgMGEgWyAJXSpwYXZnYiAgXCglZWR4XCksJW1tMQotIDFlNzoJMGYgZTMgZDMgWyAJXSpwYXZndyAgJW1tMywlbW0yCi0gMWVhOgkwZiBlMyAxYyAyNCBbIAldKnBhdmd3ICBcKCVlc3AsMVwpLCVtbTMKLSAxZWU6CTBmIGM1IGM4IDAwIFsgCV0qcGV4dHJ3IFwkMHgwLCVtbTEsJWVheAotIDFmMjoJMGYgYzQgMDkgMDEgWyAJXSpwaW5zcncgXCQweDEsXCglZWN4XCksJW1tMQotIDFmNjoJMGYgYzQgZDIgMDIgWyAJXSpwaW5zcncgXCQweDIsJWVkeCwlbW0yCi0gMWZhOgkwZiBlZSBjMSBbIAldKnBtYXhzdyAlbW0xLCVtbTAKLSAxZmQ6CTBmIGVlIDBhIFsgCV0qcG1heHN3IFwoJWVkeFwpLCVtbTEKLSAyMDA6CTBmIGRlIGQyIFsgCV0qcG1heHViICVtbTIsJW1tMgotIDIwMzoJMGYgZGUgMWMgMjQgWyAJXSpwbWF4dWIgXCglZXNwLDFcKSwlbW0zCi0gMjA3OgkwZiBlYSBlNSBbIAldKnBtaW5zdyAlbW01LCVtbTQKLSAyMGE6CTBmIGVhIDJlIFsgCV0qcG1pbnN3IFwoJWVzaVwpLCVtbTUKLSAyMGQ6CTBmIGRhIGY3IFsgCV0qcG1pbnViICVtbTcsJW1tNgotIDIxMDoJMGYgZGEgMzggWyAJXSpwbWludWIgXCglZWF4XCksJW1tNwotIDIxMzoJMGYgZDcgZTggWyAJXSpwbW92bXNrYiAlbW01LCVlYXgKLSAyMTY6CTBmIGU0IGU1IFsgCV0qcG11bGh1dyAlbW01LCVtbTQKLSAyMTk6CTBmIGU0IDJlIFsgCV0qcG11bGh1dyBcKCVlc2lcKSwlbW01Ci0gMjFjOgkwZiBmNiBmNyBbIAldKnBzYWRidyAlbW03LCVtbTYKLSAyMWY6CTBmIGY2IDM4IFsgCV0qcHNhZGJ3IFwoJWVheFwpLCVtbTcKLSAyMjI6CTBmIDcwIGRhIDAxIFsgCV0qcHNodWZ3IFwkMHgxLCVtbTIsJW1tMwotIDIyNjoJMGYgNzAgNzUgMDAgMDQgWyAJXSpwc2h1ZncgXCQweDQsMHgwXCglZWJwXCksJW1tNgotIDIyYjoJMGYgZjcgYzcgWyAJXSptYXNrbW92cSAlbW03LCVtbTAKLSAyMmU6CTBmIDJiIDMzIFsgCV0qbW92bnRwcyAleG1tNixcKCVlYnhcKQotIDIzMToJMGYgZTcgMTAgWyAJXSptb3ZudHEgJW1tMixcKCVlYXhcKQotIDIzNDoJMGYgMTggMDYgWyAJXSpwcmVmZXRjaG50YSBcKCVlc2lcKQotIDIzNzoJMGYgMTggMGMgOTggWyAJXSpwcmVmZXRjaHQwIFwoJWVheCwlZWJ4LDRcKQotIDIzYjoJMGYgMTggMTIgWyAJXSpwcmVmZXRjaHQxIFwoJWVkeFwpCi0gMjNlOgkwZiAxOCAxOSBbIAldKnByZWZldGNodDIgXCglZWN4XCkKLSAyNDE6CTJlIDBmIFsgCV0qXChiYWRcKSAgCi0gMjQzOgljMiAwYSAwOCBbIAldKnJldCAgICBcJDB4ODBhCi0gMjQ2Ogk5MCBbIAldKm5vcCAgICAKLSAyNDc6CTkwIFsgCV0qbm9wICAgIAotIDI0ODoJNjUgWyAJXSpncwotIDI0OToJMGYgWyAJXSpzZmVuY2UuKlwoYmFkXCkuKgotIDI0YToJYWUgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVhbAotIDI0YjoJZmYgMDAgWyAJXSppbmNsICAgXCglZWF4XCkKLSAyNGQ6CTAwIDAwIFsgCV0qYWRkICAgICVhbCxcKCVlYXhcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGQxNWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkucworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0jUElJSSBTSU1EIGluc3RydWN0aW9ucwotCi0udGV4dAotZm9vOgotIGFkZHBzCQkoJWVjeCksJXhtbTAKLSBhZGRwcwkJJXhtbTIsJXhtbTEKLSBhZGRzcwkJKCVlYngpLCV4bW0yCi0gYWRkc3MJCSV4bW00LCV4bW0zCi0gYW5kbnBzCQkweDAoJWVicCksJXhtbTQKLSBhbmRucHMJCSV4bW02LCV4bW01Ci0gYW5kcHMJCSglZWRpKSwleG1tNgotIGFuZHBzCQkleG1tMCwleG1tNwotIGNtcHBzCQkkMHgyLCV4bW0xLCV4bW0wCi0gY21wcHMJCSQweDMsKCVlZHgpLCV4bW0xCi0gY21wc3MJCSQweDQsJXhtbTIsJXhtbTIKLSBjbXBzcwkJJDB4NSwoJWVzcCwxKSwleG1tMwotIGNtcHBzCQkkMHg2LCV4bW01LCV4bW00Ci0gY21wcHMJCSQweDcsKCVlc2kpLCV4bW01Ci0gY21wc3MJCSQweDAsJXhtbTcsJXhtbTYKLSBjbXBzcwkJJDB4MSwoJWVheCksJXhtbTcKLSBjbXBlcXBzCSV4bW0xLCV4bW0wCi0gY21wZXFwcwkoJWVkeCksJXhtbTEKLSBjbXBlcXNzCSV4bW0yLCV4bW0yCi0gY21wZXFzcwkoJWVzcCwxKSwleG1tMwotIGNtcGx0cHMJJXhtbTUsJXhtbTQKLSBjbXBsdHBzCSglZXNpKSwleG1tNQotIGNtcGx0c3MJJXhtbTcsJXhtbTYKLSBjbXBsdHNzCSglZWF4KSwleG1tNwotIGNtcGxlcHMJKCVlY3gpLCV4bW0wCi0gY21wbGVwcwkleG1tMiwleG1tMQotIGNtcGxlc3MJKCVlYngpLCV4bW0yCi0gY21wbGVzcwkleG1tNCwleG1tMwotIGNtcHVub3JkcHMJMHgwKCVlYnApLCV4bW00Ci0gY21wdW5vcmRwcwkleG1tNiwleG1tNQotIGNtcHVub3Jkc3MJKCVlZGkpLCV4bW02Ci0gY21wdW5vcmRzcwkleG1tMCwleG1tNwotIGNtcG5lcXBzCSV4bW0xLCV4bW0wCi0gY21wbmVxcHMJKCVlZHgpLCV4bW0xCi0gY21wbmVxc3MJJXhtbTIsJXhtbTIKLSBjbXBuZXFzcwkoJWVzcCwxKSwleG1tMwotIGNtcG5sdHBzCSV4bW01LCV4bW00Ci0gY21wbmx0cHMJKCVlc2kpLCV4bW01Ci0gY21wbmx0c3MJJXhtbTcsJXhtbTYKLSBjbXBubHRzcwkoJWVheCksJXhtbTcKLSBjbXBubGVwcwkoJWVjeCksJXhtbTAKLSBjbXBubGVwcwkleG1tMiwleG1tMQotIGNtcG5sZXNzCSglZWJ4KSwleG1tMgotIGNtcG5sZXNzCSV4bW00LCV4bW0zCi0gY21wb3JkcHMJMHgwKCVlYnApLCV4bW00Ci0gY21wb3JkcHMJJXhtbTYsJXhtbTUKLSBjbXBvcmRzcwkoJWVkaSksJXhtbTYKLSBjbXBvcmRzcwkleG1tMCwleG1tNwotIGNvbWlzcwkJJXhtbTEsJXhtbTAKLSBjb21pc3MJCSglZWR4KSwleG1tMQotIGN2dHBpMnBzCSVtbTMsJXhtbTIKLSBjdnRwaTJwcwkoJWVzcCwxKSwleG1tMwotIGN2dHNpMnNzCSVlYnAsJXhtbTQKLSBjdnRzaTJzcwkoJWVzaSksJXhtbTUKLSBjdnRwczJwaQkleG1tNywlbW02Ci0gY3Z0cHMycGkJKCVlYXgpLCVtbTcKLSBjdnRzczJzaQkoJWVjeCksJWVheAotIGN2dHNzMnNpCSV4bW0yLCVlY3gKLSBjdnR0cHMycGkJKCVlYngpLCVtbTIKLSBjdnR0cHMycGkJJXhtbTQsJW1tMwotIGN2dHRzczJzaQkweDAoJWVicCksJWVzcAotIGN2dHRzczJzaQkleG1tNiwlZWJwCi0gZGl2cHMJCSV4bW0xLCV4bW0wCi0gZGl2cHMJCSglZWR4KSwleG1tMQotIGRpdnNzCQkleG1tMywleG1tMgotIGRpdnNzCQkoJWVzcCwxKSwleG1tMwotIGxkbXhjc3IJMHgwKCVlYnApCi0gc3RteGNzcgkoJWVzaSkKLSBzZmVuY2UKLSBtYXhwcwkJJXhtbTEsJXhtbTAKLSBtYXhwcwkJKCVlZHgpLCV4bW0xCi0gbWF4c3MJCSV4bW0zLCV4bW0yCi0gbWF4c3MJCSglZXNwLDEpLCV4bW0zCi0gbWlucHMJCSV4bW01LCV4bW00Ci0gbWlucHMJCSglZXNpKSwleG1tNQotIG1pbnNzCQkleG1tNywleG1tNgotIG1pbnNzCQkoJWVheCksJXhtbTcKLSBtb3ZhcHMJCSV4bW0xLCV4bW0wCi0gbW92YXBzCQkleG1tMiwoJWVjeCkKLSBtb3ZhcHMJCSglZWR4KSwleG1tMgotIG1vdmxocHMJJXhtbTQsJXhtbTMKLSBtb3ZocHMJCSV4bW01LCglZXNwLDEpCi0gbW92aHBzCQkoJWVzaSksJXhtbTUKLSBtb3ZobHBzCSV4bW03LCV4bW02Ci0gbW92bHBzCQkleG1tMCwoJWVkaSkKLSBtb3ZscHMJCSglZWF4KSwleG1tMAotIG1vdm1za3BzCSV4bW0yLCVlY3gKLSBtb3Z1cHMJCSV4bW0zLCV4bW0yCi0gbW92dXBzCQkleG1tNCwoJWVkeCkKLSBtb3Z1cHMJCTB4MCglZWJwKSwleG1tNAotIG1vdnNzCQkleG1tNiwleG1tNQotIG1vdnNzCQkleG1tNywoJWVzaSkKLSBtb3ZzcwkJKCVlYXgpLCV4bW03Ci0gbXVscHMJCSV4bW0xLCV4bW0wCi0gbXVscHMJCSglZWR4KSwleG1tMQotIG11bHNzCQkleG1tMiwleG1tMgotIG11bHNzCQkoJWVzcCwxKSwleG1tMwotIG9ycHMJCSV4bW01LCV4bW00Ci0gb3JwcwkJKCVlc2kpLCV4bW01Ci0gcmNwcHMJCSV4bW03LCV4bW02Ci0gcmNwcHMJCSglZWF4KSwleG1tNwotIHJjcHNzCQkoJWVjeCksJXhtbTAKLSByY3BzcwkJJXhtbTIsJXhtbTEKLSByc3FydHBzCSglZWJ4KSwleG1tMgotIHJzcXJ0cHMJJXhtbTQsJXhtbTMKLSByc3FydHNzCTB4MCglZWJwKSwleG1tNAotIHJzcXJ0c3MJJXhtbTYsJXhtbTUKLSBzaHVmcHMJCSQweDIsKCVlZGkpLCV4bW02Ci0gc2h1ZnBzCQkkMHgzLCV4bW0wLCV4bW03Ci0gc3FydHBzCQkleG1tMSwleG1tMAotIHNxcnRwcwkJKCVlZHgpLCV4bW0xCi0gc3FydHNzCQkleG1tMiwleG1tMgotIHNxcnRzcwkJKCVlc3AsMSksJXhtbTMKLSBzdWJwcwkJJXhtbTUsJXhtbTQKLSBzdWJwcwkJKCVlc2kpLCV4bW01Ci0gc3Vic3MJCSV4bW03LCV4bW02Ci0gc3Vic3MJCSglZWF4KSwleG1tNwotIHVjb21pc3MJKCVlY3gpLCV4bW0wCi0gdWNvbWlzcwkleG1tMiwleG1tMQotIHVucGNraHBzCSglZWJ4KSwleG1tMgotIHVucGNraHBzCSV4bW00LCV4bW0zCi0gdW5wY2tscHMJMHgwKCVlYnApLCV4bW00Ci0gdW5wY2tscHMJJXhtbTYsJXhtbTUKLSB4b3JwcwkJKCVlZGkpLCV4bW02Ci0geG9ycHMJCSV4bW0wLCV4bW03Ci0gcGF2Z2IJCSVtbTEsJW1tMAotIHBhdmdiCQkoJWVkeCksJW1tMQotIHBhdmd3CQklbW0zLCVtbTIKLSBwYXZndwkJKCVlc3AsMSksJW1tMwotIHBleHRydwkJJDB4MCwlbW0xLCVlYXgKLSBwaW5zcncJCSQweDEsKCVlY3gpLCVtbTEKLSBwaW5zcncJCSQweDIsJWVkeCwlbW0yCi0gcG1heHN3CQklbW0xLCVtbTAKLSBwbWF4c3cJCSglZWR4KSwlbW0xCi0gcG1heHViCQklbW0yLCVtbTIKLSBwbWF4dWIJCSglZXNwLDEpLCVtbTMKLSBwbWluc3cJCSVtbTUsJW1tNAotIHBtaW5zdwkJKCVlc2kpLCVtbTUKLSBwbWludWIJCSVtbTcsJW1tNgotIHBtaW51YgkJKCVlYXgpLCVtbTcKLSBwbW92bXNrYgklbW01LCVlYXgKLSBwbXVsaHV3CSVtbTUsJW1tNAotIHBtdWxodXcJKCVlc2kpLCVtbTUKLSBwc2FkYncJCSVtbTcsJW1tNgotIHBzYWRidwkJKCVlYXgpLCVtbTcKLSBwc2h1ZncJCSQweDEsJW1tMiwlbW0zCi0gcHNodWZ3CQkkMHg0LDB4MCglZWJwKSwlbW02Ci0gbWFza21vdnEJJW1tNywlbW0wCi0gbW92bnRwcwkleG1tNiwoJWVieCkKLSBtb3ZudHEJCSVtbTIsKCVlYXgpCi0gcHJlZmV0Y2hudGEJKCVlc2kpCi0gcHJlZmV0Y2h0MAkoJWVheCwlZWJ4LDQpCi0gcHJlZmV0Y2h0MQkoJWVkeCkKLSBwcmVmZXRjaHQyCSglZWN4KQotCi0jIEEgU0lNRCBpbnN0cnVjdGlvbiB3aXRoIGEgYmFkIGV4dGVuc2lvbiBieXRlCi0uYnl0ZSAweDJFLDB4MEYsMHhDMiwweDBBLDB4MDgKLSBub3AKLSBub3AKLSMgQSBiYWQgc2ZlbmNlIG1vZHJtIGJ5dGUKLS5ieXRlIDB4NjUsMHgwRiwweEFFLDB4ZmYKLSMgUGFkIG91dCB0byBnb29kIGFsaWdubWVudAotIC5wMmFsaWduIDQsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNiMDk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ubAorKysgL2Rldi9udWxsCkBAIC0xLDE5ODQgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjEyODogV2FybmluZzouKgotLio6MTI5OiBXYXJuaW5nOi4qCi0uKjoxMzA6IFdhcm5pbmc6LioKLS4qOjEzMTogV2FybmluZzouKgotLio6MTMyOiBXYXJuaW5nOi4qCi0uKjoxMzM6IFdhcm5pbmc6LioKLS4qOjEzNDogV2FybmluZzouKgotLio6MTM1OiBXYXJuaW5nOi4qCi0uKjoxOTI6IFdhcm5pbmc6LioKLS4qOjE5MzogV2FybmluZzouKgotLio6MTk0OiBXYXJuaW5nOi4qCi0uKjoxOTU6IFdhcm5pbmc6LioKLS4qOjE5NjogV2FybmluZzouKgotLio6MTk3OiBXYXJuaW5nOi4qCi0uKjoxOTg6IFdhcm5pbmc6LioKLS4qOjE5OTogV2FybmluZzouKgotLio6MjU2OiBXYXJuaW5nOi4qCi0uKjoyNTc6IFdhcm5pbmc6LioKLS4qOjI1ODogV2FybmluZzouKgotLio6MjU5OiBXYXJuaW5nOi4qCi0uKjoyNjA6IFdhcm5pbmc6LioKLS4qOjI2MTogV2FybmluZzouKgotLio6MjYyOiBXYXJuaW5nOi4qCi0uKjoyNjM6IFdhcm5pbmc6LioKLS4qOjM4NDogV2FybmluZzouKgotLio6Mzg1OiBXYXJuaW5nOi4qCi0uKjozODY6IFdhcm5pbmc6LioKLS4qOjM4NzogV2FybmluZzouKgotLio6Mzg4OiBXYXJuaW5nOi4qCi0uKjozODk6IFdhcm5pbmc6LioKLS4qOjM5MDogV2FybmluZzouKgotLio6MzkxOiBXYXJuaW5nOi4qCi0uKjo0NDg6IFdhcm5pbmc6LioKLS4qOjQ0OTogV2FybmluZzouKgotLio6NDUwOiBXYXJuaW5nOi4qCi0uKjo0NTE6IFdhcm5pbmc6LioKLS4qOjQ1MjogV2FybmluZzouKgotLio6NDUzOiBXYXJuaW5nOi4qCi0uKjo0NTQ6IFdhcm5pbmc6LioKLS4qOjQ1NTogV2FybmluZzouKgotLio6NTEyOiBXYXJuaW5nOi4qCi0uKjo1MTM6IFdhcm5pbmc6LioKLS4qOjUxNDogV2FybmluZzouKgotLio6NTE1OiBXYXJuaW5nOi4qCi0uKjo1MTY6IFdhcm5pbmc6LioKLS4qOjUxNzogV2FybmluZzouKgotLio6NTE4OiBXYXJuaW5nOi4qCi0uKjo1MTk6IFdhcm5pbmc6LioKLS4qOjY0MDogV2FybmluZzouKgotLio6NjQxOiBXYXJuaW5nOi4qCi0uKjo2NDI6IFdhcm5pbmc6LioKLS4qOjY0MzogV2FybmluZzouKgotLio6NjQ0OiBXYXJuaW5nOi4qCi0uKjo2NDU6IFdhcm5pbmc6LioKLS4qOjY0NjogV2FybmluZzouKgotLio6NjQ3OiBXYXJuaW5nOi4qCi0uKjo3MDQ6IFdhcm5pbmc6LioKLS4qOjcwNTogV2FybmluZzouKgotLio6NzA2OiBXYXJuaW5nOi4qCi0uKjo3MDc6IFdhcm5pbmc6LioKLS4qOjcwODogV2FybmluZzouKgotLio6NzA5OiBXYXJuaW5nOi4qCi0uKjo3MTA6IFdhcm5pbmc6LioKLS4qOjcxMTogV2FybmluZzouKgotLio6NzY4OiBXYXJuaW5nOi4qCi0uKjo3Njk6IFdhcm5pbmc6LioKLS4qOjc3MDogV2FybmluZzouKgotLio6NzcxOiBXYXJuaW5nOi4qCi0uKjo3NzI6IFdhcm5pbmc6LioKLS4qOjc3MzogV2FybmluZzouKgotLio6Nzc0OiBXYXJuaW5nOi4qCi0uKjo3NzU6IFdhcm5pbmc6LioKLS4qOjgxMjogV2FybmluZzouKgotLio6ODIwOiBXYXJuaW5nOi4qCi0uKjo4Mjg6IFdhcm5pbmc6LioKLS4qOjgzMzogV2FybmluZzouKgotLio6ODM0OiBXYXJuaW5nOi4qCi0uKjo4MzU6IFdhcm5pbmc6LioKLS4qOjk2MTogV2FybmluZzouKgotLio6OTYyOiBXYXJuaW5nOi4qCi0uKjo5NjM6IFdhcm5pbmc6LioKLS4qOjk2NDogV2FybmluZzouKgotLio6OTY1OiBXYXJuaW5nOi4qCi0uKjo5NjY6IFdhcm5pbmc6LioKLS4qOjk2NzogV2FybmluZzouKgotLio6OTY4OiBXYXJuaW5nOi4qCi0uKjoxMDI1OiBXYXJuaW5nOi4qCi0uKjoxMDI2OiBXYXJuaW5nOi4qCi0uKjoxMDI3OiBXYXJuaW5nOi4qCi0uKjoxMDI4OiBXYXJuaW5nOi4qCi0uKjoxMDI5OiBXYXJuaW5nOi4qCi0uKjoxMDMwOiBXYXJuaW5nOi4qCi0uKjoxMDMxOiBXYXJuaW5nOi4qCi0uKjoxMDMyOiBXYXJuaW5nOi4qCi0uKjoxMDg5OiBXYXJuaW5nOi4qCi0uKjoxMDkwOiBXYXJuaW5nOi4qCi0uKjoxMDkxOiBXYXJuaW5nOi4qCi0uKjoxMDkyOiBXYXJuaW5nOi4qCi0uKjoxMDkzOiBXYXJuaW5nOi4qCi0uKjoxMDk0OiBXYXJuaW5nOi4qCi0uKjoxMDk1OiBXYXJuaW5nOi4qCi0uKjoxMDk2OiBXYXJuaW5nOi4qCi0uKjoxMjE3OiBXYXJuaW5nOi4qCi0uKjoxMjE4OiBXYXJuaW5nOi4qCi0uKjoxMjE5OiBXYXJuaW5nOi4qCi0uKjoxMjIwOiBXYXJuaW5nOi4qCi0uKjoxMjIxOiBXYXJuaW5nOi4qCi0uKjoxMjIyOiBXYXJuaW5nOi4qCi0uKjoxMjIzOiBXYXJuaW5nOi4qCi0uKjoxMjI0OiBXYXJuaW5nOi4qCi0uKjoxMjgxOiBXYXJuaW5nOi4qCi0uKjoxMjgyOiBXYXJuaW5nOi4qCi0uKjoxMjgzOiBXYXJuaW5nOi4qCi0uKjoxMjg0OiBXYXJuaW5nOi4qCi0uKjoxMjg1OiBXYXJuaW5nOi4qCi0uKjoxMjg2OiBXYXJuaW5nOi4qCi0uKjoxMjg3OiBXYXJuaW5nOi4qCi0uKjoxMjg4OiBXYXJuaW5nOi4qCi0uKjoxMzQ1OiBXYXJuaW5nOi4qCi0uKjoxMzQ2OiBXYXJuaW5nOi4qCi0uKjoxMzQ3OiBXYXJuaW5nOi4qCi0uKjoxMzQ4OiBXYXJuaW5nOi4qCi0uKjoxMzQ5OiBXYXJuaW5nOi4qCi0uKjoxMzUwOiBXYXJuaW5nOi4qCi0uKjoxMzUxOiBXYXJuaW5nOi4qCi0uKjoxMzUyOiBXYXJuaW5nOi4qCi0uKjoxNDczOiBXYXJuaW5nOi4qCi0uKjoxNDc0OiBXYXJuaW5nOi4qCi0uKjoxNDc1OiBXYXJuaW5nOi4qCi0uKjoxNDc2OiBXYXJuaW5nOi4qCi0uKjoxNDc3OiBXYXJuaW5nOi4qCi0uKjoxNDc4OiBXYXJuaW5nOi4qCi0uKjoxNDc5OiBXYXJuaW5nOi4qCi0uKjoxNDgwOiBXYXJuaW5nOi4qCi0uKjoxNTM3OiBXYXJuaW5nOi4qCi0uKjoxNTM4OiBXYXJuaW5nOi4qCi0uKjoxNTM5OiBXYXJuaW5nOi4qCi0uKjoxNTQwOiBXYXJuaW5nOi4qCi0uKjoxNTQxOiBXYXJuaW5nOi4qCi0uKjoxNTQyOiBXYXJuaW5nOi4qCi0uKjoxNTQzOiBXYXJuaW5nOi4qCi0uKjoxNTQ0OiBXYXJuaW5nOi4qCi0uKjoxNjAxOiBXYXJuaW5nOi4qCi0uKjoxNjAyOiBXYXJuaW5nOi4qCi0uKjoxNjAzOiBXYXJuaW5nOi4qCi0uKjoxNjA0OiBXYXJuaW5nOi4qCi0uKjoxNjA1OiBXYXJuaW5nOi4qCi0uKjoxNjA2OiBXYXJuaW5nOi4qCi0uKjoxNjA3OiBXYXJuaW5nOi4qCi0uKjoxNjA4OiBXYXJuaW5nOi4qCi0uKjoxNjQ1OiBXYXJuaW5nOi4qCi0uKjoxNjUzOiBXYXJuaW5nOi4qCi0uKjoxNjYxOiBXYXJuaW5nOi4qCi0uKjoxNjY2OiBXYXJuaW5nOi4qCi0uKjoxNjY3OiBXYXJuaW5nOi4qCi0uKjoxNjY4OiBXYXJuaW5nOi4qCi0gICAxICAgICAgICAgICAgICAgICAgICAgICAJLnBzaXplIDAKLSAgIDIgICAgICAgICAgICAgICAgICAgICAgIAkudGV4dAotICAgMyAwMDAwIDM2OEMxOCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4XCkKLSAgIDQgMDAwMyAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeFwpCi0gICA1IDAwMDYgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHhcKQotICAgNiAwMDA5IDM2OEMxQiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4XCkKLSAgIDcgMDAwYyAzNjhDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjAKLSAgIDggMDAxMyAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaVwpCi0gICA5IDAwMTYgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGlcKQotICAxMCAwMDE5IDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheFwpCi0gIDExIDAwMWQgMzY4QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4XCkKLSAgMTIgMDAyMSAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHhcKQotICAxMyAwMDI1IDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieFwpCi0gIDE0IDAwMjkgOEM1RDEyICAgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwXCkKLSAgMTUgMDAyYyAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2lcKQotICAxNiAwMDMwIDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaVwpCi0gIDE3IDAwMzQgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4XCkKLSAgMTggMDAzYiAzNjhDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3hcKQotICAxOSAwMDQyIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeFwpCi0gIDIwIDAwNDkgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4XCkKLSAgMjEgMDA1MCA4QzlENzg1NiAzNDEyICAgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnBcKQotICAyMiAwMDU2IDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaVwpCi0gIDIzIDAwNWQgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpXCkKLSAgMjQgMDA2NCA4Q0Q4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVheAotICAyNSAwMDY2IDhDRDkgICAgICAgICAgICAgIAkJbW92CSVkcywlZWN4Ci0gIDI2IDAwNjggOENEQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlZHgKLSAgMjcgMDA2YSA4Q0RCICAgICAgICAgICAgICAJCW1vdgklZHMsJWVieAotICAyOCAwMDZjIDhDREMgICAgICAgICAgICAgIAkJbW92CSVkcywlZXNwCi0gIDI5IDAwNmUgOENERCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYnAKLSAgMzAgMDA3MCA4Q0RFICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzaQotICAzMSAwMDcyIDhDREYgICAgICAgICAgICAgIAkJbW92CSVkcywlZWRpCi0gIDMyIDAwNzQgMzY4QzFDMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCwxXCkKLSAgMzMgMDA3OCAzNjhDMUMwMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDFcKQotICAzNCAwMDdjIDM2OEMxQzAyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsMVwpCi0gIDM1IDAwODAgMzY4QzFDMDMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCwxXCkKLSAgMzYgMDA4NCA4QzFDMDQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDFcKQotICAzNyAwMDg3IDM2OEMxQzA1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCwxXCkKLSAgMzggMDA4ZiAzNjhDMUMwNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDFcKQotICAzOSAwMDkzIDM2OEMxQzA3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsMVwpCi0gIDQwIDAwOTcgMzY4QzFDMDggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCwxXCkKLSAgNDEgMDA5YiAzNjhDMUMwOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDFcKQotICA0MiAwMDlmIDM2OEMxQzBBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsMVwpCi0gIDQzIDAwYTMgMzY4QzFDMEIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCwxXCkKLSAgNDQgMDBhNyA4QzFDMEMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDFcKQotICA0NSAwMGFhIDM2OEMxQzBEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCwxXCkKLSAgNDYgMDBiMiAzNjhDMUMwRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDFcKQotICA0NyAwMGI2IDM2OEMxQzBGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsMVwpCi0gIDQ4IDAwYmEgMzY4QzFDMTAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCwxXCkKLSAgNDkgMDBiZSAzNjhDMUMxMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDFcKQotICA1MCAwMGMyIDM2OEMxQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsMVwpCi0gIDUxIDAwYzYgMzY4QzFDMTMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCwxXCkKLSAgNTIgMDBjYSA4QzFDMTQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDFcKQotICA1MyAwMGNkIDM2OEMxQzE1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCwxXCkKLSAgNTQgMDBkNSAzNjhDMUMxNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDFcKQotICA1NSAwMGQ5IDM2OEMxQzE3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsMVwpCi0gIDU2IDAwZGQgMzY4QzFDMTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCwxXCkKLSAgNTcgMDBlMSAzNjhDMUMxOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDFcKQotICA1OCAwMGU1IDM2OEMxQzFBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsMVwpCi0gIDU5IDAwZTkgMzY4QzFDMUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCwxXCkKLSAgNjAgMDBlZCA4QzFDMUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDFcKQotICA2MSAwMGYwIDM2OEMxQzFEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCwxXCkKLSAgNjIgMDBmOCAzNjhDMUMxRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDFcKQotICA2MyAwMGZjIDM2OEMxQzFGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsMVwpCi0gIDY0IDAxMDAgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsMVwpCi0gIDY1IDAxMDMgMzY4QzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsMVwpCi0gIDY2IDAxMDYgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsMVwpCi0gIDY3IDAxMDkgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsMVwpCi0gIDY4IDAxMGMgOEMxQzI0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsMVwpCi0gIDY5IDAxMGYgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCwxXCkKLSAgNzAgMDExNiAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwxXCkKLSAgNzEgMDExOSAzNjhDMUYgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwxXCkKLSAgNzIgMDExYyAzNjhDMUMyOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDFcKQotICA3MyAwMTIwIDM2OEMxQzI5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsMVwpCi0gIDc0IDAxMjQgMzY4QzFDMkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCwxXCkKLSAgNzUgMDEyOCAzNjhDMUMyQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDFcKQotICA3NiAwMTJjIDhDMUMyQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsMVwpCi0gIDc3IDAxMmYgMzY4QzFDMkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDFcKQotICA3OCAwMTM3IDM2OEMxQzJFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsMVwpCi0gIDc5IDAxM2IgMzY4QzFDMkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCwxXCkKLSAgODAgMDEzZiAzNjhDMUMzMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDFcKQotICA4MSAwMTQzIDM2OEMxQzMxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksMVwpCi0gIDgyIDAxNDcgMzY4QzFDMzIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSwxXCkKLSAgODMgMDE0YiAzNjhDMUMzMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDFcKQotICA4NCAwMTRmIDhDMUMzNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksMVwpCi0gIDg1IDAxNTIgMzY4QzFDMzUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDFcKQotICA4NiAwMTVhIDM2OEMxQzM2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksMVwpCi0gIDg3IDAxNWUgMzY4QzFDMzcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSwxXCkKLSAgODggMDE2MiAzNjhDMUMzOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDFcKQotICA4OSAwMTY2IDM2OEMxQzM5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksMVwpCi0gIDkwIDAxNmEgMzY4QzFDM0EgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSwxXCkKLSAgOTEgMDE2ZSAzNjhDMUMzQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDFcKQotICA5MiAwMTcyIDhDMUMzQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksMVwpCi0gIDkzIDAxNzUgMzY4QzFDM0QgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDFcKQotICA5NCAwMTdkIDM2OEMxQzNFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksMVwpCi0gIDk1IDAxODEgMzY4QzFDM0YgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSwxXCkKLSAgOTYgMDE4NSAzNjhDMUM0MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDJcKQotICA5NyAwMTg5IDM2OEMxQzQxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsMlwpCi0gIDk4IDAxOGQgMzY4QzFDNDIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCwyXCkKLSAgOTkgMDE5MSAzNjhDMUM0MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDJcKQotIDEwMCAwMTk1IDhDMUM0NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsMlwpCi0gMTAxIDAxOTggMzY4QzFDNDUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDJcKQotIDEwMiAwMWEwIDM2OEMxQzQ2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsMlwpCi0gMTAzIDAxYTQgMzY4QzFDNDcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCwyXCkKLSAxMDQgMDFhOCAzNjhDMUM0OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDJcKQotIDEwNSAwMWFjIDM2OEMxQzQ5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsMlwpCi0gMTA2IDAxYjAgMzY4QzFDNEEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCwyXCkKLSAxMDcgMDFiNCAzNjhDMUM0QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDJcKQotIDEwOCAwMWI4IDhDMUM0QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsMlwpCi0gMTA5IDAxYmIgMzY4QzFDNEQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDJcKQotIDExMCAwMWMzIDM2OEMxQzRFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsMlwpCi0gMTExIDAxYzcgMzY4QzFDNEYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCwyXCkKLSAxMTIgMDFjYiAzNjhDMUM1MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDJcKQotIDExMyAwMWNmIDM2OEMxQzUxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsMlwpCi0gMTE0IDAxZDMgMzY4QzFDNTIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCwyXCkKLSAxMTUgMDFkNyAzNjhDMUM1MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDJcKQotIDExNiAwMWRiIDhDMUM1NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsMlwpCi0gMTE3IDAxZGUgMzY4QzFDNTUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDJcKQotIDExOCAwMWU2IDM2OEMxQzU2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsMlwpCi0gMTE5IDAxZWEgMzY4QzFDNTcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCwyXCkKLSAxMjAgMDFlZSAzNjhDMUM1OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDJcKQotIDEyMSAwMWYyIDM2OEMxQzU5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsMlwpCi0gMTIyIDAxZjYgMzY4QzFDNUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCwyXCkKLSAxMjMgMDFmYSAzNjhDMUM1QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDJcKQotIDEyNCAwMWZlIDhDMUM1QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsMlwpCi0gMTI1IDAyMDEgMzY4QzFDNUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDJcKQotIDEyNiAwMjA5IDM2OEMxQzVFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsMlwpCi0gMTI3IDAyMGQgMzY4QzFDNUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCwyXCkKLSAxMjggMDIxMSAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDEyOSAwMjE0IDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gMTMwIDAyMTcgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsMlwpCi0uKldhcm5pbmc6LioKLSAxMzEgMDIxYSAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDEzMiAwMjFkIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gMTMzIDAyMjAgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCwyXCkKLS4qV2FybmluZzouKgotIDEzNCAwMjI3IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gMTM1IDAyMmEgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAxMzYgMDIyZCAzNjhDMUM2OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDJcKQotIDEzNyAwMjMxIDM2OEMxQzY5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsMlwpCi0gMTM4IDAyMzUgMzY4QzFDNkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCwyXCkKLSAxMzkgMDIzOSAzNjhDMUM2QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDJcKQotIDE0MCAwMjNkIDhDMUM2QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsMlwpCi0gMTQxIDAyNDAgMzY4QzFDNkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDJcKQotIDE0MiAwMjQ4IDM2OEMxQzZFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsMlwpCi0gMTQzIDAyNGMgMzY4QzFDNkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCwyXCkKLSAxNDQgMDI1MCAzNjhDMUM3MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDJcKQotIDE0NSAwMjU0IDM2OEMxQzcxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksMlwpCi0gMTQ2IDAyNTggMzY4QzFDNzIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSwyXCkKLSAxNDcgMDI1YyAzNjhDMUM3MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDJcKQotIDE0OCAwMjYwIDhDMUM3NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksMlwpCi0gMTQ5IDAyNjMgMzY4QzFDNzUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDJcKQotIDE1MCAwMjZiIDM2OEMxQzc2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksMlwpCi0gMTUxIDAyNmYgMzY4QzFDNzcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSwyXCkKLSAxNTIgMDI3MyAzNjhDMUM3OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDJcKQotIDE1MyAwMjc3IDM2OEMxQzc5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksMlwpCi0gMTU0IDAyN2IgMzY4QzFDN0EgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSwyXCkKLSAxNTUgMDI3ZiAzNjhDMUM3QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDJcKQotIDE1NiAwMjgzIDhDMUM3QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksMlwpCi0gMTU3IDAyODYgMzY4QzFDN0QgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDJcKQotIDE1OCAwMjhlIDM2OEMxQzdFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksMlwpCi0gMTU5IDAyOTIgMzY4QzFDN0YgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSwyXCkKLSAxNjAgMDI5NiAzNjhDMUM4MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDRcKQotIDE2MSAwMjlhIDM2OEMxQzgxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsNFwpCi0gMTYyIDAyOWUgMzY4QzFDODIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCw0XCkKLSAxNjMgMDJhMiAzNjhDMUM4MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDRcKQotIDE2NCAwMmE2IDhDMUM4NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsNFwpCi0gMTY1IDAyYTkgMzY4QzFDODUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDRcKQotIDE2NiAwMmIxIDM2OEMxQzg2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsNFwpCi0gMTY3IDAyYjUgMzY4QzFDODcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCw0XCkKLSAxNjggMDJiOSAzNjhDMUM4OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDRcKQotIDE2OSAwMmJkIDM2OEMxQzg5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsNFwpCi0gMTcwIDAyYzEgMzY4QzFDOEEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCw0XCkKLSAxNzEgMDJjNSAzNjhDMUM4QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDRcKQotIDE3MiAwMmM5IDhDMUM4QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsNFwpCi0gMTczIDAyY2MgMzY4QzFDOEQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDRcKQotIDE3NCAwMmQ0IDM2OEMxQzhFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsNFwpCi0gMTc1IDAyZDggMzY4QzFDOEYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCw0XCkKLSAxNzYgMDJkYyAzNjhDMUM5MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDRcKQotIDE3NyAwMmUwIDM2OEMxQzkxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsNFwpCi0gMTc4IDAyZTQgMzY4QzFDOTIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCw0XCkKLSAxNzkgMDJlOCAzNjhDMUM5MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDRcKQotIDE4MCAwMmVjIDhDMUM5NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsNFwpCi0gMTgxIDAyZWYgMzY4QzFDOTUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDRcKQotIDE4MiAwMmY3IDM2OEMxQzk2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsNFwpCi0gMTgzIDAyZmIgMzY4QzFDOTcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCw0XCkKLSAxODQgMDJmZiAzNjhDMUM5OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDRcKQotIDE4NSAwMzAzIDM2OEMxQzk5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsNFwpCi0gMTg2IDAzMDcgMzY4QzFDOUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCw0XCkKLSAxODcgMDMwYiAzNjhDMUM5QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDRcKQotIDE4OCAwMzBmIDhDMUM5QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsNFwpCi0gMTg5IDAzMTIgMzY4QzFDOUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDRcKQotIDE5MCAwMzFhIDM2OEMxQzlFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsNFwpCi0gMTkxIDAzMWUgMzY4QzFDOUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCw0XCkKLSAxOTIgMDMyMiAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDE5MyAwMzI1IDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTk0IDAzMjggMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSAxOTUgMDMyYiAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDE5NiAwMzJlIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTk3IDAzMzEgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCw0XCkKLS4qV2FybmluZzouKgotIDE5OCAwMzM4IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTk5IDAzM2IgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksNFwpCi0uKldhcm5pbmc6LioKLSAyMDAgMDMzZSAzNjhDMUNBOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDRcKQotIDIwMSAwMzQyIDM2OEMxQ0E5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsNFwpCi0gMjAyIDAzNDYgMzY4QzFDQUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCw0XCkKLSAyMDMgMDM0YSAzNjhDMUNBQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDRcKQotIDIwNCAwMzRlIDhDMUNBQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsNFwpCi0gMjA1IDAzNTEgMzY4QzFDQUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDRcKQotIDIwNiAwMzU5IDM2OEMxQ0FFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsNFwpCi0gMjA3IDAzNWQgMzY4QzFDQUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCw0XCkKLSAyMDggMDM2MSAzNjhDMUNCMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDRcKQotIDIwOSAwMzY1IDM2OEMxQ0IxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksNFwpCi0gMjEwIDAzNjkgMzY4QzFDQjIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSw0XCkKLSAyMTEgMDM2ZCAzNjhDMUNCMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDRcKQotIDIxMiAwMzcxIDhDMUNCNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksNFwpCi0gMjEzIDAzNzQgMzY4QzFDQjUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDRcKQotIDIxNCAwMzdjIDM2OEMxQ0I2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksNFwpCi0gMjE1IDAzODAgMzY4QzFDQjcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSw0XCkKLSAyMTYgMDM4NCAzNjhDMUNCOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDRcKQotIDIxNyAwMzg4IDM2OEMxQ0I5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksNFwpCi0gMjE4IDAzOGMgMzY4QzFDQkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSw0XCkKLSAyMTkgMDM5MCAzNjhDMUNCQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDRcKQotIDIyMCAwMzk0IDhDMUNCQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksNFwpCi0gMjIxIDAzOTcgMzY4QzFDQkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDRcKQotIDIyMiAwMzlmIDM2OEMxQ0JFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksNFwpCi0gMjIzIDAzYTMgMzY4QzFDQkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSw0XCkKLSAyMjQgMDNhNyAzNjhDMUNDMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDhcKQotIDIyNSAwM2FiIDM2OEMxQ0MxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsOFwpCi0gMjI2IDAzYWYgMzY4QzFDQzIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCw4XCkKLSAyMjcgMDNiMyAzNjhDMUNDMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDhcKQotIDIyOCAwM2I3IDhDMUNDNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsOFwpCi0gMjI5IDAzYmEgMzY4QzFDQzUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDhcKQotIDIzMCAwM2MyIDM2OEMxQ0M2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsOFwpCi0gMjMxIDAzYzYgMzY4QzFDQzcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCw4XCkKLSAyMzIgMDNjYSAzNjhDMUNDOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDhcKQotIDIzMyAwM2NlIDM2OEMxQ0M5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsOFwpCi0gMjM0IDAzZDIgMzY4QzFDQ0EgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCw4XCkKLSAyMzUgMDNkNiAzNjhDMUNDQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDhcKQotIDIzNiAwM2RhIDhDMUNDQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsOFwpCi0gMjM3IDAzZGQgMzY4QzFDQ0QgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDhcKQotIDIzOCAwM2U1IDM2OEMxQ0NFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsOFwpCi0gMjM5IDAzZTkgMzY4QzFDQ0YgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCw4XCkKLSAyNDAgMDNlZCAzNjhDMUNEMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDhcKQotIDI0MSAwM2YxIDM2OEMxQ0QxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsOFwpCi0gMjQyIDAzZjUgMzY4QzFDRDIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCw4XCkKLSAyNDMgMDNmOSAzNjhDMUNEMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDhcKQotIDI0NCAwM2ZkIDhDMUNENCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsOFwpCi0gMjQ1IDA0MDAgMzY4QzFDRDUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDhcKQotIDI0NiAwNDA4IDM2OEMxQ0Q2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsOFwpCi0gMjQ3IDA0MGMgMzY4QzFDRDcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCw4XCkKLSAyNDggMDQxMCAzNjhDMUNEOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDhcKQotIDI0OSAwNDE0IDM2OEMxQ0Q5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsOFwpCi0gMjUwIDA0MTggMzY4QzFDREEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCw4XCkKLSAyNTEgMDQxYyAzNjhDMUNEQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDhcKQotIDI1MiAwNDIwIDhDMUNEQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsOFwpCi0gMjUzIDA0MjMgMzY4QzFDREQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDhcKQotIDI1NCAwNDJiIDM2OEMxQ0RFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsOFwpCi0gMjU1IDA0MmYgMzY4QzFDREYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCw4XCkKLSAyNTYgMDQzMyAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDI1NyAwNDM2IDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gMjU4IDA0MzkgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAyNTkgMDQzYyAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDI2MCAwNDNmIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gMjYxIDA0NDIgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCw4XCkKLS4qV2FybmluZzouKgotIDI2MiAwNDQ5IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMjYzIDA0NGMgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSAyNjQgMDQ0ZiAzNjhDMUNFOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDhcKQotIDI2NSAwNDUzIDM2OEMxQ0U5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsOFwpCi0gMjY2IDA0NTcgMzY4QzFDRUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCw4XCkKLSAyNjcgMDQ1YiAzNjhDMUNFQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDhcKQotIDI2OCAwNDVmIDhDMUNFQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsOFwpCi0gMjY5IDA0NjIgMzY4QzFDRUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDhcKQotIDI3MCAwNDZhIDM2OEMxQ0VFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsOFwpCi0gMjcxIDA0NmUgMzY4QzFDRUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCw4XCkKLSAyNzIgMDQ3MiAzNjhDMUNGMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDhcKQotIDI3MyAwNDc2IDM2OEMxQ0YxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksOFwpCi0gMjc0IDA0N2EgMzY4QzFDRjIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSw4XCkKLSAyNzUgMDQ3ZSAzNjhDMUNGMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDhcKQotIDI3NiAwNDgyIDhDMUNGNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksOFwpCi0gMjc3IDA0ODUgMzY4QzFDRjUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDhcKQotIDI3OCAwNDhkIDM2OEMxQ0Y2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksOFwpCi0gMjc5IDA0OTEgMzY4QzFDRjcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSw4XCkKLSAyODAgMDQ5NSAzNjhDMUNGOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDhcKQotIDI4MSAwNDk5IDM2OEMxQ0ZBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksOFwpCi0gMjgyIDA0OWQgMzY4QzFDRjkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkaSw4XCkKLSAyODMgMDRhMSAzNjhDMUNGQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDhcKQotIDI4NCAwNGE1IDhDMUNGQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksOFwpCi0gMjg1IDA0YTggMzY4QzFDRkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDhcKQotIDI4NiAwNGIwIDM2OEMxQ0ZFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksOFwpCi0gMjg3IDA0YjQgMzY4QzFDRkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSw4XCkKLSAyODggMDRiOCAzNjhDNUMwMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCwxXCkKLSAyODkgMDRiZCAzNjhDNUMwMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCwxXCkKLSAyOTAgMDRjMiAzNjhDNUMwMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCwxXCkKLSAyOTEgMDRjNyAzNjhDNUMwMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCwxXCkKLSAyOTIgMDRjYyA4QzVDMDQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCwxXCkKLSAyOTMgMDRkMCA4QzVDMDUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCwxXCkKLSAyOTQgMDRkNCAzNjhDNUMwNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCwxXCkKLSAyOTUgMDRkOSAzNjhDNUMwNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCwxXCkKLSAyOTYgMDRkZSAzNjhDNUMwOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCwxXCkKLSAyOTcgMDRlMyAzNjhDNUMwOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCwxXCkKLSAyOTggMDRlOCAzNjhDNUMwQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCwxXCkKLSAyOTkgMDRlZCAzNjhDNUMwQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCwxXCkKLSAzMDAgMDRmMiA4QzVDMEMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCwxXCkKLSAzMDEgMDRmNiA4QzVDMEQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCwxXCkKLSAzMDIgMDRmYSAzNjhDNUMwRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCwxXCkKLSAzMDMgMDRmZiAzNjhDNUMwRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCwxXCkKLSAzMDQgMDUwNCAzNjhDNUMxMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCwxXCkKLSAzMDUgMDUwOSAzNjhDNUMxMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCwxXCkKLSAzMDYgMDUwZSAzNjhDNUMxMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCwxXCkKLSAzMDcgMDUxMyAzNjhDNUMxMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCwxXCkKLSAzMDggMDUxOCA4QzVDMTQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCwxXCkKLSAzMDkgMDUxYyA4QzVDMTUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCwxXCkKLSAzMTAgMDUyMCAzNjhDNUMxNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCwxXCkKLSAzMTEgMDUyNSAzNjhDNUMxNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCwxXCkKLSAzMTIgMDUyYSAzNjhDNUMxOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCwxXCkKLSAzMTMgMDUyZiAzNjhDNUMxOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCwxXCkKLSAzMTQgMDUzNCAzNjhDNUMxQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCwxXCkKLSAzMTUgMDUzOSAzNjhDNUMxQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCwxXCkKLSAzMTYgMDUzZSA4QzVDMUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCwxXCkKLSAzMTcgMDU0MiA4QzVDMUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCwxXCkKLSAzMTggMDU0NiAzNjhDNUMxRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCwxXCkKLSAzMTkgMDU0YiAzNjhDNUMxRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCwxXCkKLSAzMjAgMDU1MCAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsMVwpCi0gMzIxIDA1NTQgMzY4QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LDFcKQotIDMyMiAwNTU4IDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwxXCkKLSAzMjMgMDU1YyAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsMVwpCi0gMzI0IDA1NjAgOEM1QzI0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLDFcKQotIDMyNSAwNTY0IDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwxXCkKLSAzMjYgMDU2NyAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksMVwpCi0gMzI3IDA1NmIgMzY4QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLDFcKQotIDMyOCAwNTZmIDM2OEM1QzI4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDFcKQotIDMyOSAwNTc0IDM2OEM1QzI5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDFcKQotIDMzMCAwNTc5IDM2OEM1QzJBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDFcKQotIDMzMSAwNTdlIDM2OEM1QzJCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDFcKQotIDMzMiAwNTgzIDhDNUMyQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDFcKQotIDMzMyAwNTg3IDhDNUMyRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDFcKQotIDMzNCAwNThiIDM2OEM1QzJFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDFcKQotIDMzNSAwNTkwIDM2OEM1QzJGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDFcKQotIDMzNiAwNTk1IDM2OEM1QzMwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDFcKQotIDMzNyAwNTlhIDM2OEM1QzMxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDFcKQotIDMzOCAwNTlmIDM2OEM1QzMyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDFcKQotIDMzOSAwNWE0IDM2OEM1QzMzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDFcKQotIDM0MCAwNWE5IDhDNUMzNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDFcKQotIDM0MSAwNWFkIDhDNUMzNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDFcKQotIDM0MiAwNWIxIDM2OEM1QzM2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDFcKQotIDM0MyAwNWI2IDM2OEM1QzM3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDFcKQotIDM0NCAwNWJiIDM2OEM1QzM4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDFcKQotIDM0NSAwNWMwIDM2OEM1QzM5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDFcKQotIDM0NiAwNWM1IDM2OEM1QzNBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDFcKQotIDM0NyAwNWNhIDM2OEM1QzNCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDFcKQotIDM0OCAwNWNmIDhDNUMzQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDFcKQotIDM0OSAwNWQzIDhDNUMzRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDFcKQotIDM1MCAwNWQ3IDM2OEM1QzNFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDFcKQotIDM1MSAwNWRjIDM2OEM1QzNGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDFcKQotIDM1MiAwNWUxIDM2OEM1QzQwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDJcKQotIDM1MyAwNWU2IDM2OEM1QzQxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDJcKQotIDM1NCAwNWViIDM2OEM1QzQyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDJcKQotIDM1NSAwNWYwIDM2OEM1QzQzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDJcKQotIDM1NiAwNWY1IDhDNUM0NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDJcKQotIDM1NyAwNWY5IDhDNUM0NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDJcKQotIDM1OCAwNWZkIDM2OEM1QzQ2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDJcKQotIDM1OSAwNjAyIDM2OEM1QzQ3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDJcKQotIDM2MCAwNjA3IDM2OEM1QzQ4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDJcKQotIDM2MSAwNjBjIDM2OEM1QzQ5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDJcKQotIDM2MiAwNjExIDM2OEM1QzRBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDJcKQotIDM2MyAwNjE2IDM2OEM1QzRCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDJcKQotIDM2NCAwNjFiIDhDNUM0QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDJcKQotIDM2NSAwNjFmIDhDNUM0RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDJcKQotIDM2NiAwNjIzIDM2OEM1QzRFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDJcKQotIDM2NyAwNjI4IDM2OEM1QzRGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDJcKQotIDM2OCAwNjJkIDM2OEM1QzUwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDJcKQotIDM2OSAwNjMyIDM2OEM1QzUxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDJcKQotIDM3MCAwNjM3IDM2OEM1QzUyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDJcKQotIDM3MSAwNjNjIDM2OEM1QzUzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDJcKQotIDM3MiAwNjQxIDhDNUM1NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDJcKQotIDM3MyAwNjQ1IDhDNUM1NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDJcKQotIDM3NCAwNjQ5IDM2OEM1QzU2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDJcKQotIDM3NSAwNjRlIDM2OEM1QzU3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDJcKQotIDM3NiAwNjUzIDM2OEM1QzU4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDJcKQotIDM3NyAwNjU4IDM2OEM1QzU5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDJcKQotIDM3OCAwNjVkIDM2OEM1QzVBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDJcKQotIDM3OSAwNjYyIDM2OEM1QzVCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDJcKQotIDM4MCAwNjY3IDhDNUM1QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDJcKQotIDM4MSAwNjZiIDhDNUM1RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDJcKQotIDM4MiAwNjZmIDM2OEM1QzVFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDJcKQotIDM4MyAwNjc0IDM2OEM1QzVGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDJcKQotIDM4NCAwNjc5IDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDM4NSAwNjdkIDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDM4NiAwNjgxIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDM4NyAwNjg1IDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDM4OCAwNjg5IDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDM4OSAwNjhkIDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDM5MCAwNjkwIDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDM5MSAwNjk0IDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDM5MiAwNjk4IDM2OEM1QzY4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDJcKQotIDM5MyAwNjlkIDM2OEM1QzY5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDJcKQotIDM5NCAwNmEyIDM2OEM1QzZBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDJcKQotIDM5NSAwNmE3IDM2OEM1QzZCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDJcKQotIDM5NiAwNmFjIDhDNUM2QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDJcKQotIDM5NyAwNmIwIDhDNUM2RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDJcKQotIDM5OCAwNmI0IDM2OEM1QzZFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDJcKQotIDM5OSAwNmI5IDM2OEM1QzZGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDJcKQotIDQwMCAwNmJlIDM2OEM1QzcwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDJcKQotIDQwMSAwNmMzIDM2OEM1QzcxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDJcKQotIDQwMiAwNmM4IDM2OEM1QzcyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDJcKQotIDQwMyAwNmNkIDM2OEM1QzczIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDJcKQotIDQwNCAwNmQyIDhDNUM3NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDJcKQotIDQwNSAwNmQ2IDhDNUM3NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDJcKQotIDQwNiAwNmRhIDM2OEM1Qzc2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDJcKQotIDQwNyAwNmRmIDM2OEM1Qzc3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDJcKQotIDQwOCAwNmU0IDM2OEM1Qzc4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDJcKQotIDQwOSAwNmU5IDM2OEM1Qzc5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDJcKQotIDQxMCAwNmVlIDM2OEM1QzdBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDJcKQotIDQxMSAwNmYzIDM2OEM1QzdCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDJcKQotIDQxMiAwNmY4IDhDNUM3QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDJcKQotIDQxMyAwNmZjIDhDNUM3RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDJcKQotIDQxNCAwNzAwIDM2OEM1QzdFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDJcKQotIDQxNSAwNzA1IDM2OEM1QzdGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDJcKQotIDQxNiAwNzBhIDM2OEM1QzgwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDRcKQotIDQxNyAwNzBmIDM2OEM1QzgxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDRcKQotIDQxOCAwNzE0IDM2OEM1QzgyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDRcKQotIDQxOSAwNzE5IDM2OEM1QzgzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDRcKQotIDQyMCAwNzFlIDhDNUM4NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDRcKQotIDQyMSAwNzIyIDhDNUM4NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDRcKQotIDQyMiAwNzI2IDM2OEM1Qzg2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDRcKQotIDQyMyAwNzJiIDM2OEM1Qzg3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDRcKQotIDQyNCAwNzMwIDM2OEM1Qzg4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDRcKQotIDQyNSAwNzM1IDM2OEM1Qzg5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDRcKQotIDQyNiAwNzNhIDM2OEM1QzhBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDRcKQotIDQyNyAwNzNmIDM2OEM1QzhCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDRcKQotIDQyOCAwNzQ0IDhDNUM4QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDRcKQotIDQyOSAwNzQ4IDhDNUM4RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDRcKQotIDQzMCAwNzRjIDM2OEM1QzhFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDRcKQotIDQzMSAwNzUxIDM2OEM1QzhGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDRcKQotIDQzMiAwNzU2IDM2OEM1QzkwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDRcKQotIDQzMyAwNzViIDM2OEM1QzkxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDRcKQotIDQzNCAwNzYwIDM2OEM1QzkyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDRcKQotIDQzNSAwNzY1IDM2OEM1QzkzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDRcKQotIDQzNiAwNzZhIDhDNUM5NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDRcKQotIDQzNyAwNzZlIDhDNUM5NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDRcKQotIDQzOCAwNzcyIDM2OEM1Qzk2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDRcKQotIDQzOSAwNzc3IDM2OEM1Qzk3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDRcKQotIDQ0MCAwNzdjIDM2OEM1Qzk4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDRcKQotIDQ0MSAwNzgxIDM2OEM1Qzk5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDRcKQotIDQ0MiAwNzg2IDM2OEM1QzlBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDRcKQotIDQ0MyAwNzhiIDM2OEM1QzlCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDRcKQotIDQ0NCAwNzkwIDhDNUM5QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDRcKQotIDQ0NSAwNzk0IDhDNUM5RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDRcKQotIDQ0NiAwNzk4IDM2OEM1QzlFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDRcKQotIDQ0NyAwNzlkIDM2OEM1QzlGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDRcKQotIDQ0OCAwN2EyIDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDQ0OSAwN2E2IDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDQ1MCAwN2FhIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDQ1MSAwN2FlIDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDQ1MiAwN2IyIDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDQ1MyAwN2I2IDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDQ1NCAwN2I5IDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDQ1NSAwN2JkIDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDQ1NiAwN2MxIDM2OEM1Q0E4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDRcKQotIDQ1NyAwN2M2IDM2OEM1Q0E5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDRcKQotIDQ1OCAwN2NiIDM2OEM1Q0FBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDRcKQotIDQ1OSAwN2QwIDM2OEM1Q0FCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDRcKQotIDQ2MCAwN2Q1IDhDNUNBQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDRcKQotIDQ2MSAwN2Q5IDhDNUNBRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDRcKQotIDQ2MiAwN2RkIDM2OEM1Q0FFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDRcKQotIDQ2MyAwN2UyIDM2OEM1Q0FGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDRcKQotIDQ2NCAwN2U3IDM2OEM1Q0IwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDRcKQotIDQ2NSAwN2VjIDM2OEM1Q0IxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDRcKQotIDQ2NiAwN2YxIDM2OEM1Q0IyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDRcKQotIDQ2NyAwN2Y2IDM2OEM1Q0IzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDRcKQotIDQ2OCAwN2ZiIDhDNUNCNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDRcKQotIDQ2OSAwN2ZmIDhDNUNCNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDRcKQotIDQ3MCAwODAzIDM2OEM1Q0I2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDRcKQotIDQ3MSAwODA4IDM2OEM1Q0I3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDRcKQotIDQ3MiAwODBkIDM2OEM1Q0I4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDRcKQotIDQ3MyAwODEyIDM2OEM1Q0I5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDRcKQotIDQ3NCAwODE3IDM2OEM1Q0JBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDRcKQotIDQ3NSAwODFjIDM2OEM1Q0JCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDRcKQotIDQ3NiAwODIxIDhDNUNCQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDRcKQotIDQ3NyAwODI1IDhDNUNCRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDRcKQotIDQ3OCAwODI5IDM2OEM1Q0JFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDRcKQotIDQ3OSAwODJlIDM2OEM1Q0JGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDRcKQotIDQ4MCAwODMzIDM2OEM1Q0MwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDhcKQotIDQ4MSAwODM4IDM2OEM1Q0MxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDhcKQotIDQ4MiAwODNkIDM2OEM1Q0MyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDhcKQotIDQ4MyAwODQyIDM2OEM1Q0MzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDhcKQotIDQ4NCAwODQ3IDhDNUNDNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDhcKQotIDQ4NSAwODRiIDhDNUNDNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDhcKQotIDQ4NiAwODRmIDM2OEM1Q0M2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDhcKQotIDQ4NyAwODU0IDM2OEM1Q0M3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDhcKQotIDQ4OCAwODU5IDM2OEM1Q0M4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDhcKQotIDQ4OSAwODVlIDM2OEM1Q0M5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDhcKQotIDQ5MCAwODYzIDM2OEM1Q0NBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDhcKQotIDQ5MSAwODY4IDM2OEM1Q0NCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDhcKQotIDQ5MiAwODZkIDhDNUNDQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDhcKQotIDQ5MyAwODcxIDhDNUNDRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDhcKQotIDQ5NCAwODc1IDM2OEM1Q0NFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDhcKQotIDQ5NSAwODdhIDM2OEM1Q0NGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDhcKQotIDQ5NiAwODdmIDM2OEM1Q0QwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDhcKQotIDQ5NyAwODg0IDM2OEM1Q0QxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDhcKQotIDQ5OCAwODg5IDM2OEM1Q0QyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDhcKQotIDQ5OSAwODhlIDM2OEM1Q0QzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDhcKQotIDUwMCAwODkzIDhDNUNENDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDhcKQotIDUwMSAwODk3IDhDNUNENTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDhcKQotIDUwMiAwODliIDM2OEM1Q0Q2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDhcKQotIDUwMyAwOGEwIDM2OEM1Q0Q3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDhcKQotIDUwNCAwOGE1IDM2OEM1Q0Q4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDhcKQotIDUwNSAwOGFhIDM2OEM1Q0Q5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDhcKQotIDUwNiAwOGFmIDM2OEM1Q0RBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDhcKQotIDUwNyAwOGI0IDM2OEM1Q0RCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDhcKQotIDUwOCAwOGI5IDhDNUNEQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDhcKQotIDUwOSAwOGJkIDhDNUNERDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDhcKQotIDUxMCAwOGMxIDM2OEM1Q0RFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDhcKQotIDUxMSAwOGM2IDM2OEM1Q0RGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDhcKQotIDUxMiAwOGNiIDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDUxMyAwOGNmIDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDUxNCAwOGQzIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCw4XCkKLS4qV2FybmluZzouKgotIDUxNSAwOGQ3IDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDUxNiAwOGRiIDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDUxNyAwOGRmIDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCw4XCkKLS4qV2FybmluZzouKgotIDUxOCAwOGUyIDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDUxOSAwOGU2IDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDUyMCAwOGVhIDM2OEM1Q0U4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDhcKQotIDUyMSAwOGVmIDM2OEM1Q0U5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDhcKQotIDUyMiAwOGY0IDM2OEM1Q0VBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDhcKQotIDUyMyAwOGY5IDM2OEM1Q0VCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDhcKQotIDUyNCAwOGZlIDhDNUNFQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDhcKQotIDUyNSAwOTAyIDhDNUNFRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDhcKQotIDUyNiAwOTA2IDM2OEM1Q0VFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDhcKQotIDUyNyAwOTBiIDM2OEM1Q0VGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDhcKQotIDUyOCAwOTEwIDM2OEM1Q0YwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDhcKQotIDUyOSAwOTE1IDM2OEM1Q0YxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDhcKQotIDUzMCAwOTFhIDM2OEM1Q0YyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDhcKQotIDUzMSAwOTFmIDM2OEM1Q0YzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDhcKQotIDUzMiAwOTI0IDhDNUNGNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDhcKQotIDUzMyAwOTI4IDhDNUNGNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDhcKQotIDUzNCAwOTJjIDM2OEM1Q0Y2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDhcKQotIDUzNSAwOTMxIDM2OEM1Q0Y3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDhcKQotIDUzNiAwOTM2IDM2OEM1Q0Y4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDhcKQotIDUzNyAwOTNiIDM2OEM1Q0ZBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDhcKQotIDUzOCAwOTQwIDM2OEM1Q0Y5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDhcKQotIDUzOSAwOTQ1IDM2OEM1Q0ZCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDhcKQotIDU0MCAwOTRhIDhDNUNGQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDhcKQotIDU0MSAwOTRlIDhDNUNGRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDhcKQotIDU0MiAwOTUyIDM2OEM1Q0ZFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDhcKQotIDU0MyAwOTU3IDM2OEM1Q0ZGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDhcKQotIDU0NCAwOTVjIDM2OEM5QzAwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDFcKQotIDU0NSAwOTY0IDM2OEM5QzAxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDFcKQotIDU0NiAwOTZjIDM2OEM5QzAyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDFcKQotIDU0NyAwOTc0IDM2OEM5QzAzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDFcKQotIDU0OCAwOTdjIDhDOUMwNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDFcKQotIDU0OSAwOTgzIDhDOUMwNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDFcKQotIDU1MCAwOThhIDM2OEM5QzA2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDFcKQotIDU1MSAwOTkyIDM2OEM5QzA3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDFcKQotIDU1MiAwOTlhIDM2OEM5QzA4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDFcKQotIDU1MyAwOWEyIDM2OEM5QzA5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDFcKQotIDU1NCAwOWFhIDM2OEM5QzBBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDFcKQotIDU1NSAwOWIyIDM2OEM5QzBCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDFcKQotIDU1NiAwOWJhIDhDOUMwQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDFcKQotIDU1NyAwOWMxIDhDOUMwRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDFcKQotIDU1OCAwOWM4IDM2OEM5QzBFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDFcKQotIDU1OSAwOWQwIDM2OEM5QzBGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDFcKQotIDU2MCAwOWQ4IDM2OEM5QzEwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDFcKQotIDU2MSAwOWUwIDM2OEM5QzExIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDFcKQotIDU2MiAwOWU4IDM2OEM5QzEyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDFcKQotIDU2MyAwOWYwIDM2OEM5QzEzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDFcKQotIDU2NCAwOWY4IDhDOUMxNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDFcKQotIDU2NSAwOWZmIDhDOUMxNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDFcKQotIDU2NiAwYTA2IDM2OEM5QzE2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDFcKQotIDU2NyAwYTBlIDM2OEM5QzE3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDFcKQotIDU2OCAwYTE2IDM2OEM5QzE4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDFcKQotIDU2OSAwYTFlIDM2OEM5QzE5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDFcKQotIDU3MCAwYTI2IDM2OEM5QzFBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDFcKQotIDU3MSAwYTJlIDM2OEM5QzFCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDFcKQotIDU3MiAwYTM2IDhDOUMxQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDFcKQotIDU3MyAwYTNkIDhDOUMxRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDFcKQotIDU3NCAwYTQ0IDM2OEM5QzFFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDFcKQotIDU3NSAwYTRjIDM2OEM5QzFGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDFcKQotIDU3NiAwYTU0IDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwxXCkKLSA1NzcgMGE1YiAzNjhDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsMVwpCi0gNTc4IDBhNjIgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDFcKQotIDU3OSAwYTY5IDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwxXCkKLSA1ODAgMGE3MCA4QzlDMjQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsMVwpCi0gNTgxIDBhNzcgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDFcKQotIDU4MiAwYTdkIDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwxXCkKLSA1ODMgMGE4NCAzNjhDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksMVwpCi0gNTg0IDBhOGIgMzY4QzlDMjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMVwpCi0gNTg1IDBhOTMgMzY4QzlDMjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMVwpCi0gNTg2IDBhOWIgMzY4QzlDMkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMVwpCi0gNTg3IDBhYTMgMzY4QzlDMkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMVwpCi0gNTg4IDBhYWIgOEM5QzJDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMVwpCi0gNTg5IDBhYjIgOEM5QzJENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMVwpCi0gNTkwIDBhYjkgMzY4QzlDMkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMVwpCi0gNTkxIDBhYzEgMzY4QzlDMkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMVwpCi0gNTkyIDBhYzkgMzY4QzlDMzAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMVwpCi0gNTkzIDBhZDEgMzY4QzlDMzEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMVwpCi0gNTk0IDBhZDkgMzY4QzlDMzIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMVwpCi0gNTk1IDBhZTEgMzY4QzlDMzMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMVwpCi0gNTk2IDBhZTkgOEM5QzM0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMVwpCi0gNTk3IDBhZjAgOEM5QzM1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMVwpCi0gNTk4IDBhZjcgMzY4QzlDMzYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMVwpCi0gNTk5IDBhZmYgMzY4QzlDMzcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMVwpCi0gNjAwIDBiMDcgMzY4QzlDMzggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMVwpCi0gNjAxIDBiMGYgMzY4QzlDMzkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMVwpCi0gNjAyIDBiMTcgMzY4QzlDM0EgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMVwpCi0gNjAzIDBiMWYgMzY4QzlDM0IgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMVwpCi0gNjA0IDBiMjcgOEM5QzNDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMVwpCi0gNjA1IDBiMmUgOEM5QzNENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMVwpCi0gNjA2IDBiMzUgMzY4QzlDM0UgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMVwpCi0gNjA3IDBiM2QgMzY4QzlDM0YgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMVwpCi0gNjA4IDBiNDUgMzY4QzlDNDAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMlwpCi0gNjA5IDBiNGQgMzY4QzlDNDEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMlwpCi0gNjEwIDBiNTUgMzY4QzlDNDIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsMlwpCi0gNjExIDBiNWQgMzY4QzlDNDMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMlwpCi0gNjEyIDBiNjUgOEM5QzQ0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMlwpCi0gNjEzIDBiNmMgOEM5QzQ1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsMlwpCi0gNjE0IDBiNzMgMzY4QzlDNDYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMlwpCi0gNjE1IDBiN2IgMzY4QzlDNDcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMlwpCi0gNjE2IDBiODMgMzY4QzlDNDggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsMlwpCi0gNjE3IDBiOGIgMzY4QzlDNDkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMlwpCi0gNjE4IDBiOTMgMzY4QzlDNEEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMlwpCi0gNjE5IDBiOWIgMzY4QzlDNEIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsMlwpCi0gNjIwIDBiYTMgOEM5QzRDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMlwpCi0gNjIxIDBiYWEgOEM5QzRENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMlwpCi0gNjIyIDBiYjEgMzY4QzlDNEUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsMlwpCi0gNjIzIDBiYjkgMzY4QzlDNEYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMlwpCi0gNjI0IDBiYzEgMzY4QzlDNTAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMlwpCi0gNjI1IDBiYzkgMzY4QzlDNTEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsMlwpCi0gNjI2IDBiZDEgMzY4QzlDNTIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMlwpCi0gNjI3IDBiZDkgMzY4QzlDNTMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMlwpCi0gNjI4IDBiZTEgOEM5QzU0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsMlwpCi0gNjI5IDBiZTggOEM5QzU1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMlwpCi0gNjMwIDBiZWYgMzY4QzlDNTYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMlwpCi0gNjMxIDBiZjcgMzY4QzlDNTcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsMlwpCi0gNjMyIDBiZmYgMzY4QzlDNTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMlwpCi0gNjMzIDBjMDcgMzY4QzlDNTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMlwpCi0gNjM0IDBjMGYgMzY4QzlDNUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsMlwpCi0gNjM1IDBjMTcgMzY4QzlDNUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMlwpCi0gNjM2IDBjMWYgOEM5QzVDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMlwpCi0gNjM3IDBjMjYgOEM5QzVENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsMlwpCi0gNjM4IDBjMmQgMzY4QzlDNUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMlwpCi0gNjM5IDBjMzUgMzY4QzlDNUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMlwpCi0gNjQwIDBjM2QgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQxIDBjNDQgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQyIDBjNGIgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQzIDBjNTIgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQ0IDBjNTkgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ1IDBjNjAgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ2IDBjNjYgMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ3IDBjNmQgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ4IDBjNzQgMzY4QzlDNjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMlwpCi0gNjQ5IDBjN2MgMzY4QzlDNjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMlwpCi0gNjUwIDBjODQgMzY4QzlDNkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMlwpCi0gNjUxIDBjOGMgMzY4QzlDNkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMlwpCi0gNjUyIDBjOTQgOEM5QzZDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMlwpCi0gNjUzIDBjOWIgOEM5QzZENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMlwpCi0gNjU0IDBjYTIgMzY4QzlDNkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMlwpCi0gNjU1IDBjYWEgMzY4QzlDNkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMlwpCi0gNjU2IDBjYjIgMzY4QzlDNzAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMlwpCi0gNjU3IDBjYmEgMzY4QzlDNzEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMlwpCi0gNjU4IDBjYzIgMzY4QzlDNzIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMlwpCi0gNjU5IDBjY2EgMzY4QzlDNzMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMlwpCi0gNjYwIDBjZDIgOEM5Qzc0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMlwpCi0gNjYxIDBjZDkgOEM5Qzc1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMlwpCi0gNjYyIDBjZTAgMzY4QzlDNzYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMlwpCi0gNjYzIDBjZTggMzY4QzlDNzcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMlwpCi0gNjY0IDBjZjAgMzY4QzlDNzggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMlwpCi0gNjY1IDBjZjggMzY4QzlDNzkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMlwpCi0gNjY2IDBkMDAgMzY4QzlDN0EgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMlwpCi0gNjY3IDBkMDggMzY4QzlDN0IgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMlwpCi0gNjY4IDBkMTAgOEM5QzdDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMlwpCi0gNjY5IDBkMTcgOEM5QzdENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMlwpCi0gNjcwIDBkMWUgMzY4QzlDN0UgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMlwpCi0gNjcxIDBkMjYgMzY4QzlDN0YgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMlwpCi0gNjcyIDBkMmUgMzY4QzlDODAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsNFwpCi0gNjczIDBkMzYgMzY4QzlDODEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsNFwpCi0gNjc0IDBkM2UgMzY4QzlDODIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsNFwpCi0gNjc1IDBkNDYgMzY4QzlDODMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsNFwpCi0gNjc2IDBkNGUgOEM5Qzg0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsNFwpCi0gNjc3IDBkNTUgOEM5Qzg1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsNFwpCi0gNjc4IDBkNWMgMzY4QzlDODYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsNFwpCi0gNjc5IDBkNjQgMzY4QzlDODcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsNFwpCi0gNjgwIDBkNmMgMzY4QzlDODggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsNFwpCi0gNjgxIDBkNzQgMzY4QzlDODkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsNFwpCi0gNjgyIDBkN2MgMzY4QzlDOEEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsNFwpCi0gNjgzIDBkODQgMzY4QzlDOEIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsNFwpCi0gNjg0IDBkOGMgOEM5QzhDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsNFwpCi0gNjg1IDBkOTMgOEM5QzhENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsNFwpCi0gNjg2IDBkOWEgMzY4QzlDOEUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsNFwpCi0gNjg3IDBkYTIgMzY4QzlDOEYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsNFwpCi0gNjg4IDBkYWEgMzY4QzlDOTAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsNFwpCi0gNjg5IDBkYjIgMzY4QzlDOTEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsNFwpCi0gNjkwIDBkYmEgMzY4QzlDOTIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsNFwpCi0gNjkxIDBkYzIgMzY4QzlDOTMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsNFwpCi0gNjkyIDBkY2EgOEM5Qzk0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsNFwpCi0gNjkzIDBkZDEgOEM5Qzk1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsNFwpCi0gNjk0IDBkZDggMzY4QzlDOTYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsNFwpCi0gNjk1IDBkZTAgMzY4QzlDOTcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsNFwpCi0gNjk2IDBkZTggMzY4QzlDOTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsNFwpCi0gNjk3IDBkZjAgMzY4QzlDOTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsNFwpCi0gNjk4IDBkZjggMzY4QzlDOUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsNFwpCi0gNjk5IDBlMDAgMzY4QzlDOUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsNFwpCi0gNzAwIDBlMDggOEM5QzlDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsNFwpCi0gNzAxIDBlMGYgOEM5QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsNFwpCi0gNzAyIDBlMTYgMzY4QzlDOUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsNFwpCi0gNzAzIDBlMWUgMzY4QzlDOUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsNFwpCi0gNzA0IDBlMjYgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA1IDBlMmQgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA2IDBlMzQgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA3IDBlM2IgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA4IDBlNDIgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gNzA5IDBlNDkgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDRcKQotLipXYXJuaW5nOi4qCi0gNzEwIDBlNGYgMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gNzExIDBlNTYgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gNzEyIDBlNWQgMzY4QzlDQTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsNFwpCi0gNzEzIDBlNjUgMzY4QzlDQTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsNFwpCi0gNzE0IDBlNmQgMzY4QzlDQUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsNFwpCi0gNzE1IDBlNzUgMzY4QzlDQUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsNFwpCi0gNzE2IDBlN2QgOEM5Q0FDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsNFwpCi0gNzE3IDBlODQgOEM5Q0FENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsNFwpCi0gNzE4IDBlOGIgMzY4QzlDQUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsNFwpCi0gNzE5IDBlOTMgMzY4QzlDQUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsNFwpCi0gNzIwIDBlOWIgMzY4QzlDQjAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksNFwpCi0gNzIxIDBlYTMgMzY4QzlDQjEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksNFwpCi0gNzIyIDBlYWIgMzY4QzlDQjIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksNFwpCi0gNzIzIDBlYjMgMzY4QzlDQjMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksNFwpCi0gNzI0IDBlYmIgOEM5Q0I0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksNFwpCi0gNzI1IDBlYzIgOEM5Q0I1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksNFwpCi0gNzI2IDBlYzkgMzY4QzlDQjYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksNFwpCi0gNzI3IDBlZDEgMzY4QzlDQjcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksNFwpCi0gNzI4IDBlZDkgMzY4QzlDQjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksNFwpCi0gNzI5IDBlZTEgMzY4QzlDQjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksNFwpCi0gNzMwIDBlZTkgMzY4QzlDQkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksNFwpCi0gNzMxIDBlZjEgMzY4QzlDQkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksNFwpCi0gNzMyIDBlZjkgOEM5Q0JDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksNFwpCi0gNzMzIDBmMDAgOEM5Q0JENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksNFwpCi0gNzM0IDBmMDcgMzY4QzlDQkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksNFwpCi0gNzM1IDBmMGYgMzY4QzlDQkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksNFwpCi0gNzM2IDBmMTcgMzY4QzlDQzAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsOFwpCi0gNzM3IDBmMWYgMzY4QzlDQzEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsOFwpCi0gNzM4IDBmMjcgMzY4QzlDQzIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsOFwpCi0gNzM5IDBmMmYgMzY4QzlDQzMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsOFwpCi0gNzQwIDBmMzcgOEM5Q0M0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsOFwpCi0gNzQxIDBmM2UgOEM5Q0M1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsOFwpCi0gNzQyIDBmNDUgMzY4QzlDQzYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsOFwpCi0gNzQzIDBmNGQgMzY4QzlDQzcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsOFwpCi0gNzQ0IDBmNTUgMzY4QzlDQzggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsOFwpCi0gNzQ1IDBmNWQgMzY4QzlDQzkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsOFwpCi0gNzQ2IDBmNjUgMzY4QzlDQ0EgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsOFwpCi0gNzQ3IDBmNmQgMzY4QzlDQ0IgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsOFwpCi0gNzQ4IDBmNzUgOEM5Q0NDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsOFwpCi0gNzQ5IDBmN2MgOEM5Q0NENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsOFwpCi0gNzUwIDBmODMgMzY4QzlDQ0UgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsOFwpCi0gNzUxIDBmOGIgMzY4QzlDQ0YgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsOFwpCi0gNzUyIDBmOTMgMzY4QzlDRDAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsOFwpCi0gNzUzIDBmOWIgMzY4QzlDRDEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsOFwpCi0gNzU0IDBmYTMgMzY4QzlDRDIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsOFwpCi0gNzU1IDBmYWIgMzY4QzlDRDMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsOFwpCi0gNzU2IDBmYjMgOEM5Q0Q0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsOFwpCi0gNzU3IDBmYmEgOEM5Q0Q1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsOFwpCi0gNzU4IDBmYzEgMzY4QzlDRDYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsOFwpCi0gNzU5IDBmYzkgMzY4QzlDRDcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsOFwpCi0gNzYwIDBmZDEgMzY4QzlDRDggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsOFwpCi0gNzYxIDBmZDkgMzY4QzlDRDkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsOFwpCi0gNzYyIDBmZTEgMzY4QzlDREEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsOFwpCi0gNzYzIDBmZTkgMzY4QzlDREIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsOFwpCi0gNzY0IDBmZjEgOEM5Q0RDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsOFwpCi0gNzY1IDBmZjggOEM5Q0RENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsOFwpCi0gNzY2IDBmZmYgMzY4QzlDREUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsOFwpCi0gNzY3IDEwMDcgMzY4QzlDREYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsOFwpCi0gNzY4IDEwMGYgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gNzY5IDEwMTYgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gNzcwIDEwMWQgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gNzcxIDEwMjQgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gNzcyIDEwMmIgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gNzczIDEwMzIgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gNzc0IDEwMzggMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gNzc1IDEwM2YgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDhcKQotLipXYXJuaW5nOi4qCi0gNzc2IDEwNDYgMzY4QzlDRTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsOFwpCi0gNzc3IDEwNGUgMzY4QzlDRTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsOFwpCi0gNzc4IDEwNTYgMzY4QzlDRUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsOFwpCi0gNzc5IDEwNWUgMzY4QzlDRUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsOFwpCi0gNzgwIDEwNjYgOEM5Q0VDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsOFwpCi0gNzgxIDEwNmQgOEM5Q0VENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsOFwpCi0gNzgyIDEwNzQgMzY4QzlDRUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsOFwpCi0gNzgzIDEwN2MgMzY4QzlDRUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsOFwpCi0gNzg0IDEwODQgMzY4QzlDRjAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksOFwpCi0gNzg1IDEwOGMgMzY4QzlDRjEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksOFwpCi0gNzg2IDEwOTQgMzY4QzlDRjIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksOFwpCi0gNzg3IDEwOWMgMzY4QzlDRjMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksOFwpCi0gNzg4IDEwYTQgOEM5Q0Y0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksOFwpCi0gNzg5IDEwYWIgOEM5Q0Y1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksOFwpCi0gNzkwIDEwYjIgMzY4QzlDRjYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksOFwpCi0gNzkxIDEwYmEgMzY4QzlDRjcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksOFwpCi0gNzkyIDEwYzIgMzY4QzlDRjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksOFwpCi0gNzkzIDEwY2EgMzY4QzlDRkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksOFwpCi0gNzk0IDEwZDIgMzY4QzlDRjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksOFwpCi0gNzk1IDEwZGEgMzY4QzlDRkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksOFwpCi0gNzk2IDEwZTIgOEM5Q0ZDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksOFwpCi0gNzk3IDEwZTkgOEM5Q0ZENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksOFwpCi0gNzk4IDEwZjAgMzY4QzlDRkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksOFwpCi0gNzk5IDEwZjggMzY4QzlDRkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksOFwpCi0gODAwIDExMDAgOEM1QzA1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCwxXCkKLSA4MDEgMTEwNCA4QzVDMEQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDFcKQotIDgwMiAxMTA4IDhDNUMxNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsMVwpCi0gODAzIDExMGMgOEM1QzFEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCwxXCkKLSA4MDQgMTExMCA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwxXCkKLSA4MDUgMTExMyA4QzVDMkQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDFcKQotIDgwNiAxMTE3IDhDNUMzNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksMVwpCi0gODA3IDExMWIgOEM1QzNEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSwxXCkKLSA4MDggMTExZiA4QzVDNDUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWF4LDJcKQotIDgwOSAxMTIzIDhDNUM0RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlY3gsMlwpCi0gODEwIDExMjcgOEM1QzU1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkeCwyXCkKLSA4MTEgMTEyYiA4QzVDNUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJ4LDJcKQotIDgxMiAxMTJmIDhDNUQwMCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gODEzIDExMzIgOEM1QzZEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCwyXCkKLSA4MTQgMTEzNiA4QzVDNzUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDJcKQotIDgxNSAxMTNhIDhDNUM3RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksMlwpCi0gODE2IDExM2UgOEM1Qzg1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCw0XCkKLSA4MTcgMTE0MiA4QzVDOEQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDRcKQotIDgxOCAxMTQ2IDhDNUM5NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsNFwpCi0gODE5IDExNGEgOEM1QzlEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCw0XCkKLSA4MjAgMTE0ZSA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDgyMSAxMTUxIDhDNUNBRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYnAsNFwpCi0gODIyIDExNTUgOEM1Q0I1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVzaSw0XCkKLSA4MjMgMTE1OSA4QzVDQkQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWRpLDRcKQotIDgyNCAxMTVkIDhDNUNDNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsOFwpCi0gODI1IDExNjEgOEM1Q0NEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCw4XCkKLSA4MjYgMTE2NSA4QzVDRDUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDhcKQotIDgyNyAxMTY5IDhDNUNERDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsOFwpCi0gODI4IDExNmQgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSA4MjkgMTE3MCA4QzVDRUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDhcKQotIDgzMCAxMTc0IDhDNUNGNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksOFwpCi0gODMxIDExNzggOEM1Q0ZEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSw4XCkKLSA4MzIgMTE3YyAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCwxXCkKLSA4MzMgMTE4MyAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCwyXCkKLS4qV2FybmluZzouKgotIDgzNCAxMThhIDM2OEMxRDEyIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6MHgxMlwoLDRcKQotLipXYXJuaW5nOi4qCi0gODM1IDExOTEgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsOFwpCi0uKldhcm5pbmc6LioKLSA4MzYgMTE5OCA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheFwpCi0gODM3IDExOWEgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3hcKQotIDgzOCAxMTljIDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4XCkKLSA4MzkgMTE5ZSA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieFwpCi0gODQwIDExYTAgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczowCi0gODQxIDExYTYgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2lcKQotIDg0MiAxMWE4IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpXCkKLSA4NDMgMTFhYSA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXhcKQotIDg0NCAxMWFkIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeFwpCi0gODQ1IDExYjAgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4XCkKLSA4NDYgMTFiMyA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnhcKQotIDg0NyAxMWI2IDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicFwpCi0gODQ4IDExYmEgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpXCkKLSA4NDkgMTFiZCA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGlcKQotIDg1MCAxMWMwIDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheFwpCi0gODUxIDExYzYgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4XCkKLSA4NTIgMTFjYyA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHhcKQotIDg1MyAxMWQyIDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieFwpCi0gODU0IDExZDggM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwXCkKLSA4NTUgMTFkZiA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2lcKQotIDg1NiAxMWU1IDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaVwpCi0gODU3IDExZWIgOENEOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYXgKLSA4NTggMTFlZCA4Q0Q5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVjeAotIDg1OSAxMWVmIDhDREEgICAgICAgICAgICAgIAkJbW92CSVkcywlZWR4Ci0gODYwIDExZjEgOENEQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYngKLSA4NjEgMTFmMyA4Q0RDICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzcAotIDg2MiAxMWY1IDhDREQgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJwCi0gODYzIDExZjcgOENERSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc2kKLSA4NjQgMTFmOSA4Q0RGICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkaQotIDg2NSAxMWZiIDhDMUMwMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsMVwpCi0gODY2IDExZmUgOEMxQzAxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCwxXCkKLSA4NjcgMTIwMSA4QzFDMDIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDFcKQotIDg2OCAxMjA0IDhDMUMwMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsMVwpCi0gODY5IDEyMDcgM0U4QzFDMDQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCwxXCkKLSA4NzAgMTIwYiA4QzFDMDUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsMVwpCi0gODcxIDEyMTIgOEMxQzA2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCwxXCkKLSA4NzIgMTIxNSA4QzFDMDcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDFcKQotIDg3MyAxMjE4IDhDMUMwOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsMVwpCi0gODc0IDEyMWIgOEMxQzA5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCwxXCkKLSA4NzUgMTIxZSA4QzFDMEEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDFcKQotIDg3NiAxMjIxIDhDMUMwQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsMVwpCi0gODc3IDEyMjQgM0U4QzFDMEMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCwxXCkKLSA4NzggMTIyOCA4QzFDMEQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsMVwpCi0gODc5IDEyMmYgOEMxQzBFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCwxXCkKLSA4ODAgMTIzMiA4QzFDMEYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDFcKQotIDg4MSAxMjM1IDhDMUMxMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsMVwpCi0gODgyIDEyMzggOEMxQzExICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCwxXCkKLSA4ODMgMTIzYiA4QzFDMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDFcKQotIDg4NCAxMjNlIDhDMUMxMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsMVwpCi0gODg1IDEyNDEgM0U4QzFDMTQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCwxXCkKLSA4ODYgMTI0NSA4QzFDMTUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsMVwpCi0gODg3IDEyNGMgOEMxQzE2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCwxXCkKLSA4ODggMTI0ZiA4QzFDMTcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDFcKQotIDg4OSAxMjUyIDhDMUMxOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsMVwpCi0gODkwIDEyNTUgOEMxQzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCwxXCkKLSA4OTEgMTI1OCA4QzFDMUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDFcKQotIDg5MiAxMjViIDhDMUMxQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsMVwpCi0gODkzIDEyNWUgM0U4QzFDMUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCwxXCkKLSA4OTQgMTI2MiA4QzFDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsMVwpCi0gODk1IDEyNjkgOEMxQzFFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCwxXCkKLSA4OTYgMTI2YyA4QzFDMUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDFcKQotIDg5NyAxMjZmIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDFcKQotIDg5OCAxMjcxIDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LDFcKQotIDg5OSAxMjczIDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDFcKQotIDkwMCAxMjc1IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDFcKQotIDkwMSAxMjc3IDNFOEMxQzI0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLDFcKQotIDkwMiAxMjdiIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsMVwpCi0gOTAzIDEyODEgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksMVwpCi0gOTA0IDEyODMgOEMxRiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksMVwpCi0gOTA1IDEyODUgOEMxQzI4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCwxXCkKLSA5MDYgMTI4OCA4QzFDMjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDFcKQotIDkwNyAxMjhiIDhDMUMyQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsMVwpCi0gOTA4IDEyOGUgOEMxQzJCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCwxXCkKLSA5MDkgMTI5MSAzRThDMUMyQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDFcKQotIDkxMCAxMjk1IDhDMUMyRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCwxXCkKLSA5MTEgMTI5YyA4QzFDMkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDFcKQotIDkxMiAxMjlmIDhDMUMyRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsMVwpCi0gOTEzIDEyYTIgOEMxQzMwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSwxXCkKLSA5MTQgMTJhNSA4QzFDMzEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDFcKQotIDkxNSAxMmE4IDhDMUMzMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksMVwpCi0gOTE2IDEyYWIgOEMxQzMzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSwxXCkKLSA5MTcgMTJhZSAzRThDMUMzNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDFcKQotIDkxOCAxMmIyIDhDMUMzNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSwxXCkKLSA5MTkgMTJiOSA4QzFDMzYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDFcKQotIDkyMCAxMmJjIDhDMUMzNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksMVwpCi0gOTIxIDEyYmYgOEMxQzM4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSwxXCkKLSA5MjIgMTJjMiA4QzFDMzkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDFcKQotIDkyMyAxMmM1IDhDMUMzQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksMVwpCi0gOTI0IDEyYzggOEMxQzNCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSwxXCkKLSA5MjUgMTJjYiAzRThDMUMzQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDFcKQotIDkyNiAxMmNmIDhDMUMzRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSwxXCkKLSA5MjcgMTJkNiA4QzFDM0UgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDFcKQotIDkyOCAxMmQ5IDhDMUMzRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksMVwpCi0gOTI5IDEyZGMgOEMxQzQwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVheCwyXCkKLSA5MzAgMTJkZiA4QzFDNDEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDJcKQotIDkzMSAxMmUyIDhDMUM0MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsMlwpCi0gOTMyIDEyZTUgOEMxQzQzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVheCwyXCkKLSA5MzMgMTJlOCAzRThDMUM0NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDJcKQotIDkzNCAxMmVjIDhDMUM0NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCwyXCkKLSA5MzUgMTJmMyA4QzFDNDYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWF4LDJcKQotIDkzNiAxMmY2IDhDMUM0NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYXgsMlwpCi0gOTM3IDEyZjkgOEMxQzQ4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCwyXCkKLSA5MzggMTJmYyA4QzFDNDkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWN4LDJcKQotIDkzOSAxMmZmIDhDMUM0QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlY3gsMlwpCi0gOTQwIDEzMDIgOEMxQzRCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCwyXCkKLSA5NDEgMTMwNSAzRThDMUM0QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWN4LDJcKQotIDk0MiAxMzA5IDhDMUM0RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVjeCwyXCkKLSA5NDMgMTMxMCA4QzFDNEUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDJcKQotIDk0NCAxMzEzIDhDMUM0RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlY3gsMlwpCi0gOTQ1IDEzMTYgOEMxQzUwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkeCwyXCkKLSA5NDYgMTMxOSA4QzFDNTEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDJcKQotIDk0NyAxMzFjIDhDMUM1MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZHgsMlwpCi0gOTQ4IDEzMWYgOEMxQzUzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkeCwyXCkKLSA5NDkgMTMyMiAzRThDMUM1NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDJcKQotIDk1MCAxMzI2IDhDMUM1NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkeCwyXCkKLSA5NTEgMTMyZCA4QzFDNTYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWR4LDJcKQotIDk1MiAxMzMwIDhDMUM1NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsMlwpCi0gOTUzIDEzMzMgOEMxQzU4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVieCwyXCkKLSA5NTQgMTMzNiA4QzFDNTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJ4LDJcKQotIDk1NSAxMzM5IDhDMUM1QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsMlwpCi0gOTU2IDEzM2MgOEMxQzVCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVieCwyXCkKLSA5NTcgMTMzZiAzRThDMUM1QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJ4LDJcKQotIDk1OCAxMzQzIDhDMUM1RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCwyXCkKLSA5NTkgMTM0YSA4QzFDNUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJ4LDJcKQotIDk2MCAxMzRkIDhDMUM1RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYngsMlwpCi0gOTYxIDEzNTAgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSA5NjIgMTM1MiA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDk2MyAxMzU0IDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gOTY0IDEzNTYgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSA5NjUgMTM1OCAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDk2NiAxMzVjIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsMlwpCi0uKldhcm5pbmc6LioKLSA5NjcgMTM2MiA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDk2OCAxMzY0IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gOTY5IDEzNjYgOEMxQzY4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCwyXCkKLSA5NzAgMTM2OSA4QzFDNjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDJcKQotIDk3MSAxMzZjIDhDMUM2QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsMlwpCi0gOTcyIDEzNmYgOEMxQzZCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCwyXCkKLSA5NzMgMTM3MiAzRThDMUM2QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDJcKQotIDk3NCAxMzc2IDhDMUM2RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCwyXCkKLSA5NzUgMTM3ZCA4QzFDNkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDJcKQotIDk3NiAxMzgwIDhDMUM2RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsMlwpCi0gOTc3IDEzODMgOEMxQzcwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSwyXCkKLSA5NzggMTM4NiA4QzFDNzEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDJcKQotIDk3OSAxMzg5IDhDMUM3MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksMlwpCi0gOTgwIDEzOGMgOEMxQzczICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSwyXCkKLSA5ODEgMTM4ZiAzRThDMUM3NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDJcKQotIDk4MiAxMzkzIDhDMUM3NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSwyXCkKLSA5ODMgMTM5YSA4QzFDNzYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDJcKQotIDk4NCAxMzlkIDhDMUM3NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksMlwpCi0gOTg1IDEzYTAgOEMxQzc4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSwyXCkKLSA5ODYgMTNhMyA4QzFDNzkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDJcKQotIDk4NyAxM2E2IDhDMUM3QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksMlwpCi0gOTg4IDEzYTkgOEMxQzdCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSwyXCkKLSA5ODkgMTNhYyAzRThDMUM3QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDJcKQotIDk5MCAxM2IwIDhDMUM3RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSwyXCkKLSA5OTEgMTNiNyA4QzFDN0UgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDJcKQotIDk5MiAxM2JhIDhDMUM3RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksMlwpCi0gOTkzIDEzYmQgOEMxQzgwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVheCw0XCkKLSA5OTQgMTNjMCA4QzFDODEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDRcKQotIDk5NSAxM2MzIDhDMUM4MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsNFwpCi0gOTk2IDEzYzYgOEMxQzgzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVheCw0XCkKLSA5OTcgMTNjOSAzRThDMUM4NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDRcKQotIDk5OCAxM2NkIDhDMUM4NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCw0XCkKLSA5OTkgMTNkNCA4QzFDODYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWF4LDRcKQotIDEwMDAgMTNkNyA4QzFDODcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDRcKQotIDEwMDEgMTNkYSA4QzFDODggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWN4LDRcKQotIDEwMDIgMTNkZCA4QzFDODkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWN4LDRcKQotIDEwMDMgMTNlMCA4QzFDOEEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDRcKQotIDEwMDQgMTNlMyA4QzFDOEIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWN4LDRcKQotIDEwMDUgMTNlNiAzRThDMUM4QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWN4LDRcKQotIDEwMDYgMTNlYSA4QzFDOEQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsNFwpCi0gMTAwNyAxM2YxIDhDMUM4RSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlY3gsNFwpCi0gMTAwOCAxM2Y0IDhDMUM4RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlY3gsNFwpCi0gMTAwOSAxM2Y3IDhDMUM5MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsNFwpCi0gMTAxMCAxM2ZhIDhDMUM5MSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZHgsNFwpCi0gMTAxMSAxM2ZkIDhDMUM5MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZHgsNFwpCi0gMTAxMiAxNDAwIDhDMUM5MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsNFwpCi0gMTAxMyAxNDAzIDNFOEMxQzk0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZHgsNFwpCi0gMTAxNCAxNDA3IDhDMUM5NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkeCw0XCkKLSAxMDE1IDE0MGUgOEMxQzk2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCw0XCkKLSAxMDE2IDE0MTEgOEMxQzk3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkeCw0XCkKLSAxMDE3IDE0MTQgOEMxQzk4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVieCw0XCkKLSAxMDE4IDE0MTcgOEMxQzk5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCw0XCkKLSAxMDE5IDE0MWEgOEMxQzlBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVieCw0XCkKLSAxMDIwIDE0MWQgOEMxQzlCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVieCw0XCkKLSAxMDIxIDE0MjAgM0U4QzFDOUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCw0XCkKLSAxMDIyIDE0MjQgOEMxQzlEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJ4LDRcKQotIDEwMjMgMTQyYiA4QzFDOUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJ4LDRcKQotIDEwMjQgMTQyZSA4QzFDOUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDRcKQotIDEwMjUgMTQzMSA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDEwMjYgMTQzMyA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDEwMjcgMTQzNSA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDEwMjggMTQzNyA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDEwMjkgMTQzOSAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDEwMzAgMTQzZCA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMSAxNDQzIDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMiAxNDQ1IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMyAxNDQ3IDhDMUNBOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsNFwpCi0gMTAzNCAxNDRhIDhDMUNBOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYnAsNFwpCi0gMTAzNSAxNDRkIDhDMUNBQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsNFwpCi0gMTAzNiAxNDUwIDhDMUNBQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsNFwpCi0gMTAzNyAxNDUzIDNFOEMxQ0FDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYnAsNFwpCi0gMTAzOCAxNDU3IDhDMUNBRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCw0XCkKLSAxMDM5IDE0NWUgOEMxQ0FFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCw0XCkKLSAxMDQwIDE0NjEgOEMxQ0FGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVicCw0XCkKLSAxMDQxIDE0NjQgOEMxQ0IwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSw0XCkKLSAxMDQyIDE0NjcgOEMxQ0IxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSw0XCkKLSAxMDQzIDE0NmEgOEMxQ0IyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVzaSw0XCkKLSAxMDQ0IDE0NmQgOEMxQ0IzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSw0XCkKLSAxMDQ1IDE0NzAgM0U4QzFDQjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSw0XCkKLSAxMDQ2IDE0NzQgOEMxQ0I1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZXNpLDRcKQotIDEwNDcgMTQ3YiA4QzFDQjYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDRcKQotIDEwNDggMTQ3ZSA4QzFDQjcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDRcKQotIDEwNDkgMTQ4MSA4QzFDQjggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWRpLDRcKQotIDEwNTAgMTQ4NCA4QzFDQjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDRcKQotIDEwNTEgMTQ4NyA4QzFDQkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDRcKQotIDEwNTIgMTQ4YSA4QzFDQkIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWRpLDRcKQotIDEwNTMgMTQ4ZCAzRThDMUNCQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDRcKQotIDEwNTQgMTQ5MSA4QzFDQkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksNFwpCi0gMTA1NSAxNDk4IDhDMUNCRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZGksNFwpCi0gMTA1NiAxNDliIDhDMUNCRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksNFwpCi0gMTA1NyAxNDllIDhDMUNDMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsOFwpCi0gMTA1OCAxNGExIDhDMUNDMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYXgsOFwpCi0gMTA1OSAxNGE0IDhDMUNDMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsOFwpCi0gMTA2MCAxNGE3IDhDMUNDMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsOFwpCi0gMTA2MSAxNGFhIDNFOEMxQ0M0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYXgsOFwpCi0gMTA2MiAxNGFlIDhDMUNDNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCw4XCkKLSAxMDYzIDE0YjUgOEMxQ0M2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCw4XCkKLSAxMDY0IDE0YjggOEMxQ0M3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCw4XCkKLSAxMDY1IDE0YmIgOEMxQ0M4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCw4XCkKLSAxMDY2IDE0YmUgOEMxQ0M5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCw4XCkKLSAxMDY3IDE0YzEgOEMxQ0NBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCw4XCkKLSAxMDY4IDE0YzQgOEMxQ0NCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCw4XCkKLSAxMDY5IDE0YzcgM0U4QzFDQ0MgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCw4XCkKLSAxMDcwIDE0Y2IgOEMxQ0NEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDhcKQotIDEwNzEgMTRkMiA4QzFDQ0UgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDhcKQotIDEwNzIgMTRkNSA4QzFDQ0YgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDhcKQotIDEwNzMgMTRkOCA4QzFDRDAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDhcKQotIDEwNzQgMTRkYiA4QzFDRDEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDhcKQotIDEwNzUgMTRkZSA4QzFDRDIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDhcKQotIDEwNzYgMTRlMSA4QzFDRDMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDhcKQotIDEwNzcgMTRlNCAzRThDMUNENCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDhcKQotIDEwNzggMTRlOCA4QzFDRDUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsOFwpCi0gMTA3OSAxNGVmIDhDMUNENiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsOFwpCi0gMTA4MCAxNGYyIDhDMUNENyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsOFwpCi0gMTA4MSAxNGY1IDhDMUNEOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsOFwpCi0gMTA4MiAxNGY4IDhDMUNEOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsOFwpCi0gMTA4MyAxNGZiIDhDMUNEQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsOFwpCi0gMTA4NCAxNGZlIDhDMUNEQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsOFwpCi0gMTA4NSAxNTAxIDNFOEMxQ0RDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsOFwpCi0gMTA4NiAxNTA1IDhDMUNERDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCw4XCkKLSAxMDg3IDE1MGMgOEMxQ0RFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCw4XCkKLSAxMDg4IDE1MGYgOEMxQ0RGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCw4XCkKLSAxMDg5IDE1MTIgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkwIDE1MTQgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkxIDE1MTYgOEMxQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkyIDE1MTggOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkzIDE1MWEgM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSAxMDk0IDE1MWUgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczpcKCw4XCkKLS4qV2FybmluZzouKgotIDEwOTUgMTUyNCA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDEwOTYgMTUyNiA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDEwOTcgMTUyOCA4QzFDRTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJwLDhcKQotIDEwOTggMTUyYiA4QzFDRTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDhcKQotIDEwOTkgMTUyZSA4QzFDRUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDhcKQotIDExMDAgMTUzMSA4QzFDRUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJwLDhcKQotIDExMDEgMTUzNCAzRThDMUNFQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDhcKQotIDExMDIgMTUzOCA4QzFDRUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsOFwpCi0gMTEwMyAxNTNmIDhDMUNFRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYnAsOFwpCi0gMTEwNCAxNTQyIDhDMUNFRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsOFwpCi0gMTEwNSAxNTQ1IDhDMUNGMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksOFwpCi0gMTEwNiAxNTQ4IDhDMUNGMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlc2ksOFwpCi0gMTEwNyAxNTRiIDhDMUNGMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksOFwpCi0gMTEwOCAxNTRlIDhDMUNGMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksOFwpCi0gMTEwOSAxNTUxIDNFOEMxQ0Y0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlc2ksOFwpCi0gMTExMCAxNTU1IDhDMUNGNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSw4XCkKLSAxMTExIDE1NWMgOEMxQ0Y2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSw4XCkKLSAxMTEyIDE1NWYgOEMxQ0Y3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVzaSw4XCkKLSAxMTEzIDE1NjIgOEMxQ0Y4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSw4XCkKLSAxMTE0IDE1NjUgOEMxQ0ZBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkaSw4XCkKLSAxMTE1IDE1NjggOEMxQ0Y5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSw4XCkKLSAxMTE2IDE1NmIgOEMxQ0ZCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSw4XCkKLSAxMTE3IDE1NmUgM0U4QzFDRkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSw4XCkKLSAxMTE4IDE1NzIgOEMxQ0ZEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWRpLDhcKQotIDExMTkgMTU3OSA4QzFDRkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDhcKQotIDExMjAgMTU3YyA4QzFDRkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDhcKQotIDExMjEgMTU3ZiA4QzVDMDAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCwxXCkKLSAxMTIyIDE1ODMgOEM1QzAxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsMVwpCi0gMTEyMyAxNTg3IDhDNUMwMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDFcKQotIDExMjQgMTU4YiA4QzVDMDMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCwxXCkKLSAxMTI1IDE1OGYgM0U4QzVDMDQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsMVwpCi0gMTEyNiAxNTk0IDNFOEM1QzA1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDFcKQotIDExMjcgMTU5OSA4QzVDMDYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCwxXCkKLSAxMTI4IDE1OWQgOEM1QzA3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsMVwpCi0gMTEyOSAxNWExIDhDNUMwODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDFcKQotIDExMzAgMTVhNSA4QzVDMDkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCwxXCkKLSAxMTMxIDE1YTkgOEM1QzBBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsMVwpCi0gMTEzMiAxNWFkIDhDNUMwQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDFcKQotIDExMzMgMTViMSAzRThDNUMwQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCwxXCkKLSAxMTM0IDE1YjYgM0U4QzVDMEQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsMVwpCi0gMTEzNSAxNWJiIDhDNUMwRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDFcKQotIDExMzYgMTViZiA4QzVDMEYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCwxXCkKLSAxMTM3IDE1YzMgOEM1QzEwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsMVwpCi0gMTEzOCAxNWM3IDhDNUMxMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDFcKQotIDExMzkgMTVjYiA4QzVDMTIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCwxXCkKLSAxMTQwIDE1Y2YgOEM1QzEzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsMVwpCi0gMTE0MSAxNWQzIDNFOEM1QzE0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDFcKQotIDExNDIgMTVkOCAzRThDNUMxNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCwxXCkKLSAxMTQzIDE1ZGQgOEM1QzE2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsMVwpCi0gMTE0NCAxNWUxIDhDNUMxNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDFcKQotIDExNDUgMTVlNSA4QzVDMTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCwxXCkKLSAxMTQ2IDE1ZTkgOEM1QzE5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsMVwpCi0gMTE0NyAxNWVkIDhDNUMxQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDFcKQotIDExNDggMTVmMSA4QzVDMUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCwxXCkKLSAxMTQ5IDE1ZjUgM0U4QzVDMUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsMVwpCi0gMTE1MCAxNWZhIDNFOEM1QzFEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDFcKQotIDExNTEgMTVmZiA4QzVDMUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCwxXCkKLSAxMTUyIDE2MDMgOEM1QzFGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsMVwpCi0gMTE1MyAxNjA3IDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwxXCkKLSAxMTU0IDE2MGEgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDFcKQotIDExNTUgMTYwZCA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsMVwpCi0gMTE1NiAxNjEwIDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwxXCkKLSAxMTU3IDE2MTMgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDFcKQotIDExNTggMTYxOCAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsMVwpCi0gMTE1OSAxNjFjIDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwxXCkKLSAxMTYwIDE2MWYgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDFcKQotIDExNjEgMTYyMiA4QzVDMjgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCwxXCkKLSAxMTYyIDE2MjYgOEM1QzI5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsMVwpCi0gMTE2MyAxNjJhIDhDNUMyQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDFcKQotIDExNjQgMTYyZSA4QzVDMkIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCwxXCkKLSAxMTY1IDE2MzIgM0U4QzVDMkMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsMVwpCi0gMTE2NiAxNjM3IDNFOEM1QzJEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDFcKQotIDExNjcgMTYzYyA4QzVDMkUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCwxXCkKLSAxMTY4IDE2NDAgOEM1QzJGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsMVwpCi0gMTE2OSAxNjQ0IDhDNUMzMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDFcKQotIDExNzAgMTY0OCA4QzVDMzExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSwxXCkKLSAxMTcxIDE2NGMgOEM1QzMyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksMVwpCi0gMTE3MiAxNjUwIDhDNUMzMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDFcKQotIDExNzMgMTY1NCAzRThDNUMzNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSwxXCkKLSAxMTc0IDE2NTkgM0U4QzVDMzUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksMVwpCi0gMTE3NSAxNjVlIDhDNUMzNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDFcKQotIDExNzYgMTY2MiA4QzVDMzcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSwxXCkKLSAxMTc3IDE2NjYgOEM1QzM4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksMVwpCi0gMTE3OCAxNjZhIDhDNUMzOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWRpLDFcKQotIDExNzkgMTY2ZSA4QzVDM0ExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSwxXCkKLSAxMTgwIDE2NzIgOEM1QzNCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksMVwpCi0gMTE4MSAxNjc2IDNFOEM1QzNDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDFcKQotIDExODIgMTY3YiAzRThDNUMzRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSwxXCkKLSAxMTgzIDE2ODAgOEM1QzNFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksMVwpCi0gMTE4NCAxNjg0IDhDNUMzRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDFcKQotIDExODUgMTY4OCA4QzVDNDAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCwyXCkKLSAxMTg2IDE2OGMgOEM1QzQxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsMlwpCi0gMTE4NyAxNjkwIDhDNUM0MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDJcKQotIDExODggMTY5NCA4QzVDNDMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCwyXCkKLSAxMTg5IDE2OTggM0U4QzVDNDQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsMlwpCi0gMTE5MCAxNjlkIDNFOEM1QzQ1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDJcKQotIDExOTEgMTZhMiA4QzVDNDYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCwyXCkKLSAxMTkyIDE2YTYgOEM1QzQ3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsMlwpCi0gMTE5MyAxNmFhIDhDNUM0ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDJcKQotIDExOTQgMTZhZSA4QzVDNDkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCwyXCkKLSAxMTk1IDE2YjIgOEM1QzRBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsMlwpCi0gMTE5NiAxNmI2IDhDNUM0QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDJcKQotIDExOTcgMTZiYSAzRThDNUM0QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCwyXCkKLSAxMTk4IDE2YmYgM0U4QzVDNEQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsMlwpCi0gMTE5OSAxNmM0IDhDNUM0RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDJcKQotIDEyMDAgMTZjOCA4QzVDNEYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCwyXCkKLSAxMjAxIDE2Y2MgOEM1QzUwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsMlwpCi0gMTIwMiAxNmQwIDhDNUM1MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDJcKQotIDEyMDMgMTZkNCA4QzVDNTIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCwyXCkKLSAxMjA0IDE2ZDggOEM1QzUzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsMlwpCi0gMTIwNSAxNmRjIDNFOEM1QzU0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDJcKQotIDEyMDYgMTZlMSAzRThDNUM1NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCwyXCkKLSAxMjA3IDE2ZTYgOEM1QzU2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsMlwpCi0gMTIwOCAxNmVhIDhDNUM1NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDJcKQotIDEyMDkgMTZlZSA4QzVDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCwyXCkKLSAxMjEwIDE2ZjIgOEM1QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsMlwpCi0gMTIxMSAxNmY2IDhDNUM1QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDJcKQotIDEyMTIgMTZmYSA4QzVDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCwyXCkKLSAxMjEzIDE2ZmUgM0U4QzVDNUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsMlwpCi0gMTIxNCAxNzAzIDNFOEM1QzVEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDJcKQotIDEyMTUgMTcwOCA4QzVDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCwyXCkKLSAxMjE2IDE3MGMgOEM1QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsMlwpCi0gMTIxNyAxNzEwIDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDEyMTggMTcxMyA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSAxMjE5IDE3MTYgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gMTIyMCAxNzE5IDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDEyMjEgMTcxYyAzRThDNUMyNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSAxMjIyIDE3MjEgM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gMTIyMyAxNzI1IDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDEyMjQgMTcyOCA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAxMjI1IDE3MmIgOEM1QzY4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsMlwpCi0gMTIyNiAxNzJmIDhDNUM2OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDJcKQotIDEyMjcgMTczMyA4QzVDNkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCwyXCkKLSAxMjI4IDE3MzcgOEM1QzZCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsMlwpCi0gMTIyOSAxNzNiIDNFOEM1QzZDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDJcKQotIDEyMzAgMTc0MCAzRThDNUM2RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCwyXCkKLSAxMjMxIDE3NDUgOEM1QzZFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsMlwpCi0gMTIzMiAxNzQ5IDhDNUM2RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDJcKQotIDEyMzMgMTc0ZCA4QzVDNzAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSwyXCkKLSAxMjM0IDE3NTEgOEM1QzcxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksMlwpCi0gMTIzNSAxNzU1IDhDNUM3MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDJcKQotIDEyMzYgMTc1OSA4QzVDNzMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSwyXCkKLSAxMjM3IDE3NWQgM0U4QzVDNzQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksMlwpCi0gMTIzOCAxNzYyIDNFOEM1Qzc1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDJcKQotIDEyMzkgMTc2NyA4QzVDNzYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSwyXCkKLSAxMjQwIDE3NmIgOEM1Qzc3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksMlwpCi0gMTI0MSAxNzZmIDhDNUM3ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDJcKQotIDEyNDIgMTc3MyA4QzVDNzkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSwyXCkKLSAxMjQzIDE3NzcgOEM1QzdBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZGksMlwpCi0gMTI0NCAxNzdiIDhDNUM3QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDJcKQotIDEyNDUgMTc3ZiAzRThDNUM3QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSwyXCkKLSAxMjQ2IDE3ODQgM0U4QzVDN0QgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksMlwpCi0gMTI0NyAxNzg5IDhDNUM3RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDJcKQotIDEyNDggMTc4ZCA4QzVDN0YxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSwyXCkKLSAxMjQ5IDE3OTEgOEM1QzgwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsNFwpCi0gMTI1MCAxNzk1IDhDNUM4MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDRcKQotIDEyNTEgMTc5OSA4QzVDODIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCw0XCkKLSAxMjUyIDE3OWQgOEM1QzgzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsNFwpCi0gMTI1MyAxN2ExIDNFOEM1Qzg0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDRcKQotIDEyNTQgMTdhNiAzRThDNUM4NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCw0XCkKLSAxMjU1IDE3YWIgOEM1Qzg2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsNFwpCi0gMTI1NiAxN2FmIDhDNUM4NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDRcKQotIDEyNTcgMTdiMyA4QzVDODgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCw0XCkKLSAxMjU4IDE3YjcgOEM1Qzg5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsNFwpCi0gMTI1OSAxN2JiIDhDNUM4QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDRcKQotIDEyNjAgMTdiZiA4QzVDOEIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCw0XCkKLSAxMjYxIDE3YzMgM0U4QzVDOEMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsNFwpCi0gMTI2MiAxN2M4IDNFOEM1QzhEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDRcKQotIDEyNjMgMTdjZCA4QzVDOEUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCw0XCkKLSAxMjY0IDE3ZDEgOEM1QzhGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsNFwpCi0gMTI2NSAxN2Q1IDhDNUM5MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDRcKQotIDEyNjYgMTdkOSA4QzVDOTExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCw0XCkKLSAxMjY3IDE3ZGQgOEM1QzkyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsNFwpCi0gMTI2OCAxN2UxIDhDNUM5MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDRcKQotIDEyNjkgMTdlNSAzRThDNUM5NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCw0XCkKLSAxMjcwIDE3ZWEgM0U4QzVDOTUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsNFwpCi0gMTI3MSAxN2VmIDhDNUM5NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDRcKQotIDEyNzIgMTdmMyA4QzVDOTcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCw0XCkKLSAxMjczIDE3ZjcgOEM1Qzk4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsNFwpCi0gMTI3NCAxN2ZiIDhDNUM5OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDRcKQotIDEyNzUgMTdmZiA4QzVDOUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCw0XCkKLSAxMjc2IDE4MDMgOEM1QzlCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsNFwpCi0gMTI3NyAxODA3IDNFOEM1QzlDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDRcKQotIDEyNzggMTgwYyAzRThDNUM5RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCw0XCkKLSAxMjc5IDE4MTEgOEM1QzlFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsNFwpCi0gMTI4MCAxODE1IDhDNUM5RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDRcKQotIDEyODEgMTgxOSA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxMjgyIDE4MWMgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTI4MyAxODFmIDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDEyODQgMTgyMiA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxMjg1IDE4MjUgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTI4NiAxODJhIDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDEyODcgMTgyZSA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSAxMjg4IDE4MzEgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTI4OSAxODM0IDhDNUNBODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJwLDRcKQotIDEyOTAgMTgzOCA4QzVDQTkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVicCw0XCkKLSAxMjkxIDE4M2MgOEM1Q0FBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYnAsNFwpCi0gMTI5MiAxODQwIDhDNUNBQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJwLDRcKQotIDEyOTMgMTg0NCAzRThDNUNBQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVicCw0XCkKLSAxMjk0IDE4NDkgM0U4QzVDQUQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYnAsNFwpCi0gMTI5NSAxODRlIDhDNUNBRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJwLDRcKQotIDEyOTYgMTg1MiA4QzVDQUYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVicCw0XCkKLSAxMjk3IDE4NTYgOEM1Q0IwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlc2ksNFwpCi0gMTI5OCAxODVhIDhDNUNCMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZXNpLDRcKQotIDEyOTkgMTg1ZSA4QzVDQjIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVzaSw0XCkKLSAxMzAwIDE4NjIgOEM1Q0IzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlc2ksNFwpCi0gMTMwMSAxODY2IDNFOEM1Q0I0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZXNpLDRcKQotIDEzMDIgMTg2YiAzRThDNUNCNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVzaSw0XCkKLSAxMzAzIDE4NzAgOEM1Q0I2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlc2ksNFwpCi0gMTMwNCAxODc0IDhDNUNCNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZXNpLDRcKQotIDEzMDUgMTg3OCA4QzVDQjgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkaSw0XCkKLSAxMzA2IDE4N2MgOEM1Q0I5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksNFwpCi0gMTMwNyAxODgwIDhDNUNCQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDRcKQotIDEzMDggMTg4NCA4QzVDQkIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkaSw0XCkKLSAxMzA5IDE4ODggM0U4QzVDQkMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZGksNFwpCi0gMTMxMCAxODhkIDNFOEM1Q0JEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWRpLDRcKQotIDEzMTEgMTg5MiA4QzVDQkUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkaSw0XCkKLSAxMzEyIDE4OTYgOEM1Q0JGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZGksNFwpCi0gMTMxMyAxODlhIDhDNUNDMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWF4LDhcKQotIDEzMTQgMTg5ZSA4QzVDQzExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVheCw4XCkKLSAxMzE1IDE4YTIgOEM1Q0MyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYXgsOFwpCi0gMTMxNiAxOGE2IDhDNUNDMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWF4LDhcKQotIDEzMTcgMThhYSAzRThDNUNDNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVheCw4XCkKLSAxMzE4IDE4YWYgM0U4QzVDQzUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYXgsOFwpCi0gMTMxOSAxOGI0IDhDNUNDNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWF4LDhcKQotIDEzMjAgMThiOCA4QzVDQzcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVheCw4XCkKLSAxMzIxIDE4YmMgOEM1Q0M4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlY3gsOFwpCi0gMTMyMiAxOGMwIDhDNUNDOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWN4LDhcKQotIDEzMjMgMThjNCA4QzVDQ0ExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVjeCw4XCkKLSAxMzI0IDE4YzggOEM1Q0NCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlY3gsOFwpCi0gMTMyNSAxOGNjIDNFOEM1Q0NDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWN4LDhcKQotIDEzMjYgMThkMSAzRThDNUNDRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVjeCw4XCkKLSAxMzI3IDE4ZDYgOEM1Q0NFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlY3gsOFwpCi0gMTMyOCAxOGRhIDhDNUNDRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWN4LDhcKQotIDEzMjkgMThkZSA4QzVDRDAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkeCw4XCkKLSAxMzMwIDE4ZTIgOEM1Q0QxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZHgsOFwpCi0gMTMzMSAxOGU2IDhDNUNEMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWR4LDhcKQotIDEzMzIgMThlYSA4QzVDRDMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkeCw4XCkKLSAxMzMzIDE4ZWUgM0U4QzVDRDQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZHgsOFwpCi0gMTMzNCAxOGYzIDNFOEM1Q0Q1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWR4LDhcKQotIDEzMzUgMThmOCA4QzVDRDYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkeCw4XCkKLSAxMzM2IDE4ZmMgOEM1Q0Q3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZHgsOFwpCi0gMTMzNyAxOTAwIDhDNUNEODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJ4LDhcKQotIDEzMzggMTkwNCA4QzVDRDkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVieCw4XCkKLSAxMzM5IDE5MDggOEM1Q0RBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYngsOFwpCi0gMTM0MCAxOTBjIDhDNUNEQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJ4LDhcKQotIDEzNDEgMTkxMCAzRThDNUNEQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVieCw4XCkKLSAxMzQyIDE5MTUgM0U4QzVDREQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYngsOFwpCi0gMTM0MyAxOTFhIDhDNUNERTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJ4LDhcKQotIDEzNDQgMTkxZSA4QzVDREYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVieCw4XCkKLSAxMzQ1IDE5MjIgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gMTM0NiAxOTI1IDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDEzNDcgMTkyOCA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAxMzQ4IDE5MmIgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gMTM0OSAxOTJlIDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDEzNTAgMTkzMyAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSAxMzUxIDE5MzcgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMTM1MiAxOTNhIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDEzNTMgMTkzZCA4QzVDRTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCw4XCkKLSAxMzU0IDE5NDEgOEM1Q0U5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsOFwpCi0gMTM1NSAxOTQ1IDhDNUNFQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDhcKQotIDEzNTYgMTk0OSA4QzVDRUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCw4XCkKLSAxMzU3IDE5NGQgM0U4QzVDRUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsOFwpCi0gMTM1OCAxOTUyIDNFOEM1Q0VEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDhcKQotIDEzNTkgMTk1NyA4QzVDRUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCw4XCkKLSAxMzYwIDE5NWIgOEM1Q0VGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsOFwpCi0gMTM2MSAxOTVmIDhDNUNGMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDhcKQotIDEzNjIgMTk2MyA4QzVDRjExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSw4XCkKLSAxMzYzIDE5NjcgOEM1Q0YyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksOFwpCi0gMTM2NCAxOTZiIDhDNUNGMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDhcKQotIDEzNjUgMTk2ZiAzRThDNUNGNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSw4XCkKLSAxMzY2IDE5NzQgM0U4QzVDRjUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksOFwpCi0gMTM2NyAxOTc5IDhDNUNGNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDhcKQotIDEzNjggMTk3ZCA4QzVDRjcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSw4XCkKLSAxMzY5IDE5ODEgOEM1Q0Y4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksOFwpCi0gMTM3MCAxOTg1IDhDNUNGQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDhcKQotIDEzNzEgMTk4OSA4QzVDRjkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSw4XCkKLSAxMzcyIDE5OGQgOEM1Q0ZCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksOFwpCi0gMTM3MyAxOTkxIDNFOEM1Q0ZDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDhcKQotIDEzNzQgMTk5NiAzRThDNUNGRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSw4XCkKLSAxMzc1IDE5OWIgOEM1Q0ZFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksOFwpCi0gMTM3NiAxOTlmIDhDNUNGRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDhcKQotIDEzNzcgMTlhMyA4QzlDMDA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwxXCkKLSAxMzc4IDE5YWEgOEM5QzAxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMVwpCi0gMTM3OSAxOWIxIDhDOUMwMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDFcKQotIDEzODAgMTliOCA4QzlDMDM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwxXCkKLSAxMzgxIDE5YmYgM0U4QzlDMDQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMVwpCi0gMTM4MiAxOWM3IDNFOEM5QzA1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDFcKQotIDEzODMgMTljZiA4QzlDMDY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwxXCkKLSAxMzg0IDE5ZDYgOEM5QzA3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMVwpCi0gMTM4NSAxOWRkIDhDOUMwODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDFcKQotIDEzODYgMTllNCA4QzlDMDk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwxXCkKLSAxMzg3IDE5ZWIgOEM5QzBBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMVwpCi0gMTM4OCAxOWYyIDhDOUMwQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDFcKQotIDEzODkgMTlmOSAzRThDOUMwQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwxXCkKLSAxMzkwIDFhMDEgM0U4QzlDMEQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMVwpCi0gMTM5MSAxYTA5IDhDOUMwRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDFcKQotIDEzOTIgMWExMCA4QzlDMEY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwxXCkKLSAxMzkzIDFhMTcgOEM5QzEwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMVwpCi0gMTM5NCAxYTFlIDhDOUMxMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDFcKQotIDEzOTUgMWEyNSA4QzlDMTI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwxXCkKLSAxMzk2IDFhMmMgOEM5QzEzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMVwpCi0gMTM5NyAxYTMzIDNFOEM5QzE0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDFcKQotIDEzOTggMWEzYiAzRThDOUMxNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwxXCkKLSAxMzk5IDFhNDMgOEM5QzE2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMVwpCi0gMTQwMCAxYTRhIDhDOUMxNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDFcKQotIDE0MDEgMWE1MSA4QzlDMTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwxXCkKLSAxNDAyIDFhNTggOEM5QzE5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMVwpCi0gMTQwMyAxYTVmIDhDOUMxQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDFcKQotIDE0MDQgMWE2NiA4QzlDMUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwxXCkKLSAxNDA1IDFhNmQgM0U4QzlDMUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMVwpCi0gMTQwNiAxYTc1IDNFOEM5QzFEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDFcKQotIDE0MDcgMWE3ZCA4QzlDMUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwxXCkKLSAxNDA4IDFhODQgOEM5QzFGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMVwpCi0gMTQwOSAxYThiIDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwxXCkKLSAxNDEwIDFhOTEgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDFcKQotIDE0MTEgMWE5NyA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsMVwpCi0gMTQxMiAxYTlkIDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwxXCkKLSAxNDEzIDFhYTMgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDFcKQotIDE0MTQgMWFhYiAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsMVwpCi0gMTQxNSAxYWIyIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwxXCkKLSAxNDE2IDFhYjggOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDFcKQotIDE0MTcgMWFiZSA4QzlDMjg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCwxXCkKLSAxNDE4IDFhYzUgOEM5QzI5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMVwpCi0gMTQxOSAxYWNjIDhDOUMyQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDFcKQotIDE0MjAgMWFkMyA4QzlDMkI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCwxXCkKLSAxNDIxIDFhZGEgM0U4QzlDMkMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMVwpCi0gMTQyMiAxYWUyIDNFOEM5QzJEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDFcKQotIDE0MjMgMWFlYSA4QzlDMkU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCwxXCkKLSAxNDI0IDFhZjEgOEM5QzJGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMVwpCi0gMTQyNSAxYWY4IDhDOUMzMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDFcKQotIDE0MjYgMWFmZiA4QzlDMzE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSwxXCkKLSAxNDI3IDFiMDYgOEM5QzMyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMVwpCi0gMTQyOCAxYjBkIDhDOUMzMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDFcKQotIDE0MjkgMWIxNCAzRThDOUMzNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSwxXCkKLSAxNDMwIDFiMWMgM0U4QzlDMzUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMVwpCi0gMTQzMSAxYjI0IDhDOUMzNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDFcKQotIDE0MzIgMWIyYiA4QzlDMzc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSwxXCkKLSAxNDMzIDFiMzIgOEM5QzM4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMVwpCi0gMTQzNCAxYjM5IDhDOUMzOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDFcKQotIDE0MzUgMWI0MCA4QzlDM0E3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSwxXCkKLSAxNDM2IDFiNDcgOEM5QzNCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMVwpCi0gMTQzNyAxYjRlIDNFOEM5QzNDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDFcKQotIDE0MzggMWI1NiAzRThDOUMzRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSwxXCkKLSAxNDM5IDFiNWUgOEM5QzNFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMVwpCi0gMTQ0MCAxYjY1IDhDOUMzRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDFcKQotIDE0NDEgMWI2YyA4QzlDNDA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwyXCkKLSAxNDQyIDFiNzMgOEM5QzQxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMlwpCi0gMTQ0MyAxYjdhIDhDOUM0Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDJcKQotIDE0NDQgMWI4MSA4QzlDNDM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwyXCkKLSAxNDQ1IDFiODggM0U4QzlDNDQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMlwpCi0gMTQ0NiAxYjkwIDNFOEM5QzQ1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDJcKQotIDE0NDcgMWI5OCA4QzlDNDY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwyXCkKLSAxNDQ4IDFiOWYgOEM5QzQ3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMlwpCi0gMTQ0OSAxYmE2IDhDOUM0ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDJcKQotIDE0NTAgMWJhZCA4QzlDNDk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwyXCkKLSAxNDUxIDFiYjQgOEM5QzRBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMlwpCi0gMTQ1MiAxYmJiIDhDOUM0Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDJcKQotIDE0NTMgMWJjMiAzRThDOUM0QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwyXCkKLSAxNDU0IDFiY2EgM0U4QzlDNEQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMlwpCi0gMTQ1NSAxYmQyIDhDOUM0RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDJcKQotIDE0NTYgMWJkOSA4QzlDNEY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwyXCkKLSAxNDU3IDFiZTAgOEM5QzUwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMlwpCi0gMTQ1OCAxYmU3IDhDOUM1MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDJcKQotIDE0NTkgMWJlZSA4QzlDNTI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwyXCkKLSAxNDYwIDFiZjUgOEM5QzUzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMlwpCi0gMTQ2MSAxYmZjIDNFOEM5QzU0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDJcKQotIDE0NjIgMWMwNCAzRThDOUM1NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwyXCkKLSAxNDYzIDFjMGMgOEM5QzU2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMlwpCi0gMTQ2NCAxYzEzIDhDOUM1Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDJcKQotIDE0NjUgMWMxYSA4QzlDNTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwyXCkKLSAxNDY2IDFjMjEgOEM5QzU5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMlwpCi0gMTQ2NyAxYzI4IDhDOUM1QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDJcKQotIDE0NjggMWMyZiA4QzlDNUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwyXCkKLSAxNDY5IDFjMzYgM0U4QzlDNUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMlwpCi0gMTQ3MCAxYzNlIDNFOEM5QzVEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDJcKQotIDE0NzEgMWM0NiA4QzlDNUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwyXCkKLSAxNDcyIDFjNGQgOEM5QzVGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMlwpCi0gMTQ3MyAxYzU0IDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDE0NzQgMWM1YSA4Qzk5Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc1IDFjNjAgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3NiAxYzY2IDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDE0NzcgMWM2YyAzRThDOUMyNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc4IDFjNzQgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3OSAxYzdiIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDE0ODAgMWM4MSA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAxNDgxIDFjODcgOEM5QzY4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMlwpCi0gMTQ4MiAxYzhlIDhDOUM2OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDJcKQotIDE0ODMgMWM5NSA4QzlDNkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCwyXCkKLSAxNDg0IDFjOWMgOEM5QzZCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMlwpCi0gMTQ4NSAxY2EzIDNFOEM5QzZDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDJcKQotIDE0ODYgMWNhYiAzRThDOUM2RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCwyXCkKLSAxNDg3IDFjYjMgOEM5QzZFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMlwpCi0gMTQ4OCAxY2JhIDhDOUM2Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDJcKQotIDE0ODkgMWNjMSA4QzlDNzA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSwyXCkKLSAxNDkwIDFjYzggOEM5QzcxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMlwpCi0gMTQ5MSAxY2NmIDhDOUM3Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDJcKQotIDE0OTIgMWNkNiA4QzlDNzM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSwyXCkKLSAxNDkzIDFjZGQgM0U4QzlDNzQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMlwpCi0gMTQ5NCAxY2U1IDNFOEM5Qzc1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDJcKQotIDE0OTUgMWNlZCA4QzlDNzY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSwyXCkKLSAxNDk2IDFjZjQgOEM5Qzc3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMlwpCi0gMTQ5NyAxY2ZiIDhDOUM3ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDJcKQotIDE0OTggMWQwMiA4QzlDNzk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSwyXCkKLSAxNDk5IDFkMDkgOEM5QzdBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMlwpCi0gMTUwMCAxZDEwIDhDOUM3Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDJcKQotIDE1MDEgMWQxNyAzRThDOUM3QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSwyXCkKLSAxNTAyIDFkMWYgM0U4QzlDN0QgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMlwpCi0gMTUwMyAxZDI3IDhDOUM3RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDJcKQotIDE1MDQgMWQyZSA4QzlDN0Y3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSwyXCkKLSAxNTA1IDFkMzUgOEM5QzgwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsNFwpCi0gMTUwNiAxZDNjIDhDOUM4MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDRcKQotIDE1MDcgMWQ0MyA4QzlDODI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCw0XCkKLSAxNTA4IDFkNGEgOEM5QzgzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsNFwpCi0gMTUwOSAxZDUxIDNFOEM5Qzg0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDRcKQotIDE1MTAgMWQ1OSAzRThDOUM4NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCw0XCkKLSAxNTExIDFkNjEgOEM5Qzg2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsNFwpCi0gMTUxMiAxZDY4IDhDOUM4Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDRcKQotIDE1MTMgMWQ2ZiA4QzlDODg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCw0XCkKLSAxNTE0IDFkNzYgOEM5Qzg5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsNFwpCi0gMTUxNSAxZDdkIDhDOUM4QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDRcKQotIDE1MTYgMWQ4NCA4QzlDOEI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCw0XCkKLSAxNTE3IDFkOGIgM0U4QzlDOEMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsNFwpCi0gMTUxOCAxZDkzIDNFOEM5QzhEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDRcKQotIDE1MTkgMWQ5YiA4QzlDOEU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCw0XCkKLSAxNTIwIDFkYTIgOEM5QzhGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsNFwpCi0gMTUyMSAxZGE5IDhDOUM5MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDRcKQotIDE1MjIgMWRiMCA4QzlDOTE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCw0XCkKLSAxNTIzIDFkYjcgOEM5QzkyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsNFwpCi0gMTUyNCAxZGJlIDhDOUM5Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDRcKQotIDE1MjUgMWRjNSAzRThDOUM5NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCw0XCkKLSAxNTI2IDFkY2QgM0U4QzlDOTUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsNFwpCi0gMTUyNyAxZGQ1IDhDOUM5Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDRcKQotIDE1MjggMWRkYyA4QzlDOTc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCw0XCkKLSAxNTI5IDFkZTMgOEM5Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsNFwpCi0gMTUzMCAxZGVhIDhDOUM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDRcKQotIDE1MzEgMWRmMSA4QzlDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCw0XCkKLSAxNTMyIDFkZjggOEM5QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsNFwpCi0gMTUzMyAxZGZmIDNFOEM5QzlDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDRcKQotIDE1MzQgMWUwNyAzRThDOUM5RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCw0XCkKLSAxNTM1IDFlMGYgOEM5QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsNFwpCi0gMTUzNiAxZTE2IDhDOUM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDRcKQotIDE1MzcgMWUxZCA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxNTM4IDFlMjMgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTUzOSAxZTI5IDhDOUE3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDE1NDAgMWUyZiA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxNTQxIDFlMzUgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTU0MiAxZTNkIDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDE1NDMgMWU0NCA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSAxNTQ0IDFlNGEgOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTU0NSAxZTUwIDhDOUNBODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDRcKQotIDE1NDYgMWU1NyA4QzlDQTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCw0XCkKLSAxNTQ3IDFlNWUgOEM5Q0FBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsNFwpCi0gMTU0OCAxZTY1IDhDOUNBQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDRcKQotIDE1NDkgMWU2YyAzRThDOUNBQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCw0XCkKLSAxNTUwIDFlNzQgM0U4QzlDQUQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsNFwpCi0gMTU1MSAxZTdjIDhDOUNBRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDRcKQotIDE1NTIgMWU4MyA4QzlDQUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVicCw0XCkKLSAxNTUzIDFlOGEgOEM5Q0IwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksNFwpCi0gMTU1NCAxZTkxIDhDOUNCMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDRcKQotIDE1NTUgMWU5OCA4QzlDQjI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSw0XCkKLSAxNTU2IDFlOWYgOEM5Q0IzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksNFwpCi0gMTU1NyAxZWE2IDNFOEM5Q0I0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDRcKQotIDE1NTggMWVhZSAzRThDOUNCNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSw0XCkKLSAxNTU5IDFlYjYgOEM5Q0I2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksNFwpCi0gMTU2MCAxZWJkIDhDOUNCNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDRcKQotIDE1NjEgMWVjNCA4QzlDQjg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSw0XCkKLSAxNTYyIDFlY2IgOEM5Q0I5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksNFwpCi0gMTU2MyAxZWQyIDhDOUNCQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDRcKQotIDE1NjQgMWVkOSA4QzlDQkI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSw0XCkKLSAxNTY1IDFlZTAgM0U4QzlDQkMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZGksNFwpCi0gMTU2NiAxZWU4IDNFOEM5Q0JEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDRcKQotIDE1NjcgMWVmMCA4QzlDQkU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSw0XCkKLSAxNTY4IDFlZjcgOEM5Q0JGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZGksNFwpCi0gMTU2OSAxZWZlIDhDOUNDMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDhcKQotIDE1NzAgMWYwNSA4QzlDQzE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCw4XCkKLSAxNTcxIDFmMGMgOEM5Q0MyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsOFwpCi0gMTU3MiAxZjEzIDhDOUNDMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDhcKQotIDE1NzMgMWYxYSAzRThDOUNDNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCw4XCkKLSAxNTc0IDFmMjIgM0U4QzlDQzUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsOFwpCi0gMTU3NSAxZjJhIDhDOUNDNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDhcKQotIDE1NzYgMWYzMSA4QzlDQzc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVheCw4XCkKLSAxNTc3IDFmMzggOEM5Q0M4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsOFwpCi0gMTU3OCAxZjNmIDhDOUNDOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDhcKQotIDE1NzkgMWY0NiA4QzlDQ0E3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCw4XCkKLSAxNTgwIDFmNGQgOEM5Q0NCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsOFwpCi0gMTU4MSAxZjU0IDNFOEM5Q0NDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDhcKQotIDE1ODIgMWY1YyAzRThDOUNDRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCw4XCkKLSAxNTgzIDFmNjQgOEM5Q0NFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsOFwpCi0gMTU4NCAxZjZiIDhDOUNDRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDhcKQotIDE1ODUgMWY3MiA4QzlDRDA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCw4XCkKLSAxNTg2IDFmNzkgOEM5Q0QxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsOFwpCi0gMTU4NyAxZjgwIDhDOUNEMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDhcKQotIDE1ODggMWY4NyA4QzlDRDM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCw4XCkKLSAxNTg5IDFmOGUgM0U4QzlDRDQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsOFwpCi0gMTU5MCAxZjk2IDNFOEM5Q0Q1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDhcKQotIDE1OTEgMWY5ZSA4QzlDRDY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCw4XCkKLSAxNTkyIDFmYTUgOEM5Q0Q3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsOFwpCi0gMTU5MyAxZmFjIDhDOUNEODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDhcKQotIDE1OTQgMWZiMyA4QzlDRDk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCw4XCkKLSAxNTk1IDFmYmEgOEM5Q0RBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYngsOFwpCi0gMTU5NiAxZmMxIDhDOUNEQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDhcKQotIDE1OTcgMWZjOCAzRThDOUNEQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCw4XCkKLSAxNTk4IDFmZDAgM0U4QzlDREQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYngsOFwpCi0gMTU5OSAxZmQ4IDhDOUNERTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDhcKQotIDE2MDAgMWZkZiA4QzlDREY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVieCw4XCkKLSAxNjAxIDFmZTYgOEM5ODc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gMTYwMiAxZmVjIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDE2MDMgMWZmMiA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAxNjA0IDFmZjggOEM5Qjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gMTYwNSAxZmZlIDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDE2MDYgMjAwNiAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSAxNjA3IDIwMGQgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMTYwOCAyMDEzIDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDE2MDkgMjAxOSA4QzlDRTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCw4XCkKLSAxNjEwIDIwMjAgOEM5Q0U5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsOFwpCi0gMTYxMSAyMDI3IDhDOUNFQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDhcKQotIDE2MTIgMjAyZSA4QzlDRUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCw4XCkKLSAxNjEzIDIwMzUgM0U4QzlDRUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsOFwpCi0gMTYxNCAyMDNkIDNFOEM5Q0VEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDhcKQotIDE2MTUgMjA0NSA4QzlDRUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCw4XCkKLSAxNjE2IDIwNGMgOEM5Q0VGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsOFwpCi0gMTYxNyAyMDUzIDhDOUNGMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDhcKQotIDE2MTggMjA1YSA4QzlDRjE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSw4XCkKLSAxNjE5IDIwNjEgOEM5Q0YyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksOFwpCi0gMTYyMCAyMDY4IDhDOUNGMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDhcKQotIDE2MjEgMjA2ZiAzRThDOUNGNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSw4XCkKLSAxNjIyIDIwNzcgM0U4QzlDRjUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksOFwpCi0gMTYyMyAyMDdmIDhDOUNGNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDhcKQotIDE2MjQgMjA4NiA4QzlDRjc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSw4XCkKLSAxNjI1IDIwOGQgOEM5Q0Y4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksOFwpCi0gMTYyNiAyMDk0IDhDOUNGQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDhcKQotIDE2MjcgMjA5YiA4QzlDRjk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSw4XCkKLSAxNjI4IDIwYTIgOEM5Q0ZCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksOFwpCi0gMTYyOSAyMGE5IDNFOEM5Q0ZDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDhcKQotIDE2MzAgMjBiMSAzRThDOUNGRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSw4XCkKLSAxNjMxIDIwYjkgOEM5Q0ZFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksOFwpCi0gMTYzMiAyMGMwIDhDOUNGRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDhcKQotIDE2MzMgMjBjNyAzRThDNUMwNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWF4LDFcKQotIDE2MzQgMjBjYyAzRThDNUMwRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWN4LDFcKQotIDE2MzUgMjBkMSAzRThDNUMxNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWR4LDFcKQotIDE2MzYgMjBkNiAzRThDNUMxRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJ4LDFcKQotIDE2MzcgMjBkYiAzRThDNUQwMCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwxXCkKLSAxNjM4IDIwZGYgM0U4QzVDMkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCwxXCkKLSAxNjM5IDIwZTQgM0U4QzVDMzUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSwxXCkKLSAxNjQwIDIwZTkgM0U4QzVDM0QgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSwxXCkKLSAxNjQxIDIwZWUgM0U4QzVDNDUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCwyXCkKLSAxNjQyIDIwZjMgM0U4QzVDNEQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCwyXCkKLSAxNjQzIDIwZjggM0U4QzVDNTUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCwyXCkKLSAxNjQ0IDIwZmQgM0U4QzVDNUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCwyXCkKLSAxNjQ1IDIxMDIgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsMlwpCi0uKldhcm5pbmc6LioKLSAxNjQ2IDIxMDYgM0U4QzVDNkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCwyXCkKLSAxNjQ3IDIxMGIgM0U4QzVDNzUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSwyXCkKLSAxNjQ4IDIxMTAgM0U4QzVDN0QgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSwyXCkKLSAxNjQ5IDIxMTUgM0U4QzVDODUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCw0XCkKLSAxNjUwIDIxMWEgM0U4QzVDOEQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCw0XCkKLSAxNjUxIDIxMWYgM0U4QzVDOTUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCw0XCkKLSAxNjUyIDIxMjQgM0U4QzVDOUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCw0XCkKLSAxNjUzIDIxMjkgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSAxNjU0IDIxMmQgM0U4QzVDQUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCw0XCkKLSAxNjU1IDIxMzIgM0U4QzVDQjUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSw0XCkKLSAxNjU2IDIxMzcgM0U4QzVDQkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSw0XCkKLSAxNjU3IDIxM2MgM0U4QzVDQzUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCw4XCkKLSAxNjU4IDIxNDEgM0U4QzVDQ0QgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCw4XCkKLSAxNjU5IDIxNDYgM0U4QzVDRDUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCw4XCkKLSAxNjYwIDIxNGIgM0U4QzVDREQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCw4XCkKLSAxNjYxIDIxNTAgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSAxNjYyIDIxNTQgM0U4QzVDRUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCw4XCkKLSAxNjYzIDIxNTkgM0U4QzVDRjUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSw4XCkKLSAxNjY0IDIxNWUgM0U4QzVDRkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSw4XCkKLSAxNjY1IDIxNjMgOEMxRDEyMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczoweDEyXCgsMVwpCi0gMTY2NiAyMTY5IDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDJcKQotLipXYXJuaW5nOi4qCi0gMTY2NyAyMTZmIDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDRcKQotLipXYXJuaW5nOi4qCi0gMTY2OCAyMTc1IDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDhcKQotLipXYXJuaW5nOi4qCi0gMTY2OSBbIAldKgotIDE2NzAgWyAJXSogICAgIAkJIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotIDE2NzEgMjE3YiAwMDAwMDAwMCAwMFsgCV0qLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDQ0NmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTY3MSArMCwwIEBACi0ucHNpemUgMAotLnRleHQKLQltb3YJJWRzLCVzczooJWVheCkKLQltb3YJJWRzLCVzczooJWVjeCkKLQltb3YJJWRzLCVzczooJWVkeCkKLQltb3YJJWRzLCVzczooJWVieCkKLQltb3YJJWRzLCVzczowCi0JbW92CSVkcywlc3M6KCVlc2kpCi0JbW92CSVkcywlc3M6KCVlZGkpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2kpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnApCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSkKLQltb3YJJWRzLCVlYXgKLQltb3YJJWRzLCVlY3gKLQltb3YJJWRzLCVlZHgKLQltb3YJJWRzLCVlYngKLQltb3YJJWRzLCVlc3AKLQltb3YJJWRzLCVlYnAKLQltb3YJJWRzLCVlc2kKLQltb3YJJWRzLCVlZGkKLQltb3YJJWRzLCVzczooJWVheCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVheCwxKQotCW1vdgklZHMsJXNzOigsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVzczooLCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVieCwxKQotCW1vdgklZHMsJXNzOigsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVzcCwxKQotCW1vdgklZHMsJXNzOigsMSkKLQltb3YJJWRzLCVzczooJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVzczooLCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJXNzOigsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVzczooLCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVheCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVieCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJXNzOigsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVzczooLCVlYngsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsMikKLQltb3YJJWRzLCVzczooLDIpCi0JbW92CSVkcywlc3M6KCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVheCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVieCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJXNzOigsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVzczooLCVlZGksMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJXNzOigsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVzczooLCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVieCw0KQotCW1vdgklZHMsJXNzOiglZXNwLDQpCi0JbW92CSVkcywlc3M6KCw0KQotCW1vdgklZHMsJXNzOiglZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVicCw0KQotCW1vdgklZHMsJXNzOigsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVzczooLCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVheCw4KQotCW1vdgklZHMsJXNzOigsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVzczooLCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVieCw4KQotCW1vdgklZHMsJXNzOigsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVzcCw4KQotCW1vdgklZHMsJXNzOigsOCkKLQltb3YJJWRzLCVzczooJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVzczooLCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJXNzOigsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksMikKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCwxKQotCW1vdgklZHMsJXNzOjB4MTIoLDIpCi0JbW92CSVkcywlc3M6MHgxMigsNCkKLQltb3YJJWRzLCVzczoweDEyKCw4KQotCW1vdgklZHMsJWRzOiglZWF4KQotCW1vdgklZHMsJWRzOiglZWN4KQotCW1vdgklZHMsJWRzOiglZWR4KQotCW1vdgklZHMsJWRzOiglZWJ4KQotCW1vdgklZHMsJWRzOjAKLQltb3YJJWRzLCVkczooJWVzaSkKLQltb3YJJWRzLCVkczooJWVkaSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGkpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2kpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpKQotCW1vdgklZHMsJWVheAotCW1vdgklZHMsJWVjeAotCW1vdgklZHMsJWVkeAotCW1vdgklZHMsJWVieAotCW1vdgklZHMsJWVzcAotCW1vdgklZHMsJWVicAotCW1vdgklZHMsJWVzaQotCW1vdgklZHMsJWVkaQotCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJWRzOigsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVkczooLCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVieCwxKQotCW1vdgklZHMsJWRzOiglZXNwLDEpCi0JbW92CSVkcywlZHM6KCwxKQotCW1vdgklZHMsJWRzOiglZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVicCwxKQotCW1vdgklZHMsJWRzOigsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVkczooLCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVheCwyKQotCW1vdgklZHMsJWRzOigsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVkczooLCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYngsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVieCwyKQotCW1vdgklZHMsJWRzOigsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYngsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsMikKLQltb3YJJWRzLCVkczooJWVzcCwyKQotCW1vdgklZHMsJWRzOigsMikKLQltb3YJJWRzLCVkczooJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVkczooLCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVheCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlZGksMikKLQltb3YJJWRzLCVkczooJWVieCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJWRzOigsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlZGksMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVkczooLCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJWRzOigsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVkczooLCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsNCkKLQltb3YJJWRzLCVkczooLDQpCi0JbW92CSVkcywlZHM6KCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVheCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVieCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJWRzOigsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVkczooLCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJWRzOigsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVkczooLCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVieCw4KQotCW1vdgklZHMsJWRzOiglZXNwLDgpCi0JbW92CSVkcywlZHM6KCw4KQotCW1vdgklZHMsJWRzOiglZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVicCw4KQotCW1vdgklZHMsJWRzOigsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVkczooLCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsMikKLQltb3YJJWRzLCVkczooJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoLDEpCi0JbW92CSVkcywlZHM6MHgxMigsMikKLQltb3YJJWRzLCVkczoweDEyKCw0KQotCW1vdgklZHMsJWRzOjB4MTIoLDgpCi0KLQkjIEZvcmNlIGEgZ29vZCBhbGlnbm1lbnQuCi0JLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L25ha2VkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L25ha2VkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNmUzMDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9uYWtlZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotI29iamR1bXA6IC1kcncKLSNuYW1lOiBpMzg2IG5ha2VkIHJlZwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qaTM4Ni4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJNjYgMjYgZmYgMjMgWyAJXSpqbXB3ICAgXColZXM6XCglZWJ4XCkKLSAgIDQ6CThhIDI1IDUwIDAwIDAwIDAwIFsgCV0qbW92ICAgIDB4NTAsJWFoCi0gICBhOgliMiAyMCBbIAldKm1vdiAgICBcJDB4MjAsJWRsCi0gICBjOgliYiAwMCAwMCAwMCAwMCBbIAldKm1vdiAgICBcJDB4MCwlZWJ4CWQ6IChSXzM4Nl8pPyhkaXIpPzMyCS50ZXh0Ci0gIDExOglkOSBjOSBbIAldKmZ4Y2ggICAlc3RcKDFcKQotICAxMzoJMzYgOGMgYTQgODEgZDIgMDQgMDAgMDAgWyAJXSptb3ZsICAgJWZzLCVzczoweDRkMlwoJWVjeCwlZWF4LDRcKQotICAxYjoJOGMgMmMgZWQgMDAgMDAgMDAgMDAgWyAJXSptb3ZsICAgJWdzLDB4MFwoLCVlYnAsOFwpCi0gIDIyOgkyNiA4OCAyNSAwMCAwMCAwMCAwMCBbIAldKm1vdiAgICAlYWgsJWVzOjB4MAotICAyOToJMmUgOGIgNzQgMTQgODAgWyAJXSptb3YgICAgJWNzOjB4ZmZmZmZmODBcKCVlc3AsJWVkeCwxXCksJWVzaQotICAyZToJZjMgNjUgYTUgWyAJXSpyZXB6IG1vdnNsICVnczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSAgMzE6CWVjIFsgCV0qaW4gICAgIFwoJWR4XCksJWFsCi0gIDMyOgk2NiBlZiBbIAldKm91dCAgICAlYXgsXCglZHhcKQotICAzNDoJNjcgZDIgMTQgWyAJXSphZGRyMTYgcmNsYiAlY2wsXCglc2lcKQotICAzNzoJMGYgMjAgZDAgWyAJXSptb3YgICAgJWNyMiwlZWF4Ci0gIDNhOgkwZiA3MiBkMCAwNCBbIAldKnBzcmxkICBcJDB4NCwlbW0wCi0gIDNlOgk2NiA0NyBbIAldKmluYyAgICAlZGkKLSAgNDA6CTY2IDUxIFsgCV0qcHVzaCAgICVjeAotICA0MjoJNjYgNTggWyAJXSpwb3AgICAgJWF4Ci0gIDQ0Ogk2NiA4NyBkZCBbIAldKnhjaGcgICAlYngsJWJwCi0gIDQ3Ogk2YSAwMiBbIAldKnB1c2ggICBcJDB4MgotICA0OToJMDAgMDAgWyAJXSphZGQgICAgJWFsLFwoJWVheFwpCi0gIDRiOgkwMCAwMCBbIAldKmFkZCAgICAlYWwsXCglZWF4XCkKLSAgNGQ6CTAwIDAwIFsgCV0qYWRkICAgICVhbCxcKCVlYXhcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9uYWtlZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9uYWtlZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJjYzRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbmFrZWQucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS5hdHRfc3ludGF4IG5vcHJlZml4Ci0KLWZvbzoJam1wdyBlczoqKGVieCkKLQltb3YgKDB4OCoweGEpLGFoCi0JbW92ICQoOCo0KSxkbAotCW1vdiAkZm9vLGVieAotCWZ4Y2ggc3QoMSkKLQltb3YgZnMsc3M6MTIzNChlY3gsZWF4LDQpCi0JbW92IGdzLGRzOigsZWJwLDgpCi0JbW92IGFoLGVzOjAKLQltb3YgY3M6LTEyOChlc3AsZWR4KSxlc2kKLQlyZXAgbW92c2wgZ3M6KGVzaSksZXM6KGVkaSkKLQlpbiBkeCxhbAotCW91dHcgKGR4KQotIGFkZHIxNiByY2xiIGNsLChzaSkKLQltb3YgY3IyLGVheAotCXBzcmxkICQ0LG1tMAotCWluYyBkaQotCXB1c2ggY3gKLQlwb3AgYXgKLQl4Y2hnIGJ4LGJwCi0JcHVzaGwgJDIKLQotIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmNDlkNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5kCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLSNhczogLUoKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IG9wY29kZQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJMDAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICAgNjoJMDEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgIGM6CTAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgMTI6CTAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDE4OgkwNCA5MCBbIAldKmFkZCAgICBcJDB4OTAsJWFsCi0gIDFhOgkwNSA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICBcJDB4OTA5MDkwOTAsJWVheAotICAxZjoJMDYgWyAJXSpwdXNoICAgJWVzCi0gIDIwOgkwNyBbIAldKnBvcCAgICAlZXMKLSAgMjE6CTA4IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgMjc6CTA5IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDJkOgkwYSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDMzOgkwYiA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICAzOToJMGMgOTAgWyAJXSpvciAgICAgXCQweDkwLCVhbAotICAzYjoJMGQgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgNDA6CTBlIFsgCV0qcHVzaCAgICVjcwotICA0MToJMTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICA0NzoJMTEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNGQ6CTEyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgNTM6CTEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDU5OgkxNCA5MCBbIAldKmFkYyAgICBcJDB4OTAsJWFsCi0gIDViOgkxNSA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICBcJDB4OTA5MDkwOTAsJWVheAotICA2MDoJMTYgWyAJXSpwdXNoICAgJXNzCi0gIDYxOgkxNyBbIAldKnBvcCAgICAlc3MKLSAgNjI6CTE4IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNjg6CTE5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDZlOgkxYSA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDc0OgkxYiA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICA3YToJMWMgOTAgWyAJXSpzYmIgICAgXCQweDkwLCVhbAotICA3YzoJMWQgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgODE6CTFlIFsgCV0qcHVzaCAgICVkcwotICA4MjoJMWYgWyAJXSpwb3AgICAgJWRzCi0gIDgzOgkyMCA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDg5OgkyMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICA4ZjoJMjIgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICA5NToJMjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgOWI6CTI0IDkwIFsgCV0qYW5kICAgIFwkMHg5MCwlYWwKLSAgOWQ6CTI1IDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIGEyOgkyNyBbIAldKmRhYSAgICAKLSAgYTM6CTI4IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgYTk6CTI5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGFmOgkyYSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIGI1OgkyYiA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICBiYjoJMmMgOTAgWyAJXSpzdWIgICAgXCQweDkwLCVhbAotICBiZDoJMmQgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgYzI6CTJmIFsgCV0qZGFzICAgIAotICBjMzoJMzAgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICBjOToJMzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgY2Y6CTMyIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgZDU6CTMzIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIGRiOgkzNCA5MCBbIAldKnhvciAgICBcJDB4OTAsJWFsCi0gIGRkOgkzNSA5MCA5MCA5MCA5MCBbIAldKnhvciAgICBcJDB4OTA5MDkwOTAsJWVheAotICBlMjoJMzcgWyAJXSphYWEgICAgCi0gIGUzOgkzOCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGU5OgkzOSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICBlZjoJM2EgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICBmNToJM2IgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgZmI6CTNjIDkwIFsgCV0qY21wICAgIFwkMHg5MCwlYWwKLSAgZmQ6CTNkIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gMTAyOgkzZiBbIAldKmFhcyAgICAKLSAxMDM6CTQwIFsgCV0qaW5jICAgICVlYXgKLSAxMDQ6CTQxIFsgCV0qaW5jICAgICVlY3gKLSAxMDU6CTQyIFsgCV0qaW5jICAgICVlZHgKLSAxMDY6CTQzIFsgCV0qaW5jICAgICVlYngKLSAxMDc6CTQ0IFsgCV0qaW5jICAgICVlc3AKLSAxMDg6CTQ1IFsgCV0qaW5jICAgICVlYnAKLSAxMDk6CTQ2IFsgCV0qaW5jICAgICVlc2kKLSAxMGE6CTQ3IFsgCV0qaW5jICAgICVlZGkKLSAxMGI6CTQ4IFsgCV0qZGVjICAgICVlYXgKLSAxMGM6CTQ5IFsgCV0qZGVjICAgICVlY3gKLSAxMGQ6CTRhIFsgCV0qZGVjICAgICVlZHgKLSAxMGU6CTRiIFsgCV0qZGVjICAgICVlYngKLSAxMGY6CTRjIFsgCV0qZGVjICAgICVlc3AKLSAxMTA6CTRkIFsgCV0qZGVjICAgICVlYnAKLSAxMTE6CTRlIFsgCV0qZGVjICAgICVlc2kKLSAxMTI6CTRmIFsgCV0qZGVjICAgICVlZGkKLSAxMTM6CTUwIFsgCV0qcHVzaCAgICVlYXgKLSAxMTQ6CTUxIFsgCV0qcHVzaCAgICVlY3gKLSAxMTU6CTUyIFsgCV0qcHVzaCAgICVlZHgKLSAxMTY6CTUzIFsgCV0qcHVzaCAgICVlYngKLSAxMTc6CTU0IFsgCV0qcHVzaCAgICVlc3AKLSAxMTg6CTU1IFsgCV0qcHVzaCAgICVlYnAKLSAxMTk6CTU2IFsgCV0qcHVzaCAgICVlc2kKLSAxMWE6CTU3IFsgCV0qcHVzaCAgICVlZGkKLSAxMWI6CTU4IFsgCV0qcG9wICAgICVlYXgKLSAxMWM6CTU5IFsgCV0qcG9wICAgICVlY3gKLSAxMWQ6CTVhIFsgCV0qcG9wICAgICVlZHgKLSAxMWU6CTViIFsgCV0qcG9wICAgICVlYngKLSAxMWY6CTVjIFsgCV0qcG9wICAgICVlc3AKLSAxMjA6CTVkIFsgCV0qcG9wICAgICVlYnAKLSAxMjE6CTVlIFsgCV0qcG9wICAgICVlc2kKLSAxMjI6CTVmIFsgCV0qcG9wICAgICVlZGkKLSAxMjM6CTYwIFsgCV0qcHVzaGEgIAotIDEyNDoJNjEgWyAJXSpwb3BhICAgCi0gMTI1Ogk2MiA5MCA5MCA5MCA5MCA5MCBbIAldKmJvdW5kICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDEyYjoJNjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphcnBsICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDEzMToJNjggOTAgOTAgOTAgOTAgWyAJXSpwdXNoICAgXCQweDkwOTA5MDkwCi0gMTM2Ogk2OSA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxNDA6CTZhIDkwIFsgCV0qcHVzaCAgIFwkMHhmZmZmZmY5MAotIDE0MjoJNmIgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMTQ5Ogk2YyBbIAldKmluc2IgICBcKCVkeFwpLCVlczpcKCVlZGlcKQotIDE0YToJNmQgWyAJXSppbnNsICAgXCglZHhcKSwlZXM6XCglZWRpXCkKLSAxNGI6CTZlIFsgCV0qb3V0c2IgICVkczpcKCVlc2lcKSxcKCVkeFwpCi0gMTRjOgk2ZiBbIAldKm91dHNsICAlZHM6XCglZXNpXCksXCglZHhcKQotIDE0ZDoJNzAgOTAgWyAJXSpqbyAgICAgKDB4KT9kZi4qCi0gMTRmOgk3MSA5MCBbIAldKmpubyAgICAoMHgpP2UxLioKLSAxNTE6CTcyIDkwIFsgCV0qamIgICAgICgweCk/ZTMuKgotIDE1MzoJNzMgOTAgWyAJXSpqYWUgICAgKDB4KT9lNS4qCi0gMTU1Ogk3NCA5MCBbIAldKmplICAgICAoMHgpP2U3LioKLSAxNTc6CTc1IDkwIFsgCV0qam5lICAgICgweCk/ZTkuKgotIDE1OToJNzYgOTAgWyAJXSpqYmUgICAgKDB4KT9lYi4qCi0gMTViOgk3NyA5MCBbIAldKmphICAgICAoMHgpP2VkLioKLSAxNWQ6CTc4IDkwIFsgCV0qanMgICAgICgweCk/ZWYuKgotIDE1ZjoJNzkgOTAgWyAJXSpqbnMgICAgKDB4KT9mMS4qCi0gMTYxOgk3YSA5MCBbIAldKmpwICAgICAoMHgpP2YzLioKLSAxNjM6CTdiIDkwIFsgCV0qam5wICAgICgweCk/ZjUuKgotIDE2NToJN2MgOTAgWyAJXSpqbCAgICAgKDB4KT9mNy4qCi0gMTY3Ogk3ZCA5MCBbIAldKmpnZSAgICAoMHgpP2Y5LioKLSAxNjk6CTdlIDkwIFsgCV0qamxlICAgICgweCk/ZmIuKgotIDE2YjoJN2YgOTAgWyAJXSpqZyAgICAgKDB4KT9mZC4qCi0gMTZkOgk4MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2IgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTc0Ogk4MSA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2wgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTdlOgk4MyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2wgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTg1Ogk4NCA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gMThiOgk4NSA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDE5MToJODYgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE5NzoJODcgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxOWQ6CTg4IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAxYTM6CTg5IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMWE5Ogk4YSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gMWFmOgk4YiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDFiNToJOGMgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZsICAgJXNzLDB4OTA5MDkwOTBcKCVlYXhcKQotIDFiYjoJOGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZWEgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxYzE6CThlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlc3MKLSAxYzc6CThmIDgwIDkwIDkwIDkwIDkwIFsgCV0qcG9wbCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDFjZDoJOTAgWyAJXSpub3AgICAgCi0gMWNlOgk5MSBbIAldKnhjaGcgICAlZWF4LCVlY3gKLSAxY2Y6CTkyIFsgCV0qeGNoZyAgICVlYXgsJWVkeAotIDFkMDoJOTMgWyAJXSp4Y2hnICAgJWVheCwlZWJ4Ci0gMWQxOgk5NCBbIAldKnhjaGcgICAlZWF4LCVlc3AKLSAxZDI6CTk1IFsgCV0qeGNoZyAgICVlYXgsJWVicAotIDFkMzoJOTYgWyAJXSp4Y2hnICAgJWVheCwlZXNpCi0gMWQ0Ogk5NyBbIAldKnhjaGcgICAlZWF4LCVlZGkKLSAxZDU6CTk4IFsgCV0qY3d0bCAgIAotIDFkNjoJOTkgWyAJXSpjbHRkICAgCi0gMWQ3Ogk5YSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmxjYWxsICBcJDB4OTA5MCxcJDB4OTA5MDkwOTAKLSAxZGU6CTliIFsgCV0qZndhaXQKLSAxZGY6CTljIFsgCV0qcHVzaGYgIAotIDFlMDoJOWQgWyAJXSpwb3BmICAgCi0gMWUxOgk5ZSBbIAldKnNhaGYgICAKLSAxZTI6CTlmIFsgCV0qbGFoZiAgIAotIDFlMzoJYTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MCwlYWwKLSAxZTg6CWExIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTAsJWVheAotIDFlZDoJYTIgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWFsLDB4OTA5MDkwOTAKLSAxZjI6CWEzIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVlYXgsMHg5MDkwOTA5MAotIDFmNzoJYTQgWyAJXSptb3ZzYiAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQotIDFmODoJYTUgWyAJXSptb3ZzbCAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQotIDFmOToJYTYgWyAJXSpjbXBzYiAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQotIDFmYToJYTcgWyAJXSpjbXBzbCAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQotIDFmYjoJYTggOTAgWyAJXSp0ZXN0ICAgXCQweDkwLCVhbAotIDFmZDoJYTkgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgXCQweDkwOTA5MDkwLCVlYXgKLSAyMDI6CWFhIFsgCV0qc3RvcyAgICVhbCwlZXM6XCglZWRpXCkKLSAyMDM6CWFiIFsgCV0qc3RvcyAgICVlYXgsJWVzOlwoJWVkaVwpCi0gMjA0OglhYyBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWFsCi0gMjA1OglhZCBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWVheAotIDIwNjoJYWUgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVhbAotIDIwNzoJYWYgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVlYXgKLSAyMDg6CWIwIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYWwKLSAyMGE6CWIxIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlY2wKLSAyMGM6CWIyIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlZGwKLSAyMGU6CWIzIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYmwKLSAyMTA6CWI0IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYWgKLSAyMTI6CWI1IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlY2gKLSAyMTQ6CWI2IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlZGgKLSAyMTY6CWI3IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYmgKLSAyMTg6CWI4IDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gMjFkOgliOSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVjeAotIDIyMjoJYmEgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlZHgKLSAyMjc6CWJiIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWJ4Ci0gMjJjOgliYyA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVzcAotIDIzMToJYmQgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlYnAKLSAyMzY6CWJlIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZXNpCi0gMjNiOgliZiA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVkaQotIDI0MDoJYzAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI0NzoJYzEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI0ZToJYzIgOTAgOTAgWyAJXSpyZXQgICAgXCQweDkwOTAKLSAyNTE6CWMzIFsgCV0qcmV0ICAgIAotIDI1MjoJYzQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZXMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAyNTg6CWM1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGRzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMjVlOgljNiA4MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmIgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjY1OgljNyA4MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmwgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gMjZmOgljOCA5MCA5MCA5MCBbIAldKmVudGVyICBcJDB4OTA5MCxcJDB4OTAKLSAyNzM6CWM5IFsgCV0qbGVhdmUgIAotIDI3NDoJY2EgOTAgOTAgWyAJXSpscmV0ICAgXCQweDkwOTAKLSAyNzc6CWNiIFsgCV0qbHJldCAgIAotIDI3ODoJY2MgWyAJXSppbnQzICAgCi0gMjc5OgljZCA5MCBbIAldKmludCAgICBcJDB4OTAKLSAyN2I6CWNlIFsgCV0qaW50byAgIAotIDI3YzoJY2YgWyAJXSppcmV0ICAgCi0gMjdkOglkMCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGIgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyODM6CWQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsbCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDI4OToJZDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI4ZjoJZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI5NToJZDQgOTAgWyAJXSphYW0gICAgXCQweGZmZmZmZjkwCi0gMjk3OglkNSA5MCBbIAldKmFhZCAgICBcJDB4ZmZmZmZmOTAKLSAyOTk6CWQ3IFsgCV0qeGxhdCAgICVkczpcKCVlYnhcKQotIDI5YToJZDggOTAgOTAgOTAgOTAgOTAgWyAJXSpmY29tcyAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmEwOglkOSA5MCA5MCA5MCA5MCA5MCBbIAldKmZzdHMgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYTY6CWRhIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmljb21sIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJhYzoJZGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaXN0bCAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmIyOglkYyA5MCA5MCA5MCA5MCA5MCBbIAldKmZjb21sICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYjg6CWRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qZnN0bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJiZToJZGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaWNvbSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmM0OglkZiA5MCA5MCA5MCA5MCA5MCBbIAldKmZpc3QgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyY2E6CWUwIDkwIFsgCV0qbG9vcG5lICgweCk/MjVjLioKLSAyY2M6CWUxIDkwIFsgCV0qbG9vcGUgICgweCk/MjVlLioKLSAyY2U6CWUyIDkwIFsgCV0qbG9vcCAgICgweCk/MjYwLioKLSAyZDA6CWUzIDkwIFsgCV0qamVjeHogICgweCk/MjYyLioKLSAyZDI6CWU0IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlYWwKLSAyZDQ6CWU1IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlZWF4Ci0gMmQ2OgllNiA5MCBbIAldKm91dCAgICAlYWwsXCQweDkwCi0gMmQ4OgllNyA5MCBbIAldKm91dCAgICAlZWF4LFwkMHg5MAotIDJkYToJZTggOTAgOTAgOTAgOTAgWyAJXSpjYWxsICAgKDB4KT85MDkwOTM2Zi4qCi0gMmRmOgllOSA5MCA5MCA5MCA5MCBbIAldKmptcCAgICAoMHgpPzkwOTA5Mzc0LioKLSAyZTQ6CWVhIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGptcCAgIFwkMHg5MDkwLFwkMHg5MDkwOTA5MAotIDJlYjoJZWIgOTAgWyAJXSpqbXAgICAgKDB4KT8yN2QuKgotIDJlZDoJZWMgWyAJXSppbiAgICAgXCglZHhcKSwlYWwKLSAyZWU6CWVkIFsgCV0qaW4gICAgIFwoJWR4XCksJWVheAotIDJlZjoJZWUgWyAJXSpvdXQgICAgJWFsLFwoJWR4XCkKLSAyZjA6CWVmIFsgCV0qb3V0ICAgICVlYXgsXCglZHhcKQotIDJmMToJZjQgWyAJXSpobHQgICAgCi0gMmYyOglmNSBbIAldKmNtYyAgICAKLSAyZjM6CWY2IDkwIDkwIDkwIDkwIDkwIFsgCV0qbm90YiAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJmOToJZjcgOTAgOTAgOTAgOTAgOTAgWyAJXSpub3RsICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmZmOglmOCBbIAldKmNsYyAgICAKLSAzMDA6CWY5IFsgCV0qc3RjICAgIAotIDMwMToJZmEgWyAJXSpjbGkgICAgCi0gMzAyOglmYiBbIAldKnN0aSAgICAKLSAzMDM6CWZjIFsgCV0qY2xkICAgIAotIDMwNDoJZmQgWyAJXSpzdGQgICAgCi0gMzA1OglmZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNhbGwgICBcKjB4OTA5MDkwOTBcKCVlYXhcKQotIDMwYjoJMGYgMDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpsbGR0ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMzEyOgkwZiAwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmxnZHQgICAweDkwOTA5MDkwXCglZWF4XCkKLSAzMTk6CTBmIDAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGFyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzIwOgkwZiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmxzbCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDMyNzoJMGYgMDYgWyAJXSpjbHRzICAgCi0gMzI5OgkwZiAwOCBbIAldKmludmQgICAKLSAzMmI6CTBmIDA5IFsgCV0qd2JpbnZkIAotIDMyZDoJMGYgMGIgWyAJXSp1ZDJhICAgCi0gMzJmOgkwZiAyMCBkMCBbIAldKm1vdiAgICAlY3IyLCVlYXgKLSAzMzI6CTBmIDIxIGQwIFsgCV0qbW92ICAgICVkYjIsJWVheAotIDMzNToJMGYgMjIgZDAgWyAJXSptb3YgICAgJWVheCwlY3IyCi0gMzM4OgkwZiAyMyBkMCBbIAldKm1vdiAgICAlZWF4LCVkYjIKLSAzM2I6CTBmIDI0IGQwIFsgCV0qbW92ICAgICV0cjIsJWVheAotIDMzZToJMGYgMjYgZDAgWyAJXSptb3YgICAgJWVheCwldHIyCi0gMzQxOgkwZiAzMCBbIAldKndybXNyICAKLSAzNDM6CTBmIDMxIFsgCV0qcmR0c2MgIAotIDM0NToJMGYgMzIgWyAJXSpyZG1zciAgCi0gMzQ3OgkwZiAzMyBbIAldKnJkcG1jICAKLSAzNDk6CTBmIDQwIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm8gIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzUwOgkwZiA0MSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZubyAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM1NzoJMGYgNDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YiAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNWU6CTBmIDQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmFlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzY1OgkwZiA0NCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZlICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM2YzoJMGYgNDUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bmUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNzM6CTBmIDQ2IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmJlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzdhOgkwZiA0NyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM4MToJMGYgNDggOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cyAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzODg6CTBmIDQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5zIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzhmOgkwZiA0YSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZwICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM5NjoJMGYgNGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzOWQ6CTBmIDRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmwgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2E0OgkwZiA0ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDNhYjoJMGYgNGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bGUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzYjI6CTBmIDRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2I5OgkwZiA2MCA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2xidyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNjMDoJMGYgNjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tsd2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzYzc6CTBmIDYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNrbGRxIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2NlOgkwZiA2MyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2tzc3diIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2Q1OgkwZiA2NCA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBndGIgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZGM6CTBmIDY1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGd0dyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNlMzoJMGYgNjYgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZ3RkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2VhOgkwZiA2NyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2t1c3diIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2YxOgkwZiA2OCA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2hidyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNmODoJMGYgNjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tod2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZmY6CTBmIDZhIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNraGRxIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDA2OgkwZiA2YiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2tzc2R3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDBkOgkwZiA2ZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmQgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQxNDoJMGYgNmYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZxICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MWI6CTBmIDcxIGQwIDkwIFsgCV0qcHNybHcgIFwkMHg5MCwlbW0wCi0gNDFmOgkwZiA3MiBkMCA5MCBbIAldKnBzcmxkICBcJDB4OTAsJW1tMAotIDQyMzoJMGYgNzMgZDAgOTAgWyAJXSpwc3JscSAgXCQweDkwLCVtbTAKLSA0Mjc6CTBmIDc0IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGVxYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQyZToJMGYgNzUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZXF3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDM1OgkwZiA3NiA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBlcWQgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0M2M6CTBmIDc3IFsgCV0qZW1tcyAgIAotIDQzZToJMGYgN2UgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZkICAgJW1tMiwweDkwOTA5MDkwXCglZWF4XCkKLSA0NDU6CTBmIDdmIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92cSAgICVtbTIsMHg5MDkwOTA5MFwoJWVheFwpCi0gNDRjOgkwZiA4MCA5MCA5MCA5MCA5MCBbIAldKmpvICAgICAoMHgpPzkwOTA5NGUyLioKLSA0NTI6CTBmIDgxIDkwIDkwIDkwIDkwIFsgCV0qam5vICAgICgweCk/OTA5MDk0ZTguKgotIDQ1ODoJMGYgODIgOTAgOTAgOTAgOTAgWyAJXSpqYiAgICAgKDB4KT85MDkwOTRlZS4qCi0gNDVlOgkwZiA4MyA5MCA5MCA5MCA5MCBbIAldKmphZSAgICAoMHgpPzkwOTA5NGY0LioKLSA0NjQ6CTBmIDg0IDkwIDkwIDkwIDkwIFsgCV0qamUgICAgICgweCk/OTA5MDk0ZmEuKgotIDQ2YToJMGYgODUgOTAgOTAgOTAgOTAgWyAJXSpqbmUgICAgKDB4KT85MDkwOTUwMC4qCi0gNDcwOgkwZiA4NiA5MCA5MCA5MCA5MCBbIAldKmpiZSAgICAoMHgpPzkwOTA5NTA2LioKLSA0NzY6CTBmIDg3IDkwIDkwIDkwIDkwIFsgCV0qamEgICAgICgweCk/OTA5MDk1MGMuKgotIDQ3YzoJMGYgODggOTAgOTAgOTAgOTAgWyAJXSpqcyAgICAgKDB4KT85MDkwOTUxMi4qCi0gNDgyOgkwZiA4OSA5MCA5MCA5MCA5MCBbIAldKmpucyAgICAoMHgpPzkwOTA5NTE4LioKLSA0ODg6CTBmIDhhIDkwIDkwIDkwIDkwIFsgCV0qanAgICAgICgweCk/OTA5MDk1MWUuKgotIDQ4ZToJMGYgOGIgOTAgOTAgOTAgOTAgWyAJXSpqbnAgICAgKDB4KT85MDkwOTUyNC4qCi0gNDk0OgkwZiA4YyA5MCA5MCA5MCA5MCBbIAldKmpsICAgICAoMHgpPzkwOTA5NTJhLioKLSA0OWE6CTBmIDhkIDkwIDkwIDkwIDkwIFsgCV0qamdlICAgICgweCk/OTA5MDk1MzAuKgotIDRhMDoJMGYgOGUgOTAgOTAgOTAgOTAgWyAJXSpqbGUgICAgKDB4KT85MDkwOTUzNi4qCi0gNGE2OgkwZiA4ZiA5MCA5MCA5MCA5MCBbIAldKmpnICAgICAoMHgpPzkwOTA5NTNjLioKLSA0YWM6CTBmIDkwIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0byAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRiMzoJMGYgOTEgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRubyAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGJhOgkwZiA5MiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGIgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0YzE6CTBmIDkzIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YWUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRjODoJMGYgOTQgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRlICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGNmOgkwZiA5NSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5lICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZDY6CTBmIDk2IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YmUgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRkZDoJMGYgOTcgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRhICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGU0OgkwZiA5OCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldHMgICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZWI6CTBmIDk5IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bnMgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRmMjoJMGYgOWEgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRwICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGY5OgkwZiA5YiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5wICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MDA6CTBmIDljIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUwNzoJMGYgOWQgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRnZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTBlOgkwZiA5ZSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGxlICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MTU6CTBmIDlmIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0ZyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUxYzoJMGYgYTAgWyAJXSpwdXNoICAgJWZzCi0gNTFlOgkwZiBhMSBbIAldKnBvcCAgICAlZnMKLSA1MjA6CTBmIGEyIFsgCV0qY3B1aWQgIAotIDUyMjoJMGYgYTMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidCAgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Mjk6CTBmIGE0IDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgIFwkMHg5MCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDUzMToJMGYgYTUgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgJWNsLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTM4OgkwZiBhOCBbIAldKnB1c2ggICAlZ3MKLSA1M2E6CTBmIGE5IFsgCV0qcG9wICAgICVncwotIDUzYzoJMGYgYWEgWyAJXSpyc20gICAgCi0gNTNlOgkwZiBhYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0cyAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU0NToJMGYgYWMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgXCQweDkwLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTRkOgkwZiBhZCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICAlY2wsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1NTQ6CTBmIGFmIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTViOgkwZiBiMCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcHhjaGcgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDU2MjoJMGYgYjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXB4Y2hnICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTY5OgkwZiBiMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxzcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU3MDoJMGYgYjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHIgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1Nzc6CTBmIGI0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGZzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTdlOgkwZiBiNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxncyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU4NToJMGYgYjYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z6YmwgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1OGM6CTBmIGI3IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92endsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNTkzOgkwZiBiOSBbIAldKnVkMmIgICAKLSA1OTU6CTBmIGJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRjICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTljOgkwZiBiYyA5MCA5MCA5MCA5MCA5MCBbIAldKmJzZiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDVhMzoJMGYgYmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpic3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1YWE6CTBmIGJlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92c2JsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNWIxOgkwZiBiZiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnN3bCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDViODoJMGYgYzAgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDViZjoJMGYgYzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1YzY6CTBmIGM4IFsgCV0qYnN3YXAgICVlYXgKLSA1Yzg6CTBmIGM5IFsgCV0qYnN3YXAgICVlY3gKLSA1Y2E6CTBmIGNhIFsgCV0qYnN3YXAgICVlZHgKLSA1Y2M6CTBmIGNiIFsgCV0qYnN3YXAgICVlYngKLSA1Y2U6CTBmIGNjIFsgCV0qYnN3YXAgICVlc3AKLSA1ZDA6CTBmIGNkIFsgCV0qYnN3YXAgICVlYnAKLSA1ZDI6CTBmIGNlIFsgCV0qYnN3YXAgICVlc2kKLSA1ZDQ6CTBmIGNmIFsgCV0qYnN3YXAgICVlZGkKLSA1ZDY6CTBmIGQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNybHcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWRkOgkwZiBkMiA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmxkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVlNDoJMGYgZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JscSAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1ZWI6CTBmIGQ1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcG11bGx3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWYyOgkwZiBkOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJ1c2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1Zjk6CTBmIGQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnVzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYwMDoJMGYgZGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYW5kICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MDc6CTBmIGRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHVzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYwZToJMGYgZGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdXN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjE1OgkwZiBkZiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhbmRuICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYxYzoJMGYgZTEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JhdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MjM6CTBmIGUyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNyYWQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjJhOgkwZiBlNSA5MCA5MCA5MCA5MCA5MCBbIAldKnBtdWxodyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYzMToJMGYgZTggOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3Vic2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2Mzg6CTBmIGU5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjNmOgkwZiBlYiA5MCA5MCA5MCA5MCA5MCBbIAldKnBvciAgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY0NjoJMGYgZWMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkc2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NGQ6CTBmIGVkIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjU0OgkwZiBlZiA5MCA5MCA5MCA5MCA5MCBbIAldKnB4b3IgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY1YjoJMGYgZjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc2xsdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NjI6CTBmIGYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNsbGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjY5OgkwZiBmMyA5MCA5MCA5MCA5MCA5MCBbIAldKnBzbGxxICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY3MDoJMGYgZjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwbWFkZHdkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjc3OgkwZiBmOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJiICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY3ZToJMGYgZjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3VidyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2ODU6CTBmIGZhIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YmQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjhjOgkwZiBmYyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRiICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY5MzoJMGYgZmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2OWE6CTBmIGZlIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNmExOgk2NiAwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmE4Ogk2NiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmFmOgk2NiAwNSA5MCA5MCBbIAldKmFkZCAgICBcJDB4OTA5MCwlYXgKLSA2YjM6CTY2IDA2IFsgCV0qcHVzaHcgICVlcwotIDZiNToJNjYgMDcgWyAJXSpwb3B3ICAgJWVzCi0gNmI3Ogk2NiAwOSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNmJlOgk2NiAwYiA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNmM1Ogk2NiAwZCA5MCA5MCBbIAldKm9yICAgICBcJDB4OTA5MCwlYXgKLSA2Yzk6CTY2IDBlIFsgCV0qcHVzaHcgICVjcwotIDZjYjoJNjYgMTEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZkMjoJNjYgMTMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZkOToJNjYgMTUgOTAgOTAgWyAJXSphZGMgICAgXCQweDkwOTAsJWF4Ci0gNmRkOgk2NiAxNiBbIAldKnB1c2h3ICAlc3MKLSA2ZGY6CTY2IDE3IFsgCV0qcG9wdyAgICVzcwotIDZlMToJNjYgMTkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZlODoJNjYgMWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZlZjoJNjYgMWQgOTAgOTAgWyAJXSpzYmIgICAgXCQweDkwOTAsJWF4Ci0gNmYzOgk2NiAxZSBbIAldKnB1c2h3ICAlZHMKLSA2ZjU6CTY2IDFmIFsgCV0qcG9wdyAgICVkcwotIDZmNzoJNjYgMjEgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZmZToJNjYgMjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDcwNToJNjYgMjUgOTAgOTAgWyAJXSphbmQgICAgXCQweDkwOTAsJWF4Ci0gNzA5Ogk2NiAyOSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNzEwOgk2NiAyYiA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzE3Ogk2NiAyZCA5MCA5MCBbIAldKnN1YiAgICBcJDB4OTA5MCwlYXgKLSA3MWI6CTY2IDMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3MjI6CTY2IDMzIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3Mjk6CTY2IDM1IDkwIDkwIFsgCV0qeG9yICAgIFwkMHg5MDkwLCVheAotIDcyZDoJNjYgMzkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDczNDoJNjYgM2IgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDczYjoJNjYgM2QgOTAgOTAgWyAJXSpjbXAgICAgXCQweDkwOTAsJWF4Ci0gNzNmOgk2NiA0MCBbIAldKmluYyAgICAlYXgKLSA3NDE6CTY2IDQxIFsgCV0qaW5jICAgICVjeAotIDc0MzoJNjYgNDIgWyAJXSppbmMgICAgJWR4Ci0gNzQ1Ogk2NiA0MyBbIAldKmluYyAgICAlYngKLSA3NDc6CTY2IDQ0IFsgCV0qaW5jICAgICVzcAotIDc0OToJNjYgNDUgWyAJXSppbmMgICAgJWJwCi0gNzRiOgk2NiA0NiBbIAldKmluYyAgICAlc2kKLSA3NGQ6CTY2IDQ3IFsgCV0qaW5jICAgICVkaQotIDc0ZjoJNjYgNDggWyAJXSpkZWMgICAgJWF4Ci0gNzUxOgk2NiA0OSBbIAldKmRlYyAgICAlY3gKLSA3NTM6CTY2IDRhIFsgCV0qZGVjICAgICVkeAotIDc1NToJNjYgNGIgWyAJXSpkZWMgICAgJWJ4Ci0gNzU3Ogk2NiA0YyBbIAldKmRlYyAgICAlc3AKLSA3NTk6CTY2IDRkIFsgCV0qZGVjICAgICVicAotIDc1YjoJNjYgNGUgWyAJXSpkZWMgICAgJXNpCi0gNzVkOgk2NiA0ZiBbIAldKmRlYyAgICAlZGkKLSA3NWY6CTY2IDUwIFsgCV0qcHVzaCAgICVheAotIDc2MToJNjYgNTEgWyAJXSpwdXNoICAgJWN4Ci0gNzYzOgk2NiA1MiBbIAldKnB1c2ggICAlZHgKLSA3NjU6CTY2IDUzIFsgCV0qcHVzaCAgICVieAotIDc2NzoJNjYgNTQgWyAJXSpwdXNoICAgJXNwCi0gNzY5Ogk2NiA1NSBbIAldKnB1c2ggICAlYnAKLSA3NmI6CTY2IDU2IFsgCV0qcHVzaCAgICVzaQotIDc2ZDoJNjYgNTcgWyAJXSpwdXNoICAgJWRpCi0gNzZmOgk2NiA1OCBbIAldKnBvcCAgICAlYXgKLSA3NzE6CTY2IDU5IFsgCV0qcG9wICAgICVjeAotIDc3MzoJNjYgNWEgWyAJXSpwb3AgICAgJWR4Ci0gNzc1Ogk2NiA1YiBbIAldKnBvcCAgICAlYngKLSA3Nzc6CTY2IDVjIFsgCV0qcG9wICAgICVzcAotIDc3OToJNjYgNWQgWyAJXSpwb3AgICAgJWJwCi0gNzdiOgk2NiA1ZSBbIAldKnBvcCAgICAlc2kKLSA3N2Q6CTY2IDVmIFsgCV0qcG9wICAgICVkaQotIDc3ZjoJNjYgNjAgWyAJXSpwdXNoYXcgCi0gNzgxOgk2NiA2MSBbIAldKnBvcGF3ICAKLSA3ODM6CTY2IDYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYm91bmQgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3OGE6CTY2IDY4IDkwIDkwIFsgCV0qcHVzaHcgIFwkMHg5MDkwCi0gNzhlOgk2NiA2OSA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4OTA5MCwweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzk3Ogk2NiA2YSA5MCBbIAldKnB1c2h3ICBcJDB4ZmZmZmZmOTAKLSA3OWE6CTY2IDZiIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gN2EyOgk2NiA2ZCBbIAldKmluc3cgICBcKCVkeFwpLCVlczpcKCVlZGlcKQotIDdhNDoJNjYgNmYgWyAJXSpvdXRzdyAgJWRzOlwoJWVzaVwpLFwoJWR4XCkKLSA3YTY6CTY2IDgxIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjdyAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDdhZjoJNjYgODMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGN3ICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDdiNzoJNjYgODUgOTAgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDdiZToJNjYgODcgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDdjNToJNjYgODkgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDdjYzoJNjYgOGIgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDdkMzoJNjYgOGMgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z3ICAgJXNzLDB4OTA5MDkwOTBcKCVlYXhcKQotIDdkYToJNjYgOGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZWEgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDdlMToJNjYgOGYgODAgOTAgOTAgOTAgOTAgWyAJXSpwb3B3ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gN2U4Ogk2NiA5MSBbIAldKnhjaGcgICAlYXgsJWN4Ci0gN2VhOgk2NiA5MiBbIAldKnhjaGcgICAlYXgsJWR4Ci0gN2VjOgk2NiA5MyBbIAldKnhjaGcgICAlYXgsJWJ4Ci0gN2VlOgk2NiA5NCBbIAldKnhjaGcgICAlYXgsJXNwCi0gN2YwOgk2NiA5NSBbIAldKnhjaGcgICAlYXgsJWJwCi0gN2YyOgk2NiA5NiBbIAldKnhjaGcgICAlYXgsJXNpCi0gN2Y0Ogk2NiA5NyBbIAldKnhjaGcgICAlYXgsJWRpCi0gN2Y2Ogk2NiA5OCBbIAldKmNidHcgICAKLSA3Zjg6CTY2IDk5IFsgCV0qY3d0ZCAgIAotIDdmYToJNjYgOWEgOTAgOTAgOTAgOTAgWyAJXSpsY2FsbHcgXCQweDkwOTAsXCQweDkwOTAKLSA4MDA6CTY2IDljIFsgCV0qcHVzaGZ3IAotIDgwMjoJNjYgOWQgWyAJXSpwb3BmdyAgCi0gODA0Ogk2NiBhMSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwLCVheAotIDgwYToJNjYgYTMgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWF4LDB4OTA5MDkwOTAKLSA4MTA6CTY2IGE1IFsgCV0qbW92c3cgICVkczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSA4MTI6CTY2IGE3IFsgCV0qY21wc3cgICVlczpcKCVlZGlcKSwlZHM6XCglZXNpXCkKLSA4MTQ6CTY2IGE5IDkwIDkwIFsgCV0qdGVzdCAgIFwkMHg5MDkwLCVheAotIDgxODoJNjYgYWIgWyAJXSpzdG9zICAgJWF4LCVlczpcKCVlZGlcKQotIDgxYToJNjYgYWQgWyAJXSpsb2RzICAgJWRzOlwoJWVzaVwpLCVheAotIDgxYzoJNjYgYWYgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVheAotIDgxZToJNjYgYjggOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWF4Ci0gODIyOgk2NiBiOSA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlY3gKLSA4MjY6CTY2IGJhIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVkeAotIDgyYToJNjYgYmIgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWJ4Ci0gODJlOgk2NiBiYyA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlc3AKLSA4MzI6CTY2IGJkIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVicAotIDgzNjoJNjYgYmUgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJXNpCi0gODNhOgk2NiBiZiA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlZGkKLSA4M2U6CTY2IGMxIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsdyAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSA4NDY6CTY2IGMyIDkwIDkwIFsgCV0qcmV0dyAgIFwkMHg5MDkwCi0gODRhOgk2NiBjMyBbIAldKnJldHcgICAKLSA4NGM6CTY2IGM0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4NTM6CTY2IGM1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGRzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4NWE6CTY2IGM3IDgwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92dyAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDg2MzoJNjYgYzggOTAgOTAgOTAgWyAJXSplbnRlcncgXCQweDkwOTAsXCQweDkwCi0gODY4Ogk2NiBjOSBbIAldKmxlYXZldyAKLSA4NmE6CTY2IGNhIDkwIDkwIFsgCV0qbHJldHcgIFwkMHg5MDkwCi0gODZlOgk2NiBjYiBbIAldKmxyZXR3ICAKLSA4NzA6CTY2IGNmIFsgCV0qaXJldHcgIAotIDg3MjoJNjYgZDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2x3ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gODc5Ogk2NiBkMyA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbHcgICAlY2wsMHg5MDkwOTA5MFwoJWVheFwpCi0gODgwOgk2NiBlNSA5MCBbIAldKmluICAgICBcJDB4OTAsJWF4Ci0gODgzOgk2NiBlNyA5MCBbIAldKm91dCAgICAlYXgsXCQweDkwCi0gODg2Ogk2NiBlOCA4ZiA5MCBbIAldKmNhbGx3ICAoMHgpPzk5MTkuKgotIDg4YToJNjYgZWEgOTAgOTAgOTAgOTAgWyAJXSpsam1wdyAgXCQweDkwOTAsXCQweDkwOTAKLSA4OTA6CTY2IGVkIFsgCV0qaW4gICAgIFwoJWR4XCksJWF4Ci0gODkyOgk2NiBlZiBbIAldKm91dCAgICAlYXgsXCglZHhcKQotIDg5NDoJNjYgZjcgOTAgOTAgOTAgOTAgOTAgWyAJXSpub3R3ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gODliOgk2NiBmZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNhbGx3ICBcKjB4OTA5MDkwOTBcKCVlYXhcKQotIDhhMjoJNjYgMGYgMDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpsYXIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhhYToJNjYgMGYgMDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpsc2wgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhiMjoJNjYgMGYgNDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92byAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhiYToJNjYgMGYgNDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bm8gMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhjMjoJNjYgMGYgNDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YiAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhjYToJNjYgMGYgNDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YWUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhkMjoJNjYgMGYgNDQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZSAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhkYToJNjYgMGYgNDUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bmUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhlMjoJNjYgMGYgNDYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YmUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhlYToJNjYgMGYgNDcgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YSAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhmMjoJNjYgMGYgNDggOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cyAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDhmYToJNjYgMGYgNDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnMgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkwMjoJNjYgMGYgNGEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cCAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkwYToJNjYgMGYgNGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkxMjoJNjYgMGYgNGMgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bCAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkxYToJNjYgMGYgNGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92Z2UgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkyMjoJNjYgMGYgNGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bGUgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkyYToJNjYgMGYgNGYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZyAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDkzMjoJNjYgMGYgYTAgWyAJXSpwdXNodyAgJWZzCi0gOTM1Ogk2NiAwZiBhMSBbIAldKnBvcHcgICAlZnMKLSA5Mzg6CTY2IDBmIGEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnQgICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NDA6CTY2IDBmIGE0IDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgIFwkMHg5MCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTQ5Ogk2NiAwZiBhNSA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICAlY2wsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk1MToJNjYgMGYgYTggWyAJXSpwdXNodyAgJWdzCi0gOTU0Ogk2NiAwZiBhOSBbIAldKnBvcHcgICAlZ3MKLSA5NTc6CTY2IDBmIGFiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRzICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NWY6CTY2IDBmIGFjIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hyZCAgIFwkMHg5MCwlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTY4Ogk2NiAwZiBhZCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICAlY2wsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk3MDoJNjYgMGYgYWYgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDk3ODoJNjYgMGYgYjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXB4Y2hnICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5ODA6CTY2IDBmIGIyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5ODg6CTY2IDBmIGIzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRyICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5OTA6CTY2IDBmIGI0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGZzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5OTg6CTY2IDBmIGI1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGdzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5YTA6CTY2IDBmIGI2IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92emJ3IDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5YTg6CTY2IDBmIGJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRjICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5YjA6CTY2IDBmIGJjIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNmICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5Yjg6CTY2IDBmIGJkIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5YzA6CTY2IDBmIGJlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92c2J3IDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5Yzg6CTY2IDBmIGMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeGFkZCAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM1OTY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjcgKzAsMCBAQAotLnRleHQKLWZvbzoKLSBhZGQgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBhZGQgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGFkZCAgICAkMHg5MCwlYWwKLSBhZGQgICAgJDB4OTA5MDkwOTAsJWVheAotIHB1c2ggICAlZXMKLSBwb3AgICAgJWVzCi0gb3IgICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gb3IgICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIG9yICAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIG9yICAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBvciAgICAgJDB4OTAsJWFsCi0gb3IgICAgICQweDkwOTA5MDkwLCVlYXgKLSBwdXNoICAgJWNzCi0gYWRjICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBhZGMgICAgJDB4OTAsJWFsCi0gYWRjICAgICQweDkwOTA5MDkwLCVlYXgKLSBwdXNoICAgJXNzCi0gcG9wICAgICVzcwotIHNiYiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHNiYiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gc2JiICAgICQweDkwLCVhbAotIHNiYiAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gcHVzaCAgICVkcwotIHBvcCAgICAlZHMKLSBhbmQgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBhbmQgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYW5kICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gYW5kICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGFuZCAgICAkMHg5MCwlYWwKLSBhbmQgICAgJDB4OTA5MDkwOTAsJWVheAotIGRhYQotIHN1YiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHN1YiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gc3ViICAgICQweDkwLCVhbAotIHN1YiAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gZGFzCi0geG9yICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0geG9yICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSB4b3IgICAgJDB4OTAsJWFsCi0geG9yICAgICQweDkwOTA5MDkwLCVlYXgKLSBhYWEKLSBjbXAgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBjbXAgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gY21wICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gY21wICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtcCAgICAkMHg5MCwlYWwKLSBjbXAgICAgJDB4OTA5MDkwOTAsJWVheAotIGFhcwotIGluYyAgICAlZWF4Ci0gaW5jICAgICVlY3gKLSBpbmMgICAgJWVkeAotIGluYyAgICAlZWJ4Ci0gaW5jICAgICVlc3AKLSBpbmMgICAgJWVicAotIGluYyAgICAlZXNpCi0gaW5jICAgICVlZGkKLSBkZWMgICAgJWVheAotIGRlYyAgICAlZWN4Ci0gZGVjICAgICVlZHgKLSBkZWMgICAgJWVieAotIGRlYyAgICAlZXNwCi0gZGVjICAgICVlYnAKLSBkZWMgICAgJWVzaQotIGRlYyAgICAlZWRpCi0gcHVzaCAgICVlYXgKLSBwdXNoICAgJWVjeAotIHB1c2ggICAlZWR4Ci0gcHVzaCAgICVlYngKLSBwdXNoICAgJWVzcAotIHB1c2ggICAlZWJwCi0gcHVzaCAgICVlc2kKLSBwdXNoICAgJWVkaQotIHBvcCAgICAlZWF4Ci0gcG9wICAgICVlY3gKLSBwb3AgICAgJWVkeAotIHBvcCAgICAlZWJ4Ci0gcG9wICAgICVlc3AKLSBwb3AgICAgJWVicAotIHBvcCAgICAlZXNpCi0gcG9wICAgICVlZGkKLSBwdXNoYQotIHBvcGEKLSBib3VuZCAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYXJwbCAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gcHVzaCAgICQweDkwOTA5MDkwCi0gaW11bCAgICQweDkwOTA5MDkwLDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHB1c2ggICAkMHhmZmZmZmY5MAotIGltdWwgICAkMHhmZmZmZmY5MCwweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBpbnNiICAgKCVkeCksJWVzOiglZWRpKQotIGluc2wgICAoJWR4KSwlZXM6KCVlZGkpCi0gb3V0c2IgICVkczooJWVzaSksKCVkeCkKLSBvdXRzbCAgJWRzOiglZXNpKSwoJWR4KQotIGpvICAgICAuKzItMHg3MAotIGpubyAgICAuKzItMHg3MAotIGpiICAgICAuKzItMHg3MAotIGphZSAgICAuKzItMHg3MAotIGplICAgICAuKzItMHg3MAotIGpuZSAgICAuKzItMHg3MAotIGpiZSAgICAuKzItMHg3MAotIGphICAgICAuKzItMHg3MAotIGpzICAgICAuKzItMHg3MAotIGpucyAgICAuKzItMHg3MAotIGpwICAgICAuKzItMHg3MAotIGpucCAgICAuKzItMHg3MAotIGpsICAgICAuKzItMHg3MAotIGpnZSAgICAuKzItMHg3MAotIGpsZSAgICAuKzItMHg3MAotIGpnICAgICAuKzItMHg3MAotIGFkY2IgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjbCAgICQweDkwOTA5MDkwLDB4OTA5MDkwOTAoJWVheCkKLSBhZGNsICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KQotIHRlc3QgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHRlc3QgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbW92ICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gbW92ICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3ZsICAgJXNzLDB4OTA5MDkwOTAoJWVheCkKLSBsZWEgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92bCAgIDB4OTA5MDkwOTAoJWVheCksJXNzCi0gcG9wbCAgIDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWVheCwlZWF4Ci0geGNoZyAgICVlYXgsJWVjeAotIHhjaGcgICAlZWF4LCVlZHgKLSB4Y2hnICAgJWVheCwlZWJ4Ci0geGNoZyAgICVlYXgsJWVzcAotIHhjaGcgICAlZWF4LCVlYnAKLSB4Y2hnICAgJWVheCwlZXNpCi0geGNoZyAgICVlYXgsJWVkaQotIGN3dGwKLSBjbHRkCi0gbGNhbGwgICQweDkwOTAsJDB4OTA5MDkwOTAKLSBmd2FpdAotIHB1c2hmCi0gcG9wZgotIHNhaGYKLSBsYWhmCi0gbW92ICAgIDB4OTA5MDkwOTAsJWFsCi0gbW92ICAgIDB4OTA5MDkwOTAsJWVheAotIG1vdiAgICAlYWwsMHg5MDkwOTA5MAotIG1vdiAgICAlZWF4LDB4OTA5MDkwOTAKLSBtb3ZzYiAgJWRzOiglZXNpKSwlZXM6KCVlZGkpCi0gbW92c2wgICVkczooJWVzaSksJWVzOiglZWRpKQotIGNtcHNiICAlZXM6KCVlZGkpLCVkczooJWVzaSkKLSBjbXBzbCAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCi0gdGVzdCAgICQweDkwLCVhbAotIHRlc3QgICAkMHg5MDkwOTA5MCwlZWF4Ci0gc3RvcyAgICVhbCwlZXM6KCVlZGkpCi0gc3RvcyAgICVlYXgsJWVzOiglZWRpKQotIGxvZHMgICAlZHM6KCVlc2kpLCVhbAotIGxvZHMgICAlZHM6KCVlc2kpLCVlYXgKLSBzY2FzICAgJWVzOiglZWRpKSwlYWwKLSBzY2FzICAgJWVzOiglZWRpKSwlZWF4Ci0gbW92ICAgICQweDkwLCVhbAotIG1vdiAgICAkMHg5MCwlY2wKLSBtb3YgICAgJDB4OTAsJWRsCi0gbW92ICAgICQweDkwLCVibAotIG1vdiAgICAkMHg5MCwlYWgKLSBtb3YgICAgJDB4OTAsJWNoCi0gbW92ICAgICQweDkwLCVkaAotIG1vdiAgICAkMHg5MCwlYmgKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVheAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWN4Ci0gbW92ICAgICQweDkwOTA5MDkwLCVlZHgKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVieAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZXNwCi0gbW92ICAgICQweDkwOTA5MDkwLCVlYnAKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVzaQotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWRpCi0gcmNsYiAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSByY2xsICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIHJldCAgICAkMHg5MDkwCi0gcmV0Ci0gbGVzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGxkcyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3ZiICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIG1vdmwgICAkMHg5MDkwOTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gZW50ZXIgICQweDkwOTAsJDB4OTAKLSBsZWF2ZQotIGxyZXQgICAkMHg5MDkwCi0gbHJldAotIGludDMKLSBpbnQgICAgJDB4OTAKLSBpbnRvCi0gaXJldAotIHJjbGIgICAweDkwOTA5MDkwKCVlYXgpCi0gcmNsbCAgIDB4OTA5MDkwOTAoJWVheCkKLSByY2xiICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKLSByY2xsICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKLSBhYW0gICAgJDB4ZmZmZmZmOTAKLSBhYWQgICAgJDB4ZmZmZmZmOTAKLSB4bGF0ICAgJWRzOiglZWJ4KQotIGZjb21zICAweDkwOTA5MDkwKCVlYXgpCi0gZnN0cyAgIDB4OTA5MDkwOTAoJWVheCkKLSBmaWNvbWwgMHg5MDkwOTA5MCglZWF4KQotIGZpc3RsICAweDkwOTA5MDkwKCVlYXgpCi0gZmNvbWwgIDB4OTA5MDkwOTAoJWVheCkKLSBmc3RsICAgMHg5MDkwOTA5MCglZWF4KQotIGZpY29tICAweDkwOTA5MDkwKCVlYXgpCi0gZmlzdCAgIDB4OTA5MDkwOTAoJWVheCkKLSBsb29wbmUgLisyLTB4NzAKLSBsb29wZSAgLisyLTB4NzAKLSBsb29wICAgLisyLTB4NzAKLSBqZWN4eiAgLisyLTB4NzAKLSBpbiAgICAgJDB4OTAsJWFsCi0gaW4gICAgICQweDkwLCVlYXgKLSBvdXQgICAgJWFsLCQweDkwCi0gb3V0ICAgICVlYXgsJDB4OTAKLSBjYWxsICAgLis1KzB4OTA5MDkwOTAKLSBqbXAgICAgLis1KzB4OTA5MDkwOTAKLSBsam1wICAgJDB4OTA5MCwkMHg5MDkwOTA5MAotIGptcCAgICAuKzItMHg3MAotIGluICAgICAoJWR4KSwlYWwKLSBpbiAgICAgKCVkeCksJWVheAotIG91dCAgICAlYWwsKCVkeCkKLSBvdXQgICAgJWVheCwoJWR4KQotIGhsdAotIGNtYwotIG5vdGIgICAweDkwOTA5MDkwKCVlYXgpCi0gbm90bCAgIDB4OTA5MDkwOTAoJWVheCkKLSBjbGMKLSBzdGMKLSBjbGkKLSBzdGkKLSBjbGQKLSBzdGQKLSBjYWxsICAgKjB4OTA5MDkwOTAoJWVheCkKLSBsbGR0ICAgMHg5MDkwOTA5MCglZWF4KQotIGxnZHQgICAweDkwOTA5MDkwKCVlYXgpCi0gbGFyICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGxzbCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbHRzCi0gaW52ZAotIHdiaW52ZAotIHVkMmEKLSBtb3YgICAgJWNyMiwlZWF4Ci0gbW92ICAgICVkYjIsJWVheAotIG1vdiAgICAlZWF4LCVjcjIKLSBtb3YgICAgJWVheCwlZGIyCi0gbW92ICAgICV0cjIsJWVheAotIG1vdiAgICAlZWF4LCV0cjIKLSB3cm1zcgotIHJkdHNjCi0gcmRtc3IKLSByZHBtYwotIGNtb3ZvICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bm8gMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmIgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZhZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92ZSAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdm5lIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZiZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92YSAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdnMgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZucyAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92cCAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdm5wIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZsICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92Z2UgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmxlIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZnICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBwdW5wY2tsYncgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNrbHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2xkcSAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWNrc3N3YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZ3RiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBjbXBndHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGd0ZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWNrdXN3YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwdW5wY2toYncgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNraHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2hkcSAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWNrc3NkdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBtb3ZkICAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gbW92cSAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmx3ICAkMHg5MCwlbW0wCi0gcHNybGQgICQweDkwLCVtbTAKLSBwc3JscSAgJDB4OTAsJW1tMAotIHBjbXBlcWIgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGVxdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZXFkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIGVtbXMKLSBtb3ZkICAgJW1tMiwweDkwOTA5MDkwKCVlYXgpCi0gbW92cSAgICVtbTIsMHg5MDkwOTA5MCglZWF4KQotIGpvICAgICAuKzYrMHg5MDkwOTA5MAotIGpubyAgICAuKzYrMHg5MDkwOTA5MAotIGpiICAgICAuKzYrMHg5MDkwOTA5MAotIGphZSAgICAuKzYrMHg5MDkwOTA5MAotIGplICAgICAuKzYrMHg5MDkwOTA5MAotIGpuZSAgICAuKzYrMHg5MDkwOTA5MAotIGpiZSAgICAuKzYrMHg5MDkwOTA5MAotIGphICAgICAuKzYrMHg5MDkwOTA5MAotIGpzICAgICAuKzYrMHg5MDkwOTA5MAotIGpucyAgICAuKzYrMHg5MDkwOTA5MAotIGpwICAgICAuKzYrMHg5MDkwOTA5MAotIGpucCAgICAuKzYrMHg5MDkwOTA5MAotIGpsICAgICAuKzYrMHg5MDkwOTA5MAotIGpnZSAgICAuKzYrMHg5MDkwOTA5MAotIGpsZSAgICAuKzYrMHg5MDkwOTA5MAotIGpnICAgICAuKzYrMHg5MDkwOTA5MAotIHNldG8gICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bm8gIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRiICAgMHg5MDkwOTA5MCglZWF4KQotIHNldGFlICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0ZSAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRuZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGJlICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0YSAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRzICAgMHg5MDkwOTA5MCglZWF4KQotIHNldG5zICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0cCAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRucCAgMHg5MDkwOTA5MCglZWF4KQotIHNldGwgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0Z2UgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRsZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGcgICAweDkwOTA5MDkwKCVlYXgpCi0gcHVzaCAgICVmcwotIHBvcCAgICAlZnMKLSBjcHVpZAotIGJ0ICAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaGxkICAgJDB4OTAsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICVjbCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBwdXNoICAgJWdzCi0gcG9wICAgICVncwotIHJzbQotIGJ0cyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzaHJkICAgJDB4OTAsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICVjbCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBpbXVsICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21weGNoZyAlZGwsMHg5MDkwOTA5MCglZWF4KQotIGNtcHhjaGcgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbHNzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGJ0ciAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsZnMgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbGdzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdnpibCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3Z6d2wgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gdWQyYgotIGJ0YyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBic2YgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gYnNyICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdnNibCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3Zzd2wgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0geGFkZCAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0geGFkZCAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGJzd2FwICAlZWF4Ci0gYnN3YXAgICVlY3gKLSBic3dhcCAgJWVkeAotIGJzd2FwICAlZWJ4Ci0gYnN3YXAgICVlc3AKLSBic3dhcCAgJWVicAotIGJzd2FwICAlZXNpCi0gYnN3YXAgICVlZGkKLSBwc3JsdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNybGQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmxxICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwbXVsbHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YnVzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3VidXN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhbmQgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkdXNiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGR1c3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFuZG4gIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmF3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JhZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcG11bGh3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3Vic3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcG9yICAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGRzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkc3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHhvciAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzbGx3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc2xsZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNsbHEgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBtYWRkd2QgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YmIgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJ3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3ViZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZGIgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGR3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gYWRkICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYWRkICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVlcwotIHBvcHcgICAlZXMKLSBvciAgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBvciAgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBvciAgICAgJDB4OTA5MCwlYXgKLSBwdXNodyAgJWNzCi0gYWRjICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYWRjICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVzcwotIHBvcHcgICAlc3MKLSBzYmIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBzYmIgICAgJDB4OTA5MCwlYXgKLSBwdXNodyAgJWRzCi0gcG9wdyAgICVkcwotIGFuZCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFuZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGFuZCAgICAkMHg5MDkwLCVheAotIHN1YiAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHN1YiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHN1YiAgICAkMHg5MDkwLCVheAotIHhvciAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHhvciAgICAkMHg5MDkwLCVheAotIGNtcCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGNtcCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtcCAgICAkMHg5MDkwLCVheAotIGluYyAgICAlYXgKLSBpbmMgICAgJWN4Ci0gaW5jICAgICVkeAotIGluYyAgICAlYngKLSBpbmMgICAgJXNwCi0gaW5jICAgICVicAotIGluYyAgICAlc2kKLSBpbmMgICAgJWRpCi0gZGVjICAgICVheAotIGRlYyAgICAlY3gKLSBkZWMgICAgJWR4Ci0gZGVjICAgICVieAotIGRlYyAgICAlc3AKLSBkZWMgICAgJWJwCi0gZGVjICAgICVzaQotIGRlYyAgICAlZGkKLSBwdXNoICAgJWF4Ci0gcHVzaCAgICVjeAotIHB1c2ggICAlZHgKLSBwdXNoICAgJWJ4Ci0gcHVzaCAgICVzcAotIHB1c2ggICAlYnAKLSBwdXNoICAgJXNpCi0gcHVzaCAgICVkaQotIHBvcCAgICAlYXgKLSBwb3AgICAgJWN4Ci0gcG9wICAgICVkeAotIHBvcCAgICAlYngKLSBwb3AgICAgJXNwCi0gcG9wICAgICVicAotIHBvcCAgICAlc2kKLSBwb3AgICAgJWRpCi0gcHVzaGF3Ci0gcG9wYXcKLSBib3VuZCAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBwdXNodyAgJDB4OTA5MAotIGltdWwgICAkMHg5MDkwLDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gcHVzaHcgICQweGZmZmZmZjkwCi0gaW11bCAgICQweGZmZmZmZjkwLDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gaW5zdyAgICglZHgpLCVlczooJWVkaSkKLSBvdXRzdyAgJWRzOiglZXNpKSwoJWR4KQotIGFkY3cgICAkMHg5MDkwLDB4OTA5MDkwOTAoJWVheCkKLSBhZGN3ICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KQotIHRlc3QgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHhjaGcgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIG1vdncgICAlc3MsMHg5MDkwOTA5MCglZWF4KQotIGxlYSAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHBvcHcgICAweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVheCwlY3gKLSB4Y2hnICAgJWF4LCVkeAotIHhjaGcgICAlYXgsJWJ4Ci0geGNoZyAgICVheCwlc3AKLSB4Y2hnICAgJWF4LCVicAotIHhjaGcgICAlYXgsJXNpCi0geGNoZyAgICVheCwlZGkKLSBjYnR3Ci0gY3d0ZAotIGxjYWxsdyAkMHg5MDkwLCQweDkwOTAKLSBwdXNoZncKLSBwb3BmdwotIG1vdiAgICAweDkwOTA5MDkwLCVheAotIG1vdiAgICAlYXgsMHg5MDkwOTA5MAotIG1vdnN3ICAlZHM6KCVlc2kpLCVlczooJWVkaSkKLSBjbXBzdyAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCi0gdGVzdCAgICQweDkwOTAsJWF4Ci0gc3RvcyAgICVheCwlZXM6KCVlZGkpCi0gbG9kcyAgICVkczooJWVzaSksJWF4Ci0gc2NhcyAgICVlczooJWVkaSksJWF4Ci0gbW92ICAgICQweDkwOTAsJWF4Ci0gbW92ICAgICQweDkwOTAsJWN4Ci0gbW92ICAgICQweDkwOTAsJWR4Ci0gbW92ICAgICQweDkwOTAsJWJ4Ci0gbW92ICAgICQweDkwOTAsJXNwCi0gbW92ICAgICQweDkwOTAsJWJwCi0gbW92ICAgICQweDkwOTAsJXNpCi0gbW92ICAgICQweDkwOTAsJWRpCi0gcmNsdyAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSByZXR3ICAgJDB4OTA5MAotIHJldHcKLSBsZXMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBsZHMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3Z3ICAgJDB4OTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gZW50ZXJ3ICQweDkwOTAsJDB4OTAKLSBsZWF2ZXcKLSBscmV0dyAgJDB4OTA5MAotIGxyZXR3Ci0gaXJldHcKLSByY2x3ICAgMHg5MDkwOTA5MCglZWF4KQotIHJjbHcgICAlY2wsMHg5MDkwOTA5MCglZWF4KQotIGluICAgICAkMHg5MCwlYXgKLSBvdXQgICAgJWF4LCQweDkwCi0gY2FsbHcgIC4rMysweDkwOTAKLSBsam1wdyAgJDB4OTA5MCwkMHg5MDkwCi0gaW4gICAgICglZHgpLCVheAotIG91dCAgICAlYXgsKCVkeCkKLSBub3R3ICAgMHg5MDkwOTA5MCglZWF4KQotIGNhbGx3ICAqMHg5MDkwOTA5MCglZWF4KQotIGxhciAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGxzbCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZvICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZubyAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZiICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZhZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZlICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZuZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZiZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZhICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZzICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZucyAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZwICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZucCAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZsICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZnZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZsZSAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtb3ZnICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIHB1c2h3ICAlZnMKLSBwb3B3ICAgJWZzCi0gYnQgICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICQweDkwLCVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICVjbCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIHB1c2h3ICAlZ3MKLSBwb3B3ICAgJWdzCi0gYnRzICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICQweDkwLCVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICVjbCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIGltdWwgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGNtcHhjaGcgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsc3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBidHIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBsZnMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBsZ3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3Z6YncgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBidGMgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBic2YgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBic3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3ZzYncgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSB4YWRkICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRiNjU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBwcmVmaXgKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTliIDY3IDI2IGQ5IDNjIFsgCV0qYWRkcjE2IGZzdGN3ICVlczpcKCVzaVwpCi0gICA1Ogk5YiBkZiBlMCBbIAldKmZzdHN3ICAlYXgKLSAgIDg6CTliIGRmIGUwIFsgCV0qZnN0c3cgICVheAotICAgYjoJOWIgZGYgZTAgWyAJXSpmc3RzdyAgJWF4Ci0gICBlOgk5YiA2NyBkZiBlMCBbIAldKmFkZHIxNiBmc3RzdyAlYXgKLSAgMTI6CWYzIDY3IDY2IDM2IGE3IFsgCV0qcmVweiBhZGRyMTYgY21wc3cgJWVzOlwoJWRpXCksJXNzOlwoJXNpXCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjVkZmZkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0udGV4dAotZm9vOgotIGFkZHIxNiBmc3RjdyAlZXM6KCVzaSkKLSBmc3RzdwotIGZzdHN3ICVheAotIGZzdHN3ICVlYXgKLSBhZGRyMTYgZnN0c3cgJWF4Ci0gYWRkcjE2IHJlcCBjbXBzdyAlZXM6KCVkaSksJXNzOiglc2kpCi0KLSMgR2V0IGEgZ29vZCBhbGlnbm1lbnQuCi0gLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTVlZWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kcncKLSNuYW1lOiBpMzg2IHJlbG9jCi0KLS4qOiArZmlsZSBmb3JtYXQgLippMzg2LioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPGZvbz46Ci0gICAwOgliMyAwMCBbIAldKm1vdiAgICBcJDB4MCwlYmwJMTogKFJfMzg2Xyk/OAkudGV4dAotICAgMjoJNjggMDAgMDAgMDAgMDAgWyAJXSpwdXNoICAgXCQweDAJMzogKFJfMzg2Xyk/KGRpcik/MzIJLnRleHQKLSAgIDc6CTA1IDAwIDAwIDAwIDAwIFsgCV0qYWRkICAgIFwkMHgwLCVlYXgJODogKFJfMzg2Xyk/KGRpcik/MzIJLnRleHQKLSAgIGM6CTgxIGMzIDAwIDAwIDAwIDAwIFsgCV0qYWRkICAgIFwkMHgwLCVlYngJZTogKFJfMzg2Xyk/KGRpcik/MzIJLnRleHQKLSAgMTI6CTY5IGQyIDAwIDAwIDAwIDAwIFsgCV0qaW11bCAgIFwkMHgwLCVlZHgsJWVkeAkxNDogKFJfMzg2Xyk/KGRpcik/MzIJLnRleHQKLSAgMTg6CTlhIDAwIDAwIDAwIDAwIDAwIDAwIFsgCV0qbGNhbGwgIFwkMHgwLFwkMHgwCTE5OiAoUl8zODZfKT8oZGlyKT8zMgkudGV4dAotICAxZjoJNjYgNjggMDAgMDAgWyAJXSpwdXNodyAgXCQweDAJMjE6IChSXzM4Nl8pPzE2CS50ZXh0Ci0gIDIzOgk5MCBbIAldKm5vcCAgICAKLSAgMjQ6CTkwIFsgCV0qbm9wICAgIAotICAyNToJOTAgWyAJXSpub3AgICAgCi0gIDI2Ogk5MCBbIAldKm5vcCAgICAKLSAgMjc6CTkwIFsgCV0qbm9wICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmY5NWI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS50ZXh0Ci1mb286CW1vdgkkZm9vLCAlYmwKLQlwdXNoCSRmb28KLQlhZGQJJGZvbywgJWVheAotCWFkZAkkZm9vLCAlZWJ4Ci0JaW11bAkkZm9vLCAlZWR4Ci0JbGNhbGwJJDAsICRmb28KLQlwdXNodwkkZm9vCi0KLSMgUGFkIG91dCB0byBhIGdvb2QgYWxpZ25tZW50Ci0gLmJ5dGUgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDkxNTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJIyB0ZXN0IGhhbmRsaW5nIG9mIHdoaXRlc3BhY2UsIGFuZCB1cHBlci1jYXNlCi0gICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLlRlWHQgCi0gICAzIDAwMDAgMzYgICAgICAgICAgICAgICAgICAgICAgICAgCQlzcyAKLSAgIDQgMDAwMSA4ODAzICAgICAgICAgICAgICAgICAgICAgICAJCW1vdiAlIGFsICwgXCggJSBlYnggXCkgCi0gICA1IDAwMDMgQzcwNUQ3MTEgMDAwMDdCMDAgMDAwMCAgICAgCSAgICAgICAgbU92bCBcJCAxMjMgLCA0NTY3IAotICAgNiAwMDBkIDY3OEE3ODdCICAgICAgICAgICAgICAgICAgIAkgQUREcjE2CW1vdiAxMjMgXCggJSBieCAsICUgc2kgLCAxIFwpICwgJSBiaCAKLSAgIDcgMDAxMSBGRkUwICAgICAgICAgICAgICAgICAgICAgICAJCWptcCBcKiAlIGVheCAKLSAgIDggMDAxMyA2NjI2RkYyMyAgICAgICAgICAgICAgICAgICAJZm9vOglqbXB3ICUgZXMgOiBcKiBcKCAlIGVieCBcKQkKLSAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgCi0gIDEwIDAwMTcgQTA1MDAwMDAgMDAgICAgICAgICAgICAgICAgCQltb3YgXCggMHg4IFwqIDBYYSBcKSAsICUgYWwgCi0gIDExIDAwMWMgQjAyMCAgICAgICAgICAgICAgICAgICAgICAgCQltb3YgXCQgXCggOCBcKiA0IFwpICwgJSBhbCAKLSAgMTIgMDAxZSBCNzEzICAgICAgICAgICAgICAgICAgICAgICAJCW1vdiBcJCBmb28gLCAlIGJIIAotICAxMyAwMDIwIEI3MTMgICAgICAgICAgICAgICAgICAgICAgIAkJbW92YiBcJCBmb28gLCAlIEJIIAotICAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkKLSAgMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkuQ09ERTE2CQotICAxNiAwMDIyIDY2QjgxMzAwIDAwMDAgICAgICAgICAgICAgIAkJTW92IFwkIGZvbyAsICVlQXgJCi0gIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLkNvZGUzMiAKLSAgMTggMDAyOCA2NkI4MTMwMCAgICAgICAgICAgICAgICAgICAJCW1vdiBcJCBmb28gLCAlYXgJCi0gIDE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDIwIDAwMmMgRDlDOSAgICAgICAgICAgICAgICAgICAgICAgCQlmeGNoICAgJXN0ICBcKCAgMSAgXCkgCi0gIDIxIDAwMmUgRDlDOSAgICAgICAgICAgICAgICAgICAgICAgCQlmeGNoICAgJSAgICAgICAgICAgc3RcKDFcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWVjY2ZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgdGVzdCBoYW5kbGluZyBvZiB3aGl0ZXNwYWNlLCBhbmQgdXBwZXItY2FzZQotLlRlWHQgCi0Jc3MgCi0JbW92ICUgYWwgLCAoICUgZWJ4ICkgCi0gICAgICAgIG1PdmwgJCAxMjMgLCA0NTY3IAotIEFERHIxNgltb3YgMTIzICggJSBieCAsICUgc2kgLCAxICkgLCAlIGJoIAotCWptcCAqICUgZWF4IAotZm9vOglqbXB3ICUgZXMgOiAqICggJSBlYnggKQkKLSAKLQltb3YgKCAweDggKiAwWGEgKSAsICUgYWwgCi0JbW92ICQgKCA4ICogNCApICwgJSBhbCAKLQltb3YgJCBmb28gLCAlIGJIIAotCW1vdmIgJCBmb28gLCAlIEJIIAotCQotLkNPREUxNgkKLQlNb3YgJCBmb28gLCAlZUF4CQotLkNvZGUzMiAKLQltb3YgJCBmb28gLCAlYXgJCi0KLQlmeGNoICAgJXN0ICAoICAxICApIAotCWZ4Y2ggICAlICAgICAgICAgICBzdCgxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1Njk3Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgUmVwb3J0ZWQgOTMvMDUvMDkgYnkgSmltIFdpbHNvbjogSUVFRSBzaW5nbGUtcHJlY2lzaW9uIEZMVF9NSU4gdmFsdWUgZ2V0cwotIyBhc3NlbWJsZWQgaW5jb3JyZWN0bHkuICAoT2ZmIGJ5IG9uZSB1bHAuKQotCi1wcm9jIGRvdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJJRUVFIEZMVF9NSU4sIHNpbmdsZS1wcmVjaXNpb24iCi0gICAgc2V0IHggMAotICAgIGdhc19zdGFydCAieDkzMDUwOWEucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiAwMCA/MDAgPzgwID8wMFxbIAlcXSsuc2luZ2xlIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICIgMDAgPzgwID8wMCA/MDBcWyAJXF0rLnNpbmdsZSIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiLnNpbmdsZSIgeyBmYWlsICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIgeyB9Ci0JICAgIHRpbWVvdXQgeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mIHsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmICEkeCB0aGVuIHsgZmFpbCAiJHRlc3RuYW1lIChsaXN0aW5nIGRpZG4ndCBtYXRjaCkiIH0KLX0KLQotaWYgIVtpc3RhcmdldCB2YXgqLSotKl0gdGhlbiB7Ci0gICAgZG90ZXN0Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MWIzMzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0gICAgICAgIC5nbG9iYWwgX2ZsdF9taW4KLQkuZGF0YQotICAgICAgICAuYWxpZ24gNAotX2ZsdF9taW46Ci0gICAgICAgIC5zaW5nbGUgMHIxLjE3NTQ5NDM1ZS0zOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5NjVlNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZAorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogYWxsaW5zbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8YWRkPjoKLSAgIDA6CTBkIGFkIGYwIDAwIAlhZGQgZnAsZnAgXHxcfCBub3AKLQotMCswMDA0IDxhZGQzPjoKLSAgIDQ6CThkIGFkIDAwIDAwIAlhZGQzIGZwLGZwLFsjXSowCi0KLTArMDAwOCA8YW5kPjoKLSAgIDg6CTBkIGNkIGYwIDAwIAlhbmQgZnAsZnAgXHxcfCBub3AKLQotMCswMDBjIDxhbmQzPjoKLSAgIGM6CThkIGNkIDAwIDAwIAlhbmQzIGZwLGZwLFsjXSoweDAKLQotMCswMDEwIDxvcj46Ci0gIDEwOgkwZCBlZCBmMCAwMCAJb3IgZnAsZnAgXHxcfCBub3AKLQotMCswMDE0IDxvcjM+OgotICAxNDoJOGQgZWQgMDAgMDAgCW9yMyBmcCxmcCxbI10qMHgwCi0KLTArMDAxOCA8eG9yPjoKLSAgMTg6CTBkIGRkIGYwIDAwIAl4b3IgZnAsZnAgXHxcfCBub3AKLQotMCswMDFjIDx4b3IzPjoKLSAgMWM6CThkIGRkIDAwIDAwIAl4b3IzIGZwLGZwLFsjXSoweDAKLQotMCswMDIwIDxhZGRpPjoKLSAgMjA6CTRkIDAwIGYwIDAwIAlhZGRpIGZwLFsjXSowIFx8XHwgbm9wCi0KLTArMDAyNCA8YWRkdj46Ci0gIDI0OgkwZCA4ZCBmMCAwMCAJYWRkdiBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMjggPGFkZHYzPjoKLSAgMjg6CThkIDhkIDAwIDAwIAlhZGR2MyBmcCxmcCxbI10qMAotCi0wKzAwMmMgPGFkZHg+OgotICAyYzoJMGQgOWQgZjAgMDAgCWFkZHggZnAsZnAgXHxcfCBub3AKLQotMCswMDMwIDxiYzg+OgotICAzMDoJN2MgZjQgZjAgMDAgCWJjIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDM0IDxiYzhfcz46Ci0gIDM0Ogk3YyBmMyBmMCAwMCAJYmMgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwMzggPGJjMjQ+OgotICAzODoJN2MgZjIgZjAgMDAgCWJjIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDNjIDxiYzI0X2w+OgotICAzYzoJZmMgZmYgZmYgZjEgCWJjIDAgPGFkZD4KLQotMCswMDQwIDxiZXE+OgotICA0MDoJYmQgMGQgZmYgZjAgCWJlcSBmcCxmcCwwIDxhZGQ+Ci0KLTArMDA0NCA8YmVxej46Ci0gIDQ0OgliMCA4ZCBmZiBlZiAJYmVxeiBmcCwwIDxhZGQ+Ci0KLTArMDA0OCA8Ymdlej46Ci0gIDQ4OgliMCBiZCBmZiBlZSAJYmdleiBmcCwwIDxhZGQ+Ci0KLTArMDA0YyA8Ymd0ej46Ci0gIDRjOgliMCBkZCBmZiBlZCAJYmd0eiBmcCwwIDxhZGQ+Ci0KLTArMDA1MCA8Ymxlej46Ci0gIDUwOgliMCBjZCBmZiBlYyAJYmxleiBmcCwwIDxhZGQ+Ci0KLTArMDA1NCA8Ymx0ej46Ci0gIDU0OgliMCBhZCBmZiBlYiAJYmx0eiBmcCwwIDxhZGQ+Ci0KLTArMDA1OCA8Ym5lej46Ci0gIDU4OgliMCA5ZCBmZiBlYSAJYm5leiBmcCwwIDxhZGQ+Ci0KLTArMDA1YyA8Ymw4PjoKLSAgNWM6CTdlIGU5IGYwIDAwIAlibCAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA2MCA8Ymw4X3M+OgotICA2MDoJN2UgZTggZjAgMDAgCWJsIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDY0IDxibDI0PjoKLSAgNjQ6CTdlIGU3IGYwIDAwIAlibCAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA2OCA8YmwyNF9sPjoKLSAgNjg6CWZlIGZmIGZmIGU2IAlibCAwIDxhZGQ+Ci0KLTArMDA2YyA8Ym5jOD46Ci0gIDZjOgk3ZCBlNSBmMCAwMCAJYm5jIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDcwIDxibmM4X3M+OgotICA3MDoJN2QgZTQgZjAgMDAgCWJuYyAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA3NCA8Ym5jMjQ+OgotICA3NDoJN2QgZTMgZjAgMDAgCWJuYyAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA3OCA8Ym5jMjRfbD46Ci0gIDc4OglmZCBmZiBmZiBlMiAJYm5jIDAgPGFkZD4KLQotMCswMDdjIDxibmU+OgotICA3YzoJYmQgMWQgZmYgZTEgCWJuZSBmcCxmcCwwIDxhZGQ+Ci0KLTArMDA4MCA8YnJhOD46Ci0gIDgwOgk3ZiBlMCBmMCAwMCAJYnJhIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDg0IDxicmE4X3M+OgotICA4NDoJN2YgZGYgZjAgMDAgCWJyYSAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA4OCA8YnJhMjQ+OgotICA4ODoJN2YgZGUgZjAgMDAgCWJyYSAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDA4YyA8YnJhMjRfbD46Ci0gIDhjOglmZiBmZiBmZiBkZCAJYnJhIDAgPGFkZD4KLQotMCswMDkwIDxjbXA+OgotICA5MDoJMGQgNGQgZjAgMDAgCWNtcCBmcCxmcCBcfFx8IG5vcAotCi0wKzAwOTQgPGNtcGk+OgotICA5NDoJODAgNGQgMDAgMDAgCWNtcGkgZnAsWyNdKjAKLQotMCswMDk4IDxjbXB1PjoKLSAgOTg6CTBkIDVkIGYwIDAwIAljbXB1IGZwLGZwIFx8XHwgbm9wCi0KLTArMDA5YyA8Y21wdWk+OgotICA5YzoJODAgNWQgMDAgMDAgCWNtcHVpIGZwLFsjXSowCi0KLTArMDBhMCA8ZGl2PjoKLSAgYTA6CTlkIDBkIDAwIDAwIAlkaXYgZnAsZnAKLQotMCswMGE0IDxkaXZ1PjoKLSAgYTQ6CTlkIDFkIDAwIDAwIAlkaXZ1IGZwLGZwCi0KLTArMDBhOCA8cmVtPjoKLSAgYTg6CTlkIDJkIDAwIDAwIAlyZW0gZnAsZnAKLQotMCswMGFjIDxyZW11PjoKLSAgYWM6CTlkIDNkIDAwIDAwIAlyZW11IGZwLGZwCi0KLTArMDBiMCA8amw+OgotICBiMDoJMWUgY2QgZjAgMDAgCWpsIGZwIFx8XHwgbm9wCi0KLTArMDBiNCA8am1wPjoKLSAgYjQ6CTFmIGNkIGYwIDAwIAlqbXAgZnAgXHxcfCBub3AKLQotMCswMGI4IDxsZD46Ci0gIGI4OgkyZCBjZCBmMCAwMCAJbGQgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBiYyA8bGRfMj46Ci0gIGJjOgkyZCBjZCBmMCAwMCAJbGQgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBjMCA8bGRfZD46Ci0gIGMwOglhZCBjZCAwMCAwMCAJbGQgZnAsQFwoMCxmcFwpCi0KLTArMDBjNCA8bGRfZDI+OgotICBjNDoJYWQgY2QgMDAgMDAgCWxkIGZwLEBcKDAsZnBcKQotCi0wKzAwYzggPGxkYj46Ci0gIGM4OgkyZCA4ZCBmMCAwMCAJbGRiIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwY2MgPGxkYl8yPjoKLSAgY2M6CTJkIDhkIGYwIDAwIAlsZGIgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBkMCA8bGRiX2Q+OgotICBkMDoJYWQgOGQgMDAgMDAgCWxkYiBmcCxAXCgwLGZwXCkKLQotMCswMGQ0IDxsZGJfZDI+OgotICBkNDoJYWQgOGQgMDAgMDAgCWxkYiBmcCxAXCgwLGZwXCkKLQotMCswMGQ4IDxsZGg+OgotICBkODoJMmQgYWQgZjAgMDAgCWxkaCBmcCxAZnAgXHxcfCBub3AKLQotMCswMGRjIDxsZGhfMj46Ci0gIGRjOgkyZCBhZCBmMCAwMCAJbGRoIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwZTAgPGxkaF9kPjoKLSAgZTA6CWFkIGFkIDAwIDAwIAlsZGggZnAsQFwoMCxmcFwpCi0KLTArMDBlNCA8bGRoX2QyPjoKLSAgZTQ6CWFkIGFkIDAwIDAwIAlsZGggZnAsQFwoMCxmcFwpCi0KLTArMDBlOCA8bGR1Yj46Ci0gIGU4OgkyZCA5ZCBmMCAwMCAJbGR1YiBmcCxAZnAgXHxcfCBub3AKLQotMCswMGVjIDxsZHViXzI+OgotICBlYzoJMmQgOWQgZjAgMDAgCWxkdWIgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBmMCA8bGR1Yl9kPjoKLSAgZjA6CWFkIDlkIDAwIDAwIAlsZHViIGZwLEBcKDAsZnBcKQotCi0wKzAwZjQgPGxkdWJfZDI+OgotICBmNDoJYWQgOWQgMDAgMDAgCWxkdWIgZnAsQFwoMCxmcFwpCi0KLTArMDBmOCA8bGR1aD46Ci0gIGY4OgkyZCBiZCBmMCAwMCAJbGR1aCBmcCxAZnAgXHxcfCBub3AKLQotMCswMGZjIDxsZHVoXzI+OgotICBmYzoJMmQgYmQgZjAgMDAgCWxkdWggZnAsQGZwIFx8XHwgbm9wCi0KLTArMDEwMCA8bGR1aF9kPjoKLSAxMDA6CWFkIGJkIDAwIDAwIAlsZHVoIGZwLEBcKDAsZnBcKQotCi0wKzAxMDQgPGxkdWhfZDI+OgotIDEwNDoJYWQgYmQgMDAgMDAgCWxkdWggZnAsQFwoMCxmcFwpCi0KLTArMDEwOCA8bGRfcGx1cz46Ci0gMTA4OgkyZCBlZCBmMCAwMCAJbGQgZnAsQGZwXCsgXHxcfCBub3AKLQotMCswMTBjIDxsZDI0PjoKLSAxMGM6CWVkIDAwIDAwIDAwIAlsZDI0IGZwLFsjXSowIDxhZGQ+Ci0JCQkxMGM6IFJfTTMyUl8yNAkuZGF0YQotCi0wKzAxMTAgPGxkaTg+OgotIDExMDoJNmQgMDAgZjAgMDAgCWxkaSBmcCxbI10qMCBcfFx8IG5vcAotCi0wKzAxMTQgPGxkaTE2PjoKLSAxMTQ6CTlkIGYwIDAxIDAwIAlsZGkgZnAsWyNdKjI1NgotCi0wKzAxMTggPGxvY2s+OgotIDExODoJMmQgZGQgZjAgMDAgCWxvY2sgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDExYyA8bWFjaGk+OgotIDExYzoJM2QgNGQgZjAgMDAgCW1hY2hpIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEyMCA8bWFjbG8+OgotIDEyMDoJM2QgNWQgZjAgMDAgCW1hY2xvIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEyNCA8bWFjd2hpPjoKLSAxMjQ6CTNkIDZkIGYwIDAwIAltYWN3aGkgZnAsZnAgXHxcfCBub3AKLQotMCswMTI4IDxtYWN3bG8+OgotIDEyODoJM2QgN2QgZjAgMDAgCW1hY3dsbyBmcCxmcCBcfFx8IG5vcAotCi0wKzAxMmMgPG11bD46Ci0gMTJjOgkxZCA2ZCBmMCAwMCAJbXVsIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEzMCA8bXVsaGk+OgotIDEzMDoJM2QgMGQgZjAgMDAgCW11bGhpIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEzNCA8bXVsbG8+OgotIDEzNDoJM2QgMWQgZjAgMDAgCW11bGxvIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEzOCA8bXVsd2hpPjoKLSAxMzg6CTNkIDJkIGYwIDAwIAltdWx3aGkgZnAsZnAgXHxcfCBub3AKLQotMCswMTNjIDxtdWx3bG8+OgotIDEzYzoJM2QgM2QgZjAgMDAgCW11bHdsbyBmcCxmcCBcfFx8IG5vcAotCi0wKzAxNDAgPG12PjoKLSAxNDA6CTFkIDhkIGYwIDAwIAltdiBmcCxmcCBcfFx8IG5vcAotCi0wKzAxNDQgPG12ZmFjaGk+OgotIDE0NDoJNWQgZjAgZjAgMDAgCW12ZmFjaGkgZnAgXHxcfCBub3AKLQotMCswMTQ4IDxtdmZhY2xvPjoKLSAxNDg6CTVkIGYxIGYwIDAwIAltdmZhY2xvIGZwIFx8XHwgbm9wCi0KLTArMDE0YyA8bXZmYWNtaT46Ci0gMTRjOgk1ZCBmMiBmMCAwMCAJbXZmYWNtaSBmcCBcfFx8IG5vcAotCi0wKzAxNTAgPG12ZmM+OgotIDE1MDoJMWQgOTAgZjAgMDAgCW12ZmMgZnAscHN3IFx8XHwgbm9wCi0KLTArMDE1NCA8bXZ0YWNoaT46Ci0gMTU0Ogk1ZCA3MCBmMCAwMCAJbXZ0YWNoaSBmcCBcfFx8IG5vcAotCi0wKzAxNTggPG12dGFjbG8+OgotIDE1ODoJNWQgNzEgZjAgMDAgCW12dGFjbG8gZnAgXHxcfCBub3AKLQotMCswMTVjIDxtdnRjPjoKLSAxNWM6CTEwIGFkIGYwIDAwIAltdnRjIGZwLHBzdyBcfFx8IG5vcAotCi0wKzAxNjAgPG5lZz46Ci0gMTYwOgkwZCAzZCBmMCAwMCAJbmVnIGZwLGZwIFx8XHwgbm9wCi0KLTArMDE2NCA8bm9wPjoKLSAxNjQ6CTcwIDAwIGYwIDAwIAlub3AgXHxcfCBub3AKLQotMCswMTY4IDxub3Q+OgotIDE2ODoJMGQgYmQgZjAgMDAgCW5vdCBmcCxmcCBcfFx8IG5vcAotCi0wKzAxNmMgPHJhYz46Ci0gMTZjOglkZCBjMCAwMCAwMCAJc2V0aCBmcCxbI10qMHgwCi0KLTArMDE3MCA8c2xsPjoKLSAxNzA6CTFkIDRkIGYwIDAwIAlzbGwgZnAsZnAgXHxcfCBub3AKLQotMCswMTc0IDxzbGwzPjoKLSAxNzQ6CTlkIGNkIDAwIDAwIAlzbGwzIGZwLGZwLFsjXSowCi0KLTArMDE3OCA8c2xsaT46Ci0gMTc4Ogk1ZCA0MCBmMCAwMCAJc2xsaSBmcCxbI10qMHgwIFx8XHwgbm9wCi0KLTArMDE3YyA8c3JhPjoKLSAxN2M6CTFkIDJkIGYwIDAwIAlzcmEgZnAsZnAgXHxcfCBub3AKLQotMCswMTgwIDxzcmEzPjoKLSAxODA6CTlkIGFkIDAwIDAwIAlzcmEzIGZwLGZwLFsjXSowCi0KLTArMDE4NCA8c3JhaT46Ci0gMTg0Ogk1ZCAyMCBmMCAwMCAJc3JhaSBmcCxbI10qMHgwIFx8XHwgbm9wCi0KLTArMDE4OCA8c3JsPjoKLSAxODg6CTFkIDBkIGYwIDAwIAlzcmwgZnAsZnAgXHxcfCBub3AKLQotMCswMThjIDxzcmwzPjoKLSAxOGM6CTlkIDhkIDAwIDAwIAlzcmwzIGZwLGZwLFsjXSowCi0KLTArMDE5MCA8c3JsaT46Ci0gMTkwOgk1ZCAwMCBmMCAwMCAJc3JsaSBmcCxbI10qMHgwIFx8XHwgbm9wCi0KLTArMDE5NCA8c3Q+OgotIDE5NDoJMmQgNGQgZjAgMDAgCXN0IGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxOTggPHN0XzI+OgotIDE5ODoJMmQgNGQgZjAgMDAgCXN0IGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxOWMgPHN0X2Q+OgotIDE5YzoJYWQgNGQgMDAgMDAgCXN0IGZwLEBcKDAsZnBcKQotCi0wKzAxYTAgPHN0X2QyPjoKLSAxYTA6CWFkIDRkIDAwIDAwIAlzdCBmcCxAXCgwLGZwXCkKLQotMCswMWE0IDxzdGI+OgotIDFhNDoJMmQgMGQgZjAgMDAgCXN0YiBmcCxAZnAgXHxcfCBub3AKLQotMCswMWE4IDxzdGJfMj46Ci0gMWE4OgkyZCAwZCBmMCAwMCAJc3RiIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxYWMgPHN0Yl9kPjoKLSAxYWM6CWFkIDBkIDAwIDAwIAlzdGIgZnAsQFwoMCxmcFwpCi0KLTArMDFiMCA8c3RiX2QyPjoKLSAxYjA6CWFkIDBkIDAwIDAwIAlzdGIgZnAsQFwoMCxmcFwpCi0KLTArMDFiNCA8c3RoPjoKLSAxYjQ6CTJkIDJkIGYwIDAwIAlzdGggZnAsQGZwIFx8XHwgbm9wCi0KLTArMDFiOCA8c3RoXzI+OgotIDFiODoJMmQgMmQgZjAgMDAgCXN0aCBmcCxAZnAgXHxcfCBub3AKLQotMCswMWJjIDxzdGhfZD46Ci0gMWJjOglhZCAyZCAwMCAwMCAJc3RoIGZwLEBcKDAsZnBcKQotCi0wKzAxYzAgPHN0aF9kMj46Ci0gMWMwOglhZCAyZCAwMCAwMCAJc3RoIGZwLEBcKDAsZnBcKQotCi0wKzAxYzQgPHN0X3BsdXM+OgotIDFjNDoJMmQgNmQgZjAgMDAgCXN0IGZwLEBcK2ZwIFx8XHwgbm9wCi0KLTArMDFjOCA8c3RfbWludXM+OgotIDFjODoJMmQgN2QgZjAgMDAgCXN0IGZwLEAtZnAgXHxcfCBub3AKLQotMCswMWNjIDxzdWI+OgotIDFjYzoJMGQgMmQgZjAgMDAgCXN1YiBmcCxmcCBcfFx8IG5vcAotCi0wKzAxZDAgPHN1YnY+OgotIDFkMDoJMGQgMGQgZjAgMDAgCXN1YnYgZnAsZnAgXHxcfCBub3AKLQotMCswMWQ0IDxzdWJ4PjoKLSAxZDQ6CTBkIDFkIGYwIDAwIAlzdWJ4IGZwLGZwIFx8XHwgbm9wCi0KLTArMDFkOCA8dHJhcD46Ci0gMWQ4OgkxMCBmMCBmMCAwMCAJdHJhcCBbI10qMHgwIFx8XHwgbm9wCi0KLTArMDFkYyA8dW5sb2NrPjoKLSAxZGM6CTJkIDVkIGYwIDAwIAl1bmxvY2sgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDFlMCA8cHVzaD46Ci0gMWUwOgkyZCA3ZiBmMCAwMCAJcHVzaCBmcCBcfFx8IG5vcAotCi0wKzAxZTQgPHBvcD46Ci0gMWU0OgkyZCBlZiBmMCAwMCAJcG9wIGZwIFx8XHwgbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkZGQwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIE0zMlIgYXNzZW1ibGVyIHRlc3RzdWl0ZS4KLQotaWYgW2lzdGFyZ2V0IG0zMnIqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFsbGluc24iCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI0NTY5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5zCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLSAuZGF0YQotZm9vZGF0YTogLndvcmQgNDIKLSAudGV4dAotZm9vdGV4dDoKLQkudGV4dAotCS5nbG9iYWwgYWRkCi1hZGQ6Ci0JYWRkIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZDMKLWFkZDM6Ci0JYWRkMyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBhbmQKLWFuZDoKLQlhbmQgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgYW5kMwotYW5kMzoKLQlhbmQzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIG9yCi1vcjoKLQlvciBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBvcjMKLW9yMzoKLQlvcjMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgeG9yCi14b3I6Ci0JeG9yIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHhvcjMKLXhvcjM6Ci0JeG9yMyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBhZGRpCi1hZGRpOgotCWFkZGkgZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgYWRkdgotYWRkdjoKLQlhZGR2IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZHYzCi1hZGR2MzoKLQlhZGR2MyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBhZGR4Ci1hZGR4OgotCWFkZHggZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgYmM4Ci1iYzg6Ci0JYmMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiYzhfcwotYmM4X3M6Ci0JYmMucyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJjMjQKLWJjMjQ6Ci0JYmMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiYzI0X2wKLWJjMjRfbDoKLQliYy5sIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmVxCi1iZXE6Ci0JYmVxIGZwLGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmVxegotYmVxejoKLQliZXF6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmdlegotYmdlejoKLQliZ2V6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmd0egotYmd0ejoKLQliZ3R6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmxlegotYmxlejoKLQlibGV6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmx0egotYmx0ejoKLQlibHR6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5legotYm5lejoKLQlibmV6IGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmw4Ci1ibDg6Ci0JYmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibDhfcwotYmw4X3M6Ci0JYmwucyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsMjQKLWJsMjQ6Ci0JYmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibDI0X2wKLWJsMjRfbDoKLQlibC5sIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5jOAotYm5jODoKLQlibmMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmM4X3MKLWJuYzhfczoKLQlibmMucyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuYzI0Ci1ibmMyNDoKLQlibmMgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmMyNF9sCi1ibmMyNF9sOgotCWJuYy5sIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5lCi1ibmU6Ci0JYm5lIGZwLGZwLGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYnJhOAotYnJhODoKLQlicmEgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBicmE4X3MKLWJyYThfczoKLQlicmEucyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJyYTI0Ci1icmEyNDoKLQlicmEgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBicmEyNF9sCi1icmEyNF9sOgotCWJyYS5sIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgY21wCi1jbXA6Ci0JY21wIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGNtcGkKLWNtcGk6Ci0JY21waSBmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBjbXB1Ci1jbXB1OgotCWNtcHUgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgY21wdWkKLWNtcHVpOgotCWNtcHVpIGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGRpdgotZGl2OgotCWRpdiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBkaXZ1Ci1kaXZ1OgotCWRpdnUgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgcmVtCi1yZW06Ci0JcmVtIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHJlbXUKLXJlbXU6Ci0JcmVtdSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBqbAotamw6Ci0JamwgZnAKLQkudGV4dAotCS5nbG9iYWwgam1wCi1qbXA6Ci0Jam1wIGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkCi1sZDoKLQlsZCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGRfMgotbGRfMjoKLQlsZCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZF9kCi1sZF9kOgotCWxkIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRfZDIKLWxkX2QyOgotCWxkIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGRiCi1sZGI6Ci0JbGRiIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZGJfMgotbGRiXzI6Ci0JbGRiIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkYl9kCi1sZGJfZDoKLQlsZGIgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGJfZDIKLWxkYl9kMjoKLQlsZGIgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGgKLWxkaDoKLQlsZGggZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkaF8yCi1sZGhfMjoKLQlsZGggZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRoX2QKLWxkaF9kOgotCWxkaCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkaF9kMgotbGRoX2QyOgotCWxkaCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWIKLWxkdWI6Ci0JbGR1YiBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGR1Yl8yCi1sZHViXzI6Ci0JbGR1YiBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHViX2QKLWxkdWJfZDoKLQlsZHViIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGR1Yl9kMgotbGR1Yl9kMjoKLQlsZHViIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGR1aAotbGR1aDoKLQlsZHVoIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZHVoXzIKLWxkdWhfMjoKLQlsZHVoIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWhfZAotbGR1aF9kOgotCWxkdWggZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHVoX2QyCi1sZHVoX2QyOgotCWxkdWggZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZF9wbHVzCi1sZF9wbHVzOgotCWxkIGZwLEBmcCsKLQkudGV4dAotCS5nbG9iYWwgbGQyNAotbGQyNDoKLQlsZDI0IGZwLGZvb2RhdGEKLQkudGV4dAotCS5nbG9iYWwgbGRpOAotbGRpODoKLQlsZGkgZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBsZGkxNgotbGRpMTY6Ci0JbGRpIGZwLDI1NgotCS50ZXh0Ci0JLmdsb2JhbCBsb2NrCi1sb2NrOgotCWxvY2sgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIG1hY2hpCi1tYWNoaToKLQltYWNoaSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtYWNsbwotbWFjbG86Ci0JbWFjbG8gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbWFjd2hpCi1tYWN3aGk6Ci0JbWFjd2hpIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG1hY3dsbwotbWFjd2xvOgotCW1hY3dsbyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWwKLW11bDoKLQltdWwgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsaGkKLW11bGhpOgotCW11bGhpIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bGxvCi1tdWxsbzoKLQltdWxsbyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWx3aGkKLW11bHdoaToKLQltdWx3aGkgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsd2xvCi1tdWx3bG86Ci0JbXVsd2xvIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12Ci1tdjoKLQltdiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdmZhY2hpCi1tdmZhY2hpOgotCW12ZmFjaGkgZnAKLQkudGV4dAotCS5nbG9iYWwgbXZmYWNsbwotbXZmYWNsbzoKLQltdmZhY2xvIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmFjbWkKLW12ZmFjbWk6Ci0JbXZmYWNtaSBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdmZjCi1tdmZjOgotCW12ZmMgZnAscHN3Ci0JLnRleHQKLQkuZ2xvYmFsIG12dGFjaGkKLW12dGFjaGk6Ci0JbXZ0YWNoaSBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdnRhY2xvCi1tdnRhY2xvOgotCW12dGFjbG8gZnAKLQkudGV4dAotCS5nbG9iYWwgbXZ0YwotbXZ0YzoKLQltdnRjIGZwLHBzdwotCS50ZXh0Ci0JLmdsb2JhbCBuZWcKLW5lZzoKLQluZWcgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbm9wCi1ub3A6Ci0Jbm9wCi0JLnRleHQKLQkuZ2xvYmFsIG5vdAotbm90OgotCW5vdCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCByYWMKLXJhYzoKLQkudGV4dAotCS5nbG9iYWwgcmFjaAotcmFjaDoKLQkudGV4dAotCS5nbG9iYWwgcnRlCi1ydGU6Ci0JLnRleHQKLQkuZ2xvYmFsIHNldGgKLXNldGg6Ci0Jc2V0aCBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNsbAotc2xsOgotCXNsbCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzbGwzCi1zbGwzOgotCXNsbDMgZnAsZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzbGxpCi1zbGxpOgotCXNsbGkgZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzcmEKLXNyYToKLQlzcmEgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc3JhMwotc3JhMzoKLQlzcmEzIGZwLGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3JhaQotc3JhaToKLQlzcmFpIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3JsCi1zcmw6Ci0Jc3JsIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHNybDMKLXNybDM6Ci0Jc3JsMyBmcCxmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNybGkKLXNybGk6Ci0Jc3JsaSBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHN0Ci1zdDoKLQlzdCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgc3RfMgotc3RfMjoKLQlzdCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdF9kCi1zdF9kOgotCXN0IGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RfZDIKLXN0X2QyOgotCXN0IGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgc3RiCi1zdGI6Ci0Jc3RiIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdGJfMgotc3RiXzI6Ci0Jc3RiIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0Yl9kCi1zdGJfZDoKLQlzdGIgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGJfZDIKLXN0Yl9kMjoKLQlzdGIgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGgKLXN0aDoKLQlzdGggZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN0aF8yCi1zdGhfMjoKLQlzdGggZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RoX2QKLXN0aF9kOgotCXN0aCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0aF9kMgotc3RoX2QyOgotCXN0aCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIHN0X3BsdXMKLXN0X3BsdXM6Ci0Jc3QgZnAsQCtmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdF9taW51cwotc3RfbWludXM6Ci0Jc3QgZnAsQC1mcAotCS50ZXh0Ci0JLmdsb2JhbCBzdWIKLXN1YjoKLQlzdWIgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc3Vidgotc3VidjoKLQlzdWJ2IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN1YngKLXN1Yng6Ci0Jc3VieCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCB0cmFwCi10cmFwOgotCXRyYXAgMAotCS50ZXh0Ci0JLmdsb2JhbCB1bmxvY2sKLXVubG9jazoKLQl1bmxvY2sgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIHB1c2gKLXB1c2g6Ci0JcHVzaCBmcAotCS50ZXh0Ci0JLmdsb2JhbCBwb3AKLXBvcDoKLQlwb3AgZnAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZXJyb3IuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9lcnJvci5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODg3MTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9lcnJvci5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIFRlc3QgYXNzZW1ibGVyIHdhcm5pbmdzIGFuZCBlcnJvcnMuCi0KLWlmIFtpc3RhcmdldCBtMzJyLSotKl0gewotCi0gICAgbG9hZF9saWIgZ2FzLWRnLmV4cAotCi0gICAgZGctaW5pdAotCi0gICAgZGctcnVudGVzdCAiJHNyY2Rpci8kc3ViZGlyL3dyb25nc2l6ZS5zIiAiIiAiIgotICAgIGRnLXJ1bnRlc3QgIiRzcmNkaXIvJHN1YmRpci9pbnRlcmZlcmUucyIgIiIgIiIKLSAgICBkZy1ydW50ZXN0ICIkc3JjZGlyLyRzdWJkaXIvb3V0b2ZyYW5nZS5zIiAiIiAiIgotCi0gICAgZGctZmluaXNoCi0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljZjAyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogZnNsb3QKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAgPGJsPjoKLSAqMDoJN2UgMDAgZjAgMDAgCWJsIDAgPGJsPiBcfFx8IG5vcAotICo0Ogk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArOCA8Ymxfcz46Ci0gKjg6CTdlIDAwIGYwIDAwIAlibCA4IDxibF9zPiBcfFx8IG5vcAotICpjOgk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMTAgPGJyYT46Ci0gKjEwOgk3ZiAwMCBmMCAwMCAJYnJhIDEwIDxicmE+IFx8XHwgbm9wCi0gKjE0Ogk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMTggPGJyYV9zPjoKLSAqMTg6CTdmIDAwIGYwIDAwIAlicmEgMTggPGJyYV9zPiBcfFx8IG5vcAotICoxYzoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzIwIDxqbD46Ci0gKjIwOgkxZSBjMCBmMCAwMCAJamwgcjAgXHxcfCBub3AKLSAqMjQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsyOCA8dHJhcD46Ci0gKjI4OgkxMCBmNCBmMCAwMCAJdHJhcCBbI10qMHg0IFx8XHwgbm9wCi0gKjJjOgk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmI2NjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBUZXN0IHRoZSBGSUxMLVNMT1QgYXR0cmlidXRlLgotIyBUaGUgRklMTC1TTE9UIGF0dHJpYnV0ZSBlbnN1cmVzIHRoZSBuZXh0IGluc24gYmVnaW5zIG9uIGEgMzIgYnl0ZSBib3VuZGFyeS4KLSMgVGhpcyBpcyBuZWVkZWQgZm9yIGV4YW1wbGUgd2l0aCBibCBiZWNhdXNlIHRoZSBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuCi0jIHRvIGEgMzIgYml0IGJvdW5kYXJ5LgotCi0JLnRleHQKLWJsOgotCWJsIGJsCi0JbGRpIHIwLCM4Ci1ibF9zOgotCWJsLnMgYmxfcwotCWxkaSByMCwjOAotCi1icmE6Ci0JYnJhIGJyYQotCWxkaSByMCwjOAotYnJhX3M6Ci0JYnJhLnMgYnJhX3MKLQlsZGkgcjAsIzgKLQotamw6Ci0JamwgcjAKLQlsZGkgcjAsIzgKLQotdHJhcDoKLQl0cmFwICM0Ci0JbGRpIHIwLCM4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90eC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdHguZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlMmQxYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90eC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2FzOiAtbTMycngKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBmc2xvdHgKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAgPGJjbD46Ci0gKjA6CTc4IDAwIGYwIDAwIAliY2wgMCA8YmNsPiBcfFx8IG5vcAotICo0Ogk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArOCA8YmNsX3M+OgotICo4Ogk3OCAwMCBmMCAwMCAJYmNsIDggPGJjbF9zPiBcfFx8IG5vcAotICpjOgk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMTAgPGJuY2w+OgotICAxMDoJNzkgMDAgZjAgMDAgCWJuY2wgMTAgPGJuY2w+IFx8XHwgbm9wCi0gIDE0Ogk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMTggPGJuY2xfcz46Ci0gIDE4Ogk3OSAwMCBmMCAwMCAJYm5jbCAxOCA8Ym5jbF9zPiBcfFx8IG5vcAotICAxYzoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdHgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3R4LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmIyMzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdHgucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgVGVzdCB0aGUgRklMTC1TTE9UIGF0dHJpYnV0ZS4KLSMgVGhlIEZJTEwtU0xPVCBhdHRyaWJ1dGUgZW5zdXJlcyB0aGUgbmV4dCBpbnNuIGJlZ2lucyBvbiBhIDMyIGJ5dGUgYm91bmRhcnkuCi0jIFRoaXMgaXMgbmVlZGVkIGZvciBleGFtcGxlIHdpdGggYmwgYmVjYXVzZSB0aGUgc3Vicm91dGluZSB3aWxsIHJldHVybgotIyB0byBhIDMyIGJpdCBib3VuZGFyeS4KLQotCS50ZXh0Ci1iY2w6Ci0JYmNsIGJjbAotCWxkaSByMCwjOAotYmNsX3M6Ci0JYmNsLnMgYmNsX3MKLQlsZGkgcjAsIzgKLQotYm5jbDoKLQlibmNsIGJuY2wKLQlsZGkgcjAsIzgKLWJuY2xfczoKLQlibmNsLnMgYm5jbF9zCi0JbGRpIHIwLCM4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjY2I4Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IGhpZ2gtMQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAqIDxmb28+OgotICowOglkNCBjMCAwMCAwMSAJc2V0aCByNCxbI10qMHgxCi1bIAldKjA6IFJfTTMyUl9ISTE2X1VMTwkudGV4dAotICo0Ogk4NCBlNCAwMCAwMCAJb3IzIHI0LHI0LFsjXSoweDAKLVsgCV0qNDogUl9NMzJSX0xPMTYJLnRleHQKLSAqODoJZDQgYzAgMTIgMzQgCXNldGggcjQsWyNdKjB4MTIzNAotICpjOgk4NCBlNCA4NyA2NSAJb3IzIHI0LHI0LFsjXSoweDg3NjUKLSAqMTA6CWQ0IGMwIDEyIDM1IAlzZXRoIHI0LFsjXSoweDEyMzUKLSAqMTQ6CTg0IGU0IDg3IDY1IAlvcjMgcjQscjQsWyNdKjB4ODc2NQotICoxODoJZDQgYzAgODcgNjUgCXNldGggcjQsWyNdKjB4ODc2NQotICoxYzoJODQgZTQgNDMgMjEgCW9yMyByNCxyNCxbI10qMHg0MzIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1ZDFkMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotOyBUZXN0IGhpZ2gvc2hpZ2ggaGFuZGxpbmcuCi0KLWZvbzoKLQlzZXRoIHI0LCNoaWdoKGZvbysweDEwMDAwKQotCW9yMyAgcjQscjQsI2xvdyhmb28rMHgxMDAwMCkKLQotCXNldGggcjQsI2hpZ2goMHgxMjM0ODc2NSkKLQlvcjMgIHI0LHI0LCNsb3coMHgxMjM0ODc2NSkKLQotCXNldGggcjQsI3NoaWdoKDB4MTIzNDg3NjUpCi0Jb3IzICByNCxyNCwjbG93KDB4MTIzNDg3NjUpCi0KLQlzZXRoIHI0LCNzaGlnaCgweDg3NjU0MzIxKQotCW9yMyAgcjQscjQsI2xvdygweDg3NjU0MzIxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9pbnRlcmZlcmUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaW50ZXJmZXJlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NWVjZGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9pbnRlcmZlcmUucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTsgVGVzdCBlcnJvciBtZXNzYWdlcyBpbiBpbnN0YW5jZXMgd2hlcmUgb3V0cHV0IG9wZXJhbmRzIGludGVyZmVyZS4KLQotOyB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IG0zMnItKi0qIH0gfQotOyB7IGRnLW9wdGlvbnMgLW0zMnJ4IH0KLQotaW50ZXJmZXJlOgotCXRyYXAgIzEgICAgICB8fCBjbXAgIHIzLCByNAk7IHsgZGctZXJyb3IgIndyaXRlIHRvIHRoZSBzYW1lIiB9Ci0JCTsgeyBkZy13YXJuaW5nICJzYW1lIiAib3V0LT5pbiIgeyB0YXJnZXQgKi0qLSogfSB7IDcgfSB9Ci0JcnRlICAgICAgICAgIHx8IGFkZHggcjMsIHI0CTsgeyBkZy1lcnJvciAid3JpdGUgdG8gdGhlIHNhbWUiIH0KLQkJOyB7IGRnLXdhcm5pbmcgInNhbWUiICJvdXQtPmluIiB7IHRhcmdldCAqLSotKiB9IHsgOSB9IH0KLQljbXAgIHIxLCByMiAgfHwgYWRkeCByMywgcjQJOyB7IGRnLWVycm9yICJ3cml0ZSB0byB0aGUgc2FtZSIgfQotCQk7IHsgZGctd2FybmluZyAic2FtZSIgIm91dC0+aW4iIHsgdGFyZ2V0ICotKi0qIH0geyAxMSB9IH0KLQltdnRjIHIwLCBwc3cgfHwgYWRkeCByMSwgcjQJOyB7IGRnLWVycm9yICJ3cml0ZSB0byB0aGUgc2FtZSIgfQotCQk7IHsgZGctd2FybmluZyAic2FtZSIgIm91dC0+aW4iIHsgdGFyZ2V0ICotKi0qIH0geyAxMyB9IH0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMyci5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnIuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyMzY0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMyci5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgTTMyUiB0ZXN0Y2FzZXMKLQotaWYgW2lzdGFyZ2V0IG0zMnIqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgImhpZ2gtMSIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWxheC0xIgotICAgIHJ1bl9kdW1wX3Rlc3QgInVwcGVyY2FzZSIKLSAgICBydW5fZHVtcF90ZXN0ICJmc2xvdCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMycnguZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMycnguZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxM2RkMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnJ4LmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotI2FzOiAtbTMycnggLS1uby13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0cyAtLWhpZGRlbiAtTwotI29iamR1bXA6IC1kcgotI25hbWU6IG0zMnJ4Ci0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxiY2w+OgotICAgMDoJNzggMDAgZjAgMDAgCWJjbCAwIDxiY2w+IFx8XHwgbm9wCi0KLTArMDAwNCA8Ym5jbD46Ci0gICA0Ogk3OSBmZiBmMCAwMCAJYm5jbCAwIDxiY2w+IFx8XHwgbm9wCi0KLTArMDAwOCA8Y21wej46Ci0gICA4OgkwMCA3ZCBmMCAwMCAJY21weiBmcCBcfFx8IG5vcAotCi0wKzAwMGMgPGNtcGVxPjoKLSAgIGM6CTBkIDZkIGYwIDAwIAljbXBlcSBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMTAgPG1hY2xoMT46Ci0gIDEwOgk1ZCBjZCBmMCAwMCAJbWFjbGgxIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAxNCA8bXNibG8+OgotICAxNDoJNWQgZGQgZjAgMDAgCW1zYmxvIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAxOCA8bXVsd3UxPjoKLSAgMTg6CTVkIGFkIGYwIDAwIAltdWx3dTEgZnAsZnAgXHxcfCBub3AKLQotMCswMDFjIDxtYWN3dTE+OgotICAxYzoJNWQgYmQgZjAgMDAgCW1hY3d1MSBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMjAgPHNhZGQ+OgotICAyMDoJNTAgZTQgZjAgMDAgCXNhZGQgXHxcfCBub3AKLQotMCswMDI0IDxzYXRiPjoKLSAgMjQ6CThkIDZkIDAzIDAwIAlzYXRiIGZwLGZwCi0KLTArMDAyOCA8bXVsaGk+OgotICAyODoJM2QgOGQgZjAgMDAgCW11bGhpIGZwLGZwLGExIFx8XHwgbm9wCi0KLTArMDAyYyA8bXVsbG8+OgotICAyYzoJM2QgMWQgZjAgMDAgCW11bGxvIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAzMCA8ZGl2aD46Ci0gIDMwOgk5ZCAwZCAwMCAxMCAJZGl2aCBmcCxmcAotCi0wKzAwMzQgPG1hY2hpPjoKLSAgMzQ6CTNkIGNkIGYwIDAwIAltYWNoaSBmcCxmcCxhMSBcfFx8IG5vcAotCi0wKzAwMzggPG1hY2xvPjoKLSAgMzg6CTNkIDVkIGYwIDAwIAltYWNsbyBmcCxmcCBcfFx8IG5vcAotCi0wKzAwM2MgPG12ZmFjaGk+OgotICAzYzoJNWQgZjQgZjAgMDAgCW12ZmFjaGkgZnAsYTEgXHxcfCBub3AKLQotMCswMDQwIDxtdmZhY21pPjoKLSAgNDA6CTVkIGY2IGYwIDAwIAltdmZhY21pIGZwLGExIFx8XHwgbm9wCi0KLTArMDA0NCA8bXZmYWNsbz46Ci0gIDQ0Ogk1ZCBmNSBmMCAwMCAJbXZmYWNsbyBmcCxhMSBcfFx8IG5vcAotCi0wKzAwNDggPG12dGFjaGk+OgotICA0ODoJNWQgNzQgZjAgMDAgCW12dGFjaGkgZnAsYTEgXHxcfCBub3AKLQotMCswMDRjIDxtdnRhY2xvPjoKLSAgNGM6CTVkIDcxIGYwIDAwIAltdnRhY2xvIGZwIFx8XHwgbm9wCi0KLTArMDA1MCA8cmFjPjoKLSAgNTA6CTU0IDkwIGYwIDAwIAlyYWMgYTEgXHxcfCBub3AKLQotMCswMDU0IDxyYWNfZHM+OgotICA1NDoJNTQgOTAgZjAgMDAgCXJhYyBhMSBcfFx8IG5vcAotCi0wKzAwNTggPHJhY19kc2k+OgotICA1ODoJNTAgOTQgZjAgMDAgCXJhYyBhMCxhMSBcfFx8IG5vcAotCi0wKzAwNWMgPHJhY2g+OgotICA1YzoJNTQgODAgZjAgMDAgCXJhY2ggYTEgXHxcfCBub3AKLQotMCswMDYwIDxyYWNoX2RzPjoKLSAgNjA6CTUwIDg0IGYwIDAwIAlyYWNoIGEwLGExIFx8XHwgbm9wCi0KLTArMDA2NCA8cmFjaF9kc2k+OgotICA2NDoJNTQgODEgZjAgMDAgCXJhY2ggYTEsYTAsIzB4MiBcfFx8IG5vcAotCi0wKzAwNjggPGJjX19hZGQ+OgotICA2ODoJN2MgZTYgOGQgYWQgCWJjIDAgPGJjbD4gXHxcfCBhZGQgZnAsZnAKLSAgNmM6CTdjIGU1IDBkIGFkIAliYyAwIDxiY2w+IC0+IGFkZCBmcCxmcAotCi0wKzAwNzAgPGJjbF9fYWRkaT46Ci0gIDcwOgk3OCBlNCBjZCA0ZCAJYmNsIDAgPGJjbD4gXHxcfCBhZGRpIGZwLCM3NwotICA3NDoJNzggZTMgY2QgNGQgCWJjbCAwIDxiY2w+IFx8XHwgYWRkaSBmcCwjNzcKLQotMCswMDc4IDxibF9fYWRkdj46Ci0gIDc4Ogk3ZSBlMiA4ZCA4ZCAJYmwgMCA8YmNsPiBcfFx8IGFkZHYgZnAsZnAKLSAgN2M6CTdlIGUxIDhkIDhkIAlibCAwIDxiY2w+IFx8XHwgYWRkdiBmcCxmcAotCi0wKzAwODAgPGJuY19fYWRkeD46Ci0gIDgwOgk3ZCBlMCA4ZCA5ZCAJYm5jIDAgPGJjbD4gXHxcfCBhZGR4IGZwLGZwCi0gIDg0Ogk3ZCBkZiAwZCA5ZCAJYm5jIDAgPGJjbD4gLT4gYWRkeCBmcCxmcAotCi0wKzAwODggPGJuY2xfX2FuZD46Ci0gIDg4Ogk3OSBkZSA4ZCBjZCAJYm5jbCAwIDxiY2w+IFx8XHwgYW5kIGZwLGZwCi0gIDhjOgkwZCBjZCA3OSBkZCAJYW5kIGZwLGZwIC0+IGJuY2wgMCA8YmNsPgotCi0wKzAwOTAgPGJyYV9fY21wPjoKLSAgOTA6CTdmIGRjIDhkIDRkIAlicmEgMCA8YmNsPiBcfFx8IGNtcCBmcCxmcAotICA5NDoJN2YgZGIgOGQgNGQgCWJyYSAwIDxiY2w+IFx8XHwgY21wIGZwLGZwCi0KLTArMDA5OCA8amxfX2NtcGVxPjoKLSAgOTg6CTFlIGNkIDhkIDZkIAlqbCBmcCBcfFx8IGNtcGVxIGZwLGZwCi0gIDljOgkxZSBjZCA4ZCA2ZCAJamwgZnAgXHxcfCBjbXBlcSBmcCxmcAotCi0wKzAwYTAgPGptcF9fY21wdT46Ci0gIGEwOgkxZiBjZCA4ZCA1ZCAJam1wIGZwIFx8XHwgY21wdSBmcCxmcAotICBhNDoJMWYgY2QgOGQgNWQgCWptcCBmcCBcfFx8IGNtcHUgZnAsZnAKLQotMCswMGE4IDxsZF9fY21wej46Ci0gIGE4OgkyZCBjZCA4MCA3MSAJbGQgZnAsQGZwIFx8XHwgY21weiByMQotICBhYzoJMmQgY2QgODAgNzEgCWxkIGZwLEBmcCBcfFx8IGNtcHogcjEKLQotMCswMGIwIDxsZF9fbGRpPjoKLSAgYjA6CTJkIGUxIGUyIDRkIAlsZCBmcCxAcjFcKyBcfFx8IGxkaSByMiwjNzcKLSAgYjQ6CTJkIGUxIGUyIDRkIAlsZCBmcCxAcjFcKyBcfFx8IGxkaSByMiwjNzcKLQotMCswMGI4IDxsZGJfX212PjoKLSAgYjg6CTJkIDhkIDkyIDhkIAlsZGIgZnAsQGZwIFx8XHwgbXYgcjIsZnAKLSAgYmM6CTJkIDhkIDEyIDhkIAlsZGIgZnAsQGZwIC0+IG12IHIyLGZwCi0KLTArMDBjMCA8bGRoX19uZWc+OgotICBjMDoJMmQgYWQgODIgM2QgCWxkaCBmcCxAZnAgXHxcfCBuZWcgcjIsZnAKLSAgYzQ6CTJkIGFkIDAyIDNkIAlsZGggZnAsQGZwIC0+IG5lZyByMixmcAotCi0wKzAwYzggPGxkdWJfX25vcD46Ci0gIGM4OgkyZCA5ZCBmMCAwMCAJbGR1YiBmcCxAZnAgXHxcfCBub3AKLSAgY2M6CTJkIDlkIGYwIDAwIAlsZHViIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwZDAgPGxkdWhfX25vdD46Ci0gIGQwOgkyZCBiZCA4MiBiZCAJbGR1aCBmcCxAZnAgXHxcfCBub3QgcjIsZnAKLSAgZDQ6CTJkIGJkIDAyIGJkIAlsZHVoIGZwLEBmcCAtPiBub3QgcjIsZnAKLQotMCswMGQ4IDxsb2NrX19vcj46Ci0gIGQ4OgkyZCBkZCA4MiBlZCAJbG9jayBmcCxAZnAgXHxcfCBvciByMixmcAotICBkYzoJMmQgZGQgMDIgZWQgCWxvY2sgZnAsQGZwIC0+IG9yIHIyLGZwCi0KLTArMDBlMCA8bXZmY19fc3ViPjoKLSAgZTA6CTFkIDkxIDgyIDJkIAltdmZjIGZwLGNiciBcfFx8IHN1YiByMixmcAotICBlNDoJMWQgOTEgMDIgMmQgCW12ZmMgZnAsY2JyIC0+IHN1YiByMixmcAotCi0wKzAwZTggPG12dGNfX3N1YnY+OgotICBlODoJMTIgYWQgODIgMGQgCW12dGMgZnAsc3BpIFx8XHwgc3VidiByMixmcAotICBlYzoJMTIgYWQgODIgMGQgCW12dGMgZnAsc3BpIFx8XHwgc3VidiByMixmcAotCi0wKzAwZjAgPHJ0ZV9fc3VieD46Ci0gIGYwOgkxMCBkNiA4MiAyZCAJcnRlIFx8XHwgc3ViIHIyLGZwCi0gIGY0OgkxMCBkNiAwMiAxZCAJcnRlIC0+IHN1YnggcjIsZnAKLQotMCswMGY4IDxzbGxfX3hvcj46Ci0gIGY4OgkxZCA0MSA4MiBkZCAJc2xsIGZwLHIxIFx8XHwgeG9yIHIyLGZwCi0gIGZjOgkxZCA0MSAwMiBkZCAJc2xsIGZwLHIxIC0+IHhvciByMixmcAotCi0wKzAxMDAgPHNsbGlfX21hY2hpPjoKLSAxMDA6CTVkIDU2IGIyIDRkIAlzbGxpIGZwLCMweDE2IFx8XHwgbWFjaGkgcjIsZnAKLSAxMDQ6CTVkIDU2IDMyIDRkIAlzbGxpIGZwLCMweDE2IC0+IG1hY2hpIHIyLGZwCi0KLTArMDEwOCA8c3JhX19tYWNsaDE+OgotIDEwODoJMWQgMmQgZDIgY2QgCXNyYSBmcCxmcCBcfFx8IG1hY2xoMSByMixmcAotIDEwYzoJMWQgMmQgNTIgY2QgCXNyYSBmcCxmcCAtPiBtYWNsaDEgcjIsZnAKLQotMCswMTEwIDxzcmFpX19tYWNsbz46Ci0gMTEwOgk1ZCAzNiBiMiA1ZCAJc3JhaSBmcCwjMHgxNiBcfFx8IG1hY2xvIHIyLGZwCi0gMTE0Ogk1ZCAzNiAzMiA1ZCAJc3JhaSBmcCwjMHgxNiAtPiBtYWNsbyByMixmcAotCi0wKzAxMTggPHNybF9fbWFjd2hpPjoKLSAxMTg6CTFkIDBkIGIyIDZkIAlzcmwgZnAsZnAgXHxcfCBtYWN3aGkgcjIsZnAKLSAxMWM6CTFkIDBkIDMyIDZkIAlzcmwgZnAsZnAgLT4gbWFjd2hpIHIyLGZwCi0KLTArMDEyMCA8c3JsaV9fbWFjd2xvPjoKLSAxMjA6CTVkIDE2IGIyIDdkIAlzcmxpIGZwLCMweDE2IFx8XHwgbWFjd2xvIHIyLGZwCi0gMTI0Ogk1ZCAxNiAzMiA3ZCAJc3JsaSBmcCwjMHgxNiAtPiBtYWN3bG8gcjIsZnAKLQotMCswMTI4IDxzdF9fbWFjd3UxPjoKLSAxMjg6CTJkIDRkIGQyIGJkIAlzdCBmcCxAZnAgXHxcfCBtYWN3dTEgcjIsZnAKLSAxMmM6CTJkIDRkIGQyIGJkIAlzdCBmcCxAZnAgXHxcfCBtYWN3dTEgcjIsZnAKLQotMCswMTMwIDxzdF9fbXNibG8+OgotIDEzMDoJMmQgNmQgZDIgZGQgCXN0IGZwLEBcK2ZwIFx8XHwgbXNibG8gcjIsZnAKLSAxMzQ6CTJkIDZkIDUyIGRkIAlzdCBmcCxAXCtmcCAtPiBtc2JsbyByMixmcAotCi0wKzAxMzggPHN0X19tdWw+OgotIDEzODoJMmQgN2QgOTIgNmQgCXN0IGZwLEAtZnAgXHxcfCBtdWwgcjIsZnAKLSAxM2M6CTJkIDdkIDEyIDZkIAlzdCBmcCxALWZwIC0+IG11bCByMixmcAotCi0wKzAxNDAgPHN0Yl9fbXVsaGk+OgotIDE0MDoJMmQgMGQgYjIgMGQgCXN0YiBmcCxAZnAgXHxcfCBtdWxoaSByMixmcAotIDE0NDoJMmQgMGQgYjIgMGQgCXN0YiBmcCxAZnAgXHxcfCBtdWxoaSByMixmcAotCi0wKzAxNDggPHN0aF9fbXVsbG8+OgotIDE0ODoJMmQgMmQgYjIgMWQgCXN0aCBmcCxAZnAgXHxcfCBtdWxsbyByMixmcAotIDE0YzoJMmQgMmQgYjIgMWQgCXN0aCBmcCxAZnAgXHxcfCBtdWxsbyByMixmcAotCi0wKzAxNTAgPHRyYXBfX211bHdoaT46Ci0gMTUwOgkxMCBmMiBiMiAyZCAJdHJhcCAjMHgyIFx8XHwgbXVsd2hpIHIyLGZwCi0gMTU0OgkxMCBmMiBmMCAwMCAJdHJhcCAjMHgyIFx8XHwgbm9wCi0gMTU4OgkzMiAyZCBmMCAwMCAJbXVsd2hpIHIyLGZwIFx8XHwgbm9wCi0KLTArMDE1YyA8dW5sb2NrX19tdWx3bG8+OgotIDE1YzoJMmQgNWQgYjIgM2QgCXVubG9jayBmcCxAZnAgXHxcfCBtdWx3bG8gcjIsZnAKLSAxNjA6CTJkIDVkIGIyIDNkIAl1bmxvY2sgZnAsQGZwIFx8XHwgbXVsd2xvIHIyLGZwCi0KLTArMDE2NCA8YWRkX19tdWx3dTE+OgotIDE2NDoJMGQgYWQgZDIgYWQgCWFkZCBmcCxmcCBcfFx8IG11bHd1MSByMixmcAotIDE2ODoJMGQgYWQgNTIgYWQgCWFkZCBmcCxmcCAtPiBtdWx3dTEgcjIsZnAKLQotMCswMTZjIDxhZGRpX19tdmZhY2hpPjoKLSAxNmM6CTRkIDRkIGQyIGYwIAlhZGRpIGZwLCM3NyBcfFx8IG12ZmFjaGkgcjIKLSAxNzA6CTRkIDRkIGQyIGYwIAlhZGRpIGZwLCM3NyBcfFx8IG12ZmFjaGkgcjIKLQotMCswMTc0IDxhZGR2X19tdmZhY2xvPjoKLSAxNzQ6CTBkIDhkIGQyIGY1IAlhZGR2IGZwLGZwIFx8XHwgbXZmYWNsbyByMixhMQotIDE3ODoJMGQgOGQgZDIgZjUgCWFkZHYgZnAsZnAgXHxcfCBtdmZhY2xvIHIyLGExCi0KLTArMDE3YyA8YWRkeF9fbXZmYWNtaT46Ci0gMTdjOgkwZCA5ZCBkMiBmMiAJYWRkeCBmcCxmcCBcfFx8IG12ZmFjbWkgcjIKLSAxODA6CTBkIDlkIGQyIGYyIAlhZGR4IGZwLGZwIFx8XHwgbXZmYWNtaSByMgotCi0wKzAxODQgPGFuZF9fbXZ0YWNoaT46Ci0gMTg0OgkwZCBjZCBkMiA3MCAJYW5kIGZwLGZwIFx8XHwgbXZ0YWNoaSByMgotIDE4ODoJMGQgY2QgZDIgNzAgCWFuZCBmcCxmcCBcfFx8IG12dGFjaGkgcjIKLQotMCswMThjIDxjbXBfX212dGFjbG8+OgotIDE4YzoJMGQgNGQgZDIgNzEgCWNtcCBmcCxmcCBcfFx8IG12dGFjbG8gcjIKLSAxOTA6CTBkIDRkIGQyIDcxIAljbXAgZnAsZnAgXHxcfCBtdnRhY2xvIHIyCi0KLTArMDE5NCA8Y21wZXFfX3JhYz46Ci0gMTk0OgkwZCA2ZCBkNCA5MCAJY21wZXEgZnAsZnAgXHxcfCByYWMgYTEKLSAxOTg6CTBkIDZkIGQ0IDkwIAljbXBlcSBmcCxmcCBcfFx8IHJhYyBhMQotCi0wKzAxOWMgPGNtcHVfX3JhY2g+OgotIDE5YzoJMGQgNWQgZDAgODQgCWNtcHUgZnAsZnAgXHxcfCByYWNoIGEwLGExCi0gMWEwOgkwZCA1ZCBkNCA4NCAJY21wdSBmcCxmcCBcfFx8IHJhY2ggYTEsYTEKLQotMCswMWE0IDxjbXB6X19zYWRkPjoKLSAxYTQ6CTAwIDdkIGQwIGU0IAljbXB6IGZwIFx8XHwgc2FkZAotIDFhODoJMDAgN2QgZDAgZTQgCWNtcHogZnAgXHxcfCBzYWRkCi0KLTArMDFhYyA8c2M+OgotIDFhYzoJNzQgMDEgZDAgZTQgCXNjIFx8XHwgc2FkZAotCi0wKzAxYjAgPHNuYz46Ci0gMWIwOgk3NSAwMSBkMCBlNCAJc25jIFx8XHwgc2FkZAotCi0wKzAxYjQgPGpjPjoKLSAxYjQ6CTFjIGNkIGYwIDAwIAlqYyBmcCBcfFx8IG5vcAotCi0wKzAxYjggPGpuYz46Ci0gMWI4OgkxZCBjZCBmMCAwMCAJam5jIGZwIFx8XHwgbm9wCi0KLTArMDFiYyA8cGNtcGJ6PjoKLSAxYmM6CTAzIDdkIGYwIDAwIAlwY21wYnogZnAgXHxcfCBub3AKLQotMCswMWMwIDxzYXQ+OgotIDFjMDoJOGQgNmQgMDAgMDAgCXNhdCBmcCxmcAotCi0wKzAxYzQgPHNhdGg+OgotIDFjNDoJOGQgNmQgMDIgMDAgCXNhdGggZnAsZnAKLQotMCswMWM4IDxqY19fcGNtcGJ6PjoKLSAxYzg6CTFjIGNkIDgzIDdkIAlqYyBmcCBcfFx8IHBjbXBieiBmcAotIDFjYzoJMWMgY2QgMDMgN2QgCWpjIGZwIC0+IHBjbXBieiBmcAotCi0wKzAxZDAgPGpuY19fbGRpPjoKLSAxZDA6CTFkIGNkIGVkIDRkIAlqbmMgZnAgXHxcfCBsZGkgZnAsIzc3Ci0gMWQ0OgkxZCBjZCA2ZCA0ZCAJam5jIGZwIC0+IGxkaSBmcCwjNzcKLQotMCswMWQ4IDxzY19fbXY+OgotIDFkODoJNzQgMDEgOWQgODIgCXNjIFx8XHwgbXYgZnAscjIKLSAxZGM6CTc0IDAxIDlkIDgyIAlzYyBcfFx8IG12IGZwLHIyCi0KLTArMDFlMCA8c25jX19uZWc+OgotIDFlMDoJNzUgMDEgOGQgMzIgCXNuYyBcfFx8IG5lZyBmcCxyMgotIDFlNDoJNzUgMDEgOGQgMzIgCXNuYyBcfFx8IG5lZyBmcCxyMgotCi0wKzAxZTggPG5vcF9fc2FkZD46Ci0gMWU4Ogk3MCAwMCBkMCBlNCAJbm9wIFx8XHwgc2FkZAotCi0wKzAxZWMgPHNhZGRfX25vcD46Ci0gMWVjOgk3MCAwMCBkMCBlNCAJbm9wIFx8XHwgc2FkZAotCi0wKzAxZjAgPHNhZGRfX25vcF9yZXZlcnNlPjoKLSAxZjA6CTcwIDAwIGQwIGU0IAlub3AgXHxcfCBzYWRkCi0KLTArMDFmNCA8YWRkX19ub3Q+OgotIDFmNDoJMDAgYTEgODMgYjUgCWFkZCByMCxyMSBcfFx8IG5vdCByMyxyNQotCi0wKzAxZjggPGFkZF9fbm90X2Rlc3RfY2xhc2g+OgotIDFmODoJMDMgYTQgMDMgYjUgCWFkZCByMyxyNCAtPiBub3QgcjMscjUKLQotMCswMWZjIDxhZGRfX25vdF9fc3JjX2NsYXNoPjoKLSAxZmM6CTAzIGE0IDA1IGIzIAlhZGQgcjMscjQgLT4gbm90IHI1LHIzCi0KLTArMDIwMCA8YWRkX19ub3RfX25vX2NsYXNoPjoKLSAyMDA6CTAzIGE0IDg0IGI1IAlhZGQgcjMscjQgXHxcfCBub3QgcjQscjUKLQotMCswMjA0IDxtdWxfX3NyYT46Ci0gMjA0OgkxMyAyNCA5MSA2MiAJc3JhIHIzLHI0IFx8XHwgbXVsIHIxLHIyCi0KLTArMDIwOCA8bXVsX19zcmFfX3JldmVyc2Vfc3JjX2NsYXNoPjoKLSAyMDg6CTEzIDI0IDkxIDYzIAlzcmEgcjMscjQgXHxcfCBtdWwgcjEscjMKLQotMCswMjBjIDxiY19fYWRkXz46Ci0gMjBjOgk3YyAwNCAwMSBhMiAJYmMgMjFjIDxsYWJlbD4gLT4gYWRkIHIxLHIyCi0KLTArMDIxMCA8YWRkX19iYz46Ci0gMjEwOgk3YyAwMyA4MyBhNCAJYmMgMjFjIDxsYWJlbD4gXHxcfCBhZGQgcjMscjQKLQotMCswMjE0IDxiY19fYWRkX19mb3JjZWRfcGFyYWxsZWw+OgotIDIxNDoJN2MgMDIgODUgYTYgCWJjIDIxYyA8bGFiZWw+IFx8XHwgYWRkIHI1LHI2Ci0KLTArMDIxOCA8YWRkX19iY19fZm9yY2VkX3BhcmFsbGVsPjoKLSAyMTg6CTdjIDAxIDg3IGE4IAliYyAyMWMgPGxhYmVsPiBcfFx8IGFkZCByNyxyOAotCi0wKzAyMWMgPGxhYmVsPjoKLSAyMWM6CTcwIDAwIGYwIDAwIAlub3AgXHxcfCBub3AKLQotMCswMjIwIDxtdWx3aGk+OgotIDIyMDoJM2QgMmQgM2QgYWQgCW11bHdoaSBmcCxmcCAtPiBtdWx3aGkgZnAsZnAsYTEKLQotMCswMjI0IDxtdWx3bG8+OgotIDIyNDoJM2QgM2QgM2QgYmQgCW11bHdsbyBmcCxmcCAtPiBtdWx3bG8gZnAsZnAsYTEKLQotMCswMjI4IDxtYWN3aGk+OgotIDIyODoJM2QgNmQgM2QgZWQgCW1hY3doaSBmcCxmcCAtPiBtYWN3aGkgZnAsZnAsYTEKLQotMCswMjJjIDxtYWN3bG8+OgotIDIyYzoJM2QgN2QgM2QgZmQgCW1hY3dsbyBmcCxmcCAtPiBtYWN3bG8gZnAsZnAsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMycnguZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyeC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZDMzZGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyeC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTTMyUnggYXNzZW1ibGVyIHRlc3RzdWl0ZS4KLQotaWYgW2lzdGFyZ2V0IG0zMnIqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgIm0zMnJ4IgotICAgIHJ1bl9kdW1wX3Rlc3QgImZzbG90eCIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWxheC0yIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyeC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyeC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODZkYWIwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMycngucworKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0jIFRlc3QgbmV3IGluc3RydWN0aW9ucwotYnJhbmNocG9pbnQ6Ci0JCi0JLnRleHQKLQkuZ2xvYmFsIGJjbAotYmNsOgotCWJjbCBicmFuY2hwb2ludAotCi0JLnRleHQKLQkuZ2xvYmFsIGJuY2wKLWJuY2w6Ci0JYm5jbCBicmFuY2hwb2ludAotCi0JLnRleHQKLQkuZ2xvYmFsIGNtcHoKLWNtcHo6Ci0JY21weiBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIGNtcGVxCi1jbXBlcToKLQljbXBlcSBmcCwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBtYWNsaDEKLW1hY2xoMToKLQltYWNsaDEgZnAsIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG1hY3NsMAotbXNibG86Ci0JbXNibG8gZnAsIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG11bHd1MQotbXVsd3UxOgotCW11bHd1MSBmcCwgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgbWFjd3UxCi1tYWN3dTE6Ci0JbWFjd3UxIGZwLCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBzYWRkCi1zYWRkOgotCXNhZGQKLQkKLQkudGV4dAotCS5nbG9iYWwgc2F0Ygotc2F0YjoKLQlzYXRiIGZwLCBmcAotCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG11bGhpCi1tdWxoaToKLQltdWxoaSBmcCwgZnAsIGExCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG11bGxvCi1tdWxsbzoKLQltdWxsbyBmcCwgZnAsIGEwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGRpdmgKLWRpdmg6Ci0JZGl2aCBmcCwgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgbWFjaGkKLW1hY2hpOgotCW1hY2hpIGZwLCBmcCwgYTEKLQkKLQkudGV4dAotCS5nbG9iYWwgbWFjbG8KLW1hY2xvOgotCW1hY2xvIGZwLCBmcCwgYTAKLQkKLQkudGV4dAotCS5nbG9iYWwgbXZmYWNoaQotbXZmYWNoaToKLQltdmZhY2hpIGZwLCBhMQotCQotCS50ZXh0Ci0JLmdsb2JhbCBtdmZhY21pCi1tdmZhY21pOgotCW12ZmFjbWkgZnAsIGExCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmFjbG8KLW12ZmFjbG86Ci0JbXZmYWNsbyBmcCwgYTEKLQkKLQkudGV4dAotCS5nbG9iYWwgbXZ0YWNoaQotbXZ0YWNoaToKLQltdnRhY2hpIGZwLCBhMQotCQotCS50ZXh0Ci0JLmdsb2JhbCBtdnRhY2xvCi1tdnRhY2xvOgotCW12dGFjbG8gZnAsIGEwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHJhYwotcmFjOgotCXJhYyBhMQotCQotCS50ZXh0Ci0JLmdsb2JhbCByYWNfZHMKLXJhY19kczoKLQlyYWMgYTEsIGEwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHJhY19kc2kKLXJhY19kc2k6Ci0JcmFjIGEwLCBhMSwgIzEKLQkKLQkudGV4dAotCS5nbG9iYWwgcmFjaAotcmFjaDoKLQlyYWNoIGExCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHJhY2hfZHMKLXJhY2hfZHM6Ci0JcmFjaCBhMCwgYTEKLQkKLQkudGV4dAotCS5nbG9iYWwgcmFjaF9kc2kKLXJhY2hfZHNpOgotCXJhY2ggYTEsIGEwLCAjMgotCQotIyBUZXN0IGV4cGxpY2l0bHkgcGFyYWxsZWwgYW5kIGltcGxpY2l0bHkgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zCi0jIEluY2x1ZGluZyBhcHBhcmVudCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSByZW9yZGVyaW5nLgotCS50ZXh0Ci0JLmdsb2JhbCBiY19fYWRkCi1iY19fYWRkOgotCWJjIGJjbCB8fCBhZGQgZnAsIGZwCi0jIFVzZSBiYy5zIGhlcmUgYXMgYmMgaXMgcmVsYXhhYmxlIGFuZCB0aHVzIGEgbm9wIHdpbGwgYmUgZW1pdHRlZC4KLQliYy5zIGJjbAotCWFkZCBmcCwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBiY2xfX2FkZGkKLWJjbF9fYWRkaToJCi0JYmNsIGJjbCB8fCBhZGRpIGZwLCAjNzcKLQlhZGRpIGZwLCAjNzcKLSMgVXNlIGJjbC5zIGhlcmUgYXMgYmNsIGlzIHJlbGF4YWJsZSBhbmQgdGh1cyB0aGUgcGFyYWxsZWxpemF0aW9uIHdvbid0IGhhcHBlbi4KLQliY2wucyBiY2wKLQotCS50ZXh0Ci0JLmdsb2JhbCBibF9fYWRkdgotYmxfX2FkZHY6Ci0JYmwgYmNsIHx8IGFkZHYgZnAsIGZwCi0JYWRkdiBmcCwgZnAKLSMgVXNlIGJsLnMgaGVyZSBhcyBibCBpcyByZWxheGFibGUgYW5kIHRodXMgdGhlIHBhcmFsbGVsaXphdGlvbiB3b24ndCBoYXBwZW4uCi0JYmwucyBiY2wKLQkKLQkudGV4dAotCS5nbG9iYWwgYm5jX19hZGR4Ci1ibmNfX2FkZHg6Ci0JYm5jIGJjbCB8fCBhZGR4IGZwLCBmcAotIyBVc2UgYm5jLnMgaGVyZSBhcyBibmMgaXMgcmVsYXhhYmxlIGFuZCB0aHVzIHRoZSBwYXJhbGxlbGl6YXRpb24gYXR0ZW1wdCB3b24ndAotIyBoYXBwZW4uICBUaGluZ3Mgc3RpbGwgd29uJ3QgYmUgcGFyYWxsZWxpemVkLCBidXQgd2Ugd2FudCB0aGlzIHRlc3QgdG8gdHJ5LgotCWJuYy5zIGJjbAotCWFkZHggZnAsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgYm5jbF9fYW5kCi1ibmNsX19hbmQ6Ci0JYm5jbCBiY2wgfHwgYW5kIGZwLCBmcAotCWFuZCBmcCwgZnAKLQlibmNsIGJjbAotCi0JLnRleHQKLQkuZ2xvYmFsIGJyYV9fY21wCi1icmFfX2NtcDoKLQlicmEgYmNsIHx8IGNtcCBmcCwgZnAKLQljbXAgZnAsIGZwCi0jIFVzZSBicmEucyBoZXJlIGFzIGJyYSBpcyByZWxheGFibGUgYW5kIHRodXMgdGhlIHBhcmFsbGVsaXphdGlvbiB3b24ndCBoYXBwZW4uCi0JYnJhLnMgYmNsCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGpsX19jbXBlcQotamxfX2NtcGVxOgotCWpsIGZwIHx8IGNtcGVxIGZwLCBmcAotCWNtcGVxIGZwLCBmcAotCWpsIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGptcF9fY21wdQotam1wX19jbXB1OgotCWptcCBmcCB8fCBjbXB1IGZwLCBmcAotCWNtcHUgZnAsIGZwCi0Jam1wIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGxkX19jbXB6Ci1sZF9fY21wejoKLQlsZCBmcCwgQGZwIHx8IGNtcHogcjEKLQljbXB6IHIxCi0JbGQgZnAsIEBmcCAKLQkKLQkudGV4dAotCS5nbG9iYWwgbGRfX2xkaQotbGRfX2xkaToKLQlsZCBmcCwgQHIxKyB8fCBsZGkgcjIsICM3NwotCWxkIGZwLCBAcjErIAotCWxkaSByMiwgIzc3Ci0JCi0JLnRleHQKLQkuZ2xvYmFsIGxkYl9fbXYKLWxkYl9fbXY6Ci0JbGRiIGZwLCBAZnAgfHwgbXYgcjIsIGZwCi0JbGRiIGZwLCBAZnAgCi0JbXYgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgbGRoX19uZWcKLWxkaF9fbmVnOgotCWxkaCBmcCwgQGZwIHx8IG5lZyByMiwgZnAKLQlsZGggZnAsIEBmcAotCW5lZyByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBsZHViX19ub3AKLWxkdWJfX25vcDoKLQlsZHViIGZwLCBAZnAgfHwgbm9wCi0JbGR1YiBmcCwgQGZwIAotCW5vcAotCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWhfX25vdAotbGR1aF9fbm90OgotCWxkdWggZnAsIEBmcCB8fCBub3QgcjIsIGZwCi0JbGR1aCBmcCwgQGZwCi0Jbm90IHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIGxvY2tfX29yCi1sb2NrX19vcjoKLQlsb2NrIGZwLCBAZnAgfHwgb3IgcjIsIGZwCi0JbG9jayBmcCwgQGZwCi0Jb3IgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgbXZmY19fc3ViCi1tdmZjX19zdWI6Ci0JbXZmYyBmcCwgY3IxIHx8IHN1YiByMiwgZnAKLQltdmZjIGZwLCBjcjEKLQlzdWIgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgbXZ0Y19fc3VidgotbXZ0Y19fc3VidjoKLQltdnRjIGZwLCBjcjIgfHwgc3VidiByMiwgZnAKLQltdnRjIGZwLCBjcjIKLQlzdWJ2IHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHJ0ZV9fc3VieAotcnRlX19zdWJ4OgotCXJ0ZSB8fCBzdWIgcjIsIGZwCi0JcnRlCi0Jc3VieCByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBzbGxfX3hvcgotc2xsX194b3I6Ci0Jc2xsIGZwLCByMSB8fCB4b3IgcjIsIGZwCi0Jc2xsIGZwLCByMQotCXhvciByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBzbGxpX19tYWNoaQotc2xsaV9fbWFjaGk6Ci0Jc2xsaSBmcCwgIzIyIHx8IG1hY2hpIHIyLCBmcAotCXNsbGkgZnAsICMyMgotCW1hY2hpIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHNyYV9fbWFjbGgxCi1zcmFfX21hY2xoMToKLQlzcmEgZnAsIGZwIHx8IG1hY2xoMSByMiwgZnAKLQlzcmEgZnAsIGZwCi0JbWFjbGgxIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHNyYWlfX21hY2xvCi1zcmFpX19tYWNsbzoKLQlzcmFpIGZwLCAjMjIgfHwgbWFjbG8gcjIsIGZwCi0Jc3JhaSBmcCwgIzIyCi0JbWFjbG8gcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgc3JsX19tYWN3aGkKLXNybF9fbWFjd2hpOgotCXNybCBmcCwgZnAgfHwgbWFjd2hpIHIyLCBmcAotCXNybCBmcCwgZnAKLQltYWN3aGkgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgc3JsaV9fbWFjd2xvCi1zcmxpX19tYWN3bG86Ci0Jc3JsaSBmcCwgIzIyIHx8IG1hY3dsbyByMiwgZnAKLQlzcmxpIGZwLCAjMjIKLQltYWN3bG8gcjIsIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHN0X19tYWN3dTEKLXN0X19tYWN3dTE6Ci0Jc3QgZnAsIEBmcCB8fCBtYWN3dTEgcjIsIGZwCi0Jc3QgZnAsIEBmcAotCW1hY3d1MSByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBzdF9fbXNibG8KLXN0X19tc2JsbzoKLQlzdCBmcCwgQCtmcCB8fCBtc2JsbyByMiwgZnAKLQlzdCBmcCwgQCtmcCAKLQltc2JsbyByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBzdF9fbXVsCi1zdF9fbXVsOgotCXN0IGZwLCBALWZwIHx8IG11bCByMiwgZnAKLQlzdCBmcCwgQC1mcAotCW11bCByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBzdGJfX211bGhpCi1zdGJfX211bGhpOgotCXN0YiBmcCwgQGZwIHx8IG11bGhpIHIyLCBmcAotCXN0YiBmcCwgQGZwCi0JbXVsaGkgcjIsIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHN0aF9fbXVsbG8KLXN0aF9fbXVsbG86Ci0Jc3RoIGZwLCBAZnAgfHwgbXVsbG8gcjIsIGZwCi0Jc3RoIGZwLCBAZnAgCi0JbXVsbG8gcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgdHJhcF9fbXVsd2hpCi10cmFwX19tdWx3aGk6Ci0JdHJhcCAjMiB8fCBtdWx3aGkgcjIsIGZwCi0JdHJhcCAjMgotCW11bHdoaSByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCB1bmxvY2tfX211bHdsbwotdW5sb2NrX19tdWx3bG86Ci0JdW5sb2NrIGZwLCBAZnAgfHwgbXVsd2xvIHIyLCBmcAotCXVubG9jayBmcCwgQGZwCi0JbXVsd2xvIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZF9fbXVsd3UxCi1hZGRfX211bHd1MToKLQlhZGQgZnAsIGZwIHx8IG11bHd1MSByMiwgZnAKLQlhZGQgZnAsIGZwCi0JbXVsd3UxIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZGlfX212ZmFjaGkKLWFkZGlfX212ZmFjaGk6Ci0JYWRkaSBmcCwgIzc3IHx8IG12ZmFjaGkgcjIsIGEwCi0JYWRkaSBmcCwgIzc3Ci0JbXZmYWNoaSByMiwgYTAKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGR2X19tdmZhY2xvCi1hZGR2X19tdmZhY2xvOgotCWFkZHYgZnAsIGZwIHx8IG12ZmFjbG8gcjIsIGExCi0JYWRkdiBmcCwgZnAKLQltdmZhY2xvIHIyLCBhMQotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZHhfX212ZmFjbWkKLWFkZHhfX212ZmFjbWk6Ci0JYWRkeCBmcCwgZnAgfHwgbXZmYWNtaSByMiwgYTAKLQlhZGR4IGZwLCBmcAotCW12ZmFjbWkgcjIsIGEwCi0KLQkudGV4dAotCS5nbG9iYWwgYW5kX19tdnRhY2hpCi1hbmRfX212dGFjaGk6Ci0JYW5kIGZwLCBmcCB8fCBtdnRhY2hpIHIyLCBhMAotCWFuZCBmcCwgZnAKLQltdnRhY2hpIHIyLCBhMAotCQotCS50ZXh0Ci0JLmdsb2JhbCBjbXBfX212dGFjbG8KLWNtcF9fbXZ0YWNsbzoKLQljbXAgZnAsIGZwIHx8IG12dGFjbG8gcjIsIGEwCi0JY21wIGZwLCBmcAotCW12dGFjbG8gcjIsIGEwCi0KLQkudGV4dAotCS5nbG9iYWwgY21wZXFfX3JhYwotY21wZXFfX3JhYzoKLQljbXBlcSBmcCwgZnAgfHwgcmFjIGExCi0JY21wZXEgZnAsIGZwCi0JcmFjIGExCi0KLQkudGV4dAotCS5nbG9iYWwgY21wdV9fcmFjaAotY21wdV9fcmFjaDoKLQljbXB1IGZwLCBmcCB8fCByYWNoIGEwLCBhMQotCWNtcHUgZnAsIGZwCi0JcmFjaCBhMSwgYTEsICMxCi0KLQkudGV4dAotCS5nbG9iYWwgY21wel9fc2FkZAotY21wel9fc2FkZDoKLQljbXB6IGZwIHx8IHNhZGQKLQljbXB6IGZwCi0Jc2FkZAotCi0KLQkKLSMgVGVzdCBwcml2YXRlIGluc3RydWN0aW9ucwkKLQkudGV4dAotCS5nbG9iYWwgc2MKLXNjOgotCXNjCi0Jc2FkZAotCQotCS50ZXh0Ci0JLmdsb2JhbCBzbmMKLXNuYzoKLQlzbmMKLQlzYWRkIAotCQotCS50ZXh0Ci0JLmdsb2JhbCBqYwotamM6Ci0JamMgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgam5jCi1qbmM6Ci0Jam5jIGZwCi0JCQotCS50ZXh0Ci0JLmdsb2JhbCBwY21wYnoKLXBjbXBiejoKLQlwY21wYnogZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgc2F0Ci1zYXQ6Ci0Jc2F0IGZwLCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBzYXRoCi1zYXRoOgotCXNhdGggZnAsIGZwIAotCi0KLSMgVGVzdCBwYXJhbGxlbCB2ZXJzaW9ucyBvZiB0aGUgcHJpdmF0ZSBpbnN0cnVjdGlvbnMKLQkKLQkudGV4dAotCS5nbG9iYWwgamNfX3BjbXBiegotamNfX3BjbXBiejoKLQlqYyBmcCB8fCBwY21wYnogZnAKLQlqYyBmcCAKLQlwY21wYnogZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgam5jX19sZGkKLWpuY19fbGRpOgotCWpuYyBmcCB8fCBsZGkgZnAsICM3NwotCWpuYyBmcAotCWxkaSBmcCwgIzc3Ci0JCi0JLnRleHQKLQkuZ2xvYmFsIHNjX19tdgotc2NfX212OgotCXNjIHx8IG12IGZwLCByMgotCXNjIAotCW12IGZwLCByMgotCi0JLnRleHQKLQkuZ2xvYmFsIHNuY19fbmVnCi1zbmNfX25lZzoKLQlzbmMgfHwgbmVnIGZwLCByMgotCXNuYyAKLQluZWcgZnAsIHIyCi0JCi0jIFRlc3QgYXV0b21hdGljIGFuZCBleHBsaWNpdCBwYXJhbGxlbGlzYXRpb24gb2YgaW5zdHJ1Y3Rpb25zCi0JLnRleHQKLQkuZ2xvYmFsIG5vcF9fc2FkZAotbm9wX19zYWRkOgotCW5vcAotCXNhZGQKLQotCS50ZXh0Ci0JLmdsb2JhbCBzYWRkX19ub3AKLXNhZGRfX25vcDoKLQlzYWRkCi0Jbm9wCi0KLQkudGV4dAotCS5nbG9iYWwgc2FkZF9fbm9wX3JldmVyc2UKLXNhZGRfX25vcF9yZXZlcnNlOgotCXNhZGQgfHwgbm9wCi0KLQkudGV4dAotCS5nbG9iYWwgYWRkX19ub3QKLWFkZF9fbm90OgotCWFkZCAgcjAsIHIxCi0Jbm90ICByMywgcjUKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGRfX25vdF9fZGVzdF9jbGFzaAotYWRkX19ub3RfZGVzdF9jbGFzaDoKLQlhZGQgIHIzLCByNAotCW5vdCAgcjMsIHI1Ci0KLQkudGV4dAotCS5nbG9iYWwgYWRkX19ub3RfX3NyY19jbGFzaAotYWRkX19ub3RfX3NyY19jbGFzaDoKLQlhZGQgIHIzLCByNAotCW5vdCAgcjUsIHIzCi0KLQkudGV4dAotCS5nbG9iYWwgYWRkX19ub3RfX25vX2NsYXNoCi1hZGRfX25vdF9fbm9fY2xhc2g6Ci0JYWRkICByMywgcjQKLQlub3QgIHI0LCByNQotCi0JLnRleHQKLQkuZ2xvYmFsIG11bF9fc3JhCi1tdWxfX3NyYToKLQltdWwgIHIxLCByMgotCXNyYSAgcjMsIHI0Ci0JCi0JLnRleHQKLQkuZ2xvYmFsIG11bF9fc3JhX19yZXZlcnNlX3NyY19jbGFzaAotbXVsX19zcmFfX3JldmVyc2Vfc3JjX2NsYXNoOgotCW11bCAgcjEsIHIzCi0Jc3JhICByMywgcjQKLQkKLQkudGV4dAotCS5nbG9iYWwgYmNfX2FkZF8KLWJjX19hZGRfOgotCWJjLnMgbGFiZWwKLQlhZGQgcjEsIHIyCi0KLQkudGV4dAotCS5nbG9iYWwgYWRkX19iYwotYWRkX19iYzoKLQlhZGQgcjMsIHI0Ci0JYmMucyAgbGFiZWwKLQotCS50ZXh0Ci0JLmdsb2JhbCBiY19fYWRkX19mb3JjZWRfcGFyYWxsZWwKLWJjX19hZGRfX2ZvcmNlZF9wYXJhbGxlbDoKLQliYyBsYWJlbCB8fCBhZGQgcjUsIHI2Ci0KLQkudGV4dAotCS5nbG9iYWwgYWRkX19iY19fZm9yY2VkX3BhcmFsbGVsCi1hZGRfX2JjX19mb3JjZWRfcGFyYWxsZWw6Ci0JYWRkIHI3LCByOCB8fCBiYyBsYWJlbAotbGFiZWw6Ci0Jbm9wCi0KLTsgQWRkaXRpb25hbCB0ZXN0Y2FzZXMuCi07IFRoZXNlIGluc25zIHdlcmUgYWRkZWQgdG8gdGhlIGNoaXAgbGF0ZXIuCi0KLQkudGV4dAotbXVsd2hpOgotCW11bHdoaSBmcCwgZnAsIGEwCi0JbXVsd2hpIGZwLCBmcCwgYTEKLQkKLW11bHdsbzoKLQltdWx3bG8gZnAsIGZwLCBhMAotCW11bHdsbyBmcCwgZnAsIGExCi0KLW1hY3doaToKLQltYWN3aGkgZnAsIGZwLCBhMAotCW1hY3doaSBmcCwgZnAsIGExCi0KLW1hY3dsbzoKLQltYWN3bG8gZnAsIGZwLCBhMAotCW1hY3dsbyBmcCwgZnAsIGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL291dG9mcmFuZ2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvb3V0b2ZyYW5nZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzBkMzExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvb3V0b2ZyYW5nZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTsgVGVzdCBlcnJvciBtZXNzYWdlcyB3aGVyZSBicmFuY2hlcyBhcmUgb3V0IG9mIHJhbmdlLgotCi07IHsgZGctZG8gYXNzZW1ibGUgeyB0YXJnZXQgbTMyci0qLSogfSB9Ci0KLQkudGV4dAotCS5nbG9iYWwgZm9vCi1mb286Ci0JYmwucyBsYWJlbAotCQk7IHsgZGctZXJyb3IgIm91dCBvZiByYW5nZSIgIm91dCBvZiByYW5nZSBibC5zIiB7IHRhcmdldCAqLSotKiB9IHsgOCB9IH0KLQlibmMucyBsYWJlbAotCQk7IHsgZGctZXJyb3IgIm91dCBvZiByYW5nZSIgIm91dCBvZiByYW5nZSBibmMucyIgeyB0YXJnZXQgKi0qLSogfSB7IDEwIH0gfQotCWJyYS5zIGxhYmVsCi0JCTsgeyBkZy1lcnJvciAib3V0IG9mIHJhbmdlIiAib3V0IG9mIHJhbmdlIGJyYS5zIiB7IHRhcmdldCAqLSotKiB9IHsgMTIgfSB9Ci0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotbGFiZWw6Ci0Jam1wIHIxNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0ZmNiOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEuZAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiByZWxheC0xCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCogPERvZXNOb3RXb3JrPjoKLSAqMDoJNzAgMDAgNzAgMDAgKglub3AgLT4gbm9wCi0KLTAqNCA8V29yaz46Ci0gKjQ6CTcwIDAwIDcwIDAwICoJbm9wIC0+IG5vcAotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuYnJhbmNoOgotCi0wKiA8YnJhbmNoPjoKLSAqMDoJZmYgMDAgMDAgMDEgCWJyYSA0IDxXb3JrPgotWyAJXSowOiBSX00zMlJfMjZfUENSRUwJLnRleHQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTEyYzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi07IFRlc3QgcmVsYXhhdGlvbiBpbnRvIG5vbi16ZXJvIG9mZnNldCB0byBkaWZmZXJlbnQgc2VnbWVudC4KLQotCS5zZWN0aW9uIC5icmFuY2gsICJheCIsQHByb2diaXRzCi0JLmJhbGlnbiA0Ci1icmFuY2g6Ci0gICAgICAgIGJyYSBXb3JrCi0KLQotCS5zZWN0aW9uIC50ZXh0Ci0gICAgICAgIC5iYWxpZ24gNAotRG9lc05vdFdvcms6Ci0Jbm9wCi0Jbm9wCi0KLVdvcms6Ci0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjgzZThiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2FzOiAtLW0zMnJ4Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogcmVsYXgtMgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMCA8bGFiZWwxPjoKLSAgIDA6CWZkIDAwIDAwIDgzIAlibmMgMjBjIDxsYWJlbDM+Ci0gICA0Ogk3MCAwMCBmMCAwMCAJbm9wIFx8XHwgbm9wCi0gICA4Ogk0MyAwMyBjMiAwMiAJYWRkaSByMyxbI10zIFx8XHwgYWRkaSByMixbI10yCi0KLTArMGMgPGxhYmVsMj46Ci0JLi4uCi0KLTArMDIwYyA8bGFiZWwzPjoKLSAyMGM6CTcwIDAwIGYwIDAwIAlub3AgXHxcfCBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OWRlYzcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi07IFRlc3Qgd2hldGhlciBwYXJhbGxlbCBpbnNucyBnZXQgaW5hcHByb3ByaWF0ZWx5IG1vdmVkIGR1cmluZyByZWxheGF0aW9uLgotCi0gICAgICAgIC50ZXh0Ci1sYWJlbDE6Ci0gICAgICAgIGJuYyAgICAgbGFiZWwzCi0gICAgICAgIG5vcAotICAgICAgICBhZGRpICAgIHIzLCAjMyB8fCBhZGRpICByMiwgIzIKLWxhYmVsMjoKLSAgICAgICAgLnNwYWNlIDUxMgotbGFiZWwzOgotICAgICAgICBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmIxMzQ1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogdXBwZXJjYXNlCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxmb28+OgotICAgMDoJMTAgODEgMTAgOTEgKgltdiByMCxyMSAtPiBtdmZjIHIwLGNicgotCi0wKzAwMDQgPGhpZ2g+OgotICAgNDoJZDAgYzAgMDAgMDAgCXNldGggcjAsIzB4MAotWyAJXSo0OiBSX00zMlJfSEkxNl9VTE8JWy5ddGV4dAotCi0wKzAwMDggPHNoaWdoPjoKLSAgIDg6CWQwIGMwIDAwIDAwIAlzZXRoIHIwLCMweDAKLVsgCV0qODogUl9NMzJSX0hJMTZfU0xPCVsuXXRleHQKLQotMCswMDBjIDxsb3c+OgotICAgYzoJODAgZTAgMDAgMGMgCW9yMyByMCxyMCwjMHhjCi1bIAldKmM6IFJfTTMyUl9MTzE2CVsuXXRleHQKLQotMCswMDEwIDxzZGE+OgotICAxMDoJODAgYTAgMDAgMDAgCWFkZDMgcjAscjAsIzAKLVsgCV0qMTA6IFJfTTMyUl9TREExNglzZGF2YXIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGFlYWZkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmFsIGZvbwotZm9vOgotCW12IFIwLFIxCi0JbXZmYyBSMCxDQlIKLQotaGlnaDoKLQlzZXRoIHIwLCNISUdIKGhpZ2gpCi1zaGlnaDoKLQlzZXRoIHIwLCNTSElHSChzaGlnaCkKLWxvdzoKLQlvcjMgcjAscjAsI0xPVyhsb3cpCi1zZGE6Ci0JYWRkMyByMCxyMCwjU0RBKHNkYXZhcikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvd3JvbmdzaXplLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3dyb25nc2l6ZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODhmNDc4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvd3JvbmdzaXplLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi07IFRlc3QgZXJyb3IgbWVzc2FnZXMgaW4gaW5zdGFuY2VzIHdoZXJlIGFuIGluc24gb2YgYSBwYXJ0aWN1bGFyIHNpemUKLTsgaXMgcmVxdWlyZWQuCi0KLTsgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBtMzJyLSotKiB9IH0KLQotd3JvbmdzaXplOgotCWNtcGkgcjgsIzEwIC0+IGxkaSByMCwjOCAgOyB7IGRnLWVycm9yICJub3QgYSAxNiBiaXQgaW5zdHJ1Y3Rpb24iIH0KLQlsZGkgcjAsIzggLT4gY21waSByOCwjMTAgIDsgeyBkZy1lcnJvciAibm90IGEgMTYgYml0IGluc3RydWN0aW9uIiB9Ci0JY21waSByOCwjMTAgfHwgbGRpIHIwLCM4ICA7IHsgZGctZXJyb3IgIm5vdCBhIDE2IGJpdCBpbnN0cnVjdGlvbiIgfQotCWxkaSByMCwjOCB8fCBjbXBpIHI4LCMxMCAgOyB7IGRnLWVycm9yICJub3QgYSAxNiBiaXQgaW5zdHJ1Y3Rpb24iIH0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9nYXMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL2dhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiN2VlZmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL2dhcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jCi0jIFNvbWUgbTY4ay1jb2ZmIHRlc3RzCi0jCi1pZiBbaXN0YXJnZXQgbTY4Ki0qLWNvZmZdIHRoZW4gewotICAgIGdhc190ZXN0ICJwMjQzMC5zIiAiIiAkc3Rkb3B0bGlzdCAibG9jYWwgYnJhbmNoIG5vdCBpbiB0ZXh0IHNlY3Rpb24iCi0KLSAgICBnYXNfdGVzdCAicDI0MzBhLnMiICIiICRzdGRvcHRsaXN0ICJsb2NhbCBicmFuY2ggbm90IGluIHRleHQgc2VjdGlvbiIKLQotICAgIGdhc190ZXN0ICJ0MS5zIiAiIiAkc3Rkb3B0bGlzdCAibXVsdGlwbGUgLmZpbGUgZGlyZWN0aXZlcyIKLQotICAgIGdhc190ZXN0ICJwMjM4OS5zIiAiIiAkc3Rkb3B0bGlzdCAiYnNzIGZpbGwiCi0KLSAgICBzZXR1cF94ZmFpbCBtNjgqLSotY29mZgotICAgIGdhc190ZXN0X2Vycm9yICJwMjM4OWEucyIgIiIgImRldGVjdCBic3MgZmlsbCB3aXRoIG5vbi16ZXJvIGRhdGEiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmE5M2U5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyAgSSByZWFjaGVkIGEgcG9pbnQgd2hlcmUgdGhlIGZpbGUgbG9va3MKLSMgY2xlYW4gYW5kIGNvbXBsaWVzIHdpdGggZ2FzIHN5bnRheCwgYnV0IGl0IGNvcmUgZHVtcHMgZ2FzLiBIZXJlJ3MgYQotIyBsaXR0bGUgZ2RiIGluZm86Ci0jCi0jIFByb2dyYW0gdGVybWluYXRlZCB3aXRoIHNpZ25hbCAxMSwgU2VnbWVudGF0aW9uIGZhdWx0LgotIyAjMCAgMHg2MzIzYyBpbiBtZW1jcHkgKCkKLSMgKGdkYikgYnQKLSMgIzAgIDB4NjMyM2MgaW4gbWVtY3B5ICgpCi0jICMxICAweGYyYjAgaW4gZmlsbF9zZWN0aW9uIChhYmZkPTB4ZWFlZTgsIGZpbGVoZHI9MHg4YTdmNCwgCi0jICAgICBmaWxlX2N1cnNvcj0weGY3ZmZmNjU0KSBhdCBvYmotZm9ybWF0LmM6NTM0Ci0jICMyICAweDExMmE4IGluIHdyaXRlX29iamVjdF9maWxlICgpIGF0IG9iai1mb3JtYXQuYzoxNzg2Ci0jICMzICAweDEzZWY4IGluIG1haW4gKGFyZ2M9NSwgYXJndj0weGY3ZmZmN2JjKSBhdCAuLi8uLi9wMy9nYXMvYXMuYzozMTAKLSMgKGdkYikgCi0jCi0jIGdhcyBkaWQgbWFuYWdlIHRvIGNyZWF0ZSB0aGUgLm8gZmlsZSBhdCB0aGlzIHBvaW50LgotCi0JLmJzcwotCi1fQVNJQ19JTlRfVEJMOiAgIC5zcGFjZSAzMiwwCXwga2VlcCBpbnRlcnJ1cHQgcm91dGluZXMgaGVyZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5YS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5YS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmIyNzY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OWEucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCS5ic3MKLQotX0FTSUNfSU5UX1RCTDogICAuc3BhY2UgMzIsMQl8IGtlZXAgaW50ZXJydXB0IHJvdXRpbmVzIGhlcmUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzIzZDkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgVGhpcyBkaWZmZXJzIGZyb20gcDI0MzBhLnMgKHRoZSBjdXN0b21lcidzIGFjdHVhbCBzb3VyY2UgZmlsZSkgb25seQotIyBpbiB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cy4gIFN0cmFuZ2VseSwgdGhpcyBmaWxlIGdhdmUgbm8gcHJvYmxlbXMuLi4KLQotCS5zZWN0IGZvbwotdGFnOgotCWJyYSB0YWcKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMGEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMGEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxZmIxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzBhLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSAgICAuc2VjdCBmb28KLQotdGFnOgotCWJyYSB0YWcKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi90MS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3QxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDE1ZjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3QxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIDEgImxpYmdjYzEuUyIKLSMgNDIgImxpYnh5ejEuUyIKLSMgMjU5ICJsaWJnY2MxLlMiCi0JLnRleHQKLQkucHJvYwotfCNQUk9DIyAwNAotCS5nbG9ibAkgX19tdWxzaTMgICAgICAKLSBfX211bHNpMyAgICAgIDoKLXwjUFJPTE9HVUUjIDAKLQlsaW5rCSAgJWE2ICAgICAgICwjMAotCWFkZGwJIy1MRjE0LCAgJXNwICAgICAgIAotCW1vdmVtbAkjTFMxNCwgICVzcCAgICAgICBACi18I1BST0xPR1VFIyAxCi0JbW92ZXcJICAlYTYgICAgICAgQCgweDgpLCAgICVkMCAgICAgICAJIAotCW11bHV3CSAgJWE2ICAgICAgIEAoMHhlKSwgICAlZDAgICAgICAgCSAKLQltb3ZldwkgICVhNiAgICAgICBAKDB4YSksICAgJWQxICAgICAgIAkgCi0JbXVsdXcJICAlYTYgICAgICAgQCgweGMpLCAgICVkMSAgICAgICAJIAotCWFkZHcJICAlZDEgICAgICAgLCAgICVkMCAgICAgICAKLQlsc2xsCSM4LCAgICVkMCAgICAgICAKLQlsc2xsCSM4LCAgICVkMCAgICAgICAKLQltb3ZldwkgICVhNiAgICAgICBAKDB4YSksICAgJWQxICAgICAgIAkgCi0JbXVsdXcJICAlYTYgICAgICAgQCgweGUpLCAgICVkMSAgICAgICAJIAotCWFkZGwJICAlZDEgICAgICAgLCAgICVkMCAgICAgICAKLQlqcmEJTEUxNAotTEUxNDoKLXwjUFJPTE9HVUUjIDIKLQltb3ZlbWwJICAlc3AgICAgICAgQCwgI0xTMTQKLQl1bmxrCSAgJWE2ICAgICAgIAotfCNQUk9MT0dVRSMgMwotCXJ0cwotCUxGMTQgPSA0Ci0JTFMxNCA9IDB4MDAwMgkJIAotCUxGRjE0ID0gMAotIyAzNTQgImxpYmdjYzEuUyIKLQlMU1MxNCA9IDB4MAotCUxWMTQgPSAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2FsbC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2FsbC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YWIyYTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9hbGwuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIwotIyBTb21lIGdlbmVyaWMgbTY4ayB0ZXN0cwotIwotaWYgW2lzdGFyZ2V0IG02OCotKi0qXSB0aGVuIHsKLSAgICBnYXNfdGVzdCAidDIucyIgIiIgIiIgImNyb3NzLXNlY3Rpb24gYnJhbmNoIgotICAgIGlmIFtpc3RhcmdldCBtNjgqLW1vdG9yb2xhLXN5c3ZdIHRoZW4gewotCXJ1bl9kdW1wX3Rlc3QgdDIKLSAgICB9Ci0KLSAgICBnYXNfdGVzdCAicGljMS5zIiAiIiAiIiAiUElDIGdlbmVyYXRpb24iCi0KLSAgICBnYXNfdGVzdCAiZGlzcGVyci5zIiAiLW02ODAyMCIgIiIgIkluY29ycmVjdCBEaXNwbGFjZW1lbnQgdG9vIGxvbmcgZXJyb3IiCi0KLSAgICBnYXNfdGVzdF9lcnJvciAicDI0MTAucyIgIiIgIm91dC1vZi1yYW5nZSAnYnJhcyciCi0KLSAgICBydW5fZHVtcF90ZXN0IHBjcmVsCi0gICAgcnVuX2R1bXBfdGVzdCBvcGVyYW5kcwotICAgIHJ1bl9kdW1wX3Rlc3QgY2FzCi0gICAgcnVuX2R1bXBfdGVzdCBiaXRmaWVsZAotICAgIHJ1bl9kdW1wX3Rlc3QgbGluawotICAgIHJ1bl9kdW1wX3Rlc3QgZm1vdmVtbAotCi0gICAgc2V0IHRlc3RuYW1lICI2ODAwMCBvcGVyYW5kcyIKLSAgICBnYXNfcnVuICJvcGVyYW5kcy5zIiAiLW02ODAwMCIgIjI+ZXJyLm91dCIKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiY2hpbGQgcHJvY2VzcyBleGl0ZWQgYWJub3JtYWxseSIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCi0JZmFpbCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWlmIFtyZWdleHBfZGlmZiAiZXJyLm91dCIgIiRzcmNkaXIvJHN1YmRpci9vcDY4MDAwLmQiXSB0aGVuIHsKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0KLSAgICB9Ci19Ci1pZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKLSAgICB1bnNldCBlcnJvckluZm8KLSAgICB9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjFiZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IGJpdGZpZWxkCi0KLSMgVGVzdCBoYW5kbGluZyBvZiBiaXRmaWVsZCBpbnN0cnVjdGlvbiBvcGVyYW5kcy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gYmZleHRzICVhMEAsMSwyLCVkMAotMCswMDQgPGZvb1wrKDB4fCk0PiBiZmV4dHMgJWEwQCwxLDYsJWQwCi0wKzAwOCA8Zm9vXCsoMHh8KTg+IGJmZXh0cyAlYTBALDMsMiwlZDAKLTArMDBjIDxmb29cKygweHwpYz4gYmZleHRzICVhMEAsMyw2LCVkMAotMCswMTAgPGZvb1wrKDB4fCkxMD4gYmZleHRzICVhMEAsMSwyLCVkMAotMCswMTQgPGZvb1wrKDB4fCkxND4gYmZleHRzICVhMEAsMSw2LCVkMAotMCswMTggPGZvb1wrKDB4fCkxOD4gYmZleHRzICVhMEAsMywyLCVkMAotMCswMWMgPGZvb1wrKDB4fCkxYz4gYmZleHRzICVhMEAsMyw2LCVkMAotMCswMjAgPGZvb1wrKDB4fCkyMD4gYmZzZXQgJWEwQCwxLDIKLTArMDI0IDxmb29cKygweHwpMjQ+IGJmc2V0ICVhMEAsMSw2Ci0wKzAyOCA8Zm9vXCsoMHh8KTI4PiBiZnNldCAlYTBALDMsMgotMCswMmMgPGZvb1wrKDB4fCkyYz4gYmZzZXQgJWEwQCwzLDYKLTArMDMwIDxmb29cKygweHwpMzA+IGJmc2V0ICVhMEAsMSwyCi0wKzAzNCA8Zm9vXCsoMHh8KTM0PiBiZnNldCAlYTBALDEsNgotMCswMzggPGZvb1wrKDB4fCkzOD4gYmZzZXQgJWEwQCwzLDIKLTArMDNjIDxmb29cKygweHwpM2M+IGJmc2V0ICVhMEAsMyw2Ci0wKzA0MCA8Zm9vXCsoMHh8KTQwPiBiZmV4dHMgJWEwQCwlZDEsJWQyLCVkMAotMCswNDQgPGZvb1wrKDB4fCk0ND4gYmZleHRzICVhMEAsJWQxLCVkMiwlZDAKLTArMDQ4IDxmb29cKygweHwpNDg+IGJmc2V0ICVhMEAsJWQxLCVkMgotMCswNGMgPGZvb1wrKDB4fCk0Yz4gYmZzZXQgJWEwQCwlZDEsJWQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMmY3NTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyBUZXN0IGhhbmRsaW5nIG9mIGJpdGZpZWxkIGluc3RydWN0aW9uIG9wZXJhbmRzLgotCS50ZXh0Ci0JLmdsb2JsCWZvbwotZm9vOgkKLQliZmV4dHMJKCVhMCl7JjE6JjJ9LCVkMAotCWJmZXh0cwkoJWEwKXsmMTomKDIrNCl9LCVkMAotCWJmZXh0cwkoJWEwKXsmKDErMik6JjJ9LCVkMAotCWJmZXh0cwkoJWEwKXsmKDErMik6JigyKzQpfSwlZDAKLQliZmV4dHMJJWEwQCwmMSwmMiwlZDAKLQliZmV4dHMJJWEwQCwmMSwmKDIrNCksJWQwCi0JYmZleHRzCSVhMEAsJjErMiwmMiwlZDAKLQliZmV4dHMJJWEwQCwmKDErMiksJigyKzQpLCVkMAotCWJmc2V0CSglYTApeyYxOiYyfQotCWJmc2V0CSglYTApeyYxOiYoMis0KX0KLQliZnNldAkoJWEwKXsmKDErMik6JjJ9Ci0JYmZzZXQJKCVhMCl7JigxKzIpOiYoMis0KX0KLQliZnNldAklYTBALCYxLCYyCi0JYmZzZXQJJWEwQCwmMSwmKDIrNCkKLQliZnNldAklYTBALCYxKzIsJjIKLQliZnNldAklYTBALCYoMSsyKSwmKDIrNCkKLQliZmV4dHMJKCVhMCl7JWQxOiVkMn0sJWQwCi0JYmZleHRzCSVhMEAsJWQxLCVkMiwlZDAKLQliZnNldAkoJWEwKXslZDE6JWQyfQotCWJmc2V0CSVhMEAsJWQxLCVkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDk3MzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBjYXMKLQotIyBUZXN0IHBhcnNpbmcgb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBjYXMgaW5zdHJ1Y3Rpb24KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gY2FzdyAlZDAsJWQxLCVhMEAKLTArMDA0IDxmb29cKygweHwpND4gY2FzdyAlZDAsJWQxLCVhMEAKLTArMDA4IDxmb29cKygweHwpOD4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswMGUgPGZvb1wrKDB4fCllPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsQFwoJWQwXCksQFwoJWQxXCkKLTArMDE0IDxmb29cKygweHwpMTQ+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDFhIDxmb29cKygweHwpMWE+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDIwIDxmb29cKygweHwpMjA+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCxAXCglZDBcKSxAXCglZDFcKQotMCswMjYgPGZvb1wrKDB4fCkyNj4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswMmMgPGZvb1wrKDB4fCkyYz4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LEBcKCVkMFwpLEBcKCVkMVwpCi0wKzAzMiA8Zm9vXCsoMHh8KTMyPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAzOCA8Zm9vXCsoMHh8KTM4PiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAzZSA8Zm9vXCsoMHh8KTNlPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsQFwoJWQwXCksQFwoJWQxXCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjRlN2Y1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIFRlc3QgcGFyc2luZyBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGNhcyBpbnN0cnVjdGlvbgotCS50ZXh0Ci0JLmdsb2JsCWZvbwotZm9vOgkKLQljYXMJJWQwLCVkMSwoJWEwKQotCWNhcwklZDAsJWQxLCVhMEAKLQljYXMyCSVkMDolZDIsJWQzOiVkNCwoJWEwKTooJWExKQotCWNhczIJJWQwOiVkMiwlZDM6JWQ0LCglZDApOiglZDEpCi0JY2FzMgklZDA6JWQyLCVkMzolZDQsJWEwQDolYTFACi0JY2FzMgklZDA6JWQyLCVkMzolZDQsQCglYTApOkAoJWExKQotCWNhczIJJWQwOiVkMiwlZDM6JWQ0LEAoJWQwKTpAKCVkMSkKLQljYXMyCSVkMCwlZDIsJWQzLCVkNCwoJWEwKSwoJWExKQotCWNhczIJJWQwLCVkMiwlZDMsJWQ0LCglZDApLCglZDEpCi0JY2FzMgklZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0JY2FzMgklZDAsJWQyLCVkMywlZDQsQCglYTApLEAoJWExKQotCWNhczIJJWQwLCVkMiwlZDMsJWQ0LEAoJWQwKSxAKCVkMSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZGlzcGVyci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9kaXNwZXJyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZDNiN2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9kaXNwZXJyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTk9fQVBQCi1nY2MyX2NvbXBpbGVkLjoKLV9fX2dudV9jb21waWxlZF9jOgotLnRleHQKLQkuZXZlbgotLmdsb2JsIF9mb28KLV9mb286Ci0JbGluayAlYTYsIy0xMgotCWZtb3ZleCAlYTZAKC0xMiksJWZwMAotCWZtb3ZleCAlZnAwLCVzcEAtCi0JamJzciBfYmFyCi0JYWRkcXcgIzgsJXNwCi0JYWRkcXcgIzQsJXNwCi1MMToKLQl1bmxrICVhNgotCXJ0cwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlMjc5My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBmbW92ZW1sCi0KLSMgVGVzdCBoYW5kbGluZyBvZiBmbW92ZW1sIGFuZCBmbW92ZW14IGluc3RydWN0aW9ucy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gZm1vdmVsICVmcGNyLCVhMEAKLTArMDA0IDxmb29cKygweHwpND4gZm1vdmVsICVmcHNyLCVhMEAKLTArMDA4IDxmb29cKygweHwpOD4gZm1vdmVsICVmcGlhciwlYTBACi0wKzAwYyA8Zm9vXCsoMHh8KWM+IGZtb3ZlbWwgJWZwc3IvJWZwY3IsJWEwQAotMCswMTAgPGZvb1wrKDB4fCkxMD4gZm1vdmVtbCAlZnBpYXIvJWZwY3IsJWEwQAotMCswMTQgPGZvb1wrKDB4fCkxND4gZm1vdmVtbCAlZnBpYXIvJWZwc3IsJWEwQAotMCswMTggPGZvb1wrKDB4fCkxOD4gZm1vdmVtbCAlZnBpYXIvJWZwc3IvJWZwY3IsJWEwQAotMCswMWMgPGZvb1wrKDB4fCkxYz4gZm1vdmVsICVmcGNyLCVkMAotMCswMjAgPGZvb1wrKDB4fCkyMD4gZm1vdmVsICVmcHNyLCVkMAotMCswMjQgPGZvb1wrKDB4fCkyND4gZm1vdmVsICVmcGlhciwlZDAKLTArMDI4IDxmb29cKygweHwpMjg+IGZtb3ZlbCAlZnBpYXIsJWEwCi0wKzAyYyA8Zm9vXCsoMHh8KTJjPiBmbW92ZWwgJWEwQCwlZnBjcgotMCswMzAgPGZvb1wrKDB4fCkzMD4gZm1vdmVsICVhMEAsJWZwc3IKLTArMDM0IDxmb29cKygweHwpMzQ+IGZtb3ZlbCAlYTBALCVmcGlhcgotMCswMzggPGZvb1wrKDB4fCkzOD4gZm1vdmVtbCAlYTBALCVmcHNyLyVmcGNyCi0wKzAzYyA8Zm9vXCsoMHh8KTNjPiBmbW92ZW1sICVhMEAsJWZwaWFyLyVmcGNyCi0wKzA0MCA8Zm9vXCsoMHh8KTQwPiBmbW92ZW1sICVhMEAsJWZwaWFyLyVmcHNyCi0wKzA0NCA8Zm9vXCsoMHh8KTQ0PiBmbW92ZW1sICVhMEAsJWZwaWFyLyVmcHNyLyVmcGNyCi0wKzA0OCA8Zm9vXCsoMHh8KTQ4PiBmbW92ZWwgJWQwLCVmcGNyCi0wKzA0YyA8Zm9vXCsoMHh8KTRjPiBmbW92ZWwgJWQwLCVmcHNyCi0wKzA1MCA8Zm9vXCsoMHh8KTUwPiBmbW92ZWwgJWQwLCVmcGlhcgotMCswNTQgPGZvb1wrKDB4fCk1ND4gZm1vdmVsICVhMCwlZnBpYXIKLTArMDU4IDxmb29cKygweHwpNTg+IGZtb3ZlbCAjMSwlZnBjcgotMCswNjAgPGZvb1wrKDB4fCk2MD4gZm1vdmVsICMxLCVmcHNyCi0wKzA2OCA8Zm9vXCsoMHh8KTY4PiBmbW92ZWwgIzEsJWZwaWFyCi0wKzA3MCA8Zm9vXCsoMHh8KTcwPiBmbW92ZW1sICMxLCVmcHNyLyVmcGNyCi0wKzA3OCA8Zm9vXCsoMHh8KTc4PiBmbW92ZW1sICMxLCVmcGlhci8lZnBjcgotMCswODAgPGZvb1wrKDB4fCk4MD4gZm1vdmVtbCAjMSwlZnBpYXIvJWZwc3IKLTArMDg4IDxmb29cKygweHwpODg+IGZtb3ZlbWwgIzEsJWZwaWFyLyVmcHNyLyVmcGNyCi0wKzA5MCA8Zm9vXCsoMHh8KTkwPiBmbW92ZW14ICVmcDEsJWEwQAotMCswOTQgPGZvb1wrKDB4fCk5ND4gZm1vdmVteCAlZnA0LCVhMEAKLTArMDk4IDxmb29cKygweHwpOTg+IGZtb3ZlbXggJWZwNywlYTBACi0wKzA5YyA8Zm9vXCsoMHh8KTljPiBmbW92ZW14ICVmcDEvJWZwMywlYTBACi0wKzBhMCA8Zm9vXCsoMHh8KWEwPiBmbW92ZW14ICVmcDEtJWZwNCwlYTBACi0wKzBhNCA8Zm9vXCsoMHh8KWE0PiBmbW92ZW14ICVmcDAvJWZwNywlYTBACi0wKzBhOCA8Zm9vXCsoMHh8KWE4PiBmbW92ZW14ICVmcDAtJWZwNywlYTBACi0wKzBhYyA8Zm9vXCsoMHh8KWFjPiBmbW92ZW14ICVhMEAsJWZwMAotMCswYjAgPGZvb1wrKDB4fCliMD4gZm1vdmVteCAlYTBALCVmcDEKLTArMGI0IDxmb29cKygweHwpYjQ+IGZtb3ZlbXggJWEwQCwlZnA3Ci0wKzBiOCA8Zm9vXCsoMHh8KWI4PiBmbW92ZW14ICVhMEAsJWZwMC8lZnAzCi0wKzBiYyA8Zm9vXCsoMHh8KWJjPiBmbW92ZW14ICVhMEAsJWZwMC8lZnA0Ci0wKzBjMCA8Zm9vXCsoMHh8KWMwPiBmbW92ZW14ICVhMEAsJWZwMi0lZnA0Ci0wKzBjNCA8Zm9vXCsoMHh8KWM0PiBmbW92ZW14ICVhMEAsJWZwMS0lZnA3Ci0wKzBjOCA8Zm9vXCsoMHh8KWM4PiBmbW92ZW14ICVmcDAsJWEwQC0KLTArMGNjIDxmb29cKygweHwpY2M+IGZtb3ZlbXggJWZwMC0lZnA3LCVhMEAtCi0wKzBkMCA8Zm9vXCsoMHh8KWQwPiBmbW92ZW14ICVmcDAvJWZwNCwlYTBALQotMCswZDQgPGZvb1wrKDB4fClkND4gZm1vdmVteCAlYTBAXCssJWZwNwotMCswZDggPGZvb1wrKDB4fClkOD4gZm1vdmVteCAlYTBAXCssJWZwMC0lZnA3Ci0wKzBkYyA8Zm9vXCsoMHh8KWRjPiBmbW92ZW14ICVhMEBcKywlZnAzLyVmcDcKLTArMGUwIDxmb29cKygweHwpZTA+IGZtb3ZlbXggJWQwLCVhMEAtCi0wKzBlNCA8Zm9vXCsoMHh8KWU0PiBmbW92ZW14ICVhMEBcKywlZDAKLTArMGU4IDxmb29cKygweHwpZTg+IGZtb3ZlbXggJWZwMS8lZnA1LCVhMEAtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQyMjRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyBUZXN0IGhhbmRsaW5nIG9mIHRoZSBmbW92ZW1sIGFuZCBmbW92ZW14IGluc3RydWN0aW9ucy4KLQkudGV4dAotCS5nbG9ibAlmb28KLWZvbzoKLQlmbW92ZW1sICVmcGNyLCVhMEAKLQlmbW92ZW1sICVmcHNyLCVhMEAKLQlmbW92ZW1sICVmcGlhciwlYTBACi0JZm1vdmVtbCAlZnBjci8lZnBzciwlYTBACi0JZm1vdmVtbAklZnBjci8lZnBpYXIsJWEwQAotCWZtb3ZlbWwJJWZwc3IvJWZwaWFyLCVhMEAKLQlmbW92ZW1sCSVmcGNyLyVmcHNyLyVmcGlhciwlYTBACi0JZm1vdmVtbAklZnBjciwlZDAKLQlmbW92ZW1sCSVmcHNyLCVkMAotCWZtb3ZlbWwJJWZwaWFyLCVkMAotCWZtb3ZlbWwJJWZwaWFyLCVhMAotCWZtb3ZlbWwgJWEwQCwlZnBjcgotCWZtb3ZlbWwgJWEwQCwlZnBzcgotCWZtb3ZlbWwgJWEwQCwlZnBpYXIKLQlmbW92ZW1sICVhMEAsJWZwc3IvJWZwY3IKLQlmbW92ZW1sCSVhMEAsJWZwaWFyLyVmcGNyCi0JZm1vdmVtbAklYTBALCVmcGlhci8lZnBzcgotCWZtb3ZlbWwJJWEwQCwlZnBzci8lZnBpYXIvJWZwY3IKLQlmbW92ZW1sCSVkMCwlZnBjcgotCWZtb3ZlbWwJJWQwLCVmcHNyCi0JZm1vdmVtbAklZDAsJWZwaWFyCi0JZm1vdmVtbAklYTAsJWZwaWFyCi0JZm1vdmVtbAkmMSwlZnBjcgotCWZtb3ZlbWwJJjEsJWZwc3IKLQlmbW92ZW1sCSYxLCVmcGlhcgotCWZtb3ZlbWwJJjEsJWZwY3IvJWZwc3IKLQlmbW92ZW1sCSYxLCVmcGNyLyVmcGlhcgotCWZtb3ZlbWwJJjEsJWZwc3IvJWZwaWFyCi0JZm1vdmVtbAkmMSwlZnBpYXIvJWZwc3IvJWZwY3IKLQotCWZtb3ZlbXggJWZwMSwlYTBACi0JZm1vdmVteCAlZnA0LCVhMEAKLQlmbW92ZW14ICVmcDcsJWEwQAotCWZtb3ZlbXggJWZwMS8lZnAzLCVhMEAKLQlmbW92ZW14CSVmcDEtJWZwNCwlYTBACi0JZm1vdmVteAklZnAwLyVmcDcsJWEwQAotCWZtb3ZlbXgJJWZwMC0lZnA3LCVhMEAKLQlmbW92ZW14ICVhMEAsJWZwMAotCWZtb3ZlbXggJWEwQCwlZnAxCi0JZm1vdmVteCAlYTBALCVmcDcKLQlmbW92ZW14ICVhMEAsJWZwMC8lZnAzCi0JZm1vdmVteAklYTBALCVmcDAvJWZwNAotCWZtb3ZlbXgJJWEwQCwlZnAyLSVmcDQKLQlmbW92ZW14CSVhMEAsJWZwMS0lZnA3Ci0JZm1vdmVteAkmMSwlYTBALQotCWZtb3ZlbXgJJjB4ZmYsJWEwQC0KLQlmbW92ZW14CSYweDExLCVhMEAtCi0JZm1vdmVteAklYTBAKywmMQotCWZtb3ZlbXgJJWEwQCssJjB4ZmYKLQlmbW92ZW14CSVhMEArLCYweDExCi0JZm1vdmVteAklZDAsJWEwQC0KLQlmbW92ZW14CSVhMEArLCVkMAotCWZtb3ZlbXgJJnN5bSwlYTBALQotCXN5bQk9CTB4MjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNTI2M2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogbGluawotCi0jIFRlc3QgaGFuZGxpbmcgb2YgbGluayBpbnN0cnVjdGlvbi4KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gbGlua3cgJWZwLCMwCi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGxpbmt3ICVmcCwjLTQKLTArMDA4IDxmb29cKygweHwpOD4gbGlua3cgJWZwLCMtMzI3NjcKLTArMDBjIDxmb29cKygweHwpYz4gbGlua3cgJWZwLCMtMzI3NjgKLTArMDEwIDxmb29cKygweHwpMTA+IGxpbmtsICVmcCwjLTMyNzY5Ci0wKzAxNiA8Zm9vXCsoMHh8KTE2PiBsaW5rdyAlZnAsIzMyNzY3Ci0wKzAxYSA8Zm9vXCsoMHh8KTFhPiBsaW5rbCAlZnAsIzMyNzY4Ci0wKzAyMCA8Zm9vXCsoMHh8KTIwPiBsaW5rbCAlZnAsIzMyNzY5Ci0wKzAyNiA8Zm9vXCsoMHh8KTI2PiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzIxZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIFRlc3QgaGFuZGxpbmcgb2YgbGluayBpbnN0cnVjdGlvbi4KLQkudGV4dAotCS5nbG9ibAlmb28KLWZvbzoKLQlsaW5rCSVhNiwmMAotCWxpbmsJJWE2LCYtNAotCWxpbmsJJWE2LCYtMHg3ZmZmCi0JbGluawklYTYsJi0weDgwMDAKLQlsaW5rCSVhNiwmLTB4ODAwMQotCWxpbmsJJWE2LCYweDdmZmYKLQlsaW5rCSVhNiwmMHg4MDAwCi0JbGluawklYTYsJjB4ODAwMQotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcDY4MDAwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wNjgwMDAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZDVhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wNjgwMDAuZAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0jIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBzdGRlcnIgb3V0cHV0IG9mIGdhcyAtbTY4MDAwIG9uIG9wZXJhbmRzLnMuCi0jIFdlIGRvbid0IGJvdGhlciB0byBtYXRjaCB0aGUgZXhhY3QgZXJyb3IgbWVzc2FnZSwgYnV0IGluc3RlYWQganVzdAotIyBsb29rIGZvciB0aGUgc3RhdGVtZW50cyB3aGljaCBzaG91bGQgZmFpbC4KLQotLipvcGVyYW5kcy5zOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKnN0YXRlbWVudCBgdHN0bCAlYTAnIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDp3OjRcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6dzo4XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOmw6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDpsOjRcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6bDo4XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDBcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDBcKjRcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDBcKjhcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC53XCo0XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLndcKjhcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAubFwqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC5sXCo0XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLmxcKjhcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMS53XCoyLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCA4XCglYTAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgOFwoJWQwLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDhcKCVhMS53XCoyLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKCVhMCwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKCVkMC53XCoyLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVhMCwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWQwLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWExLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVhMCwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglZDAsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMDAwLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwMDBcKCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlemExQFwoMTAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICV6YTFAXCgxMDAwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCV6YTEsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVkMCwlemExXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlYTEud1wqMiwlemExXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCV6YTEsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWQwLCV6YTFcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwMDAsJXphMVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwMDBcKCV6YTFcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMCwlemQxOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwLCV6ZDE6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKCV6ZDE6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlYTAsJXpkMS53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlemQxLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJXphMS53XCoyLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglYTAsJXpkMS53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCV6ZDEsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlemQxLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJXpkMS53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoJXpkMS53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWEwXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMFxdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMFxdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMFxdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslYTBcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVhMFxdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzBcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzBcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFswXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwLCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMCwlZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDAsJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwLCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCglZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTAsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwOnc6MiwlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMCwlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMSwlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMTp3OjIsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTAsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMCwlYTBcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVhMCwlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWQwLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVhMCwlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVkMCwlYTBcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDgsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDgsJXBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgOFwoJXBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCglcGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJXBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVkMCwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWExLndcKjIsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVhMSwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglcGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglZDAsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJWExLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMDAwLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDAwMFwoJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJXpwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlZDAsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlYTEud1wqMiwlenBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVhMSwlenBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJXpwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVkMCwlenBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJWExLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAwMCwlenBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMDAwXCglenBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwY1xdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwY1xdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwY1xdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGNcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwY1xdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGNcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwY1xdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDAsJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDAsJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCglZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwOnc6MiwlcGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTEsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwYywlYTFcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExOnc6MiwlcGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVkMCwlcGNcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMSwlcGNcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGMsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslZDAsJXBjXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMCwlZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDAsJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCglZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwOnc6MiwlenBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVkMCwlenBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMSwlenBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGMsJWExXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMTp3OjIsJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVkMCwlenBjXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTEsJXpwY1xdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGMsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwYywlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVkMCwlenBjXF1cKScgaWdub3JlZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjM4M2MzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogb3BlcmFuZHMKLQotIyBUZXN0IGhhbmRsaW5nIG9mIE1JVCBhbmQgTW90b3JvbGEgc3ludGF4IG9wZXJhbmRzCi0jIElmIHlvdSBjaGFuZ2UgdGhpcyBmaWxlLCBzZWUgYWxzbyBvcDY4MDAwLmQuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IHRzdGwgJWQwCi0wKzAwMiA8Zm9vXCsoMHh8KTI+IHRzdGwgJWEwCi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IHRzdGwgJWEwQAotMCswMDYgPGZvb1wrKDB4fCk2PiB0c3RsICVhMEAKLTArMDA4IDxmb29cKygweHwpOD4gdHN0bCAlYTBAXCsKLTArMDBhIDxmb29cKygweHwpYT4gdHN0bCAlYTBAXCsKLTArMDBjIDxmb29cKygweHwpYz4gdHN0bCAlYTBALQotMCswMGUgPGZvb1wrKDB4fCllPiB0c3RsICVhMEAtCi0wKzAxMCA8Zm9vXCsoMHh8KTEwPiB0c3RsICVhMEBcKDhcKQotMCswMTQgPGZvb1wrKDB4fCkxND4gdHN0bCAlYTBAXCg4XCkKLTArMDE4IDxmb29cKygweHwpMTg+IHRzdGwgJWEwQFwoOFwpCi0wKzAxYyA8Zm9vXCsoMHh8KTFjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDIwIDxmb29cKygweHwpMjA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOndcKQotMCswMjQgPGZvb1wrKDB4fCkyND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6d1wpCi0wKzAyOCA8Zm9vXCsoMHh8KTI4PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjJcKQotMCswMmMgPGZvb1wrKDB4fCkyYz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzo0XCkKLTArMDMwIDxmb29cKygweHwpMzA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6OFwpCi0wKzAzNCA8Zm9vXCsoMHh8KTM0PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDM4IDxmb29cKygweHwpMzg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswM2MgPGZvb1wrKDB4fCkzYz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDoyXCkKLTArMDQwIDxmb29cKygweHwpNDA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6NFwpCi0wKzA0NCA8Zm9vXCsoMHh8KTQ0PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjhcKQotMCswNDggPGZvb1wrKDB4fCk0OD4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXCkKLTArMDRjIDxmb29cKygweHwpNGM+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswNTAgPGZvb1wrKDB4fCk1MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzA1NCA8Zm9vXCsoMHh8KTU0PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjJcKQotMCswNTggPGZvb1wrKDB4fCk1OD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo0XCkKLTArMDVjIDxmb29cKygweHwpNWM+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6OFwpCi0wKzA2MCA8Zm9vXCsoMHh8KTYwPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3XCkKLTArMDY0IDxmb29cKygweHwpNjQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOndcKQotMCswNjggPGZvb1wrKDB4fCk2OD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzoyXCkKLTArMDZjIDxmb29cKygweHwpNmM+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6NFwpCi0wKzA3MCA8Zm9vXCsoMHh8KTcwPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjhcKQotMCswNzQgPGZvb1wrKDB4fCk3ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzA3OCA8Zm9vXCsoMHh8KTc4PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDdjIDxmb29cKygweHwpN2M+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6MlwpCi0wKzA4MCA8Zm9vXCsoMHh8KTgwPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjRcKQotMCswODQgPGZvb1wrKDB4fCk4ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo4XCkKLTArMDg4IDxmb29cKygweHwpODg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswOGMgPGZvb1wrKDB4fCk4Yz4gdHN0bCAlYTBAXCgwKzAwOCwlYTE6dzoyXCkKLTArMDkwIDxmb29cKygweHwpOTA+IHRzdGwgJWExQFwoMCswMDgsJWEwOmxcKQotMCswOTQgPGZvb1wrKDB4fCk5ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzoyXCkKLTArMDk4IDxmb29cKygweHwpOTg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6MlwpCi0wKzA5YyA8Zm9vXCsoMHh8KTljPiB0c3RsICVhMEBcKDArMDA4LCVhMTp3OjJcKQotMCswYTAgPGZvb1wrKDB4fClhMD4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXCkKLTArMGE0IDxmb29cKygweHwpYTQ+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpCi0wKzBhOCA8Zm9vXCsoMHh8KWE4PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKQotMCswYWUgPGZvb1wrKDB4fClhZT4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMGI0IDxmb29cKygweHwpYjQ+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpCi0wKzBiOCA8Zm9vXCsoMHh8KWI4PiB0c3RsIEBcKDArM2U4XCkKLTArMGJlIDxmb29cKygweHwpYmU+IHRzdGwgJWEwQFwoMCsxODZhMFwpCi0wKzBjNiA8Zm9vXCsoMHh8KWM2PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKQotMCswY2MgPGZvb1wrKDB4fCljYz4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6bFwpCi0wKzBkMiA8Zm9vXCsoMHh8KWQyPiB0c3RsICVhMEBcKDArM2U4LCVhMTp3OjJcKQotMCswZDggPGZvb1wrKDB4fClkOD4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMGRlIDxmb29cKygweHwpZGU+IHRzdGwgJWEwQFwoMCszZTgsJWQwOmxcKQotMCswZTQgPGZvb1wrKDB4fCllND4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMGVhIDxmb29cKygweHwpZWE+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBmMCA8Zm9vXCsoMHh8KWYwPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKQotMCswZjQgPGZvb1wrKDB4fClmND4gdHN0bCAlYTBAXCgwKzE4NmEwXCkKLTArMGZjIDxmb29cKygweHwpZmM+IHRzdGwgJWEwQFwoMCsxODZhMFwpCi0wKzEwNCA8Zm9vXCsoMHh8KTEwND4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMTBhIDxmb29cKygweHwpMTBhPiB0c3RsIEBcKDArMTg2YTBcKQotMCsxMTIgPGZvb1wrKDB4fCkxMTI+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzExOCA8Zm9vXCsoMHh8KTExOD4gdHN0bCBAXCgwKzNlOCwlZDA6bFwpCi0wKzExZSA8Zm9vXCsoMHh8KTExZT4gdHN0bCBAXCgwKzNlOCwlYTE6dzoyXCkKLTArMTI0IDxmb29cKygweHwpMTI0PiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCsxMmEgPGZvb1wrKDB4fCkxMmE+IHRzdGwgQFwoMCszZTgsJWQwOmxcKQotMCsxMzAgPGZvb1wrKDB4fCkxMzA+IHRzdGwgQFwoMCsxODZhMFwpCi0wKzEzOCA8Zm9vXCsoMHh8KTEzOD4gdHN0bCBAXCgwKzE4NmEwXCkKLTArMTQwIDxmb29cKygweHwpMTQwPiB0c3RsICVhMEBcKDArM2U4XCkKLTArMTQ2IDxmb29cKygweHwpMTQ2PiB0c3RsIEBcKDArM2U4XCkKLTArMTRjIDxmb29cKygweHwpMTRjPiB0c3RsIEBcKDArMDAwXCkKLTArMTUwIDxmb29cKygweHwpMTUwPiB0c3RsICVhMEBcKDArM2U4XCkKLTArMTU2IDxmb29cKygweHwpMTU2PiB0c3RsICVhMEBcKDArM2U4XCkKLTArMTVjIDxmb29cKygweHwpMTVjPiB0c3RsICVhMEBcKDArM2U4XCkKLTArMTYyIDxmb29cKygweHwpMTYyPiB0c3RsICVhMEBcKDArM2U4XCkKLTArMTY4IDxmb29cKygweHwpMTY4PiB0c3RsICVhMEBcKDArM2U4XCkKLTArMTZlIDxmb29cKygweHwpMTZlPiB0c3RsIEBcKDArM2U4XCkKLTArMTc0IDxmb29cKygweHwpMTc0PiB0c3RsIEBcKDArM2U4XCkKLTArMTdhIDxmb29cKygweHwpMTdhPiB0c3RsIEBcKDArMDAwXCkKLTArMTdlIDxmb29cKygweHwpMTdlPiB0c3RsICVhMEBcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMTg2IDxmb29cKygweHwpMTg2PiB0c3RsICVhMEBcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMThjIDxmb29cKygweHwpMThjPiB0c3RsICVhMEBcKDArM2U4XClAXCgwKzdkMFwpCi0wKzE5NCA8Zm9vXCsoMHh8KTE5ND4gdHN0bCBAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzE5YyA8Zm9vXCsoMHh8KTE5Yz4gdHN0bCBAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzFhMiA8Zm9vXCsoMHh8KTFhMj4gdHN0bCBAXCgwKzNlOFwpQFwoMCs3ZDBcKQotMCsxYWEgPGZvb1wrKDB4fCkxYWE+IHRzdGwgJWEwQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxYjAgPGZvb1wrKDB4fCkxYjA+IHRzdGwgJWEwQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxYjQgPGZvb1wrKDB4fCkxYjQ+IHRzdGwgJWEwQFwoMCswMDBcKUBcKDArN2QwXCkKLTArMWJhIDxmb29cKygweHwpMWJhPiB0c3RsIEBcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMWMwIDxmb29cKygweHwpMWMwPiB0c3RsIEBcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMWM0IDxmb29cKygweHwpMWM0PiB0c3RsIEBcKDArMDAwXClAXCgwKzdkMFwpCi0wKzFjYSA8Zm9vXCsoMHh8KTFjYT4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzFkMiA8Zm9vXCsoMHh8KTFkMj4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzFkOCA8Zm9vXCsoMHh8KTFkOD4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCs3ZDBcKQotMCsxZTAgPGZvb1wrKDB4fCkxZTA+IHRzdGwgQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxZTggPGZvb1wrKDB4fCkxZTg+IHRzdGwgQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxZWUgPGZvb1wrKDB4fCkxZWU+IHRzdGwgQFwoMCszZThcKUBcKDArN2QwXCkKLTArMWY2IDxmb29cKygweHwpMWY2PiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMWZjIDxmb29cKygweHwpMWZjPiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMjAwIDxmb29cKygweHwpMjAwPiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzdkMFwpCi0wKzIwNiA8Zm9vXCsoMHh8KTIwNj4gdHN0bCBAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzIwYyA8Zm9vXCsoMHh8KTIwYz4gdHN0bCBAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzIxMCA8Zm9vXCsoMHh8KTIxMD4gdHN0bCBAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCsyMTYgPGZvb1wrKDB4fCkyMTY+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyMWUgPGZvb1wrKDB4fCkyMWU+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyMjQgPGZvb1wrKDB4fCkyMjQ+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyMmMgPGZvb1wrKDB4fCkyMmM+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyMzIgPGZvb1wrKDB4fCkyMzI+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyMzggPGZvb1wrKDB4fCkyMzg+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyM2MgPGZvb1wrKDB4fCkyM2M+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyNDIgPGZvb1wrKDB4fCkyNDI+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyNDYgPGZvb1wrKDB4fCkyNDY+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyNGUgPGZvb1wrKDB4fCkyNGU+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyNTYgPGZvb1wrKDB4fCkyNTY+IHRzdGwgJWEwQFwoMCszZTgsJWQwOmxcKUBcKDArN2QwXCkKLTArMjVlIDxmb29cKygweHwpMjVlPiB0c3RsICVhMUBcKDArM2U4LCVhMDpsXClAXCgwKzdkMFwpCi0wKzI2NiA8Zm9vXCsoMHh8KTI2Nj4gdHN0bCAlYTBAXCgwKzNlOCwlYTE6dzoyXClAXCgwKzdkMFwpCi0wKzI2ZSA8Zm9vXCsoMHh8KTI2ZT4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzI3NCA8Zm9vXCsoMHh8KTI3ND4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6bFwpQFwoMCswMDBcKQotMCsyN2EgPGZvb1wrKDB4fCkyN2E+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyODIgPGZvb1wrKDB4fCkyODI+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyODggPGZvb1wrKDB4fCkyODg+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyOGUgPGZvb1wrKDB4fCkyOGU+IHRzdGwgJWEwQFwoMCswMDAsJWQwOmxcKUBcKDArN2QwXCkKLTArMjk0IDxmb29cKygweHwpMjk0PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjk4IDxmb29cKygweHwpMjk4PiB0c3RsICVhMEBcKDArMDAwLCVkMDpsXClAXCgwKzAwMFwpCi0wKzI5YyA8Zm9vXCsoMHh8KTI5Yz4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzJhMiA8Zm9vXCsoMHh8KTJhMj4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzJhNiA8Zm9vXCsoMHh8KTJhNj4gcGVhICVwY0BcKDArMmIwIDxmb29cKygweHwpMmIwPlwpCi0wKzJhYSA8Zm9vXCsoMHh8KTJhYT4gcGVhICVwY0BcKDArMmI0IDxmb29cKygweHwpMmI0PlwpCi0wKzJhZSA8Zm9vXCsoMHh8KTJhZT4gcGVhICVwY0BcKDArMmI4IDxmb29cKygweHwpMmI4PlwpCi0wKzJiMiA8Zm9vXCsoMHh8KTJiMj4gcGVhICVwY0BcKDArMDAwIDxmb28+XCkKLTArMmI2IDxmb29cKygweHwpMmI2PiBwZWEgJXBjQFwoMCsyYzAgPGZvb1wrKDB4fCkyYzA+LCVkMDp3OjJcKQotMCsyYmEgPGZvb1wrKDB4fCkyYmE+IHBlYSAlcGNAXCgwKzJiYyA8Zm9vXCsoMHh8KTJiYz4sJWQwOnc6MlwpCi0wKzJiZSA8Zm9vXCsoMHh8KTJiZT4gcGVhICVwY0BcKDArMmM4IDxmb29cKygweHwpMmM4PiwlZDA6dzoyXCkKLTArMmMyIDxmb29cKygweHwpMmMyPiBwZWEgJXBjQFwoMCsyY2MgPGZvb1wrKDB4fCkyY2M+LCVkMDpsXCkKLTArMmM2IDxmb29cKygweHwpMmM2PiBwZWEgJXBjQFwoMCsyZDAgPGZvb1wrKDB4fCkyZDA+LCVhMDpsXCkKLTArMmNhIDxmb29cKygweHwpMmNhPiBwZWEgJXBjQFwoMCsyZDQgPGZvb1wrKDB4fCkyZDQ+LCVkMDp3OjJcKQotMCsyY2UgPGZvb1wrKDB4fCkyY2U+IHBlYSAlcGNAXCgwKzJkOCA8Zm9vXCsoMHh8KTJkOD4sJWQwOmxcKQotMCsyZDIgPGZvb1wrKDB4fCkyZDI+IHBlYSAlcGNAXCgwKzJkYyA8Zm9vXCsoMHh8KTJkYz4sJWEwOmxcKQotMCsyZDYgPGZvb1wrKDB4fCkyZDY+IHBlYSAlcGNAXCgwKzJkOCA8Zm9vXCsoMHh8KTJkOD4sJWQwOnc6MlwpCi0wKzJkYSA8Zm9vXCsoMHh8KTJkYT4gcGVhICVwY0BcKDArMmRjIDxmb29cKygweHwpMmRjPiwlZDA6bFwpCi0wKzJkZSA8Zm9vXCsoMHh8KTJkZT4gcGVhICVwY0BcKDArMmUwIDxmb29cKygweHwpMmUwPiwlYTA6bFwpCi0wKzJlMiA8Zm9vXCsoMHh8KTJlMj4gcGVhICVwY0BcKDArNmNjIDwuKj4sJWQwOnc6MlwpCi0wKzJlOCA8Zm9vXCsoMHh8KTJlOD4gcGVhICVwY0BcKDArMTg5OGEgPC4qPlwpCi0wKzJmMCA8Zm9vXCsoMHh8KTJmMD4gcGVhICVwY0BcKDArNmRhIDwuKj4sJWQwOnc6MlwpCi0wKzJmNiA8Zm9vXCsoMHh8KTJmNj4gcGVhICVwY0BcKDArNmUwIDwuKj4sJWQwOmxcKQotMCsyZmMgPGZvb1wrKDB4fCkyZmM+IHBlYSAlcGNAXCgwKzZlNiA8Lio+LCVhMTp3OjJcKQotMCszMDIgPGZvb1wrKDB4fCkzMDI+IHBlYSAlcGNAXCgwKzZlYyA8Lio+LCVhMTpsXCkKLTArMzA4IDxmb29cKygweHwpMzA4PiBwZWEgJXBjQFwoMCs2ZjIgPC4qPiwlZDA6dzoyXCkKLTArMzBlIDxmb29cKygweHwpMzBlPiBwZWEgJXBjQFwoMCs2ZjggPC4qPiwlZDA6bFwpCi0wKzMxNCA8Zm9vXCsoMHh8KTMxND4gcGVhICVwY0BcKDArNmZlIDwuKj4sJWExOmxcKQotMCszMWEgPGZvb1wrKDB4fCkzMWE+IHBlYSAlcGNAXCgwKzE4OWJjIDwuKj5cKQotMCszMjIgPGZvb1wrKDB4fCkzMjI+IHBlYSAlcGNAXCgwKzE4OWM0IDwuKj5cKQotMCszMmEgPGZvb1wrKDB4fCkzMmE+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpCi0wKzMzMCA8Zm9vXCsoMHh8KTMzMD4gcGVhICV6cGNAXCgwKzE4NmEwXCkKLTArMzM4IDxmb29cKygweHwpMzM4PiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKQotMCszM2UgPGZvb1wrKDB4fCkzM2U+IHBlYSAlenBjQFwoMCszZTgsJWQwOmxcKQotMCszNDQgPGZvb1wrKDB4fCkzNDQ+IHBlYSAlenBjQFwoMCszZTgsJWExOnc6MlwpCi0wKzM0YSA8Zm9vXCsoMHh8KTM0YT4gcGVhICV6cGNAXCgwKzNlOCwlYTE6bFwpCi0wKzM1MCA8Zm9vXCsoMHh8KTM1MD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXCkKLTArMzU2IDxmb29cKygweHwpMzU2PiBwZWEgJXpwY0BcKDArM2U4LCVkMDpsXCkKLTArMzVjIDxmb29cKygweHwpMzVjPiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXCkKLTArMzYyIDxmb29cKygweHwpMzYyPiBwZWEgJXpwY0BcKDArMTg2YTBcKQotMCszNmEgPGZvb1wrKDB4fCkzNmE+IHBlYSAlenBjQFwoMCsxODZhMFwpCi0wKzM3MiA8Zm9vXCsoMHh8KTM3Mj4gcGVhICVwY0BcKDArNzVjIDwuKj5cKUBcKDArN2QwLCVkMDp3OjJcKQotMCszN2EgPGZvb1wrKDB4fCkzN2E+IHBlYSAlcGNAXCgwKzc2NCA8Lio+XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMzgwIDxmb29cKygweHwpMzgwPiBwZWEgJXBjQFwoMCs3NmEgPC4qPlwpQFwoMCs3ZDBcKQotMCszODggPGZvb1wrKDB4fCkzODg+IHBlYSAlcGNAXCgwKzM4YSA8Zm9vXCsoMHh8KTM4YT5cKUBcKDArN2QwLCVkMDp3OjJcKQotMCszOGUgPGZvb1wrKDB4fCkzOGU+IHBlYSAlcGNAXCgwKzM5MCA8Zm9vXCsoMHh8KTM5MD5cKUBcKDArMDAwLCVkMDp3OjJcKQotMCszOTIgPGZvb1wrKDB4fCkzOTI+IHBlYSAlcGNAXCgwKzM5NCA8Zm9vXCsoMHh8KTM5ND5cKUBcKDArN2QwXCkKLTArMzk4IDxmb29cKygweHwpMzk4PiBwZWEgJXBjQFwoMCs3ODIgPC4qPlwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzNhMCA8Zm9vXCsoMHh8KTNhMD4gcGVhICVwY0BcKDArNzhhIDwuKj5cKUBcKDArMDAwLCVkMDp3OjJcKQotMCszYTYgPGZvb1wrKDB4fCkzYTY+IHBlYSAlcGNAXCgwKzc5MCA8Lio+XClAXCgwKzdkMFwpCi0wKzNhZSA8Zm9vXCsoMHh8KTNhZT4gcGVhICVwY0BcKDArM2IwIDxmb29cKygweHwpM2IwPlwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzNiNCA8Zm9vXCsoMHh8KTNiND4gcGVhICVwY0BcKDArM2I2IDxmb29cKygweHwpM2I2PlwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzNiOCA8Zm9vXCsoMHh8KTNiOD4gcGVhICVwY0BcKDArM2JhIDxmb29cKygweHwpM2JhPlwpQFwoMCs3ZDBcKQotMCszYmUgPGZvb1wrKDB4fCkzYmU+IHBlYSAlenBjQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCszYzYgPGZvb1wrKDB4fCkzYzY+IHBlYSAlenBjQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCszY2MgPGZvb1wrKDB4fCkzY2M+IHBlYSAlenBjQFwoMCszZThcKUBcKDArN2QwXCkKLTArM2Q0IDxmb29cKygweHwpM2Q0PiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKLTArM2RhIDxmb29cKygweHwpM2RhPiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKLTArM2RlIDxmb29cKygweHwpM2RlPiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzdkMFwpCi0wKzNlNCA8Zm9vXCsoMHh8KTNlND4gcGVhICV6cGNAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzNlYyA8Zm9vXCsoMHh8KTNlYz4gcGVhICV6cGNAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzNmMiA8Zm9vXCsoMHh8KTNmMj4gcGVhICV6cGNAXCgwKzNlOFwpQFwoMCs3ZDBcKQotMCszZmEgPGZvb1wrKDB4fCkzZmE+IHBlYSAlenBjQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCs0MDAgPGZvb1wrKDB4fCk0MDA+IHBlYSAlenBjQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCs0MDQgPGZvb1wrKDB4fCk0MDQ+IHBlYSAlenBjQFwoMCswMDBcKUBcKDArN2QwXCkKLTArNDBhIDxmb29cKygweHwpNDBhPiBwZWEgJXBjQFwoMCs3ZjQgPC4qPiwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQxMiA8Zm9vXCsoMHh8KTQxMj4gcGVhICVwY0BcKDArN2ZjIDwuKj4sJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0MTggPGZvb1wrKDB4fCk0MTg+IHBlYSAlcGNAXCgwKzQxYSA8Zm9vXCsoMHh8KTQxYT4sJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0MWUgPGZvb1wrKDB4fCk0MWU+IHBlYSAlcGNAXCgwKzQyMCA8Zm9vXCsoMHh8KTQyMD4sJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0MjIgPGZvb1wrKDB4fCk0MjI+IHBlYSAlcGNAXCgwKzgwYyA8Lio+LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDJhIDxmb29cKygweHwpNDJhPiBwZWEgJXBjQFwoMCs4MTQgPC4qPiwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQzMiA8Zm9vXCsoMHh8KTQzMj4gcGVhICVwY0BcKDArODFjIDwuKj4sJWQwOmxcKUBcKDArN2QwXCkKLTArNDNhIDxmb29cKygweHwpNDNhPiBwZWEgJXBjQFwoMCs4MjQgPC4qPiwlYTE6bFwpQFwoMCs3ZDBcKQotMCs0NDIgPGZvb1wrKDB4fCk0NDI+IHBlYSAlcGNAXCgwKzgyYyA8Lio+LCVhMTpsXClAXCgwKzdkMFwpCi0wKzQ0YSA8Zm9vXCsoMHh8KTQ0YT4gcGVhICVwY0BcKDArODM0IDwuKj4sJWExOnc6MlwpQFwoMCs3ZDBcKQotMCs0NTIgPGZvb1wrKDB4fCk0NTI+IHBlYSAlcGNAXCgwKzgzYyA8Lio+LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNDU4IDxmb29cKygweHwpNDU4PiBwZWEgJXBjQFwoMCs4NDIgPC4qPiwlZDA6bFwpQFwoMCswMDBcKQotMCs0NWUgPGZvb1wrKDB4fCk0NWU+IHBlYSAlcGNAXCgwKzg0OCA8Lio+LCVhMTpsXClAXCgwKzAwMFwpCi0wKzQ2NCA8Zm9vXCsoMHh8KTQ2ND4gcGVhICVwY0BcKDArNDY2IDxmb29cKygweHwpNDY2PiwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQ2YSA8Zm9vXCsoMHh8KTQ2YT4gcGVhICVwY0BcKDArNDZjIDxmb29cKygweHwpNDZjPiwlYTA6bFwpQFwoMCs3ZDBcKQotMCs0NzAgPGZvb1wrKDB4fCk0NzA+IHBlYSAlcGNAXCgwKzQ3MiA8Zm9vXCsoMHh8KTQ3Mj4sJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0NzQgPGZvb1wrKDB4fCk0NzQ+IHBlYSAlcGNAXCgwKzQ3NiA8Zm9vXCsoMHh8KTQ3Nj4sJWQwOmxcKUBcKDArMDAwXCkKLTArNDc4IDxmb29cKygweHwpNDc4PiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDgwIDxmb29cKygweHwpNDgwPiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNDg2IDxmb29cKygweHwpNDg2PiBwZWEgJXpwY0BcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDhjIDxmb29cKygweHwpNDhjPiBwZWEgJXpwY0BcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNDkwIDxmb29cKygweHwpNDkwPiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDk4IDxmb29cKygweHwpNDk4PiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNGEwIDxmb29cKygweHwpNGEwPiBwZWEgJXpwY0BcKDArM2U4LCVkMDpsXClAXCgwKzdkMFwpCi0wKzRhOCA8Zm9vXCsoMHh8KTRhOD4gcGVhICV6cGNAXCgwKzNlOCwlYTE6bFwpQFwoMCs3ZDBcKQotMCs0YjAgPGZvb1wrKDB4fCk0YjA+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKUBcKDArN2QwXCkKLTArNGI4IDxmb29cKygweHwpNGI4PiBwZWEgJXpwY0BcKDArM2U4LCVhMTp3OjJcKUBcKDArN2QwXCkKLTArNGMwIDxmb29cKygweHwpNGMwPiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNGM2IDxmb29cKygweHwpNGM2PiBwZWEgJXpwY0BcKDArM2U4LCVkMDpsXClAXCgwKzAwMFwpCi0wKzRjYyA8Zm9vXCsoMHh8KTRjYz4gcGVhICV6cGNAXCgwKzNlOCwlYTE6bFwpQFwoMCswMDBcKQotMCs0ZDIgPGZvb1wrKDB4fCk0ZDI+IHBlYSAlenBjQFwoMCswMDAsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0ZDggPGZvb1wrKDB4fCk0ZDg+IHBlYSAlenBjQFwoMCswMDAsJWEwOmxcKUBcKDArN2QwXCkKLTArNGRlIDxmb29cKygweHwpNGRlPiBwZWEgJXpwY0BcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNGUyIDxmb29cKygweHwpNGUyPiBwZWEgJXpwY0BcKDArMDAwLCVkMDpsXClAXCgwKzAwMFwpCi0wKzRlNiA8Zm9vXCsoMHh8KTRlNj4gdHN0bCAwKzAwNCA8Zm9vXCsoMHh8KTQ+Ci0wKzRlYSA8Zm9vXCsoMHh8KTRlYT4gdHN0bCAwKzAwNCA8Zm9vXCsoMHh8KTQ+Ci0wKzRlZSA8Zm9vXCsoMHh8KTRlZT4gdHN0bCAwKzAwNCA8Zm9vXCsoMHh8KTQ+Ci0wKzRmMiA8Zm9vXCsoMHh8KTRmMj4gdHN0bCAwKzE4NmEwIDwuKj4KLTArNGY4IDxmb29cKygweHwpNGY4PiB0c3RsIDArMDA4IDxmb29cKygweHwpOD4KLTArNGZlIDxmb29cKygweHwpNGZlPiB0c3RsIDArMDA4IDxmb29cKygweHwpOD4KLTArNTA0IDxmb29cKygweHwpNTA0PiBhZGRpYiAjMSwlZDAKLTArNTA4IDxmb29cKygweHwpNTA4PiBhZGRpdyAjMSwlZDAKLTArNTBjIDxmb29cKygweHwpNTBjPiBhZGRpbCAjMSwlZDAKLTArNTEyIDxmb29cKygweHwpNTEyPiBhZGRxYiAjMSwlZDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5ZjU2Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotIyBUZXN0IGhhbmRsaW5nIG9mIE1JVCBhbmQgTW90b3JvbGEgc3ludGF4IG9wZXJhbmRzCi0jIElmIHlvdSBjaGFuZ2UgdGhpcyBmaWxlLCBzZWUgYWxzbyBvcDY4MDAwLmQuCi0JLnRleHQKLWZvbzoJCi0JfCBEYXRhIHJlZ2lzdGVyIGRpcmVjdAotCXRzdGwJJWQwCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgZGlyZWN0Ci0JdHN0bAklYTAKLQotCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdAotCXRzdGwJJWEwQAotCXRzdGwJKCVhMCkKLQotCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3RpbmNyZW1lbnQKLQl0c3RsCSVhMEArCi0JdHN0bAkoJWEwKSsKLQotCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZWRlY3JlbWVudAotCXRzdGwJJWEwQC0KLQl0c3RsCS0oJWEwKQotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0JdHN0bAklYTBAKDgpCi0JdHN0bAkoOCwlYTApCi0JdHN0bAk4KCVhMCkKLQotCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIGluZGV4ICg4LWJpdCBkaXNwbGFjZW1lbnQpCi0JdHN0bAklYTBAKDgsJWQwKQotCXRzdGwJJWEwQCg4LCVkMDp3KQotCXRzdGwJJWEwQCg4LCVkMDp3OjEpCi0JdHN0bAklYTBAKDgsJWQwOnc6MikKLQl0c3RsCSVhMEAoOCwlZDA6dzo0KQotCXRzdGwJJWEwQCg4LCVkMDp3OjgpCi0JdHN0bAklYTBAKDgsJWQwOmwpCi0JdHN0bAklYTBAKDgsJWQwOmw6MSkKLQl0c3RsCSVhMEAoOCwlZDA6bDoyKQotCXRzdGwJJWEwQCg4LCVkMDpsOjQpCi0JdHN0bAklYTBAKDgsJWQwOmw6OCkKLQl0c3RsCSVhMEAoJWQwOnc6MikKLQl0c3RsCSg4LCVhMCwlZDApCi0JdHN0bAkoOCwlYTAsJWQwKjEpCi0JdHN0bAkoOCwlYTAsJWQwKjIpCi0JdHN0bAkoOCwlYTAsJWQwKjQpCi0JdHN0bAkoOCwlYTAsJWQwKjgpCi0JdHN0bAkoOCwlYTAsJWQwLncpCi0JdHN0bAkoOCwlYTAsJWQwLncqMSkKLQl0c3RsCSg4LCVhMCwlZDAudyoyKQotCXRzdGwJKDgsJWEwLCVkMC53KjQpCi0JdHN0bAkoOCwlYTAsJWQwLncqOCkKLQl0c3RsCSg4LCVhMCwlZDAubCkKLQl0c3RsCSg4LCVhMCwlZDAubCoxKQotCXRzdGwJKDgsJWEwLCVkMC5sKjIpCi0JdHN0bAkoOCwlYTAsJWQwLmwqNCkKLQl0c3RsCSg4LCVhMCwlZDAubCo4KQotCXRzdGwJKDgsJWQwLCVhMCkKLQl0c3RsCSg4LCVhMS53KjIsJWEwKQotCXRzdGwJKDgsJWExLCVhMCkKLQl0c3RsCTgoJWEwLCVkMC53KjIpCi0JdHN0bAk4KCVkMC53KjIsJWEwKQotCXRzdGwJOCglYTEudyoyLCVhMCkKLQl0c3RsCSglYTAsJWQwLncqMikKLQl0c3RsCSglZDAudyoyLCVhMCkKLQotCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIGluZGV4IChiYXNlIGRpc3BsYWNlbWVudCkKLQl0c3RsCSVhMEAoMTAwMCwlZDA6dzoyKQotCXRzdGwJQCgxMDAwLCVkMDp3OjIpCi0JdHN0bAlAKCVkMDp3OjIpCi0JdHN0bAlAKDEwMDApCi0JdHN0bAklYTBAKDEwMDAwMCkKLQl0c3RsCSgxMDAwLCVhMCwlZDAudyoyKQotCXRzdGwJKDEwMDAsJWQwLCVhMCkKLQl0c3RsCSgxMDAwLCVhMS53KjIsJWEwKQotCXRzdGwJMTAwMCglYTAsJWQwLncqMikKLQl0c3RsCTEwMDAoJWQwLCVhMCkKLQl0c3RsCSgxMDAwLCVkMC53KjIpCi0JdHN0bAkxMDAwKCVkMC53KjIpCi0JdHN0bAkoJWQwLncqMikKLQl0c3RsCSgxMDAwMDAsJWEwKQotCXRzdGwJMTAwMDAwKCVhMCkKLQl0c3RsCSV6YTFAKDEwMDAsJWQwOnc6MikKLQl0c3RsCSV6YTFAKDEwMDAwMCkKLQl0c3RsCSgxMDAwLCV6YTEsJWQwLncqMikKLQl0c3RsCSgxMDAwLCVkMCwlemExKQotCXRzdGwJKDEwMDAsJWExLncqMiwlemExKQotCXRzdGwJMTAwMCglemExLCVkMC53KjIpCi0JdHN0bAkxMDAwKCVkMCwlemExKQotCXRzdGwJKDEwMDAwMCwlemExKQotCXRzdGwJMTAwMDAwKCV6YTEpCi0JdHN0bAklYTBAKDEwMDAsJXpkMTp3OjIpCi0JdHN0bAlAKDEwMDAsJXpkMTp3OjIpCi0JdHN0bAlAKCV6ZDE6dzoyKQotCXRzdGwJKDEwMDAsJWEwLCV6ZDEudyoyKQotCXRzdGwJKDEwMDAsJXpkMSwlYTApCi0JdHN0bAkoMTAwMCwlemExLncqMiwlYTApCi0JdHN0bAkxMDAwKCVhMCwlemQxLncqMikKLQl0c3RsCTEwMDAoJXpkMSwlYTApCi0JdHN0bAkoMTAwMCwlemQxLncqMikKLQl0c3RsCTEwMDAoJXpkMS53KjIpCi0JdHN0bAkoJXpkMS53KjIpCi0KLQl8IE1lbW9yeSBpbmRpcmVjdCBwb3N0aW5kZXhlZAotCXRzdGwJJWEwQCgxMDAwKUAoMjAwMCwlZDA6dzoyKQotCXRzdGwJJWEwQCgxMDAwKUAoJWQwOnc6MikKLQl0c3RsCSVhMEAoMTAwMClAKDIwMDApCi0JdHN0bAlAKDEwMDApQCgyMDAwLCVkMDp3OjIpCi0JdHN0bAlAKDEwMDApQCglZDA6dzoyKQotCXRzdGwJQCgxMDAwKUAoMjAwMCkKLQl0c3RsCSVhMEAoMClAKDIwMDAsJWQwOnc6MikKLQl0c3RsCSVhMEAoMClAKCVkMDp3OjIpCi0JdHN0bAklYTBAKDApQCgyMDAwKQotCXRzdGwJQCgwKUAoMjAwMCwlZDA6dzoyKQotCXRzdGwJQCgwKUAoJWQwOnc6MikKLQl0c3RsCUAoMClAKDIwMDApCi0JdHN0bAkoWzEwMDAsJWEwXSwlZDA6dzoyLDIwMDApCi0JdHN0bAkoWzEwMDAsJWEwXSwlZDA6dzoyKQotCXRzdGwJKFsxMDAwLCVhMF0sMjAwMCkKLQl0c3RsCShbMTAwMF0sJWQwOnc6MiwyMDAwKQotCXRzdGwJKFsxMDAwXSwlZDA6dzoyKQotCXRzdGwJKFsxMDAwXSwyMDAwKQotCXRzdGwJKFslYTBdLCVkMDp3OjIsMjAwMCkKLQl0c3RsCShbJWEwXSwlZDA6dzoyKQotCXRzdGwJKFslYTBdLDIwMDApCi0JdHN0bAkoWzBdLCVkMDp3OjIsMjAwMCkKLQl0c3RsCShbMF0sJWQwOnc6MikKLQl0c3RsCShbMF0sMjAwMCkKLQotCXwgTWVtb3J5IGluZGlyZWN0IHByZWluZGV4ZWQKLQl0c3RsCSVhMEAoMTAwMCwlZDA6dzoyKUAoMjAwMCkKLQl0c3RsCSVhMEAoMTAwMCwlZDA6dzoyKUAoMCkKLQl0c3RsCUAoMTAwMCwlZDA6dzoyKUAoMjAwMCkKLQl0c3RsCUAoMTAwMCwlZDA6dzoyKUAoMCkKLQl0c3RsCSVhMEAoJWQwOnc6MilAKDIwMDApCi0JdHN0bAklYTBAKCVkMDp3OjIpQCgwKQotCXRzdGwJQCglZDA6dzoyKUAoMjAwMCkKLQl0c3RsCUAoJWQwOnc6MilAKDApCi0JdHN0bAkoWzEwMDAsJWEwLCVkMDp3OjJdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWQwOnc6MiwlYTBdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWQwLCVhMF0sMjAwMCkKLQl0c3RsCShbMTAwMCwlYTEsJWEwXSwyMDAwKQotCXRzdGwJKFsxMDAwLCVhMTp3OjIsJWEwXSwyMDAwKQotCXRzdGwJKFsxMDAwLCVhMCwlZDA6dzoyXSkKLQl0c3RsCShbMTAwMCwlZDAsJWEwXSkKLQl0c3RsCShbMTAwMCwlZDA6dzoyXSwyMDAwKQotCXRzdGwJKFsxMDAwLCVkMDp3OjJdKQotCXRzdGwJKFslYTAsJWQwOnc6Ml0sMjAwMCkKLQl0c3RsCShbJWQwLCVhMF0sMjAwMCkKLQl0c3RsCShbJWEwLCVkMDp3OjJdKQotCXRzdGwJKFslZDAsJWEwXSkKLQl0c3RsCShbJWQwOnc6Ml0sMjAwMCkKLQl0c3RsCShbJWQwOnc6Ml0pCi0KLQl8IFByb2dyYW0gY291bnRlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotCXBlYQklcGNAKDgpCi0JcGVhCSg4LCVwYykKLQlwZWEJOCglcGMpCi0JcGVhCWZvbwotCi0JfCBQcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCBpbmRleCAoOC1iaXQgZGlzcGxhY2VtZW50KQotCXBlYQklcGNAKDgsJWQwOnc6MikKLQlwZWEJJXBjQCglZDA6dzoyKQotCXBlYQkoOCwlcGMsJWQwLncqMikKLQlwZWEJKDgsJWQwLCVwYykKLQlwZWEJKDgsJWEwLCVwYykKLQlwZWEJOCglcGMsJWQwLncqMikKLQlwZWEJOCglZDAsJXBjKQotCXBlYQk4KCVhMCwlcGMpCi0JcGVhCSglcGMsJWQwLncqMikKLQlwZWEJKCVkMCwlcGMpCi0JcGVhCSglYTAsJXBjKQotCi0JfCBQcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCBpbmRleCAoYmFzZSBkaXNwbGFjZW1lbnQpCi0JcGVhCSVwY0AoMTAwMCwlZDA6dzoyKQotCXBlYQklcGNAKDEwMDAwMCkKLQlwZWEJKDEwMDAsJXBjLCVkMC53KjIpCi0JcGVhCSgxMDAwLCVkMCwlcGMpCi0JcGVhCSgxMDAwLCVhMS53KjIsJXBjKQotCXBlYQkoMTAwMCwlYTEsJXBjKQotCXBlYQkxMDAwKCVwYywlZDAudyoyKQotCXBlYQkxMDAwKCVkMCwlcGMpCi0JcGVhCTEwMDAoJWExLCVwYykKLQlwZWEJKDEwMDAwMCwlcGMpCi0JcGVhCTEwMDAwMCglcGMpCi0JcGVhCSV6cGNAKDEwMDAsJWQwOnc6MikKLQlwZWEJJXpwY0AoMTAwMDAwKQotCXBlYQkoMTAwMCwlenBjLCVkMC53KjIpCi0JcGVhCSgxMDAwLCVkMCwlenBjKQotCXBlYQkoMTAwMCwlYTEudyoyLCV6cGMpCi0JcGVhCSgxMDAwLCVhMSwlenBjKQotCXBlYQkxMDAwKCV6cGMsJWQwLncqMikKLQlwZWEJMTAwMCglZDAsJXpwYykKLQlwZWEJMTAwMCglYTEsJXpwYykKLQlwZWEJKDEwMDAwMCwlenBjKQotCXBlYQkxMDAwMDAoJXpwYykKLQotCXwgUHJvZ3JhbSBjb3VudGVyIG1lbW9yeSBpbmRpcmVjdCBwb3N0aW5kZXhlZAotCXBlYQklcGNAKDEwMDApQCgyMDAwLCVkMDp3OjIpCi0JcGVhCSVwY0AoMTAwMClAKCVkMDp3OjIpCi0JcGVhCSVwY0AoMTAwMClAKDIwMDApCi0JcGVhCSVwY0AoMClAKDIwMDAsJWQwOnc6MikKLQlwZWEJJXBjQCgwKUAoJWQwOnc6MikKLQlwZWEJJXBjQCgwKUAoMjAwMCkKLQlwZWEJKFsxMDAwLCVwY10sJWQwOnc6MiwyMDAwKQotCXBlYQkoWzEwMDAsJXBjXSwlZDA6dzoyKQotCXBlYQkoWzEwMDAsJXBjXSwyMDAwKQotCXBlYQkoWyVwY10sJWQwOnc6MiwyMDAwKQotCXBlYQkoWyVwY10sJWQwOnc6MikKLQlwZWEJKFslcGNdLDIwMDApCi0JcGVhCSV6cGNAKDEwMDApQCgyMDAwLCVkMDp3OjIpCi0JcGVhCSV6cGNAKDEwMDApQCglZDA6dzoyKQotCXBlYQklenBjQCgxMDAwKUAoMjAwMCkKLQlwZWEJJXpwY0AoMClAKDIwMDAsJWQwOnc6MikKLQlwZWEJJXpwY0AoMClAKCVkMDp3OjIpCi0JcGVhCSV6cGNAKDApQCgyMDAwKQotCXBlYQkoWzEwMDAsJXpwY10sJWQwOnc6MiwyMDAwKQotCXBlYQkoWzEwMDAsJXpwY10sJWQwOnc6MikKLQlwZWEJKFsxMDAwLCV6cGNdLDIwMDApCi0JcGVhCShbJXpwY10sJWQwOnc6MiwyMDAwKQotCXBlYQkoWyV6cGNdLCVkMDp3OjIpCi0JcGVhCShbJXpwY10sMjAwMCkKLQotCXwgUHJvZ3JhbSBjb3VudGVyIG1lbW9yeSBpbmRpcmVjdCBwcmVpbmRleGVkCi0JcGVhCSVwY0AoMTAwMCwlZDA6dzoyKUAoMjAwMCkKLQlwZWEJJXBjQCgxMDAwLCVkMDp3OjIpQCgwKQotCXBlYQklcGNAKCVkMDp3OjIpQCgyMDAwKQotCXBlYQklcGNAKCVkMDp3OjIpQCgwKQotCXBlYQkoWzEwMDAsJXBjLCVkMDp3OjJdLDIwMDApCi0JcGVhCShbMTAwMCwlZDA6dzoyLCVwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVkMCwlcGNdLDIwMDApCi0JcGVhCShbMTAwMCwlYTEsJXBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJXBjLCVhMV0sMjAwMCkKLQlwZWEJKFsxMDAwLCVhMTp3OjIsJXBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJXBjLCVkMDp3OjJdKQotCXBlYQkoWzEwMDAsJWQwLCVwY10pCi0JcGVhCShbMTAwMCwlYTEsJXBjXSkKLQlwZWEJKFslcGMsJWQwOnc6Ml0sMjAwMCkKLQlwZWEJKFslcGMsJWEwXSwyMDAwKQotCXBlYQkoWyVwYywlZDA6dzoyXSkKLQlwZWEJKFslZDAsJXBjXSkKLQlwZWEJJXpwY0AoMTAwMCwlZDA6dzoyKUAoMjAwMCkKLQlwZWEJJXpwY0AoMTAwMCwlZDA6dzoyKUAoMCkKLQlwZWEJJXpwY0AoJWQwOnc6MilAKDIwMDApCi0JcGVhCSV6cGNAKCVkMDp3OjIpQCgwKQotCXBlYQkoWzEwMDAsJXpwYywlZDA6dzoyXSwyMDAwKQotCXBlYQkoWzEwMDAsJWQwOnc6MiwlenBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJWQwLCV6cGNdLDIwMDApCi0JcGVhCShbMTAwMCwlYTEsJXpwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCV6cGMsJWExXSwyMDAwKQotCXBlYQkoWzEwMDAsJWExOnc6MiwlenBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJXpwYywlZDA6dzoyXSkKLQlwZWEJKFsxMDAwLCVkMCwlenBjXSkKLQlwZWEJKFsxMDAwLCVhMSwlenBjXSkKLQlwZWEJKFslenBjLCVkMDp3OjJdLDIwMDApCi0JcGVhCShbJXpwYywlYTBdLDIwMDApCi0JcGVhCShbJXpwYywlZDA6dzoyXSkKLQlwZWEJKFslZDAsJXpwY10pCi0KLQl8IEFic29sdXRlIHNob3J0Ci0JdHN0bAk0Ci0JdHN0bAk0LncKLQl0c3RsCSg0KS53Ci0KLQl8IEFic29sdXRlIGxvbmcKLQl0c3RsCTEwMDAwMAotCXRzdGwJOC5sCi0JdHN0bAkoOCkubAotCi0JfCBJbW1lZGlhdGUKLQlhZGRpYgkmMSwlZDAKLQlhZGRpdwkmMSwlZDAKLQlhZGRpbAkmMSwlZDAKLQlhZGRxYgkmMSwlZDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI0MTAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI0MTAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwMzM3YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNDEwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0udGV4dAotc3RhcnQ6CW5vcAotCW5vcAotCW5vcAotCWJyYXMgbGFiZWwxCi0JYnJhcyBsYWJlbDIKLS5nbG9ibCBsYWJlbDEKLWxhYmVsMToJbm9wCi0JLnNwYWNlIDB4YTAKLQlub3AKLQlub3AKLS5nbG9ibCBsYWJlbDIKLWxhYmVsMjoJYnJhcyBsYWJlbDEKLQlicmFzIGxhYmVsMgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjY2My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjY2My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjM2NTBmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI2NjMucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXwKLXwgVGhpcyBjb2RlIGdlbmVyYXRlcyBhbiBpbmNvcnJlY3QgcGMgcmVsYXRpdmUgb2Zmc2V0IAotfAotYnVnOiAgICAgICBtb3ZlbCAgIzQsJWQ3Ci0gICAgICAgICAgIGpzciAgICB0YWJsZSglcGMsJWQ3LncpICAgICAgICAgICAgfCB3cm9uZwotICAgICAgICAgICBqc3IgICAgJXBjQCh0YWJsZS0uLTI6YiwlZDc6dykgICAgIHwgY29ycmVjdCBidXQgY3J5cHRpYwotICAgICAgICAgICBub3AKLSAgICAgICAgICAgbm9wCi10YWJsZToKLSAgICAgICAgICAgYnJhICAgIGp1bmsKLSAgICAgICAgICAgYnJhICAgIGp1bmsKLSAgICAgICAgICAgYnJhICAgIGp1bmsKLQotanVuazoKLSAgICBub3AKLSAgICBydHMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5ODM1OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jbmFtZTogcGNyZWwKLSNvYmpkdW1wOiAtZHJzIC1qIC50ZXh0IC0tcHJlZml4LWFkZHJlc3NlcwotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci0gMDAwMCA0ZTcxNGU3MSA0Y2ZhMDMwMCBmZmZhNGNmYSAwMzAwZmZmNCAgTnFOcUwuLi4uLkwuLi4uLgotIDAwMTAgNGNmYjAzMDAgMDhlZTQxZmEgZmZlYTQxZmEgZmZlNjQxZmEgIEwuLi4uLkEuLi5BLi4uQS4KLSAwMDIwIGZmNjI0MWZiIDA4ZGU0MWZiIDA4ZGE0MWZiIDA4ZDY0MWZiICAuYkEuLi5BLi4uQS4uLkEuCi0gMDAzMCAwOTIwZmZkMiA0MWZiMDkyMCBmZmNjNDFmYiAwOTMwZmZmZiAgLiAuLkEuLiAuLkEuLjAuLgotIDAwNDAgZmZjNjQxZmIgMDkzMGZmZmYgZmZiZTRlNzEgNjFmZjAwMDAgIC4uQS4uMC4uLi5OcWEuLi4KLSAwMDUwIDAwNTg2MTAwIDAwNTI2MTRlIDYxNGM0ZTcxIDQxZjkwMDAwICAuWGEuLlJhTmFMTnFBLi4uCi0gMDA2MCAwMChhNnwwMCk0MWZhIDAwNDI0MWZhIDAwYmU0MWZiIDA4M2E0MWZiICAuLkEuLkJBLi4uQS4uOkEuCi0gMDA3MCAwODM2NDFmYiAwODMyNDFmYiAwOTIwMDAyZSA0MWZiMDkyMCAgLjZBLi4yQS4uIC4uQS4uIAotIDAwODAgMDAyODQxZmIgMDkzMDAwMDAgMDAyMjQxZmIgMDkzMDAwMDAgIC5cKEEuLjAuLi4iQS4uMC4uCi0gMDA5MCAwMDFhNDFmYiAwOTMwMDAwMCAwMDEyNDFmYiAwOTIwMDAwYSAgLi5BLi4wLi4uLkEuLiAuLgotIDAwYTAgNDFmYjA4MDQgNGU3MTRlNzEgNGU3MTQxZmIgMDg4MDQxZmIgIEEuLi5OcU5xTnFBLi4uQS4KLSAwMGIwIDA5MjBmZjdmIDQxZmIwOTIwIDgwMDA0MWZiIDA5MzBmZmZmICAuIC4uQS4uIC4uQS4uMC4uCi0gMDBjMCA3ZmZmNGU3MSA0MWZiMDg3ZiA0MWZiMDkyMCAwMDgwNDFmYiAgLi5OcUEuLi5BLi4gLi5BLgotIDAwZDAgMDkyMDdmZmYgNDFmYjA5MzAgMDAwMDgwMDAgNGU3MTQxZmEgIC4gLi5BLi4wLi4uLk5xQS4KLSAwMGUwIDgwMDA0MWZiIDAxNzBmZmZmIDdmZmY0ZTcxIDQxZmE3ZmZmICAuLkEuLnAuLi4uTnFBLi4uCi0gMDBmMCA0MWZiMDE3MCAwMDAwODAwMCA0ZTcxNDFmYiAwMTcwKGZmZmZ8MDAwMCkgIEEuLnAuLi4uTnFBLi5wLi4KLSAwMTAwIChmZjA0fDAwMDApNDFmYiAwOTMwKGZmZmZ8MDAwMCkgKGZlZmN8MDAwMCk0ZTcxIDQxZjkwMDAwICAuLkEuLjAuLi4uTnFBLi4uCi0gMDExMCAwMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgLi4uLi4uLi4uLi4uLi4uLgotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPC4qPiBub3AKLTArMDAwMiA8bGJsX2I+IG5vcAotMCswMDA0IDxsYmxfYlwrKDB4fCkyPiBtb3ZlbWwgJXBjQFwoMCswMDAyIDxsYmxfYj5cKSwlYTAtJWExCi0wKzAwMGEgPGxibF9iXCsoMHh8KTg+IG1vdmVtbCAlcGNAXCgwKzAwMDIgPGxibF9iPlwpLCVhMC0lYTEKLTArMDAxMCA8bGJsX2JcKygweHwpZT4gbW92ZW1sICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMC0lYTEKLTArMDAxNiA8bGJsX2JcKygweHwpMTQ+IGxlYSAlcGNAXCgwKzAwMDIgPGxibF9iPlwpLCVhMAotMCswMDFhIDxsYmxfYlwrKDB4fCkxOD4gbGVhICVwY0BcKDArMDAwMiA8bGJsX2I+XCksJWEwCi0wKzAwMWUgPGxibF9iXCsoMHh8KTFjPiBsZWEgJXBjQFwoZitmZjgyIDwuKj5cKSwlYTAKLTArMDAyMiA8bGJsX2JcKygweHwpMjA+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKLTArMDAyNiA8bGJsX2JcKygweHwpMjQ+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKLTArMDAyYSA8bGJsX2JcKygweHwpMjg+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKLTArMDAyZSA8bGJsX2JcKygweHwpMmM+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKLTArMDAzNCA8bGJsX2JcKygweHwpMzI+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKLTArMDAzYSA8bGJsX2JcKygweHwpMzg+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKLTArMDA0MiA8bGJsX2JcKygweHwpNDA+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKLTArMDA0YSA8bGJsX2JcKygweHwpNDg+IG5vcAotMCswMDRjIDxsYmxfYlwrKDB4fCk0YT4gYnNybCAwKzAwYTYgPGxibF9hPgotMCswMDUyIDxsYmxfYlwrKDB4fCk1MD4gYnNydyAwKzAwYTYgPGxibF9hPgotMCswMDU2IDxsYmxfYlwrKDB4fCk1ND4gYnNycyAwKzAwYTYgPGxibF9hPgotMCswMDU4IDxsYmxfYlwrKDB4fCk1Nj4gYnNycyAwKzAwYTYgPGxibF9hPgotMCswMDVhIDxsYmxfYlwrKDB4fCk1OD4gbm9wCi0wKzAwNWMgPGxibF9iXCsoMHh8KTVhPiBsZWEgKDArMDBhNiA8bGJsX2E+fDArMCA8Lio+KSwlYTAKLQkJCTVlOiAoMzIJXC50ZXh0fFJfNjhLXzMyCVwudGV4dFwrMHhhNikKLTArMDA2MiA8bGJsX2JcKygweHwpNjA+IGxlYSAlcGNAXCgwKzAwYTYgPGxibF9hPlwpLCVhMAotMCswMDY2IDxsYmxfYlwrKDB4fCk2ND4gbGVhICVwY0BcKDArMDEyNiA8Lio+XCksJWEwCi0wKzAwNmEgPGxibF9iXCsoMHh8KTY4PiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwNmUgPGxibF9iXCsoMHh8KTZjPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwNzIgPGxibF9iXCsoMHh8KTcwPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwNzYgPGxibF9iXCsoMHh8KTc0PiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwN2MgPGxibF9iXCsoMHh8KTdhPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwODIgPGxibF9iXCsoMHh8KTgwPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwOGEgPGxibF9iXCsoMHh8KTg4PiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwOTIgPGxibF9iXCsoMHh8KTkwPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwOWEgPGxibF9iXCsoMHh8KTk4PiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwYTAgPGxibF9iXCsoMHh8KTllPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCi0wKzAwYTQgPGxibF9iXCsoMHh8KWEyPiBub3AKLTArMDBhNiA8bGJsX2E+IG5vcAotMCswMGE4IDxsYmxfYVwrKDB4fCkyPiBub3AKLTArMDBhYSA8bGJsX2FcKygweHwpND4gbGVhICVwY0BcKDArMmMgPGxibF9iXCsoMHh8KTJhPiwlZDA6bFwpLCVhMAotMCswMGFlIDxsYmxfYVwrKDB4fCk4PiBsZWEgJXBjQFwoMCsyZiA8bGJsX2JcKygweHwpMmQ+LCVkMDpsXCksJWEwCi0wKzAwYjQgPGxibF9hXCsoMHh8KWU+IGxlYSAlcGNAXChmKzgwYjYgPC4qPiwlZDA6bFwpLCVhMAotMCswMGJhIDxsYmxfYVwrKDB4fCkxND4gbGVhICVwY0BcKGYrODBiYiA8Lio+LCVkMDpsXCksJWEwCi0wKzAwYzIgPGxibF9hXCsoMHh8KTFjPiBub3AKLTArMDBjNCA8bGJsX2FcKygweHwpMWU+IGxlYSAlcGNAXCgwKzE0NSA8Lio+LCVkMDpsXCksJWEwCi0wKzAwYzggPGxibF9hXCsoMHh8KTIyPiBsZWEgJXBjQFwoMCsxNGEgPC4qPiwlZDA6bFwpLCVhMAotMCswMGNlIDxsYmxfYVwrKDB4fCkyOD4gbGVhICVwY0BcKDArODBjZiA8Lio+LCVkMDpsXCksJWEwCi0wKzAwZDQgPGxibF9hXCsoMHh8KTJlPiBsZWEgJXBjQFwoMCs4MGQ2IDwuKj4sJWQwOmxcKSwlYTAKLTArMDBkYyA8bGJsX2FcKygweHwpMzY+IG5vcAotMCswMGRlIDxsYmxfYVwrKDB4fCkzOD4gbGVhICVwY0BcKGYrODBlMCA8Lio+XCksJWEwCi0wKzAwZTIgPGxibF9hXCsoMHh8KTNjPiBsZWEgJXBjQFwoZis4MGUzIDwuKj5cKSwlYTAKLTArMDBlYSA8bGJsX2FcKygweHwpNDQ+IG5vcAotMCswMGVjIDxsYmxfYVwrKDB4fCk0Nj4gbGVhICVwY0BcKDArODBlZCA8Lio+XCksJWEwCi0wKzAwZjAgPGxibF9hXCsoMHh8KTRhPiBsZWEgJXBjQFwoMCs4MGYyIDwuKj5cKSwlYTAKLTArMDBmOCA8bGJsX2FcKygweHwpNTI+IG5vcAotMCswMGZhIDxsYmxfYVwrKDB4fCk1ND4gbGVhICVwY0BcKCgwKzAgPC4qPnwwKzBmYyA8bGJsX2FcKygweHwpNTY+KVwpLCVhMAotCQkJZmU6IChESVNQMzIJdW5kZWZ8Ul82OEtfUEMzMgl1bmRlZlwrMHgyKQotMCswMTAyIDxsYmxfYVwrKDB4fCk1Yz4gbGVhICVwY0BcKCgwKzAgPC4qPnwwKzAxMDQgPGxibF9hXCsoMHh8KTVlPiksJWQwOmxcKSwlYTAKLQkJCTEwNjogKERJU1AzMgl1bmRlZnxSXzY4S19QQzMyCXVuZGVmXCsweDIpCi0wKzAxMGEgPGxibF9hXCsoMHh8KTY0PiBub3AKLTArMDEwYyA8bGJsX2FcKygweHwpNjY+IGxlYSAwKzAgPC4qPiwlYTAKLQkJCTEwZTogKFJfNjhLXyk/MzIJdW5kZWYKLTArMDExMiA8bGJsX2FcKygweHwpNmM+IG5vcAotMCswMTE0IDxsYmxfYVwrKDB4fCk2ZT4gb3JpYiAjMCwlZDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1YzIyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0Jbm9wCi1sYmxfYjoJbm9wCi0JbW92ZW1sCWxibF9iLCVhMC0lYTEKLQltb3ZlbWwJJXBjQChsYmxfYiksJWEwLSVhMQotCW1vdmVtbAklcGNAKGxibF9iLCVkMCksJWEwLSVhMQotCWxlYQlsYmxfYiwlYTAKLQlsZWEJJXBjQChsYmxfYiksJWEwCi0JbGVhCSVwY0AobGJsX2ItMTI4KSwlYTAKLQlsZWEJJXBjQChsYmxfYiwlZDApLCVhMAotCWxlYQklcGNAKGxibF9iOmIsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYi0uLTI6YiwlZDApLCVhMAotCWxlYQklcGNAKGxibF9iOncsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYi0uLTI6dywlZDApLCVhMAotCWxlYQklcGNAKGxibF9iOmwsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYi0uLTI6bCwlZDApLCVhMAotCW5vcAotCWJzcmwJbGJsX2EKLQlic3IJbGJsX2EKLQlic3JzCWxibF9hCi0JamJzcglsYmxfYQotCW5vcAotCWxlYQlsYmxfYSwlYTAKLQlsZWEJJXBjQChsYmxfYSksJWEwCi0JbGVhCSVwY0AobGJsX2ErMTI4KSwlYTAKLQlsZWEJJXBjQChsYmxfYSwlZDApLCVhMAotCWxlYQklcGNAKGxibF9hOmIsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYS0uLTI6YiwlZDApLCVhMAotCWxlYQklcGNAKGxibF9hOncsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYS0uLTI6dywlZDApLCVhMAotCWxlYQklcGNAKGxibF9hOmwsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYS0uLTI6bCwlZDApLCVhMAotCWxlYQklcGNAKDE4OmwsJWQwKSwlYTAKLQlsZWEJJXBjQCgxMDp3LCVkMCksJWEwCi0JbGVhCSVwY0AoNDpiLCVkMCksJWEwCi0Jbm9wCi1sYmxfYToJbm9wCi0Jbm9wCi0JbGVhCSVwY0AoLi0xMjYsJWQwKSwlYTAKLQlsZWEJJXBjQCguLTEyNywlZDApLCVhMAotCWxlYQklcGNAKC4tMzI3NjYsJWQwKSwlYTAKLQlsZWEJJXBjQCguLTMyNzY3LCVkMCksJWEwCi0Jbm9wCi0JbGVhCSVwY0AoLisxMjksJWQwKSwlYTAKLQlsZWEJJXBjQCguKzEzMCwlZDApLCVhMAotCWxlYQklcGNAKC4rMzI3NjksJWQwKSwlYTAKLQlsZWEJJXBjQCguKzMyNzcwLCVkMCksJWEwCi0Jbm9wCi0JbGVhCSVwY0AoLi0zMjc2NiksJWEwCi0JbGVhCSVwY0AoLi0zMjc2NyksJWEwCi0Jbm9wCi0JbGVhCSVwY0AoLiszMjc2OSksJWEwCi0JbGVhCSVwY0AoLiszMjc3MCksJWEwCi0Jbm9wCi0JbGVhCSVwY0AodW5kZWYpLCVhMAotCWxlYQklcGNAKHVuZGVmLCVkMCksJWEwCi0Jbm9wCi0JbGVhCXVuZGVmLCVhMAotCW5vcAotCS5sb25nIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGljMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9waWMxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Nzg3NzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9waWMxLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCS5nbG9ibCBfZm9vCi1fZm9vOgotCWxlYWwgJXBjQChfaSksICVhMAotCWxlYWwgJXBjQChfaS0uKSwgJWExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTA5YzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jUFJPRzogbm0KLSNuYW1lOiBwcmVzZW5jZSBvZiBzZWN0aW9uIHN5bWJvbHMKLQotMDAwMDAwMTIgYiAuYnNzCi0wMDAwMDAwZSBkIC5kYXRhCi0wMDAwMDAwMCB0IC50ZXh0Ci0wMDAwMDAwZSBkIGxvb3AxCi0wMDAwMDAwMCB0IGxvb3AyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzFlODYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLnRleHQKLWxvb3AyOgkKLQltb3ZlLmwJJWQxLCVhMEArCi0JZGJmCSVkMCxsb29wMQotCS5kYXRhCi1sb29wMToJYnJhCWxvb3AyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmQ5MjU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IHBhZGRpbmcgb2YgLmluaXQgc2VjdGlvbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC5pbml0OgotMDAwMDAwMDAgPC5pbml0PiBzdWJ1ICAgICAgICByMzEscjMxLDB4MTAKLTAwMDAwMDA0IDwuaW5pdFwrMHg0PiBzdCAgICAgICAgICByMTMscjMxLDB4MjAKLTAwMDAwMDA4IDwuaW5pdFwrMHg4PiBvciAgICAgICAgICByMCxyMCxyMAotMDAwMDAwMGMgPC5pbml0XCsweGM+IG9yICAgICAgICAgIHIwLHIwLHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTY4MWNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi07IFRlc3QgcHJvcGVyIHBhZGRpbmcgb2YgdGhlIC5pbml0IHNlY3Rpb24KLQlzZWN0aW9uCSAuaW5pdCwieCIKLQlhbGlnbgkgNAotCXN1YnUJIHIzMSxyMzEsMTYKLQlzdAkgcjEzLHIzMSwzMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9tODhrLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvbTg4ay5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDdjMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9tODhrLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMKLSMgVGVzdHMgZm9yIG04OGsgc3ZyMyB0YXJnZXRzCi0jCi1pZiB7IFtpc3RhcmdldCBtODgqLSotc3lzdjNdIHx8IFtpc3RhcmdldCBtODgqLSotY29mZiogXSB9IHRoZW4gewotICAgIHNldCB0ZXN0bmFtZSAiUHJvcGVyIHBhZGRpbmcgb2YgLmluaXQgc2VjdGlvbiIKLSAgICBydW5fZHVtcF90ZXN0IGluaXQKLX0KLWlmIFtpbmZvIGV4aXN0cyBlcnJvckluZm9dIHRoZW4gewotICAgIHVuc2V0IGVycm9ySW5mbwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2Vyci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2Vyci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzk3NjMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9lcnIucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS5tYWNybwltCi0JbQotCS5lbmRtCi0KLQltCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDdiY2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogbWFjcm8gaXJwCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAuKgotT0ZGU0VUWyAJXStUWVBFWyAJXStWQUxVRS4qCi0wKzAwWyAJXStbYS16QS1aMC05X10rWyAJXStmb28xCi0wKzA0WyAJXStbYS16QS1aMC05X10rWyAJXStmb28yCi0wKzA4WyAJXStbYS16QS1aMC05X10rWyAJXStmb28zCi0wKzBjWyAJXStbYS16QS1aMC05X10rWyAJXStiYXIxCi0wKzEwWyAJXStbYS16QS1aMC05X10rWyAJXStiYXIyCi0wKzE0WyAJXStbYS16QS1aMC05X10rWyAJXStiYXIzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2RkNTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmlycAlwYXJhbSwxLDIsMwotCS5sb25nCWZvb1xwYXJhbQotCS5lbmRyCi0KLQkuaXJwYwlwYXJhbSwxMjMKLQkubG9uZwliYXJccGFyYW0KLQkuZW5kcgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvbWFjcm9zLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9tYWNyb3MuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFlNDg1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9tYWNyb3MuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBSdW4gc29tZSB0ZXN0cyBvZiBnYXMgbWFjcm9zLgotCi1pZiAhW2lzdGFyZ2V0IGhwcGEqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgdGVzdDEKLX0KLQotcnVuX2R1bXBfdGVzdCB0ZXN0MgotCi1ydW5fZHVtcF90ZXN0IHRlc3QzCi0KLXJ1bl9kdW1wX3Rlc3QgaXJwCi0KLXJ1bl9kdW1wX3Rlc3QgcmVwdAotCi1nYXNfdGVzdF9lcnJvciAiZXJyLnMiICIiICJtYWNybyBpbmZpbml0ZSByZWN1cnNpb24iCi0KLWNhc2UgJHRhcmdldF90cmlwbGV0IGluIHsKLSAgICB7IGhwcGEqLSotKiB9IHsgfQotICAgIGRlZmF1bHQgewotCXJ1bl9kdW1wX3Rlc3Qgc2VtaQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDIyZDVmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNuYW1lOiBtYWNybyByZXB0Ci0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAuKgotT0ZGU0VUWyAJXStUWVBFWyAJXStWQUxVRS4qCi0wKzAwWyAJXStbYS16QS1aMC05X10rWyAJXStmb28xCi0wKzA0WyAJXStbYS16QS1aMC05X10rWyAJXStmb28xCi0wKzA4WyAJXStbYS16QS1aMC05X10rWyAJXStmb28xCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxYjZmOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JLnJlcHQJMwotCS5sb25nCWZvbzEKLQkuZW5kcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlODllNzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI29iamR1bXA6IC1zIC1qIC50ZXh0Ci0jbmFtZTogc2VtaQotCi0uKjogLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIDNiMjAzYjIwIDNhMjAzYTIwIDAwMDAwMDAwIDAwMDAwMDAwICA7IDsgOiA6IC4uLi4uLi4uCi0gMDAxMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTA5NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAgICAgICAgLm1hY3JvIHNlbWljb2xvbgotICAgICAgICAuYXNjaWkgIjsgIgotICAgICAgICAuZW5kbQotCi0gICAgICAgIC5tYWNybyBjb2xvbgotICAgICAgICAuYXNjaWkgIjogIgotICAgICAgICAuZW5kbQotCi0gICAgICAgIHNlbWljb2xvbgotICAgICAgICAuYXNjaWkgIjsgIgotICAgICAgICBjb2xvbgotICAgICAgICAuYXNjaWkgIjogIgotCi0JLnAyYWxpZ24gNSwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRiM2ZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5kCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBtYWNybyB0ZXN0IDEKLQotMCswMSBBIHMxCi0wKzAyIEEgczIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OGI3Y2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkubWFjcm8JbSBhcmcxIGFyZzIKLQkuZ2xvYmwJXGFyZzEKLQlcYXJnMSA9IFxhcmcyCi0JLmVuZG0KLQotCW0gczEsMQotCW0gczIsMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3ZDQxNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IG1hY3JvIHRlc3QgMgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgLioKLU9GRlNFVFsgCV0rVFlQRVsgCV0rVkFMVUUuKgotMCswMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQotMCswNFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMgotMCswOFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxYjAxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS5tYWNybwltIGFyZzEgYXJnMiBhcmczCi0JLmxvbmcJXGFyZzEKLQkuaWZjCSxcYXJnMlxhcmczCi0JLkVMU0UKLQltCVxhcmcyLFxhcmczCi0JLmVuZGlmCi0JLmVuZG0KLQotCW0JZm9vMSxmb28yLGZvbzMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODBhZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IG1hY3JvIHRlc3QgMwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgLioKLU9GRlNFVFsgCV0rVFlQRVsgCV0rVkFMVUUuKgotMCswMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwYWEyMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5tYWNybwltIGFyZzEgYXJnMgotCVxhcmcxCi0JLmV4aXRtCi0JXGFyZzIKLQkuZW5kbQotCi0JbQkiLmxvbmcgZm9vMSIsLmdhcmJhZ2UKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0Y2VkYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IGFsbGluc24KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8YWJzPjoKLSAgIDA6CTAxZTAgICAgICAJYWJzCXIwCi0KLTArMDAyIDxhZGRjPjoKLSAgIDI6CTA2MjEgICAgICAJYWRkYwlyMSwgcjIKLQotMCswMDQgPGFkZGk+OgotICAgNDoJMjAwMyAgICAgIAlhZGRpCXIzLCAxCi0KLTArMDA2IDxhZGR1PjoKLSAgIDY6CTFjNTQgICAgICAJYWRkdQlyNCwgcjUKLQotMCswMDggPGFuZD46Ci0gICA4OgkxNjc2ICAgICAgCWFuZAlyNiwgcjcKLQotMCswMGEgPGFuZGk+OgotICAgYToJMmUyOCAgICAgIAlhbmRpCXI4LCAyCi0KLTArMDBjIDxhbmRuPjoKLSAgIGM6CTFmYTkgICAgICAJYW5kbglyOSwgcjEwCi0KLTArMDBlIDxhc3I+OgotICAgZToJMWFjYiAgICAgIAlhc3IJcjExLCByMTIKLQotMCswMTAgPGFzcmM+OgotICAxMDoJM2EwZCAgICAgIAlhc3JjCXIxMwotCi0wKzAxMiA8YXNyaT46Ci0gIDEyOgkzYmZlICAgICAgCWFzcmkJcjE0LCAzMQotCi0wKzAxNCA8YmNscmk+OgotICAxNDoJMzAwZiAgICAgIAliY2xyaQlyMTUsIDAKLQotMCswMTYgPGJmPjoKLSAgMTY6CWVmZjQgICAgICAJYmYJMHgwCi0KLTArMDE4IDxiZ2VuaT46Ci0gIDE4OgkzMjcwICAgICAgCWJnZW5pCXIwLCA3Ci0KLTArMDFhIDxCR0VOST46Ci0gIDFhOgkzMjgwICAgICAgCWJnZW5pCXIwLCA4Ci0KLTArMDFjIDxCR0VOaT46Ci0gIDFjOgkzM2YwICAgICAgCWJnZW5pCXIwLCAzMQotCi0wKzAxZSA8YmdlbnI+OgotICAxZToJMTMyMSAgICAgIAliZ2VucglyMSwgcjIKLQotMCswMjAgPGJrcHQ+OgotCS4uLgotCi0wKzAyMiA8Ym1hc2tpPjoKLSAgMjI6CTJjODMgICAgICAJYm1hc2tpCXIzLCA4Ci0KLTArMDI0IDxCTUFTS0k+OgotICAyNDoJMmRmMyAgICAgIAlibWFza2kJcjMsIDMxCi0KLTArMDI2IDxicj46Ci0gIDI2OglmN2ZmICAgICAgCWJyCTB4MjYKLQotMCswMjggPGJyZXY+OgotICAyODoJMDBmNCAgICAgIAlicmV2CXI0Ci0KLTArMDJhIDxic2V0aT46Ci0gIDJhOgkzNWU1ICAgICAgCWJzZXRpCXI1LCAzMAotCi0wKzAyYyA8YnNyPjoKLSAgMmM6CWZmZTkgICAgICAJYnNyCTB4MAotCi0wKzAyZSA8YnQ+OgotICAyZToJZTdlOCAgICAgIAlidAkweDAKLQotMCswMzAgPGJ0c3RpPjoKLSAgMzA6CTM3YjYgICAgICAJYnRzdGkJcjYsIDI3Ci0KLTArMDMyIDxjbHJjPjoKLSAgMzI6CTBmMDAgICAgICAJY21wbmUJcjAsIHIwCi0KLTArMDM0IDxjbHJmPjoKLSAgMzQ6CTAxZDcgICAgICAJY2xyZglyNwotCi0wKzAzNiA8Y2xydD46Ci0gIDM2OgkwMWM4ICAgICAgCWNscnQJcjgKLQotMCswMzggPGNtcGhzPjoKLSAgMzg6CTBjYTkgICAgICAJY21waHMJcjksIHIxMAotCi0wKzAzYSA8Y21wbHQ+OgotICAzYToJMGRjYiAgICAgIAljbXBsdAlyMTEsIHIxMgotCi0wKzAzYyA8Y21wbGVpPjoKLSAgM2M6CTIyZWIgICAgICAJY21wbHRpCXIxMSwgMTUKLQotMCswM2UgPGNtcGx0aT46Ci0gIDNlOgkyM2ZkICAgICAgCWNtcGx0aQlyMTMsIDMyCi0KLTArMDQwIDxjbXBuZT46Ci0gIDQwOgkwZmZlICAgICAgCWNtcG5lCXIxNCwgcjE1Ci0KLTArMDQyIDxjbXBuZWk+OgotICA0MjoJMmEwMCAgICAgIAljbXBuZWkJcjAsIDAKLQotMCswNDQgPGRlY2Y+OgotICA0NDoJMDA5MSAgICAgIAlkZWNmCXIxCi0KLTArMDQ2IDxkZWNndD46Ci0gIDQ2OgkwMWEyICAgICAgCWRlY2d0CXIyCi0KLTArMDQ4IDxkZWNsdD46Ci0gIDQ4OgkwMTgzICAgICAgCWRlY2x0CXIzCi0KLTArMDRhIDxkZWNuZT46Ci0gIDRhOgkwMWI0ICAgICAgCWRlY25lCXI0Ci0KLTArMDRjIDxkZWN0PjoKLSAgNGM6CTAwODUgICAgICAJZGVjdAlyNQotCi0wKzA0ZSA8ZGl2cz46Ci0gIDRlOgkzMjE2ICAgICAgCWRpdnMJcjYsIHIxCi0KLTArMDUwIDxkaXZ1PjoKLSAgNTA6CTJjMTggICAgICAJZGl2dQlyOCwgcjEKLQotMCswNTIgPGRvemU+OgotICA1MjoJMDAwNiAgICAgIAlkb3plCi0KLTArMDU0IDxmZjE+OgotICA1NDoJMDBlYSAgICAgIAlmZjEJcjEwCi0KLTArMDU2IDxpbmNmPjoKLSAgNTY6CTAwYmIgICAgICAJaW5jZglyMTEKLQotMCswNTggPGluY3Q+OgotICA1ODoJMDBhYyAgICAgIAlpbmN0CXIxMgotCi0wKzA1YSA8aXhoPjoKLSAgNWE6CTFkZWQgICAgICAJaXhoCXIxMywgcjE0Ci0KLTArMDVjIDxpeHc+OgotICA1YzoJMTUwZiAgICAgIAlpeHcJcjE1LCByMAotCi0wKzA1ZSA8amJmPjoKLSAgNWU6CWVmZDAgICAgICAJYmYJMHgwCi0KLTArMDYwIDxqYnI+OgotICA2MDoJZjAwZSAgICAgIAlicgkweDdlCi0KLTArMDYyIDxqYnNyPjoKLSAgNjI6CTdmMGEgICAgICAJanNyaQkweC4qCi0KLTArMDY0IDxqYnQ+OgotICA2NDoJZTAwYyAgICAgIAlidAkweDdlCi0KLTArMDY2IDxqbXA+OgotICA2NjoJMDBjMSAgICAgIAlqbXAJcjEKLQotMCswNjggPGptcGk+OgotICA2ODoJNzAwOSAgICAgIAlqbXBpCTB4LioKLQotMCswNmEgPGpzcj46Ci0gIDZhOgkwMGQyICAgICAgCWpzcglyMgotCi0wKzA2YyA8anNyaT46Ci0gIDZjOgk3ZjA4ICAgICAgCWpzcmkJMHguKgotCi0wKzA2ZSA8bGQuYj46Ci0gIDZlOglhMzA0ICAgICAgCWxkYglyMywgXChyNCwgMFwpCi0KLTArMDcwIDxsZC5oPjoKLSAgNzA6CWM1MTYgICAgICAJbGRoCXI1LCBcKHI2LCAyXCkKLQotMCswNzIgPGxkLnc+OgotICA3MjoJODcxOCAgICAgIAlsZAlyNywgXChyOCwgNFwpCi0KLTArMDc0IDxsZGI+OgotICA3NDoJYTlmYSAgICAgIAlsZGIJcjksIFwocjEwLCAxNVwpCi0KLTArMDc2IDxsZGg+OgotICA3NjoJY2JmYyAgICAgIAlsZGgJcjExLCBcKHIxMiwgMzBcKQotCi0wKzA3OCA8bGQ+OgotICA3ODoJOGQ1ZSAgICAgIAlsZAlyMTMsIFwocjE0LCAyMFwpCi0KLTArMDdhIDxsZHc+OgotICA3YToJOGRmZSAgICAgIAlsZAlyMTMsIFwocjE0LCA2MFwpCi0KLTArMDdjIDxsZG0+OgotICA3YzoJMDA2MiAgICAgIAlsZG0JcjItcjE1LCBcKHIwXCkKLQotMCswN2UgPGZvb2xvb3A+OgotICA3ZToJMDA0MSAgICAgIAlsZHEJcjQtcjcsIFwocjFcKQotCi0wKzA4MCA8bG9vcHQ+OgotICA4MDoJMDQ4ZSAgICAgIAlsb29wdAlyOCwgMHg2NAotCi0wKzA4MiA8TFJXPjoKLSAgODI6CTc5MDMgICAgICAJbHJ3CXI5LCAweC4qCi0KLTArMDg0IDxscnc+OgotICA4NDoJNzkwNCAgICAgIAlscncJcjksIDB4NDMyMQotCi0wKzA4NiA8Zm9vbGl0PjoKLSAgODY6CTEyMzQgICAgICAJbW92CXI0LCByMwotCi0wKzA4OCA8bHNsPjoKLSAgODg6CTFiYmEgICAgICAJbHNsCXIxMCwgcjExCi0KLTArMDhhIDxsc2xjPjoKLSAgOGE6CTNjMGMgICAgICAJbHNsYwlyMTIKLQotCS4uLgotCQkJOGM6IEFERFIzMgkudGV4dAotCQkJOTA6IEFERFIzMgkudGV4dC4qCi0gIDk0OgkwMDAwICAgICAgCWJrcHQKLSAgOTY6CTQzMjEgICAgICAJLnNob3J0IDB4NDMyMQotCi0wKzA5OCA8bHNsaT46Ci0gIDk4OgkzZGZkICAgICAgCWxzbGkJcjEzLCAzMQotCi0wKzA5YSA8bHNyPjoKLSAgOWE6CTBiZmUgICAgICAJbHNyCXIxNCwgcjE1Ci0KLTArMDljIDxsc3JjPjoKLSAgOWM6CTNlMDAgICAgICAJbHNyYwlyMAotCi0wKzA5ZSA8bHNyaT46Ci0gIDllOgkzZTExICAgICAgCWxzcmkJcjEsIDEKLQotMCswYTAgPG1jbHJpPjoKLSAgYTA6CTMwNjQgICAgICAJYmNscmkJcjQsIDYKLQotMCswYTIgPG1mY3I+OgotICBhMjoJMTAwMiAgICAgIAltZmNyCXIyLCBwc3IKLQotMCswYTQgPG1vdj46Ci0gIGE0OgkxMjQzICAgICAgCW1vdglyMywgcjQKLQotMCswYTYgPG1vdmY+OgotICBhNjoJMGE2NSAgICAgIAltb3ZmCXI1LCByNgotCi0wKzBhOCA8bW92aT46Ci0gIGE4Ogk2N2Y3ICAgICAgCW1vdmkJcjcsIDEyNwotCi0wKzBhYSA8bW92dD46Ci0gIGFhOgkwMjk4ICAgICAgCW1vdnQJcjgsIHI5Ci0KLTArMGFjIDxtdGNyPjoKLSAgYWM6CTE4MGEgICAgICAJbXRjcglyMTAsIHBzcgotCi0wKzBhZSA8bXVsdD46Ci0gIGFlOgkwM2NiICAgICAgCW11bHQJcjExLCByMTIKLQotMCswYjAgPG12Yz46Ci0gIGIwOgkwMDJkICAgICAgCW12YwlyMTMKLQotMCswYjIgPG12Y3Y+OgotICBiMjoJMDAzZSAgICAgIAltdmN2CXIxNAotCi0wKzBiNCA8bmVnPjoKLSAgYjQ6CTI4MDIgICAgICAJcnN1YmkJcjIsIDAKLQotMCswYjYgPG5vdD46Ci0gIGI2OgkwMWZmICAgICAgCW5vdAlyMTUKLQotMCswYjggPG9yPjoKLSAgYjg6CTFlMTAgICAgICAJb3IJcjAsIHIxCi0KLTArMGJhIDxyZmk+OgotICBiYToJMDAwMyAgICAgIAlyZmkKLQotMCswYmMgPHJvbGM+OgotICBiYzoJMDY2NiAgICAgIAlhZGRjCXI2LCByNgotCi0wKzBiZSA8cm9yaT46Ci0gIGJlOgkzOWE5ICAgICAgCXJvdGxpCXI5LCAyNgotCi0wKzBjMCA8cm90bGM+OgotICBjMDoJMDY2NiAgICAgIAlhZGRjCXI2LCByNgotCi0wKzBjMiA8cm90bGk+OgotICBjMjoJMzhhMiAgICAgIAlyb3RsaQlyMiwgMTAKLQotMCswYzQgPHJvdHJpPjoKLSAgYzQ6CTM5YTkgICAgICAJcm90bGkJcjksIDI2Ci0KLTArMGM2IDxyc3ViPjoKLSAgYzY6CTE0NDMgICAgICAJcnN1YglyMywgcjQKLQotMCswYzggPHJzdWJpPjoKLSAgYzg6CTI4MDUgICAgICAJcnN1YmkJcjUsIDAKLQotMCswY2EgPHJ0ZT46Ci0gIGNhOgkwMDAyICAgICAgCXJ0ZQotCi0wKzBjYyA8cnRzPjoKLSAgY2M6CTAwY2YgICAgICAJam1wCXIxNQotCi0wKzBjZSA8c2V0Yz46Ci0gIGNlOgkwYzAwICAgICAgCWNtcGhzCXIwLCByMAotCi0wKzBkMCA8c2V4dGI+OgotICBkMDoJMDE1NiAgICAgIAlzZXh0YglyNgotCi0wKzBkMiA8c2V4dGg+OgotICBkMjoJMDE3NyAgICAgIAlzZXh0aAlyNwotCi0wKzBkNCA8c3QuYj46Ci0gIGQ0OgliODA5ICAgICAgCXN0YglyOCwgXChyOSwgMFwpCi0KLTArMGQ2IDxzdC5oPjoKLSAgZDY6CWRhMWIgICAgICAJc3RoCXIxMCwgXChyMTEsIDJcKQotCi0wKzBkOCA8c3Qudz46Ci0gIGQ4Ogk5YzFkICAgICAgCXN0CXIxMiwgXChyMTMsIDRcKQotCi0wKzBkYSA8c3RiPjoKLSAgZGE6CWJlZmYgICAgICAJc3RiCXIxNCwgXChyMTUsIDE1XCkKLQotMCswZGMgPHN0aD46Ci0gIGRjOglkMGYxICAgICAgCXN0aAlyMCwgXChyMSwgMzBcKQotCi0wKzBkZSA8c3R3PjoKLSAgZGU6CTkyZjMgICAgICAJc3QJcjIsIFwocjMsIDYwXCkKLQotMCswZTAgPHN0PjoKLSAgZTA6CTk0MDUgICAgICAJc3QJcjQsIFwocjUsIDBcKQotCi0wKzBlMiA8c3RtPjoKLSAgZTI6CTAwN2UgICAgICAJc3RtCXIxNC1yMTUsIFwocjBcKQotCi0wKzBlNCA8c3RvcD46Ci0gIGU0OgkwMDA0ICAgICAgCXN0b3AKLQotMCswZTYgPHN0cT46Ci0gIGU2OgkwMDUxICAgICAgCXN0cQlyNC1yNywgXChyMVwpCi0KLTArMGU4IDxzdWJjPjoKLSAgZTg6CTA3ZDcgICAgICAJc3ViYwlyNywgcjEzCi0KLTArMGVhIDxzdWJpPjoKLSAgZWE6CTI1ZmUgICAgICAJc3ViaQlyMTQsIDMyCi0KLTArMGVjIDxzdWJ1PjoKLSAgZWM6CTA1MzkgICAgICAJc3VidQlyOSwgcjMKLQotMCswZWUgPHN5bmM+OgotICBlZToJMDAwMSAgICAgIAlzeW5jCi0KLTArMGYwIDx0c3RsdD46Ci0gIGYwOgkzN2Y1ICAgICAgCWJ0c3RpCXI1LCAzMQotCi0wKzBmMiA8dHN0bmU+OgotICBmMjoJMmEwNyAgICAgIAljbXBuZWkJcjcsIDAKLQotMCswZjQgPHRyYXA+OgotICBmNDoJMDAwYSAgICAgIAl0cmFwCTIKLQotMCswZjYgPHRzdD46Ci0gIGY2OgkwZWVlICAgICAgCXRzdAlyMTQsIHIxNAotCi0wKzBmOCA8dHN0bmJ6PjoKLSAgZjg6CTAxOTIgICAgICAJdHN0bmJ6CXIyCi0KLTArMGZhIDx3YWl0PjoKLSAgZmE6CTAwMDUgICAgICAJd2FpdAotCi0wKzBmYyA8eG9yPjoKLSAgZmM6CTE3MGYgICAgICAJeG9yCXIxNSwgcjAKLQotMCswZmUgPHhzcj46Ci0gIGZlOgkzODBiICAgICAgCXhzcglyMTEKLQotMCswMTAwIDx4dHJiMD46Ci0gMTAwOgkwMTMxICAgICAgCXh0cmIwCXIxLCByMQotCi0wKzAxMDIgPHh0cmIxPjoKLSAxMDI6CTAxMjIgICAgICAJeHRyYjEJcjEsIHIyCi0KLTArMDEwNCA8eHRyYjI+OgotIDEwNDoJMDExMCAgICAgIAl4dHJiMglyMSwgcjAKLQotMCswMTA2IDx4dHJiMz46Ci0gMTA2OgkwMTBkICAgICAgCXh0cmIzCXIxLCByMTMKLQotMCswMTA4IDx6ZXh0Yj46Ci0gMTA4OgkwMTQ4ICAgICAgCXpleHRiCXI4Ci0KLTArMDEwYSA8emV4dGg+OgotIDEwYToJMDE2NCAgICAgIAl6ZXh0aAlyNAotIDEwYzoJMGYwMCAgICAgIAljbXBuZQlyMCwgcjAKLSAxMGU6CTBmMDAgICAgICAJY21wbmUJcjAsIHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjU3ODYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIE0qQ29yZSBhc3NlbWJsZXIgdGVzdHN1aXRlLgotCi1pZiBbaXN0YXJnZXQgbWNvcmUtKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiYWxsaW5zbiIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwNjg0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotIC5kYXRhCi1mb29kYXRhOiAud29yZCA0MgotCSAudGV4dAotZm9vdGV4dDoKLQotLm1hY3JvIHRlc3QgaW5zbiB0ZXh0PSIiCi0JLmV4cG9ydCBcaW5zbgotXGluc246Ci0JXGluc24gXHRleHQKLS5lbmRtCi0KLQl0ZXN0IGFicyAgIHIwCQkKLQl0ZXN0IGFkZGMgICJyMSxyMiIJLy8gQSBkb3VibGUgZm9yd2FyZCBzbGFzaCBzdGFydHMgYSBsaW5lIGNvbW1lbnQKLQl0ZXN0IGFkZGkgICJyMywgMSIJIyBTbyBkb2VzIGEgaGFzaAotCXRlc3QgYWRkdSAgInI0LCByNSIJLy8gV2hpdGUgc3BhY2UgYmV0d2VlbiBvcGVyYW5kcyBzaG91bGQgYmUgaWdub3JlZAotCXRlc3QgYW5kICAgInI2LHI3IiAgIDsJdGVzdCBhbmRpICAicjgsIzIiIC8vIEEgc2VtaWNvbG9uIHNlcGVyYXRlcyBzdGF0ZW1lbnRzCi0JdGVzdCBhbmRuICAicjksIHIxMCIKLQl0ZXN0IGFzciAgICJyMTEsIFIxMiIJLy8gVXBwZXJjYXNlIFIgaXMgYWxsb3dlZCBhcyBhIHJlZ2lzdGVyIHByZWZpeAotCXRlc3QgYXNyYyAgInIxMyIKLQl0ZXN0IGFzcmkgICJyMTQsIzB4MWYiCi0JdGVzdCBiY2xyaSAicjE1LDAiCi0JdGVzdCBiZiAgICBmb290ZXh0Ci0JdGVzdCBiZ2VuaSAic3AsIDciCS8vIHIwIGNhbiBhbHNvIGJlIHJlZmVyZWQgdG8gYXMgJ3NwJwotCXRlc3QgQkdFTkkgInIwLCA4IgkvLyBPZmZpY2lhbGx5IHVwcGVyIGNhc2Ugb3IgbWl4ZWQgY2FzZQotCXRlc3QgQkdFTmkgInIwLCAzMSIJLy8gbW5lbW9uaWNzIHNob3VsZCBub3QgYmUgYWxsb3dlZCwgYnV0IHdlIHJlbGF4IHRoaXMuLi4KLQl0ZXN0IGJnZW5yICJyMSwgcjIiCi0JdGVzdCBia3B0Ci0JdGVzdCBibWFza2kgInIzLCM4IgotCXRlc3QgQk1BU0tJICJyMywweDFmIgotCXRlc3QgYnIgICAgIC4gIC8vIERvdCBtZWFucyB0aGUgY3VycmVudCBhZGRyZXNzCi0JdGVzdCBicmV2ICAgcjQKLQl0ZXN0IGJzZXRpICAicjUsMzAiCi0JdGVzdCBic3IgICAgZm9vdGV4dAotCXRlc3QgYnQgICAgIGZvb3RleHQKLQl0ZXN0IGJ0c3RpICAicjYsIDI3IgotCXRlc3QgY2xyYyAgIAotCXRlc3QgY2xyZiAgIHI3Ci0JdGVzdCBjbHJ0ICAgcjgKLQl0ZXN0IGNtcGhzICAicjkscjEwIgotCXRlc3QgY21wbHQgICJyMTEscjEyIiAKLQl0ZXN0IGNtcGxlaSAicjExLCAxNCIgCi0JdGVzdCBjbXBsdGkgInIxMywzMiIKLQl0ZXN0IGNtcG5lICAicjE0LCByMTUiCi0JdGVzdCBjbXBuZWkgInIwLDAiCi0JdGVzdCBkZWNmICAgcjEKLQl0ZXN0IGRlY2d0ICByMgotCXRlc3QgZGVjbHQgIHIzCi0JdGVzdCBkZWNuZSAgcjQKLQl0ZXN0IGRlY3QgICByNQotCXRlc3QgZGl2cyAgICJyNixyMSIKLQl0ZXN0IGRpdnUgICAicjgsIHIxIgotCXRlc3QgZG96ZQotCXRlc3QgZmYxICAgIHIxMAotCXRlc3QgaW5jZiAgIHIxMQotCXRlc3QgaW5jdCAgIHIxMgotCXRlc3QgaXhoICAgICJyMTMscjE0IgotCXRlc3QgaXh3ICAgICJyMTUscjAiCi0JdGVzdCBqYmYgICAgZm9vdGV4dAotCXRlc3QgamJyICAgIGZvb2xvb3AKLQl0ZXN0IGpic3IgICBmb290ZXh0Ci0JdGVzdCBqYnQgICAgZm9vbG9vcAotCXRlc3Qgam1wICAgIHIxCi0JdGVzdCBqbXBpICAgZm9vdGV4dCAKLQl0ZXN0IGpzciAgICByMgotCXRlc3QganNyaSAgIGZvb3RleHQKLQl0ZXN0IGxkLmIgICAicjMsKHI0LDApIgotCXRlc3QgbGQuaCAgICJyNSAsICggcjYsICMyKSIKLQl0ZXN0IGxkLncgICAicjcsIChyOCwgMHg0KSIKLQl0ZXN0IGxkYiAgICAicjksKHIxMCwjMHhmKSIKLQl0ZXN0IGxkaCAgICAicjExLCAocjEyLCAzMCkiCi0JdGVzdCBsZCAgICAgInIxMywgKHIxNCwgMjApIgotCXRlc3QgbGR3ICAgICJyMTMsIChyMTQsIDYwKSIKLQl0ZXN0IGxkbSAgICAicjItcjE1LChyMCkiCi0JLmV4cG9ydCBmb29sb29wCi1mb29sb29wOgkJCi0JdGVzdCBsZHEgICAgInI0LXI3LChyMSkiCi0JdGVzdCBsb29wdCAgInI4LCBmb29sb29wIgotCXRlc3QgTFJXICAgICJyOSwgW2Zvb2xpdF0iCi0JdGVzdCBscncgICAgInI5LCAweDQzMjEiICAgCS8vIFBDIHJlbCBpbmRpcmVjdAotCS5nbG9iYWwgZm9vbGl0Ci1mb29saXQ6Ci0JLndvcmQgMHgxMjM0Ci0JdGVzdCBsc2wgICAgInIxMCxyMTEiCi0JdGVzdCBsc2xjICAgcjEyCi0JLmxpdGVyYWxzCQkJLy8gRHVtcCBsaXRlcmFscyB0YWJsZQkKLQl0ZXN0IGxzbGkgICAicjEzLDMxIgotCXRlc3QgbHNyICAgICJyMTQscjE1IgotCXRlc3QgbHNyYyAgIHIwCi0JdGVzdCBsc3JpICAgInIxLDEiCi0JdGVzdCBtY2xyaSAgInI0LCA2NCIKLQl0ZXN0IG1mY3IgICAicjIsIGNyMCIKLQl0ZXN0IG1vdiAgICAicjMscjQiCi0JdGVzdCBtb3ZmICAgInI1LCByNiIKLQl0ZXN0IG1vdmkgICAicjcsIDEyNyIKLQl0ZXN0IG1vdnQgICAicjgsIHI5IgotCXRlc3QgbXRjciAgICJyMTAsIHBzciIKLQl0ZXN0IG11bHQgICAicjExLCByMTIiCi0JdGVzdCBtdmMgICAgcjEzCi0JdGVzdCBtdmN2ICAgcjE0Ci0JdGVzdCBuZWcgICAgcjIKLQl0ZXN0IG5vdCAgICByMTUKLQl0ZXN0IG9yICAgICAicjAscjEiCi0JdGVzdCByZmkKLQl0ZXN0IHJvbGMgICAicjYsIDEiCi0JdGVzdCByb3JpICAgInI5LCA2IgotCXRlc3Qgcm90bGMgICJyNiwgMSIKLQl0ZXN0IHJvdGxpICAicjIsICMxMCIKLQl0ZXN0IHJvdHJpICAicjksIDYiCi0JdGVzdCByc3ViICAgInIzLCByNCIKLQl0ZXN0IHJzdWJpICAicjUsIDB4MCIKLQl0ZXN0IHJ0ZQotCXRlc3QgcnRzCi0JdGVzdCBzZXRjCi0JdGVzdCBzZXh0YiAgcjYKLQl0ZXN0IHNleHRoICByNwotCXRlc3Qgc3QuYiAgICJyOCwgKHI5LCAwKSIKLQl0ZXN0IHN0LmggICAicjEwLCAocjExLCAyKSIKLQl0ZXN0IHN0LncgICAicjEyLCAocjEzLCA0KSIKLQl0ZXN0IHN0YiAgICAicjE0LCAocjE1LCAxNSkiCQotCXRlc3Qgc3RoICAgICJyMCwgKHIxLCAzMCkiCi0JdGVzdCBzdHcgICAgInIyLCAocjMsIDB4M2MpIgotCXRlc3Qgc3QgICAgICJyNCwgKHI1LCAwKSIKLQl0ZXN0IHN0bSAgICAicjE0IC0gcjE1ICwgKHIwKSIKLQl0ZXN0IHN0b3AKLQl0ZXN0IHN0cSAgICAicjQgLSByNyAsIChyMSkiCi0JdGVzdCBzdWJjICAgInI3LCByMTMiCi0JdGVzdCBzdWJpICAgInIxNCwgMzIiCi0JdGVzdCBzdWJ1ICAgInI5LCByMyIKLQl0ZXN0IHN5bmMKLQl0ZXN0IHRzdGx0ICByNQotCXRlc3QgdHN0bmUgIHI3Ci0JdGVzdCB0cmFwICAgMgotCXRlc3QgdHN0ICAgICJyMTQsIHIxNCIKLQl0ZXN0IHRzdG5ieiByMgotCXRlc3Qgd2FpdAotCXRlc3QgeG9yICAgICJyMTUscjAiCi0JdGVzdCB4c3IgICAgcjExCi0JdGVzdCB4dHJiMCAgInIxLCByMSIKLQl0ZXN0IHh0cmIxICAicjEsIHIyIgotCXRlc3QgeHRyYjIgICJyMSwgcjAiCi0JdGVzdCB4dHJiMyAgInIxLCByMTMiCi0JdGVzdCB6ZXh0YiAgcjgKLQl0ZXN0IHpleHRoICByNAotCWNscmMJCQkvLyBUaGVzZSB0d28gaW5zdHJ1Y3Rpb25zIHBhZCB0aGUgb2JqZWN0IGZpbGUKLQljbHJjCQkJLy8gb3V0IHRvIGEgMTYgYnl0ZSBib3VuZGFyeS4KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2ZDVjMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGFicwotCi0jIFRlc3QgdGhlIGFicyBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYmdleglcJGEwLDArMDAwYyA8Zm9vXCsoMHh8KWM+Ci0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IG5lZwlcJGEwLFwkYTAKLTArMDAwYyA8W14+XSo+IGJnZXoJXCRhMSwwKzAwMTggPGZvb1wrKDB4fCkxOD4KLTArMDAxMCA8W14+XSo+IG1vdmUJXCRhMCxcJGExCi0wKzAwMTQgPFtePl0qPiBuZWcJXCRhMCxcJGExCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyMTcyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYWJzIG1hY3JvLgotZm9vOgotCWFicwkkNAotCWFicwkkNCwkNQotCS5zcGFjZQk4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyMWQxZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGFkZAotCi0jIFRlc3QgdGhlIGFkZCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYWRkaQlcJGEwLFwkYTAsMAotMCswMDA0IDxbXj5dKj4gYWRkaQlcJGEwLFwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGFkZAlcJGEwLFwkYTAsXCRhdAotMCswMDEwIDxbXj5dKj4gYWRkaQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAwMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxOCA8W14+XSo+IGFkZAlcJGEwLFwkYTAsXCRhdAotMCswMDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDI0IDxbXj5dKj4gYWRkCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMDJjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRlOTY0Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFkZCBtYWNyby4KLQkKLWZvbzoKLQlhZGQJJDQsJDQsMAotCWFkZAkkNCwkNCwxCi0JYWRkCSQ0LCQ0LDB4ODAwMAotCWFkZAkkNCwkNCwtMHg4MDAwCi0JYWRkCSQ0LCQ0LDB4MTAwMDAKLQlhZGQJJDQsJDQsMHgxYTVhNQotCQotIyBhZGR1IGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFkZCBpczsganVzdCBjb25maXJtIHRoYXQgaXQgaXNuJ3QKLSMgdG90YWxseSBicm9rZW4uCi0JYWRkdQkkNCwkNCwxCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2MTcxNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGFuZAotCi0jIFRlc3QgdGhlIGFuZCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYW5kaQlcJGEwLFwkYTAsMHgwCi0wKzAwMDQgPFtePl0qPiBhbmRpCVwkYTAsXCRhMCwweDEKLTArMDAwOCA8W14+XSo+IGFuZGkJXCRhMCxcJGEwLDB4ODAwMAotMCswMDBjIDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDAxMCA8W14+XSo+IGFuZAlcJGEwLFwkYTAsXCRhdAotMCswMDE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTggPFtePl0qPiBhbmQJXCRhMCxcJGEwLFwkYXQKLTArMDAxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDIwIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDAyNCA8W14+XSo+IGFuZAlcJGEwLFwkYTAsXCRhdAotMCswMDI4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMSwweDAKLTArMDAyYyA8W14+XSo+IG5vcglcJGEwLFwkYTAsXCR6ZXJvCi0wKzAwMzAgPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4MQotMCswMDM0IDxbXj5dKj4gbm9yCVwkYTAsXCRhMCxcJHplcm8KLTArMDAzOCA8W14+XSo+IG9yaQlcJGEwLFwkYTEsMHg4MDAwCi0wKzAwM2MgPFtePl0qPiBub3IJXCRhMCxcJGEwLFwkemVybwotMCswMDQwIDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDA0NCA8W14+XSo+IG5vcglcJGEwLFwkYTEsXCRhdAotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNGMgPFtePl0qPiBub3IJXCRhMCxcJGExLFwkYXQKLTArMDA1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA1OCA8W14+XSo+IG5vcglcJGEwLFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gb3JpCVwkYTAsXCRhMSwweDAKLTArMDA2MCA8W14+XSo+IHhvcmkJXCRhMCxcJGExLDB4MAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZmM1N2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBhbmQgbWFjcm8uCi0JCi1mb286Ci0JYW5kCSQ0LCQ0LDAKLQlhbmQJJDQsJDQsMQotCWFuZAkkNCwkNCwweDgwMDAKLQlhbmQJJDQsJDQsLTB4ODAwMAotCWFuZAkkNCwkNCwweDEwMDAwCi0JYW5kCSQ0LCQ0LDB4MWE1YTUKLQotIyBub3IsIG9yLCBhbmQgeG9yIGFyZSBoYW5kbGVkIGJ5IHRoZSBzYW1lIGNvZGUuICBUaGVyZSBpcyBhIHNwZWNpYWwKLSMgY2FzZSBmb3Igbm9yLCBzbyB3ZSB0ZXN0IGFsbCB2YXJpYW50cy4KLQkKLQlub3IJJDQsJDUsMAotCW5vcgkkNCwkNSwxCi0Jbm9yCSQ0LCQ1LDB4ODAwMAotCW5vcgkkNCwkNSwtMHg4MDAwCi0Jbm9yCSQ0LCQ1LDB4MTAwMDAKLQlub3IJJDQsJDUsMHgxYTVhNQotCQotCW9yCSQ0LCQ1LDAKLQotCXhvcgkkNCwkNSwwCi0KLQkjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzI5MzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEuZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBiZXEKLQotIyBUZXN0IHRoZSBiZXEgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGJlcQlcJGEwLFwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBiZXF6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDBjIDxbXj5dKj4gbm9wCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LDEKLTArMDAxNCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDIwIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwMmMgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzMCA8W14+XSo+IG5vcAotMCswMDM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMzggPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDQ4IDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNGMgPFtePl0qPiBub3AKLTArMDA1MCA8W14+XSo+IGJuZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNTQgPFtePl0qPiBub3AKLTArMDA1OCA8W14+XSo+IGJlcXpsCVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDVjIDxbXj5dKj4gbm9wCi0wKzAwNjAgPFtePl0qPiBibmV6bAlcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KLTArMjAwNjggPFtePl0qPiBqCTArMDAwMCA8dGV4dF9sYWJlbD4KLVsgCV0qMjAwNjg6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJLnRleHQKLTArMjAwNmMgPFtePl0qPiBub3AKLTArMjAwNzAgPFtePl0qPiBqYWwJMCswMDAwIDx0ZXh0X2xhYmVsPgotWyAJXSoyMDA3MDogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQkudGV4dAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MjJlZWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBiZXEgbWFjcm8uCi0JLmdsb2JsCXRleHRfbGFiZWwJLnRleHQKLXRleHRfbGFiZWw6CQotCWJlcQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDAsdGV4dF9sYWJlbAotCWJlcQkkNCwxLHRleHRfbGFiZWwKLQliZXEJJDQsMHg4MDAwLHRleHRfbGFiZWwKLQliZXEJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAotCWJlcQkkNCwweDFhNWE1LHRleHRfbGFiZWwKLQotIyBibmUgaXMgaGFuZGxlZCBieSB0aGUgc2FtZSBjb2RlIGFzIGJlcS4gIEp1c3Qgc2FuaXR5IGNoZWNrLgotCWJuZQkkNCwwLHRleHRfbGFiZWwKLQotIyBTYW5pdHkgY2hlY2sgYmVxbCBhbmQgYm5lbAotCS5zZXQJbWlwczIKLQliZXFsCSQ0LDAsdGV4dF9sYWJlbAotCWJuZWwJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgVGVzdCB0aGF0IGJyYW5jaGVzIHdoaWNoIG92ZXJmbG93IGFyZSBjb252ZXJ0ZWQgdG8ganVtcHMuCi0JLnNwYWNlCTB4MjAwMDAKLQliCXRleHRfbGFiZWwKLQliYWwJdGV4dF9sYWJlbAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlM2UyN2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UuZAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBiZ2UKLQotIyBUZXN0IHRoZSBiZ2UgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwOCA8W14+XSo+IG5vcAotMCswMDBjIDxbXj5dKj4gYmdleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxMCA8W14+XSo+IG5vcAotMCswMDE0IDxbXj5dKj4gYmxleglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gYmdleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gYmd0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyOCA8W14+XSo+IG5vcAotMCswMDJjIDxbXj5dKj4gc2x0aQlcJGF0LFwkYTAsMgotMCswMDMwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzNCA8W14+XSo+IG5vcAotMCswMDM4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAzYyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDQwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0NCA8W14+XSo+IG5vcAotMCswMDQ4IDxbXj5dKj4gc2x0aQlcJGF0LFwkYTAsLTMyNzY4Ci0wKzAwNGMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDVjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA2MCA8W14+XSo+IG5vcAotMCswMDY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNjggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDZjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNzAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDc0IDxbXj5dKj4gbm9wCi0wKzAwNzggPFtePl0qPiBzbHQJXCRhdCxcJGExLFwkYTAKLTArMDA3YyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODAgPFtePl0qPiBub3AKLTArMDA4NCA8W14+XSo+IGJndHoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGJsdHoJXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOTAgPFtePl0qPiBub3AKLTArMDA5NCA8W14+XSo+IGJndHoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOTggPFtePl0qPiBub3AKLTArMDA5YyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhMQotMCswMGEwIDxbXj5dKj4gYmVxemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwYTQgPFtePl0qPiBub3AKLTArMDBhOCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAotMCswMGFjIDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1ZmQ4Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJnZSBtYWNyby4KLQkKLXRleHRfbGFiZWw6CQotCWJnZQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmdlCSQ0LCQwLHRleHRfbGFiZWwKLQliZ2UJJDAsJDUsdGV4dF9sYWJlbAotCWJnZQkkNCwwLHRleHRfbGFiZWwKLQliZ2UJJDQsMSx0ZXh0X2xhYmVsCi0JYmdlCSQ0LDIsdGV4dF9sYWJlbAotCWJnZQkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJnZQkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQliZ2UJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmdlCSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJndCBpcyBoYW5kbGVkIGxpa2UgYmdlLCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgotIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCi0JYmd0CSQ0LCQ1LHRleHRfbGFiZWwKLQliZ3QJJDQsJDAsdGV4dF9sYWJlbAotCWJndAkkMCwkNSx0ZXh0X2xhYmVsCi0JYmd0CSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSB0ZXN0IGJnZWwgYW5kIGJndGwKLQkuc2V0CW1pcHMyCi0JYmdlbAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmd0bAkkNCwkNSx0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2E2MDQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5kCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJnZXUKLQotIyBUZXN0IHRoZSBiZ2V1IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBiZXEJXCR6ZXJvLFwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBzbHRpdQlcJGF0LFwkYTAsMgotMCswMDIwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAyYyA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDAzMCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMzQgPFtePl0qPiBub3AKLTArMDAzOCA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwtMzI3NjgKLTArMDAzYyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNDAgPFtePl0qPiBub3AKLTArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDRjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1MCA8W14+XSo+IG5vcAotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDVjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDYwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA2NCA8W14+XSo+IG5vcAotMCswMDY4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAotMCswMDZjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3MCA8W14+XSo+IG5vcAotMCswMDc0IDxbXj5dKj4gYm5leglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3OCA8W14+XSo+IG5vcAotMCswMDdjIDxbXj5dKj4gYm5leglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhMQotMCswMDg4IDxbXj5dKj4gYmVxemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOGMgPFtePl0qPiBub3AKLTArMDA5MCA8W14+XSo+IHNsdHUJXCRhdCxcJGExLFwkYTAKLTArMDA5NCA8W14+XSo+IGJuZXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzN2Y5Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBiZ2V1IG1hY3JvLgotCQotdGV4dF9sYWJlbDoJCi0JYmdldQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmdldQkkMCwkNSx0ZXh0X2xhYmVsCi0JIyBBIHNlY29uZCBhcmd1bWVudCBvZiAwIG9yICQwIGlzIGFsd2F5cyB0cnVlCi0JYmdldQkkNCwxLHRleHRfbGFiZWwKLQliZ2V1CSQ0LDIsdGV4dF9sYWJlbAotCWJnZXUJJDQsMHg4MDAwLHRleHRfbGFiZWwKLQliZ2V1CSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJnZXUJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmdldQkkNCwweDFhNWE1LHRleHRfbGFiZWwKLQotIyBiZ3R1IGlzIGhhbmRsZWQgbGlrZSBiZ2V1LCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgotIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCi0JYmd0dQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmd0dQkkNCwkMCx0ZXh0X2xhYmVsCi0JYmd0dQkkNCwwLHRleHRfbGFiZWwKLQotIyBTYW5pdHkgdGVzdCBiZ2V1bCBhbmQgYmd0dWwKLQkuc2V0CW1pcHMyCi0JYmdldWwJJDQsJDUsdGV4dF9sYWJlbAotCWJndHVsCSQ0LCQ1LHRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzEwZTIzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmx0Ci0KLSMgVGVzdCB0aGUgYmx0IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDggPFtePl0qPiBub3AKLTArMDAwYyA8W14+XSo+IGJsdHoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGJndHoJXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IGJsdHoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGJsZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjggPFtePl0qPiBub3AKLTArMDAyYyA8W14+XSo+IHNsdGkJXCRhdCxcJGEwLDIKLTArMDAzMCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMzQgPFtePl0qPiBub3AKLTArMDAzOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwM2MgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA0MCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNDQgPFtePl0qPiBub3AKLTArMDA0OCA8W14+XSo+IHNsdGkJXCRhdCxcJGEwLC0zMjc2OAotMCswMDRjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1MCA8W14+XSo+IG5vcAotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA1YyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNjAgPFtePl0qPiBub3AKLTArMDA2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDY4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA2YyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDcwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3NCA8W14+XSo+IG5vcAotMCswMDc4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCi0wKzAwN2MgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBibGV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDg4IDxbXj5dKj4gbm9wCi0wKzAwOGMgPFtePl0qPiBiZ2V6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDkwIDxbXj5dKj4gbm9wCi0wKzAwOTQgPFtePl0qPiBibGV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDk4IDxbXj5dKj4gbm9wCi0wKzAwOWMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYTEKLTArMDBhMCA8W14+XSo+IGJuZXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMGE0IDxbXj5dKj4gbm9wCi0wKzAwYTggPFtePl0qPiBzbHQJXCRhdCxcJGExLFwkYTAKLTArMDBhYyA8W14+XSo+IGJlcXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDMwNTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQucworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBibHQgbWFjcm8uCi0JCi10ZXh0X2xhYmVsOgkKLQlibHQJJDQsJDUsdGV4dF9sYWJlbAotCWJsdAkkNCwkMCx0ZXh0X2xhYmVsCi0JYmx0CSQwLCQ1LHRleHRfbGFiZWwKLQlibHQJJDQsMCx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDEsdGV4dF9sYWJlbAotCWJsdAkkNCwyLHRleHRfbGFiZWwKLQlibHQJJDQsMHg4MDAwLHRleHRfbGFiZWwKLQlibHQJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAotCWJsdAkkNCwweDFhNWE1LHRleHRfbGFiZWwKLQotIyBibGUgaXMgaGFuZGxlZCBsaWtlIGJsdCwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWJsZQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmxlCSQ0LCQwLHRleHRfbGFiZWwKLQlibGUJJDAsJDUsdGV4dF9sYWJlbAotCWJsZQkkNCwwLHRleHRfbGFiZWwKLQotIyBTYW5pdHkgdGVzdCBibHRsIGFuZCBibGVsCi0JLnNldAltaXBzMgotCWJsdGwJJDQsJDUsdGV4dF9sYWJlbAotCWJsZWwJJDQsJDUsdGV4dF9sYWJlbAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyNjFjNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUuZAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBibHR1Ci0KLSMgVGVzdCB0aGUgYmx0dSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwOCA8W14+XSo+IG5vcAotMCswMDBjIDxbXj5dKj4gYm5lCVwkemVybyxcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxMCA8W14+XSo+IG5vcAotMCswMDE0IDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gc2x0aXUJXCRhdCxcJGEwLDIKLTArMDAyMCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMmMgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwMzAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDM0IDxbXj5dKj4gbm9wCi0wKzAwMzggPFtePl0qPiBzbHRpdQlcJGF0LFwkYTAsLTMyNzY4Ci0wKzAwM2MgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDQwIDxbXj5dKj4gbm9wCi0wKzAwNDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0OCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDA0YyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA1YyA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDA2MCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IHNsdHUJXCRhdCxcJGExLFwkYTAKLTArMDA2YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzAgPFtePl0qPiBub3AKLTArMDA3NCA8W14+XSo+IGJlcXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzggPFtePl0qPiBub3AKLTArMDA3YyA8W14+XSo+IGJlcXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODAgPFtePl0qPiBub3AKLTArMDA4NCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYTEKLTArMDA4OCA8W14+XSo+IGJuZXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDhjIDxbXj5dKj4gbm9wCi0wKzAwOTAgPFtePl0qPiBzbHR1CVwkYXQsXCRhMSxcJGEwCi0wKzAwOTQgPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjFhZTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmx0dSBtYWNyby4KLQkKLXRleHRfbGFiZWw6CQotCWJsdHUJJDQsJDUsdGV4dF9sYWJlbAotCWJsdHUJJDAsJDUsdGV4dF9sYWJlbAotCSMgQSBzZWNvbmQgYXJndW1lbnQgb2YgMCBvciAkMCBpcyBhbHdheXMgZmFsc2UKLQlibHR1CSQ0LDEsdGV4dF9sYWJlbAotCWJsdHUJJDQsMix0ZXh0X2xhYmVsCi0JYmx0dQkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJsdHUJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCi0JYmx0dQkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQlibHR1CSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJsZXUgaXMgaGFuZGxlZCBsaWtlIGJsdHUsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQlibGV1CSQ0LCQ1LHRleHRfbGFiZWwKLQlibGV1CSQ0LCQwLHRleHRfbGFiZWwKLQlibGV1CSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSB0ZXN0IGJsdHVsIGFuZCBibGV1bAotCS5zZXQJbWlwczIKLQlibHR1bAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmxldWwJJDQsJDUsdGV4dF9sYWJlbAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5OGE0Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAuZAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNhczogLW1jcHU9cjM5MDAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozOTAwCi0jbmFtZTogTUlQUyAyMC1iaXQgYnJlYWsKLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYnJlYWsKLTArMDAwNCA8W14+XSo+IGJyZWFrCi0wKzAwMDggPFtePl0qPiBicmVhawkweDE0Ci0wKzAwMGMgPFtePl0qPiBicmVhawkweDE0LDB4MjgKLTArMDAxMCA8W14+XSo+IGJyZWFrCTB4M2ZmLDB4M2ZmCi0wKzAwMTQgPFtePl0qPiBzZGJicAotMCswMDE4IDxbXj5dKj4gc2RiYnAKLTArMDAxYyA8W14+XSo+IHNkYmJwCTB4MTQKLTArMDAyMCA8W14+XSo+IHNkYmJwCTB4MTQsMHgyOAotMCswMDI0IDxbXj5dKj4gc2RiYnAJMHgzZmYsMHgzZmYKLQkuLi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTM1YjBlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIDIwLWJpdCBicmVhayBpbnN0cnVjdGlvbnMKLWZvbzoJCi0JYnJlYWsKLQlicmVhawkwCi0JYnJlYWsJMjAKLQlicmVhawkyMCw0MAotCWJyZWFrCTEwMjMsMTAyMwotCQotCXNkYmJwCi0Jc2RiYnAJMAotCXNkYmJwCTIwCi0Jc2RiYnAJMjAsNDAKLQlzZGJicAkxMDIzLDEwMjMKLQkKLSMgZm9yY2Ugc29tZSBwYWRkaW5nLCB0byBtYWtlIG9iamR1bXAgY29uc2lzdGVudGx5IHJlcG9ydCB0aGF0IHRoZXJlJ3Mgc29tZQotIyBoZXJlLi4uCi0JLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkYzBlYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgZGVsYXkKLSNhczogLW1pcHMzIC1tY3B1PXI0MDAwCi0KLSMgCi0jIEdhcyBzaG91bGQgcHJvZHVjZSBub3AncyBhZnRlciBtdGMxIGFuZCByZWxhdGVkIAotIyBpbnNuJ3MgaWYgdGhlIHRhcmdldCBmcHIgaXMgdXNlZCBpbiB0aGUgCi0jIGltbWVkaWF0bHkgZm9sbG93aW5nIGluc24uICBTZWUgYWxzbyBub2RlbGF5LmQuCi0jCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IG10YzEJXCR6ZXJvLFwkZjAKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gY3Z0LmQudwlcJGYwLFwkZjAKLTArMDAwYyA8W14+XSo+IG10YzEJXCR6ZXJvLFwkZjEKLTArMDAxMCA8W14+XSo+IG5vcAotMCswMDE0IDxbXj5dKj4gY3Z0LmQudwlcJGYxLFwkZjEKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlMmYwMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBhYnMgbWFjcm8uCi1mb286Ci0JbXRjMQkkMCwkZjAKLQljdnQuZC53CSRmMCwkZjAKLSAgICAgICAgbXRjMSAgICAkMCwkZjEKLSAgICAgICAgY3Z0LmQudyAkZjEsJGYxCi0gICAgICAgIC5zcGFjZQk4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LWlsb2Nrcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYtaWxvY2tzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODU2ZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYtaWxvY2tzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGRpdgotI3NvdXJjZTogZGl2LnMKLQotIyBUZXN0IHRoZSBkaXYgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBibmV6CVwkYTEsMCswMDEwIDxmb29cKzB4MTA+Ci0wKzAwMDggPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhMQotMCswMDBjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMDE0IDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAwMjggPGZvb1wrMHgyOD4KLTArMDAxOCA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMDFjIDxbXj5dKj4gYm5lCVwkYTAsXCRhdCwwKzAwMjggPGZvb1wrMHgyOD4KLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDI4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMmMgPFtePl0qPiBibmV6CVwkYTIsMCswMDM4IDxmb29cKzB4Mzg+Ci0wKzAwMzAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMDM0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMDM4IDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMDNjIDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAwNTAgPGZvb1wrMHg1MD4KLTArMDA0MCA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMDQ0IDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAwNTAgPGZvb1wrMHg1MD4KLTArMDA0OCA8W14+XSo+IG5vcAotMCswMDRjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDUwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNTQgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMAotMCswMDU4IDxbXj5dKj4gbW92ZQlcJGEwLFwkYTEKLTArMDA1YyA8W14+XSo+IG5lZwlcJGEwLFwkYTAKLTArMDA2MCA8W14+XSo+IG5lZwlcJGEwLFwkYTEKLTArMDA2NCA8W14+XSo+IGxpCVwkYXQsMgotMCswMDY4IDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDA2YyA8W14+XSo+IG1mbG8JXCRhMAotMCswMDcwIDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAwNzQgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMDc4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwN2MgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDgwIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDA4NCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDg4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDA4YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwOTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA5NCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwOTggPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDljIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYTAgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMGE0IDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBhOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwYjAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMGI0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYjggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBiYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwYzAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGM4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDBjYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwZDAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGQ4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDBkYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwZTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBlNCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTAsXCRhMQotMCswMGU4IDxbXj5dKj4gYm5leglcJGExLDArMGY0IDxmb29cKzB4ZjQ+Ci0wKzAwZWMgPFtePl0qPiBkaXZ1CVwkemVybyxcJGEwLFwkYTEKLTArMDBmMCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDBmNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGY4IDxbXj5dKj4gYm5leglcJGEyLDArMDEwNCA8Zm9vXCsweDEwND4KLTArMDBmYyA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTAwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTA0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMDggPFtePl0qPiBtb3ZlCVwkYTAsXCRhMAotMCswMTBjIDxbXj5dKj4gYm5leglcJGEyLDArMDExOCA8Zm9vXCsweDExOD4KLTArMDExMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAxMTQgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxMTggPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAxMWMgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDEzMCA8Zm9vXCsweDEzMD4KLTArMDEyMCA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMTI0IDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAxMzAgPGZvb1wrMHgxMzA+Ci0wKzAxMjggPFtePl0qPiBub3AKLTArMDEyYyA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDEzMCA8W14+XSo+IG1maGkJXCRhMAotMCswMTM0IDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAxMzggPFtePl0qPiBkaXZ1CVwkemVybyxcJGExLFwkYXQKLTArMDEzYyA8W14+XSo+IG1maGkJXCRhMAotMCswMTQwIDxbXj5dKj4gYm5leglcJGEyLDArMDE0YyA8Zm9vXCsweDE0Yz4KLTArMDE0NCA8W14+XSo+IGRkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTQ4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCR6ZXJvLC0xCi0wKzAxNTAgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDE2OCA8Zm9vXCsweDE2OD4KLTArMDE1NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkemVybywxCi0wKzAxNTggPFtePl0qPiBkc2xsMzIJXCRhdCxcJGF0LDB4MWYKLTArMDE1YyA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMTY4IDxmb29cKzB4MTY4PgotMCswMTYwIDxbXj5dKj4gbm9wCi0wKzAxNjQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAxNjggPFtePl0qPiBtZmxvCVwkYTAKLTArMDE2YyA8W14+XSo+IGxpCVwkYXQsMgotMCswMTcwIDxbXj5dKj4gZGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTc0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxNzggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMTdjIDxbXj5dKj4gZGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAxODAgPFtePl0qPiBtZmhpCVwkYTAKLTArMDE4NCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAxODggPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxOGMgPFtePl0qPiBtZmhpCVwkYTAKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM1YmIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNhczogLW1jcHU9cjQwMDAKLSNuYW1lOiBNSVBTIGRpdgotCi0jIFRlc3QgdGhlIGRpdiBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJuZXoJXCRhMSwwKzAwMTAgPGZvb1wrMHgxMD4KLTArMDAwOCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGExCi0wKzAwMGMgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAwMTQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgotMCswMDE4IDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAwMWMgPFtePl0qPiBibmUJXCRhMCxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwMjggPFtePl0qPiBtZmxvCVwkYTAKLTArMDAyYyA8W14+XSo+IG5vcAotMCswMDMwIDxbXj5dKj4gYm5leglcJGEyLDArMDAzYyA8Zm9vXCsweDNjPgotMCswMDM0IDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDAzOCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDAzYyA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDA0MCA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMDU0IDxmb29cKzB4NTQ+Ci0wKzAwNDQgPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDA0OCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMDU0IDxmb29cKzB4NTQ+Ci0wKzAwNGMgPFtePl0qPiBub3AKLTArMDA1MCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDA1NCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDU4IDxbXj5dKj4gbW92ZQlcJGEwLFwkYTAKLTArMDA1YyA8W14+XSo+IG1vdmUJXCRhMCxcJGExCi0wKzAwNjAgPFtePl0qPiBuZWcJXCRhMCxcJGEwCi0wKzAwNjQgPFtePl0qPiBuZWcJXCRhMCxcJGExCi0wKzAwNjggPFtePl0qPiBsaQlcJGF0LDIKLTArMDA2YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwNzAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA3NCA8W14+XSo+IGxpCVwkYXQsMgotMCswMDc4IDxbXj5dKj4gbm9wCi0wKzAwN2MgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMDgwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwODQgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDg4IDxbXj5dKj4gbm9wCi0wKzAwOGMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDkwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwOTQgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDk4IDxbXj5dKj4gbm9wCi0wKzAwOWMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGEwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYTQgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMGE4IDxbXj5dKj4gbm9wCi0wKzAwYWMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMGIwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYjQgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMGI4IDxbXj5dKj4gbm9wCi0wKzAwYmMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGMwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBjOCA8W14+XSo+IG5vcAotMCswMGNjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBkMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZDggPFtePl0qPiBub3AKLTArMDBkYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwZTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBlNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGU4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDBlYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwZjAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBmNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGY4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDBmYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAxMDAgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDEwYyA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTAsXCRhMQotMCswMTEwIDxbXj5dKj4gYm5leglcJGExLDArMDExYyA8Zm9vXCsweDExYz4KLTArMDExNCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTAsXCRhMQotMCswMTE4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTFjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMjAgPFtePl0qPiBub3AKLTArMDEyNCA8W14+XSo+IGJuZXoJXCRhMiwwKzAxMzAgPGZvb1wrMHgxMzA+Ci0wKzAxMjggPFtePl0qPiBkaXZ1CVwkemVybyxcJGExLFwkYTIKLTArMDEyYyA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDEzMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTM0IDxbXj5dKj4gbW92ZQlcJGEwLFwkYTAKLTArMDEzOCA8W14+XSo+IGJuZXoJXCRhMiwwKzAxNDQgPGZvb1wrMHgxNDQ+Ci0wKzAxM2MgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTQwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTQ0IDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMTQ4IDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAxNWMgPGZvb1wrMHgxNWM+Ci0wKzAxNGMgPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDE1MCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMTVjIDxmb29cKzB4MTVjPgotMCswMTU0IDxbXj5dKj4gbm9wCi0wKzAxNTggPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAxNWMgPFtePl0qPiBtZmhpCVwkYTAKLTArMDE2MCA8W14+XSo+IGxpCVwkYXQsMgotMCswMTY0IDxbXj5dKj4gbm9wCi0wKzAxNjggPFtePl0qPiBkaXZ1CVwkemVybyxcJGExLFwkYXQKLTArMDE2YyA8W14+XSo+IG1maGkJXCRhMAotMCswMTcwIDxbXj5dKj4gbm9wCi0wKzAxNzQgPFtePl0qPiBibmV6CVwkYTIsMCswMTgwIDxmb29cKzB4MTgwPgotMCswMTc4IDxbXj5dKj4gZGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAxN2MgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxODAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sLTEKLTArMDE4NCA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTljIDxmb29cKzB4MTljPgotMCswMTg4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCR6ZXJvLDEKLTArMDE4YyA8W14+XSo+IGRzbGwzMglcJGF0LFwkYXQsMHgxZgotMCswMTkwIDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAxOWMgPGZvb1wrMHgxOWM+Ci0wKzAxOTQgPFtePl0qPiBub3AKLTArMDE5OCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDE5YyA8W14+XSo+IG1mbG8JXCRhMAotMCswMWEwIDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAxYTQgPFtePl0qPiBub3AKLTArMDFhOCA8W14+XSo+IGRkaXZ1CVwkemVybyxcJGExLFwkYXQKLTArMDFhYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMWIwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDFiNCA8W14+XSo+IG5vcAotMCswMWI4IDxbXj5dKj4gZGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAxYmMgPFtePl0qPiBtZmhpCVwkYTAKLTArMDFjMCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAxYzQgPFtePl0qPiBub3AKLTArMDFjOCA8W14+XSo+IGRkaXZ1CVwkemVybyxcJGExLFwkYXQKLTArMDFjYyA8W14+XSo+IG1maGkJXCRhMAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTk5MDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYucworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBkaXYgbWFjcm8uCi1mb286Ci0JZGl2CSQwLCQ0LCQ1Ci0JZGl2CSQ0LCQ1Ci0JZGl2CSQ0LCQ1LCQ2Ci0JZGl2CSQ0LDEKLQlkaXYJJDQsJDUsMQotCWRpdgkkNCwtMQotCWRpdgkkNCwkNSwtMQotCWRpdgkkNCwyCi0JZGl2CSQ0LCQ1LDIKLQlkaXYJJDQsMHg4MDAwCi0JZGl2CSQ0LCQ1LDB4ODAwMAotCWRpdgkkNCwtMHg4MDAwCi0JZGl2CSQ0LCQ1LC0weDgwMDAKLQlkaXYJJDQsMHgxMDAwMAotCWRpdgkkNCwkNSwweDEwMDAwCi0JZGl2CSQ0LDB4MWE1YTUKLQlkaXYJJDQsJDUsMHgxYTVhNQotCi0jIGRpdnUgaXMgbGlrZSBkaXYsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQlkaXZ1CSQwLCQ0LCQ1Ci0JZGl2dQkkNCwkNQotCWRpdnUJJDQsJDUsJDYKLQlkaXZ1CSQ0LDEKLQotIyByZW0gaXMgbGlrZSBkaXYsIHJlbXUgaXMgbGlrZSBkaXZ1Ci0JcmVtCSQ0LCQ1LCQ2Ci0JcmVtdQkkNCwkNSwyCi0KLSMgU2FuaXR5IGNoZWNrIHRoZSA2NCBiaXQgdmVyc2lvbnMuCi0JLnNldAltaXBzMwotCWRkaXYJJDQsJDUsJDYKLQlkZGl2dQkkNCwkNSwyCi0JZHJlbQkkNCwkNSwweDgwMDAKLQlkcmVtdQkkNCwkNSwtMHg4MDAwCi0KLSMgZm9yY2Ugc29tZSBwYWRkaW5nLCB0byBtYWtlIG9iamR1bXAgY29uc2lzdGVudGx5IHJlcG9ydCB0aGF0IHRoZXJlJ3Mgc29tZQotIyBoZXJlLi4uCi0JLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmI0NDVlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGRsaQotI2FzOiAtbWlwczMKLQotIyBUZXN0IHRoZSBkbGkgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAotMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwMGMgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDEwIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMWMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDIwIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAyNCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDAyOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHgxMjM0Ci0wKzAwMmMgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDAzMCA8W14+XSo+IGRzcmwzMglcJGEwLFwkYTAsMHgwCi0wKzAwMzQgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDAzOCA8W14+XSo+IGRzcmwzMglcJGEwLFwkYTAsMHgwCi0wKzAwM2MgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwNDAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwNDQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGMKLTArMDA0OCA8W14+XSo+IGx1aQlcJGEwLDB4ODAwMAotMCswMDRjIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDEyMzQKLTArMDA1MCA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwNTQgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAwNTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAotMCswMDVjIDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDYwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDU2NzgKLTArMDA2NCA8W14+XSo+IGx1aQlcJGEwLDB4ODAwMAotMCswMDY4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDEyMzQKLTArMDA2YyA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDA3MCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHg1Njc4Ci0wKzAwNzQgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAwNzggPFtePl0qPiBsaQlcJGEwLC0zMDg3NQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYTAsMHhmZmZmCi0wKzAwODAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4NDMyMQotMCswMDg0IDxbXj5dKj4gbGkJXCRhMCwtMTYKLTArMDA4OCA8W14+XSo+IGxpCVwkYTAsLTI1NgotMCswMDhjIDxbXj5dKj4gbGkJXCRhMCwtNDA5NgotMCswMDkwIDxbXj5dKj4gbHVpCVwkYTAsMHhmZmZmCi0wKzAwOTQgPFtePl0qPiBsdWkJXCRhMCwweGZmZjAKLTArMDA5OCA8W14+XSo+IGx1aQlcJGEwLDB4ZmYwMAotMCswMDljIDxbXj5dKj4gbHVpCVwkYTAsMHhmMDAwCi0wKzAwYTAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwYTQgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAotMCswMGE4IDxbXj5dKj4gbGkJXCRhMCwtMTYKLTArMDBhYyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAwYjAgPFtePl0qPiBsaQlcJGEwLC0yNTYKLTArMDBiNCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAwYjggPFtePl0qPiBsaQlcJGEwLC00MDk2Ci0wKzAwYmMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAotMCswMGMwIDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDBjNCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgxMAotMCswMGM4IDxbXj5dKj4gbGkJXCRhMCwweGZmZjAKLTArMDBjYyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgxMAotMCswMGQwIDxbXj5dKj4gbGkJXCRhMCwweGZmMDAKLTArMDBkNCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgxMAotMCswMGQ4IDxbXj5dKj4gbGkJXCRhMCwweGYwMDAKLTArMDBkYyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgxMAotMCswMGUwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMGU0IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHg0Ci0wKzAwZTggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwZWMgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDgKLTArMDBmMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBmNCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YwotMCswMGY4IDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMGZjIDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHgxMAotMCswMTAwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMTA0IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHgxNAotMCswMTA4IDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMTBjIDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHgxOAotMCswMTEwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMTE0IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHgxYwotMCswMTE4IDxbXj5dKj4gbHVpCVwkYTAsMHhmZmZmCi0wKzAxMWMgPFtePl0qPiBkc3JsMzIJXCRhMCxcJGEwLDB4MAotMCswMTIwIDxbXj5dKj4gbHVpCVwkYTAsMHhmZmYKLTArMDEyNCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhMCwweGZmCi0wKzAxMmMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmZmZgotMCswMTMwIDxbXj5dKj4gbHVpCVwkYTAsMHhmCi0wKzAxMzQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmZmZgotMCswMTM4IDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDEzYyA8W14+XSo+IGxpCVwkYTAsNDA5NQotMCswMTQwIDxbXj5dKj4gbGkJXCRhMCwyNTUKLTArMDE0NCA8W14+XSo+IGxpCVwkYTAsMTUKLTArMDE0OCA8W14+XSo+IGx1aQlcJGEwLDB4MwotMCswMTRjIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmMKLTArMDE1MCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCi0wKzAxNTQgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDFlCi0wKzAxNTggPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMTVjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDIKLTArMDE2MCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCi0wKzAxNjQgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4NgotMCswMTY4IDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMTZjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDE3MCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YQotMCswMTc0IDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMTc4IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxYwotMCswMTdjIDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhhCi0wKzAxODAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxODQgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDE4Ci0wKzAxODggPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGEKLTArMDE4YyA8W14+XSo+IGx1aQlcJGEwLDB4M2YKLTArMDE5MCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmYzAzCi0wKzAxOTQgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAxOTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmZmZgotMCswMTljIDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMWEwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGMwMDAKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTc5NTI4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgZGxpIG1hY3JvLgotCQotZm9vOgkKLQlkbGkJJDQsMAotCWRsaQkkNCwxCi0JZGxpCSQ0LC0xCi0JZGxpCSQ0LDB4ODAwMAotCWRsaQkkNCwtMHg4MDAwCi0JZGxpCSQ0LDB4MTAwMDAKLQlkbGkJJDQsMHgxYTVhNQotCWRsaQkkNCwweDgwMDAxMjM0Ci0JZGxpCSQ0LDB4ZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMGZmZmZmZmZmCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMGZmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHhmZmZmZmZmZjgwMDAxMjM0Ci0JZGxpCSQ0LDB4ZmZmZjgwMDAxMjM0NTY3OAotCWRsaQkkNCwweDgwMDAxMjM0NTY3ODAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmY4NzY1Ci0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmNDMyMQotCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmZmZmMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmZmZmMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmMDAwMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmMDAwMDAwMAotCWRsaQkkNCwweGZmZmZmZmZmMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmMDAwMDAwMDAwMAotCWRsaQkkNCwweGZmZmZmMDAwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmZmMDAwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmMDAwMDAwMDAwMDAwMAotCWRsaQkkNCwweGZmMDAwMDAwMDAwMDAwMDAKLQlkbGkJJDQsMHhmMDAwMDAwMDAwMDAwMDAwCi0KLQlkbGkJJDQsMHgwZmZmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDBmZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMGZmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDBmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMGZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDBmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMGZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDBmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDAwMGZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDAwZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAwMDBmZgotCWRsaQkkNCwweDAwMDAwMDAwMDAwMDAwMGYKLQotCWRsaQkkNCwweDAwMDAwMDAwMDAwM2ZmZmMKLQlkbGkJJDQsMHgwMDAwM2ZmZmMwMDAwMDAwCi0JZGxpCSQ0LDB4MDAwM2ZmZmMwMDAwMDAwMAotCWRsaQkkNCwweDAwM2ZmZmMwMDAwMDAwMDAKLQlkbGkJJDQsMHgwMDNmZmZmZmZmYzAwMDAwCi0JZGxpCSQ0LDB4MDAzZmZmZmZmZmZjMDAwMAotCWRsaQkkNCwweDAwM2ZmZmZmZmZmZmMwMDAKLQotCWRsaQkkNCwweDAwM2ZmYzAzZmZmZmMwMDAKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZTMyLXJlbDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZTMyLXJlbDIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0OTQxNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2UzMi1yZWwyLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jb2JqZHVtcDogLXNyIC1qIC50ZXh0Ci0jbmFtZTogTUlQUyBFTEYgcmVsb2MgMiAoMzItYml0KQotI3NvdXJjZTogZWxmLXJlbDIucwotCi0jIFRlc3QgdGhlIEdQUkVMIGFuZCBMSVRFUkFMIGdlbmVyYXRpb24uCi0jIEZJWE1FOiByZWFsbHkgdGhpcyBzaG91bGQgY2hlY2sgdGhhdCB0aGUgY29udGVudHMgb2YgLnNkYXRhLCAubGl0NCwKLSMgYW5kIC5saXQ4IGFyZSBjb3JyZWN0IHRvby4KLQotLio6ICAgICBmaWxlIGZvcm1hdCBlbGYuKm1pcHMKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcW1wudGV4dFxdOgotT0ZGU0VUICAgICAgICAgICBUWVBFICAgICAgICAgICAgICBWQUxVRSAKLTArMDAwMDAwMCBSX01JUFNfTElURVJBTCAgICBcLmxpdDhcKzB4MCswMDA0MDAwCi0wKzAwMDAwMDQgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ4XCsweDArMDAwNDAwMAotMCswMDAwMDA4IFJfTUlQU19MSVRFUkFMICAgIFwubGl0OFwrMHgwKzAwMDQwMDAKLTArMDAwMDAwYyBSX01JUFNfTElURVJBTCAgICBcLmxpdDhcKzB4MCswMDA0MDAwCi0wKzAwMDAwMTAgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ4XCsweDArMDAwNDAwMAotMCswMDAwMDE0IFJfTUlQU19MSVRFUkFMICAgIFwubGl0OFwrMHgwKzAwMDQwMDAKLTArMDAwMDAxOCBSX01JUFNfTElURVJBTCAgICBcLmxpdDRcKzB4MCswMDA0MDAwCi0wKzAwMDAwMWMgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ0XCsweDArMDAwNDAwMAotMCswMDAwMDIwIFJfTUlQU19MSVRFUkFMICAgIFwubGl0NFwrMHgwKzAwMDQwMDAKLTArMDAwMDAyNCBSX01JUFNfR1BSRUwxNiAgICBcLnNkYXRhXCsweDArMDAwNDAwMAotMCswMDAwMDI4IFJfTUlQU19HUFJFTDE2ICAgIFwuc2RhdGFcKzB4MCswMDA0MDAwCi0wKzAwMDAwMmMgUl9NSVBTX0dQUkVMMTYgICAgXC5zZGF0YVwrMHgwKzAwMDQwMDAKLQotCi1Db250ZW50cyBvZiBzZWN0aW9uIFwudGV4dDoKLSAwMDAwIGM3ODNjMDAwIGM3ODJjMDA0IGM3ODNjMDA4IGM3ODJjMDBjICAuKgotIDAwMTAgYzc4M2MwMTAgYzc4MmMwMTQgYzc4MmMwMDAgYzc4MmMwMDQgIC4qCi0gMDAyMCBjNzgyYzAwOCA4ZjgyYzAwMCA4ZjgyYzAwNCA4ZjgyYzAwOCAgLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MGJkZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jb2JqZHVtcDogLXNyIC1qIC50ZXh0Ci0jbmFtZTogTUlQUyBFTEYgcmVsb2MKLQotIyBUZXN0IHRoZSBISTE2L0xPMTYgZ2VuZXJhdGlvbi4KLQotLio6ICAgICBmaWxlIGZvcm1hdCBlbGYuKm1pcHMKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcW1wudGV4dFxdOgotT0ZGU0VUICAgICAgICAgICBUWVBFICAgICAgICAgICAgICBWQUxVRSAKLTArMDAwMDAwMCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDAxOCBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDAwYyBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDAxYyBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDAwOCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDAyMCBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDAwNCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDAyNCBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDAxNCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDAyOCBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDAxMCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDAyYyBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDAzMCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDA0OCBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDAzNCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDA0YyBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDAzOCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDA1MCBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDAzYyBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDA1NCBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDA0NCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDA1OCBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLTArMDAwMDA0MCBSX01JUFNfSEkxNiAgICAgICBcLnRleHQKLTArMDAwMDA1YyBSX01JUFNfTE8xNiAgICAgICBcLnRleHQKLQotCi1Db250ZW50cyBvZiBzZWN0aW9uIFwudGV4dDoKLSAwMDAwIDNjMDEwMDAwIDNjMDEwMDAwIDNjMDEwMDAxIDNjMDEwMDAxICAuKgotIDAwMTAgM2MwMTAwMDAgM2MwMTAwMDEgMjAyMTAwMTggMjAyMTAwMWMgIC4qCi0gMDAyMCAyMDIxMDAxOCAyMDIxMDAxYyAyMDIxODAxOCAyMDIxZmZmYyAgLioKLSAwMDMwIDNjMDEwMDAxIDNjMDEwMDAxIDNjMDEwMDAyIDNjMDEwMDAyICAuKgotIDAwNDAgM2MwMTAwMDEgM2MwMTAwMDEgMjAyMWJmZmUgMjAyMWMwMDIgIC4qCi0gMDA1MCAyMDIxYmZmZSAyMDIxYzAwMiAyMDIxM2ZmZSAyMDIxYmZmYSAgLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODUzNDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0JLnRleHQKLQkuYWxpZ24gMTUKLWwwOgotbDIJPSBsMCs0OTE1MAotCi0JLnNldAlub2F0Ci0JLnNldAlub3Jlb3JkZXIKLQlsdWkJJGF0LCVoaShsMSkKLQlsdWkJJGF0LCVoaShsMSs0KQotCWx1aQkkYXQsJWhpKGwxKzB4MTAwMDApCi0JbHVpCSRhdCwlaGkobDErMHgxMDAwNCkKLQlsdWkJJGF0LCVoaShsMC00KQotCWx1aQkkYXQsJWhpKGwxKzB4ODAwMCkKLWwxOgkJCi0JYWRkaQkkYXQsJGF0LCVsbyhsMSkKLQlhZGRpCSRhdCwkYXQsJWxvKGwxKzB4MTAwMDQpCi0JYWRkaQkkYXQsJGF0LCVsbyhsMSsweDEwMDAwKQotCWFkZGkJJGF0LCRhdCwlbG8obDErNCkKLQlhZGRpCSRhdCwkYXQsJWxvKGwxKzB4ODAwMCkKLQlhZGRpCSRhdCwkYXQsJWxvKGwwLTQpCi0KLQlsdWkJJGF0LCVoaShsMikKLQlsdWkJJGF0LCVoaShsMis0KQotCWx1aQkkYXQsJWhpKGwyKzB4MTAwMDApCi0JbHVpCSRhdCwlaGkobDIrMHgxMDAwNCkKLQlsdWkJJGF0LCVoaShsMi00KQotCWx1aQkkYXQsJWhpKGwyKzB4ODAwMCkKLQlhZGRpCSRhdCwkYXQsJWxvKGwyKQotCWFkZGkJJGF0LCRhdCwlbG8obDIrNCkKLQlhZGRpCSRhdCwkYXQsJWxvKGwyKzB4MTAwMDApCi0JYWRkaQkkYXQsJGF0LCVsbyhsMisweDEwMDA0KQotCWFkZGkJJGF0LCRhdCwlbG8obDIrMHg4MDAwKQotCWFkZGkJJGF0LCRhdCwlbG8obDItNCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbDIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwZmFjZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwyLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jb2JqZHVtcDogLXNyIC1qIC50ZXh0Ci0jbmFtZTogTUlQUyBFTEYgcmVsb2MgMgotCi0jIFRlc3QgdGhlIEdQUkVMIGFuZCBMSVRFUkFMIGdlbmVyYXRpb24uCi0jIEZJWE1FOiByZWFsbHkgdGhpcyBzaG91bGQgY2hlY2sgdGhhdCB0aGUgY29udGVudHMgb2YgLnNkYXRhLCAubGl0NCwKLSMgYW5kIC5saXQ4IGFyZSBjb3JyZWN0IHRvby4KLQotLio6ICAgICBmaWxlIGZvcm1hdCBlbGYuKm1pcHMKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcW1wudGV4dFxdOgotT0ZGU0VUICAgICAgICAgICBUWVBFICAgICAgICAgICAgICBWQUxVRSAKLTArMDAwMDAwMCBSX01JUFNfTElURVJBTCAgICBcLmxpdDhcKzB4MCswMDA0MDAwCi0wKzAwMDAwMDQgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ4XCsweDArMDAwNDAwMAotMCswMDAwMDA4IFJfTUlQU19MSVRFUkFMICAgIFwubGl0OFwrMHgwKzAwMDQwMDAKLTArMDAwMDAwYyBSX01JUFNfTElURVJBTCAgICBcLmxpdDRcKzB4MCswMDA0MDAwCi0wKzAwMDAwMTAgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ0XCsweDArMDAwNDAwMAotMCswMDAwMDE0IFJfTUlQU19MSVRFUkFMICAgIFwubGl0NFwrMHgwKzAwMDQwMDAKLTArMDAwMDAxOCBSX01JUFNfR1BSRUwxNiAgICBcLnNkYXRhXCsweDArMDAwNDAwMAotMCswMDAwMDFjIFJfTUlQU19HUFJFTDE2ICAgIFwuc2RhdGFcKzB4MCswMDA0MDAwCi0wKzAwMDAwMjAgUl9NSVBTX0dQUkVMMTYgICAgXC5zZGF0YVwrMHgwKzAwMDQwMDAKLQotCi1Db250ZW50cyBvZiBzZWN0aW9uIFwudGV4dDoKLSAwMDAwIGQ3ODJjMDAwIGQ3ODJjMDA4IGQ3ODJjMDEwIGM3ODJjMDAwICAuKgotIDAwMTAgYzc4MmMwMDQgYzc4MmMwMDggOGY4MmMwMDAgOGY4MmMwMDQgIC4qCi0gMDAyMCA4ZjgyYzAwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4MTJjYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0JLnNkYXRhCi0JLmFsaWduIDIKLQkudHlwZSB3MSxAb2JqZWN0Ci0JLnNpemUgdzEsNAotdzE6CS53b3JkCTEKLQkudHlwZSB3MixAb2JqZWN0Ci0JLnNpemUgdzIsNAotdzI6CS53b3JkCTIKLQkudHlwZSB3MyxAb2JqZWN0Ci0JLnNpemUgdzMsNAotdzM6CS53b3JkCTMKLQkKLQkudGV4dAotCS5hbGlnbiAyCi1sMDoKLQkuc2V0CW5vcmVvcmRlcgotCi0gICAgICAgIGxpLmQgICAgJGYyLDEuMTAwMDAwMDAwMDAwMDAwMDAwMDBlMAotICAgICAgICBsaS5kICAgICRmMiwyLjEwMDAwMDAwMDAwMDAwMDAwMDAwZTAKLSAgICAgICAgbGkuZCAgICAkZjIsMy4xMDAwMDAwMDAwMDAwMDAwMDAwMGUwCi0gICAgICAgIGxpLnMgICAgJGYyLDEuMTAwMDAwMDAwMDAwMDAwMDAwMDBlMAotICAgICAgICBsaS5zICAgICRmMiwyLjEwMDAwMDAwMDAwMDAwMDAwMDAwZTAKLSAgICAgICAgbGkucyAgICAkZjIsMy4xMDAwMDAwMDAwMDAwMDAwMDAwMGUwCi0KLQkuc2V0CW5vbWFjcm8KLQkKLQlsdwkkMix3MQotCWx3CSQyLHcyCi0JbHcJJDIsdzMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MuYyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNWY5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXNuJ3QgZGlyZWN0bHkgdXNlZCBieSB0aGUgdGVzdCBzdWl0ZTsgaXQgdXNlcwotICAgZWxmX2VfZmxhZ3Mucy4gIEhvd2V2ZXIsIEkgZmlndXJlZCBpdCB3b3VsZCBiZSBuaWNlIHRvIHByb3ZpZGUgdGhlCi0gICBzb3VyY2UgY29kZSBmcm9tIHdoaWNoIHRoZSAucyBmaWxlIHdhcyBnZW5lcmF0ZWQuCi0KLSAgIEl0IHdhcyBjb21waWxlZCBhcyBmb2xsb3dzOgotCi0gICBtaXBzNjQtZWxmLWdjYyAtbTQ2NTAgLVMgLU8gZWxmX2VfZmxhZ3MuYwotCi0gICBXZSB1c2UgdGhlIC1tNDY1MCBmbGFnIHRvIGdldCB0aGUgNDY1MC1zcGVjaWZpYyAnbXVsJyBpbnN0cnVjdGlvbgotICAgaW4gdGhlcmU7IHRoZSB0ZXN0IHN1aXRlIHdhbnRzIHRvIGJlIHN1cmUgdGhhdCBHQVMncyAtbTQ2NTAgZmxhZwotICAgd2lsbCBpbmRlZWQgY2F1c2UgaXQgdG8gZ2VuZXJhdGUgdGhlIDQ2NTAgbXVsIGluc3RydWN0aW9uLCBhbmQgbm90Ci0gICBleHBhbmQgaXQgYXMgYSBtYWNyby4KLQotICAgSWFuIDEwIEp1bmUgMTk5OTogSSB0d2Vha2VkIHRoZSByZXN1bHRpbmcgYXNzZW1ibGVyIGZpbGUgc28gdGhhdCBpdAotICAgd291bGQgZ2VuZXJhdGUgdGhlIHNhbWUgY29kZSB3aGVuIGdhcyB3YXMgY29uZmlndXJlZCBmb3IgbWlwcy1lbGYKLSAgIGFuZCBmb3IgbWlwczY0LWVsZi4gICovCi0KLWludAotZm9vIChpbnQgYSwgaW50IGIpCi17Ci0gIHJldHVybiAoYSAqIGIpICsgMTsKLX0KLQotaW50Ci1tYWluICgpCi17Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNhOGM0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MucworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLQkuZmlsZQkxICJlbGZfZV9mbGFncy5jIgotZ2NjMl9jb21waWxlZC46Ci1fX2dudV9jb21waWxlZF9jOgotCS50ZXh0Ci0JLmFsaWduCTIKLQkuZ2xvYmwJZm9vCi0JLnRleHQKLQkuZW50CWZvbwotZm9vOgotCS5mcmFtZQkkc3AsMCwkMzEJCSMgdmFycz0gMCwgcmVncz0gMC8wLCBhcmdzPSAwLCBleHRyYT0gMAotCS5tYXNrCTB4MDAwMDAwMDAsMAotCS5mbWFzawkweDAwMDAwMDAwLDAKLQltdWwJJDIsJDQsJDUKLQkuc2V0CW5vcmVvcmRlcgotCS5zZXQJbm9tYWNybwotCWoJJDMxCi0JYWRkdQkkMiwkMiwxCi0JLnNldAltYWNybwotCS5zZXQJcmVvcmRlcgotCi0JLmVuZAlmb28KLQkuYWxpZ24JMgotCS5nbG9ibAltYWluCi0JLnRleHQKLQkuZW50CW1haW4KLW1haW46Ci0JLmZyYW1lCSRzcCw0MCwkMzEJCSMgdmFycz0gMCwgcmVncz0gMS8wLCBhcmdzPSAzMiwgZXh0cmE9IDAKLQkubWFzawkweDgwMDAwMDAwLC04Ci0JLmZtYXNrCTB4MDAwMDAwMDAsMAotCXN1YnUJJHNwLCRzcCw0MAotCXN3CSQzMSwzMigkc3ApCi0JamFsCV9fZ2NjbWFpbgotCW1vdmUJJDIsJDAKLQlsdwkkMzEsMzIoJHNwKQotCW5vcAotCS5zZXQJbm9yZW9yZGVyCi0JLnNldAlub21hY3JvCi0JagkkMzEKLQlhZGR1CSRzcCwkc3AsNDAKLQkuc2V0CW1hY3JvCi0JLnNldAlyZW9yZGVyCi0KLQkuZW5kCW1haW4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGFhMmYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIG5hbWU6IEVMRiBlX2ZsYWdzOiBub3RoaW5nIHNwZWNpYWwKLSMgc291cmNlOiBlbGZfZV9mbGFncy5zCi0jIG9iamR1bXA6IC1mZAotCi0uKjouKmZpbGUgZm9ybWF0LiptaXBzLioKLWFyY2hpdGVjdHVyZTogbWlwczpbMzRdWzAtOV0wMCwgZmxhZ3MgMHgwMDAwMDAxMToKLUhBU19SRUxPQywgSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMDAwMDAwMDAwCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwMDAwMDAwMDAgPGZvbz46Ci0gICAwOgkwMDg1MDAxOSAJbXVsdHUJXCRhMCxcJGExCi0gICA0OgkwMDAwMTAxMiAJbWZsbwlcJHYwCi0gICA4OgkwM2UwMDAwOCAJanIJXCRyYQotICAgYzoJMjQ0MjAwMDEgCWFkZGl1CVwkdjAsXCR2MCwxCi0KLTAwMDAwMDAwMDAwMDAwMTAgPG1haW4+OgotICAxMDoJMjdiZGZmZDggCWFkZGl1CVwkc3AsXCRzcCwtNDAKLSAgMTQ6CWFmYmYwMDIwIAlzdwlcJHJhLDMyXChcJHNwXCkKLSAgMTg6CTBjMDAwMDAwIAlqYWwJMCA8Zm9vPgotICAxYzoJMDAwMDAwMDAgCW5vcAotICAyMDoJMDAwMDEwMlsxZF0gCW1vdmUJXCR2MCxcJHplcm8KLSAgMjQ6CThmYmYwMDIwIAlsdwlcJHJhLDMyXChcJHNwXCkKLSAgMjg6CTAwMDAwMDAwIAlub3AKLSAgMmM6CTAzZTAwMDA4IAlqcglcJHJhCi0gIDMwOgkyN2JkMDAyOCAJYWRkaXUJXCRzcCxcJHNwLDQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxM2JkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMi5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBuYW1lOiBFTEYgZV9mbGFnczogLW00NjUwCi0jIHNvdXJjZTogZWxmX2VfZmxhZ3MucwotIyBhczogLW00NjUwCi0jIG9iamR1bXA6IC1mZAotCi0uKjouKmZpbGUgZm9ybWF0LiptaXBzLioKLWFyY2hpdGVjdHVyZTogbWlwczo0NjUwLCBmbGFncyAweDAwMDAwMDExOgotSEFTX1JFTE9DLCBIQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTcwODUxMDAyIAltdWwJXCR2MCxcJGEwLFwkYTEKLSAgIDQ6CTAzZTAwMDA4IAlqcglcJHJhCi0gICA4OgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKLQotMDAwMDAwMDAwMDAwMDAwYyA8bWFpbj46Ci0gICBjOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAotICAxMDoJYWZiZjAwMjAgCXN3CVwkcmEsMzJcKFwkc3BcKQotICAxNDoJMGMwMDAwMDAgCWphbAkwIDxmb28+Ci0gIDE4OgkwMDAwMDAwMCAJbm9wCi0gIDFjOgkwMDAwMTAyZCAJbW92ZQlcJHYwLFwkemVybwotICAyMDoJOGZiZjAwMjAgCWx3CVwkcmEsMzJcKFwkc3BcKQotICAyNDoJMDAwMDAwMDAgCW5vcAotICAyODoJMDNlMDAwMDggCWpyCVwkcmEKLSAgMmM6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODEzNDkxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIG5hbWU6IEVMRiBlX2ZsYWdzOiAtbWNwdT00NjUwCi0jIHNvdXJjZTogZWxmX2VfZmxhZ3MucwotIyBhczogLW1jcHU9NDY1MAotIyBvYmpkdW1wOiAtZmQKLQotLio6LipmaWxlIGZvcm1hdC4qbWlwcy4qCi1hcmNoaXRlY3R1cmU6IG1pcHM6NDY1MCwgZmxhZ3MgMHgwMDAwMDAxMToKLUhBU19SRUxPQywgSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMDAwMDAwMDAwCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwMDAwMDAwMDAgPGZvbz46Ci0gICAwOgk3MDg1MTAwMiAJbXVsCVwkdjAsXCRhMCxcJGExCi0gICA0OgkwM2UwMDAwOCAJanIJXCRyYQotICAgODoJMjQ0MjAwMDEgCWFkZGl1CVwkdjAsXCR2MCwxCi0KLTAwMDAwMDAwMDAwMDAwMGMgPG1haW4+OgotICAgYzoJMjdiZGZmZDggCWFkZGl1CVwkc3AsXCRzcCwtNDAKLSAgMTA6CWFmYmYwMDIwIAlzdwlcJHJhLDMyXChcJHNwXCkKLSAgMTQ6CTBjMDAwMDAwIAlqYWwJMCA8Zm9vPgotICAxODoJMDAwMDAwMDAgCW5vcAotICAxYzoJMDAwMDEwMmQgCW1vdmUJXCR2MCxcJHplcm8KLSAgMjA6CThmYmYwMDIwIAlsdwlcJHJhLDMyXChcJHNwXCkKLSAgMjQ6CTAwMDAwMDAwIAlub3AKLSAgMjg6CTAzZTAwMDA4IAlqcglcJHJhCi0gIDJjOgkyN2JkMDAyOCAJYWRkaXUJXCRzcCxcJHNwLDQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzNC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzZWJhMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzNC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBuYW1lOiBFTEYgZV9mbGFnczogLW00NjUwIC1tY3B1PTQ2NTAKLSMgc291cmNlOiBlbGZfZV9mbGFncy5zCi0jIGFzOiAtbTQ2NTAgLW1jcHU9NDY1MAotIyBvYmpkdW1wOiAtZmQKLQotLio6LipmaWxlIGZvcm1hdC4qbWlwcy4qCi1hcmNoaXRlY3R1cmU6IG1pcHM6NDY1MCwgZmxhZ3MgMHgwMDAwMDAxMToKLUhBU19SRUxPQywgSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMDAwMDAwMDAwCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwMDAwMDAwMDAgPGZvbz46Ci0gICAwOgk3MDg1MTAwMiAJbXVsCVwkdjAsXCRhMCxcJGExCi0gICA0OgkwM2UwMDAwOCAJanIJXCRyYQotICAgODoJMjQ0MjAwMDEgCWFkZGl1CVwkdjAsXCR2MCwxCi0KLTAwMDAwMDAwMDAwMDAwMGMgPG1haW4+OgotICAgYzoJMjdiZGZmZDggCWFkZGl1CVwkc3AsXCRzcCwtNDAKLSAgMTA6CWFmYmYwMDIwIAlzdwlcJHJhLDMyXChcJHNwXCkKLSAgMTQ6CTBjMDAwMDAwIAlqYWwJMCA8Zm9vPgotICAxODoJMDAwMDAwMDAgCW5vcAotICAxYzoJMDAwMDEwMmQgCW1vdmUJXCR2MCxcJHplcm8KLSAgMjA6CThmYmYwMDIwIAlsdwlcJHJhLDMyXChcJHNwXCkKLSAgMjQ6CTAwMDAwMDAwIAlub3AKLSAgMjg6CTAzZTAwMDA4IAlqcglcJHJhCi0gIDJjOgkyN2JkMDAyOCAJYWRkaXUJXCRzcCxcJHNwLDQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNmI0ZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLSNvYmpkdW1wOiAtcnN0IC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBlbXBpYwotI2FzOiAtbWVtYmVkZGVkLXBpYyAtbWlwczMKLQotIyBDaGVjayBHTlUtc3BlY2lmaWMgZW1iZWRkZWQgcmVsb2NzLCBmb3IgRUxGLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZi4qbWlwcy4qCi0KLVNZTUJPTCBUQUJMRToKLTArMDAwMDAwMCBsICAgIGQgIFwudGV4dAkwKzAwMDAwMDAgCi0wKzAwMDAwMDAgbCAgICBkICBcLmRhdGEJMCswMDAwMDAwIAotMCswMDAwMDAwIGwgICAgZCAgXC5ic3MJMCswMDAwMDAwIAotMCswMDAwMDAwIGwgICAgZCAgXC5mb28JMCswMDAwMDAwIAotMCswMDAwMDAwIGwgICAgZCAgXC5yZWdpbmZvCTArMDAwMDAwMCAKLTArMDAwMDAwMCBsICAgIGQgIFwubWRlYnVnCTArMDAwMDAwMCAKLTArMDAwMDAwNCBsICAgICAgIFwudGV4dAkwKzAwMDAwMDAgbDIKLTArMDAwMDAwMCAgICAgICAgIFwqVU5EXCoJMCswMDAwMDAwIGcxCi0wKzAwMDAwMDAgICAgICAgICBcKlVORFwqCTArMDAwMDAwMCBnMgotMCswMDAwMTAwIGwgICAgICAgXC5mb28JMCswMDAwMDAwIGwxCi0wKzAwMDAwMzQgbCAgICAgICBcLnRleHQJMCswMDAwMDAwIGwzCi0wKzAwMDAwOTggbCAgICAgICBcLnRleHQJMCswMDAwMDAwIGw1Ci0wKzAwMDAwMDQgbCAgICAgICBcLmZvbwkwKzAwMDAwMDAgbDQKLQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbXC50ZXh0XF06Ci1PRkZTRVQgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMCswMDAwMDA0IFJfTUlQU19HTlVfUkVMMTZfUzIgIGcxCi0wKzAwMDAwMGMgUl9NSVBTX0dOVV9SRUwxNl9TMiAgZzIKLTArMDAwMDAxNCBSX01JUFNfR05VX1JFTDE2X1MyICBnMgotMCswMDAwMDFjIFJfTUlQU19HTlVfUkVMMTZfUzIgIFwuZm9vCi0wKzAwMDAwMjQgUl9NSVBTX0dOVV9SRUwxNl9TMiAgXC50ZXh0Ci0wKzAwMDAwMmMgUl9NSVBTX0dOVV9SRUwxNl9TMiAgXC5mb28KLTArMDAwMDAzNCBSX01JUFNfR05VX1JFTDE2X1MyICBcLnRleHQKLTArMDAwMDAzYyBSX01JUFNfR05VX1JFTF9ISTE2ICBnMQotMCswMDAwMDQwIFJfTUlQU19HTlVfUkVMX0xPMTYgIGcxCi0wKzAwMDAwNDQgUl9NSVBTX0dOVV9SRUxfSEkxNiAgXC5mb28KLTArMDAwMDA0OCBSX01JUFNfR05VX1JFTF9MTzE2ICBcLmZvbwotMCswMDAwMDUwIFJfTUlQU18zMiAgICAgICAgIGcxCi0wKzAwMDAwNTQgUl9NSVBTXzMyICAgICAgICAgXC5mb28KLTArMDAwMDA1OCBSX01JUFNfMzIgICAgICAgICBcLnRleHQKLTArMDAwMDA1YyBSX01JUFNfUEMzMiAgICAgICBnMQotMCswMDAwMDYwIFJfTUlQU19QQzMyICAgICAgIFwuZm9vCi0wKzAwMDAwNjggUl9NSVBTXzY0ICAgICAgICAgZzEKLTArMDAwMDA3MCBSX01JUFNfNjQgICAgICAgICBcLmZvbwotMCswMDAwMDc4IFJfTUlQU182NCAgICAgICAgIFwudGV4dAotMCswMDAwMDgwIFJfTUlQU19QQzY0ICAgICAgIGcxCi0wKzAwMDAwODggUl9NSVBTX1BDNjQgICAgICAgXC5mb28KLTArMDAwMDA5OCBSX01JUFNfR05VX1JFTDE2X1MyICBcLnRleHQKLTArMDAwMDA5YyBSX01JUFNfR05VX1JFTDE2X1MyICBcLnRleHQKLTArMDAwMDBhMCBSX01JUFNfR05VX1JFTF9ISTE2ICBcLnRleHQKLTArMDAwMDBhNCBSX01JUFNfR05VX1JFTF9MTzE2ICBcLnRleHQKLTArMDAwMDBhOCBSX01JUFNfR05VX1JFTF9ISTE2ICBcLnRleHQKLTArMDAwMDBhYyBSX01JUFNfR05VX1JFTF9MTzE2ICBcLnRleHQKLTArMDAwMDBiMCBSX01JUFNfMzIgICAgICAgICBcLnRleHQKLTArMDAwMDBiOCBSX01JUFNfNjQgICAgICAgICBcLnRleHQKLTArMDAwMDBjYyBSX01JUFNfR05VX1JFTDE2X1MyICBcLnRleHQKLTArMDAwMDBkMCBSX01JUFNfR05VX1JFTDE2X1MyICBcLnRleHQKLTArMDAwMDBkNCBSX01JUFNfR05VX1JFTF9ISTE2ICBcLnRleHQKLTArMDAwMDBkOCBSX01JUFNfR05VX1JFTF9MTzE2ICBcLnRleHQKLTArMDAwMDBkYyBSX01JUFNfR05VX1JFTF9ISTE2ICBcLnRleHQKLTArMDAwMDBlMCBSX01JUFNfR05VX1JFTF9MTzE2ICBcLnRleHQKLTArMDAwMDBlNCBSX01JUFNfMzIgICAgICAgICBcLnRleHQKLTArMDAwMDBmMCBSX01JUFNfNjQgICAgICAgICBcLnRleHQKLQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbXC5mb29cXToKLU9GRlNFVCAgICAgICAgICAgVFlQRSAgICAgICAgICAgICAgVkFMVUUgCi0wKzAwMDAwMDQgUl9NSVBTX0dOVV9SRUxfSEkxNiAgZzEKLTArMDAwMDAwOCBSX01JUFNfR05VX1JFTF9MTzE2ICBnMQotMCswMDAwMDBjIFJfTUlQU19HTlVfUkVMX0hJMTYgIFwuZm9vCi0wKzAwMDAwMTAgUl9NSVBTX0dOVV9SRUxfTE8xNiAgXC5mb28KLTArMDAwMDAxNCBSX01JUFNfR05VX1JFTF9ISTE2ICBcLnRleHQKLTArMDAwMDAxOCBSX01JUFNfR05VX1JFTF9MTzE2ICBcLnRleHQKLTArMDAwMDAxYyBSX01JUFNfR05VX1JFTF9ISTE2ICBnMQotMCswMDAwMDIwIFJfTUlQU19HTlVfUkVMX0xPMTYgIGcxCi0wKzAwMDAwMjQgUl9NSVBTX0dOVV9SRUxfSEkxNiAgZzEKLTArMDAwMDAyOCBSX01JUFNfR05VX1JFTF9MTzE2ICBnMQotMCswMDAwMDJjIFJfTUlQU19HTlVfUkVMX0hJMTYgIFwuZm9vCi0wKzAwMDAwMzAgUl9NSVBTX0dOVV9SRUxfTE8xNiAgXC5mb28KLTArMDAwMDAzNCBSX01JUFNfR05VX1JFTF9ISTE2ICBcLnRleHQKLTArMDAwMDAzOCBSX01JUFNfR05VX1JFTF9MTzE2ICBcLnRleHQKLTArMDAwMDAzYyBSX01JUFNfMzIgICAgICAgICBnMQotMCswMDAwMDQwIFJfTUlQU18zMiAgICAgICAgIFwuZm9vCi0wKzAwMDAwNDQgUl9NSVBTXzMyICAgICAgICAgXC50ZXh0Ci0wKzAwMDAwNDggUl9NSVBTX1BDMzIgICAgICAgZzEKLTArMDAwMDA1MCBSX01JUFNfUEMzMiAgICAgICBcLnRleHQKLTArMDAwMDA1OCBSX01JUFNfNjQgICAgICAgICBnMQotMCswMDAwMDYwIFJfTUlQU182NCAgICAgICAgIFwuZm9vCi0wKzAwMDAwNjggUl9NSVBTXzY0ICAgICAgICAgXC50ZXh0Ci0wKzAwMDAwNzAgUl9NSVBTX1BDNjQgICAgICAgZzEKLTArMDAwMDA4MCBSX01JUFNfUEM2NCAgICAgICBcLnRleHQKLTArMDAwMDA4OCBSX01JUFNfR05VX1JFTF9ISTE2ICBnMQotMCswMDAwMDhjIFJfTUlQU19HTlVfUkVMX0xPMTYgIGcxCi0wKzAwMDAwOTAgUl9NSVBTX0dOVV9SRUxfSEkxNiAgXC5mb28KLTArMDAwMDA5NCBSX01JUFNfR05VX1JFTF9MTzE2ICBcLmZvbwotMCswMDAwMDk4IFJfTUlQU19HTlVfUkVMX0hJMTYgIFwudGV4dAotMCswMDAwMDljIFJfTUlQU19HTlVfUkVMX0xPMTYgIFwudGV4dAotMCswMDAwMGEwIFJfTUlQU19HTlVfUkVMX0hJMTYgIGcxCi0wKzAwMDAwYTQgUl9NSVBTX0dOVV9SRUxfTE8xNiAgZzEKLTArMDAwMDBhOCBSX01JUFNfR05VX1JFTF9ISTE2ICBcLmZvbwotMCswMDAwMGFjIFJfTUlQU19HTlVfUkVMX0xPMTYgIFwuZm9vCi0wKzAwMDAwYjAgUl9NSVBTX0dOVV9SRUxfSEkxNiAgXC50ZXh0Ci0wKzAwMDAwYjQgUl9NSVBTX0dOVV9SRUxfTE8xNiAgXC50ZXh0Ci0wKzAwMDAwYjggUl9NSVBTXzMyICAgICAgICAgZzEKLTArMDAwMDBiYyBSX01JUFNfMzIgICAgICAgICBcLmZvbwotMCswMDAwMGMwIFJfTUlQU18zMiAgICAgICAgIFwudGV4dAotMCswMDAwMGM0IFJfTUlQU19QQzMyICAgICAgIGcxCi0wKzAwMDAwY2MgUl9NSVBTX1BDMzIgICAgICAgXC50ZXh0Ci0wKzAwMDAwZDAgUl9NSVBTXzY0ICAgICAgICAgZzEKLTArMDAwMDBkOCBSX01JUFNfNjQgICAgICAgICBcLmZvbwotMCswMDAwMGUwIFJfTUlQU182NCAgICAgICAgIFwudGV4dAotMCswMDAwMGU4IFJfTUlQU19QQzY0ICAgICAgIGcxCi0wKzAwMDAwZjggUl9NSVBTX1BDNjQgICAgICAgXC50ZXh0Ci0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gXC50ZXh0OgotIDAwMDAgMDAwMDAwMDAgMDQxMWZmZmYgMDAwMDAwMDAgMTAwMGZmZmYgIC4qCi0gMDAxMCAwMDAwMDAwMCAxMDAwZmZmZiAwMDAwMDAwMCAwNDExMDAzZiAgLioKLSAwMDIwIDAwMDAwMDAwIDA0MTEwMDAwIDAwMDAwMDAwIDEwMDAwMDQxICAuKgotIDAwMzAgMDAwMDAwMDAgMTAwMDAwMDAgMDAwMDAwMDAgM2MwMzAwMDAgIC4qCi0gMDA0MCBbMjZdNDYzMDAwYyAzYzAzMDAwMCBbMjZdNDYzMDExNCAyNDAzZmZkMCAgLioKLSAwMDUwIDAwMDAwMDAwIDAwMDAwMTAwIDAwMDAwMDA0IDAwMDAwMDI4ICAuKgotIDAwNjAgMDAwMDAxMmMgZmZmZmZmZDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4qCi0gMDA3MCAwMDAwMDAwMCAwMDAwMDEwMCAwMDAwMDAwMCAwMDAwMDAwNCAgLioKLSAwMDgwIDAwMDAwMDAwIDAwMDAwMDRjIDAwMDAwMDAwIDAwMDAwMTU0ICAuKgotIDAwOTAgZmZmZmZmZmYgZmZmZmZmZDAgMTAwMDAwMzIgMTAwMDAwMzMgIC4qCi0gMDBhMCAzYzAzMDAwMCBbMjZdNDYzMDBkOCAzYzAzMDAwMCBbMjZdNDYzMDBlOCAgLioKLSAwMGIwIDAwMDAwMGNjIDAwMDAwMDM0IDAwMDAwMDAwIDAwMDAwMGNjICAuKgotIDAwYzAgMDAwMDAwMDAgMDAwMDAwMzQgMDAwMDAwMDAgMTAwMDAwMzIgIC4qCi0gMDBkMCAxMDAwMDAzMyAzYzAzMDAwMCBbMjZdNDYzMDEwYyAzYzAzMDAwMCAgLioKLSAwMGUwIFsyNl00NjMwMTFjIDAwMDAwMGNjIDAwMDAwMDM0IDAwMDAwMDAwICAuKgotIDAwZjAgMDAwMDAwMDAgMDAwMDAwY2MgMDAwMDAwMDAgMDAwMDAwMzQgIC4qCi1Db250ZW50cyBvZiBzZWN0aW9uIFwuZGF0YToKLUNvbnRlbnRzIG9mIHNlY3Rpb24gXC5yZWdpbmZvOgotIDAwMDAgODAwMDAwMDggMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4qCi0gMDAxMCAwMDAwMDAwMCAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgLioKLUNvbnRlbnRzIG9mIHNlY3Rpb24gXC5tZGVidWc6Ci0jLi4uCi1Db250ZW50cyBvZiBzZWN0aW9uIFwuZm9vOgotIDAwMDAgMDAwMDAwMDAgM2MwMzAwMDAgWzI2XTQ2MzAwMDQgM2MwMzAwMDAgIC4qCi0gMDAxMCBbMjZdNDYzMDEwYyAzYzAzMDAwMCBbMjZdNDYzMDAxOCAzYzAzMDAwMCAgLioKLSAwMDIwIFsyNl00NjMwMDFjIDNjMDMwMDAwIFsyNl00NjMwMDI0IDNjMDMwMDAwICAuKgotIDAwMzAgWzI2XTQ2MzAxMmMgM2MwMzAwMDAgWzI2XTQ2MzAwMzggMDAwMDAwMDAgIC4qCi0gMDA0MCAwMDAwMDEwMCAwMDAwMDAwNCAwMDAwMDA0NCAwMDAwMDBmYyAgLioKLSAwMDUwIDAwMDAwMDUwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuKgotIDAwNjAgMDAwMDAwMDAgMDAwMDAxMDAgMDAwMDAwMDAgMDAwMDAwMDQgIC4qCi0gMDA3MCAwMDAwMDAwMCAwMDAwMDA2YyAwMDAwMDAwMCAwMDAwMDBmYyAgLioKLSAwMDgwIDAwMDAwMDAwIDAwMDAwMDgwIDNjMDMwMDAwIFsyNl00NjMwMDhjICAuKgotIDAwOTAgM2MwMzAwMDAgWzI2XTQ2MzAxOTQgM2MwMzAwMDAgWzI2XTQ2MzAwYTAgIC4qCi0gMDBhMCAzYzAzMDAwMCBbMjZdNDYzMDBhNCAzYzAzMDAwMCBbMjZdNDYzMDFhYyAgLioKLSAwMGIwIDNjMDMwMDAwIFsyNl00NjMwMGI4IDAwMDAwMDA0IDAwMDAwMTA0ICAuKgotIDAwYzAgMDAwMDAwMDggMDAwMDAwYzQgMDAwMDAxMDAgMDAwMDAwZDAgIC4qCi0gMDBkMCAwMDAwMDAwMCAwMDAwMDAwNCAwMDAwMDAwMCAwMDAwMDEwNCAgLioKLSAwMGUwIDAwMDAwMDAwIDAwMDAwMDA4IDAwMDAwMDAwIDAwMDAwMGU4ICAuKgotIDAwZjAgMDAwMDAwMDAgMDAwMDAxMDAgMDAwMDAwMDAgMDAwMDAwZmMgIC4qCi0gMDEwMCAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZW1waWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZW1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0ODViMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VtcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotIyBDaGVjayBHTlUtc3BlY2lmaWMgZW1iZWRkZWQgcmVsb2NzLCBmb3IgRUxGLgotCi0JLnRleHQKLQkuc2V0IG5vcmVvcmRlcgotCW5vcAotbDI6CWphbAlnMQkJIyBSX01JUFNfR05VX1JFTDE2X1MyCWcxICAgLTEKLQlub3AKLQliCWcyCQkjIFJfTUlQU19HTlVfUkVMMTZfUzIJZzIgICAtMQotCW5vcAotCWIJZzIJCSMgUl9NSVBTX0dOVV9SRUwxNl9TMglnMiAgIC0xCi0Jbm9wCi0JamFsCWwxCQkjIFJfTUlQU19HTlVfUkVMMTZfUzIJLmZvbyAzRgotCW5vcAotCWphbAlsMgkJIyBSX01JUFNfR05VX1JFTDE2X1MyCS50ZXh0IDAgIG9yIC05Ci0Jbm9wCi0JYglsMSs4CQkjIFJfTUlQU19HTlVfUkVMMTZfUzIJLmZvbyA0MQotCW5vcAotbDM6Ci0JYglsMgkJIyBSX01JUFNfR05VX1JFTDE2X1MyCS50ZXh0IDAgIG9yIC1ECi0Jbm9wCi0JbGEJJDMsZzEtbDMJIyBSX01JUFNfR05VX1JFTF9ISTE2ICAgZzEgICAwCi0JCQkJIyBSX01JUFNfR05VX1JFTF9MTzE2ICAgZzEgICBDCi0JbGEJJDMsbDEtbDMJIyBSX01JUFNfR05VX1JFTF9ISTE2ICAgLmZvbyAwCi0JCQkJIyBSX01JUFNfR05VX1JFTF9MTzE2ICAgLmZvbyAxMTQKLQlsYQkkMyxsMi1sMwkjIC0zMAotCS53b3JkCWcxCQkjIFJfTUlQU18zMglnMSAgICAwCi0JLndvcmQJbDEJCSMgUl9NSVBTXzMyCS5mb28gIDEwMAotCS53b3JkCWwyCQkjIFJfTUlQU18zMgkudGV4dCA0Ci0JLndvcmQJZzEtbDMJCSMgUl9NSVBTX1BDMzIJZzEgICAgMjgKLQkud29yZAlsMS1sMwkJIyBSX01JUFNfUEMzMgkuZm9vICAxMkMKLQkud29yZAlsMi1sMwkJIyAtMzAKLQkuYWxpZ24gMwotCS5kd29yZAlnMQkJIyBSX01JUFNfNjQJZzEgICAgMAotCS5kd29yZAlsMQkJIyBSX01JUFNfNjQJLmZvbyAgMTAwCi0JLmR3b3JkCWwyCQkjIFJfTUlQU182NAkudGV4dCA0Ci0JLmR3b3JkCWcxLWwzCQkjIFJfTUlQU19QQzY0CWcxICAgIDRDCi0JLmR3b3JkCWwxLWwzCQkjIFJfTUlQU19QQzY0CS5mb28gIDE1NAotCS5kd29yZAlsMi1sMwkJIyAtMzAKLWw1OgotCWIJMmYJCSMgUl9NSVBTX0dOVV9SRUwxNl9TMgkudGV4dCAzMgotCWIJMmYrNAkJIyBSX01JUFNfR05VX1JFTDE2X1MyCS50ZXh0IDMzCi0JbGEJJDMsMmYtbDUJIyBSX01JUFNfR05VX1JFTF9ISTE2CS50ZXh0IDAKLQkJCQkjIFJfTUlQU19HTlVfUkVMX0hJMTYJLnRleHQgRDgKLQlsYQkkMywyZis4LWw1CSMgUl9NSVBTX0dOVV9SRUxfSEkxNgkudGV4dCAwCi0JCQkJIyBSX01JUFNfR05VX1JFTF9ISTE2CS50ZXh0IEU4Ci0KLQkud29yZAkyZgkJIyBSX01JUFNfMzIJLnRleHQgQ0MKLQkud29yZAkyZi1sNQkJIyBSX01JUFNfUEMzMgkudGV4dCBFQyAgb3IgMzQKLQkuZHdvcmQJMmYJCSMgUl9NSVBTXzY0CS50ZXh0IENDCi0JLmR3b3JkCTJmLWw1CQkjIFJfTUlQU19QQzY0CS50ZXh0IEY4ICBvciAzNAotCW5vcAotMjoJCQkJIyBhdCBhZGRyZXNzIDB4Q0MuCi0JYgkyYgkJIyBSX01JUFNfR05VX1JFTDE2X1MyCS50ZXh0IDMyCi0JYgkyYis0CQkjIFJfTUlQU19HTlVfUkVMMTZfUzIJLnRleHQgMzMKLQlsYQkkMywyYi1sNQkjIFJfTUlQU19HTlVfUkVMX0hJMTYJLnRleHQgMAotCQkJCSMgUl9NSVBTX0dOVV9SRUxfSEkxNgkudGV4dCAxMEMKLQlsYQkkMywyYis4LWw1CSMgUl9NSVBTX0dOVV9SRUxfSEkxNgkudGV4dCAwCi0JCQkJIyBSX01JUFNfR05VX1JFTF9ISTE2CS50ZXh0IDExQwotCS53b3JkCTJiCQkjIFJfTUlQU18zMgkudGV4dCBDQwotCS53b3JkCTJiLWw1CQkjIFJfTUlQU19QQzMyCS50ZXh0IDExQyAgb3IgMzQKLQlub3AKLQkuZHdvcmQJMmIJCSMgUl9NSVBTXzY0CS50ZXh0IENDCi0JLmR3b3JkCTJiLWw1CQkjIFJfTUlQU19QQzY0CS50ZXh0IDk4ICBvciAzNAotCQotCS5zZWN0aW9uICIuZm9vIiwiYXgiLEBwcm9nYml0cwotCW5vcAotbDQ6CQotCWxhCSQzLGcxLWw0Ci0JbGEJJDMsbDEtbDQKLQlsYQkkMyxsMi1sNAotCWxhCSQzLGcxLWw0Ci0KLQlkbGEJJDMsZzEtbDQKLQlkbGEJJDMsbDEtbDQKLQlkbGEJJDMsbDItbDQKLQotCS53b3JkCWcxCi0JLndvcmQJbDEKLQkud29yZAlsMgotCS53b3JkCWcxLWw0Ci0JLndvcmQJbDEtbDQKLQkud29yZAlsMi1sNAotCS5kd29yZAlnMQotCS5kd29yZAlsMQotCS5kd29yZAlsMgotCS5kd29yZAlnMS1sNAotCS5kd29yZAlsMS1sNAotCS5kd29yZAlsMi1sNAotCi0JbGEJJDMsZzEtbDQrNAotCWxhCSQzLGwxLWw0KzQKLQlsYQkkMyxsMi1sNCs0Ci0KLQlkbGEJJDMsZzEtbDQrNAotCWRsYQkkMyxsMS1sNCs0Ci0JZGxhCSQzLGwyLWw0KzQKLQotCS53b3JkCWcxKzQKLQkud29yZAlsMSs0Ci0JLndvcmQJbDIrNAotCS53b3JkCWcxLWw0KzQKLQkud29yZAlsMS1sNCs0Ci0JLndvcmQJbDItbDQrNAotCS5kd29yZAlnMSs0Ci0JLmR3b3JkCWwxKzQKLQkuZHdvcmQJbDIrNAotCS5kd29yZAlnMS1sNCs0Ci0JLmR3b3JkCWwxLWw0KzQKLQkuZHdvcmQJbDItbDQrNAotbDE6Ci0KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmOGE3OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0KLSAgICA7IFRlc3QgY2FzZSBmb3IgYXNzZW1ibGVyIG9wdGlvbiAiaXRibCIuCi0gICAgOyBSdW4gYXMgImFzIC0taXRibCBpdGJsIGl0YmwucyIKLSAgICA7IG9yIHdpdGggc3RhbmQtYWxvbmUgdGVzdCBjYXNlICJpdGJsLXRlc3QgaXRibCBpdGJsLnMiLgotICAgIDsgSGVyZSwgdGhlIHByb2Nlc3NvcnMgcmVwcmVzZW50IG1pcHMgY29wcm9jZXNzb3JzLgotCi0gICAgcDEgZHJlZyBkMSAxICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQxIiBmb3IgQ09QMSBoYXMgdmFsdWUgMQotICAgIHAxIGNyZWcgYzMgMyAgICAgICAgOyBjdHJsIHJlZ2lzdGVyICJjMyIgZm9yIENPUDEgaGFzIHZhbHVlIDMKLSAgICBwMyBpbnNuIGZpZSAweDFlOjI0LTIwICAgICAgOyBmdW5jdGlvbiAiZmlsbCIgZm9yIENPUDMgaGFzIHZhbHVlIDMxCi0gICAgcDMgZHJlZyBkMyAzICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotICAgIHAzIGNyZWcgYzIgMjIgICAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0gICAgcDMgaW5zbiBmZWUgMHgxZToyNC0yMCxkcmVnOjE3LTEzLGNyZWc6MTItOCxpbW1lZDo3LTAKLQotICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLSAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotICAgIHAzIGluc24gZnVtIDB4MDFlMDAwMDEgZHJlZzoxNy0xMyBjcmVnOjEyLTgKLSAgICBwMyBpbnNuIGZvaCAweGY6MjQtMjEgZHJlZzoyMC0xNiBpbW1lZDoxNS0wCi0KLSAgICBwMyBpbnNuIHBpZyAweDE6MjQtMjEqWzB4MTAwfDB4Ml0sIGRyZWc6MjAtMTYsIGltbWVkOjE1LTAqMHgxMDAwMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1NTQ1Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0KLSAgICA7IENhbGwgbWlwcyBjb3Byb2Nlc3NvciAiY29mdW4icyBhcyBkZWZpbmVkIGluICJpdGJsIi4KLQotICAgIGZlZSAkZDMsJGMyLDB4MSAJOyAgMHg0ZmYwNzYwMQotICAgIGZpZSAJICAJOyAgMHg0ZmYwMDAwMAotICAgIGZvaCAkMiwweDEwMAotICAgIGZ1bSAkZDMsJGMyICAgICAJOyAgMHg0ZmYwNzYwMQotICAgIHBpZyAkMiwweDEwMAotCi0gICAgOyBDYWxsIGEgbWlwcyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiB3aXRoIHJlZ2lzdGVyICJkMSIgCi0gICAgOyBkZWZpbmVkIGluICJpdGJsIi4KLQotICAgIExXQzEgJGQxLDB4MTAwKCQyKQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2Y2NmYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGphbC1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMKLSNzb3VyY2U6IGphbC5zCi0KLSMgVGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGphbHIJXCR0OQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBqYWxyCVwkYTAsXCR0OQotMCswMDBjIDxbXj5dKj4gbm9wCi0wKzAwMTAgPFtePl0qPiBiYWwJMCswMDAwIDx0ZXh0X2xhYmVsPgotWyAJXSoxMDogUENSRUwxNgkudGV4dAotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBiYWwJMCswMDE4IDx0ZXh0X2xhYmVsXCsoMHh8KTE4PgotWyAJXSoxODogUENSRUwxNglleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwMWMgPFtePl0qPiBub3AKLTArMDAyMCA8W14+XSo+IGIJMCswMDAwIDx0ZXh0X2xhYmVsPgotWyAJXSoyMDogUENSRUwxNgkudGV4dAotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBiCTArMDAyOCA8dGV4dF9sYWJlbFwrKDB4fCkyOD4KLVsgCV0qMjg6IFBDUkVMMTYJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDJjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNWJlNzYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIFIzMDAwIGphbC1zdnI0cGljCi0jYXM6IC1taXBzMSAtS1BJQyAtbWNwdT1yMzAwMAotCi0jIFRlc3QgdGhlIGphbCBtYWNybyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdWkJXCRncCwweDAKLVsgCV0qMDogUl9NSVBTX0hJMTYJX2dwX2Rpc3AKLTArMDAwNCA8W14+XSo+IGFkZGl1CVwkZ3AsXCRncCwwCi1bIAldKjQ6IFJfTUlQU19MTzE2CV9ncF9kaXNwCi0wKzAwMDggPFtePl0qPiBhZGR1CVwkZ3AsXCRncCxcJHQ5Ci0wKzAwMGMgPFtePl0qPiBzdwlcJGdwLDBcKFwkc3BcKQotMCswMDEwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMWMgPFtePl0qPiBqYWxyCVwkYTAsXCR0OQotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDI4IDxbXj5dKj4gbm9wCi0wKzAwMmMgPFtePl0qPiBsdwlcJHQ5LDBcKFwkZ3BcKQotWyAJXSoyYzogUl9NSVBTX0dPVDE2CS50ZXh0Ci0wKzAwMzAgPFtePl0qPiBub3AKLTArMDAzNCA8W14+XSo+IGFkZGl1CVwkdDksXCR0OSwwCi1bIAldKjM0OiBSX01JUFNfTE8xNgkudGV4dAotMCswMDM4IDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwNDQgPFtePl0qPiBub3AKLTArMDA0OCA8W14+XSo+IGx3CVwkdDksMFwoXCRncFwpCi1bIAldKjQ4OiBSX01JUFNfQ0FMTDE2CWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwNTQgPFtePl0qPiBub3AKLTArMDA1OCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwNWMgPFtePl0qPiBiCTArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4OWRmYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLUtQSUMgY29kZS4KLQkKLXRleHRfbGFiZWw6CQotCS5zZXQJbm9yZW9yZGVyCi0JLmNwbG9hZAkkMjUKLQkuc2V0CXJlb3JkZXIKLQkuY3ByZXN0b3JlCTAKLQlqYWwJJDI1Ci0JamFsCSQ0LCQyNQotCWphbAl0ZXh0X2xhYmVsCi0JamFsCWV4dGVybmFsX3RleHRfbGFiZWwKLQkKLSMgVGVzdCBqIGFzIHdlbGwJCi0Jagl0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmRjYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIFIzMDAwIGphbC14Z290Ci0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtbWNwdT1yMzAwMAotI3NvdXJjZTogamFsLXN2cjRwaWMucwotCi0jIFRlc3QgdGhlIGphbCBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdWkJXCRncCwweDAKLVsgCV0qMDogUl9NSVBTX0hJMTYJX2dwX2Rpc3AKLTArMDAwNCA8W14+XSo+IGFkZGl1CVwkZ3AsXCRncCwwCi1bIAldKjQ6IFJfTUlQU19MTzE2CV9ncF9kaXNwCi0wKzAwMDggPFtePl0qPiBhZGR1CVwkZ3AsXCRncCxcJHQ5Ci0wKzAwMGMgPFtePl0qPiBzdwlcJGdwLDBcKFwkc3BcKQotMCswMDEwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMWMgPFtePl0qPiBqYWxyCVwkYTAsXCR0OQotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDI4IDxbXj5dKj4gbm9wCi0wKzAwMmMgPFtePl0qPiBsdwlcJHQ5LDBcKFwkZ3BcKQotWyAJXSoyYzogUl9NSVBTX0dPVDE2CS50ZXh0Ci0wKzAwMzAgPFtePl0qPiBub3AKLTArMDAzNCA8W14+XSo+IGFkZGl1CVwkdDksXCR0OSwwCi1bIAldKjM0OiBSX01JUFNfTE8xNgkudGV4dAotMCswMDM4IDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwNDQgPFtePl0qPiBsdWkJXCR0OSwweDAKLVsgCV0qNDQ6IFJfTUlQU19DQUxMX0hJMTYJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDQ4IDxbXj5dKj4gYWRkdQlcJHQ5LFwkdDksXCRncAotMCswMDRjIDxbXj5dKj4gbHcJXCR0OSwwXChcJHQ5XCkKLVsgCV0qNGM6IFJfTUlQU19DQUxMX0xPMTYJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBqYWxyCVwkdDkKLTArMDA1OCA8W14+XSo+IG5vcAotMCswMDVjIDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDA2MCA8W14+XSo+IGIJMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjU4NmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBqYWwKLQotIyBUZXN0IHRoZSBqYWwgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGphbHIJXCR0OQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBqYWxyCVwkYTAsXCR0OQotMCswMDBjIDxbXj5dKj4gbm9wCi0wKzAwMTAgPFtePl0qPiBqYWwJMCsgPHRleHRfbGFiZWw+Ci1bIAldKjEwOiAoTUlQU19KTVB8TUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGphbAkwKyA8dGV4dF9sYWJlbD4KLVsgCV0qMTg6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDFjIDxbXj5dKj4gbm9wCi0wKzAwMjAgPFtePl0qPiBqCTArIDx0ZXh0X2xhYmVsPgotWyAJXSoyMDogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQkudGV4dAotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBqCTArIDx0ZXh0X2xhYmVsPgotWyAJXSoyODogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQlleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwMmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzliZTk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgamFsIG1hY3JvLgotCS5nbG9ibAl0ZXh0X2xhYmVsCS50ZXh0Ci10ZXh0X2xhYmVsOgkKLQlqYWwJJDI1Ci0JamFsCSQ0LCQyNQotCWphbAl0ZXh0X2xhYmVsCi0JamFsCWV4dGVybmFsX3RleHRfbGFiZWwKLQkKLSMgVGVzdCBqIGFzIHdlbGwJCi0Jagl0ZXh0X2xhYmVsCi0JaglleHRlcm5hbF90ZXh0X2xhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjk1NzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYS1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMKLQotIyBUZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMTAgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDAxYyA8W14+XSo+IGxpCVwkYTAsMAotMCswMDIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDI0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMmMgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4NAotWyAJXSo1MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDU0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA1OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA2MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4NAotWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNjggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE1Mzg0Ci1bIAldKjY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA2YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODMKLVsgCV0qNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA3MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSo3NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSo3ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwN2MgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSo3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODMKLVsgCV0qODA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDg0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNTM4MwotWyAJXSo4NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0Ci1bIAldKjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwOGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwOTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDk4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGE4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0Ci1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTUzODQKLVsgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MwotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMGM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGM4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBkMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBkOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKmQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBlMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKmUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MwotWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwZjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE1MzgzCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBmOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmODogUkVMSEkJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMGZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDI1MgotWyAJXSpmYzogUkVMTE8JZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMTAwIDxbXj5dKj4gbGkJXCRhMCwyNDgKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkZjVlMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGEgbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYwotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLXRleHRfbGFiZWw6CQotCWxhCSQ0LDAKLQlsYQkkNCwxCi0JbGEJJDQsMHg4MDAwCi0JbGEJJDQsLTB4ODAwMAotCWxhCSQ0LDB4MTAwMDAKLQlsYQkkNCwweDFhNWE1Ci0JbGEJJDQsMCgkNSkKLQlsYQkkNCwxKCQ1KQotCWxhCSQ0LDB4ODAwMCgkNSkKLQlsYQkkNCwtMHg4MDAwKCQ1KQotCWxhCSQ0LDB4MTAwMDAoJDUpCi0JbGEJJDQsMHgxYTVhNSgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsYQkkNCxkYXRhX2xhYmVsKzEKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxhCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQotc2Vjb25kX3RleHRfbGFiZWw6CQotCWxhCSQ0LGV4dGVybmFsX3RleHRfbGFiZWwgLSB0ZXh0X2xhYmVsCi0JbGEJJDQsc2Vjb25kX3RleHRfbGFiZWwgLSB0ZXh0X2xhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDkzM2U3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYS1zdnI0cGljCi0jYXM6IC1taXBzMSAtS1BJQyAtLWRlZnN5bSBLUElDPTEKLSNzb3VyY2U6IGxhLnMKLQotIyBUZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTEsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzE3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIyMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGFlZjAyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYS14Z290Ci0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtLWRlZnN5bSBLUElDPTEKLSNzb3VyY2U6IGxhLnMKLQotIyBUZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTEsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzE3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMTc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIyMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ODMxNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5kCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYQotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSBsYSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwwCi1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTEsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGExLDEKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTEsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OGM4MTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsYSBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JbGEJJDQsMAotCWxhCSQ0LDEKLQlsYQkkNCwweDgwMDAKLQlsYQkkNCwtMHg4MDAwCi0JbGEJJDQsMHgxMDAwMAotCWxhCSQ0LDB4MWE1YTUKLQlsYQkkNCwwKCQ1KQotCWxhCSQ0LDEoJDUpCi0JbGEJJDQsMHg4MDAwKCQ1KQotCWxhCSQ0LC0weDgwMDAoJDUpCi0JbGEJJDQsMHgxMDAwMCgkNSkKLQlsYQkkNCwweDFhNWE1KCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxhCSQ0LGRhdGFfbGFiZWwrMQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGEJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxhCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCWxhCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGEJJDQsZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQotCS5pZm5kZWYJS1BJQwotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQkuZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNGEzMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYwotI3NvdXJjZTogbGItcGljLnMKLQotIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwNTggPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo1ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDVjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDY0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjggPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA2YyA8W14+XSo+IGxiCVwkYTAsLTE1Mzg0XChcJGdwXCkKLVsgCV0qNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDcwIDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDc0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qNzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3YyA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjgwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSo4NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODggPFtePl0qPiBsYglcJGEwLC0xNTM4M1woXCRncFwpCi1bIAldKjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDA5MCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGEwXCkKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDA5OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBiOCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGEwXCkKLVsgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGMwIDxbXj5dKj4gbGIJXCRhMCwtMTUzODRcKFwkYTBcKQotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYzggPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRhMFwpCi1bIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSpkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGQ4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGUwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGU4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRhMFwpCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBmOCA8W14+XSo+IGxiCVwkYTAsLTE1MzgzXChcJGEwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGZjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjZmRmOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxiIG1hY3JvIHdpdGggUElDIGNvZGUuCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxiCSQ0LDAKLQlsYgkkNCwxCi0JbGIJJDQsMHg4MDAwCi0JbGIJJDQsLTB4ODAwMAotCWxiCSQ0LDB4MTAwMDAKLQlsYgkkNCwweDFhNWE1Ci0JbGIJJDQsMCgkNSkKLQlsYgkkNCwxKCQ1KQotCWxiCSQ0LDB4ODAwMCgkNSkKLQlsYgkkNCwtMHg4MDAwKCQ1KQotCWxiCSQ0LDB4MTAwMDAoJDUpCi0JbGIJJDQsMHgxYTVhNSgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsYgkkNCxkYXRhX2xhYmVsKzEKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxiCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsYgkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODg0ZDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLXN2cjRwaWMKLSNhczogLW1pcHMxIC1LUElDCi0jc291cmNlOiBsYi1waWMucwotCi0jIFRlc3QgdGhlIGxiIG1hY3JvIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjU0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA1OCA8W14+XSo+IG5vcAotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwNjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbm9wCi0wKzAwNmMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDcwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNzA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBub3AKLTArMDA3OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo3YzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjg4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOGMgPFtePl0qPiBub3AKLTArMDA5MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5NDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qOWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSphNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBhOCA8W14+XSo+IG5vcAotMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qYWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBiMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwYjggPFtePl0qPiBub3AKLTArMDBiYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKmJjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGMwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBjNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmM0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IG5vcAotMCswMGNjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmQwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ0IDxbXj5dKj4gbm9wCi0wKzAwZDggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZGM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTAgPFtePl0qPiBub3AKLTArMDBlNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSplODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGVjIDxbXj5dKj4gbm9wCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZjQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwZjggPFtePl0qPiBub3AKLTArMDBmYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKmZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTA0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTA0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTA4IDxbXj5dKj4gbm9wCi0wKzAxMGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoxMGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDExMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTE4IDxbXj5dKj4gbm9wCi0wKzAxMWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxMWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTI4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IG5vcAotMCswMTMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTM0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEzODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IG5vcAotMCswMTQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTQ0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE0ODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IG5vcAotMCswMTUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTU0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE1ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gbm9wCi0wKzAxNjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTY4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTZjIDxbXj5dKj4gbm9wCi0wKzAxNzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxNzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE3OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxN2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxODAgPFtePl0qPiBub3AKLTArMDE4NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjE4NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTg4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMThjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE5MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxOTQgPFtePl0qPiBub3AKLTArMDE5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE5ODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDE5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYTQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE4IDxbXj5dKj4gbm9wCi0wKzAxYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWI0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWI4IDxbXj5dKj4gbm9wCi0wKzAxYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYzAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWM0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWM4IDxbXj5dKj4gbm9wCi0wKzAxY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWQ0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDggPFtePl0qPiBub3AKLTArMDFkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZTQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxZTggPFtePl0qPiBub3AKLTArMDFlYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjFlYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMWYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWY0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFmODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFmYyA8W14+XSo+IG5vcAotMCswMjAwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMjAwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyMDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMDggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjBjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGJkMjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LWlsb2Nrcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYi14Z290LWlsb2NrcwotI2FzOiAtbWlwczEgLUtQSUMgLXhnb3QgLW1jcHU9cjM5MDAKLSNzb3VyY2U6IGxiLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGIgbWFjcm8gd2l0aCAtS1BJQyAteGdvdC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8Lio+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8Lio+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8Lio+IGx1aQlcJGEwLDB4MQotMCswMDBjIDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPC4qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPC4qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8Lio+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8Lio+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPC4qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDwuKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPC4qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPC4qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8Lio+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQk1NDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMDU4IDwuKj4gbm9wCi0wKzAwNWMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJNWM6IFJfTUlQU19MTzE2CVwuZGF0YQotMCswMDYwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA2NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJNjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDZjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3MCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNzQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTc0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDdjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTdjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDgwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA4NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJODQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwOGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJOGM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDk0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQk5NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDk4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDljIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTljOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGE0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCWE0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDBhOCA8Lio+IG5vcAotMCswMGFjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCWFjOiBSX01JUFNfTE8xNglcLmJzcwotMCswMGIwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBiNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQliNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAwYjggPC4qPiBub3AKLTArMDBiYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQliYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDBjMCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYzQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJYzQ6IFJfTUlQU19HT1QxNglcLmRhdGEKLTArMDBjOCA8Lio+IG5vcAotMCswMGNjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCWNjOiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDBkMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZDQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCWQ0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBkYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQlkYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGU0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQllNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBlYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQllYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZjQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCWY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGZjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCWZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEwNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTA0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxMGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTBjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMTAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTE0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTExNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxMTggPC4qPiBub3AKLTArMDExYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxMWM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxMjAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTEyNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxMjggPC4qPiBub3AKLTArMDEyYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQkxMmM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxMzAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTM0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTEzNDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMTM4IDwuKj4gbm9wCi0wKzAxM2MgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJMTNjOiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDE0MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE0NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNDggPC4qPiBsdWkJXCRhMCwweDAKLQkJCTE0ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNGMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNTAgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTUwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE1NCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE1OCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNWMgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTE1YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE2NCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxNjQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNmMgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTcwIDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxNzA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNzggPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTc4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTgwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE4NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTg0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxODggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxOGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMThjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxOTQgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTk4IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTE5ODogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxOWMgPC4qPiBub3AKLTArMDFhMCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxYTA6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxYTQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYTggPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWFjIDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTFhYzogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxYjAgPC4qPiBub3AKLTArMDFiNCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQkxYjQ6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxYjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYmMgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWMwIDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTFjMDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMWM0IDwuKj4gbm9wCi0wKzAxYzggPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJMWM4OiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDFjYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZDQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTFkNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxZGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMWRjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlNCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZTggPC4qPiBsdWkJXCRhMCwweDAKLQkJCTFlODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFmMCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxZjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZjQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZjggPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWZjIDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxZmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyMDQgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMjA0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjA4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjBjIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDIxMCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMjEwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMTQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyMTggPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMjE4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMWMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMjAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTIyNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAyMjggPC4qPiBub3AKLTArMDIyYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkyMmM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAyMzAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMzQgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjM4IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTIzODogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAyM2MgPC4qPiBub3AKLTArMDI0MCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQkyNDA6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAyNDQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNDggPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjRjIDwuKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMThjNjdlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYi14Z290Ci0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtbWNwdT1yMzAwMAotI3NvdXJjZTogbGItcGljLnMKLQotIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1NDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwNTggPFtePl0qPiBub3AKLTArMDA1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjVjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDYwIDxbXj5dKj4gbm9wCi0wKzAwNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA3MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjcwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IG5vcAotMCswMDc4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA3YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo3YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA4NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjg0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDg4IDxbXj5dKj4gbm9wCi0wKzAwOGMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDkwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjkwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qOTg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOWMgPFtePl0qPiBub3AKLTArMDBhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qYTQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBhYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKmFjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBub3AKLTArMDBiNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBiYyA8W14+XSo+IG5vcAotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qYzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmNjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMGQwIDxbXj5dKj4gbm9wCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSpkNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMGQ4IDxbXj5dKj4gbm9wCi0wKzAwZGMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZTA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGU0IDxbXj5dKj4gbm9wCi0wKzAwZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSplODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBlYyA8W14+XSo+IG5vcAotMCswMGYwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBmNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpmYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMDAgPFtePl0qPiBub3AKLTArMDEwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMDggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTA4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTEwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTE0IDxbXj5dKj4gbm9wCi0wKzAxMTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTFjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjExYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDEyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjEyNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEyOCA8W14+XSo+IG5vcAotMCswMTJjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEzMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMzA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjEzODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbm9wCi0wKzAxNDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTQ0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTQ4IDxbXj5dKj4gbm9wCi0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxNGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE1MCA8W14+XSo+IG5vcAotMCswMTU0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE1ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE1YyA8W14+XSo+IG5vcAotMCswMTYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMTYwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNjQgPFtePl0qPiBub3AKLTArMDE2OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNmM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTcwIDxbXj5dKj4gbm9wCi0wKzAxNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxNzQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxNzggPFtePl0qPiBub3AKLTArMDE3YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE4MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxODQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTg0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE4YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjE4YzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTAgPFtePl0qPiBub3AKLTArMDE5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE5OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxOWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTljOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWE0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE4IDxbXj5dKj4gbm9wCi0wKzAxYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWI0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFiNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFiYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IG5vcAotMCswMWM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWM4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFjYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxY2M6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFkNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFkNDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQ4IDxbXj5dKj4gbm9wCi0wKzAxZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWU0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWU4IDxbXj5dKj4gbm9wCi0wKzAxZWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxZWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmMCA8W14+XSo+IG5vcAotMCswMWY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWY4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFmYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDIwMCA8W14+XSo+IG5vcAotMCswMjA0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMjA0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyMDggPFtePl0qPiBub3AKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIxMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyMTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMjE4IDxbXj5dKj4gbm9wCi0wKzAyMWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyMWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyMjAgPFtePl0qPiBub3AKLTArMDIyNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIyOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjJjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDIzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjIzNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzggPFtePl0qPiBub3AKLTArMDIzYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI0MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyNDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjQ0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjRjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjUwIDxbXj5dKj4gbm9wCi0wKzAyNTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI1YzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI2MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI2NDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI2OCA8W14+XSo+IG5vcAotMCswMjZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjcwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDI3NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI3OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI3YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjgwIDxbXj5dKj4gbm9wCi0wKzAyODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyODggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjhjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjhjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjkwIDxbXj5dKj4gbm9wCi0wKzAyOTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyOTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI5OCA8W14+XSo+IG5vcAotMCswMjljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmEwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJhNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJhOCA8W14+XSo+IG5vcAotMCswMmFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMmFjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyYjAgPFtePl0qPiBub3AKLTArMDJiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJiOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyYmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1YzRjNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIGxiIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSo1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDZjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDcwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwNzggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMDdjIDxbXj5dKj4gbGIJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSo3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg0IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSo4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4YyA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTAgPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDljIDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTQgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKmE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGIwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qYjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGI0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQ0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwZDggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDBlMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDBlNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSplNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSplODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGZjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTA4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTBjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDExMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjExMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDExYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjExYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjEyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTM4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE0OCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE1MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTU4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTc4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTgwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTg0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE4OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE5NCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDFiYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjFiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYzggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjFjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDFkMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkYyA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFlMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWYwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qMWYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFmNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWZjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwMCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDIwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKjIwNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIwOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMTAgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjIxMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIxNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDIxOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjI0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIyOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjMwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjNjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI0MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNDggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjU0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjYwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjY0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI2YyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNzAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI3OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyN2MgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyODQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjkwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjljIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmI0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmI4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmM0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJjYyA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmQ4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmU0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmY0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmZjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzA4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSozMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzE0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDMxOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzI0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMmMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM0NCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjM0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNDggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNTQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzNTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNWMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzNjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzY4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM2YyA8W14+XSo+IGxidQlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzAgPFtePl0qPiBsaAlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzQgPFtePl0qPiBsaHUJXCRhMCwwXChcJHplcm9cKQotMCswMzc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJHplcm9cKQotMCswMzdjIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM4MCA8W14+XSo+IGx3cglcJGEwLDBcKFwkemVyb1wpCi0wKzAzODQgPFtePl0qPiBsd2MwCVwkNCwwXChcJHplcm9cKQotMCswMzg4IDxbXj5dKj4gbHdjMQlcJGY0LDBcKFwkemVyb1wpCi0wKzAzOGMgPFtePl0qPiBsd2MyCVwkNCwwXChcJHplcm9cKQotMCswMzkwIDxbXj5dKj4gbHdjMwlcJDQsMFwoXCR6ZXJvXCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzY2NhZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxiIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsYgkkNCwwCi0JbGIJJDQsMQotCWxiCSQ0LDB4ODAwMAotCWxiCSQ0LC0weDgwMDAKLQlsYgkkNCwweDEwMDAwCi0JbGIJJDQsMHgxYTVhNQotCWxiCSQ0LDAoJDUpCi0JbGIJJDQsMSgkNSkKLQlsYgkkNCwweDgwMDAoJDUpCi0JbGIJJDQsLTB4ODAwMCgkNSkKLQlsYgkkNCwweDEwMDAwKCQ1KQotCWxiCSQ0LDB4MWE1YTUoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGIJJDQsZGF0YV9sYWJlbCsxCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsYgkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JbGIJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGIJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsYgkkNCxkYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIFNldmVyYWwgbWFjcm9zIGFyZSBoYW5kbGVkIGxpa2UgbGIuICBTYW5pdHkgY2hlY2sgdGhlbS4KLQlsYnUJJDQsMAotCWxoCSQ0LDAKLQlsaHUJJDQsMAotCWx3CSQ0LDAKLQlsd2wJJDQsMAotCWx3cgkkNCwwCi0JbHdjMAkkNCwwCi0JbHdjMQkkNCwwCi0JbHdjMgkkNCwwCi0JbHdjMwkkNCwwCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTYxZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsZC1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMgLS1kZWZzeW0gRU1QSUM9MQotI3NvdXJjZTogbGQtcGljLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwOTQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRncFwpCi1bIAldKjk0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBiYyA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGdwXCkKLVsgCV0qYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGMwIDxbXj5dKj4gbHcJXCRhMCwtMTUzODRcKFwkZ3BcKQotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzQgPFtePl0qPiBsdwlcJGExLC0xNTM4MFwoXCRncFwpCi1bIAldKmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjOCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDBjYyA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qY2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGRjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSplYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGY0IDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQotWyAJXSpmNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLC0xNTM4M1woXCRncFwpCi1bIAldKmY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsLTE1Mzc5XChcJGdwXCkKLVsgCV0qZmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTAwIDxbXj5dKj4gbm9wCi0wKzAxMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxMDggPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTBjIDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkYXRcKQotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDExMCA8W14+XSo+IG5vcAotMCswMTE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyMCA8W14+XSo+IG5vcAotMCswMTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjEyYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBub3AKLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjEzODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbm9wCi0wKzAxNDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBub3AKLTArMDE1NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE1YyA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGF0XCkKLVsgCV0qMTVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE2MCA8W14+XSo+IG5vcAotMCswMTY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTY4IDxbXj5dKj4gbHcJXCRhMCwtMTUzODRcKFwkYXRcKQotWyAJXSoxNjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTZjIDxbXj5dKj4gbHcJXCRhMSwtMTUzODBcKFwkYXRcKQotWyAJXSoxNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTcwIDxbXj5dKj4gbm9wCi0wKzAxNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDE4MCA8W14+XSo+IG5vcAotMCswMTg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5MCA8W14+XSo+IG5vcAotMCswMTk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTk4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBub3AKLTArMDFhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gbm9wCi0wKzAxYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxYjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBub3AKLTArMDFjNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFjOCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKLVsgCV0qMWM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFjYyA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFkMCA8W14+XSo+IG5vcAotMCswMWQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwtMTUzODNcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSwtMTUzNzlcKFwkYXRcKQotWyAJXSoxZGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MtYWRkcjMyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0NmQ2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZAorKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLSNuYW1lOiBNSVBTIGxkLWlsb2NrcwotI3NvdXJjZTogbGQucwotCi0jIFRlc3QgdGhlIGxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPC50ZXh0PiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwODQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSphODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjNCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwYyA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qMTEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTYwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTljIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjIwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1NCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJhNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYzAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjJjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCi1bIAldKjJjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMjQgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjMyNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMjggPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCi1bIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMzNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM0NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM2NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzOGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDM5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM5NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2EwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2E0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2E4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2FjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2IwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2I0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2I4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2JjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNjNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2M0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2QwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Q0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2Q4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2RjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNlNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2U0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2U4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2VjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2YwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Y0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDAwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDA0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSo0MDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDA4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDBjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDQ4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDc4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ3YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDg4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDhjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDk0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0OTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRhNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0YWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGI0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGI4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRjNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0Y2MgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNGQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0ZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNGUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGU0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGU4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGVjIDxbXj5dKj4gbHdjMQlcJGY1LDBcKFwkemVyb1wpCi0wKzA0ZjAgPFtePl0qPiBsd2MxCVwkZjQsNFwoXCR6ZXJvXCkKLTArMDRmNCA8W14+XSo+IGx3YzEJXCRmNSwxXChcJHplcm9cKQotMCswNGY4IDxbXj5dKj4gbHdjMQlcJGY0LDVcKFwkemVyb1wpCi0wKzA0ZmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDUwMCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQotMCswNTA0IDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCRhdFwpCi0wKzA1MDggPFtePl0qPiBsd2MxCVwkZjUsLTMyNzY4XChcJHplcm9cKQotMCswNTBjIDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCR6ZXJvXCkKLTArMDUxMCA8W14+XSo+IGx3YzEJXCRmNSwwXChcJGExXCkKLTArMDUxNCA8W14+XSo+IGx3YzEJXCRmNCw0XChcJGExXCkKLTArMDUxOCA8W14+XSo+IGx3YzEJXCRmNSwxXChcJGExXCkKLTArMDUxYyA8W14+XSo+IGx3YzEJXCRmNCw1XChcJGExXCkKLTArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTI4IDxbXj5dKj4gbHdjMQlcJGY1LC0zMjc2OFwoXCRhdFwpCi0wKzA1MmMgPFtePl0qPiBsd2MxCVwkZjQsLTMyNzY0XChcJGF0XCkKLTArMDUzMCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkYTFcKQotMCswNTM0IDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCRhMVwpCi0wKzA1MzggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTQwIDxbXj5dKj4gbHdjMQlcJGY1LC0yMzEzMVwoXCRhdFwpCi1bIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0NCA8W14+XSo+IGx3YzEJXCRmNCwtMjMxMjdcKFwkYXRcKQotWyAJXSo1NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDggPFtePl0qPiBub3AKLTArMDU0YyA8W14+XSo+IHN3YzEJXCRmNSwwXChcJHplcm9cKQotMCswNTUwIDxbXj5dKj4gc3djMQlcJGY0LDRcKFwkemVyb1wpCi0wKzA1NTQgPFtePl0qPiBzd2MxCVwkZjUsMVwoXCR6ZXJvXCkKLTArMDU1OCA8W14+XSo+IHN3YzEJXCRmNCw1XChcJHplcm9cKQotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1NjAgPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJGF0XCkKLTArMDU2NCA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkYXRcKQotMCswNTY4IDxbXj5dKj4gc3djMQlcJGY1LC0zMjc2OFwoXCR6ZXJvXCkKLTArMDU2YyA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkemVyb1wpCi0wKzA1NzAgPFtePl0qPiBzd2MxCVwkZjUsMFwoXCRhMVwpCi0wKzA1NzQgPFtePl0qPiBzd2MxCVwkZjQsNFwoXCRhMVwpCi0wKzA1NzggPFtePl0qPiBzd2MxCVwkZjUsMVwoXCRhMVwpCi0wKzA1N2MgPFtePl0qPiBzd2MxCVwkZjQsNVwoXCRhMVwpCi0wKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU4OCA8W14+XSo+IHN3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQotMCswNThjIDxbXj5dKj4gc3djMQlcJGY0LC0zMjc2NFwoXCRhdFwpCi0wKzA1OTAgPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJGExXCkKLTArMDU5NCA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkYTFcKQotMCswNTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjU5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1OWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1YTAgPFtePl0qPiBzd2MxCVwkZjUsLTIzMTMxXChcJGF0XCkKLVsgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVhNCA8W14+XSo+IHN3YzEJXCRmNCwtMjMxMjdcKFwkYXRcKQotWyAJXSo1YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE4IDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswNWFjIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQotMCswNWIwIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi1bIAldKjViMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDViNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDViOCA8W14+XSo+IGxkCVwkYTAsLTIzMTMxXChcJGEwXCkKLVsgCV0qNWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNWJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjViYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzA1YzQgPFtePl0qPiBzZAlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjVjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YzggPFtePl0qPiBub3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjJiZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MuZAorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1JUFMgbGQtaWxvY2tzCi0jc291cmNlOiBsZC5zCi0jYXM6Ci0jIFRlc3QgdGhlIGxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPC50ZXh0PiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwODQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSphODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjNCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwYyA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qMTEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTYwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTljIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjIwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1NCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJhNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYzAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjJjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCi1bIAldKjJjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMjQgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjMyNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMjggPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCi1bIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMzNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM0NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM2NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzOGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDM5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM5NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2EwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2E0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2E4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2FjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2IwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2I0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2I4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2JjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNjNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2M0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2QwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Q0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2Q4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2RjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNlNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2U0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2U4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2VjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2YwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Y0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDAwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDA0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSo0MDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDA4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDBjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDQ4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDc4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ3YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDg4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDhjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDk0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0OTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRhNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0YWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGI0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGI4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRjNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0Y2MgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNGQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0ZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNGUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGU0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGU4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGVjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkemVyb1wpCi0wKzA0ZjAgPFtePl0qPiBsd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKLTArMDRmNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQotMCswNGY4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkemVyb1wpCi0wKzA0ZmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDUwMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTA0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1MDggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQotMCswNTBjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDUxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwwXChcJGExXCkKLTArMDUxNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJGExXCkKLTArMDUxOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJGExXCkKLTArMDUxYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSw1XChcJGExXCkKLTArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTI4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1MmMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDUzMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQotMCswNTM0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCi0wKzA1MzggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTQwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0yMzEzMVwoXCRhdFwpCi1bIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0NCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMjMxMjdcKFwkYXRcKQotWyAJXSo1NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDggPFtePl0qPiBub3AKLTArMDU0YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQotMCswNTUwIDxbXj5dKj4gc3djMQlcJGZbNDVdLDRcKFwkemVyb1wpCi0wKzA1NTQgPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKLTArMDU1OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1NjAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU2NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTY4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDU2YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCi0wKzA1NzAgPFtePl0qPiBzd2MxCVwkZls0NV0sMFwoXCRhMVwpCi0wKzA1NzQgPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCRhMVwpCi0wKzA1NzggPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCRhMVwpCi0wKzA1N2MgPFtePl0qPiBzd2MxCVwkZls0NV0sNVwoXCRhMVwpCi0wKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU4OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNThjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1OTAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKLTArMDU5NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQotMCswNTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjU5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1OWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1YTAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTIzMTMxXChcJGF0XCkKLVsgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVhNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMjMxMjdcKFwkYXRcKQotWyAJXSo1YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE4IDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswNWFjIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQotMCswNWIwIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi1bIAldKjViMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDViNCA8W14+XSo+IChkfClhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1YjggPFtePl0qPiBsZAlcJGEwLC0yMzEzMVwoXCRhMFwpCi1bIAldKjViODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDViYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNWMwIDxbXj5dKj4gKGR8KWFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDVjNCA8W14+XSo+IHNkCVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDVjOCA8W14+XSo+IG5vcAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmNTJkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxkIG1hY3JvIHdpdGggUElDIGNvZGUuCi0JCi0JLnNldAltaXBzMQotCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxkCSQ0LDAKLQlsZAkkNCwxCi0JbGQJJDQsMHg4MDAwCi0JbGQJJDQsLTB4ODAwMAotCWxkCSQ0LDB4MTAwMDAKLQlsZAkkNCwweDFhNWE1Ci0JbGQJJDQsMCgkNSkKLQlsZAkkNCwxKCQ1KQotCWxkCSQ0LDB4ODAwMCgkNSkKLQlsZAkkNCwtMHg4MDAwKCQ1KQotCWxkCSQ0LDB4MTAwMDAoJDUpCi0JbGQJJDQsMHgxYTVhNSgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsZAkkNCxkYXRhX2xhYmVsKzEKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxkCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsZAkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQkuaWZuZGVmCUVNUElDCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDQzZDc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsZC1zdnI0cGljCi0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQwotI3NvdXJjZTogbGQtcGljLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSphMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBub3AKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYjA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjQgPFtePl0qPiBub3AKLTArMDBiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwYmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYzA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qZDA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkNCA8W14+XSo+IG5vcAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSplMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBlNCA8W14+XSo+IG5vcAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qZTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBlYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwZjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpmMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBmNCA8W14+XSo+IG5vcAotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwxMDAwXChcJGF0XCkKLVsgCV0qZjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCi1bIAldKmZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTA0IDxbXj5dKj4gbm9wCi0wKzAxMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxMDg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxMGM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTE0IDxbXj5dKj4gbm9wCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDEyMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEyMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyNCA8W14+XSo+IG5vcAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDEyYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxMzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMzA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzQgPFtePl0qPiBub3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxM2MgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTQwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTQwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDQgPFtePl0qPiBub3AKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTUwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTUwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTU0IDxbXj5dKj4gbm9wCi0wKzAxNTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxNTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE1YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTYwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTY0IDxbXj5dKj4gbm9wCi0wKzAxNjggPFtePl0qPiBsdwlcJGEwLDEwMDFcKFwkYXRcKQotWyAJXSoxNjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE2YyA8W14+XSo+IGx3CVwkYTEsMTAwNVwoXCRhdFwpCi1bIAldKjE2YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTcwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTcwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDE3NCA8W14+XSo+IG5vcAotMCswMTc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMTdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTdjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTgwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTgwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTg0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTg0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IG5vcAotMCswMThjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxOTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBub3AKLTArMDFhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWFjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWFjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gbm9wCi0wKzAxYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFjMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFjMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWM0IDxbXj5dKj4gbm9wCi0wKzAxYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFkNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFkNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFkOCA8W14+XSo+IG5vcAotMCswMWRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWUwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFlOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFlODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFlYyA8W14+XSo+IG5vcAotMCswMWYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWY0IDxbXj5dKj4gbHcJXCRhMCwxMDAwXChcJGF0XCkKLVsgCV0qMWY0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZjggPFtePl0qPiBsdwlcJGExLDEwMDRcKFwkYXRcKQotWyAJXSoxZjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFmYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyMDAgPFtePl0qPiBub3AKLTArMDIwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjIwODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjIwYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjIxMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMTQgPFtePl0qPiBub3AKLTArMDIxOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIxYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyMjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjI0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI4IDxbXj5dKj4gbm9wCi0wKzAyMmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyMzAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjIzODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IG5vcAotMCswMjQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyNGMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNGM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1MCA8W14+XSo+IG5vcAotMCswMjU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDI1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyNjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNjA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNjQgPFtePl0qPiBub3AKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjI2YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMjcwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMjcwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNzggPFtePl0qPiBub3AKLTArMDI3YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI4MCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCi1bIAldKjI4MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjg0IDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKLVsgCV0qMjg0OiBSX01JUFNfTE8xNgkuYnNzCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDI2MmNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsZC14Z290Ci0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAteGdvdAotI3NvdXJjZTogbGQtcGljLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYTA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGE4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qYTg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGFjIDxbXj5dKj4gbm9wCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBjMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmMwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM0IDxbXj5dKj4gbm9wCi0wKzAwYzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBkMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBkOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmQ4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGRjIDxbXj5dKj4gbm9wCi0wKzAwZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGU0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qZjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IG5vcAotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMDQgPFtePl0qPiBub3AKLTArMDEwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjEwODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTBjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMTQgPFtePl0qPiBub3AKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCi1bIAldKjExODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKLVsgCV0qMTFjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMjA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTI0IDxbXj5dKj4gbm9wCi0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxMjg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxMmM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTMwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjEzODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBub3AKLTArMDE0MCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE0ODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE1MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE1MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE1NCA8W14+XSo+IG5vcAotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDE1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTYwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTY4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTY4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTZjIDxbXj5dKj4gbm9wCi0wKzAxNzAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE4MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE4MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTg0IDxbXj5dKj4gbm9wCi0wKzAxODggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMThjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE5MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE5NCA8W14+XSo+IG5vcAotMCswMTk4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTk4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxOWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxOWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFhMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFhMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFhNCA8W14+XSo+IG5vcAotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKLVsgCV0qMWE4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxYWMgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQotWyAJXSoxYWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFiMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxYjQgPFtePl0qPiBub3AKLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFiYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDFjMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFjMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDFjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWM4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMWNjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMWNjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkMCA8W14+XSo+IG5vcAotMCswMWQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWUwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMWU4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMWU4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gbm9wCi0wKzAxZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyMDQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyMDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDggPFtePl0qPiBub3AKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIxMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjIxODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjFjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMjIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMjIwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMjQgPFtePl0qPiBub3AKLTArMDIyOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAyMzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjM0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMjM4IDxbXj5dKj4gbm9wCi0wKzAyM2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyNDA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI0NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjQ4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMjRjIDxbXj5dKj4gbm9wCi0wKzAyNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNTQgPFtePl0qPiBsdwlcJGEwLDEwMDBcKFwkYXRcKQotWyAJXSoyNTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI1OCA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCi1bIAldKjI1ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMjVjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjVjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDI2MCA8W14+XSo+IG5vcAotMCswMjY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjY4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMjY4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjZjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMjZjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyNzggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyNzg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gbm9wCi0wKzAyODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyODQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDI4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyOGM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyOTQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyOTQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTggPFtePl0qPiBub3AKLTArMDI5YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJhMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyYTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDJiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjJiMDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJiNCA8W14+XSo+IG5vcAotMCswMmI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmJjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDJjMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmM0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyY2MgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyY2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJkMCA8W14+XSo+IG5vcAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmQ4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDJkYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyZTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyZTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyZTQgPFtePl0qPiBub3AKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMmYwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMmYwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyZjQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyZjQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyZjggPFtePl0qPiBub3AKLTArMDJmYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMwMCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCi1bIAldKjMwMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMzA0IDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKLVsgCV0qMzA0OiBSX01JUFNfTE8xNgkuYnNzCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODljZjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jYXM6IC1tY3B1PXI0MDAwCi0jbmFtZTogTUlQUyBsZAotCi0jIFRlc3QgdGhlIGxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDk0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDk4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjljOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSphMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKmFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSpiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBjMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwY2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSpjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRncFwpCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBkNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSplYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGYwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSoxMDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSoxMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTEwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTE0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qMTE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKjExYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0MCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNjAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNjQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTZjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE3MCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxN2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5YyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFiMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFjMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYzQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWQ0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjAwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjA0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjA4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjBjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDIxNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIyMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyM2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0NCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjVjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjYwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjY0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI2OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjdjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBub3AKLTArMDI5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDI5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJiMCA8W14+XSo+IG5vcAotMCswMmI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmJjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmMwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJjOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJkMCA8W14+XSo+IG5vcAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJkYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmYwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMwMCA8W14+XSo+IG5vcAotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMxOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjMxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzIwIDxbXj5dKj4gbm9wCi0wKzAzMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzQwIDxbXj5dKj4gbm9wCi0wKzAzNDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzNDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMzRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDM1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzNTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzVjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDM2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM3MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzdjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM4MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzODggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzhjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM5OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM5YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjM5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNhMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDNhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNhOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNiMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswM2JjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2JjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDNjMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2M0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2M4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzZDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2QwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2UwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2VjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2VjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNmMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2Y0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Y4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2Y4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNmYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNDAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDA4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDBjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjQxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDQxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQxOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQxYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQyMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo0MjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDI4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQyYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0MzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQzYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0NDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ1YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ2YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0Nzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0N2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0N2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ODAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ODggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0OGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0OGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0OTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0OTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDk4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ5YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0YTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNGE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDRhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0YjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRiOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGJjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0ZDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Zjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1MDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNTA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTA4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDUwYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjUwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1MTAgPFtePl0qPiBsd2MxCVwkZls0NV0sMFwoXCR6ZXJvXCkKLTArMDUxNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJHplcm9cKQotMCswNTE4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkemVyb1wpCi0wKzA1MWMgPFtePl0qPiBsd2MxCVwkZls0NV0sNVwoXCR6ZXJvXCkKLTArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTI0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1MjggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDUyYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1MzAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJHplcm9cKQotMCswNTM0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkYTFcKQotMCswNTM4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDRcKFwkYTFcKQotMCswNTNjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkYTFcKQotMCswNTQwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkYTFcKQotMCswNTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1NDggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1NGMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU1MCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTU0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhMVwpCi0wKzA1NTggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGExXCkKLTArMDU1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjU1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU2NCA8W14+XSo+IGx3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTY4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQotWyAJXSo1Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NmMgPFtePl0qPiBub3AKLTArMDU3MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQotMCswNTc0IDxbXj5dKj4gc3djMQlcJGZbNDVdLDRcKFwkemVyb1wpCi0wKzA1NzggPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKLTArMDU3YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQotMCswNTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1ODQgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU4OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNThjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDU5MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCi0wKzA1OTQgPFtePl0qPiBzd2MxCVwkZls0NV0sMFwoXCRhMVwpCi0wKzA1OTggPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCRhMVwpCi0wKzA1OWMgPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCRhMVwpCi0wKzA1YTAgPFtePl0qPiBzd2MxCVwkZls0NV0sNVwoXCRhMVwpCi0wKzA1YTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDVhOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVhYyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNWIwIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1YjQgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKLTArMDViOCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQotMCswNWJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVjNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVjOCA8W14+XSo+IHN3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNWM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVjYyA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDVkMCA8W14+XSo+IHN3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDVkNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjVkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDVkOCA8W14+XSo+IGRhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1ZGMgPFtePl0qPiBsZAlcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSo1ZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1ZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1ZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNWU0IDxbXj5dKj4gZGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDVlOCA8W14+XSo+IHNkCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjVlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1ZWMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlZTNjMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxkIG1hY3JvLgotCQotCS5zZXQJbWlwczEKLQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsZAkkNCwwCi0JbGQJJDQsMQotCWxkCSQ0LDB4ODAwMAotCWxkCSQ0LC0weDgwMDAKLQlsZAkkNCwweDEwMDAwCi0JbGQJJDQsMHgxYTVhNQotCWxkCSQ0LDAoJDUpCi0JbGQJJDQsMSgkNSkKLQlsZAkkNCwweDgwMDAoJDUpCi0JbGQJJDQsLTB4ODAwMCgkNSkKLQlsZAkkNCwweDEwMDAwKCQ1KQotCWxkCSQ0LDB4MWE1YTUoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGQJJDQsZGF0YV9sYWJlbCsxCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsZAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JbGQJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGQJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsZAkkNCxkYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIGwuZCBhbmQgcy5kIGFyZSBzb3J0IG9mIGxpa2UgbGQuCi0JbC5kCSRmNCwwCi0JbC5kCSRmNCwxCi0JbC5kCSRmNCwweDgwMDAKLQlsLmQJJGY0LC0weDgwMDAKLQlsLmQJJGY0LDAoJDUpCi0JbC5kCSRmNCwxKCQ1KQotCWwuZAkkZjQsMHg4MDAwKCQ1KQotCWwuZAkkZjQsLTB4ODAwMCgkNSkKLQlsLmQJJGY0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCSMgTGl0dGxlIGVuZGlhbiB3aWxsIGluc2VydCBhIG5vcCBoZXJlLgotCSMgV2UgcHV0IGl0IGluIGV4cGxpY2l0bHkgc28gdGhhdCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gYXJlIHNpbWlsYXIuCi0Jbm9wCi0Jcy5kCSRmNCwwCi0Jcy5kCSRmNCwxCi0Jcy5kCSRmNCwweDgwMDAKLQlzLmQJJGY0LC0weDgwMDAKLQlzLmQJJGY0LDAoJDUpCi0Jcy5kCSRmNCwxKCQ1KQotCXMuZAkkZjQsMHg4MDAwKCQ1KQotCXMuZAkkZjQsLTB4ODAwMCgkNSkKLQlzLmQJJGY0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQotIyBzZCBpcyBoYW5kbGVkIGxpa2UgbGQuICBTYW5pdHkgY2hlY2sgaXQuCi0Jc2QJJDQsMAotCi0jIFNhbml0eSBjaGVjayB0aGUgLW1pcHMzIHZlcnNpb25zCi0JLnNldAltaXBzMwotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQlzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlMmIyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgbGkKLQotIyBUZXN0IHRoZSBsaSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDEwIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMWMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzYTYwMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGkgbWFjcm8uCi0KLWZvbzoKLQlsaQkkNCwwCi0JbGkJJDQsMQotCWxpCSQ0LDB4ODAwMAotCWxpCSQ0LC0weDgwMDAKLQlsaQkkNCwweDEwMDAwCi0JbGkJJDQsMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MGRjYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsaWZsb2F0LWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYyAtLWRlZnN5bSBFTVBJQz0xCi0jc291cmNlOiBsaWZsb2F0LnMKLQotIyBUZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3JvcyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2Mzg0Ci1bIAldKjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnJkYXRhLioKLTArMDAwNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMDggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDBjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0xNjM2OFwoXCRncFwpCi1bIAldKmM6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTE2MzY0XChcJGdwXCkKLVsgCV0qMTA6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDNmOGYKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjZDM2Ci0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDNmOGYKLTArMDAyMCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhjZDM2Ci0wKzAwMjQgPFtePl0qPiBtdGMxCVwkYXQsXCRmNAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA5YTdmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsaWZsb2F0LXN2cjRwaWMKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC1FQiAtLWRlZnN5bSBTVlI0PTEKLSNzb3VyY2U6IGxpZmxvYXQucwotCi0jIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjA6IFJfTUlQU19HT1QxNgkucm9kYXRhCi0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjg6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmM6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEwOiBSX01JUFNfR09UMTYJLnJvZGF0YQotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBsd2MxCVwkZjUsOFwoXCRhdFwpCi1bIAldKjE4OiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMWMgPFtePl0qPiBsd2MxCVwkZjQsMTJcKFwkYXRcKQotWyAJXSoxYzogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDIwIDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCi0wKzAwMjQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgotMCswMDI4IDxbXj5dKj4gbHVpCVwkYXQsMHgzZjhmCi0wKzAwMmMgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4Y2QzNgotMCswMDMwIDxbXj5dKj4gbXRjMQlcJGF0LFwkZjQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4NmUyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGlmbG9hdC14Z290Ci0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAteGdvdCAtRUIgLS1kZWZzeW0gWEdPVD0xCi0jc291cmNlOiBsaWZsb2F0LnMKLQotIyBUZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3JvcyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSowOiBSX01JUFNfR09UMTYJLnJvZGF0YQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo4OiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjOiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDogUl9NSVBTX0dPVDE2CS5yb2RhdGEKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gbHdjMQlcJGY1LDhcKFwkYXRcKQotWyAJXSoxODogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDFjIDxbXj5dKj4gbHdjMQlcJGY0LDEyXChcJGF0XCkKLVsgCV0qMWM6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAyMCA8W14+XSo+IGx1aQlcJGEwLDB4M2Y4ZgotMCswMDI0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGNkMzYKLTArMDAyOCA8W14+XSo+IGx1aQlcJGF0LDB4M2Y4ZgotMCswMDJjIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGNkMzYKLTArMDAzMCA8W14+XSo+IG10YzEJXCRhdCxcJGY0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFiNTU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxpZmxvYXQKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3MuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSowOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ybz9kYXRhLioKLTArMDAwNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnJvP2RhdGEuKgotMCswMDA4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkucm8/ZGF0YS4qCi0wKzAwMGMgPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRncFwpCi1bIAldKmM6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTAgPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRncFwpCi1bIAldKjEwOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDguKgotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgotMCswMDFjIDxbXj5dKj4gbHdjMQlcJGY0LFstMC05XStcKFwkZ3BcKQotWyAJXSoxYzogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ0LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NzdmMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3MuCi0JCi1mb286CQotCWxpLmQJJDQsMS4xMjM0NQotCWxpLmQJJGY0LDEuMTIzNDUKLQkKLQlsaS5zCSQ0LDEuMTIzNDUKLQlsaS5zCSRmNCwxLjEyMzQ1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0JLmlmZGVmCVNWUjQKLQlub3AKLQlub3AKLQlub3AKLQkuZW5kaWYKLQkuaWZkZWYJWEdPVAotCW5vcAotCW5vcAotCW5vcAotCS5lbmRpZgotCS5pZmRlZglFTVBJQwotCW5vcAotCW5vcAotCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTQwZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8uZAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtbCAtbW1pcHM6NDAwMAotI25hbWU6IGFzc2VtYmx5IGxpbmUgbnVtYmVycwotI2FzOiAtZyAtbWNwdT1yNDAwMAotCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPG1haW4tMHgxMD46Ci0uKlswLTlhLWZdKzouKmRlYWRiZWVmLioKLS4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgotLipbMC05YS1mXSs6LipkZWFkYmVlZi4qCi0uKlswLTlhLWZdKzouKmRlYWRiZWVmLioKLQotMCswMDEwIDxtYWluPjoKLW1haW5cKFwpOgotLipsaW5lbm8uczoxNgotLioxMDouKmFkZGl1LioKLS4qbGluZW5vLnM6MTcKLS4qMTQ6LipzZC4qCi0uKmxpbmVuby5zOjE4Ci0uKjE4Oi4qc2QuKgotLipsaW5lbm8uczoxOQotLioxYzouKm1vdmUuKgotLipsaW5lbm8uczoyMAotLioyMDouKmphbC4qCi0uKjI0Oi4qbm9wCi0uKmxpbmVuby5zOjIxCi0uKjI4Oi4qbGkuKgotLipsaW5lbm8uczoyMgotLioyYzouKnN3LioKLS4qbGluZW5vLnM6MjMKLS4qMzA6Lipsdy4qCi0uKmxpbmVuby5zOjI0Ci0uKjM0Oi4qbW92ZS4qCi0uKmxpbmVuby5zOjI1Ci0uKjM4Oi4qc2xsLioKLS4qbGluZW5vLnM6MjYKLS4qM2M6LiphZGR1LioKLS4qbGluZW5vLnM6MjcKLS4qNDA6Lipzdy4qCi0uKmxpbmVuby5zOjI4Ci0uKjQ0Oi4qbHcuKgotLipsaW5lbm8uczoyOQotLio0ODouKmphbC4qCi0uKjRjOi4qbm9wCi0uKmxpbmVuby5zOjMwCi0uKjUwOi4qbHcuKgotLipsaW5lbm8uczozMQotLio1NDouKm1vdmUuKgotLipsaW5lbm8uczozMgotLio1ODouKmIuKgotLio1YzouKm5vcAotCi0wMDAwMDAwMDAwMDAwMDYwIDxcJEwxPjoKLS4qbGluZW5vLnM6MzQKLS4qNjA6Liptb3ZlLioKLS4qbGluZW5vLnM6MzUKLS4qNjQ6LipsZC4qCi0uKmxpbmVuby5zOjM2Ci0uKjY4Oi4qbGQuKgotLipsaW5lbm8uczozNwotLio2YzouKmFkZGl1LioKLS4qbGluZW5vLnM6MzgKLS4qNzA6Lipqci4qCi0uKjc0Oi4qbm9wCi0KLTAwMDAwMDAwMDAwMDAwNzggPGc+OgotZ1woXCk6Ci0uKmxpbmVuby5zOjQ3Ci0uKjc4Oi4qYWRkaXUuKgotLipsaW5lbm8uczo0OAotLio3YzouKnNkLioKLS4qbGluZW5vLnM6NDkKLS4qODA6Liptb3ZlLioKLS4qbGluZW5vLnM6NTAKLS4qODQ6Lipzdy4qCi0uKmxpbmVuby5zOjUxCi0uKjg4Oi4qbHcuKgotLipsaW5lbm8uczo1MgotLio4YzouKmFkZGl1LioKLS4qbGluZW5vLnM6NTMKLS4qOTA6Liptb3ZlLioKLS4qbGluZW5vLnM6NTQKLS4qOTQ6LipiLioKLS4qOTg6Lipub3AKLQotMDAwMDAwMDAwMDAwMDA5YyA8XCRMMj46Ci0uKmxpbmVuby5zOjU2Ci0uKjljOi4qbW92ZS4qCi0uKmxpbmVuby5zOjU3Ci0uKmEwOi4qbGQuKgotLipsaW5lbm8uczo1OAotLiphNDouKmFkZGl1LioKLS4qbGluZW5vLnM6NTkKLS4qYTg6Lipqci4qCi0uKmFjOi4qbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxZjMzMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotCS50ZXh0Ci0KLSMgc29tZSBkYXRhCi0JLndvcmQJMHhkZWFkYmVlZgotCS53b3JkCTB4ZGVhZGJlZWYKLQkud29yZAkweGRlYWRiZWVmCi0JLndvcmQJMHhkZWFkYmVlZgotCi0jIHNvbWUgcmVhbCBjb2RlLCBjb21waWxlZCBmcm9tIGEgdG95IEMgcHJvZ3JhbQotCSAgICAgICAgLmdsb2JsICBtYWluCi0gICAgICAgIC5lbnQgICAgbWFpbgotbWFpbjoKLSAgICAgICAgLmZyYW1lICAkZnAsMzIsJDMxICAgICAgICAgICAgICAjIHZhcnM9IDE2LCByZWdzPSAyLzAsIGFyZ3M9IDAsIGV4dHJhPSAwCi0gICAgICAgIC5tYXNrICAgMHhjMDAwMDAwMCwtOAotICAgICAgICAuZm1hc2sgIDB4MDAwMDAwMDAsMAotICAgICAgICBzdWJ1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgc2QgICAgICAkMzEsMjQoJHNwKQotICAgICAgICBzZCAgICAgICRmcCwxNigkc3ApCi0gICAgICAgIG1vdmUgICAgJGZwLCRzcAotICAgICAgICBqYWwgICAgIF9fbWFpbgotICAgICAgICBsaSAgICAgICQyLDIgICAgICAgICAgICAgICAgICAgICMgMHgyCi0gICAgICAgIHN3ICAgICAgJDIsMCgkZnApCi0gICAgICAgIGx3ICAgICAgJDIsMCgkZnApCi0gICAgICAgIG1vdmUgICAgJDMsJDIKLSAgICAgICAgc2xsICAgICAkNCwkMywxCi0gICAgICAgIGFkZHUgICAgJDIsJDQsJDIKLSAgICAgICAgc3cgICAgICAkMiw0KCRmcCkKLSAgICAgICAgbHcgICAgICAkNCw0KCRmcCkKLSAgICAgICAgamFsICAgICBnCi0gICAgICAgIGx3ICAgICAgJDMsMCgkZnApCi0gICAgICAgIG1vdmUgICAgJDIsJDMKLSAgICAgICAgYiAgICAgICAkTDEKLSRMMToKLSAgICAgICAgbW92ZSAgICAkc3AsJGZwCi0gICAgICAgIGxkICAgICAgJDMxLDI0KCRzcCkKLSAgICAgICAgbGQgICAgICAkZnAsMTYoJHNwKQotICAgICAgICBhZGR1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgaiAgICAgICAkMzEKLSAgICAgICAgLmVuZCAgICBtYWluCi0gICAgICAgIC5hbGlnbiAgMgotICAgICAgICAuZ2xvYmwgIGcKLSAgICAgICAgLmVudCAgICBnCi1nOgotICAgICAgICAuZnJhbWUgICRmcCwzMiwkMzEgICAgICAgICAgICAgICMgdmFycz0gMTYsIHJlZ3M9IDEvMCwgYXJncz0gMCwgZXh0cmE9IDAKLSAgICAgICAgLm1hc2sgICAweDQwMDAwMDAwLC0xNgotICAgICAgICAuZm1hc2sgIDB4MDAwMDAwMDAsMAotICAgICAgICBzdWJ1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgc2QgICAgICAkZnAsMTYoJHNwKQotICAgICAgICBtb3ZlICAgICRmcCwkc3AKLSAgICAgICAgc3cgICAgICAkNCwwKCRmcCkKLSAgICAgICAgbHcgICAgICAkMiwwKCRmcCkKLSAgICAgICAgYWRkdSAgICAkMywkMiwxCi0gICAgICAgIG1vdmUgICAgJDIsJDMKLSAgICAgICAgYiAgICAgICAkTDIKLSRMMjoKLSAgICAgICAgbW92ZSAgICAkc3AsJGZwCi0gICAgICAgIGxkICAgICAgJGZwLDE2KCRzcCkKLSAgICAgICAgYWRkdSAgICAkc3AsJHNwLDMyCi0gICAgICAgIGogICAgICAgJDMxCi0gICAgICAgIC5lbmQgICAgZwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDFjMDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0jCi0jIFNvbWUgZ2VuZXJpYyBNSVBTIHRlc3RzCi0jCi1pZiBbaXN0YXJnZXQgbWlwcyotKi0qXSB0aGVuIHsKLSAgICBzZXQgbm9fbWlwczE2IDAKLSAgICBzZXQgc3ZyNHBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVsZipdIHx8IFtpc3RhcmdldCAqLSotaXJpeDUqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXg2KiBdIF0KLSAgICBzZXQgZW1waWMgW2V4cHIgW2lzdGFyZ2V0ICotKi1lY29mZipdIHx8IFtpc3RhcmdldCAqLSotdWx0cml4Kl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4XFsxLTRcXSpdIF0KLSAgICBzZXQgYW91dCBbZXhwciBbaXN0YXJnZXQgKi0qLWJzZCpdIHx8IFtpc3RhcmdldCAqLSotbmV0YnNkKl0gfHwgW2lzdGFyZ2V0ICotKi1vcGVuYnNkKl1dCi0gICAgc2V0IGlsb2NrcyBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl0KLSAgICBzZXQgZ3ByX2lsb2NrcyBbZXhwciBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl1dCi0gICAgc2V0IGFkZHIzMiBbZXhwciBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl1dCi0KLQotCi0KLQotICAgIHJ1bl9kdW1wX3Rlc3QgImFicyIKLSAgICBydW5fZHVtcF90ZXN0ICJhZGQiCi0gICAgcnVuX2R1bXBfdGVzdCAiYW5kIgotICAgIHJ1bl9kdW1wX3Rlc3QgImJyZWFrMjAiCi0gICAgcnVuX2R1bXBfdGVzdCAidHJhcDIwIgotICAgIHJ1bl9kdW1wX3Rlc3QgImJlcSIKLSAgICBydW5fZHVtcF90ZXN0ICJiZ2UiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmdldSIKLSAgICBydW5fZHVtcF90ZXN0ICJibHQiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmx0dSIKLSAgICBpZiAhJGlsb2NrcyB7IHJ1bl9kdW1wX3Rlc3QgImRpdiIgfSBlbHNlIHsgcnVuX2R1bXBfdGVzdCAiZGl2LWlsb2NrcyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgImRsaSIKLSAgICBydW5fZHVtcF90ZXN0ICJqYWwiCi0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJqYWwtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAiamFsLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJqYWwtZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJsYSIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGEtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGEteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxhLWVtcGljIiB9Ci0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAibGIiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxiLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7Ci0JIyBCb3RoIHZlcnNpb25zIHNwZWNpZnkgdGhlIGNwdSwgc28gd2UgY2FuIHJ1biBib3RoIHJlZ2FyZGxlc3Mgb2YKLQkjIHRoZSBpbnRlcmxvY2tpbmcgaW4gdGhlIGNvbmZpZ3VyZWQgZGVmYXVsdCBjcHUuCi0JcnVuX2R1bXBfdGVzdCAibGIteGdvdCIKLQlydW5fZHVtcF90ZXN0ICJsYi14Z290LWlsb2NrcyIKLSAgICB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAibGItZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgeyAKLSAgICAgICAgaWYgISRncHJfaWxvY2tzIHsgCi0gICAgICAgICAgICBydW5fZHVtcF90ZXN0ICJsZCIgCi0gICAgICAgIH0gZWxzZSB7IAotICAgICAgICAgICAgaWYgISRhZGRyMzIgewotICAgICAgICAgICAgICAgIHJ1bl9kdW1wX3Rlc3QgImxkLWlsb2NrcyIKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnVuX2R1bXBfdGVzdCAibGQtaWxvY2tzLWFkZHIzMiIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJsZC1lbXBpYyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgImxpIgotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgImxpZmxvYXQiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsaWYteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi1lbXBpYyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgIm1pcHM0IgotICAgIGlmICEkaWxvY2tzIHsgcnVuX2R1bXBfdGVzdCAibXVsIiB9IGVsc2UgeyBydW5fZHVtcF90ZXN0ICJtdWwtaWxvY2tzIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAicm9sIgotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgInNiIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAidHJ1bmMiCi0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAidWxoIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAidWxoLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgtZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgewotCXJ1bl9kdW1wX3Rlc3QgInVsdyIKLQlydW5fZHVtcF90ZXN0ICJ1bGQiCi0JcnVuX2R1bXBfdGVzdCAidXNoIgotCXJ1bl9kdW1wX3Rlc3QgInVzdyIKLQlydW5fZHVtcF90ZXN0ICJ1c2QiCi0gICAgfQotICAgICMgVGhlIG1pcHMxNiB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiBFTEYsIGJlY2F1c2Ugb25seSBFTEYKLSAgICAjIHN1cHBvcnRzIHRoZSBuZWNlc3NhcnkgbWlwczE2IHJlbG9jLgotICAgIGlmIHsgJHN2cjRwaWMgJiYgISRub19taXBzMTYgfSB7IHJ1bl9kdW1wX3Rlc3QgIm1pcHMxNiIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgImRlbGF5IgotICAgIHJ1bl9kdW1wX3Rlc3QgIm5vZGVsYXkiCi0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQwMTAiCi0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQ2NTAiCi0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQxMDAiCi0gICAgcnVuX2R1bXBfdGVzdCAibGluZW5vIgotICAgIHJ1bl9kdW1wX3Rlc3QgInN5bmMiCi0KLSAgICAjIE1ha2Ugc3VyZSB0aGF0IC1tY3B1PUZPTyBhbmQgLW1GT08gYXJlIGVxdWl2YWxlbnQuICBBc3NlbWJsZSBhIGZpbGUKLSAgICAjIGNvbnRhaW5pbmcgNDY1MC1zcGVjaWZpYyBpbnN0cnVjdGlvbnMgd2l0aCAtbTQ2NTAgYW5kIC1tY3B1PTQ2NTAsCi0gICAgIyBhbmQgdmVyaWZ5IHRoYXQgdGhleSdyZSB0aGUgc2FtZS4gIFNwZWNpZmljYWxseSwgd2UncmUgY2hlY2tpbmcKLSAgICAjIHRoYXQgdGhlIEVGX01JUFNfTUFDSCBmaWVsZCBpcyBzZXQsIGFuZCB0aGF0IHRoZSA0NjUwICdtdWwnCi0gICAgIyBpbnN0cnVjdGlvbiBkb2VzIGdldCB1c2VkLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgR0FTLCAKLSAgICAjIG9ubHkgLW1jcHU9NDY1MCB3b3VsZCBzZXQgdGhlIEVGX01JUFNfTUFDSCBmaWVsZDsgLW00NjUwIHdvdWxkbid0LgotICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzMSIKLSAgICBydW5fZHVtcF90ZXN0ICJlbGZfZV9mbGFnczIiCi0gICAgcnVuX2R1bXBfdGVzdCAiZWxmX2VfZmxhZ3MzIgotICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzNCIKLSAgICAKLSAgICBpZiAkc3ZyNHBpYyB7Ci0JcnVuX2R1bXBfdGVzdCAiZWxmLXJlbCIKLQlpZiBbaXN0YXJnZXQgbWlwczY0Ki0qLSpdIHsgCi0JICAgIHJ1bl9kdW1wX3Rlc3QgImVsZi1yZWwyIiAKLQl9IHsKLQkgICAgcnVuX2R1bXBfdGVzdCAiZTMyLXJlbDIiIAotCX0gCi0JcnVuX2R1bXBfdGVzdCAiZW1waWMiCi0JaWYgeyAhJG5vX21pcHMxNiB9IHsgCi0JICAgIHJ1bl9kdW1wX3Rlc3QgIm1pcHMxNi1lIiAKLQkgICAgc2V0dXBfeGZhaWwgIm1pcHMqLSotKiIKLQkgICAgcnVuX2R1bXBfdGVzdCAibWlwczE2LWYiIAotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi1lLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi1lLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjNmNjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYtZS5kCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotI29iamR1bXA6IC1yc3QgLW1pcHMxNgotI25hbWU6IE1JUFMxNiByZWxvYwotI2FzOiAtbWlwczE2Ci0KLSMgQ2hlY2sgTUlQUzE2IHJlbG9jIHByb2Nlc3NpbmcKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYuKm1pcHMuKgotCi1TWU1CT0wgVEFCTEU6Ci0wKzAwMDAwMDAgbCAgICBkICBcLnRleHQJMCswMDAwMDAwIAotMCswMDAwMDAwIGwgICAgZCAgXC5kYXRhCTArMDAwMDAwMCAKLTArMDAwMDAwMCBsICAgIGQgIFwuYnNzCTArMDAwMDAwMCAKLTArMDAwMDAwMCBsICAgIGQgIGZvbwkwKzAwMDAwMDAgCi0wKzAwMDAwMDAgbCAgICBkICBcLnJlZ2luZm8JMCswMDAwMDAwIAotMCswMDAwMDAwIGwgICAgZCAgXC5tZGVidWcJMCswMDAwMDAwIAotMCswMDAwMDAyIGwgICAgICAgXC50ZXh0CTArMDAwMDAwMCAweGYwIGwxCi0wKzAwMDAwMDQgbCAgICAgICBcLnRleHQJMCswMDAwMDAwIDB4ZjAgTDEuMQotMCswMDAwMDAwICAgICAgICAgXCpVTkRcKgkwKzAwMDAwMDAgZzEKLQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbZm9vXF06Ci1PRkZTRVQgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMCswMDAwMDAwIFJfTUlQU18zMiAgICAgICAgIGwxCi0wKzAwMDAwMDQgUl9NSVBTXzMyICAgICAgICAgbDEKLTArMDAwMDAwOCBSX01JUFNfMzIgICAgICAgICBMMS4xCi0wKzAwMDAwMGMgUl9NSVBTXzMyICAgICAgICAgTDEuMQotMCswMDAwMDEwIFJfTUlQU18zMiAgICAgICAgIGcxCi0wKzAwMDAwMTQgUl9NSVBTXzMyICAgICAgICAgZzEKLQotCi1Db250ZW50cyBvZiBzZWN0aW9uIFwudGV4dDoKLSAwMDAwIDY1MDA2NTAwIDY1MDA2NTAwICAgICAgICAgICAgICAgICAgICAuKgotQ29udGVudHMgb2Ygc2VjdGlvbiBcLmRhdGE6Ci1Db250ZW50cyBvZiBzZWN0aW9uIFwucmVnaW5mbzoKLSAwMDAwIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuKgotIDAwMTAgMDAwMDAwMDAgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIC4qCi1Db250ZW50cyBvZiBzZWN0aW9uIFwubWRlYnVnOgotIy4uLgotQ29udGVudHMgb2Ygc2VjdGlvbiBmb286Ci0gMDAwMCAwMDAwMDAwMCAwMDAwMDAwOCAwMDAwMDAwMCAwMDAwMDAwMyAgLioKLSAwMDEwIDAwMDAwMDAwIDAwMDAwMDA4ICAgICAgICAgICAgICAgICAgICAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYtZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYtZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTlkMDIwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LWUucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSAgICAgICAgLnNldCBub3Jlb3JkZXIKLSAgICAgICAgLnRleHQKLSAgICAgICAgbm9wCi1sMTogICAgIG5vcAotMTogICAgICBub3AKLSAgICAgICAgbm9wCi0gICAgICAgIC5zZWN0aW9uICJmb28iCi0gICAgICAgIC53b3JkICAgbDEKLSAgICAgICAgLndvcmQgICBsMSs4Ci0gICAgICAgIC53b3JkICAgMWIKLSAgICAgICAgLndvcmQgICAxYiszCi0JLndvcmQJZzEKLQkud29yZAlnMSs4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi1mLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi1mLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmFmMWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYtZi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotI29iamR1bXA6IC1yc3QgLW1pcHMxNgotI25hbWU6IE1JUFMxNiByZWxvYyAyCi0jYXM6IC1taXBzMTYKLQotIyBDaGVjayBNSVBTMTYgcmVsb2MgcHJvY2Vzc2luZwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZi4qbWlwcy4qCi0KLVNZTUJPTCBUQUJMRToKLTArMDAwMDAwMCBsICAgIGQgIFwudGV4dAkwKzAwMDAwMDAgCi0wKzAwMDAwMDAgbCAgICBkICBcLmRhdGEJMCswMDAwMDAwIAotMCswMDAwMDAwIGwgICAgZCAgXC5ic3MJMCswMDAwMDAwIAotMCswMDAwMDAwIGwgICAgZCAgZm9vCTArMDAwMDAwMCAKLTArMDAwMDAwMCBsICAgIGQgIFwucmVnaW5mbwkwKzAwMDAwMDAgCi0wKzAwMDAwMDAgbCAgICBkICBcLm1kZWJ1ZwkwKzAwMDAwMDAgCi0wKzAwMDAwMDIgbCAgICAgICBcLnRleHQJMCswMDAwMDAwIDB4ZjAgbDEKLQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbZm9vXF06Ci1PRkZTRVQgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMCswMDAwMDAwIFJfTUlQU18zMiAgICAgICAgIGwxCi0KLQotQ29udGVudHMgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0gMDAwMCA2NTAwNjUwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKLUNvbnRlbnRzIG9mIHNlY3Rpb24gXC5kYXRhOgotQ29udGVudHMgb2Ygc2VjdGlvbiBcLnJlZ2luZm86Ci0gMDAwMCAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAgLioKLSAwMDEwIDAwMDAwMDAwIDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAuKgotQ29udGVudHMgb2Ygc2VjdGlvbiBcLm1kZWJ1ZzoKLSMuLi4KLUNvbnRlbnRzIG9mIHNlY3Rpb24gZm9vOgotIDAwMDAgMDAwMDAwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi1mLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi1mLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjU0YmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYtZi5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0gICAgICAgIC5zZXQgbm9yZW9yZGVyCi0gICAgICAgIC50ZXh0Ci0gICAgICAgIG5vcAotbDE6ICAgICBub3AKLSAgICAgICAgLnNlY3Rpb24gImZvbyIKLSAgICAgICAgLndvcmQgICBsMSszCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjMWEwYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5kCisrKyAvZGV2L251bGwKQEAgLTEsNjgzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLW1taXBzOjQwMDAKLSNhczogLW1pcHMzIC1tY3B1PXI0MDAwCi0jbmFtZTogbWlwczE2Ci0KLSMgVGVzdCB0aGUgbWlwczE2IGluc3RydWN0aW9uIHNldC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAwMCA8ZGF0YTE+OgotICAgMDoJMDAwMDAwMDAgCW5vcAotCi0wKzAwMDAwNCA8aW5zbnMxPjoKLSAgIDQ6CTNiNDAgICAgICAJbGQJXCR2MCwwXChcJHYxXCkKLSAgIDY6CWYwMDAgM2I0MSAJbGQJXCR2MCwxXChcJHYxXCkKLSAgIGE6CWYwMDAgM2I0MiAJbGQJXCR2MCwyXChcJHYxXCkKLSAgIGU6CWYwMDAgM2I0MyAJbGQJXCR2MCwzXChcJHYxXCkKLSAgMTI6CWYwMDAgM2I0NCAJbGQJXCR2MCw0XChcJHYxXCkKLSAgMTY6CTNiNDEgICAgICAJbGQJXCR2MCw4XChcJHYxXCkKLSAgMTg6CTNiNDIgICAgICAJbGQJXCR2MCwxNlwoXCR2MVwpCi0gIDFhOgkzYjQ0ICAgICAgCWxkCVwkdjAsMzJcKFwkdjFcKQotICAxYzoJM2I0OCAgICAgIAlsZAlcJHYwLDY0XChcJHYxXCkKLSAgMWU6CTNiNTAgICAgICAJbGQJXCR2MCwxMjhcKFwkdjFcKQotICAyMDoJZjEwMCAzYjQwIAlsZAlcJHYwLDI1NlwoXCR2MVwpCi0gIDI0OglmMjAwIDNiNDAgCWxkCVwkdjAsNTEyXChcJHYxXCkKLSAgMjg6CWY0MDAgM2I0MCAJbGQJXCR2MCwxMDI0XChcJHYxXCkKLSAgMmM6CWYwMDEgM2I0MCAJbGQJXCR2MCwyMDQ4XChcJHYxXCkKLSAgMzA6CWY3ZmYgM2I1ZiAJbGQJXCR2MCwtMVwoXCR2MVwpCi0gIDM0OglmN2ZmIDNiNWUgCWxkCVwkdjAsLTJcKFwkdjFcKQotICAzODoJZjdmZiAzYjVkIAlsZAlcJHYwLC0zXChcJHYxXCkKLSAgM2M6CWY3ZmYgM2I1YyAJbGQJXCR2MCwtNFwoXCR2MVwpCi0gIDQwOglmN2ZmIDNiNTggCWxkCVwkdjAsLThcKFwkdjFcKQotICA0NDoJZjdmZiAzYjUwIAlsZAlcJHYwLC0xNlwoXCR2MVwpCi0gIDQ4OglmN2ZmIDNiNDAgCWxkCVwkdjAsLTMyXChcJHYxXCkKLSAgNGM6CWY3ZGYgM2I0MCAJbGQJXCR2MCwtNjRcKFwkdjFcKQotICA1MDoJZjc5ZiAzYjQwIAlsZAlcJHYwLC0xMjhcKFwkdjFcKQotICA1NDoJZjcxZiAzYjQwIAlsZAlcJHYwLC0yNTZcKFwkdjFcKQotICA1ODoJZjYxZiAzYjQwIAlsZAlcJHYwLC01MTJcKFwkdjFcKQotICA1YzoJZjQxZiAzYjQwIAlsZAlcJHYwLC0xMDI0XChcJHYxXCkKLSAgNjA6CWYwMWYgM2I0MCAJbGQJXCR2MCwtMjA0OFwoXCR2MVwpCi0gIDY0OglmN2JmIGZjNDAgCWxkCVwkdjAsMCA8ZGF0YTE+Ci0gIDY4OglmNmEwIGZjNTQgCWxkCVwkdjAsNzFjIDxkYXRhMj4KLSAgNmM6CWYwMDEgZmM0MCAJbGQJXCR2MCw4NjggPGJhcj4KLSAgNzA6CWYwYzEgZmM0MCAJbGQJXCR2MCw5MzAgPHF1dXg+Ci0gIDc0OglmODQwICAgICAgCWxkCVwkdjAsMFwoXCRzcFwpCi0gIDc2OglmMDAwIGY4NDEgCWxkCVwkdjAsMVwoXCRzcFwpCi0gIDdhOglmMDAwIGY4NDIgCWxkCVwkdjAsMlwoXCRzcFwpCi0gIDdlOglmMDAwIGY4NDMgCWxkCVwkdjAsM1woXCRzcFwpCi0gIDgyOglmMDAwIGY4NDQgCWxkCVwkdjAsNFwoXCRzcFwpCi0gIDg2OglmODQxICAgICAgCWxkCVwkdjAsOFwoXCRzcFwpCi0gIDg4OglmODQyICAgICAgCWxkCVwkdjAsMTZcKFwkc3BcKQotICA4YToJZjg0NCAgICAgIAlsZAlcJHYwLDMyXChcJHNwXCkKLSAgOGM6CWY4NDggICAgICAJbGQJXCR2MCw2NFwoXCRzcFwpCi0gIDhlOglmODUwICAgICAgCWxkCVwkdjAsMTI4XChcJHNwXCkKLSAgOTA6CWYxMDAgZjg0MCAJbGQJXCR2MCwyNTZcKFwkc3BcKQotICA5NDoJZjIwMCBmODQwIAlsZAlcJHYwLDUxMlwoXCRzcFwpCi0gIDk4OglmNDAwIGY4NDAgCWxkCVwkdjAsMTAyNFwoXCRzcFwpCi0gIDljOglmMDAxIGY4NDAgCWxkCVwkdjAsMjA0OFwoXCRzcFwpCi0gIGEwOglmN2ZmIGY4NWYgCWxkCVwkdjAsLTFcKFwkc3BcKQotICBhNDoJZjdmZiBmODVlIAlsZAlcJHYwLC0yXChcJHNwXCkKLSAgYTg6CWY3ZmYgZjg1ZCAJbGQJXCR2MCwtM1woXCRzcFwpCi0gIGFjOglmN2ZmIGY4NWMgCWxkCVwkdjAsLTRcKFwkc3BcKQotICBiMDoJZjdmZiBmODU4IAlsZAlcJHYwLC04XChcJHNwXCkKLSAgYjQ6CWY3ZmYgZjg1MCAJbGQJXCR2MCwtMTZcKFwkc3BcKQotICBiODoJZjdmZiBmODQwIAlsZAlcJHYwLC0zMlwoXCRzcFwpCi0gIGJjOglmN2RmIGY4NDAgCWxkCVwkdjAsLTY0XChcJHNwXCkKLSAgYzA6CWY3OWYgZjg0MCAJbGQJXCR2MCwtMTI4XChcJHNwXCkKLSAgYzQ6CWY3MWYgZjg0MCAJbGQJXCR2MCwtMjU2XChcJHNwXCkKLSAgYzg6CWY2MWYgZjg0MCAJbGQJXCR2MCwtNTEyXChcJHNwXCkKLSAgY2M6CWY0MWYgZjg0MCAJbGQJXCR2MCwtMTAyNFwoXCRzcFwpCi0gIGQwOglmMDFmIGY4NDAgCWxkCVwkdjAsLTIwNDhcKFwkc3BcKQotICBkNDoJYmI0MCAgICAgIAlsd3UJXCR2MCwwXChcJHYxXCkKLSAgZDY6CWYwMDAgYmI0MSAJbHd1CVwkdjAsMVwoXCR2MVwpCi0gIGRhOglmMDAwIGJiNDIgCWx3dQlcJHYwLDJcKFwkdjFcKQotICBkZToJZjAwMCBiYjQzIAlsd3UJXCR2MCwzXChcJHYxXCkKLSAgZTI6CWJiNDEgICAgICAJbHd1CVwkdjAsNFwoXCR2MVwpCi0gIGU0OgliYjQyICAgICAgCWx3dQlcJHYwLDhcKFwkdjFcKQotICBlNjoJYmI0NCAgICAgIAlsd3UJXCR2MCwxNlwoXCR2MVwpCi0gIGU4OgliYjQ4ICAgICAgCWx3dQlcJHYwLDMyXChcJHYxXCkKLSAgZWE6CWJiNTAgICAgICAJbHd1CVwkdjAsNjRcKFwkdjFcKQotICBlYzoJZjA4MCBiYjQwIAlsd3UJXCR2MCwxMjhcKFwkdjFcKQotICBmMDoJZjEwMCBiYjQwIAlsd3UJXCR2MCwyNTZcKFwkdjFcKQotICBmNDoJZjIwMCBiYjQwIAlsd3UJXCR2MCw1MTJcKFwkdjFcKQotICBmODoJZjQwMCBiYjQwIAlsd3UJXCR2MCwxMDI0XChcJHYxXCkKLSAgZmM6CWYwMDEgYmI0MCAJbHd1CVwkdjAsMjA0OFwoXCR2MVwpCi0gMTAwOglmN2ZmIGJiNWYgCWx3dQlcJHYwLC0xXChcJHYxXCkKLSAxMDQ6CWY3ZmYgYmI1ZSAJbHd1CVwkdjAsLTJcKFwkdjFcKQotIDEwODoJZjdmZiBiYjVkIAlsd3UJXCR2MCwtM1woXCR2MVwpCi0gMTBjOglmN2ZmIGJiNWMgCWx3dQlcJHYwLC00XChcJHYxXCkKLSAxMTA6CWY3ZmYgYmI1OCAJbHd1CVwkdjAsLThcKFwkdjFcKQotIDExNDoJZjdmZiBiYjUwIAlsd3UJXCR2MCwtMTZcKFwkdjFcKQotIDExODoJZjdmZiBiYjQwIAlsd3UJXCR2MCwtMzJcKFwkdjFcKQotIDExYzoJZjdkZiBiYjQwIAlsd3UJXCR2MCwtNjRcKFwkdjFcKQotIDEyMDoJZjc5ZiBiYjQwIAlsd3UJXCR2MCwtMTI4XChcJHYxXCkKLSAxMjQ6CWY3MWYgYmI0MCAJbHd1CVwkdjAsLTI1NlwoXCR2MVwpCi0gMTI4OglmNjFmIGJiNDAgCWx3dQlcJHYwLC01MTJcKFwkdjFcKQotIDEyYzoJZjQxZiBiYjQwIAlsd3UJXCR2MCwtMTAyNFwoXCR2MVwpCi0gMTMwOglmMDFmIGJiNDAgCWx3dQlcJHYwLC0yMDQ4XChcJHYxXCkKLSAxMzQ6CTliNDAgICAgICAJbHcJXCR2MCwwXChcJHYxXCkKLSAxMzY6CWYwMDAgOWI0MSAJbHcJXCR2MCwxXChcJHYxXCkKLSAxM2E6CWYwMDAgOWI0MiAJbHcJXCR2MCwyXChcJHYxXCkKLSAxM2U6CWYwMDAgOWI0MyAJbHcJXCR2MCwzXChcJHYxXCkKLSAxNDI6CTliNDEgICAgICAJbHcJXCR2MCw0XChcJHYxXCkKLSAxNDQ6CTliNDIgICAgICAJbHcJXCR2MCw4XChcJHYxXCkKLSAxNDY6CTliNDQgICAgICAJbHcJXCR2MCwxNlwoXCR2MVwpCi0gMTQ4Ogk5YjQ4ICAgICAgCWx3CVwkdjAsMzJcKFwkdjFcKQotIDE0YToJOWI1MCAgICAgIAlsdwlcJHYwLDY0XChcJHYxXCkKLSAxNGM6CWYwODAgOWI0MCAJbHcJXCR2MCwxMjhcKFwkdjFcKQotIDE1MDoJZjEwMCA5YjQwIAlsdwlcJHYwLDI1NlwoXCR2MVwpCi0gMTU0OglmMjAwIDliNDAgCWx3CVwkdjAsNTEyXChcJHYxXCkKLSAxNTg6CWY0MDAgOWI0MCAJbHcJXCR2MCwxMDI0XChcJHYxXCkKLSAxNWM6CWYwMDEgOWI0MCAJbHcJXCR2MCwyMDQ4XChcJHYxXCkKLSAxNjA6CWY3ZmYgOWI1ZiAJbHcJXCR2MCwtMVwoXCR2MVwpCi0gMTY0OglmN2ZmIDliNWUgCWx3CVwkdjAsLTJcKFwkdjFcKQotIDE2ODoJZjdmZiA5YjVkIAlsdwlcJHYwLC0zXChcJHYxXCkKLSAxNmM6CWY3ZmYgOWI1YyAJbHcJXCR2MCwtNFwoXCR2MVwpCi0gMTcwOglmN2ZmIDliNTggCWx3CVwkdjAsLThcKFwkdjFcKQotIDE3NDoJZjdmZiA5YjUwIAlsdwlcJHYwLC0xNlwoXCR2MVwpCi0gMTc4OglmN2ZmIDliNDAgCWx3CVwkdjAsLTMyXChcJHYxXCkKLSAxN2M6CWY3ZGYgOWI0MCAJbHcJXCR2MCwtNjRcKFwkdjFcKQotIDE4MDoJZjc5ZiA5YjQwIAlsdwlcJHYwLC0xMjhcKFwkdjFcKQotIDE4NDoJZjcxZiA5YjQwIAlsdwlcJHYwLC0yNTZcKFwkdjFcKQotIDE4ODoJZjYxZiA5YjQwIAlsdwlcJHYwLC01MTJcKFwkdjFcKQotIDE4YzoJZjQxZiA5YjQwIAlsdwlcJHYwLC0xMDI0XChcJHYxXCkKLSAxOTA6CWYwMWYgOWI0MCAJbHcJXCR2MCwtMjA0OFwoXCR2MVwpCi0gMTk0OglmNjdmIGIyMGMgCWx3CVwkdjAsMCA8ZGF0YTE+Ci0gMTk4OglmNTgwIGIyMDQgCWx3CVwkdjAsNzFjIDxkYXRhMj4KLSAxOWM6CWY2YzAgYjIwYyAJbHcJXCR2MCw4NjggPGJhcj4KLSAxYTA6CWY3ODAgYjIxMCAJbHcJXCR2MCw5MzAgPHF1dXg+Ci0gMWE0Ogk5MjAwICAgICAgCWx3CVwkdjAsMFwoXCRzcFwpCi0gMWE2OglmMDAwIDkyMDEgCWx3CVwkdjAsMVwoXCRzcFwpCi0gMWFhOglmMDAwIDkyMDIgCWx3CVwkdjAsMlwoXCRzcFwpCi0gMWFlOglmMDAwIDkyMDMgCWx3CVwkdjAsM1woXCRzcFwpCi0gMWIyOgk5MjAxICAgICAgCWx3CVwkdjAsNFwoXCRzcFwpCi0gMWI0Ogk5MjAyICAgICAgCWx3CVwkdjAsOFwoXCRzcFwpCi0gMWI2Ogk5MjA0ICAgICAgCWx3CVwkdjAsMTZcKFwkc3BcKQotIDFiODoJOTIwOCAgICAgIAlsdwlcJHYwLDMyXChcJHNwXCkKLSAxYmE6CTkyMTAgICAgICAJbHcJXCR2MCw2NFwoXCRzcFwpCi0gMWJjOgk5MjIwICAgICAgCWx3CVwkdjAsMTI4XChcJHNwXCkKLSAxYmU6CTkyNDAgICAgICAJbHcJXCR2MCwyNTZcKFwkc3BcKQotIDFjMDoJOTI4MCAgICAgIAlsdwlcJHYwLDUxMlwoXCRzcFwpCi0gMWMyOglmNDAwIDkyMDAgCWx3CVwkdjAsMTAyNFwoXCRzcFwpCi0gMWM2OglmMDAxIDkyMDAgCWx3CVwkdjAsMjA0OFwoXCRzcFwpCi0gMWNhOglmN2ZmIDkyMWYgCWx3CVwkdjAsLTFcKFwkc3BcKQotIDFjZToJZjdmZiA5MjFlIAlsdwlcJHYwLC0yXChcJHNwXCkKLSAxZDI6CWY3ZmYgOTIxZCAJbHcJXCR2MCwtM1woXCRzcFwpCi0gMWQ2OglmN2ZmIDkyMWMgCWx3CVwkdjAsLTRcKFwkc3BcKQotIDFkYToJZjdmZiA5MjE4IAlsdwlcJHYwLC04XChcJHNwXCkKLSAxZGU6CWY3ZmYgOTIxMCAJbHcJXCR2MCwtMTZcKFwkc3BcKQotIDFlMjoJZjdmZiA5MjAwIAlsdwlcJHYwLC0zMlwoXCRzcFwpCi0gMWU2OglmN2RmIDkyMDAgCWx3CVwkdjAsLTY0XChcJHNwXCkKLSAxZWE6CWY3OWYgOTIwMCAJbHcJXCR2MCwtMTI4XChcJHNwXCkKLSAxZWU6CWY3MWYgOTIwMCAJbHcJXCR2MCwtMjU2XChcJHNwXCkKLSAxZjI6CWY2MWYgOTIwMCAJbHcJXCR2MCwtNTEyXChcJHNwXCkKLSAxZjY6CWY0MWYgOTIwMCAJbHcJXCR2MCwtMTAyNFwoXCRzcFwpCi0gMWZhOglmMDFmIDkyMDAgCWx3CVwkdjAsLTIwNDhcKFwkc3BcKQotIDFmZToJOGI0MCAgICAgIAlsaAlcJHYwLDBcKFwkdjFcKQotIDIwMDoJZjAwMCA4YjQxIAlsaAlcJHYwLDFcKFwkdjFcKQotIDIwNDoJOGI0MSAgICAgIAlsaAlcJHYwLDJcKFwkdjFcKQotIDIwNjoJZjAwMCA4YjQzIAlsaAlcJHYwLDNcKFwkdjFcKQotIDIwYToJOGI0MiAgICAgIAlsaAlcJHYwLDRcKFwkdjFcKQotIDIwYzoJOGI0NCAgICAgIAlsaAlcJHYwLDhcKFwkdjFcKQotIDIwZToJOGI0OCAgICAgIAlsaAlcJHYwLDE2XChcJHYxXCkKLSAyMTA6CThiNTAgICAgICAJbGgJXCR2MCwzMlwoXCR2MVwpCi0gMjEyOglmMDQwIDhiNDAgCWxoCVwkdjAsNjRcKFwkdjFcKQotIDIxNjoJZjA4MCA4YjQwIAlsaAlcJHYwLDEyOFwoXCR2MVwpCi0gMjFhOglmMTAwIDhiNDAgCWxoCVwkdjAsMjU2XChcJHYxXCkKLSAyMWU6CWYyMDAgOGI0MCAJbGgJXCR2MCw1MTJcKFwkdjFcKQotIDIyMjoJZjQwMCA4YjQwIAlsaAlcJHYwLDEwMjRcKFwkdjFcKQotIDIyNjoJZjAwMSA4YjQwIAlsaAlcJHYwLDIwNDhcKFwkdjFcKQotIDIyYToJZjdmZiA4YjVmIAlsaAlcJHYwLC0xXChcJHYxXCkKLSAyMmU6CWY3ZmYgOGI1ZSAJbGgJXCR2MCwtMlwoXCR2MVwpCi0gMjMyOglmN2ZmIDhiNWQgCWxoCVwkdjAsLTNcKFwkdjFcKQotIDIzNjoJZjdmZiA4YjVjIAlsaAlcJHYwLC00XChcJHYxXCkKLSAyM2E6CWY3ZmYgOGI1OCAJbGgJXCR2MCwtOFwoXCR2MVwpCi0gMjNlOglmN2ZmIDhiNTAgCWxoCVwkdjAsLTE2XChcJHYxXCkKLSAyNDI6CWY3ZmYgOGI0MCAJbGgJXCR2MCwtMzJcKFwkdjFcKQotIDI0NjoJZjdkZiA4YjQwIAlsaAlcJHYwLC02NFwoXCR2MVwpCi0gMjRhOglmNzlmIDhiNDAgCWxoCVwkdjAsLTEyOFwoXCR2MVwpCi0gMjRlOglmNzFmIDhiNDAgCWxoCVwkdjAsLTI1NlwoXCR2MVwpCi0gMjUyOglmNjFmIDhiNDAgCWxoCVwkdjAsLTUxMlwoXCR2MVwpCi0gMjU2OglmNDFmIDhiNDAgCWxoCVwkdjAsLTEwMjRcKFwkdjFcKQotIDI1YToJZjAxZiA4YjQwIAlsaAlcJHYwLC0yMDQ4XChcJHYxXCkKLSAyNWU6CWFiNDAgICAgICAJbGh1CVwkdjAsMFwoXCR2MVwpCi0gMjYwOglmMDAwIGFiNDEgCWxodQlcJHYwLDFcKFwkdjFcKQotIDI2NDoJYWI0MSAgICAgIAlsaHUJXCR2MCwyXChcJHYxXCkKLSAyNjY6CWYwMDAgYWI0MyAJbGh1CVwkdjAsM1woXCR2MVwpCi0gMjZhOglhYjQyICAgICAgCWxodQlcJHYwLDRcKFwkdjFcKQotIDI2YzoJYWI0NCAgICAgIAlsaHUJXCR2MCw4XChcJHYxXCkKLSAyNmU6CWFiNDggICAgICAJbGh1CVwkdjAsMTZcKFwkdjFcKQotIDI3MDoJYWI1MCAgICAgIAlsaHUJXCR2MCwzMlwoXCR2MVwpCi0gMjcyOglmMDQwIGFiNDAgCWxodQlcJHYwLDY0XChcJHYxXCkKLSAyNzY6CWYwODAgYWI0MCAJbGh1CVwkdjAsMTI4XChcJHYxXCkKLSAyN2E6CWYxMDAgYWI0MCAJbGh1CVwkdjAsMjU2XChcJHYxXCkKLSAyN2U6CWYyMDAgYWI0MCAJbGh1CVwkdjAsNTEyXChcJHYxXCkKLSAyODI6CWY0MDAgYWI0MCAJbGh1CVwkdjAsMTAyNFwoXCR2MVwpCi0gMjg2OglmMDAxIGFiNDAgCWxodQlcJHYwLDIwNDhcKFwkdjFcKQotIDI4YToJZjdmZiBhYjVmIAlsaHUJXCR2MCwtMVwoXCR2MVwpCi0gMjhlOglmN2ZmIGFiNWUgCWxodQlcJHYwLC0yXChcJHYxXCkKLSAyOTI6CWY3ZmYgYWI1ZCAJbGh1CVwkdjAsLTNcKFwkdjFcKQotIDI5NjoJZjdmZiBhYjVjIAlsaHUJXCR2MCwtNFwoXCR2MVwpCi0gMjlhOglmN2ZmIGFiNTggCWxodQlcJHYwLC04XChcJHYxXCkKLSAyOWU6CWY3ZmYgYWI1MCAJbGh1CVwkdjAsLTE2XChcJHYxXCkKLSAyYTI6CWY3ZmYgYWI0MCAJbGh1CVwkdjAsLTMyXChcJHYxXCkKLSAyYTY6CWY3ZGYgYWI0MCAJbGh1CVwkdjAsLTY0XChcJHYxXCkKLSAyYWE6CWY3OWYgYWI0MCAJbGh1CVwkdjAsLTEyOFwoXCR2MVwpCi0gMmFlOglmNzFmIGFiNDAgCWxodQlcJHYwLC0yNTZcKFwkdjFcKQotIDJiMjoJZjYxZiBhYjQwIAlsaHUJXCR2MCwtNTEyXChcJHYxXCkKLSAyYjY6CWY0MWYgYWI0MCAJbGh1CVwkdjAsLTEwMjRcKFwkdjFcKQotIDJiYToJZjAxZiBhYjQwIAlsaHUJXCR2MCwtMjA0OFwoXCR2MVwpCi0gMmJlOgk4MzQwICAgICAgCWxiCVwkdjAsMFwoXCR2MVwpCi0gMmMwOgk4MzQxICAgICAgCWxiCVwkdjAsMVwoXCR2MVwpCi0gMmMyOgk4MzQyICAgICAgCWxiCVwkdjAsMlwoXCR2MVwpCi0gMmM0Ogk4MzQzICAgICAgCWxiCVwkdjAsM1woXCR2MVwpCi0gMmM2Ogk4MzQ0ICAgICAgCWxiCVwkdjAsNFwoXCR2MVwpCi0gMmM4Ogk4MzQ4ICAgICAgCWxiCVwkdjAsOFwoXCR2MVwpCi0gMmNhOgk4MzUwICAgICAgCWxiCVwkdjAsMTZcKFwkdjFcKQotIDJjYzoJZjAyMCA4MzQwIAlsYglcJHYwLDMyXChcJHYxXCkKLSAyZDA6CWYwNDAgODM0MCAJbGIJXCR2MCw2NFwoXCR2MVwpCi0gMmQ0OglmMDgwIDgzNDAgCWxiCVwkdjAsMTI4XChcJHYxXCkKLSAyZDg6CWYxMDAgODM0MCAJbGIJXCR2MCwyNTZcKFwkdjFcKQotIDJkYzoJZjIwMCA4MzQwIAlsYglcJHYwLDUxMlwoXCR2MVwpCi0gMmUwOglmNDAwIDgzNDAgCWxiCVwkdjAsMTAyNFwoXCR2MVwpCi0gMmU0OglmMDAxIDgzNDAgCWxiCVwkdjAsMjA0OFwoXCR2MVwpCi0gMmU4OglmN2ZmIDgzNWYgCWxiCVwkdjAsLTFcKFwkdjFcKQotIDJlYzoJZjdmZiA4MzVlIAlsYglcJHYwLC0yXChcJHYxXCkKLSAyZjA6CWY3ZmYgODM1ZCAJbGIJXCR2MCwtM1woXCR2MVwpCi0gMmY0OglmN2ZmIDgzNWMgCWxiCVwkdjAsLTRcKFwkdjFcKQotIDJmODoJZjdmZiA4MzU4IAlsYglcJHYwLC04XChcJHYxXCkKLSAyZmM6CWY3ZmYgODM1MCAJbGIJXCR2MCwtMTZcKFwkdjFcKQotIDMwMDoJZjdmZiA4MzQwIAlsYglcJHYwLC0zMlwoXCR2MVwpCi0gMzA0OglmN2RmIDgzNDAgCWxiCVwkdjAsLTY0XChcJHYxXCkKLSAzMDg6CWY3OWYgODM0MCAJbGIJXCR2MCwtMTI4XChcJHYxXCkKLSAzMGM6CWY3MWYgODM0MCAJbGIJXCR2MCwtMjU2XChcJHYxXCkKLSAzMTA6CWY2MWYgODM0MCAJbGIJXCR2MCwtNTEyXChcJHYxXCkKLSAzMTQ6CWY0MWYgODM0MCAJbGIJXCR2MCwtMTAyNFwoXCR2MVwpCi0gMzE4OglmMDFmIDgzNDAgCWxiCVwkdjAsLTIwNDhcKFwkdjFcKQotIDMxYzoJYTM0MCAgICAgIAlsYnUJXCR2MCwwXChcJHYxXCkKLSAzMWU6CWEzNDEgICAgICAJbGJ1CVwkdjAsMVwoXCR2MVwpCi0gMzIwOglhMzQyICAgICAgCWxidQlcJHYwLDJcKFwkdjFcKQotIDMyMjoJYTM0MyAgICAgIAlsYnUJXCR2MCwzXChcJHYxXCkKLSAzMjQ6CWEzNDQgICAgICAJbGJ1CVwkdjAsNFwoXCR2MVwpCi0gMzI2OglhMzQ4ICAgICAgCWxidQlcJHYwLDhcKFwkdjFcKQotIDMyODoJYTM1MCAgICAgIAlsYnUJXCR2MCwxNlwoXCR2MVwpCi0gMzJhOglmMDIwIGEzNDAgCWxidQlcJHYwLDMyXChcJHYxXCkKLSAzMmU6CWYwNDAgYTM0MCAJbGJ1CVwkdjAsNjRcKFwkdjFcKQotIDMzMjoJZjA4MCBhMzQwIAlsYnUJXCR2MCwxMjhcKFwkdjFcKQotIDMzNjoJZjEwMCBhMzQwIAlsYnUJXCR2MCwyNTZcKFwkdjFcKQotIDMzYToJZjIwMCBhMzQwIAlsYnUJXCR2MCw1MTJcKFwkdjFcKQotIDMzZToJZjQwMCBhMzQwIAlsYnUJXCR2MCwxMDI0XChcJHYxXCkKLSAzNDI6CWYwMDEgYTM0MCAJbGJ1CVwkdjAsMjA0OFwoXCR2MVwpCi0gMzQ2OglmN2ZmIGEzNWYgCWxidQlcJHYwLC0xXChcJHYxXCkKLSAzNGE6CWY3ZmYgYTM1ZSAJbGJ1CVwkdjAsLTJcKFwkdjFcKQotIDM0ZToJZjdmZiBhMzVkIAlsYnUJXCR2MCwtM1woXCR2MVwpCi0gMzUyOglmN2ZmIGEzNWMgCWxidQlcJHYwLC00XChcJHYxXCkKLSAzNTY6CWY3ZmYgYTM1OCAJbGJ1CVwkdjAsLThcKFwkdjFcKQotIDM1YToJZjdmZiBhMzUwIAlsYnUJXCR2MCwtMTZcKFwkdjFcKQotIDM1ZToJZjdmZiBhMzQwIAlsYnUJXCR2MCwtMzJcKFwkdjFcKQotIDM2MjoJZjdkZiBhMzQwIAlsYnUJXCR2MCwtNjRcKFwkdjFcKQotIDM2NjoJZjc5ZiBhMzQwIAlsYnUJXCR2MCwtMTI4XChcJHYxXCkKLSAzNmE6CWY3MWYgYTM0MCAJbGJ1CVwkdjAsLTI1NlwoXCR2MVwpCi0gMzZlOglmNjFmIGEzNDAgCWxidQlcJHYwLC01MTJcKFwkdjFcKQotIDM3MjoJZjQxZiBhMzQwIAlsYnUJXCR2MCwtMTAyNFwoXCR2MVwpCi0gMzc2OglmMDFmIGEzNDAgCWxidQlcJHYwLC0yMDQ4XChcJHYxXCkKLSAzN2E6CTdiNDAgICAgICAJc2QJXCR2MCwwXChcJHYxXCkKLSAzN2M6CWYwMDAgN2I0MSAJc2QJXCR2MCwxXChcJHYxXCkKLSAzODA6CWYwMDAgN2I0MiAJc2QJXCR2MCwyXChcJHYxXCkKLSAzODQ6CWYwMDAgN2I0MyAJc2QJXCR2MCwzXChcJHYxXCkKLSAzODg6CWYwMDAgN2I0NCAJc2QJXCR2MCw0XChcJHYxXCkKLSAzOGM6CTdiNDEgICAgICAJc2QJXCR2MCw4XChcJHYxXCkKLSAzOGU6CTdiNDIgICAgICAJc2QJXCR2MCwxNlwoXCR2MVwpCi0gMzkwOgk3YjQ0ICAgICAgCXNkCVwkdjAsMzJcKFwkdjFcKQotIDM5MjoJN2I0OCAgICAgIAlzZAlcJHYwLDY0XChcJHYxXCkKLSAzOTQ6CTdiNTAgICAgICAJc2QJXCR2MCwxMjhcKFwkdjFcKQotIDM5NjoJZjEwMCA3YjQwIAlzZAlcJHYwLDI1NlwoXCR2MVwpCi0gMzlhOglmMjAwIDdiNDAgCXNkCVwkdjAsNTEyXChcJHYxXCkKLSAzOWU6CWY0MDAgN2I0MCAJc2QJXCR2MCwxMDI0XChcJHYxXCkKLSAzYTI6CWYwMDEgN2I0MCAJc2QJXCR2MCwyMDQ4XChcJHYxXCkKLSAzYTY6CWY3ZmYgN2I1ZiAJc2QJXCR2MCwtMVwoXCR2MVwpCi0gM2FhOglmN2ZmIDdiNWUgCXNkCVwkdjAsLTJcKFwkdjFcKQotIDNhZToJZjdmZiA3YjVkIAlzZAlcJHYwLC0zXChcJHYxXCkKLSAzYjI6CWY3ZmYgN2I1YyAJc2QJXCR2MCwtNFwoXCR2MVwpCi0gM2I2OglmN2ZmIDdiNTggCXNkCVwkdjAsLThcKFwkdjFcKQotIDNiYToJZjdmZiA3YjUwIAlzZAlcJHYwLC0xNlwoXCR2MVwpCi0gM2JlOglmN2ZmIDdiNDAgCXNkCVwkdjAsLTMyXChcJHYxXCkKLSAzYzI6CWY3ZGYgN2I0MCAJc2QJXCR2MCwtNjRcKFwkdjFcKQotIDNjNjoJZjc5ZiA3YjQwIAlzZAlcJHYwLC0xMjhcKFwkdjFcKQotIDNjYToJZjcxZiA3YjQwIAlzZAlcJHYwLC0yNTZcKFwkdjFcKQotIDNjZToJZjYxZiA3YjQwIAlzZAlcJHYwLC01MTJcKFwkdjFcKQotIDNkMjoJZjQxZiA3YjQwIAlzZAlcJHYwLC0xMDI0XChcJHYxXCkKLSAzZDY6CWYwMWYgN2I0MCAJc2QJXCR2MCwtMjA0OFwoXCR2MVwpCi0gM2RhOglmOTQwICAgICAgCXNkCVwkdjAsMFwoXCRzcFwpCi0gM2RjOglmMDAwIGY5NDEgCXNkCVwkdjAsMVwoXCRzcFwpCi0gM2UwOglmMDAwIGY5NDIgCXNkCVwkdjAsMlwoXCRzcFwpCi0gM2U0OglmMDAwIGY5NDMgCXNkCVwkdjAsM1woXCRzcFwpCi0gM2U4OglmMDAwIGY5NDQgCXNkCVwkdjAsNFwoXCRzcFwpCi0gM2VjOglmOTQxICAgICAgCXNkCVwkdjAsOFwoXCRzcFwpCi0gM2VlOglmOTQyICAgICAgCXNkCVwkdjAsMTZcKFwkc3BcKQotIDNmMDoJZjk0NCAgICAgIAlzZAlcJHYwLDMyXChcJHNwXCkKLSAzZjI6CWY5NDggICAgICAJc2QJXCR2MCw2NFwoXCRzcFwpCi0gM2Y0OglmOTUwICAgICAgCXNkCVwkdjAsMTI4XChcJHNwXCkKLSAzZjY6CWYxMDAgZjk0MCAJc2QJXCR2MCwyNTZcKFwkc3BcKQotIDNmYToJZjIwMCBmOTQwIAlzZAlcJHYwLDUxMlwoXCRzcFwpCi0gM2ZlOglmNDAwIGY5NDAgCXNkCVwkdjAsMTAyNFwoXCRzcFwpCi0gNDAyOglmMDAxIGY5NDAgCXNkCVwkdjAsMjA0OFwoXCRzcFwpCi0gNDA2OglmN2ZmIGY5NWYgCXNkCVwkdjAsLTFcKFwkc3BcKQotIDQwYToJZjdmZiBmOTVlIAlzZAlcJHYwLC0yXChcJHNwXCkKLSA0MGU6CWY3ZmYgZjk1ZCAJc2QJXCR2MCwtM1woXCRzcFwpCi0gNDEyOglmN2ZmIGY5NWMgCXNkCVwkdjAsLTRcKFwkc3BcKQotIDQxNjoJZjdmZiBmOTU4IAlzZAlcJHYwLC04XChcJHNwXCkKLSA0MWE6CWY3ZmYgZjk1MCAJc2QJXCR2MCwtMTZcKFwkc3BcKQotIDQxZToJZjdmZiBmOTQwIAlzZAlcJHYwLC0zMlwoXCRzcFwpCi0gNDIyOglmN2RmIGY5NDAgCXNkCVwkdjAsLTY0XChcJHNwXCkKLSA0MjY6CWY3OWYgZjk0MCAJc2QJXCR2MCwtMTI4XChcJHNwXCkKLSA0MmE6CWY3MWYgZjk0MCAJc2QJXCR2MCwtMjU2XChcJHNwXCkKLSA0MmU6CWY2MWYgZjk0MCAJc2QJXCR2MCwtNTEyXChcJHNwXCkKLSA0MzI6CWY0MWYgZjk0MCAJc2QJXCR2MCwtMTAyNFwoXCRzcFwpCi0gNDM2OglmMDFmIGY5NDAgCXNkCVwkdjAsLTIwNDhcKFwkc3BcKQotIDQzYToJZmEwMCAgICAgIAlzZAlcJHJhLDBcKFwkc3BcKQotIDQzYzoJZjAwMCBmYTAxIAlzZAlcJHJhLDFcKFwkc3BcKQotIDQ0MDoJZjAwMCBmYTAyIAlzZAlcJHJhLDJcKFwkc3BcKQotIDQ0NDoJZjAwMCBmYTAzIAlzZAlcJHJhLDNcKFwkc3BcKQotIDQ0ODoJZjAwMCBmYTA0IAlzZAlcJHJhLDRcKFwkc3BcKQotIDQ0YzoJZmEwMSAgICAgIAlzZAlcJHJhLDhcKFwkc3BcKQotIDQ0ZToJZmEwMiAgICAgIAlzZAlcJHJhLDE2XChcJHNwXCkKLSA0NTA6CWZhMDQgICAgICAJc2QJXCRyYSwzMlwoXCRzcFwpCi0gNDUyOglmYTA4ICAgICAgCXNkCVwkcmEsNjRcKFwkc3BcKQotIDQ1NDoJZmExMCAgICAgIAlzZAlcJHJhLDEyOFwoXCRzcFwpCi0gNDU2OglmYTIwICAgICAgCXNkCVwkcmEsMjU2XChcJHNwXCkKLSA0NTg6CWZhNDAgICAgICAJc2QJXCRyYSw1MTJcKFwkc3BcKQotIDQ1YToJZmE4MCAgICAgIAlzZAlcJHJhLDEwMjRcKFwkc3BcKQotIDQ1YzoJZjAwMSBmYTAwIAlzZAlcJHJhLDIwNDhcKFwkc3BcKQotIDQ2MDoJZjdmZiBmYTFmIAlzZAlcJHJhLC0xXChcJHNwXCkKLSA0NjQ6CWY3ZmYgZmExZSAJc2QJXCRyYSwtMlwoXCRzcFwpCi0gNDY4OglmN2ZmIGZhMWQgCXNkCVwkcmEsLTNcKFwkc3BcKQotIDQ2YzoJZjdmZiBmYTFjIAlzZAlcJHJhLC00XChcJHNwXCkKLSA0NzA6CWY3ZmYgZmExOCAJc2QJXCRyYSwtOFwoXCRzcFwpCi0gNDc0OglmN2ZmIGZhMTAgCXNkCVwkcmEsLTE2XChcJHNwXCkKLSA0Nzg6CWY3ZmYgZmEwMCAJc2QJXCRyYSwtMzJcKFwkc3BcKQotIDQ3YzoJZjdkZiBmYTAwIAlzZAlcJHJhLC02NFwoXCRzcFwpCi0gNDgwOglmNzlmIGZhMDAgCXNkCVwkcmEsLTEyOFwoXCRzcFwpCi0gNDg0OglmNzFmIGZhMDAgCXNkCVwkcmEsLTI1NlwoXCRzcFwpCi0gNDg4OglmNjFmIGZhMDAgCXNkCVwkcmEsLTUxMlwoXCRzcFwpCi0gNDhjOglmNDFmIGZhMDAgCXNkCVwkcmEsLTEwMjRcKFwkc3BcKQotIDQ5MDoJZjAxZiBmYTAwIAlzZAlcJHJhLC0yMDQ4XChcJHNwXCkKLSA0OTQ6CWRiNDAgICAgICAJc3cJXCR2MCwwXChcJHYxXCkKLSA0OTY6CWYwMDAgZGI0MSAJc3cJXCR2MCwxXChcJHYxXCkKLSA0OWE6CWYwMDAgZGI0MiAJc3cJXCR2MCwyXChcJHYxXCkKLSA0OWU6CWYwMDAgZGI0MyAJc3cJXCR2MCwzXChcJHYxXCkKLSA0YTI6CWRiNDEgICAgICAJc3cJXCR2MCw0XChcJHYxXCkKLSA0YTQ6CWRiNDIgICAgICAJc3cJXCR2MCw4XChcJHYxXCkKLSA0YTY6CWRiNDQgICAgICAJc3cJXCR2MCwxNlwoXCR2MVwpCi0gNGE4OglkYjQ4ICAgICAgCXN3CVwkdjAsMzJcKFwkdjFcKQotIDRhYToJZGI1MCAgICAgIAlzdwlcJHYwLDY0XChcJHYxXCkKLSA0YWM6CWYwODAgZGI0MCAJc3cJXCR2MCwxMjhcKFwkdjFcKQotIDRiMDoJZjEwMCBkYjQwIAlzdwlcJHYwLDI1NlwoXCR2MVwpCi0gNGI0OglmMjAwIGRiNDAgCXN3CVwkdjAsNTEyXChcJHYxXCkKLSA0Yjg6CWY0MDAgZGI0MCAJc3cJXCR2MCwxMDI0XChcJHYxXCkKLSA0YmM6CWYwMDEgZGI0MCAJc3cJXCR2MCwyMDQ4XChcJHYxXCkKLSA0YzA6CWY3ZmYgZGI1ZiAJc3cJXCR2MCwtMVwoXCR2MVwpCi0gNGM0OglmN2ZmIGRiNWUgCXN3CVwkdjAsLTJcKFwkdjFcKQotIDRjODoJZjdmZiBkYjVkIAlzdwlcJHYwLC0zXChcJHYxXCkKLSA0Y2M6CWY3ZmYgZGI1YyAJc3cJXCR2MCwtNFwoXCR2MVwpCi0gNGQwOglmN2ZmIGRiNTggCXN3CVwkdjAsLThcKFwkdjFcKQotIDRkNDoJZjdmZiBkYjUwIAlzdwlcJHYwLC0xNlwoXCR2MVwpCi0gNGQ4OglmN2ZmIGRiNDAgCXN3CVwkdjAsLTMyXChcJHYxXCkKLSA0ZGM6CWY3ZGYgZGI0MCAJc3cJXCR2MCwtNjRcKFwkdjFcKQotIDRlMDoJZjc5ZiBkYjQwIAlzdwlcJHYwLC0xMjhcKFwkdjFcKQotIDRlNDoJZjcxZiBkYjQwIAlzdwlcJHYwLC0yNTZcKFwkdjFcKQotIDRlODoJZjYxZiBkYjQwIAlzdwlcJHYwLC01MTJcKFwkdjFcKQotIDRlYzoJZjQxZiBkYjQwIAlzdwlcJHYwLC0xMDI0XChcJHYxXCkKLSA0ZjA6CWYwMWYgZGI0MCAJc3cJXCR2MCwtMjA0OFwoXCR2MVwpCi0gNGY0OglkMjAwICAgICAgCXN3CVwkdjAsMFwoXCRzcFwpCi0gNGY2OglmMDAwIGQyMDEgCXN3CVwkdjAsMVwoXCRzcFwpCi0gNGZhOglmMDAwIGQyMDIgCXN3CVwkdjAsMlwoXCRzcFwpCi0gNGZlOglmMDAwIGQyMDMgCXN3CVwkdjAsM1woXCRzcFwpCi0gNTAyOglkMjAxICAgICAgCXN3CVwkdjAsNFwoXCRzcFwpCi0gNTA0OglkMjAyICAgICAgCXN3CVwkdjAsOFwoXCRzcFwpCi0gNTA2OglkMjA0ICAgICAgCXN3CVwkdjAsMTZcKFwkc3BcKQotIDUwODoJZDIwOCAgICAgIAlzdwlcJHYwLDMyXChcJHNwXCkKLSA1MGE6CWQyMTAgICAgICAJc3cJXCR2MCw2NFwoXCRzcFwpCi0gNTBjOglkMjIwICAgICAgCXN3CVwkdjAsMTI4XChcJHNwXCkKLSA1MGU6CWQyNDAgICAgICAJc3cJXCR2MCwyNTZcKFwkc3BcKQotIDUxMDoJZDI4MCAgICAgIAlzdwlcJHYwLDUxMlwoXCRzcFwpCi0gNTEyOglmNDAwIGQyMDAgCXN3CVwkdjAsMTAyNFwoXCRzcFwpCi0gNTE2OglmMDAxIGQyMDAgCXN3CVwkdjAsMjA0OFwoXCRzcFwpCi0gNTFhOglmN2ZmIGQyMWYgCXN3CVwkdjAsLTFcKFwkc3BcKQotIDUxZToJZjdmZiBkMjFlIAlzdwlcJHYwLC0yXChcJHNwXCkKLSA1MjI6CWY3ZmYgZDIxZCAJc3cJXCR2MCwtM1woXCRzcFwpCi0gNTI2OglmN2ZmIGQyMWMgCXN3CVwkdjAsLTRcKFwkc3BcKQotIDUyYToJZjdmZiBkMjE4IAlzdwlcJHYwLC04XChcJHNwXCkKLSA1MmU6CWY3ZmYgZDIxMCAJc3cJXCR2MCwtMTZcKFwkc3BcKQotIDUzMjoJZjdmZiBkMjAwIAlzdwlcJHYwLC0zMlwoXCRzcFwpCi0gNTM2OglmN2RmIGQyMDAgCXN3CVwkdjAsLTY0XChcJHNwXCkKLSA1M2E6CWY3OWYgZDIwMCAJc3cJXCR2MCwtMTI4XChcJHNwXCkKLSA1M2U6CWY3MWYgZDIwMCAJc3cJXCR2MCwtMjU2XChcJHNwXCkKLSA1NDI6CWY2MWYgZDIwMCAJc3cJXCR2MCwtNTEyXChcJHNwXCkKLSA1NDY6CWY0MWYgZDIwMCAJc3cJXCR2MCwtMTAyNFwoXCRzcFwpCi0gNTRhOglmMDFmIGQyMDAgCXN3CVwkdjAsLTIwNDhcKFwkc3BcKQotIDU0ZToJNjIwMCAgICAgIAlzdwlcJHJhLDBcKFwkc3BcKQotIDU1MDoJZjAwMCA2MjAxIAlzdwlcJHJhLDFcKFwkc3BcKQotIDU1NDoJZjAwMCA2MjAyIAlzdwlcJHJhLDJcKFwkc3BcKQotIDU1ODoJZjAwMCA2MjAzIAlzdwlcJHJhLDNcKFwkc3BcKQotIDU1YzoJNjIwMSAgICAgIAlzdwlcJHJhLDRcKFwkc3BcKQotIDU1ZToJNjIwMiAgICAgIAlzdwlcJHJhLDhcKFwkc3BcKQotIDU2MDoJNjIwNCAgICAgIAlzdwlcJHJhLDE2XChcJHNwXCkKLSA1NjI6CTYyMDggICAgICAJc3cJXCRyYSwzMlwoXCRzcFwpCi0gNTY0Ogk2MjEwICAgICAgCXN3CVwkcmEsNjRcKFwkc3BcKQotIDU2NjoJNjIyMCAgICAgIAlzdwlcJHJhLDEyOFwoXCRzcFwpCi0gNTY4Ogk2MjQwICAgICAgCXN3CVwkcmEsMjU2XChcJHNwXCkKLSA1NmE6CTYyODAgICAgICAJc3cJXCRyYSw1MTJcKFwkc3BcKQotIDU2YzoJZjQwMCA2MjAwIAlzdwlcJHJhLDEwMjRcKFwkc3BcKQotIDU3MDoJZjAwMSA2MjAwIAlzdwlcJHJhLDIwNDhcKFwkc3BcKQotIDU3NDoJZjdmZiA2MjFmIAlzdwlcJHJhLC0xXChcJHNwXCkKLSA1Nzg6CWY3ZmYgNjIxZSAJc3cJXCRyYSwtMlwoXCRzcFwpCi0gNTdjOglmN2ZmIDYyMWQgCXN3CVwkcmEsLTNcKFwkc3BcKQotIDU4MDoJZjdmZiA2MjFjIAlzdwlcJHJhLC00XChcJHNwXCkKLSA1ODQ6CWY3ZmYgNjIxOCAJc3cJXCRyYSwtOFwoXCRzcFwpCi0gNTg4OglmN2ZmIDYyMTAgCXN3CVwkcmEsLTE2XChcJHNwXCkKLSA1OGM6CWY3ZmYgNjIwMCAJc3cJXCRyYSwtMzJcKFwkc3BcKQotIDU5MDoJZjdkZiA2MjAwIAlzdwlcJHJhLC02NFwoXCRzcFwpCi0gNTk0OglmNzlmIDYyMDAgCXN3CVwkcmEsLTEyOFwoXCRzcFwpCi0gNTk4OglmNzFmIDYyMDAgCXN3CVwkcmEsLTI1NlwoXCRzcFwpCi0gNTljOglmNjFmIDYyMDAgCXN3CVwkcmEsLTUxMlwoXCRzcFwpCi0gNWEwOglmNDFmIDYyMDAgCXN3CVwkcmEsLTEwMjRcKFwkc3BcKQotIDVhNDoJZjAxZiA2MjAwIAlzdwlcJHJhLC0yMDQ4XChcJHNwXCkKLSA1YTg6CWNiNDAgICAgICAJc2gJXCR2MCwwXChcJHYxXCkKLSA1YWE6CWYwMDAgY2I0MSAJc2gJXCR2MCwxXChcJHYxXCkKLSA1YWU6CWNiNDEgICAgICAJc2gJXCR2MCwyXChcJHYxXCkKLSA1YjA6CWYwMDAgY2I0MyAJc2gJXCR2MCwzXChcJHYxXCkKLSA1YjQ6CWNiNDIgICAgICAJc2gJXCR2MCw0XChcJHYxXCkKLSA1YjY6CWNiNDQgICAgICAJc2gJXCR2MCw4XChcJHYxXCkKLSA1Yjg6CWNiNDggICAgICAJc2gJXCR2MCwxNlwoXCR2MVwpCi0gNWJhOgljYjUwICAgICAgCXNoCVwkdjAsMzJcKFwkdjFcKQotIDViYzoJZjA0MCBjYjQwIAlzaAlcJHYwLDY0XChcJHYxXCkKLSA1YzA6CWYwODAgY2I0MCAJc2gJXCR2MCwxMjhcKFwkdjFcKQotIDVjNDoJZjEwMCBjYjQwIAlzaAlcJHYwLDI1NlwoXCR2MVwpCi0gNWM4OglmMjAwIGNiNDAgCXNoCVwkdjAsNTEyXChcJHYxXCkKLSA1Y2M6CWY0MDAgY2I0MCAJc2gJXCR2MCwxMDI0XChcJHYxXCkKLSA1ZDA6CWYwMDEgY2I0MCAJc2gJXCR2MCwyMDQ4XChcJHYxXCkKLSA1ZDQ6CWY3ZmYgY2I1ZiAJc2gJXCR2MCwtMVwoXCR2MVwpCi0gNWQ4OglmN2ZmIGNiNWUgCXNoCVwkdjAsLTJcKFwkdjFcKQotIDVkYzoJZjdmZiBjYjVkIAlzaAlcJHYwLC0zXChcJHYxXCkKLSA1ZTA6CWY3ZmYgY2I1YyAJc2gJXCR2MCwtNFwoXCR2MVwpCi0gNWU0OglmN2ZmIGNiNTggCXNoCVwkdjAsLThcKFwkdjFcKQotIDVlODoJZjdmZiBjYjUwIAlzaAlcJHYwLC0xNlwoXCR2MVwpCi0gNWVjOglmN2ZmIGNiNDAgCXNoCVwkdjAsLTMyXChcJHYxXCkKLSA1ZjA6CWY3ZGYgY2I0MCAJc2gJXCR2MCwtNjRcKFwkdjFcKQotIDVmNDoJZjc5ZiBjYjQwIAlzaAlcJHYwLC0xMjhcKFwkdjFcKQotIDVmODoJZjcxZiBjYjQwIAlzaAlcJHYwLC0yNTZcKFwkdjFcKQotIDVmYzoJZjYxZiBjYjQwIAlzaAlcJHYwLC01MTJcKFwkdjFcKQotIDYwMDoJZjQxZiBjYjQwIAlzaAlcJHYwLC0xMDI0XChcJHYxXCkKLSA2MDQ6CWYwMWYgY2I0MCAJc2gJXCR2MCwtMjA0OFwoXCR2MVwpCi0gNjA4OgljMzQwICAgICAgCXNiCVwkdjAsMFwoXCR2MVwpCi0gNjBhOgljMzQxICAgICAgCXNiCVwkdjAsMVwoXCR2MVwpCi0gNjBjOgljMzQyICAgICAgCXNiCVwkdjAsMlwoXCR2MVwpCi0gNjBlOgljMzQzICAgICAgCXNiCVwkdjAsM1woXCR2MVwpCi0gNjEwOgljMzQ0ICAgICAgCXNiCVwkdjAsNFwoXCR2MVwpCi0gNjEyOgljMzQ4ICAgICAgCXNiCVwkdjAsOFwoXCR2MVwpCi0gNjE0OgljMzUwICAgICAgCXNiCVwkdjAsMTZcKFwkdjFcKQotIDYxNjoJZjAyMCBjMzQwIAlzYglcJHYwLDMyXChcJHYxXCkKLSA2MWE6CWYwNDAgYzM0MCAJc2IJXCR2MCw2NFwoXCR2MVwpCi0gNjFlOglmMDgwIGMzNDAgCXNiCVwkdjAsMTI4XChcJHYxXCkKLSA2MjI6CWYxMDAgYzM0MCAJc2IJXCR2MCwyNTZcKFwkdjFcKQotIDYyNjoJZjIwMCBjMzQwIAlzYglcJHYwLDUxMlwoXCR2MVwpCi0gNjJhOglmNDAwIGMzNDAgCXNiCVwkdjAsMTAyNFwoXCR2MVwpCi0gNjJlOglmMDAxIGMzNDAgCXNiCVwkdjAsMjA0OFwoXCR2MVwpCi0gNjMyOglmN2ZmIGMzNWYgCXNiCVwkdjAsLTFcKFwkdjFcKQotIDYzNjoJZjdmZiBjMzVlIAlzYglcJHYwLC0yXChcJHYxXCkKLSA2M2E6CWY3ZmYgYzM1ZCAJc2IJXCR2MCwtM1woXCR2MVwpCi0gNjNlOglmN2ZmIGMzNWMgCXNiCVwkdjAsLTRcKFwkdjFcKQotIDY0MjoJZjdmZiBjMzU4IAlzYglcJHYwLC04XChcJHYxXCkKLSA2NDY6CWY3ZmYgYzM1MCAJc2IJXCR2MCwtMTZcKFwkdjFcKQotIDY0YToJZjdmZiBjMzQwIAlzYglcJHYwLC0zMlwoXCR2MVwpCi0gNjRlOglmN2RmIGMzNDAgCXNiCVwkdjAsLTY0XChcJHYxXCkKLSA2NTI6CWY3OWYgYzM0MCAJc2IJXCR2MCwtMTI4XChcJHYxXCkKLSA2NTY6CWY3MWYgYzM0MCAJc2IJXCR2MCwtMjU2XChcJHYxXCkKLSA2NWE6CWY2MWYgYzM0MCAJc2IJXCR2MCwtNTEyXChcJHYxXCkKLSA2NWU6CWY0MWYgYzM0MCAJc2IJXCR2MCwtMTAyNFwoXCR2MVwpCi0gNjYyOglmMDFmIGMzNDAgCXNiCVwkdjAsLTIwNDhcKFwkdjFcKQotIDY2NjoJNmEwMCAgICAgIAlsaQlcJHYwLDAKLSA2Njg6CTZhMDEgICAgICAJbGkJXCR2MCwxCi0gNjZhOglmMTAwIDZhMDAgCWxpCVwkdjAsMjU2Ci0gNjZlOgk2NzVlICAgICAgCW1vdmUJXCR2MCxcJHM4Ci0gNjcwOgk2NTkyICAgICAgCW1vdmUJXCRzNCxcJHYwCi0gNjcyOgk0MzUwICAgICAgCWRhZGRpdQlcJHYwLFwkdjEsMAotIDY3NDoJNDM1MSAgICAgIAlkYWRkaXUJXCR2MCxcJHYxLDEKLSA2NzY6CTQzNWYgICAgICAJZGFkZGl1CVwkdjAsXCR2MSwtMQotIDY3ODoJZjAxMCA0MzUwIAlkYWRkaXUJXCR2MCxcJHYxLDE2Ci0gNjdjOglmN2ZmIDQzNTAgCWRhZGRpdQlcJHYwLFwkdjEsLTE2Ci0gNjgwOgllMzg4ICAgICAgCWRhZGR1CVwkdjAsXCR2MSxcJGEwCi0gNjgyOglmZDQwICAgICAgCWRhZGRpdQlcJHYwLDAKLSA2ODQ6CWZkNDEgICAgICAJZGFkZGl1CVwkdjAsMQotIDY4NjoJZmQ1ZiAgICAgIAlkYWRkaXUJXCR2MCwtMQotIDY4ODoJZjAyMCBmZDQwIAlkYWRkaXUJXCR2MCwzMgotIDY4YzoJZjdmZiBmZDQwIAlkYWRkaXUJXCR2MCwtMzIKLSA2OTA6CWYwODAgZmQ0MCAJZGFkZGl1CVwkdjAsMTI4Ci0gNjk0OglmNzlmIGZkNDAgCWRhZGRpdQlcJHYwLC0xMjgKLSA2OTg6CWYxN2YgZmU0OCAJZGxhCVwkdjAsMCA8ZGF0YTE+Ci0gNjljOglmMDgwIGZlNDAgCWRsYQlcJHYwLDcxYyA8ZGF0YTI+Ci0gNmEwOglmMWMwIGZlNDggCWRsYQlcJHYwLDg2OCA8YmFyPgotIDZhNDoJZjI4MCBmZTRjIAlkbGEJXCR2MCw5MzAgPHF1dXg+Ci0gNmE4OglmYjAwICAgICAgCWRhZGRpdQlcJHNwLDAKLSA2YWE6CWYwMDAgZmIwMSAJZGFkZGl1CVwkc3AsMQotIDZhZToJZjdmZiBmYjFmIAlkYWRkaXUJXCRzcCwtMQotIDZiMjoJZmIyMCAgICAgIAlkYWRkaXUJXCRzcCwyNTYKLSA2YjQ6CWZiZTAgICAgICAJZGFkZGl1CVwkc3AsLTI1NgotIDZiNjoJZmY0MCAgICAgIAlkYWRkaXUJXCR2MCxcJHNwLDAKLSA2Yjg6CWYwMDAgZmY0MSAJZGFkZGl1CVwkdjAsXCRzcCwxCi0gNmJjOglmN2ZmIGZmNWYgCWRhZGRpdQlcJHYwLFwkc3AsLTEKLSA2YzA6CWZmNDggICAgICAJZGFkZGl1CVwkdjAsXCRzcCwzMgotIDZjMjoJZjdmZiBmZjQwIAlkYWRkaXUJXCR2MCxcJHNwLC0zMgotIDZjNjoJZjA4MCBmZjQwIAlkYWRkaXUJXCR2MCxcJHNwLDEyOAotIDZjYToJZjc5ZiBmZjQwIAlkYWRkaXUJXCR2MCxcJHNwLC0xMjgKLSA2Y2U6CTQzNDAgICAgICAJYWRkaXUJXCR2MCxcJHYxLDAKLSA2ZDA6CTQzNDEgICAgICAJYWRkaXUJXCR2MCxcJHYxLDEKLSA2ZDI6CTQzNGYgICAgICAJYWRkaXUJXCR2MCxcJHYxLC0xCi0gNmQ0OglmMDEwIDQzNDAgCWFkZGl1CVwkdjAsXCR2MSwxNgotIDZkODoJZjdmZiA0MzQwIAlhZGRpdQlcJHYwLFwkdjEsLTE2Ci0gNmRjOgllMzg5ICAgICAgCWFkZHUJXCR2MCxcJHYxLFwkYTAKLSA2ZGU6CTRhMDAgICAgICAJYWRkaXUJXCR2MCwwCi0gNmUwOgk0YTAxICAgICAgCWFkZGl1CVwkdjAsMQotIDZlMjoJNGFmZiAgICAgIAlhZGRpdQlcJHYwLC0xCi0gNmU0Ogk0YTIwICAgICAgCWFkZGl1CVwkdjAsMzIKLSA2ZTY6CTRhZTAgICAgICAJYWRkaXUJXCR2MCwtMzIKLSA2ZTg6CWYwODAgNGEwMCAJYWRkaXUJXCR2MCwxMjgKLSA2ZWM6CTRhODAgICAgICAJYWRkaXUJXCR2MCwtMTI4Ci0gNmVlOglmMTFmIDBhMTQgCWxhCVwkdjAsMCA8ZGF0YTE+Ci0gNmYyOgkwYTBiICAgICAgCWxhCVwkdjAsNzFjIDxkYXRhMj4KLSA2ZjQ6CTBhNWQgICAgICAJbGEJXCR2MCw4NjggPGJhcj4KLSA2ZjY6CTBhOGYgICAgICAJbGEJXCR2MCw5MzAgPHF1dXg+Ci0gNmY4Ogk2MzAwICAgICAgCWFkZGl1CVwkc3AsMAotIDZmYToJZjAwMCA2MzAxIAlhZGRpdQlcJHNwLDEKLSA2ZmU6CWY3ZmYgNjMxZiAJYWRkaXUJXCRzcCwtMQotIDcwMjoJNjMyMCAgICAgIAlhZGRpdQlcJHNwLDI1NgotIDcwNDoJNjNlMCAgICAgIAlhZGRpdQlcJHNwLC0yNTYKLSA3MDY6CTAyMDAgICAgICAJYWRkaXUJXCR2MCxcJHNwLDAKLSA3MDg6CWYwMDAgMDIwMSAJYWRkaXUJXCR2MCxcJHNwLDEKLSA3MGM6CWY3ZmYgMDIxZiAJYWRkaXUJXCR2MCxcJHNwLC0xCi0gNzEwOgkwMjA4ICAgICAgCWFkZGl1CVwkdjAsXCRzcCwzMgotIDcxMjoJZjdmZiAwMjAwIAlhZGRpdQlcJHYwLFwkc3AsLTMyCi0gNzE2OgkwMjIwICAgICAgCWFkZGl1CVwkdjAsXCRzcCwxMjgKLSA3MTg6CWY3OWYgMDIwMCAJYWRkaXUJXCR2MCxcJHNwLC0xMjgKLQotMCswMDA3MWMgPGRhdGEyPjoKLSA3MWM6CTAwMDAwMDAwIAlub3AKLQotMCswMDA3MjAgPGluc25zMj46Ci0gNzIwOgllMzhhICAgICAgCWRzdWJ1CVwkdjAsXCR2MSxcJGEwCi0gNzIyOgllMzhiICAgICAgCXN1YnUJXCR2MCxcJHYxLFwkYTAKLSA3MjQ6CWVhNmIgICAgICAJbmVnCVwkdjAsXCR2MQotIDcyNjoJZWE2YyAgICAgIAlhbmQJXCR2MCxcJHYxCi0gNzI4OgllYTZkICAgICAgCW9yCVwkdjAsXCR2MQotIDcyYToJZWE2ZSAgICAgIAl4b3IJXCR2MCxcJHYxCi0gNzJjOgllYTZmICAgICAgCW5vdAlcJHYwLFwkdjEKLSA3MmU6CTUyMDAgICAgICAJc2x0aQlcJHYwLDAKLSA3MzA6CTUyMDEgICAgICAJc2x0aQlcJHYwLDEKLSA3MzI6CWY3ZmYgNTIxZiAJc2x0aQlcJHYwLC0xCi0gNzM2Ogk1MmZmICAgICAgCXNsdGkJXCR2MCwyNTUKLSA3Mzg6CWYxMDAgNTIwMCAJc2x0aQlcJHYwLDI1NgotIDczYzoJZWE2MiAgICAgIAlzbHQJXCR2MCxcJHYxCi0gNzNlOgk1YTAwICAgICAgCXNsdGl1CVwkdjAsMAotIDc0MDoJNWEwMSAgICAgIAlzbHRpdQlcJHYwLDEKLSA3NDI6CWY3ZmYgNWExZiAJc2x0aXUJXCR2MCwtMQotIDc0NjoJNWFmZiAgICAgIAlzbHRpdQlcJHYwLDI1NQotIDc0ODoJZjEwMCA1YTAwIAlzbHRpdQlcJHYwLDI1NgotIDc0YzoJZWE2MyAgICAgIAlzbHR1CVwkdjAsXCR2MQotIDc0ZToJNzIwMCAgICAgIAljbXBpCVwkdjAsMAotIDc1MDoJNzIwMSAgICAgIAljbXBpCVwkdjAsMQotIDc1MjoJNzJmZiAgICAgIAljbXBpCVwkdjAsMjU1Ci0gNzU0OglmMTAwIDcyMDAgCWNtcGkJXCR2MCwyNTYKLSA3NTg6CWVhNmEgICAgICAJY21wCVwkdjAsXCR2MQotIDc1YToJZjAwMCAzMjYxIAlkc2xsCVwkdjAsXCR2MSwwCi0gNzVlOgkzMjY1ICAgICAgCWRzbGwJXCR2MCxcJHYxLDEKLSA3NjA6CTMyNjEgICAgICAJZHNsbAlcJHYwLFwkdjEsOAotIDc2MjoJZjI0MCAzMjYxIAlkc2xsCVwkdjAsXCR2MSw5Ci0gNzY2OglmN2UwIDMyNjEgCWRzbGwJXCR2MCxcJHYxLDYzCi0gNzZhOgllYjU0ICAgICAgCWRzbGx2CVwkdjAsXCR2MQotIDc2YzoJZjAwMCBlODQ4IAlkc3JsCVwkdjAsMAotIDc3MDoJZTk0OCAgICAgIAlkc3JsCVwkdjAsMQotIDc3MjoJZTg0OCAgICAgIAlkc3JsCVwkdjAsOAotIDc3NDoJZjI0MCBlODQ4IAlkc3JsCVwkdjAsOQotIDc3ODoJZjdlMCBlODQ4IAlkc3JsCVwkdjAsNjMKLSA3N2M6CWViNTYgICAgICAJZHNybHYJXCR2MCxcJHYxCi0gNzdlOglmMDAwIGU4NTMgCWRzcmEJXCR2MCwwCi0gNzgyOgllOTUzICAgICAgCWRzcmEJXCR2MCwxCi0gNzg0OgllODUzICAgICAgCWRzcmEJXCR2MCw4Ci0gNzg2OglmMjQwIGU4NTMgCWRzcmEJXCR2MCw5Ci0gNzhhOglmN2UwIGU4NTMgCWRzcmEJXCR2MCw2MwotIDc4ZToJZWI1NyAgICAgIAlkc3JhdglcJHYwLFwkdjEKLSA3OTA6CWVhMTIgICAgICAJbWZsbwlcJHYwCi0gNzkyOgllYjEwICAgICAgCW1maGkJXCR2MQotIDc5NDoJZjAwMCAzMjYwIAlzbGwJXCR2MCxcJHYxLDAKLSA3OTg6CTMyNjQgICAgICAJc2xsCVwkdjAsXCR2MSwxCi0gNzlhOgkzMjYwICAgICAgCXNsbAlcJHYwLFwkdjEsOAotIDc5YzoJZjI0MCAzMjYwIAlzbGwJXCR2MCxcJHYxLDkKLSA3YTA6CWY3YzAgMzI2MCAJc2xsCVwkdjAsXCR2MSwzMQotIDdhNDoJZWI0NCAgICAgIAlzbGx2CVwkdjAsXCR2MQotIDdhNjoJZjAwMCAzMjYyIAlzcmwJXCR2MCxcJHYxLDAKLSA3YWE6CTMyNjYgICAgICAJc3JsCVwkdjAsXCR2MSwxCi0gN2FjOgkzMjYyICAgICAgCXNybAlcJHYwLFwkdjEsOAotIDdhZToJZjI0MCAzMjYyIAlzcmwJXCR2MCxcJHYxLDkKLSA3YjI6CWY3YzAgMzI2MiAJc3JsCVwkdjAsXCR2MSwzMQotIDdiNjoJZWI0NiAgICAgIAlzcmx2CVwkdjAsXCR2MQotIDdiODoJZjAwMCAzMjYzIAlzcmEJXCR2MCxcJHYxLDAKLSA3YmM6CTMyNjcgICAgICAJc3JhCVwkdjAsXCR2MSwxCi0gN2JlOgkzMjYzICAgICAgCXNyYQlcJHYwLFwkdjEsOAotIDdjMDoJZjI0MCAzMjYzIAlzcmEJXCR2MCxcJHYxLDkKLSA3YzQ6CWY3YzAgMzI2MyAJc3JhCVwkdjAsXCR2MSwzMQotIDdjODoJZWI0NyAgICAgIAlzcmF2CVwkdjAsXCR2MQotIDdjYToJZWE3YyAgICAgIAlkbXVsdAlcJHYwLFwkdjEKLSA3Y2M6CWVhN2QgICAgICAJZG11bHR1CVwkdjAsXCR2MQotIDdjZToJZWE3ZSAgICAgIAlkZGl2CVwkemVybyxcJHYwLFwkdjEKLSA3ZDA6CTJiMDEgICAgICAJYm5leglcJHYxLDdkNCA8aW5zbnMyXCsoMHh8KWI0PgotIDdkMjoJZThlNSAgICAgIAlicmVhawk3Ci0gN2Q0OgllYTEyICAgICAgCW1mbG8JXCR2MAotIDdkNjoJNjUwMCAgICAgIAlub3AKLSA3ZDg6CTY1MDAgICAgICAJbm9wCi0gN2RhOgllYTdmICAgICAgCWRkaXZ1CVwkemVybyxcJHYwLFwkdjEKLSA3ZGM6CTJiMDEgICAgICAJYm5leglcJHYxLDdlMCA8aW5zbnMyXCsoMHh8KWMwPgotIDdkZToJZThlNSAgICAgIAlicmVhawk3Ci0gN2UwOgllYTEyICAgICAgCW1mbG8JXCR2MAotIDdlMjoJNjUwMCAgICAgIAlub3AKLSA3ZTQ6CTY1MDAgICAgICAJbm9wCi0gN2U2OgllYTc4ICAgICAgCW11bHQJXCR2MCxcJHYxCi0gN2U4OgllYTc5ICAgICAgCW11bHR1CVwkdjAsXCR2MQotIDdlYToJZWE3YSAgICAgIAlkaXYJXCR6ZXJvLFwkdjAsXCR2MQotIDdlYzoJMmIwMSAgICAgIAlibmV6CVwkdjEsN2YwIDxpbnNuczJcKygweHwpZDA+Ci0gN2VlOgllOGU1ICAgICAgCWJyZWFrCTcKLSA3ZjA6CWVhMTIgICAgICAJbWZsbwlcJHYwCi0gN2YyOgk2NTAwICAgICAgCW5vcAotIDdmNDoJNjUwMCAgICAgIAlub3AKLSA3ZjY6CWVhN2IgICAgICAJZGl2dQlcJHplcm8sXCR2MCxcJHYxCi0gN2Y4OgkyYjAxICAgICAgCWJuZXoJXCR2MSw3ZmMgPGluc25zMlwrKDB4fClkYz4KLSA3ZmE6CWU4ZTUgICAgICAJYnJlYWsJNwotIDdmYzoJZWExMiAgICAgIAltZmxvCVwkdjAKLSA3ZmU6CWVhMDAgICAgICAJanIJXCR2MAotIDgwMDoJNjUwMCAgICAgIAlub3AKLSA4MDI6CWU4MjAgICAgICAJanIJXCRyYQotIDgwNDoJNjUwMCAgICAgIAlub3AKLSA4MDY6CWVhNDAgICAgICAJamFscglcJHYwCi0gODA4Ogk2NTAwICAgICAgCW5vcAotIDgwYToJZjNmZiAyMjFiIAliZXF6CVwkdjAsNCA8aW5zbnMxPgotIDgwZToJMjI4OCAgICAgIAliZXF6CVwkdjAsNzIwIDxpbnNuczI+Ci0gODEwOgkyMjJiICAgICAgCWJlcXoJXCR2MCw4NjggPGJhcj4KLSA4MTI6CWYwODAgMjIwZCAJYmVxeglcJHYwLDkzMCA8cXV1eD4KLSA4MTY6CWYzZmYgMmExNSAJYm5leglcJHYwLDQgPGluc25zMT4KLSA4MWE6CTJhODIgICAgICAJYm5leglcJHYwLDcyMCA8aW5zbnMyPgotIDgxYzoJMmEyNSAgICAgIAlibmV6CVwkdjAsODY4IDxiYXI+Ci0gODFlOglmMDgwIDJhMDcgCWJuZXoJXCR2MCw5MzAgPHF1dXg+Ci0gODIyOglmM2ZmIDYwMGYgCWJ0ZXF6CTQgPGluc25zMT4KLSA4MjY6CWY3N2YgNjAxYiAJYnRlcXoJNzIwIDxpbnNuczI+Ci0gODJhOgk2MDFlICAgICAgCWJ0ZXF6CTg2OCA8YmFyPgotIDgyYzoJZjA4MCA2MDAwIAlidGVxegk5MzAgPHF1dXg+Ci0gODMwOglmM2ZmIDYxMDggCWJ0bmV6CTQgPGluc25zMT4KLSA4MzQ6CWY3N2YgNjExNCAJYnRuZXoJNzIwIDxpbnNuczI+Ci0gODM4Ogk2MTE3ICAgICAgCWJ0bmV6CTg2OCA8YmFyPgotIDgzYToJNjE3YSAgICAgIAlidG5legk5MzAgPHF1dXg+Ci0gODNjOglmM2ZmIDEwMDIgCWIJNCA8aW5zbnMxPgotIDg0MDoJMTc2ZiAgICAgIAliCTcyMCA8aW5zbnMyPgotIDg0MjoJMTAxMiAgICAgIAliCTg2OCA8YmFyPgotIDg0NDoJMTA3NSAgICAgIAliCTkzMCA8cXV1eD4KLSA4NDY6CWU4MDUgICAgICAJYnJlYWsJMAotIDg0ODoJZTgyNSAgICAgIAlicmVhawkxCi0gODRhOgllZmU1ICAgICAgCWJyZWFrCTYzCi0gODRjOgkxODAwIDAwMDAgCWphbAkwIDxkYXRhMT4KLQkJCTg0YzogUl9NSVBTMTZfMjYJZXh0ZXJuCi0gODUwOgk2NTAwICAgICAgCW5vcAotIDg1MjoJZTgwOSAgICAgIAllbnRyeQkKLSA4NTQ6CWU5MDkgICAgICAJZW50cnkJXCRhMAotIDg1NjoJZWI0OSAgICAgIAllbnRyeQlcJGEwLVwkYTIsXCRzMAotIDg1ODoJZThhOSAgICAgIAllbnRyeQlcJHMwLVwkczEsXCRyYQotIDg1YToJZTgyOSAgICAgIAllbnRyeQlcJHJhCi0gODVjOgllZjA5ICAgICAgCWV4aXQJCi0gODVlOgllZjQ5ICAgICAgCWV4aXQJXCRzMAotIDg2MDoJZWZhOSAgICAgIAlleGl0CVwkczAtXCRzMSxcJHJhCi0gODYyOgllZjI5ICAgICAgCWV4aXQJXCRyYQotIDg2NDoJMDAwMCAgICAgIAlhZGRpdQlcJHMwLFwkc3AsMAotCS4uLgotCi0wKzAwMDg2OCA8YmFyPjoKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY4ZmIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotIyBUZXN0IHRoZSBtaXBzMTYgaW5zdHJ1Y3Rpb24gc2V0LgotCi0JLnNldAltaXBzMTYKLQotCS5tYWNybwlsZHN0IG9wLCByZWcsIGJhc2UKLQlcb3AJXHJlZywwKFxiYXNlKQotCVxvcAlccmVnLDEoXGJhc2UpCi0JXG9wCVxyZWcsMihcYmFzZSkKLQlcb3AJXHJlZywzKFxiYXNlKQotCVxvcAlccmVnLDQoXGJhc2UpCi0JXG9wCVxyZWcsOChcYmFzZSkKLQlcb3AJXHJlZywxNihcYmFzZSkKLQlcb3AJXHJlZywzMihcYmFzZSkKLQlcb3AJXHJlZyw2NChcYmFzZSkKLQlcb3AJXHJlZywxMjgoXGJhc2UpCi0JXG9wCVxyZWcsMjU2KFxiYXNlKQotCVxvcAlccmVnLDUxMihcYmFzZSkKLQlcb3AJXHJlZywxMDI0KFxiYXNlKQotCVxvcAlccmVnLDIwNDgoXGJhc2UpCi0JXG9wCVxyZWcsLTEoXGJhc2UpCi0JXG9wCVxyZWcsLTIoXGJhc2UpCi0JXG9wCVxyZWcsLTMoXGJhc2UpCi0JXG9wCVxyZWcsLTQoXGJhc2UpCi0JXG9wCVxyZWcsLTgoXGJhc2UpCi0JXG9wCVxyZWcsLTE2KFxiYXNlKQotCVxvcAlccmVnLC0zMihcYmFzZSkKLQlcb3AJXHJlZywtNjQoXGJhc2UpCi0JXG9wCVxyZWcsLTEyOChcYmFzZSkKLQlcb3AJXHJlZywtMjU2KFxiYXNlKQotCVxvcAlccmVnLC01MTIoXGJhc2UpCi0JXG9wCVxyZWcsLTEwMjQoXGJhc2UpCi0JXG9wCVxyZWcsLTIwNDgoXGJhc2UpCi0JLmVuZG0KLQotCS5wMmFsaWduIDMKLWRhdGExOgotCS53b3JkCTAKLWluc25zMToKLQlsZHN0CWxkLCAkMiwgJDMKLQlsZAkkMixkYXRhMQotCWxkCSQyLGRhdGEyCi0JbGQJJDIsYmFyCi0JbGQJJDIscXV1eAotCWxkc3QJbGQsICQyLCAkc3AKLQlsZHN0CWx3dSwgJDIsICQzCi0JbGRzdAlsdywgJDIsICQzCi0JbHcJJDIsZGF0YTEKLQlsdwkkMixkYXRhMgotCWx3CSQyLGJhcgotCWx3CSQyLHF1dXgKLQlsZHN0CWx3LCAkMiwgJHNwCi0JbGRzdAlsaCwgJDIsICQzCi0JbGRzdAlsaHUsICQyLCAkMwotCWxkc3QJbGIsICQyLCAkMwotCWxkc3QJbGJ1LCAkMiwgJDMKLQlsZHN0CXNkLCAkMiwgJDMKLQlsZHN0CXNkLCAkMiwgJHNwCi0JbGRzdAlzZCwgJDMxLCAkc3AKLQlsZHN0CXN3LCAkMiwgJDMKLQlsZHN0CXN3LCAkMiwgJHNwCi0JbGRzdAlzdywgJDMxLCAkc3AKLQlsZHN0CXNoLCAkMiwgJDMKLQlsZHN0CXNiLCAkMiwgJDMKLQotCWxpCSQyLDAKLQlsaQkkMiwxCi0JbGkJJDIsMjU2Ci0KLQltb3ZlCSQyLCQzMAotCW1vdmUJJDIwLCQyCi0KLQlkYWRkdQkkMiwkMywwCi0JZGFkZHUJJDIsJDMsMQotCWRhZGR1CSQyLCQzLC0xCi0JZGFkZHUJJDIsJDMsMTYKLQlkYWRkdQkkMiwkMywtMTYKLQlkYWRkdQkkMiwkMywkNAotCWRhZGR1CSQyLDAKLQlkYWRkdQkkMiwxCi0JZGFkZHUJJDIsLTEKLQlkYWRkdQkkMiwzMgotCWRhZGR1CSQyLC0zMgotCWRhZGR1CSQyLDEyOAotCWRhZGR1CSQyLC0xMjgKLQlkbGEJJDIsZGF0YTEKLQlkbGEJJDIsZGF0YTIKLQlkbGEJJDIsYmFyCi0JZGxhCSQyLHF1dXgKLQlkYWRkdQkkc3AsMAotCWRhZGR1CSRzcCwxCi0JZGFkZHUJJHNwLC0xCi0JZGFkZHUJJHNwLDI1NgotCWRhZGR1CSRzcCwtMjU2Ci0JZGFkZHUJJDIsJHNwLDAKLQlkYWRkdQkkMiwkc3AsMQotCWRhZGR1CSQyLCRzcCwtMQotCWRhZGR1CSQyLCRzcCwzMgotCWRhZGR1CSQyLCRzcCwtMzIKLQlkYWRkdQkkMiwkc3AsMTI4Ci0JZGFkZHUJJDIsJHNwLC0xMjgKLQotCWFkZHUJJDIsJDMsMAotCWFkZHUJJDIsJDMsMQotCWFkZHUJJDIsJDMsLTEKLQlhZGR1CSQyLCQzLDE2Ci0JYWRkdQkkMiwkMywtMTYKLQlhZGR1CSQyLCQzLCQ0Ci0JYWRkdQkkMiwwCi0JYWRkdQkkMiwxCi0JYWRkdQkkMiwtMQotCWFkZHUJJDIsMzIKLQlhZGR1CSQyLC0zMgotCWFkZHUJJDIsMTI4Ci0JYWRkdQkkMiwtMTI4Ci0JbGEJJDIsZGF0YTEKLQlsYQkkMixkYXRhMgotCWxhCSQyLGJhcgotCWxhCSQyLHF1dXgKLQlhZGR1CSRzcCwwCi0JYWRkdQkkc3AsMQotCWFkZHUJJHNwLC0xCi0JYWRkdQkkc3AsMjU2Ci0JYWRkdQkkc3AsLTI1NgotCWFkZHUJJDIsJHNwLDAKLQlhZGR1CSQyLCRzcCwxCi0JYWRkdQkkMiwkc3AsLTEKLQlhZGR1CSQyLCRzcCwzMgotCWFkZHUJJDIsJHNwLC0zMgotCWFkZHUJJDIsJHNwLDEyOAotCWFkZHUJJDIsJHNwLC0xMjgKLQotZGF0YTI6Ci0JLndvcmQJMAotaW5zbnMyOgkKLQlkc3VidQkkMiwkMywkNAotCXN1YnUJJDIsJDMsJDQKLQluZWcJJDIsJDMKLQotCWFuZAkkMiwkMwotCW9yCSQyLCQzCi0JeG9yCSQyLCQzCi0Jbm90CSQyLCQzCi0KLQlzbHQJJDIsMAotCXNsdAkkMiwxCi0Jc2x0CSQyLC0xCi0Jc2x0CSQyLDI1NQotCXNsdAkkMiwyNTYKLQlzbHQJJDIsJDMKLQlzbHR1CSQyLDAKLQlzbHR1CSQyLDEKLQlzbHR1CSQyLC0xCi0Jc2x0dQkkMiwyNTUKLQlzbHR1CSQyLDI1NgotCXNsdHUJJDIsJDMKLQljbXAJJDIsMAotCWNtcAkkMiwxCi0JY21wCSQyLDI1NQotCWNtcAkkMiwyNTYKLQljbXAJJDIsJDMKLQotCWRzbGwJJDIsJDMsMAotCWRzbGwJJDIsJDMsMQotCWRzbGwJJDIsJDMsOAotCWRzbGwJJDIsJDMsOQotCWRzbGwJJDIsJDMsNjMKLQlkc2xsCSQyLCQzCi0JZHNybAkkMiwwCi0JZHNybAkkMiwxCi0JZHNybAkkMiw4Ci0JZHNybAkkMiw5Ci0JZHNybAkkMiw2MwotCWRzcmwJJDIsJDMKLQlkc3JhCSQyLDAKLQlkc3JhCSQyLDEKLQlkc3JhCSQyLDgKLQlkc3JhCSQyLDkKLQlkc3JhCSQyLDYzCi0JZHNyYQkkMiwkMwotCi0JbWZsbwkkMgotCW1maGkJJDMKLQotCXNsbAkkMiwkMywwCi0Jc2xsCSQyLCQzLDEKLQlzbGwJJDIsJDMsOAotCXNsbAkkMiwkMyw5Ci0Jc2xsCSQyLCQzLDMxCi0Jc2xsCSQyLCQzCi0Jc3JsCSQyLCQzLDAKLQlzcmwJJDIsJDMsMQotCXNybAkkMiwkMyw4Ci0Jc3JsCSQyLCQzLDkKLQlzcmwJJDIsJDMsMzEKLQlzcmwJJDIsJDMKLQlzcmEJJDIsJDMsMAotCXNyYQkkMiwkMywxCi0Jc3JhCSQyLCQzLDgKLQlzcmEJJDIsJDMsOQotCXNyYQkkMiwkMywzMQotCXNyYQkkMiwkMwotCi0JZG11bHQJJDIsJDMKLQlkbXVsdHUJJDIsJDMKLQlkZGl2CSQyLCQzCi0JZGRpdnUJJDIsJDMKLQotCW11bHQJJDIsJDMKLQltdWx0dQkkMiwkMwotCWRpdgkkMiwkMwotCWRpdnUJJDIsJDMKLQotCWpyCSQyCi0JanIJJDMxCi0JamFscgkkMzEsJDIKLQotCWJlcXoJJDIsaW5zbnMxCi0JYmVxegkkMixpbnNuczIKLQliZXF6CSQyLGJhcgotCWJlcXoJJDIscXV1eAotCWJuZXoJJDIsaW5zbnMxCi0JYm5legkkMixpbnNuczIKLQlibmV6CSQyLGJhcgotCWJuZXoJJDIscXV1eAotCWJ0ZXF6CWluc25zMQotCWJ0ZXF6CWluc25zMgotCWJ0ZXF6CWJhcgotCWJ0ZXF6CXF1dXgKLQlidG5leglpbnNuczEKLQlidG5leglpbnNuczIKLQlidG5legliYXIKLQlidG5leglxdXV4Ci0JYglpbnNuczEKLQliCWluc25zMgotCWIJYmFyCi0JYglxdXV4Ci0KLQlicmVhawkwCi0JYnJlYWsJMQotCWJyZWFrCTYzCi0KLQlqYWwJZXh0ZXJuCi0KLQllbnRyeQotCWVudHJ5CSQ0Ci0JZW50cnkJJDQtJDYsJDE2Ci0JZW50cnkJJDE2LSQxNywkMzEKLQllbnRyeQkkMzEKLQlleGl0Ci0JZXhpdAkkMTYKLQlleGl0CSQxNi0kMTcsJDMxCi0JZXhpdAkkMzEKLQotCS5wMmFsaWduIDMKLWJhcjoJCi0KLQkuc2tpcAkyMDAKLXF1dXg6CQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTZkZTkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQuZAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo1MDAwCi0jbmFtZTogTUlQUyBtaXBzNAotI2FzOiAtbWlwczQgLW1jcHU9cjUwMDAKLQotIyBUZXN0IHRoZSBtaXBzNCBtYWNyb3MuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGJjMWYJMDAwMDAwMDArIDx0ZXh0X2xhYmVsPgotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBiYzFmCVwkZmNjMSwwMDAwMDAwMCsgPHRleHRfbGFiZWw+Ci0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGJjMWZsCVwkZmNjMSwwMDAwMDAwMCsgPHRleHRfbGFiZWw+Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGJjMXQJXCRmY2MxLDAwMDAwMDAwKyA8dGV4dF9sYWJlbD4KLTArMDAxYyA8W14+XSo+IG5vcAotMCswMDIwIDxbXj5dKj4gYmMxdGwJXCRmY2MyLDAwMDAwMDAwKyA8dGV4dF9sYWJlbD4KLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gYy5mLmQJXCRmNCxcJGY2Ci0wKzAwMmMgPFtePl0qPiBjLmYuZAlcJGZjYzEsXCRmNCxcJGY2Ci0wKzAwMzAgPFtePl0qPiBsZHhjMQlcJGYyLFwkYTBcKFwkYTFcKQotMCswMDM0IDxbXj5dKj4gbHd4YzEJXCRmMixcJGEwXChcJGExXCkKLTArMDAzOCA8W14+XSo+IG1hZGQuZAlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwM2MgPFtePl0qPiBtYWRkLnMJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDQwIDxbXj5dKj4gbW92ZglcJGEwLFwkYTEsXCRmY2M0Ci0wKzAwNDQgPFtePl0qPiBtb3ZmLmQJXCRmNCxcJGY2LFwkZmNjMAotMCswMDQ4IDxbXj5dKj4gbW92Zi5zCVwkZjQsXCRmNixcJGZjYzAKLTArMDA0YyA8W14+XSo+IG1vdm4JXCRhMCxcJGEyLFwkYTIKLTArMDA1MCA8W14+XSo+IG1vdm4uZAlcJGY0LFwkZjUsXCRhMgotMCswMDU0IDxbXj5dKj4gbW92bi5zCVwkZjQsXCRmNSxcJGEyCi0wKzAwNTggPFtePl0qPiBtb3Z0CVwkYTAsXCRhMSxcJGZjYzQKLTArMDA1YyA8W14+XSo+IG1vdnQuZAlcJGY0LFwkZjYsXCRmY2MwCi0wKzAwNjAgPFtePl0qPiBtb3Z0LnMJXCRmNCxcJGY2LFwkZmNjMAotMCswMDY0IDxbXj5dKj4gbW92eglcJGEwLFwkYTIsXCRhMgotMCswMDY4IDxbXj5dKj4gbW92ei5kCVwkZjQsXCRmNSxcJGEyCi0wKzAwNmMgPFtePl0qPiBtb3Z6LnMJXCRmNCxcJGY1LFwkYTIKLTArMDA3MCA8W14+XSo+IG1zdWIuZAlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwNzQgPFtePl0qPiBtc3ViLnMJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDc4IDxbXj5dKj4gbm1hZGQuZAlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwN2MgPFtePl0qPiBubWFkZC5zCVwkZjAsXCRmMixcJGY0LFwkZjYKLTArMDA4MCA8W14+XSo+IG5tc3ViLmQJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDg0IDxbXj5dKj4gbm1zdWIucwlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwODggPFtePl0qPiBwcmVmeAkweDQsXCRhMFwoXCRhMVwpCi0wKzAwOGMgPFtePl0qPiByZWNpcC5kCVwkZjQsXCRmNgotMCswMDkwIDxbXj5dKj4gcmVjaXAucwlcJGY0LFwkZjYKLTArMDA5NCA8W14+XSo+IHJzcXJ0LmQJXCRmNCxcJGY2Ci0wKzAwOTggPFtePl0qPiByc3FydC5zCVwkZjQsXCRmNgotMCswMDljIDxbXj5dKj4gc2R4YzEJXCRmNCxcJGEwXChcJGExXCkKLTArMDBhMCA8W14+XSo+IHN3eGMxCVwkZjQsXCRhMFwoXCRhMVwpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGI5NDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgLW1pcHM0IGluc3RydWN0aW9ucy4KLQotdGV4dF9sYWJlbDoJCi0JYmMxZgl0ZXh0X2xhYmVsCi0JYmMxZgkkZmNjMSx0ZXh0X2xhYmVsCi0JYmMxZmwJJGZjYzEsdGV4dF9sYWJlbAotCWJjMXQJJGZjYzEsdGV4dF9sYWJlbAotCWJjMXRsCSRmY2MyLHRleHRfbGFiZWwKLQljLmYuZAkkZjQsJGY2Ci0JYy5mLmQJJGZjYzEsJGY0LCRmNgotCWxkeGMxCSRmMiwkNCgkNSkKLQlsd3hjMQkkZjIsJDQoJDUpCi0JbWFkZC5kCSRmMCwkZjIsJGY0LCRmNgotCW1hZGQucwkkZjAsJGYyLCRmNCwkZjYKLQltb3ZmCSQ0LCQ1LCRmY2M0Ci0JbW92Zi5kCSRmNCwkZjYsJGZjYzAKLQltb3ZmLnMJJGY0LCRmNiwkZmNjMAotCW1vdm4JJDQsJDYsJDYKLQltb3ZuLmQJJGY0LCRmNSwkNgotCW1vdm4ucwkkZjQsJGY1LCQ2Ci0JbW92dAkkNCwkNSwkZmNjNAotCW1vdnQuZAkkZjQsJGY2LCRmY2MwCi0JbW92dC5zCSRmNCwkZjYsJGZjYzAKLQltb3Z6CSQ0LCQ2LCQ2Ci0JbW92ei5kCSRmNCwkZjUsJDYKLQltb3Z6LnMJJGY0LCRmNSwkNgotCW1zdWIuZAkkZjAsJGYyLCRmNCwkZjYKLQltc3ViLnMJJGYwLCRmMiwkZjQsJGY2Ci0Jbm1hZGQuZAkkZjAsJGYyLCRmNCwkZjYKLQlubWFkZC5zCSRmMCwkZjIsJGY0LCRmNgotCW5tc3ViLmQJJGYwLCRmMiwkZjQsJGY2Ci0Jbm1zdWIucwkkZjAsJGYyLCRmNCwkZjYKLQotCSMgV2UgZG9uJ3QgdGVzdCBwcmVmIGJlY2F1c2UgY3VycmVudGx5IHRoZSBkaXNhc3NlbWJsZXIgd2lsbAotCSMgZGlzYXNzZW1ibGUgaXQgYXMgbHdjMy4gIGx3YzMgaXMgY29ycmVjdCBmb3IgbWlwczEgdG8gbWlwczMsCi0JIyB3aGlsZSBwcmVmIGlzIGNvcnJlY3QgZm9yIG1pcHM0LiAgVW5mb3J0dW5hdGVseSwgdGhlCi0JIyBkaXNhc3NlbWJsZXIgZG9lcyBub3Qga25vdyB3aGljaCBhcmNoaXRlY3R1cmUgaXQgaXMKLQkjIGRpc2Fzc2VtYmxpbmcgZm9yLgotCSMgcHJlZgk0LDAoJDQpCi0KLQlwcmVmeAk0LCQ0KCQ1KQotCXJlY2lwLmQJJGY0LCRmNgotCXJlY2lwLnMJJGY0LCRmNgotCXJzcXJ0LmQJJGY0LCRmNgotCXJzcXJ0LnMJJGY0LCRmNgotCXNkeGMxCSRmNCwkNCgkNSkKLQlzd3hjMQkkZjQsJDQoJDUpCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZGUxOTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMTAKLSNuYW1lOiBNSVBTIDQwMTAKLSNhczogLW1jcHU9NDAxMAotCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPHN0dWZmPiBmbHVzaGkKLTArMDAwNCA8c3R1ZmZcKzB4ND4gZmx1c2hkCi0wKzAwMDggPHN0dWZmXCsweDg+IGZsdXNoaWQKLTArMDAwYyA8c3R1ZmZcKzB4Yz4gbWFkZAlcJGEwLFwkYTEKLTArMDAxMCA8c3R1ZmZcKzB4MTA+IG1hZGR1CVwkYTEsXCRhMgotMCswMDE0IDxzdHVmZlwrMHgxND4gZmZjCVwkYTIsXCRhMwotMCswMDE4IDxzdHVmZlwrMHgxOD4gZmZzCVwkYTMsXCR0MAotMCswMDFjIDxzdHVmZlwrMHgxYz4gbXN1YglcJHQwLFwkdDEKLTArMDAyMCA8c3R1ZmZcKzB4MjA+IG1zdWJ1CVwkdDEsXCR0MgotMCswMDI0IDxzdHVmZlwrMHgyND4gc2Vsc2wJXCR0MixcJHQzLFwkdDQKLTArMDAyOCA8c3R1ZmZcKzB4Mjg+IHNlbHNyCVwkdDMsXCR0NCxcJHQ1Ci0wKzAwMmMgPHN0dWZmXCsweDJjPiB3YWl0aQotMCswMDMwIDxzdHVmZlwrMHgzMD4gd2IJMTZcKFwkdDZcKQotMCswMDM0IDxzdHVmZlwrMHgzND4gYWRkY2l1CVwkdDYsXCR0NywxNgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ2ZTI1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQwMTAucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkudGV4dAotCi1zdHVmZjoKLQkuZW50IHN0dWZmCi0JZmx1c2hpCi0JZmx1c2hkCi0JZmx1c2hpZAotCW1hZGQgJDQsJDUKLQltYWRkdSAkNSwkNgotCWZmYyAkNiwkNwotCWZmcyAkNywkOAotCW1zdWIgJDgsJDkKLQltc3VidSAkOSwkMTAKLQlzZWxzbCAkMTAsJDExLCQxMgotCXNlbHNyICQxMSwkMTIsJDEzCi0Jd2FpdGkKLQl3YiAxNigkMTQpCi0JYWRkY2l1ICQxNCwkMTUsMTYKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQxMDAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQxMDAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4NGYxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDEwMAotI25hbWU6IE1JUFMgNDEwMAotI2FzOiAtbWNwdT00MTAwCi0KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8c3R1ZmY+IGRtYWRkMTYJXCRhMCxcJGExCi0JLi4uCi0wKzAwMGMgPHN0dWZmXCsweGM+IG1hZGQxNglcJGExLFwkYTIKLTArMDAxMCA8c3R1ZmZcKzB4MTA+IGhpYmVybmF0ZQotMCswMDE0IDxzdHVmZlwrMHgxND4gc3RhbmRieQotMCswMDE4IDxzdHVmZlwrMHgxOD4gc3VzcGVuZAotMCswMDFjIDxzdHVmZlwrMHgxYz4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMjBlMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0KLXN0dWZmOgotCS5lbnQgc3R1ZmYKLQlkbWFkZDE2ICQ0LCQ1Ci0JbWFkZDE2ICQ1LCQ2Ci0JaGliZXJuYXRlCi0Jc3RhbmRieQotCXN1c3BlbmQKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2NDJhNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0NjUwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDY1MAotI25hbWU6IE1JUFMgNDY1MAotI2FzOiAtbWNwdT00NjUwCi0KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8c3R1ZmY+IG1hZAlcJGEwLFwkYTEKLQkuLi4KLTArMDAwYyA8c3R1ZmZcKzB4Yz4gbWFkdQlcJGExLFwkYTIKLQkuLi4KLTArMDAxOCA8c3R1ZmZcKzB4MTg+IG11bAlcJGEyLFwkYTMsXCR0MAotMCswMDFjIDxzdHVmZlwrMHgxYz4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0NjUwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0NjUwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzIyYTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDY1MC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQotc3R1ZmY6Ci0JLmVudCBzdHVmZgotCW1hZCAkNCwkNQotCW1hZHUgJDUsJDYKLQltdWwgJDYsJDcsJDgKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLWlsb2Nrcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwtaWxvY2tzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWVkMmUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwtaWxvY2tzLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1JUFMgbXVsLWlsb2NrcwotI2FzOgotI3NvdXJjZTogbXVsLnMKLQotIyBUZXN0IHRoZSBtdWwgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IG11bHR1CVwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMDggPFtePl0qPiBtdWx0dQlcJGExLFwkYTIKLTArMDAwYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwwCi0wKzAwMTQgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDE4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMWMgPFtePl0qPiBsaQlcJGF0LDEKLTArMDAyMCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwMjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDAyOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMmMgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDMwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMzQgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDM4IDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDAzYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDQgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDQ4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1MCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNTQgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDU4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNWMgPFtePl0qPiBtdWx0CVwkYTAsXCRhMQotMCswMDYwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNjQgPFtePl0qPiBzcmEJXCRhMCxcJGEwLDB4MWYKLTArMDA2OCA8W14+XSo+IG1maGkJXCRhdAotMCswMDZjIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzc4IDxmb29cKygweHwpNzg+Ci0wKzAwNzAgPFtePl0qPiBub3AKLTArMDA3NCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDA3OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDdjIDxbXj5dKj4gbXVsdAlcJGExLFwkYTIKLTArMDA4MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDg0IDxbXj5dKj4gc3JhCVwkYTAsXCRhMCwweDFmCi0wKzAwODggPFtePl0qPiBtZmhpCVwkYXQKLTArMDA4YyA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCs5OCA8Zm9vXCsoMHh8KTk4PgotMCswMDkwIDxbXj5dKj4gbm9wCi0wKzAwOTQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwOTggPFtePl0qPiBtZmxvCVwkYTAKLTArMDA5YyA8W14+XSo+IG11bHR1CVwkYTAsXCRhMQotMCswMGEwIDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwYTQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhOCA8W14+XSo+IGJlcXoJXCRhdCwwK2I0IDxmb29cKygweHwpYjQ+Ci0wKzAwYWMgPFtePl0qPiBub3AKLTArMDBiMCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDBiNCA8W14+XSo+IG11bHR1CVwkYTEsXCRhMgotMCswMGI4IDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwYmMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBjMCA8W14+XSo+IGJlcXoJXCRhdCwwK2NjIDxmb29cKygweHwpY2M+Ci0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDBjYyA8W14+XSo+IGRtdWx0dQlcJGExLFwkYTIKLTArMDBkMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGQ0IDxbXj5dKj4gbGkJXCRhdCwxCi0wKzAwZDggPFtePl0qPiBkbXVsdAlcJGExLFwkYXQKLTArMDBkYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMGUwIDxbXj5dKj4gZG11bHQJXCRhMSxcJGEyCi0wKzAwZTQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBlOCA8W14+XSo+IGRzcmEzMglcJGEwLFwkYTAsMHgxZgotMCswMGVjIDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwZjAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArZmMgPGZvb1wrKDB4fClmYz4KLTArMDBmNCA8W14+XSo+IG5vcAotMCswMGY4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMGZjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMDAgPFtePl0qPiBkbXVsdHUJXCRhMSxcJGEyCi0wKzAxMDQgPFtePl0qPiBtZmhpCVwkYXQKLTArMDEwOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTBjIDxbXj5dKj4gYmVxeglcJGF0LDArMTE4IDxmb29cKygweHwpMTE4PgotMCswMTEwIDxbXj5dKj4gbm9wCi0wKzAxMTQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiNjI2NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5kCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNhczogLW1jcHU9cjQwMDAKLSNuYW1lOiBNSVBTIG11bAotCi0jIFRlc3QgdGhlIG11bCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbXVsdHUJXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDAxMCA8W14+XSo+IG11bHR1CVwkYTEsXCRhMgotMCswMDE0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMTggPFtePl0qPiBsaQlcJGF0LDAKLTArMDAxYyA8W14+XSo+IG5vcAotMCswMDIwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDAyNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwxCi0wKzAwMmMgPFtePl0qPiBub3AKLTArMDAzMCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwMzQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDAzOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwNDQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA0OCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwNGMgPFtePl0qPiBub3AKLTArMDA1MCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwNTQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA1OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDVjIDxbXj5dKj4gbm9wCi0wKzAwNjAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDY0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2YyA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNzAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDc0IDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAwODAgPFtePl0qPiBtdWx0CVwkYTAsXCRhMQotMCswMDg0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwODggPFtePl0qPiBzcmEJXCRhMCxcJGEwLDB4MWYKLTArMDA4YyA8W14+XSo+IG1maGkJXCRhdAotMCswMDkwIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzljIDxmb29cKygweHwpOWM+Ci0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDA5YyA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMGE4IDxbXj5dKj4gbXVsdAlcJGExLFwkYTIKLTArMDBhYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMGIwIDxbXj5dKj4gc3JhCVwkYTAsXCRhMCwweDFmCi0wKzAwYjQgPFtePl0qPiBtZmhpCVwkYXQKLTArMDBiOCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCtjNCA8Zm9vXCsoMHh8KWM0PgotMCswMGJjIDxbXj5dKj4gbm9wCi0wKzAwYzAgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwYzQgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDBkMCA8W14+XSo+IG11bHR1CVwkYTAsXCRhMQotMCswMGQ0IDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwZDggPFtePl0qPiBtZmxvCVwkYTAKLTArMDBkYyA8W14+XSo+IGJlcXoJXCRhdCwwK2U4IDxmb29cKygweHwpZTg+Ci0wKzAwZTAgPFtePl0qPiBub3AKLTArMDBlNCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDBlOCA8W14+XSo+IG11bHR1CVwkYTEsXCRhMgotMCswMGVjIDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwZjAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBmNCA8W14+XSo+IGJlcXoJXCRhdCwwKzEwMCA8Zm9vXCsoMHh8KTEwMD4KLTArMDBmOCA8W14+XSo+IG5vcAotMCswMGZjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTAwIDxbXj5dKj4gZG11bHR1CVwkYTEsXCRhMgotMCswMTA0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMDggPFtePl0qPiBsaQlcJGF0LDEKLTArMDEwYyA8W14+XSo+IG5vcAotMCswMTEwIDxbXj5dKj4gZG11bHQJXCRhMSxcJGF0Ci0wKzAxMTQgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDEyMCA8W14+XSo+IGRtdWx0CVwkYTEsXCRhMgotMCswMTI0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMjggPFtePl0qPiBkc3JhMzIJXCRhMCxcJGEwLDB4MWYKLTArMDEyYyA8W14+XSo+IG1maGkJXCRhdAotMCswMTMwIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzEzYyA8Zm9vXCsoMHh8KTEzYz4KLTArMDEzNCA8W14+XSo+IG5vcAotMCswMTM4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTNjIDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAxNDggPFtePl0qPiBkbXVsdHUJXCRhMSxcJGEyCi0wKzAxNGMgPFtePl0qPiBtZmhpCVwkYXQKLTArMDE1MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTU0IDxbXj5dKj4gYmVxeglcJGF0LDArMTYwIDxmb29cKygweHwpMTYwPgotMCswMTU4IDxbXj5dKj4gbm9wCi0wKzAxNWMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5ZTM2OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIG11bCBtYWNyby4KLQkKLWZvbzoKLQltdWwJJDQsJDUKLQltdWwJJDQsJDUsJDYKLQltdWwJJDQsJDUsMAotCW11bAkkNCwkNSwxCi0JbXVsCSQ0LCQ1LDB4ODAwMAotCW11bAkkNCwkNSwtMHg4MDAwCi0JbXVsCSQ0LCQ1LDB4MTAwMDAKLQltdWwJJDQsJDUsMHgxYTVhNQotCi0jIG11bG8gYW5kIG11bG91IGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgcmVnaXN0ZXIgYXJndW1lbnRzCQotCW11bG8JJDQsJDUKLQltdWxvCSQ0LCQ1LCQ2Ci0KLQltdWxvdQkkNCwkNQotCW11bG91CSQ0LCQ1LCQ2Ci0KLSMgU2FuaXR5IGNoZWNrIHRoZSA2NCBiaXQgdmVyc2lvbnMuCi0JLnNldAltaXBzMwotCWRtdWwJJDQsJDUsJDYKLQlkbXVsCSQ0LCQ1LDEKLQlkbXVsbwkkNCwkNSwkNgotCWRtdWxvdQkkNCwkNSwkNgotCi0gICAgICAgIC5zcGFjZQk4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL25vZGVsYXkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbm9kZWxheS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzkzMDc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbm9kZWxheS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjUwMDAKLSNuYW1lOiBNSVBTIG5vZGVsYXkKLSNhczogLW1pcHM0IC1tY3B1PXI4MDAwCi0jc291cmNlOiBkZWxheS5zCi0KLSMgRm9yIC1taXBzNCAKLSMgR2FzIHNob3VsZCAqbm90KiBwcm9kdWNlIG5vcCdzIGFmdGVyIG10YzEgYW5kIHJlbGF0ZWQgCi0jIGluc24ncyBpZiB0aGUgdGFyZ2V0IGZwciBpcyB1c2VkIGluIHRoZSBpbW1lZGlhdGx5IAotIyBmb2xsb3dpbmcgaW5zbi4gIFNlZSBhbHNvIGRlbGF5LmQuCi0jCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IG10YzEJXCR6ZXJvLFwkZjAKLTArMDAwNCA8W14+XSo+IGN2dC5kLncJXCRmMCxcJGYwCi0wKzAwMDggPFtePl0qPiBtdGMxCVwkemVybyxcJGYxCi0wKzAwMGMgPFtePl0qPiBjdnQuZC53CVwkZjEsXCRmMQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Y2UxNDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wuZAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jYXM6IC1tY3B1PXIzMDAwCi0jbmFtZTogTUlQUyBSMzAwMCByb2wKLQotIyBUZXN0IHRoZSByb2wgYW5kIHJvciBtYWNyb3MuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IG5lZ3UJXCRhdCxcJGExCi0wKzAwMDQgPFtePl0qPiBzcmx2CVwkYXQsXCRhMCxcJGF0Ci0wKzAwMDggPFtePl0qPiBzbGx2CVwkYTAsXCRhMCxcJGExCi0wKzAwMGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDEwIDxbXj5dKj4gbmVndQlcJGF0LFwkYTIKLTArMDAxNCA8W14+XSo+IHNybHYJXCRhdCxcJGExLFwkYXQKLTArMDAxOCA8W14+XSo+IHNsbHYJXCRhMCxcJGExLFwkYTIKLTArMDAxYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjAgPFtePl0qPiBzbGwJXCRhdCxcJGEwLDB4MQotMCswMDI0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDFmCi0wKzAwMjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDJjIDxbXj5dKj4gc2xsCVwkYXQsXCRhMSwweDEKLTArMDAzMCA8W14+XSo+IHNybAlcJGEwLFwkYTEsMHgxZgotMCswMDM0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAzOCA8W14+XSo+IG5lZ3UJXCRhdCxcJGExCi0wKzAwM2MgPFtePl0qPiBzbGx2CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNDAgPFtePl0qPiBzcmx2CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDQ4IDxbXj5dKj4gbmVndQlcJGF0LFwkYTIKLTArMDA0YyA8W14+XSo+IHNsbHYJXCRhdCxcJGExLFwkYXQKLTArMDA1MCA8W14+XSo+IHNybHYJXCRhMCxcJGExLFwkYTIKLTArMDA1NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNTggPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4MQotMCswMDVjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDFmCi0wKzAwNjAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDY0IDxbXj5dKj4gc3JsCVwkYXQsXCRhMSwweDEKLTArMDA2OCA8W14+XSo+IHNsbAlcJGEwLFwkYTEsMHgxZgotMCswMDZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3JvbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTlhOTU3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgcm9sIGFuZCByb3IgbWFjcm9zLgotCi1mb286Ci0Jcm9sCSQ0LCQ1Ci0Jcm9sCSQ0LCQ1LCQ2Ci0Jcm9sCSQ0LDEKLQlyb2wJJDQsJDUsMQotCi0Jcm9yCSQ0LCQ1Ci0Jcm9yCSQ0LCQ1LCQ2Ci0Jcm9yCSQ0LDEKLQlyb3IJJDQsJDUsMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWY0YmMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IuZAorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgc2IKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgc2IgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IHNiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDBjIDxbXj5dKj4gc2IJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDEwIDxbXj5dKj4gc2IJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAyMCA8W14+XSo+IHNiCVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAyNCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBzYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAwMzQgPFtePl0qPiBzYglcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBzYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDA0NCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDA1MCA8W14+XSo+IHNiCVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2MCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBzYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDZjIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDcwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGdwXCkKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwNzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDA3YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRncFwpCi1bIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTAgPFtePl0qPiBzYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDljIDxbXj5dKj4gc2IJXCRhMCwxXChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSphNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRncFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGMwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGM4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGQ4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwZGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSpkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGU4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGVjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTA0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDExOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjExODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI4IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTQ4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE1MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTU4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTc4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTgwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTg0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE4OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDE5NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAxYTAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFhOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDFiNCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxYmMgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMWM4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWQwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWQ4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMWRjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDFlOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWYwIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLVsgCV0qMWYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFmNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMWZjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDIwNCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi1bIAldKjIwNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIwOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyMTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyMTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMjFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDIyNCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDIzMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDIzYyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjQ4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI1NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI2MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI2NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyNmMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyNzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjg0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI5MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5OCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI5YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmE4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJiNCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmMwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJjNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyY2MgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyZDggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoyZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyZTQgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJlYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJmMCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjJmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyZmMgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzMDggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzE0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDMxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzMjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzI0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzMmMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzMzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDM0NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzNTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNTQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzNWMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzNjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzY4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM2YyA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3MCA8W14+XSo+IHN3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDM3NCA8W14+XSo+IHNoCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3OCA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3YyA8W14+XSo+IHN3YzAJXCQ0LDBcKFwkemVyb1wpCi0wKzAzODAgPFtePl0qPiBzd2MxCVwkZjQsMFwoXCR6ZXJvXCkKLTArMDM4NCA8W14+XSo+IHN3YzIJXCQ0LDBcKFwkemVyb1wpCi0wKzAzODggPFtePl0qPiBzd2MzCVwkNCwwXChcJHplcm9cKQotMCswMzhjIDxbXj5dKj4gc3djMQlcJGY0LDBcKFwkemVyb1wpCi0wKzAzOTAgPFtePl0qPiBzd2wJXCRhMCwwXChcJHplcm9cKQotMCswMzk0IDxbXj5dKj4gc3dyCVwkYTAsMFwoXCR6ZXJvXCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjNzM1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3NiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHNiIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlzYgkkNCwwCi0Jc2IJJDQsMQotCXNiCSQ0LDB4ODAwMAotCXNiCSQ0LC0weDgwMDAKLQlzYgkkNCwweDEwMDAwCi0Jc2IJJDQsMHgxYTVhNQotCXNiCSQ0LDAoJDUpCi0Jc2IJJDQsMSgkNSkKLQlzYgkkNCwweDgwMDAoJDUpCi0Jc2IJJDQsLTB4ODAwMCgkNSkKLQlzYgkkNCwweDEwMDAwKCQ1KQotCXNiCSQ0LDB4MWE1YTUoJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0Jc2IJJDQsZGF0YV9sYWJlbCsxCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlzYgkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0Jc2IJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlzYgkkNCxkYXRhX2xhYmVsKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlzYgkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCQotIyBTZXZlcmFsIG1hY3JvcyBhcmUgaGFuZGxlZCBsaWtlIHNiLiAgU2FuaXR5IGNoZWNrIHRoZW0uCi0Jc2QJJDQsMAotCXNoCSQ0LDAKLQlzdwkkNCwwCi0Jc3djMAkkNCwwCi0Jc3djMQkkNCwwCi0Jc3djMgkkNCwwCi0Jc3djMwkkNCwwCi0Jcy5zCSRmNCwwCi0Jc3dsCSQ0LDAKLQlzd3IJJDQsMAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5YTE4Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgotI25hbWU6IHN5bmMgaW5zdHJ1Y3Rpb25zCi0jYXM6IC1taXBzMgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDxmb28+IDAwMDAwMDBmWyAJXSpzeW5jCi0wKzAwMDQgPGZvb1wrMHg0PiAwMDAwMDQwZlsgCV0qc3luYy5wCi0wKzAwMDggPGZvb1wrMHg4PiAwMDAwMDAwZlsgCV0qc3luYwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjMGVkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci0Jc3luYwotCXN5bmMucAotCXN5bmMubApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5N2FkYjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNhczogLW1jcHU9cjQwMDAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyAyMC1iaXQgdHJhcAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiB0ZXEJXCR6ZXJvLFwkdjEKLTArMDAwNCA8W14+XSo+IHRlcQlcJHplcm8sXCR2MSwweDEKLTArMDAwOCA8W14+XSo+IHRnZQlcJHplcm8sXCR2MQotMCswMDBjIDxbXj5dKj4gdGdlCVwkemVybyxcJHYxLDB4MwotMCswMDEwIDxbXj5dKj4gdGdldQlcJHplcm8sXCR2MQotMCswMDE0IDxbXj5dKj4gdGdldQlcJHplcm8sXCR2MSwweDcKLTArMDAxOCA8W14+XSo+IHRsdAlcJHplcm8sXCR2MQotMCswMDFjIDxbXj5dKj4gdGx0CVwkemVybyxcJHYxLDB4MWYKLTArMDAyMCA8W14+XSo+IHRsdHUJXCR6ZXJvLFwkdjEKLTArMDAyNCA8W14+XSo+IHRsdHUJXCR6ZXJvLFwkdjEsMHhmZgotMCswMDI4IDxbXj5dKj4gdG5lCVwkemVybyxcJHYxCi0wKzAwMmMgPFtePl0qPiB0bmUJXCR6ZXJvLFwkdjEsMHgzZmYKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZkNjU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgMjAtYml0IHRyYXAgaW5zdHJ1Y3Rpb25zCi1mb286CQotCXRlcQkkMCwkMwotCXRlcQkkMCwkMywxCi0JdGdlCSQwLCQzCi0JdGdlCSQwLCQzLDMKLQl0Z2V1CSQwLCQzCi0JdGdldQkkMCwkMyw3Ci0JdGx0CSQwLCQzCi0JdGx0CSQwLCQzLDMxCi0JdGx0dQkkMCwkMwotCXRsdHUJJDAsJDMsMjU1Ci0JdG5lCSQwLCQzCi0JdG5lCSQwLCQzLDEwMjMKLQkKLSMgZm9yY2Ugc29tZSBwYWRkaW5nLCB0byBtYWtlIG9iamR1bXAgY29uc2lzdGVudGx5IHJlcG9ydCB0aGF0IHRoZXJlJ3Mgc29tZQotIyBoZXJlLi4uCi0JLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczOGFlMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdHJ1bmMKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwCi0KLSMgVGVzdCB0aGUgdHJ1bmMgbWFjcm9zLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBjZmMxCVwkYTAsXCQzMQotMCswMDA0IDxbXj5dKj4gY2ZjMQlcJGEwLFwkMzEKLTArMDAwOCA8W14+XSo+IG5vcAotMCswMDBjIDxbXj5dKj4gb3JpCVwkYXQsXCRhMCwweDMKLTArMDAxMCA8W14+XSo+IHhvcmkJXCRhdCxcJGF0LDB4MgotMCswMDE0IDxbXj5dKj4gY3RjMQlcJGF0LFwkMzEKLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gY3Z0LncuZAlcJGY0LFwkZjYKLTArMDAyMCA8W14+XSo+IGN0YzEJXCRhMCxcJDMxCi0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGNmYzEJXCRhMCxcJDMxCi0wKzAwMmMgPFtePl0qPiBjZmMxCVwkYTAsXCQzMQotMCswMDMwIDxbXj5dKj4gbm9wCi0wKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGEwLDB4MwotMCswMDM4IDxbXj5dKj4geG9yaQlcJGF0LFwkYXQsMHgyCi0wKzAwM2MgPFtePl0qPiBjdGMxCVwkYXQsXCQzMQotMCswMDQwIDxbXj5dKj4gbm9wCi0wKzAwNDQgPFtePl0qPiBjdnQudy5zCVwkZjQsXCRmNgotMCswMDQ4IDxbXj5dKj4gY3RjMQlcJGEwLFwkMzEKLTArMDA0YyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWU5MGYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHRydW5jIG1hY3Jvcy4KLQotZm9vOgotCXRydW5jLncuZAkkZjQsJGY2LCQ0Ci0KLQl0cnVuYy53LnMJJGY0LCRmNiwkNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmUyOWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgdWxkCi0jYXM6IC1taXBzMyAtbWNwdT1yNDAwMAotCi0jIFRlc3QgdGhlIHVsZCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsZGwJXCRhMCxbMThdXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbGRyCVwkYTAsWzE4XVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMTQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbGRsCVwkYTAsLTMyNzZbMThdXChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbGRyCVwkYTAsLTMyNzZbMThdXChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDM4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA0MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsZGwJXCRhMCxbMThdXChcJGExXCkKLTArMDA0YyA8W14+XSo+IGxkcglcJGEwLFstMC05XStcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1OCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNmMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA4OCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDkwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBiMCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYmMgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZWMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmMCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMDggPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTM0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE2NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE3MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTdjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE4NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFhNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxY2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWUwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFmNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFmYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjAwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjBjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjUwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjY0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI3NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI4NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmE0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmIwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJjNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJjYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyZDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFmZmJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdWxkIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1bGQJJDQsMAotCXVsZAkkNCwxCi0JdWxkCSQ0LDB4ODAwMAotCXVsZAkkNCwtMHg4MDAwCi0JdWxkCSQ0LDB4MTAwMDAKLQl1bGQJJDQsMHgxYTVhNQotCXVsZAkkNCwwKCQ1KQotCXVsZAkkNCwxKCQ1KQotCXVsZAkkNCxkYXRhX2xhYmVsCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1bGQJJDQsZGF0YV9sYWJlbCsxCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1bGQJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsZAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdWxkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWxkCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1ZjA2Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVsaC1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMKLSNzb3VyY2U6IHVsaC1waWMucwotCi0jIFRlc3QgdGhlIHVsaCBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2Mzg0Ci1bIAldKjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwMDggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDAwYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMTAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qMTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDAxOCA8W14+XSo+IGxidQlcJGEwLFswMV1cKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwMjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDI0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAyOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDAyYyA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSozNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwMzggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA0MCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA0OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qNTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNTQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA1OCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4NAotWyAJXSo1YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTUzODQKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDc0IDxbXj5dKj4gbGJ1CVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNzggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwODAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDg0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4MwotWyAJXSo4NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDg4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA5YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiYyA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qY2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDAgPFtePl0qPiBsYnUJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGQ4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBkYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2MzgzCi1bIAldKmUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBlNCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGU4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE1MzgzCi1bIAldKmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmMCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZjQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMGY4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTAwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEwNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1waWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNiMjljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBUZXN0IHVuYWxpZ25lZCBsb2FkIGFuZCBzdG9yZSBtYWNyb3Mgd2l0aCBQSUMgY29kZS4gIFdlIGRvbid0IGJvdGhlcgotIyB0byB0ZXN0IG1vc3QgY2FzZXMuICBUaGUgYWN0dWFsIGxvYWRzIGFuZCBzdG9yZXMgYXJlIHRlc3RlZCBieSB0aGUKLSMgbm9uLVBJQyB0ZXN0IGNhc2UuICBXZSBqdXN0IHdhbnQgdG8gY2hlY2sgdGhhdCB0aGUgaW5pdGlhbCBhZGRyZXNzCi0jIGlzIGxvYWRlZCBjb3JyZWN0bHkuCi0KLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdWxoCSQ0LGRhdGFfbGFiZWwKLQl1bGh1CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVsaHUJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdWx3CSQ0LGRhdGFfbGFiZWwrMQotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bGh1CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCS5pZm5kZWYJWEdPVAotCW5vcAotCW5vcAotCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmUzM2JkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdWxoLXN2cjRwaWMKLSNhczogLW1pcHMxIC1LUElDIC1FQgotI3NvdXJjZTogdWxoLXBpYy5zCi0KLSMgVGVzdCB0aGUgdW5hbGlnbmVkIGxvYWQgYW5kIHN0b3JlIG1hY3JvcyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSowOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAwMTAgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDAxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDFjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDAyOCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAzMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSozNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDAzOCA8W14+XSo+IG5vcAotMCswMDNjIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAwNDAgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjQ0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotMCswMDUwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA1NCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAwNTggPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNjAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDY0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qNjQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA2OCA8W14+XSo+IG5vcAotMCswMDZjIDxbXj5dKj4gc3dsCVwkYTAsMFwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBzd3IJXCRhMCwzXChcJGF0XCkKLTArMDA3NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjc0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMDc4IDxbXj5dKj4gbm9wCi0wKzAwN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo3YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMDgwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDA4NCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDg4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA4YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA5NCA8W14+XSo+IG5vcAotMCswMDk4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qOTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDA5YyA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMGEwIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBhYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmFjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDBiMCA8W14+XSo+IG5vcAotMCswMGI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qYjQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMGJjIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmM0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IG5vcAotMCswMGNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDBkMCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMGQ4IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBlNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSplODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IG5vcAotMCswMGYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDBmNCA8W14+XSo+IHN3bAlcJGEwLDBcKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gc3dyCVwkYTAsM1woXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpmYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IG5vcAotMCswMTA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDEwOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDExMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTE4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTE4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMWMgPFtePl0qPiBub3AKLTArMDEyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxMjQgPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDEyOCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTJjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEzMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMzggPFtePl0qPiBub3AKLTArMDEzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjEzYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDE0NCA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCi0wKzAxNGMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNGM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNTAgPFtePl0qPiBub3AKLTArMDE1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKjE1NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTU4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDE1YyA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAxNjAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTY0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDE2OCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTZjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE3MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MmY5Y2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1bGgteGdvdAotI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAgLUtQSUMgLXhnb3QgLUVCIC0tZGVmc3ltIFhHT1Q9MQotI3NvdXJjZTogdWxoLXBpYy5zCi0KLSMgVGVzdCB0aGUgdW5hbGlnbmVkIGxvYWQgYW5kIHN0b3JlIG1hY3JvcyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSowOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDAwYyA8W14+XSo+IG5vcAotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDAxNCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAxYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMDI4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMjg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDJjIDxbXj5dKj4gbm9wCi0wKzAwMzAgPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDAzNCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMDM4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAzYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNDA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwNDggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSo0ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAwNTQgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDA1OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo1ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA1YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDA2MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjYwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotMCswMDZjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA3MCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAwNzQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwN2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjgwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwODggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSo4ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDhjIDxbXj5dKj4gbm9wCi0wKzAwOTAgPFtePl0qPiBzd2wJXCRhMCwwXChcJGF0XCkKLTArMDA5NCA8W14+XSo+IHN3cglcJGEwLDNcKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qOTg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwOWMgPFtePl0qPiBub3AKLTArMDBhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKmEwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwYTQgPFtePl0qPiBub3AKLTArMDBhOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAwYWMgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDBiMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGI4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYjg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwYmMgPFtePl0qPiBub3AKLTArMDBjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKmMwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGQ0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBkOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmQ4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDBkYyA8W14+XSo+IG5vcAotMCswMGUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qZTA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwZTQgPFtePl0qPiBub3AKLTArMDBlOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAwZWMgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDBmMCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMGY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBmYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEwMCA8W14+XSo+IG5vcAotMCswMTA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDEwOCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTEwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDExNCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDExYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTIwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTI4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTI4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbm9wCi0wKzAxMzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTM0IDxbXj5dKj4gc3dsCVwkYTAsMFwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBzd3IJXCRhMCwzXChcJGF0XCkKLTArMDEzYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxM2M6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxNDQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxNDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDggPFtePl0qPiBub3AKLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxNTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxNTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTVjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE2MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE2OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE2ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTZjIDxbXj5dKj4gbm9wCi0wKzAxNzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTc0IDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDE3YyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxODAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTg0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTg0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTg4IDxbXj5dKj4gbm9wCi0wKzAxOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoxOGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE5MCA8W14+XSo+IG5vcAotMCswMTk0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDE5OCA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQotMCswMTljIDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCi0wKzAxYTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxYTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxYTQgPFtePl0qPiBub3AKLTArMDFhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKjFhODogUl9NSVBTX0xPMTYJLmJzcwotMCswMWFjIDxbXj5dKj4gbm9wCi0wKzAxYjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMWI0IDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxYmMgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMWMwIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxYzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFjYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGguZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNmQ0YjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGguZAorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdWxoCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIHVsaCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCxbMTJdXChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbGJ1CVwkYXQsWzEyXVwoXCR6ZXJvXCkKLTArMDAxOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDIwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwMjggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3Nls3OF1cKFwkemVyb1wpCi0wKzAwMzggPFtePl0qPiBsYnUJXCRhdCwtMzI3Nls3OF1cKFwkemVyb1wpCi0wKzAwM2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDQwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA0YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDUwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA1NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNTggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1YyA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhMVwpCi0wKzAwNzQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGExXCkKLTArMDA3OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwN2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDgwIDxbXj5dKj4gbGIJXCRhMCxbMTJdXChcJGExXCkKLTArMDA4NCA8W14+XSo+IGxidQlcJGF0LFsxMl1cKFwkYTFcKQotMCswMDg4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA4YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwOTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDljIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwYTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBiOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBjOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBkMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZDQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGQ4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGRjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBlOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSplYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBmOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDExNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMTggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTFjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEyMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEyOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDEzMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMzQgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxM2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTQwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE0NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTRjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSoxNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE2NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTdjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxODAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTg0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE4OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjE4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE4YyA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxOTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxOTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFhYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYjAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMWI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFiOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxYmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFjMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWRjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWVjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxZjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWY0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjAwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIwNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjA4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDIwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyMTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIxOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDIyMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyMjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjMwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDIzYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjRjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyNTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI2NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjdjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyODAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjg0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI5NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjk4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI5YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJhNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyYTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmFjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyYjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmI0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJjMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyY2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmQwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJkOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyZGMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJlMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyZTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJmMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyZjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJmOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyZmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzA4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMwYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDMxNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMyMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzMjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDMyOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzMmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzMwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSozMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzM2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM0MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzNDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjM0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzU0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzNTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzVjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSozNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzY4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM2YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzcwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM3NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSozN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzg0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzODggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzhjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM5NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjM5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM5OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzOWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNhMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzYTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2E4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2E4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDNhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzYjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2I0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzYjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2JjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNjMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2M4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNjYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2QwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNkNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzZDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNkYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2UwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNlNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2U4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNlYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzZjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2Y0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2Y0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNmOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzZmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQwMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0MDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjQwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDE0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0MTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQyMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQyNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQyOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQzMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0MzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDQwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ0NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDQ4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ0YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0NTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNDU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ1OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0NWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQ2MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0NjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDY4IDxbXj5dKj4gbGJ1CVwkYTAsWzAxXVwoXCR6ZXJvXCkKLTArMDQ2YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkemVyb1wpCi0wKzA0NzAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDc0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVjYmI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdWxoIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1bGgJJDQsMAotCXVsaAkkNCwxCi0JdWxoCSQ0LDB4ODAwMAotCXVsaAkkNCwtMHg4MDAwCi0JdWxoCSQ0LDB4MTAwMDAKLQl1bGgJJDQsMHgxYTVhNQotCXVsaAkkNCwwKCQ1KQotCXVsaAkkNCwxKCQ1KQotCXVsaAkkNCxkYXRhX2xhYmVsCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1bGgJJDQsZGF0YV9sYWJlbCsxCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1bGgJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsaAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdWxoCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWxoCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgdWxodSBpcyBoYW5kbGVkIGxpa2UgdWxoLiAgU2FuaXR5IGNoZWNrIGl0LgotCXVsaHUJJDQsMAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmRjOTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdWx3Ci0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIHVsdyBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsd2wJXCRhMCxbMTRdXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gbHdyCVwkYTAsWzE0XVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMTQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHdsCVwkYTAsLTMyNzZbNThdXChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHdyCVwkYTAsLTMyNzZbNThdXChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDM4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA0MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsd2wJXCRhMCxbMTRdXChcJGExXCkKLTArMDA0YyA8W14+XSo+IGx3cglcJGEwLFstMC05XStcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDZjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3OCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDg4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA5MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDk0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGJjIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlOCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGVjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGY4IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEwOCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTI0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTUwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTY0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE4NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWI0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFjNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWUwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFmMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWY0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIwMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjA0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjEwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjMwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI1NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI2NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI3NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjg0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJiNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmMwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmQwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyZDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTM2ZjFjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdWx3IG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1bHcJJDQsMAotCXVsdwkkNCwxCi0JdWx3CSQ0LDB4ODAwMAotCXVsdwkkNCwtMHg4MDAwCi0JdWx3CSQ0LDB4MTAwMDAKLQl1bHcJJDQsMHgxYTVhNQotCXVsdwkkNCwwKCQ1KQotCXVsdwkkNCwxKCQ1KQotCXVsdwkkNCxkYXRhX2xhYmVsCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1bHcJJDQsZGF0YV9sYWJlbCsxCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1bHcJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVsdwkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdWx3CSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdWx3CSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjMGI3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyB1c2QKLSNhczogLW1pcHMzIC1tY3B1PXI0MDAwCi0KLSMgVGVzdCB0aGUgdXNkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IHNkbAlcJGEwLFsxOF1cKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBzZHIJXCRhMCxbMThdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAxNCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBzZGwJXCRhMCwtMzI3NlsxOF1cKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBzZHIJXCRhMCwtMzI3NlsxOF1cKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMzggPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAzYyA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGExXCkKLTArMDA0OCA8W14+XSo+IHNkbAlcJGEwLFsxOF1cKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gc2RyCVwkYTAsWy0wLTldK1woXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDZjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNzggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwODggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA5MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDk0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA5YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYTggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYjAgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGJjIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwY2MgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBkMCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGQ0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlOCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGVjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZjAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmOCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTAwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTA4IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDEyNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDEzNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTYwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE3YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTgwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxODQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMThjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFiNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWM0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFlMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWU0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFlYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWYwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIwMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjA0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIwYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIyNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIyYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjMwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI0NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjU0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI2NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjcwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyODQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI4OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJhNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJiMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmMwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyY2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJkMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmQ0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzNjczNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHVzZCBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdXNkCSQ0LDAKLQl1c2QJJDQsMQotCXVzZAkkNCwweDgwMDAKLQl1c2QJJDQsLTB4ODAwMAotCXVzZAkkNCwweDEwMDAwCi0JdXNkCSQ0LDB4MWE1YTUKLQl1c2QJJDQsMCgkNSkKLQl1c2QJJDQsMSgkNSkKLQl1c2QJJDQsZGF0YV9sYWJlbAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24KLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdXNkCSQ0LGRhdGFfbGFiZWwrMQotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JdXNkCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c2QJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c2QJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzZAkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzZAkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2guZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjBhMTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2guZAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdXNoCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIHVzaCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKLTArMDAwOCA8W14+XSo+IHNiCVwkYXQsWzAxXVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IHNiCVwkYTAsWzEyXVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHg4Ci0wKzAwMTQgPFtePl0qPiBzYglcJGF0LFsxMl1cKFwkemVyb1wpCi0wKzAwMTggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDAyMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwMjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDI4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAzNCA8W14+XSo+IHNiCVwkYTAsLTMyNzZbNzhdXChcJHplcm9cKQotMCswMDM4IDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKLTArMDAzYyA8W14+XSo+IHNiCVwkYXQsLTMyNzZbNzhdXChcJHplcm9cKQotMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDA0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNjAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwNmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA3YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhMVwpCi0wKzAwODAgPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAotMCswMDg0IDxbXj5dKj4gc2IJXCRhdCxbMDFdXChcJGExXCkKLTArMDA4OCA8W14+XSo+IHNiCVwkYTAsWzEyXVwoXCRhMVwpCi0wKzAwOGMgPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAotMCswMDkwIDxbXj5dKj4gc2IJXCRhdCxbMTJdXChcJGExXCkKLTArMDA5NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA5OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA5YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYTAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMGE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBhOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGFjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBiMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDBjNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYzggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBjYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZDAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwZTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGU0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwZTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGVjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBmMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTAwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEwNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTA4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDEwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxMTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSoxMTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDExYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDEyNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTM0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxM2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTQwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTQ4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDE1OCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxNWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE2MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTcwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxNzggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTdjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxODAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTg0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTkwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxOTggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTljIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxYTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWIwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDFiNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFiYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxYzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMWM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWNjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFkMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxZDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWQ4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxZGMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWUwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKjFlNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFlOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZWMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMWYwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFmNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFmYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjA4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIwYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyMTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjE0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDIyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjIyMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDIyYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyMzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDI0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyNTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMjZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyN2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMjhjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyOWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMmFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJiMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJiOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyYmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDJjYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyZDAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJkNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyZDggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmU0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJlOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyZWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmYwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyZjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmY4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJmYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzA0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMwOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzMGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzEwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzMTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDMxYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzMjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMzJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDMzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzM2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMzRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzY4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDM2YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM3NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzNzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzg0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM4OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzOGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzkwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzOTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzk4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzYTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzYTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2E4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDNhYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzYjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNiNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzYjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2JjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDNjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNjNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzYzggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswM2NjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNkMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2Q0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNkOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzZGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2RjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDNlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzZTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2U4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDNlYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzZjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNmNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzZjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2ZjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2ZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDQwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjQwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDA4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDQwYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0MTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0MjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0M2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0M2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNDQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0NDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0NWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNDYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0NjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNDZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0N2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0ODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ODQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDg4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDQ4YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0OTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQ5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0OTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDljIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNGEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNGEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNGE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDRhOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0YWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0YjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNGI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDRiYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0YzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0YzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGM0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDRjOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0Y2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGQwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0ZDQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNGQ4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDRkYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0ZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNGU0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDRlOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0ZWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNGYwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0ZjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNGY4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDRmYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTA4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDUwYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1MTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDUxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1MTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNTFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjUyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDUyYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1MzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDUzNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1MzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNTNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDU0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDU0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1NTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDU1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1NTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA1NmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA1NzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNTc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDU3YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjU3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDU4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDU4NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1ODggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNThjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNTk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDU5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1OWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1OWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNWEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDVhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1YTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNWFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDViMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNWI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDViOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1YmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTU1ODE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdXNoIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQl1c2gJJDQsMAotCXVzaAkkNCwxCi0JdXNoCSQ0LDB4ODAwMAotCXVzaAkkNCwtMHg4MDAwCi0JdXNoCSQ0LDB4MTAwMDAKLQl1c2gJJDQsMHgxYTVhNQotCXVzaAkkNCwwKCQ1KQotCXVzaAkkNCwxKCQ1KQotCXVzaAkkNCxkYXRhX2xhYmVsCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQl1c2gJJDQsZGF0YV9sYWJlbCsxCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQl1c2gJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzaAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JdXNoCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JdXNoCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c3cuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkMjhjYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1c3cKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgdXN3IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IHN3bAlcJGEwLFsxNF1cKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBzd3IJXCRhMCxbMTRdXChcJHplcm9cKQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAxNCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMWMgPFtePl0qPiBzd2wJXCRhMCwtMzI3Nls1OF1cKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBzd3IJXCRhMCwtMzI3Nls1OF1cKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMzggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzYyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGExXCkKLTArMDA0OCA8W14+XSo+IHN3bAlcJGEwLFsxNF1cKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gc3dyCVwkYTAsWy0wLTldK1woXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA2YyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNzggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA4OCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA5NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYTggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiMCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiYyA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwY2MgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkMCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSplNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBlYyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBmOCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMDggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDExNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDExYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEyNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTM0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE2NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTcwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTgwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxODQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFiNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFkNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFkYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFlMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWU0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFmNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFmYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIwNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjE0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI0NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjUwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjcwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNzQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI4NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI5NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJhNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmM0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJkMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c3cucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxYzYwYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHVzdyBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdXN3CSQ0LDAKLQl1c3cJJDQsMQotCXVzdwkkNCwweDgwMDAKLQl1c3cJJDQsLTB4ODAwMAotCXVzdwkkNCwweDEwMDAwCi0JdXN3CSQ0LDB4MWE1YTUKLQl1c3cJJDQsMCgkNSkKLQl1c3cJJDQsMSgkNSkKLQl1c3cJJDQsZGF0YV9sYWJlbAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24KLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdXN3CSQ0LGRhdGFfbGFiZWwrMQotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JdXN3CSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c3cJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzdwkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzdwkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjUxYmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9hZGQucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotCWFkZCBkMSxkMgotCWFkZCBkMixhMwotCWFkZCBhMixkMQotCWFkZCBhMyxhMgotCWFkZCAxNixkMQotCWFkZCAyNTYsZDIKLQlhZGQgMTMxMDcxLGQzCi0JYWRkIDE2LGExCi0JYWRkIDI1NixhMgotCWFkZCAxMzEwNzEsYTMKLQlhZGRjIGQxLGQyCi0JYWRkbmYgMTYsYTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmFzaWMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iYXNpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTNlYjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19hZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkLnM6IEFkZCBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYyMEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYyQzlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYyNEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEQ1MTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEY3MUEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGNDYzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEQxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY3MEEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGNDY3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZCBGMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZiBGNTBFMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JjYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiY2MuczogQmNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmNjLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTgwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRTkwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRTIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRTMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRTUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRTYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRTcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRTQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjVGQzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGNUZEMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEY1RkUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWQgRjVGRjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBFQTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19iY2N4IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJjY3guczogQmNjeCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJjY3gucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNUU4MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY1RTkwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjVFMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGNUUyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY1RTMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjVFMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGNUU1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY1RTYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjVFNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiBGNUU0MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEY1RUMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRjVFRDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGNUVFMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEY1RUYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYml0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdC5zOiBiaXQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTA1NDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY3MDYwMDIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGMDI5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGMDM5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIgK0ZGRkY0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotcHJvYyBkb19jbXAge30gewotICAgIHNldCB0ZXN0bmFtZSAiY21wLnM6IGNtcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNtcC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzOTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYyMkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYyRUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYyNkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IERCMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEY3NEEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGNDc5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEVFMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjQ3REZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZXh0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dC5zOiBleHQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGM0M1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBCMlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEI3XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQkFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBCRFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZXh0ZW5kIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dGVuZC5zOiBleHRlbmRlZCBpbnN0cnVjdGlvbiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dGVuZC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1MDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY2RkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY5MDIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkIwMzAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEZEMDMwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGNjE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGOTE2MTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZCMTcwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGRDE3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEY2NEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY2NUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEY2NzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY1MDI3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjcwM0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEY3MTBGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGMzE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGNTBBN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY3NDNGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNzE0RkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjc0RkZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYzRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb29wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvb3AuczogbG9vcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvb3AucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEOFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEQ5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRDFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBEMlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQzXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBENVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEQ2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDdcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBENFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIERBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgREJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjEuczogbW92MSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjEucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMjM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMkY5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA4NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYyNzlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEYzRjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEYzRDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIEYzRTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEYzQzhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIDI5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgNjkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjdDOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY0ODlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92Mi5zOiBtb3YyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92Mi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYxNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEM5MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjRDMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSA3OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGN0I5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjRGOUZGRkYgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjExNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRjczMTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIEY0RDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjMge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92My5zOiBtb3YzIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92My5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSA0OTIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNzg5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjQwOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGMUU5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBDMTgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDExIEY0NDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgNTkyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjdBOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY0MTlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjQge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92NC5zOiBtb3Y0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92NC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYxQTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY3MjE4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGNDUxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIDg1MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEY5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjQ3MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBERDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY0NzVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92eCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Z4LnM6IG1vdnggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Z4LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjU3OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNzc5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjRCOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGNTU5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY3NjkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGNDM5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PThdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZiLnM6IG1vdmIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZiLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjUyOTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGN0Q5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjRBOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGMDZCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGNEM2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIDE5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNTE5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEY3OTkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiBGNDI5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGMEU5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBDNTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI1IEY0NDVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmJ1IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdmJ1LnM6IG1vdmJ1IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92YnUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjUzOTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNzU5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjQ5OUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGMDk2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBDRDAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY0QzlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZodSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZodS5zOiBtb3ZodSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmh1LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjA2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjg2NjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGQTY2MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkM2NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY4QkQwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFCRDAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZDQkQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNEE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSAzOTgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIxIEZDQUQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTEgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjA3NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgRjg3NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQTc2MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRkM3NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGODk3MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM5IEZBOTc4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZCBGQzk3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE4ICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQzIEY0REFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ1IDA3MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkM4NzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdm0uczogbW92bSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdm0ucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDRTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBDRUY4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDRjMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBDRkY4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX211bGRpdiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtdWxkaXYuczogbXVsZGl2IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibXVsZGl2LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjM0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjM1QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjM2RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19vdGhlciB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJvdGhlci5zOiBvdGhlciB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm90aGVyLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRkMwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNEUwRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEYwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEZEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjRFMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGMDA5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGlmdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaGlmdC5zOiBzaGlmdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoaWZ0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjMzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjMzNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjMzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViLnM6IHN1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1Yi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMkRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMjVFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGNzFFRkY3RiBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIEY0NkFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjcwRUZGN0YgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNDZFRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE5IEYyOTYgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IG1uMTAyMDAqLSotKl0gdGhlbiB7Ci0gICAgIyBUZXN0IHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBwYXJzZXIuCi0gICAgZG9fYWRkCi0gICAgZG9fYmNjCi0gICAgZG9fYmNjeAotICAgIGRvX2JpdAotICAgIGRvX2NtcAotICAgIGRvX2V4dAotICAgIGRvX2xvZ2ljYWwKLSAgICBkb19tb3YxCi0gICAgZG9fbW92MgotICAgIGRvX21vdjMKLSAgICBkb19tb3Y0Ci0gICAgZG9fbW92YgotICAgIGRvX21vdngKLSAgICBkb19tb3ZidQotICAgIGRvX211bGRpdgotICAgIGRvX290aGVyCi0gICAgZG9fc2hpZnQKLSAgICBkb19zdWIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkyZGNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0JLnRleHQKLWZvbzoKLQliZXEgZm9vCi0JYm5lIGZvbwotCWJndCBmb28KLQliZ2UgZm9vCi0JYmxlIGZvbwotCWJsdCBmb28KLQliaGkgZm9vCi0JYmNjIGZvbwotCWJscyBmb28JCi0JYmNzIGZvbwotCWJ2YyBmb28KLQlidnMgZm9vCi0JYm5jIGZvbwotCWJucyBmb28KLQlicmEgZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjY3gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjeC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGU3ZWRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjeC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci0JYmVxeCBmb28KLQlibmV4IGZvbwotCWJndHggZm9vCi0JYmdleCBmb28KLQlibGV4IGZvbwotCWJsdHggZm9vCi0JYmhpeCBmb28KLQliY2N4IGZvbwotCWJsc3ggZm9vCQotCWJjc3ggZm9vCi0JYnZjeCBmb28KLQlidnN4IGZvbwotCWJuY3ggZm9vCi0JYm5zeCBmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JpdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGI2MGQ0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCWJ0c3QgNjQsZDEKLQlidHN0IDgxOTIsZDIKLQlic2V0IGQxLChhMikKLQliY2xyIGQxLChhMikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvY21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2NtcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzM5MjViLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvY21wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQljbXAgZDEsZDIKLQljbXAgZDIsYTMKLQljbXAgYTMsZDMKLQljbXAgYTMsYTIKLQljbXAgMTYsZDMKLQljbXAgMjU2LGQyCi0JY21wIDEzMTA3MSxkMQotCWNtcCAyNTYsYTIKLQljbXAgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2V4dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9leHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlMDFiYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2V4dC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLnRleHQKLQlleHQgZDEKLQlleHR4IGQyCi0JZXh0eHUgZDMKLQlleHR4YiBkMgotCWV4dHhidSBkMQotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9sb2dpY2FsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2xvZ2ljYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwOWQ3Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2xvZ2ljYWwucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkudGV4dAotCWFuZCBkMSxkMgotCWFuZCAxMjcsZDIKLQlhbmQgMzI3NjcsZDMKLQlhbmQgMzI3NjcscHN3Ci0Jb3IgZDEsZDIKLQlvciAxMjcsZDIKLQlvciAzMjc2NyxkMwotCW9yIDMyNzY3LHBzdwotCXhvciBkMSxkMgotCXhvciAzMjc2NyxkMwotCW5vdCBkMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyOGUzMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjEucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotCW1vdiBkMSxhMgotCW1vdiBhMixkMQotCW1vdiBkMSxkMgotCW1vdiBhMixhMQotCW1vdiBwc3csZDMKLQltb3YgZDIscHN3Ci0JbW92IG1kcixkMQotCW1vdiBkMixtZHIKLQltb3YgKGEyKSxkMQotCW1vdiAoOCxhMiksZDEKLQltb3YgKDI1NixhMiksZDEKLQltb3YgKDEzMTA3MSxhMiksZDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjZlMjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQltb3YgKGQxLGExKSxkMgotCW1vdiAoMzI3NjgpLGQxCi0JbW92ICgxMzEwNzEpLGQxCi0JbW92ICg4LGEyKSxhMQotCW1vdiAoMjU2LGEyKSxhMQotCW1vdiAoMTMxMDcxLGEyKSxhMQotCW1vdiAoZDEsYTEpLGEyCi0gICAgICAgIG1vdiAoMzI3NjgpLGExCi0gICAgICAgIG1vdiAoMTMxMDcxKSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ3NDkwYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjMucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkudGV4dAotICAgICAgICBtb3YgZDEsKGEyKQotICAgICAgICBtb3YgZDEsKDMyLGEyKQotCW1vdiBkMSwoMjU2LGEyKQotCW1vdiBkMSwoMTMxMDcxLGEyKQotCW1vdiBkMSwoZDIsYTIpCi0JbW92IGQxLCgxMjgpCi0JbW92IGQxLCgxMzEwNzEpCi0JbW92IGExLCgzMixhMikKLQltb3YgYTEsKDI1NixhMikKLQltb3YgYTEsKDEzMTA3MSxhMikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Y0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMTg3ZTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Y0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQkudGV4dAotCW1vdiBhMSwoZDIsYTIpCi0JbW92IGExLCgxMjgpCi0JbW92IGExLCgxMzEwNzEpCi0JbW92IDgsZDEKLQltb3YgMjU2LGQxCi0JbW92IDEzMTA3MSxkMQotCW1vdiAyNTYsYTEKLQltb3YgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU2NjE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci0JbW92YiAoOCxhMiksZDEKLQltb3ZiICgyNTYsYTIpLGQxCi0JbW92YiAoMTMxMDcxLGEyKSxkMQotCW1vdmIgKGQyLGEyKSxkMwotCW1vdmIgKDEzMTA3MSksZDIKLQltb3ZiIGQxLChhMikKLQltb3ZiIGQxLCg4LGEyKQotCW1vdmIgZDEsKDI1NixhMikKLQltb3ZiIGQxLCgxMzEwNzEsYTIpCi0JbW92YiBkMSwoZDIsYTIpCi0JbW92YiBkMSwoMjU2KQotCW1vdmIgZDEsKDEzMTA3MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92YnUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92YnUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkOTczYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmJ1LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotCW1vdmJ1IChhMiksZDEKLQltb3ZidSAoOCxhMiksZDEKLQltb3ZidSAoMjU2LGEyKSxkMQotCW1vdmJ1ICgxMzEwNzEsYTIpLGQxCi0JbW92YnUgKGQxLGExKSxkMgotCW1vdmJ1ICgzMjc2OCksZDEKLQltb3ZidSAoMTMxMDcxKSxkMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Z4LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdngucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlMWQ3MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdngucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS50ZXh0Ci0JbW92eCAoOCxhMiksZDEKLQltb3Z4ICgyNTYsYTIpLGQxCi0JbW92eCAoMTMxMDcxLGEyKSxkMQotCW1vdnggZDEsKDgsYTIpCi0JbW92eCBkMSwoMjU2LGEyKQotCW1vdnggZDEsKDEzMTA3MSxhMikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbXVsZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL211bGRpdi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE3MDI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbXVsZGl2LnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQkudGV4dAotCW11bCBkMSxkMgotCW11bHUgZDIsZDMKLQlkaXZ1IGQzLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL290aGVyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL290aGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjk0YmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9vdGhlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0Jam1wIDI1NgotCWptcCAxMzEwNzEKLQlqbXAgKGEyKQotCWpzciAyNTYKLQlqc3IgMTMxMDcxCi0JanNyIChhMikKLQlydHMKLQlydGkKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc2hpZnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc2hpZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZTc2OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3NoaWZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCWFzciBkMgotCWxzciBkMwotCXJvciBkMQotCXJvbCBkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc3ViLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTE2NTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zdWIucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCXN1YiBkMSxkMgotCXN1YiBkMixhMwotCXN1YiBhMyxkMwotCXN1YiBhMyxhMgotCXN1YiAzMjc2NyxkMgotCXN1YiAxMzEwNzEsZDIKLQlzdWIgMzI3NjcsYTIKLQlzdWIgMTMxMDcxLGEyCi0Jc3ViYyBkMSxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjU1OGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hZGQucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotCWFkZCBkMSxkMgotCWFkZCBkMixhMwotCWFkZCBhMyxhMgotCWFkZCBhMixkMQotCWFkZCAxNixkMQotCWFkZCAyNTYsZDIKLQlhZGQgMTMxMDcxLGQzCi0JYWRkIDE2LGExCi0JYWRkIDI1NixhMgotCWFkZCAxMzEwNzEsYTMKLQlhZGQgMTYsc3AKLQlhZGQgMjU2LHNwCi0JYWRkIDEzMTA3MSxzcAotCWFkZGMgZDEsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZDNiNmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0JLnRleHQKLQkuYW0zMwotCWNhbGwgMjU2LFthMixhMyxleHJlZzBdLDkKLQljYWxsIDI1NixbYTIsYTMsZXhyZWcxXSw5Ci0JY2FsbCAyNTYsW2EyLGEzLGV4b3RoZXJdLDkKLQljYWxsIDI1NixbYTIsYTMsYWxsXSw5Ci0JY2FsbCAxMzEwNzEsW2EyLGEzLGV4cmVnMF0sOQotCWNhbGwgMTMxMDcxLFthMixhMyxleHJlZzFdLDkKLQljYWxsIDEzMTA3MSxbYTIsYTMsZXhvdGhlcl0sOQotCWNhbGwgMTMxMDcxLFthMixhMyxhbGxdLDkKLQltb3ZtIChzcCksW2EyLGEzLGV4cmVnMF0KLQltb3ZtIChzcCksW2EyLGEzLGV4cmVnMV0KLQltb3ZtIChzcCksW2EyLGEzLGV4b3RoZXJdCi0JbW92bSAoc3ApLFthMixhMyxhbGxdCi0JbW92bSBbYTIsYTMsZXhyZWcwXSwoc3ApCi0JbW92bSBbYTIsYTMsZXhyZWcxXSwoc3ApCi0JbW92bSBbYTIsYTMsZXhvdGhlcl0sKHNwKQotCW1vdm0gW2EyLGEzLGFsbF0sKHNwKQotCW1vdm0gKHVzcCksW2EyLGEzLGV4cmVnMF0KLQltb3ZtICh1c3ApLFthMixhMyxleHJlZzFdCi0JbW92bSAodXNwKSxbYTIsYTMsZXhvdGhlcl0KLQltb3ZtICh1c3ApLFthMixhMyxhbGxdCi0JbW92bSBbYTIsYTMsZXhyZWcwXSwodXNwKQotCW1vdm0gW2EyLGEzLGV4cmVnMV0sKHVzcCkKLQltb3ZtIFthMixhMyxleG90aGVyXSwodXNwKQotCW1vdm0gW2EyLGEzLGFsbF0sKHVzcCkKLQltb3YgdXNwLGEwCi0JbW92IHNzcCxhMQotCW1vdiBtc3AsYTIKLQltb3YgcGMsYTMKLQltb3YgYTAsdXNwCi0JbW92IGExLHNzcAotCW1vdiBhMixtc3AKLQlzeXNjYWxsIDB4NAotCW1vdiBlcHN3LGQwCi0JbW92IGQxLGVwc3cKLQltb3YgYTAscjEKLQltb3YgZDIscjMKLQltb3YgcjUsYTEKLQltb3YgcjcsZDMKLQltY3N0OSBkMAotCW1jc3Q0OCBkMQotCWdldGNoeCBkMAotCWdldGNseCBkMQotCWFuZCAxMzEwNzIsZXBzdwotCW9yIDY1NTM1LGVwc3cKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM18yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmYyYTg3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM18yLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0JLnRleHQKLQkuYW0zMwotCW1vdiByMCxyMQotCWV4dCByMgotCWV4dGIgcjMscjQKLQlleHRidSByNCxyNQotCWV4dGggcjYscjcKLQlleHRodSByNyxyOAotCWNsciByOQotCWFkZCByMTAscjExCi0JYWRkYyByMTIscjEzCi0Jc3ViIHIxNCxyMTUKLQlzdWJjIHIxNSxyMTQKLQlpbmMgcjEzCi0JaW5jNCByMTIKLQljbXAgcjExLHIxMAotCW1vdiB4cjAsIHIxCi0JbW92IHIxLCB4cjIKLQlhbmQgcjAscjEKLQlvciByMixyMwotCXhvciByNCxyNQotCW5vdCByNgotCWFzciByNyxyOAotCWxzciByOSxyMTAKLQlhc2wgcjExLHIxMgotCWFzbDIgcjEzCi0Jcm9yIHIxNAotCXJvbCByMTUKLQltdWwgcjEscjIKLQltdWx1IHIzLHI0Ci0JZGl2IHI1LHI2Ci0JZGl2dSByNyxyOAotCW1vdiAocjEpLHIyCi0JbW92IHIzLChyNCkKLQltb3ZidSAocjUpLHI2Ci0JbW92YnUgcjcsKHI4KQotCW1vdmh1IChyOSkscjEwCi0JbW92aHUgcjExLChyMTIpCi0JbW92IChyMSspLHIyCi0JbW92IHIzLChyNCspCi0JbW92IChzcCkscjUKLQltb3YgcjYsKHNwKQotCW1vdmJ1IChzcCkscjcKLQltb3ZidSByOCwoc3ApCi0JbW92aHUgKHNwKSxyOQotCW1vdmh1IHIxMCwoc3ApCi0JbW92aHUgKHI2KykscjcKLQltb3ZodSByOCwocjkrKQotCW1hYyByMSxyMgotCW1hY3UgcjMscjQKLQltYWNiIHI1LHI2Ci0JbWFjYnUgcjcscjgKLQltYWNoIHI5LHIxMAotCW1hY2h1IHIxMSxyMTIKLQlkbWFjaCByMTMscjE0Ci0JZG1hY2h1IHIxNSxyMTQKLQlkbXVsaCByMTMscjEyCi0JZG11bGh1IHIxMSxyMTAKLQlzYXQxNiByOSxyOAotCW1jc3RlIHI3LHI2Ci0Jc3dhcCByNSxyNAotCXN3YXBoIHIzLHIyCi0Jc3dodyAgcjEscjAKLQlic2NoIHIxLHIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmYWRiNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfMy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQltb3YgMTYscjEKLQltb3Z1IDE2LHIxCi0JYWRkIDE2LHIxCi0JYWRkYyAxNixyMQotCXN1YiAxNixyMQotCXN1YmMgMTYscjEKLQljbXAgMTYscjEKLQltb3YgMTYseHIxCi0JYW5kIDE2LHIxCi0Jb3IgMTYscjEKLQl4b3IgMTYscjEKLQlhc3IgMTYscjEKLQlsc3IgMTYscjEKLQlhc2wgMTYscjEKLQltdWwgMTYscjEKLQltdWx1IDE2LHIxCi0JYnRzdCAxNixyMQotCW1vdiAoMTYscjEpLHIyCi0JbW92IHIyLCgxNixyMSkKLQltb3ZidSAoMTYscjEpLHIyCi0JbW92YnUgcjIsKDE2LHIxKQotCW1vdmh1ICgxNixyMSkscjIKLQltb3ZodSByMiwoMTYscjEpCi0JbW92ICgxNixzcCkscjIKLQltb3YgcjIsKDE2LHNwKQotCW1vdmJ1ICgxNixzcCkscjIKLQltb3ZidSByMiwoMTYsc3ApCi0JbW92aHUgKDE2LHNwKSxyMgotCW1vdmh1IHIyLCgxNixzcCkKLQltYWMgMTYscjEKLQltYWN1IDE2LHIxCi0JbWFjYiAxNixyMQotCW1hY2J1IDE2LHIxCi0JbWFjaCAxNixyMQotCW1hY2h1IDE2LHIxCi0JbWNzdGUgMTYscjEKLQlhZGQgcjEscjIscjMKLQltb3YgKHIxKywxNikscjIKLQltb3YgcjEsKHIyKywxNikKLQltb3ZodSAocjErLDE2KSxyMgotCW1vdmh1IHIxLChyMissMTYpCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5MGZkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQltb3YgMHgxZmZlZmYscjIKLQltb3Z1IDB4MWZmZWZmLHIyCi0JYWRkIDB4MWZmZWZmLHIyCi0JYWRkYyAweDFmZmVmZixyMgotCXN1YiAweDFmZmVmZixyMgotCXN1YmMgMHgxZmZlZmYscjIKLQljbXAgMHgxZmZlZmYscjIKLQltb3YgMHgxZmZlZmYseHIyCi0JYW5kIDB4MWZmZWZmLHIyCi0Jb3IgMHgxZmZlZmYscjIKLQl4b3IgMHgxZmZlZmYscjIKLQlhc3IgMHgxZmZlZmYscjIKLQlsc3IgMHgxZmZlZmYscjIKLQlhc2wgMHgxZmZlZmYscjIKLQltdWwgMHgxZmZlZmYscjIKLQltdWx1IDB4MWZmZWZmLHIyCi0JYnRzdCAweDFmZmVmZixyMgotCW1vdiAoMHgxZmZlZmYscjEpLHIyCi0JbW92IHIyLCgweDFmZmVmZixyMSkKLQltb3ZidSAoMHgxZmZlZmYscjEpLHIyCi0JbW92YnUgcjIsKDB4MWZmZWZmLHIxKQotCW1vdmh1ICgweDFmZmVmZixyMSkscjIKLQltb3ZodSByMiwoMHgxZmZlZmYscjEpCi0JbW92ICgweDFmZmVmZixzcCkscjIKLQltb3YgcjIsKDB4MWZmZWZmLHNwKQotCW1vdmJ1ICgweDFmZmVmZixzcCkscjIKLQltb3ZidSByMiwoMHgxZmZlZmYsc3ApCi0JbW92aHUgKDB4MWZmZWZmLHNwKSxyMgotCW1vdmh1IHIyLCgweDFmZmVmZixzcCkKLQltYWMgMHgxZmZlZmYscjIKLQltYWN1IDB4MWZmZWZmLHIyCi0JbWFjYiAweDFmZmVmZixyMgotCW1hY2J1IDB4MWZmZWZmLHIyCi0JbWFjaCAweDFmZmVmZixyMgotCW1hY2h1IDB4MWZmZWZmLHIyCi0JbW92ICgweDFmZmVmZikscjIKLQltb3YgcjIsKDB4MWZmZWZmKQotCW1vdmJ1ICgweDFmZmVmZikscjIKLQltb3ZidSByMiwoMHgxZmZlZmYpCi0JbW92aHUgKDB4MWZmZWZmKSxyMgotCW1vdmh1IHIyLCgweDFmZmVmZikKLQltb3YgKHIxKywweDFmZmVmZikscjIKLQltb3YgcjEsKHIyKywweDFmZmVmZikKLQltb3ZodSAocjErLDB4MWZmZWZmKSxyMgotCW1vdmh1IHIxLChyMissMHgxZmZlZmYpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlM2EzOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNS5zCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQltb3YgMHg3ZmZlZmRmYyxyMgotCW1vdnUgMHg3ZmZlZmRmYyxyMgotCWFkZCAweDdmZmVmZGZjLHIyCi0JYWRkYyAweDdmZmVmZGZjLHIyCi0Jc3ViIDB4N2ZmZWZkZmMscjIKLQlzdWJjIDB4N2ZmZWZkZmMscjIKLQljbXAgMHg3ZmZlZmRmYyxyMgotCW1vdiAweDdmZmVmZGZjLHhyMgotCWFuZCAweDdmZmVmZGZjLHIyCi0Jb3IgMHg3ZmZlZmRmYyxyMgotCXhvciAweDdmZmVmZGZjLHIyCi0JYXNyIDB4N2ZmZWZkZmMscjIKLQlsc3IgMHg3ZmZlZmRmYyxyMgotCWFzbCAweDdmZmVmZGZjLHIyCi0JbXVsIDB4N2ZmZWZkZmMscjIKLQltdWx1IDB4N2ZmZWZkZmMscjIKLQlidHN0IDB4N2ZmZWZkZmMscjIKLQltb3YgKDB4N2ZmZWZkZmMscjEpLHIyCi0JbW92IHIyLCgweDdmZmVmZGZjLHIxKQotCW1vdmJ1ICgweDdmZmVmZGZjLHIxKSxyMgotCW1vdmJ1IHIyLCgweDdmZmVmZGZjLHIxKQotCW1vdmh1ICgweDdmZmVmZGZjLHIxKSxyMgotCW1vdmh1IHIyLCgweDdmZmVmZGZjLHIxKQotCW1vdiAoMHg3ZmZlZmRmYyxzcCkscjIKLQltb3YgcjIsKDB4N2ZmZWZkZmMsc3ApCi0JbW92YnUgKDB4N2ZmZWZkZmMsc3ApLHIyCi0JbW92YnUgcjIsKDB4N2ZmZWZkZmMsc3ApCi0JbW92aHUgKDB4N2ZmZWZkZmMsc3ApLHIyCi0JbW92aHUgcjIsKDB4N2ZmZWZkZmMsc3ApCi0JbWFjIDB4N2ZmZWZkZmMscjIKLQltYWN1IDB4N2ZmZWZkZmMscjIKLQltYWNiIDB4N2ZmZWZkZmMscjIKLQltYWNidSAweDdmZmVmZGZjLHIyCi0JbWFjaCAweDdmZmVmZGZjLHIyCi0JbWFjaHUgMHg3ZmZlZmRmYyxyMgotCWRtYWNoIDB4N2ZmZWZkZmMscjIKLQlkbWFjaHUgMHg3ZmZlZmRmYyxyMgotCWRtdWxoIDB4N2ZmZWZkZmMscjIKLQlkbXVsaHUgMHg3ZmZlZmRmYyxyMgotCW1vdiAoMHg3ZmZlZmRmYykscjIKLQltb3YgcjIsKDB4N2ZmZWZkZmMpCi0JbW92YnUgKDB4N2ZmZWZkZmMpLHIyCi0JbW92YnUgcjIsKDB4N2ZmZWZkZmMpCi0JbW92aHUgKDB4N2ZmZWZkZmMpLHIyCi0JbW92aHUgcjIsKDB4N2ZmZWZkZmMpCi0JbXVsIGQwLGQxLGEwLGExCi0JbXVsdSBkMCxkMSxhMCxhMQotCW1vdiAocjErLDB4N2ZmZWZkZmMpLHIyCi0JbW92IHIxLChyMissMHg3ZmZlZmRmYykKLQltb3ZodSAocjErLDB4N2ZmZWZkZmMpLHIyCi0JbW92aHUgcjEsKHIyKywweDdmZmVmZGZjKQotCW1vdiAoLTE2LHNwKSxyMgotCW1vdiByMiwoLTE2LHNwKQotCW1vdmJ1ICgtMTYsc3ApLHIyCi0JbW92YnUgcjIsKC0xNixzcCkKLQltb3ZodSAoLTE2LHNwKSxyMgotCW1vdmh1IHIyLCgtMTYsc3ApCi0JbW92ICgtMTAyNCxzcCkscjIKLQltb3YgcjIsKC0xMDI0LHNwKQotCW1vdmJ1ICgtMTAyNCxzcCkscjIKLQltb3ZidSByMiwoLTEwMjQsc3ApCi0JbW92aHUgKC0xMDI0LHNwKSxyMgotCW1vdmh1IHIyLCgtMTAyNCxzcCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM182LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ2NmYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM182LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0JLnRleHQKLQkuYW0zMwotCWFkZF9hZGQgcjQscjEscjIscjMKLQlhZGRfYWRkIHI0LHIxLDIscjMKLQlhZGRfc3ViIHI0LHIxLHIyLHIzCi0JYWRkX3N1YiByNCxyMSwyLHIzCi0JYWRkX2NtcCByNCxyMSxyMixyMwotCWFkZF9jbXAgcjQscjEsMixyMwotCWFkZF9tb3YgcjQscjEscjIscjMKLQlhZGRfbW92IHI0LHIxLDIscjMKLQlhZGRfYXNyIHI0LHIxLHIyLHIzCi0JYWRkX2FzciByNCxyMSwyLHIzCi0JYWRkX2xzciByNCxyMSxyMixyMwotCWFkZF9sc3IgcjQscjEsMixyMwotCWFkZF9hc2wgcjQscjEscjIscjMKLQlhZGRfYXNsIHI0LHIxLDIscjMKLQljbXBfYWRkIHI0LHIxLHIyLHIzCi0JY21wX2FkZCByNCxyMSwyLHIzCi0JY21wX3N1YiByNCxyMSxyMixyMwotCWNtcF9zdWIgcjQscjEsMixyMwotCWNtcF9tb3YgcjQscjEscjIscjMKLQljbXBfbW92IHI0LHIxLDIscjMKLQljbXBfYXNyIHI0LHIxLHIyLHIzCi0JY21wX2FzciByNCxyMSwyLHIzCi0JY21wX2xzciByNCxyMSxyMixyMwotCWNtcF9sc3IgcjQscjEsMixyMwotCWNtcF9hc2wgcjQscjEscjIscjMKLQljbXBfYXNsIHI0LHIxLDIscjMKLQlzdWJfYWRkIHI0LHIxLHIyLHIzCi0Jc3ViX2FkZCByNCxyMSwyLHIzCi0Jc3ViX3N1YiByNCxyMSxyMixyMwotCXN1Yl9zdWIgcjQscjEsMixyMwotCXN1Yl9jbXAgcjQscjEscjIscjMKLQlzdWJfY21wIHI0LHIxLDIscjMKLQlzdWJfbW92IHI0LHIxLHIyLHIzCi0Jc3ViX21vdiByNCxyMSwyLHIzCi0Jc3ViX2FzciByNCxyMSxyMixyMwotCXN1Yl9hc3IgcjQscjEsMixyMwotCXN1Yl9sc3IgcjQscjEscjIscjMKLQlzdWJfbHNyIHI0LHIxLDIscjMKLQlzdWJfYXNsIHI0LHIxLHIyLHIzCi0Jc3ViX2FzbCByNCxyMSwyLHIzCi0JbW92X2FkZCByNCxyMSxyMixyMwotCW1vdl9hZGQgcjQscjEsMixyMwotCW1vdl9zdWIgcjQscjEscjIscjMKLQltb3Zfc3ViIHI0LHIxLDIscjMKLQltb3ZfY21wIHI0LHIxLHIyLHIzCi0JbW92X2NtcCByNCxyMSwyLHIzCi0JbW92X21vdiByNCxyMSxyMixyMwotCW1vdl9tb3YgcjQscjEsMixyMwotCW1vdl9hc3IgcjQscjEscjIscjMKLQltb3ZfYXNyIHI0LHIxLDIscjMKLQltb3ZfbHNyIHI0LHIxLHIyLHIzCi0JbW92X2xzciByNCxyMSwyLHIzCi0JbW92X2FzbCByNCxyMSxyMixyMwotCW1vdl9hc2wgcjQscjEsMixyMwotCWFkZF9hZGQgNCxyMSxyMixyMwotCWFkZF9hZGQgNCxyMSwyLHIzCi0JYWRkX3N1YiA0LHIxLHIyLHIzCi0JYWRkX3N1YiA0LHIxLDIscjMKLQlhZGRfY21wIDQscjEscjIscjMKLQlhZGRfY21wIDQscjEsMixyMwotCWFkZF9tb3YgNCxyMSxyMixyMwotCWFkZF9tb3YgNCxyMSwyLHIzCi0JYWRkX2FzciA0LHIxLHIyLHIzCi0JYWRkX2FzciA0LHIxLDIscjMKLQlhZGRfbHNyIDQscjEscjIscjMKLQlhZGRfbHNyIDQscjEsMixyMwotCWFkZF9hc2wgNCxyMSxyMixyMwotCWFkZF9hc2wgNCxyMSwyLHIzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlZTVmNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQljbXBfYWRkIDQscjEscjIscjMKLQljbXBfYWRkIDQscjEsMixyMwotCWNtcF9zdWIgNCxyMSxyMixyMwotCWNtcF9zdWIgNCxyMSwyLHIzCi0JY21wX21vdiA0LHIxLHIyLHIzCi0JY21wX21vdiA0LHIxLDIscjMKLQljbXBfYXNyIDQscjEscjIscjMKLQljbXBfYXNyIDQscjEsMixyMwotCWNtcF9sc3IgNCxyMSxyMixyMwotCWNtcF9sc3IgNCxyMSwyLHIzCi0JY21wX2FzbCA0LHIxLHIyLHIzCi0JY21wX2FzbCA0LHIxLDIscjMKLQlzdWJfYWRkIDQscjEscjIscjMKLQlzdWJfYWRkIDQscjEsMixyMwotCXN1Yl9zdWIgNCxyMSxyMixyMwotCXN1Yl9zdWIgNCxyMSwyLHIzCi0Jc3ViX2NtcCA0LHIxLHIyLHIzCi0Jc3ViX2NtcCA0LHIxLDIscjMKLQlzdWJfbW92IDQscjEscjIscjMKLQlzdWJfbW92IDQscjEsMixyMwotCXN1Yl9hc3IgNCxyMSxyMixyMwotCXN1Yl9hc3IgNCxyMSwyLHIzCi0Jc3ViX2xzciA0LHIxLHIyLHIzCi0Jc3ViX2xzciA0LHIxLDIscjMKLQlzdWJfYXNsIDQscjEscjIscjMKLQlzdWJfYXNsIDQscjEsMixyMwotCW1vdl9hZGQgNCxyMSxyMixyMwotCW1vdl9hZGQgNCxyMSwyLHIzCi0JbW92X3N1YiA0LHIxLHIyLHIzCi0JbW92X3N1YiA0LHIxLDIscjMKLQltb3ZfY21wIDQscjEscjIscjMKLQltb3ZfY21wIDQscjEsMixyMwotCW1vdl9tb3YgNCxyMSxyMixyMwotCW1vdl9tb3YgNCxyMSwyLHIzCi0JbW92X2FzciA0LHIxLHIyLHIzCi0JbW92X2FzciA0LHIxLDIscjMKLQltb3ZfbHNyIDQscjEscjIscjMKLQltb3ZfbHNyIDQscjEsMixyMwotCW1vdl9hc2wgNCxyMSxyMixyMwotCW1vdl9hc2wgNCxyMSwyLHIzCi0JYW5kX2FkZCByNCxyMSxyMixyMwotCWFuZF9hZGQgcjQscjEsMixyMwotCWFuZF9zdWIgcjQscjEscjIscjMKLQlhbmRfc3ViIHI0LHIxLDIscjMKLQlhbmRfY21wIHI0LHIxLHIyLHIzCi0JYW5kX2NtcCByNCxyMSwyLHIzCi0JYW5kX21vdiByNCxyMSxyMixyMwotCWFuZF9tb3YgcjQscjEsMixyMwotCWFuZF9hc3IgcjQscjEscjIscjMKLQlhbmRfYXNyIHI0LHIxLDIscjMKLQlhbmRfbHNyIHI0LHIxLHIyLHIzCi0JYW5kX2xzciByNCxyMSwyLHIzCi0JYW5kX2FzbCByNCxyMSxyMixyMwotCWFuZF9hc2wgcjQscjEsMixyMwotCWRtYWNoX2FkZCByNCxyMSxyMixyMwotCWRtYWNoX2FkZCByNCxyMSwyLHIzCi0JZG1hY2hfc3ViIHI0LHIxLHIyLHIzCi0JZG1hY2hfc3ViIHI0LHIxLDIscjMKLQlkbWFjaF9jbXAgcjQscjEscjIscjMKLQlkbWFjaF9jbXAgcjQscjEsMixyMwotCWRtYWNoX21vdiByNCxyMSxyMixyMwotCWRtYWNoX21vdiByNCxyMSwyLHIzCi0JZG1hY2hfYXNyIHI0LHIxLHIyLHIzCi0JZG1hY2hfYXNyIHI0LHIxLDIscjMKLQlkbWFjaF9sc3IgcjQscjEscjIscjMKLQlkbWFjaF9sc3IgcjQscjEsMixyMwotCWRtYWNoX2FzbCByNCxyMSxyMixyMwotCWRtYWNoX2FzbCByNCxyMSwyLHIzCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM184LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfOC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmE5NmQ5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM184LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0JLnRleHQKLQkuYW0zMwotCXhvcl9hZGQgcjQscjEscjIscjMKLQl4b3JfYWRkIHI0LHIxLDIscjMKLQl4b3Jfc3ViIHI0LHIxLHIyLHIzCi0JeG9yX3N1YiByNCxyMSwyLHIzCi0JeG9yX2NtcCByNCxyMSxyMixyMwotCXhvcl9jbXAgcjQscjEsMixyMwotCXhvcl9tb3YgcjQscjEscjIscjMKLQl4b3JfbW92IHI0LHIxLDIscjMKLQl4b3JfYXNyIHI0LHIxLHIyLHIzCi0JeG9yX2FzciByNCxyMSwyLHIzCi0JeG9yX2xzciByNCxyMSxyMixyMwotCXhvcl9sc3IgcjQscjEsMixyMwotCXhvcl9hc2wgcjQscjEscjIscjMKLQl4b3JfYXNsIHI0LHIxLDIscjMKLQlzd2h3X2FkZCByNCxyMSxyMixyMwotCXN3aHdfYWRkIHI0LHIxLDIscjMKLQlzd2h3X3N1YiByNCxyMSxyMixyMwotCXN3aHdfc3ViIHI0LHIxLDIscjMKLQlzd2h3X2NtcCByNCxyMSxyMixyMwotCXN3aHdfY21wIHI0LHIxLDIscjMKLQlzd2h3X21vdiByNCxyMSxyMixyMwotCXN3aHdfbW92IHI0LHIxLDIscjMKLQlzd2h3X2FzciByNCxyMSxyMixyMwotCXN3aHdfYXNyIHI0LHIxLDIscjMKLQlzd2h3X2xzciByNCxyMSxyMixyMwotCXN3aHdfbHNyIHI0LHIxLDIscjMKLQlzd2h3X2FzbCByNCxyMSxyMixyMwotCXN3aHdfYXNsIHI0LHIxLDIscjMKLQlvcl9hZGQgcjQscjEscjIscjMKLQlvcl9hZGQgcjQscjEsMixyMwotCW9yX3N1YiByNCxyMSxyMixyMwotCW9yX3N1YiByNCxyMSwyLHIzCi0Jb3JfY21wIHI0LHIxLHIyLHIzCi0Jb3JfY21wIHI0LHIxLDIscjMKLQlvcl9tb3YgcjQscjEscjIscjMKLQlvcl9tb3YgcjQscjEsMixyMwotCW9yX2FzciByNCxyMSxyMixyMwotCW9yX2FzciByNCxyMSwyLHIzCi0Jb3JfbHNyIHI0LHIxLHIyLHIzCi0Jb3JfbHNyIHI0LHIxLDIscjMKLQlvcl9hc2wgcjQscjEscjIscjMKLQlvcl9hc2wgcjQscjEsMixyMwotCXNhdDE2X2FkZCByNCxyMSxyMixyMwotCXNhdDE2X2FkZCByNCxyMSwyLHIzCi0Jc2F0MTZfc3ViIHI0LHIxLHIyLHIzCi0Jc2F0MTZfc3ViIHI0LHIxLDIscjMKLQlzYXQxNl9jbXAgcjQscjEscjIscjMKLQlzYXQxNl9jbXAgcjQscjEsMixyMwotCXNhdDE2X21vdiByNCxyMSxyMixyMwotCXNhdDE2X21vdiByNCxyMSwyLHIzCi0Jc2F0MTZfYXNyIHI0LHIxLHIyLHIzCi0Jc2F0MTZfYXNyIHI0LHIxLDIscjMKLQlzYXQxNl9sc3IgcjQscjEscjIscjMKLQlzYXQxNl9sc3IgcjQscjEsMixyMwotCXNhdDE2X2FzbCByNCxyMSxyMixyMwotCXNhdDE2X2FzbCByNCxyMSwyLHIzCi0JbW92X2xsdCAocjErLDQpLHIyCi0JbW92X2xndCAocjErLDQpLHIyCi0JbW92X2xnZSAocjErLDQpLHIyCi0JbW92X2xsZSAocjErLDQpLHIyCi0JbW92X2xjcyAocjErLDQpLHIyCi0JbW92X2xoaSAocjErLDQpLHIyCi0JbW92X2xjYyAocjErLDQpLHIyCi0JbW92X2xscyAocjErLDQpLHIyCi0JbW92X2xlcSAocjErLDQpLHIyCi0JbW92X2xuZSAocjErLDQpLHIyCi0JbW92X2xyYSAocjErLDQpLHIyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmFzaWMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iYXNpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZjQ4MTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzY4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZC5zOiBBZGQgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMTZCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMTdFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMTU5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyAyOTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQUMyMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRkNDM0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIDIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEZBRDIwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOSBGQ0QzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFmIEY4RkUxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFGRTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEZDRkVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJjYy5zOiBCY2MgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiY2MucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDODAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBDOTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBDMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBDMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBDNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBDNjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBDNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBDNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGOEU4MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEY4RTkwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjhFQTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZCBGOEVCMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIENBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXQuczogYml0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjhFRDQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGQUVFMDAyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRkNFRkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEZBRjkwODQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMSBGRTAyRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxMDA0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEYwODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEZBRjEwODQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSBGRTAwRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzAxMDA0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI1IEYwOTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEZBRjUwODQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYiBGRTAxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyICswMTAwNDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19jbXAge30gewotICAgIHNldCB0ZXN0bmFtZSAiY21wLnM6IGNtcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNtcC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEE2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjFBQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjE5RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgQkVcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBBRjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGQUNBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRkNDOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEJGMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEZBREEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQ0Q5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHQuczogZXh0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjJEMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgMTJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyAxN1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDFBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgMURcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dGVuZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRlbmQuczogZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRlbmQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNkZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGOTAyMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZCMDMwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGRDAzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjYxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjkxNjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQjE3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkQxN0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGNjRCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGNjVFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGNjc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGOEUyN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEZBRTNGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQ0UzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRkFGQ0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEYyMTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY4RTY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkFFN0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZDRTdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFGREZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEYyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEZBRUJGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQ0VCRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIEYyMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb29wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvb3AuczogbG9vcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvb3AucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEOFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEQ5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRDFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBEMlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQzXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBENVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEQ2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDdcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBENFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIERBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgREJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjEuczogbW92MSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjEucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA4NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYxRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYxRDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IDk5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgM0VcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGMkY0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGMkZCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGMkUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGMkZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiA3NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY4MDYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRkEwNjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEZDMDZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWQgNTkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRkFCNTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIzIEYyRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92Mi5zOiBtb3YyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92Mi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZDQjVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMzI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIEZDQTVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMSBGMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGODI2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZBMjYwMDAxIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRkMyNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDVEMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEZBQjEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGQ0IxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYzQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEZBQTEwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMiBGQ0ExRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEY4RjEyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YzLnM6IG1vdjMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YzLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEY4MTYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRkExNjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEZDMTZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSA0NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGQTk1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkM5NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA1ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRkM4NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNSBGMDE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGODM2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEZBMzYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZSBGQzM2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDQ3MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE5XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjQge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92NC5zOiBtb3Y0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92NC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZBOTQwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGQzk0RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjNEQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRkE4NDgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEZDODRGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGOEY1MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE5IDg1MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIDJEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRkNDREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCA5NTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiAyNTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEZDRERGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92YnUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92YnUuczogbW92YnUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZidS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4NDYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkE0NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDNDZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOEI5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZBQjkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQ0I5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjQyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgMzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGQ0E5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEYwNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEY4NTYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkE1NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZDNTZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjg5NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOSBGQTk2MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2QgRkM5NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGNDVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSAwNjgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZDODZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92aHUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92aHUuczogbW92aHUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZodS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4NjYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkE2NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDNjZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOEJEMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZBQkQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQ0JERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjRBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgMzkwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGQ0FERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEYwNzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEY4NzYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkE3NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZDNzZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjg5NzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOSBGQTk3MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2QgRkM5N0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGNERBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSAwNzgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZDODdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92bSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZtLnM6IG1vdm0gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZtLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQ0UzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQ0VGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQ0YzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQ0ZGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tdWxkaXYge30gewotICAgIHNldCB0ZXN0bmFtZSAibXVsZGl2LnM6IG11bGRpdiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm11bGRpdi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYyNUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYyNkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYyN0VcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fb3RoZXIge30gewotICAgIHNldCB0ZXN0bmFtZSAib3RoZXIuczogb3RoZXIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJvdGhlci5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgNDRcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiA0OVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIDUzXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQ0MwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBEQ0ZGRkYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIENEMDAwMTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDlcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRERGRkZGMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDAzMDIwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjBGMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkFGRjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEZDRkZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgREYzMDA3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBERTMwMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEYwRkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEYwRkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIENCXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzMgRjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQuczogc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyQjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4Q0EwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjJBQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjhDNzA0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGMjlFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGOEMyMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIDU2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjI4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjI4MlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViLnM6IHN1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1Yi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYxMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYxMkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYxMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYxM0VcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEZDQzZGRkZGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRkNENUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYxODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fdWRmIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInVkZi5zOiB1ZGYgdGVzdHMgcGFydCAxIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAidWRmLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjYxMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjYyMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjYzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjY0MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjY1MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjY2MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRjY3MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjY4MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjY5MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjZBMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjZCMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjZDMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjZEMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjZFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRjZGMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjUwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRjUxMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjUyMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRjU0MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRjU1MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjU2MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgRjU3MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjU4MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgRjU5MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRjVBMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjVCMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjVDMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2EgRjVEMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRjVFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2UgRjVGMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRjkwMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGOTExN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ2IEY5MjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDkgRjkzMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGOTQxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRmIEY5NTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTIgRjk2MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NSBGOTcxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEY5ODE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWIgRjk5MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1ZSBGOUExN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYxIEY5QjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRjlDMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NyBGOUQxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZhIEY5RTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmQgRjlGMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGQjAxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRkIxMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEZCMjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGQjMxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRkI0MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEZCNTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGQjYxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRkI3MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEZCODFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGQjkxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRkJBMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEZCQjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGQkMxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRkJEMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEZCRTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBGQkYxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRkQwMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2NiArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNiBGRDExRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzY3ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEZEMjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNjggKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzIgRkQzMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2OSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBGRDQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcwICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNlIEZENTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzEgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRkQ2MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3MiArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYSBGRDcxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzczICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEZEODFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzQgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTYgRkQ5MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3NSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBGREExRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc2ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYyIEZEQjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzcgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRkRDMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3OCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmZSBGREQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc5ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IEZERTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArODAgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGEgRkRGMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4MSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCBGOTA1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEzIEY5MTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTYgRjkyNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOSBGOTM1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIEY5NDU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWYgRjk1NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMiBGOTY1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI1IEY5NzU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggRjk4NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYiBGOTk1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJlIEY5QTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzEgRjlCNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCBGOUM1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM3IEY5RDU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2EgRjlFNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzZCBGOUY1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIEZCMDUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCBGQjE1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggRkIyNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIEZCMzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCBGQjQ1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgRkI1NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IEZCNjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyBGQjc1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgRkI4NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IEZCOTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCBGQkE1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgRkJCNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIEZCQzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCBGQkQ1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggRkJFNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIEZCRjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4MCBGRDA1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExNCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg2IEZEMTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE1ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOGMgRkQyNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTYgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MiBGRDM1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExNyArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IEZENDUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE4ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOWUgRkQ1NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTkgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhNCBGRDY1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyMCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWFhIEZENzUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIxICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjAgRkQ4NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjIgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNiBGRDk1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyMyArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIEZEQTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI0ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzIgRkRCNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjUgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjOCBGREM1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyNiArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWNlIEZERDUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI3ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDQgRkRFNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjggKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkYSBGREY1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyOSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hbTMzXzEge30gewotICAgIHNldCB0ZXN0bmFtZSAiYW0zMy5zOiBhbTMzIHRlc3RzIHBhcnQgMSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzMucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDRDAwMDEzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMgKzA5XFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IENEMDAwMTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArMDlcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgQ0QwMDAxMzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswOVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBDRDAwMDFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzA5XFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IERERkZGRjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDAzNDA5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgRERGRkZGMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMDMyMDlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBEREZGRkYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzAwMzEwOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IERERkZGRjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAwRkYwOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIENFMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIENFMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IENFMzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IENFRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IENGMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNhIENGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIENGMzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNlIENGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEY4Q0UzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjhDRTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NiBGOENFMzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ5IEY4Q0VGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRjhDRjM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0ZiBGOENGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUyIEY4Q0YzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTUgRjhDRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGMDIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YSBGMDI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBGMDJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1ZSBGMDJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBGMDMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MiBGMDM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NiBGMEU0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBGMkVDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YSBGMkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBGNTAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2ZSBGNTYzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGNTk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MiBGNURGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBGNjMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NiBGNjY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBGNkMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YSBGNkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGQ0ZDMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ1ICswMjAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODIgRkNGREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NiArMDAwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTU0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FtMzNfMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbTMzXzIuczogYW0zMyB0ZXN0cyBwYXJ0IDIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhbTMzXzIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGOTA4MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY5MTgyMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjkyODM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGOTM4NDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY5NDg2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjk1ODc4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGOTY4OTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY5NzhBQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjk4OENEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiBGOTk4RUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEY5QThGRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRjlCOEREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGOUM4Q0NcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEY5RDhCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRjlFODAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZCBGOUY4MTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY5MDkwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzMgRjkxOTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGOTI5NDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM5IEY5Mzk2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRjk0OTc4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZiBGOTU5OUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQyIEY5NjlCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDUgRjk3OUREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBGOTg5RUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRiIEY5OTlGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGUgRjlBOTEyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MSBGOUI5MzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEY5Qzk1NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTcgRjlEOTc4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YSBGOTBBMjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVkIEY5MUEzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRjkyQTY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MyBGOTNBNzhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY2IEY5NEFBOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjkgRjk1QUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBGOTZBMjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZmIEY5N0EzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzIgRjk4QTUwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NSBGOTlBNjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEY5QUE3MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2IgRjlCQTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3ZSBGOUNBOTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgxIEY5REFBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRjlFQTc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NyBGOUZBODlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhhIEY5MEIxMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGQgRjkxQjM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBGOTJCNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkzIEY5M0I3OFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTYgRjk0QjlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OSBGOTVCQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEY5NkJERVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWYgRjk3QkZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMiBGOThCRENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE1IEY5OUJCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRjlBQjk4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYiBGOUJCNzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFlIEY5Q0I1NFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjEgRjlEQjMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBGOUVCMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI3IEY5RkIxMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM18zIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfMy5zOiBhbTMzIHRlc3RzIHBhcnQgMyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfMy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZCMDgxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGQjE4MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRkI3ODExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEZCODgxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGQjk4MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkJBODExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZCRDgxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGQkY4MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRkIwOTExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEZCMTkxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGQjI5MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkI0OTExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZCNTkxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGQjY5MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRkJBOTExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEZCQjkxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGQkU5MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRkIwQTIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZCMUEyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGQjJBMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRkIzQTIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEZCNEEyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGQjVBMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRkI4QTIwMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEZCOUEyMDEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGQkFBMjAxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRkJCQTIwMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEZCQ0EyMDEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGQkRBMjAxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRkIwQjExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEZCMUIxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGQjJCMTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRkIzQjExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEZCNEIxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGQjVCMTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRkJCQjExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEZCN0MxMjMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGQjZBMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRkI3QTEyMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEZCRUEyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGQkZBMTIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM180IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfNC5zOiBhbTMzIHRlc3RzIHBhcnQgNCIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfNC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZEMDgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEZEMTgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEZENzgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZEODgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZEOTgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEZEQTgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEZERDgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEZERjgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGRDA5MjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRkQxOTIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEZEMjkyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MiBGRDQ5MjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkQ1OTIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRlIEZENjkyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTYgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBGREE5MjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE3ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWEgRkRCOTIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEZERTkyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTkgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NiBGRDBBMjFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIwICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRkQxQTIxRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcyIEZEMkEyMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjIgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBGRDNBMjFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIzICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2UgRkQ0QTIxRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEZENUEyMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjUgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YSBGRDhBMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI2ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRkQ5QTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk2IEZEQUEyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjggK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBGREJBMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI5ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTIgRkRDQTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEZEREEyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMzEgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhZSBGRDBCMjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMyICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRkQxQjIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJhIEZEMkIyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMzQgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBGRDNCMjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM1ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzYgRkQ0QjIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEZENUIyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMzcgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMiBGRDBFMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM4ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRkQxRTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszOSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRlIEZEMkUyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDAgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCBGRDNFMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQxICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWEgRkQ0RTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEZENUUyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDMgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNiBGRDZBMjFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ0ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRkQ3QTEyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAyIEZERUEyMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDYgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCBGREZBMTJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ3ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM181IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfNS5zOiBhbTMzIHRlc3RzIHBhcnQgNSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfNS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZFMDgyMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRkUxODIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGRTc4MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEZFODgyMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkU5ODIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMyBGRUE4MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEZFRDgyMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzEgRkVGODIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRkUwOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2YgRkUxOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDYgRkUyOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGQgRkU0OTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRkU1OTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWIgRkU2OTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjIgRkVBOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjkgRkVCOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRkVFOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzcgRkUwQTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2UgRkUxQTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODUgRkUyQTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRkUzQTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTMgRkU0QTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWEgRkU1QTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTEgRkU4QTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRkU5QTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWYgRkVBQTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyOCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjYgRkVCQTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyOSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmQgRkVDQTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgRkVEQTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2IgRkUwQjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDIgRkUxQjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDkgRkUyQjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRkUzQjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTcgRkU0QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWUgRkU1QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjUgRkU2QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszOCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRkU3QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszOSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDMgRkU4QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGEgRkU5QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTEgRkUwRTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggRkUxRTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWYgRkUyRTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjYgRkUzRTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmQgRkU0RTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgRkU1RTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2IgRkJBRENEODlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNmIEZCQkRDRDg5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MyBGRTZBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUwICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YSBGRTdBMTJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUxICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MSBGRUVBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUyICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCBGRUZBMTJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUzICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1ZiBGRThBMjBGMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzU0ICtGRkZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NiBGRTlBMjBGMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzU1ICtGRkZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2ZCBGRUFBMjBGMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzU2ICtGRkZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCBGRUJBMjBGMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzU3ICtGRkZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YiBGRUNBMjBGMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzU4ICtGRkZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4MiBGRURBMjBGMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzU5ICtGRkZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4OSBGRThBMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYwICtGQ0ZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCBGRTlBMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYxICtGQ0ZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5NyBGRUFBMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYyICtGQ0ZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5ZSBGRUJBMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYzICtGQ0ZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhNSBGRUNBMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzY0ICtGQ0ZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhYyBGRURBMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzY1ICtGQ0ZGRkZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM182IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfNi5zOiBhbTMzIHRlc3RzIHBhcnQgNiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfNi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY3MDA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNzEwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjcyMDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY3MzA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNzQwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjc1MDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY3NjA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNzcwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjc4MDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY3OTA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGN0EwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjdCMDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY3QzA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGN0QwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjcwMTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEY3MTE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGNzIxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRjczMTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEY3NjE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGNzcxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRjc4MTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEY3OTE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGN0ExNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRjdCMTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEY3QzE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGN0QxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRjcwMjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEY3MTI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGNzIyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRjczMjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEY3NDI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGNzUyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRjc2MjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEY3NzI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGNzgyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRjc5MjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEY3QTI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGN0IyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRjdDMjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEY3RDI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGNzAzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRjcxMzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEY3MjM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBGNzMzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRjc0MzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEY3NTM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBGNzYzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRjc3MzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEY3ODM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBGNzkzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRjdBMzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEY3QjM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBGN0MzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRjdEMzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEY3MDQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBGNzE0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRjcyNDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEY3MzQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBGNzQ0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRjc1NDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEY3NjQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBGNzc0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRjc4NDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEY3OTQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCBGN0E0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgRjdCNDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IEY3QzQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyBGN0Q0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM183IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfNy5zOiBhbTMzIHRlc3RzIHBhcnQgNyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfNy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY3MDU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNzE1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjcyNTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY3MzU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNzY1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjc3NTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY3ODU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNzk1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjdBNTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY3QjU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGN0M1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjdENTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY3MDY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGNzE2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjcyNjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEY3MzY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGNzQ2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRjc1NjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEY3NjY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGNzc2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRjc4NjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEY3OTY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGN0E2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRjdCNjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEY3QzY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGN0Q2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRjcwNzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEY3MTc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGNzI3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRjczNzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEY3NDc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGNzU3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRjc2NzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEY3Nzc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGNzg3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRjc5NzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEY3QTc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGN0I3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRjdDNzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEY3RDc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGNzA4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRjcxODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEY3Mjg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBGNzM4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRjc0ODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEY3NTg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBGNzY4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRjc3ODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEY3ODg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBGNzk4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRjdBODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEY3Qjg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBGN0M4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRjdEODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEY3MDk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBGNzE5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRjcyOTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEY3Mzk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBGNzQ5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRjc1OTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEY3Njk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBGNzc5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRjc4OTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEY3OTk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCBGN0E5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgRjdCOTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IEY3Qzk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyBGN0Q5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM184IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfOC5zOiBhbTMzIHRlc3RzIHBhcnQgOCIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfOC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY3MEE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNzFBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjcyQTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY3M0E0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNzRBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjc1QTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY3NkE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNzdBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjc4QTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY3OUE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGN0FBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjdCQTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY3Q0E0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGN0RBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjcwQjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEY3MUI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGNzJCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRjczQjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEY3NEI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGNzVCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRjc2QjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEY3N0I0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGNzhCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRjc5QjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEY3QUI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGN0JCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRjdDQjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEY3REI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGNzBDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRjcxQzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEY3MkM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGNzNDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRjc0QzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEY3NUM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGNzZDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRjc3QzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEY3OEM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGNzlDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRjdBQzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEY3QkM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGN0NDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRjdEQzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEY3MEQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBGNzFENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRjcyRDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEY3M0Q0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBGNzRENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRjc1RDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEY3NkQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBGNzdENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRjc4RDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEY3OUQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBGN0FENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRjdCRDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEY3Q0Q0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBGN0RENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRjdFMDIxNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEY3RTAyMTQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBGN0UwMjE0MlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRjdFMDIxNDNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEY3RTAyMTQ0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBGN0UwMjE0NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRjdFMDIxNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEY3RTAyMTQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCBGN0UwMjE0OFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgRjdFMDIxNDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IEY3RTAyMTRBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02N10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotCi1pZiBbaXN0YXJnZXQgbW4xMDMwMCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19hZGQKLSAgICBkb19iY2MKLSAgICBkb19iaXQKLSAgICBkb19jbXAKLSAgICBkb19leHQKLSAgICBkb19leHRlbmQKLSAgICBkb19sb2dpY2FsCi0gICAgZG9fbG9vcAotICAgIGRvX21vdjEKLSAgICBkb19tb3YyCi0gICAgZG9fbW92MwotICAgIGRvX21vdjQKLSAgICBkb19tb3ZidQotICAgIGRvX21vdmh1Ci0gICAgZG9fbW92bQotICAgIGRvX211bGRpdgotICAgIGRvX290aGVyCi0gICAgZG9fc2hpZnQKLSAgICBkb19zdWIKLSAgICBkb191ZGYKLSAgICBkb19hbTMzXzEKLSAgICBkb19hbTMzXzIKLSAgICBkb19hbTMzXzMKLSAgICBkb19hbTMzXzQKLSAgICBkb19hbTMzXzUKLSAgICBkb19hbTMzXzYKLSAgICBkb19hbTMzXzcKLSAgICBkb19hbTMzXzgKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JjYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkyZGNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0JLnRleHQKLWZvbzoKLQliZXEgZm9vCi0JYm5lIGZvbwotCWJndCBmb28KLQliZ2UgZm9vCi0JYmxlIGZvbwotCWJsdCBmb28KLQliaGkgZm9vCi0JYmNjIGZvbwotCWJscyBmb28JCi0JYmNzIGZvbwotCWJ2YyBmb28KLQlidnMgZm9vCi0JYm5jIGZvbwotCWJucyBmb28KLQlicmEgZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JpdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjNTUxOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JpdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS50ZXh0Ci0JYnRzdCA2NCxkMQotCWJ0c3QgODE5MixkMgotCWJ0c3QgMTMxMDcxLGQzCi0JYnRzdCA2NCwoOCxhMSkKLQlidHN0IDY0LCgxMzEwNzEpCi0JYnNldCBkMSwoYTIpCi0JYnNldCA2NCwoOCxhMSkKLQlic2V0IDY0LCgxMzEwNzEpCi0JYmNsciBkMSwoYTIpCi0JYmNsciA2NCwoOCxhMSkKLQliY2xyIDY0LCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2NtcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9jbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4YTcxZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2NtcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci0JY21wIGQxLGQyCi0JY21wIGQyLGEzCi0JY21wIGEzLGQzCi0JY21wIGEzLGEyCi0JY21wIDE2LGQzCi0JY21wIDI1NixkMgotCWNtcCAxMzEwNzEsZDEKLQljbXAgMTYsYTMKLQljbXAgMjU2LGEyCi0JY21wIDEzMTA3MSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTJlNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHQucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS50ZXh0Ci0JZXh0IGQxCi0JZXh0YiBkMgotCWV4dGJ1IGQzCi0JZXh0aCBkMgotCWV4dGh1IGQxCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dGVuZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHRlbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0MDViNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dGVuZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci0JcHV0eCBkMQotCWdldHggZDIKLQltdWxxIGQxLGQyCi0JbXVscSAxNixkMgotCW11bHEgMjU2LGQzCi0JbXVscSAxMzEwNzEsZDMKLQltdWxxdSBkMSxkMgotCW11bHF1IDE2LGQyCi0JbXVscXUgMjU2LGQzCi0JbXVscXUgMTMxMDcxLGQzCi0Jc2F0MTYgZDIsZDMKLQlzYXQyNCBkMyxkMgotCWJzY2ggZDEsZDIKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTc2ZGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLQlhbmQgZDEsZDIKLQlhbmQgMTI3LGQyCi0JYW5kIDMyNzY3LGQzCi0JYW5kIDEzMTA3MSxkMwotCWFuZCAzMjc2Nyxwc3cKLQlvciBkMSxkMgotCW9yIDEyNyxkMgotCW9yIDMyNzY3LGQzCi0Jb3IgMTMxMDcxLGQzCi0Jb3IgMzI3NjcscHN3Ci0JeG9yIGQxLGQyCi0JeG9yIDMyNzY3LGQzCi0JeG9yIDEzMTA3MSxkMwotCW5vdCBkMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb29wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvb3AucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxODIwNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvb3AucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotZm9vOgotCWxlcQotCWxuZQotCWxndAotCWxnZQotCWxsZQotCWxsdAotCWxoaQotCWxjYwotCWxscwkKLQlsY3MKLQlscmEKLQlzZXRsYgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDRjYzU1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGQxLGQyCi0JbW92IGQxLGEyCi0JbW92IGEyLGQxCi0JbW92IGEyLGExCi0JbW92IHNwLGEyCi0JbW92IGExLHNwCi0JbW92IGQyLHBzdwotCW1vdiBtZHIsZDEKLQltb3YgZDIsbWRyCi0JbW92IChhMiksZDEKLQltb3YgKDgsYTIpLGQxCi0JbW92ICgyNTYsYTIpLGQxCi0JbW92ICgxMzEwNzEsYTIpLGQxCi0JbW92ICg4LHNwKSxkMQotCW1vdiAoMjU2LHNwKSxkMQotCW1vdiBwc3csZDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDFlZGM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS50ZXh0Ci0gICAgICAgIG1vdiAoMTMxMDcxLHNwKSxkMQotCW1vdiAoZDEsYTEpLGQyCi0JbW92ICgzMjc2OCksZDEKLQltb3YgKDEzMTA3MSksZDEKLQltb3YgKGEyKSxhMQotCW1vdiAoOCxhMiksYTEKLQltb3YgKDI1NixhMiksYTEKLQltb3YgKDEzMTA3MSxhMiksYTEKLQltb3YgKDgsc3ApLGExCi0JbW92ICgyNTYsc3ApLGExCi0JbW92ICgxMzEwNzEsc3ApLGExCi0JbW92IChkMSxhMSksYTIKLSAgICAgICAgbW92ICgzMjc2OCksYTEKLSAgICAgICAgbW92ICgxMzEwNzEpLGExCi0gICAgICAgIG1vdiAoMzIsYTEpLHNwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVjMGI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92My5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS50ZXh0Ci0gICAgICAgIG1vdiBkMSwoYTIpCi0gICAgICAgIG1vdiBkMSwoMzIsYTIpCi0JbW92IGQxLCgyNTYsYTIpCi0JbW92IGQxLCgxMzEwNzEsYTIpCi0JbW92IGQxLCgzMixzcCkKLQltb3YgZDEsKDMyNzY4LHNwKQotCW1vdiBkMSwoMTMxMDcxLHNwKQotCW1vdiBkMSwoZDIsYTIpCi0JbW92IGQxLCgxMjgpCi0JbW92IGQxLCgxMzEwNzEpCi0JbW92IGExLChhMikKLQltb3YgYTEsKDMyLGEyKQotCW1vdiBhMSwoMjU2LGEyKQotCW1vdiBhMSwoMTMxMDcxLGEyKQotCW1vdiBhMSwoMzIsc3ApCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQ2OWMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92NC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGExLCgzMjc2OCxzcCkKLQltb3YgYTEsKDEzMTA3MSxzcCkKLQltb3YgYTEsKGQyLGEyKQotCW1vdiBhMSwoMTI4KQotCW1vdiBhMSwoMTMxMDcxKQotCW1vdiBzcCwoMzIsYTEpCi0JbW92IDgsZDEKLQltb3YgMjU2LGQxCi0JbW92IDEzMTA3MSxkMQotCW1vdiA4LGExCi0JbW92IDI1NixhMQotCW1vdiAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92YnUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92YnUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkYjdiZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmJ1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0JLnRleHQKLQltb3ZidSAoYTIpLGQxCi0JbW92YnUgKDgsYTIpLGQxCi0JbW92YnUgKDI1NixhMiksZDEKLQltb3ZidSAoMTMxMDcxLGEyKSxkMQotCW1vdmJ1ICg4LHNwKSxkMQotCW1vdmJ1ICgyNTYsc3ApLGQxCi0JbW92YnUgKDEzMTA3MSxzcCksZDEKLQltb3ZidSAoZDEsYTEpLGQyCi0JbW92YnUgKDMyNzY4KSxkMQotCW1vdmJ1ICgxMzEwNzEpLGQxCi0JbW92YnUgZDEsKGEyKQotCW1vdmJ1IGQxLCgzMixhMikKLQltb3ZidSBkMSwoMjU2LGEyKQotCW1vdmJ1IGQxLCgxMzEwNzEsYTIpCi0JbW92YnUgZDEsKDMyLHNwKQotCW1vdmJ1IGQxLCgzMjc2OCxzcCkKLQltb3ZidSBkMSwoMTMxMDcxLHNwKQotCW1vdmJ1IGQxLChkMixhMikKLQltb3ZidSBkMSwoMTI4KQotCW1vdmJ1IGQxLCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmh1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmh1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzdlODAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZodS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS50ZXh0Ci0JbW92aHUgKGEyKSxkMQotCW1vdmh1ICg4LGEyKSxkMQotCW1vdmh1ICgyNTYsYTIpLGQxCi0JbW92aHUgKDEzMTA3MSxhMiksZDEKLQltb3ZodSAoOCxzcCksZDEKLQltb3ZodSAoMjU2LHNwKSxkMQotCW1vdmh1ICgxMzEwNzEsc3ApLGQxCi0JbW92aHUgKGQxLGExKSxkMgotCW1vdmh1ICgzMjc2OCksZDEKLQltb3ZodSAoMTMxMDcxKSxkMQotCW1vdmh1IGQxLChhMikKLQltb3ZodSBkMSwoMzIsYTIpCi0JbW92aHUgZDEsKDI1NixhMikKLQltb3ZodSBkMSwoMTMxMDcxLGEyKQotCW1vdmh1IGQxLCgzMixzcCkKLQltb3ZodSBkMSwoMzI3Njgsc3ApCi0JbW92aHUgZDEsKDEzMTA3MSxzcCkKLQltb3ZodSBkMSwoZDIsYTIpCi0JbW92aHUgZDEsKDEyOCkKLQltb3ZodSBkMSwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdm0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmYzY4My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdm0ucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JbW92bSAoc3ApLFthMixhM10KLQltb3ZtIChzcCksW2QyLGQzLGEyLGEzLG90aGVyXQotCW1vdm0gW2EyLGEzXSwoc3ApCi0JbW92bSBbZDIsZDMsYTIsYTMsb3RoZXJdLChzcCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbXVsZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL211bGRpdi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjExZTVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbXVsZGl2LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCW11bCBkMSxkMgotCW11bHUgZDIsZDMKLQlkaXYgZDMsZDMKLQlkaXZ1IGQzLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL290aGVyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL290aGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYWY3NGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9vdGhlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS50ZXh0Ci0JY2xyIGQyCi0JaW5jIGQxCi0JaW5jIGEyCi0JaW5jNCBhMwotCWptcCAoYTIpCi0Jam1wIDI1NgotCWptcCAxMzEwNzEKLQljYWxsIDI1NixbYTIsYTNdLDkKLQljYWxsIDEzMTA3MSxbYTIsYTNdLDMyCi0JY2FsbHMgKGEyKQotCWNhbGxzIDI1NgotCWNhbGxzIDEzMTA3MQotCXJldCBbYTIsYTNdLDcKLQlyZXRmIFthMixhM10sNQotCXJldHMKLQlydGkKLQl0cmFwCi0Jbm9wCi0JcnRtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGM5Y2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0JYXNyIGQxLGQyCi0JYXNyIDQsZDIKLQlsc3IgZDIsZDMKLQlsc3IgNCxkMwotCWFzbCBkMyxkMgotCWFzbCA0LGQyCi0JYXNsMiBkMgotCXJvciBkMQotCXJvbCBkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc3ViLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGM2NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zdWIucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0Jc3ViIGQxLGQyCi0Jc3ViIGQyLGEzCi0Jc3ViIGEzLGQzCi0Jc3ViIGEzLGEyCi0Jc3ViIDEzMTA3MSxkMgotCXN1YiAxMzEwNzEsYTEKLQlzdWJjIGQxLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3VkZi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC91ZGYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjYmQxMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3VkZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLQkudGV4dAotCXVkZjAwIGQwLGQxCi0JdWRmMDEgZDAsZDEKLQl1ZGYwMiBkMCxkMQotCXVkZjAzIGQwLGQxCi0JdWRmMDQgZDAsZDEKLQl1ZGYwNSBkMCxkMQotCXVkZjA2IGQwLGQxCi0JdWRmMDcgZDAsZDEKLQl1ZGYwOCBkMCxkMQotCXVkZjA5IGQwLGQxCi0JdWRmMTAgZDAsZDEKLQl1ZGYxMSBkMCxkMQotCXVkZjEyIGQwLGQxCi0JdWRmMTMgZDAsZDEKLQl1ZGYxNCBkMCxkMQotCXVkZjE1IGQwLGQxCi0JdWRmMjAgZDAsZDEKLQl1ZGYyMSBkMCxkMQotCXVkZjIyIGQwLGQxCi0JdWRmMjMgZDAsZDEKLQl1ZGYyNCBkMCxkMQotCXVkZjI1IGQwLGQxCi0JdWRmMjYgZDAsZDEKLQl1ZGYyNyBkMCxkMQotCXVkZjI4IGQwLGQxCi0JdWRmMjkgZDAsZDEKLQl1ZGYzMCBkMCxkMQotCXVkZjMxIGQwLGQxCi0JdWRmMzIgZDAsZDEKLQl1ZGYzMyBkMCxkMQotCXVkZjM0IGQwLGQxCi0JdWRmMzUgZDAsZDEKLQl1ZGYwMCAxMjcsZDEKLQl1ZGYwMSAxMjcsZDEKLQl1ZGYwMiAxMjcsZDEKLQl1ZGYwMyAxMjcsZDEKLQl1ZGYwNCAxMjcsZDEKLQl1ZGYwNSAxMjcsZDEKLQl1ZGYwNiAxMjcsZDEKLQl1ZGYwNyAxMjcsZDEKLQl1ZGYwOCAxMjcsZDEKLQl1ZGYwOSAxMjcsZDEKLQl1ZGYxMCAxMjcsZDEKLQl1ZGYxMSAxMjcsZDEKLQl1ZGYxMiAxMjcsZDEKLQl1ZGYxMyAxMjcsZDEKLQl1ZGYxNCAxMjcsZDEKLQl1ZGYxNSAxMjcsZDEKLQl1ZGYwMCAzMjc2NyxkMQotCXVkZjAxIDMyNzY3LGQxCi0JdWRmMDIgMzI3NjcsZDEKLQl1ZGYwMyAzMjc2NyxkMQotCXVkZjA0IDMyNzY3LGQxCi0JdWRmMDUgMzI3NjcsZDEKLQl1ZGYwNiAzMjc2NyxkMQotCXVkZjA3IDMyNzY3LGQxCi0JdWRmMDggMzI3NjcsZDEKLQl1ZGYwOSAzMjc2NyxkMQotCXVkZjEwIDMyNzY3LGQxCi0JdWRmMTEgMzI3NjcsZDEKLQl1ZGYxMiAzMjc2NyxkMQotCXVkZjEzIDMyNzY3LGQxCi0JdWRmMTQgMzI3NjcsZDEKLQl1ZGYxNSAzMjc2NyxkMQotCXVkZjAwIDY1NTM1LGQxCi0JdWRmMDEgNjU1MzUsZDEKLQl1ZGYwMiA2NTUzNSxkMQotCXVkZjAzIDY1NTM1LGQxCi0JdWRmMDQgNjU1MzUsZDEKLQl1ZGYwNSA2NTUzNSxkMQotCXVkZjA2IDY1NTM1LGQxCi0JdWRmMDcgNjU1MzUsZDEKLQl1ZGYwOCA2NTUzNSxkMQotCXVkZjA5IDY1NTM1LGQxCi0JdWRmMTAgNjU1MzUsZDEKLQl1ZGYxMSA2NTUzNSxkMQotCXVkZjEyIDY1NTM1LGQxCi0JdWRmMTMgNjU1MzUsZDEKLQl1ZGYxNCA2NTUzNSxkMQotCXVkZjE1IDY1NTM1LGQxCi0JdWRmdTAwIDEyOCxkMQotCXVkZnUwMSAxMjgsZDEKLQl1ZGZ1MDIgMTI4LGQxCi0JdWRmdTAzIDEyOCxkMQotCXVkZnUwNCAxMjgsZDEKLQl1ZGZ1MDUgMTI4LGQxCi0JdWRmdTA2IDEyOCxkMQotCXVkZnUwNyAxMjgsZDEKLQl1ZGZ1MDggMTI4LGQxCi0JdWRmdTA5IDEyOCxkMQotCXVkZnUxMCAxMjgsZDEKLQl1ZGZ1MTEgMTI4LGQxCi0JdWRmdTEyIDEyOCxkMQotCXVkZnUxMyAxMjgsZDEKLQl1ZGZ1MTQgMTI4LGQxCi0JdWRmdTE1IDEyOCxkMQotCXVkZnUwMCAzMjc2OCxkMQotCXVkZnUwMSAzMjc2OCxkMQotCXVkZnUwMiAzMjc2OCxkMQotCXVkZnUwMyAzMjc2OCxkMQotCXVkZnUwNCAzMjc2OCxkMQotCXVkZnUwNSAzMjc2OCxkMQotCXVkZnUwNiAzMjc2OCxkMQotCXVkZnUwNyAzMjc2OCxkMQotCXVkZnUwOCAzMjc2OCxkMQotCXVkZnUwOSAzMjc2OCxkMQotCXVkZnUxMCAzMjc2OCxkMQotCXVkZnUxMSAzMjc2OCxkMQotCXVkZnUxMiAzMjc2OCxkMQotCXVkZnUxMyAzMjc2OCxkMQotCXVkZnUxNCAzMjc2OCxkMQotCXVkZnUxNSAzMjc2OCxkMQotCXVkZnUwMCA2NTUzNixkMQotCXVkZnUwMSA2NTUzNixkMQotCXVkZnUwMiA2NTUzNixkMQotCXVkZnUwMyA2NTUzNixkMQotCXVkZnUwNCA2NTUzNixkMQotCXVkZnUwNSA2NTUzNixkMQotCXVkZnUwNiA2NTUzNixkMQotCXVkZnUwNyA2NTUzNixkMQotCXVkZnUwOCA2NTUzNixkMQotCXVkZnUwOSA2NTUzNixkMQotCXVkZnUxMCA2NTUzNixkMQotCXVkZnUxMSA2NTUzNixkMQotCXVkZnUxMiA2NTUzNixkMQotCXVkZnUxMyA2NTUzNixkMQotCXVkZnUxNCA2NTUzNixkMQotCXVkZnUxNSA2NTUzNixkMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNWY0YjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIuZAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI29iamNvcHk6IC1PIHNyZWMKLSNuYW1lOiBNUkkgY2hhcmFjdGVyIGNvbnN0YW50cwotI2FzOiAtTQotCi0jIFRlc3QgTVJJIGNoYXJhY3RlciBjb25zdGFudHMKLQotUzAuKgotUzExMy4uLi4oNjE2MTYyNjM2MTYyNjM2NDY1MDAwMDAwNjEyNzYyMDApfCg2MTYxNjI2MzY0NjM2MjYxMDAwMDAwNjUwMDYyMjc2MSkuKgotI3Bhc3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjBhODNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTsgVGVzdCBNUkkgc3R5bGUgY2hhcmFjdGVyIGNvbnN0YW50cy4KLQotCWRjLmIJJ2EnCi0JZGMuYgknYWJjJwotCWRjLmwJJ2FiY2RlJwotCWRjLmwJJ2EnJ2InCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0MzRkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5kCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgY29tbWVudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBjb21tZW50cwotCi0wKzAyIEEgUkFNCi0wKzAxIEEgUk9NCi0gKiBVIGxhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3MzE4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCXhyZWYgbGFiZWwKLQl4ZGVmCVJPTSxSQU0KLQkqIHRoaXMgaXMgYSBjb21tZW50Ci0KLQlkYy5sCWxhYmVsCWxvb3AgaWYgd2UgaGF2ZW4ndCByZWFjaCBlbmQgeWV0Ci0JCi1ST00JCQkJRVFVCSQwMDAwMDAwMQkqIHdvcmQgd2lkZQotUkFNCQkJCUVRVQkkMDAwMDAwMDIJd29yZCB3aWRlCi0JZGMubAlSQU0KLQlkYy5sCTAJLHJlYWxseSxhLGNvbW1lbnQKLTsgYSBjb21tZW50Ci0gOyBhbm90aGVyIGNvbW1lbnQKLSAgOyBhbm90aGVyIGNvbW1lbnQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjMTUzMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBjb21tb24gc2VjdGlvbnMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBjb21tb24gc2VjdGlvbnMKLQotMCswOCBDIDAwY29tMgotMCswOCBDIGNvbTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNWM2Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi07IFRlc3QgTVJJIGNvbW1vbiBzZWN0aW9ucwotCWNvbW1vbgljb20xCi0JZHMubAkxCi1jb20yCWNvbW1vbiAwMAotCWRzLmwJMQotaW5jb20JZHMubAkxCi0JY29tbW9uCWNvbTEKLQlkcy5sCTEKLQlkYXRhCi0JZGMubAljb20xCi0JZGMubAlpbmNvbQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjEwMDIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBjb25zdGFudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBzdHlsZSBjb25zdGFudHMKLQotMCowIFQgZm9vCi0wKmEgQSBzMDEKLTAqYSBBIHMwMgotMCphIEEgczAzCi0wKmEgQSBzMDQKLTAqYSBBIHMwNQotMCphIEEgczA2Ci0wKmEgQSBzMDcKLTAqYSBBIHMwOAotMCphIEEgczA5Ci0wKjYxIEEgczEwCi0wKjYxIEEgczExCi0wKjYxNjI2MzY0IEEgczEyCi0wKjYxMjc2MjAwIEEgczEzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzRlNjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotCXhkZWYJczAxLHMwMixzMDMsczA0LHMwNSxzMDYsczA3LHMwOCxzMDksczEwLHMxMSxzMTIsczEzCi1zMDEJZXF1CSUxMDEwCi1zMDIJZXF1CTEwMTBiCi1zMDMJZXF1CUAxMgotczA0CWVxdQkxMm8KLXMwNQllcXUJMTJxCi1zMDYJZXF1CTEwCi1zMDcJZXF1CTEwZAotczA4CWVxdQkkYQotczA5CWVxdQkwYWgKLXMxMAllcXUJJ2EnCi1zMTEJZXF1CUEnYScKLXMxMgllcXUJJ2FiY2QnCi1zMTMJZXF1CSdhJydiJwotCi0JeGRlZglmb28KLWZvbwotCW1vdmVxLmwJIyUxMDEwLGQwCi0JbW92ZXEubAkjMTAxMGIsZDAKLQltb3ZlcS5sCSNAMTIsZDAKLQltb3ZlcS5sCSMxMm8sZDAKLQltb3ZlcS5sCSMxMnEsZDAKLQltb3ZlcS5sCSMxMCxkMAotCW1vdmVxLmwJIzEwZCxkMAotCW1vdmVxLmwJIyRhLGQwCi0JbW92ZXEubAkjMGFoLGQwCi0JbW92ZXEubAkjJ2EnLGQwCi0JbW92ZXEubAkjQSdhJyxkMAotCW5vcAotCi0JZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZW1wdHkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lbXB0eS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGMyY2RkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lbXB0eS5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TQlQJTUFDUk8JCTsgZW1wdHkgbWFjcm8KLQlFTkRNCi0KLQlTQlQJYXJnMSAKLSAgICAgICAgU0JUICAgICBhcmcyIC0gb25lIHR3dwotICAgICAgICBTQlQgICAgIGFyZzMgLSBvbmUgdHdvIHRocmVlCi0gICAgICAgIFNCVCAgICAgYXJnNCAtIG9uZSB0d28gdGhyZWUgZm91cgotICAgICAgICBTQlQgICAgIGFyZzUgLSBvbmUgdHdvIHRocmVlIGZvdXIgZml2ZQotICAgICAgICBTQlQgICAgIGFyZzYgLSBvbmUgdHdvICh0aHJlZSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmOWE4Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBFUVUKLSNhczogLU0KLQotIyBUZXN0IHRoZSBNUkkgRVFVIGRpcmVjdGl2ZQotCi0wKjQgQSBTWU1CT0wKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1MTJhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVGVzdCB0aGUgTVJJIEVRVSBkaXJlY3RpdmUKLQlYREVGCVNZTUJPTAotU1lNQk9MCUVRVQk0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkZWU0ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5kCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogTVJJIGV4cHJlc3Npb25zCi0jYXM6IC1NCi0KLSMgVGVzdCBleHByZXNzaW9ucyBpbiBNUkkgbW9kZQotCi0wMCogQSBzMQotMDAqMTIgQSBzMgotMDAqNiBBIHMzCi0oMDAwMDAwMDApP2ZmKiBBIHM0Ci0wMCogQSBzNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Njc3YzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotOyBUZXN0IGV4cHJlc3Npb25zIGluIE1SSSBtb2RlCi0JeGRlZglzMSxzMixzMyxzNCxzNQotczEJZXF1CTE+MgotczIJZXF1CTM8PDEqMwotczMJZXF1CTUhITMKLXM0CWVxdQkiMAotczUJZXF1CSgxPj0yKSEoMTw+MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTYyN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jb2JqY29weTogLU8gc3JlYwotI25hbWU6IE1SSSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMKLQotUzAuKgotUzExOC4uLi4oMTIzNDU2Nzg5QUJDREVGMDNGODAwMDAwNDEyMDAwMDA0MTIwMDAwMDQyKXwoRjBERUJDOUE3ODU2MzQxMjAwMDA4MDNGMDAwMDIwNDEwMDAwMjA0MTAwKS4qCi1TMTAuLi4uLihDODAwMDApfCgwMEM4NDIpLioKLSNwYXNzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdmOWM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi07IFRlc3QgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIGluIE1SSSBtb2RlLgotCi0JZGMuZAk6MTIzNF81Njc4XzlhYmNfZGVmMAotCWRjLnMJMS4wCi0JZGMucwkxZTEKLQlkYy5zCTFfZV8xCi0JZGMucwkxRTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1ZmI5NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTVJJIHN0cnVjdHVyZWQgZm9yCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgc3RydWN0dXJlZCBmb3IgcHNldWRvLW9wLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBjbHJ3ICVkMQotMCswMDIgPGZvb1wrKDB4fCkyPiBtb3ZldyAjMSwlZDAKLTArMDA2IDxmb29cKygweHwpNj4gY21waXcgIzEwLCVkMAotMCswMGEgPGZvb1wrKDB4fClhPiBibHRzIDArMDE2IDxmb29cKygweHwpMTY+Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IGFkZHcgJWQwLCVkMQotMCswMGUgPGZvb1wrKDB4fCllPiBidmNzIDArMDEyIDxmb29cKygweHwpMTI+Ci0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBicmFzIDArMDE2IDxmb29cKygweHwpMTY+Ci0wKzAxMiA8Zm9vXCsoMHh8KTEyPiBhZGRxdyAjMiwlZDAKLTArMDE0IDxmb29cKygweHwpMTQ+IGJyYXMgMCswMDYgPGZvb1wrKDB4fCk2PgotMCswMTYgPGZvb1wrKDB4fCkxNj4gY2xydyAlZDEKLTArMDE4IDxmb29cKygweHwpMTg+IG1vdmV3ICMxMCwlZDAKLTArMDFjIDxmb29cKygweHwpMWM+IGNtcGl3ICMxLCVkMAotMCswMjAgPGZvb1wrKDB4fCkyMD4gYmd0cyAwKzAzMCA8Zm9vXCsoMHh8KTMwPgotMCswMjIgPGZvb1wrKDB4fCkyMj4gY21waXcgIzEwMCwlZDEKLTArMDI2IDxmb29cKygweHwpMjY+IGJndHMgMCswMmEgPGZvb1wrKDB4fCkyYT4KLTArMDI4IDxmb29cKygweHwpMjg+IGJyYXMgMCswMmMgPGZvb1wrKDB4fCkyYz4KLTArMDJhIDxmb29cKygweHwpMmE+IGFkZHcgJWQwLCVkMQotMCswMmMgPGZvb1wrKDB4fCkyYz4gc3VicXcgIzEsJWQwCi0wKzAyZSA8Zm9vXCsoMHh8KTJlPiBicmFzIDArMDFjIDxmb29cKygweHwpMWM+Ci0wKzAzMCA8Zm9vXCsoMHh8KTMwPiBub3AKLTArMDMyIDxmb29cKygweHwpMzI+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTI0NzI1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IucworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTsgVGVzdCBNUkkgc3RydWN0dXJlZCBmb3IgcHNldWRvLW9wLgotCi0JeGRlZglmb28KLWZvbwotCWNsciBkMQotCWZvciBkMCA9ICMxIHRvICMxMCBieSAjMiBkbwotCSAgYWRkIGQwLGQxIGFyYml0cmFyeSB0ZXh0ICdpbiBjb21tZW50IGZpZWxkCi0JICBpZiA8dnM+IHRoZW4KLQkgICAgYnJlYWsKLQkgIGVuZGkKLQllbmRmCi0KLQljbHIgZDEKLQlmb3IgZDAgPSAjMTAgZG93bnRvICMxIGRvCi0JICBpZiBkMSA8Z2U+ICMxMDAgdGhlbgotCSAgICBuZXh0Ci0JICBlbmRpCi0JICBhZGQgZDAsZDEKLQllbmRmCi0KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjk3MmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTVJJIHN0cnVjdHVyZWQgaWYKLSNhczogLU0KLQotIyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIGlmIHBzZXVkby1vcC4KLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gY21wdyAlZDEsJWQwCi0wKzAwMiA8Zm9vXCsoMHh8KTI+IGJsZXMgMCswMTQgPGZvb1wrKDB4fCkxND4KLTArMDA0IDxmb29cKygweHwpND4gY21wdyAlZDIsJWQwCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IGJsZXMgMCswMTQgPGZvb1wrKDB4fCkxND4KLTArMDA4IDxmb29cKygweHwpOD4gY21wdyAlZDEsJWQyCi0wKzAwYSA8Zm9vXCsoMHh8KWE+IGJsZXMgMCswMTAgPGZvb1wrKDB4fCkxMD4KLTArMDBjIDxmb29cKygweHwpYz4gbW92ZXcgJWQxLCVkMwotMCswMGUgPGZvb1wrKDB4fCllPiBicmFzIDArMDEyIDxmb29cKygweHwpMTI+Ci0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBtb3ZldyAlZDIsJWQzCi0wKzAxMiA8Zm9vXCsoMHh8KTEyPiBicmFzIDArMDFlIDxmb29cKygweHwpMWU+Ci0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBjbXB3ICVkMCwlZDEKLTArMDE2IDxmb29cKygweHwpMTY+IGJndHMgMCswMWMgPGZvb1wrKDB4fCkxYz4KLTArMDE4IDxmb29cKygweHwpMTg+IGNtcHcgJWQwLCVkMgotMCswMWEgPGZvb1wrKDB4fCkxYT4gYmxlcyAwKzAxZSA8Zm9vXCsoMHh8KTFlPgotMCswMWMgPGZvb1wrKDB4fCkxYz4gbW92ZXcgJWQwLCVkMwotMCswMWUgPGZvb1wrKDB4fCkxZT4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ2YmU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotOyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIGlmIHBzZXVkby1vcC4KLQotCXhkZWYJZm9vCi1mb28KLQlpZiBkMSA8Z3Q+IGQwIGFuZCBkMiA8Z3Q+IGQwIHRoZW4KLQkgIGlmIGQxIDxndD4gZDIgdGhlbgotCSAgICBtb3ZlIGQxLGQzCi0JICBlbHNlCi0JICAgIG1vdmUgZDIsZDMKLQkgIGVuZGkKLQllbHNlCi0JICBpZiBkMCA8Z3Q+IGQxIG9yIGQwIDxndD4gZDIgdGhlbgotCSAgICBtb3ZlIGQwLGQzCi0JICBlbmRpCi0JZW5kaQotCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaW1tY29uc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pbW1jb25zdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJkYTEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pbW1jb25zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBpbW1lZGlhdGUgY29uc3RhbnRzCi0jYXM6IC1NCi0jc291cmNlOiBjb25zdGFudHMucwotCi0jIFRlc3QgTVJJIGltbWVkaWF0ZSBjb25zdGFudHMKLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gbW92ZXEgIzEwLCVkMAotMCswMDIgPGZvb1wrKDB4fCkyPiBtb3ZlcSAjMTAsJWQwCi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IG1vdmVxICMxMCwlZDAKLTArMDA2IDxmb29cKygweHwpNj4gbW92ZXEgIzEwLCVkMAotMCswMDggPGZvb1wrKDB4fCk4PiBtb3ZlcSAjMTAsJWQwCi0wKzAwYSA8Zm9vXCsoMHh8KWE+IG1vdmVxICMxMCwlZDAKLTArMDBjIDxmb29cKygweHwpYz4gbW92ZXEgIzEwLCVkMAotMCswMGUgPGZvb1wrKDB4fCllPiBtb3ZlcSAjMTAsJWQwCi0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBtb3ZlcSAjMTAsJWQwCi0wKzAxMiA8Zm9vXCsoMHh8KTEyPiBtb3ZlcSAjOTcsJWQwCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBtb3ZlcSAjOTcsJWQwCi0wKzAxNiA8Zm9vXCsoMHh8KTE2PiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTU4NTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBsYWJlbAotI2FzOiAtTQotCi0jIFRlc3QgdXNpbmcgYW4gTVJJIHN0eWxlIGxhYmVsCi0KLTAwMDAqIFQgTEFCRUwKLVsgCV0qVSBTWU1CT0wKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWVjMmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTsgVGVzdCB1c2luZyBhbiBNUkkgc3R5bGUgbGFiZWwKLSogQWxzbyB0ZXN0IE1SSSBzdHlsZSBjb21tZW50cwotISBBbmQgYW5vdGhlciBjb21tZW50Ci0JWERFRglMQUJFTAotTEFCRUwJREMuTAlTWU1CT0wJCTsgQW5kIHlldCBhbm90aGVyIGNvbW1lbnQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzNmZhOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBNUkkgbW92ZW1sCi0jYXM6IC1NCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPC50ZXh0PjoKLSAgIDA6CTRjZGYgMDdmYyAgICAgIAltb3ZlbWwgJXNwQFwrLCVkMi0lYTIKLSAgIDQ6CTRjZGYgMDdmYyAgICAgIAltb3ZlbWwgJXNwQFwrLCVkMi0lYTIKLSAgIDg6CTQ4ZjkgMDdmYyAwMDAwIAltb3ZlbWwgJWQyLSVhMiwwIDwudGV4dD4KLSAgIGU6CTAwMDAgCi0gIDEwOgk0OGY5IDA3ZmMgMDAwMCAJbW92ZW1sICVkMi0lYTIsMCA8LnRleHQ+Ci0gIDE2OgkwMDAwIAotICAxODoJNGNmOSAwN2ZjIDAwMDAgCW1vdmVtbCAwIDwudGV4dD4sJWQyLSVhMgotICAxZToJMDAwMCAKLSAgMjA6CTRjZjkgMDdmYyAwMDAwIAltb3ZlbWwgMCA8LnRleHQ+LCVkMi0lYTIKLSAgMjY6CTAwMDAgCi0gIDI4Ogk0Y2Y5IDA3ZmMgMDAwMSAJbW92ZW1sIDE2MDAwIDxmZHNhPiwlZDItJWEyCi0gIDJlOgk2MDAwIAotICAzMDoJNGNmOSAwN2ZjIDAwMDEgCW1vdmVtbCAxNjAwMCA8ZmRzYT4sJWQyLSVhMgotICAzNjoJNjAwMCAKLSAgMzg6CTQ4ZjkgMDdmYyAwMDAxIAltb3ZlbWwgJWQyLSVhMiwxNjAwMCA8ZmRzYT4KLSAgM2U6CTYwMDAgCi0gIDQwOgk0OGY5IDA3ZmMgMDAwMSAJbW92ZW1sICVkMi0lYTIsMTYwMDAgPGZkc2E+Ci0gIDQ2Ogk2MDAwIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGZjNzI4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLWFzZGYJcmVnCWEwLWEyL2QyLWQ3Ci1mZHNhCWVxdQkkMTYwMDAKLQotCW1vdmVtLmwJKHNwKSssYTAtYTIvZDItZDcKLQltb3ZlbS5sCShzcCkrLGFzZGYKLQkKLQltb3ZlbS5sIGEwLWEyL2QyLWQ3LHN5bWJvbAotCW1vdmVtLmwJYXNkZixzeW1ib2wKLQotCW1vdmVtLmwgc3ltYm9sLGEwLWEyL2QyLWQ3Ci0JbW92ZW0ubAlzeW1ib2wsYXNkZgotCi0JbW92ZW0ubCBmZHNhLGEwLWEyL2QyLWQ3Ci0JbW92ZW0ubAlmZHNhLGFzZGYKLQotCW1vdmVtLmwgYTAtYTIvZDItZDcsZmRzYQotCW1vdmVtLmwJYXNkZixmZHNhCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbXJpLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tcmkuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZjZGVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tcmkuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIwotIyBUZXN0IHRoZSBtNjhrIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuCi0jCi0jIEkgb3JpZ2luYWxseSB0aG91Z2h0IHRoYXQgbW9zdCBvZiB0ZXN0cyBhcHBsaWVkIHRvIGFueSBNUkkKLSMgYXNzZW1ibGVyLCBidXQgaXQgdHVybnMgb3V0IHRoYXQgZGlmZmVyZW50IE1SSSBhc3NlbWJsZXJzIHVzZQotIyBkaWZmZXJlbnQgc3ludGF4ZXMuCi0jCi0KLWlmICFbaXN0YXJnZXQgIm02OCotKi0qIl0gewotICAgIHJldHVybgotfQotCi1ydW5fZHVtcF90ZXN0IGxhYmVsCi1ydW5fZHVtcF90ZXN0IGVxdQotcnVuX2R1bXBfdGVzdCBjb25zdGFudHMKLXJ1bl9kdW1wX3Rlc3QgaW1tY29uc3QKLXJ1bl9kdW1wX3Rlc3QgZmxvYXQKLXJ1bl9kdW1wX3Rlc3QgY2hhcgotcnVuX2R1bXBfdGVzdCBleHByCi1ydW5fZHVtcF90ZXN0IGNvbW1vbgotcnVuX2R1bXBfdGVzdCBjb21tZW50Ci1nYXNfdGVzdCAiZW1wdHkucyIgIi1NIiAiIiAiTVJJIGVtcHR5IG1hY3JvIgotcnVuX2R1bXBfdGVzdCBmb3IKLXJ1bl9kdW1wX3Rlc3QgaWYKLXJ1bl9kdW1wX3Rlc3QgcmVwZWF0Ci1ydW5fZHVtcF90ZXN0IHdoaWxlCi1ydW5fZHVtcF90ZXN0IHNlbWkKLXJ1bl9kdW1wX3Rlc3QgbW92ZW1sCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYzVmNjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBzdHJ1Y3R1cmVkIHJlcGVhdAotI2FzOiAtTQotCi0jIFRlc3QgTVJJIHN0cnVjdHVyZWQgcmVwZWF0IHBzZXVkby1vcC4KLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gYmNjcyAwKzAwMCA8Zm9vPgotMCswMDIgPGZvb1wrKDB4fCkyPiBjbHJ3ICVkMQotMCswMDQgPGZvb1wrKDB4fCk0PiBhZGRxdyAjMSwlZDEKLTArMDA2IDxmb29cKygweHwpNj4gY21waXcgIzEwLCVkMQotMCswMGEgPGZvb1wrKDB4fClhPiBiZ3RzIDArMDA0IDxmb29cKygweHwpND4KLTArMDBjIDxmb29cKygweHwpYz4gbm9wCi0wKzAwZSA8Zm9vXCsoMHh8KWU+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTRlYTJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTsgVGVzdCBNUkkgc3RydWN0dXJlZCByZXBlYXQgcHNldWRvLW9wLgotCi0JeGRlZglmb28KLWZvbwotCXJlcGVhdAotCXVudGlsCTxjcz4KLQotCWNsciBkMQotCXJlcGVhdAotCSAgYWRkICMxLGQxCi0JdW50aWwgZDEgPGdlPiAjMTAKLQotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3NlbWkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWNjZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3NlbWkuZAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI29iamR1bXA6IC1zIC1qIC50ZXh0Ci0jbmFtZTogTVJJIHNlbWkKLSNhczogLU0KLQotLio6IC4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci0gMDAwMCAzYjIwM2IyMCAzYTIwM2EyMCAwMDAwMDAwMCAwMDAwMDAwMCAgOyA7IDogOiAuLi4uLi4uLgotIDAwMTAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjMwNjc3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zZW1pY29sb24gIG1hY3JvCi0JZGMuYiAgICAnOyAnCi0JZW5kbQotCi1jb2xvbgkgICAgbWFjcm8KLQlkYy5iICAgICc6ICcKLQllbmRtCi0KLQlzZW1pY29sb24KLQlkYy5iCSc7ICcKLQljb2xvbgotCWRjLmIJJzogJwotCi0JcDJhbGlnbgk1CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRkMzdhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBzdHJ1Y3R1cmVkIHdoaWxlCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgc3RydWN0dXJlIHdoaWxlIHBzZXVkby1vcC4KLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gYmNjcyAwKzAwNCA8Zm9vXCsoMHh8KTQ+Ci0wKzAwMiA8Zm9vXCsoMHh8KTI+IGJyYXMgMCswMDAgPGZvbz4KLTArMDA0IDxmb29cKygweHwpND4gY2xydyAlZDEKLTArMDA2IDxmb29cKygweHwpNj4gY21waXcgIzEwLCVkMQotMCswMGEgPGZvb1wrKDB4fClhPiBibHRzIDArMDEwIDxmb29cKygweHwpMTA+Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IGFkZHF3ICMxLCVkMQotMCswMGUgPGZvb1wrKDB4fCllPiBicmFzIDArMDA2IDxmb29cKygweHwpNj4KLTArMDEwIDxmb29cKygweHwpMTA+IG5vcAotMCswMTIgPGZvb1wrKDB4fCkxMj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNiZGJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotOyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIHdoaWxlIHBzZXVkby1vcC4KLQotCXhkZWYJZm9vCi1mb28KLQl3aGlsZSA8Y3M+IGRvCi0JZW5kdwotCi0JY2xyIGQxCi0Jd2hpbGUgZDEgPGxlPiAjMTAgZG8KLQkgIGFkZCAjMSxkMQotCWVuZHcKLQotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcGovb3BzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2MTk3MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMuZAorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogcGoKLSNhcwotCi0jIHRlc3QgYWxsIHRoZSBpbnN0cnVjdGlvbnMKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1wagotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8Zm9vMC0weDE+OgotCS4uLgotCi0wMDAwMDAwMSA8Zm9vMD46Ci0JLi4uCi0KLTAwMDAwMDAyIDxmb28xPjoKLQkuLi4KLQotMDAwMDAwMDMgPGZvbzI+OgotCS4uLgotCi0wMDAwMDAwNCA8Zm9vMz46Ci0JLi4uCi0KLTAwMDAwMDA1IDxmb280PjoKLQkuLi4KLQotMDAwMDAwMDYgPGZvbzU+OgotCS4uLgotCi0wMDAwMDAwNyA8Zm9vNj46Ci0JLi4uCi0KLTAwMDAwMDA4IDxmb283PjoKLQkuLi4KLQotMDAwMDAwMDkgPGZvbzg+OgotCS4uLgotCi0wMDAwMDAwYSA8Zm9vOT46Ci0JLi4uCi0KLTAwMDAwMDBiIDxmb28xMD46Ci0JLi4uCi0KLTAwMDAwMDBjIDxmb28xMT46Ci0JLi4uCi0KLTAwMDAwMDBkIDxmb28xMj46Ci0JLi4uCi0KLTAwMDAwMDBlIDxmb28xMz46Ci0JLi4uCi0KLTAwMDAwMDBmIDxmb28xND46Ci0JLi4uCi0KLTAwMDAwMDEwIDxmb28xNT46Ci0JLi4uCi0KLTAwMDAwMDExIDxmb28xNj46Ci0JLi4uCi0KLTAwMDAwMDEyIDxmb28xNz46Ci0JLi4uCi0KLTAwMDAwMDEzIDxmb28xOD46Ci0JLi4uCi0KLTAwMDAwMDE0IDxmb28xOT46Ci0gIDE0OgkwMCAgICAgICAgICAJbm9wCi0gIDE1OgkwMSAgICAgICAgICAJYWNvbnN0X251bGwKLSAgMTY6CTAyICAgICAgICAgIAlpY29uc3RfbTEKLSAgMTc6CTAzICAgICAgICAgIAlpY29uc3RfMAotICAxODoJMDQgICAgICAgICAgCWljb25zdF8xCi0gIDE5OgkwNSAgICAgICAgICAJaWNvbnN0XzIKLSAgMWE6CTA2ICAgICAgICAgIAlpY29uc3RfMwotICAxYjoJMDcgICAgICAgICAgCWljb25zdF80Ci0gIDFjOgkwOCAgICAgICAgICAJaWNvbnN0XzUKLSAgMWQ6CTA5ICAgICAgICAgIAlsY29uc3RfMAotICAxZToJMGEgICAgICAgICAgCWxjb25zdF8xCi0gIDFmOgkwYiAgICAgICAgICAJZmNvbnN0XzAKLSAgMjA6CTBjICAgICAgICAgIAlmY29uc3RfMQotICAyMToJMGQgICAgICAgICAgCWZjb25zdF8yCi0gIDIyOgkwZSAgICAgICAgICAJZGNvbnN0XzAKLSAgMjM6CTBmICAgICAgICAgIAlkY29uc3RfMQotICAyNDoJMTAgZTcgICAgICAgCWJpcHVzaAktMjUKLSAgMjY6CTExIGEzIGM2ICAgIAlzaXB1c2gJLTIzNjEwCi0gIDI5OgkxMiAwMCAgICAgICAJbGRjCi0gIDJiOgkxMyAwMCAwMCAgICAJbGRjX3cKLSAgMmU6CTE0IDAwIDAwICAgIAlsZGMyX3cKLSAgMzE6CTE1IDY5ICAgICAgIAlpbG9hZAkxMDUKLSAgMzM6CTE2IDczICAgICAgIAlsbG9hZAkxMTUKLSAgMzU6CTE3IDUxICAgICAgIAlmbG9hZAk4MQotICAzNzoJMTggZmYgICAgICAgCWRsb2FkCTI1NQotICAzOToJMTkgNGEgICAgICAgCWFsb2FkCTc0Ci0gIDNiOgkxYSAgICAgICAgICAJaWxvYWRfMAotICAzYzoJMWIgICAgICAgICAgCWlsb2FkXzEKLSAgM2Q6CTFjICAgICAgICAgIAlpbG9hZF8yCi0gIDNlOgkxZCAgICAgICAgICAJaWxvYWRfMwotICAzZjoJMWUgICAgICAgICAgCWxsb2FkXzAKLSAgNDA6CTFmICAgICAgICAgIAlsbG9hZF8xCi0gIDQxOgkyMCAgICAgICAgICAJbGxvYWRfMgotICA0MjoJMjEgICAgICAgICAgCWxsb2FkXzMKLSAgNDM6CTIyICAgICAgICAgIAlmbG9hZF8wCi0gIDQ0OgkyMyAgICAgICAgICAJZmxvYWRfMQotICA0NToJMjQgICAgICAgICAgCWZsb2FkXzIKLSAgNDY6CTI1ICAgICAgICAgIAlmbG9hZF8zCi0gIDQ3OgkyNiAgICAgICAgICAJZGxvYWRfMAotICA0ODoJMjcgICAgICAgICAgCWRsb2FkXzEKLSAgNDk6CTI4ICAgICAgICAgIAlkbG9hZF8yCi0gIDRhOgkyOSAgICAgICAgICAJZGxvYWRfMwotICA0YjoJMmEgICAgICAgICAgCWFsb2FkXzAKLSAgNGM6CTJiICAgICAgICAgIAlhbG9hZF8xCi0gIDRkOgkyYyAgICAgICAgICAJYWxvYWRfMgotICA0ZToJMmQgICAgICAgICAgCWFsb2FkXzMKLSAgNGY6CTJlICAgICAgICAgIAlpYWxvYWQKLSAgNTA6CTJmICAgICAgICAgIAlsYWxvYWQKLSAgNTE6CTMwICAgICAgICAgIAlmYWxvYWQKLSAgNTI6CTMxICAgICAgICAgIAlkYWxvYWQKLSAgNTM6CTMyICAgICAgICAgIAlhYWxvYWQKLSAgNTQ6CTMzICAgICAgICAgIAliYWxvYWQKLSAgNTU6CTM0ICAgICAgICAgIAljYWxvYWQKLSAgNTY6CTM1ICAgICAgICAgIAlzYWxvYWQKLSAgNTc6CTM2IGVjICAgICAgIAlpc3RvcmUJMjM2Ci0gIDU5OgkzNyAyOSAgICAgICAJbHN0b3JlCTQxCi0gIDViOgkzOCBjZCAgICAgICAJZnN0b3JlCTIwNQotICA1ZDoJMzkgYmEgICAgICAgCWRzdG9yZQkxODYKLSAgNWY6CTNhIGFiICAgICAgIAlhc3RvcmUJMTcxCi0gIDYxOgkzYiAgICAgICAgICAJaXN0b3JlXzAKLSAgNjI6CTNjICAgICAgICAgIAlpc3RvcmVfMQotICA2MzoJM2QgICAgICAgICAgCWlzdG9yZV8yCi0gIDY0OgkzZSAgICAgICAgICAJaXN0b3JlXzMKLSAgNjU6CTNmICAgICAgICAgIAlsc3RvcmVfMAotICA2NjoJNDAgICAgICAgICAgCWxzdG9yZV8xCi0gIDY3Ogk0MSAgICAgICAgICAJbHN0b3JlXzIKLSAgNjg6CTQyICAgICAgICAgIAlsc3RvcmVfMwotICA2OToJNDMgICAgICAgICAgCWZzdG9yZV8wCi0gIDZhOgk0NCAgICAgICAgICAJZnN0b3JlXzEKLSAgNmI6CTQ1ICAgICAgICAgIAlmc3RvcmVfMgotICA2YzoJNDYgICAgICAgICAgCWZzdG9yZV8zCi0gIDZkOgk0NyAgICAgICAgICAJZHN0b3JlXzAKLSAgNmU6CTQ4ICAgICAgICAgIAlkc3RvcmVfMQotICA2ZjoJNDkgICAgICAgICAgCWRzdG9yZV8yCi0gIDcwOgk0YSAgICAgICAgICAJZHN0b3JlXzMKLSAgNzE6CTRiICAgICAgICAgIAlhc3RvcmVfMAotICA3MjoJNGMgICAgICAgICAgCWFzdG9yZV8xCi0gIDczOgk0ZCAgICAgICAgICAJYXN0b3JlXzIKLSAgNzQ6CTRlICAgICAgICAgIAlhc3RvcmVfMwotICA3NToJNGYgICAgICAgICAgCWlhc3RvcmUKLSAgNzY6CTUwICAgICAgICAgIAlsYXN0b3JlCi0gIDc3Ogk1MSAgICAgICAgICAJZmFzdG9yZQotICA3ODoJNTIgICAgICAgICAgCWRhc3RvcmUKLSAgNzk6CTUzICAgICAgICAgIAlhYXN0b3JlCi0gIDdhOgk1NCAgICAgICAgICAJYmFzdG9yZQotICA3YjoJNTUgICAgICAgICAgCWNhc3RvcmUKLSAgN2M6CTU2ICAgICAgICAgIAlzYXN0b3JlCi0gIDdkOgk1NyAgICAgICAgICAJcG9wCi0gIDdlOgk1OCAgICAgICAgICAJcG9wMgotICA3ZjoJNTkgICAgICAgICAgCWR1cAotICA4MDoJNWEgICAgICAgICAgCWR1cF94MQotICA4MToJNWIgICAgICAgICAgCWR1cF94MgotICA4MjoJNWMgICAgICAgICAgCWR1cDIKLSAgODM6CTVkICAgICAgICAgIAlkdXAyX3gxCi0gIDg0Ogk1ZSAgICAgICAgICAJZHVwMl94MgotICA4NToJNWYgICAgICAgICAgCXN3YXAKLSAgODY6CTYwICAgICAgICAgIAlpYWRkCi0gIDg3Ogk2MSAgICAgICAgICAJbGFkZAotICA4ODoJNjIgICAgICAgICAgCWZhZGQKLSAgODk6CTYzICAgICAgICAgIAlkYWRkCi0gIDhhOgk2NCAgICAgICAgICAJaXN1YgotICA4YjoJNjUgICAgICAgICAgCWxzdWIKLSAgOGM6CTY2ICAgICAgICAgIAlmc3ViCi0gIDhkOgk2NyAgICAgICAgICAJZHN1YgotICA4ZToJNjggICAgICAgICAgCWltdWwKLSAgOGY6CTY5ICAgICAgICAgIAlsbXVsCi0gIDkwOgk2YSAgICAgICAgICAJZm11bAotICA5MToJNmIgICAgICAgICAgCWRtdWwKLSAgOTI6CTZjICAgICAgICAgIAlpZGl2Ci0gIDkzOgk2ZCAgICAgICAgICAJbGRpdgotICA5NDoJNmUgICAgICAgICAgCWZkaXYKLSAgOTU6CTZmICAgICAgICAgIAlkZGl2Ci0gIDk2Ogk3MCAgICAgICAgICAJaXJlbQotICA5NzoJNzEgICAgICAgICAgCWxyZW0KLSAgOTg6CTcyICAgICAgICAgIAlmcmVtCi0gIDk5Ogk3MyAgICAgICAgICAJZHJlbQotICA5YToJNzQgICAgICAgICAgCWluZWcKLSAgOWI6CTc1ICAgICAgICAgIAlsbmVnCi0gIDljOgk3NiAgICAgICAgICAJZm5lZwotICA5ZDoJNzcgICAgICAgICAgCWRuZWcKLSAgOWU6CTc4ICAgICAgICAgIAlpc2hsCi0gIDlmOgk3OSAgICAgICAgICAJbHNobAotICBhMDoJN2EgICAgICAgICAgCWlzaHIKLSAgYTE6CTdiICAgICAgICAgIAlsc2hyCi0gIGEyOgk3YyAgICAgICAgICAJaXVzaHIKLSAgYTM6CTdkICAgICAgICAgIAlsdXNocgotICBhNDoJN2UgICAgICAgICAgCWlhbmQKLSAgYTU6CTdmICAgICAgICAgIAlsYW5kCi0gIGE2Ogk4MCAgICAgICAgICAJaW9yCi0gIGE3Ogk4MSAgICAgICAgICAJbG9yCi0gIGE4Ogk4MiAgICAgICAgICAJaXhvcgotICBhOToJODMgICAgICAgICAgCWx4b3IKLSAgYWE6CTg0IGYyIDdiICAgIAlpaW5jCTI0MiwxMjMKLSAgYWQ6CTg1ICAgICAgICAgIAlpMmwKLSAgYWU6CTg2ICAgICAgICAgIAlpMmYKLSAgYWY6CTg3ICAgICAgICAgIAlpMmQKLSAgYjA6CTg4ICAgICAgICAgIAlsMmkKLSAgYjE6CTg5ICAgICAgICAgIAlsMmYKLSAgYjI6CThhICAgICAgICAgIAlsMmQKLSAgYjM6CThiICAgICAgICAgIAlmMmkKLSAgYjQ6CThjICAgICAgICAgIAlmMmwKLSAgYjU6CThkICAgICAgICAgIAlmMmQKLSAgYjY6CThlICAgICAgICAgIAlkMmkKLSAgYjc6CThmICAgICAgICAgIAlkMmwKLSAgYjg6CTkwICAgICAgICAgIAlkMmYKLSAgYjk6CTkxICAgICAgICAgIAlpMmIKLSAgYmE6CTkyICAgICAgICAgIAlpMmMKLSAgYmI6CTkzICAgICAgICAgIAlpMnMKLSAgYmM6CTk0ICAgICAgICAgIAlsY21wCi0gIGJkOgk5NSAgICAgICAgICAJZmNtcGwKLSAgYmU6CTk2ICAgICAgICAgIAlmY21wZwotICBiZjoJOTcgICAgICAgICAgCWRjbXBsCi0gIGMwOgk5OCAgICAgICAgICAJZGNtcGcKLSAgYzE6CTk5IGZmIDQxICAgIAlpZmVxMiA8Zm9vMT4KLSAgYzQ6CTlhIGZmIDQ3ICAgIAlpZm5lYiA8Zm9vMTA+Ci0gIGM3Ogk5YiBmZiA0MSAgICAJaWZsdDggPGZvbzc+Ci0gIGNhOgk5YyBmZiA0OCAgICAJaWZnZTEyIDxmb28xNz4KLSAgY2Q6CTlkIGZmIDM5ICAgIAlpZmd0NiA8Zm9vNT4KLSAgZDA6CTllIGZmIDNhICAgIAlpZmxlYSA8Zm9vOT4KLSAgZDM6CTlmIGZmIDM4ICAgIAlpZl9pY21wZXFiIDxmb28xMD4KLSAgZDY6CWEwIGZmIDNhICAgIAlpZl9pY21wbmUxMCA8Zm9vMTU+Ci0gIGQ5OglhMSBmZiAzMCAgICAJaWZfaWNtcGx0OSA8Zm9vOD4KLSAgZGM6CWEyIGZmIDMxICAgIAlpZl9pY21wZ2VkIDxmb28xMj4KLSAgZGY6CWEzIGZmIDI5ICAgIAlpZl9pY21wZ3Q4IDxmb283PgotICBlMjoJYTQgZmYgMmIgICAgCWlmX2ljbXBsZWQgPGZvbzEyPgotICBlNToJYTUgZmYgMjIgICAgCWlmX2FjbXBlcTcgPGZvbzY+Ci0gIGU4OglhNiBmZiAyMCAgICAJaWZfYWNtcG5lOCA8Zm9vNz4KLSAgZWI6CWE3IGZmIDFiICAgIAlnb3RvNiA8Zm9vNT4KLSAgZWU6CWE4IDAwIDAwICAgIAlqc3IKLSAgZjE6CWE5IDAwICAgICAgIAlyZXQKLSAgZjM6CWFhIGZmIGZmIGZmIAl0YWJsZXN3aXRjaCBkZWZhdWx0OiAuKgotICBmNzoJMGYgMDAgMDAgMDAgCi0gIGZiOgkwMSAwMCAwMCAwMCAKLSAgZmY6CTA1IGZmIGZmIGZmIAotIDEwMzoJMTQgZmYgZmYgZmYgCi0gMTA3OgkxMiBmZiBmZiBmZiAKLSAxMGI6CTFmIGZmIGZmIGZmIAotIDEwZjoJMTQgZmYgZmYgZmYgCi0gMTEzOgkxMiAKLSAxMTQ6CWFiIDAwIDAwIDAwIAlsb29rdXBzd2l0Y2ggZGVmYXVsdDogLioKLSAxMTg6CWZmIGZmIGZlIGYyIAotIDExYzoJMDAgMDAgMDAgMDIgCi0gMTIwOgkwMCAwMCAwMCAwNyAKLSAxMjQ6CWZmIGZmIGZlIGZiIAotIDEyODoJMDAgMDAgMDAgMjUgCi0gMTJjOglmZiBmZiBmZSBmYyAKLSAxMzA6CWFjICAgICAgICAgIAlpcmV0dXJuCi0gMTMxOglhZCAgICAgICAgICAJbHJldHVybgotIDEzMjoJYWUgICAgICAgICAgCWZyZXR1cm4KLSAxMzM6CWFmICAgICAgICAgIAlkcmV0dXJuCi0gMTM0OgliMCAgICAgICAgICAJYXJldHVybgotIDEzNToJYjEgICAgICAgICAgCXJldHVybgotIDEzNjoJYjIgMDAgMDAgICAgCWdldHN0YXRpYwotIDEzOToJYjMgMDAgMDAgICAgCXB1dHN0YXRpYwotIDEzYzoJYjQgMDAgMDAgICAgCWdldGZpZWxkCi0gMTNmOgliNSAwMCAwMCAgICAJcHV0ZmllbGQKLSAxNDI6CWI2IDAwIDAwICAgIAlpbnZva2V2aXJ0dWFsCi0gMTQ1OgliNyAwMCAwMCAgICAJaW52b2tlc3BlY2lhbAotIDE0ODoJYjggMDAgMDAgICAgCWludm9rZXN0YXRpYwotIDE0YjoJYjkgMDAgMDAgMDAgCWludm9rZWludGVyZmFjZQotIDE0ZjoJMDAgCi0gMTUwOgliYiAwMCAwMCAgICAJbmV3Ci0gMTUzOgliYyAwMCAgICAgICAJbmV3YXJyYXkKLSAxNTU6CWJkIDAwIDAwICAgIAlhbmV3YXJyYXkKLSAxNTg6CWJlICAgICAgICAgIAlhcnJheWxlbmd0aAotIDE1OToJYmYgICAgICAgICAgCWF0aHJvdwotIDE1YToJYzAgMDAgMDAgICAgCWNoZWNrY2FzdAotIDE1ZDoJYzEgMDAgMDAgICAgCWluc3RhbmNlb2YKLSAxNjA6CWMyICAgICAgICAgIAltb25pdG9yZW50ZXIKLSAxNjE6CWMzICAgICAgICAgIAltb25pdG9yZXhpdAotIDE2MjoJYzQgICAgICAgICAgCXdpZGUKLSAxNjM6CWM1IDAwIDAwIDAwIAltdWx0aWFuZXdhcnJheQotIDE2NzoJYzYgMDAgMDAgICAgCWlmbnVsbAotIDE2YToJYzcgMDAgMDAgICAgCWlmbm9ubnVsbAotIDE2ZDoJYzggMDAgMDAgMDAgCWdvdG9fdwotIDE3MToJMDAgCi0gMTcyOgljOSAwMCAwMCAwMCAJanNyX3cKLSAxNzY6CTAwIAotIDE3NzoJY2EgICAgICAgICAgCWJyZWFrcG9pbnQKLSAxNzg6CWNiICAgICAgICAgIAlieXRlY29kZQotIDE3OToJY2MgICAgICAgICAgCXRyeQotIDE3YToJY2QgICAgICAgICAgCWVuZHRyeQotIDE3YjoJY2UgICAgICAgICAgCWNhdGNoCi0gMTdjOgljZiAgICAgICAgICAJdmFyCi0gMTdkOglkMCAgICAgICAgICAJZW5kdmFyCi0gMTdlOgllZCBiMCBhMyAgICAJc2V0aGkJLTIwMzE3Ci0gMTgxOgllZSA1YSBhNSAgICAJbG9hZF93b3JkX2luZGV4CTkwLDE2NQotIDE4NDoJZWYgNWQgODUgICAgCWxvYWRfc2hvcnRfaW5kZXgJOTMsMTMzCi0gMTg3OglmMCAxNyBkOCAgICAJbG9hZF9jaGFyX2luZGV4CTIzLDIxNgotIDE4YToJZjEgZTkgZGUgICAgCWxvYWRfYnl0ZV9pbmRleAkyMzMsMjIyCi0gMThkOglmMiBkNCAyYiAgICAJbG9hZF91Ynl0ZV9pbmRleAkyMTIsNDMKLSAxOTA6CWYzIGIyIDRkICAgIAlzdG9yZV93b3JkX2luZGV4CTE3OCw3NwotIDE5MzoJZjQgYzYgMWIgICAgCW5hX3N0b3JlX3dvcmRfaW5kZXgJMTk4LDI3Ci0gMTk2OglmNSBiNCBkNCAgICAJc3RvcmVfc2hvcnRfaW5kZXgJMTgwLDIxMgotIDE5OToJZjYgMTEgOGUgICAgCXN0b3JlX2J5dGVfaW5kZXgJMTcsMTQyCi0gMTljOglmZiAwMCAgICAgICAJbG9hZF91Ynl0ZQkKLSAxOWU6CWZmIDAxICAgICAgIAlsb2FkX2J5dGUJCi0gMWEwOglmZiAwMiAgICAgICAJbG9hZF9jaGFyCQotIDFhMjoJZmYgMDMgICAgICAgCWxvYWRfc2hvcnQJCi0gMWE0OglmZiAwNCAgICAgICAJbG9hZF93b3JkCQotIDFhNjoJZmYgMDUgICAgICAgCXByaXZfcmV0X2Zyb21fdHJhcAkKLSAxYTg6CWZmIDA2ICAgICAgIAlwcml2X3JlYWRfZGNhY2hlX3RhZwkKLSAxYWE6CWZmIDA3ICAgICAgIAlwcml2X3JlYWRfZGNhY2hlX2RhdGEJCi0gMWFjOglmZiAwYSAgICAgICAJbG9hZF9jaGFyX29lCQotIDFhZToJZmYgMGIgICAgICAgCWxvYWRfc2hvcnRfb2UJCi0gMWIwOglmZiAwYyAgICAgICAJbG9hZF93b3JkX29lCQotIDFiMjoJZmYgMGQgICAgICAgCXJldHVybjAJCi0gMWI0OglmZiAwZSAgICAgICAJcHJpdl9yZWFkX2ljYWNoZV90YWcJCi0gMWI2OglmZiAwZiAgICAgICAJcHJpdl9yZWFkX2ljYWNoZV9kYXRhCQotIDFiODoJZmYgMTAgICAgICAgCW5jbG9hZF91Ynl0ZQkKLSAxYmE6CWZmIDExICAgICAgIAluY2xvYWRfYnl0ZQkKLSAxYmM6CWZmIDEyICAgICAgIAluY2xvYWRfY2hhcgkKLSAxYmU6CWZmIDEzICAgICAgIAluY2xvYWRfc2hvcnQJCi0gMWMwOglmZiAxNCAgICAgICAJbmNsb2FkX3dvcmQJCi0gMWMyOglmZiAxNSAgICAgICAJaXVjbXAJCi0gMWM0OglmZiAxNiAgICAgICAJcHJpdl9wb3dlcmRvd24JCi0gMWM2OglmZiAxNyAgICAgICAJY2FjaGVfaW52YWxpZGF0ZQkKLSAxYzg6CWZmIDFhICAgICAgIAluY2xvYWRfY2hhcl9vZQkKLSAxY2E6CWZmIDFiICAgICAgIAluY2xvYWRfc2hvcnRfb2UJCi0gMWNjOglmZiAxYyAgICAgICAJbmNsb2FkX3dvcmRfb2UJCi0gMWNlOglmZiAxZCAgICAgICAJcmV0dXJuMQkKLSAxZDA6CWZmIDFlICAgICAgIAljYWNoZV9mbHVzaAkKLSAxZDI6CWZmIDFmICAgICAgIAljYWNoZV9pbmRleF9mbHVzaAkKLSAxZDQ6CWZmIDIwICAgICAgIAlzdG9yZV9ieXRlCQotIDFkNjoJZmYgMjIgICAgICAgCXN0b3JlX3Nob3J0CQotIDFkODoJZmYgMjQgICAgICAgCXN0b3JlX3dvcmQJCi0gMWRhOglmZiAyNSAgICAgICAJc29mdF90cmFwCQotIDFkYzoJZmYgMjYgICAgICAgCXByaXZfd3JpdGVfZGNhY2hlX3RhZwkKLSAxZGU6CWZmIDI3ICAgICAgIAlwcml2X3dyaXRlX2RjYWNoZV9kYXRhCQotIDFlMDoJZmYgMmEgICAgICAgCXN0b3JlX3Nob3J0X29lCQotIDFlMjoJZmYgMmMgICAgICAgCXN0b3JlX3dvcmRfb2UJCi0gMWU0OglmZiAyZCAgICAgICAJcmV0dXJuMgkKLSAxZTY6CWZmIDJlICAgICAgIAlwcml2X3dyaXRlX2ljYWNoZV90YWcJCi0gMWU4OglmZiAyZiAgICAgICAJcHJpdl93cml0ZV9pY2FjaGVfZGF0YQkKLSAxZWE6CWZmIDMwICAgICAgIAluY3N0b3JlX2J5dGUJCi0gMWVjOglmZiAzMiAgICAgICAJbmNzdG9yZV9zaG9ydAkKLSAxZWU6CWZmIDM0ICAgICAgIAluY3N0b3JlX3dvcmQJCi0gMWYwOglmZiAzNiAgICAgICAJcHJpdl9yZXNldAkKLSAxZjI6CWZmIDM3ICAgICAgIAlnZXRfY3VycmVudF9jbGFzcwkKLSAxZjQ6CWZmIDNhICAgICAgIAluY3N0b3JlX3Nob3J0X29lCQotIDFmNjoJZmYgM2MgICAgICAgCW5jc3RvcmVfd29yZF9vZQkKLSAxZjg6CWZmIDNkICAgICAgIAljYWxsCQotIDFmYToJZmYgM2UgICAgICAgCXplcm9fbGluZQkKLSAxZmM6CWZmIDNmICAgICAgIAlwcml2X3VwZGF0ZV9vcHRvcAkKLSAxZmU6CWZmIDQwICAgICAgIAlyZWFkX3BjCQotIDIwMDoJZmYgNDEgICAgICAgCXJlYWRfdmFycwkKLSAyMDI6CWZmIDQyICAgICAgIAlyZWFkX2ZyYW1lCQotIDIwNDoJZmYgNDMgICAgICAgCXJlYWRfb3B0b3AJCi0gMjA2OglmZiA0NCAgICAgICAJcHJpdl9yZWFkX29wbGltCQotIDIwODoJZmYgNDUgICAgICAgCXJlYWRfY29uc3RfcG9vbAkKLSAyMGE6CWZmIDQ2ICAgICAgIAlwcml2X3JlYWRfcHNyCQotIDIwYzoJZmYgNDcgICAgICAgCXByaXZfcmVhZF90cmFwYmFzZQkKLSAyMGU6CWZmIDQ4ICAgICAgIAlwcml2X3JlYWRfbG9ja2NvdW50MAkKLSAyMTA6CWZmIDQ5ICAgICAgIAlwcml2X3JlYWRfbG9ja2NvdW50MQkKLSAyMTI6CWZmIDRjICAgICAgIAlwcml2X3JlYWRfbG9ja2FkZHIwCQotIDIxNDoJZmYgNGQgICAgICAgCXByaXZfcmVhZF9sb2NrYWRkcjEJCi0gMjE2OglmZiA1MCAgICAgICAJcHJpdl9yZWFkX3VzZXJyYW5nZTEJCi0gMjE4OglmZiA1MSAgICAgICAJcHJpdl9yZWFkX2djX2NvbmZpZwkKLSAyMWE6CWZmIDUyICAgICAgIAlwcml2X3JlYWRfYnJrMWEJCi0gMjFjOglmZiA1MyAgICAgICAJcHJpdl9yZWFkX2JyazJhCQotIDIxZToJZmYgNTQgICAgICAgCXByaXZfcmVhZF9icmsxMmMJCi0gMjIwOglmZiA1NSAgICAgICAJcHJpdl9yZWFkX3VzZXJyYW5nZTIJCi0gMjIyOglmZiA1NyAgICAgICAJcHJpdl9yZWFkX3ZlcnNpb25pZAkKLSAyMjQ6CWZmIDU4ICAgICAgIAlwcml2X3JlYWRfaGNyCQotIDIyNjoJZmYgNTkgICAgICAgCXByaXZfcmVhZF9zY19ib3R0b20JCi0gMjI4OglmZiA1YSAgICAgICAJcmVhZF9nbG9iYWwwCQotIDIyYToJZmYgNWIgICAgICAgCXJlYWRfZ2xvYmFsMQkKLSAyMmM6CWZmIDVjICAgICAgIAlyZWFkX2dsb2JhbDIJCi0gMjJlOglmZiA1ZCAgICAgICAJcmVhZF9nbG9iYWwzCQotIDIzMDoJZmYgNjAgICAgICAgCXdyaXRlX3BjCQotIDIzMjoJZmYgNjEgICAgICAgCXdyaXRlX3ZhcnMJCi0gMjM0OglmZiA2MiAgICAgICAJd3JpdGVfZnJhbWUJCi0gMjM2OglmZiA2MyAgICAgICAJd3JpdGVfb3B0b3AJCi0gMjM4OglmZiA2NCAgICAgICAJcHJpdl93cml0ZV9vcGxpbQkKLSAyM2E6CWZmIDY1ICAgICAgIAl3cml0ZV9jb25zdF9wb29sCQotIDIzYzoJZmYgNjYgICAgICAgCXByaXZfd3JpdGVfcHNyCQotIDIzZToJZmYgNjcgICAgICAgCXByaXZfd3JpdGVfdHJhcGJhc2UJCi0gMjQwOglmZiA2OCAgICAgICAJcHJpdl93cml0ZV9sb2NrY291bnQwCQotIDI0MjoJZmYgNjkgICAgICAgCXByaXZfd3JpdGVfbG9ja2NvdW50MQkKLSAyNDQ6CWZmIDZjICAgICAgIAlwcml2X3dyaXRlX2xvY2thZGRyMAkKLSAyNDY6CWZmIDZkICAgICAgIAlwcml2X3dyaXRlX2xvY2thZGRyMQkKLSAyNDg6CWZmIDcwICAgICAgIAlwcml2X3dyaXRlX3VzZXJyYW5nZTEJCi0gMjRhOglmZiA3MSAgICAgICAJcHJpdl93cml0ZV9nY19jb25maWcJCi0gMjRjOglmZiA3MiAgICAgICAJcHJpdl93cml0ZV9icmsxYQkKLSAyNGU6CWZmIDczICAgICAgIAlwcml2X3dyaXRlX2JyazJhCQotIDI1MDoJZmYgNzQgICAgICAgCXByaXZfd3JpdGVfYnJrMTJjCQotIDI1MjoJZmYgNzUgICAgICAgCXByaXZfd3JpdGVfdXNlcnJhbmdlMgkKLSAyNTQ6CWZmIDc5ICAgICAgIAlwcml2X3dyaXRlX3NjX2JvdHRvbQkKLSAyNTY6CWZmIDdhICAgICAgIAl3cml0ZV9nbG9iYWwwCQotIDI1ODoJZmYgN2IgICAgICAgCXdyaXRlX2dsb2JhbDEJCi0gMjVhOglmZiA3YyAgICAgICAJd3JpdGVfZ2xvYmFsMgkKLSAyNWM6CWZmIDdkICAgICAgIAl3cml0ZV9nbG9iYWwzCQotIDI1ZToJZmYgYWUgICAgICAgCXRtX3B1dGNoYXIJCi0gMjYwOglmZiBhZiAgICAgICAJdG1fZXhpdAkKLSAyNjI6CWZmIGIwICAgICAgIAl0bV90cmFwCQotIDI2NDoJZmYgYjEgICAgICAgCXRtX21pbmZvCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcGovb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4MTA5Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMucworKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0uTDA6CW5vcAotLmdsb2JsIGZvbzAKLWZvbzA6Ci0uTDE6CW5vcAotLmdsb2JsIGZvbzEKLWZvbzE6Ci0uTDI6CW5vcAotLmdsb2JsIGZvbzIKLWZvbzI6Ci0uTDM6CW5vcAotLmdsb2JsIGZvbzMKLWZvbzM6Ci0uTDQ6CW5vcAotLmdsb2JsIGZvbzQKLWZvbzQ6Ci0uTDU6CW5vcAotLmdsb2JsIGZvbzUKLWZvbzU6Ci0uTDY6CW5vcAotLmdsb2JsIGZvbzYKLWZvbzY6Ci0uTDc6CW5vcAotLmdsb2JsIGZvbzcKLWZvbzc6Ci0uTDg6CW5vcAotLmdsb2JsIGZvbzgKLWZvbzg6Ci0uTDk6CW5vcAotLmdsb2JsIGZvbzkKLWZvbzk6Ci0uTDEwOglub3AKLS5nbG9ibCBmb28xMAotZm9vMTA6Ci0uTDExOglub3AKLS5nbG9ibCBmb28xMQotZm9vMTE6Ci0uTDEyOglub3AKLS5nbG9ibCBmb28xMgotZm9vMTI6Ci0uTDEzOglub3AKLS5nbG9ibCBmb28xMwotZm9vMTM6Ci0uTDE0Oglub3AKLS5nbG9ibCBmb28xNAotZm9vMTQ6Ci0uTDE1Oglub3AKLS5nbG9ibCBmb28xNQotZm9vMTU6Ci0uTDE2Oglub3AKLS5nbG9ibCBmb28xNgotZm9vMTY6Ci0uTDE3Oglub3AKLS5nbG9ibCBmb28xNwotZm9vMTc6Ci0uTDE4Oglub3AKLS5nbG9ibCBmb28xOAotZm9vMTg6Ci0uTDE5Oglub3AKLS5nbG9ibCBmb28xOQotZm9vMTk6Ci0Jbm9wCi0JYWNvbnN0X251bGwKLQlpY29uc3RfbTEKLQlpY29uc3RfMAotCWljb25zdF8xCi0JaWNvbnN0XzIKLQlpY29uc3RfMwotCWljb25zdF80Ci0JaWNvbnN0XzUKLQlsY29uc3RfMAotCWxjb25zdF8xCi0JZmNvbnN0XzAKLQlmY29uc3RfMQotCWZjb25zdF8yCi0JZGNvbnN0XzAKLQlkY29uc3RfMQotCWJpcHVzaCAtMjUKLQlzaXB1c2ggLTIzNjEwCi0JbGRjCi0JbGRjX3cKLQlsZGMyX3cKLQlpbG9hZCAxMDUKLQlsbG9hZCAxMTUKLQlmbG9hZCA4MQotCWRsb2FkIDI1NQotCWFsb2FkIDc0Ci0JaWxvYWRfMAotCWlsb2FkXzEKLQlpbG9hZF8yCi0JaWxvYWRfMwotCWxsb2FkXzAKLQlsbG9hZF8xCi0JbGxvYWRfMgotCWxsb2FkXzMKLQlmbG9hZF8wCi0JZmxvYWRfMQotCWZsb2FkXzIKLQlmbG9hZF8zCi0JZGxvYWRfMAotCWRsb2FkXzEKLQlkbG9hZF8yCi0JZGxvYWRfMwotCWFsb2FkXzAKLQlhbG9hZF8xCi0JYWxvYWRfMgotCWFsb2FkXzMKLQlpYWxvYWQKLQlsYWxvYWQKLQlmYWxvYWQKLQlkYWxvYWQKLQlhYWxvYWQKLQliYWxvYWQKLQljYWxvYWQKLQlzYWxvYWQKLQlpc3RvcmUgMjM2Ci0JbHN0b3JlIDQxCi0JZnN0b3JlIDIwNQotCWRzdG9yZSAxODYKLQlhc3RvcmUgMTcxCi0JaXN0b3JlXzAKLQlpc3RvcmVfMQotCWlzdG9yZV8yCi0JaXN0b3JlXzMKLQlsc3RvcmVfMAotCWxzdG9yZV8xCi0JbHN0b3JlXzIKLQlsc3RvcmVfMwotCWZzdG9yZV8wCi0JZnN0b3JlXzEKLQlmc3RvcmVfMgotCWZzdG9yZV8zCi0JZHN0b3JlXzAKLQlkc3RvcmVfMQotCWRzdG9yZV8yCi0JZHN0b3JlXzMKLQlhc3RvcmVfMAotCWFzdG9yZV8xCi0JYXN0b3JlXzIKLQlhc3RvcmVfMwotCWlhc3RvcmUKLQlsYXN0b3JlCi0JZmFzdG9yZQotCWRhc3RvcmUKLQlhYXN0b3JlCi0JYmFzdG9yZQotCWNhc3RvcmUKLQlzYXN0b3JlCi0JcG9wCi0JcG9wMgotCWR1cAotCWR1cF94MQotCWR1cF94MgotCWR1cDIKLQlkdXAyX3gxCi0JZHVwMl94MgotCXN3YXAKLQlpYWRkCi0JbGFkZAotCWZhZGQKLQlkYWRkCi0JaXN1YgotCWxzdWIKLQlmc3ViCi0JZHN1YgotCWltdWwKLQlsbXVsCi0JZm11bAotCWRtdWwKLQlpZGl2Ci0JbGRpdgotCWZkaXYKLQlkZGl2Ci0JaXJlbQotCWxyZW0KLQlmcmVtCi0JZHJlbQotCWluZWcKLQlsbmVnCi0JZm5lZwotCWRuZWcKLQlpc2hsCi0JbHNobAotCWlzaHIKLQlsc2hyCi0JaXVzaHIKLQlsdXNocgotCWlhbmQKLQlsYW5kCi0JaW9yCi0JbG9yCi0JaXhvcgotCWx4b3IKLQlpaW5jIDI0MiwgMTIzCi0JaTJsCi0JaTJmCi0JaTJkCi0JbDJpCi0JbDJmCi0JbDJkCi0JZjJpCi0JZjJsCi0JZjJkCi0JZDJpCi0JZDJsCi0JZDJmCi0JaTJiCi0JaTJjCi0JaTJzCi0JbGNtcAotCWZjbXBsCi0JZmNtcGcKLQlkY21wbAotCWRjbXBnCi0JaWZlcSAuTDIKLQlpZm5lIC5MMTEKLQlpZmx0IC5MOAotCWlmZ2UgLkwxOAotCWlmZ3QgLkw2Ci0JaWZsZSAuTDEwCi0JaWZfaWNtcGVxIC5MMTEKLQlpZl9pY21wbmUgLkwxNgotCWlmX2ljbXBsdCAuTDkKLQlpZl9pY21wZ2UgLkwxMwotCWlmX2ljbXBndCAuTDgKLQlpZl9pY21wbGUgLkwxMwotCWlmX2FjbXBlcSAuTDcKLQlpZl9hY21wbmUgLkw4Ci0JZ290byAuTDYKLQlqc3IKLQlyZXQKLS5MdDoJdGFibGVzd2l0Y2gKLQotCS5hbGlnbiAyCi0JLmxvbmcgLkwyLS5MdAotCS5sb25nIDEKLQkubG9uZyA1Ci0JLmxvbmcgLkw3LS5MdAotCS5sb25nIC5MNS0uTHQKLQkubG9uZyAuTDE4LS5MdAotCS5sb25nIC5MNy0uTHQKLQkubG9uZyAuTDUtLkx0Ci0uTGw6CWxvb2t1cHN3aXRjaAotCi0JLmFsaWduIDIKLQkubG9uZyAuTDYtLkxsCi0JLmxvbmcgMgotCS5sb25nIDcKLQkubG9uZyAuTDE1LS5MbAotCS5sb25nIDM3Ci0JLmxvbmcgLkwxNi0uTGwKLQlpcmV0dXJuCi0JbHJldHVybgotCWZyZXR1cm4KLQlkcmV0dXJuCi0JYXJldHVybgotCXJldHVybgotCWdldHN0YXRpYwotCXB1dHN0YXRpYwotCWdldGZpZWxkCi0JcHV0ZmllbGQKLQlpbnZva2V2aXJ0dWFsCi0JaW52b2tlc3BlY2lhbAotCWludm9rZXN0YXRpYwotCWludm9rZWludGVyZmFjZQotCW5ldwotCW5ld2FycmF5Ci0JYW5ld2FycmF5Ci0JYXJyYXlsZW5ndGgKLQlhdGhyb3cKLQljaGVja2Nhc3QKLQlpbnN0YW5jZW9mCi0JbW9uaXRvcmVudGVyCi0JbW9uaXRvcmV4aXQKLQl3aWRlCi0JbXVsdGlhbmV3YXJyYXkKLQlpZm51bGwKLQlpZm5vbm51bGwKLQlnb3RvX3cKLQlqc3JfdwotCWJyZWFrcG9pbnQKLQlieXRlY29kZQotCXRyeQotCWVuZHRyeQotCWNhdGNoCi0JdmFyCi0JZW5kdmFyCi0Jc2V0aGkgLTIwMzE3Ci0JbG9hZF93b3JkX2luZGV4IDkwLCAtOTEKLQlsb2FkX3Nob3J0X2luZGV4IDkzLCAtMTIzCi0JbG9hZF9jaGFyX2luZGV4IDIzLCAtNDAKLQlsb2FkX2J5dGVfaW5kZXggMjMzLCAtMzQKLQlsb2FkX3VieXRlX2luZGV4IDIxMiwgNDMKLQlzdG9yZV93b3JkX2luZGV4IDE3OCwgNzcKLQluYV9zdG9yZV93b3JkX2luZGV4IDE5OCwgMjcKLQlzdG9yZV9zaG9ydF9pbmRleCAxODAsIC00NAotCXN0b3JlX2J5dGVfaW5kZXggMTcsIC0xMTQKLQlsb2FkX3VieXRlCi0JbG9hZF9ieXRlCi0JbG9hZF9jaGFyCi0JbG9hZF9zaG9ydAotCWxvYWRfd29yZAotCXByaXZfcmV0X2Zyb21fdHJhcAotCXByaXZfcmVhZF9kY2FjaGVfdGFnCi0JcHJpdl9yZWFkX2RjYWNoZV9kYXRhCi0JbG9hZF9jaGFyX29lCi0JbG9hZF9zaG9ydF9vZQotCWxvYWRfd29yZF9vZQotCXJldHVybjAKLQlwcml2X3JlYWRfaWNhY2hlX3RhZwotCXByaXZfcmVhZF9pY2FjaGVfZGF0YQotCW5jbG9hZF91Ynl0ZQotCW5jbG9hZF9ieXRlCi0JbmNsb2FkX2NoYXIKLQluY2xvYWRfc2hvcnQKLQluY2xvYWRfd29yZAotCWl1Y21wCi0JcHJpdl9wb3dlcmRvd24KLQljYWNoZV9pbnZhbGlkYXRlCi0JbmNsb2FkX2NoYXJfb2UKLQluY2xvYWRfc2hvcnRfb2UKLQluY2xvYWRfd29yZF9vZQotCXJldHVybjEKLQljYWNoZV9mbHVzaAotCWNhY2hlX2luZGV4X2ZsdXNoCi0Jc3RvcmVfYnl0ZQotCXN0b3JlX3Nob3J0Ci0Jc3RvcmVfd29yZAotCXNvZnRfdHJhcAotCXByaXZfd3JpdGVfZGNhY2hlX3RhZwotCXByaXZfd3JpdGVfZGNhY2hlX2RhdGEKLQlzdG9yZV9zaG9ydF9vZQotCXN0b3JlX3dvcmRfb2UKLQlyZXR1cm4yCi0JcHJpdl93cml0ZV9pY2FjaGVfdGFnCi0JcHJpdl93cml0ZV9pY2FjaGVfZGF0YQotCW5jc3RvcmVfYnl0ZQotCW5jc3RvcmVfc2hvcnQKLQluY3N0b3JlX3dvcmQKLQlwcml2X3Jlc2V0Ci0JZ2V0X2N1cnJlbnRfY2xhc3MKLQluY3N0b3JlX3Nob3J0X29lCi0JbmNzdG9yZV93b3JkX29lCi0JY2FsbAotCXplcm9fbGluZQotCXByaXZfdXBkYXRlX29wdG9wCi0JcmVhZF9wYwotCXJlYWRfdmFycwotCXJlYWRfZnJhbWUKLQlyZWFkX29wdG9wCi0JcHJpdl9yZWFkX29wbGltCi0JcmVhZF9jb25zdF9wb29sCi0JcHJpdl9yZWFkX3BzcgotCXByaXZfcmVhZF90cmFwYmFzZQotCXByaXZfcmVhZF9sb2NrY291bnQwCi0JcHJpdl9yZWFkX2xvY2tjb3VudDEKLQlwcml2X3JlYWRfbG9ja2FkZHIwCi0JcHJpdl9yZWFkX2xvY2thZGRyMQotCXByaXZfcmVhZF91c2VycmFuZ2UxCi0JcHJpdl9yZWFkX2djX2NvbmZpZwotCXByaXZfcmVhZF9icmsxYQotCXByaXZfcmVhZF9icmsyYQotCXByaXZfcmVhZF9icmsxMmMKLQlwcml2X3JlYWRfdXNlcnJhbmdlMgotCXByaXZfcmVhZF92ZXJzaW9uaWQKLQlwcml2X3JlYWRfaGNyCi0JcHJpdl9yZWFkX3NjX2JvdHRvbQotCXJlYWRfZ2xvYmFsMAotCXJlYWRfZ2xvYmFsMQotCXJlYWRfZ2xvYmFsMgotCXJlYWRfZ2xvYmFsMwotCXdyaXRlX3BjCi0Jd3JpdGVfdmFycwotCXdyaXRlX2ZyYW1lCi0Jd3JpdGVfb3B0b3AKLQlwcml2X3dyaXRlX29wbGltCi0Jd3JpdGVfY29uc3RfcG9vbAotCXByaXZfd3JpdGVfcHNyCi0JcHJpdl93cml0ZV90cmFwYmFzZQotCXByaXZfd3JpdGVfbG9ja2NvdW50MAotCXByaXZfd3JpdGVfbG9ja2NvdW50MQotCXByaXZfd3JpdGVfbG9ja2FkZHIwCi0JcHJpdl93cml0ZV9sb2NrYWRkcjEKLQlwcml2X3dyaXRlX3VzZXJyYW5nZTEKLQlwcml2X3dyaXRlX2djX2NvbmZpZwotCXByaXZfd3JpdGVfYnJrMWEKLQlwcml2X3dyaXRlX2JyazJhCi0JcHJpdl93cml0ZV9icmsxMmMKLQlwcml2X3dyaXRlX3VzZXJyYW5nZTIKLQlwcml2X3dyaXRlX3NjX2JvdHRvbQotCXdyaXRlX2dsb2JhbDAKLQl3cml0ZV9nbG9iYWwxCi0Jd3JpdGVfZ2xvYmFsMgotCXdyaXRlX2dsb2JhbDMKLQl0bV9wdXRjaGFyCi0JdG1fZXhpdAotCXRtX3RyYXAKLQl0bV9taW5mbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcGovcGouZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcGovcGouZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGE0MDM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BqL3BqLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIwotIyBTb21lIHBqIHRlc3RzCi0jCi1pZiBbaXN0YXJnZXQgcGoqXSB0aGVuIHsKLSAgICBydW5fZHVtcF90ZXN0ICJvcHMiCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhYWI1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jb2JqZHVtcDogLURyCi0jbmFtZTogUG93ZXJQQyB0ZXN0IDEKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1wb3dlcnBjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotCi0wKzAwMDAwMDAgPGZvbz46Ci0gICAwOgk2MCAwMCAwMCAwMCAJbm9wCi0gICA0Ogk2MCAwMCAwMCAwMCAJbm9wCi0gICA4Ogk2MCAwMCAwMCAwMCAJbm9wCi0KLTArMDAwMDAwYyA8YT46Ci0gICBjOgk0OCAwMCAwMCAwNCAJYgkxMCA8YXBmb3VyPgotCi0wKzAwMDAwMTAgPGFwZm91cj46Ci0gIDEwOgk0OCAwMCAwMCAwOCAJYgkxOCA8YXBmb3VyXCsweDg+Ci0gIDE0Ogk0OCAwMCAwMCAwMCAJYgkxNCA8YXBmb3VyXCsweDQ+Ci0JCQkxNDogUl9QUENfUkVMMjQJeAotICAxODoJNDggMDAgMDAgMDQgCWIJMWMgPGFwZm91clwrMHhjPgotCQkJMTg6IFJfUFBDX1JFTDI0CVwuZGF0YVwrMHg0Ci0gIDFjOgk0OCAwMCAwMCAwMCAJYgkxYyA8YXBmb3VyXCsweGM+Ci0JCQkxYzogUl9QUENfUkVMMjQJegotICAyMDoJNDggMDAgMDAgMTQgCWIJMzQgPGFwZm91clwrMHgyND4KLQkJCTIwOiBSX1BQQ19SRUwyNAl6XCsweDE0Ci0gIDI0Ogk0OCAwMCAwMCAwNCAJYgkyOCA8YXBmb3VyXCsweDE4PgotICAyODoJNDggMDAgMDAgMDAgCWIJMjggPGFwZm91clwrMHgxOD4KLQkJCTI4OiBSX1BQQ19SRUwyNAlhCi0gIDJjOgk0YiBmZiBmZiBlNCAJYgkxMCA8YXBmb3VyPgotICAzMDoJNDggMDAgMDAgMDQgCWIJMzQgPGFwZm91clwrMHgyND4KLQkJCTMwOiBSX1BQQ19SRUwyNAlhXCsweDQKLSAgMzQ6CTRiIGZmIGZmIGUwIAliCTE0IDxhcGZvdXJcKzB4ND4KLSAgMzg6CTQ4IDAwIDAwIDAwIAliCTM4IDxhcGZvdXJcKzB4Mjg+Ci0JCQkzODogUl9QUENfTE9DQUwyNFBDCWEKLSAgM2M6CTRiIGZmIGZmIGQ0IAliCTEwIDxhcGZvdXI+Ci0KLSAgNDA6CTAwIDAwIDAwIDQwIAlcLmxvbmcgMHg0MAotCQkJNDA6IFJfUFBDX0FERFIzMglcLnRleHRcKzB4NDAKLQotICA0NDoJMDAgMDAgMDAgNGMgCVwubG9uZyAweDRjCi0JCQk0NDogUl9QUENfQUREUjMyCVwudGV4dFwrMHg0YwotICA0ODoJMDAgMDAgMDAgMDAgCVwubG9uZyAweDAKLQkJCTQ4OiBSX1BQQ19SRUwzMgl4Ci0gIDRjOgkwMCAwMCAwMCAwNCAJXC5sb25nIDB4NAotCQkJNGM6IFJfUFBDX1JFTDMyCXhcKzB4NAotCVwuXC5cLgotCQkJNTA6IFJfUFBDX1JFTDMyCXoKLQkJCTU0OiBSX1BQQ19SRUwzMgl5Ci0JCQk1ODogUl9QUENfQUREUjMyCXgKLQkJCTVjOiBSX1BQQ19BRERSMzIJeQotCQkJNjA6IFJfUFBDX0FERFIzMgl6Ci0gIDY0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjQ6IFJfUFBDX0FERFIzMgl4XCsweGYrZmZmZmZmYwotICA2ODoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTY4OiBSX1BQQ19BRERSMzIJeVwrMHhmK2ZmZmZmZmMKLSAgNmM6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2YzogUl9QUENfQUREUjMyCXpcKzB4ZitmZmZmZmZjCi0gIDcwOglmZiBmZiBmZiA5YyAJXC5sb25nIDB4ZmZmZmZmOWMKLSAgNzQ6CWZmIGZmIGZmIDljIAlcLmxvbmcgMHhmZmZmZmY5YwotCVwuXC5cLgotCQkJNzg6IFJfUFBDX0FERFIzMglhCi0JCQk3YzogUl9QUENfQUREUjMyCWIKLQkJCTgwOiBSX1BQQ19BRERSMzIJYXBmb3VyCi0gIDg0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotICA4ODoJMDAgMDAgMDAgMDIgCVwubG9uZyAweDIKLQkJCTg4OiBSX1BQQ19BRERSMzIJYXBmb3VyXCsweDIKLSAgOGM6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwuZGF0YToKLQotMCswMDAwMDAwIDx4PjoKLSAgIDA6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCi0KLTArMDAwMDAwNCA8eT46Ci0gICA0OgkwMCAwMCAwMCAwMCAJXC5sb25nIDB4MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFmMjE2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLQkuc2VjdGlvbiAiLmRhdGEiCi0JLmdsb2JsIHgKLQkuZ2xvYmwgegoteDoJLmxvbmcgMAotegk9IC4gKyA0Ci1mb3VyCT0geiAtIHggLSA0Ci15OgkubG9uZyAwCi0JCi0JLnNlY3Rpb24gIi50ZXh0IgotZm9vOgkKLQlub3AgOyBub3AgOyBub3AKLQkuZ2xvYmwgYQotYToJYiAuKzQKLWI6CWIgLis4Ci0JYiB4Ci0JYiB5Ci0JYiB6Ci0JYiB6KzIwCi0JYiAuK2ZvdXIKLQliIGEKLQliIGIKLQliIGErNAotCWIgYis0Ci0JYiBhQGxvY2FsCi0JYiBiQGxvY2FsCi0JLmxvbmcgLgotCS5sb25nIC4rOAotCS5sb25nIHgtLgotCS5sb25nIHgrNC0uCi0JLmxvbmcgei0uCi0JLmxvbmcgeS0uCi0JLmxvbmcgeAotCS5sb25nIHkKLQkubG9uZyB6Ci0JLmxvbmcgeC1mb3VyCi0JLmxvbmcgeS1mb3VyCi0JLmxvbmcgei1mb3VyCi0JLmxvbmcgYS0uCi0JLmxvbmcgYi0uCi0JLmxvbmcgYQotCS5sb25nIGIKLQotYXBmb3VyCT0gYSArIGZvdXIKLQkubG9uZyBhcGZvdXIKLQkubG9uZyBhLWFwZm91cgotCS5sb25nIGFwZm91cisyCi0JLmxvbmcgYXBmb3VyLWIKLQotCS50eXBlCWZvbyxAZnVuY3Rpb24KLQkudHlwZQlhLEBmdW5jdGlvbgotCS50eXBlCWIsQGZ1bmN0aW9uCi0JLnR5cGUJYXBmb3VyLEBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGUzYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSNvYmpkdW1wOiAtRHIKLSNuYW1lOiBQb3dlclBDIHRlc3QgMgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLXBvd2VycGMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwMDAwIDxmb28+OgotICAgMDoJNjAgMDAgMDAgMDAgCW5vcAotICAgNDoJNjAgMDAgMDAgMDAgCW5vcAotICAgODoJNjAgMDAgMDAgMDAgCW5vcAotICAgYzoJNDggMDAgMDAgMDQgCWIJMTAgPGZvb1wrMHgxMD4KLSAgMTA6CTQ4IDAwIDAwIDA4IAliCTE4IDxmb29cKzB4MTg+Ci0gIDE0Ogk0OCAwMCAwMCAwMCAJYgkxNCA8Zm9vXCsweDE0PgotCQkJMTQ6IFJfUFBDX1JFTDI0CXgKLSAgMTg6CTQ4IDAwIDAwIDA0IAliCTFjIDxmb29cKzB4MWM+Ci0JCQkxODogUl9QUENfUkVMMjQJLmRhdGFcKzB4NAotICAxYzoJNDggMDAgMDAgMDAgCWIJMWMgPGZvb1wrMHgxYz4KLQkJCTFjOiBSX1BQQ19SRUwyNAl6Ci0gIDIwOgk0OCAwMCAwMCAxNCAJYgkzNCA8Zm9vXCsweDM0PgotCQkJMjA6IFJfUFBDX1JFTDI0CXpcKzB4MTQKLSAgMjQ6CTQ4IDAwIDAwIDA0IAliCTI4IDxmb29cKzB4Mjg+Ci0gIDI4Ogk0OCAwMCAwMCAwMCAJYgkyOCA8Zm9vXCsweDI4PgotCQkJMjg6IFJfUFBDX1JFTDI0CWEKLSAgMmM6CTQ4IDAwIDAwIDUwIAliCTdjIDxhcGZvdXI+Ci0gIDMwOgk0OCAwMCAwMCAwNCAJYgkzNCA8Zm9vXCsweDM0PgotCQkJMzA6IFJfUFBDX1JFTDI0CWFcKzB4NAotICAzNDoJNDggMDAgMDAgNGMgCWIJODAgPGFwZm91clwrMHg0PgotICAzODoJNDggMDAgMDAgMDAgCWIJMzggPGZvb1wrMHgzOD4KLQkJCTM4OiBSX1BQQ19MT0NBTDI0UEMJYQotICAzYzoJNDggMDAgMDAgNDAgCWIJN2MgPGFwZm91cj4KLQotICA0MDoJMDAgMDAgMDAgNDAgCS5sb25nIDB4NDAKLQkJCTQwOiBSX1BQQ19BRERSMzIJLnRleHRcKzB4NDAKLQotICA0NDoJMDAgMDAgMDAgNGMgCS5sb25nIDB4NGMKLQkJCTQ0OiBSX1BQQ19BRERSMzIJLnRleHRcKzB4NGMKLSAgNDg6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQkJCTQ4OiBSX1BQQ19SRUwzMgl4Ci0gIDRjOgkwMCAwMCAwMCAwNCAJLmxvbmcgMHg0Ci0JCQk0YzogUl9QUENfUkVMMzIJeFwrMHg0Ci0JLi4uCi0JCQk1MDogUl9QUENfUkVMMzIJegotCQkJNTQ6IFJfUFBDX1JFTDMyCXkKLQkJCTU4OiBSX1BQQ19BRERSMzIJeAotCQkJNWM6IFJfUFBDX0FERFIzMgl5Ci0JCQk2MDogUl9QUENfQUREUjMyCXoKLSAgNjQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2NDogUl9QUENfQUREUjMyCXhcKzB4ZitmZmZmZmZjCi0gIDY4OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjg6IFJfUFBDX0FERFIzMgl5XCsweGYrZmZmZmZmYwotICA2YzoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTZjOiBSX1BQQ19BRERSMzIJelwrMHhmK2ZmZmZmZmMKLSAgNzA6CTAwIDAwIDAwIDA4IAkubG9uZyAweDgKLSAgNzQ6CTAwIDAwIDAwIDA4IAkubG9uZyAweDgKLQotMCswMDAwMDc4IDxhPjoKLSAgNzg6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQkJCTc4OiBSX1BQQ19BRERSMzIJYQotCi0wKzAwMDAwN2MgPGFwZm91cj46Ci0JLi4uCi0JCQk3YzogUl9QUENfQUREUjMyCWIKLQkJCTgwOiBSX1BQQ19BRERSMzIJYXBmb3VyCi0gIDg0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotICA4ODoJMDAgMDAgMDAgMDIgCS5sb25nIDB4MgotCQkJODg6IFJfUFBDX0FERFIzMglhcGZvdXJcKzB4MgotICA4YzoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuZGF0YToKLQotMCswMDAwMDAwIDx4PjoKLSAgIDA6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQotMCswMDAwMDA0IDx5PjoKLSAgIDQ6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWYyMjMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1mb3VyCT0gNAotCS5zZWN0aW9uICIudGV4dCIKLWZvbzoJCi0Jbm9wIDsgbm9wIDsgbm9wCi0JLmdsb2JsIGEKLQliIC4rNAotCWIgLis4Ci0JYiB4Ci0JYiB5Ci0JYiB6Ci0JYiB6KzIwCi0JYiAuK2ZvdXIKLQliIGEKLQliIGIKLQliIGErNAotCWIgYis0Ci0JYiBhQGxvY2FsCi0JYiBiQGxvY2FsCi0JLmxvbmcgLgotCS5sb25nIC4rOAotCS5sb25nIHgtLgotCS5sb25nIHgrNC0uCi0JLmxvbmcgei0uCi0JLmxvbmcgeS0uCi0JLmxvbmcgeAotCS5sb25nIHkKLQkubG9uZyB6Ci0JLmxvbmcgeC1mb3VyCi0JLmxvbmcgeS1mb3VyCi0JLmxvbmcgei1mb3VyCi0JLmxvbmcgYS0uCi0JLmxvbmcgYi0uCi1hOgkubG9uZyBhCi1iOgkubG9uZyBiCi0KLWFwZm91cgk9IGEgKyBmb3VyCi0JLmxvbmcgYXBmb3VyCi0JLmxvbmcgYS1hcGZvdXIKLQkubG9uZyBhcGZvdXIrMgotCS5sb25nIGFwZm91ci1iCi0KLQkuc2VjdGlvbiAiLmRhdGEiCi0JLmdsb2JsIHgKLQkuZ2xvYmwgegoteDoJLmxvbmcgMAotegk9IC4gKyA0Ci15OgkubG9uZyAwCi0KLQkudHlwZQlmb28sQGZ1bmN0aW9uCi0JLnR5cGUJYSxAZnVuY3Rpb24KLQkudHlwZQliLEBmdW5jdGlvbgotCS50eXBlCWFwZm91cixAZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9wcGMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmZiYzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIFNvbWUgUG93ZXJQQyB0ZXN0cwotIwotCi0jIFRoZXNlIHRlc3RzIGFyZSBjdXJyZW50bHkgRUxGIHNwZWNpZmljLCBvbmx5IGJlY2F1c2Ugbm9ib2R5IGhhcwotIyBjb252ZXJ0ZWQgdGhlbSB0byBsb29rIGZvciBYQ09GRiByZWxvY2F0aW9ucy4KLQotaWYgeyBbaXN0YXJnZXQgcG93ZXJwYyotKi0qYnNkKl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1lbGYqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWVhYmkqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLXN5c3Y0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1saW51eCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotc29sYXJpcypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotcnRlbXMqXSB9IHRoZW4gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFzdGVzdCIKLSAgICBydW5fZHVtcF90ZXN0ICJhc3Rlc3QyIgotfQotCi1pZiB7IFtpc3RhcmdldCBwb3dlcnBjKi0qLSpdIH0gdGhlbiB7Ci0gICBydW5fZHVtcF90ZXN0ICJzaW1wc2hmdCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODkzZDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jb2JqZHVtcDogLXMgLWogLnRleHQKLSNhczogLW1wcGM2NAotI25hbWU6IFBvd2VyUEMgdGVzdCAzLCBzaW1wbGlmaWVkIHNoaWZ0cwotCi0uKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIFwudGV4dDoKLSAwMDAwIDc4NjQwZmUwIDc4ODNmODBlIDc4YTU0NWU0IDc4NjQwMDIwICB4ZC4ueC4uLnguRS54ZC4gCi0gMDAxMCA1NDY0MGZmZSA1MDgzZjgwMCA1NGE1NDAyZSA1NDY0MDQzZSAgVGQuLlAuLi5ULkAuVGQuPgotIDAwMjAgNzg2NDAwMDQgNzg2NDA3ZTQgNzg2NGY4MDYgNzg2NGZmZTYgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDMwIDc4NjRmODQyIDc4NjRmZmUyIDc4NjQwMDBjIDc4NjQwODBjICB4ZC5CeGQuLnhkLi54ZC4uCi0gMDA0MCA3ODY0MGZhYyA3ODY0MDdlYyA3ODY0MDAwMCA3ODY0MDgwMCAgeGQuLnhkLi54ZC4ueGQuLgotIDAwNTAgNzg2NGY4MDIgNzg2NDAwMDAgNzg2NGY4MDIgNzg2NDA4MDAgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDYwIDc4NjUyMDEwIDc4NjQwN2U0IDc4NjRmODA2IDc4NjQwMDAwICB4ZSAueGQuLnhkLi54ZC4uCi0gMDA3MCA3ODY0Zjg0MiA3ODY0MGZlMCA3ODY0MDAwMCA3ODY0MDA0MCAgeGQuQnhkLi54ZC4ueGQuQAotIDAwODAgNzg2NDA3ZTAgNzg2NDA3ZTQgNzg2NDA3YTQgNzg2NDAwMDQgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDkwIDc4NjQwMDA4IDc4NjQwMDQ4IDc4NjQwN2U4IDc4NjQwZmE4ICB4ZC4ueGQuSHhkLi54ZC4uCi0gMDBhMCA3ODY0ZjgwYSA1NDY0MDAwMCA1NDY0MDAzZSA1NDY0ZjgwMCAgeGQuLlRkLi5UZC4+VGQuLgotIDAwYjAgNTQ2NGY4M2UgNTQ2NGY4N2UgNTQ2NGZmZmUgNTA2NDAwMDAgIFRkLj5UZC5+VGQuLlBkLi4KLSAwMGMwIDUwNjQwMDNlIDUwNjQwZmZlIDUwNjRmODAwIDUwNjQwMDNlICBQZC4+UGQuLlBkLi5QZC4+Ci0gMDBkMCA1MDY0MDdmZSA1NDY0MDAzZSA1NDY0MDgzZSA1NDY0ZjgzZSAgUGQuLlRkLj5UZC4+VGQuPgotIDAwZTAgNTQ2NDAwM2UgNTQ2NGY4M2UgNTQ2NDA4M2UgNWM2NTIwM2UgIFRkLj5UZC4+VGQuPlxcZSA+Ci0gMDBmMCA1NDY0MDAzZSA1NDY0MDgzYyA1NDY0ZjgwMCA1NDY0MDAzZSAgVGQuPlRkLjxUZC4uVGQuPgotIDAxMDAgNTQ2NGY4N2UgNTQ2NDBmZmUgNTQ2NDAwM2UgNTQ2NDAwN2UgIFRkLn5UZC4uVGQuPlRkLn4KLSAwMTEwIDU0NjQwN2ZlIDU0NjQwMDNlIDU0NjQwMDNjIDU0NjQwMDAwICBUZC4uVGQuPlRkLjxUZC4uCi0gMDEyMCA1NDY0MDAzZSA1NDY0MDA3ZSA1NDY0MDdmZSA1NDY0MGZiYyAgVGQuPlRkLn5UZC4uVGQuLgotIDAxMzAgNTQ2NGY4MDAgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIFRkLi4uLi4uICAgICAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmY5OGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIyBUaGVzZSBhcmUgYWxsIHRoZSBleGFtcGxlcyBmcm9tIHNlY3Rpb24gRi40IG9mCi0jICJQb3dlclBDIE1pY3JvcHJvY2Vzc29yIEZhbWlseTogVGhlIFByb2dyYW1taW5nIEVudmlyb25tZW50cyIuCi0jIDY0LWJpdCBleGFtcGxlcwotCWV4dHJkaQklcjQsJXIzLDEsMAotCWluc3JkaQklcjMsJXI0LDEsMAotCXNsZGkJJXI1LCVyNSw4Ci0JY2xybGRpCSVyNCwlcjMsMzIKLSMgMzItYml0IGV4YW1wbGVzCi0JZXh0cndpCSVyNCwlcjMsMSwwCi0JaW5zcndpCSVyMywlcjQsMSwwCi0Jc2x3aQklcjUsJXI1LDgKLQljbHJsd2kJJXI0LCVyMywxNgotCi0KLSMgVGhlc2UgdGVzdCB0aGUgcmVtYWluaW5nIGNvcm5lciBjYXNlcyBmb3IgNjQtYml0IG9wZXJhdGlvbnMuCi0JZXh0bGRpCSVyNCwlcjMsMSwwCi0JZXh0bGRpCSVyNCwlcjMsNjQsMAotCWV4dGxkaQklcjQsJXIzLDEsNjMKLQlleHRsZGkJJXI0LCVyMyw2NCw2MyAgICAjIGJpdCB3ZWlyZCwgdGhhdCBvbmUuCi0JCi0JZXh0cmRpCSVyNCwlcjMsNjMsMAotCWV4dHJkaQklcjQsJXIzLDEsNjIKLQotCWluc3JkaQklcjQsJXIzLDY0LDAKLQlpbnNyZGkJJXI0LCVyMyw2MywwCi0JaW5zcmRpCSVyNCwlcjMsMSw2MgotCWluc3JkaQklcjQsJXIzLDEsNjMKLQotCXJvdGxkaQklcjQsJXIzLDAKLQlyb3RsZGkJJXI0LCVyMywxCi0Jcm90bGRpCSVyNCwlcjMsNjMKLQotCXJvdHJkaQklcjQsJXIzLDAKLQlyb3RyZGkJJXI0LCVyMywxCi0Jcm90cmRpCSVyNCwlcjMsNjMKLQotCXJvdGxkCSVyNSwlcjMsJXI0Ci0KLQlzbGRpCSVyNCwlcjMsMAotCXNsZGkJJXI0LCVyMyw2MwotCi0Jc3JkaQklcjQsJXIzLDAKLQlzcmRpCSVyNCwlcjMsMQotCXNyZGkJJXI0LCVyMyw2MwotCi0JY2xybGRpCSVyNCwlcjMsMAotCWNscmxkaQklcjQsJXIzLDEKLQljbHJsZGkJJXI0LCVyMyw2MwotCi0JY2xycmRpCSVyNCwlcjMsMAotCWNscnJkaQklcjQsJXIzLDEKLQljbHJyZGkJJXI0LCVyMyw2MwotCQotCWNscmxzbGRpCSVyNCwlcjMsMCwwCi0JY2xybHNsZGkJJXI0LCVyMywxLDAKLQljbHJsc2xkaQklcjQsJXIzLDYzLDAKLQljbHJsc2xkaQklcjQsJXIzLDYzLDEKLQljbHJsc2xkaQklcjQsJXIzLDYzLDYzCi0JCi0jIFRoZXNlIHRlc3QgdGhlIHJlbWFpbmluZyBjb3JuZXIgY2FzZXMgZm9yIDMyLWJpdCBvcGVyYXRpb25zLgotCWV4dGx3aQklcjQsJXIzLDEsMAotCWV4dGx3aQklcjQsJXIzLDMyLDAKLQlleHRsd2kJJXI0LCVyMywxLDMxCi0JZXh0bHdpCSVyNCwlcjMsMzIsMzEgICAgIyBiaXQgd2VpcmQsIHRoYXQgb25lLgotCQotCWV4dHJ3aQklcjQsJXIzLDMxLDAKLQlleHRyd2kJJXI0LCVyMywxLDMwCi0JCi0JaW5zbHdpCSVyNCwlcjMsMSwwCi0JaW5zbHdpCSVyNCwlcjMsMzIsMAotCWluc2x3aQklcjQsJXIzLDEsMzEKLQkKLQlpbnNyd2kJJXI0LCVyMywxLDAKLQlpbnNyd2kJJXI0LCVyMywzMiwwCi0JaW5zcndpCSVyNCwlcjMsMSwzMQotCQotCXJvdGx3aQklcjQsJXIzLDAKLQlyb3Rsd2kJJXI0LCVyMywxCi0Jcm90bHdpCSVyNCwlcjMsMzEKLQotCXJvdHJ3aQklcjQsJXIzLDAKLQlyb3Ryd2kJJXI0LCVyMywxCi0Jcm90cndpCSVyNCwlcjMsMzEKLQotCXJvdGx3CSVyNSwlcjMsJXI0Ci0KLQlzbHdpCSVyNCwlcjMsMAotCXNsd2kJJXI0LCVyMywxCi0Jc2x3aQklcjQsJXIzLDMxCi0KLQlzcndpCSVyNCwlcjMsMAotCXNyd2kJJXI0LCVyMywxCi0Jc3J3aQklcjQsJXIzLDMxCi0KLQljbHJsd2kJJXI0LCVyMywwCi0JY2xybHdpCSVyNCwlcjMsMQotCWNscmx3aQklcjQsJXIzLDMxCi0KLQljbHJyd2kJJXI0LCVyMywwCi0JY2xycndpCSVyNCwlcjMsMQotCWNscnJ3aQklcjQsJXIzLDMxCi0JCi0JY2xybHNsd2kJJXI0LCVyMywwLDAKLQljbHJsc2x3aQklcjQsJXIzLDEsMAotCWNscmxzbHdpCSVyNCwlcjMsMzEsMAotCWNscmxzbHdpCSVyNCwlcjMsMzEsMQotCWNscmxzbHdpCSVyNCwlcjMsMzEsMzEKLQotIyBGb3JjZSBhbGlnbm1lbnQgc28gdGhhdCB3ZSBwYXNzIHRoZSB0ZXN0IG9uIEFJWAotCS5wMmFsaWduCTMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkYmIwYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zaC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19mcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcC5zOiBmbG9hdGluZyBwb2ludCB0ZXN0cyAoc2gzZSkiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYwMDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYwMEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEYwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEYwMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEYxMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEYwOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEYwOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEYxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYxMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEYxMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEYxMDNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYxMEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEYxMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEYxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYwNERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEYwNURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEYwNkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEYwMkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEYwM0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEYwMERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwMURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIDQzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDQzNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIDQzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDQzNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IDAzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDQzNTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNhIDAzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDQzNjJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0KLWlmIFtpc3RhcmdldCBzaCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19mcAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2ZwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmQ4NjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQkuZmlsZQkidGVzdC5jIgotCS5kYXRhCi0KLSEgSGl0YWNoaSBTSCBjYzEgKGN5Z251cy0yLjcuMS05NTA3MjgpIGFyZ3VtZW50czogLU8gLWZwZWVwaG9sZQotISAtZmZ1bmN0aW9uLWNzZSAtZnJlZy1zdHJ1Y3QtcmV0dXJuIC1mZGVsYXllZC1icmFuY2ggLWZjb21tb24gLWZnbnUtbGlua2VyCi0KLWdjYzJfY29tcGlsZWQuOgotX19fZ251X2NvbXBpbGVkX2M6Ci0JLnRleHQKLQkuYWxpZ24gMgotCS5nbG9iYWwJX2ZvbwotX2ZvbzoKLQlmbW92LnMJQHIwLGZyMAotCWZtb3YucwlmcjAsQHIwCi0JZm1vdi5zCUByMCssZnIwCi0JZm1vdi5zCWZyMCxALXIwCi0JZm1vdi5zCUAocjAscjApLGZyMAotCWZtb3YucwlmcjAsQChyMCxyMCkKLQlmbW92CWZyMCxmcjEKLQlmbGRpMAlmcjAKLQlmbGRpMQlmcjAKLQlmYWRkCWZyMCxmcjEKLQlmc3ViCWZyMCxmcjEKLQlmbXVsCWZyMCxmcjEKLQlmZGl2CWZyMCxmcjEKLQlmbWFjCWZyMCxmcjAsZnIxCi0JZmNtcC9lcQlmcjAsZnIxCi0JZmNtcC9ndAlmcjAsZnIxCi0JZm5lZwlmcjAKLQlmYWJzCWZyMAotCWZzcXJ0CWZyMAotCWZsb2F0CWZwdWwsZnIwCi0JZnRyYwlmcjAsZnB1bAotCWZzdHMJZnB1bCxmcjAKLQlmbGRzCWZyMCxmcHVsCi0JbGRzCXIzLGZwdWwKLQlsZHMubAlAcjMrLGZwdWwKLQlsZHMJcjMsZnBzY3IKLQlsZHMubAlAcjMrLGZwc2NyCi0Jc3RzCWZwdWwscjMKLQlzdHMubAlmcHVsLEAtcjMKLQlzdHMJZnBzY3IscjMKLQlzdHMubAlmcHNjcixALXIzCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4MzhjNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jCi0jIFNvbGFyaXMgb24gU1BBUkMgdGVzdHMKLSMKLQotaWYgW2lzdGFyZ2V0IHNwYXJjKi0qLXNvbGFyaXMyKl0gdGhlbiB7Ci0gICAgc2V0IHgxIDAKLSAgICBzZXQgeDIgMAotICAgIHNldCB4MyAwCi0gICAgc2V0IHg0IDAKLSAgICBzZXQgeDUgMAotICAgIHNldCB4NiAwCi0gICAgc2V0IHRlc3RuYW1lICJhZGRlbmRzIChwYXJ0IDIpIgotICAgIGlmIFtnYXNfdGVzdF9vbGQgImFkZGVuZC5zIiAiIiAiYWRkZW5kcyAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCXdoaWxlIDEgewotCSAgICAjIFRoZXNlIGFyZSB3aGF0IHdlIGdldCB1c2luZyB0aGUgU29sYXJpcyBhc3NlbWJsZXIuCi0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiMDggUl9TUEFSQ19XRElTUDIyICtmb28xXFsrXF0rMHgwKzA0XFteXG5cXSpcbiIJeyBpbmNyIHgxIH0KLQkJLXJlICIwYyBSX1NQQVJDX1dESVNQMjIgK2ZvbzFcWytcXSsweDArMDRcW15cblxdKlxuIgl7IGluY3IgeDIgfQotCQktcmUgIjEwIFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbXlxuXF0qXG4iCQl7IGluY3IgeDMgfQotCQktcmUgIjE0IFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbXlxuXF0qXG4iCQl7IGluY3IgeDQgfQotCQktcmUgIjFjIFJfU1BBUkNfMzIgK2ZvbzFcW15cblxdKlxuIgkJCXsgaW5jciB4NSB9Ci0JCS1yZSAiMjAgUl9TUEFSQ18zMiArZm9vMVxbK1xdKzB4MCswNFxbXlxuXF0qXG4iCQl7IGluY3IgeDYgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0Jb2JqZHVtcF9maW5pc2gKLQlpZiBbYWxsX29uZXMgJHgxICR4MiAkeDMgJHg0ICR4NSAkeDZdIHRoZW4gewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGViMTA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLmdsb2JhbCBmb28KLWZvbzoKLQlub3AKLQlub3AKLQliYSBmb28xKzB4NAotCWJhIGZvbzErMHg0Ci0JYmEgZm9vMQotCWJhIGZvbzEKLQlub3AKLQkud29yZCBmb28xCi0JLndvcmQgZm9vMSs0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYWY2OTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9nYXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBTb2xhcmlzLTIgb24gU1BBUkMgdGVzdHMKLSMKLSMgVGhlIHR3byBjb21waWxlcnMsIGNjIGFuZCBnY2MsIGdlbmVyYXRlIHF1aXRlIGRpZmZlcmVudCBkZWJ1Z2dpbmcKLSMgcmVjb3Jkcy4gIFZlcmlmeSB0aGF0IHdlIGNhbiBhY2NlcHQgYm90aC4KLSMKLWlmIFtpc3RhcmdldCBzcGFyYy0qLXNvbGFyaXMyKl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3QgInNvbC1jYy5zIiAgIiIgJHN0ZG9wdGxpc3QgIlNQQVJDIFNvbGFyaXMgY2MgLWciCi0gICAgZ2FzX3Rlc3QgInNvbC1nY2MucyIgIiIgJHN0ZG9wdGxpc3QgIlNQQVJDIFNvbGFyaXMgZ2NjIC1nIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjUwZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQkuc2VjdGlvbiAiLnRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnByb2MJNAotCS5nbG9iYWwJbWFpbgotCS5hbGlnbgk0Ci0JLmdsb2JhbAltYWluCi1tYWluOgotISNQUk9MT0dVRSMgMAotISNQUk9MT0dVRSMgMQotCXNhdmUJJXNwLC05Niwlc3AKLQlzZXRoaQklaGkoLkwxOCksJW8wCi0Jc2V0aGkJJWhpKG1zZyksJW8xCi0Jb3IJJW8xLCVsbyhtc2cpLCVvMQkhIFtpbnRlcm5hbF0KLQljYWxsCXByaW50ZiwyCi0Jb3IJJW8wLCVsbyguTDE4KSwlbzAJISBbaW50ZXJuYWxdCi0JcmV0Ci0JcmVzdG9yZQklZzAsMCwlbzAKLQkudHlwZQltYWluLCNmdW5jdGlvbgotCS5zaXplCW1haW4sKC4tbWFpbikKLQkuc2VjdGlvbiAiLmRhdGEiCQkJISBbaW50ZXJuYWxdCi0JLmFsaWduCTQKLURkYXRhLmRhdGE6Ci0JLnNlY3Rpb24gIi5ic3MiCQkJISBbaW50ZXJuYWxdCi1CYnNzLmJzczoKLQkuc2VjdGlvbiAiLnJvZGF0YSIJCSEgW2ludGVybmFsXQotRHJvZGF0YS5yb2RhdGE6Ci0JLmZpbGUJImhpLXNvbC5jIgotCS5nbG9iYWwJbXNnCi0JLmdsb2JhbAltc2cKLW1zZzoKLQkuYXNjaWkJImhlbGxvLCB3b3JsZCFcMCIKLQkudHlwZQltc2csI29iamVjdAotCS5zaXplCW1zZywxNAotCS5zZWN0aW9uICIuZGF0YTEiLCAjd3JpdGUsICNhbGxvYyAhIFtpbnRlcm5hbF0KLQkuYWxpZ24JNAotLkwxODoKLQkuYXNjaWkJIiVzXG5cMCIKLQkuaWRlbnQJImFjb21wOiAoQ0RTKSBTUEFSQ29tcGlsZXJzIDIuMC4xIDAzIFNlcCAxOTkyIgotCS5zZWN0aW9uICJ0ZXh0IgkJCSEgW2ludGVybmFsXQotCS5zdGFicwkiL2N5Z2ludC9zMS91c2Vycy9yYWVidXJuLyIsMTAwLDAsMCwwCi0JLnN0YWJzCSJoaS1zb2wuYyIsMTAwLDAsMywwCi0JLnN0YWJzCSIiLDU2LDAsMCwwCi0JLnN0YWJzCSIiLDU2LDAsMCwwCi0JLnN0YWJzCSJYdCA7IGcgOyBPIDsgVj0yLjAiLDYwLDAsMCwweDJiYjc3M2JhCi0JLnN0YWJzCSJjaGFyOnQoMCwxKT1ic2MxOzA7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkic2hvcnQ6dCgwLDIpPWJzMjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJpbnQ6dCgwLDMpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJsb25nOnQoMCw0KT1iczQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkibG9uZyBsb25nOnQoMCw1KT1iczg7MDs2NDsiLDEyOCwwLDAsMAotCS5zdGFicwkic2lnbmVkIGNoYXI6dCgwLDYpPWJzYzE7MDs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgc2hvcnQ6dCgwLDcpPWJzMjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgaW50OnQoMCw4KT1iczQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkic2lnbmVkIGxvbmc6dCgwLDkpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgbG9uZyBsb25nOnQoMCwxMCk9YnM4OzA7NjQ7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInVuc2lnbmVkIGNoYXI6dCgwLDExKT1idWMxOzA7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgc2hvcnQ6dCgwLDEyKT1idTI7MDsxNjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgaW50OnQoMCwxMyk9YnU0OzA7MzI7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInVuc2lnbmVkIGxvbmc6dCgwLDE0KT1idTQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgbG9uZyBsb25nOnQoMCwxNSk9YnU4OzA7NjQ7IiwxMjgsMCwwLDAKLQkuc3RhYnMJImZsb2F0OnQoMCwxNik9UjE7NDsiLDEyOCwwLDAsMAotCS5zdGFicwkiZG91YmxlOnQoMCwxNyk9UjI7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkibG9uZyBkb3VibGU6dCgwLDE4KT1SNjsxNjsiLDEyOCwwLDAsMAotCS5zdGFicwkidm9pZDp0KDAsMTkpPWJzMDswOzAiLDEyOCwwLDAsMAotCS5zdGFicwkibXNnOkcoMCwyMCk9YXIoMCwzKTswOzEzOygwLDEpIiwzMiwwLDE0LDAKLQkuc3RhYnMJIm1haW46RigwLDMpOygwLDMpOygwLDIxKT0qKDAsMjIpPSooMCwxKSIsMzYsMCwwLG1haW4KLQkuc3RhYnMJIm1haW4iLDQyLDAsMCwwCi0JLnN0YWJuCTE5MiwwLDEsMAotCS5zdGFibgk2OCwwLDQsMAotCS5zdGFicwkiYXJnYzpwKDAsMykiLDE2MCwwLDQsNjgKLQkuc3RhYnMJImFyZ3Y6cCgwLDIxKSIsMTYwLDAsNCw3MgotCS5zdGFicwkicHJpbnRmOlAoMCwzKSIsMzYsMCwwLDAKLQkuc3RhYm4JMjI0LDAsMSwwCi0JLnN0YWJzCSIiLDk4LDAsMCwwCi0JLnNlY3Rpb24gInRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnhzdGFicwkiLnN0YWIuaW5kZXgiLCIvY3lnaW50L3MxL3VzZXJzL3JhZWJ1cm4vIiwxMDAsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsImhpLXNvbC5jIiwxMDAsMCwzLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIiIsNTYsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIiIsNTYsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIlh0IDsgZyA7IE8gOyBWPTIuMCIsNjAsMCwwLDB4MmJiNzczYmEKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1zZyIsMzIsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1haW4iLDQyLDAsMCwwCi0JLnhzdGFicwkiLnN0YWIuaW5kZXgiLCJtYWluIiwzNiwwLDAsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtZ2NjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1ZmRjZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLQkuZmlsZQkiaGktc29sLmMiCi0uc3RhYnMgIi8xaC9kZXZvL3NyYy9nYXMvdGVzdHN1aXRlL2dhcy8iLDEwMCwwLDAsLkxMdGV4dDAKLS5zdGFicyAiaGktc29sLmMiLDEwMCwwLDAsLkxMdGV4dDAKLS5zZWN0aW9uCSIudGV4dCIKLS5MTHRleHQwOgotCS5zdGFicwkiZ2NjMl9jb21waWxlZC4iLCAweDNjLCAwLCAwLCAwCi0uc3RhYnMgImludDp0MT1yMTstMjE0NzQ4MzY0ODsyMTQ3NDgzNjQ3OyIsMTI4LDAsMCwwCi0uc3RhYnMgImNoYXI6dDI9cjI7MDsxMjc7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBpbnQ6dDM9cjE7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NzsiLDEyOCwwLDAsMAotLnN0YWJzICJ1bnNpZ25lZCBpbnQ6dDQ9cjE7MDstMTsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIHVuc2lnbmVkIGludDp0NT1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNob3J0IGludDp0Nj1yMTstMzI3Njg7MzI3Njc7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBsb25nIGludDp0Nz1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNob3J0IHVuc2lnbmVkIGludDp0OD1yMTswOzY1NTM1OyIsMTI4LDAsMCwwCi0uc3RhYnMgImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQ6dDk9cjE7MDstMTsiLDEyOCwwLDAsMAotLnN0YWJzICJzaWduZWQgY2hhcjp0MTA9cjE7LTEyODsxMjc7IiwxMjgsMCwwLDAKLS5zdGFicyAidW5zaWduZWQgY2hhcjp0MTE9cjE7MDsyNTU7IiwxMjgsMCwwLDAKLS5zdGFicyAiZmxvYXQ6dDEyPXIxOzQ7MDsiLDEyOCwwLDAsMAotLnN0YWJzICJkb3VibGU6dDEzPXIxOzg7MDsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIGRvdWJsZTp0MTQ9cjE7ODswOyIsMTI4LDAsMCwwCi0uc3RhYnMgInZvaWQ6dDE1PTE1IiwxMjgsMCwwLDAKLS5zdGFicyAibXNnOkcxNj1hcjE7MDsxMzsyIiwzMiwwLDAsMAotCS5nbG9iYWwgbXNnCi0uc2VjdGlvbgkiLnJvZGF0YSIKLQkuYWxpZ24gOAotCS50eXBlCSBtc2csI29iamVjdAotCS5zaXplCSBtc2csMTQKLW1zZzoKLQkuYXNjaXoJImhlbGxvLCB3b3JsZCEiCi0JLmFsaWduIDgKLS5MTEMwOgotCS5hc2NpegkiJXNcbiIKLS5zZWN0aW9uCSIudGV4dCIKLQkuYWxpZ24gNAotLnN0YWJzICJtYWluOkYxIiwzNiwwLDAsbWFpbgotLnN0YWJzICJhcmdjOlAxIiw2NCwwLDAsMjQKLS5zdGFicyAiYXJndjpQMTc9KjE4PSoyIiw2NCwwLDAsMjUKLQkuZ2xvYmFsIG1haW4KLQkudHlwZQkgbWFpbiwjZnVuY3Rpb24KLQkucHJvYwkwNAotbWFpbjoKLS5zdGFibiA2OCwwLDQsLkxNMS1tYWluCi0uTE0xOgotCSEjUFJPTE9HVUUjIDAKLQlzYXZlICVzcCwtMTEyLCVzcAotCSEjUFJPTE9HVUUjIDEKLS5zdGFibiA2OCwwLDUsLkxNMi1tYWluCi0uTE0yOgotLkxMQkIyOgotCXNldGhpICVoaSguTExDMCksJW8wCi0Jb3IgJW8wLCVsbyguTExDMCksJW8wCi0Jc2V0aGkgJWhpKG1zZyksJW8xCi0JY2FsbCBwcmludGYsMAotCW9yICVvMSwlbG8obXNnKSwlbzEKLS5zdGFibiA2OCwwLDYsLkxNMy1tYWluCi0uTE0zOgotLnN0YWJuIDY4LDAsNywuTE00LW1haW4KLS5MTTQ6Ci0uTExCRTI6Ci0JcmV0Ci0JcmVzdG9yZSAlZzAsMCwlbzAKLS5MTGZlMToKLQkuc2l6ZQkgbWFpbiwuTExmZTEtbWFpbgotLnN0YWJuIDE5MiwwLDAsLkxMQkIyLW1haW4KLS5zdGFibiAyMjQsMCwwLC5MTEJFMi1tYWluCi0JLmlkZW50CSJHQ0M6IChHTlUpIGN5Z251cy0yLjMuMyIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWVhMWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jYXM6IC1BdjkKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzcGFyYzY0IGFzaQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJYzQgODAgNDAgMDAgCWxkYSAgXFsgJWcxIFxdIFwoMFwpLCAlZzIKLSAgIDQ6CWM0IDgwIDVmIGUwIAlsZGEgIFxbICVnMSBcXSBcKDI1NVwpLCAlZzIKLSAgIDg6CWM0IDgwIDQyIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVAsICVnMgotICAgYzoJYzQgODAgNDIgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUywgJWcyCi0gIDEwOgljNCA4MCA0MyAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVQX0wsICVnMgotICAxNDoJYzQgODAgNDMgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVU19MLCAlZzIKLSAgMTg6CWM0IDgwIDUwIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1AsICVnMgotICAxYzoJYzQgODAgNTAgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUywgJWcyCi0gIDIwOgljNCA4MCA1MCA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkYsICVnMgotICAyNDoJYzQgODAgNTAgNjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU05GLCAlZzIKLSAgMjg6CWM0IDgwIDUxIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BfTCwgJWcyCi0gIDJjOgljNCA4MCA1MSAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TX0wsICVnMgotICAzMDoJYzQgODAgNTEgNDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUE5GX0wsICVnMgotICAzNDoJYzQgODAgNTEgNjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU05GX0wsICVnMgotICAzODoJYzQgODAgNDIgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUCwgJWcyCi0gIDNjOgljNCA4MCA0MiAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAlZzIKLSAgNDA6CWM0IDgwIDQzIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVBfTCwgJWcyCi0gIDQ0OgljNCA4MCA0MyAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTX0wsICVnMgotICA0ODoJYzQgODAgNTAgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUCwgJWcyCi0gIDRjOgljNCA4MCA1MCAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TLCAlZzIKLSAgNTA6CWM0IDgwIDUwIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORiwgJWcyCi0gIDU0OgljNCA4MCA1MCA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkYsICVnMgotICA1ODoJYzQgODAgNTEgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUF9MLCAlZzIKLSAgNWM6CWM0IDgwIDUxIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NfTCwgJWcyCi0gIDYwOgljNCA4MCA1MSA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkZfTCwgJWcyCi0gIDY0OgljNCA4MCA1MSA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkZfTCwgJWcyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9hc2kucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZmZTljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBUZXN0IGFzaSdzLgotCS50ZXh0Ci0JbGR1d2EgWyVnMV0wLCVnMgotCWxkdXdhIFslZzFdMjU1LCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVQLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVTLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVQX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVNfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUywlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUE5GLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TTkYsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU19MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QTkZfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU05GX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfUFJJTUFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUlksJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfUFJJTUFSWV9MSVRUTEUsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX05PRkFVTFQsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1NFQ09OREFSWV9OT0ZBVUxULCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWV9OT0ZBVUxUX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX05PRkFVTFRfTElUVExFLCVnMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWVtYmFyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiNmIyZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNhczogLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgbWVtYmFyCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgk4MSA0MyBlMCAwMCAJbWVtYmFyICAwCi0gICA0Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0gICA4Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0gICBjOgk4MSA0MyBlMCA0MCAJbWVtYmFyICAjU3luYwotICAxMDoJODEgNDMgZTAgMjAgCW1lbWJhciAgI01lbUlzc3VlCi0gIDE0Ogk4MSA0MyBlMCAxMCAJbWVtYmFyICAjTG9va2FzaWRlCi0gIDE4Ogk4MSA0MyBlMCAwOCAJbWVtYmFyICAjU3RvcmVTdG9yZQotICAxYzoJODEgNDMgZTAgMDQgCW1lbWJhciAgI0xvYWRTdG9yZQotICAyMDoJODEgNDMgZTAgMDIgCW1lbWJhciAgI1N0b3JlTG9hZAotICAyNDoJODEgNDMgZTAgMDEgCW1lbWJhciAgI0xvYWRMb2FkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODA1ZTA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBUZXN0IG1lbWJhciBhcmdzCi0JLnRleHQKLQltZW1iYXIgMAotCW1lbWJhciAxMjcKLQltZW1iYXIgI1N5bmN8I01lbUlzc3VlfCNMb29rYXNpZGV8I1N0b3JlU3RvcmV8I0xvYWRTdG9yZXwjU3RvcmVMb2FkfCNMb2FkTG9hZAotCW1lbWJhciAjU3luYwotCW1lbWJhciAjTWVtSXNzdWUKLQltZW1iYXIgI0xvb2thc2lkZQotCW1lbWJhciAjU3RvcmVTdG9yZQotCW1lbWJhciAjTG9hZFN0b3JlCi0JbWVtYmFyICNTdG9yZUxvYWQKLQltZW1iYXIgI0xvYWRMb2FkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtLTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM1ZTQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotISBUZXN0IGFyY2hpdGVjdHVyZSBtaXNtYXRjaCB3YXJuaW5ncy4KLSEgV2UgZG9uJ3QgdGVzdCBldmVyeSBwb3NzaWJsZSBtaXNtYXRjaCwgd2UganVzdCB3YW50IHRvIGJlIHJlYXNvbmFibGUgc3VyZQotISB0aGUgbWlzbWF0Y2ggY2hlY2tpbmcgY29kZSB3b3Jrcy4KLSEKLSEgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBzcGFyYyotKi0qIH0gfQotISB7IGRnLW9wdGlvbnMgLUF2NiB9Ci0KLSEgc3BhcmNsaXRlCi0KLQlkaXZzY2MgJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHxzcGFyY2xpdGUiICJzcGFyY2xpdGUgZGl2c2NjIG1pc21hdGNoIiB9Ci0KLQlzY2FuICVnMSwlZzIsJWczCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8c3BhcmNsaXRlIiAic3BhcmNsaXRlIHNjYW4gbWlzbWF0Y2giIH0KLQotISB2OQotCi0JbW92cnogJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHx2OSIgInY5IGZwIHJlZyBtaXNtYXRjaCIgfQotCi0hIHY5YQotCi0Jc2h1dGRvd24JCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8djlhIiAidjlhIHNodXRkb3duIG1pc21hdGNoIiB9Ci0KLWZvbzoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4OWRlMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtYXRjaC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIFRlc3QgYXJjaGl0ZWN0dXJlIG1pc21hdGNoIGVycm9ycy4KLSMKLSMgR0FTIGlzc3VlcyB0d28gbGluZXMgb2YgZXJyb3IgdGV4dCBmb3IgZWFjaCBtaXNtYXRjaDoKLSMKLSMgbW0tbGl0ZS5zOjc6IEVycm9yOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggb24gImRpdnNjYyIuCi0jIG1tLWxpdGUuczo3OiAgKFJlcXVpcmVzIHNwYXJjbGl0ZTsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyB2OC4pCi0jCi0jIFRoZSBzdWdnZXN0ZWQgcmVnZXhwIGFyZ3VtZW50IHRvIGRnLWVycm9yIGlzICJtaXNtYXRjaHw8YXJjaD4iLgotCi1pZiBbaXN0YXJnZXQgc3BhcmMqLSotKl0gewotCi0gICAgbG9hZF9saWIgZ2FzLWRnLmV4cAotCi0gICAgZGctaW5pdAotCi0gICAgZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyL21pc20tKi5zXV0gIiIgIiIKLQotICAgIGRnLWZpbmlzaAotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2guZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmNDIxNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgcHJlZmV0Y2gKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPC50ZXh0PjoKLSAgIDA6CWMxIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjbl9yZWFkcwotICAgNDoJZmYgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sIDMxCi0gICA4OgljMSA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgI25fcmVhZHMKLSAgIGM6CWMzIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjb25lX3JlYWQKLSAgMTA6CWM1IDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjbl93cml0ZXMKLSAgMTQ6CWM3IDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjb25lX3dyaXRlCi0gIDE4OgljMSBlOCA0MiAwMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gI0FTSV9BSVVQLCAjbl9yZWFkcwotICAxYzoJZmYgZTggNjAgMDAgCXByZWZldGNoYSAgXFsgJWcxIFxdICVhc2ksIDMxCi0gIDIwOgljMSBlOCA0MiAyMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAjbl9yZWFkcwotICAyNDoJYzMgZTggNjAgMDAgCXByZWZldGNoYSAgXFsgJWcxIFxdICVhc2ksICNvbmVfcmVhZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3ByZWZldGNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzY4YmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2gucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkudGV4dAotCXByZWZldGNoIFslZzFdLDAKLQlwcmVmZXRjaCBbJWcxXSwzMQotCXByZWZldGNoIFslZzFdLCNuX3JlYWRzCi0JcHJlZmV0Y2ggWyVnMV0sI29uZV9yZWFkCi0JcHJlZmV0Y2ggWyVnMV0sI25fd3JpdGVzCi0JcHJlZmV0Y2ggWyVnMV0sI29uZV93cml0ZQotCXByZWZldGNoYSBbJWcxXSNBU0lfQUlVUCwwCi0JcHJlZmV0Y2hhIFslZzFdJWFzaSwzMQotCXByZWZldGNoYSBbJWcxXSNBU0lfQUlVUywjbl9yZWFkcwotCXByZWZldGNoYSBbJWcxXSVhc2ksI29uZV9yZWFkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNmVhOWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgcmRwcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJODMgNTAgMDAgMDAgCXJkcHIgICV0cGMsICVnMQotICAgNDoJODUgNTAgNDAgMDAgCXJkcHIgICV0bnBjLCAlZzIKLSAgIDg6CTg3IDUwIDgwIDAwIAlyZHByICAldHN0YXRlLCAlZzMKLSAgIGM6CTg5IDUwIGMwIDAwIAlyZHByICAldHQsICVnNAotICAxMDoJOGIgNTEgMDAgMDAgCXJkcHIgICV0aWNrLCAlZzUKLSAgMTQ6CThkIDUxIDQwIDAwIAlyZHByICAldGJhLCAlZzYKLSAgMTg6CThmIDUxIDgwIDAwIAlyZHByICAlcHN0YXRlLCAlZzcKLSAgMWM6CTkxIDUxIGMwIDAwIAlyZHByICAldGwsICVvMAotICAyMDoJOTMgNTIgMDAgMDAgCXJkcHIgICVwaWwsICVvMQotICAyNDoJOTUgNTIgNDAgMDAgCXJkcHIgICVjd3AsICVvMgotICAyODoJOTcgNTIgODAgMDAgCXJkcHIgICVjYW5zYXZlLCAlbzMKLSAgMmM6CTk5IDUyIGMwIDAwIAlyZHByICAlY2FucmVzdG9yZSwgJW80Ci0gIDMwOgk5YiA1MyAwMCAwMCAJcmRwciAgJWNsZWFud2luLCAlbzUKLSAgMzQ6CTlkIDUzIDQwIDAwIAlyZHByICAlb3RoZXJ3aW4sICVzcAotICAzODoJOWYgNTMgODAgMDAgCXJkcHIgICV3c3RhdGUsICVvNwotICAzYzoJYTEgNTMgYzAgMDAgCXJkcHIgICVmcSwgJWwwCi0gIDQwOglhMyA1NyBjMCAwMCAJcmRwciAgJXZlciwgJWwxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDYxOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBUZXN0IHJkcHIKLQkudGV4dAotCXJkcHIgJXRwYywlZzEKLQlyZHByICV0bnBjLCVnMgotCXJkcHIgJXRzdGF0ZSwlZzMKLQlyZHByICV0dCwlZzQKLQlyZHByICV0aWNrLCVnNQotCXJkcHIgJXRiYSwlZzYKLQlyZHByICVwc3RhdGUsJWc3Ci0JcmRwciAldGwsJW8wCi0JcmRwciAlcGlsLCVvMQotCXJkcHIgJWN3cCwlbzIKLQlyZHByICVjYW5zYXZlLCVvMwotCXJkcHIgJWNhbnJlc3RvcmUsJW80Ci0JcmRwciAlY2xlYW53aW4sJW81Ci0JcmRwciAlb3RoZXJ3aW4sJW82Ci0JcmRwciAld3N0YXRlLCVvNwotCXJkcHIgJWZxLCVsMAotCXJkcHIgJXZlciwlbDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0MGQwYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZWxvYzY0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCByZWxvYzY0Ci0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxmb28+OgotICAgMDoJMDMgMDQgOGQgMTUgCXNldGhpICAlaGlcKDB4MTIzNDU0MDBcKSwgJWcxCi0gICA0Ogk4MiAxMCA2MiA3OCAJb3IgICVnMSwgMHgyNzgsICVnMS4qCi0gICA4OgkwMSAwMCAwMCAwMCAJbm9wIAotICAgYzoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCWM6IFJfU1BBUkNfSEgyMgkudGV4dAotICAxMDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkxMDogUl9TUEFSQ19ITTEwCS50ZXh0Ci0gIDE0OgkwMSAwMCAwMCAwMCAJbm9wIAotICAxODoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCTE4OiBSX1NQQVJDX0hIMjIJLnRleHRcKzB4MTIzNDU2NzgwMDAwMDAwMAotICAxYzoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkxYzogUl9TUEFSQ19ITTEwCS50ZXh0XCsweDEyMzQ1Njc4MDAwMDAwMDAKLSAgMjA6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDI0OgkwMyAzZiBiNyAyZSAJc2V0aGkgICVoaVwoMHhmZWRjYjgwMFwpLCAlZzEKLSAgMjg6CTgyIDEwIDYyIDk4IAlvciAgJWcxLCAweDI5OCwgJWcxLioKLSAgMmM6CTA1IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMgotICAzMDoJODQgMTAgNjIgMTAgCW9yICAlZzEsIDB4MjEwLCAlZzIKLSAgMzQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDM4OgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJMzg6IFJfU1BBUkNfSEgyMgkudGV4dAotICAzYzoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkzYzogUl9TUEFSQ19ITTEwCS50ZXh0Ci0gIDQwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJNDA6IFJfU1BBUkNfTE0yMgkudGV4dAotICA0NDoJODQgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzIKLQkJCTQ0OiBSX1NQQVJDX0xPMTAJLnRleHQKLSAgNDg6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDRjOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJNGM6IFJfU1BBUkNfSEgyMgkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDUwOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTUwOiBSX1NQQVJDX0hNMTAJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1NDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzIKLQkJCTU0OiBSX1NQQVJDX0xNMjIJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1ODoJODQgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzIKLQkJCTU4OiBSX1NQQVJDX0xPMTAJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgNjA6CTAzIDJhIDYxIGQ5IAlzZXRoaSAgJWhpXCgweGE5ODc2NDAwXCksICVnMQotICA2NDoJODIgMTAgNjEgNDMgCW9yICAlZzEsIDB4MTQzLCAlZzEuKgotICA2ODoJODIgMTAgNjIgMTAgCW9yICAlZzEsIDB4MjEwLCAlZzEKLSAgNmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDcwOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJNzA6IFJfU1BBUkNfSDQ0CS50ZXh0Ci0gIDc0Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTc0OiBSX1NQQVJDX000NAkudGV4dAotICA3ODoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEKLQkJCTc4OiBSX1NQQVJDX0w0NAkudGV4dAotICA3YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgODA6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk4MDogUl9TUEFSQ19INDQJLnRleHRcKzB4YTk4NzY1NDMyMTAKLSAgODQ6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgotCQkJODQ6IFJfU1BBUkNfTTQ0CS50ZXh0XCsweGE5ODc2NTQzMjEwCi0gIDg4Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQotCQkJODg6IFJfU1BBUkNfTDQ0CS50ZXh0XCsweGE5ODc2NTQzMjEwCi0gIDhjOgkwMSAwMCAwMCAwMCAJbm9wIAotICA5MDoJMDMgMjIgNmEgZjMgCXNldGhpICAlaGlcKDB4ODlhYmNjMDBcKSwgJWcxCi0gIDk0Ogk4MiAxOCA3ZSAxMCAJeG9yICAlZzEsIC00OTYsICVnMQotICA5ODoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgOWM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk5YzogUl9TUEFSQ19ISVgyMgkudGV4dAotICBhMDoJODIgMTggNjAgMDAgCXhvciAgJWcxLCAwLCAlZzEKLQkJCWEwOiBSX1NQQVJDX0xPWDEwCS50ZXh0Ci0gIGE0OgkwMSAwMCAwMCAwMCAJbm9wIAotICBhODoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCWE4OiBSX1NQQVJDX0hJWDIyCS50ZXh0XCsweGZmZmZmZmZmNzY1NDMyMTAKLSAgYWM6CTgyIDE4IDYwIDAwIAl4b3IgICVnMSwgMCwgJWcxCi0JCQlhYzogUl9TUEFSQ19MT1gxMAkudGV4dFwrMHhmZmZmZmZmZjc2NTQzMjEwCi0gIGIwOgkwMSAwMCAwMCAwMCAJbm9wIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFkNmFmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQucworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgc3BhcmM2NCBzcGVjaWFsIHJlbG9jcwotCi1mb286Ci0Jc2V0aGkgJXVoaSgweDEyMzQ1Njc4MDAwMDAwMDApLCVnMQotCW9yICVnMSwldWxvKDB4MTIzNDU2NzgwMDAwMDAwMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJXVoaShmb28pLCVnMQotCW9yICVnMSwldWxvKGZvbyksJWcxCi0Jbm9wCi0Jc2V0aGkgJXVoaShmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlvciAlZzEsJXVsbyhmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlub3AKLQlzZXRoaSAlaGgoMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWhtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jc2V0aGkgJWxtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jb3IgJWcxLCVsbygweGZlZGNiYTk4NzY1NDMyMTApLCVnMgotCW5vcAotCXNldGhpICVoaChmb28pLCVnMQotCW9yICVnMSwlaG0oZm9vKSwlZzEKLQlzZXRoaSAlbG0oZm9vKSwlZzIKLQlvciAlZzEsJWxvKGZvbyksJWcyCi0Jbm9wCi0Jc2V0aGkgJWhoKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlaG0oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jc2V0aGkgJWxtKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMgotCW9yICVnMSwlbG8oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jbm9wCi0Jc2V0aGkgJWg0NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJW00NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWw0NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlub3AKLQlzZXRoaSAlaDQ0KGZvbyksJWcxCi0Jb3IgJWcxLCVtNDQoZm9vKSwlZzEKLQlvciAlZzEsJWw0NChmb28pLCVnMQotCW5vcAotCXNldGhpICVoNDQoZm9vKzB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbTQ0KGZvbysweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWw0NChmb28rMHhhOTg3NjU0MzIxMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJWhpeCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCXhvciAlZzEsJWxveCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCW5vcAotCXNldGhpICVoaXgoZm9vKSwlZzEKLQl4b3IgJWcxLCVsb3goZm9vKSwlZzEKLQlub3AKLQlzZXRoaSAlaGl4KGZvbysweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCXhvciAlZzEsJWxveChmb28rMHhmZmZmZmZmZjc2NTQzMjEwKSwlZzEKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTYwMjNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgc2V0NjQKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPGZvbz46Ci0gICAwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJMDogUl9TUEFSQ19ISTIyCS50ZXh0Ci0gICA0Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KLQkJCTQ6IFJfU1BBUkNfTE8xMAkudGV4dAotICAgODoJMDcgMWQgOTUgMGMgCXNldGhpICAlaGlcKDB4NzY1NDMwMDBcKSwgJWczCi0gICBjOgk4NiAxMCBlMiAxMCAJb3IgICVnMywgMHgyMTAsICVnMwkhIDc2NTQzMjEwIDwoXCpBQlNcKnxmb28pXCsoMHh8KTB4NzY1NDMyMTA+Ci0gIDEwOgk4OCAxMCAyMCAwMCAJY2xyICAlZzQKLSAgMTQ6CTBiIDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWc1Ci0gIDE4Ogk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQkhIGZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpZmZmZj4KLSAgMWM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQkxYzogUl9TUEFSQ19ISDIyCS50ZXh0Ci0gIDIwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJMjA6IFJfU1BBUkNfTE0yMgkudGV4dAotICAyNDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEKLQkJCTI0OiBSX1NQQVJDX0hNMTAJLnRleHQKLSAgMjg6CTg0IDEwIGEwIDAwIAltb3YgICVnMiwgJWcyCi0JCQkyODogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gIDJjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgMzA6CTg0IDEwIDgwIDAxIAlvciAgJWcyLCAlZzEsICVnMgotICAzNDoJODYgMTAgM2YgZmYgCW1vdiAgLTEsICVnMwotICAzODoJODYgMTAgMjAgMDAgCWNsciAgJWczCi0gIDNjOgk4NiAxMCAyMCAwMSAJbW92ICAxLCAlZzMKLSAgNDA6CTg2IDEwIDJmIGZmIAltb3YgIDB4ZmZmLCAlZzMKLSAgNDQ6CTA3IDAwIDAwIDA0IAlzZXRoaSAgJWhpXCgweDEwMDBcKSwgJWczCi0gIDQ4Ogk4NiAxMCAzMCAwMCAJbW92ICAtNDA5NiwgJWczCi0gIDRjOgkwNyAwMCAwMCAwNCAJc2V0aGkgICVoaVwoMHgxMDAwXCksICVnMwotICA1MDoJODYgMTggZmYgZmYgCXhvciAgJWczLCAtMSwgJWczCi0gIDU0OgkwNyAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnMwotICA1ODoJODYgMTAgZTMgZmYgCW9yICAlZzMsIDB4M2ZmLCAlZzMJISBmZmZmIDwoXCpBQlNcKnxmb28pXCsoMHh8KWZmZmY+Ci0gIDVjOgkwNyAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnMwotICA2MDoJODYgMTggZmMgMDAgCXhvciAgJWczLCAtMTAyNCwgJWczCi0gIDY0OgkwOSAxZiBmZiBmZiAJc2V0aGkgICVoaVwoMHg3ZmZmZmMwMFwpLCAlZzQKLSAgNjg6CTg4IDExIDIzIGZmIAlvciAgJWc0LCAweDNmZiwgJWc0CSEgN2ZmZmZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpN2ZmZmZmZmY+Ci0gIDZjOgkwOSAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzQKLSAgNzA6CTA5IDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnNAotICA3NDoJODggMTkgM2MgMDAgCXhvciAgJWc0LCAtMTAyNCwgJWc0Ci0gIDc4OgkwOSAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzQKLSAgN2M6CTg4IDE5IDNmIGZmIAl4b3IgICVnNCwgLTEsICVnNAotICA4MDoJMDkgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc0Ci0gIDg0Ogk4OCAxMSAyMyBmZiAJb3IgICVnNCwgMHgzZmYsICVnNAkhIGZmZmZmZmZmIDwoXCpBQlNcKnxmb28pXCsoMHh8KWZmZmZmZmZmPgotICA4ODoJODggMTAgMjAgMDEgCW1vdiAgMSwgJWc0Ci0gIDhjOgk4OSAyOSAzMCAyMCAJc2xseCAgJWc0LCAweDIwLCAlZzQKLSAgOTA6CTAzIDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnMQotICA5NDoJMGIgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc1Ci0gIDk4Ogk4MiAxMCA2MyBmZiAJb3IgICVnMSwgMHgzZmYsICVnMQotICA5YzoJOGEgMTEgNjMgZmYgCW9yICAlZzUsIDB4M2ZmLCAlZzUKLSAgYTA6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICBhNDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gIGE4OgkwYiAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzUKLSAgYWM6CThiIDI5IDcwIDIwIAlzbGx4ICAlZzUsIDB4MjAsICVnNQotICBiMDoJMGIgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc1Ci0gIGI0Ogk4YSAxOSA3YyAwMCAJeG9yICAlZzUsIC0xMDI0LCAlZzUKLSAgYjg6CTBiIDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnNQotICBiYzoJOGEgMTkgN2MgMDAgCXhvciAgJWc1LCAtMTAyNCwgJWc1Ci0gIGMwOgkwMyAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzEKLSAgYzQ6CTBiIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnNQotICBjODoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gIGNjOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAgZDA6CTAzIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnMQotICBkNDoJOGEgMTAgMjAgMDEgCW1vdiAgMSwgJWc1Ci0gIGQ4Ogk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgZGM6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotICBlMDoJMGIgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWc1Ci0gIGU0Ogk4MiAxMCAyMCAwMSAJbW92ICAxLCAlZzEKLSAgZTg6CThhIDExIDYwIDAxIAlvciAgJWc1LCAxLCAlZzUKLSAgZWM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICBmMDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gIGY0OgkwYiAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzUKLSAgZjg6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQotICBmYzoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gMTAwOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAxMDQ6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQotIDEwODoJOGEgMTAgMjAgMDEgCW1vdiAgMSwgJWc1Ci0gMTBjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAxMTA6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotIDExNDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzIKLQkJCTExNDogUl9TUEFSQ19ISTIyCS50ZXh0Ci0gMTE4Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KLQkJCTExODogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gMTFjOgkwNyAxZCA5NSAwYyAJc2V0aGkgICVoaVwoMHg3NjU0MzAwMFwpLCAlZzMKLSAxMjA6CTg2IDEwIGUyIDEwIAlvciAgJWczLCAweDIxMCwgJWczCSEgNzY1NDMyMTAgPChcKkFCU1wqfGZvbylcKzB4NzY1NDMyMTA+Ci0gMTI0Ogk4OCAxMCAyMCAwMCAJY2xyICAlZzQKLSAxMjg6CTBiIDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWc1Ci0gMTJjOgk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQkhIGZmZmYgPChcKkFCU1wqfGZvbylcKzB4ZmZmZj4KLSAxMzA6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcyCi0JCQkxMzA6IFJfU1BBUkNfSEkyMgkudGV4dAotIDEzNDoJODQgMTAgYTAgMDAgCW1vdiAgJWcyLCAlZzIJISAwIDxmb28+Ci0JCQkxMzQ6IFJfU1BBUkNfTE8xMAkudGV4dAotIDEzODoJODUgMzggODAgMDAgCXNpZ254ICAlZzIKLSAxM2M6CTA3IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMwotIDE0MDoJODYgMTAgZTIgMTAgCW9yICAlZzMsIDB4MjEwLCAlZzMJISA3NjU0MzIxMCA8KFwqQUJTXCp8Zm9vKVwrMHg3NjU0MzIxMD4KLSAxNDQ6CTg4IDEwIDIwIDAwIAljbHIgICVnNAotIDE0ODoJMGIgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzUKLSAxNGM6CThhIDExIDYzIGZmIAlvciAgJWc1LCAweDNmZiwgJWc1CSEgZmZmZiA8KFwqQUJTXCp8Zm9vKVwrMHhmZmZmPgotIDE1MDoJODIgMTAgM2YgZmYgCW1vdiAgLTEsICVnMQotIDE1NDoJMDUgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWcyCi0gMTU4Ogk4NCAxMCBhMyBmZiAJb3IgICVnMiwgMHgzZmYsICVnMgkhIDdmZmZmZmZmIDwoXCpBQlNcKnxmb28pXCsweDdmZmZmZmZmPgotIDE1YzoJMDcgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzMKLSAxNjA6CTg2IDE4IGZjIDAwIAl4b3IgICVnMywgLTEwMjQsICVnMwotIDE2NDoJODggMTAgM2YgZmYgCW1vdiAgLTEsICVnNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTAzNmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMgc3BhcmM2NCBzZXQgaW5zbiBoYW5kbGluZyAoaW5jbHVkZXMgc2V0LCBzZXR1dywgc2V0c3csIHNldHgpCi0KLWZvbzoKLQlzZXQgZm9vLCVnMgotCXNldCAweDc2NTQzMjEwLCVnMwotCXNldCAwLCVnNAotCXNldCA2NTUzNSwlZzUKLQotCXNldHggZm9vLCVnMSwlZzIKLQotCXNldHggLTEsJWcxLCVnMwotCXNldHggMCwlZzEsJWczCi0Jc2V0eCAxLCVnMSwlZzMKLQlzZXR4IDQwOTUsJWcxLCVnMwotCXNldHggNDA5NiwlZzEsJWczCi0Jc2V0eCAtNDA5NiwlZzEsJWczCi0Jc2V0eCAtNDA5NywlZzEsJWczCi0Jc2V0eCA2NTUzNSwlZzEsJWczCi0Jc2V0eCAtNjU1MzYsJWcxLCVnMwotCi0Jc2V0eCAyMTQ3NDgzNjQ3LCVnMSwlZzQKLQlzZXR4IDIxNDc0ODM2NDgsJWcxLCVnNAotCXNldHggLTIxNDc0ODM2NDgsJWcxLCVnNAotCXNldHggLTIxNDc0ODM2NDksJWcxLCVnNAotCXNldHggNDI5NDk2NzI5NSwlZzEsJWc0Ci0Jc2V0eCA0Mjk0OTY3Mjk2LCVnMSwlZzQKLQotISBHQVMgZG9lc24ndCBoYW5kbGUgbGFyZ2UgYmFzZTEwIG51bWJlcnMgeWV0LgotIQlzZXR4IDkyMjMzNzIwMzY4NTQ3NzU4MDcsJWcxLCVnNQotIQlzZXR4IDkyMjMzNzIwMzY4NTQ3NzU4MDgsJWcxLCVnNQotIQlzZXR4IC05MjIzMzcyMDM2ODU0Nzc1ODA4LCVnMSwlZzUKLSEJc2V0eCAtOTIyMzM3MjAzNjg1NDc3NTgwOSwlZzEsJWc1Ci0KLQlzZXR4IDB4N2ZmZmZmZmZmZmZmZmZmZiwlZzEsJWc1Ci0Jc2V0eCAweDgwMDAwMDAwMDAwMDAwMDAsJWcxLCVnNQkJISB0ZXN0IG9ubHkgaGgyMiBuZWVkZWQKLQlzZXR4IDB4ZmZmZmZmZmYwMDAwMDAwMCwlZzEsJWc1CQkhIHRlc3Qgb25seSBobTEwIG5lZWRlZAotCXNldHggMHhmZmZmZmZmZjgwMDAwMDAwLCVnMSwlZzUJCSEgdGVzdCBzaWduLWV4dCBvZiBsb3dlciAzMgotCXNldHggMHhmZmZmMDAwMGZmZmYwMDAwLCVnMSwlZzUJCSEgdGVzdCBoaDIyLGhpMjIKLQlzZXR4IDB4ZmZmZjAwMDAwMDAwMDAwMSwlZzEsJWc1CQkhIHRlc3QgaGgyMixsbzEwCi0Jc2V0eCAweDAwMDAwMDAxZmZmZjAwMDEsJWcxLCVnNQkJISB0ZXN0IGhtMTAsaGkyMixsbzEwCi0Jc2V0eCAweDAwMDAwMDAxZmZmZjAwMDAsJWcxLCVnNQkJISB0ZXN0IGhtMTAsaGkyMgotCXNldHggMHgwMDAwMDAwMTAwMDAwMDAxLCVnMSwlZzUJCSEgdGVzdCBobTEwLGxvMTAKLQotCXNldHV3IGZvbywlZzIKLQlzZXR1dyAweDc2NTQzMjEwLCVnMwotCXNldHV3IDAsJWc0Ci0Jc2V0dXcgNjU1MzUsJWc1Ci0KLQlzZXRzdyBmb28sJWcyCi0Jc2V0c3cgMHg3NjU0MzIxMCwlZzMKLQlzZXRzdyAwLCVnNAotCXNldHN3IDY1NTM1LCVnNQotCXNldHN3IDB4ZmZmZmZmZmYsJWcxCi0Jc2V0c3cgMHg3ZmZmZmZmZiwlZzIKLQlzZXRzdyAweGZmZmYwMDAwLCVnMwotCXNldHN3IC0xLCVnNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BhcmMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BhcmMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2RjYWFhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwYXJjLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgU29tZSBnZW5lcmljIFNQQVJDIGFuZCBTUEFSQzY0IHRlc3RzCi0KLSMgRklYTUU6IFRoZSB0ZXN0cyBoZXJlIGFyZW4ndCByZWFsbHkgYnVsbGV0IHByb29mLiAgQSBtaXN0YWtlIGluIHRoZSBvcGNvZGUKLSMgdGFibGUgY2FuIHNsaXAgdGhyb3VnaCBzaW5jZSB3ZSB1c2UgdGhlIHNhbWUgdGFibGUgZm9yIGFzc2VtYmx5IGFuZAotIyBkaXNhc3NlbWJseS4gIFRoZSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gaW5jbHVkZSBhIGhleCBkdW1wIG9mIHRoZSBpbnNucwotIyBhbmQgdGVzdCB0aGF0IGFzIHdlbGwuICBMYXRlci4KLQotIyBGaW5kIG91dCBpZiB0aGVzZSBiaW51dGlscyBhcmUgZWl0aGVyIHNwYXJjNjQqLSotKiBvcgotIyBzcGFyYyotKi0qIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1zcGFyYzY0LSotKgotcHJvYyBnYXNfNjRfY2hlY2sgeyB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLQotICAgIGNhdGNoICJleGVjICRzcmNkaXIvbGliL3J1biAkTk0gJE5NRkxBR1MgLS1oZWxwIiBubV9oZWxwCi0gICAgcmV0dXJuIFtyZWdleHAgImVsZjY0XFtfLVxdc3BhcmMiICRubV9oZWxwXTsKLX0KLQotaWYgW2lzdGFyZ2V0IHNwYXJjKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJzeW50aCIKLSAgICBpZiBbZ2FzXzY0X2NoZWNrXSB7Ci0JcnVuX2R1bXBfdGVzdCAiYXNpIgotCXJ1bl9kdW1wX3Rlc3QgIm1lbWJhciIKLQlydW5fZHVtcF90ZXN0ICJwcmVmZXRjaCIKLQlydW5fZHVtcF90ZXN0ICJzZXQ2NCIKLQlydW5fZHVtcF90ZXN0ICJzeW50aDY0IgotCXJ1bl9kdW1wX3Rlc3QgInJkcHIiCi0JcnVuX2R1bXBfdGVzdCAid3JwciIKLQlydW5fZHVtcF90ZXN0ICJyZWxvYzY0IgotICAgIH0KLX0KLQotaWYgW2lzdGFyZ2V0IHNwYXJjbGV0Ki0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJzcGxldCIKLSAgICBydW5fZHVtcF90ZXN0ICJzcGxldC0yIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU1NTM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIuZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNhczogLUFzcGFyY2xldAotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxzdGFydD46Ci0gICAwOgk4MSBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY3NyCi0gICA0Ogk4MyBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2ZyCi0gICA4Ogk4NSBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2NyY3IKLSAgIGM6CTg3IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjcHIKLSAgMTA6CTg5IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjc3IyCi0gIDE0Ogk4YiBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2NycgotICAxODoJOGQgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2Nyc3RyCi0gIDFjOgk4MyBiMCAwMSAwMCAJY3JkY3h0ICAlY2NzciwgJWcxCi0gIDIwOgk4MyBiMCA0MSAwMCAJY3JkY3h0ICAlY2NmciwgJWcxCi0gIDI0Ogk4MyBiMCA4MSAwMCAJY3JkY3h0ICAlY2NjcmNyLCAlZzEKLSAgMjg6CTgzIGIwIGMxIDAwIAljcmRjeHQgICVjY3ByLCAlZzEKLSAgMmM6CTgzIGIxIDAxIDAwIAljcmRjeHQgICVjY3NyMiwgJWcxCi0gIDMwOgk4MyBiMSA0MSAwMCAJY3JkY3h0ICAlY2NjcnIsICVnMQotICAzNDoJODMgYjEgODEgMDAgCWNyZGN4dCAgJWNjcnN0ciwgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzQ0OTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotISBUZXN0IHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycy4KLQotCS50ZXh0Ci0JLmdsb2JhbCBzdGFydAotc3RhcnQ6Ci0KLQljd3JjeHQgICAgJWcxLCVjY3NyCi0JY3dyY3h0ICAgICVnMSwlY2NmcgotCWN3cmN4dCAgICAlZzEsJWNjY3JjcgotCWN3cmN4dCAgICAlZzEsJWNjcHIKLQljd3JjeHQgICAgJWcxLCVjY3NyMgotCWN3cmN4dCAgICAlZzEsJWNjY3JyCi0JY3dyY3h0ICAgICVnMSwlY2Nyc3RyCi0KLQljcmRjeHQgICAgJWNjc3IsJWcxCi0JY3JkY3h0ICAgICVjY2ZyLCVnMQotCWNyZGN4dCAgICAlY2NjcmNyLCVnMQotCWNyZGN4dCAgICAlY2NwciwlZzEKLQljcmRjeHQgICAgJWNjc3IyLCVnMQotCWNyZGN4dCAgICAlY2NjcnIsJWcxCi0JY3JkY3h0ICAgICVjY3JzdHIsJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjMGEyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSNhczogLUFzcGFyY2xldAotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjbGV0IGV4dGVuc2lvbnMKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8c3RhcnQ+OgotICAgMDoJYTEgNDAgMDAgMDAgCXJkICAleSwgJWwwCi0gICA0OglhMSA0MCA0MCAwMCAJcmQgICVhc3IxLCAlbDAKLSAgIDg6CWExIDQzIGMwIDAwIAlyZCAgJWFzcjE1LCAlbDAKLSAgIGM6CWExIDQ0IDQwIDAwIAlyZCAgJWFzcjE3LCAlbDAKLSAgMTA6CWExIDQ0IDgwIDAwIAlyZCAgJWFzcjE4LCAlbDAKLSAgMTQ6CWExIDQ0IGMwIDAwIAlyZCAgJWFzcjE5LCAlbDAKLSAgMTg6CWExIDQ1IDAwIDAwIAlyZCAgJWFzcjIwLCAlbDAKLSAgMWM6CWExIDQ1IDQwIDAwIAlyZCAgJWFzcjIxLCAlbDAKLSAgMjA6CWExIDQ1IDgwIDAwIAlyZCAgJWFzcjIyLCAlbDAKLSAgMjQ6CTgxIDg0IDIwIDAwIAltb3YgICVsMCwgJXkKLSAgMjg6CTgzIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjEKLSAgMmM6CTlmIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE1Ci0gIDMwOglhMyA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IxNwotICAzNDoJYTUgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMTgKLSAgMzg6CWE3IDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE5Ci0gIDNjOglhOSA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IyMAotICA0MDoJYWIgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMjEKLSAgNDQ6CWFkIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjIyCi0KLTArNDggPHRlc3RfdW11bD46Ci0gIDQ4Ogk4NiA1MCA0MCAwMiAJdW11bCAgJWcxLCAlZzIsICVnMwotICA0YzoJODYgNTAgNDAgMDIgCXVtdWwgICVnMSwgJWcyLCAlZzMKLQotMCs1MCA8dGVzdF9zbXVsPjoKLSAgNTA6CTg2IDU4IDQwIDAyIAlzbXVsICAlZzEsICVnMiwgJWczCi0gIDU0Ogk4NiA1OCA0MCAwMiAJc211bCAgJWcxLCAlZzIsICVnMwotCi0wKzU4IDx0ZXN0X3N0YmFyPjoKLSAgNTg6CTgxIDQzIGMwIDAwIAlzdGJhciAKLSAgNWM6CTgxIDQzIGMwIDAwIAlzdGJhciAKLSAgNjA6CTAwIDAwIDAwIDAxIAl1bmltcCAgMHgxCi0gIDY0Ogk4MSBkYyA0MCAwMCAJZmx1c2ggICVsMQotCi0wKzY4IDx0ZXN0X3NjYW4+OgotICA2ODoJYTcgNjQgN2YgZmYgCXNjYW4gICVsMSwgLTEsICVsMwotICA2YzoJYTcgNjQgNjAgMDAgCXNjYW4gICVsMSwgMCwgJWwzCi0gIDcwOglhNyA2NCA0MCAxMSAJc2NhbiAgJWwxLCAlbDEsICVsMwotCi0wKzc0IDx0ZXN0X3NodWZmbGU+OgotICA3NDoJYTMgNmMgMjAgMDEgCXNodWZmbGUgICVsMCwgMSwgJWwxCi0gIDc4OglhMyA2YyAyMCAwMiAJc2h1ZmZsZSAgJWwwLCAyLCAlbDEKLSAgN2M6CWEzIDZjIDIwIDA0IAlzaHVmZmxlICAlbDAsIDQsICVsMQotICA4MDoJYTMgNmMgMjAgMDggCXNodWZmbGUgICVsMCwgOCwgJWwxCi0gIDg0OglhMyA2YyAyMCAxMCAJc2h1ZmZsZSAgJWwwLCAweDEwLCAlbDEKLSAgODg6CWEzIDZjIDIwIDE4IAlzaHVmZmxlICAlbDAsIDB4MTgsICVsMQotCi0wKzhjIDx0ZXN0X3VtYWM+OgotICA4YzoJYTEgZjQgNDAgMTIgCXVtYWMgICVsMSwgJWwyLCAlbDAKLSAgOTA6CWExIGY0IDYwIDAyIAl1bWFjICAlbDEsIDIsICVsMAotICA5NDoJYTEgZjQgNjAgMDIgCXVtYWMgICVsMSwgMiwgJWwwCi0KLTArOTggPHRlc3RfdW1hY2Q+OgotICA5ODoJYTEgNzQgODAgMTQgCXVtYWNkICAlbDIsICVsNCwgJWwwCi0gIDljOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCi0gIGEwOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCi0KLTArYTQgPHRlc3Rfc21hYz46Ci0gIGE0OglhMSBmYyA0MCAxMiAJc21hYyAgJWwxLCAlbDIsICVsMAotICBhODoJYTEgZmMgN2YgZDYgCXNtYWMgICVsMSwgLTQyLCAlbDAKLSAgYWM6CWExIGZjIDdmIGQ2IAlzbWFjICAlbDEsIC00MiwgJWwwCi0KLTArYjAgPHRlc3Rfc21hY2Q+OgotICBiMDoJYTEgN2MgODAgMTQgCXNtYWNkICAlbDIsICVsNCwgJWwwCi0gIGI0OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCi0gIGI4OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCi0KLTArYmMgPHRlc3RfdW11bGQ+OgotICBiYzoJOTAgNGEgODAgMGMgCXVtdWxkICAlbzIsICVvNCwgJW8wCi0gIGMwOgk5MCA0YSBhMiAzNCAJdW11bGQgICVvMiwgMHgyMzQsICVvMAotICBjNDoJOTAgNGEgYTUgNjcgCXVtdWxkICAlbzIsIDB4NTY3LCAlbzAKLQotMCtjOCA8dGVzdF9zbXVsZD46Ci0gIGM4OgliMCA2ZSA4MCAxYyAJc211bGQgICVpMiwgJWk0LCAlaTAKLSAgY2M6CWIwIDZlIGIwIDAwIAlzbXVsZCAgJWkyLCAtNDA5NiwgJWkwCi0gIGQwOgliMCA2ZiAyZiBmZiAJc211bGQgICVpNCwgMHhmZmYsICVpMAotCi0wK2Q0IDx0ZXN0X2NvcHJvY2Vzc29yPjoKLSAgZDQ6CTgxIGI0IDAwIDExIAljcHVzaCAgJWwwLCAlbDEKLSAgZDg6CTgxIGI0IDIwIDAxIAljcHVzaCAgJWwwLCAxCi0gIGRjOgk4MSBiNCAwMCA1MSAJY3B1c2hhICAlbDAsICVsMQotICBlMDoJODEgYjQgMjAgNDEgCWNwdXNoYSAgJWwwLCAxCi0gIGU0OglhMSBiMCAwMCA4MCAJY3B1bGwgICVsMAotICBlODoJYTEgYjAgMDEgMDAgCWNyZGN4dCAgJWNjc3IsICVsMAotICBlYzoJYTEgYjAgNDEgMDAgCWNyZGN4dCAgJWNjZnIsICVsMAotICBmMDoJYTEgYjAgYzEgMDAgCWNyZGN4dCAgJWNjcHIsICVsMAotICBmNDoJYTEgYjAgODEgMDAgCWNyZGN4dCAgJWNjY3JjciwgJWwwCi0gIGY4Ogk4MSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3NyCi0gIGZjOgk4MyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2ZyCi0gMTAwOgk4NyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3ByCi0gMTA0Ogk4NSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2NyY3IKLSAxMDg6CTAxIGMwIDAwIDAxIAljYm4gIDEwYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkzOD4KLQkJCTEwODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWY4Ci0gMTBjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDExMDoJMjEgYzAgMDAgMDEgCWNibixhICAgMTE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTQwPgotCQkJMTEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZjAKLSAxMTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTE4OgkwMyBjMCAwMCAwMSAJY2JlICAxMWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNDg+Ci0JCQkxMTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVlOAotIDExYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMjA6CTIzIGMwIDAwIDAxIAljYmUsYSAgIDEyNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk1MD4KLQkJCTEyMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZWUwCi0gMTI0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDEyODoJMDUgYzAgMDAgMDEgCWNiZiAgMTJjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTU4PgotCQkJMTI4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZDgKLSAxMmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTMwOgkyNSBjMCAwMCAwMSAJY2JmLGEgICAxMzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjA+Ci0JCQkxMzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVkMAotIDEzNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMzg6CTA3IGMwIDAwIDAxIAljYmVmICAxM2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjg+Ci0JCQkxMzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjOAotIDEzYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNDA6CTI3IGMwIDAwIDAxIAljYmVmLGEgICAxNDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNzA+Ci0JCQkxNDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjMAotIDE0NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNDg6CTA5IGMwIDAwIDAxIAljYnIgIDE0YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk3OD4KLQkJCTE0ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWI4Ci0gMTRjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE1MDoJMjkgYzAgMDAgMDEgCWNicixhICAgMTU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTgwPgotCQkJMTUwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYjAKLSAxNTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTU4OgkwYiBjMCAwMCAwMSAJY2JlciAgMTVjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTg4PgotCQkJMTU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTgKLSAxNWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTYwOgkyYiBjMCAwMCAwMSAJY2JlcixhICAgMTY0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTkwPgotCQkJMTYwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTAKLSAxNjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTY4OgkwZCBjMCAwMCAwMSAJY2JmciAgMTZjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTk4PgotCQkJMTY4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTgKLSAxNmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTcwOgkyZCBjMCAwMCAwMSAJY2JmcixhICAgMTc0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWEwPgotCQkJMTcwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTAKLSAxNzQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTc4OgkwZiBjMCAwMCAwMSAJY2JlZnIgIDE3YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fClhOD4KLQkJCTE3ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTg4Ci0gMTdjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE4MDoJMmYgYzAgMDAgMDEgCWNiZWZyLGEgICAxODQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYjA+Ci0JCQkxODA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU4MAotIDE4NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxODg6CTExIGMwIDAwIDAxIAljYmEgIDE4YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCliOD4KLQkJCTE4ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTc4Ci0gMThjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE5MDoJMzEgYzAgMDAgMDEgCWNiYSxhICAgMTk0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWMwPgotCQkJMTkwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNzAKLSAxOTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTk4OgkxMyBjMCAwMCAwMSAJY2JuZSAgMTljIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWM4PgotCQkJMTk4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjgKLSAxOWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWEwOgkzMyBjMCAwMCAwMSAJY2JuZSxhICAgMWE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQwPgotCQkJMWEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjAKLSAxYTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWE4OgkxNSBjMCAwMCAwMSAJY2JuZiAgMWFjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQ4PgotCQkJMWE4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTgKLSAxYWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWIwOgkzNSBjMCAwMCAwMSAJY2JuZixhICAgMWI0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWUwPgotCQkJMWIwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTAKLSAxYjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWI4OgkxNyBjMCAwMCAwMSAJY2JuZWYgIDFiYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCllOD4KLQkJCTFiODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTQ4Ci0gMWJjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDFjMDoJMzcgYzAgMDAgMDEgCWNibmVmLGEgICAxYzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjA+Ci0JCQkxYzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU0MAotIDFjNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYzg6CTE5IGMwIDAwIDAxIAljYm5yICAxY2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjg+Ci0JCQkxYzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUzOAotIDFjYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZDA6CTM5IGMwIDAwIDAxIAljYm5yLGEgICAxZDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTAwPgotCQkJMWQwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMzAKLSAxZDQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWQ4OgkxYiBjMCAwMCAwMSAJY2JuZXIgIDFkYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMDg+Ci0JCQkxZDg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUyOAotIDFkYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZTA6CTNiIGMwIDAwIDAxIAljYm5lcixhICAgMWU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTExMD4KLQkJCTFlMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTIwCi0gMWU0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDFlODoJMWQgYzAgMDAgMDEgCWNibmZyICAxZWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTE4PgotCQkJMWU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMTgKLSAxZWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWYwOgkzZCBjMCAwMCAwMSAJY2JuZnIsYSAgIDFmNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjA+Ci0JCQkxZjA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUxMAotIDFmNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZjg6CTFmIGMwIDAwIDAxIAljYm5lZnIgIDFmYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjg+Ci0JCQkxZjg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwOAotIDFmYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAyMDA6CTNmIGMwIDAwIDAxIAljYm5lZnIsYSAgIDIwNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMzA+Ci0JCQkyMDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwMAotIDIwNDoJMDEgMDAgMDAgMDAgCW5vcCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZkNTA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotCS50ZXh0Ci0JLmdsb2JhbCBzdGFydAotCi0hCVN0YXJ0aW5nIHBvaW50Ci1zdGFydDoKLQotIQl0ZXN0IGFsbCBBU1JzCi0KLQlyZAklYXNyMCwgJWwwCi0JcmQJJWFzcjEsICVsMAotCXJkCSVhc3IxNSwgJWwwCi0JcmQJJWFzcjE3LCAlbDAKLQlyZAklYXNyMTgsICVsMAotCXJkCSVhc3IxOSwgJWwwCSEgc2hvdWxkIHN0b3AgdGhlIHByb2Nlc3NvcgotCXJkCSVhc3IyMCwgJWwwCi0JcmQJJWFzcjIxLCAlbDAKLQlyZAklYXNyMjIsICVsMAotCi0Jd3IJJWwwLCAwLCAlYXNyMAotCXdyCSVsMCwgMCwgJWFzcjEKLQl3cgklbDAsIDAsICVhc3IxNQotCXdyCSVsMCwgMCwgJWFzcjE3Ci0Jd3IJJWwwLCAwLCAlYXNyMTgKLQl3cgklbDAsIDAsICVhc3IxOQotCXdyCSVsMCwgMCwgJWFzcjIwCi0Jd3IJJWwwLCAwLCAlYXNyMjEKLQl3cgklbDAsIDAsICVhc3IyMgotCi0hCXRlc3QgVU1VTCB3aXRoIG5vIG92ZXJmbG93IGluc2lkZSBZCi10ZXN0X3VtdWw6Ci0JdW11bAklZzEsICVnMiwgJWczCi0KLSEJdGVzdCBVTVVMIHdpdGggYW4gb3ZlcmZsb3cgaW5zaWRlIFkKLQotCXVtdWwJJWcxLCAlZzIsICVnMwkhICVnMyBtdXN0IGJlIGVxdWFsIHRvIDAKLQotIQl0ZXN0IFNNVUwgd2l0aCBuZWdhdGl2ZSByZXN1bHQKLXRlc3Rfc211bDoKLQlzbXVsCSVnMSwgJWcyLCAlZzMKLQotIQl0ZXN0IFNNVUwgd2l0aCBwb3NpdGl2ZSByZXN1bHQKLQotCXNtdWwJJWcxLCAlZzIsICVnMwotCi0hCXRlc3QgU1RCQVI6IHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3ludGF4ZXMKLXRlc3Rfc3RiYXI6Ci0Jc3RiYXIJCQkhIGlzIGEgdmFsaWQgVjggc3ludGF4LCBhdCBsZWFzdCBhIHN5bnRoZXRpYwotCQkJCSEgaW5zdHJ1Y3Rpb24KLQlyZAklYXNyMTUsICVnMAkhIG90aGVyIHNvbHV0aW9uCi0KLSEJdGVzdCBVTklNUAotCXVuaW1wCTEKLQotIQl0ZXN0IEZMVVNICi0JZmx1c2gJJWwxCQkhIGlzIHRoZSBvZmZpY2lhbCBWOCBzeW50YXgKLQotIQl0ZXN0IFNDQU46IGZpbmQgZmlyc3QgMAotdGVzdF9zY2FuOgotCXNjYW4JJWwxLCAweGZmZmZmZmZmLCAlbDMKLQotIQl0ZXN0IHNjYW46IGZpbmQgZmlyc3QgMQotCi0Jc2NhbgklbDEsIDAsICVsMwotCi0hCXRlc3Qgc2NhbjogZmluZCBmaXJzdCBiaXQgIT0gYml0LTAKLQotCXNjYW4JJWwxLCAlbDEsICVsMwotCi0hCXRlc3QgU0hVRkZMRQotdGVzdF9zaHVmZmxlOgotCXNodWZmbGUJJWwwLCAweDEsICVsMQotCXNodWZmbGUJJWwwLCAweDIsICVsMQotCXNodWZmbGUJJWwwLCAweDQsICVsMQotCXNodWZmbGUJJWwwLCAweDgsICVsMQotCXNodWZmbGUJJWwwLCAweDEwLCAlbDEKLQlzaHVmZmxlCSVsMCwgMHgxOCwgJWwxCi0KLSEJdGVzdCBVTUFDCi10ZXN0X3VtYWM6Ci0JdW1hYwklbDEsICVsMiwgJWwwCi0JdW1hYwklbDEsIDIsICVsMAotCXVtYWMJMiwgJWwxLCAlbDAKLQotIQl0ZXN0IFVNQUNECi10ZXN0X3VtYWNkOgotCXVtYWNkCSVsMiwgJWw0LCAlbDAKLQl1bWFjZAklbDIsIDMsICVsMAotCXVtYWNkCTMsICVsMiwgJWwwCi0KLSEJdGVzdCBTTUFDCi10ZXN0X3NtYWM6Ci0Jc21hYwklbDEsICVsMiwgJWwwCi0Jc21hYwklbDEsIC00MiwgJWwwCi0Jc21hYwktNDIsICVsMSwgJWwwCi0KLSEJdGVzdCBTTUFDRAotdGVzdF9zbWFjZDoKLQlzbWFjZAklbDIsICVsNCwgJWwwCi0Jc21hY2QJJWwyLCAxMjMsICVsMAotCXNtYWNkCTEyMywgJWwyLCAlbDAKLQotIQl0ZXN0IFVNVUxECi10ZXN0X3VtdWxkOgotCXVtdWxkCSVvMiwgJW80LCAlbzAKLQl1bXVsZAklbzIsIDB4MjM0LCAlbzAKLQl1bXVsZAkweDU2NywgJW8yLCAlbzAKLQotIQl0ZXN0IFNNVUxECi10ZXN0X3NtdWxkOgotCXNtdWxkCSVpMiwgJWk0LCAlaTAKLQlzbXVsZAklaTIsIC00MDk2LCAlaTAKLQlzbXVsZAk0MDk1LCAlaTQsICVpMAotCi0hCUNvcHJvY2Vzc29yIGluc3RydWN0aW9ucwotdGVzdF9jb3Byb2Nlc3NvcjoKLSEJJWNjc3IJaXMgcmVnaXN0ZXIgIyAwCi0hCSVjY2ZyCWlzIHJlZ2lzdGVyICMgMQotIQklY2NwcglpcyByZWdpc3RlciAjIDMKLSEJJWNjY3JjciBpcyByZWdpc3RlciAjIDIKLQotIQl0ZXN0IENQVVNIOiBqdXN0IHN5bnRheAotCi0JY3B1c2gJJWwwLCAlbDEKLQljcHVzaAklbDAsIDEKLQljcHVzaGEJJWwwLCAlbDEKLQljcHVzaGEJJWwwLCAxCi0KLSEJdGVzdCBDUFVMTDoganVzdCBzeW50YXgKLQotCWNwdWxsCSVsMAotCi0hCXRlc3QgQ1BSRENYVDoganVzdCBzeW50YXgKLQotCWNyZGN4dAklY2NzciwgJWwwCi0JY3JkY3h0CSVjY2ZyLCAlbDAKLQljcmRjeHQJJWNjcHIsICVsMAotCWNyZGN4dAklY2NjcmNyLCAlbDAKLQotIQl0ZXN0IENQV1JDWFQ6IGp1c3Qgc3ludGF4Ci0KLQljd3JjeHQJJWwwLCAlY2NzcgotCWN3cmN4dAklbDAsICVjY2ZyCi0JY3dyY3h0CSVsMCwgJWNjcHIKLQljd3JjeHQJJWwwLCAlY2NjcmNyCi0KLSEJdGVzdCBDQmNjYzoganVzdCBzeW50YXgKLQotCWNibglzdG9wCi0Jbm9wCi0JY2JuLGEJc3RvcAotCW5vcAotCWNiZQlzdG9wCi0Jbm9wCi0JY2JlLGEJc3RvcAotCW5vcAotCWNiZglzdG9wCi0Jbm9wCi0JY2JmLGEJc3RvcAotCW5vcAotCWNiZWYJc3RvcAotCW5vcAotCWNiZWYsYQlzdG9wCi0Jbm9wCi0JY2JyCXN0b3AKLQlub3AKLQljYnIsYQlzdG9wCi0Jbm9wCi0JY2JlcglzdG9wCi0Jbm9wCi0JY2JlcixhCXN0b3AKLQlub3AKLQljYmZyCXN0b3AKLQlub3AKLQljYmZyLGEJc3RvcAotCW5vcAotCWNiZWZyCXN0b3AKLQlub3AKLQljYmVmcixhCXN0b3AKLQlub3AKLQljYmEJc3RvcAotCW5vcAotCWNiYSxhCXN0b3AKLQlub3AKLQljYm5lCXN0b3AKLQlub3AKLQljYm5lLGEJc3RvcAotCW5vcAotCWNibmYJc3RvcAotCW5vcAotCWNibmYsYQlzdG9wCi0Jbm9wCi0JY2JuZWYJc3RvcAotCW5vcAotCWNibmVmLGEJc3RvcAotCW5vcAotCWNibnIJc3RvcAotCW5vcAotCWNibnIsYQlzdG9wCi0Jbm9wCi0JY2JuZXIJc3RvcAotCW5vcAotCWNibmVyLGEJc3RvcAotCW5vcAotCWNibmZyCXN0b3AKLQlub3AKLQljYm5mcixhCXN0b3AKLQlub3AKLQljYm5lZnIJc3RvcAotCW5vcAotCWNibmVmcixhCXN0b3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDIyMmM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jYXM6IC1BdjcKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogc3BhcmMgc3ludGgKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxmb28+IHhub3IgICVnMSwgJWcwLCAlZzIKLTArMDAwNCA8Zm9vXCsoMHh8KTQ+IHhub3IgICVnMSwgJWcwLCAlZzEKLTArMDAwOCA8Zm9vXCsoMHh8KTg+IG5lZyAgJWcxLCAlZzIKLTArMDAwYyA8Zm9vXCsoMHh8KWM+IG5lZyAgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwNjYyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIGNvbW1vbiAodjggb3IgdjkpIHN5bnRoZXRpYyBpbnNucwotCS50ZXh0Ci1mb286Ci0Jbm90ICVnMSwlZzIKLQlub3QgJWcxCi0JbmVnICVnMSwlZzIKLQluZWcgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNmM4YzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBzcGFyYzY0IHN5bnRoNjQKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8Zm9vLSgweHwpND4gaXByZWZldGNoICAwKzAwMDQgPGZvbz4KLTArMDAwNCA8Zm9vPiBzaWdueCAgJWcxLCAlZzIKLTArMDAwOCA8Zm9vXCsoMHh8KTQ+IGNscnV3ICAlZzEsICVnMgotMCswMDBjIDxmb29cKygweHwpOD4gY2FzICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMTAgPGZvb1wrKDB4fCljPiBjYXNsICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMTQgPGZvb1wrKDB4fCkxMD4gY2FzeCAgXFsgJWcxIFxdLCAlZzIsICVnMwotMCswMDE4IDxmb29cKygweHwpMTQ+IGNhc3hsICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMWMgPGZvb1wrKDB4fCkxOD4gY2xyeCAgXFsgJWcxIFwrICVnMiBcXQotMCswMDIwIDxmb29cKygweHwpMWM+IGNscnggIFxbICVnMSBcXQotMCswMDI0IDxmb29cKygweHwpMjA+IGNscnggIFxbICVnMSBcKyAxIFxdCi0wKzAwMjggPGZvb1wrKDB4fCkyND4gY2xyeCAgXFsgJWcxIFwrIDB4MmEgXF0KLTArMDAyYyA8Zm9vXCsoMHh8KTI4PiBjbHJ4ICBcWyAweDQyIFxdCi0wKzAwMzAgPGZvb1wrKDB4fCkyYz4gc2lnbnggICVnMQotMCswMDM0IDxmb29cKygweHwpMzA+IGNscnV3ICAlZzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhYjg3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIHNwYXJjNjQgc3ludGhldGljIGluc25zCi0JLnRleHQKLQlpcHJlZmV0Y2ggZm9vCi1mb286Ci0Jc2lnbnggJWcxLCVnMgotCWNscnV3ICVnMSwlZzIKLQljYXMgWyVnMV0sJWcyLCVnMwotCWNhc2wgWyVnMV0sJWcyLCVnMwotCWNhc3ggWyVnMV0sJWcyLCVnMwotCWNhc3hsIFslZzFdLCVnMiwlZzMKLQotCWNscnggWyVnMSslZzJdCi0JY2xyeCBbJWcxXQotCWNscnggWyVnMSsxXQotCWNscnggWzQyKyVnMV0KLQljbHJ4IFsweDQyXQotCi0Jc2lnbnggJWcxCi0JY2xydXcgJWcyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2M4MGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgd3JwcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJODEgOTAgNDAgMDAgCXdycHIgICVnMSwgJXRwYwotICAgNDoJODMgOTAgODAgMDAgCXdycHIgICVnMiwgJXRucGMKLSAgIDg6CTg1IDkwIGMwIDAwIAl3cnByICAlZzMsICV0c3RhdGUKLSAgIGM6CTg3IDkxIDAwIDAwIAl3cnByICAlZzQsICV0dAotICAxMDoJODkgOTEgNDAgMDAgCXdycHIgICVnNSwgJXRpY2sKLSAgMTQ6CThiIDkxIDgwIDAwIAl3cnByICAlZzYsICV0YmEKLSAgMTg6CThkIDkxIGMwIDAwIAl3cnByICAlZzcsICVwc3RhdGUKLSAgMWM6CThmIDkyIDAwIDAwIAl3cnByICAlbzAsICV0bAotICAyMDoJOTEgOTIgNDAgMDAgCXdycHIgICVvMSwgJXBpbAotICAyNDoJOTMgOTIgODAgMDAgCXdycHIgICVvMiwgJWN3cAotICAyODoJOTUgOTIgYzAgMDAgCXdycHIgICVvMywgJWNhbnNhdmUKLSAgMmM6CTk3IDkzIDAwIDAwIAl3cnByICAlbzQsICVjYW5yZXN0b3JlCi0gIDMwOgk5OSA5MyA0MCAwMCAJd3JwciAgJW81LCAlY2xlYW53aW4KLSAgMzQ6CTliIDkzIDgwIDAwIAl3cnByICAlc3AsICVvdGhlcndpbgotICAzODoJOWQgOTMgYzAgMDAgCXdycHIgICVvNywgJXdzdGF0ZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZkNDUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgVGVzdCB3cnByCi0JLnRleHQKLQl3cnByICVnMSwldHBjCi0Jd3JwciAlZzIsJXRucGMKLQl3cnByICVnMywldHN0YXRlCi0Jd3JwciAlZzQsJXR0Ci0Jd3JwciAlZzUsJXRpY2sKLQl3cnByICVnNiwldGJhCi0Jd3JwciAlZzcsJXBzdGF0ZQotCXdycHIgJW8wLCV0bAotCXdycHIgJW8xLCVwaWwKLQl3cnByICVvMiwlY3dwCi0Jd3JwciAlbzMsJWNhbnNhdmUKLQl3cnByICVvNCwlY2FucmVzdG9yZQotCXdycHIgJW81LCVjbGVhbndpbgotCXdycHIgJW82LCVvdGhlcndpbgotCXdycHIgJW83LCV3c3RhdGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZmNDU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jb2JqZHVtcDogLXIKLSMgbmFtZSA6IGFkZGVuZHMKLS4qOiArZmlsZSBmb3JtYXQgYS5vdXQtc3Vub3MtYmlnCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICAgVFlQRSArVkFMVUUgCi0wKzA4IFdESVNQMjIgK2ZvbzFcKzB4ZitmYwotMCswYyBXRElTUDIyICtmb28xXCsweGYrZjgKLTArMTAgV0RJU1AyMiArZm9vMVwrMHhmK2YwCi0wKzE0IFdESVNQMjIgK2ZvbzFcKzB4ZitlYwotMCsxYyAzMiArZm9vMQotMCsyMCAzMiArZm9vMVwrMHgwKzQKLSMwKzIwIDMyICtmb28xXCsweDArNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdiNDZlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIwotIyBTdW5PUzQgb24gU1BBUkMgdGVzdHMKLSMKLQotaWYgW2lzdGFyZ2V0IHNwYXJjLSotc3Vub3M0Kl0gdGhlbiB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiYWRkZW5kIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWIxMDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkuZ2xvYmFsIGZvbwotZm9vOgotCW5vcAotCW5vcAotCWJhIGZvbzErMHg0Ci0JYmEgZm9vMSsweDQKLQliYSBmb28xCi0JYmEgZm9vMQotCW5vcAotCS53b3JkIGZvbzEKLQkud29yZCBmb28xKzQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RlbXBsYXRlIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGQ3OWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0jCi0jIFRoaXMgaXMgc29ydCBvZiBhIHByb3RvdHlwZSB0ZXN0IGNhc2UsIHdoaWNoIHBhcnNlcyB0aGUgbGlzdGluZyBvdXRwdXQKLSMgZnJvbSB0aGUgYXNzZW1ibGVyLiAgTGF0ZXIsIG1vcmUgcHJvdG90eXBlcyBzaG91bGQgYmUgYWRkZWQgZm9yIGNhc2VzCi0jIHdoZXJlIG9iamR1bXAgZ2V0cyBydW4gb3ZlciB0aGUgLm8gZmlsZSwgYW5kIGFueXRoaW5nIGVsc2UgbGlrZSB0aGF0Li4uCi0jCi0jIFdoZW4geW91IHdyaXRlIGEgdGVzdCBjYXNlIHRoYXQgdXNlcyB0aGUgbGlzdGluZyBvdXRwdXQsIGp1c3QgY29weSB0aGlzCi0jIGZpbGUgKHRyaW1taW5nIGRvd24gdGhlIG92ZXJseS12ZXJib3NlIGNvbW1lbnRzIGEgbGl0dGxlKSwgYW5kCi0jIGFkanVzdCBpdCB0byBkbyB3aGF0IHlvdSBuZWVkLgotIwotIyBSZW1lbWJlciB0aGF0IGFueSAiLmV4cCIgZmlsZSBmb3VuZCBpbiB0aGUgdHJlZSB3aWxsIGJlIHByb2Nlc3NlZCBieQotIyBkZWphZ251LgotCi0jCi0jIEZJUlNUIFNBTVBMRSBURVNUIENBU0UKLSMKLQotcHJvYyBkb19mb28ge30gewotIyBUaGlzIHN0cmluZyBpcyB1c2VkIGJlbG93IHdoZW4gcHJpbnRpbmcgb3V0IGEgc3VjY2VzcyBvciBmYWlsdXJlIG1lc3NhZ2UuCi0jIElmIG1vcmUgdGhhbiBvbmUgdGVzdCBpcyBydW4gYnkgYSBnaXZlbiAuZXhwIGZpbGUsIGl0J2QgYmUgbmljZSB0byBpbmNsdWRlCi0jIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlLgotICAgIHNldCB0ZXN0bmFtZSAiZm9vLnM6IG11bHRpLXJlZ2lzdGVyIHR3ZWFraW5nIGFuZCBmcm9ibmljYXRpb24iCi0KLSMgSSB1c2UgdGhpcyBhcyBhIGZsYWcgdG8gcmVjb3JkIHdoZXRoZXIgdGhlIHRlc3QgY2FzZSBwYXNzZWQuICBJZiB0aGlzCi0jIGZsYWcgaXMgc3RpbGwgY2xlYXIgd2hlbiBFT0YgaXMgcmVhY2hlZCwgdGhpcyB0ZXN0IGZhaWxzLiAgSWYgdGhlcmUgYXJlCi0jIHR3byBvciBtb3JlIHBhdHRlcm5zLCBhbmQgSSBuZWVkIHRvIHNlZSBhbGwgb2YgdGhlbSwgSSdsbCBjcmVhdGUgTiB2YXJpYWJsZXMKLSMgYW5kIGNoZWNrIGlmIHRoZSBzdW0gaXMgTi4KLSAgICBzZXQgeCAwCi0KLSMgQ2FsbCBnYXNfc3RhcnQgd2l0aCB0d28gYXJndW1lbnRzOiBUaGUgaW5wdXQgZmlsZSBuYW1lICh3aGljaCBpdCdsbCBzZWFyY2gKLSMgZm9yIGluICRzcmNkaXIvJHN1YmRpciwgdGhhdCBpcywgdGhlIHNvdXJjZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIC5leHAgZmlsZQotIyBpcyksIGFuZCBhIChwb3NzaWJseSBlbXB0eSkgc3RyaW5nIG9mIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgYXNzZW1ibGVyLgotICAgIGdhc19zdGFydCAiZm9vLnMiICItYWwiCi0KLSMgTm93IEkganVzdCBpdGVyYXRlIG92ZXIgYWxsIHRoZSBvdXRwdXQgbGluZXMsIGxvb2tpbmcgZm9yIHdoYXQgSSB3YW50Ci0jIHRvIHNlZS4gIFNpbmNlIGVhY2ggcGF0dGVybiBleHBsaWNpdGx5IHdpbGwgbm90IHNwYW4gbGluZSBicmVha3MsIHRoZXJlJ3MKLSMgYWxzbyBhIHBhdHRlcm4gZm9yIGxpbmVzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55dGhpbmcgZWxzZS4gICAoSXMgaXQgc2FmZSB0bwotIyB1c2UgIi4qIiBmb3IgcGF0dGVybnMgbm90IGNyb3NzaW5nIGxpbmUgYnJlYWtzPyBJIGRvbid0IHRoaW5rICIkIiBkb2VzIHRoZQotIyByaWdodCB0aGluZyBmb3IgdGhhdCwgaW4gYW55IGNhc2UuICBJIHNob3VsZCBjaGVjayBpbnRvIHdoZXRoZXIgdGhlIGV4dHJhCi0jIHBhdHRlcm4gaXMgZXZlbiBuZWVkZWQuCi0KLSMgQXBwYXJlbnRseSBDUkxGIGlzIHJlY2VpdmVkIHdoZW4gdXNpbmcgcHR5cyBmb3Igc3VicHJvY2Vzc2VzOyBoZW5jZSB0aGUKLSMgXHJcbiBmb3IgbWF0Y2hpbmcgbGluZSBudW1iZXIgMy4KLQotIyBOb3RlIHRoYXQgaWYgeW91IHVzZSAieyAuLi4gfSIgZm9yIHRoZSBleHBlY3QgY2xhdXNlLCB5b3UgY2FuJ3QgaGF2ZQotIyBjb21tZW50cyBpbnNpZGUgaXQuCi0KLSMgVGhpcyB0ZXN0IGNhc2UgaXMga2luZGEgYm9ndXMgaW4gdGhhdCBzZWVpbmcgZWl0aGVyIGEgd29yZCBvZiBhbGwgemVyb3MKLSMgYXQgYWRkcmVzcyB6ZXJvIG9yIGEgQy1zdHlsZSBjb21tZW50IG9uIGxpbmUgdGhyZWUgdGhhdCBzYXlzICJMb29raW5nIGZvcgotIyBDIGNvbW1lbnRzIiAod2l0aCB2ZXJ5IHNwZWNpZmljIHB1bmN0dWF0aW9uIGFuZCB3aGl0ZXNwYWNlKSB3aWxsIGNhdXNlCi0jIGl0IHRvIHBhc3MgdGhpcyB0ZXN0LiAgVXN1YWxseSAKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMDAwMDBcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkgICAgLXJlICJeICszXFsgXHRcXSsvLiBMb29raW5nIGZvciBDIGNvbW1lbnRzLiAuL1xyXG4iCXsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0IGlzbid0Ci0jIG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiAkeCB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0jIE5vdyBhY3R1YWxseSBydW4gdGhlIHRlc3QuICBJdCBjYW4gYmUgY29uZGl0aW9uYWxpemVkIGlmIHRoZSB0ZXN0IGlzCi0jIG5vdCBhcHByb3ByaWF0ZSBmb3IgYWxsIHRhcmdldHMuICBUaGUgcHJvYyAiaXN0YXJnZXQiIGNoZWNrcyBhIGdlbmVyYWxpemVkCi0jIGZvcm0gb2YgdGhlIHRhcmdldCBuYW1lLCBzbyB0aGF0IChlLmcuKSAibTY4MzMyLXVua25vd24tYW91dCIgd291bGQgbWF0Y2gKLSMgaGVyZS4gIFNvIGZhciwgSSB0aGluayBvbmx5IHRoZSBDUFUgbmFtZSBpcyBhY3R1YWxseSBldmVyIGFsdGVyZWQuCi1pZiBbaXN0YXJnZXQgbTY4ay0qXSB0aGVuIHsKLSAgICBkb19mb28KLX0KLQotCi0KLQotIwotIyBTRUNPTkQgU0FNUExFIFRFU1QgQ0FTRQotIwotCi0jIFRoaXMgaXMgYSB0aW55IGJpdCBsaWtlIHRoZSBDIGNvbXBpbGVyIHRvcnR1cmUgdGVzdHMsIGluIHRoYXQgaXQnbGwgcnVuCi0jIHRoZSBhc3NlbWJsZXIgd2l0aCB0aGUgcG93ZXIgc2V0IG9mIHRoZSBsaXN0IG9mIG9wdGlvbnMgc3VwcGxpZWQuCi0jCi0jIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgdGVzdCBmaWxlIG5hbWU7IHRoZSBzZWNvbmQgaXMgYXJndW1lbnRzIHRoYXQKLSMgYXJlIGFsd2F5cyB0byBiZSBwcm92aWRlZDsgdGhlIHRoaXJkIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2Ygb3B0aW9ucwotIyB3aGljaCBhcmUgb3B0aW9uYWwgKGVuZGluZyBpbiAiPiIgaWYgb3V0cHV0IHNob3VsZCBiZSBpZ25vcmVkLCBsaWtlICItYT4iKTsKLSMgdGhlIGZvdXJ0aCBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdC4gIFNvIGZhciwgb25seSBiaW5hcnkgb3B0aW9ucyBhcmUgaGFuZGxlZAotIyB0aGlzIHdheTsgTi13YXkgb3B0aW9ucyAobGlrZSBDUFUgdHlwZSBmb3IgbTY4aykgYXJlbid0IGhhbmRsZWQgeWV0LgotIwotIyBUaGUgdmFyaWFibGUgJHN0ZG9wdGxpc3QgdXN1YWxseSBoYXMgYSByZWFzb25hYmxlIHNldCBvZiBvcHRpb25hbCBvcHRpb25zCi0jIGZvciB0aGlzIHRhcmdldC4KLQotIyBObywgUElDIGlzbid0IHN1cHBvcnRlZCB5ZXQuICBUaGlzIGlzIG9ubHkgYW4gZXhhbXBsZS4KLWdhc190ZXN0ICJxdXV4LnMiICItSyIgJHN0ZG9wdGxpc3QgInVzZSBvZiBxdXV4ZXMgaW4gUElDIG1vZGUiCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGVjNzA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgc2lnbmVkIGFuZCB1bnNpZ25lZCBhZGQgaW5zdHJ1Y3Rpb25zCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwYSAwMCBmYiA2Mi4qCi0gICA0OglmZiAzZiBhYyAyMC4qCi0gICA4OgkwMCA0MCAyYyAyMS4qCi0gICBjOgkwMCAxMCA3YiAzMSAwMCA0MCAwMCAwMC4qCi0gIDE0OgkwMCAxMCBmYiA0MSBmZiBiZiBmZiBmZi4qCi0gIDFjOgkwMCAxMCBiYiA1YSBmZiBmZiBmZiA3Zi4qCi0gIDI0OgkwMCAxMCAzYiA2YiAwMCAwMCAwMCA4MC4qCi0gIDJjOgkwYSAyMCBmYiA2Mi4qCi0gIDMwOglmZiBiZiBhYyAyMC4qCi0gIDM0OgkwMCBjMCAyYyAyMS4qCi0gIDM4OgkwMCAzMCA3YiAzMSAwMCA0MCAwMCAwMC4qCi0gIDQwOgkwMCAzMCBmYiA0MSBmZiBiZiBmZiBmZi4qCi0gIDQ4OgkwMCAzMCBiYiA1YSBmZiBmZiBmZiA3Zi4qCi0gIDUwOgkwMCAzMCAzYiA2YiAwMCAwMCAwMCA4MC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyYjM2OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDIwOjEzOjMzIDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYWRkLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDsgVGVzdCBzaWduZWQgYW5kIHVuc2lnbmVkIGFkZGl0aW9uIGluc3RydWN0aW9uLgotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOyBUZXN0IGJvdW5kYXJ5IGNvbmRpdGlvbnMgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZy4KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDsgTm90ZSB0aGF0IHVuc2lnbmVkIGFkZGl0aW9uIHN0aWxsIHVzZXMgc2lnbmVkIGltbWVkaWF0ZXMuCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNSAwMDAwMDAwMCAgIDYyRkIwMDBBICAgICAgICAgYWRkICAgICByMTAscjExLHIxMiAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNiAwMDAwMDAwNCAgIDIwQUMzRkZGICAgICAgICAgYWRkICAgICAxNjM4MyxyMixyNCAgICAgICAgICAgICA7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICA3IDAwMDAwMDA4ICAgMjEyQzQwMDAgICAgICAgICBhZGQgICAgIC0xNjM4NCxyNCxyNCAgICAgICAgICAgIDsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgIDggMDAwMDAwMEMgICAzMTdCMTAwMCAgICAgICAgIGFkZCAgICAgMTYzODQscjUscjYgICAgICAgICAgICAgOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDEwICAgMDAwMDQwMDAgCi0gICAgICAgIDkgMDAwMDAwMTQgICA0MUZCMTAwMCAgICAgICAgIGFkZCAgICAgLTE2Mzg1LHI3LHI4ICAgICAgICAgICAgOyBNYXhpbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAxOCAgIEZGRkZCRkZGIAotICAgICAgIDEwIDAwMDAwMDFDICAgNUFCQjEwMDAgICAgICAgICBhZGQgICAgIDIxNDc0ODM2NDcscjEwLHIxMSAgICAgIDsgTWF4aW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAyMCAgIDdGRkZGRkZGIAotICAgICAgIDExIDAwMDAwMDI0ICAgNkIzQjEwMDAgICAgICAgICBhZGQgICAgIC0yMTQ3NDgzNjQ4LHIxMixyMTMgICAgIDsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAyOCAgIDgwMDAwMDAwIAotICAgICAgIDEyICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTMgMDAwMDAwMkMgICA2MkZCMjAwQSAgICAgICAgIGFkZHUgICAgcjEwLHIxMSxyMTIgICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTQgMDAwMDAwMzAgICAyMEFDQkZGRiAgICAgICAgIGFkZHUgICAgMTYzODMscjIscjQgICAgICAgICAgICAgOyBNYXhpbXVtIHBvc2l0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAxNSAwMDAwMDAzNCAgIDIxMkNDMDAwICAgICAgICAgYWRkdSAgICAtMTYzODQscjQscjQgICAgICAgICAgICA7IE1pbmltdW0gbmVnYXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgIDE2IDAwMDAwMDM4ICAgMzE3QjMwMDAgICAgICAgICBhZGR1ICAgIDE2Mzg0LHI1LHI2ICAgICAgICAgICAgIDsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAzQyAgIDAwMDA0MDAwIAotICAgICAgIDE3IDAwMDAwMDQwICAgNDFGQjMwMDAgICAgICAgICBhZGR1ICAgIC0xNjM4NSxyNyxyOCAgICAgICAgICAgIDsgTWF4aW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwNDQgICBGRkZGQkZGRiAKLSAgICAgICAxOCAwMDAwMDA0OCAgIDVBQkIzMDAwICAgICAgICAgYWRkdSAgICAyMTQ3NDgzNjQ3LHIxMCxyMTEgICAgICA7IE1heGltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwNEMgICA3RkZGRkZGRiAKLSAgICAgICAxOSAwMDAwMDA1MCAgIDZCM0IzMDAwICAgICAgICAgYWRkdSAgICAtMjE0NzQ4MzY0OCxyMTIscjEzICAgICA7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwNTQgICA4MDAwMDAwMCAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzIyOWVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotOyBUZXN0IHNpZ25lZCBhbmQgdW5zaWduZWQgYWRkaXRpb24gaW5zdHJ1Y3Rpb24uCi07IFRlc3QgYm91bmRhcnkgY29uZGl0aW9ucyB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nLgotOyBOb3RlIHRoYXQgdW5zaWduZWQgYWRkaXRpb24gc3RpbGwgdXNlcyBzaWduZWQgaW1tZWRpYXRlcy4KLQotCWFkZAlyMTAscjExLHIxMgkJOyBSZWdpc3RlciBmb3JtCi0JYWRkCTE2MzgzLHIyLHI0CQk7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotCWFkZAktMTYzODQscjQscjQJCTsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCTE2Mzg0LHI1LHI2CQk7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCS0xNjM4NSxyNyxyOAkJOyBNYXhpbXVtIG5lZ2F0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZAkyMTQ3NDgzNjQ3LHIxMCxyMTEJOyBNYXhpbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZAktMjE0NzQ4MzY0OCxyMTIscjEzCTsgTWluaW11bSBuZWdhdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLQotCWFkZHUJcjEwLHIxMSxyMTIJCTsgUmVnaXN0ZXIgZm9ybQotCWFkZHUJMTYzODMscjIscjQJCTsgTWF4aW11bSBwb3NpdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQktMTYzODQscjQscjQJCTsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQkxNjM4NCxyNSxyNgkJOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZHUJLTE2Mzg1LHI3LHI4CQk7IE1heGltdW0gbmVnYXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQkyMTQ3NDgzNjQ3LHIxMCxyMTEJOyBNYXhpbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZHUJLTIxNDc0ODM2NDgscjEyLHIxMwk7IE1pbmltdW0gbmVnYXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmOTYxMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgLmFsaWduIHBzZXVkbyBvcAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJYWIgMDAgMDAgMDAuKgotICAgNDoJY2QgMDAgZWYgMDAuKgotICAgODoJZjEgMDAgMDAgMDAuKgotICAgYzoJZWUgMDAgMDAgMDAuKgotICAxMDoJYWMgMDAgMDAgMDAuKgotICAxNDoJMDAgMDAgMDAgMDAuKgotICAxODoJYWIgMDAgMDAgMDAuKgotICAxYzoJMDAgMDAgMDAgMDAuKgotICAyMDoJZmUgMDAgMDAgMDAuKgotCVwuXC5cLgotICAzMDoJZGUgYWQgYmUgZWYuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTU0MTVhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgVGh1IEZlYiAyNyAxNzowMjoyMyAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWFsaWduLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyAgICAgIFRlc3QgdGhlIC5hbGlnbiBkaXJlY3RpdmUuCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgMyAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgLnRleHQKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUIwMDAwMDAKLSAgICAgICAgNiAwMDAwMDAwMCAgIEFCICAgICAgICAgICAgICAgLmJ5dGUgICAweEFCCi0gICAgICAgIDcgMDAwMDAwMDEgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgICAgICAgICAgICAgICAgIDsgU2hvdWxkIGRlZmF1bHQgdG8gNCBieXRlIGFsaWdubWVudAotICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4Q0QwMEVGMDAKLSAgICAgICAxMCAwMDAwMDAwNCAgIENEICAgICAgICAgICAgICAgLmJ5dGUgICAweENECi0gICAgICAgMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgMiAgICAgICAgICAgICAgIDsgIFNob3VsZCBhbGlnbiB0byB0aGUgbmV4dCAyLWJ5dGUgYm91bmRhcnkgKHBhZCB3aXRoIG9uZSBudWxsIGJ5dAotICAgICAgIDEyIDAwMDAwMDA2ICAgRUYgICAgICAgICAgICAgICAuYnl0ZSAgIDB4RUYKLSAgICAgICAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduICAxCi0gICAgICAgMTQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhGMTAwMDAwMAotICAgICAgIDE2IDAwMDAwMDA3ICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDQgICAgICAgICAgICAgICA7ICBTaG91bGQgbm90IGFmZmVjdCBhbGlnbm1lbnQgKGFscmVhZHkgb24gNCkKLSAgICAgICAxNyAwMDAwMDAwOCAgIEYxICAgICAgICAgICAgICAgLmJ5dGUgICAweEYxCi0gICAgICAgMTggMDAwMDAwMDkgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgNCAgICAgICAgICAgICAgIDsgIFNob3VsZCBhbGlnbiB0byBuZXh0IDQgYnl0ZSBib3VuZGFyeQotICAgICAgIDE5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RUUwMDAwMDAgc2luY2Ugd2UgYXJlIGFscmVhZHkgb24gNCBieXRlIGFsaWdubWVudAotICAgICAgIDIxIDAwMDAwMDBDICAgRUUgICAgICAgICAgICAgICAuYnl0ZSAweEVFCi0gICAgICAgMjIgMDAwMDAwMEQgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgOAotICAgICAgIDIzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUMwMDAwMDAgMHgwMDAwMDAwMAotICAgICAgIDI1IDAwMDAwMDEwICAgQUMgICAgICAgICAgICAgICAuYnl0ZSAgIDB4QUMKLSAgICAgICAyNiAwMDAwMDAxMSAgICAgICAgICAgICAgICAgICAgLmFsaWduICA4Ci0gICAgICAgMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFCMDAwMDAwIDB4MDAwMDAwMDAgc2luY2Ugd2UgYXJlIGF0IDggYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAyOSAwMDAwMDAxOCAgIEFCICAgICAgICAgICAgICAgLmJ5dGUgICAweEFCCi0gICAgICAgMzAgMDAwMDAwMTkgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgMTYKLSAgICAgICAzMSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEZFMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwCi0gICAgICAgMzMgMDAwMDAwMjAgICBGRSAgICAgICAgICAgICAgIC5ieXRlICAgMHhGRQotICAgICAgIDM0IDAwMDAwMDIxICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDE2Ci0gICAgICAgMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIGp1c3QgZm9yY2VzIHRoZSBkaXNhc3NlbWJsZXIgdG8gbm90IHByaW50IC4uLiBmb3IgdHJhaWxpbmcgbnVsbHMKLSAgICAgICAzNyAwMDAwMDAzMCAgIERFICAgICAgICAgICAgICAgLmJ5dGUgMHhERSwgMHhBRCwgMHhCRSwgMHhFRgotICAgICAgICAgIDAwMDAwMDMxICAgQUQgICAgICAgCi0gICAgICAgICAgMDAwMDAwMzIgICBCRSAgICAgICAKLSAgICAgICAgICAwMDAwMDAzMyAgIEVGICAgICAgIAotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMxMjU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi07OwlUZXN0IHRoZSAuYWxpZ24gZGlyZWN0aXZlLgotCi0JLnRleHQKLQkKLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFCMDAwMDAwCi0JLmJ5dGUJMHhBQgotCS5hbGlnbgkJCTsgU2hvdWxkIGRlZmF1bHQgdG8gNCBieXRlIGFsaWdubWVudAotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhDRDAwRUYwMAotCS5ieXRlCTB4Q0QKLQkuYWxpZ24JMgkJOyAgU2hvdWxkIGFsaWduIHRvIHRoZSBuZXh0IDItYnl0ZSBib3VuZGFyeSAocGFkIHdpdGggb25lIG51bGwgYnl0ZSkKLQkuYnl0ZQkweEVGCi0JLmFsaWduCTEKLQotCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RjEwMDAwMDAKLQkuYWxpZ24JNAkJOyAgU2hvdWxkIG5vdCBhZmZlY3QgYWxpZ25tZW50IChhbHJlYWR5IG9uIDQpCi0JLmJ5dGUJMHhGMQotCS5hbGlnbgk0CQk7ICBTaG91bGQgYWxpZ24gdG8gbmV4dCA0IGJ5dGUgYm91bmRhcnkKLQotCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RUUwMDAwMDAgc2luY2Ugd2UgYXJlIGFscmVhZHkgb24gNCBieXRlIGFsaWdubWVudAotCS5ieXRlIDB4RUUKLQkuYWxpZ24JOAotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQzAwMDAwMCAweDAwMDAwMDAwCi0JLmJ5dGUJMHhBQwotCS5hbGlnbgk4Ci0JCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQjAwMDAwMCAweDAwMDAwMDAwIHNpbmNlIHdlIGFyZSBhdCA4IGJ5dGUgYWxpZ25tZW50Ci0JLmJ5dGUJMHhBQgotCS5hbGlnbgkxNgotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhGRTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMAotCS5ieXRlCTB4RkUKLQkuYWxpZ24JMTYKLQkKLQk7OyBUaGlzIGp1c3QgZm9yY2VzIHRoZSBkaXNhc3NlbWJsZXIgdG8gbm90IHByaW50IC4uLiBmb3IgdHJhaWxpbmcgbnVsbHMKLQkuYnl0ZSAweERFLCAweEFELCAweEJFLCAweEVGCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2FlZThiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5kCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgY292ZXJhZ2Ugb2Ygc3ltYm9saWMgQklUTlVNIHZhbHVlcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMGEgNDAgMzkgZmEuKgotICAgNDoJMGEgNDAgMzkgZjIuKgotICAgODoJMGEgNDAgMzkgZWEuKgotICAgYzoJMGEgNDAgMzkgZTIuKgotICAxMDoJMGEgNDAgMzkgZGEuKgotICAxNDoJMGEgNDAgMzkgZDIuKgotICAxODoJMGEgNDAgMzkgY2EuKgotICAxYzoJMGEgNDAgMzkgYzIuKgotICAyMDoJMGEgNDAgMzkgYmEuKgotICAyNDoJMGEgNDAgMzkgYjIuKgotICAyODoJMGEgNDAgMzkgYWEuKgotICAyYzoJMGEgNDAgMzkgYTIuKgotICAzMDoJMGEgNDAgMzkgOWEuKgotICAzNDoJMGEgNDAgMzkgOTIuKgotICAzODoJMGEgNDAgMzkgOGEuKgotICAzYzoJMGEgNDAgMzkgODIuKgotICA0MDoJMGEgNDAgMzkgN2EuKgotICA0NDoJMGEgNDAgMzkgNzIuKgotICA0ODoJMGEgNDAgMzkgNmEuKgotICA0YzoJMGEgNDAgMzkgNjIuKgotICA1MDoJMGEgNDAgMzkgNWEuKgotICA1NDoJMGEgNDAgMzkgNTIuKgotICA1ODoJMGEgNDAgMzkgNGEuKgotICA1YzoJMGEgNDAgMzkgNDIuKgotICA2MDoJMGEgNDAgMzkgM2EuKgotICA2NDoJMGEgNDAgMzkgMzIuKgotICA2ODoJMGEgNDAgMzkgMmEuKgotICA2YzoJMGEgNDAgMzkgMjIuKgotICA3MDoJMGEgNDAgMzkgMWEuKgotICA3NDoJMGEgNDAgMzkgMTIuKgotICA3ODoJMGEgNDAgMzkgNWEuKgotICA3YzoJMGEgNDAgMzkgNTIuKgotICA4MDoJMGEgNDAgMzkgNGEuKgotICA4NDoJMGEgNDAgMzkgNDIuKgotICA4ODoJMGEgNDAgMzkgM2EuKgotICA4YzoJMGEgNDAgMzkgMzIuKgotICA5MDoJMGEgNDAgMzkgMmEuKgotICA5NDoJMGEgNDAgMzkgMjIuKgotICA5ODoJMGEgNDAgMzkgMWEuKgotICA5YzoJMGEgNDAgMzkgMTIuKgotICBhMDoJMGEgNDAgMzkgMGEuKgotICBhNDoJMGEgNDAgMzkgMDIuKgotICBhODoJMGEgNDAgMzkgZmEuKgotICBhYzoJMGEgNDAgMzkgZjIuKgotICBiMDoJMGEgNDAgMzkgZWEuKgotICBiNDoJMGEgNDAgMzkgZTIuKgotICBiODoJMGEgNDAgMzkgZGEuKgotICBiYzoJMGEgNDAgMzkgZDIuKgotICBjMDoJMGEgNDAgMzkgY2EuKgotICBjNDoJMGEgNDAgMzkgYzIuKgotICBjODoJMGEgNDAgMzkgYmEuKgotICBjYzoJMGEgNDAgMzkgYjIuKgotICBkMDoJMGEgNDAgMzkgYWEuKgotICBkNDoJMGEgNDAgMzkgYTIuKgotICBkODoJMGEgNDAgMzkgOWEuKgotICBkYzoJMGEgNDAgMzkgOTIuKgotICBlMDoJMGEgNDAgMzkgOGEuKgotICBlNDoJMGEgNDAgMzkgODIuKgotICBlODoJMGEgNDAgMzkgN2EuKgotICBlYzoJMGEgNDAgMzkgNzIuKgotICBmMDoJMGEgNDAgMzkgNmEuKgotICBmNDoJMGEgNDAgMzkgNjIuKgotICBmODoJMGEgNDAgMzkgNWEuKgotICBmYzoJMGEgNDAgMzkgNTIuKgotIDEwMDoJMGEgNDAgMzkgNGEuKgotIDEwNDoJMGEgNDAgMzkgNDIuKgotIDEwODoJMGEgNDAgMzkgM2EuKgotIDEwYzoJMGEgNDAgMzkgMzIuKgotIDExMDoJMGEgNDAgMzkgMmEuKgotIDExNDoJMGEgNDAgMzkgMjIuKgotIDExODoJMGEgNDAgMzkgMWEuKgotIDExYzoJMGEgNDAgMzkgMTIuKgotIDEyMDoJMGEgNDAgMzkgMGEuKgotIDEyNDoJMGEgNDAgMzkgMDIuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzI2OGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU2F0IEZlYiAyMiAyMTozNzoxNSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWJpdG51bS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IHRoYXQgYWxsIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgdGhlIEJJVE5VTSBmaWVsZAotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLiAgQWxzbwotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaXNhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcywgYW5kCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICA7OyB0aGF0IHRoZSByYXcgbnVtZXJpYyB2YWx1ZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5IChzdG9yZWQgYXMKLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgIDs7IHRoZSBvbmUncyBjb21wbGVtZW50IG9mIHRoZSBvcGVyYW5kIG51bWVyaWMgdmFsdWUuCi0gICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNyAwMDAwMDAwMCAgIEZBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZXEuYiAgICAgOyAofjAgJiAweDFGKQotICAgICAgICA4IDAwMDAwMDA0ICAgRjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxuZS5iICAgICA7ICh+MSAmIDB4MUYpCi0gICAgICAgIDkgMDAwMDAwMDggICBFQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGd0LmIgICAgIDsgKH4yICYgMHgxRikKLSAgICAgICAxMCAwMDAwMDAwQyAgIEUyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbGUuYiAgICAgOyAofjMgJiAweDFGKQotICAgICAgIDExIDAwMDAwMDEwICAgREEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsdC5iICAgICA7ICh+NCAmIDB4MUYpCi0gICAgICAgMTIgMDAwMDAwMTQgICBEMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGdlLmIgICAgIDsgKH41ICYgMHgxRikKLSAgICAgICAxMyAwMDAwMDAxOCAgIENBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaGkuYiAgICAgOyAofjYgJiAweDFGKQotICAgICAgIDE0IDAwMDAwMDFDICAgQzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxscy5iICAgICA7ICh+NyAmIDB4MUYpCi0gICAgICAgMTUgMDAwMDAwMjAgICBCQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxvLmIgICAgIDsgKH44ICYgMHgxRikKLSAgICAgICAxNiAwMDAwMDAyNCAgIEIyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaHMuYiAgICAgOyAofjkgJiAweDFGKQotICAgICAgIDE3ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTggMDAwMDAwMjggICBBQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGVxLmggICAgIDsgKH4xMCAmIDB4MUYpCi0gICAgICAgMTkgMDAwMDAwMkMgICBBMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG5lLmggICAgIDsgKH4xMSAmIDB4MUYpCi0gICAgICAgMjAgMDAwMDAwMzAgICA5QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGd0LmggICAgIDsgKH4xMiAmIDB4MUYpCi0gICAgICAgMjEgMDAwMDAwMzQgICA5MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxlLmggICAgIDsgKH4xMyAmIDB4MUYpCi0gICAgICAgMjIgMDAwMDAwMzggICA4QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGx0LmggICAgIDsgKH4xNCAmIDB4MUYpCi0gICAgICAgMjMgMDAwMDAwM0MgICA4MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGdlLmggICAgIDsgKH4xNSAmIDB4MUYpCi0gICAgICAgMjQgMDAwMDAwNDAgICA3QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGhpLmggICAgIDsgKH4xNiAmIDB4MUYpCi0gICAgICAgMjUgMDAwMDAwNDQgICA3MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxzLmggICAgIDsgKH4xNyAmIDB4MUYpCi0gICAgICAgMjYgMDAwMDAwNDggICA2QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxvLmggICAgIDsgKH4xOCAmIDB4MUYpCi0gICAgICAgMjcgMDAwMDAwNEMgICA2MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGhzLmggICAgIDsgKH4xOSAmIDB4MUYpCi0gICAgICAgMjggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyOSAwMDAwMDA1MCAgIDVBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZXEudyAgICAgOyAofjIwICYgMHgxRikKLSAgICAgICAzMCAwMDAwMDA1NCAgIDUyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbmUudyAgICAgOyAofjIxICYgMHgxRikKLSAgICAgICAzMSAwMDAwMDA1OCAgIDRBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ3QudyAgICAgOyAofjIyICYgMHgxRikKLSAgICAgICAzMiAwMDAwMDA1QyAgIDQyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbGUudyAgICAgOyAofjIzICYgMHgxRikKLSAgICAgICAzMyAwMDAwMDA2MCAgIDNBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHQudyAgICAgOyAofjI0ICYgMHgxRikKLSAgICAgICAzNCAwMDAwMDA2NCAgIDMyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ2UudyAgICAgOyAofjI1ICYgMHgxRikKLSAgICAgICAzNSAwMDAwMDA2OCAgIDJBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaGkudyAgICAgOyAofjI2ICYgMHgxRikKLSAgICAgICAzNiAwMDAwMDA2QyAgIDIyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHMudyAgICAgOyAofjI3ICYgMHgxRikKLSAgICAgICAzNyAwMDAwMDA3MCAgIDFBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbG8udyAgICAgOyAofjI4ICYgMHgxRikKLSAgICAgICAzOCAwMDAwMDA3NCAgIDEyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaHMudyAgICAgOyAofjI5ICYgMHgxRikKLSAgICAgICAzOSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDQwIDAwMDAwMDc4ICAgNUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxlcS5mICAgICA7ICh+MjAgJiAweDFGKQotICAgICAgIDQxIDAwMDAwMDdDICAgNTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxuZS5mICAgICA7ICh+MjEgJiAweDFGKQotICAgICAgIDQyIDAwMDAwMDgwICAgNEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxndC5mICAgICA7ICh+MjIgJiAweDFGKQotICAgICAgIDQzIDAwMDAwMDg0ICAgNDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsZS5mICAgICA7ICh+MjMgJiAweDFGKQotICAgICAgIDQ0IDAwMDAwMDg4ICAgM0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsdC5mICAgICA7ICh+MjQgJiAweDFGKQotICAgICAgIDQ1IDAwMDAwMDhDICAgMzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxnZS5mICAgICA7ICh+MjUgJiAweDFGKQotICAgICAgIDQ2IDAwMDAwMDkwICAgMkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxvdS5mICAgICA7ICh+MjYgJiAweDFGKQotICAgICAgIDQ3IDAwMDAwMDk0ICAgMjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxpbi5mICAgICA7ICh+MjcgJiAweDFGKQotICAgICAgIDQ4IDAwMDAwMDk4ICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxpYi5mICAgICA7ICh+MjggJiAweDFGKQotICAgICAgIDQ5IDAwMDAwMDlDICAgMTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxvYi5mICAgICA7ICh+MjkgJiAweDFGKQotICAgICAgIDUwIDAwMDAwMEEwICAgMEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCx1by5mICAgICA7ICh+MzAgJiAweDFGKQotICAgICAgIDUxIDAwMDAwMEE0ICAgMDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxvci5mICAgICA7ICh+MzEgJiAweDFGKQotICAgICAgIDUyICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgNTMgMDAwMDAwQTggICBGQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDAKLSAgICAgICA1NCAwMDAwMDBBQyAgIEYyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsMQotICAgICAgIDU1IDAwMDAwMEIwICAgRUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyCi0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTYXQgRmViIDIyIDIxOjM3OjE1IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYml0bnVtLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICA1NiAwMDAwMDBCNCAgIEUyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsMwotICAgICAgIDU3IDAwMDAwMEI4ICAgREEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw0Ci0gICAgICAgNTggMDAwMDAwQkMgICBEMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDUKLSAgICAgICA1OSAwMDAwMDBDMCAgIENBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsNgotICAgICAgIDYwIDAwMDAwMEM0ICAgQzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw3Ci0gICAgICAgNjEgMDAwMDAwQzggICBCQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDgKLSAgICAgICA2MiAwMDAwMDBDQyAgIEIyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsOQotICAgICAgIDYzIDAwMDAwMEQwICAgQUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMAotICAgICAgIDY0IDAwMDAwMEQ0ICAgQTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMQotICAgICAgIDY1IDAwMDAwMEQ4ICAgOUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMgotICAgICAgIDY2IDAwMDAwMERDICAgOTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMwotICAgICAgIDY3IDAwMDAwMEUwICAgOEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNAotICAgICAgIDY4IDAwMDAwMEU0ICAgODIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNQotICAgICAgIDY5IDAwMDAwMEU4ICAgN0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNgotICAgICAgIDcwIDAwMDAwMEVDICAgNzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNwotICAgICAgIDcxIDAwMDAwMEYwICAgNkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxOAotICAgICAgIDcyIDAwMDAwMEY0ICAgNjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxOQotICAgICAgIDczIDAwMDAwMEY4ICAgNUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMAotICAgICAgIDc0IDAwMDAwMEZDICAgNTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMQotICAgICAgIDc1IDAwMDAwMTAwICAgNEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMgotICAgICAgIDc2IDAwMDAwMTA0ICAgNDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMwotICAgICAgIDc3IDAwMDAwMTA4ICAgM0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNAotICAgICAgIDc4IDAwMDAwMTBDICAgMzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNQotICAgICAgIDc5IDAwMDAwMTEwICAgMkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNgotICAgICAgIDgwIDAwMDAwMTE0ICAgMjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNwotICAgICAgIDgxIDAwMDAwMTE4ICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyOAotICAgICAgIDgyIDAwMDAwMTFDICAgMTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyOQotICAgICAgIDgzIDAwMDAwMTIwICAgMEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwzMAotICAgICAgIDg0IDAwMDAwMTI0ICAgMDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwzMQotICAgICAgIDg1ICAgICAgICAgICAgICAgICAgICAgCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyNmUwNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTs7IFRlc3QgdGhhdCBhbGwgdGhlIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciB0aGUgQklUTlVNIGZpZWxkCi07OyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuICBBbHNvCi07OyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpc2Fzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLCBhbmQKLTs7IHRoYXQgdGhlIHJhdyBudW1lcmljIHZhbHVlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgKHN0b3JlZCBhcwotOzsgdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhlIG9wZXJhbmQgbnVtZXJpYyB2YWx1ZS4KLQotCWJibwlyMTAscjgsZXEuYgk7ICh+MCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxuZS5iCTsgKH4xICYgMHgxRikKLQliYm8JcjEwLHI4LGd0LmIJOyAofjIgJiAweDFGKQotCWJibwlyMTAscjgsbGUuYgk7ICh+MyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsdC5iCTsgKH40ICYgMHgxRikKLQliYm8JcjEwLHI4LGdlLmIJOyAofjUgJiAweDFGKQotCWJibwlyMTAscjgsaGkuYgk7ICh+NiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxscy5iCTsgKH43ICYgMHgxRikKLQliYm8JcjEwLHI4LGxvLmIJOyAofjggJiAweDFGKQotCWJibwlyMTAscjgsaHMuYgk7ICh+OSAmIDB4MUYpCi0KLQliYm8JcjEwLHI4LGVxLmgJOyAofjEwICYgMHgxRikKLQliYm8JcjEwLHI4LG5lLmgJOyAofjExICYgMHgxRikKLQliYm8JcjEwLHI4LGd0LmgJOyAofjEyICYgMHgxRikKLQliYm8JcjEwLHI4LGxlLmgJOyAofjEzICYgMHgxRikKLQliYm8JcjEwLHI4LGx0LmgJOyAofjE0ICYgMHgxRikKLQliYm8JcjEwLHI4LGdlLmgJOyAofjE1ICYgMHgxRikKLQliYm8JcjEwLHI4LGhpLmgJOyAofjE2ICYgMHgxRikKLQliYm8JcjEwLHI4LGxzLmgJOyAofjE3ICYgMHgxRikKLQliYm8JcjEwLHI4LGxvLmgJOyAofjE4ICYgMHgxRikKLQliYm8JcjEwLHI4LGhzLmgJOyAofjE5ICYgMHgxRikKLQotCWJibwlyMTAscjgsZXEudwk7ICh+MjAgJiAweDFGKQotCWJibwlyMTAscjgsbmUudwk7ICh+MjEgJiAweDFGKQotCWJibwlyMTAscjgsZ3Qudwk7ICh+MjIgJiAweDFGKQotCWJibwlyMTAscjgsbGUudwk7ICh+MjMgJiAweDFGKQotCWJibwlyMTAscjgsbHQudwk7ICh+MjQgJiAweDFGKQotCWJibwlyMTAscjgsZ2Uudwk7ICh+MjUgJiAweDFGKQotCWJibwlyMTAscjgsaGkudwk7ICh+MjYgJiAweDFGKQotCWJibwlyMTAscjgsbHMudwk7ICh+MjcgJiAweDFGKQotCWJibwlyMTAscjgsbG8udwk7ICh+MjggJiAweDFGKQotCWJibwlyMTAscjgsaHMudwk7ICh+MjkgJiAweDFGKQotCi0JYmJvCXIxMCxyOCxlcS5mCTsgKH4yMCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxuZS5mCTsgKH4yMSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxndC5mCTsgKH4yMiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsZS5mCTsgKH4yMyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsdC5mCTsgKH4yNCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxnZS5mCTsgKH4yNSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxvdS5mCTsgKH4yNiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxpbi5mCTsgKH4yNyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxpYi5mCTsgKH4yOCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxvYi5mCTsgKH4yOSAmIDB4MUYpCi0JYmJvCXIxMCxyOCx1by5mCTsgKH4zMCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxvci5mCTsgKH4zMSAmIDB4MUYpCi0KLQliYm8JcjEwLHI4LDAKLQliYm8JcjEwLHI4LDEKLQliYm8JcjEwLHI4LDIKLQliYm8JcjEwLHI4LDMKLQliYm8JcjEwLHI4LDQKLQliYm8JcjEwLHI4LDUKLQliYm8JcjEwLHI4LDYKLQliYm8JcjEwLHI4LDcKLQliYm8JcjEwLHI4LDgKLQliYm8JcjEwLHI4LDkKLQliYm8JcjEwLHI4LDEwCi0JYmJvCXIxMCxyOCwxMQotCWJibwlyMTAscjgsMTIKLQliYm8JcjEwLHI4LDEzCi0JYmJvCXIxMCxyOCwxNAotCWJibwlyMTAscjgsMTUKLQliYm8JcjEwLHI4LDE2Ci0JYmJvCXIxMCxyOCwxNwotCWJibwlyMTAscjgsMTgKLQliYm8JcjEwLHI4LDE5Ci0JYmJvCXIxMCxyOCwyMAotCWJibwlyMTAscjgsMjEKLQliYm8JcjEwLHI4LDIyCi0JYmJvCXIxMCxyOCwyMwotCWJibwlyMTAscjgsMjQKLQliYm8JcjEwLHI4LDI1Ci0JYmJvCXIxMCxyOCwyNgotCWJibwlyMTAscjgsMjcKLQliYm8JcjEwLHI4LDI4Ci0JYmJvCXIxMCxyOCwyOQotCWJibwlyMTAscjgsMzAKLQliYm8JcjEwLHI4LDMxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEzOGFhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBjb3ZlcmFnZSBvZiBzeW1ib2xpYyBjb25kaXRpb24gY29kZSB2YWx1ZXMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTA3IGEwIDc5IDAxLioKLSAgIDQ6CTA3IGEwIDc5IDA5LioKLSAgIDg6CTA3IGEwIDc5IDExLioKLSAgIGM6CTA3IGEwIDc5IDE5LioKLSAgMTA6CTA3IGEwIDc5IDIxLioKLSAgMTQ6CTA3IGEwIDc5IDI5LioKLSAgMTg6CTA3IGEwIDc5IDMxLioKLSAgMWM6CTA3IGEwIDc5IDM5LioKLSAgMjA6CTA3IGEwIDc5IDQxLioKLSAgMjQ6CTA3IGEwIDc5IDQ5LioKLSAgMjg6CTA3IGEwIDc5IDUxLioKLSAgMmM6CTA3IGEwIDc5IDU5LioKLSAgMzA6CTA3IGEwIDc5IDYxLioKLSAgMzQ6CTA3IGEwIDc5IDY5LioKLSAgMzg6CTA3IGEwIDc5IDcxLioKLSAgM2M6CTA3IGEwIDc5IDc5LioKLSAgNDA6CTA3IGEwIDc5IDgxLioKLSAgNDQ6CTA3IGEwIDc5IDg5LioKLSAgNDg6CTA3IGEwIDc5IDkxLioKLSAgNGM6CTA3IGEwIDc5IDk5LioKLSAgNTA6CTA3IGEwIDc5IGExLioKLSAgNTQ6CTA3IGEwIDc5IGE5LioKLSAgNTg6CTA3IGEwIDc5IGIxLioKLSAgNWM6CTA3IGEwIDc5IGI5LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMzUxYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6NDkgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1jY29kZS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGVzdCB0aGF0IGFsbCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMgZm9yIHRoZSBjb25kaXRpb24KLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IGNvZGVzIGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7ICBBbHNvIHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlzYXNzZW1ibGVkIGNvcnJlY3RseSBhcyBzeW1ib2xpY3MuCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNSAwMDAwMDAwMCAgIDAxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZXYuYiAgICAgICAgICAgICA7IDAwMDAwCi0gICAgICAgIDYgMDAwMDAwMDQgICAwOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ3QwLmIgICAgICAgICAgICAgOyAwMDAwMQotICAgICAgICA3IDAwMDAwMDA4ICAgMTE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGVxMC5iICAgICAgICAgICAgIDsgMDAwMTAKLSAgICAgICAgOCAwMDAwMDAwQyAgIDE5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxnZTAuYiAgICAgICAgICAgICA7IDAwMDExCi0gICAgICAgIDkgMDAwMDAwMTAgICAyMTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbHQwLmIgICAgICAgICAgICAgOyAwMDEwMAotICAgICAgIDEwIDAwMDAwMDE0ICAgMjk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5lMC5iICAgICAgICAgICAgIDsgMDAxMDEKLSAgICAgICAxMSAwMDAwMDAxOCAgIDMxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsZTAuYiAgICAgICAgICAgICA7IDAwMTEwCi0gICAgICAgMTIgMDAwMDAwMUMgICAzOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsYWx3LmIgICAgICAgICAgICAgOyAwMDExMQotICAgICAgIDEzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTQgMDAwMDAwMjAgICA0MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmV2LmggICAgICAgICAgICAgOyAwMTAwMAotICAgICAgIDE1IDAwMDAwMDI0ICAgNDk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGd0MC5oICAgICAgICAgICAgIDsgMDEwMDEKLSAgICAgICAxNiAwMDAwMDAyOCAgIDUxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxlcTAuaCAgICAgICAgICAgICA7IDAxMDEwCi0gICAgICAgMTcgMDAwMDAwMkMgICA1OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ2UwLmggICAgICAgICAgICAgOyAwMTAxMQotICAgICAgIDE4IDAwMDAwMDMwICAgNjE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGx0MC5oICAgICAgICAgICAgIDsgMDExMDAKLSAgICAgICAxOSAwMDAwMDAzNCAgIDY5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZTAuaCAgICAgICAgICAgICA7IDAxMTAxCi0gICAgICAgMjAgMDAwMDAwMzggICA3MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbGUwLmggICAgICAgICAgICAgOyAwMTExMAotICAgICAgIDIxIDAwMDAwMDNDICAgNzk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGFsdy5oICAgICAgICAgICAgIDsgMDExMTEKLSAgICAgICAyMiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDIzIDAwMDAwMDQwICAgODE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5ldi53ICAgICAgICAgICAgIDsgMTAwMDAKLSAgICAgICAyNCAwMDAwMDA0NCAgIDg5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxndDAudyAgICAgICAgICAgICA7IDEwMDAxCi0gICAgICAgMjUgMDAwMDAwNDggICA5MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZXEwLncgICAgICAgICAgICAgOyAxMDAxMAotICAgICAgIDI2IDAwMDAwMDRDICAgOTk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGdlMC53ICAgICAgICAgICAgIDsgMTAwMTEKLSAgICAgICAyNyAwMDAwMDA1MCAgIEExNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsdDAudyAgICAgICAgICAgICA7IDEwMTAwCi0gICAgICAgMjggMDAwMDAwNTQgICBBOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmUwLncgICAgICAgICAgICAgOyAxMDEwMQotICAgICAgIDI5IDAwMDAwMDU4ICAgQjE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGxlMC53ICAgICAgICAgICAgIDsgMTAxMTAKLSAgICAgICAzMCAwMDAwMDA1QyAgIEI5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxhbHcudyAgICAgICAgICAgICA7IDEwMTExCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGFhYzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTs7IFRlc3QgdGhhdCBhbGwgdGhlIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciB0aGUgY29uZGl0aW9uCi07OyBjb2RlcyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuCi07OyAgQWxzbyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpc2Fzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLgotCi0JYmNuZC5hCXI3LHI1LG5ldi5iCQk7IDAwMDAwCi0JYmNuZC5hCXI3LHI1LGd0MC5iCQk7IDAwMDAxCi0JYmNuZC5hCXI3LHI1LGVxMC5iCQk7IDAwMDEwCi0JYmNuZC5hCXI3LHI1LGdlMC5iCQk7IDAwMDExCi0JYmNuZC5hCXI3LHI1LGx0MC5iCQk7IDAwMTAwCi0JYmNuZC5hCXI3LHI1LG5lMC5iCQk7IDAwMTAxCi0JYmNuZC5hCXI3LHI1LGxlMC5iCQk7IDAwMTEwCi0JYmNuZC5hCXI3LHI1LGFsdy5iCQk7IDAwMTExCi0KLQliY25kLmEJcjcscjUsbmV2LmgJCTsgMDEwMDAKLQliY25kLmEJcjcscjUsZ3QwLmgJCTsgMDEwMDEKLQliY25kLmEJcjcscjUsZXEwLmgJCTsgMDEwMTAKLQliY25kLmEJcjcscjUsZ2UwLmgJCTsgMDEwMTEKLQliY25kLmEJcjcscjUsbHQwLmgJCTsgMDExMDAKLQliY25kLmEJcjcscjUsbmUwLmgJCTsgMDExMDEKLQliY25kLmEJcjcscjUsbGUwLmgJCTsgMDExMTAKLQliY25kLmEJcjcscjUsYWx3LmgJCTsgMDExMTEKLQotCWJjbmQuYQlyNyxyNSxuZXYudwkJOyAxMDAwMAotCWJjbmQuYQlyNyxyNSxndDAudwkJOyAxMDAwMQotCWJjbmQuYQlyNyxyNSxlcTAudwkJOyAxMDAxMAotCWJjbmQuYQlyNyxyNSxnZTAudwkJOyAxMDAxMQotCWJjbmQuYQlyNyxyNSxsdDAudwkJOyAxMDEwMAotCWJjbmQuYQlyNyxyNSxuZTAudwkJOyAxMDEwMQotCWJjbmQuYQlyNyxyNSxsZTAudwkJOyAxMDExMAotCWJjbmQuYQlyNyxyNSxhbHcudwkJOyAxMDExMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI2MWU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMuZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIGNvbnRyb2wgcmVnaXN0ZXIgb3BlcmFuZHMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTM0IDAwIDAyIDEwLioKLSAgIDQ6CTM5IDAwIDAyIDEwLioKLSAgIDg6CTNhIDAwIDAyIDEwLioKLSAgIGM6CTAyIDAwIDAyIDEwLioKLSAgMTA6CTAwIDA1IDAyIDEwLioKLSAgMTQ6CTAwIDA0IDAyIDEwLioKLSAgMTg6CTAxIDA0IDAyIDEwLioKLSAgMWM6CTBhIDA0IDAyIDEwLioKLSAgMjA6CTBiIDA0IDAyIDEwLioKLSAgMjQ6CTBjIDA0IDAyIDEwLioKLSAgMjg6CTBkIDA0IDAyIDEwLioKLSAgMmM6CTBlIDA0IDAyIDEwLioKLSAgMzA6CTBmIDA0IDAyIDEwLioKLSAgMzQ6CTAyIDA0IDAyIDEwLioKLSAgMzg6CTAzIDA0IDAyIDEwLioKLSAgM2M6CTA0IDA0IDAyIDEwLioKLSAgNDA6CTA1IDA0IDAyIDEwLioKLSAgNDQ6CTA2IDA0IDAyIDEwLioKLSAgNDg6CTA3IDA0IDAyIDEwLioKLSAgNGM6CTA4IDA0IDAyIDEwLioKLSAgNTA6CTA5IDA0IDAyIDEwLioKLSAgNTQ6CTMzIDAwIDAyIDEwLioKLSAgNTg6CTAxIDAwIDAyIDEwLioKLSAgNWM6CTAwIDAwIDAyIDEwLioKLSAgNjA6CTExIDAwIDAyIDEwLioKLSAgNjQ6CTE0IDAwIDAyIDEwLioKLSAgNjg6CTEzIDAwIDAyIDEwLioKLSAgNmM6CTEwIDAwIDAyIDEwLioKLSAgNzA6CTEyIDAwIDAyIDEwLioKLSAgNzQ6CTA4IDAwIDAyIDEwLioKLSAgNzg6CTA2IDAwIDAyIDEwLioKLSAgN2M6CTAwIDAzIDAyIDEwLioKLSAgODA6CTAwIDQwIDAyIDEwLioKLSAgODQ6CTAxIDQwIDAyIDEwLioKLSAgODg6CTA0IDAwIDAyIDEwLioKLSAgOGM6CTAwIDAyIDAyIDEwLioKLSAgOTA6CTAxIDAyIDAyIDEwLioKLSAgOTQ6CTBhIDAyIDAyIDEwLioKLSAgOTg6CTBiIDAyIDAyIDEwLioKLSAgOWM6CTBjIDAyIDAyIDEwLioKLSAgYTA6CTBkIDAyIDAyIDEwLioKLSAgYTQ6CTBlIDAyIDAyIDEwLioKLSAgYTg6CTBmIDAyIDAyIDEwLioKLSAgYWM6CTAyIDAyIDAyIDEwLioKLSAgYjA6CTAzIDAyIDAyIDEwLioKLSAgYjQ6CTA0IDAyIDAyIDEwLioKLSAgYjg6CTA1IDAyIDAyIDEwLioKLSAgYmM6CTA2IDAyIDAyIDEwLioKLSAgYzA6CTA3IDAyIDAyIDEwLioKLSAgYzQ6CTA4IDAyIDAyIDEwLioKLSAgYzg6CTA5IDAyIDAyIDEwLioKLSAgY2M6CTMxIDAwIDAyIDEwLioKLSAgZDA6CTMwIDAwIDAyIDEwLioKLSAgZDQ6CTAyIDQwIDAyIDEwLioKLSAgZDg6CTBkIDAwIDAyIDEwLioKLSAgZGM6CTBhIDAwIDAyIDEwLioKLSAgZTA6CTIwIDAwIDAyIDEwLioKLSAgZTQ6CTIxIDAwIDAyIDEwLioKLSAgZTg6CTBlIDAwIDAyIDEwLioKLSAgZWM6CTBmIDAwIDAyIDEwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZWE1N2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6NTYgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1jcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGVzdCB0aGF0IGFsbCBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgY29udHJvbCByZWdpc3RlcnMKLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4gIEFsc28KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7IHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1IDAwMDAwMDAwICAgMTAwMjAwMzQgICAgICAgICByZGNyICAgIEFOQVNUQVQscjIKLSAgICAgICAgNiAwMDAwMDAwNCAgIDEwMDIwMDM5ICAgICAgICAgcmRjciAgICBCUksxLHIyCi0gICAgICAgIDcgMDAwMDAwMDggICAxMDAyMDAzQSAgICAgICAgIHJkY3IgICAgQlJLMixyMgotICAgICAgICA4IDAwMDAwMDBDICAgMTAwMjAwMDIgICAgICAgICByZGNyICAgIENPTkZJRyxyMgotICAgICAgICA5IDAwMDAwMDEwICAgMTAwMjA1MDAgICAgICAgICByZGNyICAgIERMUlUscjIKLSAgICAgICAxMCAwMDAwMDAxNCAgIDEwMDIwNDAwICAgICAgICAgcmRjciAgICBEVEFHMCxyMgotICAgICAgIDExIDAwMDAwMDE4ICAgMTAwMjA0MDEgICAgICAgICByZGNyICAgIERUQUcxLHIyCi0gICAgICAgMTIgMDAwMDAwMUMgICAxMDAyMDQwQSAgICAgICAgIHJkY3IgICAgRFRBRzEwLHIyCi0gICAgICAgMTMgMDAwMDAwMjAgICAxMDAyMDQwQiAgICAgICAgIHJkY3IgICAgRFRBRzExLHIyCi0gICAgICAgMTQgMDAwMDAwMjQgICAxMDAyMDQwQyAgICAgICAgIHJkY3IgICAgRFRBRzEyLHIyCi0gICAgICAgMTUgMDAwMDAwMjggICAxMDAyMDQwRCAgICAgICAgIHJkY3IgICAgRFRBRzEzLHIyCi0gICAgICAgMTYgMDAwMDAwMkMgICAxMDAyMDQwRSAgICAgICAgIHJkY3IgICAgRFRBRzE0LHIyCi0gICAgICAgMTcgMDAwMDAwMzAgICAxMDAyMDQwRiAgICAgICAgIHJkY3IgICAgRFRBRzE1LHIyCi0gICAgICAgMTggMDAwMDAwMzQgICAxMDAyMDQwMiAgICAgICAgIHJkY3IgICAgRFRBRzIscjIKLSAgICAgICAxOSAwMDAwMDAzOCAgIDEwMDIwNDAzICAgICAgICAgcmRjciAgICBEVEFHMyxyMgotICAgICAgIDIwIDAwMDAwMDNDICAgMTAwMjA0MDQgICAgICAgICByZGNyICAgIERUQUc0LHIyCi0gICAgICAgMjEgMDAwMDAwNDAgICAxMDAyMDQwNSAgICAgICAgIHJkY3IgICAgRFRBRzUscjIKLSAgICAgICAyMiAwMDAwMDA0NCAgIDEwMDIwNDA2ICAgICAgICAgcmRjciAgICBEVEFHNixyMgotICAgICAgIDIzIDAwMDAwMDQ4ICAgMTAwMjA0MDcgICAgICAgICByZGNyICAgIERUQUc3LHIyCi0gICAgICAgMjQgMDAwMDAwNEMgICAxMDAyMDQwOCAgICAgICAgIHJkY3IgICAgRFRBRzgscjIKLSAgICAgICAyNSAwMDAwMDA1MCAgIDEwMDIwNDA5ICAgICAgICAgcmRjciAgICBEVEFHOSxyMgotICAgICAgIDI2IDAwMDAwMDU0ICAgMTAwMjAwMzMgICAgICAgICByZGNyICAgIEVDT01DTlRMLHIyCi0gICAgICAgMjcgMDAwMDAwNTggICAxMDAyMDAwMSAgICAgICAgIHJkY3IgICAgRUlQLHIyCi0gICAgICAgMjggMDAwMDAwNUMgICAxMDAyMDAwMCAgICAgICAgIHJkY3IgICAgRVBDLHIyCi0gICAgICAgMjkgMDAwMDAwNjAgICAxMDAyMDAxMSAgICAgICAgIHJkY3IgICAgRkxUQURSLHIyCi0gICAgICAgMzAgMDAwMDAwNjQgICAxMDAyMDAxNCAgICAgICAgIHJkY3IgICAgRkxURFRILHIyCi0gICAgICAgMzEgMDAwMDAwNjggICAxMDAyMDAxMyAgICAgICAgIHJkY3IgICAgRkxURFRMLHIyCi0gICAgICAgMzIgMDAwMDAwNkMgICAxMDAyMDAxMCAgICAgICAgIHJkY3IgICAgRkxUT1AscjIKLSAgICAgICAzMyAwMDAwMDA3MCAgIDEwMDIwMDEyICAgICAgICAgcmRjciAgICBGTFRUQUcscjIKLSAgICAgICAzNCAwMDAwMDA3NCAgIDEwMDIwMDA4ICAgICAgICAgcmRjciAgICBGUFNULHIyCi0gICAgICAgMzUgMDAwMDAwNzggICAxMDAyMDAwNiAgICAgICAgIHJkY3IgICAgSUUscjIKLSAgICAgICAzNiAwMDAwMDA3QyAgIDEwMDIwMzAwICAgICAgICAgcmRjciAgICBJTFJVLHIyCi0gICAgICAgMzcgMDAwMDAwODAgICAxMDAyNDAwMCAgICAgICAgIHJkY3IgICAgSU4wUCxyMgotICAgICAgIDM4IDAwMDAwMDg0ICAgMTAwMjQwMDEgICAgICAgICByZGNyICAgIElOMVAscjIKLSAgICAgICAzOSAwMDAwMDA4OCAgIDEwMDIwMDA0ICAgICAgICAgcmRjciAgICBJTlRQRU4scjIKLSAgICAgICA0MCAwMDAwMDA4QyAgIDEwMDIwMjAwICAgICAgICAgcmRjciAgICBJVEFHMCxyMgotICAgICAgIDQxIDAwMDAwMDkwICAgMTAwMjAyMDEgICAgICAgICByZGNyICAgIElUQUcxLHIyCi0gICAgICAgNDIgMDAwMDAwOTQgICAxMDAyMDIwQSAgICAgICAgIHJkY3IgICAgSVRBRzEwLHIyCi0gICAgICAgNDMgMDAwMDAwOTggICAxMDAyMDIwQiAgICAgICAgIHJkY3IgICAgSVRBRzExLHIyCi0gICAgICAgNDQgMDAwMDAwOUMgICAxMDAyMDIwQyAgICAgICAgIHJkY3IgICAgSVRBRzEyLHIyCi0gICAgICAgNDUgMDAwMDAwQTAgICAxMDAyMDIwRCAgICAgICAgIHJkY3IgICAgSVRBRzEzLHIyCi0gICAgICAgNDYgMDAwMDAwQTQgICAxMDAyMDIwRSAgICAgICAgIHJkY3IgICAgSVRBRzE0LHIyCi0gICAgICAgNDcgMDAwMDAwQTggICAxMDAyMDIwRiAgICAgICAgIHJkY3IgICAgSVRBRzE1LHIyCi0gICAgICAgNDggMDAwMDAwQUMgICAxMDAyMDIwMiAgICAgICAgIHJkY3IgICAgSVRBRzIscjIKLSAgICAgICA0OSAwMDAwMDBCMCAgIDEwMDIwMjAzICAgICAgICAgcmRjciAgICBJVEFHMyxyMgotICAgICAgIDUwIDAwMDAwMEI0ICAgMTAwMjAyMDQgICAgICAgICByZGNyICAgIElUQUc0LHIyCi0gICAgICAgNTEgMDAwMDAwQjggICAxMDAyMDIwNSAgICAgICAgIHJkY3IgICAgSVRBRzUscjIKLSAgICAgICA1MiAwMDAwMDBCQyAgIDEwMDIwMjA2ICAgICAgICAgcmRjciAgICBJVEFHNixyMgotICAgICAgIDUzIDAwMDAwMEMwICAgMTAwMjAyMDcgICAgICAgICByZGNyICAgIElUQUc3LHIyCi0gICAgICAgNTQgMDAwMDAwQzQgICAxMDAyMDIwOCAgICAgICAgIHJkY3IgICAgSVRBRzgscjIKLSAgICAgICA1NSAwMDAwMDBDOCAgIDEwMDIwMjA5ICAgICAgICAgcmRjciAgICBJVEFHOSxyMgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDo1NiAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWNyZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgNTYgMDAwMDAwQ0MgICAxMDAyMDAzMSAgICAgICAgIHJkY3IgICAgTUlQLHIyCi0gICAgICAgNTcgMDAwMDAwRDAgICAxMDAyMDAzMCAgICAgICAgIHJkY3IgICAgTVBDLHIyCi0gICAgICAgNTggMDAwMDAwRDQgICAxMDAyNDAwMiAgICAgICAgIHJkY3IgICAgT1VUUCxyMgotICAgICAgIDU5IDAwMDAwMEQ4ICAgMTAwMjAwMEQgICAgICAgICByZGNyICAgIFBLVFJFUSxyMgotICAgICAgIDYwIDAwMDAwMERDICAgMTAwMjAwMEEgICAgICAgICByZGNyICAgIFBQRVJST1IscjIKLSAgICAgICA2MSAwMDAwMDBFMCAgIDEwMDIwMDIwICAgICAgICAgcmRjciAgICBTWVNTVEsscjIKLSAgICAgICA2MiAwMDAwMDBFNCAgIDEwMDIwMDIxICAgICAgICAgcmRjciAgICBTWVNUTVAscjIKLSAgICAgICA2MyAwMDAwMDBFOCAgIDEwMDIwMDBFICAgICAgICAgcmRjciAgICBUQ09VTlQscjIKLSAgICAgICA2NCAwMDAwMDBFQyAgIDEwMDIwMDBGICAgICAgICAgcmRjciAgICBUU0NBTEUscjIKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMGFkY2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotOzsgVGVzdCB0aGF0IGFsbCBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgY29udHJvbCByZWdpc3RlcnMKLTs7IGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4gIEFsc28KLTs7IHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KLQotCXJkY3IJQU5BU1RBVCxyMgotCXJkY3IJQlJLMSxyMgotCXJkY3IJQlJLMixyMgotCXJkY3IJQ09ORklHLHIyCi0JcmRjcglETFJVLHIyCi0JcmRjcglEVEFHMCxyMgotCXJkY3IJRFRBRzEscjIKLQlyZGNyCURUQUcxMCxyMgotCXJkY3IJRFRBRzExLHIyCi0JcmRjcglEVEFHMTIscjIKLQlyZGNyCURUQUcxMyxyMgotCXJkY3IJRFRBRzE0LHIyCi0JcmRjcglEVEFHMTUscjIKLQlyZGNyCURUQUcyLHIyCi0JcmRjcglEVEFHMyxyMgotCXJkY3IJRFRBRzQscjIKLQlyZGNyCURUQUc1LHIyCi0JcmRjcglEVEFHNixyMgotCXJkY3IJRFRBRzcscjIKLQlyZGNyCURUQUc4LHIyCi0JcmRjcglEVEFHOSxyMgotCXJkY3IJRUNPTUNOVEwscjIKLQlyZGNyCUVJUCxyMgotCXJkY3IJRVBDLHIyCi0JcmRjcglGTFRBRFIscjIKLQlyZGNyCUZMVERUSCxyMgotCXJkY3IJRkxURFRMLHIyCi0JcmRjcglGTFRPUCxyMgotCXJkY3IJRkxUVEFHLHIyCi0JcmRjcglGUFNULHIyCi0JcmRjcglJRSxyMgotCXJkY3IJSUxSVSxyMgotCXJkY3IJSU4wUCxyMgotCXJkY3IJSU4xUCxyMgotCXJkY3IJSU5UUEVOLHIyCi0JcmRjcglJVEFHMCxyMgotCXJkY3IJSVRBRzEscjIKLQlyZGNyCUlUQUcxMCxyMgotCXJkY3IJSVRBRzExLHIyCi0JcmRjcglJVEFHMTIscjIKLQlyZGNyCUlUQUcxMyxyMgotCXJkY3IJSVRBRzE0LHIyCi0JcmRjcglJVEFHMTUscjIKLQlyZGNyCUlUQUcyLHIyCi0JcmRjcglJVEFHMyxyMgotCXJkY3IJSVRBRzQscjIKLQlyZGNyCUlUQUc1LHIyCi0JcmRjcglJVEFHNixyMgotCXJkY3IJSVRBRzcscjIKLQlyZGNyCUlUQUc4LHIyCi0JcmRjcglJVEFHOSxyMgotCXJkY3IJTUlQLHIyCi0JcmRjcglNUEMscjIKLQlyZGNyCU9VVFAscjIKLQlyZGNyCVBLVFJFUSxyMgotCXJkY3IJUFBFUlJPUixyMgotCXJkY3IJU1lTU1RLLHIyCi0JcmRjcglTWVNUTVAscjIKLQlyZGNyCVRDT1VOVCxyMgotCXJkY3IJVFNDQUxFLHIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDA4NDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5kCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgY292ZXJhZ2Ugb2Ygc2hpZnQgaW5zdHJ1Y3Rpb24gRU5ETUFTSyBmaWVsZAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDUgMDAgYzcgNDkuKgotICAgNDoJMjUgMDAgYzcgNDkuKgotICAgODoJNDUgMDAgYzcgNDkuKgotICAgYzoJNjUgMDAgYzcgNDkuKgotICAxMDoJODUgMDAgYzcgNDkuKgotICAxNDoJYTUgMDAgYzcgNDkuKgotICAxODoJYzUgMDAgYzcgNDkuKgotICAxYzoJZTUgMDAgYzcgNDkuKgotICAyMDoJMDUgMDEgYzcgNDkuKgotICAyNDoJMjUgMDEgYzcgNDkuKgotICAyODoJNDUgMDEgYzcgNDkuKgotICAyYzoJNjUgMDEgYzcgNDkuKgotICAzMDoJODUgMDEgYzcgNDkuKgotICAzNDoJYTUgMDEgYzcgNDkuKgotICAzODoJYzUgMDEgYzcgNDkuKgotICAzYzoJZTUgMDEgYzcgNDkuKgotICA0MDoJMDUgMDIgYzcgNDkuKgotICA0NDoJMjUgMDIgYzcgNDkuKgotICA0ODoJNDUgMDIgYzcgNDkuKgotICA0YzoJNjUgMDIgYzcgNDkuKgotICA1MDoJODUgMDIgYzcgNDkuKgotICA1NDoJYTUgMDIgYzcgNDkuKgotICA1ODoJYzUgMDIgYzcgNDkuKgotICA1YzoJZTUgMDIgYzcgNDkuKgotICA2MDoJMDUgMDMgYzcgNDkuKgotICA2NDoJMjUgMDMgYzcgNDkuKgotICA2ODoJNDUgMDMgYzcgNDkuKgotICA2YzoJNjUgMDMgYzcgNDkuKgotICA3MDoJODUgMDMgYzcgNDkuKgotICA3NDoJYTUgMDMgYzcgNDkuKgotICA3ODoJYzUgMDMgYzcgNDkuKgotICA3YzoJZTUgMDMgYzcgNDkuKgotICA4MDoJMDUgMDAgYzcgNDkuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwM2IzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyOSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWVuZG1hc2sucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlIGVuZG1hc2sgaW4gYml0cyA1LTkuCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7OyBUaGUgbWFzayB0aGF0IGlzIHVzZWQgaXMgY29tcHV0ZWQgYXMgMioqYml0cy0xIHdoZXJlIGJpdHMKLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7IGFyZSB0aGUgYml0cyA1LTkgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgMCBhbmQgMzIKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIDs7IGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5LCBhbmQgZGlzYXNzZW1ibGVkIGFzIDAuCi0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNiAwMDAwMDAwMCAgIDQ5QzcwMDA1ICAgICAgICAgc2wuaXogICA1LDAscjcscjkKLSAgICAgICAgNyAwMDAwMDAwNCAgIDQ5QzcwMDI1ICAgICAgICAgc2wuaXogICA1LDEscjcscjkKLSAgICAgICAgOCAwMDAwMDAwOCAgIDQ5QzcwMDQ1ICAgICAgICAgc2wuaXogICA1LDIscjcscjkKLSAgICAgICAgOSAwMDAwMDAwQyAgIDQ5QzcwMDY1ICAgICAgICAgc2wuaXogICA1LDMscjcscjkKLSAgICAgICAxMCAwMDAwMDAxMCAgIDQ5QzcwMDg1ICAgICAgICAgc2wuaXogICA1LDQscjcscjkKLSAgICAgICAxMSAwMDAwMDAxNCAgIDQ5QzcwMEE1ICAgICAgICAgc2wuaXogICA1LDUscjcscjkKLSAgICAgICAxMiAwMDAwMDAxOCAgIDQ5QzcwMEM1ICAgICAgICAgc2wuaXogICA1LDYscjcscjkKLSAgICAgICAxMyAwMDAwMDAxQyAgIDQ5QzcwMEU1ICAgICAgICAgc2wuaXogICA1LDcscjcscjkKLSAgICAgICAxNCAwMDAwMDAyMCAgIDQ5QzcwMTA1ICAgICAgICAgc2wuaXogICA1LDgscjcscjkKLSAgICAgICAxNSAwMDAwMDAyNCAgIDQ5QzcwMTI1ICAgICAgICAgc2wuaXogICA1LDkscjcscjkKLSAgICAgICAxNiAwMDAwMDAyOCAgIDQ5QzcwMTQ1ICAgICAgICAgc2wuaXogICA1LDEwLHI3LHI5Ci0gICAgICAgMTcgMDAwMDAwMkMgICA0OUM3MDE2NSAgICAgICAgIHNsLml6ICAgNSwxMSxyNyxyOQotICAgICAgIDE4IDAwMDAwMDMwICAgNDlDNzAxODUgICAgICAgICBzbC5peiAgIDUsMTIscjcscjkKLSAgICAgICAxOSAwMDAwMDAzNCAgIDQ5QzcwMUE1ICAgICAgICAgc2wuaXogICA1LDEzLHI3LHI5Ci0gICAgICAgMjAgMDAwMDAwMzggICA0OUM3MDFDNSAgICAgICAgIHNsLml6ICAgNSwxNCxyNyxyOQotICAgICAgIDIxIDAwMDAwMDNDICAgNDlDNzAxRTUgICAgICAgICBzbC5peiAgIDUsMTUscjcscjkKLSAgICAgICAyMiAwMDAwMDA0MCAgIDQ5QzcwMjA1ICAgICAgICAgc2wuaXogICA1LDE2LHI3LHI5Ci0gICAgICAgMjMgMDAwMDAwNDQgICA0OUM3MDIyNSAgICAgICAgIHNsLml6ICAgNSwxNyxyNyxyOQotICAgICAgIDI0IDAwMDAwMDQ4ICAgNDlDNzAyNDUgICAgICAgICBzbC5peiAgIDUsMTgscjcscjkKLSAgICAgICAyNSAwMDAwMDA0QyAgIDQ5QzcwMjY1ICAgICAgICAgc2wuaXogICA1LDE5LHI3LHI5Ci0gICAgICAgMjYgMDAwMDAwNTAgICA0OUM3MDI4NSAgICAgICAgIHNsLml6ICAgNSwyMCxyNyxyOQotICAgICAgIDI3IDAwMDAwMDU0ICAgNDlDNzAyQTUgICAgICAgICBzbC5peiAgIDUsMjEscjcscjkKLSAgICAgICAyOCAwMDAwMDA1OCAgIDQ5QzcwMkM1ICAgICAgICAgc2wuaXogICA1LDIyLHI3LHI5Ci0gICAgICAgMjkgMDAwMDAwNUMgICA0OUM3MDJFNSAgICAgICAgIHNsLml6ICAgNSwyMyxyNyxyOQotICAgICAgIDMwIDAwMDAwMDYwICAgNDlDNzAzMDUgICAgICAgICBzbC5peiAgIDUsMjQscjcscjkKLSAgICAgICAzMSAwMDAwMDA2NCAgIDQ5QzcwMzI1ICAgICAgICAgc2wuaXogICA1LDI1LHI3LHI5Ci0gICAgICAgMzIgMDAwMDAwNjggICA0OUM3MDM0NSAgICAgICAgIHNsLml6ICAgNSwyNixyNyxyOQotICAgICAgIDMzIDAwMDAwMDZDICAgNDlDNzAzNjUgICAgICAgICBzbC5peiAgIDUsMjcscjcscjkKLSAgICAgICAzNCAwMDAwMDA3MCAgIDQ5QzcwMzg1ICAgICAgICAgc2wuaXogICA1LDI4LHI3LHI5Ci0gICAgICAgMzUgMDAwMDAwNzQgICA0OUM3MDNBNSAgICAgICAgIHNsLml6ICAgNSwyOSxyNyxyOQotICAgICAgIDM2IDAwMDAwMDc4ICAgNDlDNzAzQzUgICAgICAgICBzbC5peiAgIDUsMzAscjcscjkKLSAgICAgICAzNyAwMDAwMDA3QyAgIDQ5QzcwM0U1ICAgICAgICAgc2wuaXogICA1LDMxLHI3LHI5Ci0gICAgICAgMzggMDAwMDAwODAgICA0OUM3MDAwNSAgICAgICAgIHNsLml6ICAgNSwzMixyNyxyOQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2sucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2sucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2YWVkZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi07OyBUZXN0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlIGVuZG1hc2sgaW4gYml0cyA1LTkuCi07OyBUaGUgbWFzayB0aGF0IGlzIHVzZWQgaXMgY29tcHV0ZWQgYXMgMioqYml0cy0xIHdoZXJlIGJpdHMKLTs7IGFyZSB0aGUgYml0cyA1LTkgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgMCBhbmQgMzIKLTs7IGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5LCBhbmQgZGlzYXNzZW1ibGVkIGFzIDAuCi0KLQlzbC5pegk1LDAscjcscjkKLQlzbC5pegk1LDEscjcscjkKLQlzbC5pegk1LDIscjcscjkKLQlzbC5pegk1LDMscjcscjkKLQlzbC5pegk1LDQscjcscjkKLQlzbC5pegk1LDUscjcscjkKLQlzbC5pegk1LDYscjcscjkKLQlzbC5pegk1LDcscjcscjkKLQlzbC5pegk1LDgscjcscjkKLQlzbC5pegk1LDkscjcscjkKLQlzbC5pegk1LDEwLHI3LHI5Ci0Jc2wuaXoJNSwxMSxyNyxyOQotCXNsLml6CTUsMTIscjcscjkKLQlzbC5pegk1LDEzLHI3LHI5Ci0Jc2wuaXoJNSwxNCxyNyxyOQotCXNsLml6CTUsMTUscjcscjkKLQlzbC5pegk1LDE2LHI3LHI5Ci0Jc2wuaXoJNSwxNyxyNyxyOQotCXNsLml6CTUsMTgscjcscjkKLQlzbC5pegk1LDE5LHI3LHI5Ci0Jc2wuaXoJNSwyMCxyNyxyOQotCXNsLml6CTUsMjEscjcscjkKLQlzbC5pegk1LDIyLHI3LHI5Ci0Jc2wuaXoJNSwyMyxyNyxyOQotCXNsLml6CTUsMjQscjcscjkKLQlzbC5pegk1LDI1LHI3LHI5Ci0Jc2wuaXoJNSwyNixyNyxyOQotCXNsLml6CTUsMjcscjcscjkKLQlzbC5pegk1LDI4LHI3LHI5Ci0Jc2wuaXoJNSwyOSxyNyxyOQotCXNsLml6CTUsMzAscjcscjkKLQlzbC5pegk1LDMxLHI3LHI5Ci0Jc2wuaXoJNSwzMixyNyxyOQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZWI4NWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQuZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHNpbXBsZSBmbG9hdGluZyBwb2ludCBvcGVyYW5kcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJODAgMTIgYmUgNTEgMTYgNjggYTkgNjUuKgotICAgODoJMDAgMTIgYmUgNTEgMTYgNjggYTkgZTUuKgotICAxMDoJMDAgMTAgYmUgNTEgOWEgNmQgNDEgMTkuKgotICAxODoJODAgYjAgM2UgNTIgOWEgNmQgNDEgOTkuKgotICAyMDoJMDAgYjAgM2UgNTIgMDAgMDAgMDAgMDAuKgotICAyODoJODAgNzIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICAzMDoJMDAgNzIgYmUgNTEgMDAgMDAgMDAgM2YuKgotICAzODoJMDAgNzAgYmUgNTEgMDAgMDAgODAgNDUuKgotICA0MDoJODAgNTIgYmUgNTEgMDAgMDAgODAgYzUuKgotICA0ODoJMDAgNTIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICA1MDoJMDAgNTAgYmUgNTEgMDAgMDAgMDAgNDAuKgotICA1ODoJODAgOTMgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA2MDoJODAgOTUgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA2ODoJODAgOTEgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA3MDoJODAgOTcgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA3ODoJMDAgOTIgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA4MDoJMDAgOTQgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA4ODoJMDAgOTAgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA5MDoJMDAgOTYgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA5ODoJMDAgOTMgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBhMDoJMDAgOTUgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBhODoJMDAgOTEgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBiMDoJMDAgOTcgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBiODoJODAgOTIgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBjMDoJODAgOTQgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBjODoJODAgOTAgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBkMDoJODAgOTYgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBkODoJMDAgZjIgM2UgNTAgMDAgMDAgMDAgNDAuKgotICBlMDoJMDAgZjAgM2UgNTAgMDAgMDAgMDAgNDAuKgotICBlODoJODAgMzIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICBmMDoJMDAgMzIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICBmODoJMDAgMzAgYmUgNTEgMDAgMDAgMDAgNDAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTM0NTkwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAyMjowOTowOSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWZsb2F0LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgMDAwMDAwMDAgICA1MUJFMTI4MCAgICAgICAgIGZhZGQuc2RkICAgICAgICAxLjBFMjMscjYscjEwICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDA0ICAgNjVBOTY4MTYgCi0gICAgICAgIDIgMDAwMDAwMDggICA1MUJFMTIwMCAgICAgICAgIGZhZGQuc3NkICAgICAgICAtMS4wRTIzLHI2LHIxMCAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDBDICAgRTVBOTY4MTYgCi0gICAgICAgIDMgMDAwMDAwMTAgICA1MUJFMTAwMCAgICAgICAgIGZhZGQuc3NzICAgICAgICAxLjBFLTIzLHI2LHIxMCAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDE0ICAgMTk0MTZEOUEgCi0gICAgICAgIDQgMDAwMDAwMTggICA1MjNFQjA4MCAgICAgICAgIGZjbXAuc2QgICAgICAgICAtMS4wRS0yMyxyOCxyMTAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDFDICAgOTk0MTZEOUEgCi0gICAgICAgIDUgMDAwMDAwMjAgICA1MjNFQjAwMCAgICAgICAgIGZjbXAuc3MgICAgICAgICAwLjAscjgscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDI0ICAgMDAwMDAwMDAgCi0gICAgICAgIDYgMDAwMDAwMjggICA1MUJFNzI4MCAgICAgICAgIGZkaXYuc2RkICAgICAgICAyLjAscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDJDICAgNDAwMDAwMDAgCi0gICAgICAgIDcgMDAwMDAwMzAgICA1MUJFNzIwMCAgICAgICAgIGZkaXYuc3NkICAgICAgICAwLjUscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDM0ICAgM0YwMDAwMDAgCi0gICAgICAgIDggMDAwMDAwMzggICA1MUJFNzAwMCAgICAgICAgIGZkaXYuc3NzICAgICAgICA0MDk2LjAscjYscjEwICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDNDICAgNDU4MDAwMDAgCi0gICAgICAgIDkgMDAwMDAwNDAgICA1MUJFNTI4MCAgICAgICAgIGZtcHkuc2RkICAgICAgICAtNDA5Ni4wLHI2LHIxMCAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDQ0ICAgQzU4MDAwMDAgCi0gICAgICAgMTAgMDAwMDAwNDggICA1MUJFNTIwMCAgICAgICAgIGZtcHkuc3NkICAgICAgICAyLjAscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDRDICAgNDAwMDAwMDAgCi0gICAgICAgMTEgMDAwMDAwNTAgICA1MUJFNTAwMCAgICAgICAgIGZtcHkuc3NzICAgICAgICAyLjAscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDU0ICAgNDAwMDAwMDAgCi0gICAgICAgMTIgMDAwMDAwNTggICA0MDNFOTM4MCAgICAgICAgIGZybmRtLnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDVDICAgNDAwMDAwMDAgCi0gICAgICAgMTMgMDAwMDAwNjAgICA0MDNFOTU4MCAgICAgICAgIGZybmRtLnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDY0ICAgNDAwMDAwMDAgCi0gICAgICAgMTQgMDAwMDAwNjggICA0MDNFOTE4MCAgICAgICAgIGZybmRtLnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDZDICAgNDAwMDAwMDAgCi0gICAgICAgMTUgMDAwMDAwNzAgICA0MDNFOTc4MCAgICAgICAgIGZybmRtLnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDc0ICAgNDAwMDAwMDAgCi0gICAgICAgMTYgMDAwMDAwNzggICA0MDNFOTIwMCAgICAgICAgIGZybmRuLnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDdDICAgNDAwMDAwMDAgCi0gICAgICAgMTcgMDAwMDAwODAgICA0MDNFOTQwMCAgICAgICAgIGZybmRuLnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDg0ICAgNDAwMDAwMDAgCi0gICAgICAgMTggMDAwMDAwODggICA0MDNFOTAwMCAgICAgICAgIGZybmRuLnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDhDICAgNDAwMDAwMDAgCi0gICAgICAgMTkgMDAwMDAwOTAgICA0MDNFOTYwMCAgICAgICAgIGZybmRuLnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDk0ICAgNDAwMDAwMDAgCi0gICAgICAgMjAgMDAwMDAwOTggICA0MDNFOTMwMCAgICAgICAgIGZybmRwLnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDlDICAgNDAwMDAwMDAgCi0gICAgICAgMjEgMDAwMDAwQTAgICA0MDNFOTUwMCAgICAgICAgIGZybmRwLnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEE0ICAgNDAwMDAwMDAgCi0gICAgICAgMjIgMDAwMDAwQTggICA0MDNFOTEwMCAgICAgICAgIGZybmRwLnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEFDICAgNDAwMDAwMDAgCi0gICAgICAgMjMgMDAwMDAwQjAgICA0MDNFOTcwMCAgICAgICAgIGZybmRwLnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEI0ICAgNDAwMDAwMDAgCi0gICAgICAgMjQgMDAwMDAwQjggICA0MDNFOTI4MCAgICAgICAgIGZybmR6LnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEJDICAgNDAwMDAwMDAgCi0gICAgICAgMjUgMDAwMDAwQzAgICA0MDNFOTQ4MCAgICAgICAgIGZybmR6LnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEM0ICAgNDAwMDAwMDAgCi0gICAgICAgMjYgMDAwMDAwQzggICA0MDNFOTA4MCAgICAgICAgIGZybmR6LnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMENDICAgNDAwMDAwMDAgCi0gICAgICAgMjcgMDAwMDAwRDAgICA0MDNFOTY4MCAgICAgICAgIGZybmR6LnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEQ0ICAgNDAwMDAwMDAgCi0gICAgICAgMjggMDAwMDAwRDggICA1MDNFRjIwMCAgICAgICAgIGZzcXJ0LnNkICAgICAgICAyLjAscjEwICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAyMjowOTowOSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWZsb2F0LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgICAgMDAwMDAwREMgICA0MDAwMDAwMCAKLSAgICAgICAyOSAwMDAwMDBFMCAgIDUwM0VGMDAwICAgICAgICAgZnNxcnQuc3MgICAgICAgIDIuMCxyMTAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRTQgICA0MDAwMDAwMCAKLSAgICAgICAzMCAwMDAwMDBFOCAgIDUxQkUzMjgwICAgICAgICAgZnN1Yi5zZGQgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRUMgICA0MDAwMDAwMCAKLSAgICAgICAzMSAwMDAwMDBGMCAgIDUxQkUzMjAwICAgICAgICAgZnN1Yi5zc2QgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRjQgICA0MDAwMDAwMCAKLSAgICAgICAzMiAwMDAwMDBGOCAgIDUxQkUzMDAwICAgICAgICAgZnN1Yi5zc3MgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRkMgICA0MDAwMDAwMCAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhMmI3YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotCWZhZGQuc2RkCTBmMS4wRTIzLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmFkZC5zc2QJMGYtMS4wRTIzLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmFkZC5zc3MJMGYxLjBFLTIzLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmNtcC5zZAkJMGYtMS4wRS0yMyxyOCxyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZjbXAuc3MJCTBmMC4wLHI4LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmRpdi5zZGQJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmZGl2LnNzZAkwZjAuNSxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZkaXYuc3NzCTBmNDA5Ni4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZm1weS5zZGQJMGYtNDA5Ni4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZm1weS5zc2QJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmbXB5LnNzcwkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRtLnNkCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG0uc2kJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbS5zcwkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRtLnN1CTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG4uc2QJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbi5zaQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRuLnNzCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG4uc3UJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kcC5zZAkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRwLnNpCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHAuc3MJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kcC5zdQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmR6LnNkCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHouc2kJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kei5zcwkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmR6LnN1CTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnNxcnQuc2QJMGYyLjAscjEwCQk7IEltbWVkaWF0ZSBmb3JtCi0JZnNxcnQuc3MJMGYyLjAscjEwCQk7IEltbWVkaWF0ZSBmb3JtCi0JZnN1Yi5zZGQJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmc3ViLnNzZAkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZzdWIuc3NzCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDBmYTg1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwMyAwMCAzYiAyOS4qCi0gICA0OgkwMyAyMCAzYiAyOS4qCi0gICA4OgkwNSAyMCAzMiAxMS4qCi0gICBjOgkwNSAyMCAzMiAxMS4qCi0gIDEwOgkwYSAwMCAzMyA3My4qCi0gIDE0OgkwYSA4MCAzMiA3My4qCi0gIDE4OgkwYSA0MCAzMiA3My4qCi0gIDFjOgkwYSA0MCAzOSAxYS4qCi0gIDIwOgkwYSA2MCAzOSBmYS4qCi0gIDI0OgkwYSAwMCAzOSAyMi4qCi0gIDI4OgkwYSAyMCAzOSAyYS4qCi0gIDJjOgkwNCA4MCBiOSAyMS4qCi0gIDMwOgkwNCBhMCBiOSAyMS4qCi0gIDM0OgkwNiAwMCAzOSAwMC4qCi0gIDM4OgkwNiAyMCAzOSAwMC4qCi0gIDNjOgkwYSAwMCAwMyAwMC4qCi0gIDQwOgkwNiAwMCAzOCBmOC4qCi0gIDQ0OgkwNiAyMCAzOCBmOC4qCi0gIDQ4OgkwNyA0MCAzMCAwMC4qCi0gIDRjOgkwMyAwMCAzYSAyOS4qCi0gIDUwOgkwOCAwMCBiNyAwMi4qCi0gIDU0OgkwOCAwMCBiNyAwYS4qCi0gIDU4OgkwNCAwNCBiNCA0MS4qCi0gIDVjOgkwNCAyNCBiNCA0MS4qCi0gIDYwOgkwNCA0NCBiNCA0MS4qCi0gIDY0OgkwNCA2NCBiNCA0MS4qCi0gIDY4OgkwNCAwNCBiNSA0MS4qCi0gIDZjOgkwNCAyNCBiNSA0MS4qCi0gIDcwOgkwNCAwNCBiNiA0MS4qCi0gIDc0OgkwNCAyNCBiNiA0MS4qCi0gIDc4OgkwNCA0NCBiNiA0MS4qCi0gIDdjOgkwNCA2NCBiNiA0MS4qCi0gIDgwOgkwNSAyMCAzMCAwOC4qCi0gIDg0OgllMyA0NyA3MSAzMS4qCi0gIDg4OgljMiAwNyA3MSA0OS4qCi0gIDhjOgkwMiAwMCAzZSAzMS4qCi0gIDkwOgkwMiAwMiAzZSAzMS4qCi0gIDk0Ogk4MiAwMiAzZSAzMS4qCi0gIDk4OgkyMiAwMiAzZSAzMS4qCi0gIDljOglhMiAwMiAzZSAzMS4qCi0gIGEwOgkwNCBhMCBiZSA0MS4qCi0gIGE0Ogk4NCBhMCBiZSA0MS4qCi0gIGE4OgkyNCBhMCBiZSA0MS4qCi0gIGFjOglhNCBhMCBiZSA0MS4qCi0gIGIwOgkwMiA2MCAzZSAzMS4qCi0gIGI0OgkwMiA2MiAzZSAzMS4qCi0gIGI4Ogk4MiA2MiAzZSAzMS4qCi0gIGJjOgkyMiA2MiAzZSAzMS4qCi0gIGMwOglhMiA2MiAzZSAzMS4qCi0gIGM0OgkwMiA0MCAzZSAzMS4qCi0gIGM4OgkwMiA0MiAzZSAzMS4qCi0gIGNjOgk4MiA0MiAzZSAzMS4qCi0gIGQwOgkyMiA0MiAzZSAzMS4qCi0gIGQ0OglhMiA0MiAzZSAzMS4qCi0gIGQ4Ogk0MiA0NSAzZSAzMS4qCi0gIGRjOgllMiA0NyAzZSAzMS4qCi0gIGUwOgk4NCA4MSAzZSAzMC4qCi0gIGU0Ogk4NCA4MyAzZSAzMC4qCi0gIGU4Ogk4NCA4NSAzZSAzMC4qCi0gIGVjOgk4NCA4NyAzZSAzMC4qCi0gIGYwOglhMiA4MSAzZSA0MC4qCi0gIGY0OglhMiA4MyAzZSA0MC4qCi0gIGY4OglhMiA4NSAzZSA0MC4qCi0gIGZjOglhMiA4NyAzZSA0MC4qCi0gMTAwOgljNCA4MSAzZSAzMC4qCi0gMTA0OgljNCA4MyAzZSAzMC4qCi0gMTA4OgllMiA4MSAzZSA0MC4qCi0gMTBjOgllMiA4MyAzZSA0MC4qCi0gMTEwOgkwNCA4MCAzZSAzMC4qCi0gMTE0OgkwNCA4MiAzZSAzMC4qCi0gMTE4OgkwNCA4NCAzZSAzMC4qCi0gMTFjOgkwNCA4NiAzZSAzMC4qCi0gMTIwOgkyMiA4MCAzZSA0MC4qCi0gMTI0OgkyMiA4MiAzZSA0MC4qCi0gMTI4OgkyMiA4NCAzZSA0MC4qCi0gMTJjOgkyMiA4NiAzZSA0MC4qCi0gMTMwOgk0NCA4MCAzZSAzMC4qCi0gMTM0Ogk0NCA4MiAzZSAzMC4qCi0gMTM4Ogk2MiA4MCAzZSA0MC4qCi0gMTNjOgk2MiA4MiAzZSA0MC4qCi0gMTQwOgkwNCA4MSAzZSAzMC4qCi0gMTQ0OgkwNCA4MyAzZSAzMC4qCi0gMTQ4OgkwNCA4NSAzZSAzMC4qCi0gMTRjOgkwNCA4NyAzZSAzMC4qCi0gMTUwOgkyMiA4MSAzZSA0MC4qCi0gMTU0OgkyMiA4MyAzZSA0MC4qCi0gMTU4OgkyMiA4NSAzZSA0MC4qCi0gMTVjOgkyMiA4NyAzZSA0MC4qCi0gMTYwOgk0NCA4MSAzZSAzMC4qCi0gMTY0Ogk0NCA4MyAzZSAzMC4qCi0gMTY4Ogk2MiA4MSAzZSA0MC4qCi0gMTZjOgk2MiA4MyAzZSA0MC4qCi0gMTcwOgk4NCA4MCAzZSAzMC4qCi0gMTc0Ogk4NCA4MiAzZSAzMC4qCi0gMTc4Ogk4NCA4NCAzZSAzMC4qCi0gMTdjOgk4NCA4NiAzZSAzMC4qCi0gMTgwOglhMiA4MCAzZSA0MC4qCi0gMTg0OglhMiA4MiAzZSA0MC4qCi0gMTg4OglhMiA4NCAzZSA0MC4qCi0gMThjOglhMiA4NiAzZSA0MC4qCi0gMTkwOgljNCA4MCAzZSAzMC4qCi0gMTk0OgljNCA4MiAzZSAzMC4qCi0gMTk4OgllMiA4MCAzZSA0MC4qCi0gMTljOgllMiA4MiAzZSA0MC4qCi0gMWEwOgkwNiBlMCAzZSA0MC4qCi0gMWE0OgkwNiBlMiAzZSA0MC4qCi0gMWE4OgkyNiBlMiAzZSA0MC4qCi0gMWFjOgkwMiAyMCAzZSAzMS4qCi0gMWIwOgkwMiAyMiAzZSAzMS4qCi0gMWI0Ogk4MiAyMiAzZSAzMS4qCi0gMWI4OgkyMiAyMiAzZSAzMS4qCi0gMWJjOglhMiAyMiAzZSAzMS4qCi0gMWMwOgllNCBlMyAzMSA1Mi4qCi0gMWM0OgkwNCA4MCBiOCA0MS4qCi0gMWM4OgkwNCBhMCBiOCA0MS4qCi0gMWNjOgkwNCAwMCBiNCA0MS4qCi0gMWQwOgkwNCAyMCBiNCA0MS4qCi0gMWQ0OgkwNCA0MCBiNCA0MS4qCi0gMWQ4OgkwNCA2MCBiNCA0MS4qCi0gMWRjOgkwNCAwMCBiNSA0MS4qCi0gMWUwOgkwNCAyMCBiNSA0MS4qCi0gMWU0OgkwMCAwMCBmZiA0MS4qCi0gMWU4OgkwMSBlMCBiMiAxOC4qCi0gMWVjOgkwMSBlMCBiMiAxOC4qCi0gMWYwOgkwMSBjMCBiMyAxOC4qCi0gMWY0OgkwMSBhMCBiMyAxOC4qCi0gMWY4OgkwMSA2MCBiMyAxOC4qCi0gMWZjOgkwNiA4MCAzMCAyMC4qCi0gMjAwOgkwMCAyMCAzZiAyOS4qCi0gMjA0OgllMiAwMyAzMSA1Mi4qCi0gMjA4OgllOCAwNyBiMSAzMC4qCi0gMjBjOgllNCBjMyBiMSAzMC4qCi0gMjEwOgk4NCAwMSA3MSAzMS4qCi0gMjE0Ogk4NCAyMSA3MSAzMS4qCi0gMjE4Ogk4NCA0MSA3MSAzMS4qCi0gMjFjOgk4NCA2MSA3MSAzMS4qCi0gMjIwOgk4NCA4MSA3MSAzMS4qCi0gMjI0Ogk4NCBhMSA3MSAzMS4qCi0gMjI4Ogk4NCBjMSA3MSAzMS4qCi0gMjJjOgk4NCBlMSA3MSAzMS4qCi0gMjMwOgk4NCAwOSA3MSAzMS4qCi0gMjM0Ogk4NCAyOSA3MSAzMS4qCi0gMjM4Ogk4NCA0OSA3MSAzMS4qCi0gMjNjOgk4NCA2OSA3MSAzMS4qCi0gMjQwOgk4NCA4OSA3MSAzMS4qCi0gMjQ0Ogk4NCBhOSA3MSAzMS4qCi0gMjQ4Ogk4NCBjOSA3MSAzMS4qCi0gMjRjOgk4NCBlOSA3MSAzMS4qCi0gMjUwOgk4NCAwNSA3MSAzMS4qCi0gMjU0Ogk4NCAyNSA3MSAzMS4qCi0gMjU4Ogk4NCA0NSA3MSAzMS4qCi0gMjVjOgk4NCA2NSA3MSAzMS4qCi0gMjYwOgk4NCA4NSA3MSAzMS4qCi0gMjY0Ogk4NCBhNSA3MSAzMS4qCi0gMjY4Ogk4NCBjNSA3MSAzMS4qCi0gMjZjOgk4NCBlNSA3MSAzMS4qCi0gMjcwOgkwNCBhNCBiMSA0MS4qCi0gMjc0Ogk4NCAwZCA3MSAzMS4qCi0gMjc4Ogk4NCAyZCA3MSAzMS4qCi0gMjdjOgk4NCA0ZCA3MSAzMS4qCi0gMjgwOgk4NCA2ZCA3MSAzMS4qCi0gMjg0Ogk4NCA4ZCA3MSAzMS4qCi0gMjg4Ogk4NCBhZCA3MSAzMS4qCi0gMjhjOgk4NCBjZCA3MSAzMS4qCi0gMjkwOgk4NCBlZCA3MSAzMS4qCi0gMjk0OgkwNCA2NCBiMSA0MS4qCi0gMjk4OgkwNCAwMCBiNiA0MS4qCi0gMjljOgkwNCAyMCBiNiA0MS4qCi0gMmEwOgkwNCA0MCBiNiA0MS4qCi0gMmE0OgkwNCA2MCBiNiA0MS4qCi0gMmE4OgkwNyA0MCAzYiA0YS4qCi0gMmFjOgkwNyA2MCAzYiA0YS4qCi0gMmIwOgkwOCBhMCBiMCAyMS4qCi0gMmI0OgkwYSAyMCAzMCAwMC4qCi0gMmI4OgkwMiAwMCAzYyAwMS4qCi0gMmJjOgk4MiAwMCBiYyAwMS4qCi0gMmMwOglhMiAwMCBiYyAwMi4qCi0gMmM0OgkwNiBhMCA3MCAwMS4qCi0gMmM4OgkwNSAyMCBiMyAzOS4qCi0gMmNjOgkwNyBjMCAzMiA0YS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4OWRkMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBTaW1wbGUgcmVnaXN0ZXIgZm9ybXMKLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IFRob3NlIGluc3RydWN0aW9ucyB3aGljaCBhbHNvIHVzZSBhbiBpbW1lZGlhdGUganVzdCB1c2UgYSBjb25zdGFudC4KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA0IDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAudGV4dAotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDYgMDAwMDAwMDAgICAyOTNCMDAwMyAgICAgICAgIGFkZCAgICAgICAgICAgICByMyxyNCxyNQotICAgICAgICA3IDAwMDAwMDA0ICAgMjkzQjIwMDMgICAgICAgICBhZGR1ICAgICAgICAgICAgcjMscjQscjUKLSAgICAgICAgOCAwMDAwMDAwOCAgIDExMzIyMDA1ICAgICAgICAgYW5kICAgICAgICAgICAgIHI1LHI0LHIyCi0gICAgICAgIDkgMDAwMDAwMEMgICAxMTMyMjAwNSAgICAgICAgIGFuZC50dCAgICAgICAgICByNSxyNCxyMgotICAgICAgIDEwIDAwMDAwMDEwICAgNzMzMzAwMEEgICAgICAgICBhbmQuZmYgICAgICAgICAgcjEwLHIxMixyMTQKLSAgICAgICAxMSAwMDAwMDAxNCAgIDczMzI4MDBBICAgICAgICAgYW5kLmZ0ICAgICAgICAgIHIxMCxyMTIscjE0Ci0gICAgICAgMTIgMDAwMDAwMTggICA3MzMyNDAwQSAgICAgICAgIGFuZC50ZiAgICAgICAgICByMTAscjEyLHIxNAotICAgICAgIDEzIDAwMDAwMDFDICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgICAgICAgICAgcjEwLHI4LGxvLncKLSAgICAgICAxNCAwMDAwMDAyMCAgIEZBMzk2MDBBICAgICAgICAgYmJvLmEgICAgICAgICAgIHIxMCxyOCxlcS5iCi0gICAgICAgMTUgMDAwMDAwMjQgICAyMjM5MDAwQSAgICAgICAgIGJieiAgICAgICAgICAgICByMTAscjgsbHMudwotICAgICAgIDE2IDAwMDAwMDI4ICAgMkEzOTIwMEEgICAgICAgICBiYnouYSAgICAgICAgICAgcjEwLHI4LGhpLncKLSAgICAgICAxNyAwMDAwMDAyQyAgIDIxQjk4MDA0ICAgICAgICAgYmNuZCAgICAgICAgICAgIHI0LHI2LGx0MC5iCi0gICAgICAgMTggMDAwMDAwMzAgICAyMUI5QTAwNCAgICAgICAgIGJjbmQuYSAgICAgICAgICByNCxyNixsdDAuYgotICAgICAgIDE5IDAwMDAwMDM0ICAgMDAzOTAwMDYgICAgICAgICBiciAgICAgICAgICAgICAgcjYKLSAgICAgICAyMCAwMDAwMDAzOCAgIDAwMzkyMDA2ICAgICAgICAgYnIuYSAgICAgICAgICAgIHI2Ci0gICAgICAgMjEgMDAwMDAwM0MgICAwMDAzMDAwQSAgICAgICAgIGJyY3IgICAgICAgICAgICAxMAotICAgICAgIDIyIDAwMDAwMDQwICAgRjgzODAwMDYgICAgICAgICBic3IgICAgICAgICAgICAgcjYscjMxCi0gICAgICAgMjMgMDAwMDAwNDQgICBGODM4MjAwNiAgICAgICAgIGJzci5hICAgICAgICAgICByNixyMzEKLSAgICAgICAyNCAwMDAwMDA0OCAgIDAwMzA0MDA3ICAgICAgICAgY21uZCAgICAgICAgICAgIHI3Ci0gICAgICAgMjUgMDAwMDAwNEMgICAyOTNBMDAwMyAgICAgICAgIGNtcCAgICAgICAgICAgICByMyxyNCxyNQotICAgICAgIDI2IDAwMDAwMDUwICAgMDJCNzAwMDggICAgICAgICBkY2FjaGVjICAgICAgICAgcjgocjEwKQotICAgICAgIDI3IDAwMDAwMDU0ICAgMEFCNzAwMDggICAgICAgICBkY2FjaGVmICAgICAgICAgcjgocjEwKQotICAgICAgIDI4IDAwMDAwMDU4ICAgNDFCNDA0MDQgICAgICAgICBkbGQuYiAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMjkgMDAwMDAwNUMgICA0MUI0MjQwNCAgICAgICAgIGRsZC5oICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzMCAwMDAwMDA2MCAgIDQxQjQ0NDA0ICAgICAgICAgZGxkICAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDMxIDAwMDAwMDY0ICAgNDFCNDY0MDQgICAgICAgICBkbGQuZCAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzIgMDAwMDAwNjggICA0MUI1MDQwNCAgICAgICAgIGRsZC51YiAgICAgICAgICByNChyNikscjgKLSAgICAgICAzMyAwMDAwMDA2QyAgIDQxQjUyNDA0ICAgICAgICAgZGxkLnVoICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDM0IDAwMDAwMDcwICAgNDFCNjA0MDQgICAgICAgICBkc3QuYiAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzUgMDAwMDAwNzQgICA0MUI2MjQwNCAgICAgICAgIGRzdC5oICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzNiAwMDAwMDA3OCAgIDQxQjY0NDA0ICAgICAgICAgZHN0ICAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDM3IDAwMDAwMDdDICAgNDFCNjY0MDQgICAgICAgICBkc3QuZCAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzggMDAwMDAwODAgICAwODMwMjAwNSAgICAgICAgIGV0cmFwICAgICAgICAgICByNQotICAgICAgIDM5IDAwMDAwMDg0ICAgMzE3MTQ3RTMgICAgICAgICBleHRzICAgICAgICAgICAgcjMsMzEscjUscjYKLSAgICAgICA0MCAwMDAwMDA4OCAgIDQ5NzEwN0MyICAgICAgICAgZXh0dSAgICAgICAgICAgIHIyLDMwLHI1LHI5Ci0gICAgICAgNDEgMDAwMDAwOEMgICAzMTNFMDAwMiAgICAgICAgIGZhZGQuc3NzICAgICAgICByMixyNCxyNgotICAgICAgIDQyIDAwMDAwMDkwICAgMzEzRTAyMDIgICAgICAgICBmYWRkLnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA0MyAwMDAwMDA5NCAgIDMxM0UwMjgyICAgICAgICAgZmFkZC5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNDQgMDAwMDAwOTggICAzMTNFMDIyMiAgICAgICAgIGZhZGQuZHNkICAgICAgICByMixyNCxyNgotICAgICAgIDQ1IDAwMDAwMDlDICAgMzEzRTAyQTIgICAgICAgICBmYWRkLmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA0NiAwMDAwMDBBMCAgIDQxQkVBMDA0ICAgICAgICAgZmNtcC5zcyAgICAgICAgIHI0LHI2LHI4Ci0gICAgICAgNDcgMDAwMDAwQTQgICA0MUJFQTA4NCAgICAgICAgIGZjbXAuc2QgICAgICAgICByNCxyNixyOAotICAgICAgIDQ4IDAwMDAwMEE4ICAgNDFCRUEwMjQgICAgICAgICBmY21wLmRzICAgICAgICAgcjQscjYscjgKLSAgICAgICA0OSAwMDAwMDBBQyAgIDQxQkVBMEE0ICAgICAgICAgZmNtcC5kZCAgICAgICAgIHI0LHI2LHI4Ci0gICAgICAgNTAgMDAwMDAwQjAgICAzMTNFNjAwMiAgICAgICAgIGZkaXYuc3NzICAgICAgICByMixyNCxyNgotICAgICAgIDUxIDAwMDAwMEI0ICAgMzEzRTYyMDIgICAgICAgICBmZGl2LnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1MiAwMDAwMDBCOCAgIDMxM0U2MjgyICAgICAgICAgZmRpdi5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTMgMDAwMDAwQkMgICAzMTNFNjIyMiAgICAgICAgIGZkaXYuZHNkICAgICAgICByMixyNCxyNgotICAgICAgIDU0IDAwMDAwMEMwICAgMzEzRTYyQTIgICAgICAgICBmZGl2LmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1NSAwMDAwMDBDNCAgIDMxM0U0MDAyICAgICAgICAgZm1weS5zc3MgICAgICAgIHIyLHI0LHI2Ci0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICA1NiAwMDAwMDBDOCAgIDMxM0U0MjAyICAgICAgICAgZm1weS5zc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTcgMDAwMDAwQ0MgICAzMTNFNDI4MiAgICAgICAgIGZtcHkuc2RkICAgICAgICByMixyNCxyNgotICAgICAgIDU4IDAwMDAwMEQwICAgMzEzRTQyMjIgICAgICAgICBmbXB5LmRzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1OSAwMDAwMDBENCAgIDMxM0U0MkEyICAgICAgICAgZm1weS5kZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNjAgMDAwMDAwRDggICAzMTNFNDU0MiAgICAgICAgIGZtcHkuaWlpICAgICAgICByMixyNCxyNgotICAgICAgIDYxIDAwMDAwMERDICAgMzEzRTQ3RTIgICAgICAgICBmbXB5LnV1dSAgICAgICAgcjIscjQscjYKLSAgICAgICA2MiAwMDAwMDBFMCAgIDMwM0U4MTg0ICAgICAgICAgZnJuZG0uc3MgICAgICAgIHI0LHI2Ci0gICAgICAgNjMgMDAwMDAwRTQgICAzMDNFODM4NCAgICAgICAgIGZybmRtLnNkICAgICAgICByNCxyNgotICAgICAgIDY0IDAwMDAwMEU4ICAgMzAzRTg1ODQgICAgICAgICBmcm5kbS5zaSAgICAgICAgcjQscjYKLSAgICAgICA2NSAwMDAwMDBFQyAgIDMwM0U4Nzg0ICAgICAgICAgZnJuZG0uc3UgICAgICAgIHI0LHI2Ci0gICAgICAgNjYgMDAwMDAwRjAgICA0MDNFODFBMiAgICAgICAgIGZybmRtLmRzICAgICAgICByMixyOAotICAgICAgIDY3IDAwMDAwMEY0ICAgNDAzRTgzQTIgICAgICAgICBmcm5kbS5kZCAgICAgICAgcjIscjgKLSAgICAgICA2OCAwMDAwMDBGOCAgIDQwM0U4NUEyICAgICAgICAgZnJuZG0uZGkgICAgICAgIHIyLHI4Ci0gICAgICAgNjkgMDAwMDAwRkMgICA0MDNFODdBMiAgICAgICAgIGZybmRtLmR1ICAgICAgICByMixyOAotICAgICAgIDcwIDAwMDAwMTAwICAgMzAzRTgxQzQgICAgICAgICBmcm5kbS5pcyAgICAgICAgcjQscjYKLSAgICAgICA3MSAwMDAwMDEwNCAgIDMwM0U4M0M0ICAgICAgICAgZnJuZG0uaWQgICAgICAgIHI0LHI2Ci0gICAgICAgNzIgMDAwMDAxMDggICA0MDNFODFFMiAgICAgICAgIGZybmRtLnVzICAgICAgICByMixyOAotICAgICAgIDczIDAwMDAwMTBDICAgNDAzRTgzRTIgICAgICAgICBmcm5kbS51ZCAgICAgICAgcjIscjgKLSAgICAgICA3NCAwMDAwMDExMCAgIDMwM0U4MDA0ICAgICAgICAgZnJuZG4uc3MgICAgICAgIHI0LHI2Ci0gICAgICAgNzUgMDAwMDAxMTQgICAzMDNFODIwNCAgICAgICAgIGZybmRuLnNkICAgICAgICByNCxyNgotICAgICAgIDc2IDAwMDAwMTE4ICAgMzAzRTg0MDQgICAgICAgICBmcm5kbi5zaSAgICAgICAgcjQscjYKLSAgICAgICA3NyAwMDAwMDExQyAgIDMwM0U4NjA0ICAgICAgICAgZnJuZG4uc3UgICAgICAgIHI0LHI2Ci0gICAgICAgNzggMDAwMDAxMjAgICA0MDNFODAyMiAgICAgICAgIGZybmRuLmRzICAgICAgICByMixyOAotICAgICAgIDc5IDAwMDAwMTI0ICAgNDAzRTgyMjIgICAgICAgICBmcm5kbi5kZCAgICAgICAgcjIscjgKLSAgICAgICA4MCAwMDAwMDEyOCAgIDQwM0U4NDIyICAgICAgICAgZnJuZG4uZGkgICAgICAgIHIyLHI4Ci0gICAgICAgODEgMDAwMDAxMkMgICA0MDNFODYyMiAgICAgICAgIGZybmRuLmR1ICAgICAgICByMixyOAotICAgICAgIDgyIDAwMDAwMTMwICAgMzAzRTgwNDQgICAgICAgICBmcm5kbi5pcyAgICAgICAgcjQscjYKLSAgICAgICA4MyAwMDAwMDEzNCAgIDMwM0U4MjQ0ICAgICAgICAgZnJuZG4uaWQgICAgICAgIHI0LHI2Ci0gICAgICAgODQgMDAwMDAxMzggICA0MDNFODA2MiAgICAgICAgIGZybmRuLnVzICAgICAgICByMixyOAotICAgICAgIDg1IDAwMDAwMTNDICAgNDAzRTgyNjIgICAgICAgICBmcm5kbi51ZCAgICAgICAgcjIscjgKLSAgICAgICA4NiAwMDAwMDE0MCAgIDMwM0U4MTA0ICAgICAgICAgZnJuZHAuc3MgICAgICAgIHI0LHI2Ci0gICAgICAgODcgMDAwMDAxNDQgICAzMDNFODMwNCAgICAgICAgIGZybmRwLnNkICAgICAgICByNCxyNgotICAgICAgIDg4IDAwMDAwMTQ4ICAgMzAzRTg1MDQgICAgICAgICBmcm5kcC5zaSAgICAgICAgcjQscjYKLSAgICAgICA4OSAwMDAwMDE0QyAgIDMwM0U4NzA0ICAgICAgICAgZnJuZHAuc3UgICAgICAgIHI0LHI2Ci0gICAgICAgOTAgMDAwMDAxNTAgICA0MDNFODEyMiAgICAgICAgIGZybmRwLmRzICAgICAgICByMixyOAotICAgICAgIDkxIDAwMDAwMTU0ICAgNDAzRTgzMjIgICAgICAgICBmcm5kcC5kZCAgICAgICAgcjIscjgKLSAgICAgICA5MiAwMDAwMDE1OCAgIDQwM0U4NTIyICAgICAgICAgZnJuZHAuZGkgICAgICAgIHIyLHI4Ci0gICAgICAgOTMgMDAwMDAxNUMgICA0MDNFODcyMiAgICAgICAgIGZybmRwLmR1ICAgICAgICByMixyOAotICAgICAgIDk0IDAwMDAwMTYwICAgMzAzRTgxNDQgICAgICAgICBmcm5kcC5pcyAgICAgICAgcjQscjYKLSAgICAgICA5NSAwMDAwMDE2NCAgIDMwM0U4MzQ0ICAgICAgICAgZnJuZHAuaWQgICAgICAgIHI0LHI2Ci0gICAgICAgOTYgMDAwMDAxNjggICA0MDNFODE2MiAgICAgICAgIGZybmRwLnVzICAgICAgICByMixyOAotICAgICAgIDk3IDAwMDAwMTZDICAgNDAzRTgzNjIgICAgICAgICBmcm5kcC51ZCAgICAgICAgcjIscjgKLSAgICAgICA5OCAwMDAwMDE3MCAgIDMwM0U4MDg0ICAgICAgICAgZnJuZHouc3MgICAgICAgIHI0LHI2Ci0gICAgICAgOTkgMDAwMDAxNzQgICAzMDNFODI4NCAgICAgICAgIGZybmR6LnNkICAgICAgICByNCxyNgotICAgICAgMTAwIDAwMDAwMTc4ICAgMzAzRTg0ODQgICAgICAgICBmcm5kei5zaSAgICAgICAgcjQscjYKLSAgICAgIDEwMSAwMDAwMDE3QyAgIDMwM0U4Njg0ICAgICAgICAgZnJuZHouc3UgICAgICAgIHI0LHI2Ci0gICAgICAxMDIgMDAwMDAxODAgICA0MDNFODBBMiAgICAgICAgIGZybmR6LmRzICAgICAgICByMixyOAotICAgICAgMTAzIDAwMDAwMTg0ICAgNDAzRTgyQTIgICAgICAgICBmcm5kei5kZCAgICAgICAgcjIscjgKLSAgICAgIDEwNCAwMDAwMDE4OCAgIDQwM0U4NEEyICAgICAgICAgZnJuZHouZGkgICAgICAgIHIyLHI4Ci0gICAgICAxMDUgMDAwMDAxOEMgICA0MDNFODZBMiAgICAgICAgIGZybmR6LmR1ICAgICAgICByMixyOAotICAgICAgMTA2IDAwMDAwMTkwICAgMzAzRTgwQzQgICAgICAgICBmcm5kei5pcyAgICAgICAgcjQscjYKLSAgICAgIDEwNyAwMDAwMDE5NCAgIDMwM0U4MkM0ICAgICAgICAgZnJuZHouaWQgICAgICAgIHI0LHI2Ci0gICAgICAxMDggMDAwMDAxOTggICA0MDNFODBFMiAgICAgICAgIGZybmR6LnVzICAgICAgICByMixyOAotICAgICAgMTA5IDAwMDAwMTlDICAgNDAzRTgyRTIgICAgICAgICBmcm5kei51ZCAgICAgICAgcjIscjgKLSAgICAgIDExMCAwMDAwMDFBMCAgIDQwM0VFMDA2ICAgICAgICAgZnNxcnQuc3MgICAgICAgIHI2LHI4Ci0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAzCi0KLSAgICAgIDExMSAwMDAwMDFBNCAgIDQwM0VFMjA2ICAgICAgICAgZnNxcnQuc2QgICAgICAgIHI2LHI4Ci0gICAgICAxMTIgMDAwMDAxQTggICA0MDNFRTIyNiAgICAgICAgIGZzcXJ0LmRkICAgICAgICByNixyOAotICAgICAgMTEzIDAwMDAwMUFDICAgMzEzRTIwMDIgICAgICAgICBmc3ViLnNzcyAgICAgICAgcjIscjQscjYKLSAgICAgIDExNCAwMDAwMDFCMCAgIDMxM0UyMjAyICAgICAgICAgZnN1Yi5zc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAxMTUgMDAwMDAxQjQgICAzMTNFMjI4MiAgICAgICAgIGZzdWIuc2RkICAgICAgICByMixyNCxyNgotICAgICAgMTE2IDAwMDAwMUI4ICAgMzEzRTIyMjIgICAgICAgICBmc3ViLmRzZCAgICAgICAgcjIscjQscjYKLSAgICAgIDExNyAwMDAwMDFCQyAgIDMxM0UyMkEyICAgICAgICAgZnN1Yi5kZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAxMTggMDAwMDAxQzAgICA1MjMxRTNFNCAgICAgICAgIGlucyAgICAgICAgICAgICByNCwzMSxyOCxyMTAKLSAgICAgIDExOSAwMDAwMDFDNCAgIDQxQjg4MDA0ICAgICAgICAganNyICAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTIwIDAwMDAwMUM4ICAgNDFCOEEwMDQgICAgICAgICBqc3IuYSAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjEgMDAwMDAxQ0MgICA0MUI0MDAwNCAgICAgICAgIGxkLmIgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyMiAwMDAwMDFEMCAgIDQxQjQyMDA0ICAgICAgICAgbGQuaCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTIzIDAwMDAwMUQ0ICAgNDFCNDQwMDQgICAgICAgICBsZCAgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjQgMDAwMDAxRDggICA0MUI0NjAwNCAgICAgICAgIGxkLmQgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyNSAwMDAwMDFEQyAgIDQxQjUwMDA0ICAgICAgICAgbGQudWIgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTI2IDAwMDAwMUUwICAgNDFCNTIwMDQgICAgICAgICBsZC51aCAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjcgMDAwMDAxRTQgICA0MUZGMDAwNyAgICAgICAgIGxtbyAgICAgICAgICAgICByNyxyOAotICAgICAgMTI4IDAwMDAwMUU4ICAgMThCMkUwMDEgICAgICAgICBvciAgICAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEyOSAwMDAwMDFFQyAgIDE4QjJFMDAxICAgICAgICAgb3IudHQgICAgICAgICAgIHIxLHIyLHIzCi0gICAgICAxMzAgMDAwMDAxRjAgICAxOEIzQzAwMSAgICAgICAgIG9yLmZmICAgICAgICAgICByMSxyMixyMwotICAgICAgMTMxIDAwMDAwMUY0ICAgMThCM0EwMDEgICAgICAgICBvci5mdCAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEzMiAwMDAwMDFGOCAgIDE4QjM2MDAxICAgICAgICAgb3IudGYgICAgICAgICAgIHIxLHIyLHIzCi0gICAgICAxMzMgMDAwMDAxRkMgICAyMDMwODAwNiAgICAgICAgIHJkY3IgICAgICAgICAgICByNixyNAotICAgICAgMTM0IDAwMDAwMjAwICAgMjkzRjIwMDQgICAgICAgICBybW8gICAgICAgICAgICAgcjQscjUKLSAgICAgIDEzNSAwMDAwMDIwNCAgIDUyMzEwM0UyICAgICAgICAgcm90bCAgICAgICAgICAgIHIyLDMxLHI4LHIxMAotICAgICAgMTM2IDAwMDAwMjA4ICAgMzBCMTA3RTggICAgICAgICByb3RyICAgICAgICAgICAgcjgsMzEscjIscjYKLSAgICAgIDEzNyAwMDAwMDIwQyAgIDMwQjFDM0U0ICAgICAgICAgc2hsICAgICAgICAgICAgIHI0LDMxLHIyLHI2Ci0gICAgICAxMzggMDAwMDAyMTAgICAzMTcxMDE4NCAgICAgICAgIHNsLmR6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTM5IDAwMDAwMjE0ICAgMzE3MTIxODQgICAgICAgICBzbC5kbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0MCAwMDAwMDIxOCAgIDMxNzE0MTg0ICAgICAgICAgc2wuZHMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDEgMDAwMDAyMUMgICAzMTcxNjE4NCAgICAgICAgIHNsLmV6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQyIDAwMDAwMjIwICAgMzE3MTgxODQgICAgICAgICBzbC5lbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0MyAwMDAwMDIyNCAgIDMxNzFBMTg0ICAgICAgICAgc2wuZXMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDQgMDAwMDAyMjggICAzMTcxQzE4NCAgICAgICAgIHNsLml6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ1IDAwMDAwMjJDICAgMzE3MUUxODQgICAgICAgICBzbC5pbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0NiAwMDAwMDIzMCAgIDMxNzEwOTg0ICAgICAgICAgc2xpLmR6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDcgMDAwMDAyMzQgICAzMTcxMjk4NCAgICAgICAgIHNsaS5kbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ4IDAwMDAwMjM4ICAgMzE3MTQ5ODQgICAgICAgICBzbGkuZHMgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0OSAwMDAwMDIzQyAgIDMxNzE2OTg0ICAgICAgICAgc2xpLmV6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTAgMDAwMDAyNDAgICAzMTcxODk4NCAgICAgICAgIHNsaS5lbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTUxIDAwMDAwMjQ0ICAgMzE3MUE5ODQgICAgICAgICBzbGkuZXMgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1MiAwMDAwMDI0OCAgIDMxNzFDOTg0ICAgICAgICAgc2xpLml6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTMgMDAwMDAyNEMgICAzMTcxRTk4NCAgICAgICAgIHNsaS5pbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU0IDAwMDAwMjUwICAgMzE3MTA1ODQgICAgICAgICBzci5keiAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1NSAwMDAwMDI1NCAgIDMxNzEyNTg0ICAgICAgICAgc3IuZG0gICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTYgMDAwMDAyNTggICAzMTcxNDU4NCAgICAgICAgIHNyLmRzICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU3IDAwMDAwMjVDICAgMzE3MTY1ODQgICAgICAgICBzci5leiAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1OCAwMDAwMDI2MCAgIDMxNzE4NTg0ICAgICAgICAgc3IuZW0gICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTkgMDAwMDAyNjQgICAzMTcxQTU4NCAgICAgICAgIHNyLmVzICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTYwIDAwMDAwMjY4ICAgMzE3MUM1ODQgICAgICAgICBzci5peiAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2MSAwMDAwMDI2QyAgIDMxNzFFNTg0ICAgICAgICAgc3IuaW0gICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjIgMDAwMDAyNzAgICA0MUIxQTQwNCAgICAgICAgIHNyYSAgICAgICAgICAgICByNCwzMixyNixyOAotICAgICAgMTYzIDAwMDAwMjc0ICAgMzE3MTBEODQgICAgICAgICBzcmkuZHogICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2NCAwMDAwMDI3OCAgIDMxNzEyRDg0ICAgICAgICAgc3JpLmRtICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjUgMDAwMDAyN0MgICAzMTcxNEQ4NCAgICAgICAgIHNyaS5kcyAgICAgICAgICByNCwxMixyNSxyNgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgNAotCi0gICAgICAxNjYgMDAwMDAyODAgICAzMTcxNkQ4NCAgICAgICAgIHNyaS5leiAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTY3IDAwMDAwMjg0ICAgMzE3MThEODQgICAgICAgICBzcmkuZW0gICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2OCAwMDAwMDI4OCAgIDMxNzFBRDg0ICAgICAgICAgc3JpLmVzICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjkgMDAwMDAyOEMgICAzMTcxQ0Q4NCAgICAgICAgIHNyaS5peiAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTcwIDAwMDAwMjkwICAgMzE3MUVEODQgICAgICAgICBzcmkuaW0gICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE3MSAwMDAwMDI5NCAgIDQxQjE2NDA0ICAgICAgICAgc3JsICAgICAgICAgICAgIHI0LDMyLHI2LHI4Ci0gICAgICAxNzIgMDAwMDAyOTggICA0MUI2MDAwNCAgICAgICAgIHN0LmIgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDE3MyAwMDAwMDI5QyAgIDQxQjYyMDA0ICAgICAgICAgc3QuaCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTc0IDAwMDAwMkEwICAgNDFCNjQwMDQgICAgICAgICBzdCAgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxNzUgMDAwMDAyQTQgICA0MUI2NjAwNCAgICAgICAgIHN0LmQgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDE3NiAwMDAwMDJBOCAgIDRBM0I0MDA3ICAgICAgICAgc3ViICAgICAgICAgICAgIHI3LHI4LHI5Ci0gICAgICAxNzcgMDAwMDAyQUMgICA0QTNCNjAwNyAgICAgICAgIHN1YnUgICAgICAgICAgICByNyxyOCxyOQotICAgICAgMTc4IDAwMDAwMkIwICAgMjFCMEEwMDggICAgICAgICBzd2NyICAgICAgICAgICAgcjgscjYscjQKLSAgICAgIDE3OSAwMDAwMDJCNCAgIDAwMzAyMDBBICAgICAgICAgdHJhcCAgICAgICAgICAgIHIxMAotICAgICAgMTgwIDAwMDAwMkI4ICAgMDEzQzAwMDIgICAgICAgICB2YWRkLnNzICAgICAgICAgcjIscjQscjQKLSAgICAgIDE4MSAwMDAwMDJCQyAgIDAxQkMwMDgyICAgICAgICAgdmFkZC5zZCAgICAgICAgIHIyLHI2LHI2Ci0gICAgICAxODIgMDAwMDAyQzAgICAwMkJDMDBBMiAgICAgICAgIHZhZGQuZGQgICAgICAgICByMixyMTAscjEwCi0gICAgICAxODMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZsZDAucyAgICAgICAgICByNgotICAgICAgMTg0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bGQxLnMgICAgICAgICAgcjcKLSAgICAgIDE4NSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdmxkMC5kICAgICAgICAgIHI2Ci0gICAgICAxODYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZsZDEuZCAgICAgICAgICByOAotICAgICAgMTg3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzcyAgICAgICAgcjcscjksMCxhMwotICAgICAgMTg4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzcyAgICAgICAgcjcscjksMCxyMTAKLSAgICAgIDE4OSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc3MgICAgICAgIHI3LHI5LGExLGEzCi0gICAgICAxOTAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NzICAgICAgICByNyxyOSxhMyxyMTAKLSAgICAgIDE5MSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc2QgICAgICAgIHI3LHI5LDAsYTAKLSAgICAgIDE5MiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc2QgICAgICAgIHI3LHI5LDAscjEwCi0gICAgICAxOTMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NkICAgICAgICByNyxyOSxhMSxhMgotICAgICAgMTk0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzZCAgICAgICAgcjcscjksYTMscjEwCi0gICAgICAxOTUgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtcHkuc3MgICAgICAgICByMSxyMyxyMwotICAgICAgMTk2ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXB5LnNkICAgICAgICAgcjUscjYscjYKLSAgICAgIDE5NyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1weS5kZCAgICAgICAgIHIyLHI0LHI0Ci0gICAgICAxOTggICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NzICAgICAgICByNyxyOSwwLGEwCi0gICAgICAxOTkgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NzICAgICAgICByNyxyOSwwLHIxMAotICAgICAgMjAwICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzcyAgICAgICAgcjcscjksYTAsYTEKLSAgICAgIDIwMSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc3MgICAgICAgIHI3LHI5LGEzLHIxMAotICAgICAgMjAyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzZCAgICAgICAgcjcscjksMCxhMAotICAgICAgMjAzICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzZCAgICAgICAgcjcscjksMCxyMTAKLSAgICAgIDIwNCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc2QgICAgICAgIHI3LHI5LGEwLGExCi0gICAgICAyMDUgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NkICAgICAgICByNyxyOSxhMyxyMTAKLSAgICAgIDIwNiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zdWIuc3MgICAgICAgIHI2LGEyLGE0Ci0gICAgICAyMDcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc3ViLnNkICAgICAgICByNixhMixhNAotICAgICAgMjA4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXN1Yi5zcyAgICAgICAgcjQsYTQscjYKLSAgICAgIDIwOSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zdWIuc2QgICAgICAgIHI0LGE0LHI2Ci0gICAgICAyMTAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2kgICAgICAgICByNCxyNgotICAgICAgMjExICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNpICAgICAgICAgcjQsYTAKLSAgICAgIDIxMiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zdSAgICAgICAgIHI0LHI2Ci0gICAgICAyMTMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc3UgICAgICAgICByNCxhMAotICAgICAgMjE0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNzICAgICAgICAgcjQscjYKLSAgICAgIDIxNSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zcyAgICAgICAgIHI0LGEwCi0gICAgICAyMTYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2QgICAgICAgICByNCxyNgotICAgICAgMjE3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNkICAgICAgICAgcjQsYTAKLSAgICAgIDIxOCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kaSAgICAgICAgIHI0LHI2Ci0gICAgICAyMTkgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZGkgICAgICAgICByNCxhMAotICAgICAgMjIwICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmR1ICAgICAgICAgcjQscjYKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6MjQgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDUKLQotICAgICAgMjIxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmR1ICAgICAgICAgcjQsYTAKLSAgICAgIDIyMiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kcyAgICAgICAgIHI0LHI2Ci0gICAgICAyMjMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZHMgICAgICAgICByNCxhMAotICAgICAgMjI0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRkICAgICAgICAgcjQscjYKLSAgICAgIDIyNSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kZCAgICAgICAgIHI0LGEwCi0gICAgICAyMjYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuaXMgICAgICAgICByNCxyNgotICAgICAgMjI3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmlkICAgICAgICAgcjQscjYKLSAgICAgIDIyOCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC51cyAgICAgICAgIHI0LHI2Ci0gICAgICAyMjkgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQudWQgICAgICAgICByNCxyNgotICAgICAgMjMwICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3QucyAgICAgICAgICAgcjYKLSAgICAgIDIzMSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnN0LmQgICAgICAgICAgIHI2Ci0gICAgICAyMzIgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZzdWIuc3MgICAgICAgICByMixyNCxyNgotICAgICAgMjMzICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3ViLnNkICAgICAgICAgcjIscjQscjYKLSAgICAgIDIzNCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnN1Yi5kZCAgICAgICAgIHIyLHI0LHI2Ci0gICAgICAyMzUgMDAwMDAyQzQgICAwMTcwQTAwNiAgICAgICAgIHdyY3IgICAgICAgICAgICByNixyNQotICAgICAgMjM2IDAwMDAwMkM4ICAgMzlCMzIwMDUgICAgICAgICB4bm9yICAgICAgICAgICAgcjUscjYscjcKLSAgICAgIDIzNyAwMDAwMDJDQyAgIDRBMzJDMDA3ICAgICAgICAgeG9yICAgICAgICAgICAgIHI3LHI4LHI5Ci0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmOTM1Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi07OyBTaW1wbGUgcmVnaXN0ZXIgZm9ybXMKLTs7IFRob3NlIGluc3RydWN0aW9ucyB3aGljaCBhbHNvIHVzZSBhbiBpbW1lZGlhdGUganVzdCB1c2UgYSBjb25zdGFudC4KLQotCS50ZXh0Ci0KLQlhZGQJCXIzLHI0LHI1Ci0JYWRkdQkJcjMscjQscjUKLQlhbmQJCXI1LHI0LHIyCi0JYW5kLnR0CQlyNSxyNCxyMgotCWFuZC5mZgkJcjEwLHIxMixyMTQKLQlhbmQuZnQJCXIxMCxyMTIscjE0Ci0JYW5kLnRmCQlyMTAscjEyLHIxNAotCWJibwkJcjEwLHI4LGxvLncKLQliYm8uYQkJcjEwLHI4LGVxLmIKLQliYnoJCXIxMCxyOCxscy53Ci0JYmJ6LmEJCXIxMCxyOCxoaS53Ci0JYmNuZAkJcjQscjYsbHQwLmIKLQliY25kLmEJCXI0LHI2LGx0MC5iCi0JYnIJCXI2Ci0JYnIuYQkJcjYKLQlicmNyCQkxMAotCWJzcgkJcjYscjMxCi0JYnNyLmEJCXI2LHIzMQotCWNtbmQJCXI3Ci0JY21wCQlyMyxyNCxyNQotCWRjYWNoZWMJCXI4KHIxMCkKLQlkY2FjaGVmCQlyOChyMTApCi0JZGxkLmIJCXI0KHI2KSxyOAotCWRsZC5oCQlyNChyNikscjgKLQlkbGQJCXI0KHI2KSxyOAotCWRsZC5kCQlyNChyNikscjgKLQlkbGQudWIJCXI0KHI2KSxyOAotCWRsZC51aAkJcjQocjYpLHI4Ci0JZHN0LmIJCXI0KHI2KSxyOAotCWRzdC5oCQlyNChyNikscjgKLQlkc3QJCXI0KHI2KSxyOAotCWRzdC5kCQlyNChyNikscjgKLQlldHJhcAkJcjUKLQlleHRzCQlyMywzMSxyNSxyNgotCWV4dHUJCXIyLDMwLHI1LHI5Ci0JZmFkZC5zc3MJcjIscjQscjYKLQlmYWRkLnNzZAlyMixyNCxyNgotCWZhZGQuc2RkCXIyLHI0LHI2Ci0JZmFkZC5kc2QJcjIscjQscjYKLQlmYWRkLmRkZAlyMixyNCxyNgotCWZjbXAuc3MJCXI0LHI2LHI4Ci0JZmNtcC5zZAkJcjQscjYscjgKLQlmY21wLmRzCQlyNCxyNixyOAotCWZjbXAuZGQJCXI0LHI2LHI4Ci0JZmRpdi5zc3MJcjIscjQscjYKLQlmZGl2LnNzZAlyMixyNCxyNgotCWZkaXYuc2RkCXIyLHI0LHI2Ci0JZmRpdi5kc2QJcjIscjQscjYKLQlmZGl2LmRkZAlyMixyNCxyNgotCWZtcHkuc3NzCXIyLHI0LHI2Ci0JZm1weS5zc2QJcjIscjQscjYKLQlmbXB5LnNkZAlyMixyNCxyNgotCWZtcHkuZHNkCXIyLHI0LHI2Ci0JZm1weS5kZGQJcjIscjQscjYKLQlmbXB5LmlpaQlyMixyNCxyNgotCWZtcHkudXV1CXIyLHI0LHI2Ci0JZnJuZG0uc3MJcjQscjYKLQlmcm5kbS5zZAlyNCxyNgotCWZybmRtLnNpCXI0LHI2Ci0JZnJuZG0uc3UJcjQscjYKLQlmcm5kbS5kcwlyMixyOAotCWZybmRtLmRkCXIyLHI4Ci0JZnJuZG0uZGkJcjIscjgKLQlmcm5kbS5kdQlyMixyOAotCWZybmRtLmlzCXI0LHI2Ci0JZnJuZG0uaWQJcjQscjYKLQlmcm5kbS51cwlyMixyOAotCWZybmRtLnVkCXIyLHI4Ci0JZnJuZG4uc3MJcjQscjYKLQlmcm5kbi5zZAlyNCxyNgotCWZybmRuLnNpCXI0LHI2Ci0JZnJuZG4uc3UJcjQscjYKLQlmcm5kbi5kcwlyMixyOAotCWZybmRuLmRkCXIyLHI4Ci0JZnJuZG4uZGkJcjIscjgKLQlmcm5kbi5kdQlyMixyOAotCWZybmRuLmlzCXI0LHI2Ci0JZnJuZG4uaWQJcjQscjYKLQlmcm5kbi51cwlyMixyOAotCWZybmRuLnVkCXIyLHI4Ci0JZnJuZHAuc3MJcjQscjYKLQlmcm5kcC5zZAlyNCxyNgotCWZybmRwLnNpCXI0LHI2Ci0JZnJuZHAuc3UJcjQscjYKLQlmcm5kcC5kcwlyMixyOAotCWZybmRwLmRkCXIyLHI4Ci0JZnJuZHAuZGkJcjIscjgKLQlmcm5kcC5kdQlyMixyOAotCWZybmRwLmlzCXI0LHI2Ci0JZnJuZHAuaWQJcjQscjYKLQlmcm5kcC51cwlyMixyOAotCWZybmRwLnVkCXIyLHI4Ci0JZnJuZHouc3MJcjQscjYKLQlmcm5kei5zZAlyNCxyNgotCWZybmR6LnNpCXI0LHI2Ci0JZnJuZHouc3UJcjQscjYKLQlmcm5kei5kcwlyMixyOAotCWZybmR6LmRkCXIyLHI4Ci0JZnJuZHouZGkJcjIscjgKLQlmcm5kei5kdQlyMixyOAotCWZybmR6LmlzCXI0LHI2Ci0JZnJuZHouaWQJcjQscjYKLQlmcm5kei51cwlyMixyOAotCWZybmR6LnVkCXIyLHI4Ci0JZnNxcnQuc3MJcjYscjgKLQlmc3FydC5zZAlyNixyOAotCWZzcXJ0LmRkCXI2LHI4Ci0JZnN1Yi5zc3MJcjIscjQscjYKLQlmc3ViLnNzZAlyMixyNCxyNgotCWZzdWIuc2RkCXIyLHI0LHI2Ci0JZnN1Yi5kc2QJcjIscjQscjYKLQlmc3ViLmRkZAlyMixyNCxyNgotCWlucwkJcjQsMzEscjgscjEwCi0JanNyCQlyNChyNikscjgKLQlqc3IuYQkJcjQocjYpLHI4Ci0JbGQuYgkJcjQocjYpLHI4Ci0JbGQuaAkJcjQocjYpLHI4Ci0JbGQJCXI0KHI2KSxyOAotCWxkLmQJCXI0KHI2KSxyOAotCWxkLnViCQlyNChyNikscjgKLQlsZC51aAkJcjQocjYpLHI4Ci0JbG1vCQlyNyxyOAotCW9yCQlyMSxyMixyMwotCW9yLnR0CQlyMSxyMixyMwotCW9yLmZmCQlyMSxyMixyMwotCW9yLmZ0CQlyMSxyMixyMwotCW9yLnRmCQlyMSxyMixyMwotCXJkY3IJCXI2LHI0Ci0Jcm1vCQlyNCxyNQotCXJvdGwJCXIyLDMxLHI4LHIxMAotCXJvdHIJCXI4LDMxLHIyLHI2Ci0Jc2hsCQlyNCwzMSxyMixyNgotCXNsLmR6CQlyNCwxMixyNSxyNgotCXNsLmRtCQlyNCwxMixyNSxyNgotCXNsLmRzCQlyNCwxMixyNSxyNgotCXNsLmV6CQlyNCwxMixyNSxyNgotCXNsLmVtCQlyNCwxMixyNSxyNgotCXNsLmVzCQlyNCwxMixyNSxyNgotCXNsLml6CQlyNCwxMixyNSxyNgotCXNsLmltCQlyNCwxMixyNSxyNgotCXNsaS5kegkJcjQsMTIscjUscjYKLQlzbGkuZG0JCXI0LDEyLHI1LHI2Ci0Jc2xpLmRzCQlyNCwxMixyNSxyNgotCXNsaS5legkJcjQsMTIscjUscjYKLQlzbGkuZW0JCXI0LDEyLHI1LHI2Ci0Jc2xpLmVzCQlyNCwxMixyNSxyNgotCXNsaS5pegkJcjQsMTIscjUscjYKLQlzbGkuaW0JCXI0LDEyLHI1LHI2Ci0Jc3IuZHoJCXI0LDEyLHI1LHI2Ci0Jc3IuZG0JCXI0LDEyLHI1LHI2Ci0Jc3IuZHMJCXI0LDEyLHI1LHI2Ci0Jc3IuZXoJCXI0LDEyLHI1LHI2Ci0Jc3IuZW0JCXI0LDEyLHI1LHI2Ci0Jc3IuZXMJCXI0LDEyLHI1LHI2Ci0Jc3IuaXoJCXI0LDEyLHI1LHI2Ci0Jc3IuaW0JCXI0LDEyLHI1LHI2Ci0Jc3JhCQlyNCwzMixyNixyOAotCXNyaS5kegkJcjQsMTIscjUscjYKLQlzcmkuZG0JCXI0LDEyLHI1LHI2Ci0Jc3JpLmRzCQlyNCwxMixyNSxyNgotCXNyaS5legkJcjQsMTIscjUscjYKLQlzcmkuZW0JCXI0LDEyLHI1LHI2Ci0Jc3JpLmVzCQlyNCwxMixyNSxyNgotCXNyaS5pegkJcjQsMTIscjUscjYKLQlzcmkuaW0JCXI0LDEyLHI1LHI2Ci0Jc3JsCQlyNCwzMixyNixyOAotCXN0LmIJCXI0KHI2KSxyOAotCXN0LmgJCXI0KHI2KSxyOAotCXN0CQlyNChyNikscjgKLQlzdC5kCQlyNChyNikscjgKLQlzdWIJCXI3LHI4LHI5Ci0Jc3VidQkJcjcscjgscjkKLQlzd2NyCQlyOCxyNixyNAotCXRyYXAJCXIxMAotCXZhZGQuc3MJCXIyLHI0LHI0Ci0JdmFkZC5zZAkJcjIscjYscjYKLQl2YWRkLmRkCQlyMixyMTAscjEwCi07CXZsZDAucwkJcjYKLTsJdmxkMS5zCQlyNwotOwl2bGQwLmQJCXI2Ci07CXZsZDEuZAkJcjgKLTsJdm1hYy5zc3MJcjcscjksMCxhMwotOwl2bWFjLnNzcwlyNyxyOSwwLHIxMAotOwl2bWFjLnNzcwlyNyxyOSxhMSxhMwotOwl2bWFjLnNzcwlyNyxyOSxhMyxyMTAKLTsJdm1hYy5zc2QJcjcscjksMCxhMAotOwl2bWFjLnNzZAlyNyxyOSwwLHIxMAotOwl2bWFjLnNzZAlyNyxyOSxhMSxhMgotOwl2bWFjLnNzZAlyNyxyOSxhMyxyMTAKLTsJdm1weS5zcwkJcjEscjMscjMKLTsJdm1weS5zZAkJcjUscjYscjYKLTsJdm1weS5kZAkJcjIscjQscjQKLTsJdm1zYy5zc3MJcjcscjksMCxhMAotOwl2bXNjLnNzcwlyNyxyOSwwLHIxMAotOwl2bXNjLnNzcwlyNyxyOSxhMCxhMQotOwl2bXNjLnNzcwlyNyxyOSxhMyxyMTAKLTsJdm1zYy5zc2QJcjcscjksMCxhMAotOwl2bXNjLnNzZAlyNyxyOSwwLHIxMAotOwl2bXNjLnNzZAlyNyxyOSxhMCxhMQotOwl2bXNjLnNzZAlyNyxyOSxhMyxyMTAKLTsJdm1zdWIuc3MJcjYsYTIsYTQKLTsJdm1zdWIuc2QJcjYsYTIsYTQKLTsJdm1zdWIuc3MJcjQsYTQscjYKLTsJdm1zdWIuc2QJcjQsYTQscjYKLTsJdnJuZC5zaQkJcjQscjYKLTsJdnJuZC5zaQkJcjQsYTAKLTsJdnJuZC5zdQkJcjQscjYKLTsJdnJuZC5zdQkJcjQsYTAKLTsJdnJuZC5zcwkJcjQscjYKLTsJdnJuZC5zcwkJcjQsYTAKLTsJdnJuZC5zZAkJcjQscjYKLTsJdnJuZC5zZAkJcjQsYTAKLTsJdnJuZC5kaQkJcjQscjYKLTsJdnJuZC5kaQkJcjQsYTAKLTsJdnJuZC5kdQkJcjQscjYKLTsJdnJuZC5kdQkJcjQsYTAKLTsJdnJuZC5kcwkJcjQscjYKLTsJdnJuZC5kcwkJcjQsYTAKLTsJdnJuZC5kZAkJcjQscjYKLTsJdnJuZC5kZAkJcjQsYTAKLTsJdnJuZC5pcwkJcjQscjYKLTsJdnJuZC5pZAkJcjQscjYKLTsJdnJuZC51cwkJcjQscjYKLTsJdnJuZC51ZAkJcjQscjYKLTsJdnN0LnMJCXI2Ci07CXZzdC5kCQlyNgotOwl2c3ViLnNzCQlyMixyNCxyNgotOwl2c3ViLnNkCQlyMixyNCxyNgotOwl2c3ViLmRkCQlyMixyNCxyNgotCXdyY3IJCXI2LHI1Ci0JeG5vcgkJcjUscjYscjcKLQl4b3IJCXI3LHI4LHI5CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiN2Y0YTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgcmVnaXN0ZXIgb3BlcmFuZHMgd2l0aCA6bSBtb2RpZmllcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDggODAgYjcgMDIuKgotICAgNDoJMDQgMDAgOWUgMDIuKgotICAgODoJZmMgN2YgOWUgMDIuKgotICAgYzoJMDAgOTAgYjcgMDIgNzggNTYgMzQgMTIuKgotICAxNDoJMDAgOTAgYjcgMDIgZWYgYmUgYWQgZGUuKgotICAxYzoJMDggODAgYjcgMGEuKgotICAyMDoJMDQgMDAgOWUgMGEuKgotICAyNDoJZmMgN2YgOWUgMGEuKgotICAyODoJMDAgOTAgYjcgMGEgNzggNTYgMzQgMTIuKgotICAzMDoJMDAgOTAgYjcgMGEgZWYgYmUgYWQgZGUuKgotICAzODoJMDQgODQgYjQgNDEuKgotICAzYzoJMDQgYTQgYjQgNDEuKgotICA0MDoJMDQgYzQgYjQgNDEuKgotICA0NDoJMDQgZTQgYjQgNDEuKgotICA0ODoJMDAgOTQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA1MDoJMDAgYjQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA1ODoJMDAgZDQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA2MDoJMDAgZjQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA2ODoJMDQgODQgYjUgNDEuKgotICA2YzoJMDQgYTQgYjUgNDEuKgotICA3MDoJMDAgOTQgYjUgNDEgMDAgMDAgMDAgZTAuKgotICA3ODoJMDAgYjQgYjUgNDEgMDAgMDAgMDAgZTAuKgotICA4MDoJMDQgODQgYjYgNDEuKgotICA4NDoJMDQgYTQgYjYgNDEuKgotICA4ODoJMDQgYzQgYjYgNDEuKgotICA4YzoJMDQgZTQgYjYgNDEuKgotICA5MDoJMDAgOTQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICA5ODoJMDAgYjQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICBhMDoJMDAgZDQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICBhODoJMDAgZjQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICBiMDoJMDQgODAgYjQgNDEuKgotICBiNDoJMDQgYTAgYjQgNDEuKgotICBiODoJMDQgYzAgYjQgNDEuKgotICBiYzoJMDQgZTAgYjQgNDEuKgotICBjMDoJZjAgN2YgOTIgNDEuKgotICBjNDoJZjAgZmYgOTIgNDEuKgotICBjODoJZjAgN2YgOTMgNDEuKgotICBjYzoJZjAgZmYgOTMgNDEuKgotICBkMDoJMDAgOTAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBkODoJMDAgYjAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBlMDoJMDAgZDAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBlODoJMDAgZjAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBmMDoJMDQgODAgYjUgNDEuKgotICBmNDoJMDQgYTAgYjUgNDEuKgotICBmODoJZjAgN2YgOTYgNDEuKgotICBmYzoJZjAgZmYgOTYgNDEuKgotIDEwMDoJMDAgOTAgYjUgNDEgMDAgMDAgMDAgZTAuKgotIDEwODoJMDAgYjAgYjUgNDEgMDAgMDAgMDAgZTAuKgotIDExMDoJMDQgODAgYjYgNDEuKgotIDExNDoJMDQgYTAgYjYgNDEuKgotIDExODoJMDQgYzAgYjYgNDEuKgotIDExYzoJMDQgZTAgYjYgNDEuKgotIDEyMDoJMDAgN2YgOWEgNDEuKgotIDEyNDoJMDAgZmYgOWEgNDEuKgotIDEyODoJMDAgN2YgOWIgNDEuKgotIDEyYzoJMDAgZmYgOWIgNDEuKgotIDEzMDoJMDAgOTAgYjYgNDEgMDAgMDAgMDAgZTAuKgotIDEzODoJMDAgYjAgYjYgNDEgMDAgMDAgMDAgZTAuKgotIDE0MDoJMDAgZDAgYjYgNDEgMDAgMDAgMDAgZTAuKgotIDE0ODoJMDAgZjAgYjYgNDEgMDAgMDAgMDAgZTAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxZmI5Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAxNDozMjoxNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wczIucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgMDAwMDAwMDAgICAwMkI3ODAwOCAgICAgICAgIGRjYWNoZWMgcjgocjEwOm0pICAgICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLSAgICAgICAgMiAwMDAwMDAwNCAgIDAyOUUwMDA0ICAgICAgICAgZGNhY2hlYyA0KHIxMDptKSAgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgMyAwMDAwMDAwOCAgIDAyOUU3RkZDICAgICAgICAgZGNhY2hlYyAtNChyMTA6bSkgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgNCAwMDAwMDAwQyAgIDAyQjc5MDAwICAgICAgICAgZGNhY2hlYyAweDEyMzQ1Njc4KHIxMDptKSAgICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICAgIDAwMDAwMDEwICAgMTIzNDU2NzggCi0gICAgICAgIDUgMDAwMDAwMTQgICAwMkI3OTAwMCAgICAgICAgIGRjYWNoZWMgMHhERUFEQkVFRihyMTA6bSkgICAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgICAwMDAwMDAxOCAgIERFQURCRUVGIAotICAgICAgICA2IDAwMDAwMDFDICAgMEFCNzgwMDggICAgICAgICBkY2FjaGVmIHI4KHIxMDptKSAgICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybSAobW9kaWZpZWQpCi0gICAgICAgIDcgMDAwMDAwMjAgICAwQTlFMDAwNCAgICAgICAgIGRjYWNoZWYgNChyMTA6bSkgICAgICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgIDggMDAwMDAwMjQgICAwQTlFN0ZGQyAgICAgICAgIGRjYWNoZWYgLTQocjEwOm0pICAgICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgIDkgMDAwMDAwMjggICAwQUI3OTAwMCAgICAgICAgIGRjYWNoZWYgMHgxMjM0NTY3OChyMTA6bSkgICAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgICAwMDAwMDAyQyAgIDEyMzQ1Njc4IAotICAgICAgIDEwIDAwMDAwMDMwICAgMEFCNzkwMDAgICAgICAgICBkY2FjaGVmIDB4REVBREJFRUYocjEwOm0pICAgICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgICAgMDAwMDAwMzQgICBERUFEQkVFRiAKLSAgICAgICAxMSAwMDAwMDAzOCAgIDQxQjQ4NDA0ICAgICAgICAgZGxkLmIgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMiAwMDAwMDAzQyAgIDQxQjRBNDA0ICAgICAgICAgZGxkLmggICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMyAwMDAwMDA0MCAgIDQxQjRDNDA0ICAgICAgICAgZGxkICAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNCAwMDAwMDA0NCAgIDQxQjRFNDA0ICAgICAgICAgZGxkLmQgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNSAwMDAwMDA0OCAgIDQxQjQ5NDAwICAgICAgICAgZGxkLmIgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA0QyAgIEUwMDAwMDAwIAotICAgICAgIDE2IDAwMDAwMDUwICAgNDFCNEI0MDAgICAgICAgICBkbGQuaCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDU0ICAgRTAwMDAwMDAgCi0gICAgICAgMTcgMDAwMDAwNTggICA0MUI0RDQwMCAgICAgICAgIGRsZCAgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNUMgICBFMDAwMDAwMCAKLSAgICAgICAxOCAwMDAwMDA2MCAgIDQxQjRGNDAwICAgICAgICAgZGxkLmQgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA2NCAgIEUwMDAwMDAwIAotICAgICAgIDE5IDAwMDAwMDY4ICAgNDFCNTg0MDQgICAgICAgICBkbGQudWIgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIwIDAwMDAwMDZDICAgNDFCNUE0MDQgICAgICAgICBkbGQudWggIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIxIDAwMDAwMDcwICAgNDFCNTk0MDAgICAgICAgICBkbGQudWIgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDc0ICAgRTAwMDAwMDAgCi0gICAgICAgMjIgMDAwMDAwNzggICA0MUI1QjQwMCAgICAgICAgIGRsZC51aCAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwN0MgICBFMDAwMDAwMCAKLSAgICAgICAyMyAwMDAwMDA4MCAgIDQxQjY4NDA0ICAgICAgICAgZHN0LmIgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNCAwMDAwMDA4NCAgIDQxQjZBNDA0ICAgICAgICAgZHN0LmggICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNSAwMDAwMDA4OCAgIDQxQjZDNDA0ICAgICAgICAgZHN0ICAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNiAwMDAwMDA4QyAgIDQxQjZFNDA0ICAgICAgICAgZHN0LmQgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNyAwMDAwMDA5MCAgIDQxQjY5NDAwICAgICAgICAgZHN0LmIgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA5NCAgIEUwMDAwMDAwIAotICAgICAgIDI4IDAwMDAwMDk4ICAgNDFCNkI0MDAgICAgICAgICBkc3QuaCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDlDICAgRTAwMDAwMDAgCi0gICAgICAgMjkgMDAwMDAwQTAgICA0MUI2RDQwMCAgICAgICAgIGRzdCAgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQTQgICBFMDAwMDAwMCAKLSAgICAgICAzMCAwMDAwMDBBOCAgIDQxQjZGNDAwICAgICAgICAgZHN0LmQgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBBQyAgIEUwMDAwMDAwIAotICAgICAgIDMxIDAwMDAwMEIwICAgNDFCNDgwMDQgICAgICAgICBsZC5iICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDMyIDAwMDAwMEI0ICAgNDFCNEEwMDQgICAgICAgICBsZC5oICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDMzIDAwMDAwMEI4ICAgNDFCNEMwMDQgICAgICAgICBsZCAgICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDM0IDAwMDAwMEJDICAgNDFCNEUwMDQgICAgICAgICBsZC5kICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDM1IDAwMDAwMEMwICAgNDE5MjdGRjAgICAgICAgICBsZC5iICAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAzNiAwMDAwMDBDNCAgIDQxOTJGRkYwICAgICAgICAgbGQuaCAgICAtMTYocjY6bSkscjggICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgMzcgMDAwMDAwQzggICA0MTkzN0ZGMCAgICAgICAgIGxkICAgICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDM4IDAwMDAwMENDICAgNDE5M0ZGRjAgICAgICAgICBsZC5kICAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAzOSAwMDAwMDBEMCAgIDQxQjQ5MDAwICAgICAgICAgbGQuYiAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBENCAgIEUwMDAwMDAwIAotICAgICAgIDQwIDAwMDAwMEQ4ICAgNDFCNEIwMDAgICAgICAgICBsZC5oICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAxNDozMjoxNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wczIucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgICAgMDAwMDAwREMgICBFMDAwMDAwMCAKLSAgICAgICA0MSAwMDAwMDBFMCAgIDQxQjREMDAwICAgICAgICAgbGQgICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBFNCAgIEUwMDAwMDAwIAotICAgICAgIDQyIDAwMDAwMEU4ICAgNDFCNEYwMDAgICAgICAgICBsZC5kICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEVDICAgRTAwMDAwMDAgCi0gICAgICAgNDMgMDAwMDAwRjAgICA0MUI1ODAwNCAgICAgICAgIGxkLnViICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNDQgMDAwMDAwRjQgICA0MUI1QTAwNCAgICAgICAgIGxkLnVoICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNDUgMDAwMDAwRjggICA0MTk2N0ZGMCAgICAgICAgIGxkLnViICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDQ2IDAwMDAwMEZDICAgNDE5NkZGRjAgICAgICAgICBsZC51aCAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICA0NyAwMDAwMDEwMCAgIDQxQjU5MDAwICAgICAgICAgbGQudWIgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDEwNCAgIEUwMDAwMDAwIAotICAgICAgIDQ4IDAwMDAwMTA4ICAgNDFCNUIwMDAgICAgICAgICBsZC51aCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTBDICAgRTAwMDAwMDAgCi0gICAgICAgNDkgMDAwMDAxMTAgICA0MUI2ODAwNCAgICAgICAgIHN0LmIgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTAgMDAwMDAxMTQgICA0MUI2QTAwNCAgICAgICAgIHN0LmggICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTEgMDAwMDAxMTggICA0MUI2QzAwNCAgICAgICAgIHN0ICAgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTIgMDAwMDAxMUMgICA0MUI2RTAwNCAgICAgICAgIHN0LmQgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTMgMDAwMDAxMjAgICA0MTlBN0YwMCAgICAgICAgIHN0LmIgICAgLTI1NihyNjptKSxyOCAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDU0IDAwMDAwMTI0ICAgNDE5QUZGMDAgICAgICAgICBzdC5oICAgIC0yNTYocjY6bSkscjggICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICA1NSAwMDAwMDEyOCAgIDQxOUI3RjAwICAgICAgICAgc3QgICAgICAtMjU2KHI2Om0pLHI4ICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgNTYgMDAwMDAxMkMgICA0MTlCRkYwMCAgICAgICAgIHN0LmQgICAgLTI1NihyNjptKSxyOCAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDU3IDAwMDAwMTMwICAgNDFCNjkwMDAgICAgICAgICBzdC5iICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTM0ICAgRTAwMDAwMDAgCi0gICAgICAgNTggMDAwMDAxMzggICA0MUI2QjAwMCAgICAgICAgIHN0LmggICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAxM0MgICBFMDAwMDAwMCAKLSAgICAgICA1OSAwMDAwMDE0MCAgIDQxQjZEMDAwICAgICAgICAgc3QgICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDE0NCAgIEUwMDAwMDAwIAotICAgICAgIDYwIDAwMDAwMTQ4ICAgNDFCNkYwMDAgICAgICAgICBzdC5kICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTRDICAgRTAwMDAwMDAgCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc1NWIzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIucworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLQlkY2FjaGVjCXI4KHIxMDptKQkJOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLQlkY2FjaGVjCTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVjCS00KHIxMDptKQkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlYwkweDEyMzQ1Njc4KHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWMJMHhERUFEQkVFRihyMTA6bSkJOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVmCXI4KHIxMDptKQkJOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLQlkY2FjaGVmCTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVmCS00KHIxMDptKQkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlZgkweDEyMzQ1Njc4KHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWYJMHhERUFEQkVFRihyMTA6bSkJOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkbGQuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JZGxkLmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRsZC51YglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLnVoCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQudWgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JZHN0LmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkLmIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5kCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5iCS0xNihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotCWxkLmgJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQuZAktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQuaAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkLnViCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC51aAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQudWIJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQudWgJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQudWIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlsZC51aAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0LmIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0CXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5kCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5iCS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdC5oCS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdAktMjU2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0Jc3QuZAktMjU2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0Jc3QuYgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0LmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlzdAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0LmQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhMzAxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCByZWdpc3RlciBvcGVyYW5kcyB3aXRoIDpzIG1vZGlmaWVyCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwNCAwYyBiNCA0MS4qCi0gICA0OgkwNCAyYyBiNCA0MS4qCi0gICA4OgkwNCA0YyBiNCA0MS4qCi0gICBjOgkwNCA2YyBiNCA0MS4qCi0gIDEwOgkwNCAwYyBiNSA0MS4qCi0gIDE0OgkwNCAyYyBiNSA0MS4qCi0gIDE4OgkwNCAwYyBiNiA0MS4qCi0gIDFjOgkwNCAyYyBiNiA0MS4qCi0gIDIwOgkwNCA0YyBiNiA0MS4qCi0gIDI0OgkwNCA2YyBiNiA0MS4qCi0gIDI4OgkwNCAwOCBiNCA0MS4qCi0gIDJjOgkwNCAyOCBiNCA0MS4qCi0gIDMwOgkwNCA0OCBiNCA0MS4qCi0gIDM0OgkwNCA2OCBiNCA0MS4qCi0gIDM4OgkwNCAwOCBiNSA0MS4qCi0gIDNjOgkwNCAyOCBiNSA0MS4qCi0gIDQwOgkwNCAwOCBiNiA0MS4qCi0gIDQ0OgkwNCAyOCBiNiA0MS4qCi0gIDQ4OgkwNCA0OCBiNiA0MS4qCi0gIDRjOgkwNCA2OCBiNiA0MS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU4MDNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDE0OjMyOjE5IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzMy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAwMDAwMDAwMCAgIDQxQjQwQzA0ICAgICAgICAgZGxkLmIgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgMiAwMDAwMDAwNCAgIDQxQjQyQzA0ICAgICAgICAgZGxkLmggICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgMyAwMDAwMDAwOCAgIDQxQjQ0QzA0ICAgICAgICAgZGxkICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNCAwMDAwMDAwQyAgIDQxQjQ2QzA0ICAgICAgICAgZGxkLmQgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNSAwMDAwMDAxMCAgIDQxQjUwQzA0ICAgICAgICAgZGxkLnViICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNiAwMDAwMDAxNCAgIDQxQjUyQzA0ICAgICAgICAgZGxkLnVoICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNyAwMDAwMDAxOCAgIDQxQjYwQzA0ICAgICAgICAgZHN0LmIgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgOCAwMDAwMDAxQyAgIDQxQjYyQzA0ICAgICAgICAgZHN0LmggICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgOSAwMDAwMDAyMCAgIDQxQjY0QzA0ICAgICAgICAgZHN0ICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMCAwMDAwMDAyNCAgIDQxQjY2QzA0ICAgICAgICAgZHN0LmQgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMSAwMDAwMDAyOCAgIDQxQjQwODA0ICAgICAgICAgbGQuYiAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMiAwMDAwMDAyQyAgIDQxQjQyODA0ICAgICAgICAgbGQuaCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMyAwMDAwMDAzMCAgIDQxQjQ0ODA0ICAgICAgICAgbGQgICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNCAwMDAwMDAzNCAgIDQxQjQ2ODA0ICAgICAgICAgbGQuZCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNSAwMDAwMDAzOCAgIDQxQjUwODA0ICAgICAgICAgbGQudWIgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNiAwMDAwMDAzQyAgIDQxQjUyODA0ICAgICAgICAgbGQudWggICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNyAwMDAwMDA0MCAgIDQxQjYwODA0ICAgICAgICAgc3QuYiAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxOCAwMDAwMDA0NCAgIDQxQjYyODA0ICAgICAgICAgc3QuaCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxOSAwMDAwMDA0OCAgIDQxQjY0ODA0ICAgICAgICAgc3QgICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyMCAwMDAwMDA0QyAgIDQxQjY2ODA0ICAgICAgICAgc3QuZCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDg3ZDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCWRsZC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLnViCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWgJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0CXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuYglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnViCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC51aAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuYglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzYwN2M5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzIHdpdGggYm90aCA6bSBhbmQgOnMgbW9kaWZpZXIKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTA0IDhjIGI0IDQxLioKLSAgIDQ6CTA0IGFjIGI0IDQxLioKLSAgIDg6CTA0IGNjIGI0IDQxLioKLSAgIGM6CTA0IGVjIGI0IDQxLioKLSAgMTA6CTA0IDhjIGI1IDQxLioKLSAgMTQ6CTA0IGFjIGI1IDQxLioKLSAgMTg6CTA0IDhjIGI2IDQxLioKLSAgMWM6CTA0IGFjIGI2IDQxLioKLSAgMjA6CTA0IGNjIGI2IDQxLioKLSAgMjQ6CTA0IGVjIGI2IDQxLioKLSAgMjg6CTA0IDg4IGI0IDQxLioKLSAgMmM6CTA0IGE4IGI0IDQxLioKLSAgMzA6CTA0IGM4IGI0IDQxLioKLSAgMzQ6CTA0IGU4IGI0IDQxLioKLSAgMzg6CTA0IDg4IGI1IDQxLioKLSAgM2M6CTA0IGE4IGI1IDQxLioKLSAgNDA6CTA0IDg4IGI2IDQxLioKLSAgNDQ6CTA0IGE4IGI2IDQxLioKLSAgNDg6CTA0IGM4IGI2IDQxLioKLSAgNGM6CTA0IGU4IGI2IDQxLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjNjOWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFdlZCBGZWIgMjYgMTQ6MzI6MjUgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHM0LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxIDAwMDAwMDAwICAgNDFCNDhDMDQgICAgICAgICBkbGQuYiAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAyIDAwMDAwMDA0ICAgNDFCNEFDMDQgICAgICAgICBkbGQuaCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAzIDAwMDAwMDA4ICAgNDFCNENDMDQgICAgICAgICBkbGQgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA0IDAwMDAwMDBDICAgNDFCNEVDMDQgICAgICAgICBkbGQuZCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA1IDAwMDAwMDEwICAgNDFCNThDMDQgICAgICAgICBkbGQudWIgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA2IDAwMDAwMDE0ICAgNDFCNUFDMDQgICAgICAgICBkbGQudWggIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA3IDAwMDAwMDE4ICAgNDFCNjhDMDQgICAgICAgICBkc3QuYiAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA4IDAwMDAwMDFDICAgNDFCNkFDMDQgICAgICAgICBkc3QuaCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA5IDAwMDAwMDIwICAgNDFCNkNDMDQgICAgICAgICBkc3QgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEwIDAwMDAwMDI0ICAgNDFCNkVDMDQgICAgICAgICBkc3QuZCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDExIDAwMDAwMDI4ICAgNDFCNDg4MDQgICAgICAgICBsZC5iICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEyIDAwMDAwMDJDICAgNDFCNEE4MDQgICAgICAgICBsZC5oICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEzIDAwMDAwMDMwICAgNDFCNEM4MDQgICAgICAgICBsZCAgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE0IDAwMDAwMDM0ICAgNDFCNEU4MDQgICAgICAgICBsZC5kICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE1IDAwMDAwMDM4ICAgNDFCNTg4MDQgICAgICAgICBsZC51YiAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE2IDAwMDAwMDNDICAgNDFCNUE4MDQgICAgICAgICBsZC51aCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE3IDAwMDAwMDQwICAgNDFCNjg4MDQgICAgICAgICBzdC5iICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE4IDAwMDAwMDQ0ICAgNDFCNkE4MDQgICAgICAgICBzdC5oICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE5IDAwMDAwMDQ4ICAgNDFCNkM4MDQgICAgICAgICBzdCAgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIwIDAwMDAwMDRDICAgNDFCNkU4MDQgICAgICAgICBzdC5kICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhNzdlOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JZGxkLmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC51YglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0CXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnViCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnVoCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWYwNGIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLWV4dGVybiBpbnQgeGZ1bmMgKGludCB5KTsKLQotc3RhdGljIGludCBzZnVuYyAoaW50IHkpCi17Ci0gIHhmdW5jICh5KTsKLX0KLQotaW50IGdmdW5jIChpbnQgeSkKLXsKLSAgc2Z1bmMgKHkpOwotfQotCi1pbnQgYnJhbmNoZXMgKGludCB5KQotewotICBpbnQgejsKLQotICBmb3IgKHogPSB5OyB6IDwgeSArIDEwOyB6KyspCi0gICAgewotICAgICAgaWYgKHogJiAweDEpCi0JewotCSAgZ2Z1bmMgKHopOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB4ZnVuYyAoeik7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjYTZjOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmQKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBzaW1wbGUgcmVsb2NzLCBnbG9iYWwvbG9jYWwgZnVuY3MgJiBicmFuY2hlcyAoY29kZSkKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPF9zZnVuYz46Ci0gICAwOglmMCBmZiA2YyAwOC4qCi0gICA0OgkwYyAwMCA1OSBmOC4qCi0gICA4OgkwMCAwMCA1OSAxMC4qCi0gICBjOgkwMCA5MCAzOCBmOCAwMCAwMCAwMCAwMC4qCi0gIDE0OgkwMCAwMCA1MSAxMC4qCi0gIDE4OgkwYyAwMCA1MSBmOC4qCi0gIDFjOgkxZiA4MCAzOCAwMC4qCi0gIDIwOgkxMCA4MCA2YyAwOC4qCi0KLTAwMDAwMDI0IDxfZ2Z1bmM+OgotICAyNDoJZjAgZmYgNmMgMDguKgotICAyODoJMGMgMDAgNTkgZjguKgotICAyYzoJMDAgMDAgNTkgMTAuKgotICAzMDoJMDAgOTAgMzggZjggMDAgMDAgMDAgMDAuKgotICAzODoJMDAgMDAgNTEgMTAuKgotICAzYzoJMGMgMDAgNTEgZjguKgotICA0MDoJMWYgODAgMzggMDAuKgotICA0NDoJMTAgODAgNmMgMDguKgotCi0wMDAwMDA0OCA8X2JyYW5jaGVzPjoKLSAgNDg6CWYwIGZmIDZjIDA4LioKLSAgNGM6CTBjIDAwIDU5IGY4LioKLSAgNTA6CTAwIDAwIDU5IDEwLioKLSAgNTQ6CTAwIDAwIDUxIDEwLioKLSAgNTg6CTA0IDAwIDU5IDEwLioKLSAgNWM6CTAwIDAwIDUxIDEwLioKLSAgNjA6CTA0IDAwIDUxIDE4LioKLSAgNjQ6CTBhIDgwIGFjIDEwLioKLSAgNjg6CTAzIDAwIGJhIDEwLioKLSAgNmM6CTEyIDgwIGE1IDMwLioKLSAgNzA6CTA0IDAwIDUxIDEwLioKLSAgNzQ6CTA1IDgwIGE0IGY4LioKLSAgNzg6CTAwIDkwIDM4IGY4IDI0IDAwIDAwIDAwLioKLSAgODA6CTA0IDAwIDUxIDEwLioKLSAgODQ6CTA0IDgwIDI0IDAwLioKLSAgODg6CTAwIDkwIDM4IGY4IDAwIDAwIDAwIDAwLioKLSAgOTA6CTA0IDAwIDUxIDEwLioKLSAgOTQ6CTA0IDAwIDUxIDEwLioKLSAgOTg6CTAxIDgwIGFjIDEwLioKLSAgOWM6CTA0IDAwIDU5IDEwLioKLSAgYTA6CTAwIDAwIDUxIDE4LioKLSAgYTQ6CTA0IDAwIDUxIDEwLioKLSAgYTg6CTBhIDgwIGVjIDE4LioKLSAgYWM6CTAyIDAwIGZhIDEwLioKLSAgYjA6CWYwIGZmIGE1IDM4LioKLSAgYjQ6CTBjIDAwIDUxIGY4LioKLSAgYjg6CTFmIDgwIDM4IDAwLioKLSAgYmM6CTEwIDgwIDZjIDA4LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYWViMWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFNhdCBGZWIgMjIgMTM6MTk6MjggMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MxLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUgaGFuZCBoYWNrZWQgb3V0cHV0IG9mIHRoZSBUSSBDIGNvbXBpbGVyIGZvciBhIHNpbXBsZQotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgdGVzdCBwcm9ncmFtIHRoYXQgY29udGFpbnMgbG9jYWwvZ2xvYmFsIGZ1bmN0aW9ucywgbG9jYWwvZ2xvYmFsCi0gICAgICAgIDMgICAgICAgICAgICAgICAgICAgICA7OyBmdW5jdGlvbiBjYWxscywgYW5kIGFuICJpZiIgYW5kICJmb3IiIHN0YXRlbWVudC4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94ZnVuYwotICAgICAgICA2ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDcgMDAwMDAwMDAgICAgICAgICAgICBfc2Z1bmM6Ci0gICAgICAgIDggMDAwMDAwMDAgICAwODZDRkZGMCAgICAgICAgICBhZGR1ICAgICAgLTE2LHIxLHIxCi0gICAgICAgIDkgMDAwMDAwMDQgICBGODU5MDAwQyAgICAgICAgICBzdCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDEwIDAwMDAwMDA4ICAgMTA1OTAwMDAgICAgICAgICAgc3QgICAgICAgIDAocjEpLHIyCi0gICAgICAgMTEgMDAwMDAwMEMgICBGODM4OTAwMCAgICAgICAgICBqc3IgICAgICAgX3hmdW5jKHIwKSxyMzEKLSAgICAgICAgICAwMDAwMDAxMCAgIDAwMDAwMDAwIAotICAgICAgIDEyIDAwMDAwMDE0ICAgMTA1MTAwMDAgICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgMTMgMDAwMDAwMTggICBGODUxMDAwQyAgICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDE0IDAwMDAwMDFDICAgMDAzODgwMUYgICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKLSAgICAgICAxNSAwMDAwMDAyMCAgIDA4NkM4MDEwICAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQotICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dmdW5jCi0gICAgICAgMTggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxOSAwMDAwMDAyNCAgICAgICAgICAgIF9nZnVuYzoKLSAgICAgICAyMCAwMDAwMDAyNCAgIDA4NkNGRkYwICAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAyMSAwMDAwMDAyOCAgIEY4NTkwMDBDICAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMjIgMDAwMDAwMkMgICAxMDU5MDAwMCAgICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAyMyAwMDAwMDAzMCAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfc2Z1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDM0ICAgMDAwMDAwMDAgCi0gICAgICAgMjQgMDAwMDAwMzggICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAyNSAwMDAwMDAzQyAgIEY4NTEwMDBDICAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMjYgMDAwMDAwNDAgICAwMDM4ODAxRiAgICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgIDI3IDAwMDAwMDQ0ICAgMDg2QzgwMTAgICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0gICAgICAgMjggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyOSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9icmFuY2hlcwotICAgICAgIDMxICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMzIgMDAwMDAwNDggICAgICAgICAgICBfYnJhbmNoZXM6Ci0gICAgICAgMzMgMDAwMDAwNDggICAwODZDRkZGMCAgICAgICAgICBhZGR1ICAgICAgLTE2LHIxLHIxCi0gICAgICAgMzQgMDAwMDAwNEMgICBGODU5MDAwQyAgICAgICAgICBzdCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDM1IDAwMDAwMDUwICAgMTA1OTAwMDAgICAgICAgICAgc3QgICAgICAgIDAocjEpLHIyCi0gICAgICAgMzYgMDAwMDAwNTQgICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAzNyAwMDAwMDA1OCAgIDEwNTkwMDA0ICAgICAgICAgIHN0ICAgICAgICA0KHIxKSxyMgotICAgICAgIDM4IDAwMDAwMDVDICAgMTA1MTAwMDAgICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgMzkgMDAwMDAwNjAgICAxODUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjMKLSAgICAgICA0MCAwMDAwMDA2NCAgIDEwQUM4MDBBICAgICAgICAgIGFkZHUgICAgICAxMCxyMixyMgotICAgICAgIDQxIDAwMDAwMDY4ICAgMTBCQTAwMDMgICAgICAgICAgY21wICAgICAgIHIzLHIyLHIyCi0gICAgICAgNDIgMDAwMDAwNkMgICAzMEE1ODAxMiAgICAgICAgICBiYm8uYSAgICAgTDEyLHIyLGdlLncKLSAgICAgICA0MyAwMDAwMDA3MCAgICAgICAgICAgIEw4OgotICAgICAgIDQ0IDAwMDAwMDcwICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgNDUgMDAwMDAwNzQgICBGOEE0ODAwNSAgICAgICAgICBiYnouYSAgICAgTDEwLHIyLDAKLSAgICAgICA0NiAwMDAwMDA3OCAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfZ2Z1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDdDICAgMDAwMDAwMjQgCi0gICAgICAgNDcgMDAwMDAwODAgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICA0OCAwMDAwMDA4NCAgIDAwMjQ4MDA0ICAgICAgICAgIGJyLmEgICAgICBMMTEKLSAgICAgICA0OSAwMDAwMDA4OCAgICAgICAgICAgIEwxMDoKLSAgICAgICA1MCAwMDAwMDA4OCAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDhDICAgMDAwMDAwMDAgCi0gICAgICAgNTEgMDAwMDAwOTAgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFNhdCBGZWIgMjIgMTM6MTk6MjggMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MxLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgIDUyIDAwMDAwMDk0ICAgICAgICAgICAgTDExOgotICAgICAgIDUzIDAwMDAwMDk0ICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgNTQgMDAwMDAwOTggICAxMEFDODAwMSAgICAgICAgICBhZGR1ICAgICAgMSxyMixyMgotICAgICAgIDU1IDAwMDAwMDlDICAgMTA1OTAwMDQgICAgICAgICAgc3QgICAgICAgIDQocjEpLHIyCi0gICAgICAgNTYgMDAwMDAwQTAgICAxODUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjMKLSAgICAgICA1NyAwMDAwMDBBNCAgIDEwNTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgIDU4IDAwMDAwMEE4ICAgMThFQzgwMEEgICAgICAgICAgYWRkdSAgICAgIDEwLHIzLHIzCi0gICAgICAgNTkgMDAwMDAwQUMgICAxMEZBMDAwMiAgICAgICAgICBjbXAgICAgICAgcjIscjMscjIKLSAgICAgICA2MCAwMDAwMDBCMCAgIDM4QTVGRkYwICAgICAgICAgIGJiby5hICAgICBMOCxyMixsdC53Ci0gICAgICAgNjEgMDAwMDAwQjQgICAgICAgICAgICBMMTI6Ci0gICAgICAgNjIgMDAwMDAwQjQgICBGODUxMDAwQyAgICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDYzIDAwMDAwMEI4ICAgMDAzODgwMUYgICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKLSAgICAgICA2NCAwMDAwMDBCQyAgIDA4NkM4MDEwICAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5ZTM5NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi07OyBUaGlzIGlzIHRoZSBoYW5kIGhhY2tlZCBvdXRwdXQgb2YgdGhlIFRJIEMgY29tcGlsZXIgZm9yIGEgc2ltcGxlCi07OyB0ZXN0IHByb2dyYW0gdGhhdCBjb250YWlucyBsb2NhbC9nbG9iYWwgZnVuY3Rpb25zLCBsb2NhbC9nbG9iYWwKLTs7IGZ1bmN0aW9uIGNhbGxzLCBhbmQgYW4gImlmIiBhbmQgImZvciIgc3RhdGVtZW50LgotCi0JLmZpbGUJICAgInJlbG9jczEucyIKLQotCS5nbG9iYWwJX3hmdW5jCi0KLV9zZnVuYzoKLSAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQotICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKLSAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQotCi0JLmdsb2JhbAlfZ2Z1bmMKLQotX2dmdW5jOgotICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQotICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgotICAgICAgICAganNyICAgICAgIF9zZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0KLQotCS5nbG9iYWwJX2JyYW5jaGVzCi0KLV9icmFuY2hlczoKLSAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgICAgc3QgICAgICAgIDQocjEpLHIyCi0gICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMwotICAgICAgICAgYWRkdSAgICAgIDEwLHIyLHIyCi0gICAgICAgICBjbXAgICAgICAgcjMscjIscjIKLSAgICAgICAgIGJiby5hICAgICBMMTIscjIsZ2UudwotTDg6Ci0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGJiei5hICAgICBMMTAscjIsMAotICAgICAgICAganNyICAgICAgIF9nZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGJyLmEgICAgICBMMTEKLUwxMDoKLSAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi1MMTE6Ci0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGFkZHUgICAgICAxLHIyLHIyCi0gICAgICAgICBzdCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMwotICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgICBhZGR1ICAgICAgMTAscjMscjMKLSAgICAgICAgIGNtcCAgICAgICByMixyMyxyMgotICAgICAgICAgYmJvLmEgICAgIEw4LHIyLGx0LncKLUwxMjoKLSAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMWIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViMzE2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxYi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jc291cmNlOiByZWxvY3MxLnMKLSNuYW1lOiBUSWM4MCBzaW1wbGUgcmVsb2NzLCBnbG9iYWwvbG9jYWwgZnVuY3MgJiBicmFuY2hlcyAocmVsb2NzKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMDAwMDAwMTAgMzIgICAgICAgICAgICAgICAgX3hmdW5jCi0wMDAwMDAzNCAzMiAgICAgICAgICAgICAgICAudGV4dAotMDAwMDAwN2MgMzIgICAgICAgICAgICAgICAgLnRleHQKLTAwMDAwMDhjIDMyICAgICAgICAgICAgICAgIF94ZnVuYwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjExMjBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLWV4dGVybiBjaGFyIHhfY2hhcjsKLWV4dGVybiBzaG9ydCB4X3Nob3J0Owotc3RhdGljIGludCB4X2ludDsKLWV4dGVybiBsb25nIHhfbG9uZzsKLWV4dGVybiBmbG9hdCB4X2Zsb2F0OwotZXh0ZXJuIGRvdWJsZSB4X2RvdWJsZTsKLWV4dGVybiBjaGFyICp4X2NoYXJfcDsKLQotc3RhdGljIGNoYXIgc19jaGFyOwotc3RhdGljIHNob3J0IHNfc2hvcnQ7Ci1zdGF0aWMgaW50IHNfaW50Owotc3RhdGljIGxvbmcgc19sb25nOwotc3RhdGljIGZsb2F0IHNfZmxvYXQ7Ci1zdGF0aWMgZG91YmxlIHNfZG91YmxlOwotc3RhdGljIGNoYXIgKnNfY2hhcl9wOwotCi1jaGFyIGdfY2hhcjsKLXNob3J0IGdfc2hvcnQ7Ci1pbnQgZ19pbnQ7Ci1sb25nIGdfbG9uZzsKLWZsb2F0IGdfZmxvYXQ7Ci1kb3VibGUgZ19kb3VibGU7Ci1jaGFyICpnX2NoYXJfcDsKLQotbWFpbiAoKQotewotICB4X2NoYXIgPSBzX2NoYXI7Ci0gIGdfY2hhciA9IHhfY2hhcjsKLSAgeF9zaG9ydCA9IHNfc2hvcnQ7Ci0gIGdfc2hvcnQgPSB4X3Nob3J0OwotICB4X2ludCA9IHNfaW50OwotICBnX2ludCA9IHhfaW50OwotICB4X2xvbmcgPSBzX2xvbmc7Ci0gIGdfbG9uZyA9IHhfbG9uZzsKLSAgeF9mbG9hdCA9IHNfZmxvYXQ7Ci0gIGdfZmxvYXQgPSB4X2Zsb2F0OwotICB4X2RvdWJsZSA9IHNfZG91YmxlOwotICBnX2RvdWJsZSA9IHhfZG91YmxlOwotICB4X2NoYXJfcCA9IHNfY2hhcl9wOwotICBnX2NoYXJfcCA9IHhfY2hhcl9wOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjNlODdkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIuZAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIHN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAoY29kZSkKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPF9tYWluPjoKLSAgIDA6CTAwIDEwIDM0IDEwIDI0IDAyIDAwIDAwLioKLSAgIDg6CTAwIDEwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgMTA6CTAwIDEwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgMTg6CTAwIDEwIDM2IDEwIDA0IDAyIDAwIDAwLioKLSAgMjA6CTAwIDMwIDM0IDEwIDI0IDAzIDAwIDAwLioKLSAgMjg6CTAwIDMwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgMzA6CTAwIDMwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgMzg6CTAwIDMwIDM2IDEwIDA0IDAzIDAwIDAwLioKLSAgNDA6CTAwIDUwIDM0IDEwIDM0IDAyIDAwIDAwLioKLSAgNDg6CTAwIDUwIDM2IDEwIDM0IDAzIDAwIDAwLioKLSAgNTA6CTAwIDUwIDM0IDEwIDM0IDAzIDAwIDAwLioKLSAgNTg6CTAwIDUwIDM2IDEwIDE0IDAyIDAwIDAwLioKLSAgNjA6CTAwIDUwIDM0IDEwIGY0IDAxIDAwIDAwLioKLSAgNjg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgNzA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgNzg6CTAwIDUwIDM2IDEwIGY0IDAwIDAwIDAwLioKLSAgODA6CTAwIDUwIDM0IDEwIGY0IDAyIDAwIDAwLioKLSAgODg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgOTA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgOTg6CTAwIDUwIDM2IDEwIDE0IDAzIDAwIDAwLioKLSAgYTA6CTAwIDcwIDM0IDEwIGU0IDAxIDAwIDAwLioKLSAgYTg6CTAwIDcwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgYjA6CTAwIDcwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgYjg6CTAwIDcwIDM2IDEwIGU0IDAyIDAwIDAwLioKLSAgYzA6CTAwIDUwIDM0IDEwIDQ0IDAzIDAwIDAwLioKLSAgYzg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgZDA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgZDg6CTAwIDUwIDM2IDEwIGU0IDAwIDAwIDAwLioKLSAgZTA6CTFmIGEwIDM4IDAwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OTBhOGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTdW4gRmViIDIzIDEyOjE2OjMyIDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVsb2NzMi5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgaXMgdGhlIGhhbmQgaGFja2VkIG91dHB1dCBvZiB0aGUgVEkgQyBjb21waWxlciBmb3IgYSBzaW1wbGUKLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IHRlc3QgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIHN0YXRpYywgZ2xvYmFsLCBhbmQgZXh0ZXJuIGRhdGEgdmFyaWFibGVzLgotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWxlICAgInJlbG9jczIucyIKLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9jaGFyCi0gICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX3hfc2hvcnQKLSAgICAgICAgNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9sb25nCi0gICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX3hfZmxvYXQKLSAgICAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9kb3VibGUKLSAgICAgICAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9jaGFyX3AKLSAgICAgICAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19jaGFyCi0gICAgICAgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfc2hvcnQKLSAgICAgICAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19pbnQKLSAgICAgICAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19sb25nCi0gICAgICAgMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfZmxvYXQKLSAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19kb3VibGUKLSAgICAgICAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19jaGFyX3AKLSAgICAgICAxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfbWFpbgotICAgICAgIDE5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjAgMDAwMDAwMDAgICAgICAgICAgICBfbWFpbjoKLSAgICAgICAyMSAwMDAwMDAwMCAgIDEwMzQxMDAwICAgICAgICAgIGxkLmIgICAgICBfc19jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMDQgICAwMDAwMDAxQyAKLSAgICAgICAyMiAwMDAwMDAwOCAgIDEwMzYxMDAwICAgICAgICAgIHN0LmIgICAgICBfeF9jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMEMgICAwMDAwMDAwMCAKLSAgICAgICAyMyAwMDAwMDAxMCAgIDEwMzQxMDAwICAgICAgICAgIGxkLmIgICAgICBfeF9jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMTQgICAwMDAwMDAwMCAKLSAgICAgICAyNCAwMDAwMDAxOCAgIDEwMzYxMDAwICAgICAgICAgIHN0LmIgICAgICBfZ19jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMUMgICAwMDAwMDAxNCAKLSAgICAgICAyNSAwMDAwMDAyMCAgIDEwMzQzMDAwICAgICAgICAgIGxkLmggICAgICBfc19zaG9ydCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDI0ICAgMDAwMDAwM0MgCi0gICAgICAgMjYgMDAwMDAwMjggICAxMDM2MzAwMCAgICAgICAgICBzdC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAyQyAgIDAwMDAwMDAwIAotICAgICAgIDI3IDAwMDAwMDMwICAgMTAzNDMwMDAgICAgICAgICAgbGQuaCAgICAgIF94X3Nob3J0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMzQgICAwMDAwMDAwMCAKLSAgICAgICAyOCAwMDAwMDAzOCAgIDEwMzYzMDAwICAgICAgICAgIHN0LmggICAgICBfZ19zaG9ydCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDNDICAgMDAwMDAwMzQgCi0gICAgICAgMjkgMDAwMDAwNDAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3NfaW50KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNDQgICAwMDAwMDAyMCAKLSAgICAgICAzMCAwMDAwMDA0OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9pbnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA0QyAgIDAwMDAwMDQwIAotICAgICAgIDMxIDAwMDAwMDUwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF94X2ludCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDU0ICAgMDAwMDAwNDAgCi0gICAgICAgMzIgMDAwMDAwNTggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX2dfaW50KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNUMgICAwMDAwMDAxOCAKLSAgICAgICAzMyAwMDAwMDA2MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfc19sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNjQgICAwMDAwMDAxMCAKLSAgICAgICAzNCAwMDAwMDA2OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNkMgICAwMDAwMDAwMCAKLSAgICAgICAzNSAwMDAwMDA3MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfeF9sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNzQgICAwMDAwMDAwMCAKLSAgICAgICAzNiAwMDAwMDA3OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfZ19sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwN0MgICAwMDAwMDAwNCAKLSAgICAgICAzNyAwMDAwMDA4MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfc19mbG9hdCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDg0ICAgMDAwMDAwMzAgCi0gICAgICAgMzggMDAwMDAwODggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFN1biBGZWIgMjMgMTI6MTY6MzIgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MyLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgICAgIDAwMDAwMDhDICAgMDAwMDAwMDAgCi0gICAgICAgMzkgMDAwMDAwOTAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA5NCAgIDAwMDAwMDAwIAotICAgICAgIDQwIDAwMDAwMDk4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF9nX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwOUMgICAwMDAwMDAzOCAKLSAgICAgICA0MSAwMDAwMDBBMCAgIDEwMzQ3MDAwICAgICAgICAgIGxkLmQgICAgICBfc19kb3VibGUrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBBNCAgIDAwMDAwMDA4IAotICAgICAgIDQyIDAwMDAwMEE4ICAgMTAzNjcwMDAgICAgICAgICAgc3QuZCAgICAgIF94X2RvdWJsZSswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEFDICAgMDAwMDAwMDAgCi0gICAgICAgNDMgMDAwMDAwQjAgICAxMDM0NzAwMCAgICAgICAgICBsZC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQjQgICAwMDAwMDAwMCAKLSAgICAgICA0NCAwMDAwMDBCOCAgIDEwMzY3MDAwICAgICAgICAgIHN0LmQgICAgICBfZ19kb3VibGUrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBCQyAgIDAwMDAwMDI4IAotICAgICAgIDQ1IDAwMDAwMEMwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF9zX2NoYXJfcCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEM0ICAgMDAwMDAwNDQgCi0gICAgICAgNDYgMDAwMDAwQzggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX3hfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQ0MgICAwMDAwMDAwMCAKLSAgICAgICA0NyAwMDAwMDBEMCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBENCAgIDAwMDAwMDAwIAotICAgICAgIDQ4IDAwMDAwMEQ4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF9nX2NoYXJfcCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMERDICAgMDAwMDAwMDAgCi0gICAgICAgNDkgMDAwMDAwRTAgICAwMDM4QTAxRiAgICAgICAgICBqc3IuYSAgICAgcjMxKHIwKSxyMAotICAgICAgIDUwICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgNTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfY2hhcl9wCi0gICAgICAgNTIgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX2dfY2hhcl9wLDQsNAotICAgICAgIDUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2xvbmcKLSAgICAgICA1NCAwMDAwMDAwNCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19sb25nLDQsNAotICAgICAgIDU1IDAwMDAwMDA4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2RvdWJsZSw4LDgKLSAgICAgICA1NiAwMDAwMDAxMCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19sb25nLDQsNAotICAgICAgIDU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2NoYXIKLSAgICAgICA1OCAwMDAwMDAxNCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19jaGFyLDEsNAotICAgICAgIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2ludAotICAgICAgIDYwIDAwMDAwMDE4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2ludCw0LDQKLSAgICAgICA2MSAwMDAwMDAxQyAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19jaGFyLDEsNAotICAgICAgIDYyIDAwMDAwMDIwICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2ludCw0LDQKLSAgICAgICA2MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19kb3VibGUKLSAgICAgICA2NCAwMDAwMDAyOCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19kb3VibGUsOCw4Ci0gICAgICAgNjUgMDAwMDAwMzAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3NfZmxvYXQsNCw0Ci0gICAgICAgNjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfc2hvcnQKLSAgICAgICA2NyAwMDAwMDAzNCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19zaG9ydCwyLDQKLSAgICAgICA2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19mbG9hdAotICAgICAgIDY5IDAwMDAwMDM4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2Zsb2F0LDQsNAotICAgICAgIDcwIDAwMDAwMDNDICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX3Nob3J0LDIsNAotICAgICAgIDcxIDAwMDAwMDQwICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF94X2ludCw0LDQKLSAgICAgICA3MiAwMDAwMDA0NCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19jaGFyX3AsNCw0Ci0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI1N2RmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIucworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTs7IFRoaXMgaXMgdGhlIGhhbmQgaGFja2VkIG91dHB1dCBvZiB0aGUgVEkgQyBjb21waWxlciBmb3IgYSBzaW1wbGUKLTs7IHRlc3QgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIHN0YXRpYywgZ2xvYmFsLCBhbmQgZXh0ZXJuIGRhdGEgdmFyaWFibGVzLgotCi0JLmZpbGUJInJlbG9jczIucyIKLQkuZ2xvYmFsCV94X2NoYXIKLQkuZ2xvYmFsCV94X3Nob3J0Ci0JLmdsb2JhbAlfeF9sb25nCi0JLmdsb2JhbAlfeF9mbG9hdAotCS5nbG9iYWwJX3hfZG91YmxlCi0JLmdsb2JhbAlfeF9jaGFyX3AKLQkuZ2xvYmFsCV9nX2NoYXIKLQkuZ2xvYmFsCV9nX3Nob3J0Ci0JLmdsb2JhbAlfZ19pbnQKLQkuZ2xvYmFsCV9nX2xvbmcKLQkuZ2xvYmFsCV9nX2Zsb2F0Ci0JLmdsb2JhbAlfZ19kb3VibGUKLQkuZ2xvYmFsCV9nX2NoYXJfcAotCS5nbG9iYWwJX21haW4KLQotX21haW46Ci0gICAgICAgICBsZC5iICAgICAgX3NfY2hhciswKHIwKSxyMgotICAgICAgICAgc3QuYiAgICAgIF94X2NoYXIrMChyMCkscjIKLSAgICAgICAgIGxkLmIgICAgICBfeF9jaGFyKzAocjApLHIyCi0gICAgICAgICBzdC5iICAgICAgX2dfY2hhciswKHIwKSxyMgotICAgICAgICAgbGQuaCAgICAgIF9zX3Nob3J0KzAocjApLHIyCi0gICAgICAgICBzdC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKLSAgICAgICAgIGxkLmggICAgICBfeF9zaG9ydCswKHIwKSxyMgotICAgICAgICAgc3QuaCAgICAgIF9nX3Nob3J0KzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfaW50KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfaW50KzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3hfaW50KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfaW50KzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfbG9uZyswKHIwKSxyMgotICAgICAgICAgc3QgICAgICAgIF94X2xvbmcrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9sb25nKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfbG9uZyswKHIwKSxyMgotICAgICAgICAgbGQgICAgICAgIF9zX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgotICAgICAgICAgc3QgICAgICAgIF9nX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICBsZC5kICAgICAgX3NfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBzdC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBsZC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBzdC5kICAgICAgX2dfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3hfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBqc3IuYSAgICAgcjMxKHIwKSxyMAotCi0JLmdsb2JhbAlfZ19jaGFyX3AKLQkuYnNzCV9nX2NoYXJfcCw0LDQKLQkuZ2xvYmFsCV9nX2xvbmcKLQkuYnNzCV9nX2xvbmcsNCw0Ci0JLmJzcwlfc19kb3VibGUsOCw4Ci0JLmJzcwlfc19sb25nLDQsNAotCS5nbG9iYWwJX2dfY2hhcgotCS5ic3MJX2dfY2hhciwxLDQKLQkuZ2xvYmFsCV9nX2ludAotCS5ic3MJX2dfaW50LDQsNAotCS5ic3MJX3NfY2hhciwxLDQKLQkuYnNzCV9zX2ludCw0LDQKLQkuZ2xvYmFsCV9nX2RvdWJsZQotCS5ic3MJX2dfZG91YmxlLDgsOAotCS5ic3MJX3NfZmxvYXQsNCw0Ci0JLmdsb2JhbAlfZ19zaG9ydAotCS5ic3MJX2dfc2hvcnQsMiw0Ci0JLmdsb2JhbAlfZ19mbG9hdAotCS5ic3MJX2dfZmxvYXQsNCw0Ci0JLmJzcwlfc19zaG9ydCwyLDQKLQkuYnNzCV94X2ludCw0LDQKLQkuYnNzCV9zX2NoYXJfcCw0LDQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczJiLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyYi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRmOTlkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczJiLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNzb3VyY2U6IHJlbG9jczIucwotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIHN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAocmVsb2NzKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMDAwMDAwMDQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwMGMgMzIgICAgICAgICAgICAgICAgX3hfY2hhcgotMDAwMDAwMTQgMzIgICAgICAgICAgICAgICAgX3hfY2hhcgotMDAwMDAwMWMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwMjQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwMmMgMzIgICAgICAgICAgICAgICAgX3hfc2hvcnQKLTAwMDAwMDM0IDMyICAgICAgICAgICAgICAgIF94X3Nob3J0Ci0wMDAwMDAzYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA0NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA0YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA1NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA1YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA2NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA2YyAzMiAgICAgICAgICAgICAgICBfeF9sb25nCi0wMDAwMDA3NCAzMiAgICAgICAgICAgICAgICBfeF9sb25nCi0wMDAwMDA3YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA4NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA4YyAzMiAgICAgICAgICAgICAgICBfeF9mbG9hdAotMDAwMDAwOTQgMzIgICAgICAgICAgICAgICAgX3hfZmxvYXQKLTAwMDAwMDljIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGE0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGFjIDMyICAgICAgICAgICAgICAgIF94X2RvdWJsZQotMDAwMDAwYjQgMzIgICAgICAgICAgICAgICAgX3hfZG91YmxlCi0wMDAwMDBiYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDBjNCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDBjYyAzMiAgICAgICAgICAgICAgICBfeF9jaGFyX3AKLTAwMDAwMGQ0IDMyICAgICAgICAgICAgICAgIF94X2NoYXJfcAotMDAwMDAwZGMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljNDYzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC90aWM4MC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIFRJIFRNUzMyMEM4MCB0ZXN0cy4KLSMKLWlmIFtpc3RhcmdldCB0aWM4MCotKi0qXSB0aGVuIHsKLQotICAgIHJ1bl9kdW1wX3Rlc3QgInJlZ29wcyIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWdvcHMyIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlZ29wczMiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVnb3BzNCIKLSAgICBydW5fZHVtcF90ZXN0ICJjcmVnb3BzIgotICAgIHJ1bl9kdW1wX3Rlc3QgImZsb2F0IgotICAgIHJ1bl9kdW1wX3Rlc3QgImVuZG1hc2siCi0gICAgcnVuX2R1bXBfdGVzdCAiYml0bnVtIgotICAgIHJ1bl9kdW1wX3Rlc3QgImNjb2RlIgotICAgIHJ1bl9kdW1wX3Rlc3QgImFkZCIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWxvY3MxIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbG9jczFiIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbG9jczIiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsb2NzMmIiCi0gICAgcnVuX2R1bXBfdGVzdCAiYWxpZ24iCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2FyaXRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2FyaXRoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjE0MGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9hcml0aC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGFyaXRoX29wY29kZXMKLWFyaXRoX29wY29kZXM6Ci0JYWRkIHI1LHI2Ci0JYWRkIDUscjYKLQlhZGRpIDcscjUscjYKLQlkaXZoIHI1LHI2Ci0JbXVsaCByNSxyNgotCW11bGggNSxyNgotCW11bGhpIDcscjUscjYKLQlzYXIgcjUscjYKLQlzYXIgMzEscjYKLQlzYXRhZGQgcjUscjYKLQlzYXRhZGQgNSxyNgotCXNhdHN1YiByNSxyNgotCXNhdHN1YmkgNyxyNSxyNgotCXNhdHN1YnIgcjUscjYKLQlzaGwgcjUscjYKLQlzaGwgMzEscjYKLQlzaHIgcjUscjYKLQlzaHIgMzEscjYKLQlzdWIgcjUscjYKLQlzdWJyIHI1LHI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYmFzaWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZhNjMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYmFzaWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fYXJpdGgge30gewotICAgIHNldCB0ZXN0bmFtZSAiYXJpdGguczogQXJpdGhtZXRpYyBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYXJpdGgucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgICMgLXJlICJeICtcWzAtOVxdKyAwMDAwIDQ4OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEM1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDQ1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA0NTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBFNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBFNTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBFNTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRTUzN0EwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEJGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEM1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIDI1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEE1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDY1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiA4NTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBFNTM3QzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggREYzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRTUzNzgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIDlGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEE1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIDg1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXQuczogYml0IG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDNkFGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQzY2RjEwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEM2MkYxMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBDNkVGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19icmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoLnM6IGJyYW5jaCBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOEYwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRkVGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTZGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRDdGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQ0JGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgQjlGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQTFGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgOTNGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgODJGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTBGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRDhGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQzRGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgQkNGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQTFGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgOTlGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgODJGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTVFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRERFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29tcGFyZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21wYXJlLnM6IGNvbXBhcmUgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvbXBhcmUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiA2NTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFMDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRTgyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEUxMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBFMTJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTkyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEU5MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBFMjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRUEyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEUzMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBFQjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRTQyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEU0MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBFQzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRUMyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEU1MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBFRDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRTYyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEVFMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBFNzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRUYyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDY1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2p1bXBzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImp1bXBzLnM6IGp1bXBzIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJqdW1wcy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDgwMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA2NTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBCRjA3RkFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDQ1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEM1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiAyNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSA4NTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgMjUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQTUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1lbS5zOiBtZW1vcnkgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1lbS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA1MzcwNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNTM3MDQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjUzNzA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDQwMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIDQwMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDQwMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIDQ2MkYwNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiA2NjJGMDQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgNjYyRjA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEMwMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEMwMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIDQxMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21pc2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAibWlzYy5zOiBtaXNjIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtaXNjLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTAwNzYwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEUwODc2MDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFMDA3MjAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRTAwNzQwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEUwMDcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGRjA3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRTcyRjIwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEU1M0Y0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92ZS5zOiBtb3ZlIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZlLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDUzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgMDUzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDQ1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2hpbG8ge30gewotICAgIHNldCB0ZXN0bmFtZSAiaGlsby5zOiBoaWxvIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaGlsby5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIwMEVFRkJFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA0MTBFQUVERVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDEwRUFEREVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotcHJvYyBkb19zaW1wbGVfcmVsb2NfdGVzdHMge30gewotICAgIHNldCB0ZXN0bmFtZSAicmVsb2MuczogVGVzdCBmb3IgcHJvcGVyIHJlbG9jYXRpb25zIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlbG9jLnMiICIiICJUZXN0IGZvciBwcm9wZXIgcmVsb2NhdGlvbiAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjAwMDAwMDAyXFteXG5cXSpSX1Y4NTBfTE8xNlxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMDZcW15cblxdKlJfVjg1MF9ISTE2X1NcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDBhXFteXG5cXSpSX1Y4NTBfSEkxNlxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMGVcW15cblxdKlJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAxMlxbXlxuXF0qUl9WODUwX1REQV8xNl8xNl9PRkZTRVRcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDE2XFteXG5cXSpSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgdjg1MCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19hcml0aAotICAgIGRvX2JpdAotICAgIGRvX2JyYW5jaAotICAgIGRvX2NvbXBhcmUKLSAgICBkb19qdW1wcwotICAgIGRvX2xvZ2ljYWwKLSAgICBkb19tZW0KLSAgICBkb19taXNjCi0gICAgZG9fbW92ZQotCi0gICAgIyBNYWtlIHN1cmUgd2UgaGFuZGxlIGxvKCkgaGkoKSBhbmQgaGkwKCkgY29ycmVjdGx5LgotICAgIGRvX2hpbG8KLQotICAgICMgQ2hlY2sgZm9yIHByb3BlciByZWxvY3Mgb24gbG8sIGhpLCBoaTAsIHpkYW9mZiwgdGRhb2ZmIGFuZCBzZGFvZmYKLSAgICAjIGV4cHJlc3Npb25zCi0gICAgZG9fc2ltcGxlX3JlbG9jX3Rlc3RzCi0KLSAgICBnYXNfdGVzdCAiaGlsbzIucyIgIiIgIiIgImhpL2xvIHJlZ3Jlc3Npb24gdGVzdCIKLSAgICBnYXNfdGVzdCAiZmVwc3cucyIgIiIgIiIgImVxc3cgcmVncmVzc2lvbiB0ZXN0IgotCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInJhbmdlLnMiICItbXdhcm4tc2lnbmVkLW92ZXJmbG93IiAiQ2hlY2sgZm9yIHJhbmdlIGVycm9yIG9uIGJ5dGUgbG9hZC9zdG9yZSIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JpdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFhYzA1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQotCS50ZXh0Ci0JLmdsb2JhbCBiaXQKLWJpdDoKLQljbHIxIDUsMTZbcjZdCi0Jbm90MSA1LDE2W3I2XQotCXNldDEgNSwxNltyNl0KLQl0c3QxIDUsMTZbcjZdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjMWI0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGJjYwotYmNjOgotCWJndCBiY2MKLQliZ2UgYmNjCi0JYmx0IGJjYwotCWJsZSBiY2MKLQliaCBiY2MKLQlibmwgYmNjCi0JYmwgYmNjCi0JYm5oIGJjYwotCWJlIGJjYwotCWJuZSBiY2MKLQlidiBiY2MKLQlibnYgYmNjCi0JYm4gYmNjCi0JYnAgYmNjCi0JYmMgYmNjCi0JYm5jIGJjYwotCWJ6IGJjYwotCWJueiBiY2MKLQliciBiY2MKLQlic2EgYmNjCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2NvbXBhcmUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFjOGE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGNvbXBhcmUKLWNvbXBhcmU6Ci0JY21wIHI1LHI2Ci0JY21wIDUscjYKLQlzZXRmIHYscjUKLQlzZXRmIG52LHI1Ci0Jc2V0ZiBjLHI1Ci0Jc2V0ZiBsLHI1Ci0Jc2V0ZiBuYyxyNQotCXNldGYgbmwscjUKLQlzZXRmIHoscjUKLQlzZXRmIG56LHI1Ci0Jc2V0ZiBuaCxyNQotCXNldGYgaCxyNQotCXNldGYgcyxyNQotCXNldGYgbixyNQotCXNldGYgbnMscjUKLQlzZXRmIHAscjUKLQlzZXRmIHQscjUKLQlzZXRmIHNhLHI1Ci0Jc2V0ZiBsdCxyNQotCXNldGYgZ2UscjUKLQlzZXRmIGxlLHI1Ci0Jc2V0ZiBndCxyNQotCXRzdCByNSxyNgotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjAzMzNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvZmVwc3cucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbGRzciByMTcsZmVwc3cKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjdlNTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotCS50ZXh0Ci0JbW92ZWEgbG8oMHhkZWFkYmVlZikscjAscjEKLQltb3ZoaSBoaSgweGRlYWRiZWVmKSxyMSxyMQotCW1vdmhpIGhpMCgweGRlYWRiZWVmKSxyMSxyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFkNTkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsbzIucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS50ZXh0Ci0JLm9yZyAweDEwMDAwCi0JbW92ZWEgaGkoYmxhaCkscjAscjEKLWJsYWg6CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzE2NGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9qdW1wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwganVtcHMKLWp1bXBzOgotCWphcmwganVtcHMscjUKLQlqbXAgW3I1XQotCWpyIGp1bXBzCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjAwYjNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGxvZ2ljYWxzCi1sb2dpY2FsczoKLQlhbmQgcjUscjYKLQlhbmRpIDcscjUscjYKLQlub3QgcjUscjYKLQlvciByNSxyNgotCW9yaSA3LHI1LHI2Ci0JeG9yIHI1LHI2Ci0JeG9yaSA3LHI1LHI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9tZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2OWNlYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIG1lbW9yeQotbWVtb3J5OgotCWxkLmIgNVtyNV0scjYKLQlsZC5oIDRbcjVdLHI2Ci0JbGQudyA0W3I1XSxyNgotCXNsZC5iIDY0W2VwXSxyNgotCXNsZC5oIDEyOFtlcF0scjYKLQlzbGQudyAxMjhbZXBdLHI2Ci0Jc3QuYiByNSw1W3I2XQotCXN0LmggcjUsNFtyNl0KLQlzdC53IHI1LDRbcjZdCi0Jc3N0LmIgcjYsNjRbZXBdCi0Jc3N0LmggcjYsMTI4W2VwXQotCXNzdC53IHI2LDEyOFtlcF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzRlNGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbWlzYwotbWlzYzoKLQlkaQotCWVpCi0JaGFsdAotCW5vcAotCXJldGkKLQl0cmFwIDAKLQl0cmFwIDMxCi0JbGRzciByNyxwc3cKLQlzdHNyIHBzdyxyNwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9tb3ZlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNmZhZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIG1vdmUKLW1vdmU6Ci0JbW92IHI1LHI2Ci0JbW92IDUscjYKLQltb3ZlYSA3LHI1LHI2Ci0JbW92aGkgNyxyNSxyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmFjY2Y0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmFuZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbGQuYiAweGZmNjJbcjBdLHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzhkMjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLnRleHQKLQltb3ZlYSBsbyhmb28pLHIwLHIxCi0JbW92aGkgaGkoZm9vKSxyMSxyMQotCW1vdmhpIGhpMChmb28pLHIxLHIxCi0JbW92ZWEgemRhb2ZmKF9mb28pLHIwLHIxCi0JbW92aGkgdGRhb2ZmKF9mb28pLGVwLHIxCi0JbW92aGkgc2Rhb2ZmKF9mb28pLGdwLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NzcwYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcHJvYyBkb19xdWFkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInF1YWQuczogcXVhZHdvcmQgaW1tZWRpYXRlIHZhbHVlcyIKLSAgICBzZXQgeDEgMAotICAgIHNldCB4MiAwCi0gICAgc2V0IHgzIDAKLSAgICBnYXNfc3RhcnQgInF1YWQucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gKzJcWyBcdFxdKzAwMDArIDdEOEY3ODU2XFsgXHRcXSttb3ZxXFteXG5cXSpcbiIgeyBzZXQgeDEgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rMzQxMkREQ0NcW15cblxdKlxuIgkJICAgeyBzZXQgeDIgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rQkJBQTUwMDFcWyBcdFxdKlxyXG4iCQkgICB7IHNldCB4MyAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmIFthbGxfb25lcyAkeDEgJHgyICR4M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IHZheC0qLSpdIHRoZW4gewotICAgIGRvX3F1YWQKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFkNGFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQkudGV4dAotCW1vdnEgJDB4YWFiYmNjZGQxMjM0NTY3OCxyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBiYjk5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTAuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IHZ0YWJsZSBlbnRyeTAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMTAgUl8uKl9HTlVfVlRFTlRSWSAgdnRibF9hCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY4OWUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTAucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotLnRleHQKLS52dGFibGVfZW50cnkgdnRibF9hLCAxNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmE2ZTRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IHZ0YWJsZSBlbnRyeTEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMDAgUl8uKl9HTlVfVlRFTlRSWSAgdnRibF9hLioKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Zjg5ZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0udGV4dAotLnZ0YWJsZV9lbnRyeSB2dGJsX2EsIDE2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc5NWIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogdnRhYmxlIGluaGVyaXQwCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcWy5kYXRhXF06Ci1PRkZTRVQgK1RZUEUgK1ZBTFVFIAotMCswMDAwMDAwIFJfLipfR05VX1ZUSU5IRVJJVCAgXCpBQlNcKgotMCswMDAwMDEwIFJfLipfR05VX1ZUSU5IRVJJVCAgdnRibF9hCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzhkZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0uZGF0YQotCi0udHlwZSB2dGJsX2Esb2JqZWN0Ci12dGJsX2E6Ci0JLnNwYWNlIDE2Ci0uc2l6ZSB2dGJsX2EsMTYKLS52dGFibGVfaW5oZXJpdCB2dGJsX2EsIDAKLQotLnR5cGUgdnRibF9iLG9iamVjdAotdnRibF9iOgotCS5zcGFjZSAxNgotLnNpemUgdnRibF9iLDE2Ci0udnRhYmxlX2luaGVyaXQgdnRibF9iLCB2dGJsX2EKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDYzNTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjoxOiBFcnJvcjogZXhwZWN0ZWQgYHZ0YmxfYScgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciAudnRhYmxlX2luaGVyaXQKLS4qR0FTLioKLQotCi0gKzEuKnZ0YWJsZV9pbmhlcml0IHZ0YmxfYSwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMWQyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS52dGFibGVfaW5oZXJpdCB2dGJsX2EsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS92dGFibGUuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkM2UxYmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jCi0jIHZ0YWJsZSB0ZXN0cwotIwotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gICAgc2V0IHRlc3RuYW1lICJ2dGFibGUgJG5hbWUiCi0gICAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gICAgZ2FzX3J1biAke25hbWV9LnMgJG9wdHMgIj4mZHVtcC5vdXQiCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5sIl0gfSB0aGVuIHsKLQlmYWlsICR0ZXN0bmFtZQotCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi0jIFZ0YWJsZSBiaXRzIGFyZSBvbmx5IHN1cHBvcnRlZCBieSBFTEYgdGFyZ2V0cy4KLWlmIHsgKFtpc3RhcmdldCAiKi0qLWVsZioiXQkJCi0gICAgICB8fCBbaXN0YXJnZXQgIiotKi1saW51eCoiXSkKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqYW91dCpdCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB0aGVuIHsKLQotICAgICMgbm90IHN1cHBvcnRlZCBieSBEMzBWCi0gICAgaWYge1tpc3RhcmdldCAiZDMwdi0qLSoiXX0gewotICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgIyBub3QgeWV0IHN1cHBvcnRlZCBieSBpOTYwCi0gICAgaWYge1tpc3RhcmdldCAiaTk2MC0qLSoiXX0gewotICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgcnVuX2R1bXBfdGVzdCAiaW5oZXJpdDAiIAotICAgIHJ1bl9saXN0X3Rlc3QgImluaGVyaXQxIiAiLWFsIgotCi0gICAgIyBUaGUgdnRhYmxlIGVudHJ5IHJlc3VsdHMgYXJlIGRpZmZlcmVudCBvbiBSZWwgYW5kIFJlbGEgdGFyZ2V0cy4KLSAgICBpZiB7W2lzdGFyZ2V0ICJpKjg2LSotKiJdIAotCXx8IFtpc3RhcmdldCAibWlwcyotKi0qIl0gCi0JfHwgW2lzdGFyZ2V0ICJzdHJvbmdhcm0qLSotKiJdIAotCXx8IFtpc3RhcmdldCAiYXJtKi0qLSoiXX0gdGhlbiB7Ci0KLQlydW5fZHVtcF90ZXN0ICJlbnRyeTAiCi0KLSAgICB9IGVsc2UgewotCi0JcnVuX2R1bXBfdGVzdCAiZW50cnkxIgotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMxLkgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzczMjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotRklMRSAxIEZJUlNUIExJTkUKLQkuSU5DTFVERQkiSU5DMi5IIgotRklMRSAxIExBU1QgTElORQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzIuSCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMyLkgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2MzZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzIuSAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCUZJTEUgMiBGSVJTVCBMSU5FCi0JRklMRSAyIExBU1QgTElORQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2NjcxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotZm9vOgkuQVNTSUdOQwkiaGVsbG8iCi1CQVI6CS5BU1NJR05BCTEyKzM0Ci0KLQlcJmZvbydmb28KLQlcJmZvb1wmZm9vXCZmb28gCi0JXCZmb28gXCZmb28gXCZmb28gCi0JXCZCQVJcJmJhclwmQkFSCi0KLQotCi0JCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzNzMzZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFzc2lnbi5hc206OCBDYW4ndCBmaW5kIHByZXByb2Nlc3NvciB2YXJpYWJsZSBiYXIuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24ub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTUwOWFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24ub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIQotCi0hZm9vOgkuQVNTSUdOQwkiaGVsbG8iCi0hQkFSOgkuQVNTSUdOQQkxMiszNAotIQotCi0hCVwmZm9vJ2ZvbwotCWhlbGxvZm9vCi0hCVwmZm9vXCZmb29cJmZvbyAKLQloZWxsb2hlbGxvaGVsbG8gCi0hCVwmZm9vIFwmZm9vIFwmZm9vIAotCWhlbGxvIGhlbGxvIGhlbGxvIAotIQlcJkJBUlwmYmFyXCZCQVIKLQk0NjQ2Ci0hCi0KLSEKLQotIQotCi0hCQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDlmMDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDIKLQlCQUQKLQkuQUVMU0UKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAyCi0JQkFECi0JLkFFTFNFCi0JT0sKLQkuQUlGCTEgRVEgMgotCUJBRAotCS5BRUxTRQotCU9LCi0JLkFFTkRJCi0JLkFFTkRJCi0JLkFJRgkxIExUICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgTkUgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBMRSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEdUICAyCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkzIEdFICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTMgTFQgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTMgRVEgIDIKLQlCQUQgCi0JLkFFTkRJCi0JLkFJRgkzIE5FICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTMgTEUgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTMgR1QgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMyBHRSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkiRk9PIiBFUSAiQkFSIgotCUJBRAotCS5BRU5ESQotCS5BSUYJIkZPTyIgRVEgIkZPTyIKLQlPSwotCS5BRU5ESQotCS5BSUYJIkZPTyIgTkUgIkJBUiIKLQlPSwotCS5BRU5ESQotCS5BSUYJIkZPTyIgRVEgIkZPTyIKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAxCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3Mub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3Mub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVjZWY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0hCS5BSUYJMSBFUSAxCi0hCU9LCi0JT0sKLSEJLkFFTFNFCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDIKLSEJQkFECi0hCS5BRUxTRQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMgotIQlCQUQKLSEJLkFFTFNFCi0hCU9LCi0JT0sKLSEJLkFJRgkxIEVRIDIKLSEJQkFECi0hCS5BRUxTRQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUVOREkKLSEJLkFJRgkxIExUICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAgMgotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBORSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgTEUgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEdUICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkzIEdFICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMyBMVCAgMgotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMyBFUSAgMgotIQlCQUQgCi0hCS5BRU5ESQotIQkuQUlGCTMgTkUgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkzIExFICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkzIEdUICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMyBHRSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCSJGT08iIEVRICJCQVIiCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkiRk9PIiBFUSAiRk9PIgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCSJGT08iIE5FICJCQVIiCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJIkZPTyIgRVEgIkZPTyIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDEKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTBjYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLQotCVN0dWZmIHRvIHRyeSBhbmQgY3Jhc2ggaXQKLQotZm9vOgkuTUFDUk8JCi0JSEkKLWJhcjoJLk1BQ1JPCQotCVRIRVJFCi0JYmFyCi0JLkVORE0JCi0KLQotCS5FTkRNCi0JZm9vCi0JZm9vCi0JZm9vCi0JZm9vCi0JZm9vCi0JYmFyCi0KLQotCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwODgwMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY3Jhc2guYXNtOjE4IFVucmVhc29uYWJsZSBleHBhbnNpb24gKC11IHR1cm5zIG9mZiBjaGVjaykuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5NDhhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzA1OSArMCwwIEBACi0hCi0KLSEJU3R1ZmYgdG8gdHJ5IGFuZCBjcmFzaCBpdAotCVN0dWZmIHRvIHRyeSBhbmQgY3Jhc2ggaXQKLSEKLQotIWZvbzoJLk1BQ1JPCQotIQlISQotIWJhcjoJLk1BQ1JPCQotIQlUSEVSRQotIQliYXIKLSEJLkVORE0JCi0hCi0hCi0hCS5FTkRNCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiNmIzMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotCi0JLk1BQ1JPIAlmb28gYSBiIGM9YQotCVxhIFxiIFxjIFxkCi0JLkVORE0KLQotCWZvbyAxIDIKLQlmb28gMSAyIDMgNAotCWZvbyAxCi0JZm9vIAotCi0KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNWQwNzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0hCi0KLSEKLQotIQkuTUFDUk8gCWZvbyBhIGIgYz1hCi0hCVxhIFxiIFxjIFxkCi0hCS5FTkRNCi0hCi0KLSEJZm9vIDEgMgotIQkxIDIgYSBcZAotCTEgMiBhIFxkCi0hCWZvbyAxIDIgMyA0Ci0hCWZvbyAxCi0hCTEgIGEgXGQKLQkxICBhIFxkCi0hCWZvbyAKLSEJICBhIFxkCi0JYSBcZAotIQotCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4YTAwMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQlmb28KLQlmb28JZm9vCi0JZm9vCWZvbwotCWZvbwotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDFhMmY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEKLQotIWZvbzoJLkFTU0lHTkEJMQotIQlcJmZvbysxCQotCTErMQkKLSEJXCZmb28rMQotCTErMQotIWZvbzoJLkFTU0lHTkMJImZvbyIKLSEJXCZmb28rMQotCWZvbysxCi0hCVwmZm9vKzEKLQlmb28rMQotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEJZm9vCi0JZm9vCi0hCWZvbwlmb28KLQlmb28JZm9vCi0hCWZvbwlmb28KLQlmb28JZm9vCi0hCWZvbwotCWZvbwotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNmIwYTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCi1mb28JLkRBVEEJMSwyLDMKLWJhcgkuREFUQQkxLDIsMyw0LDUgLDYKLQkuREFUQS5CCTEyMzQ1LDEyLDIKLQkuREFUQS5XIDksMiwxMiwzLDEzKzQxLGZvbys5Ci0JLkRBVEEuTCAyfjk5Ci0KLQotCi0JLkRBVEFCCTEsMiwzCi0JLkRBVEFCCTEsMiwzCi0KLQotCi0KLQkuREFUQUIJMSw5KzMyCi0KLQkuREFUQUIuTAkxLEgnMTExMTExMTEKLQkuREFUQUIuVwkyLEgnMjIyMgotCS5EQVRBQi5CCTMsSCczMzMKLQotCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NmUxZTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIQotCi0hZm9vCS5EQVRBCTEsMiwzCi1mb286CS5sb25nCTEsMiwzCi0hYmFyCS5EQVRBCTEsMiwzLDQsNSAsNgotYmFyOgkubG9uZwkxLDIsMyw0LDUsNgotIQkuREFUQS5CCTEyMzQ1LDEyLDIKLQkuYnl0ZQkxMjM0NSwxMiwyCi0hCS5EQVRBLlcgOSwyLDEyLDMsMTMrNDEsZm9vKzkKLQkuc2hvcnQJOSwyLDEyLDMsNTQsZm9vKzkKLSEJLkRBVEEuTCAyfjk5Ci0JLmxvbmcJOTcKLSEKLQotIQotCi0hCi0KLSEJLkRBVEFCCTEsMiwzCi0JLmZpbGwJMSw0LDIKLSEJLkRBVEFCCTEsMiwzCi0JLmZpbGwJMSw0LDIKLSEKLQotIQotCi0hCi0KLSEKLQotIQkuREFUQUIJMSw5KzMyCi0JLmZpbGwJMSw0LDQxCi0hCi0KLSEJLkRBVEFCLkwJMSxIJzExMTExMTExCi0JLmZpbGwJMSw0LDI4NjMzMTE1MwotIQkuREFUQUIuVwkyLEgnMjIyMgotCS5maWxsCTIsMiw4NzM4Ci0hCS5EQVRBQi5CCTMsSCczMzMKLQkuZmlsbAkzLDEsODE5Ci0hCi0KLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE2MDhhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotCi07IHRlc3QgYWxsIG9wcwotCi1hMQkuRVFVCTQrMTAKLWEyCS5FUVUJNC0xMAotYTMJLkVRVQk0JjEwCi1hNAkuRVFVCTR8MgotYTUJLkVRVQk0fjIKLWE2CS5FUVUJNCoxMAotYTcJLkVRVQk0MC8xMAotYTgJLkVRVQkrNwotYTkJLkVRVQktNwotYTEwCS5FUVUJfjcKLQotCi0JYTEgYTIgYTMgYTQgYTUgYTYgYTcgYTggYTkgYTEwCi0KLTsgdGVzdCB0aGUgcHJpb3JpdGllcwotCi1iMQkuRVFVCTF8Mn4zJjQrNS04KjcvMgotYjIJLkVRVQkoMXwyfigzJig0KzUtKDgqKDcvMikpKSkpCi1iMwkuRVFVCTEwKjIvMyo0Ci1iNAkuRVFVCSgoKDEwKjIpLzMpKjQpCi1iNQkuRVFVCTEwKzItMys0Ci1iNgkuRVFVCSgoKDEwKzIpLTMpKzQpCi0KLQliMSBiMiBiMyBiNAotCi07IHRlc3QgYXNzb2NpYXRpb24KLQotYzEJLkVRVQktfjMKLWMyCS5FUVUJfi0zCi1jMwkuRVFVCS0ofjMpCi1jNAkuRVFVCX4oLTMpCi0KLQljMSBjMiBjMyBjNAotCi07IHRlc3QgcnVsZXMgZm9yIHN5bWJvbHMKLQotb2sxCS5FUVUJRk9PCi1vazIJLkVRVQlGT08rMTAKLW9rMwkuRVFVCTEwK0ZPTwotb2s0CS5FUVUJRk9PLTEwCi0KLQlvazEKLQlvazIgCi0Jb2szIAotCW9rNAotCi1vazUJLkVRVQlGT08rMys0KzUrNgotb2s2CS5FUVUJRk9PLUJBUgotCi0Jb2s1Ci0Jb2s2Ci0KLWJhZDEJLkVRVQlGT08rRk9PCi1iYWQyCS5FUVUJRk9PKjIKLWJhZDMJLkVRVQlGT08vMgotYmFkNAkuRVFVCUZPT3wyCi1iYWQ1CS5FUVUJRk9PJjIKLWJhZDYJLkVRVQlGT09+MgotYmFkNwkuRVFVCUZPTyoyCi0KLTsgdGVzdCBzcGFjaW5nCi0KLXNwYWNlMQkuRVFVCTEgKwkyCSszK0ZPTyArIDMKLXNwYWNlMgotCi07IGZyb20gdGhlIFNIIG1hbnVhbAotCi0JLkRBVEEuTAkxKygyLSgzKyg0LTUpKSksMQotCi0JLkRBVEEuTAktSCdmZmZmZmZmMStIJzAwMDAwMGYwKkgnMDAwMDAwMTB8SCcwMDAwMDBmMCZIJzAwMDBmZmZmLEgnMDAwMDBmZmYKLQotCS5EQVRBLkwJLX4tfkgnMDAwMDAwMGYsSCcwMAotCi0KLQkKLQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MWZkNTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWV4cC5hc206NTYgY2FuJ3QgYWRkIHR3byByZWxvY2F0YWJsZSBleHByZXNzaW9ucwotZXhwLmFzbTo1NyB0aGUgKiBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo1OCB0aGUgLyBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo1OSB0aGUgfCBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo2MCB0aGUgJiBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo2MSB0aGUgfiBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo2MiB0aGUgKiBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjYjlhOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0hCi0KLSE7IHRlc3QgYWxsIG9wcwotCTsgdGVzdCBhbGwgb3BzCi0hCi0KLSFhMQkuRVFVCTQrMTAKLSFhMgkuRVFVCTQtMTAKLSFhMwkuRVFVCTQmMTAKLSFhNAkuRVFVCTR8MgotIWE1CS5FUVUJNH4yCi0hYTYJLkVRVQk0KjEwCi0hYTcJLkVRVQk0MC8xMAotIWE4CS5FUVUJKzcKLSFhOQkuRVFVCS03Ci0hYTEwCS5FUVUJfjcKLSEKLQotIQotCi0hCWExIGEyIGEzIGE0IGE1IGE2IGE3IGE4IGE5IGExMAotCTE0IC02IDAgNiA2IDQwIDQgNyAtNyAtOAotIQotCi0hOyB0ZXN0IHRoZSBwcmlvcml0aWVzCi0JOyB0ZXN0IHRoZSBwcmlvcml0aWVzCi0hCi0KLSFiMQkuRVFVCTF8Mn4zJjQrNS04KjcvMgotIWIyCS5FUVUJKDF8Mn4oMyYoNCs1LSg4Kig3LzIpKSkpKQotIWIzCS5FUVUJMTAqMi8zKjQKLSFiNAkuRVFVCSgoKDEwKjIpLzMpKjQpCi0hYjUJLkVRVQkxMCsyLTMrNAotIWI2CS5FUVUJKCgoMTArMiktMykrNCkKLSEKLQotIQliMSBiMiBiMyBiNAotCTIgMiAyNCAyNAotIQotCi0hOyB0ZXN0IGFzc29jaWF0aW9uCi0JOyB0ZXN0IGFzc29jaWF0aW9uCi0hCi0KLSFjMQkuRVFVCS1+MwotIWMyCS5FUVUJfi0zCi0hYzMJLkVRVQktKH4zKQotIWM0CS5FUVUJfigtMykKLSEKLQotIQljMSBjMiBjMyBjNAotCTQgMiA0IDIKLSEKLQotITsgdGVzdCBydWxlcyBmb3Igc3ltYm9scwotCTsgdGVzdCBydWxlcyBmb3Igc3ltYm9scwotIQotCi0hb2sxCS5FUVUJRk9PCi0hb2syCS5FUVUJRk9PKzEwCi0hb2szCS5FUVUJMTArRk9PCi0hb2s0CS5FUVUJRk9PLTEwCi0hCi0KLSEJb2sxCi0JRk9PCi0hCW9rMiAKLQlGT08rMTAgCi0hCW9rMyAKLQlGT08rMTAgCi0hCW9rNAotCUZPTystMTAKLSEKLQotIW9rNQkuRVFVCUZPTyszKzQrNSs2Ci0hb2s2CS5FUVUJRk9PLUJBUgotIQotCi0hCW9rNQotCUZPTysxOAotIQlvazYKLQlGT08tRk9PCi0hCi0KLSFiYWQxCS5FUVUJRk9PK0ZPTwotIWJhZDIJLkVRVQlGT08qMgotIWJhZDMJLkVRVQlGT08vMgotIWJhZDQJLkVRVQlGT098MgotIWJhZDUJLkVRVQlGT08mMgotIWJhZDYJLkVRVQlGT09+MgotIWJhZDcJLkVRVQlGT08qMgotIQotCi0hOyB0ZXN0IHNwYWNpbmcKLQk7IHRlc3Qgc3BhY2luZwotIQotCi0hc3BhY2UxCS5FUVUJMSArCTIJKzMrRk9PICsgMwotIXNwYWNlMgotc3BhY2UyOgotIQotCi0hOyBmcm9tIHRoZSBTSCBtYW51YWwKLQk7IGZyb20gdGhlIFNIIG1hbnVhbAotIQotCi0hCS5EQVRBLkwJMSsoMi0oMysoNC01KSkpLDEKLQkubG9uZwkxLDEKLSEKLQotIQkuREFUQS5MCS1IJ2ZmZmZmZmYxK0gnMDAwMDAwZjAqSCcwMDAwMDAxMHxIJzAwMDAwMGYwJkgnMDAwMGZmZmYsSCcwMDAwMGZmZgotCS5sb25nCTQwOTUsNDA5NQotIQotCi0hCS5EQVRBLkwJLX4tfkgnMDAwMDAwMGYsSCcwMAotCS5sb25nCTE3LDAKLSEKLQotIQotCi0hCQotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9nYXNwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9nYXNwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3MmE2ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZ2FzcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIFRlc3QgZ2FzcC4KLQotcHJvYyBnYXNwX3Rlc3QgeyBmaWxlbmFtZSB0ZXN0bmFtZSBvcHQgfSAgewotICAgIGdsb2JhbCBHQVNQCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNlbmRfbG9nICIkc3JjZGlyL2xpYi9ydW4gJEdBU1AgLUkkc3JjZGlyL2dhc3AgLXMgJG9wdCAkZmlsZW5hbWUuYXNtIC1vIGdhc3Aub3V0XG4iCi0gICAgY2F0Y2ggImV4ZWMgJHNyY2Rpci9saWIvcnVuICRHQVNQIC1JJHNyY2Rpci9nYXNwIC1zICRvcHQgJGZpbGVuYW1lLmFzbSAtbyBnYXNwLm91dCIgZXJycwotICAgIGNhdGNoICJleGVjIGRpZmYgZ2FzcC5vdXQgJGZpbGVuYW1lLm91dCIgZGlmZnMKLSAgICBzZXQgZGlmZnMgW3BydW5lX3dhcm5pbmdzICRkaWZmc10KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZGlmZnNdIHsKLQlzZW5kX2xvZyAiJGRpZmZzXG4iCi0JdmVyYm9zZSAkZGlmZnMKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybiAwCi0gICAgfSBlbHNlIHsKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0KLQotfQotCi1mb3JlYWNoIHNyYyBbIGxzb3J0IFsgZ2xvYiAkc3JjZGlyL2dhc3AvKi5hc20gXSBdIHsKLSAgICByZWdzdWIgLWFsbCAiLmFzbSIgJHNyYyAiIiB0Ci0gICAgcmVnc3ViICJeLiovKFxbXi9cXSopJCIgJHQgImdhc3AgXFwxIiB0ZXN0bmFtZQotICAgIGdhc3BfdGVzdCAkdCAkdGVzdG5hbWUgIiIKLX0KLQotZm9yZWFjaCBzcmMgWyBsc29ydCBbIGdsb2IgJHNyY2Rpci9nYXNwL21yaS8qLmFzbSBdIF0gewotICAgIHJlZ3N1YiAtYWxsICIuYXNtIiAkc3JjICIiIHQKLSAgICByZWdzdWIgIl4uKi8oXFteL1xdKikkIiAkdCAiZ2FzcCBNUkkgXFwxIiB0ZXN0bmFtZQotICAgIGdhc3BfdGVzdCAkdCAkdGVzdG5hbWUgIi1NIgotfQotCi0jIEZJWE1FOiB0aGlzIGlzIGhlcmUgY2F1c2Ugb2YgYSBidWcgaW4gRGVqYUdudSAxLjEuMS4gV2hlbiBpdCBpcyBubyBsb25nZXIKLSMgICAgICAgIGluIHVzZSwgdGhlbiB0aGlzIGNhbiBiZSByZW1vdmVkLgotaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgdW5zZXQgZXJyb3JJbmZvCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllZDFkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQlISQotCS5JTkNMVURFCSJJTkMxLkgiCi0JVEhFUkUKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3YTBkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0hCUhJCi0JSEkKLSEJLklOQ0xVREUJIklOQzEuSCIKLSFGSUxFIDEgRklSU1QgTElORQotRklMRToJMSBGSVJTVCBMSU5FCi0hCS5JTkNMVURFCSJJTkMyLkgiCi0hCUZJTEUgMiBGSVJTVCBMSU5FCi0JRklMRSAyIEZJUlNUIExJTkUKLSEJRklMRSAyIExBU1QgTElORQotCUZJTEUgMiBMQVNUIExJTkUKLSFGSUxFIDEgTEFTVCBMSU5FCi1GSUxFOgkxIExBU1QgTElORQotIQlUSEVSRQotCVRIRVJFCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxNGNmYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0KLQotCS5IRUFESU5HCSIgIiJRVU9URSIiICIKLQkuUEFHRQotCS5QUklOVCBMSVNUCi0JZm9vCQkKLQkuUFJJTlQgTk9MSVNUCi0JZm9vCi0KLQotCS5GT1JNCUxJTj0xMgotCS5GT1JNCUNPTD05MAotCS5GT1JNCUxJTj0xMjMgQ09MPTIzCi0JCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NWJkYTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3Rpbmcub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIQotCi0hCi0KLSEJLkhFQURJTkcJIiAiIlFVT1RFIiIgIgotCS50aXRsZQkiICJRVU9URSIgIgotIQkuUEFHRQotCS5lamVjdAotIQkuUFJJTlQgTElTVAotCS5saXN0Ci0hCWZvbwkJCi0JZm9vCQkKLSEJLlBSSU5UIE5PTElTVAotCS5ub2xpc3QKLSEJZm9vCi0JZm9vCi0hCi0KLSEKLQotIQkuRk9STQlMSU49MTIKLQkucHNpemUgMTIsMTMyCi0hCS5GT1JNCUNPTD05MAotCS5wc2l6ZSA2MCw5MAotIQkuRk9STQlMSU49MTIzIENPTD0yMwotCS5wc2l6ZSAxMjMsMjMKLSEJCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmIxNmJmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotCS5NQUNSTwlTVU0gRlJPTT0wLCBUTz05Ci0JOyBcRlJPTSBcVE8KLQlNT1YJUlxGUk9NLFIxMAotQ09VTlQJLkFTU0lHTkEJXEZST00rMQotCS5BV0hJTEUJXCZDT1VOVCBMRSBcVE8KLQlNT1YJUlwmQ09VTlQsUjEwCi1DT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLQkuQUVORFcKLQkuRU5ETQotCi0JU1VNIDAsNQotCVNVTSAJVE89NQotCVNVTSAJRlJPTT0yLCBUTz01Ci0KLQotOyBoaSB0aGlzIGlzIGEgY29tbWVudAotCS5NQUNSTwlCQUNLX1NMQVNIX1NFVAotCVwoTU9WCSMiXCIsUjApIAotCS5FTkRNCi0JQkFDS19TTEFTSF9TRVQKLQkuTUFDUk8JQ09NTQotCWJhcgk7IHRoaXMgY29tbWVudCB3aWxsIGdldCBjb3BpZWQgb3V0Ci0JZm9vCVw7IHRoaXMgb25lIHdpbGwgZ2V0IGRyb3BwZWQKLQkuRU5ETQotCUNPTU0KLQlCQUNLX1NMQVNIX1NFVAotCS5NQUNSTwlQTFVTMgotCUFERAkjMSxSXCZWMQotCS5TREFUQQkiXCZWJzEiCi0JLkVORE0KLVYJLkFTU0lHTkMJIlIiCi1WMQkuQVNTSUdOQQkxCi0JUExVUzIKLQkuTUFDUk8JUExVUzEJUCxQMQotCUFERAkjMSxcUDEKLQkuU0RBVEEJIlxQJzEiCi0JLkVORE0KLQlQTFVTMQlSLFIxCi0KLQkuTUFDUk8JU1VNIFAxCi0JTU9WCVIwLFIxMAotCUFERAlSMSxSMTAKLQlBREQJUjIsUjEwCi0JXFAxCQotCUFERAlSMyxSMTAKLQkuRU5ETQotCi0JU1VNCS5FWElUTQotCi0JLk1BQ1JPIGZvbyBiYXI9YSBkZWZhdWx0PWIKLQlcYmFyCi0JXGRlZmF1bHQKLQliYXIKLQlkZWZhdWx0Ci0JLkVORE0KLQlmb28gZGVmYXVsdD1kb2cgYmFyPWNhdAotCWZvbyBYIFkKLQlmb28KLQlmb28gYmFyPWNhdCBkZWZhdWx0PWRvZwotCi0KLQkuTUFDUk8JZm9vIGJhcgotCUhJCi0JSEkgXGJhcgotCUhJCi0JLkVORE0KLQotCWZvbyAxCi0JZm9vIDEyMwotCWZvbyAxIDIgMyA0Ci0JZm9vCi0KLQkKLQkuTUFDUk8JUFVTSCBSbgotCU1PVi5MCVxSbixALXIxNQotCS5FTkRNCi0JUFVTSAlSMAotCVBVU0gJUjEKLQotCi0JLk1BQ1JPCVJFU19TVFIgU1RSLCBSbgotCU1PVi5MCSNzdHJcQCxcUm4KLQlCUkEJZW5kX3N0clxACi0JTk9QCi1zdHJcQAkuU0RBVEEgIlxTVFIiCi0JLkFMSUdOCTIKLWVuZF9zdHJcQAotCS5FTkRNCi0JCi0JUkVTX1NUUgkiT05FIixSMAkKLQlSRVNfU1RSCSJUV08iLFIxCi0JUkVTX1NUUgkiVEhSRUUiLFIyCi0KLQotCi0JUkVTX1NUUiBTVFI9ZG9ua2V5IFJuPVIxCi0JUkVTX1NUUiBkb25rZXksUjEKLSAJUkVTX1NUUiBkb25rZXkgUm49UjEKLQkuRU5ECi0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8uZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8uZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8ub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQwNzMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotIQkuTUFDUk8JU1VNIEZST009MCwgVE89OQotIQk7IFxGUk9NIFxUTwotIQlNT1YJUlxGUk9NLFIxMAotIUNPVU5UCS5BU1NJR05BCVxGUk9NKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIFxUTwotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQkuRU5ETQotIQotCi0hCVNVTSAwLDUKLSEJOyAwIDUKLQk7IDAgNQotIQlNT1YJUjAsUjEwCi0JTU9WCVIwLFIxMAotIUNPVU5UCS5BU1NJR05BCTArMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIxLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIyLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIzLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI0LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI1LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlTVU0gCVRPPTUKLSEJOyAwIDUKLQk7IDAgNQotIQlNT1YJUjAsUjEwCi0JTU9WCVIwLFIxMAotIUNPVU5UCS5BU1NJR05BCTArMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIxLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIyLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIzLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI0LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI1LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlTVU0gCUZST009MiwgVE89NQotIQk7IDIgNQotCTsgMiA1Ci0hCU1PVglSMixSMTAKLQlNT1YJUjIsUjEwCi0hQ09VTlQJLkFTU0lHTkEJMisxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjMsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjUsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCi0KLSEKLQotITsgaGkgdGhpcyBpcyBhIGNvbW1lbnQKLQk7IGhpIHRoaXMgaXMgYSBjb21tZW50Ci0hCS5NQUNSTwlCQUNLX1NMQVNIX1NFVAotIQlcKE1PVgkjIlwiLFIwKSAKLSEJLkVORE0KLSEJQkFDS19TTEFTSF9TRVQKLSEJTU9WCSMiXCIsUjAgCi0JTU9WCSMiXCIsUjAgCi0hCS5NQUNSTwlDT01NCi0hCWJhcgk7IHRoaXMgY29tbWVudCB3aWxsIGdldCBjb3BpZWQgb3V0Ci0hCWZvbwlcOyB0aGlzIG9uZSB3aWxsIGdldCBkcm9wcGVkCi0hCS5FTkRNCi0hCUNPTU0KLSEJYmFyCTsgdGhpcyBjb21tZW50IHdpbGwgZ2V0IGNvcGllZCBvdXQKLQliYXIJOyB0aGlzIGNvbW1lbnQgd2lsbCBnZXQgY29waWVkIG91dAotIQlmb28JXDsgdGhpcyBvbmUgd2lsbCBnZXQgZHJvcHBlZAotCWZvbwlcOyB0aGlzIG9uZSB3aWxsIGdldCBkcm9wcGVkCi0hCUJBQ0tfU0xBU0hfU0VUCi0hCU1PVgkjIlwiLFIwIAotCU1PVgkjIlwiLFIwIAotIQkuTUFDUk8JUExVUzIKLSEJQURECSMxLFJcJlYxCi0hCS5TREFUQQkiXCZWJzEiCi0hCS5FTkRNCi0hVgkuQVNTSUdOQwkiUiIKLSFWMQkuQVNTSUdOQQkxCi0hCVBMVVMyCi0hCUFERAkjMSxSXCZWMQotCUFERAkjMSxSMQotIQkuU0RBVEEJIlwmVicxIgotCS5ieXRlCTgyLDQ5Ci0hCS5NQUNSTwlQTFVTMQlQLFAxCi0hCUFERAkjMSxcUDEKLSEJLlNEQVRBCSJcUCcxIgotIQkuRU5ETQotIQlQTFVTMQlSLFIxCi0hCUFERAkjMSxSMQotCUFERAkjMSxSMQotIQkuU0RBVEEJIlIxIgotCS5ieXRlCTgyLDQ5Ci0hCi0KLSEJLk1BQ1JPCVNVTSBQMQotIQlNT1YJUjAsUjEwCi0hCUFERAlSMSxSMTAKLSEJQURECVIyLFIxMAotIQlcUDEJCi0hCUFERAlSMyxSMTAKLSEJLkVORE0KLSEKLQotIQlTVU0JLkVYSVRNCi0hCU1PVglSMCxSMTAKLQlNT1YJUjAsUjEwCi0hCUFERAlSMSxSMTAKLQlBREQJUjEsUjEwCi0hCUFERAlSMixSMTAKLQlBREQJUjIsUjEwCi0hCS5FWElUTQkKLSEKLQotIQkuTUFDUk8gZm9vIGJhcj1hIGRlZmF1bHQ9YgotIQlcYmFyCi0hCVxkZWZhdWx0Ci0hCWJhcgotIQlkZWZhdWx0Ci0hCS5FTkRNCi0hCWZvbyBkZWZhdWx0PWRvZyBiYXI9Y2F0Ci0hCWNhdAotCWNhdAotIQlkb2cKLQlkb2cKLSEJYmFyCi0JYmFyCi0hCWRlZmF1bHQKLQlkZWZhdWx0Ci0hCWZvbyBYIFkKLSEJWAotCVgKLSEJWQotCVkKLSEJYmFyCi0JYmFyCi0hCWRlZmF1bHQKLQlkZWZhdWx0Ci0hCWZvbwotIQlhCi0JYQotIQliCi0JYgotIQliYXIKLQliYXIKLSEJZGVmYXVsdAotCWRlZmF1bHQKLSEJZm9vIGJhcj1jYXQgZGVmYXVsdD1kb2cKLSEJY2F0Ci0JY2F0Ci0hCWRvZwotCWRvZwotIQliYXIKLQliYXIKLSEJZGVmYXVsdAotCWRlZmF1bHQKLSEKLQotIQotCi0hCS5NQUNSTwlmb28gYmFyCi0hCUhJCi0hCUhJIFxiYXIKLSEJSEkKLSEJLkVORE0KLSEKLQotIQlmb28gMQotIQlISQotCUhJCi0hCUhJIDEKLQlISSAxCi0hCUhJCi0JSEkKLSEJZm9vIDEyMwotIQlISQotCUhJCi0hCUhJIDEyMwotCUhJIDEyMwotIQlISQotCUhJCi0hCWZvbyAxIDIgMyA0Ci0hCWZvbwotIQlISQotCUhJCi0hCUhJIAotCUhJIAotIQlISQotCUhJCi0hCi0KLSEJCi0hCS5NQUNSTwlQVVNIIFJuCi0hCU1PVi5MCVxSbixALXIxNQotIQkuRU5ETQotIQlQVVNICVIwCi0hCU1PVi5MCVIwLEAtcjE1Ci0JTU9WLkwJUjAsQC1yMTUKLSEJUFVTSAlSMQotIQlNT1YuTAlSMSxALXIxNQotCU1PVi5MCVIxLEAtcjE1Ci0hCi0KLSEKLQotIQkuTUFDUk8JUkVTX1NUUiBTVFIsIFJuCi0hCU1PVi5MCSNzdHJcQCxcUm4KLSEJQlJBCWVuZF9zdHJcQAotIQlOT1AKLSFzdHJcQAkuU0RBVEEgIlxTVFIiCi0hCS5BTElHTgkyCi0hZW5kX3N0clxACi0hCS5FTkRNCi0hCQotIQlSRVNfU1RSCSJPTkUiLFIwCQotIQlNT1YuTAkjc3RyMDAwMTgsUjAKLQlNT1YuTAkjc3RyMDAwMTgsUjAKLSEJQlJBCWVuZF9zdHIwMDAxOAotCUJSQQllbmRfc3RyMDAwMTgKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMTgJLlNEQVRBICJPTkUiCi1zdHIwMDAxODoJLmJ5dGUJNzksNzgsNjkKLSEJLkFMSUdOCTIKLQkuYWxpZ24JMgotIWVuZF9zdHIwMDAxOAotZW5kX3N0cjAwMDE4OgotIQlSRVNfU1RSCSJUV08iLFIxCi0hCU1PVi5MCSNzdHIwMDAxOSxSMQotCU1PVi5MCSNzdHIwMDAxOSxSMQotIQlCUkEJZW5kX3N0cjAwMDE5Ci0JQlJBCWVuZF9zdHIwMDAxOQotIQlOT1AKLQlOT1AKLSFzdHIwMDAxOQkuU0RBVEEgIlRXTyIKLXN0cjAwMDE5OgkuYnl0ZQk4NCw4Nyw3OQotIQkuQUxJR04JMgotCS5hbGlnbgkyCi0hZW5kX3N0cjAwMDE5Ci1lbmRfc3RyMDAwMTk6Ci0hCVJFU19TVFIJIlRIUkVFIixSMgotIQlNT1YuTAkjc3RyMDAwMjAsUjIKLQlNT1YuTAkjc3RyMDAwMjAsUjIKLSEJQlJBCWVuZF9zdHIwMDAyMAotCUJSQQllbmRfc3RyMDAwMjAKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMjAJLlNEQVRBICJUSFJFRSIKLXN0cjAwMDIwOgkuYnl0ZQk4NCw3Miw4Miw2OSw2OQotIQkuQUxJR04JMgotCS5hbGlnbgkyCi0hZW5kX3N0cjAwMDIwCi1lbmRfc3RyMDAwMjA6Ci0hCi0KLSEKLQotIQotCi0hCVJFU19TVFIgU1RSPWRvbmtleSBSbj1SMQotIQlNT1YuTAkjc3RyMDAwMjEsUjEKLQlNT1YuTAkjc3RyMDAwMjEsUjEKLSEJQlJBCWVuZF9zdHIwMDAyMQotCUJSQQllbmRfc3RyMDAwMjEKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMjEJLlNEQVRBICJkb25rZXkiCi1zdHIwMDAyMToJLmJ5dGUJMTAwLDExMSwxMTAsMTA3LDEwMSwxMjEKLSEJLkFMSUdOCTIKLQkuYWxpZ24JMgotIWVuZF9zdHIwMDAyMQotZW5kX3N0cjAwMDIxOgotIQlSRVNfU1RSIGRvbmtleSxSMQotIQlNT1YuTAkjc3RyMDAwMjIsUjEKLQlNT1YuTAkjc3RyMDAwMjIsUjEKLSEJQlJBCWVuZF9zdHIwMDAyMgotCUJSQQllbmRfc3RyMDAwMjIKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMjIJLlNEQVRBICJkb25rZXkiCi1zdHIwMDAyMjoJLmJ5dGUJMTAwLDExMSwxMTAsMTA3LDEwMSwxMjEKLSEJLkFMSUdOCTIKLQkuYWxpZ24JMgotIWVuZF9zdHIwMDAyMgotZW5kX3N0cjAwMDIyOgotISAJUkVTX1NUUiBkb25rZXkgUm49UjEKLSEJTU9WLkwJI3N0cjAwMDIzLFIxCi0JTU9WLkwJI3N0cjAwMDIzLFIxCi0hCUJSQQllbmRfc3RyMDAwMjMKLQlCUkEJZW5kX3N0cjAwMDIzCi0hCU5PUAotCU5PUAotIXN0cjAwMDIzCS5TREFUQSAiZG9ua2V5Igotc3RyMDAwMjM6CS5ieXRlCTEwMCwxMTEsMTEwLDEwNywxMDEsMTIxCi0hCS5BTElHTgkyCi0JLmFsaWduCTIKLSFlbmRfc3RyMDAwMjMKLWVuZF9zdHIwMDAyMzoKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI3N2I0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQotCS5NQUNSTwlISQotCUEKLQlcISB0aGlzIGlzIGhpZGRlbgotCUIKLQkhIHRoaXMgaXMgbm90Ci0JQwotCS5FTkRNCi0JSGVsbG8gCi0JSEkKLQlFbWlseQotCQotCi0JSCcwZgotCTIwMCtIJzBGCi0KLVhYCS5BU1NJR05BCVEnMTAwCi0hIERlZmluaXRpb246Ci0JLk1BQ1JPCUdFVCBYPTEwMCxZLFoKLQlNT1YJI1xYK0gnMEYsQEIKLQlcWQotXFoJSk1QCUBNQUlOCi1MXEAJQUREIAkjMSxASEwKLQlNT1YJIzAsQEMJXCEgQ2xlYXIgQwotCUFERAkjMixAQwotCUFERAkjXCZYWCwgQEMKLQkuRU5ETQotCi0JTk9QCi0KLSFDYWxsOgkKLQlHRVQJMjAwLCJBREQgIzEsQEIiLCBFTlRSWQotCS5FTkQKLQotCTsgRGVmaW5pdGlvbjoKLQotCi0JTk9QCi0KLQk7Q2FsbDoJCi0JTU9WCSMyMDArMEYsQEIKLQlBREQgIzEsQEIKLUVOVFJZOglKTVAJQE1BSU4KLUwwMDAwMDoJQUREIAkjMSxASEwKLQlNT1YJIzAsQEMJCi0JQURECSMyLEBDCi0JQURECSMwLCBAQwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWFkNjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIQotCi0hCS5NQUNSTwlISQotIQlBCi0hCVwhIHRoaXMgaXMgaGlkZGVuCi0hCUIKLSEJISB0aGlzIGlzIG5vdAotIQlDCi0hCS5FTkRNCi0hCUhlbGxvIAotCUhlbGxvIAotIQlISQotIQlBCi0JQQotIQkKLSEJQgotCUIKLSEJISB0aGlzIGlzIG5vdAotCSEgdGhpcyBpcyBub3QKLSEJQwotCUMKLSEJRW1pbHkKLQlFbWlseQotIQkKLSEKLQotIQlIJzBmCi0JMTUKLSEJMjAwK0gnMEYKLQkyMDArMTUKLSEKLQotIVhYCS5BU1NJR05BCVEnMTAwCi0hISBEZWZpbml0aW9uOgotCSEgRGVmaW5pdGlvbjoKLSEJLk1BQ1JPCUdFVCBYPTEwMCxZLFoKLSEJTU9WCSNcWCtIJzBGLEBCCi0hCVxZCi0hXFoJSk1QCUBNQUlOCi0hTFxACUFERCAJIzEsQEhMCi0hCU1PVgkjMCxAQwlcISBDbGVhciBDCi0hCUFERAkjMixAQwotIQlBREQJI1wmWFgsIEBDCi0hCS5FTkRNCi0hCi0KLSEJTk9QCi0JTk9QCi0hCi0KLSEhQ2FsbDoJCi0JIUNhbGw6CQotIQlHRVQJMjAwLCJBREQgIzEsQEIiLCBFTlRSWQotIQlNT1YJIzIwMCtIJzBGLEBCCi0JTU9WCSMyMDArMTUsQEIKLSEJQUREICMxLEBCCi0JQUREICMxLEBCCi0hRU5UUlkJSk1QCUBNQUlOCi1FTlRSWToJSk1QCUBNQUlOCi0hTDAwMDAxCUFERCAJIzEsQEhMCi1MMDAwMDE6CUFERCAJIzEsQEhMCi0hCU1PVgkjMCxAQwkKLQlNT1YJIzAsQEMJCi0hCUFERAkjMixAQwotCUFERAkjMixAQwotIQlBREQJI1wmWFgsIEBDCi0JQURECSM2NCwgQEMKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9lbWJlZC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiOGY3OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotZW1iZWQJbWFjcm8JbGFiZWwKLWFkZHImJmxhYmVsCWRjLmwJbGFiZWwKLQllbmRtCi0KLQllbWJlZAlmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZW1iZWQub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9lbWJlZC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDkyNWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9lbWJlZC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTtlbWJlZAltYWNybwlsYWJlbAotO2FkZHImJmxhYmVsCWRjLmwJbGFiZWwKLTsJZW5kbQotOwotCi07CWVtYmVkCWZvbwotO2FkZHJmb28JZGMubAlmb28KLWFkZHJmb286CWRjLmwJZm9vCi07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzIyMGM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZXhpc3RzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWV4aXN0cwltYWNybwlhcmcxLGFyZzIKLQlpZm5lCT09YXJnMgotCW1vdmUJYXJnMSxhcmcyCi0JZWxzZWMKLQlwdXNoCWFyZzEKLQllbmRjCi0JZW5kbQotCi0JZXhpc3RzCWZvbyxiYXIKLQlleGlzdHMJZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2V4aXN0cy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2V4aXN0cy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NTMzN2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotO2V4aXN0cwltYWNybwlhcmcxLGFyZzIKLTsJaWZuZQk9PWFyZzIKLTsJbW92ZQlhcmcxLGFyZzIKLTsJZWxzZWMKLTsJcHVzaAlhcmcxCi07CWVuZGMKLTsJZW5kbQotOwotCi07CWV4aXN0cwlmb28sYmFyCi07CWlmbmUJLTEKLTsJbW92ZQlmb28sYmFyCi0JbW92ZQlmb28sYmFyCi07CWVsc2VjCi07CXB1c2gJZm9vCi07CWVuZGMKLTsJZXhpc3RzCWZvbwotOwlpZm5lCTAKLTsJbW92ZQlmb28sCi07CWVsc2VjCi07CXB1c2gJZm9vCi0JcHVzaAlmb28KLTsJZW5kYwotOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhMjFkOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQlpcnAJcGFyYW0sYXJnMSxhcmcyLGFyZzMKLQlkYy5sCXBhcmFtCi0JZW5kcgotCWVuZAlxdWl0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDU2MjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnAub3V0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi07CWlycAlwYXJhbSxhcmcxLGFyZzIsYXJnMwotOwlkYy5sCXBhcmFtCi07CWVuZHIKLQlkYy5sCWFyZzEKLQlkYy5sCWFyZzIKLQlkYy5sCWFyZzMKLTsJZW5kCXF1aXQKLQllbmQJcXVpdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwYy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWQ2ODcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCWlycGMJZHVtbXksMTIzNAotCWRjLmwJZHVtbXkKLQllbmRyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycGMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmODgyNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycGMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi07CWlycGMJZHVtbXksMTIzNAotOwlkYy5sCWR1bW15Ci07CWVuZHIKLQlkYy5sCTEKLQlkYy5sCTIKLQlkYy5sCTMKLQlkYy5sCTQKLTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzExYmQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1nZXQJbWFjcm8JYXJnMSxhcmcyLGFyZzMKLQlkYy5sCWFyZzEKLQlhcmcyCi1hcmczCWRjLmwJXDQKLQltb3ZlLlwwCWQwLGQxCi0JZW5kbQotCi0JZ2V0LmIJMSw8ZGMubCAyPixsYWJlbCxmb3VyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8ub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVlYjk0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8ub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotO2dldAltYWNybwlhcmcxLGFyZzIsYXJnMwotOwlkYy5sCWFyZzEKLTsJYXJnMgotO2FyZzMJZGMubAlcNAotOwltb3ZlLlwwCWQwLGQxCi07CWVuZG0KLTsKLQotOwlnZXQuYgkxLDxkYy5sIDI+LGxhYmVsLGZvdXIKLTsJZGMubAkxCi0JZGMubAkxCi07CWRjLmwgMgotCWRjLmwgMgotO2xhYmVsCWRjLmwJZm91cgotbGFiZWw6CWRjLmwJZm91cgotOwltb3ZlLmIJZDAsZDEKLQltb3ZlLmIJZDAsZDEKLTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL25hcmcuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0Yzk0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL25hcmcuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1sb29wCW1hY3JvCWFyZzEsYXJnMixhcmczCi0JZGMubAlOQVJHCi0JaWZuZQlOQVJHCi0JZGMubAlhcmcxCi0JbG9vcAlhcmcyLGFyZzMKLQllbmRjCi0JZW5kbQotCi0JbG9vcAkxLDIsMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyM2ViYzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTtsb29wCW1hY3JvCWFyZzEsYXJnMixhcmczCi07CWRjLmwJTkFSRwotOwlpZm5lCU5BUkcKLTsJZGMubAlhcmcxCi07CWxvb3AJYXJnMixhcmczCi07CWVuZGMKLTsJZW5kbQotOwotCi07CWxvb3AJMSwyLDMKLTsJZGMubAkzCi0JZGMubAkzCi07CWlmbmUJMwotOwlkYy5sCTEKLQlkYy5sCTEKLTsJbG9vcAkyLDMKLTsJZGMubAkyCi0JZGMubAkyCi07CWlmbmUJMgotOwlkYy5sCTIKLQlkYy5sCTIKLTsJbG9vcAkzLAotOwlkYy5sCTEKLQlkYy5sCTEKLTsJaWZuZQkxCi07CWRjLmwJMwotCWRjLmwJMwotOwlsb29wCSwKLTsJZGMubAkwCi0JZGMubAkwCi07CWlmbmUJMAotOwlkYy5sCQotOwlsb29wCSwKLTsJZW5kYwotOwllbmRjCi07CWVuZGMKLTsJZW5kYwotOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL3JlcHQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTYzYmIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQlyZXB0CTMKLQlkYy5sCTEKLQllbmRyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL3JlcHQub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9yZXB0Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0ZWQ2Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL3JlcHQub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotOwlyZXB0CTMKLTsJZGMubAkxCi07CWVuZHIKLTsJZGMubAkxCi0JZGMubAkxCi07CVJFUFQJMgotOwlkYy5sCTEKLTsJRU5EUgotOwlkYy5sCTEKLQlkYy5sCTEKLTsJUkVQVAkxCi07CWRjLmwJMQotOwlFTkRSCi07CWRjLmwJMQotCWRjLmwJMQotOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOGJmZGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JCi0JLkFMVEVSTkFURQotCi1hbGxvYyAJTUFDUk8gdmFsMSx2YWwyCi0JREIJdmFsMQotCURCIAl2YWwyCi0JRU5ETQotCi0JYWxsb2MJInRoYXQncyIgJ3Nob3cgYml6JwotCWFsbG9jCTAsMQotCWFsbG9jCTAgMQotCWFsbG9jCTAJMQotCWFsbG9jCSwxCi0KLQotCQotCi0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWUzMzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODBmMTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0hCQotIQkuQUxURVJOQVRFCi0hCi0KLSFhbGxvYyAJTUFDUk8gdmFsMSx2YWwyCi0hCURCCXZhbDEKLSEJREIgCXZhbDIKLSEJRU5ETQotIQotCi0hCWFsbG9jCSJ0aGF0J3MiICdzaG93IGJpeicKLSEJREIJInRoYXQncyIKLQkuYnl0ZQkxMTYsMTA0LDk3LDExNiwzOSwxMTUKLSEJREIgCSJzaG93IGJpeiIKLQkuYnl0ZQkxMTUsMTA0LDExMSwxMTksMzIsOTgsMTA1LDEyMgotIQlhbGxvYwkwLDEKLSEJREIJMAotCS5ieXRlCTAKLSEJREIgCTEKLQkuYnl0ZQkxCi0hCWFsbG9jCTAgMQotIQlEQgkwCi0JLmJ5dGUJMAotIQlEQiAJMQotCS5ieXRlCTEKLSEJYWxsb2MJMAkxCi0hCURCCTAKLQkuYnl0ZQkwCi0hCURCIAkxCi0JLmJ5dGUJMQotIQlhbGxvYwksMQotIQlEQgkKLQkuYnl0ZQkKLSEJREIgCTEKLQkuYnl0ZQkxCi0hCi0KLSEKLQotIQkKLSEKLQotIQotCi0hCi0KLSEKLQotIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzExMzcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0KLQotCS5BTFRFUk5BVEUKLQotCSEgb2sKLQkhISBhbHNvIG9rCi0KLWZvbwlNQUNSTwkKLQkhIHlvdSBjYW4gc2VlIG1lCi0JISEgYnV0IG5vdCBtZQotCSEgeW91IGNhbiBzZWUgbWUKLQkhISBidXQgbm90IG1lCi0JYnV0IHRoaXMgIlNIT1VMRCAhIUJFIE9LIgotCUVORE0KLQotCWZvbwotCi0KLWRlZmluZSAJTUFDUk8JdmFsMSx2YWwyCi0JREIgCXZhbDEJISB0aGlzIGNvbW1lbnQgd2lsbCBzaG93IHVwIAotCURCCXZhbDIJISEgdGhpcyBvbiB3b24ndAotCUVORE0KLQotCWRlZmluZQkwLDEKLQotCi0JRU5ECi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTZmYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0hCi0KLSEKLQotIQkuQUxURVJOQVRFCi0hCi0KLSEJISBvawotCSEgb2sKLSEJISEgYWxzbyBvawotCSEhIGFsc28gb2sKLSEKLQotIWZvbwlNQUNSTwkKLSEJISB5b3UgY2FuIHNlZSBtZQotIQkhISBidXQgbm90IG1lCi0hCSEgeW91IGNhbiBzZWUgbWUKLSEJISEgYnV0IG5vdCBtZQotIQlidXQgdGhpcyAiU0hPVUxEICEhQkUgT0siCi0hCUVORE0KLSEKLQotIQlmb28KLSEJISB5b3UgY2FuIHNlZSBtZQotCSEgeW91IGNhbiBzZWUgbWUKLSEJCi0hCSEgeW91IGNhbiBzZWUgbWUKLQkhIHlvdSBjYW4gc2VlIG1lCi0hCQotIQlidXQgdGhpcyAiU0hPVUxEICEhQkUgT0siCi0JYnV0IHRoaXMgIlNIT1VMRCAhIUJFIE9LIgotIQotCi0hCi0KLSFkZWZpbmUgCU1BQ1JPCXZhbDEsdmFsMgotIQlEQiAJdmFsMQkhIHRoaXMgY29tbWVudCB3aWxsIHNob3cgdXAgCi0hCURCCXZhbDIJISEgdGhpcyBvbiB3b24ndAotIQlFTkRNCi0hCi0KLSEJZGVmaW5lCTAsMQotIQlEQiAJMAkhIHRoaXMgY29tbWVudCB3aWxsIHNob3cgdXAgCi0JLmJ5dGUJMCEgdGhpcyBjb21tZW50IHdpbGwgc2hvdyB1cCAKLSEJREIJMQkKLQkuYnl0ZQkxCi0hCi0KLSEKLQotIQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzFkY2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0JLkFMVEVSTkFURQotCi1mb28JTUFDUk8Jc3RyaW5nCi0JTE9DQUwJbGFiMSwgbGFiMgotbGFiMToJREFUQS5MCWxhYjIKLWxhYjI6CVNEQVRBCXN0cmluZwotCUVORE0KLQotCWZvbwkiQW4gZXhhbXBsZSIKLQlmb28JInVzaW5nIExPQ0FMIgotCi0hIHRlc3Qgb2YgTE9DQUwgZGlyZWN0aXZlCi0KLWNoa19lcnIJTUFDUk8JbGltaXQKLQlMT0NBTAkJc2tpcCAhISBmcm9iCi0JTE9DQUwJCXphcCxkb2csYmFyZgotYmFyZjoJY21wCQlheCxsaW1pdAkhISBjaGVjayB2YWx1ZSBhZ2FpbnN0Ci0JCQkJCSEhIGxpbWl0Ci0JamxlCQlza2lwCQkhISBza2lwIGNhbGwgaWYgT0sKLXNraXA6CWNhbGwJIAllcnJvcgotCWZvbwkJZG9nCi0JemFwCQlkb2cJCi0Jbm9wCi0JRU5ETQotCi0JY2hrX2VyciA1Ci0JY2hrX2VyciAxMAotCi0KLQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MTk0Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSEJLkFMVEVSTkFURQotIQotCi0hZm9vCU1BQ1JPCXN0cmluZwotIQlMT0NBTAlsYWIxLCBsYWIyCi0hbGFiMToJREFUQS5MCWxhYjIKLSFsYWIyOglTREFUQQlzdHJpbmcKLSEJRU5ETQotIQotCi0hCWZvbwkiQW4gZXhhbXBsZSIKLSEJCi0hTEwwMDAxOglEQVRBLkwJTEwwMDAyCi1MTDAwMDE6CS5sb25nCUxMMDAwMgotIUxMMDAwMjoJU0RBVEEJIkFuIGV4YW1wbGUiCi1MTDAwMDI6CS5ieXRlCTY1LDExMCwzMiwxMDEsMTIwLDk3LDEwOSwxMTIsMTA4LDEwMQotIQlmb28JInVzaW5nIExPQ0FMIgotIQkKLSFMTDAwMDM6CURBVEEuTAlMTDAwMDQKLUxMMDAwMzoJLmxvbmcJTEwwMDA0Ci0hTEwwMDA0OglTREFUQQkidXNpbmcgTE9DQUwiCi1MTDAwMDQ6CS5ieXRlCTExNywxMTUsMTA1LDExMCwxMDMsMzIsNzYsNzksNjcsNjUsNzYKLSEKLQotISEgdGVzdCBvZiBMT0NBTCBkaXJlY3RpdmUKLQkhIHRlc3Qgb2YgTE9DQUwgZGlyZWN0aXZlCi0hCi0KLSFjaGtfZXJyCU1BQ1JPCWxpbWl0Ci0hCUxPQ0FMCQlza2lwICEhIGZyb2IKLSEJTE9DQUwJCXphcCxkb2csYmFyZgotIWJhcmY6CWNtcAkJYXgsbGltaXQJISEgY2hlY2sgdmFsdWUgYWdhaW5zdAotIQkJCQkJISEgbGltaXQKLSEJamxlCQlza2lwCQkhISBza2lwIGNhbGwgaWYgT0sKLSFza2lwOgljYWxsCSAJZXJyb3IKLSEJZm9vCQlkb2cKLSEJemFwCQlkb2cJCi0hCW5vcAotIQlFTkRNCi0hCi0KLSEJY2hrX2VyciA1Ci0hCQotIQkKLSFMTDAwMDg6CWNtcAkJYXgsNQkKLUxMMDAwODoJY21wCQlheCw1CQotIQkJCQkJCi0hCWpsZQkJTEwwMDA1CQkKLQlqbGUJCUxMMDAwNQkJCi0hTEwwMDA1OgljYWxsCSAJZXJyb3IKLUxMMDAwNToJY2FsbAkgCWVycm9yCi0hCWZvbwkJTEwwMDA3Ci0hCQotIUxMMDAwOToJREFUQS5MCUxMMDAwYQotTEwwMDA5OgkubG9uZwlMTDAwMGEKLSFMTDAwMGE6CVNEQVRBCUxMMDAwNwotTEwwMDBhOgkuYnl0ZQk3Niw3Niw0OCw0OCw0OCw1NQotIQlMTDAwMDYJCUxMMDAwNwkKLQlMTDAwMDYJCUxMMDAwNwkKLSEJbm9wCi0Jbm9wCi0hCWNoa19lcnIgMTAKLSEJCi0hCQotIUxMMDAwZToJY21wCQlheCwxMAkKLUxMMDAwZToJY21wCQlheCwxMAkKLSEJCQkJCQotIQlqbGUJCUxMMDAwYgkJCi0JamxlCQlMTDAwMGIJCQotIUxMMDAwYjoJY2FsbAkgCWVycm9yCi1MTDAwMGI6CWNhbGwJIAllcnJvcgotIQlmb28JCUxMMDAwZAotIQkKLSFMTDAwMGY6CURBVEEuTAlMTDAwMTAKLUxMMDAwZjoJLmxvbmcJTEwwMDEwCi0hTEwwMDEwOglTREFUQQlMTDAwMGQKLUxMMDAxMDoJLmJ5dGUJNzYsNzYsNDgsNDgsNDgsMTAwCi0hCUxMMDAwYwkJTEwwMDBkCQotCUxMMDAwYwkJTEwwMDBkCQotIQlub3AKLQlub3AKLSEKLQotIQotCi0hCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkZDNlOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuQUxURVJOQVRFCi0hIHRlc3Qgb2YgbWFjcm8gc3Vic3RpdHV0aW9uIGFyb3VuZCAmcwotCi0KLWZvbwlNQUNSTwlhLGIKLQl4JmEmYgotCUVORE0KLQotCWZvbyAzIDIgCi0JRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZDEzOTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0hCS5BTFRFUk5BVEUKLSEhIHRlc3Qgb2YgbWFjcm8gc3Vic3RpdHV0aW9uIGFyb3VuZCAmcwotCSEgdGVzdCBvZiBtYWNybyBzdWJzdGl0dXRpb24gYXJvdW5kICZzCi0hCi0KLSEKLQotIWZvbwlNQUNSTwlhLGIKLSEJeCZhJmIKLSEJRU5ETQotIQotCi0hCWZvbyAzIDIgCi0hCXgzMgotCXgzMgotIQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Yjk5OWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0hIHRlc3Qgb2YgbGl0ZXJhbCB0ZXh0IG9wZXJhdG9yCi0JLkFMVEVSTkFURQotZm9vcAlNQUNSTwlzdHIxLHN0cjIKLQlTREFUQQkic3RyMSIKLQlTREFUQQlzdHIyCi0JRU5ETQotCi0KLQkKLQlmb29wCXRoaXM8IGlzIGEgPHN0cmluZz4gd2l0aCBhbmdsZSBicmFja2V0cz4KLQlmb29wIAl0aGlzPCBpcyBhIHN0cmluZyB3aXRoIHNwYWNlcz4KLQlmb29wCXRoaXMgPCBpcyBhIHN0cmluZyB3aXRoIGEgIT4+Ci0KLQotCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE0ODhiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotISEgdGVzdCBvZiBsaXRlcmFsIHRleHQgb3BlcmF0b3IKLQkhIHRlc3Qgb2YgbGl0ZXJhbCB0ZXh0IG9wZXJhdG9yCi0hCS5BTFRFUk5BVEUKLSFmb29wCU1BQ1JPCXN0cjEsc3RyMgotIQlTREFUQQkic3RyMSIKLSEJU0RBVEEJc3RyMgotIQlFTkRNCi0hCi0KLSEKLQotIQkKLSEJZm9vcAl0aGlzPCBpcyBhIDxzdHJpbmc+IHdpdGggYW5nbGUgYnJhY2tldHM+Ci0hCVNEQVRBCSJ0aGlzIgotCS5ieXRlCTExNiwxMDQsMTA1LDExNQotIQlTREFUQQkiIGlzIGEgPHN0cmluZz4gd2l0aCBhbmdsZSBicmFja2V0cyIKLQkuYnl0ZQkzMiwxMDUsMTE1LDMyLDk3LDMyLDYwLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDYyLDMyLDExOSwxMDUsMTE2LDEwNCwzMiw5NywxMTAsMTAzLDEwOCwxMDEsMzIsOTgsMTE0LDk3LDk5LDEwNywxMDEsMTE2LDExNQotIQlmb29wIAl0aGlzPCBpcyBhIHN0cmluZyB3aXRoIHNwYWNlcz4KLSEJU0RBVEEJInRoaXMiCi0JLmJ5dGUJMTE2LDEwNCwxMDUsMTE1Ci0hCVNEQVRBCSIgaXMgYSBzdHJpbmcgd2l0aCBzcGFjZXMiCi0JLmJ5dGUJMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE1LDExMiw5Nyw5OSwxMDEsMTE1Ci0hCWZvb3AJdGhpcyA8IGlzIGEgc3RyaW5nIHdpdGggYSAhPj4KLSEJU0RBVEEJInRoaXMiCi0JLmJ5dGUJMTE2LDEwNCwxMDUsMTE1Ci0hCVNEQVRBCSIgaXMgYSBzdHJpbmcgd2l0aCBhID4iCi0JLmJ5dGUJMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywzMiwxMTksMTA1LDExNiwxMDQsMzIsOTcsMzIsNjIKLSEKLQotIQotCi0hCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyZDYxNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuQUxURVJOQVRFCi0hIHRlc3Qgb2YgZXhwcmVzc2lvbiBvcGVyYXRvcgotZGVmaW5lIAlNQUNSTyAJdmFsLCBzdHJpbmcKLQlTREFUQSAJdmFsCi0JU0RBVEEJc3RyaW5nCi0JRU5ETQotCWRlZmluZSAiMSIsIjk5JW9mMTAwIgkhIG5vdGljZSAlIHdpdGhpbiBzdHJpbmcKLQlkZWZpbmUgCSUxICsgMiwgIj0zIgotCi0KLQlkZWZpbmUgCSUgMSArIDIgJTMrNAotCi0JZGVmaW5lCSUzKjQtMiAgPD0xMD4KLQotCWRlZmluZQklMyo0LTIgIDUKLQotCWRlZmluZQklMSArIDIsPGlzIGVxdWFsIHRvICUxICsgMiwgcmlnaHQ/PgotCi0JISBoYXMgbm8gZWZmZWN0Ci0KLQllbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkMTZjZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSEJLkFMVEVSTkFURQotISEgdGVzdCBvZiBleHByZXNzaW9uIG9wZXJhdG9yCi0JISB0ZXN0IG9mIGV4cHJlc3Npb24gb3BlcmF0b3IKLSFkZWZpbmUgCU1BQ1JPIAl2YWwsIHN0cmluZwotIQlTREFUQSAJdmFsCi0hCVNEQVRBCXN0cmluZwotIQlFTkRNCi0hCWRlZmluZSAiMSIsIjk5JW9mMTAwIgkhIG5vdGljZSAlIHdpdGhpbiBzdHJpbmcKLSEJU0RBVEEgCSIxIgotCS5ieXRlCTQ5Ci0hCVNEQVRBCSI5OSVvZjEwMCIKLQkuYnl0ZQk1Nyw1NywzNywxMTEsMTAyLDQ5LDQ4LDQ4Ci0hCWRlZmluZSAJJTEgKyAyLCAiPTMiCi0hCVNEQVRBIAkzCi0JLmJ5dGUJNTEKLSEJU0RBVEEJIj0zIgotCS5ieXRlCTYxLDUxCi0hCi0KLSEKLQotIQlkZWZpbmUgCSUgMSArIDIgJTMrNAotIQlTREFUQSAJMwotCS5ieXRlCTUxCi0hCVNEQVRBCTcKLQkuYnl0ZQk1NQotIQotCi0hCWRlZmluZQklMyo0LTIgIDw9MTA+Ci0hCVNEQVRBIAkxMAotCS5ieXRlCTQ5LDQ4Ci0hCVNEQVRBCSI9MTAiCi0JLmJ5dGUJNjEsNDksNDgKLSEKLQotIQlkZWZpbmUJJTMqNC0yICA1Ci0hCVNEQVRBIAkxMAotCS5ieXRlCTQ5LDQ4Ci0hCVNEQVRBCTUKLQkuYnl0ZQk1MwotIQotCi0hCWRlZmluZQklMSArIDIsPGlzIGVxdWFsIHRvICUxICsgMiwgcmlnaHQ/PgotIQlTREFUQSAJMwotCS5ieXRlCTUxCi0hCVNEQVRBCSJpcyBlcXVhbCB0byAlMSArIDIsIHJpZ2h0PyIKLQkuYnl0ZQkxMDUsMTE1LDMyLDEwMSwxMTMsMTE3LDk3LDEwOCwzMiwxMTYsMTExLDMyLDM3LDQ5LDMyLDQzLDMyLDUwLDQ0LDMyLDExNCwxMDUsMTAzLDEwNCwxMTYsNjMKLSEKLQotIQkhIGhhcyBubyBlZmZlY3QKLQkhIGhhcyBubyBlZmZlY3QKLSEKLQotIQllbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTQwYWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLkFMVEVSTkFURQotISB0ZXN0IG9mIHN0cmluZyBvcGVyYXRvcnMKLWRlZmluZQlNQUNSTwlzdHIxLHN0cjIKLQlTREFUQQlzdHIxCi0JU0RBVEEJInN0cjIiCi1FTkRNCi0JZGVmaW5lCW9uZSIgd2F5IHRvIGdldCAic3BhY2VzLDAKLQlkZWZpbmUJImxvdCdzISBvZiA8c3BlY2lhbD4sY2hhcnMlIiwgMAotCi0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWUzMzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTliMzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0hCS5BTFRFUk5BVEUKLSEhIHRlc3Qgb2Ygc3RyaW5nIG9wZXJhdG9ycwotCSEgdGVzdCBvZiBzdHJpbmcgb3BlcmF0b3JzCi0hZGVmaW5lCU1BQ1JPCXN0cjEsc3RyMgotIQlTREFUQQlzdHIxCi0hCVNEQVRBCSJzdHIyIgotIUVORE0KLSEJZGVmaW5lCW9uZSIgd2F5IHRvIGdldCAic3BhY2VzLDAKLSEJU0RBVEEJb25lIiB3YXkgdG8gZ2V0ICJzcGFjZXMKLQkuYnl0ZQkxMTEsMTEwLDEwMSwzNCwzMiwxMTksOTcsMTIxLDMyLDExNiwxMTEsMzIsMTAzLDEwMSwxMTYsMzIsMzQsMTE1LDExMiw5Nyw5OSwxMDEsMTE1Ci0hCVNEQVRBCSIwIgotCS5ieXRlCTQ4Ci0hCWRlZmluZQkibG90J3MhIG9mIDxzcGVjaWFsPixjaGFycyUiLCAwCi0hCVNEQVRBCSJsb3QncyBvZiA8c3BlY2lhbD4sY2hhcnMlIgotCS5ieXRlCTEwOCwxMTEsMTE2LDM5LDExNSwzMiwxMTEsMTAyLDMyLDYwLDExNSwxMTIsMTAxLDk5LDEwNSw5NywxMDgsNjIsNDQsOTksMTA0LDk3LDExNCwxMTUsMzcKLSEJU0RBVEEJIjAiCi0JLmJ5dGUJNDgKLSEKLQotIQotCi0hCi0KLSEKLQotIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNWIxNzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0KLQkuQUxURVJOQVRFCi0JU0RBVEEJJTErMiszIAotCVNEQVRBCSI1IgotCi0KLQotCU1BQ1JPCWZvbwotCVNEQVRBCSJISSIJISEgdGhpcyB3aWxsIGdvCi0JU0RBVEEJIlRIRVJFCSEgdGhpcyB3aWxsIHN0YXkKLQlFTkRNCi0KLQlmb28KLQotCi0JU0RBVEEJPCE8dGhpcyBpcyA8YSB3YWNreT4gZXhhbXBsZSE+ISE+Ci0JU0RBVEEJIjx0aGlzIGlzIDxhIHdhY2t5PiBleGFtcGxlPiEiCi0JRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDgub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTA0MTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0hCi0KLSEJLkFMVEVSTkFURQotIQlTREFUQQklMSsyKzMgCi0JLmJ5dGUJMzcsNDksNDMsNTAsNDMsNTEsMzIKLSEJU0RBVEEJIjUiCi0JLmJ5dGUJNTMKLSEKLQotIQotCi0hCi0KLSEJTUFDUk8JZm9vCi0hCVNEQVRBCSJISSIJISEgdGhpcyB3aWxsIGdvCi0hCVNEQVRBCSJUSEVSRQkhIHRoaXMgd2lsbCBzdGF5Ci0hCUVORE0KLSEKLQotIQlmb28KLSEJU0RBVEEJIkhJIgkKLQkuYnl0ZQk3Miw3MwotIQlTREFUQQkiVEhFUkUJISB0aGlzIHdpbGwgc3RheQotCS5ieXRlCTg0LDcyLDY5LDgyLDY5LDksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExOSwxMDUsMTA4LDEwOCwzMiwxMTUsMTE2LDk3LDEyMQotIQotCi0hCi0KLSEJU0RBVEEJPCE8dGhpcyBpcyA8YSB3YWNreT4gZXhhbXBsZSE+ISE+Ci0JLmJ5dGUJNjAsMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsNjAsOTcsMzIsMTE5LDk3LDk5LDEwNywxMjEsNjIsMzIsMTAxLDEyMCw5NywxMDksMTEyLDEwOCwxMDEsNjIsMzMKLSEJU0RBVEEJIjx0aGlzIGlzIDxhIHdhY2t5PiBleGFtcGxlPiEiCi0JLmJ5dGUJNjAsMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsNjAsOTcsMzIsMTE5LDk3LDk5LDEwNywxMjEsNjIsMzIsMTAxLDEyMCw5NywxMDksMTEyLDEwOCwxMDEsNjIsMzQKLSEJRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTdjYWY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLSAgICAgLnNkYXRhICJ2MS4wMDAwIgotICAgICAuZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGYxZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSEKLQotISAgICAgLnNkYXRhICJ2MS4wMDAwIgotCS5ieXRlCTExOCw0OSw0Niw0OCw0OCw0OCw0OAotISAgICAgLmVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0NjNlZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi0KLWZvbwkuUkVHCShyMSkKLQlhZGQJZm9vLGZvbwotCi1iYXIJLnJlZwkocjIpCi0JYWRkCWJhcixmb28KLQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyNjhhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSEKLQotIQotCi0hZm9vCS5SRUcJKHIxKQotIQlhZGQJZm9vLGZvbwotCWFkZAlyMSxyMQotIQotCi0hYmFyCS5yZWcJKHIyKQotIQlhZGQJYmFyLGZvbwotCWFkZAlyMixyMQotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2FjNDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLkFSRVBFQVQJNQotCUZJVkUKLQkuQVJFUEVBVAkyCi0JVFdPCi0JLkFFTkRSCi0JLkFSRVBFQVQJMwotCVRIUkVFCi0JLkFSRVBFQVQJMgotCVRXTwkKLQkuQUVORFIKLQkuQUVORFIKLQkuQUVORFIKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMGQwZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotIQkuQVJFUEVBVAk1Ci0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAk0Ci0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkzCi0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkyCi0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTg1ZGEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCi0JLkFSRVBFQVQJMTAKLQlURU4KLQkuQVJFUEVBVAkyCQotCVRXRU5UWQotCS5BRU5EUgotCS5BRU5EUgotCi0JLkFSRVBFQVQJMwotCVJPVENMCVIyCi0JRElWMQlSMCxSMQotCS5BRU5EUgotCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDVkOGQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSEKLQotIQkuQVJFUEVBVAkxMAotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJOQotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJOAotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJNwotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJNgotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJNQotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJNAotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMwotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMgotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEKLQotIQkuQVJFUEVBVAkzCi0hCVJPVENMCVIyCi0hCURJVjEJUjAsUjEKLSEJLkFFTkRSCi0hCVJPVENMCVIyCi0JUk9UQ0wJUjIKLSEJRElWMQlSMCxSMQotCURJVjEJUjAsUjEKLSEJLkFSRVBFQVQJMgotIQlST1RDTAlSMgotIQlESVYxCVIwLFIxCi0hCS5BRU5EUgotIQlST1RDTAlSMgotCVJPVENMCVIyCi0hCURJVjEJUjAsUjEKLQlESVYxCVIwLFIxCi0hCS5BUkVQRUFUCTEKLSEJUk9UQ0wJUjIKLSEJRElWMQlSMCxSMQotIQkuQUVORFIKLSEJUk9UQ0wJUjIKLQlST1RDTAlSMgotIQlESVYxCVIwLFIxCi0JRElWMQlSMCxSMQotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwODgyYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotCS5SRVBFQVQJMTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTMzMTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FTkQgbWlzc2luZyBmcm9tIGVuZCBvZiBmaWxlLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5ZjhjNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIQotCi0hCS5SRVBFQVQJMTAKLQkuUkVQRUFUCTEwCi0hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDk4N2U0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi0JLkFSRVBFQVQJMTAKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjU0NWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRW5kIG9mIGZpbGUgd2hpbHN0IGluc2lkZSBBUkVQRUFULCBzdGFydGVkIG9uIGxpbmUgMy4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4Mjg4MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSEKLQotIQkuQVJFUEVBVAkxMAotIQkuRU5ECi0hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTA2YTcxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCi0JLkFSRVBFQVQJNQotCS5BRU5EUgkJCi0JLkFFTkRSCi0JLkVORAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MGNjYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcmVwZXJyMi5hc206NCBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3YTg0ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0hCi0KLSEJLkFSRVBFQVQJNQotIQkuQUVORFIJCQotIQkuQVJFUEVBVAk0Ci0hCS5BRU5EUgotIQkuQVJFUEVBVAkzCi0hCS5BRU5EUgotIQkuQVJFUEVBVAkyCi0hCS5BRU5EUgotIQkuQVJFUEVBVAkxCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjRiYzc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuQVJFUEVBVAk0Ci0JLkFSRVBFQVQJNAotCS5BUkVQRUFUCTQKLQkuQVJFUEVBVAk0Ci0Jc3R1ZmYKLQkuQUVORFIJCQotCXdoaWNoCi0JLkFFTkRSCQotCXdpbGwKLQkuQUVORFIJCi0JZ2V0Ci0JLkFFTkRSCQotCXJlcGV0YWVkCi0JLkFFTkRSCQotCi0JLkFFTkRSCQotCS5BRU5EUgkKLQkuQUVORFIJCi0JLkFFTkRSCQotCS5BRU5EUgkKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTBkY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuZXJyCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1yZXBlcnIzLmFzbToxNCBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KLXJlcGVycjMuYXNtOjE2IEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgotcmVwZXJyMy5hc206MTcgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCi1yZXBlcnIzLmFzbToxOCBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KLXJlcGVycjMuYXNtOjE5IEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgotcmVwZXJyMy5hc206MjAgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzUxM2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzNSArMCwwIEBACi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJZ2V0Ci0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJZ2V0Ci0JZ2V0Ci0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJZ2V0Ci0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQlnZXQKLQlnZXQKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQlnZXQKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCWdldAotCWdldAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCWdldAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJZ2V0Ci0JZ2V0Ci0hCXJlcGV0YWVkCi0JcmVwZXRhZWQKLSEJLkFFTkRSCQotIQotCi0hCS5BRU5EUgkKLSEJLkFFTkRSCQotIQkuQUVORFIJCi0hCS5BRU5EUgkKLSEJLkFFTkRSCQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZiZDIzYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0KLQkuU0RBVEEJIkhJIiwiU1RFVkUiCi0JLlNEQVRBCSJISSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KLQotCS5TREFUQQkiSCIiSSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KLQotCi0KLQkuU0RBVEEJIlNIT1VMRCBOT1QgRkFJTCIgIkhFUkUiIAotCS5TREFUQQkiU0hPVUxEIEZBSUwiICBmb28gIkhFUkUiIAotCi0JLlNEQVRBQgk4LCJCT0lOSyIKLQotCTsgZXhhbXBsZXMgZnJvbSBib29rCi0KLQkuU0RBVEFCCTIsIkFBQUFBIgotCS5TREFUQUIJMiwiIiJCQkIiIiIKLQkuU0RBVEFCCTIsIkFBQkIiPEgnMDc+Ci0KLQotYTE6CS5TREFUQVoJIkhJIgotYTI6CS5TREFUQUMgIkhJIgotYTM6CS5TREFUQQkiSEkiCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0NGNjYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuZXJyCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zZGF0YS5hc206MTkgQ2hhcmFjdGVyIGNvZGUgaW4gc3RyaW5nIG11c3QgYmUgYWJzb2x1dGUgZXhwcmVzc2lvbi4KLXNkYXRhLmFzbToxOSBNaXNzaW5nID4gZm9yIGNoYXJhY3RlciBjb2RlLgotRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjg5ZDM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0hCi0KLSEKLQotIQkuU0RBVEEJIkhJIiwiU1RFVkUiCi0JLmJ5dGUJNzIsNzMsODMsODQsNjksODYsNjkKLSEJLlNEQVRBCSJISSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KLQkuYnl0ZQk3Miw3Myw4Myw4NCw2OSw4Niw2OSw3Miw3Myw4Myw2OSw4Niw2OQotIQotCi0hCS5TREFUQQkiSCIiSSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KLQkuYnl0ZQk3MiwzNCw3Myw4Myw4NCw2OSw4Niw2OSw3Miw3Myw4Myw2OSw4Niw2OQotIQotCi0hCi0KLSEKLQotIQkuU0RBVEEJIlNIT1VMRCBOT1QgRkFJTCIgIkhFUkUiIAotCS5ieXRlCTgzLDcyLDc5LDg1LDc2LDY4LDMyLDc4LDc5LDg0LDMyLDcwLDY1LDczLDc2LDcyLDY5LDgyLDY5Ci0hCS5TREFUQQkiU0hPVUxEIEZBSUwiICBmb28gIkhFUkUiIAotCS5ieXRlCTgzLDcyLDc5LDg1LDc2LDY4LDMyLDcwLDY1LDczLDc2LDEwMiwxMTEsMTExLDMyLDM0LDcyLDY5LDgyLDY5LDM0LDMyCi0hCi0KLSEJLlNEQVRBQgk4LCJCT0lOSyIKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0hCi0KLSEJOyBleGFtcGxlcyBmcm9tIGJvb2sKLQk7IGV4YW1wbGVzIGZyb20gYm9vawotIQotCi0hCS5TREFUQUIJMiwiQUFBQUEiCi0JLmJ5dGUJNjUsNjUsNjUsNjUsNjUKLQkuYnl0ZQk2NSw2NSw2NSw2NSw2NQotIQkuU0RBVEFCCTIsIiIiQkJCIiIiCi0JLmJ5dGUJMzQsNjYsNjYsNjYsMzQKLQkuYnl0ZQkzNCw2Niw2Niw2NiwzNAotIQkuU0RBVEFCCTIsIkFBQkIiPEgnMDc+Ci0JLmJ5dGUJNjUsNjUsNjYsNjYsMAotCS5ieXRlCTY1LDY1LDY2LDY2LDAKLSEKLQotIQotCi0hYTE6CS5TREFUQVoJIkhJIgotYTE6CS5ieXRlCTcyLDczLDAKLSFhMjoJLlNEQVRBQyAiSEkiCi1hMjoJLmJ5dGUJMiw3Miw3MwotIWEzOgkuU0RBVEEJIkhJIgotYTM6CS5ieXRlCTcyLDczCi0hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTk0OWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLQotCS5NQUNSTwlSRVNFUlZFX1NUUiBQMT0wIFAyCi0JLlNEQVRBCS5TVUJTVFIoIkFCQ0RFRkciLFxQMSxcUDIpCi0JLkVORE0KLQotCVJFU0VSVkVfU1RSCTIsMgotCVJFU0VSVkVfU1RSCSwzCi0KLQotCS5NQUNSTyBGSU5EX1NUUiBQMQotCS5EQVRBLlcJLklOU1RSKCJBQkNERUZHIiwiXFAxIiwgMCkKLQkuRU5ETQotCi0JRklORF9TVFIJQ0RFCi0JRklORF9TVFIJSAotCi0JLk1BQ1JPCVJFU0VSVkVfTEVOR1RIIFAxCi0JLkFMSUdOCTQKLQkuU1JFUwkuTEVOKCJcUDEiKQotCS5FTkRNCi0KLQlSRVNFUlZFX0xFTkdUSAlBQkNERUYKLQlSRVNFUlZFX0xFTkdUSAlBQkMKLQotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmNjk0Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIQotCi0hCS5NQUNSTwlSRVNFUlZFX1NUUiBQMT0wIFAyCi0hCS5TREFUQQkuU1VCU1RSKCJBQkNERUZHIixcUDEsXFAyKQotIQkuRU5ETQotIQotCi0hCVJFU0VSVkVfU1RSCTIsMgotIQkuU0RBVEEJLlNVQlNUUigiQUJDREVGRyIsMiwyKQotCS5ieXRlCTY3LDY4Ci0hCVJFU0VSVkVfU1RSCSwzCi0hCS5TREFUQQkuU1VCU1RSKCJBQkNERUZHIiwwLDMpCi0JLmJ5dGUJNjUsNjYsNjcKLSEKLQotIQotCi0hCS5NQUNSTyBGSU5EX1NUUiBQMQotIQkuREFUQS5XCS5JTlNUUigiQUJDREVGRyIsIlxQMSIsIDApCi0hCS5FTkRNCi0hCi0KLSEJRklORF9TVFIJQ0RFCi0hCS5EQVRBLlcJLklOU1RSKCJBQkNERUZHIiwiQ0RFIiwgMCkKLQkuc2hvcnQJMgotIQlGSU5EX1NUUglICi0hCS5EQVRBLlcJLklOU1RSKCJBQkNERUZHIiwiSCIsIDApCi0JLnNob3J0CS0xCi0hCi0KLSEJLk1BQ1JPCVJFU0VSVkVfTEVOR1RIIFAxCi0hCS5BTElHTgk0Ci0hCS5TUkVTCS5MRU4oIlxQMSIpCi0hCS5FTkRNCi0hCi0KLSEJUkVTRVJWRV9MRU5HVEgJQUJDREVGCi0hCS5BTElHTgk0Ci0JLmFsaWduCTQKLSEJLlNSRVMJLkxFTigiQUJDREVGIikKLQkuc3BhY2UJMjQKLSEJUkVTRVJWRV9MRU5HVEgJQUJDCi0hCS5BTElHTgk0Ci0JLmFsaWduCTQKLSEJLlNSRVMJLkxFTigiQUJDIikKLQkuc3BhY2UJMTIKLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1NGM2Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLQl0ZXN0IGZvciBlb2YgaW4gbWlkZGxlIG9mIGxpbmUKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIzMGUxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSEKLQotIQl0ZXN0IGZvciBlb2YgaW4gbWlkZGxlIG9mIGxpbmUKLQl0ZXN0IGZvciBlb2YgaW4gbWlkZGxlIG9mIGxpbmUKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTM1MWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi0KLQl0ZXN0Ci0rIGNvbnRpbnVlZAotKyBsaW5lcwotCi0KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDIub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQ0ZThiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0hCi0KLSEKLQotIQl0ZXN0Ci0hK2NvbnRpbnVlZAotIStsaW5lcwotCXRlc3Rjb250aW51ZWRsaW5lcwotIQotCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzAyZGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQotCXRlc3QgYmFzZSBjb252ZXJ0aW9ucwotCi0JQicxMDAxMDAwCi0JUScyMTAKLQlEJzEzNgotCUgnODgKLQotCUZPT0InMTAwMTAwMEJBUgotCUZPT1EnMjEwQkFSCi0JRk9PRCcxMzZCQVIKLQlGT09IJzg4QkFSCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMzMxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDMub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQxNTBiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0hCi0KLSEJdGVzdCBiYXNlIGNvbnZlcnRpb25zCi0JdGVzdCBiYXNlIGNvbnZlcnRpb25zCi0hCi0KLSEJQicxMDAxMDAwCi0JNzIKLSEJUScyMTAKLQkxMzYKLSEJRCcxMzYKLQkxMzYKLSEJSCc4OAotCTEzNgotIQotCi0hCUZPT0InMTAwMTAwMEJBUgotCUZPT0InMTAwMTAwMEJBUgotIQlGT09RJzIxMEJBUgotCUZPT1EnMjEwQkFSCi0hCUZPT0QnMTM2QkFSCi0JRk9PRCcxMzZCQVIKLSEJRk9PSCc4OEJBUgotCUZPT0gnODhCQVIKLSEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxNDNjYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCWRvbmtleQotYmFyCS5BU1NJR05BCTAKLQkuQVdISUxFCVwmYmFyIExUIDUJCi0JSEkgQkFSIElTIFwmYmFyCi1mb28JLkFTU0lHTkEJMAotCS5BV0hJTEUJXCZmb28gTFQgMgotCUhJIEJFRk9SRQotCS5BUkVQRUFUCTIKLQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQkuQUVORFIKLQlISSBBRlRFUgotZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLQkuQUVORFcKLWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0JQU5EIElUUyBOT1cgXCZiYXIKLQkuQUVORFcKLQkuRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOGFlYjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0hCWRvbmtleQotCWRvbmtleQotIWJhcgkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZiYXIgTFQgNQkKLSEJSEkgQkFSIElTIFwmYmFyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotIQkuQUVORFcKLSEJSEkgQkFSIElTIFwmYmFyCi0JSEkgQkFSIElTIDAKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDAKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDAKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMAotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMAotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotCUFORCBJVFMgTk9XIDEKLSEJLkFXSElMRQlcJmJhciBMVCA1CQotIQlISSBCQVIgSVMgXCZiYXIKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0hCS5BRU5EVwotIQlISSBCQVIgSVMgXCZiYXIKLQlISSBCQVIgSVMgMQotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMQotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMQotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAxCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAxCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0JQU5EIElUUyBOT1cgMgotIQkuQVdISUxFCVwmYmFyIExUIDUJCi0hCUhJIEJBUiBJUyBcJmJhcgotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLSEJLkFFTkRXCi0hCUhJIEJBUiBJUyBcJmJhcgotCUhJIEJBUiBJUyAyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAyCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAyCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDIKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDIKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLQlBTkQgSVRTIE5PVyAzCi0hCS5BV0hJTEUJXCZiYXIgTFQgNQkKLSEJSEkgQkFSIElTIFwmYmFyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotIQkuQUVORFcKLSEJSEkgQkFSIElTIFwmYmFyCi0JSEkgQkFSIElTIDMKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDMKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDMKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMwotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMwotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotCUFORCBJVFMgTk9XIDQKLSEJLkFXSElMRQlcJmJhciBMVCA1CQotIQlISSBCQVIgSVMgXCZiYXIKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0hCS5BRU5EVwotIQlISSBCQVIgSVMgXCZiYXIKLQlISSBCQVIgSVMgNAotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgNAotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgNAotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSA0Ci0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSA0Ci0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0JQU5EIElUUyBOT1cgNQotIQkuQVdISUxFCVwmYmFyIExUIDUJCi0hCUhJIEJBUiBJUyBcJmJhcgotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLSEJLkFFTkRXCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvYm90aCBiL2dhcy90ZXN0c3VpdGUvbGliL2RvYm90aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNiODM3Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9kb2JvdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIS9iaW4vc2gKLQoteD0kMSA7IHNoaWZ0Ci15PSQxIDsgc2hpZnQKLQotcm0gdG1wLjAgPiAvZGV2L251bGwgMj4mMQotbG4gLXMgJHggdG1wLjAKLSQqIHRtcC4wID4gdG1wLjEKLQotcm0gdG1wLjAKLWxuIC1zICR5IHRtcC4wCi0kKiB0bXAuMCA+IHRtcC4yCi0KLXJtIHRtcC4wCi0KLWRpZmYgLWMgdG1wLjEgdG1wLjIKLWV4aXQKLQotI2VvZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9vYmpjbXAgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb29iamNtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzVjMzJkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9kb29iamNtcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBjb21wYXJlIHR3byBvYmplY3QgZmlsZXMsIGluIGRlcHRoLgotCi14PSQxCi15PSQyCi1CT1RIPSIkMSAkMiIKLQotCi0jIGlmIHRoZXkgY21wLCB3ZSdyZSBmaW5lLgotaWYgKGNtcCAkQk9USCA+IC9kZXYvbnVsbCkKLXRoZW4KLQlleGl0IDAKLWZpCi0KLSMgb3RoZXJ3aXNlLCB3ZSBtdXN0IGxvb2sgY2xvc2VyLgotaWYgKGRvYm90aCAkQk9USCBzaXplKQotdGhlbgotCWVjaG8gU2l6ZXMgb2suCi1lbHNlCi0JZWNobyBTaXplcyBkaWZmZXI6Ci0Jc2l6ZSAkQk9USAotIwlleGl0IDEKLWZpCi0KLWlmIChkb2JvdGggJEJPVEggb2JqZHVtcCAraGVhZGVyKQotdGhlbgotCWVjaG8gSGVhZGVycyBvay4KLWVsc2UKLQllY2hvIEhlYWRlciBkaWZmZXJlbmNlcy4KLSMJZXhpdCAxCi1maQotCi1pZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgK3RleHQgPiAvZGV2L251bGwpCi10aGVuCi0JZWNobyBUZXh0IG9rLgotZWxzZQotCWVjaG8gVGV4dCBkaWZmZXJlbmNlcy4KLSMJZG9ib3RoICRCT1RIIG9iamR1bXAgK3RleHQKLSMJZXhpdCAxCi1maQotCi1pZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgK2RhdGEgPiAvZGV2L251bGwpCi10aGVuCi0JZWNobyBEYXRhIG9rLgotZWxzZQotCWVjaG8gRGF0YSBkaWZmZXJlbmNlcy4KLSMJZG9ib3RoICRCT1RIIG9iamR1bXAgK2RhdGEKLSMJZXhpdCAxCi1maQotCi1pZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgK3N5bWJvbHMgPiAvZGV2L251bGwpCi10aGVuCi0JZWNobyBTeW1ib2xzIG9rLgotZWxzZQotCWVjaG8gLW4gU3ltYm9sIGRpZmZlcmVuY2VzLi4uCi0KLQlpZiAoZG9ib3RoICRCT1RIIGRvdW5zb3J0c3ltYm9scykKLQl0aGVuCi0JCWVjaG8gYnV0IHN5bWJvbHMgYXJlIHNpbXBseSBvcmRlcmVkIGRpZmZlcmVudGx5LgotIwkJZWNobyBOb3cgd2hhdCB0byBkbyBhYm91dCByZWxvY3MnPycKLSMJCWV4aXQgMQotCWVsc2UKLQkJZWNobyBhbmQgc3ltYm9scyBkaWZmZXIgaW4gY29udGVudC4KLQkJZXhpdCAxCi0JZmkKLWZpCi0KLSMgb2YgY291cnNlLCBpZiB0aGVyZSB3ZXJlIHN5bWJvbCBkaWZmcywgdGhlbiB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4ZXMKLSMgd2lsbCBiZSBvZmYuCi0KLWlmIChkb2JvdGggJEJPVEggb2JqZHVtcCAtciA+IC9kZXYvbnVsbCkKLXRoZW4KLQllY2hvIFJlbG9jIG9rLgotZWxzZQotCWVjaG8gLW4gUmVsb2MgZGlmZmVyZW5jZXMuLi4KLQotCWlmIChkb2JvdGggJEJPVEggZG91bnNvcnRyZWxvYykKLQl0aGVuCi0JCWVjaG8gYnV0IHJlbG9jcyBhcmUgc2ltcGx5IG9yZGVyZWQgZGlmZmVyZW50bHkuCi0JZWxzZQotCQllY2hvIGFuZCByZWxvY3MgZGlmZmVyIGluIGNvbnRlbnQuCi0JCWV4aXQgMQotCWZpCi1maQotCi1leGl0Ci0KLSMgZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3N0cmlwdGVzdCBiL2dhcy90ZXN0c3VpdGUvbGliL2Rvc3RyaXB0ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTUxNzAxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2Rvc3RyaXB0ZXN0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyEvYmluL3NoCi0KLXg9c3RyaXB0ZXN0Lnh4LiQkCi15PXN0cmlwdGVzdC55eS4kJAotCi1jcCAkMSAkeAotc3RyaXAgJHgKLWNwICQyICR5Ci1zdHJpcCAkeQotCi1kb29iamNtcCAkeCAkeQotZXhpdAotCi0jZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3NjhhMjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG90ZXN0CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyEvYmluL3NoCi0jIGFkIGhvYyBkZWJ1ZyB0b29sCi0KLXg9JDEKLXk9JDIKLQoteG91dD1gYmFzZW5hbWUgJHhgLnh4eC4kJAoteW91dD1gYmFzZW5hbWUgJHhgLnl5eS4kJAotCi1ta2RpciAkeG91dAotbWtkaXIgJHlvdXQKLQotZm9yIGkgaW4gKi5zCi1kbwotCWVjaG8gVGVzdGluZyAkaS4uLgotCW9iamVjdD1gYmFzZW5hbWUgJGkgLnNgLm8KLQkkeCAkaSAtbyAkeG91dC8kb2JqZWN0Ci0JJHkgJGkgLW8gJHlvdXQvJG9iamVjdAotCi0jIGlmIHRoZXkgY21wLCB3ZSdyZSBvay4gIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGxvb2sgY2xvc2VyLgotCi0JaWYgKGNtcCAkeG91dC8kb2JqZWN0ICR5b3V0LyRvYmplY3QpCi0JdGhlbgotCQllY2hvICRpIGlzIG9rLgotCWVsc2UKLQkJaWYgKGRvb2JqY21wICR4b3V0LyRvYmplY3QgJHlvdXQvJG9iamVjdCkKLQkJdGhlbgotCQkJZWNobyBOb3QgdGhlIHNhbWUgYnV0IG9iamNtcCBvay4KLQkJZWxzZQotCQkJZXhpdCAxCi0JCWZpCi0JZmkKLQotCWVjaG8KLWRvbmUKLQotcm0gLXJmICR4b3V0ICR5b3V0Ci0KLWV4aXQgMAotCi0jIEVPRgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3JlbG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZDY5NTMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBvYmpkdW1wIHRoZSByZWxvYyB0YWJsZSwgYnV0IHN0cmlwIG9mZiB0aGUgaGVhZGluZ3MgYW5kIHJlbG9jCi0jIG51bWJlcnMgYW5kIHNvcnQgdGhlIHJlc3VsdC4gIEludGVuZGVkIGZvciB1c2UgaW4gY29tcGFyaW5nIHJlbG9jCi0jIHRhYmxlcyB0aGF0IG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIuCi0KLW9iamR1bXAgK3JlbG9jICtvbWl0LXJlbG9jYXRpb24tbnVtYmVycyArb21pdC1zeW1ib2wtbnVtYmVycyAkMSBcCi0JfCBzb3J0Ci0jZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3N5bSBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDRkYTYyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zc3ltCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIS9iaW4vc2gKLSMgb2JqZHVtcCB0aGUgc3ltYm9sIHRhYmxlLCBidXQgc3RyaXAgb2ZmIHRoZSBoZWFkaW5ncyBhbmQgc3ltYm9sCi0jIG51bWJlcnMgYW5kIHNvcnQgdGhlIHJlc3VsdC4gIEludGVuZGVkIGZvciB1c2UgaW4gY29tcGFyaW5nIHN5bWJvbAotIyB0YWJsZXMgdGhhdCBtYXkgbm90IGJlIGluIHRoZSBzYW1lIG9yZGVyLgotCi1vYmpkdW1wICtzeW1ib2xzICtvbWl0LXN5bWJvbC1udW1iZXJzICQxIFwKLQl8IHNvcnQKLSNlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cCBiL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiMTE3Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGVmcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBLZW4gUmFlYnVybiAocmFlYnVybkBjeWdudXMuY29tKS4KLQotcHJvYyBnYXNfdmVyc2lvbiB7fSB7Ci0gICAgZ2xvYmFsIEFTCi0gICAgY2F0Y2ggImV4ZWMgJEFTIC12ZXJzaW9uIDwgL2Rldi9udWxsIiB0bXAKLSAgICAjIFNob3VsZCBmaW5kIGEgd2F5IHRvIGRpc2NhcmQgY29uc3RhbnQgcGFydHMsIGtlZXAgd2hhdGV2ZXIncwotICAgICMgbGVmdCwgc28gdGhlIHZlcnNpb24gc3RyaW5nIGNvdWxkIGJlIGFsbW9zdCBhbnl0aGluZyBhdCBhbGwuLi4KLSAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgJHRtcCB2ZXJzaW9uIGN5ZyBudW1iZXIKLSAgICBpZiAhW2luZm8gZXhpc3RzIG51bWJlcl0gdGhlbiB7Ci0gICAgICAgIHJldHVybiAiW3doaWNoICRBU10gKG5vIHZlcnNpb24gbnVtYmVyKVxuIgotICAgIH0KLSAgICBjbG9uZV9vdXRwdXQgIlt3aGljaCAkQVNdICRudW1iZXJcbiIKLSAgICB1bnNldCB2ZXJzaW9uCi19Ci0KLXByb2MgZ2FzX3J1biB7IHByb2cgYXNfb3B0cyByZWRpciB9IHsKLSAgICBnbG9iYWwgQVMKLSAgICBnbG9iYWwgQVNGTEFHUwotICAgIGdsb2JhbCBjb21wX291dHB1dAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgdmVyYm9zZSAiRXhlY3V0aW5nICRzcmNkaXIvbGliL3J1biAkQVMgJEFTRkxBR1MgJGFzX29wdHMgJHNyY2Rpci8kc3ViZGlyLyRwcm9nICRyZWRpciIKLSAgICBjYXRjaCAiZXhlYyAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRhc19vcHRzICRzcmNkaXIvJHN1YmRpci8kcHJvZyAkcmVkaXIiIGNvbXBfb3V0cHV0Ci0gICAgc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0gICAgdmVyYm9zZSAib3V0cHV0IHdhcyAkY29tcF9vdXRwdXQiCi0gICAgcmV0dXJuIFtsaXN0ICRjb21wX291dHB1dCAiIl07Ci19Ci0KLXByb2MgYWxsX29uZXMgeyBhcmdzIH0gewotICAgIGZvcmVhY2ggeCAkYXJncyB7IGlmIFtleHByICR4IT0xXSB7IHJldHVybiAwIH0gfQotICAgIHJldHVybiAxCi19Ci0KLXByb2MgZ2FzX3N0YXJ0IHsgcHJvZyBhc19vcHRzIH0gewotICAgIGdsb2JhbCBBUwotICAgIGdsb2JhbCBBU0ZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgc3Bhd25faWQKLQotICAgIHZlcmJvc2UgIlN0YXJ0aW5nICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkcHJvZyIgMgotICAgIGNhdGNoIHsKLQlzcGF3biAtbm9lY2hvIC1ub3R0eWNvcHkgJHNyY2Rpci9saWIvcnVuICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkc3JjZGlyLyRzdWJkaXIvJHByb2cKLSAgICB9IGZvbwotICAgIGlmICFbcmVnZXhwIHteWzAtOV0rfSAkZm9vXSB0aGVuIHsKLQlwZXJyb3IgIkNhbid0IHJ1biAkc3ViZGlyLyRwcm9nOiAkZm9vIgotICAgIH0KLX0KLQotcHJvYyBnYXNfZmluaXNoIHsgfSB7Ci0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICBjYXRjaCAiY2xvc2UiCi0gICAgY2F0Y2ggIndhaXQiCi19Ci0KLXByb2Mgd2FudF9ub19vdXRwdXQgeyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCXZlcmJvc2UgIiRjb21wX291dHB1dCIgMwotICAgIH0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAiJHRlc3RuYW1lIgotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQlmYWlsICIkdGVzdG5hbWUiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLXByb2MgZ2FzX3Rlc3Rfb2xkIHsgZmlsZSBhc19vcHRzIHRlc3RuYW1lIH0gewotICAgIGdhc19ydW4gJGZpbGUgJGFzX29wdHMgIiIKLSAgICByZXR1cm4gW3dhbnRfbm9fb3V0cHV0ICR0ZXN0bmFtZV0KLX0KLQotcHJvYyBnYXNfdGVzdCB7IGZpbGUgYXNfb3B0cyB2YXJfb3B0cyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIHNldCBpIDAKLSAgICBmb3JlYWNoIHdvcmQgJHZhcl9vcHRzIHsKLQlzZXQgaWdub3JlX3N0ZG91dCgkaSkgW3N0cmluZyBtYXRjaCAiKj4iICR3b3JkXQotCXNldCBvcHQoJGkpIFtzdHJpbmcgdHJpbSAkd29yZCB7Pn1dCi0JaW5jciBpCi0gICAgfQotICAgIHNldCBtYXggW2V4cHIgMTw8JGldCi0gICAgZm9yIHtzZXQgaSAwfSB7W2V4cHIgJGk8JG1heF19IHtpbmNyIGl9IHsKLQlzZXQgbWF5YmVfaWdub3JlX3N0ZG91dCAiIgotCXNldCBleHRyYV9vcHRzICIiCi0JZm9yIHtzZXQgYml0IDB9IHsoMTw8JGJpdCk8JG1heH0ge2luY3IgYml0fSB7Ci0JICAgIHNldCBudW0gW2V4cHIgMTw8JGJpdF0KLQkgICAgaWYgW2V4cHIgJGkmJG51bV0gdGhlbiB7Ci0JCXNldCBleHRyYV9vcHRzICIkZXh0cmFfb3B0cyAkb3B0KCRiaXQpIgotCQlpZiAkaWdub3JlX3N0ZG91dCgkYml0KSB0aGVuIHsKLQkJICAgIHNldCBtYXliZV9pZ25vcmVfc3Rkb3V0ICI+L2Rldi9udWxsIgotCQl9Ci0JICAgIH0KLQl9Ci0Jc2V0IGV4dHJhX29wdHMgW3N0cmluZyB0cmltICRleHRyYV9vcHRzXQotCWdhc19ydW4gJGZpbGUgIiRhc19vcHRzICRleHRyYV9vcHRzIiAkbWF5YmVfaWdub3JlX3N0ZG91dAotCi0JIyBTaG91bGQgSSBiZSBhYmxlIHRvIHVzZSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaGVyZT8KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleHRyYV9vcHRzXSB0aGVuIHsKLQkgICAgd2FudF9ub19vdXRwdXQgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgd2FudF9ub19vdXRwdXQgIiR0ZXN0bmFtZSAoJGV4dHJhX29wdHMpIgotCX0KLSAgICB9Ci0gICAgaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgICAgIHVuc2V0IGVycm9ySW5mbwotICAgIH0KLX0KLQotcHJvYyBnYXNfdGVzdF9pZ25vcmVfc3Rkb3V0IHsgZmlsZSBhc19vcHRzIHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotCi0gICAgZ2FzX3J1biAkZmlsZSAkYXNfb3B0cyAiPi9kZXYvbnVsbCIKLSAgICB3YW50X25vX291dHB1dCAkdGVzdG5hbWUKLX0KLQotcHJvYyBnYXNfdGVzdF9lcnJvciB7IGZpbGUgYXNfb3B0cyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIGdhc19ydW4gJGZpbGUgJGFzX29wdHMgIj4vZGV2L251bGwiCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCi0gICAgfQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlmYWlsICIkdGVzdG5hbWUiCi0gICAgfSBlbHNlIHsKLQlwYXNzICIkdGVzdG5hbWUiCi0gICAgfQotfQotCi1wcm9jIGdhc19leGl0IHt9IHt9Ci0KLXByb2MgZ2FzX2luaXQgeyBhcmdzIH0gewotICAgIGdsb2JhbCB0YXJnZXRfY3B1Ci0gICAgZ2xvYmFsIHRhcmdldF9jcHVfZmFtaWx5Ci0gICAgZ2xvYmFsIHRhcmdldF9mYW1pbHkKLSAgICBnbG9iYWwgdGFyZ2V0X3ZlbmRvcgotICAgIGdsb2JhbCB0YXJnZXRfb3MKLSAgICBnbG9iYWwgc3Rkb3B0bGlzdAotCi0gICAgY2FzZSAiJHRhcmdldF9jcHUiIGluIHsKLQkibTY4Pz8/IgkJeyBzZXQgdGFyZ2V0X2NwdV9mYW1pbHkgbTY4ayB9Ci0JImlbMzRdODYiCQl7IHNldCB0YXJnZXRfY3B1X2ZhbWlseSBpMzg2IH0KLQlkZWZhdWx0CQkJeyBzZXQgdGFyZ2V0X2NwdV9mYW1pbHkgJHRhcmdldF9jcHUgfQotICAgIH0KLQotICAgIHNldCB0YXJnZXRfZmFtaWx5ICIkdGFyZ2V0X2NwdV9mYW1pbHktJHRhcmdldF92ZW5kb3ItJHRhcmdldF9vcyIKLSAgICBzZXQgc3Rkb3B0bGlzdCAiLWE+IgotCi0gICAgaWYgIVtpc3RhcmdldCAiKi0qLSoiXSB7Ci0JcGVycm9yICJUYXJnZXQgbmFtZSBbaXN0YXJnZXRdIGlzIG5vdCBhIHRyaXBsZS4iCi0gICAgfQotICAgICMgTmVlZCB0byByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotICAgIHJldHVybgotfQotCi0KLSMgcnVuX2R1bXBfdGVzdCBGSUxFIAotIwotIyBBc3NlbWJsZSBhIC5zIGZpbGUsIHRoZW4gcnVuIHNvbWUgdXRpbGl0eSBvbiBpdCBhbmQgY2hlY2sgdGhlIG91dHB1dC4KLSMgCi0jIFRoZXJlIHNob3VsZCBiZSBhbiBhc3NlbWJseSBsYW5ndWFnZSBmaWxlIG5hbWVkIEZJTEUucyBpbiB0aGUgdGVzdAotIyBzdWl0ZSBkaXJlY3RvcnksIGFuZCBhIHBhdHRlcm4gZmlsZSBjYWxsZWQgRklMRS5kLiAgYHJ1bl9kdW1wX3Rlc3QnCi0jIHdpbGwgYXNzZW1ibGUgRklMRS5zLCBydW4gc29tZSB0b29sIGxpa2UgYG9iamR1bXAnLCBgb2JqY29weScsIG9yCi0jIGBubScgb24gdGhlIC5vIGZpbGUgdG8gcHJvZHVjZSB0ZXh0dWFsIG91dHB1dCwgYW5kIHRoZW4gYW5hbHl6ZSB0aGF0Ci0jIHdpdGggcmVnZXhwcy4gIFRoZSBGSUxFLmQgZmlsZSBzcGVjaWZpZXMgd2hhdCBwcm9ncmFtIHRvIHJ1biwgYW5kCi0jIHdoYXQgdG8gZXhwZWN0IGluIGl0cyBvdXRwdXQuCi0jCi0jIFRoZSBGSUxFLmQgZmlsZSBiZWdpbnMgd2l0aCB6ZXJvIG9yIG1vcmUgb3B0aW9uIGxpbmVzLCB3aGljaCBzcGVjaWZ5Ci0jIGZsYWdzIHRvIHBhc3MgdG8gdGhlIGFzc2VtYmxlciwgdGhlIHByb2dyYW0gdG8gcnVuIHRvIGR1bXAgdGhlCi0jIGFzc2VtYmxlcidzIG91dHB1dCwgYW5kIHRoZSBvcHRpb25zIGl0IHdhbnRzLiAgVGhlIG9wdGlvbiBsaW5lcyBoYXZlCi0jIHRoZSBzeW50YXg6Ci0jIAotIyAgICAgICAgICMgT1BUSU9OOiBWQUxVRQotIyAKLSMgT1BUSU9OIGlzIHRoZSBuYW1lIG9mIHNvbWUgb3B0aW9uLCBsaWtlICJuYW1lIiBvciAib2JqZHVtcCIsIGFuZAotIyBWQUxVRSBpcyBPUFRJT04ncyB2YWx1ZS4gIFRoZSB2YWxpZCBvcHRpb25zIGFyZSBkZXNjcmliZWQgYmVsb3cuCi0jIFdoaXRlc3BhY2UgaXMgaWdub3JlZCBldmVyeXdoZXJlLCBleGNlcHQgd2l0aGluIFZBTFVFLiAgVGhlIG9wdGlvbgotIyBsaXN0IGVuZHMgd2l0aCB0aGUgZmlyc3QgbGluZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIGFib3ZlIHN5bnRheAotIyAoaG1tLCBub3QgZ3JlYXQgZm9yIGVycm9yIGRldGVjdGlvbikuCi0jCi0jIFRoZSBpbnRlcmVzdGluZyBvcHRpb25zIGFyZToKLSMgCi0jICAgbmFtZTogVEVTVC1OQU1FCi0jCVRoZSBuYW1lIG9mIHRoaXMgdGVzdCwgcGFzc2VkIHRvIERlamFHTlUncyBgcGFzcycgYW5kIGBmYWlsJwotIyAgICAgICBjb21tYW5kcy4gIElmIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gRklMRSwgdGhlIHJvb3Qgb2YgdGhlCi0jICAgICAgIC5zIGFuZCAuZCBmaWxlcycgbmFtZXMuCi0jIAotIyAgIGFzOiBGTEFHUwotIwlXaGVuIGFzc2VtYmxpbmcgRklMRS5zLCBwYXNzIEZMQUdTIHRvIHRoZSBhc3NlbWJsZXIuCi0jIAotIyAgIFBST0c6IFBST0dSQU0tTkFNRQotIyAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byBydW4gdG8gYW5hbHl6ZSB0aGUgLm8gZmlsZSBwcm9kdWNlZAotIyAgICAgICBieSB0aGUgYXNzZW1ibGVyLiAgVGhpcyBjYW4gYmUgb21pdHRlZDsgcnVuX2R1bXBfdGVzdCB3aWxsIGd1ZXNzCi0jICAgICAgIHdoaWNoIHByb2dyYW0gdG8gcnVuIGJ5IHNlZWluZyB3aGljaCBvZiB0aGUgZmxhZ3Mgb3B0aW9ucyBiZWxvdwotIwlpcyBwcmVzZW50LgotIyAKLSMgICBvYmpkdW1wOiBGTEFHUwotIyAgIG5tOiBGTEFHUwotIyAgIG9iamNvcHk6IEZMQUdTCi0jCVVzZSB0aGUgc3BlY2lmaWVkIHByb2dyYW0gdG8gYW5hbHl6ZSB0aGUgLm8gZmlsZSwgYW5kIHBhc3MgaXQKLSMJRkxBR1MsIGluIGFkZGl0aW9uIHRvIHRoZSAubyBmaWxlIG5hbWUuCi0jCi0jICAgc291cmNlOiBTT1VSQ0UKLSMJQXNzZW1ibGUgdGhlIGZpbGUgU09VUkNFLnMuICBJZiBvbWl0dGVkLCB0aGlzIGRlZmF1bHRzIHRvIEZJTEUucy4KLSMgICAgICAgVGhpcyBpcyB1c2VmdWwgaWYgc2V2ZXJhbCAuZCBmaWxlcyB3YW50IHRvIHNoYXJlIGEgLnMgZmlsZS4KLSMKLSMgRWFjaCBvcHRpb24gbWF5IG9jY3VyIGF0IG1vc3Qgb25jZS4KLSMKLSMgQWZ0ZXIgdGhlIG9wdGlvbiBsaW5lcyBjb21lIHJlZ2V4cCBsaW5lcy4gIGBydW5fZHVtcF90ZXN0JyBjYWxscwotIyBgcmVnZXhwX2RpZmYnIHRvIGNvbXBhcmUgdGhlIG91dHB1dCBvZiB0aGUgZHVtcGluZyB0b29sIGFnYWluc3QgdGhlCi0jIHJlZ2V4cHMgaW4gRklMRS5kLiAgYHJlZ2V4cF9kaWZmJyBpcyBkZWZpbmVkIGxhdGVyIGluIHRoaXMgZmlsZTsgc2VlCi0jIGZ1cnRoZXIgY29tbWVudHMgdGhlcmUuCi0KLXByb2MgcnVuX2R1bXBfdGVzdCB7IG5hbWUgfSB7Ci0gICAgZ2xvYmFsIHN1YmRpciBzcmNkaXIKLSAgICBnbG9iYWwgT0JKRFVNUCBOTSBBUyBPQkpDT1BZCi0gICAgZ2xvYmFsIE9CSkRVTVBGTEFHUyBOTUZMQUdTIEFTRkxBR1MgT0JKQ09QWUZMQUdTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiKi8qIiAkbmFtZV0gewotCXNldCBmaWxlICRuYW1lCi0Jc2V0IG5hbWUgW2ZpbGUgdGFpbCAkbmFtZV0KLSAgICB9IGVsc2UgewotCXNldCBmaWxlICIkc3JjZGlyLyRzdWJkaXIvJG5hbWUiCi0gICAgfQotICAgIHNldCBvcHRfYXJyYXkgW3NsdXJwX29wdGlvbnMgIiR7ZmlsZX0uZCJdCi0gICAgaWYgeyAkb3B0X2FycmF5ID09IC0xIH0gewotCXBlcnJvciAiZXJyb3IgcmVhZGluZyBvcHRpb25zIGZyb20gJGZpbGUuZCIKLQl1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgc2V0IG9wdHMoYXMpIHt9Ci0gICAgc2V0IG9wdHMob2JqZHVtcCkge30KLSAgICBzZXQgb3B0cyhubSkge30KLSAgICBzZXQgb3B0cyhvYmpjb3B5KSB7fQotICAgIHNldCBvcHRzKG5hbWUpIHt9Ci0gICAgc2V0IG9wdHMoUFJPRykge30KLSAgICBzZXQgb3B0cyhzb3VyY2UpIHt9Ci0KLSAgICBmb3JlYWNoIGkgJG9wdF9hcnJheSB7Ci0Jc2V0IG9wdF9uYW1lIFtsaW5kZXggJGkgMF0KLQlzZXQgb3B0X3ZhbCBbbGluZGV4ICRpIDFdCi0JaWYgIVtpbmZvIGV4aXN0cyBvcHRzKCRvcHRfbmFtZSldIHsKLQkgICAgcGVycm9yICJ1bmtub3duIG9wdGlvbiAkb3B0X25hbWUgaW4gZmlsZSAkZmlsZS5kIgotCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkgICAgcmV0dXJuCi0JfQotCWlmIFtzdHJpbmcgbGVuZ3RoICRvcHRzKCRvcHRfbmFtZSldIHsKLQkgICAgcGVycm9yICJvcHRpb24gJG9wdF9uYW1lIG11bHRpcGx5IHNldCBpbiAkZmlsZS5kIgotCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkgICAgcmV0dXJuCi0JfQotCXNldCBvcHRzKCRvcHRfbmFtZSkgJG9wdF92YWwKLSAgICB9Ci0KLSAgICBpZiB7JG9wdHMoUFJPRykgIT0gIiJ9IHsKLQlzd2l0Y2ggLS0gJG9wdHMoUFJPRykgewotCSAgICBvYmpkdW1wCi0JCXsgc2V0IHByb2dyYW0gb2JqZHVtcCB9Ci0JICAgIG5tCi0JCXsgc2V0IHByb2dyYW0gbm0gfQotCSAgICBvYmpjb3B5Ci0JCXsgc2V0IHByb2dyYW0gb2JqY29weSB9Ci0JICAgIGRlZmF1bHQKLQkJeyBwZXJyb3IgInVucmVjb2duaXplZCBwcm9ncmFtIG9wdGlvbiAkb3B0cyhQUk9HKSBpbiAkZmlsZS5kIgotCQkgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCQkgIHJldHVybiB9Ci0JfQotICAgIH0gZWxzZSB7Ci0JIyBHdWVzcyB3aGljaCBwcm9ncmFtIHRvIHJ1biwgYnkgc2VlaW5nIHdoaWNoIG9wdGlvbiB3YXMgc3BlY2lmaWVkLgotCXNldCBwcm9ncmFtICIiCi0JZm9yZWFjaCBwIHtvYmpkdW1wIG9iamNvcHkgbm19IHsKLQkgICAgaWYgeyRvcHRzKCRwKSAhPSAiIn0gewotCQlpZiB7JHByb2dyYW0gIT0gIiJ9IHsKLQkJICAgIHBlcnJvciAiYW1iaWd1b3VzIGR1bXAgcHJvZ3JhbSBpbiAkZmlsZS5kIgotCQkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JCSAgICByZXR1cm4KLQkJfSBlbHNlIHsKLQkJICAgIHNldCBwcm9ncmFtICRwCi0JCX0KLQkgICAgfQotCX0KLQlpZiB7JHByb2dyYW0gPT0gIiJ9IHsKLQkgICAgcGVycm9yICJkdW1wIHByb2dyYW0gdW5zcGVjaWZpZWQgaW4gJGZpbGUuZCIKLQkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBzZXQgcHJvZ29wdHMxICRvcHRzKCRwcm9ncmFtKQotICAgIGV2YWwgc2V0IHByb2dvcHRzIFwkW3N0cmluZyB0b3VwcGVyICRwcm9ncmFtXUZMQUdTCi0gICAgZXZhbCBzZXQgYmluYXJ5IFwkW3N0cmluZyB0b3VwcGVyICRwcm9ncmFtXQotICAgIGlmIHsgJG9wdHMobmFtZSkgPT0gIiIgfSB7Ci0Jc2V0IHRlc3RuYW1lICIkc3ViZGlyLyRuYW1lIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHRlc3RuYW1lICRvcHRzKG5hbWUpCi0gICAgfQotCi0gICAgaWYgeyAkb3B0cyhzb3VyY2UpID09ICIiIH0gewotCXNldCBzb3VyY2VmaWxlICR7ZmlsZX0ucwotICAgIH0gZWxzZSB7Ci0Jc2V0IHNvdXJjZWZpbGUgJHNyY2Rpci8kc3ViZGlyLyRvcHRzKHNvdXJjZSkKLSAgICB9Ci0KLSAgICBzZW5kX2xvZyAiJEFTICRBU0ZMQUdTICRvcHRzKGFzKSAtbyBkdW1wLm8gJHNvdXJjZWZpbGVcbiIKLSAgICBjYXRjaCAiZXhlYyAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRvcHRzKGFzKSAtbyBkdW1wLm8gJHNvdXJjZWZpbGUiIGNvbXBfb3V0cHV0Ci0gICAgc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQl2ZXJib3NlICIkY29tcF9vdXRwdXQiIDMKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIGlmIHsgW3doaWNoICRiaW5hcnldID09IDAgfSB7Ci0JdW50ZXN0ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyAkcHJvZ29wdHMxID09ICIiIH0geyBzZXQgJHByb2dvcHRzMSAiLXIiIH0KLSAgICB2ZXJib3NlICJydW5uaW5nICRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEiIDMKLQotICAgICMgT2JqY29weSwgdW5saWtlIHRoZSBvdGhlciB0d28sIHdvbid0IHNlbmQgaXRzIG91dHB1dCB0byBzdGRvdXQsCi0gICAgIyBzbyB3ZSBoYXZlIHRvIHJ1biBpdCBzcGVjaWFsbHkuCi0gICAgaWYgeyAkcHJvZ3JhbSA9PSAib2JqY29weSIgfSB7Ci0Jc2VuZF9sb2cgIiRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vIGR1bXAub3V0XG4iCi0JY2F0Y2ggImV4ZWMgJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gZHVtcC5vdXQiIGNvbXBfb3V0cHV0Ci0Jc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQkgICAgc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCSAgICBmYWlsICR0ZXN0bmFtZQotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gPiBkdW1wLm91dFxuIgotCWNhdGNoICJleGVjICRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vID4gZHVtcC5vdXQiIGNvbXBfb3V0cHV0Ci0Jc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQkgICAgc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCSAgICBmYWlsICR0ZXN0bmFtZQotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgdmVyYm9zZV9ldmFsIHtbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXX0gMwotICAgIGlmIHsgW3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0uZCJdIH0gdGhlbiB7Ci0JZmFpbCAkdGVzdG5hbWUKLQl2ZXJib3NlICJvdXRwdXQgaXMgW2ZpbGVfY29udGVudHMgImR1bXAub3V0Il0iIDIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi1wcm9jIHNsdXJwX29wdGlvbnMgeyBmaWxlIH0gewotICAgIGlmIFtjYXRjaCB7IHNldCBmIFtvcGVuICRmaWxlIHJdIH0geF0gewotCSNwZXJyb3IgImNvdWxkbid0IG9wZW4gYCRmaWxlJzogJHgiCi0JcGVycm9yICIkeCIKLQlyZXR1cm4gLTEKLSAgICB9Ci0gICAgc2V0IG9wdF9hcnJheSB7fQotICAgICMgd2hpdGVzcGFjZSBleHByZXNzaW9uCi0gICAgc2V0IHdzICB7WyAJXSp9Ci0gICAgc2V0IG53cyB7W14gCV0qfQotICAgICMgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIGFueXdoZXJlIGV4Y2VwdCB3aXRoaW4gdGhlIG9wdGlvbnMgbGlzdDsKLSAgICAjIG9wdGlvbiBuYW1lcyBhcmUgYWxwaGFiZXRpYyBvbmx5Ci0gICAgc2V0IHBhdCAiXiMke3dzfShcW2EtekEtWlxdKikkd3M6JHt3c30oLiopJHdzXCQiCi0gICAgd2hpbGUgeyBbZ2V0cyAkZiBsaW5lXSAhPSAtMSB9IHsKLQlzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCi0JIyBXaGl0ZXNwYWNlIGhlcmUgaXMgc3BhY2UtdGFiLgotCWlmIFtyZWdleHAgJHBhdCAkbGluZSB4eHggb3B0X25hbWUgb3B0X3ZhbF0gewotCSAgICAjIG1hdGNoIQotCSAgICBsYXBwZW5kIG9wdF9hcnJheSBbbGlzdCAkb3B0X25hbWUgJG9wdF92YWxdCi0JfSBlbHNlIHsKLQkgICAgYnJlYWsKLQl9Ci0gICAgfQotICAgIGNsb3NlICRmCi0gICAgcmV0dXJuICRvcHRfYXJyYXkKLX0KLQotcHJvYyBvYmpkdW1wIHsgb3B0cyB9IHsKLSAgICBnbG9iYWwgT0JKRFVNUAotICAgIGdsb2JhbCBjb21wX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIGNhdGNoICJleGVjICRPQkpEVU1QICRvcHRzIiBjb21wX291dHB1dAotICAgIHNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQotICAgIHZlcmJvc2UgIm9iamR1bXAgb3V0cHV0PSRjb21wX291dHB1dFxuIiAzCi19Ci0KLXByb2Mgb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgeyBwcm9nIG9wdHMgfSB7Ci0gICAgZ2xvYmFsIE9CSkRVTVAKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICB2ZXJib3NlICJTdGFydGluZyAkT0JKRFVNUCAkb3B0cyAkcHJvZyIgMgotICAgIGNhdGNoIHsKLQlzcGF3biAtbm9lY2hvIC1ub3R0eWluaXQgJHNyY2Rpci9saWIvcnVuICRPQkpEVU1QICRvcHRzICRwcm9nCi0gICAgfSBmb28KLSAgICBpZiAhW3JlZ2V4cCB7XlswLTldK30gJGZvb10gdGhlbiB7Ci0JcGVycm9yICJDYW4ndCBydW4gJHByb2c6ICRmb28iCi0gICAgfQotfQotCi1wcm9jIG9iamR1bXBfZmluaXNoIHsgfSB7Ci0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICBjYXRjaCAiY2xvc2UiCi0gICAgY2F0Y2ggIndhaXQiCi19Ci0KLSMgRGVmYXVsdCB0aW1lb3V0IGlzIDEwIHNlY29uZHMsIGxvc2VzIG9uIGEgc2xvdyBtYWNoaW5lLiAgQnV0IHNvbWUKLSMgY29uZmlndXJhdGlvbnMgb2YgZGVqYWdudSBtYXkgb3ZlcnJpZGUgaXQuCi1pZiB7JHRpbWVvdXQ8MTIwfSB0aGVuIHsgc2V0IHRpbWVvdXQgMTIwIH0KLQotZXhwZWN0X2FmdGVyIC1pIHsKLSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXQiIH0KLSAgICAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIgl7IHBlcnJvciAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIiB9Ci0gICAgYnVmZmVyX2Z1bGwJCQl7IHBlcnJvciAiYnVmZmVyIGZ1bGwiIH0KLSAgICBlb2YJCQkJeyBwZXJyb3IgImVvZiIgfQotfQotCi0jIHJlZ2V4cF9kaWZmLCBiYXNlZCBvbiBzaW1wbGVfZGlmZiB0YWtlbiBmcm9tIGxkIHRlc3Qgc3VpdGUKLSMJY29tcGFyZXMgdHdvIGZpbGVzIGxpbmUtYnktbGluZQotIwlmaWxlMSBjb250YWlucyBzdHJpbmdzLCBmaWxlMiBjb250YWlucyByZWdleHBzIGFuZCAjLWNvbW1lbnRzCi0jCWJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkIGluIGVpdGhlciBmaWxlCi0jCXJldHVybnMgbm9uLXplcm8gaWYgZGlmZmVyZW5jZXMgZXhpc3QKLSMKLXByb2MgcmVnZXhwX2RpZmYgeyBmaWxlXzEgZmlsZV8yIH0gewotCi0gICAgc2V0IGVvZiAtMQotICAgIHNldCBlbmRfMSAwCi0gICAgc2V0IGVuZF8yIDAKLSAgICBzZXQgZGlmZmVyZW5jZXMgMAotICAgIHNldCBkaWZmX3Bhc3MgMAotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzFdIHRoZW4gewotCXNldCBmaWxlX2EgW29wZW4gJGZpbGVfMSByXQotICAgIH0gZWxzZSB7Ci0Jd2FybmluZyAiJGZpbGVfMSBkb2Vzbid0IGV4aXN0IgotCXJldHVybiAxCi0gICAgfQotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzJdIHRoZW4gewotCXNldCBmaWxlX2IgW29wZW4gJGZpbGVfMiByXQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJGZpbGVfMiBkb2Vzbid0IGV4aXN0IgotCWNsb3NlICRmaWxlX2EKLQlyZXR1cm4gMQotICAgIH0KLQotICAgIHZlcmJvc2UgIiBSZWdleHAtZGlmZidpbmc6ICRmaWxlXzEgJGZpbGVfMiIgMgotCi0gICAgd2hpbGUgeyAxIH0gewotCXNldCBsaW5lX2EgIiIKLQlzZXQgbGluZV9iICIiCi0Jd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9hXSA9PSAwIH0gewotCSAgICBpZiB7IFtnZXRzICRmaWxlX2EgbGluZV9hXSA9PSAkZW9mIH0gewotCQlzZXQgZW5kXzEgMQotCQlicmVhawotCSAgICB9Ci0JfQotCXdoaWxlIHsgW3N0cmluZyBsZW5ndGggJGxpbmVfYl0gPT0gMCB8fCBbc3RyaW5nIG1hdGNoICIjKiIgJGxpbmVfYl0gfSB7Ci0JICAgIGlmIFsgc3RyaW5nIG1hdGNoICIjcGFzcyIgJGxpbmVfYiBdIHsKLQkJc2V0IGVuZF8yIDEKLQkJc2V0IGRpZmZfcGFzcyAxCi0JCWJyZWFrCi0JICAgIH0gZWxzZWlmIFsgc3RyaW5nIG1hdGNoICIjLi4uIiAkbGluZV9iIF0gewotCQlpZiB7IFtnZXRzICRmaWxlX2IgbGluZV9iXSA9PSAkZW9mIH0gewotCQkgICAgc2V0IGVuZF8yIDEKLQkJICAgIGJyZWFrCi0JCX0KLQkJdmVyYm9zZSAibG9va2luZyBmb3IgXCJeJGxpbmVfYiRcIiIgMwotCQl3aGlsZSB7ICFbcmVnZXhwICJeJGxpbmVfYiQiICIkbGluZV9hIl0gfSB7Ci0JCSAgICB2ZXJib3NlICJza2lwcGluZyAgICBcIiRsaW5lX2FcIiIgMwotCQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9hIGxpbmVfYV0gPT0gJGVvZiB9IHsKLQkJCXNldCBlbmRfMSAxCi0JCQlicmVhawotCQkgICAgfQotCQl9Ci0JCWJyZWFrCi0JICAgIH0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9iIGxpbmVfYl0gPT0gJGVvZiB9IHsKLQkJc2V0IGVuZF8yIDEKLQkJYnJlYWsKLQkgICAgfQotCX0KLQotICAgICAgICBpZiB7ICRkaWZmX3Bhc3MgfSB7IAotICAgICAgICAgICAgYnJlYWsgCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xICYmICRlbmRfMiB9IHsgCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMSB9IHsKLSAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xIiAzCi0gICAgICAgICAgICBzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzIgfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIGxpbmVzIGluICRmaWxlXzEgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9hJFwiXG5FT0YgZnJvbSAkZmlsZV8yXG4iIDMKLSAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVyYm9zZSAicmVnZXhwIFwiXiRsaW5lX2IkXCJcbmxpbmUgICBcIiRsaW5lX2FcIiIgMwotICAgICAgICAgICAgaWYgIVtyZWdleHAgIl4kbGluZV9iJCIgIiRsaW5lX2EiXSB7Ci0JCXNlbmRfbG9nICJyZWdleHBfZGlmZiBtYXRjaCBmYWlsdXJlXG4iCi0JCXNlbmRfbG9nICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiXG4iCi0JCXNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiB7ICRkaWZmZXJlbmNlcyA9PSAwICYmICEkZGlmZl9wYXNzICYmIFtlb2YgJGZpbGVfYV0gIT0gW2VvZiAkZmlsZV9iXSB9IHsKLQlzZW5kX2xvZyAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHNcbiIKLQl2ZXJib3NlICIkZmlsZV8xIGFuZCAkZmlsZV8yIGFyZSBkaWZmZXJlbnQgbGVuZ3RocyIgMwotCXNldCBkaWZmZXJlbmNlcyAxCi0gICAgfQotCi0gICAgY2xvc2UgJGZpbGVfYQotICAgIGNsb3NlICRmaWxlX2IKLQotICAgIHJldHVybiAkZGlmZmVyZW5jZXMKLX0KLQotcHJvYyBmaWxlX2NvbnRlbnRzIHsgZmlsZW5hbWUgfSB7Ci0gICAgc2V0IGZpbGUgW29wZW4gJGZpbGVuYW1lIHJdCi0gICAgc2V0IGNvbnRlbnRzIFtyZWFkICRmaWxlXQotICAgIGNsb3NlICRmaWxlCi0gICAgcmV0dXJuICRjb250ZW50cwotfQotCi1wcm9jIHZlcmJvc2VfZXZhbCB7IGV4cHIgeyBsZXZlbCAxIH0gfSB7Ci0gICAgZ2xvYmFsIHZlcmJvc2UKLSAgICBpZiAkdmVyYm9zZT4kbGV2ZWwgdGhlbiB7IGV2YWwgdmVyYm9zZSAiJGV4cHIiICRsZXZlbCB9Ci19Ci0KLSMgVGhpcyBkZWZpbml0aW9uIGlzIHRha2VuIGZyb20gYW4gdW5yZWxlYXNlZCB2ZXJzaW9uIG9mIERlamFHbnUuICBPbmNlCi0jIHRoYXQgdmVyc2lvbiBnZXRzIHJlbGVhc2VkLCBhbmQgaGFzIGJlZW4gb3V0IGluIHRoZSB3b3JsZCBmb3IgYSBmZXcKLSMgbW9udGhzIGF0IGxlYXN0LCBpdCBtYXkgYmUgc2FmZSB0byBkZWxldGUgdGhpcyBjb3B5LgotaWYgIVtzdHJpbmcgbGVuZ3RoIFtpbmZvIHByb2MgcHJ1bmVfd2FybmluZ3NdXSB7Ci0gICAgIwotICAgICMgcHJ1bmVfd2FybmluZ3MgLS0gZGVsZXRlIHZhcmlvdXMgc3lzdGVtIHZlcmJvc2l0aWVzIGZyb20gVEVYVC4KLSAgICAjCi0gICAgIyBBbiBleGFtcGxlIGlzOgotICAgICMgbGQuc286IHdhcm5pbmc6IC91c3IvbGliL2xpYmMuc28uMS44LjEgaGFzIG9sZGVyIHJldmlzaW9uIHRoYW4gZXhwZWN0ZWQgOQotICAgICMKLSAgICAjIFNpdGVzIHdpdGggcGFydGljdWxhciB2ZXJib3NlIG9zJ3MgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBpbiBzaXRlLmV4cC4KLSAgICAjCi0gICAgcHJvYyBwcnVuZV93YXJuaW5ncyB7IHRleHQgfSB7Ci0JIyBUaGlzIGlzIGZyb20gc3VuNCdzLiAgRG8gaXQgZm9yIGFsbCBtYWNoaW5lcyBmb3Igbm93LgotCSMgVGhlICJcXDEiIGlzIHRvIHRyeSB0byBwcmVzZXJ2ZSBhICJcbiIgYnV0IG9ubHkgaWYgbmVjZXNzYXJ5LgotCXJlZ3N1YiAtYWxsICIoXnxcbikobGQuc286IHdhcm5pbmc6XFteXG5cXSpcbj8pKyIgJHRleHQgIlxcMSIgdGV4dAotCi0JIyBJdCBtaWdodCBiZSB0ZW1wdGluZyB0byBnZXQgY2FycmllZCBhd2F5IGFuZCBkZWxldGUgYmxhbmsgbGluZXMsIGV0Yy4KLQkjIEp1c3QgZGVsZXRlICpleGFjdGx5KiB3aGF0IHdlJ3JlIGFzayB0bywgYW5kIHRoYXQncyBpdC4KLQlyZXR1cm4gJHRleHQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGcuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRnLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmN2YzMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGcuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyBEZWZpbmUgZ2FzIGNhbGxiYWNrcyBmb3IgZGcuZXhwLgotCi1sb2FkX2xpYiBkZy5leHAKLQotIyBUaGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgc3RpbGwgaW4gYSBiaXQgb2YgZmx1eC4KLSMgSXQgc2hvdWxkIGJlIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gYXNzZW1ibGUsIGxpbmssIGFuZCBydW4gYSBmaWxlCi0jIGJ1dCB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCB0aGF0LiAgQXNzZW1ibGVyIHRlc3RjYXNlcyBhcmVuJ3QgdXN1YWxseQotIyB0aGF0IGVsYWJvcmF0ZSBhbnl3YXkuICA6LSkKLQotcHJvYyBnYXMtZGctdGVzdCB7IHByb2cgZG9fd2hhdCB0b29sX2ZsYWdzIH0gewotICAgICMgRklYTUU6IHRoZSBnYXMgdGVzdHN1aXRlIGRvZXNuJ3QgZGVmaW5lIHRtcGRpci4gIFVzZSBvdXRkaXI/Ci0gICAgc2V0IG91dHB1dF9maWxlICIuL2Eub3V0IgotCi0gICAgc3dpdGNoICRkb193aGF0IHsKLQkicHJlcHJvY2VzcyIgewotCX0KLQkiYXNzZW1ibGUiIHsKLQl9Ci0JImxpbmsiIHsKLQl9Ci0JInJ1biIgewotCSAgICAjIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2UgY2FyZSBpZiBhbiBleGVjdXRhYmxlIHdhcwotCSAgICAjIGNyZWF0ZWQgb3Igbm90LiAgSWYgaXQgd2FzLCBkZy5leHAgd2lsbCB0cnkgdG8gcnVuIGl0LgotCSAgICBjYXRjaCAiZXhlYyBybSAtZiAkb3V0cHV0X2ZpbGUiCi0JfQotCWRlZmF1bHQgewotCSAgICBwZXJyb3IgIiRkb193aGF0OiBub3QgYSB2YWxpZCBkZy1kbyBrZXl3b3JkIgotCSAgICByZXR1cm4gIiIKLQl9Ci0gICAgfQotCi0gICAgIyBnYXNfc3RhcnQgcHJlcGVuZHMgJHNyY2Rpci8kc3ViZGlyIHNvIHdlIG11c3QgcmVtb3ZlIGl0IGZyb20gUFJPRwotICAgICMgaWYgcHJlc2VudC4gIEZpcnN0IHJlbW92ZSBleHRyYW5lb3VzIC8vJ3MuCi0gICAgZ2xvYmFsIHNyY2RpciBzdWJkaXIKLSAgICBzZXQgZGlyICIkc3JjZGlyLyRzdWJkaXIiCi0gICAgcmVnc3ViIC1hbGwgIi8vIiAkZGlyICIvIiBkaXIKLSAgICByZWdzdWIgLWFsbCAiLy8iICRwcm9nICIvIiBwcm9nCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiJGRpci8qIiAkcHJvZ10gewotCXJlZ3N1YiAiJGRpciIgJHByb2cgIiIgcHJvZwotICAgIH0KLQotICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGdhc19zdGFydCBidXQgaXQgZG9lc24ndCBzZXQgY29tcF9vdXRwdXQuCi0gICAgcmV0dXJuIFtnYXNfcnVuICRwcm9nICR0b29sX2ZsYWdzICIiXQotfQotCi1wcm9jIGdhcy1kZy1wcnVuZSB7IHN5c3RlbSB0ZXh0IH0gewotICAgICNzZW5kX3VzZXIgIkJlZm9yZTokdGV4dFxuIgotICAgIHJlZ3N1YiAtYWxsICIoXnxcbilcW15cblxdKjogQXNzZW1ibGVyIG1lc3NhZ2VzOlxbXlxuXF0qIiAkdGV4dCAiIiB0ZXh0Ci0gICAgcmVnc3ViIC1hbGwgIihefFxuKVxbXlxuXF0qOiBFbmQgb2YgZmlsZSBub3QgYXQgZW5kXFteXG5cXSpOZXdsaW5lIGluc2VydGVkLiIgJHRleHQgIiIgdGV4dAotICAgICNzZW5kX3VzZXIgIkFmdGVyOiR0ZXh0XG4iCi0KLSAgICByZXR1cm4gJHRleHQKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL3J1biBiL2dhcy90ZXN0c3VpdGUvbGliL3J1bgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDQxNTBmOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9ydW4KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXZhbCBleGVjICRACmRpZmYgLS1naXQgYS9nYXMvdm1zY29uZi5zaCBiL2dhcy92bXNjb25mLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ1MzhhLi4wMDAwMDAwCi0tLSBhL2dhcy92bXNjb25mLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1jYXQgPDwgJ0VPRicKLSQhbWFrZS1nYXMuY29tCi0kISBTZXQgdGhlIGRlZiBkaXIgdG8gcHJvcGVyIHBsYWNlIGZvciB1c2UgaW4gYmF0Y2guIFdvcmtzIGZvciBpbnRlcmFjdGl2ZSB0by4KLSRmbG5tID0gZiRlbnZpcm9tZW50KCJQUk9DRURVUkUiKSAgICAgISBnZXQgY3VycmVudCBwcm9jZWR1cmUgbmFtZQotJHNldCBkZWZhdWx0ICdmJHBhcnNlKGZsbm0sLCwiREVWSUNFIiknJ2YkcGFyc2UoZmxubSwsLCJESVJFQ1RPUlkiKScKLSR2ID0gJ2YkdmVyaWZ5KDApJwotJCEKLSQhCUNvbW1hbmQgZmlsZSB0byBidWlsZCBhIEdOVSBhc3NlbWJsZXIgb24gVk1TCi0kIQotJCEJSWYgeW91IGFyZSB1c2luZyBhIHZlcnNpb24gb2YgR0NDIHRoYXQgc3VwcG9ydHMgZ2xvYmFsIGNvbnN0YW50cwotJCEJeW91IHNob3VsZCByZW1vdmUgdGhlIGRlZmluZT0iY29uc3Q9IiBmcm9tIHRoZSBnY2MgbGluZXMuCi0kIQotJCEJQ2F1dGlvbjogIFZlcnNpb25zIDEuMzguMSBhbmQgZWFybGllciBoYWQgYSBidWcgaW4gdGhlIGhhbmRsaW5nIG9mCi0kIQlzb21lIHN0YXRpYyBjb25zdGFudHMuIElmIHlvdSBhcmUgdXNpbmcgc3VjaCBhIHZlcnNpb24gb2YgdGhlCi0kIQlhc3NlbWJsZXIsIGFuZCB5b3Ugd2lzaCB0byBjb21waWxlIHdpdGhvdXQgdGhlICJjb25zdD0iIGhhY2ssCi0kIQl5b3Ugc2hvdWxkIGZpcnN0IGJ1aWxkIHRoaXMgdmVyc2lvbiAqd2l0aCogdGhlICJjb25zdD0iCi0kIQlkZWZpbml0aW9uLCBhbmQgdGhlbiB1c2UgdGhhdCBhc3NlbWJsZXIgdG8gcmVidWlsZCBpdCB3aXRob3V0IHRoZQotJCEJImNvbnN0PSIgZGVmaW5pdGlvbi4gIEZhaWx1cmUgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBhc3NlbWJsZXIKLSQhCXRoYXQgd2lsbCBtdW5nIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLSQhCi0kIQlOb3RlOiBUaGUgdmVyc2lvbiBvZiBnYXMgc2hpcHBlZCBvbiB0aGUgR0NDIFZNUyB0YXBlcyBoYXMgYmVlbiBwYXRjaGVkCi0kIQl0byBmaXggdGhlIGFib3ZlIG1lbnRpb25lZCBidWcuCi0kIQotJAkhVGhlIGdjYy12bXMgZHJpdmVyIHdhcyBtb2RpZmllZCB0byB1c2UgYC0xJyBxdWl0ZSBzb21lIHRpbWUgYWdvLAotJAkhc28gZG9uJ3QgZWNobyB0aGlzIHRleHQgYW55IG1vcmUuLi4KLSQgIXdyaXRlIHN5cyRvdXRwdXQgIklmIHRoaXMgYXNzZW1ibGVyIGlzIGdvaW5nIHRvIGJlIHVzZWQgd2l0aCBHQ0MgMS5uLCB5b3UiCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJuZWVkIHRvIG1vZGlmeSB0aGUgZHJpdmVyIHRvIHN1cHBseSB0aGUgLTEgc3dpdGNoIHRvIGdhcy4iCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2Ugb2YgYSBzbWFsbCBjaGFuZ2UgaW4gaG93IGdsb2JhbCIKLSQgIXdyaXRlIHN5cyRvdXRwdXQgImNvbnN0YW50IHZhcmlhYmxlcyBhcmUgaGFuZGxlZC4gIEZhaWx1cmUgdG8gaW5jbHVkZSB0aGlzIgotJCAhd3JpdGUgc3lzJG91dHB1dCAid2lsbCByZXN1bHQgaW4gbGlua2VyIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgbWlzbWF0Y2hlZAotJCAhd3JpdGUgc3lzJG91dHB1dCAicHNlY3QgYXR0cmlidXRlcy4iCi0kIQotJCBnYXNfaG9zdD0idm1zIgotJCBhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkJISB2YXg9PTEsIGFscGhhPT0yCi0kIGFyY2ggPSBmJGVsZW1lbnQoYXJjaF9pbmR4LCJ8IiwifFZBWHxBbHBoYXwiKQotJCBpZiBhcmNoLmVxcy4iVkFYIgotJCB0aGVuCi0kICBjcHVfdHlwZT0idmF4IgotJCAgb2JqX2Zvcm1hdD0idm1zIgotJCAgYXRvZj0idmF4IgotJCBlbHNlCi0kICBjcHVfdHlwZT0iYWxwaGEiCi0kICBvYmpfZm9ybWF0PSJldmF4IgotJCAgYXRvZj0iaWVlZSIKLSQgZW5kaWYKLSQgZW11bGF0aW9uPSJnZW5lcmljIgotJCEKLSQJQ09QWQk9ICJjb3B5L25vTG9nIgotJCEKLSQgQ19ERUZTIDo9IiIiVk1TIiIiCi0kISBDX0RFRlMgOj0iIiJWTVMiIiIsIiIiY29uc3Q9IiIiCi0kIENfSU5DTFVERVMJPSAiL0luY2x1ZGU9KFtdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLS5pbmNsdWRlLmFvdXRdKSIKLSQgQ19GTEFHUwk9ICIvbm9WZXJib3NlL0RlYnVnIiArIGNfaW5jbHVkZXMKLSQhCi0kIQotJCBvbiBlcnJvciB0aGVuICBnb3RvIGJhaWwKLSQgaWYgZiRzZWFyY2goIlstLmxpYmliZXJ0eV1saWJlcnR5Lm9sYiIpLmVxcy4iIgotJCB0aGVuCUBbLS5saWJpYmVydHlddm1zYnVpbGQuY29tCi0kCXdyaXRlIHN5cyRvdXRwdXQgIk5vdyBidWlsZGluZyBnYXMuIgotJCBlbmRpZgotJCBpZiAiJydwMSciIC5lcXMuICJMSU5LIiB0aGVuIGdvdG8gTGluawotJCEKLSQhICBUaGlzIGhlbHBzIGdjYyAxLm5uIGZpbmQgdGhlIGFvdXQvKiBmaWxlcy4KLSQhCi0kIGFvdXRfZGV2ID0gZiRwYXJzZShmbG5tLCwsIkRFVklDRSIpCi0kIHRtcCA9IGFvdXRfZGV2IC0gIjoiCi0kaWYgZiR0cm5sbm0odG1wKS5uZXMuIiIgdGhlbiBhb3V0X2RldiA9IGYkdHJubG5tKHRtcCkKLSQgYW91dF9kaXIgPSBhb3V0X2RlditmJHBhcnNlKGZsbm0sLCwiRElSRUNUT1JZIiknIC0KLQktICJHQVNdIiArICJJTkNMVURFLkFPVVQuXSIgLSAiXVsiCi0kYXNzaWduICdhb3V0X2RpcicgYW91dC90cmFuPWNvbmMKLSQgb3Bjb2RlX2RpciA9IGFvdXRfZGV2K2YkcGFyc2UoZmxubSwsLCJESVJFQ1RPUlkiKScgLQotCS0gIkdBU10iICsgIklOQ0xVREUuT1BDT0RFLl0iIC0gIl1bIgotJGFzc2lnbiAnb3Bjb2RlX2Rpcicgb3Bjb2RlL3RyYW49Y29uYwotJCEKLSQgc2V0IHZlcmlmeQotJCEKLSQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W110Yy0nY3B1X3R5cGUnLm9iaiBbLmNvbmZpZ110Yy0nY3B1X3R5cGUnLmMKLSQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W11vYmotJ29ial9mb3JtYXQnLm9iaiBbLmNvbmZpZ11vYmotJ29ial9mb3JtYXQnLmMKLSQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W11hdG9mLSdhdG9mJy5vYmogWy5jb25maWddYXRvZi0nYXRvZicuYwotRU9GCi0KLWNmaWxlcz0iYGVjaG8gJCogfCBzZWQgLWUgJ3MvXC5vLy5jL2cnIC1lICdzIS4uL1woW14gL10qXCkvXChbXiAvXSpcLmNcKSFbLS5cMV1cMiFnJ2AiCi0KLWZvciBjZmlsZSBpbiAkY2ZpbGVzIDsgZG8KLSAgY2FzZSAkY2ZpbGUgaW4KLSAgICAiWy0uIiopCi0JYmFzZT1gZWNobyAkY2ZpbGUgfCBzZWQgLWUgJ3MvXFsuKlxdLy8nIC1lICdzL1wuYyQvLydgCi0JZWNobyAiXCQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W10kYmFzZS5vYmogJGNmaWxlIgotCTs7Ci0gICAgKikKLQllY2hvICJcJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpICRjZmlsZSIKLQk7OwotICBlc2FjCi1kb25lCi0KLWNhdCA8PCAnRU9GJwotJGxpbms6Ci0kISdmJHZlcmlmeSgwKScKLSQgaWYgZiR0cm5sbm0oIklGSUxFJCIpLm5lcy4iIiB0aGVuICBjbG9zZS9ub0xvZyBpZmlsZSQKLSQgY3JlYXRlIGdjYy1hcy5vcHQKLSEKLSEJTGlua2VyIG9wdGlvbnMgZmlsZSBmb3IgR05VIGFzc2VtYmxlcgotIQotJCBvcGVuL0FwcGVuZCBpZmlsZSQgZ2NjLWFzLm9wdAotJCB3cml0ZSBpZmlsZSQgInRjLScnY3B1X3R5cGUnLm9iaiIKLSQgd3JpdGUgaWZpbGUkICJvYmotJydvYmpfZm9ybWF0Jy5vYmoiCi0kIHdyaXRlIGlmaWxlJCAiYXRvZi0nJ2F0b2YnLm9iaiIKLSQgQ09QWSBzeXMkaW5wdXQ6IGlmaWxlJDoKLUVPRgotCi1mb3Igb2JqIGluICQqIDsgZG8KLSAgIyBDaGFuZ2UgImZvby5vIiBpbnRvICJmb28ub2JqIi4KLSAgZWNobyAke29ian1iaiwtIHwgc2VkICdzIS4qLyEhZycKLWRvbmUKLQotY2F0IDw8ICdFT0YnCi1bLS5saWJpYmVydHldbGliZXJ0eS5vbGIvTGliCi1nbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL0xpYixzeXMkbGlicmFyeTp2YXhjcnRsLm9sYi9MaWIKLSEgVGVsbCBsaW5rZXIgZXhhY3RseSB3aGF0IHBzZWN0IGF0dHJpYnV0ZXMgd2Ugd2FudCAtLSBtYXRjaCBWQVhDUlRMLgotcHNlY3RfYXR0cj1FTlZJUk9OLGxvbmcscGljLG92cixyZWwsZ2JsLG5vc2hyLG5vZXhlLHJkLHdydAotJCBjbG9zZSBpZmlsZSQKLSQgc2V0IHZlcmlmeT0oUHJvYyxub0ltYWcpCi0kIGxpbmsvbm9NYXAvRXhlYz1nY2MtYXMuZXhlIGdjYy1hcy5vcHQvT3B0LHZlcnNpb24ub3B0L09wdAotJCEKLSRiYWlsOiBleGl0ICRzdGF0dXMgKyAwKmYkdmVyaWZ5KHYpCSEnZiR2ZXJpZnkoMCknCi1FT0YKZGlmZiAtLWdpdCBhL2dhcy93cml0ZS5jIGIvZ2FzL3dyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzODZlY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3dyaXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODc3ICswLDAgQEAKLS8qIHdyaXRlLmMgLSBlbWl0IC5vIGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk4NiwgODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHRoaW5nIHNob3VsZCBiZSBzZXQgdXAgdG8gZG8gYnl0ZW9yZGVyaW5nIGNvcnJlY3RseS4gIEJ1dC4uLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgIm91dHB1dC1maWxlLmgiCi0KLS8qIFRoaXMgbG9va3MgbGlrZSBhIGdvb2QgaWRlYS4gIExldCdzIHRyeSB0dXJuaW5nIGl0IG9uIGFsd2F5cywgZm9yIG5vdy4gICovCi0jdW5kZWYgIEJGRF9GQVNUX1NFQ1RJT05fRklMTAotI2RlZmluZSBCRkRfRkFTVF9TRUNUSU9OX0ZJTEwKLQotLyogVGhlIE5PUF9PUENPREUgaXMgZm9yIHRoZSBhbGlnbm1lbnQgZmlsbCB2YWx1ZS4gIEZpbGwgaXQgd2l0aCBhIG5vcAotICAgaW5zdHJ1Y3Rpb24gc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIGRvZXMgbm90IGNob2tlIG9uIGl0LiAgKi8KLSNpZm5kZWYgTk9QX09QQ09ERQotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDAKLSNlbmRpZgotCi0jaWZuZGVmIFRDX0FESlVTVF9SRUxPQ19DT1VOVAotI2RlZmluZSBUQ19BREpVU1RfUkVMT0NfQ09VTlQoRklYUCxDT1VOVCkKLSNlbmRpZgotCi0jaWZuZGVmIFRDX0ZPUkNFX1JFTE9DQVRJT04KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKSAwCi0jZW5kaWYKLQotI2lmbmRlZiBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OKEZJWFAsU0VHKSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApCi0jZW5kaWYKLQotI2lmbmRlZglNRF9QQ1JFTF9GUk9NX1NFQ1RJT04KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbShGSVhQKQotI2VuZGlmCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotZXh0ZXJuIENPTlNUIGludCBtZF9zaG9ydF9qdW1wX3NpemU7Ci1leHRlcm4gQ09OU1QgaW50IG1kX2xvbmdfanVtcF9zaXplOwotI2VuZGlmCi0KLWludCBzeW1ib2xfdGFibGVfZnJvemVuOwotdm9pZCBwcmludF9maXh1cCBQQVJBTVMgKChmaXhTICopKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkIHJlbnVtYmVyX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotLyogV2UgZ2VuZXJhbGx5IGF0dGFjaCByZWxvY3MgdG8gZnJhZyBjaGFpbnMuICBIb3dldmVyLCBhZnRlciB3ZSBoYXZlCi0gICBjaGFpbmVkIHRoZXNlIGFsbCB0b2dldGhlciBpbnRvIGEgc2VnbWVudCwgYW55IHJlbG9jcyB3ZSBhZGQgYWZ0ZXIKLSAgIHRoYXQgbXVzdCBiZSBhdHRhY2hlZCB0byBhIHNlZ21lbnQuICBUaGlzIHdpbGwgaW5jbHVkZSByZWxvY3MgYWRkZWQKLSAgIGluIG1kX2VzdGltYXRlX3NpemVfZm9yX3JlbGF4LCBmb3IgZXhhbXBsZS4gICovCi1zdGF0aWMgaW50IGZyYWdzX2NoYWluZWQgPSAwOwotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi0jaWZuZGVmIE1BTllfU0VHTUVOVFMKLXN0cnVjdCBmcmFnICp0ZXh0X2ZyYWdfcm9vdDsKLXN0cnVjdCBmcmFnICpkYXRhX2ZyYWdfcm9vdDsKLXN0cnVjdCBmcmFnICpic3NfZnJhZ19yb290OwotCi1zdHJ1Y3QgZnJhZyAqdGV4dF9sYXN0X2ZyYWc7CS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotc3RydWN0IGZyYWcgKmRhdGFfbGFzdF9mcmFnOwkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLXN0YXRpYyBzdHJ1Y3QgZnJhZyAqYnNzX2xhc3RfZnJhZzsJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi0jZW5kaWYKLQotI2lmbmRlZiBCRkQKLXN0YXRpYyBvYmplY3RfaGVhZGVycyBoZWFkZXJzOwotI2VuZGlmCi0KLWxvbmcgc3RyaW5nX2J5dGVfY291bnQ7Ci1jaGFyICpuZXh0X29iamVjdF9maWxlX2NoYXJQOwkvKiBUcmFja3Mgb2JqZWN0IGZpbGUgYnl0ZXMuICovCi0KLSNpZm5kZWYgT0JKX1ZNUwotaW50IG1hZ2ljX251bWJlcl9mb3Jfb2JqZWN0X2ZpbGUgPSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEU7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotc3RhdGljIGludCBuX2ZpeHVwczsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyBmaXhTICpmaXhfbmV3X2ludGVybmFsIFBBUkFNUyAoKGZyYWdTICosIGludCB3aGVyZSwgaW50IHNpemUsCi0JCQkJICAgICAgIHN5bWJvbFMgKmFkZCwgc3ltYm9sUyAqc3ViLAotCQkJCSAgICAgICBvZmZzZXRUIG9mZnNldCwgaW50IHBjcmVsLAotCQkJCSAgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlKSk7Ci0jZWxzZQotc3RhdGljIGZpeFMgKmZpeF9uZXdfaW50ZXJuYWwgUEFSQU1TICgoZnJhZ1MgKiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwKLQkJCQkgICAgICAgc3ltYm9sUyAqYWRkLCBzeW1ib2xTICpzdWIsCi0JCQkJICAgICAgIG9mZnNldFQgb2Zmc2V0LCBpbnQgcGNyZWwsCi0JCQkJICAgICAgIGludCByX3R5cGUpKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICghZGVmaW5lZCAoQkZEKSAmJiAhZGVmaW5lZCAoT0JKX1ZNUykpCi1zdGF0aWMgbG9uZyBmaXh1cF9zZWdtZW50IFBBUkFNUyAoKGZpeFMgKiBmaXhQLCBzZWdUIHRoaXNfc2VnbWVudF90eXBlKSk7Ci0jZW5kaWYKLXN0YXRpYyByZWxheF9hZGRyZXNzVCByZWxheF9hbGlnbiBQQVJBTVMgKChyZWxheF9hZGRyZXNzVCBhZGRyLCBpbnQgYWxpZ24pKTsKLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhIGRlZmluZWQgKEJGRCkKLXN0YXRpYyBmcmFnUyAqY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSBQQVJBTVMgKChzZWdULCBzdHJ1Y3QgZnJjaGFpbiAqKSk7Ci0jZW5kaWYKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZCBjaGFpbl9mcmNoYWluc190b2dldGhlciBQQVJBTVMgKChiZmQgKiwgc2VnVCwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjdnRfZnJhZ190b19maWxsIFBBUkFNUyAoKHNlZ1QsIGZyYWdTICopKTsKLXN0YXRpYyB2b2lkIHJlbGF4X2FuZF9zaXplX3NlZyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhZGp1c3RfcmVsb2Nfc3ltcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgd3JpdGVfY29udGVudHMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgc2V0X3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAoISBkZWZpbmVkIChCRkQpICYmICEgZGVmaW5lZCAoT0JKX0FPVVQpKQotc3RhdGljIHZvaWQgbWVyZ2VfZGF0YV9pbnRvX3RleHQgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0jaWYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhIGRlZmluZWQgKEJGRCkKLXN0YXRpYyB2b2lkIGN2dF9mcmFnX3RvX2ZpbGwgUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiwgc2VnVCwgZnJhZ1MgKikpOwotc3RhdGljIHZvaWQgcmVtb3ZlX3N1YnNlZ3MgUEFSQU1TICgoZnJjaGFpblMgKiwgaW50LCBmcmFnUyAqKiwgZnJhZ1MgKiopKTsKLXN0YXRpYyB2b2lkIHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotLyoKLSAqCQkJZml4X25ldygpCi0gKgotICogQ3JlYXRlIGEgZml4UyBpbiBvYnN0YWNrICdub3RlcycuCi0gKi8KLXN0YXRpYyBmaXhTICoKLWZpeF9uZXdfaW50ZXJuYWwgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLCBzdWJfc3ltYm9sLCBvZmZzZXQsIHBjcmVsLAotCQkgIHJfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyLCBvciA0IHVzdWFsbHkuICovCi0gICAgIHN5bWJvbFMgKmFkZF9zeW1ib2w7CS8qIFhfYWRkX3N5bWJvbC4gKi8KLSAgICAgc3ltYm9sUyAqc3ViX3N5bWJvbDsJLyogWF9vcF9zeW1ib2wuICovCi0gICAgIG9mZnNldFQgb2Zmc2V0OwkJLyogWF9hZGRfbnVtYmVyLiAqLwotICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsgLyogUmVsb2NhdGlvbiB0eXBlICovCi0jZWxzZQotICAgICBpbnQgcl90eXBlOwkJLyogUmVsb2NhdGlvbiB0eXBlICovCi0jZW5kaWYKLXsKLSAgZml4UyAqZml4UDsKLQotICBuX2ZpeHVwcysrOwotCi0gIGZpeFAgPSAoZml4UyAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoZml4UykpOwotCi0gIGZpeFAtPmZ4X2ZyYWcgPSBmcmFnOwotICBmaXhQLT5meF93aGVyZSA9IHdoZXJlOwotICBmaXhQLT5meF9zaXplID0gc2l6ZTsKLSAgLyogV2UndmUgbWFkZSBmeF9zaXplIGEgbmFycm93IGZpZWxkOyBjaGVjayB0aGF0IGl0J3Mgd2lkZSBlbm91Z2guICAqLwotICBpZiAoZml4UC0+Znhfc2l6ZSAhPSBzaXplKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZmllbGQgZnhfc2l6ZSB0b28gc21hbGwgdG8gaG9sZCAlZCIpLCBzaXplKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sOwotICBmaXhQLT5meF9zdWJzeSA9IHN1Yl9zeW1ib2w7Ci0gIGZpeFAtPmZ4X29mZnNldCA9IG9mZnNldDsKLSAgZml4UC0+ZnhfcGNyZWwgPSBwY3JlbDsKLSAgZml4UC0+ZnhfcGx0ID0gMDsKLSNpZiBkZWZpbmVkKE5FRURfRlhfUl9UWVBFKSB8fCBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBmaXhQLT5meF9yX3R5cGUgPSByX3R5cGU7Ci0jZW5kaWYKLSAgZml4UC0+ZnhfaW1fZGlzcCA9IDA7Ci0gIGZpeFAtPmZ4X3BjcmVsX2FkanVzdCA9IDA7Ci0gIGZpeFAtPmZ4X2JpdF9maXhQID0gMDsKLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gMDsKLSAgZml4UC0+ZnhfdGNiaXQgPSAwOwotICBmaXhQLT5meF9kb25lID0gMDsKLSAgZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAwOwotICBmaXhQLT5meF9zaWduZWQgPSAwOwotCi0jaWZkZWYgVVNJTkdfQ0dFTgotICBmaXhQLT5meF9jZ2VuLmluc24gPSBOVUxMOwotICBmaXhQLT5meF9jZ2VuLm9waW5mbyA9IDA7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX0ZJWF9UWVBFCi0gIFRDX0lOSVRfRklYX0RBVEEoZml4UCk7Ci0jZW5kaWYKLQotICBhc193aGVyZSAoJmZpeFAtPmZ4X2ZpbGUsICZmaXhQLT5meF9saW5lKTsKLQotICAvKiBVc3VhbGx5LCB3ZSB3YW50IHJlbG9jcyBzb3J0ZWQgbnVtZXJpY2FsbHksIGJ1dCB3aGlsZQotICAgICBjb21wYXJpbmcgdG8gb2xkZXIgdmVyc2lvbnMgb2YgZ2FzIHRoYXQgaGF2ZSByZWxvY3MKLSAgICAgcmV2ZXJzZSBzb3J0ZWQsIGl0IGlzIGNvbnZlbmllbnQgdG8gaGF2ZSB0aGlzIGNvbXBpbGUKLSAgICAgdGltZSBvcHRpb24uICB4b3hvcmljaC4gKi8KLQotICB7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgZml4UyAqKnNlZ19maXhfcm9vdFAgPSAoZnJhZ3NfY2hhaW5lZAotCQkJICAgID8gJnNlZ19pbmZvIChub3dfc2VnKS0+Zml4X3Jvb3QKLQkJCSAgICA6ICZmcmNoYWluX25vdy0+Zml4X3Jvb3QpOwotICAgIGZpeFMgKipzZWdfZml4X3RhaWxQID0gKGZyYWdzX2NoYWluZWQKLQkJCSAgICA/ICZzZWdfaW5mbyAobm93X3NlZyktPmZpeF90YWlsCi0JCQkgICAgOiAmZnJjaGFpbl9ub3ctPmZpeF90YWlsKTsKLSNlbmRpZgotCi0jaWZkZWYgUkVWRVJTRV9TT1JUX1JFTE9DUwotCi0gICAgZml4UC0+ZnhfbmV4dCA9ICpzZWdfZml4X3Jvb3RQOwotICAgICpzZWdfZml4X3Jvb3RQID0gZml4UDsKLQotI2Vsc2UgLyogUkVWRVJTRV9TT1JUX1JFTE9DUyAqLwotCi0gICAgZml4UC0+ZnhfbmV4dCA9IE5VTEw7Ci0KLSAgICBpZiAoKnNlZ19maXhfdGFpbFApCi0gICAgICAoKnNlZ19maXhfdGFpbFApLT5meF9uZXh0ID0gZml4UDsKLSAgICBlbHNlCi0gICAgICAqc2VnX2ZpeF9yb290UCA9IGZpeFA7Ci0gICAgKnNlZ19maXhfdGFpbFAgPSBmaXhQOwotCi0jZW5kaWYgLyogUkVWRVJTRV9TT1JUX1JFTE9DUyAqLwotCi0gIH0KLQotICByZXR1cm4gZml4UDsKLX0KLQotLyogQ3JlYXRlIGEgZml4dXAgcmVsYXRpdmUgdG8gYSBzeW1ib2wgKHBsdXMgYSBjb25zdGFudCkuICAqLwotCi1maXhTICoKLWZpeF9uZXcgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLCBvZmZzZXQsIHBjcmVsLCByX3R5cGUpCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiwgb3IgNCB1c3VhbGx5LiAqLwotICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwkvKiBYX2FkZF9zeW1ib2wuICovCi0gICAgIG9mZnNldFQgb2Zmc2V0OwkJLyogWF9hZGRfbnVtYmVyLiAqLwotICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsgLyogUmVsb2NhdGlvbiB0eXBlICovCi0jZWxzZQotICAgICBpbnQgcl90eXBlOwkJLyogUmVsb2NhdGlvbiB0eXBlICovCi0jZW5kaWYKLXsKLSAgcmV0dXJuIGZpeF9uZXdfaW50ZXJuYWwgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLAotCQkJICAgKHN5bWJvbFMgKikgTlVMTCwgb2Zmc2V0LCBwY3JlbCwgcl90eXBlKTsKLX0KLQotLyogQ3JlYXRlIGEgZml4dXAgZm9yIGFuIGV4cHJlc3Npb24uICBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IGZpeHVwcwotICAgZm9yIGRpZmZlcmVuY2UgZXhwcmVzc2lvbnMuICBUaGF0IGlzIGl0c2VsZiBtb3JlIHRoYW4gbW9zdCBvYmplY3QKLSAgIGZpbGUgZm9ybWF0cyBzdXBwb3J0IGFueWhvdy4gICovCi0KLWZpeFMgKgotZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLCByX3R5cGUpCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiwgb3IgNCB1c3VhbGx5LiAqLwotICAgICBleHByZXNzaW9uUyAqZXhwOwkJLyogRXhwcmVzc2lvbi4gICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOyAvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbHNlCi0gICAgIGludCByX3R5cGU7CQkvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbmRpZgotewotICBzeW1ib2xTICphZGQgPSBOVUxMOwotICBzeW1ib2xTICpzdWIgPSBOVUxMOwotICBvZmZzZXRUIG9mZiA9IDA7Ci0KLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19hYnNlbnQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19hZGQ6Ci0gICAgICAvKiBUaGlzIGNvbWVzIHVwIHdoZW4gX0dMT0JBTF9PRkZTRVRfVEFCTEVfKyguLUwwKSBpcyByZWFkLCBpZgotCSB0aGUgZGlmZmVyZW5jZSBleHByZXNzaW9uIGNhbm5vdCBpbW1lZGlhdGVseSBiZSByZWR1Y2VkLiAgKi8KLSAgICAgIHsKLQlzeW1ib2xTICpzdG1wID0gbWFrZV9leHByX3N5bWJvbCAoZXhwKTsKLQlleHAtPlhfb3AgPSBPX3N5bWJvbDsKLQlleHAtPlhfb3Bfc3ltYm9sID0gMDsKLQlleHAtPlhfYWRkX3N5bWJvbCA9IHN0bXA7Ci0JZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotCXJldHVybiBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsIHJfdHlwZSk7Ci0gICAgICB9Ci0KLSAgICBjYXNlIE9fc3ltYm9sX3J2YToKLSAgICAgIGFkZCA9IGV4cC0+WF9hZGRfc3ltYm9sOwotICAgICAgb2ZmID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0KLSNpZiBkZWZpbmVkKEJGRF9BU1NFTUJMRVIpCi0gICAgICByX3R5cGUgPSBCRkRfUkVMT0NfUlZBOwotI2Vsc2UKLSNpZiBkZWZpbmVkKFRDX1JWQV9SRUxPQykKLSAgICAgIHJfdHlwZSA9IFRDX1JWQV9SRUxPQzsKLSNlbHNlCi0gICAgICBhc19mYXRhbChfKCJydmEgbm90IHN1cHBvcnRlZCIpKTsKLSNlbmRpZgotI2VuZGlmCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgT191bWludXM6Ci0gICAgICBzdWIgPSBleHAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIG9mZiA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0gICAgICBzdWIgPSBleHAtPlhfb3Bfc3ltYm9sOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgYWRkID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAgKi8KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBvZmYgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFkZCA9IG1ha2VfZXhwcl9zeW1ib2wgKGV4cCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpeF9uZXdfaW50ZXJuYWwgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGQsIHN1Yiwgb2ZmLAotCQkJICAgcGNyZWwsIHJfdHlwZSk7Ci19Ci0KLS8qIEFwcGVuZCBhIHN0cmluZyBvbnRvIGFub3RoZXIgc3RyaW5nLCBidW1waW5nIHRoZSBwb2ludGVyIGFsb25nLiAgKi8KLXZvaWQKLWFwcGVuZCAoY2hhclBQLCBmcm9tUCwgbGVuZ3RoKQotICAgICBjaGFyICoqY2hhclBQOwotICAgICBjaGFyICpmcm9tUDsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci17Ci0gIC8qIERvbid0IHRydXN0IG1lbWNweSgpIG9mIDAgY2hhcnMuICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgbWVtY3B5ICgqY2hhclBQLCBmcm9tUCwgbGVuZ3RoKTsKLSAgKmNoYXJQUCArPSBsZW5ndGg7Ci19Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotaW50IHNlY3Rpb25fYWxpZ25tZW50W1NFR19NQVhJTVVNX09SRElOQUxdOwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgcmVjb3JkcyB0aGUgbGFyZ2VzdCBhbGlnbm1lbnQgc2VlbiBmb3IgZWFjaCBzZWdtZW50LgotICogSWYgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VnbWVudCBpcyBhbGlnbmVkIG9uIHRoZSB3b3JzdC1jYXNlCi0gKiBib3VuZGFyeSwgYWxsIG9mIHRoZSBvdGhlciBhbGlnbm1lbnRzIHdpdGhpbiBpdCB3aWxsIHdvcmsuICBBdAotICogbGVhc3Qgb25lIG9iamVjdCBmb3JtYXQgcmVhbGx5IHVzZXMgdGhpcyBpbmZvLgotICovCi12b2lkCi1yZWNvcmRfYWxpZ25tZW50IChzZWcsIGFsaWduKQotICAgICAvKiBTZWdtZW50IHRvIHdoaWNoIGFsaWdubWVudCBwZXJ0YWlucyAqLwotICAgICBzZWdUIHNlZzsKLSAgICAgLyogQWxpZ25tZW50LCBhcyBhIHBvd2VyIG9mIDIgKGUuZy4sIDEgPT4gMi1ieXRlIGJvdW5kYXJ5LCAyID0+IDQtYnl0ZQotCWJvdW5kYXJ5LCBldGMuKSAgKi8KLSAgICAgaW50IGFsaWduOwotewotICBpZiAoc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgcmV0dXJuOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKCh1bnNpZ25lZCBpbnQpIGFsaWduID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpKQotICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCBhbGlnbik7Ci0jZWxzZQotICBpZiAoYWxpZ24gPiBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKQotICAgIHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10gPSBhbGlnbjsKLSNlbmRpZgotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBSZXNldCB0aGUgc2VjdGlvbiBpbmRpY2VzIGFmdGVyIHJlbW92aW5nIHRoZSBnYXMgY3JlYXRlZCBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1yZW51bWJlcl9zZWN0aW9ucyAoYWJmZCwgc2VjLCBjb3VudHBhcmcpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgY291bnRwYXJnOwotewotICBpbnQgKmNvdW50cCA9IChpbnQgKikgY291bnRwYXJnOwotCi0gIHNlYy0+aW5kZXggPSAqY291bnRwOwotICArKypjb3VudHA7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgISBkZWZpbmVkIChCRkQpCi0KLXN0YXRpYyBmcmFnUyAqCi1jaGFpbl9mcmNoYWluc190b2dldGhlcl8xIChzZWN0aW9uLCBmcmNocCkKLSAgICAgc2VnVCBzZWN0aW9uOwotICAgICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaHA7Ci17Ci0gIGZyYWdTIGR1bW15LCAqcHJldl9mcmFnID0gJmR1bW15OwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZml4UyBmaXhfZHVtbXksICpwcmV2X2ZpeCA9ICZmaXhfZHVtbXk7Ci0jZW5kaWYKLQotICBmb3IgKDsgZnJjaHAgJiYgZnJjaHAtPmZyY2hfc2VnID09IHNlY3Rpb247IGZyY2hwID0gZnJjaHAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBwcmV2X2ZyYWctPmZyX25leHQgPSBmcmNocC0+ZnJjaF9yb290OwotICAgICAgcHJldl9mcmFnID0gZnJjaHAtPmZyY2hfbGFzdDsKLSAgICAgIGFzc2VydCAocHJldl9mcmFnLT5mcl90eXBlICE9IDApOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGlmIChmcmNocC0+Zml4X3Jvb3QgIT0gKGZpeFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoc2VnX2luZm8gKHNlY3Rpb24pLT5maXhfcm9vdCA9PSAoZml4UyAqKSBOVUxMKQotCSAgICBzZWdfaW5mbyAoc2VjdGlvbiktPmZpeF9yb290ID0gZnJjaHAtPmZpeF9yb290OwotCSAgcHJldl9maXgtPmZ4X25leHQgPSBmcmNocC0+Zml4X3Jvb3Q7Ci0JICBzZWdfaW5mbyAoc2VjdGlvbiktPmZpeF90YWlsID0gZnJjaHAtPmZpeF90YWlsOwotCSAgcHJldl9maXggPSBmcmNocC0+Zml4X3RhaWw7Ci0JfQotI2VuZGlmCi0gICAgfQotICBhc3NlcnQgKHByZXZfZnJhZy0+ZnJfdHlwZSAhPSAwKTsKLSAgcHJldl9mcmFnLT5mcl9uZXh0ID0gMDsKLSAgcmV0dXJuIHByZXZfZnJhZzsKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXN0YXRpYyB2b2lkCi1jaGFpbl9mcmNoYWluc190b2dldGhlciAoYWJmZCwgc2VjdGlvbiwgeHh4KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VnVCBzZWN0aW9uOwotICAgICBQVFIgeHh4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICppbmZvOwotCi0gIC8qIEJGRCBtYXkgaGF2ZSBpbnRyb2R1Y2VkIGl0cyBvd24gc2VjdGlvbnMgd2l0aG91dCB1c2luZwotICAgICBzdWJzZWdfbmV3LCBzbyBpdCBpcyBwb3NzaWJsZSB0aGF0IHNlZ19pbmZvIGlzIE5VTEwuICAqLwotICBpbmZvID0gc2VnX2luZm8gKHNlY3Rpb24pOwotICBpZiAoaW5mbyAhPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgTlVMTCkKLSAgIGluZm8tPmZyY2hhaW5QLT5mcmNoX2xhc3QKLSAgICAgPSBjaGFpbl9mcmNoYWluc190b2dldGhlcl8xIChzZWN0aW9uLCBpbmZvLT5mcmNoYWluUCk7Ci0KLSAgLyogTm93IHRoYXQgd2UndmUgY2hhaW5lZCB0aGUgZnJhZ3MgdG9nZXRoZXIsIHdlIG11c3QgYWRkIG5ldyBmaXh1cHMKLSAgICAgdG8gdGhlIHNlZ21lbnQsIG5vdCB0byB0aGUgZnJhZyBjaGFpbi4gICovCi0gIGZyYWdzX2NoYWluZWQgPSAxOwotfQotCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX3N1YnNlZ3MgKGhlYWQsIHNlZywgcm9vdCwgbGFzdCkKLSAgICAgZnJjaGFpblMgKmhlYWQ7Ci0gICAgIGludCBzZWc7Ci0gICAgIGZyYWdTICoqcm9vdDsKLSAgICAgZnJhZ1MgKipsYXN0OwotewotICAqcm9vdCA9IGhlYWQtPmZyY2hfcm9vdDsKLSAgKmxhc3QgPSBjaGFpbl9mcmNoYWluc190b2dldGhlcl8xIChzZWcsIGhlYWQpOwotfQotCi0jZW5kaWYgLyogQkZEICovCi0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhZGVmaW5lZCAoQkZEKQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQKLWN2dF9mcmFnX3RvX2ZpbGwgKHNlYywgZnJhZ1ApCi0gICAgIHNlZ1Qgc2VjOwotICAgICBmcmFnUyAqZnJhZ1A7Ci0jZWxzZQotc3RhdGljIHZvaWQKLWN2dF9mcmFnX3RvX2ZpbGwgKGhlYWRlcnNQLCBzZWMsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyc1A7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBmcmFnUyAqZnJhZ1A7Ci0jZW5kaWYKLXsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSByc19hbGlnbjoKLSAgICBjYXNlIHJzX2FsaWduX2NvZGU6Ci0gICAgY2FzZSByc19vcmc6Ci0gICAgY2FzZSByc19zcGFjZToKLSNpZmRlZiBIQU5ETEVfQUxJR04KLSAgICAgIEhBTkRMRV9BTElHTiAoZnJhZ1ApOwotI2VuZGlmCi0gICAgICBrbm93IChmcmFnUC0+ZnJfbmV4dCAhPSBOVUxMKTsKLSAgICAgIGZyYWdQLT5mcl9vZmZzZXQgPSAoZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3MKLQkJCSAgLSBmcmFnUC0+ZnJfYWRkcmVzcwotCQkJICAtIGZyYWdQLT5mcl9maXgpIC8gZnJhZ1AtPmZyX3ZhcjsKLSAgICAgIGlmIChmcmFnUC0+ZnJfb2Zmc2V0IDwgMCkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZyYWdQLT5mcl9maWxlLCBmcmFnUC0+ZnJfbGluZSwKLQkJCV8oImF0dGVtcHQgdG8gLm9yZy8uc3BhY2UgYmFja3dhcmRzPyAoJWxkKSIpLAotCQkJKGxvbmcpIGZyYWdQLT5mcl9vZmZzZXQpOwotCX0KLSAgICAgIGZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSByc19maWxsOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHJzX2xlYjEyODoKLSAgICAgIHsKLQl2YWx1ZVQgdmFsdWUgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCk7Ci0JaW50IHNpemU7Ci0KLQlzaXplID0gb3V0cHV0X2xlYjEyOCAoZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LCB2YWx1ZSwKLQkJCSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQotCWZyYWdQLT5mcl9maXggKz0gc2l6ZTsKLQlmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0JZnJhZ1AtPmZyX29mZnNldCA9IDA7Ci0JZnJhZ1AtPmZyX3N5bWJvbCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcnNfY2ZhOgotICAgICAgZWhfZnJhbWVfY29udmVydF9mcmFnIChmcmFnUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgbWRfY29udmVydF9mcmFnIChzdGRvdXRwdXQsIHNlYywgZnJhZ1ApOwotI2Vsc2UKLSAgICAgIG1kX2NvbnZlcnRfZnJhZyAoaGVhZGVyc1AsIHNlYywgZnJhZ1ApOwotI2VuZGlmCi0KLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX25leHQgPT0gTlVMTAotCSAgICAgIHx8ICgob2Zmc2V0VCkgKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ1AtPmZyX2FkZHJlc3MpCi0JCSAgPT0gZnJhZ1AtPmZyX2ZpeCkpOwotCi0gICAgICAvKgotICAgICAgICogQWZ0ZXIgbWRfY29udmVydF9mcmFnLCB3ZSBtYWtlIHRoZSBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICAgICAgICogTWRfY29udmVydF9mcmFnKCkgc2hvdWxkIHNldCB1cCBhbnkgZml4U3MgYW5kIGNvbnN0YW50cwotICAgICAgICogcmVxdWlyZWQuCi0gICAgICAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotICAgICAgYnJlYWs7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICAgIGNhc2UgcnNfYnJva2VuX3dvcmQ6Ci0gICAgICB7Ci0Jc3RydWN0IGJyb2tlbl93b3JkICpsaWU7Ci0KLQlpZiAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gbWRfc2hvcnRfanVtcF9zaXplOwotCSAgICBmb3IgKGxpZSA9IChzdHJ1Y3QgYnJva2VuX3dvcmQgKikgKGZyYWdQLT5mcl9zeW1ib2wpOwotCQkgbGllICYmIGxpZS0+ZGlzcGZyYWcgPT0gZnJhZ1A7Ci0JCSBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCi0JICAgICAgaWYgKGxpZS0+YWRkZWQgPT0gMSkKLQkJZnJhZ1AtPmZyX2ZpeCArPSBtZF9sb25nX2p1bXBfc2l6ZTsKLQkgIH0KLQlmcmFnX3dhbmUgKGZyYWdQKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl90eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZAotcmVsYXhfYW5kX3NpemVfc2VnIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBmcmFnUyAqZnJhZ3A7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICBpbnQgeDsKLSAgdmFsdWVUIHNpemUsIG5ld3NpemU7Ci0KLSAgc3Vic2VnX2NoYW5nZSAoc2VjLCAwKTsKLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLQotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGlmIChzZWdpbmZvICYmIHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIHsKLSAgICAgIHJlbGF4X3NlZ21lbnQgKHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3QsIHNlYyk7Ci0gICAgICBmb3IgKGZyYWdwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsgZnJhZ3A7IGZyYWdwID0gZnJhZ3AtPmZyX25leHQpCi0JY3Z0X2ZyYWdfdG9fZmlsbCAoc2VjLCBmcmFncCk7Ci0gICAgICBmb3IgKGZyYWdwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgICBmcmFncC0+ZnJfbmV4dDsKLQkgICBmcmFncCA9IGZyYWdwLT5mcl9uZXh0KQotCS8qIHdhbGsgdG8gbGFzdCBlbHQgKi87Ci0gICAgICBzaXplID0gZnJhZ3AtPmZyX2FkZHJlc3MgKyBmcmFncC0+ZnJfZml4OwotICAgIH0KLSAgZWxzZQotICAgIHNpemUgPSAwOwotCi0gIGlmIChzaXplID4gMCAmJiAhIHNlZ2luZm8tPmJzcykKLSAgICBmbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIC8qIEBAIFRoaXMgaXMganVzdCBhbiBhcHByb3hpbWF0aW9uLiAgKi8KLSAgaWYgKHNlZ2luZm8gJiYgc2VnaW5mby0+Zml4X3Jvb3QpCi0gICAgZmxhZ3MgfD0gU0VDX1JFTE9DOwotICBlbHNlCi0gICAgZmxhZ3MgJj0gflNFQ19SRUxPQzsKLSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncyk7Ci0gIGFzc2VydCAoeCA9PSB0cnVlKTsKLQotICBuZXdzaXplID0gbWRfc2VjdGlvbl9hbGlnbiAoc2VjLCBzaXplKTsKLSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMsIG5ld3NpemUpOwotICBhc3NlcnQgKHggPT0gdHJ1ZSk7Ci0KLSAgLyogSWYgdGhlIHNpemUgaGFkIHRvIGJlIHJvdW5kZWQgdXAsIGFkZCBzb21lIHBhZGRpbmcgaW4gdGhlIGxhc3QKLSAgICAgbm9uLWVtcHR5IGZyYWcuICAqLwotICBhc3NlcnQgKG5ld3NpemUgPj0gc2l6ZSk7Ci0gIGlmIChzaXplICE9IG5ld3NpemUpCi0gICAgewotICAgICAgZnJhZ1MgKmxhc3QgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9sYXN0OwotICAgICAgZnJhZ3AgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290OwotICAgICAgd2hpbGUgKGZyYWdwLT5mcl9uZXh0ICE9IGxhc3QpCi0JZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dDsKLSAgICAgIGxhc3QtPmZyX2FkZHJlc3MgPSBzaXplOwotICAgICAgZnJhZ3AtPmZyX29mZnNldCArPSBuZXdzaXplIC0gc2l6ZTsKLSAgICB9Ci0KLSNpZmRlZiB0Y19mcm9iX3NlY3Rpb24KLSAgdGNfZnJvYl9zZWN0aW9uIChzZWMpOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2Jfc2VjdGlvbgotICBvYmpfZnJvYl9zZWN0aW9uIChzZWMpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBERUJVRzIKLXN0YXRpYyB2b2lkCi1kdW1wX3NlY3Rpb25fcmVsb2NzIChhYmZkLCBzZWMsIHN0cmVhbV8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjaGFyICpzdHJlYW1fOwotewotICBGSUxFICpzdHJlYW0gPSAoRklMRSAqKSBzdHJlYW1fOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBmaXhTICpmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7Ci0KLSAgaWYgKCFmaXhwKQotICAgIHJldHVybjsKLQotICBmcHJpbnRmIChzdHJlYW0sICJzZWMgJXMgcmVsb2NzOlxuIiwgc2VjLT5uYW1lKTsKLSAgd2hpbGUgKGZpeHApCi0gICAgewotICAgICAgc3ltYm9sUyAqcyA9IGZpeHAtPmZ4X2FkZHN5OwotCi0gICAgICBmcHJpbnRmIChzdHJlYW0sICIgICUwOGx4OiB0eXBlICVkICIsICh1bnNpZ25lZCBsb25nKSBmaXhwLAotCSAgICAgICAoaW50KSBmaXhwLT5meF9yX3R5cGUpOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlmcHJpbnRmIChzdHJlYW0sICJubyBzeW1cbiIpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50X3N5bWJvbF92YWx1ZV8xIChzdHJlYW0sIHMpOwotCSAgZnByaW50ZiAoc3RyZWFtLCAiXG4iKTsKLQl9Ci0gICAgICBmaXhwID0gZml4cC0+ZnhfbmV4dDsKLSAgICB9Ci19Ci0jZWxzZQotI2RlZmluZSBkdW1wX3NlY3Rpb25fcmVsb2NzKEFCRkQsU0VDLFNUUkVBTSkJKCh2b2lkKSAwKQotI2VuZGlmCi0KLSNpZm5kZWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMKLSNkZWZpbmUgRU1JVF9TRUNUSU9OX1NZTUJPTFMgMQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfcmVsb2Nfc3ltcyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGZpeFMgKmZpeHA7Ci0KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZHVtcF9zZWN0aW9uX3JlbG9jcyAoYWJmZCwgc2VjLCBzdGRlcnIpOwotCi0gIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKLSAgICBpZiAoZml4cC0+ZnhfZG9uZSkKLSAgICAgIC8qIGlnbm9yZSBpdCAqLzsKLSAgICBlbHNlIGlmIChmaXhwLT5meF9hZGRzeSkKLSAgICAgIHsKLQlzeW1ib2xTICpzeW07Ci0JYXNlY3Rpb24gKnN5bXNlYzsKLQotI2lmZGVmIERFQlVHNQotCWZwcmludGYgKHN0ZGVyciwgIlxuXG5hZGp1c3RpbmcgZml4dXA6XG4iKTsKLQlwcmludF9maXh1cCAoZml4cCk7Ci0jZW5kaWYKLQotCXN5bSA9IGZpeHAtPmZ4X2FkZHN5OwotCi0JLyogQWxsIHN5bWJvbHMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkIGF0IHRoaXMKLQkgICBwb2ludC4gIEl0IGlzIHBvc3NpYmxlIHRvIHNlZSB1bnJlc29sdmVkIGV4cHJlc3Npb24KLQkgICBzeW1ib2xzLCB0aG91Z2gsIHNpbmNlIHRoZXkgYXJlIG5vdCBpbiB0aGUgcmVndWxhciBzeW1ib2wKLQkgICB0YWJsZS4gICovCi0JaWYgKHN5bSAhPSBOVUxMKQotCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bSwgMSk7Ci0JCi0JaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwpCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZml4cC0+Znhfc3Vic3ksIDEpOwotCi0JLyogSWYgdGhpcyBzeW1ib2wgaXMgZXF1YXRlZCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLCBjb252ZXJ0Ci0gICAgICAgICAgIHRoZSBmaXh1cCB0byBiZWluZyBhZ2FpbnN0IHRoYXQgc3ltYm9sLiAgKi8KLQlpZiAoc3ltICE9IE5VTEwgJiYgc3ltYm9sX2VxdWF0ZWRfcCAoc3ltKQotCSAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCSAgewotCSAgICBmaXhwLT5meF9vZmZzZXQgKz0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW0pLT5YX2FkZF9udW1iZXI7Ci0JICAgIHN5bSA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfc3ltYm9sOwotCSAgICBmaXhwLT5meF9hZGRzeSA9IHN5bTsKLQkgIH0KLQotCWlmIChzeW0gIT0gTlVMTCAmJiBzeW1ib2xfbXJpX2NvbW1vbl9wIChzeW0pKQotCSAgewotCSAgICAvKiBUaGVzZSBzeW1ib2xzIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBpbiBmaXh1cF9zZWdtZW50LiAgKi8KLQkgICAgZ290byBkb25lOwotCSAgfQotCi0Jc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotCWlmIChzeW1zZWMgPT0gTlVMTCkKLQkgIGFib3J0ICgpOwotCQotCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bXNlYykpCi0JICB7Ci0JICAgIC8qIFRoZSBmaXh1cF9zZWdtZW50IHJvdXRpbmUgd2lsbCBub3QgdXNlIHRoaXMgc3ltYm9sIGluIGEKLSAgICAgICAgICAgICAgIHJlbG9jYXRpb24gdW5sZXNzIFRDX0ZPUkNFX1JFTE9DQVRJT04gcmV0dXJucyAxLiAgKi8KLQkgICAgaWYgKFRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeHApKQotCSAgICAgIHsKLQkJc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotI2lmZGVmIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0JCWlmIChmaXhwLT5meF9zdWJzeSAhPSBOVUxMKQotCQkgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X3N1YnN5KTsKLSNlbmRpZgotCSAgICAgIH0KLQkgICAgZ290byBkb25lOwotCSAgfQotCi0JLyogSWYgaXQncyBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMsIGFzc3VtZSB0aGUgc3ltYm9sIGlzCi0JICAgZGVmaW5pdGVseSBnb2luZyB0byBiZSBvdXRwdXQuICBUaGUgY29kZSBpbgotCSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGluIHRjLW1pcHMuYyB1c2VzIHRoaXMgdGVzdAotCSAgIGFzIHdlbGwsIHNvIGlmIHlvdSBjaGFuZ2UgdGhpcyBjb2RlIHlvdSBzaG91bGQgbG9vayBhdCB0aGF0Ci0JICAgY29kZS4gICovCi0JaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc2VjKQotCSAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNlYykpCi0JICB7Ci0JICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLSNpZmRlZiBVTkRFRklORURfRElGRkVSRU5DRV9PSwotCSAgICAvKiBXZSBoYXZlIHRoZSBkaWZmZXJlbmNlIG9mIGFuIHVuZGVmaW5lZCBzeW1ib2wgYW5kIHNvbWUKLQkgICAgICAgb3RoZXIgc3ltYm9sLiAgTWFrZSBzdXJlIHRvIG1hcmsgdGhlIG90aGVyIHN5bWJvbCBhcyB1c2VkCi0JICAgICAgIGluIGEgcmVsb2NhdGlvbiBzbyB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIG91dHB1dC4gICovCi0JICAgIGlmIChmaXhwLT5meF9zdWJzeSkKLQkgICAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9zdWJzeSk7Ci0jZW5kaWYKLQkgICAgZ290byBkb25lOwotCSAgfQotCi0JLyogRG9uJ3QgdHJ5IHRvIHJlZHVjZSByZWxvY3Mgd2hpY2ggcmVmZXIgdG8gbm9uLWxvY2FsIHN5bWJvbHMKLSAgICAgICAgICAgaW4gLmxpbmtvbmNlIHNlY3Rpb25zLiAgSXQgY2FuIGxlYWQgdG8gY29uZnVzaW9uIHdoZW4gYQotICAgICAgICAgICBkZWJ1Z2dpbmcgc2VjdGlvbiByZWZlcnMgdG8gYSAubGlua29uY2Ugc2VjdGlvbi4gIEkgaG9wZQotICAgICAgICAgICB0aGlzIHdpbGwgYWx3YXlzIGJlIGNvcnJlY3QuICAqLwotCWlmIChzeW1zZWMgIT0gc2VjICYmICEgU19JU19MT0NBTCAoc3ltKSkKLQkgIHsKLQkgICAgYm9vbGVhbiBsaW5rb25jZTsKLQotCSAgICBsaW5rb25jZSA9IGZhbHNlOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc3ltc2VjKSAmIFNFQ19MSU5LX09OQ0UpCi0JCSE9IDApCi0JICAgICAgbGlua29uY2UgPSB0cnVlOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotCSAgICAvKiBUaGUgR05VIHRvb2xjaGFpbiB1c2VzIGFuIGV4dGVuc2lvbiBmb3IgRUxGOiBhIHNlY3Rpb24KLSAgICAgICAgICAgICAgIGJlZ2lubmluZyB3aXRoIHRoZSBtYWdpYyBzdHJpbmcgLmdudS5saW5rb25jZSBpcyBhCi0gICAgICAgICAgICAgICBsaW5rb25jZSBzZWN0aW9uLiAgKi8KLQkgICAgaWYgKHN0cm5jbXAgKHNlZ21lbnRfbmFtZSAoc3ltc2VjKSwgIi5nbnUubGlua29uY2UiLAotCQkJIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKQotCSAgICAgIGxpbmtvbmNlID0gdHJ1ZTsKLSNlbmRpZgotCi0JICAgIGlmIChsaW5rb25jZSkKLQkgICAgICB7Ci0JCXN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLSNpZmRlZiBVTkRFRklORURfRElGRkVSRU5DRV9PSwotCQlpZiAoZml4cC0+Znhfc3Vic3kgIT0gTlVMTCkKLQkJICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9zdWJzeSk7Ci0jZW5kaWYKLQkJZ290byBkb25lOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIFNpbmNlIHdlJ3JlIHJlZHVjaW5nIHRvIHNlY3Rpb24gc3ltYm9scywgZG9uJ3QgYXR0ZW1wdCB0byByZWR1Y2UKLQkgICBhbnl0aGluZyB0aGF0J3MgYWxyZWFkeSB1c2luZyBvbmUuICAqLwotCWlmIChzeW1ib2xfc2VjdGlvbl9wIChzeW0pKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkvKiBXZSBjYW4gbmV2ZXIgYWRqdXN0IGEgcmVsb2MgYWdhaW5zdCBhIHdlYWsgc3ltYm9sLiAgSWYgd2UKLSAgICAgICAgICAgZGlkLCBhbmQgdGhlIHdlYWsgc3ltYm9sIHdhcyBvdmVycmlkZGVuIGJ5IGEgcmVhbCBzeW1ib2wKLSAgICAgICAgICAgc29tZXdoZXJlIGVsc2UsIHRoZW4gb3VyIHJlbG9jYXRpb24gd291bGQgYmUgcG9pbnRpbmcgYXQKLSAgICAgICAgICAgdGhlIHdyb25nIGFyZWEgb2YgbWVtb3J5LiAgKi8KLQlpZiAoU19JU19XRUFLIChzeW0pKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLSNlbmRpZgotCi0JLyogSXMgdGhlcmUgc29tZSBvdGhlciByZWFzb24gd2UgY2FuJ3QgYWRqdXN0IHRoaXMgb25lPyAgKEUuZy4sCi0JICAgY2FsbC9iYWwgbGlua3MgaW4gaTk2MC1ib3V0IHN5bWJvbHMuKSAgKi8KLSNpZmRlZiBvYmpfZml4X2FkanVzdGFibGUKLQlpZiAoISBvYmpfZml4X2FkanVzdGFibGUgKGZpeHApKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLSNlbmRpZgotCi0JLyogSXMgdGhlcmUgc29tZSBvdGhlciAodGFyZ2V0IGNwdSBkZXBlbmRlbnQpIHJlYXNvbiB3ZSBjYW4ndCBhZGp1c3QKLQkgICB0aGlzIG9uZT8gIChFLmcuIHJlbG9jYXRpb25zIGludm9sdmluZyBmdW5jdGlvbiBhZGRyZXNzZXMgb24KLQkgICB0aGUgUEEuICAqLwotI2lmZGVmIHRjX2ZpeF9hZGp1c3RhYmxlCi0JaWYgKCEgdGNfZml4X2FkanVzdGFibGUgKGZpeHApKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLSNlbmRpZgotCi0JLyogSWYgdGhlIHNlY3Rpb24gc3ltYm9sIGlzbid0IGdvaW5nIHRvIGJlIG91dHB1dCwgdGhlIHJlbG9jcwotCSAgIGF0IGxlYXN0IHNob3VsZCBzdGlsbCB3b3JrLiAgSWYgbm90LCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KLQkgICB3aGVuIHdlIHJ1biBpbnRvIHRoYXQgY2FzZS4KLQotCSAgIFdlIHJlZmV0Y2ggdGhlIHNlZ21lbnQgd2hlbiBjYWxsaW5nIHNlY3Rpb25fc3ltYm9sLCByYXRoZXIKLQkgICB0aGFuIHVzaW5nIHN5bXNlYywgYmVjYXVzZSBTX0dFVF9WQUxVRSBtYXkgd2luZCB1cCBjaGFuZ2luZwotCSAgIHRoZSBzZWN0aW9uIHdoZW4gaXQgY2FsbHMgcmVzb2x2ZV9zeW1ib2xfdmFsdWUuICovCi0JZml4cC0+Znhfb2Zmc2V0ICs9IFNfR0VUX1ZBTFVFIChzeW0pOwotCWZpeHAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKFNfR0VUX1NFR01FTlQgKHN5bSkpOwotCXN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLSNpZmRlZiBERUJVRzUKLQlmcHJpbnRmIChzdGRlcnIsICJcbmFkanVzdGVkIGZpeHVwOlxuIik7Ci0JcHJpbnRfZml4dXAgKGZpeHApOwotI2VuZGlmCi0KLSAgICAgIGRvbmU6Ci0JOwotICAgICAgfQotI2lmIDEvKmRlZiBSRUxPQ19SRVFVSVJFU19TWU1CT0wqLwotICAgIGVsc2UKLSAgICAgIHsKLQkvKiBUaGVyZSB3YXMgbm8gc3ltYm9sIHJlcXVpcmVkIGJ5IHRoaXMgcmVsb2NhdGlvbi4gIEhvd2V2ZXIsCi0JICAgQkZEIGRvZXNuJ3QgcmVhbGx5IGhhbmRsZSByZWxvY2F0aW9ucyB3aXRob3V0IHN5bWJvbHMgd2VsbC4KLQkgICAoQXQgbGVhc3QsIHRoZSBDT0ZGIHN1cHBvcnQgZG9lc24ndC4pICBTbyBmb3Igbm93IHdlIGZha2UgdXAKLQkgICBhIGxvY2FsIHN5bWJvbCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCi0KLQlmaXhwLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLS8qCWZpeHAtPmZ4X2FkZHN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsgKi8KLSAgICAgIH0KLSNlbmRpZgotCi0gIGR1bXBfc2VjdGlvbl9yZWxvY3MgKGFiZmQsIHNlYywgc3RkZXJyKTsKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JlbG9jcyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBpbnQgaTsKLSAgdW5zaWduZWQgaW50IG47Ci0gIGFyZWxlbnQgKipyZWxvY3M7Ci0gIGZpeFMgKmZpeHA7Ci0gIGNoYXIgKmVycjsKLQotICAvKiBJZiBzZWdpbmZvIGlzIE5VTEwsIHdlIGRpZCBub3QgY3JlYXRlIHRoaXMgc2VjdGlvbjsgZG9uJ3QgZG8KLSAgICAgYW55dGhpbmcgd2l0aCBpdC4gICovCi0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGZpeHVwX3NlZ21lbnQgKHNlZ2luZm8tPmZpeF9yb290LCBzZWMpOwotCi0gIG4gPSAwOwotICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgbisrOwotCi0jaWZuZGVmIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotICAvKiBTZXQgdXAgcmVsb2MgaW5mb3JtYXRpb24gYXMgd2VsbC4gICovCi0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChuICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgbWVtc2V0ICgoY2hhciopcmVsb2NzLCAwLCBuICogc2l6ZW9mIChhcmVsZW50KikpOwotCi0gIGkgPSAwOwotICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cCAhPSAoZml4UyAqKSBOVUxMOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzOwotICAgICAgc3ltYm9sUyAqc3ltOwotCi0gICAgICBpZiAoZml4cC0+ZnhfZG9uZSkKLQl7Ci0JICBuLS07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCB3aGljaCB3YXMgZXF1YXRlZCB0byBhbm90aGVyCi0gICAgICAgICBzeW1ib2wsIHRoZW4gdXNlIGdlbmVyYXRlIHRoZSByZWxvYyBhZ2FpbnN0IHRoZSBsYXR0ZXIgc3ltYm9sCi0gICAgICAgICByYXRoZXIgdGhhbiB0aGUgZm9ybWVyLiAgKi8KLSAgICAgIHN5bSA9IGZpeHAtPmZ4X2FkZHN5OwotICAgICAgd2hpbGUgKHN5bWJvbF9lcXVhdGVkX3AgKHN5bSkKLQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCi0JewotCSAgc3ltYm9sUyAqbjsKLQotCSAgLyogV2UgbXVzdCBhdm9pZCBsb29waW5nLCBhcyB0aGF0IGNhbiBvY2N1ciB3aXRoIGEgYmFkbHkKLQkgICAgIHdyaXR0ZW4gcHJvZ3JhbS4gICovCi0JICBuID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW0pLT5YX2FkZF9zeW1ib2w7Ci0JICBpZiAobiA9PSBzeW0pCi0JICAgIGJyZWFrOwotCSAgZml4cC0+Znhfb2Zmc2V0ICs9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfbnVtYmVyOwotCSAgc3ltID0gbjsKLQl9Ci0gICAgICBmaXhwLT5meF9hZGRzeSA9IHN5bTsKLQotICAgICAgcmVsb2MgPSB0Y19nZW5fcmVsb2MgKHNlYywgZml4cCk7Ci0gICAgICBpZiAoIXJlbG9jKQotCXsKLQkgIG4tLTsKLQkgIGNvbnRpbnVlOwotCX0KLQotI2lmIDAKLSAgICAgIC8qIFRoaXMgdGVzdCBpcyB0cmlnZ2VyZWQgaW5hcHByb3ByaWF0ZWx5IGZvciB0aGUgU0guICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICsgZml4cC0+Znhfc2l6ZQotCSAgPiBmaXhwLT5meF9mcmFnLT5mcl9maXggKyBmaXhwLT5meF9mcmFnLT5mcl9vZmZzZXQpCi0JYWJvcnQgKCk7Ci0jZW5kaWYKLQotICAgICAgcyA9IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gKHN0ZG91dHB1dCwgcmVsb2MsCi0JCQkJICBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsLAotCQkJCSAgZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkgIHNlYywgJmVycik7Ci0gICAgICBzd2l0Y2ggKHMpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBfKCJyZWxvY2F0aW9uIG91dCBvZiByYW5nZSIpKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19mYXRhbCAoXygiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uOiAleCIpLAotCQkgICAgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwgcyk7Ci0JfQotICAgICAgcmVsb2NzW2krK10gPSByZWxvYzsKLSAgICB9Ci0jZWxzZQotICBuID0gbiAqIE1BWF9SRUxPQ19FWFBBTlNJT047Ci0gIC8qIFNldCB1cCByZWxvYyBpbmZvcm1hdGlvbiBhcyB3ZWxsLiAgKi8KLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKG4gKiBzaXplb2YgKGFyZWxlbnQgKikpOwotCi0gIGkgPSAwOwotICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cCAhPSAoZml4UyAqKSBOVUxMOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcmVsb2M7Ci0gICAgICBjaGFyICpkYXRhOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHM7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBpbnQgajsKLQotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JewotCSAgbi0tOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2FzIGVxdWF0ZWQgdG8gYW5vdGhlcgotICAgICAgICAgc3ltYm9sLCB0aGVuIHVzZSBnZW5lcmF0ZSB0aGUgcmVsb2MgYWdhaW5zdCB0aGUgbGF0dGVyIHN5bWJvbAotICAgICAgICAgcmF0aGVyIHRoYW4gdGhlIGZvcm1lci4gICovCi0gICAgICBzeW0gPSBmaXhwLT5meF9hZGRzeTsKLSAgICAgIHdoaWxlIChzeW1ib2xfZXF1YXRlZF9wIChzeW0pCi0JICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCXN5bSA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfc3ltYm9sOwotICAgICAgZml4cC0+ZnhfYWRkc3kgPSBzeW07Ci0KLSAgICAgIHJlbG9jID0gdGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApOwotCi0gICAgICBmb3IgKGogPSAwOyByZWxvY1tqXTsgaisrKQotCXsKLSAgICAgICAgICByZWxvY3NbaSsrXSA9IHJlbG9jW2pdOwotICAgICAgICAgIGFzc2VydChpIDw9IG4pOwotCX0KLSAgICAgIGRhdGEgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgKyBmaXhwLT5meF9zaXplCi0JICA+IGZpeHAtPmZ4X2ZyYWctPmZyX2ZpeCArIGZpeHAtPmZ4X2ZyYWctPmZyX29mZnNldCkKLQlhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oImludGVybmFsIGVycm9yOiBmaXh1cCBub3QgY29udGFpbmVkIHdpdGhpbiBmcmFnIikpOwotICAgICAgZm9yIChqID0gMDsgcmVsb2Nbal07IGorKykKLSAgICAgICAgewotCSAgcyA9IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gKHN0ZG91dHB1dCwgcmVsb2Nbal0sCi0JCQkJICAgICAgZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCQkgICAgICBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzLAotCQkJCSAgICAgIHNlYywgJmVycik7Ci0gICAgICAgICAgc3dpdGNoIChzKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX29rOgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIiksCi0JCQlmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLQkgICAgfQotICAgICAgICB9Ci0gICAgfQotICBuID0gaTsKLSNlbmRpZgotCi0jaWZkZWYgREVCVUc0Ci0gIHsKLSAgICBpbnQgaSwgaiwgbnN5bXM7Ci0gICAgYXN5bWJvbCAqKnN5bXBwOwotICAgIHN5bXBwID0gYmZkX2dldF9vdXRzeW1ib2xzIChzdGRvdXRwdXQpOwotICAgIG5zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoc3Rkb3V0cHV0KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotICAgICAgaWYgKCgoKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQl7Ci0JICBmb3IgKGogPSAwOyBqIDwgbnN5bXM7IGorKykKLQkgICAgaWYgKHN5bXBwW2pdID09ICpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGogPT0gbnN5bXMpCi0JICAgIGFib3J0ICgpOwotCX0KLSAgfQotI2VuZGlmCi0KLSAgaWYgKG4pCi0gICAgYmZkX3NldF9yZWxvYyAoc3Rkb3V0cHV0LCBzZWMsIHJlbG9jcywgbik7Ci0gIGVsc2UKLSAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywKLQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykKLQkJCSAgICAmIChmbGFnd29yZCkgflNFQ19SRUxPQykpOwotCi0jaWZkZWYgU0VUX1NFQ1RJT05fUkVMT0NTCi0gIFNFVF9TRUNUSU9OX1JFTE9DUyAoc2VjLCByZWxvY3MsIG4pOwotI2VuZGlmCi0KLSNpZmRlZiBERUJVRzMKLSAgewotICAgIGludCBpOwotICAgIGFyZWxlbnQgKnI7Ci0gICAgYXN5bWJvbCAqczsKLSAgICBmcHJpbnRmIChzdGRlcnIsICJyZWxvY3MgZm9yIHNlYyAlc1xuIiwgc2VjLT5uYW1lKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotICAgICAgewotCXIgPSByZWxvY3NbaV07Ci0JcyA9ICpyLT5zeW1fcHRyX3B0cjsKLQlmcHJpbnRmIChzdGRlcnIsICIgIHJlbG9jICUyZCBAJTA4eCBvZmYgJTR4IDogc3ltICUtMTBzIGFkZGVuZCAleFxuIiwKLQkJIGksIHIsIHItPmFkZHJlc3MsIHMtPm5hbWUsIHItPmFkZGVuZCk7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfY29udGVudHMgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICB1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7Ci0gIGZyYWdTICpmOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZnJhZ3MuICAqLwotICBpZiAoc2VnaW5mbyA9PSBOVUxMCi0gICAgICB8fCAhIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfSEFTX0NPTlRFTlRTKSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChmID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgICAgICBmOwotICAgICAgIGYgPSBmLT5mcl9uZXh0KQotICAgIHsKLSAgICAgIGludCB4OwotICAgICAgdW5zaWduZWQgbG9uZyBmaWxsX3NpemU7Ci0gICAgICBjaGFyICpmaWxsX2xpdGVyYWw7Ci0gICAgICBsb25nIGNvdW50OwotCi0gICAgICBhc3NlcnQgKGYtPmZyX3R5cGUgPT0gcnNfZmlsbCk7Ci0gICAgICBpZiAoZi0+ZnJfZml4KQotCXsKLQkgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQlmLT5mcl9saXRlcmFsLCAoZmlsZV9wdHIpIG9mZnNldCwKLQkJCQkJKGJmZF9zaXplX3R5cGUpIGYtPmZyX2ZpeCk7Ci0JICBpZiAoeCA9PSBmYWxzZSkKLQkgICAgewotCSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IHdyaXRlICVzIiksIHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0JICAgIH0KLQkgIG9mZnNldCArPSBmLT5mcl9maXg7Ci0JfQotICAgICAgZmlsbF9saXRlcmFsID0gZi0+ZnJfbGl0ZXJhbCArIGYtPmZyX2ZpeDsKLSAgICAgIGZpbGxfc2l6ZSA9IGYtPmZyX3ZhcjsKLSAgICAgIGNvdW50ID0gZi0+ZnJfb2Zmc2V0OwotICAgICAgYXNzZXJ0IChjb3VudCA+PSAwKTsKLSAgICAgIGlmIChmaWxsX3NpemUgJiYgY291bnQpCi0JewotCSAgY2hhciBidWZbMjU2XTsKLQkgIGlmIChmaWxsX3NpemUgPiBzaXplb2YoYnVmKSkKLQkgICAgewotCSAgICAgIC8qIERvIGl0IHRoZSBvbGQgd2F5LiBDYW4gdGhpcyBldmVyIGhhcHBlbj8gKi8KLQkgICAgICB3aGlsZSAoY291bnQtLSkKLQkJewotCQkgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQkJZmlsbF9saXRlcmFsLAotCQkJCQkJKGZpbGVfcHRyKSBvZmZzZXQsCi0JCQkJCQkoYmZkX3NpemVfdHlwZSkgZmlsbF9zaXplKTsKLQkJICBpZiAoeCA9PSBmYWxzZSkKLQkJICAgIHsKLQkJICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0JCSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IHdyaXRlICVzIiksIHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCQkgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotCQkgICAgfQotCQkgIG9mZnNldCArPSBmaWxsX3NpemU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogQnVpbGQgYSBidWZmZXIgZnVsbCBvZiBmaWxsIG9iamVjdHMgYW5kIG91dHB1dCBpdCBhcwotCQkgb2Z0ZW4gYXMgbmVjZXNzYXJ5LiBUaGlzIHNhdmVzIG9uIHRoZSBvdmVyaGVhZCBvZgotCQkgcG90ZW50aWFsbHkgbG90cyBvZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgY2FsbHMuICAqLwotCSAgICAgIGludCBuX3Blcl9idWYsIGk7Ci0JICAgICAgaWYgKGZpbGxfc2l6ZSA9PSAxKQotCQl7Ci0JCSAgbl9wZXJfYnVmID0gc2l6ZW9mIChidWYpOwotCQkgIG1lbXNldCAoYnVmLCAqZmlsbF9saXRlcmFsLCBuX3Blcl9idWYpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqYnVmcDsKLQkJICBuX3Blcl9idWYgPSBzaXplb2YoYnVmKS9maWxsX3NpemU7Ci0JCSAgZm9yIChpID0gbl9wZXJfYnVmLCBidWZwID0gYnVmOyBpOyBpLS0sIGJ1ZnAgKz0gZmlsbF9zaXplKQotCQkgICAgbWVtY3B5KGJ1ZnAsIGZpbGxfbGl0ZXJhbCwgZmlsbF9zaXplKTsKLQkJfQotCSAgICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50IC09IG5fcGVyX2J1ZikKLQkJewotCQkgIG5fcGVyX2J1ZiA9IG5fcGVyX2J1ZiA+IGNvdW50ID8gY291bnQgOiBuX3Blcl9idWY7Ci0JCSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsCi0JCQkJCQlidWYsIChmaWxlX3B0cikgb2Zmc2V0LAotCQkJCQkJKGJmZF9zaXplX3R5cGUpIG5fcGVyX2J1ZiAqIGZpbGxfc2l6ZSk7Ci0JCSAgaWYgKHggIT0gdHJ1ZSkKLQkJICAgIGFzX2ZhdGFsIChfKCJDYW5ub3Qgd3JpdGUgdG8gb3V0cHV0IGZpbGUuIikpOwotCQkgIG9mZnNldCArPSBuX3Blcl9idWYgKiBmaWxsX3NpemU7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkKE9CSl9BT1VUKSkKLXN0YXRpYyB2b2lkCi1tZXJnZV9kYXRhX2ludG9fdGV4dCAoKQotewotI2lmIGRlZmluZWQoQkZEX0FTU0VNQkxFUikgfHwgZGVmaW5lZChNQU5ZX1NFR01FTlRTKQotICBzZWdfaW5mbyAodGV4dF9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfbGFzdC0+ZnJfbmV4dCA9Ci0gICAgc2VnX2luZm8gKGRhdGFfc2VjdGlvbiktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gIHNlZ19pbmZvICh0ZXh0X3NlY3Rpb24pLT5mcmNoYWluUC0+ZnJjaF9sYXN0ID0KLSAgICBzZWdfaW5mbyAoZGF0YV9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfbGFzdDsKLSAgc2VnX2luZm8gKGRhdGFfc2VjdGlvbiktPmZyY2hhaW5QID0gMDsKLSNlbHNlCi0gIGZpeFMgKnRtcDsKLQotICB0ZXh0X2xhc3RfZnJhZy0+ZnJfbmV4dCA9IGRhdGFfZnJhZ19yb290OwotICB0ZXh0X2xhc3RfZnJhZyA9IGRhdGFfbGFzdF9mcmFnOwotICBkYXRhX2xhc3RfZnJhZyA9IE5VTEw7Ci0gIGRhdGFfZnJhZ19yb290ID0gTlVMTDsKLSAgaWYgKHRleHRfZml4X3Jvb3QpCi0gICAgewotICAgICAgZm9yICh0bXAgPSB0ZXh0X2ZpeF9yb290OyB0bXAtPmZ4X25leHQ7IHRtcCA9IHRtcC0+ZnhfbmV4dCk7OwotICAgICAgdG1wLT5meF9uZXh0ID0gZGF0YV9maXhfcm9vdDsKLSAgICAgIHRleHRfZml4X3RhaWwgPSBkYXRhX2ZpeF90YWlsOwotICAgIH0KLSAgZWxzZQotICAgIHRleHRfZml4X3Jvb3QgPSBkYXRhX2ZpeF9yb290OwotICBkYXRhX2ZpeF9yb290ID0gTlVMTDsKLSNlbmRpZgotfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgfHwgKCEgQkZEICYmICEgT0JKX0FPVVQpICovCi0KLSNpZiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKEJGRCkKLXN0YXRpYyB2b2lkCi1yZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMgKCkKLXsKLSAgZnJhZ1MgKmZyYWdQOwotCi0gIHJlbGF4X3NlZ21lbnQgKHRleHRfZnJhZ19yb290LCBTRUdfVEVYVCk7Ci0gIHJlbGF4X3NlZ21lbnQgKGRhdGFfZnJhZ19yb290LCBTRUdfREFUQSk7Ci0gIHJlbGF4X3NlZ21lbnQgKGJzc19mcmFnX3Jvb3QsIFNFR19CU1MpOwotICAvKgotICAgKiBOb3cgdGhlIGFkZHJlc3NlcyBvZiBmcmFncyBhcmUgY29ycmVjdCB3aXRoaW4gdGhlIHNlZ21lbnQuCi0gICAqLwotCi0gIGtub3cgKHRleHRfbGFzdF9mcmFnLT5mcl90eXBlID09IHJzX2ZpbGwgJiYgdGV4dF9sYXN0X2ZyYWctPmZyX29mZnNldCA9PSAwKTsKLSAgSF9TRVRfVEVYVF9TSVpFICgmaGVhZGVycywgdGV4dF9sYXN0X2ZyYWctPmZyX2FkZHJlc3MpOwotICB0ZXh0X2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyA9IEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpOwotCi0gIC8qCi0gICAqIEpvaW4gdGhlIDIgc2VnbWVudHMgaW50byAxIGh1Z2Ugc2VnbWVudC4KLSAgICogVG8gZG8gdGhpcywgcmUtY29tcHV0ZSBldmVyeSBybl9hZGRyZXNzIGluIHRoZSBTRUdfREFUQSBmcmFncy4KLSAgICogVGhlbiBqb2luIHRoZSBkYXRhIGZyYWdzIGFmdGVyIHRoZSB0ZXh0IGZyYWdzLgotICAgKgotICAgKiBEZXRlcm1pbmUgYV9kYXRhIFtsZW5ndGggb2YgZGF0YSBzZWdtZW50XS4KLSAgICovCi0gIGlmIChkYXRhX2ZyYWdfcm9vdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBzbGlkZTsKLQotICAgICAga25vdyAoKHRleHRfbGFzdF9mcmFnLT5mcl90eXBlID09IHJzX2ZpbGwpICYmICh0ZXh0X2xhc3RfZnJhZy0+ZnJfb2Zmc2V0ID09IDApKTsKLQotICAgICAgSF9TRVRfREFUQV9TSVpFICgmaGVhZGVycywgZGF0YV9sYXN0X2ZyYWctPmZyX2FkZHJlc3MpOwotICAgICAgZGF0YV9sYXN0X2ZyYWctPmZyX2FkZHJlc3MgPSBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKTsKLSAgICAgIHNsaWRlID0gSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyk7CS8qICYgaW4gZmlsZSBvZiB0aGUgZGF0YSBzZWdtZW50LiAqLwotI2lmZGVmIE9CSl9CT1VUCi0jZGVmaW5lIFJvdW5kVXAoTixTKSAoKChOKSsoUyktMSkmLShTKSkKLSAgICAgIC8qIEZvciBiLm91dDogSWYgdGhlIGRhdGEgc2VjdGlvbiBoYXMgYSBzdHJpY3QgYWxpZ25tZW50Ci0JIHJlcXVpcmVtZW50LCBpdHMgbG9hZCBhZGRyZXNzIGluIHRoZSAubyBmaWxlIHdpbGwgYmUKLQkgcm91bmRlZCB1cCBmcm9tIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHNlY3Rpb24uICBUaGVzZQotCSB0d28gdmFsdWVzIGFyZSAqbm90KiB0aGUgc2FtZSEgIFNpbWlsYXJseSBmb3IgdGhlIGJzcwotCSBzZWN0aW9uLi4uLiAgKi8KLSAgICAgIHNsaWRlID0gUm91bmRVcCAoc2xpZGUsIDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbU0VHX0RBVEFdKTsKLSNlbmRpZgotCi0gICAgICBmb3IgKGZyYWdQID0gZGF0YV9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCXsKLQkgIGZyYWdQLT5mcl9hZGRyZXNzICs9IHNsaWRlOwotCX0JCQkvKiBmb3IgZWFjaCBkYXRhIGZyYWcgKi8KLQotICAgICAga25vdyAodGV4dF9sYXN0X2ZyYWcgIT0gMCk7Ci0gICAgICB0ZXh0X2xhc3RfZnJhZy0+ZnJfbmV4dCA9IGRhdGFfZnJhZ19yb290OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEhfU0VUX0RBVEFfU0laRSAoJmhlYWRlcnMsIDApOwotICAgIH0KLQotI2lmZGVmIE9CSl9CT1VUCi0gIC8qIFNlZSBhYm92ZSBjb21tZW50cyBvbiBiLm91dCBkYXRhIHNlY3Rpb24gYWRkcmVzcy4gICovCi0gIHsKLSAgICBsb25nIGJzc192bWE7Ci0gICAgaWYgKGRhdGFfbGFzdF9mcmFnID09IDApCi0gICAgICBic3Nfdm1hID0gSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyk7Ci0gICAgZWxzZQotICAgICAgYnNzX3ZtYSA9IGRhdGFfbGFzdF9mcmFnLT5mcl9hZGRyZXNzOwotICAgIGJzc192bWEgPSBSb3VuZFVwIChic3Nfdm1hLCAxIDw8IHNlY3Rpb25fYWxpZ25tZW50W1NFR19CU1NdKTsKLSAgICBic3NfYWRkcmVzc19mcmFnLmZyX2FkZHJlc3MgPSBic3Nfdm1hOwotICB9Ci0jZWxzZSAvKiAhIE9CSl9CT1VUICovCi0gIGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzcyA9IChIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArCi0JCQkJIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpKTsKLQotI2VuZGlmIC8qICEgT0JKX0JPVVQgKi8KLQotICAvKiBTbGlkZSBhbGwgdGhlIGZyYWdzICovCi0gIGlmIChic3NfZnJhZ19yb290KQotICAgIHsKLSAgICAgIHJlbGF4X2FkZHJlc3NUIHNsaWRlID0gYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzOwotCi0gICAgICBmb3IgKGZyYWdQID0gYnNzX2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0JewotCSAgZnJhZ1AtPmZyX2FkZHJlc3MgKz0gc2xpZGU7Ci0JfQkJCS8qIGZvciBlYWNoIGJzcyBmcmFnICovCi0gICAgfQotCi0gIGlmIChic3NfbGFzdF9mcmFnKQotICAgIEhfU0VUX0JTU19TSVpFICgmaGVhZGVycywKLQkJICAgIGJzc19sYXN0X2ZyYWctPmZyX2FkZHJlc3MgLSBic3NfZnJhZ19yb290LT5mcl9hZGRyZXNzKTsKLSAgZWxzZQotICAgIEhfU0VUX0JTU19TSVpFICgmaGVhZGVycywgMCk7Ci19Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICYmICEgQkZEICovCi0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhZGVmaW5lZCAoQkZEKQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQKLXNldF9zeW10YWIgKCkKLXsKLSAgaW50IG5zeW1zOwotICBhc3ltYm9sICoqYXN5bXBwOwotICBzeW1ib2xTICpzeW1wOwotICBib29sZWFuIHJlc3VsdDsKLSAgZXh0ZXJuIFBUUiBiZmRfYWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotCi0gIC8qIENvdW50IHN5bWJvbHMuICBXZSBjYW4ndCByZWx5IG9uIGEgY291bnQgbWFkZSBieSB0aGUgbG9vcCBpbgotICAgICB3cml0ZV9vYmplY3RfZmlsZSwgYmVjYXVzZSAqX2Zyb2JfZmlsZSBtYXkgYWRkIGEgbmV3IHN5bWJvbCBvcgotICAgICB0d28uICAqLwotICBuc3ltcyA9IDA7Ci0gIGZvciAoc3ltcCA9IHN5bWJvbF9yb290UDsgc3ltcDsgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKLSAgICBuc3ltcysrOwotCi0gIGlmIChuc3ltcykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgYXN5bXBwID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAoc3Rkb3V0cHV0LAotCQkJCSAgICAgICBuc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBzeW1wID0gc3ltYm9sX3Jvb3RQOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5zeW1zOyBpKyssIHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0JewotCSAgYXN5bXBwW2ldID0gc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApOwotCSAgc3ltYm9sX21hcmtfd3JpdHRlbiAoc3ltcCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFzeW1wcCA9IDA7Ci0gIHJlc3VsdCA9IGJmZF9zZXRfc3ltdGFiIChzdGRvdXRwdXQsIGFzeW1wcCwgbnN5bXMpOwotICBhc3NlcnQgKHJlc3VsdCA9PSB0cnVlKTsKLSAgc3ltYm9sX3RhYmxlX2Zyb3plbiA9IDE7Ci19Ci0jZW5kaWYKLQotLyogRmluaXNoIHRoZSBzdWJzZWdtZW50cy4gIEFmdGVyIGV2ZXJ5IHN1Yi1zZWdtZW50LCB3ZSBmYWtlIGFuCi0gICAiLmFsaWduIC4uLiIuICBUaGlzIGNvbmZvcm1zIHRvIEJTRDQuMiBicmFuZS1kYW1hZ2UuICBXZSB0aGVuIGZha2UKLSAgICIuZmlsbCAwIiBiZWNhdXNlIHRoYXQgaXMgdGhlIGtpbmQgb2YgZnJhZyB0aGF0IHJlcXVpcmVzIGxlYXN0Ci0gICB0aG91Z2h0LiAgIi5hbGlnbiIgZnJhZ3MgbGlrZSB0byBoYXZlIGEgZm9sbG93aW5nIGZyYWcgc2luY2UgdGhhdAotICAgbWFrZXMgY2FsY3VsYXRpbmcgdGhlaXIgaW50ZW5kZWQgbGVuZ3RoIHRyaXZpYWwuICAqLwotCi0jaWZuZGVmIFNVQl9TRUdNRU5UX0FMSUdOCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpICgwKQotI2Vsc2UKLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAoMikKLSNlbmRpZgotI2VuZGlmCi0KLXZvaWQKLXN1YnNlZ3NfZmluaXNoICgpCi17Ci0gIHN0cnVjdCBmcmNoYWluICpmcmNoYWluUDsKLQotICBmb3IgKGZyY2hhaW5QID0gZnJjaGFpbl9yb290OyBmcmNoYWluUDsgZnJjaGFpblAgPSBmcmNoYWluUC0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIHN1YnNlZ19zZXQgKGZyY2hhaW5QLT5mcmNoX3NlZywgZnJjaGFpblAtPmZyY2hfc3Vic2VnKTsKLQotICAgICAgLyogVGhpcyBub3cgZ2V0cyBjYWxsZWQgZXZlbiBpZiB3ZSBoYWQgZXJyb3JzLiAgSW4gdGhhdCBjYXNlLAotICAgICAgICAgYW55IGFsaWdubWVudCBpcyBtZWFuaW5nbGVzcywgYW5kLCBtb3Jlb3Zlciwgd2lsbCBsb29rIHdlaXJkCi0gICAgICAgICBpZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIGxpc3RpbmcuICAqLwotICAgICAgZnJhZ19hbGlnbiAoaGFkX2Vycm9ycyAoKSA/IDAgOiBTVUJfU0VHTUVOVF9BTElHTiAobm93X3NlZyksCi0JCSAgc3Vic2VnX3RleHRfcCAobm93X3NlZykgPyBOT1BfT1BDT0RFIDogMCwKLQkJICAwKTsKLQotICAgICAgLyogZnJhZ19hbGlnbiB3aWxsIGhhdmUgbGVmdCBhIG5ldyBmcmFnLgotCSBVc2UgdGhpcyBsYXN0IGZyYWcgZm9yIGFuIGVtcHR5ICIuZmlsbCIuCi0KLQkgRm9yIHRoaXMgc2VnbWVudCAuLi4KLQkgQ3JlYXRlIGEgbGFzdCBmcmFnLiBEbyBub3QgbGVhdmUgYSAiYmVpbmcgZmlsbGVkIGluIGZyYWciLiAgKi8KLQotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25vdy0+ZnJfZml4ID0gMDsKLSAgICAgIGtub3cgKGZyYWdfbm93LT5mcl9uZXh0ID09IE5VTEwpOwotICAgIH0KLX0KLQotLyogV3JpdGUgdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotdm9pZAotd3JpdGVfb2JqZWN0X2ZpbGUgKCkKLXsKLSNpZiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICEgZGVmaW5lZCAoV09SS0lOR19ET1RfV09SRCkKLSAgZnJhZ1MgKmZyYWdQOwkJCS8qIFRyYWNrIGFsb25nIGFsbCBmcmFncy4gKi8KLSNlbmRpZgotCi0gIC8qIERvIHdlIHJlYWxseSB3YW50IHRvIHdyaXRlIGl0PyAgKi8KLSAgewotICAgIGludCBuX3dhcm5zLCBuX2VycnM7Ci0gICAgbl93YXJucyA9IGhhZF93YXJuaW5ncyAoKTsKLSAgICBuX2VycnMgPSBoYWRfZXJyb3JzICgpOwotICAgIC8qIFRoZSAtWiBmbGFnIGluZGljYXRlcyB0aGF0IGFuIG9iamVjdCBmaWxlIHNob3VsZCBiZSBnZW5lcmF0ZWQsCi0gICAgICAgcmVnYXJkbGVzcyBvZiB3YXJuaW5ncyBhbmQgZXJyb3JzLiAgKi8KLSAgICBpZiAoZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0KQotICAgICAgewotCWlmIChuX3dhcm5zIHx8IG5fZXJycykKLQkgIGFzX3dhcm4gKF8oIiVkIGVycm9yJXMsICVkIHdhcm5pbmclcywgZ2VuZXJhdGluZyBiYWQgb2JqZWN0IGZpbGUuXG4iKSwKLQkJICAgbl9lcnJzLCBuX2VycnMgPT0gMSA/ICIiIDogInMiLAotCQkgICBuX3dhcm5zLCBuX3dhcm5zID09IDEgPyAiIiA6ICJzIik7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWlmIChuX2VycnMpCi0JICBhc19mYXRhbCAoXygiJWQgZXJyb3IlcywgJWQgd2FybmluZyVzLCBubyBvYmplY3QgZmlsZSBnZW5lcmF0ZWQuXG4iKSwKLQkJICAgIG5fZXJycywgbl9lcnJzID09IDEgPyAiIiA6ICJzIiwKLQkJICAgIG5fd2FybnMsIG5fd2FybnMgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgIH0KLSAgfQotCi0jaWZkZWYJT0JKX1ZNUwotICAvKiBVbmRlciBWTVMgd2UgdHJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBWQVgtMTEgIkMiLiAgVGh1cywgd2UgY2FsbAotICAgICBhIHJvdXRpbmUgdG8gY2hlY2sgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcm9jZWR1cmUgIl9tYWluIiwKLSAgICAgYW5kIGlmIHNvIC0tIGZpeCBpdCB1cCBzbyB0aGF0IGl0IGNhbiBiZSBwcm9ncmFtIGVudHJ5IHBvaW50LiAqLwotICB2bXNfY2hlY2tfZm9yX21haW4gKCk7Ci0jZW5kaWYgLyogT0JKX1ZNUyAqLwotCi0gIC8qIEZyb20gbm93IG9uLCB3ZSBkb24ndCBjYXJlIGFib3V0IHN1Yi1zZWdtZW50cy4gIEJ1aWxkIG9uZSBmcmFnIGNoYWluCi0gICAgIGZvciBlYWNoIHNlZ21lbnQuIExpbmtlZCB0aHJ1IGZyX25leHQuICAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBSZW1vdmUgdGhlIHNlY3Rpb25zIGNyZWF0ZWQgYnkgZ2FzIGZvciBpdHMgb3duIHB1cnBvc2VzLiAgKi8KLSAgewotICAgIGFzZWN0aW9uICoqc2VjbGlzdCwgKnNlYzsKLSAgICBpbnQgaTsKLQotICAgIHNlY2xpc3QgPSAmc3Rkb3V0cHV0LT5zZWN0aW9uczsKLSAgICB3aGlsZSAoc2VjbGlzdCAmJiAqc2VjbGlzdCkKLSAgICAgIHsKLQlzZWMgPSAqc2VjbGlzdDsKLQl3aGlsZSAoc2VjID09IHJlZ19zZWN0aW9uIHx8IHNlYyA9PSBleHByX3NlY3Rpb24pCi0JICB7Ci0JICAgIHNlYyA9IHNlYy0+bmV4dDsKLQkgICAgKnNlY2xpc3QgPSBzZWM7Ci0JICAgIHN0ZG91dHB1dC0+c2VjdGlvbl9jb3VudC0tOwotCSAgICBpZiAoIXNlYykKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoKnNlY2xpc3QpCi0JICBzZWNsaXN0ID0gJigqc2VjbGlzdCktPm5leHQ7Ci0gICAgICB9Ci0gICAgaSA9IDA7Ci0gICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHJlbnVtYmVyX3NlY3Rpb25zLCAmaSk7Ci0gIH0KLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIsIChjaGFyICopIDApOwotI2Vsc2UKLSAgcmVtb3ZlX3N1YnNlZ3MgKGZyY2hhaW5fcm9vdCwgU0VHX1RFWFQsICZ0ZXh0X2ZyYWdfcm9vdCwgJnRleHRfbGFzdF9mcmFnKTsKLSAgcmVtb3ZlX3N1YnNlZ3MgKGRhdGEwX2ZyY2hhaW5QLCBTRUdfREFUQSwgJmRhdGFfZnJhZ19yb290LCAmZGF0YV9sYXN0X2ZyYWcpOwotICByZW1vdmVfc3Vic2VncyAoYnNzMF9mcmNoYWluUCwgU0VHX0JTUywgJmJzc19mcmFnX3Jvb3QsICZic3NfbGFzdF9mcmFnKTsKLSNlbmRpZgotCi0gIC8qIFdlIGhhdmUgdHdvIHNlZ21lbnRzLiBJZiB1c2VyIGdhdmUgLVIgZmxhZywgdGhlbiB3ZSBtdXN0IHB1dCB0aGUKLSAgICAgZGF0YSBmcmFncyBpbnRvIHRoZSB0ZXh0IHNlZ21lbnQuIERvIHRoaXMgYmVmb3JlIHJlbGF4aW5nIHNvCi0gICAgIHdlIGtub3cgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgLVIgYW5kIG1ha2Ugc2hvcnRlciBhZGRyZXNzZXMuICAqLwotI2lmICFkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIG1lcmdlX2RhdGFfaW50b190ZXh0ICgpOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgcmVsYXhfYW5kX3NpemVfc2VnLCAoY2hhciAqKSAwKTsKLSNlbHNlCi0gIHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyAoKTsKLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICAvKgotICAgKgotICAgKiBDcmF3bCB0aGUgc3ltYm9sIGNoYWluLgotICAgKgotICAgKiBGb3IgZWFjaCBzeW1ib2wgd2hvc2UgdmFsdWUgZGVwZW5kcyBvbiBhIGZyYWcsIHRha2UgdGhlIGFkZHJlc3Mgb2YKLSAgICogdGhhdCBmcmFnIGFuZCBzdWJzdW1lIGl0IGludG8gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuCi0gICAqIEFmdGVyIHRoaXMsIHRoZXJlIGlzIGp1c3Qgb25lIHdheSB0byBsb29rdXAgYSBzeW1ib2wgdmFsdWUuCi0gICAqIFZhbHVlcyBhcmUgbGVmdCBpbiB0aGVpciBmaW5hbCBzdGF0ZSBmb3Igb2JqZWN0IGZpbGUgZW1pc3Npb24uCi0gICAqIFdlIGFkanVzdCB0aGUgdmFsdWVzIG9mICdMJyBsb2NhbCBzeW1ib2xzLCBldmVuIGlmIHdlIGRvCi0gICAqIG5vdCBpbnRlbmQgdG8gZW1pdCB0aGVtIHRvIHRoZSBvYmplY3QgZmlsZSwgYmVjYXVzZSB0aGVpciB2YWx1ZXMKLSAgICogYXJlIG5lZWRlZCBmb3IgZml4LXVwcy4KLSAgICoKLSAgICogVW5sZXNzIHdlIHNhdyBhIC1MIGZsYWcsIHJlbW92ZSBhbGwgc3ltYm9scyB0aGF0IGJlZ2luIHdpdGggJ0wnCi0gICAqIGZyb20gdGhlIHN5bWJvbCBjaGFpbi4gIChUaGV5IGFyZSBzdGlsbCBwb2ludGVkIHRvIGJ5IHRoZSBmaXhlcy4pCi0gICAqCi0gICAqIENvdW50IHRoZSByZW1haW5pbmcgc3ltYm9scy4KLSAgICogQXNzaWduIGEgc3ltYm9sIG51bWJlciB0byBlYWNoIHN5bWJvbC4KLSAgICogQ291bnQgdGhlIG51bWJlciBvZiBzdHJpbmctdGFibGUgY2hhcnMgd2Ugd2lsbCBlbWl0LgotICAgKiBQdXQgdGhpcyBpbmZvIGludG8gdGhlIGhlYWRlcnMgYXMgYXBwcm9wcmlhdGUuCi0gICAqCi0gICAqLwotICBrbm93ICh6ZXJvX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzID09IDApOwotICBzdHJpbmdfYnl0ZV9jb3VudCA9IHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpOwotCi0gIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4gKCZoZWFkZXJzKTsKLQotICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPT0gc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpCi0gICAgc3RyaW5nX2J5dGVfY291bnQgPSAwOwotCi0gIEhfU0VUX1NUUklOR19TSVpFICgmaGVhZGVycywgc3RyaW5nX2J5dGVfY291bnQpOwotCi0gIC8qCi0gICAqIEFkZHJlc3NlcyBvZiBmcmFncyBub3cgcmVmbGVjdCBhZGRyZXNzZXMgd2UgdXNlIGluIHRoZSBvYmplY3QgZmlsZS4KLSAgICogU3ltYm9sIHZhbHVlcyBhcmUgY29ycmVjdC4KLSAgICogU2NhbiB0aGUgZnJhZ3MsIGNvbnZlcnRpbmcgYW55ICIub3JnInMgYW5kICIuYWxpZ24icyB0byAiLmZpbGwicy4KLSAgICogQWxzbyBjb252ZXJ0aW5nIGFueSBtYWNoaW5lLWRlcGVuZGVudCBmcmFncyB1c2luZyBtZF9jb252ZXJ0X2ZyYWcoKTsKLSAgICovCi0gIHN1YnNlZ19jaGFuZ2UgKFNFR19URVhULCAwKTsKLQotICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotICAgIHsKLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBsaW5rZWQgYWxsIHRoZSBmcmFncyBpbnRvIGEgc2luZ2xlCi0gICAgICAgICBjaGFpbi4gIEhvd2V2ZXIsIGN2dF9mcmFnX3RvX2ZpbGwgbWF5IGNhbGwgbWRfY29udmVydF9mcmFnCi0gICAgICAgICB3aGljaCBtYXkgY2FsbCBmaXhfbmV3LiAgV2UgbmVlZCB0byBlbnN1cmUgdGhhdCBmaXhfbmV3IGFkZHMKLSAgICAgICAgIHRoZSBmaXh1cCB0byB0aGUgcmlnaHQgc2VjdGlvbi4gICovCi0gICAgICBpZiAoZnJhZ1AgPT0gZGF0YV9mcmFnX3Jvb3QpCi0Jc3Vic2VnX2NoYW5nZSAoU0VHX0RBVEEsIDApOwotCi0gICAgICBjdnRfZnJhZ190b19maWxsICgmaGVhZGVycywgU0VHX1RFWFQsIGZyYWdQKTsKLQotICAgICAgLyogU29tZSBhc3NlcnQgbWFjcm9zIGRvbid0IHdvcmsgd2l0aCAjIGRpcmVjdGl2ZXMgbWl4ZWQgaW4uICAqLwotI2lmbmRlZiBOREVCVUcKLSAgICAgIGlmICghKGZyYWdQLT5mcl9uZXh0ID09IE5VTEwKLSNpZmRlZiBPQkpfQk9VVAotCSAgICB8fCBmcmFnUC0+ZnJfbmV4dCA9PSBkYXRhX2ZyYWdfcm9vdAotI2VuZGlmCi0JICAgIHx8ICgoZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnUC0+ZnJfYWRkcmVzcykKLQkJPT0gKGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfb2Zmc2V0ICogZnJhZ1AtPmZyX3ZhcikpKSkKLQlhYm9ydCAoKTsKLSNlbmRpZgotICAgIH0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0gIHsKLSAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKmxpZTsKLSAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKipwcmV2UDsKLQotICAgIHByZXZQID0gJmJyb2tlbl93b3JkczsKLSAgICBmb3IgKGxpZSA9IGJyb2tlbl93b3JkczsgbGllOyBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCi0gICAgICBpZiAoIWxpZS0+YWRkZWQpCi0JewotCSAgZXhwcmVzc2lvblMgZXhwOwotCi0JICBzdWJzZWdfY2hhbmdlIChsaWUtPnNlZywgbGllLT5zdWJzZWcpOwotCSAgZXhwLlhfb3AgPSBPX3N1YnRyYWN0OwotCSAgZXhwLlhfYWRkX3N5bWJvbCA9IGxpZS0+YWRkOwotCSAgZXhwLlhfb3Bfc3ltYm9sID0gbGllLT5zdWI7Ci0JICBleHAuWF9hZGRfbnVtYmVyID0gbGllLT5hZGRudW07Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIFRDX0NPTlNfRklYX05FVwotCSAgVENfQ09OU19GSVhfTkVXIChsaWUtPmZyYWcsCi0JCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkgICAgICAgMiwgJmV4cCk7Ci0jZWxzZQotCSAgZml4X25ld19leHAgKGxpZS0+ZnJhZywKLQkJICAgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAyLCAmZXhwLCAwLCBCRkRfUkVMT0NfMTYpOwotI2VuZGlmCi0jZWxzZQotI2lmIGRlZmluZWQoVENfU1BBUkMpIHx8IGRlZmluZWQoVENfQTI5SykgfHwgZGVmaW5lZChORUVEX0ZYX1JfVFlQRSkKLQkgIGZpeF9uZXdfZXhwIChsaWUtPmZyYWcsCi0JCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkgICAgICAgMiwgJmV4cCwgMCwgTk9fUkVMT0MpOwotI2Vsc2UKLSNpZmRlZiBUQ19OUzMySwotCSAgZml4X25ld19uczMya19leHAgKGxpZS0+ZnJhZywKLQkJCSAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgMiwgJmV4cCwgMCwgMCwgMiwgMCwgMCk7Ci0jZWxzZQotCSAgZml4X25ld19leHAgKGxpZS0+ZnJhZywKLQkJICAgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAyLCAmZXhwLCAwLCAwKTsKLSNlbmRpZiAvKiBUQ19OUzMySyAqLwotI2VuZGlmIC8qIFRDX1NQQVJDfFRDX0EyOUt8TkVFRF9GWF9SX1RZUEUgKi8KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0JICAqcHJldlAgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQ7Ci0JfQotICAgICAgZWxzZQotCXByZXZQID0gJihsaWUtPm5leHRfYnJva2VuX3dvcmQpOwotCi0gICAgZm9yIChsaWUgPSBicm9rZW5fd29yZHM7IGxpZTspCi0gICAgICB7Ci0Jc3RydWN0IGJyb2tlbl93b3JkICp1bnRydXRoOwotCWNoYXIgKnRhYmxlX3B0cjsKLQlhZGRyZXNzVCB0YWJsZV9hZGRyOwotCWFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLQlpbnQgbiwgbTsKLQotCXN1YnNlZ19jaGFuZ2UgKGxpZS0+c2VnLCBsaWUtPnN1YnNlZyk7Ci0JZnJhZ1AgPSBsaWUtPmRpc3BmcmFnOwotCi0JLyogRmluZCBvdXQgaG93IG1hbnkgYnJva2VuX3dvcmRzIGdvIGhlcmUuICAqLwotCW4gPSAwOwotCWZvciAodW50cnV0aCA9IGxpZTsgdW50cnV0aCAmJiB1bnRydXRoLT5kaXNwZnJhZyA9PSBmcmFnUDsgdW50cnV0aCA9IHVudHJ1dGgtPm5leHRfYnJva2VuX3dvcmQpCi0JICBpZiAodW50cnV0aC0+YWRkZWQgPT0gMSkKLQkgICAgbisrOwotCi0JdGFibGVfcHRyID0gbGllLT5kaXNwZnJhZy0+ZnJfb3Bjb2RlOwotCXRhYmxlX2FkZHIgPSBsaWUtPmRpc3BmcmFnLT5mcl9hZGRyZXNzICsgKHRhYmxlX3B0ciAtIGxpZS0+ZGlzcGZyYWctPmZyX2xpdGVyYWwpOwotCS8qIENyZWF0ZSB0aGUganVtcCBhcm91bmQgdGhlIGxvbmcganVtcHMuICBUaGlzIGlzIGEgc2hvcnQKLQkgICBqdW1wIGZyb20gdGFibGVfcHRyKzAgdG8gdGFibGVfcHRyK24qbG9uZ19qdW1wX3NpemUuICAqLwotCWZyb21fYWRkciA9IHRhYmxlX2FkZHI7Ci0JdG9fYWRkciA9IHRhYmxlX2FkZHIgKyBtZF9zaG9ydF9qdW1wX3NpemUgKyBuICogbWRfbG9uZ19qdW1wX3NpemU7Ci0JbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHRhYmxlX3B0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBsaWUtPmRpc3BmcmFnLCBsaWUtPmFkZCk7Ci0JdGFibGVfcHRyICs9IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQl0YWJsZV9hZGRyICs9IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQotCWZvciAobSA9IDA7IGxpZSAmJiBsaWUtPmRpc3BmcmFnID09IGZyYWdQOyBtKyssIGxpZSA9IGxpZS0+bmV4dF9icm9rZW5fd29yZCkKLQkgIHsKLQkgICAgaWYgKGxpZS0+YWRkZWQgPT0gMikKLQkgICAgICBjb250aW51ZTsKLQkgICAgLyogUGF0Y2ggdGhlIGp1bXAgdGFibGUgKi8KLQkgICAgLyogVGhpcyBpcyB0aGUgb2Zmc2V0IGZyb20gPz8/IHRvIHRhYmxlX3B0ciswICovCi0JICAgIHRvX2FkZHIgPSB0YWJsZV9hZGRyIC0gU19HRVRfVkFMVUUgKGxpZS0+c3ViKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgIHRvX2FkZHIgLT0gc3ltYm9sX2dldF9mcmFnIChsaWUtPnN1YiktPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaWUtPndvcmRfZ29lc19oZXJlLCB0b19hZGRyLCAyKTsKLQkgICAgZm9yICh1bnRydXRoID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkOyB1bnRydXRoICYmIHVudHJ1dGgtPmRpc3BmcmFnID09IGZyYWdQOyB1bnRydXRoID0gdW50cnV0aC0+bmV4dF9icm9rZW5fd29yZCkKLQkgICAgICB7Ci0JCWlmICh1bnRydXRoLT51c2VfanVtcCA9PSBsaWUpCi0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh1bnRydXRoLT53b3JkX2dvZXNfaGVyZSwgdG9fYWRkciwgMik7Ci0JICAgICAgfQotCi0JICAgIC8qIEluc3RhbGwgdGhlIGxvbmcganVtcCAqLwotCSAgICAvKiB0aGlzIGlzIGEgbG9uZyBqdW1wIGZyb20gdGFibGVfcHRyKzAgdG8gdGhlIGZpbmFsIHRhcmdldCAqLwotCSAgICBmcm9tX2FkZHIgPSB0YWJsZV9hZGRyOwotCSAgICB0b19hZGRyID0gU19HRVRfVkFMVUUgKGxpZS0+YWRkKSArIGxpZS0+YWRkbnVtOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgdG9fYWRkciArPSBzeW1ib2xfZ2V0X2ZyYWcgKGxpZS0+YWRkKS0+ZnJfYWRkcmVzczsKLSNlbmRpZgotCSAgICBtZF9jcmVhdGVfbG9uZ19qdW1wICh0YWJsZV9wdHIsIGZyb21fYWRkciwgdG9fYWRkciwgbGllLT5kaXNwZnJhZywgbGllLT5hZGQpOwotCSAgICB0YWJsZV9wdHIgKz0gbWRfbG9uZ19qdW1wX3NpemU7Ci0JICAgIHRhYmxlX2FkZHIgKz0gbWRfbG9uZ19qdW1wX3NpemU7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSNlbmRpZiAvKiBub3QgV09SS0lOR19ET1RfV09SRCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZm5kZWYJT0JKX1ZNUwotICB7CQkJCS8qIG5vdCB2bXMgKi8KLSAgICBjaGFyICp0aGVfb2JqZWN0X2ZpbGU7Ci0gICAgbG9uZyBvYmplY3RfZmlsZV9zaXplOwotICAgIC8qCi0gICAgICogU2NhbiBldmVyeSBGaXhTIHBlcmZvcm1pbmcgZml4dXBzLiBXZSBoYWQgdG8gd2FpdCB1bnRpbCBub3cgdG8gZG8KLSAgICAgKiB0aGlzIGJlY2F1c2UgbWRfY29udmVydF9mcmFnKCkgbWF5IGhhdmUgbWFkZSBzb21lIGZpeFNzLgotICAgICAqLwotICAgIGludCB0cnNpemUsIGRyc2l6ZTsKLQotICAgIHN1YnNlZ19jaGFuZ2UgKFNFR19URVhULCAwKTsKLSAgICB0cnNpemUgPSBtZF9yZWxvY19zaXplICogZml4dXBfc2VnbWVudCAodGV4dF9maXhfcm9vdCwgU0VHX1RFWFQpOwotICAgIHN1YnNlZ19jaGFuZ2UgKFNFR19EQVRBLCAwKTsKLSAgICBkcnNpemUgPSBtZF9yZWxvY19zaXplICogZml4dXBfc2VnbWVudCAoZGF0YV9maXhfcm9vdCwgU0VHX0RBVEEpOwotICAgIEhfU0VUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMsIHRyc2l6ZSwgZHJzaXplKTsKLQotICAgIC8qIEZJWE1FIG1vdmUgdGhpcyBzdHVmZiBpbnRvIHRoZSBwcmUtd3JpdGUtaG9vayAqLwotICAgIEhfU0VUX01BR0lDX05VTUJFUiAoJmhlYWRlcnMsIG1hZ2ljX251bWJlcl9mb3Jfb2JqZWN0X2ZpbGUpOwotICAgIEhfU0VUX0VOVFJZX1BPSU5UICgmaGVhZGVycywgMCk7Ci0KLSAgICBvYmpfcHJlX3dyaXRlX2hvb2sgKCZoZWFkZXJzKTsJLyogZXh0cmEgY29mZiBzdHVmZiAqLwotCi0gICAgb2JqZWN0X2ZpbGVfc2l6ZSA9IEhfR0VUX0ZJTEVfU0laRSAoJmhlYWRlcnMpOwotICAgIG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgPSB0aGVfb2JqZWN0X2ZpbGUgPSB4bWFsbG9jIChvYmplY3RfZmlsZV9zaXplKTsKLQotICAgIG91dHB1dF9maWxlX2NyZWF0ZSAob3V0X2ZpbGVfbmFtZSk7Ci0KLSAgICBvYmpfaGVhZGVyX2FwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsICZoZWFkZXJzKTsKLQotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSBIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCBjb2RlLgotICAgICAqLwotICAgIGZvciAoZnJhZ1AgPSB0ZXh0X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgICB7Ci0JcmVnaXN0ZXIgbG9uZyBjb3VudDsKLQlyZWdpc3RlciBjaGFyICpmaWxsX2xpdGVyYWw7Ci0JcmVnaXN0ZXIgbG9uZyBmaWxsX3NpemU7Ci0KLQlQUk9HUkVTUyAoMSk7Ci0Ja25vdyAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfZmlsbCk7Ci0JYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZnJhZ1AtPmZyX2xpdGVyYWwsICh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfZml4KTsKLQlmaWxsX2xpdGVyYWwgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXg7Ci0JZmlsbF9zaXplID0gZnJhZ1AtPmZyX3ZhcjsKLQlrbm93IChmcmFnUC0+ZnJfb2Zmc2V0ID49IDApOwotCi0JZm9yIChjb3VudCA9IGZyYWdQLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCSAgewotCSAgICBhcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBmaWxsX2xpdGVyYWwsICh1bnNpZ25lZCBsb25nKSBmaWxsX3NpemUpOwotCSAgfQkJCS8qIGZvciBlYWNoICAqLwotCi0gICAgICB9CQkJCS8qIGZvciBlYWNoIGNvZGUgZnJhZy4gKi8KLQotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCByZWxvY2F0aW9ucy4KLSAgICAgKi8KLSAgICBvYmpfZW1pdF9yZWxvY2F0aW9ucyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIHRleHRfZml4X3Jvb3QsIChyZWxheF9hZGRyZXNzVCkgMCk7Ci0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykpKTsKLSNpZmRlZiBUQ19JOTYwCi0gICAgLyogTWFrZSBhZGRyZXNzZXMgaW4gZGF0YSByZWxvY2F0aW9uIGRpcmVjdGl2ZXMgcmVsYXRpdmUgdG8gYmVnaW5uaW5nIG9mCi0gICAgICogZmlyc3QgZGF0YSBmcmFnbWVudCwgbm90IGVuZCBvZiBsYXN0IHRleHQgZnJhZ21lbnQ6ICBhbGlnbm1lbnQgb2YgdGhlCi0gICAgICogc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCBtYXkgcGxhY2UgYSBnYXAgYmV0d2VlbiB0aGUgc2VnbWVudHMuCi0gICAgICovCi0gICAgb2JqX2VtaXRfcmVsb2NhdGlvbnMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBkYXRhX2ZpeF9yb290LCBkYXRhMF9mcmNoYWluUC0+ZnJjaF9yb290LT5mcl9hZGRyZXNzKTsKLSNlbHNlIC8qIFRDX0k5NjAgKi8KLSAgICBvYmpfZW1pdF9yZWxvY2F0aW9ucyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGRhdGFfZml4X3Jvb3QsIHRleHRfbGFzdF9mcmFnLT5mcl9hZGRyZXNzKTsKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCBsaW5lIG51bWJlciBlbnRyaWVzLgotICAgICAqLwotICAgIE9CSl9FTUlUX0xJTkVOTyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGxpbmVub19yb290UCwgdGhlX29iamVjdF9maWxlKTsKLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9MSU5FTk9fU0laRSAoJmhlYWRlcnMpKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgc3ltYm9scy4KLSAgICAgKi8KLSAgICBvYmpfZW1pdF9zeW1ib2xzICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgc3ltYm9sX3Jvb3RQKTsKLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9MSU5FTk9fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUgKCZoZWFkZXJzKSkpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IHN0cmluZ3MuCi0gICAgICovCi0KLSAgICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPiAwKQotICAgICAgewotCW9ial9lbWl0X3N0cmluZ3MgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQKTsKLSAgICAgIH0JCQkJLyogb25seSBpZiB3ZSBoYXZlIGEgc3RyaW5nIHRhYmxlICovCi0KLSNpZmRlZiBCRkRfSEVBREVSUwotICAgIGJmZF9zZWVrIChzdGRvdXRwdXQsIDAsIDApOwotICAgIGJmZF93cml0ZSAodGhlX29iamVjdF9maWxlLCAxLCBvYmplY3RfZmlsZV9zaXplLCBzdGRvdXRwdXQpOwotI2Vsc2UKLQotICAgIC8qIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBmaWxlICovCi0gICAgb3V0cHV0X2ZpbGVfYXBwZW5kICh0aGVfb2JqZWN0X2ZpbGUsIG9iamVjdF9maWxlX3NpemUsIG91dF9maWxlX25hbWUpOwotICAgIGZyZWUgKHRoZV9vYmplY3RfZmlsZSk7Ci0jZW5kaWYKLSAgfQkJCQkvKiBub24gdm1zIG91dHB1dCAqLwotI2Vsc2UgLyogT0JKX1ZNUyAqLwotICAvKgotICAgKglOb3cgZG8gdGhlIFZNUy1kZXBlbmRlbnQgcGFydCBvZiB3cml0aW5nIHRoZSBvYmplY3QgZmlsZQotICAgKi8KLSAgdm1zX3dyaXRlX29iamVjdF9maWxlIChIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSwKLQkJCSBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSwKLQkJCSBIX0dFVF9CU1NfU0laRSAoJmhlYWRlcnMpLAotCQkJIHRleHRfZnJhZ19yb290LCBkYXRhX2ZyYWdfcm9vdCk7Ci0jZW5kaWYgLyogT0JKX1ZNUyAqLwotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0gIC8qIFJlc29sdmUgc3ltYm9sIHZhbHVlcy4gIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgcHJvY2Vzc2luZwotICAgICB0aGUgcmVsb2NhdGlvbnMuICAqLwotICBpZiAoc3ltYm9sX3Jvb3RQKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bXA7Ci0KLSAgICAgIGZvciAoc3ltcCA9IHN5bWJvbF9yb290UDsgc3ltcDsgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKLQlyZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltcCwgMSk7Ci0gICAgfQotICByZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMgKCk7Ci0KLSAgUFJPR1JFU1MgKDEpOwotCi0jaWZkZWYgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLSAgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLSAgb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpOwotI2VuZGlmCi0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGFkanVzdF9yZWxvY19zeW1zLCAoY2hhciAqKTApOwotCi0gIC8qIFNldCB1cCBzeW1ib2wgdGFibGUsIGFuZCB3cml0ZSBpdCBvdXQuICAqLwotICBpZiAoc3ltYm9sX3Jvb3RQKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bXA7Ci0KLSAgICAgIGZvciAoc3ltcCA9IHN5bWJvbF9yb290UDsgc3ltcDsgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKLQl7Ci0JICBpbnQgcHVudCA9IDA7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBpZiAoc3ltYm9sX21yaV9jb21tb25fcCAoc3ltcCkpCi0JICAgIHsKLQkgICAgICBpZiAoU19JU19FWFRFUk5BTCAoc3ltcCkpCi0JCWFzX2JhZCAoXygiJXM6IGdsb2JhbCBzeW1ib2xzIG5vdCBzdXBwb3J0ZWQgaW4gY29tbW9uIHNlY3Rpb25zIiksCi0JCQlTX0dFVF9OQU1FIChzeW1wKSk7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltcCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgbmFtZSA9IFNfR0VUX05BTUUgKHN5bXApOwotCSAgaWYgKG5hbWUpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lMiA9IGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lICgoY2hhciAqKVNfR0VUX05BTUUgKHN5bXApKTsKLQkgICAgICAvKiBUaGV5IG9ubHkgZGlmZmVyIGlmIGBuYW1lJyBpcyBhIGZiIG9yIGRvbGxhciBsb2NhbAotCQkgbGFiZWwgbmFtZS4gICovCi0JICAgICAgaWYgKG5hbWUyICE9IG5hbWUgJiYgISBTX0lTX0RFRklORUQgKHN5bXApKQotCQlhc19iYWQgKF8oImxvY2FsIGxhYmVsICVzIGlzIG5vdCBkZWZpbmVkIiksIG5hbWUyKTsKLQkgICAgfQotCi0JICAvKiBEbyBpdCBhZ2FpbiwgYmVjYXVzZSBhZGp1c3RfcmVsb2Nfc3ltcyBtaWdodCBpbnRyb2R1Y2UKLQkgICAgIG1vcmUgc3ltYm9scy4gIFRoZXknbGwgcHJvYmFibHkgb25seSBiZSBzZWN0aW9uIHN5bWJvbHMsCi0JICAgICBidXQgdGhleSdsbCBzdGlsbCBuZWVkIHRvIGhhdmUgdGhlIHZhbHVlcyBjb21wdXRlZC4gICovCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltcCwgMSk7Ci0KLQkgIC8qIFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gdW5kZWZpbmVkIG9yIGNvbW1vbgotICAgICAgICAgICAgIHN5bWJvbHMuICAqLwotCSAgaWYgKHN5bWJvbF9lcXVhdGVkX3AgKHN5bXApCi0JICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1wKSB8fCBTX0lTX0NPTU1PTiAoc3ltcCkpKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltcCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogU28gZmFyLCBjb21tb24gc3ltYm9scyBoYXZlIGJlZW4gdHJlYXRlZCBsaWtlIHVuZGVmaW5lZCBzeW1ib2xzLgotCSAgICAgUHV0IHRoZW0gaW4gdGhlIGNvbW1vbiBzZWN0aW9uIG5vdy4gICovCi0JICBpZiAoU19JU19ERUZJTkVEIChzeW1wKSA9PSAwCi0JICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bXApICE9IDApCi0JICAgIFNfU0VUX1NFR01FTlQgKHN5bXAsIGJmZF9jb21fc2VjdGlvbl9wdHIpOwotI2lmIDAKLQkgIHByaW50ZiAoInN5bWJvbCBgJXMnXG5cdEAleDogdmFsdWU9JWQgZmxhZ3M9JXggc2VnPSVzXG4iLAotCQkgIFNfR0VUX05BTUUgKHN5bXApLCBzeW1wLAotCQkgIFNfR0VUX1ZBTFVFIChzeW1wKSwKLQkJICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzLAotCQkgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltcCkpKTsKLSNlbmRpZgotCi0jaWZkZWYgb2JqX2Zyb2Jfc3ltYm9sCi0JICBvYmpfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnQpOwotI2VuZGlmCi0jaWZkZWYgdGNfZnJvYl9zeW1ib2wKLQkgIGlmICghIHB1bnQgfHwgc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCAoc3ltcCkpCi0JICAgIHRjX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KTsKLSNlbmRpZgotCi0JICAvKiBJZiB3ZSBkb24ndCB3YW50IHRvIGtlZXAgdGhpcyBzeW1ib2wsIHNwbGljZSBpdCBvdXQgb2YKLQkgICAgIHRoZSBjaGFpbiBub3cuICBJZiBFTUlUX1NFQ1RJT05fU1lNQk9MUyBpcyAwLCB3ZSBuZXZlcgotCSAgICAgd2FudCBzZWN0aW9uIHN5bWJvbHMuICBPdGhlcndpc2UsIHdlIHNraXAgbG9jYWwgc3ltYm9scwotCSAgICAgYW5kIHN5bWJvbHMgdGhhdCB0aGUgZnJvYl9zeW1ib2wgbWFjcm9zIHRvbGQgdXMgdG8gcHVudCwKLQkgICAgIGJ1dCB3ZSBrZWVwIHN1Y2ggc3ltYm9scyBpZiB0aGV5IGFyZSB1c2VkIGluIHJlbG9jcy4gICovCi0JICBpZiAoKCEgRU1JVF9TRUNUSU9OX1NZTUJPTFMKLQkgICAgICAgJiYgc3ltYm9sX3NlY3Rpb25fcCAoc3ltcCkpCi0JICAgICAgLyogTm90ZSB0aGF0IFNfSVNfRVhURVJOIGFuZCBTX0lTX0xPQ0FMIGFyZSBub3QgYWx3YXlzCi0JCSBvcHBvc2l0ZXMuICBTb21ldGltZXMgdGhlIGZvcm1lciBjaGVja3MgZmxhZ3MgYW5kIHRoZQotCQkgbGF0dGVyIGV4YW1pbmVzIHRoZSBuYW1lLi4uICAqLwotCSAgICAgIHx8ICghU19JU19FWFRFUk4gKHN5bXApCi0JCSAgJiYgKFNfSVNfTE9DQUwgKHN5bXApIHx8IHB1bnQpCi0JCSAgJiYgISBzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChzeW1wKSkpCi0JICAgIHsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1wLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICAvKiBBZnRlciBzeW1ib2xfcmVtb3ZlLCBzeW1ib2xfbmV4dChzeW1wKSBzdGlsbCByZXR1cm5zCi0JCSB0aGUgb25lIHRoYXQgY2FtZSBhZnRlciBpdCBpbiB0aGUgY2hhaW4uICBTbyB3ZSBkb24ndAotCQkgbmVlZCB0byBkbyBhbnkgZXh0cmEgY2xlYW51cCB3b3JrIGhlcmUuICAqLwotCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHdlIHJlYWxseSBnb3QgYSB2YWx1ZSBmb3IgdGhlIHN5bWJvbC4gICovCi0JICBpZiAoISBzeW1ib2xfcmVzb2x2ZWRfcCAoc3ltcCkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImNhbid0IHJlc29sdmUgdmFsdWUgZm9yIHN5bWJvbCBcIiVzXCIiKSwKLQkJICAgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCSAgICAgIHN5bWJvbF9tYXJrX3Jlc29sdmVkIChzeW1wKTsKLQkgICAgfQotCi0JICAvKiBTZXQgdGhlIHZhbHVlIGludG8gdGhlIEJGRCBzeW1ib2wuICBVcCB0aWwgbm93IHRoZSB2YWx1ZQotCSAgICAgaGFzIG9ubHkgYmVlbiBrZXB0IGluIHRoZSBnYXMgc3ltYm9sUyBzdHJ1Y3QuICAqLwotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT52YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW1wKTsKLQl9Ci0gICAgfQotCi0gIFBST0dSRVNTICgxKTsKLQotICAvKiBOb3cgZG8gYW55IGZvcm1hdC1zcGVjaWZpYyBhZGp1c3RtZW50cyB0byB0aGUgc3ltYm9sIHRhYmxlLCBzdWNoCi0gICAgIGFzIGFkZGluZyBmaWxlIHN5bWJvbHMuICAqLwotI2lmZGVmIHRjX2FkanVzdF9zeW10YWIKLSAgdGNfYWRqdXN0X3N5bXRhYiAoKTsKLSNlbmRpZgotI2lmZGVmIG9ial9hZGp1c3Rfc3ltdGFiCi0gIG9ial9hZGp1c3Rfc3ltdGFiICgpOwotI2VuZGlmCi0KLSAgLyogTm93IHRoYXQgYWxsIHRoZSBzaXplcyBhcmUga25vd24sIGFuZCBjb250ZW50cyBjb3JyZWN0LCB3ZSBjYW4KLSAgICAgc3RhcnQgd3JpdGluZyB0byB0aGUgZmlsZS4gICovCi0gIHNldF9zeW10YWIgKCk7Ci0KLSAgLyogSWYgKl9mcm9iX2ZpbGUgY2hhbmdlcyB0aGUgc3ltYm9sIHZhbHVlIGF0IHRoaXMgcG9pbnQsIGl0IGlzCi0gICAgIHJlc3BvbnNpYmxlIGZvciBtb3ZpbmcgdGhlIGNoYW5nZWQgdmFsdWUgaW50byBzeW1wLT5ic3ltLT52YWx1ZQotICAgICBhcyB3ZWxsLiAgSG9wZWZ1bGx5IGFsbCBzeW1ib2wgdmFsdWUgY2hhbmdpbmcgY2FuIGJlIGRvbmUgaW4KLSAgICAgKl9mcm9iX3N5bWJvbC4gICovCi0jaWZkZWYgdGNfZnJvYl9maWxlCi0gIHRjX2Zyb2JfZmlsZSAoKTsKLSNlbmRpZgotI2lmZGVmIG9ial9mcm9iX2ZpbGUKLSAgb2JqX2Zyb2JfZmlsZSAoKTsKLSNlbmRpZgotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCB3cml0ZV9yZWxvY3MsIChjaGFyICopIDApOwotCi0jaWZkZWYgdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotICB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLSAgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCk7Ci0jZW5kaWYKLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgd3JpdGVfY29udGVudHMsIChjaGFyICopIDApOwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLX0KLSNlbmRpZiAvKiAhIEJGRCAqLwotCi0vKgotICoJCQlyZWxheF9zZWdtZW50KCkKLSAqCi0gKiBOb3cgd2UgaGF2ZSBhIHNlZ21lbnQsIG5vdCBhIGNyb3dkIG9mIHN1Yi1zZWdtZW50cywgd2UgY2FuIG1ha2UgZnJfYWRkcmVzcwotICogdmFsdWVzLgotICoKLSAqIFJlbGF4IHRoZSBmcmFncy4KLSAqCi0gKiBBZnRlciB0aGlzLCBhbGwgZnJhZ3MgaW4gdGhpcyBzZWdtZW50IGhhdmUgYWRkcmVzc2VzIHRoYXQgYXJlIGNvcnJlY3QKLSAqIHdpdGhpbiB0aGUgc2VnbWVudC4gU2luY2Ugc2VnbWVudHMgbGl2ZSBpbiBkaWZmZXJlbnQgZmlsZSBhZGRyZXNzZXMsCi0gKiB0aGVzZSBmcmFnIGFkZHJlc3NlcyBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIGZpbmFsIG9iamVjdC1maWxlIGFkZHJlc3Nlcy4KLSAqLwotCi0jaWZkZWYgVENfR0VORVJJQ19SRUxBWF9UQUJMRQotCi1zdGF0aWMgaW50IGlzX2RucmFuZ2UgUEFSQU1TICgoZnJhZ1MgKiwgZnJhZ1MgKikpOwotCi0vKiBTdWJyb3V0aW5lcyBvZiByZWxheF9zZWdtZW50LiAgKi8KLXN0YXRpYyBpbnQKLWlzX2RucmFuZ2UgKGYxLCBmMikKLSAgICAgZnJhZ1MgKmYxOwotICAgICBmcmFnUyAqZjI7Ci17Ci0gIGZvciAoOyBmMTsgZjEgPSBmMS0+ZnJfbmV4dCkKLSAgICBpZiAoZjEtPmZyX25leHQgPT0gZjIpCi0gICAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJlbGF4IGEgZnJhZ21lbnQgYnkgc2Nhbm5pbmcgVENfR0VORVJJQ19SRUxBWF9UQUJMRS4gICovCi0KLWxvbmcKLXJlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKQotICAgICBmcmFnUyAqZnJhZ1A7Ci0gICAgIGxvbmcgc3RyZXRjaDsKLXsKLSAgY29uc3QgcmVsYXhfdHlwZVMgKnRoaXNfdHlwZTsKLSAgY29uc3QgcmVsYXhfdHlwZVMgKnN0YXJ0X3R5cGU7Ci0gIHJlbGF4X3N1YnN0YXRlVCBuZXh0X3N0YXRlOwotICByZWxheF9zdWJzdGF0ZVQgdGhpc19zdGF0ZTsKLSAgbG9uZyBhaW0sIHRhcmdldCwgZ3Jvd3RoOwotICBzeW1ib2xTICpzeW1ib2xQID0gZnJhZ1AtPmZyX3N5bWJvbDsKLSAgbG9uZyBvZmZzZXQgPSBmcmFnUC0+ZnJfb2Zmc2V0OwotICAvKiBSZWNvbXB1dGUgd2FzX2FkZHJlc3MgYnkgdW5kb2luZyAiKz0gc3RyZXRjaCIgZG9uZSBieSByZWxheF9zZWdtZW50LiAgKi8KLSAgdW5zaWduZWQgbG9uZyB3YXNfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzIC0gc3RyZXRjaDsKLSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3M7Ci0gIGNvbnN0IHJlbGF4X3R5cGVTICp0YWJsZSA9IFRDX0dFTkVSSUNfUkVMQVhfVEFCTEU7Ci0KLSAgdGhpc19zdGF0ZSA9IGZyYWdQLT5mcl9zdWJ0eXBlOwotICBzdGFydF90eXBlID0gdGhpc190eXBlID0gdGFibGUgKyB0aGlzX3N0YXRlOwotICB0YXJnZXQgPSBvZmZzZXQ7Ci0KLSAgaWYgKHN5bWJvbFApCi0gICAgewotI2lmbmRlZiBESUZGX0VYUFJfT0sKLSNpZiAhZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gICAgICBrbm93ICgoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0FCU09MVVRFKQotCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0RBVEEpCi0JICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQlNTKQotCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX1RFWFQpKTsKLSNlbmRpZgotICAgICAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyk7Ci0jZW5kaWYKLSAgICAgIGtub3cgKCEoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgfHwgc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgdGFyZ2V0ICs9CVNfR0VUX1ZBTFVFIChzeW1ib2xQKSArIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX2FkZHJlc3M7Ci0KLSAgICAgIC8qIElmIGZyYWcgaGFzIHlldCB0byBiZSByZWFjaGVkIG9uIHRoaXMgcGFzcywKLQkgYXNzdW1lIGl0IHdpbGwgbW92ZSBieSBTVFJFVENIIGp1c3QgYXMgd2UgZGlkLgotCSBJZiB0aGlzIGlzIG5vdCBzbywgaXQgd2lsbCBiZSBiZWNhdXNlIHNvbWUgZnJhZwotCSBiZXR3ZWVuIGdyb3dzLCBhbmQgdGhhdCB3aWxsIGZvcmNlIGFub3RoZXIgcGFzcy4KLQotCSBCZXdhcmUgemVyby1sZW5ndGggZnJhZ3MuCi0KLQkgVGhlcmUgc2hvdWxkIGJlIGEgZmFzdGVyIHdheSB0byBkbyB0aGlzLiAgKi8KLQotICAgICAgaWYgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX2FkZHJlc3MgPj0gd2FzX2FkZHJlc3MKLQkgICYmIGlzX2RucmFuZ2UgKGZyYWdQLCBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApKSkKLQl7Ci0JICB0YXJnZXQgKz0gc3RyZXRjaDsKLQl9Ci0gICAgfQotCi0gIGFpbSA9IHRhcmdldCAtIGFkZHJlc3MgLSBmcmFnUC0+ZnJfZml4OwotI2lmZGVmIFRDX1BDUkVMX0FESlVTVAotICAvKiBDdXJyZW50bHkgb25seSB0aGUgbnMzMmsgZmFtaWx5IG5lZWRzIHRoaXMgKi8KLSAgYWltICs9IFRDX1BDUkVMX0FESlVTVChmcmFnUCk7Ci0vKiNlbHNlKi8KLSAgLyogVGhpcyBtYWNoaW5lIGRvZXNuJ3Qgd2FudCB0byB1c2UgcGNyZWxfYWRqdXN0LgotICAgICBJbiB0aGF0IGNhc2UsIHBjcmVsX2FkanVzdCBzaG91bGQgYmUgemVyby4gICovCi0vKiAgYXNzZXJ0IChmcmFnUC0+ZnJfdGFyZy5uczMyay5wY3JlbF9hZGp1c3QgPT0gMCk7Ki8KLSNlbmRpZgotI2lmZGVmIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiAvKiBmb3JtZXJseSBjYWxsZWQgTTY4S19BSU1fS0xVREdFICovCi0gIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiAoZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKTsKLSNlbmRpZgotCi0gIGlmIChhaW0gPCAwKQotICAgIHsKLSAgICAgIC8qIExvb2sgYmFja3dhcmRzLiAqLwotICAgICAgZm9yIChuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsgbmV4dF9zdGF0ZTspCi0JaWYgKGFpbSA+PSB0aGlzX3R5cGUtPnJseF9iYWNrd2FyZCkKLQkgIG5leHRfc3RhdGUgPSAwOwotCWVsc2UKLQkgIHsKLQkgICAgLyogR3JvdyB0byBuZXh0IHN0YXRlLiAqLwotCSAgICB0aGlzX3N0YXRlID0gbmV4dF9zdGF0ZTsKLQkgICAgdGhpc190eXBlID0gdGFibGUgKyB0aGlzX3N0YXRlOwotCSAgICBuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsKLQkgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBMb29rIGZvcndhcmRzLiAqLwotICAgICAgZm9yIChuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsgbmV4dF9zdGF0ZTspCi0JaWYgKGFpbSA8PSB0aGlzX3R5cGUtPnJseF9mb3J3YXJkKQotCSAgbmV4dF9zdGF0ZSA9IDA7Ci0JZWxzZQotCSAgewotCSAgICAvKiBHcm93IHRvIG5leHQgc3RhdGUuICovCi0JICAgIHRoaXNfc3RhdGUgPSBuZXh0X3N0YXRlOwotCSAgICB0aGlzX3R5cGUgPSB0YWJsZSArIHRoaXNfc3RhdGU7Ci0JICAgIG5leHRfc3RhdGUgPSB0aGlzX3R5cGUtPnJseF9tb3JlOwotCSAgfQotICAgIH0KLQotICBncm93dGggPSB0aGlzX3R5cGUtPnJseF9sZW5ndGggLSBzdGFydF90eXBlLT5ybHhfbGVuZ3RoOwotICBpZiAoZ3Jvd3RoICE9IDApCi0gICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSB0aGlzX3N0YXRlOwotICByZXR1cm4gZ3Jvd3RoOwotfQotCi0jZW5kaWYgLyogZGVmaW5lZCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSkgKi8KLQotLyogUmVsYXhfYWxpZ24uIEFkdmFuY2UgbG9jYXRpb24gY291bnRlciB0byBuZXh0IGFkZHJlc3MgdGhhdCBoYXMgJ2FsaWdubWVudCcKLSAgIGxvd2VzdCBvcmRlciBiaXRzIGFsbCAwcywgcmV0dXJuIHNpemUgb2YgYWRqdXN0bWVudCBtYWRlLiAgKi8KLXN0YXRpYyByZWxheF9hZGRyZXNzVAotcmVsYXhfYWxpZ24gKGFkZHJlc3MsIGFsaWdubWVudCkKLSAgICAgcmVnaXN0ZXIgcmVsYXhfYWRkcmVzc1QgYWRkcmVzczsJLyogQWRkcmVzcyBub3cuICovCi0gICAgIHJlZ2lzdGVyIGludCBhbGlnbm1lbnQ7CS8qIEFsaWdubWVudCAoYmluYXJ5KS4gKi8KLXsKLSAgcmVsYXhfYWRkcmVzc1QgbWFzazsKLSAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7Ci0KLSAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOwotICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOwotI2lmZGVmIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLSAgaWYgKGxpbmtyZWxheCkKLSAgICAvKiBXZSBtdXN0IHByb3ZpZGUgbG90cyBvZiBwYWRkaW5nLCBzbyB0aGUgbGlua2VyIGNhbiBkaXNjYXJkIGl0Ci0gICAgICAgd2hlbiBuZWVkZWQuICBUaGUgbGlua2VyIHdpbGwgbm90IGFkZCBleHRyYSBzcGFjZSwgZXZlci4gICovCi0gICAgbmV3X2FkZHJlc3MgKz0gKDEgPDwgYWxpZ25tZW50KTsKLSNlbmRpZgotICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Ci19Ci0KLXZvaWQKLXJlbGF4X3NlZ21lbnQgKHNlZ21lbnRfZnJhZ19yb290LCBzZWdtZW50KQotICAgICBzdHJ1Y3QgZnJhZyAqc2VnbWVudF9mcmFnX3Jvb3Q7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGZyYWcgKmZyYWdQOwotICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwotI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAga25vdyAoc2VnbWVudCA9PSBTRUdfREFUQSB8fCBzZWdtZW50ID09IFNFR19URVhUIHx8IHNlZ21lbnQgPT0gU0VHX0JTUyk7Ci0jZW5kaWYKLSAgLyogSW4gY2FzZSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpIHdhbnRzIHRvIG1ha2UgZml4U3MuICovCi0gIHN1YnNlZ19jaGFuZ2UgKHNlZ21lbnQsIDApOwotCi0gIC8qIEZvciBlYWNoIGZyYWcgaW4gc2VnbWVudDogY291bnQgYW5kIHN0b3JlICAoYSAxc3QgZ3Vlc3Mgb2YpCi0gICAgIGZyX2FkZHJlc3MuICAqLwotICBhZGRyZXNzID0gMDsKLSAgZm9yIChmcmFnUCA9IHNlZ21lbnRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICBmcmFnUC0+ZnJfYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICBhZGRyZXNzICs9IGZyYWdQLT5mcl9maXg7Ci0KLSAgICAgIHN3aXRjaCAoZnJhZ1AtPmZyX3R5cGUpCi0JewotCWNhc2UgcnNfZmlsbDoKLQkgIGFkZHJlc3MgKz0gZnJhZ1AtPmZyX29mZnNldCAqIGZyYWdQLT5mcl92YXI7Ci0JICBicmVhazsKLQotCWNhc2UgcnNfYWxpZ246Ci0JY2FzZSByc19hbGlnbl9jb2RlOgotCSAgewotCSAgICBhZGRyZXNzVCBvZmZzZXQgPSByZWxheF9hbGlnbiAoYWRkcmVzcywgKGludCkgZnJhZ1AtPmZyX29mZnNldCk7Ci0KLQkgICAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlICE9IDAgJiYgb2Zmc2V0ID4gZnJhZ1AtPmZyX3N1YnR5cGUpCi0JICAgICAgb2Zmc2V0ID0gMDsKLQotCSAgICBpZiAob2Zmc2V0ICUgZnJhZ1AtPmZyX3ZhciAhPSAwKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJhbGlnbm1lbnQgcGFkZGluZyAoJWx1IGJ5dGVzKSBub3QgYSBtdWx0aXBsZSBvZiAlbGQiKSwKLQkJCSh1bnNpZ25lZCBsb25nKSBvZmZzZXQsIChsb25nKSBmcmFnUC0+ZnJfdmFyKTsKLQkJb2Zmc2V0IC09IChvZmZzZXQgJSBmcmFnUC0+ZnJfdmFyKTsKLQkgICAgICB9Ci0KLQkgICAgYWRkcmVzcyArPSBvZmZzZXQ7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgcnNfb3JnOgotCWNhc2UgcnNfc3BhY2U6Ci0JICAvKiBBc3N1bWUgLm9yZyBpcyBudWdhdG9yeS4gSXQgd2lsbCBncm93IHdpdGggMXN0IHJlbGF4LiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkgIGFkZHJlc3MgKz0gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLQkgIC8qIEJyb2tlbiB3b3JkcyBkb24ndCBjb25jZXJuIHVzIHlldCAqLwotCWNhc2UgcnNfYnJva2VuX3dvcmQ6Ci0JICBicmVhazsKLSNlbmRpZgotCi0JY2FzZSByc19sZWIxMjg6Ci0JICAvKiBJbml0aWFsIGd1ZXNzIGlzIGFsd2F5cyAxOyBkb2luZyBvdGhlcndpc2UgY2FuIHJlc3VsdCBpbiAKLQkgICAgIHN0YWJsZSBzb2x1dGlvbnMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0uICAqLwotCSAgYWRkcmVzcyArPSBmcmFnUC0+ZnJfb2Zmc2V0ID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSByc19jZmE6Ci0JICBhZGRyZXNzICs9IGVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3R5cGUpOwotCSAgYnJlYWs7Ci0JfQkJCS8qIHN3aXRjaChmcl90eXBlKSAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggZnJhZyBpbiB0aGUgc2VnbWVudCAqLwotCi0gIC8qIERvIHJlbGF4KCkuICAqLwotICB7Ci0gICAgbG9uZyBzdHJldGNoOwkvKiBNYXkgYmUgYW55IHNpemUsIDAgb3IgbmVnYXRpdmUuICovCi0gICAgLyogQ3VtdWxhdGl2ZSBudW1iZXIgb2YgYWRkcmVzc2VzIHdlIGhhdmUgKi8KLSAgICAvKiByZWxheGVkIHRoaXMgcGFzcy4gKi8KLSAgICAvKiBXZSBtYXkgaGF2ZSByZWxheGVkIG1vcmUgdGhhbiBvbmUgYWRkcmVzcy4gKi8KLSAgICBsb25nIHN0cmV0Y2hlZDsJLyogSGF2ZSB3ZSBzdHJldGNoZWQgb24gdGhpcyBwYXNzPyAqLwotICAgIC8qIFRoaXMgaXMgJ2N1eiBzdHJldGNoIG1heSBiZSB6ZXJvLCB3aGVuLCBpbiBmYWN0IHNvbWUgcGllY2Ugb2YgY29kZQotICAgICAgIGdyZXcsIGFuZCBhbm90aGVyIHNocmFuay4gIElmIGEgYnJhbmNoIGluc3RydWN0aW9uIGRvZXNuJ3QgZml0IGFueW1vcmUsCi0gICAgICAgd2UgY291bGQgYmUgc2Nyb2QuICAqLwotCi0gICAgZG8KLSAgICAgIHsKLQlzdHJldGNoID0gc3RyZXRjaGVkID0gMDsKLQlmb3IgKGZyYWdQID0gc2VnbWVudF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCSAgewotCSAgICBsb25nIGdyb3d0aCA9IDA7Ci0JICAgIGFkZHJlc3NUIHdhc19hZGRyZXNzOwotCSAgICBvZmZzZXRUIG9mZnNldDsKLQkgICAgc3ltYm9sUyAqc3ltYm9sUDsKLQotCSAgICB3YXNfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzOwotCSAgICBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKz0gc3RyZXRjaDsKLQkgICAgc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7Ci0JICAgIG9mZnNldCA9IGZyYWdQLT5mcl9vZmZzZXQ7Ci0KLQkgICAgc3dpdGNoIChmcmFnUC0+ZnJfdHlwZSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSByc19maWxsOgkvKiAuZmlsbCBuZXZlciByZWxheGVzLiAqLwotCQlncm93dGggPSAwOwotCQlicmVhazsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0JCS8qIEpGOiAgVGhpcyBpcyBSTVMncyBpZGVhLiAgSSBkbyAqTk9UKiB3YW50IHRvIGJlIGJsYW1lZAotCQkgICBmb3IgaXQgSSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdC4gIEkgZG8gbm90IHdhbnQgdG8gaGF2ZQotCQkgICBhbnl0aGluZyB0byBkbyB3aXRoIGl0LiAgVGhpcyBpcyBub3QgdGhlIHByb3BlciB3YXkgdG8KLQkJICAgaW1wbGVtZW50IHRoaXMgbWlzZmVhdHVyZS4gICovCi0JICAgICAgY2FzZSByc19icm9rZW5fd29yZDoKLQkJewotCQkgIHN0cnVjdCBicm9rZW5fd29yZCAqbGllOwotCQkgIHN0cnVjdCBicm9rZW5fd29yZCAqdW50cnV0aDsKLQotCQkgIC8qIFllcyB0aGlzIGlzIHVnbHkgKHN0b3JpbmcgdGhlIGJyb2tlbl93b3JkIHBvaW50ZXIKLQkJICAgICBpbiB0aGUgc3ltYm9sIHNsb3QpLiAgU3RpbGwsIHRoaXMgd2hvbGUgY2h1bmsgb2YKLQkJICAgICBjb2RlIGlzIHVnbHksIGFuZCBJIGRvbid0IGZlZWwgbGlrZSBkb2luZyBhbnl0aGluZwotCQkgICAgIGFib3V0IGl0LiAgVGhpbmsgb2YgaXQgYXMgc3R1YmJvcm5uZXNzIGluIGFjdGlvbi4gICovCi0JCSAgZ3Jvd3RoID0gMDsKLQkJICBmb3IgKGxpZSA9IChzdHJ1Y3QgYnJva2VuX3dvcmQgKikgKGZyYWdQLT5mcl9zeW1ib2wpOwotCQkgICAgICAgbGllICYmIGxpZS0+ZGlzcGZyYWcgPT0gZnJhZ1A7Ci0JCSAgICAgICBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCi0JCSAgICB7Ci0KLQkJICAgICAgaWYgKGxpZS0+YWRkZWQpCi0JCQljb250aW51ZTsKLQotCQkgICAgICBvZmZzZXQgPSAoc3ltYm9sX2dldF9mcmFnIChsaWUtPmFkZCktPmZyX2FkZHJlc3MKLQkJCQkrIFNfR0VUX1ZBTFVFIChsaWUtPmFkZCkKLQkJCQkrIGxpZS0+YWRkbnVtCi0JCQkJLSAoc3ltYm9sX2dldF9mcmFnIChsaWUtPnN1YiktPmZyX2FkZHJlc3MKLQkJCQkgICArIFNfR0VUX1ZBTFVFIChsaWUtPnN1YikpKTsKLQkJICAgICAgaWYgKG9mZnNldCA8PSAtMzI3NjggfHwgb2Zmc2V0ID49IDMyNzY3KQotCQkJewotCQkJICBpZiAoZmxhZ193YXJuX2Rpc3BsYWNlbWVudCkKLQkJCSAgICB7Ci0JCQkgICAgICBjaGFyIGJ1Zls1MF07Ci0JCQkgICAgICBzcHJpbnRfdmFsdWUgKGJ1ZiwgKGFkZHJlc3NUKSBsaWUtPmFkZG51bSk7Ci0JCQkgICAgICBhc193YXJuIChfKCIud29yZCAlcy0lcyslcyBkaWRuJ3QgZml0IiksCi0JCQkJICAgICAgIFNfR0VUX05BTUUgKGxpZS0+YWRkKSwKLQkJCQkgICAgICAgU19HRVRfTkFNRSAobGllLT5zdWIpLAotCQkJCSAgICAgICBidWYpOwotCQkJICAgIH0KLQkJCSAgbGllLT5hZGRlZCA9IDE7Ci0JCQkgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwKQotCQkJICAgIHsKLQkJCSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlKys7Ci0JCQkgICAgICBncm93dGggKz0gbWRfc2hvcnRfanVtcF9zaXplOwotCQkJICAgIH0KLQkJCSAgZm9yICh1bnRydXRoID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkOwotCQkJICAgICAgIHVudHJ1dGggJiYgdW50cnV0aC0+ZGlzcGZyYWcgPT0gbGllLT5kaXNwZnJhZzsKLQkJCSAgICAgICB1bnRydXRoID0gdW50cnV0aC0+bmV4dF9icm9rZW5fd29yZCkKLQkJCSAgICBpZiAoKHN5bWJvbF9nZXRfZnJhZyAodW50cnV0aC0+YWRkKQotCQkJCSA9PSBzeW1ib2xfZ2V0X2ZyYWcgKGxpZS0+YWRkKSkKLQkJCQkmJiAoU19HRVRfVkFMVUUgKHVudHJ1dGgtPmFkZCkKLQkJCQkgICAgPT0gU19HRVRfVkFMVUUgKGxpZS0+YWRkKSkpCi0JCQkgICAgICB7Ci0JCQkJdW50cnV0aC0+YWRkZWQgPSAyOwotCQkJCXVudHJ1dGgtPnVzZV9qdW1wID0gbGllOwotCQkJICAgICAgfQotCQkJICBncm93dGggKz0gbWRfbG9uZ19qdW1wX3NpemU7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBicmVhazsKLQkJfQkJLyogY2FzZSByc19icm9rZW5fd29yZCAqLwotI2VuZGlmCi0JICAgICAgY2FzZSByc19hbGlnbjoKLQkgICAgICBjYXNlIHJzX2FsaWduX2NvZGU6Ci0JCXsKLQkJICBhZGRyZXNzVCBvbGRvZmYsIG5ld29mZjsKLQotCQkgIG9sZG9mZiA9IHJlbGF4X2FsaWduICh3YXNfYWRkcmVzcyArIGZyYWdQLT5mcl9maXgsCi0JCQkJCShpbnQpIG9mZnNldCk7Ci0JCSAgbmV3b2ZmID0gcmVsYXhfYWxpZ24gKGFkZHJlc3MgKyBmcmFnUC0+ZnJfZml4LAotCQkJCQkoaW50KSBvZmZzZXQpOwotCi0JCSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvbGRvZmYgPiBmcmFnUC0+ZnJfc3VidHlwZSkKLQkJCW9sZG9mZiA9IDA7Ci0JCSAgICAgIGlmIChuZXdvZmYgPiBmcmFnUC0+ZnJfc3VidHlwZSkKLQkJCW5ld29mZiA9IDA7Ci0JCSAgICB9Ci0KLQkJICBncm93dGggPSBuZXdvZmYgLSBvbGRvZmY7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHJzX29yZzoKLQkJewotCQkgIGxvbmcgdGFyZ2V0ID0gb2Zmc2V0OwotCQkgIGxvbmcgYWZ0ZXI7Ci0KLQkJICBpZiAoc3ltYm9sUCkKLQkJICAgIHsKLSNpZiAhZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0JCSAgICAgIGtub3cgKChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQUJTT0xVVEUpCi0JCQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKQotCQkJICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfVEVYVCkKLQkJCSAgICB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQlNTKTsKLQkJICAgICAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyk7Ci0JCSAgICAgIGtub3cgKCEoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0FCU09MVVRFKQotCQkJICAgIHx8IChzeW1ib2xQLT5zeV9mcmFnID09ICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotI2VuZGlmCi0JCSAgICAgIHRhcmdldCArPSAoU19HRVRfVkFMVUUgKHN5bWJvbFApCi0JCQkJICsgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfYWRkcmVzcyk7Ci0JCSAgICB9CQkvKiBpZiB3ZSBoYXZlIGEgc3ltYm9sICovCi0KLQkJICBrbm93IChmcmFnUC0+ZnJfbmV4dCk7Ci0JCSAgYWZ0ZXIgPSBmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzczsKLQkJICBncm93dGggPSB0YXJnZXQgLSBhZnRlcjsKLQkJICBpZiAoZ3Jvd3RoIDwgMCkKLQkJICAgIHsKLQkJICAgICAgLyogR3Jvd3RoIG1heSBiZSBuZWdhdGl2ZSwgYnV0IHZhcmlhYmxlIHBhcnQgb2YgZnJhZwotCQkJIGNhbm5vdCBoYXZlIGZld2VyIHRoYW4gMCBjaGFycy4gIFRoYXQgaXMsIHdlIGNhbid0Ci0JCQkgLm9yZyBiYWNrd2FyZHMuICovCi0JCSAgICAgIGFzX2JhZF93aGVyZSAoZnJhZ1AtPmZyX2ZpbGUsIGZyYWdQLT5mcl9saW5lLAotCQkJCSAgICBfKCJhdHRlbXB0IHRvIC5vcmcgYmFja3dhcmRzIGlnbm9yZWQiKSk7Ci0KLQkJICAgICAgLyogV2UndmUgaXNzdWVkIGFuIGVycm9yIG1lc3NhZ2UuICBDaGFuZ2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnJhZyB0byBhdm9pZCBjYXNjYWRpbmcgZXJyb3JzLiAgKi8KLQkJICAgICAgZnJhZ1AtPmZyX3R5cGUgPSByc19hbGlnbjsKLQkJICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAwOwotCQkgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ID0gMDsKLQkJICAgICAgZnJhZ1AtPmZyX2ZpeCA9IGFmdGVyIC0gYWRkcmVzczsKLQkJICAgICAgZ3Jvd3RoID0gc3RyZXRjaDsKLQkJICAgIH0KLQotCQkgIGdyb3d0aCAtPSBzdHJldGNoOwkvKiBUaGlzIGlzIGFuIGFic29sdXRlIGdyb3d0aCBmYWN0b3IgKi8KLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgY2FzZSByc19zcGFjZToKLQkJaWYgKHN5bWJvbFApCi0JCSAgewotCQkgICAgZ3Jvd3RoID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCQkgICAgaWYgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgIT0gJnplcm9fYWRkcmVzc19mcmFnCi0JCQl8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkKLQkJCXx8ICEgU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkJICAgICAgYXNfYmFkX3doZXJlIChmcmFnUC0+ZnJfZmlsZSwgZnJhZ1AtPmZyX2xpbmUsCi0JCQkJICAgIF8oIi5zcGFjZSBzcGVjaWZpZXMgbm9uLWFic29sdXRlIHZhbHVlIikpOwotCQkgICAgZnJhZ1AtPmZyX3N5bWJvbCA9IDA7Ci0JCSAgICBpZiAoZ3Jvd3RoIDwgMCkKLQkJICAgICAgewotCQkJYXNfd2FybiAoXygiLnNwYWNlIG9yIC5maWxsIHdpdGggbmVnYXRpdmUgdmFsdWUsIGlnbm9yZWQiKSk7Ci0JCQlncm93dGggPSAwOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgZ3Jvd3RoID0gMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotI2lmZGVmIG1kX3JlbGF4X2ZyYWcKLQkJZ3Jvd3RoID0gbWRfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOwotI2Vsc2UKLSNpZmRlZiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFCi0JCS8qIFRoZSBkZWZhdWx0IHdheSB0byByZWxheCBhIGZyYWcgaXMgdG8gbG9vayB0aHJvdWdoCi0JCSAgIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUuICAqLwotCQlncm93dGggPSByZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCk7Ci0jZW5kaWYgLyogVENfR0VORVJJQ19SRUxBWF9UQUJMRSAqLwotI2VuZGlmCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSByc19sZWIxMjg6Ci0JCXsKLQkJICB2YWx1ZVQgdmFsdWU7Ci0JCSAgaW50IHNpemU7Ci0KLQkJICB2YWx1ZSA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmcmFnUC0+ZnJfc3ltYm9sLCAwKTsKLQkJICBzaXplID0gc2l6ZW9mX2xlYjEyOCAodmFsdWUsIGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQkJICBncm93dGggPSBzaXplIC0gZnJhZ1AtPmZyX29mZnNldDsKLQkJICBmcmFnUC0+ZnJfb2Zmc2V0ID0gc2l6ZTsKLQkJfQotCQlicmVhazsKLQotCSAgICAgIGNhc2UgcnNfY2ZhOgotCQlncm93dGggPSBlaF9mcmFtZV9yZWxheF9mcmFnIChmcmFnUCk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJQkFEX0NBU0UgKGZyYWdQLT5mcl90eXBlKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoZ3Jvd3RoKQotCSAgICAgIHsKLQkJc3RyZXRjaCArPSBncm93dGg7Ci0JCXN0cmV0Y2hlZCsrOwotCSAgICAgIH0KLQkgIH0JCQkvKiBGb3IgZWFjaCBmcmFnIGluIHRoZSBzZWdtZW50LiAqLwotICAgICAgfQotICAgIHdoaWxlIChzdHJldGNoZWQpOwkJLyogVW50aWwgbm90aGluZyBmdXJ0aGVyIHRvIHJlbGF4LiAqLwotICB9CQkJCS8qIGRvX3JlbGF4ICovCi0KLSAgLyoKLSAgICogV2Ugbm93IGhhdmUgdmFsaWQgZnJfYWRkcmVzcydlcyBmb3IgZWFjaCBmcmFnLgotICAgKi8KLQotICAvKgotICAgKiBBbGwgZnJfYWRkcmVzcydzIGFyZSBjb3JyZWN0LCByZWxhdGl2ZSB0byB0aGVpciBvd24gc2VnbWVudC4KLSAgICogV2UgaGF2ZSBtYWRlIGFsbCB0aGUgZml4UyB3ZSB3aWxsIGV2ZXIgbWFrZS4KLSAgICovCi19CQkJCS8qIHJlbGF4X3NlZ21lbnQoKSAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChPQkpfVk1TKSkKLQotI2lmbmRlZiBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAKLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKFgpICgxKQotI2VuZGlmCi0KLS8qIGZpeHVwX3NlZ21lbnQoKQotCi0gICBHbyB0aHJvdWdoIGFsbCB0aGUgZml4UydzIGluIGEgc2VnbWVudCBhbmQgc2VlIHdoaWNoIG9uZXMgY2FuIGJlCi0gICBoYW5kbGVkIG5vdy4gIChUaGVzZSBjb25zaXN0IG9mIGZpeFMgd2hlcmUgd2UgaGF2ZSBzaW5jZSBkaXNjb3ZlcmVkCi0gICB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIG9yIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFnIGludm9sdmVkLikKLSAgIEZvciBlYWNoIG9uZSwgY2FsbCBtZF9hcHBseV9maXggdG8gcHV0IHRoZSBmaXggaW50byB0aGUgZnJhZyBkYXRhLgotCi0gICBSZXN1bHQgaXMgYSBjb3VudCBvZiBob3cgbWFueSByZWxvY2F0aW9uIHN0cnVjdHMgd2lsbCBiZSBuZWVkZWQgdG8KLSAgIGhhbmRsZSB0aGUgcmVtYWluaW5nIGZpeFMncyB0aGF0IHdlIGNvdWxkbid0IGNvbXBsZXRlbHkgaGFuZGxlIGhlcmUuCi0gICBUaGVzZSB3aWxsIGJlIG91dHB1dCBsYXRlciBieSBlbWl0X3JlbG9jYXRpb25zKCkuICAqLwotCi1zdGF0aWMgbG9uZwotZml4dXBfc2VnbWVudCAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZpeFMgKmZpeFA7Ci0gICAgIHNlZ1QgdGhpc19zZWdtZW50X3R5cGU7CS8qIE5fVFlQRSBiaXRzIGZvciBzZWdtZW50LiAqLwotewotICBsb25nIHNlZ19yZWxvY19jb3VudCA9IDA7Ci0gIHN5bWJvbFMgKmFkZF9zeW1ib2xQOwotICBzeW1ib2xTICpzdWJfc3ltYm9sUDsKLSAgdmFsdWVUIGFkZF9udW1iZXI7Ci0gIGludCBzaXplOwotICBjaGFyICpwbGFjZTsKLSAgbG9uZyB3aGVyZTsKLSAgaW50IHBjcmVsLCBwbHQ7Ci0gIGZyYWdTICpmcmFnUDsKLSAgc2VnVCBhZGRfc3ltYm9sX3NlZ21lbnQgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCi0gIC8qIElmIHRoZSBsaW5rZXIgaXMgZG9pbmcgdGhlIHJlbGF4aW5nLCB3ZSBtdXN0IG5vdCBkbyBhbnkgZml4dXBzLgotCi0gICAgIFdlbGwsIHN0cmljdGx5IHNwZWFraW5nIHRoYXQncyBub3QgdHJ1ZSAtLSB3ZSBjb3VsZCBkbyBhbnkgdGhhdCBhcmUKLSAgICAgUEMtcmVsYXRpdmUgYW5kIGRvbid0IGNyb3NzIHJlZ2lvbnMgdGhhdCBjb3VsZCBjaGFuZ2Ugc2l6ZS4gIEFuZCBmb3IgdGhlCi0gICAgIGk5NjAgKHRoZSBvbmx5IG1hY2hpbmUgZm9yIHdoaWNoIHdlJ3ZlIGdvdCBhIHJlbGF4aW5nIGxpbmtlciByaWdodCBub3cpLAotICAgICB3ZSBtaWdodCBiZSBhYmxlIHRvIHR1cm4gY2FsbHgvY2FsbGogaW50byBiYWwgYW55d2F5cyBpbiBjYXNlcyB3aGVyZSB3ZQotICAgICBrbm93IHRoZSBtYXhpbXVtIGRpc3BsYWNlbWVudC4gICovCi0gIGlmIChsaW5rcmVsYXgpCi0gICAgewotICAgICAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotCXNlZ19yZWxvY19jb3VudCsrOwotICAgICAgVENfQURKVVNUX1JFTE9DX0NPVU5UIChmaXhQLCBzZWdfcmVsb2NfY291bnQpOwotICAgICAgcmV0dXJuIHNlZ19yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLQotI2lmZGVmIERFQlVHNQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5wcm9jZXNzaW5nIGZpeHVwOlxuIik7Ci0gICAgICBwcmludF9maXh1cCAoZml4UCk7Ci0jZW5kaWYKLQotCi0gICAgICBmcmFnUCA9IGZpeFAtPmZ4X2ZyYWc7Ci0gICAgICBrbm93IChmcmFnUCk7Ci0gICAgICB3aGVyZSA9IGZpeFAtPmZ4X3doZXJlOwotICAgICAgcGxhY2UgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOwotICAgICAgc2l6ZSA9IGZpeFAtPmZ4X3NpemU7Ci0gICAgICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5OwotI2lmZGVmIFRDX1ZBTElEQVRFX0ZJWAotICAgICAgVENfVkFMSURBVEVfRklYIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSwgc2tpcCk7Ci0jZW5kaWYKLSAgICAgIHN1Yl9zeW1ib2xQID0gZml4UC0+Znhfc3Vic3k7Ci0gICAgICBhZGRfbnVtYmVyID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKLSAgICAgIHBsdCA9IGZpeFAtPmZ4X3BsdDsKLQotICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwKLQkgICYmIHN5bWJvbF9tcmlfY29tbW9uX3AgKGFkZF9zeW1ib2xQKSkKLQl7Ci0JICBrbm93IChhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JICBmaXhQLT5meF9vZmZzZXQgPSBhZGRfbnVtYmVyOwotCSAgYWRkX3N5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSA9Ci0JICAgIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoYWRkX3N5bWJvbFApLT5YX2FkZF9zeW1ib2w7Ci0JfQotCi0gICAgICBpZiAoYWRkX3N5bWJvbFApCi0JYWRkX3N5bWJvbF9zZWdtZW50ID0gU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbFApOwotCi0gICAgICBpZiAoc3ViX3N5bWJvbFApCi0JewotCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN1Yl9zeW1ib2xQLCAxKTsKLQkgIGlmIChhZGRfc3ltYm9sUCA9PSBOVUxMIHx8IGFkZF9zeW1ib2xfc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwpCi0JCXsKLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JCSAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogSXQncyBqdXN0IC1zeW0gKi8KLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pCi0JCXsKLQkJICBhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSBOVUxMOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocGNyZWwKLQkJICAgICAgICYmIFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSB0aGlzX3NlZ21lbnRfdHlwZSkKLQkJewotCQkgIC8qIFNob3VsZCB0cnkgY29udmVydGluZyB0byBhIGNvbnN0YW50LiAgKi8KLQkJICBnb3RvIGJhZF9zdWJfcmVsb2M7Ci0JCX0KLQkgICAgICBlbHNlCi0JICAgICAgYmFkX3N1Yl9yZWxvYzoKLQkJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgICAgXygiTmVnYXRpdmUgb2Ygbm9uLWFic29sdXRlIHN5bWJvbCAlcyIpLAotCQkJICAgICAgU19HRVRfTkFNRSAoc3ViX3N5bWJvbFApKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFkZF9zeW1ib2xfc2VnbWVudAotCQkgICAmJiBTRUdfTk9STUFMIChhZGRfc3ltYm9sX3NlZ21lbnQpKQotCSAgICB7Ci0JICAgICAgLyogRGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMgZnJvbSBzYW1lIHNlZ21lbnQuCi0JCSBDYW4ndCBtYWtlIGRpZmZlcmVuY2Ugb2YgMiB1bmRlZmluZWRzOiAndmFsdWUnIG1lYW5zCi0JCSBzb21ldGhpbmcgZGlmZmVyZW50IGZvciBOX1VOREYuICovCi0jaWZkZWYgVENfSTk2MAotCSAgICAgIC8qIE1ha2VzIG5vIHNlbnNlIHRvIHVzZSB0aGUgZGlmZmVyZW5jZSBvZiAyIGFyYml0cmFyeSBzeW1ib2xzCi0JCSBhcyB0aGUgdGFyZ2V0IG9mIGEgY2FsbCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKGZpeFAtPmZ4X3RjYml0KQotCQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgICBfKCJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIDIgc3ltYm9scyIpKTsKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0JICAgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApIC0KLQkJU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQotCSAgICAgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQkgICAgICBwY3JlbCA9IDA7CS8qIE5vIGZ1cnRoZXIgcGNyZWwgcHJvY2Vzc2luZy4gKi8KLQotCSAgICAgIC8qIExldCB0aGUgdGFyZ2V0IG1hY2hpbmUgbWFrZSB0aGUgZmluYWwgZGV0ZXJtaW5hdGlvbgotCQkgYXMgdG8gd2hldGhlciBvciBub3QgYSByZWxvY2F0aW9uIHdpbGwgYmUgbmVlZGVkIHRvCi0JCSBoYW5kbGUgdGhpcyBmaXh1cC4gICovCi0JICAgICAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04gKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKSkKLQkJewotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMDsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIERpZmZlcmVudCBzZWdtZW50cyBpbiBzdWJ0cmFjdGlvbi4gKi8KLQkgICAgICBrbm93ICghKFNfSVNfRVhURVJOQUwgKHN1Yl9zeW1ib2xQKQotCQkgICAgICAmJiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKSk7Ci0KLQkgICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLQkJYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCi0jaWZkZWYgRElGRl9FWFBSX09LCi0JICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IHRoaXNfc2VnbWVudF90eXBlCi0jaWYgMCAvKiBEbyB0aGlzIGV2ZW4gaWYgaXQncyBhbHJlYWR5IGRlc2NyaWJlZCBhcyBwYy1yZWxhdGl2ZS4gIEZvciBleGFtcGxlLAotCSBvbiB0aGUgbTY4aywgYW4gb3BlcmFuZCBvZiAicGNAKGZvby0uLTIpIiBzaG91bGQgYWRkcmVzcyAiZm9vIiBpbiBhCi0JIHBjLXJlbGF0aXZlIG1vZGUuICAqLwotCQkgICAgICAgJiYgcGNyZWwKLSNlbmRpZgotCQkgICAgICAgKQotCQl7Ci0JCSAgLyogTWFrZSBpdCBwYy1yZWxhdGl2ZS4gICovCi0JCSAgYWRkX251bWJlciArPSAoTURfUENSRUxfRlJPTV9TRUNUSU9OIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSkKLQkJCQkgLSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApKTsKLQkJICBwY3JlbCA9IDE7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAxOwotCQkgIHN1Yl9zeW1ib2xQID0gMDsKLQkJICBmaXhQLT5meF9zdWJzeSA9IDA7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0JICAgICAgLyogVGhlIFBBIG5lZWRzIHRoaXMgZm9yIFBJQyBjb2RlIGdlbmVyYXRpb24uICBXZSBiYXNpY2FsbHkKLQkJIGRvbid0IHdhbnQgdG8gZG8gYW55dGhpbmcgaWYgd2UgaGF2ZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJIHN5bWJvbHMgYXQgdGhpcyBwb2ludC4gICovCi0JICAgICAgZWxzZSBpZiAoMSkKLQkJewotCQkgIC8qIExlYXZlIGl0IGFsb25lLiAgKi8KLQkJfQotI2VuZGlmCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICAgIGVsc2UgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfR1BSRUwzMgotCQkgICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19HUFJFTDE2KQotCQl7Ci0JCSAgLyogTGVhdmUgaXQgYWxvbmUuICAqLwotCQl9Ci0jZW5kaWYKLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyIGJ1Zls1MF07Ci0JCSAgc3ByaW50X3ZhbHVlIChidWYsIGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpOwotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJTdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgXCIlc1wiIHslcyBzZWN0aW9ufSAtIFwiJXNcIiB7JXMgc2VjdGlvbn0gYXQgZmlsZSBhZGRyZXNzICVzLiIpLAotCQkJCVNfR0VUX05BTUUgKGFkZF9zeW1ib2xQKSwKLQkJCQlzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2xQKSksCi0JCQkJU19HRVRfTkFNRSAoc3ViX3N5bWJvbFApLAotCQkJCXNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApKSwKLQkJCQlidWYpOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCkKLQl7Ci0JICBpZiAoYWRkX3N5bWJvbF9zZWdtZW50ID09IHRoaXNfc2VnbWVudF90eXBlICYmIHBjcmVsICYmICFwbHQKLQkgICAgICAmJiBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAgKGZpeFApKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBUaGlzIGZpeHVwIHdhcyBtYWRlIHdoZW4gdGhlIHN5bWJvbCdzIHNlZ21lbnQgd2FzCi0JICAgICAgICogU0VHX1VOS05PV04sIGJ1dCBpdCBpcyBub3cgaW4gdGhlIGxvY2FsIHNlZ21lbnQuCi0JICAgICAgICogU28gd2Uga25vdyBob3cgdG8gZG8gdGhlIGFkZHJlc3Mgd2l0aG91dCByZWxvY2F0aW9uLgotCSAgICAgICAqLwotI2lmZGVmIFRDX0k5NjAKLQkgICAgICAvKiByZWxvY19jYWxsaigpIG1heSByZXBsYWNlIGEgJ2NhbGwnIHdpdGggYSAnY2FsbHMnIG9yIGEKLQkJICdiYWwnLCBpbiB3aGljaCBjYXNlcyBpdCBtb2RpZmllcyAqZml4UCBhcyBhcHByb3ByaWF0ZS4KLQkJIEluIHRoZSBjYXNlIG9mIGEgJ2NhbGxzJywgbm8gZnVydGhlciB3b3JrIGlzIHJlcXVpcmVkLAotCQkgYW5kICpmaXhQIGhhcyBiZWVuIHNldCB1cCB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBjb2RlCi0JCSBiZWxvdyBhIG5vLW9wLiAqLwotCSAgICAgIHJlbG9jX2NhbGxqIChmaXhQKTsKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLQkgICAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JICAgICAgYWRkX251bWJlciAtPSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKTsKLQkgICAgICBwY3JlbCA9IDA7CS8qIExpZS4gRG9uJ3Qgd2FudCBmdXJ0aGVyIHBjcmVsIHByb2Nlc3NpbmcuICovCi0KLQkgICAgICAvKiBMZXQgdGhlIHRhcmdldCBtYWNoaW5lIG1ha2UgdGhlIGZpbmFsIGRldGVybWluYXRpb24KLQkJIGFzIHRvIHdoZXRoZXIgb3Igbm90IGEgcmVsb2NhdGlvbiB3aWxsIGJlIG5lZWRlZCB0bwotCQkgaGFuZGxlIHRoaXMgZml4dXAuICAqLwotCSAgICAgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCXsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDA7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gYWJzb2x1dGVfc2VjdGlvbgotCQkgICYmICEgcGNyZWwpCi0JCXsKLSNpZmRlZiBUQ19JOTYwCi0JCSAgLyogU2VlIGNvbW1lbnQgYWJvdXQgcmVsb2NfY2FsbGooKSBhYm92ZS4gICovCi0JCSAgcmVsb2NfY2FsbGogKGZpeFApOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0KLQkJICAvKiBMZXQgdGhlIHRhcmdldCBtYWNoaW5lIG1ha2UgdGhlIGZpbmFsIGRldGVybWluYXRpb24KLQkJICAgICBhcyB0byB3aGV0aGVyIG9yIG5vdCBhIHJlbG9jYXRpb24gd2lsbCBiZSBuZWVkZWQgdG8KLQkJICAgICBoYW5kbGUgdGhpcyBmaXh1cC4gICovCi0KLQkJICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQotCQkgICAgewotCQkgICAgICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgICAgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGFkZF9zeW1ib2xfc2VnbWVudCA9PSB1bmRlZmluZWRfc2VjdGlvbgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkJICAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYWRkX3N5bWJvbF9zZWdtZW50KQotI2VuZGlmCi0JCSAgICAgICApCi0JCXsKLSNpZmRlZiBUQ19JOTYwCi0JCSAgaWYgKChpbnQpIGZpeFAtPmZ4X2JpdF9maXhQID09IDEzKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgQ09CUiBpbnN0cnVjdGlvbi4gIFRoZXkgaGF2ZSBvbmx5IGEKLQkJICAgICAgICogMTMtYml0IGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZAotCQkgICAgICAgKiBmb3IgbG9jYWwgYnJhbmNoZXM6IGZsYWcgYXMgZXJyb3IsIGRvbid0IGdlbmVyYXRlCi0JCSAgICAgICAqIHJlbG9jYXRpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJICAgIF8oImNhbid0IHVzZSBDT0JSIGZvcm1hdCB3aXRoIGV4dGVybmFsIGxhYmVsIikpOwotCQkgICAgICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0JCS8qIENPQlIgKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLSNpZmRlZiBPQkpfQ09GRgotI2lmZGVmIFRFX0kzODZBSVgKLQkJICBpZiAoU19JU19DT01NT04gKGFkZF9zeW1ib2xQKSkKLQkJICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLSNlbmRpZiAvKiBURV9JMzg2QUlYICovCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQkJICArK3NlZ19yZWxvY19jb3VudDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNlZ19yZWxvY19jb3VudCsrOwotI2lmICEoZGVmaW5lZCAoVENfVjg1MCkgJiYgZGVmaW5lZCAoT0JKX0VMRikpCi0jaWYgIShkZWZpbmVkIChUQ19NNjhLKSAmJiBkZWZpbmVkIChPQkpfRUxGKSkKLSNpZiAhKGRlZmluZWQgKFRDX0FSTSkgICYmIGRlZmluZWQgKE9CSl9FTEYpKQotI2lmICEoZGVmaW5lZCAoVENfSTk2MCkgJiYgZGVmaW5lZCAoT0JKX0VMRikpCi0jaWYgIWRlZmluZWQgKFRDX0kzODYpIHx8ICEoZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX0NPRkYpKSB8fCBkZWZpbmVkIChURV9QRSkKLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwY3JlbCkKLQl7Ci0JICBhZGRfbnVtYmVyIC09IE1EX1BDUkVMX0ZST01fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpOwotCSAgaWYgKGFkZF9zeW1ib2xQID09IDApCi0JICAgIHsKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gJmFic19zeW1ib2w7Ci0jZWxzZQotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pOwotI2VuZGlmCi0JICAgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4UC0+ZnhfYWRkc3kpOwotCSAgICAgICsrc2VnX3JlbG9jX2NvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoIWZpeFAtPmZ4X2RvbmUpCi0JewotI2lmZGVmIE1EX0FQUExZX0ZJWDMKLQkgIG1kX2FwcGx5X2ZpeDMgKGZpeFAsICZhZGRfbnVtYmVyLCB0aGlzX3NlZ21lbnRfdHlwZSk7Ci0jZWxzZQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIG1kX2FwcGx5X2ZpeCAoZml4UCwgJmFkZF9udW1iZXIpOwotI2Vsc2UKLQkgIG1kX2FwcGx5X2ZpeCAoZml4UCwgYWRkX251bWJlcik7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFRDX0hBTkRMRVNfRlhfRE9ORQotCSAgLyogSWYgdGhlIHRjLSogZmlsZXMgaGF2ZW4ndCBiZWVuIGNvbnZlcnRlZCwgYXNzdW1lIGl0J3MgaGFuZGxpbmcKLQkgICAgIGl0IHRoZSBvbGQgd2F5LCB3aGVyZSBhIG51bGwgZnhfYWRkc3kgbWVhbnMgdGhhdCB0aGUgZml4IGhhcwotCSAgICAgYmVlbiBhcHBsaWVkIGNvbXBsZXRlbHksIGFuZCBubyBmdXJ0aGVyIHdvcmsgaXMgbmVlZGVkLiAgKi8KLQkgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwICYmIGZpeFAtPmZ4X3BjcmVsID09IDApCi0JICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotI2VuZGlmCi0JfQotCi0gICAgICBpZiAoIWZpeFAtPmZ4X2JpdF9maXhQICYmICFmaXhQLT5meF9ub19vdmVyZmxvdyAmJiBzaXplID4gMCkKLQl7Ci0JICBpZiAoKHNpemVfdCkgc2l6ZSA8IHNpemVvZiAodmFsdWVUKSkKLQkgICAgewotCSAgICAgIHZhbHVlVCBtYXNrOwotCi0JICAgICAgbWFzayA9IDA7Ci0JICAgICAgbWFzay0tOwkJLyogc2V0IGFsbCBiaXRzIHRvIG9uZSAqLwotCSAgICAgIG1hc2sgPDw9IHNpemUgKiA4IC0gKGZpeFAtPmZ4X3NpZ25lZCA/IDEgOiAwKTsKLQkgICAgICBpZiAoKGFkZF9udW1iZXIgJiBtYXNrKSAhPSAwICYmIChhZGRfbnVtYmVyICYgbWFzaykgIT0gbWFzaykKLQkJewotCQkgIGNoYXIgYnVmWzUwXSwgYnVmMls1MF07Ci0JCSAgc3ByaW50X3ZhbHVlIChidWYsIGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpOwotCQkgIGlmIChhZGRfbnVtYmVyID4gMTAwMCkKLQkJICAgIHNwcmludF92YWx1ZSAoYnVmMiwgYWRkX251bWJlcik7Ci0JCSAgZWxzZQotCQkgICAgc3ByaW50ZiAoYnVmMiwgIiVsZCIsIChsb25nKSBhZGRfbnVtYmVyKTsKLQkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJXygiVmFsdWUgb2YgJXMgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAlcyIpLAotCQkJCWJ1ZjIsIHNpemUsIGJ1Zik7Ci0JCX0gLyogZ2VuZXJpYyBlcnJvciBjaGVja2luZyAqLwotCSAgICB9Ci0jaWZkZWYgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRAotCSAgLyogV2FybiBpZiBhIC53b3JkIHZhbHVlIGlzIHRvbyBsYXJnZSB3aGVuIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIG51bWJlci4gIFdlIGFscmVhZHkga25vdyBpdCBpcyBub3QgdG9vIG5lZ2F0aXZlLiAgVGhpcyBpcyB0bwotCSAgICAgY2F0Y2ggb3Zlci1sYXJnZSBzd2l0Y2hlcyBnZW5lcmF0ZWQgYnkgZ2NjIG9uIHRoZSA2OGsuICAqLwotCSAgaWYgKCFmbGFnX3NpZ25lZF9vdmVyZmxvd19vawotCSAgICAgICYmIHNpemUgPT0gMgotCSAgICAgICYmIGFkZF9udW1iZXIgPiAweDdmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiU2lnbmVkIC53b3JkIG92ZXJmbG93OyBzd2l0Y2ggbWF5IGJlIHRvbyBsYXJnZTsgJWxkIGF0IDB4JWx4IiksCi0JCQkgIChsb25nKSBhZGRfbnVtYmVyLAotCQkJICAodW5zaWduZWQgbG9uZykgKGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpKTsKLSNlbmRpZgotCX0JCQkvKiBub3QgYSBiaXQgZml4ICovCi0KLSNpZmRlZiBUQ19WQUxJREFURV9GSVgKLSAgICBza2lwOiAgQVRUUklCVVRFX1VOVVNFRF9MQUJFTAotICAgICAgOwotI2VuZGlmCi0jaWZkZWYgREVCVUc1Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJyZXN1bHQ6XG4iKTsKLSAgICAgIHByaW50X2ZpeHVwIChmaXhQKTsKLSNlbmRpZgotICAgIH0JCQkJLyogRm9yIGVhY2ggZml4UyBpbiB0aGlzIHNlZ21lbnQuICovCi0KLSAgVENfQURKVVNUX1JFTE9DX0NPVU5UIChmaXhQLCBzZWdfcmVsb2NfY291bnQpOwotICByZXR1cm4gc2VnX3JlbG9jX2NvdW50OwotfQotCi0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChPQkpfVk1TKSkgKi8KLQotdm9pZAotbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICgoc2l6ZV90KSBuID4gc2l6ZW9mICh2YWwpIHx8IG4gPD0gMCkKLSAgICBhYm9ydCAoKTsKLSAgd2hpbGUgKG4tLSkKLSAgICB7Ci0gICAgICBidWZbbl0gPSB2YWwgJiAweGZmOwotICAgICAgdmFsID4+PSA4OwotICAgIH0KLX0KLQotdm9pZAotbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICgoc2l6ZV90KSBuID4gc2l6ZW9mICh2YWwpIHx8IG4gPD0gMCkKLSAgICBhYm9ydCAoKTsKLSAgd2hpbGUgKG4tLSkKLSAgICB7Ci0gICAgICAqYnVmKysgPSB2YWwgJiAweGZmOwotICAgICAgdmFsID4+PSA4OwotICAgIH0KLX0KLQotdm9pZAotd3JpdGVfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgImZpeHVwczogJWRcbiIsIG5fZml4dXBzKTsKLX0KLQotLyogZm9yIGRlYnVnZ2luZyAqLwotZXh0ZXJuIGludCBpbmRlbnRfbGV2ZWw7Ci0KLXZvaWQKLXByaW50X2ZpeHVwIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBpbmRlbnRfbGV2ZWwgPSAxOwotICBmcHJpbnRmIChzdGRlcnIsICJmaXggJWx4ICVzOiVkIiwgKGxvbmcpIGZpeHAsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIHBjcmVsIik7Ci0gIGlmIChmaXhwLT5meF9wY3JlbF9hZGp1c3QpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIHBjcmVsX2FkanVzdD0lZCIsIGZpeHAtPmZ4X3BjcmVsX2FkanVzdCk7Ci0gIGlmIChmaXhwLT5meF9pbV9kaXNwKQotICAgIHsKLSNpZmRlZiBUQ19OUzMySwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIGltX2Rpc3A9JWQiLCBmaXhwLT5meF9pbV9kaXNwKTsKLSNlbHNlCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgaW1fZGlzcCIpOwotI2VuZGlmCi0gICAgfQotICBpZiAoZml4cC0+ZnhfdGNiaXQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIHRjYml0Iik7Ci0gIGlmIChmaXhwLT5meF9kb25lKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiBkb25lIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuICAgIHNpemU9JWQgZnJhZz0lbHggd2hlcmU9JWxkIG9mZnNldD0lbHggYWRkbnVtYmVyPSVseCIsCi0JICAgZml4cC0+Znhfc2l6ZSwgKGxvbmcpIGZpeHAtPmZ4X2ZyYWcsIChsb25nKSBmaXhwLT5meF93aGVyZSwKLQkgICAobG9uZykgZml4cC0+Znhfb2Zmc2V0LCAobG9uZykgZml4cC0+ZnhfYWRkbnVtYmVyKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuICAgICVzICglZCkiLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSwKLQkgICBmaXhwLT5meF9yX3R5cGUpOwotI2Vsc2UKLSNpZmRlZiBORUVEX0ZYX1JfVFlQRQotICBmcHJpbnRmIChzdGRlcnIsICIgcl90eXBlPSVkIiwgZml4cC0+Znhfcl90eXBlKTsKLSNlbmRpZgotI2VuZGlmCi0gIGlmIChmaXhwLT5meF9hZGRzeSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiAgICs8Iik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoc3RkZXJyLCBmaXhwLT5meF9hZGRzeSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI+Iik7Ci0gICAgfQotICBpZiAoZml4cC0+Znhfc3Vic3kpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICAtPCIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKHN0ZGVyciwgZml4cC0+Znhfc3Vic3kpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiPiIpOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSNpZmRlZiBUQ19GSVhfREFUQV9QUklOVAotICBUQ19GSVhfREFUQV9QUklOVCAoc3RkZXJyLCBmaXhwKTsKLSNlbmRpZgotfQotCi0vKiBlbmQgb2Ygd3JpdGUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3dyaXRlLmggYi9nYXMvd3JpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2ZDJhZC4uMDAwMDAwMAotLS0gYS9nYXMvd3JpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKiB3cml0ZS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfX3dyaXRlX2hfXwotI2RlZmluZSBfX3dyaXRlX2hfXwotCi0jaWZuZGVmIFRDX0k5NjAKLSNpZmRlZiBocHV4Ci0jZGVmaW5lIEVYRUNfTUFDSElORV9UWVBFIEhQOTAwMFMyMDBfSUQKLSNlbmRpZgotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpZm5kZWYgTE9DQUxfTEFCRUwKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKG5hbWUgWzBdID09ICdMJyApCi0jZW5kaWYKLQotI2RlZmluZSBTX0xPQ0FMX05BTUUocykgKExPQ0FMX0xBQkVMIChTX0dFVF9OQU1FIChzKSkpCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogVGhpcyBpcyB0aGUgbmFtZSBvZiBhIGZha2Ugc3ltYm9sIHdoaWNoIHdpbGwgbmV2ZXIgYXBwZWFyIGluIHRoZQotICAgYXNzZW1ibGVyIG91dHB1dC4gIFNfSVNfTE9DQUwgZGV0ZWN0cyBpdCBiZWNhdXNlIG9mIHRoZSBcMDAxLiAgKi8KLSNkZWZpbmUgRkFLRV9MQUJFTF9OQU1FICJMMFwwMDEiCi0KLSNpbmNsdWRlICJiaXRfZml4LmgiCi0KLS8qCi0gKiBGaXhTcyBtYXkgYmUgYnVpbHQgdXAgaW4gYW55IG9yZGVyLgotICovCi0KLXN0cnVjdCBmaXgKLXsKLSAgLyogVGhlc2Ugc21hbGwgZmllbGRzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGZvciBjb21wYWN0bmVzcyBvZgotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIGVmZmljaWVuY3kgb2YgYWNjZXNzIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcy4gICovCi0KLSAgLyogcGMtcmVsYXRpdmUgb2Zmc2V0IGFkanVzdCAob25seSB1c2VkIGJ5IG02OGspICovCi0gIGNoYXIgZnhfcGNyZWxfYWRqdXN0OwotCi0gIC8qIEhvdyBtYW55IGJ5dGVzIGFyZSBpbnZvbHZlZD8gKi8KLSAgdW5zaWduZWQgY2hhciBmeF9zaXplOwotCi0gIC8qIElzIHRoaXMgYSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uPyAgKi8KLSAgdW5zaWduZWQgZnhfcGNyZWwgOiAxOwotCi0gIC8qIElzIHRoaXMgYSByZWxvY2F0aW9uIHRvIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnk/ICBJZiBzbywKLSAgICAgc29tZSBvZiB0aGUgcmVkdWN0aW9ucyB3ZSB0cnkgdG8gYXBwbHkgYXJlIGludmFsaWQuICBBIGJldHRlciB3YXkKLSAgICAgbWlnaHQgYmUgdG8gcmVwcmVzZW50IFBMVCBlbnRyaWVzIHdpdGggZGlmZmVyZW50IGtpbmRzIG9mCi0gICAgIHN5bWJvbHMsIGFuZCB1c2Ugbm9ybWFsIHJlbG9jYXRpb25zICh3aXRoIHVuZGVmaW5lZCBzeW1ib2xzKTsKLSAgICAgbG9vayBpbnRvIGl0IGZvciB2ZXJzaW9uIDIuNi4gICovCi0gIHVuc2lnbmVkIGZ4X3BsdCA6IDE7Ci0KLSAgLyogSXMgdGhpcyB2YWx1ZSBhbiBpbW1lZGlhdGUgZGlzcGxhY2VtZW50PyAgKi8KLSAgLyogT25seSB1c2VkIG9uIGk5NjAgYW5kIG5zMzJrOyBtZXJnZSBpdCBpbnRvIFRDX0ZJWF9UWVBFIHNvbWV0aW1lLiAgKi8KLSAgdW5zaWduZWQgZnhfaW1fZGlzcCA6IDI7Ci0KLSAgLyogQSBiaXQgZm9yIHRoZSBDUFUgc3BlY2lmaWMgY29kZS4KLSAgICAgVGhpcyBwcm9iYWJseSBjYW4gYmUgZm9sZGVkIGludG8gdGNfZml4X2RhdGEsIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgZnhfdGNiaXQgOiAxOwotCi0gIC8qIEhhcyB0aGlzIHJlbG9jYXRpb24gYWxyZWFkeSBiZWVuIGFwcGxpZWQ/ICAqLwotICB1bnNpZ25lZCBmeF9kb25lIDogMTsKLQotICAvKiBTdXBwcmVzcyBvdmVyZmxvdyBjb21wbGFpbnRzIG9uIGxhcmdlIGFkZGVuZHMuICBUaGlzIGlzIHVzZWQKLSAgICAgaW4gdGhlIFBvd2VyUEMgRUxGIGNvbmZpZyB0byBhbGxvdyBsYXJnZSBhZGRlbmRzIG9uIHRoZQotICAgICBCRkRfUkVMT0Nfe0xPMTYsSEkxNixISTE2X1N9IHJlbG9jYXRpb25zLgotCi0gICAgIEBAIENhbiB0aGlzIGJlIGRldGVybWluZWQgZnJvbSBCRkQ/ICAqLwotICB1bnNpZ25lZCBmeF9ub19vdmVyZmxvdyA6IDE7Ci0KLSAgLyogVGhlIHZhbHVlIGlzIHNpZ25lZCB3aGVuIGNoZWNraW5nIGZvciBvdmVyZmxvdy4gICovCi0gIHVuc2lnbmVkIGZ4X3NpZ25lZCA6IDE7Ci0KLSAgLyogV2hpY2ggZnJhZyBkb2VzIHRoaXMgZml4IGFwcGx5IHRvPyAgKi8KLSAgZnJhZ1MgKmZ4X2ZyYWc7Ci0KLSAgLyogV2hlcmUgaXMgdGhlIGZpcnN0IGJ5dGUgdG8gZml4IHVwPyAgKi8KLSAgbG9uZyBmeF93aGVyZTsKLQotICAvKiBOVUxMIG9yIFN5bWJvbCB3aG9zZSB2YWx1ZSB3ZSBhZGQgaW4uICovCi0gIHN5bWJvbFMgKmZ4X2FkZHN5OwotCi0gIC8qIE5VTEwgb3IgU3ltYm9sIHdob3NlIHZhbHVlIHdlIHN1YnRyYWN0LiAqLwotICBzeW1ib2xTICpmeF9zdWJzeTsKLQotICAvKiBBYnNvbHV0ZSBudW1iZXIgd2UgYWRkIGluLiAqLwotICB2YWx1ZVQgZnhfb2Zmc2V0OwotCi0gIC8qIE5leHQgZml4UyBpbiBsaW5rZWQgbGlzdCwgb3IgTlVMTC4gICovCi0gIHN0cnVjdCBmaXggKmZ4X25leHQ7Ci0KLSAgLyogSWYgTlVMTCwgbm8gYml0Zml4J3MgdG8gZG8uICAqLwotICAvKiBPbmx5IGk5NjAtY29mZiBhbmQgbnMzMmsgdXNlIHRoaXMsIGFuZCBpOTYwLWNvZmYgc3RvcmVzIGFuCi0gICAgIGludGVnZXIuICBUaGlzIGNhbiBwcm9iYWJseSBiZSBmb2xkZWQgaW50byB0Y19maXhfZGF0YSwgYmVsb3cuCi0gICAgIEBAIEFscGhhIGFsc28gdXNlcyBpdCwgYnV0IG9ubHkgdG8gZGlzYWJsZSBjZXJ0YWluIHJlbG9jYXRpb24KLSAgICAgcHJvY2Vzc2luZy4gICovCi0gIGJpdF9maXhTICpmeF9iaXRfZml4UDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGZ4X3JfdHlwZTsKLSNlbHNlCi0jaWZkZWYgTkVFRF9GWF9SX1RZUEUKLSAgLyogSGFjayBmb3IgbWFjaGluZXMgd2hlcmUgdGhlIHR5cGUgb2YgcmVsb2MgY2FuJ3QgYmUKLSAgICAgd29ya2VkIG91dCBieSBsb29raW5nIGF0IGhvdyBiaWcgaXQgaXMuICAqLwotICBpbnQgZnhfcl90eXBlOwotI2VuZGlmCi0jZW5kaWYKLQotICAvKiBUaGlzIGZpZWxkIGlzIHNvcnQgb2YgbWlzbmFtZWQuICBJdCBhcHBlYXJzIHRvIGJlIGEgc29ydCBvZiByYW5kb20KLSAgICAgc2NyYXRjaCBmaWVsZCwgZm9yIHVzZSBieSB0aGUgYmFjayBlbmRzLiAgVGhlIG1haW4gZ2FzIGNvZGUgZG9lc24ndAotICAgICBkbyBhbnl0aGluZyBidXQgaW5pdGlhbGl6ZSBpdCB0byB6ZXJvLiAgVGhlIHVzZSBvZiBpdCBkb2VzIG5lZWQgdG8KLSAgICAgYmUgY29vcmRpbmF0ZWQgYmV0d2VlbiB0aGUgY3B1IGFuZCBmb3JtYXQgZmlsZXMsIHRob3VnaC4gIEUuZy4sIHNvbWUKLSAgICAgY29mZiB0YXJnZXRzIHBhc3MgdGhlIGBhZGRlbmQnIGZpZWxkIGZyb20gdGhlIGNwdSBmaWxlIHZpYSB0aGlzCi0gICAgIGZpZWxkLiAgSSBkb24ndCBrbm93IHdoeSB0aGUgYGZ4X29mZnNldCcgZmllbGQgYWJvdmUgY2FuJ3QgYmUgdXNlZAotICAgICBmb3IgdGhhdDsgaW52ZXN0aWdhdGUgbGF0ZXIgYW5kIGRvY3VtZW50LiBLUiAgKi8KLSAgdmFsdWVUIGZ4X2FkZG51bWJlcjsKLQotICAvKiBUaGUgbG9jYXRpb24gb2YgdGhlIGluc3RydWN0aW9uIHdoaWNoIGNyZWF0ZWQgdGhlIHJlbG9jLCB1c2VkCi0gICAgIGluIGVycm9yIG1lc3NhZ2VzLiAgKi8KLSAgY2hhciAqZnhfZmlsZTsKLSAgdW5zaWduZWQgZnhfbGluZTsKLQotI2lmZGVmIFVTSU5HX0NHRU4KLSAgc3RydWN0IHsKLSAgICAvKiBDR0VOX0lOU04gZW50cnkgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgIGNvbnN0IHN0cnVjdCBjZ2VuX2luc24gKmluc247Ci0gICAgLyogVGFyZ2V0IHNwZWNpZmljIGRhdGEsIHVzdWFsbHkgcmVsb2MgbnVtYmVyLiAgKi8KLSAgICBpbnQgb3BpbmZvOwotICB9IGZ4X2NnZW47Ci0jZW5kaWYKLQotI2lmZGVmIFRDX0ZJWF9UWVBFCi0gIC8qIExvY2F0aW9uIHdoZXJlIGEgYmFja2VuZCBjYW4gYXR0YWNoIGFkZGl0aW9uYWwgZGF0YQotICAgICBuZWVkZWQgdG8gcGVyZm9ybSBmaXh1cHMuICAqLwotICBUQ19GSVhfVFlQRSB0Y19maXhfZGF0YTsKLSNlbmRpZgotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZml4IGZpeFM7Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGNoYXIgKm5leHRfb2JqZWN0X2ZpbGVfY2hhclA7Ci0KLSNpZm5kZWYgTUFOWV9TRUdNRU5UUwotQ09NTU9OIGZpeFMgKnRleHRfZml4X3Jvb3QsICp0ZXh0X2ZpeF90YWlsOwkvKiBDaGFpbnMgZml4U3MuICovCi1DT01NT04gZml4UyAqZGF0YV9maXhfcm9vdCwgKmRhdGFfZml4X3RhaWw7CS8qIENoYWlucyBmaXhTcy4gKi8KLUNPTU1PTiBmaXhTICpic3NfZml4X3Jvb3QsICpic3NfZml4X3RhaWw7CS8qIENoYWlucyBmaXhTcy4gKi8KLWV4dGVybiBzdHJ1Y3QgZnJhZyAqdGV4dF9sYXN0X2ZyYWc7CQkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLWV4dGVybiBzdHJ1Y3QgZnJhZyAqZGF0YV9sYXN0X2ZyYWc7CQkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLSNlbmRpZgotQ09NTU9OIGZpeFMgKipzZWdfZml4X3Jvb3RQLCAqKnNlZ19maXhfdGFpbFA7CS8qIC0+IG9uZSBvZiBhYm92ZS4gKi8KLSNlbmRpZgotCi1leHRlcm4gbG9uZyBzdHJpbmdfYnl0ZV9jb3VudDsKLWV4dGVybiBpbnQgc2VjdGlvbl9hbGlnbm1lbnRbXTsKLQotZXh0ZXJuIGJpdF9maXhTICpiaXRfZml4X25ldwotICBQQVJBTVMgKChpbnQgc2l6ZSwgaW50IG9mZnNldCwgbG9uZyBiYXNlX3R5cGUsIGxvbmcgYmFzZV9hZGosIGxvbmcgbWluLAotCSAgIGxvbmcgbWF4LCBsb25nIGFkZCkpOwotZXh0ZXJuIHZvaWQgYXBwZW5kIFBBUkFNUyAoKGNoYXIgKipjaGFyUFAsIGNoYXIgKmZyb21QLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkpOwotZXh0ZXJuIHZvaWQgcmVjb3JkX2FsaWdubWVudCBQQVJBTVMgKChzZWdUIHNlZywgaW50IGFsaWduKSk7Ci1leHRlcm4gdm9pZCBzdWJzZWdzX2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV9vYmplY3RfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gbG9uZyByZWxheF9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGxvbmcpKTsKLWV4dGVybiB2b2lkIHJlbGF4X3NlZ21lbnQKLSAgUEFSQU1TICgoc3RydWN0IGZyYWcgKiBzZWdfZnJhZ19yb290LCBzZWdUIHNlZ190eXBlKSk7Ci0KLWV4dGVybiB2b2lkIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCkpOwotZXh0ZXJuIHZvaWQgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAgICBQQVJBTVMgKChjaGFyICosIHZhbHVlVCwgaW50KSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gZml4UyAqZml4X25ldwotICBQQVJBTVMgKChmcmFnUyAqIGZyYWcsIGludCB3aGVyZSwgaW50IHNpemUsIHN5bWJvbFMgKiBhZGRfc3ltYm9sLAotCSAgIG9mZnNldFQgb2Zmc2V0LCBpbnQgcGNyZWwsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGUpKTsKLWV4dGVybiBmaXhTICpmaXhfbmV3X2V4cAotICBQQVJBTVMgKChmcmFnUyAqIGZyYWcsIGludCB3aGVyZSwgaW50IHNpemUsIGV4cHJlc3Npb25TICpleHAsIGludCBwY3JlbCwKLQkgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlKSk7Ci0jZWxzZQotZXh0ZXJuIGZpeFMgKmZpeF9uZXcKLSAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBzeW1ib2xTICogYWRkX3N5bWJvbCwKLQkgICBvZmZzZXRUIG9mZnNldCwgaW50IHBjcmVsLCBpbnQgcl90eXBlKSk7Ci1leHRlcm4gZml4UyAqZml4X25ld19leHAKLSAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBleHByZXNzaW9uUyAqZXhwLCBpbnQgcGNyZWwsCi0JICAgaW50IHJfdHlwZSkpOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIHdyaXRlX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci0KLSNlbmRpZiAvKiBfX3dyaXRlX2hfXyAqLwotLyogZW5kIG9mIHdyaXRlLmggKi8KZGlmZiAtLWdpdCBhL2dwcm9mLy5nZGJpbml0IGIvZ3Byb2YvLmdkYmluaXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTk0NzIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvLmdkYmluaXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1kaXIgLi4KZGlmZiAtLWdpdCBhL2dwcm9mL0NoYW5nZUxvZyBiL2dwcm9mL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3NDJmZi4uMDAwMDAwMAotLS0gYS9ncHJvZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxMzg4ICswLDAgQEAKLTIwMDAtMDMtMzEgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+Ci0KLQkqIHN5bXRhYi5jIChzeW10YWJfZmluYWxpemUpOiBEb24ndCB1c2UgcG9zdC1pbmNyZW1lbnQgb24KLQlzdHJ1Y3R1cmUgY29weSB0byB3b3JrIGFyb3VuZCBhIHBwYyBnY2MgYnVnLgotCi0xOTk5LTA5LTI5ICBNYXJrIEtldHRlbmlzICA8a2V0dGVuaXNAZ251Lm9yZz4KLQotICAgICAgICAqIGhlcnR6LmggW01BQ0hdIChoZXJ0eik6IFJlbW92ZSBtYWNyby4gIFRoZQotICAgICAgICA8bWFjaGluZS9tYWNoX3BhcmFtLmg+IGluY2x1ZGUgZG9lc24ndCBleGlzdCBvbiBhbCBNYWNoIGJhc2VkCi0gICAgICAgIHN5c3RlbXMsIGFuZCB0aGUgZGVmaW5pdGlvbiBvZiBoZXJ0eiBicmVha3MgY29tcGlsYXRpb24gb2YgaGVydHouYwotICAgICAgICBhbnl3YXkuCi0KLTIwMDAtMDItMjIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBCcmFkIEx1Y2llciA8bHVjaWVyQG1hdGgucHVyZHVlLmVkdT46Ci0JKiBpMzg2LmMgKGkzODZfZmluZF9jYWxsKTogQWRkIGNhc3QgdG8gZW5zdXJlIHRoYXQgcHJpbnRmIGFyZ3VtZW50Ci0JbWF0Y2hlcyBmb3JtYXQuCi0JKiB0YWhvZS5jICh0YWhvZV9maW5kX2NhbGwpOiBMaWtld2lzZS4KLQkqIHZheC5jICh2YXhfZmluZF9jYWxsKTogTGlrZXdpc2UuCi0KLTIwMDAtMDEtMjcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogdXRpbHMuYyAocHJpbnRfbmFtZV9vbmx5KTogRG9uJ3QgcGFzcyBlcnJvciBzdHJpbmdzIHRvCi0JcHJpbnRmIGFzIGZvcm1hdCBhcmcuCi0KLTE5OTktMDktMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdtb25faW8uYyAoZ21vbl9vdXRfcmVhZCk6IE1ha2Ugc3VyZSB0aGF0IHNlbnNpYmxlIHZhbHVlcwotCWFyZSBleHRyYWN0ZWQgZnJvbSBhIHJhdyBoZWFkZXIuCi0KLTE5OTktMDgtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBCcmFkIEx1Y2llciA8bHVjaWVyQG1hdGgucHVyZHVlLmVkdT46Ci0JKiBjb3JlZmlsZS5jIChjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBBZGQgY2FzdCBmb3IgcHJpbnRmLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gTWFyayBFbGJyZWNodDoKLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi45LjUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDctMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb3JlZmlsZS5jIChjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zKTogQWRkIEFUVFJJQlVURURfVU5VU0VELgotCSogc3ltLWlkcy5jIChub25fZXhpc3RlbnRfZmlsZSk6IEZ1bGx5IGluaXRpYWxpemUgc3RydWN0dXJlLgotCi0xOTk5LTA3LTAxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFueSBmaWxlczogQWRkIGNhc3RzIGluIG1hbnkgcHJpbnQgc3RhdGVtZW50cyB0byBjYXN0IGJmZF92bWEKLQl2YWx1ZXMgdG8gdW5zaWduZWQgbG9uZyB3aGVuIGNhbGxpbmcgcHJpbnRmLgotCSogTWFrZWZpbGUuYW0gKCQoT0JKRUNUUykpOiBBZGQgZ21vbi5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBKdW4gMTQgMTA6MzU6MjggMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBncHJvZi50ZXhpOiBGaXggdHlwby4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEJvYiBCeXJuZXMgPGJ5cm5lc0BjdXJsLmNvbT46Ci0JKiBjZ19kZm4uYzogSW5jbHVkZSAibGliaWJlcnR5LmgiCi0JKERGTl9JTkNSX0RFUFRIKTogRGVmaW5lIGluc3RlYWQgb2YgREZOX0RFUFRILgotCShkZm5fc3RhY2spOiBEZWZpbmUgYXMgcG9pbnRlciByYXRoZXIgdGhhbiBhcnJheS4KLQkocHJlX3Zpc2l0KTogUmVhbGxvY2F0ZSBkZm5fc3RhY2sgYXMgbmVlZGVkLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGdwcm9mLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCSogZ3Byb2YuYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZQotCXN5c3RlbSBkb2VzIG5vdCBkZWZpbmUgaXQuCi0KLTE5OTktMDQtMDUgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29yZWZpbGUuYyAoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogRG9uJ3QgdXNlIGZpeGVkIHNpemUgYXJyYXkKLQlmb3IgcHJldl9uYW1lIGFuZCBwcmV2X2ZpbGVuYW1lLgotCi0xOTk5LTA0LTA0ICBNaWNoYWVsIEhvaG11dGggIDxob2htdXRoQGlubm9jZW50LmNvbT4KLQotCSogZ3Byb2YuaCAoRkZfQlNENDQpOiBEZWZpbmUuCi0JKiBnbW9uLmggKHN0cnVjdCByYXdfcGhkcik6IEFkZCB2ZXJzaW9uLCBwcm9mcmF0ZSwgYW5kIHNwYXJlCi0JZmllbGRzIHVuY29uZGl0aW9uYWxseS4KLQkoc3RydWN0IG9sZF9yYXdfcGhkcik6IE5ldyBzdHJ1Y3QuCi0JKiBncHJvZi5jIChtYWluKTogSGFuZGxlIC1PIDQuNGJzZC4KLQkqIGdtb25faW8uYyAoZ21vbl9vdXRfcmVhZCk6IEhhbmRsZSBCU0QgNC40IGZvcm1hdCwgZWl0aGVyCi0JYXV0b21hdGljYWxseSBvciBieSB1c2VyIHNwZWNpZmljYXRpb24uCi0JKGdtb25fb3V0X3dyaXRlKTogSGFuZGxlIEJTRCA0LjQgZm9ybWF0LgotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgQlNENDRfRk9STUFULgotCSogZ3Byb2YudGV4aSAoTWlzY2VsbGFuZW91cyBPcHRpb25zKTogRG9jdW1lbnQgLU8gNC40YnNkLgotCSogY29uZmlndXJlLCBnY29uZmlnLmluOiBSZWJ1aWxkLgotCi1UdWUgRmViIDE2IDE3OjAxOjMzIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgQUNfUFJFUkVRIHRvIDIuMTMuICBDaGFuZ2UgQU1fUFJPR19JTlNUQUxMCi0JdG8gQUNfUFJPR19JTlNUQUxMLiAgUmVtb3ZlIEFNX0NZR1dJTjMyLiAgQ2hhbmdlIEFNX0VYRUVYVCB0bwotCUFDX0VYRUVYVC4gIEFkZCBjb21tZW50IHRvIEFDX0RFRklORS4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGdjb25maWcuaW46IFJlYnVpbGQuCi0KLVN1biBEZWMgIDYgMjE6NTc6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBncHJvZi50ZXhpIChTeW1zcGVjcyk6IE1lbnRpb24gdGhhdCB5b3UgaGF2ZSB0byBhZGQgYW55Ci0JdW5kZXJzY29yZSB5b3Vyc2VsZiB3aGVuIG5hbWluZyBhIHN5bWJvbC4KLQotTW9uIE5vdiAgMiAxNTowNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1XZWQgQXVnIDEyIDE0OjU5OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUF2b2lkIHNvbWUgb3ZlcmZsb3cgY2FzZXM6Ci0JKiBiYXNpY19ibG9ja3MuaCAoYmJfbWluX2NhbGxzKTogQ2hhbmdlIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiBjYWxsX2dyYXBoLmggKGNnX3RhbGx5KTogQ2hhbmdlIGNvdW50IHBhcmFtZXRlciB0byB1bnNpZ25lZAotCWxvbmcuCi0JKiBjZ19hcmNzLmggKEFyYyk6IENoYW5nZSBjb3VudCBmaWVsZCB0byB1bnNpZ25lZCBsb25nLgotCShhcmNfYWRkKTogQ2hhbmdlIGNvdW50IHBhcmFtZXRlciB0byB1bnNpZ25lZCBsb25nLgotCSogc291cmNlLmggKFNvdXJjZV9GaWxlKTogQ2hhbmdlIG5jYWxscyBmaWVsZCB0byB1bnNpZ25lZCBsb25nLgotCSogc3ltdGFiLmggKFN5bSk6IENoYW5nZSBmaWVsZHMgbmNhbGxzLCBiYl9jYWxscywgYW5kCi0JY2cuc2VsZl9jYWxscyB0byB1bnNpZ25lZCBsb25nLgotCSogTWFueSBmaWxlczogVXBkYXRlIGFjY29yZGluZ2x5LgotCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggY3VycmVudCB0b29scy4KLQotRnJpIEp1bCAxMCAxNzoyOTo0OSAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKEJTRDQ0X0ZPUk1BVCk6IERlZmluZSBmb3IgY3lnd2luMzIsIHdpbjMyLCBtaW5ndzMyCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBKdW4gMTIgMTM6NDA6MDUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLVN1biBNYXkgMTAgMjI6MzU6MzMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1UdWUgTWF5ICA1IDE4OjI4OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuaCAoXyk6IFVuZGVmaW5lIEJGRCdzIHZlcnNpb24uCi0KLVR1ZSBBcHIgMjggMTk6MTc6MzMgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBncHJvZi5jIChtYWluKTogQ29uZGl0aW9uYWxseSBjYWxsIHNldGxvY2FsZS4KLQkqIGdwcm9mLmg6IEluY2x1ZGUgPGxvY2FsZS5oPiBpZiBIQVZFX0xPQ0FMRV9ILgotCShMQ19NRVNTQUdFUyk6IE5vdyBjYW4gYmUgZGVmaW5lZCBldmVuIHdoZW4gRU5BQkxFX05MUy4KLQotVHVlIEFwciAyOCAxOTo1MDowOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvcmVmaWxlLmM6IFJlbmFtZSBmcm9tIGNvcmUuYy4KLQkqIGNvcmVmaWxlLmg6IFJlbmFtZSBmcm9tIGNvcmUuaC4KLQkqIE1hbnkgLmMgZmlsZXM6IEluY2x1ZGUgY29yZWZpbGUuaCByYXRoZXIgdGhhbiBjb3JlLmguCi0JKiBNYWtlZmlsZS5hbSAoc291cmNlcyk6IENoYW5nZSBjb3JlLmMgdG8gY29yZWZpbGUuYy4KLQkobm9pbnN0X0hFQURFUlMpOiBDaGFuZ2UgY29yZS5oIHRvIGNvcmVmaWxlLmguCi0JKCQoT0JKRUNUUykpOiBEZXBlbmQgdXBvbiBjb3JlZmlsZS5oIHJhdGhlciB0aGFuIGNvcmUuaC4KLQkoY29yZWZpbGUubyk6IFJlbmFtZSB0YXJnZXQgZnJvbSBjb3JlLm8sIGRlcGVuZCB1cG9uIGNvcmVmaWxlLmMuCi0JKiBNYWtlZmlsZS5pbiwgcG8vUE9URklMRVMuaW46IFJlYnVpbGQuCi0KLU1vbiBBcHIgMjcgMTY6NTA6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAyLjkuNAotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXByIDIyIDE2OjAxOjE3IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAwMDowMDoyMiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBncHJvZi5oOiBBZGRlZCBpbmNsdWRlcyBhbmQgZGVmaW5lcyBmb3IgZ2V0dGV4dC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUxMX0xJTkdVQVMpOiBOZXcgbWFjcm8uCi0JQ2FsbCBDWV9HTlVfR0VUVEVYVC4gIENyZWF0ZSBwby9NYWtlZmlsZS5pbiBhbmQgcG8vTWFrZWZpbGUuCi0JKiBhY2NvbmZpZy5oIChFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VUVEVYVCwgSEFWRV9TVFBDUFksCi0JSEFWRV9MQ19NRVNTQUdFUyk6IERlZmluZS4KLQkqIGdwcm9mLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIHRleHRkb21haW4uCi0JKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IE5ldyBtYWNyby4KLQkoSU5DTFVERVMpOiBMb29rIGluIGludGwgZGlycyBmb3IgaGVhZGVycy4gIERlZmluZSBMT0NBTEVESVIuCi0JKGdwcm9mX0RFUEVOREVOQ0lFUyk6IEFkZGVkIElOVExERVBTLgotCShncHJvZl9MREFERCk6IEFkZGVkIElOVExMTElCUy4KLQkoUE9URklMRVMpOiBOZXcgbWFjcm8uCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkqIE1hbnkgZmlsZXM6IFdyYXAgdXNlci12aXNpYmxlIHN0cmluZ3Mgd2l0aCBnZXR0ZXh0IGludm9jYXRpb24uCi0KLVR1ZSBBcHIgIDcgMTI6NDM6MzcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBoamxAbHVjb24ub3JnIDxILkouIEx1PjoKLQkqIE1ha2VmaWxlLmFtIChkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBNYXIgMzAgMTI6NDc6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLVNhdCBNYXIgMjggMjM6MDk6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogY2dfYXJjcy5jIChudW1fY3ljbGVzKTogQ2hhbmdlIHRvIHVuc2lnbmVkIGludC4KLQkobnVtYXJjcyk6IExpa2V3aXNlLgotCShhcmNfYWRkKTogQ2hhbmdlIG1heGFyY3MgdG8gdW5zaWduZWQgaW50LgotCShjZ19hc3NlbWJsZSk6IENoYW5nZSBpbmRleCB0byB1bnNpZ25lZCBpbnQuCi0JKiBjZ19hcmNzLmggKG51bV9jeWNsZXMsIG51bWFyY3MpOiBVcGRhdGUgZGVjbGFyYXRpb25zLgotCSogY2dfcHJpbnQuYyAoY2dfcHJpbnQpOiBDaGFuZ2UgaW5kZXggdG8gdW5zaWduZWQgaW50LgotCShjZ19wcmludF9pbmRleCk6IENoYW5nZSBpbmRleCwgbm5hbWVzLCB0b2RvLCBpLCBhbmQgaiB0byB1bnNpZ25lZAotCWludC4KLQkoY2dfcHJpbnRfZmlsZV9vcmRlcmluZyk6IENoYW5nZSBzeW1ib2xfY291bnQgYW5kIGluZGV4MiB0bwotCXVuc2lnbmVkIGludC4KLQkqIGNvcmUuYyAoc3ltYm9sX21hcF9jb3VudCk6IENoYW5nZSB0byB1bnNpZ25lZCBpbnQuCi0JKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBDaGFuZ2UgaiB0byB1bnNpZ25lZCBpbnQuCi0JKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKiBoaXN0LmMgKGhpc3RfYXNzaWduX3NhbXBsZXMpOiBDaGFuZ2UgaiB0byB1bnNpZ25lZCBpbnQuCi0JKGhpc3RfcHJpbnQpOiBDaGFuZ2UgaW5kZXggdG8gdW5zaWduZWQgaSBudC4gIEFkZCBjYXN0IHRvIGF2b2lkCi0Jd2FybmluZy4KLQkqIHN5bV9pZHMuYyAocGFyc2Vfc3BlYyk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5nLgotCSogc3ltdGFiLmMgKHN5bXRhYl9maW5hbGl6ZSk6IENoYW5nZSBqIHRvIHVuc2lnbmVkIGludC4KLQkoc3ltX2xvb2t1cCk6IFVwZGF0ZSBwcmludGYgZm9ybWF0IHN0cmluZ3MuCi0JKiBzeW10YWIuaCAoU3ltX1RhYmxlKTogQ2hhbmdlIGxlbiB0byB1bnNpZ25lZCBpbnQuCi0JKiB0YWhvZS5jICh0YWhvZV9yZWxhZGRyKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1UdWUgTWFyIDI0IDE5OjAwOjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCAtLWRlbWFuZ2xlIGFuZCAtLW5vLWRlbWFuZ2xlIG9wdGlvbnM6Ci0JKiBncHJvZi5oIChkZW1hbmdsZSk6IERlY2xhcmUuCi0JKiBncHJvZi5jIChkZW1hbmdsZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKE9QVElPTl9ERU1BTkdMRSwgT1BUSU9OX05PX0RFTUFOR0xFKTogRGVmaW5lLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRlbWFuZ2xlIiBhbmQgIm5vLWRlbWFuZ2xlIi4KLQkodXNhZ2UpOiBNZW50aW9uIC0tZGVtYW5nbGUgYW5kIC0tbm8tZGVtYW5nbGUuCi0JKG1haW4pOiBIYW5kbGUgT1BUSU9OX0RFTUFOR0xFIGFuZCBPUFRJT05fTk9fREVNQU5HTEUuCi0JKiB1dGlscy5jIChwcmludF9uYW1lX29ubHkpOiBPbmx5IGRlbWFuZ2xlIHN5bWJvbCBuYW1lIGlmIGRlbWFuZ2xlCi0JaXMgdHJ1ZS4KLQkqIGdwcm9mLnRleGkgKE91dHB1dCBPcHRpb25zKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLUZyaSBNYXIgMjAgMTk6MjE6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotVGh1IEZlYiAxMiAxNDozNjowNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmMgKHVzYWdlKTogVXBkYXRlIGJ1Zy1nbnUtdXRpbHMgYWRkcmVzcy4KLQotU2F0IEZlYiAgNyAxNTo0MzoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1GcmkgRmViICA2IDEyOjAyOjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWxwaGEuYyAoYWxwaGFfSW5zdHJ1Y3Rpb24pOiBVc2UgaW50LCBub3Qgc2lnbmVkLgotCi1GcmkgRmViICA2IDAyOjAwOjE5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29yZS5jIChjb3JlX2luaXQpOiBBZGRpbmcgbWlzc2luZyAiYnJlYWsiLgotCi1UaHUgRmViICA1IDEyOjQ5OjM3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UdWUgRmViICAzIDE0OjI1OjI1IDE5OTggIEJyZW50IEJhY2NhbGEgIDxiYWNjYWxhQGZyZWVzb2Z0Lm9yZz4KLQotCSogYmJjb252LnBsOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIGJiY29udi5wbC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBncHJvZi50ZXhpOiBFeHRlbnNpdmUgYWRkaXRpb25zIHRvIGRvY3VtZW50IGFsbCBhcmd1bWVudHMgYW5kCi0Jb3V0cHV0IGZvcm1hdHMuCi0KLQkqIHN5bXRhYi5jIChzeW10YWJfZmluYWxpemUpOiBQcmVmZXIgZnVuY3Rpb24gc3ltYm9scyBvdmVyIGxpbmUKLQlzeW1ib2xzLgotCShkYmdfc3ltX2xvb2t1cCk6IENvcnJlY3QgZGVidWdnaW5nIG1lc3NhZ2VzLgotCi0JKiBncHJvZi5jIChtYWluKTogLS1zdW0gaW1wbGllcyAtLWxpbmUuCi0KLQkqIGNnX3ByaW50LmMgKGNnX3ByaW50KTogV2hlbiBkb2luZyBsaW5lIGJ5IGxpbmUgcHJvZmlsaW5nLCBkb24ndAotCXVzZSBhIG5vbi1mdW5jdGlvbiBhcyBhIG1haW4gbGlzdGluZyBpdGVtLgotCi0JKiBjYWxsX2dyYXBoLmMgKGNnX3RhbGx5KTogV2hlbiB1c2luZyBsaW5lIGJ5IGxpbmUgcHJvZmlsaW5nLCB1c2UKLSAJdGhlIGZ1bmN0aW9uIHN5bWJvbCBhcyB0aGUgY2hpbGQuCi0KLQkqIHN5bXRhYi5oIChOQkJTKTogRGVmaW5lLgotCShTeW0pOiBBZGQgYmJfYWRkciBhbmQgYmJfY2FsbHMgZmllbGRzLgotCSogYmFzaWNfYmxvY2tzLmMgKGJiX3JlYWRfcmVjKTogU2F2ZSBtdWx0aXBsZSBiYXNpYyBibG9ja3MgcGVyCi0Jc3ltYm9sLgotCShiYl93cml0ZV9ibG9ja3MpOiBBZGp1c3QgZm9yIG11bHRpcGxlIGJhc2ljIGJsb2NrcyBwZXIgc3ltYm9sLgotCShwcmludF9leGVjX2NvdW50cyk6IERvbid0IGNoZWNrIHdoZXRoZXIgYSBzeW1ib2wgaXMgdGhlIHN0YXJ0IG9mCi0JYSBiYXNpYyBibG9jay4gIFByaW50IGFsbCBiYXNpYyBibG9ja3MgZm9yIGEgc3ltYm9sLgotCShhbm5vdGF0ZV93aXRoX2NvdW50KTogUmV3cml0ZSB0byBwcmludCBhbGwgYmFzaWMgYmxvY2sgY291bnRzIGFuZAotCXRvIHBheSBhdHRlbnRpb24gdG8gd2lkdGggYXJndW1lbnQuCi0JKHByaW50X2Fubm90YXRlZF9zb3VyY2UpOiBEb24ndCBjaGVjayB3aGV0aGVyIHN5bWJvbCBpcyB0aGUgc3RhcnQKLQlvZiBhIGJhc2ljIGJsb2NrLgotCi0JTWFrZSBpdCBwb3NzaWJsZSB0byBidWlsZCBhIGNyb3NzIGdwcm9mLCBhbHRob3VnaCBhIGZldyBjYXNlcyBhcmUKLQlzdGlsbCBub3QgaGFuZGxlZDoKLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IE1ZX1RBUkdFVC4KLQkqIGdwcm9mLmg6IERvbid0IGluY2x1ZGUgTUFDSElORV9ILiAgRG9uJ3QgZGVmaW5lIEZPUEVOX1JCIG9yCi0JRk9QRU5fV0I7IGp1c3QgZ2V0IHRoZW0gZnJvbSBzeXNkZXAuaC4KLQkqIGNvcmUuaCAobWluX2luc25fc2l6ZSwgb2Zmc2V0X3RvX2NvZGUpOiBEZWNsYXJlLgotCSogY29yZS5jIChNSU5fSU5TTl9TSVpFKTogRG9uJ3QgZGVmaW5lLgotCShtaW5faW5zbl9zaXplLCBvZmZzZXRfdG9fY29kZSk6IE5ldyB2YXJpYWJsZXMuCi0JKGNvcmVfaW5pdCk6IEluaXRpYWxpemUgbWluX2luc25fc2l6ZSBhbmQgb2Zmc2V0X3RvX2NvZGUuCi0JKGZpbmRfY2FsbCk6IE5ldyBmdW5jdGlvbi4KLQkoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogRG9uJ3QgdXNlIG1pbl9kaXN0LiAgU2V0IGlzX3N0YXRpYyBpbgotCXBhc3MgMi4KLQkqIGhpc3QuYyAoVU5JVFNfVE9fQ09ERSk6IERlZmluZS4KLQkqIGdwcm9mLmMgKGRlZmF1bHRfZXhjbHVkZWRfbGlzdCk6IEFkZCAiX19tY291bnRfaW50ZXJuYWwiLgotCSogZ21vbi5oOiBDaGFuZ2UgVEFSR0VUX2FscGhhIHRvIF9fYWxwaGFfXy4KLQkqIGhlcnR6Lmg6IElmZGVmIE1BQ0gsIGRlZmluZSBoZXJ0eiBhcyBIWi4KLQkqIGFscGhhLmMgKGFscGhhX0luc3RydWN0aW9uKTogUmVuYW1lIGZyb20gSW5zdHJ1Y3Rpb24uICBDaGFuZ2UKLQlhbGwgcmVmZXJlbmNlcy4KLQkoYWxwaGFfZmluZF9jYWxsKTogUmVuYW1lIGZyb20gZmluZF9jYWxsLgotCSogYWxwaGEuaDogUmVtb3ZlLgotCSogZHVtbXkuYywgZHVtbXkuaDogUmVtb3ZlLgotCSogaTM4Ni5jIChpMzg2X2lzY2FsbCk6IFJlbmFtZSBmcm9tIGlzY2FsbC4gIENoYW5nZSBhbGwKLQlyZWZlcmVuY2VzLiAgQ2hlY2sgZm9yIGNhbGwgaW5zdHJ1Y3Rpb24sIG5vdCBqdW1wIG9yIGxjYWxsLgotCShpMzg2X2ZpbmRfY2FsbCk6IFJlbmFtZSBmcm9tIGZpbmRfY2FsbC4gIENvcnJlY3QgZm9yIFZNQS4KLQlDb3JyZWN0IGNhbGwgZGVzdGluYXRpb24gY29tcHV0YXRpb24uICBEb24ndCBkZXJlZmVyZW5jZSBzeW1ib2wgaWYKLQlpdCBpcyBOVUxMLgotCSogaTM4Ni5oOiBSZW1vdmUuCi0JKiBuczUzMi5jLCBuczUzMi5oOiBSZW1vdmUuCi0JKiBzcGFyYy5jIChDQUxMKTogRGVmaW5lLgotCShzcGFyY19maW5kX2NhbGwpOiBSZW5hbWUgZnJvbSBmaW5kX2NhbGwuCi0JKiBzcGFyYy5oOiBSZW1vdmUuCi0JKiB0YWhvZS5jOiBJbmNsdWRlIGNnX2FyY3MuaCwgY29yZS5oLCBoaXN0LmgsIGFuZCBzeW10YWIuaC4gIERvbid0Ci0JaW5jbHVkZSB0aW1lX2hvc3QuaC4KLQkoQ0FMTEYsIFBDKTogRGVmaW5lLgotCShlbnVtIHRhaG9lX29wZXJtb2RlcywgdGFob2Vfb3BlcmFuZGVudW0pOiBEZWZpbmUuICBSZW5hbWUgYWxsCi0JcmVmZXJlbmNlcyB0byBvcGVybW9kZXMgb3Igb3BlcmFuZGVudW0gdG8gdGhlc2UuCi0JKHRhaG9lX29wZXJhbmRtb2RlKTogUmVuYW1lIGZyb20gb3BlcmFuZG1vZGUuICBDYWxsIGFib3J0IGlmCi0Jc3dpdGNoIGRvZXMgbm90IHJldHVybi4KLQkodGFob2Vfb3BlcmFuZG5hbWUpOiBSZW5hbWUgZnJvbSBvcGVyYW5kbmFtZS4gIENhbGwgYWJvcnQgaWYKLQlzd2l0Y2ggZG9lcyBub3QgcmV0dXJuLgotCSh0YWhvZV9vcGVyYW5kbGVuZ3RoKTogUmVuYW1lIGZyb20gb3BlcmFuZGxlbmd0aC4gIENhbGwgYWJvcnQgaWYKLQlzd2l0Y2ggZG9lcyBub3QgcmV0dXJuLgotCSh0YWhvZV9yZWxhZGRyKTogUmVuYW1lIGZyb20gcmVsYWRkci4KLQkodGFob2VfZmluZF9jYWxsKTogUmVuYW1lIGZyb20gZmluZF9jYWxsLiAgVXNlIGNvcmVfdGV4dF9zcGFjZQotCXJhdGhlciB0aGFuIHRleHRzcGFjZS4KLQkqIHRhaG9lLmg6IFJlbW92ZS4KLQkqIHZheC5jIChDQUxMUywgUEMpOiBEZWZpbmUuCi0JKGVudW0gb3Blcm1vZGVzLCBvcGVyYW5kZW51bSwgc3RydWN0IG1vZGVieXRlKTogRGVmaW5lLgotCSh2YXhfb3BlcmFuZG1vZGUpOiBSZW5hbWUgZnJvbSBvcGVyYW5kbW9kZS4gIENhbGwgYWJvcnQgaWYgc3dpdGNoCi0JZG9lcyBub3QgcmV0dXJuLgotCSh2YXhfb3BlcmFuZG5hbWUpOiBSZW5hbWUgZnJvbSBvcGVyYW5kbmFtZS4gIENhbGwgYWJvcnQgaWYgc3dpdGNoCi0JZG9lcyBub3QgcmV0dXJuLgotCSh2YXhfb3BlcmFuZGxlbmd0aCk6IFJlbmFtZSBmcm9tIG9wZXJhbmRsZW5ndGguICBDYWxsIGFib3J0IGlmCi0Jc3dpdGNoIGRvZXMgbm90IHJldHVybi4KLQkodmF4X3JlbGFkZHIpOiBSZW5hbWUgZnJvbSByZWxhZGRyLgotCSh2YXhfZmluZF9jYWxsKTogUmVuYW1lIGZyb20gZmluZF9jYWxsLgotCSogdmF4Lmg6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogU2V0IHRvIGN5Z251cy4KLQkoTVlfVEFSR0VUKTogUmVtb3ZlLgotCShJTkNMVURFUyk6IFJlbW92ZSAtRFRBUkdFVF8kKE1ZX1RBUkdFVCkgYW5kIC1ETUFDSElORV9IPQotCVwiJChNWV9UQVJHRVQpLmhcIi4KLQkoZ3Byb2ZfU09VUkNFUyk6IEFkZCBpMzg2LmMsIGFscGhhLmMsIHZheC5jLCB0YWhvZS5jLCBzcGFyYy5jLgotCShncHJvZl9ERVBFTkRFTkNJRVMpOiBSZW1vdmUgJChNWV9UQVJHRVQpLm8uCi0JKGdwcm9mX0xEQUREKTogTGlrZXdpc2UuCi0JKG5vaW5zdF9IRUFERVJTKTogUmVtb3ZlIGFscGhhLmgsIGkzODYuaCwgbnM1MzIuaCwgc3BhcmMuaCwKLQl0YWhvZS5oLCB2YXguaCwgZHVtbXkuaC4KLQkoRVhUUkFfRElTVCk6IFJlbW92ZSBhbHBoYS5jLCBpMzg2LmMsIG5zNTMyLmMsIHNwYXJjLmMsIHRhaG9lLmMsCi0JdmF4LmMsIGR1bW15LmMuCi0JKCQoT0JKRUNUUykpOiBEb24ndCBkZXBlbmQgdXBvbiAkKE1ZX1RBUkdFVCkuaC4KLQkoJChNWV9UQVJHRVQpLm8pOiBSZW1vdmUgdGFyZ2V0LgotCShpMzg2Lm8sIGFscGhhLm8sIHZheC5vLCB0YWhvZS5vLCBzcGFyYy5vKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCi1Nb24gRGVjIDI5IDE0OjE3OjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29yZS5jIChjb3JlX3N5bV9jbGFzcyk6IFRyZWF0IHdlYWsgc3ltYm9scyBhcyB0ZXh0IHN5bWJvbHMuCi0JRnJvbSBEZWFuIEdhdWRldCA8ZGdhdWRldEBhcmN0aWMub3JnPi4KLQotV2VkIFNlcCAyNCAxMTozNTo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggY3VycmVudCBhdXRvbWFrZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU2F0IEF1ZyAgOSAxNjoyNTowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDIuOC4yLiAgQ2FsbAotCUFNX1BST0dfTElCVE9PTC4gIFJlbW92ZSBzaGFyZWQgbGlicmFyeSBoYW5kbGluZzsgbm93IGhhbmRsZWQgYnkKLQlsaWJ0b29sLiAgQWRkIEFNX0NPTkZJR19IRUFERVIuICBDaGFuZ2UgQUNfUFJPR19JTlNUQUxMIHRvCi0JQU1fUFJPR19JTlNUQUxMLiAgQWRkIEFNX0VYRUVYVC4KLQkqIE1ha2VmaWxlLmFtIChMSU5LKTogUmVtb3ZlLgotCShncHJvZl9MREZMQUdTKTogUmVtb3ZlCi0JKGdwcm9mX0RFUEVOREVOQ0lFUyk6IENoYW5nZSBsaWJiZmQuYSB0byBsaWJiZmQubGEuCi0JKGdwcm9mX0xEQUREKTogTGlrZXdpc2UuCi0JKCQoT0JKRUNUUykpOiBEZXBlbmQgdXBvbiBnY29uZmlnLmggYW5kIC4uL2JmZC9jb25maWcuaC4KLQkqIGdwcm9mLmg6IFVuZGVmaW5lIFBBQ0tBR0UgYW5kIFZFUlNJT04gYWZ0ZXIgaW5jbHVkaW5nIEJGRAotCXN5c2RlcC5oIGZpbGUsIHRoZW4gaW5jbHVkZSBuZXcgZ2NvbmZpZy5oIGZpbGUuCi0JKiBncHJvZi5jIChWRVJTSU9OKTogRG9uJ3QgZGVmaW5lLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGdjb25maWcuaW46IE5ldyBmaWxlLCBjcmVhdGVkIGJ5IGF1dG9oZWFkZXIuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCi1TYXQgSnVuIDI4IDIzOjIwOjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMi4KLQotTW9uIEp1biAxNiAxNTozMTozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChJTkNMVURFUyk6IEFkZCAtRERFQlVHLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBBcHIgMTUgMTQ6MTk6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQ2hhbmdlIHRvIHVzZSBhdXRvbWFrZToKLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogUnVuIEFNX0lOSVRfQVVUT01BS0UsIEFNX01BSU5UQUlORVJfTU9ERSwgYW5kCi0JQU1fQ1lHV0lOMzIuCi0JKiBhY2xvY2FsLm00OiBOZXcgZmlsZSwgY3JlYXRlZCBieSBhY2xvY2FsLgotCSogTWFrZWZpbGUuaW46IFJlcGxhY2Ugd2l0aCBmaWxlIGNyZWF0ZWQgYnkgYXV0b21ha2UgLS1jeWdudXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBBcHIgIDMgMTM6MjE6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBncHJvZi5jIChWRVJTSU9OKTogRGVmaW5lIGFzICIyLjguMSIuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotVGh1IE1hciAyNyAxNzoxNToyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmMgKG1haW4pOiBDb3JyZWN0IGNvcHlyaWdodCBtZXNzYWdlLgotCi1Nb24gTWFyIDI0IDExOjEyOjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBEZWZpbmUgVEFSR0VUXyQoTVlfVEFSR0VUKSB3aGVuIGNvbXBpbGluZy4KLSAgCSogZ21vbi5oOiBVc2UgYnl0ZXMgY291bnRzIHJhdGhlciB0aGFuIHNpemVvZiBpbiBzdHJ1Y3QgcmF3X3BoZHIKLSAJYW5kIHN0cnVjdCByYXdfYXJjLgotCi1Nb24gTWFyIDE3IDEwOjU0OjQ3IDE5OTcgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNnX2FyY3MuYyAoYXJjX2FkZCk6IG1lbXNldCgpIG5ld2x5IGFsbG9jZWQgYXJjIHRvIGVuc3VyZQotCWFsbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHdpdGggMC4KLQotU2F0IE1hciAxNSAxOToxNzozMSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogc3ltdGFiLmggKGZpbmRfY2FsbCk6IERlY2xhcmUuCi0JKiBjZ19hcmNzLmMgKGNnX2Fzc2VtYmxlKTogRG9uJ3QgZGVjbGFyZSBmaW5kX2NhbGwuCi0JKiBoaXN0LmMgKHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzKTogRGVjbGFyZS4KLQotVGh1IEZlYiAyNyAxMjo0Njo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEJTRDQ0X0ZPUk1BVCBpZiB0aGUgdGFyZ2V0IGxvb2tzIGxpa2UgYQotCUJTRDQuNCBkZXJpdmVkIHN5c3RlbS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluICguYy5vKTogQWRkIEBERUZTQC4KLQkqIGdtb25faW8uYyAoZ21vbl9vdXRfcmVhZCk6IEluIEJTRDQ0X0ZPUk1BVCBjb2RlLCBnZXQgcHJvZnJhdGUKLQlmcm9tIHByb2ZyYXRlIGZpZWxkLCBub3QgdmVyc2lvbiBmaWVsZC4KLQotVGh1IEphbiAxNiAxNzo0Mjo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGR1bW15LmMgKGZpbmRfY2FsbCk6IENsZWFyIGlnbm9yZV9kaXJlY3RfY2FsbHMuCi0KLVR1ZSBEZWMgMzEgMTU6NDQ6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmMubyk6IEFkZCAtRF9HTlVfU09VUkNFLiAgUHV0ICQoQ0ZMQUdTKSBhdCB0aGUKLQllbmQuCi0JKGdwcm9mKTogUHV0ICQoQ0ZMQUdTKSBhZnRlciB0aGUgb3RoZXIgb3B0aW9ucy4KLQotVHVlIE5vdiAyNiAxNzowODozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLVdlZCBPY3QgIDIgMTU6MjM6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5jIChmaW5kX2NhbGwpOiBBbGlnbiBwX2xvd3BjIHRvIGF2b2lkIGJ1cyBlcnJvci4KLQotVHVlIE9jdCAgMSAxNTo1ODoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmMgKHVzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogQ2hhbmdlIHZlcnNpb24gcHJpbnRpbmcgdG8gbWF0Y2ggY3VycmVudCBHTlUgc3RhbmRhcmRzLgotCi1GcmkgQXVnIDMwIDEyOjE2OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ21vbi5oOiBSZXBsYWNlICNlbGlmIHdpdGggI2Vsc2UvI2VuZGlmLgotCi1UaHUgQXVnIDI5IDE3OjA0OjEwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBBdWcgMjIgMTc6MTI6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBhbmQgc3Vic3RpdHV0ZSBITERFTlYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSExERU5WKTogTmV3IHZhcmlhYmxlLgotCShncHJvZik6IFVzZSAkKEhMREVOVikuCi0KLVdlZCBBdWcgIDcgMTQ6NDM6NTEgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29yZS5jIChyZWFkX2Z1bmN0aW9uX21hcHBpbmdzKTogQ2FzdCB4bWFsbG9jIHJldHVybi4KLQotVGh1IEp1bCAgNCAxMjowMTo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmMgKFZFUlNJT04pOiBEZWZpbmUgYXMgIjIuNy4xIi4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi0JKiBiYl9leGl0X2Z1bmMuYzogUmVuYW1lIGZyb20gX19iYl9leGl0X2Z1bmMuYywgc28gdGhhdCBpdCBjYW4gYmUKLQlzdG9yZWQgb24gYSBTeXN0ZW0gViBmaWxlIHN5c3RlbS4KLQotVGh1IEp1biAyNyAxMTozNjoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19JU0NfUE9TSVguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoZ3Byb2YpOiBQYXNzICQoQ0ZMQUdTKSBkdXJpbmcgbGluay4KLQkqIGhlcnR6LmM6IERvbid0IGluY2x1ZGUgPHN5cy90aW1lLmg+OyBsZXQgc3lzZGVwLmggaGFuZGxlIHRoYXQuCi0JSWYgSEFWRV9TRVRJVElNRVIgaXMgbm90IGRlZmluZWQsIHRyeSB1c2luZyBzeXNjb25mLgotCi1Nb24gSnVuIDI0IDE4OjI3OjI4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChleGVjX3ByZWZpeCwgYmluZGlyLCBsaWJkaXIsIG1hbmRpciwgaW5mb2RpciwgZGF0YWRpciwKLQlJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgotCShBQ19QUk9HX0lOU1RBTEwpOiBhZGRlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIEp1biAyNCAxMjowMzowOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYWxwaGEqLSotb3NmKiwgbGluayBhZ2FpbnN0IGxpYmJmZC5hIGlmIG5vdAotCXVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCi1UdWUgSnVuIDE4IDE3OjM1OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29yZS5jIChjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0JKiBzb3VyY2UuYyAoc291cmNlX2ZpbGVfbG9va3VwX3BhdGgpOiBMaWtld2lzZS4KLQotTW9uIEFwciAgOCAxNDo0NDozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTWFyIDIxIDE3OjE4OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29yZS5jIChjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zKTogTW92ZSBmaWxlbmFtZSBhbmQgZnVuY19uYW1lCi0JaW5zaWRlIGlmZGVmIHdoZXJlIHRoZXkgYXJlIHVzZWQuCi0KLQkqIGNvcmUuYyAoY29yZV9zeW1fY2xhc3MpOiBQYXJlbnRoZXNpemUgJiYgd2l0aGluIHx8LgotCSogc3ltdGFiLmMgKHN5bXRhYl9maW5hbGl6ZSk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbi4KLQotCSogY2dfcHJpbnQuaCAoY2dfcHJpbnRfZmlsZV9vcmRlcmluZyk6IERlY2xhcmUuCi0JKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKTogRGVjbGFyZS4KLQotCSogX19iYl9leGl0X2Z1bmMuYyAoX19iYl9leGl0X2Z1bmMpOiBSZXBsYWNlIGJjb3B5IHdpdGggbWVtY3B5LgotCSogY2dfYXJjcy5jIChhcmNfYWRkKTogTGlrZXdpc2UuCi0JKiBjZ19wcmludC5jIChjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyk6IExpa2V3aXNlLgotCi1UaHUgTWFyIDIxIDE3OjAyOjAyIDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGdwcm9mLmMgKGRlZmF1bHRfZXhjbHVkZWRfbGlzdCk6IEFkZCAiX19tY291bnQiLgotCi0JKiBncHJvZi5jIChtYWluKTogQ2hhbmdlIGlmZGVmIF9fb3NmX18gdG8gX19hbHBoYV9fLgotCi0JKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiBJZiBCU0Q0NF9GT1JNQVQgaXMgZGVmaW5lZCwgZ2V0IHRoZQotCXByb2ZpbGluZyByYXRlIGZyb20gdGhlIGhlYWRlci4KLQotCSogZ21vbi5oIChzdHJ1Y3QgcmF3X3BoZHIpOiBPbmx5IGluY2x1ZGUgcGFkIGlmIGJvdGggX19hbHBoYV9fIGFuZAotCV9fb3NmX18gYXJlIGRlZmluZWQuICBBZGQgbmV3IGZpZWxkcyBpZiBCU0Q0NF9GT1JNQVQgaXMgZGVmaW5lZC4KLQotCSogYWxwaGEuaCAoTUlOX0lOU05fU0laRSk6IERlZmluZS4KLQkqIGNvcmUuYyAoTUlOX0lOU05fU0laRSk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMS4KLQkoY29yZV9zeW1fY2xhc3MpOiBJZ25vcmUgZGVidWdnaW5nIHN5bWJvbHMuCi0JKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IFVzZSBNSU5fSU5TTl9TSVpFIHdoZW4gZ2F0aGVyaW5nIGxpbmUKLQlpbmZvcm1hdGlvbi4KLQotV2VkIE1hciAyMCAxODoxNTo0NyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY2dfcHJpbnQuYyAoY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcpOiBGaXggX19HTlVDX18gbWlzc3BlbGxlZAotCWFzIF9fR05VX0NfXy4KLQkob3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MpOiBMaWtld2lzZS4KLQotVHVlIE1hciAxMiAxMjoxOTo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotU3VuIEZlYiAxOCAxNTowNjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yICdkbyBub3QgbWl4JyBmcm9tIG5hdGl2ZSBsaW5rZXIgYmVmb3JlCi0gCXRyeWluZyB0byB1c2UgLXJwYXRoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRmViIDEzIDE1OjMyOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgSERMRkxBR1MgZm9yICotKi1ocHV4IHdpdGggLS1lbmFibGUtc2hhcmVkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgRmViICA3IDE0OjAzOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgQ0MuICBMb29rIGZvciAtLWVuYWJsZS1zaGFyZWQuICBTZXQKLQlCRkRMSUIgYW5kIEhMREZMQUdTIGFuZCBzdWJzdGl0dXRlIHRoZW0uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoTElCUyk6IFVzZSBAQkZETElCQC4KLQkoSExERkxBR1MpOiBOZXcgdmFyaWFibGUuCi0JKGdwcm9mKTogVXNlICQoSExERkxBR1MpLgotCi1Nb24gRmViICA1IDE2OjM0OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGJmZCBhbmQgb3Bjb2RlcyBhcyBzaGFyZWQgbGlicmFyaWVzLCBiYXNlZCBvbgotCXBhdGNoZXMgZnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBNYWtlZmlsZS5pbiAoTElCREVQUyk6IE5ldyB2YXJpYWJsZS4KLQkoTElCUyk6IFVzZSAtTC4uL2JmZCAtbGJmZC4KLQkoZ3Byb2YpOiBEZXBlbmQgdXBvbiAkKExJQkRFUFMpIHJhdGhlciB0aGFuICQoTElCUykuCi0KLVNhdCBEZWMgMzAgMTA6MTE6MDMgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChsb25nX29wdGlvbnMpOiBBZGQgIi0tZnVuY3Rpb24tb3JkZXJpbmciIGFuZAotCSItLWZpbGUtb3JkZXJpbmciIG9wdGlvbnMuCi0JKHVzYWdlKTogQWRkIG5ldyBvcHRpb25zIHRvIHVzYWdlIG1lc3NhZ2UuCi0JKG1haW4pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0JKiBncHJvZi5oIChTVFlMRV9GVU5DVElPTl9PUkRFUik6IERlZmluZS4KLQkoU1RZTEVfRklMRV9PUkRFUik6IERlZmluZS4KLQkoZnVuY3Rpb25fbWFwcGluZ19maWxlKTogRGVjbGFyZS4KLQkqIGNnX2FyY3MuYyAoYXJjcywgbnVtYXJjcyk6IE5ldyBnbG9iYWxzLgotCShhcmNfYWRkKTogUHV0IG5ldyBhcmNzIGludG8gdGhlIGFyYyBhcnJheSBzbyB0aGUgZnVuY3Rpb24vZmlsZQotCW9yZGVyaW5nIGNvZGUgY2FuIGV4YW1pbmUgdGhlbS4KLQkqIGNnX2FyY3MuaCAoc3RydWN0IGFyYyk6IE5ldyBmaWVsZCAiaGFzX2JlZW5fcGxhY2VkIi4KLQkoYXJjcywgbnVtYXJjcyk6IERlY2xhcmUgbmV3IGdsb2JhbHMuCi0JKiBjb3JlLmMgKHN5bWJvbF9tYXAsIHN5bWJvbF9tYXBfY291bnQpOiBOZXcgZ2xvYmFscy4KLQkocmVhZF9mdW5jdGlvbl9tYXBwaW5ncyk6IE5ldyBmdW5jdGlvbiB0byByZWFkIGluIGEgZnVuY3Rpb24KLQl0byBvYmplY3QgbWFwIGZpbGUuCi0JKGNvcmVfaW5pdCk6IENhbGwgcmVhZF9mdW5jdGlvbl9tYXBwaW5ncyBpZiBhIGZ1bmN0aW9uIG1hcHBpbmcKLQlmaWxlIGV4aXN0cy4KLQkoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyk6IEhhbmRsZSBmdW5jdGlvbiB0byBvYmplY3QgZmlsZQotCW1hcHBpbmdzLgotCSogc3ltdGFiLmggKHN0cnVjdCBzeW0pOiBOZXcgZmllbGRzICJtYXBwZWQiLCAiaGFzX2JlZW5fcGxhY2VkIiwKLQkibnVzZXMiLCAicHJldiIuCi0JKiBjZ19wcmludC5jIChjbXBfYXJjX2NvdW50KTogTmV3IGZ1bmN0aW9uIGZvciBzb3J0aW5nIGFyY3MuCi0JKGNtcF9mdW5fbnVzZXMpOiBMaWtld2lzZSBmb3IgZnVuY3Rpb25zLgotCShjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyk6IE5ldyBmdW5jdGlvbiB0byBwcmludCBhIHN1Z2dlc3RlZAotCWZ1bmN0aW9uIG9yZGVyaW5nLgotCShjZ19wcmludF9maWxlX29yZGVyaW5nKTogTGlrZXdpc2UgZm9yIG9yZGVyaW5nIC5vIGZpbGVzLgotCShvcmRlcl9hbmRfZHVtcF9mdW5jdGlvbnNfYnlfYXJjcyk6IEhlbHBlciBmdW5jdGlvbiBmb3IgZnVuY3Rpb24KLQlhbmQgb2JqZWN0IGZpbGUgb3JkZXJpbmcgY29kZS4KLQotU3VuIERlYyAyNCAyMTozMjoyNyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvcmUuYyAoY29yZV9zeW1fY2xhc3MpOiBJZ25vcmUgc3ltYm9scyB3aXRob3V0IEJTRl9GVU5DVElPTgotCXNldCBpZiBpZ25vcmVfbm9uX2Z1bmN0aW9uIGlzIHNldC4KLQkqIGdwcm9mLmggKGlnbm9yZV9ub25fZnVuY3Rpb25zKTogRGVjbGFyZS4KLQkqIGdwcm9mLmMgKGlnbm9yZV9ub25fZnVuY3Rpb25zKTogRGVmaW5lLgotCShsb25nX29wdGlvbnMpOiBBZGQgImlnbm9yZS1ub24tZnVuY3Rpb25zIi4KLQkodXNhZ2UpOiBBZGQgbmV3IG9wdGlvbnMuCi0JKG1haW4pOiBSZWNvZ25pemUgIi1EIiBhbmQgIi0taWdub3JlLW5vbi1mdW5jdGlvbnMiIG9wdGlvbi4KLQotVHVlIE5vdiAyMSAxMzoyNDozOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKC5tLmMpOiBTdHJpcCBvdXQgZGlyZWN0b3J5IG5hbWUgZnJvbSBmdW5jdGlvbgotCW5hbWUuCi0KLQkqIGhpc3QuYyAoc2NhbGVfYW5kX2FsaWduX2VudHJpZXMpOiBEb24ndCB1c2UgREVGVU5fVk9JRC4gIERvCi0JVU5JVFNfVE9fQ09ERSBhZGp1c3RtZW50IHVuY29uZGl0aW9uYWxseTsgY29tcGlsZXIgY2FuIG9wdGltaXplCi0JYXdheSB6ZXJvLW9mZnNldCBjYXNlLiAgUmVmZXIgdG8gc2NhbGVkX2FkZHIsIG5vdCBhbGlnbmVkX2FkZHIuCi0KLQkqIHZheC5jOiBEb24ndCBpbmNsdWRlIHZheC5oIGhlcmUuCi0KLVRodSBOb3YgMTYgMDM6NDE6MzcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlWZXJzaW9uIDIuNiByZWxlYXNlZC4KLQotV2VkIE5vdiAgOCAxMTo0MDowNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmMgKG1haW4pOiBDYXN0IGdldGVudiByZXR1cm4gdmFsdWUuCi0KLU1vbiBOb3YgIDYgMTU6MDU6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogTmV3IHRhcmdldC4KLQotV2VkIE5vdiAgMSAxMjo1MToyMSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6ICBSZW5hbWUgdG8gR0VOX0ZJTEVTLCB0byBhdm9pZCBjb25mdXNpb24uCi0JKGFsbCk6ICBEZXBlbmQgb24gJChHRU5fRklMRVMpLCBub3QgZGlzdHN0dWZmICh3aGljaCBhbHNvIGRlcGVuZHMKLQlvbiBpbmZvKS4KLQotV2VkIE5vdiAgMSAxNToyMzoxNSAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogc3ltX2lkcy5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQotV2VkIE9jdCAyNSAxMzoyNDozMSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RzdHVmZik6ICBBbHNvIG1ha2UgaW5mby4KLQkobW9zdGx5Y2xlYW4pOiAgRG9uJ3QgcmVtb3ZlIGdwcm9mLmluZm8qLgotCShtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6ICBBbHNvIHJlbW92ZSAqLmluZm8qLgotCi1GcmkgT2N0ICA2IDE2OjI1OjMyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlY2llcyBmb3IgJChPQkpTKSBvbiBoZWFkZXIgZmlsZXMuCi0KLQkqIGNnX3ByaW50LmMgKHByaW50X2N5Y2xlLCBwcmludF9tZW1iZXJzLCBjZ19wcmludF9pbmRleCk6IEZpeCBuZXcKLQlzdHlsZSBvdXRwdXQgZm9ybWF0IHRvIG1ha2UgaXQgY29uc2lzdGVudC4KLQkqIGR1bW15LmMgKGZpbmRfY2FsbCk6IEZpeCB0eXBvIGluIGVycm9yIG1lc3NhZ2UuCi0KLVdlZCBTZXAgMjAgMTM6MjE6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQsIHN5bm9ueW0gZm9yCi0JcmVhbGNsZWFuLgotCi1GcmkgU2VwICA4IDE0OjM4OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIGluICQodG9vbGRpcikuCi0KLUZyaSBBdWcgMjUgMTU6MzA6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlOUzMySyBjaGFuZ2VzIGZyb20gSWFuIERhbGw6Ci0JKiBjb25maWd1cmUuaW46IFVzZSBuczMyaywgbm90IG5zNTMyLgotCSogbnM1MzIuYzogSW5jbHVkZSBzeW10YWIuaC4KLQkoZmluZF9jYWxsKTogUmVuYW1lZCBmcm9tIGZpbmRjYWxsLiAgUHJpbnQgYSBtZXNzYWdlLgotCSogbnM1MzIuaDogUmVtb3ZlIGR1bW15LmggY29tbWVudHMuCi0KLVR1ZSBBdWcgMjIgMTA6MDA6NDUgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVtb3ZlICJicm9rZW5zZWQiIGhhY2ssIHVubmVjZXNzYXJ5IG5vdwotCXRoYXQgd2UncmUgdXNpbmcgYXV0b2NvbmYuCi0KLVdlZCBKdWwgMTkgMTg6NDY6MTMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvcmUuYyAoZ2V0X3NyY19pbmZvKTogQ2FzdCBhcmcgNyBvZiBiZmRfZmluZF9uZWFyZXN0X2xpbmUKLQl0byBwcm9wZXIgdHlwZSBvZiAidW5zaWduZWQgaW50ICoiLgotCi1GcmkgSnVuIDE2IDE1OjI5OjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGNoYW5nZXF1b3RlIGFyb3VuZCB1c2Ugb2YgW10uCi0KLU1vbiBKdW4gMTIgMTI6MTQ6NTIgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuLCByZWFsY2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlIGFuZAotCSAgY29uZmlnLmxvZy4KLQotV2VkIE1heSAxNyAxNzo1Njo1MyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEFkZGVkIGNvbmZpZy5zdGF0dXMgdG8gZGVwZW5kZW5jeSBsaXN0LgotCSAgKGNvbmZpZy5zdGF0dXMpOiBOZXcgdGFyZ2V0LgotCSAgKFNIRUxMKTogTmV3IGRlZmluaXRpb24uCi0KLVR1ZSBBcHIgMjUgMjE6MTE6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgb24gImFsbCIuCi0KLVRodSBBcHIgMjAgMTc6Mjk6MDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBNWV9NQUNISU5FIHRvIE1ZX1RBUkdFVCwKLQl0byBtYXRjaCBjb25maWd1cmUgc2NyaXB0LgotCi1XZWQgQXByIDE5IDExOjE5OjM3IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogZ2VuLWMtcHJvZy5hd2s6IENoYW5nZWQgcmVmZXJlbmNlIHRvICJtYWtlLWMtcHJvZy5hd2siIGluCi0JICBjb21tZW50IGVtaXR0ZWQgYnkgdGhpcyBzY3JpcHQgdG8gZ2VuLWMtcHJvZy5hd2suCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IENvbnZlcnRlZCB0byB1c2UgYXV0b2NvbmYuCi0JKiBjb25maWd1cmU6IE5ldyBmaWxlLCBnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjMuCi0JKiBjb25maWcve210LWFscGhhLCBtdC1kdW1teSwgbXQtaTM4NiwgbXQtbnM1MzIsIG10LXNwYXJjLAotCSAgbXQtdGFob2UsIG10LXZheH06IFJlbW92ZWQuCi0KLU1vbiBNYXIgMTMgMjE6NDQ6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogX19iYl9leGl0X2Z1bmMuYzogTmV3IGZpbGUsIGZyb20gRGF2aWQgTW9zYmVyZ2VyLVRhbmcuCi0KLQlUaHUgRmViICA5IDE2OjU2OjA3IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogQWxsICouYzogTW9yZSBjbGVhbnVwIHRvd2FyZHMgR05VIGZvcm1hdC4KLQotCSogZ21vbl9vdXQuaCAoc3RydWN0IGdtb25faGlzdF9oZHIsIHN0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQpOiAKLQlyZXBsYWNlZCBzaXplb2YgKGJmZF92bWEpIGJ5IHNpemUgKGNoYXIqKSBiZWNhdXNlIEtlbiB0ZWxscyBtZQotCXRoYXQgYmZkX3ZtYSBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgYXQgbGVhc3QgYXMgYmlnIGFzIGEgcG9pbnRlci4KLQotCShHTU9OX1JlY29yZF90YWcpOiBhZGRlZCBleHBsaWNpdCBlbnVtZXJhdGlvbiB2YWx1ZXMgdG8gZW5zdXJlCi0JY29tcGF0aWJpbGl0eSBhY3Jvc3MgY29tcGlsZXJzLgotCi0JKiBnbW9uX2lvLmMgKGdldF92bWEsIHB1dF92bWEpOiByZXBsYWNlZCBzaXplb2YoYmZkX3ZtYSkgYnkKLQlzaXplb2YoY2hhciopLgotCi1UdWUgRmViICA3IDE3OjI0OjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIEFsbCAqLmMgYW5kICouaCBmaWxlczogUmFuICJpbmRlbnQgLWdudSIuICBDbGVhbmVkIHVwIGEgY291cGxlCi0Jb2YgY29uc3RydWN0cyBHTlUgaW5kZW50IGNvdWxkbid0IGhhbmRsZS4gIEJsb2NrIGNvbW1lbnRzIG5vdCB5ZXQKLQlyZXdyaXR0ZW4gaW4gR05VIGZvcm1hdC4KLQotCSogZ3Byb2YuYyAoVkVSU0lPTik6IENoYW5nZWQgdG8gMi42LCB0byBnZXQgaW4gc3luYyBmb3IgbmV4dAotCWJpbnV0aWxzIHJlbGVhc2UuCi0KLVN1biBGZWIgIDUgMTY6MTk6NDYgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBzeW10YWIuYyAoc3ltdGFiX2ZpbmFsaXplKTogZW5zdXJlIGdsb2JhbHMgc3ltYm9scyByZWFsbHkKLQlhcmUgZmF2b3JlZCBvdmVyIHN0YXRpYyBvbmVzLS0tZXZlbiBpZiB0aGVpciBuYW1lIGxvb2tzIGxlc3MKLQlwcmVmZXJhYmxlOyB0aGlzIGlzIGltcG9ydGFudCBmb3IgSFAtVVg7IGZvciBleGFtcGxlLCB0aGVyZQotCWlzIGEgc3RhdGljIGxhYmVsIEx0ZXh0X3NvbWV0aGluZyB0aGF0IGFsaWFzZXMgdGhlIGdsb2JhbAotCXN5bWJvbCBfc3RhcnQKLQotCSogaGlzdC5jIChoaXN0X3ByaW50KTogYXV0by1zY2FsaW5nIGlzIG5vdyBpbiBlZmZlY3QgZm9yIEZTRi1zdHlsZQotCW91dHB1dCBvbmx5OyBhbHNvLCBhdXRvLXNjYWxpbmcgaXMgbm93IHBlcmZvcm1lZCBiYXNlZCBvbgotCXBlci1jYWxsLCByYXRoZXIgdGhhbiB0b3RhbCBleGVjdXRpb24gdGltZSwgd2hpY2ggaXMgd2hhdCBpdCB3YXMKLQltZWFudCB0byBiZS4KLQotCSogZ3Byb2YuaCAoRmlsZV9Gb3JtYXQpOiBuZXcgdHlwZS4KLQotCSogZ3Byb2YuYyAoVkVSU0lPTik6IHVwcGVkIHRvIDIuNy0tLXNlZW1zIHRvIGJlIGNvbXBsZXRlbHkgb3V0IG9mCi0Jc3luYyB3aXRoIEN5Z251cyB2ZXJzaW9uIG51bWJlcnMgdGhvdWdoLi4uCi0KLQkobG9uZ19vcHRpb25zKTogcmVuYW1lZCAtLWdtb24taW5mbyB0byAtLWZpbGUtaW5mbywgLS13aWR0aCBhZGRlZCwKLQlyZW5hbWVkIC0tb2xkLWZpbGUtZm9ybWF0IHRvIC0tZmlsZS1mb3JtYXQKLQkobWFpbik6IGRpdG87IGFsc28gYWRkZWQgc3VwcG9ydCB0byByZWFkIHByb2YgZmlsZXMsIGJ1dCBhcwotCW1vbl9vdXRfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCwgaXQncyAjaWZkZWYnZCBvdXQgZm9yIG5vdwotCi0JKHVzYWdlKTogdXBkYXRlIHRvIHJlZmxlY3QgbmV3IG9wdGlvbnMuCi0KLQkqIGdtb25faW8uYzogcmVwbGFjZWQgIm9sZF9maWxlX2Zvcm1hdCIgYnkgbW9yZSBnZW5lcmFsCi0gICAgICAgICJmaWxlX2Zvcm1hdCIgb3B0aW9uCi0KLQkqIGdtb24uaCAoc3RydWN0IHJhd19waGRyKTogZml4ZWQgZGVjbGFyYXRpb24gZm9yIE9TRi8xLgotCi0JKiBjb3JlLmMgKGNvcmVfc3ltX2NsYXNzKTogYWRkZWQgYmFjayBjaGVjayBmb3IgX19nbnVfY29tcGlsZWQgYW5kCi0JX19fZ251X2NvbXBpbGVkIGZvciB0aGUgYmVuZWZpdCBvZiBzeXN0ZW1zIHdpdGhvdXQKLQliZmRfZmluZF9uZWFyZXN0X2xpbmUoKSBzdXBwb3J0Ci0KLQkoZ2V0X3NyY19pbmZvKTogbm93IHRoZSBsaWJiZmQgaXMgZml4ZWQsIGludm9rZSBiZmRfZmluZF9uZWFyZXN0X2xpbmUoKQotCXdpdGggc2VjdGlvbi1yZWxhdGl2ZSBhZGRyZXNzZXMKLQotCShjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zKTogZ2V0X3NyY19pbmZvKCkgY2FsbHMgYXJlIGN1cnJlbnRseQotCWVuYWJsZWQgZm9yIE9TRi8xIG9ubHkuICBJdCBhcHBlYXJzIHRvIHdvcmsgYWxscmlnaHQgZm9yIFN1bk9TCi0gICAgICAgIDQuMS54IGFzIHdlbGwsIGJ1dCBvbiBTUEFSQ3MgaXQgZ2V0cyBwYWluZnVsbHkgc2xvdyB3aXRoIHRoZQotICAgICAgICBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGFvdXRfMzJfZmluZF9uZWFyZXN0X2xpbmUoKTsKLSAgICAgICAgdW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyB0aGF0IHN0YXRpYyBmdW5jdGlvbnMgd2lsbCBub3QgaGF2ZSB0aGVpcgotCWZpbGVuYW1lIHByaW50ZWQgaW4gdGhlIGNhbGwtZ3JhcGggZnVuY3Rpb24gaW5kZXg7IGxpbmUtbGV2ZWwKLQlwcm9maWxpbmcgc2hvdWxkIHN0aWxsIHdvcmssIGJ1dCByZXF1aXJlcyBzb21lIHBhdGllbmNlCi0KLQkqIGNnX3ByaW50LmMgKGNnX3ByaW50X2luZGV4KTogc2FuaXRpc2VkIHByaW50aW5nIG9mIGluZGV4IHdoZW4KLQl1c2luZyBGU0Ytc3R5bGUgb3V0cHV0OyBpbiBwYXJ0aWN1bGFyLCBvdXRwdXQgd2lkdGggaXMgbm93IGNvbnRyb2xsZWQKLQl2aWEgb3B0aW9uIC0td2lkdGggYW5kIHRoZSBmdW5jdGlvbiB0cmllcyBoYXJkIHRvIGtlZXAgY29sdW1ucwotCWFsaWduZWQgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgKG9jY2FzaW9uYWwpIGxvbmcgbmFtZXMKLQotCSogTk9URVM6IGEgZmlyc3Qgc2hvdCBhdCB1cGRhdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KLQotV2VkIEZlYiAgMSAxOTowNzo0NCAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIGNvcmUuYyAoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyk6IGZpeGVkIGNvbXB1dGF0aW9uIG9mIG1pbl92bWEKLQlhbmQgbWF4X3ZtYS4KLQotCSogKi5jOiByZW1vdmVkIHJjc2lkLgotCi1UdWUgSmFuIDMxIDE2OjE4OjE4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIExvdHMgb2YgY2hhbmdlcyBmcm9tIERhdmlkIE1vc2Jlcmdlci1UYW5nOgotCi0JVHVlIE9jdCAyNSAxOToyMDoxNCAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwk8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogZ3Byb2YuYyAobWFpbik6IHB1dCBwYXJlbnRoZXNlcyBhcm91bmQgJiB3aXRoaW4gJiYuCi0KLQkqIGJhc2ljX2Jsb2Nrcy5jIChiYl9yZWFkX3JlYyk6IHByaW50IHdhcm5pbmcgbWVzc2FnZSAob25jZSkgd2hlbgotCWlnbm9yaW5nIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMuCi0KLQkqIHNvdXJjZS5jIChzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSk6IGNvcnJlY3RlZCBzZWNvbmQgYXJndW1lbnQgdG8KLQlzdHJjbXAoKS4KLQotCSogaGlzdC5jIChwcmludF9oZWFkZXIpOiBtZXJnZWQgRnJpIE9jdCAyMSAxODo1ODowMiAxOTk0IGNoYW5nZSBieQotCUtlbiBSYWVidXJuIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4gZnJvbSBiaW51dGlscy0yLjUuMS4KLQotCSogZ21vbl9pby5jIChnbW9uX291dF9yZWFkKTogdGhlIG91dHB1dCBzdHVsZSBTVFlMRV9HTU9OX0lORk8gaXMgbm93Ci0Jc3VwcG9ydGVkIGJvdGggZm9yIG9sZCBhbmQgbmV3ICh2ZXJzaW9uZWQpIGdtb24ub3V0IGZpbGVzLiAgT2xkCi0JZmlsZXMgYXJlIGlkZW50aWZpZWQgYXMgdmVyc2lvbiAwLgotCi0JKiBnbW9uLmggKHN0cnVjdCByYXdfYXJjKTogY291bnQgZmllbGQgaXMgbm93IHNpemVvZihsb25nKSBieXRlcwotCWxvbmcgKGluc3RlYWQgb2YgNCkgYmVjYXVzZSB0aGF0IGlzIHdoYXQgT1NGLzEgdjMuMCB1c2VzLgotCi0JKiBjb3JlLmM6IG1pbm9yIGZpeGVzIGFuZCBkZWJ1Z2dpbmcgaW5mbyBjaGFuZ2VzLgotCi0JU3VuIFNlcCAxMSAxODo0Nzo0NyAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogY29yZS5jIChjb3JlX2luaXQpOiBpZiAudGV4dCBjYW5ub3QgYmUgZm91bmQsIHRyeSAkQ09ERSQgKHRoZQotCW5hbWUgb2YgdGhlIHRleHQtc2VjdGlvbiB1bmRlciBIUC1VWCkuCi0KLQkqIGhpc3QuYyAoaGlzdF9hc3NpZ25fc2FtcGxlcyk6IGZpeGVkIG9mZi1ieS1vbmUgYnVnOiBoaWdocGMKLQlwb2ludHMgb25lIHBhc3QgdGhlIGxhc3Qgc2FtcGxpbmcgYmluLCBzbyBoaXN0X3NjYWxlIHNob3VsZCBiZQotCWNvbXB1dGVkIGFzICJoaXN0X3NjYWxlIC89IGhpc3RfbnVtX2JpbnMiLCBub3QgImhpc3Rfc2NhbGUgLz0KLQloaXN0X251bV9iaW5zIC0gMSIuCi0KLQkqIGdtb25faW8uYywgaGlzdC5jLCBoaXN0Lmg6IHJlbmFtZWQgaGlzdF9udW1fc2FtcGxlcyB0bwotCWhpc3RfbnVtX2JpbnMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgYWxwaGEtKi0qKSBmb3IgcGVyLXRhcmdldCBjb25maWcuCi0KLQkqIGFscGhhLmMsIGFscGhhLmg6IGNyZWF0ZWQuCi0KLQkqIGdwcm9mLmMgKGRlZmF1bHRfZXhjbHVkZWRfbGlzdCk6IDxsb2NvcmU+LCA8aGljb3JlPiBhZGRlZC4KLQotCSogY29yZS5jIChjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zLCBjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOgotCWV4cGxpY2l0bHkga2VlcCB0d28gc2VudGluZWxzICI8bG9jb3JlPiIgYW5kICI8aGljb3JlPiIgdGhhdCBjYXRjaAotCWFsbCBhZGRyZXNzZXMgb3V0c2lkZSB0aGUgdGV4dC1zcGFjZS4gIFRodXMsIHN5bV9sb29rdXAoJnN5bXRhYiwKLQlhZGRyKSBjb250aW51ZXMgdG8gZ3VhcmFudGVlIG5vdCB0byByZXR1cm4gMCBvbiBhbnkgYWRkcmVzcy4gIEl0Ci0JYWxzbyBhdm9pZHMgaW5jb3JyZWN0bHkgY3JlZGl0aW5nIHRoZSBmaXJzdC9sYXN0IHN5bWJvbCBpbiB0aGUKLQl0ZXh0LXNwYWNlLgotCi0JKiBjb3JlLmMgKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IGFsd2F5cyBjcmVhdGUgZnVuY3Rpb24gc3ltYm9scwotCWZpcnN0LCB0aGVuIG1lcmdlIGluIGxpbmUgc3ltYm9sczsgdGhpcyBpcyBzbyB0aGF0IGlmIHBhcnRzIG9mIHRoZQotCXByb2dyYW0gd2VyZSBjb21waWxlZCB3aXRob3V0IC1nLCBmdW5jdGlvbi1sZXZlbCBzeW1ib2xzIGFyZQotCWF2YWlsYWJsZSBzdGlsbC4KLQotCSogdXRpbHMuYyAocHJpbnRfbmFtZV9vbmx5KTogc3VwcG9ydCBmb3IgcHJpbnRfcGF0aCBhZGRlZC4KLQotCSogc3ltdGFiLmMgKGNtcF9hZGRyKTogYWxzbyB1c2UgaXNfZnVuYyBmbGFnIGluIGNvbXBhcmlzb24uCi0JKHN5bXRhYl9maW5hbGl6ZSk6IHJldHVybiBpbW1lZGlhdGVseSB3aGVuIHRhYmxlIGVtcHR5OyBub3cKLQltb3JlIGNhcmVmdWwgYWJvdXQgZ2V0dGluZyByaWQgb2YgdGhlIHJpZ2h0IGR1cGxpY2F0ZSBzeW1ib2wuCi0KLQkqIHNwYXJjLmMgKGZpbmRfY2FsbCk6IG1hbnkgZml4ZXMtLS10aGlzIGZ1bmN0aW9uIHdhcyByYXRoZXIKLQlib3RjaGVkIGluIGJpbnV0aWxzLTIuNCBhbHJlYWR5OyBpdCBzaG91bGQgd29yayBhZ2Fpbi4KLQotCSogc291cmNlLmMgKHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoKTogUEFUSCBpcyBub3cgc3RyZHVwJ2VkIChpdCBpcwotCW5vdCBnb29kIHRvIHJlbHkgb24gZ2V0X3NyY19pbmZvKCkgdG8gcmV0dXJuIGRpc3RpbmN0IHN0cmluZwotCXBvaW50ZXJzKS4KLQotCSogc2VhcmNoX2xpc3QuYyAoc2VhcmNoX2xpc3RfYXBwZW5kKTogYWRkZWQgY2FzdCBmb3IgeG1hbGxvYygpLgotCi0JKiBoaXN0LmM6IGFkZGVkIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uIHRvIHNvbWUgb2YgdGhlIGdsb2JhbAotCXZhcmlhYmxlczsgZml4ZWQgU0l0YWIgKHNjYWxlcyB3ZXJlIG9mZiBieSBhIGZhY3RvciBvZiAxMCkuCi0KLQkqIGhpc3QuaDogaW5jbHVkZSBvZiBiZmQuaCBhZGRlZC4KLQotCSogZ3Byb2YuYywgZ3Byb2YuaCAocHJpbnRfcGF0aCk6IGFkZGVkLgotCi0JKiBncHJvZi5oIChNQVgpOiBmaXhlZC4KLQotCSogZ21vbl9vdXQuaDogcmVuYW1lZCBnbW9uX3RpbWVfaGlzdF9oZHIgdG8gZ21vbl9oaXN0X2hkci4KLQotCSogZ21vbl9pby5jOiBhZGRlZCBzb21lIGNhc3RzIHRvIChsb25nKSBzbyB3ZSBjYW4gYWx3YXlzIHByaW50IGFzICVseAotCi0JKiBjb3JlLmMgKGNvcmVfZ2V0X3RleHRfc3BhY2UpOiBmaXhlZCB0byBtYWtlIGl0IHdvcmsuCi0KLQkqIGNnX3ByaW50LmMgKGNnX3ByaW50X2luZGV4KTogYWRkZWQgc3VwcG9ydCBmb3IgcHJpbnRfcGF0aCBvcHRpb24uCi0KLQkqIGNnX2Rmbi5oIChjZ19kZm4pOiB3cmFwIHByb3RvdHlwZSBpbiBQQVJBTVMoKS4KLQotCSogY2FsbF9ncmFwaC5jLCBnbW9uX2lvLmMsIGhpc3QuYzogYXZvaWQgdGFraW5nIGFkZHJlc3Mgb2YgYXJyYXkKLQlhcyBzb21lIGNvbXBpbGVycyBjb21wbGFpbiAoZS5nLiwgREVDJ3MgT1NGLzEgY29tcGlsZXIpCi0KLQkqIGJhc2ljX2Jsb2Nrcy5jLCBnbW9uX2lvLmMsIGhpc3QuYywgc291cmNlLmMsIHN5bV9pZHMuYywKLQlzeW10YWIuYzogY2FsbHMgdG8gbWVtc2V0KCkgaGFkIDJuZCBhbmQgM3JkIGFyZ3MgcmV2ZXJzZWQuCi0KLQlTYXQgU2VwIDEwIDIxOjUzOjEzIDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBncHJvZi5jOiBhZGRlZCAiX21jb3VudCIgdG8gZGVmYXVsdF9leGNsdWRlZF9saXN0LgotCShtYWluKTogaWYgb3V0cHV0X3N0eWxlPT0wIGFuZCB0aGVyZSBpcyBlaXRoZXIgYSBoaXN0b2dyYW0gb3IgYQotCWNhbGwtZ3JhcGgsIGFsd2F5cyBnZW5lcmF0ZSBmbGF0IGFuZCBjYWxsLWdyYXBoLCBubyBtYXR0ZXIgd2hhdAotCWxpbmVfZ3JhbnVsYXJpdHkgaXMgc2V0IHRvLgotCi0JKiBzb3VyY2UuYyAoc291cmNlX2ZpbGVfbG9va3VwX25hbWUpOiBpZiBzZWFyY2hpbmcgZm9yIHNmLT5uYW1lCi0JZmFpbHMsIHRyeSBhZ2FpbiB3aXRoIGZpbGVuYW1lIG9idGFpbmVkIGFmdGVyIHN0cmlwcGluZyBvZmYgYW55Ci0JcGFydGlhbCBwYXRoIGZyb20gc2YtPm5hbWUuCi0KLQkqIGdwcm9mLmggKFNSQ0RFQlVHKTogYWRkZWQuCi0KLQkqIHNlYXJjaF9saXN0LmMgKHNlYXJjaF9saXN0X2FwcGVuZCk6IGRpcmVjdG9yaWVzIHdlcmUgYWRkZWQgaW4gd3JvbmcKLQlvcmRlci4KLQotCSogcmVpbXBsZW1lbnRlZCBzZWxlY3Rpb24gbWVjaGFuaXNtIGZyb20gZ3JvdW5kIHVwOyBpdCBpcyBub3cgcG9zc2libGUKLQl0byBhY2N1cmF0ZWx5IGNvbnRyb2wgd2hhdCBnZXRzIGluY2x1ZGVkL2V4Y2x1ZGVkIGluIGVhY2ggb2YgdGhlCi0Jb3V0cHV0IHN0eWxlczsJYSAic3ltYm9sLXNwZWNpZmljYXRpb24iIChzcGVjKSBpcyB0aGUgYmFzaWMgbWVhbnMKLQl0byBzZWxlY3QgYSBzZXQgb2Ygc3ltYm9sczsgYSBzcGVjIGhhcyB0aGUgc3ludGF4OgotCi0JICBzcGVjID09IChGSUxFTkFNRTooRlVOQ05BTUV8TElORV9OVU0pIHwgTkFNRSkuCi0JICBhcmMgPT0gc3BlYy9zcGVjLgotCi0JYW55IG9mIHRoZSB0ZXJtaW5hbCBzeW1ib2xzIGNhbiBiZSBlbXB0eSwgaW4gd2hpY2ggY2FzZSB0aGV5Ci0JbWF0Y2ggYW55dGhpbmcgKHdpbGRjYXJkcykuICBOQU1FIGlzIGludGVycHJldGVkIGFzIGEgRklMRU5BTUUKLQlpZiBpdCBjb250YWlucyBhIGRvdCAoZS5nLiwgZm9vLmMpLCBhcyBMSU5FX05VTSBpZiBpdCBzdGFydHMKLQl3aXRoIGEgZGlnaXQsIGFuZCBhcyBGVU5DTkFNRSBvdGhlcndpc2UuCi0KLQlGb3IgZXhhbXBsZSwgdG8gZ2V0IGEgY2FsbC1ncmFwaCBkaXNwbGF5IHRoYXQgaWdub3JlcyBhcmNzCi0JZnJvbSBmb28oKSB0byBiYXIoKSwgeW91J2Qgc2F5ICItLW5vLWdyYXBoPWZvby9iYXIiOyB0bwotCXNob3cgb25seSBhcmNzIGludG8gYmFyKCkgKG5vIG1hdHRlciB3aGF0IHRoZSBjYWxsZXIpLAotCXlvdSdkIHNheSAiLS1ncmFwaD0vYmFyIjsgYW5kIHRvIGdldCBhIGNhbGwtZ3JhcGggd2l0aG91dAotCWFueSBhcmMgaW5mbywgeW91J2Qgc2F5ICItLWdyYXBoPS8iOyAgc2ltaWxhcmx5LCB0bwotCWdldCBhIGZsYXQgcHJvZmlsZSB3aXRob3V0IG1jb3VudCwgeW91J2Qgc2F5ICItLW5vLWZsYXQ9bWNvdW50IgotCWFuZCB0byBnZXQgYSBmbGF0IHByb2ZpbGUgdGhhdCBzaG93cyBpbmNsdWRlcyBhbGwgZnVuY3Rpb25zCi0JeW91J2Qgc2F5ICItLWZsYXQ9IiIiIChpLmUuLCBhbiBlbXB0eSBzcGVjKQotCi0JKiBoaXN0LmMgKGhpc3RfcHJpbnQpOiB0b3BfdGltZSB3YXNuJ3QgaW5pdGlhbGl6ZWQgdG8gMC4wLgotCi0JRnJpIFNlcAkgOSAwMToxMDoyMSAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ21vbl9vdXQuaDogYWxsIGhlYWRlcnMgbm93IGRlY2xhcmVkIGluIHRlcm1zIG9mIGNoYXJhY3RlcnMKLQkgIHRvIGF2b2lkIGdldHRpbmcgaW50byB0cm91YmxlIHdpdGggZGlmZmVyZW50IGNvbXBpbGVycyBpbnRyb2R1Y2luZwotCSAgZGlmZmVyZW50IGFtb3VudCBvZiBwYWRkaW5nOyB0aGUgY29kZSBhbHJlYWR5IGFjY2Vzc2VkIHRoZSBmaWVsZHMKLQkgIHRocm91Z2ggYmZkIGZ1bmN0aW9ucywgc28gdGhhdCBkaWRuJ3QgaGF2ZSB0byBjaGFuZ2UuCi0KLQkqIGhpc3QuYyAoaGlzdF9yZWFkX3JlYywgaGlzdF93cml0ZV9yZWMpOiBhZGRlZCBzdXBwb3J0IGZvcgotCSAgY29sbGVjdGlvbiBwYyBoaXN0b2dyYW1zIG1lYXN1cmluZyBxdWFudGl0aWVzIG90aGVyIHRoYW4gdGltZTsKLQkgIHRoZSBoaXN0b2dyYW0gaGVhZGVyIG5vdyBpbmNsdWRlcyBhIGZpZWxkIHRoYXQgc3BlY2lmaWVzIHRoZQotCSAgZGltZW5zaW9uIG9mIHRoZSBxdWFudGl0eSBtZWFzdXJlZCBieSB0aGUgaGlzdG9ncmFtIGJpbnMKLQkgIChub3JtYWxseSwgdGhpcyBpcyAic2Vjb25kcyIsIGJ1dCBvdGhlciBtZWFuaW5nZnVsIGRpbWVuc2lvbnMKLQkgICBpbmNsdWRlIHN1Y2ggdGhpbmdzIGFzICJJLWNhY2hlIG1pc3NlcyIsICJpbnN0cnVjdGlvbiBpc3N1ZSBzdGFsbHMiCi0JICAgZXRjLik7IHRoZXJlIGlzIGFsc28gYSBmaWVsZCB0byBzcGVjaWZ5IGEgb25lLWNoYXJhY3RlcgotCSAgYWJicmV2aWF0aW9uIGZvciB0aGUgZGltZW5zaW9uOyBpbiB0aGUgY2FzZSBvZiB0aW1lLCB0aGlzIHdvdWxkCi0JICBiZSAncyc7IGluIG1vc3Qgb3RoZXIgY2FzZXMgaXQgcHJvYmFibHkgd291bGQgYmUgJzEnIChub3QgYSBwaHlzaWNhbAotCSAgZGltZW5zaW9uKS4KLQotCVRodSBTZXAJIDggMTY6MDU6MDggMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCi0KLQkqIGdwcm9mLmMsIGdtb25faW8uW2NoXTogQlNEX0NPTVBBVElCTEUgaXMgZ29uZSBhbmQgbmV3X2ZpbGVfdmVyc2lvbgotCSAgaGFzIGJlY29tZSBvbGRfZmlsZV92ZXJzaW9uOyBnbW9uX2lvLmMgbm93IGFsd2F5cyBzdXBwb3J0cyBvbGQtc3R5bGUKLQkgIGdtb24ub3V0IGZpbGVzOyBpdCBmaXJzdCB0cmllcyB0byByZWFkIGdtb24ub3V0IGFzIGEgbmV3IHZlcnNpb24KLQkgIGZpbGUsIGlmIHRoYXQgZmFpbHMsIGl0IHRyaWVzIHRvIHJlYWQgaXQgaW4gdGhlIG9sZCBmb3JtYXQ7Ci0JICBhbHRob3VnaCBub3QgdmVyeSBsaWtlbHksIGl0IGlzIHBvc3NpYmxlIGZvciBncHJvZiB0byBtaXN0YWtlIGFuCi0JICBvbGQtc3R5bGUgZmlsZSBhcyBhIG5ldyBvbmUgKHRoZSBmaXJzdCA0IGJ5dGVzIHdvdWxkIGhhdmUgdG8KLQkgIGJlICJnbW9uIi0tLWluY2x1ZGluZyB0aGUgdHJhaWxpbmcgJ1wwJyk7IGluIHRoYXQgY2FzZSwgaXQgaXMKLQkgIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IC0tb2xkLWZpbGUtdmVyc2lvbgotCi0JKiBncHJvZi5oOiByZW1vdmVkIGRlcGVuZGVuY3kgb24gU1lTVjsgdGhlIGNvZGUgbm93IGFsd2F5cyB1c2VzCi0JICBzdHJyY2hyKCksIG1lbXNldCgpLCBhbmQgbWVtY3B5KCkgYW5kIGRvZXMgbm90IGluY2x1ZGUgZWl0aGVyCi0JICBvZiBzdHJpbmcuaCBvciBzdHJpbmdzLmg7IHRoaXMgc2hvdWxkIG1ha2UgZ3Byb2YgY29tcGlsZSBvbgotCSAgYW55IChVbml4KSBzeXN0ZW0gd2l0aG91dCBjb25maWd1cmF0aW9uIChwZXIgc3VnZ2VzdGlvbiBvZgotCSAgcmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBncHJvZi5jICh1c2FnZSk6IGZpeGVkIGxvY2F0aW9uIG9mIC0tbmV3LWZpbGUtZm9ybWF0IG9wdGlvbi4KLQotCSogY2dfYXJjcy5jIChwcm9wYWdhdGVfZmxhZ3MpOiBmaXhlZCB0eXBvIGluIGRlY2xhcmF0aW9uLgotCi0JKiBmbGF0X2JsLm06IHJlbW92ZWQgZm9ybWZlZWQgYXQgZW5kIG9mIGZpbGU7IHRoZSBmb3JtLWZlZWQKLQkgIGlzIG5vdyBwcmludGVkIGNnX3ByaW50LmMgb25seSB3aGVuIG5lY2Vzc2FyeS4KLQotCSogbWFqb3IgcmV3cml0ZSBvZiBncHJvZi0tLXRvbyBtYW55IGNoYW5nZXMgdG8gbWVudGlvbiBhbGwgb2YKLQkgIHRoZW0uCSBuZXcgZmVhdHVyZXM6Ci0KLQkrIC1sIG5vdyByZXF1ZXN0cyBwcm9maWxpbmcgYXQgdGhlIGxpbmUgbGV2ZWwgKGFzIG9wcG9zZWQKLQkgIHRvIGZ1bmN0aW9uIGxldmVsKTsgaW4gdGhpcyBtb2RlLCBncHJvZiBjcmVhdGVzIGEgInN5bWJvbCIKLQkgIChha2EgbmFtZS1saXN0IGVudHJ5KSBmb3IgZWFjaCBsaW5lIG9mIHNvdXJjZSBjb2RlLCBpbnN0ZWFkCi0JICAgb2Ygb25lIHBlciBmdW5jdGlvbikKLQotCSsgc3VwcG9ydCBmb3IgYSBuZXcgZ21vbi5vdXQgZmlsZSBmb3JtYXQ7IHRoZSBuZXcgZm9ybWF0IAotCSAgY29uc2lzdHMgb2YgYSBoZWFkZXIgd2l0aCBhIG1hZ2ljIGFuZCBhIHZlcnNpb24gbnVtYmVyLAotCSAgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZiBwcm9maWxlIGRhdGE7IHByb2ZpbGUgZGF0YQotCSAgY2FuIGFueSBvZjogKGEpIFBDIGhpc3RvZ3JhbSwgKGIpIGNhbGwtZ3JhcGggYXJjcywgb3IKLQkgIChjKSBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzOyB0aGUgdmVyc2lvbiBudW1iZXIgbWFrZXMKLQkgIGl0IHBvc3NpYmxlIHRvIGV4dGVuZCBnbW9uLm91dCBpbiBhIGJhY2t3YXJkcyBjb21wYXRpYmxlCi0JICBmYXNoaW9uCi0KLQkrIHN1cHBvcnQgZm9yIHRjb3Ygc3R5bGUgYW5ub3RhdGVkIG91dHB1dDogaWYgdGhlIGdtb24ub3V0IGZpbGUKLQkgIGNvbnRhaW5zIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMsIHRoZSB1c2VyIGNhbiByZXF1ZXN0Ci0JICB0aGUgZ2VuZXJhdGlvbiBvZiBhbm5vdGF0ZWQgc291cmNlIGZpbGVzLCBtdWNoIGxpa2UgU3VuJ3MKLQkgIHRjb3YgdXNlZCB0byBkbwotCi0JKyBsb25nIG9wdGlvbnMKLQotCSsgbmV3IHNjaGVtZSB0byBzdXBwcmVzcyBzeW1ib2xzIHRoYXQgYXJlbid0IGZ1bmN0aW9uIG5hbWVzCi0JICAoZS5nLiwgYXZvaWRzIG1pc3Rha2luZyBhIGdvdG8gbGFiZWwgYXMgYSBmdW5jdGlvbikKLQotCSsgcmVvcmdhbml6ZWQgc291cmNlIGNvZGUgdG8gbWFrZSBpdCBtb3JlIG1hbmFnYWJsZTsgYXMgYQotCSAgc2lkZSBlZmZlY3QsIGdwcm9mIG5vdyBjb21waWxlcyBjbGVhbmx5IHdpdGggImdjYyAtV2FsbCIKLQotCVRodSBTZXAJIDEgMTU6NDY6NDkgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCi0KLQkqIGdwcm9mLmMgKGZ1bmNzeW1ib2wpOiBiZmRfZmluZF9uZWFyZXN0X2xpbmUoKSBpcyBub3cgdXNlZCBhcyBhCi0JZmluYWwgY3Jvc3MtY2hlY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzdGF0aWMgc3ltYm9sIHNob3VsZCBiZQotCWNvbnNpZGVyZWQgYXMgYSBmdW5jdGlvbi1uYW1lLgotCi0JRnJpIEF1ZwkgNSAxOTozMjozNiAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ21vbl9pby5jIChnbW9uX291dF9yZWFkKTogcmVjb2duaXplICItIiBhcyB0aGUgZmlsZW5hbWUgZm9yCi0Jc3RkaW47IHRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW5uYSBrZWVwIGdtb24ub3V0IGZpbGVzIGNvbXByZXNzZWQ7Ci0JdGhpcyB3YXkgeW91IGNhbiAiZ3pjYXQiIHRoZSBjb21wcmVzc2VkIGZpbGUgaW50byBncHJvZi4KLQotCSogZ3Byb2YuYzogZmxhZ19taW5fY291bnQgbm93IGluaXRpYWxpemVkIHdpdGggMSBpbnN0ZWFkIG9mIDAuCi0KLQkqIGJhc2ljX2Jsb2Nrcy5jIChiYl9hbm5vdGF0ZV9zb3VyY2UpOiBhZGRlZCBzdXBwb3J0IGZvciBjcmVhdGluZwotCS50Y292IGZpbGVzIHdoZW4gb3B0aW9uIGZsYWdfYW5ub3RhdGVfbWFrZV9maWxlcyBpcyBUUlVFLgotCShhbm5vdGF0ZV93aXRoX2NvdW50KTogYWxsIGNvdW50cyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gY291bnQKLQlzcGVjaWZpZWQgYnkgLW0gYXJlIG5vdyBhbm5vdGF0ZWQgd2l0aCBoYXNoLW1hcmtzLgotCi0JKiBncHJvZi5jIChtYWluKTogLUEgaXMgbm93IGZvbGxvd2VkIGJ5IGEgc3RyaW5nIG9mIG9wdGlvbiBjaGFycy4KLQotCSogYmFzaWNfYmxvY2tzLmMgKGFubm90YXRlX3dpdGhfY291bnQpOiByZXBsYWNlZCBiLT5jb3VudCB3aXRoCi0JY250LgotCi0JKiBzb3VyY2UuYzogZmxhZ19hbm5vdGF0ZV9zb3VyY2UgcmVwbGFjZWQgYnkgc291cmNlX2xvY2tfbWFwLgotCi0JKiBzb3VyY2UuaDogc291cmNlX2xvY2tfbWFwIGFkZGVkLgotCi0JKiBncHJvZi5jIChtYWluKTogbmV3IGNvbW1hbmQtbGluZSBzeW50YXg6IC1TIHNpbXBseSBzcGVjaWZpZXMKLQl3aGljaCBzb3VyY2UtZmlsZXMgdXNlciBpcyBpbnRlcmVzdGVkIGluOyAtQSByZXF1ZXN0cyBhbm5vdGF0ZWQKLQlzb3VyY2UgZmlsZXMgYW5kIC1BQSByZXF1ZXN0cyB0aGF0IGFsbCBsaW5lcyBpbiBhIHNvdXJjZSBmaWxlCi0JYXJlIGFubm90YXRlZC4KLQotCVRodSBBdWcJIDQgMjM6Mjc6MDMgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCi0KLQkqIGJhc2ljX2Jsb2Nrcy5jIChQQVRIX01BWCk6IGlmIHVuZGVmaW5lZCwgZGVmaW5lIGFzIDEwMjQuCi0KLQkqIHNwYXJjLmMsIGkzODYuYywgdGFob2UuYywgdmF4LmM6IGFkZGVkIGluY2x1ZGUgb2YgInRpbWVfaGlzdC5oIgotCXNvIHNfbG93cGMgZXRjLiBnZXQgZGVjbGFyZWQuCi0KLQkqIGFyY3MuaCAoZG9hcmNzKTogY3JlYXRlZC4KLQotCSogYXJjcy5jOiByZW9yZGVyZWQgc3RhdGljIGZ1bmN0aW9ucyBzdWNoIHRoYXQgdGhleSBnZXQgZGVmaW5lZAotCWJlZm9yZSB1c2UuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiBhZGRlZCBvcHRpb25zOgotCSAgIC1BOiByZXF1ZXN0IGFubm90YXRpb24gb2YgYWxsIHNvdXJjZSBsaW5lcyAod2l0aCAtUykKLQkgICAtbTogbWluaW11bSBleGVjdXRpb24gY291bnQgKHdpdGggZGVmYXVsdCBiYXNpYy1ibG9jayBkaXNwbGF5KQotCSAgIC1OOiBmb3JjZSBuZXcgZmlsZSBmb3JtYXQgKG9ubHkgaWYgQlNEX0NPTVBBVElCTEUgaXMgZGVmaW5lZCkKLQkgICAtUzogYW5ub3RhdGUgc291cmNlIGZpbGUKLQkgICAtdDogc2V0IHRhYmxlIGxlbmd0aCAod2l0aCAtUykKLQotCSogTWFrZWZpbGUgKE9CSlMpOiBhZGRlZCBiYXNpY19ibG9ja3MubyBjYWxsX2dyYXBoLm8gZ21vbl9pby5vCi0Jc291cmNlLm8gdGltZV9oaXN0Lm8KLQotCUZyaSBKdWwJIDEgMTU6MjM6NTAgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCi0KLQkqIGdwcm9mLmMgKGFzZ25zYW1wbGVzKTogY29tcHV0YXRpb24gb2YgInBjbCIgYW5kICJwY2giIGRlcGVuZGVkCi0Jb24gdGhlIGZhY3QgYmVpbmcgYWJsZSB0byBzdG9yZSBhIGxvbmcgaW4gYSBkb3VibGUgd2l0aG91dCBsb3NzIG9mCi0JcHJlY2lzaW9uOyB0aGlzIGRvZXMgbm90IGhvbGQgb24gbWFjaGluZXMgd2l0aCA2NCBiaXQgbG9uZ3MgYW5kIDY0Ci0JYml0IGRvdWJsZXMuCi0KLUZyaSBPY3QgMjEgMTg6NTg6MDIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcHJpbnRncHJvZi5jIChmbGF0cHJvZmhlYWRlcik6IEFsd2F5cyBzZXQgdG90aW1lIHRvIDEuMCBpZiBub3QKLQlncmVhdGVyIHRoYW4gMC4wLiAgU3VnZ2VzdGVkIGJ5IEhhcm9sZCBBc3NpbmsKLQk8Y2FybG9Ac2cudG4udHVkZWxmdC5ubD4uCi0KLUZyaSBTZXAgMjMgMTU6MDY6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcHJpbnRncHJvZi5jIChwcmludHByb2YpOiBVc2UgZnJlZSwgbm90IGNmcmVlLgotCShwcmludGdwcm9mLCBwcmludGluZGV4KTogRGl0dG8uCi0KLVRodSBTZXAgIDEgMTA6NDA6NDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdwcm9mLmggKGtmcm9tbGlzdCwga3RvbGlzdCwgZmxpc3QsIEZsaXN0LCBlbGlzdCwgRWxpc3QpOiBNYWtlCi0JZGVjbHMgZXh0ZXJuIHRvIGtlZXAgbmF0aXZlIEhQIGNvbXBpbGVyIHF1aWV0LgotCi1UdWUgQXVnIDMwIDExOjEyOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAoZnVuY3N5bWJvbCk6IElnbm9yZSBfX19nbnVfY29tcGlsZWQgYXMgd2VsbCBhcwotCV9fZ251X2NvbXBpbGVkLCBmb3IgdGhlIGJlbmVmaXQgb2Ygc3lzdGVtcyB3aGljaCBhZGQgYSBsZWFkaW5nCi0JdW5kZXJzY29yZS4KLQotV2VkIEF1ZyAyNCAxMjo0OToxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGkzODYtKi0qIHRvIGlbMzQ1XTg2LSotKi4KLQotU3VuIEp1bCAxMCAwMDozNTozMSAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogbnM1MzIuYywgbnM1MzIuaDogTmV3IEZpbGVzLiBuczUzMiBzdXBwb3J0LgotCi0JKiBjb25maWcvbXQtbnM1MzI6IE5ldyBGaWxlLiBuczUzMiBzdXBwb3J0LgotCi0JKiBncHJvZi5jOiB1c2VyIHJlZ2lzdGVyIGludCBpIGluc3RlYWQgb2YgZGVmYXVsdGluZyB0aGUgaW50LgotCUFsbG93cyBjb21waWxhdGlvbiB3aXRoIC1EcmVnaXN0ZXI9IGZvciBkZWJ1Z2dpbmcuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG5zNTMyIHN1cHBvcnQuCi0KLVRodSBKdW4gMjMgMTE6MjI6NDEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChncHJvZik6IERlcGVuZCBvbiAkKExJQlMpLgotCi1GcmkgTWF5IDI3IDEyOjI0OjU3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQlGcm9tIGJpbnV0aWxzLTIuNCByZWxlYXNlOgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IFtuZXddIGJ1aWxkIG1ha2VmaWxlIGZyb20gbWFrZWZpbGUuaW4gKGRvcykKLQkqIGhlcnR6LmM6IGFsbG93IHN0YXRpYyBIRVJUWiAobXNkb3MgbmVlZHMgaXQpCi0JKiBncHJvZi5jOiBhbGxvdyB0YXJnZXQgdG8gc2VsZWN0ICJyIiBvciAicmIiIGZvciBmb3BlbgotCSogZ3Byb2YuYzogaWdub3JlIF9fZ251X2NvbXBpbGVkIHN5bWJvbHMKLQkqIGkzODYuaDogZGZpbmUgRk9QRU5fUkIgdG8gInJiIiBmb3IgZG9zLgotCi1UdWUgTWF5IDE3IDE1OjMwOjIyIDE5OTQgIEUuIE1pY2hhZWwgU21pdGggKGVtc0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoLm0uYzopOiAgQWRkZWQgLlNVRkZJWEVTIDogLm0gCi0Jc28gZmxhdF9ibC5jIHdvdWxkIG1ha2UgZnJvbSBmbGF0X2JsLm0gZmlsZS4KLQotVGh1IE1heSAgNSAxOToyMzoyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogQ2hlY2sgZm9yIGdwcm9mLmluZm8gaW4gYnVpbGQgZGlyLAotCWZhbGwgYmFjayB0byBzcmNkaXIuICBEZXBlbmQgb24gaXQuCi0KLQkqIGdwcm9mLmggKFRSVUUsIEZBTFNFKTogQWx3YXlzIHVzZSB1bmRlZiBiZWZvcmUgZGVmaW5pbmcgdGhlbS4KLQotTW9uIEFwciAgNCAyMzo0NzozMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKE1ZX01BQ0hJTkUpOiBSZW5hbWVkIGZyb20gTUFDSElORSB0byBhdm9pZCBsb3NpbmcKLQltYWtlcyAob3NmMSkgaW4gd2hpY2ggdGhlIHZhbHVlIG9mIE1BQ0hJTkUgY2FuIG5vdCBiZSBjaGFuZ2VkLgotCSogY29uZmlnLyoubXQ6IENoYW5nZWQgYXBwcm9wcmlhdGVseS4KLQotV2VkIE1hciAzMCAxNjoxMjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKGdldHN5bXRhYik6IENoYW5nZSBub3N5bXMgdG8gbG9uZy4gIFJlbmFtZQotCWdldF9zeW10YWJfdXBwZXJfYm91bmQgdG8gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQuICBDaGVjayBmb3IKLQllcnJvcnMgZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQotVHVlIE1hciAyMiAxMDo1MDo1MiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ3Byb2YuYyAoZnVuY3N5bWJvbCk6IFVzZSBiZmRfZ2V0X3N5bWJvbF9pbmZvIGluc3RlYWQgb2YKLQliZmRfZGVjb2RlX3N5bWNsYXNzLgotCi1TdW4gTWFyIDIwIDE1OjQwOjIxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbjogQXZvaWQgYnVnIGluIGhwdXggc2VkLgotCi1XZWQgRGVjIDE1IDIwOjE2OjQwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YudGV4aSAoSW52b2tpbmcpOiBhZGQgdGV4dCBhYm91dCAtdiBmbGFnCi0KLQkqIGdwcm9mLjE6IGFkZCB0ZXh0IGFib3V0IC12IGZsYWcKLQotV2VkIERlYyAgOCAxNjo1NTowNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKFZFUlNJT04pOiBkZWZpbmVkIGEgdmVyc2lvbiBtYWNybywgcHJpbnQgdGhlIHZhbHVlIAotCXdoZW4gdGhlIC12IG9wdGlvbiBpcyB1c2VkCi0KLVR1ZSBKdWwgIDYgMTA6MTE6NTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEluc3RhbGwgY29ycmVjdGx5LgotCi1UaHUgSnVuIDI0IDE0OjQzOjIyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAobWFpbik6IEdldCB3aG9hbWkgZnJvbSBhcmd2LCBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcuCi0JVXNlIGl0IGluIHVzYWdlIG1lc3NhZ2UuICBTcGxpdCB1c2FnZSBtZXNzYWdlIHRvIGZpdCBpbiA4MCBjb2xzLgotCi1TdW4gSnVuIDIwIDIwOjU4OjAyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVW5kbyAxNSBKdW5lIGNoYW5nZS4KLQotV2VkIEp1biAxNiAxMjo1NDo1MyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBnbW9uLmgsIGdwcm9mLmg6IHN0cnVjdHMgb2YgY2hhcnMgdXNlZCB0byBob2xkIGV4dGVybmFsCi0JcmVwcmVzZW50YXRpb25zLgotCSogZ3Byb2YuYyAoZ2V0cGZpbGUsIG9wZW5wZmlsZSwgcmVhZHNhbXBsZXMpOiBTd2FwIGRhdGEgaW4gdXNpbmcKLQluZXcgc3RydWN0dXJlcy4KLQotVHVlIEp1biAxNSAyMzowOToxNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICguYy5vKTogTG9vayBpbiAuLi9pbmNsdWRlLCBub3QgLi4vYmZkLCBmb3IgYmZkLmguCi0KLU1vbiBKdW4gMTQgMTY6MjI6NTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0Ci0KLU1vbiBKdW4gIDcgMTI6NTY6MTcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiAgQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgotCi1UdWUgTWF5IDE4IDIxOjQ0OjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBzaG91bGQgbm90IGRlcGVuZCBvbiBpbnN0YWxsLWluZm8KLQotTW9uIEFwciAyNiAxMjozNzo0NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmg6IEluY2x1ZGUgYW5zaWRlY2wuaCBiZWZvcmUgc3lzZGVwLmguICBVbmRlZmluZSBoei4KLQotVHVlIEFwciAxMyAxNjoxNDowMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTSBNYWtlZmlsZS5pbjogIEFkZCAtZyB0byBDRkxBR1MuCi0JQWRzIExERkxBR1MgYW5kIHVzZSBpbiBwbGFjZSBvZiBDRkxBR1Mgd2hlcmUgYXBwcm9wcmlhdGUuCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIGEgc3lzZGVwLmhsaW5rIGluIHRoZSBzYW1lIHdheSBvdGhlcgotCWJmZC1iYXNlZCBkaXJlY3RvcmllcyBkby4KLQkqIGdwcm9mLmggKFVOSVQpOiAgUmVwbGFjZSBub24tc3RhbmRhcmQgJ3Vfc2hvcnQnIGJ5ICd1bnNpZ25lZAotCXNob3J0Jy4KLQkqIGdwcm9mLmg6ICAjaW5jbHVkZSBzeXNkZXAuaCBpbnN0ZWFkIG9mIGEgYnVuY2ggb2Ygc3R1ZmYuCi0JKiBncHJvZi5jIChtYWluKTogIEZpeCB0eXBvIGdwcm9mZi0+Z3Byb2YuCi0KLVRodSBNYXIgMjUgMTk6MDA6MzcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBncHJvZi50ZXhpOiBhZGQgSU5GTy1ESVItRU5UUlkKLQotVHVlIE1hciAyMyAwMDowMzoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1TYXQgRmViIDI3IDE4OjE3OjEwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAoZnVuY3N5bWJvbCk6ICBJbnZlcnQgdGVzdCBmb3IgYWZsYWcuCi0KLVRodSBGZWIgMjUgMTY6MDE6NTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBwcmludGdwcm9mICh4bWFsbG9jLCB4cmVhbGxvYyk6ICBDYXN0IHJlc3VsdHMgb2YgbWFsbG9jCi0JYW5kIHJlYWxsb2MgdG8gUFRSLgotCi1XZWQgRmViICAzIDEzOjU1OjMzIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjcmVhdGVkIGluZm8sIGluc3RhbGwtaW5mbywgZHZpCi0KLVdlZCBKYW4gIDYgMDA6NTg6MDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IGluc3RhbGwgcnVsZSBmb3IgJChQUk9HKQotCi1GcmkgT2N0ICA5IDExOjI1OjQxIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIGdwcm9mLjE6IHVwZGF0ZWQgU1lOT1BTSVMgdG8gbWF0Y2ggYWN0dWFsIGJlaGF2aW9yLgotCi1Nb24gT2N0ICA1IDE3OjUwOjE2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBnZW4tYy1wcm9nLmF3azogIE5ldyBhd2sgc2NyaXB0LCBsaWdodGx5IGNoYW5nZWQgZnJvbQotCXByZXZpb3VzbHkgZGVsZXRlZCBtYWtlLWMtcHJvZy5hd2suICBDb252ZXJ0cyBhIHRleHQgZmlsZQotCXRvIGEgYyBmdW5jdGlvbiB0aGF0IHByaW50cyB0aGF0IHRleHQuCi0JKiBmbGF0X2JsLm0sIGZzZl9jYWxsZ19ibC5tLCBic2RfY2FsbGdfYmwubTogIE5ldyBmaWxlcy4KLQlJbnB1dHMgdG8gZ2VuLWMtcHJvZy5hd2ssIGNvbnRhaW5pbmcgdGV4dCBkZXNjcmliaW5nCi0JZ3Byb2Ygb3V0cHV0LgotCSogYmx1cmJzLmM6ICBSZW1vdmVkLiAgVXNlICpfYmwuYyBpbnN0ZWFkLgotCSogTWFrZWZpbGUuaW46IFVzZSBnZW4tY3Byb2cuYXdrIHRvIGdlbmVyYXRlICpfYmwuYyBmaWxlcwotCWZyb20gKl9ibC5tIGZpbGVzLiAgQWxzbywgaW1wcm92ZSAqY2xlYW4gcnVsZXMuCi0JKiBwcmludGdwcm9mLmMgKHByaW50Z3Byb2YpOiAgVXN3IG5ldyBmdW5jdGlvbiBuYW1lcyBmcm9tICpfYmwuYy4KLQkKLQotU3VuIEF1ZyAzMCAxOTo1NDo1MyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmgsIGdwcm9mLmMsIHByaW50Zmdwcm9mLmM6ICBBZGQgc3VwcG9ydCBmb3IgdHdvCi0Jb3V0cHV0IHN0eWxlczogIFRoZSBkZWZhdWx0IGlzIHNpbWlsYXIgdG8gdGhlIG9sZCBGU0YgZ3Byb2YsCi0Jd2hpbGUgLVQgc2V0cyB0aGUgdmFyaWFibGUgYnNkX3N0eWxlX291dHB1dCwgd2hpY2ggY2F1c2VzCi0Jb3V0cHV0IG1hdGNoaW5nIEJlcmtlbGV5J3MgZ3Byb2YuICBUaGUgYmlnZ2VzdCBkaWZmZXJlbmNlcwotCWFyZSB0aGF0IHdpdGggdGhlIEZTRiBzdHlsZSBvdXRwdXQsIHRoZSBmbGF0IHByb2ZpbGUgY29tZXMKLQliZWZvcmUgdGhlIGNhbGwgZ3JhcGg7IG51bWJlcnMgY29tZSBiZWZvcmUgZXhwbGFuYXRpb25zOwotCWFuZCB0aGVyZSBpcyBsZXNzIGdyYXR1aXRvdXMgd2hpdGUgc3BhY2UuCi0JKiBncHJvZi5oLCBncHJvZi5jLCBwcmludGZncHJvZi5jOiAgTmV3IGRpc2NhcmRfdW5kZXJzY29yZXMKLQl2YXJpYWJsZSBjYXVzZXMgZGlzY2FyZGluZyBvZiBpbml0aWFsIHVuZGVyc2NvcmVzIHdoZW4KLQlwcmludGluZyBzeW1ib2wgbmFtZXMuICBJdCBpcyBzZXQgdW5sZXNzIHRoZXJlIGlzIGEgIm1haW4iCi0Jc3ltYm9sICh3aXRob3V0IGFuIHVuZGVyc2NvcmUpLgotCSogcHJpbnRmZ3Byb2YuYzogIE5ldyBmdW5jdGlvbiBwcmludG5hbWVvbmx5KCksIGNhbGxlZAotCWJ5IHByaW50bmFtZSgpLiAgSXQgaGFuZGxlcyBzdHJpcHBpbmcgb2YgaW5pdGlhbCAnXycsCi0JYXMgd2VsbCBhcyBDKysgbmFtZS1kZW1hbmdsaW5nLgotCSogZ3Byb2YuY2FsbGcsIGdwcm9mLmZsYXQsIG1ha2UtYy1wcm9nLmF3azogIFJlbW92ZWQuCi0JSXQgaXMganVzdCBhcyBjb252ZW5pZW50IHRvIGVkaXQgYmx1cmJzLmMgZGlyZWN0bHkuCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZWQgcnVsZSBmb3IgbWFraW5nIGJsdXJicy5jLgotCSogYmx1cmJzLmM6ICBUaGlzIGlzIG5vdyBhIHRydWUgc291cmNlIGZpbGUgKGFzIG9wcG9zZWQKLQl0byBiZWluZyBnZW5lcmF0ZWQgZnJvbSBncHJvZi5jYWxsZyBhbmQgZ3Byb2YuZmxhdCkuCi0JQ2hhbmdlIHN0eWxlIHRvIHVzZSBvbmUgbG9uZyBzdHJpbmcgbGl0ZXJhbCwgaW5zdGVhZCBvZgotCW9uZSBsaXRlcmFsIHBlciBvdXRwdXQgbGluZS4gIEFkZCBGU0Ytc3R5bGUgYmx1cmIgZm9yIGNhbGwgZ3JhcGguCi0KLVdlZCBBdWcgMTkgMTQ6MzY6MzkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLVdlZCBBdWcgMTIgMTU6MTQ6MTQgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNoYW5nZSAke01BQ0hJTkV9IHRvICQoTUFDSElORSkuCi0KLVN1biBKdWwgMTkgMTc6MzQ6MDEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIHJlbW92ZWQgaW5zdGFsbGF0aW9uIG9mIHRoZSBub3cgdXNlbGVzcwotCWNhbGwue2ZsYWcsY2FsbGd9IGZpbGVzLiAgCi0KLQkqIGdwcm9mLjE6IG5vdyB1c2VzIHRoZSBzdGFuZGFyZCBtYW4gbWFjcm9zIGluc3RlYWQgb2YgdGhlIG5ldyBCU0QKLQltYW5kb2MgbWFjcm9zLiAKLQotU3VuIEp1bCAxMiAxOTowNjowMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVtb3ZlIGhvc3Qgc2VjdGlvbiwgZXhwYW5kIHRhcmdldCBzZWN0aW9uLgotCSogY29uZmlnL210LXt0YWhvZSx2YXh9OiAgQWRkLCB0byBtYXRjaCBleGlzdGluZyBzdXBwb3J0IGZpbGVzLgotCSogY29uZmlnL3RtYWtlLSo6ICBSZW1vdmUgbGVmdG92ZXIgY3J1ZC4KLQotCSogYmx1cmJzLmM6ICBOZXcgZmlsZSwgY3JlYXRlZCBmcm9tIGdwcm9mLmZsYXQgYW5kIGdwcm9mLmNhbGxnIGJ5Ci0JKiBtYWtlLWMtcHJvZy5hd2s6ICB3aGljaCBwcm9jZXNzZXMgdGV4dCBmaWxlcyBpbnRvIEMgcHJvZ3JhbXMuCi0JKiBwcmludGdwcm9mLmMgKGZsYXRwcm9maGVhZGVyLCBncHJvZmhlYWRlcik6ICBDYWxsIG5ldyBmdW5jdGlvbnMKLQl0byBwcmludCBibHVyYnMuCi0JKHByaW50Ymx1cmIpOiAgUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46ICBJbmZyYXN0cnVjdHVyZSB0byBidWlsZCBibHVyYnMuCi0JKiBwYXRobmFtZXMuaDogIGhhcyBiZWVuIHJlbW92ZWQuICBHcHJvZiBub3cgaGFzIG5vIGZpbGVuYW1lCi0JZGVwZW5kZW5jaWVzIGluIGl0LgotCSogZ3Byb2YuYzogIExpbnQuCi0KLVNhdCBKdWwgMTEgMTg6MDc6MjEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIG1hbjFkaXIgYW5kIGluc3RhbGwgdGhlIG1hbiBwYWdlCi0KLUZyaSBKdWwgMTAgMjE6MTQ6MDggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGR1bW15IGluZm8gYW5kIGluc3RhbGwtaW5mbyB0YXJnZXRzCi0KLVRodSBKdW4gIDQgMTE6MzQ6MDIgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbG9va3VwLmM6IGZpeGVkIGZlbmNlcG9zdCBpbiBubGxvb2t1cCBhbmQgYWRkZWQgZGJnX25sbG9va3VwIGZvcgotCWhlbHAgaW4gZGVidWdnaW5nIHRoZSBwcm9ibGVtICh3aXRoIC1EREVCVUcpCi0JKiBncHJvZi5jOiBzeW1ib2wgdmFsdWVzIGFyZSBub3cgcmVhbCB2YWx1ZXMsIGRvbid0IGFkZCB0aGUgdm1hCi0JYW55bW9yZS4gKGRvbmUgZm9yIHNvbGFyaXM7IHNob3VsZCB2ZXJpZnkgdGhpcyBvbiBvdGhlciBwbGF0Zm9ybXMpCi0JKiBDaGFuZ2VMb2c6IGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ncHJvZi9NYWtlZmlsZS5hbSBiL2dwcm9mL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzFlNGM1Li4wMDAwMDAwCi0tLSBhL2dwcm9mL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLVNVRkZJWEVTID0gLm0KLQotU1VCRElSUyA9IHBvCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtRERFQlVHIC1JLi4vYmZkIC1JJChzcmNkaXIpLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vYmZkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotYmluX1BST0dSQU1TID0gZ3Byb2YKLQotIyMgQ29udmVuaWVuY2UgdmFyIGxpc3RpbmcgcHVyZSBzb3VyY2VzLgotc291cmNlcyA9IGJhc2ljX2Jsb2Nrcy5jIGNhbGxfZ3JhcGguYyBjZ19hcmNzLmMgY2dfZGZuLmMgXAotCWNnX3ByaW50LmMgY29yZWZpbGUuYyBnbW9uX2lvLmMgZ3Byb2YuYyBoZXJ0ei5jIGhpc3QuYyBzb3VyY2UuYyBcCi0Jc2VhcmNoX2xpc3QuYyBzeW10YWIuYyBzeW1faWRzLmMgdXRpbHMuYyBcCi0JaTM4Ni5jIGFscGhhLmMgdmF4LmMgdGFob2UuYyBzcGFyYy5jCi1ncHJvZl9TT1VSQ0VTID0gJChzb3VyY2VzKSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLWdwcm9mX0RFUEVOREVOQ0lFUyA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCi1ncHJvZl9MREFERCA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCi0KLW5vaW5zdF9IRUFERVJTID0gXAotCWJhc2ljX2Jsb2Nrcy5oIGNhbGxfZ3JhcGguaCBjZ19hcmNzLmggY2dfZGZuLmggY2dfcHJpbnQuaCBcCi0JY29yZWZpbGUuaCBnbW9uLmggZ21vbl9pby5oIGdtb25fb3V0LmggZ3Byb2YuaCBoZXJ0ei5oIGhpc3QuaCBcCi0Jc2VhcmNoX2xpc3QuaCBzb3VyY2UuaCBzeW1faWRzLmggc3ltdGFiLmggdXRpbHMuaAotCi1FWFRSQV9ESVNUID0gZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jIGJiY29udi5wbAotCi1CVUlMVF9TT1VSQ0VTID0gZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jCi0KLWRpc3RzdHVmZjogJChCVUlMVF9TT1VSQ0VTKSBpbmZvCi0KLS5tLmM6Ci0JYXdrIC1mICQoc3JjZGlyKS9nZW4tYy1wcm9nLmF3ayA+IC4vJCouYyBcCi0JICAgIEZVTkNUSU9OPWAoZWNobyAkKnxzZWQgLWUgJ3MsLiovLCxnJyAtZSAncy9fYmwvLycpYF9ibHVyYiBcCi0JICAgIEZJTEU9JCoubSAkKHNyY2RpcikvJCoubQotCi1QT1RGSUxFUyA9ICQoc291cmNlcykgJChub2luc3RfSEVBREVSUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLWluZm9fVEVYSU5GT1MgPSBncHJvZi50ZXhpCi1tYW5fTUFOUyA9IGdwcm9mLjEKLQotIyBEZXBlbmRlbmNpZXMuCi0kKE9CSkVDVFMpOiAuLi9iZmQvYmZkLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19wcmludC5oIFwKLQljb3JlZmlsZS5oIGdtb25faW8uaCBnbW9uLmggZ21vbl9vdXQuaCBncHJvZi5oIGhlcnR6LmggaGlzdC5oIFwKLQlzZWFyY2hfbGlzdC5oIHNvdXJjZS5oIHN5bV9pZHMuaCBzeW10YWIuaCB1dGlscy5oIFwKLQkkKHNyY2RpcikvLi4vaW5jbHVkZS9saWJpYmVydHkuaCAkKHNyY2RpcikvLi4vYmZkL3N5c2RlcC5oIFwKLQlnY29uZmlnLmggLi4vYmZkL2NvbmZpZy5oCi1iYXNpY19ibG9ja3MubzogYmFzaWNfYmxvY2tzLmMKLWJzZF9jYWxsX2JsLm86IGJzZF9jYWxsX2JsLmMKLWNhbGxfZ3JhcGgubzogY2FsbF9ncmFwaC5jCi1jZ19hcmNzLm86IGNnX2FyY3MuYwotY2dfZGZuLm86IGNnX2Rmbi5jCi1jZ19wcmludC5vOiBjZ19wcmludC5jCi1jb3JlZmlsZS5vOiBjb3JlZmlsZS5jCi1mbGF0X2JsLm86IGZsYXRfYmwuYwotZnNmX2NhbGxnX2JsLm86IGZzZl9jYWxsZ19ibC5jCi1nbW9uX2lvLm86IGdtb25faW8uYwotZ3Byb2YubzogZ3Byb2YuYwotaGVydHoubzogaGVydHouYwotaGlzdC5vOiBoaXN0LmMKLXNlYXJjaF9saXN0Lm86IHNlYXJjaF9saXN0LmMKLXNvdXJjZS5vOiBzb3VyY2UuYwotc3ltdGFiLm86IHN5bXRhYi5jCi1zeW1faWRzLm86IHN5bV9pZHMuYwotdXRpbHMubzogdXRpbHMuYwotaTM4Ni5vOiBpMzg2LmMKLWFscGhhLm86IGFscGhhLmMKLXZheC5vOiB2YXguYwotdGFob2UubzogdGFob2UuYwotc3BhcmMubzogc3BhcmMuYwpkaWZmIC0tZ2l0IGEvZ3Byb2YvTWFrZWZpbGUuaW4gYi9ncHJvZi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxM2ZmZS4uMDAwMDAwMAotLS0gYS9ncHJvZi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDcyNiArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUyA9IEBBU0AKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTk0gPSBATk1ACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRSA9IEBVU0VfU1lNQk9MX1VOREVSU0NPUkVACi1WRVJTSU9OID0gQFZFUlNJT05ACi1sID0gQGxACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotU1VGRklYRVMgPSAubQotCi1TVUJESVJTID0gcG8KLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1EREVCVUcgLUkuLi9iZmQgLUkkKHNyY2RpcikvLi4vaW5jbHVkZSAtSSQoc3JjZGlyKS8uLi9iZmQgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1iaW5fUFJPR1JBTVMgPSBncHJvZgotCi1zb3VyY2VzID0gYmFzaWNfYmxvY2tzLmMgY2FsbF9ncmFwaC5jIGNnX2FyY3MuYyBjZ19kZm4uYyBcCi0JY2dfcHJpbnQuYyBjb3JlZmlsZS5jIGdtb25faW8uYyBncHJvZi5jIGhlcnR6LmMgaGlzdC5jIHNvdXJjZS5jIFwKLQlzZWFyY2hfbGlzdC5jIHN5bXRhYi5jIHN5bV9pZHMuYyB1dGlscy5jIFwKLQlpMzg2LmMgYWxwaGEuYyB2YXguYyB0YWhvZS5jIHNwYXJjLmMKLQotZ3Byb2ZfU09VUkNFUyA9ICQoc291cmNlcykgZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jCi1ncHJvZl9ERVBFTkRFTkNJRVMgPSAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExERVBTKQotZ3Byb2ZfTERBREQgPSAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExMSUJTKQotCi1ub2luc3RfSEVBREVSUyA9IFwKLQliYXNpY19ibG9ja3MuaCBjYWxsX2dyYXBoLmggY2dfYXJjcy5oIGNnX2Rmbi5oIGNnX3ByaW50LmggXAotCWNvcmVmaWxlLmggZ21vbi5oIGdtb25faW8uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAotCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmgKLQotCi1FWFRSQV9ESVNUID0gZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jIGJiY29udi5wbAotCi1CVUlMVF9TT1VSQ0VTID0gZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jCi0KLVBPVEZJTEVTID0gJChzb3VyY2VzKSAkKG5vaW5zdF9IRUFERVJTKQotCi1pbmZvX1RFWElORk9TID0gZ3Byb2YudGV4aQotbWFuX01BTlMgPSBncHJvZi4xCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gZ2NvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLWJpbl9QUk9HUkFNUyA9ICBncHJvZiQoRVhFRVhUKQotUFJPR1JBTVMgPSAgJChiaW5fUFJPR1JBTVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLWdwcm9mX09CSkVDVFMgPSAgYmFzaWNfYmxvY2tzLm8gY2FsbF9ncmFwaC5vIGNnX2FyY3MubyBjZ19kZm4ubyBcCi1jZ19wcmludC5vIGNvcmVmaWxlLm8gZ21vbl9pby5vIGdwcm9mLm8gaGVydHoubyBoaXN0Lm8gc291cmNlLm8gXAotc2VhcmNoX2xpc3QubyBzeW10YWIubyBzeW1faWRzLm8gdXRpbHMubyBpMzg2Lm8gYWxwaGEubyB2YXgubyB0YWhvZS5vIFwKLXNwYXJjLm8gZmxhdF9ibC5vIGJzZF9jYWxsZ19ibC5vIGZzZl9jYWxsZ19ibC5vCi1ncHJvZl9MREZMQUdTID0gCi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLVRFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4Ci1JTkZPX0RFUFMgPSBncHJvZi5pbmZvCi1EVklTID0gZ3Byb2YuZHZpCi1URVhJTkZPUyA9IGdwcm9mLnRleGkKLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotTUFOUyA9ICQobWFuX01BTlMpCi0KLU5ST0ZGID0gbnJvZmYKLUhFQURFUlMgPSAgJChub2luc3RfSEVBREVSUykKLQotRElTVF9DT01NT04gPSAgLi9zdGFtcC1oLmluIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbiBUT0RPIFwKLWFjbG9jYWwubTQgY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBnY29uZmlnLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGdwcm9mX1NPVVJDRVMpCi1PQkpFQ1RTID0gJChncHJvZl9PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAuZHZpIC5pbmZvIC5sbyAubSAubyAucHMgLnMgLnRleGkgLnRleGluZm8gLnR4aQotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0kKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWdjb25maWcuaDogc3RhbXAtaAotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiBzdGFtcC1oOyBcCi0JCSQoTUFLRSkgc3RhbXAtaDsgXAotCWVsc2UgOjsgZmkKLXN0YW1wLWg6ICQoc3JjZGlyKS9nY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Z2NvbmZpZy5oOmdjb25maWcuaW4gXAotCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0JQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKLSQoc3JjZGlyKS9nY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgZ2NvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUzoKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1iaW5QUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUzoKLQotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCWRvbmUKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotZ3Byb2YkKEVYRUVYVCk6ICQoZ3Byb2ZfT0JKRUNUUykgJChncHJvZl9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGdwcm9mJChFWEVFWFQpCi0JJChMSU5LKSAkKGdwcm9mX0xERkxBR1MpICQoZ3Byb2ZfT0JKRUNUUykgJChncHJvZl9MREFERCkgJChMSUJTKQotCi1ncHJvZi5pbmZvOiBncHJvZi50ZXhpCi1ncHJvZi5kdmk6IGdwcm9mLnRleGkKLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgZ3Byb2YuYXV4IGdwcm9mLmNwIGdwcm9mLmNwcyBncHJvZi5kdmkgZ3Byb2YuZm4gZ3Byb2YuZm5zIFwKLQkgIGdwcm9mLmt5IGdwcm9mLmt5cyBncHJvZi5wcyBncHJvZi5sb2cgZ3Byb2YucGcgZ3Byb2YudG9jIFwKLQkgIGdwcm9mLnRwIGdwcm9mLnRwcyBncHJvZi52ciBncHJvZi52cnMgZ3Byb2Yub3AgZ3Byb2YudHIgXAotCSAgZ3Byb2YuY3YgZ3Byb2YuY24KLQotY2xlYW4tYW1pbmZvOgotCi1kaXN0Y2xlYW4tYW1pbmZvOgotCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKLQlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKLQkgIHJtIC1mICQkaTsgXAotCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCi0JICAgIHJtIC1mICQkaS1bMC05XSo7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCi0KLWluc3RhbGwtbWFuMToKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKG1hbjFkaXIpCi0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQkaTsgdGhlbiBmaWxlPSQoc3JjZGlyKS8kJGk7IFwKLQkgIGVsc2UgZmlsZT0kJGk7IGZpOyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLQotdW5pbnN0YWxsLW1hbjE6Ci0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi1pbnN0YWxsLW1hbjogJChNQU5TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtbWFuMQotdW5pbnN0YWxsLW1hbjoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1tYW4xCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBnY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWdjb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgZ2NvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIGRpc3RkaXI9IiQoZGlzdGRpcikiIGRpc3QtaW5mbwotaW5mby1hbTogJChJTkZPX0RFUFMpCi1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotZHZpLWFtOiAkKERWSVMpCi1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBnY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUwotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1tYW4KLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKE1BTlMpICQoSEVBREVSUykgZ2NvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKGJpbmRpcikgJChERVNURElSKSQobWFuZGlyKS9tYW4xCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKEJVSUxUX1NPVVJDRVMpIiB8fCBybSAtZiAkKEJVSUxUX1NPVVJDRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi10YWdzIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1hbWluZm8gY2xlYW4tdGFncyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgZGlzdGNsZWFuLWNvbXBpbGUgXAotCQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi10YWdzIFwKLQkJZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVMgZGlzdGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWJpblBST0dSQU1TIFwKLW1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgdW5pbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtYmluUFJPR1JBTVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBcCi1tb3N0bHljbGVhbi1hbWluZm8gZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gXAotbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gaW5zdGFsbC1tYW4xIHVuaW5zdGFsbC1tYW4xIGluc3RhbGwtbWFuIFwKLXVuaW5zdGFsbC1tYW4gaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgaW5mby1hbSBpbmZvIFwKLWR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBpbnN0YWxsLWluZm8tYW0gXAotaW5zdGFsbC1pbmZvIGFsbC1yZWN1cnNpdmUtYW0gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBcCi1pbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIFwKLWFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIGluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gXAotbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi1kaXN0c3R1ZmY6ICQoQlVJTFRfU09VUkNFUykgaW5mbwotCi0ubS5jOgotCWF3ayAtZiAkKHNyY2RpcikvZ2VuLWMtcHJvZy5hd2sgPiAuLyQqLmMgXAotCSAgICBGVU5DVElPTj1gKGVjaG8gJCp8c2VkIC1lICdzLC4qLywsZycgLWUgJ3MvX2JsLy8nKWBfYmx1cmIgXAotCSAgICBGSUxFPSQqLm0gJChzcmNkaXIpLyQqLm0KLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLSMgRGVwZW5kZW5jaWVzLgotJChPQkpFQ1RTKTogLi4vYmZkL2JmZC5oIGNhbGxfZ3JhcGguaCBjZ19hcmNzLmggY2dfcHJpbnQuaCBcCi0JY29yZWZpbGUuaCBnbW9uX2lvLmggZ21vbi5oIGdtb25fb3V0LmggZ3Byb2YuaCBoZXJ0ei5oIGhpc3QuaCBcCi0Jc2VhcmNoX2xpc3QuaCBzb3VyY2UuaCBzeW1faWRzLmggc3ltdGFiLmggdXRpbHMuaCBcCi0JJChzcmNkaXIpLy4uL2luY2x1ZGUvbGliaWJlcnR5LmggJChzcmNkaXIpLy4uL2JmZC9zeXNkZXAuaCBcCi0JZ2NvbmZpZy5oIC4uL2JmZC9jb25maWcuaAotYmFzaWNfYmxvY2tzLm86IGJhc2ljX2Jsb2Nrcy5jCi1ic2RfY2FsbF9ibC5vOiBic2RfY2FsbF9ibC5jCi1jYWxsX2dyYXBoLm86IGNhbGxfZ3JhcGguYwotY2dfYXJjcy5vOiBjZ19hcmNzLmMKLWNnX2Rmbi5vOiBjZ19kZm4uYwotY2dfcHJpbnQubzogY2dfcHJpbnQuYwotY29yZWZpbGUubzogY29yZWZpbGUuYwotZmxhdF9ibC5vOiBmbGF0X2JsLmMKLWZzZl9jYWxsZ19ibC5vOiBmc2ZfY2FsbGdfYmwuYwotZ21vbl9pby5vOiBnbW9uX2lvLmMKLWdwcm9mLm86IGdwcm9mLmMKLWhlcnR6Lm86IGhlcnR6LmMKLWhpc3QubzogaGlzdC5jCi1zZWFyY2hfbGlzdC5vOiBzZWFyY2hfbGlzdC5jCi1zb3VyY2Uubzogc291cmNlLmMKLXN5bXRhYi5vOiBzeW10YWIuYwotc3ltX2lkcy5vOiBzeW1faWRzLmMKLXV0aWxzLm86IHV0aWxzLmMKLWkzODYubzogaTM4Ni5jCi1hbHBoYS5vOiBhbHBoYS5jCi12YXgubzogdmF4LmMKLXRhaG9lLm86IHRhaG9lLmMKLXNwYXJjLm86IHNwYXJjLmMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ3Byb2YvTk9URVMgYi9ncHJvZi9OT1RFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExYWYzMC4uMDAwMDAwMAotLS0gYS9ncHJvZi9OT1RFUworKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi1TdW4gRmViICA1IDE2OjA5OjE2IDE5OTUKLQotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgY2hhbmdlcyBhbmQgbmV3IGZlYXR1cmVzIGF2YWlsYWJsZSB3aXRoIHRoaXMKLXZlcnNpb24gb2YgR05VIGdwcm9mLgotCi0qIE5ldyBGZWF0dXJlcwotCi0gbyBMb25nIG9wdGlvbnMKLQotIG8gU3VwcG9ydHMgZ2VuZXJhbGl6ZWQgZmlsZSBmb3JtYXQsIHdpdGhvdXQgYnJlYWtpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKLSAgIG5ldyBmaWxlIGZvcm1hdCBzdXBwb3J0cyBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGFuZCBub24tcmVhbHRpbWUKLSAgIGhpc3RvZ3JhbXMgKHNlZSBiZWxvdykKLQotIG8gU3VwcG9ydHMgcHJvZmlsaW5nIGF0IHRoZSBsaW5lIGxldmVsOiBmbGF0IHByb2ZpbGVzLCBjYWxsLWdyYXBoIHByb2ZpbGVzLAotICAgYW5kIGV4ZWN1dGlvbi1jb3VudHMgY2FuIGFsbCBiZSBkaXNwbGF5ZWQgYXQgYSBsZXZlbCB0aGF0IGlkZW50aWZpZXMKLSAgIGluZGl2aWR1YWwgbGluZXMgcmF0aGVyIHRoYW4ganVzdCBmdW5jdGlvbnMKLQotIG8gVGVzdC1jb3ZlcmFnZSBzdXBwb3J0IChzaW1pbGFyIHRvIFN1biB0Y292IHByb2dyYW0pOiBzb3VyY2UgZmlsZXMKLSAgIGNhbiBiZSBhbm5vdGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgZnVuY3Rpb24gd2FzIGludm9rZWQKLSAgIG9yIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGJhc2ljLWJsb2NrIGluIGEgZnVuY3Rpb24gd2FzCi0gICBleGVjdXRlZAotCi0gbyBHZW5lcmFsaXplZCBoaXN0b2dyYW1zOiBub3QganVzdCBleGVjdXRpb24tdGltZSwgYnV0IGFyYml0cmFyeQotICAgaGlzdG9ncmFtcyBhcmUgc3VwcG9ydCAoZm9yIGV4YW1wbGUsIHBlcmZvcm1hbmNlIGNvdW50ZXIgYmFzZWQKLSAgIHByb2ZpbGVzKQotCi0gbyBQb3dlcmZ1bCBtZWNoYW5pc20gdG8gc2VsZWN0IGRhdGEgdG8gYmUgaW5jbHVkZWQvZXhjbHVkZWQgZnJvbQotICAgYW5hbHlzaXMgYW5kL29yIG91dHB1dAotCi0gbyBTdXBwb3J0IGZvciBERUMgT1NGLzEgdjMuMAotCi0gbyBGdWxsIGNyb3NzLXBsYXRmb3JtIHByb2ZpbGluZyBzdXBwb3J0OiBncHJvZiB1c2VzIEJGRCB0byBzdXBwb3J0Ci0gICBhcmJpdHJhcnksIG5vbi1uYXRpdmUgb2JqZWN0IGZpbGUgZm9ybWF0cyBhbmQgbm9uLW5hdGl2ZSBieXRlLW9yZGVycwotICAgKHRoaXMgZmVhdHVyZSBoYXMgbm90IGJlZW4gdGVzdGVkIHlldCkKLQotIG8gSW4gdGhlIGNhbGwtZ3JhcGggZnVuY3Rpb24gaW5kZXgsIHN0YXRpYyBmdW5jdGlvbiBuYW1lcyBhcmUgbm93Ci0gICBwcmludGVkIHRvZ2V0aGVyIHdpdGggdGhlIGZpbGVuYW1lIGluIHdoaWNoIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZAotICAgKHJlcXVpcmVkIGJmZF9maW5kX25lYXJlc3RfbGluZSgpIHN1cHBvcnQgYW5kIHN5bWJvbGljIGRlYnVnZ2luZwotICAgIGluZm9ybWF0aW9uIHRvIGJlIHByZXNlbnQgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZSkKLQotIG8gTWFqb3Igb3ZlcmhhdWwgb2Ygc291cmNlIGNvZGUgKGNvbXBpbGVzIGNsZWFubHkgd2l0aCAtV2FsbCwgZXRjLikKLQotKiBTdXBwb3J0ZWQgUGxhdGZvcm1zCi0KLVRoZSBjdXJyZW50IHZlcnNpb24gaXMga25vd24gdG8gd29yayBvbjoKLQotIG8gREVDIE9TRi8xIHYzLjAKLQlBbGwgZmVhdHVyZXMgc3VwcG9ydGVkLgotCi0gbyBTdW5PUyA0LjEueAotCUFsbCBmZWF0dXJlcyBzdXBwb3J0ZWQuCi0KLSBvIFNvbGFyaXMgMi4zCi0JTGluZS1sZXZlbCBwcm9maWxpbmcgdW5zdXBwb3J0ZWQgYmVjYXVzZSBiZmRfZmluZF9uZWFyZXN0X2xpbmUoKQotCWlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZCBmb3IgRWxmIGJpbmFyaWVzLgotCi0gbyBIUC1VWCA5LjAxCi0JTGluZS1sZXZlbCBwcm9maWxpbmcgdW5zdXBwb3J0ZWQgYmVjYXVzZSBiZmRfZmluZF9uZWFyZXN0X2xpbmUoKQotCWlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZCBmb3IgU09NIGJpbmFyaWVzLgotCi0qIERldGFpbGVkIERlc2NyaXB0aW9uCi0KLSoqIFVzZXIgSW50ZXJmYWNlIENoYW5nZXMKLQotVGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgaXMgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBlYXJsaWVyCi12ZXJzaW9ucyBvZiBHTlUgZ3Byb2YgYW5kIEJlcmtlbGV5IGdwcm9mLiAgVGhlIG9ubHkgZXhjZXB0aW9uIGlzCi10aGUgb3B0aW9uIHRvIGRlbGV0ZSBhcmNzIGZyb20gdGhlIGNhbGwgZ3JhcGguICBUaGUgb2xkIHN5bnRheAotd2FzOgotCi0JLWsgZnJvbW5hbWUgdG9uYW1lCi0KLXdoaWxlIHRoZSBuZXcgc3ludGF4IGlzOgotCi0JLWsgZnJvbW5hbWUvdG9uYW1lCi0KLVRoaXMgY2hhbmdlIHdhcyBuZWNlc3NhcnkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGxvbmctb3B0aW9uIHBhcnNpbmcuCi1BbHNvLCAiZnJvbW5hbWUiIGFuZCAidG9uYW1lIiBjYW4gbm93IGJlIGFyYml0cmFyeSBzeW1zcGVjcyByYXRoZXIKLXRoYW4ganVzdCBmdW5jdGlvbiBuYW1lcyAoc2VlIGJlbG93IGZvciBhbiBleHBsYW5hdGlvbiBvZiBzeW1zcGVjcykuCi1Gb3IgZXhhbXBsZSwgb3B0aW9uICItayBncHJvZi5jLyIgc3VwcHJlc3NlcyBhbGwgYXJjcyBkdWUgdG8gY2FsbHMgb3V0Ci1vZiBmaWxlICJncHJvZi5jIi4KLQotKioqIFN5bSBTcGVjcwotCi1JdCBpcyBvZnRlbiBuZWNlc3NhcnkgdG8gYXBwbHkgZ3Byb2Ygb25seSB0byBzcGVjaWZpYyBwYXJ0cyBvZiBhCi1wcm9ncmFtLiAgR05VIGdwcm9mIGhhcyBhIHNpbXBsZSBidXQgcG93ZXJmdWwgbWVjaGFuaXNtIHRvIGFjaGlldmUKLXRoaXMuICBTbyBjYWxsZWQge1xlbSBzeW1zcGVjc1wvfSBwcm92aWRlIHRoZSBmb3VuZGF0aW9uIGZvciB0aGlzCi1tZWNoYW5pc20uICBBIHN5bXNwZWMgc2VsZWN0cyB0aGUgcGFydHMgb2YgYSBwcm9maWxlZCBwcm9ncmFtIHRvIHdoaWNoCi1hbiBvcGVyYXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8uICBUaGUgc3ludGF4IG9mIGEgc3ltc3BlYyBpcwotc2ltcGxlOgotCi0JICBmaWxlbmFtZV9jb250YWluaW5nX2FfZG90Ci0JfCBmdW5jbmFtZV9ub3RfY29udGFpbmluZ19hX2RvdAotCXwgbGluZW51bWJlcgotCXwgKCBbIGFueV9maWxlbmFtZSBdIGA6JyAoIGFueV9mdW5jbmFtZSB8IGxpbmVudW1iZXIgKSApCi0KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6Ci0KLQltYWluLmMJCQlTZWxlY3RzIGV2ZXJ5dGhpbmcgaW4gZmlsZSAibWFpbi5jIi0tLXRoZQotCQkJCWRvdCBpbiB0aGUgc3RyaW5nIHRlbGxzIGdwcm9mIHRvIGludGVycHJldAotCQkJCXRoZSBzdHJpbmcgYXMgYSBmaWxlbmFtZSwgcmF0aGVyIHRoYW4gYXMKLQkJCQlhIGZ1bmN0aW9uIG5hbWUuICBUbyBzZWxlY3QgYSBmaWxlIHdob3NlCi0JCQkJbmFtZSBkb2VzIGNvbnRhaW4gYSBkb3QsIGEgdHJhaWxpbmcgY29sb24KLQkJCQlzaG91bGQgYmUgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsICJvZGQ6IiBpcwotCQkJCWludGVycHJldGVkIGFzIHRoZSBmaWxlIG5hbWVkICJvZGQiLgotCi0JbWFpbgkJCVNlbGVjdHMgYWxsIGZ1bmN0aW9ucyBuYW1lZCAibWFpbiIuICBOb3RpY2UKLQkJCQl0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlCi0JCQkJc2FtZSBmdW5jdGlvbiBuYW1lIGJlY2F1c2Ugc29tZSBvZiB0aGUKLQkJCQlkZWZpbml0aW9ucyBtYXkgYmUgbG9jYWwgKGkuZS4sIHN0YXRpYykuCi0JCQkJVW5sZXNzIGEgZnVuY3Rpb24gbmFtZSBpcyB1bmlxdWUgaW4gYSBwcm9ncmFtLAotCQkJCXlvdSBtdXN0IHVzZSB0aGUgY29sb24gbm90YXRpb24gZXhwbGFpbmVkCi0JCQkJYmVsb3cgdG8gc3BlY2lmeSBhIGZ1bmN0aW9uIGZyb20gYSBzcGVjaWZpYwotCQkJCXNvdXJjZSBmaWxlLiAgU29tZXRpbWVzLCBmdW5jdGlvbm5hbWVzIGNvbnRhaW4KLQkJCQlkb3RzLiAgSW4gc3VjaCBjYXNlcywgaXQgaXMgbmVjZXNzYXIgdG8KLQkJCQlhZGQgYSBsZWFkaW5nIGNvbG9uIHRvIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsCi0JCQkJIjoubXVsIiBzZWxlY3RzIGZ1bmN0aW9uICIubXVsIi4KLQkJCQkKLQltYWluLmM6bWFpbgkJU2VsZWN0cyBmdW5jdGlvbiAibWFpbiIgaW4gZmlsZSAibWFpbi5jIi4KLQotCW1haW4uYzoxMzQJCVNlbGVjdHMgbGluZSAxMzQgaW4gZmlsZSAibWFpbi5jIi4KLQotSU1QTEVNRU5UQVRJT04gTk9URTogVGhlIHNvdXJjZSBjb2RlIHVzZXMgdGhlIHR5cGUgc3ltX2lkIGZvciBzeW1zcGVjcy4KLUF0IHNvbWUgcG9pbnQsIHRoaXMgcHJvYmFibHkgb3VnaHQgdG8gYmUgY2hhbmdlZCB0byAic3ltX3NwZWMiIHRvIG1ha2UKLXJlYWRpbmcgdGhlIGNvZGUgZWFzaWVyLgotCi0qKiogTG9uZyBvcHRpb25zCi0KLUdOVSBncHJvZiBub3cgc3VwcG9ydHMgbG9uZyBvcHRpb25zLiAgVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgYWxsCi1zdXBwb3J0ZWQgb3B0aW9ucy4gIE9wdGlvbnMgdGhhdCBhcmUgbGlzdGVkIHdpdGhvdXQgZGVzY3JpcHRpb24KLW9wZXJhdGUgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBjb3JyZXNwb25kaW5nIG9wdGlvbiBpbiBvbGRlcgotdmVyc2lvbnMgb2YgZ3Byb2YuCi0KLVNob3J0IEZvcm06CUxvbmcgRm9ybToKLS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0KLS1sCQktLWxpbmUKLQkJCVJlcXVlc3QgcHJvZmlsaW5nIGF0IHRoZSBsaW5lLWxldmVsIHJhdGhlcgotCQkJdGhhbiBqdXN0IGF0IHRoZSBmdW5jdGlvbiBsZXZlbC4gIFNvdXJjZQotCQkJbGluZXMgYXJlIGlkZW50aWZpZWQgYnkgc3ltYm9scyBvZiB0aGUgZm9ybToKLQotCQkJCWZ1bmMgKGZpbGU6bGluZSkKLQotCQkJd2hlcmUgImZ1bmMiIGlzIHRoZSBmdW5jdGlvbiBuYW1lLCAiZmlsZSIgaXMgdGhlCi0JCQlmaWxlIG5hbWUgYW5kICJsaW5lIiBpcyB0aGUgbGluZS1udW1iZXIgdGhhdAotCQkJY29ycmVzcG9uZHMgdG8gdGhlIGxpbmUuCi0KLQkJCVRvIHdvcmsgcHJvcGVybHksIHRoZSBiaW5hcnkgbXVzdCBjb250YWluIHN5bWJvbGljCi0JCQlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIG1lYW5zIHRoYXQgdGhlIHNvdXJjZQotCQkJaGF2ZSB0byBiZSB0cmFuc2xhdGVkIHdpdGggb3B0aW9uICItZyIgc3BlY2lmaWVkLgotCQkJRnVuY3Rpb25zIGZvciB3aGljaCB0aGVyZSBpcyBubyBzeW1ib2xpYyBkZWJ1Z2dpbmcKLQkJCWluZm9ybWF0aW9uIGF2YWlsYWJsZSBhcmUgdHJlYXRlZCBhcyBpZiAiLS1saW5lIgotCQkJaGFkIG5vdCBiZWVuIHNwZWNpZmllZC4gIEhvd2V2ZXIsIHRoZSBsaW5lIG51bWJlcgotCQkJcHJpbnRlZCB3aXRoIHN1Y2ggc3ltYm9scyBpcyB1c3VhbGx5IGluY29ycmVjdAotCQkJYW5kIHNob3VsZCBiZSBpZ25vcmVkLgotCi0tYQkJLS1uby1zdGF0aWMKLS1BW3N5bXNwZWNdCS0tYW5ub3RhdGVkLXNvdXJjZVs9c3ltc3BlY10KLQkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGFubm90YXRlZCBzb3VyY2UKLQkJCWZpbGVzLiAgSWYgInN5bXNwZWMiIGlzIHNwZWNpZmllZCwgcHJpbnQgb3V0cHV0IG9ubHkKLQkJCWZvciBzeW1ib2xzIHNlbGVjdGVkIGJ5ICJzeW1zcGVjIi4gIElmIHRoZSBvcHRpb24KLQkJCWlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgYW5ub3RhdGVkIG91dHB1dCBpcwotCQkJZ2VuZXJhdGVkIGZvciB0aGUgdW5pb24gb2YgYWxsIHN5bXNwZWNzLgotCi0JCQlFeGFtcGxlczoKLQotCQkJICAtQQkJUHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZm9yIGFsbAotCQkJCQlzb3VyY2UgZmlsZXMuCi0JCQkgIC1BZ3Byb2YuYwlQcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmb3IgZmlsZQotCQkJCQlncHJvZi5jLgotCQkJICAtQWZvb2JhcglQcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmb3IgZmlsZXMKLQkJCQkJY29udGFpbmluZyBhIGZ1bmN0aW9uIG5hbWVkICJmb29iYXIiLgotCQkJCQlUaGUgZW50aXJlIGZpbGUgd2lsbCBiZSBwcmludGVkLCBidXQKLQkJCQkJb25seSB0aGUgZnVuY3Rpb24gaXRzZWxmIHdpbGwgYmUKLQkJCQkJYW5ub3RhdGVkIHdpdGggcHJvZmlsZSBkYXRhLgotCi0tSltzeW1zcGVjXQktLW5vLWFubm90YXRlZC1zb3VyY2VbPXN5bXNwZWNdCi0JCQlTdXBwcmVzcyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dC4gIElmIHNwZWNpZmllZAotCQkJd2l0aG91dCBhcmd1bWVudCwgYW5ub3RhdGVkIG91dHB1dCBpcyBzdXBwcmVzc2VkCi0JCQljb21wbGV0ZWx5LiAgV2l0aCBhbiBhcmd1bWVudCwgYW5ub3RhdGVkIG91dHB1dAotCQkJaXMgc3VwcHJlc3NlZCBvbmx5IGZvciB0aGUgc3ltYm9scyBzZWxlY3RlZCBieQotCQkJInN5bXNwZWMiLiAgSWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUKLQkJCXRpbWVzLCBhbm5vdGF0ZWQgb3V0cHV0IGlzIHN1cHByZXNzZWQgZm9yIHRoZQotCQkJdW5pb24gb2YgYWxsIHN5bXNwZWNzLiAgVGhpcyBvcHRpb24gaGFzIGxvd2VyCi0JCQlwcmVjZWRlbmNlIHRoYW4gLS1hbm5vdGF0ZWQtc291cmNlCi0KLS1wW3N5bXNwZWNdCS0tZmxhdC1wcm9maWxlWz1zeW1zcGVjXQotCQkJUmVxdWVzdCBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYSBmbGF0IHByb2ZpbGUKLQkJCSh1bmxlc3MgYW55IG90aGVyIG91dHB1dC1zdHlsZSBvcHRpb24gaXMgc3BlY2lmaWVkLAotCQkJIHRoaXMgb3B0aW9uIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0KS4gIElmCi0JCQkic3ltc3BlYyIgaXMgc3BlY2lmaWVkLCBpbmNsdWRlIG9ubHkgc3ltYm9scwotCQkJc2VsZWN0ZWQgYnkgInN5bXNwZWMiIGluIGZsYXQgcHJvZmlsZS4gIElmIHRoZQotCQkJb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIGZsYXQKLQkJCXByb2ZpbGUgaW5jbHVkZXMgc3ltYm9scyBzZWxlY3RlZCBieSB0aGUgdW5pb24KLQkJCW9mIGFsbCBzeW1zcGVjcy4KLQkJCQotLVBbc3ltc3BlY10JLS1uby1mbGF0LXByb2ZpbGVbPXN5bXNwZWNdCi0JCQlTdXBwcmVzcyBvdXRwdXQgaW4gdGhlIGZsYXQgcHJvZmlsZS4gIElmIGdpdmVuCi0JCQl3aXRob3V0IGFuIGFyZ3VtZW50LCB0aGUgZmxhdCBwcm9maWxlIGlzIHN1cHByZXNzZWQKLQkJCWNvbXBsZXRlbHkuICBJZiAic3ltc3BlYyIgaXMgc3BlY2lmaWVkLCBzdXBwcmVzcwotCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgaW4gdGhlIGZsYXQgcHJvZmlsZS4gIElmIHRoZQotCQkJb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIHVuaW9uIG9mCi0JCQl0aGUgc2VsZWN0ZWQgc3ltYm9scyBpcyBzdXBwcmVzc2VkLiAgVGhpcyBvcHRpb24KLQkJCWhhcyBsb3dlciBwcmVjZWRlbmNlIHRoYW4gLS1mbGF0LXByb2ZpbGUuCi0KLS1xW3N5bXNwZWNdCS0tZ3JhcGhbPXN5bXNwZWNdCi0JCQlSZXF1ZXN0IG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGNhbGwtZ3JhcGgKLQkJCSh1bmxlc3MgYW55IG90aGVyIG91dHB1dC1zdHlsZSBvcHRpb24gaXMgc3BlY2lmaWVkLAotCQkJIHRoaXMgb3B0aW9uIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0KS4gIElmICJzeW1zcGVjIgotCQkJaXMgc3BlY2lmaWVkLCBpbmNsdWRlIG9ubHkgc3ltYm9scyBzZWxlY3RlZCBieQotCQkJInN5bXNwZWMiIGluIHRoZSBjYWxsLWdyYXBoLiAgSWYgdGhlIG9wdGlvbiBpcwotCQkJc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgY2FsbC1ncmFwaCBpbmNsdWRlcwotCQkJc3ltYm9scyBzZWxlY3RlZCBieSB0aGUgdW5pb24gb2YgYWxsIHN5bXNwZWNzLgotCi0tUVtzeW1zcGVjXQktLW5vLWdyYXBoWz1zeW1zcGVjXQotCQkJU3VwcHJlc3Mgb3V0cHV0IGluIHRoZSBjYWxsLWdyYXBoLiAgSWYgZ2l2ZW4gd2l0aG91dAotCQkJYW4gYXJndW1lbnQsIHRoZSBjYWxsLWdyYXBoIGlzIHN1cHByZXNzZWQgY29tcGxldGVseS4KLQkJCVdpdGggYSAic3ltc3BlYyIsIHN1cHByZXNzIHRoZSBzZWxlY3RlZCBzeW1ib2xzCi0JCQlmcm9tIHRoZSBjYWxsLWdyYXBoLiAgSWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQKLQkJCW11bHRpcGxlIHRpbWVzLCB0aGUgdW5pb24gb2YgdGhlIHNlbGVjdGVkIHN5bWJvbHMKLQkJCWlzIHN1cHByZXNzZWQuICBUaGlzIG9wdGlvbiBoYXMgbG93ZXIgcHJlY2VkZW5jZQotCQkJdGhhbiAtLWdyYXBoLgotCi0tQ1tzeW1zcGVjXQktLWV4ZWMtY291bnRzWz1zeW1zcGVjXQotCQkJUmVxdWVzdCBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgZXhlY3V0aW9uIGNvdW50cy4KLQkJCUlmICJzeW1zcGVjIiBpcyBwcmVzZW50LCBpbmNsdWRlIG9ubHkgc3ltYm9scwotCQkJc2VsZWN0ZWQgYnkgInN5bXNwZWMiIGluIHRoZSBleGVjdXRpb24gY291bnQKLQkJCWxpc3RpbmcuICBJZiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZQotCQkJdGltZXMsIHRoZSBleGVjdXRpb24gY291bnQgbGlzdGluZyBpbmNsdWRlcwotCQkJc3ltYm9scyBzZWxlY3RlZCBieSB0aGUgdW5pb24gb2YgYWxsIHN5bXNwZWNzLgotCi0tWltzeW1zcGVjXQktLW5vLWV4ZWMtY291bnRzWz1zeW1zcGVjXQotCQkJU3VwcHJlc3Mgb3V0cHV0IGluIHRoZSBleGVjdXRpb24gY291bnQgbGlzdGluZy4KLQkJCUlmIGdpdmVuIHdpdGhvdXQgYW4gYXJndW1lbnQsIHRoZSBsaXN0aW5nIGlzCi0JCQlzdXBwcmVzc2VkIGNvbXBsZXRlbHkuICBXaXRoIGEgInN5bXNwZWMiLCBzdXBwcmVzcwotCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgZnJvbSB0aGUgY2FsbC1ncmFwaC4gIElmIHRoZQotCQkJb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIHVuaW9uIG9mCi0JCQl0aGUgc2VsZWN0ZWQgc3ltYm9scyBpcyBzdXBwcmVzc2VkLiAgVGhpcyBvcHRpb24KLQkJCWhhcyBsb3dlciBwcmVjZWRlbmNlIHRoYW4gLS1leGVjLWNvdW50cy4KLQotLWkJCS0tZmlsZS1pbmZvCi0JCQlQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZmlsZSBmaWxlcyB0aGF0Ci0JCQlhcmUgcmVhZC4gIFRoZSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUKLQkJCW51bWJlciBhbmQgdHlwZXMgb2YgcmVjb3JkcyBwcmVzZW50IGluIHRoZQotCQkJcHJvZmlsZSBmaWxlLiAgQ3VycmVudGx5LCBhIHByb2ZpbGUgZmlsZSBjYW4KLQkJCWNvbnRhaW4gYW55IG51bWJlciBhbmQgYW55IGNvbWJpbmF0aW9uIG9mIGhpc3RvZ3JhbSwKLQkJCWNhbGwtZ3JhcGgsIG9yIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZHMuCi0KLS1zCQktLXN1bQotCi0teAkJLS1hbGwtbGluZXMKLQkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLQkJCUJ5IGRlZmF1bHQsIG9ubHkgdGhlIGxpbmVzIGF0IHRoZSBiZWdpbm5pbmcgb2YKLQkJCWEgYmFzaWMtYmxvY2sgYXJlIGFubm90YXRlZC4gIElmIHRoaXMgb3B0aW9uIGlzCi0JCQlzcGVjaWZpZWQsIGV2ZXJ5IGxpbmUgaW4gYSBiYXNpYy1ibG9jayBpcyBhbm5vdGF0ZWQKLQkJCWJ5IHJlcGVhdGluZyB0aGUgYW5ub3RhdGlvbiBmb3IgdGhlIGZpcnN0IGxpbmUuCi0JCQlUaGlzIG9wdGlvbiBpcyBpZGVudGljYWwgdG8gdGNvdidzICItYSIuCi0KLS1JIGRpcnMJCS0tZGlyZWN0b3J5LXBhdGg9ZGlycwotCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotCQkJU3BlY2lmaWVzIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIGJlIHNlYXJjaGVkCi0JCQlmb3Igc291cmNlIGZpbGVzLiAgVGhlIGFyZ3VtZW50ICJkaXJzIiBpcyBhIGNvbG9uCi0JCQlzZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3Rvcmllcy4gIEJ5IGRlZmF1bHQsIGdwcm9mCi0JCQlzZWFyY2hlcyBmb3Igc291cmNlIGZpbGVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50Ci0JCQl3b3JraW5nIGRpcmVjdG9yeSBvbmx5LgotCi0tegkJLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnMKLQotLW0gbnVtCQktLW1pbi1jb3VudD1udW0KLQkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBhbmQgZXhlY3V0aW9uCi0JCQljb3VudCBvdXRwdXQgb25seS4gIFN5bWJvbHMgdGhhdCBhcmUgZXhlY3V0ZWQKLQkJCWxlc3MgdGhhbiAibnVtIiB0aW1lcyBhcmUgc3VwcHJlc3NlZC4gIEZvciBhbm5vdGF0ZWQKLQkJCXNvdXJjZSBvdXRwdXQsIHN1cHByZXNzZWQgc3ltYm9scyBhcmUgbWFya2VkCi0JCQlieSBmaXZlIGhhc2gtbWFya3MgKCMjIyMjKS4gIEluIGFuIGV4ZWN1dGlvbiBjb3VudAotCQkJb3V0cHV0LCBzdXBwcmVzc2VkIHN5bWJvbHMgZG8gbm90IGFwcGVhciBhdCBhbGwuCi0KLS1MCQktLXByaW50LXBhdGgKLQkJCU5vcm1hbGx5LCBzb3VyY2UgZmlsZW5hbWVzIGFyZSBwcmludGVkIHdpdGggdGhlIHBhdGgKLQkJCWNvbXBvbmVudCBzdXBwcmVzc2VkLiAgV2l0aCB0aGlzIG9wdGlvbiwgZ3Byb2YKLQkJCWNhbiBiZSBmb3JjZWQgdG8gcHJpbnQgdGhlIGZ1bGwgcGF0aG5hbWUgb2YKLQkJCXNvdXJjZSBmaWxlbmFtZXMuICBUaGUgZnVsbCBwYXRobmFtZSBpcyBkZXRlcm1pbmVkCi0JCQlmcm9tIHN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgaW1hZ2UgZmlsZQotCQkJYW5kIGlzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbXBpbGVyCi0JCQl3YXMgaW52b2tlZC4KLQotLXkJCS0tc2VwYXJhdGUtZmlsZXMKLQkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLQkJCU5vcm1hbGx5LCBncHJvZiBwcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmaWxlcwotCQkJdG8gc3RhbmRhcmQtb3V0cHV0LiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLAotCQkJYW5ub3RhdGVkIHNvdXJjZSBmb3IgYSBmaWxlIG5hbWVkICJwYXRoL2ZpbGVuYW1lIgotCQkJaXMgZ2VuZXJhdGVkIGluIHRoZSBmaWxlICJmaWxlbmFtZS1hbm4iLiAgVGhhdCBpcywKLQkJCWFubm90YXRlZCBvdXRwdXQgaXMge1xlbSBhbHdheXNcL30gZ2VuZXJhdGVkIGluCi0JCQlncHJvZidzIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBDYXJlIGhhcyB0bwotCQkJYmUgdGFrZW4gaWYgYSBwcm9ncmFtIGNvbnNpc3RzIG9mIGZpbGVzIHRoYXQgaGF2ZQotCQkJaWRlbnRpY2FsIGZpbGVuYW1lcywgYnV0IGRpc3RpbmN0IHBhdGhzLgotCi0tYwkJLS1zdGF0aWMtY2FsbC1ncmFwaAotCi0tdCBudW0JCS0tdGFibGUtbGVuZ3RoPW51bQotCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotCQkJQWZ0ZXIgYW5ub3RhdGluZyBhIHNvdXJjZSBmaWxlLCBncHJvZiBnZW5lcmF0ZXMKLQkJCWFuIGV4ZWN1dGlvbiBjb3VudCBzdW1tYXJ5IGNvbnNpc3Rpbmcgb2YgYSB0YWJsZQotCQkJb2YgbGluZXMgd2l0aCB0aGUgdG9wIGV4ZWN1dGlvbiBjb3VudHMuICBCeQotCQkJZGVmYXVsdCwgdGhpcyB0YWJsZSBpcyB0ZW4gZW50cmllcyBsb25nLgotCQkJVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB0YWJsZSBsZW5ndGgKLQkJCW9yLCBieSBzcGVjaWZ5aW5nIGFuIGFyZ3VtZW50IHZhbHVlIG9mIDAsIGl0IGNhbiBiZQotCQkJc3VwcHJlc3NlZCBjb21wbGV0ZWx5LgotCi0tbiBzeW1zcGVjCS0tdGltZT1zeW1zcGVjCi0JCQlPbmx5IHN5bWJvbHMgc2VsZWN0ZWQgYnkgInN5bXNwZWMiIGFyZSBjb25zaWRlcmVkCi0JCQlpbiB0b3RhbCBhbmQgcGVyY2VudGFnZSB0aW1lIGNvbXB1dGF0aW9ucy4KLQkJCUhvd2V2ZXIsIHRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCBwZXJjZW50YWdlIHRpbWUKLQkJCWNvbXB1dGF0aW9uIGZvciB0aGUgZmxhdCBwcm9maWxlLgotCQkJSWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbgotCQkJb2YgYWxsIHNlbGVjdGVkIHN5bWJvbHMgaXMgdXNlZCBpbiB0aW1lIGNvbXB1dGF0aW9ucy4KLQotLU4JCS0tbm8tdGltZT1zeW1zcGVjCi0JCQlFeGNsdWRlIHRoZSBzeW1ib2xzIHNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBmcm9tCi0JCQl0b3RhbCBhbmQgcGVyY2VudGFnZSB0aW1lIGNvbXB1dGF0aW9ucy4KLQkJCUhvd2V2ZXIsIHRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCBwZXJjZW50YWdlIHRpbWUKLQkJCWNvbXB1dGF0aW9uIGZvciB0aGUgZmxhdCBwcm9maWxlLgotCQkJVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiBhbnkgLS10aW1lIG9wdGlvbnMgYXJlCi0JCQlzcGVjaWZpZWQuCi0KLS13IG51bQkJLS13aWR0aD1udW0KLQkJCVNldHMgdGhlIG91dHB1dCBsaW5lIHdpZHRoLiAgQ3VycmVudGx5LCB0aGlzIG9wdGlvbgotCQkJYWZmZWN0cyB0aGUgcHJpbnRpbmcgb2YgdGhlIGNhbGwtZ3JhcGggZnVuY3Rpb24gaW5kZXgKLQkJCW9ubHkuCi0KLS1lCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+Ci0tRQkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLWYJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1GCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+Ci0tawkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLWIJCS0tYnJpZWYKLS1kbnVtCQktLWRlYnVnWz1udW1dCi0KLS1oCQktLWhlbHAKLQkJCVByaW50cyBhIHVzYWdlIG1lc3NhZ2UuCi0KLS1PIG5hbWUJCS0tZmlsZS1mb3JtYXQ9bmFtZQotCQkJU2VsZWN0cyB0aGUgZm9ybWF0IG9mIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMuCi0JCQlSZWNvZ25pemVkIGZvcm1hdHMgYXJlICJhdXRvIiwgImJzZCIsICJtYWdpYyIsCi0JCQlhbmQgInByb2YiLiAgVGhlIGxhc3Qgb25lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgotCQkJRm9ybWF0ICJhdXRvIiBhdHRlbXB0cyB0byBkZXRlY3QgdGhlIGZpbGUgZm9ybWF0Ci0JCQlhdXRvbWF0aWNhbGx5ICh0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4KLQkJCUl0IGF0dGVtcHRzIHRvIHJlYWQgdGhlIHByb2ZpbGUgZGF0YSBmaWxlcyBhcwotCQkJIm1hZ2ljIiBmaWxlcyBhbmQgaWYgdGhpcyBmYWlscywgZmFsbHMgYmFjayB0bwotCQkJdGhlICJic2QiIGZvcm1hdC4gICJic2QiIGZvcmNlcyBncHJvZiB0byByZWFkCi0JCQl0aGUgZGF0YSBmaWxlcyBpbiB0aGUgQlNEIGZvcm1hdC4gICJtYWdpYyIgZm9yY2VzCi0JCQlncHJvZiB0byByZWFkIHRoZSBkYXRhIGZpbGVzIGluIHRoZSAibWFnaWMiIGZvcm1hdC4KLQotLVQJCS0tdHJhZGl0aW9uYWwKLS12CQktLXZlcnNpb24KLQotKiogRmlsZSBGb3JtYXQgQ2hhbmdlcwotCi1UaGUgb2xkIEJTRC1kZXJpdmVkIGZvcm1hdCB1c2VkIGZvciBwcm9maWxlIGRhdGEgZG9lcyBub3QgY29udGFpbiBhCi1tYWdpYyBjb29raWUgdGhhdCBhbGxvd3MgdG8gY2hlY2sgd2hldGhlciBhIGRhdGEgZmlsZSByZWFsbHkgaXMgYQotZ3Byb2YgZmlsZS4gIEZ1cnRoZXJtb3JlLCBpdCBkb2VzIG5vdCBwcm92aWRlIGEgdmVyc2lvbiBudW1iZXIsIHRodXMKLXJlbmRlcmluZyBjaGFuZ2VzIHRvIHRoZSBmaWxlIGZvcm1hdCBhbG1vc3QgaW1wb3NzaWJsZS4gIEdOVSBncHJvZgotdXNlcyBhIG5ldyBmaWxlIGZvcm1hdCB0aGF0IHByb3ZpZGVzIHRoZXNlIGZlYXR1cmVzLiAgRm9yIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5LCBHTlUgZ3Byb2YgY29udGludWVzIHRvIHN1cHBvcnQgdGhlIG9sZCBCU0QtZGVyaXZlZAotZm9ybWF0LCBidXQgbm90IGFsbCBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkIHdpdGggaXQuICBGb3IgZXhhbXBsZSwKLWJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgY2Fubm90IGJlIGFjY29tbW9kYXRlZCBieSB0aGUgb2xkIGZpbGUKLWZvcm1hdC4KLQotVGhlIG5ldyBmaWxlIGZvcm1hdCBpcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlIFxmaWxle2dtb25fb3V0Lmh9LiAgSXQKLWNvbnNpc3RzIG9mIGEgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIG1hZ2ljIGNvb2tpZSBhbmQgYSB2ZXJzaW9uIG51bWJlciwKLWFzIHdlbGwgYXMgc29tZSBzcGFyZSBieXRlcyBhdmFpbGFibGUgZm9yIGZ1dHVyZSBleHRlbnNpb25zLiAgQWxsIGRhdGEKLWluIGEgcHJvZmlsZSBkYXRhIGZpbGUgaXMgaW4gdGhlIG5hdGl2ZSBmb3JtYXQgb2YgdGhlIGhvc3Qgb24gd2hpY2gKLXRoZSBwcm9maWxlIHdhcyBjb2xsZWN0ZWQuICBHTlUgZ3Byb2YgYWRhcHRzIGF1dG9tYXRpY2FsbHkgdG8gdGhlCi1ieXRlLW9yZGVyIGluIHVzZS4KLQotSW4gdGhlIG5ldyBmaWxlIGZvcm1hdCwgdGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mCi1yZWNvcmRzLiAgQ3VycmVudGx5LCB0aGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IHJlY29yZCB0eXBlczogaGlzdG9ncmFtCi1yZWNvcmRzLCBjYWxsLWdyYXBoIGFyYyByZWNvcmRzLCBhbmQgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50Ci1yZWNvcmRzLiAgRWFjaCBmaWxlIGNhbiBjb250YWluIGFueSBudW1iZXIgb2YgZWFjaCByZWNvcmQgdHlwZS4gIFdoZW4KLXJlYWRpbmcgYSBmaWxlLCBHTlUgZ3Byb2Ygd2lsbCBlbnN1cmUgcmVjb3JkcyBvZiB0aGUgc2FtZSB0eXBlIGFyZQotY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgYW5kIGNvbXB1dGUgdGhlIHVuaW9uIG9mIGFsbCByZWNvcmRzLiAgRm9yCi1leGFtcGxlLCBmb3IgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cywgdGhlIHVuaW9uIGlzIHNpbXBseSB0aGUgc3VtCi1vZiBhbGwgZXhlY3V0aW9uIGNvdW50cyBmb3IgZWFjaCBiYXNpYy1ibG9jay4KLQotKioqIEhpc3RvZ3JhbSBSZWNvcmRzCi0KLUhpc3RvZ3JhbSByZWNvcmRzIGNvbnNpc3Qgb2YgYSBoZWFkZXIgdGhhdCBpcyBmb2xsb3dlZCBieSBhbiBhcnJheSBvZgotYmlucy4gIFRoZSBoZWFkZXIgY29udGFpbnMgdGhlIHRleHQtc2VnbWVudCByYW5nZSB0aGF0IHRoZSBoaXN0b2dyYW0KLXNwYW5zLCB0aGUgc2l6ZSBvZiB0aGUgaGlzdG9ncmFtIGluIGJ5dGVzICh1bmxpa2UgaW4gdGhlIG9sZCBCU0QKLWZvcm1hdCwgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIpLCB0aGUgcmF0ZSBvZiB0aGUKLXByb2ZpbGluZyBjbG9jaywgYW5kIHRoZSBwaHlzaWNhbCBkaW1lbnNpb24gdGhhdCB0aGUgYmluIGNvdW50cwotcmVwcmVzZW50IGFmdGVyIGJlaW5nIHNjYWxlZCBieSB0aGUgcHJvZmlsaW5nIGNsb2NrIHJhdGUuICBUaGUKLXBoeXNpY2FsIGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdHdvIHBhcnRzOiBhIGxvbmcgbmFtZSBvZiB1cCB0byAxNQotY2hhcmFjdGVycyBhbmQgYSBzaW5nbGUgY2hhcmFjdGVyIGFiYnJldmlhdGlvbi4gIEZvciBleGFtcGxlLCBhCi1oaXN0b2dyYW0gcmVwcmVzZW50aW5nIHJlYWwtdGltZSB3b3VsZCBzcGVjaWZ5IHRoZSBsb25nIG5hbWUgYXMKLSJzZWNvbmRzIiBhbmQgdGhlIGFiYnJldmlhdGlvbiBhcyAicyIuICBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIGZvcgotYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgcGVyZm9ybWFuY2UgbW9uaXRvciBoYXJkd2FyZSAod2hpY2gsCi1mb3J0dW5hdGVseSwgaXMgYmVjb21pbmcgaW5jcmVhc2luZ2x5IGNvbW1vbikuICBGb3IgZXhhbXBsZSwgdW5kZXIgREVDCi1PU0YvMSwgdGhlICJ1cHJvZmlsZSIgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIGEgaGlzdG9ncmFtIG9mLAotc2F5LCBpbnN0cnVjdGlvbiBjYWNoZSBtaXNzZXMuICBJbiB0aGlzIGNhc2UsIHRoZSBkaW1lbnNpb24gaW4gdGhlCi1oaXN0b2dyYW0gaGVhZGVyIGNvdWxkIGJlIHNldCB0byAiaS1jYWNoZSBtaXNzZXMiIGFuZCB0aGUgYWJicmV2aWF0aW9uCi1jb3VsZCBiZSBzZXQgdG8gIjEiIChiZWNhdXNlIGl0IGlzIHNpbXBseSBhIGNvdW50LCBub3QgYSBwaHlzaWNhbAotZGltZW5zaW9uKS4gIEFsc28sIHRoZSBwcm9maWxpbmcgcmF0ZSB3b3VsZCBoYXZlIHRvIGJlIHNldCB0byAxIGluCi10aGlzIGNhc2UuCi0KLUhpc3RvZ3JhbSBiaW5zIGFyZSAxNi1iaXQgbnVtYmVycyBhbmQgZWFjaCBiaW4gcmVwcmVzZW50IGFuIGVxdWFsCi1hbW91bnQgb2YgdGV4dC1zcGFjZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgdGV4dC1zZWdtZW50IGlzIG9uZQotdGhvdXNhbmQgYnl0ZXMgbG9uZyBhbmQgaWYgdGhlcmUgYXJlIHRlbiBiaW5zIGluIHRoZSBoaXN0b2dyYW0sIGVhY2gKLWJpbiByZXByZXNlbnRzIG9uZSBodW5kcmVkIGJ5dGVzLgotCi0KLSoqKiBDYWxsLUdyYXBoIFJlY29yZHMKLQotQ2FsbC1ncmFwaCByZWNvcmRzIGhhdmUgYSBmb3JtYXQgdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB1c2VkIGluCi10aGUgQlNELWRlcml2ZWQgZmlsZSBmb3JtYXQuICBJdCBjb25zaXN0cyBvZiBhbiBhcmMgaW4gdGhlIGNhbGwgZ3JhcGgKLWFuZCBhIGNvdW50IGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYXJjIHdhcyB0cmF2ZXJzZWQKLWR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbi4gIEFyY3MgYXJlIHNwZWNpZmllZCBieSBhIHBhaXIgb2YgYWRkcmVzc2VzOgotdGhlIGZpcnN0IG11c3QgYmUgd2l0aGluIGNhbGxlcidzIGZ1bmN0aW9uIGFuZCB0aGUgc2Vjb25kIG11c3QgYmUKLXdpdGhpbiB0aGUgY2FsbGVlJ3MgZnVuY3Rpb24uICBXaGVuIHBlcmZvcm1pbmcgcHJvZmlsaW5nIGF0IHRoZQotZnVuY3Rpb24gbGV2ZWwsIHRoZXNlIGFkZHJlc3NlcyBjYW4gcG9pbnQgYW55d2hlcmUgd2l0aGluIHRoZQotcmVzcGVjdGl2ZSBmdW5jdGlvbi4gIEhvd2V2ZXIsIHdoZW4gcHJvZmlsaW5nIGF0IHRoZSBsaW5lLWxldmVsLCBpdCBpcwotYmV0dGVyIGlmIHRoZSBhZGRyZXNzZXMgYXJlIGFzIGNsb3NlIHRvIHRoZSBjYWxsLXNpdGUvZW50cnktcG9pbnQgYXMKLXBvc3NpYmxlLiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBsaW5lLWxldmVsIGNhbGwtZ3JhcGggaXMgYWJsZSB0bwotaWRlbnRpZnkgZXhhY3RseSB3aGljaCBsaW5lIG9mIHNvdXJjZSBjb2RlIHBlcmZvcm1lZCBjYWxscyB0byBhCi1mdW5jdGlvbi4KLQotKioqIEJhc2ljLUJsb2NrIEV4ZWN1dGlvbiBDb3VudCBSZWNvcmRzCi0KLUJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudCByZWNvcmRzIGNvbnNpc3Qgb2YgYSBoZWFkZXIgZm9sbG93ZWQgYnkgYQotc2VxdWVuY2Ugb2YgYWRkcmVzcy9jb3VudCBwYWlycy4gIFRoZSBoZWFkZXIgc2ltcGx5IHNwZWNpZmllcyB0aGUKLWxlbmd0aCBvZiB0aGUgc2VxdWVuY2UuICBJbiBhbiBhZGRyZXNzL2NvdW50IHBhaXIsIHRoZSBhZGRyZXNzCi1pZGVudGlmaWVzIGEgYmFzaWMtYmxvY2sgYW5kIHRoZSBjb3VudCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lcwotdGhhdCBiYXNpYy1ibG9jayB3YXMgZXhlY3V0ZWQuICBBbnkgYWRkcmVzcyB3aXRoaW4gdGhlIGJhc2ljLWFkZHJlc3MgY2FuCi1iZSB1c2VkLgotCi1JTVBMRU1FTlRBVElPTiBOT1RFOiBnY2MgLWEgY2FuIGJlIHVzZWQgdG8gaW5zdHJ1bWVudCBhIHByb2dyYW0gdG8KLXJlY29yZCBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLiAgSG93ZXZlciwgdGhlIF9fYmJfZXhpdF9mdW5jKCkKLXRoYXQgaXMgY3VycmVudGx5IHByZXNlbnQgaW4gbGliZ2NjMi5jIGRvZXMgbm90IGdlbmVyYXRlIGEgZ21vbi5vdXQKLWZpbGUgaW4gYSBzdWl0ZWFibGUgZm9ybWF0LiAgVGhpcyBzaG91bGQgYmUgZml4ZWQgZm9yIGZ1dHVyZSByZWxlYXNlcwotb2YgZ2NjLiAgSW4gdGhlIG1lYW50aW1lLCBjb250YWN0IGRhdmlkbUBjcy5hcml6b25hLmVkdSBmb3IgYSB2ZXJzaW9uCi1vZiBfX2JiX2V4aXRfZnVuYygpIHRvIGlzIGFwcHJvcHJpYXRlLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvVEVTVCBiL2dwcm9mL1RFU1QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTkwMzAuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvVEVTVAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLSBjaGVjayB3aGV0aGVyIG9sZCBmaWxlIGZvcm1hdCBpcyBwcm9wZXJseSByZWFkIHdoZW4gaW5wdXQgY29tZXMgZnJvbQotICBzdGRpbgotCi0tIGNoZWNrIHdoZXRoZXIgdW5kZXJzY29yZXMgYXJlIHByb3Blcmx5IGRlYWx0IHdpdGggKGJvdGgsIG9uIHN5c3RlbXMKLSAgdGhhdCBwcmVwZW5kIHRoZW0gdG8gZWFjaCBDIG5hbWUgYW5kIG9uIHN5c3RlbXMgdGhhdCBkb24ndCkKLQotLSBlbnN1cmUgZ3Byb2YgZmFpbHMgZ3JhY2VmdWxseSB3aGVuIG5vIGRlYnVnZ2luZyBpbmZvIGF2YWlsYWJsZQpkaWZmIC0tZ2l0IGEvZ3Byb2YvVE9ETyBiL2dwcm9mL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMTExYzYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLQotLSBnbW9uX2lvLmMgY2Fubm90IGRlYWwgd2l0aCB0YXJnZXQgYXJjaGl0ZWN0dXJlIHRoYXQgaGF2ZSBhIHBvaW50ZXIgc2l6ZQotICB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBob3N0IGFyY2hpdGVjdHVyZXMgcG9pbnRlciBzaXplLS0tZml4IHRoaXMKLSAgKGdtb25fb3V0LmgsIGFuZCBnbW9uX2lvLmMpCi0tIGFkZCBzdXBwb3J0IGZvciBwcm9mIGZpbGUgZm9ybWF0IHNvIHRoYXQgcHJvZiBmaWxlcyBjYW4gYmUgZGlzcGxheWVkCi0gIGF0IHRoZSBsaW5lLWxldmVsICh0aGlzIGlzIHVzZWZ1bCBmb3IgdGhlIHVwcm9maWxlIHRvb2wgdW5kZXIgREVDJ3MKLSAgT1NGLzEpCi0tIHRha2UgYSBoYXJkIGxvb2sgYXQgLS1maWxlLW9yZGVyaW5nIChicm9rZW4pIGFuZCAtLWZ1bmN0aW9uLW9yZGVyaW5nCi0KLSsgZG9jdW1lbnRhdGlvbgotKyBvcHRpbWl6ZSBiZmRfZmluZF9uZWFyZXN0X2xpbmVfbnVtKCkgKG9yIHJlcGxhY2UgYnkgZGlmZmVyZW50IGludGVyZmFjZSkKLSsgY2xlYW51cCBfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lX251bSgpIGZpeGVzICYgZGVzY3JpcHRpb24KLSsgZW5zdXJlICJjYyAtcGciIHByb2R1Y2VzIGdvb2QgZmlsZXMgdW5kZXIgT1NGLzEgdjMuMAotKyBtYWtlIHN1cmUgZ3Byb2Ygd29ya3MgdG9nZXRoZXIgd2l0aCBPU0YvMSB2My4wJ3MgcHJvZmlsaW5nIGxpYnJhcmllcwotKyBpbXBsZW1lbnQgc3ltdGFiX3BhcnNlKCk7IG1vZGlmeSBzeW1fbG9va3VwKCkgdG8gY29uc2lkZXIgYWRkcl9oaWdoCi0rIGNoYW5nZSBncHJvZi5jIHRvIGNvbGxlY3QgbGlzdHMsIHRoZW4gaW52b2tlIHN5bXRhYl9wYXJzZSgpIGZvcgotICBlYWNoIGxpc3QKLSsgUXVlc3Rpb25zOgotCW8gaXMgLWMgKC0tc3RhdGljLWNhbGwtZ3JhcGgpIHVzZWZ1bCBhdCBhbGw/ICBpIGNhbid0IHNlZQotCSAgaG93OyBpZiBpdCB3ZXJlIGRlbGV0ZWQsIGdwcm9mIHdvdWxkIGJlIGNvbXBsZXRlbHkgbWFjaGluZQotCSAgaW5kZXBlbmRlbnQgPT4geXVwLCBpdCBpcwotCW8gYXJlIChsb25nKSBvcHRpb24gbmFtZXMgYXBwcm9wcmlhdGU/Ci0JbyAtayAoLS1leGNsdWRlLWFyYykgY2Fubm90IGJlIGltcGxlbWVudGVkIHdpdGggZ2V0b3B0KCk7Ci0JICBpcyBuZXcgc3ludGF4ICgtayBmcm9tL3RvKSBhY2NlcHRhYmxlPyAgSWYgbm90LCBob3cgdG8KLQkgIGZpeCBpdD8KLQlvIGluIHRoZSBGU0Ygb3V0cHV0LCB0aGUgY2FsbC1ncmFwaCBpbmRleCBub3cgcHJpbnRzCi0JICB0aGUgZmlsZW5hbWUgb2Ygc3RhdGljIGZ1bmN0aW9ucyBpbiBwYXJlbnRoZXNlczsgZS5nLiwKLQkgIHN0YXRpYyBmdW5jdGlvbiBmb28oKSB0aGF0IGlzIGRlZmluZWQgaW4gZmlsZSBiYXIuYwotCSAgd291bGQgYmUgcHJpbnRlZCBhczoKLQotCQkJWzRdIGZvbyAoYmFyLmMpCi0KLQkgIGlzIHRoaXMgYWNjZXB0YWJsZT8gIHNob3VsZCBpdCBiZSBkb25lIG9ubHkgb3B0aW9uYWxseT8KLQlvIHN5bWJvbHMgd2l0aCBhZGRyZXNzZXMgdGhhdCBtYXAgYmFjayB0byBhIGRpZmZlcmVudAotCSAgbmFtZSBhcmUgc3VwcHJlc3NlZCAoaGFwcGVucyB3aXRoIGxhYmVscywgZm9yIGV4YW1wbGUpOwotCSAgaXMgdGhpcyBhY2NlcHRhYmxlPyAgc2hvdWxkIGl0IGJlIGRvbmUgb25seSBvcHRpb25hbGx5PwotKyBnZW5lcmFsaXplIHRvIGFsbG93IGFyYml0cmFyeSBoaXN0b2dyYW1zIChub3QganVzdCB0aW1lIGhpc3RvZ3JhbXMpCi0rIGJhc2ljLWJsb2NrIGluZm9ybWF0aW9uIGN1cnJlbnRseSByZXBsYWNlcyBhbGwgc3ltYm9scyBjcmVhdGVkIGZyb20KLSAgdGhlIGNvcmUgYmVjYXVzZSBvZiBhbiB1Z2x5IG9yZGVyaW5nIGNvbmZsaWN0LS0tZm9yIG5vdywgdGhlIGN1cnJlbnQKLSAgc29sdXRpb24gd29ya3MsIGJ1dCBzb21ldGhpbmcgY2xlYW5lciBpcyBkZXNpcmFibGUgPT0+IGNsZWFuZWQgdXAsCi0gIGJ1dCBpdCdzIHNsb3dlciBub3cKLSsgY29udmVydCB0byB2ZXJ5IG5ldyBmaWxlIGZvcm1hdCAoYmFjayB0byB0cml2aWFsIGZvcm1hdCwgdGhhdCBpcyA6KQotKyByZXBsYWNlICJkdW1teS5oIiBmb3IgQWxwaGEgKGlmIHRoZXJlIGlzIGFueSB1c2UgdG8gaXQpCi0rIGFkZCBzdXBwb3J0IGZvciBleGVjdXRpb24gdGltZSBwcm9maWxpbmcgYXQgYSBiYXNpYy1ibG9jayBsZXZlbAotKyBmaXggZmlsZW5hbWUtb2ZmLWJ5LW9uZSBidWcgZm9yIEFscGhhIChzZWUgfi90bXAvZC5bY2hdKS0tLW5vIGxvbmdlcgotICByZWxldmFudAotKyAiLXBnIC1hIiBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQgYmVjYXVzZSBtY2xlYW51cCgpIHdpbGwgb3ZlcndyaXRlCi0gIHRoZSBmaWxlIGdlbmVyYXRlZCBieSBfX2JiX2V4aXRfZnVuYygpIChvciB2aWNlIHZlcnNhKQotKyBmaXJzdCBiYXNpYy1ibG9jayBvZiBmYWMoKSBzZWVtcyB0byBnZXQgY3JlZGl0ZWQgdG8gbGFzdCBiYXNpYy1ibG9jawotICBvZiBwcmV2aW91cyBmdW5jdGlvbiA9PiBidWcgaW4gYmFzaWNfYmxvY2tzLmMKLSsgZmxhdCBwcm9maWxlIHNob3VsZCBwcm92aWRlIGF1dG9tYXRpYyBzY2FsaW5nIGZvciBwZXItY2FsbCB0aW1lcyBiZWNhdXNlCi0gIG90aGVyd2lzZSB0aGV5J2xsIGFsd2F5cyBiZSB6ZXJvIG9uIGEgZmFzdCBtYWNoaW5lIHdpdGggdG9ucyBvZiBzbWFsbAotICBmdW5jdGlvbnMKLSsgbWFrZSAiLWEiIGltcGx5IHRvIHJldGFpbiBsaW5lIG51bWJlciBpbmZvICh3aXRob3V0IGFjdHVhbGx5IGdlbmVyYXRpbmcKLSAgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAodW5sZXNzIC1nIGlzIHNwZWNpZmllZCktLS1ubywgdGhpcyBpcyBhCi0gIGJhZCBpZGVhLCBiZWNhdXNlIGl0IGlzIG5vdCBjbGVhciB3aGF0IGxldmVsIG9mIGRlYnVnZ2luZyBpbmZvIHNob3VsZAotICBiZSByZXF1ZXN0ZWQgKGUuZy4sIC1nIHZzLiAtZzMpOyBsZWF2aW5nIGl0IHVwIHRvIHRoZSB1c2VyIHNlZW1zIGJlc3QKLSsgYWRkIGxvbmcgb3B0aW9ucyBzdXBwb3J0IChvciBhdCBsZWFzdCB1c2UgZ2V0b3B0IGluc3RlYWQgb2YgYWQtaG9jCi0gIGltcGxlbWVudGF0aW9uKQotKyBzcGxpdCBpbnRvIGZpbGVzIGFjY29yZGluZyB0byBhYnN0cmFjdCBvYmplY3RzIHRoYXQgYXJlIG1hbmlwdWxhdGVkCi0rIHJlcGxhY2Ugc2Njc2lkIGJ5IHJjc2lkICYgYWRkICJlbmQgb2YgLi4uIiB0byBldmVyeSAuYyBmaWxlCi0rIHVzZSBEQkcoKSBldmVyeXdoZXJlCi0rIGZpeCBzcGFjaW5nICgiICwiIC0+ICIsIiBldGMuKQotKyB1c2UgREVGVU5zIGV2ZXJ5d2hlcmUKLSsgbWFrZSBjb21waWxlIGNsZWFubHkgd2l0aCAtV2FsbAotKyAiZ2NjIC1wZyAtTzIiIGRvZXNuJ3Qgd29yayBvbiB0ZWNjLmMgdW5sZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIGlzCi0gIHNwZWNpZmllZDsgZmluZCBvdXQgd2h5Ci0rIG1ha2UgdGhpbmdzIHBvcnRhYmxlIChwcm90b3R5cGVzLCBjb25zdCwgZXRjLikKLSsgaWYgTkVXX0dNT05fT1VUIGlzIG5vdCBkZWZpbmVkLCBoYXZlIGEgZmxhZyB0aGF0IHdpbGwgYWxsb3cgdG8KLSAgcmVhZCBuZXcgZ21vbi5vdXQgc3R5bGUgZmlsZXMuICBUaGUgaWRlYSBiZWluZyB0aGF0IGV2ZXJ5b25lCi0gIHdpbGwgdXNlIHRoZSBuZXcgZm9ybWF0IGZvciBiYXNpYy1ibG9jayBzdHlsZSBwcm9maWxpbmcgYnV0Ci0gIHRoZSBvbGQgZm9ybWF0IGZvciByZWd1bGFyIGdwcHJvZmlsaW5nCmRpZmYgLS1naXQgYS9ncHJvZi9hY2xvY2FsLm00IGIvZ3Byb2YvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyMDEyMi4uMDAwMDAwMAotLS0gYS9ncHJvZi9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTEwOSArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCi0jIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KLSMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgc2VyaWFsIDEKLQotZG5sIFVzYWdlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKLQotQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotUEFDS0FHRT1bJDFdCi1BQ19TVUJTVChQQUNLQUdFKQotVkVSU0lPTj1bJDJdCi1BQ19TVUJTVChWRVJTSU9OKQotZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotZmkKLWlmZWxzZShbJDNdLCwKLUFDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLUFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKLWRubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KLSMKLQotQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCi1kbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgotQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAotW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICQxPSQyCi0gICBBQ19NU0dfUkVTVUxUKGZvdW5kKQotZWxzZQotICAgJDE9IiQzL21pc3NpbmcgJDIiCi0gICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCi1maQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIHNlcmlhbCAzNSBBQ19QUk9HX0xJQlRPT0wKLUFDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKLVtBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1BQ19DQUNIRV9TQVZFCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCi0gICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCi0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICBBQ19TWVNfTElCVE9PTF9DWUdXSU4KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCi1bICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmddLAotbmVlZF9sb2Nrcz0kZW5hYmxldmFsLAotbmVlZF9sb2Nrcz15ZXMpCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGNoZWNrIGZvciBkbG9wZW4gc3VwcG9ydAotQUNfREVGVU4oQUNfTElCVE9PTF9ETE9QRU4sIFtsdF9kbG9wZW49eWVzXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELAotW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHNoYXJlZCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELAotW0FDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLAotW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHN0YXRpYywKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLAotW0FDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsCi1bZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKLUFDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLAotW0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotCi0jIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKLUFDX0RFRlVOKEFDX1BST0dfTEQsCi1bQUNfQVJHX1dJVEgoZ251LWxkLAotWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCi10ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotY2hhbmdlcXVvdGUoLClkbmwKLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKLWZpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKLVtpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfU1VCU1QoTEQpCi1BQ19QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFDX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1BQ19NU0dfUkVTVUxUKFskTk1dKQotQUNfU1VCU1QoTk0pCi1dKQotCi0jIEFDX1NZU19OTV9QQVJTRSAtIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZAotIyBieSBDIHN5bWJvbCBuYW1lIGZyb20gbm0uCi1BQ19ERUZVTihBQ19TWVNfTk1fUEFSU0UsCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUsCi1bIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi1jaGFuZ2VxdW90ZSgsKWRubAotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJGFjX3N5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1jaGFuZ2VxdW90ZSgsKWRubAotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotCSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotXSkKLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1BQ19NU0dfUkVTVUxUKCRhY19yZXN1bHQpCi1dKQotCi0jIEFDX1NZU19MSUJUT09MX0NZR1dJTiAtIGZpbmQgdG9vbHMgbmVlZGVkIG9uIGN5Z3dpbgotQUNfREVGVU4oQUNfU1lTX0xJQlRPT0xfQ1lHV0lOLAotW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi1BQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi1dKQotCi0jIEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSAtIGRvZXMgdGhlIGNvbXBpbGVyIHByZWZpeCBnbG9iYWwgc3ltYm9scwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIHVuZGVyc2NvcmU/Ci1BQ19ERUZVTihBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfTVNHX0NIRUNLSU5HKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlLAotW2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi1maQotcm0gLXJmIGNvbmZ0ZXN0KgotXSkKLUFDX01TR19SRVNVTFQoJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSkKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLUFDX1NVQlNUKFVTRV9TWU1CT0xfVU5ERVJTQ09SRSlkbmwKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sIFsKLUFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wpCi1BQ19DSEVDS19MSUIobSwgY29zKQotXSkKLQotIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSwgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi1BQ19ERUZVTihBQ19MSUJMVERMX0NPTlZFTklFTkNFLCBbCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLV0pCi0KLSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnksIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCi1BQ19ERUZVTihBQ19MSUJMVERMX0lOU1RBTExBQkxFLCBbCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLCBMSUJMVERMPSItbGx0ZGwiLCBbCi0gICAgY2FzZSAiJGVuYWJsZV9sdGRsX2luc3RhbGwiIGluCi0gICAgbm8pIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKSA7OwotICAgICIiKSBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIgOzsKLSAgICBlc2FjCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geCJubyI7IHRoZW4KLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotQUNfREVGVU4oQU1fU1lTX05NX1BBUlNFLCBbaW5kaXIoW0FDX1NZU19OTV9QQVJTRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwgW2luZGlyKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTElCVE9PTF9DWUdXSU4sIFtpbmRpcihbQUNfU1lTX0xJQlRPT0xfQ1lHV0lOXSldKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCmRpZmYgLS1naXQgYS9ncHJvZi9hbHBoYS5jIGIvZ3Byb2YvYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhZDc0ZC4uMDAwMDAwMAotLS0gYS9ncHJvZi9hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTggUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLS8qCi0gKiBPcGNvZGVzIG9mIHRoZSBjYWxsIGluc3RydWN0aW9uczoKLSAqLwotI2RlZmluZSBPUF9KeHgJMHgxYQotI2RlZmluZQlPUF9CU1IJMHgzNAotCi0jZGVmaW5lIEp4eF9GVU5DX0pNUAkJMAotI2RlZmluZSBKeHhfRlVOQ19KU1IJCTEKLSNkZWZpbmUgSnh4X0ZVTkNfUkVUCQkyCi0jZGVmaW5lIEp4eF9GVU5DX0pTUl9DT1JPVVRJTkUJMwotCi10eXBlZGVmIHVuaW9uCi0gIHsKLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQl1bnNpZ25lZCBvdGhlcjoyNjsKLQl1bnNpZ25lZCBvcF9jb2RlOjY7Ci0gICAgICB9Ci0gICAgYTsJCQkJLyogYW55IGZvcm1hdCAqLwotICAgIHN0cnVjdAotICAgICAgewotCWludCBkaXNwOjIxOwotCXVuc2lnbmVkIHJhOjU7Ci0JdW5zaWduZWQgb3BfY29kZTo2OwotICAgICAgfQotICAgIGI7CQkJCS8qIGJyYW5jaCBmb3JtYXQgKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQlpbnQgaGludDoxNDsKLQl1bnNpZ25lZCBmdW5jOjI7Ci0JdW5zaWduZWQgcmI6NTsKLQl1bnNpZ25lZCByYTo1OwotCXVuc2lnbmVkIG9wX2NvZGU6NjsKLSAgICAgIH0KLSAgICBqOwkJCQkvKiBqdW1wIGZvcm1hdCAqLwotICB9Ci1hbHBoYV9JbnN0cnVjdGlvbjsKLQotc3RhdGljIFN5bSBpbmRpcmVjdF9jaGlsZDsKLQotCi0vKgotICogT24gdGhlIEFscGhhIHdlIGNhbiBvbmx5IGRldGVjdCBQQyByZWxhdGl2ZSBjYWxscywgd2hpY2ggYXJlCi0gKiB1c3VhbGx5IGdlbmVyYXRlZCBmb3IgY2FsbHMgdG8gZnVuY3Rpb25zIHdpdGhpbiB0aGUgc2FtZQotICogb2JqZWN0IGZpbGUgb25seS4gIFRoaXMgaXMgc3RpbGwgYmV0dGVyIHRoYW4gbm90aGluZywgaG93ZXZlci4KLSAqIChJbiBwYXJ0aWN1bGFyIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBmaW5kIGZ1bmN0aW9ucyB0aGF0Ci0gKiAgcG90ZW50aWFsbHkgY2FsbCBpbnRlZ2VyIGRpdmlzaW9uIHJvdXRpbmVzLCBmb3IgZXhhbXBsZS4pCi0gKi8KLXZvaWQKLWFscGhhX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYykKLSAgICAgU3ltICpwYXJlbnQ7Ci0gICAgIGJmZF92bWEgcF9sb3dwYzsKLSAgICAgYmZkX3ZtYSBwX2hpZ2hwYzsKLXsKLSAgc3RhdGljIGJmZF92bWEgZGVsdGEgPSAwOwotICBiZmRfdm1hIGRlc3RfcGM7Ci0gIGFscGhhX0luc3RydWN0aW9uICpwYzsKLSAgU3ltICpjaGlsZDsKLQotICBpZiAoIWRlbHRhKQotICAgIHsKLSAgICAgIGRlbHRhID0gKGJmZF92bWEpIGNvcmVfdGV4dF9zcGFjZSAtIGNvcmVfdGV4dF9zZWN0LT52bWE7Ci0KLSAgICAgIHN5bV9pbml0ICgmaW5kaXJlY3RfY2hpbGQpOwotICAgICAgaW5kaXJlY3RfY2hpbGQubmFtZSA9IF8oIjxpbmRpcmVjdCBjaGlsZD4iKTsKLSAgICAgIGluZGlyZWN0X2NoaWxkLmNnLnByb3AuZnJhY3QgPSAxLjA7Ci0gICAgICBpbmRpcmVjdF9jaGlsZC5jZy5jeWMuaGVhZCA9ICZpbmRpcmVjdF9jaGlsZDsKLSAgICB9Ci0KLSAgaWYgKCFjb3JlX3RleHRfc3BhY2UpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKF8oIltmaW5kX2NhbGxdICVzOiAweCVseCB0byAweCVseFxuIiksCi0JCQkgIHBhcmVudC0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHBfbG93cGMsCi0JCQkgICh1bnNpZ25lZCBsb25nKSBwX2hpZ2hwYykpOwotICBmb3IgKHBjID0gKGFscGhhX0luc3RydWN0aW9uICopIChwX2xvd3BjICsgZGVsdGEpOwotICAgICAgIHBjIDwgKGFscGhhX0luc3RydWN0aW9uICopIChwX2hpZ2hwYyArIGRlbHRhKTsKLSAgICAgICArK3BjKQotICAgIHsKLSAgICAgIHN3aXRjaCAocGMtPmEub3BfY29kZSkKLQl7Ci0JY2FzZSBPUF9KeHg6Ci0JICAvKgotCSAgICogVGhlcmUgaXMgbm8gc2ltcGxlIGFuZCByZWxpYWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQotCSAgICogdGFyZ2V0IG9mIGEganNyICh0aGUgaGludCBiaXRzIGhlbHAsIGJ1dCB0aGVyZSBhcmVuJ3QKLQkgICAqIGVub3VnaCBiaXRzIHRvIGdldCBhIHNhdGlzZmFjdG9yeSBoaXQgcmF0ZSkuICBJbnN0ZWFkLAotCSAgICogZm9yIGFueSBpbmRpcmVjdCBqdW1wIHdlIHNpbXBseSBhZGQgYW4gYXJjIGZyb20gUEFSRU5UCi0JICAgKiB0byBJTkRJUkVDVF9DSElMRC0tLXRoYXQgd2F5IHRoZSB1c2VyIGl0IGF0IGxlYXN0IGFibGUKLQkgICAqIHRvIHNlZSB0aGF0IHRoZXJlIGFyZSBvdGhlciBjYWxscyBhcyB3ZWxsLgotCSAgICovCi0JICBpZiAocGMtPmouZnVuYyA9PSBKeHhfRlVOQ19KU1IKLQkgICAgICB8fCBwYy0+ai5mdW5jID09IEp4eF9GVU5DX0pTUl9DT1JPVVRJTkUpCi0JICAgIHsKLQkgICAgICBEQkcgKENBTExERUJVRywKLQkJICAgcHJpbnRmIChfKCJbZmluZF9jYWxsXSAweCVseDoganNyJXMgPGluZGlyZWN0X2NoaWxkPlxuIiksCi0JCQkgICAodW5zaWduZWQgbG9uZykgcGMgLSBkZWx0YSwKLQkJCSAgIHBjLT5qLmZ1bmMgPT0gSnh4X0ZVTkNfSlNSID8gIiIgOiAiX2Nvcm91dGluZSIpKTsKLQkgICAgICBhcmNfYWRkIChwYXJlbnQsICZpbmRpcmVjdF9jaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgT1BfQlNSOgotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoXygiW2ZpbmRfY2FsbF0gMHglbHg6IGJzciIpLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBjIC0gZGVsdGEpKTsKLQkgIC8qCi0JICAgKiBSZWd1bGFyIFBDIHJlbGF0aXZlIGFkZHJlc3NpbmcuICBDaGVjayB0aGF0IHRoaXMgaXMgdGhlCi0JICAgKiBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uICBUaGUgbGlua2VyIHNvbWV0aW1lcyByZWRpcmVjdHMKLQkgICAqIHRoZSBlbnRyeSBwb2ludCBieSA4IGJ5dGVzIHRvIHNraXAgbG9hZGluZyB0aGUgZ2xvYmFsCi0JICAgKiBwb2ludGVyLCBzbyB3ZSBhbGwgZm9yIGVpdGhlciBhZGRyZXNzOgotCSAgICovCi0JICBkZXN0X3BjID0gKChiZmRfdm1hKSAocGMgKyAxICsgcGMtPmIuZGlzcCkpIC0gZGVsdGE7Ci0JICBpZiAoZGVzdF9wYyA+PSBzX2xvd3BjICYmIGRlc3RfcGMgPD0gc19oaWdocGMpCi0JICAgIHsKLQkgICAgICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RfcGMpOwotCSAgICAgIERCRyAoQ0FMTERFQlVHLAotCQkgICBwcmludGYgKCIgMHglbHhcdDsgbmFtZT0lcywgYWRkcj0weCVseCIsCi0JCQkgICAodW5zaWduZWQgbG9uZykgZGVzdF9wYywgY2hpbGQtPm5hbWUsCi0JCQkgICAodW5zaWduZWQgbG9uZykgY2hpbGQtPmFkZHIpKTsKLQkgICAgICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdF9wYyB8fCBjaGlsZC0+YWRkciA9PSBkZXN0X3BjIC0gOCkKLQkJewotCQkgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJcbiIpKTsKLQkJICAvKiBhIGhpdDogICovCi0JCSAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBTb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCi0JICAgKi8KLQkgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJcdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9iYXNpY19ibG9ja3MuYyBiL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2RkNzYyYi4uMDAwMDAwMAotLS0gYS9ncHJvZi9iYXNpY19ibG9ja3MuYworKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi0vKgotICogQmFzaWMtYmxvY2sgbGV2ZWwgcmVsYXRlZCBjb2RlOiByZWFkaW5nL3dyaXRpbmcgb2YgYmFzaWMtYmxvY2sgaW5mbwotICogdG8vZnJvbSBnbW9uLm91dDsgY29tcHV0aW5nIGFuZCBmb3JtYXR0aW5nIG9mIGJhc2ljLWJsb2NrIHJlbGF0ZWQKLSAqIHN0YXRpc3RpY3MuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgImJhc2ljX2Jsb2Nrcy5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzb3VyY2UuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLQotLyoKLSAqIERlZmF1bHQgb3B0aW9uIHZhbHVlczoKLSAqLwotYm9vbCBiYl9hbm5vdGF0ZV9hbGxfbGluZXMgPSBGQUxTRTsKLXVuc2lnbmVkIGxvbmcgYmJfbWluX2NhbGxzID0gMTsKLWludCBiYl90YWJsZV9sZW5ndGggPSAxMDsKLQotLyoKLSAqIFZhcmlhYmxlcyB1c2VkIHRvIGNvbXB1dGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIHN0YXRzOgotICovCi1zdGF0aWMgbG9uZyBudW1fZXhlY3V0YWJsZV9saW5lczsKLXN0YXRpYyBsb25nIG51bV9saW5lc19leGVjdXRlZDsKLQotCi0vKgotICogSGVscGVyIGZvciBzb3J0aW5nLiAgQ29tcGFyZXMgdHdvIHN5bWJvbHMgYW5kIHJldHVybnMgcmVzdWx0Ci0gKiBzdWNoIHRoYXQgc29ydGluZyB3aWxsIGJlIGluY3JlYXNpbmcgYWNjb3JkaW5nIHRvIGZpbGVuYW1lLCBsaW5lCi0gKiBudW1iZXIsIGFuZCBhZGRyZXNzIChpbiB0aGF0IG9yZGVyKS4KLSAqLwotCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2JiLCAobHAsIHJwKSwgY29uc3Qgdm9pZCAqbHAgQU5EIGNvbnN0IHZvaWQgKnJwKQotewotICBpbnQgcjsKLSAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOwotICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOwotCi0gIGlmIChsZWZ0LT5maWxlICYmIHJpZ2h0LT5maWxlKQotICAgIHsKLSAgICAgIHIgPSBzdHJjbXAgKGxlZnQtPmZpbGUtPm5hbWUsIHJpZ2h0LT5maWxlLT5uYW1lKTsKLSAgICAgIGlmIChyKQotCXsKLQkgIHJldHVybiByOwotCX0KLQotICAgICAgaWYgKGxlZnQtPmxpbmVfbnVtICE9IHJpZ2h0LT5saW5lX251bSkKLQl7Ci0JICByZXR1cm4gbGVmdC0+bGluZV9udW0gLSByaWdodC0+bGluZV9udW07Ci0JfQotICAgIH0KLQotICBpZiAobGVmdC0+YWRkciA8IHJpZ2h0LT5hZGRyKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlZnQtPmFkZHIgPiByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIEhlbHBlciBmb3Igc29ydGluZy4gIE9yZGVyIGJhc2ljIGJsb2NrcyBpbiBkZWNyZWFzaW5nIG51bWJlciBvZgotICogY2FsbHMsIHRpZXMgYXJlIGJyb2tlbiBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIGxpbmUgbnVtYmVycy4KLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF9uY2FsbHMsIChscCwgcnApLCBjb25zdCB2b2lkICpscCBBTkQgY29uc3Qgdm9pZCAqcnApCi17Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLQotICBpZiAoIWxlZnQpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlIGlmICghcmlnaHQpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAobGVmdC0+bmNhbGxzIDwgcmlnaHQtPm5jYWxscykKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAobGVmdC0+bmNhbGxzID4gcmlnaHQtPm5jYWxscykKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIGxlZnQtPmxpbmVfbnVtIC0gcmlnaHQtPmxpbmVfbnVtOwotfQotCi0KLS8qCi0gKiBTa2lwIG92ZXIgdmFyaWFibGUgbGVuZ3RoIHN0cmluZy4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChmc2tpcF9zdHJpbmcsIChmcCksIEZJTEUgKiBmcCkKLXsKLSAgaW50IGNoOwotCi0gIHdoaWxlICgoY2ggPSBmZ2V0YyAoZnApKSAhPSBFT0YpCi0gICAgewotICAgICAgaWYgKGNoID09ICdcMCcpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogUmVhZCBhIGJhc2ljLWJsb2NrIHJlY29yZCBmcm9tIGZpbGUgSUZQLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUKLSAqIG9mIGZpbGUgSUZQIGFuZCBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcyBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoYmJfcmVhZF9yZWMsIChpZnAsIGZpbGVuYW1lKSwgRklMRSAqIGlmcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGludCBuYmxvY2tzLCBiOwotICBiZmRfdm1hIGFkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwotICBTeW0gKnN5bTsKLQotICBpZiAoZnJlYWQgKCZuYmxvY2tzLCBzaXplb2YgKG5ibG9ja3MpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLCB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBuYmxvY2tzID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmIG5ibG9ja3MpOwotICBpZiAoZ21vbl9maWxlX3ZlcnNpb24gPT0gMCkKLSAgICB7Ci0gICAgICBmc2tpcF9zdHJpbmcgKGlmcCk7Ci0gICAgfQotCi0gIGZvciAoYiA9IDA7IGIgPCBuYmxvY2tzOyArK2IpCi0gICAgewotICAgICAgaWYgKGdtb25fZmlsZV92ZXJzaW9uID09IDApCi0JewotCSAgaW50IGxpbmVfbnVtOwotCSAgLyoKLQkgICAqIFZlcnNpb24gMCBoYWQgbG90cyBvZiBleHRyYSBzdHVmZiB0aGF0IHdlIGRvbid0Ci0JICAgKiBjYXJlIGFib3V0IGFueW1vcmUuCi0JICAgKi8KLQkgIGlmICgoZnJlYWQgKCZuY2FsbHMsIHNpemVvZiAobmNhbGxzKSwgMSwgaWZwKSAhPSAxKQotCSAgICAgIHx8IChmcmVhZCAoJmFkZHIsIHNpemVvZiAoYWRkciksIDEsIGlmcCkgIT0gMSkKLQkgICAgICB8fCAoZnNraXBfc3RyaW5nIChpZnApLCBGQUxTRSkKLQkgICAgICB8fCAoZnNraXBfc3RyaW5nIChpZnApLCBGQUxTRSkKLQkgICAgICB8fCAoZnJlYWQgKCZsaW5lX251bSwgc2l6ZW9mIChsaW5lX251bSksIDEsIGlmcCkgIT0gMSkpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZnJlYWQgKCZhZGRyLCBzaXplb2YgKGFkZHIpLCAxLCBpZnApICE9IDEKLQkgICAgICB8fCBmcmVhZCAoJm5jYWxscywgc2l6ZW9mIChuY2FsbHMpLCAxLCBpZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyoKLSAgICAgICAqIEJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgYXJlIG1lYW5pbmdmdWwgb25seSBpZiB3ZSdyZQotICAgICAgICogcHJvZmlsaW5nIGF0IHRoZSBsaW5lLWJ5LWxpbmUgbGV2ZWw6Ci0gICAgICAgKi8KLSAgICAgIGlmIChsaW5lX2dyYW51bGFyaXR5KQotCXsKLQotCSAgLyogY29udmVydCBmcm9tIHRhcmdldCB0byBob3N0IGVuZGlhbm5lc3M6ICovCi0KLQkgIGFkZHIgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICYgYWRkcik7Ci0JICBuY2FsbHMgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZuY2FsbHMpOwotCi0JICBzeW0gPSBzeW1fbG9va3VwICgmc3ltdGFiLCBhZGRyKTsKLQotCSAgaWYgKHN5bSkKLQkgICAgewotCSAgICAgIGludCBpOwotCi0JICAgICAgREJHIChCQkRFQlVHLAotCQkgICBwcmludGYgKCJbYmJfcmVhZF9yZWNdIDB4JWx4LT4weCVseCAoJXM6JWQpIGNudD0lbHVcbiIsCi0JCQkgICAodW5zaWduZWQgbG9uZykgYWRkciwgKHVuc2lnbmVkIGxvbmcpIHN5bS0+YWRkciwKLQkJCSAgIHN5bS0+bmFtZSwgc3ltLT5saW5lX251bSwgbmNhbGxzKSk7Ci0KLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUzsgaSsrKQotCQl7Ci0JCSAgaWYgKCEgc3ltLT5iYl9hZGRyW2ldIHx8IHN5bS0+YmJfYWRkcltpXSA9PSBhZGRyKQotCQkgICAgewotCQkgICAgICBzeW0tPmJiX2FkZHJbaV0gPSBhZGRyOwotCQkgICAgICBzeW0tPmJiX2NhbGxzW2ldICs9IG5jYWxsczsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdGF0aWMgYm9vbCB1c2VyX3dhcm5lZCA9IEZBTFNFOwotCi0JICBpZiAoIXVzZXJfd2FybmVkKQotCSAgICB7Ci0JICAgICAgdXNlcl93YXJuZWQgPSBUUlVFOwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiB3YXJuaW5nOiBpZ25vcmluZyBiYXNpYy1ibG9jayBleGVjIGNvdW50cyAodXNlIC1sIG9yIC0tbGluZSlcbiIpLAotCQkgICAgICAgd2hvYW1pKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybjsKLX0KLQotCi0vKgotICogV3JpdGUgYWxsIGJhc2ljLWJsb2NrcyB3aXRoIG5vbi16ZXJvIGNvdW50cyB0byBmaWxlIE9GUC4gIEZJTEVOQU1FCi0gKiBpcyB0aGUgbmFtZSBvZiBPRlAgYW5kIGlzIHByb3ZpZGVkIGZvciBwcm9kdWNpbmcgZXJyb3ItbWVzc2FnZXMKLSAqIG9ubHkuCi0gKi8KLXZvaWQKLURFRlVOIChiYl93cml0ZV9ibG9ja3MsIChvZnAsIGZpbGVuYW1lKSwgRklMRSAqIG9mcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFnID0gR01PTl9UQUdfQkJfQ09VTlQ7Ci0gIGludCBuYmxvY2tzID0gMDsKLSAgYmZkX3ZtYSBhZGRyOwotICB1bnNpZ25lZCBsb25nIG5jYWxsczsKLSAgU3ltICpzeW07Ci0gIGludCBpOwotCi0gIC8qIGNvdW50IGhvdyBtYW55IG5vbi16ZXJvIGJsb2NrcyB3aXRoIGhhdmU6ICovCi0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUyAmJiBzeW0tPmJiX2FkZHJbaV07IGkrKykKLQk7Ci0gICAgICBuYmxvY2tzICs9IGk7Ci0gICAgfQotCi0gIC8qIHdyaXRlIGhlYWRlcjogKi8KLSAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIG5ibG9ja3MsIChiZmRfYnl0ZSAqKSAmIG5ibG9ja3MpOwotICBpZiAoZndyaXRlICgmdGFnLCBzaXplb2YgKHRhZyksIDEsIG9mcCkgIT0gMQotICAgICAgfHwgZndyaXRlICgmbmJsb2Nrcywgc2l6ZW9mIChuYmxvY2tzKSwgMSwgb2ZwKSAhPSAxKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIHdyaXRlIGNvdW50czogKi8KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUyAmJiBzeW0tPmJiX2FkZHJbaV07IGkrKykKLQl7Ci0JICBwdXRfdm1hIChjb3JlX2JmZCwgc3ltLT5iYl9hZGRyW2ldLCAoYmZkX2J5dGUgKikgJiBhZGRyKTsKLQkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBzeW0tPmJiX2NhbGxzW2ldLCAoYmZkX2J5dGUgKikgJiBuY2FsbHMpOwotCi0JICBpZiAoZndyaXRlICgmYWRkciwgc2l6ZW9mIChhZGRyKSwgMSwgb2ZwKSAhPSAxCi0JICAgICAgfHwgZndyaXRlICgmbmNhbGxzLCBzaXplb2YgKG5jYWxscyksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogT3V0cHV0IGJhc2ljLWJsb2NrIHN0YXRpc3RpY3MgaW4gYSBmb3JtYXQgdGhhdCBpcyBlYXNpbHkgcGFyc2VhYmxlLgotICogQ3VycmVudCB0aGUgZm9ybWF0IGlzOgotICoKLSAqICAgICAgPGZpbGVuYW1lPjo8bGluZS1udW1iZXI+OiAoPGZ1bmN0aW9uLW5hbWU+OjxiYi1hZGRyKTogPG5jYWxscz4KLSAqLwotdm9pZAotREVGVU5fVk9JRCAocHJpbnRfZXhlY19jb3VudHMpCi17Ci0gIFN5bSAqKnNvcnRlZF9iYnMsICpzeW07Ci0gIGludCBpLCBqLCBsZW47Ci0KLSAgaWYgKGZpcnN0X291dHB1dCkKLSAgICB7Ci0gICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCJcZlxuIik7Ci0gICAgfQotCi0gIC8qIHNvcnQgYmFzaWMtYmxvY2tzIGFjY29yZGluZyB0byBmdW5jdGlvbiBuYW1lIGFuZCBsaW5lIG51bWJlcjogKi8KLQotICBzb3J0ZWRfYmJzID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoc29ydGVkX2Jic1swXSkpOwotICBsZW4gPSAwOwotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBBY2NlcHQgc3ltYm9sIGlmIGl0J3MgaW4gdGhlIElOQ0xfRVhFQyB0YWJsZQotICAgICAgICogb3IgdGhlcmUgaXMgbm8gSU5DTF9FWEVDIHRhYmxlCi0gICAgICAgKiAgICBhbmQgaXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBFWENMX0VYRUMgdGFibGUuCi0gICAgICAgKi8KLSAgICAgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0VYRUNdLCBzeW0tPmFkZHIpCi0JICB8fCAoc3ltc1tJTkNMX0VYRUNdLmxlbiA9PSAwCi0JICAgICAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfRVhFQ10sIHN5bS0+YWRkcikpKQotCXsKLQkgIHNvcnRlZF9iYnNbbGVuKytdID0gc3ltOwotCX0KLSAgICB9Ci0gIHFzb3J0IChzb3J0ZWRfYmJzLCBsZW4sIHNpemVvZiAoc29ydGVkX2Jic1swXSksIGNtcF9iYik7Ci0KLSAgLyogb3V0cHV0IGJhc2ljLWJsb2NrczogKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgewotICAgICAgaWYgKHN5bS0+bmNhbGxzID4gMCB8fCAhIGlnbm9yZV96ZXJvcykKLQl7Ci0JICAvKiBGSVhNRTogVGhpcyBvbmx5IHdvcmtzIGlmIGJmZF92bWEgaXMgdW5zaWduZWQgbG9uZy4gICovCi0JICBwcmludGYgKF8oIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iKSwKLQkJICBzeW0tPmZpbGUgPyBzeW0tPmZpbGUtPm5hbWUgOiBfKCI8dW5rbm93bj4iKSwgc3ltLT5saW5lX251bSwKLQkJICBzeW0tPm5hbWUsICh1bnNpZ25lZCBsb25nKSBzeW0tPmFkZHIsIHN5bS0+bmNhbGxzKTsKLQl9Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgTkJCUyAmJiBzeW0tPmJiX2FkZHJbal07IGogKyspCi0JewotCSAgaWYgKHN5bS0+YmJfY2FsbHNbal0gPiAwIHx8ICEgaWdub3JlX3plcm9zKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFRoaXMgb25seSB3b3JrcyBpZiBiZmRfdm1hIGlzIHVuc2lnbmVkIGxvbmcuICAqLwotCSAgICAgIHByaW50ZiAoXygiJXM6JWQ6ICglczoweCVseCkgJWx1IGV4ZWN1dGlvbnNcbiIpLAotCQkgICAgICBzeW0tPmZpbGUgPyBzeW0tPmZpbGUtPm5hbWUgOiBfKCI8dW5rbm93bj4iKSwgc3ltLT5saW5lX251bSwKLQkJICAgICAgc3ltLT5uYW1lLCAodW5zaWduZWQgbG9uZykgc3ltLT5iYl9hZGRyW2pdLAotCQkgICAgICBzeW0tPmJiX2NhbGxzW2pdKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGZyZWUgKHNvcnRlZF9iYnMpOwotfQotCi0vKgotICogSGVscGVyIGZvciBiYl9hbm5vdGF0ZWRfc291cmNlOiBmb3JtYXQgYW5ub3RhdGlvbiBjb250YWluaW5nCi0gKiBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zLiAgRGVwZW5kcyBvbiBiZWluZyBjYWxsZWQgb24gZWFjaAotICogbGluZSBvZiBhIGZpbGUgaW4gc2VxdWVudGlhbCBvcmRlci4KLSAqCi0gKiBHbG9iYWwgdmFyaWFibGUgYmJfYW5ub3RhdGVfYWxsX2xpbmVzIGVuYWJsZXMgZXhlY3V0aW9uIGNvdW50Ci0gKiBjb21wcmVzc2lvbiAoY291bnRzIGFyZSBzdXByZXNzZWQgaWYgaWRlbnRpY2FsIHRvIHRoZSBsYXN0IG9uZSkKLSAqIGFuZCBwcmludHMgY291bnRzIG9uIGFsbCBleGVjdXRlZCBsaW5lcy4gIE90aGVyd2lzZSwgcHJpbnQKLSAqIGFsbCBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGV4YWN0bHkgb25jZSBvbiB0aGUgbGluZQotICogdGhhdCBzdGFydHMgdGhlIGJhc2ljLWJsb2NrLgotICovCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoYW5ub3RhdGVfd2l0aF9jb3VudCwgKGJ1Ziwgd2lkdGgsIGxpbmVfbnVtLCBhcmcpLAotICAgICAgIGNoYXIgKmJ1ZiBBTkQgaW50IHdpZHRoIEFORCBpbnQgbGluZV9udW0gQU5EIHZvaWQgKmFyZykKLXsKLSAgU291cmNlX0ZpbGUgKnNmID0gYXJnOwotICBTeW0gKmI7Ci0gIGludCBpOwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2NvdW50OwotICB1bnNpZ25lZCBsb25nIGxhc3RfcHJpbnQgPSAodW5zaWduZWQgbG9uZykgLTE7Ci0KLSAgYiA9IE5VTEw7Ci0gIGlmIChsaW5lX251bSA8PSBzZi0+bnVtX2xpbmVzKQotICAgIHsKLSAgICAgIGIgPSBzZi0+bGluZVtsaW5lX251bSAtIDFdOwotICAgIH0KLSAgaWYgKCFiKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQotCWJ1ZltpXSA9ICcgJzsKLSAgICAgIGJ1Zlt3aWR0aF0gPSAnXDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgdG1wYnVmW05CQlMgKiAzMF07Ci0gICAgICBjaGFyICpwOwotICAgICAgdW5zaWduZWQgbG9uZyBuY2FsbHM7Ci0gICAgICBpbnQgbmNhbGxzX3NldDsKLSAgICAgIGludCBsZW47Ci0KLSAgICAgICsrbnVtX2V4ZWN1dGFibGVfbGluZXM7Ci0KLSAgICAgIHAgPSB0bXBidWY7Ci0gICAgICAqcCA9ICdcMCc7Ci0KLSAgICAgIG5jYWxscyA9IDA7Ci0gICAgICBuY2FsbHNfc2V0ID0gMDsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LCBsYWJlbCB0aGUgbGluZSBubyBtYXR0ZXIgd2hhdC4KLSAgICAgICAqIE90aGVyd2lzZSwgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIGZ1bmN0aW9uLCBzbyBjaGVjayB0byBzZWUKLSAgICAgICAqIGlmIHRoZSBmaXJzdCBiYXNpYy1ibG9jayBhZGRyZXNzIGlzIGxhcmdlciB0aGFuIHRoZSBzdGFydGluZwotICAgICAgICogYWRkcmVzcyBvZiB0aGUgbGluZS4gIElmIHNvLCB0aGVuIHRoaXMgbGluZSBiZWdpbnMgd2l0aCBhCi0gICAgICAgKiBhIHBvcnRpb24gb2YgdGhlIHByZXZpb3VzIGJhc2ljLWJsb2NrLCBzbyBwcmludCB0aGF0IHByaW9yCi0gICAgICAgKiBleGVjdXRpb24gY291bnQgKGlmIGJiX2Fubm90YXRlX2FsbF9saW5lcyBpcyBzZXQpLgotICAgICAgICovCi0KLSAgICAgIGlmIChiLT5pc19mdW5jKQotCXsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBiLT5uY2FsbHMpOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgbGFzdF9jb3VudCA9IGItPm5jYWxsczsKLQkgIGxhc3RfcHJpbnQgPSBsYXN0X2NvdW50OwotCSAgbmNhbGxzID0gYi0+bmNhbGxzOwotCSAgbmNhbGxzX3NldCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzCi0JICAgICAgICYmIGItPmJiX2FkZHJbMF0gJiYgYi0+YmJfYWRkclswXSA+IGItPmFkZHIpCi0JewotCSAgc3ByaW50ZiAocCwgIiVsdSIsIGxhc3RfY291bnQpOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgbGFzdF9wcmludCA9IGxhc3RfY291bnQ7Ci0JICBuY2FsbHMgPSBsYXN0X2NvdW50OwotCSAgbmNhbGxzX3NldCA9IDE7Ci0JfQotCi0gICAgICAvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoaXMgbGluZSdzIGJhc2ljLWJsb2Nrcy4gIEZvciBlYWNoIG9uZSwKLSAgICAgICAqIHVwZGF0ZSBsYXN0X2NvdW50LCB0aGVuIGNvbXByZXNzIHNlcXVlbnRpYWwgaWRlbnRpY2FsIGNvdW50cwotICAgICAgICogKGlmIGJiX2Fubm90YXRlX2FsbF9saW5lcykgYW5kIHByaW50IHRoZSBleGVjdXRpb24gY291bnQuCi0gICAgICAgKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlMgJiYgYi0+YmJfYWRkcltpXTsgaSsrKQotCXsKLQkgIGxhc3RfY291bnQgPSBiLT5iYl9jYWxsc1tpXTsKLQkgIGlmICghIG5jYWxsc19zZXQpCi0JICAgIHsKLQkgICAgICBuY2FsbHMgPSAwOwotCSAgICAgIG5jYWxsc19zZXQgPSAxOwotCSAgICB9Ci0JICBuY2FsbHMgKz0gbGFzdF9jb3VudDsKLQotCSAgaWYgKGJiX2Fubm90YXRlX2FsbF9saW5lcyAmJiBsYXN0X2NvdW50ID09IGxhc3RfcHJpbnQpCi0JICAgIHsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAocCA+IHRtcGJ1ZikKLQkgICAgKnArKyA9ICcsJzsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBsYXN0X2NvdW50KTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQotCSAgbGFzdF9wcmludCA9IGxhc3RfY291bnQ7Ci0JfQotCi0gICAgICAvKiBXZSdyZSBkb25lLiAgSWYgbm90aGluZyBoYXMgYmVlbiBwcmludGVkIG9uIHRoaXMgbGluZSwKLSAgICAgICAqIHByaW50IHRoZSBsYXN0IGV4ZWN1dGlvbiBjb3VudCAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzKSwKLSAgICAgICAqIHdoaWNoIGNvdWxkIGJlIGZyb20gZWl0aGVyIGEgcHJldmlvdXMgbGluZSAoaWYgdGhlcmUgd2VyZQotICAgICAgICogbm8gQkJzIG9uIHRoaXMgbGluZSksIG9yIGZyb20gdGhpcyBsaW5lIChpZiBhbGwgb3VyIEJCCi0gICAgICAgKiBjb3VudHMgd2VyZSBjb21wcmVzc2VkIG91dCBiZWNhdXNlIHRoZXkgd2VyZSBpZGVudGljYWwpLgotICAgICAgICovCi0KLSAgICAgIGlmIChiYl9hbm5vdGF0ZV9hbGxfbGluZXMgJiYgcCA9PSB0bXBidWYpCi0JewotCSAgc3ByaW50ZiAocCwgIiVsdSIsIGxhc3RfY291bnQpOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgbmNhbGxzID0gbGFzdF9jb3VudDsKLQkgIG5jYWxsc19zZXQgPSAxOwotCX0KLQotICAgICAgaWYgKCEgbmNhbGxzX3NldCkKLQl7Ci0JICBpbnQgYzsKLQotCSAgZm9yIChjID0gMDsgYyA8IHdpZHRoOyBjKyspCi0JICAgIGJ1ZltjXSA9ICcgJzsKLQkgIGJ1Zlt3aWR0aF0gPSAnXDAnOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgKytudW1fbGluZXNfZXhlY3V0ZWQ7Ci0KLSAgICAgIGlmIChuY2FsbHMgPCBiYl9taW5fY2FsbHMpCi0JewotCSAgc3RyY3B5ICh0bXBidWYsICIjIyMjIyIpOwotCSAgcCA9IHRtcGJ1ZiArIDU7Ci0JfQotCi0gICAgICBzdHJjcHkgKHAsICIgLT4gIik7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIGxlbiA9IHAgLSB0bXBidWY7Ci0gICAgICBpZiAobGVuID49IHdpZHRoKQotCXsKLQkgIHN0cm5jcHkgKGJ1ZiwgdG1wYnVmLCB3aWR0aCk7Ci0JICBidWZbd2lkdGhdID0gJ1wwJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGM7Ci0KLQkgIHN0cmNweSAoYnVmICsgd2lkdGggLSBsZW4sIHRtcGJ1Zik7Ci0JICBmb3IgKGMgPSAwOyBjIDwgd2lkdGggLSBsZW47ICsrYykKLQkgICAgYnVmW2NdID0gJyAnOwotCX0KLSAgICB9Ci19Ci0KLS8qCi0gKiBBbm5vdGF0ZSB0aGUgZmlsZXMgbmFtZWQgaW4gU09VUkNFX0ZJTEVTIHdpdGggYmFzaWMtYmxvY2sgc3RhdGlzdGljcwotICogKGV4ZWN1dGlvbiBjb3VudHMpLiAgQWZ0ZXIgZWFjaCBzb3VyY2UgZmlsZXMsIGEgZmV3IHN0YXRpc3RpY3MKLSAqIHJlZ2FyZGluZyB0aGF0IHNvdXJjZSBmaWxlIGFyZSBwcmludGVkLgotICovCi12b2lkCi1ERUZVTl9WT0lEIChwcmludF9hbm5vdGF0ZWRfc291cmNlKQotewotICBTeW0gKnN5bSwgKmxpbmVfc3RhdHMsICpuZXdfbGluZTsKLSAgU291cmNlX0ZpbGUgKnNmOwotICBpbnQgaSwgdGFibGVfbGVuOwotICBGSUxFICpvZnA7Ci0KLSAgLyoKLSAgICogRmluZCBtYXhpbXVtIGxpbmUgbnVtYmVyIGZvciBlYWNoIHNvdXJjZSBmaWxlIHRoYXQgdXNlciBpcwotICAgKiBpbnRlcmVzdGVkIGluOgotICAgKi8KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogQWNjZXB0IHN5bWJvbCBpZiBpdCdzIGZpbGUgaXMga25vd24sIGl0cyBsaW5lIG51bWJlciBpcwotICAgICAgICogYmlnZ2VyIHRoYW4gYW55dGhpbmcgd2UgaGF2ZSBzZWVuIGZvciB0aGF0IGZpbGUgc28gZmFyIGFuZAotICAgICAgICogaWYgaXQncyBpbiB0aGUgSU5DTF9BTk5PIHRhYmxlIG9yIHRoZXJlIGlzIG5vIElOQ0xfQU5OTwotICAgICAgICogdGFibGUgYW5kIGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgRVhDTF9BTk5PIHRhYmxlLgotICAgICAgICovCi0gICAgICBpZiAoc3ltLT5maWxlICYmIHN5bS0+bGluZV9udW0gPiBzeW0tPmZpbGUtPm51bV9saW5lcwotCSAgJiYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfQU5OT10sIHN5bS0+YWRkcikKLQkgICAgICB8fCAoc3ltc1tJTkNMX0FOTk9dLmxlbiA9PSAwCi0JCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfQU5OT10sIHN5bS0+YWRkcikpKSkKLQl7Ci0JICBzeW0tPmZpbGUtPm51bV9saW5lcyA9IHN5bS0+bGluZV9udW07Ci0JfQotICAgIH0KLQotICAvKiBhbGxvY2F0ZSBsaW5lIGRlc2NyaXB0b3JzOiAqLwotCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNmLT5udW1fbGluZXMgPiAwKQotCXsKLQkgIHNmLT5saW5lID0gKHZvaWQgKikgeG1hbGxvYyAoc2YtPm51bV9saW5lcyAqIHNpemVvZiAoc2YtPmxpbmVbMF0pKTsKLQkgIG1lbXNldCAoc2YtPmxpbmUsIDAsIHNmLT5udW1fbGluZXMgKiBzaXplb2YgKHNmLT5saW5lWzBdKSk7Ci0JfQotICAgIH0KLQotICAvKiBjb3VudCBleGVjdXRpb25zIHBlciBsaW5lOiAqLwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgaWYgKHN5bS0+ZmlsZSAmJiBzeW0tPmZpbGUtPm51bV9saW5lcwotCSAgJiYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfQU5OT10sIHN5bS0+YWRkcikKLQkgICAgICB8fCAoc3ltc1tJTkNMX0FOTk9dLmxlbiA9PSAwCi0JCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfQU5OT10sIHN5bS0+YWRkcikpKSkKLQl7Ci0JICBzeW0tPmZpbGUtPm5jYWxscyArPSBzeW0tPm5jYWxsczsKLQkgIGxpbmVfc3RhdHMgPSBzeW0tPmZpbGUtPmxpbmVbc3ltLT5saW5lX251bSAtIDFdOwotCSAgaWYgKCFsaW5lX3N0YXRzKQotCSAgICB7Ci0JICAgICAgLyogY29tbW9uIGNhc2UgaGFzIGF0IG1vc3Qgb25lIGJhc2ljLWJsb2NrIHBlciBzb3VyY2UgbGluZTogKi8KLQkgICAgICBzeW0tPmZpbGUtPmxpbmVbc3ltLT5saW5lX251bSAtIDFdID0gc3ltOwotCSAgICB9Ci0JICBlbHNlIGlmICghbGluZV9zdGF0cy0+YWRkcikKLQkgICAgewotCSAgICAgIC8qIHN5bSBpcyB0aGUgM3JkIC4uIG50aCBiYXNpYyBibG9jayBmb3IgdGhpcyBsaW5lOiAqLwotCSAgICAgIGxpbmVfc3RhdHMtPm5jYWxscyArPSBzeW0tPm5jYWxsczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogc3ltIGlzIHRoZSBzZWNvbmQgYmFzaWMgYmxvY2sgZm9yIHRoaXMgbGluZSAqLwotCSAgICAgIG5ld19saW5lID0gKFN5bSAqKSB4bWFsbG9jIChzaXplb2YgKCpuZXdfbGluZSkpOwotCSAgICAgICpuZXdfbGluZSA9ICpsaW5lX3N0YXRzOwotCSAgICAgIG5ld19saW5lLT5hZGRyID0gMDsKLQkgICAgICBuZXdfbGluZS0+bmNhbGxzICs9IHN5bS0+bmNhbGxzOwotCSAgICAgIHN5bS0+ZmlsZS0+bGluZVtzeW0tPmxpbmVfbnVtIC0gMV0gPSBuZXdfbGluZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogcGxvZCBvdmVyIHNvdXJjZSBmaWxlcywgYW5ub3RhdGluZyB0aGVtOiAqLwotCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgaWYgKCFzZi0+bnVtX2xpbmVzIHx8IChpZ25vcmVfemVyb3MgJiYgc2YtPm5jYWxscyA9PSAwKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzID0gbnVtX2xpbmVzX2V4ZWN1dGVkID0gMDsKLSAgICAgIG9mcCA9IGFubm90YXRlX3NvdXJjZSAoc2YsIDE2LCBhbm5vdGF0ZV93aXRoX2NvdW50LCBzZik7Ci0gICAgICBpZiAoIW9mcCkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChiYl90YWJsZV9sZW5ndGggPiAwKQotCXsKLQkgIGZwcmludGYgKG9mcCwgXygiXG5cblRvcCAlZCBMaW5lczpcblxuICAgICBMaW5lICAgICAgQ291bnRcblxuIiksCi0JCSAgIGJiX3RhYmxlX2xlbmd0aCk7Ci0KLQkgIC8qIGFidXNlIGxpbmUgYXJyYXlzLS0taXQncyBub3QgbmVlZGVkIGFueW1vcmU6ICovCi0JICBxc29ydCAoc2YtPmxpbmUsIHNmLT5udW1fbGluZXMsIHNpemVvZiAoc2YtPmxpbmVbMF0pLCBjbXBfbmNhbGxzKTsKLQkgIHRhYmxlX2xlbiA9IGJiX3RhYmxlX2xlbmd0aDsKLQkgIGlmICh0YWJsZV9sZW4gPiBzZi0+bnVtX2xpbmVzKQotCSAgICB7Ci0JICAgICAgdGFibGVfbGVuID0gc2YtPm51bV9saW5lczsKLQkgICAgfQotCSAgZm9yIChpID0gMDsgaSA8IHRhYmxlX2xlbjsgKytpKQotCSAgICB7Ci0JICAgICAgc3ltID0gc2YtPmxpbmVbaV07Ci0JICAgICAgaWYgKCFzeW0gfHwgc3ltLT5uY2FsbHMgPT0gMCkKLQkJewotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZnByaW50ZiAob2ZwLCAiJTlkICUxMGx1XG4iLCBzeW0tPmxpbmVfbnVtLCBzeW0tPm5jYWxscyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZyZWUgKHNmLT5saW5lKTsKLSAgICAgIHNmLT5saW5lID0gMDsKLQotICAgICAgZnByaW50ZiAob2ZwLCBfKCJcbkV4ZWN1dGlvbiBTdW1tYXJ5OlxuXG4iKSk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5bGQgICBFeGVjdXRhYmxlIGxpbmVzIGluIHRoaXMgZmlsZVxuIiksCi0JICAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzKTsKLSAgICAgIGZwcmludGYgKG9mcCwgXygiJTlsZCAgIExpbmVzIGV4ZWN1dGVkXG4iKSwgbnVtX2xpbmVzX2V4ZWN1dGVkKTsKLSAgICAgIGZwcmludGYgKG9mcCwgXygiJTkuMmYgICBQZXJjZW50IG9mIHRoZSBmaWxlIGV4ZWN1dGVkXG4iKSwKLQkgICAgICAgbnVtX2V4ZWN1dGFibGVfbGluZXMKLQkgICAgICAgPyAxMDAuMCAqIG51bV9saW5lc19leGVjdXRlZCAvIChkb3VibGUpIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgIDogMTAwLjApOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCJcbiU5bHUgICBUb3RhbCBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zXG4iKSwKLQkgICAgICAgc2YtPm5jYWxscyk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5LjJmICAgQXZlcmFnZSBleGVjdXRpb25zIHBlciBsaW5lXG4iKSwKLQkgICAgICAgbnVtX2V4ZWN1dGFibGVfbGluZXMKLQkgICAgICAgPyAoZG91YmxlKSBzZi0+bmNhbGxzIC8gKGRvdWJsZSkgbnVtX2V4ZWN1dGFibGVfbGluZXMKLQkgICAgICAgOiAwLjApOwotICAgICAgaWYgKG9mcCAhPSBzdGRvdXQpCi0JewotCSAgZmNsb3NlIChvZnApOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9iYXNpY19ibG9ja3MuaCBiL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlY2ExLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2lmbmRlZiBiYXNpY19ibG9ja3NfaAotI2RlZmluZSBiYXNpY19ibG9ja3NfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0vKgotICogT3B0aW9uczoKLSAqLwotZXh0ZXJuIGJvb2wgYmJfYW5ub3RhdGVfYWxsX2xpbmVzOwkvKiBmb3JjZSBhbm5vdGF0aW9uIG9mIGFsbCBsaW5lcz8gKi8KLWV4dGVybiBpbnQgYmJfdGFibGVfbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIG1vc3QtdXNlZCBiYiB0YWJsZSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmJfbWluX2NhbGxzOwkvKiBtaW5pbXVtIGV4ZWN1dGlvbiBjb3VudCAqLwotCi1leHRlcm4gdm9pZCBiYl9yZWFkX3JlYyBQQVJBTVMgKChGSUxFICogaWZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgYmJfd3JpdGVfYmxvY2tzIFBBUkFNUyAoKEZJTEUgKiBvZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBiYl9jcmVhdGVfc3ltcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIHByaW50X2Fubm90YXRlZF9zb3VyY2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcHJpbnRfZXhlY19jb3VudHMgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogYmFzaWNfYmxvY2tzX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2JiX2V4aXRfZnVuYy5jIGIvZ3Byb2YvYmJfZXhpdF9mdW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMzMyMTUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYmJfZXhpdF9mdW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk0IERhdmlkIE1vc2Jlcmdlci1UYW5nLgotICoKLSAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogX19iYl9leGl0X2Z1bmMoKSBkdW1wcyBhbGwgdGhlIGJhc2ljLWJsb2NrIHN0YXRpc3RpY3MgbGlua2VkIGludG8KLSAqIHRoZSBiYl9oZWFkIGNoYWluIHRvIC5kIGZpbGVzLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLQotLyogc3RydWN0dXJlIGVtaXR0ZWQgYnkgLWEgKi8KLXN0cnVjdCBiYiB7Ci0gICAgbG9uZwkJemVyb193b3JkOwotICAgIGNvbnN0IGNoYXIJCSpmaWxlbmFtZTsKLSAgICBsb25nCQkqY291bnRzOwotICAgIGxvbmcJCW5jb3VudHM7Ci0gICAgc3RydWN0IGJiCQkqbmV4dDsKLSAgICBjb25zdCB1bnNpZ25lZCBsb25nCSphZGRyZXNzZXM7Ci19OwotCi1zdHJ1Y3QgYmIgKl9fYmJfaGVhZCA9IChzdHJ1Y3QgYmIgKikwOwotCi0KLXZvaWQKLV9fYmJfZXhpdF9mdW5jICh2b2lkKQotewotICAgIGNvbnN0IGludCB2ZXJzaW9uID0gR01PTl9WRVJTSU9OOwotICAgIHN0cnVjdCBnbW9uX2hkciBnaGRyOwotICAgIHN0cnVjdCBiYiAqcHRyOwotICAgIEZJTEUgKmZwOwotICAgIC8qCi0gICAgICogR0VOX0dNT05fQ05UX0ZJTEUgc2hvdWxkIGJlIGRlZmluZWQgb24gc3lzdGVtcyB3aXRoIG1jbGVhbnVwKCkKLSAgICAgKiBmdW5jdGlvbnMgdGhhdCBkbyBub3Qgd3JpdGUgYmFzaWMtYmxvY2sgdG8gZ21vbi5vdXQuICBJbiBzdWNoCi0gICAgICogY2FzZXMgcHJvZmlsaW5nIHdpdGggIi1wZyAtYSIgd291bGQgcmVzdWx0IGluIGEgZ21vbi5vdXQgZmlsZQotICAgICAqIHdpdGhvdXQgYmFzaWMtYmxvY2sgaW5mbyAoYmVjYXVzZSB0aGUgZmlsZSB3cml0dGVuIGhlcmUgd291bGQKLSAgICAgKiBiZSBvdmVyd3JpdHRlbi4gIFRodXMsIGEgc2VwYXJhdGUgZmlsZSBpcyBnZW5lcmF0ZWQgaW5zdGVhZC4KLSAgICAgKiBUaGUgdHdvIGZpbGVzIGNhbiBlYXNpbHkgYmUgY29tYmluZWQgYnkgc3BlY2lmeWluZyB0aGVtCi0gICAgICogb24gZ3Byb2YncyBjb21tYW5kIGxpbmUgKGFuZCBwb3NzaWJseSBnZW5lcmF0aW5nIGEgZ21vbi5zdW0KLSAgICAgKiBmaWxlIHdpdGggImdwcm9mIC1zIikuCi0gICAgICovCi0jaWZuZGVmIEdFTl9HTU9OX0NOVF9GSUxFCi0jICAgZGVmaW5lIE9VVF9OQU1FCSJnbW9uLm91dCIKLSNlbHNlCi0jICAgZGVmaW5lIE9VVF9OQU1FCSJnbW9uLmNudCIKLSNlbmRpZgotICAgIGZwID0gZm9wZW4oT1VUX05BTUUsICJ3YiIpOwotICAgIGlmICghZnApIHsKLQlwZXJyb3IoT1VUX05BTUUpOwotCXJldHVybjsKLSAgICB9IC8qIGlmICovCi0gICAgbWVtY3B5KCZnaGRyLmNvb2tpZVswXSwgR01PTl9NQUdJQywgNCk7Ci0gICAgbWVtY3B5KCZnaGRyLnZlcnNpb24sICZ2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpOwotICAgIGZ3cml0ZSgmZ2hkciwgc2l6ZW9mKGdoZHIpLCAxLCBmcCk7Ci0KLSAgICBmb3IgKHB0ciA9IF9fYmJfaGVhZDsgcHRyICE9IDA7IHB0ciA9IHB0ci0+bmV4dCkgewotCXVfaW50IG5jb3VudHMgPSBwdHItPm5jb3VudHM7Ci0JdV9jaGFyIHRhZzsKLQl1X2ludCBpOwotCi0JdGFnID0gR01PTl9UQUdfQkJfQ09VTlQ7Ci0JZndyaXRlKCZ0YWcsIHNpemVvZih0YWcpLCAxLCBmcCk7Ci0JZndyaXRlKCZuY291bnRzLCBzaXplb2YobmNvdW50cyksIDEsIGZwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuY291bnRzOyArK2kpIHsKLQkgICAgZndyaXRlKCZwdHItPmFkZHJlc3Nlc1tpXSwgc2l6ZW9mKHB0ci0+YWRkcmVzc2VzWzBdKSwgMSwgZnApOwotCSAgICBmd3JpdGUoJnB0ci0+Y291bnRzW2ldLCBzaXplb2YocHRyLT5jb3VudHNbMF0pLCAxLCBmcCk7Ci0JfSAvKiBmb3IgKi8KLSAgICB9IC8qIGZvciAqLwotICAgIGZjbG9zZSAoZnApOwotfSAvKiBfX2JiX2V4aXRfZnVuYyAqLwotCi0JCQkvKioqIGVuZCBvZiBfX2JiX2V4aXRfZnVuYy5jICoqKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2JiY29udi5wbCBiL2dwcm9mL2JiY29udi5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzMxMmY1MS4uMDAwMDAwMAotLS0gYS9ncHJvZi9iYmNvbnYucGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jISAvdXNyL2Jpbi9wZXJsCi0KLSMgVGhpcyBzY3JpcHQgY29udmVydHMgYSAiYmIub3V0IiBmaWxlIGludG8gYSBmb3JtYXQKLSMgc3VpdGFibGUgZm9yIHByb2Nlc3NpbmcgYnkgZ3Byb2YKLQotIyBXcml0ZSBhIG5ldy1zdHlsZSBnbW9uIGhlYWRlcgotCi1wcmludCBwYWNrKCJBNEl4MTIiLCAiZ21vbiIsIDEpOwotCi0KLSMgVGhlIGlucHV0IGZpbGUgZm9ybWF0IGNvbnRhaW5zIGhlYWRlciBsaW5lcyBhbmQgZGF0YSBsaW5lcy4KLSMgSGVhZGVyIGxpbmVzIGNvbnRhaW4gYSBjb3VudCBvZiBob3cgbWFueSBkYXRhIGxpbmVzIGZvbGxvdyBiZWZvcmUKLSMgdGhlIG5leHQgaGVhZGVyIGxpbmUuICAkYmxvY2tjb3VudCBpcyBzZXQgdG8gdGhlIGNvdW50IHRoYXQKLSMgYXBwZWFycyBpbiBlYWNoIGhlYWRlciBsaW5lLCB0aGVuIGRlY3JlbWVudGVkIGF0IGVhY2ggZGF0YSBsaW5lLgotIyAkYmxvY2tjb3VudCBzaG91bGQgYWx3YXlzIGJlIHplcm8gYXQgdGhlIHN0YXJ0IG9mIGEgaGVhZGVyIGxpbmUsCi0jIGFuZCBzaG91bGQgbmV2ZXIgYmUgemVybyBhdCB0aGUgc3RhcnQgb2YgYSBkYXRhIGxpbmUuCi0KLSRibG9ja2NvdW50PTA7Ci0KLXdoaWxlICg8PikgewotICAgIGlmICgvXkZpbGUgLiosIChbMC05XSspIGJhc2ljIGJsb2Nrcy8pIHsKLQlwcmludCBTVERFUlIgIk1pc2NvdW50OiBsaW5lICQuXG4iIGlmICgkYmxvY2tjb3VudCAhPSAwKTsKLQkkYmxvY2tjb3VudCA9ICQxOwotCi0JcHJpbnQgcGFjaygiY0kiLCAyLCAkYmxvY2tjb3VudCk7Ci0gICAgfQotICAgIGlmICgvQmxvY2suKmV4ZWN1dGVkKFsgMC05XSspIHRpbWUuKiBhZGRyZXNzPSAweChbMC05YS1mQS1GXSopLykgewotCXByaW50IFNUREVSUiAiTWlzY291bnQ6IGxpbmUgJC5cbiIgaWYgKCRibG9ja2NvdW50ID09IDApOwotCSRibG9ja2NvdW50LS0gaWYgKCRibG9ja2NvdW50ID4gMCk7Ci0KLQkkY291bnQgPSAkMTsKLQkkYWRkciA9IGhleCAkMjsKLQotCXByaW50IHBhY2soIklJIiwkYWRkciwkY291bnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2JzZF9jYWxsZ19ibC5tIGIvZ3Byb2YvYnNkX2NhbGxnX2JsLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzM2M5NmMuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYnNkX2NhbGxnX2JsLm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotCi0KLQotY2FsbCBncmFwaCBwcm9maWxlOgotICAgICAgICAgIFRoZSBzdW0gb2Ygc2VsZiBhbmQgZGVzY2VuZGVudHMgaXMgdGhlIG1ham9yIHNvcnQKLSAgICAgICAgICBmb3IgdGhpcyBsaXN0aW5nLgotCi0gICAgICAgICAgZnVuY3Rpb24gZW50cmllczoKLQotaW5kZXggICAgIHRoZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGNhbGwgZ3JhcGgKLSAgICAgICAgICBsaXN0aW5nLCBhcyBhbiBhaWQgdG8gbG9jYXRpbmcgaXQgKHNlZSBiZWxvdykuCi0KLSV0aW1lICAgICB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgdGltZSBvZiB0aGUgcHJvZ3JhbQotICAgICAgICAgIGFjY291bnRlZCBmb3IgYnkgdGhpcyBmdW5jdGlvbiBhbmQgaXRzCi0gICAgICAgICAgZGVzY2VuZGVudHMuCi0KLXNlbGYgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc3BlbnQgaW4gdGhpcyBmdW5jdGlvbgotICAgICAgICAgIGl0c2VsZi4KLQotZGVzY2VuZGVudHMKLSAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc3BlbnQgaW4gdGhlIGRlc2NlbmRlbnRzIG9mCi0gICAgICAgICAgdGhpcyBmdW5jdGlvbiBvbiBiZWhhbGYgb2YgdGhpcyBmdW5jdGlvbi4KLQotY2FsbGVkICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgKG90aGVyCi0gICAgICAgICAgdGhhbiByZWN1cnNpdmUgY2FsbHMpLgotCi1zZWxmICAgICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIGNhbGxzIGl0c2VsZgotICAgICAgICAgIHJlY3Vyc2l2ZWx5LgotCi1uYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLCB3aXRoIGFuIGluZGljYXRpb24gb2YKLSAgICAgICAgICBpdHMgbWVtYmVyc2hpcCBpbiBhIGN5Y2xlLCBpZiBhbnkuCi0KLWluZGV4ICAgICB0aGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBjYWxsIGdyYXBoCi0gICAgICAgICAgbGlzdGluZywgYXMgYW4gYWlkIHRvIGxvY2F0aW5nIGl0LgotCi0KLQotICAgICAgICAgIHBhcmVudCBsaXN0aW5nczoKLQotc2VsZiogICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGZ1bmN0aW9uJ3Mgc2VsZiB0aW1lCi0gICAgICAgICAgd2hpY2ggaXMgZHVlIHRvIGNhbGxzIGZyb20gdGhpcyBwYXJlbnQuCi0KLWRlc2NlbmRlbnRzKgotICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGZ1bmN0aW9uJ3MKLSAgICAgICAgICBkZXNjZW5kZW50IHRpbWUgd2hpY2ggaXMgZHVlIHRvIGNhbGxzIGZyb20gdGhpcwotICAgICAgICAgIHBhcmVudC4KLQotY2FsbGVkKiogIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkKLSAgICAgICAgICB0aGlzIHBhcmVudC4gIFRoaXMgaXMgdGhlIG51bWVyYXRvciBvZiB0aGUKLSAgICAgICAgICBmcmFjdGlvbiB3aGljaCBkaXZpZGVzIHVwIHRoZSBmdW5jdGlvbidzIHRpbWUgdG8KLSAgICAgICAgICBpdHMgcGFyZW50cy4KLQotdG90YWwqICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIGJ5Ci0gICAgICAgICAgYWxsIG9mIGl0cyBwYXJlbnRzLiAgVGhpcyBpcyB0aGUgZGVub21pbmF0b3Igb2YKLSAgICAgICAgICB0aGUgcHJvcGFnYXRpb24gZnJhY3Rpb24uCi0KLXBhcmVudHMgICB0aGUgbmFtZSBvZiB0aGlzIHBhcmVudCwgd2l0aCBhbiBpbmRpY2F0aW9uIG9mIHRoZQotICAgICAgICAgIHBhcmVudCdzIG1lbWJlcnNoaXAgaW4gYSBjeWNsZSwgaWYgYW55LgotCi1pbmRleCAgICAgdGhlIGluZGV4IG9mIHRoaXMgcGFyZW50IGluIHRoZSBjYWxsIGdyYXBoCi0gICAgICAgICAgbGlzdGluZywgYXMgYW4gYWlkIGluIGxvY2F0aW5nIGl0LgotCi0KLQotICAgICAgICAgIGNoaWxkcmVuIGxpc3RpbmdzOgotCi1zZWxmKiAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoaXMgY2hpbGQncyBzZWxmIHRpbWUKLSAgICAgICAgICB3aGljaCBpcyBkdWUgdG8gYmVpbmcgY2FsbGVkIGJ5IHRoaXMgZnVuY3Rpb24uCi0KLWRlc2NlbmRlbnQqCi0gICAgICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoaXMgY2hpbGQncyBkZXNjZW5kZW50J3MKLSAgICAgICAgICB0aW1lIHdoaWNoIGlzIGR1ZSB0byBiZWluZyBjYWxsZWQgYnkgdGhpcwotICAgICAgICAgIGZ1bmN0aW9uLgotCi1jYWxsZWQqKiAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGNoaWxkIGlzIGNhbGxlZCBieSB0aGlzCi0gICAgICAgICAgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSBudW1lcmF0b3Igb2YgdGhlCi0gICAgICAgICAgcHJvcGFnYXRpb24gZnJhY3Rpb24gZm9yIHRoaXMgY2hpbGQuCi0KLXRvdGFsKiAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgY2hpbGQgaXMgY2FsbGVkIGJ5IGFsbAotICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlbm9taW5hdG9yIG9mIHRoZQotICAgICAgICAgIHByb3BhZ2F0aW9uIGZyYWN0aW9uLgotCi1jaGlsZHJlbiAgdGhlIG5hbWUgb2YgdGhpcyBjaGlsZCwgYW5kIGFuIGluZGljYXRpb24gb2YgaXRzCi0gICAgICAgICAgbWVtYmVyc2hpcCBpbiBhIGN5Y2xlLCBpZiBhbnkuCi0KLWluZGV4ICAgICB0aGUgaW5kZXggb2YgdGhpcyBjaGlsZCBpbiB0aGUgY2FsbCBncmFwaCBsaXN0aW5nLAotICAgICAgICAgIGFzIGFuIGFpZCB0byBsb2NhdGluZyBpdC4KLQotCi0KLSAgICAgICAgICAqIHRoZXNlIGZpZWxkcyBhcmUgb21pdHRlZCBmb3IgcGFyZW50cyAob3IKLSAgICAgICAgICBjaGlsZHJlbikgaW4gdGhlIHNhbWUgY3ljbGUgYXMgdGhlIGZ1bmN0aW9uLiAgSWYKLSAgICAgICAgICB0aGUgZnVuY3Rpb24gKG9yIGNoaWxkKSBpcyBhIG1lbWJlciBvZiBhIGN5Y2xlLAotICAgICAgICAgIHRoZSBwcm9wYWdhdGVkIHRpbWVzIGFuZCBwcm9wYWdhdGlvbiBkZW5vbWluYXRvcgotICAgICAgICAgIHJlcHJlc2VudCB0aGUgc2VsZiB0aW1lIGFuZCBkZXNjZW5kZW50IHRpbWUgb2YgdGhlCi0gICAgICAgICAgY3ljbGUgYXMgYSB3aG9sZS4KLQotICAgICAgICAgICoqIHN0YXRpYy1vbmx5IHBhcmVudHMgYW5kIGNoaWxkcmVuIGFyZSBpbmRpY2F0ZWQKLSAgICAgICAgICBieSBhIGNhbGwgY291bnQgb2YgMC4KLQotCi0KLSAgICAgICAgICBjeWNsZSBsaXN0aW5nczoKLSAgICAgICAgICB0aGUgY3ljbGUgYXMgYSB3aG9sZSBpcyBsaXN0ZWQgd2l0aCB0aGUgc2FtZQotICAgICAgICAgIGZpZWxkcyBhcyBhIGZ1bmN0aW9uIGVudHJ5LiAgQmVsb3cgaXQgYXJlIGxpc3RlZAotICAgICAgICAgIHRoZSBtZW1iZXJzIG9mIHRoZSBjeWNsZSwgYW5kIHRoZWlyIGNvbnRyaWJ1dGlvbnMKLSAgICAgICAgICB0byB0aGUgdGltZSBhbmQgY2FsbCBjb3VudHMgb2YgdGhlIGN5Y2xlLgotDApkaWZmIC0tZ2l0IGEvZ3Byb2YvY2FsbF9ncmFwaC5jIGIvZ3Byb2YvY2FsbF9ncmFwaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWVlMjUxLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NhbGxfZ3JhcGguYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNhbGxfZ3JhcGguaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotZXh0ZXJuIHZvaWQKLURFRlVOIChjZ190YWxseSwgKGZyb21fcGMsIHNlbGZfcGMsIGNvdW50KSwKLSAgICAgICBiZmRfdm1hIGZyb21fcGMgQU5EIGJmZF92bWEgc2VsZl9wYyBBTkQgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLSAgU3ltICpwYXJlbnQ7Ci0gIFN5bSAqY2hpbGQ7Ci0KLSAgcGFyZW50ID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZnJvbV9wYyk7Ci0gIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgc2VsZl9wYyk7Ci0KLSAgaWYgKGNoaWxkID09IE5VTEwgfHwgcGFyZW50ID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIElmIHdlJ3JlIGRvaW5nIGxpbmUtYnktbGluZSBwcm9maWxpbmcsIGJvdGggdGhlIHBhcmVudCBhbmQgdGhlCi0gICAgIGNoaWxkIHdpbGwgcHJvYmFibHkgcG9pbnQgdG8gbGluZSBzeW1ib2xzIGluc3RlYWQgb2YgZnVuY3Rpb24KLSAgICAgc3ltYm9scy4gIEZvciB0aGUgcGFyZW50IHRoaXMgaXMgZmluZSwgc2luY2UgdGhpcyBpZGVudGlmaWVzIHRoZQotICAgICBsaW5lIG51bWJlciBpbiB0aGUgY2FsbGluZyByb3V0aW5nLCBidXQgdGhlIGNoaWxkIHNob3VsZCBhbHdheXMKLSAgICAgcG9pbnQgdG8gYSBmdW5jdGlvbiBlbnRyeSBwb2ludCwgc28gd2UgYmFjayB1cCBpbiB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHVudGlsIHdlIGZpbmQgaXQuCi0gICAKLSAgICAgRm9yIG5vcm1hbCBwcm9maWxpbmcsIGlzX2Z1bmMgd2lsbCBiZSBzZXQgb24gYWxsIHN5bWJvbHMsIHNvIHRoaXMKLSAgICAgY29kZSB3aWxsIGRvIG5vdGhpbmcuICAqLwotCi0gIHdoaWxlIChjaGlsZCA+PSBzeW10YWIuYmFzZSAmJiAhIGNoaWxkLT5pc19mdW5jKQotICAgIC0tY2hpbGQ7Ci0KLSAgaWYgKGNoaWxkIDwgc3ltdGFiLmJhc2UpCi0gICAgcmV0dXJuOwotCi0gIC8qCi0gICAqIEtlZXAgYXJjIGlmIGl0IGlzIG9uIElOQ0xfQVJDUyB0YWJsZSBvciBpZiB0aGUgSU5DTF9BUkNTIHRhYmxlCi0gICAqIGlzIGVtcHR5IGFuZCBpdCBpcyBub3QgaW4gdGhlIEVYQ0xfQVJDUyB0YWJsZS4KLSAgICovCi0gIGlmIChzeW1faWRfYXJjX2lzX3ByZXNlbnQgKCZzeW1zW0lOQ0xfQVJDU10sIHBhcmVudCwgY2hpbGQpCi0gICAgICB8fCAoc3ltc1tJTkNMX0FSQ1NdLmxlbiA9PSAwCi0JICAmJiAhc3ltX2lkX2FyY19pc19wcmVzZW50ICgmc3ltc1tFWENMX0FSQ1NdLCBwYXJlbnQsIGNoaWxkKSkpCi0gICAgewotICAgICAgY2hpbGQtPm5jYWxscyArPSBjb3VudDsKLSAgICAgIERCRyAoVEFMTFlERUJVRywKLQkgICBwcmludGYgKF8oIltjZ190YWxseV0gYXJjIGZyb20gJXMgdG8gJXMgdHJhdmVyc2VkICVsdSB0aW1lc1xuIiksCi0JCSAgIHBhcmVudC0+bmFtZSwgY2hpbGQtPm5hbWUsIGNvdW50KSk7Ci0gICAgICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCBjb3VudCk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBSZWFkIGEgcmVjb3JkIGZyb20gZmlsZSBJRlAgZGVzY3JpYmluZyBhbiBhcmMgaW4gdGhlIGZ1bmN0aW9uCi0gKiBjYWxsLWdyYXBoIGFuZCB0aGUgY291bnQgb2YgaG93IG1hbnkgdGltZXMgdGhlIGFyYyBoYXMgYmVlbgotICogdHJhdmVyc2VkLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUgb2YgZmlsZSBJRlAgYW5kIGlzIHByb3ZpZGVkCi0gKiBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcyBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoY2dfcmVhZF9yZWMsIChpZnAsIGZpbGVuYW1lKSwgRklMRSAqIGlmcCBBTkQgQ09OU1QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGJmZF92bWEgZnJvbV9wYywgc2VsZl9wYzsKLSAgc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZCBhcmM7Ci0gIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci0KLSAgaWYgKGZyZWFkICgmYXJjLCBzaXplb2YgKGFyYyksIDEsIGlmcCkgIT0gMSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotICBmcm9tX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuZnJvbV9wYyk7Ci0gIHNlbGZfcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGFyYy5zZWxmX3BjKTsKLSAgY291bnQgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGFyYy5jb3VudCk7Ci0gIERCRyAoU0FNUExFREVCVUcsCi0gICAgICAgcHJpbnRmICgiW2NnX3JlYWRfcmVjXSBmcm9tcGMgMHglbHggc2VsZnBjIDB4JWx4IGNvdW50ICVsdVxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGZyb21fcGMsICh1bnNpZ25lZCBsb25nKSBzZWxmX3BjLCBjb3VudCkpOwotICAvKiBhZGQgdGhpcyBhcmM6ICovCi0gIGNnX3RhbGx5IChmcm9tX3BjLCBzZWxmX3BjLCBjb3VudCk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIGFsbCB0aGUgYXJjcyBpbiB0aGUgY2FsbC1ncmFwaCB0byBmaWxlIE9GUC4gIEZJTEVOQU1FIGlzCi0gKiB0aGUgbmFtZSBvZiBPRlAgYW5kIGlzIHByb3ZpZGVkIGZvciBmb3JtYXR0aW5nIGVycm9yLW1lc3NhZ2VzCi0gKiBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoY2dfd3JpdGVfYXJjcywgKG9mcCwgZmlsZW5hbWUpLCBGSUxFICogb2ZwIEFORCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciB0YWcgPSBHTU9OX1RBR19DR19BUkM7Ci0gIHN0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQgcmF3X2FyYzsKLSAgQXJjICphcmM7Ci0gIFN5bSAqc3ltOwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgc3ltKyspCi0gICAgewotICAgICAgZm9yIChhcmMgPSBzeW0tPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLQl7Ci0JICBwdXRfdm1hIChjb3JlX2JmZCwgYXJjLT5wYXJlbnQtPmFkZHIsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmZyb21fcGMpOwotCSAgcHV0X3ZtYSAoY29yZV9iZmQsIGFyYy0+Y2hpbGQtPmFkZHIsIChiZmRfYnl0ZSAqKSByYXdfYXJjLnNlbGZfcGMpOwotCSAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGFyYy0+Y291bnQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmNvdW50KTsKLQkgIGlmIChmd3JpdGUgKCZ0YWcsIHNpemVvZiAodGFnKSwgMSwgb2ZwKSAhPSAxCi0JICAgICAgfHwgZndyaXRlICgmcmF3X2FyYywgc2l6ZW9mIChyYXdfYXJjKSwgMSwgb2ZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQkgIERCRyAoU0FNUExFREVCVUcsCi0JICAgICBwcmludGYgKCJbY2dfd3JpdGVfYXJjc10gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIGFyYy0+cGFyZW50LT5hZGRyLAotCQkgICAgICh1bnNpZ25lZCBsb25nKSBhcmMtPmNoaWxkLT5hZGRyLCBhcmMtPmNvdW50KSk7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2NhbGxfZ3JhcGguaCBiL2dwcm9mL2NhbGxfZ3JhcGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MTM5Yi4uMDAwMDAwMAotLS0gYS9ncHJvZi9jYWxsX2dyYXBoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaWZuZGVmIGNhbGxfZ3JhcGhfaAotI2RlZmluZSBjYWxsX2dyYXBoX2gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotZXh0ZXJuIHZvaWQgY2dfdGFsbHkgUEFSQU1TICgoYmZkX3ZtYSBmcm9tX3BjLCBiZmRfdm1hIHNlbGZfcGMsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KSk7Ci1leHRlcm4gdm9pZCBjZ19yZWFkX3JlYyBQQVJBTVMgKChGSUxFICogaWZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgY2dfd3JpdGVfYXJjcyBQQVJBTVMgKChGSUxFICogb2ZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0jZW5kaWYgLyogY2FsbF9ncmFwaF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jZ19hcmNzLmMgYi9ncHJvZi9jZ19hcmNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDIzMTcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfYXJjcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNnX2Rmbi5oIgotI2luY2x1ZGUgImNnX3ByaW50LmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLVN5bSAqY3ljbGVfaGVhZGVyOwotdW5zaWduZWQgaW50IG51bV9jeWNsZXM7Ci1BcmMgKiphcmNzOwotdW5zaWduZWQgaW50IG51bWFyY3M7Ci0KLS8qCi0gKiBSZXR1cm4gVFJVRSBpZmYgUEFSRU5UIGhhcyBhbiBhcmMgdG8gY292ZXJzIHRoZSBhZGRyZXNzCi0gKiByYW5nZSBjb3ZlcmVkIGJ5IENISUxELgotICovCi1BcmMgKgotREVGVU4gKGFyY19sb29rdXAsIChwYXJlbnQsIGNoaWxkKSwgU3ltICogcGFyZW50IEFORCBTeW0gKiBjaGlsZCkKLXsKLSAgQXJjICphcmM7Ci0KLSAgaWYgKCFwYXJlbnQgfHwgIWNoaWxkKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlthcmNfbG9va3VwXSBwYXJlbnQgPT0gMCB8fCBjaGlsZCA9PSAwXG4iKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgREJHIChMT09LVVBERUJVRywgcHJpbnRmICgiW2FyY19sb29rdXBdIHBhcmVudCAlcyBjaGlsZCAlc1xuIiwKLQkJCSAgICBwYXJlbnQtPm5hbWUsIGNoaWxkLT5uYW1lKSk7Ci0gIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0gICAgewotICAgICAgREJHIChMT09LVVBERUJVRywgcHJpbnRmICgiW2FyY19sb29rdXBdXHQgcGFyZW50ICVzIGNoaWxkICVzXG4iLAotCQkJCWFyYy0+cGFyZW50LT5uYW1lLCBhcmMtPmNoaWxkLT5uYW1lKSk7Ci0gICAgICBpZiAoY2hpbGQtPmFkZHIgPj0gYXJjLT5jaGlsZC0+YWRkcgotCSAgJiYgY2hpbGQtPmVuZF9hZGRyIDw9IGFyYy0+Y2hpbGQtPmVuZF9hZGRyKQotCXsKLQkgIHJldHVybiBhcmM7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIEFkZCAob3IganVzdCBpbmNyZW1lbnQpIGFuIGFyYzoKLSAqLwotdm9pZAotREVGVU4gKGFyY19hZGQsIChwYXJlbnQsIGNoaWxkLCBjb3VudCksCi0gICAgICAgU3ltICogcGFyZW50IEFORCBTeW0gKiBjaGlsZCBBTkQgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLSAgc3RhdGljIHVuc2lnbmVkIGludCBtYXhhcmNzID0gMDsKLSAgQXJjICphcmMsICoqbmV3YXJjczsKLQotICBEQkcgKFRBTExZREVCVUcsIHByaW50ZiAoIlthcmNfYWRkXSAlbHUgYXJjcyBmcm9tICVzIHRvICVzXG4iLAotCQkJICAgY291bnQsIHBhcmVudC0+bmFtZSwgY2hpbGQtPm5hbWUpKTsKLSAgYXJjID0gYXJjX2xvb2t1cCAocGFyZW50LCBjaGlsZCk7Ci0gIGlmIChhcmMpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEEgaGl0OiBqdXN0IGluY3JlbWVudCB0aGUgY291bnQuCi0gICAgICAgKi8KLSAgICAgIERCRyAoVEFMTFlERUJVRywgcHJpbnRmICgiW3RhbGx5XSBoaXQgJWx1ICs9ICVsdVxuIiwKLQkJCSAgICAgICBhcmMtPmNvdW50LCBjb3VudCkpOwotICAgICAgYXJjLT5jb3VudCArPSBjb3VudDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGFyYyA9IChBcmMgKikgeG1hbGxvYyAoc2l6ZW9mICgqYXJjKSk7Ci0gIG1lbXNldCAoYXJjLCAwLCBzaXplb2YgKCphcmMpKTsKLSAgYXJjLT5wYXJlbnQgPSBwYXJlbnQ7Ci0gIGFyYy0+Y2hpbGQgPSBjaGlsZDsKLSAgYXJjLT5jb3VudCA9IGNvdW50OwotCi0gIC8qIElmIHRoaXMgaXNuJ3QgYW4gYXJjIGZvciBhIHJlY3Vyc2l2ZSBjYWxsIHRvIHBhcmVudCwgdGhlbiBhZGQgaXQKLSAgICAgdG8gdGhlIGFycmF5IG9mIGFyY3MuICAqLwotICBpZiAocGFyZW50ICE9IGNoaWxkKQotICAgIHsKLSAgICAgIC8qIElmIHdlJ3ZlIGV4aGF1c3RlZCBzcGFjZSBpbiBvdXIgY3VycmVudCBhcnJheSwgZ2V0IGEgbmV3IG9uZQotCSBhbmQgY29weSB0aGUgY29udGVudHMuICAgV2UgbWlnaHQgd2FudCB0byB0aHJvdHRsZSB0aGUgZG91YmxpbmcKLQkgZmFjdG9yIG9uZSBkYXkuICAqLwotICAgICAgaWYgKG51bWFyY3MgPT0gbWF4YXJjcykKLQl7Ci0JICAvKiBEZXRlcm1pbmUgaG93IG11Y2ggc3BhY2Ugd2Ugd2FudCB0byBhbGxvY2F0ZS4gICovCi0JICBpZiAobWF4YXJjcyA9PSAwKQotCSAgICBtYXhhcmNzID0gMTsKLQkgIG1heGFyY3MgKj0gMjsKLQkKLQkgIC8qIEFsbG9jYXRlIHRoZSBuZXcgYXJyYXkuICAqLwotCSAgbmV3YXJjcyA9IChBcmMgKiopeG1hbGxvYyhzaXplb2YgKEFyYyAqKSAqIG1heGFyY3MpOwotCi0JICAvKiBDb3B5IHRoZSBvbGQgYXJyYXkncyBjb250ZW50cyBpbnRvIHRoZSBuZXcgYXJyYXkuICAqLwotCSAgbWVtY3B5IChuZXdhcmNzLCBhcmNzLCBudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotCi0JICAvKiBGcmVlIHVwIHRoZSBvbGQgYXJyYXkuICAqLwotCSAgZnJlZSAoYXJjcyk7Ci0KLQkgIC8qIEFuZCBtYWtlIHRoZSBuZXcgYXJyYXkgYmUgdGhlIGN1cnJlbnQgYXJyYXkuICAqLwotCSAgYXJjcyA9IG5ld2FyY3M7Ci0JfQotCi0gICAgICAvKiBQbGFjZSB0aGlzIGFyYyBpbiB0aGUgYXJjIGFycmF5LiAgKi8KLSAgICAgIGFyY3NbbnVtYXJjcysrXSA9IGFyYzsKLSAgICB9Ci0KLSAgLyogcHJlcGVuZCB0aGlzIGNoaWxkIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGlzIHBhcmVudDogKi8KLSAgYXJjLT5uZXh0X2NoaWxkID0gcGFyZW50LT5jZy5jaGlsZHJlbjsKLSAgcGFyZW50LT5jZy5jaGlsZHJlbiA9IGFyYzsKLQotICAvKiBwcmVwZW5kIHRoaXMgcGFyZW50IHRvIHRoZSBwYXJlbnRzIG9mIHRoaXMgY2hpbGQ6ICovCi0gIGFyYy0+bmV4dF9wYXJlbnQgPSBjaGlsZC0+Y2cucGFyZW50czsKLSAgY2hpbGQtPmNnLnBhcmVudHMgPSBhcmM7Ci19Ci0KLQotc3RhdGljIGludAotREVGVU4gKGNtcF90b3BvLCAobHAsIHJwKSwgY29uc3QgUFRSIGxwIEFORCBjb25zdCBQVFIgcnApCi17Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLQotICByZXR1cm4gbGVmdC0+Y2cudG9wX29yZGVyIC0gcmlnaHQtPmNnLnRvcF9vcmRlcjsKLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHByb3BhZ2F0ZV90aW1lLCAocGFyZW50KSwgU3ltICogcGFyZW50KQotewotICBBcmMgKmFyYzsKLSAgU3ltICpjaGlsZDsKLSAgZG91YmxlIHNoYXJlLCBwcm9wX3NoYXJlOwotCi0gIGlmIChwYXJlbnQtPmNnLnByb3AuZnJhY3QgPT0gMC4wKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogZ2F0aGVyIHRpbWUgZnJvbSBjaGlsZHJlbiBvZiB0aGlzIHBhcmVudDogKi8KLQotICBmb3IgKGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotICAgIHsKLSAgICAgIGNoaWxkID0gYXJjLT5jaGlsZDsKLSAgICAgIGlmIChhcmMtPmNvdW50ID09IDAgfHwgY2hpbGQgPT0gcGFyZW50IHx8IGNoaWxkLT5jZy5wcm9wLmZyYWN0ID09IDApCi0JewotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSBjaGlsZCkKLQl7Ci0JICBpZiAocGFyZW50LT5jZy5jeWMubnVtID09IGNoaWxkLT5jZy5jeWMubnVtKQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGlmIChwYXJlbnQtPmNnLnRvcF9vcmRlciA8PSBjaGlsZC0+Y2cudG9wX29yZGVyKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3Byb3BhZ2F0ZV0gdG9wb3JkZXIgYm90Y2hlc1xuIik7Ci0JICAgIH0KLQkgIGNoaWxkID0gY2hpbGQtPmNnLmN5Yy5oZWFkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocGFyZW50LT5jZy50b3Bfb3JkZXIgPD0gY2hpbGQtPmNnLnRvcF9vcmRlcikKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltwcm9wYWdhdGVdIHRvcG9yZGVyIGJvdGNoZXNcbiIpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGNoaWxkLT5uY2FsbHMgPT0gMCkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIGRpc3RyaWJ1dGUgdGltZSBmb3IgdGhpcyBhcmM6ICovCi0gICAgICBhcmMtPnRpbWUgPSBjaGlsZC0+aGlzdC50aW1lICogKCgoZG91YmxlKSBhcmMtPmNvdW50KQotCQkJCSAgICAgIC8gKChkb3VibGUpIGNoaWxkLT5uY2FsbHMpKTsKLSAgICAgIGFyYy0+Y2hpbGRfdGltZSA9IGNoaWxkLT5jZy5jaGlsZF90aW1lCi0JKiAoKChkb3VibGUpIGFyYy0+Y291bnQpIC8gKChkb3VibGUpIGNoaWxkLT5uY2FsbHMpKTsKLSAgICAgIHNoYXJlID0gYXJjLT50aW1lICsgYXJjLT5jaGlsZF90aW1lOwotICAgICAgcGFyZW50LT5jZy5jaGlsZF90aW1lICs9IHNoYXJlOwotCi0gICAgICAvKiAoMSAtIGNnLnByb3AuZnJhY3QpIGdldHMgbG9zdCBhbG9uZyB0aGUgd2F5OiAqLwotICAgICAgcHJvcF9zaGFyZSA9IHBhcmVudC0+Y2cucHJvcC5mcmFjdCAqIHNoYXJlOwotCi0gICAgICAvKiBmaXggdGhpbmdzIGZvciBwcmludGluZzogKi8KLSAgICAgIHBhcmVudC0+Y2cucHJvcC5jaGlsZCArPSBwcm9wX3NoYXJlOwotICAgICAgYXJjLT50aW1lICo9IHBhcmVudC0+Y2cucHJvcC5mcmFjdDsKLSAgICAgIGFyYy0+Y2hpbGRfdGltZSAqPSBwYXJlbnQtPmNnLnByb3AuZnJhY3Q7Ci0KLSAgICAgIC8qIGFkZCB0aGlzIHNoYXJlIHRvIHRoZSBwYXJlbnQncyBjeWNsZSBoZWFkZXIsIGlmIGFueTogKi8KLSAgICAgIGlmIChwYXJlbnQtPmNnLmN5Yy5oZWFkICE9IHBhcmVudCkKLQl7Ci0JICBwYXJlbnQtPmNnLmN5Yy5oZWFkLT5jZy5jaGlsZF90aW1lICs9IHNoYXJlOwotCSAgcGFyZW50LT5jZy5jeWMuaGVhZC0+Y2cucHJvcC5jaGlsZCArPSBwcm9wX3NoYXJlOwotCX0KLSAgICAgIERCRyAoUFJPUERFQlVHLAotCSAgIHByaW50ZiAoIltwcm9wX3RpbWVdIGNoaWxkIFx0Iik7Ci0JICAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgIHByaW50ZiAoIiB3aXRoICVmICVmICVsdS8lbHVcbiIsIGNoaWxkLT5oaXN0LnRpbWUsCi0JCSAgIGNoaWxkLT5jZy5jaGlsZF90aW1lLCBhcmMtPmNvdW50LCBjaGlsZC0+bmNhbGxzKTsKLQkgICBwcmludGYgKCJbcHJvcF90aW1lXSBwYXJlbnRcdCIpOwotCSAgIHByaW50X25hbWUgKHBhcmVudCk7Ci0JICAgcHJpbnRmICgiXG5bcHJvcF90aW1lXSBzaGFyZSAlZlxuIiwgc2hhcmUpKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIENvbXB1dGUgdGhlIHRpbWUgb2YgYSBjeWNsZSBhcyB0aGUgc3VtIG9mIHRoZSB0aW1lcyBvZiBhbGwKLSAqIGl0cyBtZW1iZXJzLgotICovCi1zdGF0aWMgdm9pZAotREVGVU5fVk9JRCAoY3ljbGVfdGltZSkKLXsKLSAgU3ltICptZW1iZXIsICpjeWM7Ci0KLSAgZm9yIChjeWMgPSAmY3ljbGVfaGVhZGVyWzFdOyBjeWMgPD0gJmN5Y2xlX2hlYWRlcltudW1fY3ljbGVzXTsgKytjeWMpCi0gICAgewotICAgICAgZm9yIChtZW1iZXIgPSBjeWMtPmNnLmN5Yy5uZXh0OyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgaWYgKG1lbWJlci0+Y2cucHJvcC5mcmFjdCA9PSAwLjApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIEFsbCBtZW1iZXJzIGhhdmUgdGhlIHNhbWUgcHJvcGZyYWN0aW9uIGV4Y2VwdCB0aG9zZQotCSAgICAgICAqIHRoYXQgd2VyZSBleGNsdWRlZCB3aXRoIC1FLgotCSAgICAgICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBjeWMtPmhpc3QudGltZSArPSBtZW1iZXItPmhpc3QudGltZTsKLQl9Ci0gICAgICBjeWMtPmNnLnByb3Auc2VsZiA9IGN5Yy0+Y2cucHJvcC5mcmFjdCAqIGN5Yy0+aGlzdC50aW1lOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU5fVk9JRCAoY3ljbGVfbGluaykKLXsKLSAgU3ltICpzeW0sICpjeWMsICptZW1iZXI7Ci0gIEFyYyAqYXJjOwotICBpbnQgbnVtOwotCi0gIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgY3ljbGVzLCBhbmQgaW5pdGlhbGl6ZSB0aGUgY3ljbGUgbGlzdHM6ICovCi0KLSAgbnVtX2N5Y2xlcyA9IDA7Ci0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgLyogdGhpcyBpcyBob3cgeW91IGZpbmQgdW5hdHRhY2hlZCBjeWNsZXM6ICovCi0gICAgICBpZiAoc3ltLT5jZy5jeWMuaGVhZCA9PSBzeW0gJiYgc3ltLT5jZy5jeWMubmV4dCkKLQl7Ci0JICArK251bV9jeWNsZXM7Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBjeWNsZV9oZWFkZXIgaXMgaW5kZXhlZCBieSBjeWNsZSBudW1iZXI6IGkuZS4gaXQgaXMgb3JpZ2luIDEsCi0gICAqIG5vdCBvcmlnaW4gMC4KLSAgICovCi0gIGN5Y2xlX2hlYWRlciA9IChTeW0gKikgeG1hbGxvYyAoKG51bV9jeWNsZXMgKyAxKSAqIHNpemVvZiAoU3ltKSk7Ci0KLSAgLyoKLSAgICogTm93IGxpbmsgY3ljbGVzIHRvIHRydWUgY3ljbGUtaGVhZHMsIG51bWJlciB0aGVtLCBhY2N1bXVsYXRlCi0gICAqIHRoZSBkYXRhIGZvciB0aGUgY3ljbGUuCi0gICAqLwotICBudW0gPSAwOwotICBjeWMgPSBjeWNsZV9oZWFkZXI7Ci0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgaWYgKCEoc3ltLT5jZy5jeWMuaGVhZCA9PSBzeW0gJiYgc3ltLT5jZy5jeWMubmV4dCAhPSAwKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICArK251bTsKLSAgICAgICsrY3ljOwotICAgICAgc3ltX2luaXQgKGN5Yyk7Ci0gICAgICBjeWMtPmNnLnByaW50X2ZsYWcgPSBUUlVFOwkvKiBzaG91bGQgdGhpcyBiZSBwcmludGVkPyAqLwotICAgICAgY3ljLT5jZy50b3Bfb3JkZXIgPSBERk5fTkFOOwkvKiBncmFwaCBjYWxsIGNoYWluIHRvcC1zb3J0IG9yZGVyICovCi0gICAgICBjeWMtPmNnLmN5Yy5udW0gPSBudW07CS8qIGludGVybmFsIG51bWJlciBvZiBjeWNsZSBvbiAqLwotICAgICAgY3ljLT5jZy5jeWMuaGVhZCA9IGN5YzsJLyogcG9pbnRlciB0byBoZWFkIG9mIGN5Y2xlICovCi0gICAgICBjeWMtPmNnLmN5Yy5uZXh0ID0gc3ltOwkvKiBwb2ludGVyIHRvIG5leHQgbWVtYmVyIG9mIGN5Y2xlICovCi0gICAgICBEQkcgKENZQ0xFREVCVUcsIHByaW50ZiAoIltjeWNsZV9saW5rXSAiKTsKLQkgICBwcmludF9uYW1lIChzeW0pOwotCSAgIHByaW50ZiAoIiBpcyB0aGUgaGVhZCBvZiBjeWNsZSAlZFxuIiwgbnVtKSk7Ci0KLSAgICAgIC8qIGxpbmsgbWVtYmVycyB0byBjeWNsZSBoZWFkZXI6ICovCi0gICAgICBmb3IgKG1lbWJlciA9IHN5bTsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIG1lbWJlci0+Y2cuY3ljLm51bSA9IG51bTsKLQkgIG1lbWJlci0+Y2cuY3ljLmhlYWQgPSBjeWM7Ci0JfQotCi0gICAgICAvKgotICAgICAgICogQ291bnQgY2FsbHMgZnJvbSBvdXRzaWRlIHRoZSBjeWNsZSBhbmQgdGhvc2UgYW1vbmcgY3ljbGUKLSAgICAgICAqIG1lbWJlcnM6Ci0gICAgICAgKi8KLSAgICAgIGZvciAobWVtYmVyID0gc3ltOyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgZm9yIChhcmMgPSBtZW1iZXItPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gYXJjLT5uZXh0X3BhcmVudCkKLQkgICAgewotCSAgICAgIGlmIChhcmMtPnBhcmVudCA9PSBtZW1iZXIpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChhcmMtPnBhcmVudC0+Y2cuY3ljLm51bSA9PSBudW0pCi0JCXsKLQkJICBjeWMtPmNnLnNlbGZfY2FsbHMgKz0gYXJjLT5jb3VudDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGN5Yy0+bmNhbGxzICs9IGFyYy0+Y291bnQ7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIENoZWNrIGlmIGFueSBwYXJlbnQgb2YgdGhpcyBjaGlsZCAob3Igb3V0c2lkZSBwYXJlbnRzIG9mIHRoaXMKLSAqIGN5Y2xlKSBoYXZlIHRoZWlyIHByaW50IGZsYWdzIG9uIGFuZCBzZXQgdGhlIHByaW50IGZsYWcgb2YgdGhlCi0gKiBjaGlsZCAoY3ljbGUpIGFwcHJvcHJpYXRlbHkuICBTaW1pbGFybHksIGRlYWwgd2l0aCBwcm9wYWdhdGlvbgotICogZnJhY3Rpb25zIGZyb20gcGFyZW50cy4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChpbmhlcml0X2ZsYWdzLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgU3ltICpoZWFkLCAqcGFyZW50LCAqbWVtYmVyOwotICBBcmMgKmFyYzsKLQotICBoZWFkID0gY2hpbGQtPmNnLmN5Yy5oZWFkOwotICBpZiAoY2hpbGQgPT0gaGVhZCkKLSAgICB7Ci0gICAgICAvKiBqdXN0IGEgcmVndWxhciBjaGlsZCwgY2hlY2sgaXRzIHBhcmVudHM6ICovCi0gICAgICBjaGlsZC0+Y2cucHJpbnRfZmxhZyA9IEZBTFNFOwotICAgICAgY2hpbGQtPmNnLnByb3AuZnJhY3QgPSAwLjA7Ci0gICAgICBmb3IgKGFyYyA9IGNoaWxkLT5jZy5wYXJlbnRzOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9wYXJlbnQpCi0JewotCSAgcGFyZW50ID0gYXJjLT5wYXJlbnQ7Ci0JICBpZiAoY2hpbGQgPT0gcGFyZW50KQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGNoaWxkLT5jZy5wcmludF9mbGFnIHw9IHBhcmVudC0+Y2cucHJpbnRfZmxhZzsKLQkgIC8qCi0JICAgKiBJZiB0aGUgY2hpbGQgd2FzIG5ldmVyIGFjdHVhbGx5IGNhbGxlZCAoZS5nLiwgdGhpcyBhcmMKLQkgICAqIGlzIHN0YXRpYyAoYW5kIGFsbCBvdGhlcnMgYXJlLCB0b28pKSBubyB0aW1lIHByb3BhZ2F0ZXMKLQkgICAqIGFsb25nIHRoaXMgYXJjLgotCSAgICovCi0JICBpZiAoY2hpbGQtPm5jYWxscyAhPSAwKQotCSAgICB7Ci0JICAgICAgY2hpbGQtPmNnLnByb3AuZnJhY3QgKz0gcGFyZW50LT5jZy5wcm9wLmZyYWN0Ci0JCSogKCgoZG91YmxlKSBhcmMtPmNvdW50KSAvICgoZG91YmxlKSBjaGlsZC0+bmNhbGxzKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEl0cyBhIG1lbWJlciBvZiBhIGN5Y2xlLCBsb29rIGF0IGFsbCBwYXJlbnRzIGZyb20gb3V0c2lkZQotICAgICAgICogdGhlIGN5Y2xlLgotICAgICAgICovCi0gICAgICBoZWFkLT5jZy5wcmludF9mbGFnID0gRkFMU0U7Ci0gICAgICBoZWFkLT5jZy5wcm9wLmZyYWN0ID0gMC4wOwotICAgICAgZm9yIChtZW1iZXIgPSBoZWFkLT5jZy5jeWMubmV4dDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIGZvciAoYXJjID0gbWVtYmVyLT5jZy5wYXJlbnRzOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9wYXJlbnQpCi0JICAgIHsKLQkgICAgICBpZiAoYXJjLT5wYXJlbnQtPmNnLmN5Yy5oZWFkID09IGhlYWQpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIHBhcmVudCA9IGFyYy0+cGFyZW50OwotCSAgICAgIGhlYWQtPmNnLnByaW50X2ZsYWcgfD0gcGFyZW50LT5jZy5wcmludF9mbGFnOwotCSAgICAgIC8qCi0JICAgICAgICogSWYgdGhlIGN5Y2xlIHdhcyBuZXZlciBhY3R1YWxseSBjYWxsZWQgKGUuZy4gdGhpcwotCSAgICAgICAqIGFyYyBpcyBzdGF0aWMgKGFuZCBhbGwgb3RoZXJzIGFyZSwgdG9vKSkgbm8gdGltZQotCSAgICAgICAqIHByb3BhZ2F0ZXMgYWxvbmcgdGhpcyBhcmMuCi0JICAgICAgICovCi0JICAgICAgaWYgKGhlYWQtPm5jYWxscyAhPSAwKQotCQl7Ci0JCSAgaGVhZC0+Y2cucHJvcC5mcmFjdCArPSBwYXJlbnQtPmNnLnByb3AuZnJhY3QKLQkJICAgICogKCgoZG91YmxlKSBhcmMtPmNvdW50KSAvICgoZG91YmxlKSBoZWFkLT5uY2FsbHMpKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZm9yIChtZW1iZXIgPSBoZWFkOyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgbWVtYmVyLT5jZy5wcmludF9mbGFnID0gaGVhZC0+Y2cucHJpbnRfZmxhZzsKLQkgIG1lbWJlci0+Y2cucHJvcC5mcmFjdCA9IGhlYWQtPmNnLnByb3AuZnJhY3Q7Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogSW4gb25lIHRvcC10by1ib3R0b20gcGFzcyBvdmVyIHRoZSB0b3BvbG9naWNhbGx5IHNvcnRlZCBzeW1ib2xzCi0gKiBwcm9wYWdhdGU6Ci0gKiAgICAgIGNnLnByaW50X2ZsYWcgYXMgdGhlIHVuaW9uIG9mIHBhcmVudHMnIHByaW50X2ZsYWdzCi0gKiAgICAgIHByb3BmcmFjdGlvbiBhcyB0aGUgc3VtIG9mIGZyYWN0aW9uYWwgcGFyZW50cycgcHJvcGZyYWN0aW9ucwotICogYW5kIHdoaWxlIHdlJ3JlIGhlcmUsIHN1bSB0aW1lIGZvciBmdW5jdGlvbnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJvcGFnYXRlX2ZsYWdzLCAoc3ltYm9scyksIFN5bSAqKiBzeW1ib2xzKQotewotICBpbnQgaW5kZXg7Ci0gIFN5bSAqb2xkX2hlYWQsICpjaGlsZDsKLQotICBvbGRfaGVhZCA9IDA7Ci0gIGZvciAoaW5kZXggPSBzeW10YWIubGVuIC0gMTsgaW5kZXggPj0gMDsgLS1pbmRleCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IHN5bWJvbHNbaW5kZXhdOwotICAgICAgLyoKLSAgICAgICAqIElmIHdlIGhhdmVuJ3QgZG9uZSB0aGlzIGZ1bmN0aW9uIG9yIGN5Y2xlLCBpbmhlcml0IHRoaW5ncwotICAgICAgICogZnJvbSBwYXJlbnQuICBUaGlzIHdheSwgd2UgYXJlIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGFyY3MKLSAgICAgICAqIHNpbmNlIHdlIGRvIGFsbCBtZW1iZXJzIG9mIGEgY3ljbGUgKGFuZCB0aGUgY3ljbGUgaXRzZWxmKQotICAgICAgICogYXMgd2UgaGl0IHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIGN5Y2xlLgotICAgICAgICovCi0gICAgICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IG9sZF9oZWFkKQotCXsKLQkgIG9sZF9oZWFkID0gY2hpbGQtPmNnLmN5Yy5oZWFkOwotCSAgaW5oZXJpdF9mbGFncyAoY2hpbGQpOwotCX0KLSAgICAgIERCRyAoUFJPUERFQlVHLAotCSAgIHByaW50ZiAoIltwcm9wX2ZsYWdzXSAiKTsKLQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICAgcHJpbnRmICgiaW5oZXJpdHMgcHJpbnQtZmxhZyAlZCBhbmQgcHJvcC1mcmFjdCAlZlxuIiwKLQkJICAgY2hpbGQtPmNnLnByaW50X2ZsYWcsIGNoaWxkLT5jZy5wcm9wLmZyYWN0KSk7Ci0gICAgICBpZiAoIWNoaWxkLT5jZy5wcmludF9mbGFnKQotCXsKLQkgIC8qCi0JICAgKiBQcmludGZsYWcgaXMgb2ZmLiBJdCBnZXRzIHR1cm5lZCBvbiBieSBiZWluZyBpbiB0aGUKLQkgICAqIElOQ0xfR1JBUEggdGFibGUsIG9yIHRoZXJlIGJlaW5nIGFuIGVtcHR5IElOQ0xfR1JBUEgKLQkgICAqIHRhYmxlIGFuZCBub3QgYmVpbmcgaW4gdGhlIEVYQ0xfR1JBUEggdGFibGUuCi0JICAgKi8KLQkgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0dSQVBIXSwgY2hpbGQtPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9HUkFQSF0ubGVuID09IDAKLQkJICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9HUkFQSF0sIGNoaWxkLT5hZGRyKSkpCi0JICAgIHsKLQkgICAgICBjaGlsZC0+Y2cucHJpbnRfZmxhZyA9IFRSVUU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyoKLQkgICAqIFRoaXMgZnVuY3Rpb24gaGFzIHByaW50aW5nIHBhcmVudHM6IG1heWJlIHNvbWVvbmUgd2FudHMKLQkgICAqIHRvIHNodXQgaXQgdXAgYnkgcHV0dGluZyBpdCBpbiB0aGUgRVhDTF9HUkFQSCB0YWJsZS4KLQkgICAqIChCdXQgZmF2b3IgSU5DTF9HUkFQSCBvdmVyIEVYQ0xfR1JBUEguKQotCSAgICovCi0JICBpZiAoIXN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfR1JBUEhdLCBjaGlsZC0+YWRkcikKLQkgICAgICAmJiBzeW1fbG9va3VwICgmc3ltc1tFWENMX0dSQVBIXSwgY2hpbGQtPmFkZHIpKQotCSAgICB7Ci0JICAgICAgY2hpbGQtPmNnLnByaW50X2ZsYWcgPSBGQUxTRTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChjaGlsZC0+Y2cucHJvcC5mcmFjdCA9PSAwLjApCi0JewotCSAgLyoKLQkgICAqIE5vIHBhcmVudHMgdG8gcGFzcyB0aW1lIHRvLiAgQ29sbGVjdCB0aW1lIGZyb20gY2hpbGRyZW4KLQkgICAqIGlmIGl0cyBpbiB0aGUgSU5DTF9USU1FIHRhYmxlLCBvciB0aGVyZSBpcyBhbiBlbXB0eQotCSAgICogSU5DTF9USU1FIHRhYmxlIGFuZCBpdHMgbm90IGluIHRoZSBFWENMX1RJTUUgdGFibGUuCi0JICAgKi8KLQkgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX1RJTUVdLCBjaGlsZC0+YWRkcikKLQkgICAgICB8fCAoc3ltc1tJTkNMX1RJTUVdLmxlbiA9PSAwCi0JCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfVElNRV0sIGNoaWxkLT5hZGRyKSkpCi0JICAgIHsKLQkgICAgICBjaGlsZC0+Y2cucHJvcC5mcmFjdCA9IDEuMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICogSXQgaGFzIHBhcmVudHMgdG8gcGFzcyB0aW1lIHRvLCBidXQgbWF5YmUgc29tZW9uZSB3YW50cwotCSAgICogdG8gc2h1dCBpdCB1cCBieSBwdXR0dGluZyBpdCBpbiB0aGUgRVhDTF9USU1FIHRhYmxlLgotCSAgICogKEJ1dCBmYXZvciBiZWluZyBpbiBJTkNMX1RJTUUgdGFiZSBvdmVyIGJlaW5nIGluCi0JICAgKiBFWENMX1RJTUUgdGFibGUuKQotCSAgICovCi0JICBpZiAoIXN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfVElNRV0sIGNoaWxkLT5hZGRyKQotCSAgICAgICYmIHN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfVElNRV0sIGNoaWxkLT5hZGRyKSkKLQkgICAgewotCSAgICAgIGNoaWxkLT5jZy5wcm9wLmZyYWN0ID0gMC4wOwotCSAgICB9Ci0JfQotICAgICAgY2hpbGQtPmNnLnByb3Auc2VsZiA9IGNoaWxkLT5oaXN0LnRpbWUgKiBjaGlsZC0+Y2cucHJvcC5mcmFjdDsKLSAgICAgIHByaW50X3RpbWUgKz0gY2hpbGQtPmNnLnByb3Auc2VsZjsKLSAgICAgIERCRyAoUFJPUERFQlVHLAotCSAgIHByaW50ZiAoIltwcm9wX2ZsYWdzXSAiKTsKLQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICAgcHJpbnRmICgiIGVuZHMgdXAgd2l0aCBwcmludGZsYWcgJWQgYW5kIHByb3AtZnJhY3QgJWZcbiIsCi0JCSAgIGNoaWxkLT5jZy5wcmludF9mbGFnLCBjaGlsZC0+Y2cucHJvcC5mcmFjdCk7Ci0JICAgcHJpbnRmICgiW3Byb3BfZmxhZ3NdIHRpbWUgJWYgcHJvcHNlbGYgJWYgcHJpbnRfdGltZSAlZlxuIiwKLQkJICAgY2hpbGQtPmhpc3QudGltZSwgY2hpbGQtPmNnLnByb3Auc2VsZiwgcHJpbnRfdGltZSkpOwotICAgIH0KLX0KLQotCi0vKgotICogQ29tcGFyZSBieSBkZWNyZWFzaW5nIHByb3BhZ2F0ZWQgdGltZS4gIElmIHRpbWVzIGFyZSBlcXVhbCwgYnV0IG9uZQotICogaXMgYSBjeWNsZSBoZWFkZXIsIHNheSB0aGF0J3MgZmlyc3QgKGUuZy4gbGVzcywgaS5lLiAtMSkuICBJZiBvbmUncwotICogbmFtZSBkb2Vzbid0IGhhdmUgYW4gdW5kZXJzY29yZSBhbmQgdGhlIG90aGVyIGRvZXMsIHNheSB0aGF0IG9uZSBpcwotICogZmlyc3QuICBBbGwgZWxzZSBiZWluZyBlcXVhbCwgY29tcGFyZSBieSBuYW1lcy4KLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF90b3RhbCwgKGxwLCBycCksIGNvbnN0IFBUUiBscCBBTkQgY29uc3QgUFRSIHJwKQotewotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0gIGRvdWJsZSBkaWZmOwotCi0gIGRpZmYgPSAobGVmdC0+Y2cucHJvcC5zZWxmICsgbGVmdC0+Y2cucHJvcC5jaGlsZCkKLSAgICAtIChyaWdodC0+Y2cucHJvcC5zZWxmICsgcmlnaHQtPmNnLnByb3AuY2hpbGQpOwotICBpZiAoZGlmZiA8IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChkaWZmID4gMC4wKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmICghbGVmdC0+bmFtZSAmJiBsZWZ0LT5jZy5jeWMubnVtICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKCFyaWdodC0+bmFtZSAmJiByaWdodC0+Y2cuY3ljLm51bSAhPSAwKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKCFsZWZ0LT5uYW1lKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmICghcmlnaHQtPm5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAobGVmdC0+bmFtZVswXSAhPSAnXycgJiYgcmlnaHQtPm5hbWVbMF0gPT0gJ18nKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmIChsZWZ0LT5uYW1lWzBdID09ICdfJyAmJiByaWdodC0+bmFtZVswXSAhPSAnXycpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAobGVmdC0+bmNhbGxzID4gcmlnaHQtPm5jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAobGVmdC0+bmNhbGxzIDwgcmlnaHQtPm5jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiBzdHJjbXAgKGxlZnQtPm5hbWUsIHJpZ2h0LT5uYW1lKTsKLX0KLQotCi0vKgotICogVG9wb2xvZ2ljYWxseSBzb3J0IHRoZSBncmFwaCAoY29sbGFwc2luZyBjeWNsZXMpLCBhbmQgcHJvcGFnYXRlcwotICogdGltZSBib3R0b20gdXAgYW5kIGZsYWdzIHRvcCBkb3duLgotICovCi1TeW0gKioKLURFRlVOX1ZPSUQgKGNnX2Fzc2VtYmxlKQotewotICBTeW0gKnBhcmVudCwgKip0aW1lX3NvcnRlZF9zeW1zLCAqKnRvcF9zb3J0ZWRfc3ltczsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBBcmMgKmFyYzsKLQotICAvKgotICAgKiBpbml0aWFsaXplIHZhcmlvdXMgdGhpbmdzOgotICAgKiAgICAgIHplcm8gb3V0IGNoaWxkIHRpbWVzLgotICAgKiAgICAgIGNvdW50IHNlbGYtcmVjdXJzaXZlIGNhbGxzLgotICAgKiAgICAgIGluZGljYXRlIHRoYXQgbm90aGluZyBpcyBvbiBjeWNsZXMuCi0gICAqLwotICBmb3IgKHBhcmVudCA9IHN5bXRhYi5iYXNlOyBwYXJlbnQgPCBzeW10YWIubGltaXQ7IHBhcmVudCsrKQotICAgIHsKLSAgICAgIHBhcmVudC0+Y2cuY2hpbGRfdGltZSA9IDAuMDsKLSAgICAgIGFyYyA9IGFyY19sb29rdXAgKHBhcmVudCwgcGFyZW50KTsKLSAgICAgIGlmIChhcmMgJiYgcGFyZW50ID09IGFyYy0+Y2hpbGQpCi0JewotCSAgcGFyZW50LT5uY2FsbHMgLT0gYXJjLT5jb3VudDsKLQkgIHBhcmVudC0+Y2cuc2VsZl9jYWxscyA9IGFyYy0+Y291bnQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHBhcmVudC0+Y2cuc2VsZl9jYWxscyA9IDA7Ci0JfQotICAgICAgcGFyZW50LT5jZy5wcm9wLmZyYWN0ID0gMC4wOwotICAgICAgcGFyZW50LT5jZy5wcm9wLnNlbGYgPSAwLjA7Ci0gICAgICBwYXJlbnQtPmNnLnByb3AuY2hpbGQgPSAwLjA7Ci0gICAgICBwYXJlbnQtPmNnLnByaW50X2ZsYWcgPSBGQUxTRTsKLSAgICAgIHBhcmVudC0+Y2cudG9wX29yZGVyID0gREZOX05BTjsKLSAgICAgIHBhcmVudC0+Y2cuY3ljLm51bSA9IDA7Ci0gICAgICBwYXJlbnQtPmNnLmN5Yy5oZWFkID0gcGFyZW50OwotICAgICAgcGFyZW50LT5jZy5jeWMubmV4dCA9IDA7Ci0gICAgICBpZiAoaWdub3JlX2RpcmVjdF9jYWxscykKLQl7Ci0JICBmaW5kX2NhbGwgKHBhcmVudCwgcGFyZW50LT5hZGRyLCAocGFyZW50ICsgMSktPmFkZHIpOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIFRvcG9sb2dpY2FsbHkgb3JkZXIgdGhpbmdzLiAgSWYgYW55IG5vZGUgaXMgdW5udW1iZXJlZCwgbnVtYmVyCi0gICAqIGl0IGFuZCBhbnkgb2YgaXRzIGRlc2NlbmRlbnRzLgotICAgKi8KLSAgZm9yIChwYXJlbnQgPSBzeW10YWIuYmFzZTsgcGFyZW50IDwgc3ltdGFiLmxpbWl0OyBwYXJlbnQrKykKLSAgICB7Ci0gICAgICBpZiAocGFyZW50LT5jZy50b3Bfb3JkZXIgPT0gREZOX05BTikKLQl7Ci0JICBjZ19kZm4gKHBhcmVudCk7Ci0JfQotICAgIH0KLQotICAvKiBsaW5rIHRvZ2V0aGVyIG5vZGVzIG9uIHRoZSBzYW1lIGN5Y2xlOiAqLwotICBjeWNsZV9saW5rICgpOwotCi0gIC8qIHNvcnQgdGhlIHN5bWJvbCB0YWJsZSBpbiByZXZlcnNlIHRvcG9sb2dpY2FsIG9yZGVyOiAqLwotICB0b3Bfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotICAgIHsKLSAgICAgIHRvcF9zb3J0ZWRfc3ltc1tpbmRleF0gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotICAgIH0KLSAgcXNvcnQgKHRvcF9zb3J0ZWRfc3ltcywgc3ltdGFiLmxlbiwgc2l6ZW9mIChTeW0gKiksIGNtcF90b3BvKTsKLSAgREJHIChERk5ERUJVRywKLSAgICAgICBwcmludGYgKCJbY2dfYXNzZW1ibGVdIHRvcG9sb2dpY2FsIHNvcnQgbGlzdGluZ1xuIik7Ci0gICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICAgICB7Ci0gICAgICAgcHJpbnRmICgiW2NnX2Fzc2VtYmxlXSAiKTsKLSAgICAgICBwcmludGYgKCIlZDoiLCB0b3Bfc29ydGVkX3N5bXNbaW5kZXhdLT5jZy50b3Bfb3JkZXIpOwotICAgICAgIHByaW50X25hbWUgKHRvcF9zb3J0ZWRfc3ltc1tpbmRleF0pOwotICAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICAgfQotICApOwotICAvKgotICAgKiBTdGFydGluZyBmcm9tIHRoZSB0b3BvbG9naWNhbCB0b3AsIHByb3BhZ2F0ZSBwcmludCBmbGFncyB0bwotICAgKiBjaGlsZHJlbi4gIGFsc28sIGNhbGN1bGF0ZSBwcm9wYWdhdGlvbiBmcmFjdGlvbnMuICB0aGlzIGhhcHBlbnMKLSAgICogYmVmb3JlIHRpbWUgcHJvcGFnYXRpb24gc2luY2UgdGltZSBwcm9wYWdhdGlvbiB1c2VzIHRoZQotICAgKiBmcmFjdGlvbnMuCi0gICAqLwotICBwcm9wYWdhdGVfZmxhZ3MgKHRvcF9zb3J0ZWRfc3ltcyk7Ci0KLSAgLyoKLSAgICogU3RhcnRpbmcgZnJvbSB0aGUgdG9wb2xvZ2ljYWwgYm90dG9tLCBwcm9wb2dhdGUgY2hpbGRyZW4gdGltZXMKLSAgICogdXAgdG8gcGFyZW50cy4KLSAgICovCi0gIGN5Y2xlX3RpbWUgKCk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0gICAgewotICAgICAgcHJvcGFnYXRlX3RpbWUgKHRvcF9zb3J0ZWRfc3ltc1tpbmRleF0pOwotICAgIH0KLQotICBmcmVlICh0b3Bfc29ydGVkX3N5bXMpOwotCi0gIC8qCi0gICAqIE5vdywgc29ydCBieSBDRy5QUk9QLlNFTEYgKyBDRy5QUk9QLkNISUxELiAgU29ydGluZyBib3RoIHRoZSByZWd1bGFyCi0gICAqIGZ1bmN0aW9uIG5hbWVzIGFuZCBjeWNsZSBoZWFkZXJzLgotICAgKi8KLSAgdGltZV9zb3J0ZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKChzeW10YWIubGVuICsgbnVtX2N5Y2xlcykgKiBzaXplb2YgKFN5bSAqKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47IGluZGV4KyspCi0gICAgewotICAgICAgdGltZV9zb3J0ZWRfc3ltc1tpbmRleF0gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotICAgIH0KLSAgZm9yIChpbmRleCA9IDE7IGluZGV4IDw9IG51bV9jeWNsZXM7IGluZGV4KyspCi0gICAgewotICAgICAgdGltZV9zb3J0ZWRfc3ltc1tzeW10YWIubGVuICsgaW5kZXggLSAxXSA9ICZjeWNsZV9oZWFkZXJbaW5kZXhdOwotICAgIH0KLSAgcXNvcnQgKHRpbWVfc29ydGVkX3N5bXMsIHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzLCBzaXplb2YgKFN5bSAqKSwKLQkgY21wX3RvdGFsKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbiArIG51bV9jeWNsZXM7IGluZGV4KyspCi0gICAgewotICAgICAgdGltZV9zb3J0ZWRfc3ltc1tpbmRleF0tPmNnLmluZGV4ID0gaW5kZXggKyAxOwotICAgIH0KLSAgcmV0dXJuIHRpbWVfc29ydGVkX3N5bXM7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9jZ19hcmNzLmggYi9ncHJvZi9jZ19hcmNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTAxOTcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfYXJjcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotI2lmbmRlZiBjZ19hcmNzX2gKLSNkZWZpbmUgY2dfYXJjc19oCi0KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0vKgotICogQXJjIHN0cnVjdHVyZSBmb3IgY2FsbC1ncmFwaC4KLSAqCi0gKiBXaXRoIHBvaW50ZXJzIHRvIHRoZSBzeW1ib2xzIG9mIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGlsZCwgYSBjb3VudAotICogb2YgaG93IG1hbnkgdGltZXMgdGhpcyBhcmMgd2FzIHRyYXZlcnNlZCwgYW5kIHBvaW50ZXJzIHRvIHRoZSBuZXh0Ci0gKiBwYXJlbnQgb2YgdGhpcyBjaGlsZCBhbmQgdGhlIG5leHQgY2hpbGQgb2YgdGhpcyBwYXJlbnQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGFyYwotICB7Ci0gICAgU3ltICpwYXJlbnQ7CQkvKiBzb3VyY2UgdmVydGljZSBvZiBhcmMgKi8KLSAgICBTeW0gKmNoaWxkOwkJCS8qIGRlc3QgdmVydGljZSBvZiBhcmMgKi8KLSAgICB1bnNpZ25lZCBsb25nIGNvdW50OwkvKiAjIG9mIGNhbGxzIGZyb20gcGFyZW50IHRvIGNoaWxkICovCi0gICAgZG91YmxlIHRpbWU7CQkvKiB0aW1lIGluaGVyaXRlZCBhbG9uZyBhcmMgKi8KLSAgICBkb3VibGUgY2hpbGRfdGltZTsJCS8qIGNoaWxkLXRpbWUgaW5oZXJpdGVkIGFsb25nIGFyYyAqLwotICAgIHN0cnVjdCBhcmMgKm5leHRfcGFyZW50OwkvKiBuZXh0IHBhcmVudCBvZiBDSElMRCAqLwotICAgIHN0cnVjdCBhcmMgKm5leHRfY2hpbGQ7CS8qIG5leHQgY2hpbGQgb2YgUEFSRU5UICovCi0gICAgaW50IGhhc19iZWVuX3BsYWNlZDsJLyogaGF2ZSB0aGlzIGFyYydzIGZ1bmN0aW9ucyBiZWVuIHBsYWNlZD8gKi8KLSAgfQotQXJjOwotCi1leHRlcm4gdW5zaWduZWQgaW50IG51bV9jeWNsZXM7CS8qIG51bWJlciBvZiBjeWNsZXMgZGlzY292ZXJlZCAqLwotZXh0ZXJuIFN5bSAqY3ljbGVfaGVhZGVyOwkvKiBjeWNsZSBoZWFkZXJzICovCi0KLWV4dGVybiB2b2lkIGFyY19hZGQgUEFSQU1TICgoU3ltICogcGFyZW50LCBTeW0gKiBjaGlsZCwgdW5zaWduZWQgbG9uZyBjb3VudCkpOwotZXh0ZXJuIEFyYyAqYXJjX2xvb2t1cCBQQVJBTVMgKChTeW0gKiBwYXJlbnQsIFN5bSAqIGNoaWxkKSk7Ci1leHRlcm4gU3ltICoqY2dfYXNzZW1ibGUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIEFyYyAqKmFyY3M7Ci1leHRlcm4gdW5zaWduZWQgaW50IG51bWFyY3M7Ci0KLSNlbmRpZiAvKiBjZ19hcmNzX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX2Rmbi5jIGIvZ3Byb2YvY2dfZGZuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZDY0ZTcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfZGZuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNnX2Rmbi5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0KLSNkZWZpbmUJREZOX0lOQ1JfREVQVEggKDEyOCkKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIFN5bSAqc3ltOwotICAgIGludCBjeWNsZV90b3A7Ci0gIH0KLURGTl9TdGFjazsKLQotREZOX1N0YWNrICpkZm5fc3RhY2sgPSBOVUxMOwotaW50IGRmbl9tYXhkZXB0aCA9IDA7Ci1pbnQgZGZuX2RlcHRoID0gMDsKLWludCBkZm5fY291bnRlciA9IERGTl9OQU47Ci0KLQotLyoKLSAqIElzIENISUxEIGFscmVhZHkgbnVtYmVyZWQ/Ci0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAoaXNfbnVtYmVyZWQsIChjaGlsZCksIFN5bSAqIGNoaWxkKQotewotICByZXR1cm4gY2hpbGQtPmNnLnRvcF9vcmRlciAhPSBERk5fTkFOICYmIGNoaWxkLT5jZy50b3Bfb3JkZXIgIT0gREZOX0JVU1k7Ci19Ci0KLQotLyoKLSAqIElzIENISUxEIGFscmVhZHkgYnVzeT8KLSAqLwotc3RhdGljIGJvb2wKLURFRlVOIChpc19idXN5LCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgaWYgKGNoaWxkLT5jZy50b3Bfb3JkZXIgPT0gREZOX05BTikKLSAgICB7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogQ0hJTEQgaXMgcGFydCBvZiBhIGN5Y2xlLiAgRmluZCB0aGUgdG9wIGNhbGxlciBpbnRvIHRoaXMgY3ljbGUKLSAqIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIGN5Y2xlIGFuZCBtYWtlIGFsbCBmdW5jdGlvbnMgaW4gY3ljbGUKLSAqIG1lbWJlcnMgb2YgdGhhdCBjeWNsZSAodG9wIGNhbGxlciA9PSBjYWxsZXIgd2l0aCBzbWFsbGVzdAotICogZGVwdGgtZmlyc3QgbnVtYmVyKS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChmaW5kX2N5Y2xlLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgU3ltICpoZWFkID0gMDsKLSAgU3ltICp0YWlsOwotICBpbnQgY3ljbGVfdG9wOwotICBpbnQgaW5kZXg7Ci0KLSAgZm9yIChjeWNsZV90b3AgPSBkZm5fZGVwdGg7IGN5Y2xlX3RvcCA+IDA7IC0tY3ljbGVfdG9wKQotICAgIHsKLSAgICAgIGhlYWQgPSBkZm5fc3RhY2tbY3ljbGVfdG9wXS5zeW07Ci0gICAgICBpZiAoY2hpbGQgPT0gaGVhZCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IGNoaWxkICYmIGNoaWxkLT5jZy5jeWMuaGVhZCA9PSBoZWFkKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmIChjeWNsZV90b3AgPD0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbZmluZF9jeWNsZV0gY291bGRuJ3QgZmluZCBoZWFkIG9mIGN5Y2xlXG4iKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLSNpZmRlZiBERUJVRwotICBpZiAoZGVidWdfbGV2ZWwgJiBERk5ERUJVRykKLSAgICB7Ci0gICAgICBwcmludGYgKCJbZmluZF9jeWNsZV0gZGZuX2RlcHRoICVkIGN5Y2xlX3RvcCAlZCAiLAotCSAgICAgIGRmbl9kZXB0aCwgY3ljbGVfdG9wKTsKLSAgICAgIGlmIChoZWFkKQotCXsKLQkgIHByaW50X25hbWUgKGhlYWQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCI8dW5rbm93bj4iKTsKLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLSNlbmRpZgotICBpZiAoY3ljbGVfdG9wID09IGRmbl9kZXB0aCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogVGhpcyBpcyBwcmV2aW91cyBmdW5jdGlvbiwgZS5nLiB0aGlzIGNhbGxzIGl0c2VsZi4gIFNvcnQgb2YKLSAgICAgICAqIGJvcmluZy4KLSAgICAgICAqCi0gICAgICAgKiBTaW5jZSB3ZSBhcmUgdGFraW5nIG91dCBzZWxmLWN5Y2xlcyBlbHNld2hlcmUgbm8gbmVlZCBmb3IKLSAgICAgICAqIHRoZSBzcGVjaWFsIGNhc2UsIGhlcmUuCi0gICAgICAgKi8KLSAgICAgIERCRyAoREZOREVCVUcsCi0JICAgcHJpbnRmICgiW2ZpbmRfY3ljbGVdICIpOwotCSAgIHByaW50X25hbWUgKGNoaWxkKTsKLQkgICBwcmludGYgKCJcbiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogR2xvbSBpbnRlcnZlbmluZyBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgYWxyZWFkeSBnbG9tbWVkIGludG8KLSAgICAgICAqIHRoaXMgY3ljbGUuICBUaGluZ3MgaGF2ZSBiZWVuIGdsb21tZWQgd2hlbiB0aGVpciBjeWNsZWhlYWQKLSAgICAgICAqIGZpZWxkIHBvaW50cyB0byB0aGUgaGVhZCBvZiB0aGUgY3ljbGUgdGhleSBhcmUgZ2xvbW1lZAotICAgICAgICogaW50by4KLSAgICAgICAqLwotICAgICAgZm9yICh0YWlsID0gaGVhZDsgdGFpbC0+Y2cuY3ljLm5leHQ7IHRhaWwgPSB0YWlsLT5jZy5jeWMubmV4dCkKLQl7Ci0JICAvKiB2b2lkOiBjaGFzZSBkb3duIHRvIHRhaWwgb2YgdGhpbmdzIGFscmVhZHkgZ2xvbW1lZCAqLwotCSAgREJHIChERk5ERUJVRywKLQkgICAgICAgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIHRhaWwgIik7Ci0JICAgICAgIHByaW50X25hbWUgKHRhaWwpOwotCSAgICAgICBwcmludGYgKCJcbiIpKTsKLQl9Ci0gICAgICAvKgotICAgICAgICogSWYgd2hhdCB3ZSB0aGluayBpcyB0aGUgdG9wIG9mIHRoZSBjeWNsZSBoYXMgYSBjeWNsZWhlYWQKLSAgICAgICAqIGZpZWxkLCB0aGVuIGl0J3Mgbm90IHJlYWxseSB0aGUgaGVhZCBvZiB0aGUgY3ljbGUsIHdoaWNoIGlzCi0gICAgICAgKiByZWFsbHkgd2hhdCB3ZSB3YW50LgotICAgICAgICovCi0gICAgICBpZiAoaGVhZC0+Y2cuY3ljLmhlYWQgIT0gaGVhZCkKLQl7Ci0JICBoZWFkID0gaGVhZC0+Y2cuY3ljLmhlYWQ7Ci0JICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbZmluZF9jeWNsZV0gbmV3IGN5Y2xlaGVhZCAiKTsKLQkgICAgICAgcHJpbnRfbmFtZSAoaGVhZCk7Ci0JICAgICAgIHByaW50ZiAoIlxuIikpOwotCX0KLSAgICAgIGZvciAoaW5kZXggPSBjeWNsZV90b3AgKyAxOyBpbmRleCA8PSBkZm5fZGVwdGg7ICsraW5kZXgpCi0JewotCSAgY2hpbGQgPSBkZm5fc3RhY2tbaW5kZXhdLnN5bTsKLQkgIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgPT0gY2hpbGQpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIE5vdCB5ZXQgZ2xvbW1lZCBhbnl3aGVyZSwgZ2xvbSBpdCBhbmQgZml4IGFueQotCSAgICAgICAqIGNoaWxkcmVuIGl0IGhhcyBnbG9tbWVkLgotCSAgICAgICAqLwotCSAgICAgIHRhaWwtPmNnLmN5Yy5uZXh0ID0gY2hpbGQ7Ci0JICAgICAgY2hpbGQtPmNnLmN5Yy5oZWFkID0gaGVhZDsKLQkgICAgICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbZmluZF9jeWNsZV0gZ2xvbW1pbmcgIik7Ci0JCSAgIHByaW50X25hbWUgKGNoaWxkKTsKLQkJICAgcHJpbnRmICgiIG9udG8gIik7Ci0JCSAgIHByaW50X25hbWUgKGhlYWQpOwotCQkgICBwcmludGYgKCJcbiIpKTsKLQkgICAgICBmb3IgKHRhaWwgPSBjaGlsZDsgdGFpbC0+Y2cuY3ljLm5leHQ7IHRhaWwgPSB0YWlsLT5jZy5jeWMubmV4dCkKLQkJewotCQkgIHRhaWwtPmNnLmN5Yy5uZXh0LT5jZy5jeWMuaGVhZCA9IGhlYWQ7Ci0JCSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIGFuZCBpdHMgdGFpbCAiKTsKLQkJICAgICAgIHByaW50X25hbWUgKHRhaWwtPmNnLmN5Yy5uZXh0KTsKLQkJICAgICAgIHByaW50ZiAoIiBvbnRvICIpOwotCQkgICAgICAgcHJpbnRfbmFtZSAoaGVhZCk7Ci0JCSAgICAgICBwcmludGYgKCJcbiIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gaGVhZCAvKiBmaXJld2FsbCAqLyApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJbZmluZF9jeWNsZV0gZ2xvbW1lZCwgYnV0IG5vdCB0byBoZWFkXG4iKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIFByZXBhcmUgZm9yIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiBQQVJFTlQuICBQdXNoIGEgcGFyZW50IG9udG8KLSAqIHRoZSBzdGFjayBhbmQgbWFyayBpdCBidXN5LgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHByZV92aXNpdCwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgKytkZm5fZGVwdGg7Ci0KLSAgaWYgKGRmbl9kZXB0aCA+PSBkZm5fbWF4ZGVwdGgpCi0gICAgewotICAgICAgZGZuX21heGRlcHRoICs9IERGTl9JTkNSX0RFUFRIOwotICAgICAgZGZuX3N0YWNrID0geHJlYWxsb2MgKGRmbl9zdGFjaywgZGZuX21heGRlcHRoICogc2l6ZW9mICpkZm5fc3RhY2spOwotICAgIH0KLQotICBkZm5fc3RhY2tbZGZuX2RlcHRoXS5zeW0gPSBwYXJlbnQ7Ci0gIGRmbl9zdGFja1tkZm5fZGVwdGhdLmN5Y2xlX3RvcCA9IGRmbl9kZXB0aDsKLSAgcGFyZW50LT5jZy50b3Bfb3JkZXIgPSBERk5fQlVTWTsKLSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3ByZV92aXNpdF1cdFx0JWQ6IiwgZGZuX2RlcHRoKTsKLSAgICAgICBwcmludF9uYW1lIChwYXJlbnQpOwotICAgICAgIHByaW50ZiAoIlxuIikpOwotfQotCi0KLS8qCi0gKiBEb25lIHdpdGggdmlzaXRpbmcgbm9kZSBQQVJFTlQuICBQb3AgUEFSRU5UIG9mZiBkZm5fc3RhY2sKLSAqIGFuZCBudW1iZXIgZnVuY3Rpb25zIGlmIFBBUkVOVCBpcyBoZWFkIG9mIGEgY3ljbGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocG9zdF92aXNpdCwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgU3ltICptZW1iZXI7Ci0KLSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3Bvc3RfdmlzaXRdXHQlZDogIiwgZGZuX2RlcHRoKTsKLSAgICAgICBwcmludF9uYW1lIChwYXJlbnQpOwotICAgICAgIHByaW50ZiAoIlxuIikpOwotICAvKgotICAgKiBOdW1iZXIgZnVuY3Rpb25zIGFuZCB0aGluZ3MgaW4gdGhlaXIgY3ljbGVzIHVubGVzcyB0aGUgZnVuY3Rpb24KLSAgICogaXMgaXRzZWxmIHBhcnQgb2YgYSBjeWNsZToKLSAgICovCi0gIGlmIChwYXJlbnQtPmNnLmN5Yy5oZWFkID09IHBhcmVudCkKLSAgICB7Ci0gICAgICArK2Rmbl9jb3VudGVyOwotICAgICAgZm9yIChtZW1iZXIgPSBwYXJlbnQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBtZW1iZXItPmNnLnRvcF9vcmRlciA9IGRmbl9jb3VudGVyOwotCSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3Bvc3RfdmlzaXRdXHRcdG1lbWJlciAiKTsKLQkgICAgICAgcHJpbnRfbmFtZSAobWVtYmVyKTsKLQkgICAgICAgcHJpbnRmICgiLT4gY2cudG9wX29yZGVyID0gJWRcbiIsIGRmbl9jb3VudGVyKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltwb3N0X3Zpc2l0XVx0XHRpcyBwYXJ0IG9mIGEgY3ljbGVcbiIpKTsKLSAgICB9Ci0gIC0tZGZuX2RlcHRoOwotfQotCi0KLS8qCi0gKiBHaXZlbiB0aGlzIFBBUkVOVCwgZGVwdGggZmlyc3QgbnVtYmVyIGl0cyBjaGlsZHJlbi4KLSAqLwotdm9pZAotREVGVU4gKGNnX2RmbiwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgQXJjICphcmM7Ci0KLSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2Rmbl0gZGZuKCAiKTsKLSAgICAgICBwcmludF9uYW1lIChwYXJlbnQpOwotICAgICAgIHByaW50ZiAoIilcbiIpKTsKLSAgLyoKLSAgICogSWYgd2UncmUgYWxyZWFkeSBudW1iZXJlZCwgbm8gbmVlZCB0byBsb29rIGFueSBmdXJ0aGVyOgotICAgKi8KLSAgaWYgKGlzX251bWJlcmVkIChwYXJlbnQpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qCi0gICAqIElmIHdlJ3JlIGFscmVhZHkgYnVzeSwgbXVzdCBiZSBhIGN5Y2xlOgotICAgKi8KLSAgaWYgKGlzX2J1c3kgKHBhcmVudCkpCi0gICAgewotICAgICAgZmluZF9jeWNsZSAocGFyZW50KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHByZV92aXNpdCAocGFyZW50KTsKLSAgLyoKLSAgICogUmVjdXJzaXZlbHkgdmlzaXQgY2hpbGRyZW46Ci0gICAqLwotICBmb3IgKGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotICAgIHsKLSAgICAgIGNnX2RmbiAoYXJjLT5jaGlsZCk7Ci0gICAgfQotICBwb3N0X3Zpc2l0IChwYXJlbnQpOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfZGZuLmggYi9ncHJvZi9jZ19kZm4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMzAzMC4uMDAwMDAwMAotLS0gYS9ncHJvZi9jZ19kZm4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpZm5kZWYgY2dfZGZuX2gKLSNkZWZpbmUgY2dfZGZuX2gKLQotLyoKLSAqIEZsYWdzIHdoaWNoIG1hcmsgYSBzeW1ib2wgYXMgdG9wb2xvZ2ljYWxseSBgYGJ1c3knJyBvciBhcwotICogdG9wb2xvZ2ljYWxseSBgYG5vdF9udW1iZXJlZCcnOgotICovCi0jZGVmaW5lCURGTl9CVVNZCS0xCi0jZGVmaW5lCURGTl9OQU4JCTAKLQotLyoKLSAqIERlcHRoLWZpcnN0IG51bWJlcmluZyBvZiBhIGNhbGwtZ3JhcGguCi0gKi8KLQotZXh0ZXJuIHZvaWQgY2dfZGZuIFBBUkFNUyAoKFN5bSAqIHJvb3QpKTsKLQotI2VuZGlmIC8qIGNnX2Rmbl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jZ19wcmludC5jIGIvZ3Byb2YvY2dfcHJpbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0NWJjNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9jZ19wcmludC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI3NiArMCwwIEBACi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNnX3ByaW50LmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0KLS8qCi0gKiBSZXR1cm4gdmFsdWUgb2YgY29tcGFyaXNvbiBmdW5jdGlvbnMgdXNlZCB0byBzb3J0IHRhYmxlczoKLSAqLwotI2RlZmluZQlMRVNTVEhBTgktMQotI2RlZmluZQlFUVVBTFRPCQkwCi0jZGVmaW5lCUdSRUFURVJUSEFOCTEKLQotc3RhdGljIHZvaWQgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgUEFSQU1TICgoQXJjICoqLCB1bnNpZ25lZCBsb25nLAotCQkJCQkJICAgICAgaW50LCBBcmMgKiosCi0JCQkJCQkgICAgICB1bnNpZ25lZCBsb25nICopKTsKLS8qIGRlY2xhcmF0aW9ucyBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmdW5jdGlvbnMgdG8gb3V0cHV0IGJsdXJiczogKi8KLWV4dGVybiB2b2lkIGJzZF9jYWxsZ19ibHVyYiBQQVJBTVMgKChGSUxFICogZnApKTsKLWV4dGVybiB2b2lkIGZzZl9jYWxsZ19ibHVyYiBQQVJBTVMgKChGSUxFICogZnApKTsKLQotZG91YmxlIHByaW50X3RpbWUgPSAwLjA7Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQgKHByaW50X2hlYWRlcikKLXsKLSAgaWYgKGZpcnN0X291dHB1dCkKLSAgICB7Ci0gICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCJcZlxuIik7Ci0gICAgfQotICBpZiAoIWJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucykKLQl7Ci0JICBwcmludGYgKF8oIlx0XHQgICAgIENhbGwgZ3JhcGggKGV4cGxhbmF0aW9uIGZvbGxvd3MpXG5cbiIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmIChfKCJcdFx0XHRDYWxsIGdyYXBoXG5cbiIpKTsKLQl9Ci0gICAgfQotICBwcmludGYgKF8oIlxuZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgJWxkIGJ5dGUocykiKSwKLQkgIChsb25nKSBoaXN0X3NjYWxlICogc2l6ZW9mIChVTklUKSk7Ci0gIGlmIChwcmludF90aW1lID4gMC4wKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiIGZvciAlLjJmJSUgb2YgJS4yZiBzZWNvbmRzXG5cbiIpLAotCSAgICAgIDEwMC4wIC8gcHJpbnRfdGltZSwgcHJpbnRfdGltZSAvIGh6KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiBubyB0aW1lIHByb3BhZ2F0ZWRcblxuIikpOwotICAgICAgLyoKLSAgICAgICAqIFRoaXMgZG9lc24ndCBodXJ0LCBzaW5jZSBhbGwgdGhlIG51bWVyYXRvcnMgd2lsbCBiZSAwLjA6Ci0gICAgICAgKi8KLSAgICAgIHByaW50X3RpbWUgPSAxLjA7Ci0gICAgfQotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzLyUtNy43cyAgICAgJS04LjhzXG4iLAotCSAgICAgICIiLCAiIiwgIiIsICIiLCBfKCJjYWxsZWQiKSwgXygidG90YWwiKSwgXygicGFyZW50cyIpKTsKLSAgICAgIHByaW50ZiAoIiUtNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzKyUtNy43cyAlLTguOHNcdCU1LjVzXG4iLAotCSAgICAgIF8oImluZGV4IiksIF8oIiV0aW1lIiksIF8oInNlbGYiKSwgXygiZGVzY2VuZGVudHMiKSwKLQkgICAgICBfKCJjYWxsZWQiKSwgXygic2VsZiIpLCBfKCJuYW1lIiksIF8oImluZGV4IikpOwotICAgICAgcHJpbnRmICgiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cy8lLTcuN3MgICAgICUtOC44c1xuIiwKLQkgICAgICAiIiwgIiIsICIiLCAiIiwgXygiY2FsbGVkIiksIF8oInRvdGFsIiksIF8oImNoaWxkcmVuIikpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oImluZGV4ICUlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lXG4iKSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBQcmludCBhIGN5Y2xlIGhlYWRlci4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9jeWNsZSwgKGN5YyksIFN5bSAqIGN5YykKLXsKLSAgY2hhciBidWZbQlVGU0laXTsKLQotICBzcHJpbnRmIChidWYsICJbJWRdIiwgY3ljLT5jZy5pbmRleCk7Ci0gIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCSAgPyAiJS02LjZzICU1LjFmICU3LjJmICUxMS4yZiAlN2x1IgotCSAgOiAiJS02LjZzICU1LjFmICU3LjJmICU3LjJmICU3bHUiLCBidWYsCi0JICAxMDAgKiAoY3ljLT5jZy5wcm9wLnNlbGYgKyBjeWMtPmNnLnByb3AuY2hpbGQpIC8gcHJpbnRfdGltZSwKLQkgIGN5Yy0+Y2cucHJvcC5zZWxmIC8gaHosIGN5Yy0+Y2cucHJvcC5jaGlsZCAvIGh6LCBjeWMtPm5jYWxscyk7Ci0gIGlmIChjeWMtPmNnLnNlbGZfY2FsbHMgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIrJS03bHUiLCBjeWMtPmNnLnNlbGZfY2FsbHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAlNy43cyIsICIiKTsKLSAgICB9Ci0gIHByaW50ZiAoXygiIDxjeWNsZSAlZCBhcyBhIHdob2xlPiBbJWRdXG4iKSwgY3ljLT5jZy5jeWMubnVtLCBjeWMtPmNnLmluZGV4KTsKLX0KLQotCi0vKgotICogQ29tcGFyZSBMRUZUIGFuZCBSSUdIVCBtZW1ibWVyLiAgTWFqb3IgY29tcGFyaXNvbiBrZXkgaXMKLSAqIENHLlBST1AuU0VMRitDRy5QUk9QLkNISUxELCBzZWNvbmRhcnkga2V5IGlzIE5DQUxMUytDRy5TRUxGX0NBTExTLgotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX21lbWJlciwgKGxlZnQsIHJpZ2h0KSwgU3ltICogbGVmdCBBTkQgU3ltICogcmlnaHQpCi17Ci0gIGRvdWJsZSBsZWZ0X3RpbWUgPSBsZWZ0LT5jZy5wcm9wLnNlbGYgKyBsZWZ0LT5jZy5wcm9wLmNoaWxkOwotICBkb3VibGUgcmlnaHRfdGltZSA9IHJpZ2h0LT5jZy5wcm9wLnNlbGYgKyByaWdodC0+Y2cucHJvcC5jaGlsZDsKLSAgdW5zaWduZWQgbG9uZyBsZWZ0X2NhbGxzID0gbGVmdC0+bmNhbGxzICsgbGVmdC0+Y2cuc2VsZl9jYWxsczsKLSAgdW5zaWduZWQgbG9uZyByaWdodF9jYWxscyA9IHJpZ2h0LT5uY2FsbHMgKyByaWdodC0+Y2cuc2VsZl9jYWxsczsKLQotICBpZiAobGVmdF90aW1lID4gcmlnaHRfdGltZSkKLSAgICB7Ci0gICAgICByZXR1cm4gR1JFQVRFUlRIQU47Ci0gICAgfQotICBpZiAobGVmdF90aW1lIDwgcmlnaHRfdGltZSkKLSAgICB7Ci0gICAgICByZXR1cm4gTEVTU1RIQU47Ci0gICAgfQotCi0gIGlmIChsZWZ0X2NhbGxzID4gcmlnaHRfY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwotICAgIH0KLSAgaWYgKGxlZnRfY2FsbHMgPCByaWdodF9jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gTEVTU1RIQU47Ci0gICAgfQotICByZXR1cm4gRVFVQUxUTzsKLX0KLQotCi0vKgotICogU29ydCBtZW1iZXJzIG9mIGEgY3ljbGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoc29ydF9tZW1iZXJzLCAoY3ljKSwgU3ltICogY3ljKQotewotICBTeW0gKnRvZG8sICpkb2luZywgKnByZXY7Ci0gIC8qCi0gICAqIERldGFjaCBjeWNsZSBtZW1iZXJzIGZyb20gY3ljbGVoZWFkLCBhbmQgaW5zZXJ0aW9uIHNvcnQgdGhlbQotICAgKiBiYWNrIG9uLgotICAgKi8KLSAgdG9kbyA9IGN5Yy0+Y2cuY3ljLm5leHQ7Ci0gIGN5Yy0+Y2cuY3ljLm5leHQgPSAwOwotICBmb3IgKGRvaW5nID0gdG9kbzsgZG9pbmcgJiYgZG9pbmctPmNnLmN5Yy5uZXh0OyBkb2luZyA9IHRvZG8pCi0gICAgewotICAgICAgdG9kbyA9IGRvaW5nLT5jZy5jeWMubmV4dDsKLSAgICAgIGZvciAocHJldiA9IGN5YzsgcHJldi0+Y2cuY3ljLm5leHQ7IHByZXYgPSBwcmV2LT5jZy5jeWMubmV4dCkKLQl7Ci0JICBpZiAoY21wX21lbWJlciAoZG9pbmcsIHByZXYtPmNnLmN5Yy5uZXh0KSA9PSBHUkVBVEVSVEhBTikKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZG9pbmctPmNnLmN5Yy5uZXh0ID0gcHJldi0+Y2cuY3ljLm5leHQ7Ci0gICAgICBwcmV2LT5jZy5jeWMubmV4dCA9IGRvaW5nOwotICAgIH0KLX0KLQotCi0vKgotICogUHJpbnQgdGhlIG1lbWJlcnMgb2YgYSBjeWNsZS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9tZW1iZXJzLCAoY3ljKSwgU3ltICogY3ljKQotewotICBTeW0gKm1lbWJlcjsKLQotICBzb3J0X21lbWJlcnMgKGN5Yyk7Ci0gIGZvciAobWVtYmVyID0gY3ljLT5jZy5jeWMubmV4dDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotICAgIHsKLSAgICAgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCSAgICAgID8gIiU2LjZzICU1LjVzICU3LjJmICUxMS4yZiAlN2x1IgotCSAgICAgIDogIiU2LjZzICU1LjVzICU3LjJmICU3LjJmICU3bHUiLAotCSAgICAgICIiLCAiIiwgbWVtYmVyLT5jZy5wcm9wLnNlbGYgLyBoeiwgbWVtYmVyLT5jZy5wcm9wLmNoaWxkIC8gaHosCi0JICAgICAgbWVtYmVyLT5uY2FsbHMpOwotICAgICAgaWYgKG1lbWJlci0+Y2cuc2VsZl9jYWxscyAhPSAwKQotCXsKLQkgIHByaW50ZiAoIislLTdsdSIsIG1lbWJlci0+Y2cuc2VsZl9jYWxscyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIiAlNy43cyIsICIiKTsKLQl9Ci0gICAgICBwcmludGYgKCIgICAgICIpOwotICAgICAgcHJpbnRfbmFtZSAobWVtYmVyKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDb21wYXJlIHR3byBhcmNzIHRvL2Zyb20gdGhlIHNhbWUgY2hpbGQvcGFyZW50LgotICogICAgICAtIGlmIG9uZSBhcmMgaXMgYSBzZWxmIGFyYywgaXQncyBsZWFzdC4KLSAqICAgICAgLSBpZiBvbmUgYXJjIGlzIHdpdGhpbiBhIGN5Y2xlLCBpdCdzIGxlc3MgdGhhbi4KLSAqICAgICAgLSBpZiBib3RoIGFyY3MgYXJlIHdpdGhpbiBhIGN5Y2xlLCBjb21wYXJlIGFyYyBjb3VudHMuCi0gKiAgICAgIC0gaWYgbmVpdGhlciBhcmMgaXMgd2l0aGluIGEgY3ljbGUsIGNvbXBhcmUgd2l0aAotICogICAgICAgICAgICAgIHRpbWUgKyBjaGlsZF90aW1lIGFzIG1ham9yIGtleQotICogICAgICAgICAgICAgIGFyYyBjb3VudCBhcyBtaW5vciBrZXkKLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF9hcmMsIChsZWZ0LCByaWdodCksIEFyYyAqIGxlZnQgQU5EIEFyYyAqIHJpZ2h0KQotewotICBTeW0gKmxlZnRfcGFyZW50ID0gbGVmdC0+cGFyZW50OwotICBTeW0gKmxlZnRfY2hpbGQgPSBsZWZ0LT5jaGlsZDsKLSAgU3ltICpyaWdodF9wYXJlbnQgPSByaWdodC0+cGFyZW50OwotICBTeW0gKnJpZ2h0X2NoaWxkID0gcmlnaHQtPmNoaWxkOwotICBkb3VibGUgbGVmdF90aW1lLCByaWdodF90aW1lOwotCi0gIERCRyAoVElNRURFQlVHLAotICAgICAgIHByaW50ZiAoIltjbXBfYXJjXSAiKTsKLSAgICAgICBwcmludF9uYW1lIChsZWZ0X3BhcmVudCk7Ci0gICAgICAgcHJpbnRmICgiIGNhbGxzICIpOwotICAgICAgIHByaW50X25hbWUgKGxlZnRfY2hpbGQpOwotICAgICAgIHByaW50ZiAoIiAlZiArICVmICVsdS8lbHVcbiIsIGxlZnQtPnRpbWUsIGxlZnQtPmNoaWxkX3RpbWUsCi0JICAgICAgIGxlZnQtPmNvdW50LCBsZWZ0X2NoaWxkLT5uY2FsbHMpOwotICAgICAgIHByaW50ZiAoIltjbXBfYXJjXSAiKTsKLSAgICAgICBwcmludF9uYW1lIChyaWdodF9wYXJlbnQpOwotICAgICAgIHByaW50ZiAoIiBjYWxscyAiKTsKLSAgICAgICBwcmludF9uYW1lIChyaWdodF9jaGlsZCk7Ci0gICAgICAgcHJpbnRmICgiICVmICsgJWYgJWx1LyVsdVxuIiwgcmlnaHQtPnRpbWUsIHJpZ2h0LT5jaGlsZF90aW1lLAotCSAgICAgICByaWdodC0+Y291bnQsIHJpZ2h0X2NoaWxkLT5uY2FsbHMpOwotICAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgKTsKLSAgaWYgKGxlZnRfcGFyZW50ID09IGxlZnRfY2hpbGQpCi0gICAgewotICAgICAgcmV0dXJuIExFU1NUSEFOOwkJLyogbGVmdCBpcyBhIHNlbGYgY2FsbCAqLwotICAgIH0KLSAgaWYgKHJpZ2h0X3BhcmVudCA9PSByaWdodF9jaGlsZCkKLSAgICB7Ci0gICAgICByZXR1cm4gR1JFQVRFUlRIQU47CS8qIHJpZ2h0IGlzIGEgc2VsZiBjYWxsICovCi0gICAgfQotCi0gIGlmIChsZWZ0X3BhcmVudC0+Y2cuY3ljLm51bSAhPSAwICYmIGxlZnRfY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAotICAgICAgJiYgbGVmdF9wYXJlbnQtPmNnLmN5Yy5udW0gPT0gbGVmdF9jaGlsZC0+Y2cuY3ljLm51bSkKLSAgICB7Ci0gICAgICAvKiBsZWZ0IGlzIGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLwotICAgICAgaWYgKHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSAhPSAwICYmIHJpZ2h0X2NoaWxkLT5jZy5jeWMubnVtICE9IDAKLQkgICYmIHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSA9PSByaWdodF9jaGlsZC0+Y2cuY3ljLm51bSkKLQl7Ci0JICAvKiByaWdodCBpcyBhIGNhbGwgd2l0aGluIHRoZSBjeWNsZSwgdG9vICovCi0JICBpZiAobGVmdC0+Y291bnQgPCByaWdodC0+Y291bnQpCi0JICAgIHsKLQkgICAgICByZXR1cm4gTEVTU1RIQU47Ci0JICAgIH0KLQkgIGlmIChsZWZ0LT5jb3VudCA+IHJpZ2h0LT5jb3VudCkKLQkgICAgewotCSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKLQkgICAgfQotCSAgcmV0dXJuIEVRVUFMVE87Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHJpZ2h0IGlzbid0IGEgY2FsbCB3aXRoaW4gdGhlIGN5Y2xlICovCi0JICByZXR1cm4gTEVTU1RIQU47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGxlZnQgaXNuJ3QgYSBjYWxsIHdpdGhpbiBhIGN5Y2xlICovCi0gICAgICBpZiAocmlnaHRfcGFyZW50LT5jZy5jeWMubnVtICE9IDAgJiYgcmlnaHRfY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAotCSAgJiYgcmlnaHRfcGFyZW50LT5jZy5jeWMubnVtID09IHJpZ2h0X2NoaWxkLT5jZy5jeWMubnVtKQotCXsKLQkgIC8qIHJpZ2h0IGlzIGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLwotCSAgcmV0dXJuIEdSRUFURVJUSEFOOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBuZWl0aGVyIGlzIGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLwotCSAgbGVmdF90aW1lID0gbGVmdC0+dGltZSArIGxlZnQtPmNoaWxkX3RpbWU7Ci0JICByaWdodF90aW1lID0gcmlnaHQtPnRpbWUgKyByaWdodC0+Y2hpbGRfdGltZTsKLQkgIGlmIChsZWZ0X3RpbWUgPCByaWdodF90aW1lKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIExFU1NUSEFOOwotCSAgICB9Ci0JICBpZiAobGVmdF90aW1lID4gcmlnaHRfdGltZSkKLQkgICAgewotCSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKLQkgICAgfQotCSAgaWYgKGxlZnQtPmNvdW50IDwgcmlnaHQtPmNvdW50KQotCSAgICB7Ci0JICAgICAgcmV0dXJuIExFU1NUSEFOOwotCSAgICB9Ci0JICBpZiAobGVmdC0+Y291bnQgPiByaWdodC0+Y291bnQpCi0JICAgIHsKLQkgICAgICByZXR1cm4gR1JFQVRFUlRIQU47Ci0JICAgIH0KLQkgIHJldHVybiBFUVVBTFRPOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChzb3J0X3BhcmVudHMsIChjaGlsZCksIFN5bSAqIGNoaWxkKQotewotICBBcmMgKmFyYywgKmRldGFjaGVkLCBzb3J0ZWQsICpwcmV2OwotCi0gIC8qCi0gICAqIFVubGluayBwYXJlbnRzIGZyb20gY2hpbGQsIHRoZW4gaW5zZXJ0aW9uIHNvcnQgYmFjayBvbiB0bwotICAgKiBzb3J0ZWQncyBwYXJlbnRzLgotICAgKiAgICAgICphcmMgICAgICAgIHRoZSBhcmMgeW91IGhhdmUgZGV0YWNoZWQgYW5kIGFyZSBpbnNlcnRpbmcuCi0gICAqICAgICAgKmRldGFjaGVkICAgdGhlIHJlc3Qgb2YgdGhlIGFyY3MgdG8gYmUgc29ydGVkLgotICAgKiAgICAgIHNvcnRlZCAgICAgIGFyYyBsaXN0IG9udG8gd2hpY2ggeW91IGluc2VydGlvbiBzb3J0LgotICAgKiAgICAgICpwcmV2ICAgICAgIGFyYyBiZWZvcmUgdGhlIGFyYyB5b3UgYXJlIGNvbXBhcmluZy4KLSAgICovCi0gIHNvcnRlZC5uZXh0X3BhcmVudCA9IDA7Ci0gIGZvciAoYXJjID0gY2hpbGQtPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gZGV0YWNoZWQpCi0gICAgewotICAgICAgZGV0YWNoZWQgPSBhcmMtPm5leHRfcGFyZW50OwotCi0gICAgICAvKiBjb25zaWRlciAqYXJjIGFzIGRpc2Nvbm5lY3RlZDsgaW5zZXJ0IGl0IGludG8gc29ydGVkOiAqLwotICAgICAgZm9yIChwcmV2ID0gJnNvcnRlZDsgcHJldi0+bmV4dF9wYXJlbnQ7IHByZXYgPSBwcmV2LT5uZXh0X3BhcmVudCkKLQl7Ci0JICBpZiAoY21wX2FyYyAoYXJjLCBwcmV2LT5uZXh0X3BhcmVudCkgIT0gR1JFQVRFUlRIQU4pCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGFyYy0+bmV4dF9wYXJlbnQgPSBwcmV2LT5uZXh0X3BhcmVudDsKLSAgICAgIHByZXYtPm5leHRfcGFyZW50ID0gYXJjOwotICAgIH0KLQotICAvKiByZWF0dGFjaCBzb3J0ZWQgYXJjcyB0byBjaGlsZDogKi8KLSAgY2hpbGQtPmNnLnBhcmVudHMgPSBzb3J0ZWQubmV4dF9wYXJlbnQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9wYXJlbnRzLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgU3ltICpwYXJlbnQ7Ci0gIEFyYyAqYXJjOwotICBTeW0gKmN5Y2xlX2hlYWQ7Ci0KLSAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSAwKQotICAgIHsKLSAgICAgIGN5Y2xlX2hlYWQgPSBjaGlsZC0+Y2cuY3ljLmhlYWQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY3ljbGVfaGVhZCA9IGNoaWxkOwotICAgIH0KLSAgaWYgKCFjaGlsZC0+Y2cucGFyZW50cykKLSAgICB7Ci0gICAgICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkgICAgICA/IF8oIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIpCi0JICAgICAgOiBfKCIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlNy43cyAlNy43cyAgICAgPHNwb250YW5lb3VzPlxuIiksCi0JICAgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBzb3J0X3BhcmVudHMgKGNoaWxkKTsKLSAgZm9yIChhcmMgPSBjaGlsZC0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBhcmMtPm5leHRfcGFyZW50KQotICAgIHsKLSAgICAgIHBhcmVudCA9IGFyYy0+cGFyZW50OwotICAgICAgaWYgKGNoaWxkID09IHBhcmVudCB8fCAoY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAotCQkJICAgICAgJiYgcGFyZW50LT5jZy5jeWMubnVtID09IGNoaWxkLT5jZy5jeWMubnVtKSkKLQl7Ci0JICAvKiBzZWxmY2FsbCBvciBjYWxsIGFtb25nIHNpYmxpbmdzOiAqLwotCSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JCSAgPyAiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlN2x1ICU3LjdzICAgICAiCi0JCSAgOiAiJTYuNnMgJTUuNXMgJTcuN3MgJTcuN3MgJTdsdSAlNy43cyAgICAgIiwKLQkJICAiIiwgIiIsICIiLCAiIiwKLQkJICBhcmMtPmNvdW50LCAiIik7Ci0JICBwcmludF9uYW1lIChwYXJlbnQpOwotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogcmVndWxhciBwYXJlbnQgb2YgY2hpbGQ6ICovCi0JICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkJICA/ICIlNi42cyAlNS41cyAlNy4yZiAlMTEuMmYgJTdsdS8lLTdsdSAgICAgIgotCQkgIDogIiU2LjZzICU1LjVzICU3LjJmICU3LjJmICU3bHUvJS03bHUgICAgICIsCi0JCSAgIiIsICIiLAotCQkgIGFyYy0+dGltZSAvIGh6LCBhcmMtPmNoaWxkX3RpbWUgLyBoeiwKLQkJICBhcmMtPmNvdW50LCBjeWNsZV9oZWFkLT5uY2FsbHMpOwotCSAgcHJpbnRfbmFtZSAocGFyZW50KTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHNvcnRfY2hpbGRyZW4sIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gIEFyYyAqYXJjLCAqZGV0YWNoZWQsIHNvcnRlZCwgKnByZXY7Ci0gIC8qCi0gICAqIFVubGluayBjaGlsZHJlbiBmcm9tIHBhcmVudCwgdGhlbiBpbnNlcnRpb24gc29ydCBiYWNrIG9uIHRvCi0gICAqIHNvcnRlZCdzIGNoaWxkcmVuLgotICAgKiAgICAgICphcmMgICAgICAgIHRoZSBhcmMgeW91IGhhdmUgZGV0YWNoZWQgYW5kIGFyZSBpbnNlcnRpbmcuCi0gICAqICAgICAgKmRldGFjaGVkICAgdGhlIHJlc3Qgb2YgdGhlIGFyY3MgdG8gYmUgc29ydGVkLgotICAgKiAgICAgIHNvcnRlZCAgICAgIGFyYyBsaXN0IG9udG8gd2hpY2ggeW91IGluc2VydGlvbiBzb3J0LgotICAgKiAgICAgICpwcmV2ICAgICAgIGFyYyBiZWZvcmUgdGhlIGFyYyB5b3UgYXJlIGNvbXBhcmluZy4KLSAgICovCi0gIHNvcnRlZC5uZXh0X2NoaWxkID0gMDsKLSAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGRldGFjaGVkKQotICAgIHsKLSAgICAgIGRldGFjaGVkID0gYXJjLT5uZXh0X2NoaWxkOwotCi0gICAgICAvKiBjb25zaWRlciAqYXJjIGFzIGRpc2Nvbm5lY3RlZDsgaW5zZXJ0IGl0IGludG8gc29ydGVkOiAqLwotICAgICAgZm9yIChwcmV2ID0gJnNvcnRlZDsgcHJldi0+bmV4dF9jaGlsZDsgcHJldiA9IHByZXYtPm5leHRfY2hpbGQpCi0JewotCSAgaWYgKGNtcF9hcmMgKGFyYywgcHJldi0+bmV4dF9jaGlsZCkgIT0gTEVTU1RIQU4pCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGFyYy0+bmV4dF9jaGlsZCA9IHByZXYtPm5leHRfY2hpbGQ7Ci0gICAgICBwcmV2LT5uZXh0X2NoaWxkID0gYXJjOwotICAgIH0KLQotICAvKiByZWF0dGFjaCBzb3J0ZWQgY2hpbGRyZW4gdG8gcGFyZW50OiAqLwotICBwYXJlbnQtPmNnLmNoaWxkcmVuID0gc29ydGVkLm5leHRfY2hpbGQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9jaGlsZHJlbiwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgU3ltICpjaGlsZDsKLSAgQXJjICphcmM7Ci0KLSAgc29ydF9jaGlsZHJlbiAocGFyZW50KTsKLSAgYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsKLSAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IGFyYy0+Y2hpbGQ7Ci0gICAgICBpZiAoY2hpbGQgPT0gcGFyZW50IHx8IChjaGlsZC0+Y2cuY3ljLm51bSAhPSAwCi0JCQkgICAgICAmJiBjaGlsZC0+Y2cuY3ljLm51bSA9PSBwYXJlbnQtPmNnLmN5Yy5udW0pKQotCXsKLQkgIC8qIHNlbGYgY2FsbCBvciBjYWxsIHRvIHNpYmxpbmc6ICovCi0JICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkJICA/ICIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3bHUgJTcuN3MgICAgICIKLQkJICA6ICIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlN2x1ICU3LjdzICAgICAiLAotCQkgICIiLCAiIiwgIiIsICIiLCBhcmMtPmNvdW50LCAiIik7Ci0JICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiByZWd1bGFyIGNoaWxkIG9mIHBhcmVudDogKi8KLQkgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCQkgID8gIiU2LjZzICU1LjVzICU3LjJmICUxMS4yZiAlN2x1LyUtN2x1ICAgICAiCi0JCSAgOiAiJTYuNnMgJTUuNXMgJTcuMmYgJTcuMmYgJTdsdS8lLTdsdSAgICAgIiwKLQkJICAiIiwgIiIsCi0JCSAgYXJjLT50aW1lIC8gaHosIGFyYy0+Y2hpbGRfdGltZSAvIGh6LAotCQkgIGFyYy0+Y291bnQsIGNoaWxkLT5jZy5jeWMuaGVhZC0+bmNhbGxzKTsKLQkgIHByaW50X25hbWUgKGNoaWxkKTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X2xpbmUsIChucCksIFN5bSAqIG5wKQotewotICBjaGFyIGJ1ZltCVUZTSVpdOwotCi0gIHNwcmludGYgKGJ1ZiwgIlslZF0iLCBucC0+Y2cuaW5kZXgpOwotICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkgID8gIiUtNi42cyAlNS4xZiAlNy4yZiAlMTEuMmYiCi0JICA6ICIlLTYuNnMgJTUuMWYgJTcuMmYgJTcuMmYiLCBidWYsCi0JICAxMDAgKiAobnAtPmNnLnByb3Auc2VsZiArIG5wLT5jZy5wcm9wLmNoaWxkKSAvIHByaW50X3RpbWUsCi0JICBucC0+Y2cucHJvcC5zZWxmIC8gaHosIG5wLT5jZy5wcm9wLmNoaWxkIC8gaHopOwotICBpZiAoKG5wLT5uY2FsbHMgKyBucC0+Y2cuc2VsZl9jYWxscykgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIgJTdsdSIsIG5wLT5uY2FsbHMpOwotICAgICAgaWYgKG5wLT5jZy5zZWxmX2NhbGxzICE9IDApCi0JewotCSAgcHJpbnRmICgiKyUtN2x1ICIsIG5wLT5jZy5zZWxmX2NhbGxzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiICU3LjdzICIsICIiKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiICU3LjdzICU3LjdzICIsICIiLCAiIik7Ci0gICAgfQotICBwcmludF9uYW1lIChucCk7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0KLQotLyoKLSAqIFByaW50IGR5bmFtaWMgY2FsbCBncmFwaC4KLSAqLwotdm9pZAotREVGVU4gKGNnX3ByaW50LCAodGltZXNvcnRzeW0pLCBTeW0gKiogdGltZXNvcnRzeW0pCi17Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgU3ltICpwYXJlbnQ7Ci0KLSAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucyAmJiBic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGJzZF9jYWxsZ19ibHVyYiAoc3Rkb3V0KTsKLSAgICB9Ci0KLSAgcHJpbnRfaGVhZGVyICgpOwotCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzOyArK2luZGV4KQotICAgIHsKLSAgICAgIHBhcmVudCA9IHRpbWVzb3J0c3ltW2luZGV4XTsKLSAgICAgIGlmICgoaWdub3JlX3plcm9zICYmIHBhcmVudC0+bmNhbGxzID09IDAKLQkgICAmJiBwYXJlbnQtPmNnLnNlbGZfY2FsbHMgPT0gMCAmJiBwYXJlbnQtPmNnLnByb3Auc2VsZiA9PSAwCi0JICAgJiYgcGFyZW50LT5jZy5wcm9wLmNoaWxkID09IDApCi0JICB8fCAhcGFyZW50LT5jZy5wcmludF9mbGFnCi0JICB8fCAobGluZV9ncmFudWxhcml0eSAmJiAhIHBhcmVudC0+aXNfZnVuYykpCi0JewotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKCFwYXJlbnQtPm5hbWUgJiYgcGFyZW50LT5jZy5jeWMubnVtICE9IDApCi0JewotCSAgLyogY3ljbGUgaGVhZGVyOiAqLwotCSAgcHJpbnRfY3ljbGUgKHBhcmVudCk7Ci0JICBwcmludF9tZW1iZXJzIChwYXJlbnQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludF9wYXJlbnRzIChwYXJlbnQpOwotCSAgcHJpbnRfbGluZSAocGFyZW50KTsKLQkgIHByaW50X2NoaWxkcmVuIChwYXJlbnQpOwotCX0KLSAgICAgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotCXByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLQlwcmludGYgKCJcbiIpOwotICAgIH0KLSAgZnJlZSAodGltZXNvcnRzeW0pOwotICBpZiAocHJpbnRfZGVzY3JpcHRpb25zICYmICFic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGZzZl9jYWxsZ19ibHVyYiAoc3Rkb3V0KTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGludAotREVGVU4gKGNtcF9uYW1lLCAobGVmdCwgcmlnaHQpLCBjb25zdCBQVFIgbGVmdCBBTkQgY29uc3QgUFRSIHJpZ2h0KQotewotICBjb25zdCBTeW0gKipucHAxID0gKGNvbnN0IFN5bSAqKikgbGVmdDsKLSAgY29uc3QgU3ltICoqbnBwMiA9IChjb25zdCBTeW0gKiopIHJpZ2h0OwotCi0gIHJldHVybiBzdHJjbXAgKCgqbnBwMSktPm5hbWUsICgqbnBwMiktPm5hbWUpOwotfQotCi0KLXZvaWQKLURFRlVOX1ZPSUQgKGNnX3ByaW50X2luZGV4KQotewotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBubmFtZXMsIHRvZG8sIGksIGo7Ci0gIGludCBjb2wsIHN0YXJ0aW5nX2NvbDsKLSAgU3ltICoqbmFtZV9zb3J0ZWRfc3ltcywgKnN5bTsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgYnVmWzIwXTsKLSAgaW50IGNvbHVtbl93aWR0aCA9IChvdXRwdXRfd2lkdGggLSAxKSAvIDM7CS8qIGRvbid0IHdyaXRlIGluIGxhc3QgY29sISAqLwotICAvKgotICAgKiBOb3csIHNvcnQgcmVndWxhciBmdW5jdGlvbiBuYW1lIGFscGhhYmV0aWNhbGx5IHRvIGNyZWF0ZSBhbgotICAgKiBpbmRleDoKLSAgICovCi0gIG5hbWVfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jICgoc3ltdGFiLmxlbiArIG51bV9jeWNsZXMpICogc2l6ZW9mIChTeW0gKikpOwotICBmb3IgKGluZGV4ID0gMCwgbm5hbWVzID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChpZ25vcmVfemVyb3MgJiYgc3ltdGFiLmJhc2VbaW5kZXhdLm5jYWxscyA9PSAwCi0JICAmJiBzeW10YWIuYmFzZVtpbmRleF0uaGlzdC50aW1lID09IDApCi0JewotCSAgY29udGludWU7Ci0JfQotICAgICAgbmFtZV9zb3J0ZWRfc3ltc1tubmFtZXMrK10gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotICAgIH0KLSAgcXNvcnQgKG5hbWVfc29ydGVkX3N5bXMsIG5uYW1lcywgc2l6ZW9mIChTeW0gKiksIGNtcF9uYW1lKTsKLSAgZm9yIChpbmRleCA9IDEsIHRvZG8gPSBubmFtZXM7IGluZGV4IDw9IG51bV9jeWNsZXM7IGluZGV4KyspCi0gICAgewotICAgICAgbmFtZV9zb3J0ZWRfc3ltc1t0b2RvKytdID0gJmN5Y2xlX2hlYWRlcltpbmRleF07Ci0gICAgfQotICBwcmludGYgKCJcZlxuIik7Ci0gIHByaW50ZiAoXygiSW5kZXggYnkgZnVuY3Rpb24gbmFtZVxuXG4iKSk7Ci0gIGluZGV4ID0gKHRvZG8gKyAyKSAvIDM7Ci0gIGZvciAoaSA9IDA7IGkgPCBpbmRleDsgaSsrKQotICAgIHsKLSAgICAgIGNvbCA9IDA7Ci0gICAgICBzdGFydGluZ19jb2wgPSAwOwotICAgICAgZm9yIChqID0gaTsgaiA8IHRvZG87IGogKz0gaW5kZXgpCi0JewotCSAgc3ltID0gbmFtZV9zb3J0ZWRfc3ltc1tqXTsKLQkgIGlmIChzeW0tPmNnLnByaW50X2ZsYWcpCi0JICAgIHsKLQkgICAgICBzcHJpbnRmIChidWYsICJbJWRdIiwgc3ltLT5jZy5pbmRleCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNwcmludGYgKGJ1ZiwgIiglZCkiLCBzeW0tPmNnLmluZGV4KTsKLQkgICAgfQotCSAgaWYgKGogPCBubmFtZXMpCi0JICAgIHsKLQkgICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLQkJewotCQkgIHByaW50ZiAoIiU2LjZzICUtMTkuMTlzIiwgYnVmLCBzeW0tPm5hbWUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY29sICs9IHN0cmxlbiAoYnVmKTsKLQkJICBmb3IgKDsgY29sIDwgc3RhcnRpbmdfY29sICsgNTsgKytjb2wpCi0JCSAgICB7Ci0JCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JCSAgICB9Ci0JCSAgcHJpbnRmICgiICVzICIsIGJ1Zik7Ci0JCSAgY29sICs9IHByaW50X25hbWVfb25seSAoc3ltKTsKLQkJICBpZiAoIWxpbmVfZ3JhbnVsYXJpdHkgJiYgc3ltLT5pc19zdGF0aWMgJiYgc3ltLT5maWxlKQotCQkgICAgewotCQkgICAgICBmaWxlbmFtZSA9IHN5bS0+ZmlsZS0+bmFtZTsKLQkJICAgICAgaWYgKCFwcmludF9wYXRoKQotCQkJewotCQkJICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOwotCQkJICBpZiAoZmlsZW5hbWUpCi0JCQkgICAgewotCQkJICAgICAgKytmaWxlbmFtZTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBmaWxlbmFtZSA9IHN5bS0+ZmlsZS0+bmFtZTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIHByaW50ZiAoIiAoJXMpIiwgZmlsZW5hbWUpOwotCQkgICAgICBjb2wgKz0gc3RybGVuIChmaWxlbmFtZSkgKyAzOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotCQl7Ci0JCSAgcHJpbnRmICgiJTYuNnMgIiwgYnVmKTsKLQkJICBzcHJpbnRmIChidWYsIF8oIjxjeWNsZSAlZD4iKSwgc3ltLT5jZy5jeWMubnVtKTsKLQkJICBwcmludGYgKCIlLTE5LjE5cyIsIGJ1Zik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb2wgKz0gc3RybGVuIChidWYpOwotCQkgIGZvciAoOyBjb2wgPCBzdGFydGluZ19jb2wgKyA1OyArK2NvbCkKLQkJICAgIHB1dGNoYXIgKCcgJyk7Ci0JCSAgcHJpbnRmICgiICVzICIsIGJ1Zik7Ci0JCSAgc3ByaW50ZiAoYnVmLCBfKCI8Y3ljbGUgJWQ+IiksIHN5bS0+Y2cuY3ljLm51bSk7Ci0JCSAgcHJpbnRmICgiJXMiLCBidWYpOwotCQkgIGNvbCArPSBzdHJsZW4gKGJ1Zik7Ci0JCX0KLQkgICAgfQotCSAgc3RhcnRpbmdfY29sICs9IGNvbHVtbl93aWR0aDsKLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLSAgZnJlZSAobmFtZV9zb3J0ZWRfc3ltcyk7Ci19Ci0KLS8qIENvbXBhcmUgdHdvIGFyY3MgYmFzZWQgb24gdGhlaXIgdXNhZ2UgY291bnRzLiAgV2Ugd2FudCB0byBzb3J0Ci0gICBpbiBkZXNjZW5kaW5nIG9yZGVyLiAgKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfYXJjX2NvdW50LCAobGVmdCwgcmlnaHQpLCBjb25zdCBQVFIgbGVmdCBBTkQgY29uc3QgUFRSIHJpZ2h0KQotewotICBjb25zdCBBcmMgKipucHAxID0gKGNvbnN0IEFyYyAqKikgbGVmdDsKLSAgY29uc3QgQXJjICoqbnBwMiA9IChjb25zdCBBcmMgKiopIHJpZ2h0OwotCi0gIGlmICgoKm5wcDEpLT5jb3VudCA+ICgqbnBwMiktPmNvdW50KQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKCpucHAxKS0+Y291bnQgPCAoKm5wcDIpLT5jb3VudCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBDb21wYXJlIHR3byBmdW50aW9ucyBiYXNlZCBvbiB0aGVpciB1c2FnZSBjb3VudHMuICBXZSB3YW50IHRvIHNvcnQKLSAgIGluIGRlc2NlbmRpbmcgb3JkZXIuICAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF9mdW5fbnVzZXMsIChsZWZ0LCByaWdodCksIGNvbnN0IFBUUiBsZWZ0IEFORCBjb25zdCBQVFIgcmlnaHQpCi17Ci0gIGNvbnN0IFN5bSAqKm5wcDEgPSAoY29uc3QgU3ltICoqKSBsZWZ0OwotICBjb25zdCBTeW0gKipucHAyID0gKGNvbnN0IFN5bSAqKikgcmlnaHQ7Ci0KLSAgaWYgKCgqbnBwMSktPm51c2VzID4gKCpucHAyKS0+bnVzZXMpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmICgoKm5wcDEpLT5udXNlcyA8ICgqbnBwMiktPm51c2VzKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFByaW50IGEgc3VnZ2VzdGVkIGZ1bmN0aW9uIG9yZGVyaW5nIGJhc2VkIG9uIHRoZSBwcm9maWxpbmcgZGF0YS4KLQotICAgV2UgcGVyZm9ybSA0IG1ham9yIHN0ZXBzIHdoZW4gb3JkZXJpbmcgZnVuY3Rpb25zOgotCi0JKiBHcm91cCB1bnVzZWQgZnVuY3Rpb25zIHRvZ2V0aGVyIGFuZCBwbGFjZSB0aGVtIGF0IHRoZQotCWVuZCBvZiB0aGUgZnVuY3Rpb24gb3JkZXIuCi0KLQkqIFNlYXJjaCB0aGUgaGlnaGVzdCB1c2UgYXJjcyAodGhvc2Ugd2hpY2ggYWNjb3VudCBmb3IgOTAlIG9mCi0JdGhlIHRvdGFsIGFyYyBjb3VudCkgZm9yIGZ1bmN0aW9ucyB3aGljaCBoYXZlIHNldmVyYWwgcGFyZW50cy4KLQotCUdyb3VwIHRob3NlIHdpdGggdGhlIG1vc3QgY2FsbCBzaXRlcyB0b2dldGhlciAoY3VycmVudGx5IHRoZQotCXRvcCAxLjI1JSB3aGljaCBoYXZlIGF0IGxlYXN0IGZpdmUgZGlmZmVyZW50IGNhbGwgc2l0ZXMpLgotCi0JVGhlc2UgYXJlIGVtaXR0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBvcmRlci4KLQotCSogVXNlIGEgZ3JlZWR5IHBsYWNlbWVudCBhbGdvcml0aG0gdG8gcGxhY2UgZnVuY3Rpb25zIHdoaWNoCi0Jb2NjdXIgaW4gdGhlIHRvcCA5OSUgb2YgdGhlIGFyY3MgaW4gdGhlIHByb2ZpbGUuICBTb21lIHByb3Zpc2lvbnMKLQlhcmUgbWFkZSB0byBoYW5kbGUgaGlnaCB1c2FnZSBhcmNzIHdoZXJlIHRoZSBwYXJlbnQgYW5kL29yCi0JY2hpbGQgaGFzIGFscmVhZHkgYmVlbiBwbGFjZWQuCi0KLQkqIFJ1biB0aGUgc2FtZSBncmVlZHkgcGxhY2VtZW50IGFsZ29yaXRobSBvbiB0aGUgcmVtYWluaW5nCi0JYXJjcyB0byBwbGFjZSB0aGUgbGVmdG92ZXIgZnVuY3Rpb25zLgotCi0KLSAgIFRoZSB2YXJpb3VzICJtYWdpYyBudW1iZXJzIiBzaG91bGQgKG9uZSBkYXkpIGJlIHR1bmVhYmxlIGJ5IGNvbW1hbmQKLSAgIGxpbmUgb3B0aW9ucy4gIFRoZXkgd2VyZSBhcnJpdmVkIGF0IGJ5IGJlbmNobWFya2luZyBhIGZldyBhcHBsaWNhdGlvbnMKLSAgIHdpdGggdmFyaW91cyB2YWx1ZXMgdG8gc2VlIHdoaWNoIHZhbHVlcyBwcm9kdWNlZCBiZXR0ZXIgb3ZlcmFsbCBmdW5jdGlvbgotICAgb3JkZXJpbmdzLgotCi0gICBPZiBjb3Vyc2UsIHByb2ZpbGluZyBlcnJvcnMsIG1hY2hpbmUgbGltaXRhdGlvbnMgKFBBIGxvbmcgY2FsbHMpLCBhbmQKLSAgIHBvb3IgY3V0b2ZmIHZhbHVlcyBmb3IgdGhlIHBsYWNlbWVudCBhbGdvcml0aG0gbWF5IGxpbWl0IHRoZSB1c2VmdWxsbmVzcwotICAgb2YgdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBvcmRlci4gIEltcHJvdmVtZW50cyB3b3VsZCBiZSBncmVhdGx5IGFwcHJlY2lhdGVkLgotICAgCi0gICBTdWdnZXN0aW9uczoKLQotCSogUGxhY2UgdGhlIGZ1bmN0aW9ucyB3aXRoIG1hbnkgY2FsbGVycyBuZWFyIHRoZSBtaWRkbGUgb2YgdGhlCi0JbGlzdCB0byByZWR1Y2UgbG9uZyBjYWxscy4KLQotCSogUHJvcGFnYXRlIGFyYyB1c2FnZSBjaGFuZ2VzIGFzIGZ1bmN0aW9ucyBhcmUgcGxhY2VkLiAgSWUgaWYKLQlmdW5jMSBhbmQgZnVuYzIgYXJlIHBsYWNlZCB0b2dldGhlciwgYXJjcyB0by9mcm9tIHRob3NlIGFyY3MKLQl0byB0aGUgc2FtZSBwYXJlbnQvY2hpbGQgc2hvdWxkIGJlIGNvbWJpbmVkLCB0aGVuIHJlc29ydCB0aGUKLQlhcmNzIHRvIGNob29zZSB0aGUgbmV4dCBvbmUuCi0KLQkqIEltcGxlbWVudCBzb21lIGdsb2JhbCBwb3NpdGlvbmluZyBhbGdvcml0aG0gdG8gcGxhY2UgdGhlCi0JY2hhaW5zIG1hZGUgYnkgdGhlIGdyZWVkeSBsb2NhbCBwb3NpdGlvbmluZyBhbGdvcml0aG0uICBQcm9iYWJseQotCWJ5IGV4YW1pbmluZyBhcmNzIHdoaWNoIGhhdmVuJ3QgYmVlbiBwbGFjZWQgeWV0IHRvIHRpZSB0d28KLQljaGFpbnMgdG9nZXRoZXIuCi0KLQkqIFRha2UgYSBmdW5jdGlvbidzIHNpemUgYW5kIHRpbWUgaW50byBhY2NvdW50IGluIHRoZSBhbGdvcml0aG07Ci0Jc2l6ZSBpbiBwYXJ0aWN1bGFyIGlzIGltcG9ydGFudCBvbiB0aGUgUEEgKGxvbmcgY2FsbHMpLiAgUGxhY2luZwotCW1hbnkgc21hbGwgZnVuY3Rpb25zIG9udG8gdGhlaXIgb3duIHBhZ2UgbWF5IGJlIHdpc2UuCi0KLQkqIFVzZSBiZXR0ZXIgcHJvZmlsaW5nIGluZm9ybWF0aW9uOyBtYW55IHB1Ymxpc2hlZCBhbGdvcml0aG1zCi0JYXJlIGJhc2VkIG9uIGNhbGwgc2VxdWVuY2VzIHRocm91Z2ggdGltZSwgcmF0aGVyIHRoYW4ganVzdAotCWFyYyBjb3VudHMuCi0KLQkqIFByb2RlY3VyZSBjbG9uaW5nIGNvdWxkIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBhIHNtYWxsIG51bWJlcgotCW9mIGFyY3MgYWNjb3VudCBmb3IgbW9zdCBvZiB0aGUgY2FsbHMgdG8gYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgotCi0JKiBVc2UgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhdm9pZCBtb3ZpbmcgdW51c2VkIGZ1bmN0aW9ucwotCWNvbXBsZXRlbHkgb3V0IG9mIHRoZSBjb2RlIHN0cmVhbTsgdGhpcyB3b3VsZCBhdm9pZCBzZXZlcmUgbG9zc2FnZQotCXdoZW4gdGhlIHByb2ZpbGUgZGF0YSBiZWFycyBsaXR0bGUgcmVzZW1ibGFuY2UgdG8gYWN0dWFsIHJ1bnMuCi0KLQkqIFByb3BhZ2F0aW9uIG9mIGFyYyB1c2FnZXMgc2hvdWxkIGFsc28gaW1wcm92ZSAubyBsaW5rIGxpbmUKLQlvcmRlcmluZyB3aGljaCBzaGFyZXMgdGhlIHNhbWUgYXJjIHBsYWNlbWVudCBhbGdvcml0aG0gd2l0aAotCXRoZSBmdW5jdGlvbiBvcmRlcmluZyBjb2RlIChpbiBmYWN0IGl0IGlzIGEgZGVnZW5lcmF0ZSBjYXNlCi0Jb2YgZnVuY3Rpb24gb3JkZXJpbmcpLiAgKi8KLQkKLXZvaWQKLURFRlVOX1ZPSUQgKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKQotewotICB1bnNpZ25lZCBsb25nIGluZGV4LCB1c2VkLCB1bnVzZWQsIHNjcmF0Y2hfaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgIHVucGxhY2VkX2FyY19jb3VudCwgaGlnaF9hcmNfY291bnQsIHNjcmF0Y2hfYXJjX2NvdW50OwotI2lmZGVmIF9fR05VQ19fCi0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9hcmNzLCB0bXBfYXJjc19jb3VudDsKLSNlbHNlCi0gIHVuc2lnbmVkIGxvbmcgdG90YWxfYXJjcywgdG1wX2FyY3NfY291bnQ7Ci0jZW5kaWYKLSAgU3ltICoqdW51c2VkX3N5bXMsICoqdXNlZF9zeW1zLCAqKnNjcmF0Y2hfc3ltczsKLSAgQXJjICoqdW5wbGFjZWRfYXJjcywgKipoaWdoX2FyY3MsICoqc2NyYXRjaF9hcmNzOwotCi0gIGluZGV4ID0gMDsKLSAgdXNlZCA9IDA7Ci0gIHVudXNlZCA9IDA7Ci0gIHNjcmF0Y2hfaW5kZXggPSAwOwotICB1bnBsYWNlZF9hcmNfY291bnQgPSAwOwotICBoaWdoX2FyY19jb3VudCA9IDA7Ci0gIHNjcmF0Y2hfYXJjX2NvdW50ID0gMDsKLQotICAvKiBGaXJzdCBncm91cCBhbGwgdGhlIHVudXNlZCBmdW5jdGlvbnMgdG9nZXRoZXIuICAqLwotICB1bnVzZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIHVzZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIHNjcmF0Y2hfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIGhpZ2hfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0gIHNjcmF0Y2hfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0gIHVucGxhY2VkX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotCi0gIC8qIFdhbGsgdGhyb3VnaCBhbGwgdGhlIGZ1bmN0aW9uczsgbWFyayB0aG9zZSB3aGljaCBhcmUgbmV2ZXIKLSAgICAgY2FsbGVkIGFzIHBsYWNlZCAod2UnbGwgZW1pdCB0aGVtIGFzIGEgZ3JvdXAgbGF0ZXIpLiAgKi8KLSAgZm9yIChpbmRleCA9IDAsIHVzZWQgPSAwLCB1bnVzZWQgPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKHN5bXRhYi5iYXNlW2luZGV4XS5uY2FsbHMgPT0gMCkKLQl7Ci0JICAvKiBGaWx0ZXIgb3V0IGdwcm9mIGdlbmVyYXRlZCBuYW1lcy4gICovCi0JICBpZiAoc3RyY21wIChzeW10YWIuYmFzZVtpbmRleF0ubmFtZSwgIjxsb2NvcmU+IikKLQkgICAgICAmJiBzdHJjbXAgKHN5bXRhYi5iYXNlW2luZGV4XS5uYW1lLCAiPGhpY29yZT4iKSkKLQkgICAgewotCSAgICAgIHVudXNlZF9zeW1zW3VudXNlZCsrXSA9ICZzeW10YWIuYmFzZVtpbmRleF07Ci0JICAgICAgc3ltdGFiLmJhc2VbaW5kZXhdLmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdXNlZF9zeW1zW3VzZWQrK10gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotCSAgc3ltdGFiLmJhc2VbaW5kZXhdLmhhc19iZWVuX3BsYWNlZCA9IDA7Ci0JICBzeW10YWIuYmFzZVtpbmRleF0ubmV4dCA9IDA7Ci0JICBzeW10YWIuYmFzZVtpbmRleF0ucHJldiA9IDA7Ci0JICBzeW10YWIuYmFzZVtpbmRleF0ubnVzZXMgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogU29ydCB0aGUgYXJjcyBmcm9tIG1vc3QgdXNlZCB0byBsZWFzdCB1c2VkLiAgKi8KLSAgcXNvcnQgKGFyY3MsIG51bWFyY3MsIHNpemVvZiAoQXJjICopLCBjbXBfYXJjX2NvdW50KTsKLQotICAvKiBDb21wdXRlIHRoZSB0b3RhbCBhcmMgY291bnQuICBBbHNvIG1hcmsgYXJjcyBhcyB1bnBsYWNlZC4KLQotICAgICBOb3RlIHdlIGRvbid0IGNvbXBlbnNhdGUgZm9yIG92ZXJmbG93IGlmIHRoYXQgaGFwcGVucyEKLSAgICAgT3ZlcmZsb3cgaXMgbXVjaCBsZXNzIGxpa2VseSB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZAotICAgICB3aXRoIEdDQyBhcyBpdCBjYW4gZG91YmxlLXdpZGUgaW50ZWdlcnMgdmlhIGxvbmcgbG9uZy4gICovCi0gIHRvdGFsX2FyY3MgPSAwOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIHRvdGFsX2FyY3MgKz0gYXJjc1tpbmRleF0tPmNvdW50OwotICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDA7Ci0gICAgfQotCi0gIC8qIFdlIHdhbnQgdG8gcHVsbCBvdXQgdGhvc2UgZnVuY3Rpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VkCi0gICAgIGJ5IG1hbnkgaGlnaGx5IHVzZWQgYXJjcyBhbmQgZW1pdCB0aGVtIGFzIGEgZ3JvdXAuICBUaGlzCi0gICAgIGNvdWxkIHByb2JhYmx5IHVzZSBzb21lIHR1bmluZy4gICovCi0gIHRtcF9hcmNzX2NvdW50ID0gMDsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICB0bXBfYXJjc19jb3VudCArPSBhcmNzW2luZGV4XS0+Y291bnQ7Ci0KLSAgICAgIC8qIENvdW50IGhvdyBtYW55IHRpbWVzIGVhY2ggcGFyZW50IGFuZCBjaGlsZCBhcmUgdXNlZCB1cAotCSB0byBvdXIgdGhyZXNoaG9sZCBvZiBhcmNzICg5MCUpLiAgKi8KLSAgICAgIGlmICgoZG91YmxlKXRtcF9hcmNzX2NvdW50IC8gKGRvdWJsZSl0b3RhbF9hcmNzID4gMC45MCkKLQlicmVhazsKLQotICAgICAgYXJjc1tpbmRleF0tPmNoaWxkLT5udXNlcysrOwotICAgIH0KLQotICAvKiBOb3cgc29ydCBhIHRlbXBvcmFyeSBzeW1ib2wgdGFibGUgYmFzZWQgb24gdGhlIG51bWJlciBvZgotICAgICB0aW1lcyBlYWNoIGZ1bmN0aW9uIHdhcyB1c2VkIGluIHRoZSBoaWdoZXN0IHVzZWQgYXJjcy4gICovCi0gIG1lbWNweSAoc2NyYXRjaF9zeW1zLCB1c2VkX3N5bXMsIHVzZWQgKiBzaXplb2YgKFN5bSAqKSk7Ci0gIHFzb3J0IChzY3JhdGNoX3N5bXMsIHVzZWQsIHNpemVvZiAoU3ltICopLCBjbXBfZnVuX251c2VzKTsKLQotICAvKiBOb3cgcGljayBvdXQgdGhvc2Ugc3ltYm9scyB3ZSdyZSBnb2luZyB0byBlbWl0IGFzCi0gICAgIGEgZ3JvdXAuICBXZSB0YWtlIHVwIHRvIDEuMjUlIG9mIHRoZSB1c2VkIHN5bWJvbHMuICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1c2VkIC8gODA7IGluZGV4KyspCi0gICAgewotICAgICAgU3ltICpzeW0gPSBzY3JhdGNoX3N5bXNbaW5kZXhdOwotICAgICAgQXJjICphcmM7Ci0KLSAgICAgIC8qIElmIHdlIGhpdCBzeW1ib2xzIHRoYXQgYXJlbid0IHVzZWQgZnJvbSBtYW55IGNhbGwgc2l0ZXMsCi0JIHRoZW4gd2UgY2FuIHF1aXQuICBXZSBjaG9vc2UgZml2ZSBhcyB0aGUgbG93IGxpbWl0IGZvcgotCSBubyBwYXJ0aWN1bGFyIHJlYXNvbi4gICovCi0gICAgICBpZiAoc3ltLT5udXNlcyA9PSA1KQotCWJyZWFrOwotCi0gICAgICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIHRoZSBhcmNzIGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zLgotCSBVbmZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBrbm93IGFsbCB0aGVzZSBmdW5jdGlvbnMKLQkgdW50aWwgd2UncmUgZG9uZS4gIFNvIHdlIGtlZXAgdHJhY2sgb2YgYWxsIHRoZSBhcmNzCi0JIHRvIHRoZSBmdW5jdGlvbnMgd2UgY2FyZSBhYm91dCwgdGhlbiBwcnVuZSBvdXQgdGhvc2UKLQkgd2hpY2ggYXJlIHVuaW50ZXJlc3RpbmcuIAotCi0JIEFuIGludGVyZXN0aW5nIHZhcmlhdGlvbiB3b3VsZCBiZSB0byBxdWl0IHdoZW4gd2UgZm91bmQKLQkgbXVsdGktY2FsbCBzaXRlIGZ1bmN0aW9ucyB3aGljaCBhY2NvdW50IGZvciBzb21lIHBlcmNlbnRhZ2UKLQkgb2YgdGhlIGFyY3MuICAqLwotCi0gICAgICBhcmMgPSBzeW0tPmNnLmNoaWxkcmVuOwotICAgICAgd2hpbGUgKGFyYykKLQl7Ci0JICBpZiAoYXJjLT5wYXJlbnQgIT0gYXJjLT5jaGlsZCkKLQkgICAgc2NyYXRjaF9hcmNzW3NjcmF0Y2hfYXJjX2NvdW50KytdID0gYXJjOwotCSAgYXJjLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgYXJjID0gYXJjLT5uZXh0X2NoaWxkOwotCX0KLQotICAgICAgYXJjID0gc3ltLT5jZy5wYXJlbnRzOwotICAgICAgd2hpbGUgKGFyYykKLQl7Ci0JICBpZiAoYXJjLT5wYXJlbnQgIT0gYXJjLT5jaGlsZCkKLQkgICAgc2NyYXRjaF9hcmNzW3NjcmF0Y2hfYXJjX2NvdW50KytdID0gYXJjOwotCSAgYXJjLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgYXJjID0gYXJjLT5uZXh0X3BhcmVudDsKLQl9Ci0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgaG93IG1hbnkgc3ltYm9scyB3ZSdyZSBnb2luZyB0byBwbGFjZS4gICovCi0gICAgICBzY3JhdGNoX2luZGV4ID0gaW5kZXg7Ci0KLSAgICAgIC8qIEEgbGllLCBidXQgaXQgbWFrZXMgaWRlbnRpZnlpbmcgdGhlc2UgZnVuY3Rpb25zIGVhc2llcgotCSBsYXRlci4gICovCi0gICAgICBzeW0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0gICAgfQotCi0gIC8qIE5vdyB3YWxrIHRocm91Z2ggdGhlIHRlbXBvcmFyeSBhcmNzIGFuZCBjb3B5IHRob3NlIHdlIGNhcmUgYWJvdXQKLSAgICAgaW50byB0aGUgaGlnaCBhcmNzIGFycmF5LiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2NyYXRjaF9hcmNfY291bnQ7IGluZGV4KyspCi0gICAgewotICAgICAgQXJjICphcmMgPSBzY3JhdGNoX2FyY3NbaW5kZXhdOwotCi0gICAgICAvKiBJZiB0aGlzIGFyYyByZWZlcnMgdG8gaGlnaGx5IHVzZWQgZnVuY3Rpb25zLCB0aGVuCi0JIHRoZW4gd2Ugd2FudCB0byBrZWVwIGl0LiAgKi8KLSAgICAgIGlmIChhcmMtPmNoaWxkLT5oYXNfYmVlbl9wbGFjZWQKLQkgICYmIGFyYy0+cGFyZW50LT5oYXNfYmVlbl9wbGFjZWQpCi0JewotCSAgaGlnaF9hcmNzW2hpZ2hfYXJjX2NvdW50KytdID0gc2NyYXRjaF9hcmNzW2luZGV4XTsKLQotCSAgLyogV2UgbmVlZCB0byB0dXJuIG9mIGhhc19iZWVuX3BsYWNlZCBzaW5jZSB3ZSdyZSBnb2luZyB0bwotCSAgICAgdXNlIHRoZSBtYWluIGFyYyBwbGFjZW1lbnQgYWxnb3JpdGhtIG9uIHRoZXNlIGFyY3MuICAqLwotCSAgYXJjLT5jaGlsZC0+aGFzX2JlZW5fcGxhY2VkID0gMDsKLQkgIGFyYy0+cGFyZW50LT5oYXNfYmVlbl9wbGFjZWQgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogRHVtcCB0aGUgbXVsdGktc2l0ZSBoaWdoIHVzYWdlIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGdvaW5nCi0gICAgIHRvIGJlIG9yZGVyZWQgYnkgdGhlIG1haW4gb3JkZXJpbmcgYWxnb3JpdGhtLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2NyYXRjaF9pbmRleDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoc2NyYXRjaF9zeW1zW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkKQotCXByaW50ZiAoIiVzXG4iLCBzY3JhdGNoX3N5bXNbaW5kZXhdLT5uYW1lKTsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGNhbiBvcmRlciB0aGUgbXVsdGktc2l0ZSBoaWdoIHVzZSBmdW5jdGlvbnMgYmFzZWQgb24gdGhlCi0gICAgIGFyY3MgYmV0d2VlbiB0aGVtLiAgKi8KLSAgcXNvcnQgKGhpZ2hfYXJjcywgaGlnaF9hcmNfY291bnQsIHNpemVvZiAoQXJjICopLCBjbXBfYXJjX2NvdW50KTsKLSAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGhpZ2hfYXJjcywgaGlnaF9hcmNfY291bnQsIDEsCi0JCQkJICAgIHVucGxhY2VkX2FyY3MsICZ1bnBsYWNlZF9hcmNfY291bnQpOwotCi0gIC8qIE9yZGVyIGFuZCBkdW1wIHRoZSBoaWdoIHVzZSBmdW5jdGlvbnMgbGVmdCwgdGhlc2UgdHlwaWNhbGx5Ci0gICAgIGhhdmUgb25seSBhIGZldyBjYWxsIHNpdGVzLiAgKi8KLSAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIDAsCi0JCQkJICAgIHVucGxhY2VkX2FyY3MsICZ1bnBsYWNlZF9hcmNfY291bnQpOwotCi0gIC8qIE5vdyBwbGFjZSB0aGUgcmFyZWx5IHVzZWQgZnVuY3Rpb25zLiAgKi8KLSAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKHVucGxhY2VkX2FyY3MsIHVucGxhY2VkX2FyY19jb3VudCwgMSwKLQkJCQkgICAgc2NyYXRjaF9hcmNzLCAmc2NyYXRjaF9hcmNfY291bnQpOwotCi0gIC8qIE91dHB1dCBhbnkgZnVuY3Rpb25zIG5vdCBlbWl0dGVkIGJ5IHRoZSBvcmRlcl9hbmRfZHVtcCBjYWxscy4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHVzZWQ7IGluZGV4KyspCi0gICAgaWYgKHVzZWRfc3ltc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9PSAwKQotICAgICAgcHJpbnRmKCIlc1xuIiwgdXNlZF9zeW1zW2luZGV4XS0+bmFtZSk7Ci0KLSAgLyogT3V0cHV0IHRoZSB1bnVzZWQgZnVuY3Rpb25zLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdW51c2VkOyBpbmRleCsrKQotICAgIHByaW50ZigiJXNcbiIsIHVudXNlZF9zeW1zW2luZGV4XS0+bmFtZSk7Ci0KLSAgdW51c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICB1c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBzY3JhdGNoX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBoaWdoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICBzY3JhdGNoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICB1bnBsYWNlZF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLQotICBmcmVlICh1bnVzZWRfc3ltcyk7Ci0gIGZyZWUgKHVzZWRfc3ltcyk7Ci0gIGZyZWUgKHNjcmF0Y2hfc3ltcyk7Ci0gIGZyZWUgKGhpZ2hfYXJjcyk7Ci0gIGZyZWUgKHNjcmF0Y2hfYXJjcyk7Ci0gIGZyZWUgKHVucGxhY2VkX2FyY3MpOwotfQotCi0vKiBQbGFjZSBmdW5jdGlvbnMgYmFzZWQgb24gdGhlIGFyY3MgaW4gQVJDUyB3aXRoIE5VTUFSQ1MgZW50cmllczsKLSAgIHBsYWNlIHVudXNlZCBhcmNzIGludG8gVU5QTEFDRURfQVJDUy9VTlBMQUNFRF9BUkNfQ09VTlQuCi0KLSAgIElmIEFMTCBpcyBub256ZXJvLCB0aGVuIHBsYWNlIGFsbCBmdW5jdGlvbnMgcmVmZXJlbmNlZCBieSBBUkNTLAotICAgZWxzZSBvbmx5IHBsYWNlIHRob3NlIHJlZmVyZW5jZWQgaW4gdGhlIHRvcCA5OSUgb2YgdGhlIGFyY3MgaW4gQVJDUy4gICovCi0KLSNkZWZpbmUgTU9TVCAwLjk5Ci1zdGF0aWMgdm9pZAotb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIGFsbCwKLQkJCQkgIHVucGxhY2VkX2FyY3MsIHVucGxhY2VkX2FyY19jb3VudCkKLSAgICAgQXJjICoqYXJjczsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1hcmNzOwotICAgICBpbnQgYWxsOwotICAgICBBcmMgKip1bnBsYWNlZF9hcmNzOwotICAgICB1bnNpZ25lZCBsb25nICp1bnBsYWNlZF9hcmNfY291bnQ7Ci17Ci0jaWZkZWYgX19HTlVDX18KLSAgdW5zaWduZWQgbG9uZyBsb25nIHRtcF9hcmNzLCB0b3RhbF9hcmNzOwotI2Vsc2UKLSAgdW5zaWduZWQgbG9uZyB0bXBfYXJjcywgdG90YWxfYXJjczsKLSNlbmRpZgotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0KLSAgLyogSWYgbmVlZGVkLCBjb21wdXRlIHRoZSB0b3RhbCBhcmMgY291bnQuCi0KLSAgICAgTm90ZSB3ZSBkb24ndCBjb21wZW5zYXRlIGZvciBvdmVyZmxvdyBpZiB0aGF0IGhhcHBlbnMhICAqLwotICBpZiAoISBhbGwpCi0gICAgewotICAgICAgdG90YWxfYXJjcyA9IDA7Ci0gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotCXRvdGFsX2FyY3MgKz0gYXJjc1tpbmRleF0tPmNvdW50OwotICAgIH0KLSAgZWxzZQotICAgIHRvdGFsX2FyY3MgPSAwOwotCi0gIHRtcF9hcmNzID0gMDsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBTeW0gKnN5bTEsICpzeW0yOwotICAgICAgU3ltICpjaGlsZCwgKnBhcmVudDsKLQotICAgICAgdG1wX2FyY3MgKz0gYXJjc1tpbmRleF0tPmNvdW50OwotCi0gICAgICAvKiBJZ25vcmUgdGhpcyBhcmMgaWYgaXQncyBhbHJlYWR5IGJlZW4gcGxhY2VkLiAgKi8KLSAgICAgIGlmIChhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkKQotCWNvbnRpbnVlOwotCi0gICAgICBjaGlsZCA9IGFyY3NbaW5kZXhdLT5jaGlsZDsKLSAgICAgIHBhcmVudCA9IGFyY3NbaW5kZXhdLT5wYXJlbnQ7Ci0KLSAgICAgIC8qIElmIHdlJ3JlIG5vdCB1c2luZyBhbGwgYXJjcywgYW5kIHRoaXMgaXMgYSByYXJlbHkgdXNlZAotCSBhcmMsIHRoZW4gcHV0IGl0IG9uIHRoZSB1bnBsYWNlZF9hcmMgbGlzdC4gIFNpbWlsYXJseQotCSBpZiBib3RoIHRoZSBwYXJlbnQgYW5kIGNoaWxkIG9mIHRoaXMgYXJjIGhhdmUgYmVlbiBwbGFjZWQuICAqLwotICAgICAgaWYgKCghIGFsbCAmJiAoZG91YmxlKXRtcF9hcmNzIC8gKGRvdWJsZSl0b3RhbF9hcmNzID4gTU9TVCkKLQkgIHx8IGNoaWxkLT5oYXNfYmVlbl9wbGFjZWQgfHwgcGFyZW50LT5oYXNfYmVlbl9wbGFjZWQpCi0JewotCSAgdW5wbGFjZWRfYXJjc1soKnVucGxhY2VkX2FyY19jb3VudCkrK10gPSBhcmNzW2luZGV4XTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgYWxsIHNsb3RzIGluIHRoZSBwYXJlbnQgYW5kIGNoaWxkIGFyZSBmdWxsLCB0aGVuIHRoZXJlIGlzbid0Ci0JIGFueXRoaW5nIHdlIGNhbiBkbyByaWdodCBub3cuICBXZSdsbCBwbGFjZSB0aGlzIGFyYyBvbiB0aGUKLQkgdW5wbGFjZWQgYXJjIGxpc3QgaW4gdGhlIGhvcGUgdGhhdCBhIGdsb2JhbCBwb3NpdGlvbmluZwotCSBhbGdvcml0aG0gY2FuIHVzZSBpdCB0byBwbGFjZSBmdW5jdGlvbiBjaGFpbnMuICAqLwotICAgICAgaWYgKHBhcmVudC0+bmV4dCAmJiBwYXJlbnQtPnByZXYgJiYgY2hpbGQtPm5leHQgJiYgY2hpbGQtPnByZXYpCi0JewotCSAgdW5wbGFjZWRfYXJjc1soKnVucGxhY2VkX2FyY19jb3VudCkrK10gPSBhcmNzW2luZGV4XTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgdGhlIHBhcmVudCBpcyB1bmF0dGFjaGVkLCB0aGVuIGZpbmQgdGhlIGNsb3Nlc3QKLQkgcGxhY2UgdG8gYXR0YWNoIGl0IG9udG8gY2hpbGQncyBjaGFpbi4gICBTaW1pbGFybHkKLQkgZm9yIHRoZSBvcHBvc2l0ZSBjYXNlLiAgKi8KLSAgICAgIGlmICghcGFyZW50LT5uZXh0ICYmICFwYXJlbnQtPnByZXYpCi0JewotCSAgaW50IG5leHRfY291bnQgPSAwOwotCSAgaW50IHByZXZfY291bnQgPSAwOwotCSAgU3ltICpwcmV2ID0gY2hpbGQ7Ci0JICBTeW0gKm5leHQgPSBjaGlsZDsKLQotCSAgLyogV2FsayB0byB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGNoaWxkJ3MgY2hhaW4uICAqLwotCSAgd2hpbGUgKG5leHQtPm5leHQpCi0JICAgIHsKLQkgICAgICBuZXh0ID0gbmV4dC0+bmV4dDsKLQkgICAgICBuZXh0X2NvdW50Kys7Ci0JICAgIH0KLQotCSAgd2hpbGUgKHByZXYtPnByZXYpCi0JICAgIHsKLQkgICAgICBwcmV2ID0gcHJldi0+cHJldjsKLQkgICAgICBwcmV2X2NvdW50Kys7Ci0JICAgIH0KLQkgIAotCSAgLyogQ2hvb3NlIHRoZSBjbG9zZXN0LiAgKi8KLQkgIGNoaWxkID0gbmV4dF9jb3VudCA8IHByZXZfY291bnQgPyBuZXh0IDogcHJldjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCEgY2hpbGQtPm5leHQgJiYgIWNoaWxkLT5wcmV2KQotCXsKLQkgIGludCBuZXh0X2NvdW50ID0gMDsKLQkgIGludCBwcmV2X2NvdW50ID0gMDsKLQkgIFN5bSAqcHJldiA9IHBhcmVudDsKLQkgIFN5bSAqbmV4dCA9IHBhcmVudDsKLQotCSAgd2hpbGUgKG5leHQtPm5leHQpCi0JICAgIHsKLQkgICAgICBuZXh0ID0gbmV4dC0+bmV4dDsKLQkgICAgICBuZXh0X2NvdW50Kys7Ci0JICAgIH0KLQotCSAgd2hpbGUgKHByZXYtPnByZXYpCi0JICAgIHsKLQkgICAgICBwcmV2ID0gcHJldi0+cHJldjsKLQkgICAgICBwcmV2X2NvdW50Kys7Ci0JICAgIH0KLQotCSAgcGFyZW50ID0gcHJldl9jb3VudCA8IG5leHRfY291bnQgPyBwcmV2IDogbmV4dDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ291bGRuJ3QgZmluZCBhbnl3aGVyZSB0byBhdHRhY2ggdGhlIGZ1bmN0aW9ucywKLQkgICAgIHB1dCB0aGUgYXJjIG9uIHRoZSB1bnBsYWNlZCBhcmMgbGlzdC4gICovCi0JICB1bnBsYWNlZF9hcmNzWygqdW5wbGFjZWRfYXJjX2NvdW50KSsrXSA9IGFyY3NbaW5kZXhdOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdGllIHR3byBlbmRzIHRvZ2V0aGVyLiAgKi8KLSAgICAgIHN5bTEgPSBwYXJlbnQ7Ci0gICAgICBpZiAoc3ltMS0+bmV4dCkKLQl3aGlsZSAoc3ltMS0+bmV4dCkKLQkgIHN5bTEgPSBzeW0xLT5uZXh0OwotICAgICAgZWxzZQotCXdoaWxlIChzeW0xLT5wcmV2KQotCSAgc3ltMSA9IHN5bTEtPnByZXY7Ci0KLSAgICAgIHN5bTIgPSBjaGlsZDsKLSAgICAgIGlmIChzeW0yLT5uZXh0KQotCXdoaWxlIChzeW0yLT5uZXh0KQotCSAgc3ltMiA9IHN5bTItPm5leHQ7Ci0gICAgICBlbHNlCi0Jd2hpbGUgKHN5bTItPnByZXYpCi0JICBzeW0yID0gc3ltMi0+cHJldjsKLQotICAgICAgaWYgKHN5bTEgPT0gY2hpbGQKLQkgICYmIHN5bTIgPT0gcGFyZW50KQotCXsKLQkgIC8qIFRoaXMgd291bGQgdGllIHR3byBlbmRzIHRvZ2V0aGVyLiAgKi8KLQkgIHVucGxhY2VkX2FyY3NbKCp1bnBsYWNlZF9hcmNfY291bnQpKytdID0gYXJjc1tpbmRleF07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChwYXJlbnQtPm5leHQpCi0JewotCSAgLyogTXVzdCBhdHRhY2ggdG8gdGhlIHBhcmVudCdzIHByZXYgZmllbGQuICAqLwotCSAgaWYgKCEgY2hpbGQtPm5leHQpCi0JICAgIHsKLQkgICAgICAvKiBwYXJlbnQtcHJldiBhbmQgY2hpbGQtbmV4dCAqLwotCSAgICAgIHBhcmVudC0+cHJldiA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5uZXh0ID0gcGFyZW50OwotCSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAocGFyZW50LT5wcmV2KQotCXsKLQkgIC8qIE11c3QgYXR0YWNoIHRvIHRoZSBwYXJlbnQncyBuZXh0IGZpZWxkLiAgKi8KLQkgIGlmICghIGNoaWxkLT5wcmV2KQotCSAgICB7Ci0JICAgICAgLyogcGFyZW50LW5leHQgYW5kIGNoaWxkLXByZXYgKi8KLQkgICAgICBwYXJlbnQtPm5leHQgPSBjaGlsZDsKLQkgICAgICBjaGlsZC0+cHJldiA9IHBhcmVudDsKLQkgICAgICBhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYW4gYXR0YWNoIHRvIGVpdGhlciBmaWVsZCBpbiB0aGUgcGFyZW50LCBkZXBlbmRzCi0JICAgICBvbiB3aGVyZSB3ZSd2ZSBnb3Qgc3BhY2UgaW4gdGhlIGNoaWxkLiAgKi8KLQkgIGlmIChjaGlsZC0+cHJldikKLQkgICAgewotCSAgICAgIC8qIHBhcmVudC1wcmV2IGFuZCBjaGlsZC1uZXh0ICovCi0JICAgICAgcGFyZW50LT5wcmV2ID0gY2hpbGQ7Ci0JICAgICAgY2hpbGQtPm5leHQgPSBwYXJlbnQ7Ci0JICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHBhcmVudC1uZXh0IGFuZCBjaGlsZC1wcmV2ICovCi0JICAgICAgcGFyZW50LT5uZXh0ID0gY2hpbGQ7Ci0JICAgICAgY2hpbGQtPnByZXYgPSBwYXJlbnQ7Ci0JICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIER1bXAgdGhlIGNoYWlucyBvZiBmdW5jdGlvbnMgd2UndmUgbWFkZS4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgewotICAgICAgU3ltICpzeW07Ci0gICAgICBpZiAoYXJjc1tpbmRleF0tPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkCi0JICB8fCBhcmNzW2luZGV4XS0+Y2hpbGQtPmhhc19iZWVuX3BsYWNlZCkKLQljb250aW51ZTsKLQotICAgICAgc3ltID0gYXJjc1tpbmRleF0tPnBhcmVudDsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXNuJ3QgYXR0YWNoZWQgdG8gYW55IG90aGVyCi0JIHN5bWJvbHMsIHRoZW4gd2UndmUgZ290IGEgcmFyZWx5IHVzZWQgYXJjLgotCi0JIFNraXAgaXQgZm9yIG5vdywgd2UnbGwgZGVhbCB3aXRoIHRoZW0gbGF0ZXIuICAqLwotICAgICAgaWYgKHN5bS0+bmV4dCA9PSBOVUxMCi0JICAmJiBzeW0tPnByZXYgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRvIHRoZSBzdGFydCBvZiB0aGlzIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChzeW0tPnByZXYpCi0Jc3ltID0gc3ltLT5wcmV2OwotCi0gICAgICB3aGlsZSAoc3ltKQotCXsKLQkgIC8qIE1hcmsgaXQgYXMgcGxhY2VkLiAgKi8KLQkgIHN5bS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgIHByaW50ZiAoIiVzXG4iLCBzeW0tPm5hbWUpOwotCSAgc3ltID0gc3ltLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2Ugd2FudCB0byBwbGFjZSBhbGwgdGhlIGFyY3MsIHRoZW4gb3V0cHV0IHRob3NlIHdoaWNoIHdlcmVuJ3QKLSAgICAgcGxhY2VkIGJ5IHRoZSBtYWluIGFsZ29yaXRobS4gICovCi0gIGlmIChhbGwpCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICAgIHsKLQlTeW0gKnN5bTsKLQlpZiAoYXJjc1tpbmRleF0tPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkCi0JICAgIHx8IGFyY3NbaW5kZXhdLT5jaGlsZC0+aGFzX2JlZW5fcGxhY2VkKQotCSAgY29udGludWU7Ci0KLQlzeW0gPSBhcmNzW2luZGV4XS0+cGFyZW50OwotCi0Jc3ltLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCXByaW50ZiAoIiVzXG4iLCBzeW0tPm5hbWUpOwotICAgICAgfQotfQotCi0vKiBQcmludCBhIHN1Z2dlc3RlZCAubyBvcmRlcmluZyBmb3IgZmlsZXMgb24gYSBsaW5rIGxpbmUgYmFzZWQKLSAgIG9uIHByb2ZpbGluZyBpbmZvcm1hdGlvbi4gIFRoaXMgdXNlcyB0aGUgZnVuY3Rpb24gcGxhY2VtZW50Ci0gICBjb2RlIGZvciB0aGUgYnVsayBvZiBpdHMgd29yay4gICovCi0KLXN0cnVjdCBmdW5jdGlvbl9tYXAgewotICBjaGFyICpmdW5jdGlvbl9uYW1lOwotICBjaGFyICpmaWxlX25hbWU7Ci19OwotCi12b2lkCi1ERUZVTl9WT0lEIChjZ19wcmludF9maWxlX29yZGVyaW5nKQotewotICB1bnNpZ25lZCBsb25nIHNjcmF0Y2hfYXJjX2NvdW50LCBpbmRleDsKLSAgQXJjICoqc2NyYXRjaF9hcmNzOwotICBleHRlcm4gc3RydWN0IGZ1bmN0aW9uX21hcCAqc3ltYm9sX21hcDsKLSAgZXh0ZXJuIHVuc2lnbmVkIGludCBzeW1ib2xfbWFwX2NvdW50OwotICBjaGFyICpsYXN0OwotCi0gIHNjcmF0Y2hfYXJjX2NvdW50ID0gMDsKLQotICBzY3JhdGNoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmICghIGFyY3NbaW5kZXhdLT5wYXJlbnQtPm1hcHBlZAotCSAgfHwgISBhcmNzW2luZGV4XS0+Y2hpbGQtPm1hcHBlZCkKLQlhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLSAgICB9Ci0KLSAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIDAsCi0JCQkJICAgIHNjcmF0Y2hfYXJjcywgJnNjcmF0Y2hfYXJjX2NvdW50KTsKLQotICAvKiBPdXRwdXQgLm8ncyBub3QgaGFuZGxlZCBieSB0aGUgbWFpbiBwbGFjZW1lbnQgYWxnb3JpdGhtLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoc3ltdGFiLmJhc2VbaW5kZXhdLm1hcHBlZAotCSAgJiYgISBzeW10YWIuYmFzZVtpbmRleF0uaGFzX2JlZW5fcGxhY2VkKQotCXByaW50ZiAoIiVzXG4iLCBzeW10YWIuYmFzZVtpbmRleF0ubmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyBvdXRwdXQgYW55IC5vJ3MgdGhhdCBkaWRuJ3QgaGF2ZSBhbnkgdGV4dCBzeW1ib2xzLiAgKi8KLSAgbGFzdCA9IE5VTEw7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bWJvbF9tYXBfY291bnQ7IGluZGV4KyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGluZGV4MjsKLQotICAgICAgLyogRG9uJ3QgYm90aGVyIHNlYXJjaGluZyBpZiB0aGlzIHN5bWJvbCBpcyB0aGUKLQkgc2FtZSBhcyB0aGUgcHJldmlvdXMgb25lLiAgKi8KLSAgICAgIGlmIChsYXN0ICYmICFzdHJjbXAgKGxhc3QsIHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZSkpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAoaW5kZXgyID0gMDsgaW5kZXgyIDwgc3ltdGFiLmxlbjsgaW5kZXgyKyspCi0JewotCSAgaWYgKCEgc3ltdGFiLmJhc2VbaW5kZXgyXS5tYXBwZWQpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoIXN0cmNtcCAoc3ltdGFiLmJhc2VbaW5kZXgyXS5uYW1lLCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpKQotCSAgICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGl0IGluIHRoZSBzeW1ib2wgdGFibGUsIHRoZW4gaXQgbXVzdCBiZSBhIC5vCi0JIHdpdGggbm8gdGV4dCBzeW1ib2xzLiAgT3V0cHV0IGl0IGxhc3QuICAqLwotICAgICAgaWYgKGluZGV4MiA9PSBzeW10YWIubGVuKQotCXByaW50ZiAoIiVzXG4iLCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpOwotICAgICAgbGFzdCA9IHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZTsKLSAgICB9IAotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfcHJpbnQuaCBiL2dwcm9mL2NnX3ByaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmM0YWEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfcHJpbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNpZm5kZWYgY2dfcHJpbnRfaAotI2RlZmluZSBjZ19wcmludF9oCi0KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1leHRlcm4gZG91YmxlIHByaW50X3RpbWU7CS8qIHRvdGFsIG9mIHRpbWUgYmVpbmcgcHJpbnRlZCAqLwotCi1leHRlcm4gdm9pZCBjZ19wcmludCBQQVJBTVMgKChTeW0gKiogY2cpKTsKLWV4dGVybiB2b2lkIGNnX3ByaW50X2luZGV4IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogY2dfcHJpbnRfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29uZmlndXJlIGIvZ3Byb2YvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDdkNzFhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MTQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9Z3Byb2YuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDE6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjIyOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDA6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc1OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcyODogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODU6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWdwcm9mCi0KLVZFUlNJT049Mi45LjUKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MzE6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODQ0OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4ODM6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5Njk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk5OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMTI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDExMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTI4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTU5OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTY4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExODc6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjMwOiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNTQ6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1NzogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyOTM6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMDk6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzQ3OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE0OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MTI6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MjE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyNDogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTUwOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNTkyICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTkzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY0OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2ODE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcxNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgQVM9ImZhbHNlIgotZmkKLWZpCi0KLQotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAotZWxzZQotICBuZWVkX2xvY2tzPXllcwotZmkKLQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0KLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkxNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5Njc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5OTk6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDIwMTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNDE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDQ2OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDU1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzQ6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjExNzogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE3MTogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxOTQ6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI3NDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI4NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzA0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNzg6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM4MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NTM6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0Njc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDkzOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MjY6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU2MTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU3MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1OTQ6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjI3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY1OTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjg5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3MTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc0NDogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzk2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjgwMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgwNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODM1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4ODg6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4OTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMDQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE2MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMjM6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjU2OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNzY6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI5NTogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzA1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMyMjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzNTA6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM4NTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NTk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUxNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjU2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc4MjogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgxMDogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzgxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4ODM6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTA2OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTIyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTM5OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5NDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTUxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NzA6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGdjb25maWcuaDpnY29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9Imdjb25maWcuaDpnY29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9ncHJvZi9jb25maWd1cmUuaW4gYi9ncHJvZi9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjI4OWYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQoZ3Byb2YuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BTV9JTklUX0FVVE9NQUtFKGdwcm9mLCAyLjkuNSkKLQotQU1fUFJPR19MSUJUT09MCi0KLWRubCBGb3Igc2ltcGxpY2l0eSwgd2UgdXNlIHRoZSBCRkQgY29uZmlndXJhdGlvbiBmaWxlIGZvciBtb3N0Ci1kbmwgdGhpbmdzLiAgSG93ZXZlciwgd2UgYWxzbyBuZWVkIG91ciBvd24gY29uZmlndXJhdGlvbiBmaWxlIGZvcgotZG5sIHRoZSBhdXRvbWFrZSBQQUNLQUdFIGFuZCBWRVJTSU9OIG1hY3Jvcy4gIFdlIGRvbid0IG5hbWUgaXQKLWRubCBjb25maWcuaCwgdG8gYXZvaWQgYW55IHBvc3NpYmxlIGNvbmZ1c2lvbiB3aXRoIHRoZSBiZmQgY29uZmlnLmguCi1BTV9DT05GSUdfSEVBREVSKGdjb25maWcuaDpnY29uZmlnLmluKQotCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0lOU1RBTEwKLQotQUNfSVNDX1BPU0lYCi0KLUFMTF9MSU5HVUFTPQotQ1lfR05VX0dFVFRFWFQKLQotQU1fTUFJTlRBSU5FUl9NT0RFCi1BQ19FWEVFWFQKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2dwcm9mL2NvcmVmaWxlLmMgYi9ncHJvZi9jb3JlZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTBmYzI4Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NvcmVmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjYgKzAsMCBAQAotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotYmZkICpjb3JlX2JmZDsKLWludCBjb3JlX251bV9zeW1zOwotYXN5bWJvbCAqKmNvcmVfc3ltczsKLWFzZWN0aW9uICpjb3JlX3RleHRfc2VjdDsKLVBUUiBjb3JlX3RleHRfc3BhY2U7Ci0KLWludCBtaW5faW5zbl9zaXplOwotaW50IG9mZnNldF90b19jb2RlOwotCi0vKiBGb3IgbWFwcGluZyBzeW1ib2xzIHRvIHNwZWNpZmljIC5vIGZpbGVzIGR1cmluZyBmaWxlIG9yZGVyaW5nLiAgKi8KLXN0cnVjdCBmdW5jdGlvbl9tYXAgewotICBjaGFyICpmdW5jdGlvbl9uYW1lOwotICBjaGFyICpmaWxlX25hbWU7Ci19OwotCi1zdHJ1Y3QgZnVuY3Rpb25fbWFwICpzeW1ib2xfbWFwOwotdW5zaWduZWQgaW50IHN5bWJvbF9tYXBfY291bnQ7Ci0KLWV4dGVybiB2b2lkIGkzODZfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCBhbHBoYV9maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIHZheF9maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIHRhaG9lX2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgc3BhcmNfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocmVhZF9mdW5jdGlvbl9tYXBwaW5ncywgKGZpbGVuYW1lKSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIEZJTEUgKmZpbGUgPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0gIGNoYXIgZHVtbXlbMTAyNF07Ci0gIGludCBjb3VudCA9IDA7Ci0KLSAgaWYgKCFmaWxlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNvdWxkIG5vdCBvcGVuICVzLlxuIiksIHdob2FtaSwgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIEZpcnN0IHBhcnNlIHRoZSBtYXBwaW5nIGZpbGUgc28gd2Uga25vdyBob3cgYmlnIHdlIG5lZWQgdG8KLSAgICAgbWFrZSBvdXIgdGFibGVzLiAgV2UgYWxzbyBkbyBzb21lIHNhbml0eSBjaGVja3MgYXQgdGhpcwotICAgICB0aW1lLiAgKi8KLSAgd2hpbGUgKCFmZW9mIChmaWxlKSkKLSAgICB7Ci0gICAgICBpbnQgbWF0Y2hlczsKLQotICAgICAgbWF0Y2hlcyA9IGZzY2FuZiAoZmlsZSwgIiVbXlxuOl0iLCBkdW1teSk7Ci0gICAgICBpZiAoIW1hdGNoZXMpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5hYmxlIHRvIHBhcnNlIG1hcHBpbmcgZmlsZSAlcy5cbiIpLAotCQkgICB3aG9hbWksIGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogSnVzdCBza2lwIG1lc3NhZ2VzIGFib3V0IGZpbGVzIHdpdGggbm8gc3ltYm9scy4gICovCi0gICAgICBpZiAoIXN0cm5jbXAgKGR1bW15LCAiTm8gc3ltYm9scyBpbiAiLCAxNCkpCi0JewotCSAgZnNjYW5mIChmaWxlLCAiXG4iKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogRG9uJ3QgY2FyZSB3aGF0IGVsc2UgaXMgb24gdGhpcyBsaW5lIGF0IHRoaXMgcG9pbnQuICAqLwotICAgICAgZnNjYW5mIChmaWxlLCAiJVteXG5dXG4iLCBkdW1teSk7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLQotICAvKiBOb3cgd2Uga25vdyBob3cgYmlnIHdlIG5lZWQgdG8gbWFrZSBvdXIgdGFibGUuICAqLwotICBzeW1ib2xfbWFwID0gKChzdHJ1Y3QgZnVuY3Rpb25fbWFwICopCi0JCXhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZnVuY3Rpb25fbWFwKSkpOwotCi0gIC8qIFJld2luZCB0aGUgaW5wdXQgZmlsZSBzbyB3ZSBjYW4gcmVhZCBpdCBhZ2Fpbi4gICovCi0gIHJld2luZCAoZmlsZSk7Ci0KLSAgLyogUmVhZCBlYWNoIGVudHJ5IGFuZCBwdXQgaXQgaW50byB0aGUgdGFibGUuICAqLwotICBjb3VudCA9IDA7Ci0gIHdoaWxlICghZmVvZiAoZmlsZSkpCi0gICAgewotICAgICAgaW50IG1hdGNoZXM7Ci0gICAgICBjaGFyICp0bXA7Ci0KLSAgICAgIG1hdGNoZXMgPSBmc2NhbmYgKGZpbGUsICIlW15cbjpdIiwgZHVtbXkpOwotICAgICAgaWYgKCFtYXRjaGVzKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVuYWJsZSB0byBwYXJzZSBtYXBwaW5nIGZpbGUgJXMuXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIEp1c3Qgc2tpcCBtZXNzYWdlcyBhYm91dCBmaWxlcyB3aXRoIG5vIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCFzdHJuY21wIChkdW1teSwgIk5vIHN5bWJvbHMgaW4gIiwgMTQpKQotCXsKLQkgIGZzY2FuZiAoZmlsZSwgIlxuIik7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIGR1bW15IGhhcyB0aGUgZmlsZW5hbWUsIGdvIGFoZWFkIGFuZCBjb3B5IGl0LiAgKi8KLSAgICAgIHN5bWJvbF9tYXBbY291bnRdLmZpbGVfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoZHVtbXkpICsgMSk7Ci0gICAgICBzdHJjcHkgKHN5bWJvbF9tYXBbY291bnRdLmZpbGVfbmFtZSwgZHVtbXkpOwotCi0gICAgICAvKiBOb3cgd2UgbmVlZCB0aGUgZnVuY3Rpb24gbmFtZS4gICovCi0gICAgICBmc2NhbmYgKGZpbGUsICIlW15cbl1cbiIsIGR1bW15KTsKLSAgICAgIHRtcCA9IHN0cnJjaHIgKGR1bW15LCAnICcpICsgMTsKLSAgICAgIHN5bWJvbF9tYXBbY291bnRdLmZ1bmN0aW9uX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKHRtcCkgKyAxKTsKLSAgICAgIHN0cmNweSAoc3ltYm9sX21hcFtjb3VudF0uZnVuY3Rpb25fbmFtZSwgdG1wKTsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gIC8qIFJlY29yZCB0aGUgc2l6ZSBvZiB0aGUgbWFwIHRhYmxlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiAgKi8KLSAgc3ltYm9sX21hcF9jb3VudCA9IGNvdW50OwotfQotCi12b2lkCi1ERUZVTiAoY29yZV9pbml0LCAoYV9vdXRfbmFtZSksIGNvbnN0IGNoYXIgKmFfb3V0X25hbWUpCi17Ci0gIGNvcmVfYmZkID0gYmZkX29wZW5yIChhX291dF9uYW1lLCAwKTsKLQotICBpZiAoIWNvcmVfYmZkKQotICAgIHsKLSAgICAgIHBlcnJvciAoYV9vdXRfbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChjb3JlX2JmZCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IG5vdCBpbiBhLm91dCBmb3JtYXRcbiIpLCB3aG9hbWksIGFfb3V0X25hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIGdldCBjb3JlJ3MgdGV4dCBzZWN0aW9uOiAqLwotICBjb3JlX3RleHRfc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChjb3JlX2JmZCwgIi50ZXh0Iik7Ci0gIGlmICghY29yZV90ZXh0X3NlY3QpCi0gICAgewotICAgICAgY29yZV90ZXh0X3NlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoY29yZV9iZmQsICIkQ09ERSQiKTsKLSAgICAgIGlmICghY29yZV90ZXh0X3NlY3QpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY2FuJ3QgZmluZCAudGV4dCBzZWN0aW9uIGluICVzXG4iKSwKLQkJICAgd2hvYW1pLCBhX291dF9uYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICB9Ci0KLSAgLyogcmVhZCBjb3JlJ3Mgc3ltYm9sIHRhYmxlOiAqLwotCi0gIC8qIHRoaXMgd2lsbCBwcm9iYWJseSBnaXZlIHVzIG1vcmUgdGhhbiB3ZSBuZWVkLCBidXQgdGhhdCdzIG9rOiAgKi8KLSAgY29yZV9udW1fc3ltcyA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChjb3JlX2JmZCk7Ci0gIGlmIChjb3JlX251bV9zeW1zIDwgMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLCB3aG9hbWksIGFfb3V0X25hbWUsCi0JICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBjb3JlX3N5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoY29yZV9udW1fc3ltcyk7Ci0gIGNvcmVfbnVtX3N5bXMgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoY29yZV9iZmQsIGNvcmVfc3ltcyk7Ci0gIGlmIChjb3JlX251bV9zeW1zIDwgMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLCB3aG9hbWksIGFfb3V0X25hbWUsCi0JICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBtaW5faW5zbl9zaXplID0gMTsKLSAgb2Zmc2V0X3RvX2NvZGUgPSAwOwotCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChjb3JlX2JmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgIGNhc2UgYmZkX2FyY2hfdGFob2U6Ci0gICAgICBvZmZzZXRfdG9fY29kZSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBtaW5faW5zbl9zaXplID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoZnVuY3Rpb25fbWFwcGluZ19maWxlKQotICAgIHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MgKGZ1bmN0aW9uX21hcHBpbmdfZmlsZSk7Ci19Ci0KLQotLyoKLSAqIFJlYWQgaW4gdGhlIHRleHQgc3BhY2Ugb2YgYW4gYS5vdXQgZmlsZQotICovCi12b2lkCi1ERUZVTiAoY29yZV9nZXRfdGV4dF9zcGFjZSwgKGNvcmVfYmZkKSwgYmZkICogY29yZV9iZmQpCi17Ci0gIGNvcmVfdGV4dF9zcGFjZSA9IChQVFIpIG1hbGxvYyAoY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKCFjb3JlX3RleHRfc3BhY2UpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogcmFuIG91dCByb29tIGZvciAlbHUgYnl0ZXMgb2YgdGV4dCBzcGFjZVxuIiksCi0JICAgICAgIHdob2FtaSwgKHVuc2lnbmVkIGxvbmcpIGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoY29yZV9iZmQsIGNvcmVfdGV4dF9zZWN0LCBjb3JlX3RleHRfc3BhY2UsCi0JCQkJIDAsIGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUpKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKCJiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIGZyZWUgKGNvcmVfdGV4dF9zcGFjZSk7Ci0gICAgICBjb3JlX3RleHRfc3BhY2UgPSAwOwotICAgIH0KLSAgaWYgKCFjb3JlX3RleHRfc3BhY2UpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY2FuJ3QgZG8gLWNcbiIpLCB3aG9hbWkpOwotICAgIH0KLX0KLQotCi12b2lkCi1ERUZVTiAoZmluZF9jYWxsLCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyksCi0gICAgICAgU3ltICogcGFyZW50IEFORCBiZmRfdm1hIHBfbG93cGMgQU5EIGJmZF92bWEgcF9oaWdocGMpCi17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChjb3JlX2JmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIGkzODZfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIGFscGhhX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgICAgdmF4X2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBzcGFyY19maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX3RhaG9lOgotICAgICAgdGFob2VfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IC1jIG5vdCBzdXBwb3J0ZWQgb24gYXJjaGl0ZWN0dXJlICVzXG4iKSwKLQkgICAgICAgd2hvYW1pLCBiZmRfcHJpbnRhYmxlX25hbWUoY29yZV9iZmQpKTsKLQotICAgICAgLyogRG9uJ3QgZ2l2ZSB0aGUgZXJyb3IgbW9yZSB0aGFuIG9uY2UuICAqLwotICAgICAgaWdub3JlX2RpcmVjdF9jYWxscyA9IEZBTFNFOwotICAgIH0KLX0KLQotLyoKLSAqIFJldHVybiBjbGFzcyBvZiBzeW1ib2wgU1lNLiAgVGhlIHJldHVybmVkIGNsYXNzIGNhbiBiZSBhbnkgb2Y6Ci0gKiAgICAgIDAgICAtPiBzeW1ib2wgaXMgbm90IGludGVyZXN0aW5nIHRvIHVzCi0gKiAgICAgICdUJyAtPiBzeW1ib2wgaXMgYSBnbG9iYWwgbmFtZQotICogICAgICAndCcgLT4gc3ltYm9sIGlzIGEgbG9jYWwgKHN0YXRpYykgbmFtZQotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY29yZV9zeW1fY2xhc3MsIChzeW0pLCBhc3ltYm9sICogc3ltKQotewotICBzeW1ib2xfaW5mbyBzeW1pbmZvOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjaGFyIHN5bV9wcmVmaXg7Ci0gIGludCBpOwotCi0gIGlmIChzeW0tPnNlY3Rpb24gPT0gTlVMTCB8fCAoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qCi0gICAqIE11c3QgYmUgYSB0ZXh0IHN5bWJvbCwgYW5kIHN0YXRpYyB0ZXh0IHN5bWJvbHMgZG9uJ3QgcXVhbGlmeSBpZgotICAgKiBpZ25vcmVfc3RhdGljX2Z1bmNzIHNldC4KLSAgICovCi0gIGlmIChpZ25vcmVfc3RhdGljX2Z1bmNzICYmIChzeW0tPmZsYWdzICYgQlNGX0xPQ0FMKSkKLSAgICB7Ci0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2NvcmVfc3ltX2NsYXNzXSAlczogbm90IGEgZnVuY3Rpb25cbiIsCi0JCQkgICAgICBzeW0tPm5hbWUpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBiZmRfZ2V0X3N5bWJvbF9pbmZvIChjb3JlX2JmZCwgc3ltLCAmc3ltaW5mbyk7Ci0gIGkgPSBzeW1pbmZvLnR5cGU7Ci0KLSAgaWYgKGkgPT0gJ1QnKQotICAgIHsKLSAgICAgIHJldHVybiBpOwkJCS8qIGl0J3MgYSBnbG9iYWwgc3ltYm9sICovCi0gICAgfQotCi0gIGlmIChpID09ICdXJykKLSAgICB7Ci0gICAgICAvKiBUcmVhdCB3ZWFrIHN5bWJvbHMgYXMgdGV4dCBzeW1ib2xzLiAgRklYTUU6IGEgd2VhayBzeW1ib2wgbWF5Ci0gICAgICAgICBhbHNvIGJlIGEgZGF0YSBzeW1ib2wuICAqLwotICAgICAgcmV0dXJuICdUJzsKLSAgICB9Ci0KLSAgaWYgKGkgIT0gJ3QnKQotICAgIHsKLSAgICAgIC8qIG5vdCBhIHN0YXRpYyB0ZXh0IHN5bWJvbCAqLwotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX3N5bV9jbGFzc10gJXMgaXMgb2YgY2xhc3MgJWNcbiIsCi0JCQkgICAgICBzeW0tPm5hbWUsIGkpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBkbyBzb21lIG1vcmUgZmlsdGVyaW5nIG9uIHN0YXRpYyBmdW5jdGlvbi1uYW1lczogKi8KLQotICBpZiAoaWdub3JlX3N0YXRpY19mdW5jcykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIC8qCi0gICAqIENhbid0IHplcm8tbGVuZ3RoIG5hbWUgb3IgZnVubnkgY2hhcmFjdGVycyBpbiBuYW1lLCB3aGVyZQotICAgKiBgZnVubnknIGluY2x1ZGVzOiBgLicgKC5vIGZpbGUgbmFtZXMpIGFuZCBgJCcgKFBhc2NhbCBsYWJlbHMpLgotICAgKi8KLSAgaWYgKCFzeW0tPm5hbWUgfHwgc3ltLT5uYW1lWzBdID09ICdcMCcpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAobmFtZSA9IHN5bS0+bmFtZTsgKm5hbWU7ICsrbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUgPT0gJy4nIHx8ICpuYW1lID09ICckJykKLQl7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICAvKgotICAgKiBPbiBzeXN0ZW1zIHdoZXJlIHRoZSBDIGNvbXBpbGVyIGFkZHMgYW4gdW5kZXJzY29yZSB0byBhbGwKLSAgICogbmFtZXMsIHN0YXRpYyBuYW1lcyB3aXRob3V0IHVuZGVyc2NvcmVzIHNlZW0gdXN1YWxseSB0byBiZQotICAgKiBsYWJlbHMgaW4gaGFuZCB3cml0dGVuIGFzc2VtYmxlciBpbiB0aGUgbGlicmFyeS4gIFdlIGRvbid0IHdhbnQKLSAgICogdGhlc2UgbmFtZXMuICBUaGlzIGlzIGNlcnRhaW5seSBuZWNlc3Nhcnkgb24gYSBTcGFyYyBydW5uaW5nCi0gICAqIFN1bk9TIDQuMSAodHJ5IHByb2ZpbGluZyBhIHByb2dyYW0gdGhhdCBkb2VzIGEgbG90IG9mCi0gICAqIGRpdmlzaW9uKS4gSSBkb24ndCBrbm93IHdoZXRoZXIgaXQgaGFzIGhhcm1mdWwgc2lkZSBlZmZlY3RzIG9uCi0gICAqIG90aGVyIHN5c3RlbXMuICBQZXJoYXBzIGl0IHNob3VsZCBiZSBtYWRlIGNvbmZpZ3VyYWJsZS4KLSAgICovCi0gIHN5bV9wcmVmaXggPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGNvcmVfYmZkKTsKLSAgaWYgKChzeW1fcHJlZml4ICYmIHN5bV9wcmVmaXggIT0gc3ltLT5uYW1lWzBdKQotICAvKgotICAgKiBHQ0MgbWF5IGFkZCBzcGVjaWFsIHN5bWJvbHMgdG8gaGVscCBnZGIgZmlndXJlIG91dCB0aGUgZmlsZQotICAgKiBsYW5ndWFnZS4gIFdlIHdhbnQgdG8gaWdub3JlIHRoZXNlLCBzaW5jZSBzb21ldGltZXMgdGhleSBtYXNrCi0gICAqIHRoZSByZWFsIGZ1bmN0aW9uLiAgKGRqQGN0cm9uKQotICAgKi8KLSAgICAgIHx8ICFzdHJuY21wIChzeW0tPm5hbWUsICJfX2dudV9jb21waWxlZCIsIDE0KQotICAgICAgfHwgIXN0cm5jbXAgKHN5bS0+bmFtZSwgIl9fX2dudV9jb21waWxlZCIsIDE1KSkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG9iamVjdCBmaWxlIHN1cHBvcnRzIG1hcmtpbmcgb2YgZnVuY3Rpb24gc3ltYm9scywgdGhlbiB3ZSBjYW4KLSAgICAgemFwIGFueXRoaW5nIHRoYXQgZG9lc24ndCBoYXZlIEJTRl9GVU5DVElPTiBzZXQuICAqLwotICBpZiAoaWdub3JlX25vbl9mdW5jdGlvbnMgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuICd0JzsJCQkvKiBpdCdzIGEgc3RhdGljIHRleHQgc3ltYm9sICovCi19Ci0KLQotLyoKLSAqIEdldCB3aGF0ZXZlciBzb3VyY2UgaW5mbyB3ZSBjYW4gZ2V0IHJlZ2FyZGluZyBhZGRyZXNzIEFERFI6Ci0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAoZ2V0X3NyY19pbmZvLCAoYWRkciwgZmlsZW5hbWUsIG5hbWUsIGxpbmVfbnVtKSwKLSAgICAgICBiZmRfdm1hIGFkZHIgQU5EIGNvbnN0IGNoYXIgKipmaWxlbmFtZSBBTkQgY29uc3QgY2hhciAqKm5hbWUKLSAgICAgICBBTkQgaW50ICpsaW5lX251bSkKLXsKLSAgY29uc3QgY2hhciAqZm5hbWUgPSAwLCAqZnVuY19uYW1lID0gMDsKLSAgaW50IGwgPSAwOwotCi0gIGlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGNvcmVfYmZkLCBjb3JlX3RleHRfc2VjdCwgY29yZV9zeW1zLAotCQkJICAgICBhZGRyIC0gY29yZV90ZXh0X3NlY3QtPnZtYSwKLQkJCSAgICAgJmZuYW1lLCAmZnVuY19uYW1lLCAodW5zaWduZWQgaW50ICopICZsKQotICAgICAgJiYgZm5hbWUgJiYgZnVuY19uYW1lICYmIGwpCi0gICAgewotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltnZXRfc3JjX2luZm9dIDB4JWx4IC0+ICVzOiVkICglcylcbiIsCi0JCQkgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwgZm5hbWUsIGwsIGZ1bmNfbmFtZSkpOwotICAgICAgKmZpbGVuYW1lID0gZm5hbWU7Ci0gICAgICAqbmFtZSA9IGZ1bmNfbmFtZTsKLSAgICAgICpsaW5lX251bSA9IGw7Ci0gICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2dldF9zcmNfaW5mb10gbm8gaW5mbyBmb3IgMHglbHggKCVzOiVkLCVzKVxuIiwKLQkJCSAgICAgIChsb25nKSBhZGRyLCBmbmFtZSA/IGZuYW1lIDogIjx1bmtub3duPiIsIGwsCi0JCQkgICAgICBmdW5jX25hbWUgPyBmdW5jX25hbWUgOiAiPHVua25vd24+IikpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotCi0vKgotICogUmVhZCBpbiBzeW1ib2wgdGFibGUgZnJvbSBjb3JlLiAgT25lIHN5bWJvbCBwZXIgZnVuY3Rpb24gaXMKLSAqIGVudGVyZWQuCi0gKi8KLXZvaWQKLWNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgKGNvcmVfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF92bWEgbWluX3ZtYSA9IH4wLCBtYXhfdm1hID0gMDsKLSAgaW50IGNsYXNzOwotICBsb25nIGksIGZvdW5kLCBza2lwOwotICB1bnNpZ25lZCBpbnQgajsKLQotICAvKiBwYXNzIDEgLSBkZXRlcm1pbmUgdXBwZXIgYm91bmQgb24gbnVtYmVyIG9mIGZ1bmN0aW9uIG5hbWVzOiAqLwotICBzeW10YWIubGVuID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IGNvcmVfbnVtX3N5bXM7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoIWNvcmVfc3ltX2NsYXNzIChjb3JlX3N5bXNbaV0pKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhIGJpbmFyeSBzZWFyY2ggb3IgaGFzaGVkCi0JIHNlYXJjaC4gIEdyb3NzLiAKLQotCSBEb24ndCBjcmVhdGUgYSBzeW10YWIgZW50cnkgZm9yIGEgZnVuY3Rpb24gdGhhdCBoYXMKLQkgYSBtYXBwaW5nIHRvIGEgZmlsZSwgdW5sZXNzIGl0J3MgdGhlIGZpcnN0IGZ1bmN0aW9uCi0JIGluIHRoZSBmaWxlLiAgKi8KLSAgICAgIHNraXAgPSAwOwotICAgICAgZm9yIChqID0gMDsgaiA8IHN5bWJvbF9tYXBfY291bnQ7IGorKykKLQlpZiAoIXN0cmNtcCAoY29yZV9zeW1zW2ldLT5uYW1lLCBzeW1ib2xfbWFwW2pdLmZ1bmN0aW9uX25hbWUpKQotCSAgewotCSAgICBpZiAoaiA+IDAgJiYgISBzdHJjbXAgKHN5bWJvbF9tYXAgW2pdLmZpbGVfbmFtZSwKLQkJCSAJICAgc3ltYm9sX21hcCBbaiAtIDFdLmZpbGVfbmFtZSkpCi0JICAgICAgc2tpcCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgaWYgKCFza2lwKQotICAgICAgICArK3N5bXRhYi5sZW47Ci0gICAgfQotCi0gIGlmIChzeW10YWIubGVuID09IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSBgJXMnIGhhcyBubyBzeW1ib2xzXG4iKSwgd2hvYW1pLCBhX291dF9uYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiB0aGUgIisgMiIgaXMgZm9yIHRoZSBzZW50aW5lbHM6ICovCi0gIHN5bXRhYi5iYXNlID0gKFN5bSAqKSB4bWFsbG9jICgoc3ltdGFiLmxlbiArIDIpICogc2l6ZW9mIChTeW0pKTsKLQotICAvKiBwYXNzIDIgLSBjcmVhdGUgc3ltYm9sczogKi8KLQotICBzeW10YWIubGltaXQgPSBzeW10YWIuYmFzZTsKLSAgZm9yIChpID0gMDsgaSA8IGNvcmVfbnVtX3N5bXM7ICsraSkKLSAgICB7Ci0gICAgICBjbGFzcyA9IGNvcmVfc3ltX2NsYXNzIChjb3JlX3N5bXNbaV0pOwotICAgICAgaWYgKCFjbGFzcykKLQl7Ci0JICBEQkcgKEFPVVRERUJVRywKLQkgICAgICAgcHJpbnRmICgiW2NvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXNdIHJlamVjdGluZzogMHglbHggJXNcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgY29yZV9zeW1zW2ldLT52YWx1ZSwKLQkJICAgICAgIGNvcmVfc3ltc1tpXS0+bmFtZSkpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgLyogVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhIGJpbmFyeSBzZWFyY2ggb3IgaGFzaGVkCi0JIHNlYXJjaC4gIEdyb3NzLiAgICovCi0KLSAgICAgIHNraXAgPSAwOwotICAgICAgZm91bmQgPSAwOwotICAgICAgZm9yIChqID0gMDsgaiA8IHN5bWJvbF9tYXBfY291bnQ7IGorKykKLQlpZiAoIXN0cmNtcCAoY29yZV9zeW1zW2ldLT5uYW1lLCBzeW1ib2xfbWFwW2pdLmZ1bmN0aW9uX25hbWUpKQotCSAgewotCSAgICBpZiAoaiA+IDAgJiYgISBzdHJjbXAgKHN5bWJvbF9tYXAgW2pdLmZpbGVfbmFtZSwKLQkJCSAJICAgc3ltYm9sX21hcCBbaiAtIDFdLmZpbGVfbmFtZSkpCi0JICAgICAgc2tpcCA9IDE7Ci0JICAgIGVsc2UKLQkgICAgICBmb3VuZCA9IGo7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0gICAgICBpZiAoc2tpcCkKLQljb250aW51ZTsKLQotICAgICAgc3ltX2luaXQgKHN5bXRhYi5saW1pdCk7Ci0KLSAgICAgIC8qIHN5bWJvbCBvZmZzZXRzIGFyZSBhbHdheXMgc2VjdGlvbi1yZWxhdGl2ZTogKi8KLQotICAgICAgc3ltdGFiLmxpbWl0LT5hZGRyID0gY29yZV9zeW1zW2ldLT52YWx1ZSArIGNvcmVfc3ltc1tpXS0+c2VjdGlvbi0+dm1hOwotICAgICAgaWYgKHN5bWJvbF9tYXBfY291bnQKLQkgICYmICFzdHJjbXAgKGNvcmVfc3ltc1tpXS0+bmFtZSwgc3ltYm9sX21hcFtmb3VuZF0uZnVuY3Rpb25fbmFtZSkpCi0JewotCSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gc3ltYm9sX21hcFtmb3VuZF0uZmlsZV9uYW1lOwotCSAgc3ltdGFiLmxpbWl0LT5tYXBwZWQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW10YWIubGltaXQtPm5hbWUgPSBjb3JlX3N5bXNbaV0tPm5hbWU7Ci0JICBzeW10YWIubGltaXQtPm1hcHBlZCA9IDA7Ci0JfQotCi0gICAgICAvKiBMb29rdXAgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyLCBpZiB3ZSBjYW4gKi8KLQotICAgICAgewotCWNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqZnVuY19uYW1lOwotCQotCWlmIChnZXRfc3JjX2luZm8gKHN5bXRhYi5saW1pdC0+YWRkciwgJmZpbGVuYW1lLCAmZnVuY19uYW1lLAotCQkJICAmc3ltdGFiLmxpbWl0LT5saW5lX251bSkpCi0JICB7Ci0JICAgIHN5bXRhYi5saW1pdC0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoIChmaWxlbmFtZSk7Ci0KLQkgICAgLyogRklYTUU6IENoZWNraW5nIF9fb3NmX18gaGVyZSBkb2VzIG5vdCB3b3JrIHdpdGggYSBjcm9zcwotICAgICAgICAgICAgICAgZ3Byb2YuICAqLwotI2lmZGVmIF9fb3NmX18KLQkgICAgLyoKLQkgICAgICogU3VwcHJlc3Mgc3ltYm9scyB0aGF0IGFyZSBub3QgZnVuY3Rpb24gbmFtZXMuICBUaGlzIGlzCi0JICAgICAqIHVzZWZ1bCB0byBzdXBwcmVzcyBjb2RlLWxhYmVscyBhbmQgYWxpYXNlcy4KLQkgICAgICoKLQkgICAgICogVGhpcyBpcyBrbm93biB0byBiZSB1c2VmdWwgdW5kZXIgREVDJ3MgT1NGLzEuICBVbmRlciBTdW5PUyA0LngsCi0JICAgICAqIGxhYmVscyBkbyBub3QgYXBwZWFyIGluIHRoZSBzeW1ib2wgdGFibGUgaW5mbywgc28gdGhpcyBpc24ndAotCSAgICAgKiBuZWNlc3NhcnkuCi0JICAgICAqLwotCi0JICAgIGlmIChzdHJjbXAgKHN5bXRhYi5saW1pdC0+bmFtZSwgZnVuY19uYW1lKSAhPSAwKQotCSAgICAgIHsKLQkJLyoKLQkJICogVGhlIHN5bWJvbCdzIGFkZHJlc3MgbWFwcyB0byBhIGRpZmZlcmVudCBuYW1lLCBzbwotCQkgKiBpdCBjYW4ndCBiZSBhIGZ1bmN0aW9uLWVudHJ5IHBvaW50LiAgVGhpcyBoYXBwZW5zCi0JCSAqIGZvciBsYWJlbHMsIGZvciBleGFtcGxlLgotCQkgKi8KLQkJREJHIChBT1VUREVCVUcsCi0JCSAgICAgcHJpbnRmICgiW2NvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXM6IHJlaiAlcyAobWFwcyB0byAlcylcbiIsCi0JCQkgICAgIHN5bXRhYi5saW1pdC0+bmFtZSwgZnVuY19uYW1lKSk7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLSNlbmRpZgotCSAgfQotICAgICAgfQotCi0gICAgICBzeW10YWIubGltaXQtPmlzX2Z1bmMgPSBUUlVFOwotICAgICAgc3ltdGFiLmxpbWl0LT5pc19iYl9oZWFkID0gVFJVRTsKLSAgICAgIGlmIChjbGFzcyA9PSAndCcpCi0JewotCSAgc3ltdGFiLmxpbWl0LT5pc19zdGF0aWMgPSBUUlVFOwotCX0KLQotICAgICAgbWluX3ZtYSA9IE1JTiAoc3ltdGFiLmxpbWl0LT5hZGRyLCBtaW5fdm1hKTsKLSAgICAgIG1heF92bWEgPSBNQVggKHN5bXRhYi5saW1pdC0+YWRkciwgbWF4X3ZtYSk7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBJZiB3ZSBzZWUgIm1haW4iIHdpdGhvdXQgYW4gaW5pdGlhbCAnXycsIHdlIGFzc3VtZSBuYW1lcwotICAgICAgICogYXJlICpub3QqIHByZWZpeGVkIGJ5ICdfJy4KLSAgICAgICAqLwotICAgICAgaWYgKHN5bXRhYi5saW1pdC0+bmFtZVswXSA9PSAnbScgJiYgZGlzY2FyZF91bmRlcnNjb3JlcwotCSAgJiYgc3RyY21wIChzeW10YWIubGltaXQtPm5hbWUsICJtYWluIikgPT0gMCkKLQl7Ci0JICBkaXNjYXJkX3VuZGVyc2NvcmVzID0gMDsKLQl9Ci0KLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltc10gJWxkICVzIDB4JWx4XG4iLAotCQkJICAgICAgKGxvbmcpIChzeW10YWIubGltaXQgLSBzeW10YWIuYmFzZSksCi0JCQkgICAgICBzeW10YWIubGltaXQtPm5hbWUsCi0JCQkgICAgICAodW5zaWduZWQgbG9uZykgc3ltdGFiLmxpbWl0LT5hZGRyKSk7Ci0gICAgICArK3N5bXRhYi5saW1pdDsKLSAgICB9Ci0KLSAgLyogY3JlYXRlIHNlbnRpbmVsczogKi8KLQotICBzeW1faW5pdCAoc3ltdGFiLmxpbWl0KTsKLSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gIjxsb2NvcmU+IjsKLSAgc3ltdGFiLmxpbWl0LT5hZGRyID0gMDsKLSAgc3ltdGFiLmxpbWl0LT5lbmRfYWRkciA9IG1pbl92bWEgLSAxOwotICArK3N5bXRhYi5saW1pdDsKLQotICBzeW1faW5pdCAoc3ltdGFiLmxpbWl0KTsKLSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gIjxoaWNvcmU+IjsKLSAgc3ltdGFiLmxpbWl0LT5hZGRyID0gbWF4X3ZtYSArIDE7Ci0gIHN5bXRhYi5saW1pdC0+ZW5kX2FkZHIgPSB+MDsKLSAgKytzeW10YWIubGltaXQ7Ci0KLSAgc3ltdGFiLmxlbiA9IHN5bXRhYi5saW1pdCAtIHN5bXRhYi5iYXNlOwotICBzeW10YWJfZmluYWxpemUgKCZzeW10YWIpOwotfQotCi0KLS8qCi0gKiBSZWFkIGluIHN5bWJvbCB0YWJsZSBmcm9tIGNvcmUuICBPbmUgc3ltYm9sIHBlciBsaW5lIG9mIHNvdXJjZSBjb2RlCi0gKiBpcyBlbnRlcmVkLgotICovCi12b2lkCi1ERUZVTiAoY29yZV9jcmVhdGVfbGluZV9zeW1zLCAoY29yZV9iZmQpLCBiZmQgKiBjb3JlX2JmZCkKLXsKLSAgY2hhciAqcHJldl9uYW1lLCAqcHJldl9maWxlbmFtZTsKLSAgaW50IHByZXZfbmFtZV9sZW4sIHByZXZfZmlsZW5hbWVfbGVuOwotICBiZmRfdm1hIHZtYSwgbWluX3ZtYSA9IH4wLCBtYXhfdm1hID0gMDsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIFN5bSAqcHJldiwgZHVtbXksICpzZW50aW5lbCwgKnN5bTsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGludCBwcmV2X2xpbmVfbnVtOwotICBTeW1fVGFibGUgbHRhYjsKLSAgLyoKLSAgICogQ3JlYXRlIHN5bWJvbHMgZm9yIGZ1bmN0aW9ucyBhcyB1c3VhbC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGluCi0gICAqIGNhc2VzIHdoZXJlIHBhcnRzIG9mIGEgcHJvZ3JhbSB3ZXJlIG5vdCBjb21waWxlZCB3aXRoIC1nLiAgRm9yCi0gICAqIHRob3NlIHBhcnRzIHdlIHN0aWxsIHdhbnQgdG8gZ2V0IGluZm8gYXQgdGhlIGZ1bmN0aW9uIGxldmVsOgotICAgKi8KLSAgY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyAoY29yZV9iZmQpOwotCi0gIC8qIHBhc3MgMSAtIGNvdW50ZXIgbnVtYmVyIG9mIHN5bWJvbHM6ICovCi0KLSAgLyoKLSAgICogVG8gZmluZCBhbGwgbGluZSBpbmZvcm1hdGlvbiwgd2FsayB0aHJvdWdoIGFsbCBwb3NzaWJsZQotICAgKiB0ZXh0LXNwYWNlIGFkZHJlc3NlcyAob25lIGJ5IG9uZSEpIGFuZCBnZXQgdGhlIGRlYnVnZ2luZwotICAgKiBpbmZvIGZvciBlYWNoIGFkZHJlc3MuICBXaGVuIHRoZSBkZWJ1Z2dpbmcgaW5mbyBjaGFuZ2VzLAotICAgKiBpdCBpcyB0aW1lIHRvIGNyZWF0ZSBhIG5ldyBzeW1ib2wuCi0gICAqCi0gICAqIE9mIGNvdXJzZSwgdGhpcyBpcyByYXRoZXIgc2xvdyBhbmQgaXQgd291bGQgYmUgYmV0dGVyIGlmCi0gICAqIGJmZCB3b3VsZCBwcm92aWRlIGFuIGl0ZXJhdG9yIGZvciBlbnVtZXJhdGluZyBhbGwgbGluZSBpbmZvcwotICAgKi8KLSAgcHJldl9uYW1lX2xlbiA9IFBBVEhfTUFYOwotICBwcmV2X2ZpbGVuYW1lX2xlbiA9IFBBVEhfTUFYOwotICBwcmV2X25hbWUgPSB4bWFsbG9jIChwcmV2X25hbWVfbGVuKTsKLSAgcHJldl9maWxlbmFtZSA9IHhtYWxsb2MgKHByZXZfZmlsZW5hbWVfbGVuKTsKLSAgbHRhYi5sZW4gPSAwOwotICBwcmV2X2xpbmVfbnVtID0gMDsKLSAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplOyBvZmZzZXQgKz0gbWluX2luc25fc2l6ZSkKLSAgICB7Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICB2bWEgPSBjb3JlX3RleHRfc2VjdC0+dm1hICsgb2Zmc2V0OwotICAgICAgaWYgKCFnZXRfc3JjX2luZm8gKHZtYSwgJmZpbGVuYW1lLCAmZHVtbXkubmFtZSwgJmR1bW15LmxpbmVfbnVtKQotCSAgfHwgKHByZXZfbGluZV9udW0gPT0gZHVtbXkubGluZV9udW0KLQkgICAgICAmJiBwcmV2X25hbWUgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAocHJldl9uYW1lLCBkdW1teS5uYW1lKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChwcmV2X2ZpbGVuYW1lLCBmaWxlbmFtZSkgPT0gMCkpCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICArK2x0YWIubGVuOwotICAgICAgcHJldl9saW5lX251bSA9IGR1bW15LmxpbmVfbnVtOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKGR1bW15Lm5hbWUpOwotICAgICAgaWYgKGxlbiA+PSBwcmV2X25hbWVfbGVuKQotCXsKLQkgIHByZXZfbmFtZV9sZW4gPSBsZW4gKyAxMDI0OwotCSAgZnJlZSAocHJldl9uYW1lKTsKLQkgIHByZXZfbmFtZSA9IHhtYWxsb2MgKHByZXZfbmFtZV9sZW4pOwotCX0KLSAgICAgIHN0cmNweSAocHJldl9uYW1lLCBkdW1teS5uYW1lKTsKLQotICAgICAgbGVuID0gc3RybGVuIChmaWxlbmFtZSk7Ci0gICAgICBpZiAobGVuID49IHByZXZfZmlsZW5hbWVfbGVuKQotCXsKLQkgIHByZXZfZmlsZW5hbWVfbGVuID0gbGVuICsgMTAyNDsKLQkgIGZyZWUgKHByZXZfZmlsZW5hbWUpOwotCSAgcHJldl9maWxlbmFtZSA9IHhtYWxsb2MgKHByZXZfZmlsZW5hbWVfbGVuKTsKLQl9Ci0gICAgICBzdHJjcHkgKHByZXZfZmlsZW5hbWUsIGZpbGVuYW1lKTsKLQotICAgICAgbWluX3ZtYSA9IE1JTiAodm1hLCBtaW5fdm1hKTsKLSAgICAgIG1heF92bWEgPSBNQVggKHZtYSwgbWF4X3ZtYSk7Ci0gICAgfQotCi0gIGZyZWUgKHByZXZfbmFtZSk7Ci0gIGZyZWUgKHByZXZfZmlsZW5hbWUpOwotCi0gIC8qIG1ha2Ugcm9vbSBmb3IgZnVuY3Rpb24gc3ltYm9scywgdG9vOiAqLwotICBsdGFiLmxlbiArPSBzeW10YWIubGVuOwotICBsdGFiLmJhc2UgPSAoU3ltICopIHhtYWxsb2MgKGx0YWIubGVuICogc2l6ZW9mIChTeW0pKTsKLSAgbHRhYi5saW1pdCA9IGx0YWIuYmFzZTsKLQotICAvKiBwYXNzIDIgLSBjcmVhdGUgc3ltYm9sczogKi8KLQotICAvKiBXZSBub3cgc2V0IGlzX3N0YXRpYyBhcyB3ZSBnbyBhbG9uZywgcmF0aGVyIHRoYW4gYnkgcnVubmluZwotICAgICB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgYXQgdGhlIGVuZC4KLQotICAgICBUaGUgb2xkIHdheSBjYWxsZWQgc3ltdGFiX2ZpbmFsaXplIGJlZm9yZSB0aGUgaXNfc3RhdGljIHBhc3MsCi0gICAgIGNhdXNpbmcgYSBwcm9ibGVtIHNpbmNlIHN5bXRhYl9maW5hbGl6ZSB1c2VzIGlzX3N0YXRpYyBhcyBwYXJ0IG9mCi0gICAgIGl0cyBhZGRyZXNzIGNvbmZsaWN0IHJlc29sdXRpb24gYWxnb3JpdGhtLiAgU2luY2UgZ2xvYmFsIHN5bWJvbHMKLSAgICAgd2VyZSBwcmVmZXJlZCBvdmVyIHN0YXRpYyBzeW1ib2xzLCBhbmQgYWxsIGxpbmUgc3ltYm9scyB3ZXJlCi0gICAgIGdsb2JhbCBhdCB0aGF0IHBvaW50LCBzdGF0aWMgZnVuY3Rpb24gbmFtZXMgdGhhdCBjb25mbGljdGVkIHdpdGgKLSAgICAgdGhlaXIgb3duIGxpbmUgbnVtYmVycyAoc3RhdGljLCBidXQgbGFiZWxlZCBhcyBnbG9iYWwpIHdlcmUKLSAgICAgcmVqZWN0ZWQgaW4gZmF2b3Igb2YgdGhlIGxpbmUgbnVtLgotCi0gICAgIFRoaXMgd2FzIG5vdCB0aGUgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LiAgV2UgYWx3YXlzIHdhbnQgdG8ga2VlcAotICAgICBvdXIgZnVuY3Rpb24gc3ltYm9scyBhbmQgZGlzY2FyZCBhbnkgY29uZmxpY3RpbmcgbGluZSBzeW1ib2xzLgotICAgICBQZXJoYXBzIHN5bXRhYl9maW5hbGl6ZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gbWFrZSB0aGlzCi0gICAgIGRpc3RpbmN0aW9uIGFzIHdlbGwsIGJ1dCB0aGUgY3VycmVudCBmaXggd29ya3MgYW5kIHRoZSBjb2RlIGlzIGEKLSAgICAgbG90IGNsZWFuZXIgbm93LiAgKi8KLQotICBwcmV2ID0gMDsKLSAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplOyBvZmZzZXQgKz0gbWluX2luc25fc2l6ZSkKLSAgICB7Ci0gICAgICBzeW1faW5pdCAobHRhYi5saW1pdCk7Ci0gICAgICBpZiAoIWdldF9zcmNfaW5mbyAoY29yZV90ZXh0X3NlY3QtPnZtYSArIG9mZnNldCwgJmZpbGVuYW1lLAotCQkJICZsdGFiLmxpbWl0LT5uYW1lLCAmbHRhYi5saW1pdC0+bGluZV9udW0pCi0JICB8fCAocHJldiAmJiBwcmV2LT5saW5lX251bSA9PSBsdGFiLmxpbWl0LT5saW5lX251bQotCSAgICAgICYmIHN0cmNtcCAocHJldi0+bmFtZSwgbHRhYi5saW1pdC0+bmFtZSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAocHJldi0+ZmlsZS0+bmFtZSwgZmlsZW5hbWUpID09IDApKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogbWFrZSBuYW1lIHBvaW50ZXIgYSBtYWxsb2MnZWQgc3RyaW5nOiAqLwotICAgICAgbHRhYi5saW1pdC0+bmFtZSA9IHhzdHJkdXAgKGx0YWIubGltaXQtPm5hbWUpOwotICAgICAgbHRhYi5saW1pdC0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoIChmaWxlbmFtZSk7Ci0KLSAgICAgIGx0YWIubGltaXQtPmFkZHIgPSBjb3JlX3RleHRfc2VjdC0+dm1hICsgb2Zmc2V0OwotCi0gICAgICAvKiBTZXQgaXNfc3RhdGljIGJhc2VkIG9uIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24sIHVzaW5nIGVpdGhlcjoKLSAgICAgICAqIDEpIHRoZSBwcmV2aW91cyBzeW1ib2wsIGlmIGl0J3MgZnJvbSB0aGUgc2FtZSBmdW5jdGlvbiwgb3IKLSAgICAgICAqIDIpIGEgc3ltdGFiIGxvb2t1cAotICAgICAgICovCi0KLSAgICAgIGlmIChwcmV2ICYmIGx0YWIubGltaXQtPmZpbGUgPT0gcHJldi0+ZmlsZSAmJgotCSAgc3RyY21wIChsdGFiLmxpbWl0LT5uYW1lLCBwcmV2LT5uYW1lKSA9PSAwKQotCXsKLQkgIGx0YWIubGltaXQtPmlzX3N0YXRpYyA9IHByZXYtPmlzX3N0YXRpYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltID0gc3ltX2xvb2t1cCgmc3ltdGFiLCBsdGFiLmxpbWl0LT5hZGRyKTsKLQkgIGx0YWIubGltaXQtPmlzX3N0YXRpYyA9IHN5bS0+aXNfc3RhdGljOwotCX0KLQotICAgICAgcHJldiA9IGx0YWIubGltaXQ7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBJZiB3ZSBzZWUgIm1haW4iIHdpdGhvdXQgYW4gaW5pdGlhbCAnXycsIHdlIGFzc3VtZSBuYW1lcwotICAgICAgICogYXJlICpub3QqIHByZWZpeGVkIGJ5ICdfJy4KLSAgICAgICAqLwotICAgICAgaWYgKGx0YWIubGltaXQtPm5hbWVbMF0gPT0gJ20nICYmIGRpc2NhcmRfdW5kZXJzY29yZXMKLQkgICYmIHN0cmNtcCAobHRhYi5saW1pdC0+bmFtZSwgIm1haW4iKSA9PSAwKQotCXsKLQkgIGRpc2NhcmRfdW5kZXJzY29yZXMgPSAwOwotCX0KLQotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9saW5lX3N5bXNdICVsdSAlcyAweCVseFxuIiwKLQkJCSAgICAgICh1bnNpZ25lZCBsb25nKSAobHRhYi5saW1pdCAtIGx0YWIuYmFzZSksCi0JCQkgICAgICBsdGFiLmxpbWl0LT5uYW1lLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGx0YWIubGltaXQtPmFkZHIpKTsKLSAgICAgICsrbHRhYi5saW1pdDsKLSAgICB9Ci0KLSAgLyogdXBkYXRlIHNlbnRpbmVsczogKi8KLQotICBzZW50aW5lbCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIDApOwotICBpZiAoc3RyY21wIChzZW50aW5lbC0+bmFtZSwgIjxsb2NvcmU+IikgPT0gMAotICAgICAgJiYgbWluX3ZtYSA8PSBzZW50aW5lbC0+ZW5kX2FkZHIpCi0gICAgewotICAgICAgc2VudGluZWwtPmVuZF9hZGRyID0gbWluX3ZtYSAtIDE7Ci0gICAgfQotCi0gIHNlbnRpbmVsID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgfjApOwotICBpZiAoc3RyY21wIChzZW50aW5lbC0+bmFtZSwgIjxoaWNvcmU+IikgPT0gMCAmJiBtYXhfdm1hID49IHNlbnRpbmVsLT5hZGRyKQotICAgIHsKLSAgICAgIHNlbnRpbmVsLT5hZGRyID0gbWF4X3ZtYSArIDE7Ci0gICAgfQotCi0gIC8qIGNvcHkgaW4gZnVuY3Rpb24gc3ltYm9sczogKi8KLSAgbWVtY3B5IChsdGFiLmxpbWl0LCBzeW10YWIuYmFzZSwgc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltKSk7Ci0gIGx0YWIubGltaXQgKz0gc3ltdGFiLmxlbjsKLQotICBpZiAoKHVuc2lnbmVkIGludCkgKGx0YWIubGltaXQgLSBsdGFiLmJhc2UpICE9IGx0YWIubGVuKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgXygiJXM6IHNvbWVib2R5IG1pc2NvdW50ZWQ6IGx0YWIubGVuPSVkIGluc3RlYWQgb2YgJWxkXG4iKSwKLQkgICAgICAgd2hvYW1pLCBsdGFiLmxlbiwgKGxvbmcpIChsdGFiLmxpbWl0IC0gbHRhYi5iYXNlKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogZmluYWxpemUgbHRhYiBhbmQgbWFrZSBpdCBzeW1ib2wgdGFibGU6ICovCi0KLSAgc3ltdGFiX2ZpbmFsaXplICgmbHRhYik7Ci0gIGZyZWUgKHN5bXRhYi5iYXNlKTsKLSAgc3ltdGFiID0gbHRhYjsKLQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29yZWZpbGUuaCBiL2dwcm9mL2NvcmVmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTZmODUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY29yZWZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSNpZm5kZWYgY29yZWZpbGVfaAotI2RlZmluZSBjb3JlZmlsZV9oCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotZXh0ZXJuIGJmZCAqY29yZV9iZmQ7CQkvKiBiZmQgZm9yIGNvcmUtZmlsZSAqLwotZXh0ZXJuIGludCBjb3JlX251bV9zeW1zOwkvKiAjIG9mIGVudHJpZXMgaW4gc3ltYm9sLXRhYmxlICovCi1leHRlcm4gYXN5bWJvbCAqKmNvcmVfc3ltczsJLyogc3ltYm9sIHRhYmxlIGluIGEub3V0ICovCi1leHRlcm4gYXNlY3Rpb24gKmNvcmVfdGV4dF9zZWN0OwkvKiBjb3JlIHRleHQgc2VjdGlvbiAqLwotZXh0ZXJuIFBUUiBjb3JlX3RleHRfc3BhY2U7CS8qIHRleHQgc3BhY2Ugb2YgYS5vdXQgaW4gY29yZSAqLwotCi1leHRlcm4gaW50IG1pbl9pbnNuX3NpemU7CS8qIHNpemUgb2Ygc21hbGxlc3QgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzICovCi1leHRlcm4gaW50IG9mZnNldF90b19jb2RlOwkvKiBvZmZzZXQgKGluIGJ5dGVzKSBvZiBjb2RlIGZyb20gZW50cnkKLQkJCQkgICBhZGRyZXNzIG9mIHJvdXRpbmUgKi8KLQotZXh0ZXJuIHZvaWQgY29yZV9pbml0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFfb3V0X25hbWUpKTsKLWV4dGVybiB2b2lkIGNvcmVfZ2V0X3RleHRfc3BhY2UgUEFSQU1TICgoYmZkICogY29yZV9iZmQpKTsKLWV4dGVybiB2b2lkIGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgUEFSQU1TICgoYmZkICogY29yZV9iZmQpKTsKLWV4dGVybiB2b2lkIGNvcmVfY3JlYXRlX2xpbmVfc3ltcyBQQVJBTVMgKChiZmQgKiBjb3JlX2JmZCkpOwotCi0jZW5kaWYgLyogY29yZWZpbGVfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZmxhdF9ibC5tIGIvZ3Byb2YvZmxhdF9ibC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI4NzFhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2ZsYXRfYmwubQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQotICUgICAgICAgICB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lIG9mIHRoZQotdGltZSAgICAgICBwcm9ncmFtIHVzZWQgYnkgdGhpcyBmdW5jdGlvbi4KLQotY3VtdWxhdGl2ZSBhIHJ1bm5pbmcgc3VtIG9mIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhY2NvdW50ZWQKLSBzZWNvbmRzICAgZm9yIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIHRob3NlIGxpc3RlZCBhYm92ZSBpdC4KLQotIHNlbGYgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYWNjb3VudGVkIGZvciBieSB0aGlzCi1zZWNvbmRzICAgIGZ1bmN0aW9uIGFsb25lLiAgVGhpcyBpcyB0aGUgbWFqb3Igc29ydCBmb3IgdGhpcwotICAgICAgICAgICBsaXN0aW5nLgotCi1jYWxscyAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiB3YXMgaW52b2tlZCwgaWYKLSAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBpcyBwcm9maWxlZCwgZWxzZSBibGFuay4KLSAKLSBzZWxmICAgICAgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1tcy9jYWxsICAgIGZ1bmN0aW9uIHBlciBjYWxsLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLAotCSAgIGVsc2UgYmxhbmsuCi0KLSB0b3RhbCAgICAgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1tcy9jYWxsICAgIGZ1bmN0aW9uIGFuZCBpdHMgZGVzY2VuZGVudHMgcGVyIGNhbGwsIGlmIHRoaXMgCi0JICAgZnVuY3Rpb24gaXMgcHJvZmlsZWQsIGVsc2UgYmxhbmsuCi0KLW5hbWUgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgVGhpcyBpcyB0aGUgbWlub3Igc29ydAotICAgICAgICAgICBmb3IgdGhpcyBsaXN0aW5nLiBUaGUgaW5kZXggc2hvd3MgdGhlIGxvY2F0aW9uIG9mCi0JICAgdGhlIGZ1bmN0aW9uIGluIHRoZSBncHJvZiBsaXN0aW5nLiBJZiB0aGUgaW5kZXggaXMKLQkgICBpbiBwYXJlbnRoZXNpcyBpdCBzaG93cyB3aGVyZSBpdCB3b3VsZCBhcHBlYXIgaW4KLQkgICB0aGUgZ3Byb2YgbGlzdGluZyBpZiBpdCB3ZXJlIHRvIGJlIHByaW50ZWQuCmRpZmYgLS1naXQgYS9ncHJvZi9mc2ZfY2FsbGdfYmwubSBiL2dwcm9mL2ZzZl9jYWxsZ19ibC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE2ODIxLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2ZzZl9jYWxsZ19ibC5tCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotCi0gVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGNhbGwgdHJlZSBvZiB0aGUgcHJvZ3JhbSwgYW5kIHdhcyBzb3J0ZWQgYnkKLSB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gZWFjaCBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuLgotCi0gRWFjaCBlbnRyeSBpbiB0aGlzIHRhYmxlIGNvbnNpc3RzIG9mIHNldmVyYWwgbGluZXMuICBUaGUgbGluZSB3aXRoIHRoZQotIGluZGV4IG51bWJlciBhdCB0aGUgbGVmdCBoYW5kIG1hcmdpbiBsaXN0cyB0aGUgY3VycmVudCBmdW5jdGlvbi4KLSBUaGUgbGluZXMgYWJvdmUgaXQgbGlzdCB0aGUgZnVuY3Rpb25zIHRoYXQgY2FsbGVkIHRoaXMgZnVuY3Rpb24sCi0gYW5kIHRoZSBsaW5lcyBiZWxvdyBpdCBsaXN0IHRoZSBmdW5jdGlvbnMgdGhpcyBvbmUgY2FsbGVkLgotIFRoaXMgbGluZSBsaXN0czoKLSAgICAgaW5kZXgJQSB1bmlxdWUgbnVtYmVyIGdpdmVuIHRvIGVhY2ggZWxlbWVudCBvZiB0aGUgdGFibGUuCi0JCUluZGV4IG51bWJlcnMgYXJlIHNvcnRlZCBudW1lcmljYWxseS4KLQkJVGhlIGluZGV4IG51bWJlciBpcyBwcmludGVkIG5leHQgdG8gZXZlcnkgZnVuY3Rpb24gbmFtZSBzbwotCQlpdCBpcyBlYXNpZXIgdG8gbG9vayB1cCB3aGVyZSB0aGUgZnVuY3Rpb24gaW4gdGhlIHRhYmxlLgotCi0gICAgICUgdGltZQlUaGlzIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBgdG90YWwnIHRpbWUgdGhhdCB3YXMgc3BlbnQKLQkJaW4gdGhpcyBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuLiAgTm90ZSB0aGF0IGR1ZSB0bwotCQlkaWZmZXJlbnQgdmlld3BvaW50cywgZnVuY3Rpb25zIGV4Y2x1ZGVkIGJ5IG9wdGlvbnMsIGV0YywKLQkJdGhlc2UgbnVtYmVycyB3aWxsIE5PVCBhZGQgdXAgdG8gMTAwJS4KLQotICAgICBzZWxmCVRoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHRoaXMgZnVuY3Rpb24uCi0KLSAgICAgY2hpbGRyZW4JVGhpcyBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgcHJvcGFnYXRlZCBpbnRvIHRoaXMKLQkJZnVuY3Rpb24gYnkgaXRzIGNoaWxkcmVuLgotCi0gICAgIGNhbGxlZAlUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCi0JCUlmIHRoZSBmdW5jdGlvbiBjYWxsZWQgaXRzZWxmIHJlY3Vyc2l2ZWx5LCB0aGUgbnVtYmVyCi0JCW9ubHkgaW5jbHVkZXMgbm9uLXJlY3Vyc2l2ZSBjYWxscywgYW5kIGlzIGZvbGxvd2VkIGJ5Ci0JCWEgYCsnIGFuZCB0aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscy4KLQotICAgICBuYW1lCVRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIGluZGV4IG51bWJlciBpcwotCQlwcmludGVkIGFmdGVyIGl0LiAgSWYgdGhlIGZ1bmN0aW9uIGlzIGEgbWVtYmVyIG9mIGEKLQkJY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMgcHJpbnRlZCBiZXR3ZWVuIHRoZQotCQlmdW5jdGlvbidzIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi0KLQotIEZvciB0aGUgZnVuY3Rpb24ncyBwYXJlbnRzLCB0aGUgZmllbGRzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotICAgICBzZWxmCVRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2FzIHByb3BhZ2F0ZWQgZGlyZWN0bHkKLQkJZnJvbSB0aGUgZnVuY3Rpb24gaW50byB0aGlzIHBhcmVudC4KLQotICAgICBjaGlsZHJlbglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGZyb20KLQkJdGhlIGZ1bmN0aW9uJ3MgY2hpbGRyZW4gaW50byB0aGlzIHBhcmVudC4KLQotICAgICBjYWxsZWQJVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgcGFyZW50IGNhbGxlZCB0aGUKLQkJZnVuY3Rpb24gYC8nIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uCi0JCXdhcyBjYWxsZWQuICBSZWN1cnNpdmUgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIGFyZSBub3QKLQkJaW5jbHVkZWQgaW4gdGhlIG51bWJlciBhZnRlciB0aGUgYC8nLgotCi0gICAgIG5hbWUJVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyZW50LiAgVGhlIHBhcmVudCdzIGluZGV4Ci0JCW51bWJlciBpcyBwcmludGVkIGFmdGVyIGl0LiAgSWYgdGhlIHBhcmVudCBpcyBhCi0JCW1lbWJlciBvZiBhIGN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzIHByaW50ZWQgYmV0d2VlbgotCQl0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLQotIElmIHRoZSBwYXJlbnRzIG9mIHRoZSBmdW5jdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHdvcmQKLSBgPHNwb250YW5lb3VzPicgaXMgcHJpbnRlZCBpbiB0aGUgYG5hbWUnIGZpZWxkLCBhbmQgYWxsIHRoZSBvdGhlcgotIGZpZWxkcyBhcmUgYmxhbmsuCi0KLSBGb3IgdGhlIGZ1bmN0aW9uJ3MgY2hpbGRyZW4sIHRoZSBmaWVsZHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgotCi0gICAgIHNlbGYJVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgcHJvcGFnYXRlZCBkaXJlY3RseQotCQlmcm9tIHRoZSBjaGlsZCBpbnRvIHRoZSBmdW5jdGlvbi4KLQotICAgICBjaGlsZHJlbglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGZyb20gdGhlCi0JCWNoaWxkJ3MgY2hpbGRyZW4gdG8gdGhlIGZ1bmN0aW9uLgotCi0gICAgIGNhbGxlZAlUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIGNhbGxlZAotCQl0aGlzIGNoaWxkIGAvJyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBjaGlsZAotCQl3YXMgY2FsbGVkLiAgUmVjdXJzaXZlIGNhbGxzIGJ5IHRoZSBjaGlsZCBhcmUgbm90Ci0JCWxpc3RlZCBpbiB0aGUgbnVtYmVyIGFmdGVyIHRoZSBgLycuCi0KLSAgICAgbmFtZQlUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjaGlsZC4gIFRoZSBjaGlsZCdzIGluZGV4Ci0JCW51bWJlciBpcyBwcmludGVkIGFmdGVyIGl0LiAgSWYgdGhlIGNoaWxkIGlzIGEKLQkJbWVtYmVyIG9mIGEgY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMgcHJpbnRlZAotCQliZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotCi0gSWYgdGhlcmUgYXJlIGFueSBjeWNsZXMgKGNpcmNsZXMpIGluIHRoZSBjYWxsIGdyYXBoLCB0aGVyZSBpcyBhbgotIGVudHJ5IGZvciB0aGUgY3ljbGUtYXMtYS13aG9sZS4gIFRoaXMgZW50cnkgc2hvd3Mgd2hvIGNhbGxlZCB0aGUKLSBjeWNsZSAoYXMgcGFyZW50cykgYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBjeWNsZSAoYXMgY2hpbGRyZW4uKQotIFRoZSBgKycgcmVjdXJzaXZlIGNhbGxzIGVudHJ5IHNob3dzIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24gY2FsbHMgdGhhdAotIHdlcmUgaW50ZXJuYWwgdG8gdGhlIGN5Y2xlLCBhbmQgdGhlIGNhbGxzIGVudHJ5IGZvciBlYWNoIG1lbWJlciBzaG93cywKLSBmb3IgdGhhdCBtZW1iZXIsIGhvdyBtYW55IHRpbWVzIGl0IHdhcyBjYWxsZWQgZnJvbSBvdGhlciBtZW1iZXJzIG9mCi0gdGhlIGN5Y2xlLgotCmRpZmYgLS1naXQgYS9ncHJvZi9nY29uZmlnLmluIGIvZ3Byb2YvZ2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3ZThlMC4uMDAwMDAwMAotLS0gYS9ncHJvZi9nY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIGdjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCmRpZmYgLS1naXQgYS9ncHJvZi9nZW4tYy1wcm9nLmF3ayBiL2dwcm9mL2dlbi1jLXByb2cuYXdrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTljMWY4Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dlbi1jLXByb2cuYXdrCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTlIgPT0gMQl7Ci0gICAgRlM9IlwiIjsKLSAgICBwcmludCAiLyogPT0+IERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlISEgIEl0IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSIKLSAgICBwcmludGYgIiAgIGZyb20gJXMgdXNpbmcgdGhlIGdlbi1jLXByb2cuYXdrIHNjcmlwdC4gIDw9PSAqL1xuXG4iLCBGSUxFCi0gICAgcHJpbnQgIiNpbmNsdWRlIDxzdGRpby5oPiIKLX0KLQotCXsKLQkgIGlmIChjdXJmdW4gIT0gRlVOQ1RJT04pCi0JICAgIHsKLQkgICAgICBpZiAoY3VyZnVuKQotCQlwcmludCAifSIKLQkgICAgICBjdXJmdW4gPSBGVU5DVElPTgotCSAgICAgIHByaW50ICIiCi0JICAgICAgcHJpbnQgInZvaWQiOwotCSAgICAgIHByaW50ZiAiJXMgKGZpbGUpXG4iLCBGVU5DVElPTgotCSAgICAgIHByaW50ICIgICAgIEZJTEUgKmZpbGU7IjsKLQkgICAgICBwcmludCAieyI7Ci0JICAgIH0KLQkgIHByaW50ZiAiICBmcHV0cyAoXCIiOwotCSAgZm9yIChpID0gMTsgaSA8IE5GOyBpKyspCi0JICAgIHByaW50ZiAiJXNcXFwiIiwgJGk7Ci0JICBwcmludGYgIiVzXFxuXCIsIGZpbGUpO1xuIiwgJE5GOwotfQotCi1FTkQJeyBwcmludCAifSIgfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbi5oIGIvZ3Byb2YvZ21vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDFmYTRkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2dtb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIylnbW9uLmgJNS4yIChCZXJrZWxleSkgNS82LzkxCi0gKi8KLSNpZm5kZWYgZ21vbl9oCi0jZGVmaW5lIGdtb25faAotCi1zdHJ1Y3QgcmF3X3BoZHIKLSAgewotICAgIC8qIEZJWE1FOiBDaGVja2luZyBhIGhvc3QgY29tcGlsZXIgZGVmaW5lIG1lYW5zIHRoYXQgd2UgY2FuJ3QgdXNlCi0gICAgICAgYSBjcm9zcyBncHJvZiB0byB0aGUgYWxwaGEuICAqLwotI2lmZGVmIF9fYWxwaGFfXwotICAgIGNoYXIgbG93X3BjWzhdOwkJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbOF07CQkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotI2Vsc2UKLSAgICBjaGFyIGxvd19wY1s0XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjWzRdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSNlbmRpZgotICAgIGNoYXIgbmNudFs0XTsJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAocGx1cyB0aGlzIGhlYWRlcikgKi8KLQotICAgIGNoYXIgdmVyc2lvbls0XTsJCS8qIHZlcnNpb24gbnVtYmVyICovCi0gICAgY2hhciBwcm9mcmF0ZVs0XTsJCS8qIHByb2ZpbGluZyBjbG9jayByYXRlICovCi0gICAgY2hhciBzcGFyZVszKjRdOwkJLyogcmVzZXJ2ZWQgKi8KLSAgfTsKLQotI2RlZmluZSBHTU9OVkVSU0lPTiAgICAgMHgwMDA1MTg3OQotCi1zdHJ1Y3Qgb2xkX3Jhd19waGRyCi0gIHsKLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgYSBob3N0IGNvbXBpbGVyIGRlZmluZSBtZWFucyB0aGF0IHdlIGNhbid0IHVzZQotICAgICAgIGEgY3Jvc3MgZ3Byb2YgdG8gdGhlIGFscGhhLiAgKi8KLSNpZmRlZiBfX2FscGhhX18KLSAgICBjaGFyIGxvd19wY1s4XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjWzhdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSNlbHNlCi0gICAgY2hhciBsb3dfcGNbNF07CQkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1s0XTsJCS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0jZW5kaWYKLSAgICBjaGFyIG5jbnRbNF07CQkvKiBzaXplIG9mIHNhbXBsZSBidWZmZXIgKHBsdXMgdGhpcyBoZWFkZXIpICovCi0KLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgaG9zdCBjb21waWxlciBkZWZpbmVzIGhlcmUgbWVhbnMgdGhhdCB3ZSBjYW4ndAotICAgICAgIHVzZSBhIGNyb3NzIGdwcm9mIGFscGhhIE9TRi4gICovCi0jaWYgZGVmaW5lZCAoX19hbHBoYV9fKSAmJiBkZWZpbmVkIChfX29zZl9fKQotICAgIC8qCi0gICAgICogREVDJ3MgT1NGIHYzLjAgdXNlcyA0IGJ5dGVzIG9mIHBhZGRpbmcgdG8gYnJpbmcgdGhlIGhlYWRlciB0bwotICAgICAqIGEgc2l6ZSB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgOC4KLSAgICAgKi8KLSAgICBjaGFyIHBhZFs0XTsKLSNlbmRpZgotICB9OwotCi0vKgotICogSGlzdG9ncmFtIGNvdW50ZXJzIGFyZSB1bnNpZ25lZCBzaG9ydHM6Ci0gKi8KLSNkZWZpbmUJSElTVENPVU5URVIgdW5zaWduZWQgc2hvcnQKLQotLyoKLSAqIEZyYWN0aW9uIG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGhpc3RvZ3JhbSBjb3VudGVycyBoZXJlLCAxLzI6Ci0gKi8KLSNkZWZpbmUJSElTVEZSQUNUSU9OCTIKLQotLyoKLSAqIEZyYWN0aW9uIG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGZyb20gaGFzaCBidWNrZXRzLiAgVGhlCi0gKiB2YWx1ZSBvZiBIQVNIRlJBQ1RJT04gaXMgYmFzZWQgb24gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mCi0gKiBzZXBhcmF0aW9uIGJldHdlZW4gdHdvIHN1YnJvdXRpbmUgY2FsbCBwb2ludHMgaW4gdGhlIG9iamVjdCBjb2RlLgotICogR2l2ZW4gTUlOX1NVQlJfU0VQQVJBVElPTiBieXRlcyBvZiBzZXBhcmF0aW9uIHRoZSB2YWx1ZSBvZgotICogSEFTSEZSQUNUSU9OIGlzIGNhbGN1bGF0ZWQgYXM6Ci0gKgotICogICAgICBIQVNIRlJBQ1RJT04gPSBNSU5fU1VCUl9TRVBBUkFUSU9OIC8gKDIgKiBzaXplb2Yoc2hvcnQpIC0gMSk7Ci0gKgotICogRm9yIHRoZSBWQVgsIHRoZSBzaG9ydGVzdCB0d28gY2FsbCBzZXF1ZW5jZSBpczoKLSAqCi0gKiAgICAgIGNhbGxzICAgJDAsKHIwKQotICogICAgICBjYWxscyAgICQwLChyMCkKLSAqCi0gKiB3aGljaCBpcyBzZXBhcmF0ZWQgYnkgb25seSB0aHJlZSBieXRlcywgdGh1cyBIQVNIRlJBQ1RJT04gaXMgCi0gKiBjYWxjdWxhdGVkIGFzOgotICoKLSAqICAgICAgSEFTSEZSQUNUSU9OID0gMyAvICgyICogMiAtIDEpID0gMQotICoKLSAqIE5vdGUgdGhhdCB0aGUgZGl2aXNpb24gYWJvdmUgcm91bmRzIGRvd24sIHRodXMgaWYgTUlOX1NVQlJfRlJBQ1RJT04KLSAqIGlzIGxlc3MgdGhhbiB0aHJlZSwgdGhpcyBhbGdvcml0aG0gd2lsbCBub3Qgd29yayEKLSAqLwotI2RlZmluZQlIQVNIRlJBQ1RJT04gMQotCi0vKgotICogUGVyY2VudCBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciB0b3N0cnVjdHMgd2l0aCBhIG1pbmltdW06Ci0gKi8KLSNkZWZpbmUgQVJDREVOU0lUWQkyCi0jZGVmaW5lIE1JTkFSQ1MJCTUwCi0KLXN0cnVjdCB0b3N0cnVjdAotICB7Ci0gICAgY2hhciAqc2VsZnBjOwotICAgIGludCBjb3VudDsKLSAgICB1bnNpZ25lZCBzaG9ydCBsaW5rOwotICB9OwotCi0vKgotICogQSByYXcgYXJjLCB3aXRoIHBvaW50ZXJzIHRvIHRoZSBjYWxsaW5nIHNpdGUgYW5kIHRoZSBjYWxsZWQgc2l0ZQotICogYW5kIGEgY291bnQuICBFdmVyeXRoaW5nIGlzIGRlZmluZWQgaW4gdGVybXMgb2YgY2hhcmFjdGVycyBzbwotICogYXMgdG8gZ2V0IGEgcGFja2VkIHJlcHJlc2VudGF0aW9uIChvdGhlcndpc2UsIGRpZmZlcmVudCBjb21waWxlcnMKLSAqIG1pZ2h0IGludHJvZHVjZSBkaWZmZXJlbnQgcGFkZGluZyk6Ci0gKi8KLXN0cnVjdCByYXdfYXJjCi0gIHsKLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgYSBob3N0IGNvbXBpbGVyIGRlZmluZSBtZWFucyB0aGF0IHdlIGNhbid0IHVzZQotICAgICAgIGEgY3Jvc3MgZ3Byb2YgdG8gdGhlIGFscGhhLiAgKi8KLSNpZmRlZiBfX2FscGhhX18KLSAgICBjaGFyIGZyb21fcGNbOF07Ci0gICAgY2hhciBzZWxmX3BjWzhdOwotICAgIGNoYXIgY291bnRbOF07Ci0jZWxzZQotICAgIGNoYXIgZnJvbV9wY1s0XTsKLSAgICBjaGFyIHNlbGZfcGNbNF07Ci0gICAgY2hhciBjb3VudFs0XTsKLSNlbmRpZgotICB9OwotCi0vKgotICogR2VuZXJhbCByb3VuZGluZyBmdW5jdGlvbnM6Ci0gKi8KLSNkZWZpbmUgUk9VTkRET1dOKHgseSkJKCgoeCkvKHkpKSooeSkpCi0jZGVmaW5lIFJPVU5EVVAoeCx5KQkoKCgoeCkrKHkpLTEpLyh5KSkqKHkpKQotCi0jZW5kaWYgLyogZ21vbl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9nbW9uX2lvLmMgYi9ncHJvZi9nbW9uX2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGExYTAuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ21vbl9pby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qCi0gKiBJbnB1dCBhbmQgb3V0cHV0IGZyb20vdG8gZ21vbi5vdXQgZmlsZXMuCi0gKi8KLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiYmFzaWNfYmxvY2tzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0jaW5jbHVkZSAiZ21vbi5oIgkJLyogZmV0Y2ggaGVhZGVyIGZvciBvbGQgZm9ybWF0ICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJoZXJ0ei5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotaW50IGdtb25faW5wdXQgPSAwOwotaW50IGdtb25fZmlsZV92ZXJzaW9uID0gMDsJLyogMCA9PSBvbGQgKG5vbi12ZXJzaW9uZWQpIGZpbGUgZm9ybWF0ICovCi0KLS8qCi0gKiBUaGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGluIGxpYmJmZC4KLSAqLwotYmZkX3ZtYQotREVGVU4gKGdldF92bWEsIChhYmZkLCBhZGRyKSwgYmZkICogYWJmZCBBTkQgYmZkX2J5dGUgKiBhZGRyKQotewotICBzd2l0Y2ggKHNpemVvZiAoY2hhciopKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIGJmZF9nZXRfNjQgKGFiZmQsIGFkZHIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iKSwKLQkgICAgICAgd2hvYW1pLCAobG9uZykgc2l6ZW9mIChjaGFyKikpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBUaGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGluIGxpYmJmZC4KLSAqLwotdm9pZAotREVGVU4gKHB1dF92bWEsIChhYmZkLCB2YWwsIGFkZHIpLCBiZmQgKiBhYmZkIEFORCBiZmRfdm1hIHZhbCBBTkQgYmZkX2J5dGUgKiBhZGRyKQotewotICBzd2l0Y2ggKHNpemVvZiAoY2hhciopKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIGFkZHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgYmZkX3B1dF82NCAoYWJmZCwgdmFsLCBhZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iKSwKLQkgICAgICAgd2hvYW1pLCAobG9uZykgc2l6ZW9mIChjaGFyKikpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotfQotCi0KLXZvaWQKLURFRlVOIChnbW9uX291dF9yZWFkLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgRklMRSAqaWZwOwotICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKLSAgdW5zaWduZWQgY2hhciB0YWc7Ci0gIGludCBuaGlzdCA9IDAsIG5hcmNzID0gMCwgbmJicyA9IDA7Ci0KLSAgLyogb3BlbiBnbW9uLm91dCBmaWxlOiAqLwotCi0gIGlmIChzdHJjbXAgKGZpbGVuYW1lLCAiLSIpID09IDApCi0gICAgewotICAgICAgaWZwID0gc3RkaW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWZwID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7Ci0gICAgICBpZiAoIWlmcCkKLQl7Ci0JICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICB9Ci0gIGlmIChmcmVhZCAoJmdoZHIsIHNpemVvZiAoc3RydWN0IGdtb25faGRyKSwgMSwgaWZwKSAhPSAxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iKSwKLQkgICAgICAgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICgoZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMpIHx8Ci0gICAgICAoZmlsZV9mb3JtYXQgPT0gRkZfQVVUTyAmJiAhc3RybmNtcCAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KSkpCi0gICAgewotICAgICAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX01BR0lDICYmIHN0cm5jbXAgKCZnaGRyLmNvb2tpZVswXSwgR01PTl9NQUdJQywgNCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSBgJXMnIGhhcyBiYWQgbWFnaWMgY29va2llXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIHJpZ2h0IG1hZ2ljLCBzbyBpdCdzIHByb2JhYmx5IHJlYWxseSBhIG5ldyBnbW9uLm91dCBmaWxlICovCi0KLSAgICAgIGdtb25fZmlsZV92ZXJzaW9uID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBnaGRyLnZlcnNpb24pOwotICAgICAgaWYgKGdtb25fZmlsZV92ZXJzaW9uICE9IEdNT05fVkVSU0lPTiAmJiBnbW9uX2ZpbGVfdmVyc2lvbiAhPSAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgXygiJXM6IGZpbGUgYCVzJyBoYXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiAlZFxuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUsIGdtb25fZmlsZV92ZXJzaW9uKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogcmVhZCBpbiBhbGwgdGhlIHJlY29yZHM6ICovCi0gICAgICB3aGlsZSAoZnJlYWQgKCZ0YWcsIHNpemVvZiAodGFnKSwgMSwgaWZwKSA9PSAxKQotCXsKLQkgIHN3aXRjaCAodGFnKQotCSAgICB7Ci0JICAgIGNhc2UgR01PTl9UQUdfVElNRV9ISVNUOgotCSAgICAgICsrbmhpc3Q7Ci0JICAgICAgZ21vbl9pbnB1dCB8PSBJTlBVVF9ISVNUT0dSQU07Ci0JICAgICAgaGlzdF9yZWFkX3JlYyAoaWZwLCBmaWxlbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBHTU9OX1RBR19DR19BUkM6Ci0JICAgICAgKytuYXJjczsKLQkgICAgICBnbW9uX2lucHV0IHw9IElOUFVUX0NBTExfR1JBUEg7Ci0JICAgICAgY2dfcmVhZF9yZWMgKGlmcCwgZmlsZW5hbWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgR01PTl9UQUdfQkJfQ09VTlQ6Ci0JICAgICAgKytuYmJzOwotCSAgICAgIGdtb25faW5wdXQgfD0gSU5QVVRfQkJfQ09VTlRTOwotCSAgICAgIGJiX3JlYWRfcmVjIChpZnAsIGZpbGVuYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiAlczogZm91bmQgYmFkIHRhZyAlZCAoZmlsZSBjb3JydXB0ZWQ/KVxuIiksCi0JCSAgICAgICB3aG9hbWksIGZpbGVuYW1lLCB0YWcpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQVVUTwotCSAgIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRAotCSAgIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0KQotICAgIHsKLSAgICAgIHN0cnVjdCBoZHIKLSAgICAgIHsKLQliZmRfdm1hIGxvd19wYzsKLQliZmRfdm1hIGhpZ2hfcGM7Ci0JaW50IG5jbnQ7Ci0gICAgICB9OwotICAgICAgaW50IGksIHNhbXBfYnl0ZXMsIGhlYWRlcl9zaXplOwotICAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLSAgICAgIGJmZF92bWEgZnJvbV9wYywgc2VsZl9wYzsKLSAgICAgIHN0cnVjdCByYXdfYXJjIHJhd19hcmM7Ci0gICAgICBzdHJ1Y3QgcmF3X3BoZHIgcmF3OwotICAgICAgc3RhdGljIHN0cnVjdCBoZHIgaDsKLSAgICAgIFVOSVQgcmF3X2Jpbl9jb3VudDsKLSAgICAgIHN0cnVjdCBoZHIgdG1wOwotCi0gICAgICAvKgotICAgICAgICogSW5mb3JtYXRpb24gZnJvbSBhIGdtb24ub3V0IGZpbGUgaXMgaW4gdHdvIHBhcnRzOiBhbiBhcnJheSBvZgotICAgICAgICogc2FtcGxpbmcgaGl0cyB3aXRoaW4gcGMgcmFuZ2VzLCBhbmQgdGhlIGFyY3MuCi0gICAgICAgKi8KLSAgICAgIGdtb25faW5wdXQgPSBJTlBVVF9ISVNUT0dSQU0gfCBJTlBVVF9DQUxMX0dSQVBIOwotCi0gICAgICAvKgotICAgICAgICogVGhpcyBmc2VlaygpIG91Z2h0IHRvIHdvcmsgZXZlbiBvbiBzdGRpbiBhcyBsb25nIGFzIGl0J3MKLSAgICAgICAqIG5vdCBhbiBpbnRlcmFjdGl2ZSBkZXZpY2UgKGhlY2ssIGlzIHRoZXJlIGFueWJvZHkgd2hvIHdvdWxkCi0gICAgICAgKiB3YW50IHRvIHR5cGUgaW4gYSBnbW9uLm91dCBhdCB0aGUgdGVybWluYWw/KS4KLSAgICAgICAqLwotICAgICAgaWYgKGZzZWVrIChpZnAsIDAsIFNFRUtfU0VUKSA8IDApCi0JewotCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgICBpZiAoZnJlYWQgKCZyYXcsIDEsIHNpemVvZiAoc3RydWN0IHJhd19waGRyKSwgaWZwKQotCSAgIT0gc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iKSwKLQkJICAgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgICAgdG1wLmxvd19wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5sb3dfcGNbMF0pOwotICAgICAgdG1wLmhpZ2hfcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZyYXcuaGlnaF9wY1swXSk7Ci0gICAgICB0bXAubmNudCA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5uY250WzBdKTsKLQotICAgICAgaWYgKGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy52ZXJzaW9uWzBdKQotCSAgPT0gR01PTlZFUlNJT04pCi0JewotCSAgaW50IHByb2ZyYXRlOwotCi0JICAvKiA0LjRCU0QgZm9ybWF0IGhlYWRlci4gICovCi0KLQkgIHByb2ZyYXRlID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3LnByb2ZyYXRlWzBdKTsKLQkgIGlmICghc19oaWdocGMpCi0JICAgIGh6ID0gcHJvZnJhdGU7Ci0JICBlbHNlIGlmIChoeiAhPSBwcm9mcmF0ZSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiBwcm9maWxpbmcgcmF0ZSBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIpLAotCQkgICAgICAgZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0KLQkgIGhlYWRlcl9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBvbGQgc3R5bGUgQlNEIGZvcm1hdC4gICovCi0JICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQlNENDQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIpLAotCQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQotCSAgaWYgKGZzZWVrIChpZnAsIHNpemVvZiAoc3RydWN0IG9sZF9yYXdfcGhkciksIFNFRUtfU0VUKSA8IDApCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCi0JICBoZWFkZXJfc2l6ZSA9IHNpemVvZiAoc3RydWN0IG9sZF9yYXdfcGhkcik7Ci0JfQotCi0gICAgICBpZiAoc19oaWdocGMgJiYgKHRtcC5sb3dfcGMgIT0gaC5sb3dfcGMgfHwKLQkJICAgICAgIHRtcC5oaWdoX3BjICE9IGguaGlnaF9wYyB8fCB0bXAubmNudCAhPSBoLm5jbnQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIiksCi0JCSAgIGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICAgIGggPSB0bXA7Ci0gICAgICBzX2xvd3BjID0gKGJmZF92bWEpIGgubG93X3BjOwotICAgICAgc19oaWdocGMgPSAoYmZkX3ZtYSkgaC5oaWdoX3BjOwotICAgICAgbG93cGMgPSAoYmZkX3ZtYSkgaC5sb3dfcGMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgaGlnaHBjID0gKGJmZF92bWEpIGguaGlnaF9wYyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBzYW1wX2J5dGVzID0gaC5uY250IC0gaGVhZGVyX3NpemU7Ci0gICAgICBoaXN0X251bV9iaW5zID0gc2FtcF9ieXRlcyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBEQkcgKFNBTVBMRURFQlVHLAotCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBsb3dwYyAweCVseCBoaWdocGMgMHglbHggbmNudCAlZFxuIiwKLQkJICAgKHVuc2lnbmVkIGxvbmcpIGgubG93X3BjLCAodW5zaWduZWQgbG9uZykgaC5oaWdoX3BjLAotCQkgICBoLm5jbnQpOwotCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSAgIHNfbG93cGMgMHglbHggICBzX2hpZ2hwYyAweCVseFxuIiwKLQkJICAgKHVuc2lnbmVkIGxvbmcpIHNfbG93cGMsICh1bnNpZ25lZCBsb25nKSBzX2hpZ2hwYyk7Ci0JICAgcHJpbnRmICgiW2dtb25fb3V0X3JlYWRdICAgICBsb3dwYyAweCVseCAgICAgaGlnaHBjIDB4JWx4XG4iLAotCQkgICAodW5zaWduZWQgbG9uZykgbG93cGMsICh1bnNpZ25lZCBsb25nKSBoaWdocGMpOwotCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBzYW1wX2J5dGVzICVkIGhpc3RfbnVtX2JpbnMgJWRcbiIsCi0JCSAgIHNhbXBfYnl0ZXMsIGhpc3RfbnVtX2JpbnMpKTsKLQotICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBzZW5zaWJsZSB2YWx1ZXMuICAqLwotICAgICAgaWYgKHNhbXBfYnl0ZXMgPCAwIHx8IGxvd3BjID4gaGlnaHBjKQotICAgICAgICB7Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAKLQkgICAgXygiJXM6IGZpbGUgJyVzJyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgaW4gZ21vbi5vdXQgZm9ybWF0XG4iKSwKLQkgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgZG9uZSAoMSk7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKGhpc3RfbnVtX2JpbnMpCi0JewotCSAgKytuaGlzdDsKLQl9Ci0KLSAgICAgIGlmICghaGlzdF9zYW1wbGUpCi0JewotCSAgaGlzdF9zYW1wbGUgPQotCSAgICAoaW50ICopIHhtYWxsb2MgKGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0JICBtZW1zZXQgKGhpc3Rfc2FtcGxlLCAwLCBoaXN0X251bV9iaW5zICogc2l6ZW9mIChoaXN0X3NhbXBsZVswXSkpOwotCX0KLQotICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLQl7Ci0JICBpZiAoZnJlYWQgKHJhd19iaW5fY291bnQsIHNpemVvZiAocmF3X2Jpbl9jb3VudCksIDEsIGlmcCkgIT0gMSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkLyVkIGJpbnNcbiIpLAotCQkgICAgICAgd2hvYW1pLCAtLWksIGhpc3RfbnVtX2JpbnMpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JICBoaXN0X3NhbXBsZVtpXSArPSBiZmRfZ2V0XzE2IChjb3JlX2JmZCwgKGJmZF9ieXRlICopIHJhd19iaW5fY291bnQpOwotCX0KLQotICAgICAgLyoKLSAgICAgICAqIFRoZSByZXN0IG9mIHRoZSBmaWxlIGNvbnNpc3RzIG9mIGEgYnVuY2ggb2YgPGZyb20sc2VsZixjb3VudD4KLSAgICAgICAqIHR1cGxlczoKLSAgICAgICAqLwotICAgICAgd2hpbGUgKGZyZWFkICgmcmF3X2FyYywgc2l6ZW9mIChyYXdfYXJjKSwgMSwgaWZwKSA9PSAxKQotCXsKLQkgICsrbmFyY3M7Ci0JICBmcm9tX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmZyb21fcGMpOwotCSAgc2VsZl9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5zZWxmX3BjKTsKLQkgIGNvdW50ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmNvdW50KTsKLQkgIERCRyAoU0FNUExFREVCVUcsCi0JICAgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIGZyb21fcGMsICh1bnNpZ25lZCBsb25nKSBzZWxmX3BjLCBjb3VudCkpOwotCSAgLyogYWRkIHRoaXMgYXJjOiAqLwotCSAgY2dfdGFsbHkgKGZyb21fcGMsIHNlbGZfcGMsIGNvdW50KTsKLQl9Ci0gICAgICBmY2xvc2UgKGlmcCk7Ci0KLSAgICAgIGlmIChoeiA9PSBIWl9XUk9ORykKLQl7Ci0JICAvKgotCSAgICogSG93IG1hbnkgdGlja3MgcGVyIHNlY29uZD8gIElmIHdlIGNhbid0IHRlbGwsIHJlcG9ydAotCSAgICogdGltZSBpbiB0aWNrcy4KLQkgICAqLwotCSAgaHogPSBoZXJ0eiAoKTsKLQkgIGlmIChoeiA9PSBIWl9XUk9ORykKLQkgICAgewotCSAgICAgIGh6ID0gMTsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInRpbWUgaXMgaW4gdGlja3MsIG5vdCBzZWNvbmRzXG4iKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoIGZpbGUgZm9ybWF0ICVkXG4iKSwKLQkgICAgICAgd2hvYW1pLCBmaWxlX2Zvcm1hdCk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0dNT05fSU5GTykKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIkZpbGUgYCVzJyAodmVyc2lvbiAlZCkgY29udGFpbnM6XG4iKSwKLQkgICAgICBmaWxlbmFtZSwgZ21vbl9maWxlX3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCJcdCVkIGhpc3RvZ3JhbSByZWNvcmQlc1xuIiksCi0JICAgICAgbmhpc3QsIG5oaXN0ID09IDEgPyAiIiA6ICJzIik7Ci0gICAgICBwcmludGYgKF8oIlx0JWQgY2FsbC1ncmFwaCByZWNvcmQlc1xuIiksCi0JICAgICAgbmFyY3MsIG5hcmNzID09IDEgPyAiIiA6ICJzIik7Ci0gICAgICBwcmludGYgKF8oIlx0JWQgYmFzaWMtYmxvY2sgY291bnQgcmVjb3JkJXNcbiIpLAotCSAgICAgIG5iYnMsIG5iYnMgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgIGZpcnN0X291dHB1dCA9IEZBTFNFOwotICAgIH0KLX0KLQotCi12b2lkCi1ERUZVTiAoZ21vbl9vdXRfd3JpdGUsIChmaWxlbmFtZSksIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBGSUxFICpvZnA7Ci0gIHN0cnVjdCBnbW9uX2hkciBnaGRyOwotCi0gIG9mcCA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fV0IpOwotICBpZiAoIW9mcCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQVVUTyB8fCBmaWxlX2Zvcm1hdCA9PSBGRl9NQUdJQykKLSAgICB7Ci0gICAgICAvKiB3cml0ZSBnbW9uIGhlYWRlcjogKi8KLQotICAgICAgbWVtY3B5ICgmZ2hkci5jb29raWVbMF0sIEdNT05fTUFHSUMsIDQpOwotICAgICAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIEdNT05fVkVSU0lPTiwgKGJmZF9ieXRlICopIGdoZHIudmVyc2lvbik7Ci0gICAgICBpZiAoZndyaXRlICgmZ2hkciwgc2l6ZW9mIChnaGRyKSwgMSwgb2ZwKSAhPSAxKQotCXsKLQkgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotCi0gICAgICAvKiB3cml0ZSBleGVjdXRpb24gdGltZSBoaXN0b2dyYW0gaWYgd2UgaGF2ZSBvbmU6ICovCi0gICAgICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0hJU1RPR1JBTSkKLQl7Ci0JICBoaXN0X3dyaXRlX2hpc3QgKG9mcCwgZmlsZW5hbWUpOwotCX0KLQotICAgICAgLyogd3JpdGUgY2FsbCBncmFwaCBhcmNzIGlmIHdlIGhhdmUgYW55OiAqLwotICAgICAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9DQUxMX0dSQVBIKQotCXsKLQkgIGNnX3dyaXRlX2FyY3MgKG9mcCwgZmlsZW5hbWUpOwotCX0KLQotICAgICAgLyogd3JpdGUgYmFzaWMtYmxvY2sgaW5mbyBpZiB3ZSBoYXZlIGl0OiAqLwotICAgICAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9CQl9DT1VOVFMpCi0JewotCSAgYmJfd3JpdGVfYmxvY2tzIChvZnAsIGZpbGVuYW1lKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9CU0QgfHwgZmlsZV9mb3JtYXQgPT0gRkZfQlNENDQpCi0gICAgewotICAgICAgc3RydWN0IHJhd19hcmMgcmF3X2FyYzsKLSAgICAgIFVOSVQgcmF3X2Jpbl9jb3VudDsKLSAgICAgIHN0cnVjdCByYXdfcGhkciBoOwotICAgICAgaW50IGk7Ci0gICAgICBBcmMgKmFyYzsKLSAgICAgIFN5bSAqc3ltOwotCi0gICAgICBtZW1zZXQgKCZoLCAwLCBzaXplb2YgaCk7Ci0gICAgICBwdXRfdm1hIChjb3JlX2JmZCwgc19sb3dwYywgKGJmZF9ieXRlICopICZoLmxvd19wYyk7Ci0gICAgICBwdXRfdm1hIChjb3JlX2JmZCwgc19oaWdocGMsIChiZmRfYnl0ZSAqKSAmaC5oaWdoX3BjKTsKLSAgICAgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLAotCQkgIGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKFVOSVQpICsgc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpLAotCQkgIChiZmRfYnl0ZSAqKSAmaC5uY250KTsKLQotICAgICAgLyogV3JpdGUgaGVhZGVyLiAgVXNlIG5ldyBzdHlsZSBCU0QgZm9ybWF0IGlzIGV4cGxpY2l0bHkKLSAgICAgICAgIHNwZWNpZmllZCwgb3IgaWYgdGhlIHByb2ZpbGluZyByYXRlIGlzIG5vbi1zdGFuZGFyZDsKLSAgICAgICAgIG90aGVyd2lzZSwgdXNlIHRoZSBvbGQgQlNEIGZvcm1hdC4gICovCi0gICAgICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQlNENDQKLQkgIHx8IGh6ICE9IGhlcnR6ICgpKQotCXsKLQkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBHTU9OVkVSU0lPTiwgKGJmZF9ieXRlICopICZoLnZlcnNpb24pOwotCSAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGh6LCAoYmZkX2J5dGUgKikgJmgucHJvZnJhdGUpOwotCSAgaWYgKGZ3cml0ZSAoJmgsIHNpemVvZiAoc3RydWN0IHJhd19waGRyKSwgMSwgb2ZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZ3cml0ZSAoJmgsIHNpemVvZiAoc3RydWN0IG9sZF9yYXdfcGhkciksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBkdW1wIHRoZSBzYW1wbGVzOiAqLwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgaGlzdF9udW1fYmluczsgKytpKQotCXsKLQkgIGJmZF9wdXRfMTYgKGNvcmVfYmZkLCBoaXN0X3NhbXBsZVtpXSwgKGJmZF9ieXRlICopICYgcmF3X2Jpbl9jb3VudFswXSk7Ci0JICBpZiAoZndyaXRlICgmcmF3X2Jpbl9jb3VudFswXSwgc2l6ZW9mIChyYXdfYmluX2NvdW50KSwgMSwgb2ZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIGR1bXAgdGhlIG5vcm1hbGl6ZWQgcmF3IGFyYyBpbmZvcm1hdGlvbjogKi8KLQotICAgICAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLQl7Ci0JICBmb3IgKGFyYyA9IHN5bS0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotCSAgICB7Ci0JICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIGFyYy0+cGFyZW50LT5hZGRyLAotCQkgICAgICAgKGJmZF9ieXRlICopIHJhd19hcmMuZnJvbV9wYyk7Ci0JICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIGFyYy0+Y2hpbGQtPmFkZHIsCi0JCSAgICAgICAoYmZkX2J5dGUgKikgcmF3X2FyYy5zZWxmX3BjKTsKLQkgICAgICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgYXJjLT5jb3VudCwgKGJmZF9ieXRlICopIHJhd19hcmMuY291bnQpOwotCSAgICAgIGlmIChmd3JpdGUgKCZyYXdfYXJjLCBzaXplb2YgKHJhd19hcmMpLCAxLCBvZnApICE9IDEpCi0JCXsKLQkJICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkJICBkb25lICgxKTsKLQkJfQotCSAgICAgIERCRyAoU0FNUExFREVCVUcsCi0JCSAgIHByaW50ZiAoIltkdW1wc3VtXSBmcm9tcGMgMHglbHggc2VsZnBjIDB4JWx4IGNvdW50ICVsdVxuIiwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBhcmMtPnBhcmVudC0+YWRkciwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBhcmMtPmNoaWxkLT5hZGRyLCBhcmMtPmNvdW50KSk7Ci0JICAgIH0KLQl9Ci0gICAgICBmY2xvc2UgKG9mcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoIGZpbGUgZm9ybWF0ICVkXG4iKSwKLQkgICAgICAgd2hvYW1pLCBmaWxlX2Zvcm1hdCk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9nbW9uX2lvLmggYi9ncHJvZi9nbW9uX2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjU3YTQuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ21vbl9pby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2lmbmRlZiBnbW9uX2lvX2gKLSNkZWZpbmUgZ21vbl9pb19oCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnbW9uLmgiCi0KLSNkZWZpbmUgSU5QVVRfSElTVE9HUkFNCQkoMTw8MCkKLSNkZWZpbmUgSU5QVVRfQ0FMTF9HUkFQSAkoMTw8MSkKLSNkZWZpbmUgSU5QVVRfQkJfQ09VTlRTCQkoMTw8MikKLQotZXh0ZXJuIGludCBnbW9uX2lucHV0OwkJLyogd2hhdCBpbnB1dCBkaWQgd2Ugc2VlPyAqLwotZXh0ZXJuIGludCBnbW9uX2ZpbGVfdmVyc2lvbjsJLyogZmlsZSB2ZXJzaW9uIGFyZSB3ZSBkZWFsaW5nIHdpdGggKi8KLQotZXh0ZXJuIGJmZF92bWEgZ2V0X3ZtYSBQQVJBTVMgKChiZmQgKiBhYmZkLCBiZmRfYnl0ZSAqIGFkZHIpKTsKLWV4dGVybiB2b2lkIHB1dF92bWEgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX3ZtYSB2YWwsIGJmZF9ieXRlICogYWRkcikpOwotCi1leHRlcm4gdm9pZCBnbW9uX291dF9yZWFkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBnbW9uX291dF93cml0ZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0jZW5kaWYgLyogZ21vbl9pb19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9nbW9uX291dC5oIGIvZ3Byb2YvZ21vbl9vdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0NGZiNS4uMDAwMDAwMAotLS0gYS9ncHJvZi9nbW9uX291dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiBnbW9uLm91dCBmaWxlcy4gIEl0IHNob3VsZCBoYXZlCi0gKiBhcyBmZXcgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGFzIHBvc3NpYmxlIGFzIGl0IGlzIGdvaW5nIHRvIGJlCi0gKiBpbmNsdWRlZCBpbiBtYW55IGRpZmZlcmVudCBwcm9ncmFtcy4gIFRoYXQgaXMsIG1pbmltaXplIHRoZQotICogbnVtYmVyIG9mICNpbmNsdWRlJ3MuCi0gKgotICogQSBnbW9uLm91dCBmaWxlIGNvbnNpc3RzIG9mIGEgaGVhZGVyIChkZWZpbmVkIGJ5IGdtb25faGRyKSBmb2xsb3dlZAotICogYnkgYSBzZXF1ZW5jZSBvZiByZWNvcmRzLiAgRWFjaCByZWNvcmQgc3RhcnRzIHdpdGggYSBvbmUtYnl0ZSB0YWcKLSAqIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIHJlY29yZHMsIGZvbGxvd2VkIGJ5IHJlY29yZHMgc3BlY2lmaWMgZGF0YS4KLSAqLwotI2lmbmRlZiBnbW9uX291dF9oCi0jZGVmaW5lIGdtb25fb3V0X2gKLQotI2RlZmluZQlHTU9OX01BR0lDCSJnbW9uIgkvKiBtYWdpYyBjb29raWUgKi8KLSNkZWZpbmUgR01PTl9WRVJTSU9OCTEJLyogdmVyc2lvbiBudW1iZXIgKi8KLQotLyoKLSAqIFJhdyBoZWFkZXIgYXMgaXQgYXBwZWFycyBvbiBmaWxlICh3aXRob3V0IHBhZGRpbmcpOgotICovCi1zdHJ1Y3QgZ21vbl9oZHIKLSAgewotICAgIGNoYXIgY29va2llWzRdOwotICAgIGNoYXIgdmVyc2lvbls0XTsKLSAgICBjaGFyIHNwYXJlWzMgKiA0XTsKLSAgfTsKLQotLyogdHlwZXMgb2YgcmVjb3JkcyBpbiB0aGlzIGZpbGU6ICovCi10eXBlZGVmIGVudW0KLSAgewotICAgIEdNT05fVEFHX1RJTUVfSElTVCA9IDAsIEdNT05fVEFHX0NHX0FSQyA9IDEsIEdNT05fVEFHX0JCX0NPVU5UID0gMgotICB9Ci1HTU9OX1JlY29yZF9UYWc7Ci0KLXN0cnVjdCBnbW9uX2hpc3RfaGRyCi0gIHsKLSAgICBjaGFyIGxvd19wY1tzaXplb2YgKGNoYXIqKV07CS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjW3NpemVvZiAoY2hhciopXTsJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSAgICBjaGFyIGhpc3Rfc2l6ZVs0XTsJCQkvKiBzaXplIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIHByb2ZfcmF0ZVs0XTsJCQkvKiBwcm9maWxpbmcgY2xvY2sgcmF0ZSAqLwotICAgIGNoYXIgZGltZW5bMTVdOwkJCS8qIHBoeXMuIGRpbS4sIHVzdWFsbHkgInNlY29uZHMiICovCi0gICAgY2hhciBkaW1lbl9hYmJyZXY7CQkJLyogdXN1YWxseSAncycgZm9yICJzZWNvbmRzIiAqLwotICB9OwotCi1zdHJ1Y3QgZ21vbl9jZ19hcmNfcmVjb3JkCi0gIHsKLSAgICBjaGFyIGZyb21fcGNbc2l6ZW9mIChjaGFyKildOwkvKiBhZGRyZXNzIHdpdGhpbiBjYWxsZXIncyBib2R5ICovCi0gICAgY2hhciBzZWxmX3BjW3NpemVvZiAoY2hhciopXTsJLyogYWRkcmVzcyB3aXRoaW4gY2FsbGVlJ3MgYm9keSAqLwotICAgIGNoYXIgY291bnRbNF07CQkJLyogbnVtYmVyIG9mIGFyYyB0cmF2ZXJzYWxzICovCi0gIH07Ci0KLSNlbmRpZiAvKiBnbW9uX291dF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9ncHJvZi4xIGIvZ3Byb2YvZ3Byb2YuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3MzRkYS4uMDAwMDAwMAotLS0gYS9ncHJvZi9ncHJvZi4xCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLS5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCi0uXCIgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotLlwiIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheSB0aGUgZm9sbG93aW5nCi0uXCIgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotLlwiIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJyBpbiB0aGUKLS5cIiBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24gYW5kIGluCi0uXCIgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotLlwiIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQotLlwiIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLS5cIiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0uXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0uXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLS5cIgotLlwiICAgICBAKCMpZ3Byb2YuMQk2LjYgKEJlcmtlbGV5KSA3LzI0LzkwCi0uXCIKLS5USCBHUFJPRiAxICJKYW51YXJ5IDI5LCAxOTkzIgotLlNIIE5BTUUKLWdwcm9mIFwtIGRpc3BsYXkgY2FsbCBncmFwaCBwcm9maWxlIGRhdGEKLS5TSCBTWU5PUFNJUwotLkIgZ3Byb2YgWyBcLWFiY3N6IF0gWyBcLWV8XC1FCi0uSSBuYW1lCi0uQiBdIFsgXC1mfFwtRiAKLS5JIG5hbWUKLS5CIF0gCi0uQiBbIFwtawotLkkgZnJvbW5hbWUgdG9uYW1lCi0uQiBdIFsgCi0uSSBvYmpmaWxlCi0uQiBbIAotLkkgZ21vbi5vdXQKLS5CIF0gCi0uQiBdIAotLlNIIERFU0NSSVBUSU9OCi0uQiBncHJvZgotcHJvZHVjZXMgYW4gZXhlY3V0aW9uIHByb2ZpbGUgb2YgQywgUGFzY2FsLCBvciBGb3J0cmFuNzcgcHJvZ3JhbXMuCi1UaGUgZWZmZWN0IG9mIGNhbGxlZCByb3V0aW5lcyBpcyBpbmNvcnBvcmF0ZWQgaW4gdGhlIHByb2ZpbGUgb2YgZWFjaCBjYWxsZXIuCi1UaGUgcHJvZmlsZSBkYXRhIGlzIHRha2VuIGZyb20gdGhlIGNhbGwgZ3JhcGggcHJvZmlsZSBmaWxlCi1cJihgZ21vbi5vdXQnIGRlZmF1bHQpIHdoaWNoIGlzIGNyZWF0ZWQgYnkgcHJvZ3JhbXMKLXRoYXQgYXJlIGNvbXBpbGVkIHdpdGggdGhlCi0uQiBcLXBnCi1vcHRpb24gb2YKLS5CUiBjYyAoIDEgKSAsCi0uQlIgcGMgKCAxICkgLAotYW5kCi0uQlIgZjc3ICggMSApIC4KLVRoZQotLkIgXC1wZwotb3B0aW9uIGFsc28gbGlua3MgaW4gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgcm91dGluZXMKLXRoYXQgYXJlIGNvbXBpbGVkIGZvciBwcm9maWxpbmcuCi0uQiBHcHJvZgotcmVhZHMgdGhlIGdpdmVuIG9iamVjdCBmaWxlICh0aGUgZGVmYXVsdCBpcyBgYS5vdXQnKQotYW5kIGVzdGFibGlzaGVzIHRoZSByZWxhdGlvbiBiZXR3ZWVuIGl0cyBzeW1ib2wgdGFibGUKLWFuZCB0aGUgY2FsbCBncmFwaCBwcm9maWxlIGZyb20gYGdtb24ub3V0Jy4KLUlmIG1vcmUgdGhhbiBvbmUgcHJvZmlsZSBmaWxlIGlzIHNwZWNpZmllZCwKLXRoZQotLkIgZ3Byb2YKLW91dHB1dCBzaG93cyB0aGUgc3VtIG9mIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIGluIHRoZSBnaXZlbiBwcm9maWxlIGZpbGVzLgotLlBQCi0uQiBHcHJvZgotY2FsY3VsYXRlcyB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gZWFjaCByb3V0aW5lLgotTmV4dCwgdGhlc2UgdGltZXMgYXJlIHByb3BhZ2F0ZWQgYWxvbmcgdGhlIGVkZ2VzIG9mIHRoZSBjYWxsIGdyYXBoLgotQ3ljbGVzIGFyZSBkaXNjb3ZlcmVkLCBhbmQgY2FsbHMgaW50byBhIGN5Y2xlIGFyZSBtYWRlIHRvIHNoYXJlIHRoZSB0aW1lCi1vZiB0aGUgY3ljbGUuCi1UaGUgZmlyc3QgbGlzdGluZyBzaG93cyB0aGUgZnVuY3Rpb25zCi1zb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0aW1lIHRoZXkgcmVwcmVzZW50Ci1pbmNsdWRpbmcgdGhlIHRpbWUgb2YgdGhlaXIgY2FsbCBncmFwaCBkZXNjZW5kYW50cy4KLUJlbG93IGVhY2ggZnVuY3Rpb24gZW50cnkgaXMgc2hvd24gaXRzIChkaXJlY3QpIGNhbGwgZ3JhcGggY2hpbGRyZW4sCi1hbmQgaG93IHRoZWlyIHRpbWVzIGFyZSBwcm9wYWdhdGVkIHRvIHRoaXMgZnVuY3Rpb24uCi1BIHNpbWlsYXIgZGlzcGxheSBhYm92ZSB0aGUgZnVuY3Rpb24gc2hvd3MgaG93IHRoaXMgZnVuY3Rpb24ncyB0aW1lIGFuZCB0aGUKLXRpbWUgb2YgaXRzIGRlc2NlbmRhbnRzIGlzIHByb3BhZ2F0ZWQgdG8gaXRzIChkaXJlY3QpIGNhbGwgZ3JhcGggcGFyZW50cy4KLS5QUAotQ3ljbGVzIGFyZSBhbHNvIHNob3duLCB3aXRoIGFuIGVudHJ5IGZvciB0aGUgY3ljbGUgYXMgYSB3aG9sZSBhbmQKLWEgbGlzdGluZyBvZiB0aGUgbWVtYmVycyBvZiB0aGUgY3ljbGUgYW5kIHRoZWlyIGNvbnRyaWJ1dGlvbnMgdG8gdGhlCi10aW1lIGFuZCBjYWxsIGNvdW50cyBvZiB0aGUgY3ljbGUuCi0uUFAKLVNlY29uZCwgYSBmbGF0IHByb2ZpbGUgaXMgZ2l2ZW4sCi1zaW1pbGFyIHRvIHRoYXQgcHJvdmlkZWQgYnkKLS5CUiBwcm9mICggMSApICAuCi1UaGlzIGxpc3RpbmcgZ2l2ZXMgdGhlIHRvdGFsIGV4ZWN1dGlvbiB0aW1lcywgdGhlIGNhbGwgY291bnRzLAotdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoZSBjYWxsIHNwZW50IGluIHRoZSByb3V0aW5lIGl0c2VsZiwgYW5kCi10aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhlIGNhbGwgc3BlbnQgaW4gdGhlIHJvdXRpbmUgaXRzZWxmIGluY2x1ZGluZwotaXRzIGRlc2NlbmRhbnRzLgotLlBQCi1GaW5hbGx5LCBhbiBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgaXMgcHJvdmlkZWQuCi0uU0ggT1BUSU9OUwotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6Ci0uVFAKLS5CIFwtYQotc3VwcHJlc3NlcyB0aGUgcHJpbnRpbmcgb2Ygc3RhdGljYWxseSBkZWNsYXJlZCBmdW5jdGlvbnMuCi1JZiB0aGlzIG9wdGlvbiBpcyBnaXZlbiwgYWxsIHJlbGV2YW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0aWMgZnVuY3Rpb24KLShlLmcuLCB0aW1lIHNhbXBsZXMsIGNhbGxzIHRvIG90aGVyIGZ1bmN0aW9ucywgY2FsbHMgZnJvbSBvdGhlciBmdW5jdGlvbnMpCi1iZWxvbmdzIHRvIHRoZSBmdW5jdGlvbiBsb2FkZWQganVzdCBiZWZvcmUgdGhlIHN0YXRpYyBmdW5jdGlvbiBpbiB0aGUKLVwmYG9iamZpbGUnIGZpbGUuCi0uVFAKLS5CIFwtYgotc3VwcHJlc3NlcyB0aGUgcHJpbnRpbmcgb2YgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIGZpZWxkIGluIHRoZSBwcm9maWxlLgotLlRQCi0uQiBcLWMKLXRoZSBzdGF0aWMgY2FsbCBncmFwaCBvZiB0aGUgcHJvZ3JhbSBpcyBkaXNjb3ZlcmVkIGJ5IGEgaGV1cmlzdGljCi10aGF0IGV4YW1pbmVzIHRoZSB0ZXh0IHNwYWNlIG9mIHRoZSBvYmplY3QgZmlsZS4KLVN0YXRpYy1vbmx5IHBhcmVudHMgb3IgY2hpbGRyZW4gYXJlIHNob3duCi13aXRoIGNhbGwgY291bnRzIG9mIDAuCi0uVFAKLS5CSSAiXC1lICIgbmFtZQotc3VwcHJlc3NlcyB0aGUgcHJpbnRpbmcgb2YgdGhlIGdyYXBoIHByb2ZpbGUgZW50cnkgZm9yIHJvdXRpbmUKLS5JIG5hbWUKLWFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzCi0odW5sZXNzIHRoZXkgaGF2ZSBvdGhlciBhbmNlc3RvcnMgdGhhdCBhcmVuJ3Qgc3VwcHJlc3NlZCkuCi1Nb3JlIHRoYW4gb25lCi0uQiBcLWUKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4uCi1Pbmx5IG9uZQotLkkgbmFtZQotbWF5IGJlIGdpdmVuIHdpdGggZWFjaAotLkIgXC1lCi1vcHRpb24uCi0uVFAKLS5CSSAiXC1FICIgbmFtZQotc3VwcHJlc3NlcyB0aGUgcHJpbnRpbmcgb2YgdGhlIGdyYXBoIHByb2ZpbGUgZW50cnkgZm9yIHJvdXRpbmUKLS5JIG5hbWUKLShhbmQgaXRzIGRlc2NlbmRhbnRzKSBhcwotLkIgXC1lICAsCi1hYm92ZSwgYW5kIGFsc28gZXhjbHVkZXMgdGhlIHRpbWUgc3BlbnQgaW4KLS5JIG5hbWUKLShhbmQgaXRzIGRlc2NlbmRhbnRzKSBmcm9tIHRoZSB0b3RhbCBhbmQgcGVyY2VudGFnZSB0aW1lIGNvbXB1dGF0aW9ucy4KLShGb3IgZXhhbXBsZSwKLS5CSSAiXC1FICIgbWNvdW50Ci0uQkkgIlwtRSAiIG1jbGVhbnVwCi1pcyB0aGUgZGVmYXVsdC4pCi0uVFAKLS5CSSAiXC1mICIgbmFtZQotcHJpbnRzIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IG9mIG9ubHkgdGhlIHNwZWNpZmllZCByb3V0aW5lCi0uSSBuYW1lCi1hbmQgaXRzIGRlc2NlbmRhbnRzLgotTW9yZSB0aGFuIG9uZQotLkIgXC1mCi1vcHRpb24gbWF5IGJlIGdpdmVuLgotT25seSBvbmUKLS5JIG5hbWUKLW1heSBiZSBnaXZlbiB3aXRoIGVhY2gKLS5CIFwtZgotb3B0aW9uLgotLlRQCi0uQkkgIlwtRiAiIG5hbWUKLXByaW50cyB0aGUgZ3JhcGggcHJvZmlsZSBlbnRyeSBvZiBvbmx5IHRoZSByb3V0aW5lCi0uSSBuYW1lCi1hbmQgaXRzIGRlc2NlbmRhbnRzIChhcwotLkIgXC1mICwKLWFib3ZlKSBhbmQgYWxzbyB1c2VzIG9ubHkgdGhlIHRpbWVzIG9mIHRoZSBwcmludGVkIHJvdXRpbmVzCi1pbiB0b3RhbCB0aW1lIGFuZCBwZXJjZW50YWdlIGNvbXB1dGF0aW9ucy4KLU1vcmUgdGhhbiBvbmUKLS5CIFwtRgotb3B0aW9uIG1heSBiZSBnaXZlbi4KLU9ubHkgb25lCi0uSSBuYW1lCi1tYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCi0uQiBcLUYKLW9wdGlvbi4KLVRoZQotLkIgXC1GCi1vcHRpb24KLW92ZXJyaWRlcwotdGhlCi0uQiBcLUUKLW9wdGlvbi4KLS5UUAotLkJJICJcLWsgIiAiZnJvbW5hbWUgdG9uYW1lIgotd2lsbCBkZWxldGUgYW55IGFyY3MgZnJvbSByb3V0aW5lCi0uSSBmcm9tbmFtZQotdG8gcm91dGluZQotLklSIHRvbmFtZSAgLgotVGhpcyBjYW4gYmUgdXNlZCB0byBicmVhayB1bmRlc2lyZWQgY3ljbGVzLgotTW9yZSB0aGFuIG9uZQotLkIgXC1rCi1vcHRpb24gbWF5IGJlIGdpdmVuLgotT25seSBvbmUgcGFpciBvZiByb3V0aW5lIG5hbWVzIG1heSBiZSBnaXZlbiB3aXRoIGVhY2gKLS5CIFwtawotb3B0aW9uLgotLlRQCi0uQiBcLXMKLWEgcHJvZmlsZSBmaWxlIGBnbW9uLnN1bScgaXMgcHJvZHVjZWQgdGhhdCByZXByZXNlbnRzCi10aGUgc3VtIG9mIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIGluIGFsbCB0aGUgc3BlY2lmaWVkIHByb2ZpbGUgZmlsZXMuCi1UaGlzIHN1bW1hcnkgcHJvZmlsZSBmaWxlIG1heSBiZSBnaXZlbiB0byBsYXRlcgotZXhlY3V0aW9ucyBvZiBncHJvZiAocHJvYmFibHkgYWxzbyB3aXRoIGEKLS5CUiBcLXMgICkKLXRvIGFjY3VtdWxhdGUgcHJvZmlsZSBkYXRhIGFjcm9zcyBzZXZlcmFsIHJ1bnMgb2YgYW4gYG9iamZpbGUnIGZpbGUuCi0uVFAKLS5CIC12Ci1wcmludHMgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBncHJvZiwgYW5kIHRoZW4gZXhpdHMuCi0uVFAKLS5CIC16Ci1kaXNwbGF5cyByb3V0aW5lcyB0aGF0IGhhdmUgemVybyB1c2FnZSAoYXMgc2hvd24gYnkgY2FsbCBjb3VudHMKLWFuZCBhY2N1bXVsYXRlZCB0aW1lKS4KLVRoaXMgaXMgdXNlZnVsIHdpdGggdGhlCi0uQiBcLWMKLW9wdGlvbiBmb3IgZGlzY292ZXJpbmcgd2hpY2ggcm91dGluZXMgd2VyZSBuZXZlciBjYWxsZWQuCi0uUFAKLS5TSCBGSUxFUwotLnRhIFx3J2dtb24uc3VtICd1Ci1hLm91dAl0aGUgbmFtZWxpc3QgYW5kIHRleHQgc3BhY2UuCi0uYnIKLWdtb24ub3V0CWR5bmFtaWMgY2FsbCBncmFwaCBhbmQgcHJvZmlsZS4KLS5icgotZ21vbi5zdW0gc3VtbWFyaXplZCBkeW5hbWljIGNhbGwgZ3JhcGggYW5kIHByb2ZpbGUuCi0uU0ggU0VFIEFMU08KLS5CUiBtb25pdG9yICggMyApICwKLS5CUiBwcm9maWwgKCAyICkgLAotLkJSIGNjICggMSApICwKLS5CUiBwcm9mICggMSApCi0uc3AKLWBgQW4gRXhlY3V0aW9uIFByb2ZpbGVyIGZvciBNb2R1bGFyIFByb2dyYW1zJycsCi1ieSBTLiBHcmFoYW0sIFAuIEtlc3NsZXIsIE0uIE1jS3VzaWNrOwotLkkKLVNvZnR3YXJlIFwtIFByYWN0aWNlIGFuZCBFeHBlcmllbmNlLAotVm9sLiAxMywgcHAuIDY3MS02ODUsIDE5ODMuCi0uc3AKLWBgZ3Byb2Y6IEEgQ2FsbCBHcmFwaCBFeGVjdXRpb24gUHJvZmlsZXInJywKLWJ5IFMuIEdyYWhhbSwgUC4gS2Vzc2xlciwgTS4gTWNLdXNpY2s7Ci0uSQotUHJvY2VlZGluZ3Mgb2YgdGhlIFNJR1BMQU4gJzgyIFN5bXBvc2l1bSBvbiBDb21waWxlciBDb25zdHJ1Y3Rpb24sCi1TSUdQTEFOIE5vdGljZXMsIFZvbC4gMTcsIE5vICA2LCBwcC4gMTIwLTEyNiwgSnVuZSAxOTgyLgotLlNIIEhJU1RPUlkKLS5CIEdwcm9mCi1hcHBlYXJlZCBpbiA0LjIgQlNELgotLlNIIEJVR1MKLVRoZSBncmFudWxhcml0eSBvZiB0aGUgc2FtcGxpbmcgaXMgc2hvd24sIGJ1dCByZW1haW5zCi1zdGF0aXN0aWNhbCBhdCBiZXN0LgotV2UgYXNzdW1lIHRoYXQgdGhlIHRpbWUgZm9yIGVhY2ggZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24KLWNhbiBiZSBleHByZXNzZWQgYnkgdGhlIHRvdGFsIHRpbWUgZm9yIHRoZSBmdW5jdGlvbiBkaXZpZGVkCi1ieSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCi1UaHVzIHRoZSB0aW1lIHByb3BhZ2F0ZWQgYWxvbmcgdGhlIGNhbGwgZ3JhcGggYXJjcyB0byB0aGUgZnVuY3Rpb24ncwotcGFyZW50cyBpcyBkaXJlY3RseSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0Ci1hcmMgaXMgdHJhdmVyc2VkLgotLlBQCi1QYXJlbnRzIHRoYXQgYXJlIG5vdCB0aGVtc2VsdmVzIHByb2ZpbGVkIHdpbGwgaGF2ZSB0aGUgdGltZSBvZgotdGhlaXIgcHJvZmlsZWQgY2hpbGRyZW4gcHJvcGFnYXRlZCB0byB0aGVtLCBidXQgdGhleSB3aWxsIGFwcGVhcgotdG8gYmUgc3BvbnRhbmVvdXNseSBpbnZva2VkIGluIHRoZSBjYWxsIGdyYXBoIGxpc3RpbmcsIGFuZCB3aWxsCi1ub3QgaGF2ZSB0aGVpciB0aW1lIHByb3BhZ2F0ZWQgZnVydGhlci4KLVNpbWlsYXJseSwgc2lnbmFsIGNhdGNoZXJzLCBldmVuIHRob3VnaCBwcm9maWxlZCwgd2lsbCBhcHBlYXIKLXRvIGJlIHNwb250YW5lb3VzIChhbHRob3VnaCBmb3IgbW9yZSBvYnNjdXJlIHJlYXNvbnMpLgotQW55IHByb2ZpbGVkIGNoaWxkcmVuIG9mIHNpZ25hbCBjYXRjaGVycyBzaG91bGQgaGF2ZSB0aGVpciB0aW1lcwotcHJvcGFnYXRlZCBwcm9wZXJseSwgdW5sZXNzIHRoZSBzaWduYWwgY2F0Y2hlciB3YXMgaW52b2tlZCBkdXJpbmcKLXRoZSBleGVjdXRpb24gb2YgdGhlIHByb2ZpbGluZyByb3V0aW5lLCBpbiB3aGljaCBjYXNlIGFsbCBpcyBsb3N0LgotLlBQCi1UaGUgcHJvZmlsZWQgcHJvZ3JhbSBtdXN0IGNhbGwKLS5CUiBleGl0ICggMiApCi1vciByZXR1cm4gbm9ybWFsbHkgZm9yIHRoZSBwcm9maWxpbmcgaW5mb3JtYXRpb24gdG8gYmUgc2F2ZWQKLWluIHRoZSBgZ21vbi5vdXQnIGZpbGUuCmRpZmYgLS1naXQgYS9ncHJvZi9ncHJvZi5jIGIvZ3Byb2YvZ3Byb2YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5MDQ4Ny4uMDAwMDAwMAotLS0gYS9ncHJvZi9ncHJvZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTggUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJiYXNpY19ibG9ja3MuaCIKLSNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNnX3ByaW50LmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJnbW9uX2lvLmgiCi0jaW5jbHVkZSAiaGVydHouaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic291cmNlLmgiCi0jaW5jbHVkZSAic3ltX2lkcy5oIgotCi1jb25zdCBjaGFyICp3aG9hbWk7Ci1jb25zdCBjaGFyICpmdW5jdGlvbl9tYXBwaW5nX2ZpbGU7Ci1jb25zdCBjaGFyICphX291dF9uYW1lID0gQV9PVVROQU1FOwotbG9uZyBoeiA9IEhaX1dST05HOwotCi0vKgotICogRGVmYXVsdCBvcHRpb25zIHZhbHVlczoKLSAqLwotaW50IGRlYnVnX2xldmVsID0gMDsKLWludCBvdXRwdXRfc3R5bGUgPSAwOwotaW50IG91dHB1dF93aWR0aCA9IDgwOwotYm9vbCBic2Rfc3R5bGVfb3V0cHV0ID0gRkFMU0U7Ci1ib29sIGRlbWFuZ2xlID0gVFJVRTsKLWJvb2wgZGlzY2FyZF91bmRlcnNjb3JlcyA9IFRSVUU7Ci1ib29sIGlnbm9yZV9kaXJlY3RfY2FsbHMgPSBGQUxTRTsKLWJvb2wgaWdub3JlX3N0YXRpY19mdW5jcyA9IEZBTFNFOwotYm9vbCBpZ25vcmVfemVyb3MgPSBUUlVFOwotYm9vbCBsaW5lX2dyYW51bGFyaXR5ID0gRkFMU0U7Ci1ib29sIHByaW50X2Rlc2NyaXB0aW9ucyA9IFRSVUU7Ci1ib29sIHByaW50X3BhdGggPSBGQUxTRTsKLWJvb2wgaWdub3JlX25vbl9mdW5jdGlvbnMgPSBGQUxTRTsKLUZpbGVfRm9ybWF0IGZpbGVfZm9ybWF0ID0gRkZfQVVUTzsKLQotYm9vbCBmaXJzdF9vdXRwdXQgPSBUUlVFOwotCi1jaGFyIGNvcHlyaWdodFtdID0KLSBOXygiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iKTsKLQotc3RhdGljIGNoYXIgKmdtb25fbmFtZSA9IEdNT05OQU1FOwkvKiBwcm9maWxlIGZpbGVuYW1lICovCi0KLWJmZCAqYWJmZDsKLQotLyoKLSAqIEZ1bmN0aW9ucyB0aGF0IGdldCBleGNsdWRlZCBieSBkZWZhdWx0OgotICovCi1zdGF0aWMgY2hhciAqZGVmYXVsdF9leGNsdWRlZF9saXN0W10gPQotewotICAiX2dwcm9mX21jb3VudCIsICJtY291bnQiLCAiX21jb3VudCIsICJfX21jb3VudCIsICJfX21jb3VudF9pbnRlcm5hbCIsCi0gICJfX21jbGVhbnVwIiwKLSAgIjxsb2NvcmU+IiwgIjxoaWNvcmU+IiwKLSAgMAotfTsKLQotLyogQ29kZXMgdXNlZCBmb3IgdGhlIGxvbmcgb3B0aW9ucyB3aXRoIG5vIHNob3J0IHN5bm9ueW1zLiAgMTUwIGlzbid0Ci0gICBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KLQotI2RlZmluZSBPUFRJT05fREVNQU5HTEUJCSgxNTApCi0jZGVmaW5lIE9QVElPTl9OT19ERU1BTkdMRQkoT1BUSU9OX0RFTUFOR0xFICsgMSkKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ImxpbmUiLCBub19hcmd1bWVudCwgMCwgJ2wnfSwKLSAgeyJuby1zdGF0aWMiLCBub19hcmd1bWVudCwgMCwgJ2EnfSwKLSAgeyJpZ25vcmUtbm9uLWZ1bmN0aW9ucyIsIG5vX2FyZ3VtZW50LCAwLCAnRCd9LAotCi0gICAgLyogb3V0cHV0IHN0eWxlczogKi8KLQotICB7ImFubm90YXRlZC1zb3VyY2UiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ0EnfSwKLSAgeyJuby1hbm5vdGF0ZWQtc291cmNlIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdKJ30sCi0gIHsiZmxhdC1wcm9maWxlIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdwJ30sCi0gIHsibm8tZmxhdC1wcm9maWxlIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdQJ30sCi0gIHsiZ3JhcGgiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ3EnfSwKLSAgeyJuby1ncmFwaCIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnUSd9LAotICB7ImV4ZWMtY291bnRzIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdDJ30sCi0gIHsibm8tZXhlYy1jb3VudHMiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ1onfSwKLSAgeyJmdW5jdGlvbi1vcmRlcmluZyIsIG5vX2FyZ3VtZW50LCAwLCAncid9LAotICB7ImZpbGUtb3JkZXJpbmciLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1InfSwKLSAgeyJmaWxlLWluZm8iLCBub19hcmd1bWVudCwgMCwgJ2knfSwKLSAgeyJzdW0iLCBub19hcmd1bWVudCwgMCwgJ3MnfSwKLQotICAgIC8qIHZhcmlvdXMgb3B0aW9ucyB0byBhZmZlY3Qgb3V0cHV0OiAqLwotCi0gIHsiYWxsLWxpbmVzIiwgbm9fYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0RFTUFOR0xFfSwKLSAgeyJuby1kZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fTk9fREVNQU5HTEV9LAotICB7ImRpcmVjdG9yeS1wYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCi0gIHsiZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zIiwgbm9fYXJndW1lbnQsIDAsICd6J30sCi0gIHsibWluLWNvdW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdtJ30sCi0gIHsicHJpbnQtcGF0aCIsIG5vX2FyZ3VtZW50LCAwLCAnTCd9LAotICB7InNlcGFyYXRlLWZpbGVzIiwgbm9fYXJndW1lbnQsIDAsICd5J30sCi0gIHsic3RhdGljLWNhbGwtZ3JhcGgiLCBub19hcmd1bWVudCwgMCwgJ2MnfSwKLSAgeyJ0YWJsZS1sZW5ndGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3QnfSwKLSAgeyJ0aW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICduJ30sCi0gIHsibm8tdGltZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTid9LAotICB7IndpZHRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd3J30sCi0gICAgLyoKLSAgICAgKiBUaGVzZSBhcmUgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IG9ubHkuICBUaGVpciBmdW5jdGlvbmFsaXR5Ci0gICAgICogaXMgcHJvdmlkZWQgYnkgdGhlIG91dHB1dCBzdHlsZSBvcHRpb25zIGFscmVhZHk6Ci0gICAgICovCi0gIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdlJ30sCi0gIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdFJ30sCi0gIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJ30sCi0gIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCi0gIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdrJ30sCi0KLSAgICAvKiBtaXNjZWxsYW5lb3VzOiAqLwotCi0gIHsiYnJpZWYiLCBub19hcmd1bWVudCwgMCwgJ2InfSwKLSAgeyJkZWJ1ZyIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnZCd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJmaWxlLWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAotICB7InRyYWRpdGlvbmFsIiwgbm9fYXJndW1lbnQsIDAsICdUJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAodXNhZ2UsIChzdHJlYW0sIHN0YXR1cyksIEZJTEUgKiBzdHJlYW0gQU5EIGludCBzdGF0dXMpCi17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstW2FiY0RoaWxMc1R2d3h5el1dIFstW0FDZUVmRkpuTk9wUHFRWl1bbmFtZV1dIFstSSBkaXJzXVxuXAotCVstZFtudW1dXSBbLWsgZnJvbS90b10gWy1tIG1pbi1jb3VudF0gWy10IHRhYmxlLWxlbmd0aF1cblwKLQlbLS1bbm8tXWFubm90YXRlZC1zb3VyY2VbPW5hbWVdXSBbLS1bbm8tXWV4ZWMtY291bnRzWz1uYW1lXV1cblwKLQlbLS1bbm8tXWZsYXQtcHJvZmlsZVs9bmFtZV1dIFstLVtuby1dZ3JhcGhbPW5hbWVdXVxuXAotCVstLVtuby1ddGltZT1uYW1lXSBbLS1hbGwtbGluZXNdIFstLWJyaWVmXSBbLS1kZWJ1Z1s9bGV2ZWxdXVxuXAotCVstLWZ1bmN0aW9uLW9yZGVyaW5nXSBbLS1maWxlLW9yZGVyaW5nXVxuXAotCVstLWRpcmVjdG9yeS1wYXRoPWRpcnNdIFstLWRpc3BsYXktdW51c2VkLWZ1bmN0aW9uc11cblwKLQlbLS1maWxlLWZvcm1hdD1uYW1lXSBbLS1maWxlLWluZm9dIFstLWhlbHBdIFstLWxpbmVdIFstLW1pbi1jb3VudD1uXVxuXAotCVstLW5vLXN0YXRpY10gWy0tcHJpbnQtcGF0aF0gWy0tc2VwYXJhdGUtZmlsZXNdXG5cCi0JWy0tc3RhdGljLWNhbGwtZ3JhcGhdIFstLXN1bV0gWy0tdGFibGUtbGVuZ3RoPWxlbl0gWy0tdHJhZGl0aW9uYWxdXG5cCi0JWy0tdmVyc2lvbl0gWy0td2lkdGg9bl0gWy0taWdub3JlLW5vbi1mdW5jdGlvbnNdXG5cCi0JWy0tZGVtYW5nbGVdIFstLW5vLWRlbWFuZ2xlXVxuXAotCVtpbWFnZS1maWxlXSBbcHJvZmlsZS1maWxlLi4uXVxuIiksCi0JICAgd2hvYW1pKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGRvbmUgKHN0YXR1cyk7Ci19Ci0KLQotaW50Ci1ERUZVTiAobWFpbiwgKGFyZ2MsIGFyZ3YpLCBpbnQgYXJnYyBBTkQgY2hhciAqKmFyZ3YpCi17Ci0gIGNoYXIgKipzcCwgKnN0cjsKLSAgU3ltICoqY2cgPSAwOwotICBpbnQgY2gsIHVzZXJfc3BlY2lmaWVkID0gMDsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHdob2FtaSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAod2hvYW1pKTsKLQotICB3aGlsZSAoKGNoID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsCi0JImFBOjpiQmNDZEQ6OmU6RTpmOkY6aGlJOko6Oms6bExtOm46Ok46Ok86cDo6UDo6cTo6UTo6c3Q6VHZ3Onh5elo6OiIsCi0JCQkgICAgbG9uZ19vcHRpb25zLCAwKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgJ2EnOgotCSAgaWdub3JlX3N0YXRpY19mdW5jcyA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICdBJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfQU5OTyk7Ci0JICAgIH0KLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgcHJpbnRfZGVzY3JpcHRpb25zID0gRkFMU0U7Ci0JICBicmVhazsKLQljYXNlICdCJzoKLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgaWdub3JlX2RpcmVjdF9jYWxscyA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICdDJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfRVhFQyk7Ci0JICAgIH0KLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9FWEVDX0NPVU5UUzsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0VYRUNfQ09VTlRTOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgZGVidWdfbGV2ZWwgfD0gYXRvaSAob3B0YXJnKTsKLQkgICAgICBkZWJ1Z19sZXZlbCB8PSBBTllERUJVRzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZGVidWdfbGV2ZWwgPSB+MDsKLQkgICAgfQotCSAgREJHIChBTllERUJVRywgcHJpbnRmICgiW21haW5dIGRlYnVnLWxldmVsPTB4JXhcbiIsIGRlYnVnX2xldmVsKSk7Ci0jaWZuZGVmIERFQlVHCi0JICBwcmludGYgKF8oIiVzOiBkZWJ1Z2dpbmcgbm90IHN1cHBvcnRlZDsgLWQgaWdub3JlZFxuIiksIHdob2FtaSk7Ci0jZW5kaWYJLyogREVCVUcgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgaWdub3JlX25vbl9mdW5jdGlvbnMgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnRSc6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfVElNRSk7Ci0JY2FzZSAnZSc6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfR1JBUEgpOwotCSAgYnJlYWs7Ci0JY2FzZSAnRic6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfVElNRSk7Ci0JY2FzZSAnZic6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfR1JBUEgpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfRkxBVCk7Ci0JICBicmVhazsKLQljYXNlICdHJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9GTEFUKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JY2FzZSAnaSc6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfR01PTl9JTkZPOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfR01PTl9JTkZPOwotCSAgYnJlYWs7Ci0JY2FzZSAnSSc6Ci0JICBzZWFyY2hfbGlzdF9hcHBlbmQgKCZzcmNfc2VhcmNoX2xpc3QsIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdKJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfQU5OTyk7Ci0JICAgICAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dHB1dF9zdHlsZSAmPSB+U1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKLQkgICAgfQotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKLQkgIGJyZWFrOwotCWNhc2UgJ2snOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0FSQ1MpOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICBsaW5lX2dyYW51bGFyaXR5ID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0wnOgotCSAgcHJpbnRfcGF0aCA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICdtJzoKLQkgIGJiX21pbl9jYWxscyA9ICh1bnNpZ25lZCBsb25nKSBzdHJ0b3VsIChvcHRhcmcsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9USU1FKTsKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX1RJTUUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTyc6Ci0JICBzd2l0Y2ggKG9wdGFyZ1swXSkKLQkgICAgewotCSAgICBjYXNlICdhJzoKLQkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX0FVVE87Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ20nOgotCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfTUFHSUM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2InOgotCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfQlNEOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICc0JzoKLQkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX0JTRDQ0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdwJzoKLQkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX1BST0Y7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5rbm93biBmaWxlIGZvcm1hdCAlc1xuIiksCi0JCSAgICAgICBvcHRhcmcsIHdob2FtaSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9GTEFUKTsKLQkgICAgfQotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9GTEFUKTsKLQkgICAgICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRkxBVF9QUk9GSUxFOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0ZMQVRfUFJPRklMRTsKLQkgICAgfQotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRkxBVF9QUk9GSUxFOwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNociAob3B0YXJnLCAnLycpKQotCQl7Ci0JCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0FSQ1MpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0dSQVBIKTsKLQkJfQotCSAgICB9Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICBicmVhazsKLQljYXNlICdyJzoKLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9GVU5DVElPTl9PUkRFUjsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0ZVTkNUSU9OX09SREVSOwotCSAgYnJlYWs7Ci0JY2FzZSAnUic6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRklMRV9PUkRFUjsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0ZJTEVfT1JERVI7Ci0JICBmdW5jdGlvbl9tYXBwaW5nX2ZpbGUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdRJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY2hyIChvcHRhcmcsICcvJykpCi0JCXsKLQkJICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfQVJDUyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfR1JBUEgpOwotCQl9Ci0JICAgICAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dHB1dF9zdHlsZSAmPSB+U1RZTEVfQ0FMTF9HUkFQSDsKLQkgICAgfQotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX1NVTU1BUllfRklMRTsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX1NVTU1BUllfRklMRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgYmJfdGFibGVfbGVuZ3RoID0gYXRvaSAob3B0YXJnKTsKLQkgIGlmIChiYl90YWJsZV9sZW5ndGggPCAwKQotCSAgICB7Ci0JICAgICAgYmJfdGFibGVfbGVuZ3RoID0gMDsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnVCc6Ci0JICBic2Rfc3R5bGVfb3V0cHV0ID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgLyogVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LiAgKi8KLQkgIHByaW50ZiAoXygiR05VIGdwcm9mICVzXG4iKSwgVkVSU0lPTik7Ci0JICBwcmludGYgKF8oIkJhc2VkIG9uIEJTRCBncHJvZiwgY29weXJpZ2h0IDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIikpOwotCSAgcHJpbnRmIChfKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKLQkgIGRvbmUgKDApOwotCWNhc2UgJ3cnOgotCSAgb3V0cHV0X3dpZHRoID0gYXRvaSAob3B0YXJnKTsKLQkgIGlmIChvdXRwdXRfd2lkdGggPCAxKQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3dpZHRoID0gMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBiYl9hbm5vdGF0ZV9hbGxfbGluZXMgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAneSc6Ci0JICBjcmVhdGVfYW5ub3RhdGlvbl9maWxlcyA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICd6JzoKLQkgIGlnbm9yZV96ZXJvcyA9IEZBTFNFOwotCSAgYnJlYWs7Ci0JY2FzZSAnWic6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0VYRUMpOwotCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9FWEVDX0NPVU5UUzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3N0eWxlICY9IH5TVFlMRV9FWEVDX0NPVU5UUzsKLQkgICAgfQotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RFTUFOR0xFOgotCSAgZGVtYW5nbGUgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fREVNQU5HTEU6Ci0JICBkZW1hbmdsZSA9IEZBTFNFOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCX0KLSAgICB9Ci0KLSAgLyogRG9uJ3QgYWxsb3cgYm90aCBvcmRlcmluZyBvcHRpb25zLCB0aGV5IG1vZGlmeSB0aGUgYXJjIGRhdGEgaW4tcGxhY2UuICAqLwotICBpZiAoKHVzZXJfc3BlY2lmaWVkICYgU1RZTEVfRlVOQ1RJT05fT1JERVIpCi0gICAgICAmJiAodXNlcl9zcGVjaWZpZWQgJiBTVFlMRV9GSUxFX09SREVSKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsXygiXAotJXM6IE9ubHkgb25lIG9mIC0tZnVuY3Rpb24tb3JkZXJpbmcgYW5kIC0tZmlsZS1vcmRlcmluZyBtYXkgYmUgc3BlY2lmaWVkLlxuIiksCi0JICAgICAgIHdob2FtaSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogLS1zdW0gaW1wbGllcyAtLWxpbmUsIG90aGVyd2lzZSB3ZSdkIGxvc2UgYi1iIGNvdW50cyBpbiBnbW9uLnN1bSAqLwotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfU1VNTUFSWV9GSUxFKQotICAgIHsKLSAgICAgIGxpbmVfZ3JhbnVsYXJpdHkgPSAxOwotICAgIH0KLQotICAvKiBhcHBlbmQgdmFsdWUgb2YgR1BST0ZfUEFUSCB0byBzb3VyY2Ugc2VhcmNoIGxpc3QgaWYgc2V0OiAqLwotICBzdHIgPSAoY2hhciAqKSBnZXRlbnYgKCJHUFJPRl9QQVRIIik7Ci0gIGlmIChzdHIpCi0gICAgewotICAgICAgc2VhcmNoX2xpc3RfYXBwZW5kICgmc3JjX3NlYXJjaF9saXN0LCBzdHIpOwotICAgIH0KLQotICBpZiAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBhX291dF9uYW1lID0gYXJndltvcHRpbmQrK107Ci0gICAgfQotICBpZiAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBnbW9uX25hbWUgPSBhcmd2W29wdGluZCsrXTsKLSAgICB9Ci0KLSAgLyoKLSAgICogVHVybiBvZmYgZGVmYXVsdCBmdW5jdGlvbnM6Ci0gICAqLwotICBmb3IgKHNwID0gJmRlZmF1bHRfZXhjbHVkZWRfbGlzdFswXTsgKnNwOyBzcCsrKQotICAgIHsKLSAgICAgIHN5bV9pZF9hZGQgKCpzcCwgRVhDTF9USU1FKTsKLSAgICAgIHN5bV9pZF9hZGQgKCpzcCwgRVhDTF9HUkFQSCk7Ci0jaWZkZWYgX19hbHBoYV9fCi0gICAgICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfRkxBVCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyoKLSAgICogRm9yIGxpbmUtYnktbGluZSBwcm9maWxpbmcsIGFsc28gd2FudCB0byBrZWVwIHRob3NlCi0gICAqIGZ1bmN0aW9ucyBvZmYgdGhlIGZsYXQgcHJvZmlsZToKLSAgICovCi0gIGlmIChsaW5lX2dyYW51bGFyaXR5KQotICAgIHsKLSAgICAgIGZvciAoc3AgPSAmZGVmYXVsdF9leGNsdWRlZF9saXN0WzBdOyAqc3A7IHNwKyspCi0JewotCSAgc3ltX2lkX2FkZCAoKnNwLCBFWENMX0ZMQVQpOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogUmVhZCBzeW1ib2wgdGFibGUgZnJvbSBjb3JlIGZpbGU6Ci0gICAqLwotICBjb3JlX2luaXQgKGFfb3V0X25hbWUpOwotCi0gIC8qCi0gICAqIElmIHdlIHNob3VsZCBpZ25vcmUgZGlyZWN0IGZ1bmN0aW9uIGNhbGxzLCB3ZSBuZWVkIHRvIGxvYWQKLSAgICogdG8gY29yZSdzIHRleHQtc3BhY2U6Ci0gICAqLwotICBpZiAoaWdub3JlX2RpcmVjdF9jYWxscykKLSAgICB7Ci0gICAgICBjb3JlX2dldF90ZXh0X3NwYWNlIChjb3JlX2JmZCk7Ci0gICAgfQotCi0gIC8qCi0gICAqIENyZWF0ZSBzeW1ib2xzIGZyb20gY29yZSBpbWFnZToKLSAgICovCi0gIGlmIChsaW5lX2dyYW51bGFyaXR5KQotICAgIHsKLSAgICAgIGNvcmVfY3JlYXRlX2xpbmVfc3ltcyAoY29yZV9iZmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgKGNvcmVfYmZkKTsKLSAgICB9Ci0KLSAgLyoKLSAgICogVHJhbnNsYXRlIHN5bSBzcGVjcyBpbnRvIHN5bXM6Ci0gICAqLwotICBzeW1faWRfcGFyc2UgKCk7Ci0KLSAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX1BST0YpCi0gICAgewotI2lmZGVmIFBST0ZfU1VQUE9SVF9JTVBMRU1FTlRFRAotICAgICAgLyoKLSAgICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBtb24ub3V0IGZpbGUocyk6Ci0gICAgICAgKi8KLSAgICAgIGRvCi0JewotCSAgbW9uX291dF9yZWFkIChnbW9uX25hbWUpOwotCSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JICAgIHsKLQkgICAgICBnbW9uX25hbWUgPSBhcmd2W29wdGluZF07Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAob3B0aW5kKysgPCBhcmdjKTsKLSNlbHNlCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgIF8oIiVzOiBzb3JyeSwgZmlsZSBmb3JtYXQgYHByb2YnIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKSwKLQkgICAgICAgd2hvYW1pKTsKLSAgICAgIGRvbmUgKDEpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBnbW9uLm91dCBmaWxlKHMpOgotICAgICAgICovCi0gICAgICBkbwotCXsKLQkgIGdtb25fb3V0X3JlYWQgKGdtb25fbmFtZSk7Ci0JICBpZiAob3B0aW5kIDwgYXJnYykKLQkgICAgewotCSAgICAgIGdtb25fbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlIChvcHRpbmQrKyA8IGFyZ2MpOwotICAgIH0KLQotICAvKgotICAgKiBJZiB1c2VyIGRpZCBub3Qgc3BlY2lmeSBvdXRwdXQgc3R5bGUsIHRyeSB0byBndWVzcyBzb21ldGhpbmcKLSAgICogcmVhc29uYWJsZToKLSAgICovCi0gIGlmIChvdXRwdXRfc3R5bGUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZ21vbl9pbnB1dCAmIChJTlBVVF9ISVNUT0dSQU0gfCBJTlBVVF9DQUxMX0dSQVBIKSkKLQl7Ci0JICBvdXRwdXRfc3R5bGUgPSBTVFlMRV9GTEFUX1BST0ZJTEUgfCBTVFlMRV9DQUxMX0dSQVBIOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvdXRwdXRfc3R5bGUgPSBTVFlMRV9FWEVDX0NPVU5UUzsKLQl9Ci0gICAgICBvdXRwdXRfc3R5bGUgJj0gfnVzZXJfc3BlY2lmaWVkOwotICAgIH0KLQotICAvKgotICAgKiBEdW1wIGEgZ21vbi5zdW0gZmlsZSBpZiByZXF1ZXN0ZWQgKGJlZm9yZSBhbnkgb3RoZXIgcHJvY2Vzc2luZyEpOgotICAgKi8KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX1NVTU1BUllfRklMRSkKLSAgICB7Ci0gICAgICBnbW9uX291dF93cml0ZSAoR01PTlNVTSk7Ci0gICAgfQotCi0gIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfSElTVE9HUkFNKQotICAgIHsKLSAgICAgIGhpc3RfYXNzaWduX3NhbXBsZXMgKCk7Ci0gICAgfQotCi0gIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQ0FMTF9HUkFQSCkKLSAgICB7Ci0gICAgICBjZyA9IGNnX2Fzc2VtYmxlICgpOwotICAgIH0KLQotICAvKiBkbyBzb21lIHNpbXBsZSBzYW5pdHkgY2hlY2tzOiAqLwotCi0gIGlmICgob3V0cHV0X3N0eWxlICYgU1RZTEVfRkxBVF9QUk9GSUxFKQotICAgICAgJiYgIShnbW9uX2lucHV0ICYgSU5QVVRfSElTVE9HUkFNKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgaGlzdG9ncmFtXG4iKSwgd2hvYW1pKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBpZiAoKG91dHB1dF9zdHlsZSAmIFNUWUxFX0NBTExfR1JBUEgpICYmICEoZ21vbl9pbnB1dCAmIElOUFVUX0NBTExfR1JBUEgpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgXygiJXM6IGdtb24ub3V0IGZpbGUgaXMgbWlzc2luZyBjYWxsLWdyYXBoIGRhdGFcbiIpLCB3aG9hbWkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIG91dHB1dCB3aGF0ZXZlciB1c2VyIHdoaXNoZXMgdG8gc2VlOiAqLwotCi0gIGlmIChjZyAmJiAob3V0cHV0X3N0eWxlICYgU1RZTEVfQ0FMTF9HUkFQSCkgJiYgYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBjZ19wcmludCAoY2cpOwkJLyogcHJpbnQgdGhlIGR5bmFtaWMgcHJvZmlsZSAqLwotICAgIH0KLQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfRkxBVF9QUk9GSUxFKQotICAgIHsKLSAgICAgIGhpc3RfcHJpbnQgKCk7CQkvKiBwcmludCB0aGUgZmxhdCBwcm9maWxlICovCi0gICAgfQotCi0gIGlmIChjZyAmJiAob3V0cHV0X3N0eWxlICYgU1RZTEVfQ0FMTF9HUkFQSCkpCi0gICAgewotICAgICAgaWYgKCFic2Rfc3R5bGVfb3V0cHV0KQotCXsKLQkgIGNnX3ByaW50IChjZyk7CS8qIHByaW50IHRoZSBkeW5hbWljIHByb2ZpbGUgKi8KLQl9Ci0gICAgICBjZ19wcmludF9pbmRleCAoKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0VYRUNfQ09VTlRTKQotICAgIHsKLSAgICAgIHByaW50X2V4ZWNfY291bnRzICgpOwotICAgIH0KLQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfQU5OT1RBVEVEX1NPVVJDRSkKLSAgICB7Ci0gICAgICBwcmludF9hbm5vdGF0ZWRfc291cmNlICgpOwotICAgIH0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZVTkNUSU9OX09SREVSKQotICAgIHsKLSAgICAgIGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nICgpOwotICAgIH0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZJTEVfT1JERVIpCi0gICAgewotICAgICAgY2dfcHJpbnRfZmlsZV9vcmRlcmluZyAoKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1kb25lIChzdGF0dXMpCi0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGV4aXQgKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9ncHJvZi5oIGIvZ3Byb2YvZ3Byb2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY2MmFlZS4uMDAwMDAwMAotLS0gYS9ncHJvZi9ncHJvZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqICAgICAgQCgjKWdwcm9mLmggICAgIDUuOSAoQmVya2VsZXkpIDYvMS85MAotICovCi0jaWZuZGVmIGdwcm9mX2gKLSNkZWZpbmUgZ3Byb2ZfaAotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogSW5jbHVkZSB0aGUgQkZEIHN5c2RlcC5oIGZpbGUuICAqLwotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0vKiBVbmRlZmluZSB0aGUgQkZEIFBBQ0tBR0UgYW5kIFZFUlNJT04gbWFjcm9zIGJlZm9yZSBpbmNsdWRpbmcgdGhlCi0gICBncHJvZiBjb25maWcuaCBmaWxlLiAgKi8KLSN1bmRlZiBQQUNLQUdFCi0jdW5kZWYgVkVSU0lPTgotLyogQWxzbyB1bmRlZmluZSBCRkQncyBgXycgbWFjcm87IHdlIGhhdmUgb3VyIG93biBkZWZpbml0aW9uLiAgKi8KLSN1bmRlZiBfCi0KLSNpbmNsdWRlICJnY29uZmlnLmgiCi0KLSNpZm5kZWYgTUlOCi0jZGVmaW5lIE1JTihhLGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLSNpZm5kZWYgTUFYCi0jZGVmaW5lIE1BWChhLGIpCSgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotLyogQUlYIGRlZmluZXMgaHogYXMgYSBtYWNyby4gICovCi0jdW5kZWYgaHoKLQotI2lmbmRlZiBQQVRIX01BWAotI2RlZmluZSBQQVRIX01BWAkxMDI0Ci0jZW5kaWYKLQotI2RlZmluZQlBX09VVE5BTUUJImEub3V0IgkvKiBkZWZhdWx0IGNvcmUgZmlsZW5hbWUgKi8KLSNkZWZpbmUJR01PTk5BTUUJImdtb24ub3V0IgkvKiBkZWZhdWx0IHByb2ZpbGUgZmlsZW5hbWUgKi8KLSNkZWZpbmUJR01PTlNVTQkJImdtb24uc3VtIgkvKiBwcm9maWxlIHN1bW1hcnkgZmlsZW5hbWUgKi8KLQotI2lmZGVmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9OTFMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotIyBkZWZpbmUgXyhTdHJpbmcpIGdldHRleHQgKFN0cmluZykKLSMgaWZkZWYgZ2V0dGV4dF9ub29wCi0jICBkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKLSMgZWxzZQotIyAgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSMgZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotIyBkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0KLS8qCi0gKiBUaGVzZSBtYXkgYWxyZWFkeSBiZSBkZWZpbmVkIG9uIHNvbWUgc3lzdGVtcy4gIFdlIGNvdWxkIHByb2JhYmx5Ci0gKiBqdXN0IHVzZSB0aGUgQkZEIHZlcnNpb25zIG9mIHRoZXNlLCBzaW5jZSBCRkQgaGFzIGFscmVhZHkgZGVhbHQKLSAqIHdpdGggdGhpcyBwcm9ibGVtLgotICovCi0jdW5kZWYgRkFMU0UKLSNkZWZpbmUJRkFMU0UJMAotI3VuZGVmIFRSVUUKLSNkZWZpbmUJVFJVRQkxCi0KLSNkZWZpbmUgU1RZTEVfRkxBVF9QUk9GSUxFCSgxPDwwKQotI2RlZmluZSBTVFlMRV9DQUxMX0dSQVBICSgxPDwxKQotI2RlZmluZSBTVFlMRV9TVU1NQVJZX0ZJTEUJKDE8PDIpCi0jZGVmaW5lIFNUWUxFX0VYRUNfQ09VTlRTCSgxPDwzKQotI2RlZmluZSBTVFlMRV9BTk5PVEFURURfU09VUkNFCSgxPDw0KQotI2RlZmluZSBTVFlMRV9HTU9OX0lORk8JCSgxPDw1KQotI2RlZmluZSBTVFlMRV9GVU5DVElPTl9PUkRFUgkoMTw8NikKLSNkZWZpbmUgU1RZTEVfRklMRV9PUkRFUgkoMTw8NykKLQotI2RlZmluZQlBTllERUJVRwkoMTw8MCkJLyogICAgMSAqLwotI2RlZmluZQlERk5ERUJVRwkoMTw8MSkJLyogICAgMiAqLwotI2RlZmluZQlDWUNMRURFQlVHCSgxPDwyKQkvKiAgICA0ICovCi0jZGVmaW5lCUFSQ0RFQlVHCSgxPDwzKQkvKiAgICA4ICovCi0jZGVmaW5lCVRBTExZREVCVUcJKDE8PDQpCS8qICAgMTYgKi8KLSNkZWZpbmUJVElNRURFQlVHCSgxPDw1KQkvKiAgIDMyICovCi0jZGVmaW5lCVNBTVBMRURFQlVHCSgxPDw2KQkvKiAgIDY0ICovCi0jZGVmaW5lCUFPVVRERUJVRwkoMTw8NykJLyogIDEyOCAqLwotI2RlZmluZQlDQUxMREVCVUcJKDE8PDgpCS8qICAyNTYgKi8KLSNkZWZpbmUJTE9PS1VQREVCVUcJKDE8PDkpCS8qICA1MTIgKi8KLSNkZWZpbmUJUFJPUERFQlVHCSgxPDwxMCkJLyogMTAyNCAqLwotI2RlZmluZSBCQkRFQlVHCQkoMTw8MTEpCS8qIDIwNDggKi8KLSNkZWZpbmUgSURERUJVRwkJKDE8PDEyKQkvKiA0MDk2ICovCi0jZGVmaW5lIFNSQ0RFQlVHCSgxPDwxMykJLyogODE5MiAqLwotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgREJHKGwscykJaWYgKGRlYnVnX2xldmVsICYgKGwpKSB7czt9Ci0jZWxzZQotI2RlZmluZSBEQkcobCxzKQotI2VuZGlmCi0KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgRkZfQVVUTyA9IDAsIEZGX01BR0lDLCBGRl9CU0QsIEZGX0JTRDQ0LCBGRl9QUk9GCi0gIH0KLUZpbGVfRm9ybWF0OwotCi10eXBlZGVmIGludCBib29sOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVOSVRbMl07CS8qIHVuaXQgb2YgcHJvZmlsaW5nICovCi0KLWV4dGVybiBjb25zdCBjaGFyICp3aG9hbWk7CS8qIGNvbW1hbmQtbmFtZSwgZm9yIGVycm9yIG1lc3NhZ2VzICovCi1leHRlcm4gY29uc3QgY2hhciAqZnVuY3Rpb25fbWFwcGluZ19maWxlOyAvKiBmaWxlIG1hcHBpbmcgZnVuY3Rpb25zIHRvIGZpbGVzICovCi1leHRlcm4gY29uc3QgY2hhciAqYV9vdXRfbmFtZTsJLyogY29yZSBmaWxlbmFtZSAqLwotZXh0ZXJuIGxvbmcgaHo7CQkJLyogdGlja3MgcGVyIHNlY29uZCAqLwotCi0vKgotICogQ29tbWFuZC1saW5lIG9wdGlvbnM6Ci0gKi8KLWV4dGVybiBpbnQgZGVidWdfbGV2ZWw7CQkvKiBkZWJ1ZyBsZXZlbCAqLwotZXh0ZXJuIGludCBvdXRwdXRfc3R5bGU7Ci1leHRlcm4gaW50IG91dHB1dF93aWR0aDsJLyogY29udHJvbHMgY29sdW1uIHdpZHRoIGluIGluZGV4ICovCi1leHRlcm4gYm9vbCBic2Rfc3R5bGVfb3V0cHV0OwkvKiBhcyBvcHBvc2VkIHRvIEZTRiBzdHlsZSBvdXRwdXQgKi8KLWV4dGVybiBib29sIGRlbWFuZ2xlOwkJLyogZGVtYW5nbGUgc3ltYm9sIG5hbWVzPyAqLwotZXh0ZXJuIGJvb2wgZGlzY2FyZF91bmRlcnNjb3JlczsJLyogZGlzY2FyZCBsZWFkaW5nIHVuZGVyc2NvcmVzPyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX2RpcmVjdF9jYWxsczsJLyogZG9uJ3QgY291bnQgZGlyZWN0IGNhbGxzICovCi1leHRlcm4gYm9vbCBpZ25vcmVfc3RhdGljX2Z1bmNzOwkvKiBzdXBwcmVzcyBzdGF0aWMgZnVuY3Rpb25zICovCi1leHRlcm4gYm9vbCBpZ25vcmVfemVyb3M7CS8qIGlnbm9yZSB1bnVzZWQgc3ltYm9scy9maWxlcyAqLwotZXh0ZXJuIGJvb2wgbGluZV9ncmFudWxhcml0eTsJLyogZnVuY3Rpb24gb3IgbGluZSBncmFudWxhcml0eT8gKi8KLWV4dGVybiBib29sIHByaW50X2Rlc2NyaXB0aW9uczsJLyogb3V0cHV0IHByb2ZpbGUgZGVzY3JpcHRpb24gKi8KLWV4dGVybiBib29sIHByaW50X3BhdGg7CQkvKiBwcmludCBwYXRoIG9yIGp1c3QgZmlsZW5hbWU/ICovCi1leHRlcm4gYm9vbCBpZ25vcmVfbm9uX2Z1bmN0aW9uczsvKiBJZ25vcmUgbm9uLWZ1bmN0aW9uIHN5bWJvbHMuICAqLwotCi1leHRlcm4gRmlsZV9Gb3JtYXQgZmlsZV9mb3JtYXQ7CS8qIHJlcXVlc3RlZCBmaWxlIGZvcm1hdCAqLwotCi1leHRlcm4gYm9vbCBmaXJzdF9vdXRwdXQ7CS8qIG5vIG91dHB1dCBzbyBmYXI/ICovCi0KLWV4dGVybiB2b2lkIGRvbmUgUEFSQU1TICgoaW50IHN0YXR1cykpOwotCi0jZW5kaWYgLyogZ3Byb2ZfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YudGV4aSBiL2dwcm9mL2dwcm9mLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjA2YjQuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDIwMjggKzAsMCBAQAotXGlucHV0IHRleGluZm8gQGMgLSotdGV4aW5mby0qLQotQHNldGZpbGVuYW1lIGdwcm9mLmluZm8KLUBzZXR0aXRsZSBHTlUgZ3Byb2YKLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLQotQGlmaW5mbwotQGMgVGhpcyBpcyBhIGRpci5pbmZvIGZyYWdtZW50IHRvIHN1cHBvcnQgc2VtaS1hdXRvbWF0ZWQgYWRkaXRpb24gb2YKLUBjIG1hbnVhbHMgdG8gYW4gaW5mbyB0cmVlLiAgem9vQGN5Z251cy5jb20gaXMgZGV2ZWxvcGluZyB0aGlzIGZhY2lsaXR5LgotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogZ3Byb2Y6IChncHJvZikuICAgICAgICAgICAgICAgIFByb2ZpbGluZyB5b3VyIHByb2dyYW0ncyBleGVjdXRpb24KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGdwcm9mIHByb2ZpbGVyIG9mIHRoZSBHTlUgc3lzdGVtLgotCi1Db3B5cmlnaHQgKEMpIDE5ODgsIDE5OTIsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIGlmaW5mbwotCi1AZmluYWxvdXQKLUBzbWFsbGJvb2sKLQotQHRpdGxlcGFnZQotQHRpdGxlIEdOVSBncHJvZgotQHN1YnRpdGxlIFRoZSBAc2N7Z251fSBQcm9maWxlciAKLUBhdXRob3IgSmF5IEZlbmxhc29uIGFuZCBSaWNoYXJkIFN0YWxsbWFuCi0KLUBwYWdlCi0KLVRoaXMgbWFudWFsIGRlc2NyaWJlcyB0aGUgQHNje2dudX0gcHJvZmlsZXIsIEBjb2Rle2dwcm9mfSwgYW5kIGhvdyB5b3UKLWNhbiB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoaWNoIHBhcnRzIG9mIGEgcHJvZ3JhbSBhcmUgdGFraW5nIG1vc3Qgb2YgdGhlCi1leGVjdXRpb24gdGltZS4gIFdlIGFzc3VtZSB0aGF0IHlvdSBrbm93IGhvdyB0byB3cml0ZSwgY29tcGlsZSwgYW5kCi1leGVjdXRlIHByb2dyYW1zLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHdhcyB3cml0dGVuIGJ5IEpheSBGZW5sYXNvbi4KLQotVGhpcyBtYW51YWwgd2FzIGVkaXRlZCBKYW51YXJ5IDE5OTMgYnkgSmVmZnJleSBPc2llcgotYW5kIHVwZGF0ZWQgU2VwdGVtYmVyIDE5OTcgYnkgQnJlbnQgQmFjY2FsYS4KLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTg4LCAxOTkyLCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQotcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyBhcyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi0KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUBub2RlIFRvcAotQHRvcCBQcm9maWxpbmcgYSBQcm9ncmFtOiBXaGVyZSBEb2VzIEl0IFNwZW5kIEl0cyBUaW1lPwotCi1UaGlzIG1hbnVhbCBkZXNjcmliZXMgdGhlIEBzY3tnbnV9IHByb2ZpbGVyLCBAY29kZXtncHJvZn0sIGFuZCBob3cgeW91Ci1jYW4gdXNlIGl0IHRvIGRldGVybWluZSB3aGljaCBwYXJ0cyBvZiBhIHByb2dyYW0gYXJlIHRha2luZyBtb3N0IG9mIHRoZQotZXhlY3V0aW9uIHRpbWUuICBXZSBhc3N1bWUgdGhhdCB5b3Uga25vdyBob3cgdG8gd3JpdGUsIGNvbXBpbGUsIGFuZAotZXhlY3V0ZSBwcm9ncmFtcy4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSB3YXMgd3JpdHRlbiBieSBKYXkgRmVubGFzb24uCi0KLVRoaXMgbWFudWFsIHdhcyB1cGRhdGVkIEF1Z3VzdCAxOTk3IGJ5IEJyZW50IEJhY2NhbGEuCi0KLUBtZW51Ci0qIEludHJvZHVjdGlvbjo6ICAgICAgICBXaGF0IHByb2ZpbGluZyBtZWFucywgYW5kIHdoeSBpdCBpcyB1c2VmdWwuCi0KLSogQ29tcGlsaW5nOjogICAgICAgICAgIEhvdyB0byBjb21waWxlIHlvdXIgcHJvZ3JhbSBmb3IgcHJvZmlsaW5nLgotKiBFeGVjdXRpbmc6OiAgICAgICAgICAgRXhlY3V0aW5nIHlvdXIgcHJvZ3JhbSB0byBnZW5lcmF0ZSBwcm9maWxlIGRhdGEKLSogSW52b2tpbmc6OiAgICAgICAgICAgIEhvdyB0byBydW4gQGNvZGV7Z3Byb2Z9LCBhbmQgaXRzIG9wdGlvbnMKLQotKiBPdXRwdXQ6OgkJSW50ZXJwcmV0aW5nIEBjb2Rle2dwcm9mfSdzIG91dHB1dAotCi0qIEluYWNjdXJhY3k6OiAgICAgICAgICBQb3RlbnRpYWwgcHJvYmxlbXMgeW91IHNob3VsZCBiZSBhd2FyZSBvZgotKiBIb3cgZG8gST86OiAgICAgICAgICAgQW5zd2VycyB0byBjb21tb24gcXVlc3Rpb25zCi0qIEluY29tcGF0aWJpbGl0aWVzOjogICAoYmV0d2VlbiBAc2N7Z251fSBAY29kZXtncHJvZn0gYW5kIFVuaXggQGNvZGV7Z3Byb2Z9LikKLSogRGV0YWlsczo6ICAgICAgICAgICAgIERldGFpbHMgb2YgaG93IHByb2ZpbGluZyBpcyBkb25lCi1AZW5kIG1lbnUKLUBlbmQgaWZpbmZvCi0KLUBub2RlIEludHJvZHVjdGlvbgotQGNoYXB0ZXIgSW50cm9kdWN0aW9uIHRvIFByb2ZpbGluZwotCi1Qcm9maWxpbmcgYWxsb3dzIHlvdSB0byBsZWFybiB3aGVyZSB5b3VyIHByb2dyYW0gc3BlbnQgaXRzIHRpbWUgYW5kIHdoaWNoCi1mdW5jdGlvbnMgY2FsbGVkIHdoaWNoIG90aGVyIGZ1bmN0aW9ucyB3aGlsZSBpdCB3YXMgZXhlY3V0aW5nLiAgVGhpcwotaW5mb3JtYXRpb24gY2FuIHNob3cgeW91IHdoaWNoIHBpZWNlcyBvZiB5b3VyIHByb2dyYW0gYXJlIHNsb3dlciB0aGFuIHlvdQotZXhwZWN0ZWQsIGFuZCBtaWdodCBiZSBjYW5kaWRhdGVzIGZvciByZXdyaXRpbmcgdG8gbWFrZSB5b3VyIHByb2dyYW0KLWV4ZWN1dGUgZmFzdGVyLiAgSXQgY2FuIGFsc28gdGVsbCB5b3Ugd2hpY2ggZnVuY3Rpb25zIGFyZSBiZWluZyBjYWxsZWQgbW9yZQotb3IgbGVzcyBvZnRlbiB0aGFuIHlvdSBleHBlY3RlZC4gIFRoaXMgbWF5IGhlbHAgeW91IHNwb3QgYnVncyB0aGF0IGhhZAotb3RoZXJ3aXNlIGJlZW4gdW5ub3RpY2VkLgotCi1TaW5jZSB0aGUgcHJvZmlsZXIgdXNlcyBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZHVyaW5nIHRoZSBhY3R1YWwgZXhlY3V0aW9uCi1vZiB5b3VyIHByb2dyYW0sIGl0IGNhbiBiZSB1c2VkIG9uIHByb2dyYW1zIHRoYXQgYXJlIHRvbyBsYXJnZSBvciB0b28KLWNvbXBsZXggdG8gYW5hbHl6ZSBieSByZWFkaW5nIHRoZSBzb3VyY2UuICBIb3dldmVyLCBob3cgeW91ciBwcm9ncmFtIGlzIHJ1bgotd2lsbCBhZmZlY3QgdGhlIGluZm9ybWF0aW9uIHRoYXQgc2hvd3MgdXAgaW4gdGhlIHByb2ZpbGUgZGF0YS4gIElmIHlvdQotZG9uJ3QgdXNlIHNvbWUgZmVhdHVyZSBvZiB5b3VyIHByb2dyYW0gd2hpbGUgaXQgaXMgYmVpbmcgcHJvZmlsZWQsIG5vCi1wcm9maWxlIGluZm9ybWF0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB0aGF0IGZlYXR1cmUuCi0KLVByb2ZpbGluZyBoYXMgc2V2ZXJhbCBzdGVwczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVlvdSBtdXN0IGNvbXBpbGUgYW5kIGxpbmsgeW91ciBwcm9ncmFtIHdpdGggcHJvZmlsaW5nIGVuYWJsZWQuCi1AeHJlZntDb21waWxpbmd9LgotCi1AaXRlbQotWW91IG11c3QgZXhlY3V0ZSB5b3VyIHByb2dyYW0gdG8gZ2VuZXJhdGUgYSBwcm9maWxlIGRhdGEgZmlsZS4KLUB4cmVme0V4ZWN1dGluZ30uCi0KLUBpdGVtCi1Zb3UgbXVzdCBydW4gQGNvZGV7Z3Byb2Z9IHRvIGFuYWx5emUgdGhlIHByb2ZpbGUgZGF0YS4KLUB4cmVme0ludm9raW5nfS4KLUBlbmQgaXRlbWl6ZQotCi1UaGUgbmV4dCB0aHJlZSBjaGFwdGVycyBleHBsYWluIHRoZXNlIHN0ZXBzIGluIGdyZWF0ZXIgZGV0YWlsLgotCi1TZXZlcmFsIGZvcm1zIG9mIG91dHB1dCBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIGFuYWx5c2lzLgotCi1UaGUgQGRmbntmbGF0IHByb2ZpbGV9IHNob3dzIGhvdyBtdWNoIHRpbWUgeW91ciBwcm9ncmFtIHNwZW50IGluIGVhY2ggZnVuY3Rpb24sCi1hbmQgaG93IG1hbnkgdGltZXMgdGhhdCBmdW5jdGlvbiB3YXMgY2FsbGVkLiAgSWYgeW91IHNpbXBseSB3YW50IHRvIGtub3cKLXdoaWNoIGZ1bmN0aW9ucyBidXJuIG1vc3Qgb2YgdGhlIGN5Y2xlcywgaXQgaXMgc3RhdGVkIGNvbmNpc2VseSBoZXJlLgotQHhyZWZ7RmxhdCBQcm9maWxlfS4KLQotVGhlIEBkZm57Y2FsbCBncmFwaH0gc2hvd3MsIGZvciBlYWNoIGZ1bmN0aW9uLCB3aGljaCBmdW5jdGlvbnMgY2FsbGVkIGl0LCB3aGljaAotb3RoZXIgZnVuY3Rpb25zIGl0IGNhbGxlZCwgYW5kIGhvdyBtYW55IHRpbWVzLiAgVGhlcmUgaXMgYWxzbyBhbiBlc3RpbWF0ZQotb2YgaG93IG11Y2ggdGltZSB3YXMgc3BlbnQgaW4gdGhlIHN1YnJvdXRpbmVzIG9mIGVhY2ggZnVuY3Rpb24uICBUaGlzIGNhbgotc3VnZ2VzdCBwbGFjZXMgd2hlcmUgeW91IG1pZ2h0IHRyeSB0byBlbGltaW5hdGUgZnVuY3Rpb24gY2FsbHMgdGhhdCB1c2UgYQotbG90IG9mIHRpbWUuICBAeHJlZntDYWxsIEdyYXBofS4KLQotVGhlIEBkZm57YW5ub3RhdGVkIHNvdXJjZX0gbGlzdGluZyBpcyBhIGNvcHkgb2YgdGhlIHByb2dyYW0ncwotc291cmNlIGNvZGUsIGxhYmVsZWQgd2l0aCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbGluZSBvZiB0aGUKLXByb2dyYW0gd2FzIGV4ZWN1dGVkLiAgQHhyZWZ7QW5ub3RhdGVkIFNvdXJjZX0uCi0KLVRvIGJldHRlciB1bmRlcnN0YW5kIGhvdyBwcm9maWxpbmcgd29ya3MsIHlvdSBtYXkgd2lzaCB0byByZWFkCi1hIGRlc2NyaXB0aW9uIG9mIGl0cyBpbXBsZW1lbnRhdGlvbi4KLUB4cmVme0ltcGxlbWVudGF0aW9ufS4KLQotQG5vZGUgQ29tcGlsaW5nCi1AY2hhcHRlciBDb21waWxpbmcgYSBQcm9ncmFtIGZvciBQcm9maWxpbmcKLQotVGhlIGZpcnN0IHN0ZXAgaW4gZ2VuZXJhdGluZyBwcm9maWxlIGluZm9ybWF0aW9uIGZvciB5b3VyIHByb2dyYW0gaXMKLXRvIGNvbXBpbGUgYW5kIGxpbmsgaXQgd2l0aCBwcm9maWxpbmcgZW5hYmxlZC4KLQotVG8gY29tcGlsZSBhIHNvdXJjZSBmaWxlIGZvciBwcm9maWxpbmcsIHNwZWNpZnkgdGhlIEBzYW1wey1wZ30gb3B0aW9uIHdoZW4KLXlvdSBydW4gdGhlIGNvbXBpbGVyLiAgKFRoaXMgaXMgaW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgeW91IG5vcm1hbGx5Ci11c2UuKQotCi1UbyBsaW5rIHRoZSBwcm9ncmFtIGZvciBwcm9maWxpbmcsIGlmIHlvdSB1c2UgYSBjb21waWxlciBzdWNoIGFzIEBjb2Rle2NjfQotdG8gZG8gdGhlIGxpbmtpbmcsIHNpbXBseSBzcGVjaWZ5IEBzYW1wey1wZ30gaW4gYWRkaXRpb24gdG8geW91ciB1c3VhbAotb3B0aW9ucy4gIFRoZSBzYW1lIG9wdGlvbiwgQHNhbXB7LXBnfSwgYWx0ZXJzIGVpdGhlciBjb21waWxhdGlvbiBvciBsaW5raW5nCi10byBkbyB3aGF0IGlzIG5lY2Vzc2FyeSBmb3IgcHJvZmlsaW5nLiAgSGVyZSBhcmUgZXhhbXBsZXM6Ci0KLUBleGFtcGxlCi1jYyAtZyAtYyBteXByb2cuYyB1dGlscy5jIC1wZwotY2MgLW8gbXlwcm9nIG15cHJvZy5vIHV0aWxzLm8gLXBnCi1AZW5kIGV4YW1wbGUKLQotVGhlIEBzYW1wey1wZ30gb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBhIGNvbW1hbmQgdGhhdCBib3RoIGNvbXBpbGVzIGFuZCBsaW5rczoKLQotQGV4YW1wbGUKLWNjIC1vIG15cHJvZyBteXByb2cuYyB1dGlscy5jIC1nIC1wZwotQGVuZCBleGFtcGxlCi0KLUlmIHlvdSBydW4gdGhlIGxpbmtlciBAY29kZXtsZH0gZGlyZWN0bHkgaW5zdGVhZCBvZiB0aHJvdWdoIGEgY29tcGlsZXIKLXN1Y2ggYXMgQGNvZGV7Y2N9LCB5b3UgbWF5IGhhdmUgdG8gc3BlY2lmeSBhIHByb2ZpbGluZyBzdGFydHVwIGZpbGUKLUBmaWxle2djcnQwLm99IGFzIHRoZSBmaXJzdCBpbnB1dCBmaWxlIGluc3RlYWQgb2YgdGhlIHVzdWFsIHN0YXJ0dXAKLWZpbGUgQGZpbGV7Y3J0MC5vfS4gIEluIGFkZGl0aW9uLCB5b3Ugd291bGQgcHJvYmFibHkgd2FudCB0bwotc3BlY2lmeSB0aGUgcHJvZmlsaW5nIEMgbGlicmFyeSwgQGZpbGV7bGliY19wLmF9LCBieSB3cml0aW5nCi1Ac2FtcHstbGNfcH0gaW5zdGVhZCBvZiB0aGUgdXN1YWwgQHNhbXB7LWxjfS4gIFRoaXMgaXMgbm90IGFic29sdXRlbHkKLW5lY2Vzc2FyeSwgYnV0IGRvaW5nIHRoaXMgZ2l2ZXMgeW91IG51bWJlci1vZi1jYWxscyBpbmZvcm1hdGlvbiBmb3IKLXN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zIHN1Y2ggYXMgQGNvZGV7cmVhZH0gYW5kIEBjb2Rle29wZW59LiAgRm9yCi1leGFtcGxlOgotCi1AZXhhbXBsZQotbGQgLW8gbXlwcm9nIC9saWIvZ2NydDAubyBteXByb2cubyB1dGlscy5vIC1sY19wCi1AZW5kIGV4YW1wbGUKLQotSWYgeW91IGNvbXBpbGUgb25seSBzb21lIG9mIHRoZSBtb2R1bGVzIG9mIHRoZSBwcm9ncmFtIHdpdGggQHNhbXB7LXBnfSwgeW91Ci1jYW4gc3RpbGwgcHJvZmlsZSB0aGUgcHJvZ3JhbSwgYnV0IHlvdSB3b24ndCBnZXQgY29tcGxldGUgaW5mb3JtYXRpb24gYWJvdXQKLXRoZSBtb2R1bGVzIHRoYXQgd2VyZSBjb21waWxlZCB3aXRob3V0IEBzYW1wey1wZ30uICBUaGUgb25seSBpbmZvcm1hdGlvbgoteW91IGdldCBmb3IgdGhlIGZ1bmN0aW9ucyBpbiB0aG9zZSBtb2R1bGVzIGlzIHRoZSB0b3RhbCB0aW1lIHNwZW50IGluIHRoZW07Ci10aGVyZSBpcyBubyByZWNvcmQgb2YgaG93IG1hbnkgdGltZXMgdGhleSB3ZXJlIGNhbGxlZCwgb3IgZnJvbSB3aGVyZS4gIFRoaXMKLXdpbGwgbm90IGFmZmVjdCB0aGUgZmxhdCBwcm9maWxlIChleGNlcHQgdGhhdCB0aGUgQGNvZGV7Y2FsbHN9IGZpZWxkIGZvcgotdGhlIGZ1bmN0aW9ucyB3aWxsIGJlIGJsYW5rKSwgYnV0IHdpbGwgZ3JlYXRseSByZWR1Y2UgdGhlIHVzZWZ1bG5lc3Mgb2YgdGhlCi1jYWxsIGdyYXBoLgotCi1JZiB5b3Ugd2lzaCB0byBwZXJmb3JtIGxpbmUtYnktbGluZSBwcm9maWxpbmcsCi15b3Ugd2lsbCBhbHNvIG5lZWQgdG8gc3BlY2lmeSB0aGUgQHNhbXB7LWd9IG9wdGlvbiwKLWluc3RydWN0aW5nIHRoZSBjb21waWxlciB0byBpbnNlcnQgZGVidWdnaW5nIHN5bWJvbHMgaW50byB0aGUgcHJvZ3JhbQotdGhhdCBtYXRjaCBwcm9ncmFtIGFkZHJlc3NlcyB0byBzb3VyY2UgY29kZSBsaW5lcy4KLUB4cmVme0xpbmUtYnktbGluZX0uCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBAc2FtcHstcGd9IGFuZCBAc2FtcHstZ30gb3B0aW9ucywKLXlvdSBtYXkgYWxzbyB3aXNoIHRvIHNwZWNpZnkgdGhlIEBzYW1wey1hfSBvcHRpb24gd2hlbiBjb21waWxpbmcuCi1UaGlzIHdpbGwgaW5zdHJ1bWVudAotdGhlIHByb2dyYW0gdG8gcGVyZm9ybSBiYXNpYy1ibG9jayBjb3VudGluZy4gIEFzIHRoZSBwcm9ncmFtIHJ1bnMsCi1pdCB3aWxsIGNvdW50IGhvdyBtYW55IHRpbWVzIGl0IGV4ZWN1dGVkIGVhY2ggYnJhbmNoIG9mIGVhY2ggQHNhbXB7aWZ9Ci1zdGF0ZW1lbnQsIGVhY2ggaXRlcmF0aW9uIG9mIGVhY2ggQHNhbXB7ZG99IGxvb3AsIGV0Yy4gIFRoaXMgd2lsbAotZW5hYmxlIEBjb2Rle2dwcm9mfSB0byBjb25zdHJ1Y3QgYW4gYW5ub3RhdGVkIHNvdXJjZSBjb2RlCi1saXN0aW5nIHNob3dpbmcgaG93IG1hbnkgdGltZXMgZWFjaCBsaW5lIG9mIGNvZGUgd2FzIGV4ZWN1dGVkLgotCi1Abm9kZSBFeGVjdXRpbmcKLUBjaGFwdGVyIEV4ZWN1dGluZyB0aGUgUHJvZ3JhbQotCi1PbmNlIHRoZSBwcm9ncmFtIGlzIGNvbXBpbGVkIGZvciBwcm9maWxpbmcsIHlvdSBtdXN0IHJ1biBpdCBpbiBvcmRlciB0bwotZ2VuZXJhdGUgdGhlIGluZm9ybWF0aW9uIHRoYXQgQGNvZGV7Z3Byb2Z9IG5lZWRzLiAgU2ltcGx5IHJ1biB0aGUgcHJvZ3JhbQotYXMgdXN1YWwsIHVzaW5nIHRoZSBub3JtYWwgYXJndW1lbnRzLCBmaWxlIG5hbWVzLCBldGMuICBUaGUgcHJvZ3JhbSBzaG91bGQKLXJ1biBub3JtYWxseSwgcHJvZHVjaW5nIHRoZSBzYW1lIG91dHB1dCBhcyB1c3VhbC4gIEl0IHdpbGwsIGhvd2V2ZXIsIHJ1bgotc29tZXdoYXQgc2xvd2VyIHRoYW4gbm9ybWFsIGJlY2F1c2Ugb2YgdGhlIHRpbWUgc3BlbnQgY29sbGVjdGluZyBhbmQgdGhlCi13cml0aW5nIHRoZSBwcm9maWxlIGRhdGEuCi0KLVRoZSB3YXkgeW91IHJ1biB0aGUgcHJvZ3JhbS0tLXRoZSBhcmd1bWVudHMgYW5kIGlucHV0IHRoYXQgeW91IGdpdmUKLWl0LS0tbWF5IGhhdmUgYSBkcmFtYXRpYyBlZmZlY3Qgb24gd2hhdCB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBzaG93cy4gIFRoZQotcHJvZmlsZSBkYXRhIHdpbGwgZGVzY3JpYmUgdGhlIHBhcnRzIG9mIHRoZSBwcm9ncmFtIHRoYXQgd2VyZSBhY3RpdmF0ZWQgZm9yCi10aGUgcGFydGljdWxhciBpbnB1dCB5b3UgdXNlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBmaXJzdCBjb21tYW5kIHlvdSBnaXZlCi10byB5b3VyIHByb2dyYW0gaXMgdG8gcXVpdCwgdGhlIHByb2ZpbGUgZGF0YSB3aWxsIHNob3cgdGhlIHRpbWUgdXNlZCBpbgotaW5pdGlhbGl6YXRpb24gYW5kIGluIGNsZWFudXAsIGJ1dCBub3QgbXVjaCBlbHNlLgotCi1Zb3VyIHByb2dyYW0gd2lsbCB3cml0ZSB0aGUgcHJvZmlsZSBkYXRhIGludG8gYSBmaWxlIGNhbGxlZCBAZmlsZXtnbW9uLm91dH0KLWp1c3QgYmVmb3JlIGV4aXRpbmcuICBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgZmlsZSBjYWxsZWQgQGZpbGV7Z21vbi5vdXR9LAotaXRzIGNvbnRlbnRzIGFyZSBvdmVyd3JpdHRlbi4gIFRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8gdGVsbCB0aGUKLXByb2dyYW0gdG8gd3JpdGUgdGhlIHByb2ZpbGUgZGF0YSB1bmRlciBhIGRpZmZlcmVudCBuYW1lLCBidXQgeW91IGNhbiByZW5hbWUKLXRoZSBmaWxlIGFmdGVyd2FyZCBpZiB5b3UgYXJlIGNvbmNlcm5lZCB0aGF0IGl0IG1heSBiZSBvdmVyd3JpdHRlbi4KLQotSW4gb3JkZXIgdG8gd3JpdGUgdGhlIEBmaWxle2dtb24ub3V0fSBmaWxlIHByb3Blcmx5LCB5b3VyIHByb2dyYW0gbXVzdCBleGl0Ci1ub3JtYWxseTogYnkgcmV0dXJuaW5nIGZyb20gQGNvZGV7bWFpbn0gb3IgYnkgY2FsbGluZyBAY29kZXtleGl0fS4gIENhbGxpbmcKLXRoZSBsb3ctbGV2ZWwgZnVuY3Rpb24gQGNvZGV7X2V4aXR9IGRvZXMgbm90IHdyaXRlIHRoZSBwcm9maWxlIGRhdGEsIGFuZAotbmVpdGhlciBkb2VzIGFibm9ybWFsIHRlcm1pbmF0aW9uIGR1ZSB0byBhbiB1bmhhbmRsZWQgc2lnbmFsLgotCi1UaGUgQGZpbGV7Z21vbi5vdXR9IGZpbGUgaXMgd3JpdHRlbiBpbiB0aGUgcHJvZ3JhbSdzIEBlbXBoe2N1cnJlbnQgd29ya2luZwotZGlyZWN0b3J5fSBhdCB0aGUgdGltZSBpdCBleGl0cy4gIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3VyIHByb2dyYW0gY2FsbHMKLUBjb2Rle2NoZGlyfSwgdGhlIEBmaWxle2dtb24ub3V0fSBmaWxlIHdpbGwgYmUgbGVmdCBpbiB0aGUgbGFzdCBkaXJlY3RvcnkKLXlvdXIgcHJvZ3JhbSBAY29kZXtjaGRpcn0nZCB0by4gIElmIHlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gd3JpdGUgaW4KLXRoaXMgZGlyZWN0b3J5LCB0aGUgZmlsZSBpcyBub3Qgd3JpdHRlbiwgYW5kIHlvdSB3aWxsIGdldCBhbiBlcnJvciBtZXNzYWdlLgotCi1PbGRlciB2ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gcHJvZmlsaW5nIGxpYnJhcnkgbWF5IGFsc28gd3JpdGUgYSBmaWxlCi1jYWxsZWQgQGZpbGV7YmIub3V0fS4gIFRoaXMgZmlsZSwgaWYgcHJlc2VudCwgY29udGFpbnMgYW4gaHVtYW4tcmVhZGFibGUKLWxpc3Rpbmcgb2YgdGhlIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMuICBVbmZvcnR1bmF0ZWx5LCB0aGUKLWFwcGVhcmFuY2Ugb2YgYSBodW1hbi1yZWFkYWJsZSBAZmlsZXtiYi5vdXR9IG1lYW5zIHRoZSBiYXNpYy1ibG9jawotY291bnRzIGRpZG4ndCBnZXQgd3JpdHRlbiBpbnRvIEBmaWxle2dtb24ub3V0fS4KLVRoZSBQZXJsIHNjcmlwdCBAY29kZXtiYmNvbnYucGx9LCBpbmNsdWRlZCB3aXRoIHRoZSBAY29kZXtncHJvZn0KLXNvdXJjZSBkaXN0cmlidXRpb24sIHdpbGwgY29udmVydCBhIEBmaWxle2JiLm91dH0gZmlsZSBpbnRvCi1hIGZvcm1hdCByZWFkYWJsZSBieSBAY29kZXtncHJvZn0uCi0KLUBub2RlIEludm9raW5nCi1AY2hhcHRlciBAY29kZXtncHJvZn0gQ29tbWFuZCBTdW1tYXJ5Ci0KLUFmdGVyIHlvdSBoYXZlIGEgcHJvZmlsZSBkYXRhIGZpbGUgQGZpbGV7Z21vbi5vdXR9LCB5b3UgY2FuIHJ1biBAY29kZXtncHJvZn0KLXRvIGludGVycHJldCB0aGUgaW5mb3JtYXRpb24gaW4gaXQuICBUaGUgQGNvZGV7Z3Byb2Z9IHByb2dyYW0gcHJpbnRzIGEKLWZsYXQgcHJvZmlsZSBhbmQgYSBjYWxsIGdyYXBoIG9uIHN0YW5kYXJkIG91dHB1dC4gIFR5cGljYWxseSB5b3Ugd291bGQKLXJlZGlyZWN0IHRoZSBvdXRwdXQgb2YgQGNvZGV7Z3Byb2Z9IGludG8gYSBmaWxlIHdpdGggQHNhbXB7Pn0uCi0KLVlvdSBydW4gQGNvZGV7Z3Byb2Z9IGxpa2UgdGhpczoKLQotQHNtYWxsZXhhbXBsZQotZ3Byb2YgQHZhcntvcHRpb25zfSBbQHZhcntleGVjdXRhYmxlLWZpbGV9IFtAdmFye3Byb2ZpbGUtZGF0YS1maWxlc31AZG90c3t9XV0gWz4gQHZhcntvdXRmaWxlfV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotSGVyZSBzcXVhcmUtYnJhY2tldHMgaW5kaWNhdGUgb3B0aW9uYWwgYXJndW1lbnRzLgotCi1JZiB5b3Ugb21pdCB0aGUgZXhlY3V0YWJsZSBmaWxlIG5hbWUsIHRoZSBmaWxlIEBmaWxle2Eub3V0fSBpcyB1c2VkLiAgSWYKLXlvdSBnaXZlIG5vIHByb2ZpbGUgZGF0YSBmaWxlIG5hbWUsIHRoZSBmaWxlIEBmaWxle2dtb24ub3V0fSBpcyB1c2VkLiAgSWYKLWFueSBmaWxlIGlzIG5vdCBpbiB0aGUgcHJvcGVyIGZvcm1hdCwgb3IgaWYgdGhlIHByb2ZpbGUgZGF0YSBmaWxlIGRvZXMgbm90Ci1hcHBlYXIgdG8gYmVsb25nIHRvIHRoZSBleGVjdXRhYmxlIGZpbGUsIGFuIGVycm9yIG1lc3NhZ2UgaXMgcHJpbnRlZC4KLQotWW91IGNhbiBnaXZlIG1vcmUgdGhhbiBvbmUgcHJvZmlsZSBkYXRhIGZpbGUgYnkgZW50ZXJpbmcgYWxsIHRoZWlyIG5hbWVzCi1hZnRlciB0aGUgZXhlY3V0YWJsZSBmaWxlIG5hbWU7IHRoZW4gdGhlIHN0YXRpc3RpY3MgaW4gYWxsIHRoZSBkYXRhIGZpbGVzCi1hcmUgc3VtbWVkIHRvZ2V0aGVyLgotCi1UaGUgb3JkZXIgb2YgdGhlc2Ugb3B0aW9ucyBkb2VzIG5vdCBtYXR0ZXIuCi0KLUBtZW51Ci0qIE91dHB1dCBPcHRpb25zOjogICAgICBDb250cm9sbGluZyBAY29kZXtncHJvZn0ncyBvdXRwdXQgc3R5bGUKLSogQW5hbHlzaXMgT3B0aW9uczo6ICAgIENvbnRyb2xsaW5nIGhvdyBAY29kZXtncHJvZn0gYW5hbHlzZXMgaXRzIGRhdGEKLSogTWlzY2VsbGFuZW91cyBPcHRpb25zOjoKLSogRGVwcmljYXRlZCBPcHRpb25zOjogIE9wdGlvbnMgeW91IG5vIGxvbmdlciBuZWVkIHRvIHVzZSwgYnV0IHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBiZWVuIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5Ci0qIFN5bXNwZWNzOjogICAgICAgICAgICBTcGVjaWZ5aW5nIGZ1bmN0aW9ucyB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUKLUBlbmQgbWVudQotCi1Abm9kZSBPdXRwdXQgT3B0aW9ucyxBbmFseXNpcyBPcHRpb25zLCxJbnZva2luZwotQHNlY3Rpb24gT3V0cHV0IE9wdGlvbnMKLQotVGhlc2Ugb3B0aW9ucyBzcGVjaWZ5IHdoaWNoIG9mIHNldmVyYWwgb3V0cHV0IGZvcm1hdHMKLUBjb2Rle2dwcm9mfSBzaG91bGQgcHJvZHVjZS4KLQotTWFueSBvZiB0aGVzZSBvcHRpb25zIHRha2UgYW4gb3B0aW9uYWwgQGRmbntzeW1zcGVjfSB0byBzcGVjaWZ5Ci1mdW5jdGlvbnMgdG8gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQuICBUaGVzZSBvcHRpb25zIGNhbiBiZQotc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB3aXRoIGRpZmZlcmVudCBzeW1zcGVjcywgdG8gaW5jbHVkZQotb3IgZXhjbHVkZSBzZXRzIG9mIHN5bWJvbHMuICBAeHJlZntTeW1zcGVjc30uCi0KLVNwZWNpZnlpbmcgYW55IG9mIHRoZXNlIG9wdGlvbnMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IChAc2FtcHstcCAtcX0pLAotd2hpY2ggcHJpbnRzIGEgZmxhdCBwcm9maWxlIGFuZCBjYWxsIGdyYXBoIGFuYWx5c2lzCi1mb3IgYWxsIGZ1bmN0aW9ucy4KLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1BW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1hbm5vdGF0ZWQtc291cmNlWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1BfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBhbm5vdGF0ZWQgc291cmNlIGNvZGUuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgcHJpbnQgb3V0cHV0IG9ubHkgZm9yIG1hdGNoaW5nIHN5bWJvbHMuCi1AeHJlZntBbm5vdGF0ZWQgU291cmNlfS4KLQotQGl0ZW0gLWIKLUBpdGVteCAtLWJyaWVmCi1JZiB0aGUgQHNhbXB7LWJ9IG9wdGlvbiBpcyBnaXZlbiwgQGNvZGV7Z3Byb2Z9IGRvZXNuJ3QgcHJpbnQgdGhlCi12ZXJib3NlIGJsdXJicyB0aGF0IHRyeSB0byBleHBsYWluIHRoZSBtZWFuaW5nIG9mIGFsbCBvZiB0aGUgZmllbGRzIGluCi10aGUgdGFibGVzLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGludGVuZCB0byBwcmludCBvdXQgdGhlIG91dHB1dCwgb3IKLWFyZSB0aXJlZCBvZiBzZWVpbmcgdGhlIGJsdXJicy4KLQotQGl0ZW0gLUNbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLWV4ZWMtY291bnRzWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1DfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0bwotcHJpbnQgYSB0YWxseSBvZiBmdW5jdGlvbnMgYW5kIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB3YXMgY2FsbGVkLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIHByaW50IHRhbGx5IG9ubHkgZm9yIG1hdGNoaW5nIHN5bWJvbHMuCi0KLUlmIHRoZSBwcm9maWxlIGRhdGEgZmlsZSBjb250YWlucyBiYXNpYy1ibG9jayBjb3VudCByZWNvcmRzLCBzcGVjaWZpbmcKLXRoZSBAc2FtcHstbH0gb3B0aW9uLCBhbG9uZyB3aXRoIEBzYW1wey1DfSwgd2lsbCBjYXVzZSBiYXNpYy1ibG9jawotZXhlY3V0aW9uIGNvdW50cyB0byBiZSB0YWxsaWVkIGFuZCBkaXNwbGF5ZWQuCi0KLUBpdGVtIC1pCi1AaXRlbXggLS1maWxlLWluZm8KLVRoZSBAc2FtcHstaX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gZGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uCi1hYm91dCB0aGUgcHJvZmlsZSBkYXRhIGZpbGUocykgYW5kIHRoZW4gZXhpdC4gIFRoZSBudW1iZXIgb2YgaGlzdG9ncmFtLAotY2FsbCBncmFwaCwgYW5kIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZHMgaXMgZGlzcGxheWVkLgotCi1AaXRlbSAtSSBAdmFye2RpcnN9Ci1AaXRlbXggLS1kaXJlY3RvcnktcGF0aD1AdmFye2RpcnN9Ci1UaGUgQHNhbXB7LUl9IG9wdGlvbiBzcGVjaWZpZXMgYSBsaXN0IG9mIHNlYXJjaCBkaXJlY3RvcmllcyBpbgotd2hpY2ggdG8gZmluZCBzb3VyY2UgZmlsZXMuICBFbnZpcm9ubWVudCB2YXJpYWJsZSBAdmFye0dQUk9GX1BBVEh9Ci1jYW4gYWxzbyBiZSB1c2VkIHRvIGNvbnZlcnkgdGhpcyBpbmZvcm1hdGlvbi4KLVVzZWQgbW9zdGx5IGZvciBhbm5vdGF0ZWQgc291cmNlIG91dHB1dC4KLQotQGl0ZW0gLUpbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLW5vLWFubm90YXRlZC1zb3VyY2VbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LUp9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IG5vdCB0bwotcHJpbnQgYW5ub3RhdGVkIHNvdXJjZSBjb2RlLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIEBjb2Rle2dwcm9mfSBwcmludHMgYW5ub3RhdGVkIHNvdXJjZSwKLWJ1dCBleGNsdWRlcyBtYXRjaGluZyBzeW1ib2xzLgotCi1AaXRlbSAtTAotQGl0ZW14IC0tcHJpbnQtcGF0aAotTm9ybWFsbHksIHNvdXJjZSBmaWxlbmFtZXMgYXJlIHByaW50ZWQgd2l0aCB0aGUgcGF0aAotY29tcG9uZW50IHN1cHByZXNzZWQuICBUaGUgQHNhbXB7LUx9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9Ci10byBwcmludCB0aGUgZnVsbCBwYXRobmFtZSBvZgotc291cmNlIGZpbGVuYW1lcywgd2hpY2ggaXMgZGV0ZXJtaW5lZAotZnJvbSBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGltYWdlIGZpbGUKLWFuZCBpcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlcgotd2FzIGludm9rZWQuCi0KLUBpdGVtIC1wW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1mbGF0LXByb2ZpbGVbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LXB9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGEgZmxhdCBwcm9maWxlLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIHByaW50IGZsYXQgcHJvZmlsZSBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzLgotQHhyZWZ7RmxhdCBQcm9maWxlfS4KLQotQGl0ZW0gLVBbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLW5vLWZsYXQtcHJvZmlsZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstUH0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gc3VwcHJlc3MgcHJpbnRpbmcgYSBmbGF0IHByb2ZpbGUuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgQGNvZGV7Z3Byb2Z9IHByaW50cyBhIGZsYXQgcHJvZmlsZSwKLWJ1dCBleGNsdWRlcyBtYXRjaGluZyBzeW1ib2xzLgotCi1AaXRlbSAtcVtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tZ3JhcGhbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LXF9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IHRoZSBjYWxsIGdyYXBoIGFuYWx5c2lzLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIHByaW50IGNhbGwgZ3JhcGggb25seSBmb3IgbWF0Y2hpbmcgc3ltYm9scwotYW5kIHRoZWlyIGNoaWxkcmVuLgotQHhyZWZ7Q2FsbCBHcmFwaH0uCi0KLUBpdGVtIC1RW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby1ncmFwaFs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstUX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gc3VwcHJlc3MgcHJpbnRpbmcgdGhlCi1jYWxsIGdyYXBoLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIEBjb2Rle2dwcm9mfSBwcmludHMgYSBjYWxsIGdyYXBoLAotYnV0IGV4Y2x1ZGVzIG1hdGNoaW5nIHN5bWJvbHMuCi0KLUBpdGVtIC15Ci1AaXRlbXggLS1zZXBhcmF0ZS1maWxlcwotVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotTm9ybWFsbHksIGdwcm9mIHByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZpbGVzCi10byBzdGFuZGFyZC1vdXRwdXQuICBJZiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsCi1hbm5vdGF0ZWQgc291cmNlIGZvciBhIGZpbGUgbmFtZWQgQGZpbGV7cGF0aC9maWxlbmFtZX0KLWlzIGdlbmVyYXRlZCBpbiB0aGUgZmlsZSBAZmlsZXtmaWxlbmFtZS1hbm59LgotCi1AaXRlbSAtWltAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tZXhlYy1jb3VudHNbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LVp9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IG5vdCB0bwotcHJpbnQgYSB0YWxseSBvZiBmdW5jdGlvbnMgYW5kIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB3YXMgY2FsbGVkLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIHByaW50IHRhbGx5LCBidXQgZXhjbHVkZSBtYXRjaGluZyBzeW1ib2xzLgotCi1AaXRlbSAtLWZ1bmN0aW9uLW9yZGVyaW5nCi1UaGUgQHNhbXB7LS1mdW5jdGlvbi1vcmRlcmluZ30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYQotc3VnZ2VzdGVkIGZ1bmN0aW9uIG9yZGVyaW5nIGZvciB0aGUgcHJvZ3JhbSBiYXNlZCBvbiBwcm9maWxpbmcgZGF0YS4KLVRoaXMgb3B0aW9uIHN1Z2dlc3RzIGFuIG9yZGVyaW5nIHdoaWNoIG1heSBpbXByb3ZlIHBhZ2luZywgdGxiIGFuZAotY2FjaGUgYmVoYXZpb3IgZm9yIHRoZSBwcm9ncmFtIG9uIHN5c3RlbXMgd2hpY2ggc3VwcG9ydCBhcmJpdHJhcnkKLW9yZGVyaW5nIG9mIGZ1bmN0aW9ucyBpbiBhbiBleGVjdXRhYmxlLgotCi1UaGUgZXhhY3QgZGV0YWlscyBvZiBob3cgdG8gZm9yY2UgdGhlIGxpbmtlciB0byBwbGFjZSBmdW5jdGlvbnMKLWluIGEgcGFydGljdWxhciBvcmRlciBpcyBzeXN0ZW0gZGVwZW5kZW50IGFuZCBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoaXMKLW1hbnVhbC4KLQotQGl0ZW0gLS1maWxlLW9yZGVyaW5nIEB2YXJ7bWFwX2ZpbGV9Ci1UaGUgQHNhbXB7LS1maWxlLW9yZGVyaW5nfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBhCi1zdWdnZXN0ZWQgLm8gbGluayBsaW5lIG9yZGVyaW5nIGZvciB0aGUgcHJvZ3JhbSBiYXNlZCBvbiBwcm9maWxpbmcgZGF0YS4KLVRoaXMgb3B0aW9uIHN1Z2dlc3RzIGFuIG9yZGVyaW5nIHdoaWNoIG1heSBpbXByb3ZlIHBhZ2luZywgdGxiIGFuZAotY2FjaGUgYmVoYXZpb3IgZm9yIHRoZSBwcm9ncmFtIG9uIHN5c3RlbXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgYXJiaXRyYXJ5Ci1vcmRlcmluZyBvZiBmdW5jdGlvbnMgaW4gYW4gZXhlY3V0YWJsZS4KLQotVXNlIG9mIHRoZSBAc2FtcHstYX0gYXJndW1lbnQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHdpdGggdGhpcyBvcHRpb24uCi0KLVRoZSBAdmFye21hcF9maWxlfSBhcmd1bWVudCBpcyBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aGljaCBwcm92aWRlcwotZnVuY3Rpb24gbmFtZSB0byBvYmplY3QgZmlsZSBtYXBwaW5ncy4gIFRoZSBmb3JtYXQgb2YgdGhlIGZpbGUgaXMgc2ltaWxhciB0bwotdGhlIG91dHB1dCBvZiB0aGUgcHJvZ3JhbSBAY29kZXtubX0uCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotYy1wYXJzZS5vOjAwMDAwMDAwIFQgeXlwYXJzZQotYy1wYXJzZS5vOjAwMDAwMDA0IEMgeXllcnJmbGFnCi1jLWxhbmcubzowMDAwMDAwMCBUIG1heWJlX29iamNfbWV0aG9kX25hbWUKLWMtbGFuZy5vOjAwMDAwMDAwIFQgcHJpbnRfbGFuZ19zdGF0aXN0aWNzCi1jLWxhbmcubzowMDAwMDAwMCBUIHJlY29nbml6ZV9vYmpjX2tleXdvcmQKLWMtZGVjbC5vOjAwMDAwMDAwIFQgcHJpbnRfbGFuZ19pZGVudGlmaWVyCi1jLWRlY2wubzowMDAwMDAwMCBUIHByaW50X2xhbmdfdHlwZQotQGRvdHN7fQotCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1HTlUgQGNvZGV7bm19IEBzYW1wey0tZXh0ZXJuLW9ubHl9IEBzYW1wey0tZGVmaW5lZC1vbmx5fSBAc2FtcHstdn0gQHNhbXB7LS1wcmludC1maWxlLW5hbWV9IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBAdmFye21hcF9maWxlfS4KLQotQGl0ZW0gLVQKLUBpdGVteCAtLXRyYWRpdGlvbmFsCi1UaGUgQHNhbXB7LVR9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGl0cyBvdXRwdXQgaW4KLWBgdHJhZGl0aW9uYWwnJyBCU0Qgc3R5bGUuCi0KLUBpdGVtIC13IEB2YXJ7d2lkdGh9Ci1AaXRlbXggLS13aWR0aD1AdmFye3dpZHRofQotU2V0cyB3aWR0aCBvZiBvdXRwdXQgbGluZXMgdG8gQHZhcnt3aWR0aH0uCi1DdXJyZW50bHkgb25seSB1c2VkIHdoZW4gcHJpbnRpbmcgdGhlIGZ1bmN0aW9uIGluZGV4IGF0IHRoZSBib3R0b20KLW9mIHRoZSBjYWxsIGdyYXBoLgotCi1AaXRlbSAteAotQGl0ZW14IC0tYWxsLWxpbmVzCi1UaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi1CeSBkZWZhdWx0LCBvbmx5IHRoZSBsaW5lcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgYmFzaWMtYmxvY2sKLWFyZSBhbm5vdGF0ZWQuICBJZiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIGV2ZXJ5IGxpbmUgaW4KLWEgYmFzaWMtYmxvY2sgaXMgYW5ub3RhdGVkIGJ5IHJlcGVhdGluZyB0aGUgYW5ub3RhdGlvbiBmb3IgdGhlCi1maXJzdCBsaW5lLiAgVGhpcyBiZWhhdmlvciBpcyBzaW1pbGFyIHRvIEBjb2Rle3Rjb3Z9J3MgQHNhbXB7LWF9LgotCi1AaXRlbSAtLWRlbWFuZ2xlCi1AaXRlbXggLS1uby1kZW1hbmdsZQotVGhlc2Ugb3B0aW9ucyBjb250cm9sIHdoZXRoZXIgQysrIHN5bWJvbCBuYW1lcyBzaG91bGQgYmUgZGVtYW5nbGVkIHdoZW4KLXByaW50aW5nIG91dHB1dC4gIFRoZSBkZWZhdWx0IGlzIHRvIGRlbWFuZ2xlIHN5bWJvbHMuICBUaGUKLUBjb2Rley0tbm8tZGVtYW5nbGV9IG9wdGlvbiBtYXkgYmUgdXNlZCB0byB0dXJuIG9mZiBkZW1hbmdsaW5nLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIEFuYWx5c2lzIE9wdGlvbnMsTWlzY2VsbGFuZW91cyBPcHRpb25zLE91dHB1dCBPcHRpb25zLEludm9raW5nCi1Ac2VjdGlvbiBBbmFseXNpcyBPcHRpb25zCi0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSAtYQotQGl0ZW14IC0tbm8tc3RhdGljCi1UaGUgQHNhbXB7LWF9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1cHByZXNzIHRoZSBwcmludGluZyBvZgotc3RhdGljYWxseSBkZWNsYXJlZCAocHJpdmF0ZSkgZnVuY3Rpb25zLiAgKFRoZXNlIGFyZSBmdW5jdGlvbnMgd2hvc2UKLW5hbWVzIGFyZSBub3QgbGlzdGVkIGFzIGdsb2JhbCwgYW5kIHdoaWNoIGFyZSBub3QgdmlzaWJsZSBvdXRzaWRlIHRoZQotZmlsZS9mdW5jdGlvbi9ibG9jayB3aGVyZSB0aGV5IHdlcmUgZGVmaW5lZC4pICBUaW1lIHNwZW50IGluIHRoZXNlCi1mdW5jdGlvbnMsIGNhbGxzIHRvL2Zyb20gdGhlbSwgZXRjLCB3aWxsIGFsbCBiZSBhdHRyaWJ1dGVkIHRvIHRoZQotZnVuY3Rpb24gdGhhdCB3YXMgbG9hZGVkIGRpcmVjdGx5IGJlZm9yZSBpdCBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlLgotQGMgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggVW5peCBAY29kZXtncHJvZn0sIGJ1dCBhIGJhZCBpZGVhLiAgCi1UaGlzIG9wdGlvbiBhZmZlY3RzIGJvdGggdGhlIGZsYXQgcHJvZmlsZSBhbmQgdGhlIGNhbGwgZ3JhcGguCi0KLUBpdGVtIC1jCi1AaXRlbXggLS1zdGF0aWMtY2FsbC1ncmFwaAotVGhlIEBzYW1wey1jfSBvcHRpb24gY2F1c2VzIHRoZSBjYWxsIGdyYXBoIG9mIHRoZSBwcm9ncmFtIHRvIGJlCi1hdWdtZW50ZWQgYnkgYSBoZXVyaXN0aWMgd2hpY2ggZXhhbWluZXMgdGhlIHRleHQgc3BhY2Ugb2YgdGhlIG9iamVjdAotZmlsZSBhbmQgaWRlbnRpZmllcyBmdW5jdGlvbiBjYWxscyBpbiB0aGUgYmluYXJ5IG1hY2hpbmUgY29kZS4KLVNpbmNlIG5vcm1hbCBjYWxsIGdyYXBoIHJlY29yZHMgYXJlIG9ubHkgZ2VuZXJhdGVkIHdoZW4gZnVuY3Rpb25zIGFyZQotZW50ZXJlZCwgdGhpcyBvcHRpb24gaWRlbnRpZmllcyBjaGlsZHJlbiB0aGF0IGNvdWxkIGhhdmUgYmVlbiBjYWxsZWQsCi1idXQgbmV2ZXIgd2VyZS4gIENhbGxzIHRvIGZ1bmN0aW9ucyB0aGF0IHdlcmUgbm90IGNvbXBpbGVkIHdpdGgKLXByb2ZpbGluZyBlbmFibGVkIGFyZSBhbHNvIGlkZW50aWZpZWQsIGJ1dCBvbmx5IGlmIHN5bWJvbCB0YWJsZQotZW50cmllcyBhcmUgcHJlc2VudCBmb3IgdGhlbS4KLUNhbGxzIHRvIGR5bmFtaWMgbGlicmFyeSByb3V0aW5lcyBhcmUgdHlwaWNhbGx5IEBlbXBoe25vdH0gZm91bmQKLWJ5IHRoaXMgb3B0aW9uLgotUGFyZW50cyBvciBjaGlsZHJlbiBpZGVudGlmaWVkIHZpYSB0aGlzIGhldXJpc3RpYwotYXJlIGluZGljYXRlZCBpbiB0aGUgY2FsbCBncmFwaCB3aXRoIGNhbGwgY291bnRzIG9mIEBzYW1wezB9LgotCi1AaXRlbSAtRAotQGl0ZW14IC0taWdub3JlLW5vbi1mdW5jdGlvbnMKLVRoZSBAc2FtcHstRH0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gaWdub3JlIHN5bWJvbHMgd2hpY2gKLWFyZSBub3Qga25vd24gdG8gYmUgZnVuY3Rpb25zLiAgVGhpcyBvcHRpb24gd2lsbCBnaXZlIG1vcmUgYWNjdXJhdGUKLXByb2ZpbGUgZGF0YSBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIHN1cHBvcnRlZCAoU29sYXJpcyBhbmQgSFBVWCBmb3IKLWV4YW1wbGUpLgotCi1AaXRlbSAtayBAdmFye2Zyb219L0B2YXJ7dG99Ci1UaGUgQHNhbXB7LWt9IG9wdGlvbiBhbGxvd3MgeW91IHRvIGRlbGV0ZSBmcm9tIHRoZSBjYWxsIGdyYXBoIGFueSBhcmNzIGZyb20KLXN5bWJvbHMgbWF0Y2hpbmcgc3ltc3BlYyBAdmFye2Zyb219IHRvIHRob3NlIG1hdGNoaW5nIHN5bXNwZWMgQHZhcnt0b30uCi0KLUBpdGVtIC1sCi1AaXRlbXggLS1saW5lCi1UaGUgQHNhbXB7LWx9IG9wdGlvbiBlbmFibGVzIGxpbmUtYnktbGluZSBwcm9maWxpbmcsIHdoaWNoIGNhdXNlcwotaGlzdG9ncmFtIGhpdHMgdG8gYmUgY2hhcmdlZCB0byBpbmRpdmlkdWFsIHNvdXJjZSBjb2RlIGxpbmVzLAotaW5zdGVhZCBvZiBmdW5jdGlvbnMuCi1JZiB0aGUgcHJvZ3JhbSB3YXMgY29tcGlsZWQgd2l0aCBiYXNpYy1ibG9jayBjb3VudGluZyBlbmFibGVkLAotdGhpcyBvcHRpb24gd2lsbCBhbHNvIGlkZW50aWZ5IGhvdyBtYW55IHRpbWVzIGVhY2ggbGluZSBvZgotY29kZSB3YXMgZXhlY3V0ZWQuCi1XaGlsZSBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIGNhbiBoZWxwIGlzb2xhdGUgd2hlcmUgaW4gYSBsYXJnZSBmdW5jdGlvbgotYSBwcm9ncmFtIGlzIHNwZW5kaW5nIGl0cyB0aW1lLCBpdCBhbHNvIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzCi10aGUgcnVubmluZyB0aW1lIG9mIEBjb2Rle2dwcm9mfSwgYW5kIG1hZ25pZmllcyBzdGF0aXN0aWNhbAotaW5hY2N1cmFjaWVzLgotQHhyZWZ7U2FtcGxpbmcgRXJyb3J9LgotCi1AaXRlbSAtbSBAdmFye251bX0KLUBpdGVteCAtLW1pbi1jb3VudD1AdmFye251bX0KLVRoaXMgb3B0aW9uIGFmZmVjdHMgZXhlY3V0aW9uIGNvdW50IG91dHB1dCBvbmx5LgotU3ltYm9scyB0aGF0IGFyZSBleGVjdXRlZCBsZXNzIHRoYW4gQHZhcntudW19IHRpbWVzIGFyZSBzdXBwcmVzc2VkLgotCi1AaXRlbSAtbltAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tdGltZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstbn0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0sIGluIGl0cyBjYWxsIGdyYXBoIGFuYWx5c2lzLAotdG8gb25seSBwcm9wYWdhdGUgdGltZXMgZm9yIHN5bWJvbHMgbWF0Y2hpbmcgQHZhcntzeW1zcGVjfS4KLQotQGl0ZW0gLU5bQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLW5vLXRpbWVbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LW59IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9LCBpbiBpdHMgY2FsbCBncmFwaCBhbmFseXNpcywKLW5vdCB0byBwcm9wYWdhdGUgdGltZXMgZm9yIHN5bWJvbHMgbWF0Y2hpbmcgQHZhcntzeW1zcGVjfS4KLQotQGl0ZW0gLXoKLUBpdGVteCAtLWRpc3BsYXktdW51c2VkLWZ1bmN0aW9ucwotSWYgeW91IGdpdmUgdGhlIEBzYW1wey16fSBvcHRpb24sIEBjb2Rle2dwcm9mfSB3aWxsIG1lbnRpb24gYWxsCi1mdW5jdGlvbnMgaW4gdGhlIGZsYXQgcHJvZmlsZSwgZXZlbiB0aG9zZSB0aGF0IHdlcmUgbmV2ZXIgY2FsbGVkLCBhbmQKLXRoYXQgaGFkIG5vIHRpbWUgc3BlbnQgaW4gdGhlbS4gIFRoaXMgaXMgdXNlZnVsIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi1Ac2FtcHstY30gb3B0aW9uIGZvciBkaXNjb3ZlcmluZyB3aGljaCByb3V0aW5lcyB3ZXJlIG5ldmVyIGNhbGxlZC4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBNaXNjZWxsYW5lb3VzIE9wdGlvbnMsRGVwcmljYXRlZCBPcHRpb25zLEFuYWx5c2lzIE9wdGlvbnMsSW52b2tpbmcKLUBzZWN0aW9uIE1pc2NlbGxhbmVvdXMgT3B0aW9ucwotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLWRbQHZhcntudW19XQotQGl0ZW14IC0tZGVidWdbPUB2YXJ7bnVtfV0KLVRoZSBAc2FtcHstZCBAdmFye251bX19IG9wdGlvbiBzcGVjaWZpZXMgZGVidWdnaW5nIG9wdGlvbnMuCi1JZiBAdmFye251bX0gaXMgbm90IHNwZWNpZmllZCwgZW5hYmxlIGFsbCBkZWJ1Z2dpbmcuCi1AeHJlZntEZWJ1Z2dpbmd9LgotCi1AaXRlbSAtT0B2YXJ7bmFtZX0KLUBpdGVteCAtLWZpbGUtZm9ybWF0PUB2YXJ7bmFtZX0KLVNlbGVjdHMgdGhlIGZvcm1hdCBvZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGVzLiAgUmVjb2duaXplZCBmb3JtYXRzIGFyZQotQHNhbXB7YXV0b30gKHRoZSBkZWZhdWx0KSwgQHNhbXB7YnNkfSwgQHNhbXB7NC40YnNkfSwgQHNhbXB7bWFnaWN9LCBhbmQKLUBzYW1we3Byb2Z9IChub3QgeWV0IHN1cHBvcnRlZCkuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1zdW0KLVRoZSBAc2FtcHstc30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gc3VtbWFyaXplIHRoZSBpbmZvcm1hdGlvbgotaW4gdGhlIHByb2ZpbGUgZGF0YSBmaWxlcyBpdCByZWFkIGluLCBhbmQgd3JpdGUgb3V0IGEgcHJvZmlsZSBkYXRhCi1maWxlIGNhbGxlZCBAZmlsZXtnbW9uLnN1bX0sIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gZnJvbQotdGhlIHByb2ZpbGUgZGF0YSBmaWxlcyB0aGF0IEBjb2Rle2dwcm9mfSByZWFkIGluLiAgVGhlIGZpbGUgQGZpbGV7Z21vbi5zdW19Ci1tYXkgYmUgb25lIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgZmlsZXM7IHRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0bwotbWVyZ2UgdGhlIGRhdGEgaW4gdGhlIG90aGVyIGlucHV0IGZpbGVzIGludG8gQGZpbGV7Z21vbi5zdW19LgotCi1FdmVudHVhbGx5IHlvdSBjYW4gcnVuIEBjb2Rle2dwcm9mfSBhZ2FpbiB3aXRob3V0IEBzYW1wey1zfSB0byBhbmFseXplIHRoZQotY3VtdWxhdGl2ZSBkYXRhIGluIHRoZSBmaWxlIEBmaWxle2dtb24uc3VtfS4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcnNpb24KLVRoZSBAc2FtcHstdn0gZmxhZyBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IHRoZSBjdXJyZW50IHZlcnNpb24KLW51bWJlciwgYW5kIHRoZW4gZXhpdC4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBEZXByaWNhdGVkIE9wdGlvbnMsU3ltc3BlY3MsTWlzY2VsbGFuZW91cyBPcHRpb25zLEludm9raW5nCi1Ac2VjdGlvbiBEZXByaWNhdGVkIE9wdGlvbnMKLQotQHRhYmxlIEBjb2RlCi0KLVRoZXNlIG9wdGlvbnMgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggbmV3ZXIgdmVyc2lvbnMgdGhhdCB1c2Ugc3ltc3BlY3MuCi0KLUBpdGVtIC1lIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAc2FtcHstZSBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIHRlbGxzIEBjb2Rle2dwcm9mfSB0byBub3QgcHJpbnQKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBmdW5jdGlvbiBAdmFye2Z1bmN0aW9uX25hbWV9IChhbmQgaXRzCi1jaGlsZHJlbkBkb3Rze30pIGluIHRoZSBjYWxsIGdyYXBoLiAgVGhlIGZ1bmN0aW9uIHdpbGwgc3RpbGwgYmUgbGlzdGVkCi1hcyBhIGNoaWxkIG9mIGFueSBmdW5jdGlvbnMgdGhhdCBjYWxsIGl0LCBidXQgaXRzIGluZGV4IG51bWJlciB3aWxsIGJlCi1zaG93biBhcyBAc2FtcHtbbm90IHByaW50ZWRdfS4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LWV9IG9wdGlvbiBtYXkgYmUKLWdpdmVuOyBvbmx5IG9uZSBAdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoIEBzYW1wey1lfQotb3B0aW9uLiAKLQotQGl0ZW0gLUUgQHZhcntmdW5jdGlvbl9uYW1lfQotVGhlIEBjb2Rley1FIEB2YXJ7ZnVuY3Rpb259fSBvcHRpb24gd29ya3MgbGlrZSB0aGUgQGNvZGV7LWV9IG9wdGlvbiwgYnV0Ci10aW1lIHNwZW50IGluIHRoZSBmdW5jdGlvbiAoYW5kIGNoaWxkcmVuIHdobyB3ZXJlIG5vdCBjYWxsZWQgZnJvbQotYW55d2hlcmUgZWxzZSksIHdpbGwgbm90IGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgcGVyY2VudGFnZXMtb2YtdGltZSBmb3IKLXRoZSBjYWxsIGdyYXBoLiAgTW9yZSB0aGFuIG9uZSBAc2FtcHstRX0gb3B0aW9uIG1heSBiZSBnaXZlbjsgb25seSBvbmUKLUB2YXJ7ZnVuY3Rpb25fbmFtZX0gbWF5IGJlIGluZGljYXRlZCB3aXRoIGVhY2ggQHNhbXB7LUV9IG9wdGlvbi4KLQotQGl0ZW0gLWYgQHZhcntmdW5jdGlvbl9uYW1lfQotVGhlIEBzYW1wey1mIEB2YXJ7ZnVuY3Rpb259fSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBsaW1pdCB0aGUKLWNhbGwgZ3JhcGggdG8gdGhlIGZ1bmN0aW9uIEB2YXJ7ZnVuY3Rpb25fbmFtZX0gYW5kIGl0cyBjaGlsZHJlbiAoYW5kCi10aGVpciBjaGlsZHJlbkBkb3Rze30pLiAgTW9yZSB0aGFuIG9uZSBAc2FtcHstZn0gb3B0aW9uIG1heSBiZSBnaXZlbjsKLW9ubHkgb25lIEB2YXJ7ZnVuY3Rpb25fbmFtZX0gbWF5IGJlIGluZGljYXRlZCB3aXRoIGVhY2ggQHNhbXB7LWZ9Ci1vcHRpb24uICAKLQotQGl0ZW0gLUYgQHZhcntmdW5jdGlvbl9uYW1lfQotVGhlIEBzYW1wey1GIEB2YXJ7ZnVuY3Rpb259fSBvcHRpb24gd29ya3MgbGlrZSB0aGUgQGNvZGV7LWZ9IG9wdGlvbiwgYnV0Ci1vbmx5IHRpbWUgc3BlbnQgaW4gdGhlIGZ1bmN0aW9uIGFuZCBpdHMgY2hpbGRyZW4gKGFuZCB0aGVpcgotY2hpbGRyZW5AZG90c3t9KSB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRvdGFsLXRpbWUgYW5kCi1wZXJjZW50YWdlcy1vZi10aW1lIGZvciB0aGUgY2FsbCBncmFwaC4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LUZ9IG9wdGlvbgotbWF5IGJlIGdpdmVuOyBvbmx5IG9uZSBAdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoCi1Ac2FtcHstRn0gb3B0aW9uLiAgVGhlIEBzYW1wey1GfSBvcHRpb24gb3ZlcnJpZGVzIHRoZSBAc2FtcHstRX0gb3B0aW9uLgotCi1AZW5kIHRhYmxlCi0KLU5vdGUgdGhhdCBvbmx5IG9uZSBmdW5jdGlvbiBjYW4gYmUgc3BlY2lmaWVkIHdpdGggZWFjaCBAY29kZXstZX0sCi1AY29kZXstRX0sIEBjb2Rley1mfSBvciBAY29kZXstRn0gb3B0aW9uLiAgVG8gc3BlY2lmeSBtb3JlIHRoYW4gb25lCi1mdW5jdGlvbiwgdXNlIG11bHRpcGxlIG9wdGlvbnMuICBGb3IgZXhhbXBsZSwgdGhpcyBjb21tYW5kOgotCi1AZXhhbXBsZQotZ3Byb2YgLWUgYm9yaW5nIC1mIGZvbyAtZiBiYXIgbXlwcm9ncmFtID4gZ3Byb2Yub3V0cHV0Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1saXN0cyBpbiB0aGUgY2FsbCBncmFwaCBhbGwgZnVuY3Rpb25zIHRoYXQgd2VyZSByZWFjaGVkIGZyb20gZWl0aGVyCi1AY29kZXtmb299IG9yIEBjb2Rle2Jhcn0gYW5kIHdlcmUgbm90IHJlYWNoYWJsZSBmcm9tIEBjb2Rle2JvcmluZ30uCi0KLUBub2RlIFN5bXNwZWNzLCxEZXByaWNhdGVkIE9wdGlvbnMsSW52b2tpbmcKLUBzZWN0aW9uIFN5bXNwZWNzCi0KLU1hbnkgb2YgdGhlIG91dHB1dCBvcHRpb25zIGFsbG93IGZ1bmN0aW9ucyB0byBiZSBpbmNsdWRlZCBvciBleGNsdWRlZAotdXNpbmcgQGRmbntzeW1zcGVjc30gKHN5bWJvbCBzcGVjaWZpY2F0aW9ucyksIHdoaWNoIG9ic2VydmUgdGhlCi1mb2xsb3dpbmcgc3ludGF4OgotCi1AZXhhbXBsZQotICBmaWxlbmFtZV9jb250YWluaW5nX2FfZG90Ci18IGZ1bmNuYW1lX25vdF9jb250YWluaW5nX2FfZG90Ci18IGxpbmVudW1iZXIKLXwgKCBbIGFueV9maWxlbmFtZSBdIGA6JyAoIGFueV9mdW5jbmFtZSB8IGxpbmVudW1iZXIgKSApCi1AZW5kIGV4YW1wbGUKLQotSGVyZSBhcmUgc29tZSBzYW1wbGUgc3ltc3BlY3M6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gbWFpbi5jCi1TZWxlY3RzIGV2ZXJ5dGhpbmcgaW4gZmlsZSBAZmlsZXttYWluLmN9LS0tdGhlCi1kb3QgaW4gdGhlIHN0cmluZyB0ZWxscyBncHJvZiB0byBpbnRlcnByZXQKLXRoZSBzdHJpbmcgYXMgYSBmaWxlbmFtZSwgcmF0aGVyIHRoYW4gYXMKLWEgZnVuY3Rpb24gbmFtZS4gIFRvIHNlbGVjdCBhIGZpbGUgd2hvc2UKLW5hbWUgZG9lcyBub3QgY29udGFpbiBhIGRvdCwgYSB0cmFpbGluZyBjb2xvbgotc2hvdWxkIGJlIHNwZWNpZmllZC4gIEZvciBleGFtcGxlLCBAc2FtcHtvZGQ6fSBpcwotaW50ZXJwcmV0ZWQgYXMgdGhlIGZpbGUgbmFtZWQgQGZpbGV7b2RkfS4KLQotQGl0ZW0gbWFpbgotU2VsZWN0cyBhbGwgZnVuY3Rpb25zIG5hbWVkIEBzYW1we21haW59LgotCi1Ob3RlIHRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBmdW5jdGlvbiBuYW1lCi1iZWNhdXNlIHNvbWUgb2YgdGhlIGRlZmluaXRpb25zIG1heSBiZSBsb2NhbCAoaS5lLiwgc3RhdGljKS4gIFVubGVzcyBhCi1mdW5jdGlvbiBuYW1lIGlzIHVuaXF1ZSBpbiBhIHByb2dyYW0sIHlvdSBtdXN0IHVzZSB0aGUgY29sb24gbm90YXRpb24KLWV4cGxhaW5lZCBiZWxvdyB0byBzcGVjaWZ5IGEgZnVuY3Rpb24gZnJvbSBhIHNwZWNpZmljIHNvdXJjZSBmaWxlLgotCi1Tb21ldGltZXMsIGZ1bmN0aW9uIG5hbWVzIGNvbnRhaW4gZG90cy4gIEluIHN1Y2ggY2FzZXMsIGl0IGlzIG5lY2Vzc2FyeQotdG8gYWRkIGEgbGVhZGluZyBjb2xvbiB0byB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCBAc2FtcHs6Lm11bH0gc2VsZWN0cwotZnVuY3Rpb24gQHNhbXB7Lm11bH0uCi0KLUluIHNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cywgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgZ3Byb2YKLXdpbGwgbm9ybWFsbHkgbm90IHByaW50IHRoZXNlIHVuZGVyc2NvcmVzLiAgSG93ZXZlciwgeW91IG11c3QgdXNlIHRoZQotdW5kZXJzY29yZSB3aGVuIHlvdSBuYW1lIGEgc3ltYm9sIGluIGEgc3ltc3BlYy4gIFlvdSBjYW4gdXNlIHRoZQotQGNvZGV7bm19IHByb2dyYW0gdG8gc2VlIHdoZXRoZXIgc3ltYm9scyBoYXZlIHVuZGVyc2NvcmVzIGZvciB0aGUgb2JqZWN0Ci1maWxlIGZvcm1hdCB5b3UgYXJlIHVzaW5nLgotCi1AaXRlbSBtYWluLmM6bWFpbgotU2VsZWN0cyBmdW5jdGlvbiBAc2FtcHttYWlufSBpbiBmaWxlIEBmaWxle21haW4uY30uCi0KLUBpdGVtIG1haW4uYzoxMzQKLVNlbGVjdHMgbGluZSAxMzQgaW4gZmlsZSBAZmlsZXttYWluLmN9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBPdXRwdXQKLUBjaGFwdGVyIEludGVycHJldGluZyBAY29kZXtncHJvZn0ncyBPdXRwdXQKLQotQGNvZGV7Z3Byb2Z9IGNhbiBwcm9kdWNlIHNldmVyYWwgZGlmZmVyZW50IG91dHB1dCBzdHlsZXMsIHRoZQotbW9zdCBpbXBvcnRhbnQgb2Ygd2hpY2ggYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFRoZSBzaW1wbGVzdCBvdXRwdXQKLXN0eWxlcyAoZmlsZSBpbmZvcm1hdGlvbiwgZXhlY3V0aW9uIGNvdW50LCBhbmQgZnVuY3Rpb24gYW5kIGZpbGUgb3JkZXJpbmcpCi1hcmUgbm90IGRlc2NyaWJlZCBoZXJlLCBidXQgYXJlIGRvY3VtZW50ZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBvcHRpb25zCi10aGF0IHRyaWdnZXIgdGhlbS4KLUB4cmVme091dHB1dCBPcHRpb25zfS4KLQotQG1lbnUKLSogRmxhdCBQcm9maWxlOjogICAgICAgIFRoZSBmbGF0IHByb2ZpbGUgc2hvd3MgaG93IG11Y2ggdGltZSB3YXMgc3BlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmcgZGlyZWN0bHkgaW4gZWFjaCBmdW5jdGlvbi4KLSogQ2FsbCBHcmFwaDo6ICAgICAgICAgIFRoZSBjYWxsIGdyYXBoIHNob3dzIHdoaWNoIGZ1bmN0aW9ucyBjYWxsZWQgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcnMsIGFuZCBob3cgbXVjaCB0aW1lIGVhY2ggZnVuY3Rpb24gdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gaXRzIHN1YnJvdXRpbmUgY2FsbHMgYXJlIGluY2x1ZGVkLgotKiBMaW5lLWJ5LWxpbmU6OiAgICAgICAgQGNvZGV7Z3Byb2Z9IGNhbiBhbmFseXplIGluZGl2aWR1YWwgc291cmNlIGNvZGUgbGluZXMKLSogQW5ub3RhdGVkIFNvdXJjZTo6ICAgIFRoZSBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcgZGlzcGxheXMgc291cmNlIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGVkIHdpdGggZXhlY3V0aW9uIGNvdW50cwotQGVuZCBtZW51Ci0KLQotQG5vZGUgRmxhdCBQcm9maWxlLENhbGwgR3JhcGgsLE91dHB1dAotQHNlY3Rpb24gVGhlIEZsYXQgUHJvZmlsZQotQGNpbmRleCBmbGF0IHByb2ZpbGUKLQotVGhlIEBkZm57ZmxhdCBwcm9maWxlfSBzaG93cyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgeW91ciBwcm9ncmFtCi1zcGVudCBleGVjdXRpbmcgZWFjaCBmdW5jdGlvbi4gIFVubGVzcyB0aGUgQHNhbXB7LXp9IG9wdGlvbiBpcyBnaXZlbiwKLWZ1bmN0aW9ucyB3aXRoIG5vIGFwcGFyZW50IHRpbWUgc3BlbnQgaW4gdGhlbSwgYW5kIG5vIGFwcGFyZW50IGNhbGxzCi10byB0aGVtLCBhcmUgbm90IG1lbnRpb25lZC4gIE5vdGUgdGhhdCBpZiBhIGZ1bmN0aW9uIHdhcyBub3QgY29tcGlsZWQKLWZvciBwcm9maWxpbmcsIGFuZCBkaWRuJ3QgcnVuIGxvbmcgZW5vdWdoIHRvIHNob3cgdXAgb24gdGhlIHByb2dyYW0KLWNvdW50ZXIgaGlzdG9ncmFtLCBpdCB3aWxsIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmdW5jdGlvbiB0aGF0Ci13YXMgbmV2ZXIgY2FsbGVkLgotCi1UaGlzIGlzIHBhcnQgb2YgYSBmbGF0IHByb2ZpbGUgZm9yIGEgc21hbGwgcHJvZ3JhbToKLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1GbGF0IHByb2ZpbGU6Ci0KLUVhY2ggc2FtcGxlIGNvdW50cyBhcyAwLjAxIHNlY29uZHMuCi0gICUgICBjdW11bGF0aXZlICAgc2VsZiAgICAgICAgICAgICAgc2VsZiAgICAgdG90YWwgICAgICAgICAgIAotIHRpbWUgICBzZWNvbmRzICAgc2Vjb25kcyAgICBjYWxscyAgbXMvY2FsbCAgbXMvY2FsbCAgbmFtZSAgICAKLSAzMy4zNCAgICAgIDAuMDIgICAgIDAuMDIgICAgIDcyMDggICAgIDAuMDAgICAgIDAuMDAgIG9wZW4KLSAxNi42NyAgICAgIDAuMDMgICAgIDAuMDEgICAgICAyNDQgICAgIDAuMDQgICAgIDAuMTIgIG9mZnRpbWUKLSAxNi42NyAgICAgIDAuMDQgICAgIDAuMDEgICAgICAgIDggICAgIDEuMjUgICAgIDEuMjUgIG1lbWNjcHkKLSAxNi42NyAgICAgIDAuMDUgICAgIDAuMDEgICAgICAgIDcgICAgIDEuNDMgICAgIDEuNDMgIHdyaXRlCi0gMTYuNjcgICAgICAwLjA2ICAgICAwLjAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY291bnQKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAyMzYgICAgIDAuMDAgICAgIDAuMDAgIHR6c2V0Ci0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgMTkyICAgICAwLjAwICAgICAwLjAwICB0b2xvd2VyCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgIDQ3ICAgICAwLjAwICAgICAwLjAwICBzdHJsZW4KLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgNDUgICAgIDAuMDAgICAgIDAuMDAgIHN0cmNocgotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICA1MC4wMCAgbWFpbgotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICAgMC4wMCAgbWVtY3B5Ci0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgIDEwLjExICBwcmludAotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICAgMC4wMCAgcHJvZmlsCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgIDUwLjAwICByZXBvcnQKLUBkb3Rze30KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhlIGZ1bmN0aW9ucyBhcmUgc29ydGVkIGJ5IGZpcnN0IGJ5IGRlY3JlYXNpbmcgcnVuLXRpbWUgc3BlbnQgaW4gdGhlbSwKLXRoZW4gYnkgZGVjcmVhc2luZyBudW1iZXIgb2YgY2FsbHMsIHRoZW4gYWxwaGFiZXRpY2FsbHkgYnkgbmFtZS4gIFRoZQotZnVuY3Rpb25zIEBzYW1we21jb3VudH0gYW5kIEBzYW1we3Byb2ZpbH0gYXJlIHBhcnQgb2YgdGhlIHByb2ZpbGluZwotYXBhcmF0dXMgYW5kIGFwcGVhciBpbiBldmVyeSBmbGF0IHByb2ZpbGU7IHRoZWlyIHRpbWUgZ2l2ZXMgYSBtZWFzdXJlIG9mCi10aGUgYW1vdW50IG9mIG92ZXJoZWFkIGR1ZSB0byBwcm9maWxpbmcuCi0KLUp1c3QgYmVmb3JlIHRoZSBjb2x1bW4gaGVhZGVycywgYSBzdGF0ZW1lbnQgYXBwZWFycyBpbmRpY2F0aW5nCi1ob3cgbXVjaCB0aW1lIGVhY2ggc2FtcGxlIGNvdW50ZWQgYXMuCi1UaGlzIEBkZm57c2FtcGxpbmcgcGVyaW9kfSBlc3RpbWF0ZXMgdGhlIG1hcmdpbiBvZiBlcnJvciBpbiBlYWNoIG9mIHRoZSB0aW1lCi1maWd1cmVzLiAgQSB0aW1lIGZpZ3VyZSB0aGF0IGlzIG5vdCBtdWNoIGxhcmdlciB0aGFuIHRoaXMgaXMgbm90Ci1yZWxpYWJsZS4gIEluIHRoaXMgZXhhbXBsZSwgZWFjaCBzYW1wbGUgY291bnRlZCBhcyAwLjAxIHNlY29uZHMsCi1zdWdnZXN0aW5nIGEgMTAwIEh6IHNhbXBsaW5nIHJhdGUuCi1UaGUgcHJvZ3JhbSdzIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIHdhcyAwLjA2Ci1zZWNvbmRzLCBhcyBpbmRpY2F0ZWQgYnkgdGhlIEBzYW1we2N1bXVsYXRpdmUgc2Vjb25kc30gZmllbGQuICBTaW5jZQotZWFjaCBzYW1wbGUgY291bnRlZCBmb3IgMC4wMSBzZWNvbmRzLCB0aGlzIG1lYW5zIG9ubHkgc2l4IHNhbXBsZXMKLXdlcmUgdGFrZW4gZHVyaW5nIHRoZSBydW4uICBUd28gb2YgdGhlIHNhbXBsZXMgb2NjdXJlZCB3aGlsZSB0aGUKLXByb2dyYW0gd2FzIGluIHRoZSBAc2FtcHtvcGVufSBmdW5jdGlvbiwgYXMgaW5kaWNhdGVkIGJ5IHRoZQotQHNhbXB7c2VsZiBzZWNvbmRzfSBmaWVsZC4gIEVhY2ggb2YgdGhlIG90aGVyIGZvdXIgc2FtcGxlcwotb2NjdXJlZCBvbmUgZWFjaCBpbiBAc2FtcHtvZmZ0aW1lfSwgQHNhbXB7bWVtY2NweX0sIEBzYW1we3dyaXRlfSwKLWFuZCBAc2FtcHttY291bnR9LgotU2luY2Ugb25seSBzaXggc2FtcGxlcyB3ZXJlIHRha2VuLCBub25lIG9mIHRoZXNlIHZhbHVlcyBjYW4KLWJlIHJlZ2FyZGVkIGFzIHBhcnRpY3VsYXJseSByZWxpYWJsZS4KLUluIGFub3RoZXIgcnVuLAotdGhlIEBzYW1we3NlbGYgc2Vjb25kc30gZmllbGQgZm9yCi1Ac2FtcHttY291bnR9IG1pZ2h0IHdlbGwgYmUgQHNhbXB7MC4wMH0gb3IgQHNhbXB7MC4wMn0uCi1AeHJlZntTYW1wbGluZyBFcnJvcn0sIGZvciBhIGNvbXBsZXRlIGRpc2N1c3Npb24uCi0KLVRoZSByZW1haW5pbmcgZnVuY3Rpb25zIGluIHRoZSBsaXN0aW5nICh0aG9zZSB3aG9zZQotQHNhbXB7c2VsZiBzZWNvbmRzfSBmaWVsZCBpcyBAc2FtcHswLjAwfSkgZGlkbid0IGFwcGVhcgotaW4gdGhlIGhpc3RvZ3JhbSBzYW1wbGVzIGF0IGFsbC4gIEhvd2V2ZXIsIHRoZSBjYWxsIGdyYXBoCi1pbmRpY2F0ZWQgdGhhdCB0aGV5IHdlcmUgY2FsbGVkLCBzbyB0aGVyZWZvcmUgdGhleSBhcmUgbGlzdGVkLAotc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIgYnkgdGhlIEBzYW1we2NhbGxzfSBmaWVsZC4KLUNsZWFybHkgc29tZSB0aW1lIHdhcyBzcGVudCBleGVjdXRpbmcgdGhlc2UgZnVuY3Rpb25zLAotYnV0IHRoZSBwYXVjaXR5IG9mIGhpc3RvZ3JhbSBzYW1wbGVzIHByZXZlbnRzIGFueQotZGV0ZXJtaW5hdGlvbiBvZiBob3cgbXVjaCB0aW1lIGVhY2ggdG9vay4KLQotSGVyZSBpcyB3aGF0IHRoZSBmaWVsZHMgaW4gZWFjaCBsaW5lIG1lYW46Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gJSB0aW1lCi1UaGlzIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZSB5b3VyIHByb2dyYW0gc3BlbnQKLWluIHRoaXMgZnVuY3Rpb24uICBUaGVzZSBzaG91bGQgYWxsIGFkZCB1cCB0byAxMDAlLgotCi1AaXRlbSBjdW11bGF0aXZlIHNlY29uZHMKLVRoaXMgaXMgdGhlIGN1bXVsYXRpdmUgdG90YWwgbnVtYmVyIG9mIHNlY29uZHMgdGhlIGNvbXB1dGVyIHNwZW50Ci1leGVjdXRpbmcgdGhpcyBmdW5jdGlvbnMsIHBsdXMgdGhlIHRpbWUgc3BlbnQgaW4gYWxsIHRoZSBmdW5jdGlvbnMKLWFib3ZlIHRoaXMgb25lIGluIHRoaXMgdGFibGUuCi0KLUBpdGVtIHNlbGYgc2Vjb25kcwotVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYWNjb3VudGVkIGZvciBieSB0aGlzIGZ1bmN0aW9uIGFsb25lLgotVGhlIGZsYXQgcHJvZmlsZSBsaXN0aW5nIGlzIHNvcnRlZCBmaXJzdCBieSB0aGlzIG51bWJlci4KLQotQGl0ZW0gY2FsbHMKLVRoaXMgaXMgdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4gIElmIHRoZQotZnVuY3Rpb24gd2FzIG5ldmVyIGNhbGxlZCwgb3IgdGhlIG51bWJlciBvZiB0aW1lcyBpdCB3YXMgY2FsbGVkIGNhbm5vdAotYmUgZGV0ZXJtaW5lZCAocHJvYmFibHkgYmVjYXVzZSB0aGUgZnVuY3Rpb24gd2FzIG5vdCBjb21waWxlZCB3aXRoCi1wcm9maWxpbmcgZW5hYmxlZCksIHRoZSBAZGZue2NhbGxzfSBmaWVsZCBpcyBibGFuay4KLQotQGl0ZW0gc2VsZiBtcy9jYWxsCi1UaGlzIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1mdW5jdGlvbiBwZXIgY2FsbCwgaWYgdGhpcyBmdW5jdGlvbiBpcyBwcm9maWxlZC4gIE90aGVyd2lzZSwgdGhpcyBmaWVsZAotaXMgYmxhbmsgZm9yIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIHRvdGFsIG1zL2NhbGwKLVRoaXMgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKLWZ1bmN0aW9uIGFuZCBpdHMgZGVzY2VuZGFudHMgcGVyIGNhbGwsIGlmIHRoaXMgZnVuY3Rpb24gaXMgcHJvZmlsZWQuCi1PdGhlcndpc2UsIHRoaXMgZmllbGQgaXMgYmxhbmsgZm9yIHRoaXMgZnVuY3Rpb24uCi1UaGlzIGlzIHRoZSBvbmx5IGZpZWxkIGluIHRoZSBmbGF0IHByb2ZpbGUgdGhhdCB1c2VzIGNhbGwgZ3JhcGggYW5hbHlzaXMuCi0KLUBpdGVtIG5hbWUKLVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgIFRoZSBmbGF0IHByb2ZpbGUgaXMgc29ydGVkIGJ5IHRoaXMKLWZpZWxkIGFscGhhYmV0aWNhbGx5IGFmdGVyIHRoZSBAZGZue3NlbGYgc2Vjb25kc30gYW5kIEBkZm57Y2FsbHN9Ci1maWVsZHMgYXJlIHNvcnRlZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgQ2FsbCBHcmFwaCxMaW5lLWJ5LWxpbmUsRmxhdCBQcm9maWxlLE91dHB1dAotQHNlY3Rpb24gVGhlIENhbGwgR3JhcGgKLUBjaW5kZXggY2FsbCBncmFwaAotCi1UaGUgQGRmbntjYWxsIGdyYXBofSBzaG93cyBob3cgbXVjaCB0aW1lIHdhcyBzcGVudCBpbiBlYWNoIGZ1bmN0aW9uCi1hbmQgaXRzIGNoaWxkcmVuLiAgRnJvbSB0aGlzIGluZm9ybWF0aW9uLCB5b3UgY2FuIGZpbmQgZnVuY3Rpb25zIHRoYXQsCi13aGlsZSB0aGV5IHRoZW1zZWx2ZXMgbWF5IG5vdCBoYXZlIHVzZWQgbXVjaCB0aW1lLCBjYWxsZWQgb3RoZXIKLWZ1bmN0aW9ucyB0aGF0IGRpZCB1c2UgdW51c3VhbCBhbW91bnRzIG9mIHRpbWUuCi0KLUhlcmUgaXMgYSBzYW1wbGUgY2FsbCBmcm9tIGEgc21hbGwgcHJvZ3JhbS4gIFRoaXMgY2FsbCBjYW1lIGZyb20gdGhlCi1zYW1lIEBjb2Rle2dwcm9mfSBydW4gYXMgdGhlIGZsYXQgcHJvZmlsZSBleGFtcGxlIGluIHRoZSBwcmV2aW91cwotY2hhcHRlci4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1ncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyAyIGJ5dGUocykgZm9yIDIwLjAwJSBvZiAwLjA1IHNlY29uZHMKLQotaW5kZXggJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcG9udGFuZW91cz4KLVsxXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgICAgICAgICAgIHN0YXJ0IFsxXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMiAgICAgICAgICAgb25fZXhpdCBbMjhdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMSAgICAgICAgICAgZXhpdCBbNTldCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIHN0YXJ0IFsxXQotWzJdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICByZXBvcnQgWzNdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIG1haW4gWzJdCi1bM10gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICByZXBvcnQgWzNdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAzICAgICAgIDgvOCAgICAgICAgICAgdGltZWxvY2FsIFs2XQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMSAgICAgICAxLzEgICAgICAgICAgIHByaW50IFs5XQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMSAgICAgICA5LzkgICAgICAgICAgIGZnZXRzIFsxMl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAxMi8zNCAgICAgICAgICBzdHJuY21wIDxjeWNsZSAxPiBbNDBdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDgvOCAgICAgICAgICAgbG9va3VwIFsyMF0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xICAgICAgICAgICBmb3BlbiBbMjFdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDgvOCAgICAgICAgICAgY2hld3RpbWUgWzI0XQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA4LzE2ICAgICAgICAgIHNraXBzcGFjZSBbNDRdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWzRdICAgICA1OS44ICAgIDAuMDEgICAgICAgIDAuMDIgICAgICAgOCs0NzIgICAgIDxjeWNsZSAyIGFzIGEgd2hvbGU+CVs0XQotICAgICAgICAgICAgICAgIDAuMDEgICAgICAgIDAuMDIgICAgIDI0NCsyNjAgICAgICAgICBvZmZ0aW1lIDxjeWNsZSAyPiBbN10KLSAgICAgICAgICAgICAgICAwLjAwICAgICAgICAwLjAwICAgICAyMzYrMSAgICAgICAgICAgdHpzZXQgPGN5Y2xlIDI+IFsyNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgbGluZXMgZnVsbCBvZiBkYXNoZXMgZGl2aWRlIHRoaXMgdGFibGUgaW50byBAZGZue2VudHJpZXN9LCBvbmUgZm9yIGVhY2gKLWZ1bmN0aW9uLiAgRWFjaCBlbnRyeSBoYXMgb25lIG9yIG1vcmUgbGluZXMuCi0KLUluIGVhY2ggZW50cnksIHRoZSBwcmltYXJ5IGxpbmUgaXMgdGhlIG9uZSB0aGF0IHN0YXJ0cyB3aXRoIGFuIGluZGV4IG51bWJlcgotaW4gc3F1YXJlIGJyYWNrZXRzLiAgVGhlIGVuZCBvZiB0aGlzIGxpbmUgc2F5cyB3aGljaCBmdW5jdGlvbiB0aGUgZW50cnkgaXMKLWZvci4gIFRoZSBwcmVjZWRpbmcgbGluZXMgaW4gdGhlIGVudHJ5IGRlc2NyaWJlIHRoZSBjYWxsZXJzIG9mIHRoaXMKLWZ1bmN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGxpbmVzIGRlc2NyaWJlIGl0cyBzdWJyb3V0aW5lcyAoYWxzbyBjYWxsZWQKLUBkZm57Y2hpbGRyZW59IHdoZW4gd2Ugc3BlYWsgb2YgdGhlIGNhbGwgZ3JhcGgpLgotCi1UaGUgZW50cmllcyBhcmUgc29ydGVkIGJ5IHRpbWUgc3BlbnQgaW4gdGhlIGZ1bmN0aW9uIGFuZCBpdHMgc3Vicm91dGluZXMuCi0KLVRoZSBpbnRlcm5hbCBwcm9maWxpbmcgZnVuY3Rpb24gQGNvZGV7bWNvdW50fSAoQHB4cmVme0ZsYXQgUHJvZmlsZX0pCi1pcyBuZXZlciBtZW50aW9uZWQgaW4gdGhlIGNhbGwgZ3JhcGguCi0KLUBtZW51Ci0qIFByaW1hcnk6OiAgICAgICBEZXRhaWxzIG9mIHRoZSBwcmltYXJ5IGxpbmUncyBjb250ZW50cy4KLSogQ2FsbGVyczo6ICAgICAgIERldGFpbHMgb2YgY2FsbGVyLWxpbmVzJyBjb250ZW50cy4KLSogU3Vicm91dGluZXM6OiAgIERldGFpbHMgb2Ygc3Vicm91dGluZS1saW5lcycgY29udGVudHMuCi0qIEN5Y2xlczo6ICAgICAgICBXaGVuIHRoZXJlIGFyZSBjeWNsZXMgb2YgcmVjdXJzaW9uLAotICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgQGNvZGV7YX0gY2FsbHMgQGNvZGV7Yn0gY2FsbHMgQGNvZGV7YX1AZG90c3t9Ci1AZW5kIG1lbnUKLQotQG5vZGUgUHJpbWFyeQotQHN1YnNlY3Rpb24gVGhlIFByaW1hcnkgTGluZQotCi1UaGUgQGRmbntwcmltYXJ5IGxpbmV9IGluIGEgY2FsbCBncmFwaCBlbnRyeSBpcyB0aGUgbGluZSB0aGF0Ci1kZXNjcmliZXMgdGhlIGZ1bmN0aW9uIHdoaWNoIHRoZSBlbnRyeSBpcyBhYm91dCBhbmQgZ2l2ZXMgdGhlIG92ZXJhbGwKLXN0YXRpc3RpY3MgZm9yIHRoaXMgZnVuY3Rpb24uCi0KLUZvciByZWZlcmVuY2UsIHdlIHJlcGVhdCB0aGUgcHJpbWFyeSBsaW5lIGZyb20gdGhlIGVudHJ5IGZvciBmdW5jdGlvbgotQGNvZGV7cmVwb3J0fSBpbiBvdXIgbWFpbiBleGFtcGxlLCB0b2dldGhlciB3aXRoIHRoZSBoZWFkaW5nIGxpbmUgdGhhdAotc2hvd3MgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHM6Ci0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLUBkb3Rze30KLVszXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIHJlcG9ydCBbM10KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUhlcmUgaXMgd2hhdCB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGxpbmUgbWVhbjoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBpbmRleAotRW50cmllcyBhcmUgbnVtYmVyZWQgd2l0aCBjb25zZWN1dGl2ZSBpbnRlZ2Vycy4gIEVhY2ggZnVuY3Rpb24KLXRoZXJlZm9yZSBoYXMgYW4gaW5kZXggbnVtYmVyLCB3aGljaCBhcHBlYXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzCi1wcmltYXJ5IGxpbmUuCi0KLUVhY2ggY3Jvc3MtcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24sIGFzIGEgY2FsbGVyIG9yIHN1YnJvdXRpbmUgb2YKLWFub3RoZXIsIGdpdmVzIGl0cyBpbmRleCBudW1iZXIgYXMgd2VsbCBhcyBpdHMgbmFtZS4gIFRoZSBpbmRleCBudW1iZXIKLWd1aWRlcyB5b3UgaWYgeW91IHdpc2ggdG8gbG9vayBmb3IgdGhlIGVudHJ5IGZvciB0aGF0IGZ1bmN0aW9uLgotCi1AaXRlbSAlIHRpbWUKLVRoaXMgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHRpbWUgdGhhdCB3YXMgc3BlbnQgaW4gdGhpcwotZnVuY3Rpb24sIGluY2x1ZGluZyB0aW1lIHNwZW50IGluIHN1YnJvdXRpbmVzIGNhbGxlZCBmcm9tIHRoaXMKLWZ1bmN0aW9uLgotCi1UaGUgdGltZSBzcGVudCBpbiB0aGlzIGZ1bmN0aW9uIGlzIGNvdW50ZWQgYWdhaW4gZm9yIHRoZSBjYWxsZXJzIG9mCi10aGlzIGZ1bmN0aW9uLiAgVGhlcmVmb3JlLCBhZGRpbmcgdXAgdGhlc2UgcGVyY2VudGFnZXMgaXMgbWVhbmluZ2xlc3MuCi0KLUBpdGVtIHNlbGYKLVRoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHRoaXMgZnVuY3Rpb24uICBUaGlzCi1zaG91bGQgYmUgaWRlbnRpY2FsIHRvIHRoZSBudW1iZXIgcHJpbnRlZCBpbiB0aGUgQGNvZGV7c2Vjb25kc30gZmllbGQKLWZvciB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmbGF0IHByb2ZpbGUuCi0KLUBpdGVtIGNoaWxkcmVuCi1UaGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBzcGVudCBpbiB0aGUgc3Vicm91dGluZSBjYWxscyBtYWRlIGJ5Ci10aGlzIGZ1bmN0aW9uLiAgVGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIHN1bSBvZiBhbGwgdGhlIEBjb2Rle3NlbGZ9Ci1hbmQgQGNvZGV7Y2hpbGRyZW59IGVudHJpZXMgb2YgdGhlIGNoaWxkcmVuIGxpc3RlZCBkaXJlY3RseSBiZWxvdyB0aGlzCi1mdW5jdGlvbi4KLQotQGl0ZW0gY2FsbGVkCi1UaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCi0KLUlmIHRoZSBmdW5jdGlvbiBjYWxsZWQgaXRzZWxmIHJlY3Vyc2l2ZWx5LCB0aGVyZSBhcmUgdHdvIG51bWJlcnMsCi1zZXBhcmF0ZWQgYnkgYSBAc2FtcHsrfS4gIFRoZSBmaXJzdCBudW1iZXIgY291bnRzIG5vbi1yZWN1cnNpdmUgY2FsbHMsCi1hbmQgdGhlIHNlY29uZCBjb3VudHMgcmVjdXJzaXZlIGNhbGxzLgotCi1JbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBvbmNlIGZyb20KLUBjb2Rle21haW59LgotCi1AaXRlbSBuYW1lCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIGluZGV4IG51bWJlciBpcwotcmVwZWF0ZWQgYWZ0ZXIgaXQuCi0KLUlmIHRoZSBmdW5jdGlvbiBpcyBwYXJ0IG9mIGEgY3ljbGUgb2YgcmVjdXJzaW9uLCB0aGUgY3ljbGUgbnVtYmVyIGlzCi1wcmludGVkIGJldHdlZW4gdGhlIGZ1bmN0aW9uJ3MgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlcgotKEBweHJlZntDeWNsZXN9KS4gIEZvciBleGFtcGxlLCBpZiBmdW5jdGlvbiBAY29kZXtnbnVycn0gaXMgcGFydCBvZgotY3ljbGUgbnVtYmVyIG9uZSwgYW5kIGhhcyBpbmRleCBudW1iZXIgdHdlbHZlLCBpdHMgcHJpbWFyeSBsaW5lIHdvdWxkCi1iZSBlbmQgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotZ251cnIgPGN5Y2xlIDE+IFsxMl0KLUBlbmQgZXhhbXBsZQotQGVuZCB0YWJsZQotCi1Abm9kZSBDYWxsZXJzLCBTdWJyb3V0aW5lcywgUHJpbWFyeSwgQ2FsbCBHcmFwaAotQHN1YnNlY3Rpb24gTGluZXMgZm9yIGEgRnVuY3Rpb24ncyBDYWxsZXJzCi0KLUEgZnVuY3Rpb24ncyBlbnRyeSBoYXMgYSBsaW5lIGZvciBlYWNoIGZ1bmN0aW9uIGl0IHdhcyBjYWxsZWQgYnkuCi1UaGVzZSBsaW5lcycgZmllbGRzIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBsaW5lLCBidXQKLXRoZWlyIG1lYW5pbmdzIGFyZSBkaWZmZXJlbnQgYmVjYXVzZSBvZiB0aGUgZGlmZmVyZW5jZSBpbiBjb250ZXh0LgotCi1Gb3IgcmVmZXJlbmNlLCB3ZSByZXBlYXQgdHdvIGxpbmVzIGZyb20gdGhlIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24KLUBjb2Rle3JlcG9ydH0sIHRoZSBwcmltYXJ5IGxpbmUgYW5kIG9uZSBjYWxsZXItbGluZSBwcmVjZWRpbmcgaXQsIHRvZ2V0aGVyCi13aXRoIHRoZSBoZWFkaW5nIGxpbmUgdGhhdCBzaG93cyB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkczoKLQotQHNtYWxsZXhhbXBsZQotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLUBkb3Rze30KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICBtYWluIFsyXQotWzNdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgcmVwb3J0IFszXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSGVyZSBhcmUgdGhlIG1lYW5pbmdzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGNhbGxlci1saW5lIGZvciBAY29kZXtyZXBvcnR9Ci1jYWxsZWQgZnJvbSBAY29kZXttYWlufToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzZWxmCi1BbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gQGNvZGV7cmVwb3J0fSBpdHNlbGYgd2hlbiBpdCB3YXMKLWNhbGxlZCBmcm9tIEBjb2Rle21haW59LgotCi1AaXRlbSBjaGlsZHJlbgotQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHN1YnJvdXRpbmVzIG9mIEBjb2Rle3JlcG9ydH0KLXdoZW4gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCi0KLVRoZSBzdW0gb2YgdGhlIEBjb2Rle3NlbGZ9IGFuZCBAY29kZXtjaGlsZHJlbn0gZmllbGRzIGlzIGFuIGVzdGltYXRlCi1vZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd2l0aGluIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbSBAY29kZXttYWlufS4KLQotQGl0ZW0gY2FsbGVkCi1Ud28gbnVtYmVyczogdGhlIG51bWJlciBvZiB0aW1lcyBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgZnJvbSBAY29kZXttYWlufSwKLWZvbGxvd2VkIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2Ygbm9ucmVjdXJzaXZlIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbQotYWxsIGl0cyBjYWxsZXJzLgotCi1AaXRlbSBuYW1lIGFuZCBpbmRleCBudW1iZXIKLVRoZSBuYW1lIG9mIHRoZSBjYWxsZXIgb2YgQGNvZGV7cmVwb3J0fSB0byB3aGljaCB0aGlzIGxpbmUgYXBwbGllcywKLWZvbGxvd2VkIGJ5IHRoZSBjYWxsZXIncyBpbmRleCBudW1iZXIuCi0KLU5vdCBhbGwgZnVuY3Rpb25zIGhhdmUgZW50cmllcyBpbiB0aGUgY2FsbCBncmFwaDsgc29tZQotb3B0aW9ucyB0byBAY29kZXtncHJvZn0gcmVxdWVzdCB0aGUgb21pc3Npb24gb2YgY2VydGFpbiBmdW5jdGlvbnMuCi1XaGVuIGEgY2FsbGVyIGhhcyBubyBlbnRyeSBvZiBpdHMgb3duLCBpdCBzdGlsbCBoYXMgY2FsbGVyLWxpbmVzCi1pbiB0aGUgZW50cmllcyBvZiB0aGUgZnVuY3Rpb25zIGl0IGNhbGxzLgotCi1JZiB0aGUgY2FsbGVyIGlzIHBhcnQgb2YgYSByZWN1cnNpb24gY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMKLXByaW50ZWQgYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLUBlbmQgdGFibGUKLQotSWYgdGhlIGlkZW50aXR5IG9mIHRoZSBjYWxsZXJzIG9mIGEgZnVuY3Rpb24gY2Fubm90IGJlIGRldGVybWluZWQsIGEKLWR1bW15IGNhbGxlci1saW5lIGlzIHByaW50ZWQgd2hpY2ggaGFzIEBzYW1wezxzcG9udGFuZW91cz59IGFzIHRoZQotYGBjYWxsZXIncyBuYW1lJycgYW5kIGFsbCBvdGhlciBmaWVsZHMgYmxhbmsuICBUaGlzIGNhbiBoYXBwZW4gZm9yCi1zaWduYWwgaGFuZGxlcnMuCi1AYyBXaGF0IGlmIHNvbWUgY2FsbHMgaGF2ZSBkZXRlcm1pbmFibGUgY2FsbGVycycgbmFtZXMgYnV0IG5vdCBhbGw/Ci1AYyBGSVhNRSAtIHN0aWxsIHJlbGV2YW50PwotCi1Abm9kZSBTdWJyb3V0aW5lcywgQ3ljbGVzLCBDYWxsZXJzLCBDYWxsIEdyYXBoCi1Ac3Vic2VjdGlvbiBMaW5lcyBmb3IgYSBGdW5jdGlvbidzIFN1YnJvdXRpbmVzCi0KLUEgZnVuY3Rpb24ncyBlbnRyeSBoYXMgYSBsaW5lIGZvciBlYWNoIG9mIGl0cyBzdWJyb3V0aW5lcy0tLWluIG90aGVyCi13b3JkcywgYSBsaW5lIGZvciBlYWNoIG90aGVyIGZ1bmN0aW9uIHRoYXQgaXQgY2FsbGVkLiAgVGhlc2UgbGluZXMnCi1maWVsZHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGxpbmUsIGJ1dCB0aGVpciBtZWFuaW5ncwotYXJlIGRpZmZlcmVudCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbmNlIGluIGNvbnRleHQuCi0KLUZvciByZWZlcmVuY2UsIHdlIHJlcGVhdCB0d28gbGluZXMgZnJvbSB0aGUgZW50cnkgZm9yIHRoZSBmdW5jdGlvbgotQGNvZGV7bWFpbn0sIHRoZSBwcmltYXJ5IGxpbmUgYW5kIGEgbGluZSBmb3IgYSBzdWJyb3V0aW5lLCB0b2dldGhlcgotd2l0aCB0aGUgaGVhZGluZyBsaW5lIHRoYXQgc2hvd3MgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHM6Ci0KLUBzbWFsbGV4YW1wbGUKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi1AZG90c3t9Ci1bMl0gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIHJlcG9ydCBbM10KLUBlbmQgc21hbGxleGFtcGxlCi0KLUhlcmUgYXJlIHRoZSBtZWFuaW5ncyBvZiB0aGUgZmllbGRzIGluIHRoZSBzdWJyb3V0aW5lLWxpbmUgZm9yIEBjb2Rle21haW59Ci1jYWxsaW5nIEBjb2Rle3JlcG9ydH06Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gc2VsZgotQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGRpcmVjdGx5IHdpdGhpbiBAY29kZXtyZXBvcnR9Ci13aGVuIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBmcm9tIEBjb2Rle21haW59LgotCi1AaXRlbSBjaGlsZHJlbgotQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHN1YnJvdXRpbmVzIG9mIEBjb2Rle3JlcG9ydH0KLXdoZW4gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCi0KLVRoZSBzdW0gb2YgdGhlIEBjb2Rle3NlbGZ9IGFuZCBAY29kZXtjaGlsZHJlbn0gZmllbGRzIGlzIGFuIGVzdGltYXRlCi1vZiB0aGUgdG90YWwgdGltZSBzcGVudCBpbiBjYWxscyB0byBAY29kZXtyZXBvcnR9IGZyb20gQGNvZGV7bWFpbn0uCi0KLUBpdGVtIGNhbGxlZAotVHdvIG51bWJlcnMsIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gQGNvZGV7cmVwb3J0fSBmcm9tIEBjb2Rle21haW59Ci1mb2xsb3dlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIG5vbnJlY3Vyc2l2ZSBjYWxscyB0byBAY29kZXtyZXBvcnR9LgotVGhpcyByYXRpbyBpcyB1c2VkIHRvIGRldGVybWluZSBob3cgbXVjaCBvZiBAY29kZXtyZXBvcnR9J3MgQGNvZGV7c2VsZn0KLWFuZCBAY29kZXtjaGlsZHJlbn0gdGltZSBnZXRzIGNyZWRpdGVkIHRvIEBjb2Rle21haW59LgotQHhyZWZ7QXNzdW1wdGlvbnN9LgotCi1AaXRlbSBuYW1lCi1UaGUgbmFtZSBvZiB0aGUgc3Vicm91dGluZSBvZiBAY29kZXttYWlufSB0byB3aGljaCB0aGlzIGxpbmUgYXBwbGllcywKLWZvbGxvd2VkIGJ5IHRoZSBzdWJyb3V0aW5lJ3MgaW5kZXggbnVtYmVyLgotCi1JZiB0aGUgY2FsbGVyIGlzIHBhcnQgb2YgYSByZWN1cnNpb24gY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMKLXByaW50ZWQgYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLUBlbmQgdGFibGUKLQotQG5vZGUgQ3ljbGVzLCwgU3Vicm91dGluZXMsIENhbGwgR3JhcGgKLUBzdWJzZWN0aW9uIEhvdyBNdXR1YWxseSBSZWN1cnNpdmUgRnVuY3Rpb25zIEFyZSBEZXNjcmliZWQKLUBjaW5kZXggY3ljbGUKLUBjaW5kZXggcmVjdXJzaW9uIGN5Y2xlCi0KLVRoZSBncmFwaCBtYXkgYmUgY29tcGxpY2F0ZWQgYnkgdGhlIHByZXNlbmNlIG9mIEBkZm57Y3ljbGVzIG9mCi1yZWN1cnNpb259IGluIHRoZSBjYWxsIGdyYXBoLiAgQSBjeWNsZSBleGlzdHMgaWYgYSBmdW5jdGlvbiBjYWxscwotYW5vdGhlciBmdW5jdGlvbiB0aGF0IChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBjYWxscyAob3IgYXBwZWFycyB0bwotY2FsbCkgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6IGlmIEBjb2Rle2F9IGNhbGxzIEBjb2Rle2J9LAotYW5kIEBjb2Rle2J9IGNhbGxzIEBjb2Rle2F9LCB0aGVuIEBjb2Rle2F9IGFuZCBAY29kZXtifSBmb3JtIGEgY3ljbGUuCi0KLVdoZW5ldmVyIHRoZXJlIGFyZSBjYWxsIHBhdGhzIGJvdGggd2F5cyBiZXR3ZWVuIGEgcGFpciBvZiBmdW5jdGlvbnMsIHRoZXkKLWJlbG9uZyB0byB0aGUgc2FtZSBjeWNsZS4gIElmIEBjb2Rle2F9IGFuZCBAY29kZXtifSBjYWxsIGVhY2ggb3RoZXIgYW5kCi1AY29kZXtifSBhbmQgQGNvZGV7Y30gY2FsbCBlYWNoIG90aGVyLCBhbGwgdGhyZWUgbWFrZSBvbmUgY3ljbGUuICBOb3RlIHRoYXQKLWV2ZW4gaWYgQGNvZGV7Yn0gb25seSBjYWxscyBAY29kZXthfSBpZiBpdCB3YXMgbm90IGNhbGxlZCBmcm9tIEBjb2Rle2F9LAotQGNvZGV7Z3Byb2Z9IGNhbm5vdCBkZXRlcm1pbmUgdGhpcywgc28gQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGFyZSBzdGlsbAotY29uc2lkZXJlZCBhIGN5Y2xlLgotCi1UaGUgY3ljbGVzIGFyZSBudW1iZXJlZCB3aXRoIGNvbnNlY3V0aXZlIGludGVnZXJzLiAgV2hlbiBhIGZ1bmN0aW9uCi1iZWxvbmdzIHRvIGEgY3ljbGUsIGVhY2ggdGltZSB0aGUgZnVuY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBjYWxsIGdyYXBoCi1pdCBpcyBmb2xsb3dlZCBieSBAc2FtcHs8Y3ljbGUgQHZhcntudW1iZXJ9Pn0uCi0KLVRoZSByZWFzb24gY3ljbGVzIG1hdHRlciBpcyB0aGF0IHRoZXkgbWFrZSB0aGUgdGltZSB2YWx1ZXMgaW4gdGhlIGNhbGwKLWdyYXBoIHBhcmFkb3hpY2FsLiAgVGhlIGBgdGltZSBzcGVudCBpbiBjaGlsZHJlbicnIG9mIEBjb2Rle2F9IHNob3VsZAotaW5jbHVkZSB0aGUgdGltZSBzcGVudCBpbiBpdHMgc3Vicm91dGluZSBAY29kZXtifSBhbmQgaW4gQGNvZGV7Yn0ncwotc3Vicm91dGluZXMtLS1idXQgb25lIG9mIEBjb2Rle2J9J3Mgc3Vicm91dGluZXMgaXMgQGNvZGV7YX0hICBIb3cgbXVjaCBvZgotQGNvZGV7YX0ncyB0aW1lIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY2hpbGRyZW4gb2YgQGNvZGV7YX0sIHdoZW4KLUBjb2Rle2F9IGlzIGluZGlyZWN0bHkgcmVjdXJzaXZlPwotCi1UaGUgd2F5IEBjb2Rle2dwcm9mfSByZXNvbHZlcyB0aGlzIHBhcmFkb3ggaXMgYnkgY3JlYXRpbmcgYSBzaW5nbGUgZW50cnkKLWZvciB0aGUgY3ljbGUgYXMgYSB3aG9sZS4gIFRoZSBwcmltYXJ5IGxpbmUgb2YgdGhpcyBlbnRyeSBkZXNjcmliZXMgdGhlCi10b3RhbCB0aW1lIHNwZW50IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGN5Y2xlLiAgVGhlCi1gYHN1YnJvdXRpbmVzJycgb2YgdGhlIGN5Y2xlIGFyZSB0aGUgaW5kaXZpZHVhbCBmdW5jdGlvbnMgb2YgdGhlIGN5Y2xlLCBhbmQKLWFsbCBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIGNhbGxlZCBkaXJlY3RseSBieSB0aGVtLiAgVGhlIGBgY2FsbGVycycnIG9mCi10aGUgY3ljbGUgYXJlIHRoZSBmdW5jdGlvbnMsIG91dHNpZGUgdGhlIGN5Y2xlLCB0aGF0IGNhbGxlZCBmdW5jdGlvbnMgaW4KLXRoZSBjeWNsZS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIHBvcnRpb24gb2YgYSBjYWxsIGdyYXBoIHdoaWNoIHNob3dzIGEgY3ljbGUgY29udGFpbmluZwotZnVuY3Rpb25zIEBjb2Rle2F9IGFuZCBAY29kZXtifS4gIFRoZSBjeWNsZSB3YXMgZW50ZXJlZCBieSBhIGNhbGwgdG8KLUBjb2Rle2F9IGZyb20gQGNvZGV7bWFpbn07IGJvdGggQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGNhbGxlZCBAY29kZXtjfS4KLQotQHNtYWxsZXhhbXBsZQotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCi1bM10gICAgIDkxLjcxICAgIDEuNzcgICAgICAgIDAgICAgMSs1ICAgIDxjeWNsZSAxIGFzIGEgd2hvbGU+IFszXQotICAgICAgICAgICAgICAgICAxLjAyICAgICAgICAwICAgIDMgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgIDAuNzUgICAgICAgIDAgICAgMiAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotWzRdICAgICA1Mi44NSAgICAxLjAyICAgICAgICAwICAgIDAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLVs1XSAgICAgMzguODYgICAgMC43NSAgICAgICAgMCAgICAxICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLShUaGUgZW50aXJlIGNhbGwgZ3JhcGggZm9yIHRoaXMgcHJvZ3JhbSBjb250YWlucyBpbiBhZGRpdGlvbiBhbiBlbnRyeSBmb3IKLUBjb2Rle21haW59LCB3aGljaCBjYWxscyBAY29kZXthfSwgYW5kIGFuIGVudHJ5IGZvciBAY29kZXtjfSwgd2l0aCBjYWxsZXJzCi1AY29kZXthfSBhbmQgQGNvZGV7Yn0uKQotCi1Ac21hbGxleGFtcGxlCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwb250YW5lb3VzPgotWzFdICAgIDEwMC4wMCAgICAgICAwICAgICAxLjkzICAgIDAgICAgICBzdGFydCBbMV0KLSAgICAgICAgICAgICAgICAgMC4xNiAgICAgMS43NyAgICAxLzEgICAgICAgIG1haW4gWzJdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDAuMTYgICAgIDEuNzcgICAgMS8xICAgICAgICBzdGFydCBbMV0KLVsyXSAgICAxMDAuMDAgICAgMC4xNiAgICAgMS43NyAgICAxICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLVszXSAgICAgOTEuNzEgICAgMS43NyAgICAgICAgMCAgICAxKzUgICAgPGN5Y2xlIDEgYXMgYSB3aG9sZT4gWzNdCi0gICAgICAgICAgICAgICAgIDEuMDIgICAgICAgIDAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgMC43NSAgICAgICAgMCAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDYvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotWzRdICAgICA1Mi44NSAgICAxLjAyICAgICAgICAwICAgIDAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLVs1XSAgICAgMzguODYgICAgMC43NSAgICAgICAgMCAgICAxICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotWzZdICAgICAgMC4wMCAgICAgICAwICAgICAgICAwICAgIDYgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBjb2Rle3NlbGZ9IGZpZWxkIG9mIHRoZSBjeWNsZSdzIHByaW1hcnkgbGluZSBpcyB0aGUgdG90YWwgdGltZQotc3BlbnQgaW4gYWxsIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGN5Y2xlLiAgSXQgZXF1YWxzIHRoZSBzdW0gb2YgdGhlCi1AY29kZXtzZWxmfSBmaWVsZHMgZm9yIHRoZSBpbmRpdmlkdWFsIGZ1bmN0aW9ucyBpbiB0aGUgY3ljbGUsIGZvdW5kCi1pbiB0aGUgZW50cnkgaW4gdGhlIHN1YnJvdXRpbmUgbGluZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KLQotVGhlIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgb2YgdGhlIGN5Y2xlJ3MgcHJpbWFyeSBsaW5lIGFuZCBzdWJyb3V0aW5lIGxpbmVzCi1jb3VudCBvbmx5IHN1YnJvdXRpbmVzIG91dHNpZGUgdGhlIGN5Y2xlLiAgRXZlbiB0aG91Z2ggQGNvZGV7YX0gY2FsbHMKLUBjb2Rle2J9LCB0aGUgdGltZSBzcGVudCBpbiB0aG9zZSBjYWxscyB0byBAY29kZXtifSBpcyBub3QgY291bnRlZCBpbgotQGNvZGV7YX0ncyBAY29kZXtjaGlsZHJlbn0gdGltZS4gIFRodXMsIHdlIGRvIG5vdCBlbmNvdW50ZXIgdGhlIHByb2JsZW0gb2YKLXdoYXQgdG8gZG8gd2hlbiB0aGUgdGltZSBpbiB0aG9zZSBjYWxscyB0byBAY29kZXtifSBpbmNsdWRlcyBpbmRpcmVjdAotcmVjdXJzaXZlIGNhbGxzIGJhY2sgdG8gQGNvZGV7YX0uCi0KLVRoZSBAY29kZXtjaGlsZHJlbn0gZmllbGQgb2YgYSBjYWxsZXItbGluZSBpbiB0aGUgY3ljbGUncyBlbnRyeSBlc3RpbWF0ZXMKLXRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBAZW1waHtpbiB0aGUgd2hvbGUgY3ljbGV9LCBhbmQgaXRzIG90aGVyCi1zdWJyb3V0aW5lcywgb24gdGhlIHRpbWVzIHdoZW4gdGhhdCBjYWxsZXIgY2FsbGVkIGEgZnVuY3Rpb24gaW4gdGhlIGN5Y2xlLgotCi1UaGUgQGNvZGV7Y2FsbHN9IGZpZWxkIGluIHRoZSBwcmltYXJ5IGxpbmUgZm9yIHRoZSBjeWNsZSBoYXMgdHdvIG51bWJlcnM6Ci1maXJzdCwgdGhlIG51bWJlciBvZiB0aW1lcyBmdW5jdGlvbnMgaW4gdGhlIGN5Y2xlIHdlcmUgY2FsbGVkIGJ5IGZ1bmN0aW9ucwotb3V0c2lkZSB0aGUgY3ljbGU7IHNlY29uZCwgdGhlIG51bWJlciBvZiB0aW1lcyB0aGV5IHdlcmUgY2FsbGVkIGJ5Ci1mdW5jdGlvbnMgaW4gdGhlIGN5Y2xlIChpbmNsdWRpbmcgdGltZXMgd2hlbiBhIGZ1bmN0aW9uIGluIHRoZSBjeWNsZSBjYWxscwotaXRzZWxmKS4gIFRoaXMgaXMgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgdXN1YWwgc3BsaXQgaW50byBub25yZWN1cnNpdmUgYW5kCi1yZWN1cnNpdmUgY2FsbHMuCi0KLVRoZSBAY29kZXtjYWxsc30gZmllbGQgb2YgYSBzdWJyb3V0aW5lLWxpbmUgZm9yIGEgY3ljbGUgbWVtYmVyIGluIHRoZQotY3ljbGUncyBlbnRyeSBzYXlzIGhvdyBtYW55IHRpbWUgdGhhdCBmdW5jdGlvbiB3YXMgY2FsbGVkIGZyb20gZnVuY3Rpb25zIGluCi10aGUgY3ljbGUuICBUaGUgdG90YWwgb2YgYWxsIHRoZXNlIGlzIHRoZSBzZWNvbmQgbnVtYmVyIGluIHRoZSBwcmltYXJ5IGxpbmUncwotQGNvZGV7Y2FsbHN9IGZpZWxkLgotCi1JbiB0aGUgaW5kaXZpZHVhbCBlbnRyeSBmb3IgYSBmdW5jdGlvbiBpbiBhIGN5Y2xlLCB0aGUgb3RoZXIgZnVuY3Rpb25zIGluCi10aGUgc2FtZSBjeWNsZSBjYW4gYXBwZWFyIGFzIHN1YnJvdXRpbmVzIGFuZCBhcyBjYWxsZXJzLiAgVGhlc2UgbGluZXMgc2hvdwotaG93IG1hbnkgdGltZXMgZWFjaCBmdW5jdGlvbiBpbiB0aGUgY3ljbGUgY2FsbGVkIG9yIHdhcyBjYWxsZWQgZnJvbSBlYWNoIG90aGVyCi1mdW5jdGlvbiBpbiB0aGUgY3ljbGUuICBUaGUgQGNvZGV7c2VsZn0gYW5kIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgaW4gdGhlc2UKLWxpbmVzIGFyZSBibGFuayBiZWNhdXNlIG9mIHRoZSBkaWZmaWN1bHR5IG9mIGRlZmluaW5nIG1lYW5pbmdzIGZvciB0aGVtCi13aGVuIHJlY3Vyc2lvbiBpcyBnb2luZyBvbi4KLQotQG5vZGUgTGluZS1ieS1saW5lLEFubm90YXRlZCBTb3VyY2UsQ2FsbCBHcmFwaCxPdXRwdXQKLUBzZWN0aW9uIExpbmUtYnktbGluZSBQcm9maWxpbmcKLQotQGNvZGV7Z3Byb2Z9J3MgQHNhbXB7LWx9IG9wdGlvbiBjYXVzZXMgdGhlIHByb2dyYW0gdG8gcGVyZm9ybQotQGRmbntsaW5lLWJ5LWxpbmV9IHByb2ZpbGluZy4gIEluIHRoaXMgbW9kZSwgaGlzdG9ncmFtCi1zYW1wbGVzIGFyZSBhc3NpZ25lZCBub3QgdG8gZnVuY3Rpb25zLCBidXQgdG8gaW5kaXZpZHVhbAotbGluZXMgb2Ygc291cmNlIGNvZGUuICBUaGUgcHJvZ3JhbSB1c3VhbGx5IG11c3QgYmUgY29tcGlsZWQKLXdpdGggYSBAc2FtcHstZ30gb3B0aW9uLCBpbiBhZGRpdGlvbiB0byBAc2FtcHstcGd9LCBpbiBvcmRlcgotdG8gZ2VuZXJhdGUgZGVidWdnaW5nIHN5bWJvbHMgZm9yIHRyYWNraW5nIHNvdXJjZSBjb2RlIGxpbmVzLgotCi1UaGUgZmxhdCBwcm9maWxlIGlzIHRoZSBtb3N0IHVzZWZ1bCBvdXRwdXQgdGFibGUKLWluIGxpbmUtYnktbGluZSBtb2RlLgotVGhlIGNhbGwgZ3JhcGggaXNuJ3QgYXMgdXNlZnVsIGFzIG5vcm1hbCwgc2luY2UKLXRoZSBjdXJyZW50IHZlcnNpb24gb2YgQGNvZGV7Z3Byb2Z9IGRvZXMgbm90IHByb3BhZ2F0ZQotY2FsbCBncmFwaCBhcmNzIGZyb20gc291cmNlIGNvZGUgbGluZXMgdG8gdGhlIGVuY2xvc2luZyBmdW5jdGlvbi4KLVRoZSBjYWxsIGdyYXBoIGRvZXMsIGhvd2V2ZXIsIHNob3cgZWFjaCBsaW5lIG9mIGNvZGUKLXRoYXQgY2FsbGVkIGVhY2ggZnVuY3Rpb24sIGFsb25nIHdpdGggYSBjb3VudC4KLQotSGVyZSBpcyBhIHNlY3Rpb24gb2YgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0LCB3aXRob3V0IGxpbmUtYnktbGluZSBwcm9maWxpbmcuCi1Ob3RlIHRoYXQgQGNvZGV7Y3RfaW5pdH0gYWNjb3VudGVkIGZvciBmb3VyIGhpc3RvZ3JhbSBoaXRzLCBhbmQKLTEzMzI3IGNhbGxzIHRvIEBjb2Rle2luaXRfYmxvY2t9LgotCi1Ac21hbGxleGFtcGxlCi1GbGF0IHByb2ZpbGU6Ci0KLUVhY2ggc2FtcGxlIGNvdW50cyBhcyAwLjAxIHNlY29uZHMuCi0gICUgICBjdW11bGF0aXZlICAgc2VsZiAgICAgICAgICAgICAgc2VsZiAgICAgdG90YWwgICAgICAgICAgIAotIHRpbWUgICBzZWNvbmRzICAgc2Vjb25kcyAgICBjYWxscyAgdXMvY2FsbCAgdXMvY2FsbCAgbmFtZSAgICAKLSAzMC43NyAgICAgIDAuMTMgICAgIDAuMDQgICAgIDYzMzUgICAgIDYuMzEgICAgIDYuMzEgIGN0X2luaXQKLQotCi0JCSAgICAgQ2FsbCBncmFwaCAoZXhwbGFuYXRpb24gZm9sbG93cykKLQotCi1ncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyA0IGJ5dGUocykgZm9yIDcuNjklIG9mIDAuMTMgc2Vjb25kcwotCi1pbmRleCAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lCi0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBuYW1lX3Rvb19sb25nCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgNDAvMTM0OTYgICAgICAgZGVmbGF0ZQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgMTI4LzEzNDk2ICAgICAgIGRlZmxhdGVfZmFzdAotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgIDEzMzI3LzEzNDk2ICAgICAgIGN0X2luaXQKLVs3XSAgICAgIDAuMCAgICAwLjAwICAgIDAuMDAgICAxMzQ5NiAgICAgICAgIGluaXRfYmxvY2sKLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm93IGxldCdzIGxvb2sgYXQgc29tZSBvZiBAY29kZXtncHJvZn0ncyBvdXRwdXQgZnJvbSB0aGUgc2FtZSBwcm9ncmFtIHJ1biwKLXRoaXMgdGltZSB3aXRoIGxpbmUtYnktbGluZSBwcm9maWxpbmcgZW5hYmxlZC4gIE5vdGUgdGhhdCBAY29kZXtjdF9pbml0fSdzCi1mb3VyIGhpc3RvZ3JhbSBoaXRzIGFyZSBicm9rZW4gZG93biBpbnRvIGZvdXIgbGluZXMgb2Ygc291cmNlIGNvZGUgLSBvbmUgaGl0Ci1vY2N1cmVkIG9uIGVhY2ggb2YgbGluZXMgMzQ5LCAzNTEsIDM4MiBhbmQgMzg1LiAgSW4gdGhlIGNhbGwgZ3JhcGgsCi1ub3RlIGhvdwotQGNvZGV7Y3RfaW5pdH0ncyAxMzMyNyBjYWxscyB0byBAY29kZXtpbml0X2Jsb2NrfSBhcmUgYnJva2VuIGRvd24KLWludG8gb25lIGNhbGwgZnJvbSBsaW5lIDM5NiwgMzA3MSBjYWxscyBmcm9tIGxpbmUgMzg0LCAzNzMwIGNhbGxzCi1mcm9tIGxpbmUgMzg1LCBhbmQgNjUyNSBjYWxscyBmcm9tIDM4Ny4KLQotQHNtYWxsZXhhbXBsZQotRmxhdCBwcm9maWxlOgotCi1FYWNoIHNhbXBsZSBjb3VudHMgYXMgMC4wMSBzZWNvbmRzLgotICAlICAgY3VtdWxhdGl2ZSAgIHNlbGYgICAgICAgICAgICAgICAgICAgIAotIHRpbWUgICBzZWNvbmRzICAgc2Vjb25kcyAgICBjYWxscyAgbmFtZSAgICAKLSAgNy42OSAgICAgIDAuMTAgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6MzQ5KQotICA3LjY5ICAgICAgMC4xMSAgICAgMC4wMSAgICAgICAgICAgY3RfaW5pdCAodHJlZXMuYzozNTEpCi0gIDcuNjkgICAgICAwLjEyICAgICAwLjAxICAgICAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4MikKLSAgNy42OSAgICAgIDAuMTMgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg1KQotCi0KLQkJICAgICBDYWxsIGdyYXBoIChleHBsYW5hdGlvbiBmb2xsb3dzKQotCi0KLWdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzIDQgYnl0ZShzKSBmb3IgNy42OSUgb2YgMC4xMyBzZWNvbmRzCi0KLSAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZQotCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBuYW1lX3Rvb19sb25nIChnemlwLmM6MTQ0MCkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo3NjMpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM5NikKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAyLzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo3MjcpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgNC8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6Njg2KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDUvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjY3NSkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgIDEyLzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo2NzkpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAxNi8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6NzMwKQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAxMjgvMTM0OTYgICAgICAgZGVmbGF0ZV9mYXN0IChkZWZsYXRlLmM6NjU0KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgIDMwNzEvMTM0OTYgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODQpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgMzczMC8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4NSkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICA2NTI1LzEzNDk2ICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg3KQotWzZdICAwLjAgICAgMC4wMCAgICAwLjAwICAgMTM0OTYgICAgICAgICBpbml0X2Jsb2NrICh0cmVlcy5jOjQwOCkKLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotCi1Abm9kZSBBbm5vdGF0ZWQgU291cmNlLCxMaW5lLWJ5LWxpbmUsT3V0cHV0Ci1Ac2VjdGlvbiBUaGUgQW5ub3RhdGVkIFNvdXJjZSBMaXN0aW5nCi0KLUBjb2Rle2dwcm9mfSdzIEBzYW1wey1BfSBvcHRpb24gdHJpZ2dlcnMgYW4gYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nLAotd2hpY2ggbGlzdHMgdGhlIHByb2dyYW0ncyBzb3VyY2UgY29kZSwgZWFjaCBmdW5jdGlvbiBsYWJlbGVkIHdpdGggdGhlCi1udW1iZXIgb2YgdGltZXMgaXQgd2FzIGNhbGxlZC4gIFlvdSBtYXkgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlCi1Ac2FtcHstSX0gb3B0aW9uLCBpZiBAY29kZXtncHJvZn0gY2FuJ3QgZmluZCB0aGUgc291cmNlIGNvZGUgZmlsZXMuCi0KLUNvbXBpbGluZyB3aXRoIEBzYW1we2djYyBAZG90c3t9IC1nIC1wZyAtYX0gYXVnbWVudHMgeW91ciBwcm9ncmFtCi13aXRoIGJhc2ljLWJsb2NrIGNvdW50aW5nIGNvZGUsIGluIGFkZGl0aW9uIHRvIGZ1bmN0aW9uIGNvdW50aW5nIGNvZGUuCi1UaGlzIGVuYWJsZXMgQGNvZGV7Z3Byb2Z9IHRvIGRldGVybWluZSBob3cgbWFueSB0aW1lcyBlYWNoIGxpbmUKLW9mIGNvZGUgd2FzIGV4ZXVjdGVkLgotRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24sIHRha2VuIGZyb20gZ3ppcCwKLXdpdGggbGluZSBudW1iZXJzIGFkZGVkOgotCi1Ac21hbGxleGFtcGxlCi0gMSB1bGcgdXBkY3JjKHMsIG4pCi0gMiAgICAgdWNoICpzOwotIDMgICAgIHVuc2lnbmVkIG47Ci0gNCBAewotIDUgICAgIHJlZ2lzdGVyIHVsZyBjOwotIDYKLSA3ICAgICBzdGF0aWMgdWxnIGNyYyA9ICh1bGcpMHhmZmZmZmZmZkw7Ci0gOAotIDkgICAgIGlmIChzID09IE5VTEwpIEB7Ci0xMCAgICAgICAgIGMgPSAweGZmZmZmZmZmTDsKLTExICAgICBAfSBlbHNlIEB7Ci0xMiAgICAgICAgIGMgPSBjcmM7Ci0xMyAgICAgICAgIGlmIChuKSBkbyBAewotMTQgICAgICAgICAgICAgYyA9IGNyY18zMl90YWJbLi4uXTsKLTE1ICAgICAgICAgQH0gd2hpbGUgKC0tbik7Ci0xNiAgICAgQH0KLTE3ICAgICBjcmMgPSBjOwotMTggICAgIHJldHVybiBjIF4gMHhmZmZmZmZmZkw7Ci0xOSBAfQotCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXt1cGRjcmN9IGhhcyBhdCBsZWFzdCBmaXZlIGJhc2ljLWJsb2Nrcy4KLU9uZSBpcyB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgVGhlCi1AY29kZXtpZn0gc3RhdGVtZW50IG9uIGxpbmUgOSBnZW5lcmF0ZXMgdHdvIG1vcmUgYmFzaWMtYmxvY2tzLCBvbmUKLWZvciBlYWNoIGJyYW5jaCBvZiB0aGUgQGNvZGV7aWZ9LiAgQSBmb3VydGggYmFzaWMtYmxvY2sgcmVzdWx0cyBmcm9tCi10aGUgQGNvZGV7aWZ9IG9uIGxpbmUgMTMsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIEBjb2Rle2RvfSBsb29wIGZvcm0KLXRoZSBmaWZ0aCBiYXNpYy1ibG9jay4gIFRoZSBjb21waWxlciBtYXkgYWxzbyBnZW5lcmF0ZSBhZGRpdGlvbmFsCi1iYXNpYy1ibG9ja3MgdG8gaGFuZGxlIHZhcmlvdXMgc3BlY2lhbCBjYXNlcy4KLQotQSBwcm9ncmFtIGF1Z21lbnRlZCBmb3IgYmFzaWMtYmxvY2sgY291bnRpbmcgY2FuIGJlIGFuYWx5emVkIHdpdGgKLUBjb2Rle2dwcm9mIC1sIC1BfS4gIEkgYWxzbyBzdWdnZXN0IHVzZSBvZiB0aGUgQHNhbXB7LXh9IG9wdGlvbiwKLXdoaWNoIGVuc3VyZXMgdGhhdCBlYWNoIGxpbmUgb2YgY29kZSBpcyBsYWJlbGVkIGF0IGxlYXN0IG9uY2UuCi1IZXJlIGlzIEBjb2Rle3VwZGNyY30ncwotYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIGZvciBhIHNhbXBsZSBAY29kZXtnemlwfSBydW46Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgICAgICAgICB1bGcgdXBkY3JjKHMsIG4pCi0gICAgICAgICAgICAgICAgICAgIHVjaCAqczsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbjsKLSAgICAgICAgICAgIDIgLT5AewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB1bGcgYzsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljIHVsZyBjcmMgPSAodWxnKTB4ZmZmZmZmZmZMOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgMiAtPiAgICBpZiAocyA9PSBOVUxMKSBAewotICAgICAgICAgICAgMSAtPgljID0gMHhmZmZmZmZmZkw7Ci0gICAgICAgICAgICAxIC0+ICAgIEB9IGVsc2UgQHsKLSAgICAgICAgICAgIDEgLT4JYyA9IGNyYzsKLSAgICAgICAgICAgIDEgLT4gICAgICAgIGlmIChuKSBkbyBAewotICAgICAgICAyNjMxMiAtPiAgICAgICAgICAgIGMgPSBjcmNfMzJfdGFiWy4uLl07Ci0yNjMxMiwxLDI2MzExIC0+ICAgICAgICBAfSB3aGlsZSAoLS1uKTsKLSAgICAgICAgICAgICAgICAgICAgQH0KLSAgICAgICAgICAgIDIgLT4gICAgY3JjID0gYzsKLSAgICAgICAgICAgIDIgLT4gICAgcmV0dXJuIGMgXiAweGZmZmZmZmZmTDsKLSAgICAgICAgICAgIDIgLT5AfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSW4gdGhpcyBleGFtcGxlLCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCB0d2ljZSwgcGFzc2luZyBvbmNlIHRocm91Z2gKLWVhY2ggYnJhbmNoIG9mIHRoZSBAY29kZXtpZn0gc3RhdGVtZW50LiAgVGhlIGJvZHkgb2YgdGhlIEBjb2Rle2RvfQotbG9vcCB3YXMgZXhlY3V0ZWQgYSB0b3RhbCBvZiAyNjMxMiB0aW1lcy4gIE5vdGUgaG93IHRoZSBAY29kZXt3aGlsZX0KLXN0YXRlbWVudCBpcyBhbm5vdGF0ZWQuICBJdCBiZWdhbiBleGVjdXRpb24gMjYzMTIgdGltZXMsIG9uY2UgZm9yCi1lYWNoIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBsb29wLiAgT25lIG9mIHRob3NlIHRpbWVzICh0aGUgbGFzdCB0aW1lKQotaXQgZXhpdGVkLCB3aGlsZSBpdCBicmFuY2hlZCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AgMjYzMTEgdGltZXMuCi0KLUBub2RlIEluYWNjdXJhY3kKLUBjaGFwdGVyIEluYWNjdXJhY3kgb2YgQGNvZGV7Z3Byb2Z9IE91dHB1dAotCi1AbWVudQotKiBTYW1wbGluZyBFcnJvcjo6ICAgICAgU3RhdGlzdGljYWwgbWFyZ2lucyBvZiBlcnJvcgotKiBBc3N1bXB0aW9uczo6ICAgICAgICAgRXN0aW1hdGluZyBjaGlsZHJlbiB0aW1lcwotQGVuZCBtZW51Ci0KLUBub2RlIFNhbXBsaW5nIEVycm9yLEFzc3VtcHRpb25zLCxJbmFjY3VyYWN5Ci1Ac2VjdGlvbiBTdGF0aXN0aWNhbCBTYW1wbGluZyBFcnJvcgotCi1UaGUgcnVuLXRpbWUgZmlndXJlcyB0aGF0IEBjb2Rle2dwcm9mfSBnaXZlcyB5b3UgYXJlIGJhc2VkIG9uIGEgc2FtcGxpbmcKLXByb2Nlc3MsIHNvIHRoZXkgYXJlIHN1YmplY3QgdG8gc3RhdGlzdGljYWwgaW5hY2N1cmFjeS4gIElmIGEgZnVuY3Rpb24gcnVucwotb25seSBhIHNtYWxsIGFtb3VudCBvZiB0aW1lLCBzbyB0aGF0IG9uIHRoZSBhdmVyYWdlIHRoZSBzYW1wbGluZyBwcm9jZXNzCi1vdWdodCB0byBjYXRjaCB0aGF0IGZ1bmN0aW9uIGluIHRoZSBhY3Qgb25seSBvbmNlLCB0aGVyZSBpcyBhIHByZXR0eSBnb29kCi1jaGFuY2UgaXQgd2lsbCBhY3R1YWxseSBmaW5kIHRoYXQgZnVuY3Rpb24gemVybyB0aW1lcywgb3IgdHdpY2UuCi0KLUJ5IGNvbnRyYXN0LCB0aGUgbnVtYmVyLW9mLWNhbGxzIGFuZCBiYXNpYy1ibG9jayBmaWd1cmVzCi1hcmUgZGVyaXZlZCBieSBjb3VudGluZywgbm90Ci1zYW1wbGluZy4gIFRoZXkgYXJlIGNvbXBsZXRlbHkgYWNjdXJhdGUgYW5kIHdpbGwgbm90IHZhcnkgZnJvbSBydW4gdG8gcnVuCi1pZiB5b3VyIHByb2dyYW0gaXMgZGV0ZXJtaW5pc3RpYy4KLQotVGhlIEBkZm57c2FtcGxpbmcgcGVyaW9kfSB0aGF0IGlzIHByaW50ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmxhdAotcHJvZmlsZSBzYXlzIGhvdyBvZnRlbiBzYW1wbGVzIGFyZSB0YWtlbi4gIFRoZSBydWxlIG9mIHRodW1iIGlzIHRoYXQgYQotcnVuLXRpbWUgZmlndXJlIGlzIGFjY3VyYXRlIGlmIGl0IGlzIGNvbnNpZGVyYWJseSBiaWdnZXIgdGhhbiB0aGUgc2FtcGxpbmcKLXBlcmlvZC4KLQotVGhlIGFjdHVhbCBhbW91bnQgb2YgZXJyb3IgY2FuIGJlIHByZWRpY3RlZC4KLUZvciBAdmFye259IHNhbXBsZXMsIHRoZSBAZW1waHtleHBlY3RlZH0gZXJyb3IKLWlzIHRoZSBzcXVhcmUtcm9vdCBvZiBAdmFye259LiAgRm9yIGV4YW1wbGUsCi1pZiB0aGUgc2FtcGxpbmcgcGVyaW9kIGlzIDAuMDEgc2Vjb25kcyBhbmQgQGNvZGV7Zm9vfSdzIHJ1bi10aW1lIGlzIDEgc2Vjb25kLAotQHZhcntufSBpcyAxMDAgc2FtcGxlcyAoMSBzZWNvbmQvMC4wMSBzZWNvbmRzKSwgc3FydChAdmFye259KSBpcyAxMCBzYW1wbGVzLCBzbwotdGhlIGV4cGVjdGVkIGVycm9yIGluIEBjb2Rle2Zvb30ncyBydW4tdGltZSBpcyAwLjEgc2Vjb25kcyAoMTAqMC4wMSBzZWNvbmRzKSwKLW9yIHRlbiBwZXJjZW50IG9mIHRoZSBvYnNlcnZlZCB2YWx1ZS4KLUFnYWluLCBpZiB0aGUgc2FtcGxpbmcgcGVyaW9kIGlzIDAuMDEgc2Vjb25kcyBhbmQgQGNvZGV7YmFyfSdzIHJ1bi10aW1lIGlzCi0xMDAgc2Vjb25kcywgQHZhcntufSBpcyAxMDAwMCBzYW1wbGVzLCBzcXJ0KEB2YXJ7bn0pIGlzIDEwMCBzYW1wbGVzLCBzbwotdGhlIGV4cGVjdGVkIGVycm9yIGluIEBjb2Rle2Jhcn0ncyBydW4tdGltZSBpcyAxIHNlY29uZCwKLW9yIG9uZSBwZXJjZW50IG9mIHRoZSBvYnNlcnZlZCB2YWx1ZS4KLUl0IGlzIGxpa2VseSB0bwotdmFyeSB0aGlzIG11Y2ggQGVtcGh7b24gdGhlIGF2ZXJhZ2V9IGZyb20gb25lIHByb2ZpbGluZyBydW4gdG8gdGhlIG5leHQuCi0oQGVtcGh7U29tZXRpbWVzfSBpdCB3aWxsIHZhcnkgbW9yZS4pCi0KLVRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IGEgc21hbGwgcnVuLXRpbWUgZmlndXJlIGlzIGRldm9pZCBvZiBpbmZvcm1hdGlvbi4KLUlmIHRoZSBwcm9ncmFtJ3MgQGVtcGh7dG90YWx9IHJ1bi10aW1lIGlzIGxhcmdlLCBhIHNtYWxsIHJ1bi10aW1lIGZvciBvbmUKLWZ1bmN0aW9uIGRvZXMgdGVsbCB5b3UgdGhhdCB0aGF0IGZ1bmN0aW9uIHVzZWQgYW4gaW5zaWduaWZpY2FudCBmcmFjdGlvbiBvZgotdGhlIHdob2xlIHByb2dyYW0ncyB0aW1lLiAgVXN1YWxseSB0aGlzIG1lYW5zIGl0IGlzIG5vdCB3b3J0aCBvcHRpbWl6aW5nLgotCi1PbmUgd2F5IHRvIGdldCBtb3JlIGFjY3VyYWN5IGlzIHRvIGdpdmUgeW91ciBwcm9ncmFtIG1vcmUgKGJ1dCBzaW1pbGFyKQotaW5wdXQgZGF0YSBzbyBpdCB3aWxsIHRha2UgbG9uZ2VyLiAgQW5vdGhlciB3YXkgaXMgdG8gY29tYmluZSB0aGUgZGF0YSBmcm9tCi1zZXZlcmFsIHJ1bnMsIHVzaW5nIHRoZSBAc2FtcHstc30gb3B0aW9uIG9mIEBjb2Rle2dwcm9mfS4gIEhlcmUgaXMgaG93OgotCi1AZW51bWVyYXRlCi1AaXRlbQotUnVuIHlvdXIgcHJvZ3JhbSBvbmNlLgotCi1AaXRlbQotSXNzdWUgdGhlIGNvbW1hbmQgQHNhbXB7bXYgZ21vbi5vdXQgZ21vbi5zdW19LgotCi1AaXRlbQotUnVuIHlvdXIgcHJvZ3JhbSBhZ2FpbiwgdGhlIHNhbWUgYXMgYmVmb3JlLgotCi1AaXRlbQotTWVyZ2UgdGhlIG5ldyBkYXRhIGluIEBmaWxle2dtb24ub3V0fSBpbnRvIEBmaWxle2dtb24uc3VtfSB3aXRoIHRoaXMgY29tbWFuZDoKLQotQGV4YW1wbGUKLWdwcm9mIC1zIEB2YXJ7ZXhlY3V0YWJsZS1maWxlfSBnbW9uLm91dCBnbW9uLnN1bQotQGVuZCBleGFtcGxlCi0KLUBpdGVtCi1SZXBlYXQgdGhlIGxhc3QgdHdvIHN0ZXBzIGFzIG9mdGVuIGFzIHlvdSB3aXNoLgotCi1AaXRlbQotQW5hbHl6ZSB0aGUgY3VtdWxhdGl2ZSBkYXRhIHVzaW5nIHRoaXMgY29tbWFuZDoKLQotQGV4YW1wbGUKLWdwcm9mIEB2YXJ7ZXhlY3V0YWJsZS1maWxlfSBnbW9uLnN1bSA+IEB2YXJ7b3V0cHV0LWZpbGV9Ci1AZW5kIGV4YW1wbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBub2RlIEFzc3VtcHRpb25zLCxTYW1wbGluZyBFcnJvcixJbmFjY3VyYWN5Ci1Ac2VjdGlvbiBFc3RpbWF0aW5nIEBjb2Rle2NoaWxkcmVufSBUaW1lcwotCi1Tb21lIG9mIHRoZSBmaWd1cmVzIGluIHRoZSBjYWxsIGdyYXBoIGFyZSBlc3RpbWF0ZXMtLS1mb3IgZXhhbXBsZSwgdGhlCi1AY29kZXtjaGlsZHJlbn0gdGltZSB2YWx1ZXMgYW5kIGFsbCB0aGUgdGhlIHRpbWUgZmlndXJlcyBpbiBjYWxsZXIgYW5kCi1zdWJyb3V0aW5lIGxpbmVzLgotCi1UaGVyZSBpcyBubyBkaXJlY3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgbWVhc3VyZW1lbnRzIGluIHRoZSBwcm9maWxlCi1kYXRhIGl0c2VsZi4gIEluc3RlYWQsIEBjb2Rle2dwcm9mfSBlc3RpbWF0ZXMgdGhlbSBieSBtYWtpbmcgYW4gYXNzdW1wdGlvbgotYWJvdXQgeW91ciBwcm9ncmFtIHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlIHRydWUuCi0KLVRoZSBhc3N1bXB0aW9uIG1hZGUgaXMgdGhhdCB0aGUgYXZlcmFnZSB0aW1lIHNwZW50IGluIGVhY2ggY2FsbCB0byBhbnkKLWZ1bmN0aW9uIEBjb2Rle2Zvb30gaXMgbm90IGNvcnJlbGF0ZWQgd2l0aCB3aG8gY2FsbGVkIEBjb2Rle2Zvb30uICBJZgotQGNvZGV7Zm9vfSB1c2VkIDUgc2Vjb25kcyBpbiBhbGwsIGFuZCAyLzUgb2YgdGhlIGNhbGxzIHRvIEBjb2Rle2Zvb30gY2FtZQotZnJvbSBAY29kZXthfSwgdGhlbiBAY29kZXtmb299IGNvbnRyaWJ1dGVzIDIgc2Vjb25kcyB0byBAY29kZXthfSdzCi1AY29kZXtjaGlsZHJlbn0gdGltZSwgYnkgYXNzdW1wdGlvbi4KLQotVGhpcyBhc3N1bXB0aW9uIGlzIHVzdWFsbHkgdHJ1ZSBlbm91Z2gsIGJ1dCBmb3Igc29tZSBwcm9ncmFtcyBpdCBpcyBmYXIKLWZyb20gdHJ1ZS4gIFN1cHBvc2UgdGhhdCBAY29kZXtmb299IHJldHVybnMgdmVyeSBxdWlja2x5IHdoZW4gaXRzIGFyZ3VtZW50Ci1pcyB6ZXJvOyBzdXBwb3NlIHRoYXQgQGNvZGV7YX0gYWx3YXlzIHBhc3NlcyB6ZXJvIGFzIGFuIGFyZ3VtZW50LCB3aGlsZQotb3RoZXIgY2FsbGVycyBvZiBAY29kZXtmb299IHBhc3Mgb3RoZXIgYXJndW1lbnRzLiAgSW4gdGhpcyBwcm9ncmFtLCBhbGwgdGhlCi10aW1lIHNwZW50IGluIEBjb2Rle2Zvb30gaXMgaW4gdGhlIGNhbGxzIGZyb20gY2FsbGVycyBvdGhlciB0aGFuIEBjb2Rle2F9LgotQnV0IEBjb2Rle2dwcm9mfSBoYXMgbm8gd2F5IG9mIGtub3dpbmcgdGhpczsgaXQgd2lsbCBibGluZGx5IGFuZAotaW5jb3JyZWN0bHkgY2hhcmdlIDIgc2Vjb25kcyBvZiB0aW1lIGluIEBjb2Rle2Zvb30gdG8gdGhlIGNoaWxkcmVuIG9mCi1AY29kZXthfS4KLQotQGMgRklYTUUgLSBoYXMgdGhpcyBiZWVuIGZpeGVkPwotV2UgaG9wZSBzb21lIGRheSB0byBwdXQgbW9yZSBjb21wbGV0ZSBkYXRhIGludG8gQGZpbGV7Z21vbi5vdXR9LCBzbyB0aGF0Ci10aGlzIGFzc3VtcHRpb24gaXMgbm8gbG9uZ2VyIG5lZWRlZCwgaWYgd2UgY2FuIGZpZ3VyZSBvdXQgaG93LiAgRm9yIHRoZQotbm9uY2UsIHRoZSBlc3RpbWF0ZWQgZmlndXJlcyBhcmUgdXN1YWxseSBtb3JlIHVzZWZ1bCB0aGFuIG1pc2xlYWRpbmcuCi0KLUBub2RlIEhvdyBkbyBJPwotQGNoYXB0ZXIgQW5zd2VycyB0byBDb21tb24gUXVlc3Rpb25zCi0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gSG93IGRvIEkgZmluZCB3aGljaCBsaW5lcyBpbiBteSBwcm9ncmFtIHdlcmUgZXhlY3V0ZWQgdGhlIG1vc3QgdGltZXM/Ci0KLUNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggYmFzaWMtYmxvY2sgY291bnRpbmcgZW5hYmxlZCwgcnVuIGl0LCB0aGVuCi11c2UgdGhlIGZvbGxvd2luZyBwaXBlbGluZToKLQotQGV4YW1wbGUKLWdwcm9mIC1sIC1DIEB2YXJ7b2JqZmlsZX0gfCBzb3J0IC1rIDMgLW4gLXIKLUBlbmQgZXhhbXBsZQotCi1UaGlzIGxpc3Rpbmcgd2lsbCBzaG93IHlvdSB0aGUgbGluZXMgaW4geW91ciBjb2RlIGV4ZWN1dGVkIG1vc3Qgb2Z0ZW4sCi1idXQgbm90IG5lY2Vzc2FyaWx5IHRob3NlIHRoYXQgY29uc3VtZWQgdGhlIG1vc3QgdGltZS4KLQotQGl0ZW0gSG93IGRvIEkgZmluZCB3aGljaCBsaW5lcyBpbiBteSBwcm9ncmFtIGNhbGxlZCBhIHBhcnRpY3VsYXIgZnVuY3Rpb24/Ci0KLVVzZSBAY29kZXtncHJvZiAtbH0gYW5kIGxvb2t1cCB0aGUgZnVuY3Rpb24gaW4gdGhlIGNhbGwgZ3JhcGguCi1UaGUgY2FsbGVycyB3aWxsIGJlIGJyb2tlbiBkb3duIGJ5IGZ1bmN0aW9uIGFuZCBsaW5lIG51bWJlci4KLQotQGl0ZW0gSG93IGRvIEkgYW5hbHl6ZSBhIHByb2dyYW0gdGhhdCBydW5zIGZvciBsZXNzIHRoYW4gYSBzZWNvbmQ/Ci0KLVRyeSB1c2luZyBhIHNoZWxsIHNjcmlwdCBsaWtlIHRoaXMgb25lOgotCi1AZXhhbXBsZQotZm9yIGkgaW4gYHNlcSAxIDEwMGA7IGRvCi0gIGZhc3Rwcm9nCi0gIG12IGdtb24ub3V0IGdtb24ub3V0LiRpCi1kb25lCi0KLWdwcm9mIC1zIGZhc3Rwcm9nIGdtb24ub3V0LioKLQotZ3Byb2YgZmFzdHByb2cgZ21vbi5zdW0KLUBlbmQgZXhhbXBsZQotCi1JZiB5b3VyIHByb2dyYW0gaXMgY29tcGxldGVseSBkZXRlcm1pbmlzdGljLCBhbGwgdGhlIGNhbGwgY291bnRzCi13aWxsIGJlIHNpbXBsZSBtdWx0aXBsZXMgb2YgMTAwIChpLmUuIGEgZnVuY3Rpb24gY2FsbGVkIG9uY2UgaW4KLWVhY2ggcnVuIHdpbGwgYXBwZWFyIHdpdGggYSBjYWxsIGNvdW50IG9mIDEwMCkuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5jb21wYXRpYmlsaXRpZXMKLUBjaGFwdGVyIEluY29tcGF0aWJpbGl0aWVzIHdpdGggVW5peCBAY29kZXtncHJvZn0KLQotQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFuZCBCZXJrZWxleSBVbml4IEBjb2Rle2dwcm9mfSB1c2UgdGhlIHNhbWUgZGF0YQotZmlsZSBAZmlsZXtnbW9uLm91dH0sIGFuZCBwcm92aWRlIGVzc2VudGlhbGx5IHRoZSBzYW1lIGluZm9ybWF0aW9uLiAgQnV0Ci10aGVyZSBhcmUgYSBmZXcgZGlmZmVyZW5jZXMuCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Ac2N7Z251fSBAY29kZXtncHJvZn0gdXNlcyBhIG5ldywgZ2VuZXJhbGl6ZWQgZmlsZSBmb3JtYXQgd2l0aCBzdXBwb3J0Ci1mb3IgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBhbmQgbm9uLXJlYWx0aW1lIGhpc3RvZ3JhbXMuICBBIG1hZ2ljCi1jb29raWUgYW5kIHZlcnNpb24gbnVtYmVyIGFsbG93cyBAY29kZXtncHJvZn0gdG8gZWFzaWx5IGlkZW50aWZ5Ci1uZXcgc3R5bGUgZmlsZXMuICBPbGQgQlNELXN0eWxlIGZpbGVzIGNhbiBzdGlsbCBiZSByZWFkLgotQHhyZWZ7RmlsZSBGb3JtYXR9LgotCi1AaXRlbQotRm9yIGEgcmVjdXJzaXZlIGZ1bmN0aW9uLCBVbml4IEBjb2Rle2dwcm9mfSBsaXN0cyB0aGUgZnVuY3Rpb24gYXMgYQotcGFyZW50IGFuZCBhcyBhIGNoaWxkLCB3aXRoIGEgQGNvZGV7Y2FsbHN9IGZpZWxkIHRoYXQgbGlzdHMgdGhlIG51bWJlcgotb2YgcmVjdXJzaXZlIGNhbGxzLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IG9taXRzIHRoZXNlIGxpbmVzIGFuZCBwdXRzCi10aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscyBpbiB0aGUgcHJpbWFyeSBsaW5lLgotCi1AaXRlbQotV2hlbiBhIGZ1bmN0aW9uIGlzIHN1cHByZXNzZWQgZnJvbSB0aGUgY2FsbCBncmFwaCB3aXRoIEBzYW1wey1lfSwgQHNje2dudX0KLUBjb2Rle2dwcm9mfSBzdGlsbCBsaXN0cyBpdCBhcyBhIHN1YnJvdXRpbmUgb2YgZnVuY3Rpb25zIHRoYXQgY2FsbCBpdC4KLQotQGl0ZW0KLUBzY3tnbnV9IEBjb2Rle2dwcm9mfSBhY2NlcHRzIHRoZSBAc2FtcHsta30gd2l0aCBpdHMgYXJndW1lbnQKLWluIHRoZSBmb3JtIEBzYW1we2Zyb20vdG99LCBpbnN0ZWFkIG9mIEBzYW1we2Zyb20gdG99LgotCi1AaXRlbQotSW4gdGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZywKLWlmIHRoZXJlIGFyZSBtdWx0aXBsZSBiYXNpYyBibG9ja3Mgb24gdGhlIHNhbWUgbGluZSwKLUBzY3tnbnV9IEBjb2Rle2dwcm9mfSBwcmludHMgYWxsIG9mIHRoZWlyIGNvdW50cywgc2VwZXJhdGVkIGJ5IGNvbW1hcy4KLQotQGlnbm9yZSAtIGl0IGRvZXMgdGhpcyBub3cKLUBpdGVtCi1UaGUgZnVuY3Rpb24gbmFtZXMgcHJpbnRlZCBpbiBAc2N7Z251fSBAY29kZXtncHJvZn0gb3V0cHV0IGRvIG5vdCBpbmNsdWRlCi10aGUgbGVhZGluZyB1bmRlcnNjb3JlcyB0aGF0IGFyZSBhZGRlZCBpbnRlcm5hbGx5IHRvIHRoZSBmcm9udCBvZiBhbGwKLUMgaWRlbnRpZmllcnMgb24gbWFueSBvcGVyYXRpbmcgc3lzdGVtcy4KLUBlbmQgaWdub3JlCi0KLUBpdGVtCi1UaGUgYmx1cmJzLCBmaWVsZCB3aWR0aHMsIGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUgZGlmZmVyZW50LiAgQHNje2dudX0KLUBjb2Rle2dwcm9mfSBwcmludHMgYmx1cmJzIGFmdGVyIHRoZSB0YWJsZXMsIHNvIHRoYXQgeW91IGNhbiBzZWUgdGhlCi10YWJsZXMgd2l0aG91dCBza2lwcGluZyB0aGUgYmx1cmJzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIERldGFpbHMKLUBjaGFwdGVyIERldGFpbHMgb2YgUHJvZmlsaW5nCi0KLUBtZW51Ci0qIEltcGxlbWVudGF0aW9uOjogICAgICBIb3cgYSBwcm9ncmFtIGNvbGxldHMgcHJvZmlsaW5nIGluZm9ybWF0aW9uCi0qIEZpbGUgRm9ybWF0OjogICAgICAgICBGb3JtYXQgb2YgQHNhbXB7Z21vbi5vdXR9IGZpbGVzCi0qIEludGVybmFsczo6ICAgICAgICAgICBAY29kZXtncHJvZn0ncyBpbnRlcm5hbCBvcGVyYXRpb24KLSogRGVidWdnaW5nOjogICAgICAgICAgIFVzaW5nIEBjb2Rle2dwcm9mfSdzIEBzYW1wey1kfSBvcHRpb24KLUBlbmQgbWVudQotCi1Abm9kZSBJbXBsZW1lbnRhdGlvbixGaWxlIEZvcm1hdCwsRGV0YWlscwotQHNlY3Rpb24gSW1wbGVtZW50YXRpb24gb2YgUHJvZmlsaW5nCi0KLVByb2ZpbGluZyB3b3JrcyBieSBjaGFuZ2luZyBob3cgZXZlcnkgZnVuY3Rpb24gaW4geW91ciBwcm9ncmFtIGlzIGNvbXBpbGVkCi1zbyB0aGF0IHdoZW4gaXQgaXMgY2FsbGVkLCBpdCB3aWxsIHN0YXNoIGF3YXkgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZQotaXQgd2FzIGNhbGxlZCBmcm9tLiAgRnJvbSB0aGlzLCB0aGUgcHJvZmlsZXIgY2FuIGZpZ3VyZSBvdXQgd2hhdCBmdW5jdGlvbgotY2FsbGVkIGl0LCBhbmQgY2FuIGNvdW50IGhvdyBtYW55IHRpbWVzIGl0IHdhcyBjYWxsZWQuICBUaGlzIGNoYW5nZSBpcyBtYWRlCi1ieSB0aGUgY29tcGlsZXIgd2hlbiB5b3VyIHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aCB0aGUgQHNhbXB7LXBnfSBvcHRpb24sCi13aGljaCBjYXVzZXMgZXZlcnkgZnVuY3Rpb24gdG8gY2FsbCBAY29kZXttY291bnR9Ci0ob3IgQGNvZGV7X21jb3VudH0sIG9yIEBjb2Rle19fbWNvdW50fSwgZGVwZW5kaW5nIG9uIHRoZSBPUyBhbmQgY29tcGlsZXIpCi1hcyBvbmUgb2YgaXRzIGZpcnN0IG9wZXJhdGlvbnMuCi0KLVRoZSBAY29kZXttY291bnR9IHJvdXRpbmUsIGluY2x1ZGVkIGluIHRoZSBwcm9maWxpbmcgbGlicmFyeSwKLWlzIHJlc3BvbnNpYmxlIGZvciByZWNvcmRpbmcgaW4gYW4gaW4tbWVtb3J5IGNhbGwgZ3JhcGggdGFibGUKLWJvdGggaXRzIHBhcmVudCByb3V0aW5lICh0aGUgY2hpbGQpIGFuZCBpdHMgcGFyZW50J3MgcGFyZW50LiAgVGhpcyBpcwotdHlwaWNhbGx5IGRvbmUgYnkgZXhhbWluaW5nIHRoZSBzdGFjayBmcmFtZSB0byBmaW5kIGJvdGgKLXRoZSBhZGRyZXNzIG9mIHRoZSBjaGlsZCwgYW5kIHRoZSByZXR1cm4gYWRkcmVzcyBpbiB0aGUgb3JpZ2luYWwgcGFyZW50LgotU2luY2UgdGhpcyBpcyBhIHZlcnkgbWFjaGluZS1kZXBlbmRhbnQgb3BlcmF0aW9uLCBAY29kZXttY291bnR9Ci1pdHNlbGYgaXMgdHlwaWNhbGx5IGEgc2hvcnQgYXNzZW1ibHktbGFuZ3VhZ2Ugc3R1YiByb3V0aW5lCi10aGF0IGV4dHJhY3RzIHRoZSByZXF1aXJlZAotaW5mb3JtYXRpb24sIGFuZCB0aGVuIGNhbGxzIEBjb2Rle19fbWNvdW50X2ludGVybmFsfQotKGEgbm9ybWFsIEMgZnVuY3Rpb24pIHdpdGggdHdvIGFyZ3VtZW50cyAtIEBjb2Rle2Zyb21wY30gYW5kIEBjb2Rle3NlbGZwY30uCi1AY29kZXtfX21jb3VudF9pbnRlcm5hbH0gaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nCi10aGUgaW4tbWVtb3J5IGNhbGwgZ3JhcGgsIHdoaWNoIHJlY29yZHMgQGNvZGV7ZnJvbXBjfSwgQGNvZGV7c2VsZnBjfSwKLWFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggb2YgdGhlc2UgY2FsbCBhcmNzIHdhcyB0cmFuc3ZlcnNlZC4KLQotR0NDIFZlcnNpb24gMiBwcm92aWRlcyBhIG1hZ2ljYWwgZnVuY3Rpb24gKEBjb2Rle19fYnVpbHRpbl9yZXR1cm5fYWRkcmVzc30pLAotd2hpY2ggYWxsb3dzIGEgZ2VuZXJpYyBAY29kZXttY291bnR9IGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCi1yZXF1aXJlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFjayBmcmFtZS4gIEhvd2V2ZXIsIG9uIHNvbWUKLWFyY2hpdGVjdHVyZXMsIG1vc3Qgbm90YWJseSB0aGUgU1BBUkMsIHVzaW5nIHRoaXMgYnVpbHRpbiBjYW4gYmUKLXZlcnkgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSwgYW5kIGFuIGFzc2VtYmx5IGxhbmd1YWdlIHZlcnNpb24KLW9mIEBjb2Rle21jb3VudH0gaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLQotTnVtYmVyLW9mLWNhbGxzIGluZm9ybWF0aW9uIGZvciBsaWJyYXJ5IHJvdXRpbmVzIGlzIGNvbGxlY3RlZCBieSB1c2luZyBhCi1zcGVjaWFsIHZlcnNpb24gb2YgdGhlIEMgbGlicmFyeS4gIFRoZSBwcm9ncmFtcyBpbiBpdCBhcmUgdGhlIHNhbWUgYXMgaW4KLXRoZSB1c3VhbCBDIGxpYnJhcnksIGJ1dCB0aGV5IHdlcmUgY29tcGlsZWQgd2l0aCBAc2FtcHstcGd9LiAgSWYgeW91Ci1saW5rIHlvdXIgcHJvZ3JhbSB3aXRoIEBzYW1we2djYyBAZG90c3t9IC1wZ30sIGl0IGF1dG9tYXRpY2FsbHkgdXNlcyB0aGUKLXByb2ZpbGluZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgotCi1Qcm9maWxpbmcgYWxzbyBpbnZvbHZlcyB3YXRjaGluZyB5b3VyIHByb2dyYW0gYXMgaXQgcnVucywgYW5kIGtlZXBpbmcgYQotaGlzdG9ncmFtIG9mIHdoZXJlIHRoZSBwcm9ncmFtIGNvdW50ZXIgaGFwcGVucyB0byBiZSBldmVyeSBub3cgYW5kIHRoZW4uCi1UeXBpY2FsbHkgdGhlIHByb2dyYW0gY291bnRlciBpcyBsb29rZWQgYXQgYXJvdW5kIDEwMCB0aW1lcyBwZXIgc2Vjb25kIG9mCi1ydW4gdGltZSwgYnV0IHRoZSBleGFjdCBmcmVxdWVuY3kgbWF5IHZhcnkgZnJvbSBzeXN0ZW0gdG8gc3lzdGVtLgotCi1UaGlzIGlzIGRvbmUgaXMgb25lIG9mIHR3byB3YXlzLiAgTW9zdCBVTklYLWxpa2Ugb3BlcmF0aW5nIHN5c3RlbXMKLXByb3ZpZGUgYSBAY29kZXtwcm9maWwoKX0gc3lzdGVtIGNhbGwsIHdoaWNoIHJlZ2lzdGVycyBhIG1lbW9yeQotYXJyYXkgd2l0aCB0aGUga2VybmVsLCBhbG9uZyB3aXRoIGEgc2NhbGUKLWZhY3RvciB0aGF0IGRldGVybWluZXMgaG93IHRoZSBwcm9ncmFtJ3MgYWRkcmVzcyBzcGFjZSBtYXBzCi1pbnRvIHRoZSBhcnJheS4KLVR5cGljYWwgc2NhbGluZyB2YWx1ZXMgY2F1c2UgZXZlcnkgMiB0byA4IGJ5dGVzIG9mIGFkZHJlc3Mgc3BhY2UKLXRvIG1hcCBpbnRvIGEgc2luZ2xlIGFycmF5IHNsb3QuCi1PbiBldmVyeSB0aWNrIG9mIHRoZSBzeXN0ZW0gY2xvY2sKLShhc3N1bWluZyB0aGUgcHJvZmlsZWQgcHJvZ3JhbSBpcyBydW5uaW5nKSwgdGhlIHZhbHVlIG9mIHRoZQotcHJvZ3JhbSBjb3VudGVyIGlzIGV4YW1pbmVkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzbG90IGluCi10aGUgbWVtb3J5IGFycmF5IGlzIGluY3JlbWVudGVkLiAgU2luY2UgdGhpcyBpcyBkb25lIGluIHRoZSBrZXJuZWwsCi13aGljaCBoYWQgdG8gaW50ZXJydXB0IHRoZSBwcm9jZXNzIGFueXdheSB0byBoYW5kbGUgdGhlIGNsb2NrCi1pbnRlcnJ1cHQsIHZlcnkgbGl0dGxlIGFkZGl0aW9uYWwgc3lzdGVtIG92ZXJoZWFkIGlzIHJlcXVpcmVkLgotCi1Ib3dldmVyLCBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCBtb3N0IG5vdGFibHkgTGludXggMi4wIChhbmQgZWFybGllciksCi1kbyBub3QgcHJvdmlkZSBhIEBjb2Rle3Byb2ZpbCgpfSBzeXN0ZW0gY2FsbC4gIE9uIHN1Y2ggYSBzeXN0ZW0sCi1hcnJhbmdlbWVudHMgYXJlIG1hZGUgZm9yIHRoZSBrZXJuZWwgdG8gcGVyaW9kaWNhbGx5IGRlbGl2ZXIKLWEgc2lnbmFsIHRvIHRoZSBwcm9jZXNzICh0eXBpY2FsbHkgdmlhIEBjb2Rle3NldGl0aW1lcigpfSksCi13aGljaCB0aGVuIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBvZiBleGFtaW5pbmcgdGhlCi1wcm9ncmFtIGNvdW50ZXIgYW5kIGluY3JlbWVudGluZyBhIHNsb3QgaW4gdGhlIG1lbW9yeSBhcnJheS4KLVNpbmNlIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGEgc2lnbmFsIHRvIGJlIGRlbGl2ZXJlZCB0bwotdXNlciBzcGFjZSBldmVyeSB0aW1lIGEgc2FtcGxlIGlzIHRha2VuLCBpdCB1c2VzIGNvbnNpZGVyYWJseQotbW9yZSBvdmVyaGVhZCB0aGFuIGtlcm5lbC1iYXNlZCBwcm9maWxpbmcuICBBbHNvLCBkdWUgdG8gdGhlCi1hZGRlZCBkZWxheSByZXF1aXJlZCB0byBkZWxpdmVyIHRoZSBzaWduYWwsIHRoaXMgbWV0aG9kIGlzCi1sZXNzIGFjY3VyYXRlIGFzIHdlbGwuCi0KLUEgc3BlY2lhbCBzdGFydHVwIHJvdXRpbmUgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlIGhpc3RvZ3JhbSBhbmQgCi1laXRoZXIgY2FsbHMgQGNvZGV7cHJvZmlsKCl9IG9yIHNldHMgdXAKLWEgY2xvY2sgc2lnbmFsIGhhbmRsZXIuCi1UaGlzIHJvdXRpbmUgKEBjb2Rle21vbnN0YXJ0dXB9KSBjYW4gYmUgaW52b2tlZCBpbiBzZXZlcmFsIHdheXMuCi1PbiBMaW51eCBzeXN0ZW1zLCBhIHNwZWNpYWwgcHJvZmlsaW5nIHN0YXJ0dXAgZmlsZSBAY29kZXtnY3J0MC5vfSwKLXdoaWNoIGludm9rZXMgQGNvZGV7bW9uc3RhcnR1cH0gYmVmb3JlIEBjb2Rle21haW59LAotaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IEBjb2Rle2NydDAub30uCi1Vc2Ugb2YgdGhpcyBzcGVjaWFsIHN0YXJ0dXAgZmlsZSBpcyBvbmUgb2YgdGhlIGVmZmVjdHMKLW9mIHVzaW5nIEBzYW1we2djYyBAZG90c3t9IC1wZ30gdG8gbGluay4KLU9uIFNQQVJDIHN5c3RlbXMsIG5vIHNwZWNpYWwgc3RhcnR1cCBmaWxlcyBhcmUgdXNlZC4KLVJhdGhlciwgdGhlIEBjb2Rle21jb3VudH0gcm91dGluZSwgd2hlbiBpdCBpcyBpbnZva2VkIGZvcgotdGhlIGZpcnN0IHRpbWUgKHR5cGljYWxseSB3aGVuIEBjb2Rle21haW59IGlzIGNhbGxlZCksCi1jYWxscyBAY29kZXttb25zdGFydHVwfS4KLQotSWYgdGhlIGNvbXBpbGVyJ3MgQHNhbXB7LWF9IG9wdGlvbiB3YXMgdXNlZCwgYmFzaWMtYmxvY2sgY291bnRpbmcKLWlzIGFsc28gZW5hYmxlZC4gIEVhY2ggb2JqZWN0IGZpbGUgaXMgdGhlbiBjb21waWxlZCB3aXRoIGEgc3RhdGljIGFycmF5Ci1vZiBjb3VudHMsIGluaXRpYWxseSB6ZXJvLgotSW4gdGhlIGV4ZWN1dGFibGUgY29kZSwgZXZlcnkgdGltZSBhIG5ldyBiYXNpYy1ibG9jayBiZWdpbnMKLShpLmUuIHdoZW4gYW4gQGNvZGV7aWZ9IHN0YXRlbWVudCBhcHBlYXJzKSwgYW4gZXh0cmEgaW5zdHJ1Y3Rpb24KLWlzIGluc2VydGVkIHRvIGluY3JlbWVudCB0aGUgY29ycmVzcG9uZGluZyBjb3VudCBpbiB0aGUgYXJyYXkuCi1BdCBjb21waWxlIHRpbWUsIGEgcGFpcmVkIGFycmF5IHdhcyBjb25zdHJ1Y3RlZCB0aGF0IHJlY29yZGVkCi10aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBlYWNoIGJhc2ljLWJsb2NrLiAgVGFrZW4gdG9nZXRoZXIsCi10aGUgdHdvIGFycmF5cyByZWNvcmQgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgZXZlcnkgYmFzaWMtYmxvY2ssCi1hbG9uZyB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGV4ZWN1dGVkLgotCi1UaGUgcHJvZmlsaW5nIGxpYnJhcnkgYWxzbyBpbmNsdWRlcyBhIGZ1bmN0aW9uIChAY29kZXttY2xlYW51cH0pIHdoaWNoIGlzCi10eXBpY2FsbHkgcmVnaXN0ZXJlZCB1c2luZyBAY29kZXthdGV4aXQoKX0gdG8gYmUgY2FsbGVkIGFzIHRoZQotcHJvZ3JhbSBleGl0cywgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIHRoZSBmaWxlIEBmaWxle2dtb24ub3V0fS4KLVByb2ZpbGluZyBpcyB0dXJuZWQgb2ZmLCB2YXJpb3VzIGhlYWRlcnMgYXJlIG91dHB1dCwgYW5kIHRoZSBoaXN0b2dyYW0KLWlzIHdyaXR0ZW4sIGZvbGxvd2VkIGJ5IHRoZSBjYWxsLWdyYXBoIGFyY3MgYW5kIHRoZSBiYXNpYy1ibG9jayBjb3VudHMuCi0KLVRoZSBvdXRwdXQgZnJvbSBAY29kZXtncHJvZn0gZ2l2ZXMgbm8gaW5kaWNhdGlvbiBvZiBwYXJ0cyBvZiB5b3VyIHByb2dyYW0gdGhhdAotYXJlIGxpbWl0ZWQgYnkgSS9PIG9yIHN3YXBwaW5nIGJhbmR3aWR0aC4gIFRoaXMgaXMgYmVjYXVzZSBzYW1wbGVzIG9mIHRoZQotcHJvZ3JhbSBjb3VudGVyIGFyZSB0YWtlbiBhdCBmaXhlZCBpbnRlcnZhbHMgb2YgdGhlIHByb2dyYW0ncyBydW4gdGltZS4KLVRoZXJlZm9yZSwgdGhlCi10aW1lIG1lYXN1cmVtZW50cyBpbiBAY29kZXtncHJvZn0gb3V0cHV0IHNheSBub3RoaW5nIGFib3V0IHRpbWUgdGhhdCB5b3VyCi1wcm9ncmFtIHdhcyBub3QgcnVubmluZy4gIEZvciBleGFtcGxlLCBhIHBhcnQgb2YgdGhlIHByb2dyYW0gdGhhdCBjcmVhdGVzCi1zbyBtdWNoIGRhdGEgdGhhdCBpdCBjYW5ub3QgYWxsIGZpdCBpbiBwaHlzaWNhbCBtZW1vcnkgYXQgb25jZSBtYXkgcnVuIHZlcnkKLXNsb3dseSBkdWUgdG8gdGhyYXNoaW5nLCBidXQgQGNvZGV7Z3Byb2Z9IHdpbGwgc2F5IGl0IHVzZXMgbGl0dGxlIHRpbWUuICBPbgotdGhlIG90aGVyIGhhbmQsIHNhbXBsaW5nIGJ5IHJ1biB0aW1lIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIGFtb3VudCBvZgotbG9hZCBkdWUgdG8gb3RoZXIgdXNlcnMgd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZSBvdXRwdXQgeW91IGdldC4KLQotQG5vZGUgRmlsZSBGb3JtYXQsSW50ZXJuYWxzLEltcGxlbWVudGF0aW9uLERldGFpbHMKLUBzZWN0aW9uIFByb2ZpbGluZyBEYXRhIEZpbGUgRm9ybWF0Ci0KLVRoZSBvbGQgQlNELWRlcml2ZWQgZmlsZSBmb3JtYXQgdXNlZCBmb3IgcHJvZmlsZSBkYXRhIGRvZXMgbm90IGNvbnRhaW4gYQotbWFnaWMgY29va2llIHRoYXQgYWxsb3dzIHRvIGNoZWNrIHdoZXRoZXIgYSBkYXRhIGZpbGUgcmVhbGx5IGlzIGEKLWdwcm9mIGZpbGUuICBGdXJ0aGVybW9yZSwgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHZlcnNpb24gbnVtYmVyLCB0aHVzCi1yZW5kZXJpbmcgY2hhbmdlcyB0byB0aGUgZmlsZSBmb3JtYXQgYWxtb3N0IGltcG9zc2libGUuICBAc2N7Z251fSBAY29kZXtncHJvZn0KLXVzZXMgYSBuZXcgZmlsZSBmb3JtYXQgdGhhdCBwcm92aWRlcyB0aGVzZSBmZWF0dXJlcy4gIEZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSwgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGNvbnRpbnVlcyB0byBzdXBwb3J0IHRoZSBvbGQgQlNELWRlcml2ZWQKLWZvcm1hdCwgYnV0IG5vdCBhbGwgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCB3aXRoIGl0LiAgRm9yIGV4YW1wbGUsCi1iYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGNhbm5vdCBiZSBhY2NvbW1vZGF0ZWQgYnkgdGhlIG9sZCBmaWxlCi1mb3JtYXQuCi0KLVRoZSBuZXcgZmlsZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZSBAZmlsZXtnbW9uX291dC5ofS4gIEl0Ci1jb25zaXN0cyBvZiBhIGhlYWRlciBjb250YWluaW5nIHRoZSBtYWdpYyBjb29raWUgYW5kIGEgdmVyc2lvbiBudW1iZXIsCi1hcyB3ZWxsIGFzIHNvbWUgc3BhcmUgYnl0ZXMgYXZhaWxhYmxlIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4gIEFsbCBkYXRhCi1pbiBhIHByb2ZpbGUgZGF0YSBmaWxlIGlzIGluIHRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZSBob3N0IG9uIHdoaWNoCi10aGUgcHJvZmlsZSB3YXMgY29sbGVjdGVkLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFkYXB0cyBhdXRvbWF0aWNhbGx5IHRvIHRoZQotYnl0ZS1vcmRlciBpbiB1c2UuCi0KLUluIHRoZSBuZXcgZmlsZSBmb3JtYXQsIHRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZgotcmVjb3Jkcy4gIEN1cnJlbnRseSwgdGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCByZWNvcmQgdHlwZXM6IGhpc3RvZ3JhbQotcmVjb3JkcywgY2FsbC1ncmFwaCBhcmMgcmVjb3JkcywgYW5kIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudAotcmVjb3Jkcy4gIEVhY2ggZmlsZSBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIGVhY2ggcmVjb3JkIHR5cGUuICBXaGVuCi1yZWFkaW5nIGEgZmlsZSwgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHdpbGwgZW5zdXJlIHJlY29yZHMgb2YgdGhlIHNhbWUgdHlwZSBhcmUKLWNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGFuZCBjb21wdXRlIHRoZSB1bmlvbiBvZiBhbGwgcmVjb3Jkcy4gIEZvcgotZXhhbXBsZSwgZm9yIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMsIHRoZSB1bmlvbiBpcyBzaW1wbHkgdGhlIHN1bQotb2YgYWxsIGV4ZWN1dGlvbiBjb3VudHMgZm9yIGVhY2ggYmFzaWMtYmxvY2suCi0KLUBzdWJzZWN0aW9uIEhpc3RvZ3JhbSBSZWNvcmRzCi0KLUhpc3RvZ3JhbSByZWNvcmRzIGNvbnNpc3Qgb2YgYSBoZWFkZXIgdGhhdCBpcyBmb2xsb3dlZCBieSBhbiBhcnJheSBvZgotYmlucy4gIFRoZSBoZWFkZXIgY29udGFpbnMgdGhlIHRleHQtc2VnbWVudCByYW5nZSB0aGF0IHRoZSBoaXN0b2dyYW0KLXNwYW5zLCB0aGUgc2l6ZSBvZiB0aGUgaGlzdG9ncmFtIGluIGJ5dGVzICh1bmxpa2UgaW4gdGhlIG9sZCBCU0QKLWZvcm1hdCwgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIpLCB0aGUgcmF0ZSBvZiB0aGUKLXByb2ZpbGluZyBjbG9jaywgYW5kIHRoZSBwaHlzaWNhbCBkaW1lbnNpb24gdGhhdCB0aGUgYmluIGNvdW50cwotcmVwcmVzZW50IGFmdGVyIGJlaW5nIHNjYWxlZCBieSB0aGUgcHJvZmlsaW5nIGNsb2NrIHJhdGUuICBUaGUKLXBoeXNpY2FsIGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdHdvIHBhcnRzOiBhIGxvbmcgbmFtZSBvZiB1cCB0byAxNQotY2hhcmFjdGVycyBhbmQgYSBzaW5nbGUgY2hhcmFjdGVyIGFiYnJldmlhdGlvbi4gIEZvciBleGFtcGxlLCBhCi1oaXN0b2dyYW0gcmVwcmVzZW50aW5nIHJlYWwtdGltZSB3b3VsZCBzcGVjaWZ5IHRoZSBsb25nIG5hbWUgYXMKLSJzZWNvbmRzIiBhbmQgdGhlIGFiYnJldmlhdGlvbiBhcyAicyIuICBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIGZvcgotYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgcGVyZm9ybWFuY2UgbW9uaXRvciBoYXJkd2FyZSAod2hpY2gsCi1mb3J0dW5hdGVseSwgaXMgYmVjb21pbmcgaW5jcmVhc2luZ2x5IGNvbW1vbikuICBGb3IgZXhhbXBsZSwgdW5kZXIgREVDCi1PU0YvMSwgdGhlICJ1cHJvZmlsZSIgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIGEgaGlzdG9ncmFtIG9mLAotc2F5LCBpbnN0cnVjdGlvbiBjYWNoZSBtaXNzZXMuICBJbiB0aGlzIGNhc2UsIHRoZSBkaW1lbnNpb24gaW4gdGhlCi1oaXN0b2dyYW0gaGVhZGVyIGNvdWxkIGJlIHNldCB0byAiaS1jYWNoZSBtaXNzZXMiIGFuZCB0aGUgYWJicmV2aWF0aW9uCi1jb3VsZCBiZSBzZXQgdG8gIjEiIChiZWNhdXNlIGl0IGlzIHNpbXBseSBhIGNvdW50LCBub3QgYSBwaHlzaWNhbAotZGltZW5zaW9uKS4gIEFsc28sIHRoZSBwcm9maWxpbmcgcmF0ZSB3b3VsZCBoYXZlIHRvIGJlIHNldCB0byAxIGluCi10aGlzIGNhc2UuCi0KLUhpc3RvZ3JhbSBiaW5zIGFyZSAxNi1iaXQgbnVtYmVycyBhbmQgZWFjaCBiaW4gcmVwcmVzZW50IGFuIGVxdWFsCi1hbW91bnQgb2YgdGV4dC1zcGFjZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgdGV4dC1zZWdtZW50IGlzIG9uZQotdGhvdXNhbmQgYnl0ZXMgbG9uZyBhbmQgaWYgdGhlcmUgYXJlIHRlbiBiaW5zIGluIHRoZSBoaXN0b2dyYW0sIGVhY2gKLWJpbiByZXByZXNlbnRzIG9uZSBodW5kcmVkIGJ5dGVzLgotCi0KLUBzdWJzZWN0aW9uIENhbGwtR3JhcGggUmVjb3JkcwotCi1DYWxsLWdyYXBoIHJlY29yZHMgaGF2ZSBhIGZvcm1hdCB0aGF0IGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHVzZWQgaW4KLXRoZSBCU0QtZGVyaXZlZCBmaWxlIGZvcm1hdC4gIEl0IGNvbnNpc3RzIG9mIGFuIGFyYyBpbiB0aGUgY2FsbCBncmFwaAotYW5kIGEgY291bnQgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhcmMgd2FzIHRyYXZlcnNlZAotZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLiAgQXJjcyBhcmUgc3BlY2lmaWVkIGJ5IGEgcGFpciBvZiBhZGRyZXNzZXM6Ci10aGUgZmlyc3QgbXVzdCBiZSB3aXRoaW4gY2FsbGVyJ3MgZnVuY3Rpb24gYW5kIHRoZSBzZWNvbmQgbXVzdCBiZQotd2l0aGluIHRoZSBjYWxsZWUncyBmdW5jdGlvbi4gIFdoZW4gcGVyZm9ybWluZyBwcm9maWxpbmcgYXQgdGhlCi1mdW5jdGlvbiBsZXZlbCwgdGhlc2UgYWRkcmVzc2VzIGNhbiBwb2ludCBhbnl3aGVyZSB3aXRoaW4gdGhlCi1yZXNwZWN0aXZlIGZ1bmN0aW9uLiAgSG93ZXZlciwgd2hlbiBwcm9maWxpbmcgYXQgdGhlIGxpbmUtbGV2ZWwsIGl0IGlzCi1iZXR0ZXIgaWYgdGhlIGFkZHJlc3NlcyBhcmUgYXMgY2xvc2UgdG8gdGhlIGNhbGwtc2l0ZS9lbnRyeS1wb2ludCBhcwotcG9zc2libGUuICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGxpbmUtbGV2ZWwgY2FsbC1ncmFwaCBpcyBhYmxlIHRvCi1pZGVudGlmeSBleGFjdGx5IHdoaWNoIGxpbmUgb2Ygc291cmNlIGNvZGUgcGVyZm9ybWVkIGNhbGxzIHRvIGEKLWZ1bmN0aW9uLgotCi1Ac3Vic2VjdGlvbiBCYXNpYy1CbG9jayBFeGVjdXRpb24gQ291bnQgUmVjb3JkcwotCi1CYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQgcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIGZvbGxvd2VkIGJ5IGEKLXNlcXVlbmNlIG9mIGFkZHJlc3MvY291bnQgcGFpcnMuICBUaGUgaGVhZGVyIHNpbXBseSBzcGVjaWZpZXMgdGhlCi1sZW5ndGggb2YgdGhlIHNlcXVlbmNlLiAgSW4gYW4gYWRkcmVzcy9jb3VudCBwYWlyLCB0aGUgYWRkcmVzcwotaWRlbnRpZmllcyBhIGJhc2ljLWJsb2NrIGFuZCB0aGUgY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMKLXRoYXQgYmFzaWMtYmxvY2sgd2FzIGV4ZWN1dGVkLiAgQW55IGFkZHJlc3Mgd2l0aGluIHRoZSBiYXNpYy1hZGRyZXNzIGNhbgotYmUgdXNlZC4KLQotQG5vZGUgSW50ZXJuYWxzLERlYnVnZ2luZyxGaWxlIEZvcm1hdCxEZXRhaWxzCi1Ac2VjdGlvbiBAY29kZXtncHJvZn0ncyBJbnRlcm5hbCBPcGVyYXRpb24KLQotTGlrZSBtb3N0IHByb2dyYW1zLCBAY29kZXtncHJvZn0gYmVnaW5zIGJ5IHByb2Nlc3NpbmcgaXRzIG9wdGlvbnMuCi1EdXJpbmcgdGhpcyBzdGFnZSwgaXQgbWF5IGJ1aWxkaW5nIGl0cyBzeW1zcGVjIGxpc3QKLShAY29kZXtzeW1faWRzLmM6c3ltX2lkX2FkZH0pLCBpZgotb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHdoaWNoIHVzZSBzeW1zcGVjcy4KLUBjb2Rle2dwcm9mfSBtYWludGFpbnMgYSBzaW5nbGUgbGlua2VkIGxpc3Qgb2Ygc3ltc3BlY3MsCi13aGljaCB3aWxsIGV2ZW50dWFsbHkgZ2V0IHR1cm5lZCBpbnRvIDEyIHN5bWJvbCB0YWJsZXMsCi1vcmdhbml6ZWQgaW50byBzaXggaW5jbHVkZS9leGNsdWRlIHBhaXJzIC0gb25lCi1wYWlyIGVhY2ggZm9yIHRoZSBmbGF0IHByb2ZpbGUgKElOQ0xfRkxBVC9FWENMX0ZMQVQpLAotdGhlIGNhbGwgZ3JhcGggYXJjcyAoSU5DTF9BUkNTL0VYQ0xfQVJDUyksCi1wcmludGluZyBpbiB0aGUgY2FsbCBncmFwaCAoSU5DTF9HUkFQSC9FWENMX0dSQVBIKSwKLXRpbWluZyBwcm9wYWdhdGlvbiBpbiB0aGUgY2FsbCBncmFwaCAoSU5DTF9USU1FL0VYQ0xfVElNRSksCi10aGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIChJTkNMX0FOTk8vRVhDTF9BTk5PKSwKLWFuZCB0aGUgZXhlY3V0aW9uIGNvdW50IGxpc3RpbmcgKElOQ0xfRVhFQy9FWENMX0VYRUMpLgotCi1BZnRlciBvcHRpb24gcHJvY2Vzc2luZywgQGNvZGV7Z3Byb2Z9IGZpbmlzaGVzCi1idWlsZGluZyB0aGUgc3ltc3BlYyBsaXN0IGJ5IGFkZGluZyBhbGwgdGhlIHN5bXNwZWNzIGluCi1AY29kZXtkZWZhdWx0X2V4Y2x1ZGVkX2xpc3R9IHRvIHRoZSBleGNsdWRlIGxpc3RzCi1FWENMX1RJTUUgYW5kIEVYQ0xfR1JBUEgsIGFuZCBpZiBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIGlzIHNwZWNpZmllZCwKLUVYQ0xfRkxBVCBhcyB3ZWxsLgotVGhlc2UgZGVmYXVsdCBleGNsdWRlcyBhcmUgbm90IGFkZGVkIHRvIEVYQ0xfQU5OTywgRVhDTF9BUkNTLCBhbmQgRVhDTF9FWEVDLgotCi1OZXh0LCB0aGUgQkZEIGxpYnJhcnkgaXMgY2FsbGVkIHRvIG9wZW4gdGhlIG9iamVjdCBmaWxlLAotdmVyaWZ5IHRoYXQgaXQgaXMgYW4gb2JqZWN0IGZpbGUsCi1hbmQgcmVhZCBpdHMgc3ltYm9sIHRhYmxlIChAY29kZXtjb3JlLmM6Y29yZV9pbml0fSksCi11c2luZyBAY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0gYWZ0ZXIgbWFsbG9jaW5nCi1hbiBhcHByb3BpYXRlIHNpemVkIGFycmF5IG9mIGFzeW1ib2xzLiAgQXQgdGhpcyBwb2ludCwKLWZ1bmN0aW9uIG1hcHBpbmdzIGFyZSByZWFkIChpZiB0aGUgQHNhbXB7LS1maWxlLW9yZGVyaW5nfSBvcHRpb24KLWhhcyBiZWVuIHNwZWNpZmllZCksIGFuZCB0aGUgY29yZSB0ZXh0IHNwYWNlIGlzIHJlYWQgaW50bwotbWVtb3J5IChpZiB0aGUgQHNhbXB7LWN9IG9wdGlvbiB3YXMgZ2l2ZW4pLgotCi1AY29kZXtncHJvZn0ncyBvd24gc3ltYm9sIHRhYmxlLCBhbiBhcnJheSBvZiBTeW0gc3RydWN0dXJlcywKLWlzIG5vdyBidWlsdC4KLVRoaXMgaXMgZG9uZSBpbiBvbmUgb2YgdHdvIHdheXMsIGJ5IG9uZSBvZiB0d28gcm91dGluZXMsIGRlcGVuZGluZwotb24gd2hldGhlciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIChAc2FtcHstbH0gb3B0aW9uKSBoYXMgYmVlbgotZW5hYmxlZC4KLUZvciBub3JtYWwgcHJvZmlsaW5nLCB0aGUgQkZEIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUgaXMgc2Nhbm5lZC4KLUZvciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBldmVyeQotdGV4dCBzcGFjZSBhZGRyZXNzIGlzIGV4YW1pbmVkLCBhbmQgYSBuZXcgc3ltYm9sIHRhYmxlIGVudHJ5Ci1nZXRzIGNyZWF0ZWQgZXZlcnkgdGltZSB0aGUgbGluZSBudW1iZXIgY2hhbmdlcy4KLUluIGVpdGhlciBjYXNlLCB0d28gcGFzc2VzIGFyZSBtYWRlIHRocm91Z2ggdGhlIHN5bWJvbAotdGFibGUgLSBvbmUgdG8gY291bnQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSByZXF1aXJlZCwKLWFuZCB0aGUgb3RoZXIgdG8gYWN0dWFsbHkgcmVhZCB0aGUgc3ltYm9scy4gIEluIGJldHdlZW4gdGhlCi10d28gcGFzc2VzLCBhIHNpbmdsZSBhcnJheSBvZiB0eXBlIEBjb2Rle1N5bX0gaXMgY3JlYXRlZCBvZgotdGhlIGFwcHJvcGlhdGUgbGVuZ3RoLgotRmluYWxseSwgQGNvZGV7c3ltdGFiLmM6c3ltdGFiX2ZpbmFsaXplfQotaXMgY2FsbGVkIHRvIHNvcnQgdGhlIHN5bWJvbCB0YWJsZSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzCi0oZW50cmllcyB3aXRoIHRoZSBzYW1lIG1lbW9yeSBhZGRyZXNzKS4KLQotVGhlIHN5bWJvbCB0YWJsZSBtdXN0IGJlIGEgY29udGlndW91cyBhcnJheSBmb3IgdHdvIHJlYXNvbnMuCi1GaXJzdCwgdGhlIEBjb2Rle3Fzb3J0fSBsaWJyYXJ5IGZ1bmN0aW9uICh3aGljaCBzb3J0cyBhbiBhcnJheSkKLXdpbGwgYmUgdXNlZCB0byBzb3J0IHRoZSBzeW1ib2wgdGFibGUuCi1BbHNvLCB0aGUgc3ltYm9sIGxvb2t1cCByb3V0aW5lIChAY29kZXtzeW10YWIuYzpzeW1fbG9va3VwfSksCi13aGljaCBmaW5kcyBzeW1ib2xzCi1iYXNlZCBvbiBtZW1vcnkgYWRkcmVzcywgdXNlcyBhIGJpbmFyeSBzZWFyY2ggYWxnb3JpdGhtCi13aGljaCByZXF1aXJlcyB0aGUgc3ltYm9sIHRhYmxlIHRvIGJlIGEgc29ydGVkIGFycmF5LgotRnVuY3Rpb24gc3ltYm9scyBhcmUgaW5kaWNhdGVkIHdpdGggYW4gQGNvZGV7aXNfZnVuY30gZmxhZy4KLUxpbmUgbnVtYmVyIHN5bWJvbHMgaGF2ZSBubyBzcGVjaWFsIGZsYWdzIHNldC4KLUFkZGl0aW9uYWxseSwgYSBzeW1ib2wgY2FuIGhhdmUgYW4gQGNvZGV7aXNfc3RhdGljfSBmbGFnCi10byBpbmRpY2F0ZSB0aGF0IGl0IGlzIGEgbG9jYWwgc3ltYm9sLgotCi1XaXRoIHRoZSBzeW1ib2wgdGFibGUgcmVhZCwgdGhlIHN5bXNwZWNzIGNhbiBub3cgYmUgdHJhbnNsYXRlZAotaW50byBTeW1zIChAY29kZXtzeW1faWRzLmM6c3ltX2lkX3BhcnNlfSkuICBSZW1lbWJlciB0aGF0IGEgc2luZ2xlCi1zeW1zcGVjIGNhbiBtYXRjaCBtdWx0aXBsZSBzeW1ib2xzLgotQW4gYXJyYXkgb2Ygc3ltYm9sIHRhYmxlcwotKEBjb2Rle3N5bXN9KSBpcyBjcmVhdGVkLCBlYWNoIGVudHJ5IG9mIHdoaWNoIGlzIGEgc3ltYm9sIHRhYmxlCi1vZiBTeW1zIHRvIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkIGZyb20gYSBwYXJ0aWN1bGFyIGxpc3RpbmcuCi1UaGUgbWFzdGVyIHN5bWJvbCB0YWJsZSBhbmQgdGhlIHN5bXNwZWNzIGFyZSBleGFtaW5lZCBieSBuZXN0ZWQKLWxvb3BzLCBhbmQgZXZlcnkgc3ltYm9sIHRoYXQgbWF0Y2hlcyBhIHN5bXNwZWMgaXMgaW5zZXJ0ZWQKLWludG8gdGhlIGFwcHJvcHJpYXRlIHN5bXMgdGFibGUuICBUaGlzIGlzIGRvbmUgdHdpY2UsIG9uY2UgdG8KLWNvdW50IHRoZSBzaXplIG9mIGVhY2ggcmVxdWlyZWQgc3ltYm9sIHRhYmxlLCBhbmQgYWdhaW4gdG8gYnVpbGQKLXRoZSB0YWJsZXMsIHdoaWNoIGhhdmUgYmVlbiBtYWxsb2NlZCBiZXR3ZWVuIHBhc3Nlcy4KLUZyb20gbm93IG9uLCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN5bWJvbCBpcyBvbiBhbiBpbmNsdWRlCi1vciBleGNsdWRlIHN5bXNwZWMgbGlzdCwgQGNvZGV7Z3Byb2Z9IHNpbXBseSB1c2VzIGl0cwotc3RhbmRhcmQgc3ltYm9sIGxvb2t1cCByb3V0aW5lIG9uIHRoZSBhcHByb3ByaWF0ZSB0YWJsZQotaW4gdGhlIEBjb2Rle3N5bXN9IGFycmF5LgotCi1Ob3cgdGhlIHByb2ZpbGUgZGF0YSBmaWxlKHMpIHRoZW1zZWx2ZXMgYXJlIHJlYWQKLShAY29kZXtnbW9uX2lvLmM6Z21vbl9vdXRfcmVhZH0pLAotZmlyc3QgYnkgY2hlY2tpbmcgZm9yIGEgbmV3LXN0eWxlIEBzYW1we2dtb24ub3V0fSBoZWFkZXIsCi10aGVuIGFzc3VtaW5nIHRoaXMgaXMgYW4gb2xkLXN0eWxlIEJTRCBAc2FtcHtnbW9uLm91dH0KLWlmIHRoZSBtYWdpYyBudW1iZXIgdGVzdCBmYWlsZWQuCi0KLU5ldy1zdHlsZSBoaXN0b2dyYW0gcmVjb3JkcyBhcmUgcmVhZCBieSBAY29kZXtoaXN0LmM6aGlzdF9yZWFkX3JlY30uCi1Gb3IgdGhlIGZpcnN0IGhpc3RvZ3JhbSByZWNvcmQsIGFsbG9jYXRlIGEgbWVtb3J5IGFycmF5IHRvIGhvbGQKLWFsbCB0aGUgYmlucywgYW5kIHJlYWQgdGhlbSBpbi4KLVdoZW4gbXVsdGlwbGUgcHJvZmlsZSBkYXRhIGZpbGVzIChvciBmaWxlcyB3aXRoIG11bHRpcGxlIGhpc3RvZ3JhbQotcmVjb3JkcykgYXJlIHJlYWQsIHRoZSBzdGFydGluZyBhZGRyZXNzLCBlbmRpbmcgYWRkcmVzcywgbnVtYmVyCi1vZiBiaW5zIGFuZCBzYW1wbGluZyByYXRlIG11c3QgbWF0Y2ggYmV0d2VlbiB0aGUgdmFyaW91cyBoaXN0b2dyYW1zLAotb3IgYSBmYXRhbCBlcnJvciB3aWxsIHJlc3VsdC4KLUlmIGV2ZXJ5dGhpbmcgbWF0Y2hlcywganVzdCBzdW0gdGhlIGFkZGl0aW9uYWwgaGlzdG9ncmFtcyBpbnRvCi10aGUgZXhpc3RpbmcgaW4tbWVtb3J5IGFycmF5LgotCi1BcyBlYWNoIGNhbGwgZ3JhcGggcmVjb3JkIGlzIHJlYWQgKEBjb2Rle2NhbGxfZ3JhcGguYzpjZ19yZWFkX3JlY30pLAotdGhlIHBhcmVudCBhbmQgY2hpbGQgYWRkcmVzc2VzCi1hcmUgbWF0Y2hlZCB0byBzeW1ib2wgdGFibGUgZW50cmllcywgYW5kIGEgY2FsbCBncmFwaCBhcmMgaXMKLWNyZWF0ZWQgYnkgQGNvZGV7Y2dfYXJjcy5jOmFyY19hZGR9LCB1bmxlc3MgdGhlIGFyYyBmYWlscyBhIHN5bXNwZWMKLWNoZWNrIGFnYWluc3QgSU5DTF9BUkNTL0VYQ0xfQVJDUy4gIEFzIGVhY2ggYXJjIGlzIGFkZGVkLAotYSBsaW5rZWQgbGlzdCBpcyBtYWludGFpbmVkIG9mIHRoZSBwYXJlbnQncyBjaGlsZCBhcmNzLCBhbmQgb2YgdGhlIGNoaWxkJ3MKLXBhcmVudCBhcmNzLgotQm90aCB0aGUgY2hpbGQncyBjYWxsIGNvdW50IGFuZCB0aGUgYXJjJ3MgY2FsbCBjb3VudCBhcmUKLWluY3JlbWVudGVkIGJ5IHRoZSByZWNvcmQncyBjYWxsIGNvdW50LgotCi1CYXNpYy1ibG9jayByZWNvcmRzIGFyZSByZWFkIChAY29kZXtiYXNpY19ibG9ja3MuYzpiYl9yZWFkX3JlY30pLAotYnV0IG9ubHkgaWYgbGluZS1ieS1saW5lIHByb2ZpbGluZyBoYXMgYmVlbiBzZWxlY3RlZC4KLUVhY2ggYmFzaWMtYmxvY2sgYWRkcmVzcyBpcyBtYXRjaGVkIHRvIGEgY29ycmVzcG9uZGluZyBsaW5lCi1zeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSwgYW5kIGFuIGVudHJ5IG1hZGUgaW4gdGhlIHN5bWJvbCdzCi1iYl9hZGRyIGFuZCBiYl9jYWxscyBhcnJheXMuICBBZ2FpbiwgaWYgbXVsdGlwbGUgYmFzaWMtYmxvY2sKLXJlY29yZHMgYXJlIHByZXNlbnQgZm9yIHRoZSBzYW1lIGFkZHJlc3MsIHRoZSBjYWxsIGNvdW50cwotYXJlIGN1bXVsYXRpdmUuCi0KLUEgZ21vbi5zdW0gZmlsZSBpcyBkdW1wZWQsIGlmIHJlcXVlc3RlZCAoQGNvZGV7Z21vbl9pby5jOmdtb25fb3V0X3dyaXRlfSkuCi0KLUlmIGhpc3RvZ3JhbXMgd2VyZSBwcmVzZW50IGluIHRoZSBkYXRhIGZpbGVzLCBhc3NpZ24gdGhlbSB0byBzeW1ib2xzCi0oQGNvZGV7aGlzdC5jOmhpc3RfYXNzaWduX3NhbXBsZXN9KSBieSBpdGVyYXRpbmcgb3ZlciBhbGwgdGhlIHNhbXBsZQotYmlucyBhbmQgYXNzaWduaW5nIHRoZW0gdG8gc3ltYm9scy4gIFNpbmNlIHRoZSBzeW1ib2wgdGFibGUKLWlzIHNvcnRlZCBpbiBvcmRlciBvZiBhc2NlbmRpbmcgbWVtb3J5IGFkZHJlc3Nlcywgd2UgY2FuCi1zaW1wbGUgZm9sbG93IGFsb25nIGluIHRoZSBzeW1ib2wgdGFibGUgYXMgd2UgbWFrZSBvdXIgcGFzcwotb3ZlciB0aGUgc2FtcGxlIGJpbnMuCi1UaGlzIHN0ZXAgaW5jbHVkZXMgYSBzeW1zcGVjIGNoZWNrIGFnYWluc3QgSU5DTF9GTEFUL0VYQ0xfRkxBVC4KLURlcGVuZGluZyBvbiB0aGUgaGlzdG9ncmFtCi1zY2FsZSBmYWN0b3IsIGEgc2FtcGxlIGJpbiBtYXkgc3BhbiBtdWx0aXBsZSBzeW1ib2xzLAotaW4gd2hpY2ggY2FzZSBhIGZyYWN0aW9uIG9mIHRoZSBzYW1wbGUgY291bnQgaXMgYWxsb2NhdGVkCi10byBlYWNoIHN5bWJvbCwgcHJvcG9ydGlvbmFsIHRvIHRoZSBkZWdyZWUgb2Ygb3ZlcmxhcC4KLVRoaXMgZWZmZWN0IGlzIHJhcmUgZm9yIG5vcm1hbCBwcm9maWxpbmcsIGJ1dCBvdmVybGFwcwotYXJlIG1vcmUgY29tbW9uIGR1cmluZyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBhbmQgY2FuCi1jYXVzZSBlYWNoIG9mIHR3byBhZGphY2VudCBsaW5lcyB0byBiZSBjcmVkaXRlZCB3aXRoIGhhbGYKLWEgaGl0LCBmb3IgZXhhbXBsZS4KLQotSWYgY2FsbCBncmFwaCBkYXRhIGlzIHByZXNlbnQsIEBjb2Rle2NnX2FyY3MuYzpjZ19hc3NlbWJsZX0gaXMgY2FsbGVkLgotRmlyc3QsIGlmIEBzYW1wey1jfSB3YXMgc3BlY2lmaWVkLCBhIG1hY2hpbmUtZGVwZW5kYW50Ci1yb3V0aW5lIChAY29kZXtmaW5kX2NhbGx9KSBzY2FucyB0aHJvdWdoIGVhY2ggc3ltYm9sJ3MgbWFjaGluZSBjb2RlLAotbG9va2luZyBmb3Igc3Vicm91dGluZSBjYWxsIGluc3RydWN0aW9ucywgYW5kIGFkZGluZyB0aGVtCi10byB0aGUgY2FsbCBncmFwaCB3aXRoIGEgemVybyBjYWxsIGNvdW50LgotQSB0b3BvbG9naWNhbCBzb3J0IGlzIHBlcmZvcm1lZCBieSBkZXB0aC1maXJzdCBudW1iZXJpbmcKLWFsbCB0aGUgc3ltYm9scyAoQGNvZGV7Y2dfZGZuLmM6Y2dfZGZufSksIHNvIHRoYXQKLWNoaWxkcmVuIGFyZSBhbHdheXMgbnVtYmVyZWQgbGVzcyB0aGFuIHRoZWlyIHBhcmVudHMsCi10aGVuIG1ha2luZyBhIGFycmF5IG9mIHBvaW50ZXJzIGludG8gdGhlIHN5bWJvbCB0YWJsZSBhbmQgc29ydGluZyBpdCBpbnRvCi1udW1lcmljYWwgb3JkZXIsIHdoaWNoIGlzIHJldmVyc2UgdG9wb2xvZ2ljYWwKLW9yZGVyIChjaGlsZHJlbiBhcHBlYXIgYmVmb3JlIHBhcmVudHMpLgotQ3ljbGVzIGFyZSBhbHNvIGRldGVjdGVkIGF0IHRoaXMgcG9pbnQsIGFsbCBtZW1iZXJzCi1vZiB3aGljaCBhcmUgYXNzaWduZWQgdGhlIHNhbWUgdG9wb2xvZ2ljYWwgbnVtYmVyLgotVHdvIHBhc3NlcyBhcmUgbm93IG1hZGUgdGhyb3VnaCB0aGlzIHNvcnRlZCBhcnJheSBvZiBzeW1ib2wgcG9pbnRlcnMuCi1UaGUgZmlyc3QgcGFzcywgZnJvbSBlbmQgdG8gYmVnaW5uaW5nIChwYXJlbnRzIHRvIGNoaWxkcmVuKSwKLWNvbXB1dGVzIHRoZSBmcmFjdGlvbiBvZiBjaGlsZCB0aW1lIHRvIHByb3BvZ2F0ZSB0byBlYWNoIHBhcmVudAotYW5kIGEgcHJpbnQgZmxhZy4KLVRoZSBwcmludCBmbGFnIHJlZmxlY3RzIHN5bXNwZWMgaGFuZGxpbmcgb2YgSU5DTF9HUkFQSC9FWENMX0dSQVBILAotd2l0aCBhIHBhcmVudCdzIGluY2x1ZGUgb3IgZXhjbHVkZSAocHJpbnQgb3Igbm8gcHJpbnQpIHByb3BlcnR5Ci1iZWluZyBwcm9wYWdhdGVkIHRvIGl0cyBjaGlsZHJlbiwgdW5sZXNzIHRoZXkgdGhlbXNlbHZlcyBleHBsaWNpdGx5IGFwcGVhcgotaW4gSU5DTF9HUkFQSCBvciBFWENMX0dSQVBILgotQSBzZWNvbmQgcGFzcywgZnJvbSBiZWdpbm5pbmcgdG8gZW5kIChjaGlsZHJlbiB0byBwYXJlbnRzKSBhY3R1YWxseQotcHJvcG9nYXRlcyB0aGUgdGltaW5ncyBhbG9uZyB0aGUgY2FsbCBncmFwaCwgc3ViamVjdAotdG8gYSBjaGVjayBhZ2FpbnN0IElOQ0xfVElNRS9FWENMX1RJTUUuCi1XaXRoIHRoZSBwcmludCBmbGFnLCBmcmFjdGlvbnMsIGFuZCB0aW1pbmdzIG5vdyBzdG9yZWQgaW4gdGhlIHN5bWJvbAotc3RydWN0dXJlcywgdGhlIHRvcG9sb2dpY2FsIHNvcnQgYXJyYXkgaXMgbm93IGRpc2NhcmRlZCwgYW5kIGEKLW5ldyBhcnJheSBvZiBwb2ludGVycyBpcyBhc3NlbWJsZWQsIHRoaXMgdGltZSBzb3J0ZWQgYnkgcHJvcGFnYXRlZCB0aW1lLgotCi1GaW5hbGx5LCBwcmludCB0aGUgdmFyaW91cyBvdXRwdXRzIHRoZSB1c2VyIHJlcXVlc3RlZCwgd2hpY2ggaXMgbm93IGZhaXJseQotc3RyYWlnaHRmb3J3YXJkLiAgVGhlIGNhbGwgZ3JhcGggKEBjb2Rle2NnX3ByaW50LmM6Y2dfcHJpbnR9KSBhbmQKLWZsYXQgcHJvZmlsZSAoQGNvZGV7aGlzdC5jOmhpc3RfcHJpbnR9KSBhcmUgcmVndXJnaXRhdGlvbnMgb2YgdmFsdWVzCi1hbHJlYWR5IGNvbXB1dGVkLiAgVGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZwotKEBjb2Rle2Jhc2ljX2Jsb2Nrcy5jOnByaW50X2Fubm90YXRlZF9zb3VyY2V9KSB1c2VzIGJhc2ljLWJsb2NrCi1pbmZvcm1hdGlvbiwgaWYgcHJlc2VudCwgdG8gbGFiZWwgZWFjaCBsaW5lIG9mIGNvZGUgd2l0aCBjYWxsIGNvdW50cywKLW90aGVyd2lzZSBvbmx5IHRoZSBmdW5jdGlvbiBjYWxsIGNvdW50cyBhcmUgcHJlc2VudGVkLgotCi1UaGUgZnVuY3Rpb24gb3JkZXJpbmcgY29kZSBpcyBtYXJnaW5hbGx5IHdlbGwgZG9jdW1lbnRlZAotaW4gdGhlIHNvdXJjZSBjb2RlIGl0c2VsZiAoQGNvZGV7Y2dfcHJpbnQuY30pLiAgQmFzaWNhbGx5LAotdGhlIGZ1bmN0aW9ucyB3aXRoIHRoZSBtb3N0IHVzZSBhbmQgdGhlIG1vc3QgcGFyZW50cyBhcmUKLXBsYWNlZCBmaXJzdCwgZm9sbG93ZWQgYnkgb3RoZXIgZnVuY3Rpb25zIHdpdGggdGhlIG1vc3QgdXNlLAotZm9sbG93ZWQgYnkgbG93ZXIgdXNlIGZ1bmN0aW9ucywgZm9sbG93ZWQgYnkgdW51c2VkIGZ1bmN0aW9ucwotYXQgdGhlIGVuZC4KLQotQG5vZGUgRGVidWdnaW5nLCxJbnRlcm5hbHMsRGV0YWlscwotQHN1YnNlY3Rpb24gRGVidWdnaW5nIEBjb2Rle2dwcm9mfQotCi1JZiBAY29kZXtncHJvZn0gd2FzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQsCi10aGUgQHNhbXB7LWR9IG9wdGlvbiB0cmlnZ2VycyBkZWJ1Z2dpbmcgb3V0cHV0Ci0odG8gc3Rkb3V0KSB3aGljaCBjYW4gYmUgaGVscGZ1bCBpbiB1bmRlcnN0YW5kaW5nIGl0cyBvcGVyYXRpb24uCi1UaGUgZGVidWdnaW5nIG51bWJlciBzcGVjaWZpZWQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdW0gb2YgdGhlIGZvbGxvd2luZwotb3B0aW9uczoKLQotQHRhYmxlIEBhc2lzCi1AaXRlbSAyIC0gVG9wb2xvZ2ljYWwgc29ydAotTW9uaXRvciBkZXB0aC1maXJzdCBudW1iZXJpbmcgb2Ygc3ltYm9scyBkdXJpbmcgY2FsbCBncmFwaCBhbmFseXNpcwotQGl0ZW0gNCAtIEN5Y2xlcwotU2hvd3Mgc3ltYm9scyBhcyB0aGV5IGFyZSBpZGVudGlmaWVkIGFzIGN5Y2xlIGhlYWRzCi1AaXRlbSAxNiAtIFRhbGx5aW5nCi1BcyB0aGUgY2FsbCBncmFwaCBhcmNzIGFyZSByZWFkLCBzaG93IGVhY2ggYXJjIGFuZCBob3cKLXRoZSB0b3RhbCBjYWxscyB0byBlYWNoIGZ1bmN0aW9uIGFyZSB0YWxsaWVkCi1AaXRlbSAzMiAtIENhbGwgZ3JhcGggYXJjIHNvcnRpbmcKLURldGFpbHMgc29ydGluZyBpbmRpdmlkdWFsIHBhcmVudHMvY2hpbGRyZW4gd2l0aGluIGVhY2ggY2FsbCBncmFwaCBlbnRyeQotQGl0ZW0gNjQgLSBSZWFkaW5nIGhpc3RvZ3JhbSBhbmQgY2FsbCBncmFwaCByZWNvcmRzCi1TaG93cyBhZGRyZXNzIHJhbmdlcyBvZiBoaXN0b2dyYW1zIGFzIHRoZXkgYXJlIHJlYWQsIGFuZCBlYWNoCi1jYWxsIGdyYXBoIGFyYwotQGl0ZW0gMTI4IC0gU3ltYm9sIHRhYmxlCi1SZWFkaW5nLCBjbGFzc2lmeWluZywgYW5kIHNvcnRpbmcgdGhlIHN5bWJvbCB0YWJsZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4KLUZvciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIChAc2FtcHstbH0gb3B0aW9uKSwgYWxzbyBzaG93cyBsaW5lIG51bWJlcnMKLWJlaW5nIGFzc2lnbmVkIHRvIG1lbW9yeSBhZGRyZXNzZXMuCi1AaXRlbSAyNTYgLSBTdGF0aWMgY2FsbCBncmFwaAotVHJhY2Ugb3BlcmF0aW9uIG9mIEBzYW1wey1jfSBvcHRpb24KLUBpdGVtIDUxMiAtIFN5bWJvbCB0YWJsZSBhbmQgYXJjIHRhYmxlIGxvb2t1cHMKLURldGFpbCBvcGVyYXRpb24gb2YgbG9va3VwIHJvdXRpbmVzCi1AaXRlbSAxMDI0IC0gQ2FsbCBncmFwaCBwcm9wYWdhdGlvbgotU2hvd3MgaG93IGZ1bmN0aW9uIHRpbWVzIGFyZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBjYWxsIGdyYXBoCi1AaXRlbSAyMDQ4IC0gQmFzaWMtYmxvY2tzCi1TaG93cyBiYXNpYy1ibG9jayByZWNvcmRzIGFzIHRoZXkgYXJlIHJlYWQgZnJvbSBwcm9maWxlIGRhdGEKLShvbmx5IG1lYW5pbmdmdWwgd2l0aCBAc2FtcHstbH0gb3B0aW9uKQotQGl0ZW0gNDA5NiAtIFN5bXNwZWNzCi1TaG93cyBzeW1zcGVjLXRvLXN5bWJvbCBwYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdGlvbgotQGl0ZW0gODE5MiAtIEFubm90YXRlIHNvdXJjZQotVHJhY2tzIG9wZXJhdGlvbiBvZiBAc2FtcHstQX0gb3B0aW9uCi1AZW5kIHRhYmxlCi0KLUBjb250ZW50cwotQGJ5ZQotCi1ORUVEUyBBTiBJTkRFWAotCi0tVCAtICJ0cmFkaXRpb25hbCBCU0Qgc3R5bGUiOiBIb3cgaXMgaXQgZGlmZmVyZW50PyAgU2hvdWxkIHRoZQotZGlmZmVyZW5jZXMgYmUgZG9jdW1lbnRlZD8KLQotZXhhbXBsZSBmbGF0IGZpbGUgYWRkcyB1cCB0byAxMDAuMDElLi4uCi0KLW5vdGU6IHRpbWUgZXN0aW1hdGVzIG5vdyBvbmx5IGdvIG91dCB0byBvbmUgZGVjaW1hbCBwbGFjZSAoMC4wKSwgd2hlcmUKLXRoZXkgdXNlZCB0byBleHRlbmQgdHdvICg3OC42NykuCmRpZmYgLS1naXQgYS9ncHJvZi9oZXJ0ei5jIGIvZ3Byb2YvaGVydHouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzMTRhYy4uMDAwMDAwMAotLS0gYS9ncHJvZi9oZXJ0ei5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJoZXJ0ei5oIgotCi0KLSNpZmRlZiBfX01TRE9TX18KLSNkZWZpbmUgSEVSVFogMTgKLSNlbmRpZgotCi1pbnQKLWhlcnR6ICgpCi17Ci0jaWZkZWYgSEVSVFoKLSAgcmV0dXJuIEhFUlRaOwotI2Vsc2UgLyogISBkZWZpbmVkIChIRVJUWikgKi8KLSNpZmRlZiBIQVZFX1NFVElUSU1FUgotICBzdHJ1Y3QgaXRpbWVydmFsIHRpbTsKLQotICB0aW0uaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKLSAgdGltLml0X2ludGVydmFsLnR2X3VzZWMgPSAxOwotICB0aW0uaXRfdmFsdWUudHZfc2VjID0gMDsKLSAgdGltLml0X3ZhbHVlLnR2X3VzZWMgPSAwOwotICBzZXRpdGltZXIgKElUSU1FUl9SRUFMLCAmdGltLCAwKTsKLSAgc2V0aXRpbWVyIChJVElNRVJfUkVBTCwgMCwgJnRpbSk7Ci0gIGlmICh0aW0uaXRfaW50ZXJ2YWwudHZfdXNlYyA8IDIpCi0gICAgewotICAgICAgcmV0dXJuIEhaX1dST05HOwotICAgIH0KLSAgcmV0dXJuIDEwMDAwMDAgLyB0aW0uaXRfaW50ZXJ2YWwudHZfdXNlYzsKLSNlbHNlIC8qICEgZGVmaW5lZCAoSEFWRV9TRVRJVElNRVIpICovCi0jaWYgZGVmaW5lZCAoSEFWRV9TWVNDT05GKSAmJiBkZWZpbmVkIChfU0NfQ0xLX1RDSykKLSAgcmV0dXJuIHN5c2NvbmYgKF9TQ19DTEtfVENLKTsKLSNlbHNlIC8qICEgZGVmaW5lZCAoSEFWRV9TWVNDT05GKSB8fCAhIGRlZmluZWQgKF9TQ19DTEtfVENLKSAqLwotICByZXR1cm4gSFpfV1JPTkc7Ci0jZW5kaWYgLyogISBkZWZpbmVkIChIQVZFX1NZU0NPTkYpIHx8ICEgZGVmaW5lZCAoX1NDX0NMS19UQ0spICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChIQVZFX1NFVElUSU1FUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEhFUlRaKSAqLwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGVydHouaCBiL2dwcm9mL2hlcnR6LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzBhMWYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvaGVydHouaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNpZm5kZWYgaGVydHpfaAotI2RlZmluZSBoZXJ0el9oCi0KLSNpbmNsdWRlICJncHJvZi5oIgotCi0jZGVmaW5lCUhaX1dST05HIDAJCS8qIGltcG9zc2libGUgY2xvY2sgZnJlcXVlbmN5ICovCi0KLS8qCi0gKiBEaXNjb3ZlciB0aGUgdGljayBmcmVxdWVuY3kgb2YgdGhlIG1hY2hpbmUgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcsCi0gKiB3ZSByZXR1cm4gSFpfV1JPTkcsIGFuIGltcG9zc2libGUgc2FtcGxpbmcgZnJlcXVlbmN5LgotICovCi0KLWV4dGVybiBpbnQgaGVydHogUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogaGVydHpfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGlzdC5jIGIvZ3Byb2YvaGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmVmMjVhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2hpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKgotICogSGlzdG9ncmFtIHJlbGF0ZWQgb3BlcmF0aW9ucy4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotI2RlZmluZSBVTklUU19UT19DT0RFIChvZmZzZXRfdG9fY29kZSAvIHNpemVvZihVTklUKSkKLQotc3RhdGljIHZvaWQgc2NhbGVfYW5kX2FsaWduX2VudHJpZXMgUEFSQU1TICgodm9pZCkpOwotCi0vKiBkZWNsYXJhdGlvbnMgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnVuY3Rpb25zIHRvIG91dHB1dCBibHVyYnM6ICovCi1leHRlcm4gdm9pZCBmbGF0X2JsdXJiIFBBUkFNUyAoKEZJTEUgKiBmcCkpOwotCi1iZmRfdm1hIHNfbG93cGM7CQkvKiBsb3dlc3QgYWRkcmVzcyBpbiAudGV4dCAqLwotYmZkX3ZtYSBzX2hpZ2hwYyA9IDA7CQkvKiBoaWdoZXN0IGFkZHJlc3MgaW4gLnRleHQgKi8KLWJmZF92bWEgbG93cGMsIGhpZ2hwYzsJCS8qIHNhbWUsIGJ1dCBleHByZXNzZWQgaW4gVU5JVHMgKi8KLWludCBoaXN0X251bV9iaW5zID0gMDsJCS8qIG51bWJlciBvZiBoaXN0b2dyYW0gc2FtcGxlcyAqLwotaW50ICpoaXN0X3NhbXBsZSA9IDA7CQkvKiBoaXN0b2dyYW0gc2FtcGxlcyAoc2hvcnRzIGluIHRoZSBmaWxlISkgKi8KLWRvdWJsZSBoaXN0X3NjYWxlOwotY2hhciBoaXN0X2RpbWVuc2lvbltzaXplb2YgKCgoc3RydWN0IGdtb25faGlzdF9oZHIgKikgMCktPmRpbWVuKSArIDFdID0KLSAgInNlY29uZHMiOwotY2hhciBoaXN0X2RpbWVuc2lvbl9hYmJyZXYgPSAncyc7Ci0KLXN0YXRpYyBkb3VibGUgYWNjdW1fdGltZTsJLyogYWNjdW11bGF0ZWQgdGltZSBzbyBmYXIgZm9yIHByaW50X2xpbmUoKSAqLwotc3RhdGljIGRvdWJsZSB0b3RhbF90aW1lOwkvKiB0b3RhbCB0aW1lIGZvciBhbGwgcm91dGluZXMgKi8KLS8qCi0gKiBUYWJsZSBvZiBTSSBwcmVmaXhlcyBmb3IgcG93ZXJzIG9mIDEwICh1c2VkIHRvIGF1dG9tYXRpY2FsbHkKLSAqIHNjYWxlIHNvbWUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZmxhdCBwcm9maWxlKS4KLSAqLwotY29uc3Qgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHByZWZpeDsKLSAgICBkb3VibGUgc2NhbGU7Ci0gIH0KLVNJdGFiW10gPQotewotICB7Ci0gICAgJ1QnLCAxZS0xMgotICB9Ci0gICwJCQkJLyogdGVyYSAqLwotICB7Ci0gICAgJ0cnLCAxZS0wOQotICB9Ci0gICwJCQkJLyogZ2lnYSAqLwotICB7Ci0gICAgJ00nLCAxZS0wNgotICB9Ci0gICwJCQkJLyogbWVnYSAqLwotICB7Ci0gICAgJ0snLCAxZS0wMwotICB9Ci0gICwJCQkJLyoga2lsbyAqLwotICB7Ci0gICAgJyAnLCAxZS0wMAotICB9Ci0gICwKLSAgewotICAgICdtJywgMWUrMDMKLSAgfQotICAsCQkJCS8qIG1pbGxpICovCi0gIHsKLSAgICAndScsIDFlKzA2Ci0gIH0KLSAgLAkJCQkvKiBtaWNybyAqLwotICB7Ci0gICAgJ24nLCAxZSswOQotICB9Ci0gICwJCQkJLyogbmFubyAqLwotICB7Ci0gICAgJ3AnLCAxZSsxMgotICB9Ci0gICwJCQkJLyogcGljbyAqLwotICB7Ci0gICAgJ2YnLCAxZSsxNQotICB9Ci0gICwJCQkJLyogZmVtdG8gKi8KLSAgewotICAgICdhJywgMWUrMTgKLSAgfQotICAsCQkJCS8qIGF0byAqLwotfTsKLQotLyoKLSAqIFJlYWQgdGhlIGhpc3RvZ3JhbSBmcm9tIGZpbGUgSUZQLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUgb2YgSUZQIGFuZAotICogaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3IgbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGhpc3RfcmVhZF9yZWMsIChpZnAsIGZpbGVuYW1lKSwgRklMRSAqIGlmcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIHN0cnVjdCBnbW9uX2hpc3RfaGRyIGhkcjsKLSAgYmZkX3ZtYSBuX2xvd3BjLCBuX2hpZ2hwYzsKLSAgaW50IGksIG5jbnQsIHByb2ZyYXRlOwotICBVTklUIGNvdW50OwotCi0gIGlmIChmcmVhZCAoJmhkciwgc2l6ZW9mIChoZHIpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBuX2xvd3BjID0gKGJmZF92bWEpIGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLmxvd19wYyk7Ci0gIG5faGlnaHBjID0gKGJmZF92bWEpIGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLmhpZ2hfcGMpOwotICBuY250ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBoZHIuaGlzdF9zaXplKTsKLSAgcHJvZnJhdGUgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGhkci5wcm9mX3JhdGUpOwotICBzdHJuY3B5IChoaXN0X2RpbWVuc2lvbiwgaGRyLmRpbWVuLCBzaXplb2YgKGhkci5kaW1lbikpOwotICBoaXN0X2RpbWVuc2lvbltzaXplb2YgKGhkci5kaW1lbildID0gJ1wwJzsKLSAgaGlzdF9kaW1lbnNpb25fYWJicmV2ID0gaGRyLmRpbWVuX2FiYnJldjsKLQotICBpZiAoIXNfaGlnaHBjKQotICAgIHsKLQotICAgICAgLyogdGhpcyBpcyB0aGUgZmlyc3QgaGlzdG9ncmFtIHJlY29yZDogKi8KLQotICAgICAgc19sb3dwYyA9IG5fbG93cGM7Ci0gICAgICBzX2hpZ2hwYyA9IG5faGlnaHBjOwotICAgICAgbG93cGMgPSAoYmZkX3ZtYSkgbl9sb3dwYyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBoaWdocGMgPSAoYmZkX3ZtYSkgbl9oaWdocGMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgaGlzdF9udW1fYmlucyA9IG5jbnQ7Ci0gICAgICBoeiA9IHByb2ZyYXRlOwotICAgIH0KLQotICBEQkcgKFNBTVBMRURFQlVHLAotICAgICAgIHByaW50ZiAoIltoaXN0X3JlYWRfcmVjXSBuX2xvd3BjIDB4JWx4IG5faGlnaHBjIDB4JWx4IG5jbnQgJWRcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBuX2xvd3BjLCAodW5zaWduZWQgbG9uZykgbl9oaWdocGMsIG5jbnQpOwotICAgICAgIHByaW50ZiAoIltoaXN0X3JlYWRfcmVjXSBzX2xvd3BjIDB4JWx4IHNfaGlnaHBjIDB4JWx4IG5zYW1wbGVzICVkXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc19sb3dwYywgKHVuc2lnbmVkIGxvbmcpIHNfaGlnaHBjLAotCSAgICAgICBoaXN0X251bV9iaW5zKTsKLSAgICAgICBwcmludGYgKCJbaGlzdF9yZWFkX3JlY10gICBsb3dwYyAweCVseCAgIGhpZ2hwYyAweCVseFxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxvd3BjLCAodW5zaWduZWQgbG9uZykgaGlnaHBjKSk7Ci0KLSAgaWYgKG5fbG93cGMgIT0gc19sb3dwYyB8fCBuX2hpZ2hwYyAhPSBzX2hpZ2hwYwotICAgICAgfHwgbmNudCAhPSBoaXN0X251bV9iaW5zIHx8IGh6ICE9IHByb2ZyYXRlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGAlcycgaXMgaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iKSwKLQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKCFoaXN0X3NhbXBsZSkKLSAgICB7Ci0gICAgICBoaXN0X3NhbXBsZSA9IChpbnQgKikgeG1hbGxvYyAoaGlzdF9udW1fYmlucyAqIHNpemVvZiAoaGlzdF9zYW1wbGVbMF0pKTsKLSAgICAgIG1lbXNldCAoaGlzdF9zYW1wbGUsIDAsIGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0gICAgewotICAgICAgaWYgKGZyZWFkICgmY291bnRbMF0sIHNpemVvZiAoY291bnQpLCAxLCBpZnApICE9IDEpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICBfKCIlczogJXM6IHVuZXhwZWN0ZWQgRU9GIGFmdGVyIHJlYWRpbmcgJWQgb2YgJWQgc2FtcGxlc1xuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUsIGksIGhpc3RfbnVtX2JpbnMpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgICAgaGlzdF9zYW1wbGVbaV0gKz0gYmZkX2dldF8xNiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmIGNvdW50WzBdKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFdyaXRlIGV4ZWN1dGlvbiBoaXN0b2dyYW0gdG8gZmlsZSBPRlAuICBGSUxFTkFNRSBpcyB0aGUgbmFtZQotICogb2YgT0ZQIGFuZCBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcyBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoaGlzdF93cml0ZV9oaXN0LCAob2ZwLCBmaWxlbmFtZSksIEZJTEUgKiBvZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBzdHJ1Y3QgZ21vbl9oaXN0X2hkciBoZHI7Ci0gIHVuc2lnbmVkIGNoYXIgdGFnOwotICBVTklUIGNvdW50OwotICBpbnQgaTsKLQotICAvKiB3cml0ZSBoZWFkZXI6ICovCi0KLSAgdGFnID0gR01PTl9UQUdfVElNRV9ISVNUOwotICBwdXRfdm1hIChjb3JlX2JmZCwgc19sb3dwYywgKGJmZF9ieXRlICopIGhkci5sb3dfcGMpOwotICBwdXRfdm1hIChjb3JlX2JmZCwgc19oaWdocGMsIChiZmRfYnl0ZSAqKSBoZHIuaGlnaF9wYyk7Ci0gIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoaXN0X251bV9iaW5zLCAoYmZkX2J5dGUgKikgaGRyLmhpc3Rfc2l6ZSk7Ci0gIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoeiwgKGJmZF9ieXRlICopIGhkci5wcm9mX3JhdGUpOwotICBzdHJuY3B5IChoZHIuZGltZW4sIGhpc3RfZGltZW5zaW9uLCBzaXplb2YgKGhkci5kaW1lbikpOwotICBoZHIuZGltZW5fYWJicmV2ID0gaGlzdF9kaW1lbnNpb25fYWJicmV2OwotCi0gIGlmIChmd3JpdGUgKCZ0YWcsIHNpemVvZiAodGFnKSwgMSwgb2ZwKSAhPSAxCi0gICAgICB8fCBmd3JpdGUgKCZoZHIsIHNpemVvZiAoaGRyKSwgMSwgb2ZwKSAhPSAxKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0gICAgewotICAgICAgYmZkX3B1dF8xNiAoY29yZV9iZmQsIGhpc3Rfc2FtcGxlW2ldLCAoYmZkX2J5dGUgKikgJiBjb3VudFswXSk7Ci0gICAgICBpZiAoZndyaXRlICgmY291bnRbMF0sIHNpemVvZiAoY291bnQpLCAxLCBvZnApICE9IDEpCi0JewotCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDYWxjdWxhdGUgc2NhbGVkIGVudHJ5IHBvaW50IGFkZHJlc3NlcyAodG8gc2F2ZSB0aW1lIGluCi0gKiBoaXN0X2Fzc2lnbl9zYW1wbGVzKSwgYW5kLCBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgaGF2ZSBwcm9jZWR1cmUKLSAqIGVudHJ5IG1hc2tzIGF0IHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLCBwb3NzaWJseSBwdXNoIHRoZSBzY2FsZWQKLSAqIGVudHJ5IHBvaW50cyBvdmVyIHRoZSBwcm9jZWR1cmUgZW50cnkgbWFzaywgaWYgaXQgdHVybnMgb3V0IHRoYXQKLSAqIHRoZSBlbnRyeSBwb2ludCBpcyBpbiBvbmUgYmluIGFuZCB0aGUgY29kZSBmb3IgYSByb3V0aW5lIGlzIGluIHRoZQotICogbmV4dCBiaW4uCi0gKi8KLXN0YXRpYyB2b2lkCi1zY2FsZV9hbmRfYWxpZ25fZW50cmllcyAoKQotewotICBTeW0gKnN5bTsKLSAgYmZkX3ZtYSBiaW5fb2ZfZW50cnk7Ci0gIGJmZF92bWEgYmluX29mX2NvZGU7Ci0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyBzeW0rKykKLSAgICB7Ci0gICAgICBzeW0tPmhpc3Quc2NhbGVkX2FkZHIgPSBzeW0tPmFkZHIgLyBzaXplb2YgKFVOSVQpOwotICAgICAgYmluX29mX2VudHJ5ID0gKHN5bS0+aGlzdC5zY2FsZWRfYWRkciAtIGxvd3BjKSAvIGhpc3Rfc2NhbGU7Ci0gICAgICBiaW5fb2ZfY29kZSA9IChzeW0tPmhpc3Quc2NhbGVkX2FkZHIgKyBVTklUU19UT19DT0RFIC0gbG93cGMpIC8gaGlzdF9zY2FsZTsKLSAgICAgIGlmIChiaW5fb2ZfZW50cnkgPCBiaW5fb2ZfY29kZSkKLQl7Ci0JICBEQkcgKFNBTVBMRURFQlVHLAotCSAgICAgICBwcmludGYgKCJbc2NhbGVfYW5kX2FsaWduX2VudHJpZXNdIHB1c2hpbmcgMHglbHggdG8gMHglbHhcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgc3ltLT5oaXN0LnNjYWxlZF9hZGRyLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChzeW0tPmhpc3Quc2NhbGVkX2FkZHIKLQkJCQkJKyBVTklUU19UT19DT0RFKSkpOwotCSAgc3ltLT5oaXN0LnNjYWxlZF9hZGRyICs9IFVOSVRTX1RPX0NPREU7Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogQXNzaWduIHNhbXBsZXMgdG8gdGhlIHN5bWJvbCB0byB3aGljaCB0aGV5IGJlbG9uZy4KLSAqCi0gKiBIaXN0b2dyYW0gYmluIEkgY292ZXJzIHNvbWUgYWRkcmVzcyByYW5nZSBbQklOX0xPV1BDLEJJTl9ISUdIX1BDKQotICogd2hpY2ggbWF5IG92ZXJsYXAgb25lIG1vcmUgc3ltYm9sIGFkZHJlc3MgcmFuZ2VzLiAgSWYgYSBzeW1ib2wKLSAqIG92ZXJsYXBzIHdpdGggdGhlIGJpbidzIGFkZHJlc3MgcmFuZ2UgYnkgTyBwZXJjZW50LCB0aGVuIE8gcGVyY2VudAotICogb2YgdGhlIGJpbidzIGNvdW50IGlzIGNyZWRpdGVkIHRvIHRoYXQgc3ltYm9sLgotICoKLSAqIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyBhcyB0byB3aGVyZSBCSU5fTE9XX1BDIGFuZCBCSU5fSElHSF9QQyBjYW4gYmUKLSAqIHdpdGggcmVzcGVjdCB0byB0aGUgc3ltYm9sJ3MgYWRkcmVzcyByYW5nZSBbU1lNX0xPV19QQywKLSAqIFNZTV9ISUdIX1BDKSBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGRpYWdyYW0uICBPVkVSTEFQIGNvbXB1dGVzCi0gKiB0aGUgZGlzdGFuY2UgKGluIFVOSVRzKSBiZXR3ZWVuIHRoZSBhcnJvd3MsIHRoZSBmcmFjdGlvbiBvZiB0aGUKLSAqIHNhbXBsZSB0aGF0IGlzIHRvIGJlIGNyZWRpdGVkIHRvIHRoZSBzeW1ib2wgd2hpY2ggc3RhcnRzIGF0Ci0gKiBTWU1fTE9XX1BDLgotICoKLSAqICAgICAgICBzeW1fbG93X3BjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1faGlnaF9wYwotICogICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdgotICoKLSAqICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICB8ICAtPnwgICAgfDwtICAgICAgICAgLT58ICAgICAgICAgfDwtICAgICAgICAgLT58ICAgIHw8LSAgfAotICogICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICB8Ci0gKiAgICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgKy0tLS0tLS0tLSsKLSAqCi0gKiAgICAgICAgXiAgICAgICAgIF4gICAgICAgICAgICAgXiAgICAgICAgIF4gICAgICAgICAgICAgXiAgICAgICAgIF4KLSAqICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfAotICogICBiaW5fbG93X3BjIGJpbl9oaWdoX3BjICBiaW5fbG93X3BjIGJpbl9oaWdoX3BjICBiaW5fbG93X3BjIGJpbl9oaWdoX3BjCi0gKgotICogRm9yIHRoZSBWQVggd2UgYXNzZXJ0IHRoYXQgc2FtcGxlcyB3aWxsIG5ldmVyIGZhbGwgaW4gdGhlIGZpcnN0IHR3bwotICogYnl0ZXMgb2YgYW55IHJvdXRpbmUsIHNpbmNlIHRoYXQgaXMgdGhlIGVudHJ5IG1hc2ssIHRodXMgd2UgY2FsbAotICogc2NhbGVfYW5kX2FsaWduX2VudHJpZXMoKSB0byBhZGp1c3QgdGhlIGVudHJ5IHBvaW50cyBpZiB0aGUgZW50cnkKLSAqIG1hc2sgZmFsbHMgaW4gb25lIGJpbiBidXQgdGhlIGNvZGUgZm9yIHRoZSByb3V0aW5lIGRvZXNuJ3Qgc3RhcnQKLSAqIHVudGlsIHRoZSBuZXh0IGJpbi4gIEluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFsaWdubWVudCBvZiByb3V0aW5lCi0gKiBhZGRyZXNzZXMsIHRoaXMgc2hvdWxkIGFsbG93IHVzIHRvIGhhdmUgb25seSBvbmUgc2FtcGxlIGZvciBldmVyeQotICogZm91ciBieXRlcyBvZiB0ZXh0IHNwYWNlIGFuZCBuZXZlciBoYXZlIGFueSBvdmVybGFwICh0aGUgdHdvIGVuZAotICogY2FzZXMsIGFib3ZlKS4KLSAqLwotdm9pZAotREVGVU5fVk9JRCAoaGlzdF9hc3NpZ25fc2FtcGxlcykKLXsKLSAgYmZkX3ZtYSBiaW5fbG93X3BjLCBiaW5faGlnaF9wYzsKLSAgYmZkX3ZtYSBzeW1fbG93X3BjLCBzeW1faGlnaF9wYzsKLSAgYmZkX3ZtYSBvdmVybGFwLCBhZGRyOwotICBpbnQgYmluX2NvdW50LCBpOwotICB1bnNpZ25lZCBpbnQgajsKLSAgZG91YmxlIHRpbWUsIGNyZWRpdDsKLQotICAvKiByZWFkIHNhbXBsZXMgYW5kIGFzc2lnbiB0byBzeW1ib2xzOiAqLwotICBoaXN0X3NjYWxlID0gaGlnaHBjIC0gbG93cGM7Ci0gIGhpc3Rfc2NhbGUgLz0gaGlzdF9udW1fYmluczsKLSAgc2NhbGVfYW5kX2FsaWduX2VudHJpZXMgKCk7Ci0KLSAgLyogaXRlcmF0ZSBvdmVyIGFsbCBzYW1wbGUgYmluczogKi8KLQotICBmb3IgKGkgPSAwLCBqID0gMTsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLSAgICB7Ci0gICAgICBiaW5fY291bnQgPSBoaXN0X3NhbXBsZVtpXTsKLSAgICAgIGlmICghYmluX2NvdW50KQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGJpbl9sb3dfcGMgPSBsb3dwYyArIChiZmRfdm1hKSAoaGlzdF9zY2FsZSAqIGkpOwotICAgICAgYmluX2hpZ2hfcGMgPSBsb3dwYyArIChiZmRfdm1hKSAoaGlzdF9zY2FsZSAqIChpICsgMSkpOwotICAgICAgdGltZSA9IGJpbl9jb3VudDsKLSAgICAgIERCRyAoU0FNUExFREVCVUcsCi0JICAgcHJpbnRmICgKLSAgICAgICJbYXNzaWduX3NhbXBsZXNdIGJpbl9sb3dfcGM9MHglbHgsIGJpbl9oaWdoX3BjPTB4JWx4LCBiaW5fY291bnQ9JWRcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZykgKHNpemVvZiAoVU5JVCkgKiBiaW5fbG93X3BjKSwKLQkJICAgICh1bnNpZ25lZCBsb25nKSAoc2l6ZW9mIChVTklUKSAqIGJpbl9oaWdoX3BjKSwKLQkJICAgIGJpbl9jb3VudCkpOwotICAgICAgdG90YWxfdGltZSArPSB0aW1lOwotCi0gICAgICAvKiBjcmVkaXQgYWxsIHN5bWJvbHMgdGhhdCBhcmUgY292ZXJlZCBieSBiaW4gSTogKi8KLQotICAgICAgZm9yIChqID0gaiAtIDE7IGogPCBzeW10YWIubGVuOyArK2opCi0JewotCSAgc3ltX2xvd19wYyA9IHN5bXRhYi5iYXNlW2pdLmhpc3Quc2NhbGVkX2FkZHI7Ci0JICBzeW1faGlnaF9wYyA9IHN5bXRhYi5iYXNlW2ogKyAxXS5oaXN0LnNjYWxlZF9hZGRyOwotCSAgLyoKLQkgICAqIElmIGhpZ2ggZW5kIG9mIGJpbiBpcyBiZWxvdyBlbnRyeSBhZGRyZXNzLCBnbyBmb3IgbmV4dAotCSAgICogYmluOgotCSAgICovCi0JICBpZiAoYmluX2hpZ2hfcGMgPCBzeW1fbG93X3BjKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBJZiBsb3cgZW5kIG9mIGJpbiBpcyBhYm92ZSBoaWdoIGVuZCBvZiBzeW1ib2wsIGdvIGZvcgotCSAgICogbmV4dCBzeW1ib2wuCi0JICAgKi8KLQkgIGlmIChiaW5fbG93X3BjID49IHN5bV9oaWdoX3BjKQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIG92ZXJsYXAgPQotCSAgICBNSU4gKGJpbl9oaWdoX3BjLCBzeW1faGlnaF9wYykgLSBNQVggKGJpbl9sb3dfcGMsIHN5bV9sb3dfcGMpOwotCSAgaWYgKG92ZXJsYXAgPiAwKQotCSAgICB7Ci0JICAgICAgREJHIChTQU1QTEVERUJVRywKLQkJICAgcHJpbnRmICgKLQkJCSAgICAiW2Fzc2lnbl9zYW1wbGVzXSBbMHglbHgsMHglbHgpICVzIGdldHMgJWYgdGlja3MgJWxkIG92ZXJsYXBcbiIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIHN5bXRhYi5iYXNlW2pdLmFkZHIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIChzaXplb2YgKFVOSVQpICogc3ltX2hpZ2hfcGMpLAotCQkJICAgIHN5bXRhYi5iYXNlW2pdLm5hbWUsIG92ZXJsYXAgKiB0aW1lIC8gaGlzdF9zY2FsZSwKLQkJCSAgICAobG9uZykgb3ZlcmxhcCkpOwotCSAgICAgIGFkZHIgPSBzeW10YWIuYmFzZVtqXS5hZGRyOwotCSAgICAgIGNyZWRpdCA9IG92ZXJsYXAgKiB0aW1lIC8gaGlzdF9zY2FsZTsKLQkgICAgICAvKgotCSAgICAgICAqIENyZWRpdCBzeW1ib2wgaWYgaXQgYXBwZWFycyBpbiBJTkNMX0ZMQVQgb3IgdGhhdAotCSAgICAgICAqIHRhYmxlIGlzIGVtcHR5IGFuZCBpdCBkb2VzIG5vdCBhcHBlYXIgaXQgaW4KLQkgICAgICAgKiBFWENMX0ZMQVQuCi0JICAgICAgICovCi0JICAgICAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfRkxBVF0sIGFkZHIpCi0JCSAgfHwgKHN5bXNbSU5DTF9GTEFUXS5sZW4gPT0gMAotCQkgICAgICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9GTEFUXSwgYWRkcikpKQotCQl7Ci0JCSAgc3ltdGFiLmJhc2Vbal0uaGlzdC50aW1lICs9IGNyZWRpdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHRvdGFsX3RpbWUgLT0gY3JlZGl0OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBEQkcgKFNBTVBMRURFQlVHLCBwcmludGYgKCJbYXNzaWduX3NhbXBsZXNdIHRvdGFsX3RpbWUgJWZcbiIsCi0JCQkgICAgdG90YWxfdGltZSkpOwotfQotCi0KLS8qCi0gKiBQcmludCBoZWFkZXIgZm9yIGZsYWcgaGlzdG9ncmFtIHByb2ZpbGU6Ci0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfaGVhZGVyLCAocHJlZml4KSwgY29uc3QgY2hhciBwcmVmaXgpCi17Ci0gIGNoYXIgdW5pdFs2NF07Ci0KLSAgc3ByaW50ZiAodW5pdCwgXygiJWMlYy9jYWxsIiksIHByZWZpeCwgaGlzdF9kaW1lbnNpb25fYWJicmV2KTsKLQotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgJWxkIGJ5dGUocykiKSwKLQkgICAgICAobG9uZykgaGlzdF9zY2FsZSAqIHNpemVvZiAoVU5JVCkpOwotICAgICAgaWYgKHRvdGFsX3RpbWUgPiAwLjApCi0JewotCSAgcHJpbnRmIChfKCIgZm9yICUuMmYlJSBvZiAlLjJmICVzXG5cbiIpLAotCQkgIDEwMC4wIC8gdG90YWxfdGltZSwgdG90YWxfdGltZSAvIGh6LCBoaXN0X2RpbWVuc2lvbik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5FYWNoIHNhbXBsZSBjb3VudHMgYXMgJWcgJXMuXG4iKSwgMS4wIC8gaHosIGhpc3RfZGltZW5zaW9uKTsKLSAgICB9Ci0KLSAgaWYgKHRvdGFsX3RpbWUgPD0gMC4wKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiIG5vIHRpbWUgYWNjdW11bGF0ZWRcblxuIikpOwotICAgICAgLyogdGhpcyBkb2Vzbid0IGh1cnQgc2luY2UgYWxsIHRoZSBudW1lcmF0b3JzIHdpbGwgYmUgemVybzogKi8KLSAgICAgIHRvdGFsX3RpbWUgPSAxLjA7Ci0gICAgfQotCi0gIHByaW50ZiAoIiU1LjVzICUxMC4xMHMgJTguOHMgJTguOHMgJTguOHMgJTguOHMgICUtOC44c1xuIiwKLQkgICIlICAiLCBfKCJjdW11bGF0aXZlIiksIF8oInNlbGYgICIpLCAiIiwgXygic2VsZiAgIiksIF8oInRvdGFsICIpLCAiIik7Ci0gIHByaW50ZiAoIiU1LjVzICU5LjlzICAlOC44cyAlOC44cyAlOC44cyAlOC44cyAgJS04LjhzXG4iLAotCSAgXygidGltZSIpLCBoaXN0X2RpbWVuc2lvbiwgaGlzdF9kaW1lbnNpb24sIF8oImNhbGxzIiksIHVuaXQsIHVuaXQsCi0JICBfKCJuYW1lIikpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfbGluZSwgKHN5bSwgc2NhbGUpLCBTeW0gKiBzeW0gQU5EIGRvdWJsZSBzY2FsZSkKLXsKLSAgaWYgKGlnbm9yZV96ZXJvcyAmJiBzeW0tPm5jYWxscyA9PSAwICYmIHN5bS0+aGlzdC50aW1lID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhY2N1bV90aW1lICs9IHN5bS0+aGlzdC50aW1lOwotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlNS4xZiAlMTAuMmYgJTguMmYiLAotCSAgICAgIHRvdGFsX3RpbWUgPiAwLjAgPyAxMDAgKiBzeW0tPmhpc3QudGltZSAvIHRvdGFsX3RpbWUgOiAwLjAsCi0JICAgICAgYWNjdW1fdGltZSAvIGh6LCBzeW0tPmhpc3QudGltZSAvIGh6KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIlNi4yZiAlOS4yZiAlOC4yZiIsCi0JICAgICAgdG90YWxfdGltZSA+IDAuMCA/IDEwMCAqIHN5bS0+aGlzdC50aW1lIC8gdG90YWxfdGltZSA6IDAuMCwKLQkgICAgICBhY2N1bV90aW1lIC8gaHosIHN5bS0+aGlzdC50aW1lIC8gaHopOwotICAgIH0KLSAgaWYgKHN5bS0+bmNhbGxzICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiICU4bHUgJTguMmYgJTguMmYgICIsCi0JICAgICAgc3ltLT5uY2FsbHMsIHNjYWxlICogc3ltLT5oaXN0LnRpbWUgLyBoeiAvIHN5bS0+bmNhbGxzLAotCSAgc2NhbGUgKiAoc3ltLT5oaXN0LnRpbWUgKyBzeW0tPmNnLmNoaWxkX3RpbWUpIC8gaHogLyBzeW0tPm5jYWxscyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiICU4LjhzICU4LjhzICU4LjhzICAiLCAiIiwgIiIsICIiKTsKLSAgICB9Ci0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIHByaW50X25hbWUgKHN5bSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfbmFtZV9vbmx5IChzeW0pOwotICAgIH0KLSAgcHJpbnRmICgiXG4iKTsKLX0KLQotCi0vKgotICogQ29tcGFyZSBMUCBhbmQgUlAuICBUaGUgcHJpbWFyeSBjb21wYXJpc29uIGtleSBpcyBleGVjdXRpb24gdGltZSwKLSAqIHRoZSBzZWNvbmRhcnkgaXMgbnVtYmVyIG9mIGludm9jYXRpb24sIGFuZCB0aGUgdGVydGlhcnkgaXMgdGhlCi0gKiBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZSBmdW5jdGlvbiBuYW1lcy4KLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF90aW1lLCAobHAsIHJwKSwgY29uc3QgUFRSIGxwIEFORCBjb25zdCBQVFIgcnApCi17Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLSAgZG91YmxlIHRpbWVfZGlmZjsKLQotICB0aW1lX2RpZmYgPSByaWdodC0+aGlzdC50aW1lIC0gbGVmdC0+aGlzdC50aW1lOwotICBpZiAodGltZV9kaWZmID4gMC4wKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKHRpbWVfZGlmZiA8IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChyaWdodC0+bmNhbGxzID4gbGVmdC0+bmNhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKHJpZ2h0LT5uY2FsbHMgPCBsZWZ0LT5uY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gc3RyY21wIChsZWZ0LT5uYW1lLCByaWdodC0+bmFtZSk7Ci19Ci0KLQotLyoKLSAqIFByaW50IHRoZSBmbGF0IGhpc3RvZ3JhbSBwcm9maWxlLgotICovCi12b2lkCi1ERUZVTl9WT0lEIChoaXN0X3ByaW50KQotewotICBTeW0gKip0aW1lX3NvcnRlZF9zeW1zLCAqdG9wX2RvZywgKnN5bTsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBpbnQgbG9nX3NjYWxlOwotICBkb3VibGUgdG9wX3RpbWUsIHRpbWU7Ci0gIGJmZF92bWEgYWRkcjsKLQotICBpZiAoZmlyc3Rfb3V0cHV0KQotICAgIHsKLSAgICAgIGZpcnN0X291dHB1dCA9IEZBTFNFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIlxmXG4iKTsKLSAgICB9Ci0KLSAgYWNjdW1fdGltZSA9IDAuMDsKLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucykKLQl7Ci0JICBwcmludGYgKF8oIlxuXG5cbmZsYXQgcHJvZmlsZTpcbiIpKTsKLQkgIGZsYXRfYmx1cmIgKHN0ZG91dCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiRmxhdCBwcm9maWxlOlxuIikpOwotICAgIH0KLSAgLyoKLSAgICogU29ydCB0aGUgc3ltYm9sIHRhYmxlIGJ5IHRpbWUgKGNhbGwtY291bnQgYW5kIG5hbWUgYXMgc2Vjb25kYXJ5Ci0gICAqIGFuZCB0ZXJ0aWFyeSBrZXlzKToKLSAgICovCi0gIHRpbWVfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotICAgIHsKLSAgICAgIHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLSAgICB9Ci0gIHFzb3J0ICh0aW1lX3NvcnRlZF9zeW1zLCBzeW10YWIubGVuLCBzaXplb2YgKFN5bSAqKSwgY21wX3RpbWUpOwotCi0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGxvZ19zY2FsZSA9IDU7CQkvKiBtaWxsaS1zZWNvbmRzIGlzIEJTRC1kZWZhdWx0ICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFNlYXJjaCBmb3Igc3ltYm9sIHdpdGggaGlnaGVzdCBwZXItY2FsbCBleGVjdXRpb24gdGltZSBhbmQKLSAgICAgICAqIHNjYWxlIGFjY29yZGluZ2x5OgotICAgICAgICovCi0gICAgICBsb2dfc2NhbGUgPSAwOwotICAgICAgdG9wX2RvZyA9IDA7Ci0gICAgICB0b3BfdGltZSA9IDAuMDsKLSAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0JewotCSAgc3ltID0gdGltZV9zb3J0ZWRfc3ltc1tpbmRleF07Ci0JICBpZiAoc3ltLT5uY2FsbHMgIT0gMCkKLQkgICAgewotCSAgICAgIHRpbWUgPSAoc3ltLT5oaXN0LnRpbWUgKyBzeW0tPmNnLmNoaWxkX3RpbWUpIC8gc3ltLT5uY2FsbHM7Ci0JICAgICAgaWYgKHRpbWUgPiB0b3BfdGltZSkKLQkJewotCQkgIHRvcF9kb2cgPSBzeW07Ci0JCSAgdG9wX3RpbWUgPSB0aW1lOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAodG9wX2RvZyAmJiB0b3BfZG9nLT5uY2FsbHMgIT0gMCAmJiB0b3BfdGltZSA+IDAuMCkKLQl7Ci0JICB0b3BfdGltZSAvPSBoejsKLQkgIHdoaWxlIChTSXRhYltsb2dfc2NhbGVdLnNjYWxlICogdG9wX3RpbWUgPCAxMDAwLjAKLQkJICYmICgoc2l6ZV90KSBsb2dfc2NhbGUKLQkJICAgICA8IHNpemVvZiAoU0l0YWIpIC8gc2l6ZW9mIChTSXRhYlswXSkgLSAxKSkKLQkgICAgewotCSAgICAgICsrbG9nX3NjYWxlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBGb3Igbm93LCB0aGUgZGltZW5zaW9uIGlzIGFsd2F5cyBzZWNvbmRzLiAgSW4gdGhlIGZ1dHVyZSwgd2UKLSAgICogbWF5IGFsc28gd2FudCB0byBzdXBwb3J0IG90aGVyIChwc2V1ZG8tKWRpbWVuc2lvbnMgKHN1Y2ggYXMKLSAgICogSS1jYWNoZSBtaXNzZXMgZXRjLikuCi0gICAqLwotICBwcmludF9oZWFkZXIgKFNJdGFiW2xvZ19zY2FsZV0ucHJlZml4KTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICB7Ci0gICAgICBhZGRyID0gdGltZV9zb3J0ZWRfc3ltc1tpbmRleF0tPmFkZHI7Ci0gICAgICAvKgotICAgICAgICogUHJpbnQgc3ltYm9sIGlmIGl0cyBpbiBJTkNMX0ZMQVQgdGFibGUgb3IgdGhhdCB0YWJsZQotICAgICAgICogaXMgZW1wdHkgYW5kIHRoZSBzeW1ib2wgaXMgbm90IGluIEVYQ0xfRkxBVC4KLSAgICAgICAqLwotICAgICAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfRkxBVF0sIGFkZHIpCi0JICB8fCAoc3ltc1tJTkNMX0ZMQVRdLmxlbiA9PSAwCi0JICAgICAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfRkxBVF0sIGFkZHIpKSkKLQl7Ci0JICBwcmludF9saW5lICh0aW1lX3NvcnRlZF9zeW1zW2luZGV4XSwgU0l0YWJbbG9nX3NjYWxlXS5zY2FsZSk7Ci0JfQotICAgIH0KLSAgZnJlZSAodGltZV9zb3J0ZWRfc3ltcyk7Ci0KLSAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucyAmJiAhYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBmbGF0X2JsdXJiIChzdGRvdXQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2hpc3QuaCBiL2dwcm9mL2hpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2MmVmNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9oaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jaWZuZGVmIGhpc3RfaAotI2RlZmluZSBoaXN0X2gKLQotI2luY2x1ZGUgImJmZC5oIgotCi1leHRlcm4gYmZkX3ZtYSBzX2xvd3BjOwkJLyogbG93cGMgZnJvbSB0aGUgcHJvZmlsZSBmaWxlICovCi1leHRlcm4gYmZkX3ZtYSBzX2hpZ2hwYzsJLyogaGlnaHBjIGZyb20gdGhlIHByb2ZpbGUgZmlsZSAqLwotZXh0ZXJuIGJmZF92bWEgbG93cGMsIGhpZ2hwYzsJLyogcmFuZ2UgcHJvZmlsZWQsIGluIFVOSVQncyAqLwotZXh0ZXJuIGludCBoaXN0X251bV9iaW5zOwkvKiBudW1iZXIgb2YgaGlzdG9ncmFtIGJpbnMgKi8KLWV4dGVybiBpbnQgKmhpc3Rfc2FtcGxlOwkvKiBjb2RlIGhpc3RvZ3JhbSAqLwotLyoKLSAqIFNjYWxlIGZhY3RvciBjb252ZXJ0aW5nIHNhbXBsZXMgdG8gcGMgdmFsdWVzOiBlYWNoIHNhbXBsZSBjb3ZlcnMKLSAqIEhJU1RfU0NBTEUgYnl0ZXM6Ci0gKi8KLWV4dGVybiBkb3VibGUgaGlzdF9zY2FsZTsKLQotCi1leHRlcm4gdm9pZCBoaXN0X3JlYWRfcmVjIFBBUkFNUyAoKEZJTEUgKiBpZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBoaXN0X3dyaXRlX2hpc3QgUEFSQU1TICgoRklMRSAqIG9mcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGhpc3RfYXNzaWduX3NhbXBsZXMgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgaGlzdF9wcmludCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiBoaXN0X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2kzODYuYyBiL2dwcm9mL2kzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwZDU1MS4uMDAwMDAwMAotLS0gYS9ncHJvZi9pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotCi1pbnQKLURFRlVOIChpMzg2X2lzY2FsbCwgKGlwKSwgdW5zaWduZWQgY2hhciAqaXApCi17Ci0gIGlmICgqaXAgPT0gMHhlOCkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZAotaTM4Nl9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgU3ltICpjaGlsZDsKLSAgYmZkX3ZtYSBkZXN0cGMsIGRlbHRhOwotCi0gIGlmIChjb3JlX3RleHRfc3BhY2UgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCi0gICAgewotICAgICAgcF9sb3dwYyA9IHNfbG93cGM7Ci0gICAgfQotICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKLSAgICB7Ci0gICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOwotICAgIH0KLSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAotCQkJICBwYXJlbnQtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwX2xvd3BjLAotCQkJICAodW5zaWduZWQgbG9uZykgcF9oaWdocGMpKTsKLQotICBkZWx0YSA9IChiZmRfdm1hKSBjb3JlX3RleHRfc3BhY2UgLSBjb3JlX3RleHRfc2VjdC0+dm1hOwotCi0gIGZvciAoaW5zdHJ1Y3RwID0gKHVuc2lnbmVkIGNoYXIgKikgKHBfbG93cGMgKyBkZWx0YSk7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgKHBfaGlnaHBjICsgZGVsdGEpOwotICAgICAgIGluc3RydWN0cCArKykKLSAgICB7Ci0gICAgICBpZiAoaTM4Nl9pc2NhbGwgKGluc3RydWN0cCkpCi0JewotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kY2FsbF1cdDB4JWx4OmNhbGwiLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBkZWx0YSkpKTsKLQkgIC8qCi0JICAgKiAgcmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCi0JICAgKiAgICBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgCi0JICAgKiAgICBhIGZ1bmN0aW9uLgotCSAgICovCi0KLQkgIGRlc3RwYyA9ICgoYmZkX3ZtYSkgYmZkX2dldF8zMiAoY29yZV9iZmQsIGluc3RydWN0cCArIDEpCi0JCSAgICArIChiZmRfdm1hKSBpbnN0cnVjdHAgLSAoYmZkX3ZtYSkgZGVsdGEgKyA1KTsKLQkgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCi0JICAgIHsKLQkgICAgICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7Ci0JICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5hZGRyID09IGRlc3RwYykKLQkJewotCQkgIC8qCi0JCSAgICogICAgICBhIGhpdAotCQkgICAqLwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiXHRkZXN0cGMgMHglbHggKCVzKVxuIiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZykgZGVzdHBjLCBjaGlsZC0+bmFtZSkpOwotCQkgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkJICBpbnN0cnVjdHAgKz0gNDsJLyogY2FsbCBpcyBhIDUgYnl0ZSBpbnN0cnVjdGlvbiAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIC8qCi0JICAgKiAgZWxzZToKLQkgICAqICAgIGl0IGxvb2tlZCBsaWtlIGEgY2FsbGYsIGJ1dCBpdDoKLQkgICAqICAgICAgYSkgd2Fzbid0IGFjdHVhbGx5IGEgY2FsbGYsIG9yCi0JICAgKiAgICAgIGIpIGRpZG4ndCBwb2ludCB0byBhIGtub3duIGZ1bmN0aW9uIGluIHRoZSBzeW10YWIsIG9yCi0JICAgKiAgICAgIGMpIHNvbWV0aGluZyBmdW5ueSBpcyBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9wby9NYWtlLWluIGIvZ3Byb2YvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dwcm9mL3BvL1BPVEZJTEVTLmluIGIvZ3Byb2YvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTgxMTYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1hbHBoYS5jCi1iYXNpY19ibG9ja3MuYwotYmFzaWNfYmxvY2tzLmgKLWNhbGxfZ3JhcGguYwotY2FsbF9ncmFwaC5oCi1jZ19hcmNzLmMKLWNnX2FyY3MuaAotY2dfZGZuLmMKLWNnX2Rmbi5oCi1jZ19wcmludC5jCi1jZ19wcmludC5oCi1jb3JlZmlsZS5jCi1jb3JlZmlsZS5oCi1nbW9uLmgKLWdtb25faW8uYwotZ21vbl9pby5oCi1nbW9uX291dC5oCi1ncHJvZi5jCi1ncHJvZi5oCi1oZXJ0ei5jCi1oZXJ0ei5oCi1oaXN0LmMKLWhpc3QuaAotaTM4Ni5jCi1zZWFyY2hfbGlzdC5jCi1zZWFyY2hfbGlzdC5oCi1zb3VyY2UuYwotc291cmNlLmgKLXNwYXJjLmMKLXN5bV9pZHMuYwotc3ltX2lkcy5oCi1zeW10YWIuYwotc3ltdGFiLmgKLXRhaG9lLmMKLXV0aWxzLmMKLXV0aWxzLmgKLXZheC5jCmRpZmYgLS1naXQgYS9ncHJvZi9wby9ncHJvZi5wb3QgYi9ncHJvZi9wby9ncHJvZi5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMGIxYTAuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvcG8vZ3Byb2YucG90CisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAwLTAyLTIyIDAyOjI0LTA1MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhbHBoYS5jOjg5Ci1tc2dpZCAiPGluZGlyZWN0IGNoaWxkPiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAweCVseDoganNyJXMgPGluZGlyZWN0X2NoaWxkPlxuIgotbXNnc3RyICIiCi0KLSM6IGFscGhhLmM6MTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltmaW5kX2NhbGxdIDB4JWx4OiBic3IiCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MTM0IGNhbGxfZ3JhcGguYzo3MCBoaXN0LmM6MTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjIxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlYyBjb3VudHMgKHVzZSAtbCBvciAtLWxpbmUpXG4iCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IFRoaXMgb25seSB3b3JrcyBpZiBiZmRfdm1hIGlzIHVuc2lnbmVkIGxvbmcuCi0jOiBiYXNpY19ibG9ja3MuYzozMjQgYmFzaWNfYmxvY2tzLmM6MzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MzI1IGJhc2ljX2Jsb2Nrcy5jOjMzNAotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo1OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlRvcCAlZCBMaW5lczpcbiIKLSJcbiIKLSIgICAgIExpbmUgICAgICBDb3VudFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYyMAotbXNnaWQgIiIKLSJcbiIKLSJFeGVjdXRpb24gU3VtbWFyeTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTlsZCAgIEV4ZWN1dGFibGUgbGluZXMgaW4gdGhpcyBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU5bGQgICBMaW5lcyBleGVjdXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlOS4yZiAgIFBlcmNlbnQgb2YgdGhlIGZpbGUgZXhlY3V0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiU5bHUgICBUb3RhbCBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU5LjJmICAgQXZlcmFnZSBleGVjdXRpb25zIHBlciBsaW5lXG4iCi1tc2dzdHIgIiIKLQotIzogY2FsbF9ncmFwaC5jOjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltjZ190YWxseV0gYXJjIGZyb20gJXMgdG8gJXMgdHJhdmVyc2VkICVsdSB0aW1lc1xuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MzkKLW1zZ2lkICIiCi0iXHRcdCAgICAgQ2FsbCBncmFwaCAoZXhwbGFuYXRpb24gZm9sbG93cylcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjQzCi1tc2dpZCAiIgotIlx0XHRcdENhbGwgZ3JhcGhcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjQ2IGhpc3QuYzozODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotImdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzICVsZCBieXRlKHMpIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NTAKLW1zZ2lkICIiCi0iIGZvciAlLjJmJSUgb2YgJS4yZiBzZWNvbmRzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo1NQotbXNnaWQgIiIKLSIgbm8gdGltZSBwcm9wYWdhdGVkXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NCBjZ19wcmludC5jOjY3IGNnX3ByaW50LmM6NjkKLW1zZ2lkICJjYWxsZWQiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NCBjZ19wcmludC5jOjY5Ci1tc2dpZCAidG90YWwiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NAotbXNnaWQgInBhcmVudHMiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NiBjZ19wcmludC5jOjY3Ci1tc2dpZCAiaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NgotbXNnaWQgIiV0aW1lIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjYgY2dfcHJpbnQuYzo2NwotbXNnaWQgInNlbGYiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NgotbXNnaWQgImRlc2NlbmRlbnRzIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjcgaGlzdC5jOjQwOQotbXNnaWQgIm5hbWUiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2OQotbXNnaWQgImNoaWxkcmVuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NzQKLW1zZ2lkICJpbmRleCAlJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiA8Y3ljbGUgJWQgYXMgYSB3aG9sZT4gWyVkXVxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjM1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlNy43cyAlNy43cyAgICAgPHNwb250YW5lb3VzPlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NTg3Ci1tc2dpZCAiIgotIkluZGV4IGJ5IGZ1bmN0aW9uIG5hbWVcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY0NCBjZ19wcmludC5jOjY1MwotIywgYy1mb3JtYXQKLW1zZ2lkICI8Y3ljbGUgJWQ+IgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvdWxkIG5vdCBvcGVuICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6NTMgY29yZWZpbGUuYzo4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIHBhcnNlIG1hcHBpbmcgZmlsZSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IG5vdCBpbiBhLm91dCBmb3JtYXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgZmluZCAudGV4dCBzZWN0aW9uIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJhbiBvdXQgcm9vbSBmb3IgJWx1IGJ5dGVzIG9mIHRleHQgc3BhY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjIxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgZG8gLWNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjI0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogLWMgbm90IHN1cHBvcnRlZCBvbiBhcmNoaXRlY3R1cmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjQzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSBgJXMnIGhhcyBubyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzo3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNvbWVib2R5IG1pc2NvdW50ZWQ6IGx0YWIubGVuPSVkIGluc3RlYWQgb2YgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMzIGdtb25faW8uYzo1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX3ZtYSBoYXMgdW5leHBlY3RlZCBzaXplIG9mICVsZCBieXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzo4NyBnbW9uX2lvLmM6MTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIHRvbyBzaG9ydCB0byBiZSBhIGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzo5NyBnbW9uX2lvLmM6MjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIHVuc3VwcG9ydGVkIHZlcnNpb24gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogZm91bmQgYmFkIHRhZyAlZCAoZmlsZSBjb3JydXB0ZWQ/KVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHByb2ZpbGluZyByYXRlIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgJyVzJyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgaW4gZ21vbi5vdXQgZm9ybWF0XG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZC8lZCBiaW5zXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMxNQotbXNnaWQgInRpbWUgaXMgaW4gdGlja3MsIG5vdCBzZWNvbmRzXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMyMSBnbW9uX2lvLmM6NDYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggZmlsZSBmb3JtYXQgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZpbGUgYCVzJyAodmVyc2lvbiAlZCkgY29udGFpbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJcdCVkIGhpc3RvZ3JhbSByZWNvcmQlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHQlZCBjYWxsLWdyYXBoIHJlY29yZCVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJcdCVkIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZCVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo1OQotbXNnaWQgIiIKLSJAKCMpIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iCi0iIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzoxNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLVthYmNEaGlsTHNUdnd4eXpdXSBbLVtBQ2VFZkZKbk5PcFBxUVpdW25hbWVdXSBbLUkgZGlyc11cbiIKLSJcdFstZFtudW1dXSBbLWsgZnJvbS90b10gWy1tIG1pbi1jb3VudF0gWy10IHRhYmxlLWxlbmd0aF1cbiIKLSJcdFstLVtuby1dYW5ub3RhdGVkLXNvdXJjZVs9bmFtZV1dIFstLVtuby1dZXhlYy1jb3VudHNbPW5hbWVdXVxuIgotIlx0Wy0tW25vLV1mbGF0LXByb2ZpbGVbPW5hbWVdXSBbLS1bbm8tXWdyYXBoWz1uYW1lXV1cbiIKLSJcdFstLVtuby1ddGltZT1uYW1lXSBbLS1hbGwtbGluZXNdIFstLWJyaWVmXSBbLS1kZWJ1Z1s9bGV2ZWxdXVxuIgotIlx0Wy0tZnVuY3Rpb24tb3JkZXJpbmddIFstLWZpbGUtb3JkZXJpbmddXG4iCi0iXHRbLS1kaXJlY3RvcnktcGF0aD1kaXJzXSBbLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnNdXG4iCi0iXHRbLS1maWxlLWZvcm1hdD1uYW1lXSBbLS1maWxlLWluZm9dIFstLWhlbHBdIFstLWxpbmVdIFstLW1pbi1jb3VudD1uXVxuIgotIlx0Wy0tbm8tc3RhdGljXSBbLS1wcmludC1wYXRoXSBbLS1zZXBhcmF0ZS1maWxlc11cbiIKLSJcdFstLXN0YXRpYy1jYWxsLWdyYXBoXSBbLS1zdW1dIFstLXRhYmxlLWxlbmd0aD1sZW5dIFstLXRyYWRpdGlvbmFsXVxuIgotIlx0Wy0tdmVyc2lvbl0gWy0td2lkdGg9bl0gWy0taWdub3JlLW5vbi1mdW5jdGlvbnNdXG4iCi0iXHRbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdXG4iCi0iXHRbaW1hZ2UtZmlsZV0gW3Byb2ZpbGUtZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjE2MAotbXNnaWQgIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkZWJ1Z2dpbmcgbm90IHN1cHBvcnRlZDsgLWQgaWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmtub3duIGZpbGUgZm9ybWF0ICVzXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LgotIzogZ3Byb2YuYzozOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGdwcm9mICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzozOTQKLW1zZ2lkICIiCi0iQmFzZWQgb24gQlNEIGdwcm9mLCBjb3B5cmlnaHQgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzozOTUKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo0NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBPbmx5IG9uZSBvZiAtLWZ1bmN0aW9uLW9yZGVyaW5nIGFuZCAtLWZpbGUtb3JkZXJpbmcgbWF5IGJlIHNwZWNpZmllZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjU0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc29ycnksIGZpbGUgZm9ybWF0IGBwcm9mJyBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgaGlzdG9ncmFtXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGdtb24ub3V0IGZpbGUgaXMgbWlzc2luZyBjYWxsLWdyYXBoIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBgJXMnIGlzIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzoxNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkIG9mICVkIHNhbXBsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVjJWMvY2FsbCIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6Mzg5Ci1tc2dpZCAiIgotIiBmb3IgJS4yZiUlIG9mICUuMmYgJXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6Mzk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFYWNoIHNhbXBsZSBjb3VudHMgYXMgJWcgJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwMAotbXNnaWQgIiIKLSIgbm8gdGltZSBhY2N1bXVsYXRlZFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDYKLW1zZ2lkICJjdW11bGF0aXZlIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDYKLW1zZ2lkICJzZWxmICAiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwNgotbXNnaWQgInRvdGFsICIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA4Ci1tc2dpZCAidGltZSIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA4Ci1tc2dpZCAiY2FsbHMiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjUxNwotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJcbiIKLSJmbGF0IHByb2ZpbGU6XG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjUyMwotbXNnaWQgIkZsYXQgcHJvZmlsZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzb3VyY2UuYzoxNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvdWxkIG5vdCBsb2NhdGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNvdXJjZS5jOjIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIqKiogRmlsZSAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiB1dGlscy5jOjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiA8Y3ljbGUgJWQ+IgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9ncHJvZi9zZWFyY2hfbGlzdC5jIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NWRiZi4uMDAwMDAwMAotLS0gYS9ncHJvZi9zZWFyY2hfbGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLQotCi12b2lkCi1ERUZVTiAoc2VhcmNoX2xpc3RfYXBwZW5kLCAobGlzdCwgcGF0aHMpLAotICAgICAgIFNlYXJjaF9MaXN0ICogbGlzdCBBTkQgY29uc3QgY2hhciAqcGF0aHMpCi17Ci0gIFNlYXJjaF9MaXN0X0VsZW0gKm5ld19lbDsKLSAgY29uc3QgY2hhciAqYmVnLCAqY29sb247Ci0gIGludCBsZW47Ci0KLSAgY29sb24gPSBwYXRocyAtIDE7Ci0gIGRvCi0gICAgewotICAgICAgYmVnID0gY29sb24gKyAxOwotICAgICAgY29sb24gPSBzdHJjaHIgKGJlZywgJzonKTsKLSAgICAgIGlmIChjb2xvbikKLQl7Ci0JICBsZW4gPSBjb2xvbiAtIGJlZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbGVuID0gc3RybGVuIChiZWcpOwotCX0KLSAgICAgIG5ld19lbCA9IChTZWFyY2hfTGlzdF9FbGVtICopIHhtYWxsb2MgKHNpemVvZiAoKm5ld19lbCkgKyBsZW4pOwotICAgICAgbWVtY3B5IChuZXdfZWwtPnBhdGgsIGJlZywgbGVuKTsKLSAgICAgIG5ld19lbC0+cGF0aFtsZW5dID0gJ1wwJzsKLQotICAgICAgLyogYXBwZW5kIG5ldyBwYXRoIGF0IGVuZCBvZiBsaXN0OiAqLwotICAgICAgbmV3X2VsLT5uZXh0ID0gMDsKLSAgICAgIGlmIChsaXN0LT50YWlsKQotCXsKLQkgIGxpc3QtPnRhaWwtPm5leHQgPSBuZXdfZWw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxpc3QtPmhlYWQgPSBuZXdfZWw7Ci0JfQotICAgICAgbGlzdC0+dGFpbCA9IG5ld19lbDsKLSAgICB9Ci0gIHdoaWxlIChjb2xvbik7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zZWFyY2hfbGlzdC5oIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkZmUzNS4uMDAwMDAwMAotLS0gYS9ncHJvZi9zZWFyY2hfbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2lmbmRlZiBzZWFyY2hfbGlzdF9oCi0jZGVmaW5lIHNlYXJjaF9saXN0X2gKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX2xpc3RfZWxlbQotICB7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKm5leHQ7Ci0gICAgY2hhciBwYXRoWzFdOwotICB9Ci1TZWFyY2hfTGlzdF9FbGVtOwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKmhlYWQ7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKnRhaWw7Ci0gIH0KLVNlYXJjaF9MaXN0OwotCi1leHRlcm4gdm9pZCBzZWFyY2hfbGlzdF9hcHBlbmQgUEFSQU1TICgoU2VhcmNoX0xpc3QgKiBsaXN0LCBjb25zdCBjaGFyICpwYXRocykpOwotCi0jZW5kaWYgLyogc2VhcmNoX2xpc3RfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc291cmNlLmMgYi9ncHJvZi9zb3VyY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMWEwNC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zb3VyY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogS2VlcHMgdHJhY2sgb2Ygc291cmNlIGZpbGVzLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzZWFyY2hfbGlzdC5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotCi0jZGVmaW5lIEVYVF9BTk5PICItYW5uIgkJLyogcG9zdGZpeCBvZiBhbm5vdGF0ZWQgZmlsZXMgKi8KLQotLyoKLSAqIERlZmF1bHQgb3B0aW9uIHZhbHVlczoKLSAqLwotYm9vbCBjcmVhdGVfYW5ub3RhdGlvbl9maWxlcyA9IEZBTFNFOwotCi1TZWFyY2hfTGlzdCBzcmNfc2VhcmNoX2xpc3QgPQotezAsIDB9OwotU291cmNlX0ZpbGUgKmZpcnN0X3NyY19maWxlID0gMDsKLQotCi1Tb3VyY2VfRmlsZSAqCi1ERUZVTiAoc291cmNlX2ZpbGVfbG9va3VwX3BhdGgsIChwYXRoKSwgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgU291cmNlX0ZpbGUgKnNmOwotCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocGF0aCwgc2YtPm5hbWUpID09IDApCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKCFzZikKLSAgICB7Ci0gICAgICAvKiBjcmVhdGUgYSBuZXcgc291cmNlIGZpbGUgZGVzY3JpcHRvcjogKi8KLQotICAgICAgc2YgPSAoU291cmNlX0ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2YpKTsKLSAgICAgIG1lbXNldCAoc2YsIDAsIHNpemVvZiAoKnNmKSk7Ci0gICAgICBzZi0+bmFtZSA9IHhzdHJkdXAgKHBhdGgpOwotICAgICAgc2YtPm5leHQgPSBmaXJzdF9zcmNfZmlsZTsKLSAgICAgIGZpcnN0X3NyY19maWxlID0gc2Y7Ci0gICAgfQotICByZXR1cm4gc2Y7Ci19Ci0KLQotU291cmNlX0ZpbGUgKgotREVGVU4gKHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqZm5hbWU7Ci0gIFNvdXJjZV9GaWxlICpzZjsKLSAgLyoKLSAgICogVGhlIHVzZXIgY2Fubm90IGtub3cgZXhhY3RseSBob3cgYSBmaWxlbmFtZSB3aWxsIGJlIHN0b3JlZCBpbgotICAgKiB0aGUgZGVidWdnaW5nIGluZm8gKGUuZy4sIC4uL2luY2x1ZGUvZm9vLmgKLSAgICogdnMuIC91c3IvaW5jbHVkZS9mb28uaCkuICBTbyB3ZSBzaW1wbHkgY29tcGFyZSB0aGUgZmlsZW5hbWUKLSAgICogY29tcG9uZW50IG9mIGEgcGF0aCBvbmx5OgotICAgKi8KLSAgZm9yIChzZiA9IGZpcnN0X3NyY19maWxlOyBzZjsgc2YgPSBzZi0+bmV4dCkKLSAgICB7Ci0gICAgICBmbmFtZSA9IHN0cnJjaHIgKHNmLT5uYW1lLCAnLycpOwotICAgICAgaWYgKGZuYW1lKQotCXsKLQkgICsrZm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZuYW1lID0gc2YtPm5hbWU7Ci0JfQotICAgICAgaWYgKHN0cmNtcCAoZmlsZW5hbWUsIGZuYW1lKSA9PSAwKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzZjsKLX0KLQotCi1GSUxFICoKLURFRlVOIChhbm5vdGF0ZV9zb3VyY2UsIChzZiwgbWF4X3dpZHRoLCBhbm5vdGUsIGFyZyksCi0gICAgICAgU291cmNlX0ZpbGUgKiBzZiBBTkQgaW50IG1heF93aWR0aAotICAgICAgIEFORCB2b2lkICgqYW5ub3RlKSBQQVJBTVMgKChjaGFyICpidWYsIGludCB3LCBpbnQgbCwgdm9pZCAqYXJnKSkKLSAgICAgICBBTkQgdm9pZCAqYXJnKQotewotICBzdGF0aWMgYm9vbCBmaXJzdF9maWxlID0gVFJVRTsKLSAgaW50IGksIGxpbmVfbnVtLCBucmVhZDsKLSAgYm9vbCBuZXdfbGluZTsKLSAgY2hhciBidWZbODE5Ml07Ci0gIGNoYXIgZm5hbWVbUEFUSF9NQVhdOwotICBjaGFyICphbm5vdGF0aW9uLCAqbmFtZV9vbmx5OwotICBGSUxFICppZnAsICpvZnA7Ci0gIFNlYXJjaF9MaXN0X0VsZW0gKnNsZSA9IHNyY19zZWFyY2hfbGlzdC5oZWFkOwotCi0gIC8qCi0gICAqIE9wZW4gaW5wdXQgZmlsZS4gIElmIG9wZW4gZmFpbHMsIHdhbGsgYWxvbmcgc2VhcmNoLWxpc3QgdW50aWwKLSAgICogb3BlbiBzdWNjZWVkcyBvciByZWFjaGluZyBlbmQgb2YgbGlzdDoKLSAgICovCi0gIHN0cmNweSAoZm5hbWUsIHNmLT5uYW1lKTsKLSAgaWYgKHNmLT5uYW1lWzBdID09ICcvJykKLSAgICB7Ci0gICAgICBzbGUgPSAwOwkJCS8qIGRvbid0IHVzZSBzZWFyY2ggbGlzdCBmb3IgYWJzb2x1dGUgcGF0aHMgKi8KLSAgICB9Ci0gIG5hbWVfb25seSA9IDA7Ci0gIHdoaWxlIChUUlVFKQotICAgIHsKLSAgICAgIERCRyAoU1JDREVCVUcsIHByaW50ZiAoIlthbm5vdGF0ZV9zb3VyY2VdOiBsb29raW5nIGZvciAlcywgdHJ5aW5nICVzXG4iLAotCQkJICAgICBzZi0+bmFtZSwgZm5hbWUpKTsKLSAgICAgIGlmcCA9IGZvcGVuIChmbmFtZSwgRk9QRU5fUkIpOwotICAgICAgaWYgKGlmcCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoIXNsZSAmJiAhbmFtZV9vbmx5KQotCXsKLQkgIG5hbWVfb25seSA9IHN0cnJjaHIgKHNmLT5uYW1lLCAnLycpOwotCSAgaWYgKG5hbWVfb25seSkKLQkgICAgewotCSAgICAgIC8qIHRyeSBzZWFyY2gtbGlzdCBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIG5hbWUgb25seTogKi8KLQkgICAgICArK25hbWVfb25seTsKLQkgICAgICBzbGUgPSBzcmNfc2VhcmNoX2xpc3QuaGVhZDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzbGUpCi0JewotCSAgc3RyY3B5IChmbmFtZSwgc2xlLT5wYXRoKTsKLQkgIHN0cmNhdCAoZm5hbWUsICIvIik7Ci0JICBpZiAobmFtZV9vbmx5KQotCSAgICB7Ci0JICAgICAgc3RyY2F0IChmbmFtZSwgbmFtZV9vbmx5KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RyY2F0IChmbmFtZSwgc2YtPm5hbWUpOwotCSAgICB9Ci0JICBzbGUgPSBzbGUtPm5leHQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChlcnJubyA9PSBFTk9FTlQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjb3VsZCBub3QgbG9jYXRlIGAlcydcbiIpLAotCQkgICAgICAgd2hvYW1pLCBzZi0+bmFtZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBlcnJvciAoc2YtPm5hbWUpOwotCSAgICB9Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIG9mcCA9IHN0ZG91dDsKLSAgaWYgKGNyZWF0ZV9hbm5vdGF0aW9uX2ZpbGVzKQotICAgIHsKLSAgICAgIC8qIHRyeSB0byBjcmVhdGUgYW5ub3RhdGVkIHNvdXJjZSBmaWxlOiAqLwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgICAgIC8qIGNyZWF0ZSBhbm5vdGF0aW9uIGZpbGVzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAqLwotICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKLSAgICAgIGlmIChmaWxlbmFtZSkKLQl7Ci0JICArK2ZpbGVuYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxlbmFtZSA9IHNmLT5uYW1lOwotCX0KLQotICAgICAgc3RyY3B5IChmbmFtZSwgZmlsZW5hbWUpOwotICAgICAgc3RyY2F0IChmbmFtZSwgRVhUX0FOTk8pOwotICAgICAgb2ZwID0gZm9wZW4gKGZuYW1lLCAidyIpOwotICAgICAgaWYgKCFvZnApCi0JewotCSAgcGVycm9yIChmbmFtZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIFByaW50IGZpbGUgbmFtZXMgaWYgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCB0aGVyZSBhcmUKLSAgICogbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZToKLSAgICovCi0gIGlmIChvZnAgPT0gc3Rkb3V0KQotICAgIHsKLSAgICAgIGlmIChmaXJzdF9maWxlKQotCXsKLQkgIGZpcnN0X2ZpbGUgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnB1dGMgKCdcbicsIG9mcCk7Ci0JfQotICAgICAgaWYgKGZpcnN0X291dHB1dCkKLQl7Ci0JICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAob2ZwLCAiXGZcbiIpOwotCX0KLSAgICAgIGZwcmludGYgKG9mcCwgXygiKioqIEZpbGUgJXM6XG4iKSwgc2YtPm5hbWUpOwotICAgIH0KLQotICBhbm5vdGF0aW9uID0geG1hbGxvYyAobWF4X3dpZHRoICsgMSk7Ci0gIGxpbmVfbnVtID0gMTsKLSAgbmV3X2xpbmUgPSBUUlVFOwotICB3aGlsZSAoKG5yZWFkID0gZnJlYWQgKGJ1ZiwgMSwgc2l6ZW9mIChidWYpLCBpZnApKSA+IDApCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IG5yZWFkOyArK2kpCi0JewotCSAgaWYgKG5ld19saW5lKQotCSAgICB7Ci0JICAgICAgKCphbm5vdGUpIChhbm5vdGF0aW9uLCBtYXhfd2lkdGgsIGxpbmVfbnVtLCBhcmcpOwotCSAgICAgIGZwdXRzIChhbm5vdGF0aW9uLCBvZnApOwotCSAgICAgICsrbGluZV9udW07Ci0JICAgICAgbmV3X2xpbmUgPSBGQUxTRTsKLQkgICAgfQotCSAgbmV3X2xpbmUgPSAoYnVmW2ldID09ICdcbicpOwotCSAgZnB1dGMgKGJ1ZltpXSwgb2ZwKTsKLQl9Ci0gICAgfQotICBmcmVlIChhbm5vdGF0aW9uKTsKLSAgcmV0dXJuIG9mcDsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3NvdXJjZS5oIGIvZ3Byb2Yvc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2JhZDMuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jaWZuZGVmIHNvdXJjZV9oCi0jZGVmaW5lIHNvdXJjZV9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLQotdHlwZWRlZiBzdHJ1Y3Qgc291cmNlX2ZpbGUKLSAgewotICAgIHN0cnVjdCBzb3VyY2VfZmlsZSAqbmV4dDsKLSAgICBjb25zdCBjaGFyICpuYW1lOwkJLyogbmFtZSBvZiBzb3VyY2UgZmlsZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwkvKiAjIG9mICJjYWxscyIgdG8gdGhpcyBmaWxlICovCi0gICAgaW50IG51bV9saW5lczsJCS8qICMgb2YgbGluZXMgaW4gZmlsZSAqLwotICAgIGludCBuYWxsb2NlZDsJCS8qIG51bWJlciBvZiBsaW5lcyBhbGxvY2F0ZWQgKi8KLSAgICB2b2lkICoqbGluZTsJCS8qIHVzYWdlLWRlcGVuZGVudCBwZXItbGluZSBkYXRhICovCi0gIH0KLVNvdXJjZV9GaWxlOwotCi0vKgotICogT3B0aW9uczoKLSAqLwotZXh0ZXJuIGJvb2wgY3JlYXRlX2Fubm90YXRpb25fZmlsZXM7CS8qIGNyZWF0ZSBhbm5vdGF0ZWQgb3V0cHV0IGZpbGVzPyAqLwotCi0vKgotICogTGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHNvdXJjZSBmaWxlczoKLSAqLwotZXh0ZXJuIFNlYXJjaF9MaXN0IHNyY19zZWFyY2hfbGlzdDsKLQotLyoKLSAqIENoYWluIG9mIHNvdXJjZS1maWxlIGRlc2NyaXB0b3JzOgotICovCi1leHRlcm4gU291cmNlX0ZpbGUgKmZpcnN0X3NyY19maWxlOwotCi0vKgotICogUmV0dXJucyBwb2ludGVyIHRvIHNvdXJjZSBmaWxlIGRlc2NyaXB0b3IgZm9yIFBBVEgvRklMRU5BTUUuCi0gKi8KLWV4dGVybiBTb3VyY2VfRmlsZSAqc291cmNlX2ZpbGVfbG9va3VwX3BhdGggUEFSQU1TICgoY29uc3QgY2hhciAqcGF0aCkpOwotZXh0ZXJuIFNvdXJjZV9GaWxlICpzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0vKgotICogUmVhZCBzb3VyY2UgZmlsZSBTRiBvdXRwdXQgYW5ub3RhdGVkIHNvdXJjZS4gIFRoZSBhbm5vdGF0aW9uIGlzIGF0Ci0gKiBNQVhfV0lEVEggY2hhcmFjdGVycyB3aWRlIGFuZCBmb3IgZWFjaCBzb3VyY2UtbGluZSBhbiBhbm5vdGF0aW9uIGlzCi0gKiBvYnRhaW5lZCBieSBpbnZva2luZyBmdW5jdGlvbiBBTk5PVEUuICBBUkcgaXMgYW4gYXJndW1lbnQgcGFzc2VkIHRvCi0gKiBBTk5PVEUgdGhhdCBpcyBsZWZ0IHVuaW50ZXJwcmV0ZWQgYnkgYW5ub3RhdGVfc291cmNlKCkuCi0gKgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBmaWxlICh3aGljaCBtYXliZSBzdGRvdXQpIHN1Y2gKLSAqIHRoYXQgc3VtbWFyeSBzdGF0aXN0aWNzIGNhbiBiZSBwcmludGVkLiAgSWYgdGhlIHJldHVybmVkIGZpbGUKLSAqIGlzIG5vdCBzdGRvdXQsIGl0IHNob3VsZCBiZSBjbG9zZWQgd2hlbiBkb25lIHdpdGggaXQuCi0gKi8KLWV4dGVybiBGSUxFICphbm5vdGF0ZV9zb3VyY2UgUEFSQU1TICgoU291cmNlX0ZpbGUgKiBzZiwgaW50IG1heF93aWR0aCwKLQkJCQkgICAgICB2b2lkICgqYW5ub3RlKSAoY2hhciAqYiwgaW50IHcsIGludCBsLAotCQkJCQkJICAgICAgdm9pZCAqYXJnKSwKLQkJCQkgICAgICB2b2lkICphcmcpKTsKLQotI2VuZGlmIC8qIHNvdXJjZV9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zcGFyYy5jIGIvZ3Byb2Yvc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2NTgyNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotICAgIC8qCi0gICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxmJyBpbnN0cnVjdGlvbgotICAgICAqLwotI2RlZmluZQlDQUxMCSgweGMwMDAwMDAwKQotCi12b2lkCi1zcGFyY19maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIGJmZF92bWEgZGVzdF9wYywgZGVsdGE7Ci0gIHVuc2lnbmVkIGludCAqaW5zdHI7Ci0gIFN5bSAqY2hpbGQ7Ci0KLSAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIsCi0JCQkgIHBhcmVudC0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHBfbG93cGMsCi0JCQkgICh1bnNpZ25lZCBsb25nKSBwX2hpZ2hwYykpOwotICBmb3IgKGluc3RyID0gKHVuc2lnbmVkIGludCAqKSAoKChwX2xvd3BjICsgZGVsdGEpICsgMykgJn4gMyk7Ci0gICAgICAgaW5zdHIgPCAodW5zaWduZWQgaW50ICopIChwX2hpZ2hwYyArIGRlbHRhKTsKLSAgICAgICArK2luc3RyKQotICAgIHsKLSAgICAgIGlmICgoKmluc3RyICYgQ0FMTCkpCi0JewotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kX2NhbGxdIDB4JWx4OiBjYWxsZiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgaW5zdHIgLSBkZWx0YSkpOwotCSAgLyoKLQkgICAqIFJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZyBjaGVjayB0aGF0IHRoaXMgaXMgdGhlCi0JICAgKiBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uCi0JICAgKi8KLQkgIGRlc3RfcGMgPSAoKGJmZF92bWEpIChpbnN0ciArICgqaW5zdHIgJiB+Q0FMTCkpKSAtIGRlbHRhOwotCSAgaWYgKGRlc3RfcGMgPj0gc19sb3dwYyAmJiBkZXN0X3BjIDw9IHNfaGlnaHBjKQotCSAgICB7Ci0JICAgICAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0X3BjKTsKLQkgICAgICBEQkcgKENBTExERUJVRywKLQkJICAgcHJpbnRmICgiXHRkZXN0X3BjPTB4JWx4LCAobmFtZT0lcywgYWRkcj0weCVseClcbiIsCi0JCQkgICAodW5zaWduZWQgbG9uZykgZGVzdF9wYywgY2hpbGQtPm5hbWUsCi0JCQkgICAodW5zaWduZWQgbG9uZykgY2hpbGQtPmFkZHIpKTsKLQkgICAgICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdF9wYykKLQkJewotCQkgIC8qIGEgaGl0OiAgKi8KLQkJICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqIFNvbWV0aGluZyBmdW5ueSBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zdGFtcC1oLmluIGIvZ3Byb2Yvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9ncHJvZi9zeW1faWRzLmMgYi9ncHJvZi9zeW1faWRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMmM4ZDQuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltX2lkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotc3RydWN0IHN5bV9pZAotICB7Ci0gICAgc3RydWN0IHN5bV9pZCAqbmV4dDsKLSAgICBjaGFyICpzcGVjOwkJCS8qIHBhcnNpbmcgbW9kaWZpZXMgdGhpcyAqLwotICAgIFRhYmxlX0lkIHdoaWNoX3RhYmxlOwotICAgIGJvb2wgaGFzX3JpZ2h0OwotICAgIHN0cnVjdCBtYXRjaAotICAgICAgewotCWludCBwcmV2X2luZGV4OwkJLyogaW5kZXggb2YgcHJldiBtYXRjaCAqLwotCVN5bSAqcHJldl9tYXRjaDsJLyogcHJldmlvdXMgbWF0Y2ggKi8KLQlTeW0gKmZpcnN0X21hdGNoOwkvKiBjaGFpbiBvZiBhbGwgbWF0Y2hlcyAqLwotCVN5bSBzeW07Ci0gICAgICB9Ci0gICAgbGVmdCwgcmlnaHQ7Ci0gIH0KLSAqaWRfbGlzdDsKLQotU3ltX1RhYmxlIHN5bXNbTlVNX1RBQkxFU107Ci0KLSNpZmRlZiBERUJVRwotY29uc3QgY2hhciAqdGFibGVfbmFtZVtdID0KLXsKLSAgIklOQ0xfR1JBUEgiLCAiRVhDTF9HUkFQSCIsCi0gICJJTkNMX0FSQ1MiLCAiRVhDTF9BUkNTIiwKLSAgIklOQ0xfRkxBVCIsICJFWENMX0ZMQVQiLAotICAiSU5DTF9USU1FIiwgIkVYQ0xfVElNRSIsCi0gICJJTkNMX0FOTk8iLCAiRVhDTF9BTk5PIiwKLSAgIklOQ0xfRVhFQyIsICJFWENMX0VYRUMiCi19OwotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSB0YWJsZSBpbiB3aGljaCB3ZSBrZWVwIGFsbCB0aGUgc3ltcyB0aGF0IG1hdGNoCi0gKiB0aGUgcmlnaHQgaGFsZiBvZiBhbiBhcmMgaWQuICBJdCBpcyBOT1Qgc29ydGVkIGFjY29yZGluZwotICogdG8gdGhlIGFkZHJlc3NlcywgYmVjYXVzZSBpdCBpcyBhY2Nlc3NlZCBvbmx5IHRocm91Z2gKLSAqIHRoZSBsZWZ0IGhhbGYncyBDSElMRFJFTiBwb2ludGVycyAoc28gaXQncyBjcnVjaWFsIG5vdAotICogdG8gcmVvcmRlciB0aGlzIHRhYmxlIG9uY2UgcG9pbnRlcnMgaW50byBpdCBleGlzdCkuCi0gKi8KLXN0YXRpYyBTeW1fVGFibGUgcmlnaHRfaWRzOwotCi1zdGF0aWMgU291cmNlX0ZpbGUgbm9uX2V4aXN0ZW50X2ZpbGUgPQotewotICAwLCAiPG5vbi1leGlzdGVudC1maWxlPiIsIDAsIDAsIDAsIE5VTEwKLX07Ci0KLQotdm9pZAotREVGVU4gKHN5bV9pZF9hZGQsIChzcGVjLCB3aGljaF90YWJsZSksCi0gICAgICAgY29uc3QgY2hhciAqc3BlYyBBTkQgVGFibGVfSWQgd2hpY2hfdGFibGUpCi17Ci0gIHN0cnVjdCBzeW1faWQgKmlkOwotICBpbnQgbGVuID0gc3RybGVuIChzcGVjKTsKLQotICBpZCA9IChzdHJ1Y3Qgc3ltX2lkICopIHhtYWxsb2MgKHNpemVvZiAoKmlkKSArIGxlbiArIDEpOwotICBtZW1zZXQgKGlkLCAwLCBzaXplb2YgKCppZCkpOwotCi0gIGlkLT5zcGVjID0gKGNoYXIgKikgaWQgKyBzaXplb2YgKCppZCk7Ci0gIHN0cmNweSAoaWQtPnNwZWMsIHNwZWMpOwotICBpZC0+d2hpY2hfdGFibGUgPSB3aGljaF90YWJsZTsKLQotICBpZC0+bmV4dCA9IGlkX2xpc3Q7Ci0gIGlkX2xpc3QgPSBpZDsKLX0KLQotCi0vKgotICogQSBzcGVjIGhhcyB0aGUgc3ludGF4IEZJTEVOQU1FOihGVU5DTkFNRXxMSU5FTlVNKS4gIEFzIGEgY29udmVuaWVuY2UKLSAqIHRvIHRoZSB1c2VyLCBhIHNwZWMgd2l0aG91dCBhIGNvbG9uIGlzIGludGVycHJldGVkIGFzOgotICoKLSAqICAgICAgKGkpICAgYSBGSUxFTkFNRSBpZiBpdCBjb250YWlucyBhIGRvdAotICogICAgICAoaWkpICBhIEZVTkNOQU1FIGlmIGl0IHN0YXJ0cyB3aXRoIGEgbm9uLWRpZ2l0IGNoYXJhY3RlcgotICogICAgICAoaWlpKSBhIExJTkVOVU0gaWYgaXQgc3RhcnRzIHdpdGggYSBkaWdpdAotICoKLSAqIEEgRlVOQ05BTUUgY29udGFpbmluZyBhIGRvdCBjYW4gYmUgc3BlY2lmaWVkIGJ5IDpGVU5DTkFNRSwgYQotICogRklMRU5BTUUgbm90IGNvbnRhaW5pbmcgYSBkb3QgY2FuIGJlIHNwZWNpZmllZCBieSBGSUxFTkFNRTouCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocGFyc2Vfc3BlYywgKHNwZWMsIHN5bSksIGNoYXIgKnNwZWMgQU5EIFN5bSAqIHN5bSkKLXsKLSAgY2hhciAqY29sb247Ci0KLSAgc3ltX2luaXQgKHN5bSk7Ci0gIGNvbG9uID0gc3RycmNociAoc3BlYywgJzonKTsKLSAgaWYgKGNvbG9uKQotICAgIHsKLSAgICAgICpjb2xvbiA9ICdcMCc7Ci0gICAgICBpZiAoY29sb24gPiBzcGVjKQotCXsKLQkgIHN5bS0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lIChzcGVjKTsKLQkgIGlmICghc3ltLT5maWxlKQotCSAgICB7Ci0JICAgICAgc3ltLT5maWxlID0gJm5vbl9leGlzdGVudF9maWxlOwotCSAgICB9Ci0JfQotICAgICAgc3BlYyA9IGNvbG9uICsgMTsKLSAgICAgIGlmIChzdHJsZW4gKHNwZWMpKQotCXsKLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc3BlY1swXSkpCi0JICAgIHsKLQkgICAgICBzeW0tPmxpbmVfbnVtID0gYXRvaSAoc3BlYyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bS0+bmFtZSA9IHNwZWM7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJsZW4gKHNwZWMpKQotICAgIHsKLSAgICAgIC8qIG5vIGNvbG9uOiBzcGVjIGlzIGEgZmlsZW5hbWUgaWYgaXQgY29udGFpbnMgYSBkb3Q6ICovCi0gICAgICBpZiAoc3RyY2hyIChzcGVjLCAnLicpKQotCXsKLQkgIHN5bS0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lIChzcGVjKTsKLQkgIGlmICghc3ltLT5maWxlKQotCSAgICB7Ci0JICAgICAgc3ltLT5maWxlID0gJm5vbl9leGlzdGVudF9maWxlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzcGVjKSkKLQl7Ci0JICBzeW0tPmxpbmVfbnVtID0gYXRvaSAoc3BlYyk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybGVuIChzcGVjKSkKLQl7Ci0JICBzeW0tPm5hbWUgPSBzcGVjOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIEEgc3ltYm9sIGlkIGhhcyB0aGUgc3ludGF4IFNQRUNbL1NQRUNdLCB3aGVyZSBTUEVDIGlzIGlzIGRlZmluZWQKLSAqIGJ5IHBhcnNlX3NwZWMoKS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwYXJzZV9pZCwgKGlkKSwgc3RydWN0IHN5bV9pZCAqaWQpCi17Ci0gIGNoYXIgKnNsYXNoOwotCi0gIERCRyAoSURERUJVRywgcHJpbnRmICgiW3BhcnNlX2lkXSAlcyAtPiAiLCBpZC0+c3BlYykpOwotCi0gIHNsYXNoID0gc3RyY2hyIChpZC0+c3BlYywgJy8nKTsKLSAgaWYgKHNsYXNoKQotICAgIHsKLSAgICAgIHBhcnNlX3NwZWMgKHNsYXNoICsgMSwgJmlkLT5yaWdodC5zeW0pOwotICAgICAgKnNsYXNoID0gJ1wwJzsKLSAgICAgIGlkLT5oYXNfcmlnaHQgPSBUUlVFOwotICAgIH0KLSAgcGFyc2Vfc3BlYyAoaWQtPnNwZWMsICZpZC0+bGVmdC5zeW0pOwotCi0jaWZkZWYgREVCVUcKLSAgaWYgKGRlYnVnX2xldmVsICYgSURERUJVRykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlczoiLCBpZC0+bGVmdC5zeW0uZmlsZSA/IGlkLT5sZWZ0LnN5bS5maWxlLT5uYW1lIDogIioiKTsKLSAgICAgIGlmIChpZC0+bGVmdC5zeW0ubmFtZSkKLQl7Ci0JICBwcmludGYgKCIlcyIsIGlkLT5sZWZ0LnN5bS5uYW1lKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpZC0+bGVmdC5zeW0ubGluZV9udW0pCi0JewotCSAgcHJpbnRmICgiJWQiLCBpZC0+bGVmdC5zeW0ubGluZV9udW0pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIqIik7Ci0JfQotICAgICAgaWYgKGlkLT5oYXNfcmlnaHQpCi0JewotCSAgcHJpbnRmICgiLyVzOiIsCi0JCSAgaWQtPnJpZ2h0LnN5bS5maWxlID8gaWQtPnJpZ2h0LnN5bS5maWxlLT5uYW1lIDogIioiKTsKLQkgIGlmIChpZC0+cmlnaHQuc3ltLm5hbWUpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlcyIsIGlkLT5yaWdodC5zeW0ubmFtZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlkLT5yaWdodC5zeW0ubGluZV9udW0pCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlZCIsIGlkLT5yaWdodC5zeW0ubGluZV9udW0pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIqIik7Ci0JICAgIH0KLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLSNlbmRpZgotfQotCi0KLS8qCi0gKiBSZXR1cm4gVFJVRSBpZmYgUEFUVEVSTiBtYXRjaGVzIFNZTS4KLSAqLwotc3RhdGljIGJvb2wKLURFRlVOIChtYXRjaCwgKHBhdHRlcm4sIHN5bSksIFN5bSAqIHBhdHRlcm4gQU5EIFN5bSAqIHN5bSkKLXsKLSAgcmV0dXJuIChwYXR0ZXJuLT5maWxlID8gcGF0dGVybi0+ZmlsZSA9PSBzeW0tPmZpbGUgOiBUUlVFKQotICAgICYmIChwYXR0ZXJuLT5saW5lX251bSA/IHBhdHRlcm4tPmxpbmVfbnVtID09IHN5bS0+bGluZV9udW0gOiBUUlVFKQotICAgICYmIChwYXR0ZXJuLT5uYW1lID8gc3RyY21wIChwYXR0ZXJuLT5uYW1lLCBzeW0tPm5hbWUpID09IDAgOiBUUlVFKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKGV4dGVuZF9tYXRjaCwgKG0sIHN5bSwgdGFiLCBzZWNvbmRfcGFzcyksCi0gICAgIHN0cnVjdCBtYXRjaCAqbSBBTkQgU3ltICogc3ltIEFORCBTeW1fVGFibGUgKiB0YWIgQU5EIGJvb2wgc2Vjb25kX3Bhc3MpCi17Ci0gIGlmIChtLT5wcmV2X21hdGNoICE9IHN5bSAtIDEpCi0gICAgewotICAgICAgLyogZGlzY29udGludWl0eTogYWRkIG5ldyBtYXRjaCB0byB0YWJsZTogKi8KLSAgICAgIGlmIChzZWNvbmRfcGFzcykKLQl7Ci0JICB0YWItPmJhc2VbdGFiLT5sZW5dID0gKnN5bTsKLQkgIG0tPnByZXZfaW5kZXggPSB0YWItPmxlbjsKLQotCSAgLyogbGluayBtYXRjaCBpbnRvIG1hdGNoJ3MgY2hhaW46ICovCi0JICB0YWItPmJhc2VbdGFiLT5sZW5dLm5leHQgPSBtLT5maXJzdF9tYXRjaDsKLQkgIG0tPmZpcnN0X21hdGNoID0gJnRhYi0+YmFzZVt0YWItPmxlbl07Ci0JfQotICAgICAgKyt0YWItPmxlbjsKLSAgICB9Ci0KLSAgLyogZXh0ZW5kIG1hdGNoIHRvIGluY2x1ZGUgdGhpcyBzeW1ib2w6ICovCi0gIGlmIChzZWNvbmRfcGFzcykKLSAgICB7Ci0gICAgICB0YWItPmJhc2VbbS0+cHJldl9pbmRleF0uZW5kX2FkZHIgPSBzeW0tPmVuZF9hZGRyOwotICAgIH0KLSAgbS0+cHJldl9tYXRjaCA9IHN5bTsKLX0KLQotCi0vKgotICogR28gdGhyb3VnaCBzeW1faWQgbGlzdCBwcm9kdWNlZCBieSBvcHRpb24gcHJvY2Vzc2luZyBhbmQgZmlsbAotICogaW4gdGhlIHZhcmlvdXMgc3ltYm9sIHRhYmxlcyBpbmRpY2F0aW5nIHdoYXQgc3ltYm9scyBzaG91bGQKLSAqIGJlIGRpc3BsYXllZCBvciBzdXBwcmVzc2VkIGZvciB0aGUgdmFyaW91cyBraW5kcyBvZiBvdXRwdXRzLgotICoKLSAqIFRoaXMgY2FuIHBvdGVudGlhbGx5IHByb2R1Y2UgaHVnZSB0YWJsZXMgYW5kIGluIHBhcnRpY3VsYXJzCi0gKiB0b25zIG9mIGFyY3MsIGJ1dCB0aGlzIGhhcHBlbnMgb25seSBpZiB0aGUgdXNlciBtYWtlcyBzaWxseQotICogcmVxdWVzdHMtLS15b3UgZ2V0IHdoYXQgeW91IGFzayBmb3IhCi0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKHN5bV9pZF9wYXJzZSkKLXsKLSAgU3ltICpzeW0sICpsZWZ0LCAqcmlnaHQ7Ci0gIHN0cnVjdCBzeW1faWQgKmlkOwotICBTeW1fVGFibGUgKnRhYjsKLQotICAvKgotICAgKiBDb252ZXJ0IHN5bWJvbCBpZHMgaW50byBTeW1zLCBzbyB3ZSBjYW4gZGVhbCB3aXRoIHRoZW0gbW9yZSBlYXNpbHk6Ci0gICAqLwotICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCi0gICAgewotICAgICAgcGFyc2VfaWQgKGlkKTsKLSAgICB9Ci0KLSAgLyogZmlyc3QgZGV0ZXJtaW5lIHNpemUgb2YgZWFjaCB0YWJsZTogKi8KLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGZvciAoaWQgPSBpZF9saXN0OyBpZDsgaWQgPSBpZC0+bmV4dCkKLQl7Ci0JICBpZiAobWF0Y2ggKCZpZC0+bGVmdC5zeW0sIHN5bSkpCi0JICAgIHsKLQkgICAgICBleHRlbmRfbWF0Y2ggKCZpZC0+bGVmdCwgc3ltLCAmc3ltc1tpZC0+d2hpY2hfdGFibGVdLCBGQUxTRSk7Ci0JICAgIH0KLQkgIGlmIChpZC0+aGFzX3JpZ2h0ICYmIG1hdGNoICgmaWQtPnJpZ2h0LnN5bSwgc3ltKSkKLQkgICAgewotCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5yaWdodCwgc3ltLCAmcmlnaHRfaWRzLCBGQUxTRSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGNyZWF0ZSB0YWJsZXMgb2YgYXBwcm9wcmlhdGUgc2l6ZSBhbmQgcmVzZXQgbGVuZ3RoczogKi8KLQotICBmb3IgKHRhYiA9IHN5bXM7IHRhYiA8ICZzeW1zW05VTV9UQUJMRVNdOyArK3RhYikKLSAgICB7Ci0gICAgICBpZiAodGFiLT5sZW4pCi0JewotCSAgdGFiLT5iYXNlID0gKFN5bSAqKSB4bWFsbG9jICh0YWItPmxlbiAqIHNpemVvZiAoU3ltKSk7Ci0JICB0YWItPmxpbWl0ID0gdGFiLT5iYXNlICsgdGFiLT5sZW47Ci0JICB0YWItPmxlbiA9IDA7Ci0JfQotICAgIH0KLSAgaWYgKHJpZ2h0X2lkcy5sZW4pCi0gICAgewotICAgICAgcmlnaHRfaWRzLmJhc2UgPSAoU3ltICopIHhtYWxsb2MgKHJpZ2h0X2lkcy5sZW4gKiBzaXplb2YgKFN5bSkpOwotICAgICAgcmlnaHRfaWRzLmxpbWl0ID0gcmlnaHRfaWRzLmJhc2UgKyByaWdodF9pZHMubGVuOwotICAgICAgcmlnaHRfaWRzLmxlbiA9IDA7Ci0gICAgfQotCi0gIC8qIG1ha2UgYSBzZWNvbmQgcGFzcyB0aHJvdWdoIHN5bXRhYiwgY3JlYXRpbmcgc3ltcyBhcyBuZWNlc3Nhcnk6ICovCi0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCi0JewotCSAgaWYgKG1hdGNoICgmaWQtPmxlZnQuc3ltLCBzeW0pKQotCSAgICB7Ci0JICAgICAgZXh0ZW5kX21hdGNoICgmaWQtPmxlZnQsIHN5bSwgJnN5bXNbaWQtPndoaWNoX3RhYmxlXSwgVFJVRSk7Ci0JICAgIH0KLQkgIGlmIChpZC0+aGFzX3JpZ2h0ICYmIG1hdGNoICgmaWQtPnJpZ2h0LnN5bSwgc3ltKSkKLQkgICAgewotCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5yaWdodCwgc3ltLCAmcmlnaHRfaWRzLCBUUlVFKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogZ28gdGhyb3VnaCBpZHMgY3JlYXRpbmcgYXJjcyBhcyBuZWVkZWQ6ICovCi0KLSAgZm9yIChpZCA9IGlkX2xpc3Q7IGlkOyBpZCA9IGlkLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChpZC0+aGFzX3JpZ2h0KQotCXsKLQkgIGZvciAobGVmdCA9IGlkLT5sZWZ0LmZpcnN0X21hdGNoOyBsZWZ0OyBsZWZ0ID0gbGVmdC0+bmV4dCkKLQkgICAgewotCSAgICAgIGZvciAocmlnaHQgPSBpZC0+cmlnaHQuZmlyc3RfbWF0Y2g7IHJpZ2h0OyByaWdodCA9IHJpZ2h0LT5uZXh0KQotCQl7Ci0JCSAgREJHIChJRERFQlVHLAotCQkgICAgICAgcHJpbnRmICgKLQkJCQkiW3N5bV9pZF9wYXJzZV06IGFyYyAlczolcyglbHgtJWx4KSAtPiAlczolcyglbHgtJWx4KSB0byAlc1xuIiwKLQkJCQlsZWZ0LT5maWxlID8gbGVmdC0+ZmlsZS0+bmFtZSA6ICIqIiwKLQkJCQlsZWZ0LT5uYW1lID8gbGVmdC0+bmFtZSA6ICIqIiwKLQkJCQkodW5zaWduZWQgbG9uZykgbGVmdC0+YWRkciwKLQkJCQkodW5zaWduZWQgbG9uZykgbGVmdC0+ZW5kX2FkZHIsCi0JCQkJcmlnaHQtPmZpbGUgPyByaWdodC0+ZmlsZS0+bmFtZSA6ICIqIiwKLQkJCQlyaWdodC0+bmFtZSA/IHJpZ2h0LT5uYW1lIDogIioiLAotCQkJCSh1bnNpZ25lZCBsb25nKSByaWdodC0+YWRkciwKLQkJCQkodW5zaWduZWQgbG9uZykgcmlnaHQtPmVuZF9hZGRyLAotCQkJCXRhYmxlX25hbWVbaWQtPndoaWNoX3RhYmxlXSkpOwotCQkgIGFyY19hZGQgKGxlZnQsIHJpZ2h0LCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogZmluYWxseSwgd2UgY2FuIHNvcnQgdGhlIHRhYmxlcyBhbmQgd2UncmUgZG9uZTogKi8KLQotICBmb3IgKHRhYiA9ICZzeW1zWzBdOyB0YWIgPCAmc3ltc1tOVU1fVEFCTEVTXTsgKyt0YWIpCi0gICAgewotICAgICAgREJHIChJRERFQlVHLCBwcmludGYgKCJbc3ltX2lkX3BhcnNlXSBzeW1zWyVzXTpcbiIsCi0JCQkgICAgdGFibGVfbmFtZVt0YWIgLSAmc3ltc1swXV0pKTsKLSAgICAgIHN5bXRhYl9maW5hbGl6ZSAodGFiKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFN5bWJvbCB0YWJsZXMgc3RvcmluZyB0aGUgRlJPTSBzeW1ib2xzIG9mIGFyY3MgZG8gbm90IG5lY2Vzc2FyaWx5Ci0gKiBoYXZlIGRpc3RpbmN0IGFkZHJlc3MgcmFuZ2VzLiAgRm9yIGV4YW1wbGUsIHNvbWVib2R5IG1pZ2h0IHJlcXVlc3QKLSAqIC1rIC9fbWNvdW50IHRvIHN1cHByZXNzIGFueSBhcmNzIGludG8gX21jb3VudCwgd2hpbGUgYXQgdGhlIHNhbWUKLSAqIHRpbWUgcmVxdWVzdGluZyAtayBhL2IuICBGb3J0dW5hdGVseSwgdGhvc2Ugc3ltYm9sIHRhYmxlcyBkb24ndCBnZXQKLSAqIHZlcnkgYmlnICh0aGUgdXNlciBoYXMgdG8gdHlwZSB0aGVtISksIHNvIGEgbGluZWFyIHNlYXJjaCBpcyBwcm9iYWJseQotICogdG9sZXJhYmxlLgotICovCi1ib29sCi1ERUZVTiAoc3ltX2lkX2FyY19pc19wcmVzZW50LCAoc3ltdGFiLCBmcm9tLCB0byksCi0gICAgICAgU3ltX1RhYmxlICogc3ltdGFiIEFORCBTeW0gKiBmcm9tIEFORCBTeW0gKiB0bykKLXsKLSAgU3ltICpzeW07Ci0KLSAgZm9yIChzeW0gPSBzeW10YWItPmJhc2U7IHN5bSA8IHN5bXRhYi0+bGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGlmIChmcm9tLT5hZGRyID49IHN5bS0+YWRkciAmJiBmcm9tLT5hZGRyIDw9IHN5bS0+ZW5kX2FkZHIKLQkgICYmIGFyY19sb29rdXAgKHN5bSwgdG8pKQotCXsKLQkgIHJldHVybiBUUlVFOwotCX0KLSAgICB9Ci0gIHJldHVybiBGQUxTRTsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3N5bV9pZHMuaCBiL2dwcm9mL3N5bV9pZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5NjMzOC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zeW1faWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jaWZuZGVmIHN5bV9pZHNfaAotI2RlZmluZSBzeW1faWRzX2gKLQotI2luY2x1ZGUgInN5bXRhYi5oIgotCi10eXBlZGVmIGVudW0KLSAgewotICAgIElOQ0xfR1JBUEggPSAwLCBFWENMX0dSQVBILAotICAgIElOQ0xfQVJDUywgRVhDTF9BUkNTLAotICAgIElOQ0xfRkxBVCwgRVhDTF9GTEFULAotICAgIElOQ0xfVElNRSwgRVhDTF9USU1FLAotICAgIElOQ0xfQU5OTywgRVhDTF9BTk5PLAotICAgIElOQ0xfRVhFQywgRVhDTF9FWEVDLAotICAgIE5VTV9UQUJMRVMKLSAgfQotVGFibGVfSWQ7Ci0KLWV4dGVybiBTeW1fVGFibGUgc3ltc1tOVU1fVEFCTEVTXTsKLQotZXh0ZXJuIHZvaWQgc3ltX2lkX2FkZCBQQVJBTVMgKChjb25zdCBjaGFyICpzcGVjLCBUYWJsZV9JZCB3aGljaF90YWJsZSkpOwotZXh0ZXJuIHZvaWQgc3ltX2lkX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBib29sIHN5bV9pZF9hcmNfaXNfcHJlc2VudCBQQVJBTVMgKChTeW1fVGFibGUgKiBzeW10YWIsCi0JCQkJCSAgIFN5bSAqIGZyb20sIFN5bSAqIHRvKSk7Ci0KLSNlbmRpZiAvKiBzeW1faWRzX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3N5bXRhYi5jIGIvZ3Byb2Yvc3ltdGFiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZmRhNDYuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltdGFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLVN5bV9UYWJsZSBzeW10YWI7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgYSBzeW1ib2wgKHNvIGl0J3MgZW1wdHkpLgotICovCi12b2lkCi1ERUZVTiAoc3ltX2luaXQsIChzeW0pLCBTeW0gKiBzeW0pCi17Ci0gIG1lbXNldCAoc3ltLCAwLCBzaXplb2YgKCpzeW0pKTsKLSAgLyoKLSAgICogSXQgaXMgbm90IHNhZmUgdG8gYXNzdW1lIHRoYXQgYSBiaW5hcnkgemVybyBjb3JyZXNwb25kcyB0bwotICAgKiBhIGZsb2F0aW5nLXBvaW50IDAuMCwgc28gaW5pdGlhbGl6ZSBmbG9hdHMgZXhwbGljaXRseToKLSAgICovCi0gIHN5bS0+aGlzdC50aW1lID0gMC4wOwotICBzeW0tPmNnLmNoaWxkX3RpbWUgPSAwLjA7Ci0gIHN5bS0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKLSAgc3ltLT5jZy5wcm9wLnNlbGYgPSAwLjA7Ci0gIHN5bS0+Y2cucHJvcC5jaGlsZCA9IDAuMDsKLX0KLQotCi0vKgotICogQ29tcGFyZSB0aGUgZnVuY3Rpb24gZW50cnktcG9pbnQgb2YgdHdvIHN5bWJvbHMgYW5kIHJldHVybiA8MCwgPTAsCi0gKiBvciA+MCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbGVmdCB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4sIGVxdWFsCi0gKiB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSByaWdodCB2YWx1ZS4gIElmIHR3byBzeW1ib2xzIGFyZSBlcXVhbAotICogYnV0IG9uZSBoYXMgaXNfZnVuYyBzZXQgYW5kIHRoZSBvdGhlciBkb2Vzbid0LCB3ZSBtYWtlIHRoZQotICogbm9uLWZ1bmN0aW9uIHN5bWJvbCBvbmUgImJpZ2dlciIgc28gdGhhdCB0aGUgZnVuY3Rpb24gc3ltYm9sIHdpbGwKLSAqIHN1cnZpdmUgZHVwbGljYXRlIHJlbW92YWwuICBGaW5hbGx5LCBpZiBib3RoIHN5bWJvbHMgaGF2ZSB0aGUKLSAqIHNhbWUgaXNfZnVuYyB2YWx1ZSwgd2UgZGlzY3JpbWluYXRlIGFnYWluc3QgaXNfc3RhdGljIHN1Y2ggdGhhdAotICogdGhlIGdsb2JhbCBzeW1ib2wgc3Vydml2ZXMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfYWRkciwgKGxwLCBycCksIGNvbnN0IFBUUiBscCBBTkQgY29uc3QgUFRSIHJwKQotewotICBTeW0gKmxlZnQgPSAoU3ltICopIGxwOwotICBTeW0gKnJpZ2h0ID0gKFN5bSAqKSBycDsKLQotICBpZiAobGVmdC0+YWRkciA+IHJpZ2h0LT5hZGRyKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZSBpZiAobGVmdC0+YWRkciA8IHJpZ2h0LT5hZGRyKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGxlZnQtPmlzX2Z1bmMgIT0gcmlnaHQtPmlzX2Z1bmMpCi0gICAgewotICAgICAgcmV0dXJuIHJpZ2h0LT5pc19mdW5jIC0gbGVmdC0+aXNfZnVuYzsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlZnQtPmlzX3N0YXRpYyAtIHJpZ2h0LT5pc19zdGF0aWM7Ci19Ci0KLQotdm9pZAotREVGVU4gKHN5bXRhYl9maW5hbGl6ZSwgKHRhYiksIFN5bV9UYWJsZSAqIHRhYikKLXsKLSAgU3ltICpzcmMsICpkc3Q7Ci0gIGJmZF92bWEgcHJldl9hZGRyOwotCi0gIGlmICghdGFiLT5sZW4pCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKgotICAgKiBTb3J0IHN5bWJvbCB0YWJsZSBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIGZ1bmN0aW9uIGFkZHJlc3NlczoKLSAgICovCi0gIHFzb3J0ICh0YWItPmJhc2UsIHRhYi0+bGVuLCBzaXplb2YgKFN5bSksIGNtcF9hZGRyKTsKLQotICAvKgotICAgKiBSZW1vdmUgZHVwbGljYXRlIGVudHJpZXMgdG8gc3BlZWQtdXAgbGF0ZXIgcHJvY2Vzc2luZyBhbmQKLSAgICogc2V0IGVuZF9hZGRyIGlmIGl0cyBub3Qgc2V0IHlldDoKLSAgICovCi0gIHByZXZfYWRkciA9IHRhYi0+YmFzZVswXS5hZGRyICsgMTsKLSAgZm9yIChzcmMgPSBkc3QgPSB0YWItPmJhc2U7IHNyYyA8IHRhYi0+bGltaXQ7ICsrc3JjKQotICAgIHsKLSAgICAgIGlmIChzcmMtPmFkZHIgPT0gcHJldl9hZGRyKQotCXsKLQkgIC8qCi0JICAgKiBJZiBzYW1lIGFkZHJlc3MsIGZhdm9yIGdsb2JhbCBzeW1ib2wgb3ZlciBzdGF0aWMgb25lLAotCSAgICogdGhlbiBmdW5jdGlvbiBvdmVyIGxpbmUgbnVtYmVyLiAgSWYgYm90aCBzeW1ib2xzIGFyZQotCSAgICogZWl0aGVyIHN0YXRpYyBvciBnbG9iYWwgYW5kIGVpdGhlciBmdW5jdGlvbiBvciBsaW5lLCBjaGVjawotCSAgICogd2hldGhlciBvbmUgaGFzIG5hbWUgYmVnaW5uaW5nIHdpdGggdW5kZXJzY29yZSB3aGlsZQotCSAgICogdGhlIG90aGVyIGRvZXNuJ3QuICBJbiBzdWNoIGNhc2VzLCBrZWVwIHN5bSB3aXRob3V0Ci0JICAgKiB1bmRlcnNjb3JlLiAgVGhpcyB0YWtlcyBjYXJlcyBvZiBjb21waWxlciBnZW5lcmF0ZWQKLQkgICAqIHN5bWJvbHMgKHN1Y2ggYXMgX19nbnVfY29tcGlsZWQsIF9fYzg5X3VzZWQsIGV0Yy4pLgotCSAgICovCi0JICBpZiAoKCFzcmMtPmlzX3N0YXRpYyAmJiBkc3RbLTFdLmlzX3N0YXRpYykKLQkgICAgICB8fCAoKHNyYy0+aXNfc3RhdGljID09IGRzdFstMV0uaXNfc3RhdGljKQotCQkgICYmICgoc3JjLT5pc19mdW5jICYmICFkc3RbLTFdLmlzX2Z1bmMpCi0JCSAgICAgIHx8ICgoc3JjLT5pc19mdW5jID09IGRzdFstMV0uaXNfZnVuYykKLQkJCSAgJiYgKChzcmMtPm5hbWVbMF0gIT0gJ18nICYmIGRzdFstMV0ubmFtZVswXSA9PSAnXycpCi0JCQkgICAgICB8fCAoc3JjLT5uYW1lWzBdCi0JCQkJICAmJiBzcmMtPm5hbWVbMV0gIT0gJ18nCi0JCQkJICAmJiBkc3RbLTFdLm5hbWVbMV0gPT0gJ18nKSkpKSkpCi0JICAgIHsKLQkgICAgICBEQkcgKEFPVVRERUJVRyB8IElEREVCVUcsCi0JCSAgIHByaW50ZiAoIltzeW10YWJfZmluYWxpemVdIGZhdm9yICVzQCVjJWMgb3ZlciAlc0AlYyVjIiwKLQkJCSAgIHNyYy0+bmFtZSwgc3JjLT5pc19zdGF0aWMgPyAndCcgOiAnVCcsCi0JCQkgICBzcmMtPmlzX2Z1bmMgPyAnRicgOiAnZicsCi0JCQkgICBkc3RbLTFdLm5hbWUsIGRzdFstMV0uaXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgZHN0Wy0xXS5pc19mdW5jID8gJ0YnIDogJ2YnKTsKLQkJICAgcHJpbnRmICgiIChhZGRyPSVseClcbiIsICh1bnNpZ25lZCBsb25nKSBzcmMtPmFkZHIpKTsKLQkgICAgICBkc3RbLTFdID0gKnNyYzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSBmYXZvciAlc0AlYyVjIG92ZXIgJXNAJWMlYyIsCi0JCQkgICBkc3RbLTFdLm5hbWUsIGRzdFstMV0uaXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgZHN0Wy0xXS5pc19mdW5jID8gJ0YnIDogJ2YnLAotCQkJICAgc3JjLT5uYW1lLCBzcmMtPmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIHNyYy0+aXNfZnVuYyA/ICdGJyA6ICdmJyk7Ci0JCSAgIHByaW50ZiAoIiAoYWRkcj0lbHgpXG4iLCAodW5zaWduZWQgbG9uZykgc3JjLT5hZGRyKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGRzdCA+IHRhYi0+YmFzZSAmJiBkc3RbLTFdLmVuZF9hZGRyID09IDApCi0JICAgIHsKLQkgICAgICBkc3RbLTFdLmVuZF9hZGRyID0gc3JjLT5hZGRyIC0gMTsKLQkgICAgfQotCi0JICAvKiByZXRhaW4gc3ltIG9ubHkgaWYgaXQgaGFzIGEgbm9uLWVtcHR5IGFkZHJlc3MgcmFuZ2U6ICovCi0JICBpZiAoIXNyYy0+ZW5kX2FkZHIgfHwgc3JjLT5hZGRyIDw9IHNyYy0+ZW5kX2FkZHIpCi0JICAgIHsKLQkgICAgICAqZHN0ID0gKnNyYzsKLQkgICAgICBkc3QrKzsKLQkgICAgICBwcmV2X2FkZHIgPSBzcmMtPmFkZHI7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAodGFiLT5sZW4gPiAwICYmIGRzdFstMV0uZW5kX2FkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBkc3RbLTFdLmVuZF9hZGRyID0gY29yZV90ZXh0X3NlY3QtPnZtYSArIGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUgLSAxOwotICAgIH0KLQotICBEQkcgKEFPVVRERUJVRyB8IElEREVCVUcsCi0gICAgICAgcHJpbnRmICgiW3N5bXRhYl9maW5hbGl6ZV06IHJlbW92ZWQgJWQgZHVwbGljYXRlIGVudHJpZXNcbiIsCi0JICAgICAgIHRhYi0+bGVuIC0gKGludCkgKGRzdCAtIHRhYi0+YmFzZSkpKTsKLQotICB0YWItPmxpbWl0ID0gZHN0OwotICB0YWItPmxlbiA9IHRhYi0+bGltaXQgLSB0YWItPmJhc2U7Ci0KLSAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotICAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICAgZm9yIChqID0gMDsgaiA8IHRhYi0+bGVuOyArK2opCi0gICAgICAgewotICAgICAgIHByaW50ZiAoIltzeW10YWJfZmluYWxpemVdIDB4JWx4LTB4JWx4XHQlc1xuIiwKLQkgICAgICAgKGxvbmcpIHRhYi0+YmFzZVtqXS5hZGRyLCAobG9uZykgdGFiLT5iYXNlW2pdLmVuZF9hZGRyLAotCSAgICAgICB0YWItPmJhc2Vbal0ubmFtZSk7Ci0gICAgICAgfQotICApOwotfQotCi0KLSNpZmRlZiBERUJVRwotCi1TeW0gKgotREVGVU4gKGRiZ19zeW1fbG9va3VwLCAoc3ltdGFiLCBhZGRyZXNzKSwgU3ltX1RhYmxlICogc3ltdGFiIEFORCBiZmRfdm1hIGFkZHJlc3MpCi17Ci0gIGxvbmcgbG93LCBtaWQsIGhpZ2g7Ci0gIFN5bSAqc3ltOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gYWRkcmVzcyAweCVseFxuIiwKLQkgICAodW5zaWduZWQgbG9uZykgYWRkcmVzcyk7Ci0KLSAgc3ltID0gc3ltdGFiLT5iYXNlOwotICBmb3IgKGxvdyA9IDAsIGhpZ2ggPSBzeW10YWItPmxlbiAtIDE7IGxvdyAhPSBoaWdoOykKLSAgICB7Ci0gICAgICBtaWQgPSAoaGlnaCArIGxvdykgPj4gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gbG93PTB4JWx4LCBtaWQ9MHglbHgsIGhpZ2g9MHglbHhcbiIsCi0JICAgICAgIGxvdywgbWlkLCBoaWdoKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gc3ltW21dPTB4JWx4IHN5bVttICsgMV09MHglbHhcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzeW1bbWlkXS5hZGRyLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc3ltW21pZCArIDFdLmFkZHIpOwotICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPD0gYWRkcmVzcyAmJiBzeW1bbWlkICsgMV0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgcmV0dXJuICZzeW1bbWlkXTsKLQl9Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgaGlnaCA9IG1pZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG93ID0gbWlkICsgMTsKLQl9Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIGJpbmFyeSBzZWFyY2ggZmFpbHM/Pz9cbiIpOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCS8qIERFQlVHICovCi0KLQotLyoKLSAqIExvb2sgdXAgYW4gYWRkcmVzcyBpbiB0aGUgc3ltYm9sLXRhYmxlIHRoYXQgaXMgc29ydGVkIGJ5IGFkZHJlc3MuCi0gKiBJZiBhZGRyZXNzIGRvZXMgbm90IGhpdCBhbnkgc3ltYm9sLCAwIGlzIHJldHVybmVkLgotICovCi1TeW0gKgotREVGVU4gKHN5bV9sb29rdXAsIChzeW10YWIsIGFkZHJlc3MpLCBTeW1fVGFibGUgKiBzeW10YWIgQU5EIGJmZF92bWEgYWRkcmVzcykKLXsKLSAgbG9uZyBsb3csIGhpZ2g7Ci0gIGxvbmcgbWlkID0gLTE7Ci0gIFN5bSAqc3ltOwotI2lmZGVmIERFQlVHCi0gIGludCBwcm9iZXMgPSAwOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgaWYgKCFzeW10YWItPmxlbikKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc3ltID0gc3ltdGFiLT5iYXNlOwotICBmb3IgKGxvdyA9IDAsIGhpZ2ggPSBzeW10YWItPmxlbiAtIDE7IGxvdyAhPSBoaWdoOykKLSAgICB7Ci0gICAgICBEQkcgKExPT0tVUERFQlVHLCArK3Byb2Jlcyk7Ci0gICAgICBtaWQgPSAoaGlnaCArIGxvdykgLyAyOwotICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPD0gYWRkcmVzcyAmJiBzeW1bbWlkICsgMV0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgaWYgKGFkZHJlc3MgPiBzeW1bbWlkXS5lbmRfYWRkcikKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogQWRkcmVzcyBmYWxscyBpbnRvIGdhcCBiZXR3ZWVuIHN5bVttaWRdIGFuZAotCSAgICAgICAqIHN5bVttaWQgKyAxXToKLQkgICAgICAgKi8KLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgREJHIChMT09LVVBERUJVRywKLQkJICAgcHJpbnRmICgiW3N5bV9sb29rdXBdICVkIHByb2JlcyAoc3ltdGFiLT5sZW49JXUpXG4iLAotCQkJICAgcHJvYmVzLCBzeW10YWItPmxlbiAtIDEpKTsKLQkgICAgICByZXR1cm4gJnN5bVttaWRdOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPiBhZGRyZXNzKQotCXsKLQkgIGhpZ2ggPSBtaWQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvdyA9IG1pZCArIDE7Ci0JfQotICAgIH0KLSAgaWYgKHN5bVttaWQgKyAxXS5hZGRyIDw9IGFkZHJlc3MpCi0gICAgewotICAgICAgaWYgKGFkZHJlc3MgPiBzeW1bbWlkICsgMV0uZW5kX2FkZHIpCi0JewotCSAgLyogYWRkcmVzcyBpcyBiZXlvbmQgZW5kIG9mIHN5bVttaWQgKyAxXTogKi8KLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBEQkcgKExPT0tVUERFQlVHLCBwcmludGYgKCJbc3ltX2xvb2t1cF0gJWQgKCV1KSBwcm9iZXMsIGZhbGwgb2ZmXG4iLAotCQkJCSAgICBwcm9iZXMsIHN5bXRhYi0+bGVuIC0gMSkpOwotCSAgcmV0dXJuICZzeW1bbWlkICsgMV07Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zeW10YWIuaCBiL2dwcm9mL3N5bXRhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE0NTBlLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3N5bXRhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSNpZm5kZWYgc3ltdGFiX2gKLSNkZWZpbmUgc3ltdGFiX2gKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0KLS8qCi0gKiBGb3IgYSBwcm9maWxlIHRvIGJlIGludGVsbGlnaWJsZSB0byBhIGh1bWFuIHVzZXIsIGl0IGlzIG5lY2Vzc2FyeQotICogdG8gbWFwIGNvZGUtYWRkcmVzc2VzIGludG8gc291cmNlLWNvZGUgaW5mb3JtYXRpb24uICBTb3VyY2UtY29kZQotICogaW5mb3JtYXRpb24gY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZjogKGkpIGZ1bmN0aW9uLW5hbWUsIChpaSkKLSAqIHNvdXJjZSBmaWxlLW5hbWUsIGFuZCAoaWlpKSBzb3VyY2UgbGluZSBudW1iZXIuCi0gKgotICogVGhlIHN5bWJvbCB0YWJsZSBpcyB1c2VkIHRvIG1hcCBhZGRyZXNzZXMgaW50byBzb3VyY2UtY29kZQotICogaW5mb3JtYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgInNvdXJjZS5oIgotCi0jZGVmaW5lIE5CQlMgMTAKLQotLyoKLSAqIFN5bWJvbC1lbnRyeS4gIEZvciBlYWNoIGV4dGVybmFsIGluIHRoZSBzcGVjaWZpZWQgZmlsZSB3ZSBnYXRoZXIKLSAqIGl0cyBhZGRyZXNzLCB0aGUgbnVtYmVyIG9mIGNhbGxzIGFuZCBjb21wdXRlIGl0cyBzaGFyZSBvZiBjcHUgdGltZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3ltCi0gIHsKLSAgICAvKgotICAgICAqIENvbW1vbiBpbmZvcm1hdGlvbjoKLSAgICAgKgotICAgICAqIEluIHRoZSBzeW1ib2wtdGFibGUsIGZpZWxkcyBBRERSIGFuZCBGVU5DX05BTUUgYXJlIGd1YXJhbnRlZWQKLSAgICAgKiB0byBjb250YWluIHZhbGlkIGluZm9ybWF0aW9uLiAgRklMRSBtYXkgYmUgMCwgaWYgdW5rbm93biBhbmQKLSAgICAgKiBMSU5FX05VTSBtYXliZSAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgYmZkX3ZtYSBhZGRyOwkJLyogYWRkcmVzcyBvZiBlbnRyeSBwb2ludCAqLwotICAgIGJmZF92bWEgZW5kX2FkZHI7CQkvKiBlbmQtYWRkcmVzcyAqLwotICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIGZ1bmN0aW9uIHRoaXMgc3ltIGlzIGZyb20gKi8KLSAgICBTb3VyY2VfRmlsZSAqZmlsZTsJCS8qIHNvdXJjZSBmaWxlIHN5bWJvbCBjb21lcyBmcm9tICovCi0gICAgaW50IGxpbmVfbnVtOwkJLyogc291cmNlIGxpbmUgbnVtYmVyICovCi0gICAgdW5zaWduZWQgaW50IGlzX2Z1bmM6MSwJLyogaXMgdGhpcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50PyAqLwotICAgICAgaXNfc3RhdGljOjEsCQkvKiBpcyB0aGlzIGEgbG9jYWwgKHN0YXRpYykgc3ltYm9sPyAqLwotICAgICAgaXNfYmJfaGVhZDoxLAkJLyogaXMgdGhpcyB0aGUgaGVhZCBvZiBhIGJhc2ljLWJsaz8gKi8KLSAgICAgIG1hcHBlZDoxLAkJCS8qIHRoaXMgc3ltYm9sIHdhcyBtYXBwZWQgdG8gYW5vdGhlciBuYW1lICovCi0gICAgICBoYXNfYmVlbl9wbGFjZWQ6MTsJLyogaGF2ZSB3ZSBwbGFjZWQgdGhpcyBzeW1ib2w/ICAqLwotICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwkvKiBob3cgbWFueSB0aW1lcyBleGVjdXRlZCAqLwotICAgIGludCBudXNlczsJCQkvKiBob3cgbWFueSB0aW1lcyB0aGlzIHN5bWJvbCBhcHBlYXJzIGluCi0JCQkJICAgYSBwYXJ0aWN1bGFyIGNvbnRleHQgKi8KLSAgICBiZmRfdm1hIGJiX2FkZHJbTkJCU107CS8qIGFkZHJlc3Mgb2YgYmFzaWMtYmxvY2sgc3RhcnQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGJiX2NhbGxzW05CQlNdOyAvKiBob3cgbWFueSB0aW1lcyBiYXNpYy1ibG9jayB3YXMgY2FsbGVkICovCi0gICAgc3RydWN0IHN5bSAqbmV4dDsJCS8qIGZvciBidWlsZGluZyBjaGFpbnMgb2Ygc3ltcyAqLwotICAgIHN0cnVjdCBzeW0gKnByZXY7CQkvKiBmb3IgYnVpbGRpbmcgY2hhaW5zIG9mIHN5bXMgKi8KLQotICAgIC8qIHByb2ZpbGUtc3BlY2lmaWMgaW5mb3JtYXRpb246ICovCi0KLSAgICAvKiBoaXN0b2dyYW0gc3BlY2lmaWMgaW5mbzogKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQlkb3VibGUgdGltZTsJCS8qICh3ZWlnaHRlZCkgdGlja3MgaW4gdGhpcyByb3V0aW5lICovCi0JYmZkX3ZtYSBzY2FsZWRfYWRkcjsJLyogc2NhbGVkIGVudHJ5IHBvaW50ICovCi0gICAgICB9Ci0gICAgaGlzdDsKLQotICAgIC8qIGNhbGwtZ3JhcGggc3BlY2lmaWMgaW5mbzogKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIHNlbGZfY2FsbHM7IC8qIGhvdyBtYW55IGNhbGxzIHRvIHNlbGYgKi8KLQlkb3VibGUgY2hpbGRfdGltZTsJLyogY3VtdWxhdGl2ZSB0aWNrcyBpbiBjaGlsZHJlbiAqLwotCWludCBpbmRleDsJCS8qIGluZGV4IGluIHRoZSBncmFwaCBsaXN0ICovCi0JaW50IHRvcF9vcmRlcjsJCS8qIGdyYXBoIGNhbGwgY2hhaW4gdG9wLXNvcnQgb3JkZXIgKi8KLQlib29sIHByaW50X2ZsYWc7CS8qIHNob3VsZCB0aGlzIGJlIHByaW50ZWQ/ICovCi0Jc3RydWN0Ci0JICB7Ci0JICAgIGRvdWJsZSBmcmFjdDsJLyogd2hhdCAlIG9mIHRpbWUgcHJvcGFnYXRlcyAqLwotCSAgICBkb3VibGUgc2VsZjsJLyogaG93IG11Y2ggc2VsZiB0aW1lIHByb3BhZ2F0ZXMgKi8KLQkgICAgZG91YmxlIGNoaWxkOwkvKiBob3cgbXVjaCBjaGlsZCB0aW1lIHByb3BhZ2F0ZXMgKi8KLQkgIH0KLQlwcm9wOwotCXN0cnVjdAotCSAgewotCSAgICBpbnQgbnVtOwkJLyogaW50ZXJuYWwgbnVtYmVyIG9mIGN5Y2xlIG9uICovCi0JICAgIHN0cnVjdCBzeW0gKmhlYWQ7CS8qIGhlYWQgb2YgY3ljbGUgKi8KLQkgICAgc3RydWN0IHN5bSAqbmV4dDsJLyogbmV4dCBtZW1iZXIgb2YgY3ljbGUgKi8KLQkgIH0KLQljeWM7Ci0Jc3RydWN0IGFyYyAqcGFyZW50czsJLyogbGlzdCBvZiBjYWxsZXIgYXJjcyAqLwotCXN0cnVjdCBhcmMgKmNoaWxkcmVuOwkvKiBsaXN0IG9mIGNhbGxlZSBhcmNzICovCi0gICAgICB9Ci0gICAgY2c7Ci0gIH0KLVN5bTsKLQotLyoKLSAqIFN5bWJvbC10YWJsZXMgYXJlIGFsd2F5cyBhc3N1bWVkIHRvIGJlIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyCi0gKiBvZiBhZGRyZXNzZXM6Ci0gKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbGVuOwkJLyogIyBvZiBzeW1ib2xzIGluIHRoaXMgdGFibGUgKi8KLSAgICBTeW0gKmJhc2U7CQkJLyogZmlyc3QgZWxlbWVudCBpbiBzeW1ib2wgdGFibGUgKi8KLSAgICBTeW0gKmxpbWl0OwkJCS8qIGxpbWl0ID0gYmFzZSArIGxlbiAqLwotICB9Ci1TeW1fVGFibGU7Ci0KLWV4dGVybiBTeW1fVGFibGUgc3ltdGFiOwkvKiB0aGUgc3ltYm9sIHRhYmxlICovCi0KLWV4dGVybiB2b2lkIHN5bV9pbml0IFBBUkFNUyAoKFN5bSAqIHN5bSkpOwotZXh0ZXJuIHZvaWQgc3ltdGFiX2ZpbmFsaXplIFBBUkFNUyAoKFN5bV9UYWJsZSAqIHN5bXRhYikpOwotZXh0ZXJuIFN5bSAqc3ltX2xvb2t1cCBQQVJBTVMgKChTeW1fVGFibGUgKiBzeW10YWIsIGJmZF92bWEgYWRkcmVzcykpOwotCi1leHRlcm4gdm9pZCBmaW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLQotI2VuZGlmIC8qIHN5bXRhYl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi90YWhvZS5jIGIvZ3Byb2YvdGFob2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4MWJjNS4uMDAwMDAwMAotLS0gYS9ncHJvZi90YWhvZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLSAgICAvKgotICAgICAqICAgICAgICBvcGNvZGUgb2YgdGhlIGBjYWxsZicgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSNkZWZpbmUJQ0FMTEYJMHhmZQotCi0gICAgLyoKLSAgICAgKiAgICAgICAgcmVnaXN0ZXIgZm9yIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSAgICAgKi8KLSNkZWZpbmUJUEMJMHhmCi0KLWVudW0gdGFob2Vfb3Blcm1vZGVzCi0gIHsKLSAgICBsaXRlcmFsLCBpbmRleGVkLCByZWcsIHJlZ2RlZiwgYXV0b2RlYywgYXV0b2luYywgYXV0b2luY2RlZiwKLSAgICBieXRlZGlzcCwgYnl0ZWRpc3BkZWYsIHdvcmRkaXNwLCB3b3JkZGlzcGRlZiwgbG9uZ2Rpc3AsIGxvbmdkaXNwZGVmLAotICAgIGltbWVkaWF0ZSwgYWJzb2x1dGUsIGJ5dGVyZWwsIGJ5dGVyZWxkZWYsIHdvcmRyZWwsIHdvcmRyZWxkZWYsCi0gICAgbG9uZ3JlbCwgbG9uZ3JlbGRlZgotICB9OwotdHlwZWRlZiBlbnVtIHRhaG9lX29wZXJtb2RlcyB0YWhvZV9vcGVyYW5kZW51bTsKLQotLyoKLSAqIEEgc3ltYm9sIHRvIGJlIHRoZSBjaGlsZCBvZiBpbmRpcmVjdCBjYWxsZjoKLSAqLwotU3ltIGluZGlyZWN0Y2hpbGQ7Ci0KLQotdGFob2Vfb3BlcmFuZGVudW0KLXRhaG9lX29wZXJhbmRtb2RlIChtb2RlcCkKLSAgICAgdW5zaWduZWQgY2hhciAqbW9kZXA7Ci17Ci0gIGxvbmcgdXNlc3JlZyA9ICgobG9uZykgKm1vZGVwKSAmIDB4ZjsKLQotICBzd2l0Y2ggKCgobG9uZykgKm1vZGVwKSA+PiA0KQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gaW5kZXhlZDsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gcmVnOwotICAgIGNhc2UgNjoKLSAgICAgIHJldHVybiByZWdkZWY7Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIGF1dG9kZWM7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gMHhlID8gYXV0b2luYyA6IGltbWVkaWF0ZTsKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGF1dG9pbmNkZWYgOiBhYnNvbHV0ZTsKLSAgICBjYXNlIDEwOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcCA6IGJ5dGVyZWw7Ci0gICAgY2FzZSAxMToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYnl0ZWRpc3BkZWYgOiBieXRlcmVsZGVmOwotICAgIGNhc2UgMTI6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwIDogd29yZHJlbDsKLSAgICBjYXNlIDEzOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyB3b3JkZGlzcGRlZiA6IHdvcmRyZWxkZWY7Ci0gICAgY2FzZSAxNDoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3AgOiBsb25ncmVsOwotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGxvbmdkaXNwZGVmIDogbG9uZ3JlbGRlZjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLWNoYXIgKgotdGFob2Vfb3BlcmFuZG5hbWUgKG1vZGUpCi0gICAgIHRhaG9lX29wZXJhbmRlbnVtIG1vZGU7Ci17Ci0KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBjYXNlIGxpdGVyYWw6Ci0gICAgICByZXR1cm4gImxpdGVyYWwiOwotICAgIGNhc2UgaW5kZXhlZDoKLSAgICAgIHJldHVybiAiaW5kZXhlZCI7Ci0gICAgY2FzZSByZWc6Ci0gICAgICByZXR1cm4gInJlZ2lzdGVyIjsKLSAgICBjYXNlIHJlZ2RlZjoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIgZGVmZXJyZWQiOwotICAgIGNhc2UgYXV0b2RlYzoKLSAgICAgIHJldHVybiAiYXV0b2RlY3JlbWVudCI7Ci0gICAgY2FzZSBhdXRvaW5jOgotICAgICAgcmV0dXJuICJhdXRvaW5jcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmNkZWY6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2UgYnl0ZWRpc3A6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotICAgICAgcmV0dXJuICJieXRlIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuICJieXRlIHJlbGF0aXZlIjsKLSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIGNhc2Ugd29yZGRpc3A6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIHdvcmRkaXNwZGVmOgotICAgICAgcmV0dXJuICJ3b3JkIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkcmVsOgotICAgICAgcmV0dXJuICJ3b3JkIHJlbGF0aXZlIjsKLSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIGNhc2UgaW1tZWRpYXRlOgotICAgICAgcmV0dXJuICJpbW1lZGlhdGUiOwotICAgIGNhc2UgYWJzb2x1dGU6Ci0gICAgICByZXR1cm4gImFic29sdXRlIjsKLSAgICBjYXNlIGxvbmdkaXNwOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCI7Ci0gICAgY2FzZSBsb25nZGlzcGRlZjoKLSAgICAgIHJldHVybiAibG9uZyBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2UgbG9uZ3JlbDoKLSAgICAgIHJldHVybiAibG9uZyByZWxhdGl2ZSI7Ci0gICAgY2FzZSBsb25ncmVsZGVmOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIGRlZmVycmVkIjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLWxvbmcKLXRhaG9lX29wZXJhbmRsZW5ndGggKG1vZGVwKQotICAgICB1bnNpZ25lZCBjaGFyICptb2RlcDsKLXsKLQotICBzd2l0Y2ggKHRhaG9lX29wZXJhbmRtb2RlIChtb2RlcCkpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICBjYXNlIHJlZzoKLSAgICBjYXNlIHJlZ2RlZjoKLSAgICBjYXNlIGF1dG9kZWM6Ci0gICAgY2FzZSBhdXRvaW5jOgotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgYnl0ZWRpc3A6Ci0gICAgY2FzZSBieXRlZGlzcGRlZjoKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgY2FzZSBieXRlcmVsZGVmOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICBjYXNlIHdvcmRkaXNwZGVmOgotICAgIGNhc2Ugd29yZHJlbDoKLSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIGltbWVkaWF0ZToKLSAgICBjYXNlIGFic29sdXRlOgotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgY2FzZSBsb25nZGlzcGRlZjoKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgY2FzZSBsb25ncmVsZGVmOgotICAgICAgcmV0dXJuIDU7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuIDEgKyB0YWhvZV9vcGVyYW5kbGVuZ3RoIChtb2RlcCArIDEpOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotYmZkX3ZtYQotdGFob2VfcmVsYWRkciAobW9kZXApCi0gICAgIGNoYXIgKm1vZGVwOwotewotICB0YWhvZV9vcGVyYW5kZW51bSBtb2RlID0gdGFob2Vfb3BlcmFuZG1vZGUgKG1vZGVwKTsKLSAgY2hhciAqY3A7Ci0gIHNob3J0ICpzcDsKLSAgbG9uZyAqbHA7Ci0gIGludCBpOwotICBsb25nIHZhbHVlID0gMDsKLQotICBjcCA9IG1vZGVwOwotICArK2NwOwkJCQkvKiBza2lwIG92ZXIgdGhlIG1vZGUgKi8KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3JlbGFkZHJdIG5vdCByZWxhdGl2ZSBhZGRyZXNzXG4iKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgbW9kZXA7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmNwICsgKmNwKTsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICBmb3IgKGkgPSAwOyAoc2l6ZV90KSBpIDwgc2l6ZW9mICpzcDsgaSsrKQotCXZhbHVlID0gKHZhbHVlIDw8IDgpICsgKGNwW2ldICYgMHhmZik7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqc3AgKyB2YWx1ZSk7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgZm9yIChpID0gMDsgKHNpemVfdCkgaSA8IHNpemVvZiAqbHA7IGkrKykKLQl2YWx1ZSA9ICh2YWx1ZSA8PCA4KSArIChjcFtpXSAmIDB4ZmYpOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmxwICsgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZAotdGFob2VfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQotICAgICBTeW0gKnBhcmVudDsKLSAgICAgYmZkX3ZtYSBwX2xvd3BjOwotICAgICBiZmRfdm1hIHBfaGlnaHBjOwotewotICB1bnNpZ25lZCBjaGFyICppbnN0cnVjdHA7Ci0gIGxvbmcgbGVuZ3RoOwotICBTeW0gKmNoaWxkOwotICB0YWhvZV9vcGVyYW5kZW51bSBtb2RlOwotICB0YWhvZV9vcGVyYW5kZW51bSBmaXJzdG1vZGU7Ci0gIGJmZF92bWEgZGVzdHBjOwotICBzdGF0aWMgYm9vbCBpbml0ZWQgPSBGQUxTRTsKLQotICBpZiAoIWluaXRlZCkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSBUUlVFOwotICAgICAgc3ltX2luaXQgKCZpbmRpcmVjdGNoaWxkKTsKLSAgICAgIGluZGlyZWN0Y2hpbGQuY2cucHJvcC5mcmFjdCA9IDEuMDsKLSAgICAgIGluZGlyZWN0Y2hpbGQuY2cuY3ljLmhlYWQgPSAmaW5kaXJlY3RjaGlsZDsKLSAgICB9Ci0KLSAgaWYgKGNvcmVfdGV4dF9zcGFjZSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChwX2xvd3BjIDwgc19sb3dwYykKLSAgICB7Ci0gICAgICBwX2xvd3BjID0gc19sb3dwYzsKLSAgICB9Ci0gIGlmIChwX2hpZ2hwYyA+IHNfaGlnaHBjKQotICAgIHsKLSAgICAgIHBfaGlnaHBjID0gc19oaWdocGM7Ci0gICAgfQotICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIsCi0JCQkgIHBhcmVudC0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHBfbG93cGMsCi0JCQkgICh1bnNpZ25lZCBsb25nKSBwX2hpZ2hwYykpOwotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSArIHBfbG93cGM7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9oaWdocGM7Ci0gICAgICAgaW5zdHJ1Y3RwICs9IGxlbmd0aCkKLSAgICB7Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgaWYgKCppbnN0cnVjdHAgPT0gQ0FMTEYpCi0JewotCSAgLyoKLQkgICAqICAgIG1heWJlIGEgY2FsbGYsIGJldHRlciBjaGVjayBpdCBvdXQuCi0JICAgKiAgICAgIHNraXAgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXVx0MHglbHg6Y2FsbGYiLAotCQkJCSAgKCh1bnNpZ25lZCBsb25nKQotCQkJCSAgIChpbnN0cnVjdHAKLQkJCQkgICAgLSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UpKSkpOwotCSAgZmlyc3Rtb2RlID0gdGFob2Vfb3BlcmFuZG1vZGUgKGluc3RydWN0cCArIGxlbmd0aCk7Ci0JICBzd2l0Y2ggKGZpcnN0bW9kZSkKLQkgICAgewotCSAgICBjYXNlIGxpdGVyYWw6Ci0JICAgIGNhc2UgaW1tZWRpYXRlOgotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGdvdG8gYm90Y2hlZDsKLQkgICAgfQotCSAgbGVuZ3RoICs9IHRhaG9lX29wZXJhbmRsZW5ndGggKGluc3RydWN0cCArIGxlbmd0aCk7Ci0JICBtb2RlID0gdGFob2Vfb3BlcmFuZG1vZGUgKGluc3RydWN0cCArIGxlbmd0aCk7Ci0JICBEQkcgKENBTExERUJVRywKLQkgICAgICAgcHJpbnRmICgiXHRmaXJzdCBvcGVyYW5kIGlzICVzIiwgdGFob2Vfb3BlcmFuZG5hbWUgKGZpcnN0bW9kZSkpOwotCSAgICAgICBwcmludGYgKCJcdHNlY29uZCBvcGVyYW5kIGlzICVzXG4iLCB0YWhvZV9vcGVyYW5kbmFtZSAobW9kZSkpOwotCSAgICApOwotCSAgc3dpdGNoIChtb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgcmVnZGVmOgotCSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotCSAgICBjYXNlIHdvcmRkaXNwZGVmOgotCSAgICBjYXNlIGxvbmdkaXNwZGVmOgotCSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0JICAgIGNhc2Ugd29yZHJlbGRlZjoKLQkgICAgY2FzZSBsb25ncmVsZGVmOgotCSAgICAgIC8qCi0JICAgICAgICogICAgaW5kaXJlY3QgY2FsbDogY2FsbCB0aHJvdWdoIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIGVpdGhlciAgKmQocikgICBhcyBhIHBhcmFtZXRlciBvciBsb2NhbAotCSAgICAgICAqICAgICAgICAgICAgICAocikgICAgIGFzIGEgcmV0dXJuIHZhbHVlCi0JICAgICAgICogICAgICAgICAgICAgICpmICAgICAgYXMgYSBnbG9iYWwgcG9pbnRlcgotCSAgICAgICAqICAgICAgW2FyZSB0aGVyZSBvdGhlcnMgdGhhdCB3ZSBtaXNzPywKLQkgICAgICAgKiAgICAgICBlLmcuIGFycmF5cyBvZiBwb2ludGVycyB0byBmdW5jdGlvbnM/Pz9dCi0JICAgICAgICovCi0JICAgICAgYXJjX2FkZCAocGFyZW50LCAmaW5kaXJlY3RjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCSAgICAgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICBjYXNlIGJ5dGVyZWw6Ci0JICAgIGNhc2Ugd29yZHJlbDoKLQkgICAgY2FzZSBsb25ncmVsOgotCSAgICAgIC8qCi0JICAgICAgICogICAgcmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCi0JICAgICAgICogICAgICBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgCi0JICAgICAgICogICAgICBhIGZ1bmN0aW9uLgotCSAgICAgICAqLwotCSAgICAgIGRlc3RwYyA9IHRhaG9lX3JlbGFkZHIgKGluc3RydWN0cCArIGxlbmd0aCkKLQkJLSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlOwotCSAgICAgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCi0JCXsKLQkJICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7Ci0JCSAgREJHIChDQUxMREVCVUcsCi0JCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHRkZXN0cGMgMHglbHgiLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBkZXN0cGMpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5uYW1lICVzIiwgY2hpbGQtPm5hbWUpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5hZGRyIDB4JWx4XG4iLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGlsZC0+YWRkcik7Ci0JCSAgICApOwotCQkgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0cGMpCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqICAgIGEgaGl0Ci0JCSAgICAgICAqLwotCQkgICAgICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgICAgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICBnb3RvIGJvdGNoZWQ7Ci0JCX0KLQkgICAgICAvKgotCSAgICAgICAqICAgIGVsc2U6Ci0JICAgICAgICogICAgICBpdCBsb29rZWQgbGlrZSBhIGNhbGxmLAotCSAgICAgICAqICAgICAgYnV0IGl0IHdhc24ndCB0byBhbnl3aGVyZS4KLQkgICAgICAgKi8KLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGJvdGNoZWQ6Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBzb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCi0JICAgICAgICovCi0JICAgICAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF1cdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKLQkgICAgICBsZW5ndGggPSAxOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3V0aWxzLmMgYi9ncHJvZi91dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzJjMDJlLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlIDxkZW1hbmdsZS5oPgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0KLS8qCi0gKiBQcmludCBuYW1lIG9mIHN5bWJvbC4gIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgotICovCi1pbnQKLURFRlVOIChwcmludF9uYW1lX29ubHksIChzZWxmKSwgU3ltICogc2VsZikKLXsKLSAgY29uc3QgY2hhciAqbmFtZSA9IHNlbGYtPm5hbWU7Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpkZW1hbmdsZWQgPSAwOwotICBjaGFyIGJ1ZltQQVRIX01BWF07Ci0gIGludCBzaXplID0gMDsKLQotICBpZiAobmFtZSkKLSAgICB7Ci0gICAgICBpZiAoIWJzZF9zdHlsZV9vdXRwdXQpCi0JewotCSAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gJiYgZGlzY2FyZF91bmRlcnNjb3JlcykKLQkgICAgewotCSAgICAgIG5hbWUrKzsKLQkgICAgfQotCSAgaWYgKGRlbWFuZ2xlKQotCSAgICB7Ci0JICAgICAgZGVtYW5nbGVkID0gY3BsdXNfZGVtYW5nbGUgKG5hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLQkgICAgICBpZiAoZGVtYW5nbGVkKQotCQl7Ci0JCSAgbmFtZSA9IGRlbWFuZ2xlZDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgcHJpbnRmICgiJXMiLCBuYW1lKTsKLSAgICAgIHNpemUgPSBzdHJsZW4gKG5hbWUpOwotICAgICAgaWYgKGxpbmVfZ3JhbnVsYXJpdHkgJiYgc2VsZi0+ZmlsZSkKLQl7Ci0JICBmaWxlbmFtZSA9IHNlbGYtPmZpbGUtPm5hbWU7Ci0JICBpZiAoIXByaW50X3BhdGgpCi0JICAgIHsKLQkgICAgICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOwotCSAgICAgIGlmIChmaWxlbmFtZSkKLQkJewotCQkgICsrZmlsZW5hbWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmaWxlbmFtZSA9IHNlbGYtPmZpbGUtPm5hbWU7Ci0JCX0KLQkgICAgfQotCSAgc3ByaW50ZiAoYnVmLCAiICglczolZCkiLCBmaWxlbmFtZSwgc2VsZi0+bGluZV9udW0pOwotCSAgcHJpbnRmICgiJXMiLCBidWYpOwotCSAgc2l6ZSArPSBzdHJsZW4gKGJ1Zik7Ci0JfQotICAgICAgaWYgKGRlbWFuZ2xlZCkKLQl7Ci0JICBmcmVlIChkZW1hbmdsZWQpOwotCX0KLSAgICAgIERCRyAoREZOREVCVUcsIHByaW50ZiAoInslZH0gIiwgc2VsZi0+Y2cudG9wX29yZGVyKSk7Ci0gICAgICBEQkcgKFBST1BERUJVRywgcHJpbnRmICgiJTQuMGYlJSAiLCAxMDAuMCAqIHNlbGYtPmNnLnByb3AuZnJhY3QpKTsKLSAgICB9Ci0gIHJldHVybiBzaXplOwotfQotCi0KLXZvaWQKLURFRlVOIChwcmludF9uYW1lLCAoc2VsZiksIFN5bSAqIHNlbGYpCi17Ci0gIHByaW50X25hbWVfb25seSAoc2VsZik7Ci0KLSAgaWYgKHNlbGYtPmNnLmN5Yy5udW0gIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiA8Y3ljbGUgJWQ+IiksIHNlbGYtPmNnLmN5Yy5udW0pOwotICAgIH0KLSAgaWYgKHNlbGYtPmNnLmluZGV4ICE9IDApCi0gICAgewotICAgICAgaWYgKHNlbGYtPmNnLnByaW50X2ZsYWcpCi0JewotCSAgcHJpbnRmICgiIFslZF0iLCBzZWxmLT5jZy5pbmRleCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIiAoJWQpIiwgc2VsZi0+Y2cuaW5kZXgpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi91dGlscy5oIGIvZ3Byb2YvdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmYjljNi4uMDAwMDAwMAotLS0gYS9ncHJvZi91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaWZuZGVmIHV0aWxzX2gKLSNkZWZpbmUgdXRpbHNfaAotCi1leHRlcm4gaW50IHByaW50X25hbWVfb25seSBQQVJBTVMgKChTeW0gKiBzZWxmKSk7Ci1leHRlcm4gdm9pZCBwcmludF9uYW1lIFBBUkFNUyAoKFN5bSAqIHNlbGYpKTsKLQotI2VuZGlmIC8qIHV0aWxzX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3ZheC5jIGIvZ3Byb2YvdmF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTdkZTMuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvdmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotICAgIC8qCi0gICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxzJyBpbnN0cnVjdGlvbgotICAgICAqLwotI2RlZmluZQlDQUxMUwkweGZiCi0KLSAgICAvKgotICAgICAqICAgICAgICByZWdpc3RlciBmb3IgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotICAgICAqLwotI2RlZmluZQlQQwkweGYKLQotZW51bSBvcGVybW9kZXMKLSAgewotICAgIGxpdGVyYWwsIGluZGV4ZWQsIHJlZywgcmVnZGVmLCBhdXRvZGVjLCBhdXRvaW5jLCBhdXRvaW5jZGVmLAotICAgIGJ5dGVkaXNwLCBieXRlZGlzcGRlZiwgd29yZGRpc3AsIHdvcmRkaXNwZGVmLCBsb25nZGlzcCwgbG9uZ2Rpc3BkZWYsCi0gICAgaW1tZWRpYXRlLCBhYnNvbHV0ZSwgYnl0ZXJlbCwgYnl0ZXJlbGRlZiwgd29yZHJlbCwgd29yZHJlbGRlZiwKLSAgICBsb25ncmVsLCBsb25ncmVsZGVmCi0gIH07Ci10eXBlZGVmIGVudW0gb3Blcm1vZGVzIG9wZXJhbmRlbnVtOwotCi1zdHJ1Y3QgbW9kZWJ5dGUKLSAgewotICAgIHVuc2lnbmVkIGludCByZWdmaWVsZDo0OwotICAgIHVuc2lnbmVkIGludCBtb2RlZmllbGQ6NDsKLSAgfTsKLQotLyoKLSAqIEEgc3ltYm9sIHRvIGJlIHRoZSBjaGlsZCBvZiBpbmRpcmVjdCBjYWxsczoKLSAqLwotU3ltIGluZGlyZWN0Y2hpbGQ7Ci0KLQotc3RhdGljIG9wZXJhbmRlbnVtCi12YXhfb3BlcmFuZG1vZGUgKG1vZGVwKQotICAgICBzdHJ1Y3QgbW9kZWJ5dGUgKm1vZGVwOwotewotICBsb25nIHVzZXNyZWcgPSBtb2RlcC0+cmVnZmllbGQ7Ci0KLSAgc3dpdGNoIChtb2RlcC0+bW9kZWZpZWxkKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gaW5kZXhlZDsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gcmVnOwotICAgIGNhc2UgNjoKLSAgICAgIHJldHVybiByZWdkZWY7Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIGF1dG9kZWM7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBhdXRvaW5jIDogaW1tZWRpYXRlOwotICAgIGNhc2UgOToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luY2RlZiA6IGFic29sdXRlOwotICAgIGNhc2UgMTA6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGJ5dGVkaXNwIDogYnl0ZXJlbDsKLSAgICBjYXNlIDExOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcGRlZiA6IGJ5dGVyZWxkZWY7Ci0gICAgY2FzZSAxMjoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gd29yZGRpc3AgOiB3b3JkcmVsOwotICAgIGNhc2UgMTM6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwZGVmIDogd29yZHJlbGRlZjsKLSAgICBjYXNlIDE0OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBsb25nZGlzcCA6IGxvbmdyZWw7Ci0gICAgY2FzZSAxNToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3BkZWYgOiBsb25ncmVsZGVmOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGNoYXIgKgotdmF4X29wZXJhbmRuYW1lIChtb2RlKQotICAgICBvcGVyYW5kZW51bSBtb2RlOwotewotCi0gIHN3aXRjaCAobW9kZSkKLSAgICB7Ci0gICAgY2FzZSBsaXRlcmFsOgotICAgICAgcmV0dXJuICJsaXRlcmFsIjsKLSAgICBjYXNlIGluZGV4ZWQ6Ci0gICAgICByZXR1cm4gImluZGV4ZWQiOwotICAgIGNhc2UgcmVnOgotICAgICAgcmV0dXJuICJyZWdpc3RlciI7Ci0gICAgY2FzZSByZWdkZWY6Ci0gICAgICByZXR1cm4gInJlZ2lzdGVyIGRlZmVycmVkIjsKLSAgICBjYXNlIGF1dG9kZWM6Ci0gICAgICByZXR1cm4gImF1dG9kZWNyZW1lbnQiOwotICAgIGNhc2UgYXV0b2luYzoKLSAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCI7Ci0gICAgY2FzZSBhdXRvaW5jZGVmOgotICAgICAgcmV0dXJuICJhdXRvaW5jcmVtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGJ5dGVkaXNwOgotICAgICAgcmV0dXJuICJieXRlIGRpc3BsYWNlbWVudCI7Ci0gICAgY2FzZSBieXRlZGlzcGRlZjoKLSAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2UgYnl0ZXJlbDoKLSAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSI7Ci0gICAgY2FzZSBieXRlcmVsZGVmOgotICAgICAgcmV0dXJuICJieXRlIHJlbGF0aXZlIGRlZmVycmVkIjsKLSAgICBjYXNlIHdvcmRkaXNwOgotICAgICAgcmV0dXJuICJ3b3JkIGRpc3BsYWNlbWVudCI7Ci0gICAgY2FzZSB3b3JkZGlzcGRlZjoKLSAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2Ugd29yZHJlbDoKLSAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSI7Ci0gICAgY2FzZSB3b3JkcmVsZGVmOgotICAgICAgcmV0dXJuICJ3b3JkIHJlbGF0aXZlIGRlZmVycmVkIjsKLSAgICBjYXNlIGltbWVkaWF0ZToKLSAgICAgIHJldHVybiAiaW1tZWRpYXRlIjsKLSAgICBjYXNlIGFic29sdXRlOgotICAgICAgcmV0dXJuICJhYnNvbHV0ZSI7Ci0gICAgY2FzZSBsb25nZGlzcDoKLSAgICAgIHJldHVybiAibG9uZyBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2UgbG9uZ2Rpc3BkZWY6Ci0gICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUiOwotICAgIGNhc2UgbG9uZ3JlbGRlZjoKLSAgICAgIHJldHVybiAibG9uZyByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi0gIGFib3J0ICgpOwotfQotCi1zdGF0aWMgbG9uZwotdmF4X29wZXJhbmRsZW5ndGggKG1vZGVwKQotICAgICBzdHJ1Y3QgbW9kZWJ5dGUgKm1vZGVwOwotewotCi0gIHN3aXRjaCAodmF4X29wZXJhbmRtb2RlIChtb2RlcCkpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICBjYXNlIHJlZzoKLSAgICBjYXNlIHJlZ2RlZjoKLSAgICBjYXNlIGF1dG9kZWM6Ci0gICAgY2FzZSBhdXRvaW5jOgotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgYnl0ZWRpc3A6Ci0gICAgY2FzZSBieXRlZGlzcGRlZjoKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgY2FzZSBieXRlcmVsZGVmOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICBjYXNlIHdvcmRkaXNwZGVmOgotICAgIGNhc2Ugd29yZHJlbDoKLSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIGltbWVkaWF0ZToKLSAgICBjYXNlIGFic29sdXRlOgotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgY2FzZSBsb25nZGlzcGRlZjoKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgY2FzZSBsb25ncmVsZGVmOgotICAgICAgcmV0dXJuIDU7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuIDEgKyB2YXhfb3BlcmFuZGxlbmd0aCAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoKGNoYXIgKikgbW9kZXApICsgMSk7Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi0gIGFib3J0ICgpOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotdmF4X3JlbGFkZHIgKG1vZGVwKQotICAgICBzdHJ1Y3QgbW9kZWJ5dGUgKm1vZGVwOwotewotICBvcGVyYW5kZW51bSBtb2RlID0gdmF4X29wZXJhbmRtb2RlIChtb2RlcCk7Ci0gIGNoYXIgKmNwOwotICBzaG9ydCAqc3A7Ci0gIGxvbmcgKmxwOwotCi0gIGNwID0gKGNoYXIgKikgbW9kZXA7Ci0gICsrY3A7CQkJCS8qIHNraXAgb3ZlciB0aGUgbW9kZSAqLwotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbcmVsYWRkcl0gbm90IHJlbGF0aXZlIGFkZHJlc3NcbiIpOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSBtb2RlcDsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqY3AgKyAqY3ApOwotICAgIGNhc2Ugd29yZHJlbDoKLSAgICAgIHNwID0gKHNob3J0ICopIGNwOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKnNwICsgKnNwKTsKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgICBscCA9IChsb25nICopIGNwOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmxwICsgKmxwKTsKLSAgICB9Ci19Ci0KLQotdm9pZAotdmF4X2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYykKLSAgICAgU3ltICpwYXJlbnQ7Ci0gICAgIGJmZF92bWEgcF9sb3dwYzsKLSAgICAgYmZkX3ZtYSBwX2hpZ2hwYzsKLXsKLSAgdW5zaWduZWQgY2hhciAqaW5zdHJ1Y3RwOwotICBsb25nIGxlbmd0aDsKLSAgU3ltICpjaGlsZDsKLSAgb3BlcmFuZGVudW0gbW9kZTsKLSAgb3BlcmFuZGVudW0gZmlyc3Rtb2RlOwotICBiZmRfdm1hIGRlc3RwYzsKLSAgc3RhdGljIGJvb2wgaW5pdGVkID0gRkFMU0U7Ci0KLSAgaWYgKCFpbml0ZWQpCi0gICAgewotICAgICAgaW5pdGVkID0gVFJVRTsKLSAgICAgIHN5bV9pbml0ICgmaW5kaXJlY3RjaGlsZCk7Ci0gICAgICBpbmRpcmVjdGNoaWxkLmNnLnByb3AuZnJhY3QgPSAxLjA7Ci0gICAgICBpbmRpcmVjdGNoaWxkLmNnLmN5Yy5oZWFkID0gJmluZGlyZWN0Y2hpbGQ7Ci0gICAgfQotCi0gIGlmIChjb3JlX3RleHRfc3BhY2UgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCi0gICAgewotICAgICAgcF9sb3dwYyA9IHNfbG93cGM7Ci0gICAgfQotICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKLSAgICB7Ci0gICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOwotICAgIH0KLSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAotCQkJICBwYXJlbnQtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwX2xvd3BjLAotCQkJICAodW5zaWduZWQgbG9uZykgcF9oaWdocGMpKTsKLSAgZm9yIChpbnN0cnVjdHAgPSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UgKyBwX2xvd3BjOwotICAgICAgIGluc3RydWN0cCA8ICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSArIHBfaGlnaHBjOwotICAgICAgIGluc3RydWN0cCArPSBsZW5ndGgpCi0gICAgewotICAgICAgbGVuZ3RoID0gMTsKLSAgICAgIGlmICgqaW5zdHJ1Y3RwID09IENBTExTKQotCXsKLQkgIC8qCi0JICAgKiAgICBtYXliZSBhIGNhbGxzLCBiZXR0ZXIgY2hlY2sgaXQgb3V0LgotCSAgICogICAgICBza2lwIHRoZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltmaW5kY2FsbF1cdDB4JWx4OmNhbGxzIiwKLQkJICAgICAgICgodW5zaWduZWQgbG9uZykKLQkJCShpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UpKSkpOwotCSAgZmlyc3Rtb2RlID0gdmF4X29wZXJhbmRtb2RlICgoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkgIHN3aXRjaCAoZmlyc3Rtb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgbGl0ZXJhbDoKLQkgICAgY2FzZSBpbW1lZGlhdGU6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZ290byBib3RjaGVkOwotCSAgICB9Ci0JICBsZW5ndGggKz0gdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCSAgbW9kZSA9IHZheF9vcGVyYW5kbW9kZSAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7Ci0JICBEQkcgKENBTExERUJVRywKLQkgICAgICAgcHJpbnRmICgiXHRmaXJzdCBvcGVyYW5kIGlzICVzIiwgdmF4X29wZXJhbmRuYW1lIChmaXJzdG1vZGUpKTsKLQkgICAgICAgcHJpbnRmICgiXHRzZWNvbmQgb3BlcmFuZCBpcyAlc1xuIiwgdmF4X29wZXJhbmRuYW1lIChtb2RlKSkpOwotCSAgc3dpdGNoIChtb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgcmVnZGVmOgotCSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotCSAgICBjYXNlIHdvcmRkaXNwZGVmOgotCSAgICBjYXNlIGxvbmdkaXNwZGVmOgotCSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0JICAgIGNhc2Ugd29yZHJlbGRlZjoKLQkgICAgY2FzZSBsb25ncmVsZGVmOgotCSAgICAgIC8qCi0JICAgICAgICogICAgaW5kaXJlY3QgY2FsbDogY2FsbCB0aHJvdWdoIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIGVpdGhlciAgKmQocikgICBhcyBhIHBhcmFtZXRlciBvciBsb2NhbAotCSAgICAgICAqICAgICAgICAgICAgICAocikgICAgIGFzIGEgcmV0dXJuIHZhbHVlCi0JICAgICAgICogICAgICAgICAgICAgICpmICAgICAgYXMgYSBnbG9iYWwgcG9pbnRlcgotCSAgICAgICAqICAgICAgW2FyZSB0aGVyZSBvdGhlcnMgdGhhdCB3ZSBtaXNzPywKLQkgICAgICAgKiAgICAgICBlLmcuIGFycmF5cyBvZiBwb2ludGVycyB0byBmdW5jdGlvbnM/Pz9dCi0JICAgICAgICovCi0JICAgICAgYXJjX2FkZCAocGFyZW50LCAmaW5kaXJlY3RjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCSAgICAgIGxlbmd0aCArPSB2YXhfb3BlcmFuZGxlbmd0aCAoCi0JCQkJICAoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBieXRlcmVsOgotCSAgICBjYXNlIHdvcmRyZWw6Ci0JICAgIGNhc2UgbG9uZ3JlbDoKLQkgICAgICAvKgotCSAgICAgICAqICAgIHJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotCSAgICAgICAqICAgICAgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIAotCSAgICAgICAqICAgICAgYSBmdW5jdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBkZXN0cGMgPSB2YXhfcmVsYWRkciAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSkKLQkJLSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlOwotCSAgICAgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCi0JCXsKLQkJICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7Ci0JCSAgREJHIChDQUxMREVCVUcsCi0JCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHRkZXN0cGMgMHglbHgiLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBkZXN0cGMpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5uYW1lICVzIiwgY2hpbGQtPm5hbWUpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5hZGRyIDB4JWx4XG4iLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGlsZC0+YWRkcik7Ci0JCSAgICApOwotCQkgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0cGMpCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqICAgIGEgaGl0Ci0JCSAgICAgICAqLwotCQkgICAgICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgICAgIGxlbmd0aCArPSB2YXhfb3BlcmFuZGxlbmd0aCAoKHN0cnVjdCBtb2RlYnl0ZSAqKQotCQkJCQkJICAgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICBnb3RvIGJvdGNoZWQ7Ci0JCX0KLQkgICAgICAvKgotCSAgICAgICAqICAgIGVsc2U6Ci0JICAgICAgICogICAgICBpdCBsb29rZWQgbGlrZSBhIGNhbGxzLAotCSAgICAgICAqICAgICAgYnV0IGl0IHdhc24ndCB0byBhbnl3aGVyZS4KLQkgICAgICAgKi8KLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGJvdGNoZWQ6Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBzb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCi0JICAgICAgICovCi0JICAgICAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF1cdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKLQkgICAgICBsZW5ndGggPSAxOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvQ09QWUlORyBiL2luY2x1ZGUvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NDliZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0MCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0MCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQwKLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQwKLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9pbmNsdWRlL0NoYW5nZUxvZyBiL2luY2x1ZGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE1ZWRjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTczNSArMCwwIEBACi0yMDAwLTAzLTI3ICBEZW5pcyBDaGVydHlrb3YgIDxkZW5pc2NAb3ZlcnRhLnJ1PgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fYXZyKTogRGVjbGFyZS4KLQotMjAwMC0wMy0xNCAgQmVybmQgU2NobWlkdCAgPGJlcm5kc0BjeWdudXMuY28udWs+Ci0KLQkqIGhhc2h0YWIuaCAoaHRhYl90cmF2KTogTW9kaWZ5IHR5cGUgc28gdGhhdCBmaXJzdCBhcmcgaXMgb2YgdHlwZQotCXZvaWQgKiouCi0JKGh0YWJfZmluZF93aXRoX2hhc2gsIGh0YWJfZmluZF9zbG90X3dpdGhfaGFzaCk6IERlY2xhcmUgbmV3Ci0JZnVuY3Rpb25zLgotCi0yMDAwLTAzLTA5ICBBbGV4IFNhbXVlbCAgPHNhbXVlbEBjb2Rlc291cmNlcnkuY29tPgotCi0JKiBwYXJ0aXRpb24uaDogTmV3IGZpbGUuCi0KLTIwMDAtMDMtMDkgIFphY2sgV2VpbmJlcmcgIDx6YWNrQHdvbGVyeS5jdW1iLm9yZz4KLQotCSogaGFzaHRhYi5oIChzdHJ1Y3QgaHRhYik6IEFkZCBkZWxfZi4KLQkoaHRhYl9kZWwpOiBOZXcgdHlwZS4KLQkoaHRhYl9jcmVhdGUpOiBBZGQgZm91cnRoIGFyZ3VtZW50LgotCi0yMDAwLTAzLTA4ICBaYWNrIFdlaW5iZXJnICA8emFja0B3b2xlcnkuY3VtYi5vcmc+Ci0KLQkqIGhhc2h0YWIuaCAoaGFzaF90YWJsZV90KTogUmVuYW1lIHRvIGh0YWJfdC4KLQkoc3RydWN0IGhhc2hfdGFibGUpOiBSZW5hbWUgdG8gc3RydWN0IGh0YWIuICBTaG9ydGVuIGVsZW1lbnQKLQluYW1lcy4gIFJlb3JkZXIgZWxlbWVudHMgYnkgc2l6ZS4KLQkoaHRhYl9oYXNoLCBodGFiX2VxLCBodGFiX3RyYXYpOiBOZXcgdHlwZWRlZnMgZm9yIHRoZSBjYWxsYmFjawotCWZ1bmN0aW9uIHBvaW50ZXJzLgotCShoYXNoX3RhYmxlX2VudHJ5X3QpOiBEaXNjYXJkOyBqdXN0IHVzZSB2b2lkICogZm9yIGVsZW1lbnQKLQl0eXBlLgotCi0yMDAwLTAzLTAxICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGJmZGxpbmsuaCAoYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIGEgYm9vbGVhbiBhcmcgdG8KLQl0aGUgdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjay4KLQotMjAwMC0wMi0yMyAgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faTM3MCk6IERlY2xhcmUuCi0KLTIwMDAtMDItMjIgIENoYW5kcmEgQ2hhdnZhICA8Y2NoYXZ2YUBjeWdudXMuY29tPgotCi0JKiBvcGNvZGUvZDMwdi5oIChGTEFHX05PVF9XSVRIX0FERFNVQnBwcCk6IFJlZGVmaW5lZCBhcyBvcGVyYXRpb24KLQljYW5ub3QgYmUgY29tYmluZWQgaW4gcGFyYWxsZWwgd2l0aCBBREQvU1VCcHBwLgotCi1UdWUgRmViIDIyIDE1OjE5OjU0IDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fdHJhY2UpOiBEb2N1bWVudCByZXR1cm4gdmFsdWVzLgotCShzaW1fc2V0X3RyYWNlKTogRGVjbGFyZS4gIERlcHJlY2F0ZS4KLQotMjAwMC0wMi0yMSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBkaXMtYXNtLmggKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKTogQ2hhbmdlIGBsZW5ndGgnIHBhcmFtIG9mCi0JcmVhZF9tZW1vcnlfZnVuYyB0byB1bnNpZ25lZC4gIENoYW5nZSB0eXBlIG9mIGBidWZmZXJfbGVuZ3RoJyBhbmQKLQlgb2N0ZXRzX3Blcl9ieXRlJyB0byB1bnNpZ25lZC4KLQkoYnVmZmVyX3JlYWRfbWVtb3J5KTogQ2hhbmdlIGBsZW5ndGgnIHBhcmFtIHRvIHVuc2lnbmVkLgotCi0yMDAwLTAyLTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBwcm90b3R5cGVzIGZvciBBUk0gcmVnaXN0ZXIgbmFtZSBmdW5jdGlvbnMuCi0KLVdlZCBGZWIgIDkgMTg6NDU6NDkgMjAwMCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB3YWl0Lmg6IERlbGV0ZS4gTm8gbG9uZ2VyIHVzZWQgYnkgR0RCLgotCi1UdWUgRmViICA4IDE3OjAxOjEzIDIwMDAgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogcmVtb3RlLXNpbS5oIChzaW1fcmVzdW1lKTogQ2xhcmlmeSB1c2Ugb2YgU0lHR05BTC4KLQkoc2ltX3N0b3BfcmVhc29uKTogQ2xhcmlmeSBtZWFuaW5nIG9mIHNpbV9zaWduYWxsZWQuCi0KLTIwMDAtMDItMDMgIFRpbW90aHkgV2FsbCA8dHdhbGxAcmVkaGF0LmNvbT4KLQotCSogZGlzLWFzbS5oIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyk6IEFkZGVkIG9jdGV0c19wZXJfYnl0ZQotCWZpZWxkIGFuZCBpbml0aWFsaXplIGl0IHRvIG9uZSAoMSkuCi0JCi0yMDAwLTAxLTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0ByZWRoYXQuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBwcm90b3R5cGUgZm9yIGRpc2Fzc2VtYmxlcl91c2FnZSgpLgotCUFkZCBwcm90b3R5cGUgZm9yIGFybV9kaXNhc3NlbWJsZXJfb3B0aW9ucygpLgotCVJlbW92ZSBwcm90b3R5cGUgZm9yIGFybV90b2dnbGVfcmVnbmFtZXMoKS4KLQlBZGQgcHJvdG90eXBlIGZvciBwYXJzZV9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbigpLgotCi1TYXQgSmFuICAxIDE5OjA2OjUyIDIwMDAgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGJpdHJhbmdlLmNvbT4KLQotCSogc3ltY2F0LmggKFNUUklOR1gpIFshX19TVERDX18gfHwgQUxNT1NUX1NURENdOiBDaGFuZ2UgIj8iIHRvICJzIgotCXRvIHN0cmluZ2lmeSBhcmd1bWVudCBzLgotCi1XZWQgRGVjIDE1IDExOjIyOjU2IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHAtc3ltdGFiLmggKEhQX0xBTkdVQUdFX0ZPUlRSQU4pOiBOZXcgZW51bWVyYXRpb24gY29uc3RhbnQuCi0JKEhQX0xBTkdVQUdFX0Y3Nyk6IERlZmluZSB1c2luZyBIUF9MQU5HVUFHRV9GT1JUUkFOLgotCi0xOTk5LTEyLTE1ICBEb3VnIEV2YW5zICA8ZGplQHRyYW5zbWV0YS5jb20+Ci0KLQkqIGRpcy1hc20uaDogRW5jbG9zZSBpbiBleHRlcm4gIkMiIGlmZGVmIF9fY3BsdXNwbHVzLgotCi0xOTk5LTEyLTA1ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmggKHN0cnVjdCBzcGxheV90cmVlX25vZGUpOiBSZW5hbWUgdG8gLi4uCi0JKHN0cnVjdCBzcGxheV90cmVlX25vZGVfcyk6IC4uLiB0aGlzLgotCShzdHJ1Y3Qgc3BsYXlfdHJlZSk6IFJlbmFtZSB0byAuLi4KLQkoc3RydWN0IHNwbGF5X3RyZWVfcyk6IC4uLiB0aGlzLgotCi0xOTk5LTExLTMwICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGFuc2lkZWNsLmggKEFUVFJJQlVURV9NQUxMT0MpOiBOZXcgbWFjcm8uCi0KLQkqIGxpYmliZXJ0eS5oIChidWlsZGFyZ3YsIGR1cGFyZ3YsIGNvbmNhdCwgY2hvb3NlX3RlbXBfYmFzZSwKLQltYWtlX3RlbXBfZmlsZSwgeG1hbGxvYywgeGNhbGxvYywgeHN0cmR1cCwgeG1lbWR1cCk6IEFkZAotCUFUVFJJQlVURV9NQUxMT0MuCi0JKHhhdGV4aXQpOiBSZW1vdmUgX19HTlVDX18gY2hlY2ssIGFkZCBBVFRSSUJVVEVfTk9SRVRVUk4uCi0KLTE5OTktMTEtMjggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogbGliaWJlcnR5Lmg6IEluY2x1ZGUgc3RkYXJnLmggd2hlbiBBTlNJX1BST1RPVFlQRVMgaXMgZGVmaW5lZC4KLQkoYXNwcmludGYsIHZhc3ByaW50Zik6IFByb3ZpZGUgZGVjbGFyYXRpb25zLgotCi1XZWQgTm92IDEwIDEyOjQzOjIxIDE5OTkgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCQkJICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGFuc2lkZWNsLmg6IERlZmluZSBhbmQgdGVzdCBgR0NDX1ZFUlNJT04nLCBub3QgYEhBVkVfR0NDX1ZFUlNJT04nLgotCi0xOTk5LTExLTA0ICAgICAgSmltbXkgR3VvICAgICAgIDxndW9AY3VwLmhwLmNvbT4KLQotCSogaHAtc3ltdGFiLmggKGRudHRfdHlwZV9mcGFyYW0pOiBBZGQgZG9jX3JhbmdlcywgbWlzY19raW5kCi0JZmllbGRzLCBjaGFuZ2UgbG9jYXRpb24gdHlwZSB0byBDT1JFX0FERFIgZnJvbSBpbnQuCi0JKGRudHRfdHlwZV9jb25zdCk6IE5hbWUgdGhlIDV0aCBmaWVsZCBsb2NhdGlvbl90eXBlLgotCi1TdW4gT2N0IDI0IDE5OjExOjMyIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWQxMHYuaCAoU0lNX0QxMFZfVFMyX0RNQVBfUkVHTlVNKTogRGVmaW5lLgotCi0xOTk5LTEwLTIzIDA4OjUxIC0wNzAwICBaYWNrIFdlaW5iZXJnICA8emFja0BiaXRtb3Zlci5jb20+Ci0KLQkqIGhhc2h0YWIuaDogR2l2ZSBoYXNoX3RhYmxlX3QgYSBzdHJ1Y3QgdGFnLiAgQWRkIHByb3RvdHlwZXMKLQlmb3IgY2xlYXJfaGFzaF90YWJsZV9zbG90IGFuZCB0cmF2ZXJzZV9oYXNoX3RhYmxlLiAgQ29ycmVjdAotCXByb3RvdHlwZSBvZiBhbGxfaGFzaF90YWJsZV9jb2xsaXNpb25zLgotCi1TYXQgT2N0IDIzIDE5OjAwOjEzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWQxMHYuaDogTmV3IGZpbGUuCi0KLUZyaSBPY3QgMTUgMDE6NDc6NTEgMTk5OSAgVmxhZGltaXIgTWFrYXJvdiAgPHZtYWthcm92QGxvb255LmN5Z251cy5jb20+Ci0KLQkqIGhhc2h0YWIuaDogTmV3IGZpbGUuCi0KLTE5OTktMTAtMTAgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogYW5zaWRlY2wuaCAoSEFWRV9HQ0NfVkVSU0lPTik6IE5ldyBtYWNyby4gIFVzZSBpdCBpbnN0ZWFkIG9mCi0JZXhwbGljaXRseSB0ZXN0aW5nIF9fR05VQ19fIGFuZCBfX0dOVUNfTUlOT1JfXy4KLQotCShBVFRSSUJVVEVfUFJJTlRGKTogVXNlIGBfX2Zvcm1hdF9fJywgbm90IGBmb3JtYXQnLgotCi0xOTk5LTA5LTI1ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGxpYmliZXJ0eS5oIChtYWtlX3RlbXBfZmlsZSk6ICBBZGQgYSBwcm90b3R5cGUuCi0KLVR1ZSBTZXAgMTQgMDA6MzU6MDIgMTk5OSAgTWFyYyBFc3BpZSA8ZXNwaWVAY3ZzLm9wZW5ic2Qub3JnPgotCi0JKiBsaWJpYmVydHkuaCAoYmFzZW5hbWUpOiAgT3BlbkJTRCBoYXMgYSBjb3JyZWN0IHByb3RvdHlwZS4KLQkoeHJlYWxsb2MpOiAgUmVtb3ZlIG91dGRhdGVkIGNvbW1lbnQuCi0KLTE5OTktMDktMDcgIEplZmYgR2FyemlrICA8amdhcnppa0Bwb2JveC5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oICh4bWVtZHVwKTogQWRkIHByb3RvdHlwZSBmb3IgbmV3IGZ1bmN0aW9uLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9waik6IERlY2xhcmUuCi0KLTE5OTktMDktMDEgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogb2JzdGFjay5oIChvYnN0YWNrX2dyb3csIG9ic3RhY2tfZ3JvdzApOiBNb3ZlIChjaGFyKikgY2FzdHMKLQlpbiBjYWxscyB0byBgX29ic3RhY2tfbWVtY3B5JyBmcm9tIGhlcmUgLi4uCi0KLQkoX29ic3RhY2tfbWVtY3B5KTogLi4uIHRvIGhlcmUsIGV4Y2VwdCBpbiB0aGUgX19TVERDX18gY2FzZSB3aGljaAotCWRvZXNuJ3QgbmVlZCBpdC4KLQotMTk5OS0wOC0zMCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBsaWJpYmVydHkuaCAoZ2V0cHdkKTogUHJvdG90eXBlLgotCi0xOTk5LTA4LTAxICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmggKHNwbGF5X3RyZWVfaW5zZXJ0KTogUmV0dXJuIHRoZSBuZXcgbm9kZS4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFuc2lkZWNsLmg6IENvcHkgYXR0cmlidXRlIHN1cHBvcnQgbWFjcm9zIGZyb20gZWdjcy4KLQotMTk5OS0wNi0yMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBpbml0X2Z1bmN0aW9uIGFuZAotCWZpbmlfZnVuY3Rpb24uCi0KLTE5OTktMDYtMjAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIG1pcHMuaCAoRWxmMzJfSW50ZXJuYWxfTXN5bSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKEVsZjMyX0V4dGVybmFsX01zeW0pOiBMaWtld2lzZS4KLQkoRUxGMzJfTVNfUkVMX0lOREVYKTogTmV3IG1hY3JvLgotCShFTEYzMl9NU19GTEFHUyk6IExpa2V3aXNlLgotCShFTEYzMl9NU19JTkZPKTogTGlrZXdpc2UuCi0JCi0xOTk5LTA2LTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGFybV90b2dnbGVfcmVnbmFtZXMpOiBOZXcgcHJvdG90eXBlLgotCShzdHJ1Y3QgZGlhc3NlbWJsZV9pbmZvKTogTmV3IGZpZWxkOiBkaXNhc3NlbWJsZXJfb3B0aW9ucy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChiZmRfZWxmX3ZlcnNpb25fZXhwcik6IFJlbmFtZSBgbWF0Y2gnIHRvIGBwYXR0ZXJuJy4KLQlBZGQgYG1hdGNoJyBjYWxsYmFjayBmdW5jdGlvbi4KLQotMTk5OS0wNC0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChiZmRfbGlua19pbmZvKTogQWRkIG5vX3VuZGVmaW5lZC4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oOiBBZGQgcHJvdG90eXBlIGZvciBwcmludF9pbnNuX21jb3JlLgotCi0xOTk5LTA0LTAyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmggKHNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyk6IERlY2xhcmUuCi0KLTE5OTktMDMtMzAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX2ludHMpOiBEZWNsYXJlLgotCi1XZWQgTWFyIDI0IDEyOjQ2OjI5IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYW15LmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IEN5Z3dpbnssMzJ9IHNob3VsZCBoYXZlIHRoZSBwcm90b3R5cGUuCi0KLTE5OTktMDItMjIgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2luZm8pOiBhZGQgZmllbGQgIm1wYzg2MGMwIi4KLQotTW9uIEZlYiAgMSAyMTowNTo0NiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZGlzLWFzbS5oIChwcmludF9pbnNuX2kzODZfYXR0KTogIERlY2xhcmUuCi0gICAgICAgKHByaW50X2luc25faTM4Nl9pbnRlbCk6ICBEZWNsYXJlLgotCi05OTgtMTItMzAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogQ2FzdCBTVFJFQU0gYW5kCi0JRlBSSU5URl9GVU5DIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi1XZWQgRGVjIDMwIDE2OjA3OjE0IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IGNoYW5nZSB2b2lkICogdG8gUFRSICh0d28gcGxhY2VzKS4KLQotTW9uIERlYyAxNCAwOTo1MzozMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGNoZWNrIElOX0dDQyBhbnltb3JlLgotCSogc3BsYXktdHJlZS5oOiBMaWtld2lzZS4KLQotVHVlIERlYyAgOCAwMDozMDozMSAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IEVsZW5hIFphbm5vbmkKLSAJPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPiBhbmQgRWRpdGggRXBzdGVpbgotIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlIGluCi0gCWNoYW5nZXMgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBjaGFuZ2UgdGhlIHR5cGUgb2Ygc3RyZWFtCi0JZnJvbSBGSUxFKiB0byB2b2lkKiwgZm9yIHVzZSB3aXRoIGdkYidzIG5ldyB0eXBlIEdEQl9GSUxFLgotCShmcHJpbnRmX2Z0eXBlKTogY2hhbmdlIEZJTEUqIHBhcmFtZXRlciB0eXBlIHRvIHZvaWQqLgotCi0JKiBkZW1hbmdsZS5oOiAoRE1HTF9FREcpOiBuZXcgbWFjcm8gZm9yIEt1Y2sgYW5kIEFzc29jaWF0ZXMKLQkoRE1HTF9TVFlMRV9NQVNLKTogbW9kaWZ5IHRvIGluY2x1ZGUgS3VjayBhbmQgQXNzb2Mgc3R5bGUKLQkoZGVtYW5nbGluZ19zdHlsZXMpOiBhZGQgbmV3IGVkZ19kZW1hbmdsaW5nIHN0eWxlCi0JKEVER19ERU1BTkdMSU5HX1NUWUxFX1NUUklORyk6IG5ldyBtYWNybwotCShFREdfREVNQU5HTElORyk6IG5ldyBtYWNybwotCi0JKiBkZW1hbmdsZS5oIChETUdMX0hQKTogbmV3IG1hY3JvLCBmb3IgSFAvYUNDIGNvbXBpbGVyLgotCShETUdMX1NUWUxFX01BU0spOiBtb2RpZnkgdG8gaW5jbHVkZSBuZXcgSFAncyBzdHlsZS4KLQkoZGVtYW5nbGluZ19zdHlsZXMpOiBhZGQgbmV3IGhwX2RlbWFuZ2xpbmcgdmFsdWUuCi0JKEhQX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTogbmV3IG1hY3JvLgotCShBUk1fREVNQU5HTElORyk6IGNvZXJjZSB0byBpbnQuCi0JKEhQX0RFTUFOR0xJTkcpOiBuZXcgbWFjcm8uCi0KLQkqIGhwLXN5bXRhYi5oOiByZXdyaXR0ZW4sIGZyb20gSFAuCi0JKHF1aWNrX3Byb2NlZHVyZSk6IGNoYW5nZSB0eXBlIG9mIGxhbmd1YWdlIGZpZWxkIHRvIHVuc2lnbmVkIGludAotCShxdWlja19tb2R1bGUpOiBjaGFuZ2UgdHlwZSBvZiBsYW5ndWFnZSBmaWVsZCB0byB1bnNpZ25lZCBpbnQKLQkoc3RydWN0IGRudHRfdHlwZV9zdmFyKTogYWRkIGZpZWxkIHRocmVhZF9zcGVjaWZpYy4KLQkoaHBfbGFuZ3VhZ2UpOiBhZGQgbGFuZ3VhZ2VzIG1vZGNhbCBhbmQgZG1wYXNjYWwuCi0KLU1vbiBOb3YgMzAgMTU6MjU6NTggMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYvc2guaCAoZWxmX3NoX3JlbG9jX3R5cGUpOiBBZGQgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DLAotCVJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCBSX1NIX1NXSVRDSDggYW5kIFJfU0hfbWF4LgotCi1GcmkgTm92IDIwIDEzOjE0OjAwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQWRkIHByb3RvdHlwZSBmb3IgRnJlZUJTRC4KLQotRnJpIE5vdiAxMyAxOToxOToxMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGxpYmliZXJ0eS5oOiBQcm90b3R5cGUgeGNhbGxvYy4KLQotU3VuIE5vdiAgOCAxNzo0MjoyNSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGFuc2lkZWNsLmg6IFdyYXAgcHJvYmxlbWF0aWMgbWFjcm9zIHdpdGggIUlOX0dDQy4KLQotCSogZGVtYW5nbGUuaDogTmV2ZXIgZGVmaW5lIFBBUkFNUygpLgotCSogc3BsYXktdHJlZS5oOiBMaWtld2lzZS4KLQotU2F0IE5vdiAgNyAxODozMDoyMCAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGV0ZXIuc2NoYXVlckByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdmF4KTogRGVjbGFyZS4KLQotU2F0IE5vdiAgNyAxNjowNDowMyAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGluY2x1ZGUgZ2Fuc2lkZWNsLmguCi0JKiBzcGxheS10cmVlLmg6IExpa2V3aXNlLgotCi0xOTk4LTEwLTI2IDE2OjAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBuZXcgZmllbGQgb3B0aW1pemUuCi0KLVRodSBPY3QgMjIgMTk6NTg6MDAgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBzcGxheS10cmVlLmg6IFdyYXAgZnVuY3Rpb24gcG9pbnRlciBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zIGluCi0JUEFSQU1TKCkgbWFjcm8uCi0KLTE5OTgtMTAtMjEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaDogTmV3IGZpbGUuCi0KLUZyaSBPY3QgIDkgMDA6MDI6MDMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNZXJnZSBkZXZvIGFuZCBlZ2NzIGluY2x1ZGUgZGlyZWN0b3JpZXMuCi0KLVNhdCBTZXAgIDUgMTI6MTY6MzMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaCwgb2JzdGFjay5oOiBVcGRhdGVkIGZyb20gZ2NjLgotCi0xOTk4LTA4LTAzICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGxpYmliZXJ0eS5oICh4ZXhpdCk6IENoYW5nZSBkZWNsIHRvIHVzZSBtb2Rlcm4gR0NDIGF0dHJpYnV0ZQotCXRvIGluZGljYXRlIGV4aXQgZG9lcyBub3QgcmV0dXJuLgotCi1Nb24gSnVuICAxIDEzOjQ4OjMyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCi0KLVR1ZSBNYXkgMjYgMjA6NTc6NDMgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogZWxmL3NwYXJjLmggKEVGX1NQQVJDX0xFREFUQSwgUl9TUEFSQ18zMkxFKTogQWRkZWQuCi0KLVR1ZSBGZWIgMjQgMTM6MDU6MDIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogTWVtYmVyIGBzeW1ib2wnIHJlbmFtZWQgdG8gYHN5bWJvbHMnCi0JYW5kIG1hZGUgYW4gImFzeW1ib2wgKioiLiAgTmV3IG1lbWJlciBudW1fc3ltYm9scy4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBVcGRhdGUuCi0KLVR1ZSBGZWIgMTcgMTI6MzI6MTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogQWRkCi0gCXJlZ2lzdGVyIGxlbmd0aCBwYXJhbWV0ZXIuICBGdW5jdGlvbnMgcmV0dXJuIGFjdHVhbCBsZW5ndGggb2YKLSAJcmVnaXN0ZXIuCi0KLVRodSBGZWIgMTIgMTY6Mjk6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZXRvcHQuaDogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotV2VkIEZlYiAxMSAxNjo1NjowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzeW1jYXQuaDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgIDIgMTc6MTM6MzEgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3RpYzMwKTogRGVjbGFyZS4KLQotVGh1IEphbiAyMiAxNjoyMzo1OSAxOTk4ICBGcmVkIEZpc2ggPGZuZkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBmbGFnIElOU05fSEFTX1JFTE9DIHRvIHRlbGwgZGlzYXNzZW1ibHkKLQlmdW5jdGlvbiB0aGVyZSBpcyBhIHJlbG9jIG9uIHRoaXMgbGluZS4KLQotTW9uIERlYyAgOCAxMToyMjoyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IFJlbW92ZSBwcm90b3R5cGUgb2YgZGlzYXNtX3N5bWFkZHIoKSBhcyB0aGlzIGZ1bmN0aW9uCi0Jbm8gbG9uZ2VyIGV4aXN0cy4KLQotVHVlIERlYyAgMiAxMDoyMDo1MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGRpc2FzbV9zeW1hZGRyKTogTmV3IHByb3RvdHlwZS4KLQotTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYvc2guaCAoUl9TSF9TV0lUQ0g4KTogTmV3LgotCi1Nb24gRGVjICAxIDExOjI5OjM1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKENCX1NZU0NBTEwpOiBDb21tZW50IG91dCBhcmcgbmFtZXMgaW4gcHJvdG90eXBlcy4KLQotV2VkIE5vdiAyNiAxNjo0Nzo1OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suaCAoQ0JfU1lTQ0FMTCk6IENvbnNpc3RhbnRseSB1c2UgbmFtZXMgZm9yIHByb3RvdHlwZQotCWFyZ3VtZW50cy4KLQotV2VkIE5vdiAyNiAxMTozOTozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChDQl9TWVNDQUxMKTogQ2hhbmdlIGJ5dGUgY291bnQgYXJndW1lbnRzIHRvCi0Je3JlYWQsd3JpdGV9X21lbSB0byBgaW50Jy4gIE5ldyBtZW1iZXIgYG1hZ2ljJy4KLQkoQ0JfU1lTQ0FMTF9NQUdJQyxDQl9TWVNDQUxMX0lOSVQpOiBOZXcgbWFjcm9zLgotCi1UdWUgTm92IDI1IDAxOjM1OjUyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChzdHJ1Y3Qgc3RhdCk6IE1vdmUgZm9yd2FyZCBkZWNsIHVwLgotCShob3N0X2NhbGxiYWNrKTogUGFzcyBzdGF0IHN0cnVjdCBwb2ludGVyIHRvIHN0YXQsZnN0YXQuCi0JKENCX1NZU19ubm4pOiBSZW9yZ2FuaXplLgotCShDQl9TWVNDQUxMKTogTmV3IG1lbWJlcnMgcDEscDIuCi0JKGNiX2hvc3RfdG9fdGFyZ2V0X3N0YXQpOiBEZWxldGUgZm91cnRoIGFyZy4KLQotU2F0IE5vdiAyMiAyMzozNDoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3N0b3BfcmVhc29uKTogQ2xhcmlmeSBzaW1fc2lnbmFsbGVkIFNJR1JDCi0gCWFyZ3VtZW50LgotCi1Nb24gTm92IDE3IDE0OjAwOjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChDQl9UQVJHRVRfREVGU19NQVApOiBSZW5hbWVkIGZyb20gdGFyZ2V0X2RlZnNfbWFwLgotCShob3N0X2NhbGxiYWNrKTogQWRkIHN0YXQsIGZzdGF0LCBzeXNjYWxsX21hcCwgZXJybm9fbWFwLCBvcGVuX21hcCwKLQlzaWduYWxfbWFwLCBzdGF0X21hcC4KLQkoZXJybl9tYXAsb3Blbl9tYXApOiBSZW5hbWVkIHRvIGNiX2luaXRfZm9vX21hcC4KLQkoY2JfaG9zdF90b190YXJnZXRfZXJybm8sY2JfdGFyZ2V0X3RvX2hvc3Rfb3Blbik6IFJlbmFtZWQgZnJvbQotCWhvc3RfdG9fdGFyZ2V0X2Vycm5vLHRhcmdldF90b19ob3N0X29wZW4uCi0JKGNiX3JlYWRfdGFyZ2V0X3N5c2NhbGxfbWFwcyk6IEFkZCBwcm90b3R5cGUuCi0JKGNiX3RhcmdldF90b19ob3N0X3N5c2NhbGwpOiBMaWtld2lzZS4KLQkoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IExpa2V3aXNlLgotCShjYl9zeXNjYWxsKTogTGlrZXdpc2UuCi0JKENCX1NZU197ZXhpdCxvcGVuLGNsb3NlLHJlYWQsd3JpdGUsbHNlZWssdW5saW5rLGdldHBpZCxraWxsLGZzdGF0LAotCWFyZ3ZsZW4sYXJndixjaGRpcixzdGF0LGNobW9kLHV0aW1lLHRpbWV9KTogRGVmaW5lLgotCShDQl9TWVNDQUxMKTogTmV3IHR5cGUuCi0JKENCX1JDKTogTmV3IGVudW0uCi0KLUZyaSBOb3YgIDcgMTA6MzQ6MDkgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKwotCXByb2dyYW1zLgotCSogcmVtb3RlLXNpbS5oOiAgQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKwotCXByb2dyYW1zLgotCi1UdWUgT2N0IDE0IDE2OjA3OjUxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQKLQknc3ltYm9sX2F0X2FkZHJlc3NfZnVuYycuCi0JKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogSW5pdGlhbGlzZSBuZXcgZmllbGQgd2l0aAotCWdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MuCi0KLU1vbiBPY3QgMTMgMTA6MTc6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IENsYXJpZnkgc2ltX3JlYWQsIHNpbV93cml0ZSBNRU0gYXJndW1lbnQuCi0KLVdlZCBTZXAgMjQgMTg6MDM6MTAgMTk5NyAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoU0lNX1JDKTogIEFkZCBhIGJ1bmNoIG9mIG5ldyByZXR1cm4gY29kZXMgZm9yCi0JYnJlYWtwb2ludCBzdHVmZi4KLQkqIEFkZCBmdW5jdGlvbnMgdG8gdGVsbCB0aGUgc2ltdWxhdG9yIHRvIHNldC9jbGVhci9lbmFibGUvZGlzYWJsZQotCWludHJpbnNpYyBicmVha3BvaW50cy4KLQotVGh1IEF1ZyAyOCAxOTo0MTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChkdXBhcmd2KTogQWRkIHByb3RvdHlwZS4KLQotVHVlIEF1ZyAyNiAxMjoyNTo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZy4gRG9jdW1lbnQuCi0KLU1vbiBBdWcgMjUgMTA6NTA6NTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJnLiBEb2N1bWVudC4KLQotRnJpIEF1ZyAgOCAxNjo0Mzo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGFyY19nZXRfZGlzYXNzZW1ibGVyKTogRGVjbGFyZS4KLQotV2VkIEp1bCAzMCAxMTozOTo1MCAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaCAoRE1HTF9KQVZBKTogIE5ldyBvcHRpb24gdG8gcmVxdWVzdCBKYXZhIGRlbWFuZ2xpbmcuCi0KLVR1ZSBKdWwgMjIgMTc6NTk6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoUEVYRUNVVEVfKik6IERlZmluZS4KLQkocGV4ZWN1dGUsIHB3YWl0KTogRGVjbGFyZS4KLQotRnJpIEp1biAgNiAxMzowMjozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX2tpbGwpOiBNYXJrIGFzIGRlcHJlY2lhdGVkLgotCi1GcmkgTWF5IDIzIDEzOjQzOjQxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHRhc2tfbGluayBtZW1iZXIuCi0KLVRodSBNYXkgMjIgMTE6MzI6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IFJldmlldyBkb2N1bWVudGF0aW9uLiAgQ2xhcmlmeSByZXN0cmljdGlvbnMgb24KLSAJd2hlbiBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZC4KLQotV2VkIE1heSAyMSAxNjo0Nzo1MyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3NldF9wcm9maWxlX3NpemUpOiBBZGQgcHJvdG90eXBlLCBkb2N1bWVudCBhcwotIAlkZXByZWNpYXRlZC4KLQotVHVlIE1heSAyMCAwOTozMjoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgc3RydWN0LgotCShzaW1fc2V0X2NhbGxiYWNrcyk6IERyb3AgU0lNX0RFU0MgYXJndW1lbnQuIERvY3VtZW50LgotCShzaW1fc2l6ZSk6IFJlbW92ZSByZWNlbnRseSBhZGRlZCBTSU1fREVTQyBhcmd1bWVudC4gRG9jdW1lbnQuCi0KLU1vbiBNYXkgMTkgMTk6MTQ6NDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IFBhc3MgU0QgaW50byBzaW1fc2l6ZS4KLQotVGh1IE1heSAxNSAwMToyNDoxNiAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suaCAob2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcsIG9ic3RhY2tfY2h1bmtmdW4sCi0Jb2JzdGFja19mcmVlZnVuKTogRWxpbWluYXRlIGNvbXBpbGUgd2FybmluZ3MgaW4gZ2RiLgotCi1UdWUgTWF5IDEzIDEwOjIxOjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvYXJtLmggKGNvbnN0YW50cyk6ICAgQWRkZWQgbmV3IGZsYWcgYml0cyBGX0FQQ1NfMjYgYW5kCi0JRl9BUENTX1NFVCBmb3IgdGhlIGZfZmxhZ3MgZmllbGQgb2YgdGhlIGZpbGVoZHIgc3RydWN0dXJlLiAgQWRkZWQgbmV3Ci0JZmxhZ3M6IEZfQVBDUzI2LCBGX0FSTV8yLCBGX0FSTV8zLCBGX0FSTV83LCBGX0FSTV83VCB0byBzdG9yZQotCWluZm9ybWF0aW9uIGluIHRoZSBmbGFncyBmaWVsZCBvZiB0aGUgaW50ZXJuYWxfZiBzdHJ1Y3R1cmUgdXNlZCBieSBCRkQKLQlyb3V0aW5lcy4KLQotVHVlIEFwciAyMiAxMDoyNDozNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZmxvYXRmb3JtYXQuaCAoZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyk6IEFkZCBjb21tZW50cyBmb3IgcHJldmlvdXMKLQlmb3JtYXRzIGFuZCBhZGQgZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkLCBwcmltYXJpbHkgZm9yIEFSTS4KLQlBZGQgZGVjbGFyYXRpb24gZm9yIGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZC4KLQotRnJpIEFwciAxOCAxMzowNDo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3N0b3ApOiBOZXcgaW50ZXJmYWNlIC0gYXN5bmNocm9ub3VzCi0gCW5vdGlmaWNhdGlvbiBvZiBhIHJlcXVlc3QgdG8gc3RvcCAvIHN1c3BlbmQgdGhlIHJ1bm5pbmcKLSAJc2ltdWxhdGlvbi4KLQotCSogcmVtb3RlLXNpbS5oIChlbnVtIHNpbV9zdG9wKTogQWRkIHNpbV9ydW5uaW5nIGFuZCBzaW1fcG9sbGluZyBhcwotIAlzdGF0ZXMgZm9yIHVzZSBpbnRlcm5hbCB0byBzaW11bGF0b3JzLgotCi0JKiBjYWxsYmFjay5oIChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1dCk6IFB1dCBhIG1hZ2ljIG51bWJlciBhdAotIAl0aGUgZW5kIG9mIHRoZSBzdHJ1Y3QgdG8gYWxsb3cgYmFzaWMgY2hlY2tpbmcuCi0JKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCApOiBBZGQgcG9sbF9xdWl0IC0gc28KLSAJdGhhdCB0aGUgY29uc29sZSBldGMgY2FuIGJlIHBvbGxlZCBhdCByZWd1bGFyIGludGVydmFscy4KLQotVGh1IEFwciAxNyAwMjoxNzoxMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHN0cnVjdCBfYmZkKTogRGVjbGFyZS4KLQkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBgYWJmZCcuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBgc3RhcnRfYWRkcmVzcycuCi0KLVdlZCBBcHIgIDIgMTc6MDk6MTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3RyYWNlLCBzaW1fc2l6ZSk6IE1ha2UgdGhlc2UgZ2xvYmFsLiAgVGhleQotIAl3aWxsIGdvIGF3YXkgc2hvcnRseS4KLQotV2VkIEFwciAgMiAxNToyMzo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKFNJTV9PUEVOX0tJTkQsIFNJTV9SQyk6IE5ldyBlbnVtcy4KLQkoc2ltX29wZW4pOiBOZXcgYXJndW1lbnQgYGtpbmQnLgotCi1XZWQgQXByICAyIDE0OjQ1OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1GcmkgTWFyIDI4IDE1OjI5OjU0IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oICh0b3AgbGV2ZWwpOiBJbmNsdWRlIHN0ZGFyZy5oIG9yIHZhcmFyZ3MuaCBpZgotCXZhX3N0YXJ0IGlzIG5vdCBkZWZpbmVkLgotCShob3N0X2NhbGxiYWNrX3N0cnVjdCk6IE1ha2UgeyxlfXZwcmludGZfZmlsdGVyZWQgdGFrZSBhIHZhX2xpc3QKLQlpbnN0ZWFkIG9mIHZvaWQgKiwgc2luY2UgdmFfbGlzdCBtaWdodCBiZSBhbiBhcnJheSBvciBzdHJ1Y3R1cmUKLQl0eXBlLgotCi1GcmkgTWFyIDI4IDE1OjQ0OjQxIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IEFkZCBwcm90b3R5cGUgZm9yIGdsaWJjIGFuZCBsaW51eC4KLQotTW9uIE1hciAxNyAxOToyMjoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamFsbG9jLmg6IE5ldyBmaWxlLgotCi1Nb24gTWFyIDE3IDE0OjU3OjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IE5ldyBmaWxlLCBjb3BpZWQgaW4gZnJvbSBnZGIvcmVtb3RlLXNpbS5oLiAgT25lCi0gCWRheSB0aGlzIHdpbGwgYmUgcGxhY2VkIGluIGEgZGlyZWN0b3J5IG9mIGl0cyBvd24uCi0KLVNhdCBNYXIgMTUgMTk6MDA6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYnN0YWNrLmg6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9uLgotCi1UaHUgTWFyICA2IDE1OjQ2OjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QpOiBBZGQgY2FsbGJhY2tzIC0KLSAJZmx1c2hfc3Rkb3V0LCB3cml0ZV9zdGRlcnIsIGZsdXNoX3N0ZGVyciwgdnByaW50Zl9maWx0ZXJlZCwKLSAJZXZwcmludGZfZmlsdGVyZWQuICBEZWxldGUgcmVkdW5kYW50IGNhbGxiYWNrcyAtIHByaW50Zl9maWx0ZXJlZC4KLQotVGh1IEZlYiAyNyAyMzoxODoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBSZW1vdmUgbHByZWZpeCBhbmQgbHByZWZpeF9sZW4KLQlmaWVsZHMuCi0KLVR1ZSBGZWIgMjUgMDA6MTA6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogSW5pdGlhbGl6ZQotCWJ5dGVzX3Blcl9jaHVuayBhbmQgZGlzcGxheV9lbmRpYW4uCi0KLU1vbiBGZWIgMjQgMTc6NDc6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIpOiBEZWZpbmUuCi0JKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyk6IERlZmluZS4KLQkoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlKTogRGVmaW5lLgotCi1UaHUgRmViICA2IDE0OjIwOjAxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IChkaXNhc3NlbWJsZV9pbmZvKTogIEFkZCBuZXcgZmllbGRzCi0JYnl0ZXNfcGVyX2NodW5rIGFuZCBkaXNwbGF5X2VuZGlhbiB0byBjb250cm9sIHRoZQotCWRpc3BsYXkgb2YgcmF3IGluc3RydWN0aW9ucy4KLQotRnJpIERlYyAyNyAyMjoxNzozNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3RpYzgwKTogRGVjbGFyZS4KLQotU3VuIERlYyAgOCAxNzoxMToxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChob3N0X2NhbGxiYWNrKTogTmV3IG1lbWJlciBgZXJyb3InLgotCi1XZWQgTm92IDIwIDAwOjQwOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmg6IE5ldyBmaWxlLCBtb3ZlZCBoZXJlIGZyb20gZ2RiLgotCi1Nb24gTm92IDE4IDE2OjM0OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5Lmg6IENoZWNraW4gYWdhaW47IGxhc3QgY2hlY2tpbiBmYWlsZWQgZHVlIHRvIHN0aWNreSB0YWcuCi0KLVdlZCBOb3YgMTMgMDg6MjI6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogUmV2ZXJ0IGxhc3QgY29tbWl0IGR1ZSB0byBjb25mbGljdHMgd2l0aCBocHV4Ci0Jc3lzdGVtIGhlYWRlcnMuCi0KLVR1ZSBOb3YgMTIgMTY6MzE6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogTW92ZSBwcm90b3R5cGVzIGZyb20gYXJndi5jIGhlcmUuCi0KLVRodSBPY3QgMzEgMTQ6NTY6MTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYW5zaWRlY2wuaCAoVlBBUkFNUyxWQV9TVEFSVCk6IERlZmluZS4KLQotRnJpIE9jdCAyNSAxMjowODowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVfaW5mbyk6IEFkZCBieXRlc19wZXJfbGluZSBmaWVsZC4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplIGJ5dGVzX3Blcl9saW5lIGZpZWxkLgotCi1UaHUgT2N0IDI0IDE3OjEwOjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogQWRkIHN5bWJvbCBmaWVsZC4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplIHN5bWJvbCBmaWVsZC4KLQotVGh1IE9jdCAxNyAxMToxNzo0MCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fbTMycik6IERlY2xhcmUuCi0KLU1vbiBPY3QgMTQgMjM6NTY6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogRGVjbGFyZSBwYXJhbWV0ZXIgdHlwZXMgZm9yIHhtYWxsb2MgYW5kIHhyZWFsbG9jLgotCi1UaHUgT2N0ICAzIDEzOjQ1OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAgMyAxMDozMzoxNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9tbjEweDAwKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShwcmludF9pbnNuX21uMTAyMDAsIHByaW50X2luc25fbW4xMDMwMCk6IERlY2xhcmUuCi0KLVdlZCBPY3QgIDIgMjE6MjQ6NDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fbW4xMHgwMCk6IERlY2xhcmUuCi0KLU1vbiBTZXAgMzAgMTM6NTY6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBSZW1vdmUgI2lmbmRlZiBQUklWQVRFX1hNQUxMT0MuCi0KLVNhdCBBdWcgMzEgMTM6Mjc6MDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdjg1MCk6IERlY2xhcmUuCi0KLVR1ZSBBdWcgMTMgMTY6MTA6MzAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiAgQ2hhbmdlIGJjb3B5IHRvIG1lbWNweS4gIFdvcmtzIGJldHRlciBvbiBQb3NpeAotCXN5c3RlbXMsIHdoaWNoIGdlbmVyYWxseSBsYWNrIGJjb3B5LgotCi1Nb24gQXVnIDEyIDE3OjAzOjE4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6ICBDaGFuZ2UgV0lOMzIgdG8gX1dJTjMyLgotCi1GcmkgSnVsIDI2IDEzOjU4OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oOiBBZGQgZmxhdm91ciBmaWVsZC4KLQkocHJpbnRfaW5zbl9hbHBoYSk6IERlY2xhcmUuCi0JKHByaW50X2luc25fYWxwaGFfb3NmLCBwcmludF9pbnNuX2FscGhhX3Ztcyk6IERvbid0IGRlY2xhcmUuCi0JKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6IEluaXRpYWxpemUgZmxhdm91ciBmaWVsZC4KLQotVHVlIEp1bCAyMyAxNzozNzo1OCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKFBSSVZBVEVfWE1BTExPQyk6IEVuY2xvc2UgeG1hbGxvYy94cmVhbGxvYwotCWRlZmluaXRpb25zIGluc2lkZSAjaWZuZGVmIHNvIHRoYXQgcHJvZ3JhbXMgdGhhdCB3YW50IHRvCi0JY2FuIGRlZmluZSBQUklWQVRFX1hNQUxMT0MgYW5kIHRoZW4gZGVmaW5lIHhtYWxsb2MgYW5kCi0JeHJlYWxsb2MgYW55d2F5IHRoZXkgd2FudC4KLQkoYmFzZW5hbWUpOiBEb2N1bWVudCBpbiBzb3VyY2UgdGhhdCB3ZSBjYW4ndCBkZWNsYXJlIHRoZQotIAlwYXJhbWV0ZXIgdHlwZSBiZWNhdXNlIGl0IGlzIGRlY2xhcmVkIGluY29uc2lzdGVudGx5IGFjcm9zcwotCWRpZmZlcmVudCBzeXN0ZW1zLgotCi1Nb24gSnVsIDIyIDEzOjE2OjEzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fYWxwaGEpOiBEb24ndCBkZWNsYXJlLgotCShwcmludF9pbnNuX2FscGhhX29zZiwgcHJpbnRfaW5zbl9hbHBoYV92bXMpOiBEZWNsYXJlLgotCi1XZWQgSnVsIDE3IDE0OjQ1OjEyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IChwcmludF9pbnNuX2QxMHYpOiBEZWNsYXJlLgotCi1Nb24gSnVsIDE1IDE2OjU1OjM4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogIEdldCByaWQgb2YgZGVjbHMgZm9yIHByaW50X2luc25faTgwODYsCi0JcHJpbnRfaW5zbl9zcGFyYzY0IGFuZCBwcmludF9pbnNuX3NwYXJjbGl0ZS4KLQkqIChJTklUX0RJU0FTU0VNQkxFX0lORk8pOiAgU3BsaXQgaW50byB0d28gcGllY2VzLiAgT25lLAotCUlOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIIGluaXRzIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvciBlbmRpYW4sCi0JbWFjaCwgYW5kIGFyY2guCi0KLUZyaSBKdWwgMTIgMTA6MTk6MjcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2k4MDg2KTogIERlY2xhcmUuCi0KLVdlZCBKdWwgIDMgMTY6MDI6MzkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3NwYXJjbGl0ZSk6ICBEZWNsYXJlLgotCi1UdWUgSnVuIDE4IDE2OjAyOjQ2IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faDgzMDBzKTogRGVjbGFyZS4KLQotVHVlIEp1biAxOCAxNToxMTozMyAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZm9wZW4tdm1zLmg6IE5ldyBmaWxlLgotCi1UdWUgSnVuICA0IDE4OjU4OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBub3RpY2VfYWxsIGZpZWxkLgotCi1GcmkgQXByIDI2IDEwOjMzOjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRlbWFuZ2xlLmggKCNpZmRlZiBJTl9HQ0MpOiAjaW5jbHVkZSAiZ2Fuc2lkZWNsLmgiLgotCShQUk9UTyxQVFIsY29uc3QpOiBEZWxldGUuCi0KLU1vbiBBcHIgMjIgMTc6Mjc6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHRyYWRpdGlvbmFsX2Zvcm1hdCBmaWVsZC4KLQotTW9uIEFwciAxNSAxNToxNjo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoY2hvb3NlX3RlbXBfYmFzZSk6IEFkZCBwcm90b3R5cGUuCi0KLVR1ZSBNYXIgMTIgMTc6Mjk6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXApOiBEZWNsYXJlLgotCShzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCB3cmFwX2hhc2ggZmllbGQuCi0KLVdlZCBGZWIgMTQgMTY6NDk6MTcgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogaWVlZS5oIChpZWVlX3JlY29yZF9lbnVtX3R5cGUpOiBEZWZpbmUKLQlpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX2VudW0uCi0KLUZyaSBGZWIgIDIgMTc6MDk6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoRElTQVNNX1JBV19JTlNOKTogRGVsZXRlLgotCi1UdWUgSmFuIDIzIDA5OjIxOjQ3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6IFNldCBlbmRpYW4gdG8gQkZEX0VORElBTl9VTktOT1dOLgotCU5ldyBhcmd1bWVudCBGUFJJTlRGX0ZVTkMuCi0KLU1vbiBKYW4gMjIgMTY6Mzc6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVfaW5mbyk6IE5ldyBtZW1iZXJzIGFyY2gsIG1hY2gsIGVuZGlhbi4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogSW5pdGlhbGl6ZSB0aGVtLgotCShESVNBU01fUkFXX0lOU057LEZMQUd9KTogRGVmaW5lLgotCi1UaHUgSmFuIDE4IDExOjMyOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaCAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2hhbmdlIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouCi0JKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgYW5kIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouCi0KLUZyaSBKYW4gIDUgMDA6MDE6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmggKGVudW0gaWVlZV9yZWNvcmQpOiBBZGQgaWVlZV9hc25fcmVjb3JkX2VudW0sCi0JaWVlZV9hdF9yZWNvcmRfZW51bSwgaWVlZV90eV9yZWNvcmRfZW51bSwgaWVlZV9hdG5fcmVjb3JkX2VudW0sCi0JaWVlZV9iYl9yZWNvcmRfZW51bSwgYW5kIGllZWVfYmVfcmVjb3JkX2VudW0uCi0KLVdlZCBKYW4gIDMgMTM6MTI6MDkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suaDogVXBkYXRlIGNvcHlyaWdodCB0byAxOTk2LgotCShfb2JzdGFja19tZW1vcnlfdXNlZCk6IERlY2xhcmUuCi0JKG9ic3RhY2tfbWVtb3J5X3VzZWQpOiBEZWZpbmUgbWFjcm8uCi0KLVRodSBEZWMgMjggMTE6NDI6MTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoeHN0cmR1cCk6IERlY2xhcmUuCi0KLVRodSBEZWMgMjEgMTQ6NDc6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB3YWl0Lmg6IFByb3RlY3QgYWxsIG1hY3JvcyB3aXRoICNpZm5kZWYuCi0KLVR1ZSBPY3QgMjQgMjE6NDU6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHN0YXRpY19saW5rIGZpZWxkLgotCi1UdWUgU2VwIDEyIDE2OjI4OjA0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIHN5bWJvbCBwYXJhbWV0ZXIgdG8KLQl3YXJuaW5nIGNhbGxiYWNrLgotCi1GcmkgU2VwICAxIDEzOjExOjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQ2hhbmdlIHdhcm5pbmcgY2FsbGJhY2sKLQl0byB0YWtlIEJGRCwgc2VjdGlvbiwgYW5kIGFkZHJlc3MgYXJndW1lbnRzLgotCi1UaHUgQXVnIDMxIDE2OjQ1OjEyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBSZW1vdmUgUEUgc3R1ZmYuCi0KLVR1ZSBBdWcgMjIgMDM6MTg6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogRGVjbGFyZSB4c3RyZXJyb3IuICBGcm9tIFBhdCBSYW5raW4uCi0KLU1vbiBBdWcgMjEgMTg6MTE6MzYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IFJlbW92ZSBQRSBzdHVmZi4KLQotV2VkIEF1ZyAgMiAwODoxNDoxMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fc3BhcmM2NCk6IERlY2xhcmUuCi0KLU1vbiBKdWwgMTAgMTM6MjY6NDkgMTk5NSAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFpYi5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgbmV3IGZpZWxkIHN5bWJvbGljLgotCi1TdW4gSnVsICAyIDE3OjQ4OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGJhc2VfZmlsZSB0bwotCVBUUi4KLQotVGh1IEp1biAyOSAwMDowMjo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkZWQgYmFzZV9maWxlIG1lbWJlci4KLQotVHVlIEp1biAyMCAxNjo0MDowNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBhbnNpZGVjbC5oOiB3aW4zMnMgaXMgQU5TSSBlbm91Z2guCi0KLVRodSBNYXkgMTggMDQ6MjU6NTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2FybSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkocHJpbnRfaW5zbl97bGl0dGxlLGJpZ31fYXJtKTogTmV3IGRlY2xhcmF0aW9ucy4KLQotCSogZmxvYXRmb3JtYXQuaCAoZmxvYXRmb3JtYXRfYXJtX2V4dCk6IERlY2xhcmUuCi0KLVNhdCBNYXkgMTMgMTA6MTQ6MDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi9wZS5oOiBOZXcgZmlsZS4KLQkqIGJmZGxpbmsuaCAoc3Vic3l0ZW0sIHN0YWNrX2hlYXBfcGFyYW1ldGVycyk6IE5ldy4KLQkqIGNvZmYvaTM4Ni5oIChOVF9TRUNUSU9OX0FMSUdOTUVOVCwgTlRfRklMRV9BTElHTk1FTlQsCi0JTlRfREVGX1JFU0VSVkUsIE5UX0RFRl9DT01NSVQpOiBOZXcuCi0JKiBjb2ZmL2ludGVybmFsLmggKGludGVybmFsX2ZpbGVoZHIpOiAgTmV3IGZpZWxkcyBmb3IgUEUuCi0JKElNQUdFX0RBVEFfRElSRUNUT1JZKTogTmV3LgotCShpbnRlcm5hbF9hb3V0aGRyKTogTmV3IGZpZWxkcyBmb3IgUEUuCi0KLVRodSBNYXkgIDQgMTQ6MzY6NDIgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGluY2x1ZGUgYW5zaWRlY2wuaCBpZiBJTl9HQ0MuCi0KLVR1ZSBGZWIgMjEgMDA6Mzc6MjggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwLXN5bXRhYi5oOiBEb24ndCB1c2UgYml0ZmllbGQgZW51bWVyYXRpb25zLCB0aGUgSFAgQyBjb21waWxlcgotCWRvZXMgbm90IGhhbmRsZSB0aGVtIGNvcnJlY3RseS4KLQotVGh1IEZlYiAgOSAxNDoyMDoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVyIHR5cGU7IHNvbWUKLQlzeXN0ZW1zIGhhdmUgdGhpcyBpbiB0aGVpciBoZWFkZXIgZmlsZXMuCi0KLVdlZCBGZWIgIDggMTc6MzU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIGZvcm1hdCBvZiBjb21tb24KLQlzeW1ib2wgaW5mb3JtYXRpb24sIHRvIHJlbW92ZSByZXN0cmljdGlvbnMgb24gbWF4aW11bSBzaXplIGFuZAotCWFsaWdubWVudCBwb3dlciwgYnkgdXNpbmcgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIGluc3RlYWQuCi0KLU1vbiBGZWIgIDYgMTQ6NTU6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGVudW0gYmZkX2xpbmtfaGFzaF90eXBlKTogUmVuYW1lIGJmZF9saW5rX2hhc2hfd2VhawotCXRvIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLiAgQWRkIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KLQotTW9uIEphbiAxNiAyMTowMDoyMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoR0RCX0lOSVRfRElTQVNTRU1CTEVfSU5GTywgZXRjKTogUmVtb3ZlIGFsbAotCUdEQi1zcGVjaWZpYyBkZWZpbml0aW9ucy4KLQotU3VuIEphbiAxNSAxODozOTozNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3c2NSk6IERlY2xhcmUuCi0KLVRodSBKYW4gMTIgMTc6NTE6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGhleF9wKTogRml4IHNlbnNlIG9mIHRlc3QuCi0KLVdlZCBKYW4gMTEgMjI6MzY6NDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKF9oZXhfYXJyYXlfc2l6ZSwgX2hleF9iYWQsIF9oZXhfdmFsdWUsIGhleF9pbml0LAotCWhleF9wLCBoZXhfdmFsdWUpOiBOZXcgbWFjcm9zIGFuZCBkZWNsYXJhdGlvbnMsIGZvciBoZXguYy4KLQotRnJpIEphbiAgNiAxNzo0NDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogTWFrZSBpZGVtcG90ZW50LgotCi1XZWQgRGVjIDE0IDEzOjA4OjQzIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogcHJvZ3Jlc3MuaDogTmV3IGZpbGUsIGVtcHR5IGRlZmluaXRpb25zIGZvciBwcm9ncmVzcyBtYWNyb3MuCi0KLUZyaSBOb3YgMjUgMDA6MTQ6MDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwLXN5bXRhYi5oOiBOZXcgZmlsZSBkZXNjcmliaW5nIHRoZSBkZWJ1ZyBzeW1ib2xzIGVtaXR0ZWQKLQlieSB0aGUgSFAgQyBjb21waWxlcnMuCi0KLUZyaSBOb3YgMTEgMTU6NDg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHUuYy5zaXplIGZyb20gMjQKLQl0byAyNiBiaXRzLCBhbmQgY2hhbmdlIHUuYy5hbGlnbm1lbnRfcG93ZXIgZnJvbSA4IHRvIDYgYml0cy4gIDYKLQliaXQgaW4gdGhlIGFsaWdubWVudCBwb3dlciBpcyBlbm91Z2ggZm9yIGEgNjQgYml0IGFkZHJlc3Mgc3BhY2UuCi0KLU1vbiBPY3QgMzEgMTM6MDI6NTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oIChjcGx1c19tYW5nbGVfb3BuYW1lKTogRGVjbGFyZS4KLQotVHVlIE9jdCAyNSAxMTozODowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IEZpeCBjb21tZW50cyBmb3IKLQltdWx0aXBsZV9jb21tb24gZmllbGQuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogYW91dC9hb3V0NjQuaDogT25seSBkZWZpbmUgUU1BR0lDIGlmIGl0IGlzbid0IGFscmVhZHkgZGVmaW5lZC4KLQotCSogZGlzLWFzbS5oOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEFSTS4KLQotV2VkIEF1ZyAxMCAxMjo1MTo0MSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBsaWJpYmVydHkuaCAoc3Ryc2lnbmFsKTogRG9jdW1lbnQgaXRzIGV4aXN0ZW5jZSBldmVuIGlmIHdlCi0JY2FuJ3QgZGVjbGFyZSBpdC4KLQotVHVlIEF1ZyAgMiAxNDo0MDowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogb3M5ay5oOiBSZW1vdmUgdV9pbnQxNiwgdV9pbnQzMiwgYW5kIG93bmVyX2lkIHR5cGVkZWZzIGFuZAotCWV4cGFuZCB0aGVpciB1c2VzLiAgVGhvc2UgbmFtZXMgY29uZmxpY3Qgd2l0aCBNYWNoIGhlYWRlcnMuCi0KLUZyaSBKdWwgMjIgMTQ6MTc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHUuYy5zaXplIGludG8gYQotCWJpdGZpZWxkLiAgQWRkIGZpZWxkIHUuYy5hbGlnbm1lbnRfcG93ZXIuCi0KLVN1biBKdWwgMTAgMDA6MjY6MzkgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIGRpcy1hc20uaDogQWRkIHByaW50X2luc25fbnMzMmsgZGVjbGFyYXRpb24uCi0KLU1vbiBKdW4gMjAgMTc6MTM6MjkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2hhc2hfdGFibGUpOiBNYWtlIGNyZWF0b3IgYSBjb25zdCBwb2ludGVyLgotCi1TYXQgSnVuIDE4IDE2OjA5OjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaCAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogRGVjbGFyZS4KLQotVGh1IEp1biAxNiAxNToxOTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgbmV3IGZpZWxkIHNoYXJlZC4KLQotTW9uIEp1biAgNiAxNDozOTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgd3JpdHRlbiBmaWVsZDoKLQlub3QgbmVlZGVkIGZvciBhbGwgYmFja2VuZHMuCi0KLVRodSBBcHIgMjggMTk6MDY6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZXIpOiBEZWNsYXJlLgotCi1GcmkgQXByICAxIDAwOjM4OjE3IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25AbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotCSogb2JzdGFjay5oOiBEZWxldGUgdXNlIG9mIElOX0dDQyB0byBjb250cm9sIHdoZXRoZXIKLQlzdGRkZWYuaCBvciBnc3RkZGVmLmggaXMgaW5jbHVkZWQuCi0KLVR1ZSBNYXIgMjIgMTM6MDY6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSk6IEFkZCBiZmRfZGF0YV9saW5rX29yZGVyLgotCShzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIpOiBBZGQgZGF0YSBmaWVsZCB0byB1bmlvbi4KLQotTW9uIE1hciAyMSAxODo0NToyNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IENoYW5nZSBiaXRzaXplIGFyZ3VtZW50Ci0JdG8gYWRkX3RvX3NldCB0byByZWxvYy4gIFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20gY29uc3RydWN0b3IuCi0JQ29tbWVudCB0aGF0IHJlbG9jX292ZXJmbG93LCByZWxvY19kYW5nZXJvdXMgYW5kIHVuYXR0YWNoZWRfcmVsb2MKLQltdXN0IGhhbmRsZSBOVUxMIHBvaW50ZXJzIGZvciByZWxvYyBsb2NhdGlvbi4KLQkoZW51bSBiZmRfbGlua19vcmRlcl90eXBlKTogQWRkIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgYW5kCi0JYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLgotCShzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIpOiBBZGQgcmVsb2MgZmllbGQgdG8gdW5pb24uCi0JKHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYyk6IERlZmluZS4KLQotTW9uIE1hciAxNCAxMjoyNzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGllZWUtZmxvYXQuaDogUmVtb3ZlZDsgbm8gbG9uZ2VyIHVzZWQuCi0KLVR1ZSBNYXIgIDEgMTg6MTA6NDkgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogb3M5ay5oOiBvczkwMDAgdGFyZ2V0IHNwZWNpZmljIGhlYWRlciBmaWxlLCB0aGUgaGVhZGVyIG9mIHRoZQotCW9iamVjdCBmaWxlIGlzIHVzZWQgbm93LgotCi1TdW4gRmViIDI3IDIxOjUyOjI2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBmbG9hdGZvcm1hdC5oOiBOZXcgZmlsZSwgaW50ZW5kZWQgdG8gcmVwbGFjZSBpZWVlLWZsb2F0LmguCi0KLVN1biBGZWIgMjAgMTc6MTU6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmggKEFOU0lfUFJPVE9UWVBFUyk6IERlZmluZSBpZiB1c2luZyBBTlNJIHByb3RvdHlwZXMuCi0KLVdlZCBGZWIgMTYgMDE6MDc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJpYmVydHkuaDogRG9uJ3QgZGVjbGFyZSBzdHJzaWduYWwsIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoCi0JU29sYXJpcyBzeXN0ZW0gaGVhZGVyIGZpbGVzLgotCi1TYXQgRmViIDEyIDIyOjExOjMyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsaWJpYmVydHkuaCAoeGV4aXQpOiBVc2UgX192b2xhdGlsZV9fIHRvIGF2b2lkIGxvc2luZyBpZgotCWNvbXBpbGluZyB3aXRoIGdjYyAtdHJhZGl0aW9uYWwuCi0KLVRodSBGZWIgMTAgMTQ6MDU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaWJpYmVydHkuaDogTmV3IGZpbGUuICBEZWNsYXJlcyBmdW5jdGlvbnMgcHJvdmlkZWQgYnkKLQlsaWJpYmVydHkuCi0KLVR1ZSBGZWIgIDggMDU6MTk6NTIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JSGFuZGxlIG9ic3RhY2tfY2h1bmtfYWxsb2MgcmV0dXJuaW5nIE5VTEwuICBUaGlzIGFsbG93cwotCW9ic3RhY2tzIHRvIGJlIHVzZWQgYnkgbGlicmFyaWVzLCB3aXRob3V0IGZvcmNpbmcgdGhlbQotCXRvIGNhbGwgZXhpdCBvciBsb25nam1wLgotCSogb2JzdGFjay5oIChzdHJ1Y3Qgb2JzdGFjayk6IEFkZCBhbGxvY19mYWlsZWQgZmxhZy4KLQlfb2JzdGFja19iZWdpbiwgX29ic3RhY2tfYmVnaW5fMSk6IERlY2xhcmUgdG8gcmV0dXJuIGludCwgbm90IHZvaWQuCi0JKG9ic3RhY2tfZmluaXNoKTogSWYgYWxsb2NfZmFpbGVkLCByZXR1cm4gTlVMTC4KLQkob2JzdGFja19iYXNlLCBvYnN0YWNrX25leHRfZnJlZSwgb2Jqc3RhY2tfb2JqZWN0X3NpemUpOgotCUlmIGFsbG9jX2ZhaWxlZCwgcmV0dXJuIDAuCi0JKG9ic3RhY2tfZ3Jvdywgb2JzdGFja19ncm93MCwgb2JzdGFja18xZ3Jvdywgb2JzdGFja19wdHJfZ3JvdywKLQlvYnN0YWNrX2ludF9ncm93LCBvYnN0YWNrX2JsYW5rKTogSWYgYWxsb2NfZmFpbGVkLCBkbyBub3RoaW5nIHRoYXQKLQljb3VsZCBjb3JydXB0IHRoZSBvYnN0YWNrLgotCi1Nb24gSmFuIDI0IDE1OjA2OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIG5hbWUsIHJlbG9jX25hbWUgYW5kCi0JYWRkZW5kIGFyZ21lbnRzIHRvIHJlbG9jX292ZXJmbG93IGNhbGxiYWNrLgotCi1GcmkgSmFuIDIxIDE5OjEzOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2JpZ19wb3dlcnBjLCBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjLAotCXByaW50X2luc25fcnM2MDAwKTogRGVjbGFyZS4KLQotVGh1IEphbiAgNiAxNDoxNTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IEFkZCBiaXRzaXplIGFyZ3VtZW50IHRvCi0JYWRkX3RvX3NldCBmaWVsZC4gIEFkZCBuZXcgY2FsbGJhY2sgbmFtZWQgY29uc3RydWN0b3IuCi0KLVRodSBEZWMgMzAgMTA6NDQ6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oOiBOZXcgZmlsZSBmb3IgbmV3IEJGRCBsaW5rZXIgYmFja2VuZCByb3V0aW5lcy4KLQotTW9uIE5vdiAyOSAxMDo0Mzo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAoZW51bSBkaXNfaW5zbl90eXVwZSk6IFJlbW92ZSBub24tQU5TSSB0cmFpbGluZyBjb21tYS4KLQotU2F0IE9jdCAgMiAyMDo0MjoyNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBNb3ZlIGNvbW1lbnQgdG8gcmlnaHQgcGxhY2UuCi0KLU1vbiBBdWcgIDkgMTk6MDM6MzUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmggKG9ic3RhY2tfY2h1bmtmdW4sIG9ic3RhY2tfZnJlZWZ1bik6IEFkZCBkZWZucyBmcm9tCi0JcHJldmlvdXMgdmVyc2lvbi4gIEFyZSB0aGVzZSBDeWdudXMgbG9jYWwgY2hhbmdlcz8KLQotRnJpIEF1ZyAgNiAxNzowNTo0NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oLCBvYnN0YWNrLmg6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCi0KLU1vbiBBdWcgIDIgMTY6Mzc6MTQgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi9pMzg2Lmg6ICBBZGQgTHlueCBtYWdpYyBudW1iZXIuCi0KLU1vbiBBdWcgIDIgMTQ6NDU6MjkgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogIE1vdmUgZW51bSBvdXRzaWRlIG9mIHN0cnVjdCBkZWZuIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1Nb24gQXVnICAyIDA4OjQ5OjMwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHdhaXQuaCAoV0VYSVRTVEFUVVMsIFdTVE9QU0lHKTogTWFzayBkb3duIHRvIDggYml0cy4gIFRoaXMgaXMKLQlmb3Igc3lzdGVtcyB0aGF0IHN0b3JlIHN0dWZmIGludG8gdGhlIGhpZ2ggMTYgYml0cyBvZiBhIHdhaXQKLQlzdGF0dXMuCi0KLUZyaSBKdWwgMzAgMTg6Mzg6MDIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogIEFkZCBuZXcgZmllbGRzIGluc25faW5mb192YWxpZCwgYnJhbmNoX2RlbGF5X2luc25zLAotCWRhdGFfc2l6ZSwgaW5zbl90eXBlLCB0YXJnZXQsIHRhcmdldDIuICBUaGVzZSBhcmUgdXNlZCB0byByZXR1cm4KLQlpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVycyBiYWNrIHRvIHRoZSBjYWxsaW5nCi0JcHJvZ3JhbS4gIEFkZCBjb21tZW50cywgbWFrZSBtb3JlIHJlYWRhYmxlLgotCi1Nb24gSnVsIDE5IDIyOjE0OjE0IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG06ICBOZXcgZGlyZWN0b3J5IGNvbnRhaW5pbmcgTkxNL05ldFdhcmUgaW5jbHVkZXMuCi0KLVRodSBKdWwgMTUgMTI6MTA6MDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKTogTmV3IGZpZWxkIGFwcGxpY2F0aW9uX2RhdGEuCi0KLVRodSBKdWwgMTUgMTI6NDE6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IEFkZGVkIGRlY2xhcmF0aW9uIG9mIHByaW50X2luc25fbTg4ay4KLQotVGh1IEp1bCAgOCAwOTowNToyNiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBvcGNvZGUvaDgzMDAuaDogTG90cyBvZiBsaXR0bGUgZml4ZXMgZm9yIHRoZSBoOC8zMDBoLgotCi1GcmkgSnVsICAyIDEwOjMxOjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogVXNlIEFOU0kgbWFjcm9zIGlmIF9fbWlwcyBhbmQgX1NZU1RZUEVfU1ZSNCBhcmUKLQlkZWZpbmVkLCBzaW5jZSBSSVNDL09TIGNjIGhhbmRsZXMgQU5TSSBkZWNsYXJhdGlvbnMgaW4gU1ZSNCBtb2RlCi0JYnV0IGRvZXMgbm90IGRlZmluZSBfX1NURENfXy4KLQotU3VuIEp1biAyMCAxODoyNzo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBEb24ndCBuZWVkIHRvIGluY2x1ZGUgYW5zaWRlY2wuaCBhbnkgbW9yZS4KLQotRnJpIEp1biAxOCAwMzoyMjoxMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2FzeXMuaDogIEVsaW1pbmF0ZSAiaW50OF90eXBlIiwgImludDE2X3R5cGUiLCAiaW50MzJfdHlwZSIsIGFuZAotCXRoZWlyIHZhcmlhbnRzLiAgVGhlc2UgY2hhbmdlcyBhcmUgY29vcmRpbmF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nCi0JY2hhbmdlcyBpbiAuLi9iZmQvb2FzeXMuYy4KLQotV2VkIEp1biAxNiAxMDo0MzowOCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBOb3RlIHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZC4KLQotVHVlIEp1biAgOCAxMjoxNjowMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JIFN1cHBvcnQgZm9yIEg4LzMwMC1ICi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faDgzMDAsIHByaW50X2luc25faDgzMDBoKTogRGVjbGFyZSBpdC4KLQkqIGNvZmYvaDgzMDAuaDogTmV3IG1hZ2ljIG51bWJlci4KLQkqIGNvZmYvaW50ZXJuYWwuaDogTmV3IHJlbG9jYXRpb25zLgotCSogb3Bjb2RlL2g4MzAwLmg6IExvdHMgb2YgbmV3IG9wY29kZXMuCi0KLVR1ZSBKdW4gIDEgMDc6MzU6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmggKGNvbnN0KTogRG9uJ3QgZGVmaW5lIGl0IGlmIGl0J3MgYWxyZWFkeSBkZWZpbmVkLgotCi1UaHUgTWF5IDI3IDE4OjE5OjUxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2hwcGEpOiBEZWNsYXJlIGl0LgotCi0JKiBiZmQuaDogTW92ZWQgdG8gYmZkIGRpcmVjdG9yeS4gIFNtYWxsIHN0dWIgaGVyZSBpbmNsdWRlcyBpdAotCXdpdGhvdXQgcmVxdWlyaW5nICItSS4uL2JmZCIuCi0KLVRodSBBcHIgMjkgMTI6MDY6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIHdpdGggQlNGX0ZVTkNUSU9OLgotCi1Nb24gQXByIDI2IDE4OjE1OjUwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaCwgZGlzLWFzbS5oOiBVcGRhdGVkIHdpdGggSGl0YWNoaSBTSC4KLQotRnJpIEFwciAyMyAxODo0MTozOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgd2l0aCBhbHBoYSBjaGFuZ2VzLgotCSogZGlzLWFzbS5oOiBBZGRlZCBhbHBoYS4KLQotRnJpIEFwciAxNiAxNzozNTozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3Igc2lnbmVkIGJmZF8qZ2V0XyouCi0KLVRodSBBcHIgMTUgMDk6MjQ6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIGZvciBmaWxlX3RydW5jYXRlZCBlcnJvci4KLQotVGh1IEFwciAgOCAxMDo1Mzo0NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6IElmIG5vIEFOU0ksIGRlZmluZSBjb25zdCB0byBiZSBlbXB0eS4KLQotVGh1IEFwciAgMSAwOTowMDoxMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBEZWNsYXJlIGEyOWsgYW5kIGk5NjAgcHJpbnRfaW5zbl8qLgotCi0JKiBkaXMtYXNtLmg6IEFkZCBwcmludF9hZGRyZXNzX2Z1bmMgYW5kIHJlbGF0ZWQgc3R1ZmYuCi0KLQkqIGRpcy1hc20uaCAoZGlzX2FzbV9yZWFkX21lbW9yeSk6IEZpeCBwcm90b3R5cGUuCi0KLVdlZCBNYXIgMzEgMTc6NDA6MTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogQWRkIHByaW50X2luc25fc3BhcmMuCi0KLVdlZCBNYXIgMzEgMTc6NTE6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCBmb3IgQkZEX1JFTE9DX01JUFNfR1BSRUwgYW5kIGJmZF9bZ3NdZXRfZ3Bfc2l6ZQotCXByb3RvdHlwZXMuCi0KLVdlZCBNYXIgMzEgMTY6MzU6MTIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiAoZGlzYXNzZW1ibGVfaW5mbyk6ICBGaXggdHlwbyBpbiBwcm90b3R5cGUgb2YKLQlkaXNfYXNtX21lbW9yeV9lcnJvcigpLgotCi1UdWUgTWFyIDMwIDE5OjA5OjIzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKGRpc2Fzc2VtYmxlcl9pbmZvKTogQWRkIHJlYWRfbWVtb3J5X2Z1bmMsCi0JbWVtb3J5X2Vycm9yX2Z1bmMsIGJ1ZmZlciwgYW5kIGxlbmd0aC4KLQkoe0dEQl8sfUlOSVRfRElTQVNTRU1CTEVfSU5GTyk6IFNldCB0aGVtLgotCXByaW50X2luc25fKjogUmVtb3ZlIHNlY29uZCBhcmd1bWVudC4KLQotVHVlIE1hciAzMCAxNDo0ODo1NSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3IgbG1hIGZpZWxkIG9mIHNlY3Rpb24uCi0KLVR1ZSBNYXIgMzAgMTI6MjI6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6IFVzZSBBTlNJIHZlcnNpb25zIG9uIEFJWCByZWdhcmRsZXNzIG9mIF9fU1REQ19fLgotCi1GcmkgTWFyIDE5IDE0OjQ5OjQ5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IEFkZCBoODUwMC4KLQotVGh1IE1hciAxOCAxMzo0OTowOSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGllZWUtZmxvYXQuaDogIE1vdmVkIGZyb20gLi4vZ2RiLgotCSogZGlzLWFzbS5oOiAgTmV3IGZpbGUuICBJbnRlcmZhY2UgdG8gZGlzLWFzc2VtYmxlci4KLQotVGh1IE1hciAxMSAxMDo1Mjo1NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaCAoRE1HTF9OT19PUFRTKTogIEFkZCBkZWZpbmUgKHNldCB0byAwKSB0byB1c2UKLQlpbiBwbGFjZSBvZiBiYXJlIDAsIGZvciByZWFkYWJpbGl0eSByZWFzb25zLgotCi1UdWUgTWFyICAyIDE3OjUwOjExIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oOiAgUmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byBjZnJvbnQgd2l0aCBBUk0uCi0KLVR1ZSBGZWIgMjMgMTI6MjE6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBuZXcgZWxlbWVudHMgaW4gSlVNUF9UQUJMRS4KLQotVHVlIEZlYiAxNiAwMDo1MTozMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgZm9yIEJGRF9WRVJTSU9OIDIuMS4KLQotVHVlIEphbiAyNiAxMTo0OToyMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIFNFQ19JU19DT01NT04gZmxhZy4KLQotVHVlIEphbiAxOSAxMjoyNToxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIGJmZF9hc3ltYm9sX3ZhbHVlIGJ1ZyBmaXguCi0KLUZyaSBKYW4gIDggMTY6Mzc6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIHRvIGluY2x1ZGUgRUNPRkYgdGRhdGEgYW5kIHRhcmdldF9mbGF2b3VyLgotCi1TdW4gRGVjIDI3IDE3OjUyOjMwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIEFkZCBkZWNsYXJhdGlvbiBmb3IgYmZkX2dldF9zaXplKCkuCi0KLVR1ZSBEZWMgMjIgMjI6NDI6NDYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmg6ICBQcm90ZWN0IGZpbGUgZnJvbSBtdWx0aXBsZSBpbmNsdXNpb25zIHdpdGgKLQkjaWYgIWRlZmluZWQoREVNQU5HTEVfSCkuLi4jZGVmaW5lIERFTUFOR0xFX0guLi4jZW5kaWYuCi0KLU1vbiBEZWMgMjEgMjE6MjU6NTAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgdG8gZ2V0IGhwcGFfY29yZV9zdHJ1Y3QgZnJvbSBiZmQuYy4KLQotVGh1IERlYyAxNyAwMDo0MjozNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgdG8gZ2V0IHRla2hleCB0ZGF0YSBuYW1lIGNoYW5nZSBmcm9tIGJmZC4KLQotTW9uIE5vdiAgOSAyMzo1NTo0MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogIFVwZGF0ZSBjb21tZW50cyB0byBkaXNjb3VyYWdlIHVzZSBvZiBFWEZVTi4KLQotVGh1IE5vdiAgNSAxNjozNTo0NCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgdG8gYnJpbmcgaW4gU0VDX1NIQVJFRF9MSUJSQVJZLgotCi1UaHUgTm92ICA1IDAzOjIxOjMyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSB0byBtYXRjaCBFWEZVTiwgYmZkX3NlY2xldF9zdHJ1Y3QsIGFuZCBTREVGCi0JY2xlYW51cHMgaW4gYmZkLgotCi1XZWQgTm92ICA0IDA3OjI4OjA1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBib3V0LmggKE5fQ0FMTE5BTUUsIE5fQkFMTkFNRSk6IERlZmluZSBhcyBjaGFyLXR5cGUgdmFsdWVzLCBzbwotCXdpZGVuaW5nIHdvcmtzIGNvbnNpc3RlbnRseS4KLQotRnJpIE9jdCAxNiAwMzoxNzowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0Lmg6ICBVcGRhdGUgdG8gUmV2aXNlZCBTdGFuZGFyZCBGU0YgVmVyc2lvbi4KLQotVGh1IE9jdCAxNSAyMTo0MzoyMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oIChzdHJ1Y3Qgb3B0aW9uKTogdXNlIHRoZSBwcm92aWRlZCBlbnVtIGZvciBoYXNfYXJnLgotCi0JKiBkZW1hbmdsZS5oIChBVVRPX0RFTUFOR0xJTkcsIEdOVV9ERU1BTkdMSU5HLAotCSAgTFVDSURfREVNQU5HTElORyk6IHVsdHJpeCBjb21waWxlcnMgcmVxdWlyZSBlbnVtcyB0byBiZQotCSAgZW51bXMgYW5kIGludHMgdG8gYmUgaW50cyBhbmQgY2FzdHMgd2hlcmUgdGhleSBtZWV0LiAgY2FzdCBzb21lCi0JICBlbnVtcyBpbnRvIGludHMuCi0KLVRodSBPY3QgMTUgMDQ6MzU6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIGFmdGVyIGNvbW1lbnQgY2hhbmdlcy4KLQotVGh1IE9jdCAgOCAwOTowMzowMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmggKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcik6IG5ldyBtYWNybyBmb3IgZ2V0dGluZyBpbiB4dmVjCi0KLVRodSBTZXAgIDMgMDk6MTA6NTAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmggKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiAgc2l6ZSBuZWVkcyB0byBiZSBzaWduZWQgaWYKLQlpdCdzIGdvaW5nIHRvIGhvbGQgbmVnYXRpdmUgdmFsdWVzLgotCi1TdW4gQXVnIDMwIDE3OjUwOjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaDogIE5ldyBmaWxlLCBtb3ZlZCBmcm9tIC4uL2dkYi4gIE1hZGUgaW5kZXBlbmRlbnQKLQlvZiBnZGIuICBBbGxvdyBkZW1hbmdsaW5nIHN0eWxlIG9wdGlvbiB0byBiZSBwYXNzZWQgYXMgYQotCXBhcmFtZXRlciB0byBjcGx1c19kZW1hbmdsZSgpLCBidXQgdXNpbmcgdGhlCi0JY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlIGdsb2JhbCBhcyB0aGUgZGVmYXVsdC4KLQotU2F0IEF1ZyAyOSAxMDowNzo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiAgTWVyZ2UgY29tbWVudCBjaGFuZ2UgZnJvbSBjdXJyZW50IEZTRiB2ZXJzaW9uLgotCi1UaHUgQXVnIDI3IDEyOjU5OjI5IDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBhZGQgd2UzMmsKLQotVHVlIEF1ZyAyNSAxNTowNzo0NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IG5ldyBhZnRlciBaODAwMCBzdHVmZgotCi1Nb24gQXVnIDE3IDA5OjAxOjIzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogUmVnZW5lcmF0ZWQgYWZ0ZXIgcGFnZS9zZWdtZW50IHNpemUgY2hhbmdlcy4KLQotU2F0IEF1ZyAgMSAxMzo0NjozMSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiBNZXJnZSBjaGFuZ2VzIGZyb20gY3VycmVudCBGU0YgdmVyc2lvbi4KLQotTW9uIEp1bCAyMCAyMTowNjoyMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oIChhcmVhX2lkLCBmbGFncyk6ICBSZW1vdmUsIHJlcGxhY2Ugd2l0aCBleHRyYV9hcmcsCi0JdXNlX2V4dHJhX2FyZywgYW5kIG1heWJlX2VtcHR5X29iamVjdC4KLQkqIG9ic3RhY2suaCAoT0JTVEFDS19NQVlCRV9FTVBUWV9PQkpFQ1QsIE9CU1RBQ0tfTU1BTExPQ19MSUtFKToKLQlSZW1vdmUsIHJlcGxhY2VkIGJ5IG1heWJlX2VtcHR5X29iamVjdCBhbmQgdXNlX2V4dHJhX2FyZyBiaXRmaWVsZHMuCi0JKiBvYnN0YWNrLmggKG9ic3RhY2tfZnVsbF9iZWdpbiwgX29ic3RhY2tfYmVnaW4pOiAgUmVtb3ZlIGFyZWFfaWQKLQlhbmQgZmxhZ3MgYXJndW1lbnRzLgotCSogb2JzdGFjay5oIChvYnN0YWNrX2FsbG9jX2FyZyk6ICBOZXcgbWFjcm8gdG8gc2V0IGV4dHJhX2FyZy4KLQotVGh1IEp1bCAxNiAwODoxMjo0NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IG5ldyBhZnRlciBhZGRpbmcgQkZEX0lTX1JFTEFYQUJMRQotCi1TYXQgSnVsICA0IDAzOjIyOjIzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFJlZ2VuIGFmdGVyIGFkZGluZyBCU0ZfRklMRS4KLQotTW9uIEp1biAyOSAxNDoxODozNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgc3VuZmlzaCkKLQotCSogb2JzdGFjay5oOiAgQ29udmVydCBiY29weSgpIHVzZSB0byBtZW1jcHkoKSwgd2hpY2ggaXMgbW9yZQotCXBvcnRhYmxlLCBtb3JlIHN0YW5kYXJkLCBhbmQgY2FuIHRha2UgYWR2YW50YWdlIG9mIGdjYydzIGJ1aWx0aW4KLQlmdW5jdGlvbnMgZm9yIGluY3JlYXNlZCBwZXJmb3JtYW5jZS4KLQotVGh1IEp1biAyNSAwNDo0NjowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaCAoUEFSQU1TKTogIEluY29ycG9yYXRlIHRoaXMgbWFjcm8gZnJvbSBnZGIncyBkZWZzLmguCi0JSXQncyBhIGNsZWFuZXIgd2F5IHRvIGZvcndhcmQtZGVjbGFyZSBmdW5jdGlvbiBwcm90b3R5cGVzLgotCi1GcmkgSnVuIDE5IDE1OjQ2OjMyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgSFBQQSBtZXJnZS4KLQotVHVlIEp1biAxNiAyMTozMDo1NiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0Lmg6IGdyYXR1aXRvdXMgd2hpdGUgc3BhY2UgY2hhbmdlcyBtZXJnZWQgZnJvbSBvdGhlciBwcmVwCi0JICByZWxlYXNlcy4KLQotVGh1IEp1biAxMSAwMToxMDo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBSZWdlbidkIGZyb20gYmZkLmMgYWZ0ZXIgcmVtb3ZpbmcgZWxmX2NvcmVfdGRhdGFfc3RydWN0LgotCi1Nb24gTWF5IDE4IDE3OjI5OjAzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaDogbWVyZ2VkIGNoYW5nZXMgZnJvbSBtYWtlLTMuNjIuMTEuCi0KLQkqIGdldG9wdC5oOiBtZXJnZWQgY2hhbmdlcyBmcm9tIGdyZXAtMS42IChhbHBoYSkuCi0KLUZyaSBNYXkgIDggMTQ6NTM6MzIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oOiBtZXJnZWQgY2hhbmdlcyBmcm9tIGJpc29uLTEuMTguCi0KLVNhdCBNYXIgMTQgMTc6MjU6MjAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogIEFkZCAiYXJlYV9pZCIgYW5kICJmbGFncyIgbWVtYmVycyB0byBvYnN0YWNrCi0Jc3RydWN0dXJlLiAgQWRkIG9ic3RhY2tfY2h1bmtmdW4oKSBhbmQgb2JzdGFja19mcmVlZnVuKCkgdG8KLQlzZXQgZnVuY3Rpb25zIGV4cGxpY2l0bHkuICBDb252ZXJ0IG1heWJlX2VtcHR5X29iamVjdCB0bwotCWEgYml0IGluICJmbGFncyIuCi0KLVRodSBGZWIgMjcgMjI6MDE6MDIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHdhaXQuaCAoV0lGU1RPUFBFRCk6ICBBZGQgSUJNIHJzNjAwMC1zcGVjaWZpYyB2ZXJzaW9uLgotCi1GcmkgRmViIDIxIDIwOjQ5OjIwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6ICBBZGQgb2JzdGFja19mdWxsX2JlZ2luLgotCSogYmZkLmgsIG9ic3RhY2suaDogIFByb3RvbGludC4KLQotVGh1IEphbiAzMCAwMToxODo0MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBSZW1vdmUgY29tbWEgZnJvbSBlbnVtIGRlY2xhcmF0aW9uLgotCi1Nb24gSmFuIDI3IDIyOjAxOjEzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oIDogbmV3IHRhcmdldCBlbnRyLCBiZmRfcmVsYXhfc2VjdGlvbgotCi1XZWQgRGVjIDE4IDE3OjE5OjQ0IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oLCBpZWVlLmgsIG9wY29kZS9tNjhrLmgsIG9wY29kZS9zcGFyYy5oOiAgQU5TSWZ5IGVudW1zLgotCi1UaHUgRGVjIDEyIDIwOjU5OjU2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBmb3Blbi1zYW1lLmgsIGZvcGVuLWJpbi5oOiAgTmV3IGZpbGVzIGZvciBjb25maWd1cmluZwotCXdoZXRoZXIgZm9wZW4gZGlzdGluZ3Vpc2hlcyBiaW5hcnkgZmlsZXMgb3Igbm90LiAgRm9yIHVzZQotCWJ5IGhvc3QtZGVwZW5kZW50IGNvbmZpZyBmaWxlcy4KLQotU2F0IE5vdiAzMCAyMDo0Njo0MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IGNoYW5nZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3JtYXQuCi0KLQkqIGNyZWF0ZWQgY29mZiwgZWxmIGFuZCBvcGNvZGUgYW5kIGFvdXQgZGlyZWN0b3JpZXMuIE1vdmVkOgotCi0JYW91dDY0LmgJPT0+IGFvdXQvYW91dDY0LmgKLQlhci5oCQk9PT4gYW91dC9hci5oCi0JYS5vdXQuZW5jYXAuaAk9PT4gYW91dC9lbmNhcC5oCi0JYS5vdXQuaG9zdC5oCT09PiBhb3V0L2hvc3QuaAotCWEub3V0LmhwLmgJPT0+IGFvdXQvaHAuaAotCWEub3V0LnN1bjQuaAk9PT4gYW91dC9zdW40LmgKLQlyYW5saWIuaAk9PT4gYW91dC9yYW5saWIuaAotCXJlbG9jLmgJCT09PiBhb3V0L3JlbG9jLmgKLQlzdGFiLmRlZgk9PT4gYW91dC9zdGFiLmRlZgotCXN0YWIuZ251LmgJPT0+IGFvdXQvc3RhYl9nbnUuaAotCi0JY29mZi1hMjlrLmgJPT0+IGNvZmYvYTI5ay5oCi0JY29mZi1oODMwMC5oCT09PiBjb2ZmL2g4MzAwLmgKLQljb2ZmLWkzODYuaAk9PT4gY29mZi9pMzg2LmgKLQljb2ZmLWk5NjAuaAk9PT4gY29mZi9pOTYwLmgKLQlpbnRlcm5hbGNvZmYuaAk9PT4gY29mZi9pbnRlcm5hbC5oCi0JY29mZi1tNjhrLmgJPT0+IGNvZmYvbTY4ay5oCi0JY29mZi1tODhrLmgJPT0+IGNvZmYvbTg4ay5oCi0JY29mZi1taXBzLmgJPT0+IGNvZmYvbWlwcy5oCi0JY29mZi1yczYwMDAuaAk9PT4gY29mZi9yczYwMDAuaAotCi0JZWxmLWNvbW1vbi5oCT09PiBlbGYvY29tbW9uLmgKLQlkd2FyZi5oCQk9PT4gZWxmL2R3YXJmLmgKLQllbGYtZXh0ZXJuYWwuaAk9PT4gZWxmL2V4dGVybmFsLmgKLQllbGYtaW50ZXJuYWwuaCAgPT0+IGVsZi9pbnRlcm5hbC5oCi0KLQlhMjlrLW9wY29kZS5oCT09PiBvcGNvZGUvYTI5ay5oCi0JYXJtLW9wY29kZS5oCT09PiBvcGNvZGUvYXJtLmgKLQloODMwMC1vcGNvZGUuaAk9PT4gb3Bjb2RlL2g4MzAwLmgKLQlpMzg2LW9wY29kZS5oCT09PiBvcGNvZGUvaTM4Ni5oCi0JaTg2MC1vcGNvZGUuaAk9PT4gb3Bjb2RlL2k4NjAuaAotCWk5NjAtb3Bjb2RlLmgJPT0+IG9wY29kZS9pOTYwLmgKLQltNjhrLW9wY29kZS5oCT09PiBvcGNvZGUvbTY4ay5oCi0JbTg4ay1vcGNvZGUuaAk9PT4gb3Bjb2RlL204OGsuaAotCW1pcHMtb3Bjb2RlLmgJPT0+IG9wY29kZS9taXBzLmgKLQlucDEtb3Bjb2RlLmgJPT0+IG9wY29kZS9ucDEuaAotCW5zMzJrLW9wY29kZS5oCT09PiBvcGNvZGUvbnMzMmsuaAotCXBuLW9wY29kZS5oCT09PiBvcGNvZGUvcG4uaAotCXB5ci1vcGNvZGUuaAk9PT4gb3Bjb2RlL3B5ci5oCi0Jc3BhcmMtb3Bjb2RlLmgJPT0+IG9wY29kZS9zcGFyYy5oCi0JdGFob2Utb3Bjb2RlLmgJPT0+IG9wY29kZS90YWhvZS5oCi0JdmF4LW9wY29kZS5oCT09PiBvcGNvZGUvdmF4LmgKLQotCi0KLVdlZCBOb3YgMjcgMTA6Mzg6MzEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsY29mZi5oOiAoaW50ZXJuYWxfc2NuaGRyKSB0b29rIG91dCAjZGVmIGRlcGVuZGVuY3ksIG5vdwotCXNfbnJlbG9jIGFuZCBzX25sbm5vIGFyZSBhbHdheXMgbG9uZy4gCShpbnRlcm5hbF9yZWxvYyk6IGFsbHdheXMKLQloYXMgYW4gb2Zmc2V0IGZpZWxkIG5vdy4KLQotRnJpIE5vdiAyMiAwODoxMjo1OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuaDogIExpbnQ7IHVzZSB1bnNpZ25lZCBjaGFycyBmb3IgZXh0ZXJuYWwgZmllbGRzLgotCSogaW50ZXJuYWxjb2ZmLmg6ICBMaW50OyBjYXN0IHN0b3JhZ2UgY2xhc3NlcyB0byBzaWduZWQgY2hhci4KLQotVGh1IE5vdiAyMSAyMTowMTowNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6IFJlbW92ZSB0aGUgR05VIGV4dGVuZGVkIHR5cGUgY29kZXMgKGUuZy4gTl9TRVRUKS4KLQkqIGFvdXQ2NC5oOiAgVGhlIGhldXJpc3RpYyBmb3IgZGlzdGluZ3Vpc2hpbmcgYmV0d2VlbgotCXN1bm9zLXN0eWxlIGFuZCBic2Qtc3R5bGUgWk1BR0lDIGZpbGVzICh3cnQuIHdoZXJlIHRoZQotCXRleHQgc2VnbWVudCBzdGFydHMpIGlzIG1vdmVkIGludG8gKHRoZSBkZWZhdWx0IGRlZmluaXRpb24gb2YpCi0JdGhlIG1hY3JvIE5fSEVBREVSX0lOX1RFWFQuICBUaGlzIGRlZmluaXRpb24gaXMgb25seSB1c2VkCi0JaWYgbm8gb3RoZXIgZGVmaW5pdGlvbiBpcyB1c2VkIC0gZS5nLiBiZmQvbmV3c29zMy5jIGRlZmluZXMKLQlOX0hFQURFUl9JTl9URVhUKHgpIHRvIGJlIGFsd2F5cyAwIChhcyBiZWZvcmUpLgotCi1UaHUgTm92IDIxIDExOjUzOjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9UWFRBRERSLCBOX1RYVE9GRiwgTl9UWFRTSVpFKTogIE5ldyBkZWZpbml0aW9ucwotCXRoYXQgc2hvdWxkIGhhbmRsZSBhbGwgdXNlcy4gIExPR0lDQUxfIHZlcnNpb25zIGRlbGV0ZWQuCi0JRWxpbWluYXRlIE5fSEVBREVSX0lOX1RFWFQsIHVzaW5nIGFfZW50cnkgdG8gZGV0ZXJtaW5lIHdoaWNoCi0Ja2luZCBvZiB6bWFnaWMgYS5vdXQgZmlsZSB3ZSBhcmUgbG9va2luZyBhdC4KLQkqIGNvZmYtcnM2MDAwLmg6ICBUeXBvLgotCi1UdWUgTm92IDE5IDE4OjQzOjM3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKE5vdGU6ICBUaGlzIGlzIGEgcmV2aXNlZCBlbnRyeSwgYXMgd2FzIGFvdXQ2NC5oLikKLQkqIGFvdXQ2NC5oOiAgU29tZSBjbGVhbnVwcyBvZiBOX1RYVEFERFIgYW5kIE5fVFhUT0ZGOgotCVdpbGwgbm93IHdvcmsgZm9yIGJvdGggb2xkLSBhbmQgbmV3LXN0eWxlIFpNQUdJQyBmaWxlcywKLQlkZXBlbmRpbmcgb24gTl9IRUFERVJfSU5fVEVYVCBtYWNyby4KLQlBZGQgTE9HSUNBTF9UWFRBRERSLCBMT0lDQUxfVFhUT0ZGIGFuZCBMT0dJQ0FMX1RYVFNJWkUKLQl0aGF0IGRvbid0IGNvdW50IHRoZSBleGVjIGhlYWRlciBhcyBwYXJ0Ci0Jb2YgdGhlIHRleHQgc2VnbWVudCwgdG8gYmUgY29uc2lzdGVudCB3aXRoIGJmZC4KLQkqIGEub3V0LnN1bjQuaDogIFNpbXBsaWZpZWQvZml4ZWQgZm9yIHByZXZpb3VzIGNoYW5nZS4KLQotTW9uIE5vdiAxOCAwMDowMjowNiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaDogIFVwZGF0ZSB0byBEV0FSRiBkcmFmdCA1IHZlcnNpb24gZnJvbSBnY2MyLgotCi1UaHUgTm92IDE0IDE5OjQ0OjU5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZjogIEFkZGVkIGRlZnMgZm9yIGV4dGVuZGVkIEdOVSBzeW1ib2wgdHlwZXMsCi0Jc3VjaCBhcyBOX1NFVFQuICBUaGVzZSBhcmUgbm9ybWFsbHkgaWZkZWYnZCBvdXQgKGJlY2F1c2UKLQlvZiBjb25mbGljdHMgd2l0aCBhLm91dC5nbnUuaCksIGJ1dCBhcmUgdXNlZCBieSBiZmJfc3RhYl9uYW1lKCkuCi0KLVRodSBOb3YgMTQgMTk6MTc6MDMgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi1jb21tb24uaDogIEFkZCBkZWZpbmVzIHRvIHN1cHBvcnQgRUxGIHN5bWJvbCB0YWJsZSBjb2RlLgotCi1Nb24gTm92IDExIDE5OjAxOjA2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYtaW50ZXJuYWwuaCwgZWxmLWV4dGVybmFsLmgsIGVsZi1jb21tb24uaDogIEFkZCBzdXBwb3J0IGZvcgotCW5vdGUgc2VjdGlvbnMsIHdoaWNoIGFyZSB1c2VkIGluIEVMRiBjb3JlIGZpbGVzIHRvIGhvbGQgY29waWVzCi0Jb2YgdmFyaW91cyAvcHJvYyBzdHJ1Y3R1cmVzLgotCi1UaHUgTm92ICA3IDA4OjU4OjI2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsY29mZi5oOiB0b29rIG91dCB0aGUgTTg4IGRlcGVuZGVuY3kgaW4gdGhlIGxpbmVubwotCXN0cnVjdC4KLQkqIGNvZmYtbTg4ay5oOiBkZWZpbmVzIEdFVF9MSU5FTk9fTE5OTyBhbmQgUFVUX0xJTkVOT19MTk5PIHRvIHVzZQotCTMyYml0IGxpbm5vIGVudHJpZXMuCi0JKiBhMjlrLW9wY29kZS5oOiBmaXhlZCBlbmNvZGluZyBvZiBtdGFjYwotCi1TdW4gTm92ICAzIDExOjU0OjIyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCBmcm9tIC4uL2JmZC9iZmQtaW4uaCAocS52KS4KLQotRnJpIE5vdiAgMSAxMToxMzo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWxjb2ZmLmg6ICBBZGQgeF9jc2VjdCBkZWZpbmVzLgotCi1GcmkgT2N0IDI1IDAzOjE4OjIwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBSZW5hbWUgQ09GRi1yZWxhdGVkIGZpbGVzIGluIGBjb2ZmLUFSQ0guaCcgZm9ybS4KLQljb2ZmLWEyOWsuaCwgY29mZi1pMzg2LmgsIGNvZmYtaTk2MC5oLCBjb2ZmLW02OGsuaCwgY29mZi1tODhrLmgsCi0JY29mZi1taXBzLmgsIGNvZmYtcnM2MDAwLmggdG8gYmUgZXhhY3QuCi0KLVRodSBPY3QgMjQgMjI6MTE6MTEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSUy82MDAwIHN1cHBvcnQsIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaPv0bmctVGjlbyBW9SwgYW5kCi0JSm9obiBHaWxtb3JlLgotCi0JKiBhLm91dC5nbnUuaDogIFVwZGF0ZSBzbGlnaHRseS4KLQkqIGJmZC5oOiAgQWRkIG5ldyBlcnJvciBjb2RlLCBmaXggZG9jLCBhZGQgYmZkX2FyY2hfcnM2MDAwLgotCSogaW50ZXJuYWxjb2ZmLmg6ICBBZGQgbW9yZSBGXyBjb2RlcyBmb3IgZmlsZWhkci4gIEFkZAotCXJzLzYwMDAtZGVwZW5kZW50IGZpZWxkcyB0byBhb3V0aGRyLiAgQWRkIHN0b3JhZ2UgY2xhc3NlcwotCXRvIHN5bWVudHMuICBBZGQgNjAwMC1zcGVjaWZpYyBhdXhlbnQuICBBZGQgcl9zaXplIGluIHJlbG9jLgotCSogcnM2MDAwY29mZi5jOiAgTmV3IGZpbGUuCi0KLVRodSBPY3QgMjQgMDQ6MTM6MjAgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmg6IE5ldyBmaWxlIGZvciBkd2FyZiBzdXBwb3J0LiAgQ29waWVkIGZyb20gZ2NjMgotCWRpc3RyaWJ1dGlvbi4KLQotV2VkIE9jdCAxNiAxMzozMTo0NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dDY0Lmg6ICBSZW1vdmUgUEFHRV9TSVpFIGRlZmluZXM7IHRoZXkgYXJlIHRhcmdldC1kZXBlbmRlbnQuCi0JQWRkIE5fRk5fU0VRIGZvciBOX0ZOIHN5bWJvbCB0eXBlIHVzZWQgb24gU2VxdWVudCBtYWNoaW5lcy4KLQkqIHN0YWIuZGVmOiAgSW5jbHVkZSBOX0ZOX1NFUSBpbiB0YWJsZS4KLQkqIGJvdXQuaDogIEV4dGVybmFsIGZvcm1hdHMgb2Ygc3RydWN0dXJlcyB1c2UgdW5zaWduZWQgY2hhcnMuCi0KLUZyaSBPY3QgMTEgMTI6NDA6NDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDp1cGdyYWRlIGZyb20gYmZkLmMKLQkqIGludGVybmFsY29mZi5oOiBhZGQgbl9uYW1lLCBuX3plcm9lcyBhbmQgbl9vZmZzZXQgbWFjcm9zCi0JKiBhbWRjb2ZmLmg6IERlZmluZSBPTUFHSUMgYW5kIEFPVVRIRFJTWi4KLQotRnJpIE9jdCAxMSAxMDo1ODowNiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuaG9zdC5oOiBDaGFuZ2UgU0VHTUVOVF9TSVpFIHRvIDB4MTAwMCBmb3IgU29ueS4KLQkqIGJmZC5oIChhbGlnbl9wb3dlcik6IEFkZCAoYWN0dWFsbHkgbW92ZSkgY29tbWVudC4KLQotVHVlIE9jdCAgOCAxNToyOTozMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzL2gtcnRic2QuaDogRGVmaW5lIE1JU1NJTkdfVkZQUklOVCAoZm9yIGJpbnV0aWxzL2J1Y29tbS5jKS4KLQotU3VuIE9jdCAgNiAxOToyNDozOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dDY0Lmg6ICBNb3ZlIHN0cnVjdCBpbnRlcm5hbF9leGVjIHRvIC4uL2JmZC9saWJhb3V0Lmggc28KLQlpdCBjYW4gYmUgc2hhcmVkIGJ5IGFsbCBgYS5vdXQtZmFtaWx5JyBjb2RlLiAgUmVuYW1lCi0JRVhURVJOQUxfTElTVF9TSVpFIHRvIEVYVEVSTkFMX05MSVNUX1NJWkUuICBVc2UgYmFzaWMgdHlwZXMKLQlmb3Igbmxpc3QgbWVtYmVycywgYW5kIG1ha2Ugc3RyeCBpbnRlZ3JhbCByYXRoZXIgdGhhbiBwb2ludGVyLgotCU1vcmUgY29tbWVudGFyeSBvbiBuX3R5cGUgdmFsdWVzLgotCSogYm91dC5oOiAgUHJvdmlkZSBhIHN0cnVjdCBleHRlcm5hbF9leGVjIHJhdGhlciB0aGFuIGFuCi0JaW50ZXJuYWxfZXhlYy4KLQkqIG02OGtjb2ZmLmg6ICBSZW1vdmUgYHRhZ2VudHJpZXMnIHdoaWNoIHNudWNrIGluIGZyb20gdGhlIGk5NjAKLQlDT0ZGIHBvcnQuCi0KLUZyaSBPY3QgIDQgMDE6MjU6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLW9wY29kZS5oOiAgUmVtb3ZlIGBfZW51bScgZnJvbSB0aGUgdHlwZWRlZiBmb3IgYW4gZW51bS4KLQkqIGJmZC5oOiAgVXBkYXRlIHRvIG1hdGNoIGJmZCBjaGFuZ2VzLgotCi0JKiBzeXMvaC1pMzg2bWFjaC5oLCBzeXNkZXAuaDogIEFkZCAzODYgTWFjaCBob3N0IHN1cHBvcnQuCi0KLVR1ZSBPY3QgIDEgMDQ6NTg6NDIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oLCBlbGYtY29tbW9uLmgsIGVsZi1leHRlcm5hbC5oLCBlbGYtaW50ZXJuYWwuaDoKLQlBZGQgcHJlbGltaW5hcnkgRUxGIHN1cHBvcnQsIHN1ZmZpY2llbnQgZm9yIEdEQiwgZnJvbSBGcmVkIEZpc2guCi0JKiBzeXNkZXAuaCwgc3lzL2gtYW1peC5oOiAgU3VwcG9ydCBBbWlnYSBTVlI0LgotCi0JKiBzeXMvaC12YXh1bHQuaDogIE1ha2UgaXQgd29yay4gIChEYXZpZCBUYXlsb3IgPHRheWxvckB0aGluay5jb20+KQotCSogYS5vdXQudmF4Lmg6ICBSZW1vdmUgdW51c2VkIGFuZCBjb25mdXNpbmcgZmlsZS4KLQotTW9uIFNlcCAzMCAxMjo1MjozNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLmg6IERlZmluZSBORVdTT1MzX1NZUywgYW5kIHVzZSBpdC4KLQotRnJpIFNlcCAyMCAxMzozODoyMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuZ251LmggKE5fRk4pOiAgSXRzIHZhbHVlICpyZWFsbHkgaXMqIDB4MUYuCi0JRml4IGl0LCBhbmQgYWRkIGNvbW1lbnRzIHdhcm5pbmcgYWJvdXQgb3ItaW5nIE5fRVhUIHdpdGggaXQKLQlhbmQvb3IgTl9XQVJOSU5HLgotCSogYW91dDY0LmggKE5fRk4pOiAgRml4IHZhbHVlLCBhZGQgY29tbWVudHMgYWJvdXQgTl9FWFQuCi0JKiBzdGFiLmRlZiAodGFibGUgYXQgZW5kKTogIFVwZGF0ZSB0byBzaG93IGFsbCB0aGUgdHlwZQotCXZhbHVlcyA8MHgyMCwgaW5jbHVkaW5nIGxvdyBvcmRlciBiaXRzLiAgTW92ZSBOX0ZOIHRvCi0JaXRzIHJpZ2h0ZnVsIHBsYWNlLgotCi1UdWUgU2VwIDE3IDE3OjQxOjM3IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5cy9oLWlyaXgzLmg6ICBzZ2kvaXJpeCBzdXBwb3J0LgotCi1UdWUgU2VwIDE3IDA3OjUyOjU5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWYgKE5fREVGRCk6ICBBZGQgR05VIE1vZHVsYS0yIGRlYnVnIHN0YWIsIGZyb20gQW5kcmV3Ci0JQmVlcnMuCi0KLVRodSBTZXAgMTIgMTQ6MTI6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbGNvZmYuaCAoU1lNTk1MRU4sIEZJTE5NTEVOLCBESU1OVU0pOiAgRGVmaW5lIHRoZXNlCi0JZm9yIGludGVybmFsY29mZiwgc2VwYXJhdGVseSBmcm9tIHRoZSB2YXJpb3VzIGV4dGVybmFsIGNvZmYncy4KLQkqIGFtZGNvZmYuaCwgYmNzODhrY29mZi5oLCBpMzg2Y29mZi5oLCBpbnRlbC1jb2ZmLmgsIG02OGtjb2ZmLmgsCi0JbTg4ay1iY3MuaDogUHJlZml4IFNZTU5NTEVOLCBGSUxOTUxFTiwgYW5kIERJTU5VTSB3aXRoIEVfJ3MgZm9yCi0JdGhlIGV4dGVybmFsIHN0cnVjdCBkZWZpbml0aW9ucy4KLQkqIGVjb2ZmLmg6IFJlbW92ZSB0aGVzZSAjZGVmaW5lJ3MsIGtsdWRnZSBubyBsb25nZXIgbmVlZGVkLgotCi0JKiBzeXMvaC11bHRyYTMuaDogIEFkZCBuZXcgVWx0cmFjb21wdXRlciBob3N0LgotCSogc3lzZGVwLmg6ICBBZGQgVUxUUkEzX1NZTTFfU1lTIGFuZCB1c2UgaXQuCi0KLVR1ZSBTZXAgMTAgMTA6MTE6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpMzg2Y29mZi5oIChMSU5FU1opOiAgQWx3YXlzIDYsIG5vdCBiYXNlZCBvbiBzaXplb2YoKS4KLQkoRml4IGZyb20gUGV0ZXIgU2NoYXVlciA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+LikKLQotV2VkIFNlcCAgNCAwODo1ODozNyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGEub3V0LmdudS5oLCBhb3V0NjQuaDogIEFkZCBOX1dBUk5JTkcuICBDaGFuZ2UgTl9GTiB0byAweDBFLAotCXRvIG1hdGNoIFN1bk9TIGFuZCBCU0QuICBBZGQgTl9DT01NIGFzIDB4MTIgZm9yIFN1bk9TIHNoYXJlZCBsaWIKLQlzdXBwb3J0LgotCSogc3RhYi5kZWY6ICBBZGQgTl9DT01NIHRvIHRhYmxlLCBmaXggb3ZlcmxhcCBjb21tZW50LgotCi1UdWUgU2VwICAzIDA2OjI5OjIwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCU1lcmdlIHdpdGggbGF0ZXN0IEZTRiB2ZXJzaW9ucyBvZiB0aGVzZSBmaWxlcy4KLQotCSogc3RhYi5nbnUuaDogIEFkZCBMQVNUX1VOVVNFRF9TVEFCX0NPREUuCi0JKiBzdGFiLmRlZjogIFVwZGF0ZSB0byBHUEwyLiAgTW92ZSBOX1dBUk5JTkcgb3V0LCBzaW5jZSBub3QgYQotCWRlYnVnIHN5bWJvbC4gIENoYW5nZSBjb21tZW50cywgYW5kIHJlb3JkZXIgdGFibGUgdG8gbnVtZXJpYwotCW9yZGVyLiAgVXBkYXRlIGZpbmFsIHRhYmxlIGNvbW1lbnQuCi0JKE5fRFNMSU5FLCBOX0JTTElORSk6ICBSZW51bWJlciBmcm9tIDB4NjYgYW5kIDB4NjgsIHRvIDB4NDYgYW5kIDB4NDguCi0KLQkqIG9ic3RhY2suaDogIEdQTDIuICBNZXJnZS4KLQotRnJpIEF1ZyAyMyAwMTo1NDoyMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGEub3V0LmdudS5oLCBhLm91dC5zdW40Lmg6ICBNYWtlIFNFR01FTlRfU0laRSBhYmxlIHRvIGRlcGVuZAotCW9uIHRoZSBwYXJ0aWN1bGFyIGEub3V0IGJlaW5nIGV4YW1pbmVkLgotCSogYS5vdXQuc3VuNC5oOiAgRGVmaW5lIHNlZ21lbnQgc2l6ZXMgZm9yIFN1bi0zJ3MgYW5kIFN1bi00J3MuCi0JKiBGSVhNRTogIGEub3V0LmdudS5oIGlzIGFsbW9zdCBvYnNvbGV0ZS4KLQkqIEZJWE1FOiAgYS5vdXQuc3VuNC5oIHNob3VsZCBiZSByZW5hbWVkIGEub3V0LnN1bi5oIG5vdy4KLQotV2VkIEF1ZyAyMSAyMDozMjoxMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIFN0YXJ0IGEgQ2hhbmdlTG9nIGZvciB0aGUgaW5jbHVkZXMgZGlyZWN0b3J5LgotCi0JKiBhLm91dC5nbnUuaCAoTl9GTik6ICBGaXggdmFsdWUgLS0gd2FzIDE1LCBzaG91bGQgYmUgMHgxRS4KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIGFsbG9jYXRpb24gdGFibGUgaW4gY29tbWVudHMgYXQgZW5kLAotCXRvIHJlZmxlY3QgcmVhbGl0eSBhcyBJIGtub3cgaXQuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5zaWRlY2wuaCBiL2luY2x1ZGUvYW5zaWRlY2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzMDg2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2Fuc2lkZWNsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyogQU5TSSBhbmQgdHJhZGl0aW9uYWwgQyBjb21wYXRhYmlsaXR5IG1hY3JvcwotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQU5TSSBhbmQgdHJhZGl0aW9uYWwgQyBjb21wYXRpYmlsaXR5IG1hY3JvcwotCi0gICBBTlNJIEMgaXMgYXNzdW1lZCBpZiBfX1NURENfXyBpcyAjZGVmaW5lZC4KLQotICAgTWFjcm8JQU5TSSBDIGRlZmluaXRpb24JVHJhZGl0aW9uYWwgQyBkZWZpbml0aW9uCi0gICAtLS0tLQktLS0tIC0gLS0tLS0tLS0tLQktLS0tLS0tLS0tLSAtIC0tLS0tLS0tLS0KLSAgIFBUUgkJYHZvaWQgKicJCWBjaGFyIConCi0gICBMT05HX0RPVUJMRQlgbG9uZyBkb3VibGUnCQlgZG91YmxlJwotICAgVk9MQVRJTEUJYHZvbGF0aWxlJwkJYCcKLSAgIFNJR05FRAlgc2lnbmVkJwkJYCcKLSAgIFBUUkNPTlNUCWB2b2lkICpjb25zdCcJCWBjaGFyIConCi0gICBBTlNJX1BST1RPVFlQRVMgIDEJCQlub3QgZGVmaW5lZAotCi0gICBDT05TVCBpcyBhbHNvIGRlZmluZWQsIGJ1dCBpcyBvYnNvbGV0ZS4gIEp1c3QgdXNlIGNvbnN0LgotCi0gICBvYnNvbGV0ZSAtLSAgICAgREVGVU4gKG5hbWUsIGFyZ2xpc3QsIGFyZ3MpCi0KLQlEZWZpbmVzIGZ1bmN0aW9uIE5BTUUuCi0KLQlBUkdMSVNUIGxpc3RzIHRoZSBhcmd1bWVudHMsIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIGVuY2xvc2VkIGluCi0JcGFyZW50aGVzZXMuICBBUkdMSVNUIGJlY29tZXMgdGhlIGFyZ3VtZW50IGxpc3QgaW4gdHJhZGl0aW9uYWwgQy4KLQotCUFSR1MgbGlzdCB0aGUgYXJndW1lbnRzIHdpdGggdGhlaXIgdHlwZXMuICBJdCBiZWNvbWVzIGEgcHJvdG90eXBlIGluCi0JQU5TSSBDLCBhbmQgdGhlIHR5cGUgZGVjbGFyYXRpb25zIGluIHRyYWRpdGlvbmFsIEMuICBBcmd1bWVudHMgc2hvdWxkCi0JYmUgc2VwYXJhdGVkIHdpdGggYEFORCcuICBGb3IgZnVuY3Rpb25zIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YKLQlhcmd1bWVudHMsIHRoZSBsYXN0IHRoaW5nIGxpc3RlZCBzaG91bGQgYmUgYERPVFMnLgotCi0gICBvYnNvbGV0ZSAtLSAgICAgREVGVU5fVk9JRCAobmFtZSkKLQotCURlZmluZXMgYSBmdW5jdGlvbiBOQU1FLCB3aGljaCB0YWtlcyBubyBhcmd1bWVudHMuCi0KLSAgIG9ic29sZXRlIC0tICAgICBFWEZVTiAobmFtZSwgKHByb3RvdHlwZSkpCS0tIG9ic29sZXRlLgotCi0JUmVwbGFjZWQgYnkgUEFSQU1TLiAgRG8gbm90IHVzZTsgd2lsbCBkaXNhcHBlYXIgc29tZWRheSBzb29uLgotCVdhcyB1c2VkIGluIGV4dGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQlJbiBBTlNJIEMgaXQgaXMgYE5BTUUgUFJPVE9UWVBFJyAoc28gUFJPVE9UWVBFIHNob3VsZCBiZSBlbmNsb3NlZCBpbgotCXBhcmVudGhlc2VzKS4gIEluIHRyYWRpdGlvbmFsIEMgaXQgaXMgYE5BTUUoKScuCi0JRm9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudHMsIFBST1RPVFlQRSBzaG91bGQgYmUgYCh2b2lkKScuCi0KLSAgIG9ic29sZXRlIC0tICAgICBQUk9UTyAodHlwZSwgbmFtZSwgKHByb3RvdHlwZSkgICAgLS0gb2Jzb2xldGUuCi0KLQlUaGlzIG9uZSBoYXMgYWxzbyBiZWVuIHJlcGxhY2VkIGJ5IFBBUkFNUy4gIERvIG5vdCB1c2UuCi0KLSAgIFBBUkFNUyAoKGFyZ3MpKQotCi0JV2UgY291bGQgdXNlIHRoZSBFWEZVTiBtYWNybyB0byBoYW5kbGUgcHJvdG90eXBlIGRlY2xhcmF0aW9ucywgYnV0Ci0JdGhlIG5hbWUgaXMgbWlzbGVhZGluZyBhbmQgdGhlIHJlc3VsdCBpcyB1Z2x5LiAgU28gd2UganVzdCBkZWZpbmUgYQotCXNpbXBsZSBtYWNybyB0byBoYW5kbGUgdGhlIHBhcmFtZXRlciBsaXN0cywgYXMgaW46Ci0KLQkgICAgICBzdGF0aWMgaW50IGZvbyBQQVJBTVMgKChpbnQsIGNoYXIpKTsKLQotCVRoaXMgcHJvZHVjZXM6ICBgc3RhdGljIGludCBmb28oKTsnIG9yIGBzdGF0aWMgaW50IGZvbyAoaW50LCBjaGFyKTsnCi0KLQlFWEZVTiB3b3VsZCBoYXZlIGRvbmUgaXQgbGlrZSB0aGlzOgotCi0JICAgICAgc3RhdGljIGludCBFWEZVTiAoZm9vLCAoaW50LCBjaGFyKSk7Ci0KLQlidXQgdGhlIGZ1bmN0aW9uIGlzIG5vdCBleHRlcm5hbC4uLmFuZCBpdCdzIGhhcmQgdG8gdmlzdWFsbHkgcGFyc2UKLQl0aGUgZnVuY3Rpb24gbmFtZSBvdXQgb2YgdGhlIG1lc3MuICAgRVhGVU4gc2hvdWxkIGJlIGNvbnNpZGVyZWQKLQlvYnNvbGV0ZTsgbmV3IGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdXNlIFBBUkFNUy4KLQotICAgRE9UUyBpcyBhbHNvIG9ic29sZXRlLgotCi0gICBFeGFtcGxlczoKLQotCWV4dGVybiBpbnQgcHJpbnRmIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSk7Ci0qLwotCi0jaWZuZGVmCV9BTlNJREVDTF9ICi0KLSNkZWZpbmUJX0FOU0lERUNMX0gJMQotCi0KLS8qIEV2ZXJ5IHNvdXJjZSBmaWxlIGluY2x1ZGVzIHRoaXMgZmlsZSwKLSAgIHNvIHRoZXkgd2lsbCBhbGwgZ2V0IHRoZSBzd2l0Y2ggZm9yIGxpbnQuICAqLwotLyogTElOVExJQlJBUlkgKi8KLQotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9BSVgpIHx8IChkZWZpbmVkIChfX21pcHMpICYmIGRlZmluZWQgKF9TWVNUWVBFX1NWUjQpKSB8fCBkZWZpbmVkKF9XSU4zMikKLS8qIEFsbCBrbm93biBBSVggY29tcGlsZXJzIGltcGxlbWVudCB0aGVzZSB0aGluZ3MgKGJ1dCBkb24ndCBhbHdheXMKLSAgIGRlZmluZSBfX1NURENfXykuICBUaGUgUklTQy9PUyBNSVBTIGNvbXBpbGVyIGRlZmluZXMgdGhlc2UgdGhpbmdzCi0gICBpbiBTVlI0IG1vZGUsIGJ1dCBkb2VzIG5vdCBkZWZpbmUgX19TVERDX18uICAqLwotCi0jZGVmaW5lCVBUUgkJdm9pZCAqCi0jZGVmaW5lCVBUUkNPTlNUCXZvaWQgKkNPTlNUCi0jZGVmaW5lCUxPTkdfRE9VQkxFCWxvbmcgZG91YmxlCi0KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lCUFORAkJLAotI2RlZmluZQlOT0FSR1MJCXZvaWQKLSNkZWZpbmUJVk9MQVRJTEUJdm9sYXRpbGUKLSNkZWZpbmUJU0lHTkVECQlzaWduZWQKLSNlbmRpZiAvKiAhIElOX0dDQyAqLwotCi0jZGVmaW5lIFBBUkFNUyhwYXJhbWxpc3QpCQlwYXJhbWxpc3QKLSNkZWZpbmUgQU5TSV9QUk9UT1RZUEVTCQkJMQotCi0jZGVmaW5lIFZQQVJBTVMoQVJHUykJCQlBUkdTCi0jZGVmaW5lIFZBX1NUQVJUKHZhX2xpc3QsdmFyKQkJdmFfc3RhcnQodmFfbGlzdCx2YXIpCi0KLS8qIFRoZXNlIGFyZSBvYnNvbGV0ZS4gIERvIG5vdCB1c2UuICAqLwotI2lmbmRlZiBJTl9HQ0MKLSNkZWZpbmUgQ09OU1QJCQkJY29uc3QKLSNkZWZpbmUgRE9UUwkJCQksIC4uLgotI2RlZmluZSBQUk9UTyh0eXBlLCBuYW1lLCBhcmdsaXN0KQl0eXBlIG5hbWUgYXJnbGlzdAotI2RlZmluZSBFWEZVTihuYW1lLCBwcm90bykJCW5hbWUgcHJvdG8KLSNkZWZpbmUgREVGVU4obmFtZSwgYXJnbGlzdCwgYXJncykJbmFtZShhcmdzKQotI2RlZmluZSBERUZVTl9WT0lEKG5hbWUpCQluYW1lKHZvaWQpCi0jZW5kaWYgLyogISBJTl9HQ0MgKi8KLQotI2Vsc2UJLyogTm90IEFOU0kgQy4gICovCi0KLSNkZWZpbmUJUFRSCQljaGFyICoKLSNkZWZpbmUJUFRSQ09OU1QJUFRSCi0jZGVmaW5lCUxPTkdfRE9VQkxFCWRvdWJsZQotCi0jaWZuZGVmIElOX0dDQwotI2RlZmluZQlBTkQJCTsKLSNkZWZpbmUJTk9BUkdTCi0jZGVmaW5lCVZPTEFUSUxFCi0jZGVmaW5lCVNJR05FRAotI2VuZGlmIC8qICFJTl9HQ0MgKi8KLQotI2lmbmRlZiBjb25zdCAvKiBzb21lIHN5c3RlbXMgZGVmaW5lIGl0IGluIGhlYWRlciBmaWxlcyBmb3Igbm9uLWFuc2kgbW9kZSAqLwotI2RlZmluZQljb25zdAotI2VuZGlmCi0KLSNkZWZpbmUgUEFSQU1TKHBhcmFtbGlzdCkJCSgpCi0KLSNkZWZpbmUgVlBBUkFNUyhBUkdTKQkJCSh2YV9hbGlzdCkgdmFfZGNsCi0jZGVmaW5lIFZBX1NUQVJUKHZhX2xpc3QsdmFyKQkJdmFfc3RhcnQodmFfbGlzdCkKLQotLyogVGhlc2UgYXJlIG9ic29sZXRlLiAgRG8gbm90IHVzZS4gICovCi0jaWZuZGVmIElOX0dDQwotI2RlZmluZSBDT05TVAotI2RlZmluZSBET1RTCi0jZGVmaW5lIFBST1RPKHR5cGUsIG5hbWUsIGFyZ2xpc3QpCXR5cGUgbmFtZSAoKQotI2RlZmluZSBFWEZVTihuYW1lLCBwcm90bykJCW5hbWUoKQotI2RlZmluZSBERUZVTihuYW1lLCBhcmdsaXN0LCBhcmdzKQluYW1lIGFyZ2xpc3QgYXJnczsKLSNkZWZpbmUgREVGVU5fVk9JRChuYW1lKQkJbmFtZSgpCi0jZW5kaWYgLyogISBJTl9HQ0MgKi8KLQotI2VuZGlmCS8qIEFOU0kgQy4gICovCi0KLS8qIFVzaW5nIE1BQ1JPKHgseSkgaW4gY3BwICNpZiBjb25kaXRpb25hbHMgZG9lcyBub3Qgd29yayB3aXRoIHNvbWUKLSAgIG9sZGVyIHByZXByb2Nlc3NvcnMuICBUaHVzIHdlIGNhbid0IGRlZmluZSBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0jZGVmaW5lIEhBVkVfR0NDX1ZFUlNJT04oTUFKT1IsIE1JTk9SKSBcCi0gIChfX0dOVUNfXyA+IChNQUpPUikgfHwgKF9fR05VQ19fID09IChNQUpPUikgJiYgX19HTlVDX01JTk9SX18gPj0gKE1JTk9SKSkpCi0KLWFuZCB0aGVuIHRlc3QgIiNpZiBIQVZFX0dDQ19WRVJTSU9OKDIsNykiLgotCi1TbyBpbnN0ZWFkIHdlIHVzZSB0aGUgbWFjcm8gYmVsb3cgYW5kIHRlc3QgaXQgYWdhaW5zdCBzcGVjaWZpYyB2YWx1ZXMuICAqLwotCi0vKiBUaGlzIG1hY3JvIHNpbXBsaWZpZXMgdGVzdGluZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBnY2MsIGFuZCBpZiBpdAotICAgaXMgb2YgYSBwYXJ0aWN1bGFyIG1pbmltdW0gdmVyc2lvbi4gKEJvdGggbWFqb3IgJiBtaW5vciBudW1iZXJzIGFyZQotICAgc2lnbmlmaWNhbnQuKSAgVGhpcyBtYWNybyB3aWxsIGV2YWx1YXRlIHRvIDAgaWYgd2UgYXJlIG5vdCB1c2luZwotICAgZ2NjIGF0IGFsbC4gICovCi0jaWZuZGVmIEdDQ19WRVJTSU9OCi0jZGVmaW5lIEdDQ19WRVJTSU9OIChfX0dOVUNfXyAqIDEwMDAgKyBfX0dOVUNfTUlOT1JfXykKLSNlbmRpZiAvKiBHQ0NfVkVSU0lPTiAqLwotCi0vKiBEZWZpbmUgbWFjcm9zIGZvciBzb21lIGdjYyBhdHRyaWJ1dGVzLiAgVGhpcyBwZXJtaXRzIHVzIHRvIHVzZSB0aGUKLSAgIG1hY3JvcyBmcmVlbHksIGFuZCBrbm93IHRoYXQgdGhleSB3aWxsIGNvbWUgaW50byBwbGF5IGZvciB0aGUKLSAgIHZlcnNpb24gb2YgZ2NjIGluIHdoaWNoIHRoZXkgYXJlIHN1cHBvcnRlZC4gICovCi0KLSNpZiAoR0NDX1ZFUlNJT04gPCAyMDA3KQotIyBkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQotI2VuZGlmCi0KLS8qIEF0dHJpYnV0ZSBfX21hbGxvY19fIG9uIGZ1bmN0aW9ucyB3YXMgdmFsaWQgYXMgb2YgZ2NjIDIuOTYuICovCi0jaWZuZGVmIEFUVFJJQlVURV9NQUxMT0MKLSMgaWYgKEdDQ19WRVJTSU9OID49IDIwOTYpCi0jICBkZWZpbmUgQVRUUklCVVRFX01BTExPQyBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpCi0jIGVsc2UKLSMgIGRlZmluZSBBVFRSSUJVVEVfTUFMTE9DCi0jIGVuZGlmIC8qIEdOVUMgPj0gMi45NiAqLwotI2VuZGlmIC8qIEFUVFJJQlVURV9NQUxMT0MgKi8KLQotLyogQXR0cmlidXRlcyBvbiBsYWJlbHMgd2VyZSB2YWxpZCBhcyBvZiBnY2MgMi45My4gKi8KLSNpZm5kZWYgQVRUUklCVVRFX1VOVVNFRF9MQUJFTAotIyBpZiAoR0NDX1ZFUlNJT04gPj0gMjA5MykKLSMgIGRlZmluZSBBVFRSSUJVVEVfVU5VU0VEX0xBQkVMIEFUVFJJQlVURV9VTlVTRUQKLSMgZWxzZQotIyAgZGVmaW5lIEFUVFJJQlVURV9VTlVTRURfTEFCRUwKLSMgZW5kaWYgLyogR05VQyA+PSAyLjkzICovCi0jZW5kaWYgLyogQVRUUklCVVRFX1VOVVNFRF9MQUJFTCAqLwotCi0jaWZuZGVmIEFUVFJJQlVURV9VTlVTRUQKLSNkZWZpbmUgQVRUUklCVVRFX1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCi0jZW5kaWYgLyogQVRUUklCVVRFX1VOVVNFRCAqLwotCi0jaWZuZGVmIEFUVFJJQlVURV9OT1JFVFVSTgotI2RlZmluZSBBVFRSSUJVVEVfTk9SRVRVUk4gX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpCi0jZW5kaWYgLyogQVRUUklCVVRFX05PUkVUVVJOICovCi0KLSNpZm5kZWYgQVRUUklCVVRFX1BSSU5URgotI2RlZmluZSBBVFRSSUJVVEVfUFJJTlRGKG0sIG4pIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCBtLCBuKSkpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfMSBBVFRSSUJVVEVfUFJJTlRGKDEsIDIpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfMiBBVFRSSUJVVEVfUFJJTlRGKDIsIDMpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfMyBBVFRSSUJVVEVfUFJJTlRGKDMsIDQpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfNCBBVFRSSUJVVEVfUFJJTlRGKDQsIDUpCi0jZGVmaW5lIEFUVFJJQlVURV9QUklOVEZfNSBBVFRSSUJVVEVfUFJJTlRGKDUsIDYpCi0jZW5kaWYgLyogQVRUUklCVVRFX1BSSU5URiAqLwotCi0jZW5kaWYJLyogYW5zaWRlY2wuaAkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L0NoYW5nZUxvZyBiL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjE3ZWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0xOTk5LTA3LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYW91dDY0LmggKE5fU0hBUkVEX0xJQik6IERlZmluZSBhcyAwIGlmIFRFWFRfU1RBUlRfQUREUiBpcwotCWRlZmluZWQgYXMgMC4KLQotU3VuIEp1biAyOCAxMTozMzo0OCAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIHN0YWIuZGVmOiAgQWRkIE5fQUxJQVMgZnJvbSBTdW5Qcm8gRjc3LgotCi1Nb24gTWFyIDExIDEyOjE1OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYi5kZWY6IFVzZSBfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSByYXRoZXIgdGhhbiBfX2RlZmluZV9zdGFiCi0JZm9yIGR1cGxpY2F0ZSBlbnRyaWVzIE5fQlJPV1MgYW5kIE5fTU9EMi4KLQkqIHN0YWJfZ251LmggKF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKTogRGVmaW5lIGJlZm9yZSBpbmNsdWRpbmcKLQlzdGFiLmRlZi4KLQotRnJpIE9jdCAyNyAxNzo0NzoxNiAxOTk1ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBhb3V0NjQuaCwgaG9zdC5oLCBocDMwMGhwdXguaCwgc3VuNC5oOiBDaGFuZ2VkIFBBR0VfU0laRSB0bwotCVRBUkdFVF9QQUdFX1NJWkUuCi0KLVR1ZSBTZXAgMTIgMTI6MDc6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW40LmggKHN0cnVjdCBpbnRlcm5hbF9zdW40X2R5bmFtaWNfbGluayk6IENoYW5nZSBhbGwgZmllbGRzCi0JZnJvbSBsb25nIHRvIHVuc2lnbmVkIGxvbmcuCi0KLVdlZCBKdWwgMTIgMDA6MTU6MTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIHN1bjQuaCAoUEFHRV9TSVpFKTogVW5kZWZpbmUgYmVmb3JlIGRlZmluaW5nLgotCi1UaHUgSnVuIDE2IDE0OjIyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKEJNQUdJQyk6IERlZmluZS4KLQotU2F0IEp1biAxMSAxNjoxNjowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgd2VhayBzeW1ib2xzIGFzIGFuIGV4dGVuc2lvbiB0byBhLm91dC4KLQkqIGFvdXQ2NC5oIChOX1dFQUtVLCBOX1dFQUtBLCBOX1dFQUtULCBOX1dFQUtELCBOX1dFQUtCKTogRGVmaW5lLgotCSogc3RhYi5kZWY6IFVwZGF0ZSBzeW1ib2wgdmFsdWUgdGFibGUuCi0KLVRodSBKdW4gIDIgMTc6MTM6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdW40LmggKEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFKTogQ29ycmVjdCBmcm9tIDI4IHRvCi0JMjQuICBGaXggdXAgbGRfZ290IGNvbW1lbnQuCi0KLVdlZCBNYXIgMzAgMDA6MzE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBkeW5peDMuaDogIENsZWFudXAsIGFkYXB0IHRvIGN1cnJlbnQgYmZkIHZlcnNpb24uCi0KLVNhdCBGZWIgMjYgMTA6MjU6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4KLQotRnJpIEZlYiAxMSAxMjo1NjowNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFyLmggKEFSTUFHLCBBUk1BR0IsIEFSRk1BRyk6IENoYW5nZSAnXG4nIHRvICdcMDEyJywgZm9yIGdyZWF0ZXIKLQlwb3J0YWJpbGl0eS4KLQotRnJpIEphbiAyMSAwMDo1OTowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN1bjQuaDogQWRkZWQgaW5mb3JtYXRpb24gYWJvdXQgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcy4KLQotRnJpIEphbiAgNyAwODoyMDoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fVFhUQUREUik6IEFkZCBjb21tZW50IHJlZ2FyZGluZyBPTUFHSUMgYW5kIE5NQUdJQy4KLQotU2F0IERlYyAyNSAxNDo1NTo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fREFUT0ZGKTogRG9uJ3QgcGFkIChyZXZlcnQgY2hhbmdlIG9mIDggSnVsIDE5OTMpLgotCi1UdWUgTm92IDE2IDE1OjQzOjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogTmV3IG1hY3JvcyBaTUFHSUNfRElTS19CTE9DS19TSVpFIGFuZCBOX0RJU0tfQkxPQ0tfU0laRQotCWZvciBMaW51eCBaTUFHSUMuCi0JKE5fVFhUT0ZGLCBOX0RBVE9GRik6IFVzZSB0aGVtLgotCi1UaHUgTm92ICA0IDAwOjMzOjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFKTogRml4ZWQgdmFsdWUgdG8gbWF0Y2gKLQlzdW4zIHN5c3RlbTsgdXNlZCB0byBvdmVybGFwIG90aGVyIGZpZWxkcy4KLQkoUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKTogTGlrZXdpc2UuCi0KLVdlZCBOb3YgIDMgMTM6NDg6MjcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpOiBNYWtlIGl0IDB4MTAgKEtlbidzCi0Jc3VnZ2VzdGlvbikgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFLgotCi1GcmkgT2N0IDI5IDE1OjA5OjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4LmggKE5fU0hBUkVEX0xJQik6IERlZmluZSB0byBiZSAwLgotCi1Nb24gU2VwIDEzIDIxOjAwOjU2IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhci5oIChBUk1BUF9USU1FX09GRlNFVCk6ICBBZGQgYW5kIGRlc2NyaWJlLgotCi1Nb24gQXVnIDIzICBTZWFuIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIFtBUkNIX1NJWkUgIT0gNjRdOiBBbGxvdyBOX0JBRE1BRyB0byBiZSBvdmVycmlkZGVuLgotCi1Nb24gQXVnIDE2IDE0OjMwOjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdGFiX2dudS5oOiBJbmNsdWRlIGFvdXQvc3RhYi5kZWYgbm90IGp1c3Qgc3RhYi5kZWYuCi0KLVN1biBKdWwgMTggMjE6NDE6NDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkeW5peDMuaDogTmV3LCBmb3Igc3ltbWV0cnkgcnVubmluZyBkeW5peC4KLQotVGh1IEp1bCAgOCAxMjo1MjoyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fQkFETUFHKTogUmVjb2duaXplIFFNQUdJQy4KLQlOX1RYVE9GRiwgTl9UWFRBRERSLCBOX1RYVFNJWkU6IFNwZWNpYWwgY29kZSBmb3IgUU1BR0lDLgotCU5fREFUT0ZGOiBQYWQgdGV4dCBzaXplIGlmIHdlIG5lZWQgdG8uCi0KLUZyaSBKdW4gMTggMTk6MTk6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmIChOX0VDT01MKTogRml4IGNvbW1lbnQuCi0KLU1vbiBNYXkgMzEgMDk6MjE6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiBSZW1vdmUgU29sYXJpcyBpbmZvcm1hdGlvbiBvbiBOX0ZVTiBzdGFic3RyaW5nIGdyYW1tYXI7Ci0JSSd2ZSB0cmFuc2ZlcnJlZCBpdCB0byBnZGIvZG9jL3N0YWJzLnRleGluZm8sIHdoZXJlIGl0IGJlbG9uZ3MuCi0KLU1vbiBNYXkgMTAgMDU6NDg6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGhwMzAwaHB1eC5oOiBQYXRjaCBmcm9tIEdsZW5uIEVuZ2VsIGZvciBsaW5rZXIgcHJvYmxlbSBhbmQKLQljb21wYXRpYmlsaXR5IGZpeDoKLQkoT01BR0lDLCBOTUFHSUMpOiBOZXcgZGVmaW5pdGlvbnMuCi0JKFNIQVJFTUFHSUMpOiBEZWxldGVkLgotCShIUFVYX0RPVF9PX01BR0lDKTogTmV3IG1hY3JvLgotCShfTl9CQURNQUcpOiBBZGp1c3RlZC4KLQkoTl9IRUFERVJfSU5fVEVYVCwgTl9EQVRBRERSKTogTmV3IG1hY3Jvcy4KLQotVGh1IEFwciAyOSAxMjowNzozNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4Lmg6IE5ldyBmaWxlIGZyb20gR2xlbm4gRW5nZWwsIGdsZW5uZUBsc2lkLmhwLmNvbS4KLQotVHVlIEFwciAyNyAwNTo1MTowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKHN0cnVjdCBleHRlcm5hbF9leGVjLCAqTUFHSUMsIE5fQkFETUFHKTogRG9uJ3QgZGVmaW5lCi0JaWYgYGV4dGVybmFsX2V4ZWMnIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIG1hY3JvLgotCShOX0RBVE9GRiwgTl9UUkVMT0ZGLCBOX0RSRUxPRkYsIE5fU1lNT0ZGLCBOX1NUUk9GRik6IERvbid0IGRlZmluZQotCWlmIGFscmVhZHkgZGVmaW5lZC4KLQkoc3RydWN0IGV4dGVybmFsX25saXN0LCBFWFRFUk5BTF9OTElTVF9TSVpFKTogRG9uJ3QgZGVmaW5lIGlmCi0JYGV4dGVybmFsX25saXN0JyBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBtYWNyby4KLQotU2F0IEF1ZyAxNSAwNDoyMzowMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYWRvYmUuaDogIEFkZCBkZXNjcmlwdGlvbiBvZiBhLm91dC5hZG9iZSBmb3JtYXQuCi0KLUZyaSBKdWwgIDMgMDA6MzY6NTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIG1vcmUgU29sYXJpcyBkZWZpbml0aW9ucy4KLQkqIHN0YWJfZ251Lmg6ICBBZGQgTl9TTyBsYW5ndWFnZSB0eXBlcywgYW5kIFNvbGFyaXMgYmFzaWMgZmxvYXQgdHlwZXMuCi0KLVN1biBKdW4gMTQgMTA6NTM6NTMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIGRlc2NyaXB0aW9ucyBvZiBTb2xhcmlzLTIgc3RhYnM7IGFkZCBOX1VOREYuCi0KLVRodSBKdW4gMTEgMDE6MTI6MDcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgQWRkIE5fT0JKIGFuZCBOX09QVCBmcm9tIFNvbGFyaXMtMi4KLQotVGh1IEphbiAzMCAxODoxMjo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC9hb3V0NjQuaDogTl9UWFRTSVpFIG5lZWRzIHNvbWUgbW9yZSBwYXJlbnRoZXNlcy4KLQlJIGRvbid0IHRydXN0IEMgcHJlY2VkZW5jZS4KLQotV2VkIERlYyAxOCAxNDozMjowMSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC9hb3V0NjQuaDogIE1vdmUgY29tbW9uIHN1bm9zLXNwZWNpZmljIHRlc3QKLQl0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcyBpbnRvIG5ldyBtYWNybyBOX1NIQVJFRF9MSUIuCi0JVXNlIGl0IHRvIHNpbXBsaWZ5JnJlZm9ybWF0IE5fVFhUQUREUiwgTl9UWFRPRkYsIE5fVFhUU0laRS4KLQotU2F0IE5vdiAzMCAyMDozNDo1MiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogQ2hhbmdlTG9nLCBhb3V0NjQuaCwgYXIuaCwgZW5jYXAuaCwgaG9zdC5oLCBocC5oLCByYW5saWIuaCwKLQlyZWxvYy5oLCBzdGFiLmRlZiwgc3RhYl9nbnUuaCwgc3VuNC5oOiBBbGwgbW92ZWQgZnJvbSB0aGUKLQlkZXZvL2luY2x1ZGUgZGlyZWN0b3J5Ci0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9hZG9iZS5oIGIvaW5jbHVkZS9hb3V0L2Fkb2JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmYxNWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2Fkb2JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyogYGEub3V0LmFkb2JlJyBkaWZmZXJlbmNlcyBmcm9tIHN0YW5kYXJkIGEub3V0IGZpbGVzICovCi0KLSNpZm5kZWYgX19BX09VVF9BRE9CRV9IX18KLSNkZWZpbmUgX19BX09VVF9BRE9CRV9IX18KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLQotLyogU3RydWN0IGV4dGVybmFsX2V4ZWMgaXMgdGhlIHNhbWUuICAqLwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiB0aGUgMzItYml0IG9yIDY0LWJpdCBleGVjIGhlYWRlci4gKi8KLQotc3RydWN0IGV4dGVybmFsX2V4ZWMgCi17Ci0gIGJmZF9ieXRlIGVfaW5mb1s0XTsJCS8qIG1hZ2ljIG51bWJlciBhbmQgc3R1ZmYJCSovCi0gIGJmZF9ieXRlIGVfdGV4dFtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2RhdGFbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHNlY3Rpb24gaW4gYnl0ZXMJKi8KLSAgYmZkX2J5dGUgZV9ic3NbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBic3MgYXJlYSBpbiBieXRlcyAJCSovCi0gIGJmZF9ieXRlIGVfc3ltc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBpbiBieXRlcyAJKi8KLSAgYmZkX2J5dGUgZV9lbnRyeVtCWVRFU19JTl9XT1JEXTsgLyogc3RhcnQgYWRkcmVzcyAJCQkqLwotICBiZmRfYnl0ZSBlX3Ryc2l6ZVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCi0gIGJmZF9ieXRlIGVfZHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gCSovCi19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoNCArIEJZVEVTX0lOX1dPUkQgKiA3KQotCi0vKiBNYWdpYyBudW1iZXJzIGZvciBhLm91dCBmaWxlcyAqLwotCi0jdW5kZWYJWk1BR0lDCi0jZGVmaW5lCVpNQUdJQwkweEFEMEJFCQkvKiBDdXRlLCBlaD8gICovCi0jdW5kZWYJT01BR0lDCi0jdW5kZWYJTk1BR0lDCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoKHgpLmFfaW5mbyAhPSBaTUFHSUMpCi0KLS8qIEJ5IGRlZmF1bHQsIHNlZ21lbnQgc2l6ZSBpcyBjb25zdGFudC4gIEJ1dCBzb21lIG1hY2hpbmVzIG92ZXJyaWRlIHRoaXMKLSAgIHRvIGJlIGEgZnVuY3Rpb24gb2YgdGhlIGEub3V0IGhlYWRlciAoZS5nLiBtYWNoaW5lIHR5cGUpLiAgKi8KLSNpZm5kZWYJTl9TRUdTSVpFCi0jZGVmaW5lCU5fU0VHU0laRSh4KQlTRUdNRU5UX1NJWkUKLSNlbmRpZgotI3VuZGVmIE5fU0VHU0laRSAgIC8qIEZJWE1FWFhYWCAqLwotCi0vKiBTZWdtZW50IGluZm9ybWF0aW9uIGZvciB0aGUgYS5vdXQuQWRvYmUgZm9ybWF0IGlzIHNwZWNpZmllZCBhZnRlciB0aGUKLSAgIGZpbGUgaGVhZGVyLiAgSXQgY29udGFpbnMgTiBzZWdtZW50IGRlc2NyaXB0b3JzLCBmb2xsb3dlZCBieSBvbmUgd2l0aAotICAgYSB0eXBlIG9mIHplcm8uICAKLQotICAgVGhlIGFjdHVhbCB0ZXh0IG9mIHRoZSBzZWdtZW50cyBzdGFydHMgYXQgTl9UWFRPRkYgaW4gdGhlIGZpbGUsCi0gICByZWdhcmRsZXNzIG9mIGhvdyBtYW55IG9yIGhvdyBmZXcgc2VnbWVudCBoZWFkZXJzIHRoZXJlIGFyZS4gICovCi0KLXN0cnVjdCBleHRlcm5hbF9zZWdkZXNjIHsKLQl1bnNpZ25lZCBjaGFyIGVfdHlwZVsxXTsKLQl1bnNpZ25lZCBjaGFyIGVfc2l6ZVszXTsKLQl1bnNpZ25lZCBjaGFyIGVfdmlydGJhc2VbNF07Ci0JdW5zaWduZWQgY2hhciBlX2ZpbGViYXNlWzRdOwotfTsKLQotc3RydWN0IGludGVybmFsX3NlZ2Rlc2MgewotCXVuc2lnbmVkIGludAlhX3R5cGU6ODsJLyogU2VnbWVudCB0eXBlIE5fVEVYVCwgTl9EQVRBLCAwICovCi0JdW5zaWduZWQgaW50IAlhX3NpemU6MjQ7CS8qIFNlZ21lbnQgc2l6ZSAqLwotCWJmZF92bWEJCWFfdmlydGJhc2U7CS8qIFZpcnR1YWwgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGludAlhX2ZpbGViYXNlOwkvKiBCYXNlIGFkZHJlc3MgaW4gb2JqZWN0IGZpbGUgKi8KLX07Ci0KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLQotLyogVGhpcyBpcyBkb2N1bWVudGVkIHRvIGJlIGF0IDEwMjQsIGJ1dCBhcHBlYXJzIHRvIHJlYWxseSBiZSBhdCAyMDQ4LgotICAgRklYTUU/ISAgKi8KLSNkZWZpbmUgTl9UWFRPRkYoeCkJMjA0OAotCi0jZGVmaW5lCU5fVFhUU0laRSh4KSAoKHgpLmFfdGV4dCkKLQotI2RlZmluZSBOX0RBVEFERFIoeCkKLQotI2RlZmluZSBOX0JTU0FERFIoeCkKLQotLyogT2Zmc2V0cyBvZiB0aGUgdmFyaW91cyBwb3J0aW9ucyBvZiB0aGUgZmlsZSBhZnRlciB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpICkKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0MCi0vKiBTeW1ib2xzICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgewotICBiZmRfYnl0ZSBlX3N0cnhbQllURVNfSU5fV09SRF07CS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgYmZkX2J5dGUgZV90eXBlWzFdOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIGJmZF9ieXRlIGVfb3RoZXJbMV07CQkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICBiZmRfYnl0ZSBlX2Rlc2NbMl07CQkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX2J5dGUgZV92YWx1ZVtCWVRFU19JTl9XT1JEXTsJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotCi0jZGVmaW5lIEVYVEVSTkFMX05MSVNUX1NJWkUgKEJZVEVTX0lOX1dPUkQrNCtCWVRFU19JTl9XT1JEKQotCi1zdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgewotICB1bnNpZ25lZCBsb25nIG5fc3RyeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgdW5zaWduZWQgc2hvcnQgbl9kZXNjOwkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX3ZtYSBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLQotLyogVGhlIG5fdHlwZSBmaWVsZCBpcyB0aGUgc3ltYm9sIHR5cGUsIGNvbnRhaW5pbmc6ICAqLwotCi0jZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wgKi8KLSNkZWZpbmUgTl9BQlMgCTIJLyogQWJzb2x1dGUgc3ltYm9sIC0tIGRlZmluZWQgYXQgcGFydGljdWxhciBhZGRyICovCi0jZGVmaW5lIE5fVEVYVCAJNAkvKiBUZXh0IHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB0ZXh0IHNlZyAqLwotI2RlZmluZSBOX0RBVEEgCTYJLyogRGF0YSBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gZGF0YSBzZWcgKi8KLSNkZWZpbmUgTl9CU1MgCTgJLyogQlNTICBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gemVybydkIHNlZyAqLwotI2RlZmluZQlOX0NPTU0JMHgxMgkvKiBDb21tb24gc3ltYm9sICh2aXNpYmxlIGFmdGVyIHNoYXJlZCBsaWIgZHlubGluaykgKi8KLSNkZWZpbmUgTl9GTgkweDFmCS8qIEZpbGUgbmFtZSBvZiAubyBmaWxlICovCi0jZGVmaW5lCU5fRk5fU0VRIDB4MEMJLyogTl9GTiBmcm9tIFNlcXVlbnQgY29tcGlsZXJzIChzaWdoKSAqLwotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgYmUgdXNlZnVsbHkgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChhcyBvcHBvc2VkIHRvIGxvY2FsLXRvLXRoaXMtZmlsZSkgKi8KLSNkZWZpbmUgTl9UWVBFICAweDFlCi0jZGVmaW5lIE5fU1RBQiAJMHhlMAkvKiBJZiBhbnkgb2YgdGhlc2UgYml0cyBhcmUgb24sIGl0J3MgYSBkZWJ1ZyBzeW1ib2wgKi8KLQotI2RlZmluZSBOX0lORFIgMHgwYQotCi0vKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgotICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCi0gICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0Ci0gICBlbGVtZW50cyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCi0gICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgotCi0gICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCi0gICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCi0gICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAotICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0KLS8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KLSNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0KLS8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLwotI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCi0KLS8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCi0gICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKLSAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKLQotLyogUmVsb2NhdGlvbnMgCi0KLSAgVGhlcmUJYXJlIHR3byB0eXBlcyBvZiByZWxvY2F0aW9uIGZsYXZvdXJzIGZvciBhLm91dCBzeXN0ZW1zLAotICBzdGFuZGFyZCBhbmQgZXh0ZW5kZWQuIFRoZSBzdGFuZGFyZCBmb3JtIGlzIHVzZWQgb24gc3lzdGVtcyB3aGVyZSB0aGUKLSAgaW5zdHJ1Y3Rpb24gaGFzIHJvb20gZm9yIGFsbCB0aGUgYml0cyBvZiBhbiBvZmZzZXQgdG8gdGhlIG9wZXJhbmQsIHdoaWxzdAotICB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1c2VkIHdoZW4gYW4gYWRkcmVzcyBvcGVyYW5kIGhhcyB0byBiZSBzcGxpdCBvdmVyIG4KLSAgaW5zdHJ1Y3Rpb25zLiBFZywgb24gdGhlIDY4aywgZWFjaCBtb3ZlIGluc3RydWN0aW9uIGNhbiByZWZlcmVuY2UKLSAgdGhlIHRhcmdldCB3aXRoIGEgZGlzcGxhY2VtZW50IG9mIDE2IG9yIDMyIGJpdHMuIE9uIHRoZSBzcGFyYywgbW92ZQotICBpbnN0cnVjdGlvbnMgdXNlIGFuIG9mZnNldCBvZiAxNCBiaXRzLCBzbyB0aGUgb2Zmc2V0IGlzIHN0b3JlZCBpbgotICB0aGUgcmVsb2MgZmllbGQsIGFuZCB0aGUgZGF0YSBpbiB0aGUgc2VjdGlvbiBpcyBpZ25vcmVkLgotKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2luZ2xlIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotICAgVGhlIHRleHQtcmVsb2NhdGlvbiBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGEgdmVjdG9yIG9mIHRoZXNlIHN0cnVjdHVyZXMsCi0gICBhbGwgb2Ygd2hpY2ggYXBwbHkgdG8gdGhlIHRleHQgc2VjdGlvbi4KLSAgIExpa2V3aXNlLCB0aGUgZGF0YS1yZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlIHJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJMHg4MAotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUJMHgwMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcJMHg2MAotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUJLyogVG8gc2hpZnQgdG8gdW5pdHMgcGxhY2UgKi8KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkweDA2Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUJMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcJMHgxMAotI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCTB4MDgKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkweDA4Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCTB4MDgKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcJMHgwNAotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJMHgwNAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwkweDAyCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRQkweDAyCi0KLSNkZWZpbmUJUkVMT0NfU1REX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSkJCS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCByZWxvY19zdGRfaW50ZXJuYWwKLXsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KLSAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCi0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAotICAgICBhbmQgaXQgc2hvdWxkIGJlIHJlbG9jYXRlZCBmb3IgY2hhbmdlcyBpbiBpdHMgb3duIGFkZHJlc3MKLSAgICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotICAgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKLSAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KLSAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKLSAgICAgaW4gZmlsZXMgdGhlIHN5bWJvbCB0YWJsZS4KLSAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLSAgICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCi0gICAgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCi0gIHVuc2lnbmVkIGludCByX2V4dGVybjoxOwotICAvKiBUaGUgbmV4dCB0aHJlZSBiaXRzIGFyZSBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIHNlZW0gdG8KLSAgICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0gIC8qIHVudXNlZCAqLwotICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KLX07Ci0KLQotLyogRVhURU5ERUQgUkVMT0NTICAqLwotCi1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIHsKLSAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotICBiZmRfYnl0ZSByX2FkZGVuZFtCWVRFU19JTl9XT1JEXTsJLyogZGF0dW0gYWRkZW5kCQkJCSovCi19OwotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcJMHg4MAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCTB4MDEKLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0JJRwkJMHgxRgotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRwkwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCTB4RjgKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUJMwotCi0vKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxICsgQllURVNfSU5fV09SRCkKLQotZW51bSByZWxvY190eXBlCi17Ci0gIC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLwotICBSRUxPQ184LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMzIsCQkJLyogZGF0YVswOjMxXSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLwotICBSRUxPQ19ESVNQOCwJCQkvKiBkYXRhWzA6N10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICBSRUxPQ19ESVNQMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AzMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgLyogU3BlY2lhbCAqLwotICBSRUxPQ19XRElTUDMwLAkJLyogZGF0YVswOjI5XSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfV0RJU1AyMiwJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX0hJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdik+PjEwIAkqLwotICBSRUxPQ18yMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSAJCSovCi0gIFJFTE9DXzEzLAkJCS8qIGRhdGFbMDoxMl0gPSAoYWRkZW5kICsgc3YpCQkqLwotICBSRUxPQ19MTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX1NGQV9CQVNFLAkJCi0gIFJFTE9DX1NGQV9PRkYxMywKLSAgLyogUC5JLkMuIChiYXNlLXJlbGF0aXZlKSAqLwotICBSRUxPQ19CQVNFMTAsICAJCS8qIE5vdCBzdXJlIC0gbWF5YmUgd2UgY2FuIGRvIHRoaXMgdGhlICovCi0gIFJFTE9DX0JBU0UxMywJCQkvKiByaWdodCB3YXkgbm93ICovCi0gIFJFTE9DX0JBU0UyMiwKLSAgLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICBSRUxPQ19QQzEwLAotICBSRUxPQ19QQzIyLAotICAvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICBSRUxPQ19KTVBfVEJMLAotICAvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICBSRUxPQ19TRUdPRkYxNiwKLSAgUkVMT0NfR0xPQl9EQVQsCi0gIFJFTE9DX0pNUF9TTE9ULAotICBSRUxPQ19SRUxBVElWRSwKLQotICBSRUxPQ18xMSwJCi0gIFJFTE9DX1dESVNQMl8xNCwKLSAgUkVMT0NfV0RJU1AxOSwKLSAgUkVMT0NfSEhJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdikgPj4gNDIgICAgICovCi0gIFJFTE9DX0hMTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikgPj4gMzIgICAgICAqLwotICAKLSAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgUkVMT0NfSlVNUFRBUkcsCi0gIFJFTE9DX0NPTlNULAotICBSRUxPQ19DT05TVEgsCi0gIAotICBOT19SRUxPQwotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbnRlcm5hbCB7Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGxvbmcJcl9pbmRleDsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU7CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF92bWEgcl9hZGRlbmQ7CQkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLSNlbmRpZgkJCQkvKiBfX0FfT1VUX0FET0JFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oIGIvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjc0M2M0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9hb3V0NjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKiBgYS5vdXQnIG9iamVjdC1maWxlIGRlZmluaXRpb25zLCBpbmNsdWRpbmcgZXh0ZW5zaW9ucyB0byA2NC1iaXQgZmllbGRzICovCi0KLSNpZm5kZWYgX19BX09VVF82NF9IX18KLSNkZWZpbmUgX19BX09VVF82NF9IX18KLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IG9uIGRpc2sgb2YgdGhlIDMyLWJpdCBvciA2NC1iaXQgZXhlYyBoZWFkZXIuICovCi0KLSNpZm5kZWYgZXh0ZXJuYWxfZXhlYwotc3RydWN0IGV4dGVybmFsX2V4ZWMgCi17Ci0gIGJmZF9ieXRlIGVfaW5mb1s0XTsJCS8qIG1hZ2ljIG51bWJlciBhbmQgc3R1ZmYJCSovCi0gIGJmZF9ieXRlIGVfdGV4dFtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2RhdGFbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHNlY3Rpb24gaW4gYnl0ZXMJKi8KLSAgYmZkX2J5dGUgZV9ic3NbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBic3MgYXJlYSBpbiBieXRlcyAJCSovCi0gIGJmZF9ieXRlIGVfc3ltc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBpbiBieXRlcyAJKi8KLSAgYmZkX2J5dGUgZV9lbnRyeVtCWVRFU19JTl9XT1JEXTsgLyogc3RhcnQgYWRkcmVzcyAJCQkqLwotICBiZmRfYnl0ZSBlX3Ryc2l6ZVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCi0gIGJmZF9ieXRlIGVfZHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gCSovCi19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoNCArIEJZVEVTX0lOX1dPUkQgKiA3KQotCi0vKiBNYWdpYyBudW1iZXJzIGZvciBhLm91dCBmaWxlcyAqLwotCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBPTUFHSUMgMHgxMDAxCQkvKiBDb2RlIGluZGljYXRpbmcgb2JqZWN0IGZpbGUgICovCi0jZGVmaW5lIFpNQUdJQyAweDEwMDIJCS8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAweDEwMDMJCS8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLwotCi0vKiBUaGVyZSBpcyBubyA2NC1iaXQgUU1BR0lDIGFzIGZhciBhcyBJIGtub3cuICAqLwotCi0jZGVmaW5lIE5fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCi0JCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAotICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQykKLSNlbHNlCi0jZGVmaW5lIE9NQUdJQyAwNDA3CQkvKiAuLi5vYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAwNDEwCQkvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgWk1BR0lDIDA0MTMJCS8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIEJNQUdJQyAwNDE1CQkvKiBVc2VkIGJ5IGEgYi5vdXQgb2JqZWN0LiAgKi8KLQotLyogVGhpcyBpbmRpY2F0ZXMgYSBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZSB3aXRoIHRoZSBoZWFkZXIgaW4gdGhlIHRleHQuCi0gICBJdCBpcyB1c2VkIGJ5IDM4NkJTRCAoYW5kIHZhcmlhbnRzKSBhbmQgTGludXgsIGF0IGxlYXN0LiAgKi8KLSNpZm5kZWYgUU1BR0lDCi0jZGVmaW5lIFFNQUdJQyAwMzE0Ci0jZW5kaWYKLSMgaWZuZGVmIE5fQkFETUFHCi0jICBkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0gIAkJCSYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDIFwKLQkJICAgICAgICAmJiBOX01BR0lDKHgpICE9IFFNQUdJQykKLSMgZW5kaWYgLyogTl9CQURNQUcgKi8KLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmZGVmIFFNQUdJQwotI2RlZmluZSBOX0lTX1FNQUdJQyh4KSAoTl9NQUdJQyAoeCkgPT0gUU1BR0lDKQotI2Vsc2UKLSNkZWZpbmUgTl9JU19RTUFHSUMoeCkgKDApCi0jZW5kaWYKLQotLyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBUQVJHRVRfUEFHRV9TSVpFIGFuZCBOX1NFR1NJWkUgaXMgdGhhdCBUQVJHRVRfUEFHRV9TSVpFIGlzCi0gICB0aGUgZmluZXN0IGdyYW51bGFyaXR5IGF0IHdoaWNoIHlvdSBjYW4gcGFnZSBzb21ldGhpbmcsIHRodXMgaXQKLSAgIGNvbnRyb2xzIHRoZSBwYWRkaW5nIChpZiBhbnkpIGJlZm9yZSB0aGUgdGV4dCBzZWdtZW50IG9mIGEgWk1BR0lDCi0gICBmaWxlLiAgTl9TRUdTSVpFIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoaW5ncyBjYW4gYmUgbWFya2VkIGFzCi0gICByZWFkLW9ubHkgdmVyc3VzIHJlYWQvd3JpdGUsIHNvIGl0IGNvbnRyb2xzIHRoZSBwYWRkaW5nIGJldHdlZW4gdGhlCi0gICB0ZXh0IHNlZ21lbnQgYW5kIHRoZSBkYXRhIHNlZ21lbnQgKGluIG1lbW9yeTsgb24gZGlzayB0aGUgcGFkZGluZwotICAgYmV0d2VlbiB0aGVtIGlzIFRBUkdFVF9QQUdFX1NJWkUpLiAgVEFSR0VUX1BBR0VfU0laRSBhbmQgTl9TRUdTSVpFIGFyZSB0aGUgc2FtZQotICAgZm9yIG1vc3QgbWFjaGluZXMsIGJ1dCBkaWZmZXJlbnQgZm9yIHN1bjMuICAqLwotCi0vKiBCeSBkZWZhdWx0LCBzZWdtZW50IHNpemUgaXMgY29uc3RhbnQuICBCdXQgc29tZSBtYWNoaW5lcyBvdmVycmlkZSB0aGlzCi0gICB0byBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBhLm91dCBoZWFkZXIgKGUuZy4gbWFjaGluZSB0eXBlKS4gICovCi0KLSNpZm5kZWYJTl9TRUdTSVpFCi0jZGVmaW5lCU5fU0VHU0laRSh4KQlTRUdNRU5UX1NJWkUKLSNlbmRpZgotDAotLyogVmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgdGV4dCBzZWN0aW9uLgotICAgVGhpcyBpcyBnZXR0aW5nIHZlcnkgY29tcGxpY2F0ZWQuICBBIGdvb2QgcmVhc29uIHRvIGRpc2NhcmQgYS5vdXQgZm9ybWF0Ci0gICBmb3Igc29tZXRoaW5nIHRoYXQgc3BlY2lmaWVzIHRoZXNlIGZpZWxkcyBleHBsaWNpdGx5LiAgQnV0IHRpbCB0aGVuLi4uCi0KLSAgICogT01BR0lDIGFuZCBOTUFHSUMgZmlsZXM6Ci0gICAgICAgKG9iamVjdCBmaWxlczogdGV4dCBmb3IgInJlbG9jYXRhYmxlIGFkZHIgMCIgcmlnaHQgYWZ0ZXIgdGhlIGhlYWRlcikKLSAgICAgICBzdGFydCBhdCAwLCBvZmZzZXQgaXMgRVhFQ19CWVRFU19TSVpFLCBzaXplIGFzIHN0YXRlZC4KLSAgICogVGhlIHRleHQgYWRkcmVzcywgb2Zmc2V0LCBhbmQgc2l6ZSBvZiBaTUFHSUMgZmlsZXMgZGVwZW5kCi0gICAgIG9uIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgZmlsZToKLSAgICAgKiBlbnRyeSBwb2ludCBiZWxvdyBURVhUX1NUQVJUX0FERFI6Ci0gICAgICAgKGhhY2sgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMpCi0gICAgICAgc3RhcnQgYXQgMCwgb2Zmc2V0IGlzIDAsIHNpemUgYXMgc3RhdGVkLgotICAgICAqIElmIE5fSEVBREVSX0lOX1RFWFQoeCkgaXMgdHJ1ZSAod2hpY2ggZGVmYXVsdHMgdG8gYmVpbmcgdGhlCi0gICAgICAgY2FzZSB3aGVuIHRoZSBlbnRyeSBwb2ludCBpcyBFWEVDX0JZVEVTX1NJWkUgb3IgZnVydGhlciBpbnRvIGEgcGFnZSk6Ci0gICAgICAgbm8gcGFkZGluZyBpcyBuZWVkZWQ7IHRleHQgY2FuIHN0YXJ0IGFmdGVyIGV4ZWMgaGVhZGVyLiAgU3VuCi0gICAgICAgY29uc2lkZXJzIHRoZSB0ZXh0IHNlZ21lbnQgb2Ygc3VjaCBmaWxlcyB0byBpbmNsdWRlIHRoZSBleGVjIGhlYWRlcjsKLSAgICAgICBmb3IgQkZEJ3MgcHVycG9zZXMsIHdlIGRvbid0LCB3aGljaCBtYWtlcyBtb3JlIHdvcmsgZm9yIHVzLgotICAgICAgIHN0YXJ0IGF0IFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSwgb2Zmc2V0IGlzIEVYRUNfQllURVNfU0laRSwKLSAgICAgICBzaXplIGFzIHN0YXRlZCBtaW51cyBFWEVDX0JZVEVTX1NJWkUuCi0gICAgICogSWYgTl9IRUFERVJfSU5fVEVYVCh4KSBpcyBmYWxzZSAod2hpY2ggZGVmYXVsdHMgdG8gYmVpbmcgdGhlIGNhc2Ugd2hlbgotICAgICAgIHRoZSBlbnRyeSBwb2ludCBpcyBsZXNzIHRoYW4gRVhFQ19CWVRFU19TSVpFIGludG8gYSBwYWdlIChlLmcuIHBhZ2UKLSAgICAgICBhbGlnbmVkKSk6IChwYWRkaW5nIGlzIG5lZWRlZCBzbyB0aGF0IHRleHQgY2FuIHN0YXJ0IGF0IGEgcGFnZSBib3VuZGFyeSkKLSAgICAgICBzdGFydCBhdCBURVhUX1NUQVJUX0FERFIsIG9mZnNldCBUQVJHRVRfUEFHRV9TSVpFLCBzaXplIGFzIHN0YXRlZC4KLQotICAgIFNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIG1heSB3YW50IHRvIGhhcmR3aXJlIE5fSEVBREVSX0lOX1RFWFQsCi0gICAgZm9yIGVmZmljaWVuY3kgb3IgdG8gYWxsb3cgcGVvcGxlIHRvIHBsYXkgZ2FtZXMgd2l0aCB0aGUgZW50cnkgcG9pbnQuCi0gICAgSW4gdGhhdCBjYXNlLCB5b3Ugd291bGQgI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIGFzIDEgZm9yIHN1bm9zLAotICAgIGFuZCBhcyAwIGZvciBtb3N0IG90aGVyIGhvc3RzIChTb255IE5ld3MsIFZheCBVbHRyaXgsIGV0YykuCi0gICAgKERvIHRoaXMgaW4gdGhlIGFwcHJvcHJpYXRlIGJmZCB0YXJnZXQgZmlsZS4pCi0gICAgKFRoZSBkZWZhdWx0IGlzIGEgaGV1cmlzdGljIHRoYXQgd2lsbCBicmVhayBpZiBwZW9wbGUgdHJ5IGNoYW5naW5nCi0gICAgdGhlIGVudHJ5IHBvaW50LCBwZXJoYXBzIHdpdGggdGhlIGxkIC1lIGZsYWcuKQotCi0gICAgKiBRTUFHSUMgaXMgYWx3YXlzIGxpa2UgYSBaTUFHSUMgZm9yIHdoaWNoIE5fSEVBREVSX0lOX1RFWFQgaXMgdHJ1ZSwKLSAgICBhbmQgZm9yIHdoaWNoIHRoZSBzdGFydGluZyBhZGRyZXNzIGlzIFRBUkdFVF9QQUdFX1NJWkUgKG9yIHNob3VsZCB0aGlzIGJlCi0gICAgU0VHTUVOVF9TSVpFPykgKFRFWFRfU1RBUlRfQUREUiBvbmx5IGFwcGxpZXMgdG8gWk1BR0lDLCBub3QgdG8gUU1BR0lDKS4KLSAgICAqLwotCi0vKiBUaGlzIG1hY3JvIGlzIG9ubHkgcmVsZXZhbnQgZm9yIFpNQUdJQyBmaWxlczsgUU1BR0lDIGFsd2F5cyBoYXMgdGhlIGhlYWRlcgotICAgaW4gdGhlIHRleHQuICAqLwotI2lmbmRlZiBOX0hFQURFUl9JTl9URVhUCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgKCgoeCkuYV9lbnRyeSAmIChUQVJHRVRfUEFHRV9TSVpFLTEpKSA+PSBFWEVDX0JZVEVTX1NJWkUpCi0jZW5kaWYKLQotLyogU3VuIHNoYXJlZCBsaWJyYXJpZXMsIG5vdCBsaW51eC4gIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCBmb3IgWk1BR0lDCi0gICBmaWxlcy4gICovCi0jaWZuZGVmIE5fU0hBUkVEX0xJQgotI2lmIGRlZmluZWQgKFRFWFRfU1RBUlRfQUREUikgJiYgVEVYVF9TVEFSVF9BRERSID09IDAKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpICgwKQotI2Vsc2UKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpICgoeCkuYV9lbnRyeSA8IFRFWFRfU1RBUlRfQUREUikKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFJldHVybmluZyAwIG5vdCBURVhUX1NUQVJUX0FERFIgZm9yIE9NQUdJQyBhbmQgTk1BR0lDIGlzIGJhc2VkIG9uCi0gICB0aGUgYXNzdW1wdGlvbiB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYSAubyBmaWxlLCBub3QgYW4KLSAgIGV4ZWN1dGFibGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgT01BR0lDIChidXQgbWVhbnMgd2UgZG9uJ3Qgd29yawotICAgcmlnaHQgb24gdGhlIG91dHB1dCBmcm9tIGxkIC1OKTsgbW9yZSBxdWVzdGlvbmFibGUgZm9yIE5NQUdJQy4gICovCi0KLSNpZm5kZWYgTl9UWFRBRERSCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKC8qIFRoZSBhZGRyZXNzIG9mIGEgUU1BR0lDIGZpbGUgaXMgYWx3YXlzIG9uZSBwYWdlIGluLCAqLyBcCi0gICAgIC8qIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gICovIFwKLSAgICAgTl9JU19RTUFHSUMgKHgpID8gVEFSR0VUX1BBR0VfU0laRSArIEVYRUNfQllURVNfU0laRSA6IFwKLSAgICAgTl9NQUdJQyh4KSAhPSBaTUFHSUMgPyAwIDoJLyogb2JqZWN0IGZpbGUgb3IgTk1BR0lDICovXAotICAgICBOX1NIQVJFRF9MSUIoeCkgPyAwIDoJXAotICAgICBOX0hFQURFUl9JTl9URVhUKHgpICA/CVwKLQkgICAgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFIDoJLyogbm8gcGFkZGluZyAqL1wKLQkgICAgVEVYVF9TVEFSVF9BRERSCQkJLyogYSBwYWdlIG9mIHBhZGRpbmcgKi9cCi0gICAgKQotI2VuZGlmCi0KLS8qIElmIE5fSEVBREVSX0lOX1RFWFQgaXMgbm90IHRydWUgZm9yIFpNQUdJQywgdGhlcmUgaXMgc29tZSBwYWRkaW5nCi0gICB0byBtYWtlIHRoZSB0ZXh0IHNlZ21lbnQgc3RhcnQgYXQgYSBjZXJ0YWluIGJvdW5kYXJ5LiAgRm9yIG1vc3QKLSAgIHN5c3RlbXMsIHRoaXMgYm91bmRhcnkgaXMgVEFSR0VUX1BBR0VfU0laRS4gIEJ1dCBmb3IgTGludXgsIGluIHRoZQotICAgdGltZS1ob25vcmVkIHRyYWRpdGlvbiBvZiBjcmF6eSBaTUFHSUMgaGFja3MsIGl0IGlzIDEwMjQgd2hpY2ggaXMKLSAgIG5vdCB3aGF0IFRBUkdFVF9QQUdFX1NJWkUgbmVlZHMgdG8gYmUgZm9yIFFNQUdJQy4gICovCi0KLSNpZm5kZWYgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRQotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotCi0jZGVmaW5lIE5fRElTS19CTE9DS19TSVpFKHgpIFwKLSAgKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSA6IFRBUkdFVF9QQUdFX1NJWkUpCi0KLS8qIE9mZnNldCBpbiBhbiBhLm91dCBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VjdGlvbi4gKi8KLSNpZm5kZWYgTl9UWFRPRkYKLSNkZWZpbmUgTl9UWFRPRkYoeCkJXAotICAgICgvKiBGb3Ige08sTixRfU1BR0lDLCBubyBwYWRkaW5nLiAgKi8gXAotICAgICBOX01BR0lDKHgpICE9IFpNQUdJQyA/IEVYRUNfQllURVNfU0laRSA6IFwKLSAgICAgTl9TSEFSRURfTElCKHgpID8gMCA6IFwKLSAgICAgTl9IRUFERVJfSU5fVEVYVCh4KSA/CVwKLQkgICAgRVhFQ19CWVRFU19TSVpFIDoJCQkvKiBubyBwYWRkaW5nICovXAotCSAgICBaTUFHSUNfRElTS19CTE9DS19TSVpFCQkvKiBhIHBhZ2Ugb2YgcGFkZGluZyAqL1wKLSAgICApCi0jZW5kaWYKLS8qIFNpemUgb2YgdGhlIHRleHQgc2VjdGlvbi4gIEl0J3MgYWx3YXlzIGFzIHN0YXRlZCwgZXhjZXB0IHRoYXQgd2UKLSAgIG9mZnNldCBpdCB0byBgdW5kbycgdGhlIGFkanVzdG1lbnQgdG8gTl9UWFRBRERSIGFuZCBOX1RYVE9GRgotICAgZm9yIFpNQUdJQyBmaWxlcyB0aGF0IG5vbWluYWxseSBpbmNsdWRlIHRoZSBleGVjIGhlYWRlcgotICAgYXMgcGFydCBvZiB0aGUgZmlyc3QgcGFnZSBvZiB0ZXh0LiAgKEJGRCBkb2Vzbid0IGNvbnNpZGVyIHRoZQotICAgZXhlYyBoZWFkZXIgdG8gYmUgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LikgICovCi0jaWZuZGVmIE5fVFhUU0laRQotI2RlZmluZQlOX1RYVFNJWkUoeCkgXAotICAgICgvKiBGb3IgUU1BR0lDLCB3ZSBkb24ndCBjb25zaWRlciB0aGUgaGVhZGVyIHBhcnQgb2YgdGhlIHRleHQgc2VjdGlvbi4gICovXAotICAgICBOX0lTX1FNQUdJQyAoeCkgPyAoeCkuYV90ZXh0IC0gRVhFQ19CWVRFU19TSVpFIDogXAotICAgICAoTl9NQUdJQyh4KSAhPSBaTUFHSUMgfHwgTl9TSEFSRURfTElCKHgpKSA/ICh4KS5hX3RleHQgOiBcCi0gICAgIE5fSEVBREVSX0lOX1RFWFQoeCkgID8JXAotCSAgICAoeCkuYV90ZXh0IC0gRVhFQ19CWVRFU19TSVpFOgkvKiBubyBwYWRkaW5nICovXAotCSAgICAoeCkuYV90ZXh0CQkJCS8qIGEgcGFnZSBvZiBwYWRkaW5nICovXAotICAgICkKLSNlbmRpZgotLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCBpbiB2aXJ0dWFsIG1lbW9yeS4KLSAgIEl0IGlzIHRoZSB0ZXh0IHNlZ21lbnQgYWRkcmVzcywgcGx1cyB0ZXh0IHNlZ21lbnQgc2l6ZSwgcm91bmRlZAotICAgdXAgdG8gYSBOX1NFR1NJWkUgYm91bmRhcnkgZm9yIHB1cmUgb3IgcGFnZWFibGUgZmlsZXMuICovCi0jaWZuZGVmIE5fREFUQUREUgotI2RlZmluZSBOX0RBVEFERFIoeCkgXAotICAgIChOX01BR0lDKHgpPT1PTUFHSUM/IChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCktMSkgJiB+KE5fU0VHU0laRSh4KS0xKSkpKQotI2VuZGlmCi0vKiBUaGUgYWRkcmVzcyBvZiB0aGUgQlNTIHNlZ21lbnQgLS0gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGRhdGEgc2VnbWVudC4gICovCi0KLSNkZWZpbmUgTl9CU1NBRERSKHgpCShOX0RBVEFERFIoeCkgKyAoeCkuYV9kYXRhKQotCi0vKiBPZmZzZXRzIG9mIHRoZSB2YXJpb3VzIHBvcnRpb25zIG9mIHRoZSBmaWxlIGFmdGVyIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotCi0vKiBGb3Ige1EsWn1NQUdJQywgdGhlcmUgaXMgcGFkZGluZyB0byBtYWtlIHRoZSBkYXRhIHNlZ21lbnQgc3RhcnQgb24KLSAgIGEgcGFnZSBib3VuZGFyeS4gIE1vc3Qgb2YgdGhlIHRpbWUgdGhlIGFfdGV4dCBmaWVsZCAoYW5kIHRodXMKLSAgIE5fVFhUU0laRSkgYWxyZWFkeSBjb250YWlucyB0aGlzIHBhZGRpbmcuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGZvcgotICAgQlNESSBhbmQvb3IgMzg2QlNEIGl0IHNvbWV0aW1lcyBkb2Vzbid0IGNvbnRhaW4gdGhlIHBhZGRpbmcsIGFuZAotICAgcGVyaGFwcyB3ZSBzaG91bGQgYmUgYWRkaW5nIGl0IGhlcmUuICBCdXQgdGhpcyBzZWVtcyBraW5kIG9mCi0gICBxdWVzdGlvbmFibGUgYW5kIHByb2JhYmx5IHNob3VsZCBiZSBCU0RJLzM4NkJTRC1zcGVjaWZpYyBpZiB3ZSBkbwotICAgZG8gaXQuCi0KLSAgIEZvciBOTUFHSUMgKGF0IGxlYXN0IGZvciBocDMwMCBCU0QsIHByb2JhYmx5IG90aGVycyksIHRoZXJlIGlzCi0gICBwYWRkaW5nIGluIG1lbW9yeSBvbmx5LCBub3Qgb24gZGlzaywgc28gd2UgbXVzdCAqbm90KiBldmVyIHBhZCBoZXJlCi0gICBmb3IgTk1BR0lDLiAgKi8KLQotI2lmbmRlZiBOX0RBVE9GRgotI2RlZmluZSBOX0RBVE9GRih4KSBcCi0gKE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9UUkVMT0ZGCi0jZGVmaW5lIE5fVFJFTE9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCi0jZW5kaWYKLSNpZm5kZWYgTl9EUkVMT0ZGCi0jZGVmaW5lIE5fRFJFTE9GRih4KQkoIE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZW5kaWYKLSNpZm5kZWYgTl9TWU1PRkYKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2VuZGlmCi0jaWZuZGVmIE5fU1RST0ZGCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLSNlbmRpZgotDAotLyogU3ltYm9scyAqLwotI2lmbmRlZiBleHRlcm5hbF9ubGlzdAotc3RydWN0IGV4dGVybmFsX25saXN0IHsKLSAgYmZkX2J5dGUgZV9zdHJ4W0JZVEVTX0lOX1dPUkRdOwkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIGJmZF9ieXRlIGVfdHlwZVsxXTsJCQkvKiB0eXBlIG9mIHN5bWJvbCAqLwotICBiZmRfYnl0ZSBlX290aGVyWzFdOwkJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgYmZkX2J5dGUgZV9kZXNjWzJdOwkJCS8qIGRlc2NyaXB0aW9uIGZpZWxkICovCi0gIGJmZF9ieXRlIGVfdmFsdWVbQllURVNfSU5fV09SRF07CS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLSNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAoQllURVNfSU5fV09SRCs0K0JZVEVTX0lOX1dPUkQpCi0jZW5kaWYKLQotc3RydWN0IGludGVybmFsX25saXN0IHsKLSAgdW5zaWduZWQgbG9uZyBuX3N0cng7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgb2YgbmFtZSAqLwotICB1bnNpZ25lZCBjaGFyIG5fdHlwZTsJCQkvKiB0eXBlIG9mIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyIG5fb3RoZXI7CQkvKiBtaXNjIGluZm8gKHVzdWFsbHkgZW1wdHkpICovCi0gIHVuc2lnbmVkIHNob3J0IG5fZGVzYzsJCS8qIGRlc2NyaXB0aW9uIGZpZWxkICovCi0gIGJmZF92bWEgbl92YWx1ZTsJCQkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLX07Ci0KLS8qIFRoZSBuX3R5cGUgZmllbGQgaXMgdGhlIHN5bWJvbCB0eXBlLCBjb250YWluaW5nOiAgKi8KLQotI2RlZmluZSBOX1VOREYJMAkvKiBVbmRlZmluZWQgc3ltYm9sICovCi0jZGVmaW5lIE5fQUJTIAkyCS8qIEFic29sdXRlIHN5bWJvbCAtLSBkZWZpbmVkIGF0IHBhcnRpY3VsYXIgYWRkciAqLwotI2RlZmluZSBOX1RFWFQgCTQJLyogVGV4dCBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gdGV4dCBzZWcgKi8KLSNkZWZpbmUgTl9EQVRBIAk2CS8qIERhdGEgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIGRhdGEgc2VnICovCi0jZGVmaW5lIE5fQlNTIAk4CS8qIEJTUyAgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIHplcm8nZCBzZWcgKi8KLSNkZWZpbmUJTl9DT01NCTB4MTIJLyogQ29tbW9uIHN5bWJvbCAodmlzaWJsZSBhZnRlciBzaGFyZWQgbGliIGR5bmxpbmspICovCi0jZGVmaW5lIE5fRk4JMHgxZgkvKiBGaWxlIG5hbWUgb2YgLm8gZmlsZSAqLwotI2RlZmluZQlOX0ZOX1NFUSAweDBDCS8qIE5fRk4gZnJvbSBTZXF1ZW50IGNvbXBpbGVycyAoc2lnaCkgKi8KLS8qIE5vdGU6IE5fRVhUIGNhbiBvbmx5IGJlIHVzZWZ1bGx5IE9SLWVkIHdpdGggTl9VTkRGLCBOX0FCUywgTl9URVhULAotICAgTl9EQVRBLCBvciBOX0JTUy4gIFdoZW4gdGhlIGxvdy1vcmRlciBiaXQgb2Ygb3RoZXIgdHlwZXMgaXMgc2V0LAotICAgKGUuZy4gTl9XQVJOSU5HIHZlcnN1cyBOX0ZOKSwgdGhleSBhcmUgdHdvIGRpZmZlcmVudCB0eXBlcy4gICovCi0jZGVmaW5lIE5fRVhUIAkxCS8qIEV4dGVybmFsIHN5bWJvbCAoYXMgb3Bwb3NlZCB0byBsb2NhbC10by10aGlzLWZpbGUpICovCi0jZGVmaW5lIE5fVFlQRSAgMHgxZQotI2RlZmluZSBOX1NUQUIgCTB4ZTAJLyogSWYgYW55IG9mIHRoZXNlIGJpdHMgYXJlIG9uLCBpdCdzIGEgZGVidWcgc3ltYm9sICovCi0KLSNkZWZpbmUgTl9JTkRSIDB4MGEKLQotLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KLSAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgotICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAotICAgZWxlbWVudHMgdmFsdWUgaXMgc3RvcmVkIGludG8gb25lIHdvcmQgb2YgdGhlIHNwYWNlLgotICAgVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNwYWNlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNldCAobnVtYmVyIG9mIGVsZW1lbnRzKS4KLQotICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHNldCBpcyBtYWRlIGludG8gYW4gTl9TRVRWIHN5bWJvbAotICAgd2hvc2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgc2V0LgotICAgVGhpcyBzeW1ib2wgYWN0cyBsaWtlIGEgTl9EQVRBIGdsb2JhbCBzeW1ib2wKLSAgIGluIHRoYXQgaXQgY2FuIHNhdGlzZnkgdW5kZWZpbmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLwotCi0vKiBUaGVzZSBhcHBlYXIgYXMgaW5wdXQgdG8gTEQsIGluIGEgLm8gZmlsZS4gICovCi0jZGVmaW5lCU5fU0VUQQkweDE0CQkvKiBBYnNvbHV0ZSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRUCTB4MTYJCS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VURAkweDE4CQkvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEIJMHgxQQkJLyogQnNzIHNldCBlbGVtZW50IHN5bWJvbCAqLwotCi0vKiBUaGlzIGlzIG91dHB1dCBmcm9tIExELiAgKi8KLSNkZWZpbmUgTl9TRVRWCTB4MUMJCS8qIFBvaW50ZXIgdG8gc2V0IHZlY3RvciBpbiBkYXRhIGFyZWEuICAqLwotCi0vKiBXYXJuaW5nIHN5bWJvbC4gVGhlIHRleHQgZ2l2ZXMgYSB3YXJuaW5nIG1lc3NhZ2UsIHRoZSBuZXh0IHN5bWJvbAotICAgaW4gdGhlIHRhYmxlIHdpbGwgYmUgdW5kZWZpbmVkLiBXaGVuIHRoZSBzeW1ib2wgaXMgcmVmZXJlbmNlZCwgdGhlCi0gICBtZXNzYWdlIGlzIHByaW50ZWQuICAqLwotCi0jZGVmaW5lCU5fV0FSTklORyAweDFlCi0KLS8qIFdlYWsgc3ltYm9scy4gIFRoZXNlIGFyZSBhIEdOVSBleHRlbnNpb24gdG8gdGhlIGEub3V0IGZvcm1hdC4gIFRoZQotICAgc2VtYW50aWNzIGFyZSB0aG9zZSBvZiBFTEYgd2VhayBzeW1ib2xzLiAgV2VhayBzeW1ib2xzIGFyZSBhbHdheXMKLSAgIGV4dGVybmFsbHkgdmlzaWJsZS4gIFRoZSBOX1dFQUs/IHZhbHVlcyBhcmUgc3F1ZWV6ZWQgaW50byB0aGUKLSAgIGF2YWlsYWJsZSBzbG90cy4gIFRoZSB2YWx1ZSBvZiBhIE5fV0VBS1Ugc3ltYm9sIGlzIDAuICBUaGUgdmFsdWVzCi0gICBvZiB0aGUgb3RoZXIgdHlwZXMgYXJlIHRoZSBkZWZpbml0aW9ucy4gICovCi0jZGVmaW5lIE5fV0VBS1UJMHgwZAkJLyogV2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLQSAweDBlCQkvKiBXZWFrIGFic29sdXRlIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS1QgMHgwZgkJLyogV2VhayB0ZXh0IHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0QgMHgxMAkJLyogV2VhayBkYXRhIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0IgMHgxMQkJLyogV2VhayBic3Mgc3ltYm9sLiAgKi8KLQotLyogUmVsb2NhdGlvbnMgCi0KLSAgVGhlcmUJYXJlIHR3byB0eXBlcyBvZiByZWxvY2F0aW9uIGZsYXZvdXJzIGZvciBhLm91dCBzeXN0ZW1zLAotICBzdGFuZGFyZCBhbmQgZXh0ZW5kZWQuIFRoZSBzdGFuZGFyZCBmb3JtIGlzIHVzZWQgb24gc3lzdGVtcyB3aGVyZSB0aGUKLSAgaW5zdHJ1Y3Rpb24gaGFzIHJvb20gZm9yIGFsbCB0aGUgYml0cyBvZiBhbiBvZmZzZXQgdG8gdGhlIG9wZXJhbmQsIHdoaWxzdAotICB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1c2VkIHdoZW4gYW4gYWRkcmVzcyBvcGVyYW5kIGhhcyB0byBiZSBzcGxpdCBvdmVyIG4KLSAgaW5zdHJ1Y3Rpb25zLiBFZywgb24gdGhlIDY4aywgZWFjaCBtb3ZlIGluc3RydWN0aW9uIGNhbiByZWZlcmVuY2UKLSAgdGhlIHRhcmdldCB3aXRoIGEgZGlzcGxhY2VtZW50IG9mIDE2IG9yIDMyIGJpdHMuIE9uIHRoZSBzcGFyYywgbW92ZQotICBpbnN0cnVjdGlvbnMgdXNlIGFuIG9mZnNldCBvZiAxNCBiaXRzLCBzbyB0aGUgb2Zmc2V0IGlzIHN0b3JlZCBpbgotICB0aGUgcmVsb2MgZmllbGQsIGFuZCB0aGUgZGF0YSBpbiB0aGUgc2VjdGlvbiBpcyBpZ25vcmVkLgotKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2luZ2xlIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotICAgVGhlIHRleHQtcmVsb2NhdGlvbiBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGEgdmVjdG9yIG9mIHRoZXNlIHN0cnVjdHVyZXMsCi0gICBhbGwgb2Ygd2hpY2ggYXBwbHkgdG8gdGhlIHRleHQgc2VjdGlvbi4KLSAgIExpa2V3aXNlLCB0aGUgZGF0YS1yZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlCXJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGJmZF9ieXRlIHJfaW5kZXhbM107CS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGJmZF9ieXRlIHJfdHlwZVsxXTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLX07Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUENSRUxfQklHCSgodW5zaWduZWQgaW50KSAweDgwKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDEpCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkoKHVuc2lnbmVkIGludCkgMHg2MCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRwk1Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDYpCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUJMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4MTApCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDgpCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4MDgpCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCSgodW5zaWduZWQgaW50KSAweDEwKQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwNCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFCSgodW5zaWduZWQgaW50KSAweDIwKQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwMikKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCSgodW5zaWduZWQgaW50KSAweDQwKQotCi0jZGVmaW5lCVJFTE9DX1NURF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEpCQkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2ludGVybmFsCi17Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogQWRkcmVzcyAod2l0aGluIHNlZ21lbnQpIHRvIGJlIHJlbG9jYXRlZC4gICovCi0gIC8qIFRoZSBtZWFuaW5nIG9mIHJfc3ltYm9sbnVtIGRlcGVuZHMgb24gcl9leHRlcm4uICAqLwotICB1bnNpZ25lZCBpbnQgcl9zeW1ib2xudW06MjQ7Ci0gIC8qIE5vbnplcm8gbWVhbnMgdmFsdWUgaXMgYSBwYy1yZWxhdGl2ZSBvZmZzZXQKLSAgICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCi0gICAgIGFzIHdlbGwgYXMgZm9yIGNoYW5nZXMgaW4gdGhlIHN5bWJvbCBvciBzZWN0aW9uIHNwZWNpZmllZC4gICovCi0gIHVuc2lnbmVkIGludCByX3BjcmVsOjE7Ci0gIC8qIExlbmd0aCAoYXMgZXhwb25lbnQgb2YgMikgb2YgdGhlIGZpZWxkIHRvIGJlIHJlbG9jYXRlZC4KLSAgICAgVGh1cywgYSB2YWx1ZSBvZiAyIGluZGljYXRlcyAxPDwyIGJ5dGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOjI7Ci0gIC8qIDEgPT4gcmVsb2NhdGUgd2l0aCB2YWx1ZSBvZiBzeW1ib2wuCi0gICAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCi0gICAgIGluIGZpbGVzIHRoZSBzeW1ib2wgdGFibGUuCi0gICAgIDAgPT4gcmVsb2NhdGUgd2l0aCB0aGUgYWRkcmVzcyBvZiBhIHNlZ21lbnQuCi0gICAgIHJfc3ltYm9sbnVtIGlzIE5fVEVYVCwgTl9EQVRBLCBOX0JTUyBvciBOX0FCUwotICAgICAodGhlIE5fRVhUIGJpdCBtYXkgYmUgc2V0IGFsc28sIGJ1dCBzaWduaWZpZXMgbm90aGluZykuICAqLwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogVGhlIG5leHQgdGhyZWUgYml0cyBhcmUgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBzZWVtIHRvCi0gICAgIGJlIHVuZG9jdW1lbnRlZC4gICovCi0gIHVuc2lnbmVkIGludCByX2Jhc2VyZWw6MTsJLyogTGlua2FnZSB0YWJsZSByZWxhdGl2ZSAqLwotICB1bnNpZ25lZCBpbnQgcl9qbXB0YWJsZToxOwkvKiBwYy1yZWxhdGl2ZSB0byBqdW1wIHRhYmxlICovCi0gIHVuc2lnbmVkIGludCByX3JlbGF0aXZlOjE7CS8qICJyZWxhdGl2ZSByZWxvY2F0aW9uIiAqLwotICAvKiB1bnVzZWQgKi8KLSAgdW5zaWduZWQgaW50IHJfcGFkOjE7CQkvKiBQYWRkaW5nIC0tIHNldCB0byB6ZXJvICovCi19OwotCi0KLS8qIEVYVEVOREVEIFJFTE9DUyAgKi8KLQotc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlIHJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGJmZF9ieXRlIHJfaW5kZXhbM107CS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGJmZF9ieXRlIHJfdHlwZVsxXTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX2J5dGUgcl9hZGRlbmRbQllURVNfSU5fV09SRF07CS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCSgodW5zaWduZWQgaW50KSAweDgwKQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCSgodW5zaWduZWQgaW50KSAweDAxKQotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCQkoKHVuc2lnbmVkIGludCkgMHgxRikKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcJMAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHhGOCkKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUJMwotCi0vKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxICsgQllURVNfSU5fV09SRCkKLQotZW51bSByZWxvY190eXBlCi17Ci0gIC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLwotICBSRUxPQ184LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMzIsCQkJLyogZGF0YVswOjMxXSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLwotICBSRUxPQ19ESVNQOCwJCQkvKiBkYXRhWzA6N10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICBSRUxPQ19ESVNQMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AzMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgLyogU3BlY2lhbCAqLwotICBSRUxPQ19XRElTUDMwLAkJLyogZGF0YVswOjI5XSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfV0RJU1AyMiwJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX0hJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdik+PjEwIAkqLwotICBSRUxPQ18yMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSAJCSovCi0gIFJFTE9DXzEzLAkJCS8qIGRhdGFbMDoxMl0gPSAoYWRkZW5kICsgc3YpCQkqLwotICBSRUxPQ19MTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX1NGQV9CQVNFLAkJCi0gIFJFTE9DX1NGQV9PRkYxMywKLSAgLyogUC5JLkMuIChiYXNlLXJlbGF0aXZlKSAqLwotICBSRUxPQ19CQVNFMTAsICAJCS8qIE5vdCBzdXJlIC0gbWF5YmUgd2UgY2FuIGRvIHRoaXMgdGhlICovCi0gIFJFTE9DX0JBU0UxMywJCQkvKiByaWdodCB3YXkgbm93ICovCi0gIFJFTE9DX0JBU0UyMiwKLSAgLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICBSRUxPQ19QQzEwLAotICBSRUxPQ19QQzIyLAotICAvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICBSRUxPQ19KTVBfVEJMLAotICAvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICBSRUxPQ19TRUdPRkYxNiwKLSAgUkVMT0NfR0xPQl9EQVQsCi0gIFJFTE9DX0pNUF9TTE9ULAotICBSRUxPQ19SRUxBVElWRSwKLQotICBSRUxPQ18xMSwJCi0gIFJFTE9DX1dESVNQMl8xNCwKLSAgUkVMT0NfV0RJU1AxOSwKLSAgUkVMT0NfSEhJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdikgPj4gNDIgICAgICovCi0gIFJFTE9DX0hMTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikgPj4gMzIgICAgICAqLwotICAKLSAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgUkVMT0NfSlVNUFRBUkcsCi0gIFJFTE9DX0NPTlNULAotICBSRUxPQ19DT05TVEgsCi0gIAotICAvKiBBbGwgdGhlIG5ldyBvbmVzIEkgY2FuIHRoaW5rIG9mLCBmb3Igc3BhcmMgdjkgKi8KLQotICBSRUxPQ182NCwJCQkvKiBkYXRhWzA6NjNdID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ19ESVNQNjQsCQkJLyogZGF0YVswOjYzXSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX1dESVNQMjEsCQkvKiBkYXRhWzA6MjBdID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19ESVNQMjEsCQkJLyogZGF0YVswOjIwXSA9IGFkZGVuZCAtIHBjICsgc3YgICAgICAgICovCi0gIFJFTE9DX0RJU1AxNCwJCQkvKiBkYXRhWzA6MTNdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgLyogUSAuCi0gICAgIFdoYXQgYXJlIHRoZSBvdGhlciBvbmVzLAotICAgICBTaW5jZSB0aGlzIGlzIGEgY2xlYW4gc2xhdGUsIGNhbiB3ZSB0aHJvdyBhd2F5IHRoZSBvbmVzIHdlIGRvbnQKLSAgICAgdW5kZXJzdGFuZCA/IFNob3VsZCB3ZSBzb3J0IHRoZSB2YWx1ZXMgPyBXaGF0IGFib3V0IHVzaW5nIGEKLSAgICAgbWljcm9jb2RlIGZvcm1hdCBsaWtlIHRoZSA2OGsgPwotICAgICAqLwotICBOT19SRUxPQwotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbnRlcm5hbCB7Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGxvbmcJcl9pbmRleDsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU7CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF92bWEgcl9hZGRlbmQ7CQkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLS8qIFEuCi0gICBTaG91bGQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRhYmxlIGJlIDQgYnl0ZXMgb3IgOCBieXRlcyA/Ci0KLSAgIFEuCi0gICBXaGF0IGFib3V0IGFyY2hpdmUgaW5kZXhlcyA/Ci0KLSAqLwotCi0jZW5kaWYJCQkJLyogX19BX09VVF82NF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9hci5oIGIvaW5jbHVkZS9hb3V0L2FyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNWRjZGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2FyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBhcmNoaXZlIGZpbGUgZGVmaW5pdGlvbiBmb3IgR05VIHNvZnR3YXJlICovCi0KLS8qIFNvIGZhciB0aGlzIGlzIGNvcnJlY3QgZm9yIEJTRGlzaCBhcmNoaXZlcy4gIERvbid0IGZvcmdldCB0aGF0Ci0gICBmaWxlcyBtdXN0IGJlZ2luIG9uIGFuIGV2ZW4gYnl0ZSBib3VuZGFyeS4gKi8KLQotI2lmbmRlZiBfX0dOVV9BUl9IX18KLSNkZWZpbmUgX19HTlVfQVJfSF9fCi0KLS8qIE5vdGUgdGhhdCB0aGUgdXN1YWwgJ1xuJyBpbiBtYWdpYyBzdHJpbmdzIG1heSB0cmFuc2xhdGUgdG8gZGlmZmVyZW50Ci0gICBjaGFyYWN0ZXJzLCBhcyBhbGxvd2VkIGJ5IEFOU0kuICAnXDAxMicgaGFzIGEgZml4ZWQgdmFsdWUsIGFuZCByZW1haW5zCi0gICBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgQlNEaXNoIGFyY2hpdmVzLiAqLwotCi0jZGVmaW5lIEFSTUFHICAiITxhcmNoPlwwMTIiCS8qIEZvciBDT0ZGIGFuZCBhLm91dCBhcmNoaXZlcyAqLwotI2RlZmluZSBBUk1BR0IgIiE8Ym91dD5cMDEyIgkvKiBGb3IgYi5vdXQgYXJjaGl2ZXMgKi8KLSNkZWZpbmUgU0FSTUFHIDgKLSNkZWZpbmUgQVJGTUFHICJgXDAxMiIKLQotLyogVGhlIGFyX2RhdGUgZmllbGQgb2YgdGhlIGFybWFwIChfXy5TWU1ERUYpIG1lbWJlciBvZiBhbiBhcmNoaXZlCi0gICBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbW9kaWZpZWQgZGF0ZSBvZiB0aGUgZW50aXJlIGZpbGUsIG9yIAotICAgQlNELWRlcml2ZWQgbGlua2VycyBjb21wbGFpbi4gIFdlIG9yaWdpbmFsbHkgd3JpdGUgdGhlIGFyX2RhdGUgd2l0aAotICAgdGhpcyBvZmZzZXQgZnJvbSB0aGUgcmVhbCBmaWxlJ3MgbW9kLXRpbWUuICBBZnRlciBmaW5pc2hpbmcgdGhlCi0gICBmaWxlLCB3ZSByZXdyaXRlIGFyX2RhdGUgaWYgaXQncyBub3Qgc3RpbGwgZ3JlYXRlciB0aGFuIHRoZSBtb2QgZGF0ZS4gICovCi0KLSNkZWZpbmUgQVJNQVBfVElNRV9PRkZTRVQgICAgICAgNjAKLQotc3RydWN0IGFyX2hkciB7Ci0gIGNoYXIgYXJfbmFtZVsxNl07CQkvKiBuYW1lIG9mIHRoaXMgbWVtYmVyICovCi0gIGNoYXIgYXJfZGF0ZVsxMl07CQkvKiBmaWxlIG10aW1lICovCi0gIGNoYXIgYXJfdWlkWzZdOwkJLyogb3duZXIgdWlkOyBwcmludGVkIGFzIGRlY2ltYWwgKi8KLSAgY2hhciBhcl9naWRbNl07CQkvKiBvd25lciBnaWQ7IHByaW50ZWQgYXMgZGVjaW1hbCAqLwotICBjaGFyIGFyX21vZGVbOF07CQkvKiBmaWxlIG1vZGUsIHByaW50ZWQgYXMgb2N0YWwgICAqLwotICBjaGFyIGFyX3NpemVbMTBdOwkJLyogZmlsZSBzaXplLCBwcmludGVkIGFzIGRlY2ltYWwgKi8KLSAgY2hhciBhcl9mbWFnWzJdOwkJLyogc2hvdWxkIGNvbnRhaW4gQVJGTUFHICovCi19OwotCi0jZW5kaWYgLyogX19HTlVfQVJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvZHluaXgzLmggYi9pbmNsdWRlL2FvdXQvZHluaXgzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZWVlYmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2R5bml4My5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIGEub3V0IHNwZWNpZmljcyBmb3IgU2VxdWVudCBTeW1tZXRyeSBydW5uaW5nIER5bml4IDMueAotICovCi0jaWZuZGVmIEFfT1VUX0RZTklYM19ICi0jZGVmaW5lIEFfT1VUX0RZTklYM19ICi0KLSNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBkeW5peF9leHRlcm5hbF9leGVjCi0KLS8qIHN0cnVjdCBleGVjIGZvciBEeW5peCAzCi0gKgotICogYV9nZHRibCBhbmQgYV9ib290c3RyYXAgYXJlIG9ubHkgZm9yIHN0YW5kYWxvbmUgYmluYXJpZXMuCi0gKiBTaGFyZWQgZGF0YSBmaWVsZHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCBhcyBvZiBEeW5peCAzLjEsCi0gKiBidXQgYXJlIHN1cHBvcnRlZCBieSBEeW5peCBjb21waWxlciBwcm9ncmFtcy4KLSAqLwotc3RydWN0IGR5bml4X2V4dGVybmFsX2V4ZWMgewotCXVuc2lnbmVkIGNoYXIgZV9pbmZvWzRdOwotCXVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOwotCXVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9ic3NbNF07Ci0JdW5zaWduZWQgY2hhciBlX3N5bXNbNF07Ci0JdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOwotCXVuc2lnbmVkIGNoYXIgZV90cnNpemVbNF07Ci0JdW5zaWduZWQgY2hhciBlX2Ryc2l6ZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZ19jb2RlWzhdLCBlX2dfZGF0YVs4XSwgZV9nX2Rlc2NbOF07Ci0JdW5zaWduZWQgY2hhciBlX3NoZGF0YVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfc2hic3NbNF07Ci0JdW5zaWduZWQgY2hhciBlX3NoZHJzaXplWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9ib290c3RyYXBbNDRdOwotCXVuc2lnbmVkIGNoYXIgZV9yZXNlcnZlZFsxMl07Ci0JdW5zaWduZWQgY2hhciBlX3ZlcnNpb25bNF07Ci19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoMTI4KQotCi0vKgotICogQWxsIGV4ZWN1dGFibGVzIHVuZGVyIER5bml4IGFyZSBkZW1hbmQgcGFnZWQgd2l0aCByZWFkLW9ubHkgdGV4dCwKLSAqIFRodXMgbm8gTk1BR0lDLgotICoKLSAqIFpNQUdJQyBoYXMgYSBwYWdlIG9mIDBzIGF0IHZpcnR1YWwgMCwKLSAqIFhNQUdJQyBoYXMgYW4gaW52YWxpZCBwYWdlIGF0IHZpcnR1YWwgMAotICovCi0jZGVmaW5lIE9NQUdJQwkweDEyZWIJCS8qIC5vICovCi0jZGVmaW5lIFpNQUdJQwkweDIyZWIJCS8qIHplcm8gQCAwLCBkZW1hbmQgbG9hZCAqLwotI2RlZmluZSBYTUFHSUMJMHgzMmViCQkvKiBpbnZhbGlkIEAgMCwgZGVtYW5kIGxvYWQgKi8KLSNkZWZpbmUgU01BR0lDCTB4NDJlYgkJLyogc3RhbmRhbG9uZSwgbm90IHN1cHBvcnRlZCBoZXJlICovCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkgKChPTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAotCQkgICAgIChaTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAotCQkgICAgIChYTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAotCQkgICAgIChTTUFHSUMgIT0gTl9NQUdJQyh4KSkpCi0KLSNkZWZpbmUgTl9BRERSQURKKHgpICgoWk1BR0lDID09IE5fTUFHSUMoeCkgfHwgWE1BR0lDID09IE5fTUFHSUMoeCkpID8gMHgxMDAwIDogMCkKLQotI2RlZmluZSBOX1RYVE9GRih4KSAoRVhFQ19CWVRFU19TSVpFKQotI2RlZmluZSBOX0RBVE9GRih4KSAoTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkpCi0jZGVmaW5lIE5fU0hEQVRPRkYoeCkgKE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSkKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpIChOX1NIREFUT0ZGKHgpICsgKHgpLmFfc2hkYXRhKQotI2RlZmluZSBOX0RSRUxPRkYoeCkgKE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9TSERSRUxPRkYoeCkgKE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1PRkYoeCkgKE5fU0hEUkVMT0ZGKHgpICsgKHgpLmFfc2hkcnNpemUpCi0jZGVmaW5lIE5fU1RST0ZGKHgpIChOX1NZTU9GRih4KSArICh4KS5hX3N5bXMpCi0KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLQkoKChPTUFHSUMgPT0gTl9NQUdJQyh4KSkgfHwgKFNNQUdJQyA9PSBOX01BR0lDKHgpKSkgPyAwIFwKLQkgOiBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUpCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpIFwKLQkoKChPTUFHSUMgPT0gTl9NQUdJQyh4KSkgfHwgKFNNQUdJQyA9PSBOX01BR0lDKHgpKSkgPyAoKHgpLmFfdGV4dCkgXAotCSA6ICgoeCkuYV90ZXh0IC0gTl9BRERSQURKKHgpIC0gRVhFQ19CWVRFU19TSVpFKSkKLQotI2VuZGlmIC8qIEFfT1VUX0RZTklYM19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvZW5jYXAuaCBiL2luY2x1ZGUvYW91dC9lbmNhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjE1ZDQ5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9lbmNhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIFlldCBBbm90aGVyIFRyeSBhdCBlbmNhcHN1bGF0aW5nIGJzZCBvYmplY3QgZmlsZXMgaW4gY29mZi4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUGFjZSBXaWxsaXNzb24gMTIvOS84OAotCi0gICBUaGlzIGZpbGUgaXMgb2Jzb2xldGUuICBJdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8ganVzdCBkZWZpbmUgYSBidW5jaAotICAgb2Ygc3R1ZmYgdGhhdCBCRkQgY2FuIHVzZSB0byBkbyBjb2ZmLWVuY2Fwc3VsYXRlZCBmaWxlcy4gIC0tZ251QGN5Z251cy5jb20KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFdlIG9ubHkgdXNlIHRoZSBjb2ZmIGhlYWRlcnMgdG8gdGVsbCB0aGUga2VybmVsCi0gKiBob3cgdG8gZXhlYyB0aGUgZmlsZS4gIFRoZXJlZm9yZSwgdGhlIG9ubHkgZmllbGRzIHRoYXQgbmVlZCB0byAKLSAqIGJlIGZpbGxlZCBpbiBhcmUgdGhlIHNjbnB0ciBhbmQgdmFkZHIgZm9yIHRoZSB0ZXh0IGFuZCBkYXRhCi0gKiBzZWN0aW9ucywgYW5kIHRoZSB2YWRkciBmb3IgdGhlIGJzcy4gIEFzIGZhciBhcyBjb2ZmIGlzIGNvbmNlcm5lZCwKLSAqIHRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZSwgcmVsb2NhdGlvbiwgb3IgbGluZSBudW1iZXJzLgotICoKLSAqIEEgbm9ybWFsIGJzZCBoZWFkZXIgKHN0cnVjdCBleGVjKSBpcyBwbGFjZWQgYWZ0ZXIgdGhlIGNvZmYgaGVhZGVycywKLSAqIGFuZCBiZWZvcmUgdGhlIHJlYWwgdGV4dC4gIEkgZGVmaW5lZCBhIHRoZSBuZXcgZmllbGRzICdhX21hY2h0eXBlJwotICogYW5kIGFfZmxhZ3MuICBJZiBhX21hY2h0eXBlIGlzIE1fMzg2LCBhbmQgYV9mbGFncyAmIEFfRU5DQVAgaXMKLSAqIHRydWUsIHRoZW4gdGhlIGJzZCBoZWFkZXIgaXMgcHJlY2VlZGVkIGJ5IGEgY29mZiBoZWFkZXIuICBNYWNyb3MKLSAqIGxpa2UgTl9UWFRPRkYgYW5kIE5fVFhUQUREUiB1c2UgdGhpcyBmaWVsZCB0byBmaW5kIHRoZSBic2QgaGVhZGVyLgotICogCi0gKiBUaGUgb25seSBwcm9ibGVtIGlzIHRvIHRyYWNrIGRvd24gdGhlIGJzZCBleGVjIGhlYWRlci4gIFRoZQotICogbWFjcm9zIEhFQURFUl9PRkZTRVQsIGV0YyBkbyB0aGlzLgotICovCi0KLSNkZWZpbmUgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFIDB4MjAgLyogY29mZiBoZWFkZXIgcHJlY2VkZXMgYnNkIGhlYWRlciAqLwotCi0vKiBEZXNjcmliZSB0aGUgQ09GRiBoZWFkZXIgdXNlZCBmb3IgZW5jYXBzdWxhdGlvbi4gICovCi0KLXN0cnVjdCBjb2ZmaGVhZGVyCi17Ci0gIC8qIGZpbGVoZHIgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9tYWdpYzsKLSAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsKLSAgbG9uZyBmX3RpbWRhdDsKLSAgbG9uZyBmX3N5bXB0cjsKLSAgbG9uZyBmX25zeW1zOwotICB1bnNpZ25lZCBzaG9ydCBmX29wdGhkcjsKLSAgdW5zaWduZWQgc2hvcnQgZl9mbGFnczsKLSAgLyogYW91dGhkciAqLwotICBzaG9ydCBtYWdpYzsKLSAgc2hvcnQgdnN0YW1wOwotICBsb25nIHRzaXplOwotICBsb25nIGRzaXplOwotICBsb25nIGJzaXplOwotICBsb25nIGVudHJ5OwotICBsb25nIHRleHRfc3RhcnQ7Ci0gIGxvbmcgZGF0YV9zdGFydDsKLSAgc3RydWN0IGNvZmZzY24KLSAgICB7Ci0gICAgICBjaGFyIHNfbmFtZVs4XTsKLSAgICAgIGxvbmcgc19wYWRkcjsKLSAgICAgIGxvbmcgc192YWRkcjsKLSAgICAgIGxvbmcgc19zaXplOwotICAgICAgbG9uZyBzX3NjbnB0cjsKLSAgICAgIGxvbmcgc19yZWxwdHI7Ci0gICAgICBsb25nIHNfbG5ub3B0cjsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHNfbnJlbG9jOwotICAgICAgdW5zaWduZWQgc2hvcnQgc19ubG5ubzsKLSAgICAgIGxvbmcgc19mbGFnczsKLSAgICB9IHNjbnNbM107Ci19OwotDAotLyogRGVzY3JpYmUgc29tZSBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZW5jYXBzdWxhdGlvbiwKLSAgIGluY2x1ZGluZyBob3cgdG8gZmluZCB0aGUgZW5jYXBzdWxhdGVkIEJTRCBoZWFkZXIuICAqLwotCi0vKiBGSVhNRSwgdGhpcyBpcyBkdW1iLiAgVGhlIHNhbWUgdG9vbHMgY2FuJ3QgaGFuZGxlIGEub3V0cyBmb3IgZGlmZmVyZW50Ci0gICBhcmNoaXRlY3R1cmVzLCBqdXN0IGJlY2F1c2UgQ09GRl9NQUdJQyBpcyBkaWZmZXJlbnQ7IHNvIHlvdSBuZWVkIGEKLSAgIHNlcGFyYXRlIEdOVSBubSBmb3IgZXZlcnkgYXJjaGl0ZWN0dXJlISE/ICBVbmZvcnR1bmF0ZWx5LCBpdCBuZWVkcyB0bwotICAgYmUgdGhpcyB3YXksIHNpbmNlIHRoZSBDT0ZGX01BR0lDIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGtlcm5lbAotICAgd2UncmUgdHJ5aW5nIHRvIGZvb2wgaGVyZS4gICovCi0gICAKLSNkZWZpbmUgQ09GRl9NQUdJQ19JMzg2IDA1MTQgLyogSTM4Nk1BR0lDICovCi0jZGVmaW5lIENPRkZfTUFHSUNfTTY4SyAwNTIwIC8qIE1DNjhNQUdJQyAqLwotI2RlZmluZQlDT0ZGX01BR0lDX0EyOUsgMHgxN0EJLyogVXNlZCBieSBhc20yOWsgY3Jvc3MtdG9vbHMgKi8KLQotI2lmZGVmIENPRkZfTUFHSUMKLXNob3J0IF9faGVhZGVyX29mZnNldF90ZW1wOwotI2RlZmluZSBIRUFERVJfT0ZGU0VUKGYpIFwKLQkoX19oZWFkZXJfb2Zmc2V0X3RlbXAgPSAwLCBcCi0JIGZyZWFkICgoY2hhciAqKSZfX2hlYWRlcl9vZmZzZXRfdGVtcCwgc2l6ZW9mIChzaG9ydCksIDEsIChmKSksIFwKLQkgZnNlZWsgKChmKSwgLXNpemVvZiAoc2hvcnQpLCAxKSwgXAotCSBfX2hlYWRlcl9vZmZzZXRfdGVtcD09Q09GRl9NQUdJQyA/IHNpemVvZihzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQotI2Vsc2UKLSNkZWZpbmUgSEVBREVSX09GRlNFVChmKSAwCi0jZW5kaWYKLQotI2RlZmluZSBIRUFERVJfU0VFSyhmKSAoZnNlZWsgKChmKSwgSEVBREVSX09GRlNFVCgoZikpLCAxKSkKLQwKLS8qIERlc2NyaWJlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIEJTRCBoZWFkZXIKLSAgIHRoYXQgYXBwZWFycyBpbnNpZGUgdGhlIGVuY2Fwc3VsYXRpb24uICAqLwotCi0vKiBFbmNhcHN1bGF0ZWQgY29mZiBmaWxlcyB0aGF0IGFyZSBsaW5rZWQgWk1BR0lDIGhhdmUgYSB0ZXh0IHNlZ21lbnQKLSAgIG9mZnNldCBqdXN0IHBhc3QgdGhlIGhlYWRlciAoYW5kIGEgbWF0Y2hpbmcgVFhUQUREUiksIGV4Y2x1ZGluZwotICAgdGhlIGhlYWRlcnMgZnJvbSB0aGUgdGV4dCBzZWdtZW50IHByb3BlciBidXQga2VlcGluZyB0aGUgcGh5c2ljYWwKLSAgIGxheW91dCBhbmQgdGhlIHZpcnR1YWwgbWVtb3J5IGxheW91dCBwYWdlLWFsaWduZWQuCi0KLSAgIE5vbi1lbmNhcHN1bGF0ZWQgYS5vdXQgZmlsZXMgdGhhdCBhcmUgbGlua2VkIFpNQUdJQyBoYXZlIGEgdGV4dAotICAgc2VnbWVudCB0aGF0IHN0YXJ0cyBhdCAwIGFuZCBhbiBOX1RYVEFEUiBzaW1pbGFybHkgb2Zmc2V0IHRvIDAuCi0gICBUaGV5IHRvbyBhcmUgcGFnZS1hbGlnbmVkIHdpdGggZWFjaCBvdGhlciwgYnV0IHRoZXkgaW5jbHVkZSB0aGUKLSAgIGEub3V0IGhlYWRlciBhcyBwYXJ0IG9mIHRoZSB0ZXh0LiAKLQotICAgVGhlIF9OX0hEUk9GRiBnZXRzIHNpemVvZiBzdHJ1Y3QgZXhlYyBhZGRlZCB0byBpdCwgc28gd2UgaGF2ZQotICAgdG8gY29tcGVuc2F0ZSBoZXJlLiAgU2VlIDxhLm91dC5nbnUuaD4uICAqLwotCi0jdW5kZWYgX05fSERST0ZGCi0jdW5kZWYgTl9UWFRBRERSCi0jdW5kZWYgTl9EQVRBRERSCi0KLSNkZWZpbmUgX05fSERST0ZGKHgpICgoTl9GTEFHUyh4KSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkgPyBcCi0JCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpIDogMCkKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0JKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKLQkgc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgKyBzaXplb2YgKHN0cnVjdCBleGVjKSA6IDApCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDQwMDAwMAotCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0JKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKLQkgKFNFR01FTlRfU0laRSArICgoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQtMSkgJiB+KFNFR01FTlRfU0laRS0xKSkpIDogXAotCSAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hvc3QuaCBiL2luY2x1ZGUvYW91dC9ob3N0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzYyMTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIFBhcmFtZXRlcnMgYWJvdXQgdGhlIGEub3V0IGZvcm1hdCwgYmFzZWQgb24gdGhlIGhvc3Qgc3lzdGVtIG9uIHdoaWNoCi0gICB0aGUgcHJvZ3JhbSBpcyBjb21waWxlZC4gICovCi0KLS8qIEFkZHJlc3Mgb2YgZGF0YSBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuCi0gICBJdCBpcyB1cCB0byB5b3UgdG8gZGVmaW5lIFNFR01FTlRfU0laRQotICAgb24gbWFjaGluZXMgbm90IGxpc3RlZCBoZXJlLiAgKi8KLSNpZm5kZWYgU0VHTUVOVF9TSVpFCi0jaWYgZGVmaW5lZChocDMwMCkgfHwgZGVmaW5lZChweXIpCi0jZGVmaW5lIFNFR01FTlRfU0laRSBwYWdlX3NpemUKLSNlbmRpZgotI2lmZGVmCXNvbnkKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCTB4MTAwMAotI2VuZGlmCS8qIFNvbnkuICAqLwotI2lmZGVmIGlzNjhrCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDIwMDAwCi0jZW5kaWYKLSNpZiBkZWZpbmVkKG02OGspICYmIGRlZmluZWQoUE9SVEFSKQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4NDAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLSNlbmRpZiAvKiFkZWZpbmVkKFNFR01FTlRfU0laRSkqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaHAuaCBiL2luY2x1ZGUvYW91dC9ocC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDJmNDljLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9ocC5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogU3BlY2lhbCB2ZXJzaW9uIG9mIDxhLm91dC5oPiBmb3IgdXNlIHVuZGVyIGhwLXV4LgotICAgQ29weXJpZ2h0IDE5ODgsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRISVMgRklMRSBJUyBPQlNPTEVURS4gIEl0IG5lZWRzIHRvIGJlIHJldmlzZWQgYXMgYSB2YXJpYW50ICJleHRlcm5hbCIKLSAgIGEub3V0IGZvcm1hdCBmb3IgdXNlIHdpdGggQkZELiAgKi8KLQotLyogVGhlIGBleGVjJyBzdHJ1Y3R1cmUgYW5kIG92ZXJhbGwgbGF5b3V0IG11c3QgYmUgY2xvc2UgdG8gSFAncyB3aGVuCi0gICB3ZSBhcmUgcnVubmluZyBvbiBhbiBIUCBzeXN0ZW0sIG90aGVyd2lzZSB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvCi0gICBleGVjdXRlIHRoZSByZXN1bHRpbmcgZmlsZS4gKi8KLQotLyogQWxsb3cgdGhpcyBmaWxlIHRvIGJlIGluY2x1ZGVkIHR3aWNlLiAqLwotI2lmbmRlZiBfX0dOVV9FWEVDX01BQ1JPU19fCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIHNob3J0IGFfbWFjaHR5cGU7CS8qIG1hY2hpbmUgdHlwZSAqLwotICB1bnNpZ25lZCBzaG9ydCBhX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMTsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMjsKLSAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CQkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMzsJLyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNDsJLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU1OwkvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNjsJLyogSFAgPSBzb3VyY2UgbGluZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTc7CS8qIEhQID0gdmFsdWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU4OwotfTsKLQotLyogVGVsbCBhLm91dC5nbnUuaCBub3QgdG8gZGVmaW5lIGBzdHJ1Y3QgZXhlYycuICAqLwotI2RlZmluZSBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KLQotI2luY2x1ZGUgIi4uL2Eub3V0LmdudS5oIgotCi0jdW5kZWYgTl9NQUdJQwotI3VuZGVmIE5fTUFDSFRZUEUKLSN1bmRlZiBOX0ZMQUdTCi0jdW5kZWYgTl9TRVRfSU5GTwotI3VuZGVmIE5fU0VUX01BR0lDCi0jdW5kZWYgTl9TRVRfTUFDSFRZUEUKLSN1bmRlZiBOX1NFVF9GTEFHUwotCi0jZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKSAuIGFfbWFnaWMpCi0jZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgKChleGVjKSAuIGFfbWFjaHR5cGUpCi0jZGVmaW5lIE5fU0VUX01BR0lDKGV4ZWMsIG1hZ2ljKSAoKChleGVjKSAuIGFfbWFnaWMpID0gKG1hZ2ljKSkKLSNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpICgoKGV4ZWMpIC4gYV9tYWNodHlwZSkgPSAobWFjaHR5cGUpKQotCi0jdW5kZWYgTl9CQURNQUcKLSNkZWZpbmUgTl9CQURNQUcoeCkgKChfTl9CQURNQUcgKHgpKSB8fCAoX05fQkFETUFDSCAoeCkpKQotCi0jZGVmaW5lIF9OX0JBRE1BQ0goeCkJCQkJCQkJXAotKCgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTAwMFMyMDBfSUQpICYmCQkJCQlcCi0gKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5OHg2X0lEKSkKLQotI2RlZmluZSBIUDk4eDZfSUQgMHgyMEEKLSNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDIwQwotCi0jdW5kZWYgX05fSERST0ZGCi0jZGVmaW5lIF9OX0hEUk9GRih4KSAoU0VHTUVOVF9TSVpFIC0gKHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKLQotI2RlZmluZSBTRUdNRU5UX1NJWkUgMHgxMDAwCi0KLSNlbmRpZiAvKiBfX0dOVV9FWEVDX01BQ1JPU19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmggYi9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDUxOTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hwMzAwaHB1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qIFNwZWNpYWwgdmVyc2lvbiBvZiA8YS5vdXQuaD4gZm9yIHVzZSB1bmRlciBocC11eC4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAqLwotCi1zdHJ1Y3QgaHAzMDBocHV4X2V4ZWNfYnl0ZXMKLXsKLSAgdW5zaWduZWQgY2hhciBlX2luZm9bNF07ICAgLyogYV9tYWNodHlwZS9hX21hZ2ljICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTFbNF07Ci0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTJbNF07Ci0gIHVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOyAgIC8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfZGF0YVs0XTsgICAvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBlX2Jzc1s0XTsgICAgLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhICwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsgLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMqLwotICB1bnNpZ25lZCBjaGFyIGVfZHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyovCi0gIHVuc2lnbmVkIGNoYXIgZV9wYXNzaXplWzRdOy8qIEhQID0gcGFzY2FsIGludGVyZmFjZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zeW1zWzRdOyAgIC8qIEhQID0gc3ltYm9sIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlNVs0XTsgLyogSFAgPSBkZWJ1ZyBuYW1lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOyAgLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3BhcmU2WzRdOyAvKiBIUCA9IHNvdXJjZSBsaW5lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX3N1cHNpemVbNF07LyogSFAgPSB2YWx1ZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgZV9kcmVsb2NzWzRdOwotICB1bnNpZ25lZCBjaGFyIGVfZXh0ZW5zaW9uWzRdOyAvKiBmaWxlIG9mZnNldCBvZiBleHRlbnNpb24gKi8KLX07Ci0jZGVmaW5lCUVYRUNfQllURVNfU0laRQk2NAotCi1zdHJ1Y3QgaHAzMDBocHV4X25saXN0X2J5dGVzCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIGVfdmFsdWVbNF07Ci0gICAgdW5zaWduZWQgY2hhciBlX3R5cGVbMV07Ci0gICAgdW5zaWduZWQgY2hhciBlX2xlbmd0aFsxXTsJLyogbGVuZ3RoIG9mIGFzY2lpIHN5bWJvbCBuYW1lICovCi0gICAgdW5zaWduZWQgY2hhciBlX2FsbW9kWzJdOwkvKiBhbGlnbm1lbnQgbW9kICovCi0gICAgdW5zaWduZWQgY2hhciBlX3NobGliWzJdOyAgIC8qIGluZm8gYWJvdXQgZHluYW1pYyBsaW5raW5nICovCi0gIH07Ci0jZGVmaW5lIEVYVEVSTkFMX05MSVNUX1NJWkUgMTAKLQotc3RydWN0IGhwMzAwaHB1eF9yZWxvYwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Lyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHJfaW5kZXhbMl07ICAvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHJfdHlwZVsxXTsgICAvKiByZWxvY2F0aW9uIHR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHJfbGVuZ3RoWzFdOyAvKiBsZW5ndGggb2YgaXRlbSB0byByZWxvYyAgICAgICAgICAgICAgKi8KLSAgfTsKLQotc3RydWN0IGhwMzAwaHB1eF9oZWFkZXJfZXh0ZW5zaW9uCi17Ci0gICAgdW5zaWduZWQgY2hhciBlX3N5bXNbNF07Ci0gICAgdW5zaWduZWQgY2hhciB1bmlxdWVfaGVhZGVyc1sxMio0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGVfaGVhZGVyWzJdOyAgIC8qIHR5cGUgb2YgaGVhZGVyICovCi0gICAgdW5zaWduZWQgY2hhciBlX3ZlcnNpb25bMl07ICAvKiB2ZXJzaW9uICAgICAgICAqLwotICAgIHVuc2lnbmVkIGNoYXIgZV9zaXplWzRdOyAgICAgLyogYnl0ZXMgZm9sbG93aW5nKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfZXh0ZW5zaW9uWzRdOy8qIGZpbGUgb2Zmc2V0IG9mIG5leHQgZXh0ZW5zaW9uICovCi19OwotI2RlZmluZSBFWFRFUk5BTF9FWFRFTlNJT05fSEVBREVSX1NJWkUgKDE2KjQpCi0KLS8qIGhwdXggc2VwYXJhdGVzIG9iamVjdCBmaWxlcyAoMHgxMDYpIGFuZCBpbXB1cmUgZXhlY3V0YWJsZXMgKDB4MTA3KSAgKi8KLS8qIGJ1dCB0aGUgYmZkIGNvZGUgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtLiBTaW5jZSB3ZSB3YW50IHRvKi8KLS8qIHJlYWQgaHB1eCAubyBmaWxlcywgd2UgYWRkIGFuIHNwZWNpYWwgZGVmaW5lIGFuZCB1c2UgaXQgYmVsb3cgaW4gICAgKi8KLS8qIG9mZnNldCBhbmQgYWRkcmVzcyBjYWxjdWxhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBIUFVYX0RPVF9PX01BR0lDIDB4MTA2Ci0jZGVmaW5lIE9NQUdJQyAweDEwNyAgICAgICAvKiBvYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAweDEwOCAgICAgICAvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgICovCi0jZGVmaW5lIFpNQUdJQyAweDEwQiAgICAgICAvKiBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICAgICAgICAgICovCi0KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCi0KLSNpZiAwIC8qIGxpYmFvdXQuaCBvbmx5IHVzZXMgdGhlIGxvd2VyIDggYml0cyAqLwotI2RlZmluZSBIUDk4eDZfSUQgMHgyMEEKLSNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDIwQwotI2VuZGlmCi0jZGVmaW5lIEhQOTh4Nl9JRCAweDBBCi0jZGVmaW5lIEhQOTAwMFMyMDBfSUQgMHgwQwotCi0jZGVmaW5lIE5fQkFETUFHKHgpICgoX05fQkFETUFHICh4KSkgfHwgKF9OX0JBRE1BQ0ggKHgpKSkKLQotI2RlZmluZSBOX0RBVEFERFIoeCkgXAotICAgICgoTl9NQUdJQyh4KT09T01BR0lDIHx8IE5fTUFHSUMoeCk9PUhQVVhfRE9UX09fTUFHSUMpID8gXAotICAgICAgICAoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KSkgXAotICAgICA6ICAoTl9TRUdTSVpFKHgpICsgKChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpLTEpICYgfihOX1NFR1NJWkUoeCktMSkpKSkKLQotI2RlZmluZSBfTl9CQURNQUNIKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotKCgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTAwMFMyMDBfSUQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTh4Nl9JRCkpCi0KLSNkZWZpbmUgX05fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gSFBVWF9ET1RfT19NQUdJQyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBOX01BR0lDKHgpICE9IE9NQUdJQwkJXAotCQkJJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLSAgCQkJJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMgKQotCi0jdW5kZWYgX05fSERST0ZGCi0jZGVmaW5lIF9OX0hEUk9GRih4KSAoU0VHTUVOVF9TSVpFIC0gKHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKLQotI3VuZGVmIE5fREFUT0ZGCi0jdW5kZWYgTl9QQVNPRkYKLSN1bmRlZiBOX1NZTU9GRgotI3VuZGVmIE5fU1VQT0ZGCi0jdW5kZWYgTl9UUkVMT0ZGCi0jdW5kZWYgTl9EUkVMT0ZGCi0jdW5kZWYgTl9TVFJPRkYKLQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpICkKLSNkZWZpbmUgTl9QQVNPRkYoeCkgICAgICggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fUEFTT0ZGKHgpICAgLyogKyAoeCkuYV9wYXNzaXplKi8gKQotI2RlZmluZSBOX1NVUE9GRih4KSAgICAgKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX1NVUE9GRih4KSAgICAvKiArIDAgKHgpLmFfc3Vwc2l6ZSovICkKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9FWFRIT0ZGKHgpICAgICggTl9EUkVMT0ZGKHgpICAgLyogICsgMCAoeCkuYV9kcnNpemUgKi8pCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggMCAvKiBubyBzdHJpbmcgdGFibGUgKi8gKQotCi0vKiB1c2UgdGhlc2Ugd2hlbiB0aGUgZmlsZSBoYXMgZ251IHN5bWJvbCB0YWJsZXMgKi8KLSNkZWZpbmUgTl9HTlVfVFJFTE9GRih4KSAoTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQotI2RlZmluZSBOX0dOVV9EUkVMT0ZGKHgpIChOX0dOVV9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplKQotI2RlZmluZSBOX0dOVV9TWU1PRkYoeCkgIChOX0dOVV9EUkVMT0ZGKHgpICsgKHgpLmFfZHJzaXplKQotCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHgxMDAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDEwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLQotI3VuZGVmIE5fU0hBUkVEX0xJQgotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgICggMCAvKiBubyBzaGFyZWQgbGlicmFyaWVzICovICkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ocHBhLmggYi9pbmNsdWRlL2FvdXQvaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE4NWRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpbmNsdWRlICJmaWxlaGRyLmgiCi0jaW5jbHVkZSAiYW91dGhkci5oIgotI2luY2x1ZGUgInNjbmhkci5oIgotI2luY2x1ZGUgInNwYWNlaGRyLmgiCi0jaW5jbHVkZSAic3ltcy5oIgotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9yYW5saWIuaCBiL2luY2x1ZGUvYW91dC9yYW5saWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyNjAwNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvcmFubGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiByYW5saWIuaCAtLSBhcmNoaXZlIGxpYnJhcnkgaW5kZXggbWVtYmVyIGRlZmluaXRpb24gZm9yIEdOVS4KLSAgIENvcHlyaWdodCAxOTkwLTE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgU3ltZGVmIG1lbWJlciBvZiBhbiBhcmNoaXZlIGNvbnRhaW5zIHR3byB0aGluZ3M6Ci0gICBhIHRhYmxlIHRoYXQgbWFwcyBzeW1ib2wtc3RyaW5nIG9mZnNldHMgdG8gZmlsZSBvZmZzZXRzLAotICAgYW5kIGEgc3ltYm9sLXN0cmluZyB0YWJsZS4gIEFsbCB0aGUgc3ltYm9sIG5hbWVzIGFyZQotICAgcnVuIHRvZ2V0aGVyIChlYWNoIHdpdGggdHJhaWxpbmcgbnVsbCkgaW4gdGhlIHN5bWJvbC1zdHJpbmcKLSAgIHRhYmxlLiAgVGhlcmUgaXMgYSBzaW5nbGUgbG9uZ3dvcmQgYnl0ZWNvdW50IG9uIHRoZSBmcm9udAotICAgb2YgZWFjaCBvZiB0aGVzZSB0YWJsZXMuICBUaHVzIGlmIHdlIGhhdmUgdHdvIHN5bWJvbHMsCi0gICAiZm9vIiBhbmQgIl9iYXIiLCB0aGF0IGFyZSBpbiBhcmNoaXZlIG1lbWJlcnMgYXQgb2Zmc2V0cwotICAgMjAwIGFuZCA5MDAsIGl0IHdvdWxkIGxvb2sgbGlrZSB0aGlzOgotICAgICAgICAxNgkJOyBieXRlIGNvdW50IG9mIGluZGV4IHRhYmxlCi0gIAkwCQk7IG9mZnNldCBvZiAiZm9vIiBpbiBzdHJpbmcgdGFibGUKLSAgCTIwMAkJOyBvZmZzZXQgb2YgZm9vLW1vZHVsZSBpbiBmaWxlCi0gIAk0CQk7IG9mZnNldCBvZiAiYmFyIiBpbiBzdHJpbmcgdGFibGUKLSAgCTkwMAkJOyBvZmZzZXQgb2YgYmFyLW1vZHVsZSBpbiBmaWxlCi0gIAk5CQk7IGJ5dGUgY291bnQgb2Ygc3RyaW5nIHRhYmxlCi0gIAkiZm9vXDBfYmFyXDAiCTsgc3RyaW5nIHRhYmxlICAqLwotCi0jZGVmaW5lCVJBTkxJQk1BRwkiX18uU1lNREVGIgkvKiBBcmNoaXZlIGZpbGUgbmFtZSBjb250YWluaW5nIGluZGV4ICovCi0jZGVmaW5lCVJBTkxJQlNLRVcJMwkJLyogQ3JlYXRpb24gdGltZSBvZmZzZXQgKi8KLQotLyogRm9ybWF0IG9mIF9fLlNZTURFRjoKLSAgIEZpcnN0LCBhIGxvbmd3b3JkIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgdGhlICdzeW1kZWYnIGRhdGEgdGhhdCBmb2xsb3dzLgotICAgU2Vjb25kLCB6ZXJvIG9yIG1vcmUgJ3N5bWRlZicgc3RydWN0dXJlcy4KLSAgIFRoaXJkLCBhIGxvbmd3b3JkIGNvbnRhaW5pbmcgdGhlIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSBzdHJpbmdzLgotICAgRm91cnRoLCB6ZXJvIG9yIG1vcmUgc3ltYm9sIG5hbWUgc3RyaW5ncyAoZWFjaCBmb2xsb3dlZCBieSBhIG51bGwpLiAgKi8KLQotc3RydWN0IHN5bWRlZgotICB7Ci0gICAgdW5pb24KLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIHN0cmluZ19vZmZzZXQ7CS8qIEluIHRoZSBmaWxlICovCi0JY2hhciAqbmFtZTsJCQkvKiBJbiBtZW1vcnksIHNvbWV0aW1lcyAqLwotICAgICAgfSBzOwotICAgIC8qIHRoaXMgcG9pbnRzIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBoZWFkZXIgKEFLQSBtZW1iZXIgaGVhZGVyIC0tCi0gICAgICAgYSBzdHJ1Y3QgYXJfaGRyKSwgbm90IHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBvciBpbnRvIHRoZSBmaWxlKS4KLSAgICAgICBpbiBvdGhlciB3b3JkcyBpdCBvbmx5IHRlbGxzIHlvdSB3aGljaCBmaWxlIHRvIHJlYWQgKi8gICAgICAgCi0gICAgdW5zaWduZWQgbG9uZyBmaWxlX29mZnNldDsKLSAgfTsKLQotLyogQ29tcGF0YWJpbGl0eSB3aXRoIEJTRCBjb2RlICovCi0KLSNkZWZpbmUJcmFubGliCXN5bWRlZgotI2RlZmluZQlyYW5fdW4JcwotI2RlZmluZQlyYW5fc3RyeCBzdHJpbmdfb2Zmc2V0Ci0jZGVmaW5lCXJhbl9uYW1lIG5hbWUKLSNkZWZpbmUJcmFuX29mZglmaWxlX29mZnNldApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3JlbG9jLmggYi9pbmNsdWRlL2FvdXQvcmVsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzYzU1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvcmVsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIHJlbG9jLmggLS0gSGVhZGVyIGZpbGUgZm9yIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgMTk4OS0xOTkxICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogUmVsb2NhdGlvbiB0eXBlcyBmb3IgYS5vdXQgZmlsZXMgdXNpbmcgcmVsb2NfaW5mb19leHRlbmRlZAotICAgKFNQQVJDIGFuZCBBTUQgMjkwMDApLiAqLwotCi0jaWZuZGVmIF9SRUxPQ19IX1JFQURfCi0jZGVmaW5lIF9SRUxPQ19IX1JFQURfIDEKLQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSRUxPQ184LCAgICAgICAgUkVMT0NfMTYsICAgICAgICBSRUxPQ18zMiwgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gICAgUkVMT0NfRElTUDgsICAgIFJFTE9DX0RJU1AxNiwgICAgUkVMT0NfRElTUDMyLCAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gICAgUkVMT0NfV0RJU1AzMCwgIFJFTE9DX1dESVNQMjIsCi0gICAgUkVMT0NfSEkyMiwgICAgIFJFTE9DXzIyLAotICAgIFJFTE9DXzEzLCAgICAgICBSRUxPQ19MTzEwLAotICAgIFJFTE9DX1NGQV9CQVNFLCBSRUxPQ19TRkFfT0ZGMTMsCi0gICAgUkVMT0NfQkFTRTEwLCAgIFJFTE9DX0JBU0UxMywgICAgUkVMT0NfQkFTRTIyLCAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gICAgUkVMT0NfUEMxMCwgICAgIFJFTE9DX1BDMjIsCS8qIGZvciBzb21lIHNvcnQgb2YgcGMtcmVsIFAuSS5DLiAoPykgKi8KLSAgICBSRUxPQ19KTVBfVEJMLAkJLyogUC5JLkMuIGp1bXAgdGFibGUgKi8KLSAgICBSRUxPQ19TRUdPRkYxNiwJCS8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gICAgUkVMT0NfR0xPQl9EQVQsICBSRUxPQ19KTVBfU0xPVCwgUkVMT0NfUkVMQVRJVkUsCi0gICAgUkVMT0NfMTEsCi0gICAgUkVMT0NfV0RJU1AyXzE0LAotICAgIFJFTE9DX1dESVNQMTksCi0gICAgUkVMT0NfSEhJMjIsCi0gICAgUkVMT0NfSExPMTAsCi0gICAgCi0gICAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgICBSRUxPQ19KVU1QVEFSRywgUkVMT0NfQ09OU1QsICAgICBSRUxPQ19DT05TVEgsCi0gICAgCi0gICAgUkVMT0NfV0RJU1AxNCwgUkVMT0NfV0RJU1AyMSwKLSAgICAKLSAgICBOT19SRUxPQwotICAgIH07Ci0KLSNkZWZpbmUJUkVMT0NfVFlQRV9OQU1FUyBcCi0iOCIsCQkiMTYiLAkJIjMyIiwJCSJESVNQOCIsCVwKLSJESVNQMTYiLAkiRElTUDMyIiwJIldESVNQMzAiLAkiV0RJU1AyMiIsCVwKLSJISTIyIiwJCSIyMiIsCQkiMTMiLAkJIkxPMTAiLAkJXAotIlNGQV9CQVNFIiwJIlNGQU9GRjEzIiwJIkJBU0UxMCIsCSJCQVNFMTMiLAlcCi0iQkFTRTIyIiwJIlBDMTAiLAkJIlBDMjIiLAkJIkpNUF9UQkwiLAlcCi0iU0VHT0ZGMTYiLAkiR0xPQl9EQVQiLAkiSk1QX1NMT1QiLAkiUkVMQVRJVkUiLAlcCi0iMTEiLAkJIldESVNQMl8xNCIsCSJXRElTUDE5IiwgCSJISEkyMiIsCVwKLSJITE8xMCIsCQkJCQkJCVwKLSJKVU1QVEFSRyIsCSJDT05TVCIsCSJDT05TVEgiLAkiV0RJU1AxNCIsCVwKLSJXRElTUDIxIiwJXAotIk5PX1JFTE9DIgotCi0jZW5kaWYgLyogX1JFTE9DX0hfUkVBRF8gKi8KLQotLyogZW5kIG9mIHJlbG9jLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdGFiLmRlZiBiL2luY2x1ZGUvYW91dC9zdGFiLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyZDJkZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvc3RhYi5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyogVGFibGUgb2YgREJYIHN5bWJvbCBjb2RlcyBmb3IgdGhlIEdOVSBzeXN0ZW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzIDIuICBUaGlzIHVzZXMgYW4gbl90eXBlIG9mIDAsIHdoaWNoIGluIGEub3V0IGZpbGVzCi0gICBvdmVybGFwcyB0aGUgTl9VTkRGIHVzZWQgZm9yIG9yZGluYXJ5IHN5bWJvbHMuICBJbiBFTEYgZmlsZXMsIHRoZQotICAgZGVidWcgaW5mb3JtYXRpb24gaXMgaW4gYSBkaWZmZXJlbnQgZmlsZSBzZWN0aW9uLCBzbyB0aGVyZSBpcyBubyBjb25mbGljdC4KLSAgIFRoaXMgc3ltYm9sJ3Mgbl92YWx1ZSBnaXZlcyB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHNlY3Rpb24gYXNzb2NpYXRlZAotICAgd2l0aCB0aGlzIGZpbGUuICBUaGUgc3ltYm9sJ3Mgbl9zdHJ4IChyZWxhdGl2ZSB0byB0aGUganVzdC11cGRhdGVkCi0gICBzdHJpbmcgc2VjdGlvbiBzdGFydCBhZGRyZXNzKSBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUsCi0gICBlLmcuICJmb28uYyIsIHdpdGhvdXQgYW55IHBhdGggaW5mb3JtYXRpb24uICBUaGUgc3ltYm9sJ3Mgbl9kZXNjIGdpdmVzCi0gICB0aGUgY291bnQgb2YgdXBjb21pbmcgc3ltYm9scyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIChub3QgaW5jbHVkaW5nCi0gICB0aGlzIG9uZSkuICAqLwotLyogX19kZWZpbmVfc3RhYiAoTl9VTkRGLCAweDAwLCAiVU5ERiIpICAqLwotCi0vKiBHbG9iYWwgdmFyaWFibGUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgotICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLwotX19kZWZpbmVfc3RhYiAoTl9HU1lNLCAweDIwLCAiR1NZTSIpCi0KLS8qIEZ1bmN0aW9uIG5hbWUgZm9yIEJTRCBGb3J0cmFuLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KLSAgIFRvIGZpbmQgdGhlIGFkZHJlc3MsIGxvb2sgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRk5BTUUsIDB4MjIsICJGTkFNRSIpCi0KLS8qIEZ1bmN0aW9uIG5hbWUgb3IgdGV4dC1zZWdtZW50IHZhcmlhYmxlIGZvciBDLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCi0gICBEZXNjIGlzIHN1cHBvc2VkbHkgc3RhcnRpbmcgbGluZSBudW1iZXIsIGJ1dCBHQ0MgZG9lc24ndCBzZXQgaXQKLSAgIGFuZCBEQlggc2VlbXMgbm90IHRvIG1pc3MgaXQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9GVU4sIDB4MjQsICJGVU4iKQotCi0vKiBEYXRhLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCi0gICAiU3RhdGljIFN5bSIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9TVFNZTSwgMHgyNiwgIlNUU1lNIikKLQotLyogQlNTLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLwotX19kZWZpbmVfc3RhYiAoTl9MQ1NZTSwgMHgyOCwgIkxDU1lNIikKLQotLyogTmFtZSBvZiBtYWluIHJvdXRpbmUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTUFJTiwgMHgyYSwgIk1BSU4iKQotCi0vKiBTb2xhcmlzMjogIFJlYWQtb25seSBkYXRhIHN5bWJvbHMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9ST1NZTSwgMHgyYywgIlJPU1lNIikKLQotLyogR2xvYmFsIHN5bWJvbCBpbiBQYXNjYWwuCi0gICBTdXBwb3NlZGx5IHRoZSB2YWx1ZSBpcyBpdHMgbGluZSBudW1iZXI7IEknbSBza2VwdGljYWwuICAqLwotX19kZWZpbmVfc3RhYiAoTl9QQywgMHgzMCwgIlBDIikKLQotLyogTnVtYmVyIG9mIHN5bWJvbHM6ICAwLCBmaWxlcywsZnVuY3MsbGluZXMgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAqLwotX19kZWZpbmVfc3RhYiAoTl9OU1lNUywgMHgzMiwgIk5TWU1TIikKLQotLyogIk5vIERTVCBtYXAgZm9yIHN5bTogbmFtZSwgLDAsdHlwZSxpZ25vcmVkIiAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAqLwotX19kZWZpbmVfc3RhYiAoTl9OT01BUCwgMHgzNCwgIk5PTUFQIikKLQotLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzIDIuICBMaWtlIE5fU08sIGJ1dCBmb3IgdGhlIG9iamVjdCBmaWxlLiAgVHdvIGluCi0gICBhIHJvdyBwcm92aWRlIHRoZSBidWlsZCBkaXJlY3RvcnkgYW5kIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSAubyBmcm9tIGl0LgotICAgU29sYXJpczIgdXNlcyB0aGlzIHRvIGF2b2lkIHB1dHRpbmcgdGhlIHN0YWJzIGluZm8gaW50byB0aGUgbGlua2VkCi0gICBleGVjdXRhYmxlOyB0aGlzIHN0YWIgZ29lcyBpbnRvIHRoZSAiLnN0YWIuaW5kZXgiIHNlY3Rpb24sIGFuZCB0aGUgZGVidWdnZXIKLSAgIHJlYWRzIHRoZSByZWFsIHN0YWJzIGRpcmVjdGx5IGZyb20gdGhlIC5vIGZpbGVzIGluc3RlYWQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9PQkosIDB4MzgsICJPQkoiKQotCi0vKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMgMi4gIE9wdGlvbnMgZm9yIHRoZSBkZWJ1Z2dlciwgcmVsYXRlZCB0byB0aGUKLSAgIHNvdXJjZSBsYW5ndWFnZSBmb3IgdGhpcyBtb2R1bGUuICBFLmcuIHdoZXRoZXIgdG8gdXNlIEFOU0kKLSAgIGludGVncmFsIHByb21vdGlvbnMgb3IgdHJhZGl0aW9uYWwgaW50ZWdyYWwgcHJvbW90aW9ucy4gICovCi1fX2RlZmluZV9zdGFiIChOX09QVCwgMHgzYywgIk9QVCIpCi0KLS8qIFJlZ2lzdGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgbnVtYmVyIG9mIHJlZ2lzdGVyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUlNZTSwgMHg0MCwgIlJTWU0iKQotCi0vKiBNb2R1bGEtMiBjb21waWxhdGlvbiB1bml0LiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCi1fX2RlZmluZV9zdGFiIChOX00yQywgMHg0MiwgIk0yQyIpCi0KLS8qIExpbmUgbnVtYmVyIGluIHRleHQgc2VnbWVudC4gIERlc2MgaXMgdGhlIGxpbmUgbnVtYmVyOwotICAgdmFsdWUgaXMgY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgT24gU29sYXJpczIsIHRoZSBsaW5lIG51bWJlciBpcwotICAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU0xJTkUsIDB4NDQsICJTTElORSIpCi0KLS8qIFNpbWlsYXIsIGZvciBkYXRhIHNlZ21lbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9EU0xJTkUsIDB4NDYsICJEU0xJTkUiKQotCi0vKiBTaW1pbGFyLCBmb3IgYnNzIHNlZ21lbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9CU0xJTkUsIDB4NDgsICJCU0xJTkUiKQotCi0vKiBTdW4ncyBzb3VyY2UtY29kZSBicm93c2VyIHN0YWJzLiAgPz8gRG9uJ3Qga25vdyB3aGF0IHRoZSBmaWVsZHMgYXJlLgotICAgU3VwcG9zZWRseSB0aGUgZmllbGQgaXMgInBhdGggdG8gYXNzb2NpYXRlZCAuY2IgZmlsZSIuICBUSElTIFZBTFVFCi0gICBPVkVSTEFQUyBXSVRIIE5fQlNMSU5FISAgKi8KLV9fZGVmaW5lX3N0YWJfZHVwbGljYXRlIChOX0JST1dTLCAweDQ4LCAiQlJPV1MiKQotCi0vKiBHTlUgTW9kdWxhLTIgZGVmaW5pdGlvbiBtb2R1bGUgZGVwZW5kZW5jeS4gIFZhbHVlIGlzIHRoZSBtb2RpZmljYXRpb24gdGltZQotICAgb2YgdGhlIGRlZmluaXRpb24gZmlsZS4gIE90aGVyIGlzIG5vbi16ZXJvIGlmIGl0IGlzIGltcG9ydGVkIHdpdGggdGhlCi0gICBHTlUgTTIga2V5d29yZCAlSU5JVElBTElaRS4gIFBlcmhhcHMgTl9NMkMgY2FuIGJlIHVzZWQgaWYgdGhlcmUKLSAgIGFyZSBlbm91Z2ggZW1wdHkgZmllbGRzPyAqLwotX19kZWZpbmVfc3RhYihOX0RFRkQsIDB4NGEsICJERUZEIikKLQotLyogTmV3IGluIFNvbGFyaXMyLiAgRnVuY3Rpb24gc3RhcnQvYm9keS9lbmQgbGluZSBudW1iZXJzLiAgKi8KLV9fZGVmaW5lX3N0YWIoTl9GTElORSwgMHg0QywgIkZMSU5FIikKLQotLyogVEhFIEZPTExPV0lORyBUV08gU1RBQiBWQUxVRVMgQ09ORkxJQ1QuICBIYXBwaWx5LCBvbmUgaXMgZm9yIE1vZHVsYS0yCi0gICBhbmQgb25lIGlzIGZvciBDKysuICAgU3RpbGwsLi4uICovCi0vKiBHTlUgQysrIGV4Y2VwdGlvbiB2YXJpYWJsZS4gIE5hbWUgaXMgdmFyaWFibGUgbmFtZS4gICovCi1fX2RlZmluZV9zdGFiIChOX0VIREVDTCwgMHg1MCwgIkVIREVDTCIpCi0vKiBNb2R1bGEyIGluZm8gImZvciBpbWMiOiAgbmFtZSwsMCwwLDAgIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gICovCi1fX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSAoTl9NT0QyLCAweDUwLCAiTU9EMiIpCi0KLS8qIEdOVSBDKysgYGNhdGNoJyBjbGF1c2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gIERlc2MgaXMgbm9uemVybyBpZgotICAgdGhpcyBlbnRyeSBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIENBVUdIVCBzdGFiIHNheWluZyB3aGF0IGV4Y2VwdGlvbgotICAgd2FzIGNhdWdodC4gIE11bHRpcGxlIENBVUdIVCBzdGFicyBtZWFucyB0aGF0IG11bHRpcGxlIGV4Y2VwdGlvbnMKLSAgIGNhbiBiZSBjYXVnaHQgaGVyZS4gIElmIERlc2MgaXMgMCwgaXQgbWVhbnMgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodAotICAgaGVyZS4gICovCi1fX2RlZmluZV9zdGFiIChOX0NBVENILCAweDU0LCAiQ0FUQ0giKQotCi0vKiBTdHJ1Y3R1cmUgb3IgdW5pb24gZWxlbWVudC4gIFZhbHVlIGlzIG9mZnNldCBpbiB0aGUgc3RydWN0dXJlLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU1NZTSwgMHg2MCwgIlNTWU0iKQotCi0vKiBTb2xhcmlzMjogIExhc3Qgc3RhYiBlbWl0dGVkIGZvciBtb2R1bGUuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FTkRNLCAweDYyLCAiRU5ETSIpCi0KLS8qIE5hbWUgb2YgbWFpbiBzb3VyY2UgZmlsZS4KLSAgIFZhbHVlIGlzIHN0YXJ0aW5nIHRleHQgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24uCi0gICBJZiBtdWx0aXBsZSBOX1NPJ3MgYXBwZWFyLCB0aGUgZmlyc3QgdG8gY29udGFpbiBhIHRyYWlsaW5nIC8gaXMgdGhlCi0gICBjb21waWxhdGlvbiBkaXJlY3RvcnkuICBUaGUgZmlyc3QgdG8gbm90IGNvbnRhaW4gYSB0cmFpbGluZyAvIGlzIHRoZQotICAgc291cmNlIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeS4gIE90aGVycyAocGVyaGFwcwotICAgcmVzdWx0aW5nIGZyb20gY2Zyb250KSBhcmUgaWdub3JlZC4KLSAgIE9uIFNvbGFyaXMyLCB2YWx1ZSBpcyB1bmRlZmluZWQsIGJ1dCBkZXNjIGlzIGEgc291cmNlLWxhbmd1YWdlIGNvZGUuICAqLwotCi1fX2RlZmluZV9zdGFiIChOX1NPLCAweDY0LCAiU08iKQotCi0vKiBTdW5Qcm8gRjc3OiAgTmFtZSBvZiBhbGlhcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0FMSUFTLCAweDZjLCAiQUxJQVMiKQotCi0vKiBBdXRvbWF0aWMgdmFyaWFibGUgaW4gdGhlIHN0YWNrLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gZnJhbWUgcG9pbnRlci4KLSAgIEFsc28gdXNlZCBmb3IgdHlwZSBkZXNjcmlwdGlvbnMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9MU1lNLCAweDgwLCAiTFNZTSIpCi0KLS8qIEJlZ2lubmluZyBvZiBhbiBpbmNsdWRlIGZpbGUuICBPbmx5IFN1biB1c2VzIHRoaXMuCi0gICBJbiBhbiBvYmplY3QgZmlsZSwgb25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KLSAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIG90aGVyIGZpZWxkcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0JJTkNMLCAweDgyLCAiQklOQ0wiKQotCi0vKiBOYW1lIG9mIHN1Yi1zb3VyY2UgZmlsZSAoI2luY2x1ZGUgZmlsZSkuCi0gICBWYWx1ZSBpcyBzdGFydGluZyB0ZXh0IGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU09MLCAweDg0LCAiU09MIikKLQotLyogUGFyYW1ldGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gYXJndW1lbnQgcG9pbnRlci4KLSAgIChPbiBtb3N0IG1hY2hpbmVzIHRoZSBhcmd1bWVudCBwb2ludGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmcmFtZSBwb2ludGVyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUFNZTSwgMHhhMCwgIlBTWU0iKQotCi0vKiBFbmQgb2YgYW4gaW5jbHVkZSBmaWxlLiAgTm8gbmFtZS4KLSAgIFRoaXMgYW5kIE5fQklOQ0wgYWN0IGFzIGJyYWNrZXRzIGFyb3VuZCB0aGUgZmlsZSdzIG91dHB1dC4KLSAgIEluIGFuIG9iamVjdCBmaWxlLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkYXRhIGluIHRoaXMgZW50cnkuCi0gICBUaGUgU3VuIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBmaWVsZHMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FSU5DTCwgMHhhMiwgIkVJTkNMIikKLQotLyogQWx0ZXJuYXRlIGVudHJ5IHBvaW50LiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FTlRSWSwgMHhhNCwgIkVOVFJZIikKLQotLyogQmVnaW5uaW5nIG9mIGxleGljYWwgYmxvY2suCi0gICBUaGUgZGVzYyBpcyB0aGUgbmVzdGluZyBsZXZlbCBpbiBsZXhpY2FsIGJsb2Nrcy4KLSAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4KLSAgIFRoZSB2YXJpYWJsZXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBibG9jayAqcHJlY2VkZSogdGhlIE5fTEJSQUMgc3ltYm9sLgotICAgT24gU29sYXJpczIsIHRoZSB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9MQlJBQywgMHhjMCwgIkxCUkFDIikKLQotLyogUGxhY2UgaG9sZGVyIGZvciBkZWxldGVkIGluY2x1ZGUgZmlsZS4gIFJlcGxhY2VzIGEgTl9CSU5DTCBhbmQgZXZlcnl0aGluZwotICAgdXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgTl9FSU5DTC4gIFRoZSBTdW4gbGlua2VyIGdlbmVyYXRlcyB0aGVzZSB3aGVuCi0gICBpdCBmaW5kcyBtdWx0aXBsZSBpZGVudGljYWwgY29waWVzIG9mIHRoZSBzeW1ib2xzIGZyb20gYW4gaW5jbHVkZSBmaWxlLgotICAgVGhpcyBhcHBlYXJzIG9ubHkgaW4gb3V0cHV0IGZyb20gdGhlIFN1biBsaW5rZXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FWENMLCAweGMyLCAiRVhDTCIpCi0KLS8qIE1vZHVsYS0yIHNjb3BlIGluZm9ybWF0aW9uLiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCi1fX2RlZmluZV9zdGFiIChOX1NDT1BFLCAweGM0LCAiU0NPUEUiKQotCi0vKiBFbmQgb2YgYSBsZXhpY2FsIGJsb2NrLiAgRGVzYyBtYXRjaGVzIHRoZSBOX0xCUkFDJ3MgZGVzYy4KLSAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSB0ZXh0IGZvciB0aGUgYmxvY2suCi0gICBPbiBTb2xhcmlzMiwgdGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi1fX2RlZmluZV9zdGFiIChOX1JCUkFDLCAweGUwLCAiUkJSQUMiKQotCi0vKiBCZWdpbiBuYW1lZCBjb21tb24gYmxvY2suICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQkNPTU0sIDB4ZTIsICJCQ09NTSIpCi0KLS8qIEVuZCBuYW1lZCBjb21tb24gYmxvY2suICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50Ci0gICAoYW5kIGl0IHNob3VsZCBtYXRjaCB0aGUgTl9CQ09NTSkuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FQ09NTSwgMHhlNCwgIkVDT01NIikKLQotLyogTWVtYmVyIG9mIGEgY29tbW9uIGJsb2NrOyB2YWx1ZSBpcyBvZmZzZXQgd2l0aGluIHRoZSBjb21tb24gYmxvY2suCi0gICBUaGlzIHNob3VsZCBvY2N1ciB3aXRoaW4gYSBCQ09NTS9FQ09NTSBwYWlyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRUNPTUwsIDB4ZTgsICJFQ09NTCIpCi0KLS8qIFNvbGFyaXMyOiBQYXNjYWwgIndpdGgiIHN0YXRlbWVudDogdHlwZSwsMCwwLG9mZnNldCAqLwotX19kZWZpbmVfc3RhYiAoTl9XSVRILCAweGVhLCAiV0lUSCIpCi0KLS8qIFRoZXNlIFNUQUIncyBhcmUgdXNlZCBvbiBHb3VsZCBzeXN0ZW1zIGZvciBOb24tQmFzZSByZWdpc3RlciBzeW1ib2xzCi0gICBvciBzb21ldGhpbmcgbGlrZSB0aGF0LiAgRklYTUUuICBJIGhhdmUgYXNzaWduZWQgdGhlIHZhbHVlcyBhdCByYW5kb20KLSAgIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhIEdvdWxkIGhlcmUuICBGaXh1cHMgZnJvbSBHb3VsZCBmb2xrIHdlbGNvbWUuLi4gKi8KLV9fZGVmaW5lX3N0YWIgKE5fTkJURVhULCAweEYwLCAiTkJURVhUIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJEQVRBLCAweEYyLCAiTkJEQVRBIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJCU1MsICAweEY0LCAiTkJCU1MiKQotX19kZWZpbmVfc3RhYiAoTl9OQlNUUywgIDB4RjYsICJOQlNUUyIpCi1fX2RlZmluZV9zdGFiIChOX05CTENTLCAgMHhGOCwgIk5CTENTIikKLQotLyogU2Vjb25kIHN5bWJvbCBlbnRyeSBjb250YWluaW5nIGEgbGVuZ3RoLXZhbHVlIGZvciB0aGUgcHJlY2VkaW5nIGVudHJ5LgotICAgVGhlIHZhbHVlIGlzIHRoZSBsZW5ndGguICAqLwotX19kZWZpbmVfc3RhYiAoTl9MRU5HLCAweGZlLCAiTEVORyIpCi0MCi0vKiBUaGUgYWJvdmUgaW5mb3JtYXRpb24sIGluIG1hdHJpeCBmb3JtYXQuCi0KLQkJCVNUQUIgTUFUUklYCi0JX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCXwgMDAgLSAxRiBhcmUgbm90IGRieCBzdGFiIHN5bWJvbHMJCXwKLQl8IEluIG1vc3QgY2FzZXMsIHRoZSBsb3cgYml0IGlzIHRoZSBFWFRlcm5hbCBiaXR8Ci0KLQl8IDAwIFVOREVGICB8IDAyIEFCUwl8IDA0IFRFWFQgICB8IDA2IERBVEEJfAotCXwgMDEgIHxFWFQgIHwgMDMgIHxFWFQJfCAwNSAgfEVYVCAgfCAwNyAgfEVYVAl8Ci0KLQl8IDA4IEJTUyAgICB8IDBBIElORFIJfCAwQyBGTl9TRVEgfCAwRSBXRUFLQQl8Ci0JfCAwOSAgfEVYVCAgfCAwQiAJfCAwRCBXRUFLVSAgfCAwRiBXRUFLVAl8Ci0KLQl8IDEwIFdFQUtEICB8IDEyIENPTU0JfCAxNCBTRVRBICAgfCAxNiBTRVRUCXwKLQl8IDExIFdFQUtCICB8IDEzCXwgMTUgCSAgICB8IDE3CXwKLQotCXwgMTggU0VURCAgIHwgMUEgU0VUQgl8IDFDIFNFVFYgICB8IDFFIFdBUk5JTkd8Ci0JfCAxOQkgICAgfCAxQgl8IDFEIAkgICAgfCAxRiBGTgl8Ci0KLQl8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0JfCBEZWJ1ZyBlbnRyaWVzIHdpdGggYml0IDAxIHNldCBhcmUgdW51c2VkLgl8Ci0JfCAyMCBHU1lNICAgfCAyMiBGTkFNRQl8IDI0IEZVTiAgICB8IDI2IFNUU1lNCXwKLQl8IDI4IExDU1lNICB8IDJBIE1BSU4JfCAyQyBST1NZTSAgfCAyRQl8Ci0JfCAzMCBQQwkgICAgfCAzMiBOU1lNUwl8IDM0IE5PTUFQICB8IDM2CXwKLQl8IDM4IE9CSiAgICB8IDNBCXwgM0MgT1BUICAgIHwgM0UJfAotCXwgNDAgUlNZTSAgIHwgNDIgTTJDCXwgNDQgU0xJTkUgIHwgNDYgRFNMSU5FIHwKLQl8IDQ4IEJTTElORSp8IDRBIERFRkQJfCA0QyBGTElORSAgfCA0RQl8Ci0JfCA1MCBFSERFQ0wqfCA1Mgl8IDU0IENBVENIICB8IDU2ICAgICAgICB8Ci0JfCA1OCAgICAgICAgfCA1QSAgICAgICAgfCA1QyAgICAgICAgfCA1RQl8Ci0JfCA2MCBTU1lNICAgfCA2MiBFTkRNCXwgNjQgU08JICAgIHwgNjYgCXwKLQl8IDY4IAkgICAgfCA2QQl8IDZDIEFMSUFTICB8IDZFCXwKLQl8IDcwCSAgICB8IDcyCXwgNzQJICAgIHwgNzYJfAotCXwgNzgJICAgIHwgN0EJfCA3QwkgICAgfCA3RQl8Ci0JfCA4MCBMU1lNICAgfCA4MiBCSU5DTAl8IDg0IFNPTCAgICB8IDg2CXwKLQl8IDg4CSAgICB8IDhBCXwgOEMJICAgIHwgOEUJfAotCXwgOTAJICAgIHwgOTIJfCA5NAkgICAgfCA5Ngl8Ci0JfCA5OAkgICAgfCA5QQl8IDlDCSAgICB8IDlFCXwKLQl8IEEwIFBTWU0gICB8IEEyIEVJTkNMCXwgQTQgRU5UUlkgIHwgQTYJfAotCXwgQTgJICAgIHwgQUEJfCBBQwkgICAgfCBBRQl8Ci0JfCBCMAkgICAgfCBCMgl8IEI0CSAgICB8IEI2CXwKLQl8IEI4CSAgICB8IEJBCXwgQkMJICAgIHwgQkUJfAotCXwgQzAgTEJSQUMgIHwgQzIgRVhDTAl8IEM0IFNDT1BFICB8IEM2CXwKLQl8IEM4CSAgICB8IENBCXwgQ0MJICAgIHwgQ0UJfAotCXwgRDAJICAgIHwgRDIJfCBENAkgICAgfCBENgl8Ci0JfCBEOAkgICAgfCBEQQl8IERDCSAgICB8IERFCXwKLQl8IEUwIFJCUkFDICB8IEUyIEJDT01NCXwgRTQgRUNPTU0gIHwgRTYJfAotCXwgRTggRUNPTUwgIHwgRUEgV0lUSAl8IEVDCSAgICB8IEVFCXwKLQl8IEYwCSAgICB8IEYyCXwgRjQJICAgIHwgRjYJfAotCXwgRjgJICAgIHwgRkEJfCBGQwkgICAgfCBGRSBMRU5HCXwKLQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiA1MCBFSERFQ0wgaXMgYWxzbyBNT0QyLgotICogNDggQlNMSU5FIGlzIGFsc28gQlJPV1MuCi0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdGFiX2dudS5oIGIvaW5jbHVkZS9hb3V0L3N0YWJfZ251LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMThlMTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L3N0YWJfZ251LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaWZuZGVmIF9fR05VX1NUQUJfXwotCi0vKiBJbmRpY2F0ZSB0aGUgR05VIHN0YWIuaCBpcyBpbiB1c2UuICAqLwotCi0jZGVmaW5lIF9fR05VX1NUQUJfXwotCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWIoTkFNRSwgQ09ERSwgU1RSSU5HKSBOQU1FPUNPREUsCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKE5BTUUsIENPREUsIFNUUklORykgTkFNRT1DT0RFLAotCi1lbnVtIF9fc3RhYl9kZWJ1Z19jb2RlCi17Ci0jaW5jbHVkZSAiYW91dC9zdGFiLmRlZiIKLUxBU1RfVU5VU0VEX1NUQUJfQ09ERQotfTsKLQotI3VuZGVmIF9fZGVmaW5lX3N0YWIKLQotLyogRGVmaW5pdGlvbnMgb2YgImRlc2MiIGZpZWxkIGZvciBOX1NPIHN0YWJzIGluIFNvbGFyaXMyLiAgKi8KLQotI2RlZmluZQlOX1NPX0FTCQkxCi0jZGVmaW5lCU5fU09fQwkJMgotI2RlZmluZQlOX1NPX0FOU0lfQwkzCi0jZGVmaW5lCU5fU09fQ0MJCTQJLyogQysrICovCi0jZGVmaW5lCU5fU09fRk9SVFJBTgk1Ci0jZGVmaW5lCU5fU09fUEFTQ0FMCTYKLQotLyogU29sYXJpczI6IEZsb2F0aW5nIHBvaW50IHR5cGUgdmFsdWVzIGluIGJhc2ljIHR5cGVzLiAgKi8KLQotI2RlZmluZQlORl9OT05FCQkwCi0jZGVmaW5lCU5GX1NJTkdMRQkxCS8qIElFRUUgMzItYml0ICovCi0jZGVmaW5lCU5GX0RPVUJMRQkyCS8qIElFRUUgNjQtYml0ICovCi0jZGVmaW5lCU5GX0NPTVBMRVgJMwkvKiBGb3J0cmFuIGNvbXBsZXggKi8KLSNkZWZpbmUJTkZfQ09NUExFWDE2CTQJLyogRm9ydHJhbiBkb3VibGUgY29tcGxleCAqLwotI2RlZmluZQlORl9DT01QTEVYMzIJNQkvKiBGb3J0cmFuIGNvbXBsZXgqMTYgKi8KLSNkZWZpbmUJTkZfTERPVUJMRQk2CS8qIExvbmcgZG91YmxlICh3aGF0ZXZlciB0aGF0IGlzKSAqLwotCi0jZW5kaWYgLyogX19HTlVfU1RBQl8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdW40LmggYi9pbmNsdWRlL2FvdXQvc3VuNC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJhMGRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9zdW40LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyogU1BBUkMtc3BlY2lmaWMgdmFsdWVzIGZvciBhLm91dCBmaWxlcyAqLwotCi0vKiBTb21lIHN5c3RlbXMsIGUuZy4sIEFJWCwgbWF5IGhhdmUgZGVmaW5lZCB0aGlzIGluIGhlYWRlciBmaWxlcyBhbHJlYWR5Ci0gICBpbmNsdWRlZC4gICovCi0jdW5kZWYgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTB4MjAwMAkJLyogOEsuICBha2EgTkJQRyBpbiA8c3lzL3BhcmFtLmg+ICovCi0vKiBOb3RlIHRoYXQgc29tZSBTUEFSQ3MgaGF2ZSA0SyBwYWdlcywgc29tZSA4Sywgc29tZSBvdGhlcnMuICAqLwotCi0jZGVmaW5lIFNFR19TSVpFX1NQQVJDCVRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUJU0VHX1NJWkVfU1VOMwkweDIwMDAwCQkvKiBSZXNvbHV0aW9uIG9mIHIvdyBwcm90ZWN0aW9uIGh3ICovCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCVRBUkdFVF9QQUdFX1NJWkUJLyogTG9jYXRpb24gMCBpcyBub3QgYWNjZXNzaWJsZSAqLwotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLQotLyogTm9uLWRlZmF1bHQgZGVmaW5pdGlvbnMgb2YgdGhlIGFjY2Vzc29yIG1hY3Jvcy4uLiAqLwotCi0vKiBTZWdtZW50IHNpemUgdmFyaWVzIG9uIFN1bi0zIHZlcnN1cyBTdW4tNC4gICovCi0KLSNkZWZpbmUgTl9TRUdTSVpFKHgpCShOX01BQ0hUWVBFKHgpID09IE1fU1BBUkM/CVNFR19TSVpFX1NQQVJDOglcCi0JCQkgTl9NQUNIVFlQRSh4KSA9PSBNXzY4MDIwPwlTRUdfU0laRV9TVU4zOglcCi0JCQkvKiBHdWVzcz8gKi8JCQlUQVJHRVRfUEFHRV9TSVpFKQotCi0vKiBWaXJ0dWFsIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGZyb20gdGhlIGEub3V0IGZpbGUuICBGb3IgT01BR0lDLAotICAgKGFsbW9zdCBhbHdheXMgInVubGlua2VkIC5vJ3MiIHRoZXNlIGRheXMpLCBzaG91bGQgYmUgemVyby4KLSAgIFN1biBhZGRlZCBhIGtsdWRnZSBzbyB0aGF0IHNoYXJlZCBsaWJyYXJpZXMgbGlua2VkIFpNQUdJQyBnZXQKLSAgIGFuIGFkZHJlc3Mgb2YgemVybyBpZiBhX2VudHJ5ICghISEpIGlzIGxvd2VyIHRoYW4gdGhlIG90aGVyd2lzZQotICAgZXhwZWN0ZWQgdGV4dCBhZGRyZXNzLiAgVGhlc2Uga2x1ZGdlcyBoYXZlIGdvdHRhIGdvIQotICAgRm9yIGxpbmtlZCBmaWxlcywgc2hvdWxkIHJlZmxlY3QgcmVhbGl0eSBpZiB3ZSBrbm93IGl0LiAgKi8KLQotLyogVGhpcyBkaWZmZXJzIGZyb20gdGhlIHZlcnNpb24gaW4gYW91dDY0LmggKHdoaWNoIHdlIG92ZXJyaWRlIGJ5IGRlZmluaW5nCi0gICBpdCBoZXJlKSBvbmx5IGZvciBOTUFHSUMgKHdlIHJldHVybiBURVhUX1NUQVJUX0FERFIrRVhFQ19CWVRFU19TSVpFOwotICAgdGhleSByZXR1cm4gMCkuICAqLwotCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gMCBcCi0gICAgIDogKE5fTUFHSUMoeCkgPT0gWk1BR0lDICYmICh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSKT8gMCBcCi0gICAgIDogVEVYVF9TVEFSVF9BRERSK0VYRUNfQllURVNfU0laRSkKLQotLyogV2hlbiBhIGZpbGUgaXMgbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSBvbiBTdW5PUyA0LCB0aGUKLSAgIGR5bmFtaWMgYml0IGluIHRoZSBleGVjIGhlYWRlciBpcyBzZXQsIGFuZCB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZQotICAgc3ltYm9sIHRhYmxlIGlzIF9fRFlOQU1JQy4gIEl0cyB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljCi17Ci0gIC8qIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgc3RydWN0dXJlLiAgU3VuT1MgNC4xLnggY3JlYXRlcyBmaWxlcwotICAgICB3aXRoIHZlcnNpb24gbnVtYmVyIDMsIHdoaWNoIGlzIHdoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMgYmFzZWQgb24uCi0gICAgIEFjY29yZGluZyB0byBnZGIsIHZlcnNpb24gMiBpcyBzaW1pbGFyLiAgSSBiZWxpZXZlIHRoYXQgdmVyc2lvbiAyCi0gICAgIHVzZWQgYSBkaWZmZXJlbnQgdHlwZSBvZiBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHRoZXJlIG1heQotICAgICBoYXZlIGJlZW4gb3RoZXIgZGlmZmVyZW5jZXMuICAqLwotICBiZmRfYnl0ZSBsZF92ZXJzaW9uWzRdOwotICAvKiBUaGUgdmlydHVhbCBhZGRyZXNzIG9mIGEgMjggYnl0ZSBzdHJ1Y3R1cmUgdXNlZCBpbiBkZWJ1Z2dpbmcuCi0gICAgIFRoZSBjb250ZW50cyBhcmUgZmlsbGVkIGluIGF0IHJ1biB0aW1lIGJ5IGxkLnNvLiAgKi8KLSAgYmZkX2J5dGUgbGRkWzRdOwotICAvKiBUaGUgdmlydHVhbCBhZGRyZXNzIG9mIGFub3RoZXIgc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gYWJvdXQKLSAgICAgaG93IHRvIHJlbG9jYXRlIHRoZSBleGVjdXRhYmxlIGF0IHJ1biB0aW1lLiAgKi8KLSAgYmZkX2J5dGUgbGRbNF07Ci19OwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgZGVidWdnaW5nIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBkZWJ1Z2dlcgotICAgZmllbGQgb2YgX19EWU5BTUlDLiAgKi8KLSNkZWZpbmUgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUgKDI0KQotCi0vKiBUaGUgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGxpbmtlciBmaWVsZCBvZiBfX0RZTkFNSUMuICBBcyBmYXIKLSAgIGFzIEkgY2FuIHRlbGwsIG1vc3Qgb2YgdGhlIGFkZHJlc3NlcyBpbiB0aGlzIHN0cnVjdHVyZSBhcmUgb2Zmc2V0cwotICAgd2l0aGluIHRoZSBmaWxlLCBidXQgc29tZSBhcmUgYWN0dWFsbHkgdmlydHVhbCBhZGRyZXNzZXMuICAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsKLXsKLSAgLyogTGlua2VkIGxpc3Qgb2YgbG9hZGVkIG9iamVjdHMuICBUaGlzIGlzIGZpbGxlZCBpbiBhdCBydW50aW1lIGJ5Ci0gICAgIGxkLnNvIGFuZCBwcm9iYWJseSBieSBkbG9wZW4uICAqLwotICB1bnNpZ25lZCBsb25nIGxkX2xvYWRlZDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgbGlzdCBvZiBuYW1lcyBvZiBzaGFyZWQgb2JqZWN0cyB3aGljaCBtdXN0IGJlCi0gICAgIGluY2x1ZGVkIGF0IHJ1bnRpbWUuICBFYWNoIGVudHJ5IGluIHRoZSBsaXN0IGlzIDE2IGJ5dGVzOiB0aGUgNAotICAgICBieXRlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyBuYW1pbmcgdGhlIG9iamVjdCAoZS5nLiwgZm9yIC1sYyB0aGlzCi0gICAgIGlzICJjIik7IDQgYnl0ZXMgb2YgZmxhZ3MtLXRoZSBoaWdoIGJpdCBpcyB3aGV0aGVyIHRvIHNlYXJjaCBmb3IKLSAgICAgdGhlIG9iamVjdCB1c2luZyB0aGUgbGlicmFyeSBwYXRoOyB0aGUgMiBieXRlIG1ham9yIHZlcnNpb24KLSAgICAgbnVtYmVyOyB0aGUgMiBieXRlIG1pbm9yIHZlcnNpb24gbnVtYmVyOyB0aGUgNCBieXRlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIG5leHQgZW50cnkgaW4gdGhlIGxpc3QgKHplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCBlbnRyeSkuICBUaGUKLSAgICAgdmVyc2lvbiBudW1iZXJzIHNlZW0gdG8gb25seSBiZSBub24temVybyB3aGVuIGRvaW5nIGxpYnJhcnkKLSAgICAgc2VhcmNoaW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9uZWVkOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBwYXRoIHRvIHNlYXJjaCBmb3IgdGhlIHNoYXJlZCBvYmplY3RzIHdoaWNoCi0gICAgIG11c3QgYmUgaW5jbHVkZWQuICBUaGlzIHBvaW50cyB0byBhIHN0cmluZyBpbiBQQVRIIGZvcm1hdCB3aGljaAotICAgICBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgLUwgYXJndW1lbnRzIHRvIHRoZSBsaW5rZXIuICBBY2NvcmRpbmcgdG8KLSAgICAgdGhlIG1hbiBwYWdlLCBsZC5zbyBpbXBsaWNpdGx5IGFkZHMgJHtMRF9MSUJSQVJZX1BBVEh9IHRvIHRoZQotICAgICBiZWdpbm5pbmcgb2YgdGhpcyBzdHJpbmcgYW5kIC9saWI6L3Vzci9saWI6L3Vzci9sb2NhbC9saWIgdG8gdGhlCi0gICAgIGVuZC4gIFRoZSBzdHJpbmcgaXMgdGVybWluYXRlZCBieSBhIG51bGwgYnl0ZS4gIFRoaXMgZmllbGQgaXMKLSAgICAgemVybyBpZiB0aGVyZSBpcyBubyBhZGRpdGlvbmFsIHBhdGguICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3J1bGVzOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgVGhpcyBhcHBlYXJzIHRvIGJlIGEKLSAgICAgdmlydHVhbCBhZGRyZXNzLCBub3QgYSBmaWxlIG9mZnNldC4gIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUKLSAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZSBzZWVtcyB0byBiZSB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZQotICAgICBzdW40X2R5bmFtaWMgc3RydWN0dXJlICh0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgX19EWU5BTUlDIHN5bWJvbCkuCi0gICAgIFRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGlzIHVzZWQgZm9yIFBJQyBjb2RlIHRvIGhvbGQgdGhlCi0gICAgIGFkZHJlc3NlcyBvZiB2YXJpYWJsZXMuICBBIGR5bmFtaWNhbGx5IGxpbmtlZCBmaWxlIHdoaWNoIGRvZXMgbm90Ci0gICAgIGl0c2VsZiBjb250YWluIFBJQyBjb2RlIGhhcyBhIGZvdXIgYnl0ZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9nb3Q7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgVGhpcyBhcHBlYXJzIHRvIGJlIGEKLSAgICAgdmlydHVhbCBhZGRyZXNzLCBub3QgYSBmaWxlIG9mZnNldC4KLQotICAgICBPbiBhIFNQQVJDLCB0aGUgdGFibGUgaXMgY29tcG9zZWQgb2YgMTIgYnl0ZSBlbnRyaWVzLCBlYWNoIG9mCi0gICAgIHdoaWNoIGNvbnNpc3RzIG9mIHRocmVlIGluc3RydWN0aW9ucy4gIFRoZSBmaXJzdCBlbnRyeSBpcwotICAgICAgICAgc2V0aGkgJWhpKDApLCVnMQotCSBqbXAgJWcxCi0JIG5vcAotICAgICBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGNoYW5nZWQgYnkgbGQuc28gaW50byBhIGp1bXAgZGlyZWN0bHkgaW50bwotICAgICBsZC5zbyBpdHNlbGYuICBFYWNoIHN1YnNlcXVlbnQgZW50cnkgaXMKLSAgICAgICAgIHNhdmUgJXNwLCAtOTYsICVzcAotCSBjYWxsIDxhZGRyZXNzIG9mIGZpcnN0IGVudHJ5IGluIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlPgotCSA8cmVsb2NfbnVtYmVyIHwgMHgwMTAwMDAwMD4KLSAgICAgVGhlIHJlbG9jX251bWJlciBpcyB0aGUgbnVtYmVyIG9mIHRoZSByZWxvYyB0byB1c2UgdG8gcmVzb2x2ZQotICAgICB0aGlzIGVudHJ5LiAgVGhlIHJlbG9jIHdpbGwgYmUgYSBKTVBfU0xPVCByZWxvYyBhZ2FpbnN0IHNvbWUKLSAgICAgc3ltYm9sIHRoYXQgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBvYmplY3QgZmlsZSBidXQgc2hvdWxkIGJlCi0gICAgIGRlZmluZWQgaW4gYSBzaGFyZWQgb2JqZWN0IChpZiBpdCBpcyBub3QsIGxkLnNvIHdpbGwgcmVwb3J0IGEKLSAgICAgcnVudGltZSBlcnJvciBhbmQgZXhpdCkuICBUaGUgY29uc3RhbnQgMHgwMTAwMDAwMDAgdHVybnMgdGhlCi0gICAgIHJlbG9jIG51bWJlciBpbnRvIGEgc2V0aGkgb2YgJWcwLCB3aGljaCBkb2VzIG5vdGhpbmcgc2luY2UgJWcwIGlzCi0gICAgIGhhcmR3aXJlZCB0byB6ZXJvLgotCi0gICAgIFdoZW4gb25lIG9mIHRoZXNlIGVudHJpZXMgaXMgZXhlY3V0ZWQsIGl0IHdpbmRzIHVwIGNhbGxpbmcgaW50bwotICAgICBsZC5zby4gIGxkLnNvIGxvb2tzIGF0IHRoZSByZWxvYyBudW1iZXIsIGF2YWlsYWJsZSB2aWEgdGhlIHJldHVybgotICAgICBhZGRyZXNzLCB0byBkZXRlcm1pbmUgd2hpY2ggZW50cnkgdGhpcyBpcy4gIEl0IHRoZW4gbG9va3MgYXQgdGhlCi0gICAgIHJlbG9jIGFuZCBwYXRjaGVzIHVwIHRoZSBlbnRyeSBpbiB0aGUgdGFibGUgaW50byBhIHNldGhpIGFuZCBqbXAKLSAgICAgdG8gdGhlIHJlYWwgYWRkcmVzcyBmb2xsb3dlZCBieSBhIG5vcC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVsb2MKLSAgICAgbG9va3VwIG9ubHkgaGFzIHRvIGhhcHBlbiBvbmNlLCBhbmQgaXQgYWxzbyBtZWFucyB0aGF0IHRoZQotICAgICByZWxvY2F0aW9uIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBpZiB0aGUgZnVuY3Rpb24gaXMgYWN0dWFsbHkKLSAgICAgY2FsbGVkLiAgVGhlIHJlbG9jYXRpb24gaXMgZXhwZW5zaXZlIGJlY2F1c2UgbGQuc28gbXVzdCBsb29rIHVwCi0gICAgIHRoZSBzeW1ib2wgYnkgbmFtZS4KLQotICAgICBUaGUgc2l6ZSBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgZ2l2ZW4gYnkgdGhlIGxkX3BsdF9zegotICAgICBmaWVsZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfcGx0OwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY3MuICBUaGVzZSBhcmUgaW4gdGhlIHNhbWUgZm9ybWF0IGFzCi0gICAgIG9yZGluYXJ5IHJlbG9jcy4gIFN5bWJvbCBpbmRleCBudW1iZXJzIHJlZmVyIHRvIHRoZSBzeW1ib2xzCi0gICAgIHBvaW50ZWQgdG8gYnkgbGRfc3RhYi4gIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGRldGVybWluZSB0aGUKLSAgICAgbnVtYmVyIG9mIHJlbG9jcyBpcyB0byBhc3N1bWUgdGhhdCBhbGwgdGhlIGJ5dGVzIGZyb20gbGRfcmVsIHRvCi0gICAgIGxkX2hhc2ggY29udGFpbiByZWxvYyBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9yZWw7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMuICBUaGUgaGFzaCB0YWJsZSBoYXMKLSAgICAgcm91Z2hseSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcyBhcyB0aGVyZSBhcmUgZHluYW1pYyBzeW1ib2xzOwotICAgICBJIHRoaW5rIHRoZSBvbmx5IHdheSB0byBnZXQgdGhlIGV4YWN0IHNpemUgaXMgdG8gYXNzdW1lIHRoYXQKLSAgICAgZXZlcnkgYnl0ZSBmcm9tIGxkX2hhc2ggdG8gbGRfc3RhYiBpcyBkZXZvdGVkIHRvIHRoZSBoYXNoIHRhYmxlLgotCi0gICAgIEVhY2ggZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgaXMgZWlnaHQgYnl0ZXMuICBUaGUgZmlyc3QgZm91cgotICAgICBieXRlcyBhcmUgYSBzeW1ib2wgaW5kZXggaW50byB0aGUgZHluYW1pYyBzeW1ib2xzLiAgVGhlIHNlY29uZAotICAgICBmb3VyIGJ5dGVzIGFyZSB0aGUgaW5kZXggb2YgdGhlIG5leHQgaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUKLSAgICAgYnVja2V0LiAgVGhlIGxkX2J1Y2tldHMgZmllbGQgZ2l2ZXMgdGhlIG51bWJlciBvZiBidWNrZXRzLCBzYXkgQi4KLSAgICAgVGhlIGZpcnN0IEIgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBlYWNoIHN0YXJ0IGEgYnVja2V0IHdoaWNoCi0gICAgIGlzIGNoYWluZWQgdGhyb3VnaCB0aGUgc2Vjb25kIGZvdXIgYnl0ZXMgb2YgZWFjaCBlbnRyeS4gIEEgdmFsdWUKLSAgICAgb2YgemVybyBlbmRzIHRoZSBjaGFpbi4KLQotICAgICBUaGUgaGFzaCBmdW5jdGlvbiBpcyBzaW1wbHkKLSAgICAgICAgIGggPSAwOwotICAgICAgICAgd2hpbGUgKCpzdHJpbmcgIT0gJ1wwJykKLQkgICBoID0gKGggPDwgMSkgKyAqc3RyaW5nKys7Ci0JIGggJj0gMHg3ZmZmZmZmZjsKLQotICAgICBUbyBsb29rIHVwIGEgc3ltYm9sLCBjb21wdXRlIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBuYW1lLiAgVGFrZQotICAgICB0aGUgbW9kdWxvcyBvZiBoYXNoIHZhbHVlIGFuZCB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMuICBTdGFydCBhdAotICAgICB0aGF0IGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgU2VlIGlmIHRoZSBzeW1ib2wgKGZyb20gdGhlIGZpcnN0Ci0gICAgIGZvdXIgYnl0ZXMgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkpIGhhcyB0aGUgbmFtZSB5b3UgYXJlIGxvb2tpbmcKLSAgICAgZm9yLiAgSWYgbm90LCB1c2UgdGhlIGNoYWluIGZpZWxkICh0aGUgc2Vjb25kIGZvdXIgYnl0ZXMgb2YgdGhlCi0gICAgIGhhc2ggdGFibGUgZW50cnkpIHRvIG1vdmUgb24gdG8gdGhlIG5leHQgZW50cnkgaW4gdGhpcyBidWNrZXQuCi0gICAgIElmIHRoZSBjaGFpbiBmaWVsZCBpcyB6ZXJvIHlvdSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUKLSAgICAgYnVja2V0LCBhbmQgdGhlIHN5bWJvbCBpcyBub3QgaW4gdGhlIGhhc2ggdGFibGUuICAqLyAKLSAgdW5zaWduZWQgbG9uZyBsZF9oYXNoOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGEgbGlzdCBvZgotICAgICBleHRlcm5hbF9ubGlzdCBzdHJ1Y3R1cmVzLiAgVGhlIHN0cmluZyBpbmRpY2VzIGFyZSByZWxhdGl2ZSB0bwotICAgICB0aGUgbGRfc3ltYm9scyBmaWVsZC4gIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGRldGVybWluZSB0aGUKLSAgICAgbnVtYmVyIG9mIHN5bWJvbHMgaXMgdG8gYXNzdW1lIHRoYXQgYWxsIHRoZSBieXRlcyBiZXR3ZWVuIGxkX3N0YWIKLSAgICAgYW5kIGxkX3N5bWJvbHMgYXJlIGV4dGVybmFsX25saXN0IHN0cnVjdHVyZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3N0YWI7Ci0KLSAgLyogSSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBmb3IuICBJdCBzZWVtcyB0byBhbHdheXMgYmUgemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3RhYl9oYXNoOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfYnVja2V0czsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZS4gIFRoZSBmaXJzdCBzdHJpbmcgaW4gdGhpcwotICAgICBzdHJpbmcgdGFibGUgbmVlZCBub3QgYmUgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3ltYm9sczsKLQotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3ltYl9zaXplOwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3RleHQ7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9wbHRfc3o7Ci19OwotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pY19saW5rCi17Ci0gIGJmZF9ieXRlIGxkX2xvYWRlZFs0XTsKLSAgYmZkX2J5dGUgbGRfbmVlZFs0XTsKLSAgYmZkX2J5dGUgbGRfcnVsZXNbNF07Ci0gIGJmZF9ieXRlIGxkX2dvdFs0XTsKLSAgYmZkX2J5dGUgbGRfcGx0WzRdOwotICBiZmRfYnl0ZSBsZF9yZWxbNF07Ci0gIGJmZF9ieXRlIGxkX2hhc2hbNF07Ci0gIGJmZF9ieXRlIGxkX3N0YWJbNF07Ci0gIGJmZF9ieXRlIGxkX3N0YWJfaGFzaFs0XTsKLSAgYmZkX2J5dGUgbGRfYnVja2V0c1s0XTsKLSAgYmZkX2J5dGUgbGRfc3ltYm9sc1s0XTsKLSAgYmZkX2J5dGUgbGRfc3ltYl9zaXplWzRdOwotICBiZmRfYnl0ZSBsZF90ZXh0WzRdOwotICBiZmRfYnl0ZSBsZF9wbHRfc3pbNF07Ci19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iZmRsaW5rLmggYi9pbmNsdWRlL2JmZGxpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4MjdhMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JmZGxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi0vKiBiZmRsaW5rLmggLS0gaGVhZGVyIGZpbGUgZm9yIEJGRCBsaW5rIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIGFuZCBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEJGRExJTktfSAotI2RlZmluZSBCRkRMSU5LX0gKLQotLyogV2hpY2ggc3ltYm9scyB0byBzdHJpcCBkdXJpbmcgYSBsaW5rLiAgKi8KLWVudW0gYmZkX2xpbmtfc3RyaXAKLXsKLSAgc3RyaXBfbm9uZSwJCS8qIERvbid0IHN0cmlwIGFueSBzeW1ib2xzLiAgKi8KLSAgc3RyaXBfZGVidWdnZXIsCS8qIFN0cmlwIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KLSAgc3RyaXBfc29tZSwJCS8qIGtlZXBfaGFzaCBpcyB0aGUgbGlzdCBvZiBzeW1ib2xzIHRvIGtlZXAuICAqLwotICBzdHJpcF9hbGwJCS8qIFN0cmlwIGFsbCBzeW1ib2xzLiAgKi8KLX07Ci0KLS8qIFdoaWNoIGxvY2FsIHN5bWJvbHMgdG8gZGlzY2FyZCBkdXJpbmcgYSBsaW5rLiAgVGhpcyBpcyBpcnJlbGV2YW50Ci0gICBpZiBzdHJpcF9hbGwgaXMgdXNlZC4gICovCi1lbnVtIGJmZF9saW5rX2Rpc2NhcmQKLXsKLSAgZGlzY2FyZF9ub25lLAkJLyogRG9uJ3QgZGlzY2FyZCBhbnkgbG9jYWxzLiAgKi8KLSAgZGlzY2FyZF9sLAkJLyogRGlzY2FyZCBsb2NhbCB0ZW1wb3Jhcnkgc3ltYm9scy4gICovCi0gIGRpc2NhcmRfYWxsCQkvKiBEaXNjYXJkIGFsbCBsb2NhbHMuICAqLwotfTsKLQwKLS8qIFRoZXNlIGFyZSB0aGUgcG9zc2libGUgdHlwZXMgb2YgYW4gZW50cnkgaW4gdGhlIEJGRCBsaW5rIGhhc2gKLSAgIHRhYmxlLiAgKi8KLQotZW51bSBiZmRfbGlua19oYXNoX3R5cGUKLXsKLSAgYmZkX2xpbmtfaGFzaF9uZXcsCQkvKiBTeW1ib2wgaXMgbmV3LiAgKi8KLSAgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQsCS8qIFN5bWJvbCBzZWVuIGJlZm9yZSwgYnV0IHVuZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLAkvKiBTeW1ib2wgaXMgd2VhayBhbmQgdW5kZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLAkvKiBTeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfZGVmd2VhaywJLyogU3ltYm9sIGlzIHdlYWsgYW5kIGRlZmluZWQuICAqLwotICBiZmRfbGlua19oYXNoX2NvbW1vbiwJCS8qIFN5bWJvbCBpcyBjb21tb24uICAqLwotICBiZmRfbGlua19oYXNoX2luZGlyZWN0LAkvKiBTeW1ib2wgaXMgYW4gaW5kaXJlY3QgbGluay4gICovCi0gIGJmZF9saW5rX2hhc2hfd2FybmluZwkJLyogTGlrZSBpbmRpcmVjdCwgYnV0IHdhcm4gaWYgcmVmZXJlbmNlZC4gICovCi19OwotCi0vKiBUaGUgbGlua2luZyByb3V0aW5lcyB1c2UgYSBoYXNoIHRhYmxlIHdoaWNoIHVzZXMgdGhpcyBzdHJ1Y3R1cmUgZm9yCi0gICBpdHMgZWxlbWVudHMuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeQotewotICAvKiBCYXNlIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFR5cGUgb2YgdGhpcyBlbnRyeS4gICovCi0gIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIHR5cGU7Ci0KLSAgLyogVW5kZWZpbmVkIGFuZCBjb21tb24gc3ltYm9scyBhcmUga2VwdCBpbiBhIGxpbmtlZCBsaXN0IHRocm91Z2gKLSAgICAgdGhpcyBmaWVsZC4gIFRoaXMgZmllbGQgaXMgbm90IGluIHRoZSB1bmlvbiBiZWNhdXNlIHRoYXQgd291bGQKLSAgICAgZm9yY2UgdXMgdG8gcmVtb3ZlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCB3aGVuIHdlIGNoYW5nZWQgdGhlaXIKLSAgICAgdHlwZSwgd2hpY2ggd291bGQgZm9yY2UgdGhlIGxpc3QgdG8gYmUgZG91Ymx5IGxpbmtlZCwgd2hpY2ggd291bGQKLSAgICAgd2FzdGUgbW9yZSBtZW1vcnkuICBXaGVuIGFuIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sIGlzCi0gICAgIGNyZWF0ZWQsIGl0IHNob3VsZCBiZSBhZGRlZCB0byB0aGlzIGxpc3QsIHRoZSBoZWFkIG9mIHdoaWNoIGlzIGluCi0gICAgIHRoZSBsaW5rIGhhc2ggdGFibGUgaXRzZWxmLiAgQXMgc3ltYm9scyBhcmUgZGVmaW5lZCwgdGhleSBuZWVkCi0gICAgIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Q7IGFueXRoaW5nIHdoaWNoIHJlYWRzIHRoZSBsaXN0IG11c3QKLSAgICAgZG91YmxlY2hlY2sgdGhlIHN5bWJvbCB0eXBlLgotCi0gICAgIFdlYWsgc3ltYm9scyBhcmUgbm90IGtlcHQgb24gdGhpcyBsaXN0LgotCi0gICAgIERlZmluZWQgYW5kIGRlZndlYWsgc3ltYm9scyB1c2UgdGhpcyBmaWVsZCBhcyBhIHJlZmVyZW5jZSBtYXJrZXIuCi0gICAgIElmIHRoZSBmaWVsZCBpcyBub3QgTlVMTCwgb3IgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIHRhaWwgb2YgdGhlCi0gICAgIHVuZGVmaW5lZCBzeW1ib2wgbGlzdCwgdGhlIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLiAgSWYgdGhlCi0gICAgIHN5bWJvbCBpcyB1bmRlZmluZWQgYW5kIGJlY29tZXMgZGVmaW5lZCwgdGhpcyBmaWVsZCB3aWxsCi0gICAgIGF1dG9tYXRpY2FsbHkgYmUgbm9uLU5VTEwgc2luY2UgdGhlIHN5bWJvbCB3aWxsIGhhdmUgYmVlbiBvbiB0aGUKLSAgICAgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIEEgdW5pb24gb2YgaW5mb3JtYXRpb24gZGVwZW5kaW5nIHVwb24gdGhlIHR5cGUuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIE5vdGhpbmcgaXMga2VwdCBmb3IgYmZkX2hhc2hfbmV3LiAgKi8KLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkLCBiZmRfbGlua19oYXNoX3VuZGVmd2Vhay4gICovCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBiZmQgKmFiZmQ7CQkvKiBCRkQgc3ltYm9sIHdhcyBmb3VuZCBpbi4gICovCi0JfSB1bmRlZjsKLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIGJmZF92bWEgdmFsdWU7CS8qIFN5bWJvbCB2YWx1ZS4gICovCi0JICBhc2VjdGlvbiAqc2VjdGlvbjsJLyogU3ltYm9sIHNlY3Rpb24uICAqLwotCX0gZGVmOwotICAgICAgLyogYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCwgYmZkX2xpbmtfaGFzaF93YXJuaW5nLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpsaW5rOwkvKiBSZWFsIHN5bWJvbC4gICovCi0JICBjb25zdCBjaGFyICp3YXJuaW5nOwkvKiBXYXJuaW5nIChiZmRfbGlua19oYXNoX3dhcm5pbmcgb25seSkuICAqLwotCX0gaTsKLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfY29tbW9uLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIFRoZSBsaW5rZXIgbmVlZHMgdG8ga25vdyB0aHJlZSB0aGluZ3MgYWJvdXQgY29tbW9uCi0gICAgICAgICAgICAgc3ltYm9sczogdGhlIHNpemUsIHRoZSBhbGlnbm1lbnQsIGFuZCB0aGUgc2VjdGlvbiBpbgotICAgICAgICAgICAgIHdoaWNoIHRoZSBzeW1ib2wgc2hvdWxkIGJlIHBsYWNlZC4gIFdlIHN0b3JlIHRoZSBzaXplCi0gICAgICAgICAgICAgaGVyZSwgYW5kIHdlIGFsbG9jYXRlIGEgc21hbGwgc3RydWN0dXJlIHRvIGhvbGQgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBhbmQgdGhlIGFsaWdubWVudC4gIFRoZSBhbGlnbm1lbnQgaXMgc3RvcmVkIGFzIGEKLSAgICAgICAgICAgICBwb3dlciBvZiB0d28uICBXZSBkb24ndCBzdG9yZSBhbGwgdGhlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgZGlyZWN0bHkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGluY3JlYXNlIHRoZSBzaXplIG9mCi0gICAgICAgICAgICAgdGhlIHVuaW9uOyB0aGlzIHN0cnVjdHVyZSBpcyBhIG1ham9yIHNwYWNlIHVzZXIgaW4gdGhlCi0gICAgICAgICAgICAgbGlua2VyLiAgKi8KLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsJLyogQ29tbW9uIHN5bWJvbCBzaXplLiAgKi8KLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsJLyogQWxpZ25tZW50LiAgKi8KLQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsJCS8qIFN5bWJvbCBzZWN0aW9uLiAgKi8KLQkgICAgfSAqcDsKLQl9IGM7Ci0gICAgfSB1OwotfTsKLQotLyogVGhpcyBpcyB0aGUgbGluayBoYXNoIHRhYmxlLiAgSXQgaXMgYSBkZXJpdmVkIGNsYXNzIG9mCi0gICBiZmRfaGFzaF90YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIHRhYmxlIGl0c2VsZi4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLSAgLyogVGhlIGJhY2sgZW5kIHdoaWNoIGNyZWF0ZWQgdGhpcyBoYXNoIHRhYmxlLiAgVGhpcyBpbmRpY2F0ZXMgdGhlCi0gICAgIHR5cGUgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIHdoaWNoIGlzIHNvbWV0aW1lcwotICAgICBpbXBvcnRhbnQgaW5mb3JtYXRpb24gd2hlbiBsaW5raW5nIG9iamVjdCBmaWxlcyBvZiBkaWZmZXJlbnQKLSAgICAgdHlwZXMgdG9nZXRoZXIuICAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICpjcmVhdG9yOwotICAvKiBBIGxpbmtlZCBsaXN0IG9mIHVuZGVmaW5lZCBhbmQgY29tbW9uIHN5bWJvbHMsIGxpbmtlZCB0aHJvdWdoIHRoZQotICAgICBuZXh0IGZpZWxkIGluIHRoZSBiZmRfbGlua19oYXNoX2VudHJ5IHN0cnVjdHVyZS4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnM7Ci0gIC8qIEVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSB0YWlsIG9mIHRoZSB1bmRlZnMgbGlzdC4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnNfdGFpbDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBsaW5rIGhhc2ggdGFibGUuICBJZiBGT0xMT1cgaXMgdHJ1ZSwgdGhpcwotICAgZm9sbG93cyBiZmRfbGlua19oYXNoX2luZGlyZWN0IGFuZCBiZmRfbGlua19oYXNoX3dhcm5pbmcgbGlua3MgdG8KLSAgIHRoZSByZWFsIHN5bWJvbC4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJmZF9saW5rX2hhc2hfbG9va3VwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5LCBib29sZWFuIGZvbGxvdykpOwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBtYWluIGxpbmtlciBoYXNoIHRhYmxlIGlmIHRoZSBzeW1ib2wgbWlnaHQKLSAgIGJlIHdyYXBwZWQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHJlZmVyZW5jZXMgdG8gYW4KLSAgIHVuZGVmaW5lZCBzeW1ib2wsIG5vdCBmb3IgZGVmaW5pdGlvbnMgb2YgYSBzeW1ib2wuICAqLwotCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBib29sZWFuKSk7Ci0KLS8qIFRyYXZlcnNlIGEgbGluayBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9saW5rX2hhc2hfdHJhdmVyc2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwKLQkgICBib29sZWFuICgqKSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSwKLQkgICBQVFIpKTsKLQotLyogQWRkIGFuIGVudHJ5IHRvIHRoZSB1bmRlZnMgbGlzdC4gICovCi1leHRlcm4gdm9pZCBiZmRfbGlua19hZGRfdW5kZWYKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpOwotDAotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY29tbXVuaWNhdGUKLSAgIGJldHdlZW4gQkZEIGFuZCB0aGUgbGlua2VyIHdoZW4gZG9pbmcgYSBsaW5rLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2luZm8KLXsKLSAgLyogRnVuY3Rpb24gY2FsbGJhY2tzLiAgKi8KLSAgY29uc3Qgc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyAqY2FsbGJhY2tzOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUuICAqLwotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIGdlbmVyYXRlIGEgInRhc2sgbGlua2VkIiBvYmplY3QgZmlsZSwKLSAgICAgc2ltaWxhciB0byByZWxvY2F0YWJsZSBidXQgYWxzbyB3aXRoIGdsb2JhbHMgY29udmVydGVkIHRvIHN0YXRpY3MuICovCi0gIGJvb2xlYW4gdGFza19saW5rOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBzaGFyZWQ7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBwcmUtYmluZCBzeW1ib2xzIGluIGEgc2hhcmVkIG9iamVjdC4gICovCi0gIGJvb2xlYW4gc3ltYm9saWM7Ci0gIC8qIHRydWUgaWYgc2hhcmVkIG9iamVjdHMgc2hvdWxkIGJlIGxpbmtlZCBkaXJlY3RseSwgbm90IHNoYXJlZC4gICovCi0gIGJvb2xlYW4gc3RhdGljX2xpbms7Ci0gIC8qIHRydWUgaWYgdGhlIG91dHB1dCBmaWxlIHNob3VsZCBiZSBpbiBhIHRyYWRpdGlvbmFsIGZvcm1hdC4gIFRoaXMKLSAgICAgaXMgZXF1aXZhbGVudCB0byB0aGUgc2V0dGluZyBvZiB0aGUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBmbGFnCi0gICAgIG9uIHRoZSBvdXRwdXQgZmlsZSwgYnV0IG1heSBiZSBjaGVja2VkIHdoZW4gcmVhZGluZyB0aGUgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBib29sZWFuIHRyYWRpdGlvbmFsX2Zvcm1hdDsKLSAgLyogdHJ1ZSBpZiB3ZSB3YW50IHRvIHByb2R1Y2VkIG9wdGltaXplZCBvdXRwdXQgZmlsZXMuICBUaGlzIG1pZ2h0Ci0gICAgIG5lZWQgbXVjaCBtb3JlIHRpbWUgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGV4cGxpY2l0bHkgc2VsZWN0ZWQuICAqLwotICBib29sZWFuIG9wdGltaXplOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgZXJyb3JzIGZvciB1bmRlZmluZWQgc3ltYm9scwotICAgICBldmVuIGlmIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBub191bmRlZmluZWQ7Ci0gIC8qIFdoaWNoIHN5bWJvbHMgdG8gc3RyaXAuICAqLwotICBlbnVtIGJmZF9saW5rX3N0cmlwIHN0cmlwOwotICAvKiBXaGljaCBsb2NhbCBzeW1ib2xzIHRvIGRpc2NhcmQuICAqLwotICBlbnVtIGJmZF9saW5rX2Rpc2NhcmQgZGlzY2FyZDsKLSAgLyogdHJ1ZSBpZiBzeW1ib2xzIHNob3VsZCBiZSByZXRhaW5lZCBpbiBtZW1vcnksIGZhbHNlIGlmIHRoZXkKLSAgICAgc2hvdWxkIGJlIGZyZWVkIGFuZCByZXJlYWQuICAqLwotICBib29sZWFuIGtlZXBfbWVtb3J5OwotICAvKiBUaGUgbGlzdCBvZiBpbnB1dCBCRkQncyBpbnZvbHZlZCBpbiB0aGUgbGluay4gIFRoZXNlIGFyZSBjaGFpbmVkCi0gICAgIHRvZ2V0aGVyIHZpYSB0aGUgbGlua19uZXh0IGZpZWxkLiAgKi8KLSAgYmZkICppbnB1dF9iZmRzOwotICAvKiBJZiBhIHN5bWJvbCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgZWFjaCBpbnB1dCBCRkQsIHRoaXMgaXMgc2VjdGlvbgotICAgICB3aGVyZSB0aG9zZSBzeW1ib2xzIHNob3VsZCBiZSBwbGFjZWQuICBJdCBtdXN0IGJlIGEgc2VjdGlvbiBpbgotICAgICB0aGUgb3V0cHV0IEJGRC4gIEl0IG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIG5vIHN1Y2ggc3ltYm9scwotICAgICB3aWxsIGJlIGNyZWF0ZWQuICBUaGlzIGlzIHRvIHN1cHBvcnQgQ1JFQVRFX09CSkVDVF9TWU1CT0xTIGluIHRoZQotICAgICBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZS4gICovCi0gIGFzZWN0aW9uICpjcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbjsKLSAgLyogSGFzaCB0YWJsZSBoYW5kbGVkIGJ5IEJGRC4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpoYXNoOwotICAvKiBIYXNoIHRhYmxlIG9mIHN5bWJvbHMgdG8ga2VlcC4gIFRoaXMgaXMgTlVMTCB1bmxlc3Mgc3RyaXAgaXMKLSAgICAgc3RyaXBfc29tZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqa2VlcF9oYXNoOwotICAvKiB0cnVlIGlmIGV2ZXJ5IHN5bWJvbCBzaG91bGQgYmUgcmVwb3J0ZWQgYmFjayB2aWEgdGhlIG5vdGljZQotICAgICBjYWxsYmFjay4gICovCi0gIGJvb2xlYW4gbm90aWNlX2FsbDsKLSAgLyogSGFzaCB0YWJsZSBvZiBzeW1ib2xzIHRvIHJlcG9ydCBiYWNrIHZpYSB0aGUgbm90aWNlIGNhbGxiYWNrLiAgSWYKLSAgICAgdGhpcyBpcyBOVUxMLCBhbmQgbm90aWNlX2FsbCBpcyBmYWxzZSwgdGhlbiBubyBzeW1ib2xzIGFyZQotICAgICByZXBvcnRlZCBiYWNrLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICpub3RpY2VfaGFzaDsKLSAgLyogSGFzaCB0YWJsZSBvZiBzeW1ib2xzIHdoaWNoIGFyZSBiZWluZyB3cmFwcGVkICh0aGUgLS13cmFwIGxpbmtlcgotICAgICBvcHRpb24pLiAgSWYgdGhpcyBpcyBOVUxMLCBubyBzeW1ib2xzIGFyZSBiZWluZyB3cmFwcGVkLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp3cmFwX2hhc2g7Ci0gIC8qIElmIGEgYmFzZSBvdXRwdXQgZmlsZSBpcyB3YW50ZWQsIHRoZW4gdGhpcyBwb2ludHMgdG8gaXQgKi8KLSAgUFRSIGJhc2VfZmlsZTsKLQotICAvKiBJZiBub24temVybywgc3BlY2lmaWVzIHRoYXQgYnJhbmNoZXMgd2hpY2ggYXJlIHByb2JsZW1hdGljIGZvciB0aGUKLSAgTVBDODYwIEMwIChvciBlYXJsaWVyKSBzaG91bGQgYmUgY2hlY2tlZCBmb3IgYW5kIG1vZGlmaWVkLiAgSXQgZ2l2ZXMgdGhlCi0gIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGF0IHRoZSBlbmQgb2YgZWFjaCB0ZXh0IHBhZ2UuICovCi0gIGludCBtcGM4NjBjMDsKLQotICAvKiBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QgaXMKLSAgICAgbG9hZGVkLiAgKi8KLSAgY29uc3QgY2hhciAqaW5pdF9mdW5jdGlvbjsKLSAgLyogVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IGlzCi0gICAgIHVubG9hZGVkLiAgKi8KLSAgY29uc3QgY2hhciAqZmluaV9mdW5jdGlvbjsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlcyBob2xkcyBhIHNldCBvZiBjYWxsYmFjayBmdW5jdGlvbnMuICBUaGVzZSBhcmUKLSAgIGNhbGxlZCBieSB0aGUgQkZEIGxpbmtlciByb3V0aW5lcy4gIFRoZSBmaXJzdCBhcmd1bWVudCB0byBlYWNoCi0gICBjYWxsYmFjayBmdW5jdGlvbiBpcyB0aGUgYmZkX2xpbmtfaW5mbyBzdHJ1Y3R1cmUgYmVpbmcgdXNlZC4gIEVhY2gKLSAgIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIHZhbHVlLiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsCi0gICB0aGVuIHRoZSBCRkQgZnVuY3Rpb24gd2hpY2ggY2FsbGVkIGl0IHdpbGwgcmV0dXJuIHdpdGggYSBmYWlsdXJlCi0gICBpbmRpY2F0aW9uLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcwotewotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyBhZGRlZCBmcm9tIGFuCi0gICAgIGFyY2hpdmUuICBBQkZEIGlzIHRoZSBhcmNoaXZlIGVsZW1lbnQgYmVpbmcgYWRkZWQuICBOQU1FIGlzIHRoZQotICAgICBuYW1lIG9mIHRoZSBzeW1ib2wgd2hpY2ggY2F1c2VkIHRoZSBhcmNoaXZlIGVsZW1lbnQgdG8gYmUgcHVsbGVkCi0gICAgIGluLiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9hcmNoaXZlX2VsZW1lbnQpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgYmZkICphYmZkLAotCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHN5bWJvbCBpcyBmb3VuZCB3aXRoIG11bHRpcGxlCi0gICAgIGRlZmluaXRpb25zLiAgTkFNRSBpcyB0aGUgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgbXVsdGlwbGUgdGltZXMuCi0gICAgIE9CRkQgaXMgdGhlIG9sZCBCRkQsIE9TRUMgaXMgdGhlIG9sZCBzZWN0aW9uLCBPVkFMIGlzIHRoZSBvbGQKLSAgICAgdmFsdWUsIE5CRkQgaXMgdGhlIG5ldyBCRkQsIE5TRUMgaXMgdGhlIG5ldyBzZWN0aW9uLCBhbmQgTlZBTCBpcwotICAgICB0aGUgbmV3IHZhbHVlLiAgT0JGRCBtYXkgYmUgTlVMTC4gIE9TRUMgYW5kIE5TRUMgbWF5IGJlCi0gICAgIGJmZF9jb21fc2VjdGlvbiBvciBiZmRfaW5kX3NlY3Rpb24uICAqLwotICBib29sZWFuICgqbXVsdGlwbGVfZGVmaW5pdGlvbikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgIGJmZCAqb2JmZCwKLQkJCQkJICBhc2VjdGlvbiAqb3NlYywKLQkJCQkJICBiZmRfdm1hIG92YWwsCi0JCQkJCSAgYmZkICpuYmZkLAotCQkJCQkgIGFzZWN0aW9uICpuc2VjLAotCQkJCQkgIGJmZF92bWEgbnZhbCkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgIG11bHRpcGxlIHRpbWVzLiAgTkFNRSBpcyB0aGUgc3ltYm9sIGFwcGVhcmluZyBtdWx0aXBsZSB0aW1lcy4KLSAgICAgT0JGRCBpcyB0aGUgQkZEIG9mIHRoZSBleGlzdGluZyBzeW1ib2w7IGl0IG1heSBiZSBOVUxMIGlmIHRoaXMgaXMKLSAgICAgbm90IGtub3duLiAgT1RZUEUgaXMgdGhlIHR5cGUgb2YgdGhlIGV4aXN0aW5nIHN5bWJvbCwgd2hpY2ggbWF5Ci0gICAgIGJlIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLAotICAgICBiZmRfbGlua19oYXNoX2NvbW1vbiwgb3IgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4gIElmIE9UWVBFIGlzCi0gICAgIGJmZF9saW5rX2hhc2hfY29tbW9uLCBPU0laRSBpcyB0aGUgc2l6ZSBvZiB0aGUgZXhpc3Rpbmcgc3ltYm9sLgotICAgICBOQkZEIGlzIHRoZSBCRkQgb2YgdGhlIG5ldyBzeW1ib2wuICBOVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgbmV3Ci0gICAgIHN5bWJvbCwgb25lIG9mIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIG9yCi0gICAgIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QuICBJZiBOVFlQRSBpcyBiZmRfbGlua19oYXNoX2NvbW1vbiwgTlNJWkUKLSAgICAgaXMgdGhlIHNpemUgb2YgdGhlIG5ldyBzeW1ib2wuICAqLwotICBib29sZWFuICgqbXVsdGlwbGVfY29tbW9uKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICAgYmZkICpvYmZkLAotCQkJCSAgICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG90eXBlLAotCQkJCSAgICAgIGJmZF92bWEgb3NpemUsCi0JCQkJICAgICAgYmZkICpuYmZkLAotCQkJCSAgICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG50eXBlLAotCQkJCSAgICAgIGJmZF92bWEgbnNpemUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgdG8gYWRkIGEgc3ltYm9sIHRvIGEgc2V0LiAgRU5UUlkgaXMKLSAgICAgdGhlIGxpbmsgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIHNldCBpdHNlbGYgKGUuZy4sCi0gICAgIF9fQ1RPUl9MSVNUX18pLiAgUkVMT0MgaXMgdGhlIHJlbG9jYXRpb24gdG8gdXNlIGZvciBhbiBlbnRyeSBpbgotICAgICB0aGUgc2V0IHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBmaWxlLCBhbmQgaXMgYWxzbyB1c2VkIHRvCi0gICAgIGdldCB0aGUgc2l6ZSBvZiB0aGUgZW50cnkgd2hlbiBnZW5lcmF0aW5nIGFuIGV4ZWN1dGFibGUgZmlsZS4KLSAgICAgQUJGRCwgU0VDIGFuZCBWQUxVRSBpZGVudGlmeSB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBzZXQuICAqLwotICBib29sZWFuICgqYWRkX3RvX3NldCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmVudHJ5LAotCQkJCSBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2MsCi0JCQkJIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3ZtYSB2YWx1ZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBuYW1lIG9mIGEgZysrIGNvbnN0cnVjdG9yIG9yCi0gICAgIGRlc3RydWN0b3IgaXMgZm91bmQuICBUaGlzIGlzIG9ubHkgY2FsbGVkIGJ5IHNvbWUgb2JqZWN0IGZpbGUKLSAgICAgZm9ybWF0cy4gIENPTlNUUlVDVE9SIGlzIHRydWUgZm9yIGEgY29uc3RydWN0b3IsIGZhbHNlIGZvciBhCi0gICAgIGRlc3RydWN0b3IuICBUaGlzIHdpbGwgdXNlIEJGRF9SRUxPQ19DVE9SIHdoZW4gZ2VuZXJhdGluZyBhCi0gICAgIHJlbG9jYXRlYWJsZSBmaWxlLiAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIGZvdW5kLiAgQUJGRCwKLSAgICAgU0VDVElPTiBhbmQgVkFMVUUgYXJlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiAoKmNvbnN0cnVjdG9yKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgYm9vbGVhbiBjb25zdHJ1Y3RvciwKLQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywKLQkJCQkgIGJmZF92bWEgdmFsdWUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgdG8gaXNzdWUgYSBsaW5rZXIgd2FybmluZy4gIEZvcgotICAgICBleGFtcGxlLCB0aGlzIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIGEgd2FybmluZwotICAgICBzeW1ib2wuICBXQVJOSU5HIGlzIHRoZSB3YXJuaW5nIHRvIGJlIGlzc3VlZC4gIFNZTUJPTCBpcyB0aGUgbmFtZQotICAgICBvZiB0aGUgc3ltYm9sIHdoaWNoIHRyaWdnZXJlZCB0aGUgd2FybmluZzsgaXQgbWF5IGJlIE5VTEwgaWYKLSAgICAgdGhlcmUgaXMgbm9uZS4gIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uCi0gICAgIHdoaWNoIHRyaWdlcnJlZCB0aGUgd2FybmluZzsgZWl0aGVyIEFCRkQgb3IgU0VDVElPTiBvciBib3RoIG1heQotICAgICBiZSBOVUxMIGlmIHRoZSBsb2NhdGlvbiBpcyBub3Qga25vd24uICAqLwotICBib29sZWFuICgqd2FybmluZykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKndhcm5pbmcsIGNvbnN0IGNoYXIgKnN5bWJvbCwKLQkJCSAgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkgICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jYXRpb24gaXMgYXR0ZW1wdGVkIGFnYWluc3QKLSAgICAgYW4gdW5kZWZpbmVkIHN5bWJvbC4gIE5BTUUgaXMgdGhlIHN5bWJvbCB3aGljaCBpcyB1bmRlZmluZWQuCi0gICAgIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlCi0gICAgIHJlZmVyZW5jZSBpcyBtYWRlLiBGQVRBTCBpbmRpY2F0ZXMgd2hldGhlciBhbiB1bmRlZmluZWQgc3ltYm9sIGlzCi0gICAgIGEgZmF0YWwgZXJyb3Igb3Igbm90LiBJbiBzb21lIGNhc2VzIFNFQ1RJT04gbWF5IGJlIE5VTEwuICAqLwotICBib29sZWFuICgqdW5kZWZpbmVkX3N5bWJvbCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgYmZkICphYmZkLAotCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkgICAgICAgYmZkX3ZtYSBhZGRyZXNzLAotCQkJCSAgICAgICBib29sZWFuIGZhdGFsKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBvdmVyZmxvdyBvY2N1cnMuICBOQU1FIGlzCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiB0aGUgcmVsb2MgaXMgYWdhaW5zdCwKLSAgICAgUkVMT0NfTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiwgYW5kIEFEREVORCBpcyBhbnkKLSAgICAgYWRkZW5kIHRoYXQgaXMgdXNlZC4gIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlCi0gICAgIGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBvdmVyZmxvdyBvY2N1cnM7IGlmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhCi0gICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGVuCi0gICAgIEFCRkQgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnJlbG9jX292ZXJmbG93KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKnJlbG9jX25hbWUsIGJmZF92bWEgYWRkZW5kLAotCQkJCSAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgZGFuZ2Vyb3VzIHJlbG9jIGlzIHBlcmZvcm1lZC4KLSAgICAgVGhlIGNhbm9uaWNhbCBleGFtcGxlIGlzIGFuIGEyOWsgSUhDT05TVCByZWxvYyB3aGljaCBkb2VzIG5vdAotICAgICBmb2xsb3cgYW4gSUhJSEFMRiByZWxvYy4gIE1FU1NBR0UgaXMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZS4KLSAgICAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlCi0gICAgIHByb2JsZW0gb2NjdXJyZWQ7IGlmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhCi0gICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGVuCi0gICAgIEFCRkQgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnJlbG9jX2Rhbmdlcm91cykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICBjb25zdCBjaGFyICptZXNzYWdlLAotCQkJCSAgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJICAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBpcyBmb3VuZCB0byBiZSBhdHRhY2hlZAotICAgICB0byBhIHN5bWJvbCB3aGljaCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICBOQU1FIGlzIHRoZSBuYW1lIG9mCi0gICAgIHRoZSBzeW1ib2wuICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBvZgotICAgICB0aGUgcmVsb2M7IGlmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhCi0gICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGVuCi0gICAgIEFCRkQgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnVuYXR0YWNoZWRfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJICAgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGluIG5vdGljZV9oYXNoIGlzCi0gICAgIGRlZmluZWQgb3IgcmVmZXJlbmNlZC4gIE5BTUUgaXMgdGhlIHN5bWJvbC4gIEFCRkQsIFNFQ1RJT04gYW5kCi0gICAgIEFERFJFU1MgYXJlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgSWYgU0VDVElPTiBpcwotICAgICBiZmRfdW5kX3NlY3Rpb24sIHRoaXMgaXMgYSByZWZlcmVuY2UuICAqLwotICBib29sZWFuICgqbm90aWNlKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBiZmRfdm1hIGFkZHJlc3MpKTsKLX07Ci0MCi0vKiBUaGUgbGlua2VyIGJ1aWxkcyBsaW5rX29yZGVyIHN0cnVjdHVyZXMgd2hpY2ggdGVsbCB0aGUgY29kZSBob3cgdG8KLSAgIGluY2x1ZGUgaW5wdXQgZGF0YSBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0vKiBUaGVzZSBhcmUgdGhlIHR5cGVzIG9mIGxpbmtfb3JkZXIgc3RydWN0dXJlcy4gICovCi0KLWVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZQotewotICBiZmRfdW5kZWZpbmVkX2xpbmtfb3JkZXIsCS8qIFVuZGVmaW5lZC4gICovCi0gIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyLAkvKiBCdWlsdCBmcm9tIGEgc2VjdGlvbi4gICovCi0gIGJmZF9maWxsX2xpbmtfb3JkZXIsCQkvKiBGaWxsIHdpdGggYSAxNiBiaXQgY29uc3RhbnQuICAqLwotICBiZmRfZGF0YV9saW5rX29yZGVyLAkJLyogU2V0IHRvIGV4cGxpY2l0IGRhdGEuICAqLwotICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyLAkvKiBSZWxvY2F0ZSBhZ2FpbnN0IGEgc2VjdGlvbi4gICovCi0gIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcgkvKiBSZWxvY2F0ZSBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlIGl0c2VsZi4gIFRoZXNlIGZvcm0gYSBjaGFpbgotICAgYXR0YWNoZWQgdG8gdGhlIHNlY3Rpb24gd2hvc2UgY29udGVudHMgdGhleSBhcmUgZGVzY3JpYmluZy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19vcmRlciAKLXsKLSAgLyogTmV4dCBsaW5rX29yZGVyIGluIGNoYWluLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpuZXh0OwotICAvKiBUeXBlIG9mIGxpbmtfb3JkZXIuICAqLwotICBlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUgdHlwZTsKLSAgLyogT2Zmc2V0IHdpdGhpbiBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgb2Zmc2V0OyAgCi0gIC8qIFNpemUgd2l0aGluIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBUeXBlIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5pb24gCi0gICAgewotICAgICAgc3RydWN0IAotCXsKLQkgIC8qIFNlY3Rpb24gdG8gaW5jbHVkZS4gIElmIHRoaXMgaXMgdXNlZCwgdGhlbgotCSAgICAgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gbXVzdCBiZSB0aGUgc2VjdGlvbiB0aGUKLQkgICAgIGxpbmtfb3JkZXIgaXMgYXR0YWNoZWQgdG8sIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQgbXVzdAotCSAgICAgZXF1YWwgdGhlIGxpbmtfb3JkZXIgb2Zmc2V0IGZpZWxkLCBhbmQgc2VjdGlvbi0+X3Jhd19zaXplCi0JICAgICBtdXN0IGVxdWFsIHRoZSBsaW5rX29yZGVyIHNpemUgZmllbGQuICBNYXliZSB0aGVzZQotCSAgICAgcmVzdHJpY3Rpb25zIHNob3VsZCBiZSByZWxheGVkIHNvbWVkYXkuICAqLwotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0JfSBpbmRpcmVjdDsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIFZhbHVlIHRvIGZpbGwgd2l0aC4gICovCi0JICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0JfSBmaWxsOwotICAgICAgc3RydWN0Ci0JewotCSAgLyogRGF0YSB0byBwdXQgaW50byBmaWxlLiAgVGhlIHNpemUgZmllbGQgZ2l2ZXMgdGhlIG51bWJlcgotCSAgICAgb2YgYnl0ZXMgd2hpY2ggdGhpcyBmaWVsZCBwb2ludHMgdG8uICAqLwotCSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCX0gZGF0YTsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIERlc2NyaXB0aW9uIG9mIHJlbG9jIHRvIGdlbmVyYXRlLiAgVXNlZCBmb3IKLQkgICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgYW5kCi0JICAgICBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIuICAqLwotCSAgc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jICpwOwotCX0gcmVsb2M7Ci0gICAgfSB1OwotfTsKLQotLyogQSBsaW5rZXIgb3JkZXIgb2YgdHlwZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIG9yCi0gICBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIgbWVhbnMgdG8gY3JlYXRlIGEgcmVsb2MgYWdhaW5zdCBhCi0gICBzZWN0aW9uIG9yIHN5bWJvbCwgcmVzcGVjdGl2ZWx5LiAgVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCAtVXIgdG8KLSAgIGdlbmVyYXRlIHJlbG9jcyBmb3IgdGhlIGNvbnN0cnVjdG9yIHRhYmxlcy4gIFRoZQotICAgYmZkX2xpbmtfb3JkZXJfcmVsb2Mgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcmVsb2MgdGhhdCBCRkQgc2hvdWxkCi0gICBjcmVhdGUuICBJdCBpcyBzaW1pbGFyIHRvIGEgYXJlbGVudCwgYnV0IEkgZGlkbid0IHVzZSBhcmVsZW50Ci0gICBiZWNhdXNlIHRoZSBsaW5rZXIgZG9lcyBub3Qga25vdyBhbnl0aGluZyBhYm91dCBtb3N0IHN5bWJvbHMsIGFuZAotICAgYW55IGFzeW1ib2wgc3RydWN0dXJlIGl0IGNyZWF0ZXMgd2lsbCBiZSBwYXJ0aWFsbHkgbWVhbmluZ2xlc3MuCi0gICBUaGlzIGluZm9ybWF0aW9uIGNvdWxkIGxvZ2ljYWxseSBiZSBpbiB0aGUgYmZkX2xpbmtfb3JkZXIgc3RydWN0LAotICAgYnV0IEkgZGlkbid0IHdhbnQgdG8gd2FzdGUgdGhlIHNwYWNlIHNpbmNlIHRoZXNlIHR5cGVzIG9mIHJlbG9jcwotICAgYXJlIHJlbGF0aXZlbHkgcmFyZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYwotewotICAvKiBSZWxvYyB0eXBlLiAgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogRm9yIHR5cGUgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciwgdGhpcyBpcyB0aGUgc2VjdGlvbgotCSB0aGUgcmVsb2Mgc2hvdWxkIGJlIGFnYWluc3QuICBUaGlzIG11c3QgYmUgYSBzZWN0aW9uIGluIHRoZQotCSBvdXRwdXQgQkZELCBub3QgYW55IG9mIHRoZSBpbnB1dCBCRkRzLiAgKi8KLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgLyogRm9yIHR5cGUgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZQotCSBzeW1ib2wgdGhlIHJlbG9jIHNob3VsZCBiZSBhZ2FpbnN0LiAgKi8KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgfSB1OwotCi0gIC8qIEFkZGVuZCB0byB1c2UuICBUaGUgb2JqZWN0IGZpbGUgc2hvdWxkIGNvbnRhaW4gemVyby4gIFRoZSBCRkQKLSAgICAgYmFja2VuZCBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdAotICAgICBmaWxlIGNvcnJlY3RseS4gIEZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgKGUuZy4sIENPRkYpIHRoZQotICAgICBhZGRlbmQgbXVzdCBiZSBzdG9yZWQgaW50byBpbiB0aGUgb2JqZWN0IGZpbGUsIGFuZCBmb3Igc29tZQotICAgICAoZS5nLiwgU1BBUkMgYS5vdXQpIGl0IGlzIGtlcHQgaW4gdGhlIHJlbG9jLiAgKi8KLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBBbGxvY2F0ZSBhIG5ldyBsaW5rX29yZGVyIGZvciBhIHNlY3Rpb24uICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19vcmRlciAqYmZkX25ld19saW5rX29yZGVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gZGVzY3JpYmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlCi0gICBFTEYgbGlua2VyLiAgVGhlc2Ugc3RydWN0dXJlcyBjb3VsZCBiZSBtYW5pcHVsYXRlZCBlbnRpcmVseSBpbnNpZGUKLSAgIEJGRCwgYnV0IGl0IHdvdWxkIGJlIGEgcGFpbi4gIEluc3RlYWQsIHRoZSByZWd1bGFyIGxpbmtlciBzZXRzIHVwCi0gICB0aGVzZSBzdHJ1Y3R1cmVzLCBhbmQgdGhlbiBwYXNzZXMgdGhlbSBpbnRvIEJGRC4gICovCi0KLS8qIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGEgdmVyc2lvbi4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwcgotewotICAvKiBOZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpuZXh0OwotICAvKiBSZWd1bGFyIGV4cHJlc3Npb24uICAqLwotICBjb25zdCBjaGFyICpwYXR0ZXJuOwotICAvKiBNYXRjaGluZyBmdW5jdGlvbi4gICovCi0gIGludCAoKm1hdGNoKSBQQVJBTVMoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqLCBjb25zdCBjaGFyICopKTsKLX07Ci0KLS8qIFZlcnNpb24gZGVwZW5kZW5jaWVzLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzCi17Ci0gIC8qIE5leHQgZGVwZW5kZW5jeSBmb3IgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpuZXh0OwotICAvKiBUaGUgdmVyc2lvbiB3aGljaCB0aGlzIHZlcnNpb24gZGVwZW5kcyB1cG9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJzaW9uX25lZWRlZDsKLX07Ci0KLS8qIEEgbm9kZSBpbiB0aGUgdmVyc2lvbiB0cmVlLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlCi17Ci0gIC8qIE5leHQgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqbmV4dDsKLSAgLyogTmFtZSBvZiB0aGlzIHZlcnNpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBWZXJzaW9uIG51bWJlci4gICovCi0gIHVuc2lnbmVkIGludCB2ZXJudW07Ci0gIC8qIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGdsb2JhbCBzeW1ib2xzIGluIHRoaXMgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZ2xvYmFsczsKLSAgLyogUmVndWxhciBleHByZXNzaW9ucyBmb3IgbG9jYWwgc3ltYm9scyBpbiB0aGlzIHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmxvY2FsczsKLSAgLyogTGlzdCBvZiB2ZXJzaW9ucyB3aGljaCB0aGlzIHZlcnNpb24gZGVwZW5kcyB1cG9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpkZXBzOwotICAvKiBJbmRleCBvZiB0aGUgdmVyc2lvbiBuYW1lLiAgVGhpcyBpcyB1c2VkIHdpdGhpbiBCRkQuICAqLwotICB1bnNpZ25lZCBpbnQgbmFtZV9pbmR4OwotICAvKiBXaGV0aGVyIHRoaXMgdmVyc2lvbiB0cmVlIHdhcyB1c2VkLiAgVGhpcyBpcyB1c2VkIHdpdGhpbiBCRkQuICAqLwotICBpbnQgdXNlZDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib3V0LmggYi9pbmNsdWRlL2JvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjMjhjYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiAnYS5vdXQuaCcuICBJdCBpcyB0byBiZSB1c2VkIGluIGFsbAotICogR05VIHRvb2xzIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIGk4MDk2MCAob3IgdG9vbHMgdGhhdCBvcGVyYXRlIG9uCi0gKiBvYmplY3QgZmlsZXMgY3JlYXRlZCBieSBzdWNoIHRvb2xzKS4KLSAqCi0gKiBBbGwgaTgwOTYwIGRldmVsb3BtZW50IGlzIGRvbmUgaW4gYSBDUk9TUy1ERVZFTE9QTUVOVCBlbnZpcm9ubWVudC4gIEkuZS4sCi0gKiBvYmplY3QgY29kZSBpcyBnZW5lcmF0ZWQgb24sIGFuZCBleGVjdXRlZCB1bmRlciB0aGUgZGlyZWN0aW9uIG9mIGEgc3ltYm9saWMKLSAqIGRlYnVnZ2VyIHJ1bm5pbmcgb24sIGEgaG9zdCBzeXN0ZW0uICBXZSBkbyBub3Qgd2FudCB0byBiZSBzdWJqZWN0IHRvIHRoZQotICogdmFnYXJpZXMgb2Ygd2hpY2ggaG9zdCBpdCBpcyBvciB3aGV0aGVyIGl0IHN1cHBvcnRzIENPRkYgb3IgYS5vdXQgZm9ybWF0LAotICogb3IgYW55dGhpbmcgZWxzZS4gIFdlIERPIHdhbnQgdG86Ci0gKgotICoJbyBhbHdheXMgZ2VuZXJhdGUgdGhlIHNhbWUgZm9ybWF0IG9iamVjdCBmaWxlcywgcmVnYXJkbGVzcyBvZiBob3N0LgotICoKLSAqCW8gaGF2ZSBhbiAnYS5vdXQnIGhlYWRlciB0aGF0IHdlIGNhbiBtb2RpZnkgZm9yIG91ciBvd24gcHVycG9zZXMKLSAqCSAgKHRoZSA4MDk2MCBpcyB0eXBpY2FsbHkgYW4gZW1iZWRkZWQgcHJvY2Vzc29yIGFuZCBtYXkgcmVxdWlyZQotICoJICBlbmhhbmNlZCBsaW5rZXIgc3VwcG9ydCB0aGF0IHRoZSBub3JtYWwgYS5vdXQuaCBoZWFkZXIgY2FuJ3QKLSAqCSAgYWNjb21tb2RhdGUpLgotICoKLSAqIEFzIGZvciBieXRlLW9yZGVyaW5nLCB0aGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgotICoKLSAqCW8gVGV4dCBhbmQgZGF0YSB0aGF0IGlzIGFjdHVhbGx5IGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCBpcyBhbHdheXMKLSAqCSAgaW4gaTgwOTYwIChsaXR0bGUtZW5kaWFuKSBvcmRlci4KLSAqCi0gKglvIEFsbCBvdGhlciBudW1iZXJzIChpbiB0aGUgaGVhZGVyLCBzeW1ib2xzLCByZWxvY2F0aW9uIGRpcmVjdGl2ZXMpCi0gKgkgIGFyZSBpbiBob3N0IGJ5dGUtb3JkZXI6ICBvYmplY3QgZmlsZXMgQ0FOTk9UIGJlIGxpZnRlZCBmcm9tIGEKLSAqCSAgbGl0dGxlLWVuZCBob3N0IGFuZCB1c2VkIG9uIGEgYmlnLWVuZGlhbiAob3IgdmljZSB2ZXJzYSkgd2l0aG91dAotICoJICBtb2RpZmljYXRpb24uCi0gKiA9PT4gVEhJUyBJUyBOTyBMT05HRVIgVFJVRSBVU0lORyBCRkQuICBXRSBDQU4gR0VORVJBVEUgQU5ZIEJZVEUgT1JERVIKLSAqICAgICBGT1IgVEhFIEhFQURFUiwgQU5EIFJFQUQgQU5ZIEJZVEUgT1JERVIuICBQUkVGRVJFTkNFIFdPVUxEIEJFIFRPCi0gKiAgICAgVVNFIExJVFRMRS1FTkRJQU4gQllURSBPUkRFUiBUSFJPVUdIT1VULCBSRUdBUkRMRVNTIE9GIEhPU1QuICA8PT0KLSAqCi0gKglvIFRoZSBkb3dubG9hZGVyICgnY29tbTk2MCcpIHRha2VzIGNhcmUgdG8gZ2VuZXJhdGUgYSBwc2V1ZG8taGVhZGVyCi0gKgkgIHdpdGggY29ycmVjdCAoaTgwOTYwKSBieXRlLW9yZGVyaW5nIGJlZm9yZSBzaGlwcGluZyB0ZXh0IGFuZCBkYXRhCi0gKgkgIG9mZiB0byB0aGUgTklORFkgbW9uaXRvciBpbiB0aGUgdGFyZ2V0IHN5c3RlbXMuICBTeW1ib2xzIGFuZAotICoJICByZWxvY2F0aW9uIGluZm8gYXJlIG5ldmVyIHNlbnQgdG8gdGhlIHRhcmdldC4KLSAqLwotCi0KLSNkZWZpbmUgQk1BR0lDCTA0MTUKLS8qIFdlIGRvbid0IGFjY2VwdCB0aGUgZm9sbG93aW5nIChzZWUgTl9CQURNQUcgbWFjcm8pLgotICogVGhleSdyZSBqdXN0IGhlcmUgc28gR05VIGNvZGUgd2lsbCBjb21waWxlLgotICovCi0jZGVmaW5lCU9NQUdJQwkwNDA3CQkvKiBvbGQgaW1wdXJlIGZvcm1hdCAqLwotI2RlZmluZQlOTUFHSUMJMDQxMAkJLyogcmVhZC1vbmx5IHRleHQgKi8KLSNkZWZpbmUJWk1BR0lDCTA0MTMJCS8qIGRlbWFuZCBsb2FkIGZvcm1hdCAqLwotCi0vKiBGSUxFIEhFQURFUgotICoJQWxsICdsZW5ndGhzJyBhcmUgZ2l2ZW4gYXMgYSBudW1iZXIgb2YgYnl0ZXMuCi0gKglBbGwgJ2FsaWdubWVudHMnIGFyZSBmb3IgcmVsaW5rYWJsZSBmaWxlcyBvbmx5OyAgYW4gYWxpZ25tZW50IG9mCi0gKgkJJ24nIGluZGljYXRlcyB0aGUgY29ycmVzcG9uZGluZyBzZWdtZW50IG11c3QgYmVnaW4gYXQgYW4KLSAqCQlhZGRyZXNzIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiAoMioqbikuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9leGVjIHsKLQkvKiBTdGFuZGFyZCBzdHVmZiAqLwotCXVuc2lnbmVkIGNoYXIgZV9pbmZvWzRdOwkvKiBJZGVudGlmaWVzIHRoaXMgYXMgYSBiLm91dCBmaWxlICovCi0JdW5zaWduZWQgY2hhciBlX3RleHRbNF07CS8qIExlbmd0aCBvZiB0ZXh0ICovCi0JdW5zaWduZWQgY2hhciBlX2RhdGFbNF07CS8qIExlbmd0aCBvZiBkYXRhICovCi0JdW5zaWduZWQgY2hhciBlX2Jzc1s0XTsJCS8qIExlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSAqLwotCXVuc2lnbmVkIGNoYXIgZV9zeW1zWzRdOwkvKiBMZW5ndGggb2Ygc3ltYm9sIHRhYmxlICovCi0JdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOwkvKiBSdW50aW1lIHN0YXJ0IGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBjaGFyIGVfdHJzaXplWzRdOwkvKiBMZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8gKi8KLQl1bnNpZ25lZCBjaGFyIGVfZHJzaXplWzRdOwkvKiBMZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gKi8KLQotCS8qIEFkZGVkIGZvciBpOTYwICovCi0JdW5zaWduZWQgY2hhciBlX3Rsb2FkWzRdOwkvKiBUZXh0IHJ1bnRpbWUgbG9hZCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhciBlX2Rsb2FkWzRdOwkvKiBEYXRhIHJ1bnRpbWUgbG9hZCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhciBlX3RhbGlnblsxXTsJLyogQWxpZ25tZW50IG9mIHRleHQgc2VnbWVudCAqLwotCXVuc2lnbmVkIGNoYXIgZV9kYWxpZ25bMV07CS8qIEFsaWdubWVudCBvZiBkYXRhIHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfYmFsaWduWzFdOwkvKiBBbGlnbm1lbnQgb2YgYnNzIHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfcmVsYXhhYmxlWzFdOwkvKiBBc3NlbWJsZWQgd2l0aCBlbm91Z2ggaW5mbyB0byBhbGxvdyBsaW5rZXIgdG8gcmVsYXggKi8KLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCShzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9leGVjKSkKLQotLyogVGhlc2UgbWFjcm9zIHVzZSB0aGUgYV94eHggZmllbGQgbmFtZXMsIHNpbmNlIHRoZXkgb3BlcmF0ZSBvbiB0aGUgZXhlYwotICAgc3RydWN0dXJlIGFmdGVyIGl0J3MgYmVlbiBieXRlLXN3YXBwZWQgYW5kIHJlYWxpZ25lZCBvbiB0aGUgaG9zdCBtYWNoaW5lLiAqLwotI2RlZmluZSBOX0JBRE1BRyh4KQkoKCh4KS5hX2luZm8pIT1CTUFHSUMpCi0jZGVmaW5lIE5fVFhUT0ZGKHgpCUVYRUNfQllURVNfU0laRQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX1RSRUxPRkYJTl9UUk9GRgotI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fRFJFTE9GRglOX0RST0ZGCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLSNkZWZpbmUgTl9EQVRBRERSKHgpCSggKHgpLmFfZGxvYWQgKSAgICAKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jaWYgIWRlZmluZWQgKE5fVFhUQUREUikKLSNkZWZpbmUgTl9UWFRBRERSKHgpIDAKLSNlbmRpZgotCi0vKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gKi8KLXN0cnVjdCBubGlzdCB7Ci0JdW5pb24gewotCQljaGFyCSpuX25hbWU7Ci0JCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCQlsb25nCW5fc3RyeDsJCS8qIEluZGV4IGludG8gc3RyaW5nIHRhYmxlCSovCi0JfSBuX3VuOwotCXVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KLQljaGFyCW5fb3RoZXI7CS8qIFVzZWQgaW4gaTgwOTYwIHN1cHBvcnQgLS0gc2VlIGJlbG93CSovCi0Jc2hvcnQJbl9kZXNjOwotCXVuc2lnbmVkIGxvbmcgbl92YWx1ZTsKLX07Ci0KLQotLyogTGVnYWwgdmFsdWVzIG9mIG5fdHlwZQotICovCi0jZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wJKi8KLSNkZWZpbmUgTl9BQlMJMgkvKiBBYnNvbHV0ZSBzeW1ib2wJKi8KLSNkZWZpbmUgTl9URVhUCTQJLyogVGV4dCBzeW1ib2wJCSovCi0jZGVmaW5lIE5fREFUQQk2CS8qIERhdGEgc3ltYm9sCQkqLwotI2RlZmluZSBOX0JTUwk4CS8qIEJTUyBzeW1ib2wJCSovCi0jZGVmaW5lIE5fRk4JMzEJLyogRmlsZW5hbWUgc3ltYm9sCSovCi0KLSNkZWZpbmUgTl9FWFQJMQkvKiBFeHRlcm5hbCBzeW1ib2wgKE9SJ2QgaW4gd2l0aCBvbmUgb2YgYWJvdmUpCSovCi0jZGVmaW5lIE5fVFlQRQkwMzYJLyogTWFzayBmb3IgYWxsIHRoZSB0eXBlIGJpdHMJCQkqLwotI2RlZmluZSBOX1NUQUIJMDM0MAkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KLQotLyogTUVBTklORyBPRiAnbl9vdGhlcicKLSAqCi0gKiBJZiBub24temVybywgdGhlICduX290aGVyJyBmaWVsZHMgaW5kaWNhdGVzIGVpdGhlciBhIGxlYWYgcHJvY2VkdXJlIG9yCi0gKiBhIHN5c3RlbSBwcm9jZWR1cmUsIGFzIGZvbGxvd3M6Ci0gKgotICoJMSA8PSBuX290aGVyIDw9IDMyIDoKLSAqCQlUaGUgc3ltYm9sIGlzIHRoZSBlbnRyeSBwb2ludCB0byBhIHN5c3RlbSBwcm9jZWR1cmUuCi0gKgkJJ25fdmFsdWUnIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSwgYXMgZm9yIGFueSBvdGhlcgotICoJCXByb2NlZHVyZS4gIFRoZSBzeXN0ZW0gcHJvY2VkdXJlIG51bWJlciAod2hpY2ggY2FuIGJlIHVzZWQgaW4KLSAqCQlhICdjYWxscycgaW5zdHJ1Y3Rpb24pIGlzIChuX290aGVyLTEpLiAgVGhlc2UgZW50cmllcyBjb21lIGZyb20KLSAqCQknLnN5c3Byb2MnIGRpcmVjdGl2ZXMuCi0gKgotICoJbl9vdGhlciA9PSBOX0NBTExOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2NhbGwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlICpuZXh0KiBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSBtdXN0IGJlIHRoZSBjb3JyZXNwb25kaW5nCi0gKgkJJ2JhbCcgZW50cnkgcG9pbnQgdG8gdGhlIHByb2NlZHVyZSAoc2VlIGZvbGxvd2luZykuICBUaGVzZQotICoJCWVudHJpZXMgY29tZSBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggdHdvIGRpZmZlcmVudAotICoJCXN5bWJvbHMgYXJlIHNwZWNpZmllZCAodGhlIGZpcnN0IG9uZSBpcyByZXByZXNlbnRlZCBoZXJlKS4KLSAqCQotICoKLSAqCW5fb3RoZXIgPT0gTl9CQUxOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2JhbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KLSAqCQlUaGVzZSBlbnRyaWVzIHJlc3VsdCBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggb25seQotICoJCW9uZSBzeW1ib2wgaXMgc3BlY2lmaWVkLCBvciBpbiB3aGljaCB0aGUgc2FtZSBzeW1ib2wgaXMKLSAqCQlzcGVjaWZpZWQgdHdpY2UuCi0gKgotICogTm90ZSB0aGF0IGFuIE5fQ0FMTE5BTUUgZW50cnkgKm11c3QqIGhhdmUgYSBjb3JyZXNwb25kaW5nIE5fQkFMTkFNRSBlbnRyeSwKLSAqIGJ1dCBub3QgZXZlcnkgTl9CQUxOQU1FIGVudHJ5IG11c3QgaGF2ZSBhbiBOX0NBTExOQU1FIGVudHJ5LgotICovCi0jZGVmaW5lIE5fQ0FMTE5BTUUJKChjaGFyKS0xKQotI2RlZmluZSBOX0JBTE5BTUUJKChjaGFyKS0yKQotI2RlZmluZSBJU19DQUxMTkFNRSh4KQkoTl9DQUxMTkFNRSA9PSAoeCkpCi0jZGVmaW5lIElTX0JBTE5BTUUoeCkJKE5fQkFMTkFNRSA9PSAoeCkpCi0jZGVmaW5lIElTX09USEVSKHgpCSgoeCk+MCAmJiAoeCkgPD0zMikKLQotI2RlZmluZSBiX291dF9yZWxvY2F0aW9uX2luZm8gcmVsb2NhdGlvbl9pbmZvCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvIHsKLQlpbnQJIHJfYWRkcmVzczsJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCi0JdW5zaWduZWQKLSNkZWZpbmUgcl9pbmRleCByX3N5bWJvbG51bQotCQlyX3N5bWJvbG51bToyNCwvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCwKLQkJCQkqCWlmIHJfZXh0ZXJuIGlzIHNldC4gIE90aGVyd2lzZSBzZXQgdG8KLQkJCQkqCWVpdGhlciBOX1RFWFQsIE5fREFUQSwgb3IgTl9CU1MgdG8KLQkJCQkqCWluZGljYXRlIHNlY3Rpb24gb24gd2hpY2ggcmVsb2NhdGlvbiBpcwotCQkJCSoJYmFzZWQuCi0JCQkJKi8KLQkJcl9wY3JlbDoxLAkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCi0JCQkJICoJT24gaTk2MCwgcGMtcmVsYXRpdmUgaW1wbGllcyAyNC1iaXQKLQkJCQkgKglhZGRyZXNzLCBhYnNvbHV0ZSBpbXBsaWVzIDMyLWJpdC4KLQkJCQkgKi8KLQkJcl9sZW5ndGg6MiwJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlbG9jYXRlOgotCQkJCSAqCTAgPT4gMSBieXRlCi0JCQkJICoJMSA9PiAyIGJ5dGVzIC0tIHVzZWQgZm9yIDEzIGJpdCBwY3JlbAotCQkJCSAqCTIgPT4gNCBieXRlcyAKLQkJCQkgKi8KLQkJcl9leHRlcm46MSwKLQkJcl9ic3I6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotCQlyX2Rpc3A6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotCQlyX2NhbGxqOjEsCS8qIDEgaWYgcmVsb2NhdGlvbiB0YXJnZXQgaXMgYW4gaTk2MCAnY2FsbGonICovCi0JCXJfcmVsYXhhYmxlOjE7CS8qIDEgaWYgZW5vdWdoIGluZm8gaXMgbGVmdCB0byByZWxheAotCQkJCSAgIHRoZSBkYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYWxsYmFjay5oIGIvaW5jbHVkZS9jYWxsYmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc1Mjg0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY2FsbGJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKiBSZW1vdGUgdGFyZ2V0IHN5c3RlbSBjYWxsIGNhbGxiYWNrIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpbnRlcmZhY2UgaXNuJ3QgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIga2luZAotICAgb2YgcmVtb3RlIChoYXJkd2FyZSwgc2ltdWxhdG9yLCB3aGF0ZXZlcikuICBBcyBzdWNoLCBzdXBwb3J0IGZvciBpdAotICAgKGUuZy4gc2ltL2NvbW1vbi9jYWxsYmFjay5jKSBzaG91bGQgKm5vdCogbGl2ZSBpbiB0aGUgc2ltdWxhdG9yIHNvdXJjZQotICAgdHJlZSwgbm9yIHNob3VsZCBpdCBsaXZlIGluIHRoZSBnZGIgc291cmNlIHRyZWUuICAqLwotCi0vKiBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGhhbmRsZSBzeXN0ZW0gY2FsbHM6Ci0KLSAgIDEpIEhhdmUgYSBzaW11bGF0b3IgaW50ZXJjZXB0IHRoZSBhcHByb3ByaWF0ZSB0cmFwIGluc3RydWN0aW9uIGFuZAotICAgZGlyZWN0bHkgcGVyZm9ybSB0aGUgc3lzdGVtIGNhbGwgb24gYmVoYWxmIG9mIHRoZSB0YXJnZXQgcHJvZ3JhbS4KLSAgIFRoaXMgaXMgdGhlIHR5cGljYWwgd2F5IG9mIGhhbmRsaW5nIHN5c3RlbSBjYWxscyBmb3IgZW1iZWRkZWQgdGFyZ2V0cy4KLSAgIFtIYW5kbGluZyBzeXN0ZW0gY2FsbHMgZm9yIGVtYmVkZGVkIHRhcmdldHMgaXNuJ3QgdGhhdCBtdWNoIG9mIGFuCi0gICBveHltb3JvbiBhcyBydW5uaW5nIGNvbXBpbGVyIHRlc3RzdWl0ZXMgbWFrZSB1c2Ugb2YgdGhlIGNhcGFiaWxpdHkuXQotCi0gICBUaGlzIG1ldGhvZCBvZiBzeXN0ZW0gY2FsbCBoYW5kbGluZyBpcyBkb25lIHdoZW4gU1RBVEVfRU5WSVJPTk1FTlQKLSAgIGlzIEVOVklST05NRU5UX1VTRVIuCi0KLSAgIDIpIEhhdmUgYSBzaW11bGF0b3IgZW11bGF0ZSB0aGUgaGFyZHdhcmUgYXMgbXVjaCBhcyBwb3NzaWJsZS4KLSAgIElmIHRoZSBwcm9ncmFtIHJ1bm5pbmcgb24gdGhlIHJlYWwgaGFyZHdhcmUgY29tbXVuaWNhdGVzIHdpdGggc29tZSBzb3J0Ci0gICBvZiB0YXJnZXQgbWFuYWdlciwgb25lIHdvdWxkIHdhbnQgdG8gYmUgYWJsZSB0byBydW4gdGhpcyBwcm9ncmFtIG9uIHRoZQotICAgc2ltdWxhdG9yIGFzIHdlbGwuCi0KLSAgIFRoaXMgbWV0aG9kIG9mIHN5c3RlbSBjYWxsIGhhbmRsaW5nIGlzIGRvbmUgd2hlbiBTVEFURV9FTlZJUk9OTUVOVAotICAgaXMgRU5WSVJPTk1FTlRfT1BFUkFUSU5HLgotKi8KLQotI2lmbmRlZiBDQUxMQkFDS19ICi0jZGVmaW5lIENBTExCQUNLX0gKLQotLyogPz8/IFRoZSByZWFzb24gd2h5IHdlIGNoZWNrIGZvciB2YV9zdGFydCBoZXJlIHNob3VsZCBiZSBkb2N1bWVudGVkLiAgKi8KLQotI2lmbmRlZiB2YV9zdGFydAotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0MCi0vKiBNYXBwaW5nIG9mIGhvc3QvdGFyZ2V0IHZhbHVlcy4gICovCi0vKiA/Pz8gRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgb25lIG1pZ2h0IHdhbnQgdG8gYWRkIGEgc3RyaW5nIG9mIHRoZQotICAgbmFtZSBvZiB0aGUgc3ltYm9sLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgaG9zdF92YWw7Ci0gIGludCB0YXJnZXRfdmFsOwotfSBDQl9UQVJHRVRfREVGU19NQVA7Ci0KLSNkZWZpbmUgTUFYX0NBTExCQUNLX0ZEUyAxMAotCi0vKiBGb3J3YXJkIGRlY2wgZm9yIHN0YXQvZnN0YXQuICAqLwotc3RydWN0IHN0YXQ7Ci0KLXR5cGVkZWYgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0IGhvc3RfY2FsbGJhY2s7Ci0KLXN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAKLXsKLSAgaW50ICgqY2xvc2UpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKixpbnQpKTsKLSAgaW50ICgqZ2V0X2Vycm5vKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLSAgaW50ICgqaXNhdHR5KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotICBpbnQgKCpsc2VlaykgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQsIGxvbmcgLCBpbnQpKTsKLSAgaW50ICgqb3BlbikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyKiwgaW50IG1vZGUpKTsKLSAgaW50ICgqcmVhZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLGludCwgIGNoYXIgKiwgaW50KSk7Ci0gIGludCAoKnJlYWRfc3RkaW4pIFBBUkFNUyAoKCBob3N0X2NhbGxiYWNrICosIGNoYXIgKiwgaW50KSk7Ci0gIGludCAoKnJlbmFtZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotICBpbnQgKCpzeXN0ZW0pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqKSk7Ci0gIGxvbmcgKCp0aW1lKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGxvbmcgKikpOwotICBpbnQgKCp1bmxpbmspIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqKSk7Ci0gIGludCAoKndyaXRlKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosaW50LCBjb25zdCBjaGFyICosIGludCkpOwotICBpbnQgKCp3cml0ZV9zdGRvdXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLSAgdm9pZCAoKmZsdXNoX3N0ZG91dCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKndyaXRlX3N0ZGVycikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIGludCkpOwotICB2b2lkICgqZmx1c2hfc3RkZXJyKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLSAgaW50ICgqc3RhdCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopKTsKLSAgaW50ICgqZnN0YXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50LCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLSAgLyogV2hlbiBwcmVzZW50LCBjYWxsIHRvIHRoZSBjbGllbnQgdG8gZ2l2ZSBpdCB0aGUgb3BvcnR1bml0eSB0bwotICAgICBwb2xsIGFueSBpbyBkZXZpY2VzIGZvciBhIHJlcXVlc3QgdG8gcXVpdCAoaW5kaWNhdGVkIGJ5IGEgbm9uemVybwotICAgICByZXR1cm4gdmFsdWUpLiAqLwotICBpbnQgKCpwb2xsX3F1aXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotCi0gIC8qIFVzZWQgd2hlbiB0aGUgdGFyZ2V0IGhhcyBnb25lIGF3YXksIHNvIHdlIGNhbiBjbG9zZSBvcGVuCi0gICAgIGhhbmRsZXMgYW5kIGZyZWUgbWVtb3J5IGV0YyBldGMuICAqLwotICBpbnQgKCpzaHV0ZG93bikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKmluaXQpICAgICBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLQotICAvKiBkZXByZWNpYXRlZCwgdXNlIHZwcmludGZfZmlsdGVyZWQgLSBUYWxrIHRvIHRoZSB1c2VyIG9uIGEgY29uc29sZS4gICovCi0gIHZvaWQgKCpwcmludGZfZmlsdGVyZWQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLQotICAvKiBUYWxrIHRvIHRoZSB1c2VyIG9uIGEgY29uc29sZS4gICovCi0gIHZvaWQgKCp2cHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotCi0gIC8qIFNhbWUgYXMgdnByaW50Zl9maWx0ZXJlZCBidXQgdG8gc3RkZXJyLiAgKi8KLSAgdm9pZCAoKmV2cHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotCi0gIC8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kICJleGl0Ii4KLSAgICAgSW4gdGhlIGNhc2Ugb2YgZ2RiICJleGl0aW5nIiBtZWFucyBkb2luZyBhIGxvbmdqbXAgYmFjayB0byB0aGUgbWFpbgotICAgICBjb21tYW5kIGxvb3AuICAqLwotICB2b2lkICgqZXJyb3IpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLQotICBpbnQgbGFzdF9lcnJubzsJCS8qIGhvc3QgZm9ybWF0ICovCi0KLSAgaW50IGZkbWFwW01BWF9DQUxMQkFDS19GRFNdOwotICBjaGFyIGZkb3BlbltNQVhfQ0FMTEJBQ0tfRkRTXTsKLSAgY2hhciBhbHdheXNvcGVuW01BWF9DQUxMQkFDS19GRFNdOwotCi0gIC8qIFN5c3RlbSBjYWxsIG51bWJlcnMuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKnN5c2NhbGxfbWFwOwotICAvKiBFcnJubyB2YWx1ZXMuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKmVycm5vX21hcDsKLSAgLyogRmxhZ3MgdG8gdGhlIG9wZW4gc3lzdGVtIGNhbGwuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKm9wZW5fbWFwOwotICAvKiBTaWduYWwgbnVtYmVycy4gICovCi0gIENCX1RBUkdFVF9ERUZTX01BUCAqc2lnbmFsX21hcDsKLSAgLyogTGF5b3V0IG9mIGBzdGF0JyBzdHJ1Y3QuCi0gICAgIFRoZSBmb3JtYXQgaXMgYSBzZXJpZXMgb2YgIm5hbWUsbGVuZ3RoIiBwYWlycyBzZXBhcmF0ZWQgYnkgY29sb25zLgotICAgICBFbXB0eSBzcGFjZSBpcyBpbmRpY2F0ZWQgd2l0aCBhIGBuYW1lJyBvZiAic3BhY2UiLgotICAgICBBbGwgcGFkZGluZyBtdXN0IGJlIGV4cGxpY2l0bHkgbWVudGlvbmVkLgotICAgICBMZW5ndGhzIGFyZSBpbiBieXRlcy4gIElmIHRoaXMgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgdG8gYml0cywKLSAgICAgdXNlICJuYW1lLmJpdHMiLgotICAgICBFeGFtcGxlOiAic3RfZGV2LDQ6c3RfaW5vLDQ6c3RfbW9kZSw0Oi4uLiIgICovCi0gIGNvbnN0IGNoYXIgKnN0YXRfbWFwOwotCi0gIC8qIE1hcmtlciBmb3IgdGhvc2Ugd2FudGluZyB0byBkbyBzYW5pdHkgY2hlY2tzLgotICAgICBUaGlzIHNob3VsZCByZW1haW4gdGhlIGxhc3QgbWVtYmVyIG9mIHRoaXMgc3RydWN0IHRvIGhlbHAgY2F0Y2gKLSAgICAgbWlzY29tcGlsYXRpb24gZXJyb3JzLiAqLwotI2RlZmluZSBIT1NUX0NBTExCQUNLX01BR0lDIDQ3MDUgLyogdGVkcyBjb25zdGFudCAqLwotICBpbnQgbWFnaWM7Ci19OwotCi1leHRlcm4gaG9zdF9jYWxsYmFjayBkZWZhdWx0X2NhbGxiYWNrOwotDAotLyogQ2Fub25pY2FsIHZlcnNpb25zIG9mIHN5c3RlbSBjYWxsIG51bWJlcnMuCi0gICBJdCdzIG5vdCBpbnRlbmRlZCB0byB3aWxseS1uaWxseSB0aHJvdyBldmVyeSBzeXN0ZW0gY2FsbCBldmVyIGhlYXJkCi0gICBvZiBpbiBoZXJlLiAgT25seSBpbmNsdWRlIHRob3NlIHRoYXQgaGF2ZSBhbiBpbXBvcnRhbnQgdXNlLgotICAgPz8/IE9uZSBjYW4gY2VydGFpbmx5IHN0YXJ0IGEgZGlzY3Vzc2lvbiBvdmVyIHRoZSBvbmVzIHRoYXQgYXJlIGN1cnJlbnRseQotICAgaGVyZSwgYnV0IHRoYXQgd2lsbCBhbHdheXMgYmUgdHJ1ZS4gICovCi0KLS8qIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBBTlNJIEMgc3VwcG9ydCBvZiBsaWJjLiAgKi8KLSNkZWZpbmUJQ0JfU1lTX2V4aXQJMQotI2RlZmluZQlDQl9TWVNfb3BlbgkyCi0jZGVmaW5lCUNCX1NZU19jbG9zZQkzCi0jZGVmaW5lCUNCX1NZU19yZWFkCTQKLSNkZWZpbmUJQ0JfU1lTX3dyaXRlCTUKLSNkZWZpbmUJQ0JfU1lTX2xzZWVrCTYKLSNkZWZpbmUJQ0JfU1lTX3VubGluawk3Ci0jZGVmaW5lCUNCX1NZU19nZXRwaWQJOAotI2RlZmluZQlDQl9TWVNfa2lsbAk5Ci0jZGVmaW5lIENCX1NZU19mc3RhdCAgICAxMAotLyojZGVmaW5lIENCX1NZU19zYnJrCTExIC0gbm90IGN1cnJlbnRseSBhIHN5c3RlbSBjYWxsLCBidXQgcmVzZXJ2ZWQuICAqLwotCi0vKiBBUkdWIHN1cHBvcnQuICAqLwotI2RlZmluZSBDQl9TWVNfYXJndmxlbgkxMgotI2RlZmluZSBDQl9TWVNfYXJndgkxMwotCi0vKiBUaGVzZSBhcmUgZXh0cmFzIGFkZGVkIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuICAqLwotI2RlZmluZSBDQl9TWVNfY2hkaXIJMTQKLSNkZWZpbmUgQ0JfU1lTX3N0YXQJMTUKLSNkZWZpbmUgQ0JfU1lTX2NobW9kIAkxNgotI2RlZmluZSBDQl9TWVNfdXRpbWUgCTE3Ci0jZGVmaW5lIENCX1NZU190aW1lIAkxOAotDAotLyogU3RydWN0IHVzZSB0byBwYXNzIGFuZCByZXR1cm4gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHBlcmZvcm0gYQotICAgc3lzdGVtIGNhbGwuICAqLwotLyogRklYTUU6IE5lZWQgdG8gY29uc2lkZXIgdGFyZ2V0IHdvcmQgc2l6ZS4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNiX3N5c2NhbGwgewotICAvKiBUaGUgdGFyZ2V0J3MgdmFsdWUgb2Ygd2hhdCBzeXN0ZW0gY2FsbCB0byBwZXJmb3JtLiAgKi8KLSAgaW50IGZ1bmM7Ci0gIC8qIFRoZSBhcmd1bWVudHMgdG8gdGhlIHN5c2NhbGwuICAqLwotICBsb25nIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQ7Ci0KLSAgLyogVGhlIHJlc3VsdC4gICovCi0gIGxvbmcgcmVzdWx0OwotICAvKiBTb21lIHN5c3RlbSBjYWxscyBoYXZlIHR3byByZXN1bHRzLiAgKi8KLSAgbG9uZyByZXN1bHQyOwotICAvKiBUaGUgdGFyZ2V0J3MgZXJybm8gdmFsdWUsIG9yIDAgaWYgc3VjY2Vzcy4KLSAgICAgVGhpcyBpcyBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCdzIHZhbHVlIHdpdGggaG9zdF90b190YXJnZXRfZXJybm8uICAqLwotICBpbnQgZXJyY29kZTsKLQotICAvKiBXb3JraW5nIHNwYWNlIHRvIGJlIHVzZWQgYnkgbWVtb3J5IHJlYWQvd3JpdGUgY2FsbGJhY2tzLiAgKi8KLSAgUFRSIHAxOwotICBQVFIgcDI7Ci0gIGxvbmcgeDEseDI7Ci0KLSAgLyogQ2FsbGJhY2tzIGZvciByZWFkaW5nL3dyaXRpbmcgbWVtb3J5IChlLmcuIGZvciByZWFkL3dyaXRlIHN5c2NhbGxzKS4KLSAgICAgPz8/IGxvbmcgb3IgdW5zaWduZWQgbG9uZyBtaWdodCBiZSBiZXR0ZXIgdG8gdXNlIGZvciB0aGUgYGNvdW50JwotICAgICBhcmd1bWVudCBoZXJlLiAgV2UgbWltaWMgc2ltX3tyZWFkLHdyaXRlfSBmb3Igbm93LiAgQmUgY2FyZWZ1bCB0bwotICAgICB0ZXN0IGFueSBjaGFuZ2VzIHdpdGggLVdhbGwgLVdlcnJvciwgbWl4ZWQgc2lnbmVkIGNvbXBhcmlzb25zCi0gICAgIHdpbGwgZ2V0IHlvdS4gICovCi0gIGludCAoKnJlYWRfbWVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICogLypjYiovLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqIC8qc2MqLywKLQkJCSAgIHVuc2lnbmVkIGxvbmcgLyp0YWRkciovLCBjaGFyICogLypidWYqLywKLQkJCSAgIGludCAvKmJ5dGVzKi8pKTsKLSAgaW50ICgqd3JpdGVfbWVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICogLypjYiovLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqIC8qc2MqLywKLQkJCSAgICB1bnNpZ25lZCBsb25nIC8qdGFkZHIqLywgY29uc3QgY2hhciAqIC8qYnVmKi8sCi0JCQkgICAgaW50IC8qYnl0ZXMqLykpOwotCi0gIC8qIEZvciBzYW5pdHkgY2hlY2tpbmcsIHNob3VsZCBiZSBsYXN0IGVudHJ5LiAgKi8KLSAgaW50IG1hZ2ljOwotfSBDQl9TWVNDQUxMOwotCi0vKiBNYWdpYyBudW1iZXIgc2FuaXR5IGNoZWNrZXIuICAqLwotI2RlZmluZSBDQl9TWVNDQUxMX01BR0lDIDB4MTIzNDQzMjEKLQotLyogTWFjcm8gdG8gaW5pdGlhbGl6ZSBDQl9TWVNDQUxMLiAgQ2FsbGVkIGZpcnN0LCBiZWZvcmUgZmlsbGluZyBpbgotICAgYW55IGZpZWxkcy4gICovCi0jZGVmaW5lIENCX1NZU0NBTExfSU5JVChzYykgXAotZG8geyBcCi0gIG1lbXNldCAoKHNjKSwgMCwgc2l6ZW9mICgqKHNjKSkpOyBcCi0gIChzYyktPm1hZ2ljID0gQ0JfU1lTQ0FMTF9NQUdJQzsgXAotfSB3aGlsZSAoMCkKLQwKLS8qIFJldHVybiBjb2RlcyBmb3IgdmFyaW91cyBpbnRlcmZhY2Ugcm91dGluZXMuICAqLwotCi10eXBlZGVmIGVudW0gewotICBDQl9SQ19PSyA9IDAsCi0gIC8qIGdlbmVyaWMgZXJyb3IgKi8KLSAgQ0JfUkNfRVJSLAotICAvKiBlaXRoZXIgZmlsZSBub3QgZm91bmQgb3Igbm8gcmVhZCBhY2Nlc3MgKi8KLSAgQ0JfUkNfQUNDRVNTLAotICBDQl9SQ19OT19NRU0KLX0gQ0JfUkM7Ci0KLS8qIFJlYWQgaW4gdGFyZ2V0IHZhbHVlcyBmb3Igc3lzdGVtIGNhbGwgbnVtYmVycywgZXJybm8gdmFsdWVzLCBzaWduYWxzLiAgKi8KLUNCX1JDIGNiX3JlYWRfdGFyZ2V0X3N5c2NhbGxfbWFwcyBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBUcmFuc2xhdGUgdGFyZ2V0IHRvIGhvc3Qgc3lzY2FsbCBmdW5jdGlvbiBudW1iZXJzLiAgKi8KLWludCBjYl90YXJnZXRfdG9faG9zdF9zeXNjYWxsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSBob3N0IHRvIHRhcmdldCBlcnJubyB2YWx1ZS4gICovCi1pbnQgY2JfaG9zdF90b190YXJnZXRfZXJybm8gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIHRhcmdldCB0byBob3N0IG9wZW4gZmxhZ3MuICAqLwotaW50IGNiX3RhcmdldF90b19ob3N0X29wZW4gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIHRhcmdldCBzaWduYWwgbnVtYmVyIHRvIGhvc3QuICAqLwotaW50IGNiX3RhcmdldF90b19ob3N0X3NpZ25hbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgaG9zdCBzaWduYWwgbnVtYmVyIHRvIHRhcmdldC4gICovCi1pbnQgY2JfaG9zdF90b190YXJnZXRfc2lnbmFsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSBob3N0IHN0YXQgc3RydWN0IHRvIHRhcmdldC4KLSAgIElmIHN0YXQgc3RydWN0IHB0ciBpcyBOVUxMLCBqdXN0IGNvbXB1dGUgdGFyZ2V0IHN0YXQgc3RydWN0IHNpemUuCi0gICBSZXN1bHQgaXMgc2l6ZSBvZiB0YXJnZXQgc3RhdCBzdHJ1Y3Qgb3IgMCBpZiBlcnJvci4gICovCi1pbnQgY2JfaG9zdF90b190YXJnZXRfc3RhdCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IHN0cnVjdCBzdGF0ICosIFBUUikpOwotCi0vKiBQZXJmb3JtIGEgc3lzdGVtIGNhbGwuICAqLwotQ0JfUkMgY2Jfc3lzY2FsbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIENCX1NZU0NBTEwgKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9DaGFuZ2VMb2cgYi9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmI1MmMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4NzIgKzAsMCBAQAotMjAwMC0wMy0xNSAgS2F6dSBIaXJhdGEgIDxrYXp1QGh4aS5jb20+Ci0KLQkqIGludGVybmFsLmg6IEZpeCBhIHR5cG8gaW4gdGhlIGNvbW1lbnQgZm9yIFJfTU9WTDIuCi0KLTIwMDAtMDItMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1pcHNwZS5oIChNSVBTX1BFX01BR0lDKTogRGVmaW5lLgotCSogc2guaCAoU0hfUEVfTUFHSUMpOiBEZWZpbmUuCi0KLTIwMDAtMDItMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+ICBESiBEZWxvcmllIDxkakBjeWdudXMuY29tPgotCi0JKiBzaC5oOiBBZGQgV2luZG93cyBDRSBkZWZpbml0aW9ucy4KLQkqIGFybS5oOiBBZGQgV2luZG93cyBDRSBkZWZpbml0aW9ucy4KLQkqIG1pcHNwZS5oOiBOZXcgZmlsZTogV2luZG93cyBDRSBkZWZpbml0aW9ucyBmb3IgTUlQUy4KLQkqIHBlLmg6IEFkZCBjb25zdGFudHMgZm9yIElMRiBzdXBwb3J0LgotCQotMjAwMC0wMS0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGUuaDogRml4IGZvcm1hdHRpbmcgb2YgY29tbWVudHMuCi0JKElNQUdFX0ZJTEVfQUdHUkVTU0lWRV9XU19UUklNKTogRGVmaW5lLgotCShJTUFHRV9GSUxFX0xBUkdFX0FERFJFU1NfQVdBUkUpOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfMTZCSVRfTUFDSElORSk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9SRU1PVkFCTEVfUlVOX0ZST01fU1dBUCk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9VUF9TWVNURU1fT05MWSk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX1VOS05PV04pOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9BTFBIQSk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX0FMUEhBNjQpOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9JMzg2KTogRGVmaW5lLgotCShJTUFHRV9GSUxFX01BQ0hJTkVfSUE2NCk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX002OEspOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9NSVBTMTYpOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9NSVBTRlBVKTogRGVmaW5lLgotCShJTUFHRV9GSUxFX01BQ0hJTkVfTUlQU0ZQVTE2KTogRGVmaW5lLgotCShJTUFHRV9GSUxFX01BQ0hJTkVfUE9XRVJQQyk6IERlZmluZS4KLQkoSU1BR0VfRklMRV9NQUNISU5FX1IzMDAwKTogRGVmaW5lLgotCShJTUFHRV9GSUxFX01BQ0hJTkVfUjQwMDApOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9SMTAwMDApOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9TSDMpOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9TSDQpOiBEZWZpbmUuCi0JKElNQUdFX0ZJTEVfTUFDSElORV9USFVNQik6IERlZmluZS4KLQotMTk5OS0wOS0yMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpbnRlcm5hbC5oOiBEZWxldGUgYm9ndXMgUl9QQ0xPTkcsIGR1cGxpY2F0ZSBSX1JFTEJZVEUgYW5kCi0JUl9SRUxXT1JELCBhbmQgcmV3cml0ZSBzb21lIFJfKiBhcyBkZWNpbWFsLgotCi0xOTk5LTA5LTA2ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogaW50ZXJuYWwuaCAoRFRZUEUpOiBEZWZpbmUuCi0JKiBwZS5oIChzdHJ1Y3QgZXh0ZXJuYWxfUEVJX2ZpbGVoZHIpOiBSZW5hbWUgZnJvbQotCWV4dGVybmFsX1BFX2ZpbGVoZHIuICBEZWZpbmUgZXZlbiBpZiBDT0ZGX0lNQUdFX1dJVEhfUEUgaXMgbm90Ci0JZGVmaW5lZC4KLQotMTk5OS0wNy0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKEZfU09GVF9GTE9BVCk6IFJlbmFtZSBmcm9tIEZfU09GVEZMT0FULgotCi0xOTk5LTA2LTIxICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogYXJtLmggKEZfU09GVEZMT0FUKTogRGVmaW5lLgotCi0xOTk5LTA3LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0uaCAoRl9BUk1fNSk6IERlZmluZS4KLQotV2VkIEp1biAgMiAxODowODoxOCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChCRU9TX0VYRV9JTUFHRV9CQVNFLCBCRU9TX0RMTF9JTUFHRV9CQVNFKTogTmV3LgotCi1Nb24gTWF5IDE3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb2ZmL2FybS5oIChGX1BJQywgRl9BUk1fMiwgRl9BUk1fMmEsIEZfQVJNXzMsIEZfQVJNXzNNLAotCUZfQVJNXzQsIEZfQVJNXzRULCBGX0FQQ1MyNik6IENoYW5nZWQgdmFsdWVzIHRvIGRpc3Rpbmd1aXNoCi0JRl9BUk1fMmEsIEZfQVJNXzNNLCBGX0FSTV80VC4KLQotMTk5OS0wNS0xNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoSU1BR0VfUkVMX01DT1JFX1JWQSk6IERlZmluZS4KLQotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoR0VUX0xJTkVOT19MTk5PKTogTmV3IG1hY3JvLgotCShQVVRfTElORU5PX0xOTk8pOiBOZXcgbWFjcm8uCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmg6IE5ldyBoZWFkZXIgZmlsZS4gIERlZmluZXMgZm9yIE1vdG9yb2xhJ3MgTUNvcmUKLQlwcm9jZXNzb3IuIAotCi1TdW4gRGVjICA2IDIxOjM2OjM3IDE5OTggIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAdXNhLm5ldD4KLQotCSogaW50ZXJuYWwuaCAoQ19XRUFLRVhUKTogRGVmaW5lLgotCi1XZWQgSmFuIDI3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb2ZmL2FybS5oIChGX1BJQ19JTlQsIEZfQVJNXzIsIEZfQVJNXzMsIEZfQVJNXzQsIEZfQVBDUzI2KToKLQlDaGFuZ2VkIHZhbHVlcyB0byBhdm9pZCBjbGFzaGluZyB3aXRoIElNQUdFX0ZJTEVfKiBjb2ZmIGhlYWRlcgotCWZsYWcgdmFsdWVzLgotCQotV2VkIEFwciAgMSAxNjowNjoxNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiBEb2N1bWVudCBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCBUaHVtYiBzeW1ib2wKLQl0eXBlcy4gCi0KLUZyaSBNYXIgMjcgMTc6MTY6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChJU1BUUiwgSVNGQ04sIElTQVJZKTogQWRkIGNhc3RzIHRvIHVuc2lnbmVkIGxvbmcuCi0KLU1vbiBGZWIgIDIgMTc6MTA6MzggMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogdGljMzAuaDogTmV3IGZpbGUuCi0KLUZyaSBEZWMgMTIgMTE6NDk6MDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFJfTVBQQ1IxNVcpOiBOZXcgcmVsb2NhdGlvbiB0eXBlLCBmb3IgMTUgYml0IFBDIHJlbGF0aXZlCi0Jb2Zmc2V0cy4KLQotVHVlIERlYyAgMiAxMDoyMTo0MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0uaCAoQ09GRkFSTSk6IE5ldyBkZWZpbmUuCi0KLVNhdCBOb3YgMjIgMTU6MTA6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoQ19USFVNQkVYVEZVTkMsIENfVEhVTUJTVEFURlVOQyk6IENvbnN0YW50cyB0bwotCWRlZmluZSBzdGF0aWMgYW5kIGV4dGVybmFsIGZ1bmN0aW9ucy4KLQotCSogYXJtLmg6IEFkZCBiaXRzIHRvIHN1cHBvcnQgUElDIGFuZCBBUENTLUZMT0FUIHR5cGUgYmluYXJpZXMsCi0Jd2hlbiBpbXBsZW1lbnRlZC4KLQotRnJpIE9jdCAgMyAxNDoyNToxNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUl9QUEwxNkIpOiBNYWtlIGNvbnN0YW50IHVwcGVyY2FzZSBmb3IgY29uc2lzdGVuY3kuCi0KLVR1ZSBKdWwgMjIgMTg6MTg6NTggMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBnbzMyZXhlLmg6IE5ldyBmaWxlLgotCi1UdWUgSnVsICA4IDEyOjIzOjU1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9UQVJHRVRfSUQpOiBBZGQgZGVmaW5lLgotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIpOiBBZGQgZl90YXJnZXRfaWQgZmllbGQuCi0KLVR1ZSBKdW4gIDMgMTY6NDQ6MTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaDogQWRkIHN0b3JhZ2UgY2xhc3NlcyBmb3IgVGh1bWIgc3ltYm9scwotCi1Nb24gTWF5IDI2IDE0OjA3OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUl9QUEwxNkIpOiBDb3JyZWN0IHZhbHVlLgotCi1TYXQgTWF5ICAzIDA4OjI0OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChDX1VFWFQsIENfU1RBVExBQiwgQ19FWFRMQUIsIENfU1lTVEVNKToKLQlOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MC4KLQotRnJpIEFwciAxOCAxMTo1Mjo1NSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBhbHBoYS5oIChBTFBIQV9FQ09GRl9CQURNQUcpOiBSZWNvZ25pemUgKkJTRC9hbHBoYSBtYWdpYyB0b28uCi0JKEFMUEhBX1JfTElURVJBTFNMRUFaWSk6IERlZmluZS4KLQkqIGVjb2ZmLmggKEFMUEhBX01BR0lDX0JTRCk6IERlZmluZS4KLQotV2VkIEphbiAyOSAxMTozMTo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoUl9JUFIxMywgUl9BTElHTik6IERlZmluZS4KLQotTW9uIEphbiAyNyAxMzozNDozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKFJfSVBSTUVELCBSX09QVENBTEwsIFJfT1BUQ0FMTFgpOiBNb3ZlIGRlZmluaXRpb25zCi0JZnJvbSBoZXJlLi4uCi0JKiBpOTYwLmggKFJfSVBSTUVELCBSX09QVENBTEwsIFJfT1BUQ0FMTFgpOiAuLi50byBoZXJlLgotCi1XZWQgSmFuIDIyIDIwOjEwOjQ3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4ME1BR0lDKTogUmVuYW1lZCB0byBUSUM4MF9BT1VUSERSX01BR0lDLgotCi1GcmkgRGVjIDI3IDIyOjA1OjQ1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oOiBOZXcgZmlsZSBmb3IgVEljODAgc3VwcG9ydC4KLQotVGh1IERlYyAxOSAxNjoxODoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oIChfTElUKTogRGVmaW5lLgotCi1GcmkgSnVuIDI4IDEyOjU0OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGUuaCAoRklMSFNaKTogRGVmaW5lLgotCi1XZWQgSnVuIDI2IDE2OjI0OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQWxsIGZpbGVzOiBEZWZpbmUgRklMSFNaLCBBT1VUU1osIEFPVVRIRFJTWiwgU0NOSFNaLCBTWU1FU1osCi0JQVVYRVNaLCBMSU5FU1osIFJFTFNaIGFzIG51bWVyaWMgY29uc3RhbnRzIHJhdGhlciB0aGFuIHVzZXMgb2YKLQlzaXplb2YuICBEZWZpbmUgQU9VVEhEUlNaIGluIGFsbCBmaWxlcy4KLQkqIHBlLmggKEFPVVRTWik6IERlZmluZSBieSBhZGRpbmcgdG8gQU9VVEhEUlNaLgotCi1GcmkgSnVuIDIxIDExOjE3OjQ2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS5oOiBBZGQgZGVjbGFyYXRpb25zIGZvciByZWxvY2F0aW9uIHR5cGVzIGFkZGVkIGZvciBBbHBoYQotIAlPU0YvMSAzLjAuCi0KLVR1ZSBKdW4gMTggMTY6MDQ6MjkgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLmggKEg4MzAwU01BR0lDKTogRGVmaW5lLgotCShIODMwMFNCQURNQUcpOiBEZWZpbmUuCi0KLU1vbiBKdW4gMTAgMTE6NTM6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX0JDQ19JTlYsIFJfSk1QX0RFTCk6IE5ldyByZWxvY2F0aW9ucyBmb3IKLQlyZWxheGluZyBpbiB0aGUgSDgvMzAwIHNlcmllcy4KLQotVGh1IE1heSAxNiAxNTo0OToyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLmggKFJfU0hfQ09ERSwgUl9TSF9EQVRBLCBSX1NIX0xBQkVMKTogRGVmaW5lLgotCi1UdWUgTWF5ICA3IDAwOjM2OjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9KTVBMMik6IFJlbmFtZWQgZnJvbSBSX0pNUExfQjggdG8gYmUKLQljb25zaXN0ZW50IHdpdGggb3RoZXIgc2ltaWxhciByZWxvY3MuCi0KLQkqIGludGVybmFsLmggKEg4LzMwMCBzcGVjaWZpYyByZWxvY3MpOiBBZGQgY29tbWVudHMgYmV0dGVyCi0JZXhwbGFpbmluZyB3aGF0IGVhY2ggcmVsb2MgaXMgdXNlZCBmb3IuCi0JKFJfTU9WMTZCMSwgUl9NT1YxNkIyKTogUmVuYW1lZCBmcm9tIFJfTU9WQjEgYW5kIFJfTU9WQjIuCi0JKFJfTU9WMjRCMSwgUl9NT1YyNEIyKTogUmVuYW1lZCBmcm9tIFJfTU9WTEIxIGFuZCBSX01PVkxCMi4KLQkoUl9NT1ZMMSwgUl9NT1ZMMik6IE5ldyByZWxvY3MuCi0JCi1GcmkgTWF5ICAzIDEzOjAxOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9QQ1JXT1JEX0IpOiBEZWZpbmUgZm9yIHRoZSBoODMwMCByZWxheGluZwotCWxpbmtlci4KLQotV2VkIE1heSAgMSAxOToyMTowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKFNDTk5NTEVOKTogRGVmaW5lLgotCShzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyKTogVXNlIFNDTk5NTEVOIGZvciBzX25hbWUgZmllbGQuCi0KLUZyaSBNYXIgMjkgMTM6NDE6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZS5oOiBEZWZpbmUgSU1BR0VfQ09NREFUIGNvZGVzLgotCi1XZWQgTWFyIDI3IDE3OjI5OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IEFkZCB4X2NoZWNrc3VtLCB4X2Fzc29jaWF0ZWQsIGFuZAotCXhfY29tZGF0IGZpZWxkcyB0byB4X3NjbiBzdHJ1Y3QuCi0JKiBpMzg2LmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgotCSogcG93ZXJwYy5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBMaWtld2lzZS4KLQkqIGludGVybmFsLmggKHVuaW9uIGludGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgotCi1UaHUgTWFyIDIxIDE2OjI1OjU3IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9maW5kX2xpbmUpOiBBZGQgY2FjaGluZyBmaWVsZHMuCi0KLVRodSBNYXIgMTQgMTU6MjI6NDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX01FTV9JTkRJUkVDVCk6IE5ldyByZWxvYyBmb3IgdGhlIGg4MzAwLgotIAotRnJpIEZlYiAgOSAxMDo0NDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGF1eC1jb2ZmLmg6IFJlbmFtZSBmcm9tIGF1eC5oLCB0byBhdm9pZCBwcm9ibGVtcyBvbiBoYXBsZXNzIERPUwotCXN5c3RlbXMgd2hpY2ggdGhpbmsgdGhhdCBhdXggaXMgYSBjb20gcG9ydC4KLQotTW9uIEZlYiAgNSAxODozNTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoRl9JOTYwSFgpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMzEgMTM6MTE6NTQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGF1eC5oOiBOZXcgZmlsZS4KLQkqIGludGVybmFsLmgsIG02OGsuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4KLQotV2VkIE5vdiAyMiAxMzo0ODozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmggKF9SQ09OU1QsIFNUWVBfUkNPTlNULCBSRUxPQ19TRUNUSU9OX1JDT05TVCk6IERlZmluZS4KLQkoTlVNX1JFTE9DX1NFQ1RJT05TKTogVXBkYXRlLgotCSogc3ltY29uc3QuaCAoc2NSQ29uc3QpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgMTQgMTg6NTQ6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChDX05UX1dFQUspOiBEZWZpbmUuCi0KLVRodSBOb3YgIDkgMTQ6MDg6MzAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczYwMDAuaCAoU1RZUF9PVlJGTE8pOiBEZWZpbmUuCi0KLVR1ZSBOb3YgIDcgMTQ6Mzg6NDUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvcG93ZXJwYy5oIChJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMpOiBBZGRlZCBkZWZpbmUuCi0JKiBjb2ZmL3BlLmg6IEFkZGVkIGRlZmluZXMgZm9yIGZpbGUgbGV2ZWwgZmxhZ3MKLQotTW9uIE5vdiAgNiAxNzoyODowMSAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+Ci0KLQkqIGk4NjAuaDogTmV3IGZpbGUsIGJhc2VkIG9uIGkzODYuaC4KLQotV2VkIE5vdiAgMSAxNToyNToxOCAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogbTY4ay5oIChQQUdFTUFHSUNFWEVDU1dBUFBFRCk6IERlZmluZS4KLQkoUEFHRU1BR0lDUEVYRUNTV0FQUEVEKTogRGVmaW5lLgotCShQQUdFTUFHSUNQRVhFQ1RTSExJQik6IERlZmluZS4KLQkoUEFHRU1BR0lDUEVYRUNQQUdFRCk6IERlZmluZS4KLQkoX0NPTU1FTlQpOiBERUZJTkUuCi0JKiBtODhrLmggKF9DT01NRU5UKTogRGVmaW5lLgotCi1XZWQgT2N0IDE4IDE4OjM2OjE5IDE5OTUgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHN5bS5oOiAjaWYgMCdkIG91dCBydW50aW1lX3BkciBzdHJ1Y3QgYmVjYXVzZSBpdCBjaG9rZXMgCi0JVmlzdWFsIEMrKyBhbmQgdGhlcmUgYXJlbid0IGFueSByZWZlcmVuY2VzIHRvIGl0IGVsc2V3aGVyZSBpbiBnZGIuCi0KLU1vbiBPY3QgMTYgMTE6MTI6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczYwMDAuaCAoU01BTExfQU9VVFNaKTogRGVmaW5lLgotCi0JKiBpbnRlcm5hbC5oIChYTUNfVEQpOiBEZWZpbmUuCi0KLVR1ZSBPY3QgMTAgMTg6NDE6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcik6IEFkZCBvX2NwdXR5cGUgZmllbGQuCi0JKiByczYwMDAuaCAoQU9VVEhEUik6IFJlbmFtZSBvX3Jlc3YxIHRvIG9fY3B1dHlwZS4KLQotTW9uIE9jdCAgOSAxNDo0NTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC5oIChBT1VUSERSKTogQWRkIG9fbWF4ZGF0YSBmaWVsZC4gIEFkZCBjb21tZW50cy4KLQkoX1BBRCwgX0xPQURFUik6IERlZmluZS4KLQkoU1RZUF9MT0FERVIpOiBEZWZpbmUuCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcik6IEFkZCBvX21heGRhdGEgZmllbGQuCi0KLVRodSBPY3QgIDUgMTA6MDI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oOiBEZWZpbmUgc2VjdGlvbiBuYW1lIG1hY3JvcyBhbmQgU1RZUCBtYWNyb3MgZm9yIHZhcmlvdXMKLQlBbHBoYSBzZWN0aW9uczogLmdvdCwgLmhhc2gsIC5keW5zeW0sIC5keW5zdHIsIC5yZWwuZHluLCAuY29uZmxpYywKLQkuY29tbWVudCwgLmxpYmxpc3QsIC5keW5hbWljLgotCi1XZWQgT2N0ICA0IDEwOjU2OjM1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZS5oOiBNb3ZlZCBET1NNQUdJQyBhbmQgTlRfU0lHTkFUVVJFIGRlZmluZXMgaGVyZQotCSogcG93ZXJwYy5oOiByZW1vdmVkIERPU01BR0lDLCBOVF9TSUdOQVRVUkUsIGFuZCBERUZBVUxUXyogZGVmaW5lcwotCUFsc28gcmVtb3ZlZCBvdGhlciB1bnVzZWQgZGVmaW5lcyAodmFyaW91cyBNQUdJQyBvbmVzKQotCSogaTM4Ni5oOiByZW1vdmVkIERPU01BR0lDLCBOVF9TSUdOQVRVUkUsIGFuZCBERUZBVUxUXyogZGVmaW5lcwotCSogYXJtLmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBhcG9sbG8uaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGFscGhhLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBoODUwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogaDgzMDAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGk5NjAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIG04OGsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHdlMzJrLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiByczYwMDAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIG1pcHMuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIG02OGsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHo4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogdzY1Lmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBzcGFyYy5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogc2guaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQotRnJpIFNlcCAyOSAwODo0MDowOCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcG93ZXJwYy5oOiBSZWZvcm1hdHRlZCB0byBHTlUgY29kaW5nIGNvbnZlbnRpb25zLgotCi1XZWQgU2VwIDI3IDA2OjUwOjUwIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIHBlLmg6IGFkZGVkIGRlZmluZXMgZm9yIG1vcmUgc2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MKLQkqIHBvd2VycGMuaCAobmV3IGZpbGUpOiBiYXNlIGNvZmYgZGVmaW5pdGlvbnMgZm9yIHBwYyBQRQotCi1UdWUgU2VwIDEyIDEyOjA4OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX3N5bWVudCk6IENoYW5nZSBuX251bWF1eCBmaWVsZCBmcm9tCi0JY2hhciB0byB1bnNpZ25lZCBjaGFyLgotCi1GcmkgU2VwICAxIDE1OjM5OjM2IDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgotCi0JKiBtaXBzLmggKHN0cnVjdCBycGRyX2V4dCk6IERlZmluZS4KLQotVGh1IEF1ZyAzMSAxNjo1MTo1MCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyLCBpbnRlcm5hbF9maWxlaGRyKToKLQlkb24ndCBpbmRpcmVjdCB0aGUgcGUgc3R1ZmYuCi0KLVR1ZSBBdWcgMjkgMTQ6MTY6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChOVF9ERUZfUkVTRVJWRSwgTlRfREVGX0NPTU1JVCk6IE1ha2UgdGhlIHNhbWUKLQlhcyAndGhlIG90aGVyJyBjb21waWxlci4KLQkqIGludGVybmFsLmggKE5UX0lNQUdFX0JBU0UpOiBEZWxldGVkLgotCShOVF9FWEVfSU1BR0VfQkFTRSwgTlRfRExMX0lNQUdFX0JBU0UpOiBOZXcuCi0JKFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCwgUEVfREVGX0ZJTEVfQUxJR05NRU5UKTogTmV3LgotCShSX0lNQUdFQkFTRSk6IE5ldy4KLQotTW9uIEF1ZyAyMSAxODoxMjoxOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiAoaW50ZXJuYWxfZmlsZWhkcik6IE1vdmVkIFBFIHN0dWZmIGludG8KLQlpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyLgotCShpbnRlcm5hbF9hb3V0aGRyKTogTW92ZWQgUEUgc3R1ZmYgaW50bwotCWludGVyYW5sX2V4dHJhX3BlX2FvdXRoZHIuCi0KLU1vbiBKdWwgMjQgMTQ6MDU6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiBNb3ZlIFJfU0hfKiByZWxvY3MgZnJvbSBoZXJlLi4uCi0JKiBzaC5oOiAuLi50byBoZXJlLgotCShSX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDMyKTogRGVmaW5lLgotCShSX1NIX1VTRVMsIFJfU0hfQ09VTlQsIFJfU0hfQUxJR04pOiBEZWZpbmUuCi0KLVRodSBKdW4gMjkgMDA6MDQ6MjUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoTlRfREVGX1JFU0VSVkUsIE5UX0RFRl9DT01NSVQpOiBJbmNyZWFzZSBhIGxvdC4KLQotVHVlIE1heSAxNiAxNTowODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWxldGUKLQotVHVlIE1heSAxNiAxNTowODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBOb3cgZXh0ZXJuLgotCi1UdWUgRmViIDE0IDE3OjU5OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSk6IERlZmluZS4KLQotU2F0IEZlYiAgNCAxNDozODowMyAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIHN5bS5oIChzdHJ1Y3QgcGRyKTogZmllbGQgInByb2YiIGFkZGVkLgotCi0JKiBhbHBoYS5oIChQRFJfQklUUzFfUFJPRl8qKTogYWRkZWQsIG1hY3JvcyBmb3IgUERSX0JJVFMqX1JFU0VSVkVEXyoKLQl1cGRhdGVkIGFjY29yZGluZ2x5LgotCi1TdW4gSmFuIDE1IDE4OjM4OjMzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiB3NjUuaDogTmV3IGZpbGUuCi0KLVdlZCBOb3YgMjMgMjI6NDM6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc2guaCAoU0hfQVJDSF9NQUdJQ19CSUcsIFNIX0FSQ0hfTUFHSUNfTElUVExFKTogTmV3LgotCShTSEJBRE1BRyk6IENoYW5nZWQgdG8gc3VpdC4KLQotVHVlIEp1bCAyNiAxNzo0NjowOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpOTYwLmggKEZfSTk2MEpYKTogTmV3IG1hY3JvLgotCi1XZWQgSnVsICA2IDAwOjQ4OjU3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxwaGEuaDogIEFkZCBkZWZpbml0aW9ucyBmb3IgYWxwaGEgZmlsZSBoZWFkZXIgZmxhZ3MsIGVuY29kaW5nCi0JdGhlIG9iamVjdCB0eXBlIG9mIHRoZSBmaWxlLgotCi1Nb24gSnVuIDIwIDEzOjQ3OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoZWNvZmZfc3dhcF90aXJfaW4pOiBSZW1vdmUgZGVjbGFyYXRpb24uCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBBZGQgbmV3IGZpZWxkczogc3dhcF90aXJfaW4sCi0Jc3dhcF9ybmR4X2luLCBzd2FwX3Rpcl9vdXQsIHN3YXBfcm5keF9vdXQsIHJlYWRfZGVidWdfaW5mby4KLQotU3VuIEp1biAxMiAwMzo1MTo1MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHN5bWNvbnN0Lmg6ICBQaWNrIHVwIFNHSSBkZWZpbmUgZm9yIHN0SW5kaXJlY3QuCi0KLUZyaSBBcHIgMjIgMTM6MDU6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChSRUdJTkZPKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZWNvZmZfcmVnaW5mbyk6IERvbid0IGRlZmluZS4KLQotCSogc2guaCAoU0hfQVJDSF9NQUdJQyk6IFJlbmFtZSBmcm9tIFNITUFHSUMuICBTSE1BR0lDIGlzIHVzZWQgYnkKLQlzZXZlcmFsIHRhcmdldHMgdG8gbWVhbiBhIHNoYXJlZCBsaWJyYXJ5LgotCShTSEJBRE1BRyk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1UaHUgQXByIDE0IDEzOjAwOjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChSRUxPQ19CSVRTM19UWVBFX0JJRyk6IENoYW5nZWQgZnJvbSAweDFlIHRvIDB4M2UuCi0JKFJFTE9DX0JJVFMzX1RZUEVISV9MSVRUTEUpOiBEZWZpbmUuCi0JKFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUpOiBEZWZpbmUuCi0JKE1JUFNfUl9QQ1JFTDE2KTogQ2hhbmdlIHZhbHVlIGZyb20gOCB0byAxMiB0byBtYXRjaCBJcml4IDQuCi0JKE1JUFNfUl9SRUxISSk6IERlZmluZS4KLQkoTUlQU19SX1JFTExPKTogRGVmaW5lLgotCShNSVBTX1JfU1dJVENIKTogQ2hhbmdlIHZhbHVlIGZyb20gOSB0byAyMi4KLQotVGh1IEFwciAgNyAxNDoxOTozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTUlQU19SX1NXSVRDSCk6IERlZmluZS4KLQotVGh1IE1hciAzMSAxOToyODozMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyKTogQWRkZWQgY29tbWVudHMgZm9yIEFwb2xsbyBmaWVsZHMuCi0KLVRodSBNYXIgMzEgMTY6Mjg6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChTVFlQX0VDT0ZGX0xJQik6IERlZmluZSBhcyB1c2VkIG9uIElyaXggNC4KLQotRnJpIE1hciAyNSAxNzoxNjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvKTogQWRkIGFkanVzdCBmaWVsZC4KLQkoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCk6IERlZmluZS4KLQotVHVlIE1hciAyMiAxMzoyMjo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTUlQU19SX1BDUkVMMTYpOiBEZWZpbmUuCi0KLVNhdCBGZWIgMjYgMTA6MjY6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5oOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBTVlI0IGNjLgotCi1Nb24gRmViIDIxIDA5OjQ4OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBzeW0uaCAoc3RydWN0IHJ1bnRpbWVfcGRyKTogTWFrZSBmaWVsZCBhZHIgYmZkX3ZtYSwgbm90IHVuc2lnbmVkCi0JbG9uZy4KLQkoU1lNUik6IE1ha2UgZmllbGQgdmFsdWUgYmZkX3ZtYSwgbm90IGxvbmcuCi0KLUZyaSBGZWIgIDQgMjM6MzU6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByczYwMDAuaCAoU1RZUF9ERUJVRyk6IERlZmluZS4KLQotV2VkIEZlYiAgMiAxNDozMTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKHVuaW9uIGludGVybmFsX2F1eGVudCk6IENoYW5nZSB4X2NzZWN0Lnhfc2NubGVuIGludG8KLQlhIHVuaW9uIG9mIGEgbG9uZyBhbmQgYSBwb2ludGVyIHRvIGEgc3ltYm9sLiAgWENPRkYgc29tZXRpbWVzIHVzZXMKLQl0aGlzIGZpZWxkIGFzIGEgc3ltYm9sIGluZGV4LgotCi1Nb24gSmFuIDEwIDIzOjU0OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoZWNvZmZfZGVidWdfaW5mbyk6IFJlbW92ZSBmaWVsZHMgbGluZV9lbmQsCi0JZXh0ZXJuYWxfZG5yX2VuZCwgZXh0ZXJuYWxfcGRyX2VuZCwgZXh0ZXJuYWxfc3ltX2VuZCwKLQlleHRlcm5hbF9vcHRfZW5kLCBleHRlcm5hbF9hdXhfZW5kLCBzc19lbmQsIGV4dGVybmFsX2Zkcl9lbmQuCi0JUmVwbGFjZSBpZmRiYXNlIHdpdGggaWZkbWFwLgotCi1XZWQgSmFuICA1IDE3OjA1OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChTVFlQX0VYVEVOREVTQywgU1RZUF9DT01NRU5ULCBTVFlQX1hEQVRBLCBTVFlQX1BEQVRBKToKLQlEZWZpbmUuCi0KLVdlZCBKYW4gIDUgMTY6NTg6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChOVU1fUkVMT0NfU0VDVElPTlMpOiBEZWZpbmUuCi0KLVR1ZSBEZWMgMjEgMDk6MjQ6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MpOiBSZW5hbWUgZmllbGQgcl9hZGRlbmQgdG8KLQlyX29mZnNldC4KLQotU2F0IERlYyAxMSAxNjoxMjozMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9ESVNQNywgUl9TSF9JTU0xNik6IE5ldyByZWxvYyB0eXBlcy4KLQotVHVlIE5vdiAyMyAxNDoyMzoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwKTogQWRkZWQgKl9lbmQgZmllbGRzIGZvciBhbGwKLQl0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gcG9pbnRlcnMuCi0KLQkqIHN5bS5oOiBOYW1lZCB0aGUgRVhUUiBzdHJ1Y3R1cmUgZWNvZmZfZXh0ci4KLQotRnJpIE5vdiAxOSAwODoyMToxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoUkVMU1opOiBVc2UgY29ycmVjdCBzaXplLgotCi1XZWQgTm92IDE3IDE3OjE4OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyk6IERlZmluZS4KLQotVHVlIE5vdiAgMiAxNzo1Njo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwKTogRGVmaW5lLgotCi1UaHUgT2N0IDI4IDE3OjA3OjUwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChJMzg2TFlOWE1BR0lDKTogUmVuYW1lIHRvIExZTlhDT0ZGTUFHSUMuCi0JKiBtNjhrLmggKExZTlhDT0ZGTUFHSUMpOiBEZWZpbmUuCi0JKiBzcGFyYy5oOiBOZXcgZmlsZS4KLQotVHVlIE9jdCAxOSAxNTozNDo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFscGhhLmggKGV4dGVybmFsX2FvdXRoZHIpOiBTcGxpdCBmb3VyIGJ5dGUgcGFkZGluZyBmaWVsZCBpbnRvCi0JdHdvIGJ5dGUgYmxkcmV2IGZpZWxkIGFuZCB0d28gYnl0ZSBwYWRkaW5nIGZpZWxkLgotCi0JKiBlY29mZi5oIChfTElUQSwgX1BEQVRBLCBfWERBVEEsIFNUWVBfTElUQSk6IERlZmluZWQuCi0KLVdlZCBPY3QgMTMgMTU6NTI6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlTdW4gT2N0IDEwIDE3OjI3OjEwIDE5OTMgIFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LmVkdS5hdSkKLQotCSogY29mZi9pbnRlcm5hbC5oOiBBZGRlZCBvX3NyaSwgb19pbmxpYiBhbmQgb192aWQgZm9yIEFwb2xsb3MKLQkJCWFzIHdlbGwgYXMgUl9ESVIxNi4KLQotCSogY29mZi9hcG9sbG8uaDogTmV3IGZpbGUKLQotTW9uIE9jdCAxMSAxNzoxNjo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFJFR0lORk8sIHN0cnVjdCBlY29mZl9yZWdpbmZvKTogRGVmaW5lLgotCi1UdWUgT2N0ICA1IDEwOjUyOjUzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiByczYwMDAuaDogQ2hhbmdlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIGNvbW1lbnQgdG8gb2N0YWwKLQllc2NhcGVzLgotCi1UdWUgU2VwIDI4IDAzOjI3OjA0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWNvZmYuaCAoX0ZJTkksIFNUWVBfRUNPRkZfRklOSSk6ICBBZGQgdG8gc3VwcG9ydCAuZmluaSBzZWN0aW9uLgotCi1GcmkgU2VwIDI0IDExOjUzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChCQURNQUcpOiBSZWNvZ25pemUgTUlQU19NQUdJQ19MSVRUTEUzIGFuZCBNSVBTX01BR0lDX0JJRzMuCi0JKiBlY29mZi5oOiBEZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUzIGFuZCBNSVBTX01BR0lDX0JJRzMuCi0KLVRodSBTZXAgMjMgMjE6MDc6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoQkFETUFHKTogUmVjb2duaXplIE1JUFNfTUFHSUNfTElUVExFMiBhbmQgTUlQU19NQUdJQ19CSUcyLgotCSogZWNvZmYuaDogRGVmaW5lIE1JUFNfTUFHSUNfTElUVExFMiBhbmQgTUlQU19NQUdJQ19CSUcyLgotCi1UaHUgU2VwIDE2IDIwOjI3OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc3ltLmgsIHN5bWNvbnN0Lmg6IEFkZCBjb21tZW50IHN0YXRpbmcgdGhlc2UgZmlsZXMgYXJlIG5vdCBwYXJ0Ci0Jb2YgR0RCLCBHQVMsIGV0Yy4gIEluIDE5OTEsIHdoZW4gd2UgYXNrZWQgcm1zIHdoZXRoZXIgd2UgY291bGQKLQlpbmNsdWRlIHRoZXNlIGZpbGVzIGluIEdEQiAoYWx0aG91Z2ggdGhleSBhcmUgY29weXJpZ2h0ZWQgYnkKLQlzb21lb25lIGJlc2lkZXMgdGhlIEZTRiksIGhlIHNhaWQgaXQgd2FzIE9LIGlmIHRoZXkgd2VyZSBub3QKLQljb25zaWRlcmVkIHBhcnQgb2YgR0RCLgotCi1GcmkgU2VwIDEwIDE3OjQwOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoQVVYX1BVVF9BTlkpOiBDYXN0IHZhbCBhcmd1bWVudCB0byBiZmRfdm1hLgotCi0JKiBhbHBoYS5jIChleHRlcm5hbF9hb3V0aGRyKTogTmVlZCBmb3VyIGJ5dGVzIG9mIHBhZGRpbmcgYmV0d2VlbgotCXZzdGFtcCBhbmQgdHNpemUuCi0KLVR1ZSBTZXAgIDcgMTQ6MjA6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChBVVhfR0VUX0FOWSwgQVVYX1BVVF9BTlkpOiBDaGFuZ2VkIHRvIHJlZmxlY3QgZnVydGhlcgotCWNoYW5nZSBpbiBiZmQgc3dhcHBpbmcgcm91dGluZSBuYW1lcy4KLQotVHVlIFNlcCAgNyAxMDoxNToxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoQVVYX0dFVF9BTlkpOiBDaGFuZ2UgbmFtZSBvZiBfZG9fZ2V0YjMyIHRvIHJlZmxlY3QgYmZkCi0JY2hhbmdlcy4KLQotRnJpIEF1ZyAxMyAxNDozMDozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFJFTE9DX1NFQ1RJT05fTk9ORSk6IERlZmluZS4KLQotVGh1IEF1ZyAxMiAxMToyNDo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFscGhhLmggKHN0cnVjdCBleHRlcm5hbF9yZWxvYyk6IEFkZCByX3N5bW5keCBmaWVsZC4KLQkoUkVMU1opOiBDb3JyZWN0LgotCShSRUxPQ19CSVRTKik6IENvcnJlY3QuCi0JKEFMUEhBX1JfKik6IERlZmluZS4KLQkqIGVjb2ZmLmggKFJFTE9DX1NFQ1RJT05fe1hEQVRBLFBEQVRBLEZJTkksTElUQSxBQlN9KTogRGVmaW5lLgotCShyX2V4dGVybik6IFVuZGVmaW5lLgotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX3JlbG9jKTogTWFrZSByX3ZhZGRyIGJmZF92bWEgcmF0aGVyCi0JdGhhbiBsb25nLiAgQWRkIHJfZXh0ZXJuIGZpZWxkLgotCi0JKiBhbHBoYS5oIChQRFJfQklUUyopOiBEZWZpbmUuCi0JKiBzeW0uaCAoUERSKTogR2l2ZSBjb3JyZWN0IG5hbWVzIHRvIG5ldyBmaWVsZHMuCi0KLQkqIGVjb2ZmLmg6IE1vdmVkIE1JUFMgcmVsb2MgZGVmaW5pdGlvbnMgZnJvbSBoZXJlLi4uCi0JKiBtaXBzLmg6IHRvIGhlcmUuCi0KLVR1ZSBBdWcgIDMgMTE6MTc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbHBoYS5oOiBDb3JyZWN0ZWQgZXh0ZXJuYWwgc3ltYm9saWMgZGVidWdnaW5nIHN0cnVjdHVyZXMgdG8KLQltYXRjaCBhY3R1YWwgdXNhZ2UuCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9maWxlaGRyLCBpbnRlcm5hbF9hb3V0aGRyLAotCWludGVybmFsX3Njbmhkcik6IENoYW5nZWQgdHlwZSBvZiBzb21lIGZpZWxkcyB0byBiZmRfdm1hIHNvIHRoZXkKLQljYW4gaG9sZCA2NCBiaXRzLgotCSogc3ltLmggKEhEUlIsIEZEUiwgUERSLCBFWFRSKTogTGlrZXdpc2UuCi0JKFBEUik6IEFkZGVkIG5ldyBmaWVsZHMgZm91bmQgb24gQWxwaGEuCi0JKiBzeW1jb25zdC5oIChtYWdpY1N5bTIpOiBEZWZpbmU7IG5ldyB2YWx1ZSBmb3VuZCBvbiBBbHBoYS4KLQotCSogZWNvZmYuaDogTmV3IGZpbGUuCi0JKiBhbHBoYS5oLCBtaXBzLmg6IE1vdmVkIGNvbW1vbiBpbmZvcm1hdGlvbiBpbnRvIGVjb2ZmLmguICBNb3ZlZAotCWV4dGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBpbiBmcm9tIGVjb2ZmLWV4dC5oLgotCSogZWNvZmYtZXh0Lmg6IFJlbW92ZWQ7IGluZm9ybWF0aW9uIG5vdyBpbiBhbHBoYS5oIGFuZCBtaXBzLmguCi0KLVN1biBKdWwgMTggMjE6NDM6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IFJlY29nbml6ZSBJMzg2UFRYTUFHSUMuCi0KLUZyaSBKdWwgMTYgMDk6NTQ6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE1JUFNfQU9VVF97T1p9TUFHSUMpOiBSZW5hbWVkIGZyb20ge09afU1BR0lDLgotCi1UaHUgSnVsIDE1IDEyOjIzOjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBNb3ZlIHhfZmNuIGJhY2sgaW5zaWRlIHhfZmNuYXJ5LgotCSh7R0VULFBVVH1fRkNOX3tMTk5PUFRSLEVORE5EWH0pOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVN1biBKdWwgMTEgMTg6MDA6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogRGVmaW5lIE1DNjhLQkNTTUFHSUMuCi0KLVRodSBKdW4gMTAgMTE6NDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKF9JTklULCBTVFlQX01JUFNfSU5JVCk6IERlZmluZSAodXNlZCBvbiBJcml4NCkuCi0JKFNUWVBfT1RIRVJfTE9BRCk6IERlZmluZSBhcyBTVFlQX01JUFNfSU5JVC4KLQotV2VkIEp1biAgOSAxNTowOTowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoT01BR0lDKTogRGVmaW5lLgotCi1Nb24gQXByIDI2IDE4OjA0OjQ3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oLCBzaC5oOiBTdXBwb3J0IGZvciBTSC4KLQotU2F0IEFwciAyNCAyMTozNDo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYTI5ay5oOiBEZWZpbmUgX0xJVC4KLQotRnJpIEFwciAyMyAxODo0MToyMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaDogTmV3IGZpbGUuCi0KLVRodSBBcHIgIDggMTI6MzY6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChDX1NIQURPVywgQ19WRVJTSU9OKTogQ29waWVkIGluIGZyb20gbTg4ay5oLgotCSogbTg4ay5oLCBpMzg2LmgsIHdlMzJrLmg6IERvbid0IGRlZmluZSBhbGwgdGhlIHN0b3JhZ2UgY2xhc3NlczsKLQl0aGV5J3JlIGFscmVhZHkgaW4gaW50ZXJuYWwuaC4KLQotV2VkIEFwciAgNyAxMTo1MToyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIG5fc2NsYXNzIHRvIHVuc2lnbmVkIGNoYXIuCi0JQ2hhbmdlIENfRUZDTiB0byAweGZmLCBjaGFuZ2UgUlMvNjAwMCBkYnggc3ltYm9scwotCXRvIG5vIGxvbmdlciBiZSBzaWduZWQuCi0KLUZyaSBNYXIgMTkgMTQ6NTI6NTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IEFkZCBIOC81MDAgcmVsb2MgdHlwZXMuCi0KLVdlZCBNYXIgMTcgMDk6NDY6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaCAoQVVYX1BVVF9BTlkpOiBEb24ndCB1c2Ugdm9pZCB2YWx1ZXMgaW4gYnJhbmNoZXMgb2YKLQljb25kaXRpb25hbCBleHByZXNzaW9uLgotCi1UaHUgTWFyICA0IDE0OjEyOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0LmggKEFVWF9HRVRfKik6IFJld3JvdGUgdG8gdXNlIG5ldyBtYWNybyBBVVhfR0VUX0FOWS4KLQkoQVVYX1BVVF8qKTogTmV3IG1hY3JvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBVVhfR0VUIG1hY3Jvcy4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogQWRkZWQgcHJvdG90eXBlLgotCi0JKiBtaXBzLmggKE5fQlRNQVNLLCBOX1RNQVNLLCBOX0JUU0hGVCwgTl9UU0hJRlQpOiBEZWZpbmU7IHRoZXNlCi0JYXJlIG5lZWRlZCB0byBpbnRlcnByZXQgZ2NjIGRlYnVnZ2luZyBvdXRwdXQuCi0KLVR1ZSBGZWIgIDkgMDc6NDM6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3ZTMyay5oIChCVFlQRSwgSVNQVFIsIElTRkNOLCBJU0FSWSwgREVDUkVGKTogUmVtb3ZlZAotCW1vcmUgZGVmaW5pdGlvbnMgZHVwbGljYXRlZCBpbiBpbnRlcm5hbC5oLgotCi1XZWQgRmViICAzIDA5OjE4OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChSRUxPQ19CSVRTM19UWVBFXyopOiBDb3JyZWN0IGZvciBiaWcgZW5kaWFuIG1hY2hpbmVzLgotCi1Nb24gSmFuIDI1IDExOjM1OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfYW91dGhkcik6IEFkZGVkIGFkZGl0aW9uYWwgZmllbGRzIHVzZWQgb25seQotCWJ5IE1JUFMgRUNPRkYuCi0KLVRodSBKYW4gMjEgMTA6Mjg6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEFPVVRIRFIpOiBBZGRlZCBhZGRpdGlvbmFsIGZpZWxkcyB1c2VkIGJ5IEVDT0ZGLgotCi1UdWUgSmFuIDE5IDEyOjIxOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oLCB3ZTMyay5oIChOXyosIFRfKiwgRFRfKik6IFJlbW92ZWQgc3RpbGwgbW9yZSBkZWZpbml0aW9ucwotCWR1cGxpY2F0ZWQgaW4gaW50ZXJuYWwuaC4KLQotCSogbWlwcy5oIChSRUxPQ19TRUNUSU9OXyosIEVDT0ZGX1JfKik6IERlZmluZWQgY29uc3RhbnRzIGZvciBFQ09GRgotCXJlbG9jcy4KLQotRnJpIEphbiAxNSAxODoxNzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciBuZXcgRUNPRkYgc3dhcHBpbmcgZnVuY3Rpb25zLgotCShvcHRfZXh0KTogTmV3IHN0cnVjdHVyZS4KLQkqIG1pcHMuaCAoWk1BR0lDKTogRGVmaW5lZCB0byBiZSAwNDEzLgotCShfTElCKTogRGVmaW5lZCB0byBiZSAiLmxpYiIKLQkoZXh0ZXJuYWxfcmVsb2MpOiBNSVBTIEVDT0ZGIHJlbG9jcyBhcmUgb25seSA4IGJ5dGVzLiAgQWRkZWQKLQltYWNyb3MgdG8gYWlkIGluIHN3YXBwaW5nLgotCi1GcmkgSmFuICA4IDE2OjE5OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIEVDT0ZGIHN3YXBwaW5nIGZ1bmN0aW9ucy4KLQkqIGludGVybmFsLmggKGludGVybmFsX3Njbmhkcik6IEFsd2F5cyBwcm92aWRlIHNfYWxpZ24gZmllbGQsIG5vdAotCWp1c3Qgb24gaTk2MC4KLQkoaW50ZXJuYWxfcmVsb2MpOiBBbHdheXMgcHJvdmlkZSByX3NpemUgZmllbGQsIG5vdCBqdXN0IG9uCi0JUlMvNjAwMC4KLQkqIG1pcHMuaCAoX1JEQVRBLCBfU0RBVEEsIF9TQlNTLCBfTElUNCwgX0xJVDgsIFNUWVBfUkRBVEEsCi0JU1RZUF9TREFUQSwgU1RZUF9TQlNTLCBTVFlQX0xJVDQsIFNUWVBfTElUOCk6IERlZmluZWQuCi0JKENPREVfTUFTSywgTUlQU19JU19TVEFCLCBNSVBTX01BUktfU1RBQiwgTUlQU19VTk1BUktfU1RBQiwKLQlTVEFCU19TWU1CT0wpOiBNb3ZlZCBpbiBmcm9tIGdkYi9taXBzcmVhZC5jLgotCi1XZWQgSmFuICA2IDE0OjAxOjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oLCB3ZTMyay5oOiByZW1vdmVkIFNUWVBfKiBkZWZpbmVzLCBzaW5jZSB0aGV5IGR1cGxpY2F0ZWQKLQl0aG9zZSBpbiBpbnRlcm5hbC5oLgotCi1UdWUgRGVjIDI5IDE1OjQwOjA3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBkZWZpbmUgSTM4NkFJWE1BR0lDIGZvciBEYW5idXJ5IEFJWCBQUy8yIGNvbXBpbGVyLgotCi1TYXQgRGVjIDEyIDE2OjA3OjU3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBkb24ndCBkZWZpbmUgQlRZUEUsIElTUFRSLCBJU0ZDTiwgSVNBUlksIERFQ1JFRjogdGhleQotCWFyZSBkZWZpbmVkIGluIGludGVybmFsLmguCi0KLVRodSBOb3YgMTIgMDk6NTI6MDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IChpbnRlcm5hbF9yZWxvYyk6IHJfb2Zmc2V0IGlzIG5vdyBhIGxvbmcuCi0JKiB6OGsuaDogc2xpZ2h0IGNvbW1lbnQgZW5oYW5jZW1lbnQKLQotV2VkIFNlcCAzMCAwNzo0NjowOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogY2hhbmdlZCB6OGsgcmVsb2MgdHlwZXMKLQotRnJpIEF1ZyAyOCAxMDoxNjozMSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiB3ZTMyay5oOiBuZXcgZmlsZQotCi1UaHUgQXVnIDI3IDEzOjAwOjAxIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIHN5bWNvbnN0Lmg6IGNvbW1lbnQgb3V0IGNydWZ0IGF0IHRoZSBlbmQgb2YgI2VuZGlmCi0KLVR1ZSBBdWcgMjUgMTU6MDY6NDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IGFkZGVkICNkZWZpbmUgZm9yIFNUWVBfTElULCByZW1vdmVkIGZyb20gYTI5ayBhbmQKLQloODMwMC4KLQotCSogejhrLmg6IGFkZGVkIHo4MDAwIHN1cHBvcnQKLQotVGh1IEp1bCAxNiAxNjozMjowMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogYWRkZWQgUl9SRUxMT05HX05FRyByZWxvYyB0eXBlCi0KLUZyaSBKdW4gMTIgMjA6MTE6MDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bWNvbnN0Lmg6ICBGaXggdW50ZXJtaW5hdGVkIGNvbW1lbnQuCi0KLVdlZCBKdW4gMTAgMDc6NTc6NDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogYS5vdXQgbWFnaWMgbnVtYmVycyBmcm9tCi0JbW9ocmluZ0BpbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlCi0KLU1vbiBKdW4gIDggMjA6MTM6MzMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oLCBtaXBzLmg6ICBVc2UgdW5zaWduZWQgY2hhcnMgZXZlcnl3aGVyZS4KLQkoU3VnZ2VzdGVkIGJ5IEFudHRpIE1pZXR0aW5lbi4pCi0KLVR1ZSBBcHIgMTQgMTU6MTg6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bS5oOiAgQWRkIGNvbW1lbnRzLgotCSogc3ltY29uc3QuaDogIE1lcmdlIHdpdGggRnJlZCdzIGNoYW5nZXMuCi0KLVR1ZSBBcHIgMTQgMTQ6MzA6MDUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN5bWNvbnN0Lmg6ICBQaWNrIHVwIFNHSSBkZWZpbmVzIGZvciBzdFN0cnVjdCwgc3RVbmlvbiwgc3RFbnVtLAotCWxhbmdDcGx1c3BsdXMsIGFuZCBsYW5nQ3BsdXNwbHVzVjIuCi0KLVRodSBBcHIgIDIgMTk6NDc6NDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bS5oLCBzeW1jb25zdC5oOiAgTUlQUyBoYXMgcHJvdmlkZWQgcmVkaXN0cmlidXRhYmxlIHZlcnNpb25zCi0Jb2YgdGhlc2UgZmlsZXMuICBUaGFua3MhCi0JKiBlY29mZi1leHQuaDogIEFkZCB3ZWFrZXh0IGJpdCB0byBtYXRjaCBuZXcgc3ltLmguCi0KLUZyaSBNYXIgIDYgMDA6MTA6NDYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiAgQWRkIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvcnMuCi0KLVRodSBGZWIgMjcgMTE6NTM6MDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiAgTmV3IGZpbGUgZm9yIGV4dGVybmFsIChpbi1maWxlKSBmb3JtIG9mIGVjb2ZmCi0Jc3ltYm9sIHN0cnVjdHVyZXMuCi0KLVRodSBGZWIgIDYgMTE6MzM6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IG1hZGUgdGhlIGV4dGVybmFsX2xpbmVubyBsX2xubm8gZmllbGQgNCBieXRlcyB3aWRlLgotCWFuZGRlZCBHRVQvUFVUX0xJTkVOT19MTk5PIG1hY3JvcwotCi1TYXQgTm92IDMwIDIwOjM4OjM1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBDaGFuZ2VMb2csIGEyOWsuaCwgaDgzMDAuaCwgaTM4Ni5oLCBpOTYwLmgsIGludGVybmFsLmgsIG02OGsuaCwKLQltODhrLmgsIG1pcHMuaCwgcnM2MDAwLmg6IG1vdmUgZnJvbSBhYm92ZSBjb2ZmLTxmb28+LmgKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2EyOWsuaCBiL2luY2x1ZGUvY29mZi9hMjlrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjM2E2NDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2EyOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKiBDT0ZGIHNwZWMgZm9yIEFNRCAyOTAqMCAKLSAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgQCBOZXcgWW9yayBVbml2ZXJzaXR5LgotICovCi0gCi0jaWZuZGVmIEFNRAotIyBkZWZpbmUgQU1ECi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0qKiBGaWxlIEhlYWRlciBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLXsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJICovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJICAgKi8KLQljaGFyIGZfdGltZGF0WzRdOyAgICAgICAvKiB0aW1lICYgZGF0ZSBzdGFtcAkgICAgKi8KLQljaGFyIGZfc3ltcHRyWzRdOyAgICAgICAvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiICAgICAgICovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMgICAgICovCi0JY2hhciBmX29wdGhkclsyXTsgICAgICAgLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJICovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lIEZJTEhEUiAgc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUgRklMSFNaCTIwCi0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogTWFnaWMgbnVtYmVycyBmb3IgQW0yOTAwMCAKLSoqCShBVCZUIHdpbGwgYXNzaWduIHRoZSAicmVhbCIgbWFnaWMgbnVtYmVyKSAgCi0qLwotCi0jZGVmaW5lIFNJUEZCT01BR0lDICAgICAwNTcyICAgIC8qIEFtMjkwMDAgKEJ5dGUgMCBpcyBNU0IpICovCi0jZGVmaW5lIFNJUFJCT01BR0lDICAgICAwNTczICAgIC8qIEFtMjkwMDAgKEJ5dGUgMCBpcyBMU0IpICovCi0KLQotI2RlZmluZSBBMjlLX01BR0lDX0JJRyAJCVNJUEZCT01BR0lDCQotI2RlZmluZSBBMjlLX01BR0lDX0xJVFRMRQlTSVBSQk9NQUdJQwkKLSNkZWZpbmUgQTI5S0JBRE1BRyh4KSAJKCgoeCkuZl9tYWdpYyE9QTI5S19NQUdJQ19CSUcpICYmIFwKLQkJCSAgKCh4KS5mX21hZ2ljIT1BMjlLX01BR0lDX0xJVFRMRSkpCi0KLSNkZWZpbmUgT01BR0lDIEEyOUtfTUFHSUNfQklHCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIEZpbGUgaGVhZGVyIGZsYWdzIGN1cnJlbnRseSBrbm93biB0byB1cy4KLSoqCi0qKiBBbTI5MDAwIHdpbGwgdXNlIHRoZSBGX0FSMzJXUiBhbmQgRl9BUjMyVyBmbGFncyB0byBpbmRpY2F0ZQotKiogdGhlIGJ5dGUgb3JkZXJpbmcgaW4gdGhlIGZpbGUuCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIE9wdGlvbmFsIChhLm91dCkgaGVhZGVyIAotKi8KLQotdHlwZWRlZglzdHJ1Y3QgZXh0ZXJuYWxfYW91dGhkciAKLXsKLSAgY2hhciAgbWFnaWNbMl07CSAgICAgICAvKiB0eXBlIG9mIGZpbGUJCQkgKi8KLSAgY2hhciAgdnN0YW1wWzJdOwkgICAgICAvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhciAgdHNpemVbNF07CSAgICAgICAvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhciAgZHNpemVbNF07CSAgICAgICAvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIgIGJzaXplWzRdOwkgICAgICAgLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCSAgICAgKi8KLSAgY2hhciAgZW50cnlbNF07CSAgICAgICAvKiBlbnRyeSBwdC4JCQkgICAgKi8KLSAgY2hhciAgdGV4dF9zdGFydFs0XTsJICAvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgIGRhdGFfc3RhcnRbNF07CSAgLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfSBBT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyogYW91dGhkciBtYWdpYyBudW1iZXJzICovCi0jZGVmaW5lIE5NQUdJQwkJMDQxMAkvKiBzZXBhcmF0ZSBpL2QgZXhlY3V0YWJsZSAqLwotI2RlZmluZSBTSE1BR0lDCTA0MDYJCS8qIE5ZVS9VbHRyYTMgc2hhcmVkIGRhdGEgZXhlY3V0YWJsZSAKLQkJCQkgICAod3JpdGFibGUgdGV4dCkgKi8KLQotI2RlZmluZSBfRVRFWFQgICAJIl9ldGV4dCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBTZWN0aW9uIGhlYWRlciBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciAKLXsKLQljaGFyCSAgICBzX25hbWVbOF07ICAgICAgLyogc2VjdGlvbiBuYW1lCQkgKi8KLQljaGFyCSAgICBzX3BhZGRyWzRdOyAgICAgLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCSAgICBzX3ZhZGRyWzRdOyAgICAgLyogdmlydHVhbCBhZGRyZXNzCSAgICAgICovCi0JY2hhcgkgICAgc19zaXplWzRdOyAgICAgIC8qIHNlY3Rpb24gc2l6ZQkJICovCi0JY2hhcgkgICAgc19zY25wdHJbNF07ICAgIC8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkgICAgc19yZWxwdHJbNF07ICAgIC8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24gICAgICAgKi8KLQljaGFyCSAgICBzX2xubm9wdHJbNF07ICAgLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzICAgICAqLwotCWNoYXIJICAgIHNfbnJlbG9jWzJdOyAgICAvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JY2hhcgkgICAgc19ubG5ub1syXTsgICAgIC8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCSAgICBzX2ZsYWdzWzRdOyAgICAgLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0CWV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLSNkZWZpbmUgX0xJVAkiLmxpdCIKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBTZWN0aW9uIHR5cGVzIC0gd2l0aCBhZGRpdGlvbmFsIHNlY3Rpb24gdHlwZSBmb3IgZ2xvYmFsIAotKiogcmVnaXN0ZXJzIHdoaWNoIHdpbGwgYmUgcmVsb2NhdGFibGUgZm9yIHRoZSBBbTI5MDAwLgotKioKLSoqIEluIGluc3RhbmNlcyB3aGVyZSBpdCBpcyBuZWNlc3NhcnkgZm9yIGEgbGlua2VyIHRvIHByb2R1Y2UgYW4KLSoqIG91dHB1dCBmaWxlIHdoaWNoIGNvbnRhaW5zIHRleHQgb3IgZGF0YSBub3QgYmFzZWQgYXQgdmlydHVhbAotKiogYWRkcmVzcyAwLCBlLmcuIGZvciBhIFJPTSwgdGhlbiB0aGUgbGlua2VyIHNob3VsZCBhY2NlcHQKLSoqIGFkZHJlc3MgYmFzZSBpbmZvcm1hdGlvbiBhcyBjb21tYW5kIGlucHV0IGFuZCB1c2UgUEFEIHNlY3Rpb25zCi0qKiB0byBza2lwIG92ZXIgdW51c2VkIGFkZHJlc3Nlcy4KLSovCi0KLSNkZWZpbmUJU1RZUF9CU1NSRUcJMHgxMjAwCS8qIEdsb2JhbCByZWdpc3RlciBhcmVhIChsaWtlIFNUWVBfSU5GTykgKi8KLSNkZWZpbmUgU1RZUF9FTlZJUgkweDIyMDAJLyogRW52aXJvbm1lbnQgKGxpa2UgU1RZUF9JTkZPKSAqLwotI2RlZmluZSBTVFlQX0FCUwkweDQwMDAJLyogQWJzb2x1dGUgKGFsbG9jYXRlZCwgbm90IHJlbG9jLCBsb2FkZWQpICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogUmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBkZWNsYXJhdGlvbiBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwkvKiAodmlydHVhbCkgYWRkcmVzcyBvZiByZWZlcmVuY2UgKi8KLSAgY2hhciByX3N5bW5keFs0XTsJLyogaW5kZXggaW50byBzeW1ib2wgdGFibGUgKi8KLSAgY2hhciByX3R5cGVbMl07CS8qIHJlbG9jYXRpb24gdHlwZSAqLwotfTsKLQotI2RlZmluZQlSRUxPQwkJc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lCVJFTFNaCQkxMAkJLyogc2l6ZW9mIChSRUxPQykgKi8gCi0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogUmVsb2NhdGlvbiB0eXBlcyBmb3IgdGhlIEFtMjkwMDAgCi0qLwotCi0jZGVmaW5lCVJfQUJTCQkwCS8qIHJlZmVyZW5jZSBpcyBhYnNvbHV0ZSAqLwotIAotI2RlZmluZQlSX0lSRUwJCTAzMAkvKiBpbnN0cnVjdGlvbiByZWxhdGl2ZSAoam1wL2NhbGwpICovCi0jZGVmaW5lCVJfSUFCUwkJMDMxCS8qIGluc3RydWN0aW9uIGFic29sdXRlIChqbXAvY2FsbCkgKi8KLSNkZWZpbmUJUl9JTE9IQUxGCTAzMgkvKiBpbnN0cnVjdGlvbiBsb3cgaGFsZiAgKGNvbnN0KSAgKi8KLSNkZWZpbmUJUl9JSElIQUxGCTAzMwkvKiBpbnN0cnVjdGlvbiBoaWdoIGhhbGYgKGNvbnN0aCkgcGFydCAxICovCi0jZGVmaW5lCVJfSUhDT05TVAkwMzQJLyogaW5zdHJ1Y3Rpb24gaGlnaCBoYWxmIChjb25zdGgpIHBhcnQgMiAqLwotCQkJCS8qIGNvbnN0YW50IG9mZnNldCBvZiBSX0lISUhBTEYgcmVsb2NhdGlvbiAqLwotI2RlZmluZQlSX0JZVEUJCTAzNQkvKiByZWxvY2F0YWJsZSBieXRlIHZhbHVlICovCi0jZGVmaW5lIFJfSFdPUkQJCTAzNgkvKiByZWxvY2F0YWJsZSBoYWxmd29yZCB2YWx1ZSAqLwotI2RlZmluZSBSX1dPUkQJCTAzNwkvKiByZWxvY2F0YWJsZSB3b3JkIHZhbHVlICovCi0KLSNkZWZpbmUJUl9JR0xCTFJDCTA0MAkvKiBpbnN0cnVjdGlvbiBnbG9iYWwgcmVnaXN0ZXIgUkMgKi8KLSNkZWZpbmUJUl9JR0xCTFJBCTA0MQkvKiBpbnN0cnVjdGlvbiBnbG9iYWwgcmVnaXN0ZXIgUkEgKi8KLSNkZWZpbmUJUl9JR0xCTFJCCTA0MgkvKiBpbnN0cnVjdGlvbiBnbG9iYWwgcmVnaXN0ZXIgUkIgKi8KLSAKLS8qCi1OT1RFOgotQWxsIHRoZSAiSSIgZm9ybXMgcmVmZXIgdG8gMjkwMDAgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIFRoZSBsaW5rZXIgaXMgCi1leHBlY3RlZCB0byBrbm93IGhvdyB0aGUgbnVtZXJpYyBpbmZvcm1hdGlvbiBpcyBzcGxpdCBhbmQvb3IgYWxpZ25lZAotd2l0aGluIHRoZSBpbnN0cnVjdGlvbiB3b3JkKHMpLiAgUl9CWVRFIHdvcmtzIGZvciBpbnN0cnVjdGlvbnMsIHRvby4KLQotSWYgdGhlIHBhcmFtZXRlciB0byBhIENPTlNUSCBpbnN0cnVjdGlvbiBpcyBhIHJlbG9jYXRhYmxlIHR5cGUsIHR3byAKLXJlbG9jYXRpb24gcmVjb3JkcyBhcmUgd3JpdHRlbi4gIFRoZSBmaXJzdCBoYXMgYW4gcl90eXBlIG9mIFJfSUhJSEFMRiAKLSgzMyBvY3RhbCkgYW5kIGEgbm9ybWFsIHJfdmFkZHIgYW5kIHJfc3ltbmR4LiAgVGhlIHNlY29uZCByZWxvY2F0aW9uIAotcmVjb3JkIGhhcyBhbiByX3R5cGUgb2YgUl9JSENPTlNUICgzNCBvY3RhbCksIGEgbm9ybWFsIHJfdmFkZHIgKHdoaWNoIAotaXMgcmVkdW5kYW50KSwgYW5kIGFuIHJfc3ltbmR4IGNvbnRhaW5pbmcgdGhlIDMyLWJpdCBjb25zdGFudCBvZmZzZXQgCi10byB0aGUgcmVsb2NhdGlvbiBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgc3ltYm9sIHRhYmxlIGluZGV4LiAgVGhpcyAKLXNlY29uZCByZWNvcmQgaXMgYWx3YXlzIHdyaXR0ZW4sIGV2ZW4gaWYgdGhlIGNvbnN0YW50IG9mZnNldCBpcyB6ZXJvLgotVGhlIGNvbnN0YW50IGZpZWxkcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIHNldCB0byB6ZXJvLgotKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBMaW5lIG51bWJlciBlbnRyeSBkZWNsYXJhdGlvbiBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotc3RydWN0IGV4dGVybmFsX2xpbmVubyAKLXsKLSAgIHVuaW9uIHsKLQkgY2hhciBsX3N5bW5keFs0XTsgLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JIGNoYXIgbF9wYWRkcls0XTsgIC8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlciAgICAqLwotICAgfSBsX2FkZHI7Ci0gICBjaGFyIGxfbG5ub1syXTsgCS8qIGxpbmUgbnVtYmVyCSAgKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCQlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgkJNgkJLyogc2l6ZW9mIChMSU5FTk8pICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogU3ltYm9sIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi0jZGVmaW5lCUVfU1lNTk1MRU4JOAkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1ogCTE4Ci0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogU3RvcmFnZSBjbGFzcyBkZWZpbml0aW9ucyAtIG5ldyBjbGFzc2VzIGZvciBnbG9iYWwgcmVnaXN0ZXJzLgotKi8KLQotI2RlZmluZSBDX0dMQkxSRUcJMTkJCS8qIGdsb2JhbCByZWdpc3RlciAqLwotI2RlZmluZSBDX0VYVFJFRwkyMAkJLyogZXh0ZXJuYWwgZ2xvYmFsIHJlZ2lzdGVyICovCi0jZGVmaW5lCUNfREVGUkVHCTIxCQkvKiBleHQuIGRlZi4gb2YgZ2xvYmFsIHJlZ2lzdGVyICovCi0KLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBEZXJpdmVkIHN5bWJvbCBtYXNrL3NoaWZ0cy4KLSovCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX1RTSElGVAkoMikKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBBdXhpbGlhcnkgc3ltYm9sIHRhYmxlIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIAotKiogZGVmaW5pdGlvbnMuCi0qLwotCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQgICAgICAvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJICAqLwotI2RlZmluZSBFX0RJTU5VTSAgCTQgICAgICAgLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07ICAgICAgIC8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsgIC8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsgICAvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCSAgICAgICAvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOyAgICAgICAvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOyAgICAgICAvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOyAgICAgICAvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07ICAgICAvKiB0diByYW5nZSAqLwotCX0geF90djsJIC8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLX07Ci0KLSNkZWZpbmUJQVVYRU5UCQl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCQkxOAkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hbHBoYS5oIGIvaW5jbHVkZS9jb2ZmL2FscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NmNiY2IuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2FscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyogRUNPRkYgc3VwcG9ydCBvbiBBbHBoYSBtYWNoaW5lcy4KLSAgIGNvZmYvZWNvZmYuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzIGZpbGUuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0gIHVuc2lnbmVkIGNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfc3ltcHRyWzhdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qIE1hZ2ljIG51bWJlcnMgYXJlIGRlZmluZWQgaW4gY29mZi9lY29mZi5oLiAgKi8KLSNkZWZpbmUgQUxQSEFfRUNPRkZfQkFETUFHKHgpIFwKLSAgKCh4KS5mX21hZ2ljICE9IEFMUEhBX01BR0lDICYmICh4KS5mX21hZ2ljICE9IEFMUEhBX01BR0lDX0JTRCkKLQotLyogVGhlIG9iamVjdCB0eXBlIGlzIGVuY29kZWQgaW4gdGhlIGZfZmxhZ3MuICAqLwotI2RlZmluZSBGX0FMUEhBX09CSkVDVF9UWVBFX01BU0sJMHgzMDAwCi0jZGVmaW5lIEZfQUxQSEFfTk9fU0hBUkVECQkweDEwMDAKLSNkZWZpbmUgRl9BTFBIQV9TSEFSQUJMRQkJMHgyMDAwCi0jZGVmaW5lIEZfQUxQSEFfQ0FMTF9TSEFSRUQJCTB4MzAwMAotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjQKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IGV4dGVybmFsX2FvdXRoZHIKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY1syXTsJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgdW5zaWduZWQgY2hhciBibGRyZXZbMl07CS8qID8/ICovCi0gIHVuc2lnbmVkIGNoYXIgcGFkZGluZ1syXTsJLyogcGFkIHRvIHF1YWR3b3JkIGJvdW5kYXJ5CQkqLwotICB1bnNpZ25lZCBjaGFyCXRzaXplWzhdOwkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMJCQkqLwotICB1bnNpZ25lZCBjaGFyCWRzaXplWzhdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIHVuc2lnbmVkIGNoYXIJYnNpemVbOF07CS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcgllbnRyeVs4XTsJLyogZW50cnkgcHQuCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIgdGV4dF9zdGFydFs4XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFfc3RhcnRbOF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBic3Nfc3RhcnRbOF07CS8qIGJhc2Ugb2YgYnNzIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGdwcm1hc2tbNF07CS8qIGJpdG1hc2sgb2YgZ2VuZXJhbCByZWdpc3RlcnMgdXNlZCAqLwotICB1bnNpZ25lZCBjaGFyIGZwcm1hc2tbNF07CS8qIGJpdG1hc2sgb2YgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgKi8KLSAgdW5zaWduZWQgY2hhciBncF92YWx1ZVs4XTsJLyogdmFsdWUgZm9yIGdwIHJlZ2lzdGVyICovCi19IEFPVVRIRFI7Ci0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0jZGVmaW5lIEFPVVRTWiA4MAotI2RlZmluZSBBT1VUSERSU1ogODAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0gIHVuc2lnbmVkIGNoYXIJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfcGFkZHJbOF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIHVuc2lnbmVkIGNoYXIJc192YWRkcls4XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2l6ZVs4XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3NjbnB0cls4XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzX3JlbHB0cls4XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICB1bnNpZ25lZCBjaGFyCXNfbG5ub3B0cls4XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIHVuc2lnbmVkIGNoYXIJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIHVuc2lnbmVkIGNoYXIJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNjQKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIHVuc2lnbmVkIGNoYXIgcl92YWRkcls4XTsKLSAgdW5zaWduZWQgY2hhciByX3N5bW5keFs0XTsKLSAgdW5zaWduZWQgY2hhciByX2JpdHNbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0vKiBDb25zdGFudHMgdG8gdW5wYWNrIHRoZSByX2JpdHMgZmllbGQuICBUaGUgQWxwaGEgc2VlbXMgdG8gYWx3YXlzIGJlCi0gICBsaXR0bGUgZW5kaWFuLCBzbyBJIGhhdmVuJ3QgYm90aGVyZWQgdG8gZGVmaW5lIGJpZyBlbmRpYW4gdmFyaWFudHMKLSAgIG9mIHRoZXNlLiAgKi8KLQotI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRQkJCTB4ZmYKLSNkZWZpbmUgUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUJCTAKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFCQkweDAxCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRQkJMHg3ZQotI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFCQkxCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfTElUVExFCQkweDgwCi0jZGVmaW5lIFJFTE9DX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRQkJNwotI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9MSVRUTEUJCTB4ZmYKLSNkZWZpbmUgUkVMT0NfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUJMQotI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9MSVRUTEUJCTB4MDMKLSNkZWZpbmUgUkVMT0NfQklUUzNfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUJOQotCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFCQkJMHhmYwotI2RlZmluZSBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRQkJMgotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZMT05HCQkxCi0jZGVmaW5lIEFMUEhBX1JfUkVGUVVBRAkJMgotI2RlZmluZSBBTFBIQV9SX0dQUkVMMzIJCTMKLSNkZWZpbmUgQUxQSEFfUl9MSVRFUkFMCQk0Ci0jZGVmaW5lIEFMUEhBX1JfTElUVVNFCQk1Ci0jZGVmaW5lIEFMUEhBX1JfR1BESVNQCQk2Ci0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQk3Ci0jZGVmaW5lIEFMUEhBX1JfSElOVAkJOAotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJOQotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkgICAgICAgMTAKLSNkZWZpbmUgQUxQSEFfUl9TUkVMNjQJICAgICAgIDExCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFVTSAkgICAgICAgMTIKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRSAgICAgICAxMwotI2RlZmluZSBBTFBIQV9SX09QX1BTVUIJICAgICAgIDE0Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFJTSElGVCAgICAgMTUKLSNkZWZpbmUgQUxQSEFfUl9HUFZBTFVFCSAgICAgICAxNgotI2RlZmluZSBBTFBIQV9SX0dQUkVMSElHSCAgICAgIDE3Ci0jZGVmaW5lIEFMUEhBX1JfR1BSRUxMT1cgICAgICAgMTgKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRCAgICAgICAgICAxOQotCi0vKiBPdmVybG9hZGVkIHJlbG9jIHZhbHVlIHVzZWQgYnkgTmV0LSBhbmQgT3BlbkJTRC4gICovCi0jZGVmaW5lIEFMUEhBX1JfTElURVJBTFNMRUFaWSAgMTcKLQotLyogV2l0aCBBTFBIQV9SX0xJVFVTRSwgdGhlIHJfc2l6ZSBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0xVX0JBU0UgICAgICAgICAxCi0jZGVmaW5lIEFMUEhBX1JfTFVfQllUT0ZGICAgICAgIDIKLSNkZWZpbmUgQUxQSEFfUl9MVV9KU1IgICAgICAgICAgMwotCi0vKiBXaXRoIEFMUEhBX1JfSU1NRUQsIHRoZSByX3NpemUgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9HUF8xNiAgICAgMQotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0dQX0hJMzIgICAyCi0jZGVmaW5lIEFMUEhBX1JfSU1NRURfU0NOX0hJMzIgIDMKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9CUl9ISTMyICAgNAotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0xPMzIgICAgICA1Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTElDIElORk9STUFUSU9OICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlLiAgKi8KLQotLyogRUNPRkYgdXNlcyBDT0ZGLWxpa2Ugc2VjdGlvbiBzdHJ1Y3R1cmVzLCBidXQgaXRzIG93biBzeW1ib2wgZm9ybWF0LgotICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN5bWJvbCBmb3JtYXQgaW4gZmllbGRzIHdob3NlIHNpemUgYW5kIGFsaWdubWVudAotICAgd2lsbCBub3QgdmFyeSBvbiBkaWZmZXJlbnQgaG9zdCBzeXN0ZW1zLiAgKi8KLQotLyogRmlsZSBoZWFkZXIgYXMgYSBzZXQgb2YgYnl0ZXMgKi8KLQotc3RydWN0IGhkcl9leHQgewotCXVuc2lnbmVkIGNoYXIgCWhfbWFnaWNbMl07Ci0JdW5zaWduZWQgY2hhcgloX3ZzdGFtcFsyXTsKLQl1bnNpZ25lZCBjaGFyCWhfaWxpbmVNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lkbk1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXBkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3ltTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pb3B0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pYXV4TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3NNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc0V4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWZkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JEbk9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JQZE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTeW1PZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiT3B0T2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkF1eE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc09mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc0V4dE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JGZE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JSZmRPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRXh0T2Zmc2V0WzhdOwotfTsKLQotLyogRmlsZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZmRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglmX2Fkcls4XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVbOF07Ci0JdW5zaWduZWQgY2hhcglmX2NiU3NbOF07Ci0JdW5zaWduZWQgY2hhcglmX3Jzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXNzQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXN5bUJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglmX2lsaW5lQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2xpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lvcHRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jb3B0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pcGRGaXJzdFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3BkWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pYXV4QmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2F1eFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfcmZkQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglmX2JpdHMyWzNdOwotCXVuc2lnbmVkIGNoYXIJZl9wYWRkaW5nWzRdOwotfTsKLQotI2RlZmluZQlGRFJfQklUUzFfTEFOR19CSUcJCTB4RjgKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfQklHCQkzCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0xJVFRMRQkJMHgxRgotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUJMAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfQklHCQkweDA0Ci0jZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfTElUVExFCQkweDIwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fQklHCQkweDAyCi0jZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRQkweDQwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHCTB4MDEKLSNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFCTB4ODAKLQotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0JJRwkJMHhDMAotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0JJRwkJNgotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0xJVFRMRQkJMHgwMwotI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRQkwCi0KLS8qIFdlIGlnbm9yZSB0aGUgYHJlc2VydmVkJyBmaWVsZCBpbiBiaXRzMi4gKi8KLQotLyogUHJvY2VkdXJlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBwZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXBfYWRyWzhdOwotCXVuc2lnbmVkIGNoYXIJcF9jYkxpbmVPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcglwX2lzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglwX2lsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2lvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZW9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5Mb3dbNF07Ci0JdW5zaWduZWQgY2hhcglwX2xuSGlnaFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZ3BfcHJvbG9ndWVbMV07Ci0JdW5zaWduZWQgY2hhcglwX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJcF9iaXRzMlsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfbG9jYWxvZmZbMV07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9wY3JlZ1syXTsKLX07Ci0KLSNkZWZpbmUgUERSX0JJVFMxX0dQX1VTRURfQklHCQkweDgwCi0jZGVmaW5lIFBEUl9CSVRTMV9SRUdfRlJBTUVfQklHCQkweDQwCi0jZGVmaW5lIFBEUl9CSVRTMV9QUk9GX0JJRwkJMHgyMAotI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfQklHCQkweDFmCi0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9CSUcJCTB4ZmYKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0JJRwkwCi0KLSNkZWZpbmUgUERSX0JJVFMxX0dQX1VTRURfTElUVExFCTB4MDEKLSNkZWZpbmUgUERSX0JJVFMxX1JFR19GUkFNRV9MSVRUTEUJMHgwMgotI2RlZmluZSBQRFJfQklUUzFfUFJPRl9MSVRUTEUJCTB4MDQKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX0xJVFRMRQkweGY4Ci0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUJMwotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfTElUVExFCTB4ZmYKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFIDUKLQotLyogTGluZSBudW1iZXJzICovCi0KLXN0cnVjdCBsaW5lX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglsX2xpbmVbNF07Ci19OwotCi0vKiBTeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBzeW1fZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXNfdmFsdWVbOF07Ci0JdW5zaWduZWQgY2hhcglzX2lzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzM1sxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czRbMV07Ci19OwotCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9CSUcJCTB4RkMKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0JJRwkJMgotI2RlZmluZQlTWU1fQklUUzFfU1RfTElUVExFCQkweDNGCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9MSVRUTEUJCTAKLQotI2RlZmluZQlTWU1fQklUUzFfU0NfQklHCQkweDAzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRwkzCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19MSVRUTEUJCTB4QzAKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xJVFRMRQkJNgotCi0jZGVmaW5lCVNZTV9CSVRTMl9TQ19CSUcJCTB4RTAKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0JJRwkJNQotI2RlZmluZQlTWU1fQklUUzJfU0NfTElUVExFCQkweDA3Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRQkyCi0KLSNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0JJRwkJMHgxMAotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfTElUVExFCTB4MDgKLQotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfQklHCQkweDBGCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRwkxNgotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfTElUVExFCQkweEYwCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUJNAotCi0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFCTEyCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGV4dF9leHQgewotCXN0cnVjdAlzeW1fZXh0IGVzX2FzeW07Ci0JdW5zaWduZWQgY2hhcgllc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMyWzNdOwotCXVuc2lnbmVkIGNoYXIJZXNfaWZkWzRdOwotfTsKLQotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0JJRwkJMHg4MAotI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0xJVFRMRQkJMHgwMQotCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRwkweDQwCi0jZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRQkweDAyCi0KLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfQklHCQkweDIwCi0jZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRQkweDA0Ci0KLS8qIERlbnNlIG51bWJlcnMgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBkbnJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWRfcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZF9pbmRleFs0XTsKLX07Ci0KLS8qIFJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciAqLwotCi1zdHJ1Y3QgcmZkX2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIJcmZkWzRdOwotfTsKLQotLyogT3B0aW1pemVyIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IG9wdF9leHQgewotICB1bnNpZ25lZCBjaGFyIG9fYml0czFbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMlsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMzWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czRbMV07Ci0gIHN0cnVjdCBybmR4X2V4dCBvX3JuZHg7Ci0gIHVuc2lnbmVkIGNoYXIgb19vZmZzZXRbNF07Ci19OwotCi0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRwkxNgotI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMAotCi0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfQklHCTAKLSNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFCTE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXBvbGxvLmggYi9pbmNsdWRlL2NvZmYvYXBvbGxvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMzQ3ZjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2Fwb2xsby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgQXBvbGxvIE02OEsgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotLyogTW90b3JvbGEgNjgwMDAvNjgwMDgvNjgwMTAvNjgwMjAgKi8KLSNkZWZpbmUJTUM2OE1BR0lDCTA1MjAKLSNkZWZpbmUgTUM2OEtXUk1BR0lDCTA1MjAJLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUJTUM2OFRWTUFHSUMJMDUyMQotI2RlZmluZSBNQzY4S1JPTUFHSUMJMDUyMQkvKiByZWFkb25seSBzaGFyZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZSBNQzY4S1BHTUFHSUMJMDUyMgkvKiBkZW1hbmQgcGFnZWQgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNNjhNQUdJQwkwMjEwCi0jZGVmaW5lCU02OFRWTUFHSUMJMDIxMQotCi0vKiBBcG9sbG8gNjgwMDAtYmFzZWQgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCBtYWdpYyBudW1iZXIuIFRoaXMgY29tZXMKLSAqIGZyb20gL3Vzci9pbmNsdWRlL2Fwb2xsby9maWxlaGRyLmgKLSAqLwotI2RlZmluZSBBUE9MTE9NNjhLTUFHSUMgMDYyNwotCi0jZGVmaW5lIE9NQUdJQyBNNjhNQUdJQwotI2RlZmluZSBNNjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1dSTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OFRWTUFHSUMpICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1NQzY4S1JPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtQR01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OFRWTUFHSUMpICAmJiBcCi0gICgoeCkuZl9tYWdpYyE9QVBPTExPTTY4S01BR0lDKSApCi0KLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIJb19zcmlbNF07CQkvKiBBcG9sbG8gc3BlY2lmaWMgLSAuc3JpIGRhdGEgcG9pbnRlciAqLwotICBjaGFyICBvX2lubGliWzRdOwkJLyogQXBvbGxvIHNwZWNpZmljIC0gLmlubGliIGRhdGEgcG9pbnRlciAqLwotICBjaGFyCXZpZFs4XTsJCQkvKiBBcG9sbG8gc3BlY2lmaWMgLSA2NCBiaXQgdmVyc2lvbiBJRCAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZQlBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUiAxIC8qIHRoZSB2YWx1ZSBvZiB0aGUgYW91dGhkciBtYWdpYyAqLwotI2RlZmluZQlBT1VUSERSU1ogNDQKLSNkZWZpbmUgQU9VVFNaIDQ0Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQkvKiBBcG9sbG8gYWxsb3cgZm9yIGxhcmdlciBzZWN0aW9uIG5hbWVzIGJ5ICBhbGxvd2luZyBpdCB0byBiZSBpbgotCSAqIHRoZSBzdHJpbmcgdGFibGUuCi0JICovCi0JY2hhcgkJc19uYW1lWzhdOwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogSWYgc196ZW9yZXMgaXMgYWxsIHplcm9lcywgc19vZmZzZXQgZ2l2ZXMgdGhlIHJlYWwgbG9jYXRpb24gb2YgdGhlIG5hbWUKLSAqIGluIHRoZSBzdHJpbmcgdGFibGUuCi0gKi8KLQotI2RlZmluZQlzX3plcm9lcyBzZWN0aW9uX25hbWUuc19uYW1lCi0jZGVmaW5lCXNfb2Zmc2V0IChzZWN0aW9uX25hbWUuc19uYW1lKzQpCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1RWCSIudHYiCi0jZGVmaW5lIF9JTklUCSIuaW5pdCIKLSNkZWZpbmUgX0ZJTkkJIi5maW5pIgotI2RlZmluZQlfTElORVMJIi5saW5lcyIKLSNkZWZpbmUJX0JMT0NLUwkiLmJsb2NrcyIKLSNkZWZpbmUgX1NSSSAgICAiLnNyaSIgICAgICAgICAgICAgICAgICAvKiBTdGF0aWMgUmVzb3VyY2UgSW5mb3JtYXRpb24gKHN5c3R5cGUsCi0gZXQgYWwuKSAqLwotI2RlZmluZSBfTUlSICAgICIubWlyIiAgICAgICAgICAgICAgICAgIC8qIE1vZHVsZSBJbmZvcm1hdGlvbiBSZWNvcmRzICAqLwotI2RlZmluZSBfQVBUViAgICIuYXB0diIgICAgICAgICAgICAgICAgIC8qIEFwb2xsby1zdHlsZSB0cmFuc2ZlciB2ZWN0b3JzLiAqLwotI2RlZmluZSBfSU5MSUIgICIuaW5saWIiICAgICAgICAgICAgICAgIC8qIFNoYXJlZCBMaWJyYXJ5IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIF9SV0RJICAgIi5yd2RpIiAgICAgICAgIC8qIFJlYWQvd3JpdGUgZGF0YSBpbml0aWFsaXphdGlvbiBkaXJlY3RpdmVzIGZvcgotIGNvbXByZXNzZWQgc2VjdGlvbnMgKi8KLSNkZWZpbmUgX1VOV0lORCAiLnVud2luZCIgICAgICAgICAgICAgICAvKiBTdGFjayB1bndpbmQgaW5mb3JtYXRpb24gKi8KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0gIGNoYXIgcl9vZmZzZXRbNF07Ci0jZW5kaWYKLQotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotCi0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotI2RlZmluZSBSRUxTWiAxNAotI2Vsc2UKLSNkZWZpbmUgUkVMU1ogMTAKLSNlbmRpZgotCi0vKiBBcG9sbG8gc3BlY2lmaWMgU1RZUCBmbGFncyAqLwotCi0jZGVmaW5lIFNUWVBfUkVMT0NBVEVEX05PVF9MT0FERUQgMHgwMDAxMDAwMAkvKiBTZWN0aW9uIGlzIHJlbG9jYXRlZCBub3JtYWxseSBkdXJpbmcgbGlua2luZywgYnV0IG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIG5vdCBiZSBsb2FkZWQgZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uICovCi0jZGVmaW5lIFNUWVBfREVCVUcgICAgICAgICAgICAgIDB4MDAwMjAwMDAJLyogZGVidWcgc2VjdGlvbiAqLwotI2RlZmluZSBTVFlQX09WRVJMQVkJCTB4MDAwNDAwMDAJLyogU2VjdGlvbiBpcyBvdmVybGF5ZWQgKi8KLSNkZWZpbmUgU1RZUF9JTlNUUlVDVElPTiAgICAJMHgwMDIwMDAwMAkvKiBTZWN0aW9uIGNvbnRhaW5zIGV4ZWN1dGFibGUgY29kZSAqLwotCi0jZGVmaW5lIFNUWVBfWkVSTwkJMHgwMDgwMDAwMAkvKiBTZWN0aW9uIGlzIGluaXRpYWxpemVkIHRvIHplcm8gKi8KLSNkZWZpbmUgU1RZUF9JTlNUQUxMRUQJCTB4MDIwMDAwMDAJLyogU2VjdGlvbiBzaG91bGQgYmUgaW5zdGFsbGFibGUgaW4gS0dUICovCi0jZGVmaW5lIFNUWVBfTE9PS19JTlNUQUxMRUQJMHgwNDAwMDAwMAkvKiBMb29rIGZvciBzZWN0aW9uIGluIEtHVCAqLwotI2RlZmluZSBTVFlQX1NFQ0FMSUdOMQkJMHgwODAwMDAwMAkvKiBTcGVjaWFsbHkgYWxpZ25lZCBzZWN0aW9uICovCi0jZGVmaW5lIFNUWVBfU0VDQUxJR04yCQkweDEwMDAwMDAwCS8qICAgICAgIiAgICAgICAiICAgICAgICIgICAgKi8KLSNkZWZpbmUgU1RZUF9DT01QUkVTU0VECQkweDIwMDAwMDAwCS8qIE5vIHNlY3Rpb24gZGF0YSBwZXIgc2UgKHNfc2NucHRyID0gMCksIGJ1dCB0aGVyZSBhcmUKLQkJCQkJCSAgIGluaXRpYWxpemF0aW9uIGRpcmVjdGl2ZXMgZm9yIGl0IGluIC5yd2RpIHNlY3Rpb24KLQkJCQkJCSAgICh1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU1RZUF9CU1MpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXJtLmggYi9pbmNsdWRlL2NvZmYvYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTkzMjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2FybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qIEFSTSBDT0ZGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIENPRkZBUk0gMQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICogICAgICBGX0lOVEVSV09SSyAgICAgZmlsZSBzdXBwb3J0cyBzd2l0Y2hpbmcgYmV0d2VlbiBBUk0gYW5kIFRodW1iIGluc3RydWN0aW9uIHNldHMKLSAqICAgICAgRl9JTlRFUldPUktfU0VUIHRoZSBGX0lOVEVSV09SSyBiaXQgaXMgdmFsaWQKLSAqCUZfQVBDU19GTE9BVAljb2RlIHBhc3NlcyBmbG9hdCBhcmd1bWVudHMgaW4gZmxvYXQgcmVnaXN0ZXJzCi0gKglGX1BJQwkJY29kZSBpcyByZWVudHJhbnQvcG9zaXRpb24taW5kZXBlbmRlbnQKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICoJRl9BUENTXzI2CWZpbGUgdXNlcyAyNiBiaXQgQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkCi0gKglGX0FQQ1NfU0VUCXRoZSBGX0FQQ1NfMjYsIEZfQVBDU19GTE9BVCBhbmQgRl9QSUMgYml0cyBoYXZlIGJlZW4gaW5pdGlhbGlzZWQKLSAqCUZfU09GVF9GTE9BVAljb2RlIGRvZXMgbm90IHVzZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotI2RlZmluZSBGX0lOVEVSV09SSwkoMHgwMDEwKQotI2RlZmluZSBGX0lOVEVSV09SS19TRVQJKDB4MDAyMCkKLSNkZWZpbmUgRl9BUENTX0ZMT0FUCSgweDAwNDApCi0jdW5kZWYgIEZfQVIxNldSCi0jZGVmaW5lIEZfUElDCQkoMHgwMDgwKQotI2RlZmluZQlGX0FSMzJXUgkoMHgwMTAwKQotI2RlZmluZSBGX0FQQ1NfMjYJKDB4MDQwMCkKLSNkZWZpbmUgRl9BUENTX1NFVAkoMHgwODAwKQotI2RlZmluZSBGX1NPRlRfRkxPQVQJKDB4MjAwMCkKLQotLyogQml0cyBzdG9yZWQgaW4gZmxhZ3MgZmllbGQgb2YgdGhlIGludGVybmFsX2Ygc3RydWN0dXJlICovCi0KLSNkZWZpbmUgRl9JTlRFUldPUksJKDB4MDAxMCkKLSNkZWZpbmUgRl9BUENTX0ZMT0FUCSgweDAwNDApCi0jZGVmaW5lIEZfUElDCQkoMHgwMDgwKQotI2RlZmluZSBGX0FQQ1MyNgkoMHgxMDAwKQotI2RlZmluZSBGX0FSTV9BUkNISVRFQ1RVUkVfTUFTSyAoMHg0MDAwKzB4MDgwMCsweDA0MDApCi0jZGVmaW5lIEZfQVJNXzIJCSgweDA0MDApCi0jZGVmaW5lIEZfQVJNXzJhCSgweDA4MDApCi0jZGVmaW5lIEZfQVJNXzMJCSgweDBjMDApCi0jZGVmaW5lIEZfQVJNXzNNCSgweDQwMDApCi0jZGVmaW5lIEZfQVJNXzQJCSgweDQ0MDApCi0jZGVmaW5lIEZfQVJNXzRUCSgweDQ4MDApCi0jZGVmaW5lIEZfQVJNXzUJCSgweDRjMDApCi0KLS8qCi0gKiBBUk1NQUdJQyBvdWdodCB0byBlbmNvZGVkIHRoZSBwcm9jZXNvciB0eXBlLAotICogYnV0IGl0IGlzIHRvbyBsYXRlIHRvIGNoYW5nZSBpdCBub3csIGluc3RlYWQKLSAqIHRoZSBmbGFncyBmaWVsZCBvZiB0aGUgaW50ZXJuYWxfZiBzdHJ1Y3R1cmUKLSAqIGlzIHVzZWQgYXMgc2hvd24gYWJvdmUuCi0gKgotICogWFhYIC0gTkMgNS82Lzk3Ci0gKi8KLQotI2RlZmluZQlBUk1NQUdJQwkweGEwMCAgLyogSSBqdXN0IG1hZGUgdGhpcyB1cCAqLwotCi0jZGVmaW5lIEFSTUJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljICE9IEFSTU1BR0lDKSkKLQotI2RlZmluZQlBUk1QRU1BR0lDCTB4MWMwCi0jZGVmaW5lCVRIVU1CUEVNQUdJQwkweDFjMgotCi0jdW5kZWYgIEFSTUJBRE1BRwotI2RlZmluZSBBUk1CQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBBUk1NQUdJQykgJiYgKCh4KS5mX21hZ2ljICE9IEFSTVBFTUFHSUMpICYmICgoeCkuZl9tYWdpYyAhPSBUSFVNQlBFTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotCi0vKiBkZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcyAqLwotLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAgIAotI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAotI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLXsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyogV2UgdXNlIHRoZSAucmRhdGEgc2VjdGlvbiB0byBob2xkIHJlYWQgb25seSBkYXRhLiAgKi8KLSNkZWZpbmUgX0xJVAkiLnJkYXRhIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLXsKLQl1bmlvbgotCXsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQKLXsKLQlzdHJ1Y3QKLQl7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24KLQkJewotCQkJc3RydWN0Ci0JCQl7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbgotCQl7Ci0JCQlzdHJ1Y3QgCQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQl7Ci0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IAkJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJewotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbgotCXsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QKLQkJewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0Ci0JewotCQljaGFyIHhfc2NubGVuWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCQljaGFyIHhfY2hlY2tzdW1bNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0JCWNoYXIgeF9hc3NvY2lhdGVkWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0JCWNoYXIgeF9jb21kYXRbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QKLQl7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotI2RlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBUk1fV0lOQ0UKLXN0cnVjdCBleHRlcm5hbF9yZWxvYwotewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQotI2Vsc2UKLXN0cnVjdCBleHRlcm5hbF9yZWxvYwotewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTQKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2F1eC1jb2ZmLmggYi9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5YzEyNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIE1vZGlmaWNhdGlvbnMgb2YgaW50ZXJuYWwuaCBhbmQgbTY4ay5oIG5lZWRlZCBieSBBL1VYCi0gICBTdWdnZXN0ZWQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+ICovCi0KLSNpZm5kZWYgR05VX0NPRkZfQVVYX0gKLSNkZWZpbmUgR05VX0NPRkZfQVVYX0ggMQotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvbTY4ay5oIgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIDY0LWJ5dGUgcGFkZGVkIHBhdGhuYW1lcyBvZiBzaGFyZWQgbGlicmFyaWVzICovCi0jdW5kZWYgU1RZUF9MSUIKLSNkZWZpbmUgU1RZUF9MSUIgMHgyMDAKLQotLyogU2VjdGlvbiBjb250YWlucyBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbiBjb2RlICovCi0jdW5kZWYgU1RZUF9JTklUCi0jZGVmaW5lIFNUWVBfSU5JVCAweDQwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIC5pZGVudCBpbmZvcm1hdGlvbiAqLwotI3VuZGVmIFNUWVBfSURFTlQKLSNkZWZpbmUgU1RZUF9JREVOVCAweDgwMAotCi0vKiBTZWN0aW9uIHR5cGVzIHVzZWQgYnkgYmZkIGFuZCBnYXMgbm90IGRlZmluZWQgKGRpcmVjdGx5KSBieSBBL1VYICovCi0jdW5kZWYgU1RZUF9PVkVSCi0jZGVmaW5lIFNUWVBfT1ZFUiAwCi0jdW5kZWYgU1RZUF9JTkZPCi0jZGVmaW5lIFNUWVBfSU5GTyBTVFlQX0lERU5UCi0KLS8qIFRyYWRpdGlvbmFsIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGFnZ2VkIHdpdGggU1RZUF9MSUIgKi8KLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotI2VuZGlmIC8qIEdOVV9DT0ZGX0FVWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvZWNvZmYuaCBiL2luY2x1ZGUvY29mZi9lY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQyMDJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9lY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLSNpZm5kZWYgRUNPRkZfSAotI2RlZmluZSBFQ09GRl9ICi0KLS8qIEdlbmVyaWMgRUNPRkYgc3VwcG9ydC4KLSAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBzeW1ib2wgaW5mb3JtYXRpb24sIGZvdW5kIGluIHN5bS5oIGFuZAotICAgc3ltY29uc3QuaC4gICovCi0KLS8qIE1pcHMgbWFnaWMgbnVtYmVycyB1c2VkIGluIGZpbGVoZHIuICBNSVBTX01BR0lDX0xJVFRMRSBpcyB1c2VkIG9uCi0gICBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLiAgTUlQU19NQUdJQ19CSUcgaXMgdXNlZCBvbiBiaWcgZW5kaWFuCi0gICBtYWNoaW5lcy4gIFdoZXJlIGlzIE1JUFNfTUFHSUNfMSBmcm9tPyAgKi8KLSNkZWZpbmUgTUlQU19NQUdJQ18xIDB4MDE4MAotI2RlZmluZSBNSVBTX01BR0lDX0xJVFRMRSAweDAxNjIKLSNkZWZpbmUgTUlQU19NQUdJQ19CSUcgMHgwMTYwCi0KLS8qIFRoZXNlIGFyZSB0aGUgbWFnaWMgbnVtYmVycyB1c2VkIGZvciBNSVBTIGNvZGUgY29tcGlsZWQgYXQgSVNBCi0gICBsZXZlbCAyLiAgKi8KLSNkZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUyIDB4MDE2NgotI2RlZmluZSBNSVBTX01BR0lDX0JJRzIgMHgwMTYzCi0KLS8qIFRoZXNlIGFyZSB0aGUgbWFnaWMgbnVtYmVycyB1c2VkIGZvciBNSVBTIGNvZGUgY29tcGlsZWQgYXQgSVNBCi0gICBsZXZlbCAzLiAgKi8KLSNkZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUzIDB4MTQyCi0jZGVmaW5lIE1JUFNfTUFHSUNfQklHMyAweDE0MAotCi0vKiBBbHBoYSBtYWdpYyBudW1iZXJzIHVzZWQgaW4gZmlsZWhkci4gICovCi0jZGVmaW5lIEFMUEhBX01BR0lDIDB4MTgzCi0jZGVmaW5lIEFMUEhBX01BR0lDX0JTRCAweDE4NQotCi0vKiBNYWdpYyBudW1iZXJzIHVzZWQgaW4gYS5vdXQgaGVhZGVyLiAgKi8KLSNkZWZpbmUgRUNPRkZfQU9VVF9PTUFHSUMgMDQwNwkvKiBub3QgZGVtYW5kIHBhZ2VkIChsZCAtTikuICAqLwotI2RlZmluZSBFQ09GRl9BT1VUX1pNQUdJQyAwNDEzCS8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotCi0vKiBOYW1lcyBvZiBzcGVjaWFsIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgX1RFWFQgICAiLnRleHQiCi0jZGVmaW5lIF9EQVRBICAgIi5kYXRhIgotI2RlZmluZSBfQlNTICAgICIuYnNzIgotI2RlZmluZSBfUkRBVEEJIi5yZGF0YSIKLSNkZWZpbmUgX1NEQVRBCSIuc2RhdGEiCi0jZGVmaW5lIF9TQlNTCSIuc2JzcyIKLSNkZWZpbmUgX0xJVEEJIi5saXRhIgotI2RlZmluZSBfTElUNAkiLmxpdDQiCi0jZGVmaW5lIF9MSVQ4CSIubGl0OCIKLSNkZWZpbmUgX0xJQgkiLmxpYiIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0jZGVmaW5lIF9QREFUQQkiLnBkYXRhIgotI2RlZmluZSBfWERBVEEJIi54ZGF0YSIKLSNkZWZpbmUgX0dPVAkiLmdvdCIKLSNkZWZpbmUgX0hBU0gJIi5oYXNoIgotI2RlZmluZSBfRFlOU1lNCSIuZHluc3ltIgotI2RlZmluZSBfRFlOU1RSCSIuZHluc3RyIgotI2RlZmluZSBfUkVMRFlOCSIucmVsLmR5biIKLSNkZWZpbmUgX0NPTkZMSUMgIi5jb25mbGljIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUJMSVNUICIubGlibGlzdCIKLSNkZWZpbmUgX0RZTkFNSUMgIi5keW5hbWljIgotI2RlZmluZSBfUkNPTlNUCSIucmNvbnN0IgotCi0vKiBFQ09GRiB1c2VzIHNvbWUgYWRkaXRpb25hbCBzZWN0aW9uIGZsYWdzLiAgKi8KLSNkZWZpbmUgU1RZUF9SREFUQQkgICAgIDB4MTAwCi0jZGVmaW5lIFNUWVBfU0RBVEEJICAgICAweDIwMAotI2RlZmluZSBTVFlQX1NCU1MJICAgICAweDQwMAotI2RlZmluZSBTVFlQX0dPVAkgICAgMHgxMDAwCi0jZGVmaW5lIFNUWVBfRFlOQU1JQwkgICAgMHgyMDAwCi0jZGVmaW5lIFNUWVBfRFlOU1lNCSAgICAweDQwMDAKLSNkZWZpbmUgU1RZUF9SRUxEWU4JICAgIDB4ODAwMAotI2RlZmluZSBTVFlQX0RZTlNUUgkgICAweDEwMDAwCi0jZGVmaW5lIFNUWVBfSEFTSAkgICAweDIwMDAwCi0jZGVmaW5lIFNUWVBfTElCTElTVAkgICAweDQwMDAwCi0jZGVmaW5lIFNUWVBfQ09ORkxJQwkgIDB4MTAwMDAwCi0jZGVmaW5lIFNUWVBfRUNPRkZfRklOSQkgMHgxMDAwMDAwCi0jZGVmaW5lIFNUWVBfRVhURU5ERVNDCSAweDIwMDAwMDAgLyogMHgwMkZGRjAwMCBiaXRzID0+IHNjbiB0eXBlLCByZXN0IGNsciAqLwotI2RlZmluZSBTVFlQX0xJVEEJIDB4NDAwMDAwMAotI2RlZmluZSBTVFlQX0xJVDgJIDB4ODAwMDAwMAotI2RlZmluZSBTVFlQX0xJVDQJMHgxMDAwMDAwMAotI2RlZmluZSBTVFlQX0VDT0ZGX0xJQgkweDQwMDAwMDAwCi0jZGVmaW5lIFNUWVBfRUNPRkZfSU5JVCAweDgwMDAwMDAwCi0jZGVmaW5lIFNUWVBfT1RIRVJfTE9BRCAoU1RZUF9FQ09GRl9JTklUIHwgU1RZUF9FQ09GRl9GSU5JKQotCi0vKiBleHRlbmRlZCBzZWN0aW9uIHR5cGVzICovCi0jZGVmaW5lIFNUWVBfQ09NTUVOVAkgMHgyMTAwMDAwCi0jZGVmaW5lIFNUWVBfUkNPTlNUCSAweDIyMDAwMDAKLSNkZWZpbmUgU1RZUF9YREFUQQkgMHgyNDAwMDAwCi0jZGVmaW5lIFNUWVBfUERBVEEJIDB4MjgwMDAwMAotCi0vKiBUaGUgbGlua2VyIG5lZWRzIGEgc2VjdGlvbiB0byBob2xkIHNtYWxsIGNvbW1vbiB2YXJpYWJsZXMgd2hpbGUKLSAgIGxpbmtpbmcuICBUaGVyZSBpcyBubyBjb252ZW5pZW50IHdheSB0byBjcmVhdGUgaXQgd2hlbiB0aGUgbGlua2VyCi0gICBuZWVkcyBpdCwgc28gd2UgYWx3YXlzIGNyZWF0ZSBvbmUgZm9yIGVhY2ggQkZELiAgV2UgdGhlbiBhdm9pZAotICAgd3JpdGluZyBpdCBvdXQuICAqLwotI2RlZmluZSBTQ09NTU9OICIuc2NvbW1vbiIKLQotLyogSWYgdGhlIGV4dGVybiBiaXQgaW4gYSByZWxvYyBpcyAxLCB0aGVuIHJfc3ltbmR4IGlzIGFuIGluZGV4IGludG8KLSAgIHRoZSBleHRlcm5hbCBzeW1ib2wgdGFibGUuICBJZiB0aGUgZXh0ZXJuIGJpdCBpcyAwLCB0aGVuIHJfc3ltbmR4Ci0gICBpbmRpY2F0ZXMgYSBzZWN0aW9uLCBhbmQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9OT05FCTAKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9URVhUCTEKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9SREFUQQkyCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fREFUQQkzCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fU0RBVEEJNAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1NCU1MJNQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0JTUwk2Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fSU5JVAk3Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTElUOAk4Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTElUNAk5Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fWERBVEEgICAgMTAKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9QREFUQSAgICAxMQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0ZJTkkgICAgIDEyCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTElUQSAgICAgMTMKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9BQlMgICAgICAxNAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1JDT05TVCAgIDE1Ci0KLSNkZWZpbmUgTlVNX1JFTE9DX1NFQ1RJT05TICAgICAxNgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTVEFCUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBnY2MgdXNlcyBtaXBzLXRmaWxlIHRvIG91dHB1dCB0eXBlIGluZm9ybWF0aW9uIGluIHNwZWNpYWwgc3RhYnMKLSAgIGVudHJpZXMuICBUaGVzZSBtdXN0IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluaXRpb24gaW4KLSAgIGdjYy9jb25maWcvbWlwcy5oLiAgQXQgc29tZSBwb2ludCwgdGhlc2Ugc2hvdWxkIHByb2JhYmx5IGdvIGludG8gYQotICAgc2hhcmVkIGluY2x1ZGUgZmlsZSwgYnV0IGN1cnJlbnRseSBnY2MgYW5kIGdkYiBkbyBub3Qgc2hhcmUgYW55Ci0gICBkaXJlY3Rvcmllcy4gKi8KLSNkZWZpbmUgQ09ERV9NQVNLIDB4OEYzMDAKLSNkZWZpbmUgRUNPRkZfSVNfU1RBQihzeW0pICgoKHN5bSktPmluZGV4ICYgMHhGRkYwMCkgPT0gQ09ERV9NQVNLKQotI2RlZmluZSBFQ09GRl9NQVJLX1NUQUIoY29kZSkgKChjb2RlKStDT0RFX01BU0spCi0jZGVmaW5lIEVDT0ZGX1VOTUFSS19TVEFCKGNvZGUpICgoY29kZSktQ09ERV9NQVNLKQotI2RlZmluZSBTVEFCU19TWU1CT0wgIkBzdGFicyIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQ09GRiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBnY2MgYWxzbyB1c2VzIG1pcHMtdGZpbGUgdG8gb3V0cHV0IENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgaXQgdXNlcyB3aGVuIG91dHB1dHRpbmcgdGhlIC50eXBlIGRpcmVjdGl2ZS4KLSAgIFRoZXNlIHNob3VsZCBhbHNvIGJlIGluIGEgc2hhcmVkIGluY2x1ZGUgZmlsZS4gICovCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQVVYICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBhdXhpbGlhcnkgdHlwZSBpbmZvcm1hdGlvbiBpcyB0aGUgc2FtZSBvbiBhbGwga25vd24gRUNPRkYKLSAgIHRhcmdldHMuICBJIGNhbid0IHNlZSBhbnkgcmVhc29uIHRoYXQgaXQgd291bGQgZXZlciBjaGFuZ2UsIHNvIEkgYW0KLSAgIGdvaW5nIHRvIGdhbWJsZSBhbmQgZGVmaW5lIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmVzIGhlcmUsIGluIHRoZQotICAgdGFyZ2V0IGluZGVwZW5kZW50IEVDT0ZGIGhlYWRlciBmaWxlLiAgVGhlIGludGVybmFsIGZvcm1zIGFyZQotICAgZGVmaW5lZCBpbiBjb2ZmL3N5bS5oLCB3aGljaCB3YXMgb3JpZ2luYWxseSBkb25hdGVkIGJ5IE1JUFMKLSAgIENvbXB1dGVyIFN5c3RlbXMuICAqLwotCi0vKiBUeXBlIGluZm9ybWF0aW9uIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgdGlyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcgl0X2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJdF90cTQ1WzFdOwotCXVuc2lnbmVkIGNoYXIJdF90cTAxWzFdOwotCXVuc2lnbmVkIGNoYXIJdF90cTIzWzFdOwotfTsKLQotI2RlZmluZQlUSVJfQklUUzFfRkJJVEZJRUxEX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4ODApCi0jZGVmaW5lCVRJUl9CSVRTMV9GQklURklFTERfTElUVExFCSgodW5zaWduZWQgaW50KSAweDAxKQotCi0jZGVmaW5lCVRJUl9CSVRTMV9DT05USU5VRURfQklHCQkoKHVuc2lnbmVkIGludCkgMHg0MCkKLSNkZWZpbmUJVElSX0JJVFMxX0NPTlRJTlVFRF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDIpCi0KLSNkZWZpbmUJVElSX0JJVFMxX0JUX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4M0YpCi0jZGVmaW5lCVRJUl9CSVRTMV9CVF9TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFMxX0JUX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RkMpCi0jZGVmaW5lCVRJUl9CSVRTMV9CVF9TSF9MSVRUTEUJCTIKLQotI2RlZmluZQlUSVJfQklUU19UUTRfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFE0X1NIX0JJRwkJNAotI2RlZmluZQlUSVJfQklUU19UUTVfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFE1X1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUU19UUTRfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFE0X1NIX0xJVFRMRQkJMAotI2RlZmluZQlUSVJfQklUU19UUTVfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFE1X1NIX0xJVFRMRQkJNAotCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTBfU0hfQklHCQk0Ci0jZGVmaW5lCVRJUl9CSVRTX1RRMV9CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTFfU0hfQklHCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTBfU0hfTElUVExFCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRMV9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTFfU0hfTElUVExFCQk0Ci0KLSNkZWZpbmUJVElSX0JJVFNfVFEyX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRMl9TSF9CSUcJCTQKLSNkZWZpbmUJVElSX0JJVFNfVFEzX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRM19TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFEyX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRMl9TSF9MSVRUTEUJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFEzX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRM19TSF9MSVRUTEUJCTQKLQotLyogUmVsYXRpdmUgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgcm5keF9leHQgewotCXVuc2lnbmVkIGNoYXIJcl9iaXRzWzRdOwotfTsKLQotI2RlZmluZQlSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0JJRwk0Ci0jZGVmaW5lCVJORFhfQklUUzFfUkZEX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVJORFhfQklUUzFfUkZEX1NIX0JJRwkJNAotCi0jZGVmaW5lCVJORFhfQklUUzBfUkZEX1NIX0xFRlRfTElUVExFCTAKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfU0hfTEVGVF9MSVRUTEUJOAotCi0jZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9TSF9MRUZUX0JJRwkxNgotI2RlZmluZQlSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUJUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRwkwCi0KLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX1NIX0xJVFRMRQk0Ci0jZGVmaW5lCVJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9MSVRUTEUJNAotI2RlZmluZQlSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFCTEyCi0KLS8qIEF1eGlsaWFyeSBzeW1ib2wgaW5mb3JtYXRpb24gZXh0ZXJuYWwgcmVjb3JkICovCi0KLXVuaW9uIGF1eF9leHQgewotCXN0cnVjdCB0aXJfZXh0CWFfdGk7Ci0Jc3RydWN0IHJuZHhfZXh0CWFfcm5keDsKLQl1bnNpZ25lZCBjaGFyCWFfZG5Mb3dbNF07Ci0JdW5zaWduZWQgY2hhcglhX2RuSGlnaFs0XTsKLQl1bnNpZ25lZCBjaGFyCWFfaXN5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCWFfaXNzWzRdOwotCXVuc2lnbmVkIGNoYXIJYV93aWR0aFs0XTsKLQl1bnNpZ25lZCBjaGFyCWFfY291bnRbNF07Ci19OwotCi0jZGVmaW5lIEFVWF9HRVRfQU5ZKGJpZ2VuZCwgYXgsIGZpZWxkKSBcCi0gICgoYmlnZW5kKSA/IGJmZF9nZXRiMzIgKChheCktPmZpZWxkKSA6IGJmZF9nZXRsMzIgKChheCktPmZpZWxkKSkKLQotI2RlZmluZQlBVVhfR0VUX0ROTE9XKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9kbkxvdykKLSNkZWZpbmUJQVVYX0dFVF9ETkhJR0goYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2RuSGlnaCkKLSNkZWZpbmUJQVVYX0dFVF9JU1lNKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9pc3ltKQotI2RlZmluZSBBVVhfR0VUX0lTUyhiaWdlbmQsIGF4KQkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2lzcykKLSNkZWZpbmUgQVVYX0dFVF9XSURUSChiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfd2lkdGgpCi0jZGVmaW5lIEFVWF9HRVRfQ09VTlQoYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2NvdW50KQotCi0jZGVmaW5lIEFVWF9QVVRfQU5ZKGJpZ2VuZCwgdmFsLCBheCwgZmllbGQpIFwKLSAgKChiaWdlbmQpIFwKLSAgID8gKGJmZF9wdXRiMzIgKChiZmRfdm1hKSAodmFsKSwgKGF4KS0+ZmllbGQpLCAwKSBcCi0gICA6IChiZmRfcHV0bDMyICgoYmZkX3ZtYSkgKHZhbCksIChheCktPmZpZWxkKSwgMCkpCi0KLSNkZWZpbmUgQVVYX1BVVF9ETkxPVyhiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9kbkxvdykKLSNkZWZpbmUgQVVYX1BVVF9ETkhJR0goYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfZG5IaWdoKQotI2RlZmluZSBBVVhfUFVUX0lTWU0oYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfaXN5bSkKLSNkZWZpbmUgQVVYX1BVVF9JU1MoYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfaXNzKQotI2RlZmluZSBBVVhfUFVUX1dJRFRIKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX3dpZHRoKQotI2RlZmluZSBBVVhfUFVUX0NPVU5UKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2NvdW50KQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEZvciBlZmZpY2llbmN5LCBnZGIgZGVhbHMgZGlyZWN0bHkgd2l0aCB0aGUgdW5zd2FwcGVkIHN5bWJvbGljCi0gICBpbmZvcm1hdGlvbiAodGhhdCB3YXkgaXQgb25seSB0YWtlcyB0aGUgdGltZSB0byBzd2FwIGluZm9ybWF0aW9uCi0gICB0aGF0IGl0IHJlYWxseSBuZWVkcyB0byByZWFkKS4gIGdkYiBvcmlnaW5hbGx5IHJldHJpZXZlZCB0aGUKLSAgIGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gdGhlIEJGRCBiYWNrZW5kIGluZm9ybWF0aW9uLCBidXQgdGhhdAotICAgc3RyYXRlZ3ksIGJlc2lkZXMgYmVpbmcgc29ydCBvZiB1Z2x5LCBkb2VzIG5vdCB3b3JrIGZvciBNSVBTIEVMRiwKLSAgIHdoaWNoIGFsc28gdXNlcyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHN0cnVjdHVyZSBob2xkcwotICAgcG9pbnRlcnMgdG8gdGhlIChtb3N0bHkpIHVuc3dhcHBlZCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvCi17Ci0gIC8qIFRoZSBzd2FwcGVkIEVDT0ZGIHN5bWJvbGljIGhlYWRlci4gICovCi0gIEhEUlIgc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFBvaW50ZXJzIHRvIHRoZSB1bnN3YXBwZWQgc3ltYm9saWMgaW5mb3JtYXRpb24uICBOb3RlIHRoYXQgdGhlCi0gICAgIHBvaW50ZXJzIHRvIGV4dGVybmFsIHN0cnVjdHVyZXMgcG9pbnQgdG8gZGlmZmVyZW50IHNvcnRzIG9mCi0gICAgIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBFQ09GRiB0YXJnZXRzLiAgVGhlIGVjb2ZmX2RlYnVnX3N3YXAKLSAgICAgc3RydWN0dXJlIHByb3ZpZGVzIHRoZSBzaXplcyBvZiB0aGUgc3RydWN0dXJlcyBhbmQgdGhlIGZ1bmN0aW9ucwotICAgICBuZWVkZWQgdG8gc3dhcCB0aGUgaW5mb3JtYXRpb24gaW4gYW5kIG91dC4gIFRoZXNlIHBvaW50ZXJzIGFyZQotICAgICBhbGwgcG9pbnRlcnMgdG8gYXJyYXlzLCBub3Qgc2luZ2xlIHN0cnVjdHVyZXMuICBUaGV5IHdpbGwgYmUgTlVMTAotICAgICBpZiB0aGVyZSBhcmUgbm8gaW5zdGFuY2VzIG9mIHRoZSByZWxldmFudCBzdHJ1Y3R1cmUuICBUaGVzZQotICAgICBmaWVsZHMgYXJlIGFsc28gdXNlZCBieSB0aGUgYXNzZW1ibGVyIHRvIG91dHB1dCBFQ09GRiBkZWJ1Z2dpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyICpsaW5lOwotICBQVFIgZXh0ZXJuYWxfZG5yOwkvKiBzdHJ1Y3QgZG5yX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfcGRyOwkvKiBzdHJ1Y3QgcGRyX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfc3ltOwkvKiBzdHJ1Y3Qgc3ltX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfb3B0OwkvKiBzdHJ1Y3Qgb3B0X2V4dCAqLwotICB1bmlvbiBhdXhfZXh0ICpleHRlcm5hbF9hdXg7Ci0gIGNoYXIgKnNzOwotICBjaGFyICpzc2V4dDsKLSAgUFRSIGV4dGVybmFsX2ZkcjsJLyogc3RydWN0IGZkcl9leHQgKi8KLSAgUFRSIGV4dGVybmFsX3JmZDsJLyogc3RydWN0IHJmZF9leHQgKi8KLSAgUFRSIGV4dGVybmFsX2V4dDsJLyogc3RydWN0IGV4dF9leHQgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhleSBtYXkgZGlzYXBwZWFyIGF0IHNvbWUKLSAgICAgcG9pbnQuICAqLwotICBjaGFyICpzc2V4dF9lbmQ7Ci0gIFBUUiBleHRlcm5hbF9leHRfZW5kOwotCi0gIC8qIFdoZW4gbGlua2luZywgdGhpcyBmaWVsZCBob2xkcyBhIG1hcHBpbmcgZnJvbSB0aGUgaW5wdXQgRkRSCi0gICAgIG51bWJlcnMgdG8gdGhlIG91dHB1dCBudW1iZXJzLCBhbmQgaXMgdXNlZCB3aGVuIHdyaXRpbmcgb3V0IHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzLiAgSXQgaXMgTlVMTCBpZiBubyBtYXBwaW5nIGlzIHJlcXVpcmVkLiAgKi8KLSAgUkZEVCAqaWZkbWFwOwotCi0gIC8qIFRoZSBzd2FwcGVkIEZEUiBpbmZvcm1hdGlvbi4gIEN1cnJlbnRseSB0aGlzIGlzIG5ldmVyIE5VTEwsIGJ1dAotICAgICBjb2RlIHVzaW5nIHRoaXMgc3RydWN0dXJlIHNob3VsZCBwcm9iYWJseSBkb3VibGUtY2hlY2sgaW4gY2FzZQotICAgICB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZS4gIFRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5LCBub3QgYQotICAgICBzaW5nbGUgc3RydWN0dXJlLiAgKi8KLSAgRkRSICpmZHI7Ci0KLSAgLyogV2hlbiByZWxheGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QKLSAgICAgc3ltYm9sIHZhbHVlcyB3aGVuIHRoZXkgYXJlIG91dHB1dC4gIFRoaXMgaXMgYSBsaW5rZWQgbGlzdCBvZgotICAgICBzdHJ1Y3R1cmVzIGluZGljYXRpbmcgaG93IHZhbHVlcyBzaG91bGQgYmUgYWRqdXN0ZWQuICBUaGVyZSBpcyBubwotICAgICByZXF1aXJlbWVudCB0aGF0IHRoZSBlbnRyaWVzIGJlIGluIGFueSBvcmRlciwgb3IgdGhhdCB0aGV5IG5vdAotICAgICBvdmVybGFwLiAgVGhpcyBmaWVsZCBpcyBub3JtYWxseSBOVUxMLCBpbiB3aGljaCBjYXNlIG5vCi0gICAgIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgbWFkZS4gICovCi0gIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBob3cgdG8gYWRqdXN0IHN5bWJvbCB2YWx1ZXMgd2hlbgotICAgb3V0cHV0dGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLiAgVGhlc2UgYWRqdXN0bWVudHMgb25seSBhcHBseSB0bwotICAgdGhlIGludGVybmFsIHN5bWJvbHMsIGFzIHRoZSBleHRlcm5hbCBzeW1ib2wgdmFsdWVzIHdpbGwgY29tZSBmcm9tCi0gICB0aGUgaGFzaCB0YWJsZSBhbmQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRqdXN0ZWQuICAqLwotCi1zdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0Ci17Ci0gIC8qIE5leHQgZW50cnkgb24gYWRqdXN0bWVudCBsaXN0LiAgKi8KLSAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqbmV4dDsKLSAgLyogU3RhcnRpbmcgVk1BIG9mIGFkanVzdG1lbnQuICBUaGlzIGlzIHRoZSBWTUEgaW4gdGhlIEVDT0ZGIGZpbGUsCi0gICAgIG5vdCB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgVGh1cyBpdCBzaG91bGQKLSAgICAgaW5kaWNhdGUgYSBwYXJ0aWN1bGFyIHNlY3Rpb24uICAqLwotICBiZmRfdm1hIHN0YXJ0OwotICAvKiBFbmRpbmcgVk1BIG9mIGFkanVzdG1lbnQuICAqLwotICBiZmRfdm1hIGVuZDsKLSAgLyogQWRqdXN0bWVudC4gIFRoaXMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCBvcgotICAgICBGRFIuICBUaGlzIGlzIHplcm8gZm9yIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheS4gICovCi0gIGxvbmcgYWRqdXN0OwotfTsKLQotLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgdXNlZCBieSB0aGUgRUNPRkYgZmluZF9uZWFyZXN0X2xpbmUgZnVuY3Rpb24uICAqLwotCi1zdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5Ci17Ci0gIC8qIEJhc2UgYWRkcmVzcyBpbiAudGV4dCBvZiB0aGlzIEZEUi4gICovCi0gIGJmZF92bWEgYmFzZV9hZGRyOwotICBGRFIgKmZkcjsKLX07Ci0KLXN0cnVjdCBlY29mZl9maW5kX2xpbmUKLXsKLSAgLyogQWxsb2NhdGVkIG1lbW9yeSB0byBob2xkIGZ1bmN0aW9uIGFuZCBmaWxlIG5hbWVzLiAgKi8KLSAgY2hhciAqZmluZF9idWZmZXI7Ci0KLSAgLyogRkRSIHRhYmxlLCBzb3J0ZWQgYnkgYWRkcmVzczogKi8KLSAgbG9uZyBmZHJ0YWJfbGVuOwotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICpmZHJ0YWI7Ci0KLSAgLyogQ2FjaGUgZW50cnkgZm9yIG1vc3QgcmVjZW50bHkgZm91bmQgbGluZSBpbmZvcm1hdGlvbi4gIFRoZSBzZWN0Ci0gICAgIGZpZWxkIGlzIE5VTEwgaWYgdGhpcyBjYWNoZSBkb2VzIG5vdCBjb250YWluIHZhbGlkIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0Ci0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Q7Ci0gICAgICBiZmRfdm1hIHN0YXJ0OwotICAgICAgYmZkX3ZtYSBzdG9wOwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgICBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGluZV9udW07Ci0gICAgfSBjYWNoZTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNXQVBQSU5HICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBnZW5lcmljIEVDT0ZGIGNvZGUgbmVlZHMgdG8gYmUgYWJsZSB0byBzd2FwIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24gaW4gYW5kIG91dCBpbiB0aGUgc3BlY2lmaWMgZm9ybWF0IHVzZWQgYnkgYSBwYXJ0aWN1bGFyCi0gICBFQ09GRiBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbgotICAgbmVlZGVkIHRvIGRvIHRoaXMuICAqLwotCi1zdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcAotewotICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgaW50IHN5bV9tYWdpYzsKLSAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICBiZmRfc2l6ZV90eXBlIGRlYnVnX2FsaWduOwotICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfaGRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZG5yX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfb3B0X3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmZkX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICB2b2lkICgqc3dhcF9oZHJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEhEUlIgKikpOwotICB2b2lkICgqc3dhcF9kbnJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEROUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3Bkcl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUERSICopKTsKLSAgdm9pZCAoKnN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKTsKLSAgdm9pZCAoKnN3YXBfb3B0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBPUFRSICopKTsKLSAgdm9pZCAoKnN3YXBfZmRyX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBGRFIgKikpOwotICB2b2lkICgqc3dhcF9yZmRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFJGRFQgKikpOwotICB2b2lkICgqc3dhcF9leHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpOwotICB2b2lkICgqc3dhcF90aXJfaW4pIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLSAgdm9pZCAoKnN3YXBfcm5keF9pbikgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKiwgUk5EWFIgKikpOwotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIHZvaWQgKCpzd2FwX2hkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBIRFJSICosIFBUUikpOwotICB2b2lkICgqc3dhcF9kbnJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRE5SICosIFBUUikpOwotICB2b2lkICgqc3dhcF9wZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUERSICosIFBUUikpOwotICB2b2lkICgqc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfb3B0X291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IE9QVFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX2Zkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3JmZF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSRkRUICosIFBUUikpOwotICB2b2lkICgqc3dhcF9leHRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRVhUUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfdGlyX291dCkgUEFSQU1TICgoaW50LCBjb25zdCBUSVIgKiwgc3RydWN0IHRpcl9leHQgKikpOwotICB2b2lkICgqc3dhcF9ybmR4X291dCkgUEFSQU1TICgoaW50LCBjb25zdCBSTkRYUiAqLCBzdHJ1Y3Qgcm5keF9leHQgKikpOwotICAvKiBGdW5jdGlvbiB0byByZWFkIHN5bWJvbCBkYXRhIGFuZCBzZXQgdXAgcG9pbnRlcnMgaW4KLSAgICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICBUaGUgc2VjdGlvbiBhcmd1bWVudCBpcyB1c2VkIGZvcgotICAgICBFTEYsIG5vdCBzdHJhaWdodCBFQ09GRi4gICovCi0gIGJvb2xlYW4gKCpyZWFkX2RlYnVnX2luZm8pIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLX07Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEVDT0ZGX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvZ28zMmV4ZS5oIGIvaW5jbHVkZS9jb2ZmL2dvMzJleGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMjZjMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvZ28zMmV4ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyogQ09GRiBpbmZvcm1hdGlvbiBmb3IgUEMgcnVubmluZyBnbzMyLiAgKi8KLQotI2RlZmluZSBTVFVCU0laRSAyMDQ4Ci0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyX2dvMzJfZXhlIHsKLQljaGFyIHN0dWJbU1RVQlNJWkVdOwkvKiB0aGUgc3R1YiB0byBsb2FkIHRoZSBpbWFnZQkqLwotCS8qIHRoZSBzdGFuZGFyZCBDT0ZGIGhlYWRlciAqLwotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSN1bmRlZiBGSUxIRFIKLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyX2dvMzJfZXhlCi0jdW5kZWYgRklMSFNaCi0jZGVmaW5lCUZJTEhTWglTVFVCU0laRSsyMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2g4MzAwLmggYi9pbmNsdWRlL2NvZmYvaDgzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2MjM5NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaDgzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEhpdGFjaGkgSDgvMzAwIGFuZCBIOC8zMDAtSCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUJSDgzMDBNQUdJQwkweDgzMDAKLSNkZWZpbmUJSDgzMDBITUFHSUMJMHg4MzAxCi0jZGVmaW5lCUg4MzAwU01BR0lDCTB4ODMwMgotCi0jZGVmaW5lIEg4MzAwQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPUg4MzAwTUFHSUMpKQotI2RlZmluZSBIODMwMEhCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBITUFHSUMpKQotI2RlZmluZSBIODMwMFNCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBTTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaDg1MDAuaCBiL2luY2x1ZGUvY29mZi9oODUwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzA1YmYyYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaDg1MDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEhpdGFjaGkgSDgvNTAwICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlIODUwME1BR0lDCTB4ODUwMAotCi0KLSNkZWZpbmUgSDg1MDBCQURNQUcoeCkgKCgweGZmZmYgJiYgKCh4KS5mX21hZ2ljKSE9SDg1MDBNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pMzg2LmggYi9pbmNsdWRlL2NvZmYvaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWJmNGEyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBJbnRlbCAzODYvNDg2LiAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotCi0KLQotI2RlZmluZQlJMzg2TUFHSUMJMHgxNGMKLSNkZWZpbmUgSTM4NlBUWE1BR0lDCTB4MTU0Ci0jZGVmaW5lIEkzODZBSVhNQUdJQwkweDE3NQotCi0vKiBUaGlzIGlzIEx5bngncyBhbGwtcGxhdGZvcm0gbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcy4gKi8KLQotI2RlZmluZSBMWU5YQ09GRk1BR0lDCTA0MTUKLQotI2RlZmluZSBJMzg2QkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gSTM4Nk1BR0lDKSBcCi0JCSAgICAgICAmJiAoeCkuZl9tYWdpYyAhPSBJMzg2QUlYTUFHSUMgXAotCQkgICAgICAgJiYgKHgpLmZfbWFnaWMgIT0gSTM4NlBUWE1BR0lDIFwKLQkJICAgICAgICYmICh4KS5mX21hZ2ljICE9IExZTlhDT0ZGTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0KLQotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotCi0vKiBkZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcyAqLwotLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAKLSNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCQljaGFyIHhfY2hlY2tzdW1bNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0JCWNoYXIgeF9hc3NvY2lhdGVkWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0JCWNoYXIgeF9jb21kYXRbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLSMJZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaTg2MC5oIGIvaW5jbHVkZS9jb2ZmL2k4NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2ODZlOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaTg2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSB3YXMgaGFja2VkIGZyb20gaTM4Ni5oICAgW2RvbGFuQHNzZC5pbnRlbC5jb21dICovCi0KLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSW50ZWwgODYwLiAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0KLQotCi0jZGVmaW5lCUk4NjBNQUdJQwkweDE0ZAotCi0jZGVmaW5lIEk4NjBCQURNQUcoeCkgICAoKHgpLmZfbWFnaWMgIT0gSTg2ME1BR0lDKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyogRklYTUU6IFdoYXQgYXJlIHRoZSBhLm91dCBtYWdpYyBudW1iZXJzPyAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaTk2MC5oIGIvaW5jbHVkZS9jb2ZmL2k5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzNTgzNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaTk2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgODA5NjAuICBPcmlnaW5zOiBJbnRlbCBjb3JwLCBuYXRjaC4gKi8KLQotLyogTk9URTogVGFnZW50cmllcyAoY2YgVEFHQklUUykgYXJlIG5vIGxvbmdlciB1c2VkIGJ5IHRoZSA5NjAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgKDA0MDcpCS8qIG9sZCBpbXB1cmUgZm9ybWF0LiBkYXRhIGltbWVkaWF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd3MgdGV4dC4gYm90aCBzZWN0aW9ucyBhcmUgcncuICovCi0jZGVmaW5lIE5NQUdJQyAgICAgICgwNDEwKQkvKiBzcGxpdCBpJmQsIHJlYWQtb25seSB0ZXh0ICovCi0KLS8qCi0qCUludGVsIDgwOTYwIChJOTYwKSBwcm9jZXNzb3IgZmxhZ3MuCi0qCUZfSTk2MFRZUEUgPT0gbWFzayBmb3IgcHJvY2Vzc29yIHR5cGUgZmllbGQuIAotKi8KLQotI2RlZmluZQlGX0k5NjBUWVBFCSgweGYwMDApCi0jZGVmaW5lCUZfSTk2MENPUkUJKDB4MTAwMCkKLSNkZWZpbmUJRl9JOTYwS0IJKDB4MjAwMCkKLSNkZWZpbmUJRl9JOTYwU0IJKDB4MjAwMCkKLSNkZWZpbmUJRl9JOTYwTUMJKDB4MzAwMCkKLSNkZWZpbmUJRl9JOTYwWEEJKDB4NDAwMCkKLSNkZWZpbmUJRl9JOTYwQ0EJKDB4NTAwMCkKLSNkZWZpbmUJRl9JOTYwS0EJKDB4NjAwMCkKLSNkZWZpbmUJRl9JOTYwU0EJKDB4NjAwMCkKLSNkZWZpbmUgRl9JOTYwSlgJKDB4NzAwMCkKLSNkZWZpbmUgRl9JOTYwSFgJKDB4ODAwMCkKLQotCi0vKiogaTgwOTYwIE1hZ2ljIE51bWJlcnMKLSovCi0KLSNkZWZpbmUgSTk2MFJPTUFHSUMJKDB4MTYwKQkvKiByZWFkLW9ubHkgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZSBJOTYwUldNQUdJQwkoMHgxNjEpCS8qIHJlYWQtd3JpdGUgdGV4dCBzZWdtZW50cyAqLwotCi0jZGVmaW5lIEk5NjBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9STk2MFJPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9STk2MFJXTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZwlwaHlzX2FkZHI7Ci0JdW5zaWduZWQgbG9uZwliaXRhcnJheTsKLX0gVEFHQklUUzsKLQotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhcgl0YWdlbnRyaWVzWzRdOwkJLyogbnVtYmVyIG9mIHRhZyBlbnRyaWVzIHRvIGZvbGxvdyAqLwotfQotQU9VVEhEUjsKLQotLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdGFnIGJpdHMgYXJyYXkgKi8KLQotI2RlZmluZSBUQUdQVFIoYW91dCkgKChUQUdCSVRTICopICgmKGFvdXQudGFnZW50cmllcykrMSkpCi0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0vKiNkZWZpbmUgQU9VVFNaKGFvdXQpIChzaXplb2YoQU9VVEhEUikrKGFvdXQudGFnZW50cmllcypzaXplb2YoVEFHQklUUykpKSovCi0jZGVmaW5lIEFPVVRTWiAzMgotI2RlZmluZSBBT1VUSERSU1ogMzIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLQljaGFyIAkJc19hbGlnbls0XTsJLyogc2VjdGlvbiBhbGlnbm1lbnQJCSovCi19OwotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQ0Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJCS8qIGxpbmUgbnVtYmVyCQkqLwotCWNoYXIgcGFkZGluZ1syXTsJLyogZm9yY2UgYWxpZ25tZW50CSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV9mbGFnc1syXTsKLSAgY2hhciBlX3R5cGVbNF07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci0gIGNoYXIgcGFkMlsyXTsKLX07Ci0KLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4MWYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNSkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogIEk5NjAtc3BlY2lmaWMgKjJuZCogYXV4LiBlbnRyeSBmb3JtYXRzCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlzdHJ1Y3QgewotCSAgLyogVGhpcyBpcyBhIHZlcnkgb2xkIHR5cG8gdGhhdCBrZWVwcyBnZXR0aW5nIHByb3BhZ2F0ZWQuICovCi0jZGVmaW5lIHhfc3RkaW5keCB4X3N0aW5keAotCQljaGFyIHhfc3RpbmR4WzRdOwkvKiBzeXMuIHRhYmxlIGVudHJ5ICovCi0JfSB4X3NjOwkvKiBzeXN0ZW0gY2FsbCBlbnRyeSAqLwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X2JhbG50cnlbNF07IC8qIEJBTCBlbnRyeSBwb2ludCAqLwotCX0geF9iYWw7IC8qIEJBTC1jYWxsYWJsZSBmdW5jdGlvbiAqLwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90aW1lc3RhbXBbNF07CSAgICAgICAgLyogdGltZSBzdGFtcCAqLwotCQljaGFyIAl4X2lkc3RyaW5nWzIwXTsJICAgICAgICAvKiBwcm9kdWNlciBpZGVudGl0eSBzdHJpbmcgKi8KLQl9IHhfaWRlbnQ7CSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2R1Y2VyIGlkZW50IGluZm8gKi8KLQotfTsKLQotCi0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTI0Ci0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTI0Ci0KLSMJZGVmaW5lIF9FVEVYVAkiX2V0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciBwYWRbMl07Ci19OwotCi0vKiByX3R5cGUgdmFsdWVzIGZvciB0aGUgaTk2MC4gICovCi0KLS8qIFRoZSBpOTYwIHVzZXMgUl9SRUxMT05HLCB3aGljaCBpcyBkZWZpbmVkIGluIGludGVybmFsLmggYXMgMHgxMS4KLSAgIEl0IGlzIGFuIGFic29sdXRlIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLQotI2RlZmluZSBSX0lQUk1FRCAJKDB4MTkpCS8qIDI0LWJpdCBpcC1yZWxhdGl2ZSByZWxvY2F0aW9uICovCi0jZGVmaW5lIFJfT1BUQ0FMTAkoMHgxYikJLyogMzItYml0IG9wdGltaXphYmxlIGNhbGwgKGxlYWZwcm9jL3N5c3Byb2MpICovCi0jZGVmaW5lIFJfT1BUQ0FMTFgJKDB4MWMpCS8qIDY0LWJpdCBvcHRpbWl6YWJsZSBjYWxsIChsZWFmcHJvYy9zeXNwcm9jKSAqLwotCi0vKiBUaGUgZm9sbG93aW5nIHJlbG9jYXRpb24gdHlwZXMgYXJlIGRlZmluZWQgdXNlIGJ5IHJlbGF4aW5nIGxpbmtlcnMsCi0gICB3aGljaCBjb252ZXJ0IDMyIGJpdCBjYWxscyAod2hpY2ggcmVxdWlyZSBhIDY0IGJpdCBpbnN0cnVjdGlvbikKLSAgIGludG8gMjQgYml0IGNhbGxzICh3aGljaCByZXF1aXJlIGEgMzIgYml0IGluc3RydWN0aW9uKSB3aGVuCi0gICBwb3NzaWJsZS4gIEl0IHdpbGwgYmUgcG9zc2libGUgd2hlbmV2ZXIgdGhlIHRhcmdldCBvZiB0aGUgY2FsbCBpcwotICAgd2l0aGluIGEgMjQgYml0IHJhbmdlIG9mIHRoZSBjYWxsIGluc3RydWN0aW9uLgotCi0gICBJdCBpcyBhbHdheXMgc2FmZSB0byBpZ25vcmUgdGhlc2UgcmVsb2NhdGlvbnMuICBUaGV5IG9ubHkgc2VydmUgdG8KLSAgIG1hcmsgcG9pbnRzIHdoaWNoIHRoZSByZWxheGluZyBsaW5rZXIgd2lsbCBoYXZlIHRvIGNvbnNpZGVyLiAgVGhlCi0gICBhc3NlbWJsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBjb2RlIGlzIGdlbmVyYXRlZCBldmVuIGlmCi0gICB0aGUgcmVsb2NhdGlvbnMgYXJlIGlnbm9yZWQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIG1lYW5zIHRoYXQgdGhlCi0gICBSX0lQUjEzIHJlbG9jYXRpb24gbWF5IG5vdCBhcHBlYXIgd2l0aCBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCi0jZGVmaW5lIFJfSVBSMTMJCSgweDFkKQkvKiAxMyBiaXQgaXAtcmVsYXRpdmUgYnJhbmNoICovCi0jZGVmaW5lIFJfQUxJR04JCSgweDFlKSAgLyogYWxpZ25tZW50IG1hcmtlci4gIFRoaXMgaGFzIG5vCi0JCQkJICAgYXNzb2NpYXRlZCBzeW1ib2wuICBJbnN0ZWFkLCB0aGUKLQkJCQkgICByX3N5bW5keCBmaWVsZCBpbmRpY2F0ZXMgdGhlCi0JCQkJICAgcmVxdWlyZSBhbGlnbm1lbnQgYXQgdGhpcyBwb2ludCBpbgotCQkJCSAgIHRoZSBmaWxlLiAgSXQgbXVzdCBiZSBhIHBvd2VyIG9mIDIuICAqLwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaW50ZXJuYWwuaCBiL2luY2x1ZGUvY29mZi9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODliNTI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzI4ICswLDAgQEAKLS8qIEludGVybmFsIGZvcm1hdCBvZiBDT0ZGIG9iamVjdCBmaWxlIGRhdGEgc3RydWN0dXJlcywgZm9yIEdOVSBCRkQuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuICAqLwotCi0jaWZuZGVmIEdOVV9DT0ZGX0lOVEVSTkFMX0gKLSNkZWZpbmUgR05VX0NPRkZfSU5URVJOQUxfSCAxCi0KLS8qIEZpcnN0LCBtYWtlICJzaWduZWQgY2hhciIgd29yaywgZXZlbiBvbiBvbGQgY29tcGlsZXJzLiAqLwotI2lmbmRlZiBzaWduZWQKLSNpZm5kZWYgX19TVERDX18KLSNkZWZpbmUJc2lnbmVkCQkJLyoqLwotI2VuZGlmCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZXh0cmEgc3R1ZmYgaW4gYSBQRSBoZWFkZXIuICovCi0KLXN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyCi17Ci0gIC8qIERPUyBoZWFkZXIgZGF0YSBmb2xsb3dzIGZvciBQRSBzdHVmZiAqLwotICB1bnNpZ25lZCBzaG9ydCBlX21hZ2ljOwkvKiBNYWdpYyBudW1iZXIsIDB4NWE0ZCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NibHA7CS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlLCAweDkwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3A7CQkvKiBQYWdlcyBpbiBmaWxlLCAweDMgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jcmxjOwkvKiBSZWxvY2F0aW9ucywgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3BhcmhkcjsJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocywgMHg0ICovCi0gIHVuc2lnbmVkIHNob3J0IGVfbWluYWxsb2M7CS8qIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX21heGFsbG9jOwkvKiBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweEZGRkYgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9zczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfc3A7CQkvKiBJbml0aWFsIFNQIHZhbHVlLCAweGI4ICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3N1bTsJLyogQ2hlY2tzdW0sIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2lwOwkJLyogSW5pdGlhbCBJUCB2YWx1ZSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3M7CQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2xmYXJsYzsJLyogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUsIDB4NDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9vdm5vOwkvKiBPdmVybGF5IG51bWJlciwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfcmVzWzRdOwkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX29lbWlkOwkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbyksIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX29lbWluZm87CS8qIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYywgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfcmVzMlsxMF07CS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIGJmZF92bWEgIGVfbGZhbmV3OwkJLyogRmlsZSBhZGRyZXNzIG9mIG5ldyBleGUgaGVhZGVyLCAweDgwICovCi0gIHVuc2lnbmVkIGxvbmcgZG9zX21lc3NhZ2VbMTZdOyAvKiB0ZXh0IHdoaWNoIGFsd2F5cyBmb2xsb3dzIGRvcyBoZWFkZXIgKi8KLSAgYmZkX3ZtYSAgbnRfc2lnbmF0dXJlOyAgIAkvKiByZXF1aXJlZCBOVCBzaWduYXR1cmUsIDB4NDU1MCAqLyAKLX07Ci0KLXN0cnVjdCBpbnRlcm5hbF9maWxlaGRyCi17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyIHBlOwotCi0gIC8qIHN0YW5kYXJkIGNvZmYgIGludGVybmFsIGluZm8gKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBsb25nIGZfdGltZGF0OwkJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGJmZF92bWEgZl9zeW1wdHI7CQkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGxvbmcgZl9uc3ltczsJCQkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9vcHRoZHI7CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwkvKiBmbGFncwkJCSovCi0gIHVuc2lnbmVkIHNob3J0IGZfdGFyZ2V0X2lkOwkvKiAoVEljODAgc3BlY2lmaWMpCQkqLwotfTsKLQotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIxNldSCWZpbGUgaXMgMTYtYml0IGxpdHRsZS1lbmRpYW4KLSAqCUZfQVIzMldSCWZpbGUgaXMgMzItYml0IGxpdHRsZS1lbmRpYW4KLSAqCUZfQVIzMlcJCWZpbGUgaXMgMzItYml0IGJpZy1lbmRpYW4KLSAqCUZfRFlOTE9BRAlycy82MDAwIGFpeDogZHluYW1pY2FsbHkgbG9hZGFibGUgdy9pbXBvcnRzICYgZXhwb3J0cwotICoJRl9TSFJPQkoJcnMvNjAwMCBhaXg6IGZpbGUgaXMgYSBzaGFyZWQgb2JqZWN0Ci0gKiAgICAgIEZfRExMICAgICAgICAgICBQRSBmb3JtYXQgRExMCi0gKi8KLQotI2RlZmluZQlGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZQlGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lCUZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUJRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUJRl9BUjE2V1IJKDB4MDA4MCkKLSNkZWZpbmUJRl9BUjMyV1IJKDB4MDEwMCkKLSNkZWZpbmUJRl9BUjMyVyAgICAgCSgweDAyMDApCi0jZGVmaW5lCUZfRFlOTE9BRAkoMHgxMDAwKQotI2RlZmluZQlGX1NIUk9CSgkoMHgyMDAwKQotI2RlZmluZSBGX0RMTCAgICAgICAgICAgKDB4MjAwMCkKLQotLyogZXh0cmEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIG9wdGlvbmFsIGhlYWRlciAqLwotdHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0RBVEFfRElSRUNUT1JZIAotewotICBiZmRfdm1hIFZpcnR1YWxBZGRyZXNzOwotICBsb25nICAgIFNpemU7Ci19ICBJTUFHRV9EQVRBX0RJUkVDVE9SWTsKLSNkZWZpbmUgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVMgIDE2Ci0KLS8qIERlZmF1bHQgaW1hZ2UgYmFzZSBmb3IgTlQuICAqLwotI2RlZmluZSBOVF9FWEVfSU1BR0VfQkFTRSAweDQwMDAwMAotI2RlZmluZSBOVF9ETExfSU1BR0VfQkFTRSAweDEwMDAwMDAwCi0KLS8qIERlZmF1bHQgaW1hZ2UgYmFzZSBmb3IgQmVPUy4gKi8KLSNkZWZpbmUgQkVPU19FWEVfSU1BR0VfQkFTRSAweDgwMDAwMDAwCi0jZGVmaW5lIEJFT1NfRExMX0lNQUdFX0JBU0UgMHgxMDAwMDAwMAotCi0vKiBFeHRyYSBzdHVmZiBpbiBhIFBFIGFvdXRoZHIgKi8KLQotI2RlZmluZSBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIFBFX0RFRl9GSUxFX0FMSUdOTUVOVCAweDIwMAotCi1zdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAKLXsKLSAgLyogUEUgc3R1ZmYgICovCi0gIGJmZF92bWEgSW1hZ2VCYXNlOwkJLyogYWRkcmVzcyBvZiBzcGVjaWZpYyBsb2NhdGlvbiBpbiBtZW1vcnkgdGhhdAotCQkJCSAgIGZpbGUgaXMgbG9jYXRlZCwgTlQgZGVmYXVsdCAweDEwMDAwICovCi0KLSAgYmZkX3ZtYSBTZWN0aW9uQWxpZ25tZW50OwkvKiBzZWN0aW9uIGFsaWdubWVudCBkZWZhdWx0IDB4MTAwMCAqLwotICBiZmRfdm1hIEZpbGVBbGlnbm1lbnQ7CS8qIGZpbGUgYWxpZ25tZW50IGRlZmF1bHQgMHgyMDAgKi8KLSAgc2hvcnQgICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8qIG1pbmltdW0gdmVyc2lvbiBvZiB0aGUgb3BlcmF0aW5nICovCi0gIHNob3J0ICAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOyAvKiBzeXN0ZW0gcmVxJ2QgZm9yIGV4ZSwgZGVmYXVsdCB0byAxKi8KLSAgc2hvcnQgICBNYWpvckltYWdlVmVyc2lvbjsJLyogdXNlciBkZWZpbmVhYmxlIGZpZWxkIHRvIHN0b3JlIHZlcnNpb24gb2YgKi8KLSAgc2hvcnQgICBNaW5vckltYWdlVmVyc2lvbjsJLyogZXhlIG9yIGRsbCBiZWluZyBjcmVhdGVkLCBkZWZhdWx0IHRvIDAgKi8gCi0gIHNob3J0ICAgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOyAvKiBtaW5pbXVtIHN1YnN5c3RlbSB2ZXJzaW9uIHJlcXVpcmVkIHRvICovCi0gIHNob3J0ICAgTWlub3JTdWJzeXN0ZW1WZXJzaW9uOyAvKiBydW4gZXhlOyBkZWZhdWx0IHRvIDMuMSAqLwotICBsb25nICAgIFJlc2VydmVkMTsJCS8qIHNlZW1zIHRvIGJlIDAgKi8KLSAgbG9uZyAgICBTaXplT2ZJbWFnZTsJCS8qIHNpemUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIGZvciBwcm9nICovCi0gIGxvbmcgICAgU2l6ZU9mSGVhZGVyczsJLyogc2l6ZSBvZiBQRSBoZWFkZXIgYW5kIHNlY3Rpb24gdGFibGUgKi8KLSAgbG9uZyAgICBDaGVja1N1bTsJCS8qIHNldCB0byAwICovCi0gIHNob3J0ICAgU3Vic3lzdGVtOwkKLQotICAvKiB0eXBlIG9mIHN1YnN5c3RlbSBleGUgdXNlcyBmb3IgdXNlciBpbnRlcmZhY2UsCi0gICAgIHBvc3NpYmxlIHZhbHVlczoKLSAgICAgMSAtIE5BVElWRSAgIERvZXNuJ3QgcmVxdWlyZSBhIHN1YnN5c3RlbQotICAgICAyIC0gV0lORE9XU19HVUkgcnVucyBpbiBXaW5kb3dzIEdVSSBzdWJzeXN0ZW0KLSAgICAgMyAtIFdJTkRPV1NfQ1VJIHJ1bnMgaW4gV2luZG93cyBjaGFyIHN1Yi4gKGNvbnNvbGUgYXBwKQotICAgICA1IC0gT1MyX0NVSSBydW5zIGluIE9TLzIgY2hhcmFjdGVyIHN1YnN5c3RlbQotICAgICA3IC0gUE9TSVhfQ1VJIHJ1bnMgaW4gUG9zaXggY2hhcmFjdGVyIHN1YnN5c3RlbSAqLwotICBzaG9ydCAgIERsbENoYXJhY3RlcmlzdGljczsJLyogZmxhZ3MgZm9yIERMTCBpbml0LCB1c2UgMCAqLwotICBiZmRfdm1hIFNpemVPZlN0YWNrUmVzZXJ2ZTsJLyogYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlICAqLwotICBiZmRfdm1hIFNpemVPZlN0YWNrQ29tbWl0OwkvKiBhbW91bnQgb2YgbWVtb3J5IGluaXRpYWxseSBjb21taXR0ZWQgZm9yIAotCQkJCSAgIGluaXRpYWwgdGhyZWFkJ3Mgc3RhY2ssIGRlZmF1bHQgaXMgMHgxMDAwICovCi0gIGJmZF92bWEgU2l6ZU9mSGVhcFJlc2VydmU7CS8qIGFtb3VudCBvZiB2aXJ0dWFsIG1lbW9yeSB0byByZXNlcnZlIGFuZCAqLwotICBiZmRfdm1hIFNpemVPZkhlYXBDb21taXQ7CS8qIGNvbW1pdCwgZG9uJ3Qga25vdyB3aGF0IHRvIGRlZmF1dCBpdCB0byAqLwotICBsb25nICAgIExvYWRlckZsYWdzOwkJLyogY2FuIHByb2JhYmx5IHNldCB0byAwICovCi0gIGxvbmcgICAgTnVtYmVyT2ZSdmFBbmRTaXplczsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gbmV4dCBlbnRyeSwgMTYgKi8KLSAgSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcgotewotICBzaG9ydCBtYWdpYzsJCQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgc2hvcnQgdnN0YW1wOwkJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBiZmRfdm1hIHRzaXplOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGJmZF92bWEgZHNpemU7CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGJmZF92bWEgYnNpemU7CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGJmZF92bWEgZW50cnk7CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgYmZkX3ZtYSB0ZXh0X3N0YXJ0OwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBiZmRfdm1hIGRhdGFfc3RhcnQ7CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0KLSAgLyogaTk2MCBzdHVmZiAqLwotICB1bnNpZ25lZCBsb25nIHRhZ2VudHJpZXM7CS8qIG51bWJlciBvZiB0YWcgZW50cmllcyB0byBmb2xsb3cgKi8KLQotICAvKiBSUy82MDAwIHN0dWZmICovCi0gIHVuc2lnbmVkIGxvbmcgb190b2M7CQkvKiBhZGRyZXNzIG9mIFRPQwkJCSovCi0gIHNob3J0IG9fc25lbnRyeTsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBlbnRyeSBwb2ludCAqLwotICBzaG9ydCBvX3NudGV4dDsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciB0ZXh0CSovCi0gIHNob3J0IG9fc25kYXRhOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGRhdGEJKi8KLSAgc2hvcnQgb19zbnRvYzsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciB0b2MJKi8KLSAgc2hvcnQgb19zbmxvYWRlcjsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBsb2FkZXIgc2VjdGlvbiAqLwotICBzaG9ydCBvX3NuYnNzOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGJzcwkqLwotICBzaG9ydCBvX2FsZ250ZXh0OwkJLyogbWF4IGFsaWdubWVudCBmb3IgdGV4dAkqLwotICBzaG9ydCBvX2FsZ25kYXRhOwkJLyogbWF4IGFsaWdubWVudCBmb3IgZGF0YQkqLwotICBzaG9ydCBvX21vZHR5cGU7CQkvKiBNb2R1bGUgdHlwZSBmaWVsZCwgMVIsUkUsUk8JKi8KLSAgc2hvcnQgb19jcHV0eXBlOwkJLyogRW5jb2RlZCBDUFUgdHlwZQkJKi8KLSAgdW5zaWduZWQgbG9uZyBvX21heHN0YWNrOwkvKiBtYXggc3RhY2sgc2l6ZSBhbGxvd2VkLgkqLwotICB1bnNpZ25lZCBsb25nIG9fbWF4ZGF0YTsJLyogbWF4IGRhdGEgc2l6ZSBhbGxvd2VkLgkqLwotCi0gIC8qIEVDT0ZGIHN0dWZmICovCi0gIGJmZF92bWEgYnNzX3N0YXJ0OwkJLyogQmFzZSBvZiBic3Mgc2VjdGlvbi4JCSovCi0gIGJmZF92bWEgZ3BfdmFsdWU7CQkvKiBHUCByZWdpc3RlciB2YWx1ZS4JCSovCi0gIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsJLyogR2VuZXJhbCByZWdpc3RlcnMgdXNlZC4JKi8KLSAgdW5zaWduZWQgbG9uZyBjcHJtYXNrWzRdOwkvKiBDb3Byb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4JKi8KLSAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOwkvKiBGbG9hdGluZyBwb2ludGVyIHJlZ2lzdGVycyB1c2VkLiAgKi8KLQotICAvKiBBcG9sbG8gc3R1ZmYgKi8KLSAgbG9uZyBvX2lubGliOwkJCS8qIGlubGliIGRhdGEgKi8KLSAgbG9uZyBvX3NyaTsJCQkvKiBTdGF0aWMgUmVzb3VyY2UgSW5mb3JtYXRpb24gKi8KLSAgbG9uZyB2aWRbMl07CQkJLyogVmVyc2lvbiBpZCAqLwotCi0KLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGU7Ci0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNUT1JBR0UgQ0xBU1NFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIHVzZWQgdG8gYmUgZGVmaW5lZCBhcyAtMSwgYnV0IG5vdyBuX3NjbGFzcyBpcyB1bnNpZ25lZC4gICovCi0jZGVmaW5lIENfRUZDTgkJMHhmZgkvKiBwaHlzaWNhbCBlbmQgb2YgZnVuY3Rpb24JKi8KLSNkZWZpbmUgQ19OVUxMCQkwCi0jZGVmaW5lIENfQVVUTwkJMQkvKiBhdXRvbWF0aWMgdmFyaWFibGUJCSovCi0jZGVmaW5lIENfRVhUCQkyCS8qIGV4dGVybmFsIHN5bWJvbAkJKi8KLSNkZWZpbmUgQ19TVEFUCQkzCS8qIHN0YXRpYwkJCSovCi0jZGVmaW5lIENfUkVHCQk0CS8qIHJlZ2lzdGVyIHZhcmlhYmxlCQkqLwotI2RlZmluZSBDX0VYVERFRgk1CS8qIGV4dGVybmFsIGRlZmluaXRpb24JCSovCi0jZGVmaW5lIENfTEFCRUwJCTYJLyogbGFiZWwJCQkqLwotI2RlZmluZSBDX1VMQUJFTAk3CS8qIHVuZGVmaW5lZCBsYWJlbAkJKi8KLSNkZWZpbmUgQ19NT1MJCTgJLyogbWVtYmVyIG9mIHN0cnVjdHVyZQkJKi8KLSNkZWZpbmUgQ19BUkcJCTkJLyogZnVuY3Rpb24gYXJndW1lbnQJCSovCi0jZGVmaW5lIENfU1RSVEFHCTEwCS8qIHN0cnVjdHVyZSB0YWcJCSovCi0jZGVmaW5lIENfTU9VCQkxMQkvKiBtZW1iZXIgb2YgdW5pb24JCSovCi0jZGVmaW5lIENfVU5UQUcJCTEyCS8qIHVuaW9uIHRhZwkJCSovCi0jZGVmaW5lIENfVFBERUYJCTEzCS8qIHR5cGUgZGVmaW5pdGlvbgkJKi8KLSNkZWZpbmUgQ19VU1RBVElDCTE0CS8qIHVuZGVmaW5lZCBzdGF0aWMJCSovCi0jZGVmaW5lIENfRU5UQUcJCTE1CS8qIGVudW1lcmF0aW9uIHRhZwkJKi8KLSNkZWZpbmUgQ19NT0UJCTE2CS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbgkqLwotI2RlZmluZSBDX1JFR1BBUk0JMTcJLyogcmVnaXN0ZXIgcGFyYW1ldGVyCQkqLwotI2RlZmluZSBDX0ZJRUxECQkxOAkvKiBiaXQgZmllbGQJCQkqLwotI2RlZmluZSBDX0FVVE9BUkcJMTkJLyogYXV0byBhcmd1bWVudAkJKi8KLSNkZWZpbmUgQ19MQVNURU5UCTIwCS8qIGR1bW15IGVudHJ5IChlbmQgb2YgYmxvY2spCSovCi0jZGVmaW5lIENfQkxPQ0sJCTEwMAkvKiAiLmJiIiBvciAiLmViIgkJKi8KLSNkZWZpbmUgQ19GQ04JCTEwMQkvKiAiLmJmIiBvciAiLmVmIgkJKi8KLSNkZWZpbmUgQ19FT1MJCTEwMgkvKiBlbmQgb2Ygc3RydWN0dXJlCQkqLwotI2RlZmluZSBDX0ZJTEUJCTEwMwkvKiBmaWxlIG5hbWUJCQkqLwotI2RlZmluZSBDX0xJTkUJCTEwNAkvKiBsaW5lICMgcmVmb3JtYXR0ZWQgYXMgc3ltYm9sIHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lIENfQUxJQVMJIAkxMDUJLyogZHVwbGljYXRlIHRhZwkJKi8KLSNkZWZpbmUgQ19ISURERU4JMTA2CS8qIGV4dCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYiAqLwotCi0jZGVmaW5lIENfV0VBS0VYVAkxMjcJLyogd2VhayBzeW1ib2wgLS0gR05VIGV4dGVuc2lvbiAqLwotCi0vKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MCAqLwotI2RlZmluZSBDX1VFWFQJCTE5CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCi0jZGVmaW5lIENfU1RBVExBQgkyMAkvKiBTdGF0aWMgbG9hZCB0aW1lIGxhYmVsICovCi0jZGVmaW5lIENfRVhUTEFCCTIxCS8qIEV4dGVybmFsIGxvYWQgdGltZSBsYWJlbCAqLwotI2RlZmluZSBDX1NZU1RFTQkyMwkvKiBTeXN0ZW0gV2lkZSB2YXJpYWJsZSAqLwotCi0vKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBXSU5ET1dTX05UICAgKi8KLSNkZWZpbmUgQ19TRUNUSU9OICAgICAgIDEwNCAgICAgLyogc2VjdGlvbiBuYW1lICovCi0jZGVmaW5lIENfTlRfV0VBSwkxMDUJLyogd2VhayBleHRlcm5hbCAqLwotCi0gLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgODA5NjAgKi8KLQotLyogQ19MRUFGUFJPQyBpcyBvYnNvbGV0ZS4gIFVzZSBDX0xFQUZFWFQgb3IgQ19MRUFGU1RBVCAqLwotI2RlZmluZSBDX0xFQUZQUk9DCTEwOAkvKiBMZWFmIHByb2NlZHVyZSwgImNhbGwiIHZpYSBCQUwgKi8KLQotI2RlZmluZSBDX1NDQUxMCQkxMDcJLyogUHJvY2VkdXJlIHJlYWNoYWJsZSB2aWEgc3lzdGVtIGNhbGwgKi8KLSNkZWZpbmUgQ19MRUFGRVhUICAgICAgIDEwOAkvKiBFeHRlcm5hbCBsZWFmICovCi0jZGVmaW5lIENfTEVBRlNUQVQgICAgICAxMTMJLyogU3RhdGljIGxlYWYgKi8KLSNkZWZpbmUgQ19PUFRWQVIJMTA5CS8qIE9wdGltaXplZCB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ19ERUZJTkUJMTEwCS8qIFByZXByb2Nlc3NvciAjZGVmaW5lCQkqLwotI2RlZmluZSBDX1BSQUdNQQkxMTEJLyogQWR2aWNlIHRvIGNvbXBpbGVyIG9yIGxpbmtlcgkqLwotI2RlZmluZSBDX1NFR01FTlQJMTEyCS8qIDgwOTYwIHNlZ21lbnQgbmFtZQkJKi8KLQotICAvKiBTdG9yYWdlIGNsYXNzZXMgZm9yIG04OGsgKi8KLSNkZWZpbmUgQ19TSEFET1cgICAgICAgIDEwNyAgICAgLyogc2hhZG93IHN5bWJvbCAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDX1ZFUlNJT04gICAgICAgMTA4ICAgICAvKiBjb2ZmIHZlcnNpb24gc3ltYm9sICAgICAgICAgICovCi0KLSAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBSUy82MDAwICovCi0jZGVmaW5lIENfSElERVhUICAgICAgICAxMDcJLyogVW4tbmFtZWQgZXh0ZXJuYWwgc3ltYm9sICovCi0jZGVmaW5lIENfQklOQ0wgICAgICAgICAxMDgJLyogTWFya3MgYmVnaW5uaW5nIG9mIGluY2x1ZGUgZmlsZSAqLwotI2RlZmluZSBDX0VJTkNMICAgICAgICAgMTA5CS8qIE1hcmtzIGVuZGluZyBvZiBpbmNsdWRlIGZpbGUgKi8KLQotIC8qIHN0b3JhZ2UgY2xhc3NlcyBmb3Igc3RhYiBzeW1ib2xzIGZvciBSUy82MDAwICovCi0jZGVmaW5lIENfR1NZTSAgICAgICAgICAoMHg4MCkKLSNkZWZpbmUgQ19MU1lNICAgICAgICAgICgweDgxKQotI2RlZmluZSBDX1BTWU0gICAgICAgICAgKDB4ODIpCi0jZGVmaW5lIENfUlNZTSAgICAgICAgICAoMHg4MykKLSNkZWZpbmUgQ19SUFNZTSAgICAgICAgICgweDg0KQotI2RlZmluZSBDX1NUU1lNICAgICAgICAgKDB4ODUpCi0jZGVmaW5lIENfVENTWU0gICAgICAgICAoMHg4NikKLSNkZWZpbmUgQ19CQ09NTSAgICAgICAgICgweDg3KQotI2RlZmluZSBDX0VDT01MICAgICAgICAgKDB4ODgpCi0jZGVmaW5lIENfRUNPTU0gICAgICAgICAoMHg4OSkKLSNkZWZpbmUgQ19ERUNMICAgICAgICAgICgweDhjKQotI2RlZmluZSBDX0VOVFJZICAgICAgICAgKDB4OGQpCi0jZGVmaW5lIENfRlVOICAgICAgICAgICAoMHg4ZSkKLSNkZWZpbmUgQ19CU1RBVCAgICAgICAgICgweDhmKQotI2RlZmluZSBDX0VTVEFUICAgICAgICAgKDB4OTApCi0KLS8qIFN0b3JhZ2UgY2xhc3NlcyBmb3IgVGh1bWIgc3ltYm9scyAqLwotI2RlZmluZSBDX1RIVU1CRVhUICAgICAgKDEyOCArIENfRVhUKQkJLyogMTMwICovCi0jZGVmaW5lIENfVEhVTUJTVEFUICAgICAoMTI4ICsgQ19TVEFUKQkJLyogMTMxICovCi0jZGVmaW5lIENfVEhVTUJMQUJFTCAgICAoMTI4ICsgQ19MQUJFTCkJCS8qIDEzNCAqLwotI2RlZmluZSBDX1RIVU1CRVhURlVOQyAgKENfVEhVTUJFWFQgICsgMjApCS8qIDE1MCAqLwotI2RlZmluZSBDX1RIVU1CU1RBVEZVTkMgKENfVEhVTUJTVEFUICsgMjApCS8qIDE1MSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNDTk5NTEVOICg4KQotCi1zdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIgc19uYW1lW1NDTk5NTEVOXTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQotICAvKiBQaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYi4KLSAgICAgSW4gdGhlIHBlaSBmb3JtYXQsIHRoaXMgZmllbGQgaXMgdGhlIHZpcnR1YWwgc2VjdGlvbiBzaXplCi0gICAgICh0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBhZnRlciBiZWluZyBsb2FkZWQgaW50IG1lbW9yeSksCi0gICAgIE5PVCB0aGUgcGh5c2ljYWwgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgc19wYWRkcjsKLQotICBiZmRfdm1hIHNfdmFkZHI7CQkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIGJmZF92bWEgc19zaXplOwkJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgYmZkX3ZtYSBzX3NjbnB0cjsJCS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGJmZF92bWEgc19yZWxwdHI7CQkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIGJmZF92bWEgc19sbm5vcHRyOwkJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIHVuc2lnbmVkIGxvbmcgc19ucmVsb2M7CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgbG9uZyBzX25sbm5vOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGxvbmcgc19mbGFnczsJCQkvKiBmbGFncwkJCSovCi0gIGxvbmcgc19hbGlnbjsJCQkvKiB1c2VkIG9uIEk5NjAJCQkqLwotfTsKLQotLyoKLSAqIHNfZmxhZ3MgInR5cGUiCi0gKi8KLSNkZWZpbmUgU1RZUF9SRUcJICgweDAwMDApCS8qICJyZWd1bGFyIjogYWxsb2NhdGVkLCByZWxvY2F0ZWQsIGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0RTRUNUCSAoMHgwMDAxKQkvKiAiZHVtbXkiOiAgcmVsb2NhdGVkIG9ubHkqLwotI2RlZmluZSBTVFlQX05PTE9BRAkgKDB4MDAwMikJLyogIm5vbG9hZCI6IGFsbG9jYXRlZCwgcmVsb2NhdGVkLCBub3QgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfR1JPVVAJICgweDAwMDQpCS8qICJncm91cGVkIjogZm9ybWVkIG9mIGlucHV0IHNlY3Rpb25zICovCi0jZGVmaW5lIFNUWVBfUEFECSAoMHgwMDA4KQkvKiAicGFkZGluZyI6IG5vdCBhbGxvY2F0ZWQsIG5vdCByZWxvY2F0ZWQsIGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0NPUFkJICgweDAwMTApCS8qICJjb3B5IjogZm9yIGRlY2lzaW9uIGZ1bmN0aW9uIHVzZWQgYnkgZmllbGQgdXBkYXRlOyAgbm90IGFsbG9jYXRlZCwgbm90IHJlbG9jYXRlZCwKLQkJCQkJCQkJCSAgICAgbG9hZGVkOyByZWxvYyAmIGxpbmVubyBlbnRyaWVzIHByb2Nlc3NlZCBub3JtYWxseSAqLwotI2RlZmluZSBTVFlQX1RFWFQJICgweDAwMjApCS8qIHNlY3Rpb24gY29udGFpbnMgdGV4dCBvbmx5ICovCi0jZGVmaW5lIFNfU0hSU0VHCSAoMHgwMDIwKQkvKiBJbiAzYiBVcGRhdGUgZmlsZXMgKG91dHB1dCBvZiBvZ2VuKSwgc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIFNIQVJFRCBzZWdtZW50cyBvZiB0aGUgUGZpbGUKLQkJCQkJCQkJCSAgICAgd2lsbCBoYXZlIHRoZSBTX1NIUlNFRyBmbGFnIHNldCBieSBvZ2VuLCB0byBpbmZvcm0gZHVmciB0aGF0IHVwZGF0aW5nIDEgY29weSBvZiB0aGUgcHJvYy4gd2lsbAotCQkJCQkJCQkJICAgICB1cGRhdGUgYWxsIHByb2Nlc3MgaW52b2NhdGlvbnMuICovCi0jZGVmaW5lIFNUWVBfREFUQQkgKDB4MDA0MCkJLyogc2VjdGlvbiBjb250YWlucyBkYXRhIG9ubHkgKi8KLSNkZWZpbmUgU1RZUF9CU1MJICgweDAwODApCS8qIHNlY3Rpb24gY29udGFpbnMgYnNzIG9ubHkgKi8KLSNkZWZpbmUgU19ORVdGQ04JICgweDAxMDApCS8qIEluIGEgbWluaW1hbCBmaWxlIG9yIGFuIHVwZGF0ZSBmaWxlLCBhIG5ldyBmdW5jdGlvbiAoYXMgY29tcGFyZWQgd2l0aCBhIHJlcGxhY2VkIGZ1bmN0aW9uKSAqLwotI2RlZmluZSBTVFlQX0lORk8JICgweDAyMDApCS8qIGNvbW1lbnQ6IG5vdCBhbGxvY2F0ZWQgbm90IHJlbG9jYXRlZCwgbm90IGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX09WRVIJICgweDA0MDApCS8qIG92ZXJsYXk6IHJlbG9jYXRlZCBub3QgYWxsb2NhdGVkIG9yIGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0xJQgkgKDB4MDgwMCkJLyogZm9yIC5saWI6IHNhbWUgYXMgSU5GTyAqLwotI2RlZmluZSBTVFlQX01FUkdFCSAoMHgyMDAwKQkvKiBtZXJnZSBzZWN0aW9uIC0tIGNvbWJpbmVzIHdpdGggdGV4dCwgZGF0YSBvciBic3Mgc2VjdGlvbnMgb25seSAqLwotI2RlZmluZSBTVFlQX1JFVkVSU0VfUEFEICgweDQwMDApCS8qIHNlY3Rpb24gd2lsbCBiZSBwYWRkZWQgd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMgd2hlcmV2ZXIgcGFkZGluZyBpcyBuZWNlc3NhcnkgYW5kIHRoZXJlIGlzIGEKLQkJCQkJCi0JCQkJCQkJCQkgICAgIHdvcmQgb2YgY29udGlndW91cyBieXRlcwotCQkJCQkJCQkJICAgICBiZWdpbm5pbmcgb24gYSB3b3JkIGJvdW5kYXJ5LiAqLwotCi0jZGVmaW5lIFNUWVBfTElUCTB4ODAyMAkvKiBMaXRlcmFsIGRhdGEgKGxpa2UgU1RZUF9URVhUKSAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi0KLXN0cnVjdCBpbnRlcm5hbF9saW5lbm8KLXsKLSAgdW5pb24KLSAgewotICAgIGxvbmcgbF9zeW1uZHg7CQkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLSAgICBsb25nIGxfcGFkZHI7CQkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLSAgfSAgICAgbF9hZGRyOwotICB1bnNpZ25lZCBsb25nIGxfbG5ubzsJCS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBESU1OVU0JCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3ltZW50Ci17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIF9uX25hbWVbU1lNTk1MRU5dOwkvKiBvbGQgQ09GRiB2ZXJzaW9uCSovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgbG9uZyBfbl96ZXJvZXM7CQkvKiBuZXcgPT0gMAkJKi8KLSAgICAgIGxvbmcgX25fb2Zmc2V0OwkJLyogb2Zmc2V0IGludG8gc3RyaW5nIHRhYmxlICovCi0gICAgfSAgICAgIF9uX247Ci0gICAgY2hhciAqX25fbnB0clsyXTsJCS8qIGFsbG93cyBmb3Igb3ZlcmxheWluZwkqLwotICB9ICAgICBfbjsKLSAgbG9uZyBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbAkJKi8KLSAgc2hvcnQgbl9zY251bTsJCS8qIHNlY3Rpb24gbnVtYmVyCQkqLwotICB1bnNpZ25lZCBzaG9ydCBuX2ZsYWdzOwkvKiBjb3B5IG9mIGZsYWdzIGZyb20gZmlsaGRyCSovCi0gIHVuc2lnbmVkIHNob3J0IG5fdHlwZTsJLyogdHlwZSBhbmQgZGVyaXZlZCB0eXBlCSovCi0gIHVuc2lnbmVkIGNoYXIgbl9zY2xhc3M7CS8qIHN0b3JhZ2UgY2xhc3MJCSovCi0gIHVuc2lnbmVkIGNoYXIgbl9udW1hdXg7CS8qIG51bWJlciBvZiBhdXguIGVudHJpZXMJKi8KLX07Ci0KLSNkZWZpbmUgbl9uYW1lCQlfbi5fbl9uYW1lCi0jZGVmaW5lIG5femVyb2VzCV9uLl9uX24uX25femVyb2VzCi0jZGVmaW5lIG5fb2Zmc2V0CV9uLl9uX24uX25fb2Zmc2V0Ci0KLQotLyogUmVsb2NhdGFibGUgc3ltYm9scyBoYXZlIG51bWJlciBvZiB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkLAotICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmc6ICovCi0KLSNkZWZpbmUgTl9VTkRFRgkoKHNob3J0KTApCS8qIHVuZGVmaW5lZCBzeW1ib2wgKi8KLSNkZWZpbmUgTl9BQlMJKChzaG9ydCktMSkJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCi0jZGVmaW5lIE5fREVCVUcJKChzaG9ydCktMikJLyogZGVidWdnaW5nIHN5bWJvbCAtLSB2YWx1ZSBpcyBtZWFuaW5nbGVzcyAqLwotI2RlZmluZSBOX1RWCSgoc2hvcnQpLTMpCS8qIGluZGljYXRlcyBzeW1ib2wgbmVlZHMgcHJlbG9hZCB0cmFuc2ZlciB2ZWN0b3IgKi8KLSNkZWZpbmUgUF9UVgkoKHNob3J0KS00KQkvKiBpbmRpY2F0ZXMgc3ltYm9sIG5lZWRzIHBvc3Rsb2FkIHRyYW5zZmVyIHZlY3RvciovCi0KLS8qCi0gKiBUeXBlIG9mIGEgc3ltYm9sLCBpbiBsb3cgTiBiaXRzIG9mIHRoZSB3b3JkCi0gKi8KLSNkZWZpbmUgVF9OVUxMCQkwCi0jZGVmaW5lIFRfVk9JRAkJMQkvKiBmdW5jdGlvbiBhcmd1bWVudCAob25seSB1c2VkIGJ5IGNvbXBpbGVyKSAqLwotI2RlZmluZSBUX0NIQVIJCTIJLyogY2hhcmFjdGVyCQkqLwotI2RlZmluZSBUX1NIT1JUCQkzCS8qIHNob3J0IGludGVnZXIJKi8KLSNkZWZpbmUgVF9JTlQJCTQJLyogaW50ZWdlcgkJKi8KLSNkZWZpbmUgVF9MT05HCQk1CS8qIGxvbmcgaW50ZWdlcgkJKi8KLSNkZWZpbmUgVF9GTE9BVAkJNgkvKiBmbG9hdGluZyBwb2ludAkqLwotI2RlZmluZSBUX0RPVUJMRQk3CS8qIGRvdWJsZSB3b3JkCQkqLwotI2RlZmluZSBUX1NUUlVDVAk4CS8qIHN0cnVjdHVyZSAJCSovCi0jZGVmaW5lIFRfVU5JT04JCTkJLyogdW5pb24gCQkqLwotI2RlZmluZSBUX0VOVU0JCTEwCS8qIGVudW1lcmF0aW9uIAkJKi8KLSNkZWZpbmUgVF9NT0UJCTExCS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbiovCi0jZGVmaW5lIFRfVUNIQVIJCTEyCS8qIHVuc2lnbmVkIGNoYXJhY3RlcgkqLwotI2RlZmluZSBUX1VTSE9SVAkxMwkvKiB1bnNpZ25lZCBzaG9ydAkqLwotI2RlZmluZSBUX1VJTlQJCTE0CS8qIHVuc2lnbmVkIGludGVnZXIJKi8KLSNkZWZpbmUgVF9VTE9ORwkJMTUJLyogdW5zaWduZWQgbG9uZwkqLwotI2RlZmluZSBUX0xOR0RCTAkxNgkvKiBsb25nIGRvdWJsZQkJKi8KLQotLyoKLSAqIGRlcml2ZWQgdHlwZXMsIGluIG5fdHlwZQotKi8KLSNkZWZpbmUgRFRfTk9OCQkoMCkJLyogbm8gZGVyaXZlZCB0eXBlICovCi0jZGVmaW5lIERUX1BUUgkJKDEpCS8qIHBvaW50ZXIgKi8KLSNkZWZpbmUgRFRfRkNOCQkoMikJLyogZnVuY3Rpb24gKi8KLSNkZWZpbmUgRFRfQVJZCQkoMykJLyogYXJyYXkgKi8KLQotI2RlZmluZSBCVFlQRSh4KQkoKHgpICYgTl9CVE1BU0spCi0jZGVmaW5lIERUWVBFKHgpCSgoKHgpICYgTl9UTUFTSykgPj4gTl9CVFNIRlQpCi0KLSNkZWZpbmUgSVNQVFIoeCkgXAotICAoKCh1bnNpZ25lZCBsb25nKSAoeCkgJiBOX1RNQVNLKSA9PSAoKHVuc2lnbmVkIGxvbmcpIERUX1BUUiA8PCBOX0JUU0hGVCkpCi0jZGVmaW5lIElTRkNOKHgpIFwKLSAgKCgodW5zaWduZWQgbG9uZykgKHgpICYgTl9UTUFTSykgPT0gKCh1bnNpZ25lZCBsb25nKSBEVF9GQ04gPDwgTl9CVFNIRlQpKQotI2RlZmluZSBJU0FSWSh4KSBcCi0gICgoKHVuc2lnbmVkIGxvbmcpICh4KSAmIE5fVE1BU0spID09ICgodW5zaWduZWQgbG9uZykgRFRfQVJZIDw8IE5fQlRTSEZUKSkKLSNkZWZpbmUgSVNUQUcoeCkgXAotICAoKHgpID09IENfU1RSVEFHIHx8ICh4KSA9PSBDX1VOVEFHIHx8ICh4KSA9PSBDX0VOVEFHKQotI2RlZmluZSBERUNSRUYoeCkgXAotICAoKCgoeCkgPj4gTl9UU0hJRlQpICYgfiBOX0JUTUFTSykgfCAoKHgpICYgTl9CVE1BU0spKQotCi11bmlvbiBpbnRlcm5hbF9hdXhlbnQKLXsKLSAgc3RydWN0Ci0gIHsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgbG9uZyBsOwkJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLSAgICAgIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnA7Ci0gICAgfSAgICAgeF90YWduZHg7Ci0KLSAgICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAotICAgICAgewotCXVuc2lnbmVkIHNob3J0IHhfbG5ubzsJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCB4X3NpemU7CS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9ICAgICAgeF9sbnN6OwotICAgICAgbG9uZyB4X2ZzaXplOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotICAgIH0gICAgIHhfbWlzYzsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0gICAgICB7CQkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCWxvbmcgeF9sbm5vcHRyOwkJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQl1bmlvbgotCXsJCQkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkgIGxvbmcgbDsKLQkgIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnA7Ci0JfSAgICAgeF9lbmRuZHg7Ci0gICAgICB9ICAgICAgeF9mY247Ci0KLSAgICAgIHN0cnVjdAotICAgICAgewkJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQl1bnNpZ25lZCBzaG9ydCB4X2RpbWVuW0RJTU5VTV07Ci0gICAgICB9ICAgICAgeF9hcnk7Ci0gICAgfSAgICAgeF9mY25hcnk7Ci0KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3R2bmR4OwkvKiB0diBpbmRleCAqLwotICB9ICAgICAgeF9zeW07Ci0KLSAgdW5pb24KLSAgewotICAgIGNoYXIgeF9mbmFtZVtGSUxOTUxFTl07Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgbG9uZyB4X3plcm9lczsKLSAgICAgIGxvbmcgeF9vZmZzZXQ7Ci0gICAgfSAgICAgIHhfbjsKLSAgfSAgICAgeF9maWxlOwotCi0gIHN0cnVjdAotICB7Ci0gICAgbG9uZyB4X3NjbmxlbjsJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9ucmVsb2M7CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9ubGlubm87CS8qICMgbGluZSBudW1iZXJzICovCi0gICAgdW5zaWduZWQgbG9uZyB4X2NoZWNrc3VtOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSBmb3IgUEUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X2Fzc29jaWF0ZWQ7IC8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggZm9yIFBFICovCi0gICAgdW5zaWduZWQgY2hhciB4X2NvbWRhdDsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgZm9yIFBFICovCi0gIH0gICAgICB4X3NjbjsKLQotICBzdHJ1Y3QKLSAgewotICAgIGxvbmcgeF90dmZpbGw7CQkvKiB0diBmaWxsIHZhbHVlICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF90dmxlbjsJLyogbGVuZ3RoIG9mIC50diAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfdHZyYW5bMl07CS8qIHR2IHJhbmdlICovCi0gIH0gICAgICB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIFJTLzYwMDAtc3BlY2lmaWMgYXV4ZW50IC0gbGFzdCBhdXhlbnQgZm9yIGV2ZXJ5IGV4dGVybmFsIHN5bWJvbAotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBzdHJ1Y3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7CQkJCS8qIGNzZWN0IGxlbmd0aCBvciBlbmNsb3NpbmcgY3NlY3QgKi8KLQlsb25nIGw7Ci0Jc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKLSAgICAgIH0geF9zY25sZW47Ci0gICAgbG9uZyB4X3Bhcm1oYXNoOwkJLyogcGFybSB0eXBlIGhhc2ggaW5kZXggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3NuaGFzaDsJLyogc2VjdCBudW0gd2l0aCBwYXJtIGhhc2ggKi8KLSAgICB1bnNpZ25lZCBjaGFyIHhfc210eXA7CS8qIHN5bWJvbCBhbGlnbiBhbmQgdHlwZSAqLwotICAgIC8qIDAtNCAtIExvZyAyIG9mIGFsaWdubWVudCAqLwotICAgIC8qIDUtNyAtIHN5bWJvbCB0eXBlICovCi0gICAgdW5zaWduZWQgY2hhciB4X3NtY2xhczsJLyogc3RvcmFnZSBtYXBwaW5nIGNsYXNzICovCi0gICAgbG9uZyB4X3N0YWI7CQkvKiBkYnggc3RhYiBpbmZvIGluZGV4ICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9zbnN0YWI7CS8qIHNlY3QgbnVtIHdpdGggZGJ4IHN0YWIgKi8KLSAgfSAgICAgIHhfY3NlY3Q7CQkvKiBjc2VjdCBkZWZpbml0aW9uIGluZm9ybWF0aW9uICovCi0KLS8qIHhfc210eXAgdmFsdWVzOiAgKi8KLQotI2RlZmluZQlTTVRZUF9BTElHTih4KQkoKHgpID4+IDMpCS8qIGxvZzIgb2YgYWxpZ25tZW50ICovCi0jZGVmaW5lCVNNVFlQX1NNVFlQKHgpCSgoeCkgJiAweDcpCS8qIHN5bWJvbCB0eXBlICovCi0vKiBTeW1ib2wgdHlwZSB2YWx1ZXM6ICAqLwotI2RlZmluZQlYVFlfRVIJMAkJLyogRXh0ZXJuYWwgcmVmZXJlbmNlICovCi0jZGVmaW5lCVhUWV9TRAkxCQkvKiBDc2VjdCBkZWZpbml0aW9uICovCi0jZGVmaW5lCVhUWV9MRAkyCQkvKiBMYWJlbCBkZWZpbml0aW9uICovCi0jZGVmaW5lIFhUWV9DTQkzCQkvKiAuQlNTICovCi0jZGVmaW5lCVhUWV9FTQk0CQkvKiBFcnJvciBtZXNzYWdlICovCi0jZGVmaW5lCVhUWV9VUwk1CQkvKiAiUmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSIgKi8KLQotLyogeF9zbWNsYXMgdmFsdWVzOiAgKi8KLQotI2RlZmluZQlYTUNfUFIJMAkJLyogUmVhZC1vbmx5IHByb2dyYW0gY29kZSAqLwotI2RlZmluZQlYTUNfUk8JMQkJLyogUmVhZC1vbmx5IGNvbnN0YW50ICovCi0jZGVmaW5lCVhNQ19EQgkyCQkvKiBSZWFkLW9ubHkgZGVidWcgZGljdGlvbmFyeSB0YWJsZSAqLwotI2RlZmluZQlYTUNfVEMJMwkJLyogUmVhZC13cml0ZSBnZW5lcmFsIFRPQyBlbnRyeSAqLwotI2RlZmluZQlYTUNfVUEJNAkJLyogUmVhZC13cml0ZSB1bmNsYXNzaWZpZWQgKi8KLSNkZWZpbmUJWE1DX1JXCTUJCS8qIFJlYWQtd3JpdGUgZGF0YSAqLwotI2RlZmluZQlYTUNfR0wJNgkJLyogUmVhZC1vbmx5IGdsb2JhbCBsaW5rYWdlICovCi0jZGVmaW5lCVhNQ19YTwk3CQkvKiBSZWFkLW9ubHkgZXh0ZW5kZWQgb3BlcmF0aW9uICovCi0jZGVmaW5lCVhNQ19TVgk4CQkvKiBSZWFkLW9ubHkgc3VwZXJ2aXNvciBjYWxsICovCi0jZGVmaW5lCVhNQ19CUwk5CQkvKiBSZWFkLXdyaXRlIEJTUyAqLwotI2RlZmluZQlYTUNfRFMJMTAJCS8qIFJlYWQtd3JpdGUgZGVzY3JpcHRvciBjc2VjdCAqLwotI2RlZmluZQlYTUNfVUMJMTEJCS8qIFJlYWQtd3JpdGUgdW5uYW1lZCBGb3J0cmFuIGNvbW1vbiAqLwotI2RlZmluZQlYTUNfVEkJMTIJCS8qIFJlYWQtb25seSB0cmFjZWJhY2sgaW5kZXggY3NlY3QgKi8KLSNkZWZpbmUJWE1DX1RCCTEzCQkvKiBSZWFkLW9ubHkgdHJhY2ViYWNrIHRhYmxlIGNzZWN0ICovCi0vKiAJCTE0CT8/PyAqLwotI2RlZmluZQlYTUNfVEMwCTE1CQkvKiBSZWFkLXdyaXRlIFRPQyBhbmNob3IgKi8KLSNkZWZpbmUgWE1DX1RECTE2CQkvKiBSZWFkLXdyaXRlIGRhdGEgaW4gVE9DICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiAgSTk2MC1zcGVjaWZpYyAqMm5kKiBhdXguIGVudHJ5IGZvcm1hdHMKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgc3RydWN0Ci0gIHsKLSAgICAvKiBUaGlzIGlzIGEgdmVyeSBvbGQgdHlwbyB0aGF0IGtlZXBzIGdldHRpbmcgcHJvcGFnYXRlZC4gKi8KLSNkZWZpbmUgeF9zdGRpbmR4IHhfc3RpbmR4Ci0gICAgbG9uZyB4X3N0aW5keDsJCS8qIHN5cy4gdGFibGUgZW50cnkgKi8KLSAgfSAgICAgIHhfc2M7CQkJLyogc3lzdGVtIGNhbGwgZW50cnkgKi8KLQotICBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgeF9iYWxudHJ5OwkvKiBCQUwgZW50cnkgcG9pbnQgKi8KLSAgfSAgICAgIHhfYmFsOwkJCS8qIEJBTC1jYWxsYWJsZSBmdW5jdGlvbiAqLwotCi0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyB4X3RpbWVzdGFtcDsJLyogdGltZSBzdGFtcCAqLwotICAgIGNoYXIgeF9pZHN0cmluZ1syMF07CS8qIHByb2R1Y2VyIGlkZW50aXR5IHN0cmluZyAqLwotICB9ICAgICAgeF9pZGVudDsJCS8qIFByb2R1Y2VyIGlkZW50IGluZm8gKi8KLQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBpbnRlcm5hbF9yZWxvYwotewotICBiZmRfdm1hIHJfdmFkZHI7CQkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgcmVmZXJlbmNlICovCi0gIGxvbmcgcl9zeW1uZHg7CQkvKiBJbmRleCBpbnRvIHN5bWJvbCB0YWJsZQkqLwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7CS8qIFJlbG9jYXRpb24gdHlwZQkJKi8KLSAgdW5zaWduZWQgY2hhciByX3NpemU7CQkvKiBVc2VkIGJ5IFJTLzYwMDAgYW5kIEVDT0ZGCSovCi0gIHVuc2lnbmVkIGNoYXIgcl9leHRlcm47CS8qIFVzZWQgYnkgRUNPRkYJCSovCi0gIHVuc2lnbmVkIGxvbmcgcl9vZmZzZXQ7CS8qIFVzZWQgYnkgQWxwaGEgRUNPRkYsIFNQQVJDLCBvdGhlcnMgKi8KLX07Ci0KLSNkZWZpbmUgUl9ESVIxNiAJIDEKLSNkZWZpbmUgUl9ESVIzMiAJIDYKLSNkZWZpbmUgUl9JTUFHRUJBU0UJIDcKLSNkZWZpbmUgUl9SRUxCWVRFCTE1Ci0jZGVmaW5lIFJfUkVMV09SRAkxNgotI2RlZmluZSBSX1JFTExPTkcJMTcKLSNkZWZpbmUgUl9QQ1JCWVRFCTE4Ci0jZGVmaW5lIFJfUENSV09SRAkxOQotI2RlZmluZSBSX1BDUkxPTkcJMjAKLSNkZWZpbmUgUl9JUFJTSE9SVAkyNAotI2RlZmluZSBSX0lQUkxPTkcJMjYKLSNkZWZpbmUgUl9HRVRTRUcJMjkKLSNkZWZpbmUgUl9HRVRQQSAJMzAKLSNkZWZpbmUgUl9UQUdXT1JECTMxCi0jZGVmaW5lIFJfSlVNUFRBUkcJMzIJLyogc3RyYW5nZSAyOWsgMDB4eDAweHggcmVsb2MgKi8KLQotI2RlZmluZSBSX1BDUjE2TCAgICAgICAxMjgKLSNkZWZpbmUgUl9QQ1IyNkwgICAgICAgMTI5Ci0jZGVmaW5lIFJfVlJUMTYgICAgICAgIDEzMAotI2RlZmluZSBSX0hWUlQxNiAgICAgICAxMzEKLSNkZWZpbmUgUl9MVlJUMTYgICAgICAgMTMyCi0jZGVmaW5lIFJfVlJUMzIgICAgICAgIDEzMwotCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2l0aCBhIDE2Yml0IGFic29sdXRlCi0gICBhZGRyZXNzLiAgVGhlIGxpbmtlciB0cmllcyB0byB0dXJuIGluc25zIHdpdGggdGhpcyByZWxvYyBpbnRvCi0gICBhbiBhYnNvbHV0ZSA4LWJpdCBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1YxNkIxICAgIAkweDQxCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2hpY2ggaGFkIGEgMTZiaXQKLSAgIGFic29sdXRlIGFkZHJlc3Mgd2hpY2ggaGF2ZSBiZWVuIHNob3J0ZW5lZCBpbnRvIGEgOC1iaXQKLSAgIGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVjE2QjIgCTB4NDIKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGptcCBpbnNucyB3aXRoIGEgMTZiaXQgdGFyZ2V0IGFkZHJlc3M7Ci0gICB0aGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gdGhlc2UgaW5zbnMgaW50byBicmEgaW5zbnMgd2l0aAotICAgYW4gOGJpdCBwYy1yZWxhdGl2ZSB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUDEgICAgIAkweDQzCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGJyYSB3aXRoIGFuIDgtYml0IHBjLXJlbGF0aXZlCi0gICB0YXJnZXQgdGhhdCB3YXMgZm9ybWVybGx5IGEgam1wIGluc24gd2l0aCBhIDE2Yml0IHRhcmdldC4gICovCi0jZGVmaW5lIFJfSk1QMiAJCTB4NDQKLQotLyogPz8/ICovCi0jZGVmaW5lIFJfUkVMTE9OR19ORUcgIAkweDQ1Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBqbXAgaW5zbnMgd2l0aCBhIDI0Yml0IHRhcmdldCBhZGRyZXNzOwotICAgdGhlIGxpbmtlciB0cmllcyB0byB0dXJuIHRoZXNlIGluc25zIGludG8gYnJhIGluc25zIHdpdGgKLSAgIGFuIDhiaXQgcGMtcmVsYXRpdmUgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVBMMSAgICAgCTB4NDYKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgYnJhIHdpdGggYW4gOC1iaXQgcGMtcmVsYXRpdmUKLSAgIHRhcmdldCB0aGF0IHdhcyBmb3JtZXJsbHkgYSBqbXAgaW5zbiB3aXRoIGEgMjRiaXQgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVBMMgkJMHg0NwotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92LmIgaW5zdHJ1Y3Rpb25zIHdpdGggYSAyNGJpdCBhYnNvbHV0ZQotICAgYWRkcmVzcy4gIFRoZSBsaW5rZXIgdHJpZXMgdG8gdHVybiBpbnNucyB3aXRoIHRoaXMgcmVsb2MgaW50bwotICAgYW4gYWJzb2x1dGUgOC1iaXQgYWRkcmVzcy4gICovCi0KLSNkZWZpbmUgUl9NT1YyNEIxICAgIAkweDQ4Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2hpY2ggaGFkIGEgMjRiaXQKLSAgIGFic29sdXRlIGFkZHJlc3Mgd2hpY2ggaGF2ZSBiZWVuIHNob3J0ZW5lZCBpbnRvIGEgOC1iaXQKLSAgIGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVjI0QjIgCTB4NDkKLQotLyogQW4gaDgzMDAgbWVtb3J5IGluZGlyZWN0IGp1bXAvY2FsbC4gIEZvcmNlcyB0aGUgYWRkcmVzcyBvZiB0aGUganVtcC9jYWxsCi0gICB0YXJnZXQgaW50byB0aGUgZnVuY3Rpb24gdmVjdG9yIChpbiBwYWdlIHplcm8pLCBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICB2ZWN0b3IgZW50cnkgdG8gYmUgcGxhY2VkIGluIHRoZSBqdW1wL2NhbGwgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSX01FTV9JTkRJUkVDVAkweDRhCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0YXJnZXQgd2hpY2ggd2FzCi0gICBzaG9ydGVuZWQgaW50byBhbiA4Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0YXJnZXQuICAqLwotI2RlZmluZSBSX1BDUldPUkRfQgkweDRiCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuW3dsXSBpbnN0cnVjdGlvbnMgd2l0aCBhIDMyLzI0IGJpdAotICAgYWJzb2x1dGUgYWRkcmVzczsgdGhlIGxpbmtlciBtYXkgdHVybiB0aGlzIGludG8gYSBtb3YuW3dsXQotICAgaW5zbiB3aXRoIGEgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WTDEgICAgCTB4NGMKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5bd2xdIGluc25zIHdoaWNoIGZvcm1lcmxseSBoYWQKLSAgIGEgMzIvMjRiaXQgYWJzb2x1dGUgYWRkcmVzcyBhbmQgbm93IGhhdmUgYSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1ZMMiAJMHg0ZAotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBiQ0M6OCB3aGljaCB3aWxsIGhhdmUgaXQncyBjb25kaXRpb24KLSAgIGludmVydGVkIGFuZCBpdHMgdGFyZ2V0IHJlZGlyZWN0ZWQgdG8gdGhlIHRhcmdldCBvZiB0aGUgYnJhbmNoCi0gICBpbiB0aGUgZm9sbG93aW5nIGluc24uICAqLwotI2RlZmluZSBSX0JDQ19JTlYJMHg0ZQotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBqbXAgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgYmVlbiBkZWxldGVkLiAgKi8KLSNkZWZpbmUgUl9KTVBfREVMCTB4NGYKLQotLyogWjhrIG1vZGVzICovCi0jZGVmaW5lIFJfSU1NMTYgICAweDAxCQkvKiAxNiBiaXQgYWJzICovCi0jZGVmaW5lIFJfSlIJICAweDAyCQkvKiBqciAgOCBiaXQgZGlzcCAqLwotI2RlZmluZSBSX0lNTTRMICAgMHgyMwkJLyogbG93IG5pYmJsZSAqLwotI2RlZmluZSBSX0lNTTggICAgMHgyMgkJLyogOCBiaXQgYWJzICovCi0jZGVmaW5lIFJfSU1NMzIgICBSX1JFTExPTkcJLyogMzIgYml0IGFicyAqLwotI2RlZmluZSBSX0NBTEwgICAgUl9EQQkJLyogQWJzb2x1dGUgYWRkcmVzcyB3aGljaCBjb3VsZCBiZSBhIGNhbGxyICovCi0jZGVmaW5lIFJfSlAJICBSX0RBCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIHdoaWNoIGNvdWxkIGJlIGEganAgKi8KLSNkZWZpbmUgUl9SRUwxNiAgIDB4MDQJCS8qIDE2IGJpdCBQQyByZWwgKi8KLSNkZWZpbmUgUl9DQUxMUgkgIDB4MDUJCS8qIGNhbGxyIDEyIGJpdCBkaXNwICovCi0jZGVmaW5lIFJfU0VHICAgICAweDEwCQkvKiBzZXQgaWYgaW4gc2VnbWVudGVkIG1vZGUgKi8KLSNkZWZpbmUgUl9JTU00SCAgIDB4MjQJCS8qIGhpZ2ggbmliYmxlICovCi0jZGVmaW5lIFJfRElTUDcgICAweDI1ICAgICAgICAgIC8qIGRqbnogZGlzcGxhY2VtZW50ICovCi0KLS8qIEg4NTAwIG1vZGVzICovCi0KLSNkZWZpbmUgUl9IODUwMF9JTU04ICAJMQkJLyogIDggYml0IGltbWVkaWF0ZSAJKi8KLSNkZWZpbmUgUl9IODUwMF9JTU0xNiAJMgkJLyogMTYgYml0IGltbWVkaWF0ZQkqLwotI2RlZmluZSBSX0g4NTAwX1BDUkVMOCAJMwkJLyogIDggYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX0g4NTAwX1BDUkVMMTYgNAkJLyogMTYgYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX0g4NTAwX0hJR0g4ICAJNQkJLyogaGlnaCA4IGJpdHMgb2YgMjQgYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9IODUwMF9MT1cxNiAJNwkJLyogbG93IDE2IGJpdHMgb2YgMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX0g4NTAwX0lNTTI0CTYJCS8qIDI0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9IODUwMF9JTU0zMiAgIDggICAgICAgICAgICAgICAvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfSDg1MDBfSElHSDE2ICA5CQkvKiBoaWdoIDE2IGJpdHMgb2YgMzIgYml0IGltbWVkaWF0ZSAqLwotCi0vKiBXNjUgbW9kZXMgKi8KLQotI2RlZmluZSBSX1c2NV9BQlM4CTEgIC8qIGFkZHIgJiAweGZmIAkJKi8KLSNkZWZpbmUgUl9XNjVfQUJTMTYJMiAgLyogYWRkciAmIDB4ZmZmZiAJCSovCi0jZGVmaW5lIFJfVzY1X0FCUzI0CTMgIC8qIGFkZHIgJiAweGZmZmZmZiAJCSovCi0KLSNkZWZpbmUgUl9XNjVfQUJTOFM4ICAgIDQgIC8qIChhZGRyID4+IDgpICYgMHhmZiAJKi8KLSNkZWZpbmUgUl9XNjVfQUJTOFMxNiAgIDUgIC8qIChhZGRyID4+IDE2KSAmIDB4ZmYgCSovCi0KLSNkZWZpbmUgUl9XNjVfQUJTMTZTOCAgIDYgIC8qIChhZGRyID4+IDgpICYgMGZmZmYgCSovCi0jZGVmaW5lIFJfVzY1X0FCUzE2UzE2ICA3ICAvKiAoYWRkciA+PiAxNikgJiAwZmZmZiAJKi8KLQotI2RlZmluZSBSX1c2NV9QQ1I4CTgKLSNkZWZpbmUgUl9XNjVfUENSMTYJOQotCi0jZGVmaW5lIFJfVzY1X0RQICAgICAgIDEwICAvKiBkaXJlY3QgcGFnZSA4IGJpdHMgb25seSAgICovCi0KLSNlbmRpZiAvKiBHTlVfQ09GRl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbTY4ay5oIGIvaW5jbHVkZS9jb2ZmL202OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxNDdlZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgTTY4SyAqLwotCi0jaWZuZGVmIEdOVV9DT0ZGX002OEtfSAotI2RlZmluZSBHTlVfQ09GRl9NNjhLX0ggMQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBNb3Rvcm9sYSA2ODAwMC82ODAwOC82ODAxMC82ODAyMCAqLwotI2RlZmluZQlNQzY4TUFHSUMJMDUyMAotI2RlZmluZSBNQzY4S1dSTUFHSUMJMDUyMAkvKiB3cml0ZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNQzY4VFZNQUdJQwkwNTIxCi0jZGVmaW5lIE1DNjhLUk9NQUdJQwkwNTIxCS8qIHJlYWRvbmx5IHNoYXJlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lIE1DNjhLUEdNQUdJQwkwNTIyCS8qIGRlbWFuZCBwYWdlZCB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU02OE1BR0lDCTAyMTAKLSNkZWZpbmUJTTY4VFZNQUdJQwkwMjExCi0KLS8qIHRoaXMgaXMgdGhlIG1hZ2ljIG9mIHRoZSBCdWxsIGRweC8yICovCi0jZGVmaW5lIE1DNjhLQkNTTUFHSUMJMDUyNgotCi0vKiBUaGlzIGlzIEx5bngncyBhbGwtcGxhdGZvcm0gbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcy4gKi8KLQotI2RlZmluZSBMWU5YQ09GRk1BR0lDCTA0MTUKLQotI2RlZmluZSBPTUFHSUMgTTY4TUFHSUMKLQotLyogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGluY2x1ZGUgTUM2OEtCQ1NNQUdJQzsgaXQgb25seSBpbmNsdWRlcwotICAgbWFnaWMgbnVtYmVycyB3aGljaCBpbXBseSB0aGF0IG5hbWVzIGRvIG5vdCBoYXZlIHVuZGVyc2NvcmVzLiAgKi8KLSNkZWZpbmUgTTY4S0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NQzY4TUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtXUk1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhUVk1BR0lDKSAmJiBcCi0gICgoeCkuZl9tYWdpYyE9TUM2OEtST01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhLUEdNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NNjhUVk1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPUxZTlhDT0ZGTUFHSUMpICkKLQotLyogTWFnaWMgbnVtYmVycyBmb3IgdGhlIGEub3V0IGhlYWRlci4gICovCi0KLSNkZWZpbmUgUEFHRU1BR0lDRVhFQ1NXQVBQRUQgIDA0MDcgLyogZXhlY3V0YWJsZSAoc3dhcHBlZCkgKi8KLSNkZWZpbmUgUEFHRU1BR0lDUEVYRUNTV0FQUEVEIDA0MTAgLyogcHVyZSBleGVjdXRhYmxlIChzd2FwcGVkKSAqLwotI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1RTSExJQiAgMDQ0MyAvKiBwdXJlIGV4ZWN1dGFibGUgKHRhcmdldCBzaGFyZWQgbGlicmFyeSkgKi8KLSNkZWZpbmUgUEFHRU1BR0lDUEVYRUNQQUdFRCAgIDA0MTMgLyogcHVyZSBleGVjdXRhYmxlIChwYWdlZCkgKi8KLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotICBjaGFyIHJfb2Zmc2V0WzRdOwotI2VuZGlmCi0KLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLQotI2lmZGVmIE02OEtfQ09GRl9PRkZTRVQKLSNkZWZpbmUgUkVMU1ogMTQKLSNlbHNlCi0jZGVmaW5lIFJFTFNaIDEwCi0jZW5kaWYKLQotI2VuZGlmIC8qIEdOVV9DT0ZGX002OEtfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL204OGsuaCBiL2luY2x1ZGUvY29mZi9tODhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNmViNDEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL204OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIDg4ayBiY3MgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lIE1DODhNQUdJQyAgMDU0MCAgICAgICAgICAgLyogODhrIEJDUyBleGVjdXRhYmxlICovCi0jZGVmaW5lIE1DODhETUFHSUMgMDU0MSAgICAgICAgICAgLyogREcvVVggZXhlY3V0YWJsZSAgICovCi0jZGVmaW5lIE1DODhPTUFHSUMgMDU1NQkgICAgICAgICAgLyogT2JqZWN0IGZpbGUgICAgICAgICovCi0KLSNkZWZpbmUgTUM4OEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NQzg4TUFHSUMpICYmKCh4KS5mX21hZ2ljIT1NQzg4RE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMgIT0gTUM4OE9NQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIFBBR0VNQUdJQzMgMDQxNCAvKiBTcGxpdCBpJmQsIHplcm8gbWFwcGVkICovCi0jZGVmaW5lIFBBR0VNQUdJQ0JDUyAwNDEzCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0vKiBjb21wdXRlIHNpemUgb2YgYSBoZWFkZXIgKi8KLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIAotewotICBjaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIGNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIGNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBjaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgY2hhcgkJc19ucmVsb2NbNF07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgY2hhcgkJc19ubG5ub1s0XTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICBjaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQ0Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0KLQljaGFyIGxfbG5ub1s0XTsKLQotfTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci0gIGNoYXIgcGFkMlsyXTsKLX07Ci0KLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJMDE3Ci0jZGVmaW5lIE5fVE1BU0sJCTA2MAotI2RlZmluZSBOX0JUU0hGVAk0Ci0jZGVmaW5lIE5fVFNISUZUCTIKLQotCi0vKiBOb3RlIHRoYXQgdGhpcyBpc24ndCB0aGUgc2FtZSBzaGFwZSBhcyBvdGhlciBjb2ZmcyAqLwotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdGFnbmR4WzRdOwkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgIC8qIDQgKi8KLSAgICB1bmlvbiB7Ci0gICAgICBjaGFyIHhfZnNpemVbNF07CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0gICAgICBzdHJ1Y3QgewotCWNoYXIgIHhfbG5ub1s0XTsJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQljaGFyICB4X3NpemVbNF07CS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9IHhfbG5zejsKLSAgICB9IHhfbWlzYzsKLSAgICAKLSAgICAvKiAxMiAqLwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7CQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JY2hhciB4X2VuZG5keFs0XTsJCS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotICAgICAgfSB4X2ZjbjsKLSAgICAgIHN0cnVjdCB7CQkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgfSB4X2ZjbmFyeTsKLSAgICAvKiAyMCAqLwotICAgIAotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciB4X3plcm9lc1s0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXRbNF07Ci0gICAgfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfc2NubGVuWzRdOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICBjaGFyIHhfbnJlbG9jWzRdOwkJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICBjaGFyIHhfbmxpbm5vWzRdOwkJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3R2ZmlsbFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICBjaGFyIHhfdHZsZW5bMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgY2hhciB4X3R2cmFuWzJdWzJdOwkJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotfTsKLQotI2RlZmluZSBHRVRfRkNOX0xOTk9QVFIoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2RlZmluZSBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgaW4sIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgICBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2RlZmluZSBQVVRfTE5TWl9MTk5PKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFBVVF9MTlNaX1NJWkUoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNkZWZpbmUgR0VUX1NDTl9TQ05MRU4oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZGVmaW5lIEdFVF9TQ05fTlJFTE9DKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfbnJlbG9jKQotI2RlZmluZSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZGVmaW5lIFBVVF9TQ05fU0NOTEVOKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgUFVUX1NDTl9OUkVMT0MoYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25saW5ubykKLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSkKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLQotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkyMAotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfb2Zmc2V0WzJdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogIDEyCi0KLSNkZWZpbmUgTk9fVFZORFgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9tY29yZS5oIGIvaW5jbHVkZS9jb2ZmL21jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTMxOWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL21jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyogTW90b3JvbGEgTUNvcmUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTUNvcmUgQ09GRi9QRSBBQkkuICovCi0KLSNpZm5kZWYgX0NPRkZfTU9SRV9ICi0jZGVmaW5lIF9DT0ZGX01PUkVfSAotCi0KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX0FCU09MVVRFICAgICAgICAgIAkweDAwMDAKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX0FERFIzMiAgICAgICAgICAgIAkweDAwMDEKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQJCTB4MDAwMgotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIJCTB4MDAwMwotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMgkJMHgwMDA0Ci0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMgkJMHgwMDA1Ci0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIJMHgwMDA2Ci0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9SVkEJCQkweDAwMDcKLQotI2RlZmluZSBQRU1DT1JFCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpYyAgICAgIFsyXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcCAgICAgWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemUgICAgICBbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZSAgICAgIFs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZSAgICAgIFs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeSAgICAgIFs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0IFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydCBbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotLyogRnJvbSB3aW5udC5oICovCi0jZGVmaW5lIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyAgICAgICAgMHgxMGIKLQotCi0vKiBEZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcy4gKi8KLSNkZWZpbmUgTlRfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIE5UX0ZJTEVfQUxJR05NRU5UICAgIDB4MjAwICAKLSNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jCi17Ci0gIGNoYXIgcl92YWRkciAgWzRdOwotICBjaGFyIHJfc3ltbmR4IFs0XTsKLSAgY2hhciByX3R5cGUgICBbMl07Ci0gIGNoYXIgcl9vZmZzZXQgWzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTQKLQotI2RlZmluZQlNQ09SRU1BR0lDCTB4YjAwICAvKiBJIGp1c3QgbWFkZSB0aGlzIHVwICovIAotCi0jZGVmaW5lIE1DT1JFQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPSBNQ09SRU1BR0lDKSkKLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLXsKLSAgY2hhciBmX21hZ2ljICBbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIGNoYXIgZl9uc2NucyAgWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXQgWzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0ciBbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zICBbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICBjaGFyIGZfb3B0aGRyIFsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIGNoYXIgZl9mbGFncyAgWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIGVfbmFtZSBbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgY2hhciBlX3plcm9lcyBbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0IFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgCi0gIGNoYXIgZV92YWx1ZSAgWzRdOwotICBjaGFyIGVfc2NudW0gIFsyXTsKLSAgY2hhciBlX3R5cGUgICBbMl07Ci0gIGNoYXIgZV9zY2xhc3MgWzFdOwotICBjaGFyIGVfbnVtYXV4IFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJMHhmCi0jZGVmaW5lIE5fVE1BU0sJCTB4MzAKLSNkZWZpbmUgTl9CVFNIRlQJNAotI2RlZmluZSBOX1RTSElGVAkyCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudAotewotICBzdHJ1Y3QKLSAgewotICAgIGNoYXIgeF90YWduZHggWzRdOwkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgIAotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0gICAgICB7Ci0JY2hhciAgeF9sbm5vIFsyXTsgCS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JY2hhciAgeF9zaXplIFsyXTsgCS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9IHhfbG5zejsKLQotICAgICAgY2hhciB4X2ZzaXplIFs0XTsJCS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQotICAgIH0geF9taXNjOwotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QgCQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0gICAgICB7Ci0JY2hhciB4X2xubm9wdHIgWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCWNoYXIgeF9lbmRuZHggIFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0gICAgICB9IHhfZmNuOwotCi0gICAgICBzdHJ1Y3QgCQkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0gICAgICB7Ci0JY2hhciB4X2RpbWVuIFtFX0RJTU5VTV1bMl07Ci0gICAgICB9IHhfYXJ5OwotICAgICAgCi0gICAgfSB4X2ZjbmFyeTsKLQotICAgIGNoYXIgeF90dm5keCBbMl07CQkvKiB0diBpbmRleCAqLwotCi0gIH0geF9zeW07Ci0KLSAgdW5pb24KLSAgewotICAgIGNoYXIgeF9mbmFtZSBbRV9GSUxOTUxFTl07Ci0gICAgCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgY2hhciB4X3plcm9lcyBbNF07Ci0gICAgICBjaGFyIHhfb2Zmc2V0IFs0XTsKLSAgICB9IHhfbjsKLSAgICAKLSAgfSB4X2ZpbGU7Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHhfc2NubGVuICAgICBbNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0gICAgY2hhciB4X25yZWxvYyAgICAgWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotICAgIGNoYXIgeF9ubGlubm8gICAgIFsyXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgICBjaGFyIHhfY2hlY2tzdW0gICBbNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0gICAgY2hhciB4X2Fzc29jaWF0ZWQgWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0gICAgY2hhciB4X2NvbWRhdCAgICAgWzFdOwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciAqLwotICB9IHhfc2NuOwotCi0gIHN0cnVjdAotICB7Ci0gICAgY2hhciB4X3R2ZmlsbCBbNF07CQkvKiB0diBmaWxsIHZhbHVlICovCi0gICAgY2hhciB4X3R2bGVuICBbMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgY2hhciB4X3R2cmFuICBbMl1bMl07CS8qIHR2IHJhbmdlICovCi0gIH0geF90djsJCQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gICBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAgIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gICBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuICAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubwotewotICB1bmlvbgotICB7Ci0gICAgY2hhciBsX3N5bW5keCBbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotICAgIGNoYXIgbF9wYWRkciAgWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLSAgfSBsX2FkZHI7Ci0KLSAgY2hhciBsX2xubm8gWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSAgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIJc19uYW1lICAgIFs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgY2hhcglzX3BhZGRyICAgWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICBjaGFyCXNfdmFkZHIgICBbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgY2hhcglzX3NpemUgICAgWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBjaGFyCXNfc2NucHRyICBbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGNoYXIJc19yZWxwdHIgIFs0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBjaGFyCXNfbG5ub3B0ciBbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICBjaGFyCXNfbnJlbG9jICBbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgY2hhcglzX25sbm5vICAgWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGNoYXIJc19mbGFncyAgIFs0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyogTmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotCi0jZW5kaWYgLyogX19DT0ZGX01DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9taXBzLmggYi9pbmNsdWRlL2NvZmYvbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDY2NWIxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyogRUNPRkYgc3VwcG9ydCBvbiBNSVBTIG1hY2hpbmVzLgotICAgY29mZi9lY29mZi5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHRoaXMgZmlsZS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLSAgdW5zaWduZWQgY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgdW5zaWduZWQgY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogTWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiBjb2ZmL2Vjb2ZmLmguICAqLwotI2RlZmluZSBNSVBTX0VDT0ZGX0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDXzEpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19MSVRUTEUpICYmXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0JJRykgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0xJVFRMRTIpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19CSUcyKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfTElUVExFMykgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0JJRzMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IGV4dGVybmFsX2FvdXRoZHIKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY1syXTsJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl0c2l6ZVs0XTsJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIHVuc2lnbmVkIGNoYXIJZHNpemVbNF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs0XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICB1bnNpZ25lZCBjaGFyCWVudHJ5WzRdOwkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X3N0YXJ0WzRdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0YV9zdGFydFs0XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGJzc19zdGFydFs0XTsJLyogYmFzZSBvZiBic3MgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZ3BybWFza1s0XTsJLyogPz8gKi8KLSAgdW5zaWduZWQgY2hhciBjcHJtYXNrWzRdWzRdOwkvKiA/PyAqLwotICB1bnNpZ25lZCBjaGFyIGdwX3ZhbHVlWzRdOwkvKiB2YWx1ZSBmb3IgZ3AgcmVnaXN0ZXIgKi8KLX0gQU9VVEhEUjsKLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLSNkZWZpbmUgQU9VVFNaIDU2Ci0jZGVmaW5lIEFPVVRIRFJTWiA1NgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLSAgdW5zaWduZWQgY2hhcglzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgdW5zaWduZWQgY2hhcglzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIHVuc2lnbmVkIGNoYXIJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICB1bnNpZ25lZCBjaGFyCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgdW5zaWduZWQgY2hhcglzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgdW5zaWduZWQgY2hhciByX3ZhZGRyWzRdOwotICB1bnNpZ25lZCBjaGFyIHJfYml0c1s0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDgKLQotLyogTUlQUyBFQ09GRiB1c2VzIGEgcGFja2VkIDggYnl0ZSBmb3JtYXQgZm9yIHJlbG9jcy4gIFRoZXNlIGNvbnN0YW50cwotICAgYXJlIHVzZWQgdG8gdW5wYWNrIHRoZSByX2JpdHMgZmllbGQuICAqLwotCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0JJRwkJMTYKLSNkZWZpbmUgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFCTAKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUcJCTgKLSNkZWZpbmUgUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZSBSRUxPQ19CSVRTMl9TWU1ORFhfU0hfTEVGVF9CSUcJCTAKLSNkZWZpbmUgUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfTElUVExFCTE2Ci0KLS8qIE9yaWdpbmFsbHksIEVDT0ZGIHVzZWQgZm91ciBiaXRzIGZvciB0aGUgcmVsb2MgdHlwZSBhbmQgaGFkIHRocmVlCi0gICByZXNlcnZlZCBiaXRzLiAgSXJpeCA0IGFkZGVkIGFub3RoZXIgYml0IGZvciB0aGUgcmVsb2MgdHlwZSwgd2hpY2gKLSAgIHdhcyBlYXN5IGJlY2F1c2UgaXQgd2FzIGJpZyBlbmRpYW4gYW5kIG9uZSBvZiB0aGUgc3BhcmUgYml0cyBiZWNhbWUKLSAgIHRoZSBuZXcgbW9zdCBzaWduaWZpY2FudCBiaXQuICBUbyBtYWtlIHRoaXMgYWxzbyB3b3JrIGZvciBsaXR0bGUKLSAgIGVuZGlhbiBFQ09GRiwgd2UgbmVlZCB0byB3cmFwIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgYml0cyBhcm91bmQgdG8KLSAgIGJlY29tZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIHJlbG9jIHR5cGUuICAqLwotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX0JJRwkJCTB4M0UKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9TSF9CSUcJCQkxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFCQkJMHg3OAotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRQkJMwotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFSElfTElUVExFCQkweDA0Ci0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUJCTIKLQotI2RlZmluZSBSRUxPQ19CSVRTM19FWFRFUk5fQklHCQkJMHgwMQotI2RlZmluZSBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFCQkweDgwCi0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICBJCi0gICBkb24ndCBrbm93IGlmIGFueSBvdGhlciB2YWx1ZXMgY2FuIGFwcGVhci4gIFRoZXNlIHNlZW0gdG8gYmUgYWxsCi0gICB0aGF0IG9jY3VyIGluIHRoZSBVbHRyaXggNC4yIGxpYnJhcmllcy4gICovCi0jZGVmaW5lIE1JUFNfUl9JR05PUkUJMAotI2RlZmluZSBNSVBTX1JfUkVGSEFMRgkxCi0jZGVmaW5lIE1JUFNfUl9SRUZXT1JECTIKLSNkZWZpbmUgTUlQU19SX0pNUEFERFIJMwotI2RlZmluZSBNSVBTX1JfUkVGSEkJNAotI2RlZmluZSBNSVBTX1JfUkVGTE8JNQotI2RlZmluZSBNSVBTX1JfR1BSRUwJNgotI2RlZmluZSBNSVBTX1JfTElURVJBTAk3Ci0KLS8qIFRoZXNlIHJlbG9jIHR5cGVzIGFyZSBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcKLSAgIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBUaGUgbnVtYmVycyBhcmUKLSAgIHRha2VuIGZyb20gSXJpeCA0LCBidXQgYXQgbGVhc3QgZm9yIGludGVybmFsIHJlbG9jcyBJcml4IDUgZG9lcyBub3QKLSAgIGdpdmUgdGhlbSB0aGUgc2FtZSBtZWFuaW5nLiAgRm9yIGFuIGludGVybmFsIHJlbG9jIHRoZSBzeW1ib2wgaW5kZXgKLSAgIG9mIFJFTEhJIGFuZCBSRUxMTyBpcyBtb2RpZmllZCBhcyBkZXNjcmliZWQgYmVsb3cgZm9yCi0gICBNSVBTX1JfU1dJVENILiAgKi8KLSNkZWZpbmUgTUlQU19SX1BDUkVMMTYJMTIKLSNkZWZpbmUgTUlQU19SX1JFTEhJCTEzCi0jZGVmaW5lIE1JUFNfUl9SRUxMTwkxNAotCi0vKiBUaGlzIHJlbG9jIHR5cGUgaXMgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uCi0gICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgaXMgdXNlZCBmb3IgYW4gZW50cnkgaW4KLSAgIGEgc3dpdGNoIHRhYmxlLCB3aGljaCBsb29rcyBsaWtlIHRoaXM6Ci0gICAgIC53b3JkICRMMy0kTFMxMgotICAgVGhlIG9iamVjdCBmaWxlIHdpbGwgY29udGFpbiB0aGUgY29ycmVjdCBkaWZmZXJlbmNlLCBhbmQgZG9lcyBub3QKLSAgIHJlcXVpcmUgYWRqdXN0bWVudC4gIEhvd2V2ZXIsIHdoZW4gdGhlIGxpbmtlciBpcyByZWxheGluZyBQQwotICAgcmVsYXRpdmUgY2FsbHMsIGl0IGlzIHBvc3NpYmxlIGZvciAkTDMgdG8gbW92ZSBmYXJ0aGVyIGF3YXkuICBUaGlzCi0gICByZWxvYyBhbHdheXMgYXBwZWFycyBpbiB0aGUgLnRleHQgc2VjdGlvbiwgYW5kIGlzIGFsd2F5cyBhZ2FpbnN0Ci0gICB0aGUgLnRleHQgc2VjdGlvbi4gIEhvd2V2ZXIsIHRoZSBzeW1ib2wgaW5kZXggaXMgbm90Ci0gICBSRUxPQ19TRUNUSU9OX1RFWFQuICBJdCBpcywgaW5zdGVhZCwgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcwotICAgc3dpdGNoIHRhYmxlIGVudHJ5IGFuZCAkTFMxMi4gIFRodXMsIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDEyIGlzCi0gICAgIHZhZGRyIC0gc3ltbmR4Ci0gICBhbmQgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMyBpcwotICAgICB2YWRkciAtIHN5bW5keCArIGFkZGVuZAotICAgd2hlcmUgYWRkZW5kIGlzIHRoZSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGZpbGUuICBLbm93aW5nIHRoaXMsIHRoZQotICAgbGlua2VyIGNhbiBrbm93IHdoZXRoZXIgdGhlIGFkZGVuZCBpbiB0aGUgb2JqZWN0IGZpbGUgbXVzdCBiZQotICAgYWRqdXN0ZWQuICAqLwotI2RlZmluZSBNSVBTX1JfU1dJVENICTIyCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNUQUJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTUlQU19JU19TVEFCIEVDT0ZGX0lTX1NUQUIKLSNkZWZpbmUgTUlQU19NQVJLX1NUQUIgRUNPRkZfTUFSS19TVEFCCi0jZGVmaW5lIE1JUFNfVU5NQVJLX1NUQUIgRUNPRkZfVU5NQVJLX1NUQUIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MSUMgSU5GT1JNQVRJT04gKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV3JpdHRlbiBieSBKb2huIEdpbG1vcmUuICAqLwotCi0vKiBFQ09GRiB1c2VzIENPRkYtbGlrZSBzZWN0aW9uIHN0cnVjdHVyZXMsIGJ1dCBpdHMgb3duIHN5bWJvbCBmb3JtYXQuCi0gICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3ltYm9sIGZvcm1hdCBpbiBmaWVsZHMgd2hvc2Ugc2l6ZSBhbmQgYWxpZ25tZW50Ci0gICB3aWxsIG5vdCB2YXJ5IG9uIGRpZmZlcmVudCBob3N0IHN5c3RlbXMuICAqLwotCi0vKiBGaWxlIGhlYWRlciBhcyBhIHNldCBvZiBieXRlcyAqLwotCi1zdHJ1Y3QgaGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhciAJaF9tYWdpY1syXTsKLQl1bnNpZ25lZCBjaGFyCWhfdnN0YW1wWzJdOwotCXVuc2lnbmVkIGNoYXIJaF9pbGluZU1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lkbk1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JEbk9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXBkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlBkT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3ltTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlN5bU9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaW9wdE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JPcHRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lhdXhNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiQXV4T2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3NNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3NPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc0V4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc0V4dE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWZkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkZkT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlJmZE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWV4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JFeHRPZmZzZXRbNF07Ci19OwotCi0vKiBGaWxlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBmZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWZfYWRyWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9yc3NbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lzc0Jhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NiU3NbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lzeW1CYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pbGluZUJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pb3B0QmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY29wdFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXBkRmlyc3RbMl07Ci0JdW5zaWduZWQgY2hhcglmX2NwZFsyXTsKLQl1bnNpZ25lZCBjaGFyCWZfaWF1eEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NhdXhbNF07Ci0JdW5zaWduZWQgY2hhcglmX3JmZEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NyZmRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJZl9iaXRzMlszXTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVbNF07Ci19OwotCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0JJRwkJMHhGOAotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9CSUcJCTMKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfTElUVExFCQkweDFGCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRQkwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9CSUcJCTB4MDQKLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUJCTB4MjAKLQotI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9CSUcJCTB4MDIKLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFCTB4NDAKLQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9CSUcJMHgwMQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUJMHg4MAotCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfQklHCQkweEMwCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfQklHCQk2Ci0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfTElUVExFCQkweDAzCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFCTAKLQotLyogV2UgaWdub3JlIHRoZSBgcmVzZXJ2ZWQnIGZpZWxkIGluIGJpdHMyLiAqLwotCi0vKiBQcm9jZWR1cmUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHBkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJcF9hZHJbNF07Ci0JdW5zaWduZWQgY2hhcglwX2lzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglwX2lsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2lvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZW9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX3BjcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9sbkxvd1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5IaWdoWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9jYkxpbmVPZmZzZXRbNF07Ci19OwotCi0vKiBSdW50aW1lIHByb2NlZHVyZSB0YWJsZSAqLwotCi1zdHJ1Y3QgcnBkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJcF9hZHJbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZXJlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfcGNyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX2lycHNzWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZXNlcnZlZFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZXhjZXB0aW9uX2luZm9bNF07Ci19OwotCi0vKiBMaW5lIG51bWJlcnMgKi8KLQotc3RydWN0IGxpbmVfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWxfbGluZVs0XTsKLX07Ci0KLS8qIFN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHN5bV9leHQgewotCXVuc2lnbmVkIGNoYXIJc19pc3NbNF07Ci0JdW5zaWduZWQgY2hhcglzX3ZhbHVlWzRdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czJbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMzWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzNFsxXTsKLX07Ci0KLSNkZWZpbmUJU1lNX0JJVFMxX1NUX0JJRwkJMHhGQwotI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfQklHCQkyCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9MSVRUTEUJCTB4M0YKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19CSUcJCTB4MDMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHCTMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX0xJVFRMRQkJMHhDMAotI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTElUVExFCQk2Ci0KLSNkZWZpbmUJU1lNX0JJVFMyX1NDX0JJRwkJMHhFMAotI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfQklHCQk1Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19MSVRUTEUJCTB4MDcKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFCTIKLQotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfQklHCQkweDEwCi0jZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9CSUcJCTB4MEYKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9MSVRUTEUJCTB4RjAKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFCTQKLQotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcJMAotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUJMTIKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZXh0X2V4dCB7Ci0JdW5zaWduZWQgY2hhcgllc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJZXNfaWZkWzJdOwotCXN0cnVjdAlzeW1fZXh0IGVzX2FzeW07Ci19OwotCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfQklHCQkweDgwCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfTElUVExFCQkweDAxCi0KLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHCTB4NDAKLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFCTB4MDIKLQotI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9CSUcJCTB4MjAKLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFCTB4MDQKLQotLyogRGVuc2UgbnVtYmVycyBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGRucl9leHQgewotCXVuc2lnbmVkIGNoYXIJZF9yZmRbNF07Ci0JdW5zaWduZWQgY2hhcglkX2luZGV4WzRdOwotfTsKLQotLyogUmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yICovCi0KLXN0cnVjdCByZmRfZXh0IHsKLSAgdW5zaWduZWQgY2hhcglyZmRbNF07Ci19OwotCi0vKiBPcHRpbWl6ZXIgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgb3B0X2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMVsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMyWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czNbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzNFsxXTsKLSAgc3RydWN0IHJuZHhfZXh0IG9fcm5keDsKLSAgdW5zaWduZWQgY2hhciBvX29mZnNldFs0XTsKLX07Ci0KLSNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRQkwCi0KLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9CSUcJMAotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9taXBzcGUuaCBiL2luY2x1ZGUvY29mZi9taXBzcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyN2Q5OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbWlwc3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBXaW5kb3dzIENFIHdpdGggTUlQUyBWUjQxMTEgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lIE1JUFNfQVJDSF9NQUdJQ19XSU5DRQkweDAxNjYgIC8qIFdpbmRvd3MgQ0UgLSBsaXR0bGUgZW5kaWFuICovCi0jZGVmaW5lIE1JUFNfUEVfTUFHSUMJCTB4MDEwYgotCi0jZGVmaW5lIE1JUFNCQURNQUcoeCkgXAotICgoeCkuZl9tYWdpYyE9TUlQU19BUkNIX01BR0lDX1dJTkNFKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyogZGVmaW5lIHNvbWUgTlQgZGVmYXVsdCB2YWx1ZXMgKi8KLS8qICAjZGVmaW5lIE5UX0lNQUdFX0JBU0UgICAgICAgIDB4NDAwMDAwIG1vdmVkIHRvIGludGVybmFsLmggKi8KLSNkZWZpbmUgTlRfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIE5UX0ZJTEVfQUxJR05NRU5UICAgIDB4MjAwCi0jZGVmaW5lIE5UX0RFRl9SRVNFUlZFICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIE5UX0RFRl9DT01NSVQgICAgICAgIDB4MTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQkJY2hhciB4X2NoZWNrc3VtWzRdOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSAqLwotCQljaGFyIHhfYXNzb2NpYXRlZFsyXTsJLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotCQljaGFyIHhfY29tZGF0WzFdOwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KLS8qIE1JUFMgUEUgcmVsb2NhdGlvbiB0eXBlcy4gKi8KLQotI2RlZmluZQlNSVBTX1JfQUJTT0xVVEUJMCAvKiBpZ25vcmVkICovCi0jZGVmaW5lCU1JUFNfUl9SRUZIQUxGCTEKLSNkZWZpbmUJTUlQU19SX1JFRldPUkQJMgotI2RlZmluZQlNSVBTX1JfSk1QQUREUgkzCi0jZGVmaW5lCU1JUFNfUl9SRUZISQk0IC8qIFBBSVIgZm9sbG93cyAqLwotI2RlZmluZQlNSVBTX1JfUkVGTE8JNQotI2RlZmluZQlNSVBTX1JfR1BSRUwJNgotI2RlZmluZQlNSVBTX1JfTElURVJBTAk3IC8qIHNhbWUgYXMgR1BSRUwgKi8KLSNkZWZpbmUJTUlQU19SX1NFQ1RJT04JMTAKLSNkZWZpbmUJTUlQU19SX1NFQ1JFTAkxMQotI2RlZmluZQlNSVBTX1JfU0VDUkVMTE8JMTIKLSNkZWZpbmUJTUlQU19SX1NFQ1JFTEhJCTEzIC8qIFBBSVIgZm9sbG93cyAqLwotI2RlZmluZQlNSVBTX1JfUlZBCTM0IC8qIDB4MjIgKi8KLSNkZWZpbmUJTUlQU19SX1BBSVIJMzcgLyogMHgyNSAtIHN5bW5keCBpcyByZWFsbHkgYSBzaWduZWQgMTYtYml0IGFkZGVuZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3BlLmggYi9pbmNsdWRlL2NvZmYvcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzMmVlOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKiBQRSBDT0ZGIGhlYWRlciBpbmZvcm1hdGlvbiAqLwotCi0jaWZuZGVmIF9QRV9ICi0jZGVmaW5lIF9QRV9ICi0KLS8qIE5UIHNwZWNpZmljIGZpbGUgYXR0cmlidXRlcy4gICovCi0jZGVmaW5lIElNQUdFX0ZJTEVfUkVMT0NTX1NUUklQUEVEICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgSU1BR0VfRklMRV9FWEVDVVRBQkxFX0lNQUdFICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBJTUFHRV9GSUxFX0xJTkVfTlVNU19TVFJJUFBFRCAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIElNQUdFX0ZJTEVfTE9DQUxfU1lNU19TVFJJUFBFRCAgICAgICAweDAwMDgKLSNkZWZpbmUgSU1BR0VfRklMRV9BR0dSRVNTSVZFX1dTX1RSSU0gICAgICAgIDB4MDAxMAotI2RlZmluZSBJTUFHRV9GSUxFX0xBUkdFX0FERFJFU1NfQVdBUkUgICAgICAgMHgwMDIwCi0jZGVmaW5lIElNQUdFX0ZJTEVfMTZCSVRfTUFDSElORSAgICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9MTyAgICAgICAgIDB4MDA4MAotI2RlZmluZSBJTUFHRV9GSUxFXzMyQklUX01BQ0hJTkUgICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9SRU1PVkFCTEVfUlVOX0ZST01fU1dBUCAgIDB4MDQwMAotI2RlZmluZSBJTUFHRV9GSUxFX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfRExMICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9VUF9TWVNURU1fT05MWSAgICAgICAgICAgIDB4NDAwMAotI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0hJICAgICAgICAgMHg4MDAwCi0KLS8qIEFkZGl0aW9uYWwgZmxhZ3MgdG8gYmUgc2V0IGZvciBzZWN0aW9uIGhlYWRlcnMgdG8gYWxsb3cgdGhlIE5UIGxvYWRlciB0bwotICAgcmVhZCBhbmQgd3JpdGUgdG8gdGhlIHNlY3Rpb24gZGF0YSAodG8gcmVwbGFjZSB0aGUgYWRkcmVzc2VzIG9mIGRhdGEgaW4KLSAgIGRsbHMgZm9yIG9uZSB0aGluZyk7IGFsc28gdG8gZXhlY3V0ZSB0aGUgc2VjdGlvbiBpbiAudGV4dCdzIGNhc2UuICAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFIDB4MDIwMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9FWEVDVVRFICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fUkVBRCAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1dSSVRFICAgICAgIDB4ODAwMDAwMDAKLQotLyogU2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MgYWRkZWQgZm9yIHBwYy1udC4gICovCi0KLSNkZWZpbmUgSU1BR0VfU0NOX1RZUEVfTk9fUEFEICAgICAgICAgICAgICAgIDB4MDAwMDAwMDggIC8qIFJlc2VydmVkLiAqLwotCi0jZGVmaW5lIElNQUdFX1NDTl9DTlRfQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUuICovCi0jZGVmaW5lIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSAgICAgICAweDAwMDAwMDQwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGluaXRpYWxpemVkIGRhdGEuICovCi0jZGVmaW5lIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBICAgICAweDAwMDAwMDgwICAvKiBTZWN0aW9uIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgZGF0YS4gKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fTE5LX09USEVSICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLyogUmVzZXJ2ZWQuICovCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfSU5GTyAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIG9yIHNvbWUgb3RoZXIgdHlwZSBvZiBpbmZvcm1hdGlvbi4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19SRU1PVkUgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFNlY3Rpb24gY29udGVudHMgd2lsbCBub3QgYmVjb21lIHBhcnQgb2YgaW1hZ2UuICovCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfQ09NREFUICAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAvKiBTZWN0aW9uIGNvbnRlbnRzIGNvbWRhdC4gKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0ZBUkRBVEEgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fUFVSR0VBQkxFICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fMTZCSVQgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fTE9DS0VEICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fUFJFTE9BRCAgICAgICAgICAgICAgICAweDAwMDgwMDAwCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzJCWVRFUyAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzRCWVRFUyAgICAgICAgICAgICAgIDB4MDAzMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMgICAgICAgICAgICAgIDB4MDA1MDAwMDAgIC8qIERlZmF1bHQgYWxpZ25tZW50IGlmIG5vIG90aGVycyBhcmUgc3BlY2lmaWVkLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUyAgICAgICAgICAgICAgMHgwMDYwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUyAgICAgICAgICAgICAgMHgwMDcwMDAwMAotCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfTlJFTE9DX09WRkwgICAgICAgICAgICAweDAxMDAwMDAwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGV4dGVuZGVkIHJlbG9jYXRpb25zLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9DQUNIRUQgICAgICAgICAgICAgMHgwNDAwMDAwMCAgLyogU2VjdGlvbiBpcyBub3QgY2FjaGFibGUuICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgICAgICAgICAgICAgIDB4MDgwMDAwMDAgIC8qIFNlY3Rpb24gaXMgbm90IHBhZ2VhYmxlLiAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fU0hBUkVEICAgICAgICAgICAgICAgICAweDEwMDAwMDAwICAvKiBTZWN0aW9uIGlzIHNoYXJlYWJsZS4gICAgICAgICAgICAgICAgICAqLwotCi0vKiBDT01EQVQgc2VsZWN0aW9uIGNvZGVzLiAgKi8KLQotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUyAgICAgKDEpIC8qIFdhcm4gaWYgZHVwbGljYXRlcy4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZCQkgICAgICgyKSAvKiBObyB3YXJuaW5nLiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkUJICAgICAoMykgLyogV2FybiBpZiBkaWZmZXJlbnQgc2l6ZS4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0gJICAgICAoNCkgLyogV2FybiBpZiBkaWZmZXJlbnQuICAqLwotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFCSAgICAgKDUpIC8qIEJhc2Ugb24gb3RoZXIgc2VjdGlvbi4gICovCi0KLS8qIE1hY2hpbmUgbnVtYmVycy4gICovCi0KLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1VOS05PV04gICAgICAgICAgIDB4MAotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfQUxQSEEgICAgICAgICAgICAgMHgxODQKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0FSTSAgICAgICAgICAgICAgIDB4MWMwCi0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9BTFBIQTY0ICAgICAgICAgICAweDI4NAotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NiAgICAgICAgICAgICAgMHgxNGMKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0lBNjQgICAgICAgICAgICAgIDB4MjAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9NNjhLICAgICAgICAgICAgICAweDI2OAotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfTUlQUzE2ICAgICAgICAgICAgMHgyNjYKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX01JUFNGUFUgICAgICAgICAgIDB4MzY2Ci0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9NSVBTRlBVMTYgICAgICAgICAweDQ2NgotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfUE9XRVJQQyAgICAgICAgICAgMHgxZjAKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1IzMDAwICAgICAgICAgICAgIDB4MTYyCi0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9SNDAwMCAgICAgICAgICAgICAweDE2NgotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfUjEwMDAwICAgICAgICAgICAgMHgxNjgKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1NIMyAgICAgICAgICAgICAgIDB4MWEyCi0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9TSDQgICAgICAgICAgICAgICAweDFhNgotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfVEhVTUIgICAgICAgICAgICAgMHgxYzIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLyogTWFnaWMgdmFsdWVzIHRoYXQgYXJlIHRydWUgZm9yIGFsbCBkb3MvbnQgaW1wbGVtZW50YXRpb25zICovCi0jZGVmaW5lIERPU01BR0lDICAgICAgIDB4NWE0ZCAgCi0jZGVmaW5lIE5UX1NJR05BVFVSRSAgIDB4MDAwMDQ1NTAKLQotICAvKiBOVCBhbGxvd3MgbG9uZyBmaWxlbmFtZXMsIHdlIHdhbnQgdG8gYWNjb21tb2RhdGUgdGhpcy4gIFRoaXMgbWF5IGJyZWFrCi0gICAgIHNvbWUgb2YgdGhlIGJmZCBmdW5jdGlvbnMgKi8KLSN1bmRlZiAgRklMTk1MRU4KLSNkZWZpbmUgRklMTk1MRU4JMTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfUEVJX2ZpbGVoZHIKLXsKLSAgLyogRE9TIGhlYWRlciBmaWVsZHMgKi8KLSAgY2hhciBlX21hZ2ljWzJdOwkJLyogTWFnaWMgbnVtYmVyLCAweDVhNGQgKi8KLSAgY2hhciBlX2NibHBbMl07CQkvKiBCeXRlcyBvbiBsYXN0IHBhZ2Ugb2YgZmlsZSwgMHg5MCAqLwotICBjaGFyIGVfY3BbMl07CQkJLyogUGFnZXMgaW4gZmlsZSwgMHgzICovCi0gIGNoYXIgZV9jcmxjWzJdOwkJLyogUmVsb2NhdGlvbnMsIDB4MCAqLwotICBjaGFyIGVfY3BhcmhkclsyXTsJCS8qIFNpemUgb2YgaGVhZGVyIGluIHBhcmFncmFwaHMsIDB4NCAqLwotICBjaGFyIGVfbWluYWxsb2NbMl07CQkvKiBNaW5pbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweDAgKi8KLSAgY2hhciBlX21heGFsbG9jWzJdOwkJLyogTWF4aW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCwgMHhGRkZGICovCi0gIGNoYXIgZV9zc1syXTsJCQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgU1MgdmFsdWUsIDB4MCAqLwotICBjaGFyIGVfc3BbMl07CQkJLyogSW5pdGlhbCBTUCB2YWx1ZSwgMHhiOCAqLwotICBjaGFyIGVfY3N1bVsyXTsJCS8qIENoZWNrc3VtLCAweDAgKi8KLSAgY2hhciBlX2lwWzJdOwkJCS8qIEluaXRpYWwgSVAgdmFsdWUsIDB4MCAqLwotICBjaGFyIGVfY3NbMl07CQkJLyogSW5pdGlhbCAocmVsYXRpdmUpIENTIHZhbHVlLCAweDAgKi8KLSAgY2hhciBlX2xmYXJsY1syXTsJCS8qIEZpbGUgYWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlLCAweDQwICovCi0gIGNoYXIgZV9vdm5vWzJdOwkJLyogT3ZlcmxheSBudW1iZXIsIDB4MCAqLwotICBjaGFyIGVfcmVzWzRdWzJdOwkJLyogUmVzZXJ2ZWQgd29yZHMsIGFsbCAweDAgKi8KLSAgY2hhciBlX29lbWlkWzJdOwkJLyogT0VNIGlkZW50aWZpZXIgKGZvciBlX29lbWluZm8pLCAweDAgKi8KLSAgY2hhciBlX29lbWluZm9bMl07CQkvKiBPRU0gaW5mb3JtYXRpb247IGVfb2VtaWQgc3BlY2lmaWMsIDB4MCAqLwotICBjaGFyIGVfcmVzMlsxMF1bMl07CQkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICBjaGFyIGVfbGZhbmV3WzRdOwkJLyogRmlsZSBhZGRyZXNzIG9mIG5ldyBleGUgaGVhZGVyLCAweDgwICovCi0gIGNoYXIgZG9zX21lc3NhZ2VbMTZdWzRdOwkvKiBvdGhlciBzdHVmZiwgYWx3YXlzIGZvbGxvdyBET1MgaGVhZGVyICovCi0gIGNoYXIgbnRfc2lnbmF0dXJlWzRdOwkJLyogcmVxdWlyZWQgTlQgc2lnbmF0dXJlLCAweDQ1NTAgKi8gCi0KLSAgLyogRnJvbSBzdGFuZGFyZCBoZWFkZXIgKi8gIAotCi0gIGNoYXIgZl9tYWdpY1syXTsJCS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIGNoYXIgZl9uc2Nuc1syXTsJCS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgY2hhciBmX3RpbWRhdFs0XTsJCS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBjaGFyIGZfc3ltcHRyWzRdOwkJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBjaGFyIGZfbnN5bXNbNF07CQkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgY2hhciBmX29wdGhkclsyXTsJCS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICBjaGFyIGZfZmxhZ3NbMl07CQkvKiBmbGFncwkJCSovCi0KLX07Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogVGhlIGZpbGVoZHIgaXMgb25seSB3ZWlyZCBpbiBpbWFnZXMuICAqLwotCi0jdW5kZWYgIEZJTEhEUgotI2RlZmluZSBGSUxIRFIgc3RydWN0IGV4dGVybmFsX1BFSV9maWxlaGRyCi0jdW5kZWYgIEZJTEhTWgotI2RlZmluZSBGSUxIU1ogMTUyCi0KLSNlbmRpZiAvKiBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIEFPVVRIRFIgc3RhbmRhcmQ7Ci0KLSAgLyogTlQgZXh0cmEgZmllbGRzOyBzZWUgaW50ZXJuYWwuaCBmb3IgZGVzY3JpcHRpb25zICovCi0gIGNoYXIgIEltYWdlQmFzZVs0XTsKLSAgY2hhciAgU2VjdGlvbkFsaWdubWVudFs0XTsKLSAgY2hhciAgRmlsZUFsaWdubWVudFs0XTsKLSAgY2hhciAgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIE1ham9ySW1hZ2VWZXJzaW9uWzJdOwotICBjaGFyICBNaW5vckltYWdlVmVyc2lvblsyXTsKLSAgY2hhciAgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBNaW5vclN1YnN5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIFJlc2VydmVkMVs0XTsKLSAgY2hhciAgU2l6ZU9mSW1hZ2VbNF07Ci0gIGNoYXIgIFNpemVPZkhlYWRlcnNbNF07Ci0gIGNoYXIgIENoZWNrU3VtWzRdOwotICBjaGFyICBTdWJzeXN0ZW1bMl07Ci0gIGNoYXIgIERsbENoYXJhY3RlcmlzdGljc1syXTsKLSAgY2hhciAgU2l6ZU9mU3RhY2tSZXNlcnZlWzRdOwotICBjaGFyICBTaXplT2ZTdGFja0NvbW1pdFs0XTsKLSAgY2hhciAgU2l6ZU9mSGVhcFJlc2VydmVbNF07Ci0gIGNoYXIgIFNpemVPZkhlYXBDb21taXRbNF07Ci0gIGNoYXIgIExvYWRlckZsYWdzWzRdOwotICBjaGFyICBOdW1iZXJPZlJ2YUFuZFNpemVzWzRdOwotICAvKiBJTUFHRV9EQVRBX0RJUkVDVE9SWSBEYXRhRGlyZWN0b3J5W0lNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTXTsgKi8KLSAgY2hhciAgRGF0YURpcmVjdG9yeVsxNl1bMl1bNF07IC8qIDE2IGVudHJpZXMsIDIgZWxlbWVudHMvZW50cnksIDQgY2hhcnMgKi8KLQotfSBQRUFPVVRIRFI7Ci0KLQotI3VuZGVmIEFPVVRTWgotI2RlZmluZSBBT1VUU1ogKEFPVVRIRFJTWiArIDE5NikKLQotI3VuZGVmICBFX0ZJTE5NTEVOCi0jZGVmaW5lIEVfRklMTk1MRU4JMTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotCi0vKiBJbXBvcnQgVHlvZXMgZm90IElMRiBmb3JtYXQgb2JqZWN0IGZpbGVzLi4gICovCi0jZGVmaW5lIElNUE9SVF9DT0RFCTAKLSNkZWZpbmUgSU1QT1JUX0RBVEEJMQotI2RlZmluZSBJTVBPUlRfQ09OU1QJMgotCi0vKiBJbXBvcnQgTmFtZSBUeW9lcyBmb3IgSUxGIGZvcm1hdCBvYmplY3QgZmlsZXMuICAqLwotI2RlZmluZSBJTVBPUlRfT1JESU5BTAkJMAotI2RlZmluZSBJTVBPUlRfTkFNRQkJMQotI2RlZmluZSBJTVBPUlRfTkFNRV9OT1BSRUZJWAkyCi0jZGVmaW5lIElNUE9SVF9OQU1FX1VOREVDT1JBVEUJMwotCi0jZW5kaWYgLyogX1BFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9wb3dlcnBjLmggYi9pbmNsdWRlL2NvZmYvcG93ZXJwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUyY2Y5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9wb3dlcnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogQmFzaWMgY29mZiBpbmZvcm1hdGlvbiBmb3IgdGhlIFBvd2VyUEMKLSAqCi0gKiBCYXNlZCBvbiBjb2ZmL3JzNjAwMC5oLCBjb2ZmL2kzODYuaCBhbmQgb3RoZXJzLgotICoKLSAqIEluaXRpYWwgcmVsZWFzZTogS2ltIEtudXR0aWxhIChrcmtAY3lnbnVzLmNvbSkKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0gIGNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBjaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotICBjaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0KLS8qIGV4dHJhIE5UIGRlZmluZXMgKi8KLSNkZWZpbmUgUFBDTUFHSUMgICAgICAgMDc2MCAgICAgICAgIC8qIHBlZWtlZCBvbiBhYSBQb3dlclBDIFdpbmRvd3MgTlQgYm94ICovCi0jZGVmaW5lIERPU01BR0lDICAgICAgIDB4NWE0ZCAgICAgICAvKiBmcm9tIGFybS5oLCBpMzg2LmggKi8KLSNkZWZpbmUgTlRfU0lHTkFUVVJFICAgMHgwMDAwNDU1MCAgIC8qIGZyb20gYXJtLmgsIGkzODYuaCAqLwotCi0vKiBmcm9tIHdpbm50LmggKi8KLSNkZWZpbmUgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDICAgICAgICAweDEwYgotCi0jZGVmaW5lIFBQQ0JBRE1BRyh4KSAoKHgpLmZfbWFnaWMgIT0gUFBDTUFHSUMpIAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLSAgY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkgICAgKi8KLSAgY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCSAgICAgICAgICAgICovCi0gIGNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJICAgICovCi0gIGNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkgICAgKi8KLSAgY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJICAgICovCi0gIGNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSAgICAqLwotICBjaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyAgICAqLwotICBjaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSAgICAqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwICovCi0gICAgY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJICAgICAgICovCi0gIH0gbF9hZGRyOwotICBjaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOCAgICAgLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUgICAgICAgKi8KLQotLyogQWxsb3cgdGhlIGZpbGUgbmFtZSBsZW5ndGggdG8gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgaW5jbHVkaW5nIGZpbGUgICAqLwotI2lmbmRlZiBFX0ZJTE5NTEVOCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQKLSNlbmRpZgotCi0jZGVmaW5lIEVfRElNTlVNCTQgICAgIC8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90YWduZHhbNF07CSAgICAgICAgICAgLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAgICAgICAqLwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7Ci0JY2hhciAgeF9sbm5vWzJdOyAgICAgICAgICAgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgICAgICAgICAqLwotCWNoYXIgIHhfc2l6ZVsyXTsgICAgICAgICAgIC8qIHN0ci91bmlvbi9hcnJheSBzaXplICAgICAgICAgICAgKi8KLSAgICAgIH0geF9sbnN6OwotICAgICAgY2hhciB4X2ZzaXplWzRdOwkgICAgICAgICAgIC8qIHNpemUgb2YgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KLSAgICB9IHhfbWlzYzsKLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewkJICAgICAgICAgICAvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgICAgICAgICAgICovCi0JY2hhciB4X2xubm9wdHJbNF07ICAgICAgICAgLyogcHRyIHRvIGZjbiBsaW5lICMgICAgICAgICAgICAgICAqLwotCWNoYXIgeF9lbmRuZHhbNF07CSAgIC8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAgICAgICAgKi8KLSAgICAgIH0geF9mY247Ci0gICAgICBzdHJ1Y3QgewkJICAgICAgICAgICAvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gICAgICAgICovCi0JY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgfSB4X2ZjbmFyeTsKLSAgICBjaGFyIHhfdHZuZHhbMl07CQkgICAvKiB0diBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0gICAgY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIHhfemVyb2VzWzRdOwotICAgICAgY2hhciB4X29mZnNldFs0XTsKLSAgICB9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF9zY25sZW5bNF07CSAgICAgICAgICAgLyogc2VjdGlvbiBsZW5ndGggICAgICAgICAgICAgICAgICAqLwotICAgIGNoYXIgeF9ucmVsb2NbMl07CSAgICAgICAgICAgLyogIyByZWxvY2F0aW9uIGVudHJpZXMgICAgICAgICAgICAqLwotICAgIGNoYXIgeF9ubGlubm9bMl07CSAgICAgICAgICAgLyogIyBsaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAqLwotICAgIGNoYXIgeF9jaGVja3N1bVs0XTsJCSAgIC8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtCSAgICAgICovCi0gICAgY2hhciB4X2Fzc29jaWF0ZWRbMl07CSAgIC8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLSAgICBjaGFyIHhfY29tZGF0WzFdOwkJICAgLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIJICAgICAgKi8KLSAgfSB4X3NjbjsKLX07Ci0KLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotI2RlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9yczYwMDAuaCBiL2luY2x1ZGUvY29mZi9yczYwMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlZjFkOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvcnM2MDAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyogSUJNIFJTLzYwMDAgIlhDT0ZGIiBmaWxlIGRlZmluaXRpb25zIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUgb2YgSUJNCi0gICBhbmQgSm9obiBHaWxtb3JlIG9mIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSAgICAgICAgLyogSUJNIFJTLzYwMDAgKi8KLSNkZWZpbmUgVTgwMldSTUFHSUMgICAgIDA3MzAgICAgLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKipjaGgqKiAgICAgICovCi0jZGVmaW5lIFU4MDJST01BR0lDICAgICAwNzM1ICAgIC8qIHJlYWRvbmx5IHNoYXJhYmxlIHRleHQgc2VnbWVudHMgICAgICAqLwotI2RlZmluZSBVODAyVE9DTUFHSUMgICAgMDczNyAgICAvKiByZWFkb25seSB0ZXh0IHNlZ21lbnRzIGFuZCBUT0MgICAgICAgKi8KLQotI2RlZmluZSBCQURNQUcoeCkJXAotCSgoeCkuZl9tYWdpYyAhPSBVODAyUk9NQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBVODAyV1JNQUdJQyAmJiBcCi0JICh4KS5mX21hZ2ljICE9IFU4MDJUT0NNQUdJQykKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICB1bnNpZ25lZCBjaGFyCW1hZ2ljWzJdOwkvKiB0eXBlIG9mIGZpbGUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJLyogdmVyc2lvbiBzdGFtcAkJKi8KLSAgdW5zaWduZWQgY2hhcgl0c2l6ZVs0XTsJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSAqLwotICB1bnNpZ25lZCBjaGFyCWRzaXplWzRdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs0XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCSovCi0gIHVuc2lnbmVkIGNoYXIJZW50cnlbNF07CS8qIGVudHJ5IHB0LgkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdGV4dF9zdGFydFs0XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyCWRhdGFfc3RhcnRbNF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglvX3RvY1s0XTsJLyogYWRkcmVzcyBvZiBUT0MgKi8KLSAgdW5zaWduZWQgY2hhcglvX3NuZW50cnlbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIGVudHJ5IHBvaW50ICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbnRleHRbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC50ZXh0IHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglvX3NuZGF0YVsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmRhdGEgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc250b2NbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIFRPQyAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25sb2FkZXJbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5sb2FkZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25ic3NbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5ic3Mgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fYWxnbnRleHRbMl07CS8qIC50ZXh0IGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCW9fYWxnbmRhdGFbMl07CS8qIC5kYXRhIGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCW9fbW9kdHlwZVsyXTsJLyogbW9kdWxlIHR5cGUgKD8/KSAqLwotICB1bnNpZ25lZCBjaGFyIG9fY3B1dHlwZVsyXTsJLyogY3B1IHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcglvX21heHN0YWNrWzRdOwkvKiBtYXggc3RhY2sgc2l6ZSAoPz8pICovCi0gIHVuc2lnbmVkIGNoYXIgb19tYXhkYXRhWzRdOwkvKiBtYXggZGF0YSBzaXplICg/PykgKi8KLSAgdW5zaWduZWQgY2hhcglvX3Jlc3YyWzEyXTsJLyogcmVzZXJ2ZWQgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDcyCi0jZGVmaW5lIFNNQUxMX0FPVVRTWiAoMjgpCi0jZGVmaW5lIEFPVVRIRFJTWiA3MgotCi0jZGVmaW5lCVJTNktfQU9VVEhEUl9PTUFHSUMJMHgwMTA3CS8qIG9sZDogdGV4dCAmIGRhdGEgd3JpdGVhYmxlICovCi0jZGVmaW5lCVJTNktfQU9VVEhEUl9OTUFHSUMJMHgwMTA4CS8qIG5ldzogdGV4dCByL28sIGRhdGEgci93ICovCi0jZGVmaW5lCVJTNktfQU9VVEhEUl9aTUFHSUMJMHgwMTBCCS8qIHBhZ2VkOiB0ZXh0IHIvbywgYm90aCBwYWdlLWFsaWduZWQgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1BBRAkiLnBhZCIKLSNkZWZpbmUgX0xPQURFUgkiLmxvYWRlciIKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyogWENPRkYgdXNlcyBhIHNwZWNpYWwgLmxvYWRlciBzZWN0aW9uIHdpdGggdHlwZSBTVFlQX0xPQURFUi4gICovCi0jZGVmaW5lIFNUWVBfTE9BREVSIDB4MTAwMAotCi0vKiBYQ09GRiB1c2VzIGEgc3BlY2lhbCAuZGVidWcgc2VjdGlvbiB3aXRoIHR5cGUgU1RZUF9ERUJVRy4gICovCi0jZGVmaW5lIFNUWVBfREVCVUcgMHgyMDAwCi0KLS8qIFhDT0ZGIGhhbmRsZXMgbGluZSBudW1iZXIgb3IgcmVsb2NhdGlvbiBvdmVyZmxvdyBieSBjcmVhdGluZwotICAgYW5vdGhlciBzZWN0aW9uIGhlYWRlciB3aXRoIFNUWVBfT1ZSRkxPIHNldC4gICovCi0jZGVmaW5lIFNUWVBfT1ZSRkxPIDB4ODAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0Jc3RydWN0IHsKLQkJdW5zaWduZWQgY2hhciB4X3Njbmxlbls0XTsKLQkJdW5zaWduZWQgY2hhciB4X3Bhcm1oYXNoWzRdOwotCQl1bnNpZ25lZCBjaGFyIHhfc25oYXNoWzJdOwotCQl1bnNpZ25lZCBjaGFyIHhfc210eXBbMV07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zbWNsYXNbMV07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zdGFiWzRdOwotCQl1bnNpZ25lZCBjaGFyIHhfc25zdGFiWzJdOwotCX0geF9jc2VjdDsKLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0jZGVmaW5lIERCWE1BU0sgMHg4MAkJLyogZm9yIGRieCBzdG9yYWdlIG1hc2sgKi8KLSNkZWZpbmUgU1lNTkFNRV9JTl9ERUJVRyhzeW1wdHIpICgoc3ltcHRyKS0+bl9zY2xhc3MgJiBEQlhNQVNLKQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfc2l6ZVsxXTsKLSAgY2hhciByX3R5cGVbMV07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KLSNkZWZpbmUgREVGQVVMVF9EQVRBX1NFQ1RJT05fQUxJR05NRU5UIDQKLSNkZWZpbmUgREVGQVVMVF9CU1NfU0VDVElPTl9BTElHTk1FTlQgNAotI2RlZmluZSBERUZBVUxUX1RFWFRfU0VDVElPTl9BTElHTk1FTlQgNAotLyogRm9yIG5ldyBzZWN0aW9ucyB3ZSBoYXZuJ3QgaGVhcmQgb2YgYmVmb3JlICovCi0jZGVmaW5lIERFRkFVTFRfU0VDVElPTl9BTElHTk1FTlQgNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3NoLmggYi9pbmNsdWRlL2NvZmYvc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNzFmMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEhpdGFjaGkgU0ggKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lCVNIX0FSQ0hfTUFHSUNfQklHCTB4MDUwMAotI2RlZmluZQlTSF9BUkNIX01BR0lDX0xJVFRMRQkweDA1NTAgIC8qIExpdHRsZSBlbmRpYW4gU0ggKi8KLSNkZWZpbmUgU0hfQVJDSF9NQUdJQ19XSU5DRQkweDAxYTIgIC8qIFdpbmRvd3MgQ0UgLSBsaXR0bGUgZW5kaWFuICovCi0jZGVmaW5lIFNIX1BFX01BR0lDCQkweDAxMGIKLQotCi0jZGVmaW5lIFNIQkFETUFHKHgpIFwKLSAoKCh4KS5mX21hZ2ljIT1TSF9BUkNIX01BR0lDX0JJRykgJiYgXAotICAoKHgpLmZfbWFnaWMhPVNIX0FSQ0hfTUFHSUNfV0lOQ0UpICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1TSF9BUkNIX01BR0lDX0xJVFRMRSkpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotLyogRGVmaW5lIHNvbWUgTlQgZGVmYXVsdCB2YWx1ZXMuICAqLwotLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAKLSNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotI2lmZGVmIENPRkZfV0lUSF9QRQotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLSNlbHNlCi0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotI2VuZGlmCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUJTElORVNaCTYKLSN1bmRlZiBHRVRfTElORU5PX0xOTk8KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSN1bmRlZiBQVVRfTElORU5PX0xOTk8KLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNlbHNlCi0jZGVmaW5lCUxJTkVTWgk4Ci0jZW5kaWYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQkJY2hhciB4X2NoZWNrc3VtWzRdOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSAqLwotCQljaGFyIHhfYXNzb2NpYXRlZFsyXTsJLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotCQljaGFyIHhfY29tZGF0WzFdOwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotI2Vsc2UKLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotI2VuZGlmCi0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUkVMU1ogMTAKLSNlbHNlCi0jZGVmaW5lIFJFTFNaIDE2Ci0jZW5kaWYKLQotLyogU0ggcmVsb2NhdGlvbiB0eXBlcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXJlIGFjdHVhbGx5IHVzZWQuICAqLwotCi0jZGVmaW5lIFJfU0hfVU5VU0VECTAJCS8qIG9ubHkgdXNlZCBpbnRlcm5hbGx5ICovCi0jZGVmaW5lIFJfU0hfSU1NMzJDRQkyCQkvKiAzMiBiaXQgaW1tZWRpYXRlIGZvciBXaW5DRSAqLwotI2RlZmluZSBSX1NIX1BDUkVMOCAJMwkJLyogIDggYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX1NIX1BDUkVMMTYgCTQJCS8qIDE2IGJpdCBwY3JlbCAJKi8KLSNkZWZpbmUgUl9TSF9ISUdIOCAgCTUJCS8qIGhpZ2ggOCBiaXRzIG9mIDI0IGJpdCBhZGRyZXNzICovCi0jZGVmaW5lIFJfU0hfTE9XMTYgCTcJCS8qIGxvdyAxNiBiaXRzIG9mIDI0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9JTU0yNAk2CQkvKiAyNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfUENESVNQOEJZNAk5ICAJCS8qIFBDIHJlbCA4IGJpdHMgKjQgK3ZlICovCi0jZGVmaW5lIFJfU0hfUENESVNQOEJZMgkxMCAgCQkvKiBQQyByZWwgOCBiaXRzICoyICt2ZSAqLwotI2RlZmluZSBSX1NIX1BDRElTUDggICAgMTEgIAkJLyogOCBiaXQgYnJhbmNoICovCi0jZGVmaW5lIFJfU0hfUENESVNQICAgICAxMiAgCQkvKiAxMiBiaXQgYnJhbmNoICovCi0jZGVmaW5lIFJfU0hfSU1NMzIgICAgICAxNCAgICAJCS8qIDMyIGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9JTU04ICAgCTE2CQkvKiA4IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9JTUFHRUJBU0UJMTYJCS8qIFdpbmRvd3MgQ0UgKi8KLSNkZWZpbmUgUl9TSF9JTU04QlkyICAgIDE3CQkvKiA4IGJpdCBpbW1lZGlhdGUgKjIgKi8KLSNkZWZpbmUgUl9TSF9JTU04Qlk0ICAgIDE4CQkvKiA4IGJpdCBpbW1lZGlhdGUgKjQgKi8KLSNkZWZpbmUgUl9TSF9JTU00ICAgCTE5CQkvKiA0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9JTU00QlkyICAgIDIwCQkvKiA0IGJpdCBpbW1lZGlhdGUgKjIgKi8KLSNkZWZpbmUgUl9TSF9JTU00Qlk0ICAgIDIxCQkvKiA0IGJpdCBpbW1lZGlhdGUgKjQgKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTElNTThCWTIgICAyMgkJLyogUEMgcmVsIDggYml0cyAqMiB1bnNpZ25lZCAqLwotI2RlZmluZSBSX1NIX1BDUkVMSU1NOEJZNCAgIDIzCQkvKiBQQyByZWwgOCBiaXRzICo0IHVuc2lnbmVkICovCi0jZGVmaW5lIFJfU0hfSU1NMTYgICAgICAyNCAgICAJCS8qIDE2IGJpdCBpbW1lZGlhdGUgKi8KLQotLyogVGhlIHN3aXRjaCB0YWJsZSByZWxvYyB0eXBlcyBhcmUgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGV5IGFyZQotICAgZ2VuZXJhdGVkIGZvciBleHByZXNzaW9ucyBzdWNoIGFzCi0gICAgIC53b3JkIEwxIC0gTDIKLSAgIFRoZSByX29mZnNldCBmaWVsZCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzCi0gICBhbmQgTDIuICAqLwotI2RlZmluZSBSX1NIX1NXSVRDSDgJMzMJCS8qIDggYml0IHN3aXRjaCB0YWJsZSBlbnRyeSAqLwotI2RlZmluZSBSX1NIX1NXSVRDSDE2CTI1CQkvKiAxNiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lIFJfU0hfU1dJVENIMzIJMjYJCS8qIDMyIGJpdCBzd2l0Y2ggdGFibGUgZW50cnkgKi8KLQotLyogVGhlIFVTRVMgcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSBjb21waWxlciB3aWxsCi0gICBnZW5lcmF0ZSAudXNlcyBwc2V1ZG8tb3BzIHdoZW4gaXQgZmluZHMgYSBmdW5jdGlvbiBjYWxsIHdoaWNoIGl0Ci0gICBjYW4gcmVsYXguICBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlIFVTRVMgcmVsb2MgaG9sZHMgdGhlIFBDCi0gICByZWxhdGl2ZSBvZmZzZXQgdG8gdGhlIGluc3RydWN0aW9uIHdoaWNoIGxvYWRzIHRoZSByZWdpc3RlciB1c2VkIGluCi0gICB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0jZGVmaW5lIFJfU0hfVVNFUwkyNwkJLyogLnVzZXMgcHNldWRvLW9wICovCi0KLS8qIFRoZSBDT1VOVCByZWxvYyB0eXBlIGlzIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhlIGFzc2VtYmxlciB3aWxsCi0gICBnZW5lcmF0ZSBDT1VOVCByZWxvY3MgZm9yIGFkZHJlc3NlcyByZWZlcnJlZCB0byBieSB0aGUgcmVnaXN0ZXIKLSAgIGxvYWRzIGFzc29jaWF0ZWQgd2l0aCBVU0VTIHJlbG9jcy4gIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUgQ09VTlQKLSAgIHJlbG9jIGhvbGRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFkZHJlc3MgaXMgcmVmZXJlbmNlZCBpbiB0aGUKLSAgIG9iamVjdCBmaWxlLiAgKi8KLSNkZWZpbmUgUl9TSF9DT1VOVAkyOAkJLyogQ291bnQgb2YgY29uc3RhbnQgcG9vbCB1c2VzICovCi0KLS8qIFRoZSBBTElHTiByZWxvYyB0eXBlIGlzIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhlIHJfb2Zmc2V0IGZpZWxkIGlzCi0gICB0aGUgcG93ZXIgb2YgdHdvIHRvIHdoaWNoIHN1YnNlcXVlbnQgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlCi0gICBtdXN0IGJlIGFsaWduZWQuICAqLwotI2RlZmluZSBSX1NIX0FMSUdOCTI5CQkvKiAuYWxpZ24gcHNldWRvLW9wICovCi0KLS8qIFRoZSBDT0RFIGFuZCBEQVRBIHJlbG9jIHR5cGVzIGFyZSB1c2VkIGZvciBhbGlnbmluZyBsb2FkIGFuZCBzdG9yZQotICAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgQ09ERSByZWxvYyBiZWZvcmUgYQotICAgYmxvY2sgb2YgaW5zdHJ1Y3Rpb25zLiAgSXQgd2lsbCBnZW5lcmF0ZSBhIERBVEEgcmVsb2MgYmVmb3JlIGRhdGEuCi0gICBBIHNlY3Rpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBhc3N1bWluZyBpdCBjb250YWlucyBkYXRhLCB1bmxlc3MgYQotICAgQ09ERSByZWxvYyBpcyBzZWVuLiAgVGhlIG9ubHkgcmVsZXZhbnQgcGllY2VzIG9mIGluZm9ybWF0aW9uIGluIHRoZQotICAgQ09ERSBhbmQgREFUQSByZWxvY3MgYXJlIHRoZSBzZWN0aW9uIGFuZCB0aGUgYWRkcmVzcy4gIFRoZSBzeW1ib2wKLSAgIGFuZCBvZmZzZXQgYXJlIG1lYW5pbmdsZXNzLiAgKi8KLSNkZWZpbmUgUl9TSF9DT0RFCTMwCQkvKiBzdGFydCBvZiBjb2RlICovCi0jZGVmaW5lIFJfU0hfREFUQQkzMQkJLyogc3RhcnQgb2YgZGF0YSAqLwotCi0vKiBUaGUgTEFCRUwgcmVsb2MgdHlwZSBpcyB1c2VkIGZvciBhbGlnbmluZyBsb2FkIGFuZCBzdG9yZQotICAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgTEFCRUwgcmVsb2MgZm9yIGVhY2gKLSAgIGxhYmVsIHdpdGhpbiBhIGJsb2NrIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvCi0gICBhdm9pZCBzd2FwcGluZyBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIHRoZSB0YXJnZXRzIG9mIGJyYW5jaGVzLiAgKi8KLSNkZWZpbmUgUl9TSF9MQUJFTAkzMgkJLyogbGFiZWwgKi8KLQotLyogTkI6IFJfU0hfU1dJVENIOCBpcyAzMyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3NwYXJjLmggYi9pbmNsdWRlL2NvZmYvc3BhcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhMjRmMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFNwYXJjLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGFuIGFtYWxnYW1hdGlvbiBvZiBzZXZlcmFsIHN0YW5kYXJkIGluY2x1ZGUgZmlsZXMgdGhhdAotICAgZGVmaW5lIGNvZmYgZm9ybWF0LCBzdWNoIGFzIGZpbGVoZHIuaCwgYW91dGhkci5oLCBhbmQgc28gZm9ydGguICBJbgotICAgYWRkaXRpb24sIGFsbCBkYXRhdHlwZXMgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgaW50byBjaGFyYWN0ZXIgYXJyYXlzIG9mCi0gICAocHJlc3VtZWQpIGVxdWl2YWxlbnQgc2l6ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgdGhpcyBmaWxlIGNhbgotICAgYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBzeXN0ZW1zIHdoaWxlIHN0aWxsIHlpZWxkaW5nIHRoZSBzYW1lIHJlc3VsdHMuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotICBjaGFyIGZfbWFnaWNbMl07CQkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnNbMl07CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXRbNF07CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0cls0XTsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zWzRdOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHJbMl07CQkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzWzJdOwkJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQkvKiByZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgKi8KLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQkvKiBmaWxlIGlzIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQkvKiBsaW5lIG51bWJlcnMgc3RyaXBwZWQgKi8KLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkJLyogbG9jYWwgc3ltYm9scyBzdHJpcHBlZCAqLwotCi0jZGVmaW5lIFNQQVJDTUFHSUMJKDA1NDApCi0KLS8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLwotCi0jZGVmaW5lIExZTlhDT0ZGTUFHSUMJKDA0MTUpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIG1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIgdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIgdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhciBkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhciBic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhciBlbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIHRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIgc19uYW1lWzhdOwkJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgY2hhciBzX3BhZGRyWzRdOwkJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhciBzX3ZhZGRyWzRdOwkJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICBjaGFyIHNfc2l6ZVs0XTsJCS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIGNoYXIgc19zY25wdHJbNF07CQkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyIHNfcmVscHRyWzRdOwkJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBjaGFyIHNfbG5ub3B0cls0XTsJCS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICBjaGFyIHNfbnJlbG9jWzJdOwkJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICBjaGFyIHNfbmxubm9bMl07CQkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGNoYXIgc19mbGFnc1s0XTsJCS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qIE5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucy4gKi8KLQotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1RWCSIudHYiCi0jZGVmaW5lIF9JTklUCSIuaW5pdCIKLSNkZWZpbmUgX0ZJTkkJIi5maW5pIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAgIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICAgZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAgIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gKi8KLQotc3RydWN0IGV4dGVybmFsX2xpbmVubwotewotICB1bmlvbiB7Ci0gICAgY2hhciBsX3N5bW5keFs0XTsJCS8qIGZuIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAgKi8KLSAgICBjaGFyIGxfcGFkZHJbNF07CQkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIgKi8KLSAgfSBsX2FkZHI7Ci0gIGNoYXIgbF9sbm5vWzJdOwkJLyogbGluZSBudW1iZXIgKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCSg2KQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgkoOCkJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkoMTQpCS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JKDQpCS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0jaWYgMCAvKiBvZiBkb3VidGZ1bCB2YWx1ZSAqLwotICAgIGNoYXIgZV9ucHRyWzJdWzRdOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfbGVhZGluZ196ZXJvWzFdOwotICAgICAgY2hhciBlX2RieF90eXBlWzFdOwotICAgICAgY2hhciBlX2RieF9kZXNjWzJdOwotICAgIH0gZV9kYng7Ci0jZW5kaWYKLSAgfSBlOwotCi0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLSAgY2hhciBwYWRkaW5nWzJdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudAotewotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90YWduZHhbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsKLQljaGFyICB4X2xubm9bMl07CS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JY2hhciAgeF9zaXplWzJdOwkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotICAgICAgfSB4X2xuc3o7Ci0gICAgICBjaGFyIHhfZnNpemVbNF07CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0gICAgfSB4X21pc2M7Ci0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLSAgICAgIH0geF9mY247Ci0gICAgICBzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgfSB4X2ZjbmFyeTsKLSAgICBjaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciB4X3plcm9lc1s0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXRbNF07Ci0gICAgfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfc2NubGVuWzRdOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICBjaGFyIHhfbnJlbG9jWzJdOwkJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICBjaGFyIHhfbmxpbm5vWzJdOwkJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3R2ZmlsbFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICBjaGFyIHhfdHZsZW5bMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgY2hhciB4X3R2cmFuWzJdWzJdOwkJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJCS8qIC50diBzZWN0aW9uIGluZm8gKGluIGF1eGVudCBvZiBzeW0gLnR2KSkgKi8KLQotICBjaGFyIHhfZmlsbFsyMF07CQkvKiBmb3JjZXMgdG8gMjAtYnl0ZSBzaXplICovCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkyMAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMjAKLQotI2RlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3NwYXJlWzJdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3N5bS5oIGIvaW5jbHVkZS9jb2ZmL3N5bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjIwNGFmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9zeW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vKiBEZWNsYXJhdGlvbnMgb2YgaW50ZXJuYWwgZm9ybWF0IG9mIE1JUFMgRUNPRkYgc3ltYm9scy4KLSAgIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgTUlQUyBDb21wdXRlciBTeXN0ZW1zIGFuZCBUaGlyZCBFeWUgU29mdHdhcmUuCi0gICBDaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0IGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIAotCi0gICBUaGlzIGZpbGUgaXMganVzdCBhZ2dyZWdhdGVkIHdpdGggdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgR05VCi0gICByZWxlYXNlOyBpdCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIEdBUywgR0RCLCBvciBvdGhlciBHTlUKLSAgIHByb2dyYW1zLiAgKi8KLQotLyoKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqIHwgQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkxLCAxOTkwIE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLnwKLSAqIHwgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuIGdyYW50cyByZXByb2R1Y3Rpb24gYW5kIHVzZSAgIHwKLSAqIHwgcmlnaHRzIHRvIGFsbCBwYXJ0aWVzLCBQUk9WSURFRCB0aGF0IHRoaXMgY29tbWVudCBpcyAgICAgIHwKLSAqIHwgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqLwotI2lmbmRlZiBfU1lNX0gKLSNkZWZpbmUgX1NZTV9ICi0KLS8qIChDKSBDb3B5cmlnaHQgMTk4NCBieSBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlIHJpZ2h0cyB0bwotICogYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzIG1haW50YWluZWQgaW4gdGhlIGNvcHkuCi0gKgotICogVGhpcmQgRXllIG1ha2VzIG5vIGNsYWltcyBhYm91dCB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGlzCi0gKiBzeW1ib2wgdGFibGUgdG8gYSBwYXJ0aWN1bGFyIHVzZS4KLSAqLwotCi0vKiAKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgVGhpcmQgRXllIFN5bWJvbCBUYWJsZS4KLSAqCi0gKiBTeW1ib2xzIGFyZSBhc3N1bWVkIHRvIGJlIGluICdlbmNvdW50ZXIgb3JkZXInIC0gaS5lLiB0aGUgb3JkZXIgdGhhdAotICogdGhlIHRoaW5ncyB0aGV5IHJlcHJlc2VudCB3ZXJlIGVuY291bnRlcmVkIGJ5IHRoZSBjb21waWxlci9hc3NlbWJsZXIvbG9hZGVyLgotICogRVhDRVBUIGZvciBnbG9iYWxzIQlUaGVzZSBhcmUgYXNzdW1lZCB0byBiZSBidW5jaGVkIHRvZ2V0aGVyLAotICogcHJvYmFibHkgcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgJ25vcm1hbCcgc3ltYm9sLiAgR2xvYmFscyBBUkUgc29ydGVkCi0gKiBpbiBhc2NlbmRpbmcgb3JkZXIuCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEEgYnJpZWYgd29yZCBhYm91dCBUaGlyZCBFeWUgbmFtaW5nL3VzZSBjb252ZW50aW9uczoKLSAqCi0gKiBBbGwgYXJyYXlzIGFuZCBpbmRleCdzIGFyZSAwIGJhc2VkLgotICogQWxsICJpZm9vTWF4IiB2YWx1ZXMgYXJlIHRoZSBoaWdoZXN0IGxlZ2FsIHZhbHVlIFBMVVMgT05FLiBUaGlzIG1ha2VzCi0gKiB0aGVtIGdvb2QgZm9yIGFsbG9jYXRpbmcgYXJyYXlzLCBldGMuIEFsbCBjaGVja3MgYXJlICJpZm9vIDwgaWZvb01heCIuCi0gKgotICogImlzeW0iCUluZGV4IGludG8gdGhlIFNZTWJvbCB0YWJsZS4KLSAqICJpcGQiCUluZGV4IGludG8gdGhlIFByb2NlZHVyZSBEZXNjcmlwdG9yIGFycmF5LgotICogImlmZCIJSW5kZXggaW50byB0aGUgRmlsZSBEZXNjcmlwdG9yIGFycmF5LgotICogImlzcyIJSW5kZXggaW50byBTdHJpbmcgU3BhY2UuCi0gKiAiY2IiCQlDb3VudCBvZiBCeXRlcy4KLSAqICJyZ1BkIglhcnJheSB3aG9zZSBkb21haW4gaXMgIjAuLmlwZE1heC0xIiBhbmQgUmFuR2UgaXMgUERSLgotICogInJnRmQiCWFycmF5IHdob3NlIGRvbWFpbiBpcyAiMC4uaWZkTWF4LTEiIGFuZCBSYW5HZSBpcyBGRFIuCi0gKi8KLQotCi0vKiAKLSAqIFN5bWJvbGljIEhlYWRlciAoSERSKSBzdHJ1Y3R1cmUuCi0gKiBBcyBsb25nIGFzIGFsbCB0aGUgcG9pbnRlcnMgYXJlIHNldCBjb3JyZWN0bHksCi0gKiB3ZSBkb24ndCBjYXJlIFdIQVQgb3JkZXIgdGhlIHZhcmlvdXMgc2VjdGlvbnMgY29tZSBvdXQgaW4hCi0gKgotICogQSBmaWxlIHByb2R1Y2VkIHNvbGVseSBmb3IgdGhlIHVzZSBvZiBDREIgd2lsbCBwcm9iYWJseSBOT1QgaGF2ZQotICogYW55IGluc3RydWN0aW9ucyBvciBkYXRhIGFyZWFzIGluIGl0LCBhcyB0aGVzZSBhcmUgYXZhaWxhYmxlCi0gKiBpbiB0aGUgb3JpZ2luYWwuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXNob3J0CW1hZ2ljOwkJLyogdG8gdmVyaWZ5IHZhbGlkaXR5IG9mIHRoZSB0YWJsZSAqLwotCXNob3J0CXZzdGFtcDsJCS8qIHZlcnNpb24gc3RhbXAgKi8KLQlsb25nCWlsaW5lTWF4OwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyAqLwotCWJmZF92bWEJY2JMaW5lOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGZvciBsaW5lIG51bWJlciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkxpbmVPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQlsb25nCWlkbk1heDsJCS8qIG1heCBpbmRleCBpbnRvIGRlbnNlIG51bWJlciB0YWJsZSAqLwotCWJmZF92bWEJY2JEbk9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IGRlbnNlIG51bWJlciB0YWJsZSAqLwotCWxvbmcJaXBkTWF4OwkJLyogbnVtYmVyIG9mIHByb2NlZHVyZXMgKi8KLQliZmRfdm1hCWNiUGRPZmZzZXQ7CS8qIG9mZnNldCB0byBwcm9jZWR1cmUgZGVzY3JpcHRvciB0YWJsZSAqLwotCWxvbmcJaXN5bU1heDsJLyogbnVtYmVyIG9mIGxvY2FsIHN5bWJvbHMgKi8KLQliZmRfdm1hCWNiU3ltT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgbG9jYWwgc3ltYm9scyovCi0JbG9uZwlpb3B0TWF4OwkvKiBtYXggaW5kZXggaW50byBvcHRpbWl6YXRpb24gc3ltYm9sIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiT3B0T2Zmc2V0OwkvKiBvZmZzZXQgdG8gb3B0aW1pemF0aW9uIHN5bWJvbCBlbnRyaWVzICovCi0JbG9uZwlpYXV4TWF4OwkvKiBudW1iZXIgb2YgYXV4aWxsYXJ5IHN5bWJvbCBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkF1eE9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGF1eGlsbGFyeSBzeW1ib2wgZW50cmllcyovCi0JbG9uZwlpc3NNYXg7CQkvKiBtYXggaW5kZXggaW50byBsb2NhbCBzdHJpbmdzICovCi0JYmZkX3ZtYQljYlNzT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgbG9jYWwgc3RyaW5ncyAqLwotCWxvbmcJaXNzRXh0TWF4OwkvKiBtYXggaW5kZXggaW50byBleHRlcm5hbCBzdHJpbmdzICovCi0JYmZkX3ZtYQljYlNzRXh0T2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgZXh0ZXJuYWwgc3RyaW5ncyAqLwotCWxvbmcJaWZkTWF4OwkJLyogbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkZkT2Zmc2V0OwkvKiBvZmZzZXQgdG8gZmlsZSBkZXNjcmlwdG9yIHRhYmxlICovCi0JbG9uZwljcmZkOwkJLyogbnVtYmVyIG9mIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYlJmZE9mZnNldDsJLyogb2Zmc2V0IHRvIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSAqLwotCWxvbmcJaWV4dE1heDsJLyogbWF4IGluZGV4IGludG8gZXh0ZXJuYWwgc3ltYm9scyAqLwotCWJmZF92bWEJY2JFeHRPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBleHRlcm5hbCBzeW1ib2wgZW50cmllcyovCi0JLyogSWYgeW91IGFkZCBtYWNoaW5lIGRlcGVuZGVudCBmaWVsZHMsIGFkZCB0aGVtIGhlcmUgKi8KLQl9IEhEUlIsICpwSERSUjsgCi0jZGVmaW5lIGNiSERSUiBzaXplb2YoSERSUikKLSNkZWZpbmUgaGRyTmlsICgocEhEUlIpMCkKLQotLyoKLSAqIFRoZSBGRFIgYW5kIFBEUiBzdHJ1Y3R1cmVzIHNwZWVkIG1hcHBpbmcgb2YgYWRkcmVzcyA8LT4gbmFtZS4KLSAqIFRoZXkgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgbWVtb3J5IG9yZGVyIGFuZCBhcmUga2VwdCBpbgotICogbWVtb3J5IGJ5IENEQiBhdCBydW50aW1lLgotICovCi0KLS8qIAotICogRmlsZSBEZXNjcmlwdG9yCi0gKgotICogVGhlcmUgaXMgb25lIG9mIHRoZXNlIGZvciBFVkVSWSBGSUxFLCB3aGV0aGVyIGNvbXBpbGVkIHdpdGgKLSAqIGZ1bGwgZGVidWdnaW5nIHN5bWJvbHMgb3Igbm90LiAgVGhlIG5hbWUgb2YgYSBmaWxlIHNob3VsZCBiZQotICogdGhlIHBhdGggbmFtZSBnaXZlbiB0byB0aGUgY29tcGlsZXIuCSBUaGlzIGFsbG93cyB0aGUgdXNlcgotICogdG8gc2ltcGx5IHNwZWNpZnkgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB3aGVyZSB0aGUgQ09NUElMRVMKLSAqIHdlcmUgZG9uZSwgYW5kIHdlIHdpbGwgYmUgYWJsZSB0byBmaW5kIHRoZWlyIGZpbGVzLgotICogQSBmaWVsZCB3aG9zZSBjb21tZW50IHN0YXJ0cyB3aXRoICJSIC0gIiBpbmRpY2F0ZXMgdGhhdCBpdCB3aWxsIGJlCi0gKiBzZXR1cCBhdCBydW50aW1lLgotICovCi10eXBlZGVmIHN0cnVjdCBmZHIgewotCWJmZF92bWEJYWRyOwkJLyogbWVtb3J5IGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIGZpbGUgKi8KLQlsb25nCXJzczsJCS8qIGZpbGUgbmFtZSAob2Ygc291cmNlLCBpZiBrbm93bikgKi8KLQlsb25nCWlzc0Jhc2U7CS8qIGZpbGUncyBzdHJpbmcgc3BhY2UgKi8KLQliZmRfdm1hCWNiU3M7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNzICovCi0JbG9uZwlpc3ltQmFzZTsJLyogYmVnaW5uaW5nIG9mIHN5bWJvbHMgKi8KLQlsb25nCWNzeW07CQkvKiBjb3VudCBmaWxlJ3Mgb2Ygc3ltYm9scyAqLwotCWxvbmcJaWxpbmVCYXNlOwkvKiBmaWxlJ3MgbGluZSBzeW1ib2xzICovCi0JbG9uZwljbGluZTsJCS8qIGNvdW50IG9mIGZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLQlsb25nCWlvcHRCYXNlOwkvKiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLQlsb25nCWNvcHQ7CQkvKiBjb3VudCBvZiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLQl1bnNpZ25lZCBzaG9ydCBpcGRGaXJzdDsvKiBzdGFydCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLQlzaG9ydAljcGQ7CQkvKiBjb3VudCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLQlsb25nCWlhdXhCYXNlOwkvKiBmaWxlJ3MgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLQlsb25nCWNhdXg7CQkvKiBjb3VudCBvZiBmaWxlJ3MgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLQlsb25nCXJmZEJhc2U7CS8qIGluZGV4IGludG8gdGhlIGZpbGUgaW5kaXJlY3QgdGFibGUgKi8KLQlsb25nCWNyZmQ7CQkvKiBjb3VudCBmaWxlIGluZGlyZWN0IGVudHJpZXMgKi8KLQl1bnNpZ25lZCBsYW5nOiA1OwkvKiBsYW5ndWFnZSBmb3IgdGhpcyBmaWxlICovCi0JdW5zaWduZWQgZk1lcmdlIDogMTsJLyogd2hldGhlciB0aGlzIGZpbGUgY2FuIGJlIG1lcmdlZCAqLwotCXVuc2lnbmVkIGZSZWFkaW4gOiAxOwkvKiB0cnVlIGlmIGl0IHdhcyByZWFkIGluIChub3QganVzdCBjcmVhdGVkKSAqLwotCXVuc2lnbmVkIGZCaWdlbmRpYW4gOiAxOy8qIGlmIHNldCwgd2FzIGNvbXBpbGVkIG9uIGJpZyBlbmRpYW4gbWFjaGluZSAqLwotCQkJCS8qCWF1eCdzIHdpbGwgYmUgaW4gY29tcGlsZSBob3N0J3Mgc2V4ICovCi0JdW5zaWduZWQgZ2xldmVsIDogMjsJLyogbGV2ZWwgdGhpcyBmaWxlIHdhcyBjb21waWxlZCB3aXRoICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQgOiAyMjsgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0JYmZkX3ZtYQljYkxpbmVPZmZzZXQ7CS8qIGJ5dGUgb2Zmc2V0IGZyb20gaGVhZGVyIGZvciB0aGlzIGZpbGUgbG4ncyAqLwotCWJmZF92bWEJY2JMaW5lOwkJLyogc2l6ZSBvZiBsaW5lcyBmb3IgdGhpcyBmaWxlICovCi0JfSBGRFIsICpwRkRSOwotI2RlZmluZSBjYkZEUiBzaXplb2YoRkRSKQotI2RlZmluZSBmZE5pbCAoKHBGRFIpMCkKLSNkZWZpbmUgaWZkTmlsIC0xCi0jZGVmaW5lIGlmZFRlbXAgMAotI2RlZmluZSBpbG5OaWwgLTEKLQotCi0vKiAKLSAqIFByb2NlZHVyZSBEZXNjcmlwdG9yCi0gKgotICogVGhlcmUgaXMgb25lIG9mIHRoZXNlIGZvciBFVkVSWSBURVhUIExBQkVMLgotICogSWYgYSBwcm9jZWR1cmUgaXMgaW4gYSBmaWxlIHdpdGggZnVsbCBzeW1ib2xzLCB0aGVuIGlzeW0KLSAqIHdpbGwgcG9pbnQgdG8gdGhlIFBST0Mgc3ltYm9scywgZWxzZSBpdCB3aWxsIHBvaW50IHRvIHRoZQotICogZ2xvYmFsIHN5bWJvbCBmb3IgdGhlIGxhYmVsLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHBkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBzdGFydCBvZiBwcm9jZWR1cmUgKi8KLQlsb25nCWlzeW07CQkvKiBzdGFydCBvZiBsb2NhbCBzeW1ib2wgZW50cmllcyAqLwotCWxvbmcJaWxpbmU7CQkvKiBzdGFydCBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQlsb25nCXJlZ21hc2s7CS8qIHNhdmUgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJcmVnb2Zmc2V0OwkvKiBzYXZlIHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJaW9wdDsJCS8qIHN0YXJ0IG9mIG9wdGltaXphdGlvbiBzeW1ib2wgZW50cmllcyovCi0JbG9uZwlmcmVnbWFzazsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBtYXNrICovCi0JbG9uZwlmcmVnb2Zmc2V0OwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJhbWVvZmZzZXQ7CS8qIGZyYW1lIHNpemUgKi8KLQlzaG9ydAlmcmFtZXJlZzsJLyogZnJhbWUgcG9pbnRlciByZWdpc3RlciAqLwotCXNob3J0CXBjcmVnOwkJLyogb2Zmc2V0IG9yIHJlZyBvZiByZXR1cm4gcGMgKi8KLQlsb25nCWxuTG93OwkJLyogbG93ZXN0IGxpbmUgaW4gdGhlIHByb2NlZHVyZSAqLwotCWxvbmcJbG5IaWdoOwkJLyogaGlnaGVzdCBsaW5lIGluIHRoZSBwcm9jZWR1cmUgKi8KLQliZmRfdm1hCWNiTGluZU9mZnNldDsJLyogYnl0ZSBvZmZzZXQgZm9yIHRoaXMgcHJvY2VkdXJlIGZyb20gdGhlIGZkIGJhc2UgKi8KLQkvKiBUaGVzZSBmaWVsZHMgYXJlIG5ldyBmb3IgNjQgYml0IEVDT0ZGLiAgKi8KLQl1bnNpZ25lZCBncF9wcm9sb2d1ZSA6IDg7IC8qIGJ5dGUgc2l6ZSBvZiBHUCBwcm9sb2d1ZSAqLwotCXVuc2lnbmVkIGdwX3VzZWQgOiAxOwkvKiB0cnVlIGlmIHRoZSBwcm9jZWR1cmUgdXNlcyBHUCAqLwotCXVuc2lnbmVkIHJlZ19mcmFtZSA6IDE7CS8qIHRydWUgaWYgcmVnaXN0ZXIgZnJhbWUgcHJvY2VkdXJlICovCi0JdW5zaWduZWQgcHJvZiA6IDE7CS8qIHRydWUgaWYgY29tcGlsZWQgd2l0aCAtcGcgKi8KLQl1bnNpZ25lZCByZXNlcnZlZCA6IDEzOwkvKiByZXNlcnZlZDogbXVzdCBiZSB6ZXJvICovCi0JdW5zaWduZWQgbG9jYWxvZmYgOiA4OwkvKiBvZmZzZXQgb2YgbG9jYWwgdmFyaWFibGVzIGZyb20gdmZwICovCi0JfSBQRFIsICpwUERSOwotI2RlZmluZSBjYlBEUiBzaXplb2YoUERSKQotI2RlZmluZSBwZE5pbCAoKHBQRFIpIDApCi0jZGVmaW5lIGlwZE5pbAktMQotCi0vKgotICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgcnVudGltZSBwcm9jZWR1cmUgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IHRoZSBsb2FkZXIKLSAqIGZvciB1c2UgYnkgdGhlIHN0YXRpYyBleGNlcHRpb24gc3lzdGVtLgotICovCi0vKgotICogSWYgMCdkIG91dCBiZWNhdXNlIGV4Y2VwdGlvbl9pbmZvIGNob2tlcyBWaXN1YWwgQysrIGFuZCBiZWNhdXNlIHRoZXJlCi0gKiBkb24ndCBzZWVtIHRvIGJlIGFueSByZWZlcmVuY2VzIHRvIHRoaXMgc3RydWN0dXJlIGVsc2V3aGVyZSBpbiBnZGIuCi0gKi8KLSNpZiAwCi10eXBlZGVmIHN0cnVjdCBydW50aW1lX3BkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBzdGFydCBvZiBwcm9jZWR1cmUgKi8KLQlsb25nCXJlZ21hc2s7CS8qIHNhdmUgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJcmVnb2Zmc2V0OwkvKiBzYXZlIHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJlZ21hc2s7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJZnJlZ29mZnNldDsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyYW1lb2Zmc2V0OwkvKiBmcmFtZSBzaXplICovCi0Jc2hvcnQJZnJhbWVyZWc7CS8qIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgKi8KLQlzaG9ydAlwY3JlZzsJCS8qIG9mZnNldCBvciByZWcgb2YgcmV0dXJuIHBjICovCi0JbG9uZwlpcnBzczsJCS8qIGluZGV4IGludG8gdGhlIHJ1bnRpbWUgc3RyaW5nIHRhYmxlICovCi0JbG9uZwlyZXNlcnZlZDsKLQlzdHJ1Y3QgZXhjZXB0aW9uX2luZm8gKmV4Y2VwdGlvbl9pbmZvOy8qIHBvaW50ZXIgdG8gZXhjZXB0aW9uIGFycmF5ICovCi19IFJQRFIsICpwUlBEUjsKLSNkZWZpbmUgY2JSUERSIHNpemVvZihSUERSKQotI2RlZmluZSBycGROaWwgKChwUlBEUikgMCkKLSNlbmRpZgotCi0vKgotICogTGluZSBOdW1iZXJzCi0gKgotICogTGluZSBOdW1iZXJzIGFyZSBzZWdyZWdhdGVkIGZyb20gdGhlIG5vcm1hbCBzeW1ib2xzIGJlY2F1c2UgdGhleQotICogYXJlIFsxXSBzbWFsbGVyICwgWzJdIGFyZSBvZiBubyBpbnRlcmVzdCB0byB5b3VyCi0gKiBhdmVyYWdlIGxvYWRlciwgYW5kIFszXSBhcmUgbmV2ZXIgbmVlZGVkIGluIHRoZSBtaWRkbGUgb2Ygbm9ybWFsCi0gKiBzY2FubmluZyBhbmQgdGhlcmVmb3JlIHNsb3cgdGhpbmdzIGRvd24uCi0gKgotICogQnkgZGVmaW5pdGlvbiwgdGhlIGZpcnN0IExJTkVSIGZvciBhbnkgZ2l2ZW4gcHJvY2VkdXJlIHdpbGwgaGF2ZQotICogdGhlIGZpcnN0IGxpbmUgb2YgYSBwcm9jZWR1cmUgYW5kIHJlcHJlc2VudCB0aGUgZmlyc3QgYWRkcmVzcy4KLSAqLwotCi10eXBlZGVmCWxvbmcgTElORVIsICpwTElORVI7Ci0jZGVmaW5lIGxpbmVOaWwgKChwTElORVIpMCkKLSNkZWZpbmUgY2JMSU5FUiBzaXplb2YoTElORVIpCi0jZGVmaW5lIGlsaW5lTmlsCS0xCi0KLQotCi0vKgotICogVGhlIFN5bWJvbCBTdHJ1Y3R1cmUJCShHRlcsIHRvIHRob3NlIHdobyBLbm93ISkKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JbG9uZwlpc3M7CQkvKiBpbmRleCBpbnRvIFN0cmluZyBTcGFjZSBvZiBuYW1lICovCi0JYmZkX3ZtYQl2YWx1ZTsJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotCXVuc2lnbmVkIHN0IDogNjsJLyogc3ltYm9sIHR5cGUgKi8KLQl1bnNpZ25lZCBzYyAgOiA1OwkvKiBzdG9yYWdlIGNsYXNzIC0gdGV4dCwgZGF0YSwgZXRjICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQgOiAxOwkvKiByZXNlcnZlZCAqLwotCXVuc2lnbmVkIGluZGV4IDogMjA7CS8qIGluZGV4IGludG8gc3ltL2F1eCB0YWJsZSAqLwotCX0gU1lNUiwgKnBTWU1SOwotI2RlZmluZSBzeW1OaWwgKChwU1lNUikwKQotI2RlZmluZSBjYlNZTVIgc2l6ZW9mKFNZTVIpCi0jZGVmaW5lIGlzeW1OaWwgLTEKLSNkZWZpbmUgaW5kZXhOaWwgMHhmZmZmZgotI2RlZmluZSBpc3NOaWwgLTEKLSNkZWZpbmUgaXNzTnVsbCAwCi0KLQotLyogVGhlIGZvbGxvd2luZyBjb252ZXJ0cyBhIG1lbW9yeSByZXNpZGVudCBzdHJpbmcgdG8gYW4gaXNzLgotICogVGhpcyBoYWNrIGlzIHJlY29nbml6ZWQgaW4gU2JGSXNzLCBpbiBzeW0uYyBvZiB0aGUgZGVidWdnZXIuCi0gKi8KLSNkZWZpbmUgSXNzRlNiKHNiKSAoMHg4MDAwMDAwMCB8ICgodW5zaWduZWQgbG9uZykoc2IpKSkKLQotLyogRSBYIFQgRSBSIE4gQSBMICAgUyBZIE0gQiBPIEwgIFIgRSBDIE8gUiBECi0gKgotICoJU2FtZSBhcyB0aGUgU1lNUiBleGNlcHQgaXQgY29udGFpbnMgZmlsZSBjb250ZXh0IHRvIGRldGVybWluZSB3aGVyZQotICoJdGhlIGluZGV4IGlzLgotICovCi10eXBlZGVmIHN0cnVjdCBlY29mZl9leHRyIHsKLQl1bnNpZ25lZCBqbXB0Ymw6MTsJLyogc3ltYm9sIGlzIGEganVtcCB0YWJsZSBlbnRyeSBmb3Igc2hsaWJzICovCi0JdW5zaWduZWQgY29ib2xfbWFpbjoxOwkvKiBzeW1ib2wgaXMgYSBjb2JvbCBtYWluIHByb2NlZHVyZSAqLwotCXVuc2lnbmVkIHdlYWtleHQ6MTsJLyogc3ltYm9sIGlzIHdlYWsgZXh0ZXJuYWwgKi8KLQl1bnNpZ25lZCByZXNlcnZlZDoxMzsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQlpbnQJaWZkOwkJLyogd2hlcmUgdGhlIGlzcyBhbmQgaW5kZXggZmllbGRzIHBvaW50IGludG8gKi8KLQlTWU1SCWFzeW07CQkvKiBzeW1ib2wgZm9yIHRoZSBleHRlcm5hbCAqLwotCX0gRVhUUiwgKnBFWFRSOwotI2RlZmluZSBleHROaWwgKChwRVhUUikwKQotI2RlZmluZSBjYkVYVFIgc2l6ZW9mKEVYVFIpCi0KLQotLyogQSBVIFggSSBMIEwgQSBSIFkgICBUIFkgUCBFCSBJIE4gRiBPIFIgTSBBIFQgSSBPIE4gKi8KLQotLyoKLSAqIFR5cGUgSW5mb3JtYXRpb24gUmVjb3JkCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBmQml0ZmllbGQgOiAxOyAvKiBzZXQgaWYgYml0IHdpZHRoIGlzIHNwZWNpZmllZCAqLwotCXVuc2lnbmVkIGNvbnRpbnVlZCA6IDE7IC8qIGluZGljYXRlcyBhZGRpdGlvbmFsIFRRIGluZm8gaW4gbmV4dCBBVVggKi8KLQl1bnNpZ25lZCBidCAgOiA2OwkvKiBiYXNpYyB0eXBlICovCi0JdW5zaWduZWQgdHE0IDogNDsKLQl1bnNpZ25lZCB0cTUgOiA0OwotCS8qIC0tLS0gMTYgYml0IGJvdW5kYXJ5IC0tLS0gKi8KLQl1bnNpZ25lZCB0cTAgOiA0OwotCXVuc2lnbmVkIHRxMSA6IDQ7CS8qIDYgdHlwZSBxdWFsaWZpZXJzIC0gdHFQdHIsIGV0Yy4gKi8KLQl1bnNpZ25lZCB0cTIgOiA0OwotCXVuc2lnbmVkIHRxMyA6IDQ7Ci0JfSBUSVIsICpwVElSOwotI2RlZmluZSBjYlRJUiBzaXplb2YoVElSKQotI2RlZmluZSB0aU5pbCAoKHBUSVIpMCkKLSNkZWZpbmUgaXRxTWF4IDYKLQotLyoKLSAqIFJlbGF0aXZlIHN5bWJvbCByZWNvcmQKLSAqCi0gKiBJZiB0aGUgcmZkIGZpZWxkIGlzIDQwOTUsIHRoZSBpbmRleCBmaWVsZCBpbmRleGVzIGludG8gdGhlIGdsb2JhbCBzeW1ib2wKLSAqCXRhYmxlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZAlyZmQgOiAxMjsgICAgLyogaW5kZXggaW50byB0aGUgZmlsZSBpbmRpcmVjdCB0YWJsZSAqLwotCXVuc2lnbmVkCWluZGV4IDogMjA7IC8qIGluZGV4IGludCBzeW0vYXV4L2lzcyB0YWJsZXMgKi8KLQl9IFJORFhSLCAqcFJORFhSOwotI2RlZmluZSBjYlJORFhSIHNpemVvZihSTkRYUikKLSNkZWZpbmUgcm5keE5pbCAoKHBSTkRYUikwKQotCi0vKiBkZW5zZSBudW1iZXJzIG9yIHNvbWV0aW1lcyBjYWxsZWQgYmxvY2sgbnVtYmVycyBhcmUgc3RvcmVkIGluIHRoaXMgdHlwZSwKLSAqCWEgcmZkIG9mIDB4ZmZmZmZmZmYgaXMgYW4gaW5kZXggaW50byB0aGUgZ2xvYmFsIHRhYmxlLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZwlyZmQ7ICAgIC8qIGluZGV4IGludG8gdGhlIGZpbGUgdGFibGUgKi8KLQl1bnNpZ25lZCBsb25nCWluZGV4OyAJLyogaW5kZXggaW50IHN5bS9hdXgvaXNzIHRhYmxlcyAqLwotCX0gRE5SLCAqcEROUjsKLSNkZWZpbmUgY2JETlIgc2l6ZW9mKEROUikKLSNkZWZpbmUgZG5OaWwgKChwRE5SKTApCi0KLQotCi0vKgotICogQXV4aWxsYXJ5IGluZm9ybWF0aW9uIG9jY3VycyBvbmx5IGlmIG5lZWRlZC4KLSAqIEl0IEFMV0FZUyBvY2N1cnMgaW4gdGhpcyBvcmRlciB3aGVuIHByZXNlbnQuCi0KLQkgICAgaXN5bU1hYwkJdXNlZCBieSBzdFByb2Mgb25seQotCSAgICBUSVIJCQl0eXBlIGluZm8KLQkgICAgVElSCQkJYWRkaXRpb25hbCBUUSBpbmZvIChpZiBmaXJzdCBUSVIgd2FzIG5vdCBlbm91Z2gpCi0JICAgIHJuZHgJCWlmIChidCA9PSBidFN0cnVjdCxidFVuaW9uLGJ0RW51bSxidFNldCxidFJhbmdlLAotCQkJCSAgICBidFR5cGVkZWYpOgotCQkJCSAgICByc3ltLmluZGV4ID09IGlhdXggZm9yIGJ0U2V0IG9yIGJ0UmFuZ2UKLQkJCQkgICAgZWxzZSByc3ltLmluZGV4ID09IGlzeW0KLQkgICAgZGltTG93CQlidFJhbmdlLCBidFNldAotCSAgICBkaW1NYWMJCWJ0UmFuZ2UsIGJ0U2V0Ci0JICAgIHJuZHgwCQlBcyBtYW55IGFzIHRoZXJlIGFyZSB0cSBhcnJheXMKLQkgICAgZGltTG93MAotCSAgICBkaW1IaWdoMAotCSAgICAuLi4KLQkgICAgcm5keE1heC0xCi0JICAgIGRpbUxvd01heC0xCi0JICAgIGRpbUhpZ2hNYXgtMQotCSAgICB3aWR0aCBpbiBiaXRzCWlmIChiaXQgZmllbGQpLCB3aWR0aCBpbiBiaXRzLgotICovCi0jZGVmaW5lIGNBdXhNYXggKDYgKyAoaWRpbU1heCozKSkKLQotLyogYSB1bmlvbiBvZiBhbGwgcG9zc2libGUgaW5mbyBpbiB0aGUgQVVYIHVuaXZlcnNlICovCi10eXBlZGVmIHVuaW9uIHsKLQlUSVIJdGk7CQkvKiB0eXBlIGluZm9ybWF0aW9uIHJlY29yZCAqLwotCVJORFhSCXJuZHg7CQkvKiByZWxhdGl2ZSBpbmRleCBpbnRvIHN5bWJvbCB0YWJsZSAqLwotCWxvbmcJZG5Mb3c7CQkvKiBsb3cgZGltZW5zaW9uICovCi0JbG9uZwlkbkhpZ2g7CQkvKiBoaWdoIGRpbWVuc2lvbiAqLwotCWxvbmcJaXN5bTsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCAoZW5kIG9mIHByb2MpICovCi0JbG9uZwlpc3M7CQkvKiBpbmRleCBpbnRvIHN0cmluZyBzcGFjZSAobm90IHVzZWQpICovCi0JbG9uZwl3aWR0aDsJCS8qIHdpZHRoIGZvciBub24tZGVmYXVsdCBzaXplZCBzdHJ1YyBmaWVsZHMgKi8KLQlsb25nCWNvdW50OwkJLyogY291bnQgb2YgcmFuZ2VzIGZvciB2YXJpYW50IGFybSAqLwotCX0gQVVYVSwgKnBBVVhVOwotI2RlZmluZSBjYkFVWFUgc2l6ZW9mKEFVWFUpCi0jZGVmaW5lIGF1eE5pbCAoKHBBVVhVKTApCi0jZGVmaW5lIGlhdXhOaWwgLTEKLQotCi0vKgotICogT3B0aW1pemF0aW9uIHN5bWJvbHMKLSAqCi0gKiBPcHRpbWl6YXRpb24gc3ltYm9scyBjb250YWluIHNvbWUgb3ZlcmxhcCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBub3JtYWwKLSAqIHN5bWJvbCB0YWJsZS4gSW4gcGFydGljdWxhciwgdGhlIHByb2MgaW5mb3JtYXRpb24KLSAqIGlzIHNvbWV3aGF0IHJlZHVuZGFudCBidXQgbmVjZXNzYXJ5IHRvIGVhc2lseSBmaW5kIHRoZSBvdGhlciBpbmZvcm1hdGlvbgotICogcHJlc2VudC4gCi0gKgotICogQWxsIG9mIHRoZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsYXN0IG90UHJvYwotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBvdDogODsJCS8qIG9wdGltaXphdGlvbiB0eXBlICovCi0JdW5zaWduZWQgdmFsdWU6IDI0OwkvKiBhZGRyZXNzIHdoZXJlIHdlIGFyZSBtb3ZpbmcgaXQgdG8gKi8KLQlSTkRYUglybmR4OwkJLyogcG9pbnRzIHRvIGEgc3ltYm9sIG9yIG9wdCBlbnRyeSAqLwotCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OwkvKiByZWxhdGl2ZSBvZmZzZXQgdGhpcyBvY2N1cmVkICovCi0JfSBPUFRSLCAqcE9QVFI7Ci0jZGVmaW5lIG9wdE5pbAkoKHBPUFRSKSAwKQotI2RlZmluZSBjYk9QVFIgc2l6ZW9mKE9QVFIpCi0jZGVmaW5lIGlvcHROaWwgLTEKLQotLyoKLSAqIEZpbGUgSW5kaXJlY3QKLSAqCi0gKiBXaGVuIGEgc3ltYm9sIGlzIHJlZmVyZW5jZWQgYWNyb3NzIGZpbGVzIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIHVzZWQ6Ci0gKgkxKSB1c2UgdGhlIGZpbGUgaW5kZXggdG8gZ2V0IHRoZSBGaWxlIGluZGlyZWN0IGVudHJ5LgotICoJMikgdXNlIHRoZSBmaWxlIGluZGlyZWN0IGVudHJ5IHRvIGdldCB0aGUgRmlsZSBkZXNjcmlwdG9yLgotICoJMykgYWRkIHRoZSBzeW0gaW5kZXggdG8gdGhlIGJhc2Ugb2YgdGhhdCBmaWxlJ3Mgc3ltIHRhYmxlCi0gKgotICovCi0KLXR5cGVkZWYgbG9uZyBSRkRULCAqcFJGRFQ7Ci0jZGVmaW5lIGNiUkZEVCBzaXplb2YoUkZEVCkKLSNkZWZpbmUgcmZkTmlsCS0xCi0KLS8qCi0gKiBUaGUgZmlsZSBpbmRpcmVjdCB0YWJsZSBpbiB0aGUgbWlwcyBsb2FkZXIgaXMga25vd24gYXMgYW4gYXJyYXkgb2YgRklUcy4KLSAqIFRoaXMgaXMgZG9uZSB0byBrZWVwIHRoZSBjb2RlIGluIHRoZSBsb2FkZXIgcmVhZGFibGUgaW4gdGhlIGFyZWEgd2hlcmUKLSAqIHRoZXNlIHRhYmxlcyBhcmUgbWVyZ2VkLiAgTm90ZSB0aGlzIGlzIG9ubHkgYSBuYW1lIGNoYW5nZS4KLSAqLwotdHlwZWRlZiBsb25nIEZJVCwgKnBGSVQ7Ci0jZGVmaW5lIGNiRklUCXNpemVvZihGSVQpCi0jZGVmaW5lIGlmaU5pbAktMQotI2RlZmluZSBmaU5pbAkoKHBGSVQpIDApCi0KLSNpZmRlZiBfTEFOR1VBR0VfUEFTQ0FMCi0jZGVmaW5lIGlmZE5pbCAtMQotI2RlZmluZSBpbG5OaWwgLTEKLSNkZWZpbmUgaXBkTmlsIC0xCi0jZGVmaW5lIGlsaW5lTmlsIC0xCi0jZGVmaW5lIGlzeW1OaWwgLTEKLSNkZWZpbmUgaW5kZXhOaWwgMTYjZmZmZmYKLSNkZWZpbmUgaXNzTmlsIC0xCi0jZGVmaW5lIGlzc051bGwgMAotI2RlZmluZSBpdHFNYXggNgotI2RlZmluZSBpYXV4TmlsIC0xCi0jZGVmaW5lIGlvcHROaWwgLTEKLSNkZWZpbmUgcmZkTmlsIC0xCi0jZGVmaW5lIGlmaU5pbCAtMQotI2VuZGlmCS8qIF9MQU5HVUFHRV9QQVNDQUwgKi8KLQotCi0vKiBEZW5zZSBudW1iZXJzCi0gKgotICogUmF0aGVyIHRoYW4gdXNlIGZpbGUgaW5kZXgsIHN5bWJvbCBpbmRleCBwYWlycyB0byByZXByZXNlbnQgc3ltYm9scwotICoJYW5kIGdsb2JhbHMsIHdlIHVzZSBkZW5zZSBudW1iZXIgc28gdGhhdCB0aGV5IGNhbiBiZSBlYXNpbHkgZW1iZWRlZAotICoJaW4gaW50ZXJtZWRpYXRlIGNvZGUgYW5kIHRoZSBwcm9ncmFtcyB0aGF0IHByb2Nlc3MgdGhlbSBjYW4KLSAqCXVzZSBkaXJlY3QgYWNjZXNzIHRhYmxzIGluc3RlYWQgb2YgaGFzaCB0YWJsZSAod2hpY2ggd291bGQgYmUKLSAqCW5lY2VzYXJ5IG90aGVyd2lzZSBiZWNhdXNlIG9mIHRoZSBzcGFyc2UgbmFtZSBzcGFjZSBjYXVzZWQgYnkKLSAqCWZpbGUgaW5kZXgsIHN5bWJvbCBpbmRleCBwYWlycy4gRGVuc2UgbnVtYmVyIGFyZSByZXByZXNlbnRlZAotICoJYnkgUk5EWFJzLgotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIHRhYmxlIGRlZmluZXMgdGhlIG1lYW5pbmcgb2YgZWFjaCBTWU0gZmllbGQgYXMKLSAqIGEgZnVuY3Rpb24gb2YgdGhlICJzdCIuIChzY0QvQiA9PSBzY0RhdGEgT1Igc2NCc3MpCi0gKgotICogTm90ZTogdGhlIHZhbHVlICJpc3ltTWFjIiBpcyB1c2VkIGJ5IHN5bWJvbHMgdGhhdCBoYXZlIHRoZSBjb25jZXB0Ci0gKiBvZiBlbmNsb3NpbmcgYSBibG9jayBvZiByZWxhdGVkIGluZm9ybWF0aW9uLgkgVGhpcyB2YWx1ZSBpcyB0aGUKLSAqIGlzeW0gb2YgdGhlIGZpcnN0IHN5bWJvbCBBRlRFUiB0aGUgZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeQotICogc3ltYm9sLiBGb3IgZXhhbXBsZSBpZiBhIHByb2NlZHVyZSB3YXMgYXQgaXN5bT09OTAgYW5kIGhhZCBhbgotICogaXN5bU1hYz09MTU1LCB0aGUgYXNzb2NpYXRlZCBlbmQgd291bGQgYmUgYXQgaXN5bT09MTU0LCBhbmQgdGhlCi0gKiBzeW1ib2wgYXQgMTU1IHdvdWxkIHByb2JhYmx5IChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkpIGJlIHRoZQotICogc3ltYm9sIGZvciB0aGUgbmV4dCBwcm9jZWR1cmUuICBUaGlzIGFsbG93cyByYXBpZCBza2lwcGluZyBvdmVyCi0gKiBpbnRlcm5hbCBpbmZvcm1hdGlvbiBvZiB2YXJpb3VzIHNvcnRzLiAic3RFbmQicyBBTFdBWVMgaGF2ZSB0aGUKLSAqIGlzeW0gb2YgdGhlIHByaW1hcnkgc3ltYm9sIHRoYXQgc3RhcnRlZCB0aGUgYmxvY2suCi0gKiAKLQotU1QJCVNDCVZBTFVFCQlJTkRFWAotLS0tLS0tLS0JLS0tLS0tCS0tLS0tLS0tCS0tLS0tLQotc3RGaWxlCQlzY1RleHQJYWRkcmVzcwkJaXN5bU1hYwotc3RMYWJlbAkJc2NUZXh0CWFkZHJlc3MJCS0tLQotc3RHbG9iYWwJc2NEL0IJYWRkcmVzcwkJaWF1eAotc3RTdGF0aWMJc2NEL0IJYWRkcmVzcwkJaWF1eAotc3RQYXJhbQkJc2NBYnMJb2Zmc2V0CQlpYXV4Ci1zdExvY2FsCQlzY0FicwlvZmZzZXQJCWlhdXgKLXN0UHJvYwkJc2NUZXh0CWFkZHJlc3MJCWlhdXgJKGlzeW1NYWMgaXMgZmlyc3QgQVVYKQotc3RTdGF0aWNQcm9jCXNjVGV4dAlhZGRyZXNzCQlpYXV4CShpc3ltTWFjIGlzIGZpcnN0IEFVWCkKLQotc3RNZW1iZXIJc2NOaWwJb3JkaW5hbAkJLS0tCShpZiBtZW1iZXIgb2YgZW51bSkKLQkobWlwc3JlYWQgdGhpbmtzIHRoZSBjYXNlIGJlbG93IGhhcyBhIGJpdCwgbm90IGJ5dGUsIG9mZnNldC4pCi1zdE1lbWJlcglzY05pbAlieXRlIG9mZnNldAlpYXV4CShpZiBtZW1iZXIgb2Ygc3RydWN0L3VuaW9uKQotc3RNZW1iZXIJc2NCaXRzCWJpdCBvZmZzZXQJaWF1eAkoYml0IGZpZWxkIHNwZWMpCi0KLXN0QmxvY2sJCXNjVGV4dAlhZGRyZXNzCQlpc3ltTWFjICh0ZXh0IGJsb2NrKQotCSh0aGUgY29kZSBzZWVtcyB0byB0aGluayB0aGF0IHJhdGhlciB0aGFuIHNjTmlsLCB3ZSBzZWUgc2NJbmZvIGZvcgotCSB0aGUgdHdvIGNhc2VzIGJlbG93LikKLXN0QmxvY2sJCXNjTmlsCWNiCQlpc3ltTWFjIChzdHJ1Y3QvdW5pb24gbWVtYmVyIGRlZmluZSkKLXN0QmxvY2sJCXNjTmlsCWNNZW1iZXJzCWlzeW1NYWMgKGVudW0gbWVtYmVyIGRlZmluZSkKLQotCShOZXcgdHlwZXMgYWRkZWQgYnkgU0dJIHRvIHNpbXBsaWZ5IHRoaW5nczopCi1zdFN0cnVjdAlzY0luZm8JY2IJCWlzeW1NYWMgKHN0cnVjdCB0eXBlIGRlZmluZSkKLXN0VW5pb24JCXNjSW5mbwljYgkJaXN5bU1hYyAodW5pb24gIHR5cGUgZGVmaW5lKQotc3RFbnVtCQlzY0luZm8JY01lbWJlcnMJaXN5bU1hYyAoZW51bSAgIHR5cGUgZGVmaW5lKQotCi1zdEVuZAkJc2NUZXh0CWFkZHJlc3MJCWlzeW1TdGFydAotc3RFbmQJCXNjTmlsCS0tLS0tLS0JCWlzeW1TdGFydCAoc3RydWN0L3VuaW9uL2VudW0pCi0KLXN0VHlwZWRlZglzY05pbAktLS0tLS0tCQlpYXV4Ci1zdFJlZ1JlbG9jCXNjPz8/CXZhbHVlCQlvbGQgcmVnaXN0ZXIgbnVtYmVyCi1zdEZvcndhcmQJc2M/Pz8JbmV3IGFkZHJlc3MJaXN5bSB0byBvcmlnaW5hbCBzeW1ib2wKLQotc3RDb25zdGFudAlzY0luZm8JdmFsdWUJCS0tLSAoc2NhbGFyKQotc3RDb25zdGFudAlzY0luZm8JaXNzCQktLS0gKGNvbXBsZXgsIGUuZy4gc3RyaW5nKQotCi0gKgotICovCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zeW1jb25zdC5oIGIvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGVlZjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIG9mIGNvbnN0YW50cyBmb3IgaW50ZXJuYWwgZm9ybWF0IG9mIE1JUFMgRUNPRkYgc3ltYm9scy4KLSAgIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgTUlQUyBDb21wdXRlciBTeXN0ZW1zIGFuZCBUaGlyZCBFeWUgU29mdHdhcmUuCi0gICBDaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0IGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KLQotICAgVGhpcyBmaWxlIGlzIGp1c3QgYWdncmVnYXRlZCB3aXRoIHRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIEdOVQotICAgcmVsZWFzZTsgaXQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiBHQVMsIEdEQiwgb3Igb3RoZXIgR05VCi0gICBwcm9ncmFtcy4gICovCi0KLS8qCi0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKiB8IENvcHlyaWdodCAoYykgMTk5MiwgMTk5MSwgMTk5MCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy58Ci0gKiB8IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgICB8Ci0gKiB8IHJpZ2h0cyB0byBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgICAgICB8Ci0gKiB8IG1haW50YWluZWQgaW4gdGhlIGNvcHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKi8KLQotLyogKEMpIENvcHlyaWdodCAxOTg0IGJ5IFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgcmlnaHRzIHRvCi0gKiBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4KLSAqCi0gKiBUaGlyZCBFeWUgbWFrZXMgbm8gY2xhaW1zIGFib3V0IHRoZSBhcHBsaWNhYmlsaXR5IG9mIHRoaXMKLSAqIHN5bWJvbCB0YWJsZSB0byBhIHBhcnRpY3VsYXIgdXNlLgotICovCi0KLS8qIGdsZXZlbHMgZm9yIGZpZWxkIGluIEZEUiAqLwotI2RlZmluZSBHTEVWRUxfMAkyCi0jZGVmaW5lIEdMRVZFTF8xCTEKLSNkZWZpbmUgR0xFVkVMXzIJMAkvKiBmb3IgdXB3YXJkIGNvbXBhdCByZWFzb25zLiAqLwotI2RlZmluZSBHTEVWRUxfMwkzCi0KLS8qIG1hZ2ljIG51bWJlciBmbyBzeW1oZWFkZXIgKi8KLSNkZWZpbmUgbWFnaWNTeW0JMHg3MDA5Ci0vKiBUaGUgQWxwaGEgdXNlcyB0aGlzIHZhbHVlIGluc3RlYWQsIGZvciBzb21lIHJlYXNvbi4gICovCi0jZGVmaW5lIG1hZ2ljU3ltMgkweDE5OTIKLQotLyogTGFuZ3VhZ2UgY29kZXMgKi8KLSNkZWZpbmUgbGFuZ0MJCTAJCi0jZGVmaW5lIGxhbmdQYXNjYWwJMQotI2RlZmluZSBsYW5nRm9ydHJhbgkyCi0jZGVmaW5lCWxhbmdBc3NlbWJsZXIJMwkvKiBvbmUgQXNzZW1ibGV5IGluc3QgbWlnaHQgbWFwIHRvIG1hbnkgbWFjaCAqLwotI2RlZmluZSBsYW5nTWFjaGluZQk0Ci0jZGVmaW5lIGxhbmdOaWwJCTUKLSNkZWZpbmUgbGFuZ0FkYQkJNgotI2RlZmluZSBsYW5nUGwxCQk3Ci0jZGVmaW5lIGxhbmdDb2JvbAk4Ci0jZGVmaW5lIGxhbmdTdGRjCTkJLyogRklYTUU6IENvbGxpZGVzIHdpdGggU0dJIGxhbmdDcGx1c3BsdXMgKi8KLSNkZWZpbmUgbGFuZ0NwbHVzcGx1cwk5CS8qIEZJWE1FOiBDb2xsaWRlcyB3aXRoIGxhbmdTdGRjICovCi0jZGVmaW5lIGxhbmdDcGx1c3BsdXNWMgkxMAkvKiBTR0kgYWRkaXRpb24gKi8KLSNkZWZpbmUgbGFuZ01heAkJMTEJLyogbWF4aW11biBhbGxvd2VkIDMyIC0tIDUgYml0cyAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSB2YWx1ZSBkZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkcyBpbiB0aGUgU1lNUiAqLwotCi0vKgotICogU3RvcmFnZSBDbGFzc2VzCi0gKi8KLQotI2RlZmluZSBzY05pbAkJMAotI2RlZmluZSBzY1RleHQJCTEJLyogdGV4dCBzeW1ib2wgKi8KLSNkZWZpbmUgc2NEYXRhCQkyCS8qIGluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0jZGVmaW5lIHNjQnNzCQkzCS8qIHVuLWluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0jZGVmaW5lIHNjUmVnaXN0ZXIJNAkvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgcmVnaXN0ZXIgbnVtYmVyICovCi0jZGVmaW5lIHNjQWJzCQk1CS8qIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLwotI2RlZmluZSBzY1VuZGVmaW5lZAk2CS8qIHdobyBrbm93cz8gKi8KLSNkZWZpbmUgc2NDZGJMb2NhbAk3CS8qIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gc2UtPnZhLj8/ICovCi0jZGVmaW5lIHNjQml0cwkJOAkvKiB0aGlzIGlzIGEgYml0IGZpZWxkICovCi0jZGVmaW5lIHNjQ2RiU3lzdGVtCTkJLyogdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBDREIncyBhZGRyZXNzIHNwYWNlICovCi0jZGVmaW5lIHNjRGJ4CQk5CS8qIG92ZXJsYXAgZGJ4IGludGVybmFsIHVzZSAqLwotI2RlZmluZSBzY1JlZ0ltYWdlCTEwCS8qIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrICovCi0jZGVmaW5lIHNjSW5mbwkJMTEJLyogc3ltYm9sIGNvbnRhaW5zIGRlYnVnZ2VyIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIHNjVXNlclN0cnVjdAkxMgkvKiBhZGRyZXNzIGluIHN0cnVjdCB1c2VyIGZvciBjdXJyZW50IHByb2Nlc3MgKi8KLSNkZWZpbmUgc2NTRGF0YQkJMTMJLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgZGF0YSAqLwotI2RlZmluZSBzY1NCc3MJCTE0CS8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGNvbW1vbiAqLwotI2RlZmluZSBzY1JEYXRhCQkxNQkvKiBsb2FkIHRpbWUgb25seSByZWFkIG9ubHkgZGF0YSAqLwotI2RlZmluZSBzY1ZhcgkJMTYJLyogVmFyIHBhcmFtZXRlciAoZm9ydHJhbixwYXNjYWwpICovCi0jZGVmaW5lIHNjQ29tbW9uCTE3CS8qIGNvbW1vbiB2YXJpYWJsZSAqLwotI2RlZmluZSBzY1NDb21tb24JMTgJLyogc21hbGwgY29tbW9uICovCi0jZGVmaW5lIHNjVmFyUmVnaXN0ZXIJMTkJLyogVmFyIHBhcmFtZXRlciBpbiBhIHJlZ2lzdGVyICovCi0jZGVmaW5lIHNjVmFyaWFudAkyMAkvKiBWYXJpYW50IHJlY29yZCAqLwotI2RlZmluZSBzY1NVbmRlZmluZWQJMjEJLyogc21hbGwgdW5kZWZpbmVkKGV4dGVybmFsKSBkYXRhICovCi0jZGVmaW5lIHNjSW5pdAkJMjIJLyogLmluaXQgc2VjdGlvbiBzeW1ib2wgKi8KLSNkZWZpbmUgc2NCYXNlZFZhcgkyMwkvKiBGb3J0cmFuIG9yIFBMLzEgcHRyIGJhc2VkIHZhciAqLyAKLSNkZWZpbmUgc2NYRGF0YSAgICAgICAgIDI0ICAgICAgLyogZXhjZXB0aW9uIGhhbmRsaW5nIGRhdGEgKi8KLSNkZWZpbmUgc2NQRGF0YSAgICAgICAgIDI1ICAgICAgLyogUHJvY2VkdXJlIHNlY3Rpb24gKi8KLSNkZWZpbmUgc2NGaW5pICAgICAgICAgIDI2ICAgICAgLyogLmZpbmkgc2VjdGlvbiAqLwotI2RlZmluZSBzY1JDb25zdAkyNwkvKiAucmNvbnN0IHNlY3Rpb24gKi8KLSNkZWZpbmUgc2NNYXgJCTMyCi0KLQotLyoKLSAqICAgU3ltYm9sIFR5cGVzCi0gKi8KLQotI2RlZmluZSBzdE5pbAkJMAkvKiBOdXRoaW4nIHNwZWNpYWwgKi8KLSNkZWZpbmUgc3RHbG9iYWwJMQkvKiBleHRlcm5hbCBzeW1ib2wgKi8KLSNkZWZpbmUgc3RTdGF0aWMJMgkvKiBzdGF0aWMgKi8KLSNkZWZpbmUgc3RQYXJhbQkJMwkvKiBwcm9jZWR1cmUgYXJndW1lbnQgKi8KLSNkZWZpbmUgc3RMb2NhbAkJNAkvKiBsb2NhbCB2YXJpYWJsZSAqLwotI2RlZmluZSBzdExhYmVsCQk1CS8qIGxhYmVsICovCi0jZGVmaW5lIHN0UHJvYwkJNgkvKiAgICAgIiAgICAgICIJIFByb2NlZHVyZSAqLwotI2RlZmluZSBzdEJsb2NrCQk3CS8qIGJlZ2lubm5pbmcgb2YgYmxvY2sgKi8KLSNkZWZpbmUgc3RFbmQJCTgJLyogZW5kIChvZiBhbnl0aGluZykgKi8KLSNkZWZpbmUgc3RNZW1iZXIJOQkvKiBtZW1iZXIgKG9mIGFueXRoaW5nCS0gc3RydWN0L3VuaW9uL2VudW0gKi8KLSNkZWZpbmUgc3RUeXBlZGVmCTEwCS8qIHR5cGUgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBzdEZpbGUJCTExCS8qIGZpbGUgbmFtZSAqLwotI2RlZmluZSBzdFJlZ1JlbG9jCTEyCS8qIHJlZ2lzdGVyIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgc3RGb3J3YXJkCTEzCS8qIGZvcndhcmRpbmcgYWRkcmVzcyAqLwotI2RlZmluZSBzdFN0YXRpY1Byb2MJMTQJLyogbG9hZCB0aW1lIG9ubHkgc3RhdGljIHByb2NzICovCi0jZGVmaW5lIHN0Q29uc3RhbnQJMTUJLyogY29uc3QgKi8KLSNkZWZpbmUgc3RTdGFQYXJhbQkxNgkvKiBGb3J0cmFuIHN0YXRpYyBwYXJhbWV0ZXJzICovCi0gICAgLyogVGhlc2UgbmV3IHN5bWJvbCB0eXBlcyBoYXZlIGJlZW4gcmVjZW50bHkgYWRkZWQgdG8gU0dJIG1hY2hpbmVzLiAqLwotI2RlZmluZSBzdFN0cnVjdAkyNgkvKiBCZWdpbm5pbmcgb2YgYmxvY2sgZGVmaW5pbmcgYSBzdHJ1Y3QgdHlwZSAqLwotI2RlZmluZSBzdFVuaW9uCQkyNwkvKiBCZWdpbm5pbmcgb2YgYmxvY2sgZGVmaW5pbmcgYSB1bmlvbiB0eXBlICovCi0jZGVmaW5lIHN0RW51bQkJMjgJLyogQmVnaW5uaW5nIG9mIGJsb2NrIGRlZmluaW5nIGFuIGVudW0gdHlwZSAqLwotI2RlZmluZSBzdEluZGlyZWN0CTM0CS8qIEluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICAgIC8qIFBzZXVkby1zeW1ib2xzIC0gaW50ZXJuYWwgdG8gZGVidWdnZXIgKi8KLSNkZWZpbmUgc3RTdHIJCTYwCS8qIHN0cmluZyAqLwotI2RlZmluZSBzdE51bWJlcgk2MQkvKiBwdXJlIG51bWJlciAoaWUuIDQgTk9SIDIrMikgKi8KLSNkZWZpbmUgc3RFeHByCQk2MgkvKiAyKzIgdnMuIDQgKi8KLSNkZWZpbmUgc3RUeXBlCQk2MwkvKiBwb3N0LWNvZXJzaW9uIFNFUiAqLwotI2RlZmluZSBzdE1heAkJNjQKLQotLyogZGVmaW5pdGlvbnMgZm9yIGZpZWxkcyBpbiBUSVIgKi8KLQotLyogdHlwZSBxdWFsaWZpZXJzIGZvciB0aS50cTAgLT4gdGkuKGl0cU1heC0xKSAqLwotI2RlZmluZSB0cU5pbAkwCS8qIGJ0IGlzIHdoYXQgeW91IHNlZSAqLwotI2RlZmluZSB0cVB0cgkxCS8qIHBvaW50ZXIgKi8KLSNkZWZpbmUgdHFQcm9jCTIJLyogcHJvY2VkdXJlICovCi0jZGVmaW5lIHRxQXJyYXkgMwkvKiBkdWggKi8KLSNkZWZpbmUgdHFGYXIJNAkvKiBsb25nZXIgYWRkcmVzc2luZyAtIDgwODYvOCBsYW5kICovCi0jZGVmaW5lIHRxVm9sCTUJLyogdm9sYXRpbGUgKi8KLSNkZWZpbmUgdHFDb25zdCA2CS8qIGNvbnN0ICovCi0jZGVmaW5lIHRxTWF4CTgKLQotLyogYmFzaWMgdHlwZXMgYXMgc2VlbiBpbiB0aS5idCAqLwotI2RlZmluZSBidE5pbAkJMAkvKiB1bmRlZmluZWQgKGFsc28sIGVudW0gbWVtYmVycykgKi8KLSNkZWZpbmUgYnRBZHIJCTEJLyogYWRkcmVzcyAtIGludGVnZXIgc2FtZSBzaXplIGFzIHBvaW50ZXIgKi8KLSNkZWZpbmUgYnRDaGFyCQkyCS8qIGNoYXJhY3RlciAqLwotI2RlZmluZSBidFVDaGFyCQkzCS8qIHVuc2lnbmVkIGNoYXJhY3RlciAqLwotI2RlZmluZSBidFNob3J0CQk0CS8qIHNob3J0ICovCi0jZGVmaW5lIGJ0VVNob3J0CTUJLyogdW5zaWduZWQgc2hvcnQgKi8KLSNkZWZpbmUgYnRJbnQJCTYJLyogaW50ICovCi0jZGVmaW5lIGJ0VUludAkJNwkvKiB1bnNpZ25lZCBpbnQgKi8KLSNkZWZpbmUgYnRMb25nCQk4CS8qIGxvbmcgKi8KLSNkZWZpbmUgYnRVTG9uZwkJOQkvKiB1bnNpZ25lZCBsb25nICovCi0jZGVmaW5lIGJ0RmxvYXQJCTEwCS8qIGZsb2F0IChyZWFsKSAqLwotI2RlZmluZSBidERvdWJsZQkxMQkvKiBEb3VibGUgKHJlYWwpICovCi0jZGVmaW5lIGJ0U3RydWN0CTEyCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLwotI2RlZmluZSBidFVuaW9uCQkxMwkvKiBVbmlvbiAodmFyaWFudCkgKi8KLSNkZWZpbmUgYnRFbnVtCQkxNAkvKiBFbnVtZXJhdGVkICovCi0jZGVmaW5lIGJ0VHlwZWRlZgkxNQkvKiBkZWZpbmVkIHZpYSBhIHR5cGVkZWYsIGlzeW1SZWYgcG9pbnRzICovCi0jZGVmaW5lIGJ0UmFuZ2UJCTE2CS8qIHN1YnJhbmdlIG9mIGludCAqLwotI2RlZmluZSBidFNldAkJMTcJLyogcGFzY2FsIHNldHMgKi8KLSNkZWZpbmUgYnRDb21wbGV4CTE4CS8qIGZvcnRyYW4gY29tcGxleCAqLwotI2RlZmluZSBidERDb21wbGV4CTE5CS8qIGZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KLSNkZWZpbmUgYnRJbmRpcmVjdAkyMAkvKiBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZiAqLwotI2RlZmluZSBidEZpeGVkRGVjCTIxCS8qIEZpeGVkIERlY2ltYWwgKi8KLSNkZWZpbmUgYnRGbG9hdERlYwkyMgkvKiBGbG9hdCBEZWNpbWFsICovCi0jZGVmaW5lIGJ0U3RyaW5nCTIzCS8qIFZhcnlpbmcgTGVuZ3RoIENoYXJhY3RlciBTdHJpbmcgKi8KLSNkZWZpbmUgYnRCaXQJCTI0CS8qIEFsaWduZWQgQml0IFN0cmluZyAqLwotI2RlZmluZSBidFBpY3R1cmUJMjUJLyogUGljdHVyZSAqLwotI2RlZmluZSBidFZvaWQJCTI2CS8qIHZvaWQgKi8KLSNkZWZpbmUgYnRMb25nTG9uZwkyNwkvKiBsb25nIGxvbmcgKi8KLSNkZWZpbmUgYnRVTG9uZ0xvbmcJMjgJLyogdW5zaWduZWQgbG9uZyBsb25nICovCi0jZGVmaW5lIGJ0TWF4CQk2NAotCi0jaWYgKF9NRkcgPT0gX01JUFMpCi0vKiBvcHRpbWl6YXRpb24gdHlwZSBjb2RlcyAqLwotI2RlZmluZSBvdE5pbAkJMAotI2RlZmluZSBvdFJlZwkJMQkvKiBtb3ZlIHZhciB0byByZWcgKi8KLSNkZWZpbmUgb3RCbG9jawkJMgkvKiBiZWdpbiBiYXNpYyBibG9jayAqLwotI2RlZmluZQlvdFByb2MJCTMJLyogcHJvY2VkdXJlICovCi0jZGVmaW5lIG90SW5saW5lCTQJLyogaW5saW5lIHByb2NlZHVyZSAqLwotI2RlZmluZSBvdEVuZAkJNQkvKiB3aGF0ZXZlciB5b3Ugc3RhcnRlZCAqLwotI2RlZmluZSBvdE1heAkJNgkvKiBLRUVQIFVQIFRPIERBVEUgKi8KLSNlbmRpZiAvKiAoX01GRyA9PSBfTUlQUykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi90aWMzMC5oIGIvaW5jbHVkZS9jb2ZmL3RpYzMwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjAyNmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3RpYzMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDM1ggKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotI2RlZmluZQlUSUMzME1BR0lDCTB4QzAwMAotCi0jZGVmaW5lIFRJQzMwQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPVRJQzMwTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0gIHN0cnVjdCB7Ci0JY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCXVuaW9uIHsKLQkgIHN0cnVjdCB7Ci0JCWNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCSAgfSB4X2xuc3o7Ci0JICBjaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQl9IHhfbWlzYzsKLQl1bmlvbiB7Ci0JICBzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkgIH0geF9mY247Ci0JICBzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JICB9IHhfYXJ5OwotCX0geF9mY25hcnk7Ci0JY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLSAgfSB4X3N5bTsKLSAgCi0gIHVuaW9uIHsKLQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0Jc3RydWN0IHsKLQkgIGNoYXIgeF96ZXJvZXNbNF07Ci0JICBjaGFyIHhfb2Zmc2V0WzRdOwotCX0geF9uOwotICB9IHhfZmlsZTsKLSAgCi0gIHN0cnVjdCB7Ci0JY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0JY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotICAKLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSB6OGsgZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgd2l0aCBzZWdtZW50cyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLS8qIFRNUzMyMEMzMCByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLQotI2RlZmluZSBSX1RJQzMwX0FCUzE2IDB4MTAwICAvKiAxNiBiaXQgYWJzb2x1dGUuICovCi0jZGVmaW5lIFJfVElDMzBfQUJTMjQgMHgxMDEgIC8qIDI0IGJpdCBhYnNvbHV0ZS4gKi8KLSNkZWZpbmUgUl9USUMzMF9BQlMzMiAweDEwMiAgLyogMzIgYml0IGFic29sdXRlLiAqLwotI2RlZmluZSBSX1RJQzMwX0xEUCAgIDB4MTAzICAvKiBMRFAgYml0cyAyMy0xNiB0byA3LTAuICovCi0jZGVmaW5lIFJfVElDMzBfUEMxNiAgMHgxMDQgIC8qIDE2IGJpdCBwYyByZWxhdGl2ZS4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi90aWM4MC5oIGIvaW5jbHVkZS9jb2ZmL3RpYzgwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTM4ZjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3RpYzgwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBUSSBUTVMzMjBDODAgKE1WUCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLQljaGFyIGZfdGFyZ2V0X2lkWzJdOwkvKiB0YXJnZXQgaWQgKFRJYzgwIHNwZWNpZmljKQkqLwotfTsKLQotI2RlZmluZQlUSUM4MF9BUkNIX01BR0lDCTB4MEMxCS8qIEdvZXMgaW4gdGhlIGZpbGUgaGVhZGVyIG1hZ2ljIG51bWJlciBmaWVsZCAqLwotI2RlZmluZSBUSUM4MF9UQVJHRVRfSUQJCTB4OTUJLyogR29lcyBpbiB0aGUgdGFyZ2V0IGlkIGZpZWxkICovCi0KLSNkZWZpbmUgVElDODBCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IFRJQzgwX0FSQ0hfTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIFRJQzgwX0FPVVRIRFJfTUFHSUMJMHgxMDgJLyogR29lcyBpbiB0aGUgb3B0aW9uYWwgZmlsZSBoZWFkZXIgbWFnaWMgbnVtYmVyIGZpZWxkICovCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLQljaGFyCQlzX3Jlc2VydmVkWzFdOwkvKiByZXNlcnZlZCAoVEljODAgc3BlY2lmaWMpCSovCi0JY2hhcgkJc19tZW1wYWdlWzFdOwkvKiBtZW1vcnkgcGFnZSBudW1iZXIgKFRJYzgwKQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ0lOSVQJIi5jaW5pdCIKLSNkZWZpbmUgX0NPTlNUCSIuY29uc3QiCi0jZGVmaW5lIF9TV0lUQ0gJIi5zd2l0Y2giCi0jZGVmaW5lIF9TVEFDSwkiLnN0YWNrIgotI2RlZmluZSBfU1lTTUVNCSIuc3lzbWVtIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkJCS8qIGxpbmUgbnVtYmVyCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLS8qIEZJWE1FIC0gbmVlZCB0byBjb3JyZWxhdGUgd2l0aCBUSWM4MCBDb2RlIEdlbmVyYXRpb24gVG9vbHMgVXNlcidzIEd1aWRlLCBDRzpBLTI1ICovCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3Jlc2VydmVkWzJdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTIKLQotLyogVEljODAgcmVsb2NhdGlvbiB0eXBlcy4gKi8KLQotI2RlZmluZSBSX0FCUwkJMHgwMAkJLyogQWJzb2x1dGUgYWRkcmVzcyAtIG5vIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgUl9SRUxMT05HWAkweDExCQkvKiBQUDogMzIgYml0cywgZGlyZWN0ICovCi0jZGVmaW5lIFJfUFBCQVNFCTB4MzQJCS8qIFBQOiBHbG9iYWwgYmFzZSBhZGRyZXNzIHR5cGUgKi8KLSNkZWZpbmUgUl9QUExCQVNFCTB4MzUJCS8qIFBQOiBMb2NhbCBiYXNlIGFkZHJlc3MgdHlwZSAqLwotI2RlZmluZSBSX1BQMTUJCTB4MzgJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG9mZnNldCAqLwotI2RlZmluZSBSX1BQMTVXCQkweDM5CQkvKiBQUDogR2xvYmFsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFAxNUgJCTB4M0EJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KLSNkZWZpbmUgUl9QUDE2QgkJMHgzQgkJLyogUFA6IEdsb2JhbCAxNiBiaXQgb2Zmc2V0IGZvciBieXRlcyAqLwotI2RlZmluZSBSX1BQTDE1CQkweDNDCQkvKiBQUDogTG9jYWwgMTUgYml0IG9mZnNldCAqLwotI2RlZmluZSBSX1BQTDE1VwkweDNECQkvKiBQUDogTG9jYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9QUEwxNUgJMHgzRQkJLyogUFA6IExvY2FsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSAyICovCi0jZGVmaW5lIFJfUFBMMTZCCTB4M0YJCS8qIFBQOiBMb2NhbCAxNiBiaXQgb2Zmc2V0IGZvciBieXRlcyAqLwotI2RlZmluZSBSX1BQTjE1CQkweDQwCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUE4xNVcJMHg0MQkJLyogUFA6IEdsb2JhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX1BQTjE1SAkweDQyCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSAyICovCi0jZGVmaW5lIFJfUFBOMTZCCTB4NDMJCS8qIFBQOiBHbG9iYWwgMTYgYml0IG5lZ2F0aXZlIGJ5dGUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFBMTjE1CTB4NDQJCS8qIFBQOiBMb2NhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFBMTjE1VwkweDQ1CQkvKiBQUDogTG9jYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9QUExOMTVICTB4NDYJCS8qIFBQOiBMb2NhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQTE4xNkIJMHg0NwkJLyogUFA6IExvY2FsIDE2IGJpdCBuZWdhdGl2ZSBieXRlIG9mZnNldCAqLwotI2RlZmluZSBSX01QUENSMTVXCTB4NEUJCS8qIE1QOiAxNSBiaXQgUEMtcmVsYXRpdmUgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfTVBQQ1IJCTB4NEYJCS8qIE1QOiAzMiBiaXQgUEMtcmVsYXRpdmUgZGl2aWRlZCBieSA0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvdzY1LmggYi9pbmNsdWRlL2NvZmYvdzY1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzhjMjMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3c2NS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgV0RDIDY1ODE2ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlXNjVNQUdJQwkweDY1MDAKLQotCi0jZGVmaW5lIFc2NUJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1XNjVNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSB3NjUgZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvd2UzMmsuaCBiL2luY2x1ZGUvY29mZi93ZTMyay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTNmYTM1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi93ZTMyay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3Igd2UzMmsgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotI2RlZmluZQlGX0JNMzJCCQkoMDAyMDAwMCkKLSNkZWZpbmUJRl9CTTMyTUFVCSgwMDQwMDAwKQotCi0jZGVmaW5lCVdFMzJLTUFHSUMJMHgxNzAJLyogd2UzMmsgc2FucyB0cmFuc2ZlciB2ZWN0b3IgKi8KLSNkZWZpbmUgRkJPTUFHSUMJMHgxNzAJLyogd2UzMmsgc2FucyB0cmFuc2ZlciB2ZWN0b3IgKi8KLSNkZWZpbmUgTVRWTUFHSUMJMHgxNzEJLyogd2UzMmsgd2l0aCB0cmFuc2ZlciB2ZWN0b3IgKi8KLSNkZWZpbmUgUkJPTUFHSUMJMHgxNzIJLyogcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgV0UzMktCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBXRTMyS01BR0lDKSBcCi0JCQkmJiAoKHgpLmZfbWFnaWMgIT0gRkJPTUFHSUMpIFwKLQkJCSYmICgoeCkuZl9tYWdpYyAhPSBSQk9NQUdJQykgXAotCQkJJiYgKCh4KS5mX21hZ2ljICE9IE1UVk1BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1RWCSIudHYiCi0jZGVmaW5lIF9JTklUCSIuaW5pdCIKLSNkZWZpbmUgX0ZJTkkJIi5maW5pIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0jCWRlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3o4ay5oIGIvaW5jbHVkZS9jb2ZmL3o4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI4NDZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi96OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFppbG9nIFo4MDBOICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIFR5cGUgb2YgY3B1IGlzIHN0b3JlZCBpbiBmbGFncyAqLwotI2RlZmluZSBGX1o4MDAxICAgIDB4MTAwMAotI2RlZmluZSBGX1o4MDAyICAgIDB4MjAwMAotI2RlZmluZSBGX01BQ0hNQVNLIDB4ZjAwMAotCi0jZGVmaW5lCVo4S01BR0lDCTB4ODAwMAotCi0jZGVmaW5lIFo4S0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1aOEtNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSB6OGsgZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgd2l0aCBzZWdtZW50cyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVtYW5nbGUuaCBiL2luY2x1ZGUvZGVtYW5nbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmZTVlMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2RlbWFuZ2xlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBEZWZzIGZvciBpbnRlcmZhY2UgdG8gZGVtYW5nbGVycy4KLSAgIENvcHlyaWdodCAxOTkyLCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaWYgIWRlZmluZWQgKERFTUFOR0xFX0gpCi0jZGVmaW5lIERFTUFOR0xFX0gKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIE9wdGlvbnMgcGFzc2VkIHRvIGNwbHVzX2RlbWFuZ2xlIChpbiAybmQgcGFyYW1ldGVyKS4gKi8KLQotI2RlZmluZSBETUdMX05PX09QVFMJMAkJLyogRm9yIHJlYWRhYmlsaXR5Li4uICovCi0jZGVmaW5lIERNR0xfUEFSQU1TCSgxIDw8IDApCS8qIEluY2x1ZGUgZnVuY3Rpb24gYXJncyAqLwotI2RlZmluZSBETUdMX0FOU0kJKDEgPDwgMSkJLyogSW5jbHVkZSBjb25zdCwgdm9sYXRpbGUsIGV0YyAqLwotI2RlZmluZSBETUdMX0pBVkEJKDEgPDwgMikJLyogRGVtYW5nbGUgYXMgSmF2YSByYXRoZXIgdGhhbiBDKysuICovCi0KLSNkZWZpbmUgRE1HTF9BVVRPCSgxIDw8IDgpCi0jZGVmaW5lIERNR0xfR05VCSgxIDw8IDkpCi0jZGVmaW5lIERNR0xfTFVDSUQJKDEgPDwgMTApCi0jZGVmaW5lIERNR0xfQVJNCSgxIDw8IDExKQotI2RlZmluZSBETUdMX0hQIAkoMSA8PCAxMikgICAgICAgLyogRm9yIHRoZSBIUCBhQ0MgY29tcGlsZXI7IHNhbWUgYXMgQVJNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGZvciB0ZW1wbGF0ZSBhcmd1bWVudHMsIGV0Yy4gKi8KLSNkZWZpbmUgRE1HTF9FREcJKDEgPDwgMTMpCi0KLS8qIElmIG5vbmUgb2YgdGhlc2UgYXJlIHNldCwgdXNlICdjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUnIGFzIHRoZSBkZWZhdWx0LiAqLwotI2RlZmluZSBETUdMX1NUWUxFX01BU0sgKERNR0xfQVVUT3xETUdMX0dOVXxETUdMX0xVQ0lEfERNR0xfQVJNfERNR0xfSFB8RE1HTF9FREcpCi0KLS8qIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGRlbWFuZ2xpbmcgc3R5bGVzLgotCi0gICBMdWNpZCBhbmQgQVJNIHN0eWxlcyBhcmUgc3RpbGwga2VwdCBsb2dpY2FsbHkgZGlzdGluY3QsIGV2ZW4gdGhvdWdoCi0gICB0aGV5IG5vdyBib3RoIGJlaGF2ZSBpZGVudGljYWxseS4gIFRoZSByZXN1bHRpbmcgc3R5bGUgaXMgYWN0dWFsIHRoZQotICAgdW5pb24gb2YgYm90aC4gIEkuRS4gZWl0aGVyIHN0eWxlIHJlY29nbml6ZXMgYm90aCAiX19wdF9fIiBhbmQgIl9fcmZfXyIKLSAgIGZvciBvcGVyYXRvciAiLT4iLCBldmVuIHRob3VnaCB0aGUgZmlyc3QgaXMgbHVjaWQgc3R5bGUgYW5kIHRoZSBzZWNvbmQKLSAgIGlzIEFSTSBzdHlsZS4gKEZJWE1FPykgKi8KLQotZXh0ZXJuIGVudW0gZGVtYW5nbGluZ19zdHlsZXMKLXsKLSAgdW5rbm93bl9kZW1hbmdsaW5nID0gMCwKLSAgYXV0b19kZW1hbmdsaW5nID0gRE1HTF9BVVRPLAotICBnbnVfZGVtYW5nbGluZyA9IERNR0xfR05VLAotICBsdWNpZF9kZW1hbmdsaW5nID0gRE1HTF9MVUNJRCwKLSAgYXJtX2RlbWFuZ2xpbmcgPSBETUdMX0FSTSwKLSAgaHBfZGVtYW5nbGluZyA9IERNR0xfSFAsCi0gIGVkZ19kZW1hbmdsaW5nID0gRE1HTF9FREcKLX0gY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlOwotCi0vKiBEZWZpbmUgc3RyaW5nIG5hbWVzIGZvciB0aGUgdmFyaW91cyBkZW1hbmdsaW5nIHN0eWxlcy4gKi8KLQotI2RlZmluZSBBVVRPX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJhdXRvIgotI2RlZmluZSBHTlVfREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImdudSIKLSNkZWZpbmUgTFVDSURfREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImx1Y2lkIgotI2RlZmluZSBBUk1fREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImFybSIKLSNkZWZpbmUgSFBfREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImhwIgotI2RlZmluZSBFREdfREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImVkZyIKLQotLyogU29tZSBtYWNyb3MgdG8gdGVzdCB3aGF0IGRlbWFuZ2xpbmcgc3R5bGUgaXMgYWN0aXZlLiAqLwotCi0jZGVmaW5lIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUKLSNkZWZpbmUgQVVUT19ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfQVVUTykKLSNkZWZpbmUgR05VX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9HTlUpCi0jZGVmaW5lIExVQ0lEX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9MVUNJRCkKLSNkZWZpbmUgQVJNX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9BUk0pCi0jZGVmaW5lIEhQX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9IUCkKLSNkZWZpbmUgRURHX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9FREcpCi0KLWV4dGVybiBjaGFyICoKLWNwbHVzX2RlbWFuZ2xlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1hbmdsZWQsIGludCBvcHRpb25zKSk7Ci0KLWV4dGVybiBpbnQKLWNwbHVzX2RlbWFuZ2xlX29wbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpvcG5hbWUsIGNoYXIgKnJlc3VsdCwgaW50IG9wdGlvbnMpKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKgotY3BsdXNfbWFuZ2xlX29wbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpvcG5hbWUsIGludCBvcHRpb25zKSk7Ci0KLS8qIE5vdGU6IFRoaXMgc2V0cyBnbG9iYWwgc3RhdGUuICBGSVhNRSBpZiB5b3UgY2FyZSBhYm91dCBtdWx0aS10aHJlYWRpbmcuICovCi0KLWV4dGVybiB2b2lkCi1zZXRfY3BsdXNfbWFya2VyX2Zvcl9kZW1hbmdsaW5nIFBBUkFNUyAoKGludCBjaCkpOwotCi0jZW5kaWYJLyogREVNQU5HTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kaXMtYXNtLmggYi9pbmNsdWRlL2Rpcy1hc20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2YzA0Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2Rpcy1hc20uaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKiBJbnRlcmZhY2UgYmV0d2VlbiB0aGUgb3Bjb2RlIGxpYnJhcnkgYW5kIGl0cyBjYWxsZXJzLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydCwgMTk5My4KLQotICAgVGhlIG9wY29kZSBsaWJyYXJ5IChsaWJvcGNvZGVzLmEpIHByb3ZpZGVzIGluc3RydWN0aW9uIGRlY29kZXJzIGZvcgotICAgYSBsYXJnZSB2YXJpZXR5IG9mIGluc3RydWN0aW9uIHNldHMsIGNhbGxhYmxlIHdpdGggYW4gaWRlbnRpY2FsCi0gICBpbnRlcmZhY2UsIGZvciBtYWtpbmcgaW5zdHJ1Y3Rpb24tcHJvY2Vzc2luZyBwcm9ncmFtcyBtb3JlIGluZGVwZW5kZW50Ci0gICBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGJlaW5nIHByb2Nlc3NlZC4gICovCi0KLSNpZm5kZWYgRElTX0FTTV9ICi0jZGVmaW5lIERJU19BU01fSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImJmZC5oIgotCi10eXBlZGVmIGludCAoKmZwcmludGZfZnR5cGUpIFBBUkFNUygoUFRSLCBjb25zdCBjaGFyKiwgLi4uKSk7Ci0KLWVudW0gZGlzX2luc25fdHlwZSB7Ci0gIGRpc19ub25pbnNuLAkJCS8qIE5vdCBhIHZhbGlkIGluc3RydWN0aW9uICovCi0gIGRpc19ub25icmFuY2gsCQkvKiBOb3QgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gKi8KLSAgZGlzX2JyYW5jaCwJCQkvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBkaXNfY29uZGJyYW5jaCwJCS8qIENvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBkaXNfanNyLAkJCS8qIEp1bXAgdG8gc3Vicm91dGluZSAqLwotICBkaXNfY29uZGpzciwJCQkvKiBDb25kaXRpb25hbCBqdW1wIHRvIHN1YnJvdXRpbmUgKi8KLSAgZGlzX2RyZWYsCQkJLyogRGF0YSByZWZlcmVuY2UgaW5zdHJ1Y3Rpb24gKi8KLSAgZGlzX2RyZWYyCQkJLyogVHdvIGRhdGEgcmVmZXJlbmNlcyBpbiBpbnN0cnVjdGlvbiAqLwotfTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIGludG8gdGhlIGluc3RydWN0aW9uIGRlY29kaW5nIHJvdXRpbmUsIAotICAgYW5kIGlzIHBhc3NlZCBiYWNrIG91dCBpbnRvIGVhY2ggY2FsbGJhY2suICBUaGUgdmFyaW91cyBmaWVsZHMgYXJlIHVzZWQKLSAgIGZvciBjb252ZXlpbmcgaW5mb3JtYXRpb24gZnJvbSB5b3VyIG1haW4gcm91dGluZSBpbnRvIHlvdXIgY2FsbGJhY2tzLAotICAgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24gaW50byB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgKHN1Y2ggYXMgdGhlCi0gICBhZGRyZXNzZXMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyksIG9yIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uCi0gICBiYWNrIGZyb20gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIHRvIHRoZWlyIGNhbGxlcnMuCi0KLSAgIEl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IGlzIGZpcnN0IHBhc3NlZDsgdGhpcyBjYW4gYmUgZG9uZQotICAgYnkgaGFuZCwgb3IgdXNpbmcgb25lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBtYWNyb3MgYmVsb3cuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvIHsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2Z1bmM7Ci0gIFBUUiBzdHJlYW07Ci0gIFBUUiBhcHBsaWNhdGlvbl9kYXRhOwotCi0gIC8qIFRhcmdldCBkZXNjcmlwdGlvbi4gIFdlIGNvdWxkIHJlcGxhY2UgdGhpcyB3aXRoIGEgcG9pbnRlciB0byB0aGUgYmZkLAotICAgICBidXQgdGhhdCB3b3VsZCByZXF1aXJlIG9uZS4gIFRoZXJlIGN1cnJlbnRseSBpc24ndCBhbnkgc3VjaCByZXF1aXJlbWVudAotICAgICBzbyB0byBhdm9pZCBpbnRyb2R1Y2luZyBvbmUgd2UgcmVjb3JkIHRoZXNlIGV4cGxpY2l0bHkuICAqLwotICAvKiBUaGUgYmZkX2ZsYXZvdXIuICBUaGlzIGNhbiBiZSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ci4gICovCi0gIGVudW0gYmZkX2ZsYXZvdXIgZmxhdm91cjsKLSAgLyogVGhlIGJmZF9hcmNoIHZhbHVlLiAgKi8KLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIC8qIFRoZSBiZmRfbWFjaCB2YWx1ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgLyogRW5kaWFubmVzcyAoZm9yIGJpLWVuZGlhbiBjcHVzKS4gIE1vbm8tZW5kaWFuIGNwdXMgY2FuIGlnbm9yZSB0aGlzLiAgKi8KLSAgZW51bSBiZmRfZW5kaWFuIGVuZGlhbjsKLQotICAvKiBBbiBhcnJheSBvZiBwb2ludGVycyB0byBzeW1ib2xzIGVpdGhlciBhdCB0aGUgbG9jYXRpb24gYmVpbmcgZGlzYXNzZW1ibGVkCi0gICAgIG9yIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgZGlzYXNzZW1ibGVkLiAgVGhlIGFycmF5IGlzIHNvcnRlZAotICAgICBzbyB0aGF0IHRoZSBmaXJzdCBzeW1ib2wgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIG9uZSB1c2VkLiAgVGhlIG90aGVycyBhcmUKLSAgICAgcHJlc2VudCBmb3IgYW55IG1pc2MuIHB1cnBvc2VzLiAgVGhpcyBpcyBub3Qgc2V0IHJlbGlhYmx5LCBidXQgaWYgaXQgaXMKLSAgICAgbm90IE5VTEwsIGl0IGlzIGNvcnJlY3QuICAqLwotICBhc3ltYm9sICoqc3ltYm9sczsKLSAgLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYXJyYXkuICAqLwotICBpbnQgbnVtX3N5bWJvbHM7Ci0KLSAgLyogRm9yIHVzZSBieSB0aGUgZGlzYXNzZW1ibGVyLgotICAgICBUaGUgdG9wIDE2IGJpdHMgYXJlIHJlc2VydmVkIGZvciBwdWJsaWMgdXNlIChhbmQgYXJlIGRvY3VtZW50ZWQgaGVyZSkuCi0gICAgIFRoZSBib3R0b20gMTYgYml0cyBhcmUgZm9yIHRoZSBpbnRlcm5hbCB1c2Ugb2YgdGhlIGRpc2Fzc2VtYmxlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZGVmaW5lIElOU05fSEFTX1JFTE9DCTB4ODAwMDAwMDAKLSAgUFRSIHByaXZhdGVfZGF0YTsKLQotICAvKiBGdW5jdGlvbiB1c2VkIHRvIGdldCBieXRlcyB0byBkaXNhc3NlbWJsZS4gIE1FTUFERFIgaXMgdGhlCi0gICAgIGFkZHJlc3Mgb2YgdGhlIHN0dWZmIHRvIGJlIGRpc2Fzc2VtYmxlZCwgTVlBRERSIGlzIHRoZSBhZGRyZXNzIHRvCi0gICAgIHB1dCB0aGUgYnl0ZXMgaW4sIGFuZCBMRU5HVEggaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgotICAgICBJTkZPIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdC4KLSAgICAgUmV0dXJucyBhbiBlcnJubyB2YWx1ZSBvciAwIGZvciBzdWNjZXNzLiAgKi8KLSAgaW50ICgqcmVhZF9tZW1vcnlfZnVuYykKLSAgICBQQVJBTVMgKChiZmRfdm1hIG1lbWFkZHIsIGJmZF9ieXRlICpteWFkZHIsIHVuc2lnbmVkIGludCBsZW5ndGgsCi0JICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi0gIC8qIEZ1bmN0aW9uIHdoaWNoIHNob3VsZCBiZSBjYWxsZWQgaWYgd2UgZ2V0IGFuIGVycm9yIHRoYXQgd2UgY2FuJ3QKLSAgICAgcmVjb3ZlciBmcm9tLiAgU1RBVFVTIGlzIHRoZSBlcnJubyB2YWx1ZSBmcm9tIHJlYWRfbWVtb3J5X2Z1bmMgYW5kCi0gICAgIE1FTUFERFIgaXMgdGhlIGFkZHJlc3MgdGhhdCB3ZSB3ZXJlIHRyeWluZyB0byByZWFkLiAgSU5GTyBpcyBhCi0gICAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QuICAqLwotICB2b2lkICgqbWVtb3J5X2Vycm9yX2Z1bmMpCi0gICAgUEFSQU1TICgoaW50IHN0YXR1cywgYmZkX3ZtYSBtZW1hZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi0gIC8qIEZ1bmN0aW9uIGNhbGxlZCB0byBwcmludCBBRERSLiAgKi8KLSAgdm9pZCAoKnByaW50X2FkZHJlc3NfZnVuYykKLSAgICBQQVJBTVMgKChiZmRfdm1hIGFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLSAgLyogRnVuY3Rpb24gY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHN5bWJvbCBhdCB0aGUgZ2l2ZW4gQUREUi4KLSAgICAgSWYgdGhlcmUgaXMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEsIG90aGVyd2lzZSBpdCByZXR1cm5zIDAuCi0gICAgIFRoaXMgaXMgdXNlZCBieSBwb3J0cyB3aGljaCBzdXBwb3J0IGFuIG92ZXJsYXkgbWFuYWdlciB3aGVyZQotICAgICB0aGUgb3ZlcmxheSBudW1iZXIgaXMgaGVsZCBpbiB0aGUgdG9wIHBhcnQgb2YgYW4gYWRkcmVzcy4gIEluCi0gICAgIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSB3YW50IHRvIGluY2x1ZGUgdGhlIG92ZXJsYXkgbnVtYmVyIGluIHRoZQotICAgICBhZGRyZXNzLCAobm9ybWFsbHkgYmVjYXVzZSB0aGVyZSBpcyBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGgKLSAgICAgdGhhdCBhZGRyZXNzKSwgYnV0IHNvbWV0aW1lcyB3ZSB3YW50IHRvIG1hc2sgb3V0IHRoZSBvdmVybGF5IGJpdHMuICAqLwotICBpbnQgKCogc3ltYm9sX2F0X2FkZHJlc3NfZnVuYykKLSAgICBQQVJBTVMgKChiZmRfdm1hIGFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbykpOwotCi0gIC8qIFRoZXNlIGFyZSBmb3IgYnVmZmVyX3JlYWRfbWVtb3J5LiAgKi8KLSAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgYmZkX3ZtYSBidWZmZXJfdm1hOwotICB1bnNpZ25lZCBpbnQgYnVmZmVyX2xlbmd0aDsKLQotICAvKiBUaGlzIHZhcmlhYmxlIG1heSBiZSBzZXQgYnkgdGhlIGluc3RydWN0aW9uIGRlY29kZXIuICBJdCBzdWdnZXN0cwotICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBvYmpkdW1wIHNob3VsZCBkaXNwbGF5IG9uIGEgc2luZ2xlIGxpbmUuICBJZgotICAgICAgdGhlIGluc3RydWN0aW9uIGRlY29kZXIgc2V0cyB0aGlzLCBpdCBzaG91bGQgYWx3YXlzIHNldCBpdCB0bwotICAgICAgdGhlIHNhbWUgdmFsdWUgaW4gb3JkZXIgdG8gZ2V0IHJlYXNvbmFibGUgbG9va2luZyBvdXRwdXQuICAqLwotICBpbnQgYnl0ZXNfcGVyX2xpbmU7Ci0KLSAgLyogdGhlIG5leHQgdHdvIHZhcmlhYmxlcyBjb250cm9sIHRoZSB3YXkgb2JqZHVtcCBkaXNwbGF5cyB0aGUgcmF3IGRhdGEgKi8KLSAgLyogRm9yIGV4YW1wbGUsIGlmIGJ5dGVzX3Blcl9saW5lIGlzIDggYW5kIGJ5dGVzX3Blcl9jaHVuayBpcyA0LCB0aGUgKi8KLSAgLyogb3V0cHV0IHdpbGwgbG9vayBsaWtlIHRoaXM6Ci0gICAgIDAwOiAgIDAwMDAwMDAwIDAwMDAwMDAwCi0gICAgIHdpdGggdGhlIGNodW5rcyBkaXNwbGF5ZWQgYWNjb3JkaW5nIHRvICJkaXNwbGF5X2VuZGlhbiIuICovCi0gIGludCBieXRlc19wZXJfY2h1bms7Ci0gIGVudW0gYmZkX2VuZGlhbiBkaXNwbGF5X2VuZGlhbjsKLQotICAvKiBOdW1iZXIgb2Ygb2N0ZXRzIHBlciBpbmNyZW1lbnRlZCB0YXJnZXQgYWRkcmVzcyAKLSAgICAgTm9ybWFsbHkgb25lLCBidXQgc29tZSBEU1BzIGhhdmUgYnl0ZSBzaXplcyBvZiAxNiBvciAzMiBiaXRzCi0gICAqLwotICB1bnNpZ25lZCBpbnQgb2N0ZXRzX3Blcl9ieXRlOwotCi0gIC8qIFJlc3VsdHMgZnJvbSBpbnN0cnVjdGlvbiBkZWNvZGVycy4gIE5vdCBhbGwgZGVjb2RlcnMgeWV0IHN1cHBvcnQKLSAgICAgdGhpcyBpbmZvcm1hdGlvbi4gIFRoaXMgaW5mbyBpcyBzZXQgZWFjaCB0aW1lIGFuIGluc3RydWN0aW9uIGlzCi0gICAgIGRlY29kZWQsIGFuZCBpcyBvbmx5IHZhbGlkIGZvciB0aGUgbGFzdCBzdWNoIGluc3RydWN0aW9uLgotCi0gICAgIFRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgZGVjb2RlciBzdXBwb3J0cyB0aGlzIGluZm9ybWF0aW9uLCBzZXQKLSAgICAgaW5zbl9pbmZvX3ZhbGlkIHRvIDAsIGRlY29kZSBhbiBpbnN0cnVjdGlvbiwgdGhlbiBjaGVjayBpdC4gICovCi0KLSAgY2hhciBpbnNuX2luZm9fdmFsaWQ7CQkvKiBCcmFuY2ggaW5mbyBoYXMgYmVlbiBzZXQuICovCi0gIGNoYXIgYnJhbmNoX2RlbGF5X2luc25zOwkvKiBIb3cgbWFueSBzZXF1ZW50aWFsIGluc24ncyB3aWxsIHJ1biBiZWZvcmUKLQkJCQkgICBhIGJyYW5jaCB0YWtlcyBlZmZlY3QuICAoMCA9IG5vcm1hbCkgKi8KLSAgY2hhciBkYXRhX3NpemU7CQkvKiBTaXplIG9mIGRhdGEgcmVmZXJlbmNlIGluIGluc24sIGluIGJ5dGVzICovCi0gIGVudW0gZGlzX2luc25fdHlwZSBpbnNuX3R5cGU7CS8qIFR5cGUgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgYmZkX3ZtYSB0YXJnZXQ7CQkvKiBUYXJnZXQgYWRkcmVzcyBvZiBicmFuY2ggb3IgZHJlZiwgaWYga25vd247Ci0JCQkJICAgemVybyBpZiB1bmtub3duLiAgKi8KLSAgYmZkX3ZtYSB0YXJnZXQyOwkJLyogU2Vjb25kIHRhcmdldCBhZGRyZXNzIGZvciBkcmVmMiAqLwotCi0gIC8qIENvbW1hbmQgbGluZSBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSB0YXJnZXQgZGlzYXNzZW1ibGVyLiAgKi8KLSAgY2hhciAqIGRpc2Fzc2VtYmxlcl9vcHRpb25zOwotCi19IGRpc2Fzc2VtYmxlX2luZm87Ci0KLQwKLS8qIFN0YW5kYXJkIGRpc2Fzc2VtYmxlcnMuICBEaXNhc3NlbWJsZSBvbmUgaW5zdHJ1Y3Rpb24gYXQgdGhlIGdpdmVuCi0gICB0YXJnZXQgYWRkcmVzcy4gIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcHJvY2Vzc2VkLiAgKi8KLXR5cGVkZWYgaW50ICgqZGlzYXNzZW1ibGVyX2Z0eXBlKQotICAgICBQQVJBTVMoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1leHRlcm4gaW50IHByaW50X2luc25fYmlnX21pcHMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX21pcHMJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9pMzg2X2F0dAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9pMzg2X2ludGVsCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTM3MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tNjhrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3o4MDAxCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3o4MDAyCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwaAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9oODMwMHMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faDg1MDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYWxwaGEJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gZGlzYXNzZW1ibGVyX2Z0eXBlIGFyY19nZXRfZGlzYXNzZW1ibGVyIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYmlnX2FybQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfYXJtCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fc3BhcmMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYmlnX2EyOWsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX2EyOWsJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9pOTYwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3NoCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3NobAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9ocHBhCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2ZyMzAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbTMycgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tODhrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX21jb3JlCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX21uMTAyMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbW4xMDMwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9uczMyawkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfcG93ZXJwYwlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fcnM2MDAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3c2NQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9kMTB2CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2QzMHYJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdjg1MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl90aWMzMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl92YXgJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdGljODAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fcGoJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYXZyCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotCi1leHRlcm4gdm9pZCBwcmludF9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCBwYXJzZV9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbiAgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gaW50ICBnZXRfYXJtX3JlZ25hbWVfbnVtX29wdGlvbnMgICAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGludCAgc2V0X2FybV9yZWduYW1lX29wdGlvbiAgICAgICAgIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGludCAgZ2V0X2FybV9yZWduYW1lcyAgICAgICAgICAgICAgIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKiopKTsKLQotLyogRmV0Y2ggdGhlIGRpc2Fzc2VtYmxlciBmb3IgYSBnaXZlbiBCRkQsIGlmIHRoYXQgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLwotZXh0ZXJuIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZXIJUEFSQU1TICgoYmZkICopKTsKLQotLyogRG9jdW1lbnQgYW55IHRhcmdldCBzcGVjaWZpYyBvcHRpb25zIGF2YWlsYWJsZSBmcm9tIHRoZSBkaXNhc3NlbWJsZXIuICAqLwotZXh0ZXJuIHZvaWQgZGlzYXNzZW1ibGVyX3VzYWdlICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotCi0MCi0vKiBUaGlzIGJsb2NrIG9mIGRlZmluaXRpb25zIGlzIGZvciBwYXJ0aWN1bGFyIGNhbGxlcnMgd2hvIHJlYWQgaW5zdHJ1Y3Rpb25zCi0gICBpbnRvIGEgYnVmZmVyIGJlZm9yZSBjYWxsaW5nIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyLiAgKi8KLQotLyogSGVyZSBpcyBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxlcnMgbWF5IHdpc2ggdG8gdXNlIGZvciByZWFkX21lbW9yeV9mdW5jLgotICAgSXQgZ2V0cyBieXRlcyBmcm9tIGEgYnVmZmVyLiAgKi8KLWV4dGVybiBpbnQgYnVmZmVyX3JlYWRfbWVtb3J5Ci0gIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICosIHVuc2lnbmVkIGludCwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGdvZXMgd2l0aCBidWZmZXJfcmVhZF9tZW1vcnkuCi0gICBJdCBwcmludHMgYSBtZXNzYWdlIHVzaW5nIGluZm8tPmZwcmludGZfZnVuYyBhbmQgaW5mby0+c3RyZWFtLiAgKi8KLWV4dGVybiB2b2lkIHBlcnJvcl9tZW1vcnkgUEFSQU1TICgoaW50LCBiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLQotLyogSnVzdCBwcmludCB0aGUgYWRkcmVzcyBpbiBoZXguICBUaGlzIGlzIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MgZXZlbgotICAgdGhvdWdoIGJvdGggR0RCIGFuZCBvYmpkdW1wIHByb3ZpZGUgdGhlaXIgb3duICh0byBwcmludCBzeW1ib2xpYwotICAgYWRkcmVzc2VzKS4gICovCi1leHRlcm4gdm9pZCBnZW5lcmljX3ByaW50X2FkZHJlc3MKLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBBbHdheXMgdHJ1ZS4gICovCi1leHRlcm4gaW50IGdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MKLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBNYWNybyB0byBpbml0aWFsaXplIGEgZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3QuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQKLSAgIGJ5IGFsbCBhcHBsaWNhdGlvbnMgY3JlYXRpbmcgc3VjaCBhIHN0cnVjdC4gICovCi0jZGVmaW5lIElOSVRfRElTQVNTRU1CTEVfSU5GTyhJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykgXAotICAoSU5GTykuZmxhdm91ciA9IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLCBcCi0gIChJTkZPKS5hcmNoID0gYmZkX2FyY2hfdW5rbm93biwgXAotICAoSU5GTykubWFjaCA9IDAsIFwKLSAgKElORk8pLmVuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTiwgXAotICAoSU5GTykub2N0ZXRzX3Blcl9ieXRlID0gMSwgXAotICBJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSChJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykKLQotLyogQ2FsbCB0aGlzIG1hY3JvIHRvIGluaXRpYWxpemUgb25seSB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGZvciB0aGUKLSAgIGRpc2Fzc2VtYmxlci4gIEFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgdGhpbmdzIHN1Y2ggYXMgYnl0ZSBvcmRlciwgb3IgbWFjaGluZQotICAgdmFyaWFudCBhcmUgbm90IHRvdWNoZWQgYnkgdGhpcyBtYWNyby4gIFRoaXMgbWFrZXMgdGhpbmdzIG11Y2ggZWFzaWVyIGZvcgotICAgR0RCIHdoaWNoIG11c3QgaW5pdGlhbGl6ZSB0aGVzZSB0aGluZ3Mgc2VwZXJhdGx5LiAgKi8KLQotI2RlZmluZSBJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSChJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykgXAotICAoSU5GTykuZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpKEZQUklOVEZfRlVOQyksIFwKLSAgKElORk8pLnN0cmVhbSA9IChQVFIpKFNUUkVBTSksIFwKLSAgKElORk8pLnN5bWJvbHMgPSBOVUxMLCBcCi0gIChJTkZPKS5udW1fc3ltYm9scyA9IDAsIFwKLSAgKElORk8pLmJ1ZmZlciA9IE5VTEwsIFwKLSAgKElORk8pLmJ1ZmZlcl92bWEgPSAwLCBcCi0gIChJTkZPKS5idWZmZXJfbGVuZ3RoID0gMCwgXAotICAoSU5GTykucmVhZF9tZW1vcnlfZnVuYyA9IGJ1ZmZlcl9yZWFkX21lbW9yeSwgXAotICAoSU5GTykubWVtb3J5X2Vycm9yX2Z1bmMgPSBwZXJyb3JfbWVtb3J5LCBcCi0gIChJTkZPKS5wcmludF9hZGRyZXNzX2Z1bmMgPSBnZW5lcmljX3ByaW50X2FkZHJlc3MsIFwKLSAgKElORk8pLnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgPSBnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzLCBcCi0gIChJTkZPKS5mbGFncyA9IDAsIFwKLSAgKElORk8pLmJ5dGVzX3Blcl9saW5lID0gMCwgXAotICAoSU5GTykuYnl0ZXNfcGVyX2NodW5rID0gMCwgXAotICAoSU5GTykuZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX1VOS05PV04sIFwKLSAgKElORk8pLmluc25faW5mb192YWxpZCA9IDAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19OwotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKERJU19BU01fSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL0NoYW5nZUxvZyBiL2luY2x1ZGUvZWxmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmNjhjMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw5NjAgKzAsMCBAQAotMjAwMC0wMy0yNyAgRGVuaXMgQ2hlcnR5a292ICA8ZGVuaXNjQG92ZXJ0YS5ydT4KLQotCSogYXZyLmg6IE5ldyBmaWxlLiAgQVZSIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0JKiBjb21tb24uaDogQWRkIEFWUiBtYWdpYyBudW1iZXIuCi0KLTIwMDAtMDMtMTAgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgUl9NSVBTX0dOVV9SRUxfSEkxNiwgUl9NSVBTX0dOVV9SRUxfTE8xNiwKLSAJUl9NSVBTX0dOVV9SRUwxNl9TMiwgUl9NSVBTX1BDNjQgYW5kIFJfTUlQU19QQzMyIHJlbG9jYXRpb24KLSAJbnVtYmVycy4KLQotMjAwMC0wMi0yMyAgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPgotCi0JKiBpMzcwLmg6IE5ldyBmaWxlLgotCi0yMDAwLTAyLTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRUxGX1NUX09USEVSKTogUmVtb3ZlIGRlZmluaXRpb24uCi0JKEVMRjMyX1NUX09USEVSKTogUmVtb3ZlIGRlZmluaXRpb24uCi0JKEVMRjY0X1NUX09USEVSKTogUmVtb3ZlIGRlZmluaXRpb24uCi0KLTIwMDAtMDItMjIgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29tbW9uLmggKEVMRk9TQUJJX0xJTlVYKTogRGVmaW5lLgotCi1UaHUgRmViIDE3IDAwOjE4OjMzIDIwMDAgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogc2guaDogKEVGX1NIX01BQ0hfTUFTSywgRUZfU0hfVU5LTk9XTiwgRUZfU0gxLCBFRl9TSDIpOiBOZXcgbWFjcm9zLgotCShFRl9TSDMsIEVGX1NIX0hBU19EU1AsIEVGX1NIX0RTUCwgRUZfU0gzX0RTUCk6IExpa2V3aXNlLgotCShFRl9TSF9IQVNfRlAsIEVGX1NIM0UsIEVGX1NINCwgRUZfU0hfTUVSR0VfTUFDSCk6IExpa2V3aXNlLgotCi0yMDAwLTAyLTAzICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGFybS1vYWJpLmg6IER1cGxpY2F0ZSBjaGFuZ2VzIG1hZGUgdG8gYXJtLmggb24gSmFuLiAyNywKLQkyMDAwIGJ5IFRob21hcyBkZSBMZWxsaXMgIDx0ZGVsQHdpbmRyaXZlci5jb20+LgotCi0yMDAwLTAxLTI3ICBUaG9tYXMgZGUgTGVsbGlzICA8dGRlbEB3aW5kcml2ZXIuY29tPgotCi0gICAgICAgICogYXJtLmggKFNUVF9BUk1fVEZVTkMpOiBEZWZpbmUgaW4gdGVybXMgb2YgU1RUX0xPUFJPQy4KLQkoU1RUX0FSTV8xNkJJVCk6IE5ldyBmbGFnLiAgRGVub3RlcyBhIGxhYmVsIHRoYXQgd2FzIGRlZmluZWQgaW4KLQlUaHVtYiBibG9jayBidXQgd2FzIGRvZXMgbm90IGlkZW50aWZ5IGEgZnVuY3Rpb24uCi0KLTIwMDAtMDEtMjAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9NQ09SRSk6IEZpeCBzcGVsbGluZyBvZiBNb3Rvcm9sYS4KLQkqIG1jb3JlLmggKEVNX01DT1JFKTogRml4IHNwZWxsaW5nIG9mIE1vdG9yb2xhLgotCi0yMDAwLTAxLTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUzM3MCk6IENoYW5nZSBjb21tZW50IC0gdGhpcyBpcyBub3cgdGhlIElCTQotCVN5c3RlbS8zNzAuCi0JKEVNX0lBXzY0KTogQ2hhbmdlIGNvbW1lbnQgLSB0aGlzIGlzIG5vdyB0aGUgSUEtNjQuCi0KLTIwMDAtMDEtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChEVF9FTkNPRElORyk6IEZpeCBkZWZpbml0aW9uIG9mIHRoaXMgdmFsdWUuCi0JKERUX0xPT1MpOiBGaXggZGVmaW5pdGlvbiBvZiB0aGlzIHZhbHVlLgotCShEVF9ISU9TKTogRml4IGRlZmluaXRpb24gb2YgdGhpcyB2YWx1ZS4KLQkoT0xEX0RUX0xPT1MpOiBWYWx1ZSBvZiBEVF9MT09TIGJlZm9yZSBPY3QgNCwgMTk5OSBkcmFmdAotCW9mIEVMRiBzcGVjIGNoYW5nZWQgaXQuCi0JKE9MRF9EVF9ISU9TKTogVmFsdWUgb2YgRFRfSElPUyBiZWZvcmUgT2N0IDQsIDE5OTkgZHJhZnQKLQlvZiBFTEYgc3BlYyBjaGFuZ2VkIGl0LgotCi0yMDAwLTAxLTEwICBFZ29yIER1ZGEgIDxkZW9AbG9nb3MtbS5ydT4KLQotCSogY29tbW9uLmggKE5UX1dJTjMyUFNUQVRVUyk6IERlZmluZS4gIChjeWd3aW4gZWxmIGNvcmUgZHVtcHMpLiAKLQotMTk5OS0xMi0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTVE9fKik6IFJlZGVmaW5lIGluIHRlcm1zIG9mIFNUVl8qIHZhbHVlcyBub3cgaW4KLQljb21tb24uaC4gCi0KLTE5OTktMTItMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oOiBVcGdyYWRlIHRvIG1hdGNoIE9jdDQsIDE5OTkgRHJhZnQgRUxGIEFCSSBTcGVjLgotCShFTV9NSVBTX1JTM19MRSk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fUkNFKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9NTUEpOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKEVNX1BDUCk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fTkNQVSk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fTkRSMSk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fU1RBUkNPUkUpOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKEVNX01FMTYpOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKEVNX1NUMTAwKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV9USU5ZSik6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fRlg2Nik6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fU1Q5UExVUyk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fU1Q3KTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV82OEhDMTYpOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKEVNXzY4SEMxMSk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fNjhIQzA4KTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShFTV82OEhDMDUpOiBOZXcgbWFjaGluZSBudW1iZXIuCi0JKEVNX1NWWCk6IE5ldyBtYWNoaW5lIG51bWJlci4KLQkoRU1fVkFYKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCShQRl9NQVNLT1MpOiBDaGFuZ2UgdmFsdWUuCi0JKFNIVF9JTklUX0FSUkFZKTogTmV3IHZhbHVlIGZvciBzaF90eXBlIGZpZWxkLgotCShTSFRfRklOSV9BUlJBWSk6IE5ldyB2YWx1ZSBmb3Igc2hfdHlwZSBmaWVsZC4KLQkoU0hUX1BSRUlOSVRfQVJSQVkpOiBOZXcgdmFsdWUgZm9yIHNoX3R5cGUgZmllbGQuCi0JKFNIVF9ISVVTRVIpOiBDaGFuZ2UgdmFsdWUuCi0JKFNIRl9NRVJHRSk6IE5ldyB2YWx5ZSBmb3Igc2hfZmxhZ3MgZmllbGQuCi0JKFNIRl9TVFJJTkdTKTogTmV3IHZhbHllIGZvciBzaF9mbGFncyBmaWVsZC4KLQkoU0hGX0lORk9fTElOSyk6IE5ldyB2YWx5ZSBmb3Igc2hfZmxhZ3MgZmllbGQuCi0JKFNIRl9PU19OT05DT05GT1JNSU5HKTogTmV3IHZhbHllIGZvciBzaF9mbGFncyBmaWVsZC4KLQkoU0hGX01BU0tPUyk6IENoYW5nZSB2YWx1ZS4KLQkoRUxGX1NUX1ZJU0lCSUxJVFkpOiBOZXcgbWFjcm8uCi0JKEVMRl9TVF9PVEhFUik6IE5ldyBtYWNyby4KLQkoU1RUX0NPTU1PTik6IE5ldyBzeW1ib2wgdHlwZS4KLQkoU1RWX0RFRkFVTFQpOiBWYWx1ZSBmb3Igc3ltYm9sIHZpc2liaWxpdHkuCi0JKFNUVl9JTlRFUk5BTCk6IFZhbHVlIGZvciBzeW1ib2wgdmlzaWJpbGl0eS4KLQkoU1RWX0hJRERFTik6IFZhbHVlIGZvciBzeW1ib2wgdmlzaWJpbGl0eS4KLQkoU1RWX1BST1RFQ1RFRCk6IFZhbHVlIGZvciBzeW1ib2wgdmlzaWJpbGl0eS4KLQkoRFRfUlVOUEFUSCk6IE5ldyBkeW5hbWljIHNlY3Rpb24gdGFnLgotCShEVF9GTEFHUyk6IE5ldyBkeW5hbWljIHNlY3Rpb24gdGFnLgotCShEVF9FTkNPRElORyk6IE5ldyBkeW5hbWljIHNlY3Rpb24gdGFnLgotCShEVF9QUkVJTklUX0FSUkFZKTogTmV3IGR5bmFtaWMgc2VjdGlvbiB0YWcuCi0JKERUX1BSRUlOSVRfQVJSQVlTWik6IE5ldyBkeW5hbWljIHNlY3Rpb24gdGFnLgotCShEVF9MT1BST0MpOiBOZXcgZHluYW1pYyBzZWN0aW9uIHRhZyBpbmRleC4KLQkoRFRfSElQUk9DKTogTmV3IGR5bmFtaWMgc2VjdGlvbiB0YWcgaW5kZXguCi0JKERGX09SSUdJTik6IFZhbHVlIGZvciBkeW5hbWljIHNlY3Rpb24gZmxhZy4KLQkoREZfU1lNQk9MSUMpOiBWYWx1ZSBmb3IgZHluYW1pYyBzZWN0aW9uIGZsYWcuCi0JKERGX1RFWFRSRUwpOiBWYWx1ZSBmb3IgZHluYW1pYyBzZWN0aW9uIGZsYWcuCi0JKERGX0JJTkRfTk9XKTogVmFsdWUgZm9yIGR5bmFtaWMgc2VjdGlvbiBmbGFnLgotCi0xOTk5LTEyLTA5ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChyZWxvYy1tYWNyb3MuaCk6ICBJbmNsdWRlIHVzaW5nIHJlbGF0aXZlIGRpciBlbGYvLgotCSogaTM4Ni5oIChyZWxvYy1tYWNyb3MuaCk6ICBJbmNsdWRlIHVzaW5nIHJlbGF0aXZlIGRpciBlbGYvLgotCSogaHBwYS5oIChyZWxvYy1tYWNyb3MuaCk6ICBJbmNsdWRlIHVzaW5nIHJlbGF0aXZlIGRpciBlbGYvLgotCQotMTk5OS0xMi0wNyAgSmltIEJsYW5keSAgPGppbWJAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKE5UX1BSWEZQUkVHKTogTmV3IGRlZmluaXRpb24uCi0KLVdlZCBEZWMgIDEgMDM6MDI6MTUgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKEVfTU4xMDMwMF9NQUNIX0FNMzMpOiBEZWZpbmUuCi0KLU1vbiBPY3QgMTEgMjI6NDI6MzcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKFBGX0hQX1BBR0VfU0laRSk6IERlZmluZS4KLQkoUEZfSFBfRkFSX1NIQVJFRCwgUEZfSFBfTkVBUl9TSEFSRUQsIFBGX0hQX0NPREUpOiBMaWtld2lzZS4KLQkoUEZfSFBfTU9ESUZZLCBQRl9IUF9MQVpZU1dBUCwgUEZfSFBfU0JQKTogTGlrZXdpc2UuCi0KLU1vbiBPY3QgIDQgMTc6NDI6MzggMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci5oIChFX00zMlJYX0FSQ0gpOiBEZWZpbmUuCi0KLTE5OTktMDktMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBocHBhLmg6IEFkZCBEVF9IUF9HU1RfU0laRSwgRFRfSFBfR1NUX1ZFUlNJT04sIGFuZCBEVF9IUF9HU1RfSEFTSFZBTC4KLQotMTk5OS0wOS0wNCAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcG9ib3guY29tPgotCi0JKiBwai5oOiBOZXcgZmlsZS4KLQkqIGNvbW1vbi5oIChFTV9QSik6IERlZmluZS4KLQotMTk5OS0wOS0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGhwcGEuaDogQWRkIEhQVVggc3BlY2lmaWMgc3ltYm9sIHR5cGUgZGVmaW5pdGlvbnMuCi0KLQkqIGhwcGEuaDogQWRkIEhQVVggc3BlY2lmaWMgZHluYW1pYyBhbmQgcHJvZ3JhbSBoZWFkZXIgdGFibGUKLQlzcGVjaWZpYyBkZWZpbml0aW9ucy4KLQotMTk5OS0wOC0zMSAgU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLQotCSogY29tbW9uLmggKE5UX1RBU0tTVFJVQ1QpOiBEZWZpbmUuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMuaCAoRUZfU1BBUkNfU1VOX1VTMyk6IERlZmluZSBpbiBDaGVldGFoIGV4dGVuc2lvbnMKLQlmbGFnIChhcyBwZXIgU0NEMi40LjEpLgotCi0xOTk5LTA3LTE2ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIHNwYXJjLmggKEVMRjY0X1JfVFlQRV9EQVRBKTogT25seSB1c2UgRUxGNjRfUl9UWVBFIGJpdHMsIG5vdAotCUVMRjY0X1JfU1lNIGJpdHMuCi0KLTE5OTktMDYtMjEgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBhcm0uaCAoRUZfU09GVF9GTE9BVCwgRl9TT0ZUX0ZMT0FUKTogRGVmaW5lLgotCi0xOTk5LTA3LTEzICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBtNjhrLmggKEVGX0NQVTMyKTogTW92ZSBkZWZpbml0aW9uIGluc2lkZSBtdWx0aXBsZSBpbmNsdXNpb24KLQlndWFyZC4KLQotMTk5OS0wNy0wOCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRUxGNjRfUl9UWVBFX0RBVEEpOiBTaWduIGV4dGVuZCB0aGUgdmFsdWUuCi0JKEVMRjY0X1JfVFlQRV9JTkZPKTogTWFzayBvdXQgYWxsIGJ1dCBsb3cgMjQgYml0cyBvZiBkYXRhLgotCShEVF9TUEFSQ19QTFRGTVQpOiBEZWxldGUuCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEpha3ViIEplbGluZWsuCi0KLU1vbiBKdW4gMjEgMTY6MzY6MDIgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKGVsZl9ocHBhX3JlbG9jX3R5cGUpOiBSZW5hbWVkIGZyb20gZWxmMzJfaHBwYV9yZWxvY190eXBlLgotCi0xOTk5LTA2LTEwICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIHNwYXJjLmggKFJfU1BBUkNfbWF4X3N0ZCk6IERlZmluZS4KLQotV2VkIEp1biAgOSAxNToxNjozNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogVXBkYXRlIHdpdGggdmFyaW91cyBjaGFuZ2VzIGZyb20gbmV3ZXN0IFBBIEVMRgotCXNwZWNpZmljYXRpb25zLgotCi0xOTk5LTA2LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29tbW9uLmggKEVNX1BQQzY0KTogRGVmaW5lLgotCi0xOTk5LTA2LTAyICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiYWJ5bG9uLTUuY3lnbnVzLmNvbT4KLQotCSogZHdhcmYuaDogQWRkIExBTkdfSkFWQS4KLQkqIGR3YXJmMi5oOiBBZGQgRFdfTEFOR19KYXZhLgotCi0xOTk5LTA1LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRUxGT1NBQklfQVJNKTogRGVmaW5lLgotCi0xOTk5LTA1LTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy1tYWNyb3MuaDogVXBkYXRlIGNvbW1lbnQuCi0KLTE5OTktMDUtMjggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBpOTYwLmg6IE5ldyBmaWxlLgotCi0xOTk5LTA1LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oIChSX01DT1JFX0NPUFkpOiBEZWZpbmUuCi0JKFJfTUNPUkVfR0xPQl9EQVQpOiBEZWZpbmUuCi0JKFJfTUNPUkVfSlVNUF9TTE9UKTogRGVmaW5lLgotCi0xOTk5LTA1LTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oIChSX01DT1JFX1JFTEFUSVZFKTogRGVmaW5lLgotCi05OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogbTY4ay5oIChFRl9DUFUzMik6IERlZmluZS4KLQotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmggKFNUQVJUX1JFTE9DX05VTUJFUlMpOiBQcmVwZW5kIGFuIHVuZGVyc2NvcmUgdG8KLQlmYWtlIHJlbG9jIGVudHJ5IG5hbWUgKGlmIHBvc3NpYmxlKSwgaW4gb3JkZXIgdG8gYXZvaWQgY29uZmxpY3RzCi0Jd2l0aCB0eXBlZGVmcyBvZiB0aGUgc2FtZSBuYW1lLgotCi0xOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTXzMyQklUTU9ERSk6IE5ldy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaDogTmV3IGhlYWRlciBmaWxlLiAgRGVmaW5lcyBmb3IgTW90b3JvbGEncyBNQ29yZQotCXByb2Nlc3Nvci4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBuZXcgY29uc3RhbnRzIGRlZmluZWQgaW46ICJTeXN0ZW0gViBBcHBsaWNhdGlvbgotCUJpbmFyeSBJbnRlcmZhY2UgLSBEUkFGVCAtIEFwcmlsIDI5LCAxOTk4IiBmb3VuZCBhdCB0aGUgd2ViIHNpdGU6Ci0JaHR0cDovL3d3dy5zY28uY29tL2RldmVsb3Blci9nYWJpL2NvbnRlbnRzLmh0bWwKLQotCShFTV9NTUEpOiBSZW1vdmVkLiAgUmVwbGFjZWQgd2l0aCBFTV9NQ09SRSBhcyBNb3Rvcm9sbGEgb3duIHRoaXMKLQl2YWx1ZS4KLQotMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmg6IEZpeGVkIHRvIG5vdCBnZW5lcmF0ZSBhbiBlbnVtIHdpdGggYSB0cmFpbGluZwotCWNvbW1hLgotCi0xOTk5LTAzLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfTUFDSF81MDAwKTogTmV3LgotCi0xOTk5LTAzLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBkZWZpbml0aW9ucyBmb3IgYSBmZXcgbW9yZSBTb2xhcmlzIEVMRiBleHRlbnNpb25zLgotCi1UaHUgRmViIDE4IDE4OjU4OjI2IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXh0ZXJuYWwuaDogT25seSB1c2UgYXR0cmlidXRlIGlmIF9fR05VQ19fIGlzIGRlZmluZWQuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlQYXRjaCBzdWJtaXR0ZWQgYnk6IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCi0JKiBlbGYvZXh0ZXJuYWwuaDogc3RydWN0IEVsZl9FeHRlcm5hbF9WZXJzeW0gbXVzdCBiZSBwYWNrZWQgb24KLQlBUk0uICBDb2RlIHVzZXMgc2l6ZW9mKEVsZl9FeHRlcm5hbF9WZXJzeW0pIGFuZCBhc3N1bWVzIGl0IGlzCi0JZXF1YWwgdG8gc2l6ZW9mKGNoYXJbMl0pLiAgUmVwb3J0ZWQgYnkgSmltIFBpY2sgPGppbUBqaW1waWNrLmNvbT4KLQotMTk5OS0wMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmggKERXQVJGMl9FeHRlcm5hbF9BUmFuZ2UpOiBOZXcgc3RydWN0dXJlLgotCShEV0FSRjJfSW50ZXJuYWxfQVJhbmdlKTogTmV3IHN0cnVjdHVyZS4KLQotTW9uIEZlYiAgMSAxMTozMzo1NiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS5oOiAgUmVudW1iZXIgcmVsb2NzIHRvIGNvbmZvcm0gdG8gc3RhbmRhcmQuCi0gICAgICAgIChFRl9ORVdfQUJJKTogIERlZmluZS4KLSAgICAgICAgKEVGX09MRF9BQkkpOiAgRGVmaW5lLgotICAgICAgICAqIGFybS1vYWJpLmg6ICBOZXcgZmlsZS4KLQotMTk5OS0wMS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZnIzMC5oOiBBZGQgUl9GUjMwX0dOVV9WVHtJTkhFUklULEVOVFJZfSByZWxvY3MuCi0KLTE5OTktMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5oOiBBZGQgdHlwZWRlZnMgZm9yIHN0cnVjdHVyZXMgZm91bmQgaW4gZHdhcmYyIHNlY3Rpb25zLgotCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfTUFDSF80MTExKTogTmV3LgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX0FCSSxFX01JUFNfQUJJX08zMixFX01JUFNfQUJJX082NCwKLQlFX01JUFNfQUJJX0VBQkkzMixFX01JUFNfQUJJX0VBQkk2NCk6Ci0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGZyMzAuaDogQWRkIFJfRlIzMF80OCByZWxvYy4KLQotMTk5OC0xMi0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIGV4dGVybmFsIGRhdGEgdHlwZSBmb3IgY29uZmxpY3Qgc2VjdGlvbi4KLQotCSogbWlwcy5oOiBBZGQgbW9yZSBMTF8qIG9wdGlvbnMgZnJvbSBJcml4IDYuNS4KLQotCSogbWlwcy5oOiBBZGQgUl9NSVBTX0pBTFIgYW5kIGFkanVzdCBSX01JUFNfbWF4IGFwcHJvcHJpYXRlbHkuCi0KLVR1ZSBOb3YgMTAgMTU6MTI6MjggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19GUjMwKTogUmVkdWNlIHRvIGEgMTYgYml0IHZhbHVlLgotCi1UdWUgTm92IDEwIDE1OjE3OjI4IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZDEwdi5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLVdlZCBOb3YgIDQgMTU6NTY6NTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19GUjMwKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCi0JKiBmcjMwLmg6IE5ldyBmaWxlOiBEZWZpbml0aW9ucyBmb3IgdGhlIEZSMzAuCi0KLUZyaSBPY3QgMzAgMTE6NTQ6MTUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgRnJvbSBQaGlsaXAgQmx1bmRlbGwgPHBiQG5leHVzLmNvLnVrPjoKLSAgICAgICAgKiBhcm0uaCAoUl9BUk1fQ09QWSwgZXQgYWwuKTogTmV3IHJlbG9jcywgdXNlZCBieSBMaW51eCBmb3IgUElDLgotICAgICAgICAoRUZfQUxJR044KTogTmV3IGZsYWcuCi0KLVR1ZSBPY3QgMjAgMTE6MTk6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoTlRfTFdQU1RBVFVTKTogQ2xvc2UgY29tbWVudCBhY2NpZGVudGFsbHkgbGVmdCBvcGVuLgotCi1Nb24gT2N0IDE5IDIwOjI0OjExIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2guaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1Nb24gT2N0IDE5IDAxOjQ0OjQyIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKE5UX1BTVEFUVVMsIE5UX0ZQUkVHUywgTlRfUFNJTkZPLAotIAlOVF9MV1BTVEFUVVMsTlRfTFdQU0lORk8pOiBhZGRlZC4KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9Ob3RlKTogbmV3IHN0cnVjdHVyZSBtZW1iZXJzLgotCi1GcmkgT2N0IDE2IDE0OjExOjI1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogbTMyci5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLVR1ZSBPY3QgIDYgMDk6MjI6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzcGFyYy5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBPY3QgIDUgMDk6Mzk6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiB2ODUwLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotU3VuIE9jdCAgNCAyMToxNzo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoUl8zODZfbWF4KTogQ2hhbmdlIGZyb20gMjUyIHRvIDI0LgotCi1Nb24gU2VwIDIxIDEyOjI0OjQ0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogaTM4Ni5oOiAgQ2hhbmdlIHZ0YWJsZSByZWxvYyBudW1iZXJzLgotCi1TdW4gU2VwIDIwIDAwOjU0OjIyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLmg6IEFkZCB2dGFibGUgcmVsb2NzIGFuZCBSXzY4S19tYXguCi0KLVR1ZSBTZXAgMTUgMDk6NTY6NDkgQ0RUIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBhcm0uaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1Nb24gQXVnIDMxIDExOjI1OjI3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6ICBEZWZpbmUgU1RUX0FSTV9URlVOQy4gIFJlbW92ZSBTVF9USFVNQl94eHh4Ci0gICAgICAgIGRlZmluaXRpb25zLgotCi1TYXQgQXVnIDI5IDIyOjI1OjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIHZ0YWJsZSByZWxvY3MuCi0KLTE5OTgtMDgtMjUgMTY6NDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIFNZTUlORk9fKiBtYWNyb3MgdG8gYWNjZXNzIEVsZipfU3ltaW5mbyBpbmZvcm1hdGlvbi4KLQotCSogZXh0ZXJuYWwuaDogQWRkIEVsZl9FeHRlcm5hbF9TeW1pbmZvIGRlZmluaXRpb24uCi0KLQkqIGludGVybmFsLmg6IEFkZCBFbGZfSW50ZXJuYWxfU3ltaW5mbywgRWxmMzJfSW50ZXJuYWxfU3ltaW5mbywKLQlhbmQgRWxmNjRfU3ltaW5mbyBkZWZpbml0aW9ucy4KLQotU3VuIEF1ZyAgOSAyMDoyNjo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGFybS5oOiAgQWRkIFNUX1RIVU1CIGRlZmluaXRpb25zLgotCi1XZWQgQXVnICA1IDE1OjUyOjM1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oOiBBZGQgRUxGIGhlYWRlciBmbGFncyB0byBzcGVjaWZ5IGNvbXBpbGUgdGltZSBvcHRpbnM6Ci0JRUZfSU5URVJXT1JLOiBOZXcgZmxhZy4KLQlFRl9BUENTXzI2OiBOZXcgZmxhZy4KLQlFRl9BUENTX0ZMT0FUOiBOZXcgZmxhZy4KLQlFRl9QSUM6IE5ldyBmbGFnLgotCi0xOTk4LTA3LTMxIDIxOjI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgbWlzc2luZyBSSEZfKiBjb25zdGFudHMuCi0KLUZyaSBKdWwgMzEgMTA6MDE6NDAgMTk5OCBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS5oOiBBZGQgUl9BUk1fVEhNX1BDOSByZWxvY2F0aW9uLgotCi0xOTk4LTA3LTMwIDE2OjI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBuZXcgRFRfKiBlbnRyaWVzIGFuZCB0aGVyZSBmbGFnIG1hY3JvcyBmcm9tIFNvbGFyaXMuCi0KLVR1ZSBKdWwgMjggMTg6MTQ6MDcgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaDogKFJfU1BBUkNfUkVWMzIpOiBBZGRlZCBmb3IgbGl0dGxlIGVuZGlhbiBkYXRhIGUuZy4gc3BhcmMgODZ4LgotCi1GcmkgSnVsIDI0IDExOjIyOjA2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBBZGQgUl9NTjEwMzAwXzI0IHJlbG9jYXRpb24uCi0KLTE5OTgtMDctMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBNSVBTNjQgcmVsb2NhdGlvbiBuYW1lcyBhbmQgdmFsdWVzLgotCi1XZWQgSnVsIDIyIDE5OjI5OjAwIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6IFJlbmFtZSByZWxvY2F0aW9ucy4KLQotMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHBwYy5oOiBEZWZpbmUgZW51bSBhcyBlbGZfcHBjX3JlbG9jX3R5cGUuCi0KLVdlZCBKdWwgMjIgMTY6MjI6MTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmg6IE5ldyBmaWxlLiAgUHJvdmlkZXMgcmVsb2NhdGlvbiBtYWNyb3M6Ci0JU1RBUlRfUkVMT0NfTlVNQkVSUywgUkVMT0NfTlVNQkVSLCBGQUtFX1JFTE9DLCBFTVBUWV9SRUxPQyBhbmQKLQlFTkRfUkVMT0NfTlVNQkVSUyB1c2VkIGJ5IG90aGVyIGVsZiBoZWFkZXIgZmlsZXMuCi0KLQkqIGFscGhhLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGFyYy5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBhcm0uaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogZDEwdi5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBkMzB2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGhwcGEuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogaTM4Ni5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtMzJyLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG02OGsuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbWlwcy5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtbjEwMjAwLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG1uMTAzMDAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogcHBjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIHNoLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIHNwYXJjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIHY4NTAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCi0xOTk4LTA3LTIyIDEzOjA3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbW4xMDMwMC5oOiBSZXdyaXRlIHJlbG9jYXRpb24gZGVmaW5pdGlvbiB1c2luZyBtYWNyb3MuCi0JKiBtaXBzLmg6IExpa2V3aXNlLgotCSogcHBjLmg6IExpa2V3aXNlLgotCSogYWxwaGEuaDogTGlrZXdpc2UuCi0JKiBhcm0uaDogTGlrZXdpc2UuCi0JKiBkMTB2Lmg6IExpa2V3aXNlLgotCSogZDMwdi5oOiBMaWtld2lzZS4KLQkqIG0zMnIuaDogTGlrZXdpc2UuCi0JKiBtNjhrLmg6IExpa2V3aXNlLgotCSogbW4xMDIwMC5oOiBMaWtld2lzZS4KLQkqIHNoLmg6IExpa2V3aXNlLgotCSogc3BhcmMuaDogTGlrZXdpc2UuCi0KLTE5OTgtMDctMjEgMTM6MDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBhcm0uaDogTmV3IGZpbGUuCi0JKiBkMTB2Lmg6IE5ldyBmaWxlLgotCSogZDMwdi5oOiBOZXcgZmlsZS4KLQkqIGkzODYuaDogTmV3IGZpbGUuCi0JKiBtNjhrLmg6IE5ldyBmaWxlLgotCSogbW4xMDIwMC5oOiBOZXcgZmlsZS4KLQkqIHNoLmg6IE5ldyBmaWxlLgotCi0JKiBtaXBzLmg6IEFkZCBSX01JUFNfKiBhbmQgU0hUX01JUFNfKiBlbnRyaWVzLgotCi0JKiBtbjEwMzAwLmg6IEFkZCBSX01OMTAzMDBfKiBlbnRyaWVzLgotCi0JKiBwcGMuaDogQWRkIFJfUFBDXyogZW50cmllcy4KLQotMTk5OC0wNy0yMCAwNzoxMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIE9ES18qLCBPRVhfKiwgT1BBRF8qLCBPSFdfKiwgYW5kIE9HUF8qIGNvbnN0YW50cy4KLQlEZWZpbmUgRWxmMzJfRXh0ZXJuYWxfTGliLgotCi0xOTk4LTA3LTE5IDE1OjI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChQVF9NSVBTX09QVElPTlMpOiBOZXcgc3ltYm9sLgotCUFkZCBsb3RzIG9mIERUX01JUFNfKiBzeW1ib2xzLgotCi1GcmkgSnVuIDI2IDEwOjQ2OjM1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBOZXcgZmlsZS4KLQotVGh1IEp1biAxOCAxOToyNzo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fOTYwLCBFTV9WODAwLCBFTV9GUjIwLCBFTV9SSDMyLCBFTV9NTUEsCi0JRU1fT0xEX0FMUEhBKTogQWRkIHRoZXNlIGNvbnN0YW50cy4KLQotVGh1IEp1biAxMSAxNzo1OTowMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fNDg2LCBFTV9TMzcwKTogQWRkIHRoZXNlIGNvbnN0YW50cy4KLQotVHVlIEp1biAgOSAwOTozNToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQVJNKTogQWRkIHRoaXMgY29uc3RhbnQuCi0KLVdlZCBNYXkgIDYgMDk6NDU6MzAgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoRUZfTUlQU19NQUNILEVfTUlQU19NQUNIXyopOiBBZGRlZC4KLQotU2F0IEFwciAyNSAxODozNTowNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS5oIChTVE9fQUxQSEFfTk9QViwgU1RPX0FMUEhBX1NURF9HUExPQUQpOiBOZXcuCi0KLVdlZCBBcHIgMTUgMTU6NDI6NDUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1NQQVJDNjQpOiBNb3ZlIGFuZCByZW5hbWUgdG8gRU1fT0xEX1NQQVJDVjkuCi0JKEVNX1NQQVJDVjkpOiBOZXcuICBUaGlzIGlzIHRoZSBvZmZpY2lhbCBBQkkgbmFtZSBhbmQgbnVtYmVyLgotCi1TYXQgRmViIDI4IDE3OjA0OjQxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmggKEVGX0FMUEhBXzMyQklULCBFRl9BTFBIQV9DQU5SRUxBWCk6IE5ldy4KLQotTW9uIERlYyAxNSAxNTowNzo0OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtMzJyLmggKEVGX00zMlJfQVJDSCwgRV9NMzJSX0FSQ0gpOiBOZXcgZmxhZ3MgdG8KLQlzcGVjaWZ5IG1hY2hpbmUgYXJjaGl0ZWN0dXJlLgotCi1GcmkgRGVjICA1IDExOjIwOjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogTmV3IGNvbnN0YW50czogU0hOX1Y4NTBfU0NPTU1PTiwgU0hOX1Y4NTBfVENPTU1PTiwKLQlTSE5fVjg1MF9aQ09NTU9OLCBTSFRfVjg1MF9TQ09NTU9OLCBTSFRfVjg1MF9UQ09NTU9OLAotCVNIVF9WODUwX1pDT01NT04gdG8gaGFuZGxlIHY4NTAgY29tbW9uIHNlY3Rpb25zLgotCWVudW0gcmVsb2NfdHlwZSByZW5hbWVkIHRvIHY4NTBfcmVsb2NfdHlwZSB0byBhdm9pZCBuYW1lCi0JY29uZmxpY3QuCi0KLVRodSBPY3QgMjMgMTM6NTU6MjQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoZW51bSBlbGZfc3BhcmNfcmVsb2NfdHlwZSk6IEFkZCBVQTY0ICYgVUExNi4KLQotVGh1IE9jdCAyMyAwMDo0MjowNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRFRfU1BBUkNfUkVHSVNURVIpOiBOZXcgbWFjcm8uCi0JKERUX1NQQVJDX1BMVEZNVCk6IEluIHN1cHBvcnQgb2Ygb2xkIHNwYXJjNjQtbGludXggLnBsdHM7IHdpbGwKLQlnbyBhd2F5IHNvb24uCi0KLVR1ZSBTZXAgMzAgMTM6MjY6NTggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRUZfU1BBUkNfSEFMX1IxLCBFRl9TUEFSQ19FWFRfTUFTSyk6IE5ldyBtYWNyb3MuCi0JKEVGX1NQQVJDVjlfe01NLFRTTyxQU08sUk1PfSk6IE5ldyBtYWNyb3MuCi0JKFNITl9CRUZPUkUsU0hOX0FGVEVSKTogTmV3IG1hY3Jvcy4KLQkoU0hGX0VYQ0xVREUsU0hGX09SREVSRUQpOiBOZXcgbWFjcm9zLgotCShTVFRfUkVHSVNURVIpOiBOZXcgbWFjcm8uCi0JKFJfU1BBUkNfR0xPQl9KTVApOiBEZWxldGVkLCBidXQgc2xvdCByZXNlcnZlZC4KLQkoUl9TUEFSQ197RElTUDY0LFBMVDY0LEhJWDIyLExPWDEwfSk6IE5ldyByZWxvY2F0aW9ucy4KLQkoUl9TUEFSQ197SDQ0LE00NCxMNDQsUkVHSVNURVJ9KTogTmV3IHJlbG9jYXRpb25zLgotCShFTEY2NF9SX1RZUEVfe0RBVEEsSUQsSU5GT30pOiBOZXcgbWFjcm9zLgotCi1XZWQgU2VwIDE3IDE2OjQxOjQyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogQWRkIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUIGFuZCBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULgotCi1UdWUgU2VwIDE2IDE0OjE2OjE3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAocmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVC4KLQotV2VkIFNlcCAgMyAxNToxMToxNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IENvcnJlY3QgdHlwbyBpbiBjb21tZW50LgotCi1XZWQgU2VwICAzIDExOjI1OjU3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAocmVsb2NfdHlwZSk6IFJlbW92ZSBSX1Y4NTBfMTZfUENSRUwuCi0KLVR1ZSBTZXAgIDIgMTc6NDE6MDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IFJlbW92ZSBtYWdpYyBudW1iZXIgZm9yIFY4NTBFLgotCSogY29tbW9uLmg6IFJlbW92ZSBtYWdpYyBudW1iZXIgZm9yIFY4NTBFQS4KLQkqIHY4NTAuaDogQWRkIG5ldyBmbGFncyBmb3IgZV9mbGFncyBmaWVsZCBpbiBlbGYgaGVhZGVyLgotCi1Nb24gQXVnIDI1IDE2OjA2OjQ3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfVjg1MEUpOiBiYWNrZW5kIG1hZ2ljIG51bWJlciBmb3Igdjg1MGUuCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1Y4NTBFQSk6IGJhY2tlbmQgbWFnaWMgbnVtYmVyIGZvciB2ODUwZWEuCi0KLU1vbiBBdWcgMTggMTE6MDU6MjMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogQWRkIDE2IGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLgotCi1GcmkgQXVnIDE1IDA1OjEwOjA5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFyYy5oIChlbnVtIHJlbG9jKTogTW92ZSBoZXJlIGZyb20gZWxmMzItYXJjLmMuCi0KLUZyaSBBdWcgIDggMTc6MDU6MjkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmggKEVNX0NZR05VU19BUkMpOiBEZWZpbmUuCi0KLU1vbiBKdW4gMTYgMTQ6NDY6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfRWhkcik6IENoYW5nZSBlX3Bob2ZmIGFuZCBlX3Nob2ZmIGZyb20KLQliZmRfc2lnbmVkX3ZtYSB0byBiZmRfc2l6ZV90eXBlLCBhcyB0aGV5IGFyZSBub3Qgc2lnbmVkLgotCi1XZWQgTWFyICA1IDE1OjM1OjI2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKFNIRl9NMzJSX0NBTl9SRUxBWCk6IERlZmluZS4KLQotTW9uIEZlYiAyNCAxNzo0OTowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4dGVybmFsLmg6IER1bXAgdGhlIDMyLzY0IGJpdCBzcGVjaWZpYyBmb3JtcyBvZiB0aGUgdmVyc2lvbgotCXN0cnVjdHVyZXMsIGFuZCBqdXN0IGRlZmluZSB0aGVtIGFzIHNpemUgaW5kZXBlbmRlbnQuCi0KLQkqIGNvbW1vbi5oIChWRVJTWU1fSElEREVOLCBWRVJTWU1fVkVSU0lPTik6IERlZmluZS4KLQotRnJpIEZlYiAyMSAxMzowMDozNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX00zMlJfU0RBMTYuCi0JKFNITl9NMzJSX1NDT01NT04pOiBEZWZpbmUuCi0KLVdlZCBGZWIgMTkgMTU6MzU6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZXh0ZXJuYWwuaCwgaW50ZXJuYWwuaCwgY29tbW9uLmg6IEFkZGVkIG5ldyBzdHJ1Y3R1cmVzIGFuZAotCWRlZmluaXRpb25zIGZvciBFTEYgdmVyc2lvbnMuCi0KLVR1ZSBGZWIgMTggMTc6NDA6MzYgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfRDMwVik6IERlZmluZS4KLQotTW9uIEphbiAyNyAxMTo1NDo0NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci5oIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9NMzJSX0hJMTZfW1NVXUxPLFJfTTMyUl9MTzE2LgotCi1GcmkgSmFuICAzIDExOjMyOjUxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChWODUwX09USEVSX3tUREFfQllURSxFUlJPUn0pOiBOZXcgYml0cyBmb3IgdGhlIHN0X290aGVyCi0JZmllbGQuCi0JKFNITl9WODUwXyopOiBSZW1vdmUgdjg1MCBzcGVjaWZpYyBzZWN0aW9uIGluZGV4ZXMsIHdoaWNoIGFyZSBub3QKLQluZWVkZWQuCi0JKGVudW0gcmVsb2NfdHlwZSk6IE1vdmUgdGhlIHY4NTAgcmVsb2NhdGlvbnMgaGVyZSBmcm9tCi0JZWxmMzItdjg1MC5jCi0KLVRodSBKYW4gIDIgMTk6MzA6MjMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLmg6IE5ldyBmaWxlLCBwcm92aWRlIFY4NTAgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCi0KLVR1ZSBEZWMgMzEgMTQ6NDQ6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRFRfQVVYSUxJQVJZKTogRGVmaW5lLgotCShEVF9GSUxURVIpOiBEZWZpbmUuCi0KLVdlZCBEZWMgIDQgMDU6MDM6MzcgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaDogVXBkYXRlLgotCi1UdWUgTm92IDI2IDEwOjQ0OjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTVE9fTUlQUzE2KTogRGVmaW5lLgotCi1UdWUgTm92IDEyIDE1OjQ1OjQyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IFJlbW92ZSBlbXB0eSBmaWxlLgotCi1UdWUgT2N0ICA4IDExOjMxOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX0FCSTIpOiBEZWZpbmUuCi0KLVRodSBPY3QgIDMgMTA6MDE6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb21tb24uaDogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gbW4xMDIwMCBhbmQgbW4xMDMwMC4KLQotV2VkIE9jdCAgMiAyMToyNjo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfTU4xMHgwMCk6IERlZmluZS4KLQotTW9uIFNlcCAyMyAwOToxODowNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci5oOiBOZXcgZmlsZS4KLQotRnJpIEF1ZyAzMCAxNzowNjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9TSCk6IERlZmluZS4KLQotVHVlIEF1ZyAyMCAxNDo0Nzo1NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19WODUwKTogRGVmaW5lLgotCi1Nb24gQXVnIDE5IDEwOjU5OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfTTMyUik6IERlZmluZS4KLQotTW9uIEp1bCAyMiAxODo1OTo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoU0hUX01JUFNfSUZBQ0UsIFNIVF9NSVBTX0NPTlRFTlQpOiBEZWZpbmUuCi0JKFNIVF9NSVBTX1NZTUJPTF9MSUIpOiBEZWZpbmUuCi0JKFNIRl9NSVBTX01FUkdFLCBTSEZfTUlQU19BRERSMzIsIFNIRl9NSVBTX0FERFI2NCk6IERlZmluZS4KLQkoU0hGX01JUFNfTk9TVFJJUCwgU0hGX01JUFNfTE9DQUwsIFNIRl9NSVBTX05BTUVTKTogRGVmaW5lLgotCi1UaHUgSnVsIDE4IDE5OjEyOjE1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmg6IE5ldyBmaWxlLgotCi1KdWwgMTggMTM6MjA6MzkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfRDEwVik6IERlZmluZS4KLQkqIGQxMHYuaDogTmV3IGZpbGUuCi0KLUZyaSBKdW4gMjEgMTI6MzM6MjQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmggKEVNX0FMUEhBKTogRGVmaW5lLgotCi1GcmkgTWF5IDMxIDE3OjI4OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFbGZfRXh0ZXJuYWxfT3B0aW9ucywgRWxmX0ludGVybmFsX09wdGlvbnMpOiBEZWZpbmUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4pOiBEZWNsYXJlLgotCShiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCk6IERlY2xhcmUuCi0JKE9ES18qKTogRGVmaW5lLgotCShFbGY2NF9FeHRlcm5hbF9SZWdJbmZvLCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvKTogRGVmaW5lLgotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4pOiBEZWNsYXJlLgotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0KTogRGVjbGFyZS4KLQotVGh1IE1heSAzMCAxMjozNTo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoRV9NSVBTX0FSQ0hfNCk6IERlZmluZS4KLQotV2VkIE1heSAyOSAxNTozNTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpOiBEZWZpbmUuCi0JKEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsKTogRGVmaW5lLgotCShFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEsIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSk6IERlZmluZS4KLQkoUlNTXyopOiBEZWZpbmUuCi0KLU1vbiBBcHIgMjIgMTg6MjY6MzAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoUl9TUEFSQ19bNTZdKTogQWx3YXlzIGRlZmluZS4KLQotTW9uIEZlYiAxOSAwMTo1NTo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoUl9TUEFSQ197UExUMzIsSElQTFQyMixMT1BMVDEwLFBDUExUMzIsUENQTFQyMiwKLQlQQ1BMVDEwLDUsNn0pOiBEb24ndCBkZWZpbmUgaWZkZWYgU1BBUkM2NF9PTERfUkVMT0NTLgotCi1UdWUgRmViICA2IDExOjMzOjU4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIHNwYXJjX2VsZl9yZWxvY190eXBlKTogRGVmaW5lLgotCi1XZWQgSmFuIDE3IDA5OjA5OjE2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oOiBEZWZpbmUgRU1fU1BBUkMzMlBMVVMuCi0JKiBzcGFyYy5oOiBOZXcgZmlsZS4KLQotVGh1IEphbiAxMSAxNjoyNzozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChTSEZfRVhDTFVERSwgU0hUX09SREVSRUQpOiBOZXcgZmllbGRzIGZyb20gdGhlIGFiaS4KLQotVGh1IE5vdiAzMCAxNjo0NzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApOiBBZGQgaW5jbHVkZXNfZmlsZWhkciBhbmQKLQlpbmNsdWRlc19waGRycyBmaWVsZHMuCi0KLVR1ZSBOb3YgMjggMTY6NTg6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKTogRGVmaW5lLgotCi1UdWUgT2N0IDMxIDE1OjE5OjM2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCwgZHdhcmYuaCwgZXh0ZXJuYWwuaCwgaHBwYS5oLCBpbnRlcm5hbC5oLAotCW1pcHMuaCwgcHBjLmg6ICBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQotVGh1IFNlcCAyMSAxMzo1MTo1OCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChFRl9QUENfUkVMT0NBVEFCTEVfTElCKTogQWRkIG5ldyBmbGFnIGJpdC4KLQotRnJpIFNlcCAgMSAxNTozMjoxNyAxOTk1ICBLYXp1bW90byBLb2ppbWEgIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4KLQotCSogbWlwcy5oOiBBZGQgc29tZSBkZWZpbml0aW9ucyB1c2VkIG9uIElyaXggNS4KLQotVHVlIEp1biAyMCAxMDoxODoyOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChDUFVfUEFfUklTQzFfMCk6IFByb3RlY3QgZnJvbSByZWRlZmluaXRpb25zLgotCShDUFVfUEFfUklTQzFfMSk6IExpa2V3aXNlLgotCi1XZWQgTWFyICA4IDE4OjE0OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmg6IE5ldyBmaWxlIGZvciBQb3dlclBDIHN1cHBvcnQuCi0KLVR1ZSBGZWIgMTQgMTM6NTk6MTMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDKTogVXNlIG9mZmljYWwgdmFsdWUgb2YgMjAsIG5vdCAxNy4KLQkoRU1fUFBDX09MRCk6IERlZmluZSB0aGlzIHRvIGJlIHRoZSBvbGQgdmFsdWUgb2YgRU1fUFBDLgotCi1UdWUgSmFuIDI0IDA5OjQwOjU5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1BQQyk6IE5ldyBtYWNybywgUG93ZXJQQyBtYWNoaW5lIGlkLgotCi1UdWUgSmFuIDE3IDEwOjUxOjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTSFRfTUlQU19NU1lNLCBTSFRfTUlQU19EV0FSRiwgU0hUX01JUFNfRVZFTlRTKTogRGVmaW5lLgotCi1Nb24gT2N0IDE3IDEzOjQzOjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVybmFsX1NoZHIpOiBSZW1vdmUgcmF3ZGF0YSBhbmQgc2l6ZSBmaWVsZHMuCi0JQWRkIGJmZF9zZWN0aW9uIGZpZWxkLgotCi1UdWUgTWF5IDI0IDE2OjExOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChFbGYzMl9FeHRlcm5hbF9ncHRhYik6IERlZmluZS4KLQotTW9uIE1heSAxNiAxMzoyMjowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29tbW9uLmggKEVNX0hQUEEpOiBEZWxldGUuCi0JKEVNX1BBUklTQyk6IEFkZC4KLQkqIGhwcGEuaDogTmV3IGZpbGUuCi0KLU1vbiBNYXkgIDkgMTM6Mjc6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoU0hOX0xPUkVTRVJWRSk6IFJlbmFtZSBmcm9tIFNITl9MT1JFU0VSVi4KLQkoRUxGMzJfUl9UWVBFLCBFTEYzMl9SX0lORk8pOiBEb24ndCByZWx5IG9uIHNpemUgb2YgdW5zaWduZWQgY2hhci4KLQkoRUxGNjRfUl9UWVBFKTogRG9uJ3QgcmVseSBvbiBzaXplIG9mIHVuc2lnbmVkIGxvbmcuCi0KLU1vbiBBcHIgMjUgMTU6NTM6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfU2hkcik6IFVzZSBQVFIsIG5vdCB2b2lkICouCi0KLUZyaSBNYXIgMTEgMDA6MzQ6NTkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBtaXBzLmggKFNITl9NSVBTX1RFWFQsIFNITl9NSVBTX0RBVEEpOiAgRGVmaW5lLgotCi1TYXQgTWFyICA1IDE0OjA4OjU0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaW50ZXJuYWwuaDogIFJlbW92ZSBFbGYzMl8qLCBFbGY2NF8qIHR5cGVkZWZzLiAgVGhlc2UgbmFtZXMKLQljYXVzZSBjb25mbGljdHMgd2l0aCBzeXN0ZW0gaGVhZGVycywgZS5nLiBsaW5rLmggaW4gZ2RiL3NvbGliLmMuCi0JQ29tYmluZSAzMi0gYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiAqX0ludGVybmFsX0R5bi4KLQkqIGNvbW1vbi5oOiAgUmVwbGFjZSB1c2VzIG9mIEVsZjY0X1dvcmQsIEVsZjY0X1h3b3JkIHR5cGVkZWZzCi0JYnkgdGhlaXIgZXhwYW5zaW9uLgotCSogbWlwcy5oOiAgUmVwbGFjZSB1c2VzIG9mIEVsZjMyX1dvcmQsIEVsZjMyX1N3b3JkLCBFbGYzMl9BZGRyCi0JdHlwZWRlZnMgYnkgdGhlaXIgZXhwYW5zaW9uLiBBZGQgRFRfTUlQU19STERfTUFQIGRlZmluaXRpb24uCi0KLUZyaSBGZWIgMTggMTA6Mzk6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1BPV0VSUEMpOiBEZWZpbmUuICBUaGlzIG1heSBiZSB0ZW1wb3JhcnksCi0JZGVwZW5kaW5nIHVwb24gaG93IHF1aWNrbHkgSSBjYW4gZmluZCBhIHJlYWwgUG93ZXJQQyBBQkkuCi0KLU1vbiBGZWIgIDcgMDg6Mjc6MTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBIT1NUXzY0X0JJVCB0byBCRkRfSE9TVF82NF9CSVQuCi0KLVdlZCBGZWIgIDIgMTQ6MTI6MTggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oOiBBZGQgY29tbWVudHMgcmVnYXJkaW5nIHZhbHVlIG9mIEVNX0hQUEEgYW5kIGhvdyB0bwotCXBpY2sgYW4gdW5vZmZpY2lhbCB2YWx1ZS4KLQotV2VkIE5vdiAxNyAxNzoxNDoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoU0hUX01JUFNfT1BUSU9OUyk6IERlZmluZS4KLQotTW9uIE5vdiAgOCAxNzo1NzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogQWRkZWQgc29tZSBtb3JlIE1JUFMgQUJJIG1hY3JvIGRlZmluaXRpb25zLgotCi1XZWQgTm92ICAzIDIyOjA3OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKEVNX01JUFNfUlM0X0JFKTogTmV3IG1hY3JvLgotCi1UdWUgT2N0IDEyIDA3OjI4OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBOZXcgZmlsZS4gIE1JUFMgQUJJIHNwZWNpZmljIGluZm9ybWF0aW9uLgotCi1Nb24gSnVuIDIxIDEzOjEzOjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBDb21iaW5lZCAzMi0gYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiBhbGwgc3RydWN0dXJlcwotCWV4Y2VwdCAqX0ludGVybmFsX0R5bi4gIFRoaXMgd2lsbCBzaW1wbHkgdGhlIGFzc2VtYmxlciBpbnRlcmZhY2UsCi0JYW5kIHNvbWUgYmZkIGNvZGUuCi0KLVR1ZSBNYXkgMjUgMDI6MDA6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBjb21tb24uaDogQWRkZWQgNjQtYml0IHZlcnNpb25zIG9mIHNvbWUKLQlzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MuICBSZW5hbWVkIG9sZCB2ZXJzaW9ucyB0byBwdXQgIjMyIiBpbiB0aGUKLQluYW1lLiAgU29tZSBhcmUgdW5jaGFuZ2VkLgotCi1UaHUgQXByIDI5IDEyOjEyOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fSFBQQSwgTlRfVkVSU0lPTiwgU1ROX1VOREVGLCBEVF8qKTogTmV3IG1hY3Jvcy4KLQkqIGV4dGVybmFsLmggKEVsZl9FeHRlcm5hbF9EeW4pOiBOZXcgdHlwZS4KLQotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVucmFsX1NoZHIpOiBOZXcgZmllbGQgYHNpemUnLgotCShFbGZfSW50ZXJuYWxfRHluKTogTmV3IHR5cGUuCi0KLVR1ZSBBcHIgMjAgMTY6MDM6NDUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmggKExBTkdfQ0hJTEwpOiAgQ2hhbmdlIHZhbHVlIHRvIG9uZSByYW5kb21seSBwaWNrZWQgaW4KLQl0aGUgdXNlciBkZWZpbmVkIHJhbmdlLCB0byByZWR1Y2UgcHJvYmFiaWxpdHkgb2YgY29sbGlzaW9ucy4KLQotU3VuIE5vdiAxNSAwOTozNDowMiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaCAoQVRfc3JjX2Nvb3Jkcyk6ICBXaGl0ZXNwYWNlIGNoYW5nZSBvbmx5LgotCSogZHdhcmYuaCAoQVRfYm9keV9iZWdpbiwgQVRfYm9keV9lbmQsIExBTkdfTU9EVUxBMik6Ci0JQWRkIGZyb20gbGF0ZXN0IGdjYy4KLQkqIGR3YXJmLmggKExBTkdfQ0hJTEwpOiAgQWRkIGFzIEdOVSBleHRlbnNpb24uCi0KLVNhdCBBdWcgIDEgMTM6NDY6NTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmg6ICBSZXBsYWNlIHdpdGggY3VycmVudCB2ZXJzaW9uIGZyb20gZ2NjIGRpc3RyaWJ1dGlvbi4KLQotRnJpIEp1biAxOSAxOTowNTowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogIEFkZCByZWFsIHN0cnVjdCB0YWdzIHRvIGFsbCB0aGUgVHlwZV9EZWZzLCBzbyB0aGV5Ci0JY2FuIGJlIHVzZWQgaW4gcHJvdG90eXBlcyB3aGVyZSB0aGUgVHlwZV9EZWZzIGFyZSBub3Qga25vd24uCi0KLUZyaSBBcHIgIDMgMjA6NTg6NTggMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmg6IGFkZGVkIEVMRl9SX3tTWU0sVFlQRSxJTkZPfSBmb3IgaGFuZGxpbmcgcmVsb2NhdGlvbgotCWluZm8KLQlhZGRlZCBFTV9NSVBTLCBhbmQgY29ycmVjdGVkIHZhbHVlIG9mIEVNXzg2MCBiYXNlZCBvbiBTeXN0ZW0gViBBQkkKLQltYW51YWwuCi0KLQkqIGV4dGVybmFsLmg6IGFkZGVkIEVsZl9FeHRlcm5hbF97UmVsLFJlbGF9LgotCi0JKiBpbnRlcm5hbC5oOiBhZGRlZCBFbGZfSW50ZXJuYWxfe1JlbCxSZWxhfS4KLQlhZGRlZCByYXdkYXRhIHRvIEVsZl9JbnRlcm5hbF9TaGRyLgotCi1TYXQgTm92IDMwIDIwOjQzOjU5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCwgZHdhcmYuaCwgZXh0ZXJuYWwuaCwgaW50ZXJuYWwuaCwgQ2hhbmdlTG9nOyBtb3ZlZCBmcm9tCi0JLi4vZWxmLTxmb28+Ci0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FscGhhLmggYi9pbmNsdWRlL2VsZi9hbHBoYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWU5ZDVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2FscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogQUxQSEEgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQnkgRXJpYyBZb3VuZ2RhbGUsIDxlcmljQGFpYi5jb20+LiAgTm8gcHJvY2Vzc29yIHN1cHBsZW1lbnQgYXZhaWxhYmxlCi0gICBmb3IgdGhpcyBwbGF0Zm9ybS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEFMUEhBIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX0FMUEhBX0gKLSNkZWZpbmUgX0VMRl9BTFBIQV9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIEFsbCBhZGRyZXNzZXMgbXVzdCBiZSBiZWxvdyAyR0IuICAqLwotI2RlZmluZSBFRl9BTFBIQV8zMkJJVAkJMHgwMDAwMDAwMQotCi0vKiBBbGwgcmVsb2NhdGlvbnMgbmVlZGVkIGZvciByZWxheGF0aW9uIHdpdGggY29kZSBtb3ZlbWVudCBhcmUgcHJlc2VudC4gICovCi0jZGVmaW5lIEVGX0FMUEhBX0NBTlJFTEFYCTB4MDAwMDAwMDIKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MuICAqLwotCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgZ2xvYmFsIGRhdGEgYXJlYS4gICovCi0jZGVmaW5lIFNIRl9BTFBIQV9HUFJFTAkJMHgxMDAwMDAwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHNvbWUgc29ydCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUgZXhhY3QKLSAgIGZvcm1hdCBpcyB1bnNwZWNpZmllZC4gIEl0J3MgcHJvYmFibHkgRUNPRkYgc3ltYm9scy4gICovCi0jZGVmaW5lIFNIVF9BTFBIQV9ERUJVRwkJMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX0FMUEhBX1JFR0lORk8JMHg3MDAwMDAwMgotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19SRUdJTkZPIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLSAgIHN0cnVjdHVyZS4gICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBNYXNrIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfZ3BybWFzazsKLSAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2Nwcm1hc2tbNF07Ci0gIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgbG9uZyByaV9ncF92YWx1ZTsKLX0gRWxmNjRfUmVnSW5mbzsKLQotLyogU3BlY2lhbCB2YWx1ZXMgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotI2RlZmluZSBTVE9fQUxQSEFfTk9QVgkJMHg4MAotI2RlZmluZSBTVE9fQUxQSEFfU1REX0dQTE9BRAkweDg4Ci0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIEFscGhhIHJlbG9jcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfYWxwaGFfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX05PTkUsIDApCS8qIE5vIHJlbG9jICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9SRUZMT05HLCAxKQkvKiBEaXJlY3QgMzIgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9SRUZRVUFELCAyKQkvKiBEaXJlY3QgNjQgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTDMyLCAzKQkvKiBHUCByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0xJVEVSQUwsIDQpCS8qIEdQIHJlbGF0aXZlIDE2IGJpdCB3L29wdGltaXphdGlvbiAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTElUVVNFLCA1KQkvKiBPcHRpbWl6YXRpb24gaGludCBmb3IgTElURVJBTCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BESVNQLCA2KQkvKiBBZGQgZGlzcGxhY2VtZW50IHRvIEdQICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9CUkFERFIsIDcpCS8qIFBDKzQgcmVsYXRpdmUgMjMgYml0IHNoaWZ0ZWQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0hJTlQsIDgpCS8qIFBDKzQgcmVsYXRpdmUgMTYgYml0IHNoaWZ0ZWQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUwxNiwgOSkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9TUkVMMzIsIDEwKQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUw2NCwgMTEpCS8qIFBDIHJlbGF0aXZlIDY0IGJpdCAqLwotCi0vKiBJbmhlcml0ZWQgdGhlc2UgZnJvbSBFQ09GRiwgYnV0IHRoZXkgYXJlIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsCi0gICBhbmQgYXJlIGRlcHJlY2lhdGVkLiAgQW5kIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgQkZELCBidHcuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfUFVTSCwgMTIpCS8qIE9QIHN0YWNrIHB1c2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX09QX1NUT1JFLCAxMykJLyogT1Agc3RhY2sgcG9wIGFuZCBzdG9yZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfUFNVQiwgMTQpCS8qIE9QIHN0YWNrIHN1YnRyYWN0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QUlNISUZULCAxNSkJLyogT1Agc3RhY2sgcmlnaHQgc2hpZnQgKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BWQUxVRSwgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTEhJR0gsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BSRUxMT1csIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfR1BfMTYsIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfR1BfSEkzMiwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9TQ05fSEkzMiwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9CUl9ISTMyLCAyMikKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX0xPMzIsIDIzKQotCi0vKiBUaGVzZSByZWxvY2F0aW9ucyBhcmUgc3BlY2lmaWMgdG8gc2hhcmVkIGxpYnJhcmllcy4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9DT1BZLCAyNCkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR0xPQl9EQVQsIDI1KQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9KTVBfU0xPVCwgMjYpCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFTEFUSVZFLCAyNykJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotCi0gIEVNUFRZX1JFTE9DICAoUl9BTFBIQV9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYgLyogX0VMRl9BTFBIQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9hcmMuaCBiL2luY2x1ZGUvZWxmL2FyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzRiNTVmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2FyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQVJDIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zLCAoZGplQGN5Z251cy5jb20pCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBBUkMgRUxGIEFCSS4gICovCi0KLSNpZm5kZWYgX0VMRl9BUkNfSAotI2RlZmluZSBfRUxGX0FSQ19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hcmNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSQ19OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDXzMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX0IyNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSQ19CMjJfUENSRUwsIDMpCi0gIEVNUFRZX1JFTE9DICAoUl9BUkNfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogRm91ciBiaXQgQVJDIG1hY2hpbmUgdHlwZSBmaWVsZC4gICovCi0jZGVmaW5lIEVGX0FSQ19NQUNICQkweDAwMDAwMDBmCi0KLS8qIFZhcmlvdXMgQ1BVIHR5cGVzLiAgKi8KLSNkZWZpbmUgRV9BUkNfTUFDSF9CQVNFCQkweDAwMDAwMDAwCi0jZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VEMQkweDAwMDAwMDAxCi0jZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VEMgkweDAwMDAwMDAyCi0jZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VENAkweDAwMDAwMDAzCi0KLS8qIExlYXZlIGJpdHMgMHhmMCBhbG9uZSBpbiBjYXNlIHdlIGV2ZXIgaGF2ZSBtb3JlIHRoYW4gMTYgY3B1IHR5cGVzLgotICAgSGlnaGx5IHVubGlrZWx5LCBidXQgd2hhdCB0aGUgaGVjay4gICovCi0KLS8qIEZpbGUgY29udGFpbnMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gICovCi0jZGVmaW5lIEVGX0FSQ19QSUMJCTB4MDAwMDAxMDAKLQotI2VuZGlmIC8qIF9FTEZfQVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FybS1vYWJpLmggYi9pbmNsdWRlL2VsZi9hcm0tb2FiaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTVlNzMxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2FybS1vYWJpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKiBBUk0gRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfQVJNX0gKLSNkZWZpbmUgX0VMRl9BUk1fSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotI2RlZmluZSBFRl9BUk1fUkVMRVhFQyAgICAgMHgwMQotI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAgMHgwMgotI2RlZmluZSBFRl9JTlRFUldPUksgICAgICAgMHgwNAotI2RlZmluZSBFRl9BUENTXzI2ICAgICAgICAgMHgwOAotI2RlZmluZSBFRl9BUENTX0ZMT0FUICAgICAgMHgxMAotI2RlZmluZSBFRl9QSUMgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBFRl9BTElHTjgJICAgMHg0MAkJLyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UuICAqLwotI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAotI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKLQotLyogTG9jYWwgYWxpYXNlcyBmb3Igc29tZSBmbGFncyB0byBtYXRjaCBuYW1lcyB1c2VkIGJ5IENPRkYgcG9ydC4gICovCi0jZGVmaW5lIEZfSU5URVJXT1JLCSAgIEVGX0lOVEVSV09SSwotI2RlZmluZSBGX0FQQ1MyNgkgICBFRl9BUENTXzI2Ci0jZGVmaW5lIEZfQVBDU19GTE9BVAkgICBFRl9BUENTX0ZMT0FUCi0jZGVmaW5lIEZfUElDICAgICAgICAgICAgICBFRl9QSUMKLQotLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iLiAgKi8KLSNkZWZpbmUgU1RUX0FSTV9URlVOQyAgICAgIFNUVF9MT1BST0MgICAvKiBBIFRodW1iIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgU1RUX0FSTV8xNkJJVCAgICAgIFNUVF9ISVBST0MgICAvKiBBIFRodW1iIGxhYmVsLiAgKi8KLQotLyogQVJNLXNwZWNpZmljIHZhbHVlcyBmb3Igc2hfZmxhZ3MuICAqLwotI2RlZmluZSBTSEZfRU5UUllTRUNUICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQuICAqLwotI2RlZmluZSBTSEZfQ09NREVGICAgICAgICAgMHg4MDAwMDAwMCAgIC8qIFNlY3Rpb24gbWF5IGJlIG11bHRpcGx5IGRlZmluZWQgaW4gdGhlIGlucHV0IHRvIGEgbGluayBzdGVwLiAgKi8KLQotLyogQVJNLXNwZWNpZmljIHByb2dyYW0gaGVhZGVyIGZsYWdzLiAgKi8KLSNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlLiAgKi8KLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfYXJtX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fTk9ORSwgICAgICAgICAwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BDMjQsICAgICAgICAgMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMzMiwgICAgICAgIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMMzIsICAgICAgICAzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzgsICAgICAgICAgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMxNiwgICAgICAgIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTIsICAgICAgICA2KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9BQlM1LCAgICAgNykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMyMiwgICAgIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fU0JSRUwzMiwgICAgICA5KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FNUF9WQ0FMTDksICAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMxMSwgICAgMTEpICAgICAgIC8qIEN5Z251cyBleHRlbnNpb24gdG8gYWJpOiBUaHVtYiB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOSwgICAgIDEyKSAgICAgICAvKiBDeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogVGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRFTlRSWSwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQ09QWSwgICAgICAgIDIwKSAgICAgICAvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTE9CX0RBVCwgICAgMjEpICAgICAgIC8qIENyZWF0ZSBHT1QgZW50cnkuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0pVTVBfU0xPVCwgICAyMikgICAgICAgLyogQ3JlYXRlIFBMVCBlbnRyeS4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMQVRJVkUsICAgIDIzKSAgICAgICAvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1RPRkYsICAgICAgMjQpICAgICAgIC8qIDMyIGJpdCBvZmZzZXQgdG8gR09ULiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1RQQywgICAgICAgMjUpICAgICAgIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09ULiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1QzMiwgICAgICAgMjYpICAgICAgIC8qIDMyIGJpdCBHT1QgZW50cnkuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BMVDMyLCAgICAgICAyNykgICAgICAgLyogMzIgYml0IFBMVCBhZGRyZXNzLiAgKi8KLSAgRkFLRV9SRUxPQyAgIChGSVJTVF9JTlZBTElEX1JFTE9DLCAyOCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MsICAyNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlNCUkVMMzIsICAgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9SUEMyMiwgIDI1MSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SUkVMMzIsICAgICAyNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkFCUzMyLCAgICAgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JQQzI0LCAgICAgIDI1NCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQkFTRSwgICAgICAyNTUpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FybS5oIGIvaW5jbHVkZS9lbGYvYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzQwNWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKiBBUk0gRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfQVJNX0gKLSNkZWZpbmUgX0VMRl9BUk1fSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotI2RlZmluZSBFRl9BUk1fUkVMRVhFQyAgICAgMHgwMQotI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAgMHgwMgotI2RlZmluZSBFRl9JTlRFUldPUksgICAgICAgMHgwNAotI2RlZmluZSBFRl9BUENTXzI2ICAgICAgICAgMHgwOAotI2RlZmluZSBFRl9BUENTX0ZMT0FUICAgICAgMHgxMAotI2RlZmluZSBFRl9QSUMgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBFRl9BTElHTjgJICAgMHg0MAkJLyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UuICAqLwotI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAotI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKLSNkZWZpbmUgRUZfU09GVF9GTE9BVCAgICAgIDB4MjAwCi0KLS8qIExvY2FsIGFsaWFzZXMgZm9yIHNvbWUgZmxhZ3MgdG8gbWF0Y2ggbmFtZXMgdXNlZCBieSBDT0ZGIHBvcnQuICAqLwotI2RlZmluZSBGX0lOVEVSV09SSwkgICBFRl9JTlRFUldPUksKLSNkZWZpbmUgRl9BUENTMjYJICAgRUZfQVBDU18yNgotI2RlZmluZSBGX0FQQ1NfRkxPQVQJICAgRUZfQVBDU19GTE9BVAotI2RlZmluZSBGX1BJQyAgICAgICAgICAgICAgRUZfUElDCi0jZGVmaW5lIEZfU09GVF9GTE9BVAkgICBFRl9TT0ZUX0ZMT0FUCi0KLS8qIEFkZGl0aW9uYWwgc3ltYm9sIHR5cGVzIGZvciBUaHVtYi4gICovCi0jZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgICBTVFRfTE9QUk9DICAgLyogQSBUaHVtYiBmdW5jdGlvbi4gICovCi0jZGVmaW5lIFNUVF9BUk1fMTZCSVQgICAgICBTVFRfSElQUk9DICAgLyogQSBUaHVtYiBsYWJlbC4gICovCi0KLS8qIEFSTS1zcGVjaWZpYyB2YWx1ZXMgZm9yIHNoX2ZsYWdzLiAgKi8KLSNkZWZpbmUgU0hGX0VOVFJZU0VDVCAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWN0aW9uIGNvbnRhaW5zIGFuIGVudHJ5IHBvaW50LiAgKi8KLSNkZWZpbmUgU0hGX0NPTURFRiAgICAgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcC4gICovCi0KLS8qIEFSTS1zcGVjaWZpYyBwcm9ncmFtIGhlYWRlciBmbGFncy4gICovCi0jZGVmaW5lIFBGX0FSTV9TQiAgICAgICAgICAweDEwMDAwMDAwICAgLyogU2VnbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gYWRkcmVzc2VkIGJ5IHRoZSBzdGF0aWMgYmFzZS4gICovCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FybV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX05PTkUsICAgICAgICAgMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzI0LCAgICAgICAgIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMzIsICAgICAgICAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTDMyLCAgICAgICAgMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzEzLCAgICAgICAgIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTYsICAgICAgICA1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgNikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fQUJTNSwgICAgIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTOCwgICAgICAgICA4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgOSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMyMiwgICAgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOCwgICAgIDExKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FNUF9WQ0FMTDksICAxMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9TV0kyNCwgICAgICAgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1NXSTgsICAgIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1hQQzI1LCAgICAgICAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fWFBDMjIsICAgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQ09QWSwgICAgICAgIDIwKSAgICAgICAvKiBjb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR0xPQl9EQVQsICAgIDIxKSAgICAgICAvKiBjcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fSlVNUF9TTE9ULCAgIDIyKSAgICAgICAvKiBjcmVhdGUgUExUIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMQVRJVkUsICAgIDIzKSAgICAgICAvKiBhZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UT0ZGLCAgICAgIDI0KSAgICAgICAvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVFBDLCAgICAgICAyNSkgICAgICAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1QzMiwgICAgICAgMjYpICAgICAgIC8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QTFQzMiwgICAgICAgMjcpICAgICAgIC8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MxLCAyOCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MxLCAgOTkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZURU5UUlksIDEwMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAxMDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMTEsICAgIDEwMikgICAgICAgLyogQ3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IFRodW1iIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOSwgICAgIDEwMykgICAgICAgLyogQ3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IFRodW1iIGNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MyLCAxMDQpCi0gIEZBS0VfUkVMT0MgICAoTEFTVF9JTlZBTElEX1JFTE9DMiwgIDI0OCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SWFBDMjUsICAgICAyNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlNCUkVMMzIsICAgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9SUEMyMiwgIDI1MSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SUkVMMzIsICAgICAyNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkFCUzMyLCAgICAgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JQQzI0LCAgICAgIDI1NCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQkFTRSwgICAgICAyNTUpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2F2ci5oIGIvaW5jbHVkZS9lbGYvYXZyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Mjc0NTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXZyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKiBBVlIgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERlbmlzIENoZXJ0eWtvdiA8ZGVuaXNjQG92ZXJ0YS5ydT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfQVZSX0gKLSNkZWZpbmUgX0VMRl9BVlJfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotI2RlZmluZSBFRl9BVlJfTUFDSCAweGYKLQotI2RlZmluZSBFX0FWUl9NQUNIX0FWUjEgMQotI2RlZmluZSBFX0FWUl9NQUNIX0FWUjIgMgotI2RlZmluZSBFX0FWUl9NQUNIX0FWUjMgMwotI2RlZmluZSBFX0FWUl9NQUNIX0FWUjQgNAotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfYXZyX3JlbG9jX3R5cGUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfTk9ORSwJCQkwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSXzMyLAkJCTEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfN19QQ1JFTCwJCTIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfMTNfUENSRUwsCQkzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSXzE2LCAJCQk0KQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSXzE2X1BNLCAJCTUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfTE84X0xESSwJCTYpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfSEk4X0xESSwJCTcpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfSEg4X0xESSwJCTgpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfTE84X0xESV9ORUcsCQk5KQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0hJOF9MRElfTkVHLAkgICAgICAgMTApCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfSEg4X0xESV9ORUcsCSAgICAgICAxMSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX0FWUl9MTzhfTERJX1BNLAkgICAgICAgMTIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfSEk4X0xESV9QTSwJICAgICAgIDEzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0hIOF9MRElfUE0sCSAgICAgICAxNCkKLSAgICAgUkVMT0NfTlVNQkVSIChSX0FWUl9MTzhfTERJX1BNX05FRywgICAgICAgMTUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9BVlJfSEk4X0xESV9QTV9ORUcsICAgICAgIDE2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfQVZSX0hIOF9MRElfUE1fTkVHLCAgICAgICAxNykKLSAgICAgUkVMT0NfTlVNQkVSIChSX0FWUl9DQUxMLAkJICAgICAgIDE4KQotICAgICBFTVBUWV9SRUxPQyAgKFJfQVZSX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0FWUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9jb21tb24uaCBiL2luY2x1ZGUvZWxmL2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZThjMjE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTU1ICswLDAgQEAKLS8qIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLgotICAgRm9yIGV4YW1wbGUsIEVMRk1BRzAgaXMgdGhlIGJ5dGUgMHg3RiBpbiBib3RoIHRoZSBpbnRlcm5hbCAoaW4tbWVtb3J5KQotICAgYW5kIGV4dGVybmFsIChpbi1maWxlKSByZXByZXNlbnRhdGlvbnMuICovCi0KLSNpZm5kZWYgX0VMRl9DT01NT05fSAotI2RlZmluZSBfRUxGX0NPTU1PTl9ICi0KLS8qIEZpZWxkcyBpbiBlX2lkZW50W10gKi8KLQotI2RlZmluZSBFSV9NQUcwCQkwCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAwIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzAJCTB4N0YJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMCAqLwotCi0jZGVmaW5lIEVJX01BRzEJCTEJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDEgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMQkJJ0UnCS8qIE1hZ2ljIG51bWJlciBieXRlIDEgKi8KLQotI2RlZmluZSBFSV9NQUcyCQkyCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAyIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzIJCSdMJwkvKiBNYWdpYyBudW1iZXIgYnl0ZSAyICovCi0KLSNkZWZpbmUgRUlfTUFHMwkJMwkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMyBpbmRleCAqLwotI2RlZmluZSBFTEZNQUczCQknRicJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMyAqLwotCi0jZGVmaW5lIEVJX0NMQVNTCTQJLyogRmlsZSBjbGFzcyAqLwotI2RlZmluZSBFTEZDTEFTU05PTkUJMAkvKiBJbnZhbGlkIGNsYXNzICovCi0jZGVmaW5lIEVMRkNMQVNTMzIJMQkvKiAzMi1iaXQgb2JqZWN0cyAqLwotI2RlZmluZSBFTEZDTEFTUzY0CTIJLyogNjQtYml0IG9iamVjdHMgKi8KLQotI2RlZmluZSBFSV9EQVRBCQk1CS8qIERhdGEgZW5jb2RpbmcgKi8KLSNkZWZpbmUgRUxGREFUQU5PTkUJMAkvKiBJbnZhbGlkIGRhdGEgZW5jb2RpbmcgKi8KLSNkZWZpbmUgRUxGREFUQTJMU0IJMQkvKiAyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiAqLwotI2RlZmluZSBFTEZEQVRBMk1TQgkyCS8qIDIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuICovCi0KLSNkZWZpbmUgRUlfVkVSU0lPTgk2CS8qIEZpbGUgdmVyc2lvbiAqLwotCi0jZGVmaW5lIEVJX09TQUJJICAgICAgICA3ICAgICAgIC8qIE9wZXJhdGluZyBTeXN0ZW0vQUJJIGluZGljYXRpb24gKi8KLSNkZWZpbmUgRUxGT1NBQklfU1lTViAgIDAgICAgICAgLyogVU5JWCBTeXN0ZW0gViBBQkkgKi8KLSNkZWZpbmUgRUxGT1NBQklfSFBVWCAgIDEgICAgICAgLyogSFAtVVggb3BlcmF0aW5nIHN5c3RlbSAqLwotI2RlZmluZSBFTEZPU0FCSV9MSU5VWCAgMyAgICAgICAvKiBHTlUvTGludXggKi8KLSNkZWZpbmUgRUxGT1NBQklfU1RBTkRBTE9ORSAyNTUgLyogU3RhbmRhbG9uZSAoZW1iZWRkZWQpIGFwcGxpY2F0aW9uICovCi0jZGVmaW5lIEVMRk9TQUJJX0FSTSAgIDk3CQkvKiBBUk0gKi8KLQotI2RlZmluZSBFSV9BQklWRVJTSU9OICAgOCAgICAgICAvKiBBQkkgdmVyc2lvbiAqLwotCi0jZGVmaW5lIEVJX1BBRAkJOQkvKiBTdGFydCBvZiBwYWRkaW5nIGJ5dGVzICovCi0KLQotLyogVmFsdWVzIGZvciBlX3R5cGUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIG9iamVjdCBmaWxlIHR5cGUgKi8KLQotI2RlZmluZSBFVF9OT05FCQkwCS8qIE5vIGZpbGUgdHlwZSAqLwotI2RlZmluZSBFVF9SRUwJCTEJLyogUmVsb2NhdGFibGUgZmlsZSAqLwotI2RlZmluZSBFVF9FWEVDCQkyCS8qIEV4ZWN1dGFibGUgZmlsZSAqLwotI2RlZmluZSBFVF9EWU4JCTMJLyogU2hhcmVkIG9iamVjdCBmaWxlICovCi0jZGVmaW5lIEVUX0NPUkUJCTQJLyogQ29yZSBmaWxlICovCi0jZGVmaW5lIEVUX0xPT1MgICAgICAgICAweEZFMDAJLyogT3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyAqLwotI2RlZmluZSBFVF9ISU9TICAgICAgICAgMHhGRUZGICAvKiBPcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0xPUFJPQwkweEZGMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0hJUFJPQwkweEZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0KLS8qIFZhbHVlcyBmb3IgZV9tYWNoaW5lLCB3aGljaCBpZGVudGlmaWVzIHRoZSBhcmNoaXRlY3R1cmUgKi8KLQotI2RlZmluZSBFTV9OT05FCQkwCS8qIE5vIG1hY2hpbmUgKi8KLSNkZWZpbmUgRU1fTTMyCQkxCS8qIEFUJlQgV0UgMzIxMDAgKi8KLSNkZWZpbmUgRU1fU1BBUkMJMgkvKiBTVU4gU1BBUkMgKi8KLSNkZWZpbmUgRU1fMzg2CQkzCS8qIEludGVsIDgwMzg2ICovCi0jZGVmaW5lIEVNXzY4SwkJNAkvKiBNb3Rvcm9sYSBtNjhrIGZhbWlseSAqLwotI2RlZmluZSBFTV84OEsJCTUJLyogTW90b3JvbGEgbTg4ayBmYW1pbHkgKi8KLSNkZWZpbmUgRU1fNDg2CQk2CS8qIEludGVsIDgwNDg2ICovCi0jZGVmaW5lIEVNXzg2MAkJNwkvKiBJbnRlbCA4MDg2MCAqLwotI2RlZmluZSBFTV9NSVBTCQk4CS8qIE1JUFMgUjMwMDAgKG9mZmljaWFsbHksIGJpZy1lbmRpYW4gb25seSkgKi8KLSNkZWZpbmUgRU1fUzM3MAkJOQkvKiBJQk0gU3lzdGVtLzM3MCAqLwotI2RlZmluZSBFTV9NSVBTX1JTNF9CRSAxMAkvKiBNSVBTIFI0MDAwIGJpZy1lbmRpYW4gKi8gLyogRGVwcmVjaWF0ZWQgKi8KLSNkZWZpbmUgRU1fTUlQU19SUzNfTEUgMTAJLyogTUlQUyBSMzAwMCBsaXR0bGUtZW5kaWFuIChPY3QgNCAxOTk5IERyYWZ0KSovIC8qIERlcHJlY2lhdGVkICovCi0KLSNkZWZpbmUgRU1fUEFSSVNDICAgICAgMTUJLyogSFBQQSAqLwotCi0jZGVmaW5lIEVNX1ZQUDU1MCAgICAgIDE3ICAgICAgIC8qIEZ1aml0c3UgVlBQNTAwICovCi0jZGVmaW5lIEVNX1NQQVJDMzJQTFVTIDE4CS8qIFN1bidzICJ2OHBsdXMiICovCi0jZGVmaW5lIEVNXzk2MCAgICAgICAgIDE5ICAgICAgIC8qIEludGVsIDgwOTYwICovCi0jZGVmaW5lIEVNX1BQQwkgICAgICAgMjAJLyogUG93ZXJQQyAqLwotI2RlZmluZSBFTV9QUEM2NCAgICAgICAyMQkvKiA2NC1iaXQgUG93ZXJQQyAqLwotCi0jZGVmaW5lIEVNX1Y4MDAgICAgICAgIDM2CS8qIE5FQyBWODAwIHNlcmllcyAqLwotI2RlZmluZSBFTV9GUjIwCSAgICAgICAzNwkvKiBGdWppdHN1IEZSMjAgKi8KLSNkZWZpbmUgRU1fUkgzMgkgICAgICAgMzggICAgICAgLyogVFJXIFJIMzIgKi8KLSNkZWZpbmUgRU1fTUNPUkUgICAgICAgMzkgICAgICAgLyogTW90b3JvbGEgTSpDb3JlICovIC8qIE1heSBhbHNvIGJlIHRha2VuIGJ5IEZ1aml0c3UgTU1BICovCi0jZGVmaW5lIEVNX1JDRSAgICAgICAgIDM5ICAgICAgIC8qIE9sZCBuYW1lIGZvciBNQ29yZSAqLwotI2RlZmluZSBFTV9BUk0JICAgICAgIDQwCS8qIEFSTSAqLwotI2RlZmluZSBFTV9PTERfQUxQSEEgICA0MQkvKiBEaWdpdGFsIEFscGhhICovCi0jZGVmaW5lIEVNX1NICSAgICAgICA0MgkvKiBIaXRhY2hpIFNIICovCi0jZGVmaW5lIEVNX1NQQVJDVjkgICAgIDQzCS8qIFNQQVJDIHY5IDY0LWJpdCAqLwotI2RlZmluZSBFTV9UUklDT1JFICAgICA0NCAgICAgICAvKiBTaWVtZW5zIFRyaWNvcmUgZW1iZWRkZWQgcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX0FSQyAgICAgICAgIDQ1ICAgICAgIC8qIEFyZ29uYXV0IFJJU0MgQ29yZSwgQXJnb25hdXQgVGVjaG5vbG9naWVzIEluYy4gKi8KLSNkZWZpbmUgRU1fSDhfMzAwICAgICAgNDYgICAgICAgLyogSGl0YWNoaSBIOC8zMDAgKi8KLSNkZWZpbmUgRU1fSDhfMzAwSCAgICAgNDcgICAgICAgLyogSGl0YWNoaSBIOC8zMDBIICovCi0jZGVmaW5lIEVNX0g4UyAgICAgICAgIDQ4ICAgICAgIC8qIEhpdGFjaGkgSDhTICovCi0jZGVmaW5lIEVNX0g4XzUwMCAgICAgIDQ5ICAgICAgIC8qIEhpdGFjaGkgSDgvNTAwICovCi0jZGVmaW5lIEVNX0lBXzY0ICAgICAgIDUwICAgICAgIC8qIEludGVsIElBLTY0IFByb2Nlc3NvciAqLwotI2RlZmluZSBFTV9NSVBTX1ggICAgICA1MSAgICAgICAvKiBTdGFuZm9yZCBNSVBTLVggKi8KLSNkZWZpbmUgRU1fQ09MREZJUkUgICAgNTIgICAgICAgLyogTW90b3JvbGEgQ29sZGZpcmUgKi8KLSNkZWZpbmUgRU1fNjhIQzEyICAgICAgNTMgICAgICAgLyogTW90b3JvbGEgTTY4SEMxMiAqLwotI2RlZmluZSBFTV9NTUEJICAgICAgIDU0CS8qIEZ1aml0c3UgTXVsdGltZWRpYSBBY2NlbGVyYXRvciAqLwotI2RlZmluZSBFTV9QQ1AJICAgICAgIDU1CS8qIFNpZW1lbnMgUENQICovCi0jZGVmaW5lIEVNX05DUFUJICAgICAgIDU2CS8qIFNvbnkgbkNQVSBlbWJlZGRlZCBSSVNDIHByb2Nlc3NvciAqLwotI2RlZmluZSBFTV9ORFIxCSAgICAgICA1NwkvKiBEZW5zbyBORFIxIG1pY3JvcHJvY2Vzc3ByICovCi0jZGVmaW5lIEVNX1NUQVJDT1JFICAgIDU4CS8qIE1vdG9yb2xhIFN0YXIqQ29yZSBwcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fTUUxNgkgICAgICAgNTkJLyogVG95b3RhIE1FMTYgcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX1NUMTAwICAgICAgIDYwCS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVDEwMCBwcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fVElOWUogICAgICAgNjEJLyogQWR2YW5jZWQgTG9naWMgQ29ycC4gVGlueUogZW1iZWRkZWQgcHJvY2Vzc29yICovCi0KLSNkZWZpbmUgRU1fRlg2NgkgICAgICAgNjYJLyogU2llbWVucyBGWDY2IG1pY3JvY29udHJvbGxlciAqLwotI2RlZmluZSBFTV9TVDlQTFVTICAgICA2NwkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1Q5KyA4LzE2IGJpdCBtaWNyb2NvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRU1fU1Q3CSAgICAgICA2OAkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1Q3IDgtYml0IG1pY3JvY29udHJvbGxlciAqLwotI2RlZmluZSBFTV82OEhDMTYgICAgICA2OQkvKiBNb3Rvcm9sYSBNQzY4SEMxNiBNaWNyb2NvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRU1fNjhIQzExICAgICAgNzAJLyogTW90b3JvbGEgTUM2OEhDMTEgTWljcm9jb250cm9sbGVyICovCi0jZGVmaW5lIEVNXzY4SEMwOCAgICAgIDcxCS8qIE1vdG9yb2xhIE1DNjhIQzA4IE1pY3JvY29udHJvbGxlciAqLwotI2RlZmluZSBFTV82OEhDMDUgICAgICA3MgkvKiBNb3Rvcm9sYSBNQzY4SEMwNSBNaWNyb2NvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRU1fU1ZYICAgICAgICAgNzMJLyogU2lsaWNvbiBHcmFwaGljcyBTVnggKi8KLSNkZWZpbmUgRU1fU1QxOSAgICAgICAgNzQJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUMTkgOC1iaXQgbWljcm9jb250cm9sbGVyICovCi0jZGVmaW5lIEVNX1ZBWCAgICAgICAgIDc1CS8qIERpZ2l0YWwgVkFYICovCi0KLSNkZWZpbmUgRU1fUEogICAgICAgICAgOTkgICAgICAgLyogcGljb0phdmEgKi8KLQotLyogSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFzc2lnbiBuZXcgdW5vZmZpY2lhbCBFTV8qIHZhbHVlcywgcGxlYXNlIHBpY2sgbGFyZ2UKLSAgIHJhbmRvbSBudW1iZXJzICgweDg1MjMsIDB4YTdmMiwgZXRjLikgdG8gbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgY29sbGlzaW9uCi0gICB3aXRoIG9mZmljaWFsIG9yIG5vbi1HTlUgdW5vZmZpY2lhbCB2YWx1ZXMuCi0KLSAgIE5PVEU6IERvIG5vdCBqdXN0IGluY3JlbWVudCB0aGUgbW9zdCByZWNlbnQgbnVtYmVyIGJ5IG9uZS4KLSAgIFNvbWVib2R5IGVsc2Ugc29tZXdoZXJlIHdpbGwgZG8gZXhhY3RseSB0aGUgc2FtZSB0aGluZywgYW5kIHlvdQotICAgd2lsbCBoYXZlIGEgY29sbGlzaW9uLiAgSW5zdGVhZCwgcGljayBhIHJhbmRvbSBudW1iZXIuICAqLwotCi0vKiBDeWdudXMgUG93ZXJQQyBFTEYgYmFja2VuZC4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX1BPV0VSUEMgMHg5MDI1Ci0KLS8qIE9sZCB2ZXJzaW9uIG9mIFNwYXJjIHY5LCBmcm9tIGJlZm9yZSB0aGUgQUJJOyB0aGlzIHNob3VsZCBiZQotICAgcmVtb3ZlZCBzaG9ydGx5LiAgKi8KLSNkZWZpbmUgRU1fT0xEX1NQQVJDVjkJMTEKLQotLyogT2xkIHZlcnNpb24gb2YgUG93ZXJQQywgdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBzaG9ydGx5LiAqLwotI2RlZmluZSBFTV9QUENfT0xECTE3Ci0KLS8qIEN5Z251cyBBUkMgRUxGIGJhY2tlbmQuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19BUkMgMHg5MDQwCi0KLS8qIEN5Z251cyBNMzJSIEVMRiBiYWNrZW5kLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfTTMyUiAweDkwNDEKLQotLyogQWxwaGEgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0FMUEhBCTB4OTAyNgotCi0vKiBEMTBWIGJhY2tlbmQgbWFnaWMgbnVtYmVyLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfRDEwVgkweDc2NTAKLQotLyogRDMwViBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0QzMFYJMHg3Njc2Ci0KLS8qIFY4NTAgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbnNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19WODUwCTB4OTA4MAotCi0vKiBtbjEwMjAwIGFuZCBtbjEwMzAwIGJhY2tlbmQgbWFnaWMgbnVtYmVycy4KLSAgIFdyaXR0ZW4gaW4gdGhlIGFic2Vuc2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX01OMTAyMDAJMHhkZWFkCi0jZGVmaW5lIEVNX0NZR05VU19NTjEwMzAwCTB4YmVlZgotCi0vKiBGUjMwIG1hZ2ljIG51bWJlciAtIG5vIEVBQkkgYXZhaWxhYmxlLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0ZSMzAJCTB4MzMzMAotCi0vKiBBVlIgbWFnaWMgbnVtYmVyCi0gICBXcml0dGVuIGluIHRoZSBhYnNlbnNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0FWUgkJCTB4MTA1NwotCi0vKiBTZWUgdGhlIGFib3ZlIGNvbW1lbnQgYmVmb3JlIHlvdSBhZGQgYSBuZXcgRU1fKiB2YWx1ZSBoZXJlLiAgKi8KLQotLyogVmFsdWVzIGZvciBlX3ZlcnNpb24gKi8KLQotI2RlZmluZSBFVl9OT05FCQkwCQkvKiBJbnZhbGlkIEVMRiB2ZXJzaW9uICovCi0jZGVmaW5lIEVWX0NVUlJFTlQJMQkJLyogQ3VycmVudCB2ZXJzaW9uICovCi0KLS8qIFZhbHVlcyBmb3IgcHJvZ3JhbSBoZWFkZXIsIHBfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lCVBUX05VTEwJCTAJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLwotI2RlZmluZSBQVF9MT0FECQkxCQkvKiBMb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgKi8KLSNkZWZpbmUgUFRfRFlOQU1JQwkyCQkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgUFRfSU5URVJQCTMJCS8qIFByb2dyYW0gaW50ZXJwcmV0ZXIgKi8KLSNkZWZpbmUgUFRfTk9URQkJNAkJLyogQXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFBUX1NITElCCTUJCS8qIFJlc2VydmVkLCB1bnNwZWNpZmllZCBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgUFRfUEhEUgkJNgkJLyogRW50cnkgZm9yIGhlYWRlciB0YWJsZSBpdHNlbGYgKi8KLSNkZWZpbmUgUFRfTE9PUyAgICAgICAgIDB4NjAwMDAwMDAJLyogT1Mtc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfSElPUyAgICAgICAgIDB4NmZmZmZmZmYJLyogT1Mtc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIFBUX0hJUFJPQwkweDdGRkZGRkZGCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyAqLwotCi0vKiBQcm9ncmFtIHNlZ21lbnQgcGVybWlzc2lvbnMsIGluIHByb2dyYW0gaGVhZGVyIHBfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBQRl9YCQkoMSA8PCAwKQkvKiBTZWdtZW50IGlzIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgUEZfVwkJKDEgPDwgMSkJLyogU2VnbWVudCBpcyB3cml0YWJsZSAqLwotI2RlZmluZSBQRl9SCQkoMSA8PCAyKQkvKiBTZWdtZW50IGlzIHJlYWRhYmxlICovCi0vKiAjZGVmaW5lIFBGX01BU0tPUwkweDBGMDAwMDAwICAgICovLyogT1Mtc3BlY2lmaWMgcmVzZXJ2ZWQgYml0cyAqLwotI2RlZmluZSBQRl9NQVNLT1MJMHgwRkYwMDAwMAkvKiBOZXcgdmFsdWUsIE9jdCA0LCAxOTk5IERyYWZ0ICovCi0jZGVmaW5lIFBGX01BU0tQUk9DCTB4RjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljIHJlc2VydmVkIGJpdHMgKi8KLQotLyogVmFsdWVzIGZvciBzZWN0aW9uIGhlYWRlciwgc2hfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lIFNIVF9OVUxMCTAJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLwotI2RlZmluZSBTSFRfUFJPR0JJVFMJMQkJLyogUHJvZ3JhbSBzcGVjaWZpYyAocHJpdmF0ZSkgZGF0YSAqLwotI2RlZmluZSBTSFRfU1lNVEFCCTIJCS8qIExpbmsgZWRpdGluZyBzeW1ib2wgdGFibGUgKi8KLSNkZWZpbmUgU0hUX1NUUlRBQgkzCQkvKiBBIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTSFRfUkVMQQk0CQkvKiBSZWxvY2F0aW9uIGVudHJpZXMgd2l0aCBhZGRlbmRzICovCi0jZGVmaW5lIFNIVF9IQVNICTUJCS8qIEEgc3ltYm9sIGhhc2ggdGFibGUgKi8KLSNkZWZpbmUgU0hUX0RZTkFNSUMJNgkJLyogSW5mb3JtYXRpb24gZm9yIGR5bmFtaWMgbGlua2luZyAqLwotI2RlZmluZSBTSFRfTk9URQk3CQkvKiBJbmZvcm1hdGlvbiB0aGF0IG1hcmtzIGZpbGUgKi8KLSNkZWZpbmUgU0hUX05PQklUUwk4CQkvKiBTZWN0aW9uIG9jY3VwaWVzIG5vIHNwYWNlIGluIGZpbGUgKi8KLSNkZWZpbmUgU0hUX1JFTAkJOQkJLyogUmVsb2NhdGlvbiBlbnRyaWVzLCBubyBhZGRlbmRzICovCi0jZGVmaW5lIFNIVF9TSExJQgkxMAkJLyogUmVzZXJ2ZWQsIHVuc3BlY2lmaWVkIHNlbWFudGljcyAqLwotI2RlZmluZSBTSFRfRFlOU1lNCTExCQkvKiBEeW5hbWljIGxpbmtpbmcgc3ltYm9sIHRhYmxlICovCi0KLSNkZWZpbmUgU0hUX0lOSVRfQVJSQVkgIDE0CQkvKiBBcnJheSBvZiBwb2ludGVycyB0byBpbml0IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBTSFRfRklOSV9BUlJBWSAgMTUJCS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIGZpbmlzaCBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgU0hUX1BSRUlOSVRfQVJSQVkgMTYJCS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIHByZS1pbml0IGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIFNIVF9MT09TICAgICAgICAweDYwMDAwMDAwICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCi0jZGVmaW5lIFNIVF9ISU9TICAgICAgICAweDZmZmZmZmZmICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGhpICovCi0KLS8qIFRoZSBuZXh0IHRocmVlIHNlY3Rpb24gdHlwZXMgYXJlIGRlZmluZWQgYnkgU29sYXJpcywgYW5kIGFyZSBuYW1lZAotICAgU0hUX1NVTlcqLiAgV2UgdXNlIHRoZW0gaW4gR05VIGNvZGUsIHNvIHdlIGFsc28gZGVmaW5lIFNIVF9HTlUqCi0gICB2ZXJzaW9ucy4gICovCi0jZGVmaW5lIFNIVF9TVU5XX3ZlcmRlZgkweDZmZmZmZmZkCS8qIFZlcnNpb25zIGRlZmluZWQgYnkgZmlsZSAqLwotI2RlZmluZSBTSFRfU1VOV192ZXJuZWVkIDB4NmZmZmZmZmUJLyogVmVyc2lvbnMgbmVlZGVkIGJ5IGZpbGUgKi8KLSNkZWZpbmUgU0hUX1NVTldfdmVyc3ltCTB4NmZmZmZmZmYJLyogU3ltYm9sIHZlcnNpb25zICovCi0KLSNkZWZpbmUgU0hUX0dOVV92ZXJkZWYJU0hUX1NVTldfdmVyZGVmCi0jZGVmaW5lIFNIVF9HTlVfdmVybmVlZAlTSFRfU1VOV192ZXJuZWVkCi0jZGVmaW5lIFNIVF9HTlVfdmVyc3ltCVNIVF9TVU5XX3ZlcnN5bQotCi0jZGVmaW5lIFNIVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgc2VtYW50aWNzLCBsbyAqLwotI2RlZmluZSBTSFRfSElQUk9DCTB4N0ZGRkZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KLSNkZWZpbmUgU0hUX0xPVVNFUgkweDgwMDAwMDAwCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotLyogI2RlZmluZSBTSFRfSElVU0VSCTB4OEZGRkZGRkYgICAgKi8vKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU0hUX0hJVVNFUgkweEZGRkZGRkZGCS8qIE5ldyB2YWx1ZSwgZGVmaW5lZCBpbiBPY3QgNCwgMTk5OSBEcmFmdCAqLwotCi0vKiBWYWx1ZXMgZm9yIHNlY3Rpb24gaGVhZGVyLCBzaF9mbGFncyBmaWVsZCAqLwotCi0jZGVmaW5lIFNIRl9XUklURQkoMSA8PCAwKQkvKiBXcml0YWJsZSBkYXRhIGR1cmluZyBleGVjdXRpb24gKi8KLSNkZWZpbmUgU0hGX0FMTE9DCSgxIDw8IDEpCS8qIE9jY3VwaWVzIG1lbW9yeSBkdXJpbmcgZXhlY3V0aW9uICovCi0jZGVmaW5lIFNIRl9FWEVDSU5TVFIJKDEgPDwgMikJLyogRXhlY3V0YWJsZSBtYWNoaW5lIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBTSEZfTUVSR0UJKDEgPDwgNCkJLyogRGF0YSBpbiB0aGlzIHNlY3Rpb24gY2FuIGJlIG1lcmdlZCAqLwotI2RlZmluZSBTSEZfU1RSSU5HUwkoMSA8PCA1KQkvKiBDb250YWlucyBudWxsIHRlcm1pbmF0ZWQgY2hhcmFjdGVyIHN0cmluZ3MgKi8KLSNkZWZpbmUgU0hGX0lORk9fTElOSwkoMSA8PCA2KQkvKiBzaF9pbmZvIGhvbGRzIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluZGV4ICovCi0jZGVmaW5lIFNIRl9MSU5LX09SREVSICAoMSA8PCA3KQkvKiBQcmVzZXJ2ZSBzZWN0aW9uIG9yZGVyaW5nIHdoZW4gbGlua2luZyAqLwotI2RlZmluZSBTSEZfT1NfTk9OQ09ORk9STUlORyAoMSA8PCA4KQkvKiBPUyBzcGVjaWZjaSBwcm9jZXNzaW5nIHJlcXVpcmVkICovCi0KLS8qICNkZWZpbmUgU0hGX01BU0tPUwkweDBGMDAwMDAwICAgICovLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNIRl9NQVNLT1MJMHgwRkYwMDAwMAkvKiBOZXcgdmFsdWUsIE9jdCA0LCAxOTk5IERyYWZ0ICovCi0jZGVmaW5lIFNIRl9NQVNLUFJPQwkweEYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotLyogVmFsdWVzIG9mIG5vdGUgc2VnbWVudCBkZXNjcmlwdG9yIHR5cGVzIGZvciBjb3JlIGZpbGVzLiAqLwotCi0jZGVmaW5lIE5UX1BSU1RBVFVTCTEJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJzdGF0dXMgc3RydWN0ICovCi0jZGVmaW5lIE5UX0ZQUkVHU0VUCTIJCS8qIENvbnRhaW5zIGNvcHkgb2YgZnByZWdzZXQgc3RydWN0ICovCi0jZGVmaW5lIE5UX1BSUFNJTkZPCTMJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJwc2luZm8gc3RydWN0ICovCi0jZGVmaW5lIE5UX1RBU0tTVFJVQ1QJNAkJLyogQ29udGFpbnMgY29weSBvZiB0YXNrIHN0cnVjdCAqLwotI2RlZmluZSBOVF9QUlhGUFJFRyAgICAgMHg0NmU2MmI3ZgkvKiBDb250YWlucyBhIHVzZXJfeGZwcmVnc19zdHJ1Y3Q7ICovCi0JCQkJCS8qICAgbm90ZSBuYW1lIG11c3QgYmUgIkxJTlVYIi4gICovCi0KLS8qIE5vdGUgc2VnbWVudHMgZm9yIGNvcmUgZmlsZXMgb24gZGlyLXN0eWxlIHByb2NmcyBzeXN0ZW1zLiAqLwotCi0jZGVmaW5lIE5UX1BTVEFUVVMJMTAJCS8qIEhhcyBhIHN0cnVjdCBwc3RhdHVzICovCi0jZGVmaW5lIE5UX0ZQUkVHUwkxMgkJLyogSGFzIGEgc3RydWN0IGZwcmVnc2V0ICovCi0jZGVmaW5lIE5UX1BTSU5GTwkxMwkJLyogSGFzIGEgc3RydWN0IHBzaW5mbyAqLwotI2RlZmluZSBOVF9MV1BTVEFUVVMJMTYJCS8qIEhhcyBhIHN0cnVjdCBsd3BzdGF0dXNfdCAqLwotI2RlZmluZSBOVF9MV1BTSU5GTwkxNwkJLyogSGFzIGEgc3RydWN0IGx3cHNpbmZvX3QgKi8KLSNkZWZpbmUgTlRfV0lOMzJQU1RBVFVTCTE4CQkvKiBIYXMgYSBzdHJ1Y3Qgd2luMzJfcHN0YXR1cyAqLwotCi0vKiBWYWx1ZXMgb2Ygbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIG9iamVjdCBmaWxlcy4gICovCi0vKiAoT25seSBmb3IgaHBwYSByaWdodCBub3cuICBTaG91bGQgdGhpcyBiZSBtb3ZlZCBlbHNld2hlcmU/KSAgKi8KLQotI2RlZmluZSBOVF9WRVJTSU9OCTEJCS8qIENvbnRhaW5zIGEgdmVyc2lvbiBzdHJpbmcuICAqLwotCi0vKiBUaGVzZSB0aHJlZSBtYWNyb3MgZGlzYXNzZW1ibGUgYW5kIGFzc2VtYmxlIGEgc3ltYm9sIHRhYmxlIHN0X2luZm8gZmllbGQsCi0gICB3aGljaCBjb250YWlucyB0aGUgc3ltYm9sIGJpbmRpbmcgYW5kIHN5bWJvbCB0eXBlLiAgVGhlIFNUQl8gYW5kIFNUVF8KLSAgIGRlZmluZXMgaWRlbnRpZnkgdGhlIGJpbmRpbmcgYW5kIHR5cGUuICovCi0KLSNkZWZpbmUgRUxGX1NUX0JJTkQodmFsKQkJKCgodW5zaWduZWQgaW50KSh2YWwpKSA+PiA0KQotI2RlZmluZSBFTEZfU1RfVFlQRSh2YWwpCQkoKHZhbCkgJiAweEYpCi0jZGVmaW5lIEVMRl9TVF9JTkZPKGJpbmQsdHlwZSkJCSgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4RikpCi0KLS8qIFRoZSA2NGJpdCBhbmQgMzJiaXQgdmVyc2lvbnMgb2YgdGhlc2UgbWFjcm9zIGFyZSBpZGVudGljYWwsIGJ1dAotICAgdGhlIEVMRiBzcGVjIGRlZmluZXMgdGhlbSwgc28gaGVyZSB0aGV5IGFyZS4gICovCi0jZGVmaW5lIEVMRjMyX1NUX0JJTkQgIEVMRl9TVF9CSU5ECi0jZGVmaW5lIEVMRjMyX1NUX1RZUEUgIEVMRl9TVF9UWVBFCi0jZGVmaW5lIEVMRjMyX1NUX0lORk8gIEVMRl9TVF9JTkZPCi0jZGVmaW5lIEVMRjY0X1NUX0JJTkQgIEVMRl9TVF9CSU5ECi0jZGVmaW5lIEVMRjY0X1NUX1RZUEUgIEVMRl9TVF9UWVBFCi0jZGVmaW5lIEVMRjY0X1NUX0lORk8gIEVMRl9TVF9JTkZPCi0KLS8qIFRoaXMgbWFjcm8gZGlzYXNzZW1ibGVzIGFuZCBhc3NlbWJsZXMgYSBzeW1ib2wncyB2aXNpYmlsaXR5IGludG8KLSAgIHRoZSBzdF9vdGhlciBmaWVsZC4gIFRoZSBTVFZfIGRlZmluZXMgc3BlY2lmaWN5IHRoZSBhY3R1YWwgdmlzaWJpbGl0eS4gICovCi0KLSNkZWZpbmUgRUxGX1NUX1ZJU0lCSUxJVFkodikJCSgodikgJiAweDMpCi0vKiBUaGUgcmVtYWluaW5nIGJpdHMgaW4gdGhlIHN0X290aGVyIGZpZWxkIGFyZSBub3QgY3VycmVudGx5IHVzZWQuCi0gICBUaGV5IHNob3VsZCBiZSBzZXQgdG8gemVyby4gICovCi0KLSNkZWZpbmUgRUxGMzJfU1RfVklTSUJJTElUWSAgRUxGX1NUX1ZJU0lCSUxJVFkKLSNkZWZpbmUgRUxGNjRfU1RfVklTSUJJTElUWSAgRUxGX1NUX1ZJU0lCSUxJVFkKLQotCi0jZGVmaW5lIFNUTl9VTkRFRgkwCQkvKiB1bmRlZmluZWQgc3ltYm9sIGluZGV4ICovCi0KLSNkZWZpbmUgU1RCX0xPQ0FMCTAJCS8qIFN5bWJvbCBub3QgdmlzaWJsZSBvdXRzaWRlIG9iaiAqLwotI2RlZmluZSBTVEJfR0xPQkFMCTEJCS8qIFN5bWJvbCB2aXNpYmxlIG91dHNpZGUgb2JqICovCi0jZGVmaW5lIFNUQl9XRUFLCTIJCS8qIExpa2UgZ2xvYmFscywgbG93ZXIgcHJlY2VkZW5jZSAqLwotI2RlZmluZSBTVEJfTE9PUyAgICAgICAgMTAJCS8qIE9TLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVEJfSElPUyAgICAgICAgMTIJCS8qIE9TLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVEJfTE9QUk9DCTEzCQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RCX0hJUFJPQwkxNQkJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0KLSNkZWZpbmUgU1RUX05PVFlQRQkwCQkvKiBTeW1ib2wgdHlwZSBpcyB1bnNwZWNpZmllZCAqLwotI2RlZmluZSBTVFRfT0JKRUNUCTEJCS8qIFN5bWJvbCBpcyBhIGRhdGEgb2JqZWN0ICovCi0jZGVmaW5lIFNUVF9GVU5DCTIJCS8qIFN5bWJvbCBpcyBhIGNvZGUgb2JqZWN0ICovCi0jZGVmaW5lIFNUVF9TRUNUSU9OCTMJCS8qIFN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uICovCi0jZGVmaW5lIFNUVF9GSUxFCTQJCS8qIFN5bWJvbCBnaXZlcyBhIGZpbGUgbmFtZSAqLwotI2RlZmluZSBTVFRfQ09NTU9OCTUJCS8qIEFuIHVuaW5pdGlhbGlzZWQgY29tbW9uIGJsb2NrICovCi0jZGVmaW5lIFNUVF9MT09TICAgICAgICAxMAkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9ISU9TICAgICAgICAxMgkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9MT1BST0MJMTMJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVFRfSElQUk9DCTE1CQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMsIHdoaWNoIG1heSBzaG93IHVwIGluIHN0X3NobmR4IGZpZWxkcywgYW1vbmcKLSAgIG90aGVyIHBsYWNlcy4gKi8KLQotI2RlZmluZSBTSE5fVU5ERUYJMAkJLyogVW5kZWZpbmVkIHNlY3Rpb24gcmVmZXJlbmNlICovCi0jZGVmaW5lIFNITl9MT1JFU0VSVkUJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiByZXNlcnZlZCBpbmRpY2VzICovCi0jZGVmaW5lIFNITl9MT1BST0MJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiBhcHBsLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9ISVBST0MJMHhGRjFGCQkvKiBFbmQgcmFuZ2Ugb2YgYXBwbC1zcGVjaWZpYyAqLwotI2RlZmluZSBTSE5fTE9PUyAgICAgICAgMHhGRjIwCQkvKiBPUyBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCi0jZGVmaW5lIFNITl9ISU9TICAgICAgICAweEZGM0YJCS8qIE9TIHNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KLSNkZWZpbmUgU0hOX0FCUwkJMHhGRkYxCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLwotI2RlZmluZSBTSE5fQ09NTU9OCTB4RkZGMgkJLyogQXNzb2NpYXRlZCBzeW1ib2wgaXMgaW4gY29tbW9uICovCi0jZGVmaW5lIFNITl9ISVJFU0VSVkUJMHhGRkZGCQkvKiBFbmQgcmFuZ2Ugb2YgcmVzZXJ2ZWQgaW5kaWNlcyAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBjb250cm9sIGhvdyBhIHN5bWJvbCBtYXkgYmUgYWNjZXNzZWQgb25jZSBpdCBoYXMKLSAgIGJlY29tZSBwYXJ0IG9mIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkuICAqLwotCQkJCQkgICAKLSNkZWZpbmUgU1RWX0RFRkFVTFQJMAkJLyogVmlzaWJpbGl0eSBpcyBzcGVjaWZpZWQgYnkgYmluZGluZyB0eXBlICovCi0jZGVmaW5lIFNUVl9JTlRFUk5BTAkxCQkvKiBPUyBzcGVjaWZpYyB2ZXJzaW9uIG9mIFNUVl9ISURERU4gKi8KLSNkZWZpbmUgU1RWX0hJRERFTgkyCQkvKiBDYW4gb25seSBiZSBzZWVuIGluc2lkZSBjdXJyZWN0IGNvbXBvbmVudCAqLwotI2RlZmluZSBTVFZfUFJPVEVDVEVECTMJCS8qIFRyZWF0IGFzIFNUQl9MT0NBTCBpbnNpZGUgY3VycmVudCBjb21wb25lbnQgKi8KLQkJCQkJICAgCi0KLS8qIHJlbG9jYXRpb24gaW5mbyBoYW5kbGluZyBtYWNyb3MgKi8KLQotI2RlZmluZSBFTEYzMl9SX1NZTShpKQkJKChpKSA+PiA4KQotI2RlZmluZSBFTEYzMl9SX1RZUEUoaSkJCSgoaSkgJiAweGZmKQotI2RlZmluZSBFTEYzMl9SX0lORk8ocyx0KQkoKChzKSA8PCA4KSArICgodCkgJiAweGZmKSkKLQotI2RlZmluZSBFTEY2NF9SX1NZTShpKQkJKChpKSA+PiAzMikKLSNkZWZpbmUgRUxGNjRfUl9UWVBFKGkpCQkoKGkpICYgMHhmZmZmZmZmZikKLSNkZWZpbmUgRUxGNjRfUl9JTkZPKHMsdCkJKCgoYmZkX3ZtYSkgKHMpIDw8IDMyKSArIChiZmRfdm1hKSAodCkpCi0KLS8qIER5bmFtaWMgc2VjdGlvbiB0YWdzICovCi0KLSNkZWZpbmUgRFRfTlVMTAkJMAotI2RlZmluZSBEVF9ORUVERUQJMQotI2RlZmluZSBEVF9QTFRSRUxTWgkyCi0jZGVmaW5lIERUX1BMVEdPVAkzCi0jZGVmaW5lIERUX0hBU0gJCTQKLSNkZWZpbmUgRFRfU1RSVEFCCTUKLSNkZWZpbmUgRFRfU1lNVEFCCTYKLSNkZWZpbmUgRFRfUkVMQQkJNwotI2RlZmluZSBEVF9SRUxBU1oJOAotI2RlZmluZSBEVF9SRUxBRU5UCTkKLSNkZWZpbmUgRFRfU1RSU1oJMTAKLSNkZWZpbmUgRFRfU1lNRU5UCTExCi0jZGVmaW5lIERUX0lOSVQJCTEyCi0jZGVmaW5lIERUX0ZJTkkJCTEzCi0jZGVmaW5lIERUX1NPTkFNRQkxNAotI2RlZmluZSBEVF9SUEFUSAkxNQotI2RlZmluZSBEVF9TWU1CT0xJQwkxNgotI2RlZmluZSBEVF9SRUwJCTE3Ci0jZGVmaW5lIERUX1JFTFNaCTE4Ci0jZGVmaW5lIERUX1JFTEVOVAkxOQotI2RlZmluZSBEVF9QTFRSRUwJMjAKLSNkZWZpbmUgRFRfREVCVUcJMjEKLSNkZWZpbmUgRFRfVEVYVFJFTAkyMgotI2RlZmluZSBEVF9KTVBSRUwJMjMKLSNkZWZpbmUgRFRfQklORF9OT1cgICAgIDI0Ci0jZGVmaW5lIERUX0lOSVRfQVJSQVkgICAyNQotI2RlZmluZSBEVF9GSU5JX0FSUkFZICAgMjYKLSNkZWZpbmUgRFRfSU5JVF9BUlJBWVNaIDI3Ci0jZGVmaW5lIERUX0ZJTklfQVJSQVlTWiAyOAotI2RlZmluZSBEVF9SVU5QQVRIICAgICAgMjkKLSNkZWZpbmUgRFRfRkxBR1MgICAgICAgIDMwCi0KLSNkZWZpbmUgRFRfRU5DT0RJTkcgICAgIDMyCi0jZGVmaW5lIERUX1BSRUlOSVRfQVJSQVkgICAzMgotI2RlZmluZSBEVF9QUkVJTklUX0FSUkFZU1ogMzMKLQotLyogTm90ZSwgdGhlIE9jdCA0LCAxOTk5IGRyYWZ0IG9mIHRoZSBFTEYgQUJJIGNoYW5nZWQgdGhlIHZhbHVlcwotICAgZm9yIERUX0xPT1MgYW5kIERUX0hJT1MuICBTb21lIGltcGxlbWVudGF0aW9ucyBob3dldmVyLCB1c2UKLSAgIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSBuZXcgcmFuZ2UgKHNlZSBiZWxvdykuICAqLwotI2RlZmluZSBPTERfRFRfTE9PUwkweDYwMDAwMDAwCi0jZGVmaW5lIERUX0xPT1MgICAgICAgICAweDYwMDAwMDBkCi0jZGVmaW5lIERUX0hJT1MgICAgICAgICAweDZmZmYwMDAwCi0jZGVmaW5lIE9MRF9EVF9ISU9TICAgICAweDZmZmZmZmZmCi0KLSNkZWZpbmUgRFRfTE9QUk9DICAgICAgIDB4NzAwMDAwMDAKLSNkZWZpbmUgRFRfSElQUk9DICAgICAgIDB4N2ZmZmZmZmYKLQotLyogVGhlIG5leHQgZm91ciBkeW5hbWljIHRhZ3MgYXJlIHVzZWQgb24gU29sYXJpcy4gIFdlIHN1cHBvcnQgdGhlbQotICAgZXZlcnl3aGVyZS4gIE5vdGUgdGhlc2UgdmFsdWVzIGxpZSBvdXRzaWRlIG9mIHRoZSAobmV3KSByYW5nZSBmb3IKLSAgIE9TIHNwZWNpZmljIHZhbHVlcy4gIFRoaXMgaXMgYSBkZWxpYmVyYXRlIHNwZWNpYWwgY2FzZSBhbmQgd2UKLSAgIG1haW50YWluIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4gICovCi0jZGVmaW5lIERUX1ZBTFJOR0xPCTB4NmZmZmZkMDAKLSNkZWZpbmUgRFRfUExUUEFEU1oJMHg2ZmZmZmRmOQotI2RlZmluZSBEVF9NT1ZFRU5UCTB4NmZmZmZkZmEKLSNkZWZpbmUgRFRfTU9WRVNaCTB4NmZmZmZkZmIKLSNkZWZpbmUgRFRfRkVBVFVSRV8xCTB4NmZmZmZkZmMKLSNkZWZpbmUgRFRfUE9TRkxBR18xCTB4NmZmZmZkZmQKLSNkZWZpbmUgRFRfU1lNSU5TWgkweDZmZmZmZGZlCi0jZGVmaW5lIERUX1NZTUlORU5UCTB4NmZmZmZkZmYKLSNkZWZpbmUgRFRfVkFMUk5HSEkJMHg2ZmZmZmRmZgotCi0jZGVmaW5lIERUX0FERFJSTkdMTwkweDZmZmZmZTAwCi0jZGVmaW5lIERUX1NZTUlORk8JMHg2ZmZmZmVmZgotI2RlZmluZSBEVF9BRERSUk5HSEkJMHg2ZmZmZmVmZgotCi0jZGVmaW5lIERUX1JFTEFDT1VOVAkweDZmZmZmZmY5Ci0jZGVmaW5lIERUX1JFTENPVU5UCTB4NmZmZmZmZmEKLSNkZWZpbmUgRFRfRkxBR1NfMQkweDZmZmZmZmZiCi0jZGVmaW5lIERUX1ZFUkRFRgkweDZmZmZmZmZjCi0jZGVmaW5lIERUX1ZFUkRFRk5VTQkweDZmZmZmZmZkCi0jZGVmaW5lIERUX1ZFUk5FRUQJMHg2ZmZmZmZmZQotI2RlZmluZSBEVF9WRVJORUVETlVNCTB4NmZmZmZmZmYKLQotLyogVGhpcyB0YWcgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTb2xhcmlzIHZlcnNpb24gc2NoZW1lLiAgKi8KLSNkZWZpbmUgRFRfVkVSU1lNCTB4NmZmZmZmZjAKLQotI2RlZmluZSBEVF9MT1BST0MJMHg3MDAwMDAwMAotI2RlZmluZSBEVF9ISVBST0MJMHg3ZmZmZmZmZgotCi0vKiBUaGVzZSBzZWN0aW9uIHRhZ3MgYXJlIHVzZWQgb24gU29sYXJpcy4gIFdlIHN1cHBvcnQgdGhlbQotICAgZXZlcnl3aGVyZSwgYW5kIGhvcGUgdGhleSBkbyBub3QgY29uZmxpY3QuICAqLwotCi0jZGVmaW5lIERUX0FVWElMSUFSWQkweDdmZmZmZmZkCi0jZGVmaW5lIERUX1VTRUQJCTB4N2ZmZmZmZmUKLSNkZWZpbmUgRFRfRklMVEVSCTB4N2ZmZmZmZmYKLQotLyogVmFsdWVzIHVzZWQgaW4gRFRfRkVBVFVSRV8xIC5keW5hbWljIGVudHJ5LiAgKi8KLSNkZWZpbmUgRFRGXzFfUEFSSU5JVAkweDAwMDAwMDAxCi0KLS8qIEZsYWcgdmFsdWVzIHVzZWQgaW4gdGhlIERUX1BPU0ZMQUdfMSAuZHluYW1pYyBlbnRyeS4gICovCi0jZGVmaW5lIERGX1AxX0xBWllMT0FECTB4MDAwMDAwMDEKLSNkZWZpbmUgREZfUDFfR1JPVVBQRVJNCTB4MDAwMDAwMDIKLQotLyogRmxhZyB2YWx1ZSBpbiBpbiB0aGUgRFRfMV9GTEFHUyAuZHluYW1pYyBlbnRyeS4gICovCi0jZGVmaW5lIERGXzFfTk9XCTB4MDAwMDAwMDEKLSNkZWZpbmUgREZfMV9HTE9CQUwJMHgwMDAwMDAwMgotI2RlZmluZSBERl8xX0dST1VQCTB4MDAwMDAwMDQKLSNkZWZpbmUgREZfMV9OT0RFTEVURQkweDAwMDAwMDA4Ci0jZGVmaW5lIERGXzFfTE9BREZMVFIJMHgwMDAwMDAxMAotI2RlZmluZSBERl8xX0lOSVRGSVJTVAkweDAwMDAwMDIwCi0jZGVmaW5lIERGXzFfTk9PUEVOCTB4MDAwMDAwNDAKLSNkZWZpbmUgREZfMV9PUklHSU4JMHgwMDAwMDA4MAotI2RlZmluZSBERl8xX0RJUkVDVAkweDAwMDAwMTAwCi0jZGVmaW5lIERGXzFfVFJBTlMJMHgwMDAwMDIwMAotI2RlZmluZSBERl8xX0lOVEVSUE9TRQkweDAwMDAwNDAwCi0KLS8qIEZsYWcgdmFsdWVzIGZvciB0aGUgRFRfRkxBR1MgZW50cnkuICAqLwotI2RlZmluZSBERl9PUklHSU4JKDEgPDwgMCkKLSNkZWZpbmUgREZfU1lNQk9MSUMJKDEgPDwgMSkKLSNkZWZpbmUgREZfVEVYVFJFTAkoMSA8PCAyKQotI2RlZmluZSBERl9CSU5EX05PVwkoMSA8PCAzKQotCi0vKiBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBhIEVsZjMyX1ZlcmRlZgotICAgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBWRVJfREVGX05PTkUJCTAKLSNkZWZpbmUgVkVSX0RFRl9DVVJSRU5UCQkxCi0KLS8qIFRoZXNlIGNvbnN0YW50cyBhcHBlYXIgaW4gdGhlIHZkX2ZsYWdzIGZpZWxkIG9mIGEgRWxmMzJfVmVyZGVmCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9GTEdfQkFTRQkJMHgxCi0jZGVmaW5lIFZFUl9GTEdfV0VBSwkJMHgyCi0KLS8qIFRoZXNlIHNwZWNpYWwgY29uc3RhbnRzIGNhbiBiZSBmb3VuZCBpbiBhbiBFbGYzMl9WZXJzeW0gZmllbGQuICAqLwotCi0jZGVmaW5lIFZFUl9ORFhfTE9DQUwJCTAKLSNkZWZpbmUgVkVSX05EWF9HTE9CQUwJCTEKLQotLyogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBFbGYzMl9WZXJuZWVkCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9ORUVEX05PTkUJCTAKLSNkZWZpbmUgVkVSX05FRURfQ1VSUkVOVAkxCi0KLS8qIFRoaXMgZmxhZyBhcHBlYXJzIGluIGEgVmVyc3ltIHN0cnVjdHVyZS4gIEl0IG1lYW5zIHRoYXQgdGhlIHN5bWJvbAotICAgaXMgaGlkZGVuLCBhbmQgaXMgb25seSB2aXNpYmxlIHdpdGggYW4gZXhwbGljaXQgdmVyc2lvbiBudW1iZXIuCi0gICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0KLSNkZWZpbmUgVkVSU1lNX0hJRERFTgkJMHg4MDAwCi0KLS8qIFRoaXMgaXMgdGhlIG1hc2sgZm9yIHRoZSByZXN0IG9mIHRoZSBWZXJzeW0gaW5mb3JtYXRpb24uICAqLwotCi0jZGVmaW5lIFZFUlNZTV9WRVJTSU9OCQkweDdmZmYKLQotLyogVGhpcyBpcyBhIHNwZWNpYWwgdG9rZW4gd2hpY2ggYXBwZWFycyBhcyBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuICBJdAotICAgaW5kaWN0ZXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgbmFtZSBpcyBhY3R1YWxseSB0aGUgbmFtZSBvZiBhCi0gICB2ZXJzaW9uIG5vZGUsIGFuZCBpcyBub3QgcGFydCBvZiB0aGUgYWN0dWFsIG5hbWUuICBUaGlzIGlzIGEgR05VCi0gICBleHRlbnNpb24uICBGb3IgZXhhbXBsZSwgdGhlIHN5bWJvbCBuYW1lIGBzdGF0QHZlcjInIGlzIHRha2VuIHRvCi0gICBtZWFuIHRoZSBzeW1ib2wgYHN0YXQnIGluIHZlcnNpb24gYHZlcjInLiAgKi8KLQotI2RlZmluZSBFTEZfVkVSX0NIUgknQCcKLQotLyogUG9zc2libGUgdmFsdWVzIGZvciBzaV9ib3VuZHRvLiAgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9TRUxGCQkweGZmZmYJLyogU3ltYm9sIGJvdW5kIHRvIHNlbGYgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9QQVJFTlQJMHhmZmZlCS8qIFN5bWJvbCBib3VuZCB0byBwYXJlbnQgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9MT1dSRVNFUlZFCTB4ZmYwMAkvKiBCZWdpbm5pbmcgb2YgcmVzZXJ2ZWQgZW50cmllcyAqLwotCi0vKiBQb3NzaWJsZSBiaXRtYXNrcyBmb3Igc2lfZmxhZ3MuICAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19ESVJFQ1QJMHgwMDAxCS8qIERpcmVjdCBib3VuZCBzeW1ib2wgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfUEFTU1RIUlUJMHgwMDAyCS8qIFBhc3MtdGhydSBzeW1ib2wgZm9yIHRyYW5zbGF0b3IgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfQ09QWQkweDAwMDQJLyogU3ltYm9sIGlzIGEgY29weS1yZWxvYyAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19MQVpZTE9BRAkweDAwMDgJLyogU3ltYm9sIGJvdW5kIHRvIG9iamVjdCB0byBiZSBsYXp5Ci0JCQkJCSAgIGxvYWRlZCAqLwotLyogU3ltaW5mbyB2ZXJzaW9uIHZhbHVlcy4gICovCi0jZGVmaW5lIFNZTUlORk9fTk9ORQkJMAotI2RlZmluZSBTWU1JTkZPX0NVUlJFTlQJCTEKLSNkZWZpbmUgU1lNSU5GT19OVU0JCTIKLQotI2VuZGlmIC8qIF9FTEZfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2QxMHYuaCBiL2luY2x1ZGUvZWxmL2QxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiNzljOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBkMTB2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0QxMFZfSAotI2RlZmluZSBfRUxGX0QxMFZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMTB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX1IsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX0wsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzE2LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xOCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfMThfUENSRUwsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRFTlRSWSwgOCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZDMwdi5oIGIvaW5jbHVkZS9lbGYvZDMwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGJhZDE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2QzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGQzMHYgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfRDMwVl9ICi0jZGVmaW5lIF9FTEZfRDMwVl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMzB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzYsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUwsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUxfUiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMTUsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzE1X1BDUkVMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8xNV9QQ1JFTF9SLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8yMSwgNykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMjFfUENSRUwsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzIxX1BDUkVMX1IsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzMyLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMzJfUENSRUwsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8zMl9OT1JNQUwsIDEyKQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kd2FyZi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3MmNkNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kd2FyZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgb2YgY29kZXMgcmVsYXRpbmcgdG8gdGhlIERXQVJGIHN5bWJvbGljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotCi0gICBXcml0dGVuIGJ5IFJvbiBHdWlsbWV0dGUgKHJmZ0BuY2QuY29tKQotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLQotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBEV0FSRiBzcGVjaWZpY2F0aW9uIChhIHB1YmxpYyBkb2N1bWVudCkKLSAgIFJldmlzaW9uIDEuMC4xIChBcHJpbCA4LCAxOTkyKSBkZXZlbG9wZWQgYnkgdGhlIFVOSVggSW50ZXJuYXRpb25hbAotICAgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIFNwZWNpYWwgSW50ZXJlc3QgR3JvdXAgKFVJL1BMU0lHKSBhbmQgZGlzdHJpYnV0ZWQKLSAgIGJ5IFVOSVggSW50ZXJuYXRpb25hbC4gIENvcGllcyBvZiB0aGlzIHNwZWNpZmljYXRpb24gYXJlIGF2YWlsYWJsZSBmcm9tCi0gICBVTklYIEludGVybmF0aW9uYWwsIDIwIFdhdGVydmlldyBCb3VsZXZhcmQsIFBhcnNpcHBhbnksIE5KLCAwNzA1NC4KLSovCi0KLSNpZm5kZWYgX0VMRl9EV0FSRl9ICi0jZGVmaW5lIF9FTEZfRFdBUkZfSAotCi0vKiBUYWcgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90YWcgewotICAgIFRBR19wYWRkaW5nCQkJPSAweDAwMDAsCi0gICAgVEFHX2FycmF5X3R5cGUJCT0gMHgwMDAxLAotICAgIFRBR19jbGFzc190eXBlCQk9IDB4MDAwMiwKLSAgICBUQUdfZW50cnlfcG9pbnQJCT0gMHgwMDAzLAotICAgIFRBR19lbnVtZXJhdGlvbl90eXBlCT0gMHgwMDA0LAotICAgIFRBR19mb3JtYWxfcGFyYW1ldGVyCT0gMHgwMDA1LAotICAgIFRBR19nbG9iYWxfc3Vicm91dGluZQk9IDB4MDAwNiwKLSAgICBUQUdfZ2xvYmFsX3ZhcmlhYmxlCQk9IDB4MDAwNywKLSAgICAJCQkJLyogMHgwMDA4IC0tIHJlc2VydmVkICovCi0JCQkJLyogMHgwMDA5IC0tIHJlc2VydmVkICovCi0gICAgVEFHX2xhYmVsCQkJPSAweDAwMGEsCi0gICAgVEFHX2xleGljYWxfYmxvY2sJCT0gMHgwMDBiLAotICAgIFRBR19sb2NhbF92YXJpYWJsZQkJPSAweDAwMGMsCi0gICAgVEFHX21lbWJlcgkJCT0gMHgwMDBkLAotCQkJCS8qIDB4MDAwZSAtLSByZXNlcnZlZCAqLwotICAgIFRBR19wb2ludGVyX3R5cGUJCT0gMHgwMDBmLAotICAgIFRBR19yZWZlcmVuY2VfdHlwZQkJPSAweDAwMTAsCi0gICAgVEFHX2NvbXBpbGVfdW5pdAkJPSAweDAwMTEsCi0gICAgVEFHX3N0cmluZ190eXBlCQk9IDB4MDAxMiwKLSAgICBUQUdfc3RydWN0dXJlX3R5cGUJCT0gMHgwMDEzLAotICAgIFRBR19zdWJyb3V0aW5lCQk9IDB4MDAxNCwKLSAgICBUQUdfc3Vicm91dGluZV90eXBlCQk9IDB4MDAxNSwKLSAgICBUQUdfdHlwZWRlZgkJCT0gMHgwMDE2LAotICAgIFRBR191bmlvbl90eXBlCQk9IDB4MDAxNywKLSAgICBUQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycwk9IDB4MDAxOCwKLSAgICBUQUdfdmFyaWFudAkJCT0gMHgwMDE5LAotICAgIFRBR19jb21tb25fYmxvY2sJCT0gMHgwMDFhLAotICAgIFRBR19jb21tb25faW5jbHVzaW9uCT0gMHgwMDFiLAotICAgIFRBR19pbmhlcml0YW5jZQkJPSAweDAwMWMsCi0gICAgVEFHX2lubGluZWRfc3Vicm91dGluZQk9IDB4MDAxZCwKLSAgICBUQUdfbW9kdWxlCQkJPSAweDAwMWUsCi0gICAgVEFHX3B0cl90b19tZW1iZXJfdHlwZQk9IDB4MDAxZiwKLSAgICBUQUdfc2V0X3R5cGUJCT0gMHgwMDIwLAotICAgIFRBR19zdWJyYW5nZV90eXBlCQk9IDB4MDAyMSwKLSAgICBUQUdfd2l0aF9zdG10CQk9IDB4MDAyMiwKLQotICAgIC8qIEdOVSBleHRlbnNpb25zICovCi0KLSAgICBUQUdfZm9ybWF0X2xhYmVsCQk9IDB4ODAwMCwgIC8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgVEFHX25hbWVsaXN0CQk9IDB4ODAwMSwgIC8qIEZvciBGb3J0cmFuIDkwICovCi0gICAgVEFHX2Z1bmN0aW9uX3RlbXBsYXRlCT0gMHg4MDAyLCAgLyogZm9yIEMrKyAqLwotICAgIFRBR19jbGFzc190ZW1wbGF0ZQkJPSAweDgwMDMgICAvKiBmb3IgQysrICovCi19OwotCi0jZGVmaW5lIFRBR19sb191c2VyCTB4ODAwMCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBUQUdfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0jZGVmaW5lIFRBR19zb3VyY2VfZmlsZSBUQUdfY29tcGlsZV91bml0ICAvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCi0vKiBGb3JtIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZm9ybSB7Ci0gICAgRk9STV9BRERSCT0gMHgxLAotICAgIEZPUk1fUkVGCT0gMHgyLAotICAgIEZPUk1fQkxPQ0syCT0gMHgzLAotICAgIEZPUk1fQkxPQ0s0CT0gMHg0LAotICAgIEZPUk1fREFUQTIJPSAweDUsCi0gICAgRk9STV9EQVRBNAk9IDB4NiwKLSAgICBGT1JNX0RBVEE4CT0gMHg3LAotICAgIEZPUk1fU1RSSU5HCT0gMHg4Ci19OwotCi0vKiBBdHRyaWJ1dGUgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9hdHRyaWJ1dGUgewotICAgIEFUX3NpYmxpbmcJCQk9ICgweDAwMTB8Rk9STV9SRUYpLAotICAgIEFUX2xvY2F0aW9uCQkJPSAoMHgwMDIwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9uYW1lCQkJPSAoMHgwMDMwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9mdW5kX3R5cGUJCT0gKDB4MDA1MHxGT1JNX0RBVEEyKSwKLSAgICBBVF9tb2RfZnVuZF90eXBlCQk9ICgweDAwNjB8Rk9STV9CTE9DSzIpLAotICAgIEFUX3VzZXJfZGVmX3R5cGUJCT0gKDB4MDA3MHxGT1JNX1JFRiksCi0gICAgQVRfbW9kX3VfZF90eXBlCQk9ICgweDAwODB8Rk9STV9CTE9DSzIpLAotICAgIEFUX29yZGVyaW5nCQkJPSAoMHgwMDkwfEZPUk1fREFUQTIpLAotICAgIEFUX3N1YnNjcl9kYXRhCQk9ICgweDAwYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2J5dGVfc2l6ZQkJPSAoMHgwMGIwfEZPUk1fREFUQTQpLAotICAgIEFUX2JpdF9vZmZzZXQJCT0gKDB4MDBjMHxGT1JNX0RBVEEyKSwKLSAgICBBVF9iaXRfc2l6ZQkJCT0gKDB4MDBkMHxGT1JNX0RBVEE0KSwKLQkJCQkvKiAoMHgwMGUwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KLSAgICBBVF9lbGVtZW50X2xpc3QJCT0gKDB4MDBmMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfc3RtdF9saXN0CQk9ICgweDAxMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfbG93X3BjCQkJPSAoMHgwMTEwfEZPUk1fQUREUiksCi0gICAgQVRfaGlnaF9wYwkJCT0gKDB4MDEyMHxGT1JNX0FERFIpLAotICAgIEFUX2xhbmd1YWdlCQkJPSAoMHgwMTMwfEZPUk1fREFUQTQpLAotICAgIEFUX21lbWJlcgkJCT0gKDB4MDE0MHxGT1JNX1JFRiksCi0gICAgQVRfZGlzY3IJCQk9ICgweDAxNTB8Rk9STV9SRUYpLAotICAgIEFUX2Rpc2NyX3ZhbHVlCQk9ICgweDAxNjB8Rk9STV9CTE9DSzIpLAotCQkJCS8qICgweDAxNzB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotCQkJCS8qICgweDAxODB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotICAgIEFUX3N0cmluZ19sZW5ndGgJCT0gKDB4MDE5MHxGT1JNX0JMT0NLMiksCi0gICAgQVRfY29tbW9uX3JlZmVyZW5jZQkJPSAoMHgwMWEwfEZPUk1fUkVGKSwKLSAgICBBVF9jb21wX2RpcgkJCT0gKDB4MDFiMHxGT1JNX1NUUklORyksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX3N0cmluZwk9ICgweDAxYzB8Rk9STV9TVFJJTkcpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9kYXRhMgk9ICgweDAxYzB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX2RhdGE0CT0gKDB4MDFjMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfZGF0YTgJPSAoMHgwMWMwfEZPUk1fREFUQTgpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9ibG9jazIJPSAoMHgwMWMwfEZPUk1fQkxPQ0syKSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfYmxvY2s0CT0gKDB4MDFjMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfY29udGFpbmluZ190eXBlCQk9ICgweDAxZDB8Rk9STV9SRUYpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2FkZHIJPSAoMHgwMWUwfEZPUk1fQUREUiksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfZGF0YTIJPSAoMHgwMWUwfEZPUk1fREFUQTIpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2RhdGE0CT0gKDB4MDFlMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9kYXRhOAk9ICgweDAxZTB8Rk9STV9EQVRBOCksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfc3RyaW5nCT0gKDB4MDFlMHxGT1JNX1NUUklORyksCi0gICAgQVRfZnJpZW5kcwkJCT0gKDB4MDFmMHxGT1JNX0JMT0NLMiksCi0gICAgQVRfaW5saW5lCQkJPSAoMHgwMjAwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9pc19vcHRpb25hbAkJPSAoMHgwMjEwfEZPUk1fU1RSSU5HKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfcmVmCT0gKDB4MDIyMHxGT1JNX1JFRiksCi0gICAgICAgIEFUX2xvd2VyX2JvdW5kX2RhdGEyCT0gKDB4MDIyMHxGT1JNX0RBVEEyKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfZGF0YTQJPSAoMHgwMjIwfEZPUk1fREFUQTQpLAotICAgICAgICBBVF9sb3dlcl9ib3VuZF9kYXRhOAk9ICgweDAyMjB8Rk9STV9EQVRBOCksCi0gICAgQVRfcHJpdmF0ZQkJCT0gKDB4MDI0MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHJvZHVjZXIJCQk9ICgweDAyNTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb2dyYW0JCQk9ICgweDAyMzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb3RlY3RlZAkJPSAoMHgwMjYwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wcm90b3R5cGVkCQk9ICgweDAyNzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3B1YmxpYwkJCT0gKDB4MDI4MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHVyZV92aXJ0dWFsCQk9ICgweDAyOTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3JldHVybl9hZGRyCQk9ICgweDAyYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2Fic3RyYWN0X29yaWdpbgkJPSAoMHgwMmIwfEZPUk1fUkVGKSwKLSAgICBBVF9zdGFydF9zY29wZQkJPSAoMHgwMmMwfEZPUk1fREFUQTQpLAotICAgIEFUX3N0cmlkZV9zaXplCQk9ICgweDAyZTB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX3JlZgk9ICgweDAyZjB8Rk9STV9SRUYpLAotICAgICAgICBBVF91cHBlcl9ib3VuZF9kYXRhMgk9ICgweDAyZjB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX2RhdGE0CT0gKDB4MDJmMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfdXBwZXJfYm91bmRfZGF0YTgJPSAoMHgwMmYwfEZPUk1fREFUQTgpLAotICAgIEFUX3ZpcnR1YWwJCQk9ICgweDAzMDB8Rk9STV9TVFJJTkcpLAotCi0gICAgLyogR05VIGV4dGVuc2lvbnMuICAqLwotCi0gICAgQVRfc2ZfbmFtZXMJCQk9ICgweDgwMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2luZm8JCQk9ICgweDgwMTB8Rk9STV9EQVRBNCksCi0gICAgQVRfbWFjX2luZm8JCQk9ICgweDgwMjB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2Nvb3JkcwkJPSAoMHg4MDMwfEZPUk1fREFUQTQpLAotICAgIEFUX2JvZHlfYmVnaW4JCT0gKDB4ODA0MHxGT1JNX0FERFIpLAotICAgIEFUX2JvZHlfZW5kCQkJPSAoMHg4MDUwfEZPUk1fQUREUikKLX07Ci0KLSNkZWZpbmUgQVRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgQVRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIExvY2F0aW9uIGF0b20gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9sb2NhdGlvbl9hdG9tIHsKLSAgICBPUF9SRUcJPSAweDAxLAotICAgIE9QX0JBU0VSRUcJPSAweDAyLAotICAgIE9QX0FERFIJPSAweDAzLAotICAgIE9QX0NPTlNUCT0gMHgwNCwKLSAgICBPUF9ERVJFRjIJPSAweDA1LAotICAgIE9QX0RFUkVGNAk9IDB4MDYsCi0gICAgT1BfQURECT0gMHgwNwotfTsKLQotI2RlZmluZSBPUF9MT19VU0VSCTB4ODAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgT1BfSElfVVNFUgkweGZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBGdW5kYW1lbnRhbCB0eXBlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSB7Ci0gICAgRlRfY2hhcgkJPSAweDAwMDEsCi0gICAgRlRfc2lnbmVkX2NoYXIJPSAweDAwMDIsCi0gICAgRlRfdW5zaWduZWRfY2hhcgk9IDB4MDAwMywKLSAgICBGVF9zaG9ydAkJPSAweDAwMDQsCi0gICAgRlRfc2lnbmVkX3Nob3J0CT0gMHgwMDA1LAotICAgIEZUX3Vuc2lnbmVkX3Nob3J0CT0gMHgwMDA2LAotICAgIEZUX2ludGVnZXIJCT0gMHgwMDA3LAotICAgIEZUX3NpZ25lZF9pbnRlZ2VyCT0gMHgwMDA4LAotICAgIEZUX3Vuc2lnbmVkX2ludGVnZXIJPSAweDAwMDksCi0gICAgRlRfbG9uZwkJPSAweDAwMGEsCi0gICAgRlRfc2lnbmVkX2xvbmcJPSAweDAwMGIsCi0gICAgRlRfdW5zaWduZWRfbG9uZwk9IDB4MDAwYywKLSAgICBGVF9wb2ludGVyCQk9IDB4MDAwZCwgIC8qIGFuIGFsaWFzIGZvciAodm9pZCAqKSAqLwotICAgIEZUX2Zsb2F0CQk9IDB4MDAwZSwKLSAgICBGVF9kYmxfcHJlY19mbG9hdAk9IDB4MDAwZiwKLSAgICBGVF9leHRfcHJlY19mbG9hdAk9IDB4MDAxMCwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9jb21wbGV4CQk9IDB4MDAxMSwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9kYmxfcHJlY19jb21wbGV4CT0gMHgwMDEyLCAgLyogYnJlYWtzICJjbGFzc2ljIiBzdnI0IFNEQiAqLwotCQkJLyogMHgwMDEzIC0tIHJlc2VydmVkICovCi0gICAgRlRfdm9pZAkJPSAweDAwMTQsCi0gICAgRlRfYm9vbGVhbgkJPSAweDAwMTUsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfZXh0X3ByZWNfY29tcGxleAk9IDB4MDAxNiwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9sYWJlbAkJPSAweDAwMTcsCi0gIAotICAgIC8qIEdOVSBleHRlbnNpb25zCi0gICAgICAgVGhlIGxvdyBvcmRlciBieXRlIG11c3QgaW5kaWNhdGUgdGhlIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHR5cGUuCi0gICAgICAgQWxsIG9mIHRoZXNlIHR5cGVzIHdpbGwgcHJvYmFibHkgYnJlYWsgImNsYXNzaWMiIHN2cjQgU0RCICovCi0KLSAgICBGVF9sb25nX2xvbmcJPSAweDgwMDgsCi0gICAgRlRfc2lnbmVkX2xvbmdfbG9uZwk9IDB4ODEwOCwKLSAgICBGVF91bnNpZ25lZF9sb25nX2xvbmcgPSAweDgyMDgsCi0KLSAgICBGVF9pbnQ4CQk9IDB4OTAwMSwKLSAgICBGVF9zaWduZWRfaW50OAk9IDB4OTEwMSwKLSAgICBGVF91bnNpZ25lZF9pbnQ4CT0gMHg5MjAxLAotICAgIEZUX2ludDE2CQk9IDB4OTMwMiwKLSAgICBGVF9zaWduZWRfaW50MTYJPSAweDk0MDIsCi0gICAgRlRfdW5zaWduZWRfaW50MTYJPSAweDk1MDIsCi0gICAgRlRfaW50MzIJCT0gMHg5NjA0LAotICAgIEZUX3NpZ25lZF9pbnQzMgk9IDB4OTcwNCwKLSAgICBGVF91bnNpZ25lZF9pbnQzMgk9IDB4OTgwNCwKLSAgICBGVF9pbnQ2NAkJPSAweDk5MDgsCi0gICAgRlRfc2lnbmVkX2ludDY0CT0gMHg5YTA4LAotICAgIEZUX3Vuc2lnbmVkX2ludDY0CT0gMHg5YjA4LAotCi0gICAgRlRfcmVhbDMyCQk9IDB4YTAwNCwKLSAgICBGVF9yZWFsNjQJCT0gMHhhMTA4LAotICAgIEZUX3JlYWw5NgkJPSAweGEyMGMsCi0gICAgRlRfcmVhbDEyOAkJPSAweGEzMTAKLX07Ci0KLSNkZWZpbmUgRlRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRlRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uIGRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIFR5cGUgbW9kaWZpZXIgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90eXBlX21vZGlmaWVyIHsKLSAgICBNT0RfcG9pbnRlcl90bwk9IDB4MDEsCi0gICAgTU9EX3JlZmVyZW5jZV90bwk9IDB4MDIsCi0gICAgTU9EX2NvbnN0CQk9IDB4MDMsCi0gICAgTU9EX3ZvbGF0aWxlCT0gMHgwNAotfTsKLQotI2RlZmluZSBNT0RfbG9fdXNlcgkweDgwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIE1PRF9oaV91c2VyCTB4ZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIEFycmF5IG9yZGVyaW5nIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfYXJyYXlfZGltX29yZGVyaW5nIHsKLSAgICBPUkRfcm93X21ham9yCT0gMCwKLSAgICBPUkRfY29sX21ham9yCT0gMQotfTsKLQotLyogQXJyYXkgc3Vic2NyaXB0IGZvcm1hdCBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX3N1YnNjcl9kYXRhX2Zvcm1hdHMgewotICAgIEZNVF9GVF9DX0MJPSAweDAsCi0gICAgRk1UX0ZUX0NfWAk9IDB4MSwKLSAgICBGTVRfRlRfWF9DCT0gMHgyLAotICAgIEZNVF9GVF9YX1gJPSAweDMsCi0gICAgRk1UX1VUX0NfQwk9IDB4NCwKLSAgICBGTVRfVVRfQ19YCT0gMHg1LAotICAgIEZNVF9VVF9YX0MJPSAweDYsCi0gICAgRk1UX1VUX1hfWAk9IDB4NywKLSAgICBGTVRfRVQJPSAweDgKLX07Ci0KLS8qIERlcml2ZWQgZnJvbSBhYm92ZSBmb3IgZWFzZSBvZiB1c2UuICAqLwotCi0jZGVmaW5lIEZNVF9DT0RFKF9GVU5EQU1FTlRBTF9UWVBFX1AsIF9VQl9DT05TVF9QLCBfTEJfQ09OU1RfUCkgXAotICgoKF9GVU5EQU1FTlRBTF9UWVBFX1ApID8gMCA6IDQpCVwKLSAgfCAoKF9VQl9DT05TVF9QKSA/IDAgOiAyKQkJXAotICB8ICgoX0xCX0NPTlNUX1ApID8gMCA6IDEpKQotCi0vKiBTb3VyY2UgbGFuZ3VhZ2UgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9zb3VyY2VfbGFuZ3VhZ2UgewotICAgIExBTkdfQzg5CQk9IDB4MDAwMDAwMDEsCi0gICAgTEFOR19DCQk9IDB4MDAwMDAwMDIsCi0gICAgTEFOR19BREE4MwkJPSAweDAwMDAwMDAzLAotICAgIExBTkdfQ19QTFVTX1BMVVMJPSAweDAwMDAwMDA0LAotICAgIExBTkdfQ09CT0w3NAk9IDB4MDAwMDAwMDUsCi0gICAgTEFOR19DT0JPTDg1CT0gMHgwMDAwMDAwNiwKLSAgICBMQU5HX0ZPUlRSQU43Nwk9IDB4MDAwMDAwMDcsCi0gICAgTEFOR19GT1JUUkFOOTAJPSAweDAwMDAwMDA4LAotICAgIExBTkdfUEFTQ0FMODMJPSAweDAwMDAwMDA5LAotICAgIExBTkdfTU9EVUxBMgk9IDB4MDAwMDAwMGEsCi0KLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotCi0gICAgTEFOR19DSElMTAkJPSAweDAwMDA5YWYzLAkvKiByYW5kb20gdmFsdWUgZm9yIEdOVSBDaGlsbCAqLwotICAgIExBTkdfSkFWQQkJPSAweDAwMDA5YWY0ICAgIC8qIHJhbmRvbSB2YWx1ZSArIDEgZm9yIEdOVSBKYXZhICovCi19OwotCi0jZGVmaW5lIExBTkdfbG9fdXNlcgkweDAwMDA4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIExBTkdfaGlfdXNlcgkweDAwMDBmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBOYW1lcyBhbmQgY29kZXMgZm9yIEdOVSAibWFjaW5mbyIgZXh0ZW5zaW9uLiAgKi8KLQotZW51bSBkd2FyZl9tYWNpbmZvX3JlY29yZF90eXBlIHsKLSAgICBNQUNJTkZPX3N0YXJ0CT0gJ3MnLAotICAgIE1BQ0lORk9fcmVzdW1lCT0gJ3InLAotICAgIE1BQ0lORk9fZGVmaW5lCT0gJ2QnLAotICAgIE1BQ0lORk9fdW5kZWYJPSAndScKLX07Ci0KLSNlbmRpZiAvKiBfRUxGX0RXQVJGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2R3YXJmMi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDRmYTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZHdhcmYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzggKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBvZiBjb2RlcyByZWxhdGluZyB0byB0aGUgRFdBUkYgc3ltYm9saWMKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgR2FyeSBGdW5jayAoZ2FyeUBpbnRyZXBpZC5jb20pIFRoZSBBZGEgSm9pbnQgUHJvZ3JhbQotICAgT2ZmaWNlIChBSlBPKSwgRmxvcmlkYSBTdGF0ZSBVbnZpdmVyc2l0eSBhbmQgU2lsaWNvbiBHcmFwaGljcyBJbmMuCi0gICBwcm92aWRlZCBzdXBwb3J0IGZvciB0aGlzIGVmZm9ydCAtLSBKdW5lIDIxLCAxOTk1LgotCi0gICBEZXJpdmVkIGZyb20gdGhlIERXQVJGIDEgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSBSb24gR3VpbG1ldHRlCi0gICAocmZnQG5ldGNvbS5jb20pLCBOb3ZlbWJlciAxOTkwLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0KLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgRFdBUkYgc3BlY2lmaWNhdGlvbiAoYSBwdWJsaWMgZG9jdW1lbnQpCi0gICBSZXZpc2lvbiAyLjAuMCAoSnVseSAyNywgMTk5MykgZGV2ZWxvcGVkIGJ5IHRoZSBVTklYIEludGVybmF0aW9uYWwKLSAgIFByb2dyYW1taW5nIExhbmd1YWdlcyBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChVSS9QTFNJRykgYW5kIGRpc3RyaWJ1dGVkCi0gICBieSBVTklYIEludGVybmF0aW9uYWwuICBDb3BpZXMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBhdmFpbGFibGUgZnJvbQotICAgVU5JWCBJbnRlcm5hdGlvbmFsLCAyMCBXYXRlcnZpZXcgQm91bGV2YXJkLCBQYXJzaXBwYW55LCBOSiwgMDcwNTQuICAqLwotCi0jaWZuZGVmIF9FTEZfRFdBUkYyX0gKLSNkZWZpbmUgX0VMRl9EV0FSRjJfSAotCi0vKiBTdHJ1Y3R1cmUgZm91bmQgaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciBsaV9sZW5ndGggICAgICAgICAgWzRdOwotICB1bnNpZ25lZCBjaGFyIGxpX3ZlcnNpb24gICAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfcHJvbG9ndWVfbGVuZ3RoIFs0XTsKLSAgdW5zaWduZWQgY2hhciBsaV9taW5faW5zbl9sZW5ndGggWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX2RlZmF1bHRfaXNfc3RtdCBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbGluZV9iYXNlICAgICAgIFsxXTsKLSAgdW5zaWduZWQgY2hhciBsaV9saW5lX3JhbmdlICAgICAgWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX29wY29kZV9iYXNlICAgICBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfTGluZUluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIGxpX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgbGlfdmVyc2lvbjsKLSAgdW5zaWduZWQgaW50ICAgbGlfcHJvbG9ndWVfbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyICBsaV9taW5faW5zbl9sZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgIGxpX2RlZmF1bHRfaXNfc3RtdDsKLSAgaW50ICAgICAgICAgICAgbGlfbGluZV9iYXNlOwotICB1bnNpZ25lZCBjaGFyICBsaV9saW5lX3JhbmdlOwotICB1bnNpZ25lZCBjaGFyICBsaV9vcGNvZGVfYmFzZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9MaW5lSW5mbzsKLQotLyogU3RydWN0dXJlIGZvdW5kIGluIC5kZWJ1Z19wdWJuYW1lcyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgcG5fbGVuZ3RoICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fdmVyc2lvbiBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fc2l6ZSAgICBbNF07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIHBuX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgcG5fdmVyc2lvbjsKLSAgdW5zaWduZWQgbG9uZyAgcG5fb2Zmc2V0OwotICB1bnNpZ25lZCBsb25nICBwbl9zaXplOwotfQotRFdBUkYyX0ludGVybmFsX1B1Yk5hbWVzOwotCi0vKiBTdHJjdXR1cmUgZm91bmQgaW4gLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICBjdV9sZW5ndGggICAgICAgIFs0XTsKLSAgdW5zaWduZWQgY2hhciAgY3VfdmVyc2lvbiAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGN1X2FiYnJldl9vZmZzZXQgWzRdOwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemUgIFsxXTsKLX0KLURXQVJGMl9FeHRlcm5hbF9Db21wVW5pdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgbG9uZyAgY3VfbGVuZ3RoOwotICB1bnNpZ25lZCBzaG9ydCBjdV92ZXJzaW9uOwotICB1bnNpZ25lZCBsb25nICBjdV9hYmJyZXZfb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemU7Ci19Ci1EV0FSRjJfSW50ZXJuYWxfQ29tcFVuaXQ7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2xlbmd0aCAgICAgICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3ZlcnNpb24gICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2luZm9fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3BvaW50ZXJfc2l6ZSBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZSBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfQVJhbmdlOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nICBhcl9sZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0IGFyX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGxvbmcgIGFyX2luZm9fb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBhcl9wb2ludGVyX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9BUmFuZ2U7Ci0KLQotLyogVGFnIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfdGFnCi0gIHsKLSAgICBEV19UQUdfcGFkZGluZyA9IDB4MDAsCi0gICAgRFdfVEFHX2FycmF5X3R5cGUgPSAweDAxLAotICAgIERXX1RBR19jbGFzc190eXBlID0gMHgwMiwKLSAgICBEV19UQUdfZW50cnlfcG9pbnQgPSAweDAzLAotICAgIERXX1RBR19lbnVtZXJhdGlvbl90eXBlID0gMHgwNCwKLSAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlciA9IDB4MDUsCi0gICAgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uID0gMHgwOCwKLSAgICBEV19UQUdfbGFiZWwgPSAweDBhLAotICAgIERXX1RBR19sZXhpY2FsX2Jsb2NrID0gMHgwYiwKLSAgICBEV19UQUdfbWVtYmVyID0gMHgwZCwKLSAgICBEV19UQUdfcG9pbnRlcl90eXBlID0gMHgwZiwKLSAgICBEV19UQUdfcmVmZXJlbmNlX3R5cGUgPSAweDEwLAotICAgIERXX1RBR19jb21waWxlX3VuaXQgPSAweDExLAotICAgIERXX1RBR19zdHJpbmdfdHlwZSA9IDB4MTIsCi0gICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlID0gMHgxMywKLSAgICBEV19UQUdfc3Vicm91dGluZV90eXBlID0gMHgxNSwKLSAgICBEV19UQUdfdHlwZWRlZiA9IDB4MTYsCi0gICAgRFdfVEFHX3VuaW9uX3R5cGUgPSAweDE3LAotICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzID0gMHgxOCwKLSAgICBEV19UQUdfdmFyaWFudCA9IDB4MTksCi0gICAgRFdfVEFHX2NvbW1vbl9ibG9jayA9IDB4MWEsCi0gICAgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24gPSAweDFiLAotICAgIERXX1RBR19pbmhlcml0YW5jZSA9IDB4MWMsCi0gICAgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSA9IDB4MWQsCi0gICAgRFdfVEFHX21vZHVsZSA9IDB4MWUsCi0gICAgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSA9IDB4MWYsCi0gICAgRFdfVEFHX3NldF90eXBlID0gMHgyMCwKLSAgICBEV19UQUdfc3VicmFuZ2VfdHlwZSA9IDB4MjEsCi0gICAgRFdfVEFHX3dpdGhfc3RtdCA9IDB4MjIsCi0gICAgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiA9IDB4MjMsCi0gICAgRFdfVEFHX2Jhc2VfdHlwZSA9IDB4MjQsCi0gICAgRFdfVEFHX2NhdGNoX2Jsb2NrID0gMHgyNSwKLSAgICBEV19UQUdfY29uc3RfdHlwZSA9IDB4MjYsCi0gICAgRFdfVEFHX2NvbnN0YW50ID0gMHgyNywKLSAgICBEV19UQUdfZW51bWVyYXRvciA9IDB4MjgsCi0gICAgRFdfVEFHX2ZpbGVfdHlwZSA9IDB4MjksCi0gICAgRFdfVEFHX2ZyaWVuZCA9IDB4MmEsCi0gICAgRFdfVEFHX25hbWVsaXN0ID0gMHgyYiwKLSAgICBEV19UQUdfbmFtZWxpc3RfaXRlbSA9IDB4MmMsCi0gICAgRFdfVEFHX3BhY2tlZF90eXBlID0gMHgyZCwKLSAgICBEV19UQUdfc3VicHJvZ3JhbSA9IDB4MmUsCi0gICAgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0gPSAweDJmLAotICAgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSA9IDB4MzAsCi0gICAgRFdfVEFHX3Rocm93bl90eXBlID0gMHgzMSwKLSAgICBEV19UQUdfdHJ5X2Jsb2NrID0gMHgzMiwKLSAgICBEV19UQUdfdmFyaWFudF9wYXJ0ID0gMHgzMywKLSAgICBEV19UQUdfdmFyaWFibGUgPSAweDM0LAotICAgIERXX1RBR192b2xhdGlsZV90eXBlID0gMHgzNSwKLSAgICAvKiBTR0kvTUlQUyBFeHRlbnNpb25zICovCi0gICAgRFdfVEFHX01JUFNfbG9vcCA9IDB4NDA4MSwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotICAgIERXX1RBR19mb3JtYXRfbGFiZWwgPSAweDQxMDEsCS8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlID0gMHg0MTAyLAkvKiBmb3IgQysrICovCi0gICAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzCS8qIGZvciBDKysgKi8KLSAgfTsKLQotI2RlZmluZSBEV19UQUdfbG9fdXNlcgkweDQwODAKLSNkZWZpbmUgRFdfVEFHX2hpX3VzZXIJMHhmZmZmCi0KLS8qIGZsYWcgdGhhdCB0ZWxscyB3aGV0aGVyIGVudHJ5IGhhcyBhIGNoaWxkIG9yIG5vdCAqLwotI2RlZmluZSBEV19jaGlsZHJlbl9ubyAgIDAKLSNkZWZpbmUJRFdfY2hpbGRyZW5feWVzICAxCi0KLS8qIEZvcm0gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLWVudW0gZHdhcmZfZm9ybQotICB7Ci0gICAgRFdfRk9STV9hZGRyID0gMHgwMSwKLSAgICBEV19GT1JNX2Jsb2NrMiA9IDB4MDMsCi0gICAgRFdfRk9STV9ibG9jazQgPSAweDA0LAotICAgIERXX0ZPUk1fZGF0YTIgPSAweDA1LAotICAgIERXX0ZPUk1fZGF0YTQgPSAweDA2LAotICAgIERXX0ZPUk1fZGF0YTggPSAweDA3LAotICAgIERXX0ZPUk1fc3RyaW5nID0gMHgwOCwKLSAgICBEV19GT1JNX2Jsb2NrID0gMHgwOSwKLSAgICBEV19GT1JNX2Jsb2NrMSA9IDB4MGEsCi0gICAgRFdfRk9STV9kYXRhMSA9IDB4MGIsCi0gICAgRFdfRk9STV9mbGFnID0gMHgwYywKLSAgICBEV19GT1JNX3NkYXRhID0gMHgwZCwKLSAgICBEV19GT1JNX3N0cnAgPSAweDBlLAotICAgIERXX0ZPUk1fdWRhdGEgPSAweDBmLAotICAgIERXX0ZPUk1fcmVmX2FkZHIgPSAweDEwLAotICAgIERXX0ZPUk1fcmVmMSA9IDB4MTEsCi0gICAgRFdfRk9STV9yZWYyID0gMHgxMiwKLSAgICBEV19GT1JNX3JlZjQgPSAweDEzLAotICAgIERXX0ZPUk1fcmVmOCA9IDB4MTQsCi0gICAgRFdfRk9STV9yZWZfdWRhdGEgPSAweDE1LAotICAgIERXX0ZPUk1faW5kaXJlY3QgPSAweDE2Ci0gIH07Ci0KLS8qIEF0dHJpYnV0ZSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQVRfc2libGluZyA9IDB4MDEsCi0gICAgRFdfQVRfbG9jYXRpb24gPSAweDAyLAotICAgIERXX0FUX25hbWUgPSAweDAzLAotICAgIERXX0FUX29yZGVyaW5nID0gMHgwOSwKLSAgICBEV19BVF9zdWJzY3JfZGF0YSA9IDB4MGEsCi0gICAgRFdfQVRfYnl0ZV9zaXplID0gMHgwYiwKLSAgICBEV19BVF9iaXRfb2Zmc2V0ID0gMHgwYywKLSAgICBEV19BVF9iaXRfc2l6ZSA9IDB4MGQsCi0gICAgRFdfQVRfZWxlbWVudF9saXN0ID0gMHgwZiwKLSAgICBEV19BVF9zdG10X2xpc3QgPSAweDEwLAotICAgIERXX0FUX2xvd19wYyA9IDB4MTEsCi0gICAgRFdfQVRfaGlnaF9wYyA9IDB4MTIsCi0gICAgRFdfQVRfbGFuZ3VhZ2UgPSAweDEzLAotICAgIERXX0FUX21lbWJlciA9IDB4MTQsCi0gICAgRFdfQVRfZGlzY3IgPSAweDE1LAotICAgIERXX0FUX2Rpc2NyX3ZhbHVlID0gMHgxNiwKLSAgICBEV19BVF92aXNpYmlsaXR5ID0gMHgxNywKLSAgICBEV19BVF9pbXBvcnQgPSAweDE4LAotICAgIERXX0FUX3N0cmluZ19sZW5ndGggPSAweDE5LAotICAgIERXX0FUX2NvbW1vbl9yZWZlcmVuY2UgPSAweDFhLAotICAgIERXX0FUX2NvbXBfZGlyID0gMHgxYiwKLSAgICBEV19BVF9jb25zdF92YWx1ZSA9IDB4MWMsCi0gICAgRFdfQVRfY29udGFpbmluZ190eXBlID0gMHgxZCwKLSAgICBEV19BVF9kZWZhdWx0X3ZhbHVlID0gMHgxZSwKLSAgICBEV19BVF9pbmxpbmUgPSAweDIwLAotICAgIERXX0FUX2lzX29wdGlvbmFsID0gMHgyMSwKLSAgICBEV19BVF9sb3dlcl9ib3VuZCA9IDB4MjIsCi0gICAgRFdfQVRfcHJvZHVjZXIgPSAweDI1LAotICAgIERXX0FUX3Byb3RvdHlwZWQgPSAweDI3LAotICAgIERXX0FUX3JldHVybl9hZGRyID0gMHgyYSwKLSAgICBEV19BVF9zdGFydF9zY29wZSA9IDB4MmMsCi0gICAgRFdfQVRfc3RyaWRlX3NpemUgPSAweDJlLAotICAgIERXX0FUX3VwcGVyX2JvdW5kID0gMHgyZiwKLSAgICBEV19BVF9hYnN0cmFjdF9vcmlnaW4gPSAweDMxLAotICAgIERXX0FUX2FjY2Vzc2liaWxpdHkgPSAweDMyLAotICAgIERXX0FUX2FkZHJlc3NfY2xhc3MgPSAweDMzLAotICAgIERXX0FUX2FydGlmaWNpYWwgPSAweDM0LAotICAgIERXX0FUX2Jhc2VfdHlwZXMgPSAweDM1LAotICAgIERXX0FUX2NhbGxpbmdfY29udmVudGlvbiA9IDB4MzYsCi0gICAgRFdfQVRfY291bnQgPSAweDM3LAotICAgIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uID0gMHgzOCwKLSAgICBEV19BVF9kZWNsX2NvbHVtbiA9IDB4MzksCi0gICAgRFdfQVRfZGVjbF9maWxlID0gMHgzYSwKLSAgICBEV19BVF9kZWNsX2xpbmUgPSAweDNiLAotICAgIERXX0FUX2RlY2xhcmF0aW9uID0gMHgzYywKLSAgICBEV19BVF9kaXNjcl9saXN0ID0gMHgzZCwKLSAgICBEV19BVF9lbmNvZGluZyA9IDB4M2UsCi0gICAgRFdfQVRfZXh0ZXJuYWwgPSAweDNmLAotICAgIERXX0FUX2ZyYW1lX2Jhc2UgPSAweDQwLAotICAgIERXX0FUX2ZyaWVuZCA9IDB4NDEsCi0gICAgRFdfQVRfaWRlbnRpZmllcl9jYXNlID0gMHg0MiwKLSAgICBEV19BVF9tYWNyb19pbmZvID0gMHg0MywKLSAgICBEV19BVF9uYW1lbGlzdF9pdGVtcyA9IDB4NDQsCi0gICAgRFdfQVRfcHJpb3JpdHkgPSAweDQ1LAotICAgIERXX0FUX3NlZ21lbnQgPSAweDQ2LAotICAgIERXX0FUX3NwZWNpZmljYXRpb24gPSAweDQ3LAotICAgIERXX0FUX3N0YXRpY19saW5rID0gMHg0OCwKLSAgICBEV19BVF90eXBlID0gMHg0OSwKLSAgICBEV19BVF91c2VfbG9jYXRpb24gPSAweDRhLAotICAgIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciA9IDB4NGIsCi0gICAgRFdfQVRfdmlydHVhbGl0eSA9IDB4NGMsCi0gICAgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24gPSAweDRkLAotICAgIC8qIFNHSS9NSVBTIEV4dGVuc2lvbnMgKi8KLSAgICBEV19BVF9NSVBTX2ZkZSA9IDB4MjAwMSwKLSAgICBEV19BVF9NSVBTX2xvb3BfYmVnaW4gPSAweDIwMDIsCi0gICAgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4gPSAweDIwMDMsCi0gICAgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4gPSAweDIwMDQsCi0gICAgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IgPSAweDIwMDUsCi0gICAgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCA9IDB4MjAwNiwKLSAgICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKLSAgICBEV19BVF9NSVBTX3N0cmlkZSA9IDB4MjAwOCwKLSAgICBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUgPSAweDIwMDksCi0gICAgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4gPSAweDIwMGEsCi0gICAgRFdfQVRfTUlQU19oYXNfaW5saW5lcyA9IDB4MjAwYiwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucy4gICovCi0gICAgRFdfQVRfc2ZfbmFtZXMgPSAweDIxMDEsCi0gICAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCi0gICAgRFdfQVRfbWFjX2luZm8gPSAweDIxMDMsCi0gICAgRFdfQVRfc3JjX2Nvb3JkcyA9IDB4MjEwNCwKLSAgICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAotICAgIERXX0FUX2JvZHlfZW5kID0gMHgyMTA2Ci0gIH07Ci0KLSNkZWZpbmUgRFdfQVRfbG9fdXNlcgkweDIwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19BVF9oaV91c2VyCTB4M2ZmMAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBMb2NhdGlvbiBhdG9tIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfbG9jYXRpb25fYXRvbQotICB7Ci0gICAgRFdfT1BfYWRkciA9IDB4MDMsCi0gICAgRFdfT1BfZGVyZWYgPSAweDA2LAotICAgIERXX09QX2NvbnN0MXUgPSAweDA4LAotICAgIERXX09QX2NvbnN0MXMgPSAweDA5LAotICAgIERXX09QX2NvbnN0MnUgPSAweDBhLAotICAgIERXX09QX2NvbnN0MnMgPSAweDBiLAotICAgIERXX09QX2NvbnN0NHUgPSAweDBjLAotICAgIERXX09QX2NvbnN0NHMgPSAweDBkLAotICAgIERXX09QX2NvbnN0OHUgPSAweDBlLAotICAgIERXX09QX2NvbnN0OHMgPSAweDBmLAotICAgIERXX09QX2NvbnN0dSA9IDB4MTAsCi0gICAgRFdfT1BfY29uc3RzID0gMHgxMSwKLSAgICBEV19PUF9kdXAgPSAweDEyLAotICAgIERXX09QX2Ryb3AgPSAweDEzLAotICAgIERXX09QX292ZXIgPSAweDE0LAotICAgIERXX09QX3BpY2sgPSAweDE1LAotICAgIERXX09QX3N3YXAgPSAweDE2LAotICAgIERXX09QX3JvdCA9IDB4MTcsCi0gICAgRFdfT1BfeGRlcmVmID0gMHgxOCwKLSAgICBEV19PUF9hYnMgPSAweDE5LAotICAgIERXX09QX2FuZCA9IDB4MWEsCi0gICAgRFdfT1BfZGl2ID0gMHgxYiwKLSAgICBEV19PUF9taW51cyA9IDB4MWMsCi0gICAgRFdfT1BfbW9kID0gMHgxZCwKLSAgICBEV19PUF9tdWwgPSAweDFlLAotICAgIERXX09QX25lZyA9IDB4MWYsCi0gICAgRFdfT1Bfbm90ID0gMHgyMCwKLSAgICBEV19PUF9vciA9IDB4MjEsCi0gICAgRFdfT1BfcGx1cyA9IDB4MjIsCi0gICAgRFdfT1BfcGx1c191Y29uc3QgPSAweDIzLAotICAgIERXX09QX3NobCA9IDB4MjQsCi0gICAgRFdfT1Bfc2hyID0gMHgyNSwKLSAgICBEV19PUF9zaHJhID0gMHgyNiwKLSAgICBEV19PUF94b3IgPSAweDI3LAotICAgIERXX09QX2JyYSA9IDB4MjgsCi0gICAgRFdfT1BfZXEgPSAweDI5LAotICAgIERXX09QX2dlID0gMHgyYSwKLSAgICBEV19PUF9ndCA9IDB4MmIsCi0gICAgRFdfT1BfbGUgPSAweDJjLAotICAgIERXX09QX2x0ID0gMHgyZCwKLSAgICBEV19PUF9uZSA9IDB4MmUsCi0gICAgRFdfT1Bfc2tpcCA9IDB4MmYsCi0gICAgRFdfT1BfbGl0MCA9IDB4MzAsCi0gICAgRFdfT1BfbGl0MSA9IDB4MzEsCi0gICAgRFdfT1BfbGl0MiA9IDB4MzIsCi0gICAgRFdfT1BfbGl0MyA9IDB4MzMsCi0gICAgRFdfT1BfbGl0NCA9IDB4MzQsCi0gICAgRFdfT1BfbGl0NSA9IDB4MzUsCi0gICAgRFdfT1BfbGl0NiA9IDB4MzYsCi0gICAgRFdfT1BfbGl0NyA9IDB4MzcsCi0gICAgRFdfT1BfbGl0OCA9IDB4MzgsCi0gICAgRFdfT1BfbGl0OSA9IDB4MzksCi0gICAgRFdfT1BfbGl0MTAgPSAweDNhLAotICAgIERXX09QX2xpdDExID0gMHgzYiwKLSAgICBEV19PUF9saXQxMiA9IDB4M2MsCi0gICAgRFdfT1BfbGl0MTMgPSAweDNkLAotICAgIERXX09QX2xpdDE0ID0gMHgzZSwKLSAgICBEV19PUF9saXQxNSA9IDB4M2YsCi0gICAgRFdfT1BfbGl0MTYgPSAweDQwLAotICAgIERXX09QX2xpdDE3ID0gMHg0MSwKLSAgICBEV19PUF9saXQxOCA9IDB4NDIsCi0gICAgRFdfT1BfbGl0MTkgPSAweDQzLAotICAgIERXX09QX2xpdDIwID0gMHg0NCwKLSAgICBEV19PUF9saXQyMSA9IDB4NDUsCi0gICAgRFdfT1BfbGl0MjIgPSAweDQ2LAotICAgIERXX09QX2xpdDIzID0gMHg0NywKLSAgICBEV19PUF9saXQyNCA9IDB4NDgsCi0gICAgRFdfT1BfbGl0MjUgPSAweDQ5LAotICAgIERXX09QX2xpdDI2ID0gMHg0YSwKLSAgICBEV19PUF9saXQyNyA9IDB4NGIsCi0gICAgRFdfT1BfbGl0MjggPSAweDRjLAotICAgIERXX09QX2xpdDI5ID0gMHg0ZCwKLSAgICBEV19PUF9saXQzMCA9IDB4NGUsCi0gICAgRFdfT1BfbGl0MzEgPSAweDRmLAotICAgIERXX09QX3JlZzAgPSAweDUwLAotICAgIERXX09QX3JlZzEgPSAweDUxLAotICAgIERXX09QX3JlZzIgPSAweDUyLAotICAgIERXX09QX3JlZzMgPSAweDUzLAotICAgIERXX09QX3JlZzQgPSAweDU0LAotICAgIERXX09QX3JlZzUgPSAweDU1LAotICAgIERXX09QX3JlZzYgPSAweDU2LAotICAgIERXX09QX3JlZzcgPSAweDU3LAotICAgIERXX09QX3JlZzggPSAweDU4LAotICAgIERXX09QX3JlZzkgPSAweDU5LAotICAgIERXX09QX3JlZzEwID0gMHg1YSwKLSAgICBEV19PUF9yZWcxMSA9IDB4NWIsCi0gICAgRFdfT1BfcmVnMTIgPSAweDVjLAotICAgIERXX09QX3JlZzEzID0gMHg1ZCwKLSAgICBEV19PUF9yZWcxNCA9IDB4NWUsCi0gICAgRFdfT1BfcmVnMTUgPSAweDVmLAotICAgIERXX09QX3JlZzE2ID0gMHg2MCwKLSAgICBEV19PUF9yZWcxNyA9IDB4NjEsCi0gICAgRFdfT1BfcmVnMTggPSAweDYyLAotICAgIERXX09QX3JlZzE5ID0gMHg2MywKLSAgICBEV19PUF9yZWcyMCA9IDB4NjQsCi0gICAgRFdfT1BfcmVnMjEgPSAweDY1LAotICAgIERXX09QX3JlZzIyID0gMHg2NiwKLSAgICBEV19PUF9yZWcyMyA9IDB4NjcsCi0gICAgRFdfT1BfcmVnMjQgPSAweDY4LAotICAgIERXX09QX3JlZzI1ID0gMHg2OSwKLSAgICBEV19PUF9yZWcyNiA9IDB4NmEsCi0gICAgRFdfT1BfcmVnMjcgPSAweDZiLAotICAgIERXX09QX3JlZzI4ID0gMHg2YywKLSAgICBEV19PUF9yZWcyOSA9IDB4NmQsCi0gICAgRFdfT1BfcmVnMzAgPSAweDZlLAotICAgIERXX09QX3JlZzMxID0gMHg2ZiwKLSAgICBEV19PUF9icmVnMCA9IDB4NzAsCi0gICAgRFdfT1BfYnJlZzEgPSAweDcxLAotICAgIERXX09QX2JyZWcyID0gMHg3MiwKLSAgICBEV19PUF9icmVnMyA9IDB4NzMsCi0gICAgRFdfT1BfYnJlZzQgPSAweDc0LAotICAgIERXX09QX2JyZWc1ID0gMHg3NSwKLSAgICBEV19PUF9icmVnNiA9IDB4NzYsCi0gICAgRFdfT1BfYnJlZzcgPSAweDc3LAotICAgIERXX09QX2JyZWc4ID0gMHg3OCwKLSAgICBEV19PUF9icmVnOSA9IDB4NzksCi0gICAgRFdfT1BfYnJlZzEwID0gMHg3YSwKLSAgICBEV19PUF9icmVnMTEgPSAweDdiLAotICAgIERXX09QX2JyZWcxMiA9IDB4N2MsCi0gICAgRFdfT1BfYnJlZzEzID0gMHg3ZCwKLSAgICBEV19PUF9icmVnMTQgPSAweDdlLAotICAgIERXX09QX2JyZWcxNSA9IDB4N2YsCi0gICAgRFdfT1BfYnJlZzE2ID0gMHg4MCwKLSAgICBEV19PUF9icmVnMTcgPSAweDgxLAotICAgIERXX09QX2JyZWcxOCA9IDB4ODIsCi0gICAgRFdfT1BfYnJlZzE5ID0gMHg4MywKLSAgICBEV19PUF9icmVnMjAgPSAweDg0LAotICAgIERXX09QX2JyZWcyMSA9IDB4ODUsCi0gICAgRFdfT1BfYnJlZzIyID0gMHg4NiwKLSAgICBEV19PUF9icmVnMjMgPSAweDg3LAotICAgIERXX09QX2JyZWcyNCA9IDB4ODgsCi0gICAgRFdfT1BfYnJlZzI1ID0gMHg4OSwKLSAgICBEV19PUF9icmVnMjYgPSAweDhhLAotICAgIERXX09QX2JyZWcyNyA9IDB4OGIsCi0gICAgRFdfT1BfYnJlZzI4ID0gMHg4YywKLSAgICBEV19PUF9icmVnMjkgPSAweDhkLAotICAgIERXX09QX2JyZWczMCA9IDB4OGUsCi0gICAgRFdfT1BfYnJlZzMxID0gMHg4ZiwKLSAgICBEV19PUF9yZWd4ID0gMHg5MCwKLSAgICBEV19PUF9mYnJlZyA9IDB4OTEsCi0gICAgRFdfT1BfYnJlZ3ggPSAweDkyLAotICAgIERXX09QX3BpZWNlID0gMHg5MywKLSAgICBEV19PUF9kZXJlZl9zaXplID0gMHg5NCwKLSAgICBEV19PUF94ZGVyZWZfc2l6ZSA9IDB4OTUsCi0gICAgRFdfT1Bfbm9wID0gMHg5NgotICB9OwotCi0jZGVmaW5lIERXX09QX2xvX3VzZXIJMHg4MAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIERXX09QX2hpX3VzZXIJMHhmZgkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBUeXBlIGVuY29kaW5ncy4gICovCi0KLWVudW0gZHdhcmZfdHlwZQotICB7Ci0gICAgRFdfQVRFX3ZvaWQgPSAweDAsCi0gICAgRFdfQVRFX2FkZHJlc3MgPSAweDEsCi0gICAgRFdfQVRFX2Jvb2xlYW4gPSAweDIsCi0gICAgRFdfQVRFX2NvbXBsZXhfZmxvYXQgPSAweDMsCi0gICAgRFdfQVRFX2Zsb2F0ID0gMHg0LAotICAgIERXX0FURV9zaWduZWQgPSAweDUsCi0gICAgRFdfQVRFX3NpZ25lZF9jaGFyID0gMHg2LAotICAgIERXX0FURV91bnNpZ25lZCA9IDB4NywKLSAgICBEV19BVEVfdW5zaWduZWRfY2hhciA9IDB4OAotICB9OwotCi0jZGVmaW5lCURXX0FURV9sb191c2VyIDB4ODAKLSNkZWZpbmUJRFdfQVRFX2hpX3VzZXIgMHhmZgotCi0vKiBBcnJheSBvcmRlcmluZyBuYW1lcyBhbmQgY29kZXMuICAqLwotZW51bSBkd2FyZl9hcnJheV9kaW1fb3JkZXJpbmcKLSAgewotICAgIERXX09SRF9yb3dfbWFqb3IgPSAwLAotICAgIERXX09SRF9jb2xfbWFqb3IgPSAxCi0gIH07Ci0KLS8qIGFjY2VzcyBhdHRyaWJ1dGUgKi8KLWVudW0gZHdhcmZfYWNjZXNzX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQUNDRVNTX3B1YmxpYyA9IDEsCi0gICAgRFdfQUNDRVNTX3Byb3RlY3RlZCA9IDIsCi0gICAgRFdfQUNDRVNTX3ByaXZhdGUgPSAzCi0gIH07Ci0KLS8qIHZpc2liaWxpdHkgKi8KLWVudW0gZHdhcmZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUKLSAgewotICAgIERXX1ZJU19sb2NhbCA9IDEsCi0gICAgRFdfVklTX2V4cG9ydGVkID0gMiwKLSAgICBEV19WSVNfcXVhbGlmaWVkID0gMwotICB9OwotCi0vKiB2aXJ0dWFsaXR5ICovCi1lbnVtIGR3YXJmX3ZpcnR1YWxpdHlfYXR0cmlidXRlCi0gIHsKLSAgICBEV19WSVJUVUFMSVRZX25vbmUgPSAwLAotICAgIERXX1ZJUlRVQUxJVFlfdmlydHVhbCA9IDEsCi0gICAgRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWwgPSAyCi0gIH07Ci0KLS8qIGNhc2Ugc2Vuc2l0aXZpdHkgKi8KLWVudW0gZHdhcmZfaWRfY2FzZQotICB7Ci0gICAgRFdfSURfY2FzZV9zZW5zaXRpdmUgPSAwLAotICAgIERXX0lEX3VwX2Nhc2UgPSAxLAotICAgIERXX0lEX2Rvd25fY2FzZSA9IDIsCi0gICAgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZSA9IDMKLSAgfTsKLQotLyogY2FsbGluZyBjb252ZW50aW9uICovCi1lbnVtIGR3YXJmX2NhbGxpbmdfY29udmVudGlvbgotICB7Ci0gICAgRFdfQ0Nfbm9ybWFsID0gMHgxLAotICAgIERXX0NDX3Byb2dyYW0gPSAweDIsCi0gICAgRFdfQ0Nfbm9jYWxsID0gMHgzCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0NfbG9fdXNlciAweDQwCi0jZGVmaW5lIERXX0NDX2hpX3VzZXIgMHhmZgotCi0vKiBpbmxpbmUgYXR0cmlidXRlICovCi1lbnVtIGR3YXJmX2lubGluZV9hdHRyaWJ1dGUKLSAgewotICAgIERXX0lOTF9ub3RfaW5saW5lZCA9IDAsCi0gICAgRFdfSU5MX2lubGluZWQgPSAxLAotICAgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDIsCi0gICAgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQgPSAzCi0gIH07Ci0KLS8qIGRlc2NyaW1pbmFudCBsaXN0cyAqLwotZW51bSBkd2FyZl9kZXNjcmltX2xpc3QKLSAgewotICAgIERXX0RTQ19sYWJlbCA9IDAsCi0gICAgRFdfRFNDX3JhbmdlID0gMQotICB9OwotCi0vKiBsaW5lIG51bWJlciBvcGNvZGVzICovCi1lbnVtIGR3YXJmX2xpbmVfbnVtYmVyX29wcwotICB7Ci0gICAgRFdfTE5TX2V4dGVuZGVkX29wID0gMCwKLSAgICBEV19MTlNfY29weSA9IDEsCi0gICAgRFdfTE5TX2FkdmFuY2VfcGMgPSAyLAotICAgIERXX0xOU19hZHZhbmNlX2xpbmUgPSAzLAotICAgIERXX0xOU19zZXRfZmlsZSA9IDQsCi0gICAgRFdfTE5TX3NldF9jb2x1bW4gPSA1LAotICAgIERXX0xOU19uZWdhdGVfc3RtdCA9IDYsCi0gICAgRFdfTE5TX3NldF9iYXNpY19ibG9jayA9IDcsCi0gICAgRFdfTE5TX2NvbnN0X2FkZF9wYyA9IDgsCi0gICAgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGMgPSA5Ci0gIH07Ci0KLS8qIGxpbmUgbnVtYmVyIGV4dGVuZGVkIG9wY29kZXMgKi8KLWVudW0gZHdhcmZfbGluZV9udW1iZXJfeF9vcHMKLSAgewotICAgIERXX0xORV9lbmRfc2VxdWVuY2UgPSAxLAotICAgIERXX0xORV9zZXRfYWRkcmVzcyA9IDIsCi0gICAgRFdfTE5FX2RlZmluZV9maWxlID0gMwotICB9OwotCi0vKiBjYWxsIGZyYW1lIGluZm9ybWF0aW9uICovCi1lbnVtIGR3YXJmX2NhbGxfZnJhbWVfaW5mbwotICB7Ci0gICAgRFdfQ0ZBX2FkdmFuY2VfbG9jID0gMHg0MCwKLSAgICBEV19DRkFfb2Zmc2V0ID0gMHg4MCwKLSAgICBEV19DRkFfcmVzdG9yZSA9IDB4YzAsCi0gICAgRFdfQ0ZBX25vcCA9IDB4MDAsCi0gICAgRFdfQ0ZBX3NldF9sb2MgPSAweDAxLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzEgPSAweDAyLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzIgPSAweDAzLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzQgPSAweDA0LAotICAgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgPSAweDA1LAotICAgIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkID0gMHgwNiwKLSAgICBEV19DRkFfdW5kZWZpbmVkID0gMHgwNywKLSAgICBEV19DRkFfc2FtZV92YWx1ZSA9IDB4MDgsCi0gICAgRFdfQ0ZBX3JlZ2lzdGVyID0gMHgwOSwKLSAgICBEV19DRkFfcmVtZW1iZXJfc3RhdGUgPSAweDBhLAotICAgIERXX0NGQV9yZXN0b3JlX3N0YXRlID0gMHgwYiwKLSAgICBEV19DRkFfZGVmX2NmYSA9IDB4MGMsCi0gICAgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgPSAweDBkLAotICAgIERXX0NGQV9kZWZfY2ZhX29mZnNldCA9IDB4MGUsCi0gICAgLyogU0dJL01JUFMgc3BlY2lmaWMgKi8KLSAgICBEV19DRkFfTUlQU19hZHZhbmNlX2xvYzggPSAweDFkCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0lFX0lECSAgMHhmZmZmZmZmZgotI2RlZmluZSBEV19DSUVfVkVSU0lPTgkgIDEKLQotI2RlZmluZSBEV19DRkFfZXh0ZW5kZWQgICAwCi0jZGVmaW5lIERXX0NGQV9sb3dfdXNlciAgIDB4MWMKLSNkZWZpbmUgRFdfQ0ZBX2hpZ2hfdXNlciAgMHgzZgotCi0jZGVmaW5lIERXX0NISUxEUkVOX25vCQkgICAgIDB4MDAKLSNkZWZpbmUgRFdfQ0hJTERSRU5feWVzCQkgICAgIDB4MDEKLQotI2RlZmluZSBEV19BRERSX25vbmUJCTAKLQotLyogU291cmNlIGxhbmd1YWdlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfc291cmNlX2xhbmd1YWdlCi0gIHsKLSAgICBEV19MQU5HX0M4OSA9IDB4MDAwMSwKLSAgICBEV19MQU5HX0MgPSAweDAwMDIsCi0gICAgRFdfTEFOR19BZGE4MyA9IDB4MDAwMywKLSAgICBEV19MQU5HX0NfcGx1c19wbHVzID0gMHgwMDA0LAotICAgIERXX0xBTkdfQ29ib2w3NCA9IDB4MDAwNSwKLSAgICBEV19MQU5HX0NvYm9sODUgPSAweDAwMDYsCi0gICAgRFdfTEFOR19Gb3J0cmFuNzcgPSAweDAwMDcsCi0gICAgRFdfTEFOR19Gb3J0cmFuOTAgPSAweDAwMDgsCi0gICAgRFdfTEFOR19QYXNjYWw4MyA9IDB4MDAwOSwKLSAgICBEV19MQU5HX01vZHVsYTIgPSAweDAwMGEsCi0gICAgRFdfTEFOR19KYXZhID0gMHg5YWY0LAotICAgIERXX0xBTkdfTWlwc19Bc3NlbWJsZXIgPSAweDgwMDEKLSAgfTsKLQotCi0jZGVmaW5lIERXX0xBTkdfbG9fdXNlciAweDgwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19MQU5HX2hpX3VzZXIgMHhmZmZmCS8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLQotLyogTmFtZXMgYW5kIGNvZGVzIGZvciBtYWNybyBpbmZvcm1hdGlvbi4gICovCi0KLWVudW0gZHdhcmZfbWFjaW5mb19yZWNvcmRfdHlwZQotICB7Ci0gICAgRFdfTUFDSU5GT19kZWZpbmUgPSAxLAotICAgIERXX01BQ0lORk9fdW5kZWYgPSAyLAotICAgIERXX01BQ0lORk9fc3RhcnRfZmlsZSA9IDMsCi0gICAgRFdfTUFDSU5GT19lbmRfZmlsZSA9IDQsCi0gICAgRFdfTUFDSU5GT192ZW5kb3JfZXh0ID0gMjU1Ci0gIH07Ci0KLSNlbmRpZiAvKiBfRUxGX0RXQVJGMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9leHRlcm5hbC5oIGIvaW5jbHVkZS9lbGYvZXh0ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhYjc3ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9leHRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbiBwdWJsaXNoZWQKLSAgIGluICJVTklYIFN5c3RlbSBWIFJlbGVhc2UgNCwgUHJvZ3JhbW1lcnMgR3VpZGU6IEFOU0kgQyBhbmQKLSAgIFByb2dyYW1taW5nIFN1cHBvcnQgVG9vbHMiLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRUxGIHN1cHBvcnQgZm9yIEJGRCwgYW5kIGNvbnRhaW5zIHRoZSBwb3J0aW9ucwotICAgdGhhdCBkZXNjcmliZSBob3cgRUxGIGlzIHJlcHJlc2VudGVkIGV4dGVybmFsbHkgYnkgdGhlIEJGRCBsaWJyYXJ5LgotICAgSS5FLiBpdCBkZXNjcmliZXMgdGhlIGluLWZpbGUgcmVwcmVzZW50YXRpb24gb2YgRUxGLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBlbGYtY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0vKiBUaGUgNjQtYml0IHN0dWZmIGlzIGtpbmQgb2YgcmFuZG9tLiAgUGVyaGFwcyBzb21lb25lIHdpbGwgcHVibGlzaCBhCi0gICBzcGVjIHNvbWVkYXkuICAqLwotCi0jaWZuZGVmIF9FTEZfRVhURVJOQUxfSAotI2RlZmluZSBfRUxGX0VYVEVSTkFMX0gKLQotLyogRUxGIEhlYWRlciAoMzItYml0IGltcGxlbWVudGF0aW9ucykgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWVfaWRlbnRbMTZdOwkJLyogRUxGICJtYWdpYyBudW1iZXIiICovCi0gIHVuc2lnbmVkIGNoYXIJZV90eXBlWzJdOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJZV9tYWNoaW5lWzJdOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfdmVyc2lvbls0XTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICB1bnNpZ25lZCBjaGFyCWVfZW50cnlbNF07CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Bob2ZmWzRdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Nob2ZmWzRdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX2ZsYWdzWzRdOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9laHNpemVbMl07CQkvKiBFTEYgaGVhZGVyIHNpemUgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BoZW50c2l6ZVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BobnVtWzJdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NoZW50c2l6ZVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NobnVtWzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Noc3RybmR4WzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCi19IEVsZjMyX0V4dGVybmFsX0VoZHI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgllX2lkZW50WzE2XTsJCS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLwotICB1bnNpZ25lZCBjaGFyCWVfdHlwZVsyXTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfbWFjaGluZVsyXTsJCS8qIFNwZWNpZmllcyByZXF1aXJlZCBhcmNoaXRlY3R1cmUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3ZlcnNpb25bNF07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHZlcnNpb24gKi8KLSAgdW5zaWduZWQgY2hhcgllX2VudHJ5WzhdOwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG9mZls4XTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG9mZls4XTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9mbGFnc1s0XTsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCWVfZWhzaXplWzJdOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waGVudHNpemVbMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG51bVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaGVudHNpemVbMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG51bVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaHN0cm5keFsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGY2NF9FeHRlcm5hbF9FaGRyOwotCi0vKiBQcm9ncmFtIGhlYWRlciAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJcF90eXBlWzRdOwkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfb2Zmc2V0WzRdOwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCXBfdmFkZHJbNF07CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfcGFkZHJbNF07CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZpbGVzels0XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJcF9tZW1zels0XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZsYWdzWzRdOwkJLyogU2VnbWVudCBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCXBfYWxpZ25bNF07CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfSBFbGYzMl9FeHRlcm5hbF9QaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJcF90eXBlWzRdOwkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmxhZ3NbNF07CQkvKiBTZWdtZW50IGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9vZmZzZXRbOF07CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJcF92YWRkcls4XTsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9wYWRkcls4XTsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmlsZXN6WzhdOwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglwX21lbXN6WzhdOwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLwotICB1bnNpZ25lZCBjaGFyCXBfYWxpZ25bOF07CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfSBFbGY2NF9FeHRlcm5hbF9QaGRyOwotCi0vKiBTZWN0aW9uIGhlYWRlciAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc2hfbmFtZVs0XTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3R5cGVbNF07CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9mbGFnc1s0XTsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcls0XTsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX29mZnNldFs0XTsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9zaXplWzRdOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfbGlua1s0XTsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2luZm9bNF07CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyYWxpZ25bNF07CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZW50c2l6ZVs0XTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotfSBFbGYzMl9FeHRlcm5hbF9TaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc2hfbmFtZVs0XTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3R5cGVbNF07CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9mbGFnc1s4XTsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcls4XTsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX29mZnNldFs4XTsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9zaXplWzhdOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfbGlua1s0XTsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2luZm9bNF07CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyYWxpZ25bOF07CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZW50c2l6ZVs4XTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9TaGRyOwotCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXN0X25hbWVbNF07CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3ZhbHVlWzRdOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3NpemVbNF07CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mb1sxXTsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyWzFdOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2huZHhbMl07CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLX0gRWxmMzJfRXh0ZXJuYWxfU3ltOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc3RfbmFtZVs0XTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mb1sxXTsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyWzFdOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2huZHhbMl07CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLSAgdW5zaWduZWQgY2hhcglzdF92YWx1ZVs4XTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9zaXplWzhdOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9TeW07Ci0KLS8qIE5vdGUgc2VnbWVudHMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCW5hbWVzels0XTsJCS8qIFNpemUgb2YgZW50cnkncyBvd25lciBzdHJpbmcgKi8KLSAgdW5zaWduZWQgY2hhcglkZXNjc3pbNF07CQkvKiBTaXplIG9mIHRoZSBub3RlIGRlc2NyaXB0b3IgKi8KLSAgdW5zaWduZWQgY2hhcgl0eXBlWzRdOwkJLyogSW50ZXJwcmV0YXRpb24gb2YgdGhlIGRlc2NyaXB0b3IgKi8KLSAgY2hhcgkJbmFtZVsxXTsJCS8qIFN0YXJ0IG9mIHRoZSBuYW1lK2Rlc2MgZGF0YSAqLwotfSBFbGZfRXh0ZXJuYWxfTm90ZTsKLQotLyogUmVsb2NhdGlvbiBFbnRyaWVzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbNF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bNF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmMzJfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbNF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bNF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2FkZGVuZFs0XTsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLwotfSBFbGYzMl9FeHRlcm5hbF9SZWxhOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bOF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmNjRfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bOF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2FkZGVuZFs4XTsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9SZWxhOwotCi0vKiBkeW5hbWljIHNlY3Rpb24gc3RydWN0dXJlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglkX3RhZ1s0XTsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLwotICB1bmlvbiB7Ci0gICAgdW5zaWduZWQgY2hhcglkX3ZhbFs0XTsKLSAgICB1bnNpZ25lZCBjaGFyCWRfcHRyWzRdOwotICB9IGRfdW47Ci19IEVsZjMyX0V4dGVybmFsX0R5bjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWRfdGFnWzhdOwkJLyogZW50cnkgdGFnIHZhbHVlICovCi0gIHVuaW9uIHsKLSAgICB1bnNpZ25lZCBjaGFyCWRfdmFsWzhdOwotICAgIHVuc2lnbmVkIGNoYXIJZF9wdHJbOF07Ci0gIH0gZF91bjsKLX0gRWxmNjRfRXh0ZXJuYWxfRHluOwotCi0vKiBUaGUgdmVyc2lvbiBzdHJ1Y3R1cmVzIGFyZSBjdXJyZW50bHkgc2l6ZSBpbmRlcGVuZGVudC4gIFRoZXkgYXJlCi0gICBuYW1lZCB3aXRob3V0IGEgMzIgb3IgNjQuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhlc2Ugc3RydWN0dXJlcwotICAgd2lsbCBuZWVkIHRvIGJlIHJlbmFtZWQuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdmRfdmVyc2lvblsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfZmxhZ3NbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX25keFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfY250WzJdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9oYXNoWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9hdXhbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJkZWY7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2ZGFfbmFtZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdmRhX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJkYXV4OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJuZWVkIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX3ZlcnNpb25bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX2NudFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fZmlsZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fYXV4WzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bl9uZXh0WzRdOwotfSBFbGZfRXh0ZXJuYWxfVmVybmVlZDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2bmFfaGFzaFs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX2ZsYWdzWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfb3RoZXJbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuYV9uYW1lWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfbmV4dFs0XTsKLX0gRWxmX0V4dGVybmFsX1Zlcm5hdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgVGhpcyBpcyBub3QgYQotICAgc3RhbmRhcmQgRUxGIHN0cnVjdHVyZTsgRUxGIGp1c3QgdXNlcyBFbGYzMl9IYWxmLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2c192ZXJzWzJdOwotfQotI2lmZGVmIF9fR05VQ19fCi0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQotI2VuZGlmCi0gIEVsZl9FeHRlcm5hbF9WZXJzeW07Ci0KLS8qIFN0cnVjdHVyZSBmb3Igc3ltaW5mbyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIJCXNpX2JvdW5kdG9bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXNpX2ZsYWdzWzJdOwotfSBFbGZfRXh0ZXJuYWxfU3ltaW5mbzsKLQotI2VuZGlmIC8qIF9FTEZfRVhURVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZnIzMC5oIGIvaW5jbHVkZS9lbGYvZnIzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNiMDUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2ZyMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIEZSMzAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfRlIzMF9ICi0jZGVmaW5lIF9FTEZfRlIzMF9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9mcjMwX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzgsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzIwLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8zMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfNDgsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzZfSU5fNCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfOF9JTl84LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF85X0lOXzgsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEwX0lOXzgsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzlfUENSRUwsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEyX1BDUkVMLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfR05VX1ZUSU5IRVJJVCwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX0dOVV9WVEVOVFJZLCAxMikKLSAgRU1QVFlfUkVMT0MgIChSX0ZSMzBfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmIC8qIF9FTEZfRlIzMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9ocHBhLmggYi9pbmNsdWRlL2VsZi9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDVkNzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qIEhQUEEgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEhQUEEgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfSFBQQV9ICi0jZGVmaW5lIF9FTEZfSFBQQV9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFRyYXAgbnVsbCBhZGRyZXNzIGRlcmVmZXJlbmNlcy4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19UUkFQTklMCTB4MDAwMTAwMDAKLQotLyogLlBBUklTQy5hcmNoZXh0IHNlY3Rpb24gaXMgcHJlc2VudC4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19FWFQJCTB4MDAwMjAwMDAKLQotLyogUHJvZ3JhbSBleHBlY3RzIGxpdHRsZS1lbmRpYW4gbW9kZS4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19MU0IJCTB4MDAwNDAwMDAKLQotLyogUHJvZ3JhbSBleHBlY3RzIHdpZGUgbW9kZS4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19XSURFCQkweDAwMDgwMDAwCi0KLS8qIERvIG5vdCBhbGxvdyBrZXJuZWwtYXNzaXN0ZWQgYnJhbmNoIHByZWRpY3Rpb24uICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTk9fS0FCUAkweDAwMTAwMDAwCi0KLS8qIEFsbG93IGxhenkgc3dhcCBmb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHByb2dyYW0gc2VnbWVudHMuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTEFaWVNXQVAJMHgwMDQwMDAwMAotCi0vKiBBcmNoaXRlY3R1cmUgdmVyc2lvbiAqLwotI2RlZmluZSBFRl9QQVJJU0NfQVJDSAkJMHgwMDAwZmZmZgotCi0jZGVmaW5lIEVGQV9QQVJJU0NfMV8wCQkJMHgwMjBiCi0jZGVmaW5lIEVGQV9QQVJJU0NfMV8xCQkJMHgwMjEwCi0jZGVmaW5lIEVGQV9QQVJJU0NfMl8wCQkJMHgwMjE0Ci0KLS8qIFNwZWNpYWwgc2VjdGlvbiBpbmRpY2VzLiAgKi8KLS8qIEEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSB0ZW50YXRpdmUgZGVmaW5pdGlvbiBpbiBhbiBBTlNJIEMKLSAgIGNvbXBpbGF0aW9uLiAgKi8KLSNkZWZpbmUgU0hOX1BBUklTQ19BTlNJX0NPTU1PTiAJMHhmZjAwCi0KLS8qIEEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSBjb21tb24gYmxvY2sgdXNpbmcgdGhlCi0gICBodWdlIG1lbW9yeSBtb2RlbC4gICovCi0jZGVmaW5lIFNITl9QQVJJU0NfSFVHRV9DT01NT04JMHhmZjAxCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyBwcm9kdWN0IHNwZWNpZmljIGV4dGVuc2lvbiBiaXRzLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19FWFQJCTB4NzAwMDAwMDAKLQotLyogU2VjdGlvbiBjb250YWlucyB1bndpbmQgdGFibGUgZW50cmllcy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKLQotLyogU2VjdGlvbiBjb250YWlucyBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemVkIGNvZGUuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0RPQwkJMHg3MDAwMDAwMgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUgYW5ub3RhdGlvbnMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0FOTk9UCTB4NzAwMDAwMDMKLQotLyogVGhlc2UgYXJlIHN0cmljdGx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZGVyIGVsZjMyLWhwcGEKLSAgIGltcGxlbWVudGF0aW9uLiAgSG9wZWZ1bGx5IHdlIGNhbiBlbGltaW5hdGUgdGhlbSBpbiB0aGUgZnV0dXJlLiAgKi8KLS8qIE9wdGlvbmFsIHNlY3Rpb24gaG9sZGluZyBhcmd1bWVudCBsb2NhdGlvbi9yZWxvY2F0aW9uIGluZm8uICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX1NZTUVYVE4gICAgU0hUX0xPUFJPQys4Ci0KLS8qIE9wdGlvbiBzZWN0aW9uIGZvciBsaW5rZXIgc3R1YnMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX1NUVUJTICAgICAgU0hUX0xPUFJPQys5Ci0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyBjb2RlIGNvbXBpbGVkIGZvciBzdGF0aWMgYnJhbmNoIHByZWRpY3Rpb24uICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX1NCUAkJMHg4MDAwMDAwMAotCi0vKiBTZWN0aW9uIHNob3VsZCBiZSBhbGxvY2F0ZWQgZnJvbSBmcm9tIEdQLiAgKi8KLSNkZWZpbmUgU0hGX1BBUklTQ19IVUdFCQkweDQwMDAwMDAwCi0KLS8qIFNlY3Rpb24gc2hvdWxkIGdvIG5lYXIgR1AuICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX1NIT1JUCTB4MjAwMDAwMDAKLQotCi0vKiBJZGVudGlmaWVzIHRoZSBlbnRyeSBwb2ludCBvZiBhIG1pbGxpY29kZSByb3V0aW5lLiAgKi8KLSNkZWZpbmUgU1RUX1BBUklTQ19NSUxMSQkxMwotCi0vKiBFTEYvSFBQQSByZWxvY2F0aW9uIHR5cGVzICovCi0KLS8qIE5vdGU6IFBBLUVMRiBpcyBkZWZpbmVkIHRvIHVzZSBvbmx5IFJFTEEgcmVsb2NhdGlvbnMuICAqLwotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2hwcGFfcmVsb2NfdHlwZSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19OT05FLCAgICAgIDApCS8qIE5vIHJlbG9jICovCi0KLSAgICAgLyogVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBkbyBzaW1wbGUgYmFzZSArIG9mZnNldCByZWxvY2F0aW9ucy4gICovCi0KLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIzMiwgIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMjFMLCAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE3UiwgMykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxN0YsIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTRSLCA2KQotCi0gICAgLyogUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcwotICAgICAgIFR5cGljYWxseSB1c2VkIGZvciBjYWxscy4KLSAgICAgICBOb3RlIFBDUkVMMTdDIGFuZCBQQ1JFTDE3RiBkaWZmZXIgb25seSBpbiBvdmVyZmxvdyBoYW5kbGluZy4KLSAgICAgICBQQ1JFTDE3QyBuZXZlciByZXBvcnRzIGEgcmVsb2NhdGlvbiBlcnJvci4KLQotICAgICAgIFdoZW4gc3VwcG9ydGluZyBhcmd1bWVudCByZWxvY2F0aW9ucywgZnVuY3Rpb24gY2FsbHMgbXVzdCBiZQotICAgICAgIGFjY29tcGFuaWVkIGJ5IHBhcmFtZXRlciByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcwotICAgICAgIGNhcnJpZWQgaW4gdGhlIHRlbiBoaWdoLW9yZGVyIGJpdHMgb2YgdGhlIGFkZGVuZCBmaWVsZC4gIFRoZSByZW1haW5pbmcKLSAgICAgICAyMiBiaXRzIG9mIG9mIHRoZSBhZGRlbmQgZmllbGQgYXJlIHNpZ24tZXh0ZW5kZWQgdG8gZm9ybSB0aGUgQWRkZW5kLgotCi0gICAgICAgTm90ZSB0aGUgY29kZSB0byBidWlsZCBhcmd1bWVudCByZWxvY2F0aW9ucyBkZXBlbmRzIG9uIHRoZQotICAgICAgIGFkZGVuZCBiZWluZyB6ZXJvLiAgQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGxpbWl0YXRpb24gaXMgR0FTCi0gICAgICAgY2FuIG5vdCBwZXJmb3JtIHJlbG9jYXRpb24gcmVkdWN0aW9ucyBmb3IgZnVuY3Rpb24gc3ltYm9scy4gICovCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMzIsIDkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDIxTCwgMTApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE3UiwgMTEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE3RiwgMTIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE3QywgMTMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0UiwgMTQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0RiwgMTUpCi0KLSAgICAvKiBEUC1yZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMjFMLCAxOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMTRXUiwgMTkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19EUFJFTDE0RFIsIDIwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNFIsIDIyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNEYsIDIzKQotCi0gICAgLyogRGF0YSBsaW5rYWdlIHRhYmxlIChETFQpIHJlbG9jYXRpb24gdHlwZXMKLQotICAgICAgIFNPTSBETFRfUkVMIGZpeHVwIHJlcXVlc3RzIGFyZSB1c2VkIHRvIGZvciBzdGF0aWMgZGF0YSByZWZlcmVuY2VzCi0gICAgICAgZnJvbSBwb3NpdGlvbi1pbmRlcGVuZGVudCBjb2RlIHdpdGhpbiBzaGFyZWQgbGlicmFyaWVzLiAgVGhleSBhcmUKLSAgICAgICBzaW1pbGFyIHRvIHRoZSBHT1QgcmVsb2NhdGlvbiB0eXBlcyBpbiBzb21lIFNWUjQgaW1wbGVtZW50YXRpb25zLiAgKi8KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMjFMLCAyNikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0UiwgMzApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNEYsIDMxKQotCi0gICAgLyogRExUIGluZGlyZWN0IHJlbG9jYXRpb24gdHlwZXMgICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQyMUwsIDM0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTRSLCAzOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0RiwgMzkpCi0KLSAgICAvKiBCYXNlIHJlbGF0aXZlIHJlbG9jYXRpb24gdHlwZXMuICBVZ2guICBUaGVzZSBpbXBseSBsb3RzIG9mIHN0YXRlICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRVRCQVNFLCA0MCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFQ1JFTDMyLCA0MSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwyMUwsIDQyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE3UiwgNDMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTdGLCA0NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxNFIsIDQ2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE0RiwgNDcpCi0KLSAgICAvKiBTZWdtZW50IHJlbGF0aXZlIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VHQkFTRSwgNDgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUdSRUwzMiwgNDkpCi0KLSAgICAvKiBPZmZzZXRzIGZyb20gdGhlIFBMVC4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYyMUwsIDUwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTRSLCA1NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE0RiwgNTUpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIzMiwgNTcpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMjFMLCA1OCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIsIDYyKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19GUFRSNjQsIDY0KQotCi0gICAgLyogUGxhYmVsIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExBQkVMMzIsIDY1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExBQkVMMjFMLCA2NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMQUJFTDE0UiwgNzApCi0KLSAgICAvKiBQQ1JFTCByZWxvY2F0aW9ucy4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDY0LCA3MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMjJDLCA3MykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMjJGLCA3NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTRXUiwgNzUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0RFIsIDc2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNkYsIDc3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNldGLCA3OCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTZERiwgNzkpCi0KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSNjQsIDgwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSNjRXUiwgODEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVI2NERSLCA4MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE0V1IsIDgzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTREUiwgODQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNkYsIDg1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTZXRiwgODYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNkRGLCA4NykKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUw2NCwgODgpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0V1IsIDkxKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMTREUiwgOTIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19HUFJFTDE2RiwgOTMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19HUFJFTDE2V0YsIDk0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUwxNkRGLCA5NSkKLQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRjY0LCA5NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0V1IsIDk5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTREUiwgMTAwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkYxNkYsIDEwMSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGMTZXRiwgMTAyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkYxNkRGLCAxMDMpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFQ1JFTDY0LCAxMDQpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxNFdSLCAxMDcpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTREUiwgMTA4KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUdSRUw2NCwgMTEyKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNFdSLCAxMTUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNERSLCAxMTYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNkYsIDExNykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE2V0YsIDExOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE2REYsIDExOSkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjY0LCAxMjApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTRXUiwgMTIzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIsIDEyNCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYsIDEyNSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGLCAxMjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTZERiwgMTI3KQotCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0NPUFksIDEyOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0lQTFQsIDEyOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0VQTFQsIDEzMCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwzMiwgMTUzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwyMUwsIDE1NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTRSLCAxNTgpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMjFMLCAxNjIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE0UiwgMTY2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNEYsIDE2NykKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUw2NCwgMjE2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNFdSLCAyMTkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDE0RFIsIDIyMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTZGLCAyMjEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDE2V0YsIDIyMikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTZERiwgMjIzKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDY0LCAyMjQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE0V1IsIDIyNykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTREUiwgMjI4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNkYsIDIyOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTZXRiwgMjMwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNkRGLCAyMzEpCi0gICAgRU1QVFlfUkVMT0MgKFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jaWZuZGVmIFJFTE9DX01BQ1JPU19HRU5fRlVOQwotdHlwZWRlZiBlbnVtIGVsZl9ocHBhX3JlbG9jX3R5cGUgZWxmX2hwcGFfcmVsb2NfdHlwZTsKLSNlbmRpZgotCi0jZGVmaW5lIFBUX1BBUklTQ19BUkNIRVhUCTB4NzAwMDAwMDAKLSNkZWZpbmUgUFRfUEFSSVNDX1VOV0lORAkweDcwMDAwMDAxCi0jZGVmaW5lIFBGX1BBUklTQ19TQlAJCTB4MDgwMDAwMDAKLSNkZWZpbmUgUEZfSFBfUEFHRV9TSVpFCQkweDAwMTAwMDAwCi0jZGVmaW5lIFBGX0hQX0ZBUl9TSEFSRUQJMHgwMDIwMDAwMAotI2RlZmluZSBQRl9IUF9ORUFSX1NIQVJFRAkweDAwNDAwMDAwCi0jZGVmaW5lIFBGX0hQX0NPREUJCTB4MDEwMDAwMDAKLSNkZWZpbmUgUEZfSFBfTU9ESUZZCQkweDAyMDAwMDAwCi0jZGVmaW5lIFBGX0hQX0xBWllTV0FQCQkweDA0MDAwMDAwCi0jZGVmaW5lIFBGX0hQX1NCUAkJMHgwODAwMDAwMAotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZHluYW1pYyBhcnJheSB0YWdzLiAgKi8KLQotI2RlZmluZSBEVF9IUF9MT0FEX01BUAkJKERUX0xPT1MgKyAweDApCi0jZGVmaW5lIERUX0hQX0RMRF9GTEFHUwkJKERUX0xPT1MgKyAweDEpCi0jZGVmaW5lIERUX0hQX0RMRF9IT09LCQkoRFRfTE9PUyArIDB4MikKLSNkZWZpbmUgRFRfSFBfVVgxMF9JTklUCQkoRFRfTE9PUyArIDB4MykKLSNkZWZpbmUgRFRfSFBfVVgxMF9JTklUU1oJKERUX0xPT1MgKyAweDQpCi0jZGVmaW5lIERUX0hQX1BSRUlOSVQJCShEVF9MT09TICsgMHg1KQotI2RlZmluZSBEVF9IUF9QUkVJTklUU1oJCShEVF9MT09TICsgMHg2KQotI2RlZmluZSBEVF9IUF9ORUVERUQJCShEVF9MT09TICsgMHg3KQotI2RlZmluZSBEVF9IUF9USU1FX1NUQU1QCShEVF9MT09TICsgMHg4KQotI2RlZmluZSBEVF9IUF9DSEVDS1NVTQkJKERUX0xPT1MgKyAweDkpCi0jZGVmaW5lIERUX0hQX0dTVF9TSVpFCQkoRFRfTE9PUyArIDB4YSkKLSNkZWZpbmUgRFRfSFBfR1NUX1ZFUlNJT04JKERUX0xPT1MgKyAweGIpCi0jZGVmaW5lIERUX0hQX0dTVF9IQVNIVkFMCShEVF9MT09TICsgMHhjKQotCi0vKiBWYWx1ZXMgZm9yIERUX0hQX0RMRF9GTEFHUy4gICovCi0jZGVmaW5lIERUX0hQX0RFQlVHX1BSSVZBVEUJCTB4MDAwMSAvKiBNYXAgdGV4dCBwcml2YXRlICovCi0jZGVmaW5lIERUX0hQX0RFQlVHX0NBTExCQUNLCQkweDAwMDIgLyogQ2FsbGJhY2sgKi8KLSNkZWZpbmUgRFRfSFBfREVCVUdfQ0FMTEJBQ0tfQk9SCTB4MDAwNCAvKiBCT1IgY2FsbGJhY2sgKi8KLSNkZWZpbmUgRFRfSFBfTk9fRU5WVkFSCQkJMHgwMDA4IC8qIE5vIGVudiB2YXIgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9OT1cJCQkweDAwMTAgLyogQmluZCBub3cgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9OT05GQVRBTAkJMHgwMDIwIC8qIEJpbmQgbm9uLWZhdGFsICovCi0jZGVmaW5lIERUX0hQX0JJTkRfVkVSQk9TRQkJMHgwMDQwIC8qIEJpbmQgdmVyYm9zZSAqLwotI2RlZmluZSBEVF9IUF9CSU5EX1JFU1RSSUNURUQJCTB4MDA4MCAvKiBCaW5kIHJlc3RyaWN0ZWQgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9TWU1CT0xJQwkJMHgwMTAwIC8qIEJpbmQgc3ltYm9saWMgKi8KLSNkZWZpbmUgRFRfSFBfUlBBVEhfRklSU1QJCTB4MDIwMCAvKiBSUEFUSCBmaXJzdCAqLwotI2RlZmluZSBEVF9IUF9CSU5EX0RFUFRIX0ZJUlNUCQkweDA0MDAgLyogQmluZCBkZXB0aC1maXJzdCAqLwotCi0vKiBQcm9ncmFtIGhlYWRlciBleHRlbnNpb25zLiAgKi8KLSNkZWZpbmUgUFRfSFBfVExTCQkoUFRfTE9PUyArIDB4MCkKLSNkZWZpbmUgUFRfSFBfQ09SRV9OT05FCQkoUFRfTE9PUyArIDB4MSkKLSNkZWZpbmUgUFRfSFBfQ09SRV9WRVJTSU9OCShQVF9MT09TICsgMHgyKQotI2RlZmluZSBQVF9IUF9DT1JFX0tFUk5FTAkoUFRfTE9PUyArIDB4MykKLSNkZWZpbmUgUFRfSFBfQ09SRV9DT01NCQkoUFRfTE9PUyArIDB4NCkKLSNkZWZpbmUgUFRfSFBfQ09SRV9QUk9DCQkoUFRfTE9PUyArIDB4NSkKLSNkZWZpbmUgUFRfSFBfQ09SRV9MT0FEQUJMRQkoUFRfTE9PUyArIDB4NikKLSNkZWZpbmUgUFRfSFBfQ09SRV9TVEFDSwkoUFRfTE9PUyArIDB4NykKLSNkZWZpbmUgUFRfSFBfQ09SRV9TSE0JCShQVF9MT09TICsgMHg4KQotI2RlZmluZSBQVF9IUF9DT1JFX01NRgkJKFBUX0xPT1MgKyAweDkpCi0jZGVmaW5lIFBUX0hQX1BBUkFMTEVMCQkoUFRfTE9PUyArIDB4MTApCi0jZGVmaW5lIFBUX0hQX0ZBU1RCSU5ECQkoUFRfTE9PUyArIDB4MTEpCi0KLS8qIEFkZGl0aW9uYWwgc3ltYm9sIHR5cGVzLiAgKi8KLSNkZWZpbmUgU1RUX0hQX09QQVFVRQkJKFNUVF9MT09TICsgMHgxKQotI2RlZmluZSBTVFRfSFBfU1RVQgkJKFNUVF9MT09TICsgMHgyKQotCi0jZW5kaWYgLyogX0VMRl9IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2kzNzAuaCBiL2luY2x1ZGUvZWxmL2kzNzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwMjFmMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9pMzcwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBpMzcwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBpMzcwIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX0kzNzBfSAotI2RlZmluZSBfRUxGX0kzNzBfSAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBoZWFkZXJzLCBzaF90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUgU0hUX09SREVSRUQJCVNIVF9ISVBST0MJLyogTGluayBlZGl0b3IgaXMgdG8gc29ydCB0aGUgXAotCQkJCQkJICAgZW50cmllcyBpbiB0aGlzIHNlY3Rpb24gXAotCQkJCQkJICAgYmFzZWQgb24gdGhlIGFkZHJlc3MgXAotCQkJCQkJICAgc3BlY2lmaWVkIGluIHRoZSBhc3NvY2lhdGVkIFwKLQkJCQkJCSAgIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0KLSNkZWZpbmUJRUZfSTM3MF9SRUxPQ0FUQUJMRQkweDAwMDEwMDAwCS8qIGkzNzAgLW1yZWxvY2F0YWJsZSBmbGFnICovCi0jZGVmaW5lCUVGX0kzNzBfUkVMT0NBVEFCTEVfTElCCTB4MDAwMDgwMDAJLyogaTM3MCAtbXJlbG9jYXRhYmxlLWxpYiBmbGFnICovCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncywgc2hfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBTSEZfRVhDTFVERQkJMHg4MDAwMDAwMAkvKiBMaW5rIGVkaXRvciBpcyB0byBleGNsdWRlIFwKLQkJCQkJCSAgIHRoaXMgc2VjdGlvbiBmcm9tIGV4ZWN1dGFibGUgXAotCQkJCQkJICAgYW5kIHNoYXJlZCBvYmplY3RzIHRoYXQgaXQgXAotCQkJCQkJICAgYnVpbGRzIHdoZW4gdGhvc2Ugb2JqZWN0cyBcCi0JCQkJCQkgICBhcmUgbm90IHRvIGJlIGZ1cmh0ZXIgXAotCQkJCQkJICAgcmVsb2NhdGVkLiAgKi8KLSNlbmRpZiAvKiBfRUxGX0kzNzBfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2kzODYuaCBiL2luY2x1ZGUvZWxmL2kzODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4NjY2MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBpeDg2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0kzODZfSAotI2RlZmluZSBfRUxGX0kzODZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTM4Nl9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X05PTkUsICAgICAgMCkJLyogTm8gcmVsb2MgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8zMiwgICAgICAgIDEpCS8qIERpcmVjdCAzMiBiaXQgICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMzMiwgICAgICAyKQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HT1QzMiwgICAgIDMpCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9QTFQzMiwJICAgIDQpCS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0NPUFksCSAgICA1KQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR0xPQl9EQVQsICA2KQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfSlVNUF9TTE9ULCA3KQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUkVMQVRJVkUsICA4KQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR09UT0ZGLCAgICA5KQkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dPVFBDLCAgICAxMCkJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgICAgRkFLRV9SRUxPQyAgIChGSVJTVF9JTlZBTElEX1JFTE9DLCAxMSkKLSAgICAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MsICAxOSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8xNiwgICAgICAgMjApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMxNiwgICAgIDIxKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2XzgsCSAgIDIyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BDOCwgICAgICAyMykKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9tYXgsCSAgIDI0KQotICAgICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HTlVfVlRJTkhFUklULCAyNTApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR05VX1ZURU5UUlksIDI1MSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaTk2MC5oIGIvaW5jbHVkZS9lbGYvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTYwMjg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2k5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEludGVsIDk2MCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9JOTYwX0gKLSNkZWZpbmUgX0VMRl9JOTYwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTk2MF9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX05PTkUsCSAgICAwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwXzEyLAkgICAgMSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF8zMiwJICAgIDIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfSVAyNCwJICAgIDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfU1VCLAkgICAgNCkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF9PUFRDQUxMLCAgIDUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfT1BUQ0FMTFgsICA2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX09QVENBTExYQSwgNykKLSAgICAgRU1QVFlfUkVMT0MgKFJfOTYwX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0k5NjBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaCBiL2luY2x1ZGUvZWxmL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjgxYTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IEVMRiBpcyByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGluIHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgRUxGLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBlbGYtY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0KLS8qIE5PVEUgdGhhdCB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSBub3Qga2VwdCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFwcGVhcgotICAgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gc29tZSBjYXNlcyB0aGV5J3ZlIGJlZW4gcmVvcmRlcmVkIGZvciBtb3JlIG9wdGltYWwKLSAgIHBhY2tpbmcgdW5kZXIgdmFyaW91cyBjaXJjdW1zdGFuY2VzLiAgKi8KLQotI2lmbmRlZiBfRUxGX0lOVEVSTkFMX0gKLSNkZWZpbmUgX0VMRl9JTlRFUk5BTF9ICi0KLS8qIEVMRiBIZWFkZXIgKi8KLQotI2RlZmluZSBFSV9OSURFTlQJMTYJCS8qIFNpemUgb2YgZV9pZGVudFtdICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9laGRyIHsKLSAgdW5zaWduZWQgY2hhcgkJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBFTEYgIm1hZ2ljIG51bWJlciIgKi8KLSAgYmZkX3ZtYQkJZV9lbnRyeTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICBiZmRfc2l6ZV90eXBlCQllX3Bob2ZmOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgYmZkX3NpemVfdHlwZQkJZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGxvbmcJCWVfdmVyc2lvbjsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICB1bnNpZ25lZCBsb25nCQllX2ZsYWdzOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCi0gIHVuc2lnbmVkIHNob3J0CWVfdHlwZTsJCQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHR5cGUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9tYWNoaW5lOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX2Voc2l6ZTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBzaG9ydAllX3BoZW50c2l6ZTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9waG51bTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIHNob3J0CWVfc2hlbnRzaXplOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX3NobnVtOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9zaHN0cm5keDsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGZfSW50ZXJuYWxfRWhkcjsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9laGRyIGVsZl9pbnRlcm5hbF9laGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX0VoZHIgRWxmX0ludGVybmFsX0VoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZWhkciBlbGZfaW50ZXJuYWxfZWhkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9FaGRyIEVsZl9JbnRlcm5hbF9FaGRyCi0KLS8qIFByb2dyYW0gaGVhZGVyICovCi0KLXN0cnVjdCBlbGZfaW50ZXJuYWxfcGhkciB7Ci0gIHVuc2lnbmVkIGxvbmcJcF90eXBlOwkJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KLSAgdW5zaWduZWQgbG9uZwlwX2ZsYWdzOwkJLyogU2VnbWVudCBmbGFncyAqLwotICBiZmRfdm1hCXBfb2Zmc2V0OwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICBiZmRfdm1hCXBfdmFkZHI7CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICBiZmRfdm1hCXBfcGFkZHI7CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgYmZkX3ZtYQlwX2ZpbGVzejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIGJmZF92bWEJcF9tZW1zejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgYmZkX3ZtYQlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9waGRyIEVsZl9JbnRlcm5hbF9QaGRyOwotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9waGRyIGVsZl9pbnRlcm5hbF9waGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1BoZHIgRWxmX0ludGVybmFsX1BoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcGhkciBlbGZfaW50ZXJuYWxfcGhkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9QaGRyIEVsZl9JbnRlcm5hbF9QaGRyCi0KLS8qIFNlY3Rpb24gaGVhZGVyICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyIHsKLSAgdW5zaWduZWQgaW50CXNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgaW50CXNoX3R5cGU7CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgYmZkX3ZtYQlzaF9mbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIGJmZF92bWEJc2hfYWRkcjsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICBiZmRfc2l6ZV90eXBlCXNoX3NpemU7CQkvKiBTaXplIG9mIHNlY3Rpb24gaW4gYnl0ZXMgKi8KLSAgYmZkX3NpemVfdHlwZQlzaF9lbnRzaXplOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCi0gIHVuc2lnbmVkIGxvbmcJc2hfbGluazsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBsb25nCXNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgZmlsZV9wdHIJc2hfb2Zmc2V0OwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBpbnQJc2hfYWRkcmFsaWduOwkJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KLQotICAvKiBUaGUgaW50ZXJuYWwgcmVwIGFsc28gaGFzIHNvbWUgY2FjaGVkIGluZm8gYXNzb2NpYXRlZCB3aXRoIGl0LiAqLwotICBhc2VjdGlvbiAqCWJmZF9zZWN0aW9uOwkJLyogQXNzb2NpYXRlZCBCRkQgc2VjdGlvbi4gICovCi0gIFBUUgkJY29udGVudHM7CQkvKiBTZWN0aW9uIGNvbnRlbnRzLiAgKi8KLX0gRWxmX0ludGVybmFsX1NoZHI7Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc2hkciBlbGZfaW50ZXJuYWxfc2hkcgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TaGRyIEVsZl9JbnRlcm5hbF9TaGRyCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3NoZHIgZWxmX2ludGVybmFsX3NoZHIKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU2hkciBFbGZfSW50ZXJuYWxfU2hkcgotCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zeW0gewotICBiZmRfdm1hCXN0X3ZhbHVlOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLwotICBiZmRfdm1hCXN0X3NpemU7CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcJc3RfbmFtZTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIHNob3J0IHN0X3NobmR4OwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfc3ltIEVsZl9JbnRlcm5hbF9TeW07Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KLQotLyogTm90ZSBzZWdtZW50cyAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfbm90ZSB7Ci0gIHVuc2lnbmVkIGxvbmcJbmFtZXN6OwkJCS8qIFNpemUgb2YgZW50cnkncyBvd25lciBzdHJpbmcgKi8KLSAgdW5zaWduZWQgbG9uZwlkZXNjc3o7CQkJLyogU2l6ZSBvZiB0aGUgbm90ZSBkZXNjcmlwdG9yICovCi0gIHVuc2lnbmVkIGxvbmcJdHlwZTsJCQkvKiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgZGVzY3JpcHRvciAqLwotICBjaGFyICoJbmFtZWRhdGE7CQkvKiBTdGFydCBvZiB0aGUgbmFtZStkZXNjIGRhdGEgKi8KLSAgY2hhciAqCWRlc2NkYXRhOwkJLyogU3RhcnQgb2YgdGhlIGRlc2MgZGF0YSAqLwotICBiZmRfdm1hCWRlc2Nwb3M7CQkvKiBGaWxlIG9mZnNldCBvZiB0aGUgZGVzY2RhdGEgKi8KLX0gRWxmX0ludGVybmFsX05vdGU7Ci0jZGVmaW5lIEVsZjMyX0ludGVybmFsX05vdGUJRWxmX0ludGVybmFsX05vdGUKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfbm90ZQllbGZfaW50ZXJuYWxfbm90ZQotCi0vKiBSZWxvY2F0aW9uIEVudHJpZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3JlbCB7Ci0gIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLwotICBiZmRfdm1hCXJfaW5mbzsJCS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmX0ludGVybmFsX1JlbDsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfcmVsYSB7Ci0gIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgYmZkX3ZtYQlyX2luZm87CQkvKiBJbmRleCBhbmQgVHlwZSBvZiByZWxvY2F0aW9uICovCi0gIGJmZF9zaWduZWRfdm1hIHJfYWRkZW5kOwkvKiBDb25zdGFudCBhZGRlbmQgdXNlZCB0byBjb21wdXRlIHZhbHVlICovCi19IEVsZl9JbnRlcm5hbF9SZWxhOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3JlbGEgZWxmX2ludGVybmFsX3JlbGEKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcmVsYSBlbGZfaW50ZXJuYWxfcmVsYQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWxhIEVsZl9JbnRlcm5hbF9SZWxhCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1JlbGEgRWxmX0ludGVybmFsX1JlbGEKLQotLyogZHluYW1pYyBzZWN0aW9uIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfZHluIHsKLSAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLwotICBiZmRfdm1hIGRfdGFnOwkJLyogZW50cnkgdGFnIHZhbHVlICovCi0gIHVuaW9uIHsKLSAgICAvKiBUaGlzIG5lZWRzIHRvIHN1cHBvcnQgNjQtYml0IHZhbHVlcyBpbiBlbGY2NC4gICovCi0gICAgYmZkX3ZtYQlkX3ZhbDsKLSAgICBiZmRfdm1hCWRfcHRyOwotICB9IGRfdW47Ci19IEVsZl9JbnRlcm5hbF9EeW47Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGVmIHsKLSAgdW5zaWduZWQgc2hvcnQgdmRfdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfZmxhZ3M7CS8qIEZsYWdzIChWRVJfRkxHXyopLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfbmR4OwkvKiBWZXJzaW9uIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfY250OwkvKiBOdW1iZXIgb2YgdmVyZGF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfaGFzaDsJLyogSGFzaCBvZiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfYXV4OwkvKiBPZmZzZXQgdG8gdmVyZGF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfbmV4dDsJLyogT2Zmc2V0IHRvIG5leHQgdmVyZGVmLiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgYmZkCQkJICAgICAgKnZkX2JmZDsJCS8qIEJGRC4gICovCi0gIGNvbnN0IGNoYXIJCSAgICAgICp2ZF9ub2RlbmFtZTsJLyogVmVyc2lvbiBuYW1lLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkZWYgICp2ZF9uZXh0ZGVmOwkvKiB2ZF9uZXh0IGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkX2F1eHB0cjsJLyogdmRfYXV4IGFzIHBvaW50ZXIuICAqLwotICB1bnNpZ25lZCBpbnQJCSAgICAgICB2ZF9leHBfcmVmbm87CS8qIFVzZWQgYnkgdGhlIGxpbmtlci4gICovCi19IEVsZl9JbnRlcm5hbF9WZXJkZWY7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggewotICB1bnNpZ25lZCBsb25nIHZkYV9uYW1lOwkvKiBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nIHZkYV9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJkYXV4LiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgY29uc3QgY2hhciAqdmRhX25vZGVuYW1lOwkJCS8qIHZkYV9uYW1lIGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkYV9uZXh0cHRyOwkvKiB2ZGFfbmV4dCBhcyBwb2ludGVyLiAgKi8KLX0gRWxmX0ludGVybmFsX1ZlcmRhdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuZWVkIHsKLSAgdW5zaWduZWQgc2hvcnQgdm5fdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5fY250OwkvKiBOdW1iZXIgb2YgdmVybmF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5fZmlsZTsJLyogU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBsaWJyYXJ5IG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9hdXg7CS8qIE9mZnNldCB0byB2ZXJuYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJuZWVkLiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgYmZkCQkJICAgICAgKnZuX2JmZDsJCS8qIEJGRC4gICovCi0gIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqdm5fZmlsZW5hbWU7CS8qIHZuX2ZpbGUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5fYXV4cHRyOwkvKiB2bl9hdXggYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmVlZCAqdm5fbmV4dHJlZjsJLyogdm5fbmV4dHJlZiBhcyBwb2ludGVyLiAgKi8KLX0gRWxmX0ludGVybmFsX1Zlcm5lZWQ7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuYXV4IHsKLSAgdW5zaWduZWQgbG9uZwkgdm5hX2hhc2g7CS8qIEhhc2ggb2YgZGVwZW5kZW5jeSBuYW1lLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5hX2ZsYWdzOwkvKiBGbGFncyAoVkVSX0ZMR18qKS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZuYV9vdGhlcjsJLyogVW51c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5hX25hbWU7CS8qIFN0cmluZyB0YWJsZSBvZmZzZXQgdG8gdmVyc2lvbiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5hX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcm5hdXguICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnZuYV9ub2RlbmFtZTsJLyogdm5hX25hbWUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5hX25leHRwdHI7CS8qIHZuYV9uZXh0IGFzIHBvaW50ZXIuICAqLwotfSBFbGZfSW50ZXJuYWxfVmVybmF1eDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyc3ltIHNlY3Rpb24uICBUaGlzIGlzIG5vdCBhCi0gICBzdGFuZGFyZCBFTEYgc3RydWN0dXJlOyBFTEYganVzdCB1c2VzIEVsZjMyX0hhbGYuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyc3ltIHsKLSAgdW5zaWduZWQgc2hvcnQgdnNfdmVyczsKLX0gRWxmX0ludGVybmFsX1ZlcnN5bTsKLQotLyogU3RydWN0dXJlIGZvciBzeW1pbmZvIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgc2hvcnQgaW50IAlzaV9ib3VuZHRvOwotICB1bnNpZ25lZCBzaG9ydCBpbnQJc2lfZmxhZ3M7Ci19IEVsZl9JbnRlcm5hbF9TeW1pbmZvOwotCi0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGF1eCBlbGZfaW50ZXJuYWxfdmVyZGF1eAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJkYXV4IGVsZl9pbnRlcm5hbF92ZXJkYXV4Ci0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3Zlcm5lZWQgZWxmX2ludGVybmFsX3Zlcm5lZWQKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVybmVlZCBlbGZfaW50ZXJuYWxfdmVybmVlZAotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJuYXV4IGVsZl9pbnRlcm5hbF92ZXJuYXV4Ci0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3Zlcm5hdXggZWxmX2ludGVybmFsX3Zlcm5hdXgKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KLQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkYXV4IEVsZl9JbnRlcm5hbF9WZXJkYXV4Ci0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1ZlcmRhdXggRWxmX0ludGVybmFsX1ZlcmRhdXgKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVybmVlZCBFbGZfSW50ZXJuYWxfVmVybmVlZAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJuZWVkIEVsZl9JbnRlcm5hbF9WZXJuZWVkCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1Zlcm5hdXggRWxmX0ludGVybmFsX1Zlcm5hdXgKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVybmF1eCBFbGZfSW50ZXJuYWxfVmVybmF1eAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvIEVsZl9JbnRlcm5hbF9TeW1pbmZvCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1N5bWluZm8gRWxmX0ludGVybmFsX1N5bWluZm8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSBob3cgc2VjdGlvbnMgc2hvdWxkIGJlIGFzc2lnbmVkCi0gICB0byBwcm9ncmFtIHNlZ21lbnRzLiAgKi8KLQotc3RydWN0IGVsZl9zZWdtZW50X21hcAotewotICAvKiBOZXh0IHByb2dyYW0gc2VnbWVudC4gICovCi0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm5leHQ7Ci0gIC8qIFByb2dyYW0gc2VnbWVudCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwX3R5cGU7Ci0gIC8qIFByb2dyYW0gc2VnbWVudCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgcF9mbGFnczsKLSAgLyogUHJvZ3JhbSBzZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MuICAqLwotICBiZmRfdm1hIHBfcGFkZHI7Ci0gIC8qIFdoZXRoZXIgdGhlIHBfZmxhZ3MgZmllbGQgaXMgdmFsaWQ7IGlmIG5vdCwgdGhlIGZsYWdzIGFyZSBiYXNlZAotICAgICBvbiB0aGUgc2VjdGlvbiBmbGFncy4gICovCi0gIHVuc2lnbmVkIGludCBwX2ZsYWdzX3ZhbGlkIDogMTsKLSAgLyogV2hldGhlciB0aGUgcF9wYWRkciBmaWVsZCBpcyB2YWxpZDsgaWYgbm90LCB0aGUgcGh5c2ljYWwgYWRkcmVzcwotICAgICBpcyBiYXNlZCBvbiB0aGUgc2VjdGlvbiBsbWEgdmFsdWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHBfcGFkZHJfdmFsaWQgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgc2VnbWVudCBpbmNsdWRlcyB0aGUgZmlsZSBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfZmlsZWhkciA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzZWdtZW50IGluY2x1ZGVzIHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfcGhkcnMgOiAxOwotICAvKiBOdW1iZXIgb2Ygc2VjdGlvbnMgKG1heSBiZSAwKS4gICovCi0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgLyogU2VjdGlvbnMuICBBY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGlzIGluIGNvdW50IGZpZWxkLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb25zWzFdOwotfTsKLQotI2VuZGlmIC8qIF9FTEZfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbTMyci5oIGIvaW5jbHVkZS9lbGYvbTMyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTJhZTE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL20zMnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIE0zMlIgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfTTMyUl9ICi0jZGVmaW5lIF9FTEZfTTMyUl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tMzJyX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzE2LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8zMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMjQsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzEwX1BDUkVMLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8xOF9QQ1JFTCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMjZfUENSRUwsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0hJMTZfVUxPLCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9ISTE2X1NMTywgOCkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfTE8xNiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfU0RBMTYsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9HTlVfVlRJTkhFUklULCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfR05VX1ZURU5UUlksIDEyKQotICBFTVBUWV9SRUxPQyAgKFJfTTMyUl9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIFNtYWxsIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fTTMyUl9TQ09NTU9OCTB4ZmYwMAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncy4gICovCi0KLS8qIFRoaXMgc2VjdGlvbiBjb250YWlucyBzdWZmaWNpZW50IHJlbG9jcyB0byBiZSByZWxheGVkLgotICAgV2hlbiByZWxheGluZywgZXZlbiByZWxvY3Mgb2YgYnJhbmNoIGluc3RydWN0aW9ucyB0aGUgYXNzZW1ibGVyIGNvdWxkCi0gICBjb21wbGV0ZSBtdXN0IGJlIHByZXNlbnQgYmVjYXVzZSByZWxheGluZyBtYXkgY2F1c2UgdGhlIGJyYW5jaCB0YXJnZXQgdG8KLSAgIG1vdmUuICAqLwotI2RlZmluZSBTSEZfTTMyUl9DQU5fUkVMQVgJMHgxMDAwMDAwMAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBUd28gYml0IG0zMnIgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfTTMyUl9BUkNICQkweDMwMDAwMDAwCi0KLS8qIG0zMnIgY29kZS4gICovCi0jZGVmaW5lIEVfTTMyUl9BUkNICQkweDAwMDAwMDAwCi0vKiBtMzJyeCBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NMzJSWF9BUkNICQkweDEwMDAwMDAwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbTY4ay5oIGIvaW5jbHVkZS9lbGYvbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQ1MWVmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL202OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIE1DNjhrIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX002OEtfSAotI2RlZmluZSBfRUxGX002OEtfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tNjhrX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfTk9ORSwgMCkJCS8qIE5vIHJlbG9jICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfMzIsIDEpCQkvKiBEaXJlY3QgMzIgYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLXzE2LCAyKQkJLyogRGlyZWN0IDE2IGJpdCAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S184LCAzKQkJLyogRGlyZWN0IDggYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BDMzIsIDQpCQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QQzE2LCA1KQkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUEM4LCA2KQkJLyogUEMgcmVsYXRpdmUgOCBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QzMiwgNykJCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QxNiwgOCkJCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1Q4LCA5KQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UMzJPLCAxMCkJLyogMzIgYml0IEdPVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QxNk8sIDExKQkvKiAxNiBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDhPLCAxMikJLyogOCBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDMyLCAxMykJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMTYsIDE0KQkvKiAxNiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQ4LCAxNSkJCS8qIDggYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMzJPLCAxNikJLyogMzIgYml0IFBMVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQxNk8sIDE3KQkvKiAxNiBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDhPLCAxOCkJLyogOCBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0NPUFksIDE5KQkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dMT0JfREFULCAyMCkJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0pNUF9TTE9ULCAyMSkJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1JFTEFUSVZFLCAyMikJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HTlVfVlRJTkhFUklULCAyMykKLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HTlVfVlRFTlRSWSwgMjQpCi0gIEVNUFRZX1JFTE9DICAoUl82OEtfbWF4KSAgIAotRU5EX1JFTE9DX05VTUJFUlMKLQotI2RlZmluZSBFRl9DUFUzMiAgICAweDAwODEwMDAwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbWNvcmUuaCBiL2luY2x1ZGUvZWxmL21jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTg4YzkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIE1vdG9yb2xhIE1Db3JlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1Db3JlIEVMRiBBQkkuICovCi0jaWZuZGVmIF9FTEZfTU9SRV9ICi0jZGVmaW5lIF9FTEZfTU9SRV9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tY29yZV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0FERFIzMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSU1NOEJZNCwgMikKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSU1NMTFCWTIsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTTRCWTIsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTDMyLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfR05VX1ZURU5UUlksIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9SRUxBVElWRSwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0NPUFksIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfR0xPQl9EQVQsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfSlVNUF9TTE9ULCAxMikKLSAgRU1QVFlfUkVMT0MgIChSX01DT1JFX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIFNlY3Rpb24gQXR0cmlidXRlcy4gICovCi0jZGVmaW5lIFNIRl9NQ09SRV9OT1JFQUQJMHg4MDAwMDAwMAotCi0jZW5kaWYgLyogX0VMRl9NQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9taXBzLmggYi9pbmNsdWRlL2VsZi9taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMmE5ZjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAwICswLDAgQEAKLS8qIE1JUFMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIDxpYW5AY3lnbnVzLmNvbT4sIGZyb20KLSAgIGluZm9ybWF0aW9uIGluIHRoZSBTeXN0ZW0gViBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlLCBNSVBTCi0gICBQcm9jZXNzb3IgU3VwcGxlbWVudC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1JUFMgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfTUlQU19ICi0jZGVmaW5lIF9FTEZfTUlQU19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21pcHNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfMTYsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTXzMyLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19SRUwzMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfMjYsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0hJMTYsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0xPMTYsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dQUkVMMTYsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0xJVEVSQUwsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVDE2LCA5KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19QQzE2LCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfQ0FMTDE2LCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR1BSRUwzMiwgMTIpCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBkZWZpbmVkIG9uIElyaXgsIGFsdGhvdWdoIHRoZXkgYXJlIG5vdAotICAgICBpbiB0aGUgTUlQUyBFTEYgQUJJLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfVU5VU0VEMSwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1VOVVNFRDIsIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19VTlVTRUQzLCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfU0hJRlQ1LCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfU0hJRlQ2LCAxNykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfNjQsIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfRElTUCwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9QQUdFLCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX09GU1QsIDIxKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfSEkxNiwgMjIpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9MTzE2LCAyMykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfU1VCLCAyNCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSU5TRVJUX0EsIDI1KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19JTlNFUlRfQiwgMjYpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0RFTEVURSwgMjcpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0hJR0hFUiwgMjgpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0hJR0hFU1QsIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19DQUxMX0hJMTYsIDMwKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19DQUxMX0xPMTYsIDMxKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19TQ05fRElTUCwgMzIpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1JFTDE2LCAzMykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfQUREX0lNTUVESUFURSwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1BKVU1QLCAzNSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUkVMR09ULCAzNikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSkFMUiwgMzcpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX21heCwgMzgpCi0gIC8qIFRoZXNlIHJlbG9jcyBhcmUgdXNlZCBmb3IgdGhlIG1pcHMxNi4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTMTZfMjYsIDEwMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFMxNl9HUFJFTCwgMTAxKQotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gaGFuZGxlIGVtYmVkZGVkLXBpYy4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1BDMzIsIDI0OCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUEM2NCwgMjQ5KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HTlVfUkVMMTZfUzIsIDI1MCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR05VX1JFTF9MTzE2LCAyNTEpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dOVV9SRUxfSEkxNiwgMjUyKQotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR05VX1ZUSU5IRVJJVCwgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HTlVfVlRFTlRSWSwgMjU0KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogQXQgbGVhc3Qgb25lIC5ub3Jlb3JkZXIgZGlyZWN0aXZlIGFwcGVhcnMgaW4gdGhlIHNvdXJjZS4gICovCi0jZGVmaW5lIEVGX01JUFNfTk9SRU9SREVSCTB4MDAwMDAwMDEKLQotLyogRmlsZSBjb250YWlucyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19QSUMJCTB4MDAwMDAwMDIKLQotLyogQ29kZSBpbiBmaWxlIHVzZXMgdGhlIHN0YW5kYXJkIGNhbGxpbmcgc2VxdWVuY2UgZm9yIGNhbGxpbmcKLSAgIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUuICAqLwotI2RlZmluZSBFRl9NSVBTX0NQSUMJCTB4MDAwMDAwMDQKLQotLyogQ29kZSBpbiBmaWxlIHVzZXMgbmV3IEFCSSAoLW4zMiBvbiBJcml4IDYpLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BQkkyCQkweDAwMDAwMDIwCi0KLS8qIEluZGljYXRlcyBjb2RlIGNvbXBpbGVkIGZvciBhIDY0LWJpdCBtYWNoaW5lIGluIDMyLWJpdCBtb2RlLiAKLSAgIChyZWdzIGFyZSAzMi1iaXRzIHdpZGUuKSAqLwotI2RlZmluZSBFRl9NSVBTXzMyQklUTU9ERSAgICAgICAweDAwMDAwMTAwCi0KLS8qIEZvdXIgYml0IE1JUFMgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNICQkweGYwMDAwMDAwCi0KLS8qIC1taXBzMSBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NSVBTX0FSQ0hfMQkJMHgwMDAwMDAwMAotCi0vKiAtbWlwczIgY29kZS4gICovCi0jZGVmaW5lIEVfTUlQU19BUkNIXzIJCTB4MTAwMDAwMDAKLQotLyogLW1pcHMzIGNvZGUuICAqLwotI2RlZmluZSBFX01JUFNfQVJDSF8zCQkweDIwMDAwMDAwCi0KLS8qIC1taXBzNCBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NSVBTX0FSQ0hfNAkJMHgzMDAwMDAwMAotCi0vKiBUaGUgQUJJIG9mIHRoZSBmaWxlLiAgQWxzbyBzZWUgRUZfTUlQU19BQkkyIGFib3ZlLiAqLwotI2RlZmluZSBFRl9NSVBTX0FCSQkJMHgwMDAwRjAwMAotCi0vKiBUaGUgb3JpZ2luYWwgbzMyIGFiaS4gKi8KLSNkZWZpbmUgRV9NSVBTX0FCSV9PMzIgICAgICAgICAgMHgwMDAwMTAwMAotCi0vKiBPMzIgZXh0ZW5kZWQgdG8gd29yayBvbiA2NCBiaXQgYXJjaGl0ZWN0dXJlcyAqLwotI2RlZmluZSBFX01JUFNfQUJJX082NCAgICAgICAgICAweDAwMDAyMDAwCi0KLS8qIEVBQkkgaW4gMzIgYml0IG1vZGUgKi8KLSNkZWZpbmUgRV9NSVBTX0FCSV9FQUJJMzIgICAgICAgMHgwMDAwMzAwMAotCi0vKiBFQUJJIGluIDY0IGJpdCBtb2RlICovCi0jZGVmaW5lIEVfTUlQU19BQklfRUFCSTY0ICAgICAgIDB4MDAwMDQwMDAKLQotCi0vKiBNYWNoaW5lIHZhcmlhbnQgaWYgd2Uga25vdyBpdC4gIFRoaXMgZmllbGQgd2FzIGludmVudGVkIGF0IEN5Z251cywKLSAgIGJ1dCBpdCBpcyBob3BlZCB0aGF0IG90aGVyIHZlbmRvcnMgd2lsbCBhZG9wdCBpdC4gIElmIHNvbWUgc3RhbmRhcmQKLSAgIGlzIGRldmVsb3BlZCwgdGhpcyBjb2RlIHNob3VsZCBiZSBjaGFuZ2VkIHRvIGZvbGxvdyBpdC4gKi8KLQotI2RlZmluZSBFRl9NSVBTX01BQ0gJCTB4MDBGRjAwMDAKLQotLyogQ3lnbnVzIGlzIGNob29zaW5nIHZhbHVlcyBiZXR3ZWVuIDgwIGFuZCA5RjsKLSAgIDAwIC0gN0Ygc2hvdWxkIGJlIGxlZnQgZm9yIGEgZnV0dXJlIHN0YW5kYXJkOwotICAgdGhlIHJlc3QgYXJlIG9wZW4uICovCi0KLSNkZWZpbmUgRV9NSVBTX01BQ0hfMzkwMAkweDAwODEwMDAwCi0KLSNkZWZpbmUgRV9NSVBTX01BQ0hfNDAxMAkweDAwODIwMDAwCi0jZGVmaW5lIEVfTUlQU19NQUNIXzQxMDAJMHgwMDgzMDAwMAotI2RlZmluZSBFX01JUFNfTUFDSF80NjUwCTB4MDA4NTAwMDAKLSNkZWZpbmUgRV9NSVBTX01BQ0hfNDExMQkweDAwODgwMDAwCi0KLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGluZGljZXMuICBUaGVzZSBzZWN0aW9ucyBkbyBub3QgYWN0dWFsbHkKLSAgIGV4aXN0LiAgU3ltYm9scyB3aXRoIGEgc3Rfc2huZHggZmllbGQgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlc2UKLSAgIHZhbHVlcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nLiAgKi8KLQotLyogRGVmaW5lZCBhbmQgYWxsb2NhdGVkIGNvbW1vbiBzeW1ib2wuICBWYWx1ZSBpcyB2aXJ0dWFsIGFkZHJlc3MuICBJZgotICAgcmVsb2NhdGVkLCBhbGlnbm1lbnQgbXVzdCBiZSBwcmVzZXJ2ZWQuICAqLwotI2RlZmluZSBTSE5fTUlQU19BQ09NTU9OCTB4ZmYwMAotCi0vKiBEZWZpbmVkIGFuZCBhbGxvY2F0ZWQgdGV4dCBzeW1ib2wuICBWYWx1ZSBpcyB2aXJ0dWFsIGFkZHJlc3MuCi0gICBPY2N1ciBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgQWxwaGEgT1NGLzEgYW5kIElyaXggNSBleGVjdXRhYmxlcy4gICovCi0jZGVmaW5lIFNITl9NSVBTX1RFWFQJCTB4ZmYwMQotCi0vKiBEZWZpbmVkIGFuZCBhbGxvY2F0ZWQgZGF0YSBzeW1ib2wuICBWYWx1ZSBpcyB2aXJ0dWFsIGFkZHJlc3MuCi0gICBPY2N1ciBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgQWxwaGEgT1NGLzEgYW5kIElyaXggNSBleGVjdXRhYmxlcy4gICovCi0jZGVmaW5lIFNITl9NSVBTX0RBVEEJCTB4ZmYwMgotCi0vKiBTbWFsbCBjb21tb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfU0NPTU1PTgkweGZmMDMKLQotLyogU21hbGwgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9NSVBTX1NVTkRFRklORUQJMHhmZjA0Ci0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIHNldCBvZiBkeW5hbWljIHNoYXJlZCBvYmplY3RzIHVzZWQgd2hlbgotICAgc3RhdGljYWxseSBsaW5raW5nLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfTElCTElTVAkweDcwMDAwMDAwCi0KLS8qIEknbSBub3Qgc3VyZSB3aGF0IHRoaXMgaXMsIGJ1dCBpdCdzIHVzZWQgb24gSXJpeCA1LiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfTVNZTQkJMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGxpc3Qgb2Ygc3ltYm9scyB3aG9zZSBkZWZpbml0aW9ucyBjb25mbGljdCB3aXRoCi0gICBzeW1ib2xzIGRlZmluZWQgaW4gc2hhcmVkIG9iamVjdHMuICAqLwotI2RlZmluZSBTSFRfTUlQU19DT05GTElDVAkweDcwMDAwMDAyCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIGdsb2JhbCBwb2ludGVyIHRhYmxlLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfR1BUQUIJCTB4NzAwMDAwMDMKLQotLyogU2VjdGlvbiBjb250YWlucyBtaWNyb2NvZGUgaW5mb3JtYXRpb24uICBUaGUgZXhhY3QgZm9ybWF0IGlzCi0gICB1bnNwZWNpZmllZC4gICovCi0jZGVmaW5lIFNIVF9NSVBTX1VDT0RFCQkweDcwMDAwMDA0Ci0KLS8qIFNlY3Rpb24gY29udGFpbnMgc29tZSBzb3J0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZSBleGFjdAotICAgZm9ybWF0IGlzIHVuc3BlY2lmaWVkLiAgSXQncyBwcm9iYWJseSBFQ09GRiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfREVCVUcJCTB4NzAwMDAwMDUKLQotLyogU2VjdGlvbiBjb250YWlucyByZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIFNIVF9NSVBTX1JFR0lORk8JMHg3MDAwMDAwNgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUEFDS0FHRQkweDcwMDAwMDA3Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19QQUNLU1lNCTB4NzAwMDAwMDgKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1JFTEQJCTB4NzAwMDAwMDkKLQotLyogU2VjdGlvbiBjb250YWlucyBpbnRlcmZhY2UgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBTSFRfTUlQU19JRkFDRQkJMHg3MDAwMDAwYgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGRlc2NyaXB0aW9uIG9mIGNvbnRlbnRzIG9mIGFub3RoZXIgc2VjdGlvbi4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0NPTlRFTlQJMHg3MDAwMDAwYwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIG1pc2NlbGxhbmVvdXMgb3B0aW9ucy4gICovCi0jZGVmaW5lIFNIVF9NSVBTX09QVElPTlMJMHg3MDAwMDAwZAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfU0hEUgkJMHg3MDAwMDAxMAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfRkRFU0MJCTB4NzAwMDAwMTEKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0VYVFNZTQkJMHg3MDAwMDAxMgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfREVOU0UJCTB4NzAwMDAwMTMKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1BERVNDCQkweDcwMDAwMDE0Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19MT0NTWU0JCTB4NzAwMDAwMTUKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0FVWFNZTQkJMHg3MDAwMDAxNgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfT1BUU1lNCQkweDcwMDAwMDE3Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19MT0NTVFIJCTB4NzAwMDAwMTgKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0xJTkUJCTB4NzAwMDAwMTkKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1JGREVTQwkJMHg3MDAwMDAxYQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfREVMVEFTWU0JMHg3MDAwMDAxYgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfREVMVEFJTlNUCTB4NzAwMDAwMWMKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBQ0xBU1MJMHg3MDAwMDAxZAotCi0vKiBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbi4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0RXQVJGCQkweDcwMDAwMDFlCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19ERUxUQURFQ0wJMHg3MDAwMDAxZgotCi0vKiBMaXN0IG9mIGxpYnJhcmllcyB0aGUgYmluYXJ5IGRlcGVuZHMgb24uICBJbmNsdWRlcyBhIHRpbWUgc3RhbXAsIHZlcnNpb24KLSAgIG51bWJlci4gICovCi0jZGVmaW5lIFNIVF9NSVBTX1NZTUJPTF9MSUIJMHg3MDAwMDAyMAotCi0vKiBFdmVudHMgc2VjdGlvbi4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0VWRU5UUwkJMHg3MDAwMDAyMQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfVFJBTlNMQVRFCTB4NzAwMDAwMjIKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1BJWElFCQkweDcwMDAwMDIzCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19YTEFURQkJMHg3MDAwMDAyNAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfWExBVEVfREVCVUcJMHg3MDAwMDAyNQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfV0hJUkwJCTB4NzAwMDAwMjYKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0VIX1JFR0lPTgkweDcwMDAwMDI3Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19YTEFURV9PTEQJMHg3MDAwMDAyOAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUERSX0VYQ0VQVElPTgkweDcwMDAwMDI5Ci0KLQotLyogQSBzZWN0aW9uIG9mIHR5cGUgU0hUX01JUFNfTElCTElTVCBjb250YWlucyBhbiBhcnJheSBvZiB0aGUKLSAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUuICBUaGUgc2hfbGluayBmaWVsZCBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUKLSAgIHN0cmluZyB0YWJsZS4gIFRoZSBzaF9pbmZvIGZpZWxkIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUKLSAgIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogU3RyaW5nIHRhYmxlIGluZGV4IGZvciBuYW1lIG9mIHNoYXJlZCBvYmplY3QuICAqLwotICB1bnNpZ25lZCBsb25nIGxfbmFtZTsKLSAgLyogVGltZSBzdGFtcC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF90aW1lX3N0YW1wOwotICAvKiBDaGVja3N1bSBvZiBzeW1ib2wgbmFtZXMgYW5kIGNvbW1vbiBzaXplcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF9jaGVja3N1bTsKLSAgLyogU3RyaW5nIHRhYmxlIGluZGV4IGZvciB2ZXJzaW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX3ZlcnNpb247Ci0gIC8qIEZsYWdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX2ZsYWdzOwotfSBFbGYzMl9MaWI7Ci0KLS8qIFRoZSBleHRlcm5hbCB2ZXJzaW9uIG9mIEVsZjMyX0xpYi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyIGxfbmFtZVs0XTsKLSAgdW5zaWduZWQgY2hhciBsX3RpbWVfc3RhbXBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgbF9jaGVja3N1bVs0XTsKLSAgdW5zaWduZWQgY2hhciBsX3ZlcnNpb25bNF07Ci0gIHVuc2lnbmVkIGNoYXIgbF9mbGFnc1s0XTsKLX0gRWxmMzJfRXh0ZXJuYWxfTGliOwotCi0vKiBUaGUgbF9mbGFncyBmaWVsZCBvZiBhbiBFbGYzMl9MaWIgc3RydWN0dXJlIG1heSBjb250YWluIHRoZQotICAgZm9sbG93aW5nIGZsYWdzLiAgKi8KLQotLyogUmVxdWlyZSBhbiBleGFjdCBtYXRjaCBhdCBydW50aW1lLiAgKi8KLSNkZWZpbmUgTExfRVhBQ1RfTUFUQ0gJCTB4MDAwMDAwMDEKLQotLyogSWdub3JlIHZlcnNpb24gaW5jb21wYXRpYmlsaXRpZXMgYXQgcnVudGltZS4gICovCi0jZGVmaW5lIExMX0lHTk9SRV9JTlRfVkVSCTB4MDAwMDAwMDIKLQotLyogUmVxdWlyZSBtYXRjaGluZyBtaW5vciB2ZXJzaW9uIG51bWJlci4gICovCi0jZGVmaW5lIExMX1JFUVVJUkVfTUlOT1IJMHgwMDAwMDAwNAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgTExfRVhQT1JUUwkJMHgwMDAwMDAwOAotCi0vKiBEZWxheSBsb2FkaW5nIG9mIHRoaXMgbGlicmFyeSB1bnRpbCByZWFsbHkgbmVlZGVkLiAgKi8KLSNkZWZpbmUgTExfREVMQVlfTE9BRAkJMHgwMDAwMDAxMAotCi0vKiA/Pz8gRGVsdGEgQysrIHN0dWZmID8/PyAqLwotI2RlZmluZSBMTF9ERUxUQQkJMHgwMDAwMDAyMAotCi0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX0NPTkZMSUNUIGlzIGFuIGFycmF5IG9mIGluZGljZXMgaW50byB0aGUKLSAgIC5keW5zeW0gc2VjdGlvbi4gIEVhY2ggZWxlbWVudCBoYXMgdGhlIGZvbGxvd2luZyB0eXBlLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBFbGYzMl9Db25mbGljdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBFbGYzMl9FeHRlcm5hbF9Db25mbGljdFs0XTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIEVsZjY0X0NvbmZsaWN0OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEVsZjY0X0V4dGVybmFsX0NvbmZsaWN0WzhdOwotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19HUFRBQiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBob3cKLSAgIG11Y2ggR1Agc3BhY2Ugd291bGQgYmUgcmVxdWlyZWQgZm9yIGRpZmZlcmVudCAtRyBhcmd1bWVudHMuICBUaGlzCi0gICBpbmZvcm1hdGlvbiBpcyBvbmx5IHVzZWQgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBwcm92aWRlIGluZm9ybWF0aXZlCi0gICBzdWdnZXN0aW9ucyBhcyB0byB0aGUgYmVzdCAtRyB2YWx1ZSB0byB1c2UuICBUaGUgc2hfaW5mbyBmaWVsZCBpcwotICAgdGhlIGluZGV4IG9mIHRoZSBzZWN0aW9uIGZvciB3aGljaCB0aGlzIGluZm9ybWF0aW9uIGFwcGxpZXMuICBUaGUKLSAgIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIGFyZSBhbiBhcnJheSBvZiB0aGUgZm9sbG93aW5nIHVuaW9uLiAgVGhlCi0gICBmaXJzdCBlbGVtZW50IHVzZXMgdGhlIGd0X2hlYWRlciBmaWVsZC4gIFRoZSByZW1haW5pbmcgZWxlbWVudHMgdXNlCi0gICB0aGUgZ3RfZW50cnkgZmllbGQuICAqLwotdHlwZWRlZiB1bmlvbgotewotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiAtRyB2YWx1ZSBhY3R1YWxseSB1c2VkIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgZ3RfY3VycmVudF9nX3ZhbHVlOwotICAgICAgLyogVW51c2VkLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgZ3RfdW51c2VkOwotICAgIH0gZ3RfaGVhZGVyOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIC1HIGFyZ3VtZW50IGhhcyBiZWVuIHVzZWQuLi4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIGd0X2dfdmFsdWU7Ci0gICAgICAvKiAuLi50aGlzIG1hbnkgR1Agc2VjdGlvbiBieXRlcyB3b3VsZCBiZSByZXF1aXJlZC4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIGd0X2J5dGVzOwotICAgIH0gZ3RfZW50cnk7Ci19IEVsZjMyX2dwdGFiOwotCi0vKiBUaGUgZXh0ZXJuYWwgdmVyc2lvbiBvZiBFbGYzMl9ncHRhYi4gICovCi0KLXR5cGVkZWYgdW5pb24KLXsKLSAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBndF9jdXJyZW50X2dfdmFsdWVbNF07Ci0gICAgICB1bnNpZ25lZCBjaGFyIGd0X3VudXNlZFs0XTsKLSAgICB9IGd0X2hlYWRlcjsKLSAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBndF9nX3ZhbHVlWzRdOwotICAgICAgdW5zaWduZWQgY2hhciBndF9ieXRlc1s0XTsKLSAgICB9IGd0X2VudHJ5OwotfSBFbGYzMl9FeHRlcm5hbF9ncHRhYjsKLQotLyogQSBzZWN0aW9uIG9mIHR5cGUgU0hUX01JUFNfUkVHSU5GTyBjb250YWlucyB0aGUgZm9sbG93aW5nCi0gICBzdHJ1Y3R1cmUuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogTWFzayBvZiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2dwcm1hc2s7Ci0gIC8qIE1hc2sgb2YgY28tcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9jcHJtYXNrWzRdOwotICAvKiBHUCByZWdpc3RlciB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIGxvbmcgcmlfZ3BfdmFsdWU7Ci19IEVsZjMyX1JlZ0luZm87Ci0KLS8qIFRoZSBleHRlcm5hbCB2ZXJzaW9uIG9mIHRoZSBFbGZfUmVnSW5mbyBzdHJ1Y3R1cmUuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciByaV9ncHJtYXNrWzRdOwotICB1bnNpZ25lZCBjaGFyIHJpX2Nwcm1hc2tbNF1bNF07Ci0gIHVuc2lnbmVkIGNoYXIgcmlfZ3BfdmFsdWVbNF07Ci19IEVsZjMyX0V4dGVybmFsX1JlZ0luZm87Ci0KLS8qIE1JUFMgRUxGIC5yZWdpbmZvIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqLCBFbGYzMl9SZWdJbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX1JlZ0luZm8gKiwgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqKSk7Ci0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncy4gICovCi0KLS8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSBnbG9iYWwgZGF0YSBhcmVhLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfR1BSRUwJCTB4MTAwMDAwMDAKLQotLyogVGhpcyBzZWN0aW9uIHNob3VsZCBiZSBtZXJnZWQuICAqLwotI2RlZmluZSBTSEZfTUlQU19NRVJHRQkJMHgyMDAwMDAwMAotCi0vKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgMzIgYml0IGFkZHJlc3Nlcy4gICovCi0jZGVmaW5lIFNIRl9NSVBTX0FERFIzMgkJMHg0MDAwMDAwMAotCi0vKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgNjQgYml0IGFkZHJlc3Nlcy4gICovCi0jZGVmaW5lIFNIRl9NSVBTX0FERFI2NAkJMHg4MDAwMDAwMAotCi0vKiBUaGlzIHNlY3Rpb24gbWF5IG5vdCBiZSBzdHJpcHBlZC4gICovCi0jZGVmaW5lIFNIRl9NSVBTX05PU1RSSVAJMHgwODAwMDAwMAotCi0vKiBUaGlzIHNlY3Rpb24gaXMgbG9jYWwgdG8gdGhyZWFkcy4gICovCi0jZGVmaW5lIFNIRl9NSVBTX0xPQ0FMCQkweDA0MDAwMDAwCi0KLS8qIExpbmtlciBzaG91bGQgZ2VuZXJhdGUgaW1wbGljaXQgd2VhayBuYW1lcyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfTkFNRVMJCTB4MDIwMDAwMDAKLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBwcm9ncmFtIGhlYWRlciB0eXBlcy4gICovCi0KLS8qIFJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uLiAgSWRlbnRpZmllcyBvbmUgLnJlZ2luZm8gc2VjdGlvbi4gICovCi0jZGVmaW5lIFBUX01JUFNfUkVHSU5GTwkJMHg3MDAwMDAwMAotCi0vKiBSdW50aW1lIHByb2NlZHVyZSB0YWJsZS4gICovCi0jZGVmaW5lIFBUX01JUFNfUlRQUk9DCQkweDcwMDAwMDAxCi0KLS8qIE9wdGlvbnMgKGZvciB3aGF0ID8/PykuICAqLwotI2RlZmluZSBQVF9NSVBTX09QVElPTlMJCTB4NzAwMDAwMDIKLQwKLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBkeW5hbWljIGFycmF5IHRhZ3MuICAqLwotCi0vKiAzMiBiaXQgdmVyc2lvbiBudW1iZXIgZm9yIHJ1bnRpbWUgbGlua2VyIGludGVyZmFjZS4gICovCi0jZGVmaW5lIERUX01JUFNfUkxEX1ZFUlNJT04JMHg3MDAwMDAwMQotCi0vKiBUaW1lIHN0YW1wLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19USU1FX1NUQU1QCTB4NzAwMDAwMDIKLQotLyogQ2hlY2tzdW0gb2YgZXh0ZXJuYWwgc3RyaW5ncyBhbmQgY29tbW9uIHNpemVzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19JQ0hFQ0tTVU0JMHg3MDAwMDAwMwotCi0vKiBJbmRleCBvZiB2ZXJzaW9uIHN0cmluZyBpbiBzdHJpbmcgdGFibGUuICAqLwotI2RlZmluZSBEVF9NSVBTX0lWRVJTSU9OCTB4NzAwMDAwMDQKLQotLyogMzIgYml0cyBvZiBmbGFncy4gICovCi0jZGVmaW5lIERUX01JUFNfRkxBR1MJCTB4NzAwMDAwMDUKLQotLyogQmFzZSBhZGRyZXNzIG9mIHRoZSBzZWdtZW50LiAgKi8KLSNkZWZpbmUgRFRfTUlQU19CQVNFX0FERFJFU1MJMHg3MDAwMDAwNgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19NU1lNCQkweDcwMDAwMDA3Ci0KLS8qIEFkZHJlc3Mgb2YgLmNvbmZsaWN0IHNlY3Rpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX0NPTkZMSUNUCTB4NzAwMDAwMDgKLQotLyogQWRkcmVzcyBvZiAubGlibGlzdCBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19MSUJMSVNUCQkweDcwMDAwMDA5Ci0KLS8qIE51bWJlciBvZiBsb2NhbCBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJpZXMuICAqLwotI2RlZmluZSBEVF9NSVBTX0xPQ0FMX0dPVE5PCTB4NzAwMDAwMGEKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIC5jb25mbGljdCBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19DT05GTElDVE5PCTB4NzAwMDAwMGIKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIC5saWJsaXN0IHNlY3Rpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX0xJQkxJU1ROTwkweDcwMDAwMDEwCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX1NZTVRBQk5PCTB4NzAwMDAwMTEKLQotLyogSW5kZXggb2YgZmlyc3QgZXh0ZXJuYWwgZHluYW1pYyBzeW1ib2wgbm90IHJlZmVyZW5jZWQgbG9jYWxseS4gICovCi0jZGVmaW5lIERUX01JUFNfVU5SRUZFWFROTwkweDcwMDAwMDEyCi0KLS8qIEluZGV4IG9mIGZpcnN0IGR5bmFtaWMgc3ltYm9sIGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotI2RlZmluZSBEVF9NSVBTX0dPVFNZTQkJMHg3MDAwMDAxMwotCi0vKiBOdW1iZXIgb2YgcGFnZSB0YWJsZSBlbnRyaWVzIGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotI2RlZmluZSBEVF9NSVBTX0hJUEFHRU5PCTB4NzAwMDAwMTQKLQotLyogQWRkcmVzcyBvZiBydW4gdGltZSBsb2FkZXIgbWFwLCB1c2VkIGZvciBkZWJ1Z2dpbmcuICAqLwotI2RlZmluZSBEVF9NSVBTX1JMRF9NQVAJCTB4NzAwMDAwMTYKLQotLyogRGVsdGEgQysrIGNsYXNzIGRlZmluaXRpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTCTB4NzAwMDAwMTcKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gRFRfTUlQU19ERUxUQV9DTEFTUy4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NfTk8JMHg3MDAwMDAxOAotCi0vKiBEZWx0YSBDKysgY2xhc3MgaW5zdGFuY2VzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9JTlNUQU5DRQkweDcwMDAwMDE5Ci0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfSU5TVEFOQ0UuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFX05PCTB4NzAwMDAwMWEKLQotLyogRGVsdGEgcmVsb2NhdGlvbnMuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX1JFTE9DCTB4NzAwMDAwMWIKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gRFRfTUlQU19ERUxUQV9SRUxPQy4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfUkVMT0NfTk8JMHg3MDAwMDAxYwotCi0vKiBEZWx0YSBzeW1ib2xzIHRoYXQgRGVsdGEgcmVsb2NhdGlvbnMgcmVmZXIgdG8uICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX1NZTQkweDcwMDAwMDFkCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfU1lNLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9TWU1fTk8JMHg3MDAwMDAxZQotCi0vKiBEZWx0YSBzeW1ib2xzIHRoYXQgaG9sZCBjbGFzcyBkZWNsYXJhdGlvbnMuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNCTB4NzAwMDAwMjAKLQotLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gRFRfTUlQU19ERUxUQV9DTEFTU1NZTS4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk8JMHg3MDAwMDAyMQotCi0vKiBGbGFncyBpbmRpY2F0aW5nIGluZm9ybWF0aW9uIGFib3V0IEMrKyBmbGF2b3IuICAqLwotI2RlZmluZSBEVF9NSVBTX0NYWF9GTEFHUwkweDcwMDAwMDIyCi0KLS8qIFBpeGllIGluZm9ybWF0aW9uICg/Pz8pLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19QSVhJRV9JTklUCTB4NzAwMDAwMjMKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfU1lNQk9MX0xJQgkweDcwMDAwMDI0Ci0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX0xPQ0FMUEFHRV9HT1RJRFgJMHg3MDAwMDAyNQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19MT0NBTF9HT1RJRFgJMHg3MDAwMDAyNgotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19ISURERU5fR09USURYCTB4NzAwMDAwMjcKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfUFJPVEVDVEVEX0dPVElEWAkweDcwMDAwMDI4Ci0KLS8qIEFkZHJlc3Mgb2YgYC5NSVBTLm9wdGlvbnMnLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19PUFRJT05TCQkweDcwMDAwMDI5Ci0KLS8qIEFkZHJlc3Mgb2YgYC5pbnRlcmZhY2UnLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19JTlRFUkZBQ0UJMHg3MDAwMDAyYQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19EWU5TVFJfQUxJR04JMHg3MDAwMDAyYgotCi0vKiBTaXplIG9mIHRoZSAuaW50ZXJmYWNlIHNlY3Rpb24uICAqLwotI2RlZmluZSBEVF9NSVBTX0lOVEVSRkFDRV9TSVpFCTB4NzAwMDAwMmMKLQotLyogU2l6ZSBvZiBybGRfdGV4dF9yZXNvbHZlIGZ1bmN0aW9uIHN0b3JlZCBpbiB0aGUgR09ULiAgKi8KLSNkZWZpbmUgRFRfTUlQU19STERfVEVYVF9SRVNPTFZFX0FERFIJMHg3MDAwMDAyZAotCi0vKiBEZWZhdWx0IHN1ZmZpeCBvZiBEU08gdG8gYmUgYWRkZWQgYnkgcmxkIG9uIGRsb3BlbigpIGNhbGxzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19QRVJGX1NVRkZJWAkweDcwMDAwMDJlCi0KLS8qIFNpemUgb2YgY29tcGFjdCByZWxvY2F0aW9uIHNlY3Rpb24gKE8zMikuICAqLwotI2RlZmluZSBEVF9NSVBTX0NPTVBBQ1RfU0laRQkweDcwMDAwMDJmCi0KLS8qIEdQIHZhbHVlIGZvciBhdXhpbGlhcnkgR09Ucy4gICovCi0jZGVmaW5lIERUX01JUFNfR1BfVkFMVUUJMHg3MDAwMDAzMAotCi0vKiBBZGRyZXNzIG9mIGF1eGlsaWFyeSAuZHluYW1pYy4gICovCi0jZGVmaW5lIERUX01JUFNfQVVYX0RZTkFNSUMJMHg3MDAwMDAzMQotDAotLyogRmxhZ3Mgd2hpY2ggbWF5IGFwcGVhciBpbiBhIERUX01JUFNfRkxBR1MgZW50cnkuICAqLwotCi0vKiBObyBmbGFncy4gICovCi0jZGVmaW5lIFJIRl9OT05FCQkweDAwMDAwMDAwCi0KLS8qIFVzZXMgc2hvcnRjdXQgcG9pbnRlcnMuICAqLwotI2RlZmluZSBSSEZfUVVJQ0tTVEFSVAkJMHgwMDAwMDAwMQotCi0vKiBIYXNoIHNpemUgaXMgbm90IGEgcG93ZXIgb2YgdHdvLiAgKi8KLSNkZWZpbmUgUkhGX05PVFBPVAkJMHgwMDAwMDAwMgotCi0vKiBJZ25vcmUgTERfTElCUkFSWV9QQVRILiAgKi8KLSNkZWZpbmUgUkhTX05PX0xJQlJBUllfUkVQTEFDRU1FTlQgXAotCQkJCTB4MDAwMDAwMDQKLQotI2RlZmluZSBSSEZfTk9fTU9WRQkJICAgMHgwMDAwMDAwOAotI2RlZmluZSBSSEZfU0dJX09OTFkJCSAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUkhGX0dVQVJBTlRFRV9JTklUCSAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgUkhGX0RFTFRBX0NfUExVU19QTFVTCSAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgUkhGX0dVQVJBTlRFRV9TVEFSVF9JTklUICAgMHgwMDAwMDA4MAotI2RlZmluZSBSSEZfUElYSUUJCSAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgUkhGX0RFRkFVTFRfREVMQVlfTE9BRAkgICAweDAwMDAwMjAwCi0jZGVmaW5lIFJIRl9SRVFVSUNLU1RBUlQJICAgMHgwMDAwMDQwMAotI2RlZmluZSBSSEZfUkVRVUlDS1NUQVJURUQJICAgMHgwMDAwMDgwMAotI2RlZmluZSBSSEZfQ09SRAkJICAgMHgwMDAwMTAwMAotI2RlZmluZSBSSEZfTk9fVU5SRVNfVU5ERUYJICAgMHgwMDAwMjAwMAotI2RlZmluZSBSSEZfUkxEX09SREVSX1NBRkUJICAgMHgwMDAwNDAwMAotDAotLyogU3BlY2lhbCB2YWx1ZXMgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlc2UKLSAgIGFyZSB1c2VkIGluIGFuIElyaXggNSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi0KLSNkZWZpbmUgU1RPX0RFRkFVTFQJCVNUVl9ERUZBVUxUCi0jZGVmaW5lIFNUT19JTlRFUk5BTAkJU1RWX0lOVEVSTkFMCi0jZGVmaW5lIFNUT19ISURERU4JCVNUVl9ISURERU4KLSNkZWZpbmUgU1RPX1BST1RFQ1RFRAkJU1RWX1BST1RFQ1RFRAotCi0vKiBUaGlzIHZhbHVlIGlzIHVzZWQgZm9yIGEgbWlwczE2IC50ZXh0IHN5bWJvbC4gICovCi0jZGVmaW5lIFNUT19NSVBTMTYJCTB4ZjAKLQwKLS8qIFRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJIHVzZXMgYW4gdW51c3VhbCByZWxvYyBmb3JtYXQuICBFYWNoCi0gICByZWxvY2F0aW9uIGVudHJ5IHNwZWNpZmllcyB1cCB0byB0aHJlZSBhY3R1YWwgcmVsb2NhdGlvbnMsIGFsbCBhdAotICAgdGhlIHNhbWUgYWRkcmVzcy4gIFRoZSBmaXJzdCByZWxvY2F0aW9uIHdoaWNoIHJlcXVpcmVkIGEgc3ltYm9sCi0gICB1c2VzIHRoZSBzeW1ib2wgaW4gdGhlIHJfc3ltIGZpZWxkLiAgVGhlIHNlY29uZCByZWxvY2F0aW9uIHdoaWNoCi0gICByZXF1aXJlcyBhIHN5bWJvbCB1c2VzIHRoZSBzeW1ib2wgaW4gdGhlIHJfc3N5bSBmaWVsZC4gIElmIGFsbAotICAgdGhyZWUgcmVsb2NhdGlvbnMgcmVxdWlyZSBhIHN5bWJvbCwgdGhlIHRoaXJkIG9uZSB1c2VzIGEgemVybwotICAgdmFsdWUuICAqLwotCi0vKiBBbiBlbnRyeSBpbiBhIDY0IGJpdCBTSFRfUkVMIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBBZGRyZXNzIG9mIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwotICAvKiBTeW1ib2wgaW5kZXguICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3ltWzRdOwotICAvKiBTcGVjaWFsIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zc3ltWzFdOwotICAvKiBUaGlyZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUzWzFdOwotICAvKiBTZWNvbmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMlsxXTsKLSAgLyogRmlyc3QgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlWzFdOwotfSBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KLSAgYmZkX3ZtYSByX29mZnNldDsKLSAgLyogU3ltYm9sIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgbG9uZyByX3N5bTsKLSAgLyogU3BlY2lhbCBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3N5bTsKLSAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMzsKLSAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTI7Ci0gIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTsKLX0gRWxmNjRfTWlwc19JbnRlcm5hbF9SZWw7Ci0KLS8qIEFuIGVudHJ5IGluIGEgNjQgYml0IFNIVF9SRUxBIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBBZGRyZXNzIG9mIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwotICAvKiBTeW1ib2wgaW5kZXguICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3ltWzRdOwotICAvKiBTcGVjaWFsIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zc3ltWzFdOwotICAvKiBUaGlyZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUzWzFdOwotICAvKiBTZWNvbmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMlsxXTsKLSAgLyogRmlyc3QgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlWzFdOwotICAvKiBBZGRlbmQuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfYWRkZW5kWzhdOwotfSBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGE7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4gICovCi0gIGJmZF92bWEgcl9vZmZzZXQ7Ci0gIC8qIFN5bWJvbCBpbmRleC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcl9zeW07Ci0gIC8qIFNwZWNpYWwgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3NzeW07Ci0gIC8qIFRoaXJkIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTM7Ci0gIC8qIFNlY29uZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUyOwotICAvKiBGaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGU7Ci0gIC8qIEFkZGVuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIHJfYWRkZW5kOwotfSBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGE7Ci0KLS8qIFZhbHVlcyBmb3VuZCBpbiB0aGUgcl9zc3ltIGZpZWxkIG9mIGEgcmVsb2NhdGlvbiBlbnRyeS4gICovCi0KLS8qIE5vIHJlbG9jYXRpb24uICAqLwotI2RlZmluZSBSU1NfVU5ERUYJMAotCi0vKiBWYWx1ZSBvZiBHUC4gICovCi0jZGVmaW5lIFJTU19HUAkJMQotCi0vKiBWYWx1ZSBvZiBHUCBpbiBvYmplY3QgYmVpbmcgcmVsb2NhdGVkLiAgKi8KLSNkZWZpbmUgUlNTX0dQMAkJMgotCi0vKiBBZGRyZXNzIG9mIGxvY2F0aW9uIGJlaW5nIHJlbG9jYXRlZC4gICovCi0jZGVmaW5lIFJTU19MT0MJCTMKLQwKLS8qIEEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uIGNvbnRhaW5zIGEgc2VyaWVzIG9mIG9wdGlvbnMsIGVhY2ggb2YKLSAgIHdoaWNoIHN0YXJ0cyB3aXRoIHRoaXMgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVHlwZSBvZiBvcHRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIGtpbmRbMV07Ci0gIC8qIFNpemUgb2Ygb3B0aW9uIGRlc2NyaXB0b3IsIGluY2x1ZGluZyBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHNpemVbMV07Ci0gIC8qIFNlY3Rpb24gaW5kZXggb2YgYWZmZWN0ZWQgc2VjdGlvbiwgb3IgMCBmb3IgZ2xvYmFsIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2VjdGlvblsyXTsKLSAgLyogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBraW5kIG9mIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgaW5mb1s0XTsKLX0gRWxmX0V4dGVybmFsX09wdGlvbnM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFR5cGUgb2Ygb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBraW5kOwotICAvKiBTaXplIG9mIG9wdGlvbiBkZXNjcmlwdG9yLCBpbmNsdWRpbmcgaGVhZGVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaXplOwotICAvKiBTZWN0aW9uIGluZGV4IG9mIGFmZmVjdGVkIHNlY3Rpb24sIG9yIDAgZm9yIGdsb2JhbCBvcHRpb24uICAqLwotICB1bnNpZ25lZCBzaG9ydCBzZWN0aW9uOwotICAvKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGlzIGtpbmQgb2Ygb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpbmZvOwotfSBFbGZfSW50ZXJuYWxfT3B0aW9uczsKLQotLyogTUlQUyBFTEYgb3B0aW9uIGhlYWRlciBzd2FwcGluZyByb3V0aW5lcy4gICovCi1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqLCBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX09wdGlvbnMgKiwgRWxmX0V4dGVybmFsX09wdGlvbnMgKikpOwotCi0vKiBWYWx1ZXMgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUga2luZCBmaWVsZCBvZiBhbiBFbGZfT3B0aW9ucwotICAgc3RydWN0dXJlLiAgKi8KLQotLyogVW5kZWZpbmVkLiAgKi8KLSNkZWZpbmUgT0RLX05VTEwJMAotCi0vKiBSZWdpc3RlciB1c2FnZSBhbmQgR1AgdmFsdWUuICAqLwotI2RlZmluZSBPREtfUkVHSU5GTwkxCi0KLS8qIEV4Y2VwdGlvbiBwcm9jZXNzaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgT0RLX0VYQ0VQVElPTlMJMgotCi0vKiBTZWN0aW9uIHBhZGRpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBPREtfUEFECQkzCi0KLS8qIEhhcmR3YXJlIHdvcmthcm91bmRzIHBlcmZvcm1lZC4gICovCi0jZGVmaW5lIE9ES19IV1BBVENICTQKLQotLyogRmlsbCB2YWx1ZSB1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotI2RlZmluZSBPREtfRklMTAk1Ci0KLS8qIFJlc2VydmVkIHNwYWNlIGZvciBkZXNrdG9wIHRvb2xzLiAgKi8KLSNkZWZpbmUgT0RLX1RBR1MJNgotCi0vKiBIYXJkd2FyZSB3b3JrYXJvdW5kcywgQU5EIGJpdHMgd2hlbiBtZXJnaW5nLiAgKi8KLSNkZWZpbmUgT0RLX0hXQU5ECTcKLQotLyogSGFyZHdhcmUgd29ya2Fyb3VuZHMsIE9SIGJpdHMgd2hlbiBtZXJnaW5nLiAgKi8KLSNkZWZpbmUgT0RLX0hXT1IJOAotCi0vKiBHUCBncm91cCB0byB1c2UgZm9yIHRleHQvZGF0YSBzZWN0aW9ucy4gICovCi0jZGVmaW5lIE9ES19HUF9HUk9VUAk5Ci0KLS8qIElEIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgT0RLX0lERU5UCTEwCi0KLS8qIEluIHRoZSAzMiBiaXQgQUJJLCBhbiBPREtfUkVHSU5GTyBvcHRpb24gaXMganVzdCBhIEVsZjMyX1JlZ0luZm8KLSAgIHN0cnVjdHVyZS4gIEluIHRoZSA2NCBiaXQgQUJJLCBpdCBpcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZS4gIFRoZQotICAgaW5mbyBmaWVsZCBvZiB0aGUgb3B0aW9ucyBoZWFkZXIgaXMgbm90IHVzZWQuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBNYXNrIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcmlfZ3BybWFza1s0XTsKLSAgLyogUGFkZGluZy4gICovCi0gIHVuc2lnbmVkIGNoYXIgcmlfcGFkWzRdOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcmlfY3BybWFza1s0XVs0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICB1bnNpZ25lZCBjaGFyIHJpX2dwX3ZhbHVlWzhdOwotfSBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBNYXNrIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfZ3BybWFzazsKLSAgLyogUGFkZGluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfcGFkOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfY3BybWFza1s0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICBiZmRfdm1hIHJpX2dwX3ZhbHVlOwotfSBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGUgaGFzaCB2YWx1ZSBjb21wdXRlZCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtc19oYXNoX3ZhbHVlWzRdOwotICAvKiBDb250YWlucyBib3RoIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gaW5kZXggYW5kIHRoZSBzeW1ib2wgZmxhZ3MKLSAgICAgZmllbGQuICBUaGUgbWFjcm9zIEVMRjMyX01TX1JFTF9JTkRFWCBhbmQgRUxGMzJfTVNfRkxBR1MgYXJlIHVzZWQKLSAgICAgdG8gYWNjZXNzIHRoZSBpbmRpdmlkdWFsIHZhbHVlcy4gIFRoZSBkeW5hbWljIHJlbG9jYXRpb24gaW5kZXgKLSAgICAgaWRlbnRpZmllcyB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIC5yZWwuZHluIHNlY3Rpb24gdGhhdAotICAgICByZWZlcmVuY2VzIHRoZSBkeW5hbWljIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbXN5bSBlbnRyeS4KLSAgICAgSWYgdGhlIGluZGV4IGlzIDAsIG5vIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgc3ltYm9sLiAgVGhlIHN5bWJvbCBmbGFncyBmaWVsZCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbXNfaW5mb1s0XTsKLX0gRWxmMzJfRXh0ZXJuYWxfTXN5bTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlIGhhc2ggdmFsdWUgY29tcHV0ZWQgZnJvbSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZwotICAgICBkeW5hbWljIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbXNfaGFzaF92YWx1ZTsKLSAgLyogQ29udGFpbnMgYm90aCB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGluZGV4IGFuZCB0aGUgc3ltYm9sIGZsYWdzCi0gICAgIGZpZWxkLiAgVGhlIG1hY3JvcyBFTEYzMl9NU19SRUxfSU5ERVggYW5kIEVMRjMyX01TX0ZMQUdTIGFyZSB1c2VkCi0gICAgIHRvIGFjY2VzcyB0aGUgaW5kaXZpZHVhbCB2YWx1ZXMuICBUaGUgZHluYW1pYyByZWxvY2F0aW9uIGluZGV4Ci0gICAgIGlkZW50aWZpZXMgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSAucmVsLmR5biBzZWN0aW9uIHRoYXQKLSAgICAgcmVmZXJlbmNlcyB0aGUgZHluYW1pYyBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGlzIG1zeW0gZW50cnkuCi0gICAgIElmIHRoZSBpbmRleCBpcyAwLCBubyBkeW5hbWljIHJlbG9jYXRpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgIHN5bWJvbC4gIFRoZSBzeW1ib2wgZmxhZ3MgZmllbGQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICAqLwotICB1bnNpZ25lZCBsb25nIG1zX2luZm87Ci19IEVsZjMyX0ludGVybmFsX01zeW07Ci0KLSNkZWZpbmUgRUxGMzJfTVNfUkVMX0lOREVYKGkpICgoaSkgPj4gOCkKLSNkZWZpbmUgRUxGMzJfTVNfRkxBR1MoaSkgICAgIChpKSAmIDB4ZmYpCi0jZGVmaW5lIEVMRjMyX01TX0lORk8ociwgZikgICAoKChyKSA8PCA4KSArICgoZikgJiAweGZmKSkKLQotLyogTUlQUyBFTEYgcmVnaW5mbyBzd2FwcGluZyByb3V0aW5lcy4gICovCi1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKiwgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICosIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikpOwotCi0vKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yayBvZiBhbiBPREtfRVhDRVBUSU9OUyBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9NSU4JMHgxZgkvKiBGUEVzIHdoaWNoIG11c3QgYmUgZW5hYmxlZC4gICovCi0jZGVmaW5lIE9FWF9GUFVfTUFYCTB4MWYwMAkvKiBGUEVzIHdoaWNoIG1heSBiZSBlbmFibGVkLiAgKi8KLSNkZWZpbmUgT0VYX1BBR0UwCTB4MTAwMDAJLyogUGFnZSB6ZXJvIG11c3QgYmUgbWFwcGVkLiAgKi8KLSNkZWZpbmUgT0VYX1NNTQkJMHgyMDAwMAkvKiBGb3JjZSBzZXF1ZW50aWFsIG1lbW9yeSBtb2RlLiAgKi8KLSNkZWZpbmUgT0VYX0ZQREJVRwkweDQwMDAwCS8qIEZvcmNlIGZsb2F0aW5nLXBvaW50IGRlYnVnIG1vZGUuICAqLwotI2RlZmluZSBPRVhfRElTTUlTUwkweDgwMDAwCS8qIERpc21pc3MgaW52YWxpZCBhZGRyZXNzIGZhdWx0cy4gICovCi0KLS8qIE1hc2tzIG9mIHRoZSBGUCBleGNlcHRpb25zIGZvciBPRVhfRlBVX01JTiBhbmQgT0VYX0ZQVV9NQVguICAqLwotI2RlZmluZSBPRVhfRlBVX0lOVkFMCTB4MTAJLyogSW52YWxpZCBvcGVyYXRpb24gZXhjZXB0aW9uLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9ESVYwCTB4MDgJLyogRGl2aXNpb24gYnkgemVybyBleGNlcHRpb24uICAqLwotI2RlZmluZSBPRVhfRlBVX09GTE8JMHgwNAkvKiBPdmVyZmxvdyBleGNlcHRpb24uICAqLwotI2RlZmluZSBPRVhfRlBVX1VGTE8JMHgwMgkvKiBVbmRlcmZsb3cgZXhjZXB0aW9uLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9JTkVYCTB4MDEJLyogSW5leGFjdCBleGNlcHRpb24uICAqLwotCi0vKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfUEFEIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPUEFEX1BSRUZJWAkweDAxCi0jZGVmaW5lIE9QQURfUE9TVEZJWAkweDAyCi0jZGVmaW5lIE9QQURfU1lNQk9MCTB4MDQKLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX0hXUEFUQ0ggZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9IV19SNEtFT1AJMHgwMQkvKiBSNDAwMCBlbmQtb2YtcGFnZSBwYXRjaC4gICovCi0jZGVmaW5lIE9IV19SOEtQRkVUQ0gJMHgwMgkvKiBNYXkgbmVlZCBSODAwMCBwcmVmZXRjaCBwYXRjaC4gICovCi0jZGVmaW5lIE9IV19SNUtFT1AJMHgwNAkvKiBSNTAwMCBlbmQtb2YtcGFnZSBwYXRjaC4gICovCi0jZGVmaW5lIE9IV19SNUtDVlRMCTB4MDgJLyogUjUwMDAgY3Z0Lltkc10ubCBidWcgKGNsZWFuID09IDEpLiAgKi8KLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX0lERU5UL09ES19HUF9HUk9VUCBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT0dQX0dST1VQCTB4MDAwMGZmZmYJLyogR1AgZ3JvdXAgbnVtYmVyLiAgKi8KLSNkZWZpbmUgT0dQX1NFTEYJMHhmZmZmMDAwMAkvKiBTZWxmLWNvbnRhaW5lZCBHUCBncm91cHMuICAqLwotCi0vKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfSFdBTkQvT0RLX0hXT1IgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9IV0EwX1I0S0VPUF9DSEVDS0VECTB4MDAwMDAwMDEKLSNkZWZpbmUgT0hXQTBfUjRLRU9QX0NMRUFOCTB4MDAwMDAwMDIKLQwKLQotI2VuZGlmIC8qIF9FTEZfTUlQU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tbjEwMjAwLmggYi9pbmNsdWRlL2VsZi9tbjEwMjAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMjllMGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbW4xMDIwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogTU4xMDIwMCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTU4xMDIwMCBFTEYgQUJJLiAqLwotCi0jaWZuZGVmIF9FTEZfTU4xMDIwMF9ICi0jZGVmaW5lIF9FTEZfTU4xMDIwMF9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tbjEwMjAwX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF8xNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfOCwgMykKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfMjQsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwX1BDUkVMOCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfUENSRUwxNiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfUENSRUwyNCwgNykKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX01OMTAyMDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbW4xMDMwMC5oIGIvaW5jbHVkZS9lbGYvbW4xMDMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjkwYTEzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL21uMTAzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIE1OMTAzMDAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1OMTAzMDAgRUxGIEFCSS4gKi8KLQotI2lmbmRlZiBfRUxGX01OMTAzMDBfSAotI2RlZmluZSBfRUxGX01OMTAzMDBfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbW4xMDMwMF9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF8zMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfMTYsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwXzgsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX1BDUkVMMzIsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX1BDUkVMMTYsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX1BDUkVMOCwgNikKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfR05VX1ZUSU5IRVJJVCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfR05VX1ZURU5UUlksIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwXzI0LCA5KQotICBFTVBUWV9SRUxPQyAgKFJfTU4xMDMwMF9NQVgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBNYWNoaW5lIHZhcmlhbnQgaWYgd2Uga25vdyBpdC4gIFRoaXMgZmllbGQgd2FzIGludmVudGVkIGF0IEN5Z251cywKLSAgIGJ1dCBpdCBpcyBob3BlZCB0aGF0IG90aGVyIHZlbmRvcnMgd2lsbCBhZG9wdCBpdC4gIElmIHNvbWUgc3RhbmRhcmQKLSAgIGlzIGRldmVsb3BlZCwgdGhpcyBjb2RlIHNob3VsZCBiZSBjaGFuZ2VkIHRvIGZvbGxvdyBpdC4gKi8KLQotI2RlZmluZSBFRl9NTjEwMzAwX01BQ0gJCTB4MDBGRjAwMDAKLQotLyogQ3lnbnVzIGlzIGNob29zaW5nIHZhbHVlcyBiZXR3ZWVuIDgwIGFuZCA5RjsKLSAgIDAwIC0gN0Ygc2hvdWxkIGJlIGxlZnQgZm9yIGEgZnV0dXJlIHN0YW5kYXJkOwotICAgdGhlIHJlc3QgYXJlIG9wZW4uICovCi0KLSNkZWZpbmUgRV9NTjEwMzAwX01BQ0hfTU4xMDMwMAkweDAwODEwMDAwCi0jZGVmaW5lIEVfTU4xMDMwMF9NQUNIX0FNMzMJMHgwMDgyMDAwMAotI2VuZGlmIC8qIF9FTEZfTU4xMDMwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9wai5oIGIvaW5jbHVkZS9lbGYvcGouaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiODMwNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9wai5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogcGljb0phdmEgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfUEpfSAotI2RlZmluZSBfRUxGX1BKX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfcGpfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX1BKX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9EQVRBX0RJUjMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfUEpfQ09ERV9SRUwzMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0NPREVfUkVMMTYsIDMpIAotICBSRUxPQ19OVU1CRVIgKFJfUEpfQ09ERV9ESVIzMiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0NPREVfRElSMTYsIDcpICAKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0NPREVfTE8xNiwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9DT0RFX0hJMTYsIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfUEpfR05VX1ZUSU5IRVJJVCwgMTUpCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9HTlVfVlRFTlRSWSwgMTYpCi0gIEVNUFRZX1JFTE9DIChSX1BKX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNkZWZpbmUgRUZfUElDT0pBVkFfQVJDSCAgICAgMHgwMDAwMDAwZgotI2RlZmluZSBFRl9QSUNPSkFWQV9ORVdDQUxMUyAweDAwMDAwMDEwCi0jZGVmaW5lIEVGX1BJQ09KQVZBX0dOVUNBTExTIDB4MDAwMDAwMjAgIC8qIFRoZSAoY3VycmVudGx5KSBub24gc3RhbmRhcmQgR05VIGNhbGxpbmcgY29udmVudGlvbiAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3BwYy5oIGIvaW5jbHVkZS9lbGYvcHBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTE2ZDguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvcHBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyogUFBDIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIEJ5IE1pY2hhZWwgTWVpc3NuZXIsIEN5Z251cyBTdXBwb3J0LCA8bWVpc3NuZXJAY3lnbnVzLmNvbT4sIGZyb20gaW5mb3JtYXRpb24KLSAgIGluIHRoZSBTeXN0ZW0gViBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlLCBQb3dlclBDIFByb2Nlc3NvciBTdXBwbGVtZW50Ci0gICBhbmQgdGhlIFBvd2VyUEMgRW1iZWRkZWQgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSAoZWFiaSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBQUEMgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfUFBDX0gKLSNkZWZpbmUgX0VMRl9QUENfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfcHBjX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjI0LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTZfTE8sIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2X0hJLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNl9IQSwgNikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTQsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE0X0JSVEFLRU4sIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE0X0JSTlRBS0VOLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDI0LCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwxNCwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMTRfQlJUQUtFTiwgMTIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMTRfQlJOVEFLRU4sIDEzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2LCAxNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNl9MTywgMTUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTZfSEksIDE2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2X0hBLCAxNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFRSRUwyNCwgMTgpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQ09QWSwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR0xPQl9EQVQsIDIwKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0pNUF9TTE9ULCAyMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUxBVElWRSwgMjIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfTE9DQUwyNFBDLCAyMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19VQUREUjMyLCAyNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19VQUREUjE2LCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwzMiwgMjYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMzIsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVFJFTDMyLCAyOCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQxNl9MTywgMjkpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMTZfSEksIDMwKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDE2X0hBLCAzMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19TREFSRUwxNiwgMzIpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfU0VDVE9GRiwgMzMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfU0VDVE9GRl9MTywgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfU0VDVE9GRl9ISSwgMzUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfU0VDVE9GRl9IQSwgMzYpCi0KLS8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBmcm9tIHRoZSBFbWJlZGRlZCBFTEYgQUJJLCBhbmQgYXJlIG5vdAotICAgaW4gdGhlIFNWUjQgRUxGIEFCSS4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMzIsIDEwMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNiwgMTAyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2X0xPLCAxMDMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTZfSEksIDEwNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNl9IQSwgMTA1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREFJMTYsIDEwNikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBMkkxNiwgMTA3KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREEyUkVMLCAxMDgpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQTIxLCAxMDkpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX01SS1JFRiwgMTEwKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTRUMxNiwgMTExKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTVF9MTywgMTEyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTVF9ISSwgMTEzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTVF9IQSwgMTE0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9CSVRfRkxELCAxMTUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNEQSwgMTE2KQotCi0gIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBlbmFibGUgQysrIHZ0YWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dOVV9WVElOSEVSSVQsIDI1MykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HTlVfVlRFTlRSWSwgMjU0KQotCi0vKiBUaGlzIGlzIGEgcGhvbnkgcmVsb2MgdG8gaGFuZGxlIGFueSBvbGQgZmFzaGlvbmVkIFRPQzE2IHJlZmVyZW5jZXMKLSAgIHRoYXQgbWF5IHN0aWxsIGJlIGluIG9iamVjdCBmaWxlcy4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfVE9DMTYsIDI1NSkKLQotICBFTVBUWV9SRUxPQyAoUl9QUENfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0jZGVmaW5lCUVGX1BQQ19FTUIJCTB4ODAwMDAwMDAJLyogUG93ZXJQQyBlbWJlZGRlZCBmbGFnICAqLwotCi0JCQkJCQkvKiBDWUdOVVMgbG9jYWwgYml0cyBiZWxvdyAqLwotI2RlZmluZQlFRl9QUENfUkVMT0NBVEFCTEUJMHgwMDAxMDAwMAkvKiBQb3dlclBDIC1tcmVsb2NhdGFibGUgZmxhZyAqLwotI2RlZmluZQlFRl9QUENfUkVMT0NBVEFCTEVfTElCCTB4MDAwMDgwMDAJLyogUG93ZXJQQyAtbXJlbG9jYXRhYmxlLWxpYiBmbGFnICovCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGhlYWRlcnMsIHNoX3R5cGUgZmllbGQgKi8KLQotI2RlZmluZSBTSFRfT1JERVJFRAkJU0hUX0hJUFJPQwkvKiBMaW5rIGVkaXRvciBpcyB0byBzb3J0IHRoZSBcCi0JCQkJCQkgICBlbnRyaWVzIGluIHRoaXMgc2VjdGlvbiBcCi0JCQkJCQkgICBiYXNlZCBvbiB0aGUgYWRkcmVzcyBcCi0JCQkJCQkgICBzcGVjaWZpZWQgaW4gdGhlIGFzc29jaWF0ZWQgXAotCQkJCQkJICAgc3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MsIHNoX2ZsYWdzIGZpZWxkICovCi0KLSNkZWZpbmUgU0hGX0VYQ0xVREUJCTB4ODAwMDAwMDAJLyogTGluayBlZGl0b3IgaXMgdG8gZXhjbHVkZSBcCi0JCQkJCQkgICB0aGlzIHNlY3Rpb24gZnJvbSBleGVjdXRhYmxlIFwKLQkJCQkJCSAgIGFuZCBzaGFyZWQgb2JqZWN0cyB0aGF0IGl0IFwKLQkJCQkJCSAgIGJ1aWxkcyB3aGVuIHRob3NlIG9iamVjdHMgXAotCQkJCQkJICAgYXJlIG5vdCB0byBiZSBmdXJodGVyIFwKLQkJCQkJCSAgIHJlbG9jYXRlZC4gICovCi0jZW5kaWYgLyogX0VMRl9QUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvcmVsb2MtbWFjcm9zLmggYi9pbmNsdWRlL2VsZi9yZWxvYy1tYWNyb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxNzRjYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9yZWxvYy1tYWNyb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBHZW5lcmljIHJlbG9jYXRpb24gc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBieSB0aGUgdmFyaW91cyAqLmggdGFyZ2V0IHNwZWNpZmljIGhlYWRlcgotICAgZmlsZXMgdG8gZWl0aGVyIGdlbmVyYXRlIGFuIGVudW0gY29udGFpbmluZyBhbGwgdGhlIGtub3duIHJlbG9jYXRpb25zCi0gICBmb3IgdGhhdCB0YXJnZXQsIG9yIGlmIFJFTE9DX01BQ1JPU19HRU5fRlVOQyBpcyBkZWZpbmVkLCBhIHJlY29nbml0aW9uCi0gICBmdW5jdGlvbiBpcyBnZW5lcmF0ZWQgaW5zdGVhZC4gIChUaGlzIGlzIHVzZWQgYnkgYmludXRpbHMvcmVhZGVsZi5jKQotCi0gICBHaXZlbiBhIGhlYWRlciBmaWxlIGxpa2UgdGhpczoKLQotICAgCVNUQVJUX1JFTE9DX05VTUJFUlMgKGZvbykKLSAgIAkgICAgUkVMT0NfTlVNQkVSIChSX2Zvb19OT05FLCAgICAwKQotICAgCSAgICBSRUxPQ19OVU1CRVIgKFJfZm9vXzMyLCAgICAgIDEpCi0gICAJICAgIEZBS0VfUkVMT0MgICAoUl9mb29faWxsZWdhbCwgMikKLSAgIAkgICAgRU1QVFlfUkVMT0MgIChSX2Zvb19tYXgpCi0gICAJRU5EX1JFTE9DX05VTUJFUlMKLQotICAgVGhlbiB0aGUgZm9sbG93aW5nIHdpbGwgYmUgcHJvZHVjZWQgYnkgZGVmYXVsdCAoaWUgaWYKLSAgIFJFTE9DX01BQ1JPU19HRU5fRlVOQyBpcyAqbm90KiBkZWZpbmVkKS4KLQotICAgCWVudW0gZm9vCi0JewotCSAgZm9vID0gLTEsCi0gICAJICBSX2Zvb19OT05FID0gMCwKLSAgIAkgIFJfZm9vXzMyID0gMSwKLSAgIAkgIFJfZm9vX2lsbGVnYWwgPSAyLAotICAgCSAgUl9mb29fbWF4Ci0gICAJfTsKLQotICAgSWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DICppcyogZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoZQotICAgZm9sbG93aW5nIGZ1bmN0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkOgotCi0gICAJc3RhdGljIGNvbnN0IGNoYXIgKiBmb28gUEFSQU1TICgodW5zaWduZWQgbG9uZyBydHlwZSkpOwotICAgCXN0YXRpYyBjb25zdCBjaGFyICoKLSAgIAlmb28gKHJ0eXBlKQotICAgCSAgICB1bnNpZ25lZCBsb25nIHJ0eXBlOwotICAgCXsKLSAgIAkgICBzd2l0Y2ggKHJ0eXBlKQotICAgCSAgIHsKLSAgIAkgICBjYXNlIDA6IHJldHVybiAiUl9mb29fTk9ORSI7Ci0gICAJICAgY2FzZSAxOiByZXR1cm4gIlJfZm9vXzMyIjsKLSAgIAkgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsKLSAgIAkgICB9Ci0gICAJfQotICAgKi8KLSAgIAotI2lmbmRlZiBfUkVMT0NfTUFDUk9TX0gKLSNkZWZpbmUgX1JFTE9DX01BQ1JPU19ICi0KLSNpZmRlZiBSRUxPQ19NQUNST1NfR0VOX0ZVTkMKLQotLyogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcmVsb2NhdGlvbiBudW1iZXIgYW5kIHJldHVybnMgdGhlCi0gICBzdHJpbmcgdmVyc2lvbiBuYW1lIG9mIHRoZSBuYW1lIG9mIHRoYXQgcmVsb2NhdGlvbi4gIElmCi0gICB0aGUgcmVsb2NhdGlvbiBpcyBub3QgcmVjb2duaXNlZCwgTlVMTCBpcyByZXR1cm5lZC4gICovCi0KLSNkZWZpbmUgU1RBUlRfUkVMT0NfTlVNQkVSUyhuYW1lKSAgIAkJCQlcCi1zdGF0aWMgY29uc3QgY2hhciAqIG5hbWUgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZyBydHlwZSkpOyAJXAotc3RhdGljIGNvbnN0IGNoYXIgKgkJCQkJCVwKLW5hbWUgKHJ0eXBlKQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBydHlwZTsJCQkJCVwKLXsJCQkJCQkJCVwKLSAgc3dpdGNoIChydHlwZSkJCQkJCQlcCi0gIHsKLQotI2lmZGVmIF9fU1REQ19fCQkJCQkgIAotI2RlZmluZSBSRUxPQ19OVU1CRVIobmFtZSwgbnVtYmVyKSAgY2FzZSBudW1iZXIgOiByZXR1cm4gI25hbWUgOwotI2Vsc2UKLSNkZWZpbmUgUkVMT0NfTlVNQkVSKG5hbWUsIG51bWJlcikgIGNhc2UgbnVtYmVyIDogcmV0dXJuICJuYW1lIiA7Ci0jZW5kaWYKLQotI2RlZmluZSBGQUtFX1JFTE9DKG5hbWUsIG51bWJlcikgICAgCi0jZGVmaW5lIEVNUFRZX1JFTE9DKG5hbWUpCi0JCQkJCSAgCi0jZGVmaW5lIEVORF9SRUxPQ19OVU1CRVJTCVwKLSAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsJXAotICB9CQkJCVwKLX0KLQotCi0jZWxzZSAvKiBEZWZhdWx0IHRvIGdlbmVyYXRpbmcgZW51bS4gICovCi0KLS8qIFNvbWUgY29tcGlsZXJzIGNhbm5vdCBjb3BlIHdpdGggYW4gZW51bSB0aGF0IGVuZHMgd2l0aCBhIHRyYWlsaW5nCi0gICBjb21tYSwgc28gU1RBUlRfUkVMT0NfTlVNQkVSUyBjcmVhdGVzIGEgZmFrZSByZWxvYyBlbnRyeSwgKGluaXRpYWxpc2VkCi0gICB0byAtMSBzbyB0aGF0IHRoZSBmaXJzdCByZWFsIGVudHJ5IHdpbGwgc3RpbGwgZGVmYXVsdCB0byAwKS4gIEZ1cnRoZXIKLSAgIGVudHJpZXMgdGhlbiBwcmVwZW5kIGEgY29tbWEgdG8gdGhlaXIgZGVmaW5pdGlvbnMsIGNyZWF0aW5nIGEgbGlzdAotICAgb2YgZW51bWVyYXRvciBlbnRyaWVzIHRoYXQgd2lsbCBzYXRpc2Z5IHRoZXNlIGNvbXBpbGVycy4gICovCi0jaWZkZWYgX19TVERDX18KLSNkZWZpbmUgU1RBUlRfUkVMT0NfTlVNQkVSUyhuYW1lKSAgIGVudW0gbmFtZSB7IF8jI25hbWUgPSAtMQotI2Vsc2UKLSNkZWZpbmUgU1RBUlRfUkVMT0NfTlVNQkVSUyhuYW1lKSAgIGVudW0gbmFtZSB7IG5hbWUgPSAtMQotI2VuZGlmCi0JCQkJCQkKLSNkZWZpbmUgUkVMT0NfTlVNQkVSKG5hbWUsIG51bWJlcikgICwgbmFtZSA9IG51bWJlcgotI2RlZmluZSBGQUtFX1JFTE9DKG5hbWUsIG51bWJlcikgICAgLCBuYW1lID0gbnVtYmVyIAotI2RlZmluZSBFTVBUWV9SRUxPQyhuYW1lKSAgICAgICAgICAgLCBuYW1lIAotI2RlZmluZSBFTkRfUkVMT0NfTlVNQkVSUyAgICAgICAgICAgfTsKLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBSRUxPQ19NQUNST1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvc2guaCBiL2luY2x1ZGUvZWxmL3NoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZWU1MDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIFNIIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX1NIX0gKLSNkZWZpbmUgX0VMRl9TSF9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLSNkZWZpbmUgRUZfU0hfTUFDSF9NQVNLCTB4MWYKLSNkZWZpbmUgRUZfU0hfVU5LTk9XTgkgICAwIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gICovCi0jZGVmaW5lIEVGX1NIMQkJICAgMQotI2RlZmluZSBFRl9TSDIJCSAgIDIKLSNkZWZpbmUgRUZfU0gzCQkgICAzCi0jZGVmaW5lIEVGX1NIX0hBU19EU1AoZmxhZ3MpICgoZmxhZ3MpICYgNCkKLSNkZWZpbmUgRUZfU0hfRFNQCSAgIDQKLSNkZWZpbmUgRUZfU0gzX0RTUAkgICA1Ci0jZGVmaW5lIEVGX1NIX0hBU19GUChmbGFncykgKChmbGFncykgJiA4KQotI2RlZmluZSBFRl9TSDNFCQkgICA4Ci0jZGVmaW5lIEVGX1NINAkJICAgOQotCi0jZGVmaW5lIEVGX1NIX01FUkdFX01BQ0gobWFjaDEsIG1hY2gyKSBcCi0gICgoKCgobWFjaDEpID09IEVGX1NIMyB8fCAobWFjaDEpID09IEVGX1NIX1VOS05PV04pICYmIChtYWNoMikgPT0gRUZfU0hfRFNQKSBcCi0gICAgfHwgKChtYWNoMSkgPT0gRUZfU0hfRFNQIFwKLQkmJiAoKG1hY2gyKSA9PSBFRl9TSDMgfHwgKG1hY2gyKSA9PSBFRl9TSF9VTktOT1dOKSkpIFwKLSAgID8gRUZfU0gzX0RTUCBcCi0gICA6ICgoKG1hY2gxKSA8IEVGX1NIMyAmJiAobWFjaDIpID09IEVGX1NIX1VOS05PV04pIFwKLSAgICAgIHx8ICgobWFjaDIpIDwgRUZfU0gzICYmIChtYWNoMSkgPT0gRUZfU0hfVU5LTk9XTikpIFwKLSAgID8gRUZfU0gzIFwKLSAgIDogKCgobWFjaDEpID09IEVGX1NIM0UgJiYgKG1hY2gyKSA9PSBFRl9TSF9VTktOT1dOKSBcCi0gICAgICB8fCAoKG1hY2gyKSA9PSBFRl9TSDNFICYmIChtYWNoMSkgPT0gRUZfU0hfVU5LTk9XTikpIFwKLSAgID8gRUZfU0g0IFwKLSAgIDogKChtYWNoMSkgPiAobWFjaDIpID8gKG1hY2gxKSA6IChtYWNoMikpKQotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi0vKiBSZWxvY2F0aW9ucyAyNWZmIGFyZSBHTlUgZXh0ZW5zaW9ucy4KLSAgIDI1Li4zMyBhcmUgdXNlZCBmb3IgcmVsYXhhdGlvbiBhbmQgdXNlIHRoZSBzYW1lIGNvbnN0YW50cyBhcyBDT0ZGIHVzZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3NoX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9SRUwzMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXUE4sIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9JTkQxMlcsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4V1BMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOFdQWiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhCUCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOEwsIDkpCi0gIEZBS0VfUkVMT0MgKFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQywgMTApCi0gIEZBS0VfUkVMT0MgKFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCAyNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDE2LCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDMyLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1VTRVMsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09VTlQsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQUxJR04sIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09ERSwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9EQVRBLCAzMSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0xBQkVMLCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDgsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfR05VX1ZUSU5IRVJJVCwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9HTlVfVlRFTlRSWSwgMzUpCi0gIEVNUFRZX1JFTE9DIChSX1NIX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvc3BhcmMuaCBiL2luY2x1ZGUvZWxmL3NwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MGU0YTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKiBTUEFSQyBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgRG91ZyBFdmFucywgQ3lnbnVzIFN1cHBvcnQsIDxkamVAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX1NQQVJDX0gKLSNkZWZpbmUgX0VMRl9TUEFSQ19ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IFN1bi4gICovCi0KLSNkZWZpbmUgRUZfU1BBUkNfMzJQTFVTX01BU0sJMHhmZmZmMDAJLyogYml0cyBpbmRpY2F0aW5nIFY4KyB0eXBlICovCi0jZGVmaW5lIEVGX1NQQVJDXzMyUExVUwkJMHgwMDAxMDAJLyogZ2VuZXJpYyBWOCsgZmVhdHVyZXMgKi8KLSNkZWZpbmUgRUZfU1BBUkNfU1VOX1VTMQkweDAwMDIwMAkvKiBTdW4gVWx0cmFTUEFSQzEgZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBFRl9TUEFSQ19IQUxfUjEJCTB4MDAwNDAwCS8qIEhBTCBSMSBleHRlbnNpb25zICovCi0jZGVmaW5lIEVGX1NQQVJDX1NVTl9VUzMJMHgwMDA4MDAJLyogU3VuIFVsdHJhU1BBUkNJSUkgZXh0ZW5zaW9ucyAqLwotCi0jZGVmaW5lIEVGX1NQQVJDX0xFREFUQSAgICAgICAgIDB4ODAwMDAwCS8qIGxpdHRsZSBlbmRpYW4gZGF0YSAqLwotCi0vKiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUgVjkgQUJJLiAgKi8KLSNkZWZpbmUgRUZfU1BBUkNfRVhUX01BU0sJMHhmZmZmMDAJLyogcmVzZXJ2ZWQgZm9yIHZlbmRvciBleHRlbnNpb25zICovCi0KLS8qIFY5IG1lbW9yeSBtb2RlbHMgKi8KLSNkZWZpbmUgRUZfU1BBUkNWOV9NTQkJMHgzCQkvKiBtZW1vcnkgbW9kZWwgbWFzayAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X1RTTwkJMHgwCQkvKiB0b3RhbCBzdG9yZSBvcmRlcmluZyAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X1BTTwkJMHgxCQkvKiBwYXJ0aWFsIHN0b3JlIG9yZGVyaW5nICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfUk1PCQkweDIJCS8qIHJlbGF4ZWQgc3RvcmUgb3JkZXJpbmcgKi8KLQotLyogU2VjdGlvbiBpbmRpY2VzLiAgKi8KLQotI2RlZmluZSBTSE5fQkVGT1JFCQkweGZmMDAJCS8qIHVzZWQgd2l0aCBTSEZfT1JERVJFRCAqLwotI2RlZmluZSBTSE5fQUZURVIJCTB4ZmYwMQkJLyogdXNlZCB3aXRoIFNIRl9PUkRFUkVEICovCi0KLS8qIFNlY3Rpb24gZmxhZ3MuICAqLwotCi0jZGVmaW5lIFNIRl9FWENMVURFCQkweDgwMDAwMDAwCS8qIGV4Y2x1ZGUgZnJvbSBsaW5raW5nICovCi0jZGVmaW5lIFNIRl9PUkRFUkVECQkweDQwMDAwMDAwCS8qIHRyZWF0IHNoX2xpbmssc2hfaW5mbyBzcGVjaWFsbHkgKi8KLQotLyogU3ltYm9sIHR5cGVzLiAgKi8KLQotI2RlZmluZSBTVFRfUkVHSVNURVIJCTEzCQkvKiBnbG9iYWwgcmVnIHJlc2VydmVkIHRvIGFwcC4gKi8KLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfc3BhcmNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ184LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTYsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18zMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1A4LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDE2LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AzMCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMjIsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISTIyLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMjIsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTMsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE8xMCwgMTIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HT1QxMCwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HT1QxMywgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HT1QyMiwgMTUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQzEwLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDMjIsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV1BMVDMwLCAxOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0NPUFksIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR0xPQl9EQVQsIDIwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSk1QX1NMT1QsIDIxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUkVMQVRJVkUsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVUEzMiwgMjMpCi0KLSAgLyogPz8/IFRoZXNlIDYgcmVsb2NzIGFyZSBuZXcgYnV0IG5vdCBjdXJyZW50bHkgdXNlZC4gIEZvciBiaW5hcnkKLSAgICAgY29tcGF0aWxpdHkgaW4gdGhlIHNwYXJjNjQtZWxmIHRvb2xjaGFpbiwgd2UgbGVhdmUgdGhlbSBvdXQuCi0gICAgIEEgbm9uLWJpbmFyeSB1cHdhcmQgY29tcGF0aWJsZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgZm9yIHNwYXJjNjQtZWxmLiAgKi8KLSNpZm5kZWYgU1BBUkM2NF9PTERfUkVMT0NTCi0gIC8qID8/PyBOZXcgcmVsb2NzIG9uIHRoZSBVbHRyYVNQQVJDLiAgTm90IHN1cmUgd2hhdCB0aGV5J3JlIGZvciB5ZXQuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUExUMzIsIDI0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSElQTFQyMiwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MT1BMVDEwLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDUExUMzIsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENQTFQyMiwgMjgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ1BMVDEwLCAyOSkKLSNlbmRpZgotCi0gIC8qIHY5IHJlbG9jcyAqLwotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTAsIDMwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTEsIDMxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNjQsIDMyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfT0xPMTAsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSEgyMiwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ITTEwLCAzNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xNMjIsIDM2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENfSEgyMiwgMzcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ19ITTEwLCAzOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDX0xNMjIsIDM5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AxNiwgNDApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDE5LCA0MSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VOVVNFRF80MiwgNDIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ183LCA0MykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzUsIDQ0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNiwgNDUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQNjQsIDQ2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUExUNjQsIDQ3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSElYMjIsIDQ4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE9YMTAsIDQ5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSDQ0LCA1MCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX000NCwgNTEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MNDQsIDUyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUkVHSVNURVIsIDUzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVUE2NCwgNTQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VQTE2LCA1NSkKLQotICAvKiBsaXR0bGUgZW5kaWFuIGRhdGEgcmVsb2NzICovCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19SRVYzMiwgNTYpCi0KLSAgRU1QVFlfUkVMT0MgIChSX1NQQVJDX21heF9zdGQpCi0KLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dOVV9WVElOSEVSSVQsIDI1MCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dOVV9WVEVOVFJZLCAyNTEpCi0KLSAgRU1QVFlfUkVMT0MgIChSX1NQQVJDX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIFJlbG9jYXRpb24gbWFjcm9zLiAgKi8KLQotI2RlZmluZSBFTEY2NF9SX1RZUEVfREFUQShpbmZvKSBcCi0gICgoKGJmZF9zaWduZWRfdm1hKShFTEY2NF9SX1RZUEUoaW5mbykgPj4gOCkgXiAweDgwMDAwMCkgLSAweDgwMDAwMCkKLSNkZWZpbmUgRUxGNjRfUl9UWVBFX0lEKGluZm8pIFwKLSAgKChpbmZvKSAmIDB4ZmYpCi0jZGVmaW5lIEVMRjY0X1JfVFlQRV9JTkZPKGRhdGEsIHR5cGUpIFwKLSAgKCgoYmZkX3ZtYSkgKChkYXRhKSAmIDB4ZmZmZmZmKSA8PCA4KSB8IChiZmRfdm1hKSAodHlwZSkpCi0KLS8qIFZhbHVlcyBmb3IgRWxmNjRfRHluLmRfdGFnLiAgKi8KLQotI2RlZmluZSBEVF9TUEFSQ19SRUdJU1RFUgkweDcwMDAwMDAxCi0KLSNlbmRpZiAvKiBfRUxGX1NQQVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3Y4NTAuaCBiL2luY2x1ZGUvZWxmL3Y4NTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0M2I3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi92ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogVjg1MCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ3JlYXRlZCBieSBNaWNoYWVsIE1laXNzbmVyLCBDeWdudXMgU3VwcG9ydCA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1JUFMgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfVjg1MF9ICi0jZGVmaW5lIF9FTEZfVjg1MF9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIEZvdXIgYml0IFY4NTAgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfVjg1MF9BUkNICQkweGYwMDAwMDAwCi0KLS8qIHY4NTAgY29kZS4gICovCi0jZGVmaW5lIEVfVjg1MF9BUkNICQkweDAwMDAwMDAwCi0KLS8qIHY4NTBlIGNvZGUuICAqLwotI2RlZmluZSBFX1Y4NTBFX0FSQ0gJCTB4MTAwMDAwMDAKLQotLyogdjg1MGVhIGNvZGUuICAqLwotI2RlZmluZSBFX1Y4NTBFQV9BUkNICQkweDIwMDAwMDAwCi0KLQotLyogRmxhZ3MgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCAqLwotI2RlZmluZSBWODUwX09USEVSX1NEQQkJMHgwMQkvKiBzeW1ib2wgaGFkIFNEQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1pEQQkJMHgwMgkvKiBzeW1ib2wgaGFkIFpEQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1REQQkJMHgwNAkvKiBzeW1ib2wgaGFkIFREQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1REQV9CWVRFCTB4MDgJLyogc3ltYm9sIGhhZCBUREEgYnl0ZSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX0VSUk9SCTB4ODAJLyogc3ltYm9sIGhhZCBhbiBlcnJvciByZXBvcnRlZCAqLwotCi0vKiBWODUwIHJlbG9jYXRpb25zICovCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTICh2ODUwX3JlbG9jX3R5cGUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX05PTkUsIDApCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzlfUENSRUwsIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzIyX1BDUkVMLCAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9ISTE2X1MsIDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0hJMTYsIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0xPMTYsIDUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzMyLCA2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF8xNiwgNykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfOCwgOCkKLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwgOSkJCS8qIEZvciBsZC5iLCBzdC5iLCBzZXQxLCBjbHIxLCBub3QxLCB0c3QxLCBtb3ZlYSwgbW92aGkgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwgMTApCQkvKiBGb3IgbGQudywgbGQuaCwgbGQuaHUsIHN0LncsIHN0LmggKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwgMTEpCQkvKiBGb3IgbGQuYiwgc3QuYiwgc2V0MSwgY2xyMSwgbm90MSwgdHN0MSwgbW92ZWEsIG1vdmhpICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQsIDEyKQkJLyogRm9yIGxkLncsIGxkLmgsIGxkLmh1LCBzdC53LCBzdC5oICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV82XzhfT0ZGU0VULCAxMykJCS8qIEZvciBzc3Qudywgc2xkLncgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzdfOF9PRkZTRVQsIDE0KQkJLyogRm9yIHNzdC5oLCBzbGQuaCAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfN183X09GRlNFVCwgMTUpCQkvKiBGb3Igc3N0LmIsIHNsZC5iICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV8xNl8xNl9PRkZTRVQsIDE2KQkJLyogRm9yIHNldDEsIGNscjEsIG5vdDEsIHRzdDEsIG1vdmVhLCBtb3ZoaSAqLwotLyogQ1lHTlVTIExPQ0FMIHY4NTBlICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV80XzVfT0ZGU0VULCAxNykJCS8qIEZvciBzbGQuaHUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzRfNF9PRkZTRVQsIDE4KQkJLyogRm9yIHNsZC5idSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULCAxOSkJLyogRm9yIGxkLmJ1ICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsIDIwKQkvKiBGb3IgbGQuYnUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwgMjEpCQkvKiBGb3IgY2FsbHQgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULCAyMikJLyogRm9yIGNhbGx0ICovCi0vKiBFTkQgQ1lHTlVTIExPQ0FMICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0dOVV9WVElOSEVSSVQsIDIzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9HTlVfVlRFTlRSWSwgMjQpCi0KLSAgICAgRU1QVFlfUkVMT0MgKFJfVjg1MF9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIFNtYWxsIGRhdGEgYXJlYSBjb21tb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX1Y4NTBfU0NPTU1PTgkweGZmMDAKLQotLyogVGlueSBkYXRhIGFyZWEgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9WODUwX1RDT01NT04JMHhmZjAxCi0KLS8qIFplcm8gZGF0YSBhcmVhIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fVjg1MF9aQ09NTU9OCTB4ZmYwMgotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIC5zY29tbW9uIGRhdGEuICAqLwotI2RlZmluZSBTSFRfVjg1MF9TQ09NTU9OCTB4NzAwMDAwMDAKLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgLnNjb21tb24gZGF0YS4gICovCi0jZGVmaW5lIFNIVF9WODUwX1RDT01NT04JMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSAuc2NvbW1vbiBkYXRhLiAgKi8KLSNkZWZpbmUgU0hUX1Y4NTBfWkNPTU1PTgkweDcwMDAwMDAyCi0KLQotI2VuZGlmIC8qIF9FTEZfVjg1MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmggYi9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGFjYTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mbG9hdGZvcm1hdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIElFRUUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBkZWNsYXJhdGlvbnMsIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChGTE9BVEZPUk1BVF9IKQotI2RlZmluZSBGTE9BVEZPUk1BVF9IIDEKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEEgZmxvYXRmb3JtYXQgY29uc2lzdHMgb2YgYSBzaWduIGJpdCwgYW4gZXhwb25lbnQgYW5kIGEgbWFudGlzc2EuICBPbmNlIHRoZQotICAgYnl0ZXMgYXJlIGNvbmNhdGVuYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGJ5dGVvcmRlciBmbGFnLCB0aGVuIGVhY2ggb2YgdGhvc2UKLSAgIGZpZWxkcyBpcyBjb250aWd1b3VzLiAgV2UgbnVtYmVyIHRoZSBiaXRzIHdpdGggMCBiZWluZyB0aGUgbW9zdCBzaWduaWZpY2FudAotICAgKGkuZS4gQklUU19CSUdfRU5ESUFOIHR5cGUgbnVtYmVyaW5nKSwgYW5kIHNwZWNpZnkgd2hpY2ggYml0cyBlYWNoIGZpZWxkCi0gICBjb250YWlucyB3aXRoIHRoZSAqX3N0YXJ0IGFuZCAqX2xlbiBmaWVsZHMuICAqLwotCi0vKiBXaGF0IGlzIHRoZSBvcmRlciBvZiB0aGUgYnl0ZXMuICovCi0KLWVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyB7Ci0KLSAgLyogU3RhbmRhcmQgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLgotICAgICBFWDogMS4yMzQ1Njc4ZTEwID0+IDAwIDAwIDgwIGM1IGUwIGZlIDA2IDQyICovCi0KLSAgZmxvYXRmb3JtYXRfbGl0dGxlLAotCi0gIC8qIFN0YW5kYXJkIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci4KLSAgICAgRVg6IDEuMjM0NTY3OGUxMCA9PiA0MiAwNiBmZSBlMCBjNSA4MCAwMCAwMCAqLwotCi0gIGZsb2F0Zm9ybWF0X2JpZywKLQotICAvKiBMaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgYnV0IGJpZyBlbmRpYW4gd29yZCBvcmRlci4KLSAgICAgRVg6IDEuMjM0NTY3OGUxMCA9PiBlMCBmZSAwNiA0MiAwMCAwMCA4MCBjNSAqLwotCi0gIGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZAotCi19OwotCi1lbnVtIGZsb2F0Zm9ybWF0X2ludGJpdCB7IGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubyB9OwotCi1zdHJ1Y3QgZmxvYXRmb3JtYXQKLXsKLSAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIGJ5dGVvcmRlcjsKLSAgdW5zaWduZWQgaW50IHRvdGFsc2l6ZTsJLyogVG90YWwgc2l6ZSBvZiBudW1iZXIgaW4gYml0cyAqLwotCi0gIC8qIFNpZ24gYml0IGlzIGFsd2F5cyBvbmUgYml0IGxvbmcuICAxIG1lYW5zIG5lZ2F0aXZlLCAwIG1lYW5zIHBvc2l0aXZlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpZ25fc3RhcnQ7Ci0KLSAgdW5zaWduZWQgaW50IGV4cF9zdGFydDsKLSAgdW5zaWduZWQgaW50IGV4cF9sZW47Ci0gIC8qIEFtb3VudCBhZGRlZCB0byAidHJ1ZSIgZXhwb25lbnQuICAweDNmZmYgZm9yIG1hbnkgSUVFRSBleHRlbmRlZHMuICAqLwotICB1bnNpZ25lZCBpbnQgZXhwX2JpYXM7Ci0gIC8qIEV4cG9uZW50IHZhbHVlIHdoaWNoIGluZGljYXRlcyBOYU4uICBUaGlzIGlzIHRoZSBhY3R1YWwgdmFsdWUgc3RvcmVkIGluCi0gICAgIHRoZSBmbG9hdCwgbm90IGFkanVzdGVkIGJ5IHRoZSBleHBfYmlhcy4gIFRoaXMgdXN1YWxseSBjb25zaXN0cyBvZiBhbGwKLSAgICAgb25lIGJpdHMuICAqLwotICB1bnNpZ25lZCBpbnQgZXhwX25hbjsKLQotICB1bnNpZ25lZCBpbnQgbWFuX3N0YXJ0OwotICB1bnNpZ25lZCBpbnQgbWFuX2xlbjsKLQotICAvKiBJcyB0aGUgaW50ZWdlciBiaXQgZXhwbGljaXQgb3IgaW1wbGljaXQ/ICAqLwotICBlbnVtIGZsb2F0Zm9ybWF0X2ludGJpdCBpbnRiaXQ7Ci19OwotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIElFRUUgc2luZ2xlIGFuZCBkb3VibGUsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbi4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGU7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlOwotCi0vKiBmbG9hdGZvcm1hdCBmb3IgQVJNIElFRUUgZG91YmxlLCBsaXR0bGUgZW5kaWFuIGJ5dGVzIGFuZCBiaWcgZW5kaWFuIHdvcmRzICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkOwotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIHZhcmlvdXMgZXh0ZW5kZWRzLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pMzg3X2V4dDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTY4ODgxX2V4dDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTk2MF9leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X204ODExMF9leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2FybV9leHQ7Ci0KLS8qIENvbnZlcnQgZnJvbSBGTVQgdG8gYSBkb3VibGUuCi0gICBGUk9NIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbmRlZCBmbG9hdC4KLSAgIFN0b3JlIHRoZSBkb3VibGUgaW4gKlRPLiAgKi8KLQotZXh0ZXJuIHZvaWQKLWZsb2F0Zm9ybWF0X3RvX2RvdWJsZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKiwgY2hhciAqLCBkb3VibGUgKikpOwotCi0vKiBUaGUgY29udmVyc2U6IGNvbnZlcnQgdGhlIGRvdWJsZSAqRlJPTSB0byBGTVQKLSAgIGFuZCBzdG9yZSB3aGVyZSBUTyBwb2ludHMuICAqLwotCi1leHRlcm4gdm9pZAotZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgUEFSQU1TICgoY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICosCi0JCQkJIGRvdWJsZSAqLCBjaGFyICopKTsKLQotI2VuZGlmCS8qIGRlZmluZWQgKEZMT0FURk9STUFUX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZubWF0Y2guaCBiL2luY2x1ZGUvZm5tYXRjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWViNzAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm5tYXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1OT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQHByZXAuYWkubWl0LmVkdS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYJX0ZOTUFUQ0hfSAotCi0jZGVmaW5lCV9GTk1BVENIX0gJMQotCi0jaWZkZWYJX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykgfHwgKGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXykKLSN1bmRlZglfX1AKLSNkZWZpbmUJX19QKGFyZ3MpCWFyZ3MKLSNlbHNlIC8qIE5vdCBDKysgb3IgQU5TSSBDLiAgKi8KLSN1bmRlZglfX1AKLSNkZWZpbmUJX19QKGFyZ3MpCSgpCi0vKiBXZSBjYW4gZ2V0IGF3YXkgd2l0aG91dCBkZWZpbmluZyBgY29uc3QnIGhlcmUgb25seSBiZWNhdXNlIGluIHRoaXMgZmlsZQotICAgaXQgaXMgdXNlZCBvbmx5IGluc2lkZSB0aGUgcHJvdG90eXBlIGZvciBgZm5tYXRjaCcsIHdoaWNoIGlzIGVsaWRlZCBpbgotICAgbm9uLUFOU0kgQyB3aGVyZSBgY29uc3QnIGlzIHByb2JsZW1hdGljYWwuICAqLwotI2VuZGlmIC8qIEMrKyBvciBBTlNJIEMuICAqLwotCi0KLS8qIFdlICN1bmRlZiB0aGVzZSBiZWZvcmUgZGVmaW5pbmcgdGhlbSBiZWNhdXNlIHNvbWUgbG9zaW5nIHN5c3RlbXMKLSAgIChIUC1VWCBBLjA4LjA3IGZvciBleGFtcGxlKSBkZWZpbmUgdGhlc2UgaW4gPHVuaXN0ZC5oPi4gICovCi0jdW5kZWYJRk5NX1BBVEhOQU1FCi0jdW5kZWYJRk5NX05PRVNDQVBFCi0jdW5kZWYJRk5NX1BFUklPRAotCi0vKiBCaXRzIHNldCBpbiB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYGZubWF0Y2gnLiAgKi8KLSNkZWZpbmUJRk5NX1BBVEhOQU1FCSgxIDw8IDApIC8qIE5vIHdpbGRjYXJkIGNhbiBldmVyIG1hdGNoIGAvJy4gICovCi0jZGVmaW5lCUZOTV9OT0VTQ0FQRQkoMSA8PCAxKSAvKiBCYWNrc2xhc2hlcyBkb24ndCBxdW90ZSBzcGVjaWFsIGNoYXJzLiAgKi8KLSNkZWZpbmUJRk5NX1BFUklPRAkoMSA8PCAyKSAvKiBMZWFkaW5nIGAuJyBpcyBtYXRjaGVkIG9ubHkgZXhwbGljaXRseS4gICovCi0KLSNpZiAhZGVmaW5lZCAoX1BPU0lYX0NfU09VUkNFKSB8fCBfUE9TSVhfQ19TT1VSQ0UgPCAyIHx8IGRlZmluZWQgKF9HTlVfU09VUkNFKQotI2RlZmluZQlGTk1fRklMRV9OQU1FCUZOTV9QQVRITkFNRSAvKiBQcmVmZXJyZWQgR05VIG5hbWUuICAqLwotI2RlZmluZQlGTk1fTEVBRElOR19ESVIJKDEgPDwgMykgLyogSWdub3JlIGAvLi4uJyBhZnRlciBhIG1hdGNoLiAgKi8KLSNkZWZpbmUJRk5NX0NBU0VGT0xECSgxIDw8IDQpIC8qIENvbXBhcmUgd2l0aG91dCByZWdhcmQgdG8gY2FzZS4gICovCi0jZW5kaWYKLQotLyogVmFsdWUgcmV0dXJuZWQgYnkgYGZubWF0Y2gnIGlmIFNUUklORyBkb2VzIG5vdCBtYXRjaCBQQVRURVJOLiAgKi8KLSNkZWZpbmUJRk5NX05PTUFUQ0gJMQotCi0vKiBNYXRjaCBTVFJJTkcgYWdhaW5zdCB0aGUgZmlsZW5hbWUgcGF0dGVybiBQQVRURVJOLAotICAgcmV0dXJuaW5nIHplcm8gaWYgaXQgbWF0Y2hlcywgRk5NX05PTUFUQ0ggaWYgbm90LiAgKi8KLWV4dGVybiBpbnQgZm5tYXRjaCBfX1AgKChjb25zdCBjaGFyICpfX3BhdHRlcm4sIGNvbnN0IGNoYXIgKl9fc3RyaW5nLAotCQkJIGludCBfX2ZsYWdzKSk7Ci0KLSNpZmRlZglfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBmbm1hdGNoLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZm9wZW4tYmluLmggYi9pbmNsdWRlL2ZvcGVuLWJpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODY4ZjYzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tYmluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBNYWNyb3MgZm9yIHRoZSAndHlwZScgcGFydCBvZiBhbiBmb3BlbiwgZnJlb3BlbiBvciBmZG9wZW4uIAotCi0JPFJlYWR8V3JpdGU+W1VwZGF0ZV08QmluYXJ5IGZpbGV8dGV4dCBmaWxlPgotCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yICJiaW5hcnkiIHN5c3RlbXMsIHdoZXJlIHRleHQgYW5kIGJpbmFyeSBmaWxlcyBhcmUKLSAgIGRpZmZlcmVudC4gIEFuIGV4YW1wbGUgaXMgTWVzcy1Eb3NlLiAgTWFueSBVbml4IHN5c3RlbXMgY291bGQgYWxzbwotICAgY29wZSB3aXRoIGEgImIiIGluIHRoZSBzdHJpbmcsIGluZGljYXRpbmcgYmluYXJ5IGZpbGVzLCBidXQgc29tZSByZWplY3QgdGhpcwotICAgKGFuZCB0aGVyZWJ5IGRvbid0IGNvbmZvcm0gdG8gQU5TSSBDLCBidXQgd2hhdCBlbHNlIGlzIG5ldz8pLgotCi0gICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCi0gICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKLSAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCi0gICB2YXJpYW50IHN5c3RlbXMuICAqLwotCi0jZGVmaW5lIEZPUEVOX1JCCSJyYiIKLSNkZWZpbmUgRk9QRU5fV0IgCSJ3YiIKLSNkZWZpbmUgRk9QRU5fQUIgCSJhYiIKLSNkZWZpbmUgRk9QRU5fUlVCIAkicitiIgotI2RlZmluZSBGT1BFTl9XVUIgCSJ3K2IiCi0jZGVmaW5lIEZPUEVOX0FVQiAJImErYiIKLQotI2RlZmluZSBGT1BFTl9SVAkiciIKLSNkZWZpbmUgRk9QRU5fV1QgCSJ3IgotI2RlZmluZSBGT1BFTl9BVCAJImEiCi0jZGVmaW5lIEZPUEVOX1JVVCAJInIrIgotI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKLSNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZvcGVuLXNhbWUuaCBiL2luY2x1ZGUvZm9wZW4tc2FtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM3NTI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tc2FtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogTWFjcm9zIGZvciB0aGUgJ3R5cGUnIHBhcnQgb2YgYW4gZm9wZW4sIGZyZW9wZW4gb3IgZmRvcGVuLiAKLQotCTxSZWFkfFdyaXRlPltVcGRhdGVdPEJpbmFyeSBmaWxlfHRleHQgZmlsZT4KLQotICAgVGhpcyB2ZXJzaW9uIGlzIGZvciAic2FtZSIgc3lzdGVtcywgd2hlcmUgdGV4dCBhbmQgYmluYXJ5IGZpbGVzIGFyZQotICAgdGhlIHNhbWUuICBBbiBleGFtcGxlIGlzIFVuaXguICBNYW55IFVuaXggc3lzdGVtcyBjb3VsZCBhbHNvIGFkZCBhCi0gICAiYiIgdG8gdGhlIHN0cmluZywgaW5kaWNhdGluZyBiaW5hcnkgZmlsZXMsIGJ1dCBzb21lIHJlamVjdCB0aGlzCi0gICAoYW5kIHRoZXJlYnkgZG9uJ3QgY29uZm9ybSB0byBBTlNJIEMsIGJ1dCB3aGF0IGVsc2UgaXMgbmV3PykuCi0KLSAgIFRoaXMgZmlsZSBpcyBkZXNpZ25lZCBmb3IgaW5jbHVzaW9uIGJ5IGhvc3QtZGVwZW5kZW50IC5oIGZpbGVzLiAgTm8KLSAgIHVzZXIgYXBwbGljYXRpb24gc2hvdWxkIGluY2x1ZGUgaXQgZGlyZWN0bHksIHNpbmNlIHRoYXQgd291bGQgbWFrZQotICAgdGhlIGFwcGxpY2F0aW9uIHVuYWJsZSB0byBiZSBjb25maWd1cmVkIGZvciBib3RoICJzYW1lIiBhbmQgImJpbmFyeSIKLSAgIHZhcmlhbnQgc3lzdGVtcy4gICovCi0KLSNkZWZpbmUgRk9QRU5fUkIJInIiCi0jZGVmaW5lIEZPUEVOX1dCIAkidyIKLSNkZWZpbmUgRk9QRU5fQUIgCSJhIgotI2RlZmluZSBGT1BFTl9SVUIgCSJyKyIKLSNkZWZpbmUgRk9QRU5fV1VCIAkidysiCi0jZGVmaW5lIEZPUEVOX0FVQiAJImErIgotCi0jZGVmaW5lIEZPUEVOX1JUCSJyIgotI2RlZmluZSBGT1BFTl9XVCAJInciCi0jZGVmaW5lIEZPUEVOX0FUIAkiYSIKLSNkZWZpbmUgRk9QRU5fUlVUIAkicisiCi0jZGVmaW5lIEZPUEVOX1dVVCAJIncrIgotI2RlZmluZSBGT1BFTl9BVVQgCSJhKyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZm9wZW4tdm1zLmggYi9pbmNsdWRlL2ZvcGVuLXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTc2YjdmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tdm1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiBNYWNyb3MgZm9yIHRoZSAndHlwZScgcGFydCBvZiBhbiBmb3BlbiwgZnJlb3BlbiBvciBmZG9wZW4uIAotCi0JPFJlYWR8V3JpdGU+W1VwZGF0ZV08QmluYXJ5IGZpbGV8dGV4dCBmaWxlPgotCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yIFZNUyBzeXN0ZW1zLCB3aGVyZSB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMgYXJlCi0gICBkaWZmZXJlbnQuCi0gICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCi0gICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKLSAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCi0gICB2YXJpYW50IHN5c3RlbXMuICAqLwotCi0jZGVmaW5lIEZPUEVOX1JCCSJyYiIsInJmbT12YXIiCi0jZGVmaW5lIEZPUEVOX1dCIAkid2IiLCJyZm09dmFyIgotI2RlZmluZSBGT1BFTl9BQiAJImFiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fUlVCIAkicitiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fV1VCIAkidytiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fQVVCIAkiYStiIiwicmZtPXZhciIKLQotI2RlZmluZSBGT1BFTl9SVAkiciIKLSNkZWZpbmUgRk9QRU5fV1QgCSJ3IgotI2RlZmluZSBGT1BFTl9BVCAJImEiCi0jZGVmaW5lIEZPUEVOX1JVVCAJInIrIgotI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKLSNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkYm0uaCBiL2luY2x1ZGUvZ2RibS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJjMjZkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ2RibS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogR05VIERCTSAtIERhdGFCYXNlIE1hbmFnZXIgaW5jbHVkZSBmaWxlCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBoaWxpcCBBLiBOZWxzb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFlvdSBtYXkgY29udGFjdCB0aGUgYXV0aG9yIGJ5OgotICAgICAgIGUtbWFpbDogIHBoaWxAd3d1LmVkdQotICAgICAgdXMtbWFpbDogIFBoaWxpcCBBLiBOZWxzb24KLSAgICAgICAgICAgICAgICBDb21wdXRlciBTY2llbmNlIERlcGFydG1lbnQKLSAgICAgICAgICAgICAgICBXZXN0ZXJuIFdhc2hpbmd0b24gVW5pdmVyc2l0eQotICAgICAgICAgICAgICAgIEJlbGxpbmdoYW0sIFdBIDk4MjI2Ci0gICAgICAgIHBob25lOiAgKDIwNikgNjc2LTMwMzUKLSAgICAgICAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFBhcmFtZXRlcnMgdG8gZ2RibV9vcGVuIGZvciBSRUFERVJTLCBXUklURVJTLCBhbmQgV1JJVEVSUyB3aG8KLSAgIGNhbiBjcmVhdGUgdGhlIGRhdGFiYXNlLiAqLwotI2RlZmluZSAgR0RCTV9SRUFERVIgIDAKLSNkZWZpbmUgIEdEQk1fV1JJVEVSICAxCi0jZGVmaW5lICBHREJNX1dSQ1JFQVQgMgotI2RlZmluZSAgR0RCTV9ORVdEQiAgIDMKLQotLyogUGFyYW1ldGVycyB0byBnZGJtX3N0b3JlIGZvciBzaW1wbGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2VtZW50LiAqLwotI2RlZmluZSAgR0RCTV9JTlNFUlQgIDAKLSNkZWZpbmUgIEdEQk1fUkVQTEFDRSAxCi0KLQotLyogVGhlIGRhdGEgYW5kIGtleSBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKmRwdHI7Ci0JaW50ICAgZHNpemU7Ci0gICAgICB9IGRhdHVtOwotCi0KLS8qIFRoZSBmaWxlIGluZm9ybWF0aW9uIGhlYWRlci4gVGhpcyBpcyBnb29kIGVub3VnaCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuICovCi10eXBlZGVmIHN0cnVjdCB7aW50IGR1bW15WzEwXTt9ICpHREJNX0ZJTEU7Ci0KLQotLyogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyEgKi8KLQotZXh0ZXJuIEdEQk1fRklMRSBnZGJtX29wZW4gKCk7Ci0KLWV4dGVybiB2b2lkCSBnZGJtX2Nsb3NlICgpOwotCi1leHRlcm4gZGF0dW0JIGdkYm1fZmV0Y2ggKCk7Ci0KLWV4dGVybiBpbnQJIGdkYm1fc3RvcmUgKCk7Ci0KLWV4dGVybiBpbnQJIGdkYm1fZGVsZXRlICgpOwotCi1leHRlcm4gZGF0dW0JIGdkYm1fZmlyc3RrZXkgKCk7Ci0KLWV4dGVybiBkYXR1bQkgZ2RibV9uZXh0a2V5ICgpOwotCi1leHRlcm4gaW50CSBnZGJtX3Jlb3JnYW5pemUgKCk7Ci0KLQotLyogZ2RibSBzZW5kcyBiYWNrIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgaW4gdGhlIHZhcmlhYmxlIGdkYm1fZXJybm8uICovCi10eXBlZGVmIGVudW0gewlOT19FUlJPUiwKLQkJTUFMTE9DX0VSUk9SLAotCQlCTE9DS19TSVpFX0VSUk9SLAotCQlGSUxFX09QRU5fRVJST1IsCi0JCUZJTEVfV1JJVEVfRVJST1IsCi0JCUZJTEVfU0VFS19FUlJPUiwKLQkJRklMRV9SRUFEX0VSUk9SLAotCQlCQURfTUFHSUNfTlVNQkVSLAotCQlFTVBUWV9EQVRBQkFTRSwKLQkJQ0FOVF9CRV9SRUFERVIsCi0JICAgICAgICBDQU5UX0JFX1dSSVRFUiwKLQkJUkVBREVSX0NBTlRfUkVDT1ZFUiwKLQkJUkVBREVSX0NBTlRfREVMRVRFLAotCQlSRUFERVJfQ0FOVF9TVE9SRSwKLQkJUkVBREVSX0NBTlRfUkVPUkdBTklaRSwKLQkJVU5LTk9XTl9VUERBVEUsCi0JCUlURU1fTk9UX0ZPVU5ELAotCQlSRU9SR0FOSVpFX0ZBSUxFRCwKLQkJQ0FOTk9UX1JFUExBQ0V9Ci0JZ2RibV9lcnJvcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2V0b3B0LmggYi9pbmNsdWRlL2dldG9wdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjMwNzE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ2V0b3B0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIGZvciBnZXRvcHQuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksOTAsOTEsOTIsOTMsOTQsOTYsOTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX0dFVE9QVF9ICi0jZGVmaW5lIF9HRVRPUFRfSCAxCi0KLSNpZmRlZglfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogRm9yIGNvbW11bmljYXRpb24gZnJvbSBgZ2V0b3B0JyB0byB0aGUgY2FsbGVyLgotICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBhbiBhcmd1bWVudCwKLSAgIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBoZXJlLgotICAgQWxzbywgd2hlbiBgb3JkZXJpbmcnIGlzIFJFVFVSTl9JTl9PUkRFUiwKLSAgIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4gICovCi0KLWV4dGVybiBjaGFyICpvcHRhcmc7Ci0KLS8qIEluZGV4IGluIEFSR1Ygb2YgdGhlIG5leHQgZWxlbWVudCB0byBiZSBzY2FubmVkLgotICAgVGhpcyBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHRvIGFuZCBmcm9tIHRoZSBjYWxsZXIKLSAgIGFuZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gYGdldG9wdCcuCi0KLSAgIE9uIGVudHJ5IHRvIGBnZXRvcHQnLCB6ZXJvIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGw7IGluaXRpYWxpemUuCi0KLSAgIFdoZW4gYGdldG9wdCcgcmV0dXJucyAtMSwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIHRoZQotICAgbm9uLW9wdGlvbiBlbGVtZW50cyB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGl0c2VsZiBzY2FuLgotCi0gICBPdGhlcndpc2UsIGBvcHRpbmQnIGNvbW11bmljYXRlcyBmcm9tIG9uZSBjYWxsIHRvIHRoZSBuZXh0Ci0gICBob3cgbXVjaCBvZiBBUkdWIGhhcyBiZWVuIHNjYW5uZWQgc28gZmFyLiAgKi8KLQotZXh0ZXJuIGludCBvcHRpbmQ7Ci0KLS8qIENhbGxlcnMgc3RvcmUgemVybyBoZXJlIHRvIGluaGliaXQgdGhlIGVycm9yIG1lc3NhZ2UgYGdldG9wdCcgcHJpbnRzCi0gICBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMuICAqLwotCi1leHRlcm4gaW50IG9wdGVycjsKLQotLyogU2V0IHRvIGFuIG9wdGlvbiBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVucmVjb2duaXplZC4gICovCi0KLWV4dGVybiBpbnQgb3B0b3B0OwotCi0vKiBEZXNjcmliZSB0aGUgbG9uZy1uYW1lZCBvcHRpb25zIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICBUaGUgTE9OR19PUFRJT05TIGFyZ3VtZW50IHRvIGdldG9wdF9sb25nIG9yIGdldG9wdF9sb25nX29ubHkgaXMgYSB2ZWN0b3IKLSAgIG9mIGBzdHJ1Y3Qgb3B0aW9uJyB0ZXJtaW5hdGVkIGJ5IGFuIGVsZW1lbnQgY29udGFpbmluZyBhIG5hbWUgd2hpY2ggaXMKLSAgIHplcm8uCi0KLSAgIFRoZSBmaWVsZCBgaGFzX2FyZycgaXM6Ci0gICBub19hcmd1bWVudAkJKG9yIDApIGlmIHRoZSBvcHRpb24gZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudCwKLSAgIHJlcXVpcmVkX2FyZ3VtZW50CShvciAxKSBpZiB0aGUgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LAotICAgb3B0aW9uYWxfYXJndW1lbnQgCShvciAyKSBpZiB0aGUgb3B0aW9uIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgotCi0gICBJZiB0aGUgZmllbGQgYGZsYWcnIGlzIG5vdCBOVUxMLCBpdCBwb2ludHMgdG8gYSB2YXJpYWJsZSB0aGF0IGlzIHNldAotICAgdG8gdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBmaWVsZCBgdmFsJyB3aGVuIHRoZSBvcHRpb24gaXMgZm91bmQsIGJ1dAotICAgbGVmdCB1bmNoYW5nZWQgaWYgdGhlIG9wdGlvbiBpcyBub3QgZm91bmQuCi0KLSAgIFRvIGhhdmUgYSBsb25nLW5hbWVkIG9wdGlvbiBkbyBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXQgYW4gYGludCcgdG8KLSAgIGEgY29tcGlsZWQtaW4gY29uc3RhbnQsIHN1Y2ggYXMgc2V0IGEgdmFsdWUgZnJvbSBgb3B0YXJnJywgc2V0IHRoZQotICAgb3B0aW9uJ3MgYGZsYWcnIGZpZWxkIHRvIHplcm8gYW5kIGl0cyBgdmFsJyBmaWVsZCB0byBhIG5vbnplcm8KLSAgIHZhbHVlICh0aGUgZXF1aXZhbGVudCBzaW5nbGUtbGV0dGVyIG9wdGlvbiBjaGFyYWN0ZXIsIGlmIHRoZXJlIGlzCi0gICBvbmUpLiAgRm9yIGxvbmcgb3B0aW9ucyB0aGF0IGhhdmUgYSB6ZXJvIGBmbGFnJyBmaWVsZCwgYGdldG9wdCcKLSAgIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgdmFsJyBmaWVsZC4gICovCi0KLXN0cnVjdCBvcHRpb24KLXsKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSAgY29uc3QgY2hhciAqbmFtZTsKLSNlbHNlCi0gIGNoYXIgKm5hbWU7Ci0jZW5kaWYKLSAgLyogaGFzX2FyZyBjYW4ndCBiZSBhbiBlbnVtIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQKLSAgICAgdHlwZSBtaXNtYXRjaGVzIGluIGFsbCB0aGUgY29kZSB0aGF0IGFzc3VtZXMgaXQgaXMgYW4gaW50LiAgKi8KLSAgaW50IGhhc19hcmc7Ci0gIGludCAqZmxhZzsKLSAgaW50IHZhbDsKLX07Ci0KLS8qIE5hbWVzIGZvciB0aGUgdmFsdWVzIG9mIHRoZSBgaGFzX2FyZycgZmllbGQgb2YgYHN0cnVjdCBvcHRpb24nLiAgKi8KLQotI2RlZmluZQlub19hcmd1bWVudAkJMAotI2RlZmluZSByZXF1aXJlZF9hcmd1bWVudAkxCi0jZGVmaW5lIG9wdGlvbmFsX2FyZ3VtZW50CTIKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2lmZGVmIF9fR05VX0xJQlJBUllfXwotLyogTWFueSBvdGhlciBsaWJyYXJpZXMgaGF2ZSBjb25mbGljdGluZyBwcm90b3R5cGVzIGZvciBnZXRvcHQsIHdpdGgKLSAgIGRpZmZlcmVuY2VzIGluIHRoZSBjb25zdHMsIGluIHN0ZGxpYi5oLiAgVG8gYXZvaWQgY29tcGlsYXRpb24KLSAgIGVycm9ycywgb25seSBwcm90b3R5cGUgZ2V0b3B0IGZvciB0aGUgR05VIEMgbGlicmFyeS4gICovCi1leHRlcm4gaW50IGdldG9wdCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpzaG9ydG9wdHMpOwotI2Vsc2UgLyogbm90IF9fR05VX0xJQlJBUllfXyAqLwotZXh0ZXJuIGludCBnZXRvcHQgKCk7Ci0jZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCi1leHRlcm4gaW50IGdldG9wdF9sb25nIChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKnNob3J0b3B0cywKLQkJICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKLWV4dGVybiBpbnQgZ2V0b3B0X2xvbmdfb25seSAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAotCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCi0JCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKLQotLyogSW50ZXJuYWwgb25seS4gIFVzZXJzIHNob3VsZCBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LiAgKi8KLWV4dGVybiBpbnQgX2dldG9wdF9pbnRlcm5hbCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAotCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCi0JCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kLAotCQkJICAgICBpbnQgbG9uZ19vbmx5KTsKLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotZXh0ZXJuIGludCBnZXRvcHQgKCk7Ci1leHRlcm4gaW50IGdldG9wdF9sb25nICgpOwotZXh0ZXJuIGludCBnZXRvcHRfbG9uZ19vbmx5ICgpOwotCi1leHRlcm4gaW50IF9nZXRvcHRfaW50ZXJuYWwgKCk7Ci0jZW5kaWYgLyogX19TVERDX18gKi8KLQotI2lmZGVmCV9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIGdldG9wdC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhc2h0YWIuaCBiL2luY2x1ZGUvaGFzaHRhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmUyMzkzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFzaHRhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIEFuIGV4cGFuZGFibGUgaGFzaCB0YWJsZXMgZGF0YXR5cGUuICAKLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFZsYWRpbWlyIE1ha2Fyb3YgKHZtYWthcm92QGN5Z251cy5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHBhY2thZ2UgaW1wbGVtZW50cyBiYXNpYyBoYXNoIHRhYmxlIGZ1bmN0aW9uYWxpdHkuICBJdCBpcyBwb3NzaWJsZQotICAgdG8gc2VhcmNoIGZvciBhbiBlbnRyeSwgY3JlYXRlIGFuIGVudHJ5IGFuZCBkZXN0cm95IGFuIGVudHJ5LgotCi0gICBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIGdlbmVyaWMgcG9pbnRlcnMuCi0KLSAgIFRoZSBzaXplIG9mIHRoZSB0YWJsZSBpcyBub3QgZml4ZWQ7IGlmIHRoZSBvY2N1cGFuY3kgb2YgdGhlIHRhYmxlCi0gICBncm93cyB0b28gaGlnaCB0aGUgaGFzaCB0YWJsZSB3aWxsIGJlIGV4cGFuZGVkLgotCi0gICBUaGUgYWJzdHJhY3QgZGF0YSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBnZW5lcmFsaXplZCBBbGdvcml0aG0gRAotICAgZnJvbSBLbnV0aCdzIGJvb2sgIlRoZSBhcnQgb2YgY29tcHV0ZXIgcHJvZ3JhbW1pbmciLiAgSGFzaCB0YWJsZSBpcwotICAgZXhwYW5kZWQgYnkgY3JlYXRpb24gb2YgbmV3IGhhc2ggdGFibGUgYW5kIHRyYW5zZmVycmluZyBlbGVtZW50cyBmcm9tCi0gICB0aGUgb2xkIHRhYmxlIHRvIHRoZSBuZXcgdGFibGUuICAqLwotCi0jaWZuZGVmIF9fSEFTSFRBQl9IX18KLSNkZWZpbmUgX19IQVNIVEFCX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIHR5cGVzLiAgKi8KLQotLyogQ2FsY3VsYXRlIGhhc2ggb2YgYSB0YWJsZSBlbnRyeS4gICovCi10eXBlZGVmIHVuc2lnbmVkIGludCAoKmh0YWJfaGFzaCkgUEFSQU1TICgoY29uc3Qgdm9pZCAqKSk7Ci0KLS8qIENvbXBhcmUgYSB0YWJsZSBlbnRyeSB3aXRoIGEgcG9zc2libGUgZW50cnkuICBUaGUgZW50cnkgYWxyZWFkeSBpbgotICAgdGhlIHRhYmxlIGFsd2F5cyBjb21lcyBmaXJzdCwgc28gdGhlIHNlY29uZCBlbGVtZW50IGNhbiBiZSBvZiBhCi0gICBkaWZmZXJlbnQgdHlwZSAoYnV0IGluIHRoaXMgY2FzZSBodGFiX2ZpbmQgYW5kIGh0YWJfZmluZF9zbG90Ci0gICBjYW5ub3QgYmUgdXNlZDsgaW5zdGVhZCB0aGUgdmFyaWFudHMgdGhhdCBhY2NlcHQgYSBoYXNoIHZhbHVlCi0gICBtdXN0IGJlIHVzZWQpLiAgKi8KLXR5cGVkZWYgaW50ICgqaHRhYl9lcSkgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLQotLyogQ2xlYW51cCBmdW5jdGlvbiBjYWxsZWQgd2hlbmV2ZXIgYSBsaXZlIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tCi0gICB0aGUgaGFzaCB0YWJsZS4gICovCi10eXBlZGVmIHZvaWQgKCpodGFiX2RlbCkgUEFSQU1TICgodm9pZCAqKSk7Ci0gIAotLyogRnVuY3Rpb24gY2FsbGVkIGJ5IGh0YWJfdHJhdmVyc2UgZm9yIGVhY2ggbGl2ZSBlbGVtZW50LiAgVGhlIGZpcnN0Ci0gICBhcmcgaXMgdGhlIHNsb3Qgb2YgdGhlIGVsZW1lbnQgKHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8gaHRhYl9jbGVhcl9zbG90Ci0gICBpZiBkZXNpcmVkKSwgdGhlIHNlY29uZCBhcmcgaXMgdGhlIGF1eGlsaWFyeSBwb2ludGVyIGhhbmRlZCB0bwotICAgaHRhYl90cmF2ZXJzZS4gIFJldHVybiAxIHRvIGNvbnRpbnVlIHNjYW4sIDAgdG8gc3RvcC4gICovCi10eXBlZGVmIGludCAoKmh0YWJfdHJhdikgUEFSQU1TICgodm9pZCAqKiwgdm9pZCAqKSk7Ci0KLS8qIEhhc2ggdGFibGVzIGFyZSBvZiB0aGUgZm9sbG93aW5nIHR5cGUuICBUaGUgc3RydWN0dXJlCi0gICAoaW1wbGVtZW50YXRpb24pIG9mIHRoaXMgdHlwZSBpcyBub3QgbmVlZGVkIGZvciB1c2luZyB0aGUgaGFzaAotICAgdGFibGVzLiAgQWxsIHdvcmsgd2l0aCBoYXNoIHRhYmxlIHNob3VsZCBiZSBleGVjdXRlZCBvbmx5IHRocm91Z2gKLSAgIGZ1bmN0aW9ucyBtZW50aW9uZWQgYmVsb3cuICovCi0KLXN0cnVjdCBodGFiCi17Ci0gIC8qIFBvaW50ZXIgdG8gaGFzaCBmdW5jdGlvbi4gICovCi0gIGh0YWJfaGFzaCBoYXNoX2Y7Ci0KLSAgLyogUG9pbnRlciB0byBjb21wYXJpc29uIGZ1bmN0aW9uLiAgKi8KLSAgaHRhYl9lcSBlcV9mOwotCi0gIC8qIFBvaW50ZXIgdG8gY2xlYW51cCBmdW5jdGlvbi4gICovCi0gIGh0YWJfZGVsIGRlbF9mOwotCi0gIC8qIFRhYmxlIGl0c2VsZi4gICovCi0gIHZvaWQgKiplbnRyaWVzOwotCi0gIC8qIEN1cnJlbnQgc2l6ZSAoaW4gZW50cmllcykgb2YgdGhlIGhhc2ggdGFibGUgKi8KLSAgc2l6ZV90IHNpemU7Ci0KLSAgLyogQ3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW5jbHVkaW5nIGFsc28gZGVsZXRlZCBlbGVtZW50cyAqLwotICBzaXplX3Qgbl9lbGVtZW50czsKLQotICAvKiBDdXJyZW50IG51bWJlciBvZiBkZWxldGVkIGVsZW1lbnRzIGluIHRoZSB0YWJsZSAqLwotICBzaXplX3Qgbl9kZWxldGVkOwotCi0gIC8qIFRoZSBmb2xsb3dpbmcgbWVtYmVyIGlzIHVzZWQgZm9yIGRlYnVnZ2luZy4gSXRzIHZhbHVlIGlzIG51bWJlcgotICAgICBvZiBhbGwgY2FsbHMgb2YgYGh0YWJfZmluZF9zbG90JyBmb3IgdGhlIGhhc2ggdGFibGUuICovCi0gIHVuc2lnbmVkIGludCBzZWFyY2hlczsKLQotICAvKiBUaGUgZm9sbG93aW5nIG1lbWJlciBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcuICBJdHMgdmFsdWUgaXMgbnVtYmVyCi0gICAgIG9mIGNvbGxpc2lvbnMgZml4ZWQgZm9yIHRpbWUgb2Ygd29yayB3aXRoIHRoZSBoYXNoIHRhYmxlLiAqLwotICB1bnNpZ25lZCBpbnQgY29sbGlzaW9uczsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGh0YWIgKmh0YWJfdDsKLQotLyogVGhlIHByb3RvdHlwZXMgb2YgdGhlIHBhY2thZ2UgZnVuY3Rpb25zLiAqLwotCi1leHRlcm4gaHRhYl90CWh0YWJfY3JlYXRlCVBBUkFNUyAoKHNpemVfdCwgaHRhYl9oYXNoLAotCQkJCQkgaHRhYl9lcSwgaHRhYl9kZWwpKTsKLWV4dGVybiB2b2lkCWh0YWJfZGVsZXRlCVBBUkFNUyAoKGh0YWJfdCkpOwotZXh0ZXJuIHZvaWQJaHRhYl9lbXB0eQlQQVJBTVMgKChodGFiX3QpKTsKLQotZXh0ZXJuIHZvaWQgICAgKmh0YWJfZmluZAlQQVJBTVMgKChodGFiX3QsIGNvbnN0IHZvaWQgKikpOwotZXh0ZXJuIHZvaWQgICAqKmh0YWJfZmluZF9zbG90CVBBUkFNUyAoKGh0YWJfdCwgY29uc3Qgdm9pZCAqLCBpbnQpKTsKLWV4dGVybiB2b2lkICAgICpodGFiX2ZpbmRfd2l0aF9oYXNoCQlQQVJBTVMgKChodGFiX3QsIGNvbnN0IHZvaWQgKiwKLQkJCQkJCQkgdW5zaWduZWQgaW50KSk7Ci1leHRlcm4gdm9pZCAgICoqaHRhYl9maW5kX3Nsb3Rfd2l0aF9oYXNoCVBBUkFNUyAoKGh0YWJfdCwgY29uc3Qgdm9pZCAqLAotCQkJCQkJCSB1bnNpZ25lZCBpbnQsIGludCkpOwotZXh0ZXJuIHZvaWQJaHRhYl9jbGVhcl9zbG90CVBBUkFNUyAoKGh0YWJfdCwgdm9pZCAqKikpOwotZXh0ZXJuIHZvaWQJaHRhYl9yZW1vdmVfZWx0CVBBUkFNUyAoKGh0YWJfdCwgdm9pZCAqKSk7Ci0KLWV4dGVybiB2b2lkCWh0YWJfdHJhdmVyc2UJUEFSQU1TICgoaHRhYl90LCBodGFiX3RyYXYsIHZvaWQgKikpOwotCi1leHRlcm4gc2l6ZV90CWh0YWJfc2l6ZQlQQVJBTVMgKChodGFiX3QpKTsKLWV4dGVybiBzaXplX3QJaHRhYl9lbGVtZW50cwlQQVJBTVMgKChodGFiX3QpKTsKLWV4dGVybiBkb3VibGUJaHRhYl9jb2xsaXNpb25zCVBBUkFNUyAoKGh0YWJfdCkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19IQVNIVEFCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHAtc3ltdGFiLmggYi9pbmNsdWRlL2hwLXN5bXRhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjYyNmMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaHAtc3ltdGFiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODc0ICswLDAgQEAKLS8qIERlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzIGZvciByZWFkaW5nIGRlYnVnIHN5bWJvbHMgZnJvbSB0aGUKLSAgIG5hdGl2ZSBIUCBDIGNvbXBpbGVyLgotCi0gICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBIUF9TWU1UQUJfSU5DTFVERUQKLSNkZWZpbmUgSFBfU1lNVEFCX0lOQ0xVREVECi0KLS8qIEdlbmVyYWwgaW5mb3JtYXRpb246Ci0KLSAgIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBhbmQgZGVzY3JpYmVzIG9ubHkgdGhlIGRhdGEgc3RydWN0dXJlcwotICAgbmVjZXNzYXJ5IHRvIHJlYWQgZGVidWcgc3ltYm9scyBwcm9kdWNlZCBieSB0aGUgSFAgQyBjb21waWxlciwKLSAgIEhQIEFOU0kgQysrIGNvbXBpbGVyLCBhbmQgSFAgRk9SVFJBTiA5MCBjb21waWxlciB1c2luZyB0aGUKLSAgIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQuICAKLSAgIChGb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWJ1ZyBmb3JtYXQsIGZ0cCBocHV4LXN5bXRhYi5oIGZyb20KLSAgIGphZ3Vhci5jcy51dGFoLmVkdTovZGlzdCkuCi0gICAKLSAgIEFkZGl0aW9uYWwgbm90ZXMgKFJpY2ggVGl0bGUpCi0gICBUaGlzIGZpbGUgaXMgYSByZXZlcnNlLWVuZ2luZWVyZWQgdmVyc2lvbiBvZiBhIGZpbGUgY2FsbGVkCi0gICAic3ltdGFiLmgiIHdoaWNoIGV4aXN0cyBpbnRlcm5hbCB0byBIUCdzIENvbXB1dGVyIExhbmd1YWdlcyBPcmdhbml6YXRpb24KLSAgIGluIC9DTE8vQ29tcG9uZW50cy9EREUvb2JqL3NvbS9zeW10YWIuaC4gQmVjYXVzZSBIUCdzIHZlcnNpb24gb2YKLSAgIHRoZSBmaWxlIGlzIGNvcHlyaWdodGVkIGFuZCBub3QgZGlzdHJpYnV0ZWQsIGl0IGlzIG5lY2Vzc2FyeSBmb3IKLSAgIEdEQiB0byB1c2UgdGhlIHJldmVyc2UtZW5naW5lZXJlZCB2ZXJzaW9uIHRoYXQgZm9sbG93cy4KLSAgIFdvcmsgd2FzIGRvbmUgYnkgQ3lnbnVzIHRvIHJldmVyc2UtZW5naW5lZXIgdGhlIEMgc3Vic2V0IG9mIHN5bXRhYi5oLgotICAgVGhlIFdEQiBwcm9qZWN0IGhhcyBleHRlbmRlZCB0aGlzIHRvIGFsc28gY29udGFpbiB0aGUgQysrIAotICAgc3ltYm9sIGRlZmluaXRpb25zLCB0aGUgRjkwIHN5bWJvbCBkZWZpbml0aW9ucywgCi0gICBhbmQgdGhlIERPQyAoZGVidWdnaW5nLW9wdGltaXplZC1jb2RlKSBzeW1ib2wgZGVmaW5pdGlvbnMuCi0gICBJbiBzb21lIGNhc2VzICh0aGUgQysrIHN5bWJvbCBkZWZpbml0aW9ucykKLSAgIEkgaGF2ZSBhZGRlZCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIGhlcmUgdGhhdAotICAgZ29lcyBiZXlvbmQgd2hhdCBpcyBzdXBwbGllZCBpbiBIUCdzIHN5bXRhYi5oLiBJZiB3ZSBzb21lZGF5Ci0gICB1bmlmeSB0aGVzZSBmaWxlcyBhZ2FpbiwgdGhlIGV4dHJhIGNvbW1lbnRzIHNob3VsZCBiZSBtZXJnZWQgYmFjawotICAgaW50byBIUCdzIHN5bXRhYi5oLgotICAKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgRGVidWcgc3ltYm9scyBhcmUgY29udGFpbmVkIGVudGlyZWx5IHdpdGhpbiBhbiB1bmxvYWRhYmxlIHNwYWNlIGNhbGxlZAotICAgJERFQlVHJC4gICRERUJVRyQgY29udGFpbnMgc2V2ZXJhbCBzdWJzcGFjZXMgd2hpY2ggZ3JvdXAgcmVsYXRlZAotICAgZGVidWcgc3ltYm9scy4KLQotICAgJEdOVFQkIGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBnbG9iYWwgdmFyaWFibGVzLCB0eXBlcyBhbmQgY29udGFudHMuCi0KLSAgICRMTlRUJCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgcHJvY2VkdXJlcyAoaW5jbHVkaW5nIG5lc3RpbmcpLCBzY29waW5nCi0gICBpbmZvcm1hdGlvbiwgbG9jYWwgdmFyaWFibGVzLCB0eXBlcywgYW5kIGNvbnN0YW50cy4KLQotICAgJFNMVCQgY29udGFpbnMgc291cmNlIGxpbmUgaW5mb3JtYXRpb24gc28gdGhhdCBjb2RlIGFkZHJlc3NlcyBtYXkgYmUKLSAgIG1hcHBlZCB0byBzb3VyY2UgbGluZXMuCi0KLSAgICRWVCQgY29udGFpbnMgdmFyaW91cyBzdHJpbmdzIGFuZCBjb25zdGFudHMgZm9yIG5hbWVkIG9iamVjdHMgKHZhcmlhYmxlcywKLSAgIHR5cGVkZWZzLCBmdW5jdGlvbnMsIGV0YykuICBTdHJpbmdzIGFyZSBzdG9yZWQgYXMgbnVsbC10ZXJtaW5hdGVkIGNoYXJhY3RlcgotICAgbGlzdHMuICBDb25zdGFudHMgYWx3YXlzIGJlZ2luIG9uIHdvcmQgYm91bmRhcmllcy4gIFRoZSBmaXJzdCBieXRlIG9mCi0gICB0aGUgVlQgbXVzdCBiZSB6ZXJvIChhIG51bGwgc3RyaW5nKS4KLQotICAgJFhUJCBpcyBub3QgY3VycmVudGx5IHVzZWQgYnkgR0RCLgotCi0gICBNYW55IHN0cnVjdHVyZXMgd2l0aGluIHRoZSBzdWJzcGFjZXMgcG9pbnQgdG8gb3RoZXIgc3RydWN0dXJlcyB3aXRoaW4KLSAgIHRoZSBzYW1lIHN1YnNwYWNlLCBvciB0byBzdHJ1Y3R1cmVzIHdpdGhpbiBhIGRpZmZlcmVudCBzdWJzcGFjZS4gIFRoZXNlCi0gICBwb2ludGVycyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJ1Y3R1cmUgaW5kZXggZnJvbSB0aGUgYmVnaW5uaW5nIG9mCi0gICB0aGUgYXBwcm9wcmlhdGUgc3Vic3BhY2UuICAqLwotCi0vKiBVc2VkIHRvIGRlc2NyaWJlIHdoZXJlIGEgY29uc3RhbnQgaXMgc3RvcmVkLiAgKi8KLWVudW0gbG9jYXRpb25fdHlwZQotewotICBMT0NBVElPTl9JTU1FRElBVEUsCi0gIExPQ0FUSU9OX1BUUiwKLSAgTE9DQVRJT05fVlQsCi19OwotCi0vKiBMYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZGVidWcgZm9ybWF0LiAgV2l0aGluIHRoZSBkYXRhIHN0cnVjdHVyZXMKLSAgIHRoaXMgdHlwZSBpcyBsaW1pdGVkIHRvIDQgYml0cyBmb3IgYSBtYXhpbXVtIG9mIDE2IGxhbmd1YWdlcy4gICovCi1lbnVtIGhwX2xhbmd1YWdlCi17Ci0gIEhQX0xBTkdVQUdFX1VOS05PV04sCi0gIEhQX0xBTkdVQUdFX0MsCi0gIEhQX0xBTkdVQUdFX0ZPUlRSQU4sCi0gIEhQX0xBTkdVQUdFX0Y3NyA9IEhQX0xBTkdVQUdFX0ZPUlRSQU4sCi0gIEhQX0xBTkdVQUdFX1BBU0NBTCwKLSAgSFBfTEFOR1VBR0VfTU9EQ0FMLAotICBIUF9MQU5HVUFHRV9DT0JPTCwKLSAgSFBfTEFOR1VBR0VfQkFTSUMsCi0gIEhQX0xBTkdVQUdFX0FEQSwKLSAgSFBfTEFOR1VBR0VfQ1BMVVNQTFVTLAotICBIUF9MQU5HVUFHRV9ETVBBU0NBTAotfTsKLQotCi0vKiBCYXNpYyBkYXRhIHR5cGVzIGF2YWlsYWJsZSBpbiB0aGlzIGRlYnVnIGZvcm1hdC4gIFdpdGhpbiB0aGUgZGF0YQotICAgc3RydWN0dXJlcyB0aGlzIHR5cGUgaXMgbGltaXRlZCB0byA1IGJpdHMgZm9yIGEgbWF4aW11bSBvZiAzMiBiYXNpYwotICAgZGF0YSB0eXBlcy4gICovCi1lbnVtIGhwX3R5cGUKLXsKLSAgSFBfVFlQRV9VTkRFRklORUQsIC8qIDAgKi8KLSAgSFBfVFlQRV9CT09MRUFOLCAvKiAxICovCi0gIEhQX1RZUEVfQ0hBUiwgLyogMiAqLwotICBIUF9UWVBFX0lOVCwgLyogMyAqLwotICBIUF9UWVBFX1VOU0lHTkVEX0lOVCwgLyogNCAqLwotICBIUF9UWVBFX1JFQUwsIC8qIDUgKi8KLSAgSFBfVFlQRV9DT01QTEVYLCAvKiA2ICovCi0gIEhQX1RZUEVfU1RSSU5HMjAwLCAvKiA3ICovCi0gIEhQX1RZUEVfTE9OR1NUUklORzIwMCwgLyogOCAqLwotICBIUF9UWVBFX1RFWFQsIC8qIDkgKi8KLSAgSFBfVFlQRV9GTEFCRUwsIC8qIDEwICovCi0gIEhQX1RZUEVfRlROX1NUUklOR19TUEVDLCAvKiAxMSAqLwotICBIUF9UWVBFX01PRF9TVFJJTkdfU1BFQywgLyogMTIgKi8KLSAgSFBfVFlQRV9QQUNLRURfREVDSU1BTCwgLyogMTMgKi8KLSAgSFBfVFlQRV9SRUFMXzMwMDAsIC8qIDE0ICovCi0gIEhQX1RZUEVfTU9EX1NUUklOR18zMDAwLCAvKiAxNSAqLwotICBIUF9UWVBFX0FOWVBPSU5URVIsIC8qIDE2ICovCi0gIEhQX1RZUEVfR0xPQkFMX0FOWVBPSU5URVIsIC8qIDE3ICovCi0gIEhQX1RZUEVfTE9DQUxfQU5ZUE9JTlRFUiwgLyogMTggKi8KLSAgSFBfVFlQRV9DT01QTEVYUzMwMDAsIC8qIDE5ICovCi0gIEhQX1RZUEVfRlROX1NUUklOR19TMzAwX0NPTVBBVCwgLyogMjAgKi8gCi0gIEhQX1RZUEVfRlROX1NUUklOR19WQVhfQ09NUEFULCAvKiAyMSAqLwotICBIUF9UWVBFX0JPT0xFQU5fUzMwMF9DT01QQVQsIC8qIDIyICovCi0gIEhQX1RZUEVfQk9PTEVBTl9WQVhfQ09NUEFULCAvKiAyMyAqLwotICBIUF9UWVBFX1dJREVfQ0hBUiwgLyogMjQgKi8KLSAgSFBfVFlQRV9MT05HLCAvKiAyNSAqLwotICBIUF9UWVBFX1VOU0lHTkVEX0xPTkcsIC8qIDI2ICovCi0gIEhQX1RZUEVfRE9VQkxFLCAvKiAyNyAqLwotICBIUF9UWVBFX1RFTVBMQVRFX0FSRywgLyogMjggKi8KLSAgSFBfVFlQRV9WT0lEIC8qIDI5ICovCi19OwotCi0vKiBBbiBpbW1lZGlhdGUgbmFtZSBhbmQgdHlwZSB0YWJsZSBlbnRyeS4KLQotICAgZXh0ZW5zaW9uIGFuZCBpbW1lZGlhdGUgd2lsbCBhbHdheXMgYmUgb25lLgotICAgZ2xvYmFsIHdpbGwgYWx3YXlzIGJlIHplcm8uCi0gICBocF90eXBlIGlzIHRoZSBiYXNpYyB0eXBlIHRoaXMgZW50cnkgZGVzY3JpYmVzLgotICAgYml0bGVuZ3RoIGlzIHRoZSBsZW5ndGggaW4gYml0cyBmb3IgdGhlIGJhc2ljIHR5cGUuICAqLwotc3RydWN0IGRudHRwX2ltbWVkaWF0ZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQgaW1tZWRpYXRlOgkxOwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IHR5cGU6IAkJNTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDoJMjQ7Ci19OwotCi0vKiBBIG5vbmltbWVkaWF0ZSBuYW1lIGFuZCB0eXBlIHRhYmxlIGVudHJ5LgotCi0gICBleHRlbnNpb24gd2lsbCBhbHdheXMgYmUgb25lLgotICAgaW1tZWRpYXRlIHdpbGwgYWx3YXlzIGJlIHplcm8uCi0gICBpZiBnbG9iYWwgaXMgemVybywgdGhpcyBlbnRyeSBwb2ludHMgaW50byB0aGUgTE5UVAotICAgaWYgZ2xvYmFsIGlzIG9uZSwgdGhpcyBlbnRyeSBwb2ludHMgaW50byB0aGUgR05UVAotICAgaW5kZXggaXMgdGhlIGluZGV4IHdpdGhpbiB0aGUgR05UVCBvciBMTlRUIGZvciB0aGlzIGVudHJ5LiAgKi8KLXN0cnVjdCBkbnR0cF9ub25pbW1lZGlhdGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGltbWVkaWF0ZToJMTsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRleDoJCTI5OwotfTsKLQotLyogQSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBHTlRUIGFuZCBMTlRUIHRhYmxlcy4gIEl0IGhhcyB0d28KLSAgIGZvcm1zIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBiZWluZyBkZXNjcmliZWQuCi0KLSAgIFRoZSBpbW1lZGlhdGUgZm9ybSBpcyB1c2VkIGZvciBzaW1wbGUgZW50cmllcyBhbmQgaXMgb25lCi0gICB3b3JkLgotCi0gICBUaGUgbm9uaW1tZWRpYXRlIGZvcm0gaXMgdXNlZCBmb3IgY29tcGxleCBlbnRyaWVzIGFuZCBjb250YWlucwotICAgYW4gaW5kZXggaW50byB0aGUgTE5UVCBvciBHTlRUIHdoaWNoIGRlc2NyaWJlcyB0aGUgZW50aXJlIHR5cGUuCi0KLSAgIElmIGEgZG50dHBvaW50ZXIgaXMgLTEsIHRoZW4gaXQgaXMgYSBOSUwgZW50cnkuICAqLwotCi0jZGVmaW5lIEROVFROSUwgKC0xKQotdHlwZWRlZiB1bmlvbiBkbnR0cG9pbnRlcgotewotICBzdHJ1Y3QgZG50dHBfaW1tZWRpYXRlICAgIGRudHRpOwotICBzdHJ1Y3QgZG50dHBfbm9uaW1tZWRpYXRlIGRudHRwOwotICBpbnQgd29yZDsKLX0gZG50dHBvaW50ZXI7Ci0KLS8qIEFuIGluZGV4IGludG8gdGhlIHNvdXJjZSBsaW5lIHRhYmxlLiAgQXMgd2l0aCBkbnR0cG9pbnRlcnMsIGEgc2x0cG9pbnRlcgotICAgb2YgLTEgaW5kaWNhdGVzIGEgTklMIGVudHJ5LiAgKi8KLSNkZWZpbmUgU0xUTklMICgtMSkKLXR5cGVkZWYgaW50IHNsdHBvaW50ZXI7Ci0KLS8qIEluZGV4IGludG8gRE9DICg9ICJEZWJ1Z2dpbmcgT3B0aW1pemVkIENvZGUiKSBsaW5lIHRhYmxlICovCi0jZGVmaW5lIExUTklMICgtMSkKLXR5cGVkZWYgaW50IGx0cG9pbnRlcjsKLQotLyogSW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0jZGVmaW5lIENUWFROSUwgKC0xKQotdHlwZWRlZiBpbnQgY3R4dHBvaW50ZXI7Ci0KLS8qIFVuc2lnbmVkIGJ5dGUgb2Zmc2V0IGludG8gdGhlIFZULiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IHZ0cG9pbnRlcjsKLQotLyogQSBETlRUIGVudHJ5ICh1c2VkIHdpdGhpbiB0aGUgR05UVCBhbmQgTE5UVCkuCi0KLSAgIEROVFQgZW50cmllcyBhcmUgdmFyaWFibGUgc2l6ZWQgb2JqZWN0cywgYnV0IGFyZSBhbHdheXMgYSBtdWx0aXBsZQotICAgb2YgMyB3b3JkcyAod2UgY2FsbCBlYWNoIGdyb3VwIG9mIDMgd29yZHMgYSAiYmxvY2siKS4KLQotICAgVGhlIGZpcnN0IGJpdCBpbiBlYWNoIGJsb2NrIGlzIGFuIGV4dGVuc2lvbiBiaXQuICBUaGlzIGJpdCBpcyB6ZXJvCi0gICBmb3IgdGhlIGZpcnN0IGJsb2NrIG9mIGEgRE5UVCBlbnRyeS4gIElmIHRoZSBlbnRyeSByZXF1aXJlcyBtb3JlCi0gICB0aGFuIG9uZSBibG9jaywgdGhlbiB0aGlzIGJpdCBpcyBzZXQgdG8gb25lIGluIGFsbCBibG9ja3MgYWZ0ZXIKLSAgIHRoZSBmaXJzdCBvbmUuICAqLwotCi0vKiBFYWNoIEROVFQgZW50cnkgZGVzY3JpYmVzIGEgcGFydGljdWxhciBkZWJ1ZyBzeW1ib2wgKGJlZ2lubmluZyBvZgotICAgYSBzb3VyY2UgZmlsZSwgYSBmdW5jdGlvbiwgdmFyaWFibGVzLCBzdHJ1Y3R1cmVzLCBldGMuCi0KLSAgIFRoZSB0eXBlIG9mIHRoZSBETlRUIGVudHJ5IGlzIHN0b3JlZCBpbiB0aGUgImtpbmQiIGZpZWxkIHdpdGhpbiB0aGUKLSAgIEROVFQgZW50cnkgaXRzZWxmLiAgKi8KLQotZW51bSBkbnR0X2VudHJ5X3R5cGUKLXsKLSAgRE5UVF9UWVBFX05JTCA9IC0xLAotICBETlRUX1RZUEVfU1JDRklMRSwKLSAgRE5UVF9UWVBFX01PRFVMRSwKLSAgRE5UVF9UWVBFX0ZVTkNUSU9OLAotICBETlRUX1RZUEVfRU5UUlksCi0gIEROVFRfVFlQRV9CRUdJTiwKLSAgRE5UVF9UWVBFX0VORCwKLSAgRE5UVF9UWVBFX0lNUE9SVCwKLSAgRE5UVF9UWVBFX0xBQkVMLAotICBETlRUX1RZUEVfRlBBUkFNLAotICBETlRUX1RZUEVfU1ZBUiwKLSAgRE5UVF9UWVBFX0RWQVIsCi0gIEROVFRfVFlQRV9IT0xFMSwKLSAgRE5UVF9UWVBFX0NPTlNULAotICBETlRUX1RZUEVfVFlQRURFRiwKLSAgRE5UVF9UWVBFX1RBR0RFRiwKLSAgRE5UVF9UWVBFX1BPSU5URVIsCi0gIEROVFRfVFlQRV9FTlVNLAotICBETlRUX1RZUEVfTUVNRU5VTSwKLSAgRE5UVF9UWVBFX1NFVCwKLSAgRE5UVF9UWVBFX1NVQlJBTkdFLAotICBETlRUX1RZUEVfQVJSQVksCi0gIEROVFRfVFlQRV9TVFJVQ1QsCi0gIEROVFRfVFlQRV9VTklPTiwKLSAgRE5UVF9UWVBFX0ZJRUxELAotICBETlRUX1RZUEVfVkFSSUFOVCwKLSAgRE5UVF9UWVBFX0ZJTEUsCi0gIEROVFRfVFlQRV9GVU5DVFlQRSwKLSAgRE5UVF9UWVBFX1dJVEgsCi0gIEROVFRfVFlQRV9DT01NT04sCi0gIEROVFRfVFlQRV9DT0JTVFJVQ1QsCi0gIEROVFRfVFlQRV9YUkVGLAotICBETlRUX1RZUEVfU0EsCi0gIEROVFRfVFlQRV9NQUNSTywKLSAgRE5UVF9UWVBFX0JMT0NLREFUQSwKLSAgRE5UVF9UWVBFX0NMQVNTX1NDT1BFLAotICBETlRUX1RZUEVfUkVGRVJFTkNFLAotICBETlRUX1RZUEVfUFRSTUVNLAotICBETlRUX1RZUEVfUFRSTUVNRlVOQywKLSAgRE5UVF9UWVBFX0NMQVNTLAotICBETlRUX1RZUEVfR0VORklFTEQsCi0gIEROVFRfVFlQRV9WRlVOQywKLSAgRE5UVF9UWVBFX01FTUFDQ0VTUywKLSAgRE5UVF9UWVBFX0lOSEVSSVRBTkNFLAotICBETlRUX1RZUEVfRlJJRU5EX0NMQVNTLAotICBETlRUX1RZUEVfRlJJRU5EX0ZVTkMsCi0gIEROVFRfVFlQRV9NT0RJRklFUiwKLSAgRE5UVF9UWVBFX09CSkVDVF9JRCwKLSAgRE5UVF9UWVBFX01FTUZVTkMsCi0gIEROVFRfVFlQRV9URU1QTEFURSwKLSAgRE5UVF9UWVBFX1RFTVBMQVRFX0FSRywKLSAgRE5UVF9UWVBFX0ZVTkNfVEVNUExBVEUsCi0gIEROVFRfVFlQRV9MSU5LLAotICBETlRUX1RZUEVfRFlOX0FSUkFZX0RFU0MsCi0gIEROVFRfVFlQRV9ERVNDX1NVQlJBTkdFLAotICBETlRUX1RZUEVfQkVHSU5fRVhULAotICBETlRUX1RZUEVfSU5MTiwKLSAgRE5UVF9UWVBFX0lOTE5fTElTVCwKLSAgRE5UVF9UWVBFX0FMSUFTLAotICBETlRUX1RZUEVfRE9DX0ZVTkNUSU9OLAotICBETlRUX1RZUEVfRE9DX01FTUZVTkMsCi0gIEROVFRfVFlQRV9NQVgKLX07Ci0KLS8qIEROVFRfVFlQRV9TUkNGSUxFOgotCi0gICBPbmUgRE5UVF9UWVBFX1NSQ0ZJTEUgc3ltYm9sIGlzIG91dHB1dCBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlCi0gICBmaWxlIGFuZCBhdCB0aGUgYmVnaW4gYW5kIGVuZCBvZiBhbiBpbmNsdWRlZCBmaWxlLiAgQSBETlRUX1RZUEVfU1JDRklMRQotICAgZW50cnkgaXMgYWxzbyBvdXRwdXQgYmVmb3JlIGVhY2ggRE5UVF9UWVBFX0ZVTkMgc3ltYm9sIHNvIHRoYXQgZGVidWdnZXJzCi0gICBjYW4gZGV0ZXJtaW5lIHdoYXQgZmlsZSBhIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLgotCi0gICBMQU5HVUFHRSBkZXNjcmliZXMgdGhlIHNvdXJjZSBmaWxlJ3MgbGFuZ3VhZ2UuCi0KLSAgIE5BTUUgcG9pbnRzIHRvIGFuIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgc291cmNlIGZpbGUncyBuYW1lLgotCi0gICBOb3RlIHRoZSBuYW1lIHVzZWQgZm9yIEROVFRfVFlQRV9TUkNGSUxFIGVudHJpZXMgYXJlIGV4YWN0bHkgYXMgc2VlbgotICAgYnkgdGhlIGNvbXBpbGVyIChpZSB0aGV5IG1heSBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSkuICBDIGluY2x1ZGUgZmlsZXMKLSAgIHZpYSA8PiBpbmNsdXNpb24gbXVzdCB1c2UgYWJzb2x1dGUgcGF0aHMuCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3NyY2ZpbGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsgICAgLyogRE5UVF9UWVBFX1NSQ0ZJTEUgKi8KLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOgk0OwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi0vKiBETlRUX1RZUEVfTU9EVUxFOgotCi0gICBBIEROVFRfVFlQRV9NT0RVTEUgc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIHRoZSBzdGFydCBvZiBhIHBhc2NhbAotICAgbW9kdWxlIG9yIEMgc291cmNlIGZpbGUuIEEgbW9kdWxlIGluZGljYXRlcyBhIGNvbXBpbGF0aW9uIHVuaXQKLSAgIGZvciBuYW1lLXNjb3BpbmcgcHVycG9zZXM7IGluIHRoYXQgcmVnYXJkIHRoZXJlIHNob3VsZCBiZSAKLSAgIGEgMS0xIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gR0RCICJzeW10YWIiJ3MgYW5kIE1PRFVMRSBzeW1ib2wgcmVjb3Jkcy4KLQotICAgRWFjaCBETlRUX1RZUEVfTU9EVUxFIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEROVFRfVFlQRV9FTkQgc3ltYm9sLgotCi0gICBOQU1FIHBvaW50cyB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgbW9kdWxlJ3MgbmFtZS4gIE5vdGUgQwotICAgc291cmNlIGZpbGVzIGFyZSBjb25zaWRlcmVkIG5hbWVsZXNzIG1vZHVsZXMuCi0KLSAgIEFMSUFTIHBvaW50IHRvIGEgVlQgZW50cnkgcHJvdmlkaW5nIGEgc2Vjb25kYXJ5IG5hbWUuCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX21vZHVsZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOyAJLyogRE5UVF9UWVBFX01PRFVMRSAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICB2dHBvaW50ZXIgYWxpYXM7Ci0gIGRudHRwb2ludGVyIHVudXNlZDI7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLX07Ci0KLS8qIEROVFRfVFlQRV9GVU5DVElPTiwKLSAgIEROVFRfVFlQRV9FTlRSWSwKLSAgIEROVFRfVFlQRV9CTE9DS0RBVEEsCi0gICBETlRUX1RZUEVfTUVNRlVOQzoKLQotICAgQSBETlRUX1RZUEVfRlVOQ1RJT04gc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIGVhY2ggZnVuY3Rpb24gZGVmaW5pdGlvbjsKLSAgIGEgRE5UVF9UWVBFX0VOVFJZIHN5bWJvbHMgaXMgdXNlZCBmb3Igc2Vjb25kYXJ5IGVudHJ5IHBvaW50cy4gIEJvdGgKLSAgIHN5bWJvbHMgdXNlZCB0aGUgZG50dF90eXBlX2Z1bmN0aW9uIHN0cnVjdHVyZS4KLSAgIEEgRE5UVF9UWVBFX0JMT0NLREFUQSBzeW1ib2wgaXMgZW1pdHRlZCAuLi4/Ci0gICBBIEROVFRfVFlQRV9NRU1GVU5DIHN5bWJvbCBpcyBlbWl0dGVkIGZvciBpbmxpbmVkIG1lbWJlciBmdW5jdGlvbnMgKEMrKykuIAotCi0gICBFYWNoIG9mIEROVFRfVFlQRV9GVU5DVElPTiBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5ELgotCi0gICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgZnVuY3Rpb24gaGFzIGdsb2JhbCBzY29wZS4KLQotICAgTEFOR1VBR0UgZGVzY3JpYmVzIHRoZSBmdW5jdGlvbidzIHNvdXJjZSBsYW5ndWFnZS4KLQotICAgT1BUX0xFVkVMIGRlc2NyaWJlcyB0aGUgb3B0aW1pemF0aW9uIGxldmVsIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQKLSAgIHdpdGguCi0KLSAgIFZBUkFSR1MgaXMgbm9uemVybyBpZiB0aGUgZnVuY3Rpb24gdXNlcyB2YXJhcmdzLgotCi0gICBOQU1FIHBvaW50cyB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgZnVuY3Rpb24ncyBuYW1lLgotCi0gICBBTElBUyBwb2ludHMgdG8gYSBWVCBlbnRyeSBwcm92aWRpbmcgYSBzZWNvbmRhcnkgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uLgotCi0gICBGSVJTVFBBUkFNIHBvaW50cyB0byBhIExOVFQgZW50cnkgd2hpY2ggZGVzY3JpYmVzIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLQotICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCi0gICBtYXkgYmUgZGV0ZXJtaW5lZC4KLQotICAgRU5UUllBRERSIGlzIHRoZSBtZW1vcnkgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRoZSB0aGUgZnVuY3Rpb24ncyBlbnRyeSBwb2ludAotCi0gICBSRVRWQUwgcG9pbnRzIHRvIGEgTE5UVCBlbnRyeSBkZXNjcmliaW5nIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4KLQotICAgTE9XQUREUiBpcyB0aGUgbG93ZXN0IG1lbW9yeSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLgotCi0gICBISUFERFIgaXMgdGhlIGhpZ2hlc3QgbWVtb3J5IGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7CS8qIEROVFRfVFlQRV9GVU5DVElPTiwKLQkJCQkgICAgICAgICAgIEROVFRfVFlQRV9FTlRSWSwKLQkJCQkJICAgRE5UVF9UWVBFX0JMT0NLREFUQQotCQkJCQkgICBvciBETlRUX1RZUEVfTUVNRlVOQyAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOgk0OwotICB1bnNpZ25lZCBpbnQgbmVzdF9sZXZlbDoJNTsKLSAgdW5zaWduZWQgaW50IG9wdF9sZXZlbDoJMjsKLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6CQkxOwotICB1bnNpZ25lZCBpbnQgbGFuZ19pbmZvOgk0OwotICB1bnNpZ25lZCBpbnQgaW5saW5lZDoJCTE7Ci0gIHVuc2lnbmVkIGludCBsb2NhbGFsbG9jOgkxOwotICB1bnNpZ25lZCBpbnQgZXhwYW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIHZ0cG9pbnRlciBhbGlhczsKLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbTsKLSAgc2x0cG9pbnRlciBhZGRyZXNzOwotICBDT1JFX0FERFIgZW50cnlhZGRyOwotICBkbnR0cG9pbnRlciByZXR2YWw7Ci0gIENPUkVfQUREUiBsb3dhZGRyOwotICBDT1JFX0FERFIgaGlhZGRyOwotfTsKLQotLyogRE5UVF9UWVBFX0JFR0lOOgotCi0gICBBIEROVFRfVFlQRV9CRUdJTiBzeW1ib2wgaXMgZW1pdHRlZCB0byBiZWdpbiBhIG5ldyBuZXN0ZWQgc2NvcGUuCi0gICBFdmVyeSBETlRUX1RZUEVfQkVHSU4gc3ltYm9sIG11c3QgaGF2ZSBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sLgotCi0gICBDTEFTU0ZMQUcgaXMgbm9uemVybyBpZiB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYSBjKysgY2xhc3MgZGVmaW5pdGlvbi4KLQotICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCi0gICBtYXkgYmUgZGV0ZXJtaW5lZC4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfYmVnaW4KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGNsYXNzZmxhZzoJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIwOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi0vKiBETlRUX1RZUEVfRU5EOgotCi0gICBBIEROVFRfVFlQRV9FTkQgc3ltYm9sIGlzIGVtaXR0ZWQgd2hlbiBjbG9zaW5nIGEgc2NvcGUgc3RhcnRlZCBieQotICAgYSBETlRUX1RZUEVfTU9EVUxFLCBETlRUX1RZUEVfRlVOQ1RJT04sIEROVFRfVFlQRV9XSVRILAotICAgRE5UVF9UWVBFX0NPTU1PTiwgRE5UVF9UWVBFX0JFR0lOLCBhbmQgRE5UVF9UWVBFX0NMQVNTX1NDT1BFIHN5bWJvbHMuCi0KLSAgIEVOREtJTkQgZGVzY3JpYmVzIHdoYXQgdHlwZSBvZiBzY29wZSB0aGUgRE5UVF9UWVBFX0VORCBpcyBjbG9zaW5nCi0gICAob25lIG9mIHRoZSBhYm92ZSA2IGtpbmRzKS4KLQotICAgQ0xBU1NGTEFHIGlzIG5vbnplcm8gaWYgdGhpcyBpcyB0aGUgZW5kIG9mIGEgYysrIGNsYXNzIGRlZmluaXRpb24uCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuCi0KLSAgIEJFR0lOU0NPUEUgcG9pbnRzIHRvIHRoZSBMTlRUIGVudHJ5IHdoaWNoIG9wZW5lZCB0aGUgc2NvcGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2VuZAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgZW5ka2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgY2xhc3NmbGFnOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTA7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLSAgZG50dHBvaW50ZXIgYmVnaW5zY29wZTsKLX07Ci0KLS8qIEROVFRfVFlQRV9JTVBPUlQgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfTEFCRUwgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0KLS8qIEROVFRfVFlQRV9GUEFSQU06Ci0KLSAgIEEgRE5UVF9UWVBFX0ZQQVJBTSBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgYSBmdW5jdGlvbiBhcmd1bWVudC4gIFdoZW4KLSAgIGNoYWluZWQgdG9nZXRoZXIgdGhlIHN5bWJvbHMgcmVwcmVzZW50IGFuIGFyZ3VtZW50IGxpc3QgZm9yIGEgZnVuY3Rpb24uCi0KLSAgIFJFR1BBUkFNIGlzIG5vbnplcm8gaWYgdGhpcyBwYXJhbWV0ZXIgd2FzIHBhc3NlZCBpbiBhIHJlZ2lzdGVyLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoaXMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyCi0gICAocGFzcyBieSByZWZlcmVuY2Ugb3IgcGFzcyBieSB2YWx1ZSBmb3IgbGFyZ2UgaXRlbXMpLgotCi0gICBMT05HQUREUiBpcyBub256ZXJvIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSA2NGJpdCBwb2ludGVyLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIHBhcmFtZXRlcidzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIGRlc2NyaWJlcyB3aGVyZSB0aGUgcGFyYW1ldGVyIGlzIHN0b3JlZC4gIERlcGVuZGluZyBvbiB0aGUKLSAgIHBhcmFtZXRlciB0eXBlIExPQ0FUSU9OIGNvdWxkIGJlIGEgcmVnaXN0ZXIgbnVtYmVyLCBvciBhbiBvZmZzZXQKLSAgIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIuCi0KLSAgIFRZUEUgcG9pbnRzIHRvIGEgTlRUIGVudHJ5IGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIuCi0KLSAgIE5FWFRQQVJBTSBwb2ludHMgdG8gdGhlIExOVFQgZW50cnkgZGVzY3JpYmluZyB0aGUgbmV4dCBwYXJhbWV0ZXIuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZwYXJhbQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgcmVncGFyYW06CTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IGxvbmdhZGRyOgkxOwotICB1bnNpZ25lZCBpbnQgY29weXBhcmFtOgkxOwotICB1bnNpZ25lZCBpbnQgZGZsdDoJCTE7Ci0gIHVuc2lnbmVkIGludCBkb2NfcmFuZ2VzOgkxOwotICB1bnNpZ25lZCBpbnQgbWlzY19raW5kOiAgICAgICAxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTQ7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBDT1JFX0FERFIgbG9jYXRpb247Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIGRudHRwb2ludGVyIG5leHRwYXJhbTsKLSAgaW50IG1pc2M7Ci19OwotCi0vKiBETlRUX1RZUEVfU1ZBUjoKLQotICAgQSBETlRUX1RZUEVfU1ZBUiBpcyBlbWl0dGVkIHRvIGRlc2NyaWJlIGEgdmFyaWFibGUgaW4gc3RhdGljIHN0b3JhZ2UuCi0KLSAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBoYXMgZ2xvYmFsIHNjb3BlLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0LgotCi0gICBMT05HQUREUiBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBpbiBsb25nIHBvaW50ZXIgc3BhY2UuCi0KLSAgIFNUQVRJQ01FTSBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhIG1lbWJlciBvZiBhIGNsYXNzLgotCi0gICBBX1VOSU9OIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFub255bW91cyB1bmlvbiBtZW1iZXIuCi0KLSAgIE5BTUUgaXMgYSBwb2ludGVyIGludG8gdGhlIFZUIGZvciB0aGUgdmFyaWFibGUncyBuYW1lLgotCi0gICBMT0NBVElPTiBwcm92aWRlcyB0aGUgbWVtb3J5IGFkZHJlc3MgZm9yIHRoZSB2YXJpYWJsZS4KLQotICAgVFlQRSBpcyBhIHBvaW50ZXIgaW50byBlaXRoZXIgdGhlIEdOVFQgb3IgTE5UVCB3aGljaCBkZXNjcmliZXMKLSAgIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3N2YXIKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IGxvbmdhZGRyOgkxOwotICB1bnNpZ25lZCBpbnQgc3RhdGljbWVtOgkxOwotICB1bnNpZ25lZCBpbnQgYV91bmlvbjoJCTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQxOiAgICAgICAgIDE7Ci0gIHVuc2lnbmVkIGludCB0aHJlYWRfc3BlY2lmaWM6IDE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQyOiAgICAgICAgIDE0OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgQ09SRV9BRERSIGxvY2F0aW9uOwotICBkbnR0cG9pbnRlciB0eXBlOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgZGlzcGxhY2VtZW50OwotfTsKLQotLyogRE5UVF9UWVBFX0RWQVI6Ci0KLSAgIEEgRE5UVF9UWVBFX0RWQVIgaXMgZW1pdHRlZCB0byBkZXNjcmliZSBhdXRvbWF0aWMgdmFyaWFibGVzIGFuZCB2YXJpYWJsZXMKLSAgIGhlbGQgaW4gcmVnaXN0ZXJzLgotCi0gICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaGFzIGdsb2JhbCBzY29wZS4KLQotICAgSU5ESVJFQ1QgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYSBwb2ludGVyIHRvIGFuIG9iamVjdC4KLQotICAgUkVHVkFSIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGluIGEgcmVnaXN0ZXIuCi0KLSAgIEFfVU5JT04gaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYW4gYW5vbnltb3VzIHVuaW9uIG1lbWJlci4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSB2YXJpYWJsZSdzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWRkcmVzcyBvciByZWdpc3RlciBudW1iZXIgZm9yIHRoZSB2YXJpYWJsZS4KLQotICAgVFlQRSBpcyBhIHBvaW50ZXIgaW50byBlaXRoZXIgdGhlIEdOVFQgb3IgTE5UVCB3aGljaCBkZXNjcmliZXMKLSAgIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2R2YXIKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IHJlZ3ZhcjoJCTE7Ci0gIHVuc2lnbmVkIGludCBhX3VuaW9uOgkJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE3OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgaW50IGxvY2F0aW9uOwotICBkbnR0cG9pbnRlciB0eXBlOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotfTsKLQotLyogRE5UVF9UWVBFX0NPTlNUOgotCi0gICBBIEROVFRfVFlQRV9DT05TVCBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgcHJvZ3JhbSBjb25zdGFudHMuCi0KLSAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSBjb25zdGFudCBoYXMgZ2xvYmFsIHNjb3BlLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoZSBjb25zdGFudCBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0LgotCi0gICBMT0NBVElPTl9UWVBFIGRlc2NyaWJlcyB3aGVyZSB0byBmaW5kIHRoZSBjb25zdGFudCdzIHZhbHVlCi0gICAoaW4gdGhlIFZULCBtZW1vcnksIG9yIGVtYmVkZGVkIGluIGFuIGluc3RydWN0aW9uKS4KLQotICAgQ0xBU1NNRU0gaXMgbm9uemVybyBpZiB0aGUgY29uc3RhbnQgaXMgYSBtZW1iZXIgb2YgYSBjbGFzcy4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSBjb25zdGFudCdzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWRkcmVzcywgcmVnaXN0ZXIgbnVtYmVyIG9yIHBvaW50ZXIKLSAgIGludG8gdGhlIFZUIGZvciB0aGUgY29uc3RhbnQncyB2YWx1ZS4KLQotICAgVFlQRSBpcyBhIHBvaW50ZXIgaW50byBlaXRoZXIgdGhlIEdOVFQgb3IgTE5UVCB3aGljaCBkZXNjcmliZXMKLSAgIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2NvbnN0Ci17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7Ci0gIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6CTE7Ci0gIHVuc2lnbmVkIGludCBsb2NhdGlvbl90eXBlOgkzOwotICB1bnNpZ25lZCBpbnQgY2xhc3NtZW06CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNTsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIENPUkVfQUREUiBsb2NhdGlvbjsKLSAgZG50dHBvaW50ZXIgdHlwZTsKLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgdW5zaWduZWQgaW50IGRpc3BsYWNlbWVudDsKLX07Ci0KLS8qIEROVFRfVFlQRV9UWVBFREVGIGFuZCBETlRUX1RZUEVfVEFHREVGOgotCi0gICBUaGUgc2FtZSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSB0eXBlZGVmcyBhbmQgdGFnZGVmcy4KLQotICAgRE5UVF9UWVBFX1RZUEVERUZTIGFyZSBhc3NvY2lhdGVkIHdpdGggQyAidHlwZWRlZnMiLgotCi0gICBETlRUX1RZUEVfVEFHREVGcyBhcmUgYXNzb2NpYXRlZCB3aXRoIEMgInN0cnVjdCIsICJ1bmlvbiIsIGFuZCAiZW51bSIKLSAgIHRhZ3MsIHdoaWNoIG1heSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSB0eXBlZGVmIGluIHRoZSBzYW1lIHNjb3BlLgotICAgQWxzbyB0aGV5IGFyZSBhc3NvY2lhdGVkIHdpdGggQysrICJjbGFzcyIgdGFncywgd2hpY2ggaW1wbGljaXRseSBoYXZlIAotICAgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2xhc3MgdHlwZS4KLQotICAgR0xPQkFMIGlzIG5vbnplcm8gaWYgdGhlIHR5cGVkZWYvdGFnZGVmIGhhcyBnbG9iYWwgc2NvcGUuCi0KLSAgIFRZUEVJTkZPIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGZ1bGwgdHlwZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKLSAgIGZvciBhIHRhZy4gICh1c3VhbGx5IDEsIGJ1dCBjYW4gYmUgemVybyBmb3Igb3BhcXVlIHR5cGVzIGluIEMpLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIGNvbnN0YW50J3MgbmFtZS4KLQotICAgVFlQRSBwb2ludHMgdG8gdGhlIHVuZGVybHlpbmcgdHlwZSBmb3IgdGhlIHR5cGVkZWYvdGFnZGVmIGluIHRoZQotICAgR05UVCBvciBMTlRULiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV90eXBlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7ICAgIC8qIEROVFRfVFlQRV9UWVBFREVGIG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE5UVF9UWVBFX1RBR0RFRiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IHR5cGVpbmZvOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTk7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBkbnR0cG9pbnRlciB0eXBlOyAgICAgICAgICAgICAgICAgICAgLyogVW5kZXJseWluZyB0eXBlLCB3aGljaCBmb3IgVEFHREVGJ3MgbWF5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBETlRUX1RZUEVfU1RSVUNULCBETlRUX1RZUEVfVU5JT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBETlRUX1RZUEVfRU5VTSwgb3IgRE5UVF9UWVBFX0NMQVNTLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZvciBUWVBFREVGJ3Mgb3RoZXIgdW5kZXJseWluZyB0eXBlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXJlIGFsc28gcG9zc2libGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLS8qIEROVFRfVFlQRV9QT0lOVEVSOgotCi0gICBVc2VkIHRvIGRlc2NyaWJlIGEgcG9pbnRlciB0byBhbiB1bmRlcmx5aW5nIHR5cGUuCi0KLSAgIFBPSU5UU1RPIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBHTlRUIG9yIExOVFQgZm9yIHRoZSB0eXBlIHdoaWNoIHRoaXMKLSAgIHBvaW50ZXIgcG9pbnRzIHRvLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgcG9pbnRlciAobm90IHRoZSB1bmRlcmx5aW5nIHR5cGUpLiAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3BvaW50ZXIKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOwotICBkbnR0cG9pbnRlciBwb2ludHN0bzsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLQotLyogRE5UVF9UWVBFX0VOVU06Ci0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgZW51bWVyYXRlZCB0eXBlcy4KLQotICAgRklSU1RNRU0gaXMgYSBwb2ludGVyIHRvIGEgRE5UVF9UWVBFX01FTUVOVU0gaW4gdGhlIEdOVFQvTE5UVCB3aGljaAotICAgZGVzY3JpYmVzIHRoZSBmaXJzdCBtZW1iZXIgKGFuZCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGNoYWluIG9mCi0gICBtZW1iZXJzKS4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGhvbGQgdGhlIHZhbHVlcyBvZiB0aGUgZW51bSdzCi0gICBtZW1iZXJzLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9lbnVtCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOwotICBkbnR0cG9pbnRlciBmaXJzdG1lbTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9NRU1FTlVNCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgbWVtYmVycyBvZiBhbiBlbnVtZXJhdGVkIHR5cGUuCi0KLSAgIENMQVNTTUVNIGlzIG5vbnplcm8gaWYgdGhpcyBtZW1iZXIgaXMgcGFydCBvZiBhIGNsYXNzLgotCi0gICBOQU1FIHBvaW50cyBpbnRvIHRoZSBWVCBmb3IgdGhlIG5hbWUgb2YgdGhpcyBtZW1iZXIuCi0KLSAgIFZBTFVFIGlzIHRoZSB2YWx1ZSBvZiB0aGlzIGVudW1lcmF0aW9uIG1lbWJlci4KLQotICAgTkVYVE1FTSBwb2ludHMgdG8gdGhlIG5leHQgRE5UVF9UWVBFX01FTUVOVU0gaW4gdGhlIGNoYWluLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9tZW1lbnVtCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGNsYXNzbWVtOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjA7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0gIGRudHRwb2ludGVyIG5leHRtZW07Ci19OwotCi0vKiBETlRUX1RZUEVfU0VUCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgUEFTQ0FMICJzZXQiIHR5cGUuCi0KLSAgIERFQ0xBUkFUSU9OIGRlc2NyaWJlcyB0aGUgYml0cGFja2luZyBvZiB0aGUgc2V0LgotCi0gICBTVUJUWVBFIHBvaW50cyB0byBhIEROVFQgZW50cnkgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiB0aGUgbWVtYmVycy4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBzZXQuICAqLyAKLQotc3RydWN0IGRudHRfdHlwZV9zZXQKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgZGVjbGFyYXRpb246CTI7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxOTsKLSAgZG50dHBvaW50ZXIgc3VidHlwZTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9TVUJSQU5HRQotCi0gICBVc2VkIHRvIGRlc2NyaWJlIHN1YnJhbmdlIHR5cGUuCi0KLSAgIERZTl9MT1cgZGVzY3JpYmVzIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgc3VicmFuZ2U6Ci0KLSAgICAgMDAgZm9yIGEgY29uc3RhbnQgbG93ZXIgYm91bmQgKGZvdW5kIGluIExPV0JPVU5EKS4KLQotICAgICAwMSBmb3IgYSBkeW5hbWljIGxvd2VyIGJvdW5kIHdpdGggdGhlIGxvd2VyIGJvdW5kIGZvdW5kIGluIHRoZSB0aGUKLSAgICAgbWVtb3J5IGFkZHJlc3MgcG9pbnRlZCB0byBieSBMT1dCT1VORC4KLQotICAgICAxMCBmb3IgYSBkeW5hbWljIGxvd2VyIGJvdW5kIGRlc2NyaWJlZCBieSBhbiB2YXJpYWJsZSBmb3VuZCBpbiB0aGUKLSAgICAgRE5UVC9MTlRUIChMT1dCT1VORCB3b3VsZCBiZSBhIHBvaW50ZXIgaW50byB0aGUgRE5UVC9MTlRUKS4KLQotICAgRFlOX0hJR0ggaXMgc2ltaWxhciB0byBEWU5fTE9XLCBleGNlcHQgaXQgZGVzY3JpYmVzIHRoZSB1cHBlciBib3VuZC4KLQotICAgU1VCVFlQRSBwb2ludHMgdG8gdGhlIHR5cGUgb2YgdGhlIHN1YnJhbmdlLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIGxlbmd0aCBpbiBiaXRzIG5lZWRlZCB0byBkZXNjcmliZSB0aGUgc3VicmFuZ2UncwotICAgdmFsdWVzLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9zdWJyYW5nZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCBkeW5fbG93OgkJMjsKLSAgdW5zaWduZWQgaW50IGR5bl9oaWdoOgkyOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7Ci0gIGludCBsb3dib3VuZDsKLSAgaW50IGhpZ2hib3VuZDsKLSAgZG50dHBvaW50ZXIgc3VidHlwZTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9BUlJBWQotCi0gICBVc2VkIHRvIGRlc2NyaWJlIGFuIGFycmF5IHR5cGUuCi0KLSAgIERFQ0xBUkFUSU9OIGRlc2NyaWJlcyB0aGUgYml0IHBhY2tpbmcgdXNlZCBpbiB0aGUgYXJyYXkuCi0KLSAgIEFSUkFZSVNCWVRFUyBpcyBub256ZXJvIGlmIHRoZSBmaWVsZCBpbiBhcnJheWxlbmd0aCBkZXNjcmliZXMgdGhlCi0gICBsZW5ndGggaW4gYnl0ZXMgcmF0aGVyIHRoYW4gaW4gYml0cy4gIEEgdmFsdWUgb2YgemVybyBpcyB1c2VkIHRvCi0gICBkZXNjcmliZSBhbiBhcnJheSB3aXRoIHNpemUgMioqMzIuCi0KLSAgIEVMRU1JU0JZVEVTIGlzIG5vbnplcm8gaWYgdGhlIGxlbmd0aCBpZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5Ci0gICBpcyBkZXNjcmliZXMgaW4gYnl0ZXMgcmF0aGVyIHRoYW4gYml0cy4gIEEgdmFsdWUgb2YgemVybyBpcyB1c2VkCi0gICB0byBhbiBlbGVtZW50IHdpdGggc2l6ZSAyKiozMi4KLQotICAgRUxFTU9SREVSIGlzIG5vbnplcm8gaWYgdGhlIGVsZW1lbnRzIGFyZSBpbmRleGVkIGluIGluY3JlYXNpbmcgb3JkZXIuCi0KLSAgIEpVU1RJRklFRCBpZiB0aGUgZWxlbWVudHMgYXJlIGxlZnQganVzdGlmaWVkIHRvIGluZGV4IHplcm8uCi0KLSAgIEFSUkFZTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LgotCi0gICBJTkRFWFRZUEUgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIHR5cGUgdXNlZCB0byBpbmRleCB0aGUgYXJyYXkuCi0KLSAgIEVMRU1UWVBFIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIGZvciB0aGUgYXJyYXkgZWxlbWVudHMuCi0KLSAgIEVMRU1MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IChpbmNsdWRpbmcKLSAgIGFueSBwYWRkaW5nKS4KLQotICAgTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSByZXByZXNlbnRlZCBieSBFTEVNVFlQRSBwb2ludGluZyB0bwotICAgYW5vdGhlciBETlRUX1RZUEVfQVJSQVkuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2FycmF5Ci17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGRlY2xhcmF0aW9uOgkyOwotICB1bnNpZ25lZCBpbnQgZHluX2xvdzoJCTI7Ci0gIHVuc2lnbmVkIGludCBkeW5faGlnaDoJMjsKLSAgdW5zaWduZWQgaW50IGFycmF5aXNieXRlczoJMTsKLSAgdW5zaWduZWQgaW50IGVsZW1pc2J5dGVzOgkxOwotICB1bnNpZ25lZCBpbnQgZWxlbW9yZGVyOgkxOwotICB1bnNpZ25lZCBpbnQganVzdGlmaWVkOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTE7Ci0gIHVuc2lnbmVkIGludCBhcnJheWxlbmd0aDsKLSAgZG50dHBvaW50ZXIgaW5kZXh0eXBlOwotICBkbnR0cG9pbnRlciBlbGVtdHlwZTsKLSAgdW5zaWduZWQgaW50IGVsZW1sZW5ndGg7Ci19OwotCi0vKiBETlRUX1RZUEVfU1RSVUNUCi0KLSAgIEROVFRfVFlQRV9TVFJVQ1QgaXMgdXNlZCB0byBkZXNjcmliZSBhIEMgc3RydWN0dXJlLgotCi0gICBERUNMQVJBVElPTiBkZXNjcmliZXMgdGhlIGJpdHBhY2tpbmcgdXNlZC4KLQotICAgRklSU1RGSUVMRCBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIHN0cnVjdHVyZQotICAgKGVhY2ggZmllbGQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGZpZWxkLCB3YWxrIHRoZSBsaXN0Ci0gICB0byBhY2Nlc3MgYWxsIGZpZWxkcyBvZiB0aGUgc3RydWN0dXJlKS4KLQotICAgVkFSVEFHRklFTEQgYW5kIFZBUkxJU1QgYXJlIHVzZWQgZm9yIFBhc2NhbCB2YXJpYW50IHJlY29yZHMuCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJpdHMuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3N0cnVjdAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCBkZWNsYXJhdGlvbjoJMjsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE5OwotICBkbnR0cG9pbnRlciBmaXJzdGZpZWxkOwotICBkbnR0cG9pbnRlciB2YXJ0YWdmaWVsZDsKLSAgZG50dHBvaW50ZXIgdmFybGlzdDsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9VTklPTgotCi0gICBETlRUX1RZUEVfVU5JT04gaXMgdXNlZCB0byBkZXNjcmliZSBhIEMgdW5pb24uCi0KLSAgIEZJUlNURklFTEQgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmllbGQgY2hhaW4uCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgc2l6ZSBvZiB0aGUgdW5pb24gaW4gYml0cy4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfdW5pb24KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIGRudHRwb2ludGVyIGZpcnN0ZmllbGQ7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Ci19OwotCi0vKiBETlRUX1RZUEVfRklFTEQKLQotICAgRE5UVF9UWVBFX0ZJRUxEIGRlc2NyaWJlcyBvbmUgZmllbGQgaW4gYSBzdHJ1Y3R1cmUgb3IgdW5pb24KLSAgIG9yIEMrKyBjbGFzcy4KLQotICAgVklTSUJJTElUWSBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZAotICAgKGZvciBjKysuICBwdWJsaWMgPSAwLCBwcm90ZWN0ZWQgPSAxLCBwcml2YXRlID0gMikuCi0KLSAgIEFfVU5JT04gaXMgbm9uemVybyBpZiB0aGlzIGZpZWxkIGlzIGEgbWVtYmVyIG9mIGFuIGFub255bW91cyB1bmlvbi4KLQotICAgU1RBVElDTUVNIGlzIG5vbnplcm8gaWYgdGhpcyBmaWVsZCBpcyBhIHN0YXRpYyBtZW1iZXIgb2YgYSB0ZW1wbGF0ZS4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLQotICAgQklUT0ZGU0VUIGdpdmVzIHRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCBpbiBiaXRzIGZyb20gdGhlIGJlZ2lubmluZwotICAgb2YgdGhlIHN0cnVjdHVyZSBvciB1bmlvbiB0aGlzIGZpZWxkIGlzIGEgbWVtYmVyIG9mLgotCi0gICBUWVBFIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIGRlc2NyaWJpbmcgdGhpcyBmaWVsZC4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBlbnRyeSBpbiBiaXRzLgotCi0gICBORVhURklFTEQgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIG5leHQgZmllbGQgaW4gdGhlIGNoYWluLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV9maWVsZAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCB2aXNpYmlsaXR5OgkyOwotICB1bnNpZ25lZCBpbnQgYV91bmlvbjoJCTE7Ci0gIHVuc2lnbmVkIGludCBzdGF0aWNtZW06CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNzsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIHVuc2lnbmVkIGludCBiaXRvZmZzZXQ7Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Ci0gIGRudHRwb2ludGVyIG5leHRmaWVsZDsKLX07Ci0KLS8qIEROVFRfVFlQRV9WQVJJQU5UIGlzIHVudXNlZCBieSBHREIuICAqLwotLyogRE5UVF9UWVBFX0ZJTEUgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0KLS8qIEROVFRfVFlQRV9GVU5DVFlQRQotCi0gICBJIHRoaW5rIHRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSBhIGZ1bmN0aW9uIHR5cGUgKGUuZy4sIHdvdWxkCi0gICBiZSBlbWl0dGVkIGFzIHBhcnQgb2YgYSBmdW5jdGlvbi1wb2ludGVyIGRlc2NyaXB0aW9uKS4KLQotICAgVkFSQVJHUyBpcyBub256ZXJvIGlmIHRoaXMgZnVuY3Rpb24gdXNlcyB2YXJhcmdzLgotCi0gICBGSVJTVFBBUkFNIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcGFyYW1ldGVyCi0gICBjaGFpbi4KLQotICAgUkVUVkFMIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmN0eXBlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7Ci0gIHVuc2lnbmVkIGludCB2YXJhcmdzOgkJMTsKLSAgdW5zaWduZWQgaW50IGluZm86CQk0OwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTY7Ci0gIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Ci0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW07Ci0gIGRudHRwb2ludGVyIHJldHZhbDsKLX07Ci0KLS8qIEROVFRfVFlQRV9XSVRIIGlzIGVtaXR0ZWQgYnkgQysrIHRvIGluZGljYXRlICJ3aXRoIiBzY29waW5nIHNlbWFudGljcy4KLSAgIChQcm9iYWJseSBhbHNvIGVtaXR0ZWQgYnkgUEFTQ0FMIHRvIHN1cHBvcnQgIndpdGgiLi4uKS4KLSAgIAotICAgQysrIGV4YW1wbGU6IFNheSAibWVtZnVuYyIgaXMgYSBtZXRob2Qgb2YgY2xhc3MgImMiLCBhbmQgc2F5Ci0gICAibSIgaXMgYSBkYXRhIG1lbWJlciBvZiBjbGFzcyAiYyIuIFRoZW4gZnJvbSB3aXRoaW4gIm1lbWZ1bmMiLAotICAgaXQgaXMgbGVnYWwgdG8gcmVmZXJlbmNlICJtIiBkaXJlY3RseSAoZS5nLiB5b3UgZG9uJ3QgaGF2ZSB0bwotICAgc2F5ICJ0aGlzLT5tIi4gVGhlIHN5bWJvbCB0YWJsZSBpbmRpY2F0ZXMKLSAgIHRoaXMgYnkgZW1pdHRpbmcgYSBETlRUX1RZUEVfV0lUSCBzeW1ib2wgd2l0aGluIHRoZSBmdW5jdGlvbiAibWVtZnVuYyIsCi0gICBwb2ludGluZyB0byB0aGUgdHlwZSBzeW1ib2wgZm9yIGNsYXNzICJjIi4KLSAKLSAgIEluIEdEQiwgdGhpcyBzeW1ib2wgcmVjb3JkIGlzIHVubmVjZXNzYXJ5LCAKLSAgIGJlY2F1c2UgR0RCJ3Mgc3ltYm9sIGxvb2t1cCBhbGdvcml0aG0KLSAgIGluZmVycyB0aGUgIndpdGgiIHNlbWFudGljcyB3aGVuIGl0IHNlZXMgYSAidGhpcyIgYXJndW1lbnQgdG8gdGhlIG1lbWJlcgotICAgZnVuY3Rpb24uIFNvIEdEQiBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgRE5UVF9UWVBFX1dJVEggcmVjb3JkLgotCi0gICBBIEROVFRfVFlQRV9XSVRIIGhhcyBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sIAotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfd2l0aCB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7ICAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7ICAgLyogYWx3YXlzIEROVFRfVFlQRV9XSVRIICovCi0gIHVuc2lnbmVkIGludCBhZGRydHlwZTogIAkyOyAgICAvKiAwID0+IFNUQVRUWVBFICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgPT4gRFlOVFlQRSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiA9PiBSRUdUWVBFICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6IAkxOyAgICAvKiAxID0+IHBvaW50ZXIgdG8gb2JqZWN0ICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsb25nYWRkcjogIAkxOyAgICAvKiAxID0+IGluIGxvbmcgcG9pbnRlciBzcGFjZSAgICovCi0gIHVuc2lnbmVkIGludCBuZXN0bGV2ZWw6IAk2OyAgICAvKiAjIG9mIG5lc3RpbmcgbGV2ZWxzIGJhY2sgICAgICovCi0gIHVuc2lnbmVkIGludCBkb2NfcmFuZ2VzOiAJMTsgICAgLyogMSA9PiBsb2NhdGlvbiBpcyByYW5nZSBsaXN0ICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOiAgIAkxMDsKLSAgbG9uZyBsb2NhdGlvbjsgICAgICAgCQkgICAgICAvKiB3aGVyZSBzdG9yZWQgKGFsbG9jYXRlZCkgICAgICovCi0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLSAgZG50dHBvaW50ZXIgdHlwZTsgICAgICAgICAgICAgICAgICAgLyogdHlwZSBvZiB3aXRoIGV4cHJlc3Npb24gICAgICAqLwotICB2dHBvaW50ZXIgbmFtZTsgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIHdpdGggZXhwcmVzc2lvbiAgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgIG9mZnNldDsgICAgICAgICAgICAgIC8qIGJ5dGUgb2Zmc2V0IGZyb20gbG9jYXRpb24gICAgKi8KLX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotLyogRE5UVF9UWVBFX0NPTU1PTiBpcyB1bnN1cHBvcnRlZCBieSBHREIuICAqLwotLyogQSBETlRUX1RZUEVfQ09NTU9OIHN5bWJvbCBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5EIHN5bWJvbCAqLwotCi0vKiBETlRUX1RZUEVfQ09CU1RSVUNUIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfWFJFRiBpcyB1bnN1cHBvcnRlZCBieSBHREIuICAqLwotLyogRE5UVF9UWVBFX1NBIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfTUFDUk8gaXMgdW5zdXBwb3J0ZWQgYnkgR0RCICovCi0KLS8qIEROVFRfVFlQRV9CTE9DS0RBVEEgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBETlRUX1RZUEVfRlVOQ1RJT04gKi8KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlIEMrKyBzcGVjaWZpYyBTT00gcmVjb3JkcyAqLwotCi0vKiAgVGhlIHB1cnBvc2Ugb2YgdGhlIEROVFRfVFlQRV9DTEFTU19TQ09QRSBpcyB0byBicmFja2V0IEMrKyBtZXRob2RzCi0gICAgYW5kIGluZGljYXRlIHRoZSBtZXRob2QgbmFtZSBiZWxvbmdzIGluIHRoZSAiY2xhc3Mgc2NvcGUiIHJhdGhlcgotICAgIHRoYW4gaW4gdGhlIG1vZHVsZSB0aGV5IGFyZSBiZWluZyBkZWZpbmVkIGluLiBGb3IgZXhhbXBsZToKLQotICAgIGNsYXNzIGMgewotICAgIC4uLgotICAgIHZvaWQgbWVtZnVuYygpOyAvLyBtZW1iZXIgZnVuY3Rpb24KLSAgICB9OwotCi0gICAgdm9pZCBjOjptZW1mdW5jKCkgICAvLyBkZWZpbml0aW9uIG9mIGNsYXNzIGMncyAibWVtZnVuYyIKLSAgICB7Ci0gICAgLi4uCi0gICAgfQotCi0gICAgbWFpbigpCi0gICAgewotICAgIC4uLgotICAgIH0KLQotICAgIEluIHRoZSBhYm92ZSwgdGhlIG5hbWUgIm1lbWZ1bmMiIGlzIG5vdCBkaXJlY3RseSB2aXNpYmxlIGZyb20gIm1haW4iLgotICAgIEkuZS4sIHlvdSBoYXZlIHRvIHNheSAiYnJlYWsgYzo6bWVtZnVuYyIuCi0gICAgSWYgaXQgd2VyZSBhIG5vcm1hbCBmdW5jdGlvbiAobm90IGEgbWV0aG9kKSwgaXQgd291bGQgYmUgdmlzaWJsZQotICAgIHZpYSB0aGUgc2ltcGxlICJicmVhayBtZW1mdW5jIi4gU2luY2UgIm1lbWZ1bmMiIG90aGVyd2lzZSBsb29rcwotICAgIGxpa2UgYSBub3JtYWwgRlVOQ1RJT04gaW4gdGhlIHN5bWJvbCB0YWJsZSwgdGhlIGJyYWNrZXRpbmcKLSAgICBDTEFTU19TQ09QRSBpcyB3aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgaXQgaXMgcmVhbGx5IGEgbWV0aG9kLgotICAgIAotCi0gICBBIEROVFRfVFlQRV9DTEFTU19TQ09QRSBzeW1ib2wgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgRE5UVF9UWVBFX0VORCBzeW1ib2wgCi0qLwotCi1zdHJ1Y3QgZG50dF90eXBlX2NsYXNzX3Njb3BlIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0NMQVNTX1NDT1BFICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6ICAgICAyMTsgCi0gIHNsdHBvaW50ZXIgYWRkcmVzcyAgICAgICAgIDsgICAgLyogcG9pbnRlciB0byBTTFQgZW50cnkgKi8KLSAgZG50dHBvaW50ZXIgdHlwZSAgICAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyB0eXBlIEROVFQgKi8KLX07Ci0KLS8qIEMrKyByZWZlcmVuY2UgcGFyYW1ldGVyLgotICAgVGhlIHN0cnVjdHVyZSBvZiB0aGlzIHJlY29yZCBpcyB0aGUgc2FtZSBhcyBETlRUX1RZUEVfUE9JTlRFUiAtIAotICAgcmVmZXIgdG8gc3RydWN0IGRudHRfdHlwZV9wb2ludGVyLgotICovCi0KLS8qIFRoZSBuZXh0IHR3byBkZXNjcmliZSBDKysgcG9pbnRlci10by1kYXRhLW1lbWJlciB0eXBlLCBhbmQgCi0gICBwb2ludGVyLXRvLW1lbWJlci1mdW5jdGlvbiB0eXBlLCByZXNwZWN0aXZlbHkuCi0gICBETlRUX1RZUEVfUFRSTUVNIGFuZCBETlRUX1RZUEVfUFRSTUVNRlVOQyBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSAKLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3B0cm1lbSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9QVFJNRU0gKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIHBvaW50c3RvCSAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyBETlRUICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbWVtdHlwZSAJICAgICA7ICAgICAvKiB0eXBlIG9mIG1lbWJlciAgICAgICAgICAgICAgICAqLwotfTsKLQotc3RydWN0IGRudHRfdHlwZV9wdHJtZW1mdW5jIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1BUUk1FTUZVTkMgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIHBvaW50c3RvCSAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyBETlRUICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbWVtdHlwZSAJICAgICA7ICAgICAvKiB0eXBlIG9mIG1lbWJlciAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogVGhlIEROVFRfVFlQRV9DTEFTUyBzeW1ib2wgaXMgZW1pdHRlZCB0byBkZXNjcmliZSBhIGNsYXNzIHR5cGUuCi0gKiAibWVtYmVybGlzdCIgcG9pbnRzIHRvIGEgY2hhaW5lZCBsaXN0IG9mIEZJRUxEIG9yIEdFTkZJRUxEIHJlY29yZHMKLSAqIGluZGljYXRpbmcgdGhlIGNsYXNzIG1lbWJlcnMuICJwYXJlbnRsaXN0IiBwb2ludHMgdG8gYSBjaGFpbmVkIGxpc3QKLSAqIG9mIElOSEVSSVRBTkNFIHJlY29yZHMgaW5kaWNhdGluZyBjbGFzc2VzIGZyb20gd2hpY2ggd2UgaW5oZXJpdAotICogZmllbGRzLgotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfY2xhc3MgCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsgICAgIC8qIGFsd2F5cyAwICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfQ0xBU1MgKi8KLSAgdW5zaWduZWQgaW50IGFic3RyYWN0OiAgICAxOyAgICAgLyogaXMgdGhpcyBhbiBhYnN0cmFjdCBjbGFzcz8gICAgKi8KLSAgdW5zaWduZWQgaW50IGNsYXNzX2RlY2w6ICAyOyAgICAgLyogMD1jbGFzcywxPXVuaW9uLDI9c3RydWN0ICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGV4cGFuc2lvbjogICAxOyAgICAgLyogMT10ZW1wbGF0ZSBleHBhbnNpb24gICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDogICAgIDE3OyAgICAgCi0gIGRudHRwb2ludGVyIG1lbWJlcmxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBjaGFpbiBvZiBbR0VOXUZJRUxEcyAqLwotICB1bnNpZ25lZCBsb25nIHZ0YmxfbG9jICAgICA7ICAgICAvKiBvZmZzZXQgaW4gb2JqIG9mIHB0ciB0byB2dGJsICAqLwotICBkbnR0cG9pbnRlciBwYXJlbnRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19JTkhFUklUQU5DRSBsaXN0ICAgICAqLwotICB1bnNpZ25lZCBsb25nIGJpdGxlbmd0aCAgICA7ICAgICAvKiB0b3RhbCBhdCB0aGlzIGxldmVsICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBpZGVudGxpc3QgICAgICA7ICAgICAvKiBwdHIgdG8gY2hhaW4gb2YgY2xhc3MgaWRlbnQncyAqLwotICBkbnR0cG9pbnRlciBmcmllbmRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19GUklFTkQgbGlzdCAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciB0ZW1wbGF0ZXB0ciAgICA7ICAgICAvKiBwdHIgdG8gdGVtcGxhdGUgICAgICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBuZXh0ZXhwICAgICAgICA7ICAgICAvKiBwdHIgdG8gbmV4dCBleHBhbnNpb24gICAgICAgICAqLwotfTsKLQotLyogQ2xhc3MgbWVtYmVycyBhcmUgaW5kaWNhdGVkIHZpYSBlaXRoZXIgdGhlIEZJRUxEIHJlY29yZCAoZm9yCi0gICBkYXRhIG1lbWJlcnMsIHNhbWUgYXMgZm9yIEMgc3RydWN0IGZpZWxkcyksIG9yIGJ5IHRoZSBHRU5GSUVMRCByZWNvcmQKLSAgIChmb3IgbWVtYmVyIGZ1bmN0aW9ucykuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9nZW5maWVsZCB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9HRU5GSUVMRCAqLwotICB1bnNpZ25lZCBpbnQgdmlzaWJpbGl0eTogIDI7ICAgICAvKiBwdWIgPSAwLCBwcm90ID0gMSwgcHJpdiA9IDIgICAqLwotICB1bnNpZ25lZCBpbnQgYV91bmlvbjogICAgIDE7ICAgICAvKiAxID0+IGFub255bW91cyB1bmlvbiBtZW1iZXIgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxODsKLSAgZG50dHBvaW50ZXIgZmllbGQJICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGZpZWxkIG9yIHF1YWxpZmllciAqLwotICBkbnR0cG9pbnRlciBuZXh0ZmllbGQgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIG5leHQgZmllbGQgICAgICAgICAqLwotfTsKLQotLyogQysrIHZpcnR1YWwgZnVuY3Rpb25zICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfdmZ1bmMgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfVkZVTkMgKi8KLSAgdW5zaWduZWQgaW50IHB1cmU6ICAgICAgICAxOyAgICAgLyogcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uID8gICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjA7Ci0gIGRudHRwb2ludGVyIGZ1bmNwdHIgICAgICAgIDsgICAgIC8qIHBvaW50cyB0byBGVU5DVElPTiBzeW1ib2wgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgdnRibF9vZmZzZXQgIDsgICAgIC8qIG9mZnNldCBpbnRvIHZ0YmwgZm9yIHZpcnR1YWwgICovCi19OwotCi0vKiBOb3QgcHJlY2lzZWx5IHN1cmUgd2hhdCB0aGlzIGlzIGludGVuZGVkIGZvciAtIERERSBpZ25vcmVzIGl0ICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfbWVtYWNjZXNzIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX01FTUFDQ0VTUyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKLSAgZG50dHBvaW50ZXIgY2xhc3NwdHIJICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGJhc2UgY2xhc3MgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBmaWVsZCAgICAgICAgICA7ICAgICAvKiBwb2ludGVyIGZpZWxkICAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogVGhlIEROVFRfVFlQRV9JTkhFUklUQU5DRSByZWNvcmQgZGVzY3JpYmVzIGRlcml2ZWQgY2xhc3Nlcy4KLSAqIEluIHBhcnRpY3VsYXIsIHRoZSAicGFyZW50bGlzdCIgZmllbGQgb2YgdGhlIENMQVNTIHJlY29yZCBwb2ludHMKLSAqIHRvIGEgbGlzdCBvZiBJTkhFUklUQU5DRSByZWNvcmRzIGZvciBjbGFzc2VzIGZyb20gd2hpY2ggd2UgCi0gKiBpbmhlcml0IG1lbWJlcnMuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9pbmhlcml0YW5jZSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9JTkhFUklUQU5DRSAqLwotICB1bnNpZ25lZCBpbnQgVmlydHVhbDogICAgIDE7ICAgICAvKiB2aXJ0dWFsIGJhc2UgY2xhc3MgPyAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdmlzaWJpbGl0eTogIDI7ICAgICAvKiBwdWIgPSAwLCBwcm90ID0gMSwgcHJpdiA9IDIgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxODsKLSAgZG50dHBvaW50ZXIgY2xhc3NuYW1lICAgICAgOyAgICAgLyogZmlyc3QgcGFyZW50IGNsYXNzLCBpZiBhbnkgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgICAgICAgOyAgICAgLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGJhc2UgY2xhc3MgKi8KLSAgZG50dHBvaW50ZXIgbmV4dCAgICAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBuZXh0IEtfSU5IRVJJVEFOQ0UgKi8KLSAgdW5zaWduZWQgbG9uZyBmdXR1cmVbMl0gICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KLX07Ci0KLS8qIEMrKyAiZnJpZW5kIiBjbGFzc2VzIC4uLiAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9jbGFzcyB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9GUklFTkRfQ0xBU1MgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIGNsYXNzcHRyICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gY2xhc3MgRE5UVCAgICAgICAgICovCi0gIGRudHRwb2ludGVyIG5leHQgICAgICAgICAgIDsgICAgIC8qIG5leHQgRE5UVF9GUklFTkQgICAgICAgICAgICAgICovCi19OwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9mdW5jIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0ZSSUVORF9GVU5DICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIxOwotICBkbnR0cG9pbnRlciBmdW5jcHRyICAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBjbGFzc3B0ciAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIEROVFQgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBuZXh0ICAgICAgICAgICA7ICAgICAvKiBuZXh0IEROVFRfRlJJRU5EICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nIGZ1dHVyZVsyXSAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICAqLwotfTsKLQotLyogRERFIGFwcGVhcnMgdG8gaWdub3JlIHRoZSBETlRUX1RZUEVfTU9ESUZJRVIgcmVjb3JkLgotICogSXQgY291bGQgcGVyaGFwcyBiZSB1c2VkIHRvIGdpdmUgYmV0dGVyICJwdHlwZSIgb3V0cHV0IGluIEdEQjsKLSAqIG90aGVyd2lzZSBpdCBpcyBwcm9iYWJseSBzYWZlIGZvciBHREIgdG8gaWdub3JlIGl0IGFsc28uCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9tb2RpZmllciB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9NT0RJRklFUiAqLwotICB1bnNpZ25lZCBpbnQgbV9jb25zdDogICAgIDE7ICAgICAvKiBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV9zdGF0aWM6ICAgIDE7ICAgICAvKiBzdGF0aWMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV92b2lkOiAgICAgIDE7ICAgICAvKiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV92b2xhdGlsZTogIDE7ICAgICAvKiB2b2xhdGlsZSAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbV9kdXBsaWNhdGU6IDE7ICAgICAvKiBkdXBsaWNhdGUgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxNjsKLSAgZG50dHBvaW50ZXIgdHlwZSAgICAgICAgICAgOyAgICAgLyogc3VidHlwZSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBmdXR1cmUgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KLX07Ci0KLS8qIEknbSBub3Qgc3VyZSB3aGF0IHRoaXMgd2FzIGludGVuZGVkIGZvciAtIERERSBpZ25vcmVzIGl0ICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfb2JqZWN0X2lkIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX09CSkVDVF9JRCAqLwotICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6ICAgIDE7ICAgICAvKiBJcyBvYmplY3RfaWRlbnQgYWRkciBvZiBhZGRyPyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMDsKLSAgdW5zaWduZWQgbG9uZyBvYmplY3RfaWRlbnQgOyAgICAgLyogb2JqZWN0IGlkZW50aWZpZXIgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgICAgICAgOyAgICAgLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGJhc2UgY2xhc3MgKi8KLSAgZG50dHBvaW50ZXIgbmV4dCAgICAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBuZXh0IEtfT0JKRUNUX0lEICAgKi8KLSAgdW5zaWduZWQgbG9uZyBzZWdvZmZzZXQgICAgOyAgICAgLyogZm9yIGxpbmtlciBmaXh1cCAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBmdXR1cmUgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KLX07Ci0KLS8qIE5vIHNlcGFyYXRlIGRudHRfdHlwZV9tZW1mdW5jOyBzYW1lIGFzIGRudHRfdHlwZV9mdW5jICovCi0KLS8qIFN5bWJvbCByZWNvcmRzIHRvIHN1cHBvcnQgdGVtcGxhdGVzLiBUaGVzZSBvbmx5IGdldCB1c2VkCi0gKiBpbiBEREUncyAiZGVzY3JpYmUiIG91dHB1dCAobGlrZSBHREIncyAicHR5cGUiKS4KLSAqLwotCi0vKiBUaGUgVEVNUExBVEUgcmVjb3JkIGlzIHRoZSBoZWFkZXIgZm9yIGEgdGVtcGxhdGUtY2xhc3MuCi0gKiBMaWtlIHRoZSBDTEFTUyByZWNvcmQsIGEgVEVNUExBVEUgcmVjb3JkIGhhcyBhIG1lbWJlcmxpc3QgdGhhdAotICogcG9pbnRzIHRvIGEgbGlzdCBvZiB0ZW1wbGF0ZSBtZW1iZXJzLiBJdCBhbHNvIGhhcyBhbiBhcmdsaXN0Ci0gKiBwb2ludGluZyB0byBhIGxpc3Qgb2YgVEVNUExBVEVfQVJHIHJlY29yZHMuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV90ZW1wbGF0ZSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9URU1QTEFURSAqLwotICB1bnNpZ25lZCBpbnQgYWJzdHJhY3Q6ICAgIDE7ICAgICAvKiBpcyB0aGlzIGFuIGFic3RyYWN0IGNsYXNzPyAgICAqLwotICB1bnNpZ25lZCBpbnQgY2xhc3NfZGVjbDogIDI7ICAgICAvKiAwPWNsYXNzLDE9dW5pb24sMj1zdHJ1Y3QgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxODsKLSAgZG50dHBvaW50ZXIgbWVtYmVybGlzdCAgICAgOyAgICAgLyogcHRyIHRvIGNoYWluIG9mIEtfW0dFTl1GSUVMRHMgKi8KLSAgbG9uZyB1bnVzZWQyICAgICAgICAgICAgICAgOyAgICAgLyogb2Zmc2V0IGluIG9iaiBvZiBwdHIgdG8gdnRibCAgKi8KLSAgZG50dHBvaW50ZXIgcGFyZW50bGlzdCAgICAgOyAgICAgLyogcHRyIHRvIEtfSU5IRVJJVEFOQ0UgbGlzdCAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyBiaXRsZW5ndGggICAgOyAgICAgLyogdG90YWwgYXQgdGhpcyBsZXZlbCAgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgaWRlbnRsaXN0ICAgICAgOyAgICAgLyogcHRyIHRvIGNoYWluIG9mIGNsYXNzIGlkZW50J3MgKi8KLSAgZG50dHBvaW50ZXIgZnJpZW5kbGlzdCAgICAgOyAgICAgLyogcHRyIHRvIEtfRlJJRU5EIGxpc3QgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgYXJnbGlzdCAgICAgICAgOyAgICAgLyogcHRyIHRvIGFyZ3VtZW50IGxpc3QgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgZXhwYW5zaW9ucyAgICAgOyAgICAgLyogcHRyIHRvIGV4cGFuc2lvbiBsaXN0ICAgICAgICAgKi8KLX07Ci0KLS8qIFRlbXBsYXRlLWNsYXNzIGFyZ3VtZW50cyBhcmUgYSBsaXN0IG9mIFRFTVBMX0FSRyByZWNvcmRzCi0gKiBjaGFpbmVkIHRvZ2V0aGVyLiBUaGUgIm5hbWUiIGZpZWxkIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYWwuCi0gKiBFLmcuOgotICogdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHEgeyAuLi4gfTsKLSAqIFRoZW4gIlQiIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYWwgYXJndW1lbnQuCi0gKi8KLXN0cnVjdCBkbnR0X3R5cGVfdGVtcGxfYXJnIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1RFTVBMX0FSRyAqLwotICB1bnNpZ25lZCBpbnQgdXNhZ2V0eXBlOiAgIDE7ICAgICAvKiAwIHR5cGUtbmFtZSAxIGV4cHJlc3Npb24gICAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIwOwotICB2dHBvaW50ZXIgbmFtZSAgICAgICAgICAgICA7ICAgICAvKiBuYW1lIG9mIGFyZ3VtZW50ICAgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHR5cGUgICAgICAgICAgIDsgICAgIC8qIGZvciBub24gdHlwZSBhcmd1bWVudHMgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbmV4dGFyZyAgICAgICAgOyAgICAgLyogTmV4dCBhcmd1bWVudCBpZiBhbnkgICAgICAgICAqLwotICBsb25nIGZ1dHVyZVsyXSAgICAgICAgICAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICovCi19OwotCi0vKiBGVU5DX1RFTVBMQVRFIHJlY29yZHMgYXJlIHNvcnQgb2YgbGlrZSBGVU5DVElPTiwgYnV0IGFyZSBlbWl0dGVkCi0gKiBmb3IgdGVtcGxhdGUgbWVtYmVyIGZ1bmN0aW9ucy4gRS5nLiwKLSAqIHRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBxIHsgCi0gICAgICAuLi4KLSAgICAgIHZvaWQgZigpOwotICAgICAgLi4uIAotICAgfTsKLSAqIFdpdGhpbiB0aGUgbGlzdCBvZiBGSUVMRHMvR0VORklFTERzIGRlZmluaW5nIHRoZSBtZW1iZXIgbGlzdAotICogb2YgdGhlIHRlbXBsYXRlICJxIiwgImYiIHdvdWxkIGFwcGVhciBhcyBhIEZVTkNfVEVNUExBVEUuCi0gKiBXZSdsbCBhbHNvIHNlZSBpbnN0YW5jZXMgb2YgRlVOQ1RJT04gImYiIHJlY29yZHMgZm9yIGVhY2ggCi0gKiBpbnN0YW50aWF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmNfdGVtcGxhdGUgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfRlVOQ19URU1QTEFURSAqLwotICB1bnNpZ25lZCBpbnQgcHVibGljOiAgICAgIDE7ICAgICAvKiAxID0+IGdsb2JhbGx5IHZpc2libGUgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsYW5ndWFnZTogICAgNDsgICAgIC8qIHR5cGUgb2YgbGFuZ3VhZ2UgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGxldmVsOiAgICAgICA1OyAgICAgLyogbmVzdGluZyBsZXZlbCAodG9wIGxldmVsID0gMCkqLwotICB1bnNpZ25lZCBpbnQgb3B0aW1pemU6ICAgIDI7ICAgICAvKiBsZXZlbCBvZiBvcHRpbWl6YXRpb24gICAgICAgICovCi0gIHVuc2lnbmVkIGludCB2YXJhcmdzOiAgICAgMTsgICAgIC8qIGVsbGlwc2VzLiAgUGFzY2FsLzgwMCBsYXRlciAgKi8gCi0gIHVuc2lnbmVkIGludCBpbmZvOiAgICAgICAgNDsgICAgIC8qIGxhbmctc3BlY2lmaWMgc3R1ZmY7IEZfeHh4eCAgKi8KLSAgdW5zaWduZWQgaW50IGlubGluZWQ6ICAgICAxOwotICB1bnNpZ25lZCBpbnQgbG9jYWxsb2M6ICAgIDE7ICAgICAvKiAwIGF0IHRvcCwgMSBhdCBlbmQgb2YgYmxvY2sgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6ICAgICAgMjsKLSAgdnRwb2ludGVyIG5hbWUgICAgICAgICAgICAgOyAgICAgLyogbmFtZSBvZiBmdW5jdGlvbiAgICAgICAgICAgICAqLwotICB2dHBvaW50ZXIgYWxpYXMgICAgICAgICAgICA7ICAgICAvKiBhbHRlcm5hdGUgbmFtZSwgaWYgYW55ICAgICAgICovCi0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW0gICAgIDsgICAgIC8qIGZpcnN0IEZQQVJBTSwgaWYgYW55ICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgcmV0dmFsICAgICAgICAgOyAgICAgLyogcmV0dXJuIHR5cGUsIGlmIGFueSAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBhcmdsaXN0ICAgICAgICA7ICAgICAvKiBwdHIgdG8gYXJndW1lbnQgbGlzdCAgICAgICAgICovCi19OwotCi0vKiBMSU5LIGlzIGFwcGFyZW50bHkgaW50ZW5kZWQgdG8gbGluayB0b2dldGhlciBmdW5jdGlvbiB0ZW1wbGF0ZQotICogZGVmaW5pdGlvbnMgd2l0aCB0aGVpciBpbnN0YW50aWF0aW9ucy4gSG93ZXZlciwgaXQgaXMgbm90IGNsZWFyCi0gKiB3aHkgdGhpcyB3b3VsZCBiZSBuZWVkZWQsIGV4Y2VwdCB0byBwcm92aWRlIHRoZSBpbmZvcm1hdGlvbiBvbgotICogYSAicHR5cGUiIGNvbW1hbmQuIEFuZCBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgYUNDIGRvZXMgbm90IAotICogZ2VuZXJhdGUgdGhpcyByZWNvcmQuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9saW5rIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0xJTksgKi8KLSAgdW5zaWduZWQgaW50IGxpbmtLaW5kOiAgICA0OyAgICAgLyogYWx3YXlzIExJTktfVU5LTk9XTiAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAxNzsKLSAgbG9uZyBmdXR1cmUxICAgICAgICAgICAgICAgOyAgICAgLyogZXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBwdHIxICAgICAgICAgICA7ICAgICAvKiBsaW5rIGZyb20gdGVtcGxhdGUgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHB0cjIgICAgICAgICAgIDsgICAgIC8qIHRvIGV4cGFuc2lvbiAgICAgICAgICAgICAgICAgKi8KLSAgbG9uZyBmdXR1cmVbMl0gICAgICAgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAqLwotfTsKLQotLyogZW5kIG9mIEMrKyBzcGVjaWZpYyBTT00ncyAqLwotCi0vKiBETlRUX1RZUEVfRFlOX0FSUkFZX0RFU0MgaXMgdW51c2VkIGJ5IEdEQiAqLwotLyogRE5UVF9UWVBFX0RFU0NfU1VCUkFOR0UgaXMgdW51c2VkIGJ5IEdEQiAqLwotLyogRE5UVF9UWVBFX0JFR0lOX0VYVCBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfSU5MTiBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfSU5MTl9MSVNUIGlzIHVudXNlZCBieSBHREIgKi8KLS8qIEROVFRfVFlQRV9BTElBUyBpcyB1bnVzZWQgYnkgR0RCICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZG9jX2Z1bmN0aW9uIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogMTsgICAvKiBhbHdheXMgemVybyAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgMTA7ICAgLyogS19ET0NfRlVOQ1RJT04gb3IgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtfRE9DX01FTUZVTkMgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGdsb2JhbDogICAgMTsgICAvKiAxID0+IGdsb2JhbGx5IHZpc2libGUgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsYW5ndWFnZTogIDQ7ICAgLyogdHlwZSBvZiBsYW5ndWFnZSAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbGV2ZWw6ICAgICA1OyAgIC8qIG5lc3RpbmcgbGV2ZWwgKHRvcCBsZXZlbCA9IDApKi8KLSAgdW5zaWduZWQgaW50IG9wdGltaXplOiAgMjsgICAvKiBsZXZlbCBvZiBvcHRpbWl6YXRpb24gICAgICAgICovCi0gIHVuc2lnbmVkIGludCB2YXJhcmdzOiAgIDE7ICAgLyogZWxsaXBzZXMuICBQYXNjYWwvODAwIGxhdGVyICAqLwotICB1bnNpZ25lZCBpbnQgaW5mbzogICAgICA0OyAgIC8qIGxhbmctc3BlY2lmaWMgc3R1ZmY7IEZfeHh4eCAgKi8KLSAgdW5zaWduZWQgaW50IGlubGluZWQ6ICAgMTsKLSAgdW5zaWduZWQgaW50IGxvY2FsbG9jOiAgMTsgICAvKiAwIGF0IHRvcCwgMSBhdCBlbmQgb2YgYmxvY2sgICovCi0gIHVuc2lnbmVkIGludCBleHBhbnNpb246IDE7ICAgLyogMSA9IGZ1bmN0aW9uIGV4cGFuc2lvbiAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZG9jX2Nsb25lOiAxOwotICB2dHBvaW50ZXIgbmFtZTsgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZnVuY3Rpb24gICAgICAgICAgICAgKi8KLSAgdnRwb2ludGVyIGFsaWFzOyAgICAgICAgICAgICAvKiBhbHRlcm5hdGUgbmFtZSwgaWYgYW55ICAgICAgICovCi0gIGRudHRwb2ludGVyIGZpcnN0cGFyYW07ICAgICAgLyogZmlyc3QgRlBBUkFNLCBpZiBhbnkgICAgICAgICAqLwotICBzbHRwb2ludGVyIGFkZHJlc3M7ICAgICAgICAgIC8qIGNvZGUgYW5kIHRleHQgbG9jYXRpb25zICAgICAgKi8KLSAgQ09SRV9BRERSIGVudHJ5YWRkcjsgICAgICAgICAvKiBhZGRyZXNzIG9mIGVudHJ5IHBvaW50ICAgICAgICovCi0gIGRudHRwb2ludGVyIHJldHZhbDsgICAgICAgICAgLyogcmV0dXJuIHR5cGUsIGlmIGFueSAgICAgICAgICAqLwotICBDT1JFX0FERFIgbG93YWRkcjsgICAgICAgICAgIC8qIGxvd2VzdCBhZGRyZXNzIG9mIGZ1bmN0aW9uICAgKi8KLSAgQ09SRV9BRERSIGhpYWRkcjsgICAgICAgICAgICAvKiBoaWdoZXN0IGFkZHJlc3Mgb2YgZnVuY3Rpb24gICovCi0gIGRudHRwb2ludGVyIGlubGluZV9saXN0OyAgICAgLyogcG9pbnRlciB0byBmaXJzdCBpbmxpbmUgICAgKi8KLSAgbHRwb2ludGVyIGx0X29mZnNldDsgICAgICAgICAvKiBzdGFydCBvZiBmcmFnL2NwIGxpbmUgdGFibGUgICovCi0gIGN0eHRwb2ludGVyIGN0eHRfb2Zmc2V0OyAgICAgLyogc3RhcnQgb2YgY29udGV4dCB0YWJsZSBmb3IgdGhpcyByb3V0aW5lICovCi19OwotCi0vKiBETlRUX1RZUEVfRE9DX01FTUZVTkMgaXMgdW51c2VkIGJ5IEdEQiAqLwotCi0vKiBETlRUX1RZUEVfR0VORVJJQyBhbmQgRE5UVF9UWVBFX0JMT0NLIGFyZSBjb252aWVuY2Ugc3RydWN0dXJlcwotICAgc28gd2UgY2FuIGV4YW1pbmUgYSBETlRUIGVudHJ5IGluIGEgZ2VuZXJpYyBmYXNoaW9uLiAgKi8KLXN0cnVjdCBkbnR0X3R5cGVfZ2VuZXJpYwotewotICB1bnNpZ25lZCBpbnQgd29yZFs5XTsKLX07Ci0KLXN0cnVjdCBkbnR0X3R5cGVfYmxvY2sKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgICAgICAgMTA7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMTsKLSAgdW5zaWduZWQgaW50IHdvcmRbMl07Ci19OwotCi0vKiBPbmUgZW50cnkgaW4gYSBETlRUIChlaXRoZXIgdGhlIExOVFQgb3IgR05UVCkuICAKLSAqIFRoaXMgaXMgYSB1bmlvbiBvZiB0aGUgYWJvdmUgNjAgb3Igc28gc3RydWN0dXJlIGRlZmluaXRpb25zLgotICovCi11bmlvbiBkbnR0ZW50cnkKLXsKLSAgc3RydWN0IGRudHRfdHlwZV9zcmNmaWxlIGRzZmlsZTsKLSAgc3RydWN0IGRudHRfdHlwZV9tb2R1bGUgZG1vZHVsZTsKLSAgc3RydWN0IGRudHRfdHlwZV9mdW5jdGlvbiBkZnVuYzsKLSAgc3RydWN0IGRudHRfdHlwZV9mdW5jdGlvbiBkZW50cnk7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfYmVnaW4gZGJlZ2luOwotICBzdHJ1Y3QgZG50dF90eXBlX2VuZCBkZW5kOwotICBzdHJ1Y3QgZG50dF90eXBlX2ZwYXJhbSBkZnBhcmFtOwotICBzdHJ1Y3QgZG50dF90eXBlX3N2YXIgZHN2YXI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZHZhciBkZHZhcjsKLSAgc3RydWN0IGRudHRfdHlwZV9jb25zdCBkY29uc3Q7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfdHlwZSBkdHlwZTsKLSAgc3RydWN0IGRudHRfdHlwZV90eXBlIGR0YWc7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfcG9pbnRlciBkcHRyOwotICBzdHJ1Y3QgZG50dF90eXBlX2VudW0gZGVudW07Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbWVtZW51bSBkbWVtYmVyOwotICBzdHJ1Y3QgZG50dF90eXBlX3NldCBkc2V0OwotICBzdHJ1Y3QgZG50dF90eXBlX3N1YnJhbmdlIGRzdWJyOwotICBzdHJ1Y3QgZG50dF90eXBlX2FycmF5IGRhcnJheTsKLSAgc3RydWN0IGRudHRfdHlwZV9zdHJ1Y3QgZHN0cnVjdDsKLSAgc3RydWN0IGRudHRfdHlwZV91bmlvbiBkdW5pb247Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZmllbGQgZGZpZWxkOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0eXBlIGRmdW5jdHlwZTsKLSAgc3RydWN0IGRudHRfdHlwZV93aXRoIGR3aXRoOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uIGRibG9ja2RhdGE7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfY2xhc3Nfc2NvcGUgZGNsYXNzX3Njb3BlOwotICBzdHJ1Y3QgZG50dF90eXBlX3BvaW50ZXIgZHJlZmVyZW5jZTsKLSAgc3RydWN0IGRudHRfdHlwZV9wdHJtZW0gZHB0cm1lbTsKLSAgc3RydWN0IGRudHRfdHlwZV9wdHJtZW1mdW5jIGRwdHJtZW1mdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX2NsYXNzIGRjbGFzczsKLSAgc3RydWN0IGRudHRfdHlwZV9nZW5maWVsZCBkZ2VuZmllbGQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfdmZ1bmMgZHZmdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX21lbWFjY2VzcyBkbWVtYWNjZXNzOwotICBzdHJ1Y3QgZG50dF90eXBlX2luaGVyaXRhbmNlIGRpbmhlcml0YW5jZTsKLSAgc3RydWN0IGRudHRfdHlwZV9mcmllbmRfY2xhc3MgZGZyaWVuZF9jbGFzczsKLSAgc3RydWN0IGRudHRfdHlwZV9mcmllbmRfZnVuYyBkZnJpZW5kX2Z1bmM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbW9kaWZpZXIgZG1vZGlmaWVyOwotICBzdHJ1Y3QgZG50dF90eXBlX29iamVjdF9pZCBkb2JqZWN0X2lkOwotICBzdHJ1Y3QgZG50dF90eXBlX3RlbXBsYXRlIGR0ZW1wbGF0ZTsKLSAgc3RydWN0IGRudHRfdHlwZV90ZW1wbF9hcmcgZHRlbXBsX2FyZzsKLSAgc3RydWN0IGRudHRfdHlwZV9mdW5jX3RlbXBsYXRlIGRmdW5jX3RlbXBsYXRlOwotICBzdHJ1Y3QgZG50dF90eXBlX2xpbmsgZGxpbms7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZG9jX2Z1bmN0aW9uIGRkb2NmdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX2dlbmVyaWMgZGdlbmVyaWM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfYmxvY2sgZGJsb2NrOwotfTsKLQotLyogU291cmNlIGxpbmUgZW50cnkgdHlwZXMuICAqLwotZW51bSBzbHR0eXBlCi17Ci0gIFNMVF9OT1JNQUwsCi0gIFNMVF9TUkNGSUxFLAotICBTTFRfTU9EVUxFLAotICBTTFRfRlVOQ1RJT04sCi0gIFNMVF9FTlRSWSwKLSAgU0xUX0JFR0lOLAotICBTTFRfRU5ELAotICBTTFRfV0lUSCwKLSAgU0xUX0VYSVQsCi0gIFNMVF9BU1NJU1QsCi0gIFNMVF9NQVJLRVIsCi0gIFNMVF9DTEFTU19TQ09QRSwKLSAgU0xUX0lOTE4sCi0gIFNMVF9OT1JNQUxfT0ZGU0VULAotfTsKLQotLyogQSBub3JtYWwgc291cmNlIGxpbmUgZW50cnkuICBTaW1wbHkgcHJvdmlkZXMgYSBtYXBwaW5nIG9mIGEgc291cmNlCi0gICBsaW5lIG51bWJlciB0byBhIGNvZGUgYWRkcmVzcy4KLQotICAgU0xUREVTQyB3aWxsIGFsd2F5cyBiZSBTTFRfTk9STUFMIG9yIFNMVF9FWElULiAgKi8KLQotc3RydWN0IHNsdF9ub3JtYWwKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCBsaW5lOgkyODsKLSAgQ09SRV9BRERSIGFkZHJlc3M7Ci19OwotCi1zdHJ1Y3Qgc2x0X25vcm1hbF9vZmYKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ6CTY7Ci0gIHVuc2lnbmVkIGludCBsaW5lOgkyMjsKLSAgQ09SRV9BRERSIGFkZHJlc3M7Ci19OwotCi0vKiBBIHNwZWNpYWwgc291cmNlIGxpbmUgZW50cnkuICBQcm92aWRlcyBhIG1hcHBpbmcgb2YgYSBkZWNsYXJhdGlvbgotICAgdG8gYSBsaW5lIG51bWJlci4gIFRoZXNlIGVudHJpZXMgcG9pbnQgYmFjayBpbnRvIHRoZSBETlRUIHdoaWNoCi0gICByZWZlcmVuY2VzIHRoZW0uICAqLwotCi1zdHJ1Y3Qgc2x0X3NwZWNpYWwKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCBsaW5lOgkyODsKLSAgZG50dHBvaW50ZXIgYmFja3B0cjsKLX07Ci0KLS8qIFVzZWQgdG8gZGVzY3JpYmUgbmVzdGluZy4KLQotICAgRm9yIG5lc3RlZCBsYW5ndWFnZXMsIGFuIHNsdF9hc3Npc3QgZW50cnkgbXVzdCBmb2xsb3cgZWFjaCBTTFRfRlVOQwotICAgZW50cnkgaW4gdGhlIFNMVC4gIFRoZSBhZGRyZXNzIGZpZWxkIHdpbGwgcG9pbnQgZm9yd2FyZCB0byB0aGUKLSAgIGZpcnN0IHNsdF9ub3JtYWwgZW50cnkgd2l0aGluIHRoZSBmdW5jdGlvbidzIHNjb3BlLiAgKi8KLQotc3RydWN0IHNsdF9hc3Npc3QKLXsKLSAgdW5zaWduZWQgaW50IHNsdGRlc2M6CTQ7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CTI4OwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi1zdHJ1Y3Qgc2x0X2dlbmVyaWMKLXsKLSAgdW5zaWduZWQgaW50IHdvcmRbMl07Ci19OwotCi11bmlvbiBzbHRlbnRyeQotewotICBzdHJ1Y3Qgc2x0X25vcm1hbCBzbm9ybTsKLSAgc3RydWN0IHNsdF9ub3JtYWxfb2ZmIHNub3Jtb2ZmOwotICBzdHJ1Y3Qgc2x0X3NwZWNpYWwgc3NwZWM7Ci0gIHN0cnVjdCBzbHRfYXNzaXN0IHNhc3N0OwotICBzdHJ1Y3Qgc2x0X2dlbmVyaWMgc2dlbmVyaWM7Ci19OwotCi0vKiAgJExJTkVTJCBkZWNsYXJhdGlvbnMKLSAqICBUaGlzIGlzIHRoZSBsaW5lIHRhYmxlIHVzZWQgZm9yIG9wdGltaXplZCBjb2RlLCB3aGljaCBpcyBvbmx5IHByZXNlbnQgCi0gKiAgaW4gdGhlIG5ldyAkUFJPR1JBTV9JTkZPJCBkZWJ1ZyBzcGFjZS4gIAotICovCi0KLSNkZWZpbmUgRFNUX0xOX0VTQ0FQRV9GTEFHMSAgIDE1Ci0jZGVmaW5lIERTVF9MTl9FU0NBUEVfRkxBRzIgICAxNAotI2RlZmluZSBEU1RfTE5fQ1RYX1NQRUMxICAgICAgMTMgIAotI2RlZmluZSBEU1RfTE5fQ1RYX1NQRUMyICAgICAgMTIKLQotLyoKLSAgRXNjYXBlIGZ1bmN0aW9uIGNvZGVzOgotKi8KLXR5cGVkZWYgZW51bQotICAgIHsKLSAgICBkc3RfbG5fcGFkLCAgICAgICAgICAvKiBwYWQgYnl0ZSAqLwotICAgIGRzdF9sbl9lc2NhcGVfMSwgICAgIC8qIHJlc2VydmVkICovCi0gICAgZHN0X2xuX2RwYzFfZGxuMSwgICAgLyogMSBieXRlIGxpbmUgZGVsdGEsIDEgYnl0ZSBwYyBkZWx0YSAqLwotICAgIGRzdF9sbl9kcGMyX2RsbjIsICAgIC8qIDIgYnl0ZXMgbGluZSBkZWx0YSwgMiBieXRlcyBwYyBkZWx0YSAqLwotICAgIGRzdF9sbl9wYzRfbG40LCAgICAgIC8qIDQgYnl0ZXMgQUJTT0xVVEUgbGluZSBudW1iZXIsIDQgYnl0ZXMgQUJTT0xVVEUgcGMgKi8KLSAgICBkc3RfbG5fZHBjMF9kbG4xLCAgICAvKiAxIGJ5dGUgbGluZSBkZWx0YSwgcGMgZGVsdGEgPSAwICovCi0gICAgZHN0X2xuX2xuX29mZl8xLCAgICAgLyogc3RhdGVtZW50IGVzY2FwZSwgc3RtdCAjID0gMSAoMm5kIHN0bXQgb24gbGluZSkgKi8KLSAgICBkc3RfbG5fbG5fb2ZmLCAgICAgICAvKiBzdGF0ZW1lbnQgZXNjYXBlLCBzdG10ICMgPSBuZXh0IGJ5dGUgKi8KLSAgICBkc3RfbG5fZW50cnksICAgICAgICAvKiBlbnRyeSBlc2NhcGUsIG5leHQgYnl0ZSBpcyBlbnRyeSBudW1iZXIgKi8KLSAgICBkc3RfbG5fZXhpdCwgICAgICAgICAvKiBleGl0IGVzY2FwZSAqLwotICAgIGRzdF9sbl9zdG10X2VuZCwgICAgIC8qIGdhcCBlc2NhcGUsIDQgYnl0ZXMgcGMgZGVsdGEgKi8KLSAgICBkc3RfbG5fc3RtdF9jcCwgICAgICAvKiBjdXJyZW50IHN0bXQgaXMgYSBjcml0aWNhbCBwb2ludCAqLwotICAgIGRzdF9sbl9lc2NhcGVfMTIsICAgIC8qIHJlc2VydmVkICovCi0gICAgZHN0X2xuX2VzY2FwZV8xMywgICAgLyogdGhpcyBpcyBhbiBleGNlcHRpb24gc2l0ZSByZWNvcmQgKi8KLSAgICBkc3RfbG5fbnh0X2J5dGUsICAgICAvKiBuZXh0IGJ5dGUgY29udGFpbnMgdGhlIHJlYWwgZXNjYXBlIGNvZGUgKi8KLSAgICBkc3RfbG5fZW5kLCAgICAgICAgICAvKiBlbmQgZXNjYXBlLCBmaW5hbCBlbnRyeSBmb2xsb3dzICovCi0gICAgZHN0X2xuX2VzY2FwZTFfRU5EX09GX0VOVU0KLSAgICB9Ci0gICAgZHN0X2xuX2VzY2FwZTFfdDsKLQotdHlwZWRlZiBlbnVtCi0gICAgewotICAgIGRzdF9sbl9jdHhfMSwgICAgICAgIC8qIG5leHQgYnl0ZSBkZXNjcmliZXMgY29udGV4dCBzd2l0Y2ggd2l0aCA1LWJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gdGhlIGltYWdlIHRhYmxlIGFuZCAzLWJpdCBydW4gbGVuZ3RoLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHJ1biBsZW5ndGggaXMgMCwgZW5kIHdpdGggYW5vdGhlciBjeHQgc3BlY2lmaWVyIG9yIGN0eF9lbmQgKi8KLSAgICBkc3RfbG5fY3R4XzIsICAgICAgICAvKiBuZXh0IDIgYnl0ZXMgc3dpdGNoIGNvbnRleHQ6IDEzIGJpdCBpbmRleCwgMyBiaXQgcnVuIGxlbmd0aCAqLwotICAgIGRzdF9sbl9jdHhfNCwgICAgICAgIC8qIG5leHQgNCBieXRlcyBzd2l0Y2ggY29udGV4dDogMjkgYml0IGluZGV4LCAzIGJpdCBydW4gbGVuZ3RoICovCi0gICAgZHN0X2xuX2N0eF9lbmQsICAgICAgLyogZW5kIGN1cnJlbnQgY29udGV4dCAqLwotICAgIGRzdF9sbl9jb2xfcnVuXzEsICAgIC8qIG5leHQgYnl0ZSBpcyBjb2x1bW4gcG9zaXRpb24gb2Ygc3RhcnQgb2YgbmV4dCBzdGF0ZW1lbnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9sbG93aW5nIGJ5dGUgaXMgbGVuZ3RoIG9mIHN0YXRlbWVudCAqLwotICAgIGRzdF9sbl9jb2xfcnVuXzIsICAgIC8qIG5leHQgMiBieXRlcyBpcyBjb2x1bW4gcG9zaXRpb24gb2Ygc3RhcnQgb2YgbmV4dCBzdGF0ZW1lbnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9sbG93aW5nIDIgYnl0ZXMgaXMgbGVuZ3RoIG9mIHN0YXRlbWVudCAqLwotICAgIGRzdF9sbl9pbml0X2Jhc2UxLCAgIC8qIG5leHQgNCBieXRlcyBhcmUgYWJzb2x1dGUgUEMsIGZvbGxvd2VkIGJ5IDEgYnl0ZSBvZiBsaW5lIG51bWJlciAqLwotICAgIGRzdF9sbl9pbml0X2Jhc2UyLCAgIC8qIG5leHQgNCBieXRlcyBhcmUgYWJzb2x1dGUgUEMsIGZvbGxvd2VkIGJ5IDIgYnl0ZXMgb2YgbGluZSBudW1iZXIgKi8KLSAgICBkc3RfbG5faW5pdF9iYXNlMywgICAvKiBuZXh0IDQgYnl0ZXMgYXJlIGFic29sdXRlIFBDLCBmb2xsb3dlZCBieSAzIGJ5dGVzIG9mIGxpbmUgbnVtYmVyICovCi0gICAgZHN0X2xuX2VzY2FwZTJfRU5EX09GX0VOVU0KLSAgICB9Ci0gICAgZHN0X2xuX2VzY2FwZTJfdDsgICAgICAgICAgIAotCi10eXBlZGVmIHVuaW9uCi0gICAgewotICAgIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIHBjX2RlbHRhIDogNDsgICAgICAvKiA0IGJpdCBwYyBkZWx0YSAqLwotICAgICAgICBpbnQgICAgICAgICAgICAgICBsbl9kZWx0YSA6IDQ7ICAgICAgLyogNCBiaXQgbGluZSBudW1iZXIgZGVsdGEgKi8KLSAgICAgICAgfQotICAgICAgICBkZWx0YTsKLQotICAgIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIGVzY19mbGFnIDogNDsgICAgICAvKiBhbGlhcyBmb3IgcGNfZGVsdGEgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIGVzY19jb2RlIDogNDsgICAgICAvKiBlc2NhcGUgZnVuY3Rpb24gY29kZSAoZHN0X2xuX2VzY2FwZTFfdCwgb3IgLi4uMl90ICovCi0gICAgICAgIH0KLSAgICAgICAgZXNjOwotCi0gICAgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZXNjX2ZsYWcgOiA0OyAgICAgIC8qIGRzdF9sbl9jdHhfc3BlYzEsIG9yIGRzdF9sbl9jdHhfc3BlYzIgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgcnVuX2xlbmd0aCA6IDI7ICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgIGN0eF9pbmRleCA6IDI7ICAgICAgLyogLi4uc3BlYzIgY29udGFpbnMgaW5kZXg7ICAuLi5zcGVjMSwgaW5kZXggLSA0ICovCi0gICAgICAgIH0KLSAgICAgICAgY3R4X3NwZWM7Ci0KLSAgICBjaGFyICAgICAgICAgICAgICAgc2RhdGE7ICAgICAgICAgICAgICAgLyogc2lnbmVkIGRhdGEgYnl0ZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgICAgICB1ZGF0YTsgICAgICAgICAgICAgICAvKiB1bnNpZ25lZCBkYXRhIGJ5dGUgKi8KLSAgICB9Ci0gICAgZHN0X2xuX2VudHJ5X3QsCi0gICAgKmRzdF9sbl9lbnRyeV9wdHJfdDsKLQotLyogV2FybmluZzogYWx0aG91Z2ggdGhlIGFib3ZlIHVuaW9uIG9jY3VwaWVzIG9ubHkgMSBieXRlIHRoZSBjb21waWxlciB0cmVhdHMKLSAqIGl0IGFzIGhhdmluZyBzaXplIDIgKHRoZSBtaW5pbXVtIHNpemUgb2YgYSBzdHJ1Y3QpLiAgVGhlcmVmb3JlIGEgc2VxdWVuY2Ugb2YKLSAqIGRzdF9sbl9lbnRyeV90J3MgY2Fubm90IGJlIGRlc2NyaWJlZCBhcyBhbiBhcnJheSwgYW5kIHdhbGtpbmcgdGhyb3VnaCBzdWNoIGEKLSAqIHNlcXVlbmNlIHJlcXVpcmVzIGNvbnZvbHV0ZWQgY29kZSBzdWNoIGFzCi0gKiAgICAgIGxuX3B0ciA9IChkc3RfbG5fZW50cnlfcHRyX3QpIChjaGFyKikgbG5fcHRyICsgMQotICogV2UgcmVncmV0IHRoZSBpbmNvbnZlbmllbmNlLiAqLwotCi0vKiBTdHJ1Y3R1cmUgZm9yIGludGVycHJldGluZyB0aGUgYnl0ZSBmb2xsb3dpbmcgYSBkc3RfbG5fY3R4MSBlbnRyeSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkICBpbnQgICAgICAgICAgY3R4MV9pbmRleCA6IDU7ICAgICAgLyogNSBiaXQgaW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgxX3J1bl9sZW5ndGggOiAzOyAvKiAzIGJpdCBydW4gbGVuZ3RoICovCi19IGRzdF9sbl9jdHgxX3QsCi0gICpkc3RfbG5fY3R4MV9wdHJfdDsKLQotLyogU3RydWN0dXJlIGZvciBpbnRlcnByZXRpbmcgdGhlIGJ5dGVzIGZvbGxvd2luZyBhIGRzdF9sbl9jdHgyIGVudHJ5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgyX2luZGV4IDogMTM7ICAgICAvKiAxMyBiaXQgaW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgyX3J1bl9sZW5ndGggOiAzOyAvKiAzIGJpdCBydW4gbGVuZ3RoICovCi19IGRzdF9sbl9jdHgyX3QsCi0gICpkc3RfbG5fY3R4Ml9wdHJfdDsKLQotLyogU3RydWN0dXJlIGZvciBpbnRlcnByZXRpbmcgdGhlIGJ5dGVzIGZvbGxvd2luZyBhIGRzdF9sbl9jdHg0IGVudHJ5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHg0X2luZGV4IDogMjk7ICAgICAvKiAyOSBiaXQgaW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHg0X3J1bl9sZW5ndGggOiAzOyAvKiAzIGJpdCBydW4gbGVuZ3RoICovCi19IGRzdF9sbl9jdHg0X3QsCi0gICpkc3RfbG5fY3R4NF9wdHJfdDsKLQotCi0vKiAgUFhEQiBkZWZpbml0aW9ucy4KLSAqCi0gKiBQWERCIGlzIGEgcG9zdC1wcm9jZXNzb3Igd2hpY2ggdGFrZXMgdGhlIGV4ZWN1dGFibGUgZmlsZQotICogYW5kIG1hc3NhZ2VzIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBzbyB0aGF0IHRoZSBkZWJ1Z2dlciBtYXkKLSAqIHN0YXJ0IHVwIGFuZCBydW4gbW9yZSBlZmZpY2llbnRseS4gIFNvbWUgb2YgdGhlIHRhc2tzCi0gKiBwZXJmb3JtZWQgYnkgUFhEQiBhcmU6Ci0gKgotICogbyAgIFJlbW92ZSBkdXBsaWNhdGUgZ2xvYmFsIHR5cGUgYW5kIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0gKiAgICAgZnJvbSB0aGUgR05UVCwKLSAqCi0gKiBvICAgQXBwZW5kIHRoZSBHTlRUIG9udG8gdGhlIGVuZCBvZiB0aGUgTE5UVCBhbmQgcGxhY2UgYm90aAotICogICAgIGJhY2sgaW4gdGhlIExOVFQgc2VjdGlvbiwKLSAqCi0gKiBvICAgQnVpbGQgcXVpY2sgbG9vay11cCB0YWJsZXMgKGRlc2NyaXB0aW9uIGZvbGxvd3MpIGZvcgotICogICAgIGZpbGVzLCBwcm9jZWR1cmVzLCBtb2R1bGVzLCBhbmQgcGFyYWdyYXBocyAoZm9yIENvYm9sKSwKLSAqICAgICBwbGFjaW5nIHRoZXNlIGluIHRoZSBHTlRUIHNlY3Rpb24sCi0gKgotICogbyAgIFJlY29uc3RydWN0IHRoZSBoZWFkZXIgYXBwZWFyaW5nIGluIHRoZSBoZWFkZXIgc2VjdGlvbgotICogICAgIHRvIGFjY2VzcyB0aGlzIGluZm9ybWF0aW9uLgotICoKLSAqIFRoZSAicXVpY2sgbG9vay11cCIgdGFibGVzIGFyZSBpbiB0aGUgJEdOVFQkIHN1Yi1zcGFjZSwgaW4KLSAqIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gKgotICogICAgIFByb2NlZHVyZXMgICAgLXNvcnRlZCBieSBhZGRyZXNzCi0gKiAgICAgU291cmNlIGZpbGVzICAtc29ydGVkIGJ5IGFkZHJlc3MgKG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBjb2RlIGZyb20gcm91dGluZXMpCi0gKiAgICAgTW9kdWxlcyAgICAgICAtc29ydGVkIGJ5IGFkZHJlc3MKLSAqICAgICBDbGFzc2VzICAgICAgIC08dW5zb3J0ZWQ/PgotICogICAgIEFkZHJlc3MgQWxpYXMgLXNvcnRlZCBieSBpbmRleCA8Pz4KLSAqICAgICBPYmplY3QgSURzICAgIC1zb3J0ZWQgYnkgb2JqZWN0IGlkZW50aWZpZXIKLSAqCi0gKiBNb3N0IHF1aWNrIGVudHJpZXMgaGF2ZSAoMC1iYXNlZCkgaW5kaWNlcyBpbnRvIHRoZSBMTlRUIHRhYmxlcyB0bwotICogdGhlIGZ1bGwgZW50cmllcyBmb3IgdGhlIGl0ZW0gaXQgZGVzY3JpYmVzLgotICoKLSAqIFRoZSBwb3N0LVBYREIgaGVhZGVyIGlzIGluIHRoZSAkSEVBREVSJCBzdWItc3BhY2UuICBBbGFzLCBpdAotICogb2NjdXJzIGluIGRpZmZlcmVudCBmb3JtcywgZGVwZW5kaW5nIG9uIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwKLSAqIGluIHRoZSBjb21waWxhdGlvbiBzdGVwIGFuZCB3aGV0aGVyIFBYREIgd2FzIHJ1biBvciBub3QuIFRoZQotICogd29yc3QgcGFydCBpcyB0aGUgZm9ybXMgYXJlbid0IHNlbGYtZGVzY3JpYmluZywgc28gd2UnbGwgaGF2ZQotICogdG8gZ3JvdmVsIGluIHRoZSBiaXRzIHRvIGZpZ3VyZSBvdXQgd2hhdCBraW5kIHdlJ3JlIGxvb2tpbmcgYXQKLSAqIChzZWUgaHBfZ2V0X2hlYWRlciBpbiBocC1wc3ltdGFiLXJlYWQuYykuCi0gKi8KLQotLyogUFhEQiB2ZXJzaW9ucwotICovCi0jZGVmaW5lIFBYREJfVkVSU0lPTl9DUExVU1BMVVMJMQotI2RlZmluZSBQWERCX1ZFUlNJT05fN180CTIKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0NQUF8zMAkzCi0jZGVmaW5lIFBYREJfVkVSU0lPTl9EREVfM18yQQk0Ci0jZGVmaW5lIFBYREJfVkVSU0lPTl9EREVfM18yCTUKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0RERV80XzAJNgotCi0jZGVmaW5lIFBYREJfVkVSU0lPTl8yXzEJMQotCi0vKiBIZWFkZXIgdmVyc2lvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBET0MgaW5mbwotICogYnV0IHRoZSBleGVjdXRhYmxlIGhhcyBiZWVuIHByb2Nlc3NlZCBieSBweGRiICh0aGUgZWFzeQotICogY2FzZSwgZnJvbSAiY2MgLWciKS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUFhEQl9zdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgICAgcGRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZnVuY3Rpb24gbG9vay11cCB0YWJsZSAqLwotICAgIGludCAgICAgICAgICAgICAgZmRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZmlsZSBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBtZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBtb2R1bGUgbG9vay11cCB0YWJsZSAqLwotICAgIHVuc2lnbmVkIGludCAgICAgcHhkYmVkIDogMTsgICAvKiAxID0+IGZpbGUgaGFzIGJlZW4gcHJlcHJvY2Vzc2VkICAgICAgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIGJpZ2hkciA6IDE7ICAgLyogMSA9PiB0aGlzIGhlYWRlciBjb250YWlucyAndGltZScgd29yZCAqLwotICAgIHVuc2lnbmVkIGludCAgICAgc2FfaGVhZGVyIDogMTsvKiAxID0+IGNyZWF0ZWQgYnkgU0EgdmVyc2lvbiBvZiBweGRiICovCi0JCQkgICAgICAgICAgIC8qICAgdXNlZCBmb3IgdmVyc2lvbiBjaGVjayBpbiB4ZGIgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIGlubGluZWQ6IDE7ICAgLyogb25lIG9yIG1vcmUgZnVuY3Rpb25zIGhhdmUgYmVlbiBpbmxpbmVkICovCi0gICAgdW5zaWduZWQgaW50ICAgICBzcGFyZToxMjsKLSAgICBzaG9ydCAgICAgICAgICAgIHZlcnNpb247ICAgICAgLyogcHhkYiBoZWFkZXIgdmVyc2lvbiAqLwotICAgIGludCAgICAgICAgICAgICAgZ2xvYmFsczsgICAgICAvKiBpbmRleCBpbnRvIHRoZSBETlRUIHdoZXJlIEdOVFQgYmVnaW5zICovCi0gICAgdW5zaWduZWQgaW50ICAgICB0aW1lOyAgICAgICAgIC8qIG1vZGlmeSB0aW1lIG9mIGZpbGUgYmVmb3JlIGJlaW5nIHB4ZGJlZCAqLwotICAgIGludCAgICAgICAgICAgICAgcGdfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gbGFiZWwgbG9vay11cCB0YWJsZSAqLwotICAgIGludCAgICAgICAgICAgICAgZnVuY3Rpb25zOyAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZ1bmN0aW9ucyAqLwotICAgIGludCAgICAgICAgICAgICAgZmlsZXM7ICAgICAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZpbGVzICovCi0gICAgaW50ICAgICAgICAgICAgICBjZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBjbGFzcyBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBhYV9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBhZGRyIGFsaWFzIGxvb2stdXAgdGFibGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgIG9pX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIG9iamVjdCBpZCBsb29rLXVwIHRhYmxlICovCi19IFBYREJfaGVhZGVyLCAqUFhEQl9oZWFkZXJfcHRyOwotCi0vKiBIZWFkZXIgdmVyc2lvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBET0MgaW5mbyBhbmQgdGhlCi0gKiBleGVjdXRhYmxlIGhhcyBOT1QgYmVlbiBwcm9jZXNzZWQgYnkgcHhkYi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgWERCX2hlYWRlcl9zdHJ1Y3QgewotICAgIGxvbmcgZ250dF9sZW5ndGg7IAotICAgIGxvbmcgbG50dF9sZW5ndGg7IAotICAgIGxvbmcgc2x0X2xlbmd0aDsgCi0gICAgbG9uZyB2dF9sZW5ndGg7IAotICAgIGxvbmcgeHRfbGVuZ3RoOyAKLX0gWERCX2hlYWRlcjsKLQotLyogSGVhZGVyIHZlcnNpb24gZm9yIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgRE9DIGluZm8gYW5kIHRoZQotICogZXhlY3V0YWJsZSBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgcHhkYi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgRE9DX2luZm9fUFhEQl9oZWFkZXJfc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgaW50IHhkYl9oZWFkZXI6IDE7IAkgICAgLyogYml0IHNldCBpZiB0aGlzIGlzIHBvc3QtMy4xIHhkYiAqLyAKLSAgICAgICAgdW5zaWduZWQgaW50IGRvY19oZWFkZXI6IDE7ICAgICAgICAgLyogYml0IHNldCBpZiB0aGlzIGlzIGRvYy1zdHlsZSBoZWFkZXIqLwotICAgICAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbjogODsgICAgICAgICAgICAvKiB2ZXJzaW9uIG9mIHB4ZGIgc2VlIGRlZmluZXMKLQkJCQkJICAgICAqIFBYREJfVkVSU0lPTl8qIGluIHRoaXMgZmlsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfZm9yX2ZsYWdzOiAxNjsvKiBmb3IgZnV0dXJlIHVzZTsgLS0gbXVzdCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHNldCB0byB6ZXJvICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2F1eF9wZF90YWJsZTogMTsgICAvKiAkR05UVCQgaGFzIGF1eCBQRCB0YWJsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2V4cHJfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBoYXMgJEVYUFIkICovICAgICAgIAotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX3JhbmdlX3RhYmxlOiAxOyAgICAvKiBzcGFjZSBoYXMgJFJBTkdFJCAqLyAgICAgICAKLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19jb250ZXh0X3RhYmxlOiAxOyAgLyogc3BhY2UgaGFzICRTUkNfQ1RYVCQgKi8gICAgCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfbGluZXNfdGFibGU6IDE7ICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJExJTkVTJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3Vic3BhY2UgZm9yIGxpbmUgdGFibGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19sdF9vZmZzZXRfbWFwOiAxOyAgLyogc3BhY2UgY29udGFpbnMgYW4gbHRfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzdWJzcGFjZSBmb3IgbGluZSB0YWJsZSBtYXBwaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgaW4gdGhlIFBYREJfaGVhZGVyIGluICRERUJVRyQgKi8KLSAgICAgICAgaW50ICAgICAgcGRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZnVuY3Rpb24gbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBmZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBmaWxlIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgaW50ICAgICAgbWRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gbW9kdWxlIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBweGRiZWQgOiAxOyAgIC8qIDEgPT4gZmlsZSBoYXMgYmVlbiBwcmVwcm9jZXNzZWQgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGJpZ2hkciA6IDE7ICAgLyogMSA9PiB0aGlzIGhlYWRlciBjb250YWlucyAndGltZScgd29yZCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHNhX2hlYWRlciA6IDE7LyogMSA9PiBjcmVhdGVkIGJ5IFNBIHZlcnNpb24gb2YgcHhkYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgdXNlZCBmb3IgdmVyc2lvbiBjaGVjayBpbiB4ZGIgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBpbmxpbmVkOiAxOyAgIC8qIG9uZSBvciBtb3JlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gaW5saW5lZCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHNwYXJlIDogMjg7Ci0gICAgICAgIGludCAgICAgIGdsb2JhbHM7ICAgICAgLyogaW5kZXggaW50byB0aGUgRE5UVCB3aGVyZSBHTlRUIGJlZ2lucyAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHRpbWU7ICAgICAgICAgLyogbW9kaWZ5IHRpbWUgb2YgZmlsZSBiZWZvcmUgYmVpbmcgcHhkYmVkICovCi0gICAgICAgIGludCAgICAgIHBnX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGxhYmVsIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgaW50ICAgICAgZnVuY3Rpb25zOyAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZ1bmN0aW9ucyAqLwotICAgICAgICBpbnQgICAgICBmaWxlczsgICAgICAgIC8qIGFjdHVhbCBudW1iZXIgb2YgZmlsZXMgKi8KLSAgICAgICAgaW50ICAgICAgY2RfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gY2xhc3MgbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBhYV9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBhZGRyIGFsaWFzIGxvb2stdXAgdGFibGUgKi8KLSAgICAgICAgaW50ICAgICAgb2lfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gb2JqZWN0IGlkIGxvb2stdXAgdGFibGUgKi8KLX0gRE9DX2luZm9fUFhEQl9oZWFkZXI7Ci0KLS8qIEhlYWRlciB2ZXJzaW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIERPQyBpbmZvIGFuZCB0aGUKLSAqIGV4ZWN1dGFibGUgaGFzIE5PVCBiZWVuIHByb2Nlc3NlZCBieSBweGRiLgotICovCi10eXBlZGVmIHN0cnVjdCBET0NfaW5mb19oZWFkZXJfc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgaW50IHhkYl9oZWFkZXI6IDE7IAkvKiBiaXQgc2V0IGlmIHRoaXMgaXMgcG9zdC0zLjEgeGRiICovIAotICAgICAgICB1bnNpZ25lZCBpbnQgZG9jX2hlYWRlcjogMTsgICAgIC8qIGJpdCBzZXQgaWYgdGhpcyBpcyBkb2Mtc3R5bGUgaGVhZGVyKi8KLSAgICAgICAgdW5zaWduZWQgaW50IHZlcnNpb246IDg7ICAgICAgICAgICAgIC8qIHZlcnNpb24gb2YgZGVidWcvaGVhZGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LiBGb3IgMTAuMCB0aGUgdmFsdWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIDEuIEZvciAiRGF2aXMiIHRoZQotCQkJCQkJdmFsdWUgaXMgMi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludCByZXNlcnZlZF9mb3JfZmxhZ3M6IDE4OyAvKiBmb3IgZnV0dXJlIHVzZTsgLS0gbXVzdCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byB6ZXJvICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19yYW5nZV90YWJsZTogMTsgICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJFJBTkdFJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIHZhcmlhYmxlIHJhbmdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2NvbnRleHRfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBjb250YWlucyBhICRDVFhUJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIGNvbnRleHQvaW5saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludCBoYXNfbGluZXNfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBjb250YWlucyBhICRMSU5FUyQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlIGZvciBsaW5lIHRhYmxlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludCBoYXNfbHRfb2Zmc2V0X21hcDogMTsgICAvKiBzcGFjZSBjb250YWlucyBhbiBsdF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlIGZvciBsaW5lIHRhYmxlIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIGxvbmcgICBnbnR0X2xlbmd0aDsgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgbG50dF9sZW5ndGg7ICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KLSAgICAgICAgbG9uZyAgIHNsdF9sZW5ndGg7ICAgLyogc2FtZSBhcyBvbGQgaGVhZGVyICovCi0gICAgICAgIGxvbmcgICB2dF9sZW5ndGg7ICAgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgeHRfbGVuZ3RoOyAgICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KLSAgICAgICAgbG9uZyAgIGN0eHRfbGVuZ3RoOyAgLyogcHJlc2VudCBvbmx5IGlmIHZlcnNpb24gPj0gMiAqLwotICAgICAgICBsb25nICAgcmFuZ2VfbGVuZ3RoOyAgLyogcHJlc2VudCBvbmx5IGlmIHZlcnNpb24gPj0gMiAqLwotICAgICAgICBsb25nICAgZXhwcl9sZW5ndGg7ICAvKiBwcmVzZW50IG9ubHkgaWYgdmVyc2lvbiA+PSAyICovCi0KLX0gRE9DX2luZm9faGVhZGVyOwotCi10eXBlZGVmIHVuaW9uIEdlbmVyaWNEZWJ1Z0hlYWRlcl91bmlvbgotewotICAgUFhEQl9oZWFkZXIgICAgICAgICAgbm9fZG9jOwotICAgRE9DX2luZm9fUFhEQl9oZWFkZXIgZG9jOwotICAgWERCX2hlYWRlciAgICAgICAgICAgbm9fcHhkYl9ub19kb2M7Ci0gICBET0NfaW5mb19oZWFkZXIgICAgICBub19weGRiX2RvYzsKLX0gR2VuZXJpY0RlYnVnSGVhZGVyOwotCi0KLS8qICBQcm9jZWR1cmUgRGVzY3JpcHRvcjoKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgcHJvY2VkdXJlIHF1aWNrIGxvb2stdXAgdGFibGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfcHJvY2VkdXJlIHsKLSAgICAgICAgbG9uZyAgICAgICAgICAgICBpc3ltOwkJLyogMC1iYXNlZCBpbmRleCBvZiBmaXJzdCBzeW1ib2wqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgZm9yIHByb2NlZHVyZSBpbiAkTE5UVCQsICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIGkuZS4gdGhlIHByb2NlZHVyZSBpdHNlbGYgICovCi0gICAgICAgIENPUkVfQUREUgkgYWRyU3RhcnQ7CS8qIG1lbW9yeSBhZHIgb2Ygc3RhcnQgb2YgcHJvYwkqLwotICAgICAgICBDT1JFX0FERFIJIGFkckVuZDsJLyogbWVtb3J5IGFkciBvZiBlbmQgb2YgcHJvYwkqLwotICAgICAgICBjaGFyICAgICAgICAgICAJKnNiQWxpYXM7CS8qIGFsaWFzIG5hbWUgb2YgcHJvY2VkdXJlCSovCi0gICAgICAgIGNoYXIgICAgICAgICAgICAqc2JQcm9jOwkvKiByZWFsIG5hbWUgb2YgcHJvY2VkdXJlCSovCi0gICAgICAgIENPUkVfQUREUgkgYWRyQnA7CQkvKiBhZGRyZXNzIG9mIGVudHJ5IGJyZWFrcG9pbnQgICovCi0gICAgICAgIENPUkVfQUREUgkgYWRyRXhpdEJwOwkvKiBhZGRyZXNzIG9mIGV4aXQgYnJlYWtwb2ludCAgICovCi0JaW50ICAgICAgICAgICAgICBpY2Q7ICAgICAgICAgICAvKiBtZW1iZXIgb2YgdGhpcyBjbGFzcyAoaW5kZXgpICovCQotCXVuc2lnbmVkIGludAkgaXBkOwkJLyogaW5kZXggb2YgdGVtcGxhdGUgZm9yIHRoaXMgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgZnVuY3Rpb24gKGluZGV4KSAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSB1bnVzZWQ6ICAgIDU7Ci0gICAgICAgIHVuc2lnbmVkIGludAkgbm9fbHRfb2Zmc2V0OiAxOy8qIG5vIGVudHJ5IGluIGx0X29mZnNldCB0YWJsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQJIGZUZW1wbGF0ZTogMTsJLyogZnVuY3Rpb24gdGVtcGxhdGUJCSovCi0gICAgICAgIHVuc2lnbmVkIGludAkgZkV4cGFuc2lvbjogMTsJLyogZnVuY3Rpb24gZXhwYW5zaW9uCQkqLwotCXVuc2lnbmVkIGludAkgbGlua2VkCSAgOiAxOwkvKiBsaW5rZWQgd2l0aCBvdGhlciBleHBhbnNpb25zCSovCi0JdW5zaWduZWQgaW50CSBkdXBsaWNhdGU6IDE7ICAvKiBjbG9uZSBvZiBhbm90aGVyIHByb2NlZHVyZSAgICovCi0JdW5zaWduZWQgaW50CSBvdmVybG9hZGVkOjE7ICAvKiBvdmVybG9hZGVkIGZ1bmN0aW9uICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSBtZW1iZXI6ICAgIDE7ICAvKiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gICAgICAgICovCi0JdW5zaWduZWQgaW50CSBjb25zdHJ1Y3RvcjoxOyAvKiBjb25zdHJ1Y3RvciBmdW5jdGlvbiAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSBkZXN0cnVjdG9yOjE7ICAvKiBkZXN0cnVjdG9yIGZ1bmN0aW9uICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBTdGF0aWM6ICAgIDE7ICAvKiBzdGF0aWMgZnVuY3Rpb24gICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBWaXJ0dWFsOiAgIDE7ICAvKiB2aXJ0dWFsIGZ1bmN0aW9uICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBjb25zdGFudDogIDE7ICAvKiBjb25zdGFudCBmdW5jdGlvbiAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBwdXJlOiAgICAgIDE7ICAvKiBwdXJlICh2aXJ0dWFsKSBmdW5jdGlvbiAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBsYW5ndWFnZTogIDQ7ICAvKiBwcm9jZWR1cmUncyBsYW5ndWFnZSAgICAgICAgICovCi0JdW5zaWduZWQgaW50ICAgICBpbmxpbmVkOiAgIDE7ICAvKiBmdW5jdGlvbiBoYXMgYmVlbiBpbmxpbmVkICAgICovCi0JdW5zaWduZWQgaW50ICAgICBPcGVyYXRvcjogIDE7ICAvKiBvcGVyYXRvciBmdW5jdGlvbiAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSBzdHViOiAgICAgIDE7ICAvKiBib2R5bGVzcyBmdW5jdGlvbiAgICAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludAkgb3B0aW1pemU6ICAyOwkvKiBvcHRpbWl6YXRpb24gbGV2ZWwgICAJKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSBsZXZlbDogICAgIDU7CS8qIG5lc3RpbmcgbGV2ZWwgKHRvcD0wKQkqLwotfSBxdWlja19wcm9jZWR1cmVfZW50cnksICpxdWlja19wcm9jZWR1cmVfZW50cnlfcHRyOwotCi0vKiAgU291cmNlIEZpbGUgRGVzY3JpcHRvcjoKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgc291cmNlIGZpbGUgcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19zb3VyY2UgewotICAgICAgICBsb25nCSAgICAgICBpc3ltOwkJLyogMC1iYXNlZCBpbmRleCBpbiAkTE5UVCQgb2YgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgZmlyc3Qgc3ltYm9sIGZvciB0aGlzIGZpbGUgICAgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgYWRyU3RhcnQ7CS8qIG1lbSBhZHIgb2Ygc3RhcnQgb2YgZmlsZSdzIGNvZGUgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgYWRyRW5kOwkJLyogbWVtIGFkciBvZiBlbmQgb2YgZmlsZSdzIGNvZGUgICAqLwotICAgICAgICBjaGFyCSAgICAgICpzYkZpbGU7CQkvKiBuYW1lIG9mIHNvdXJjZSBmaWxlCQkgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICBmSGFzRGVjbDogMTsJLyogZG8gd2UgaGF2ZSBhIC5kIGZpbGU/CSAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIGZXYXJuZWQ6ICAxOwkvKiBoYXZlIHdhcm5lZCBhYm91dCBhZ2UgcHJvYmxlbXM/ICovCi0JdW5zaWduZWQgaW50ICAgZlNyY2ZpbGU6IDE7ICAgICAvKiAwID0+IGluY2x1ZGUgMT0+IHNvdXJjZSAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGlsbk1hYzsJCS8qIGxpbmVzIGluIGZpbGUgKDAgaWYgZG9uJ3Qga25vdykgKi8KLSAgICAgICAgaW50CSAgICAgICBpcGQ7CQkvKiAwLWJhc2VkIGluZGV4IG9mIGZpcnN0IHByb2NlZHVyZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBpbiB0aGlzIGZpbGUsIGluIHRoZSBxdWljayAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgbG9vay11cCB0YWJsZSBvZiBwcm9jZWR1cmVzICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAqcmdMbjsJCS8qIGxpbmUgcG9pbnRlciBhcnJheSwgaWYgYW55CSAgICovCi19IHF1aWNrX2ZpbGVfZW50cnksICpxdWlja19maWxlX2VudHJ5X3B0cjsKLQotLyogIE1vZHVsZSBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBtb2R1bGUgcXVpY2sgcmVmZXJlbmNlIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX21vZHVsZSB7Ci0gICAgICAgIGxvbmcgICAgICAgICAgICAgaXN5bTsJCSAgIC8qIDAtYmFzZWQgaW5kZXggb2YgZmlyc3QgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIHN5bWJvbCBmb3IgbW9kdWxlICAgICAgICovCi0gICAgICAgIENPUkVfQUREUgkgYWRyU3RhcnQ7CSAgIC8qIGFkciBvZiBzdGFydCBvZiBtb2QuCSovCi0gICAgICAgIENPUkVfQUREUgkgYWRyRW5kOwkgICAvKiBhZHIgb2YgZW5kIG9mIG1vZC4JKi8KLSAgICAgICAgY2hhcgkgICAgICAgICpzYkFsaWFzOwkgICAvKiBhbGlhcyBuYW1lIG9mIG1vZHVsZSAgIAkqLwotICAgICAgICBjaGFyCSAgICAgICAgKnNiTW9kOwkJICAgLyogcmVhbCBuYW1lIG9mIG1vZHVsZQkqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGltcG9ydHM6ICAgICAgIDE7IC8qIG1vZHVsZSBoYXZlIGFueSBpbXBvcnRzPyAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICB2YXJzX2luX2Zyb250OiAxOyAvKiBtb2R1bGUgZ2xvYmFscyBpbiBmcm9udD8gICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgdmFyc19pbl9nYXBzOiAgMTsgLyogbW9kdWxlIGdsb2JhbHMgaW4gZ2Fwcz8gICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGxhbmd1YWdlOiAgICAgIDQ7IC8qIHR5cGUgb2YgbGFuZ3VhZ2UgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICB1bnVzZWQgICAgICA6IDI1OwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHVudXNlZDI7CSAgIC8qIHNwYWNlIGZvciBmdXR1cmUgc3R1ZmYJKi8KLX0gcXVpY2tfbW9kdWxlX2VudHJ5LCAqcXVpY2tfbW9kdWxlX2VudHJ5X3B0cjsKLQotLyogIEF1eGlsaWFyeSBQcm9jZWR1cmUgRGVzY3JpcHRvcjoKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgYXV4aWxpYXJ5IHByb2NlZHVyZSBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX2F1eF9wcm9jZWR1cmUgewotICAgICAgICBsb25nCSBpc3ltX2lubG47CS8qIHN0YXJ0IG9uIGlubGluZSBsaXN0IGZvciBwcm9jICovCi0JbG9uZyAgICAgc3BhcmU7Ci19IHF1aWNrX2F1eF9wcm9jZWR1cmVfZW50cnksICpxdWlja19hdXhfcHJvY2VkdXJlX2VudHJ5X3B0cjsKLQotLyogIFBhcmFncmFwaCBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBwYXJhZ3JhcGggcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19wYXJhZ3JhcGggewotICAgICAgICBsb25nICAgICAgICAgICAgIGlzeW07ICAgICAgIC8qIGZpcnN0IHN5bWJvbCBmb3IgbGFiZWwgKGluZGV4KSAgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgICBhZHJTdGFydDsgICAvKiBtZW1vcnkgYWRyIG9mIHN0YXJ0IG9mIGxhYmVsICAgICovCi0gICAgICAgIENPUkVfQUREUiAgICAgICAgYWRyRW5kOyAgICAgLyogbWVtb3J5IGFkciBvZiBlbmQgb2YgbGFiZWwgICAgICAqLwotICAgICAgICBjaGFyICAgICAgICAgICAgKnNiTGFiOyAgICAgIC8qIG5hbWUgb2YgbGFiZWwgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBpbnN0OyAgICAgICAvKiBVc2VkIGluIHhkYiB0byBzdG9yZSBpbnN0IEAgYnAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgc2VjdDogICAgMTsgLyogdHJ1ZSA9IHNlY3Rpb24sIGZhbHNlID0gcGFyYWcuICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHVudXNlZDogMzE7IC8qIGZ1dHVyZSB1c2UgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gcXVpY2tfcGFyYWdyYXBoX2VudHJ5LCAqcXVpY2tfcGFyYWdyYXBoX2VudHJ5X3B0cjsKLQotLyoKLSAqICBDbGFzcyBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBjbGFzcyBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX2NsYXNzIHsKLSAgICAgICAgY2hhcgkgICAgICAgICAqc2JDbGFzczsJLyogbmFtZSBvZiBjbGFzcwkgICAgICAgICovCi0gICAgICAgIGxvbmcgICAgICAgICAgICAgIGlzeW07ICAgICAgICAgLyogY2xhc3Mgc3ltYm9sICh0YWcpICAgICAgICAgICAqLwotCXVuc2lnbmVkIGludAkgIHR5cGUgOiAyOwkvKiAwPWNsYXNzLCAxPXVuaW9uLCAyPXN0cnVjdCAgICovCi0JdW5zaWduZWQgaW50CSAgZlRlbXBsYXRlIDogMTsvKiBjbGFzcyB0ZW1wbGF0ZSAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSAgZXhwYW5zaW9uIDogMTsvKiB0ZW1wbGF0ZSBleHBhbnNpb24gICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSAgdW51c2VkICAgIDoyODsKLQlzbHRwb2ludGVyICAgICAgICBsb3dzY29wZTsJLyogYmVnaW5uaW5nIG9mIGRlZmluZWQgc2NvcGUgICAqLwotCXNsdHBvaW50ZXIgICAgICAgIGhpc2NvcGU7CS8qIGVuZCBvZiBkZWZpbmVkIHNjb3BlICAgICAgICAgKi8KLX0gcXVpY2tfY2xhc3NfZW50cnksICpxdWlja19jbGFzc19lbnRyeV9wdHI7Ci0KLS8qICBBZGRyZXNzIEFsaWFzIEVudHJ5Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIGFkZHJlc3MgYWxpYXMgcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19hbGlhcyB7Ci0JQ09SRV9BRERSICAgICAgIGxvdzsKLQlDT1JFX0FERFIgICAgICAgaGlnaDsKLQlpbnQgICAgICAgICAgICAgaW5kZXg7Ci0JdW5zaWduZWQgaW50CXVudXNlZCA6IDMxOwotCXVuc2lnbmVkIGludAlhbHRlcm5hdGUgOiAxOwkvKiBhbHRlcm5hdGUgdW5uYW1lZCBhbGlhc2VzPyAgICovCi19IHF1aWNrX2FsaWFzX2VudHJ5LCAqcXVpY2tfYWxpYXNfZW50cnlfcHRyOwotCi0vKiAgT2JqZWN0IElkZW50aWZpY2F0aW9uIEVudHJ5Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIG9iamVjdCBpZGVudGlmaWNhdGlvbiBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfb2JqX0lEIHsKLQlDT1JFX0FERFIgICAgb2JqX2lkZW50OwkJLyogY2xhc3MgaWRlbnRpZmllciAgICAgICAgICovCi0JbG9uZyAgICAgICAgIGlzeW07CQkvKiBjbGFzcyBzeW1ib2wgICAgICAgICAgICAgKi8KLQlsb25nICAgICAgICAgb2Zmc2V0OwkJLyogb2Zmc2V0IHRvIG9iamVjdCBzdGFydCAgICovCi19IHF1aWNrX29ial9JRF9lbnRyeSwgKnF1aWNrX29ial9JRF9lbnRyeV9wdHI7Ci0KLQotI2VuZGlmIC8qIEhQX1NZTVRBQl9JTkNMVURFRCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2llZWUuaCBiL2luY2x1ZGUvaWVlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWRlMzlkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaWVlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qIElFRUUgU3RhbmRhcmQgNjk1LTE5ODAgIlVuaXZlcnNhbCBGb3JtYXQgZm9yIE9iamVjdCBNb2R1bGVzIiBoZWFkZXIgZmlsZQotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jZGVmaW5lIE5fV19WQVJJQUJMRVMgOAotI2RlZmluZSBNb2R1bGVfQmVnaW5uaW5nIDB4ZTAKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9tb2R1bGUgewotICBjaGFyICpwcm9jZXNzb3I7Ci0gIGNoYXIgKm1vZHVsZV9uYW1lOwotfSBpZWVlX21vZHVsZV9iZWdpbl90eXBlOwotCi0jZGVmaW5lIEFkZHJlc3NfRGVzY3JpcHRvciAweGVjCi10eXBlZGVmIHN0cnVjdCBpZWVlX2FkZHJlc3MgewotYmZkX3ZtYSBudW1iZXJfb2ZfYml0c19tYXU7Ci0gYmZkX3ZtYSBudW1iZXJfb2ZfbWF1c19pbl9hZGRyZXNzOwotCi0gIHVuc2lnbmVkIGNoYXIgYnl0ZV9vcmRlcjsKLSNkZWZpbmUgSUVFRV9MSVRUTEUgMHhjYwotI2RlZmluZSBJRUVFX0JJRyAweGNkCi19IGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX3R5cGU7Ci0KLXR5cGVkZWYgdW5pb24gaWVlZV93X3ZhcmlhYmxlIHsKLSAgZmlsZV9wdHIgb2Zmc2V0W05fV19WQVJJQUJMRVNdOwotICBzdHJ1Y3QgewotICAgIGZpbGVfcHRyIGV4dGVuc2lvbl9yZWNvcmQ7Ci0gICAgZmlsZV9wdHIgZW52aXJvbm1lbnRhbF9yZWNvcmQ7Ci0gICAgZmlsZV9wdHIgc2VjdGlvbl9wYXJ0OwotICAgIGZpbGVfcHRyIGV4dGVybmFsX3BhcnQ7Ci0gICAgZmlsZV9wdHIgZGVidWdfaW5mb3JtYXRpb25fcGFydDsKLSAgICBmaWxlX3B0ciBkYXRhX3BhcnQ7Ci0gICAgZmlsZV9wdHIgdHJhaWxlcl9wYXJ0OwotICAgIGZpbGVfcHRyIG1lX3JlY29yZDsKLSAgfSByOwotfSBpZWVlX3dfdmFyaWFibGVfdHlwZTsKLQotCi0KLQotCi10eXBlZGVmIGVudW0gaWVlZV9yZWNvcmQKLXsgCi0gIGllZWVfbnVtYmVyX3N0YXJ0X2VudW0gPSAweDAwLAotICBpZWVlX251bWJlcl9lbmRfZW51bT0weDdmLAotICBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSA9IDB4ODAsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSA9IDB4ODgsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF80X2VudW0gPSAweDg0LAotICBpZWVlX251bWJlcl9yZXBlYXRfM19lbnVtID0gMHg4MywKLSAgaWVlZV9udW1iZXJfcmVwZWF0XzJfZW51bSA9IDB4ODIsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF8xX2VudW0gPSAweDgxLAotICBpZWVlX21vZHVsZV9iZWdpbm5pbmdfZW51bSA9IDB4ZTAsCi0gIGllZWVfbW9kdWxlX2VuZF9lbnVtID0gMHhlMSwKLSAgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzFfZW51bSA9IDB4ZGUsCi0gIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8yX2VudW0gPSAweGRmLAotICBpZWVlX3NlY3Rpb25fdHlwZV9lbnVtID0gMHhlNiwKLSAgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtID0gMHhlNywKLSAgaWVlZV9leHRlcm5hbF9zeW1ib2xfZW51bSA9IDB4ZTgsCi0gIGllZWVfY29tbWEgPSAweDkwLAotICBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtID0gMHhlOSwKLSAgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW0gPSAweGU1LAotICBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtID0gMHhlYywKLSAgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0gPSAweGVkLAotICBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW0gPSAweGU0LAotCi0gIGllZWVfdmFyaWFibGVfQV9lbnVtID0gMHhjMSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9CX2VudW0gPSAweGMyLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0NfZW51bSA9IDB4YzMsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfRF9lbnVtID0gMHhjNCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9FX2VudW0gPSAweGM1LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0ZfZW51bSA9IDB4YzYsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfR19lbnVtID0gMHhjNywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9IX2VudW0gPSAweGM4LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0lfZW51bSA9IDB4YzksCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfSl9lbnVtID0gMHhjYSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9LX2VudW0gPSAweGNiLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0xfZW51bSA9IDB4Y2MsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfTV9lbnVtID0gMHhjZCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9OX2VudW0gPSAweGNlLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX09fZW51bSA9IDB4Y2YsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfUF9lbnVtID0gMHhkMCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9RX2VudW0gPSAweGQxLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1JfZW51bSA9IDB4ZDIsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfU19lbnVtID0gMHhkMywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9UX2VudW0gPSAweGQ0LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1VfZW51bSA9IDB4ZDUsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfVl9lbnVtID0gMHhkNiwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9XX2VudW0gPSAweGQ3LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1hfZW51bSA9IDB4ZDgsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfWV9lbnVtID0gMHhkOSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9aX2VudW0gPSAweGRhLAotICBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bSA9IDB4YTUsCi0gIGllZWVfZnVuY3Rpb25fbWludXNfZW51bSA9IDB4YTYsCi0gIGllZWVfZnVuY3Rpb25fc2lnbmVkX29wZW5fYl9lbnVtID0gMHhiYSwKLSAgaWVlZV9mdW5jdGlvbl9zaWduZWRfY2xvc2VfYl9lbnVtID0gMHhiYiwKLQotICBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX29wZW5fYl9lbnVtID0gMHhiYywKLSAgaWVlZV9mdW5jdGlvbl91bnNpZ25lZF9jbG9zZV9iX2VudW0gPSAweGJkLAotCi0gIGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtID0gMHhiZSwKLSAgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtID0gMHhiZiwKLSAgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0gPSAweGRiLAotCi0gIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtID0gMHhlMiwKLSAgaWVlZV9zZWN0aW9uX3NpemVfZW51bSA9IDB4ZTJkMywKLSAgaWVlZV9waHlzaWNhbF9yZWdpb25fc2l6ZV9lbnVtID0gMHhlMmMxLAotICBpZWVlX3JlZ2lvbl9iYXNlX2FkZHJlc3NfZW51bSA9IDB4ZTJjMiwKLSAgaWVlZV9tYXVfc2l6ZV9lbnVtID0gMHhlMmM2LAotICBpZWVlX21fdmFsdWVfZW51bSA9IDB4ZTJjZCwKLSAgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtID0gMHhlMmNjLAotICBpZWVlX2Fzbl9yZWNvcmRfZW51bSA9IDB4ZTJjZSwKLSAgaWVlZV9zZWN0aW9uX29mZnNldF9lbnVtID0gMHhlMmQyLAotICBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSA9IDB4ZTJjNywKLSAgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSA9IDB4ZTJkNywKLSAgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtID0gMHhlMmQwLAotICBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtID0gMHhlMmM5LAotICBpZWVlX25uX3JlY29yZCA9IDB4ZjAsCi0gIGllZWVfYXRfcmVjb3JkX2VudW0gPSAweGYxLAotICBpZWVlX3R5X3JlY29yZF9lbnVtID0gMHhmMiwKLSAgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0gPSAweGYxYzksCi0gIGllZWVfYXRuX3JlY29yZF9lbnVtID0gMHhmMWNlLAotICBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX3JlY29yZF9lbnVtID0gMHhmMWQ4LAotICBpZWVlX3dlYWtfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW09IDB4ZjQsCi0gIGllZWVfcmVwZWF0X2RhdGFfZW51bSA9IDB4ZjcsCi0gIGllZWVfYmJfcmVjb3JkX2VudW0gPSAweGY4LAotICBpZWVlX2JlX3JlY29yZF9lbnVtID0gMHhmOQotfSBpZWVlX3JlY29yZF9lbnVtX3R5cGU7Ci0JCSAKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9zZWN0aW9uIHsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX3R5cGU7Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgdW5zaWduZWQgaW50IHBhcmVudF9zZWN0aW9uX2luZGV4OwotICB1bnNpZ25lZCBpbnQgc2libGluZ19zZWN0aW9uX2luZGV4OwotICB1bnNpZ25lZCBpbnQgY29udGV4dF9pbmRleDsKLX0gaWVlZV9zZWN0aW9uX3R5cGU7Ci0jZGVmaW5lIElFRUVfUkVGRVJFTkNFX0JBU0UgMTEKLSNkZWZpbmUgSUVFRV9QVUJMSUNfQkFTRSAzMgotI2RlZmluZSBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UgMQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYmliZXJ0eS5oIGIvaW5jbHVkZS9saWJpYmVydHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1MzZhNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpYmliZXJ0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgbGliaWJlcnR5LgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydCwgMTk5NC4KLQotICAgVGhlIGxpYmliZXJ0eSBsaWJyYXJ5IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB3aGljaCBhcmUKLSAgIG1pc3Npbmcgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gIFdlIGRvIG5vdCBkZWNsYXJlIHRob3NlIGhlcmUsCi0gICB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBvbiBvcGVyYXRpbmcKLSAgIHN5c3RlbXMgdGhhdCBkbyBzdXBwb3J0IHRob3NlIGZ1bmN0aW9ucy4gIEluIHRoaXMgZmlsZSB3ZSBvbmx5Ci0gICBkZWNsYXJlIHRob3NlIGZ1bmN0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gbGliaWJlcnR5LiAgKi8KLQotI2lmbmRlZiBMSUJJQkVSVFlfSAotI2RlZmluZSBMSUJJQkVSVFlfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBCdWlsZCBhbiBhcmd1bWVudCB2ZWN0b3IgZnJvbSBhIHN0cmluZy4gIEFsbG9jYXRlcyBtZW1vcnkgdXNpbmcKLSAgIG1hbGxvYy4gIFVzZSBmcmVlYXJndiB0byBmcmVlIHRoZSB2ZWN0b3IuICAqLwotCi1leHRlcm4gY2hhciAqKmJ1aWxkYXJndiBQQVJBTVMgKChjaGFyICopKSBBVFRSSUJVVEVfTUFMTE9DOwotCi0vKiBGcmVlIGEgdmVjdG9yIHJldHVybmVkIGJ5IGJ1aWxkYXJndi4gICovCi0KLWV4dGVybiB2b2lkIGZyZWVhcmd2IFBBUkFNUyAoKGNoYXIgKiopKTsKLQotLyogRHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4gQWxsb2NhdGVzIG1lbW9yeSB1c2luZyBtYWxsb2MuICBVc2UKLSAgIGZyZWVhcmd2IHRvIGZyZWUgdGhlIHZlY3Rvci4gICovCi0KLWV4dGVybiBjaGFyICoqZHVwYXJndiBQQVJBTVMgKChjaGFyICoqKSkgQVRUUklCVVRFX01BTExPQzsKLQotCi0vKiBSZXR1cm4gdGhlIGxhc3QgY29tcG9uZW50IG9mIGEgcGF0aCBuYW1lLiAgTm90ZSB0aGF0IHdlIGNhbid0IHVzZSBhCi0gICBwcm90b3R5cGUgaGVyZSBiZWNhdXNlIHRoZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgaW5jb25zaXN0ZW50bHkKLSAgIGFjcm9zcyBkaWZmZXJlbnQgc3lzdGVtcywgc29tZXRpbWVzIGFzICJjaGFyICoiIGFuZCBzb21ldGltZXMgYXMKLSAgICJjb25zdCBjaGFyICoiICovCi0KLSNpZiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18gKSB8fCBkZWZpbmVkIChfX2xpbnV4X18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkIChfX09wZW5CU0RfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotZXh0ZXJuIGNoYXIgKmJhc2VuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotI2Vsc2UKLWV4dGVybiBjaGFyICpiYXNlbmFtZSAoKTsKLSNlbmRpZgotCi0vKiBDb25jYXRlbmF0ZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHN0cmluZ3MsIHVwIHRvIChjaGFyICopIE5VTEwuCi0gICBBbGxvY2F0ZXMgbWVtb3J5IHVzaW5nIHhtYWxsb2MuICAqLwotCi1leHRlcm4gY2hhciAqY29uY2F0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSkgQVRUUklCVVRFX01BTExPQzsKLQotLyogQ2hlY2sgd2hldGhlciB0d28gZmlsZSBkZXNjcmlwdG9ycyByZWZlciB0byB0aGUgc2FtZSBmaWxlLiAgKi8KLQotZXh0ZXJuIGludCBmZG1hdGNoIFBBUkFNUyAoKGludCBmZDEsIGludCBmZDIpKTsKLQotLyogR2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gIFRoZSByZXN1bHQgaXMgY2FjaGVkLCBzbyBkb24ndCBjYWxsCi0gICBjaGRpcigpIGJldHdlZW4gY2FsbHMgdG8gZ2V0cHdkKCkuICAqLwotCi1leHRlcm4gY2hhciAqIGdldHB3ZCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEdldCB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIHByb2Nlc3MgaGFzIHJ1biwgaW4gbWljcm9zZWNvbmRzLiAgKi8KLQotZXh0ZXJuIGxvbmcgZ2V0X3J1bl90aW1lIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ2hvb3NlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIHNjcmF0Y2ggZmlsZXMuICAqLwotCi1leHRlcm4gY2hhciAqY2hvb3NlX3RlbXBfYmFzZSBQQVJBTVMgKCh2b2lkKSkgQVRUUklCVVRFX01BTExPQzsKLQotLyogUmV0dXJuIGEgdGVtcG9yYXJ5IGZpbGUgbmFtZSBvciBOVUxMIGlmIHVuYWJsZSB0byBjcmVhdGUgb25lLiAgKi8KLQotZXh0ZXJuIGNoYXIgKm1ha2VfdGVtcF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpIEFUVFJJQlVURV9NQUxMT0M7Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSBmaWxsZWQgd2l0aCBzcGFjZXMuICBBbGxvY2F0ZXMgdXNpbmcgbWFsbG9jLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYWNlcyBQQVJBTVMgKChpbnQgY291bnQpKTsKLQotLyogUmV0dXJuIHRoZSBtYXhpbXVtIGVycm9yIG51bWJlciBmb3Igd2hpY2ggc3RyZXJyb3Igd2lsbCByZXR1cm4gYQotICAgc3RyaW5nLiAgKi8KLQotZXh0ZXJuIGludCBlcnJub19tYXggUEFSQU1TICgodm9pZCkpOwotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUgKGUuZy4sIHN0cmVycm5vIChFSU5WQUwpIHJldHVybnMKLSAgICJFSU5WQUwiKS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpzdHJlcnJubyBQQVJBTVMgKChpbnQpKTsKLQotLyogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUsIHJldHVybiB0aGUgdmFsdWUuICAqLwotCi1leHRlcm4gaW50IHN0cnRvZXJybm8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIEFOU0kncyBzdHJlcnJvcigpLCBidXQgbW9yZSByb2J1c3QuICAqLwotCi1leHRlcm4gY2hhciAqeHN0cmVycm9yIFBBUkFNUyAoKGludCkpOwotCi0vKiBSZXR1cm4gdGhlIG1heGltdW0gc2lnbmFsIG51bWJlciBmb3Igd2hpY2ggc3Ryc2lnbmFsIHdpbGwgcmV0dXJuIGEKLSAgIHN0cmluZy4gICovCi0KLWV4dGVybiBpbnQgc2lnbm9fbWF4IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUmV0dXJuIGEgc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nIGZvciBhIHNpZ25hbCBudW1iZXIKLSAgIChlLmcuLCBzdHJzaWduYWwgKFNJR0hVUCkgcmV0dXJucyBzb21ldGhpbmcgbGlrZSAiSGFuZ3VwIikuICAqLwotLyogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGFzIGl0IGNhbiBjb25mbGljdCB3aXRoIG9uZSBpbiBzeXN0ZW0gaGVhZGVycy4KLSAgIFdlIHN0aWxsIGRvY3VtZW50IGl0cyBleGlzdGVuY2UgdGhvdWdoLiAgKi8KLQotLypleHRlcm4gY29uc3QgY2hhciAqc3Ryc2lnbmFsIFBBUkFNUyAoKGludCkpOyovCi0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiBhIHNpZ25hbCBudW1iZXIgKGUuZy4sIHN0cnNpZ25vIChTSUdIVVApIHJldHVybnMKLSAgICJTSUdIVVAiKS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpzdHJzaWdubyBQQVJBTVMgKChpbnQpKTsKLQotLyogR2l2ZW4gdGhlIG5hbWUgb2YgYSBzaWduYWwsIHJldHVybiBpdHMgbnVtYmVyLiAgKi8KLQotZXh0ZXJuIGludCBzdHJ0b3NpZ25vIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIHJ1biBieSB4ZXhpdC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLiAgKi8KLQotZXh0ZXJuIGludCB4YXRleGl0IFBBUkFNUyAoKHZvaWQgKCpmbikgKHZvaWQpKSk7Ci0KLS8qIEV4aXQsIGNhbGxpbmcgYWxsIHRoZSBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHhhdGV4aXQuICAqLwotCi1leHRlcm4gdm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSkgQVRUUklCVVRFX05PUkVUVVJOOwotCi0vKiBTZXQgdGhlIHByb2dyYW0gbmFtZSB1c2VkIGJ5IHhtYWxsb2MuICAqLwotCi1leHRlcm4gdm9pZCB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSB3aXRob3V0IGZhaWwuICBJZiBtYWxsb2MgZmFpbHMsIHRoaXMgd2lsbCBwcmludCBhCi0gICBtZXNzYWdlIHRvIHN0ZGVyciAodXNpbmcgdGhlIG5hbWUgc2V0IGJ5IHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSwKLSAgIGlmIGFueSkgYW5kIHRoZW4gY2FsbCB4ZXhpdC4gICovCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLS8qIEdldCBhIGRlZmluaXRpb24gZm9yIHNpemVfdC4gICovCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciB2YV9saXN0LiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotZXh0ZXJuIFBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpIEFUVFJJQlVURV9NQUxMT0M7Ci0KLS8qIFJlYWxsb2NhdGUgbWVtb3J5IHdpdGhvdXQgZmFpbC4gIFRoaXMgd29ya3MgbGlrZSB4bWFsbG9jLiAgTm90ZSwKLSAgIHJlYWxsb2MgdHlwZSBmdW5jdGlvbnMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgYXR0cmlidXRlIG1hbGxvYyBzaW5jZQotICAgdGhleSBtYXkgcmV0dXJuIHRoZSBzYW1lIGFkZHJlc3MgYWNyb3NzIG11bHRpcGxlIGNhbGxzLiAqLwotCi1leHRlcm4gUFRSIHhyZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSB3aXRob3V0IGZhaWwgYW5kIHNldCBpdCB0byB6ZXJvLiAgVGhpcyB3b3JrcyBsaWtlCi0gICB4bWFsbG9jLiAgKi8KLQotZXh0ZXJuIFBUUiB4Y2FsbG9jIFBBUkFNUyAoKHNpemVfdCwgc2l6ZV90KSkgQVRUUklCVVRFX01BTExPQzsKLQotLyogQ29weSBhIHN0cmluZyBpbnRvIGEgbWVtb3J5IGJ1ZmZlciB3aXRob3V0IGZhaWwuICAqLwotCi1leHRlcm4gY2hhciAqeHN0cmR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKSBBVFRSSUJVVEVfTUFMTE9DOwotCi0vKiBDb3B5IGFuIGV4aXN0aW5nIG1lbW9yeSBidWZmZXIgdG8gYSBuZXcgbWVtb3J5IGJ1ZmZlciB3aXRob3V0IGZhaWwuICAqLwotCi1leHRlcm4gUFRSIHhtZW1kdXAgUEFSQU1TICgoY29uc3QgUFRSLCBzaXplX3QsIHNpemVfdCkpIEFUVFJJQlVURV9NQUxMT0M7Ci0KLS8qIGhleCBjaGFyYWN0ZXIgbWFuaXB1bGF0aW9uIHJvdXRpbmVzICovCi0KLSNkZWZpbmUgX2hleF9hcnJheV9zaXplIDI1NgotI2RlZmluZSBfaGV4X2JhZAk5OQotZXh0ZXJuIGNoYXIgX2hleF92YWx1ZVtfaGV4X2FycmF5X3NpemVdOwotZXh0ZXJuIHZvaWQgaGV4X2luaXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBoZXhfcChjKQkoaGV4X3ZhbHVlIChjKSAhPSBfaGV4X2JhZCkKLS8qIElmIHlvdSBjaGFuZ2UgdGhpcywgbm90ZSB3ZWxsOiBTb21lIGNvZGUgcmVsaWVzIG9uIHNpZGUgZWZmZWN0cyBpbgotICAgdGhlIGFyZ3VtZW50IGJlaW5nIHBlcmZvcm1lZCBleGFjdGx5IG9uY2UuICAqLwotI2RlZmluZSBoZXhfdmFsdWUoYykJKF9oZXhfdmFsdWVbKHVuc2lnbmVkIGNoYXIpIChjKV0pCi0KLS8qIERlZmluaXRpb25zIHVzZWQgYnkgdGhlIHBleGVjdXRlIHJvdXRpbmUuICAqLwotCi0jZGVmaW5lIFBFWEVDVVRFX0ZJUlNUICAgMQotI2RlZmluZSBQRVhFQ1VURV9MQVNUICAgIDIKLSNkZWZpbmUgUEVYRUNVVEVfT05FICAgICAoUEVYRUNVVEVfRklSU1QgKyBQRVhFQ1VURV9MQVNUKQotI2RlZmluZSBQRVhFQ1VURV9TRUFSQ0ggIDQKLSNkZWZpbmUgUEVYRUNVVEVfVkVSQk9TRSA4Ci0KLS8qIEV4ZWN1dGUgYSBwcm9ncmFtLiAgKi8KLQotZXh0ZXJuIGludCBwZXhlY3V0ZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNoYXIgKiBjb25zdCAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCBjaGFyICoqLCBpbnQpKTsKLQotLyogV2FpdCBmb3IgcGV4ZWN1dGUgdG8gZmluaXNoLiAgKi8KLQotZXh0ZXJuIGludCBwd2FpdCBQQVJBTVMgKChpbnQsIGludCAqLCBpbnQpKTsKLQotLyogTGlrZSBzcHJpbnRmIGJ1dCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gbWFsbG9jJ2Qgc3RvcmFnZSwgd2hpY2ggbXVzdAotICAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCi0KLWV4dGVybiBpbnQgYXNwcmludGYgUEFSQU1TICgoY2hhciAqKiwgY29uc3QgY2hhciAqLCAuLi4pKSBBVFRSSUJVVEVfUFJJTlRGXzI7Ci0KLS8qIExpa2UgdnNwcmludGYgYnV0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9yYWdlLCB3aGljaAotICAgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiAgKi8KLQotZXh0ZXJuIGludCB2YXNwcmludGYgUEFSQU1TICgoY2hhciAqKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSkKLSAgQVRUUklCVVRFX1BSSU5URigyLDApOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKExJQklCRVJUWV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvQ2hhbmdlTG9nIGIvaW5jbHVkZS9tcHcvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGJhZDg3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLVR1ZSBGZWIgMjcgMTI6MjM6MDQgMTk5NiAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LmggKEhBVkVfVlBSSU5URik6IEFkZCBhbmQgZGVmaW5lIHRvIGhhdmUgdGhlIHZhbHVlIDEuCi0KLUZyaSBEZWMgMjkgMTQ6NDA6NDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuaCAoSEFWRV9TVERMSUJfSCwgZXRjKTogRGVmaW5lIHRvIGhhdmUgdGhlIHZhbHVlIDEuCi0JKEhBVkVfRkNOVExfSCk6IERlZmluZS4KLQotTW9uIERlYyAxMSAxNTozOTowNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oIChvcGVuLCBhY2Nlc3MpOiBEZWZpbmUgYXMgbXB3X29wZW4gYW5kIG1wd19hY2Nlc3MuCi0KLVRodSBOb3YgIDkgMTU6Mzg6MzcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuaDogSW5jbHVkZSB1bml4LmggaWYgVVNFX01XX0hFQURFUlMsIG90aGVyd2lzZSBpbmNsdWRlCi0JdmFyaW91cyBvcmlnaW5hbCBNUFcgaW5jbHVkZSBmaWxlcyAoaW9jdGwuaCwgZXRjKS4KLQkoRUlPKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCSogc3lzL2lvY3RsLmg6IFJlbW92ZSwgbm90IG5lZWRlZC4KLQotV2VkIE9jdCAyNSAxMjozMDo0NCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oOiBEb24ndCBpbmNsdWRlIGVycm5vLmggb3IgaW9jdGwuaC4KLQkoRU5PRU5ULCBFQUNDRVMsIEVOT1NZUyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoZmRvcGVuKTogRGVjbGFyZSBpZiBfX1NURENfXy4KLQkoUl9PSywgV19PSywgWF9PSyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQotVHVlIFNlcCAyNiAxNDo1NzoyMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oOiBOZXcgZmlsZSwgdW5pdmVyc2FsbHkgdXNlZnVsIE1QVyBob3N0IGRlZmluaXRpb25zLgotCU1hbnkgb2YgdGhlc2UgdXNlZCB0byBsaXZlIGluIGJmZC9ob3N0cy9tcHcuaC4KLQkqIGdycC5oOiBSZW1vdmUgUkNTIGNvbW1lbnQuCi0JKiBzeXMvaW9jdGwuaDogQWRkIGEgY29tbWVudCBsaW5lLgotCi1XZWQgRGVjIDE0IDEzOjEyOjE0IDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogc3Bpbi5oOiBOZXcgZmlsZSwgY3Vyc29yIHNwaW5uaW5nIGZvciBwcm9ncmVzcy4KLQotVGh1IEp1biAzMCAxNTozMjowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGZjbnRsLmggKG9wZW4pOiBBbGxvdyBvcHRpb25hbCB0aGlyZCBhcmcuCi0KLVRodSBBcHIgMTQgMTI6NTQ6NTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBkaXIuaCwgZGlyZW50LmgsIGZjbnRsLmgsIGdycC5oLCBwd2QuaCwgc3RhdC5oOiBOZXcgZmlsZXMuCi0JKiBzeXMvaW9jdGwuaDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgMjEgMDk6NDQ6NDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBzeXMvc3RhdC5oIChzdHJ1Y3Qgc3RhdCk6IE5ldyBmaWVsZCBzdF9yc2l6ZS4KLQkoU19JRk1ULCBldGMpOiBVc2UgZGlmZmVyZW50IGJpdCBwb3NpdGlvbnMuCi0JKGZzdGF0KTogQWRkIHBhcmFtZXRlciBuYW1lcyB0byBwcm90b3R5cGUuCi0KLU1vbiBKYW4gMzEgMTk6MzA6MTYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCSogdXRpbWUuaCwgdmFyYXJncy5oOiBOZXcgZmlsZXMsIHNpbXVsYXRlZCBQb3NpeC4KLQkqIHN5cy97ZmlsZSxwYXJhbSxyZXNvdXJjZSxzdGF0LHRpbWUsdHlwZXN9Lmg6IE5ldyBmaWxlcywgbW9yZQotCXNpbXVsYXRlZCBQb3NpeC4KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9SRUFETUUgYi9pbmNsdWRlL21wdy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTkyZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgaW5jbHVkZSBmaWxlcyB0aGF0IGhlbHAgaW1pdGF0ZSBQb3NpeCBpbiBNUFcuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9kaXIuaCBiL2luY2x1ZGUvbXB3L2Rpci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNjZDJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L2Rpci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogVGhlIDxkaXIuaD4gaGVhZGVyIGdpdmVzIHRoZSBsYXlvdXQgb2YgYSBkaXJlY3RvcnkuICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9ESVJfSAotI2RlZmluZSBfRElSX0gKLQotI2lmbmRlZiBfVFlQRVNfSAkJLyogbm90IHF1aXRlIHJpZ2h0ICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2RlZmluZQlESVJCTEtTSVoJNTEyCS8qIHNpemUgb2YgZGlyZWN0b3J5IGJsb2NrICovCi0KLSNpZm5kZWYgRElSU0laCi0jZGVmaW5lCURJUlNJWgkxNAotI2VuZGlmCi0KLXN0cnVjdCBkaXJlY3QgewotICBpbm9fdCBkX2lubzsKLSAgY2hhciBkX25hbWVbRElSU0laXTsKLX07Ci0KLSNlbmRpZiAvKiBfRElSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L2RpcmVudC5oIGIvaW5jbHVkZS9tcHcvZGlyZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDAwYjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvZGlyZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jaWZuZGVmIF9fZGlyZW50X2gKLSNkZWZpbmUgX19kaXJlbnRfaAotCi0jaW5jbHVkZSAic3lzL2Rpci5oIgotCi1zdHJ1Y3QgZGlyZW50IHsKLSAgbG9uZyBkX2lubzsJCQkvKiBpbm9kZSBudW1iZXIgb2YgZW50cnkgKi8KLSAgb2ZmX3QJZF9vZmY7CQkJLyogb2Zmc2V0IG9mIGRpc2sgZGlyZWN0b3J5IGVudHJ5ICovCi0gIHVuc2lnbmVkIHNob3J0IGRfcmVjbGVuOwkvKiBsZW5ndGggb2YgdGhpcyByZWNvcmQgKi8KLSAgY2hhciBkX25hbWVbMV07CQkvKiBuYW1lIG9mIGZpbGUgKi8KLX07Ci0KLS8qCi0jZGVmaW5lCURJUkVOVEJBU0VTSVpFIFwKLQkoKChzdHJ1Y3QgZGlyZW50ICopIDApLT5kX25hbWUgLSAoY2hhciAqKSAwKQotI2RlZmluZQlESVJFTlRTSVpFKG5hbWVsZW4pIFwKLQkoKERJUkVOVEJBU0VTSVpFICsgKG5hbWVsZW4pICsgTkJQVykgJiB+KE5CUFcgLSAxKSkKLSovCi0KLS8qIGZyb20gTWlwcyBwb3NpeC9kaXJlbnQuaCAqLwotCi0vKgotI3VuZGVmIHJld2luZGRpcgotKi8KLQotZXh0ZXJuIERJUiAqb3BlbmRpcigpOwotZXh0ZXJuIHN0cnVjdCBkaXJlbnQgKnJlYWRkaXIoKTsKLWV4dGVybiB2b2lkCQlyZXdpbmRkaXIoKTsKLWV4dGVybiBpbnQJCWNsb3NlZGlyKCk7Ci0KLSNlbmRpZiAvKiAhIF9fZGlyZW50X2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L2ZjbnRsLmggYi9pbmNsdWRlL21wdy9mY250bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDk5OWI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L2ZjbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIEZDbnRsLmggLS0gZmFjY2VzcygpLCBmY250bCgpLCBhbmQgb3BlbigpIG1vZGUgZmxhZ3MKLSAqCi0gKiBQb3J0aW9ucyBjb3B5cmlnaHQgQW1lcmljYW4gVGVsZXBob25lICYgVGVsZWdyYXBoCi0gKiBVc2VkIHdpdGggcGVybWlzc2lvbiwgQXBwbGUgQ29tcHV0ZXIgSW5jLiAoMTk4NSwxOTg4LDE5OTAsMTk5MikKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotI2lmbmRlZiBfX0ZDTlRMX18KLSNkZWZpbmUgX19GQ05UTF9fCi0KLSNpZm5kZWYgX19UWVBFU19fCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNlbmRpZgotCi0vKgotICoJRm9yIHVzZSBieSBsc2VlaygpOgotICovCi0KLSNpZm5kZWYgX19TVERJT19fCQkJLyogdGhlc2UgZGVmbnMgZXhhY3RseSBwYXJhbGxlZCBpbiBTdGRJTy5oIGZvciBmc2VlaygpICovCi0jZGVmaW5lIFNFRUtfQ1VSCTEKLSNkZWZpbmUgU0VFS19FTkQJMgotI2RlZmluZSBTRUVLX1NFVAkwCi0jZW5kaWYKLQotLyoKLSAqIGZhY2Nlc3MoKSBjb21tYW5kczsgZm9yIGdlbmVyYWwgdXNlCi0gKi8KLSAJCQkJCS8qICdkJyA9PiAiZGlyZWN0b3J5IiBvcHMgKi8KLSNkZWZpbmUgRl9ERUxFVEUJCSgoJ2QnPDw4KXwweDAxKQotI2RlZmluZSBGX1JFTkFNRQkJKCgnZCc8PDgpfDB4MDIpCi0KLS8qCi0gKiBtb3JlIGZhY2Nlc3MoKSBjb21tYW5kczsgZm9yIHVzZSBvbmx5IGJ5IE1QVyB0b29scwotICovCi0gCi0jZGVmaW5lIEZfT1BFTiAJCQkoKCdkJzw8OCl8MHgwMCkJCS8qIHJlc2VydmVkIGZvciBvcGVyYXRpbmcgc3lzdGVtIHVzZSAqLwotCQkJCQkvKiAnZScgPT4gImVkaXRvciIgb3BzICovCi0jZGVmaW5lIEZfR1RBQklORk8gCQkoKCdlJzw8OCl8MHgwMCkJCS8qIGdldCB0YWIgb2Zmc2V0IGZvciBmaWxlICovCQotI2RlZmluZSBGX1NUQUJJTkZPIAkJKCgnZSc8PDgpfDB4MDEpCQkvKiBzZXQgCSIJIgkJIgkiICAqLwotI2RlZmluZSBGX0dGT05USU5GTwkJKCgnZSc8PDgpfDB4MDIpCQkvKiBnZXQgZm9udCBudW1iZXIgYW5kIHNpemUgZm9yIGZpbGUgKi8KLSNkZWZpbmUgRl9TRk9OVElORk8JCSgoJ2UnPDw4KXwweDAzKQkJLyogc2V0IAkiCQkiCSIJIgkiCSIgCSAqLwotI2RlZmluZSBGX0dQUklOVFJFQwkJKCgnZSc8PDgpfDB4MDQpCQkvKiBnZXQgcHJpbnQgcmVjb3JkIGZvciBmaWxlICovCi0jZGVmaW5lIEZfU1BSSU5UUkVDCQkoKCdlJzw8OCl8MHgwNSkJCS8qIHNldCAJIgkJIgkiCSIgCSAqLwotI2RlZmluZSBGX0dTRUxJTkZPIAkJKCgnZSc8PDgpfDB4MDYpCQkvKiBnZXQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIGZvciBmaWxlICovCi0jZGVmaW5lIEZfU1NFTElORk8gCQkoKCdlJzw8OCl8MHgwNykJCS8qIHNldAkJIgkJIgkJIgkJIiAqLwotI2RlZmluZSBGX0dXSU5JTkZPIAkJKCgnZSc8PDgpfDB4MDgpCQkvKiBnZXQgY3VycmVudCB3aW5kb3cgcG9zaXRpb24gKi8KLSNkZWZpbmUgRl9TV0lOSU5GTyAJCSgoJ2UnPDw4KXwweDA5KQkJLyogc2V0CSIJCSIJCSIgCSAgICovCi0jZGVmaW5lIEZfR1NDUk9MTElORk8JKCgnZSc8PDgpfDB4MEEpCQkvKiBnZXQgc2Nyb2xsIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIEZfU1NDUk9MTElORk8JKCgnZSc8PDgpfDB4MEIpCQkvKiBzZXQgICAgIiAgIAkJIiAgCSAgKi8KLSNkZWZpbmUgRl9HTUFSS0VSCQkoKCdlJzw8OCl8MHgwRCkJCS8qIEdldCBNYXJrZXIgKi8KLSNkZWZpbmUgRl9TTUFSS0VSCQkoKCdlJzw8OCl8MHgwQykJCS8qIFNldCAgICIgCSAgKi8KLSNkZWZpbmUgRl9HU0FWRU9OQ0xPU0UJKCgnZSc8PDgpfDB4MEYpCQkvKiBHZXQgU2F2ZSBvbiBjbG9zZSAqLwotI2RlZmluZSBGX1NTQVZFT05DTE9TRQkoKCdlJzw8OCl8MHgwRSkJCS8qIFNldCAgICIJICIJICIgCSAqLwotCi0vKgotICoJYXJndW1lbnQgc3RydWN0dXJlcyB1c2VkIGJ5IHZhcmlvdXMgZmFjY2VzcygpIGNvbW1hbmRzCi0gKi8KLSAKLXN0cnVjdCBNYXJrRWxlbWVudCB7Ci0JaW50CQkJCXN0YXJ0OwkJCS8qIHN0YXJ0IHBvc2l0aW9uIG9mIG1hcmsgKi8KLQlpbnQJCQkJZW5kOwkJCS8qIGVuZCBwb3NpdGlvbiAqLwotCXVuc2lnbmVkIGNoYXIJY2hhckNvdW50OwkJLyogbnVtYmVyIG9mIGNoYXJzIGluIG1hcmsgbmFtZSAqLwotCWNoYXIJCQluYW1lWzY0XTsJCS8qIG1hcmsgbmFtZSAqLwotfSA7CQkJCQkJCQkJLyogbm90ZTogbWFya2VyIG5hbWVzIG1heSBiZSB1cCB0byA2NCBjaGFyYWN0ZXJzIGxvbmcgKi8KLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBzdHJ1Y3QgTWFya0VsZW1lbnQgTWFya0VsZW1lbnQ7Ci0jZW5kaWYKLQotc3RydWN0IFNlbGVjdGlvblJlY29yZCB7Ci0JbG9uZwlzdGFydGluZ1BvczsKLQlsb25nCWVuZGluZ1BvczsKLQlsb25nCWRpc3BsYXlUb3A7Ci19OwotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi10eXBlZGVmIHN0cnVjdCBTZWxlY3Rpb25SZWNvcmQgU2VsZWN0aW9uUmVjb3JkOwotI2VuZGlmCi0KLQotLyoKLSAqIE1vZGUgdmFsdWVzIGFjY2Vzc2libGUgdG8gb3BlbigpCi0gKi8KLSNkZWZpbmUgT19SRE9OTFkJCSAwIAkJLyogQml0cyAwIGFuZCAxIGFyZSB1c2VkIGludGVybmFsbHkgKi8KLSNkZWZpbmUgT19XUk9OTFkJCSAxIAkJLyogVmFsdWVzIDAuLjIgYXJlIGhpc3RvcmljYWwgKi8KLSNkZWZpbmUgT19SRFdSIAkJCSAyCQkvKiBOT1RFOiBpdCBnb2VzIDAsIDEsIDIsICohKiA4LCAxNiwgMzIsIC4uLiAqLwotI2RlZmluZSBPX0FQUEVORAkoMTw8IDMpCQkvKiBhcHBlbmQgKHdyaXRlcyBndWFyYW50ZWVkIGF0IHRoZSBlbmQpICovCi0jZGVmaW5lIE9fUlNSQyAJCSgxPDwgNCkJCS8qIE9wZW4gdGhlIHJlc291cmNlIGZvcmsgKi8KLSNkZWZpbmUgT19BTElBUwkJKDE8PCA1KQkJLyogT3BlbiBhbGlhcyBmaWxlICovCi0jZGVmaW5lIE9fQ1JFQVQJCSgxPDwgOCkJCS8qIE9wZW4gd2l0aCBmaWxlIGNyZWF0ZSAqLwotI2RlZmluZSBPX1RSVU5DCQkoMTw8IDkpCQkvKiBPcGVuIHdpdGggdHJ1bmNhdGlvbiAqLwotI2RlZmluZSBPX0VYQ0wgCQkoMTw8MTApIAkvKiB3LyBPX0NSRUFUOiAgRXhjbHVzaXZlICJjcmVhdGUtb25seSIgKi8KLSNkZWZpbmUgT19CSU5BUlkJKDE8PDExKSAJLyogT3BlbiBhcyBhIGJpbmFyeSBzdHJlYW0gKi8KLSNkZWZpbmUgT19OUkVTT0xWRQkoMTw8MTQpCQkvKiBEb24ndCByZXNvbHZlIGFueSBhbGlhc2VzICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqCQlmdW5jdGlvbiBwcm90b3R5cGVzCi0gKi8KLWludCAgY2xvc2UoaW50KTsKLWludCAgY3JlYXQoY29uc3QgY2hhciopOwotaW50CSBkdXAoaW50IGZpbGVkZXMpOwkJLyogT0JTT0xFVEU6IGZjbnRsKGZpbGVkZXMsIEZfRFVQRkQsIDApIGlzIHByZWZlcnJlZCAqLwotaW50CSBmYWNjZXNzKGNoYXIqLCB1bnNpZ25lZCBpbnQsIGxvbmcqKTsKLWludCAgZmNudGwoaW50LCB1bnNpZ25lZCBpbnQsIGludCk7Ci1sb25nIGxzZWVrKGludCwgbG9uZywgaW50KTsKLWludCAgb3Blbihjb25zdCBjaGFyKiwgaW50LCAuLi4pOwotaW50ICByZWFkKGludCwgY2hhciosIHVuc2lnbmVkKTsKLWludCAgdW5saW5rKGNoYXIqKTsKLWludCAgd3JpdGUoaW50LCBjb25zdCBjaGFyKiwgdW5zaWduZWQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0vKgotICogZmNudGwoKSBjb21tYW5kcwotICovCi0jZGVmaW5lIEZfRFVQRkQgMAkgICAvKiBEdXBsaWNhdGUgZmlsZXMgKGZpbGUgZGVzY3JpcHRvcikgKi8KLQotI2VuZGlmIF9fRkNOVExfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvZ3JwLmggYi9pbmNsdWRlL21wdy9ncnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmMmM2YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9ncnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAic3lzL3R5cGVzLmgiCi0KLXN0cnVjdCBncm91cCB7Ci0gIGNoYXIgKmdyX25hbWU7Ci0gIGdpZF90IGdyX2dpZDsKLSAgY2hhciAqZ3JfcGFzc3dkOwotICBjaGFyICoqZ3JfbWVtOwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L21wdy5oIGIvaW5jbHVkZS9tcHcvbXB3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NzAyZTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvbXB3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyogTWFjIE1QVyBob3N0LXNwZWNpZmljIGRlZmluaXRpb25zLiAqLwotCi0jaWZuZGVmCV9fSU5DTFVERV9NUFdfSAotI2RlZmluZSBfX0lOQ0xVREVfTVBXX0gKLQotI2lmbmRlZiBNUFcKLSNkZWZpbmUgTVBXCi0jZW5kaWYKLQotLyogTVBXIEMgaXMgYmFzaWNhbGx5IEFOU0ksIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBfX1NURENfXywKLSAgIG5vciBkb2VzIGl0IGFsbG93IF9fU1REQ19fIHRvIGJlICNkZWZpbmVkLiAqLwotCi0jaWZuZGVmIEFMTU9TVF9TVERDCi0jZGVmaW5lIEFMTU9TVF9TVERDCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi0KLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi0KLSNkZWZpbmUgSEFWRV9FUlJOT19IIDEKLQotI2RlZmluZSBIQVZFX1NURERFRl9IIDEKLQotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLQotI2RlZmluZSBIQVZFX1NUREFSR19IIDEKLQotI2RlZmluZSBIQVZFX1ZQUklOVEYgMQotCi0jaWZkZWYgVVNFX01XX0hFQURFUlMKLQotI2luY2x1ZGUgPHVuaXguaD4KLQotI2Vsc2UKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0KLSNpZm5kZWYJT19BQ0NNT0RFCi0jZGVmaW5lIE9fQUNDTU9ERSAoT19SRE9OTFkgfCBPX1dST05MWSB8IE9fUkRXUikKLSNlbmRpZgotCi0jaWZuZGVmIGZpbGVubwotI2RlZmluZSBmaWxlbm8oZnApICgoZnApLT5fZmlsZSkKLSNlbmRpZgotCi0vKiBzdGRpby5oIGRvZXMgbm90IGRlZmluZSB0aGlzIGlmIF9fU1REQ19fLCBzbyBkZWZpbmUgaGVyZS4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi1GSUxFICpmZG9wZW4oaW50IGZpbGRlcywgY29uc3QgY2hhciAqbW9kZSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFVTRV9NV19IRUFERVJTICovCi0KLS8qIEFkZCBlcnNhdHogZGVmaW5pdGlvbnMsIGZvciBzeXN0ZW1zIHRoYXQgbGFjayB0aGVtLiAgKi8KLQotI2lmbmRlZiBFSU8KLSNkZWZpbmUgRUlPIDk2Ci0jZW5kaWYKLSNpZm5kZWYgRU5PRU5UCi0jZGVmaW5lIEVOT0VOVCA5NwotI2VuZGlmCi0jaWZuZGVmIEVBQ0NFUwotI2RlZmluZSBFQUNDRVMgOTgKLSNlbmRpZgotI2lmbmRlZiBFTk9TWVMKLSNkZWZpbmUgRU5PU1lTIDk5Ci0jZW5kaWYKLQotI2lmbmRlZiBSX09LCi0jZGVmaW5lIFJfT0sgNAotI2RlZmluZSBXX09LIDIKLSNkZWZpbmUgWF9PSyAxCi0jZW5kaWYKLQotLyogQmluYXJ5IGZpbGVzIGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljczsgZm9yIGluc3RhbmNlLCBubyBjci9ubAotICAgdHJhbnNsYXRpb24uICovCi0KLSNkZWZpbmUgVVNFX0JJTkFSWV9GT1BFTgotCi0jaW5jbHVkZSA8c3Bpbi5oPgotCi0jaWZkZWYgTVBXX0MKLSN1bmRlZiAgX19QVFJfVE9fSU5UCi0jZGVmaW5lIF9fUFRSX1RPX0lOVChQKSAoKGludCkoUCkpCi0jdW5kZWYgX19JTlRfVE9fUFRSCi0jZGVmaW5lIF9fSU5UX1RPX1BUUihQKSAoKGNoYXIgKikoUCkpCi0jZW5kaWYgLyogTVBXX0MgKi8KLQotI2RlZmluZSBOT19GQ05UTAotCi1pbnQgZnN0YXQgKCk7Ci0KLUZJTEUgKm1wd19mb3BlbiAoKTsKLWludCBtcHdfZnNlZWsgKCk7Ci1pbnQgbXB3X2ZyZWFkICgpOwotaW50IG1wd19md3JpdGUgKCk7Ci1pbnQgbXB3X2FjY2VzcyAoKTsKLWludCBtcHdfb3BlbiAoKTsKLWludCBtcHdfY3JlYXQgKCk7Ci12b2lkIG1wd19hYm9ydCAodm9pZCk7Ci0KLS8qIE1hcCB0aGVzZSBzdGFuZGFyZCBmdW5jdGlvbnMgdG8gaW1wcm92ZWQgdmVyc2lvbnMgaW4gbGliaWJlcnR5LiAqLwotCi0jZGVmaW5lIGZvcGVuIG1wd19mb3BlbgotI2RlZmluZSBmc2VlayBtcHdfZnNlZWsKLSNkZWZpbmUgZnJlYWQgbXB3X2ZyZWFkCi0jZGVmaW5lIGZ3cml0ZSBtcHdfZndyaXRlCi0jZGVmaW5lIG9wZW4gbXB3X29wZW4KLSNkZWZpbmUgYWNjZXNzIG1wd19hY2Nlc3MKLSNkZWZpbmUgY3JlYXQgbXB3X2NyZWF0Ci0jZGVmaW5lIGFib3J0IG1wd19hYm9ydAotCi0jZGVmaW5lIFBPU0lYX1VUSU1FCi0KLSNkZWZpbmUgTE9TSU5HX1RPVEFMTFkKLQotLyogRGVmaW5lIHRoaXMgc28gdGhhdCBmaWxlcyB3aWxsIGJlIGNsb3NlZCBiZWZvcmUgYmVpbmcgdW5saW5rZWQuICovCi0KLSNkZWZpbmUgQ0xPU0VfQkVGT1JFX1VOTElOSwotCi0jZW5kaWYgLyogX19JTkNMVURFX01QV19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9wd2QuaCBiL2luY2x1ZGUvbXB3L3B3ZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRmYjcwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3B3ZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2lmbmRlZiBfX3B3ZF9oCi0jZGVmaW5lIF9fcHdkX2gKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1zdHJ1Y3QgcGFzc3dkIHsKLSAgY2hhciAqcHdfbmFtZTsKLSAgdWlkX3QgcHdfdWlkOwotICBnaWRfdCBwd19naWQ7Ci0gIGNoYXIgKnB3X2RpcjsKLSAgY2hhciAqcHdfc2hlbGw7Ci0gIGNoYXIgKnB3X3Bhc3N3ZDsKLX07Ci0KLSNlbmRpZiAvKiAhIF9fcHdkX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3NwaW4uaCBiL2luY2x1ZGUvbXB3L3NwaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZDE0NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zcGluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBQcm9ncmVzcyBtYWNyb3MgdGhhdCB1c2UgU3BpbkN1cnNvciBpbiBNUFcuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX1NQSU5fSAotI2RlZmluZSBfU1BJTl9ICi0KLS8qIEZvciBNUFcsIHByb2dyZXNzIG1hY3JvcyBqdXN0IG5lZWQgdG8gInNwaW4gdGhlIGN1cnNvciIgZnJlcXVlbnRseSwKLSAgIHByZWZlcmFibHkgc2V2ZXJhbCB0aW1lcyBwZXIgc2Vjb25kIG9uIGEgNjhLIE1hYy4gICovCi0KLS8qIEluIG9yZGVyIHRvIGRldGVybWluZSBpZiB3ZSdyZSBtZWV0aW5nIHRoZSBnb2FsLCBkZWZpbmUgdGhpcyBtYWNybwotICAgYW5kIGluZm9ybWF0aW9uIGFib3V0IGZyZXF1ZW5jeSBvZiBzcGlubmluZyB3aWxsIGJlIGNvbGxlY3RlZCBhbmQKLSAgIGRpc3BsYXllZC4gICovCi0KLSNkZWZpbmUgU1BJTl9NRUFTVVJFTUVOVAotCi0jaW5jbHVkZSA8Q3Vyc29yQ3RsLmg+Ci0KLS8qIFByb2dyYW1zIHVzZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIGxlbmd0aHkKLSAgIGFjdGl2aXR5LiAgU1RSIGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHksIHdoaWxlIE4KLSAgIGluZGljYXRlcyB0aGUgZXhwZWN0ZWQgZHVyYXRpb24sIGluIHVuc3BlY2lmaWVkIHVuaXRzLiAgSWYgTiBpcwotICAgemVybywgdGhlbiB0aGUgZXhwZWN0ZWQgdGltZSB0byBjb21wbGV0aW9uIGlzIHVua25vd24uICAqLwotCi0jdW5kZWYgU1RBUlRfUFJPR1JFU1MKLSNkZWZpbmUgU1RBUlRfUFJPR1JFU1MoU1RSLE4pIG1wd19zdGFydF9wcm9ncmVzcyAoU1RSLCBOLCBfX0ZJTEVfXywgX19MSU5FX18pOwotCi0vKiBQcm9ncmFtcyB1c2UgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGF0IHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgb24gYQotICAgbGVuZ3RoeSBhY3Rpdml0eS4gICovCi0KLSN1bmRlZiBQUk9HUkVTUwotI2lmZGVmIFNQSU5fTUVBU1VSRU1FTlQKLSNkZWZpbmUgUFJPR1JFU1MoWCkgbXB3X3Byb2dyZXNzX21lYXN1cmVkIChYLCBfX0ZJTEVfXywgX19MSU5FX18pOwotI2Vsc2UKLSNkZWZpbmUgUFJPR1JFU1MoWCkgbXB3X3Byb2dyZXNzIChYKTsKLSNlbmRpZiAKLQotLyogUHJvZ3JhbXMgdXNlIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiBhIGxlbmd0aHkgYWN0aXZpdHkuCi0gICBTVFIgbXVzdCBtYXRjaCBhIFNUUiBwYXNzZWQgdG8gU1RBUlRfUFJPR1JFU1MgcHJldmlvdXNseS4gICovCi0KLSN1bmRlZiBFTkRfUFJPR1JFU1MKLSNkZWZpbmUgRU5EX1BST0dSRVNTKFNUUikgbXB3X2VuZF9wcm9ncmVzcyAoU1RSLCBfX0ZJTEVfXywgX19MSU5FX18pOwotCi1leHRlcm4gdm9pZCBtcHdfc3RhcnRfcHJvZ3Jlc3MgKGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7Ci0KLWV4dGVybiB2b2lkIG1wd19wcm9ncmVzcyAoaW50KTsKLQotZXh0ZXJuIHZvaWQgbXB3X3Byb2dyZXNzX21lYXN1cmVkIChpbnQsIGNoYXIgKiwgaW50KTsKLQotZXh0ZXJuIHZvaWQgbXB3X2VuZF9wcm9ncmVzcyAoY2hhciAqLCBjaGFyICosIGludCk7Ci0KLSNlbmRpZiAvKiBfU1BJTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zdGF0LmggYi9pbmNsdWRlL21wdy9zdGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2I4ZDUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3RhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogVGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZGVmaW5lcyBhIHN0cnVjdCB0aGF0IGlzIHVzZWQgaW4gdGhlIHN0YXQoKSBhbmQKLSAqIGZzdGF0IGZ1bmN0aW9ucy4gIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdCBjb21lcyBmcm9tIHRoZSBpLW5vZGUgb2YKLSAqIHNvbWUgZmlsZS4gIFRoZXNlIGNhbGxzIGFyZSB0aGUgb25seSBhcHByb3ZlZCB3YXkgdG8gaW5zcGVjdCBpLW5vZGVzLgotICovCi0KLSNpZm5kZWYgX1NUQVRfSAotI2RlZmluZSBfU1RBVF9ICi0KLSNpZm5kZWYgX1RZUEVTX0gJCS8qIG5vdCBxdWl0ZSByaWdodCAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLXN0cnVjdCBzdGF0IHsKLSAgZGV2X3Qgc3RfZGV2OwkJCS8qIG1ham9yL21pbm9yIGRldmljZSBudW1iZXIgKi8KLSAgaW5vX3Qgc3RfaW5vOwkJCS8qIGktbm9kZSBudW1iZXIgKi8KLSAgbW9kZV90IHN0X21vZGU7CQkvKiBmaWxlIG1vZGUsIHByb3RlY3Rpb24gYml0cywgZXRjLiAqLwotICBzaG9ydCBpbnQgc3Rfbmxpbms7CQkvKiAjIGxpbmtzOyBURU1QT1JBUlkgSEFDSzogc2hvdWxkIGJlIG5saW5rX3QqLwotICB1aWRfdCBzdF91aWQ7CQkJLyogdWlkIG9mIHRoZSBmaWxlJ3Mgb3duZXIgKi8KLSAgc2hvcnQgaW50IHN0X2dpZDsJCS8qIGdpZDsgVEVNUE9SQVJZIEhBQ0s6IHNob3VsZCBiZSBnaWRfdCAqLwotICBkZXZfdCBzdF9yZGV2OwotICBvZmZfdCBzdF9zaXplOwkJLyogZmlsZSBzaXplICovCi0gIHRpbWVfdCBzdF9hdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KLSAgdGltZV90IHN0X210aW1lOwkJLyogdGltZSBvZiBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uICovCi0gIHRpbWVfdCBzdF9jdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBmaWxlIHN0YXR1cyBjaGFuZ2UgKi8KLX07Ci0KLS8qIFRyYWRpdGlvbmFsIG1hc2sgZGVmaW5pdGlvbnMgZm9yIHN0X21vZGUuICovCi0jZGVmaW5lIFNfSUZNVCAgMDE3MDAwMAkJLyogdHlwZSBvZiBmaWxlICovCi0jZGVmaW5lIFNfSUZSRUcgMDEwMDAwMAkJLyogcmVndWxhciAqLwotI2RlZmluZSBTX0lGQkxLIDAwNjAwMDAJCS8qIGJsb2NrIHNwZWNpYWwgKi8KLSNkZWZpbmUgU19JRkRJUiAwMDQwMDAwICAJLyogZGlyZWN0b3J5ICovCi0jZGVmaW5lIFNfSUZDSFIgMDAyMDAwMAkJLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KLSNkZWZpbmUgU19JRklGTyAwMDEwMDAwCQkvKiB0aGlzIGlzIGEgRklGTyAqLwotI2RlZmluZSBTX0lTVUlEIDAwMDQwMDAJCS8qIHNldCB1c2VyIGlkIG9uIGV4ZWN1dGlvbiAqLwotI2RlZmluZSBTX0lTR0lEIDAwMDIwMDAJCS8qIHNldCBncm91cCBpZCBvbiBleGVjdXRpb24gKi8KLQkJCQkvKiBuZXh0IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0jZGVmaW5lIFNfSVNWVFggICAwMTAwMAkJLyogc2F2ZSBzd2FwcGVkIHRleHQgZXZlbiBhZnRlciB1c2UgKi8KLQotLyogUE9TSVggbWFza3MgZm9yIHN0X21vZGUuICovCi0jZGVmaW5lIFNfSVJXWFUgICAwMDcwMAkJLyogb3duZXI6ICByd3gtLS0tLS0gKi8KLSNkZWZpbmUgU19JUlVTUiAgIDAwNDAwCQkvKiBvd25lcjogIHItLS0tLS0tLSAqLwotI2RlZmluZSBTX0lXVVNSICAgMDAyMDAJCS8qIG93bmVyOiAgLXctLS0tLS0tICovCi0jZGVmaW5lIFNfSVhVU1IgICAwMDEwMAkJLyogb3duZXI6ICAtLXgtLS0tLS0gKi8KLQotI2RlZmluZSBTX0lSV1hHICAgMDAwNzAJCS8qIGdyb3VwOiAgLS0tcnd4LS0tICovCi0jZGVmaW5lIFNfSVJHUlAgICAwMDA0MAkJLyogZ3JvdXA6ICAtLS1yLS0tLS0gKi8KLSNkZWZpbmUgU19JV0dSUCAgIDAwMDIwCQkvKiBncm91cDogIC0tLS13LS0tLSAqLwotI2RlZmluZSBTX0lYR1JQICAgMDAwMTAJCS8qIGdyb3VwOiAgLS0tLS14LS0tICovCi0KLSNkZWZpbmUgU19JUldYTyAgIDAwMDA3CQkvKiBvdGhlcnM6IC0tLS0tLXJ3eCAqLwotI2RlZmluZSBTX0lST1RIICAgMDAwMDQJCS8qIG90aGVyczogLS0tLS0tci0tICovIAotI2RlZmluZSBTX0lXT1RIICAgMDAwMDIJCS8qIG90aGVyczogLS0tLS0tLXctICovCi0jZGVmaW5lIFNfSVhPVEggICAwMDAwMQkJLyogb3RoZXJzOiAtLS0tLS0tLXggKi8KLQotLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgdGVzdCBzdF9tb2RlIChmcm9tIFBPU0lYIFNlYy4gNS42LjEuMS4gKi8KLSNkZWZpbmUgU19JU1JFRyhtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZSRUcpCS8qIGlzIGEgcmVnIGZpbGUgKi8KLSNkZWZpbmUgU19JU0RJUihtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZESVIpCS8qIGlzIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIFNfSVNDSFIobSkJKChtICYgU19JRk1UKSA9PSBTX0lGQ0hSKQkvKiBpcyBhIGNoYXIgc3BlYyAqLwotI2RlZmluZSBTX0lTQkxLKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRkJMSykJLyogaXMgYSBibG9jayBzcGVjICovCi0jZGVmaW5lIFNfSVNGSUZPKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRklGTykJLyogaXMgYSBwaXBlL0ZJRk8gKi8KLQotCi0vKiBGdW5jdGlvbiBQcm90b3R5cGVzLiAqLwotI2lmbmRlZiBfQU5TSV9ICi0jaW5jbHVkZSA8YW5zaS5oPgotI2VuZGlmCi0KLV9QUk9UT1RZUEUoIGludCBjaG1vZCwgKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX21vZGUpCQkJKTsKLV9QUk9UT1RZUEUoIGludCBmc3RhdCwgKGludCBfZmlsZGVzLCBzdHJ1Y3Qgc3RhdCAqX2J1ZikJCQkpOwotX1BST1RPVFlQRSggaW50IG1rZGlyLCAoY29uc3QgY2hhciAqX3BhdGgsIGludCBfbW9kZSkJCQkpOwotX1BST1RPVFlQRSggaW50IG1rZmlmbywgKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX21vZGUpCQkJKTsKLV9QUk9UT1RZUEUoIGludCBzdGF0ICwgKGNvbnN0IGNoYXIgKl9wYXRoLCBzdHJ1Y3Qgc3RhdCAqX2J1ZikJCSk7Ci1fUFJPVE9UWVBFKCBtb2RlX3QgdW1hc2ssIChpbnQgX2NtYXNrKQkJCQkJKTsKLQotI2VuZGlmIC8qIF9TVEFUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy9maWxlLmggYi9pbmNsdWRlL21wdy9zeXMvZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGE4YzE3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3lzL3BhcmFtLmggYi9pbmNsdWRlL21wdy9zeXMvcGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhOGMxNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zeXMvcGFyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvcmVzb3VyY2UuaCBiL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk0MzlkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9fU1lTX1JFU09VUkNFX0hfXwotI2RlZmluZSBfX1NZU19SRVNPVVJDRV9IX18KLQotc3RydWN0IHJ1c2FnZSB7Ci0gIHN0cnVjdCB0aW1ldmFsIHJ1X3V0aW1lOwotICBzdHJ1Y3QgdGltZXZhbCBydV9zdGltZTsKLX07Ci0KLSNlbmRpZiAvKiBfX1NZU19SRVNPVVJDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy9zdGF0LmggYi9pbmNsdWRlL21wdy9zeXMvc3RhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVjNzJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9zdGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBJbWl0YXRpb24gc3lzL3N0YXQuaC4gKi8KLQotI2lmbmRlZiBfX1NZU19TVEFUX0hfXwotI2RlZmluZSBfX1NZU19TVEFUX0hfXwotCi0jaW5jbHVkZSAgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgIDx0aW1lLmg+Ci0KLXN0cnVjdCBzdGF0IHsKLSAgZGV2X3QgICBzdF9kZXY7Ci0gIGlub190ICAgc3RfaW5vOwotICBtb2RlX3QgIHN0X21vZGU7Ci0gIHNob3J0ICAgc3Rfbmxpbms7Ci0gIHVpZF90ICAgc3RfdWlkOwotICBnaWRfdCAgIHN0X2dpZDsKLSAgZGV2X3QgICBzdF9yZGV2OwotICBvZmZfdCAgIHN0X3NpemU7Ci0gIG9mZl90ICAgc3RfcnNpemU7Ci0gIHRpbWVfdCAgc3RfYXRpbWU7Ci0gIGludCAgICAgc3Rfc3BhcmUxOwotICB0aW1lX3QgIHN0X210aW1lOwotICBpbnQgICAgIHN0X3NwYXJlMjsKLSAgdGltZV90ICBzdF9jdGltZTsKLSAgaW50ICAgICBzdF9zcGFyZTM7Ci0gIGxvbmcgICAgc3RfYmxrc2l6ZTsKLSAgbG9uZyAgICBzdF9ibG9ja3M7Ci0gIGxvbmcgICAgc3Rfc3BhcmU0WzJdOwotfTsKLQotI2RlZmluZSBTX0lGTVQJMDE3MDAwMEwKLSNkZWZpbmUgU19JRkRJUgkwMDQwMDAwTAotI2RlZmluZSBTX0lGUkVHIDAxMDAwMDBMCi0jZGVmaW5lIFNfSVJFQUQgICAgMDQwMAotI2RlZmluZSBTX0lXUklURSAgIDAyMDAKLSNkZWZpbmUgU19JRVhFQyAgICAwMTAwCi0KLSNkZWZpbmUgU19JRklGTyAwMTAwMDAgIC8qIEZJRk8gc3BlY2lhbCAqLwotI2RlZmluZSBTX0lGQ0hSIDAyMDAwMCAgLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KLSNkZWZpbmUgU19JRkJMSyAwMzAwMDAgIC8qIGJsb2NrIHNwZWNpYWwgKi8KLQotaW50IHN0YXQgKGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpOwotaW50IGZzdGF0IChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYpOwotCi0jZW5kaWYgLyogX19TWVNfU1RBVF9IX19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvdGltZS5oIGIvaW5jbHVkZS9tcHcvc3lzL3RpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllNDg1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zeXMvdGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyogSW1pdGF0aW9uIHN5cy90aW1lLmguICovCi0KLSNpZm5kZWYgX19TWVNfVElNRV9IX18KLSNkZWZpbmUgX19TWVNfVElNRV9IX18KLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotc3RydWN0IHRpbWV2YWwgewotICBsb25nIHR2X3NlYzsKLSAgbG9uZyB0dl91c2VjOwotfTsKLQotI2VuZGlmIC8qIF9fU1lTX1RJTUVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvdHlwZXMuaCBiL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Q5YzlmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyogSW1pdGF0aW9uIHN5cy90eXBlcy5oLiAqLwotCi0jaWZuZGVmIF9fU1lTX1RZUEVTX0hfXwotI2RlZmluZSBfX1NZU19UWVBFU19IX18KLQotI2luY2x1ZGUgPFR5cGVzLmg+Ci0KLXR5cGVkZWYgc2hvcnQgZGV2X3Q7Ci10eXBlZGVmIHNob3J0IGlub190OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBtb2RlX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpZF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBnaWRfdDsKLXR5cGVkZWYgbG9uZyBvZmZfdDsKLQotI2VuZGlmIC8qIF9fU1lTX1RZUEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvdXRpbWUuaCBiL2luY2x1ZGUvbXB3L3V0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmY2NmYyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3V0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQotc3RydWN0IHV0aW1idWYgewotICB0aW1lX3QgYWN0aW1lOwotICB0aW1lX3QgbW9kdGltZTsKLX07Ci0KLWludCB1dGltZSAoY2hhciAqLCBzdHJ1Y3QgdXRpbWJ1ZiAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaCBiL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiOWU0NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy92YXJhcmdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8qIHZhcmFyZ3MuaC4gKi8KLSNpZm5kZWYgX192YV9saXN0X18KLSNkZWZpbmUgX192YV9saXN0X18KLXR5cGVkZWYgY2hhciAqdmFfbGlzdDsKLSNlbmRpZgotI2RlZmluZSB2YV9kY2wgaW50IHZhX2FsaXN0OwotI2RlZmluZSB2YV9zdGFydChsaXN0KSBsaXN0ID0gKGNoYXIgKikgJnZhX2FsaXN0Ci0jZGVmaW5lIHZhX2VuZChsaXN0KQotI2RlZmluZSB2YV9hcmcobGlzdCxtb2RlKSAoKG1vZGUgKikobGlzdCArPSBzaXplb2YobW9kZSkpKVstMV0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL0NoYW5nZUxvZyBiL2luY2x1ZGUvbmxtL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllYTNkMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1GcmkgTWF5ICA2IDEzOjMxOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZXh0ZXJuYWwuaCAobmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKSk6IEFkZCBsZW5ndGgsCi0JZGF0YU9mZnNldCwgYW5kIGRhdGFTdGFtcCBmaWVsZC4KLQkobmxtTkFNRShFeHRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikpOiBSZW1vdmUuCi0JKiBpbnRlcm5hbC5oIChObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcik6IEFkZCBoZHJMZW5ndGgsCi0JZGF0YU9mZnNldCwgZGF0YVN0YW1wIGFuZCBoZHIgZmllbGRzLgotCi1GcmkgQXByIDIyIDExOjEyOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZXh0ZXJuYWwuaCAoc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIpKTogUmVuYW1lCi0JZnJvbSBubG1OQU1FKGV4dGVybmFsX2N5Z251c19zZWN0aW9uX2hlYWRlcikuICBDaGFuZ2Ugc3RhbXAgZmllbGQKLQl0byA4IGJ5dGVzLiAgQWRkIGJ5dGVzIGZpZWxkLgotCSogaW50ZXJuYWwuaCAobmxtX2ludGVybmFsX2N5Z251c19leHRfaGVhZGVyKTogUmVuYW1lIGZyb20KLQlubG1faW50ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyLiAgQ2hhbmdlIHN0YW1wIGZpZWxkIHRvIDgKLQlieXRlcy4KLQotVGh1IEFwciAyMSAxMTo1NzowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKHN0cnVjdCBubG1faW50ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyKTogRGVmaW5lLgotCSogZXh0ZXJuYWwuaCAoc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyKToKLQlEZWZpbmUuCi0KLVdlZCBBcHIgMjAgMTQ6Mjc6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgbmxtX2ludGVybmFsX2N1c3RvbV9oZWFkZXIpOiBSZW1vdmUKLQlkZWJ1Z1JlY09mZnNldCBhbmQgZGVidWdSZWNMZW5ndGggZmllbGRzLiAgQWRkIGRhdGEgZmllbGQuCi0JKiBleHRlcm5hbC5oIChzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jdXN0b21faGVhZGVyKSk6IFJlbW92ZQotCWRlYnVnUmVjT2Zmc2V0IGFuZCBkZWJ1Z1JlY0xlbmd0aCBmaWVsZHMuCi0KLU1vbiBGZWIgIDcgMDg6Mjg6NDAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBIT1NUXzY0X0JJVCB0byBCRkRfSE9TVF82NF9CSVQuCi0KLVRodSBEZWMgIDIgMTQ6MTQ6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS1leHQuaDogTmV3IGZpbGUgZGVzY3JpYmluZyBmb3JtYXRzIG9mIGluZm9ybWF0aW9uIGluIEFscGhhCi0JTmV0V2FyZSBmaWxlcy4KLQkqIGNvbW1vbi5oOiBEZWZpbmUgc29tZSBub24tZXh0ZXJuYWwgQWxwaGEgaW5mb3JtYXRpb24uCi0KLVdlZCBOb3YgMTcgMTc6Mzg6NTggMTk5MyAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIGV4dGVybmFsLmg6IERvbid0IGRlZmluZSBleHRlcm5hbF9maXhlZF9oZWFkZXIgaGVyZS4KLQkqIGkzODYtZXh0LmgsIHNwYXJjMzItZXh0Lmg6IE5ldyBoZWFkZXIgZmlsZXMgdG8gZGVmaW5lCi0JZXh0ZXJuYWxfZml4ZWRfaGVhZGVyIGZvciBwYXJ0aWN1bGFyIENQVSdzLgotCi1XZWQgT2N0IDI3IDExOjQ1OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlcik6IEFkZGVkIGZpZWxkcwotCXNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0IGFuZCBzaGFyZWREZWJ1Z1JlY29yZENvdW50LgotCSogZXh0ZXJuYWwuaCAoTmxtTkFNRShFeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKTogTGlrZXdpc2UuCi0KLQkqIGNvbW1vbi5oIChOTE1fU0lHTkFUVVJFKTogRG8gbm90IGRlZmluZSAoaXQncyBkaWZmZXJlbnQgZm9yIGVhY2gKLQliYWNrZW5kKS4KLQotVHVlIEF1ZyAzMSAxMzoyNDoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBsZW5ndGggZmllbGRzIG9mIHR5cGUgY2hhciB0byB0eXBlIHVuc2lnbmVkCi0JY2hhci4KLQotU2F0IEp1bCAzMSAwMjoxMjoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChOTE1fSElCSVQsIE5MTV9IRUFERVJfVkVSU0lPTik6IERlZmluZS4KLQotVGh1IEp1bCAyMiAxNjowOTo0NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKE5MTV9DQVQqLCBOTE1fQVJDSF9TSVpFLCBOTE1fVEFSR0VUX0xPTkdfU0laRSwKLQlOTE1fVEFSR0VUX0FERFJFU1NfU0laRSwgTkxNX05BTUUsIE5sbU5BTUUsIG5sbU5BTUUpOiAgTmV3Ci0JbWFjcm9zLgotCSogZXh0ZXJuYWwuaCAoVEFSR0VUX0xPTkdfU0laRSwgVEFSR0VUX0FERFJFU1NfU0laRSk6IFJlbW92ZQotCW1hY3JvcywgY29udmVydCB1c2FnZXMgdG8gTkxNXyBlcXVpdmFsZW50cy4KLQkqIGV4dGVybmFsLmg6ICBVc2UgbmxtTkFNRSBhbmQgTmxtTkFNRSBtYWNyb3MgdG8gZGVyaXZlIGJvdGgKLQkzMiBhbmQgNjQgYml0IHZlcnNpb25zLgotCi1Nb24gSnVsIDE5IDIyOjEyOjQwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiAoY29tbW9uLmgsIGV4dGVybmFsLmgsIGludGVybmFsLmgpOiAgTmV3IGZpbGVzIGZvciBOTE0vTmV0V2FyZQotCXN1cHBvcnQuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2FscGhhLWV4dC5oIGIvaW5jbHVkZS9ubG0vYWxwaGEtZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTk5ZGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vYWxwaGEtZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogQWxwaGEgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbiBBbHBoYSBOTE0gc3RhcnRzIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcHJlZml4X2hlYWRlcgotewotICAvKiBNYWdpYyBudW1iZXIuICBNdXN0IGJlIE5MTTMyX0FMUEhBX01BR0lDLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtYWdpY1s0XTsKLSAgLyogRm9ybWF0IGRlc2NyaXB0b3IuICBDdXJyZW50IHZhbHVlIGlzIDIuICAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdFs0XTsKLSAgLyogU2l6ZSBvZiBwcmVmaXggaGVhZGVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaXplWzRdOwotICAvKiBQYWRkaW5nLiAgKi8KLSAgdW5zaWduZWQgY2hhciBwYWQxWzRdOwotICAvKiBNb3JlIGZpZWxkcyBtYXkgYmUgYWRkZWQgbGF0ZXIsIHN1cHBvc2VkbHkuICAqLwotfTsKLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiBhbiBBbHBoYSBOTE0gcmVsb2MuICBUaGlzIGlzIHRoZSBzYW1lIGFzIGFuCi0gICBBbHBoYSBFQ09GRiByZWxvYy4gICovCi0KLXN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9yZWxvYwotewotICB1bnNpZ25lZCBjaGFyIHJfdmFkZHJbOF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9zeW1uZHhbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzRdOwotfTsKLQotLyogQ29uc3RhbnRzIHRvIHVucGFjayB0aGUgcl9iaXRzIGZpZWxkIG9mIGEgcmVsb2MuICAqLwotCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFCQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUJCTB4MDEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFCQkweDdlCi0jZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUJCTEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9MSVRUTEUJCTB4ODAKLSNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfU0hfTElUVExFCQk3Ci0jZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQkxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX0xJVFRMRQkJMHgwMwotI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQk5Ci0KLSNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUJCQkweGZjCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFCQkyCi0KLS8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX2FscGhhX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2NvbW1vbi5oIGIvaW5jbHVkZS9ubG0vY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjU1MGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOTE0gc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGFyZSBjb21tb24gdG8gYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KLQotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgTkxNX0NBVDQgaGFjayBpcyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBzb21lIHN0cmljdCBBTlNJIEMKLSAgIHByZXByb2Nlc3NvcnMuICBUaGUgcHJvYmxlbSBpcywgIjMyXyIgb3IgIjY0XyIgYXJlIG5vdCBhIHZhbGlkCi0gICBwcmVwcm9jZXNzaW5nIHRva2VucywgYW5kIHdlIGRvbid0IHdhbnQgZXh0cmEgdW5kZXJzY29yZXMgKGUuZy4sCi0gICAibmxtXzMyXyIpLiAgVGhlIFhOTE1fQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZSBpbm5lciBOTE1fQ0FUIG1hY3JvcwotICAgdG8gYmUgZXZhbHVhdGVkIGZpcnN0LCBwcm9kdWNpbmcgc3RpbGwtdmFsaWQgcHAtdG9rZW5zLiAgVGhlbiB0aGUKLSAgIGZpbmFsIGNvbmNhdGVuYXRpb24gY2FuIGJlIGRvbmUuICAoU2lnaC4pICAqLwotCi0jaWZkZWYgU0FCRVIKLSMgIGRlZmluZSBOTE1fQ0FUKGEsYikJCWEjI2IKLSMgIGRlZmluZSBOTE1fQ0FUMyhhLGIsYykJYSMjYiMjYwotIyAgZGVmaW5lIE5MTV9DQVQ0KGEsYixjLGQpCWEjI2IjI2MjI2QKLSNlbHNlCi0jICBpZmRlZiBfX1NURENfXwotIyAgICBkZWZpbmUgTkxNX0NBVChhLGIpCWEjI2IKLSMgICAgZGVmaW5lIE5MTV9DQVQzKGEsYixjKQlhIyNiIyNjCi0jICAgIGRlZmluZSBYTkxNX0NBVDIoYSxiKQlOTE1fQ0FUKGEsYikKLSMgICAgZGVmaW5lIE5MTV9DQVQ0KGEsYixjLGQpCVhOTE1fQ0FUMihOTE1fQ0FUKGEsYiksTkxNX0NBVChjLGQpKQotIyAgZWxzZQotIyAgICBkZWZpbmUgTkxNX0NBVChhLGIpCWEvKiovYgotIyAgICBkZWZpbmUgTkxNX0NBVDMoYSxiLGMpCWEvKiovYi8qKi9jCi0jICAgIGRlZmluZSBOTE1fQ0FUNChhLGIsYyxkKQlhLyoqL2IvKiovYy8qKi9kCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIElmIE5MTV9BUkNIX1NJWkUgaXMgbm90IGRlZmluZWQsIGRlZmF1bHQgdG8gMzIuICBOTE1fQVJDSF9TSVpFIGlzCi0gICBvcHRpb25hbGx5IGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAqLwotCi0jaWZuZGVmIE5MTV9BUkNIX1NJWkUKLSMgIGRlZmluZSBOTE1fQVJDSF9TSVpFCQkJMzIKLSNlbmRpZgotCi0jaWYgTkxNX0FSQ0hfU0laRSA9PSAzMgotIyAgZGVmaW5lIE5MTV9UQVJHRVRfTE9OR19TSVpFCQk0Ci0jICBkZWZpbmUgTkxNX1RBUkdFVF9BRERSRVNTX1NJWkUJNAotIyAgZGVmaW5lIE5MTV9OQU1FKHgseSkJCQlOTE1fQ0FUNCh4LDMyLF8seSkKLSMgIGRlZmluZSBOTE1fSElCSVQJCQkoKChiZmRfdm1hKSAxKSA8PCAzMSkKLSNlbmRpZgotI2lmIE5MTV9BUkNIX1NJWkUgPT0gNjQKLSMgIGRlZmluZSBOTE1fVEFSR0VUX0xPTkdfU0laRQkJOAotIyAgZGVmaW5lIE5MTV9UQVJHRVRfQUREUkVTU19TSVpFCTgKLSMgIGRlZmluZSBOTE1fTkFNRSh4LHkpCQkJTkxNX0NBVDQoeCw2NCxfLHkpCi0jICBkZWZpbmUgTkxNX0hJQklUCQkJKCgoYmZkX3ZtYSkgMSkgPDwgNjMpCi0jZW5kaWYKLQotI2RlZmluZSBObG1OQU1FKFgpCQlOTE1fTkFNRShObG0sWCkKLSNkZWZpbmUgbmxtTkFNRShYKQkJTkxNX05BTUUobmxtLFgpCi0KLS8qIEdpdmUgbmFtZXMgdG8gdGhpbmdzIHRoYXQgc2hvdWxkIG5vdCBjaGFuZ2UuICovCi0KLSNkZWZpbmUgTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEgJCTEyNwotI2RlZmluZSBOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSAkJNzEKLSNkZWZpbmUgTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgJCTcxCi0jZGVmaW5lIE5MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RICTI1NQotI2RlZmluZSBOTE1fT1RIRVJfREFUQV9MRU5HVEggCQkJNDAwCQkvKiBGSVhNRSAqLwotI2RlZmluZSBOTE1fT0xEX1RIUkVBRF9OQU1FX0xFTkdUSAkJNQotI2RlZmluZSBOTE1fU0lHTkFUVVJFX1NJWkUJCQkyNAotI2RlZmluZSBOTE1fSEVBREVSX1ZFUlNJT04JCQk0Ci0jZGVmaW5lIE5MTV9NT0RVTEVfTkFNRV9TSVpFCQkJMTQKLSNkZWZpbmUgTkxNX0RFRkFVTFRfU1RBQ0tTSVpFCQkJKDggKiAxMDI0KQotDAotLyogQWxwaGEgaW5mb3JtYXRpb24uICBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIHNlcGFyYXRlIEFscGhhCi0gICBoZWFkZXIgZmlsZSwgYnV0IGl0IGNhbid0IGdvIGluIGFscGhhLWV4dC5oIGJlY2F1c2Ugc29tZSBvZiBpdCBpcwotICAgbmVlZGVkIGJ5IG5sbWNvbnYuYy4gICovCi0KLS8qIE1hZ2ljIG51bWJlciBpbiBBbHBoYSBwcmVmaXggaGVhZGVyLiAgKi8KLSNkZWZpbmUgTkxNMzJfQUxQSEFfTUFHSUMgKDB4ODM1NjE4NDApCi0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYW4gQWxwaGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZMT05HCQkxCi0jZGVmaW5lIEFMUEhBX1JfUkVGUVVBRAkJMgotI2RlZmluZSBBTFBIQV9SX0dQUkVMMzIJCTMKLSNkZWZpbmUgQUxQSEFfUl9MSVRFUkFMCQk0Ci0jZGVmaW5lIEFMUEhBX1JfTElUVVNFCQk1Ci0jZGVmaW5lIEFMUEhBX1JfR1BESVNQCQk2Ci0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQk3Ci0jZGVmaW5lIEFMUEhBX1JfSElOVAkJOAotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJOQotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkgICAgICAgMTAKLSNkZWZpbmUgQUxQSEFfUl9TUkVMNjQJICAgICAgIDExCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFVTSAkgICAgICAgMTIKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRSAgICAgICAxMwotI2RlZmluZSBBTFBIQV9SX09QX1BTVUIJICAgICAgIDE0Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFJTSElGVCAgICAgMTUKLSNkZWZpbmUgQUxQSEFfUl9HUFZBTFVFCSAgICAgICAxNgotI2RlZmluZSBBTFBIQV9SX05XX1JFTE9DICAgICAgMjUwCi0KLS8qIEEgbG9jYWwgcmVsb2MsIG90aGVyIHRoYW4gQUxQSEFfUl9HUERJU1Agb3IgQUxQSEFfUl9JR05PUkUsIG11c3QgYmUKLSAgIGFnYWluc3Qgb25lIG9mIHRoZXNlIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUkVMT0NfU0VDVElPTl9URVhUCTEKLSNkZWZpbmUgQUxQSEFfUkVMT0NfU0VDVElPTl9EQVRBCTMKLQotLyogQW4gQUxQSEFfUl9OV19SRUxPQyBoYXMgb25lIG9mIHRoZXNlIHZhbHVlcyBpbiB0aGUgc2l6ZSBmaWVsZC4gIElmCi0gICBpdCBpcyBTRVRHUCwgdGhlIHJfdmFkZHIgZmllbGQgaG9sZHMgdGhlIEdQIHZhbHVlIHRvIHVzZS4gIElmIGl0IGlzCi0gICBMSVRBLCB0aGUgcl92YWRkciBmaWVsZCBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgLmxpdGEgc2VjdGlvbiBhbmQKLSAgIHRoZSByX3N5bW5keCBmaWVsZCBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgLmxpdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIEFMUEhBX1JfTldfUkVMT0NfU0VUR1AJMQotI2RlZmluZSBBTFBIQV9SX05XX1JFTE9DX0xJVEEJMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaCBiL2luY2x1ZGUvbmxtL2V4dGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3N2E1YmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MTSBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IE5MTSBpcyByZXByZXNlbnRlZCBleHRlcm5hbGx5IGJ5IHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1maWxlIHJlcHJlc2VudGF0aW9uIG9mIE5MTS4gIEl0IHJlcXVpcmVzCi0gICB0aGUgbmxtL2NvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bwotICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4KLQotICAgTm90ZSB0aGF0IGFuIE5MTSBoZWFkZXIgY29uc2lzdHMgb2YgdGhyZWUgcGFydHM6Ci0KLSAgICgxKQlBIGZpeGVkIGxlbmd0aCBoZWFkZXIgdGhhdCBoYXMgc3BlY2lmaWMgZmllbGRzIG9mIGtub3duIGxlbmd0aCwKLQlhdCBzcGVjaWZpYyBvZmZzZXRzIGluIHRoZSBmaWxlLiAKLQotICAgKDIpICBBIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIgdGhhdCBoYXMgc3BlY2lmaWMgZmllbGRzIGluIGEgc3BlY2lmaWMKLSAgICAgICAgb3JkZXIsIGJ1dCBzb21lIGZpZWxkcyBtYXkgYmUgdmFyaWFibGUgbGVuZ3RoLgotCi0gICAoMykJQSBhdXhpbGlhcnkgaGVhZGVyIHRoYXQgaGFzIHZhcmlvdXMgb3B0aW9uYWwgZmllbGRzIGluIG5vIHNwZWNpZmljCi0gICAgICAgIG9yZGVyLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGlkZW50aWZ5IHRoZSBlbmQgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzCi0JZXhjZXB0IGJ5IGZpbmRpbmcgYSBoZWFkZXIgd2l0aG91dCBhIHJlY29nbml6ZWQgJ3N0YW1wJy4KLQotICAgVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgZml4ZWQgbGVuZ3RoIGhlYWRlciB1bmZvcnR1bmF0ZWx5IHZhcmllcwotICAgZnJvbSBvbmUgTkxNIHRhcmdldCB0byBhbm90aGVyLCBkdWUgdG8gcGFkZGluZy4gIEVhY2ggdGFyZ2V0Ci0gICBkZWZpbmVzIHRoZSBjb3JyZWN0IGV4dGVybmFsIGZvcm1hdCBpbiBhIHNlcGFyYXRlIGhlYWRlciBmaWxlLgotCi0qLwotICAgCi0vKiBOTE0gSGVhZGVyICovCi0KLS8qIFRoZSB2ZXJzaW9uIGhlYWRlciBpcyBvbmUgb2YgdGhlIG9wdGlvbmFsIGF1eGlsaWFyeSBoZWFkZXJzIGFuZAotICAgZm9sbG93cyB0aGUgZml4ZWQgbGVuZ3RoIGFuZCB2YXJpYWJsZSBsZW5ndGggTkxNIGhlYWRlcnMuICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfdmVyc2lvbl9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJWZVJzSW9OIyIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWFqb3JWZXJzaW9uW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1pbm9yVmVyc2lvbltOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXZpc2lvbltOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciB5ZWFyW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1vbnRoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIGRheVtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLX0gTmxtTkFNRShFeHRlcm5hbF9WZXJzaW9uX0hlYWRlcik7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyKQotewotCi0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiQ29QeVJpR2hUPSIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotCi0gIGNoYXIgc3RhbXBbMTBdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29weXJpZ2h0TWVzc2FnZUxlbmd0aFsxXTsKLQotICAvKiBUaGVyZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBmaWVsZCBoZXJlIGNhbGxlZCAnY29weXJpZ2h0TWVzc2FnZScKLSAgICAgdGhhdCBpcyB0aGUgbGVuZ3RoIHNwZWNpZmllZCBieSBjb3B5cmlnaHRNZXNzYWdlTGVuZ3RoLiAqLwotCi19IE5sbU5BTUUoRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcik7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9leHRlbmRlZF9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJNZVNzQWdFcyIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotCi0gIGNoYXIgc3RhbXBbOF07Ci0KLSAgdW5zaWduZWQgY2hhciBsYW5ndWFnZUlEW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VGaWxlT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VGaWxlTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBoZWxwRmlsZU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBoZWxwRmlsZUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBSUENEYXRhT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIFJQQ0RhdGFMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkQ29kZU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRDb2RlTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZERhdGFPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRGF0YUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRQdWJsaWNzT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZFB1YmxpY3NDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWREZWJ1Z1JlY29yZENvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0W05MTV9UQVJHRVRfQUREUkVTU19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIFNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXRbTkxNX1RBUkdFVF9BRERSRVNTX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcHJvZHVjdElEW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkMFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDFbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQyW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkM1tOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ1W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotfSBObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcik7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jdXN0b21faGVhZGVyKQotewotCi0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiQ3VTdEhlQWQiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFs4XTsKLQotICAvKiBMZW5ndGggb2YgdGhpcyBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIGxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgLyogT2Zmc2V0IHRvIGRhdGEuICAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIC8qIExlbmd0aCBvZiBkYXRhLiAgKi8KLSAgdW5zaWduZWQgY2hhciBkYXRhTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBTdGFtcCBmb3IgdGhpcyBjdXN0b21lciBoZWFkZXItLXdlIHJlY29nbml6ZSAiQ3lHblVzRXgiLiAgKi8KLSAgY2hhciBkYXRhU3RhbXBbOF07Ci0KLX0gTmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2kzODYtZXh0LmggYi9pbmNsdWRlL25sbS9pMzg2LWV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzNhZDJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmxtL2kzODYtZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogaTM4NiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfaTM4Nl9leHRlcm5hbF9maXhlZF9oZWFkZXIKLXsKLQotICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCi0gICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbMjRdOwotCi0gIC8qIFRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIuICBBdCB0aGlzIHRpbWUsIHRoZSBoaWdoZXN0IHZlcnNpb24gbnVtYmVyCi0gICAgIGlzIDQuICovCi0KLSAgdW5zaWduZWQgY2hhciB2ZXJzaW9uWzRdOwotCi0gIC8qIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUsIHdoaWNoIG11c3QgYmUgYSBET1MgbmFtZSAoMS04IGNoYXJhY3RlcnMgZm9sbG93ZWQKLSAgICAgYnkgYSBwZXJpb2QgYW5kIGEgMS0zIGNoYXJhY3RlciBleHRlbnNpb24pLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKLSAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCi0gICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKLSAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlTmFtZVsxNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX2kzODZfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vaW50ZXJuYWwuaCBiL2luY2x1ZGUvbmxtL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjdkYzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOTE0gc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGRlc2NyaWJlIGhvdyBOTE0gaXMgcmVwcmVzZW50ZWQgaW50ZXJuYWxseSBpbiB0aGUgQkZEIGxpYnJhcnkuCi0gICBJLkUuIGl0IGRlc2NyaWJlcyB0aGUgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIE5MTS4gIEl0IHJlcXVpcmVzCi0gICB0aGUgbmxtL2NvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bwotICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KLSAgIAotI2lmIDAKLQotLyogVHlwZXMgdXNlZCBieSB2YXJpb3VzIHN0cnVjdHVyZXMsIGZ1bmN0aW9ucywgZXRjLiAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJTmxtMzJfQWRkcjsJLyogVW5zaWduZWQgcHJvZ3JhbSBhZGRyZXNzICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJTmxtMzJfT2ZmOwkvKiBVbnNpZ25lZCBmaWxlIG9mZnNldCAqLwotdHlwZWRlZiAJIGxvbmcJTmxtMzJfU3dvcmQ7CS8qIFNpZ25lZCBsYXJnZSBpbnRlZ2VyICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJTmxtMzJfV29yZDsJLyogVW5zaWduZWQgbGFyZ2UgaW50ZWdlciAqLwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlObG0zMl9IYWxmOwkvKiBVbnNpZ25lZCBtZWRpdW0gaW50ZWdlciAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCU5sbTMyX0NoYXI7CS8qIFVuc2lnbmVkIHRpbnkgaW50ZWdlciAqLwotCi0jaWZkZWYgQkZEX0hPU1RfNjRfQklUCi10eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVAlObG02NF9BZGRyOwotdHlwZWRlZiB1bnNpZ25lZCBCRkRfSE9TVF82NF9CSVQJTmxtNjRfT2ZmOwotdHlwZWRlZiAgICAgICAgICBCRkRfSE9TVF82NF9CSVQJTmxtNjRfU3h3b3JkOwotdHlwZWRlZiB1bnNpZ25lZCBCRkRfSE9TVF82NF9CSVQJTmxtNjRfWHdvcmQ7Ci0jZW5kaWYKLXR5cGVkZWYgICAgICAgICAgbG9uZwkJTmxtNjRfU3dvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJCU5sbTY0X1dvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlObG02NF9IYWxmOwotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZm9ybSBvZiB0aGUgcG9ydGlvbiBvZiB0aGUgTkxNCi0gICBoZWFkZXIgdGhhdCBpcyBmaXhlZCBsZW5ndGguICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIKLXsKLSAgLyogVGhlIHNpZ25hdHVyZSBmaWVsZCBpZGVudGlmaWVzIHRoZSBmaWxlIGFzIGFuIE5MTS4gIEl0IG11c3QgY29udGFpbgotICAgICB0aGUgc2lnbmF0dXJlIHN0cmluZywgd2hpY2ggZGVwZW5kcyB1cG9uIHRoZSBOTE0gdGFyZ2V0LiAqLwotCi0gIGNoYXIgc2lnbmF0dXJlW05MTV9TSUdOQVRVUkVfU0laRV07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICBsb25nIHZlcnNpb247Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbi4gIFRoZSBmaXJzdCBieXRlIGlzIHRoZSBieXRlCi0gICAgIGxlbmd0aCBvZiB0aGUgbmFtZSBhbmQgdGhlIGxhc3QgYnl0ZSBpcyBhIG51bGwgdGVybWluYXRvciBieXRlLiAgVGhpcwotICAgICBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIGFuZCBhbnkgdW51c2VkIGJ5dGVzIHNob3VsZCBiZSBudWxsIGJ5dGVzLiAgVGhlCi0gICAgIHZhbHVlIGlzIHNldCBieSB0aGUgT1VUUFVUIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KLQotICBjaGFyIG1vZHVsZU5hbWVbTkxNX01PRFVMRV9OQU1FX1NJWkVdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgY29kZSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICBmaWxlX3B0ciBjb2RlSW1hZ2VPZmZzZXQ7Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIGJmZF9zaXplX3R5cGUgY29kZUltYWdlU2l6ZTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgZmlsZV9wdHIgZGF0YUltYWdlT2Zmc2V0OwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICBiZmRfc2l6ZV90eXBlIGRhdGFJbWFnZVNpemU7Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgYmZkX3NpemVfdHlwZSB1bmluaXRpYWxpemVkRGF0YVNpemU7Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgZmlsZV9wdHIgY3VzdG9tRGF0YU9mZnNldDsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY3VzdG9tIGRhdGEsIGluIGJ5dGVzLiAqLwotCi0gIGJmZF9zaXplX3R5cGUgY3VzdG9tRGF0YVNpemU7Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBUaGUgbW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgTU9EVUxFIGtleXdvcmQgaW4KLSAgICAgTkxNTElOSy4gKi8KLQotICBmaWxlX3B0ciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0OwotCi0gIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KLQotICBsb25nIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0KLSAgZmlsZV9wdHIgcmVsb2NhdGlvbkZpeHVwT2Zmc2V0OwotICBsb25nIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwczsKLSAgZmlsZV9wdHIgZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0OwotICBsb25nIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzOwotICBmaWxlX3B0ciBwdWJsaWNzT2Zmc2V0OwotICBsb25nIG51bWJlck9mUHVibGljczsKLSAgZmlsZV9wdHIgZGVidWdJbmZvT2Zmc2V0OwotICBsb25nIG51bWJlck9mRGVidWdSZWNvcmRzOwotICBmaWxlX3B0ciBjb2RlU3RhcnRPZmZzZXQ7Ci0gIGZpbGVfcHRyIGV4aXRQcm9jZWR1cmVPZmZzZXQ7Ci0gIGZpbGVfcHRyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0OwotICBsb25nIG1vZHVsZVR5cGU7Ci0gIGxvbmcgZmxhZ3M7Ci19IE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfZml4ZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIKLSNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfRml4ZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfZml4ZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfRml4ZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIKLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIHBvcnRpb25zIG9mIHRoZSBOTE0gaGVhZGVyIHRoYXQgYXJlIGVpdGhlcgotICAgdmFyaWFibGUgaW4gc2l6ZSBpbiB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24sIG9yIGVsc2UgYXJlIG5vdCBhdCBhCi0gICBmaXhlZCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBOTE0gaGVhZGVyIGR1ZSB0byBwcmVjZWRpbmcKLSAgIHZhcmlhYmxlIHNpemVkIGZpZWxkcy4KLQotICAgTm90ZSB0aGF0IGFsbCB0aGUgZmllbGRzIG11c3QgZXhpc3QgaW4gdGhlIGV4dGVybmFsIGhlYWRlciwgYW5kIGluCi0gICB0aGUgb3JkZXIgdXNlZCBoZXJlICh0aGUgc2FtZSBvcmRlciBpcyB1c2VkIGluIHRoZSBpbnRlcm5hbCBmb3JtCi0gICBmb3IgY29uc2lzdGVuY3ksIG5vdCBvdXQgb2YgbmVjZXNzaXR5KS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX3ZhcmlhYmxlX2hlYWRlcgotewotCi0gIC8qIFRoZSBkZXNjcmlwdGlvbkxlbmd0aCBmaWVsZCBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IGluCi0gICAgIGRlc2NyaXB0aW9uVGV4dCwgZXhjbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0b3IuICBUaGUgZGVzY3JpcHRpb25UZXh0Ci0gICAgIGZpZWxkIGNvbnRhaW5zIHRoZSBOTE0gZGVzY3JpcHRpb24gb2J0YWluZWQgZnJvbSB0aGUgREVTQ1JJUFRJT04KLSAgICAga2V5d29yZCBpbiBOTE1MSU5LIHBsdXMgdGhlIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgVGhlIGRlc2NyaXB0aW9uVGV4dAotICAgICBjYW4gYmUgdXAgdG8gTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEggY2hhcmFjdGVycy4gKi8KLSAgICAgCi0gIHVuc2lnbmVkIGNoYXIgZGVzY3JpcHRpb25MZW5ndGg7Ci0gIGNoYXIgZGVzY3JpcHRpb25UZXh0W05MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIICsgMV07Ci0KLSAgLyogVGhlIHN0YWNrU2l6ZSBmaWVsZCBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sgaW4gYnl0ZXMsIGFzCi0gICAgIHNwZWNpZmllZCBieSB0aGUgU1RBQ0sgb3IgU1RBQ0tTSVpFIGtleXdvcmQgaW4gTkxNTElOSy4gIElmIG5vIHNpemUKLSAgICAgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyBOTE1fREVGQVVMVF9TVEFDS1NJWkUuICovCi0gICAgIAotICBsb25nIHN0YWNrU2l6ZTsKLQotICAvKiBUaGUgcmVzZXJ2ZWQgZmllbGQgaXMgaW5jbHVkZWQgb25seSBmb3IgY29tcGxldGVuZXNzLiAgSXQgc2hvdWxkIGNvbnRhaW4KLSAgICAgemVyby4gKi8KLQotICBsb25nIHJlc2VydmVkOwotCi0gIC8qIFRoaXMgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBzaG91bGQgY29udGFpbiAiIExPTkciIChub3RlIGxlYWRpbmcKLSAgICAgc3BhY2UpLCBhbmQgaXMgdW51c2VkLiAqLwotCi0gIGNoYXIgb2xkVGhyZWFkTmFtZVtOTE1fT0xEX1RIUkVBRF9OQU1FX0xFTkdUSF07Ci0KLSAgLyogVGhlIHNjcmVlbk5hbWVMZW5ndGggZmllbGQgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsIHRleHQgc3RvcmVkCi0gICAgIGluIHRoZSBzY3JlZW5OYW1lIGZpZWxkLCBleGNsdWRpbmcgdGhlIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgVGhlCi0gICAgIHNjcmVlbk5hbWUgZmllbGQgY29udGFpbnMgdGhlIHNjcmVlbiBuYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgU0NSRUVOTkFNRQotICAgICBrZXl3b3JkIGluIE5MTUxJTkssIGFuZCBjYW4gYmUgdXAgdG8gTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEgKLSAgICAgY2hhcmFjdGVycy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNjcmVlbk5hbWVMZW5ndGg7Ci0gIGNoYXIgc2NyZWVuTmFtZVtOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSCArIDFdOwotCi0gIC8qIFRoZSB0aHJlYWROYW1lTGVuZ3RoIGZpZWxkIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGFjdHVhbCB0ZXh0IHN0b3JlZAotICAgICBpbiB0aGUgdGhyZWFkTmFtZSBmaWVsZCwgZXhjbHVkaW5nIHRoZSBudWxsIGJ5dGUgdGVybWluYXRvci4gIFRoZQotICAgICB0aHJlYWROYW1lIGZpZWxkIGNvbnRhaW5zIHRoZSB0aHJlYWQgbmFtZSBhcyBzcGVjaWZpZWQgYnkgdGhlIFRIUkVBRE5BTUUKLSAgICAga2V5d29yZCBpbiBOTE1MSU5LLCBhbmQgY2FuIGJlIHVwIHRvIE5MTV9NQVhfVEhSRUFEX05BTUVfTEVOR1RICi0gICAgIGNoYXJhY3RlcnMuICovCi0KLSAgdW5zaWduZWQgY2hhciB0aHJlYWROYW1lTGVuZ3RoOwotICBjaGFyIHRocmVhZE5hbWVbTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEggKyAxXTsKLQotfSBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyOwotCi0jZGVmaW5lIG5sbTMyX2ludGVybmFsX3ZhcmlhYmxlX2hlYWRlciBubG1faW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX3ZhcmlhYmxlX2hlYWRlciBubG1faW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyCi0jZGVmaW5lIE5sbTY0X0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyCi0KLS8qIFRoZSB2ZXJzaW9uIGhlYWRlciBpcyBvbmUgb2YgdGhlIG9wdGlvbmFsIGF1eGlsaWFyeSBoZWFkZXJzIGFuZAotICAgZm9sbG93cyB0aGUgZml4ZWQgbGVuZ3RoIGFuZCB2YXJpYWJsZSBsZW5ndGggTkxNIGhlYWRlcnMuICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF92ZXJzaW9uX2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIlZlUnNJb04jIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0gIGNoYXIgc3RhbXBbOF07Ci0gIGxvbmcgbWFqb3JWZXJzaW9uOwotICBsb25nIG1pbm9yVmVyc2lvbjsKLSAgbG9uZyByZXZpc2lvbjsKLSAgbG9uZyB5ZWFyOwotICBsb25nIG1vbnRoOwotICBsb25nIGRheTsKLX0gTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyOwotCi0jZGVmaW5lIG5sbTMyX2ludGVybmFsX3ZlcnNpb25faGVhZGVyIG5sbV9pbnRlcm5hbF92ZXJzaW9uX2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlciBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfdmVyc2lvbl9oZWFkZXIgbmxtX2ludGVybmFsX3ZlcnNpb25faGVhZGVyCi0jZGVmaW5lIE5sbTY0X0ludGVybmFsX1ZlcnNpb25fSGVhZGVyIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcgotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkNvUHlSaUdoVD0iIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFsxMF07Ci0gIHVuc2lnbmVkIGNoYXIgY29weXJpZ2h0TWVzc2FnZUxlbmd0aDsKLSAgY2hhciBjb3B5cmlnaHRNZXNzYWdlW05MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RIXTsKLX0gTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlciBubG1faW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2NvcHlyaWdodF9oZWFkZXIgbmxtX2ludGVybmFsX2NvcHlyaWdodF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcgotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyCi17Ci0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiTWVTc0FnRXMiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFs4XTsKLSAgbG9uZyBsYW5ndWFnZUlEOwotICBmaWxlX3B0ciBtZXNzYWdlRmlsZU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBtZXNzYWdlRmlsZUxlbmd0aDsKLSAgbG9uZyBtZXNzYWdlQ291bnQ7Ci0gIGZpbGVfcHRyIGhlbHBGaWxlT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIGhlbHBGaWxlTGVuZ3RoOwotICBmaWxlX3B0ciBSUENEYXRhT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIFJQQ0RhdGFMZW5ndGg7Ci0gIGZpbGVfcHRyIHNoYXJlZENvZGVPZmZzZXQ7Ci0gIGJmZF9zaXplX3R5cGUgc2hhcmVkQ29kZUxlbmd0aDsKLSAgZmlsZV9wdHIgc2hhcmVkRGF0YU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaGFyZWREYXRhTGVuZ3RoOwotICBmaWxlX3B0ciBzaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQ7Ci0gIGxvbmcgc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQ7Ci0gIGZpbGVfcHRyIHNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0OwotICBsb25nIHNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQ7Ci0gIGZpbGVfcHRyIHNoYXJlZFB1YmxpY3NPZmZzZXQ7Ci0gIGxvbmcgc2hhcmVkUHVibGljc0NvdW50OwotICBmaWxlX3B0ciBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldDsKLSAgbG9uZyBzaGFyZWREZWJ1Z1JlY29yZENvdW50OwotICBiZmRfdm1hIFNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0OwotICBiZmRfdm1hIFNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQ7Ci0gIGxvbmcgcHJvZHVjdElEOwotICBsb25nIHJlc2VydmVkMDsKLSAgbG9uZyByZXNlcnZlZDE7Ci0gIGxvbmcgcmVzZXJ2ZWQyOwotICBsb25nIHJlc2VydmVkMzsKLSAgbG9uZyByZXNlcnZlZDQ7Ci0gIGxvbmcgcmVzZXJ2ZWQ1OwotfSBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyOwotCi0jZGVmaW5lIG5sbTMyX2ludGVybmFsX2V4dGVuZGVkX2hlYWRlciBubG1faW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlciBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2V4dGVuZGVkX2hlYWRlciBubG1faW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyCi0jZGVmaW5lIE5sbTY0X0ludGVybmFsX0V4dGVuZGVkX0hlYWRlciBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCi0KLS8qIFRoZSBmb3JtYXQgb2YgYSBjdXN0b20gaGVhZGVyIGFzIHN0b3JlZCBpbnRlcm5hbGx5IGlzIGRpZmZlcmVudAotICAgZnJvbSB0aGUgZXh0ZXJuYWwgZm9ybWF0LiAgVGhpcyBpcyBob3cgd2Ugc3RvcmUgYSBjdXN0b20gaGVhZGVyCi0gICB3aGljaCB3ZSBkbyBub3QgcmVjb2duaXplLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX2N1c3RvbV9oZWFkZXIKLXsKLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDdVN0SGVBZCIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotICBiZmRfc2l6ZV90eXBlIGhkckxlbmd0aDsKLSAgZmlsZV9wdHIgZGF0YU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBkYXRhTGVuZ3RoOwotICBjaGFyIGRhdGFTdGFtcFs4XTsKLSAgUFRSIGhkcjsKLX0gTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfY3VzdG9tX2hlYWRlciBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9DdXN0b21fSGVhZGVyIE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2N1c3RvbV9oZWFkZXIgbmxtX2ludGVybmFsX2N1c3RvbV9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfQ3VzdG9tX0hlYWRlciBObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcgotCi0vKiBUaGUgaW50ZXJuYWwgQ3lnbnVzIGhlYWRlciBpcyB3cml0dGVuIG91dCBleHRlcm5hbGx5IGFzIGEgY3VzdG9tCi0gICBoZWFkZXIuICBXZSBkb24ndCB0cnkgdG8gcmVwbGljYXRlIHRoYXQgc3RydWN0dXJlIGhlcmUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIKLXsKLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDeUduVXNFeCIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotICAvKiBGaWxlIGxvY2F0aW9uIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGZpbGVfcHRyIG9mZnNldDsKLSAgLyogTGVuZ3RoIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgbGVuZ3RoOwotfSBObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIgbmxtX2ludGVybmFsX2N5Z251c19leHRfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyIE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcgotI2RlZmluZSBubG02NF9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlciBubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIgTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9wcGMtZXh0LmggYi9pbmNsdWRlL25sbS9wcGMtZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWUxMDcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vcHBjLWV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qIFBvd2VyUEMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBPTERGT1JNQVQKLQotLyogVGhlIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIGNoYW5nZWQuICBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBvbmx5Ci0gICB1c2VkIGluIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogQSBQb3dlclBDIE5MTSBzdGFydHMgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIKLXsKLSAgLyogU2lnbmF0dXJlLiAgTXVzdCBiZSAiQXBwbGVOTE0iLiAgKi8KLSAgY2hhciBzaWduYXR1cmVbOF07Ci0gIC8qIFZlcnNpb24gbnVtYmVyLiAgQ3VycmVudCB2YWx1ZSBpcyAxLiAgKi8KLSAgdW5zaWduZWQgY2hhciBoZWFkZXJWZXJzaW9uWzRdOwotICAvKiA/Py4gIFNob3VsZCBiZSBzZXQgdG8gMC4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3JpZ2luc1s0XTsKLSAgLyogRmlsZSBjcmVhdGlvbiBkYXRlIGluIHN0YW5kYXJkIFVuaXggdGltZSBmb3JtYXQgKHNlY29uZHMgc2luY2UKLSAgICAgMS8xLzcwKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0ZVs0XTsKLX07Ci0KLSNkZWZpbmUgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUgIkFwcGxlTkxNIgotI2RlZmluZSBOTE0zMl9QT1dFUlBDX0hFQURFUl9WRVJTSU9OIDEKLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyBhbgotICAgWENPRkYgZHluYW1pYyByZWxvYy4gICovCi0KLXN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jCi17Ci0gIC8qIEFkZHJlc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGxfdmFkZHJbNF07Ci0gIC8qIFN5bWJvbCB0YWJsZSBpbmRleC4gIFRoaXMgaXMgMCBmb3IgLnRleHQgYW5kIDEgZm9yIC5kYXRhLiAgMgotICAgICBtZWFucyAuYnNzLCBidXQgSSBkb24ndCBrbm93IGlmIGl0IGlzIHVzZWQuICBJbiBYQ09GRiwgbGFyZ2VyCi0gICAgIG51bWJlcnMgYXJlIGluZGljZXMgaW50byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCB0aGV5IGFyZQotICAgICBwcmVzdW1hYmx5IG5vdCB1c2VkIGluIGFuIE5MTS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbF9zeW1uZHhbNF07Ci0gIC8qIFJlbG9jYXRpb24gdHlwZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbF9ydHlwZVsyXTsKLSAgLyogU2VjdGlvbiBudW1iZXIgYmVpbmcgcmVsb2NhdGVkLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsX3JzZWNubVsyXTsKLX07Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9maXhlZF9oZWFkZXIKLXsKLQotICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCi0gICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbMjRdOwotCi0gIC8qIFRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIuICBBdCB0aGlzIHRpbWUsIHRoZSBoaWdoZXN0IHZlcnNpb24gbnVtYmVyCi0gICAgIGlzIDQuICovCi0KLSAgdW5zaWduZWQgY2hhciB2ZXJzaW9uWzRdOwotCi0gIC8qIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUsIHdoaWNoIG11c3QgYmUgYSBET1MgbmFtZSAoMS04IGNoYXJhY3RlcnMgZm9sbG93ZWQKLSAgICAgYnkgYSBwZXJpb2QgYW5kIGEgMS0zIGNoYXJhY3RlciBleHRlbnNpb24pLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKLSAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCi0gICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKLSAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlTmFtZVsxNF07Ci0KLSAgLyogUGFkZGluZyB0byBtYWtlIGl0IGNvbWUgb3V0IGNvcnJlY3QuICovCi0KLSAgdW5zaWduZWQgY2hhciBwYWQxWzJdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgY29kZSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZU9mZnNldFs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY29kZSBpbWFnZSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgZGF0YSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZU9mZnNldFs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBpbWFnZSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VTaXplWzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgcmVnaW9uIHRoYXQgdGhlIGxvYWRlciBpcyB0byBiZQotICAgICBhbGxvY2F0ZWQgYXQgbG9hZCB0aW1lLiAgVW5pbml0aWFsaXplZCBkYXRhIGZvbGxvd3MgdGhlIGluaXRpYWxpemVkCi0gICAgIGRhdGEgaW4gdGhlIE5MTSBhZGRyZXNzIHNwYWNlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgdW5pbml0aWFsaXplZERhdGFTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgY3VzdG9tIGRhdGEgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICBUaGUKLSAgICAgY3VzdG9tIGRhdGEgaXMgc2V0IGJ5IHRoZSBDVVNUT00ga2V5d29yZCB0byBOTE1MSU5LLiAgSXQgaXMgcG9zc2libGUKLSAgICAgZm9yIHRoaXMgdG8gYmUgRU9GIGlmIHRoZXJlIGlzIG5vIGN1c3RvbSBkYXRhLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY3VzdG9tRGF0YU9mZnNldFs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY3VzdG9tIGRhdGEsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY3VzdG9tRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBUaGUgbW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgTU9EVUxFIGtleXdvcmQgaW4KLSAgICAgTkxNTElOSy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZURlcGVuZGVuY3lPZmZzZXRbNF07Ci0KLSAgLyogVGhlIG51bWJlciBvZiBtb2R1bGUgZGVwZW5kZW5jaWVzIGF0IHRoZSBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXNbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSByZWxvY2F0aW9uIGZpeHVwIGRhdGEgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKi8KLSAgICAgCi0gIHVuc2lnbmVkIGNoYXIgcmVsb2NhdGlvbkZpeHVwT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBwdWJsaWNzT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZQdWJsaWNzWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgaW50ZXJuYWwgZGVidWcgaW5mbyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLSAgICAgSXQgaXMgcG9zc2libGUgZm9yIHRoaXMgdG8gYmUgRU9GIGlmIHRoZXJlIGlzIG5vIGRlYnVnIGluZm8uICovCi0KLSAgdW5zaWduZWQgY2hhciBkZWJ1Z0luZm9PZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkRlYnVnUmVjb3Jkc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNvZGVTdGFydE9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGV4aXRQcm9jZWR1cmVPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBjaGVja1VubG9hZFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZVR5cGVbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBmbGFnc1s0XTsKLQotfSBObG0zMl9wb3dlcnBjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL3NwYXJjMzItZXh0LmggYi9pbmNsdWRlL25sbS9zcGFyYzMyLWV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGViMmRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmxtL3NwYXJjMzItZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyogU1BBUkMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbTMyX3NwYXJjX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX3NwYXJjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2FzeXMuaCBiL2luY2x1ZGUvb2FzeXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZDI1MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29hc3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyogT2FzeXMgb2JqZWN0IGZvcm1hdCBoZWFkZXIgZmlsZSBmb3IgQkZELgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jZGVmaW5lIE9BU1lTX01BWF9TRUNfQ09VTlQgMTYKLS8qICoqKiogKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfYXJjaGl2ZV9oZWFkZXIgewotICB1bnNpZ25lZCBpbnQgIHZlcnNpb247Ci0gIGNoYXIgY3JlYXRlX2RhdGVbMTJdOwotICBjaGFyIHJldmlzaW9uX2RhdGVbMTJdOwotICB1bnNpZ25lZCBpbnQgbW9kX2NvdW50OwotICBmaWxlX3B0ciBtb2RfdGJsX29mZnNldDsKLSAgdW5zaWduZWQgaW50IHN5bV90Ymxfc2l6ZTsKLSAgdW5zaWduZWQgaW50IHN5bV9jb3VudDsKLSAgZmlsZV9wdHIgc3ltX3RibF9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCB4cmVmX2NvdW50OwotICBmaWxlX3B0ciB4cmVmX2xzdF9vZmZzZXQ7Ci19IG9hc3lzX2FyY2hpdmVfaGVhZGVyX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX2V4dGFyY2hpdmVfaGVhZGVyIHsKLSAgYmZkX2J5dGUgdmVyc2lvbls0XTsKLSAgYmZkX2J5dGUgY3JlYXRlX2RhdGVbMTJdOwotICBiZmRfYnl0ZSByZXZpc2lvbl9kYXRlWzEyXTsKLSAgYmZkX2J5dGUgbW9kX2NvdW50WzRdOwotICBiZmRfYnl0ZSBtb2RfdGJsX29mZnNldFs0XTsKLSAgYmZkX2J5dGUgc3ltX3RibF9zaXplWzRdOwotICBiZmRfYnl0ZSBzeW1fY291bnRbNF07Ci0gIGJmZF9ieXRlIHN5bV90Ymxfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSB4cmVmX2NvdW50WzRdOwotICBiZmRfYnl0ZSB4cmVmX2xzdF9vZmZzZXRbNF07Ci19IG9hc3lzX2V4dGFyY2hpdmVfaGVhZGVyX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX21vZHVsZV90YWJsZSB7Ci0gIGludCBtb2RfbnVtYmVyOwotICBjaGFyIG1vZF9kYXRlWzEyXTsKLSAgdW5zaWduZWQgaW50IG1vZF9zaXplOwotICB1bnNpZ25lZCBpbnQgZGVwX2NvdW50OwotICB1bnNpZ25lZCBpbnQgZGVwZWVfY291bnQ7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgc2VjdF9jb3VudDsKLSAgY2hhciAqbW9kdWxlX25hbWU7Ci0gIHVuc2lnbmVkIGludCBtb2R1bGVfbmFtZV9zaXplOwotfSBvYXN5c19tb2R1bGVfdGFibGVfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19leHRtb2R1bGVfdGFibGVfYSB7Ci0gIGJmZF9ieXRlIG1vZF9udW1iZXJbNF07Ci0gIGJmZF9ieXRlIG1vZF9kYXRlWzEyXTsKLSAgYmZkX2J5dGUgbW9kX3NpemVbNF07Ci0gIGJmZF9ieXRlIGRlcF9jb3VudFs0XTsKLSAgYmZkX2J5dGUgZGVwZWVfY291bnRbNF07Ci0gIGJmZF9ieXRlIHNlY3RfY291bnRbNF07Ci0gIGJmZF9ieXRlIGZpbGVfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSBtb2RfbmFtZVszMl07Ci19IG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2FfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfZXh0bW9kdWxlX3RhYmxlX2IgewotICBiZmRfYnl0ZSBtb2RfbnVtYmVyWzRdOwotICBiZmRfYnl0ZSBtb2RfZGF0ZVsxMl07Ci0gIGJmZF9ieXRlIG1vZF9zaXplWzRdOwotICBiZmRfYnl0ZSBkZXBfY291bnRbNF07Ci0gIGJmZF9ieXRlIGRlcGVlX2NvdW50WzRdOwotICBiZmRfYnl0ZSBzZWN0X2NvdW50WzRdOwotICBiZmRfYnl0ZSBmaWxlX29mZnNldFs0XTsKLSAgYmZkX2J5dGUgbW9kX25hbWVfbGVuZ3RoWzRdOwotfSBvYXN5c19leHRtb2R1bGVfdGFibGVfdHlwZV9iX3R5cGU7Ci0KLQotdHlwZWRlZiBlbnVtIG9hc3lzX3JlY29yZCB7Ci0gIG9hc3lzX3JlY29yZF9pc19lbmRfZW51bSA9IDAsCi0gIG9hc3lzX3JlY29yZF9pc19kYXRhX2VudW0gPSAxLAotICBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW0gPSAyLAotICBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW0gPSAzLAotICBvYXN5c19yZWNvcmRfaXNfbmFtZWRfc2VjdGlvbl9lbnVtID0gNCwKLSAgb2FzeXNfcmVjb3JkX2lzX2NvbV9lbnVtID0gNSwKLSAgb2FzeXNfcmVjb3JkX2lzX2RlYnVnX2VudW0gPSA2LAotICBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtID0gNywKLSAgb2FzeXNfcmVjb3JkX2lzX2RlYnVnX2ZpbGVfZW51bSA9IDgsCi0gIG9hc3lzX3JlY29yZF9pc19tb2R1bGVfZW51bSA9IDksCi0gIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtID0gMTAKLX0gb2FzeXNfcmVjb3JkX2VudW1fdHlwZTsKLQotICAKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfcmVjb3JkX2hlYWRlciB7Ci0gIHVuc2lnbmVkIGNoYXIgbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyIGNoZWNrX3N1bTsKLSAgdW5zaWduZWQgY2hhciB0eXBlOwotICB1bnNpZ25lZCBjaGFyIGZpbGw7Ci19IG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfZGF0YV9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIGFkZHJbNF07Ci0gIC8qIG1heGltdW0gdG90YWwgc2l6ZSBvZiBkYXRhIHJlY29yZCBpcyAyNTUgYnl0ZXMgKi8KLSAgYmZkX2J5dGUgZGF0YVsyNDZdOwotfSBvYXN5c19kYXRhX3JlY29yZF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19oZWFkZXJfcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgY2hhciB2ZXJzaW9uX251bWJlcjsKLSAgdW5zaWduZWQgY2hhciByZXZfbnVtYmVyOwotICBjaGFyIG1vZHVsZV9uYW1lWzI2LTZdOwotICBjaGFyIGRlc2NyaXB0aW9uWzY0LTI2XTsKLX0gb2FzeXNfaGVhZGVyX3JlY29yZF90eXBlOwotCi0jZGVmaW5lIE9BU1lTX1ZFUlNJT05fTlVNQkVSIDAKLSNkZWZpbmUgT0FTWVNfUkVWX05VTUJFUiAwCi0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX3N5bWJvbF9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIHZhbHVlWzRdOwotICBiZmRfYnl0ZSByZWZub1syXTsKLSAgY2hhciBuYW1lWzY0XTsKLX0gb2FzeXNfc3ltYm9sX3JlY29yZF90eXBlOwotCi0jZGVmaW5lIFJFTE9DQVRJT05fUENSRUxfQklUIDB4ODAKLSNkZWZpbmUgUkVMT0NBVElPTl8zMkJJVF9CSVQgMHg0MAotI2RlZmluZSBSRUxPQ0FUSU9OX1RZUEVfQklUUyAweDMwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9BQlMgMHgwMAotI2RlZmluZSBSRUxPQ0FUSU9OX1RZUEVfUkVMIDB4MTAKLSNkZWZpbmUgUkVMT0NBVElPTl9UWVBFX1VORCAweDIwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9DT00gMHgzMAotI2RlZmluZSBSRUxPQ0FUSU9OX1NFQ1RfQklUUyAweDBmCi0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX3NlY3Rpb25fcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgY2hhciByZWxiOwotICBiZmRfYnl0ZSB2YWx1ZVs0XTsKLSAgYmZkX2J5dGUgdm1hWzRdOwotICBiZmRfYnl0ZSBmaWxsWzNdOwotfSBvYXN5c19zZWN0aW9uX3JlY29yZF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19lbmRfcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgY2hhciByZWxiOwotICBiZmRfYnl0ZSBlbnRyeVs0XTsKLSAgYmZkX2J5dGUgZmlsbFsyXTsKLSAgYmZkX2J5dGUgemVybzsKLX0gb2FzeXNfZW5kX3JlY29yZF90eXBlOwotCi10eXBlZGVmIHVuaW9uIG9hc3lzX3JlY29yZF91bmlvbiB7Ci0gIG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIG9hc3lzX2RhdGFfcmVjb3JkX3R5cGUgZGF0YTsKLSAgb2FzeXNfc2VjdGlvbl9yZWNvcmRfdHlwZSBzZWN0aW9uOwotICBvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGUgc3ltYm9sOwotICBvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGUgZmlyc3Q7Ci0gIG9hc3lzX2VuZF9yZWNvcmRfdHlwZSBlbmQ7Ci0gIGJmZF9ieXRlIHBhZFsyNTZdOwotfSBvYXN5c19yZWNvcmRfdW5pb25fdHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2JqYWxsb2MuaCBiL2luY2x1ZGUvb2JqYWxsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0NTFjZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29iamFsbG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogb2JqYWxsb2MuaCAtLSByb3V0aW5lcyB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9iamVjdHMKLSAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci1sYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBPQkpBTExPQ19ICi0jZGVmaW5lIE9CSkFMTE9DX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIHNwYWNlIGZvciBhbiBvYmplY3QuICBUaGUgYXNzdW1wdGlvbiBpcwotICAgdGhhdCB0aGUgb2JqZWN0IHdpbGwgd2FudCB0byBhbGxvY2F0ZSBzcGFjZSBhcyBpdCBnb2VzIGFsb25nLCBidXQKLSAgIHdpbGwgbmV2ZXIgd2FudCB0byBmcmVlIGFueSBwYXJ0aWN1bGFyIGJsb2NrLiAgVGhlcmUgaXMgYSBmdW5jdGlvbgotICAgdG8gZnJlZSBhIGJsb2NrLCB3aGljaCBhbHNvIGZyZWVzIGFsbCBtb3JlIHJlY2VudGx5IGFsbG9jYXRlZAotICAgYmxvY2tzLiAgVGhlcmUgaXMgYWxzbyBhIGZ1bmN0aW9uIHRvIGZyZWUgYWxsIHRoZSBhbGxvY2F0ZWQgc3BhY2UuCi0KLSAgIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBzcGVjaWFsaXphdGlvbiBvZiBvYnN0YWNrcy4gIFRoZSBtYWluCi0gICBkaWZmZXJlbmNlIGlzIHRoYXQgYSBibG9jayBtYXkgbm90IGJlIGFsbG9jYXRlZCBhIGJpdCBhdCBhIHRpbWUuCi0gICBBbm90aGVyIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGVzZSByb3V0aW5lcyBhcmUgYWx3YXlzIGJ1aWx0IG9uIHRvcAotICAgb2YgbWFsbG9jLCBhbmQgYWx3YXlzIHBhc3MgYW4gbWFsbG9jIGZhaWx1cmUgYmFjayB0byB0aGUgY2FsbGVyLAotICAgdW5saWtlIG1vcmUgcmVjZW50IHZlcnNpb25zIG9mIG9ic3RhY2tzLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IGFuIG9iamFsbG9jIHN0cnVjdHVyZSBsb29rcyBsaWtlLiAgQ2FsbGVycyBzaG91bGQgbm90Ci0gICByZWZlciB0byB0aGVzZSBmaWVsZHMsIG5vciBzaG91bGQgdGhleSBhbGxvY2F0ZSB0aGVzZSBzdHJ1Y3R1cmUKLSAgIHRoZW1zZWx2ZXMuICBJbnN0ZWFkLCB0aGV5IHNob3VsZCBvbmx5IGNyZWF0ZSB0aGVtIHZpYQotICAgb2JqYWxsb2NfaW5pdCwgYW5kIG9ubHkgYWNjZXNzIHRoZW0gdmlhIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3JvcwotICAgbGlzdGVkIGJlbG93LiAgVGhlIHN0cnVjdHVyZSBpcyBvbmx5IGRlZmluZWQgaGVyZSBzbyB0aGF0IHdlIGNhbgotICAgYWNjZXNzIGl0IHZpYSBtYWNyb3MuICAqLwotCi1zdHJ1Y3Qgb2JqYWxsb2MKLXsKLSAgY2hhciAqY3VycmVudF9wdHI7Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X3NwYWNlOwotICBQVFIgY2h1bmtzOwotfTsKLQotLyogV29yayBvdXQgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0KLXN0cnVjdCBvYmphbGxvY19hbGlnbiB7IGNoYXIgeDsgZG91YmxlIGQ7IH07Ci0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSNpZm5kZWYgb2Zmc2V0b2YKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotI2RlZmluZSBPQkpBTExPQ19BTElHTiBcCi0gICgocHRyZGlmZl90KSAoKGNoYXIgKikgJigoc3RydWN0IG9iamFsbG9jX2FsaWduICopIDApLT5kIC0gKGNoYXIgKikgMCkpCi0jZWxzZQotI2RlZmluZSBPQkpBTExPQ19BTElHTiBcCi0gICgobG9uZykgKChjaGFyICopICYoKHN0cnVjdCBvYmphbGxvY19hbGlnbiAqKSAwKS0+ZCAtIChjaGFyICopIDApKQotI2VuZGlmCi0KLS8qIENyZWF0ZSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICBSZXR1cm5zIE5VTEwgaWYgbWFsbG9jIGZhaWxzLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBvYmphbGxvYyAqb2JqYWxsb2NfY3JlYXRlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQWxsb2NhdGUgc3BhY2UgZnJvbSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICBSZXR1cm5zIE5VTEwgaWYgbWFsbG9jCi0gICBmYWlscy4gICovCi0KLWV4dGVybiBQVFIgX29iamFsbG9jX2FsbG9jIFBBUkFNUyAoKHN0cnVjdCBvYmphbGxvYyAqLCB1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFRoZSBtYWNybyB2ZXJzaW9uIG9mIG9iamFsbG9jX2FsbG9jLiAgV2Ugb25seSBkZWZpbmUgdGhpcyBpZiB1c2luZwotICAgZ2NjLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudHMKLSAgIG11bHRpcGxlIHRpbWVzLCBvciB1c2UgYSB0ZW1wb3JhcnkgZmllbGQgYXMgb2JzdGFjay5oIGRvZXMuICAqLwotCi0jaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotCi0vKiBOZXh0U3RlcCAyLjAgY2MgaXMgcmVhbGx5IGdjYyAxLjkzIGJ1dCBpdCBkZWZpbmVzIF9fR05VQ19fID0gMiBhbmQKLSAgIGRvZXMgbm90IGltcGxlbWVudCBfX2V4dGVuc2lvbl9fLiAgQnV0IHRoYXQgY29tcGlsZXIgZG9lc24ndCBkZWZpbmUKLSAgIF9fR05VQ19NSU5PUl9fLiAgKi8KLSNpZiBfX0dOVUNfXyA8IDIgfHwgKF9fTmVYVF9fICYmICFfX0dOVUNfTUlOT1JfXykKLSNkZWZpbmUgX19leHRlbnNpb25fXwotI2VuZGlmCi0KLSNkZWZpbmUgb2JqYWxsb2NfYWxsb2MobywgbCkJCQkJCQlcCi0gIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSAgKHsgc3RydWN0IG9iamFsbG9jICpfX28gPSAobyk7CQkJCQlcCi0gICAgIHVuc2lnbmVkIGxvbmcgX19sZW4gPSAobCk7CQkJCQkJXAotICAgICBpZiAoX19sZW4gPT0gMCkJCQkJCQkJXAotICAgICAgIF9fbGVuID0gMTsJCQkJCQkJXAotICAgICBfX2xlbiA9IChfX2xlbiArIE9CSkFMTE9DX0FMSUdOIC0gMSkgJn4gKE9CSkFMTE9DX0FMSUdOIC0gMSk7CVwKLSAgICAgKF9fbGVuIDw9IF9fby0+Y3VycmVudF9zcGFjZQkJCQkJXAotICAgICAgPyAoX19vLT5jdXJyZW50X3B0ciArPSBfX2xlbiwJCQkJCVwKLQkgX19vLT5jdXJyZW50X3NwYWNlIC09IF9fbGVuLAkJCQkJXAotCSAoUFRSKSAoX19vLT5jdXJyZW50X3B0ciAtIF9fbGVuKSkJCQkJXAotICAgICAgOiBfb2JqYWxsb2NfYWxsb2MgKF9fbywgX19sZW4pKTsgfSkKLQotI2Vsc2UgLyogISBfX0dOVUNfXyAqLwotCi0jZGVmaW5lIG9iamFsbG9jX2FsbG9jKG8sIGwpIF9vYmphbGxvY19hbGxvYyAoKG8pLCAobCkpCi0KLSNlbmRpZiAvKiAhIF9fR05VQ19fICovCi0KLS8qIEZyZWUgYW4gZW50aXJlIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCi0KLWV4dGVybiB2b2lkIG9iamFsbG9jX2ZyZWUgUEFSQU1TICgoc3RydWN0IG9iamFsbG9jICopKTsKLQotLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBieSBvYmphbGxvY19hbGxvYy4gIFRoaXMgYWxzbyBmcmVlcyBhbGwgbW9yZQotICAgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2Nrcy4gICovCi0KLWV4dGVybiB2b2lkIG9iamFsbG9jX2ZyZWVfYmxvY2sgUEFSQU1TICgoc3RydWN0IG9iamFsbG9jICosIFBUUikpOwotCi0jZW5kaWYgLyogT0JKQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vYnN0YWNrLmggYi9pbmNsdWRlL29ic3RhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwYWI1NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29ic3RhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vKiBvYnN0YWNrLmggLSBvYmplY3Qgc3RhY2sgbWFjcm9zCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcsOTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLQotICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLSAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gICBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotLyogU3VtbWFyeToKLQotQWxsIHRoZSBhcHBhcmVudCBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIGFyZSBtYWNyb3MuIFRoZSBpZGVhCi1pcyB0aGF0IHlvdSB3b3VsZCB1c2UgdGhlc2UgcHJlLXRlc3RlZCBtYWNyb3MgdG8gc29sdmUgYQotdmVyeSBzcGVjaWZpYyBzZXQgb2YgcHJvYmxlbXMsIGFuZCB0aGV5IHdvdWxkIHJ1biBmYXN0LgotQ2F1dGlvbjogbm8gc2lkZS1lZmZlY3RzIGluIGFyZ3VtZW50cyBwbGVhc2UhISBUaGV5IG1heSBiZQotZXZhbHVhdGVkIE1BTlkgdGltZXMhIQotCi1UaGVzZSBtYWNyb3Mgb3BlcmF0ZSBhIHN0YWNrIG9mIG9iamVjdHMuICBFYWNoIG9iamVjdCBzdGFydHMgbGlmZQotc21hbGwsIGFuZCBtYXkgZ3JvdyB0byBtYXR1cml0eS4gIChDb25zaWRlciBidWlsZGluZyBhIHdvcmQgc3lsbGFibGUKLWJ5IHN5bGxhYmxlLikgIEFuIG9iamVjdCBjYW4gbW92ZSB3aGlsZSBpdCBpcyBncm93aW5nLiAgT25jZSBpdCBoYXMKLWJlZW4gImZpbmlzaGVkIiBpdCBuZXZlciBjaGFuZ2VzIGFkZHJlc3MgYWdhaW4uICBTbyB0aGUgInRvcCBvZiB0aGUKLXN0YWNrIiBpcyB0eXBpY2FsbHkgYW4gaW1tYXR1cmUgZ3Jvd2luZyBvYmplY3QsIHdoaWxlIHRoZSByZXN0IG9mIHRoZQotc3RhY2sgaXMgb2YgbWF0dXJlLCBmaXhlZCBzaXplIGFuZCBmaXhlZCBhZGRyZXNzIG9iamVjdHMuCi0KLVRoZXNlIHJvdXRpbmVzIGdyYWIgbGFyZ2UgY2h1bmtzIG9mIG1lbW9yeSwgdXNpbmcgYSBmdW5jdGlvbiB5b3UKLXN1cHBseSwgY2FsbGVkIGBvYnN0YWNrX2NodW5rX2FsbG9jJy4gIE9uIG9jY2FzaW9uLCB0aGV5IGZyZWUgY2h1bmtzLAotYnkgY2FsbGluZyBgb2JzdGFja19jaHVua19mcmVlJy4gIFlvdSBtdXN0IGRlZmluZSB0aGVtIGFuZCBkZWNsYXJlCi10aGVtIGJlZm9yZSB1c2luZyBhbnkgb2JzdGFjayBtYWNyb3MuCi0KLUVhY2ggaW5kZXBlbmRlbnQgc3RhY2sgaXMgcmVwcmVzZW50ZWQgYnkgYSBgc3RydWN0IG9ic3RhY2snLgotRWFjaCBvZiB0aGUgb2JzdGFjayBtYWNyb3MgZXhwZWN0cyBhIHBvaW50ZXIgdG8gc3VjaCBhIHN0cnVjdHVyZQotYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgotCi1PbmUgbW90aXZhdGlvbiBmb3IgdGhpcyBwYWNrYWdlIGlzIHRoZSBwcm9ibGVtIG9mIGdyb3dpbmcgY2hhciBzdHJpbmdzCi1pbiBzeW1ib2wgdGFibGVzLiAgVW5sZXNzIHlvdSBhcmUgImZhc2Npc3QgcGlnIHdpdGggYSByZWFkLW9ubHkgbWluZCIKLS0tR29zcGVyJ3MgaW1tb3J0YWwgcXVvdGUgZnJvbSBIQUtNRU0gaXRlbSAxNTQsIG91dCBvZiBjb250ZXh0LS15b3UKLXdvdWxkIG5vdCBsaWtlIHRvIHB1dCBhbnkgYXJiaXRyYXJ5IHVwcGVyIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgeW91cgotc3ltYm9scy4KLQotSW4gcHJhY3RpY2UgdGhpcyBvZnRlbiBtZWFucyB5b3Ugd2lsbCBidWlsZCBtYW55IHNob3J0IHN5bWJvbHMgYW5kIGEKLWZldyBsb25nIHN5bWJvbHMuICBBdCB0aGUgdGltZSB5b3UgYXJlIHJlYWRpbmcgYSBzeW1ib2wgeW91IGRvbid0IGtub3cKLWhvdyBsb25nIGl0IGlzLiAgT25lIHRyYWRpdGlvbmFsIG1ldGhvZCBpcyB0byByZWFkIGEgc3ltYm9sIGludG8gYQotYnVmZmVyLCByZWFsbG9jKClhdGluZyB0aGUgYnVmZmVyIGV2ZXJ5IHRpbWUgeW91IHRyeSB0byByZWFkIGEgc3ltYm9sCi10aGF0IGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIuICBUaGlzIGlzIGJlYXV0LCBidXQgeW91IHN0aWxsIHdpbGwKLXdhbnQgdG8gY29weSB0aGUgc3ltYm9sIGZyb20gdGhlIGJ1ZmZlciB0byBhIG1vcmUgcGVybWFuZW50Ci1zeW1ib2wtdGFibGUgZW50cnkgc2F5IGFib3V0IGhhbGYgdGhlIHRpbWUuCi0KLVdpdGggb2JzdGFja3MsIHlvdSBjYW4gd29yayBkaWZmZXJlbnRseS4gIFVzZSBvbmUgb2JzdGFjayBmb3IgYWxsIHN5bWJvbAotbmFtZXMuICBBcyB5b3UgcmVhZCBhIHN5bWJvbCwgZ3JvdyB0aGUgbmFtZSBpbiB0aGUgb2JzdGFjayBncmFkdWFsbHkuCi1XaGVuIHRoZSBuYW1lIGlzIGNvbXBsZXRlLCBmaW5hbGl6ZSBpdC4gIFRoZW4sIGlmIHRoZSBzeW1ib2wgZXhpc3RzIGFscmVhZHksCi1mcmVlIHRoZSBuZXdseSByZWFkIG5hbWUuCi0KLVRoZSB3YXkgd2UgZG8gdGhpcyBpcyB0byB0YWtlIGEgbGFyZ2UgY2h1bmssIGFsbG9jYXRpbmcgbWVtb3J5IGZyb20KLWxvdyBhZGRyZXNzZXMuICBXaGVuIHlvdSB3YW50IHRvIGJ1aWxkIGEgc3ltYm9sIGluIHRoZSBjaHVuayB5b3UganVzdAotYWRkIGNoYXJzIGFib3ZlIHRoZSBjdXJyZW50ICJoaWdoIHdhdGVyIG1hcmsiIGluIHRoZSBjaHVuay4gIFdoZW4geW91Ci1oYXZlIGZpbmlzaGVkIGFkZGluZyBjaGFycywgYmVjYXVzZSB5b3UgZ290IHRvIHRoZSBlbmQgb2YgdGhlIHN5bWJvbCwKLXlvdSBrbm93IGhvdyBsb25nIHRoZSBjaGFycyBhcmUsIGFuZCB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBvYmplY3QuCi1Nb3N0bHkgdGhlIGNoYXJzIHdpbGwgbm90IGJ1cnN0IG92ZXIgdGhlIGhpZ2hlc3QgYWRkcmVzcyBvZiB0aGUgY2h1bmssCi1iZWNhdXNlIHlvdSB3b3VsZCB0eXBpY2FsbHkgZXhwZWN0IGEgY2h1bmsgdG8gYmUgKHNheSkgMTAwIHRpbWVzIGFzCi1sb25nIGFzIGFuIGF2ZXJhZ2Ugb2JqZWN0LgotCi1JbiBjYXNlIHRoYXQgaXNuJ3QgY2xlYXIsIHdoZW4gd2UgaGF2ZSBlbm91Z2ggY2hhcnMgdG8gbWFrZSB1cAotdGhlIG9iamVjdCwgVEhFWSBBUkUgQUxSRUFEWSBDT05USUdVT1VTIElOIFRIRSBDSFVOSyAoZ3VhcmFudGVlZCkKLXNvIHdlIGp1c3QgcG9pbnQgdG8gaXQgd2hlcmUgaXQgbGllcy4gIE5vIG1vdmluZyBvZiBjaGFycyBpcwotbmVlZGVkIGFuZCB0aGlzIGlzIHRoZSBzZWNvbmQgd2luOiBwb3RlbnRpYWxseSBsb25nIHN0cmluZ3MgbmVlZAotbmV2ZXIgYmUgZXhwbGljaXRseSBzaHVmZmxlZC4gT25jZSBhbiBvYmplY3QgaXMgZm9ybWVkLCBpdCBkb2VzIG5vdAotY2hhbmdlIGl0cyBhZGRyZXNzIGR1cmluZyBpdHMgbGlmZXRpbWUuCi0KLVdoZW4gdGhlIGNoYXJzIGJ1cnN0IG92ZXIgYSBjaHVuayBib3VuZGFyeSwgd2UgYWxsb2NhdGUgYSBsYXJnZXIKLWNodW5rLCBhbmQgdGhlbiBjb3B5IHRoZSBwYXJ0bHkgZm9ybWVkIG9iamVjdCBmcm9tIHRoZSBlbmQgb2YgdGhlIG9sZAotY2h1bmsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IGxhcmdlciBjaHVuay4gIFdlIHRoZW4gY2Fycnkgb24KLWFjY3JldGluZyBjaGFyYWN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIG9iamVjdCBhcyB3ZSBub3JtYWxseSB3b3VsZC4KLQotQSBzcGVjaWFsIG1hY3JvIGlzIHByb3ZpZGVkIHRvIGFkZCBhIHNpbmdsZSBjaGFyIGF0IGEgdGltZSB0byBhCi1ncm93aW5nIG9iamVjdC4gIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgcmVnaXN0ZXIgdmFyaWFibGVzLCB3aGljaAotYnJlYWsgdGhlIG9yZGluYXJ5ICdncm93dGgnIG1hY3JvLgotCi1TdW1tYXJ5OgotCVdlIGFsbG9jYXRlIGxhcmdlIGNodW5rcy4KLQlXZSBjYXJ2ZSBvdXQgb25lIG9iamVjdCBhdCBhIHRpbWUgZnJvbSB0aGUgY3VycmVudCBjaHVuay4KLQlPbmNlIGNhcnZlZCwgYW4gb2JqZWN0IG5ldmVyIG1vdmVzLgotCVdlIGFyZSBmcmVlIHRvIGFwcGVuZCBkYXRhIG9mIGFueSBzaXplIHRvIHRoZSBjdXJyZW50bHkKLQkgIGdyb3dpbmcgb2JqZWN0LgotCUV4YWN0bHkgb25lIG9iamVjdCBpcyBncm93aW5nIGluIGFuIG9ic3RhY2sgYXQgYW55IG9uZSB0aW1lLgotCVlvdSBjYW4gcnVuIG9uZSBvYnN0YWNrIHBlciBjb250cm9sIGJsb2NrLgotCVlvdSBtYXkgaGF2ZSBhcyBtYW55IGNvbnRyb2wgYmxvY2tzIGFzIHlvdSBkYXJlLgotCUJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkbyBpdCwgeW91IGNhbiBgdW53aW5kJyBhbiBvYnN0YWNrCi0JICBiYWNrIHRvIGEgcHJldmlvdXMgc3RhdGUuIChZb3UgbWF5IHJlbW92ZSBvYmplY3RzIG11Y2gKLQkgIGFzIHlvdSB3b3VsZCB3aXRoIGEgc3RhY2suKQotKi8KLQotCi0vKiBEb24ndCBkbyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1vcmUgdGhhbiBvbmNlLiAgKi8KLQotI2lmbmRlZiBfT0JTVEFDS19ICi0jZGVmaW5lIF9PQlNUQUNLX0ggMQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0MCi0vKiBXZSB1c2Ugc3VidHJhY3Rpb24gb2YgKGNoYXIgKikgMCBpbnN0ZWFkIG9mIGNhc3RpbmcgdG8gaW50Ci0gICBiZWNhdXNlIG9uIHdvcmQtYWRkcmVzc2FibGUgbWFjaGluZXMgYSBzaW1wbGUgY2FzdCB0byBpbnQKLSAgIG1heSBpZ25vcmUgdGhlIGJ5dGUtd2l0aGluLXdvcmQgZmllbGQgb2YgdGhlIHBvaW50ZXIuICAqLwotCi0jaWZuZGVmIF9fUFRSX1RPX0lOVAotIyBkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoUCkgLSAoY2hhciAqKSAwKQotI2VuZGlmCi0KLSNpZm5kZWYgX19JTlRfVE9fUFRSCi0jIGRlZmluZSBfX0lOVF9UT19QVFIoUCkgKChQKSArIChjaGFyICopIDApCi0jZW5kaWYKLQotLyogV2UgbmVlZCB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdC4gIElmIF9fUFRSRElGRl9UWVBFX18gaXMKLSAgIGRlZmluZWQsIGFzIHdpdGggR05VIEMsIHVzZSB0aGF0OyB0aGF0IHdheSB3ZSBkb24ndCBwb2xsdXRlIHRoZQotICAgbmFtZXNwYWNlIHdpdGggPHN0ZGRlZi5oPidzIHN5bWJvbHMuICBPdGhlcndpc2UsIGlmIDxzdGRkZWYuaD4gaXMKLSAgIGF2YWlsYWJsZSwgaW5jbHVkZSBpdCBhbmQgdXNlIHB0cmRpZmZfdC4gIEluIHRyYWRpdGlvbmFsIEMsIGxvbmcgaXMKLSAgIHRoZSBiZXN0IHRoYXQgd2UgY2FuIGRvLiAgKi8KLQotI2lmZGVmIF9fUFRSRElGRl9UWVBFX18KLSMgZGVmaW5lIFBUUl9JTlRfVFlQRSBfX1BUUkRJRkZfVFlQRV9fCi0jZWxzZQotIyBpZmRlZiBIQVZFX1NURERFRl9ICi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgIGRlZmluZSBQVFJfSU5UX1RZUEUgcHRyZGlmZl90Ci0jIGVsc2UKLSMgIGRlZmluZSBQVFJfSU5UX1RZUEUgbG9uZwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJJTkdfSAotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotIyAgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgbWVtY3B5ICgoVG8pLCAoRnJvbSksIChOKSkKLSMgZWxzZQotIyAgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgbWVtY3B5ICgoVG8pLCAoY2hhciAqKShGcm9tKSwgKE4pKQotIyBlbmRpZgotI2Vsc2UKLSMgaWZkZWYgbWVtY3B5Ci0jICBkZWZpbmUgX29ic3RhY2tfbWVtY3B5KFRvLCBGcm9tLCBOKSBtZW1jcHkgKChUbyksIChjaGFyICopKEZyb20pLCAoTikpCi0jIGVsc2UKLSMgIGRlZmluZSBfb2JzdGFja19tZW1jcHkoVG8sIEZyb20sIE4pIGJjb3B5ICgoY2hhciAqKShGcm9tKSwgKFRvKSwgKE4pKQotIyBlbmRpZgotI2VuZGlmCi0KLXN0cnVjdCBfb2JzdGFja19jaHVuawkJLyogTGl2ZXMgYXQgZnJvbnQgb2YgZWFjaCBjaHVuay4gKi8KLXsKLSAgY2hhciAgKmxpbWl0OwkJCS8qIDEgcGFzdCBlbmQgb2YgdGhpcyBjaHVuayAqLwotICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnByZXY7CS8qIGFkZHJlc3Mgb2YgcHJpb3IgY2h1bmsgb3IgTlVMTCAqLwotICBjaGFyCWNvbnRlbnRzWzRdOwkJLyogb2JqZWN0cyBiZWdpbiBoZXJlICovCi19OwotCi1zdHJ1Y3Qgb2JzdGFjawkJLyogY29udHJvbCBjdXJyZW50IG9iamVjdCBpbiBjdXJyZW50IGNodW5rICovCi17Ci0gIGxvbmcJY2h1bmtfc2l6ZTsJCS8qIHByZWZlcnJlZCBzaXplIHRvIGFsbG9jYXRlIGNodW5rcyBpbiAqLwotICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOwkvKiBhZGRyZXNzIG9mIGN1cnJlbnQgc3RydWN0IG9ic3RhY2tfY2h1bmsgKi8KLSAgY2hhcgkqb2JqZWN0X2Jhc2U7CQkvKiBhZGRyZXNzIG9mIG9iamVjdCB3ZSBhcmUgYnVpbGRpbmcgKi8KLSAgY2hhcgkqbmV4dF9mcmVlOwkJLyogd2hlcmUgdG8gYWRkIG5leHQgY2hhciB0byBjdXJyZW50IG9iamVjdCAqLwotICBjaGFyCSpjaHVua19saW1pdDsJCS8qIGFkZHJlc3Mgb2YgY2hhciBhZnRlciBjdXJyZW50IGNodW5rICovCi0gIFBUUl9JTlRfVFlQRSB0ZW1wOwkJLyogVGVtcG9yYXJ5IGZvciBzb21lIG1hY3Jvcy4gICovCi0gIGludCAgIGFsaWdubWVudF9tYXNrOwkJLyogTWFzayBvZiBhbGlnbm1lbnQgZm9yIGVhY2ggb2JqZWN0LiAqLwotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSAgLyogVGhlc2UgcHJvdG90eXBlcyB2YXJ5IGJhc2VkIG9uIGB1c2VfZXh0cmFfYXJnJywgYW5kIHdlIHVzZQotICAgICBjYXN0cyB0byB0aGUgcHJvdG90eXBlbGVzcyBmdW5jdGlvbiB0eXBlIGluIGFsbCBhc3NpZ25tZW50cywKLSAgICAgYnV0IGhhdmluZyBwcm90b3R5cGVzIGhlcmUgcXVpZXRzIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLwotICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqY2h1bmtmdW4pICh2b2lkICosIGxvbmcpOwotICB2b2lkICgqZnJlZWZ1bikgKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopOwotICB2b2lkICpleHRyYV9hcmc7CQkvKiBmaXJzdCBhcmcgZm9yIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgKi8KLSNlbHNlCi0gIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCpjaHVua2Z1bikgKCk7IC8qIFVzZXIncyBmY24gdG8gYWxsb2NhdGUgYSBjaHVuay4gICovCi0gIHZvaWQgKCpmcmVlZnVuKSAoKTsJCS8qIFVzZXIncyBmdW5jdGlvbiB0byBmcmVlIGEgY2h1bmsuICAqLwotICBjaGFyICpleHRyYV9hcmc7CQkvKiBmaXJzdCBhcmcgZm9yIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgKi8KLSNlbmRpZgotICB1bnNpZ25lZCB1c2VfZXh0cmFfYXJnOjE7CS8qIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgdGFrZSBleHRyYSBhcmcgKi8KLSAgdW5zaWduZWQgbWF5YmVfZW1wdHlfb2JqZWN0OjE7LyogVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjdXJyZW50Ci0JCQkJICAgY2h1bmsgY29udGFpbnMgYSB6ZXJvLWxlbmd0aCBvYmplY3QuICBUaGlzCi0JCQkJICAgcHJldmVudHMgZnJlZWluZyB0aGUgY2h1bmsgaWYgd2UgYWxsb2NhdGUKLQkJCQkgICBhIGJpZ2dlciBjaHVuayB0byByZXBsYWNlIGl0LiAqLwotICB1bnNpZ25lZCBhbGxvY19mYWlsZWQ6MTsJLyogTm8gbG9uZ2VyIHVzZWQsIGFzIHdlIG5vdyBjYWxsIHRoZSBmYWlsZWQKLQkJCQkgICBoYW5kbGVyIG9uIGVycm9yLCBidXQgcmV0YWluZWQgZm9yIGJpbmFyeQotCQkJCSAgIGNvbXBhdGliaWxpdHkuICAqLwotfTsKLQotLyogRGVjbGFyZSB0aGUgZXh0ZXJuYWwgZnVuY3Rpb25zIHdlIHVzZTsgdGhleSBhcmUgaW4gb2JzdGFjay5jLiAgKi8KLQotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLWV4dGVybiB2b2lkIF9vYnN0YWNrX25ld2NodW5rIChzdHJ1Y3Qgb2JzdGFjayAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgX29ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKiwgdm9pZCAqKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKHN0cnVjdCBvYnN0YWNrICosIGludCwgaW50LAotCQkJICAgIHZvaWQgKigqKSAobG9uZyksIHZvaWQgKCopICh2b2lkICopKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW5fMSAoc3RydWN0IG9ic3RhY2sgKiwgaW50LCBpbnQsCi0JCQkgICAgIHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSwKLQkJCSAgICAgdm9pZCAoKikgKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfbWVtb3J5X3VzZWQgKHN0cnVjdCBvYnN0YWNrICopOwotI2Vsc2UKLWV4dGVybiB2b2lkIF9vYnN0YWNrX25ld2NodW5rICgpOwotZXh0ZXJuIHZvaWQgX29ic3RhY2tfZnJlZSAoKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKCk7Ci1leHRlcm4gaW50IF9vYnN0YWNrX2JlZ2luXzEgKCk7Ci1leHRlcm4gaW50IF9vYnN0YWNrX21lbW9yeV91c2VkICgpOwotI2VuZGlmCi0MCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotCi0vKiBEbyB0aGUgZnVuY3Rpb24tZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3RzCi0gICBidXQgYmVmb3JlIGRlZmluaW5nIHRoZSBtYWNyb3MuICAqLwotCi12b2lkIG9ic3RhY2tfaW5pdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotCi12b2lkICogb2JzdGFja19hbGxvYyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBzaXplKTsKLQotdm9pZCAqIG9ic3RhY2tfY29weSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmFkZHJlc3MsIGludCBzaXplKTsKLXZvaWQgKiBvYnN0YWNrX2NvcHkwIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYWRkcmVzcywgaW50IHNpemUpOwotCi12b2lkIG9ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmJsb2NrKTsKLQotdm9pZCBvYnN0YWNrX2JsYW5rIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IHNpemUpOwotCi12b2lkIG9ic3RhY2tfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEsIGludCBzaXplKTsKLXZvaWQgb2JzdGFja19ncm93MCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEsIGludCBzaXplKTsKLQotdm9pZCBvYnN0YWNrXzFncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGFfY2hhcik7Ci12b2lkIG9ic3RhY2tfcHRyX2dyb3cgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICpkYXRhKTsKLXZvaWQgb2JzdGFja19pbnRfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBkYXRhKTsKLQotdm9pZCAqIG9ic3RhY2tfZmluaXNoIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLWludCBvYnN0YWNrX29iamVjdF9zaXplIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLWludCBvYnN0YWNrX3Jvb20gKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLXZvaWQgb2JzdGFja19tYWtlX3Jvb20gKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7Ci12b2lkIG9ic3RhY2tfMWdyb3dfZmFzdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBkYXRhX2NoYXIpOwotdm9pZCBvYnN0YWNrX3B0cl9ncm93X2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICpkYXRhKTsKLXZvaWQgb2JzdGFja19pbnRfZ3Jvd19mYXN0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGEpOwotdm9pZCBvYnN0YWNrX2JsYW5rX2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7Ci0KLXZvaWQgKiBvYnN0YWNrX2Jhc2UgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLXZvaWQgKiBvYnN0YWNrX25leHRfZnJlZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotaW50IG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLWludCBvYnN0YWNrX2NodW5rX3NpemUgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLWludCBvYnN0YWNrX21lbW9yeV91c2VkIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0vKiBOb24tQU5TSSBDIGNhbm5vdCByZWFsbHkgc3VwcG9ydCBhbHRlcm5hdGl2ZSBmdW5jdGlvbnMgZm9yIHRoZXNlIG1hY3JvcywKLSAgIHNvIHdlIGRvIG5vdCBkZWNsYXJlIHRoZW0uICAqLwotCi0vKiBFcnJvciBoYW5kbGVyIGNhbGxlZCB3aGVuIGBvYnN0YWNrX2NodW5rX2FsbG9jJyBmYWlsZWQgdG8gYWxsb2NhdGUKLSAgIG1vcmUgbWVtb3J5LiAgVGhpcyBjYW4gYmUgc2V0IHRvIGEgdXNlciBkZWZpbmVkIGZ1bmN0aW9uLiAgVGhlCi0gICBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCBhIG1lc3NhZ2UgYW5kIGFib3J0LiAgKi8KLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi1leHRlcm4gdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICh2b2lkKTsKLSNlbHNlCi1leHRlcm4gdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotI2VuZGlmCi0KLS8qIEV4aXQgdmFsdWUgdXNlZCB3aGVuIGBwcmludF9hbmRfYWJvcnQnIGlzIHVzZWQuICAqLwotZXh0ZXJuIGludCBvYnN0YWNrX2V4aXRfZmFpbHVyZTsKLQwKLS8qIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIG9iamVjdCBiZWluZyBhbGxvY2F0ZWQgb3IgdG8gYmUgYWxsb2NhdGVkIG5leHQuCi0gICBOb3RlIHRoYXQgdGhpcyBtaWdodCBub3QgYmUgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgYmVjYXVzZSBhIG5ldyBjaHVuayBtaWdodCBiZSBuZWVkZWQgdG8gaG9sZCB0aGUgZmluYWwgc2l6ZS4gICovCi0KLSNkZWZpbmUgb2JzdGFja19iYXNlKGgpICgoaCktPm9iamVjdF9iYXNlKQotCi0vKiBTaXplIGZvciBhbGxvY2F0aW5nIG9yZGluYXJ5IGNodW5rcy4gICovCi0KLSNkZWZpbmUgb2JzdGFja19jaHVua19zaXplKGgpICgoaCktPmNodW5rX3NpemUpCi0KLS8qIFBvaW50ZXIgdG8gbmV4dCBieXRlIG5vdCB5ZXQgYWxsb2NhdGVkIGluIGN1cnJlbnQgY2h1bmsuICAqLwotCi0jZGVmaW5lIG9ic3RhY2tfbmV4dF9mcmVlKGgpCSgoaCktPm5leHRfZnJlZSkKLQotLyogTWFzayBzcGVjaWZ5aW5nIGxvdyBiaXRzIHRoYXQgc2hvdWxkIGJlIGNsZWFyIGluIGFkZHJlc3Mgb2YgYW4gb2JqZWN0LiAgKi8KLQotI2RlZmluZSBvYnN0YWNrX2FsaWdubWVudF9tYXNrKGgpICgoaCktPmFsaWdubWVudF9tYXNrKQotCi0vKiBUbyBwcmV2ZW50IHByb3RvdHlwZSB3YXJuaW5ncyBwcm92aWRlIGNvbXBsZXRlIGFyZ3VtZW50IGxpc3QgaW4KLSAgIHN0YW5kYXJkIEMgdmVyc2lvbi4gICovCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotCi0jIGRlZmluZSBvYnN0YWNrX2luaXQoaCkgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAwLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQotCi0jIGRlZmluZSBvYnN0YWNrX2JlZ2luKGgsIHNpemUpIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQotCi0jIGRlZmluZSBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbihoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuKSBcCi0gIF9vYnN0YWNrX2JlZ2luICgoaCksIChzaXplKSwgKGFsaWdubWVudCksIFwKLQkJICAgICh2b2lkICooKikgKGxvbmcpKSAoY2h1bmtmdW4pLCAodm9pZCAoKikgKHZvaWQgKikpIChmcmVlZnVuKSkKLQotIyBkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKSBcCi0gIF9vYnN0YWNrX2JlZ2luXzEgKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSkgKGNodW5rZnVuKSwgXAotCQkgICAgKHZvaWQgKCopICh2b2lkICosIHZvaWQgKikpIChmcmVlZnVuKSwgKGFyZykpCi0KLSMgZGVmaW5lIG9ic3RhY2tfY2h1bmtmdW4oaCwgbmV3Y2h1bmtmdW4pIFwKLSAgKChoKSAtPiBjaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSh2b2lkICosIGxvbmcpKSAobmV3Y2h1bmtmdW4pKQotCi0jIGRlZmluZSBvYnN0YWNrX2ZyZWVmdW4oaCwgbmV3ZnJlZWZ1bikgXAotICAoKGgpIC0+IGZyZWVmdW4gPSAodm9pZCAoKikodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIChuZXdmcmVlZnVuKSkKLQotI2Vsc2UKLQotIyBkZWZpbmUgb2JzdGFja19pbml0KGgpIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgMCwgMCwgXAotCQkgICh2b2lkICooKikgKCkpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAoKSkgb2JzdGFja19jaHVua19mcmVlKQotCi0jIGRlZmluZSBvYnN0YWNrX2JlZ2luKGgsIHNpemUpIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAoKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICgpKSBvYnN0YWNrX2NodW5rX2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4pIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAoKSkgKGNodW5rZnVuKSwgKHZvaWQgKCopICgpKSAoZnJlZWZ1bikpCi0KLSMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uX3dpdGhfYXJnKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4sIGFyZykgXAotICBfb2JzdGFja19iZWdpbl8xICgoaCksIChzaXplKSwgKGFsaWdubWVudCksIFwKLQkJICAgICh2b2lkICooKikgKCkpIChjaHVua2Z1biksICh2b2lkICgqKSAoKSkgKGZyZWVmdW4pLCAoYXJnKSkKLQotIyBkZWZpbmUgb2JzdGFja19jaHVua2Z1bihoLCBuZXdjaHVua2Z1bikgXAotICAoKGgpIC0+IGNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopKCkpIChuZXdjaHVua2Z1bikpCi0KLSMgZGVmaW5lIG9ic3RhY2tfZnJlZWZ1bihoLCBuZXdmcmVlZnVuKSBcCi0gICgoaCkgLT4gZnJlZWZ1biA9ICh2b2lkICgqKSgpKSAobmV3ZnJlZWZ1bikpCi0KLSNlbmRpZgotCi0jZGVmaW5lIG9ic3RhY2tfMWdyb3dfZmFzdChoLGFjaGFyKSAoKigoaCktPm5leHRfZnJlZSkrKyA9IGFjaGFyKQotCi0jZGVmaW5lIG9ic3RhY2tfYmxhbmtfZmFzdChoLG4pICgoaCktPm5leHRfZnJlZSArPSAobikpCi0KLSNkZWZpbmUgb2JzdGFja19tZW1vcnlfdXNlZChoKSBfb2JzdGFja19tZW1vcnlfdXNlZCAoaCkKLQwKLSNpZiBkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLS8qIE5leHRTdGVwIDIuMCBjYyBpcyByZWFsbHkgZ2NjIDEuOTMgYnV0IGl0IGRlZmluZXMgX19HTlVDX18gPSAyIGFuZAotICAgZG9lcyBub3QgaW1wbGVtZW50IF9fZXh0ZW5zaW9uX18uICBCdXQgdGhhdCBjb21waWxlciBkb2Vzbid0IGRlZmluZQotICAgX19HTlVDX01JTk9SX18uICAqLwotIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fTmVYVF9fICYmICFfX0dOVUNfTUlOT1JfXykKLSMgIGRlZmluZSBfX2V4dGVuc2lvbl9fCi0jIGVuZGlmCi0KLS8qIEZvciBHTlUgQywgaWYgbm90IC10cmFkaXRpb25hbCwKLSAgIHdlIGNhbiBkZWZpbmUgdGhlc2UgbWFjcm9zIHRvIGNvbXB1dGUgYWxsIGFyZ3Mgb25seSBvbmNlCi0gICB3aXRob3V0IHVzaW5nIGEgZ2xvYmFsIHZhcmlhYmxlLgotICAgQWxzbywgd2UgY2FuIGF2b2lkIHVzaW5nIHRoZSBgdGVtcCcgc2xvdCwgdG8gbWFrZSBmYXN0ZXIgY29kZS4gICovCi0KLSMgZGVmaW5lIG9ic3RhY2tfb2JqZWN0X3NpemUoT0JTVEFDSykJCQkJCVwKLSAgX19leHRlbnNpb25fXwkJCQkJCQkJXAotICAoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgICAodW5zaWduZWQpIChfX28tPm5leHRfZnJlZSAtIF9fby0+b2JqZWN0X2Jhc2UpOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX3Jvb20oT0JTVEFDSykJCQkJCQlcCi0gIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgICAgKHVuc2lnbmVkKSAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlKTsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19tYWtlX3Jvb20oT0JTVEFDSyxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCi0gICBpZiAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlIDwgX19sZW4pCQkJXAotICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKE9CU1RBQ0spCQkJCQlcCi0gIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgICAgKF9fby0+Y2h1bmstPnByZXYgPT0gMCAmJiBfX28tPm5leHRfZnJlZSAtIF9fby0+Y2h1bmstPmNvbnRlbnRzID09IDApOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2dyb3coT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCi0gICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBfX2xlbiA+IF9fby0+Y2h1bmtfbGltaXQpCQkJXAotICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCi0gICBfb2JzdGFja19tZW1jcHkgKF9fby0+bmV4dF9mcmVlLCAod2hlcmUpLCBfX2xlbik7CQkJXAotICAgX19vLT5uZXh0X2ZyZWUgKz0gX19sZW47CQkJCQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfZ3JvdzAoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCi0gICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBfX2xlbiArIDEgPiBfX28tPmNodW5rX2xpbWl0KQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4gKyAxKTsJCQkJXAotICAgX29ic3RhY2tfbWVtY3B5IChfX28tPm5leHRfZnJlZSwgKHdoZXJlKSwgX19sZW4pOwkJCVwKLSAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKLSAgICooX19vLT5uZXh0X2ZyZWUpKysgPSAwOwkJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrXzFncm93KE9CU1RBQ0ssZGF0dW0pCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaWYgKF9fby0+bmV4dF9mcmVlICsgMSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgMSk7CQkJCQlcCi0gICAqKF9fby0+bmV4dF9mcmVlKSsrID0gKGRhdHVtKTsJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0vKiBUaGVzZSBhc3N1bWUgdGhhdCB0aGUgb2JzdGFjayBhbGlnbm1lbnQgaXMgZ29vZCBlbm91Z2ggZm9yIHBvaW50ZXJzIG9yIGludHMsCi0gICBhbmQgdGhhdCB0aGUgZGF0YSBhZGRlZCBzbyBmYXIgdG8gdGhlIGN1cnJlbnQgb2JqZWN0Ci0gICBzaGFyZXMgdGhhdCBtdWNoIGFsaWdubWVudC4gICovCi0KLSMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAodm9pZCAqKSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAodm9pZCAqKSk7CQkJCVwKLSAgICooKHZvaWQgKiopX19vLT5uZXh0X2ZyZWUpKysgPSAoKHZvaWQgKilkYXR1bSk7CQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAoaW50KSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAoaW50KSk7CQkJCVwKLSAgICooKGludCAqKV9fby0+bmV4dF9mcmVlKSsrID0gKChpbnQpZGF0dW0pOwkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19wdHJfZ3Jvd19mYXN0KGgsYXB0cikgKCooKHZvaWQgKiopIChoKS0+bmV4dF9mcmVlKSsrID0gKHZvaWQgKilhcHRyKQotIyBkZWZpbmUgb2JzdGFja19pbnRfZ3Jvd19mYXN0KGgsYWludCkgKCooKGludCAqKSAoaCktPm5leHRfZnJlZSkrKyA9IChpbnQpIGFpbnQpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmxhbmsoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAotICAgaWYgKF9fby0+Y2h1bmtfbGltaXQgLSBfX28tPm5leHRfZnJlZSA8IF9fbGVuKQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4pOwkJCQkJXAotICAgX19vLT5uZXh0X2ZyZWUgKz0gX19sZW47CQkJCQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfYWxsb2MoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAotICAgb2JzdGFja19ibGFuayAoX19oLCAobGVuZ3RoKSk7CQkJCQlcCi0gICBvYnN0YWNrX2ZpbmlzaCAoX19oKTsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19jb3B5KE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAotICAgb2JzdGFja19ncm93IChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAotICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfY29weTAoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX2ggPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBvYnN0YWNrX2dyb3cwIChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAotICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCi0KLS8qIFRoZSBsb2NhbCB2YXJpYWJsZSBpcyBuYW1lZCBfX28xIHRvIGF2b2lkIGEgbmFtZSBjb25mbGljdAotICAgd2hlbiBvYnN0YWNrX2JsYW5rIGlzIGNhbGxlZC4gICovCi0jIGRlZmluZSBvYnN0YWNrX2ZpbmlzaChPQlNUQUNLKSAgCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vMSA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIHZvaWQgKnZhbHVlOwkJCQkJCQkJXAotICAgdmFsdWUgPSAodm9pZCAqKSBfX28xLT5vYmplY3RfYmFzZTsJCQkJCVwKLSAgIGlmIChfX28xLT5uZXh0X2ZyZWUgPT0gdmFsdWUpCQkJCQlcCi0gICAgIF9fbzEtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7CQkJCQlcCi0gICBfX28xLT5uZXh0X2ZyZWUJCQkJCQkJXAotICAgICA9IF9fSU5UX1RPX1BUUiAoKF9fUFRSX1RPX0lOVCAoX19vMS0+bmV4dF9mcmVlKStfX28xLT5hbGlnbm1lbnRfbWFzaylcCi0JCSAgICAgJiB+IChfX28xLT5hbGlnbm1lbnRfbWFzaykpOwkJCVwKLSAgIGlmIChfX28xLT5uZXh0X2ZyZWUgLSAoY2hhciAqKV9fbzEtPmNodW5rCQkJCVwKLSAgICAgICA+IF9fbzEtPmNodW5rX2xpbWl0IC0gKGNoYXIgKilfX28xLT5jaHVuaykJCQlcCi0gICAgIF9fbzEtPm5leHRfZnJlZSA9IF9fbzEtPmNodW5rX2xpbWl0OwkJCQlcCi0gICBfX28xLT5vYmplY3RfYmFzZSA9IF9fbzEtPm5leHRfZnJlZTsJCQkJCVwKLSAgIHZhbHVlOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2ZyZWUoT0JTVEFDSywgT0JKKQkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIHZvaWQgKl9fb2JqID0gKE9CSik7CQkJCQkJCVwKLSAgIGlmIChfX29iaiA+ICh2b2lkICopX19vLT5jaHVuayAmJiBfX29iaiA8ICh2b2lkICopX19vLT5jaHVua19saW1pdCkgIFwKLSAgICAgX19vLT5uZXh0X2ZyZWUgPSBfX28tPm9iamVjdF9iYXNlID0gX19vYmo7CQkJCVwKLSAgIGVsc2UgKG9ic3RhY2tfZnJlZSkgKF9fbywgX19vYmopOyB9KQotDAotI2Vsc2UgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLwotCi0jIGRlZmluZSBvYnN0YWNrX29iamVjdF9zaXplKGgpIFwKLSAodW5zaWduZWQpICgoaCktPm5leHRfZnJlZSAtIChoKS0+b2JqZWN0X2Jhc2UpCi0KLSMgZGVmaW5lIG9ic3RhY2tfcm9vbShoKQkJXAotICh1bnNpZ25lZCkgKChoKS0+Y2h1bmtfbGltaXQgLSAoaCktPm5leHRfZnJlZSkKLQotIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKGgpIFwKLSAoKGgpLT5jaHVuay0+cHJldiA9PSAwICYmIChoKS0+bmV4dF9mcmVlIC0gKGgpLT5jaHVuay0+Y29udGVudHMgPT0gMCkKLQotLyogTm90ZSB0aGF0IHRoZSBjYWxsIHRvIF9vYnN0YWNrX25ld2NodW5rIGlzIGVuY2xvc2VkIGluICguLi4sIDApCi0gICBzbyB0aGF0IHdlIGNhbiBhdm9pZCBoYXZpbmcgdm9pZCBleHByZXNzaW9ucwotICAgaW4gdGhlIGFybXMgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0gICBDYXN0aW5nIHRoZSB0aGlyZCBvcGVyYW5kIHRvIHZvaWQgd2FzIHRyaWVkIGJlZm9yZSwKLSAgIGJ1dCBzb21lIGNvbXBpbGVycyB3b24ndCBhY2NlcHQgaXQuICAqLwotCi0jIGRlZmluZSBvYnN0YWNrX21ha2Vfcm9vbShoLGxlbmd0aCkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKLSAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcCA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wKSwgMCkgOiAwKSkKLQotIyBkZWZpbmUgb2JzdGFja19ncm93KGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAotKCAoaCktPnRlbXAgPSAobGVuZ3RoKSwJCQkJCQkJXAotICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wID4gKGgpLT5jaHVua19saW1pdCkJCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXApLCAwKSA6IDApLAkJCVwKLSAgX29ic3RhY2tfbWVtY3B5ICgoaCktPm5leHRfZnJlZSwgKHdoZXJlKSwgKGgpLT50ZW1wKSwJCQlcCi0gIChoKS0+bmV4dF9mcmVlICs9IChoKS0+dGVtcCkKLQotIyBkZWZpbmUgb2JzdGFja19ncm93MChoLHdoZXJlLGxlbmd0aCkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKLSAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcCArIDEgPiAoaCktPmNodW5rX2xpbWl0KQkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcCArIDEpLCAwKSA6IDApLAkJCVwKLSAgX29ic3RhY2tfbWVtY3B5ICgoaCktPm5leHRfZnJlZSwgKHdoZXJlKSwgKGgpLT50ZW1wKSwJCQlcCi0gIChoKS0+bmV4dF9mcmVlICs9IChoKS0+dGVtcCwJCQkJCQlcCi0gICooKGgpLT5uZXh0X2ZyZWUpKysgPSAwKQotCi0jIGRlZmluZSBvYnN0YWNrXzFncm93KGgsZGF0dW0pCQkJCQkJXAotKCAoKChoKS0+bmV4dF9mcmVlICsgMSA+IChoKS0+Y2h1bmtfbGltaXQpCQkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIDEpLCAwKSA6IDApLAkJCQlcCi0gICgqKChoKS0+bmV4dF9mcmVlKSsrID0gKGRhdHVtKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coaCxkYXR1bSkJCQkJCVwKLSggKCgoaCktPm5leHRfZnJlZSArIHNpemVvZiAoY2hhciAqKSA+IChoKS0+Y2h1bmtfbGltaXQpCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCBzaXplb2YgKGNoYXIgKikpLCAwKSA6IDApLAkJXAotICAoKigoY2hhciAqKikgKCgoaCktPm5leHRfZnJlZSs9c2l6ZW9mKGNoYXIgKikpLXNpemVvZihjaGFyICopKSkgPSAoKGNoYXIgKikgZGF0dW0pKSkKLQotIyBkZWZpbmUgb2JzdGFja19pbnRfZ3JvdyhoLGRhdHVtKQkJCQkJXAotKCAoKChoKS0+bmV4dF9mcmVlICsgc2l6ZW9mIChpbnQpID4gKGgpLT5jaHVua19saW1pdCkJCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCBzaXplb2YgKGludCkpLCAwKSA6IDApLAkJCVwKLSAgKCooKGludCAqKSAoKChoKS0+bmV4dF9mcmVlKz1zaXplb2YoaW50KSktc2l6ZW9mKGludCkpKSA9ICgoaW50KSBkYXR1bSkpKQotCi0jIGRlZmluZSBvYnN0YWNrX3B0cl9ncm93X2Zhc3QoaCxhcHRyKSAoKigoY2hhciAqKikgKGgpLT5uZXh0X2ZyZWUpKysgPSAoY2hhciAqKSBhcHRyKQotIyBkZWZpbmUgb2JzdGFja19pbnRfZ3Jvd19mYXN0KGgsYWludCkgKCooKGludCAqKSAoaCktPm5leHRfZnJlZSkrKyA9IChpbnQpIGFpbnQpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmxhbmsoaCxsZW5ndGgpCQkJCQlcCi0oIChoKS0+dGVtcCA9IChsZW5ndGgpLAkJCQkJCQlcCi0gICgoKGgpLT5jaHVua19saW1pdCAtIChoKS0+bmV4dF9mcmVlIDwgKGgpLT50ZW1wKQkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcCksIDApIDogMCksCQkJXAotICAoKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wKSkKLQotIyBkZWZpbmUgb2JzdGFja19hbGxvYyhoLGxlbmd0aCkJCQkJCVwKLSAob2JzdGFja19ibGFuayAoKGgpLCAobGVuZ3RoKSksIG9ic3RhY2tfZmluaXNoICgoaCkpKQotCi0jIGRlZmluZSBvYnN0YWNrX2NvcHkoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCi0gKG9ic3RhY2tfZ3JvdyAoKGgpLCAod2hlcmUpLCAobGVuZ3RoKSksIG9ic3RhY2tfZmluaXNoICgoaCkpKQotCi0jIGRlZmluZSBvYnN0YWNrX2NvcHkwKGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAotIChvYnN0YWNrX2dyb3cwICgoaCksICh3aGVyZSksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfZmluaXNoKGgpICAJCQkJCQlcCi0oICgoaCktPm5leHRfZnJlZSA9PSAoaCktPm9iamVjdF9iYXNlCQkJCQlcCi0gICA/ICgoKGgpLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxKSwgMCkJCQkJCVwKLSAgIDogMCksCQkJCQkJCQlcCi0gIChoKS0+dGVtcCA9IF9fUFRSX1RPX0lOVCAoKGgpLT5vYmplY3RfYmFzZSksCQkJCVwKLSAgKGgpLT5uZXh0X2ZyZWUJCQkJCQkJXAotICAgID0gX19JTlRfVE9fUFRSICgoX19QVFJfVE9fSU5UICgoaCktPm5leHRfZnJlZSkrKGgpLT5hbGlnbm1lbnRfbWFzaykJXAotCQkgICAgJiB+ICgoaCktPmFsaWdubWVudF9tYXNrKSksCQkJCVwKLSAgKCgoaCktPm5leHRfZnJlZSAtIChjaGFyICopIChoKS0+Y2h1bmsJCQkJXAotICAgID4gKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspCQkJCVwKLSAgID8gKChoKS0+bmV4dF9mcmVlID0gKGgpLT5jaHVua19saW1pdCkgOiAwKSwJCQkJXAotICAoaCktPm9iamVjdF9iYXNlID0gKGgpLT5uZXh0X2ZyZWUsCQkJCQlcCi0gIF9fSU5UX1RPX1BUUiAoKGgpLT50ZW1wKSkKLQotIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0jICBkZWZpbmUgb2JzdGFja19mcmVlKGgsb2JqKQkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGNoYXIgKikgKG9iaikgLSAoY2hhciAqKSAoaCktPmNodW5rLAkJCVwKLSAgKCgoaCktPnRlbXAgPiAwICYmIChoKS0+dGVtcCA8IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKSAoaCktPmNodW5rKVwKLSAgID8gKGludCkgKChoKS0+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCi0JICAgID0gKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAotICAgOiAoKChvYnN0YWNrX2ZyZWUpICgoaCksIChoKS0+dGVtcCArIChjaGFyICopIChoKS0+Y2h1bmspLCAwKSwgMCkpKQotIyBlbHNlCi0jICBkZWZpbmUgb2JzdGFja19mcmVlKGgsb2JqKQkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGNoYXIgKikgKG9iaikgLSAoY2hhciAqKSAoaCktPmNodW5rLAkJCVwKLSAgKCgoaCktPnRlbXAgPiAwICYmIChoKS0+dGVtcCA8IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKSAoaCktPmNodW5rKVwKLSAgID8gKGludCkgKChoKS0+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCi0JICAgID0gKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAotICAgOiAoX29ic3RhY2tfZnJlZSAoKGgpLCAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKSwgMCkpKQotIyBlbmRpZgotCi0jZW5kaWYgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0JLyogQysrICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIG9ic3RhY2suaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nIGIvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDUyYzJiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDIxNzcgKzAsMCBAQAotMjAwMC0wMy0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChTSE9SVF9BMSk6IEZpeCB2YWx1ZS4KLQkoU0hPUlRfQVIpOiBSZW51bWJlciBzbyB0aGF0IGl0IGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2Ygc2hvcnQKLQlpbnN0cnVjdGlvbnMsIG5vdCB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGxvbmcgaW5zdHJ1Y3Rpb25zLgotCi0yMDAwLTAzLTI2ICBBbGFuIE1vZHJhICA8YWxhbkBsaW51eGNhcmUuY29tPgotCi0JKiBpMzg2Lmg6IChVTklYV0FSRV9DT01QQVQpOiBSZW5hbWUgdG8gU1lTVjM4Nl9DT01QQVQgYXMgdGhlCi0JcHJvYmxlbSBpc24ndCByZWFsbHkgc3BlY2lmaWMgdG8gVW5peHdhcmUuCi0JKE9MREdDQ19DT01QQVQpOiBEZWZpbmUuCi0JKGkzODZfb3B0YWIpOiBJZiAhT0xER0NDX0NPTVBBVCwgZG9uJ3QgaGFuZGxlIGZzdWJwIGV0Yy4gd2l0aAotCWRlc3RpbmF0aW9uICVzdCgwKS4KLQlGaXggbG90cyBvZiBjb21tZW50cy4KLQotMjAwMC0wMy0wMiAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0gICAgICAgICogZDMwdi5oOgotICAgICAgICAoU0hPUlRfQjJyLCBTSE9SVF9CMywgU0hPUlRfQjNyLCBTSE9SVF9CM2IsIFNIT1JUX0IzYnIpOiBVcGRhdGVkLgotICAgICAgICAoU0hPUlRfRDFyLCBTSE9SVF9EMiwgU0hPUlRfRDJyLCBTSE9SVF9EMkJyLCBTSE9SVF9VKTogVXBkYXRlZC4KLSAgICAgICAgKFNIT1JUX0YsIFNIT1JUX0FGLCBTSE9SVF9ULCBTSE9SVF9BNSwgU0hPUlRfQ01QLCBTSE9SVF9DTVBVKTogVXBkYXRlZC4KLSAgICAgICAgKFNIT1JUX0ExLCBTSE9SVF9BQSwgU0hPUlRfUkEsIFNIT1JUX01PRElOQywgU0hPUlRfTU9EREVDKTogVXBkYXRlZC4KLSAgICAgICAgKFNIT1JUX0MxLCBTSE9SVF9DMiwgU0hPUlRfVUYsIFNIT1JUX0EyLCBTSE9SVF9OT05FLCBMT05HKTogVXBkYXRlZC4KLSAgICAgICAgKExPTkdfVSwgTE9OR19VciwgTE9OR19DTVAsIExPTkdfTSwgTE9OR19NMiwgTE9OR18yLCBMT05HXzJyKTogVXBkYXRlZC4KLSAgICAgICAgKExPTkdfMmIsIExPTkdfMmJyLCBMT05HX0QsIExPTkdfRHIsIExPTkdfRGJyKTogVXBkYXRlZC4KLQotMjAwMC0wMi0yNSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKGZpbGQsIGZpc3RwKTogQ2hhbmdlIGludGVsIGRfU3VmIGZvcm0gdG8gZmlsZGQgYW5kCi0JZmlzdHBkIHdpdGhvdXQgc3VmZml4LgotCi0yMDAwLTAyLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5fY3B1X2Rlc2MpOiBSZW5hbWUgZmllbGQgJ2ZsYWdzJyB0bwotICAgICAgICAnc2lnbmVkX292ZXJmbG93X29rX3AnLgotCURlbGV0ZSBwcm90b3R5cGVzIGZvciBjZ2VuX3NldF9mbGFncygpIGFuZCBjZ2VuX2dldF9mbGFncygpLgotCi0yMDAwLTAyLTI0ICBBbmRyZXcgSGFsZXkgIDxhcGhAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0lOU05fTUFDSF9IQVNfUCk6IE5ldyBtYWNyby4KLQkoQ0dFTl9DUFVfVEFCTEUpOiBmbGFnczogbmV3IGZpZWxkLgotCUFkZCBwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zLgotCQotMjAwMC0wMi0yNCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IEFkZCBzb21lIG1vcmUgVU5JWFdBUkVfQ09NUEFUIGNvbW1lbnRzLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIGkzNzAuaDogTmV3IGZpbGUuCi0KLTIwMDAtMDItMjIgIEFuZHJldyBIYWxleSAgPGFwaEBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IChPUENPREVfSVNfTUVNQkVSKTogQWRkIGNvbW1lbnQuCi0KLTE5OTktMTItMzAgIEFuZHJldyBIYWxleSAgPGFwaEBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE9QQ09ERV9JU19NRU1CRVIpOiBBZGQgZ3AzMiBhcmcsIHdoaWNoIGRldGVybWluZXMKLQl3aGV0aGVyIHN5bnRoZXRpYyBvcGNvZGVzIChlLmcuIG1vdmUpIGdlbmVyYXRlIDMyLWJpdCBvciA2NC1iaXQKLQlpbnNucy4KLQotMjAwMC0wMS0xNSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IFF1YWxpZnkgaW50ZWwgbW9kZSBmYXIgY2FsbCBhbmQgam1wIHdpdGggeF9TdWYuCi0KLTE5OTktMTItMjcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBBZGQgSnVtcEFic29sdXRlIHF1YWxpZmllciB0byBhbGwgbm9uLWludGVsIG1vZGUKLQlpbmRpcmVjdCBqdW1wcyBhbmQgY2FsbHMuICBBZGQgRkYvMyBjYWxsIGZvciBpbnRlbCBtb2RlLgotCi1XZWQgRGVjICAxIDAzOjA1OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBBZGQgbmV3IG9wZXJhbmQgdHlwZXMuICBBZGQgbmV3IGluc3RydWN0aW9uIGZvcm1hdHMuCi0KLVdlZCBOb3YgMjQgMjA6Mjg6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBDb3JyZWN0bHkgaGFuZGxlIGltbWVkaWF0ZSBmb3IgUEEyLjAgImJiIgotCWluc3RydWN0aW9uLgotCi0xOTk5LTExLTE4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChJTlNOX0lTQTUpOiBOZXcuCi0KLTE5OTktMTEtMDEgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE9QQ09ERV9JU19NRU1CRVIpOiBOZXcuCi0KLTE5OTktMTAtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoU0hPUlRfQVIpOiBEZWZpbmUuCi0KLTE5OTktMTAtMTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBhbHBoYS5oIChhbHBoYV9udW1fb3Bjb2Rlcyk6IENvbnZlcnQgdG8gdW5zaWduZWQuCi0JKGFscGhhX251bV9vcGVyYW5kcyk6IERpdHRvLgotCi1TdW4gT2N0IDEwIDAxOjQ2OjU2IDE5OTkgIEplcnJ5IFF1aW5uIDxqZXJyeS5xdWlubi5hZHY5MUBhbHVtLmRhcnRtb3V0aC5vcmc+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBBZGQgbG9hZCBhbmQgc3RvcmUgY2FjaGUgY29udHJvbCB0bwotCWluc3RydWN0aW9ucy4gIEFkZCBvcmRlcmVkIGFjY2VzcyBsb2FkIGFuZCBzdG9yZS4KLQotCSogaHBwYS5oIChwYV9vcGNvZGUpOiBBZGQgbmV3IGVudHJpZXMgZm9yIGFkZGIgYW5kIGFkZGliLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBGaXggY21wYiBhbmQgY21waWIgZW50cmllcy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIEFkZCBlbnRyaWVzIGZvciBjbXBiIGFuZCBjbXBpYi4KLQotVGh1IE9jdCAgNyAwMDoxMjoyNSBNRFQgMTk5OQlEaWVnbyBOb3ZpbGxvIDxkbm92aWxsb0BjeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IEFkZCBmbGFnIFJFU1RSSUNURURfTlVNMyBmb3IgaW1tMyBvcGVyYW5kcy4KLQotVGh1IFNlcCAyMyAwNzowODozOCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkICJjYWxsIiBhbmQgInJldCIuICBDbGVhbiB1cCAiYiIsICJidmUiCi0JYW5kICJiZSIgdXNpbmcgY29tcGxldGVyIHByZWZpeGVzLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgaW5pdGlhbGl6ZXJzIHRvIHNpbGVuY2UgY29tcGlsZXIuCi0KLQkqIGhwcGEuaDogVXBkYXRlIGNvbW1lbnRzIGFib3V0IGNoYXJhY3RlciB1c2FnZS4KLQotTW9uIFNlcCAyMCAwMzo1NTozMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEZpeCBtaW5vciB0aGlua29zIGludHJvZHVjZWQgd2hpbGUgY2xlYW5pbmcKLQl1cCB0aGUgbmV3IGZzdHcgJiBidmUgaW5zdHJ1Y3Rpb25zLgotCi1TdW4gU2VwIDE5IDEwOjQwOjU5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIHJlbWFpbmluZyBQQTIuMCBpbnRlZ2VyIGxvYWQvc3RvcmUKLQlpbnN0cnVjdGlvbnMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCByZW1haW5pbmcgUEEyLjAgRlAgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBsb25nIG9mZnNldCBkb3VibGUgd29yZCBsb2FkL3N0b3JlCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgRkxBR19TVFJJQ1QgdmFyaWFudHMgb2YgRlAgbG9hZHMgYW5kCi0Jc3RvcmVzLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBIYW5kbGUgUEEyLjAgZmNudiwgZmNtcCBhbmQgZnRlc3QgaW5zbnMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEZpbmlzaCBzdXBwb3J0IGZvciBQQTIuMCAiYiIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBIYW5kbGUgUEEyLjAgImJ2ZSIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgbmV3IHN5bnRheCAiYmUiIGluc3RydWN0aW9ucy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogTm90ZSB1c2Ugb2YgJ00nIGFuZCAnTCcuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBzdXBwb3J0IGZvciAiYixsIi4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIHN1cHBvcnQgZm9yICJiLGdhdGUiLgotCi1TYXQgU2VwIDE4IDExOjQxOjE2IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogVXNlICdmWCcgZm9yIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQKLQlpbiB4bXB5dS4gIAotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBGaXggbWFzayBmb3IgcHJvYmUgYW5kIHByb2JlaS4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogRml4IG1hc2sgZm9yIGRlcHdpLgotCi1UdWUgU2VwICA3IDEzOjQ0OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkICJhZGRpbCIgdmFyaWFudCB3aGljaCBoYXMgdGhlICVyMSBhcwotCWFuIGV4cGxpY2l0IG91dHB1dCBhcmd1bWVudC4KLQotTW9uIFNlcCAgNiAwNDo0MTo0MiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogQWRkIHN0cmljdCB2YXJpYW50cyBvZiBQQTEuMC9QQTEuMSBsb2FkcyBhbmQgc3RvcmVzLgotCUFkZCBhIGZldyBQQTIuMCBsb2FkcyBhbmQgc3RvcmUgdmFyaWFudHMuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogcGouaDogTmV3IGZpbGUuCi0KLTE5OTktMDgtMjkgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X3JlZ3RhYik6IE1vdmUgJXN0IHRvIHRvcCBvZiB0YWJsZSwgYW5kIHNwbGl0IG9mZgotCW90aGVyIGZwIHJlZyBlbnRyaWVzLgotCShpMzg2X2Zsb2F0X3JlZ3RhYik6IFRvIGhlcmUuCi0KLVNhdCBBdWcgMjggMDA6MjU6MjUgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IFJlcGxhY2UgJ2YnIGJ5ICd2Jy4gIFByZWZpeCBmbG9hdCByZWdpc3RlciBhcmdzCi0JYnkgJ2YnLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgZXh0cmQsIGV4dHJ3LCBkZXBkLCBkZXBkaSwgZGVwdywgZGVwd2kuCi0JQWRkIHN1cHBvcnRpbmcgYXJncy4KLQotCSogaHBwYS5oOiAgRG9jdW1lbnQgbmV3IGNvbXBsZXRlcnMgYW5kIGFyZ3MuCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiAgQWRkIDY0IGJpdCBwYXR0ZXJucyBhbmQgcGEyLjAgc3ludGF4IGZvciB1eG9yLAotCXVhZGRjbSwgZGNvciwgYWRkaSwgYWRkLCBzdWIsIHN1YmksIHNobGFkZCwgcmZpLCBhbmQgcHJvYmUuICBBZGQgcGEyLjAKLQlleHRlbnNpb25zIGZvciBzc20sIHJzbSwgcGR0bGIsIHBpdGxiLiAgQWRkIHBlcmZvcm1hbmNlIGluc3RydWN0aW9ucwotCXBtZW5iIGFuZCBwbWRpcy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIEFkZCBwYTIuMCBpbnN0cnVjdGlvbnMgaGFkZCwgaHNobCwKLQloc2hyLCBoc3ViLCBtaXhoLCBtaXh3LCBwZXJtaC4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQ2hhbmdlIGNvbXBsZXRlcnMgaW4gaW5zdHJ1Y3Rpb25zIHRvCi0JdXNlICdjJyBwcmVmaXguCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBBZGQgcG9wYnRzLCBuZXcgZm9ybXMgb2YgYmIsIGhhdmcsCi0JaHNobGFkZCwgaHNocmFkZCwgc2hycGQsIGFuZCBzaHJwdyBpbnN0cnVjdGlvbnMuICBVcGRhdGUgYXJnIGNvbW1lbnRzLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiAgQ2hhbmdlIGZtcHlmYWRkLCBmbXB5bmZhZGQsIGZuZWcsCi0JZm5lZ2FicyB0byB1c2UgJ0knIGluc3RlYWQgb2YgJ0YnLgotCi0xOTk5LTA4LTIxICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogQWRkIEFNRCBhdGhsb24gaW5zdHJ1Y3Rpb25zLCBwZm5hY2MsIHBmcG5hY2MsIHBzd2FwZC4KLQlEb2N1bWVudCBwZjJpdyBhbmQgcGkyZncgYXMgYXRobG9uIGluc25zLiAgUmVtb3ZlIHBzd2Fwdy4KLQlBbHBoYWJldGljYWxseSBzb3J0IFBJSUkgaW5zbnMuCi0KLVdlZCBBdWcgMTggMTg6MTQ6NDAgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0lOU05fTUFDSF9IQVNfUCk6IE5ldyBtYWNyby4KLQotRnJpIEF1ZyAgNiAwOTo0NjozNSAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIDY0IGJpdCB2ZXJzaW9ucyBvZiBvciwgeG9yLCBhbmQsCi0JYW5kIGFuZGNtLiAgQWRkIDMyIGFuZCA2NCBiaXQgdmVyc2lvbiBvZiBjbXBjbHIsIGNtcGljbHIuCi0KLQkqIGhwcGEuaDogIERvY3VtZW50IDY0IGJpdCBjb25kaXRpb24gY29tcGxldGVycy4KLQotVGh1IEF1ZyAgNSAxNjo1NjowNyAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQ2hhbmdlIGNvbmRpdGlvbiBhcmdzIHRvIHVzZSAnPycgcHJlZml4LgotCi0xOTk5LTA4LTA0ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZCBEZWZhdWx0U2l6ZSBtb2RpZmllciB0byBhbGwgaW5zbnMKLQl0aGF0IGltcGxpY2l0bHkgbW9kaWZ5ICVlc3AuICAjdW5kZWYgZF9TdWYsIHhfc3VmLCBzbGRfc3VmLAotCXNsZHhfc3VmLCBid2xkX1N1ZiwgZF9GUCwgeF9GUCwgc2xkX0ZQLCBzbGR4X0ZQIGF0IGVuZCBvZiB0YWJsZS4KLQotV2VkIEp1bCAyOCAwMjowNDoyNCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQkJCSAgSmVmZiBMYXcgPGxhd0BjeWdudXMuY29tPgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgInB1c2hub20iIGFuZCAicHVzaGJ0cyIuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IE1hcmsgYWxsIFBBMi4wIG9wY29kZXMgd2l0aCBGTEFHX1NUUklDVC4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIENoYW5nZSB4bXB5dSwgZm1weWZhZGQsIAotCWFuZCBmbXB5bmZhZGQgdG8gdXNlICdKJyBhbmQgJ0snIGluc3RlYWQgb2YgJ0UnIGFuZCAnWCcuCi0KLTE5OTktMDctMTMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBBZGQgInVuZG9jdW1lbnRlZCIgQU1EIDNETm93ISBwZjJpdywgcGkyZncsIHBzd2FwdyBpbnNucy4KLQotVGh1IEp1bCAgMSAwMDoxNzoyNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoc3RydWN0IHBhX29wY29kZSk6IEFkZCBuZXcgZmllbGQgImZsYWdzIi4KLQkoRkxBR1NfU1RSSUNUKTogRGVmaW5lLgotCi1GcmkgSnVuIDI1IDA0OjIyOjA0IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCQkJICBKZWZmIExhdyA8bGF3QGN5Z251cy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBwYTIuMCBjbHJidHMgaW5zdHJ1Y3Rpb24uCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBlbnRyaWVzIGZvciBtZmlhIGFuZCBtdHNhcmNtIGluc3RydWN0aW9ucy4KLQotMTk5OS0wNi0yMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IEFsbG93IGBsJyBzdWZmaXggb24gYnN3YXAuICBBbGxvdyBgdycgc3VmZml4IG9uIGFycGwsCi0JbGxkdCwgbG1zdywgbHRyLCBzdHIsIHZlcnIsIHZlcncuICBBZGQgRlAgZmxhZyB0byBmY21vdiouICBBZGQgRlAKLQlmbGFnIHRvIGZjb21pIGFuZCBmcmllbmRzLgotCi1GcmkgTWF5IDI4IDE1OjI2OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogTW92ZSBpbnRlZ2VyIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zIGFmdGVyCi0JaW50ZWdlciBsb2dpY2FsIGluc3RydWN0aW9ucy4gIAotCi0xOTk5LTA1LTI4ICBMaW51cyBOb3JkYmVyZyAgPGxpbnVzLm5vcmRiZXJnQGNhbml0LnNlPgotCi0JKiBtNjhrLmg6IERvY3VtZW50IG5ldyBmb3JtYXRzIGBFJywgYEcnLCBgSCcgYW5kIG5ldyBwbGFjZXMgYE4nLAotCWBuJywgYG8nLgotCi0JKiBtNjhrLmg6IERlZmluZSBtY2Y1MjA2ZSwgbWNmNTMwNywgbWNmLiAgRG9jdW1lbnQgbmV3IGZvcm1hdCBgdScKLQlhbmQgbmV3IHBsYWNlcyBgbScsIGBNJywgYGgnLgotCi1UaHUgTWF5IDI3IDA0OjEzOjU0IDE5OTkgIEpvZWwgU2hlcnJpbGwgKGpvZWxAT0FSY29ycC5jb20KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIHNldmVyYWwgcHJvY2Vzc29yIHNwZWNpZmljIHN5c3RlbQotCWluc3RydWN0aW9ucy4KLQotV2VkIE1heSAyNiAxNjo1Nzo0NCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBzZWNvbmQgZW50cnkgZm9yICJjb21iIiwgImNvbWliIiwgCi0JImFkZGIiLCBhbmQgImFkZGliIiB0byBiZSB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuCi0KLTE5OTktMDUtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQGFwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChSZXZlcnNlTW9kcm0pOiBSZW1vdmUgYWxsIG9jY3VyZW5jZXMuCi0JKEludk1lbSk6IEFkZCB0byBjb250cm9sL2RlYnVnL3Rlc3QgbW92IGluc25zLCBtb3ZobHBzLCBtb3ZsaHBzLAotCW1vdm1za3BzLCBwZXh0cncsIHBtb3Ztc2tiLCBtYXNrbW92cS4KLQlDaGFuZ2UgTm9TdWYgdG8gRlAgb24gYWxsIE1NWCwgWE1NIGFuZCBBTUQgaW5zbnMgYXMgdGhlc2UgYWxsCi0JaWdub3JlIHRoZSBkYXRhIHNpemUgcHJlZml4LgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIsIGkzODZfcmVndGFiKTogQWRkIHN1cHBvcnQgZm9yIFBJSUkgU0lNRC4KLQlNb3N0bHkgc3RvbGVuIGZyb20gRG91ZyBMZWRmb3JkIDxkbGVkZm9yZEByZWRoYXQuY29tPgotCi1TYXQgTWF5ICA4IDIzOjI3OjM1IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChQUENfT1BDT0RFXzY0X0JSSURHRSk6IE5ldy4KLQotMTk5OS0wNC0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQVRUUik6IERlbGV0ZSBtZW1iZXIgbnVtX25vbmJvb2xzLgotCShDR0VOX0FUVFJfVFlQRSk6IFVwZGF0ZS4KLQkoQ0dFTl9BVFRSX01BU0spOiBOdW1iZXIgYm9vbGVhbnMgc3RhcnRpbmcgYXQgMC4KLQkoQ0dFTl9BVFRSX1ZBTFVFKTogVXBkYXRlLgotCShDR0VOX0lOU05fQVRUUik6IFVwZGF0ZS4KLQotTW9uIEFwciAxMiAyMzo0MzoyNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoZm1weWZhZGQsIGZtcHluZmFkZCwgZm5lZywgZm5lZ2Ficyk6IE5ldyBQQTIuMAotCWluc3RydWN0aW9ucy4KLQotVHVlIE1hciAyMyAxMToyNDozOCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoYmIsIGJ2Yik6IFR3ZWFrIG9wY29kZS9tYXNrLgotCi0KLTE5OTktMDMtMjIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0lTQSxDR0VOX01BQ0gpOiBOZXcgdHlwZWRlZnMuCi0JKHN0cnVjdCBjZ2VuX2NwdV9kZXNjKTogUmVuYW1lIG1lbWJlciBtYWNoIHRvIG1hY2hzLiAgTmV3IG1lbWJlciBpc2FzLgotCU5ldyBtZW1iZXJzIHdvcmRfYml0c2l6ZSxkZWZhdWx0X2luc25fYml0c2l6ZSxiYXNlX2luc24tYml0c2l6ZSwKLQltaW5faW5zbl9iaXRzaXplLG1heF9pbnNuX2JpdHNpemUsaXNhX3RhYmxlLG1hY2hfdGFibGUscmVidWlsZF90YWJsZXMuCi0JRGVsZXRlIG1lbWJlciBtYXhfaW5zbl9zaXplLgotCShlbnVtIGNnZW5fY3B1X29wZW5fYXJnKTogTmV3IGVudW0uCi0JKGNwdV9vcGVuKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoY3B1X29wZW5fMSk6IERlY2xhcmUuCi0JKGNnZW5fc2V0X2NwdSk6IERlbGV0ZS4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fSFdfVEFCTEUpOiBEZWxldGUgYG51bV9pbml0X2VudHJpZXMnIG1lbWJlci4KLQkoQ0dFTl9PUEVSQU5EX05JTCk6IE5ldyBtYWNyby4KLQkoQ0dFTl9PUEVSQU5EKTogTmV3IG1lbWJlciBgdHlwZScuCi0JKEBhcmNoQF9jZ2VuX29wZXJhbmRfdGFibGUpOiBEZWxldGUgZGVjbC4KLQkoQ0dFTl9PUEVSQU5EX0lOREVYLENHRU5fT1BFUkFORF9UWVBFLENHRU5fT1BFUkFORF9FTlRSWSk6IERlbGV0ZS4KLQkoQ0dFTl9PUEVSQU5EX1RBQkxFKTogTmV3IHN0cnVjdC4KLQkoY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9uYW1lLGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtKTogRGVjbGFyZS4KLQkoQ0dFTl9PUElOU1QpOiBQb2ludGVyIHRvIG9wZXJhbmQgdGFibGUgZW50cnkgcmVwbGFjZWQgd2l0aCBlbnVtLgotCShDR0VOX0NQVV9UQUJMRSk6IE5ldyBtZW1iZXIgYGlzYScuICBDaGFuZ2UgbWVtYmVyIGBvcGVyYW5kX3RhYmxlJywKLQlub3cgYSBDR0VOX09QRVJBTkRfVEFCTEUuICBBZGQgQ0dFTl9DUFVfREVTQyBhcmcgdG8KLQl7Z2V0LHNldH1fe2ludCx2bWF9X29wZXJhbmQuCi0JKEBhcmNoQF9jZ2VuX2NwdV9vcGVuKTogTmV3IGFyZyBgaXNhJy4KLQkoY2dlbl9zZXRfY3B1KTogRGl0dG8uCi0KLUZyaSBGZWIgMjYgMDI6MzY6NDUgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBGaWxsIGluIGNtb3YgYW5kIGZjbW92IGFsdGVybmF0ZXMuICBBZGQgZmNvbWkgc2hvcnQgZm9ybXMuCi0KLTE5OTktMDItMjUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChlbnVtIGNnZW5fYXNtX3R5cGUpOiBBZGQgQ0dFTl9BU01fTk9ORS4KLQkoQ0dFTl9IV19FTlRSWSk6IERlbGV0ZSBtZW1iZXIgYG5leHQnLiAgQ2hhbmdlIHR5cGUgb2YgYHR5cGUnIHRvCi0JZW51bSBjZ2VuX2h3X3R5cGUuCi0JKENHRU5fSFdfVEFCTEUpOiBOZXcgc3RydWN0LgotCShod190YWJsZSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkoQ0dFTl9PUEVSQU5EKTogQ2hhbmdlIG1lbWJlciBodyB0byBod190eXBlLCBjaGFuZ2UgdHlwZSBmcm9tIHBvaW50ZXIKLQl0byB0YWJsZSBlbnRyeSB0byBlbnVtLgotCShDR0VOX09QSU5TVCk6IERpdHRvLgotCShDR0VOX0NQVV9UQUJMRSk6IENoYW5nZSBtZW1iZXIgaHdfbGlzdCB0byBod190YWJsZS4KLQotU2F0IEZlYiAxMyAxNDoxMzo0NCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS5oIChBWFBfT1BDT0RFX0VWNik6IE5ldy4KLQkoQVhQX09QQ09ERV9OT1BBTCk6IEluY2x1ZGUgaXQuCi0KLTE5OTktMDItMDkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0NQVV9ERVNDKTogUmVuYW1lZCBmcm9tIENHRU5fT1BDT0RFX0RFU0MuCi0JQWxsIHVzZXMgdXBkYXRlZC4gIE5ldyBtZW1iZXJzIGludF9pbnNuX3AsIG1heF9pbnNuX3NpemUsCi0JcGFyc2Vfb3BlcmFuZCxpbnNlcnRfb3BlcmFuZCxleHRyYWN0X29wZXJhbmQscHJpbnRfb3BlcmFuZCwKLQlzaXplb2ZfZmllbGRzLHNldF9maWVsZHNfYml0c2l6ZSxnZXRfaW50X29wZXJhbmQsc2V0X2ludF9vcGVyYW5kLAotCWdldF92bWFfb3BlcmFuZCxzZXRfdm1hX29wZXJhbmQscGFyc2VfaGFuZGxlcnMsaW5zZXJ0X2hhbmRsZXJzLAotCWV4dHJhY3RfaGFuZGxlcnMscHJpbnRfaGFuZGxlcnMuCi0JKENHRU5fQVRUUik6IENoYW5nZSB0eXBlIG9mIG51bV9ub25ib29scyB0byB1bnNpZ25lZCBpbnQuCi0JKENHRU5fQVRUUl9CT09MX09GRlNFVCk6IE5ldyBtYWNyby4KLQkoQ0dFTl9BVFRSX01BU0spOiBTdWJ0cmFjdCBpdCB0byBjb21wdXRlIGJpdCBudW1iZXIuCi0JKENHRU5fQVRUUl9WQUxVRSk6IFJlZG8gYm9vbC9ub25ib29sIGF0dHIgY2FsY3VsYXRpb24uCi0JKGNnZW5fb3Bjb2RlX2hhbmRsZXIpOiBSZW5hbWVkIGZyb20gY2dlbl9iYXNlLgotCShDR0VOX0hXX0FUVFJfVkFMVUUpOiBSZW5hbWVkIGZyb20gQ0dFTl9IV19BVFRSLCBhbGwgdXNlcyB1cGRhdGVkLgotCShDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSk6IFJlbmFtZWQgZnJvbSBDR0VOX09QRVJBTkRfQVRUUiwKLQlhbGwgdXNlcyB1cGRhdGVkLgotCShDR0VOX09QRVJBTkRfSU5ERVgpOiBSZXdyaXRlIHRvIHVzZSB0YWJsZSBlbnRyeSwgbm90IGdsb2JhbC4KLQkoZW51bSBjZ2VuX29waW5zdF90eXBlKTogUmVuYW1lZCBmcm9tIGNnZW5fb3BlcmFuZF9pbnN0YW5jZV90eXBlLgotCShDR0VOX0lGTERfQVRUUl9WQUxVRSk6IFJlbmFtZWQgZnJvbSBDR0VOX0lGTERfQVRUUiwgYWxsIHVzZXMgdXBkYXRlZC4KLQkoQ0dFTl9PUENPREUsQ0dFTl9JQkFTRSk6IE5ldyB0eXBlcy4KLQkoQ0dFTl9JTlNOKTogUmV3cml0ZS4KLQkoQ0dFTl97QVNNLERJU31fSEFTSCopOiBEZWxldGUuCi0JKGluaXRfb3Bjb2RlX3RhYmxlLGluaXRfaWJsZF90YWJsZSk6IERlY2xhcmUuCi0JKENHRU5fSU5TTl9BVFRSKTogTmV3IHR5cGUuCi0KLU1vbiBGZWIgIDEgMjE6MDk6MTQgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogaTM4Ni5oIChkX1N1ZiwgeF9TdWYsIHNsZF9TdWYsIHNsZHhfU3VmLCBid2xkX1N1Zik6ICBEZWZpbmUuCi0gICAgICAgICh4X0ZQLCBkX0ZQLCBkbHNfRlAsIHNsZHhfRlApOiAgRGVmaW5lLgotICAgICAgICBDaGFuZ2UgKlN1ZiBkZWZpbml0aW9ucyB0byBpbmNsdWRlIHggYW5kIGQgc3VmZml4ZXMuCi0gICAgICAgIChtb3ZzeCk6ICBVc2Ugd19TdWYgYW5kIGJfU3VmLgotICAgICAgICAobW92engpOiAgTGlrZXdpc2UuCi0gICAgICAgIChtb3ZzKTogIFVzZSBid2xkX1N1Zi4KLSAgICAgICAgKGZsZCk6ICBDaGFuZ2Ugb3JkZXJpbmcuICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZmlsZCk6ICBBZGQgSW50ZWwgU3ludGF4IGVxdWl2YWxlbnQgb2YgZmlsZHEuCi0gICAgICAgIChmc3QpOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZpc3QpOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZzdHApOiAgVXNlIHNsZF9GUC4gIEFkZCB4X0ZQIHZlcnNpb24uCi0gICAgICAgIChmaXN0cCk6ICBMTG9uZ01lbSB2ZXJzaW9uIGZvciBJbnRlbCBTeW50YXguCi0gICAgICAgIChmY29tLCBmY29tcCk6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZmFkZCwgZmlhZGQsIGZzdWIpOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZzdWJyKTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmbXVsLCBmaW11bCwgZmR2aSwgZmlkaXYsIGZkaXZyKTogIFVzZSBzbGRfRlAuCi0KLTE5OTktMDEtMjcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChlbnVtIGNnZW5fbW9kZSk6IEFkZCBDR0VOX01PREVfVEFSR0VUX01BWCwgQ0dFTl9NT0RFX0lOVCwKLQlDR0VOX01PREVfVUlOVC4KLQotU2F0IEphbiAxNiAwMToyOToyNSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoYnYpOiBGaXggbWFzay4KLQotMTk5OS0wMS0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQVRUUl9WQUxVRV9UWVBFKTogTmV3IHR5cGVkZWYuCi0JKENHRU5fQVRUUik6IFVzZSBpdC4KLQkoQ0dFTl9BVFRSX1RZUEUsQ0dFTl9BVFRSX0VOVFJZKTogRGl0dG8uCi0JKENHRU5fQVRUUl9UQUJMRSk6IE5ldyBtZW1iZXIgZGZhdWx0LgotCi0xOTk4LTEyLTMwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChNSVBTMTZfSU5TTl9CUkFOQ0gpOiBOZXcuCi0KLVdlZCBEZWMgIDkgMTA6Mzg6NDggMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGlzIHBhcnQgb2YgYSBjaGFuZ2UgbWFkZSBieSBFZGl0aCBFcHN0ZWluCi0gCTxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gbWVyZ2UgaW4KLSAJY2hhbmdlcyBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGhwcGEuaCAoY29tcGxldGVyX2NoYXJzKTogbGlzdCBvZiBjaGFycyB0byBub3QgcHV0IGEgc3BhY2UKLSAJYWZ0ZXIuCi0KLVN1biBEZWMgIDYgMTM6MjE6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBQZXJtaXQgdyBzdWZmaXggb24gcHJvY2Vzc29yIGNvbnRyb2wgYW5kCi0gCXN0YXR1cyB3b3JkIGluc3RydWN0aW9ucy4KLQotMTk5OC0xMS0zMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKHN0cnVjdCBjZ2VuX2h3X2VudHJ5KTogRGVsZXRlIGNvbnN0IG9uIGF0dHJzIG1lbWJlci4KLQkoc3RydWN0IGNnZW5fa2V5d29yZF9lbnRyeSk6IERpdHRvLgotCShzdHJ1Y3QgY2dlbl9vcGVyYW5kKTogRGl0dG8uCi0JKENHRU5fSUZMRCk6IE5ldyB0eXBlZGVmLCB3aXRoIGFzc29jaWF0ZWQgYWNjZXNzIG1hY3Jvcy4KLQkoQ0dFTl9JRk1UKTogTmV3IHR5cGVkZWYsIHdpdGggYXNzb2NpYXRlZCBhY2Nlc3MgbWFjcm9zLgotCShDR0VOX0lGTVQpOiBSZW5hbWVkIGZyb20gQ0dFTl9GT1JNQVQuICBOZXcgbWVtYmVyIGBpZmxkcycuCi0JKENHRU5fSVZBTFVFKTogTmV3IHR5cGVkZWYuCi0JKHN0cnVjdCBjZ2VuX2luc24pOiBEZWxldGUgY29uc3Qgb24gc3ludGF4LGF0dHJzIG1lbWJlcnMuCi0JYGZvcm1hdCcgbm93IHBvaW50cyB0byBmb3JtYXQgZGF0YS4gIFR5cGUgb2YgYHZhbHVlJyBpcyBub3cKLQlDR0VOX0lWQUxVRS4KLQkoc3RydWN0IGNnZW5fb3Bjb2RlX3RhYmxlKTogTmV3IG1lbWJlciBpZmxkX3RhYmxlLgotCi0xOTk4LTExLTE4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9leHRyYWN0X2ZuKTogVXBkYXRlIHR5cGUgb2YgYGJhc2VfaW5zbicgYXJnLgotCShDR0VOX09QRVJBTkRfSU5TVEFOQ0UpOiBOZXcgbWVtYmVyIGBhdHRycycuCi0JKENHRU5fT1BFUkFORF9JTlNUQU5DRV97QVRUUlMsQVRUUn0pOiBOZXcgbWFjcm9zLgotCShjZ2VuX2Rpc19sb29rdXBfaW5zbik6IFVwZGF0ZSB0eXBlIG9mIGBiYXNlX2luc24nIGFyZy4KLQkoY2dlbl9vcGNvZGVfdGFibGUpOiBVcGRhdGUgdHlwZSBvZiBkaXNfaGFzaCBmbi4KLQkoZXh0cmFjdF9vcGVyYW5kKTogVXBkYXRlIHR5cGUgb2YgYGluc25fdmFsdWUnIGFyZy4KLQotVGh1IE9jdCAyOSAxMTozODozNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fVkVSU0lPTl97TUFKT1IsTUlOT1IsRklYTEVWRUx9KTogRGVsZXRlLgotCi1UdWUgT2N0IDI3IDA4OjU3OjU5IDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKElOU05fTVVMVCk6IEFkZGVkLgotCi1UdWUgT2N0IDIwIDExOjMxOjM0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChNQVhfTU5FTV9TSVpFKTogUmVuYW1lIGZyb20gTUFYX09QQ09ERV9TSVpFLgotCi1Nb24gT2N0IDE5IDEyOjUwOjAwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fSU5TTl9JTlQpOiBOZXcgdHlwZWRlZi4KLQkoQ0dFTl9JTlRfSU5TTl9QKTogUmVuYW1lZCBmcm9tIENHRU5fSU5UX0lOU04uCi0JKENHRU5fSU5TTl9CWVRFUyk6IFJlbmFtZWQgZnJvbSBjZ2VuX2luc25fdC4KLQkoQ0dFTl9JTlNOX0JZVEVTX1BUUik6IE5ldyB0eXBlZGVmLgotCShDR0VOX0VYVFJBQ1RfSU5GTyk6IE5ldyB0eXBlZGVmLgotCShjZ2VuX2luc2VydF9mbixjZ2VuX2V4dHJhY3RfZm4pOiBVcGRhdGUuCi0JKGNnZW5fb3Bjb2RlX3RhYmxlKTogTmV3IG1lbWJlciBgaW5zbl9lbmRpYW4nLgotCShhc3NlbWJsZV9pbnNuLGxvb2t1cF9pbnNuLGxvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyk6IFVwZGF0ZS4KLQkoaW5zZXJ0X29wZXJhbmQsZXh0cmFjdF9vcGVyYW5kKTogVXBkYXRlLgotCShjZ2VuX2dldF9pbnNuX3ZhbHVlLGNnZW5fcHV0X2luc25fdmFsdWUpOiBBZGQgcHJvdG90eXBlcy4KLQotRnJpIE9jdCAgOSAxMzozODoxMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0FUVFJfQk9PTFMpOiBOZXcgbWFjcm8uCi0JKHN0cnVjdCBDR0VOX0hXX0VOVFJZKTogTmV3IG1lbWJlciBgYXR0cnMnLgotCShDR0VOX0hXX0FUVFIpOiBOZXcgbWFjcm8uCi0JKHN0cnVjdCBDR0VOX09QRVJBTkRfSU5TVEFOQ0UpOiBOZXcgbWVtYmVyIGBuYW1lJy4KLQkoQ0dFTl9JTlNOX0lOVkFMSURfUCk6IE5ldyBtYWNyby4KLQotTW9uIE9jdCAgNSAwMDoyMTowNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogQWRkICJmaWQiLgotCQotU3VuIE9jdCAgNCAyMTowMDowMCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQlGcm9tIFJvYmVydCBBbmRyZXcgRGFsZSA8cm9iQG5iLm5ldD4KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZCBBTUQgM0ROb3chIGluc3RydWN0aW9ucy4KLQkoQU1EXzNETk9XX09QQ09ERSk6IERlZmluZS4KLQotVHVlIFNlcCAyMiAxNzo1Mzo0NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKEVJVEhFUl9CVVRfUFJFRkVSX01VKTogRGVmaW5lLgotCi1Nb24gQXVnIDEwIDE0OjA5OjM4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9pbnNuKTogI2lmIDAgb3V0IGVsZW1lbnQgYGNkeCcuCi0KLU1vbiBBdWcgIDMgMTI6MjE6NTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQlNb3ZlIGFsbCBnbG9iYWwgc3RhdGUgZGF0YSBpbnRvIG9wY29kZSB0YWJsZSBzdHJ1Y3QsIGFuZCB0cmVhdAotCW9wY29kZSB0YWJsZSBhcyBzb21ldGhpbmcgdGhhdCBpcyAib3BlbmVkL2Nsb3NlZCIuCi0JKiBjZ2VuLmggKENHRU5fT1BDT0RFX0RFU0MpOiBOZXcgdHlwZS4KLQkoYWxsIGZucyk6IE5ldyBmaXJzdCBhcmcgb2Ygb3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IuCi0JKGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4pOiBBZGQgcHJvdG90eXBlLgotCShjZ2VuX2N1cnJlbnRfbWFjaGluZSxjZ2VuX2N1cnJlbnRfZW5kaWFuKTogRGVsZXRlLgotCShDR0VOX09QQ09ERV9UQUJMRSk6IE5ldyBtZW1iZXJzIG1hY2gsZW5kaWFuLG9wZXJhbmRfdGFibGUsCi0JcGFyc2Vfb3BlcmFuZF9mbixhc21faGFzaF90YWJsZSxhc21faGFzaF90YWJsZV9lbnRyaWVzLAotCWRpc19oYXNoX3RhYmxlLGRpc19oYXNoX3RhYmxlX2VudHJpZXMuCi0JKG9wY29kZV9vcGVuLG9wY29kZV9jbG9zZSk6IEFkZCBwcm90b3R5cGVzLgotCi0JKiBjZ2VuLmggKGNnZW5faW5zbik6IE5ldyBlbGVtZW50IGBjZHgnLgotCi1UaHUgSnVsIDMwIDIxOjQ0OjI1IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoRkxBR19MS1IpOiBOZXcgZmxhZyBmb3IgImxlZnQta2lsbHMtcmlnaHQiIGluc3RydWN0aW9ucy4KLQotVHVlIEp1bCAyOCAxMDo1OTowNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaDogQWRkICJub19tYXRjaF9vcGVyYW5kcyIgZmllbGQgZm9yIGluc3RydWN0aW9ucy4KLQkoTU4xMDMwMF9NQVhfT1BFUkFORFMpOiBEZWZpbmUuCi0KLUZyaSBKdWwgMjQgMTE6NDQ6MjQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX21hY3JvX2luc25fY291bnQpOiBEZWNsYXJlLgotCi1UdWUgSnVsIDIxIDEzOjEyOjEzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fVkVSU0lPTl97TUFKT1IsTUlOT1IsRklYTEVWRUx9KTogRGVmaW5lLgotCShjZ2VuX2luc2VydF9mbixjZ2VuX2V4dHJhY3RfZm4pOiBOZXcgYXJnIGBwYycuCi0JKGdldF9vcGVyYW5kLHB1dF9vcGVyYW5kKTogUmVwbGFjZWQgd2l0aCBnZXRfe2ludCx2bWF9X29wZXJhbmQsCi0Jc2V0X3tpbnQsdm1hfV9vcGVyYW5kLgotCi1GcmkgSnVuIDI2IDExOjA5OjA2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBBZGQgIm1hY2hpbmUiIGZpZWxkIGZvciBpbnN0cnVjdGlvbnMuCi0JKE1OMTAzLCBBTTMwKTogRGVmaW5lIG1hY2hpbmUgdHlwZXMuCi0JCi1GcmkgSnVuIDE5IDE2OjA5OjA5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBVc2UgRlAsIG5vdCBzbF9TdWYsIGZvciBmeHNhdmUgYW5kIGZ4cnN0b3IuCi0KLTE5OTgtMDYtMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEFkZCBzdXBwb3J0IGZvciBmeHNhdmUsIGZ4cnN0b3IsIHN5c2VudGVyIGFuZCBzeXNleGl0LgotCi1TYXQgSnVuIDEzIDExOjMxOjM1IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWRkIGdlbmVyYWwgZm9ybSBvZiBhYWQgYW5kIGFhbS4gIEFkZCB1ZDJhCi0JYW5kIHVkMmIuCi0JKGkzODZfcmVndGFiKTogQWxsb3cgY3IwLi43LCBkYjAuLjcsIGRyMC4uNywgdHIwLi43LCBub3QganVzdAotCXRob3NlIHRoYXQgaGFwcGVuIHRvIGJlIGltcGxlbWVudGVkIG9uIHBlbnRpdW1zLgotCi1UdWUgSnVuICA5IDEyOjE2OjAxIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBDaGFuZ2Ugb2NjdXJlbmNlcyBvZiBEYXRhMTYgdG8gU2l6ZTE2LCBEYXRhMzIgdG8gU2l6ZTMyLAotCUlnbm9yZURhdGFTaXplIHRvIElnbm9yZVNpemUuICBGbGFnIGFkZHJlc3MgYW5kIGRhdGEgc2l6ZSBwcmVmaXhlcwotCXdpdGggU2l6ZTE2fElnbm9yZVNpemUgb3IgU2l6ZTMyfElnbm9yZVNpemUuCi0KLU1vbiBKdW4gIDggMTI6MTU6NTIgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKFJFUE5FKTogUmVuYW1lIHRvIFJFUE5FX1BSRUZJWF9PUENPREUuCi0JKFJFUEUpOiBSZW5hbWUgdG8gUkVQRV9QUkVGSVhfT1BDT0RFLgotCShpMzg2X3JlZ3RhYl9lbmQpOiBSZW1vdmUuCi0JKGkzODZfcHJlZml4dGFiLCBpMzg2X3ByZWZpeHRhYl9lbmQpOiBSZW1vdmUuCi0JKGkzODZfb3B0YWIpOiBVc2UgTlVMTCBhcyBzZW50aW5lbCByYXRoZXIgdGhhbiAiIiB0byBzdWl0IHJld3JpdGUKLQlvZiBtZF9iZWdpbi4KLQkoTUFYX09QQ09ERV9TSVpFKTogRGVmaW5lLgotCShpMzg2X29wdGFiX2VuZCk6IFJlbW92ZS4KLQkoc2xfU3VmKTogRGVmaW5lLgotCShzbF9GUCk6IFVzZSBzbF9TdWYuCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFsbG93IDE2IGJpdCBkaXNwbGFjZW1lbnQgZm9yIGBtb3YKLQltZW0sYWNjJy4gIENvbWJpbmUgMTYgYW5kIDMyIGJpdCBmb3JtcyBvZiB2YXJpb3VzIGluc25zLiAgQWxsb3cgMTYKLQliaXQgZm9ybSBvZiBsam1wLiAgQWRkIElzUHJlZml4IG1vZGlmaWVyIHRvIHByZWZpeGVzLiAgQWRkIGFkZHIzMiwKLQlkYXRhMzIsIGR3b3JkLCBhbmQgYWR3b3JkIHByZWZpeGVzLgotCShpMzg2X3JlZ3RhYik6IEFkZCBCYXNlSW5kZXggbW9kaWZpZXIgdG8gdmFsaWQgMTYgYml0IGJhc2UvaW5kZXgKLQlyZWdzLgotCi1GcmkgSnVuICA1IDIzOjQyOjQzIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X3JlZ3RhYik6IFJlbW92ZSBCYXNlSW5kZXggbW9kaWZpZXIgZnJvbSBlc3AuCi0KLQkqIGkzODYuaDogQWxsb3cgYGwnIHN1ZmZpeCBvbiBmbGQsIGZzdCwgZnN0cCwgZmNvbSwgZmNvbXAgd2l0aAotCXJlZ2lzdGVyIG9wZXJhbmRzLCBiZWNhdXNlIHRoaXMgaXMgYSBjb21tb24gaWRpb20uICBGbGFnIHRoZW0gd2l0aAotCWEgd2FybmluZy4gIEFsbG93IGlsbGVnYWwgZmFkZHAsIGZzdWJwLCBmc3VicnAsIGZtdWxwLCBmZGl2cCwKLQlmZGl2cnAgYmVjYXVzZSBnY2MgZXJyb25lb3VzbHkgZ2VuZXJhdGVzIHRoZW0uICBBbHNvIGZsYWcgd2l0aCBhCi0Jd2FybmluZy4KLQotCSogaTM4Ni5oOiBBZGQgc3VmZml4IG1vZGlmaWVycyB0byBtb3N0IGluc25zLCBhbmQgdGlnaHRlciBvcGVyYW5kCi0JY2hlY2tzIGluIHNvbWUgY2FzZXMuICBGaXggYSBudW1iZXIgb2YgVW5peFdhcmUgY29tcGF0aWJpbGl0eQotCWlzc3VlcyB3aXRoIGZsb2F0IGluc25zLiAgTWVyZ2Ugc29tZSBmbG9hdGluZyBwb2ludCBvcGNvZGVzLCB1c2luZwotCW5ldyBGbG9hdE1GIG1vZGlmaWVyLgotCShXT1JEX1BSRUZJWF9PUENPREUpOiBSZW5hbWUgdG8gREFUQV9QUkVGSVhfT1BDT0RFIGZvcgotCWNvbnNpc3RlbmN5LgotCi0JKiBpMzg2Lmg6IENoYW5nZSBvY2N1cmVuY2Ugb2YgU2hvcnRmb3JtVyB0byBXfFNob3J0Rm9ybS4gIEFkZAotCUlnbm9yZURhdGFTaXplIHdoZXJlIGFwcHJvcHJpYXRlLgotCi1XZWQgSnVuICAzIDE4OjI4OjQ1IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiAob25lX2J5dGVfc2VnbWVudF9kZWZhdWx0cyk6IFJlbW92ZS4KLQkodHdvX2J5dGVfc2VnbWVudF9kZWZhdWx0cyk6IFJlbW92ZS4KLQkoaTM4Nl9yZWd0YWIpOiBBZGQgQmFzZUluZGV4IHRvIDMyIGJpdCByZWdzIHJlZ190eXBlLgotCi1GcmkgTWF5IDE1IDE1OjU5OjA0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5faHdfbG9va3VwX2J5X25hbWUpOiBSZW5hbWVkIGZyb20gY2dlbl9od19sb29rdXAuCi0JKGNnZW5faHdfbG9va3VwX2J5X251bSk6IERlY2xhcmUuCi0KLVRodSBNYXkgIDcgMDk6Mjc6NTggMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChPUF97U0gsTUFTS31fQ09ERTIpOiBBZGRlZCAicSIgb3BlcmFuZCBmb3JtYXQgZm9yIGxvd2VyCi0JdGVuIGJpdHMgb2YgTUlQUyBJU0ExICJicmVhayIgaW5zdHJ1Y3Rpb24sIGFuZCBmb3IgInNkYmJwIgotCi1UaHUgTWF5ICA3IDAyOjE0OjA4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5fYXNtX2luaXRfcGFyc2UpOiBEZWxldGUuCi0JKGNnZW5fc2F2ZV9maXh1cHMsY2dlbl9yZXN0b3JlX2ZpeHVwcyxjZ2VuX3N3YXBfZml4dXBzKTogRGVsZXRlLgotCShjZ2VuX2FzbV9yZWNvcmRfcmVnaXN0ZXIsY2dlbl9hc21fZmluaXNoX2luc24pOiBEZWxldGUuCi0KLU1vbiBBcHIgMjcgMTA6MTM6MTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9BVFRSX1RZUEUpOiBEZWxldGUgYGNvbnN0JywgbW92ZWQgdG8gdXNlcy4KLQkoY2dlbl9hc21fZmluaXNoX2luc24pOiBVcGRhdGUgcHJvdG90eXBlLgotCShjZ2VuX2luc24pOiBOZXcgbWVtYmVycyBudW0sIGRhdGEuCi0JKENHRU5fSU5TTl9UQUJMRSk6IE1lbWJlcnMgYXNtX2hhc2gsIGFzbV9oYXNoX3RhYmxlX3NpemUsCi0JZGlzX2hhc2gsIGRpc19oYXNoX3RhYmxlX3NpemUgbW92ZWQgdG8gLi4uCi0JKENHRU5fT1BDT0RFX1RBQkxFKS4gIEhlcmUuICBSZW5hbWVkIGZyb20gQ0dFTl9PUENPREVfREFUQS4KLQlBbGwgdXNlcyB1cGRhdGVkLiAgTmV3IG1lbWJlcnMgYXNtX2hhc2hfcCwgZGlzX2hhc2hfcC4KLQkoQ0dFTl9NSU5TTl9FWFBBTlNJT04pOiBOZXcgc3RydWN0LgotCShjZ2VuX2V4cGFuZF9tYWNyb19pbnNuKTogRGVjbGFyZS4KLQkoY2dlbl9tYWNyb19pbnNuX2NvdW50KTogRGVjbGFyZS4KLQkoZ2V0X2luc25fb3BlcmFuZHMpOiBVcGRhdGUgcHJvdG90eXBlLgotCShsb29rdXBfZ2V0X2luc25fb3BlcmFuZHMpOiBEZWNsYXJlLgotCi1UdWUgQXByIDIxIDE3OjExOjMyIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQ2hhbmdlIGljbHJLbHVkZ2UgYW5kIGltdWxLbHVkZ2UgdG8KLQlyZWdLbHVkZ2UuICBBZGQgb3BlcmFuZHMgdHlwZXMgZm9yIHN0cmluZyBpbnN0cnVjdGlvbnMuCi0KLU1vbiBBcHIgMjAgMTQ6NDA6MjkgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBpMzg2LmggKFgpOiBSZW5hbWVkIGZyb20gYFpfJyB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nIG9mIG9wY29kZQotCXRhYmxlLgotCi1TdW4gQXByIDE5IDEzOjU0OjA2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChaXyk6IFJlbmFtZWQgZnJvbSBgXycgdG8gYXZvaWQgY2xhc2ggd2l0aCBjb21tb24gYWxpYXMKLQlmb3IgYGdldHRleHQnLgotCi1GcmkgQXByICAzIDEyOjA0OjQ4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBSZW1vdmUgTm9Nb2RybSBmbGFnIGZyb20gYWxsIGluc25zOiBpdCdzIG5ldmVyIGNoZWNrZWQuCi0JQWRkIElzU3RyaW5nIGZsYWcgdG8gc3RyaW5nIGluc3RydWN0aW9ucy4KLQkoSVNfU1RSSU5HKTogRG9uJ3QgZGVmaW5lLgotCShMT0NLX1BSRUZJWF9PUENPREUsIENTX1BSRUZJWF9PUENPREUsIERTX1BSRUZJWF9PUENPREUpOiBEZWZpbmUuCi0JKEVTX1BSRUZJWF9PUENPREUsIEZTX1BSRUZJWF9PUENPREUsIEdTX1BSRUZJWF9PUENPREUpOiBEZWZpbmUuCi0JKFNTX1BSRUZJWF9PUENPREUpOiBEZWZpbmUuCi0KLU1vbiBNYXIgMzAgMjE6MzE6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IFJldmVydCBNYXJjaCAyNCBwYXRjaDsgbm8gbW9yZSBMaW5lYXJBZGRyZXNzLgotCi1Nb24gTWFyIDMwIDEwOjI1OjU0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUmVtb3ZlIGZ3YWl0ICg5YikgZnJvbSBhbGwgZmxvYXRpbmcgcG9pbnQKLQlpbnN0cnVjdGlvbnMsIGFuZCBpbnN0ZWFkIGFkZCBGV2FpdCBvcGNvZGUgbW9kaWZpZXIuICBBZGQgc2hvcnQKLQlmb3JtIG9mIGZsZGVudiBhbmQgZnN0ZW52LgotCShGV0FJVF9PUENPREUpOiBEZWZpbmUuCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IENoYW5nZSBzZWNvbmQgb3BlcmFuZCBjb25zdHJhaW50IG9mIGBtb3YKLQlzcmVnLHJlZ3xtZW0nIGluc3RydWN0aW9uIGZyb20gUmVnMTZ8TWVtIHRvIFdvcmRSZWd8V29yZE1lbSB0bwotCWFsbG93IGxlZ2FsIGluc3RydWN0aW9ucyBzdWNoIGFzIGBtb3ZsICVncywlZXNpJwotCi1GcmkgTWFyIDI3IDE4OjMwOjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaDgzMDAuaDogVmFyaW91cyBjaGFuZ2VzIHRvIGZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXJzLgotCi1UdWUgTWFyIDI0IDE4OjMyOjQ3IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogaTM4Ni5oOiBTZXQgTGluZWFyQWRkcmVzcyBmb3IgbGlkdCBhbmQgbGdkdC4KLQotTW9uIE1hciAgMiAxMDo0NDowNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0JPT0xfQVRUUik6IE5ldyBtYWNyby4KLQotVGh1IEZlYiAyNiAxNTo1NDozMSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChGTEFHX0RFTEFZKTogTmV3IGZsYWcgZm9yIGRlbGF5ZWQgYnJhbmNoZXMvanVtcHMuCi0KLU1vbiBGZWIgMjMgMTA6Mzg6MjEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9DQVQzKTogRGVsZXRlLiAgVXNlIENPTkNBVDMgbm93LgotCShjZ2VuX2luc24pOiBSZWNvcmQgc3ludGF4IGFuZCBmb3JtYXQgZW50cmllcyBoZXJlLCByYXRoZXIgdGhhbgotCXNlcGFyYXRlbHkuCi0KLVR1ZSBGZWIgMTcgMjE6NDI6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEKTogTmV3IG1hY3JvLgotCi1UdWUgRmViIDE3IDE2OjAwOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5faW5zZXJ0X2ZuKTogQ2hhbmdlIHR5cGUgb2YgcmVzdWx0IHRvIGNvbnN0IGNoYXIgKi4KLQkoY2dlbl9wYXJzZV97c2lnbmVkLHVuc2lnbmVkfV9pbnRlZ2VyKTogRGVsZXRlIG1pbixtYXggYXJndW1lbnRzLgotCShDR0VOX3tJTlNOLEtFWVdPUkQsT1BFUkFORH1fTkJPT0xfQVRUUlMpOiBSZW5hbWVkIGZyb20gLi4uX01BWF9BVFRSUy4KLQotVGh1IEZlYiAxMiAxODozMDo0MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGxvb2t1cF9pbnNuKTogTmV3IGFyZ3VtZW50IGFsaWFzX3AuCi0KLVRodSBGZWIgMTIgMDM6NDE6MDAgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotRml4IHJhYyB0byBhY2NlcHQgb25seSBhMDoKLQkqIGQxMHYuaCAoT1BFUkFORF9BQ0MpOiBTcGxpdCBpbnRvOgotCShPUEVSQU5EX0FDQzAsIE9QRVJBTkRfQUNDMSkgLgotCShPUEVSQU5EX0dQUik6IERlZmluZS4KLQotV2VkIEZlYiAxMSAxNzozMTo1MyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0ZJRUxEUyk6IERlZmluZSBoZXJlLgotCShDR0VOX0hXX0VOVFJZKTogTmV3IG1lbWJlciBgdHlwZScuCi0JKGh3X2xpc3QpOiBEZWxldGUgZGVjbC4KLQkoZW51bSBjZ2VuX21vZGUpOiBEZWNsYXJlLgotCShDR0VOX09QRVJBTkQpOiBOZXcgbWVtYmVyIGBodycuCi0JKGVudW0gY2dlbl9vcGVyYW5kX2luc3RhbmNlX3R5cGUpOiBEZWNsYXJlLgotCShDR0VOX09QRVJBTkRfSU5TVEFOQ0UpOiBOZXcgdHlwZS4KLQkoQ0dFTl9JTlNOKTogTmV3IG1lbWJlciBgb3BlcmFuZHMnLgotCShDR0VOX09QQ09ERV9EQVRBKTogTWFrZSBod19saXN0IGNvbnN0LgotCShnZXRfaW5zbl9vcGVyYW5kcyxsb29rdXBfaW5zbik6IEFkZCBwcm90b3R5cGVzIGZvci4KLQotVHVlIEZlYiAgMyAxNzoxMToyMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0lOU05fTUFYX0FUVFJTKTogUmVuYW1lZCBmcm9tIENHRU5fTUFYX0lOU05fQVRUUlMuCi0JKENHRU5fSFdfRU5UUlkpOiBNb3ZlIGBuZXh0JyBlbnRyeSB0byBlbmQgb2Ygc3RydWN0LgotCShDR0VOX0tFWVdPUkRfTUFYX0FUVFJTKTogUmVuYW1lZCBmcm9tIENHRU5fTUFYX0tFWVdPUkRfQVRUUlMuCi0JKENHRU5fT1BFUkFORF9NQVhfQVRUUlMpOiBSZW5hbWVkIGZyb20gQ0dFTl9NQVhfT1BFUkFORF9BVFRSUy4KLQotTW9uIEZlYiAgMiAxOToxOToxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQgZW5kIG1hcmtlci4KLQotTW9uIEZlYiAgMiAxNzoxMDozOCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JKiB0aWMzMC5oOiBOZXcgZmlsZS4KLQotVGh1IEphbiAyMiAxNzo1NDo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IEFkZCBwcm90b3R5cGVzIGZvciBjZ2VuX3NhdmVfZml4dXBzKCksCi0JY2dlbl9yZXN0b3JlX2ZpeHVwcygpLCBhbmQgY2dlbl9zd2FwX2ZpeHVwcygpLiAgQ2hhbmdlIHByb3RvdHlwZQotCW9mIGNnZW5fYXNtX2ZpbmlzaF9pbnNuKCkgdG8gcmV0dXJuIGEgY2hhciAqLgotCi1XZWQgSmFuIDE0IDE3OjIxOjQzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogRm9ybWF0dGluZyBjaGFuZ2VzIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCi0KLU1vbiBKYW4gMTIgMTE6Mzc6MzYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoKik6IENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCi0JKENHRU5fQVRUUik6IE1ha2UgdW5zaWduZWQgY2hhci4KLQkoQ0dFTl9BVFRSX1RZUEUpOiBVcGRhdGUuCi0JKENHRU5fQVRUUl97RU5UUlksVEFCTEV9KTogTmV3IHR5cGVzLgotCShjZ2VuX2Jhc2UpOiBNb3ZlIG1lbWJlciBgYXR0cnMnIHRvIGNnZW5faW5zbi4KLQkoQ0dFTl9LRVlXT1JEKTogTmV3IG1lbWJlciBgbnVsbF9lbnRyeScuCi0JKENHRU5fe1NZTlRBWCxGT1JNQVR9KTogTmV3IHR5cGVzLgotCShjZ2VuX2luc24pOiBGb3JtYXQgYW5kIHN5bnRheCBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyLgotCi1UdWUgRGVjIDE2IDE1OjE1OjUyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKGQzMHZfb3Bjb2RlKTogUmVvcmRlciBmbGFncyBzb21ld2hhdCwgYWRkIG5ldyBmbGFncyBmb3IKLQkyIHdvcmQgbG9hZC9zdG9yZSwgQUREcHBwL1NVQnBwcCwgMTYvMzIgYml0IG11bHRpcGx5LiAgTWFrZQotCWZsYWdzX3t1c2VkLHNldH0gbG9uZy4KLQkoZDMwdl9vcGVyYW5kKTogTWFrZSBmbGFncyBmaWVsZCBsb25nLgotCi1Nb24gRGVjICAxIDEyOjI0OjQ0IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLmg6IEZpeCBjb21tZW50IGRlc2NyaWJpbmcgb3BlcmFuZCB0eXBlcy4KLQotU3VuIE5vdiAyMyAyMjozMToyNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChTSE9SVF9DTVBVKTogQWRkIGNhc2UgZm9yIGNtcHUgaW5zdHJ1Y3Rpb24sIGFuZCBtb3ZlCi0JZXZlcnl0aGluZyBlbHNlIGFmdGVyIGRvd24uCi0KLVR1ZSBOb3YgMTggMTg6NDU6MTQgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZDEwdi5oIChPUEVSQU5EX0ZMQUcpOiBTcGxpdCBpbnRvOgotCShPUEVSQU5EX0ZGTEFHLCBPUEVSQU5EX0NGTEFHKSAuCi0KLVRodSBOb3YgMTMgMTE6MDQ6MjQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoc3RydWN0IG1pcHNfb3Bjb2RlKTogQ2hhbmdlZCBjb21tZW50cyB0byByZWZsZWN0IG5ldwotCWZpZWxkIHVzYWdlLgotCi1GcmkgT2N0IDI0IDIyOjM2OjIwIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZGVkIHRvIGNvbW1lbnRzIGEgcXVpY2stcmVmIGxpc3Qgb2YgYWxsIGFzc2lnbmVkCi0Jb3BlcmFuZCB0eXBlIGNoYXJhY3RlcnMuCi0JKE9QX3tNQVNLLFNIfV9QRVJGUkVHKTogTmV3IG1hY3Jvcy4KLQotV2VkIE9jdCAyMiAxNzoyODozMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oOiBBZGQgJ18nIGFuZCAnLycgZm9yIHY5YSBhc3Incy4KLQlQYXRjaCBmcm9tIERhdmlkIE1pbGxlciA8ZGF2ZW1Admdlci5ydXRnZXJzLmVkdT4KLQotVHVlIE9jdCAxNCAxMzoyMjoyOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IEJpdCBvcHMgd2l0aCBhYnNvbHV0ZSBhZGRyZXNzZXMgbm90IGluIHRoZSA4IGJpdAotCWFyZWEgYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJhc2UgbW9kZWwgKEg4LzMwMCkuCi0KLVRodSBTZXAgMjUgMTM6MDM6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IFJlbW92ZSBkb2N1bWVudGF0aW9uIG9mIGAgb3BlcmFuZCBzcGVjaWZpZXIuCi0KLVdlZCBTZXAgMjQgMTk6MDA6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IERvY3VtZW50IHEgYW5kIHYgb3BlcmFuZCBzcGVjaWZpZXJzLgotCi1Nb24gU2VwIDE1IDE4OjI4OjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoc3RydWN0IHY4NTBfb3Bjb2RlKTogQWRkIHByb2Nlc3NvcnMgZmllbGQuCi0JKFBST0NFU1NPUl9WODUwLCBQUk9DRVNTT1JfQUxMKTogTmV3IGJpdCBjb25zdGFudHMuCi0JKFBST0NFU1NPUl9WODUwRSwgUFJPQ0VTU09SX05PVF9WODUwKTogTmV3IGJpdCBjb25zdGFudHMuCi0JKFBST0NFU1NPUl9WODUwRUEpOiBOZXcgYml0IGNvbnN0YW50cy4KLQotTW9uIFNlcCAxNSAxMToyOTo0MyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlIGNoYW5nZXMgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogZDMwdi5oOiBBbGxvdyB1cCB0byA2NCBjb250cm9sIHJlZ2lzdGVycy4gQWRkCi0JU0hPUlRfQTVTIGZvcm1hdC4KLQotCSogZDMwdi5oIChMT05HX0RiKTogTmV3IGZvcm0gZm9yIGRlbGF5ZWQgYnJhbmNoZXMuCi0KLQkqIGQzMHYuaDogKExPTkdfRGIpOiBOZXcgZm9ybSBmb3IgcmVwZWF0aS4KLQotCSogZDMwdi5oIChTSE9SVF9EMkIpOiBOZXcgZm9ybS4KLQotCSogZDMwdi5oIChTSE9SVF9BMik6IE5ldyBmb3JtLgotCi0JKiBkMzB2LmggKE9QRVJBTkRfMlJFRyk6IEFkZCBuZXcgb3BlcmFuZCB0byBpbmRpY2F0ZSAyCi0JcmVnaXN0ZXJzIGFyZSB1c2VkLiAgTmVlZGVkIGZvciBWTElXIG9wdGltaXphdGlvbi4KLQotTW9uIFNlcCAgOCAxNDowNTo0NSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IE1vdmUgYXNzZW1ibGVyIGludGVyZmFjZSBzZWN0aW9uCi0JdXAgc28gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCBpcyBkZWZpbmVkIGZvciBjZ2VuX3BhcnNlX2FkZHJlc3MuCi0JKGNnZW5fcGFyc2VfYWRkcmVzcyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0KLVR1ZSBTZXAgIDIgMTU6MzI6MzIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChWODUwX09QUkVBTkRfQURKVVNUX1NIT1JUX01FTU9SWSk6IFJlbW92ZWQuCi0KLVR1ZSBBdWcgMjYgMTI6MjE6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LmggKHR3b19ieXRlX3NlZ21lbnRfZGVmYXVsdHMpOiBDb3JyZWN0IGJhc2UgcmVnaXN0ZXIgNSBpbgotCW1vZGVzIDEgYW5kIDIgdG8gYmUgc3MgcmF0aGVyIHRoYW4gZHMuICBGcm9tIEdhYnJpZWwgUGF1YmVydAotCTxwYXViZXJ0QGlyYW0uZXM+LgotCi0JKiBpMzg2Lmg6IFNldCB1ZDIgdG8gMHgwZjBiLiAgRnJvbSBHYWJyaWVsIFBhdWJlcnQKLQk8cGF1YmVydEBpcmFtLmVzPi4KLQotCSogaTM4Ni5oOiBDb21tZW50IGZpeGVzIGZvciBmaWNvbVtwXT97cyxsfSBmcm9tIEdhYnJpZWwgUGF1YmVydAotCTxwYXViZXJ0QGlyYW0uZXM+LgotCi0JKiBpMzg2LmggKEpVTVBfT05fQ1hfWkVSTyk6IFVuY29tbWVudCAoZGVmaW5lIGFnYWluKS4KLQkoSlVNUF9PTl9FQ1hfWkVSTyk6IFJlbW92ZSBjb21tZW50ZWQgb3V0IG1hY3JvLgotCi1GcmkgQXVnIDIyIDEwOjM4OjI5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoVjg1MF9OT1RfUjApOiBOZXcgZmxhZy4KLQotTW9uIEF1ZyAxOCAxMTowNTo1OCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHN0cnVjdCB2ODUwX29wY29kZSk6IFJlbW92ZSBmbGFncyBmaWVsZC4KLQotV2VkIEF1ZyAxMyAxODo0NTo0OCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHN0cnVjdCB2ODUwX29wY29kZSk6IEFkZCBmbGFncyBmaWVsZC4KLQkoc3RydWN0IHY4NTBfb3BlcmFuZCk6IEV4dGVuZCBtZWFuaW5nIG9mICdiaXRzJyBhbmQgJ3NoaWZ0JwotCWZpZWxkcy4KLQkoVjg1MEVfSU5TVFJVQ1RJT04sIFY4NTBFQV9JTlNUUlVDVElPTik6IE5ldyBmbGFncy4KLQkoVjg1MEVfUFVTSF9QT1AsIFY4NTBFX0lNTUVESUFURTE2LCBWODUwRV9JTU1FRElBVEUzMik6IE5ldyBmbGFncy4KLQotRnJpIEF1ZyAgOCAxNjo1ODo0MiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcmMuaDogTmV3IGZpbGUuCi0KLVRodSBKdWwgMjQgMjE6MTY6NTggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfb3Bjb2Rlcyk6IERlY2xhcmUgYXMgY29uc3QuCi0KLVRodSBKdWwgMTAgMTI6NTM6MjUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEZQX1MsIEZQX0QpOiBEZWZpbmUuICBCaXRtYXNrcyBpbmRpY2F0aW5nIGlmIGFuIGluc24KLQl1c2VzIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHJlc291cmNlcy4KLQkoSU5TTl9OT19JU0EsIElOU05fSVNBMSk6IERlZmluZS4KLQkoY3B1IHNwZWNpZmljIElOU04gbWFjcm9zKTogVHdlYWsgaW50byBiaXRtYXNrcyBvdXRzaWRlIHRoZSByYW5nZQotCW9mIElOU05fSVNBIGZpZWxkLgotCi1Nb24gSnVuIDE2IDE0OjEwOjAwIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGkzODYuaDogRml4IHBhbmQgb3Bjb2RlLgotCi1Nb24gSnVuICAyIDExOjM1OjA5IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IFdpZGVuIElOU05fSVNBIGFuZCBtb3ZlIGl0IHRvIGEgbW9yZSBjb252ZW5pZW50Ci0JYml0IHBvc2l0aW9uLiAgQWRkIElOU05fMzkwMC4KLQotVHVlIE1heSAyMCAxMToyNToyOSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChzdHJ1Y3QgbWlwc19vcGNvZGUpOiBhZGRlZCBuZXcgZmllbGQgbWVtYmVyc2hpcC4KLQotTW9uIE1heSAxMiAxNjoyNjo1MCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBpMzg2LmggKG1vdmQpOiBvbmx5IFJlZzMyIGlzIGFsbG93ZWQuCi0KLQkqIGkzODYuaDogYWRkIGZjb21wIGFuZCB1ZDIuICBGcm9tIFdheW5lIFNjb3R0Ci0JPHdzY290dEBpY2hpcHMuaW50ZWwuY29tPi4KLQotTW9uIE1heSAgNSAxNzoxNjoyMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIE1NWCBpbnN0cnVjdGlvbnMuCi0KLU1vbiBNYXkgIDUgMTI6NDU6MTkgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogaTM4Ni5oOiBSZW1vdmUgVyBtb2RpZmllciBmcm9tIGNvbmRpdGlvbmFsIG1vdmUgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gQXByIDE0IDE0OjU2OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBDaGFuZ2UgdGhlIG9wY29kZXMgZm9yIGZzdWJwLCBmc3VicnAsIGZkaXZwLCBhbmQgZmRpdnJwCi0Jd2l0aCBubyBhcmd1bWVudHMgdG8gbWF0Y2ggdGhhdCBnZW5lcmF0ZWQgYnkgdGhlIFVuaXhXYXJlCi0JYXNzZW1ibGVyLgotCi1UaHUgQXByIDEwIDE0OjM1OjAwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoPGNwdT5fY2dlbl9hc3NlbWJsZV9pbnNuKTogTmV3IGFyZyBmb3IgZXJybXNnLgotCShjZ2VuX3BhcnNlX29wZXJhbmRfZm4pOiBEZWNsYXJlLgotCShjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCk6IERlY2xhcmUuCi0JKGNnZW5fcGFyc2Vfb3BlcmFuZCk6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9wYXJzZV9vcGVyYW5kLAotCW5ldyBhcmd1bWVudCBgd2FudCcuCi0JKGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCk6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9yZXN1bHQuCi0JKGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3R5cGUpOiBOZXcgZW51bS4KLQotU2F0IEFwciAgNSAxMzoxNDowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogUmV2ZXJ0IGxhc3QgcGF0Y2ggZm9yIHRoZSBOT05fQlJPS0VOX09QQ09ERVMgY2FzZXMuCi0KLUZyaSBBcHIgIDQgMTE6NDY6MTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBOZXcgZmlsZS4KLQotRnJpIEFwciAgNCAxNDowMjozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQ29ycmVjdCBvcGNvZGUgdmFsdWVzIGZvciBmc3VicCwgZnN1YnJwLCBmZGl2cCwgYW5kCi0JZmRpdnJwLgotCi1UdWUgTWFyIDI1IDIyOjU3OjI2IDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHY4NTAuaCAoZXh0cmFjdCk6ICBNYWtlIHVuc2lnbmVkLgotCi1Nb24gTWFyIDI0IDE0OjM4OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgaWNsci4KLQotVGh1IE1hciAyMCAxOTo0OToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQ2hhbmdlIERXIHRvIFcgZm9yIGNtcHhjaGcgYW5kIHhhZGQsIHNpbmNlIHRoZXkgZG9uJ3QKLQl0YWtlIGEgZGlyZWN0aW9uIGJpdC4KLQotU2F0IE1hciAxNSAxOTowMzoyOSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogc3BhcmMuaCAoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKTogVXNlIGZ1bGwgcHJvdG90eXBlLgotCi1GcmkgTWFyIDE0IDE1OjIyOjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaDogSW5jbHVkZSA8YW5zaWRlY2wuaD4uICBVcGRhdGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIHRvCi0JdXNlIHByb3RvdHlwZXMsIGFuZCB0byB1c2UgY29uc3Qgd2hlbiBhcHByb3ByaWF0ZS4KLQotVGh1IE1hciAgNiAxNDoxODozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1JFTEFYKTogRGVmaW5lLgotCi1Nb24gRmViIDI0IDE1OjE1OjU2IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IENoYW5nZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMgdG8KLQlkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIGFuZCByZWdfbmFtZV9jbnQgdG8gZDEwdl9yZWdfbmFtZV9jbnQuCi0KLVNhdCBGZWIgMjIgMjE6MjU6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBtYWNyb3MgZm9yIGNvcDAsIGNvcDEgY29wMiBhbmQgY29wMy4KLQlDaGFuZ2UgbWlwc19vcGNvZGVzIGZyb20gY29uc3QgYXJyYXkgdG8gYSBwb2ludGVyLAotCWFuZCBjaGFuZ2UgYmZkX21pcHNfbnVtX29wY29kZXMgZnJvbSBjb25zdCBpbnQgdG8gaW50LAotCXNvIHRoYXQgd2UgY2FuIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBtaXBzIG9wY29kZXMgdGFibGUKLQlkeW5hbWljYWxseS4KLQotRnJpIEZlYiAyMSAxNjozNDoxOCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChGTEFHX1gpOiBSZW1vdmUgdW51c2VkIGZsYWcuCi0KLVR1ZSBGZWIgMTggMTc6Mzc6MjAgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaDogTmV3IGZpbGUuCi0KLUZyaSBGZWIgMTQgMTM6MTY6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFBEU19OQU1FKTogTWFjcm8gdG8gYWNjZXNzIG5hbWUgZmllbGQgb2YgcHJlZGVmaW5lZCBzeW1ib2xzLgotCShQRFNfVkFMVUUpOiBNYWNybyB0byBhY2Nlc3MgdmFsdWUgZmllbGQgb2YgcHJlZGVmaW5lZCBzeW1ib2xzLgotCSh0aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sKTogQWRkIHByb3RvdHlwZS4KLQotTW9uIEZlYiAxMCAxMDozMjoxNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogQ2hhbmdlIHByb3RvdHlwZSB0byBtYXRjaAotCWNoYW5nZSBpbiBmdW5jdGlvbiwgYWRkZWQgY2xhc3MgcGFyYW1ldGVyLgotCi1UaHUgRmViICA2IDE3OjMwOjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX0VORE1BU0spOiBBZGQgZm9yIGZsYWdnaW5nIFRJYzgwCi0JZW5kbWFzayBmaWVsZHMsIHdoaWNoIGFyZSBzb21ld2hhdCB3ZWlyZCBpbiB0aGF0IDAgYW5kIDMyIGFyZQotCXRyZWF0ZWQgZXhhY3RseSB0aGUgc2FtZS4KLQotVGh1IEphbiAzMCAxMzo0NjoxOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaDogQ2hhbmdlIGFsbCB0aGUgT1BFUkFORCBkZWZpbmVzIHRvIHVzZSB0aGUgZm9ybSAoMSA8PCBYKQotCXJhdGhlciB0aGFuIGEgY29uc3RhbnQgdGhhdCBpcyAyKipYLiAgUmVvcmRlciB0aGVtIHRvIHB1dCBiaXRzIGZvcgotCW9wZXJhbmRzIHRoYXQgaGF2ZSBzeW1ib2xpYyBuYW1lcyBpbiB0aGUgdXBwZXIgYml0cywgc28gdGhleSBjYW4KLQliZSBwYWNrZWQgaW50byBhbiBpbnQgd2hlcmUgdGhlIGxvd2VyIGJpdHMgY29udGFpbiB0aGUgdmFsdWUgdGhhdAotCWNvcnJlc3BvbmRzIHRvIHRoYXQgc3ltYm9saWMgbmFtZS4KLQkocHJlZGVmaW5lZF9zeW1ibyk6IEFkZCBzdHJ1Y3QuCi0JKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IERlY2xhcmUgYXJyYXkgb2YgdHJhbnNsYXRpb25zLgotCSh0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzKTogRGVjbGFyZSBzaXplIG9mIHRoYXQgYXJyYXkuCi0JKHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCk6IERlY2xhcmUgZnVuY3Rpb24uCi0JKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IERlY2xhcmUgZnVuY3Rpb24uCi0KLVdlZCBKYW4gMjkgMDk6Mzc6MjUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLmggKE1OMTAyMDBfT1BFUkFORF9SRUxBWCk6IERlZmluZS4KLQotU2F0IEphbiAxOCAxNToxODo1OSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfTk9fUjBfREVTVCk6IEFkZCBmb3Igb3Bjb2RlcyB3aGVyZSByMCBjYW5ub3QKLQliZSB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuCi0KLVRodSBKYW4gMTYgMjA6NDg6NTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKHN0cnVjdCB0aWM4MF9vcGNvZGUpOiBDaGFuZ2UgImZvcm1hdCIgZmllbGQgdG8gImZsYWdzIi4KLQkoRk1UX1VOVVNFRCwgRk1UX1NJLCBGTVRfTEksIEZNVF9SRUcpOiBEZWxldGUuCi0JKFRJQzgwX1ZFQ1RPUik6IERlZmluZSBhIGZsYWcgYml0IGZvciB0aGUgZmxhZ3MuICBUaGlzIG9uZSBtZWFucwotCXRoYXQgdGhlIG9wY29kZSBjYW4gaGF2ZSB0d28gdmVjdG9yIGluc3RydWN0aW9ucyBpbiBhIHNpbmdsZQotCTMyIGJpdCB3b3JkIGFuZCB3ZSBoYXZlIHRvIGVuY29kZS9kZWNvZGUgYm90aC4KLQotVHVlIEphbiAxNCAxOTozNzowOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9QQ1JFTCk6IFJlbmFtZWQgZnJvbQotCVRJQzgwX09QRVJBTkRfUkVMQVRJVkUgZm9yIFBDIHJlbGF0aXZlLgotCShUSUM4MF9PUEVSQU5EX0JBU0VSRUwpOiBOZXcgZmxhZyBiaXQgZm9yIHJlZ2lzdGVyCi0JYmFzZSByZWxhdGl2ZS4KLQotTW9uIEphbiAxMyAxNTo1NjozOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9GTE9BVCk6IEFkZCBmb3IgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZHMuCi0KLU1vbiBKYW4gIDYgMTA6NTE6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfU0NBTEVEKTogT3BlcmFuZCBtYXkgaGF2ZSBvcHRpb25hbAotCSI6cyIgbW9kaWZpZXIgZm9yIHNjYWxpbmcuCi0KLVN1biBKYW4gIDUgMTI6MTI6MTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfTV9TSSk6IEFkZCBvcGVyYW5kIG1vZGlmaWVyIGZvciAiOm0iLgotCShUSUM4MF9PUEVSQU5EX01fTEkpOiBEaXR0bwotCi1TYXQgSmFuICA0IDE5OjAyOjQ0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX0JJVE5VTSk6IFJlbmFtZWQgZnJvbSBUSUM4MF9PUEVSQU5EX0NDX1NaLgotCShUSUM4MF9PUEVSQU5EX0NDKTogTmV3IGRlZmluZSBmb3IgY29uZGl0aW9uIGNvZGUgb3BlcmFuZC4KLQkoVElDODBfT1BFUkFORF9DUik6IE5ldyBkZWZpbmUgZm9yIGNvbnRyb2wgcmVnaXN0ZXIgb3BlcmFuZC4KLQotRnJpIEphbiAgMyAxNjoyMjoyMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoc3RydWN0IHRpYzgwX29wY29kZSk6IE5hbWUgY2hhbmdlZC4KLQkoc3RydWN0IHRpYzgwX29wY29kZSk6IFJlbW92ZSBmb3JtYXQgZmllbGQuCi0JKHN0cnVjdCB0aWM4MF9vcGVyYW5kKTogQWRkIGluc2VydGlvbiBhbmQgZXh0cmFjdGlvbiBmdW5jdGlvbnMuCi0JKFRJQzgwX09QRVJBTkRfKik6IFJlbW92ZSBvbGQgYm9ndXMgdmFsdWVzLCBzdGFydCBhZGRpbmcgbmV3Ci0JY29ycmVjdCBvbmVzLgotCShGTVRfKik6IERpdHRvLgotCi1UdWUgRGVjIDMxIDE1OjA1OjQxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChWODUwX09QRVJBTkRfQURKVVNUX1NIT1JUX01FTU9SWSk6IE5ldyBmbGFnIHRvIGFkanVzdAotCXR5cGUgSVYgaW5zdHJ1Y3Rpb24gb2Zmc2V0cy4KLQotRnJpIERlYyAyNyAyMjoyMzoxMCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaDogTmV3IGZpbGUuCi0KLVdlZCBEZWMgMTggMTA6MDY6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLmggKE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLKTogRGVmaW5lLgotCi1TYXQgRGVjIDE0IDEwOjQ4OjMxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBuaW5lbW9vbnMuY29tPgotCi0JKiBtbjEwMjAwLmg6IEZpeCBjb21tZW50LCBtbjEwMjAwX29wZXJhbmQgbm90IHBvd2VycGNfb3BlcmFuZC4KLQkqIG1uMTAzMDAuaDogRml4IGNvbW1lbnQsIG1uMTAzMDBfb3BlcmFuZCBub3QgcG93ZXJwY19vcGVyYW5kLgotCSogdjg1MC5oOiBGaXggY29tbWVudCwgdjg1MF9vcGVyYW5kIG5vdCBwb3dlcnBjX29wZXJhbmQuCi0KLU1vbiBEZWMgIDkgMTY6NDU6MzkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLmg6IEZsZXNoIG91dCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBuZWVkZWQgYnkKLQl0aGUgbW4xMDIwMCBhc3NlbWJsZXIgJiBkaXNhc3NlbWJsZXIuCi0KLVR1ZSBOb3YgMjYgMTA6NDY6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBtaXBzMTYgZGVmaW5pdGlvbnMuCi0KLU1vbiBOb3YgMjUgMTc6NTY6NTQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogRG9jdW1lbnQgbmV3IDwsID4sIG0sIG4sIG8gYW5kIHAgb3BlcmFuZCBzcGVjaWZpZXJzLgotCi1XZWQgTm92IDIwIDEwOjU5OjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUENSRUwpOiBEZWZpbmUuCi0JKE1OMTAzMDBfT1BFUkFORF9NRU1BRERSKTogRGVmaW5lLgotCi1UdWUgTm92IDE5IDEzOjMwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QpOiBEZWZpbmUuCi0KLVdlZCBOb3YgIDYgMTM6NDE6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9TUExJVCk6IERlZmluZS4KLQotVHVlIE5vdiAgNSAxMzoyNjoxMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEKTogRGVmaW5lLgotCi1Nb24gTm92ICA0IDEyOjUyOjQ4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQpOiBEZWZpbmUuCi0KLUZyaSBOb3YgIDEgMTA6MzE6MDIgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IERvbid0IGluY2x1ZGUgImJmZC5oIjsgcHJpdmF0ZSByZWxvY2F0aW9uIHR5cGVzIGFyZSBub3cKLSAJbmVnYXRpdmUgdG8gbWluaW1pemUgcHJvYmxlbXMgd2l0aCBzaGFyZWQgbGlicmFyaWVzLiAgT3JnYW5pemUKLSAJaW5zdHJ1Y3Rpb24gc3Vic2V0cyBieSBBTUFTSyBleHRlbnNpb25zIGFuZCBQQUxjb2RlCi0gCWltcGxlbWVudGF0aW9uLgotCShzdHJ1Y3QgYWxwaGFfb3BlcmFuZCk6IE1vdmUgZmxhZ3Mgc2xvdCBmb3IgYmV0dGVyIHBhY2tpbmcuCi0KLVR1ZSBPY3QgMjkgMTI6MTk6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLmggKFY4NTBfT1BFUkFORF9SRUxBWCk6IE5ldyBvcGVyYW5kIGZsYWcuCi0KLVRodSBPY3QgMTAgMTQ6Mjk6MTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKEZNVF8qKTogTW92ZSBvcGVyYW5kIGZvcm1hdCBkZWZpbml0aW9ucwotCWhlcmUuCi0KLVR1ZSBPY3QgIDggMTQ6NDg6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9QQVJFTik6IERlZmluZS4KLQotTW9uIE9jdCAgNyAxNjo1MjoxMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAobW4xMDMwMF9vcGNvZGUpOiBBZGQgImZvcm1hdCIgZmllbGQuCi0JKE1OMTAzMDBfT1BFUkFORF8qKTogRGVmaW5lLgotCi1UaHUgT2N0ICAzIDEwOjMzOjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMHgwMC5oOiBEZWxldGUuCi0JKiBtbjEwMjAwLmgsIG1uMTAzMDAuaDogTmV3IGZpbGVzLgotCi1XZWQgT2N0ICAyIDIxOjMxOjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMHgwMC5oOiBOZXcgZmlsZS4KLQotRnJpIFNlcCAyNyAxODoyNjo0NiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB2ODUwLmg6ICBBZGQgbmV3IGZsYWcgdG8gaW5kaWNhdGUgdGhpcyBpbnN0cnVjdGlvbiB1c2VzIGEgUEMKLQlkaXNwbGFjZW1lbnQuCi0KLUZyaSBTZXAgMTMgMTQ6NTg6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChzdG1hYyk6IEFkZCBtaXNzaW5nIGluc3RydWN0aW9uLgotCi1TYXQgQXVnIDMxIDE2OjAyOjAzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oICh2ODUwX29wY29kZSk6IFJlbW92ZSAic2l6ZSIgZmllbGQuICBBZGQgIm1lbW9wIgotCWZpZWxkLgotCi1GcmkgQXVnIDIzIDEwOjM5OjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oIChWODUwX09QRVJBTkRfRVApOiBEZWZpbmUuCi0KLQkqIHY4NTAuaCAodjg1MF9vcGNvZGUpOiBBZGQgc2l6ZSBmaWVsZC4KLQotVGh1IEF1ZyAyMiAxNjo1MToyNSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAodjg1MF9vcGVyYW5kcyk6IEFkZCBpbnNlcnQgYW5kIGV4dHJhY3QgZmllbGRzLCBwb2ludGVycwotIAl0byBmdW5jdGlvbnMgdXNlZCB0byBoYW5kbGUgdW51c3VhbCBvcGVyYW5kIGVuY29kaW5nLgotCShWODUwX09QRVJBTkRfUkVHLCBWODUwX09QRVJBTkRfU1JHLCBWODUwX09QRVJBTkRfQ0MsCi0gCVY4NTBfT1BFUkFORF9TSUdORUQpOiBEZWZpbmVkLgotCi1XZWQgQXVnIDIxIDE3OjQ1OjEwIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oICh2ODUwX29wZXJhbmRzKTogQWRkIGZsYWdzIGZpZWxkLgotCShPUEVSQU5EX1JFRywgT1BFUkFORF9OVU0pOiBEZWZpbmVkLgotCi1UdWUgQXVnIDIwIDE0OjUyOjAyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBOZXcgZmlsZS4KLQotRnJpIEF1ZyAxNiAxNDo0NDoxNSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIG1pcHMuaCAoT1BfU0hfTE9DQywgT1BfU0hfSElDQywgT1BfTUFTS19DQywgT1BfU0hfQ09QMU5PUk0sCi0gCU9QX01BU0tfQ09QMU5PUk0sIE9QX1NIX0NPUDFTUEVDLCBPUF9NQVNLX0NPUDFTUEVDLAotIAlPUF9NQVNLX0NPUDFTQ0xSLCBPUF9NQVNLX0NPUDFDTVAsIE9QX1NIX0NPUDFDTVAsIE9QX1NIX0ZPUk1BVCwKLSAJT1BfTUFTS19GT1JNQVQsIE9QX1NIX1RSVUUsIE9QX01BU0tfVFJVRSwgT1BfU0hfR0UsIE9QX01BU0tfR0UsCi0gCU9QX1NIX1VOU0lHTkVELCBPUF9NQVNLX1VOU0lHTkVELCBPUF9TSF9ISU5ULCBPUF9NQVNLX0hJTlQpOgotIAlEZWZpbmVkLgotCi1GcmkgQXVnIDE2IDAwOjE1OjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwaXRsYiwgcGl0bGJlLCBpaXRsYmEsIGlpdGxicCwgZmljLCBmaWNlKTogQWNjZXB0Ci0JYSAzIGJpdCBzcGFjZSBpZCBpbnN0ZWFkIG9mIGEgMiBiaXQgc3BhY2UgaWQuCi0KLVRodSBBdWcgMTUgMTM6MTE6NDYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogQWRkIHNvbWUgYWRkaXRpb25hbCBkZWZpbmVzIHRvIHN1cHBvcnQgdGhlCi0gCWFzc2VtYmxlciBpbiBkZXRlcm1pbmluZyB3aGljaCBvcGVyYXRpb25zIGNhbiBiZSBkb25lIGluIHBhcmFsbGVsLgotCi1UdWUgQXVnICA2IDExOjEzOjIyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoU04pOiBEZWZpbmUuCi0JKGVlcG1vdi5iKTogUmVuYW1lZCBmcm9tICJlZXBtb3YiCi0JKG5vcCwgYnB0LCBydGUsIHJ0cywgc2xlZXAsIGNscm1hYyk6IFRoZXNlIGhhdmUgbm8gc2l6ZSBhc3NvY2lhdGVkCi0Jd2l0aCB0aGVtLgotCi1GcmkgSnVsIDI2IDExOjQ3OjEwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LmggKE9QRVJBTkRfU0hJRlQpOiBOZXcgb3BlcmFuZCBmbGFnLgotCi1UaHUgSnVsIDI1IDEyOjA2OjIyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IENoYW5nZXMgZm9yIGRpdnMsIHBhcmFsbGVsLW9ubHkgaW5zdHJ1Y3Rpb25zLCBhbmQKLSAJc2lnbmVkIG51bWJlcnMuCi0KLU1vbiBKdWwgMjIgMTE6MjE6MTUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaCAocGRfcmVnKTogRGVmaW5lLiBQdXR0aW5nIHRoZSBkZWZpbml0aW9uIGhlcmUgYWxsb3dzCi0JdGhlIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIHRvIHNoYXJlIHRoZSBzYW1lIHN0cnVjdC4KLQotTW9uIEp1bCAyMiAxMjoxNToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoaTk2MF9vcGNvZGVzKTogImhhbHQiIHRha2VzIGFuIGFyZ3VtZW50LiAgRnJvbSBTdGVwaGVuCi0JV2lsbGlhbXMgPHN0ZXZlQGljYXJ1cy5jb20+LgotCi1XZWQgSnVsIDE3IDE0OjQ2OjM4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDExIDEyOjA5OjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoYmFuZCwgYmNscik6IEZvcmNlIGhpZ2ggYml0IG9mIGltbWVkaWF0ZSBuaWJibGUgdG8gemVyby4KLQotV2VkIEp1bCAgMyAxNDozMDoxMiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLSAJKiBtNjhrLmggKG1jZjUyMDApOiBOZXcgbWFjcm8uCi0JRG9jdW1lbnQgbmFtZXMgb2YgY29sZGZpcmUgY29udHJvbCByZWdpc3RlcnMuCi0KLVR1ZSBKdWwgIDIgMjM6MDU6NDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChTUkNfSU5fRFNUKTogRGVmaW5lLgotCi0JKiBoODMwMC5oIChVTk9QMyk6IE1hcmsgdGhlIHJlZ2lzdGVyIG9wZXJhbmQgaW4gdGhpcyBpbnNuCi0JYXMgYSBzb3VyY2Ugb3BlcmFuZCwgbm90IGEgZGVzdGluYXRpb24gb3BlcmFuZC4KLQkoU0hJRlRfMiwgU0hJRlRfSU1NKTogUmVtb3ZlLiAgRWxpbWluYXRlIGFsbCByZWZlcmVuY2VzLgotCShVTk9QMyk6IENoYW5nZSBTSElGVF9JTU0gdG8gSU1NIGZvciBIOC9TIGJpdG9wcy4gIE1hcmsKLQlyZWdpc3RlciBvcGVyYW5kIHdpdGggU1JDX0lOX0RTVC4KLQotRnJpIEp1biAyMSAxMzo1MjoxNyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEuaDogTmV3IGZpbGUuCi0KLVRodSBKdW4gMjAgMTU6MDI6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczZrLmg6IFJlbW92ZSBvYnNvbGV0ZSBmaWxlLgotCi1XZWQgSnVuIDE5IDE1OjI5OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBDb3JyZWN0IG9wY29kZSB2YWx1ZXMgZm9yIGZhZGRwLCBmc3VicCwgZnN1YnJwLCBmbXVscCwKLQlmZGl2cCwgYW5kIGZkaXZycC4gIEFkZCBmZnJlZXAuCi0KLVR1ZSBKdW4gMTggMTY6MDY6MDAgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLmg6IFJlb3JkZXIgdmFyaW91cyAjZGVmaW5lcyBmb3IgcmVhZGFiaWxpdHkuCi0JKEFCUzMyU1JDLCBBQlMzMkRTVCwgRFNQMzJMSVNULCBBQlMzMkxJU1QsIEEzMkxJU1QpOiBEZWZpbmUuCi0JKEJJVE9QKTogQWNjZXB0IGFkZGl0aW9uYWwgKHVudXNlZCkgYXJndW1lbnQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShFQklUT1ApOiBMaWtld2lzZS4KLQkoT19MQVNUKTogQnVtcC4KLQkobGRjLCBzdGMsIG1vdmIsIG1vdncsIG1vdmwpOiBVc2UgMzJiaXQgb2Zmc2V0cyBhbmQgYWJzb2x1dGVzLgotCi0JKiBoODMwMC5oIChFWFIsIFNISUZUXzIsIE1BQ1JFRywgU0hJRlRfSU1NLCBSRElOQyk6IERlZmluZS4KLQkoT19UQVMsIE9fQ0xSTUFDLCBPX0xETUFDLCBPX01BQywgT19MRE0sIE9fU1RNKTogRGVmaW5lLgotCShCSVRPUCwgRUJJVE9QKTogSGFuZGxlIG5ldyBIOC9TIGFkZHJlc3NpbmcgbW9kZXMgZm9yCi0JYml0IGluc25zLgotCShVTk9QMyk6IEhhbmRsZSBuZXcgc2hpZnQvcm90YXRlIGluc25zIG9uIHRoZSBIOC9TLgotCShpbnNucyB1c2luZyBleHIpOiBOZXcgaW5zdHJ1Y3Rpb25zLgotCSh0YXMsIG1hYywgbGRtYWMsIGNscm1hYywgbGRtLCBzdG0pOiBOZXcgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgTWF5IDIzIDE2OjU2OjQ4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoYWRkLmwpOiBVbmRvIEFwciA1dGggY2hhbmdlLiAgVGhlIG1hbnVhbCBJIGhhZAotCXdhcyBpbmNvcnJlY3QuCi0KLU1vbiBNYXkgIDYgMjM6Mzg6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChTVEFSVCk6IFJlbW92ZS4KLQkoTUVNUkVMQVgpOiBEZWZpbmUuICBNYXJrIGFic29sdXRlIG1lbW9yeSBvcGVyYW5kcyBpbiBtb3YuYiwgbW92LncKLQlhbmQgbW92LmwgaW5zbnMgdGhhdCBjYW4gYmUgcmVsYXhlZC4KLQotVHVlIEFwciAzMCAxODozMDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogUmVtb3ZlIEFiczMyIGZyb20gbGNhbGwuCi0KLU1vbiBBcHIgMjIgMTc6MDk6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBibHVlcy5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChTUEFSQ19PUENPREVfQVJDSF9WOV9QKTogTmV3IG1hY3JvLgotCShTTENQT1ApOiBOZXcgbWFjcm8uCi0JTWFyayBYLFkgb3Bjb2RlIGxldHRlcnMgYXMgaW4gdXNlLgotCi1UaHUgQXByIDExIDE3OjI4OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRl9GTE9BVCwgRl9GQlIpOiBEZWZpbmUuCi0KLUZyaSBBcHIgIDUgMTY6NTU6MzQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChBQlM4TUVNKTogUmVuYW1lZCBmcm9tIEFCU01PVi4gIFJlbW92ZSBBQlNNT1YKLQlmcm9tIGFsbCBpbnNucy4KLQkoQUJTOFNSQyxBQlM4RFNUKTogQWRkIEFCUzhNRU0uCi0JKGFkZC5sKTogRml4IHJlZytyZWcgdmFyaWFudC4KLQkoZWVwbW92LncpOiBSZW5hbWVkIGZyb20gZWVwbW92dy4KLQkobGRjLHN0Yyk6IEZpeCBtYW55IGNhc2VzLgotCi1TdW4gTWFyIDMxIDEzOjMwOjAzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKFNQQVJDX09QQ09ERV9BUkNIX01BU0spOiBOZXcgbWFjcm8uCi0KLVRodSBNYXIgIDcgMTU6MDg6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKE8pOiBNYXJrIG9wZXJhbmQgbGV0dGVyIGFzIGluIHVzZS4KLQotVHVlIEZlYiAyMCAyMDo0NjoyMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3NwYXJjbGV0X2NwcmVnKTogRGVjbGFyZS4KLQlNYXJrIG9wZXJhbmQgbGV0dGVycyB1VSBhcyBpbiB1c2UuCi0KLU1vbiBGZWIgMTkgMDE6NTk6MDggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX29wY29kZV9hcmNoX3ZhbCk6IEFkZCBTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVC4KLQkoc3BhcmNfb3Bjb2RlX2FyY2gpOiBEZWxldGUgbWVtYmVyIGBjb25mbGljdHMnLiAgQWRkIGBzdXBwb3J0ZWQnLgotCShTUEFSQ19PUENPREVfU1VQUE9SVEVEKTogTmV3IG1hY3JvLgotCShTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCk6IFJld3JpdGUuCi0JKEZfTk9UVjkpOiBEZWxldGUuCi0KLUZyaSBGZWIgMTYgMTI6MjM6MzQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gpIE1ha2UgcmV0dXJuIHR5cGUgaW4KLQlkZWNsYXJhdGlvbiBjb25zaXN0ZW50IHdpdGggcmV0dXJuIHR5cGUgaW4gZGVmaW5pdGlvbi4KLQotV2VkIEZlYiAxNCAxODoxNDoxMSAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IFJlbW92ZSBEYXRhMzIgZnJvbSBwdXNoZiBhbmQgcG9wZi4KLQotVGh1IEZlYiAgOCAxNDoyNzoyMSAxOTk2ICBKYW1lcyBDYXJsc29uIDxjYXJsc29uQHh5bG9naWNzLmNvbT4KLQotCSogaTM4Ni5oIChpMzg2X3JlZ3RhYik6IEFkZCA4MDQ4NiB0ZXN0IHJlZ2lzdGVycy4KLQotTW9uIEZlYiAgNSAxODozNTo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoSV9IWCk6IERlZmluZS4KLQkoaTk2MF9vcGNvZGVzKTogQWRkIEhYIGluc3RydWN0aW9uLgotCi1Nb24gSmFuIDI5IDEyOjQzOjM5IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEZpeCB3YWl0aW5nIGZvcm1zIG9mIGZpbml0LCBmc3RlbnYsIGZzYXZlLCBmc3RzdywgZnN0Y3csCi0JYW5kIGZjbGV4LgotCi1XZWQgSmFuIDI0IDIyOjM2OjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCk6IFJlcGxhY2VzIHNwYXJjX2FyY2hpdGVjdHVyZS4KLQkoU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1ApOiBSZW5hbWVkIGZyb20gQVJDSElURUNUVVJFU19DT05GTElDVF9QLgotCShiZmRfKiBkZWZpbmVzKTogRGVsZXRlLgotCShzcGFyY19vcGNvZGVfYXJjaHMpOiBSZXBsYWNlcyBhcmNoaXRlY3R1cmVfcG5hbWUuCi0JKHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCk6IERlY2xhcmUuCi0JKE5VTU9QQ09ERVMpOiBEZWxldGUuCi0KLU1vbiBKYW4gMjIgMDg6MjQ6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKGVudW0gc3BhcmNfYXJjaGl0ZWN0dXJlKTogQWRkIHY5YS4KLQkoQVJDSElURUNUVVJFU19DT05GTElDVF9QKTogVXBkYXRlLgotCi1UaHUgRGVjIDI4IDEzOjI3OjUzIDE5OTUgIEpvaG4gSGFzc2V5ICA8aGFzc2V5QHJ0cC5kZy5jb20+Ci0KLQkqIGkzODYuaDogQWRkZWQgUGVudGl1bSBQcm8gaW5zdHJ1Y3Rpb25zLgotCi1UaHUgTm92ICAyIDIyOjU5OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBEb2N1bWVudCBuZXcgJ1cnIG9wZXJhbmQgcGxhY2UuCi0KLVR1ZSBPY3QgMjQgMTA6NDk6MTAgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IEFkZCBsY2kgYW5kIHN5bmNkbWEgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gT2N0IDIzIDExOjA5OjE2IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgotCi0JKiBtaXBzLmg6IEFkZGVkIElOU05fNDEwMCBmbGFnIHRvIG1hcmsgTkVDIFZSNDEwMCBzcGVjaWZpYwotIAlpbnN0cnVjdGlvbnMuCi0KLU1vbiBPY3QgMTYgMTA6Mjg6MTUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMuaCAoUFBDX09QQ09ERV97Q09NTU9OLEFOWX0pOiBOZXcgb3Bjb2RlIGZsYWdzIGZvcgotCWFzc2VtYmxlcidzIC1tY29tIGFuZCAtbWFueSBzd2l0Y2hlcy4KLQotV2VkIE9jdCAxMSAxNjo1NjozMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBGaXggY21weGNoZzhiIGV4dGVuc2lvbiBvcGNvZGUgZGVzY3JpcHRpb24uCi0KLVRodSBPY3QgIDUgMTg6MDM6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIFBlbnRpdW0gaW5zdHJ1Y3Rpb25zIHdybXNyLCByZHRzYywgcmRtc3IsIGNtcHhjaGc4YiwKLQlhbmQgcmVnaXN0ZXIgY3I0LgotCi1UdWUgU2VwIDE5IDE1OjI2OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBDaGFuZ2UgY29tbWVudDogc3BsaXQgdHlwZSBQIGludG8gdHlwZXMgMCwgMSBhbmQgMi4KLQotV2VkIEF1ZyAzMCAxMzo1MDo1NSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY197ZW5jb2RlLGRlY29kZX1fcHJlZmV0Y2gpOiBEZWNsYXJlLgotCi1UdWUgQXVnIDI5IDE1OjM0OjU4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV97YXNpLG1lbWJhcn0pOiBEZWNsYXJlLgotCi1XZWQgQXVnICAyIDE4OjMyOjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4a21yaS5oOiBSZW1vdmUuCi0KLQkqIG02OGsuaDogTW92ZSB0YWJsZXMgaW50byBvcGNvZGVzL202OGstb3BjLmMsIGxlYXZpbmcganVzdCB0aGUKLQlkZWNsYXJhdGlvbnMuICBSZW1vdmUgRl9BTElBUyBhbmQgZmxhZyBmaWVsZCBvZiBzdHJ1Y3QKLQltNjhrX29wY29kZS4gIENoYW5nZSBhcmNoIGZpZWxkIG9mIHN0cnVjdCBtNjhrX29wY29kZSB0byB1bnNpZ25lZAotCWludC4gIE1ha2UgbmFtZSBhbmQgYXJncyBmaWVsZHMgb2Ygc3RydWN0IG02OGtfb3Bjb2RlIGNvbnN0LgotCi1XZWQgQXVnICAyIDA4OjE2OjQ2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKEZfTk9UVjkpOiBEZWZpbmUuCi0KLVR1ZSBKdWwgMTEgMTQ6MjA6NDIgMTk5NSAgSmVmZiBTcGllZ2VsICA8amVmZnNAbHNpbC5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl80MDEwKTogRGVmaW5lLgotCi1XZWQgSnVuIDIxIDE4OjQ5OjUxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGsuaCAoVEJMMSk6IFJldmVyc2Ugc2Vuc2Ugb2YgInJvdW5kIiBhcmd1bWVudCBpbiByZXN1bHQuCi0KLQlDaGFuZ2VzIGZyb20gQW5kcmVhcyBTY2h3YWIgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT46Ci0JKiBtNjhrLmg6IEZpeCBhcmd1bWVudCBkZXNjcmlwdGlvbnMgb2YgY29wcm9jZXNzb3IKLQlpbnN0cnVjdGlvbnMgdG8gYWxsb3cgb25seSBhbHRlcmFibGUgb3BlcmFuZHMgd2hlcmUgYXBwcm9wcmlhdGUuCi0JWyFOT19ERUZBVUxUX1NJWkVTXTogQW4gb21pdHRlZCBzaXplIGRlZmF1bHRzIHRvIGB3Jy4KLQkobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBtb3JlIGFsaWFzZXMuCi0KLUZyaSBBcHIgMTQgMjI6MTU6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBBZGRlZCBleHBsY2l0bHkgc2hvcnQtc2l6ZWQgY29uZGl0aW9uYWwgYnJhbmNoZXMsIGFuZCBhCi0JYnVuY2ggb2YgYWxpYXNlcyAoZm1vdiosIGZ0ZXN0KiwgdGRpdnVsKSB0byBzdXBwb3J0IGdjYydzCi0Jc3ZyNC1iYXNlZCBjb25maWd1cmF0aW9ucy4KLQotTW9uIE1hciAxMyAyMTozMDowMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JTW9uIEZlYiAyNyAwODozNjozOSAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCSogaTM4Ni5oOiBhZGRlZCBtaXNzaW5nIERhdGExNi9EYXRhMzIgZmxhZ3MgdG8gYSBmZXcgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgTWFyICA4IDE1OjE5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChPUF9NQVNLX0ZSLCBPUF9TSF9GUik6IERlZmluZS4KLQkoT1BfTUFTS19CQ0MsIE9QX1NIX0JDQyk6IERlZmluZS4KLQkoT1BfTUFTS19QUkVGWCwgT1BfU0hfUFJFRlgpOiBEZWZpbmUuCi0JKE9QX01BU0tfQ0NDLCBPUF9TSF9DQ0MpOiBEZWZpbmUuCi0JKElOU05fUkVBRF9GUFJfUik6IERlZmluZS4KLQkoSU5TTl9SRkUpOiBEZWxldGUuCi0KLVdlZCBNYXIgIDggMDM6MTM6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oIChlbnVtIG02OGtfYXJjaGl0ZWN0dXJlKTogRGVsZXRlZC4KLQkoc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzKTogTmV3IHR5cGUuCi0JKG02OGtfb3Bjb2Rlcyk6IE5vdyBjb25zdC4gIERlbGV0ZWQgb3Bjb2RlIGFsaWFzZXMgd2l0aCBleGFjdGx5Ci0JbWF0Y2hpbmcgY29uc3RyYWludHMsIHZhbHVlcyBhbmQgZmxhZ3MuICBBcyBhIHNpZGUgZWZmZWN0IG9mIHRoaXMsCi0JdGhlIE1PVE9ST0xBX1NZTlRBWF9PTkxZIGFuZCBNSVRfU1lOVEFYX09OTFkgbWFjcm9zLCB3aGljaCBzbyBmYXIKLQlhcyBJIGtub3cgd2VyZSBuZXZlciB1c2VkLCBub3cgbWF5IG5lZWQgcmUtZXhhbWluaW5nLgotCShudW1vcGNvZGVzKTogTm93IGNvbnN0LgotCShtNjhrX29wY29kZV9hbGlhc2VzLCBudW1hbGlhc2VzKTogTmV3IHZhcmlhYmxlcy4KLQkoZW5kb3ApOiBEZWxldGVkLgotCVtET05UX0RFRklORV9UQUJMRV06IERlY2xhcmUgbnVtb3Bjb2RlcywgbnVtYWxpYXNlcywgYW5kCi0JbTY4a19vcGNvZGVfYWxpYXNlczsgdXBkYXRlIGRlY2xhcmF0aW9uIG9mIG02OGtfb3Bjb2Rlcy4KLQotTW9uIE1hciAgNiAxMDowMjowMCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChkZWxheV90eXBlKTogRGVsZXRlIHVudXNlZCBlbnVtZXJhdGlvbi4KLQkocGFfb3Bjb2RlKTogUmVwbGFjZSB1bnVzZWQgZGVsYXllZCBmaWVsZCB3aXRoIGFuIGFyY2hpdGVjdHVyZQotCWZpZWxkLgotCShwYV9vcGNvZGVzKTogTWFyayBlYWNoIGluc3RydWN0aW9uIGFzIGVpdGhlciBQQTEuMCBvciBQQTEuMS4KLQotRnJpIE1hciAgMyAxNjoxMDoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl9JU0E0KTogRGVmaW5lLgotCi1GcmkgRmViIDI0IDE5OjEzOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChNX0RMQV9BQiwgTV9ETEkpOiBEZWZpbmUuCi0KLVRodSBGZWIgMjMgMTc6MzM6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaCAoZnN0d3gpOiBGaXggc2luZ2xlLWJpdCBlcnJvci4KLQotV2VkIEZlYiAxNSAxMjoxOTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoTV9VTEQsIE1fVUxEX0EsIE1fVVNELCBNX1VTRF9BKTogRGVmaW5lLgotCi1Nb24gRmViICA2IDEwOjM1OjIzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBhZGRlZCBjcHVpZCBpbnN0cnVjdGlvbiAsIGFuZCBkclswLTddIGFsaWFzZXMgZm9yIHRoZQotCSAgZGVidWcgcmVnaXN0ZXJzLiAgRnJvbSBDaGFybGVzIEhhbm51bSAobXljcm9mdEBuZXRic2Qub3JnKS4KLQotTW9uIEZlYiAgNiAwMzozMTo1NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIEJyeWFuIEZvcmQgPGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU+IGZvciAxNi1iaXQKLQlpMzg2IHN1cHBvcnQ6Ci0JKiBpMzg2LmggKE1PVl9BWF9ESVNQMzIpOiBOZXcgbWFjcm8uCi0JKGkzODZfb3B0YWIpOiBBZGRlZCBEYXRhMTYgYW5kIERhdGEzMiBhcyBuZWVkZWQuICBBZGRlZCAidyIgZm9ybXMKLQlvZiBzZXZlcmFsIGNhbGwvcmV0dXJuIGluc3RydWN0aW9ucy4KLQkoQUREUl9QUkVGSVhfT1BDT0RFKTogTmV3IG1hY3JvLgotCi1Nb24gSmFuIDIzIDE2OjQ1OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTYXQgSmFuIDIxIDE3OjUwOjM4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiAuLi9pbmNsdWRlL29wY29kZS92YXguaCAoc3RydWN0IHZvdF93b3QsIGZpZWxkIGBhcmdzJyk6ICBtYWtlCi0JaXQgcG9pbnRlciB0byBjb25zdCBjaGFyOwotCShzdHJ1Y3Qgdm90LCBmaWVsZCBgbmFtZScpOiAgZGl0dG8uCi0KLVRodSBKYW4gMTkgMTQ6NDc6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogdmF4Lmg6IFN1cHBseSBhbmQgcHJvcGVybHkgZ3JvdXAgYWxsIHZhbHVlcyBpbiBlbmQgc2VudGluZWwuCi0KLVR1ZSBKYW4gMTcgMTA6NTU6MzAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmggKElOU05fSVNBLCBJTlNOXzQ2NTApOiBEZWZpbmUuCi0KLVdlZCBPY3QgMTkgMTM6MzQ6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhMjlrLmg6IEFkZCBvcGVyYW5kIHR5cGUgJ0knIGZvciBgaW52JyBhbmQgYGlyZXRpbnYnLiAgT24KLQlzeXN0ZW1zIHdpdGggYSBzZXBhcmF0ZSBpbnN0cnVjdGlvbiBhbmQgZGF0YSBjYWNoZSwgc3VjaCBhcyB0aGUKLQkyOTA0MCwgdGhlc2UgaW5zdHJ1Y3Rpb25zIHRha2UgYW4gb3B0aW9uYWwgYXJndW1lbnQuCi0KLVdlZCBTZXAgMTQgMTc6NDQ6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKElOU05fU1RPUkVfTUVNT1JZKTogQ29ycmVjdCB2YWx1ZSB0byBub3QgY29uZmxpY3Qgd2l0aAotCUlOU05fVFJBUC4KLQotVHVlIFNlcCAgNiAxMTozOTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoSU5TTl9TVE9SRV9NRU1PUlkpOiBEZWZpbmUuCi0KLVRodSBKdWwgMjggMTk6Mjg6MDcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogRG9jdW1lbnQgbmV3IG9wZXJhbmQgdHlwZSAneCcuCi0KLVR1ZSBKdWwgMjYgMTc6NDg6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTk2MC5oIChJX0NYMik6IE5ldyBpbnN0cnVjdGlvbiBjYXRlZ29yeS4gIEl0IGluY2x1ZGVzCi0JaW5zdHJ1Y3Rpb25zIGF2YWlsYWJsZSBvbiBDeCBhbmQgSnggcHJvY2Vzc29ycy4KLQkoSV9KWCk6IE5ldyBpbnN0cnVjdGlvbiBjYXRlZ29yeSwgZm9yIEpYLW9ubHkgaW5zdHJ1Y3Rpb25zLgotCShpOTYwX29wY29kZXMpOiBQdXQgZXNocm8gYW5kIHN5c2N0bCBpbiBJX0NYMiBjYXRlZ29yeS4gIEFkZGVkCi0JSngtb25seSBpbnN0cnVjdGlvbnMsIGluIElfSlggY2F0ZWdvcnkuCi0KLVdlZCBKdWwgMTMgMTg6NDM6NDcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbnMzMmsuaCAoZW5kb3ApOiBNYWRlIHBvaW50ZXIgY29uc3QgdG9vLgotCi1TdW4gSnVsIDEwIDExOjAxOjA5IDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBuczMyay5oOiBEcm9wIFEgb3BlcmFuZCB0eXBlIGFzIHRoZXJlIGlzIG5vIGNvcnJlY3QgdXNlCi0JZm9yIGl0LiBBZGQgSSBhbmQgWiBvcGVyYW5kIHR5cGVzIHdoaWNoIGFsbG93IGJldHRlciBjaGVja2luZy4KLQotVGh1IEp1bCAgNyAxMjozNDo0OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oICh4b3IubCkgOmZpeCBiaXQgcGF0dGVybi4KLQkoTF8yKTogTmV3IHNpemUgb2Ygb3BlcmFuZC4KLQkodHJhcGEpOiBVc2UgaXQuCi0KLUZyaSBKdW4gMTAgMTY6Mzg6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IE1vdmUgInRyYXAiIGJlZm9yZSAidHBjYyIgdG8gY2hhbmdlIGRpc2Fzc2VtYmx5LgotCi1GcmkgSnVuICAzIDE1OjU3OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IEluY2x1ZGUgdjkgZGVmaW5pdGlvbnMuCi0KLVRodSBKdW4gIDIgMTI6MjM6MTcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChtNjgwNjApOiBEZWZpbmVkLgotCShtNjgwNDB1cCwgbWZsb2F0LCBtbW11KTogSW5jbHVkZSBpdC4KLQkoc3RydWN0IG02OGtfb3Bjb2RlKTogV2lkZW4gYGFyY2gnIGZpZWxkLgotCShtNjhrX29wY29kZXMpOiBVcGRhdGVkIGZvciBNNjgwNjAuICBSZW1vdmVkIGNvbW1lbnRzIHRoYXQgd2VyZQotCWluc3RydWN0aW9ucyBjb21tZW50ZWQgb3V0IGJ5ICJKRiIgeWVhcnMgYWdvLgotCi1UaHUgQXByIDI4IDE4OjMxOjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAoc3RydWN0IG02OGtfb3Bjb2RlKTogU2hvcnRlbiBgYXJjaCcgZmllbGQgdG8gOCBiaXRzLCBhbmQKLQlhZGQgYSBvbmUtYml0IGBmbGFncycgZmllbGQuCi0JKEZfQUxJQVMpOiBOZXcgbWFjcm8uCi0KLVdlZCBBcHIgMjcgMTE6Mjk6NTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoZGVjLCBpbmMpOiBHZXQgZW5jb2RpbmcgcmlnaHQuCi0KLU1vbiBBcHIgIDQgMTM6MTI6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaCAoc3RydWN0IHBvd2VycGNfb3BlcmFuZCk6IFJlbW92ZWQgc2lnbmVkcCBmaWVsZDsganVzdCB1c2UKLQlhIGZsYWcgaW5zdGVhZC4KLQkoUFBDX09QRVJBTkRfU0lHTkVEKTogRGVmaW5lLgotCShQUENfT1BFUkFORF9TSUdOT1BUKTogRGVmaW5lLgotCi1UaHUgTWFyIDMxIDE5OjM0OjA4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoSVNfSlVNUF9PTl9FQ1hfWkVSTywgImpjeHoiIHBhdHRlcm4pOiBPcGVyYW5kIHNpemUKLQlwcmVmaXggaXMgMHg2Niwgbm90IDB4NjcuICBQYXRjaCBmcm9tIEguSi4gTHUgKGhsdUBueW5leHN0LmNvbSkuCi0KLVRodSBNYXIgIDMgMTU6NTE6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBSZXZlcnNlIGxhc3QgY2hhbmdlLiAgSXQnbGwgYmUgaGFuZGxlZCBpbiBnYXMgaW5zdGVhZC4KLQotVGh1IEZlYiAyNCAxNToyOTowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKHNhcik6IERpc2FibGVkIHRoZSB0d28tb3BlcmFuZCBJbW0xIGZvcm0sIHNpbmNlIGl0IHdhcwotCXNsb3dlciBvbiB0aGUgNDg2IGFuZCB1c2VkIHRoZSBpbXBsaWNpdCBzaGlmdCBjb3VudCBkZXNwaXRlIHRoZQotCWV4cGxpY2l0IG9wZXJhbmQuICBUaGUgb25lLW9wZXJhbmQgZm9ybSBpcyBzdGlsbCBhdmFpbGFibGUgdG8gZ2V0Ci0JdGhlIHNob3J0ZXIgZm9ybSB3aXRoIHRoZSBpbXBsaWNpdCBzaGlmdCBjb3VudC4KLQotVGh1IEZlYiAxNyAxMjoyNzo1MiAxOTk0ICBUb3Jiam9ybiBHcmFubHVuZCAgKHRlZ2VAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBocHBhLmg6IEZpeCB0eXBvIGluIGZzdHdzIGFyZyBzdHJpbmcuCi0KLVdlZCBGZWIgIDkgMjE6MjM6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaCAoc3RydWN0IHBvd2VycGNfb3Bjb2RlKTogTWFrZSBvcGVyYW5kcyBmaWVsZCB1bnNpZ25lZC4KLQotTW9uIEZlYiAgNyAxOToxNDo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oIChQUENfT1BDT0RFXzYwMSk6IERlZmluZS4KLQotRnJpIEZlYiAgNCAyMzo0Mzo1MCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChhZGRiKTogVXNlICdAJyBmb3IgYWRkYiBhbmQgYWRkaWIgcHNldWRvIG9wcy4KLQkoc28gd2UgY2FuIGRldGVybWluZSB2YWxpZCBjb21wbGV0ZXJzIGZvciBib3RoIGFkZGIgYW5kIGFkZGJbdGZdLikKLQotCSogaHBwYS5oICh4bXB5dSk6IE5vIGZsb2F0aW5nIHBvaW50IGZvcm1hdCBzcGVjaWZpZXIgZm9yIHRoZQotCXhtcHl1IGluc3RydWN0aW9uLgotCi1GcmkgRmViICA0IDIzOjM2OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmggKFBQQ19PUEVSQU5EX05FWFQpOiBEZWZpbmUuCi0JKFBQQ19PUEVSQU5EX05FR0FUSVZFKTogQ2hhbmdlIHZhbHVlIHRvIG1ha2Ugcm9vbSBmb3IgYWJvdmUuCi0JKHN0cnVjdCBwb3dlcnBjX21hY3JvKTogRGVmaW5lLgotCShwb3dlcnBjX21hY3JvcywgcG93ZXJwY19udW1fbWFjcm9zKTogRGVjbGFyZS4KLQotRnJpIEphbiAyMSAxOToxMzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oOiBOZXcgZmlsZS4gIEhlYWRlciBmaWxlIGZvciBQb3dlclBDIG9wY29kZSB0YWJsZS4KLQotTW9uIEphbiAxNyAwMDoxNDoyMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oOiBNb3JlIG1pbm9yIHRlbXBsYXRlIGZpeGVzIGZvciBzZnUgYW5kIGNvcHIgKHRvIGFsbG93Ci0JZm9yIGVhc2llciBkaXNhc3NlbWJseSkuCi0KLQkqIGhwcGEuaDogRml4IHRlbXBsYXRlcyBmb3IgYWxsIHRoZSBzZnUgYW5kIGNvcHIgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgRGVjIDE1IDE1OjEyOjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAocHVzaCk6IFBlcm1pdCBJbW0xNiBvcGVyYW5kIHRvby4KLQotU2F0IERlYyAxMSAxNjoxNDowNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogIGg4MzAwLmggKGFuZGMpOiBFeGlzdHMgaW4gYmFzZSBhcmNoLgotCi1XZWQgRGVjICAxIDEyOjE1OjMyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBGcm9tIEhpc2FzaGkgTUlOQU1JTk8gPG1pbmFtaW5vQHNyYW1oYy5zcmEuY28uanA+Ci0JKiBocHBhLmg6ICN1bmRlZiBOT05FIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggaGl1eCBpbmNsdWRlIGZpbGVzLgotCi1TdW4gTm92IDIxIDIyOjA2OjU3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmg6IEFkZCBGUCBxdWFkd29yZCBzdG9yZSBpbnN0cnVjdGlvbnMuCi0KLVdlZCBOb3YgMTcgMTc6MTM6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IChNX0pfQSk6IEFkZGVkLgotCShNX0xBKTogUmVtb3ZlZC4KLQotTW9uIE5vdiAgOCAxMjoxMjo0NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoT1BfTUFTS19DQUNIRSwgT1BfU0hfQ0FDSEUpOiBEZWZpbmUuICBGcm9tIFRlZCBMZW1vbgotCTxtZWxsb25AcGVwcGVyLm5jZC5jb20+LgotCi1TdW4gTm92ICA3IDAwOjMwOjExIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmg6IEltbWVkaWF0ZSBmaWVsZCBpbiBwcm9iZWkgaW5zdHJ1Y3Rpb25zIGlzIHVuc2lnbmVkLAotCW5vdCBsb3ctc2lnbiBleHRlbmRlZC4KLQotV2VkIE5vdiAgMyAxMDozMDowMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oIChSUkkxME1BU0spOiBDaGFuZ2UgZnJvbSAweGZjMDBmZmUwIHRvIDB4ZmMwMGZjMDAuCi0KLVR1ZSBOb3YgIDIgMTI6NDE6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogQWRkICJmeGNoIiB3aXRob3V0IG9wZXJhbmQuCi0KLU1vbiBOb3YgIDEgMTg6MTM6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE1fSkFMXzEsIE1fSkFMXzIsIE1fSkFMX0EpOiBBZGRlZC4KLQotU2F0IE9jdCAgMiAyMjoyNjoxMSAxOTkzICBKZWZmcmV5IEEgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmg6IEFkZCBnZncgYW5kIGdmciB0byB0aGUgb3Bjb2RlIHRhYmxlLgotCi1XZWQgU2VwIDI5IDE2OjIzOjAwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oOiBleHRlbmRlZCB0byBoYW5kbGUgbTg4MTEwLgotCi1UdWUgU2VwIDI4IDE5OjE5OjA4IDE5OTMgIEplZmZyZXkgQSBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaCAoYmUsIGJsZSk6IFVzZSBvcGVyYW5kIHR5cGUgJ3onIHRvIGRlbm90ZSBhYnNvbHV0ZSBicmFuY2gKLQlhZGRyZXNzZXMuCi0KLVR1ZSBTZXAgMTQgMTQ6MDQ6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpOTYwLmggKGk5NjBfb3Bjb2Rlcyk6IFByb3Blcmx5IGJyYWNrZXQgaW5pdGlhbGl6ZXJzLgotCi1Nb24gU2VwIDEzIDEyOjUwOjUyIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oIChCT0ZMQUcpOiByZXdyaXRlIHRvIGF2b2lkIG5lc3RlZCBjb21tZW50LgotCi1Nb24gU2VwIDEzIDE1OjQ2OjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oICh0d28pOiBQcm90ZWN0IHNlY29uZCBhcmd1bWVudCB3aXRoIHBhcmVudGhlc2VzLgotCi1GcmkgU2VwIDEwIDE2OjI5OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWRkZWQgbmV3IGluc3RydWN0aW9uICJyc20iIChmb3IgaTM4NnNsKS4KLQlEZWxldGVkIG9sZCBpbi9vdXQgaW5zdHJ1Y3Rpb25zIGluICIjaWYgMCIgc2VjdGlvbi4KLQotVGh1IFNlcCAgOSAxNzo0MjoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IFByb3Blcmx5IGJyYWNrZXQgaW5pdGlhbGl6ZXJzLgotCi1XZWQgQXVnIDI1IDEzOjUwOjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGUpOiBVc2UgJ3wnIGZvciBtb3ZiIGFuZCBtb3ZpYiBpbnNucy4gIChGcm9tCi0JSmVmZiBMYXcsIGxhd0Bjcy51dGFoLmVkdSkuCi0KLU1vbiBBdWcgMjMgMTY6NTU6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKGxjYWxsKTogQWNjZXB0IEltbTMyIG9wZXJhbmQgYWxzby4KLQotTW9uIEF1ZyAyMyAxMjo0MzoxMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTV9BQlNVKTogUmVtb3ZlZCAoYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgbnVtYmVyPz8pLgotCShNX0RBQlMpOiBBZGRlZC4KLQotVGh1IEF1ZyAxOSAxNTowODozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoSU5TTl8qKTogQ2hhbmdlZCB2YWx1ZXMuICBSZW1vdmVkIHVudXNlZCBkZWZpbml0aW9ucy4KLQlBZGRlZCBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSwgSU5TTl9JU0EyIGFuZCBJTlNOX0lTQTMuICBTcGxpdAotCUlOU05fTE9BRF9ERUxBWSBpbnRvIElOU05fTE9BRF9NRU1PUllfREVMQVkgYW5kCi0JSU5TTl9MT0FEX0NPUFJPQ19ERUxBWS4gIFNwbGl0IElOU05fQ09QUk9DX0RFTEFZIGludG8KLQlJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZIGFuZCBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkuCi0JKE1fKik6IEFkZGVkIG5ldyB2YWx1ZXMgZm9yIHI2MDAwIGFuZCByNDAwMCBtYWNyb3MuCi0JKEFOWV9ERUxBWSk6IFJlbW92ZWQuCi0KLVdlZCBBdWcgMTggMTU6Mzc6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IEFkZGVkIE1fTElfUyBhbmQgTV9MSV9TUy4KLQotVHVlIEF1ZyAxNyAwNzowODowOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBHZXQgc29tZSByYXJlIG1vdi5icyBjb3JyZWN0LgotCi1UaHUgQXVnICA1IDA5OjE1OjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBEb24ndCBkZWZpbmUgY29uc3Qgb3Vyc2VsZjsgcmVseSBvbiBhbnNpZGVjbC5oIGhhdmluZwotCWJlZW4gaW5jbHVkZWQuCi0KLUZyaSBKdWwgMzAgMTg6NDE6MTEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKEZfSlNSLCBGX1VOQlIsIEZfQ09OREJSKTogIEFkZCBuZXcgZmxhZ3MgdG8gbWFyawotCWp1bXAgaW5zdHJ1Y3Rpb25zLCBmb3IgdXNlIGluIGRpc2Fzc2VtYmxlcnMuCi0KLVRodSBKdWwgMjIgMDc6MjU6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtODhrLmg6IE1ha2UgYml0ZmllbGRzIGp1c3QgdW5zaWduZWQsIG5vdCB1bnNpZ25lZCBsb25nIG9yCi0JdW5zaWduZWQgc2hvcnQuCi0KLVdlZCBKdWwgMjEgMTE6NTU6MzEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogTmV3IGFyZ3VtZW50IHR5cGUgJ3knLiAgVXNlIGluIHZhcmlvdXMgZmxvYXQgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gSnVsIDE5IDE3OjE3OjAzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocHBhLmggKGJyZWFrKTogRmlyc3QgaW1tZWRpYXRlIGZpZWxkIGlzIHVuc2lnbmVkLgotCi0JKiBocHBhLmg6IEFkZCByZmlyIGluc3RydWN0aW9uLgotCi1TdW4gSnVsIDE4IDE2OjI4OjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBTcGxpdCB0aGUgYWN0dWFsIHRhYmxlIG91dCBpbnRvIC4uLy4uL29wY29kZXMvbWlwcy1vcGMuYy4KLQotRnJpIEp1bCAxNiAwOTo1OToyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogUmV3b3JrZWQgdGhlIGhhemFyZCBpbmZvcm1hdGlvbiBzb21ld2hhdCwgYW5kIGZpeGVkIHNvbWUKLQlidWdzIGluIHRoZSBpbnN0cnVjdGlvbiBoYXphcmQgZGVzY3JpcHRpb25zLgotCi1UaHUgSnVsIDE1IDEyOjQyOjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oOiBDb3JyZWN0ZWQgYSBjb3VwbGUgb2Ygb3Bjb2Rlcy4KLQotVHVlIEp1bCAgNiAxNToxNzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogUmVwbGFjZWQgd2l0aCB2ZXJzaW9uIGZyb20gUmFscGggQ2FtcGJlbGwgYW5kIE9TRi4gIFRoZQotCW5ldyB2ZXJzaW9uIGluY2x1ZGVzIGluc3RydWN0aW9uIGhhemFyZCBpbmZvcm1hdGlvbiwgYnV0IGlzCi0Jb3RoZXJ3aXNlIHJlYXNvbmFibHkgc2ltaWxhci4KLQotVGh1IEp1bCAgMSAyMDozNjoxNyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBGaXggdHlwbyBpbiBVTk9QMyAoYWZmZWN0ZWQgc2hbYWxdW2xyXS5sKS4KLQotRnJpIEp1biAxMSAxODozODo0NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCVBhdGNoZXMgZnJvbSBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1OgotCSogaHBwYS5oOiBDbGVhbiB1cCBzb21lIG9mIHRoZSBPTERfVEFCTEUsIG5vbi1PTERfVEFCTEUgYnJhaW5kYW1hZ2UuCi0JTWFrZSB0aGUgdGFibGVzIGJlIHRoZSBzYW1lIGZvciB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uczoKLQkiYmIiLCAiYWRkYlt0Zl0iLCAiYWRkaWJbdGZdIiwgImFkZCIsICJhZGRbbG9jXSIsICJhZGRjbyIsCi0JInNoWzEyM11hZGQiLCAic2hbMTIzXWFkZFtsb10iLCAic3ViIiwgInN1YltvYnRdIiwgInN1YltidF1vIiwKLQkiZHMiLCAiY29tY2xyIiwgImFkZGkiLCAiYWRkaVtvdF0iLCAiYWRkaXRvIiwgInN1YmkiLCAic3ViaW8iLAotCSJjb21pY2xyIiwgImZhZGQiLCAiZnN1YiIsICJmbXB5IiwgImZkaXYiLCAiZnNxcnQiLCAiZmFicyIsCi0JImZybmQiLCAiZmNweSIsICJmY252ZmYiLCAiZmNudnhmIiwgImZjbnZmeCIsICJmY252Znh0IiwKLQkiZmNtcCIsIGFuZCAiZnRlc3QiLgotCi0JKiBocHBhLmg6IE1ha2UgbmV3IGFuZCBvbGQgdGFibGVzIHRoZSBzYW1lIGZvciAiYnJlYWsiLCAibXRjdGwiLAotCSJtZmN0bCIsICJiYiIsICJzc20iLCAicnNtIiwgInhtcHl1IiwgImZtcHlhZGQiLCAiZm1weXN1YiIuCi0JRml4IHR5cG8gaW4gbGFzdCBwYXRjaC4gIENvbGxhcHNlIHNldmVyYWwgI2lmZGVmcyBpbnRvIGEKLQlzaW5nbGUgI2lmZGVmLgotCi0JKiBocHBhLmg6IERlbGV0ZSByZW1haW5pbmcgT0xEX1RBQkxFIGNvZGUuICBCcmluZyBzb21lCi0Jb2YgdGhlIGNvbW1lbnRzIHVwLXRvLWRhdGUuCi0KLQkqIGhwcGEuaDogVXBkYXRlICJmcmVlIGxpc3QiIG9mIGxldHRlcnMgYW5kIHVwZGF0ZQotCWNvbW1lbnRzIGRlc2NyaWJpbmcgZWFjaCBsZXR0ZXIncyBmdW5jdGlvbi4KLQotRnJpIEp1biAgNCAxNTo0MTozNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBjaGVja3BvaW50LCBpbmNsdWRlcyBIOC8zMDAtSCBvcGNvZGVzLgotCi1UaHUgSnVuICAzIDE1OjQyOjU5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIFBhdGNoZXMgZnJvbSBKZWZmcmV5IExhdyA8bGF3QGNzLnV0YWguZWR1Pi4KLQkqIGhwcGEuaDogUmV3b3JrIHNpbmdsZSBwcmVjaXNpb24gRlAKLQlpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGV5IGNvcnJlY3RseSBkaXNhc3NlbWJsZSBjb2RlCi0JUEExLjEgY29kZS4KLQotVGh1IE1heSAyNyAxOToyMToyMiAxOTkzICBCcnVjZSBCYXVtYW4gIChib290QG9zZi5vcmcpCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYiwgbW92IHBhdHRlcm4pOiBSZW1vdmUgTWVtMTYgcmVzdHJpY3Rpb24gZnJvbQotCW1vdiB0byBhbGxvdyBpbnN0cnVjdGlvbnMgbGlrZSBtb3Ygc3MseHl6KGVjeCkgdG8gYXNzZW1ibGUuCi0KLVR1ZSBNYXkgMjUgMDA6Mzk6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogVXNlIG5ldyB2ZXJzaW9uIGZyb20gVXRhaCBpZiBPTERfVEFCTEUgaXNuJ3QgZGVmaW5lZDsKLQlnZGIgd2lsbCBkZWZpbmUgaXQgZm9yIG5vdy4KLQotTW9uIE1heSAyNCAxNToyMDowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IERvbid0IGVuZCBlbnVtZXJhdG9yIGxpc3Qgd2l0aCBjb21tYS4KLQotRnJpIE1heSAxNCAxNToxNTo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIEJhc2VkIG9uIHBhdGNoZXMgZnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOgotCSogbWlwcy5oIChPUF9NQVNLX0NPUFosIE9QX1NIX0NPUFopOiBEZWZpbmUuCi0JKCJiYzJ0Iik6IENvcnJlY3QgdHlwby4KLQkoIltsc113Y1swMjNdIik6IFVzZSBUIHJhdGhlciB0aGFuIHQuCi0JKCJjWzAxMjNdIik6IERlZmluZSBnZW5lcmFsIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucy4KLQotTW9uIE1heSAxMCAwNjowMjoyNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBNb3ZlIHNwbGl0IHBvaW50IGZvciBnY2MgY29tcGlsYXRpb24gbW9yZSB0b3dhcmRzCi0JbWlkZGxlLgotCi1GcmkgQXByICA5IDEzOjI2OjE2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiByczZrLmg6IENsZWFuIHVwIGluc3RydWN0aW9ucyBmb3IgcHJpbWFyeSBvcGNvZGUgMTkgKG1hbnkgd2VyZQotCXNpbXBseSB3cm9uZywgaWNzLCByZmksICYgcmZzdmMgd2VyZSBtaXNzaW5nKS4KLQlBZGQgImEiIHRvIG9wcl9leHQgZm9yICJiYiIuICBEb2MgZml4LgotCi1UaHUgTWFyIDE4IDEzOjQ1OjMxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiAgNDg2IGV4dGVuc2lvbnMgZnJvbSBKb2huIEhhc3NleSAoaGFzc2V5QGRnLXJ0cC5kZy5jb20pLgotCSogbWlwcy5oOiAgQWRkIGNhc3RzLCB0byBzdXBwcmVzcyB3YXJuaW5ncyBhYm91dCBzaGlmdGluZyB0b28gbXVjaC4KLQkqIG02OGsuaDogIERvY3VtZW50IHRoZSBwbGFjZW1lbnQgY29kZSAnOScuCi0KLVRodSBGZWIgMTggMDI6MDM6MTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAoQlJFQUtfVVBfQklHX0RFQ0wsIEFORF9PVEhFUl9QQVJUKTogIEFkZCBrbHVkZ2Ugd2hpY2gKLQlhbGxvd3MgY2FsbGVycyB0byBicmVhayB1cCB0aGUgbGFyZ2UgaW5pdGlhbGl6ZWQgc3RydWN0IGZ1bGwgb2YKLQlvcGNvZGVzIGludG8gdHdvIGhhbGYtc2l6ZWQgb25lcy4gIFRoaXMgcGVybWl0cyBHQ0MgdG8gY29tcGlsZQotCXRoaXMgbW9kdWxlLCBzaW5jZSBpdCB0YWtlcyBleHBvbmVudGlhbCBzcGFjZSBmb3IgaW5pdGlhbGl6ZXJzLgotCShudW1vcGNvZGVzLCBlbmRvcCk6ICBSZXZpc2UgdG8gdXNlIEFORF9PVEhFUl9QQVJUIGluIHNpemUgY2FsY3MuCi0KLVRodSBGZWIgIDQgMDI6MDY6NTYgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGEyOWsuaDogIFJlbW92ZSBSQ1MgY3J1ZCwgdXBkYXRlIEdQTCB0byB2MiwgdXBkYXRlIGNvcHlyaWdodHMuCi0JKiBjb252ZXguaDogIEFkZGVkLCBmcm9tIEdEQidzIGNvbnZ4LW9wY29kZS5oLiAgQWRkZWQgQ09OU1QgdG8gYWxsCi0JaW5pdGlhbGl6ZWQgc3RydWN0cyBpbiBpdC4KLQotVGh1IEphbiAyOCAyMTozMjoyMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCURlbHRhIDg4IGNoYW5nZXMgaW5zcGlyZWQgYnkgQ2FybCBHcmVjbywgPGNncmVjb0BDcmVpZ2h0b24uRWR1PjoKLQkqIG04OGsuaCAoUE1FTSk6ICBBdm9pZCBwcmV2aW91cyBkZWZpbml0aW9uIGZyb20gPHN5cy9wYXJhbS5oPi4KLQkoQU5EKTogIENoYW5nZSB0byBBTkRfIHRvIGF2b2lkIGFuc2lkZWNsLmggYEFORCcgY29uZmxpY3QuCi0KLVNhdCBKYW4gMjMgMTg6MTA6NDkgUFNUIDE5OTMgIFJhbHBoIENhbXBiZWxsICAocmFscGhjQHB5cmFtaWQuY29tKQotCi0JKiBtaXBzLmg6IGRvY3VtZW50ICJpIiBhbmQgImoiIG9wZXJhbmRzIGNvcnJlY3RseS4KLQotVGh1IEphbiAgNyAxNTo1ODoxMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogUmVtb3ZlZCBlbmRpYW5uZXNzIGRlcGVuZGVuY3kuCi0KLVN1biBKYW4gIDMgMTQ6MTM6MzUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IGluY2x1ZGUgaW5mbyBvbiBudW1iZXIgb2YgY3ljbGVzIHBlciBpbnN0cnVjdGlvbi4KLQotTW9uIERlYyAyMSAyMToyOTowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmg6ICBNb3ZlIGhhbmR5IGFsaWFzZXMgdG8gdGhlIGZyb250LiAgRml4IG1hc2tzIGZvciBleHRyYWN0Ci0JYW5kIGRlcG9zaXQgaW5zdHJ1Y3Rpb25zLgotCi1TYXQgRGVjIDEyIDE2OjA5OjQ4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBhY2NlcHQgc2hsZCBhbmQgc2hyZCBib3RoIHdpdGggYW5kIHdpdGhvdXQgdGhlIHNoaWZ0Ci0JY291bnQgYXJndW1lbnQsIHdoaWNoIGlzIGFsd2F5cyAlY2wuCi0KLUZyaSBOb3YgMjcgMTc6MTM6MTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuIGF0IGN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYl9lbmQsIGkzODZfcmVndGFiX2VuZCk6IE5vdyBjb25zdC4KLQkob25lX2J5dGVfc2VnbWVudF9kZWZhdWx0cywgdHdvX2J5dGVfc2VnbWVudF9kZWZhdWx0cywKLQlpMzg2X3ByZWZpeHRhYl9lbmQpOiBEaXR0by4KLQotTW9uIE5vdiAyMyAxMDo0NzoyNSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogdmF4LmggKGJiKik6IFVzZSAidiIgKGJpdGZpZWxkIHR5cGUpLCBub3QgImEiIChhZGRyZXNzIG9wZXJhbmQpCi0JZm9yIG9wZXJhbmQgMjsgZnJvbSBKb2huIENhcnIsIGpmY0Bkc2cuZGVjLmNvbS4KLQotV2VkIE5vdiAgNCAwNzozNjo0OSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBEZWZpbmUgRklYRURfU0laRV9CUkFOQ0gsIHNvIGJzciBhbmQgYnJhIGluc3RydWN0aW9ucwotCWFsd2F5cyB1c2UgMTYtYml0IG9mZnNldHMuICBNYWtlcyBjYWxjdWxhdGVkLXNpemUganVtcCB0YWJsZXMKLQlmZWFzaWJsZS4KLQotRnJpIE9jdCAxNiAyMjo1Mjo0MyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBGaXggb25lLW9wZXJhbmQgZm9ybXMgb2YgaW4qIGFuZCBvdXQqIHBhdHRlcm5zLgotCi1UdWUgU2VwIDIyIDE0OjA4OjE0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBBZGRlZCBDUFUzMiBzdXBwb3J0LgotCi1UdWUgU2VwIDIyIDAwOjM4OjQxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKGJyZWFrKTogIERpc2Fzc2VtYmxlIHRoZSBhcmd1bWVudC4gIFBhdGNoIGZyb20KLQlqb25hdGhhbkBjcy5zdGFuZm9yZC5lZHUgKEpvbmF0aGFuIFN0b25lKS4KLQotV2VkIFNlcCAgOSAxMToyNToyOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogbWVyZ2VkIE1vdG9yb2xhIGFuZCBNSVQgc3ludGF4LgotCi1UaHUgU2VwICAzIDA5OjMzOjIyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKHBtb3ZlKTogbWFrZSB0aGUgdGVzdHMgbGVzcyBzdHJpY3QsIHRoZSA2OGsgYm9vayBpcwotCXdyb25nLgotCi1UdWUgQXVnIDI1IDIzOjI1OjE5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChtNjhlYzAzMCk6IERlZmluZWQgYXMgYWxpYXMgZm9yIDY4MDMwLgotCShtNjhrX29wY29kZXMpOiBOZXcgdHlwZSBjaGFyYWN0ZXJzICIzIiBmb3IgNjgwMzAgTU1VIHJlZ3MgYW5kICJ0IgotCWZvciBpbW1lZGlhdGUgMC03IGFkZGVkLiAgU2V0IHVwIHNvbWUgb3Bjb2RlcyAocHRlc3QsIGJrcHQpIHRvIHVzZQotCXRoZW0uICBUaWdodGVuZWQgZGVzY3JpcHRpb24gb2YgImZtb3ZleCIgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbQotCXNvbWUgInBtb3ZlIiBlbmNvZGluZ3MuICBBZGRlZCAicG1vdmUiIGZvciA2ODAzMCBNTVUgcmVncywgY2xlYW5lZAotCXVwIGRlc2NyaXB0aW9ucyB0aGF0IGNsYWltZWQgdmVyc2lvbnMgd2VyZSBhdmFpbGFibGUgZm9yIGNoaXBzIG5vdAotCXN1cHBvcnRpbmcgdGhlbS4gIEFkZGVkICJwbW92ZWZkIi4KLQotTW9uIEF1ZyAyNCAxMjowNDo1MSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBmaXggd2hlcmUgdGhlIC4gZ29lcyBpbiBkaXZ1bGwKLQotV2VkIEF1ZyAxOSAxMToyMjoyNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogdGhlIGNhczIgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUgd3JpdHRlbiB3aXRoCi0JaW5kaXJlY3Rpb24gb24gdGhlIGxhc3QgdHdvIG9wZXJhbmRzLCB3aGljaCBjYW4gYmUgZWl0aGVyIGRhdGEgb3IKLQlhZGRyZXNzIHJlZ2lzdGVycy4gIEFkZGVkIGEgbmV3IG9wZXJhbmQgdHlwZSAncicgd2hpY2ggYWNjZXB0cwotCWVpdGhlciByZWdpc3RlciB0eXBlLiAgQWRkZWQgbmV3IGNhc2VzIGZvciBjYXMybCBhbmQgY2FzMncgd2hpY2gKLQl1c2UgdGhlbS4gIENvcnJlY3RlZCBtYXNrcyBmb3IgY2FzMiB3aGljaCBmYWlsZWQgdG8gcmVjb2duaXplIHVzZQotCW9mIGFkZHJlc3MgcmVnaXN0ZXIuCi0KLUZyaSBBdWcgMTQgMTQ6MjA6MzggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogIE1lcmdlZCBpbiBwYXRjaGVzIChtb3N0bHkgbTY4MDQwLXNwZWNpZmljKSBmcm9tCi0JQ29saW4gU21pdGggPGNvbGluQHdycy5jb20+LgotCi0JKiBtNjhrLmg6ICBNZXJnZWQgbTY4a21yaS5oIGFuZCBtNjhrLmggKHVzaW5nIHRoZSBmb3JtZXIgYXMgYQotCWJhc2UpLiAgQWxzbyBjbGVhbmVkIHVwIGR1cGxpY2F0ZXMsIHJlLW9yZGVyZWQgaW5zdHJ1Y3Rpb25zIGZvcgotCXRoZSBzYWtlIG9mIGRpcy1hc3NlbWJsaW5nIChzbyBhbGlhc2VzIGNvbWUgYWZ0ZXIgc3RhbmRhcmQgbmFtZXMpLgotCSogbTY4a21yaS5oOiBOb3cganVzdCBkZWZpbmVzIHNvbWUgbWFjcm9zLCBhbmQgI2luY2x1ZGVzIG02OGsuaC4KLQotV2VkIEF1ZyAxMiAxNjozODoxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbTY4a21yaS5oOiBhZGRlZCB2YXJpb3VzIG9wY29kZXMuIE1vdmVkIGpieHggdG8gYnh4ZXMuIEZpbGxlZCBpbgotCWFsbCBtaXNzaW5nIC5zCi0KLU1vbiBBdWcgMTAgMjM6MjI6MzMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IE1vdmVkIHRhYmxlcyB0byBCRkQgbGlicmFyeS4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWRkIGZpbGRxLCBmaXN0cHEgYWxpYXNlcyB1c2VkIGJ5IGdjYy4KLQotU3VuIEp1biAyOCAxMzoyOTowMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogIEZpbmlzaCBmaWxsaW5nIGluIGFsbCB0aGUgaG9sZXMgaW4gdGhlIG9wY29kZSB0YWJsZSwKLQlzbyB0aGF0IHRoZSBMdWNpZCBDIGNvbXBpbGVyIGNhbiBkaWdlc3QgdGhpcyBhcyB3ZWxsLi4uCi0KLUZyaSBKdW4gMjYgMjE6Mjc6MTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogIEFkZCBzZXRjLCBzZXRuYywgYWRkcjE2LCBkYXRhMTYsIHJlcHosIHJlcG56IGFsaWFzZXMuCi0JRml4IG9wY29kZXMgb24gdmFyaW91cyBzaXplcyBvZiBmaWxkL2Zpc3QgaW5zdHJ1Y3Rpb25zCi0JKDE2Yml0PW5vIHN1ZmZpeCwgMzJiaXQ9ImwiIHN1ZmZpeCwgNjRiaXQ9ImxsIiBzdWZmaXgpLgotCVVzZSB0YWJzIHRvIGluZGVudCBmb3IgY29tbWVudHMuICBGaXhlcyBzdWdnZXN0ZWQgYnkgTWluaCBUcmFuLUxlLgotCi1UaHUgSnVuIDI1IDE2OjEzOjI2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6ICBGaWxsIGluIGFsbCB0aGUgaG9sZXMgaW4gdGhlIG9wY29kZSB0YWJsZSBzbyB0aGF0IHRoZQotCWxvc2luZyBIUFVYIEMgY29tcGlsZXIgY2FuIGRpZ2VzdCB0aGlzLi4uCi0KLVRodSBKdW4gMTEgMTI6MTU6MjUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogIEZpeCBkZWNvZGluZyBvZiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMsIHNvbWV3aGF0LgotCShGaXggYnkgRXJpYyBBbmRlcnNvbiwgM2plYW5AbWFhcy1uZW90ZWsuYXJjLm5hc2EuZ292LikKLQotVGh1IE1heSAyOCAxMToxNzo0NCAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IEFkZCBuZXcgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgc3BhcmNsaXRlOyBhZGQgaXRzIHNjYW4KLQlhbmQgZGl2c2NjIG9wY29kZXMuICBEZWZpbmUgQVJDSElURUNUVVJFU19DT05GTElDVF9QIG1hY3JvLgotCi1UdWUgTWF5ICA1IDE0OjIzOjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiAgQWRkIHNvbWUgbW9yZSBvcGNvZGUgc3lub255bXMgKGZyb20gRnJhbmsgWWVsbGluLAotCWZ5QGx1Y2lkLmNvbSkuCi0KLVRodSBBcHIgMTYgMTg6MjU6MjYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHJzNmsuaDogIE5ldyB2ZXJzaW9uIGZyb20gSUJNIChNZXRpbikuCi0KLVRodSBBcHIgIDkgMDA6MzE6MTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiByczZrLmg6IEZpeCBpbmNvcnJlY3QgZXh0ZW5kZWQgb3Bjb2RlIGZvciBpbnN0cnVjdGlvbnMgYGZtJwotICAgICAgICBhbmQgYGZkJy4gIChGcm9tIG1ldGluQGlibXBhLmF3ZHBhLmlibS5jb20gKE1ldGluIEcuIE96aXNpaykuKQotCi1UdWUgQXByICA3IDEzOjM4OjQ3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJzNmsuaDogIE1vdmUgZnJvbSAuLi8uLi9nZGIvcnM2ay1vcGNvZGUuaC4KLQotRnJpIEFwciAgMyAxMTozMDoyMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChvbmUsIHR3byk6ICBDYXN0IG1hY3JvIGFyZ3MgdG8gdW5zaWduZWQgdG8gc3VwcHJlc3MKLQljb21wbGFpbnRzIGZyb20gY29tcGlsZXIgYW5kIGxpbnQgYWJvdXQgaW50ZWdlciBvdmVyZmxvdyBkdXJpbmcKLQlzaGlmdC4KLQotU3VuIE1hciAyOSAxMjoyMjowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoT1ApOiAgQXZvaWQgc2lnbmVkIG92ZXJmbG93IHdoZW4gc2hpZnRpbmcgdG8gaGlnaCBvcmRlciBiaXQuCi0KLUZyaSBNYXIgIDYgMDA6MjI6MzggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogIE1ha2UgYml0ZmllbGQgbGF5b3V0IGRlcGVuZCBvbiB0aGUgSE9TVCBjb21waWxlciwKLQlub3Qgb24gdGhlIFRBUkdFVCBzeXN0ZW0uCi0KLUZyaSBGZWIgMjEgMDE6Mjk6NTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogYWRkZWQgaW5iLCBpbncsIG91dGIsIG91dHcgb3Bjb2RlcywgYWRkZWQgYXR0IHN5bnRheCBmb3IKLQkgIHNjbXAsIHNsb2QsIHNtb3YsIHNzY2EsIHNzdG8uICBDdXJ0ZXN5IE1pbmggVHJhbi1MZQotCSAgPFRSQU5MRUBJTlRFTExJQ09SUC5DT00+LgotCi1UaHUgSmFuIDMwIDA3OjMxOjQ0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiB0dXJuZWQgb3BfdHlwZSBlbnVtIGludG8gI2RlZmluZSBsaXN0Ci0KLVRodSBKYW4gMzAgMDE6MDc6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6ICBSZW1vdmUgImN5cHJlc3MiIGFyY2hpdGVjdHVyZS4gIFJlbW92ZSAiZml0b3giIGFuZAotCXNpbWlsYXIgaW5zdHJ1Y3Rpb25zIC0tIHRoZXkndmUgYmVlbiByZW5hbWVkIHRvICJmaXRvcSIsIGV0Yy4KLQlSRUFMTFkgZml4IHRzdWJjY3R2LiAgRml4ICJmY21wZXEiIGFuZCAiZmNtcHEiIHdoaWNoIGhhZCB3cm9uZwotCW51bWJlciBvZiBhcmd1bWVudHMuCi0JKiBoODMwMC5oOiAgUmVtb3ZlIGV4dHJhIDsgd2hpY2ggcHJvZHVjZXMgY29tcGlsZXIgd2FybmluZy4KLQotVHVlIEphbiAyOCAyMjo1OToyMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiAgZml4IG9wY29kZSBmb3IgdHN1YmNjdHYuCi0KLVR1ZSBKYW4gIDcgMTc6MTk6MzkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IGZiYSBhbmQgY2JhIGFyZSBub3cgYWxpYXNlcyBmb3IgZmIgYW5kIGNiIHJlc3BlY3RpdmVseS4KLQotRnJpIERlYyAyNyAxMDo1NTo1MCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAobm9wKTogIE1hZGUgdGhlICdsb3NlJyBmaWVsZCBiZSBldmVuIHRpZ2h0ZXIsCi0Jc28gb25seSBhIHN0YW5kYXJkICdub3AnIGlzIGRpc2Fzc2VtYmxlZCBhcyBhIG5vcC4KLQotU3VuIERlYyAyMiAxMjoxODoxOCAxOTkxICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKG5vcCk6IEFkZCBSRF9HTyB0byBgbG9zZScgc28gdGhhdCBvbmx5ICVnMCBpbiBkZXN0IGlzCi0JZGlzYXNzZW1ibGVkIGFzIGEgbm9wLgotCi1UdWUgRGVjIDEwIDAwOjIyOjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogZml4IGEgdHlwby4KLQotU2F0IE5vdiAzMCAyMDo0MDo1MSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYTI5ay5oLCBhcm0uaCwgaDgzMDAuaCwgIGkzODYuaCwgIGk4NjAuaCwgaTk2MC5oICwgbTY4ay5oLAotCW04OGsuaCwgbWlwcy5oICwgbnAxLmgsIG5zMzJrLmgsIHBuLmgsIHB5ci5oLCBzcGFyYy5oLCB0YWhvZS5oLAotCXZheC5oLCBDaGFuZ2VMb2c6IHJlbmFtZWQgZnJvbSAuLi88Zm9vPi1vcGNvZGUuaAotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hMjlrLmggYi9pbmNsdWRlL29wY29kZS9hMjlrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmUxMjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYTI5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBBTUQgMjkwMDAgZmFtaWx5LgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1zdHJ1Y3QgYTI5a19vcGNvZGUgewotICAvKiBOYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgLyogT3Bjb2RlIHdvcmQgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogQSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCBkZXNjcmliZSB0aGUgb3BlcmFuZHMuCi0gICAgIFZhbGlkIGNoYXJhY3RlcnMgYXJlOgotICAgICAsICAgICAgICBJdHNlbGYuICBUaGUgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIGFzc2VtYmx5IGNvZGUuCi0gICAgIGEgICAgICAgIFJBLiAgVGhlIHJlZ2lzdGVyIG51bWJlciBpcyBpbiBiaXRzIDgtMTUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBiICAgICAgICBSQi4gIFRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gYml0cyAwLTcgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBjICAgICAgICBSQy4gIFRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gYml0cyAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGkgICAgICAgIEFuIGltbWVkaWF0ZSBvcGVyYW5kIGlzIGluIGJpdHMgMC03IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgeCAgICAgICAgQml0cyAwLTcgYW5kIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgYml0cyAwLTcgYW5kIDgtMTUKLSAgICAgICAgICAgICAgKHJlc3BlY3RpdmVseSkgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kLgotICAgICBoICAgICAgICBTYW1lIGFzIHggYnV0IHRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBiaXRzIDE2LTMxIG9mIHRoZQotICAgICAgICAgICAgICBpbW1lZGlhdGUgb3BlcmFuZC4KLSAgICAgWCAgICAgICAgU2FtZSBhcyB4IGJ1dCBiaXRzIDE2LTMxIG9mIHRoZSBzaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQKLSAgICAgICAgICAgICAgYXJlIHNldCB0byAxICh0aHVzIHRoZSBvcGVyYW5kIGlzIGFsd2F5cyBuZWdhdGl2ZSkuCi0gICAgIFAsQSAgICAgIEJpdHMgMC03IGFuZCAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIGJpdHMgMi05IGFuZCAxMC0xNwotICAgICAgICAgICAgICAocmVzcGVjdGl2ZWx5KSBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQuCi0JICAgICAgUD1QQy1yZWxhdGl2ZSwgc2lnbi1leHRlbmRlZCB0byAzMiBiaXRzLgotCSAgICAgIEE9QWJzb2x1dGUsIHplcm8tZXh0ZW5kZWQgdG8gMzIgYml0cy4KLSAgICAgZSAgICAgICAgQ0UgYml0IChiaXQgMjMpIGZvciBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24uCi0gICAgIG4gICAgICAgIENvbnRyb2wgZmllbGQgKGJpdHMgMTYtMjIpIGZvciBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24uCi0gICAgIHYgICAgICAgIEltbWVkaWF0ZSBvcGVyYW5kIGluIGJpdHMgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICAgICAgICAgICAodXNlZCBmb3IgdHJhcCBudW1iZXJzKS4KLSAgICAgcyAgICAgICAgU0EuICBTcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbnVtYmVyIGluIGJpdHMgOC0xNQotICAgICAgICAgICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIHUgICAgICAgIFVJLS1iaXQgNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIHIgICAgICAgIFJORC0tYml0cyA0LTYgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBkICAgICAgICBGRC0tYml0cyAyLTMgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBmICAgICAgICBGUy0tYml0cyAwLTEgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBJCSAgICAgIElELS1iaXRzIDE2LTE3IG9mIHRoZSBpbnN0cnVjdGlvbi4KLQotICAgICBFeHRlbnNpb25zIGZvciAyOTA1MDoKLQotICAgICBkCSAgICAgIEZNVC0tYml0cyAyLTMgb2YgdGhlIGluc3RydWN0aW9uIChub3QgcmVhbGx5IG5ldykuCi0gICAgIGYJICAgICAgQUNOLS1iaXRzIDAtMSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCByZWFsbHkgbmV3KS4KLSAgICAgRgkgICAgICBGVU5DLS1TcGVjaWFsIGZ1bmN0aW9uIGluIGJpdHMgMTgtMjEgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBDCSAgICAgIEFDTi0tYml0cyAxNi0xNyBzcGVjaWZ5aW5nIHRoZSBhY2N1bWxhdG9yIHJlZ2lzdGVyLiAgKi8KLSAgY2hhciAqYXJnczsKLX07Ci0KLSNpZm5kZWYgQ09OU1QKLSNkZWZpbmUgQ09OU1QKLSNlbmRpZiAvKiBDT05TVCAqLwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGEyOWtfb3Bjb2RlIGEyOWtfb3Bjb2Rlc1tdID0KLXsKLQoteyAiYWRkIiwgMHgxNDAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkIiwgMHgxNTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkYyIsIDB4MWMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZGMiLCAweDFkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGRjcyIsIDB4MTgwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZGNzIiwgMHgxOTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkY3UiLCAweDFhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRjdSIsIDB4MWIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZHMiLCAweDEwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRzIiwgMHgxMTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkdSIsIDB4MTIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZHUiLCAweDEzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhbmQiLCAweDkwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhbmQiLCAweDkxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhbmRuIiwgMHg5YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiYW5kbiIsIDB4OWQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFzZXEiLCAweDcwMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2VxIiwgMHg3MTAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNnZSIsIDB4NWMwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ2UiLCAweDVkMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2dldSIsIDB4NWUwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ2V1IiwgMHg1ZjAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNndCIsIDB4NTgwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ3QiLCAweDU5MDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2d0dSIsIDB4NWEwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ3R1IiwgMHg1YjAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsZSIsIDB4NTQwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbGUiLCAweDU1MDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2xldSIsIDB4NTYwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbGV1IiwgMHg1NzAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsdCIsIDB4NTAwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbHQiLCAweDUxMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2x0dSIsIDB4NTIwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbHR1IiwgMHg1MzAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNuZXEiLCAweDcyMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc25lcSIsIDB4NzMwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImNhbGwiLCAweGE4MDAwMDAwLCAiYSxQIiB9LAoteyAiY2FsbCIsIDB4YTkwMDAwMDAsICJhLEEiIH0sCi17ICJjYWxsaSIsIDB4YzgwMDAwMDAsICJhLGIiIH0sCi17ICJjbGFzcyIsIDB4ZTYwMDAwMDAsICJjLGEsZiIgfSwKLXsgImNseiIsIDB4MDgwMDAwMDAsICJjLGIiIH0sCi17ICJjbHoiLCAweDA5MDAwMDAwLCAiYyxpIiB9LAoteyAiY29uc3QiLCAweDAzMDAwMDAwLCAiYSx4IiB9LAoteyAiY29uc3RoIiwgMHgwMjAwMDAwMCwgImEsaCIgfSwKLXsgImNvbnN0aHoiLCAweDA1MDAwMDAwLCAiYSxoIiB9LAoteyAiY29uc3RuIiwgMHgwMTAwMDAwMCwgImEsWCIgfSwKLXsgImNvbnZlcnQiLCAweGU0MDAwMDAwLCAiYyxhLHUscixkLGYiIH0sCi17ICJjcGJ5dGUiLCAweDJlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGJ5dGUiLCAweDJmMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGVxIiwgMHg2MDAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BlcSIsIDB4NjEwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ2UiLCAweDRjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGdlIiwgMHg0ZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BnZXUiLCAweDRlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGdldSIsIDB4NGYwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ3QiLCAweDQ4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGd0IiwgMHg0OTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BndHUiLCAweDRhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGd0dSIsIDB4NGIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbGUiLCAweDQ0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGxlIiwgMHg0NTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsZXUiLCAweDQ2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGxldSIsIDB4NDcwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbHQiLCAweDQwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGx0IiwgMHg0MTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsdHUiLCAweDQyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGx0dSIsIDB4NDMwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbmVxIiwgMHg2MjAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BuZXEiLCAweDYzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJkYWRkIiwgMHhmMTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGRpdiIsIDB4ZjcwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRlcSIsIDB4ZWIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRnZSIsIDB4ZWYwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRndCIsIDB4ZWQwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdiIsIDB4NmEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdiIsIDB4NmIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRpdjAiLCAweDY4MDAwMDAwLCAiYyxiIiB9LAoteyAiZGl2MCIsIDB4NjkwMDAwMDAsICJjLGkiIH0sCi17ICJkaXZpZGUiLCAweGUxMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZpZHUiLCAweGUzMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZsIiwgMHg2YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2bCIsIDB4NmQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRpdnJlbSIsIDB4NmUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdnJlbSIsIDB4NmYwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRtYWMiLCAweGQ5MDAwMDAwLCAiRixDLGEsYiIgfSwKLXsgImRtc20iLCAweGRiMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkbXVsIiwgMHhmNTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZHN1YiIsIDB4ZjMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImVtdWxhdGUiLCAweGQ3MDAwMDAwLCAidixhLGIiIH0sCi17ICJleGJ5dGUiLCAweDBhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJleGJ5dGUiLCAweDBiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJleGh3IiwgMHg3YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZXhodyIsIDB4N2QwMDAwMDAsICJjLGEsaSIgfSwKLXsgImV4aHdzIiwgMHg3ZTAwMDAwMCwgImMsYSIgfSwKLXsgImV4dHJhY3QiLCAweDdhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJleHRyYWN0IiwgMHg3YjAwMDAwMCwgImMsYSxpIiB9LAoteyAiZmFkZCIsIDB4ZjAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZkaXYiLCAweGY2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZG11bCIsIDB4ZjkwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZlcSIsIDB4ZWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZnZSIsIDB4ZWUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZndCIsIDB4ZWMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZtYWMiLCAweGQ4MDAwMDAwLCAiRixDLGEsYiIgfSwKLXsgImZtc20iLCAweGRhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmbXVsIiwgMHhmNDAwMDAwMCwgImMsYSxiIiB9LAoteyAiZnN1YiIsIDB4ZjIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImhhbHQiLCAweDg5MDAwMDAwLCAiIiB9LAoteyAiaW5ieXRlIiwgMHgwYzAwMDAwMCwgImMsYSxiIiB9LAoteyAiaW5ieXRlIiwgMHgwZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiaW5odyIsIDB4NzgwMDAwMDAsICJjLGEsYiIgfSwKLXsgImluaHciLCAweDc5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJpbnYiLCAweDlmMDAwMDAwLCAiSSIgfSwKLXsgImlyZXQiLCAweDg4MDAwMDAwLCAiIiB9LAoteyAiaXJldGludiIsIDB4OGMwMDAwMDAsICJJIiB9LAoteyAiam1wIiwgMHhhMDAwMDAwMCwgIlAiIH0sCi17ICJqbXAiLCAweGExMDAwMDAwLCAiQSIgfSwKLXsgImptcGYiLCAweGE0MDAwMDAwLCAiYSxQIiB9LAoteyAiam1wZiIsIDB4YTUwMDAwMDAsICJhLEEiIH0sCi17ICJqbXBmZGVjIiwgMHhiNDAwMDAwMCwgImEsUCIgfSwKLXsgImptcGZkZWMiLCAweGI1MDAwMDAwLCAiYSxBIiB9LAoteyAiam1wZmkiLCAweGM0MDAwMDAwLCAiYSxiIiB9LAoteyAiam1waSIsIDB4YzAwMDAwMDAsICJiIiB9LAoteyAiam1wdCIsIDB4YWMwMDAwMDAsICJhLFAiIH0sCi17ICJqbXB0IiwgMHhhZDAwMDAwMCwgImEsQSIgfSwKLXsgImptcHRpIiwgMHhjYzAwMDAwMCwgImEsYiIgfSwKLXsgImxvYWQiLCAweDE2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWQiLCAweDE3MDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgImxvYWRsIiwgMHgwNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2FkbCIsIDB4MDcwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAibG9hZG0iLCAweDM2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWRtIiwgMHgzNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJsb2Fkc2V0IiwgMHgyNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2Fkc2V0IiwgMHgyNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJtZmFjYyIsIDB4ZTkwMDAxMDAsICJjLGQsZiIgfSwKLXsgIm1mc3IiLCAweGM2MDAwMDAwLCAiYyxzIiB9LAoteyAibWZ0bGIiLCAweGI2MDAwMDAwLCAiYyxhIiB9LAoteyAibXRhY2MiLCAweGU4MDEwMDAwLCAiYSxkLGYiIH0sCi17ICJtdHNyIiwgMHhjZTAwMDAwMCwgInMsYiIgfSwKLXsgIm10c3JpbSIsIDB4MDQwMDAwMDAsICJzLHgiIH0sCi17ICJtdHRsYiIsIDB4YmUwMDAwMDAsICJhLGIiIH0sCi17ICJtdWwiLCAweDY0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWwiLCAweDY1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJtdWxsIiwgMHg2NjAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsbCIsIDB4NjcwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm11bHRpcGx1IiwgMHhlMjAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdGlwbHkiLCAweGUwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx0bSIsIDB4ZGUwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHRtdSIsIDB4ZGYwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHUiLCAweDc0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx1IiwgMHg3NTAwMDAwMCwgImMsYSxpIiB9LAoteyAibmFuZCIsIDB4OWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm5hbmQiLCAweDliMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJub3AiLCAweDcwNDAwMTAxLCAiIiB9LAoteyAibm9yIiwgMHg5ODAwMDAwMCwgImMsYSxiIiB9LAoteyAibm9yIiwgMHg5OTAwMDAwMCwgImMsYSxpIiB9LAoteyAib3IiLCAweDkyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJvciIsIDB4OTMwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm9ybiIsIDB4YWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm9ybiIsIDB4YWIwMDAwMDAsICJjLGEsaSIgfSwKLQotLyogVGhlIGRlc2NyaXB0aW9uIG9mICJzZXRpcCIgaW4gQ2hhcHRlciA4ICgiaW5zdHJ1Y3Rpb24gc2V0Iikgb2YgdGhlIHVzZXIncwotICAgbWFudWFsIGNsYWltcyB0aGF0IHRoZXNlIGFyZSBhYnNvbHV0ZSByZWdpc3RlciBudW1iZXJzLiAgQnV0IHNlY3Rpb24KLSAgIDcuMi4xIGV4cGxhaW5zIHRoYXQgdGhleSBhcmUgbm90LiAgVGhlIGxhdHRlciBpcyBjb3JyZWN0LCBzbyBwcmludAotICAgdGhlc2Ugbm9ybWFsbHkgKCJscjAiLCAibHI1IiwgZXRjLikuICAqLwoteyAic2V0aXAiLCAweDllMDAwMDAwLCAiYyxhLGIiIH0sCi0KLXsgInNsbCIsIDB4ODAwMDAwMDAsICJjLGEsYiIgfSwKLXsgInNsbCIsIDB4ODEwMDAwMDAsICJjLGEsaSIgfSwKLXsgInNxcnQiLCAweGU1MDAwMDAwLCAiYyxhLGYiIH0sCi17ICJzcmEiLCAweDg2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzcmEiLCAweDg3MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzcmwiLCAweDgyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzcmwiLCAweDgzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdG9yZSIsIDB4MWUwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAic3RvcmUiLCAweDFmMDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgInN0b3JlbCIsIDB4MGUwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAic3RvcmVsIiwgMHgwZjAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJzdG9yZW0iLCAweDNlMDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgInN0b3JlbSIsIDB4M2YwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAic3ViIiwgMHgyNDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViIiwgMHgyNTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViYyIsIDB4MmMwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YmMiLCAweDJkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJjcyIsIDB4MjgwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YmNzIiwgMHgyOTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViY3UiLCAweDJhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJjdSIsIDB4MmIwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnIiLCAweDM0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyIiwgMHgzNTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicmMiLCAweDNjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyYyIsIDB4M2QwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJjcyIsIDB4MzgwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJjcyIsIDB4MzkwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJjdSIsIDB4M2EwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJjdSIsIDB4M2IwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJzIiwgMHgzMDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicnMiLCAweDMxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJydSIsIDB4MzIwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJ1IiwgMHgzMzAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicyIsIDB4MjAwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnMiLCAweDIxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJ1IiwgMHgyMjAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VidSIsIDB4MjMwMDAwMDAsICJjLGEsaSIgfSwKLXsgInhub3IiLCAweDk2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJ4bm9yIiwgMHg5NzAwMDAwMCwgImMsYSxpIiB9LAoteyAieG9yIiwgMHg5NDAwMDAwMCwgImMsYSxiIiB9LAoteyAieG9yIiwgMHg5NTAwMDAwMCwgImMsYSxpIiB9LAotCi17ICIiLCAweDAsICIiIH0JCS8qIER1bW15IGVudHJ5LCBub3QgaW5jbHVkZWQgaW4gTlVNX09QQ09ERVMuICBUaGlzCi0JCQkgICBsZXRzIGNvZGUgZXhhbWluZSBlbnRyeSBpKzEgd2l0aG91dCBjaGVja2luZwotCQkJICAgaWYgd2UndmUgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSB0YWJsZS4gICovCi19OwotCi1DT05TVCB1bnNpZ25lZCBpbnQgbnVtX29wY29kZXMgPSAoKChzaXplb2YgYTI5a19vcGNvZGVzKSAvIChzaXplb2YgYTI5a19vcGNvZGVzWzBdKSkgLSAxKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2FscGhhLmggYi9pbmNsdWRlL29wY29kZS9hbHBoYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjMxZTlhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2FscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogYWxwaGEuaCAtLSBIZWFkZXIgZmlsZSBmb3IgQWxwaGEgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LAotICAgcGF0dGVybmVkIGFmdGVyIHRoZSBQUEMgb3Bjb2RlIHRhYmxlIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvci4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBPUENPREVfQUxQSEFfSAotI2RlZmluZSBPUENPREVfQUxQSEFfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBhbHBoYV9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgYWxwaGFfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBtYXNrOwotCi0gIC8qIE9uZSBiaXQgZmxhZ3MgZm9yIHRoZSBvcGNvZGUuICBUaGVzZSBhcmUgcHJpbWFyaWx5IHVzZWQgdG8KLSAgICAgaW5kaWNhdGUgc3BlY2lmaWMgcHJvY2Vzc29ycyBhbmQgZW52aXJvbm1lbnRzIHN1cHBvcnQgdGhlCi0gICAgIGluc3RydWN0aW9ucy4gIFRoZSBkZWZpbmVkIHZhbHVlcyBhcmUgbGlzdGVkIGJlbG93LiAqLwotICB1bnNpZ25lZCBmbGFnczsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzRdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgYWxwaGFfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGFscGhhX251bV9vcGNvZGVzOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGFscGhhX29wY29kZS4gICovCi0KLS8qIENQVSBBdmFpbGFiaWxpdHkgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9CQVNFICAweDAwMDEgIC8qIEJhc2UgYXJjaGl0ZWN0dXJlIC0tIGFsbCBjcHVzLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjQgICAweDAwMDIgIC8qIEVWNCBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjUgICAweDAwMDQgIC8qIEVWNSBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjYgICAweDAwMDggIC8qIEVWNiBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9CV1ggICAweDAxMDAgIC8qIEJ5dGUvd29yZCBleHRlbnNpb24gKGFtYXNrIGJpdCAwKS4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfQ0lYICAgMHgwMjAwICAvKiAiQ291bnQiIGV4dGVuc2lvbiAoYW1hc2sgYml0IDEpLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9NQVggICAweDA0MDAgIC8qIE11bHRpbWVkaWEgZXh0ZW5zaW9uIChhbWFzayBiaXQgOCkuICAqLwotCi0jZGVmaW5lIEFYUF9PUENPREVfTk9QQUwgKH4oQVhQX09QQ09ERV9FVjR8QVhQX09QQ09ERV9FVjV8QVhQX09QQ09ERV9FVjYpKQotCi0vKiBBIG1hY3JvIHRvIGV4dHJhY3QgdGhlIG1ham9yIG9wY29kZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQVhQX09QKGkpCSgoKGkpID4+IDI2KSAmIDB4M0YpCi0KLS8qIFRoZSB0b3RhbCBudW1iZXIgb2YgbWFqb3Igb3Bjb2Rlcy4gKi8KLSNkZWZpbmUgQVhQX05PUFMJMHg0MAotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGFscGhhX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgYWxwaGFfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogVGhlIGRlZmF1bHQgcmVsb2NhdGlvbiB0eXBlIGZvciB0aGlzIG9wZXJhbmQuICAqLwotICBpbnQgZGVmYXVsdF9yZWxvYzsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGZsYWdzOwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIHVuc2lnbmVkICgqaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBpbnN0cnVjdGlvbiwgaW50IG9wLAotCQkJICAgICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uLCBvIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgKi8KLSAgaW50ICgqZXh0cmFjdCkgUEFSQU1TICgodW5zaWduZWQgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBhbHBoYV9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kIGFscGhhX29wZXJhbmRzW107Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgYWxwaGFfbnVtX29wZXJhbmRzOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGFscGhhX29wZXJhbmQuICAqLwotCi0vKiBNYXNrIGZvciBzZWxlY3RpbmcgdGhlIHR5cGUgZm9yIHR5cGVjaGVjayBwdXJwb3NlcyAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9UWVBFQ0hFQ0tfTUFTSwkJCQkJXAotICAoQVhQX09QRVJBTkRfUEFSRU5TIHwgQVhQX09QRVJBTkRfQ09NTUEgfCBBWFBfT1BFUkFORF9JUiB8CQlcCi0gICBBWFBfT1BFUkFORF9GUFIgfCBBWFBfT1BFUkFORF9SRUxBVElWRSB8IEFYUF9PUEVSQU5EX1NJR05FRCB8IAlcCi0gICBBWFBfT1BFUkFORF9VTlNJR05FRCkKLQotLyogVGhpcyBvcGVyYW5kIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGluIHRoZSBhc3NlbWJsZXIgaW5wdXQuICBUaGlzCi0gICBpcyB1c2VkIHRvIHN1cHBvcnQgZXh0ZW5kZWQgbW5lbW9uaWNzLCBmb3Igd2hpY2ggdHdvIG9wZXJhbmRzIGZpZWxkcwotICAgYXJlIGlkZW50aWNhbC4gIFRoZSBhc3NlbWJsZXIgc2hvdWxkIGNhbGwgdGhlIGluc2VydCBmdW5jdGlvbiB3aXRoCi0gICBhbnkgb3AgdmFsdWUuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjYWxsIHRoZSBleHRyYWN0IGZ1bmN0aW9uLAotICAgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUsIGFuZCBjaGVjayB0aGUgdmFsdWUgcGxhY2VkIGluIHRoZSBpbnZhbGlkCi0gICBhcmd1bWVudC4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0ZBS0UJMDEKLQotLyogVGhlIG9wZXJhbmQgc2hvdWxkIGJlIHdyYXBwZWQgaW4gcGFyZW50aGVzZXMgcmF0aGVyIHRoYW4gc2VwYXJhdGVkCi0gICBmcm9tIHRoZSBwcmV2aW91cyBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgbG9hZCBhbmQgc3RvcmUKLSAgIGluc3RydWN0aW9ucyB3aGljaCB3YW50IHRoZWlyIG9wZXJhbmRzIHRvIGxvb2sgbGlrZSAiUmEsZGlzcChSYikiLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfUEFSRU5TCTAyCi0KLS8qIFVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBQQVJFTlMsIHRoaXMgc3VwcmVzc2VzIHRoZSBzdXByZXNzaW9uIG9mCi0gICB0aGUgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yICJqbXAgUmEsKFJiKSxoaW50Ii4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0NPTU1BCTA0Ci0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhbiBpbnRlZ2VyIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfSVIJCTAxMAotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0ZQUgkJMDIwCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIHJlbGF0aXZlIGJyYW5jaCBkaXNwbGFjZW1lbnQuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfUkVMQVRJVkUJMDQwCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfU0lHTkVECTAxMDAKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHVuc2lnbmVkIHZhbHVlcy4gIFRoaXMgZXhpc3RzIHByaW1hcmlseSBzbyB0aGF0Ci0gICBhIGZsYWdzIHZhbHVlIG9mIDAgY2FuIGJlIHRyZWF0ZWQgYXMgZW5kLW9mLWFyZ3VtZW50cy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1VOU0lHTkVECTAyMDAKLQotLyogU3VwcmVzcyBvdmVyZmxvdyBkZXRlY3Rpb24gb24gdGhpcyBmaWVsZC4gIFRoaXMgaXMgdXNlZCBmb3IgaGludHMuICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX05PT1ZFUkZMT1cJMDQwMAotCi0vKiBNYXNrIGZvciBvcHRpb25hbCBhcmd1bWVudCBkZWZhdWx0IHZhbHVlLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfT1BUSU9OQUxfTUFTSyAwNzAwMAotCi0vKiBUaGlzIG9wZXJhbmQgZGVmYXVsdHMgdG8gemVyby4gIFRoaXMgaXMgdXNlZCBmb3IganVtcCBoaW50cy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVSTyAwMTAwMAotCi0vKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIGZpcnN0IChyZWFsKSBvcGVyYW5kIGFuZCBpcyB1c2VkCi0gICBpbiBjb25qdW5jdGlvbiB3aXRoIEFYUF9PUEVSQU5EX09QVElPTkFMLiAgVGhpcyBhbGxvd3MKLSAgICJhbmQgJDAsMywkMCIgdG8gYmUgd3JpdHRlbiBhcyAiYW5kICQwLDMiLCBldGMuICBJIGRvbid0IGxpa2UKLSAgIGl0LCBidXQgaXQncyB3aGF0IERFQyBkb2VzLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfREVGQVVMVF9GSVJTVCAwMjAwMAotCi0vKiBTaW1pbGFybHksIHRoaXMgb3BlcmFuZCBzaG91bGQgZGVmYXVsdCB0byB0aGUgc2Vjb25kIChyZWFsKSBvcGVyYW5kLgotICAgVGhpcyBhbGxvd3MgIm5lZ2wgJDAiIGluc3RlYWQgb2YgIm5lZ2wgJDAsJDAiLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQgMDQwMDAKLQotDAotLyogUmVnaXN0ZXIgY29tbW9uIG5hbWVzICovCi0KLSNkZWZpbmUgQVhQX1JFR19WMAkwCi0jZGVmaW5lIEFYUF9SRUdfVDAJMQotI2RlZmluZSBBWFBfUkVHX1QxCTIKLSNkZWZpbmUgQVhQX1JFR19UMgkzCi0jZGVmaW5lIEFYUF9SRUdfVDMJNAotI2RlZmluZSBBWFBfUkVHX1Q0CTUKLSNkZWZpbmUgQVhQX1JFR19UNQk2Ci0jZGVmaW5lIEFYUF9SRUdfVDYJNwotI2RlZmluZSBBWFBfUkVHX1Q3CTgKLSNkZWZpbmUgQVhQX1JFR19TMAk5Ci0jZGVmaW5lIEFYUF9SRUdfUzEJMTAKLSNkZWZpbmUgQVhQX1JFR19TMgkxMQotI2RlZmluZSBBWFBfUkVHX1MzCTEyCi0jZGVmaW5lIEFYUF9SRUdfUzQJMTMKLSNkZWZpbmUgQVhQX1JFR19TNQkxNAotI2RlZmluZSBBWFBfUkVHX0ZQCTE1Ci0jZGVmaW5lIEFYUF9SRUdfQTAJMTYKLSNkZWZpbmUgQVhQX1JFR19BMQkxNwotI2RlZmluZSBBWFBfUkVHX0EyCTE4Ci0jZGVmaW5lIEFYUF9SRUdfQTMJMTkKLSNkZWZpbmUgQVhQX1JFR19BNAkyMAotI2RlZmluZSBBWFBfUkVHX0E1CTIxCi0jZGVmaW5lIEFYUF9SRUdfVDgJMjIKLSNkZWZpbmUgQVhQX1JFR19UOQkyMwotI2RlZmluZSBBWFBfUkVHX1QxMAkyNAotI2RlZmluZSBBWFBfUkVHX1QxMQkyNQotI2RlZmluZSBBWFBfUkVHX1JBCTI2Ci0jZGVmaW5lIEFYUF9SRUdfUFYJMjcKLSNkZWZpbmUgQVhQX1JFR19UMTIJMjcKLSNkZWZpbmUgQVhQX1JFR19BVAkyOAotI2RlZmluZSBBWFBfUkVHX0dQCTI5Ci0jZGVmaW5lIEFYUF9SRUdfU1AJMzAKLSNkZWZpbmUgQVhQX1JFR19aRVJPCTMxCi0KLSNlbmRpZiAvKiBPUENPREVfQUxQSEFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYXJjLmggYi9pbmNsdWRlL29wY29kZS9hcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMGNhMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBBUkMuCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBhbmQKLXRoZSBHTlUgQmludXRpbHMuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4JSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBMaXN0IG9mIHRoZSB2YXJpb3VzIGNwdSB0eXBlcy4KLSAgIFRoZSB0YWJsZXMgY3VycmVudGx5IHVzZSBiaXQgbWFza3MgdG8gc2F5IHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIG9yCi0gICB3aGF0ZXZlciBpcyBzdXBwb3J0ZWQgYnkgYSBwYXJ0aWN1bGFyIGNwdS4gIFRoaXMgbGV0cyB1cyBoYXZlIG9uZSBlbnRyeQotICAgYXBwbHkgdG8gc2V2ZXJhbCBjcHVzLgotCi0gICBUaGlzIGR1cGxpY2F0ZXMgYmZkX21hY2hfYXJjX3h4eC4gIEZvciBub3cgSSB3aXNoIHRvIGlzb2xhdGUgdGhpcyBmcm9tIGJmZAotICAgYW5kIGJmZCBmcm9tIHRoaXMuICBBbHNvIG5vdGUgdGhhdCB0aGVzZSBudW1iZXJzIGFyZSBiaXQgdmFsdWVzIGFzIHdlIHdhbnQKLSAgIHRvIGFsbG93IGZvciB0aGluZ3MgYXZhaWxhYmxlIG9uIG1vcmUgdGhhbiBvbmUgQVJDIChidXQgbm90IG5lY2Vzc2FyaWx5IGFsbAotICAgQVJDcykuICAqLwotCi0vKiBUaGUgYGJhc2UnIGNwdSBtdXN0IGJlIDAgKHRhYmxlIGVudHJpZXMgYXJlIG9taXR0ZWQgZm9yIHRoZSBiYXNlIGNwdSkuCi0gICBUaGUgY3B1IHR5cGUgaXMgdHJlYXRlZCBpbmRlcGVuZGVudGx5IG9mIGVuZGlhbm5lc3MuCi0gICBUaGUgY29tcGxldGUgYG1hY2gnIG51bWJlciBpbmNsdWRlcyBlbmRpYW5uZXNzLgotICAgVGhlc2UgdmFsdWVzIGFyZSBpbnRlcm5hbCB0byBvcGNvZGVzL2JmZC9iaW51dGlscy9nYXMuICAqLwotI2RlZmluZSBBUkNfTUFDSF9CQVNFIDAKLSNkZWZpbmUgQVJDX01BQ0hfVU5VU0VEMSAxCi0jZGVmaW5lIEFSQ19NQUNIX1VOVVNFRDIgMgotI2RlZmluZSBBUkNfTUFDSF9VTlVTRUQ0IDQKLS8qIEFkZGl0aW9uYWwgY3B1IHZhbHVlcyBjYW4gYmUgaW5zZXJ0ZWQgaGVyZSBhbmQgQVJDX01BQ0hfQklHIG1vdmVkIGRvd24uICAqLwotI2RlZmluZSBBUkNfTUFDSF9CSUcgOAotCi0vKiBNYXNrIG9mIG51bWJlciBvZiBiaXRzIG5lY2Vzc2FyeSB0byByZWNvcmQgY3B1IHR5cGUuICAqLwotI2RlZmluZSBBUkNfTUFDSF9DUFVfTUFTSyA3Ci0vKiBNYXNrIG9mIG51bWJlciBvZiBiaXRzIG5lY2Vzc2FyeSB0byByZWNvcmQgY3B1IHR5cGUgKyBlbmRpYW5uZXNzLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfTUFTSyAxNQotCi0vKiBUeXBlIHRvIGRlbm90ZSBhbiBBUkMgaW5zdHJ1Y3Rpb24gKGF0IGxlYXN0IGEgMzIgYml0IHVuc2lnbmVkIGludCkuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgYXJjX2luc247Ci0KLXN0cnVjdCBhcmNfb3Bjb2RlIHsKLSAgY2hhciAqc3ludGF4OwkJCS8qIHN5bnRheCBvZiBpbnNuICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzaywgdmFsdWU7CS8qIHJlY29nbml6ZSBpbnNuIGlmIChvcCZtYXNrKT09dmFsdWUgKi8KLSAgaW50IGZsYWdzOwkJCS8qIHZhcmlvdXMgZmxhZyBiaXRzICovCi0KLS8qIFZhbHVlcyBmb3IgYGZsYWdzJy4gICovCi0KLS8qIFJldHVybiBDUFUgbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX0NQVShiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfQ1BVX01BU0spCi0vKiBSZXR1cm4gTUFDSCBudW1iZXIsIGdpdmVuIGZsYWcgYml0cy4gICovCi0jZGVmaW5lIEFSQ19PUENPREVfTUFDSChiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfTUFTSykKLS8qIEZpcnN0IG9wY29kZSBmbGFnIGJpdCBhdmFpbGFibGUgYWZ0ZXIgbWFjaGluZSBtYXNrLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9GTEFHX1NUQVJUICgoQVJDX01BQ0hfTUFTSyArIDEpIDw8IDApCi0vKiBUaGlzIGluc24gaXMgYSBjb25kaXRpb25hbCBicmFuY2guICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX0NPTkRfQlJBTkNIIChBUkNfT1BDT0RFX0ZMQUdfU1RBUlQpCi0KLSAgLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIG9wdGltaXplIGFzc2VtYmx5IGFuZCBkaXNhc3NlbWJseS4gIEVhY2ggaW5zbiBpcwotICAgICBvbiBhIGxpc3Qgb2YgcmVsYXRlZCBpbnNucyAoc2FtZSBmaXJzdCBsZXR0ZXIgZm9yIGFzc2VtYmx5LCBzYW1lIGluc24gY29kZQotICAgICBmb3IgZGlzYXNzZW1ibHkpLiAgKi8KLSAgc3RydWN0IGFyY19vcGNvZGUgKm5leHRfYXNtOwkvKiBOZXh0IGluc3RydWN0aW9uIHRvIHRyeSBkdXJpbmcgYXNzZW1ibHkuICAqLwotICBzdHJ1Y3QgYXJjX29wY29kZSAqbmV4dF9kaXM7CS8qIE5leHQgaW5zdHJ1Y3Rpb24gdG8gdHJ5IGR1cmluZyBkaXNhc3NlbWJseS4gICovCi0KLSAgLyogTWFjcm9zIHRvIGNyZWF0ZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIHRoZSBsaXN0cy4gICovCi0jZGVmaW5lIEFSQ19IQVNIX09QQ09ERShzdHJpbmcpIFwKLSAgKChzdHJpbmcpWzBdID49ICdhJyAmJiAoc3RyaW5nKVswXSA8PSAneicgPyAoc3RyaW5nKVswXSAtICdhJyA6IDI2KQotI2RlZmluZSBBUkNfSEFTSF9JQ09ERShpbnNuKSBcCi0gICgodW5zaWduZWQgaW50KSAoaW5zbikgPj4gMjcpCi0KLSAgLyogTWFjcm9zIHRvIGFjY2VzcyBgbmV4dF9hc20nLCBgbmV4dF9kaXMnIHNvIHVzZXJzIG5lZWRuJ3QgY2FyZSBhYm91dCB0aGUKLSAgICAgdW5kZXJseWluZyBtZWNoYW5pc20uICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX05FWFRfQVNNKG9wKSAoKG9wKS0+bmV4dF9hc20pCi0jZGVmaW5lIEFSQ19PUENPREVfTkVYVF9ESVMob3ApICgob3ApLT5uZXh0X2RpcykKLX07Ci0KLXN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSB7Ci0gIGNoYXIgKm5hbWU7CQkJLyogZWc6ICJlcSIgKi8KLSAgc2hvcnQgdmFsdWU7CQkJLyogZWc6IDEgKi8KLSAgdW5zaWduZWQgY2hhciB0eXBlOwkJLyogaW5kZXggaW50byBgYXJjX29wZXJhbmRzJyAqLwotICB1bnNpZ25lZCBjaGFyIGZsYWdzOwkJLyogdmFyaW91cyBmbGFnIGJpdHMgKi8KLQotLyogVmFsdWVzIGZvciBgZmxhZ3MnLiAgKi8KLQotLyogUmV0dXJuIENQVSBudW1iZXIsIGdpdmVuIGZsYWcgYml0cy4gICovCi0jZGVmaW5lIEFSQ19PUFZBTF9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogUmV0dXJuIE1BQ0ggbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BWQUxfTUFDSChiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfTUFTSykKLX07Ci0KLXN0cnVjdCBhcmNfb3BlcmFuZCB7Ci0gIC8qIE9uZSBvZiB0aGUgaW5zbiBmb3JtYXQgY2hhcnMuICAqLwotICB1bnNpZ25lZCBjaGFyIGZtdDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQgKG1heSBiZSB1bnVzZWQgZm9yIGEgbW9kaWZpZXIpLiAgKi8KLSAgdW5zaWduZWQgY2hhciBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbiwgb3IKLSAgICAgdGhlIG1vZGlmaWVyJ3MgZmxhZyBiaXQgKG1heSBiZSB1bnVzZWQgZm9yIGEgbW9kaWZpZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHNoaWZ0OwotCi0gIC8qIFZhcmlvdXMgZmxhZyBiaXRzLiAgKi8KLSAgaW50IGZsYWdzOwotCi0vKiBWYWx1ZXMgZm9yIGBmbGFncycuICAqLwotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBzdWZmaXggdG8gdGhlIG9wY29kZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1NVRkZJWCAxCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIHJlbGF0aXZlIGJyYW5jaCBkaXNwbGFjZW1lbnQuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIIDIKLQotLyogVGhpcyBvcGVyYW5kIGlzIGFuIGFic29sdXRlIGJyYW5jaCBhZGRyZXNzLiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCA0Ci0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhZGRyZXNzLiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX0FERFJFU1MgOAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBsb25nIGltbWVkaWF0ZSB2YWx1ZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX0xJTU0gMHgxMAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1NJR05FRCAweDIwCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLCBidXQgYWxzbyBhY2NlcHRzIGEgZnVsbCBwb3NpdGl2ZQotICAgcmFuZ2Ugb2YgdmFsdWVzLiAgVGhhdCBpcywgaWYgYml0cyBpcyAxNiwgaXQgdGFrZXMgYW55IHZhbHVlIGZyb20KLSAgIC0weDgwMDAgdG8gMHhmZmZmLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfU0lHTk9QVCAweDQwCi0KLS8qIFRoaXMgb3BlcmFuZCBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYSBuZWdhdGl2ZSBudW1iZXIgZm9yIHRoZQotICAgcHVycG9zZXMgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcgKGkuZS4sIHRoZSBub3JtYWwgbW9zdCBuZWdhdGl2ZQotICAgbnVtYmVyIGlzIGRpc2FsbG93ZWQgYW5kIG9uZSBtb3JlIHRoYW4gdGhlIG5vcm1hbCBtb3N0IHBvc2l0aXZlCi0gICBudW1iZXIgaXMgYWxsb3dlZCkuICBUaGlzIGZsYWcgd2lsbCBvbmx5IGJlIHNldCBmb3IgYSBzaWduZWQKLSAgIG9wZXJhbmQuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9ORUdBVElWRSAweDgwCi0KLS8qIFRoaXMgb3BlcmFuZCBkb2Vzbid0IHJlYWxseSBleGlzdC4gIFRoZSBwcm9ncmFtIHVzZXMgdGhlc2Ugb3BlcmFuZHMKLSAgIGluIHNwZWNpYWwgd2F5cy4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX0ZBS0UgMHgxMDAKLQotLyogTW9kaWZpZXIgdmFsdWVzLiAgKi8KLS8qIEEgZG90IGlzIHJlcXVpcmVkIGJlZm9yZSBhIHN1ZmZpeC4gIEVnOiAubGUgICovCi0jZGVmaW5lIEFSQ19NT0RfRE9UIDB4MTAwMAotCi0vKiBBIG5vcm1hbCByZWdpc3RlciBpcyBhbGxvd2VkIChub3QgdXNlZCwgYnV0IGhlcmUgZm9yIGNvbXBsZXRlbmVzcykuICAqLwotI2RlZmluZSBBUkNfTU9EX1JFRyAweDIwMDAKLQotLyogQW4gYXV4aWxpYXJ5IHJlZ2lzdGVyIG5hbWUgaXMgZXhwZWN0ZWQuICAqLwotI2RlZmluZSBBUkNfTU9EX0FVWFJFRyAweDQwMDAKLQotLyogU3VtIG9mIGFsbCBBUkNfTU9EX1hYWCBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9CSVRTIDB4NzAwMAotCi0vKiBOb24temVybyBpZiB0aGUgb3BlcmFuZCB0eXBlIGlzIHJlYWxseSBhIG1vZGlmaWVyLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9QKFgpICgoWCkgJiBBUkNfTU9EX0JJVFMpCi0KLSAgLyogSW5zZXJ0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICBUbyBpbnNlcnQgYW4KLSAgICAgb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGV4ZWN1dGUKLSAgICAgICAgIGkgfD0gKHAgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChJIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgTyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBPUCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZC4KLQotICAgICBSRUcgaXMgbm9uLU5VTEwgd2hlbiBpbnNlcnRpbmcgYSByZWdpc3RlciB2YWx1ZS4gICovCi0KLSAgYXJjX2luc24gKCppbnNlcnQpIFBBUkFNUyAoKGFyY19pbnNuIGluc24sCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQsIGludCBtb2RzLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWcsIGxvbmcgdmFsdWUsCi0JCQkgICAgICBjb25zdCBjaGFyICoqZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKLQkgaWYgKChvLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05FRCkgIT0gMAotCSAgICAgJiYgKG9wICYgKDEgPDwgKG8tPmJpdHMgLSAxKSkpICE9IDApCi0JICAgb3AgLT0gMSA8PCBvLT5iaXRzOwotICAgICAoSSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIE8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgT1AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuCi0KLSAgICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdHdvIGBhcmNfaW5zbidzLiAgVGhlIGZpcnN0IGVsZW1lbnQgaXMKLSAgICAgdGhlIGluc24sIHRoZSBzZWNvbmQgaXMgdGhlIGxpbW0gaWYgcHJlc2VudC4KLQotICAgICBPcGVyYW5kcyB0aGF0IGhhdmUgYSBwcmludGFibGUgZm9ybSBsaWtlIHJlZ2lzdGVycyBhbmQgc3VmZml4ZXMgaGF2ZQotICAgICB0aGVpciBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgcG9pbnRlciBzdG9yZWQgaW4gT1BWQUwuICAqLwotCi0gIGxvbmcgKCpleHRyYWN0KSBQQVJBTVMgKChhcmNfaW5zbiAqaW5zbiwKLQkJCSAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZCwKLQkJCSAgIGludCBtb2RzLCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbCwKLQkJCSAgIGludCAqaW52YWxpZCkpOwotfTsKLQotLyogQml0cyB0aGF0IHNheSB3aGF0IHZlcnNpb24gb2YgY3B1IHdlIGhhdmUuCi0gICBUaGVzZSBzaG91bGQgYmUgcGFzc2VkIHRvIGFyY19pbml0X29wY29kZV90YWJsZXMuCi0gICBBdCBwcmVzZW50LCBhbGwgdGhlcmUgaXMgaXMgdGhlIGNwdSB0eXBlLiAgKi8KLQotLyogQ1BVIG51bWJlciwgZ2l2ZW4gdmFsdWUgcGFzc2VkIHRvIGBhcmNfaW5pdF9vcGNvZGVfdGFibGVzJy4gICovCi0jZGVmaW5lIEFSQ19IQVZFX0NQVShiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfQ1BVX01BU0spCi0vKiBNQUNIIG51bWJlciwgZ2l2ZW4gdmFsdWUgcGFzc2VkIHRvIGBhcmNfaW5pdF9vcGNvZGVfdGFibGVzJy4gICovCi0jZGVmaW5lIEFSQ19IQVZFX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi0KLS8qIFNwZWNpYWwgcmVnaXN0ZXIgdmFsdWVzOiAgKi8KLSNkZWZpbmUgQVJDX1JFR19TSElNTV9VUERBVEUgNjEKLSNkZWZpbmUgQVJDX1JFR19TSElNTSA2MwotI2RlZmluZSBBUkNfUkVHX0xJTU0gNjIKLQotLyogTm9uLXplcm8gaWYgUkVHIGlzIGEgY29uc3RhbnQgbWFya2VyLiAgKi8KLSNkZWZpbmUgQVJDX1JFR19DT05TVEFOVF9QKFJFRykgKChSRUcpID49IDYxKQotCi0vKiBQb3NpdGlvbnMgYW5kIG1hc2tzIG9mIHZhcmlvdXMgZmllbGRzOiAgKi8KLSNkZWZpbmUgQVJDX1NISUZUX1JFR0EgMjEKLSNkZWZpbmUgQVJDX1NISUZUX1JFR0IgMTUKLSNkZWZpbmUgQVJDX1NISUZUX1JFR0MgOQotI2RlZmluZSBBUkNfTUFTS19SRUcgNjMKLQotLyogRGVsYXkgc2xvdCB0eXBlcy4gICovCi0jZGVmaW5lIEFSQ19ERUxBWV9OT05FIDAJLyogbm8gZGVsYXkgc2xvdCAqLwotI2RlZmluZSBBUkNfREVMQVlfTk9STUFMIDEJLyogZGVsYXkgc2xvdCBpbiBib3RoIGNhc2VzICovCi0jZGVmaW5lIEFSQ19ERUxBWV9KVU1QIDIJLyogZGVsYXkgc2xvdCBvbmx5IGlmIGJyYW5jaCB0YWtlbiAqLwotCi0vKiBOb24temVybyBpZiBYIHdpbGwgZml0IGluIGEgc2lnbmVkIDkgYml0IGZpZWxkLiAgKi8KLSNkZWZpbmUgQVJDX1NISU1NX0NPTlNUX1AoeCkgKChsb25nKSAoeCkgPj0gLTI1NiAmJiAobG9uZykgKHgpIDw9IDI1NSkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCBhcmNfb3BlcmFuZHNbXTsKLWV4dGVybiBjb25zdCBpbnQgYXJjX29wZXJhbmRfY291bnQ7Ci1leHRlcm4gLypjb25zdCovIHN0cnVjdCBhcmNfb3Bjb2RlIGFyY19vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19vcGNvZGVzX2NvdW50OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSBhcmNfc3VmZml4ZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgYXJjX3N1ZmZpeGVzX2NvdW50OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSBhcmNfcmVnX25hbWVzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19yZWdfbmFtZXNfY291bnQ7Ci1leHRlcm4gdW5zaWduZWQgY2hhciBhcmNfb3BlcmFuZF9tYXBbXTsKLQotLyogVXRpbGl0eSBmbnMgaW4gYXJjLW9wYy5jLiAgKi8KLWludCBhcmNfZ2V0X29wY29kZV9tYWNoIFBBUkFNUyAoKGludCwgaW50KSk7Ci0vKiBgYXJjX29wY29kZV9pbml0X3RhYmxlcycgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBhcmNfeHh4X3N1cHBvcnRlZCcuICAqLwotdm9pZCBhcmNfb3Bjb2RlX2luaXRfdGFibGVzIFBBUkFNUyAoKGludCkpOwotdm9pZCBhcmNfb3Bjb2RlX2luaXRfaW5zZXJ0IFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgYXJjX29wY29kZV9pbml0X2V4dHJhY3QgUEFSQU1TICgodm9pZCkpOwotY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKmFyY19vcGNvZGVfbG9va3VwX2FzbSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICphcmNfb3Bjb2RlX2xvb2t1cF9kaXMgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1pbnQgYXJjX29wY29kZV9saW1tX3AgUEFSQU1TICgobG9uZyAqKSk7Ci1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKmFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKnR5cGUsIGludCB2YWx1ZSkpOwotaW50IGFyY19vcGNvZGVfc3VwcG9ydGVkIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICopKTsKLWludCBhcmNfb3B2YWxfc3VwcG9ydGVkIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hcm0uaCBiL2luY2x1ZGUvb3Bjb2RlL2FybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzA4N2ViLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2FybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qIEFSTSBvcGNvZGUgbGlzdC4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1HREIgYW5kIEdBUyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIgYW5kIEdBUyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHREIgb3IgR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiB0eXBlcyBvZiBpbnN0cnVjdGlvbiAoZW5jb2RlZCBpbiBiaXRzIDI2IGFuZCAyNyBvZiB0aGUgaW5zdHJ1Y3Rpb24pICovCi0KLSNkZWZpbmUgVFlQRV9BUklUSE1FVElDCQkwCi0jZGVmaW5lIFRZUEVfTERSX1NUUgkJMQotI2RlZmluZSBUWVBFX0JMT0NLX0JSQU5DSAkyCi0jZGVmaW5lIFRZUEVfU1dJCQkzCi0KLS8qIGJpdCAyNSBkZWNpZGVzIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gaXMgYSBibG9jayBtb3ZlIG9yIGEgYnJhbmNoICovCi0jZGVmaW5lIFNVQlRZUEVfQkxPQ0sJCTAKLSNkZWZpbmUgU1VCVFlQRV9CUkFOQ0gJCTEKLQotLyogY29kZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zICovCi0KLSNkZWZpbmUgT1BDT0RFX0FORAkwCi0jZGVmaW5lIE9QQ09ERV9FT1IJMQotI2RlZmluZSBPUENPREVfU1VCCTIKLSNkZWZpbmUgT1BDT0RFX1JTQgkzCi0jZGVmaW5lIE9QQ09ERV9BREQJNAotI2RlZmluZSBPUENPREVfQURDCTUKLSNkZWZpbmUgT1BDT0RFX1NCQwk2Ci0jZGVmaW5lIE9QQ09ERV9SU0MJNwotI2RlZmluZSBPUENPREVfVFNUCTgKLSNkZWZpbmUgT1BDT0RFX1RFUQk5Ci0jZGVmaW5lIE9QQ09ERV9DTVAJMTAKLSNkZWZpbmUgT1BDT0RFX0NNTgkxMQotI2RlZmluZSBPUENPREVfT1JSCTEyCi0jZGVmaW5lIE9QQ09ERV9NT1YJMTMKLSNkZWZpbmUgT1BDT0RFX0JJQwkxNAotI2RlZmluZSBPUENPREVfTVZOCTE1Ci0KLS8qIGNvbmRpdGlvbiBjb2RlcyAqLwotCi0jZGVmaW5lIENPTkRfRVEJCTAKLSNkZWZpbmUgQ09ORF9ORQkJMQotI2RlZmluZSBDT05EX0NTCQkyCi0jZGVmaW5lIENPTkRfQ0MJCTMKLSNkZWZpbmUgQ09ORF9NSQkJNAotI2RlZmluZSBDT05EX1BMCQk1Ci0jZGVmaW5lIENPTkRfVlMJCTYKLSNkZWZpbmUgQ09ORF9WQwkJNwotI2RlZmluZSBDT05EX0hJCQk4Ci0jZGVmaW5lIENPTkRfTFMJCTkKLSNkZWZpbmUgQ09ORF9HRQkJMTAKLSNkZWZpbmUgQ09ORF9MVAkJMTEKLSNkZWZpbmUgQ09ORF9HVAkJMTIKLSNkZWZpbmUgQ09ORF9MRQkJMTMKLSNkZWZpbmUgQ09ORF9BTAkJMTQKLSNkZWZpbmUgQ09ORF9OVgkJMTUKLQotLyogRGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgYW4gQVJNIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKi8KLQotc3RydWN0IGdlbmVyaWNfZm10IHsKLSAgICB1bnNpZ25lZCByZXN0CToyNTsJLyogdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9uICovCi0gICAgdW5zaWduZWQgc3VidHlwZQk6MTsJLyogdXNlZCB0byBkZWNpZGUgYmV0d2VlbiBibG9jayBhbmQgYnJhbmNoICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogb25lIG9mIFRZUEVfKiAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotc3RydWN0IGFyaXRoX2ZtdCB7Ci0gICAgdW5zaWduZWQgb3BlcmFuZDIJOjEyOwkvKiAjbm4gb3Igcm4gb3Igcm4gc2hpZnQgI20gb3Igcm4gc2hpZnQgcm0gKi8KLSAgICB1bnNpZ25lZCBkZXN0CTo0OwkvKiBwbGFjZSB3aGVyZSB0aGUgYW5zd2VyIGdvZXMgKi8KLSAgICB1bnNpZ25lZCBvcGVyYW5kMQk6NDsJLyogZmlyc3Qgb3BlcmFuZCB0byBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIHNldAk6MTsJLyogPT0gMSBtZWFucyBzZXQgcHJvY2Vzc29yIGZsYWdzICovCi0gICAgdW5zaWduZWQgb3Bjb2RlCTo0OwkvKiBvbmUgb2YgT1BDT0RFXyogZGVmaW5lZCBhYm92ZSAqLwotICAgIHVuc2lnbmVkIGltbWVkCToxOwkvKiBvcGVyYW5kMiBpcyBhbiBpbW1lZGlhdGUgdmFsdWUgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0FSSVRITUVUSUMgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXN0cnVjdCBsZHJfc3RyX2ZtdCB7Ci0gICAgdW5zaWduZWQgb2Zmc2V0CToxMjsJLyogI25uIG9yIHJuIG9yIHJuIHNoaWZ0ICNtICovCi0gICAgdW5zaWduZWQgcmVnCTo0OwkvKiBkZXN0aW5hdGlvbiBmb3IgTERSLCBzb3VyY2UgZm9yIFNUUiAqLwotICAgIHVuc2lnbmVkIGJhc2UJOjQ7CS8qIGJhc2UgcmVnaXN0ZXIgKi8KLSAgICB1bnNpZ25lZCBpc19sb2FkCToxOwkvKiA9PSAxIGZvciBMRFIgKi8KLSAgICB1bnNpZ25lZCB3cml0ZWJhY2sJOjE7CS8qID09IDEgbWVhbnMgd3JpdGUgYmFjayAoYmFzZStvZmZzZXQpIGludG8gYmFzZSAqLwotICAgIHVuc2lnbmVkIGJ5dGUJOjE7CS8qID09IDEgbWVhbnMgYnl0ZSBhY2Nlc3MgZWxzZSB3b3JkICovCi0gICAgdW5zaWduZWQgdXAJCToxOwkvKiA9PSAxIG1lYW5zIGFkZCBvZmZzZXQgZWxzZSBzdWJ0cmFjdCBpdCAqLwotICAgIHVuc2lnbmVkIHByZV9pbmRleAk6MTsJLyogPT0gMSBtZWFucyBbYSxiXSBmb3JtIGVsc2UgW2FdLGIgZm9ybSAqLwotICAgIHVuc2lnbmVkIGltbWVkCToxOwkvKiA9PSAwIG1lYW5zIGltbWVkaWF0ZSBvZmZzZXQgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0xEUl9TVFIgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXN0cnVjdCBibG9ja19mbXQgewotICAgIHVuc2lnbmVkIG1hc2sJOjE2OwkvKiByZWdpc3RlciBtYXNrICovCi0gICAgdW5zaWduZWQgYmFzZQk6NDsJLyogcmVnaXN0ZXIgdXNlZCBhcyBiYXNlIG9mIG1vdmUgKi8KLSAgICB1bnNpZ25lZCBpc19sb2FkCToxOwkvKiA9PSAxIGZvciBMRE0gKi8KLSAgICB1bnNpZ25lZCB3cml0ZWJhY2sJOjE7CS8qID09IDEgbWVhbnMgdXBkYXRlIGJhc2UgYWZ0ZXIgbW92ZSAqLwotICAgIHVuc2lnbmVkIHNldAk6MTsJLyogPT0gMSBtZWFucyBzZXQgZmxhZ3MgaW4gcGMgaWYgaW5jbHVkZWQgaW4gbWFzayAqLwotICAgIHVuc2lnbmVkIGluY3JlbWVudAk6MTsJLyogPT0gMSBtZWFucyBpbmNyZW1lbnQgYmFzZSByZWdpc3RlciAqLwotICAgIHVuc2lnbmVkIGJlZm9yZQk6MTsJLyogPT0gMSBtZWFucyBpbmMvZGVjIGJlZm9yZSBlYWNoIG1vdmUgKi8KLSAgICB1bnNpZ25lZCBpc19ibG9jawk6MTsJLyogPT0gU1VCVFlQRV9CTE9DSyAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qID09IFRZUEVfQkxPQ0tfQlJBTkNIICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgYnJhbmNoX2ZtdCB7Ci0gICAgdW5zaWduZWQgZGVzdAk6MjQ7CS8qIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggKi8KLSAgICB1bnNpZ25lZCBsaW5rCToxOwkvKiBicmFuY2ggd2l0aCBsaW5rIChmdW5jdGlvbiBjYWxsKSAqLwotICAgIHVuc2lnbmVkIGlzX2JyYW5jaAk6MTsJLyogPT0gU1VCVFlQRV9CUkFOQ0ggKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0JMT0NLX0JSQU5DSCAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotI2RlZmluZSBST1VORF9OCQkwCi0jZGVmaW5lIFJPVU5EX1AJCTEKLSNkZWZpbmUgUk9VTkRfTQkJMgotI2RlZmluZSBST1VORF9aCQkzCi0KLSNkZWZpbmUgRkxPQVQyX01WRgkwCi0jZGVmaW5lIEZMT0FUMl9NTkYJMQotI2RlZmluZSBGTE9BVDJfQUJTCTIKLSNkZWZpbmUgRkxPQVQyX1JORAkzCi0jZGVmaW5lIEZMT0FUMl9TUVQJNAotI2RlZmluZSBGTE9BVDJfTE9HCTUKLSNkZWZpbmUgRkxPQVQyX0xHTgk2Ci0jZGVmaW5lIEZMT0FUMl9FWFAJNwotI2RlZmluZSBGTE9BVDJfU0lOCTgKLSNkZWZpbmUgRkxPQVQyX0NPUwk5Ci0jZGVmaW5lIEZMT0FUMl9UQU4JMTAKLSNkZWZpbmUgRkxPQVQyX0FTTgkxMQotI2RlZmluZSBGTE9BVDJfQUNTCTEyCi0jZGVmaW5lIEZMT0FUMl9BVE4JMTMKLQotI2RlZmluZSBGTE9BVDNfQURGCTAKLSNkZWZpbmUgRkxPQVQzX01VRgkxCi0jZGVmaW5lIEZMT0FUM19TVUYJMgotI2RlZmluZSBGTE9BVDNfUlNGCTMKLSNkZWZpbmUgRkxPQVQzX0RWRgk0Ci0jZGVmaW5lIEZMT0FUM19SREYJNQotI2RlZmluZSBGTE9BVDNfUE9XCTYKLSNkZWZpbmUgRkxPQVQzX1JQVwk3Ci0jZGVmaW5lIEZMT0FUM19STUYJOAotI2RlZmluZSBGTE9BVDNfRk1MCTkKLSNkZWZpbmUgRkxPQVQzX0ZEVgkxMAotI2RlZmluZSBGTE9BVDNfRlJECTExCi0jZGVmaW5lIEZMT0FUM19QT0wJMTIKLQotc3RydWN0IGZsb2F0Ml9mbXQgewotICAgIHVuc2lnbmVkIG9wZXJhbmQyCTozOwkvKiBzZWNvbmQgb3BlcmFuZCAqLwotICAgIHVuc2lnbmVkIGltbWVkCToxOwkvKiA9PSAxIGlmIHNlY29uZCBvcGVyYW5kIGlzIGEgY29uc3RhbnQgKi8KLSAgICB1bnNpZ25lZCBwYWQxCToxOwkvKiA9PSAwICovCi0gICAgdW5zaWduZWQgcm91bmRpbmcJOjI7CS8qIFJPVU5EXyogKi8KLSAgICB1bnNpZ25lZCBpc19kb3VibGUJOjE7CS8qID09IDEgaWYgcHJlY2lzaW9uIGlzIGRvdWJsZSAob25seSBpZiBub3QgZXh0ZW5kZWQpICovCi0gICAgdW5zaWduZWQgcGFkMgk6NDsJLyogPT0gMSAqLwotICAgIHVuc2lnbmVkIGRlc3QJOjM7CS8qIGRlc3RpbmF0aW9uICovCi0gICAgdW5zaWduZWQgaXNfMl9vcAk6MTsJLyogPT0gMSBpZiAyIG9wZXJhbmQgaW5zICovCi0gICAgdW5zaWduZWQgb3BlcmFuZDEJOjM7CS8qIGZpcnN0IG9wZXJhbmQgKG9ubHkgb2YgaXNfMl9vcCA9PSAwKSAqLwotICAgIHVuc2lnbmVkIGlzX2V4dGVuZGVkIDoxOwkvKiA9PSAxIGlmIHByZWNpc2lvbiBpcyBleHRlbmRlZCAqLwotICAgIHVuc2lnbmVkIG9wY29kZQk6NDsJLyogRkxPQVQyXyogb3IgRkxPQVQzXyogZGVwZW5kaW5nIG9uIGlzXzJfb3AgKi8KLSAgICB1bnNpZ25lZCBtdXN0X2JlXzIJOjI7CS8qID09IDIgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX1NXSSAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIENPTkRfKiAqLwotfTsKLQotc3RydWN0IHN3aV9mbXQgewotICAgIHVuc2lnbmVkIGFyZ3VtZW50CToyNDsJLyogYXJndW1lbnQgdG8gU1dJIChzeXNjYWxsIG51bWJlcikgKi8KLSAgICB1bnNpZ25lZCBtdXN0X2JlXzMJOjI7CS8qID09IDMgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX1NXSSAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotdW5pb24gaW5zbl9mbXQgewotICAgIHN0cnVjdCBnZW5lcmljX2ZtdAlnZW5lcmljOwotICAgIHN0cnVjdCBhcml0aF9mbXQJYXJpdGg7Ci0gICAgc3RydWN0IGxkcl9zdHJfZm10CWxkcl9zdHI7Ci0gICAgc3RydWN0IGJsb2NrX2ZtdAlibG9jazsKLSAgICBzdHJ1Y3QgYnJhbmNoX2ZtdAlicmFuY2g7Ci0gICAgc3RydWN0IHN3aV9mbXQJc3dpOwotICAgIHVuc2lnbmVkIGxvbmcJaW5zOwotfTsKLQotc3RydWN0IG9wY29kZSB7Ci0gICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbWFzazsJLyogcmVjb2duaXNlIGluc3RydWN0aW9uIGlmIChvcCZtYXNrKT09dmFsdWUgKi8KLSAgICBjaGFyICphc3NlbWJsZXI7CQkvKiBob3cgdG8gZGlzYXNzZW1ibGUgdGhpcyBpbnN0cnVjdGlvbiAqLwotfTsKLQotLyogZm9ybWF0IG9mIHRoZSBhc3NlbWJsZXIgc3RyaW5nIDoKLSAgIAotICAgJSUJCQklCi0gICAlPGJpdGZpZWxkPmQJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPngJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBoZXgKLSAgICU8Yml0ZmllbGQ+cgkJcHJpbnQgYXMgYW4gQVJNIHJlZ2lzdGVyCi0gICAlPGJpdGZpZWxkPmYJCXByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaWYgPjcgZWxzZSBhbiBmcCByZWdpc3RlcgotICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgMjgtMzEpCi0gICAlUAkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBhcml0aG1ldGljIGluc24KLSAgICVRCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGxkZi9zdGYgaW5zbgotICAgJVIJCQlwcmludCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBtb2RlCi0gICAlPGJpdG51bT4nYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyBvbmUKLSAgICU8Yml0bnVtPmBjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIHplcm8KLSAgICU8Yml0bnVtPj9hYgkJcHJpbnQgYSBpZiBiaXQgaXMgb25lIGVsc2UgcHJpbnQgYgotICAgJXAJCQlwcmludCAncCcgaWZmIGJpdHMgMTItMTUgYXJlIDE1Ci0gICAlbwkJCXByaW50IG9wZXJhbmQyIChpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgKyBzaGlmdCkKLSAgICVhCQkJcHJpbnQgYWRkcmVzcyBmb3IgbGRyL3N0ciBpbnN0cnVjdGlvbgotICAgJWIJCQlwcmludCBicmFuY2ggZGVzdGluYXRpb24KLSAgICVBCQkJcHJpbnQgYWRkcmVzcyBmb3IgbGRjL3N0Yy9sZGYvc3RmIGluc3RydWN0aW9uCi0gICAlbQkJCXByaW50IHJlZ2lzdGVyIG1hc2sgZm9yIGxkbS9zdG0gaW5zdHJ1Y3Rpb24KLSovCi0KLXN0YXRpYyBzdHJ1Y3Qgb3Bjb2RlIG9wY29kZXNbXSA9IHsKLSAgICAvKiBBUk0gaW5zdHJ1Y3Rpb25zICovCi0gICAgMHgwMDAwMDA5MCwgMHgwZmUwMDBmMCwgIm11bCUyMCdzICUxMi0xNXIsICUxNi0xOXIsICUwLTNyIiwKLSAgICAweDAwMjAwMDkwLCAweDBmZTAwMGYwLCAibWxhJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciIsCi0gICAgMHgwMDAwMDAwMCwgMHgwZGUwMDAwMCwgImFuZCVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDAyMDAwMDAsIDB4MGRlMDAwMDAsICJlb3IlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwNDAwMDAwLCAweDBkZTAwMDAwLCAic3ViJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMDYwMDAwMCwgMHgwZGUwMDAwMCwgInJzYiVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDA4MDAwMDAsIDB4MGRlMDAwMDAsICJhZGQlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwYTAwMDAwLCAweDBkZTAwMDAwLCAiYWRjJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMGMwMDAwMCwgMHgwZGUwMDAwMCwgInNiYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDBlMDAwMDAsIDB4MGRlMDAwMDAsICJyc2MlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAxMDAwMDAwLCAweDBkZTAwMDAwLCAidHN0JWMlcCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTIwMDAwMCwgMHgwZGUwMDAwMCwgInRlcSVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDE0MDAwMDAsIDB4MGRlMDAwMDAsICJjbXAlYyVwICUxNi0xOXIsICVvIiwKLSAgICAweDAxNjAwMDAwLCAweDBkZTAwMDAwLCAiY21uJWMlcCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTgwMDAwMCwgMHgwZGUwMDAwMCwgIm9yciVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDFhMDAwMDAsIDB4MGRlMDAwMDAsICJtb3YlYyUyMCdzICUxMi0xNXIsICVvIiwKLSAgICAweDAxYzAwMDAwLCAweDBkZTAwMDAwLCAiYmljJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMWUwMDAwMCwgMHgwZGUwMDAwMCwgIm12biVjJTIwJ3MgJTEyLTE1ciwgJW8iLAotICAgIDB4MDQwMDAwMDAsIDB4MGMxMDAwMDAsICJzdHIlYyUyMidiICUxMi0xNXIsICVhIiwKLSAgICAweDA0MTAwMDAwLCAweDBjMTAwMDAwLCAibGRyJWMlMjInYiAlMTItMTVyLCAlYSIsCi0gICAgMHgwODAwMDAwMCwgMHgwZTEwMDAwMCwgInN0bSVjJTIzP2lkJTI0P2JhICUxNi0xOXIlMjJgISwgJW0iLAotICAgIDB4MDgxMDAwMDAsIDB4MGUxMDAwMDAsICJsZG0lYyUyMz9pZCUyND9iYSAlMTYtMTlyJTIyYCEsICVtJTIyJ14iLAotICAgIDB4MGEwMDAwMDAsIDB4MGUwMDAwMDAsICJiJWMlMjQnbCAlYiIsCi0gICAgMHgwZjAwMDAwMCwgMHgwZjAwMDAwMCwgInN3aSVjICUwLTIzeCIsCi0gICAgLyogRmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gICAgMHgwZTAwMDEwMCwgMHgwZmYwOGYxMCwgImFkZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTEwMDEwMCwgMHgwZmYwOGYxMCwgIm11ZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTIwMDEwMCwgMHgwZmYwOGYxMCwgInN1ZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTMwMDEwMCwgMHgwZmYwOGYxMCwgInJzZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTQwMDEwMCwgMHgwZmYwOGYxMCwgImR2ZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTUwMDEwMCwgMHgwZmYwOGYxMCwgInJkZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTYwMDEwMCwgMHgwZmYwOGYxMCwgInBvdyVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTcwMDEwMCwgMHgwZmYwOGYxMCwgInJwdyVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTgwMDEwMCwgMHgwZmYwOGYxMCwgInJtZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTkwMDEwMCwgMHgwZmYwOGYxMCwgImZtbCVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWEwMDEwMCwgMHgwZmYwOGYxMCwgImZkdiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWIwMDEwMCwgMHgwZmYwOGYxMCwgImZyZCVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWMwMDEwMCwgMHgwZmYwOGYxMCwgInBvbCVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTAwODEwMCwgMHgwZmYwOGYxMCwgIm12ZiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTEwODEwMCwgMHgwZmYwOGYxMCwgIm1uZiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTIwODEwMCwgMHgwZmYwOGYxMCwgImFicyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTMwODEwMCwgMHgwZmYwOGYxMCwgInJuZCVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTQwODEwMCwgMHgwZmYwOGYxMCwgInNxdCVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTUwODEwMCwgMHgwZmYwOGYxMCwgImxvZyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTYwODEwMCwgMHgwZmYwOGYxMCwgImxnbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTcwODEwMCwgMHgwZmYwOGYxMCwgImV4cCVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTgwODEwMCwgMHgwZmYwOGYxMCwgInNpbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTkwODEwMCwgMHgwZmYwOGYxMCwgImNvcyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZWEwODEwMCwgMHgwZmYwOGYxMCwgInRhbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZWIwODEwMCwgMHgwZmYwOGYxMCwgImFzbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZWMwODEwMCwgMHgwZmYwOGYxMCwgImFjcyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZWQwODEwMCwgMHgwZmYwOGYxMCwgImF0biVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTAwMDExMCwgMHgwZmYwMGYxZiwgImZsdCVjJVAlUiAlMTYtMThmLCAlMTItMTVyIiwKLSAgICAweDBlMTAwMTEwLCAweDBmZmYwZjk4LCAiZml4JWMlUiAlMTItMTVyLCAlMC0yZiIsCi0gICAgMHgwZTIwMDExMCwgMHgwZmZmMGZmZiwgIndmcyVjICUxMi0xNXIiLAotICAgIDB4MGUzMDAxMTAsIDB4MGZmZjBmZmYsICJyZnMlYyAlMTItMTVyIiwKLSAgICAweDBlNDAwMTEwLCAweDBmZmYwZmZmLCAid2ZjJWMgJTEyLTE1ciIsCi0gICAgMHgwZTUwMDExMCwgMHgwZmZmMGZmZiwgInJmYyVjICUxMi0xNXIiLAotICAgIDB4MGU5MGYxMTAsIDB4MGZmOGZmZjAsICJjbWYlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWIwZjExMCwgMHgwZmY4ZmZmMCwgImNuZiVjICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlZDBmMTEwLCAweDBmZjhmZmYwLCAiY21mZSVjICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlZjBmMTEwLCAweDBmZjhmZmYwLCAiY25mZSVjICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBjMDAwMTAwLCAweDBlMTAwZjAwLCAic3RmJWMlUSAlMTItMTRmLCAlQSIsCi0gICAgMHgwYzEwMDEwMCwgMHgwZTEwMGYwMCwgImxkZiVjJVEgJTEyLTE0ZiwgJUEiLAotICAgIC8qIEdlbmVyaWMgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gICAgMHgwZTAwMDAwMCwgMHgwZjAwMDAxMCwgImNkcCVjICU4LTExZCwgJTIwLTIzZCwgY3IlMTItMTVkLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0iLAotICAgIDB4MGUwMDAwMTAsIDB4MGYxMDAwMTAsICJtcmMlYyAlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSIsCi0gICAgMHgwZTEwMDAxMCwgMHgwZjEwMDAxMCwgIm1jciVjICU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9IiwKLSAgICAweDBjMDAwMDAwLCAweDBlMTAwMDAwLCAic3RjJWMlMjJgbCAlOC0xMWQsIGNyJTEyLTE1ZCwgJUEiLAotICAgIDB4MGMxMDAwMDAsIDB4MGUxMDAwMDAsICJsZGMlYyUyMmBsICU4LTExZCwgY3IlMTItMTVkLCAlQSIsCi0gICAgLyogdGhlIHJlc3QgKi8KLSAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTMxeCIsCi19OwotI2RlZmluZSBOX09QQ09ERVMJKHNpemVvZiBvcGNvZGVzIC8gc2l6ZW9mIG9wY29kZXNbMF0pCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9jZ2VuLmggYi9pbmNsdWRlL29wY29kZS9jZ2VuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmY3YzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvY2dlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM5OSArMCwwIEBACi0vKiBIZWFkZXIgZmlsZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgYW5kIHRoZSBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQ0dFTl9ICi0jZGVmaW5lIENHRU5fSAotCi0vKiA/Pz8gVGhpcyBmaWxlIHJlcXVpcmVzIGJmZC5oIGJ1dCBvbmx5IHRvIGdldCBiZmRfdm1hLgotICAgU2VlbXMgbGlrZSBhbiBhd2Z1bCBsb3QgdG8gcmVxdWlyZSBqdXN0IHRvIGdldCBzdWNoIGEgZnVuZGFtZW50YWwgdHlwZS4KLSAgIFBlcmhhcHMgdGhlIGRlZmluaXRpb24gb2YgYmZkX3ZtYSBjYW4gYmUgbW92ZWQgb3V0c2lkZSBvZiBiZmQuaC4KLSAgIE9yIHBlcmhhcHMgb25lIGNvdWxkIGR1cGxpY2F0ZSBpdHMgZGVmaW5pdGlvbiBpbiBhbm90aGVyIGZpbGUuCi0gICBVbnRpbCBzdWNoIHRpbWUsIHRoaXMgZmlsZSBjb25kaXRpb25hbGx5IGNvbXBpbGVzIGRlZmluaXRpb25zIHRoYXQgcmVxdWlyZQotICAgYmZkX3ZtYSB1c2luZyBCRkRfVkVSU0lPTi4gICovCi0KLS8qIEVudW1zIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZC4KLSAgIEFsbG93IHRoZW0gdG8gYmUgdXNlZCBpbiBzdHJ1Y3QgZGVmaW5pdGlvbnMsIGV2ZW4gdGhvdWdoIHRoZSBlbnVtIG11c3QKLSAgIGJlIGRlZmluZWQgZWxzZXdoZXJlLgotICAgSWYgQ0dFTl9BUkNIIGlzbid0IGRlZmluZWQsIHRoaXMgZmlsZSBpcyBiZWluZyBpbmNsdWRlZCBieSBzb21ldGhpbmcgb3RoZXIKLSAgIHRoYW4gPGFyY2g+LWRlc2MuaC4gICovCi0KLS8qIFByZXBlbmQgdGhlIGFyY2ggbmFtZSwgZGVmaW5lZCBpbiA8YXJjaD4tZGVzYy5oLCBhbmQgX2NnZW5fIHRvIHN5bWJvbCBTLgotICAgVGhlIGxhY2sgb2Ygc3BhY2VzIGluIHRoZSBhcmcgbGlzdCBpcyBpbXBvcnRhbnQgZm9yIG5vbi1zdGRjIHN5c3RlbXMuCi0gICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgPGFyY2g+LWRlc2MuaC4KLSAgIEl0IGNhbiBiZSBpbmNsdWRlZCBpbmRlcGVuZGVudGx5IG9mIDxhcmNoPi1kZXNjLmgsIGluIHdoaWNoIGNhc2UgdGhlIGFyY2gKLSAgIGRlcGVuZGVudCBwb3J0aW9ucyB3aWxsIGJlIGRlY2xhcmVkIGFzICJ1bmtub3duX2NnZW5fZm9vIi4gICovCi0KLSNpZm5kZWYgQ0dFTl9TWU0KLSNkZWZpbmUgQ0dFTl9TWU0ocykgQ09OQ0FUMyAodW5rbm93bixfY2dlbl8scykKLSNlbmRpZgotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0YXRpYyAodW5jaGFuZ2luZykgcGllY2VzIGFuZCBhcyBtdWNoIG90aGVyIHN0dWZmCi0gICBhcyB3ZSBjYW4gcmVhc29uYWJseSBwdXQgaGVyZS4gIEl0J3MgZ2VuZXJhbGx5IGNsZWFuZXIgdG8gcHV0IHN0dWZmIGhlcmUKLSAgIHJhdGhlciB0aGFuIGhhdmluZyBpdCBtYWNoaW5lIGdlbmVyYXRlZCBpZiBwb3NzaWJsZS4gICovCi0KLS8qIFRoZSBhc3NlbWJsZXIgc3ludGF4IGlzIG1hZGUgdXAgb2YgZXhwcmVzc2lvbnMgKGR1aC4uLikuCi0gICBBdCB0aGUgbG93ZXN0IGxldmVsIHRoZSB2YWx1ZXMgYXJlIG1uZW1vbmljcywgcmVnaXN0ZXIgbmFtZXMsIG51bWJlcnMsIGV0Yy4KLSAgIEFib3ZlIHRoYXQgYXJlIHN1YmV4cHJlc3Npb25zLCBpZiBhbnkgKGFuIGV4YW1wbGUgbWlnaHQgYmUgdGhlCi0gICAiZWZmZWN0aXZlIGFkZHJlc3MiIGluIG02OGsgY3B1cykuICBTdWJleHByZXNzaW9ucyBhcmUgd2lwLgotICAgQXQgdGhlIHNlY29uZCBoaWdoZXN0IGxldmVsIGFyZSB0aGUgaW5zbnMgdGhlbXNlbHZlcy4gIEFib3ZlIHRoYXQgYXJlCi0gICBwc2V1ZG8taW5zbnMsIHN5bnRoZXRpYyBpbnNucywgYW5kIG1hY3JvcywgaWYgYW55LiAgKi8KLQwKLS8qIExvdHMgb2YgY3B1J3MgaGF2ZSBhIGZpeGVkIGluc24gc2l6ZSwgb3Igb25lIHdoaWNoIHJhcmVseSBjaGFuZ2VzLAotICAgYW5kIGl0J3MgZ2VuZXJhbGx5IGVhc2llciB0byBoYW5kbGUgdGhlc2UgYnkgdHJlYXRpbmcgdGhlIGluc24gYXMgYW4KLSAgIGludGVnZXIgdHlwZSwgcmF0aGVyIHRoYW4gYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4gIFNvIHdlIGFsbG93IHRhcmdldHMKLSAgIHRvIGNvbnRyb2wgdGhpcy4gIFdoZW4gYW4gaW50ZWdlciB0eXBlIHRoZSB2YWx1ZSBpcyBpbiBob3N0IGJ5dGUgb3JkZXIsCi0gICB3aGVuIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhlIHZhbHVlIGlzIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgQ0dFTl9JTlNOX0lOVDsKLSNpZiBDR0VOX0lOVF9JTlNOX1AKLXR5cGVkZWYgQ0dFTl9JTlNOX0lOVCBDR0VOX0lOU05fQllURVM7Ci10eXBlZGVmIENHRU5fSU5TTl9JTlQgKkNHRU5fSU5TTl9CWVRFU19QVFI7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICpDR0VOX0lOU05fQllURVM7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgKkNHRU5fSU5TTl9CWVRFU19QVFI7Ci0jZW5kaWYKLQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIENHRU5fSU5MSU5FIF9faW5saW5lX18KLSNlbHNlCi0jZGVmaW5lIENHRU5fSU5MSU5FCi0jZW5kaWYKLQotZW51bSBjZ2VuX2VuZGlhbgotewotICBDR0VOX0VORElBTl9VTktOT1dOLAotICBDR0VOX0VORElBTl9MSVRUTEUsCi0gIENHRU5fRU5ESUFOX0JJRwotfTsKLQotLyogRm9yd2FyZCBkZWNsLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9pbnNuIENHRU5fSU5TTjsKLQotLyogT3BhcXVlIHBvaW50ZXIgdmVyc2lvbiBmb3IgdXNlIGJ5IGV4dGVybmFsIHdvcmxkLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9jcHVfZGVzYyAqQ0dFTl9DUFVfREVTQzsKLQwKLS8qIEF0dHJpYnV0ZXMuCi0gICBBdHRyaWJ1dGVzIGFyZSB1c2VkIHRvIGRlc2NyaWJlIHZhcmlvdXMgcmFuZG9tIHRoaW5ncyBhc3NvY2lhdGVkIHdpdGgKLSAgIGFuIG9iamVjdCAoaWZpZWxkLCBoYXJkd2FyZSwgb3BlcmFuZCwgaW5zbiwgd2hhdGV2ZXIpIGFuZCBhcmUgc3BlY2lmaWVkCi0gICBhcyBuYW1lL3ZhbHVlIHBhaXJzLgotICAgSW50ZWdlciBhdHRyaWJ1dGVzIGNvbXB1dGVkIGF0IGNvbXBpbGUgdGltZSBhcmUgY3VycmVudGx5IGFsbCB0aGF0J3MKLSAgIHN1cHBvcnRlZCwgdGhvdWdoIGFkZGluZyBzdHJpbmcgYXR0cmlidXRlcyBhbmQgcnVuLXRpbWUgY29tcHV0YXRpb24gaXMKLSAgIHN0cmFpZ2h0Zm9yd2FyZC4gIEludGVnZXIgYXR0cmlidXRlIHZhbHVlcyBhcmUgYWx3YXlzIGhvc3QgaW50J3MKLSAgIChzaWduZWQgb3IgdW5zaWduZWQpLiAgRm9yIHBvcnRhYmlsaXR5LCB0aGlzIG1lYW5zIDMyIGJpdHMuCi0gICBJbnRlZ2VyIGF0dHJpYnV0ZXMgYXJlIGZ1cnRoZXIgY2F0ZWdvcml6ZWQgYXMgYm9vbGVhbiwgYml0c2V0LCBpbnRlZ2VyLAotICAgYW5kIGVudW0gdHlwZXMuICBCb29sZWFuIGF0dHJpYnV0ZXMgYXBwZWFyIGZyZXF1ZW50bHkgZW5vdWdoIHRoYXQgdGhleSdyZQotICAgcmVjb3JkZWQgaW4gb25lIGhvc3QgaW50LiAgVGhpcyBsaW1pdHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJvb2xlYW4KLSAgIGF0dHJpYnV0ZXMgdG8gMzIsIHRob3VnaCB0aGF0J3MgYSAqbG90KiBvZiBhdHRyaWJ1dGVzLiAgKi8KLQotLyogVHlwZSBvZiBhdHRyaWJ1dGUgdmFsdWVzLiAgKi8KLQotdHlwZWRlZiBpbnQgQ0dFTl9BVFRSX1ZBTFVFX1RZUEU7Ci0KLS8qIFN0cnVjdCB0byByZWNvcmQgYXR0cmlidXRlIGluZm9ybWF0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQm9vbGVhbiBhdHRyaWJ1dGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGJvb2w7Ci0gIC8qIE5vbi1ib29sZWFuIGludGVnZXIgYXR0cmlidXRlcy4gICovCi0gIENHRU5fQVRUUl9WQUxVRV9UWVBFIG5vbmJvb2xbMV07Ci19IENHRU5fQVRUUjsKLQotLyogRGVmaW5lIGEgc3RydWN0dXJlIG1lbWJlciBmb3IgYXR0cmlidXRlcyB3aXRoIE4gbm9uLWJvb2xlYW4gZW50cmllcy4KLSAgIFRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG5vbi1ib29sZWFuIGF0dHJpYnV0ZXMuCi0gICBUaGVyZSBpcyBhIG1heGltdW0gb2YgMzIgYm9vbGVhbiBhdHRyaWJ1dGVzIChzaW5jZSB0aGV5IGFyZSBhbGwgcmVjb3JkZWQKLSAgIGluIG9uZSBob3N0IGludCkuICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9UWVBFKG4pIFwKLXN0cnVjdCB7IHVuc2lnbmVkIGludCBib29sOyBcCi0JIENHRU5fQVRUUl9WQUxVRV9UWVBFIG5vbmJvb2xbKG4pID8gKG4pIDogMV07IH0KLQotLyogUmV0dXJuIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9CT09MUyhhKSAoKGEpLT5ib29sKQotCi0vKiBOb24tYm9vbGVhbiBhdHRyaWJ1dGUgbnVtYmVycyBhcmUgb2Zmc2V0IGJ5IHRoaXMgbXVjaC4gICovCi0KLSNkZWZpbmUgQ0dFTl9BVFRSX05CT09MX09GRlNFVCAzMgotCi0vKiBHaXZlbiBhIGJvb2xlYW4gYXR0cmlidXRlIG51bWJlciwgcmV0dXJuIGl0cyBtYXNrLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfTUFTSyhhdHRyKSAoMSA8PCAoYXR0cikpCi0KLS8qIFJldHVybiB0aGUgdmFsdWUgb2YgYm9vbGVhbiBhdHRyaWJ1dGUgQVRUUiBpbiBBVFRSUy4gICovCi0KLSNkZWZpbmUgQ0dFTl9CT09MX0FUVFIoYXR0cnMsIGF0dHIpICgoQ0dFTl9BVFRSX01BU0sgKGF0dHIpICYgKGF0dHJzKSkgIT0gMCkKLQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIEFUVFJfVEFCTEUgZm9yIE9CSi4KLSAgIE9CSiBpcyBhIHBvaW50ZXIgdG8gdGhlIGVudGl0eSB0aGF0IGhhcyB0aGUgYXR0cmlidXRlcwotICAgKD8/PyBub3QgdXNlZCBhdCBwcmVzZW50IGJ1dCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHB1cnBvc2VzIC0gZXZlbnR1YWxseQotICAgdGhlIGdvYWwgaXMgdG8gYWxsb3cgcmVjb3JkaW5nIGF0dHJpYnV0ZXMgaW4gc291cmNlIGZvcm0gYW5kIGNvbXB1dGluZwotICAgdGhlbSBsYXppbHkgYXQgcnVudGltZSwgbm90IHN1cmUgb2YgdGhlIGRldGFpbHMgeWV0KS4gICovCi0KLSNkZWZpbmUgQ0dFTl9BVFRSX1ZBTFVFKG9iaiwgYXR0cl90YWJsZSwgYXR0cikgXAotKCh1bnNpZ25lZCBpbnQpIChhdHRyKSA8IENHRU5fQVRUUl9OQk9PTF9PRkZTRVQgXAotID8gKChDR0VOX0FUVFJfQk9PTFMgKGF0dHJfdGFibGUpICYgQ0dFTl9BVFRSX01BU0sgKGF0dHIpKSAhPSAwKSBcCi0gOiAoKGF0dHJfdGFibGUpLT5ub25ib29sWyhhdHRyKSAtIENHRU5fQVRUUl9OQk9PTF9PRkZTRVRdKSkKLQotLyogQXR0cmlidXRlIG5hbWUvdmFsdWUgdGFibGVzLgotICAgVGhlc2UgYXJlIHVzZWQgdG8gYXNzaXN0IHBhcnNpbmcgb2YgZGVzY3JpcHRpb25zIGF0IHJ1bi10aW1lLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciAqIG5hbWU7Ci0gIENHRU5fQVRUUl9WQUxVRV9UWVBFIHZhbHVlOwotfSBDR0VOX0FUVFJfRU5UUlk7Ci0KLS8qIEZvciBlYWNoIGRvbWFpbiAoaWZsZCxodyxvcGVyYW5kLGluc24pLCBsaXN0IG9mIGF0dHJpYnV0ZXMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBjaGFyICogbmFtZTsKLSAgY29uc3QgQ0dFTl9BVFRSX0VOVFJZICogZGZhdWx0OwotICBjb25zdCBDR0VOX0FUVFJfRU5UUlkgKiB2YWxzOwotfSBDR0VOX0FUVFJfVEFCTEU7Ci0MCi0vKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogRGVmYXVsdCBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4KLSAgICAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgd2hlbiBpdCBlbmNvdW50ZXJzIGFuIHVua25vd24gaW5zbi4gICovCi0gIHVuc2lnbmVkIGludCBkZWZhdWx0X2luc25fYml0c2l6ZTsKLQotICAvKiBCYXNlIGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgotICAgICBGb3Igbm9uLUxJVyBjcHVzIHRoaXMgaXMgZ2VuZXJhbGx5IHRoZSBsZW5ndGggb2YgdGhlIHNtYWxsZXN0IGluc24uCi0gICAgIEZvciBMSVcgY3B1cyBpdHMgd2lwICh3b3JrLWluLXByb2dyZXNzKS4gIEZvciB0aGUgbTMyciBpdHMgMzIuICAqLwotICB1bnNpZ25lZCBpbnQgYmFzZV9pbnNuX2JpdHNpemU7Ci0KLSAgLyogTWluaW11bS9tYXhpbXVtIGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLiAgKi8KLSAgdW5zaWduZWQgaW50IG1pbl9pbnNuX2JpdHNpemU7Ci0gIHVuc2lnbmVkIGludCBtYXhfaW5zbl9iaXRzaXplOwotfSBDR0VOX0lTQTsKLQotLyogTWFjaGluZSB2YXJpYW50cy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVGhlIGFyZ3VtZW50IHRvIGJmZF9hcmNoX2luZm8tPnNjYW4uICAqLwotICBjb25zdCBjaGFyICpiZmRfbmFtZTsKLSAgLyogb25lIG9mIGVudW0gbWFjaF9hdHRyICovCi0gIGludCBudW07Ci19IENHRU5fTUFDSDsKLQwKLS8qIFBhcnNlIHJlc3VsdCAoYWxzbyBleHRyYWN0aW9uIHJlc3VsdCkuCi0KLSAgIFRoZSByZXN1bHQgb2YgcGFyc2luZyBhbiBpbnNuIGlzIHN0b3JlZCBoZXJlLgotICAgVG8gZ2VuZXJhdGUgdGhlIGFjdHVhbCBpbnNuLCB0aGlzIGlzIHBhc3NlZCB0byB0aGUgaW5zZXJ0IGhhbmRsZXIuCi0gICBXaGVuIHByaW50aW5nIGFuIGluc24sIHRoZSByZXN1bHQgb2YgZXh0cmFjdGlvbiBpcyBzdG9yZWQgaGVyZS4KLSAgIFRvIHByaW50IHRoZSBpbnNuLCB0aGlzIGlzIHBhc3NlZCB0byB0aGUgcHJpbnQgaGFuZGxlci4KLQotICAgSXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgc28gd2UgZG9uJ3QgZGVmaW5lIGl0IGhlcmUsCi0gICBidXQgd2UgZG8gbmVlZCBhIGZvcndhcmQgZGVjbCBmb3IgdGhlIGhhbmRsZXIgZm5zLgotCi0gICBUaGVyZSBpcyBvbmUgbWVtYmVyIGZvciBlYWNoIHBvc3NpYmxlIGZpZWxkIGluIHRoZSBpbnNuLgotICAgVGhlIHR5cGUgZGVwZW5kcyBvbiB0aGUgZmllbGQuCi0gICBBbHNvIHJlY29yZGVkIGhlcmUgaXMgdGhlIGNvbXB1dGVkIGxlbmd0aCBvZiB0aGUgaW5zbiBmb3IgYXJjaGl0ZWN0dXJlcwotICAgd2hlcmUgaXQgdmFyaWVzLgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9maWVsZHMgQ0dFTl9GSUVMRFM7Ci0KLS8qIFRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiwgYXMgcmVjb3JkZWQgaW4gdGhlIGBmaWVsZHMnIHN0cnVjdC4gICovCi0vKiA/Pz8gVGhlIGZpZWxkIGluc2VydCBoYW5kbGVyIGhhcyBsb3RzIG9mIG9wcG9ydHVuaXRpZXMgZm9yIG9wdGltaXphdGlvbgotICAgaWYgaXQgZXZlciBnZXRzIGlubGluZWQuICBPbiBhcmNoaXRlY3R1cmVzIHdoZXJlIGluc25zIGFsbCBoYXZlIHRoZSBzYW1lCi0gICBzaXplLCBtYXkgd2lzaCB0byBkZXRlY3QgdGhhdCBhbmQgbWFrZSB0aGlzIG1hY3JvIGEgY29uc3RhbnQgLSB0byBhbGxvdwotICAgZnVydGhlciBvcHRpbWl6YXRpb25zLiAgKi8KLQotI2RlZmluZSBDR0VOX0ZJRUxEU19CSVRTSVpFKGZpZWxkcykgKChmaWVsZHMpLT5sZW5ndGgpCi0MCi0vKiBFeHRyYWN0aW9uIHN1cHBvcnQgZm9yIHZhcmlhYmxlIGxlbmd0aCBpbnNuIHNldHMuICAqLwotCi0vKiBXaGVuIGRpc2Fzc2VtYmxpbmcgd2UgZG9uJ3Qga25vdyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgYXQgdGhlIHN0YXJ0LgotICAgU28gdGhlIGZpcnN0IENHRU5fQkFTRV9JTlNOX1NJWkUgYnl0ZXMgYXJlIHJlYWQgYXQgdGhlIHN0YXJ0IGFuZCB0aGUgcmVzdAotICAgYXJlIHJlYWQgd2hlbiBuZWVkZWQuICBUaGlzIHN0cnVjdCBjb250cm9scyB0aGlzLiAgSXQgaXMgYmFzaWNhbGx5IHRoZQotICAgZGlzYXNzZW1ibGVfaW5mbyBzdHVmZiwgZXhjZXB0IHRoYXQgd2UgcHJvdmlkZSBhIGNhY2hlIGZvciB2YWx1ZXMgYWxyZWFkeQotICAgcmVhZCAoc2luY2UgYnl0ZXMgY2FuIHR5cGljYWxseSBiZSByZWFkIHNldmVyYWwgdGltZXMgdG8gZmV0Y2ggbXVsdGlwbGUKLSAgIG9wZXJhbmRzIHRoYXQgbWF5IGJlIGluIHRoZW0pLCBhbmQgdGhhdCBleHRyYWN0aW9uIG9mIGZpZWxkcyBpcyBuZWVkZWQKLSAgIGluIGNvbnRleHRzIG90aGVyIHRoYW4gZGlzYXNzZW1ibHkuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIEEgcG9pbnRlciB0byB0aGUgZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3QuCi0gICAgIFdlIGRvbid0IHJlcXVpcmUgZGlzLWFzbS5oIHNvIHdlIHVzZSBQVFIgZm9yIHRoZSB0eXBlIGhlcmUuCi0gICAgIElmIE5VTEwsIEJZVEVTIGlzIGZ1bGwgb2YgdmFsaWQgZGF0YSAoVkFMSUQgPT0gLTEpLiAgKi8KLSAgUFRSIGRpc19pbmZvOwotICAvKiBQb2ludHMgdG8gYSB3b3JraW5nIGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUuICAqLwotICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzOwotICAvKiBNYXNrIG9mIGJ5dGVzIHRoYXQgYXJlIHZhbGlkIGluIElOU05fQllURVMuICAqLwotICB1bnNpZ25lZCBpbnQgdmFsaWQ7Ci19IENHRU5fRVhUUkFDVF9JTkZPOwotDAotLyogQXNzb2NpYXRlZCB3aXRoIGVhY2ggaW5zbiBvciBleHByZXNzaW9uIGlzIGEgc2V0IG9mICJoYW5kbGVycyIgZm9yCi0gICBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgbGlrZSBwYXJzaW5nLCBwcmludGluZywgZXRjLiAgVGhlc2UgcmVxdWlyZSBhIGJmZF92bWEKLSAgIHZhbHVlIHRvIGJlIHBhc3NlZCBhcm91bmQgYnV0IHdlIGRvbid0IHdhbnQgYWxsIGFwcGxpY2F0aW9ucyB0byBuZWVkIGJmZC5oLgotICAgU28gdGhpcyBzdHVmZiBpcyBvbmx5IHByb3ZpZGVkIGlmIGJmZC5oIGhhcyBiZWVuIGluY2x1ZGVkLiAgKi8KLQotLyogUGFyc2UgaGFuZGxlci4KLSAgIENEIGlzIGEgY3B1IHRhYmxlIGRlc2NyaXB0b3IuCi0gICBJTlNOIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBpbnNuIGJlaW5nIHBhcnNlZC4KLSAgIFNUUlAgaXMgYSBwb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgdGV4dCBiZWluZyBwYXJzZWQuCi0gICBGSUVMRFMgaXMgYSBwb2ludGVyIHRvIGEgY2dlbl9maWVsZHMgc3RydWN0IGluIHdoaWNoIHRoZSByZXN1bHRzIGFyZSBwbGFjZWQuCi0gICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLCAqU1RSUCBpcyB1cGRhdGVkLgotICAgSWYgbm90IGl0IGlzIGxlZnQgYWxvbmUuCi0gICBUaGUgcmVzdWx0IGlzIE5VTEwgaWYgc3VjY2VzcyBvciBhbiBlcnJvciBtZXNzYWdlLiAgKi8KLXR5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX3BhcnNlX2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIGNvbnN0IGNoYXIgKipzdHJwXywgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLQotLyogSW5zZXJ0IGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgaW5zbiBiZWluZyBwYXJzZWQuCi0gICBGSUVMRFMgaXMgYSBwb2ludGVyIHRvIGEgY2dlbl9maWVsZHMgc3RydWN0IGZyb20gd2hpY2ggdGhlIHZhbHVlcwotICAgYXJlIGZldGNoZWQuCi0gICBJTlNOUCBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGluc24uCi0gICBQQyBpcyB0aGUgcGMgdmFsdWUgb2YgdGhlIGluc24uCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotI2lmZGVmIEJGRF9WRVJTSU9OCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9pbnNlcnRfZm4pCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIENHRU5fSU5TTl9CWVRFU19QVFIgaW5zbnBfLAotCSAgICAgIGJmZF92bWEgcGNfKSk7Ci0jZWxzZQotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5faW5zZXJ0X2ZuKSAoKTsKLSNlbmRpZgotCi0vKiBFeHRyYWN0IGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgaW5zbiBiZWluZyBwYXJzZWQuCi0gICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBjb250cm9sbGluZyBleHRyYWN0aW9uCi0gICAob25seSB1c2VkIGZvciB2YXJpYWJsZSBsZW5ndGggaW5zbnMpLgotICAgRVhfSU5GTyBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZm9yIGNvbnRyb2xsaW5nIHJlYWRpbmcgb2YgZnVydGhlcgotICAgYnl0ZXMgZm9yIHRoZSBpbnNuLgotICAgQkFTRV9JTlNOIGlzIHRoZSBmaXJzdCBDR0VOX0JBU0VfSU5TTl9TSVpFIGJ5dGVzIChob3N0IG9yZGVyKS4KLSAgIEZJRUxEUyBpcyBhIHBvaW50ZXIgdG8gYSBjZ2VuX2ZpZWxkcyBzdHJ1Y3QgaW4gd2hpY2ggdGhlIHJlc3VsdHMgYXJlIHBsYWNlZC4KLSAgIFBDIGlzIHRoZSBwYyB2YWx1ZSBvZiB0aGUgaW5zbi4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzIG9yIHplcm8gaWYgbm90IHJlY29nbml6ZWQuICAqLwotCi0jaWZkZWYgQkZEX1ZFUlNJT04KLXR5cGVkZWYgaW50IChjZ2VuX2V4dHJhY3RfZm4pCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm9fLCBDR0VOX0lOU05fSU5UIGJhc2VfaW5zbl8sCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgcGNfKSk7Ci0jZWxzZQotdHlwZWRlZiBpbnQgKGNnZW5fZXh0cmFjdF9mbikgKCk7Ci0jZW5kaWYKLQotLyogUHJpbnQgaGFuZGxlci4KLSAgIENEIGlzIGEgY3B1IHRhYmxlIGRlc2NyaXB0b3IuCi0gICBJTkZPIGlzIGEgcG9pbnRlciB0byB0aGUgZGlzYXNzZW1ibHkgaW5mby4KLSAgIEVnOiBkaXNhc3NlbWJsZV9pbmZvLiAgSXQncyBkZWZpbmVkIGFzIGBQVFInIHNvIHRoaXMgZmlsZSBjYW4gYmUgaW5jbHVkZWQKLSAgIHdpdGhvdXQgZGlzLWFzbS5oLgotICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgaW5zbiBiZWluZyBwcmludGVkLgotICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdC4KLSAgIFBDIGlzIHRoZSBwYyB2YWx1ZSBvZiB0aGUgaW5zbi4KLSAgIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBpbnNuLCBpbiBiaXRzLiAgKi8KLQotI2lmZGVmIEJGRF9WRVJTSU9OCi10eXBlZGVmIHZvaWQgKGNnZW5fcHJpbnRfZm4pCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiBpbmZvXywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSBwY18sIGludCBsZW5fKSk7Ci0jZWxzZQotdHlwZWRlZiB2b2lkIChjZ2VuX3ByaW50X2ZuKSAoKTsKLSNlbmRpZgotCi0vKiBQYXJzZS9pbnNlcnQvZXh0cmFjdC9wcmludCBoYW5kbGVycy4KLQotICAgSW5kaWNlcyBpbnRvIHRoZSBoYW5kbGVyIHRhYmxlcy4KLSAgIFdlIGNvdWxkIHVzZSBwb2ludGVycyBoZXJlIGluc3RlYWQsIGJ1dCA5MCUgb2YgdGhlbSBhcmUgZ2VuZXJhbGx5IGlkZW50aWNhbAotICAgYW5kIHRoYXQncyBhIGxvdCBvZiByZWR1bmRhbnQgZGF0YS4gIE1ha2luZyB0aGVzZSB1bnNpZ25lZCBjaGFyIGluZGljZXMKLSAgIGludG8gdGFibGVzIG9mIHBvaW50ZXJzIHNhdmVzIGEgYml0IG9mIHNwYWNlLgotICAgVXNpbmcgaW5kaWNlcyBhbHNvIGtlZXBzIGFzc2VtYmxlciBjb2RlIG91dCBvZiB0aGUgZGlzYXNzZW1ibGVyIGFuZAotICAgdmljZSB2ZXJzYS4gICovCi0KLXN0cnVjdCBjZ2VuX29wY29kZV9oYW5kbGVyCi17Ci0gIHVuc2lnbmVkIGNoYXIgcGFyc2UsIGluc2VydCwgZXh0cmFjdCwgcHJpbnQ7Ci19OwotDAotLyogQXNzZW1ibGVyIGludGVyZmFjZS4KLQotICAgVGhlIGludGVyZmFjZSB0byB0aGUgYXNzZW1ibGVyIGlzIGludGVuZGVkIHRvIGJlIGNsZWFuIGluIHRoZSBzZW5zZSB0aGF0Ci0gICBsaWJvcGNvZGVzLmEgaXMgYSBzdGFuZGFsb25lIGVudGl0eSBhbmQgY291bGQgYmUgdXNlZCB3aXRoIGFueSBhc3NlbWJsZXIuCi0gICBOb3QgdGhhdCBvbmUgd291bGQgbmVjZXNzYXJpbHkgd2FudCB0byBkbyB0aGF0IGJ1dCByYXRoZXIgdGhhdCBpdCBoZWxwcwotICAga2VlcCBhIGNsZWFuIGludGVyZmFjZS4gIFRoZSBpbnRlcmZhY2Ugd2lsbCBvYnZpb3VzbHkgYmUgc2xhbnRlZCB0b3dhcmRzCi0gICBHQVMsIGJ1dCBhdCBsZWFzdCBpdCdzIGEgc3RhcnQuCi0gICA/Pz8gTm90ZSB0aGF0IG9uZSBwb3NzaWJsZSB1c2VyIG9mIHRoZSBhc3NlbWJsZXIgYmVzaWRlcyBHQVMgaXMgR0RCLgotCi0gICBQYXJzaW5nIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGFzc2VtYmxlciB3aGljaCBjYWxscwotICAgQ0dFTl9TWU0gKGFzc2VtYmxlX2luc24pLiAgSWYgaXQgY2FuIHBhcnNlIGFuZCBidWlsZCB0aGUgZW50aXJlIGluc24KLSAgIGl0IGRvZXNuJ3QgY2FsbCBiYWNrIHRvIHRoZSBhc3NlbWJsZXIuICBJZiBpdCBuZWVkcy93YW50cyB0byBjYWxsIGJhY2sKLSAgIHRvIHRoZSBhc3NlbWJsZXIsIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiBpcyBjYWxsZWQgd2hpY2ggY2FuIGVpdGhlcgotCi0gICAtIHJldHVybiBhIG51bWJlciB0byBiZSBpbnNlcnRlZCBpbiB0aGUgaW5zbgotICAgLSByZXR1cm4gYSAicmVnaXN0ZXIiIHZhbHVlIHRvIGJlIGluc2VydGVkCi0gICAgICh0aGUgcmVnaXN0ZXIgbWlnaHQgbm90IGJlIGEgcmVnaXN0ZXIgcGVyIHBlKQotICAgLSBxdWV1ZSB0aGUgYXJndW1lbnQgYW5kIHJldHVybiBhIG1hcmtlciBzYXlpbmcgdGhlIGV4cHJlc3Npb24gaGFzIGJlZW4KLSAgICAgcXVldWVkIChlZzogYSBmaXgtdXApCi0gICAtIHJldHVybiBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhlIGV4cHJlc3Npb24gd2Fzbid0IHJlY29nbml6YWJsZQotCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBmb3Igc3VjY2Vzcy4KLSAgIFRoZSBwYXJzZWQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBiZmRfdm1hICouICAqLwotCi0vKiBWYWx1ZXMgZm9yIGluZGljYXRpbmcgd2hhdCB0aGUgY2FsbGVyIHdhbnRzLiAgKi8KLQotZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfdHlwZQotewotICBDR0VOX1BBUlNFX09QRVJBTkRfSU5JVCwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOVEVHRVIsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9BRERSRVNTCi19OwotCi0vKiBWYWx1ZXMgZm9yIGluZGljYXRpbmcgd2hhdCB3YXMgcGFyc2VkLiAgKi8KLQotZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0Ci17Ci0gIENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSLAotICBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX1JFR0lTVEVSLAotICBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX1FVRVVFRCwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUgotfTsKLQotI2lmZGVmIEJGRF9WRVJTSU9OIC8qIERvbid0IHJlcXVpcmUgYmZkLmggdW5uZWNlc3NhcmlseS4gICovCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLAotCSAgICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3R5cGUsIGNvbnN0IGNoYXIgKiosIGludCwgaW50LAotCSAgICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqLCBiZmRfdm1hICopKTsKLSNlbHNlCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKSAoKTsKLSNlbmRpZgotCi0vKiBTZXQgdGhlIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiBjYWxsYmFjay4gICovCi0KLWV4dGVybiB2b2lkIGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKSk7Ci0KLS8qIENhbGxlZCBiZWZvcmUgdHJ5aW5nIHRvIG1hdGNoIGEgdGFibGUgZW50cnkgd2l0aCB0aGUgaW5zbi4gICovCi0KLWV4dGVybiB2b2lkIGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQwKLS8qIE9wZXJhbmQgdmFsdWVzIChrZXl3b3JkcywgaW50ZWdlcnMsIHN5bWJvbHMsIGV0Yy4pICAqLwotCi0vKiBUeXBlcyBvZiBhc3NlbWJsZXIgZWxlbWVudHMuICAqLwotCi1lbnVtIGNnZW5fYXNtX3R5cGUKLXsKLSAgQ0dFTl9BU01fTk9ORSwgQ0dFTl9BU01fS0VZV09SRCwgQ0dFTl9BU01fTUFYCi19OwotCi0jaWZuZGVmIENHRU5fQVJDSAotZW51bSBjZ2VuX2h3X3R5cGUgeyBDR0VOX0hXX01BWCB9OwotI2VuZGlmCi0KLS8qIExpc3Qgb2YgaGFyZHdhcmUgZWxlbWVudHMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBjaGFyICpuYW1lOwotICBlbnVtIGNnZW5faHdfdHlwZSB0eXBlOwotICAvKiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gZXhhbXBsZSB3aGVyZSBib3RoIGluZGV4IHNwZWNzIGFuZCB2YWx1ZSBzcGVjcwotICAgICBhcmUgcmVxdWlyZWQsIHNvIGZvciBub3cgYm90aCBhcmUgY2x1bXBlZCB1bmRlciAiYXNtX2RhdGEiLiAgKi8KLSAgZW51bSBjZ2VuX2FzbV90eXBlIGFzbV90eXBlOwotICBQVFIgYXNtX2RhdGE7Ci0jaWZuZGVmIENHRU5fSFdfTkJPT0xfQVRUUlMKLSNkZWZpbmUgQ0dFTl9IV19OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLSAgQ0dFTl9BVFRSX1RZUEUgKENHRU5fSFdfTkJPT0xfQVRUUlMpIGF0dHJzOwotI2RlZmluZSBDR0VOX0hXX0FUVFJTKGh3KSAoJihodyktPmF0dHJzKQotfSBDR0VOX0hXX0VOVFJZOwotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gSFcuICAqLwotCi0jZGVmaW5lIENHRU5fSFdfQVRUUl9WQUxVRShodywgYXR0cikgXAotQ0dFTl9BVFRSX1ZBTFVFICgoaHcpLCBDR0VOX0hXX0FUVFJTIChodyksIChhdHRyKSkKLQotLyogVGFibGUgb2YgaGFyZHdhcmUgZWxlbWVudHMgZm9yIHNlbGVjdGVkIG1hY2gsIGNvbXB1dGVkIGF0IHJ1bnRpbWUuCi0gICBlbnVtIGNnZW5faHdfdHlwZSBpcyBhbiBpbmRleCBpbnRvIHRoaXMgdGFibGUgKHNwZWNpZmljYWxseSBgZW50cmllcycpLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBQb2ludGVyIHRvIG51bGwgdGVybWluYXRlZCB0YWJsZSBvZiBhbGwgY29tcGlsZWQgaW4gZW50cmllcy4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKmluaXRfZW50cmllczsKLSAgdW5zaWduZWQgaW50IGVudHJ5X3NpemU7IC8qIHNpbmNlIHRoZSBhdHRyaWJ1dGUgbWVtYmVyIGlzIHZhcmlhYmxlIHNpemVkICovCi0gIC8qIEFycmF5IG9mIGFsbCBlbnRyaWVzLCBpbml0aWFsIGFuZCBydW4tdGltZSBhZGRlZC4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKiplbnRyaWVzOwotICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYGVudHJpZXMnLiAgKi8KLSAgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOwotICAvKiBGb3Igbm93LCB4cmVhbGxvYyBpcyBjYWxsZWQgZWFjaCB0aW1lIGEgbmV3IGVudHJ5IGlzIGFkZGVkIGF0IHJ1bnRpbWUuCi0gICAgID8/PyBNYXkgd2lzaCB0byBrZWVwIHRyYWNrIG9mIHNvbWUgc2xvcCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0bwotICAgICB4cmVhbGxvYywgZXhjZXB0IHRoYXQgdGhlcmUncyB1bmxpa2VseSB0byBiZSBtYW55IGFuZCBub3QgZXhwZWN0ZWQgdG8gYmUKLSAgICAgaW4gc3BlZWQgY3JpdGljYWwgY29kZS4gICovCi19IENHRU5fSFdfVEFCTEU7Ci0KLWV4dGVybiBjb25zdCBDR0VOX0hXX0VOVFJZICogY2dlbl9od19sb29rdXBfYnlfbmFtZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBDR0VOX0hXX0VOVFJZICogY2dlbl9od19sb29rdXBfYnlfbnVtCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCkpOwotCi0vKiBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoaW5ncyBsaWtlIHJlZ2lzdGVyIG5hbWVzLCBldGMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2tleXdvcmRfZW50cnkKLXsKLSAgLyogTmFtZSAoYXMgaW4gcmVnaXN0ZXIgbmFtZSkuICAqLwotICBjaGFyICogbmFtZTsKLQotICAvKiBWYWx1ZSAoYXMgaW4gcmVnaXN0ZXIgbnVtYmVyKS4KLSAgICAgVGhlIHZhbHVlIGNhbm5vdCBiZSAtMSBhcyB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgIm5vdCBmb3VuZCIuCi0gICAgIElERUE6IEhhdmUgIkZVTkNUSU9OIiBhdHRyaWJ1dGU/IFtmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZmV0Y2ggdmFsdWVdLiAgKi8KLSAgaW50IHZhbHVlOwotCi0gIC8qIEF0dHJpYnV0ZXMuCi0gICAgIFRoaXMgc2hvdWxkLCBidXQgdGVjaG5pY2FsbHkgbmVlZG4ndCwgYXBwZWFyIGxhc3QuICBJdCBpcyBhIHZhcmlhYmxlIHNpemVkCi0gICAgIGFycmF5IGluIHRoYXQgb25lIGFyY2hpdGVjdHVyZSBtYXkgaGF2ZSAxIG5vbmJvb2wgYXR0cmlidXRlIGFuZCBhbm90aGVyCi0gICAgIG1heSBoYXZlIG1vcmUuICBIYXZpbmcgdGhpcyBsYXN0IG1lYW5zIHRoZSBub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUKLSAgICAgbmVlZG4ndCBjYXJlLiAgVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZWNvcmQKLSAgICAgYXR0cmlidXRlcyBpbiB0aGVpciByYXcgZm9ybSwgZXZhbHVhdGUgdGhlbSBhdCBydW4tdGltZSwgYW5kIGNhY2hlIHRoZQotICAgICB2YWx1ZXMsIHNvIHRoaXMgd29ycnkgd2lsbCBnbyBhd2F5IGFueXdheS4gICovCi0gIC8qID8/PyBNb3ZpbmcgdGhpcyBsYXN0IHNob3VsZCBiZSBkb25lIGJ5IHRyZWF0aW5nIGtleXdvcmRzIGxpa2UgaW5zbiBsaXN0cwotICAgICBhbmQgbW92aW5nIHRoZSBgbmV4dCcgZmllbGRzIGludG8gYSBDR0VOX0tFWVdPUkRfTElTVCBzdHJ1Y3QuICAqLwotICAvKiBGSVhNRTogTm90IHVzZWQgeWV0LiAgKi8KLSNpZm5kZWYgQ0dFTl9LRVlXT1JEX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fS0VZV09SRF9OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLSAgQ0dFTl9BVFRSX1RZUEUgKENHRU5fS0VZV09SRF9OQk9PTF9BVFRSUykgYXR0cnM7Ci0KLSAgLyogPz8/IFB1dHRpbmcgdGhlc2UgaGVyZSBtZWFucyBjb21waWxlZCBpbiBlbnRyaWVzIGNhbid0IGJlIGNvbnN0LgotICAgICBOb3QgYSByZWFsbHkgYmlnIGRlYWwsIGJ1dCBzb21ldGhpbmcgdG8gY29uc2lkZXIuICAqLwotICAvKiBOZXh0IG5hbWUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjZ2VuX2tleXdvcmRfZW50cnkgKm5leHRfbmFtZTsKLSAgLyogTmV4dCB2YWx1ZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IGNnZW5fa2V5d29yZF9lbnRyeSAqbmV4dF92YWx1ZTsKLX0gQ0dFTl9LRVlXT1JEX0VOVFJZOwotCi0vKiBUb3AgbGV2ZWwgc3RydWN0IGZvciBkZXNjcmliaW5nIGEgc2V0IG9mIHJlbGF0ZWQga2V5d29yZHMKLSAgIChlLmcuIHJlZ2lzdGVyIG5hbWVzKS4KLQotICAgVGhpcyBzdHJ1Y3Qgc3VwcG9ydHMgcnVuLXRpbWUgZW50cnkgb2YgbmV3IHZhbHVlcywgYW5kIGhhc2hlZCBsb29rdXBzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9rZXl3b3JkCi17Ci0gIC8qIFBvaW50ZXIgdG8gaW5pdGlhbCBbY29tcGlsZWQgaW5dIHZhbHVlcy4gICovCi0gIENHRU5fS0VZV09SRF9FTlRSWSAqaW5pdF9lbnRyaWVzOwotICAKLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYGluaXRfZW50cmllcycuICAqLwotICB1bnNpZ25lZCBpbnQgbnVtX2luaXRfZW50cmllczsKLSAgCi0gIC8qIEhhc2ggdGFibGUgdXNlZCBmb3IgbmFtZSBsb29rdXAuICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKipuYW1lX2hhc2hfdGFibGU7Ci0gIAotICAvKiBIYXNoIHRhYmxlIHVzZWQgZm9yIHZhbHVlIGxvb2t1cC4gICovCi0gIENHRU5fS0VZV09SRF9FTlRSWSAqKnZhbHVlX2hhc2hfdGFibGU7Ci0gIAotICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaGFzaF90YWJsZXMuICAqLwotICB1bnNpZ25lZCBpbnQgaGFzaF90YWJsZV9zaXplOwotICAKLSAgLyogUG9pbnRlciB0byBudWxsIGtleXdvcmQgIiIgZW50cnkgaWYgcHJlc2VudC4gICovCi0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqbnVsbF9lbnRyeTsKLX0gQ0dFTl9LRVlXT1JEOwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCBmb3Igc2VhcmNoaW5nLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGFibGUgYmVpbmcgc2VhcmNoZWQuICAqLwotICBjb25zdCBDR0VOX0tFWVdPUkQgKnRhYmxlOwotICAKLSAgLyogU3BlY2lmaWNhdGlvbiBvZiB3aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvci4gICovCi0gIGNvbnN0IGNoYXIgKnNwZWM7Ci0gIAotICAvKiBDdXJyZW50IGluZGV4IGluIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgY3VycmVudF9oYXNoOwotICAKLSAgLyogQ3VycmVudCBlbGVtZW50IGluIGN1cnJlbnQgaGFzaCBjaGFpbi4gICovCi0gIENHRU5fS0VZV09SRF9FTlRSWSAqY3VycmVudF9lbnRyeTsKLX0gQ0dFTl9LRVlXT1JEX1NFQVJDSDsKLQotLyogTG9va3VwIGEga2V5d29yZCBmcm9tIGl0cyBuYW1lLiAgKi8KLQotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICpjZ2VuX2tleXdvcmRfbG9va3VwX25hbWUKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBMb29rdXAgYSBrZXl3b3JkIGZyb20gaXRzIHZhbHVlLiAgKi8KLQotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICpjZ2VuX2tleXdvcmRfbG9va3VwX3ZhbHVlCi0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBpbnQpKTsKLQotLyogQWRkIGEga2V5d29yZC4gICovCi0KLXZvaWQgY2dlbl9rZXl3b3JkX2FkZCBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKiwgQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLQotLyogS2V5d29yZCBzZWFyY2hpbmcuCi0gICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGV2ZXJ5IGtleXdvcmQsIG9yIGEgc3Vic2V0LiAgKi8KLQotQ0dFTl9LRVlXT1JEX1NFQVJDSCBjZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICosIGNvbnN0IGNoYXIgKikpOwotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICpjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEX1NFQVJDSCAqKSk7Ci0KLS8qIE9wZXJhbmQgdmFsdWUgc3VwcG9ydCByb3V0aW5lcy4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX2tleXdvcmQKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgQ0dFTl9LRVlXT1JEICosIGxvbmcgKikpOwotI2lmZGVmIEJGRF9WRVJTSU9OIC8qIERvbid0IHJlcXVpcmUgYmZkLmggdW5uZWNlc3NhcmlseS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlcgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICoqLCBpbnQsIGxvbmcgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlcgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICoqLCBpbnQsIHVuc2lnbmVkIGxvbmcgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fcGFyc2VfYWRkcmVzcwotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICoqLCBpbnQsIGludCwKLQkgICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwgYmZkX3ZtYSAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqY2dlbl92YWxpZGF0ZV9zaWduZWRfaW50ZWdlcgotICAgICBQQVJBTVMgKChsb25nLCBsb25nLCBsb25nKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqY2dlbl92YWxpZGF0ZV91bnNpZ25lZF9pbnRlZ2VyCi0gICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLSNlbmRpZgotDAotLyogT3BlcmFuZCBtb2Rlcy4gICovCi0KLS8qID8/PyBUaGlzIGR1cGxpY2F0ZXMgdGhlIHZhbHVlcyBpbiBhcmNoLmguICBSZXZpc2l0LgotICAgVGhlc2UgaG93ZXZlciBuZWVkIHRoZSBDR0VOXyBwcmVmaXggW2FzIGRvZXMgZXZlcnl0aGluZyBpbiB0aGlzIGZpbGVdLiAgKi8KLS8qID8/PyBUYXJnZXRzIG1heSBuZWVkIHRvIGFkZCB0aGVpciBvd24gbW9kZXMgc28gd2UgbWF5IHdpc2ggdG8gbW92ZSB0aGlzCi0gICB0byA8YXJjaD4tb3BjLmgsIG9yIGFkZCBhIGhvb2suICAqLwotCi1lbnVtIGNnZW5fbW9kZSB7Ci0gIENHRU5fTU9ERV9WT0lELCAvKiA/Pz8gcmVuYW1lIHNpbXVsYXRvcidzIFZNIHRvIFZPSUQ/ICovCi0gIENHRU5fTU9ERV9CSSwgQ0dFTl9NT0RFX1FJLCBDR0VOX01PREVfSEksIENHRU5fTU9ERV9TSSwgQ0dFTl9NT0RFX0RJLAotICBDR0VOX01PREVfVUJJLCBDR0VOX01PREVfVVFJLCBDR0VOX01PREVfVUhJLCBDR0VOX01PREVfVVNJLCBDR0VOX01PREVfVURJLAotICBDR0VOX01PREVfU0YsIENHRU5fTU9ERV9ERiwgQ0dFTl9NT0RFX1hGLCBDR0VOX01PREVfVEYsCi0gIENHRU5fTU9ERV9UQVJHRVRfTUFYLAotICBDR0VOX01PREVfSU5ULCBDR0VOX01PREVfVUlOVCwKLSAgQ0dFTl9NT0RFX01BWAotfTsKLQotLyogRklYTUU6IFVudGlsIHNpbXVsYXRvciBpcyB1cGRhdGVkLiAgKi8KLQotI2RlZmluZSBDR0VOX01PREVfVk0gQ0dFTl9NT0RFX1ZPSUQKLQwKLS8qIE9wZXJhbmRzLiAgKi8KLQotI2lmbmRlZiBDR0VOX0FSQ0gKLWVudW0gY2dlbl9vcGVyYW5kX3R5cGUgeyBDR0VOX09QRVJBTkRfTUFYIH07Ci0jZW5kaWYKLQotLyogIm5pbCIgaW5kaWNhdG9yIGZvciB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZSAqLwotI2RlZmluZSBDR0VOX09QRVJBTkRfTklMIENHRU5fT1BFUkFORF9NQVgKLQotLyogVGhpcyBzdHJ1Y3QgZGVmaW5lcyBlYWNoIGVudHJ5IGluIHRoZSBvcGVyYW5kIHRhYmxlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogTmFtZSBhcyBpdCBhcHBlYXJzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgY2hhciAqbmFtZTsKLQotICAvKiBPcGVyYW5kIHR5cGUuICAqLwotICBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIHR5cGU7Ci0KLSAgLyogVGhlIGhhcmR3YXJlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3BlcmFuZC4gICovCi0gIGVudW0gY2dlbl9od190eXBlIGh3X3R5cGU7Ci0KLSAgLyogRklYTUU6IFdlIGRvbid0IHlldCByZWNvcmQgaWZpZWxkIGRlZmluaXRpb25zLCB3aGljaCB3ZSBzaG91bGQuCi0gICAgIFdoZW4gd2UgZG8gaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBkZWxldGUgc3RhcnQvbGVuZ3RoIChzaW5jZSB0aGV5IHdpbGwKLSAgICAgYmUgZHVwbGljYXRlZCBpbiB0aGUgaWZpZWxkJ3MgZGVmaW5pdGlvbikgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIGEKLSAgICAgcG9pbnRlciB0byB0aGUgaWZpZWxkIGVudHJ5LiAgKi8KLQotICAvKiBCaXQgcG9zaXRpb24uCi0gICAgIFRoaXMgaXMganVzdCBhIGhpbnQsIGFuZCBtYXkgYmUgdW51c2VkIGluIG1vcmUgY29tcGxleCBvcGVyYW5kcy4KLSAgICAgTWF5IGJlIHVudXNlZCBmb3IgYSBtb2RpZmllci4gICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhcnQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLgotICAgICBUaGlzIGlzIGp1c3QgYSBoaW50LCBhbmQgbWF5IGJlIHVudXNlZCBpbiBtb3JlIGNvbXBsZXggb3BlcmFuZHMuCi0gICAgIE1heSBiZSB1bnVzZWQgZm9yIGEgbW9kaWZpZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKLQotI2lmIDAgLyogPz8/IEludGVyZXN0aW5nIGlkZWEgYnV0IHJlbG9jcyB0ZW5kIHRvIGdldCB0b28gY29tcGxpY2F0ZWQsCi0JIGFuZCBBQkkgZGVwZW5kZW50LCBmb3Igc2ltcGxlIHRhYmxlIGxvb2t1cHMgdG8gd29yay4gICovCi0gIC8qIElkZWFsbHkgdGhpcyB3b3VsZCBiZSB0aGUgaW50ZXJuYWwgKGV4dGVybmFsPykgcmVsb2MgdHlwZS4gICovCi0gIGludCByZWxvY190eXBlOwotI2VuZGlmCi0KLSAgLyogQXR0cmlidXRlcy4KLSAgICAgVGhpcyBzaG91bGQsIGJ1dCB0ZWNobmljYWxseSBuZWVkbid0LCBhcHBlYXIgbGFzdC4gIEl0IGlzIGEgdmFyaWFibGUgc2l6ZWQKLSAgICAgYXJyYXkgaW4gdGhhdCBvbmUgYXJjaGl0ZWN0dXJlIG1heSBoYXZlIDEgbm9uYm9vbCBhdHRyaWJ1dGUgYW5kIGFub3RoZXIKLSAgICAgbWF5IGhhdmUgbW9yZS4gIEhhdmluZyB0aGlzIGxhc3QgbWVhbnMgdGhlIG5vbi1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZQotICAgICBuZWVkbid0IGNhcmUsIG5vdyBvciB0b21vcnJvdy4gIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVjb3JkCi0gICAgIGF0dHJpYnV0ZXMgaW4gdGhlaXIgcmF3IGZvcm0sIGV2YWx1YXRlIHRoZW0gYXQgcnVuLXRpbWUsIGFuZCBjYWNoZSB0aGUKLSAgICAgdmFsdWVzLCBzbyB0aGlzIHdvcnJ5IHdpbGwgZ28gYXdheSBhbnl3YXkuICAqLwotI2lmbmRlZiBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMKLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTIDEKLSNlbmRpZgotICBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTKSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX0FUVFJTKG9wZXJhbmQpICgmKG9wZXJhbmQpLT5hdHRycykKLX0gQ0dFTl9PUEVSQU5EOwotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gT1BFUkFORC4gICovCi0KLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUob3BlcmFuZCwgYXR0cikgXAotQ0dFTl9BVFRSX1ZBTFVFICgob3BlcmFuZCksIENHRU5fT1BFUkFORF9BVFRSUyAob3BlcmFuZCksIChhdHRyKSkKLQotLyogVGFibGUgb2Ygb3BlcmFuZHMgZm9yIHNlbGVjdGVkIG1hY2gvaXNhLCBjb21wdXRlZCBhdCBydW50aW1lLgotICAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSBpcyBhbiBpbmRleCBpbnRvIHRoaXMgdGFibGUgKHNwZWNpZmljYWxseQotICAgYGVudHJpZXMnKS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogUG9pbnRlciB0byBudWxsIHRlcm1pbmF0ZWQgdGFibGUgb2YgYWxsIGNvbXBpbGVkIGluIGVudHJpZXMuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKmluaXRfZW50cmllczsKLSAgdW5zaWduZWQgaW50IGVudHJ5X3NpemU7IC8qIHNpbmNlIHRoZSBhdHRyaWJ1dGUgbWVtYmVyIGlzIHZhcmlhYmxlIHNpemVkICovCi0gIC8qIEFycmF5IG9mIGFsbCBlbnRyaWVzLCBpbml0aWFsIGFuZCBydW4tdGltZSBhZGRlZC4gICovCi0gIGNvbnN0IENHRU5fT1BFUkFORCAqKmVudHJpZXM7Ci0gIC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiBgZW50cmllcycuICAqLwotICB1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7Ci0gIC8qIEZvciBub3csIHhyZWFsbG9jIGlzIGNhbGxlZCBlYWNoIHRpbWUgYSBuZXcgZW50cnkgaXMgYWRkZWQgYXQgcnVudGltZS4KLSAgICAgPz8/IE1heSB3aXNoIHRvIGtlZXAgdHJhY2sgb2Ygc29tZSBzbG9wIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvCi0gICAgIHhyZWFsbG9jLCBleGNlcHQgdGhhdCB0aGVyZSdzIHVubGlrZWx5IHRvIGJlIG1hbnkgYW5kIG5vdCBleHBlY3RlZCB0byBiZQotICAgICBpbiBzcGVlZCBjcml0aWNhbCBjb2RlLiAgKi8KLX0gQ0dFTl9PUEVSQU5EX1RBQkxFOwotCi1leHRlcm4gY29uc3QgQ0dFTl9PUEVSQU5EICogY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9uYW1lCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IENHRU5fT1BFUkFORCAqIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCkpOwotDAotLyogSW5zdHJ1Y3Rpb24gb3BlcmFuZCBpbnN0YW5jZXMuCi0KLSAgIEZvciBlYWNoIGluc3RydWN0aW9uLCBhIGxpc3Qgb2YgdGhlIGhhcmR3YXJlIGVsZW1lbnRzIHRoYXQgYXJlIHJlYWQgYW5kCi0gICB3cml0dGVuIGFyZSByZWNvcmRlZC4gICovCi0KLS8qIFRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZS4gICovCi0KLWVudW0gY2dlbl9vcGluc3RfdHlwZSB7Ci0gIC8qIEVuZCBvZiB0YWJsZSBtYXJrZXIuICAqLwotICBDR0VOX09QSU5TVF9FTkQgPSAwLAotICBDR0VOX09QSU5TVF9JTlBVVCwgQ0dFTl9PUElOU1RfT1VUUFVUCi19OwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBJbnB1dCBvciBvdXRwdXQgaW5kaWNhdG9yLiAgKi8KLSAgZW51bSBjZ2VuX29waW5zdF90eXBlIHR5cGU7Ci0KLSAgLyogTmFtZSBvZiBvcGVyYW5kLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgaGFyZHdhcmUgZWxlbWVudCByZWZlcmVuY2VkLiAgKi8KLSAgZW51bSBjZ2VuX2h3X3R5cGUgaHdfdHlwZTsKLQotICAvKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgb3BlcmFuZCBpcyBiZWluZyB1c2VkLiAgKi8KLSAgZW51bSBjZ2VuX21vZGUgbW9kZTsKLQotICAvKiBUaGUgb3BlcmFuZCB0YWJsZSBlbnRyeSBDR0VOX09QRVJBTkRfTklMIGlmIHRoZXJlIGlzIG5vbmUKLSAgICAgKGkuZS4gYW4gZXhwbGljaXQgaGFyZHdhcmUgcmVmZXJlbmNlKS4gICovCi0gIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgb3BfdHlwZTsKLQotICAvKiBJZiBgb3BlcmFuZCcgaXMgIm5pbCIsIHRoZSBpbmRleCAoZS5nLiBpbnRvIGFycmF5IG9mIHJlZ2lzdGVycykuICAqLwotICBpbnQgaW5kZXg7Ci0KLSAgLyogQXR0cmlidXRlcy4KLSAgICAgPz8/IFRoaXMgcGVyaGFwcyBzaG91bGQgYmUgYSByZWFsIGF0dHJpYnV0ZSBzdHJ1Y3QgYnV0IHRoZXJlJ3MKLSAgICAgbm8gY3VycmVudCBuZWVkLCBzbyB3ZSBzYXZlIGEgYml0IG9mIHNwYWNlIGFuZCBqdXN0IGhhdmUgYSBzZXQgb2YKLSAgICAgZmxhZ3MuICBUaGUgaW50ZXJmYWNlIGlzIHN1Y2ggdGhhdCB0aGlzIGNhbiBlYXNpbHkgYmUgbWFkZSBhdHRyaWJ1dGVzCi0gICAgIHNob3VsZCBpdCBwcm92ZSB1c2VmdWwuICAqLwotICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0jZGVmaW5lIENHRU5fT1BJTlNUX0FUVFJTKG9waW5zdCkgKChvcGluc3QpLT5hdHRycykKLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBPUElOU1QuICAqLwotI2RlZmluZSBDR0VOX09QSU5TVF9BVFRSKG9waW5zdCwgYXR0cikgXAotKChDR0VOX09QSU5TVF9BVFRSUyAob3BpbnN0KSAmIChhdHRyKSkgIT0gMCkKLS8qIE9wZXJhbmQgaXMgY29uZGl0aW9uYWxseSByZWZlcmVuY2VkIChyZWFkL3dyaXR0ZW4pLiAgKi8KLSNkZWZpbmUgQ0dFTl9PUElOU1RfQ09ORF9SRUYgMQotfSBDR0VOX09QSU5TVDsKLQwKLS8qIFN5bnRheCBzdHJpbmcuCi0KLSAgIEVhY2ggaW5zbiBmb3JtYXQgYW5kIHN1YmV4cHJlc3Npb24gaGFzIG9uZSBvZiB0aGVzZS4KLQotICAgVGhlIHN5bnRheCAic3RyaW5nIiBjb25zaXN0cyBvZiBjaGFyYWN0ZXJzIChuID4gMCAmJiBuIDwgMTI4KSwgYW5kIG9wZXJhbmQKLSAgIHZhbHVlcyAobiA+PSAxMjgpLCBhbmQgaXMgdGVybWluYXRlZCBieSAwLiAgT3BlcmFuZCB2YWx1ZXMgYXJlIDEyOCArIGluZGV4Ci0gICBpbnRvIHRoZSBvcGVyYW5kIHRhYmxlLiAgVGhlIG9wZXJhbmQgdGFibGUgZG9lc24ndCBleGlzdCBpbiBDLCBwZXIgc2UsIGFzCi0gICB0aGUgZGF0YSBpcyByZWNvcmRlZCBpbiB0aGUgcGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgc3dpdGNoIHN0YXRlbWVudHMuICovCi0KLSNpZm5kZWYgQ0dFTl9NQVhfU1lOVEFYX0JZVEVTCi0jZGVmaW5lIENHRU5fTUFYX1NZTlRBWF9CWVRFUyAxNgotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgc3ludGF4W0NHRU5fTUFYX1NZTlRBWF9CWVRFU107Ci19IENHRU5fU1lOVEFYOwotCi0jZGVmaW5lIENHRU5fU1lOVEFYX1NUUklORyhzeW4pIChzeW4tPnN5bnRheCkKLSNkZWZpbmUgQ0dFTl9TWU5UQVhfQ0hBUl9QKGMpICgoYykgPCAxMjgpCi0jZGVmaW5lIENHRU5fU1lOVEFYX0NIQVIoYykgKGMpCi0jZGVmaW5lIENHRU5fU1lOVEFYX0ZJRUxEKGMpICgoYykgLSAxMjgpCi0jZGVmaW5lIENHRU5fU1lOVEFYX01BS0VfRklFTEQoYykgKChjKSArIDEyOCkKLQotLyogPz8/IEkgY2FuJ3QgY3VycmVudGx5IHRoaW5rIG9mIGFueSBjYXNlIHdoZXJlIHRoZSBtbmVtb25pYyBkb2Vzbid0IGNvbWUKLSAgIGZpcnN0IFthbmQgaWYgb25lIGV2ZXIgZG9lc24ndCBidWlsZGluZyB0aGUgaGFzaCB0YWJsZXMgd2lsbCBiZSB0cmlja3ldLgotICAgSG93ZXZlciwgd2UgdHJlYXQgbW5lbW9uaWNzIGFzIGp1c3QgYW5vdGhlciBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIEEgdmFsdWUgb2YgMSBtZWFucyAidGhpcyBpcyB3aGVyZSB0aGUgbW5lbW9uaWMgYXBwZWFycyIuICAxIGlzbid0Ci0gICBzcGVjaWFsIG90aGVyIHRoYW4gaXQncyBhIG5vbi1wcmludGFibGUgQVNDSUkgY2hhci4gICovCi0KLSNkZWZpbmUgQ0dFTl9TWU5UQVhfTU5FTU9OSUMgICAgICAgMQotI2RlZmluZSBDR0VOX1NZTlRBWF9NTkVNT05JQ19QKGNoKSAoKGNoKSA9PSBDR0VOX1NZTlRBWF9NTkVNT05JQykKLQwKLS8qIEluc3RydWN0aW9uIGZpZWxkcy4KLQotICAgPz8/IFdlIGN1cnJlbnRseSBkb24ndCBhbGxvdyBhZGRpbmcgZmllbGRzIGF0IHJ1bi10aW1lLgotICAgRWFzeSB0byBmaXggd2hlbiBuZWVkZWQuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2lmbGQgewotICAvKiBFbnVtIG9mIGlmaWVsZC4gICovCi0gIGludCBudW07Ci0jZGVmaW5lIENHRU5fSUZMRF9OVU0oZikgKChmKS0+bnVtKQotCi0gIC8qIE5hbWUgb2YgdGhlIGZpZWxkLCBkaXN0aW5ndWlzaGVzIGl0IGZyb20gYWxsIG90aGVyIGZpZWxkcy4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0jZGVmaW5lIENHRU5fSUZMRF9OQU1FKGYpICgoZiktPm5hbWUpCi0KLSAgLyogRGVmYXVsdCBvZmZzZXQsIGluIGJpdHMsIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIHRvIHRoZSB3b3JkCi0gICAgIGNvbnRhaW5pbmcgdGhlIGZpZWxkLiAgKi8KLSAgaW50IHdvcmRfb2Zmc2V0OwotI2RlZmluZSBDR0VOX0lGTERfV09SRF9PRkZTRVQoZikgKChmKS0+d29yZF9vZmZzZXQpCi0KLSAgLyogRGVmYXVsdCBsZW5ndGggb2YgdGhlIHdvcmQgY29udGFpbmluZyB0aGUgZmllbGQuICAqLwotICBpbnQgd29yZF9zaXplOwotI2RlZmluZSBDR0VOX0lGTERfV09SRF9TSVpFKGYpICgoZiktPndvcmRfc2l6ZSkKLQotICAvKiBEZWZhdWx0IHN0YXJ0aW5nIGJpdCBudW1iZXIuCi0gICAgIFdoZXRoZXIgbHNiPTAgb3IgbXNiPTAgaXMgZGV0ZXJtaW5lZCBieSBDR0VOX0lOU05fTFNCMF9QLiAgKi8KLSAgaW50IHN0YXJ0OwotI2RlZmluZSBDR0VOX0lGTERfU1RBUlQoZikgKChmKS0+c3RhcnQpCi0KLSAgLyogTGVuZ3RoIG9mIHRoZSBmaWVsZCwgaW4gYml0cy4gICovCi0gIGludCBsZW5ndGg7Ci0jZGVmaW5lIENHRU5fSUZMRF9MRU5HVEgoZikgKChmKS0+bGVuZ3RoKQotCi0jaWZuZGVmIENHRU5fSUZMRF9OQk9PTF9BVFRSUwotI2RlZmluZSBDR0VOX0lGTERfTkJPT0xfQVRUUlMgMQotI2VuZGlmCi0gIENHRU5fQVRUUl9UWVBFIChDR0VOX0lGTERfTkJPT0xfQVRUUlMpIGF0dHJzOwotI2RlZmluZSBDR0VOX0lGTERfQVRUUlMoZikgKCYoZiktPmF0dHJzKQotfSBDR0VOX0lGTEQ7Ci0KLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBJRkxELiAgKi8KLSNkZWZpbmUgQ0dFTl9JRkxEX0FUVFJfVkFMVUUoaWZsZCwgYXR0cikgXAotQ0dFTl9BVFRSX1ZBTFVFICgoaWZsZCksIENHRU5fSUZMRF9BVFRSUyAoaWZsZCksIChhdHRyKSkKLQwKLS8qIEluc3RydWN0aW9uIGRhdGEuICAqLwotCi0vKiBJbnN0cnVjdGlvbiBmb3JtYXRzLgotCi0gICBJbnN0cnVjdGlvbnMgYXJlIGdyb3VwZWQgYnkgZm9ybWF0LiAgQXNzb2NpYXRlZCB3aXRoIGFuIGluc3RydWN0aW9uIGlzIGl0cwotICAgZm9ybWF0LiAgRWFjaCBpbnNuJ3Mgb3Bjb2RlIHRhYmxlIGVudHJ5IGNvbnRhaW5zIGEgZm9ybWF0IHRhYmxlIGVudHJ5LgotICAgPz8/IFRoZXJlIGlzIHVzdWFsbHkgdmVyeSBmZXcgZm9ybWF0cyBjb21wYXJlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5zbnMsCi0gICBzbyBvbmUgY2FuIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgb3Bjb2RlIHRhYmxlIGJ5IHJlY29yZGluZyB0aGUgZm9ybWF0IHRhYmxlCi0gICBhcyBhIHNlcGFyYXRlIGVudGl0eS4gIEdpdmVuIHRoYXQgd2UgY3VycmVudGx5IGRvbid0LCBmb3JtYXQgdGFibGUgZW50cmllcwotICAgYXJlIGFsc28gZGlzdGluZ3Vpc2hlZCBieSB0aGVpciBvcGVyYW5kcy4gIFRoaXMgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZQotICAgdGFibGUsIGJ1dCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgdGFibGVzLiAgSXQncyBhbGwgbWludXRpYWUgYW55d2F5IHNvIGl0Ci0gICBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgW2F0IHRoaXMgcG9pbnQgaW4gdGltZV0uCi0KLSAgID8/PyBTdXBwb3J0IGZvciB2YXJpYWJsZSBsZW5ndGggSVNBJ3MgaXMgd2lwLiAgKi8KLQotLyogQWNjb21wYW55aW5nIGVhY2ggaWZvcm1hdCBkZXNjcmlwdGlvbiBpcyBhIGxpc3Qgb2YgaXRzIGZpZWxkcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgQ0dFTl9JRkxEICppZmxkOwotI2RlZmluZSBDR0VOX0lGTVRfSUZMRF9JRkxEKGlpKSAoKGlpKS0+aWZsZCkKLX0gQ0dFTl9JRk1UX0lGTEQ7Ci0KLSNpZm5kZWYgQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUwotI2RlZmluZSBDR0VOX01BWF9JRk1UX09QRVJBTkRTIDEKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBMZW5ndGggdGhhdCBNQVNLIGFuZCBWQUxVRSBoYXZlIGJlZW4gY2FsY3VsYXRlZCB0bwotICAgICBbVkFMVUUgaXMgcmVjb3JkZWQgZWxzZXdoZXJlXS4KLSAgICAgTm9ybWFsbHkgaXQgaXMgYmFzZV9pbnNuX2JpdHNpemUuICBPbiBbVl1MSVcgYXJjaGl0ZWN0dXJlcyB3aGVyZSB0aGUgYmFzZQotICAgICBpbnNuIHNpemUgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIGFuIGluc24sIHRoaXMgZmllbGQgaXMgbGVzcyB0aGFuCi0gICAgIGJhc2VfaW5zbl9iaXRzaXplLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtYXNrX2xlbmd0aDsKLSNkZWZpbmUgQ0dFTl9JRk1UX01BU0tfTEVOR1RIKGlmbXQpICgoaWZtdCktPm1hc2tfbGVuZ3RoKQotCi0gIC8qIFRvdGFsIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiwgaW4gYml0cy4gICovCi0gIHVuc2lnbmVkIGNoYXIgbGVuZ3RoOwotI2RlZmluZSBDR0VOX0lGTVRfTEVOR1RIKGlmbXQpICgoaWZtdCktPmxlbmd0aCkKLQotICAvKiBNYXNrIHRvIGFwcGx5IHRvIHRoZSBmaXJzdCBNQVNLX0xFTkdUSCBiaXRzLgotICAgICBFYWNoIGluc24ncyB2YWx1ZSBpcyBzdG9yZWQgd2l0aCB0aGUgaW5zbi4KLSAgICAgVGhlIGZpcnN0IHN0ZXAgaW4gcmVjb2duaXppbmcgYW4gaW5zbiBmb3IgZGlzYXNzZW1ibHkgaXMKLSAgICAgKG9wY29kZSAmIG1hc2spID09IHZhbHVlLiAgKi8KLSAgQ0dFTl9JTlNOX0lOVCBtYXNrOwotI2RlZmluZSBDR0VOX0lGTVRfTUFTSyhpZm10KSAoKGlmbXQpLT5tYXNrKQotCi0gIC8qIEluc3RydWN0aW9uIGZpZWxkcy4KLSAgICAgKzEgZm9yIHRyYWlsaW5nIE5VTEwuICAqLwotICBDR0VOX0lGTVRfSUZMRCBpZmxkc1tDR0VOX01BWF9JRk1UX09QRVJBTkRTICsgMV07Ci0jZGVmaW5lIENHRU5fSUZNVF9JRkxEUyhpZm10KSAoKGlmbXQpLT5pZmxkcykKLX0gQ0dFTl9JRk1UOwotCi0vKiBJbnN0cnVjdGlvbiB2YWx1ZXMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGUgb3Bjb2RlIHBvcnRpb24gb2YgdGhlIGJhc2UgaW5zbi4gICovCi0gIENHRU5fSU5TTl9JTlQgYmFzZV92YWx1ZTsKLQotI2lmZGVmIENHRU5fTUFYX0VYVFJBX09QQ09ERV9PUEVSQU5EUwotICAvKiBFeHRyYSBvcGNvZGUgdmFsdWVzIGJleW9uZCBiYXNlX3ZhbHVlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpZmllbGRfdmFsdWVzW0NHRU5fTUFYX0VYVFJBX09QQ09ERV9PUEVSQU5EU107Ci0jZW5kaWYKLX0gQ0dFTl9JVkFMVUU7Ci0KLS8qIEluc3RydWN0aW9uIG9wY29kZSB0YWJsZS4KLSAgIFRoaXMgY29udGFpbnMgdGhlIHN5bnRheCBhbmQgZm9ybWF0IGRhdGEgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi0vKiA/Pz8gU29tZSBwb3J0cyBhbHJlYWR5IGhhdmUgYW4gb3Bjb2RlIHRhYmxlIHlldCBzdGlsbCBuZWVkIHRvIHVzZSB0aGUgcmVzdAotICAgb2Ygd2hhdCBjZ2VuX2luc24gaGFzLiAgUGx1cyBrZWVwaW5nIHRoZSBvcGNvZGUgZGF0YSB3aXRoIHRoZSBvcGVyYW5kCi0gICBpbnN0YW5jZSBkYXRhIGNhbiBjcmVhdGUgYSBwcmV0dHkgYmlnIGZpbGUuICBTbyB3ZSBrZWVwIHRoZW0gc2VwYXJhdGVseS4KLSAgIE5vdCBzdXJlIHRoaXMgaXMgYSBnb29kIGlkZWEgaW4gdGhlIGxvbmcgcnVuLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogSW5kaWNlcyBpbnRvIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXIgdGFibGVzLiAgKi8KLSAgc3RydWN0IGNnZW5fb3Bjb2RlX2hhbmRsZXIgaGFuZGxlcnM7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX0hBTkRMRVJTKG9wYykgKCYgKG9wYyktPmhhbmRsZXJzKQotCi0gIC8qIFN5bnRheCBzdHJpbmcuICAqLwotICBDR0VOX1NZTlRBWCBzeW50YXg7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX1NZTlRBWChvcGMpICgmIChvcGMpLT5zeW50YXgpCi0KLSAgLyogRm9ybWF0IGVudHJ5LiAgKi8KLSAgY29uc3QgQ0dFTl9JRk1UICpmb3JtYXQ7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX0ZPUk1BVChvcGMpICgob3BjKS0+Zm9ybWF0KQotI2RlZmluZSBDR0VOX09QQ09ERV9NQVNLX0JJVFNJWkUob3BjKSBDR0VOX0lGTVRfTUFTS19MRU5HVEggKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLSNkZWZpbmUgQ0dFTl9PUENPREVfQklUU0laRShvcGMpIENHRU5fSUZNVF9MRU5HVEggKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLSNkZWZpbmUgQ0dFTl9PUENPREVfSUZMRFMob3BjKSBDR0VOX0lGTVRfSUZMRFMgKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLQotICAvKiBJbnN0cnVjdGlvbiBvcGNvZGUgdmFsdWUuICAqLwotICBDR0VOX0lWQUxVRSB2YWx1ZTsKLSNkZWZpbmUgQ0dFTl9PUENPREVfVkFMVUUob3BjKSAoJiAob3BjKS0+dmFsdWUpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0JBU0VfVkFMVUUob3BjKSAoQ0dFTl9PUENPREVfVkFMVUUgKG9wYyktPmJhc2VfdmFsdWUpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0JBU0VfTUFTSyhvcGMpIENHRU5fSUZNVF9NQVNLIChDR0VOX09QQ09ERV9GT1JNQVQgKG9wYykpCi19IENHRU5fT1BDT0RFOwotCi0vKiBJbnN0cnVjdGlvbiBhdHRyaWJ1dGVzLgotICAgVGhpcyBpcyBtYWRlIGEgcHVibGlzaGVkIHR5cGUgYXMgYXBwbGljYXRpb25zIGNhbiBjYWNoZSBhIHBvaW50ZXIgdG8KLSAgIHRoZSBhdHRyaWJ1dGVzIGZvciBzcGVlZC4gICovCi0KLSNpZm5kZWYgQ0dFTl9JTlNOX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLXR5cGVkZWYgQ0dFTl9BVFRSX1RZUEUgKENHRU5fSU5TTl9OQk9PTF9BVFRSUykgQ0dFTl9JTlNOX0FUVFJfVFlQRTsKLQotLyogRW51bSBvZiBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgYXR0cmlidXRlcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9BUkNICi0vKiA/Pz8gTnVtYmVycyBoZXJlIGFyZSByZWNvcmRlZCBpbiB0d28gcGxhY2VzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fYXR0ciB7Ci0gIENHRU5fSU5TTl9BTElBUyA9IDAKLX0gQ0dFTl9JTlNOX0FUVFI7Ci0jZW5kaWYKLQotLyogVGhpcyBzdHJ1Y3QgZGVmaW5lcyBlYWNoIGVudHJ5IGluIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEVhY2ggcmVhbCBpbnN0cnVjdGlvbiBpcyBlbnVtZXJhdGVkLiAgKi8KLSAgLyogPz8/IFRoaXMgbWF5IGdvIGF3YXkgaW4gdGltZS4gICovCi0gIGludCBudW07Ci0jZGVmaW5lIENHRU5fSU5TTl9OVU0oaW5zbikgKChpbnNuKS0+YmFzZS0+bnVtKQotCi0gIC8qIE5hbWUgb2YgZW50cnkgKHRoYXQgZGlzdGluZ3Vpc2hlcyBpdCBmcm9tIGFsbCBvdGhlciBlbnRyaWVzKS4gICovCi0gIC8qID8/PyBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcywgdHJ5IHRvIHByaW50IGZ1bGwgbW5lbW9uaWMuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotI2RlZmluZSBDR0VOX0lOU05fTkFNRShpbnNuKSAoKGluc24pLT5iYXNlLT5uYW1lKQotCi0gIC8qIE1uZW1vbmljLiAgVGhpcyBpcyB1c2VkIHdoZW4gcGFyc2luZyBhbmQgcHJpbnRpbmcgdGhlIGluc24uCi0gICAgIEluIHRoZSBjYXNlIG9mIGluc25zIHRoYXQgaGF2ZSBvcGVyYW5kcyBvbiB0aGUgbW5lbW9uaWNzLCB0aGlzIGlzCi0gICAgIG9ubHkgdGhlIGNvbnN0YW50IHBhcnQuICBFLmcuIGZvciBjb25kaXRpb25hbCBleGVjdXRpb24gb2YgYW4gYGFkZCcgaW5zbiwKLSAgICAgd2hlcmUgdGhlIGZ1bGwgbW5lbW9uaWMgaXMgYWRkZXEsIGFkZG5lLCBldGMuLCBhbmQgdGhlIGNvbmRpdGlvbiBpcwotICAgICB0cmVhdGVkIGFzIGFuIG9wZXJhbmQsIHRoaXMgaXMgb25seSAiYWRkIi4gICovCi0gIGNvbnN0IGNoYXIgKm1uZW1vbmljOwotI2RlZmluZSBDR0VOX0lOU05fTU5FTU9OSUMoaW5zbikgKChpbnNuKS0+YmFzZS0+bW5lbW9uaWMpCi0KLSAgLyogVG90YWwgbGVuZ3RoIG9mIGluc3RydWN0aW9uLCBpbiBiaXRzLiAgKi8KLSAgaW50IGJpdHNpemU7Ci0jZGVmaW5lIENHRU5fSU5TTl9CSVRTSVpFKGluc24pICgoaW5zbiktPmJhc2UtPmJpdHNpemUpCi0KLSNpZiAwIC8qID8/PyBEaXNhYmxlZCBmb3Igbm93IGFzIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGVtYmVkZGVkIG5ld2xpbmVzCi0JIGFuZCB0aGUgdGFibGUgaXMgYWxyZWFkeSBwcmV0dHkgYmlnLiAgU2hvdWxkIHBlcmhhcHMgYmUgbW92ZWQKLQkgdG8gYSBmaWxlIG9mIGl0cyBvd24uICAqLwotICAvKiBTZW1hbnRpY3MsIGFzIFJUTC4gICovCi0gIC8qID8/PyBQbGFpbiB0ZXh0IG9yIGJ5dGVjb2Rlcz8gICovCi0gIC8qID8/PyBOb3RlIHRoYXQgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUgY291bGQgYmUgY29tcHV0ZWQgYXQgcnVuLXRpbWUKLSAgICAgaWYgd2UgcGFyc2UgdGhpcyBhbmQgY2FjaGUgdGhlIHJlc3VsdHMuICBTb21ldGhpbmcgdG8gZXZlbnR1YWxseSBkby4gICovCi0gIGNvbnN0IGNoYXIgKnJ0eDsKLSNkZWZpbmUgQ0dFTl9JTlNOX1JUWChpbnNuKSAoKGluc24pLT5iYXNlLT5ydHgpCi0jZW5kaWYKLQotICAvKiBBdHRyaWJ1dGVzLgotICAgICBUaGlzIG11c3QgYXBwZWFyIGxhc3QuICBJdCBpcyBhIHZhcmlhYmxlIHNpemVkIGFycmF5IGluIHRoYXQgb25lCi0gICAgIGFyY2hpdGVjdHVyZSBtYXkgaGF2ZSAxIG5vbmJvb2wgYXR0cmlidXRlIGFuZCBhbm90aGVyIG1heSBoYXZlIG1vcmUuCi0gICAgIEhhdmluZyB0aGlzIGxhc3QgbWVhbnMgdGhlIG5vbi1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZSBuZWVkbid0Ci0gICAgIGNhcmUuICBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlY29yZCBhdHRyaWJ1dGVzIGluIHRoZWlyIHJhdyBmb3JtLAotICAgICBldmFsdWF0ZSB0aGVtIGF0IHJ1bi10aW1lLCBhbmQgY2FjaGUgdGhlIHZhbHVlcywgc28gdGhpcyB3b3JyeSB3aWxsIGdvCi0gICAgIGF3YXkgYW55d2F5LiAgKi8KLSAgQ0dFTl9JTlNOX0FUVFJfVFlQRSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9JTlNOX0FUVFJTKGluc24pICgmKGluc24pLT5iYXNlLT5hdHRycykKLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBJTlNOLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0FUVFJfVkFMVUUoaW5zbiwgYXR0cikgXAotQ0dFTl9BVFRSX1ZBTFVFICgoaW5zbiksIENHRU5fSU5TTl9BVFRSUyAoaW5zbiksIChhdHRyKSkKLX0gQ0dFTl9JQkFTRTsKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElOU04gaXMgdGhlICJpbnZhbGlkIiBpbnNuIG1hcmtlci4gICovCi0KLSNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSURfUChpbnNuKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSA9PSAwKQotCi0vKiBNYWluIHN0cnVjdCBjb250YWluIGluc3RydWN0aW9uIGluZm9ybWF0aW9uLgotICAgQkFTRSBpcyBhbHdheXMgcHJlc2VudCwgdGhlIHJlc3QgaXMgcHJlc2VudCBvbmx5IGlmIGFza2VkIGZvci4gICovCi0KLXN0cnVjdCBjZ2VuX2luc24KLXsKLSAgLyogPz8/IE1heSBiZSBvZiB1c2UgdG8gcHV0IGEgdHlwZSBpbmRpY2F0b3IgaGVyZS4KLSAgICAgVGhlbiB0aGlzIHN0cnVjdCBjb3VsZCBkaWZmZXJlbnQgaW5mbyBmb3IgZGlmZmVyZW50IGNsYXNzZXMgb2YgaW5zbnMuICAqLwotICAvKiA/Pz8gQSBzcGVlZHVwIGNhbiBiZSBoYWQgYnkgbW92aW5nIGBiYXNlJyBpbnRvIHRoaXMgc3RydWN0LgotICAgICBNYXliZSBsYXRlci4gICovCi0gIGNvbnN0IENHRU5fSUJBU0UgKmJhc2U7Ci0gIGNvbnN0IENHRU5fT1BDT0RFICpvcGNvZGU7Ci0gIGNvbnN0IENHRU5fT1BJTlNUICpvcGluc3Q7Ci19OwotCi0vKiBJbnN0cnVjdGlvbiBsaXN0cy4KLSAgIFRoaXMgaXMgdXNlZCBmb3IgYWRkaW5nIG5ldyBlbnRyaWVzIGFuZCBmb3IgY3JlYXRpbmcgdGhlIGhhc2ggbGlzdHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2luc25fbGlzdAotewotICBzdHJ1Y3QgY2dlbl9pbnNuX2xpc3QgKm5leHQ7Ci0gIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLX0gQ0dFTl9JTlNOX0xJU1Q7Ci0KLS8qIFRhYmxlIG9mIGluc3RydWN0aW9ucy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IENHRU5fSU5TTiAqaW5pdF9lbnRyaWVzOwotICB1bnNpZ25lZCBpbnQgZW50cnlfc2l6ZTsgLyogc2luY2UgdGhlIGF0dHJpYnV0ZSBtZW1iZXIgaXMgdmFyaWFibGUgc2l6ZWQgKi8KLSAgdW5zaWduZWQgaW50IG51bV9pbml0X2VudHJpZXM7Ci0gIENHRU5fSU5TTl9MSVNUICpuZXdfZW50cmllczsKLX0gQ0dFTl9JTlNOX1RBQkxFOwotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bi10aW1lLiAgKi8KLQotZXh0ZXJuIGludCBjZ2VuX2luc25fY291bnQgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotZXh0ZXJuIGludCBjZ2VuX21hY3JvX2luc25fY291bnQgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBNYWNyb3MgdG8gYWNjZXNzIHRoZSBvdGhlciBpbnNuIGVsZW1lbnRzIG5vdCByZWNvcmRlZCBpbiBDR0VOX0lCQVNFLiAgKi8KLQotLyogRmV0Y2ggSU5TTidzIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuICAqLwotLyogPz8/IERvZXNuJ3QgaGFuZGxlIGluc25zIGFkZGVkIGF0IHJ1bnRpbWUuICAqLwotI2RlZmluZSBDR0VOX0lOU05fT1BFUkFORFMoaW5zbikgKChpbnNuKS0+b3BpbnN0KQotCi0vKiBSZXR1cm4gSU5TTidzIG9wY29kZSB0YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9PUENPREUoaW5zbikgKChpbnNuKS0+b3Bjb2RlKQotCi0vKiBSZXR1cm4gSU5TTidzIGhhbmRsZXIgZGF0YS4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9IQU5ETEVSUyhpbnNuKSBDR0VOX09QQ09ERV9IQU5ETEVSUyAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCi0KLS8qIFJldHVybiBJTlNOJ3Mgc3ludGF4LiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX1NZTlRBWChpbnNuKSBDR0VOX09QQ09ERV9TWU5UQVggKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gc2l6ZSBvZiBiYXNlIG1hc2sgaW4gYml0cy4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9NQVNLX0JJVFNJWkUoaW5zbikgXAotICBDR0VOX09QQ09ERV9NQVNLX0JJVFNJWkUgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gbWFzayBvZiBiYXNlIHBhcnQgb2YgSU5TTi4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9CQVNFX01BU0soaW5zbikgXAotICBDR0VOX09QQ09ERV9CQVNFX01BU0sgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYmFzZSBwYXJ0IG9mIElOU04uICAqLwotI2RlZmluZSBDR0VOX0lOU05fQkFTRV9WQUxVRShpbnNuKSBcCi0gIENHRU5fT1BDT0RFX0JBU0VfVkFMVUUgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBTdGFuZGFyZCB3YXkgdG8gdGVzdCB3aGV0aGVyIElOU04gaXMgc3VwcG9ydGVkIGJ5IE1BQ0guCi0gICBNQUNIIGlzIG9uZSBvZiBlbnVtIG1hY2hfYXR0ci4KLSAgIFRoZSAifDEiIGlzIGJlY2F1c2UgdGhlIGJhc2UgbWFjaCBpcyBhbHdheXMgc2VsZWN0ZWQuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTUFDSF9IQVNfUChpbnNuLCBtYWNoKSBcCi0oKENHRU5fSU5TTl9BVFRSX1ZBTFVFICgoaW5zbiksIENHRU5fSU5TTl9NQUNIKSAmICgoMSA8PCAobWFjaCkpIHwgMSkpICE9IDApCi0MCi0vKiBNYWNybyBpbnN0cnVjdGlvbnMuCi0gICBNYWNybyBpbnNucyBhcmVuJ3QgcmVhbCBpbnNucywgdGhleSBtYXAgdG8gb25lIG9yIG1vcmUgcmVhbCBpbnNucy4KLSAgIEUuZy4gQW4gYXJjaGl0ZWN0dXJlJ3MgIm5vcCIgaW5zbiBtYXkgYWN0dWFsbHkgYmUgYW4gIm12IHIwLHIwIiBvcgotICAgc29tZSBzdWNoLgotCi0gICBNYWNybyBpbnNucyBjYW4gZXhwYW5kIHRvIG5vdGhpbmcgKGUuZy4gYSBub3AgdGhhdCBpcyBvcHRpbWl6ZWQgYXdheSkuCi0gICBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS1pbnNuIG1hY3JvcyB0aGF0IGJ1aWxkIGEgY29uc3RhbnQgaW4gYSByZWdpc3Rlci4KLSAgIE9mIGNvdXJzZSB0aGlzIGlzbid0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQuCi0KLSAgIEFzc2VtYmx5IG9mIG1hY3JvLWluc25zIGlzIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkLiAgRGlzYXNzZW1ibHkgaXNuJ3QuCi0gICBIb3dldmVyLCBkaXNhc3NlbWJseSBvZiBhdCBsZWFzdCBzb21lIGtpbmRzIG9mIG1hY3JvIGluc25zIGlzIGltcG9ydGFudAotICAgaW4gb3JkZXIgdGhhdCB0aGUgZGlzYXNzZW1ibGVkIGNvZGUgcHJlc2VydmUgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBvcmlnaW5hbAotICAgaW5zbi4gIFdoYXQgaXMgYXR0ZW1wdGVkIGhlcmUgaXMgdG8gZGlzYXNzZW1ibGUgYWxsICJzaW1wbGUiIG1hY3JvLWluc25zLAotICAgd2hlcmUgInNpbXBsZSIgaXMgY3VycmVudGx5IGRlZmluZWQgdG8gbWVhbiAiZXhwYW5kcyB0byBvbmUgcmVhbCBpbnNuIi4KLQotICAgU2ltcGxlIG1hY3JvLWluc25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseS4gIFRoZXkgYXJlIGVtaXR0ZWQgYXMgQUxJQVMncwotICAgb2YgcmVhbCBpbnNucy4gIFRoaXMgc2ltcGxpZmllcyB0aGVpciBoYW5kbGluZyBzaW5jZSB0aGVyZSdzIHVzdWFsbHkgbW9yZQotICAgb2YgdGhlbSB0aGFuIGFueSBvdGhlciBraW5kIG9mIG1hY3JvLWluc24sIGFuZCBwcm9wZXIgZGlzYXNzZW1ibHkgb2YgdGhlbQotICAgZmFsbHMgb3V0IGZvciBmcmVlLiAgKi8KLQotLyogRm9yIGVhY2ggbWFjcm8taW5zbiB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgZXhwYW5zaW9uIHBvc3NpYmlsaXRpZXMsCi0gICBkZXBlbmRpbmcgb24gdGhlIGFyZ3VtZW50cy4gIFRoaXMgc3RydWN0dXJlIGlzIGFjY2Vzc2VkIHZpYSB0aGUgYGRhdGEnCi0gICBtZW1iZXIgb2YgQ0dFTl9JTlNOLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9taW5zbl9leHBhbnNpb24gewotICAvKiBGdW5jdGlvbiB0byBkbyB0aGUgZXhwYW5zaW9uLgotICAgICBJZiB0aGUgZXhwYW5zaW9uIGZhaWxzIChlLmcuICJubyBtYXRjaCIpIE5VTEwgaXMgcmV0dXJuZWQuCi0gICAgIFNwYWNlIGZvciB0aGUgZXhwYW5zaW9uIGlzIG9idGFpbmVkIHdpdGggbWFsbG9jLgotICAgICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZyZWUgaXQuICAqLwotICBjb25zdCBjaGFyICogKCogZm4pIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBjZ2VuX21pbnNuX2V4cGFuc2lvbiAqLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgaW50ICosCi0JCQkgICAgICAgQ0dFTl9PUEVSQU5EICoqKSk7Ci0jZGVmaW5lIENHRU5fTUlFWFBOX0ZOKGV4KSAoKGV4KS0+Zm4pCi0KLSAgLyogSW5zdHJ1Y3Rpb24ocykgdGhlIG1hY3JvIGV4cGFuZHMgdG8uCi0gICAgIFRoZSBmb3JtYXQgb2YgU1RSIGlzIGRlZmluZWQgYnkgRk4uCi0gICAgIEl0IGlzIHR5cGljYWxseSB0aGUgYXNzZW1ibHkgY29kZSBvZiB0aGUgcmVhbCBpbnNuLCBidXQgaXQgY291bGQgYWxzbyBiZQotICAgICB0aGUgb3JpZ2luYWwgU2NoZW1lIGV4cHJlc3Npb24gb3IgYSB0b2tlbml6ZWQgZm9ybSBvZiBpdCAod2l0aCBGTiBiZWluZwotICAgICBhbiBhcHByb3ByaWF0ZSBpbnRlcnByZXRlcikuICAqLwotICBjb25zdCBjaGFyICogc3RyOwotI2RlZmluZSBDR0VOX01JRVhQTl9TVFIoZXgpICgoZXgpLT5zdHIpCi19IENHRU5fTUlOU05fRVhQQU5TSU9OOwotCi0vKiBOb3JtYWwgZXhwYW5kZXIuCi0gICBXaGVuIHN1cHBvcnRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgdGhlIGlucHV0IHN0cmluZyB0byBhbm90aGVyCi0gICBzdHJpbmcgYW5kIHRoZSBwYXJzZXIgd2lsbCBiZSBpbnZva2VkIHJlY3Vyc2l2ZWx5LiAgVGhlIG91dHB1dCBzdHJpbmcKLSAgIG1heSBjb250YWluIGZ1cnRoZXIgbWFjcm8gaW52b2NhdGlvbnMuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqIGNnZW5fZXhwYW5kX21hY3JvX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3Qgc3RydWN0IGNnZW5fbWluc25fZXhwYW5zaW9uICosCi0JICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBpbnQgKiwgQ0dFTl9PUEVSQU5EICoqKSk7Ci0MCi0vKiBUaGUgYXNzZW1ibGVyIGluc24gdGFibGUgaXMgaGFzaGVkIGJhc2VkIG9uIHNvbWUgZnVuY3Rpb24gb2YgdGhlIG1uZW1vbmljCi0gICAodGhlIGFjdHVhbGx5IGhhc2hpbmcgZG9uZSBpcyB1cCB0byB0aGUgdGFyZ2V0LCBidXQgd2UgcHJvdmlkZSBhIGZldwotICAgZXhhbXBsZXMgbGlrZSB0aGUgZmlyc3QgbGV0dGVyIG9yIGEgZnVuY3Rpb24gb2YgdGhlIGVudGlyZSBtbmVtb25pYykuICAqLwotCi1leHRlcm4gQ0dFTl9JTlNOX0xJU1QgKiBjZ2VuX2FzbV9sb29rdXBfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKLSNkZWZpbmUgQ0dFTl9BU01fTE9PS1VQX0lOU04oY2QsIHN0cmluZykgY2dlbl9hc21fbG9va3VwX2luc24gKChjZCksIChzdHJpbmcpKQotI2RlZmluZSBDR0VOX0FTTV9ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKLQotLyogVGhlIGRpc2Fzc2VtYmxlciBpbnNuIHRhYmxlIGlzIGhhc2hlZCBiYXNlZCBvbiBzb21lIGZ1bmN0aW9uIG9mIG1hY2hpbmUKLSAgIGluc3RydWN0aW9uICh0aGUgYWN0dWFsbHkgaGFzaGluZyBkb25lIGlzIHVwIHRvIHRoZSB0YXJnZXQpLiAgKi8KLQotZXh0ZXJuIENHRU5fSU5TTl9MSVNUICogY2dlbl9kaXNfbG9va3VwX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7Ci0vKiBGSVhNRTogZGVsZXRlIHRoZXNlIHR3byAqLwotI2RlZmluZSBDR0VOX0RJU19MT09LVVBfSU5TTihjZCwgYnVmLCB2YWx1ZSkgY2dlbl9kaXNfbG9va3VwX2luc24gKChjZCksIChidWYpLCAodmFsdWUpKQotI2RlZmluZSBDR0VOX0RJU19ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKLQwKLS8qIFRoZSBDUFUgZGVzY3JpcHRpb24uCi0gICBBIGNvcHkgb2YgdGhpcyBpcyBjcmVhdGVkIHdoZW4gdGhlIGNwdSB0YWJsZSBpcyAib3BlbmVkIi4KLSAgIEFsbCBnbG9iYWwgc3RhdGUgaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgaGVyZS4KLSAgIEFjY2VzcyBtYWNyb3MgYXJlIHByb3ZpZGVkIGZvciAicHVibGljIiBtZW1iZXJzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9jcHVfZGVzYwotewotICAvKiBCaXRtYXAgb2Ygc2VsZWN0ZWQgbWFjaGluZShzKSAoYSBsYSBCRkQgbWFjaGluZSBudW1iZXIpLiAgKi8KLSAgaW50IG1hY2hzOwotCi0gIC8qIEJpdG1hcCBvZiBzZWxlY3RlZCBpc2EocykuCi0gICAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICAgIHByZWNsdWRlZC4gICovCi0gIGludCBpc2FzOwotCi0gIC8qIEN1cnJlbnQgZW5kaWFuLiAgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW47Ci0jZGVmaW5lIENHRU5fQ1BVX0VORElBTihjZCkgKChjZCktPmVuZGlhbikKLQotICAvKiBDdXJyZW50IGluc24gZW5kaWFuLiAgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBpbnNuX2VuZGlhbjsKLSNkZWZpbmUgQ0dFTl9DUFVfSU5TTl9FTkRJQU4oY2QpICgoY2QpLT5pbnNuX2VuZGlhbikKLQotICAvKiBXb3JkIHNpemUgKGluIGJpdHMpLiAgKi8KLSAgLyogPz8/IE9yIG1heWJlIG1heGltdW0gd29yZCBzaXplIC0gbWlnaHQgd2UgZXZlciBuZWVkIHRvIGFsbG93IGEgY3B1IHRhYmxlCi0gICAgIHRvIGJlIG9wZW5lZCBmb3IgYm90aCBzcGFyYzMyL3NwYXJjNjQ/Ci0gICAgID8/PyBBbm90aGVyIGFsdGVybmF0aXZlIGlzIHRvIGNyZWF0ZSBhIHRhYmxlIG9mIHNlbGVjdGVkIG1hY2hzIGFuZAotICAgICBsYXppbHkgZmV0Y2ggdGhlIGRhdGEgZnJvbSB0aGVyZS4gICovCi0gIHVuc2lnbmVkIGludCB3b3JkX2JpdHNpemU7Ci0KLSAgLyogSW5kaWNhdG9yIGlmIHNpemVzIGFyZSB1bmtub3duLgotICAgICBUaGlzIGlzIHVzZWQgYnkgZGVmYXVsdF9pbnNuX2JpdHNpemUsYmFzZV9pbnNuX2JpdHNpemUgaWYgdGhlcmUgaXMgYQotICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNlbGVjdGVkIGlzYSdzLiAgKi8KLSNkZWZpbmUgQ0dFTl9TSVpFX1VOS05PV04gNjU1MzUKLQotICAvKiBEZWZhdWx0IGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgotICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGVuY291bnRlcnMgYW4gdW5rbm93biBpbnNuLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfaW5zbl9iaXRzaXplOwotCi0gIC8qIEJhc2UgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIEZvciBub24tTElXIGNwdXMgdGhpcyBpcyBnZW5lcmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgc21hbGxlc3QgaW5zbi4KLSAgICAgRm9yIExJVyBjcHVzIGl0cyB3aXAgKHdvcmstaW4tcHJvZ3Jlc3MpLiAgRm9yIHRoZSBtMzJyIGl0cyAzMi4gICovCi0gIHVuc2lnbmVkIGludCBiYXNlX2luc25fYml0c2l6ZTsKLQotICAvKiBNaW5pbXVtL21heGltdW0gaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuICAqLwotICB1bnNpZ25lZCBpbnQgbWluX2luc25fYml0c2l6ZTsKLSAgdW5zaWduZWQgaW50IG1heF9pbnNuX2JpdHNpemU7Ci0KLSAgLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLSAgY29uc3QgQ0dFTl9JU0EgKmlzYV90YWJsZTsKLQotICAvKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLSAgY29uc3QgQ0dFTl9NQUNIICptYWNoX3RhYmxlOwotCi0gIC8qIEhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KLSAgQ0dFTl9IV19UQUJMRSBod190YWJsZTsKLQotICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLwotICBjb25zdCBDR0VOX0lGTEQgKmlmbGRfdGFibGU7Ci0KLSAgLyogT3BlcmFuZHMuICAqLwotICBDR0VOX09QRVJBTkRfVEFCTEUgb3BlcmFuZF90YWJsZTsKLQotICAvKiBNYWluIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLSAgQ0dFTl9JTlNOX1RBQkxFIGluc25fdGFibGU7Ci0jZGVmaW5lIENHRU5fQ1BVX0lOU05fVEFCTEUoY2QpICgmIChjZCktPmluc25fdGFibGUpCi0KLSAgLyogTWFjcm8gaW5zdHJ1Y3Rpb25zIGFyZSBkZWZpbmVkIHNlcGFyYXRlbHkgYW5kIGFyZSBjb21iaW5lZCB3aXRoIHJlYWwKLSAgICAgaW5zbnMgZHVyaW5nIGhhc2ggdGFibGUgY29tcHV0YXRpb24uICAqLwotICBDR0VOX0lOU05fVEFCTEUgbWFjcm9faW5zbl90YWJsZTsKLQotICAvKiBDb3B5IG9mIENHRU5fSU5UX0lOU05fUC4gICovCi0gIGludCBpbnRfaW5zbl9wOwotCi0gIC8qIENhbGxlZCB0byByZWJ1aWxkIHRoZSB0YWJsZXMgYWZ0ZXIgc29tZXRoaW5nIGhhcyBjaGFuZ2VkLiAgKi8KLSAgdm9pZCAoKnJlYnVpbGRfdGFibGVzKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLSAgLyogT3BlcmFuZCBwYXJzZXIgY2FsbGJhY2suICAqLwotICBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gKiBwYXJzZV9vcGVyYW5kX2ZuOwotCi0gIC8qIFBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGNvdmVyIGZucyBmb3Igb3BlcmFuZHMuICAqLwotICBjb25zdCBjaGFyICogKCpwYXJzZV9vcGVyYW5kKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IGNoYXIgKiosCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLSNpZmRlZiBCRkRfVkVSU0lPTgotICBjb25zdCBjaGFyICogKCppbnNlcnRfb3BlcmFuZCkKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywKLQkgICAgICBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hIHBjXykpOwotICBpbnQgKCpleHRyYWN0X29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSBwY18pKTsKLSAgdm9pZCAoKnByaW50X29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgUFRSIGluZm9fLCBDR0VOX0ZJRUxEUyAqIGZpZWxkc18sCi0JICAgICAgdm9pZCBjb25zdCAqYXR0cnNfLCBiZmRfdm1hIHBjXywgaW50IGxlbmd0aF8pKTsKLSNlbHNlCi0gIGNvbnN0IGNoYXIgKiAoKmluc2VydF9vcGVyYW5kKSAoKTsKLSAgaW50ICgqZXh0cmFjdF9vcGVyYW5kKSAoKTsKLSAgdm9pZCAoKnByaW50X29wZXJhbmQpICgpOwotI2VuZGlmCi0jZGVmaW5lIENHRU5fQ1BVX1BBUlNFX09QRVJBTkQoY2QpICgoY2QpLT5wYXJzZV9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9JTlNFUlRfT1BFUkFORChjZCkgKChjZCktPmluc2VydF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9FWFRSQUNUX09QRVJBTkQoY2QpICgoY2QpLT5leHRyYWN0X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX1BSSU5UX09QRVJBTkQoY2QpICgoY2QpLT5wcmludF9vcGVyYW5kKQotCi0gIC8qIFNpemUgb2YgQ0dFTl9GSUVMRFMgc3RydWN0LiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemVvZl9maWVsZHM7Ci0jZGVmaW5lIENHRU5fQ1BVX1NJWkVPRl9GSUVMRFMoY2QpICgoY2QpLT5zaXplb2ZfZmllbGRzKQotCi0gIC8qIFNldCB0aGUgYml0c2l6ZSBmaWVsZC4gICovCi0gIHZvaWQgKCpzZXRfZmllbGRzX2JpdHNpemUpIFBBUkFNUyAoKENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgc2l6ZV8pKTsKLSNkZWZpbmUgQ0dFTl9DUFVfU0VUX0ZJRUxEU19CSVRTSVpFKGNkKSAoKGNkKS0+c2V0X2ZpZWxkc19iaXRzaXplKQotCi0gIC8qIENHRU5fRklFTERTIGFjY2Vzc29ycy4gICovCi0gIGludCAoKmdldF9pbnRfb3BlcmFuZCkKLSAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0gIHZvaWQgKCpzZXRfaW50X29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IHZhbHVlXykpOwotI2lmZGVmIEJGRF9WRVJTSU9OCi0gIGJmZF92bWEgKCpnZXRfdm1hX29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOwotICB2b2lkICgqc2V0X3ZtYV9vcGVyYW5kKQotICAgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgdmFsdWVfKSk7Ci0jZWxzZQotICBsb25nICgqZ2V0X3ZtYV9vcGVyYW5kKSAoKTsKLSAgdm9pZCAoKnNldF92bWFfb3BlcmFuZCkgKCk7Ci0jZW5kaWYKLSNkZWZpbmUgQ0dFTl9DUFVfR0VUX0lOVF9PUEVSQU5EKGNkKSAoKGNkKS0+Z2V0X2ludF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9TRVRfSU5UX09QRVJBTkQoY2QpICgoY2QpLT5zZXRfaW50X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX0dFVF9WTUFfT1BFUkFORChjZCkgKChjZCktPmdldF92bWFfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfU0VUX1ZNQV9PUEVSQU5EKGNkKSAoKGNkKS0+c2V0X3ZtYV9vcGVyYW5kKQotCi0gIC8qIEluc3RydWN0aW9uIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXJzLiAgKi8KLSAgLyogRklYTUU6IG1ha2UgdGhlc2UgdHlwZXMgdXBwZXJjYXNlLiAgKi8KLSAgY2dlbl9wYXJzZV9mbiAqIGNvbnN0ICpwYXJzZV9oYW5kbGVyczsKLSAgY2dlbl9pbnNlcnRfZm4gKiBjb25zdCAqaW5zZXJ0X2hhbmRsZXJzOwotICBjZ2VuX2V4dHJhY3RfZm4gKiBjb25zdCAqZXh0cmFjdF9oYW5kbGVyczsKLSAgY2dlbl9wcmludF9mbiAqIGNvbnN0ICpwcmludF9oYW5kbGVyczsKLSNkZWZpbmUgQ0dFTl9QQVJTRV9GTihjZCwgaW5zbikgICAoY2QtPnBhcnNlX2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wYXJzZV0pCi0jZGVmaW5lIENHRU5fSU5TRVJUX0ZOKGNkLCBpbnNuKSAgKGNkLT5pbnNlcnRfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLmluc2VydF0pCi0jZGVmaW5lIENHRU5fRVhUUkFDVF9GTihjZCwgaW5zbikgKGNkLT5leHRyYWN0X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5leHRyYWN0XSkKLSNkZWZpbmUgQ0dFTl9QUklOVF9GTihjZCwgaW5zbikgICAoY2QtPnByaW50X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wcmludF0pCi0KLSAgLyogUmV0dXJuIG5vbi16ZXJvIGlmIGluc24gc2hvdWxkIGJlIGFkZGVkIHRvIGhhc2ggdGFibGUuICAqLwotICBpbnQgKCogYXNtX2hhc2hfcCkgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLQotICAvKiBBc3NlbWJsZXIgaGFzaCBmdW5jdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCAoKiBhc21faGFzaCkgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYXNzZW1ibGVyIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfc2l6ZTsKLQotICAvKiBSZXR1cm4gbm9uLXplcm8gaWYgaW5zbiBzaG91bGQgYmUgYWRkZWQgdG8gaGFzaCB0YWJsZS4gICovCi0gIGludCAoKiBkaXNfaGFzaF9wKSBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotCi0gIC8qIERpc2Fzc2VtYmxlciBoYXNoIGZ1bmN0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50ICgqIGRpc19oYXNoKSBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLQotICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBkaXNhc3NlbWJsZXIgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBkaXNfaGFzaF9zaXplOwotCi0gIC8qIEFzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KLSAgQ0dFTl9JTlNOX0xJU1QgKiphc21faGFzaF90YWJsZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci0KLSAgLyogRGlzYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotICBDR0VOX0lOU05fTElTVCAqKmRpc19oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqZGlzX2hhc2hfdGFibGVfZW50cmllczsKLQotICAvKiBUaGlzIGZpZWxkIGNvdWxkIGJlIHR1cm5lZCBpbnRvIGEgYml0ZmllbGQgaWYgcm9vbSBmb3Igb3RoZXIgZmxhZ3MgaXMgbmVlZGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpZ25lZF9vdmVyZmxvd19va19wOwotICAgICAgIAotfSBDR0VOX0NQVV9UQUJMRTsKLQotLyogd2lwICovCi0jaWZuZGVmIENHRU5fV09SRF9FTkRJQU4KLSNkZWZpbmUgQ0dFTl9XT1JEX0VORElBTihjZCkgQ0dFTl9DUFVfRU5ESUFOIChjZCkKLSNlbmRpZgotI2lmbmRlZiBDR0VOX0lOU05fV09SRF9FTkRJQU4KLSNkZWZpbmUgQ0dFTl9JTlNOX1dPUkRfRU5ESUFOKGNkKSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpCi0jZW5kaWYKLQwKLS8qIFByb3RvdHlwZXMgb2YgbWFqb3IgZnVuY3Rpb25zLiAgKi8KLS8qIEZJWE1FOiBNb3ZlIG1vcmUgQ0dFTl9TWU0tZGVmaW5lZCBmdW5jdGlvbnMgaW50byBDR0VOX0NQVV9ERVNDLgotICAgTm90IHRoZSBpbml0IGZucyB0aG91Z2gsIGFzIHRoYXQgd291bGQgZHJhZyBpbiB0aGluZ3MgdGhhdCBtaWdodG4ndCBiZQotICAgdXNlZCBhbmQgbWlnaHQgbm90IGV2ZW4gZXhpc3QuICAqLwotCi0vKiBBcmd1bWVudCB0eXBlcyB0byBjcHVfb3Blbi4gICovCi0KLWVudW0gY2dlbl9jcHVfb3Blbl9hcmcgewotICBDR0VOX0NQVV9PUEVOX0VORCwKLSAgLyogU2VsZWN0IGluc3RydWN0aW9uIHNldChzKSwgYXJnIGlzIGJpdG1hcCBvciAwIG1lYW5pbmcgInVuc3BlY2lmaWVkIi4gICovCi0gIENHRU5fQ1BVX09QRU5fSVNBUywKLSAgLyogU2VsZWN0IG1hY2hpbmUocyksIGFyZyBpcyBiaXRtYXAgb3IgMCBtZWFuaW5nICJ1bnNwZWNpZmllZCIuICAqLwotICBDR0VOX0NQVV9PUEVOX01BQ0hTLAotICAvKiBTZWxlY3QgbWFjaGluZSwgYXJnIGlzIG1hY2gncyBiZmQgbmFtZS4KLSAgICAgTXVsdGlwbGUgbWFjaGluZXMgY2FuIGJlIHNwZWNpZmllZCBieSByZXBlYXRlZCB1c2UuICAqLwotICBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsCi0gIC8qIFNlbGVjdCBlbmRpYW4sIGFyZyBpcyBDR0VOX0VORElBTl8qLiAgKi8KLSAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4KLX07Ci0KLS8qIE9wZW4gYSBjcHUgZGVzY3JpcHRvciB0YWJsZSBmb3IgdXNlLgotICAgPz8/IFdlIG9ubHkgc3VwcG9ydCBJU08gQyBzdGRhcmdzIGhlcmUsIG5vdCBLJlIuCi0gICBMYXppbmVzcywgcGx1cyBleHBlcmltZW50IHRvIHNlZSBpZiBhbnl0aGluZyByZXF1aXJlcyBLJlIgLSBldmVudHVhbGx5Ci0gICBLJlIgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIC0gZS5nLiBHREIgaXMgY3VycmVudGx5IHRyeWluZyB0aGlzLiAgKi8KLQotZXh0ZXJuIENHRU5fQ1BVX0RFU0MgQ0dFTl9TWU0gKGNwdV9vcGVuKSAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZywgLi4uKTsKLQotLyogQ292ZXIgZm4gdG8gaGFuZGxlIHNpbXBsZSBjYXNlLiAgKi8KLQotZXh0ZXJuIENHRU5fQ1BVX0RFU0MgQ0dFTl9TWU0gKGNwdV9vcGVuXzEpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1hY2hfbmFtZV8sCi0JCQkJCQkgICAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW5fKSk7Ci0KLS8qIENsb3NlIGl0LiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGNwdV9jbG9zZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBJbml0aWFsaXplIHRoZSBvcGNvZGUgdGFibGUgZm9yIHVzZS4KLSAgIENhbGxlZCBieSBpbml0X2FzbS9pbml0X2Rpcy4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X29wY29kZV90YWJsZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQyBjZF8pKTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgaWJsZCB0YWJsZSBmb3IgdXNlLgotICAgQ2FsbGVkIGJ5IGluaXRfYXNtL2luaXRfZGlzLiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfaWJsZF90YWJsZSkgUEFSQU1TICgoQ0dFTl9DUFVfREVTQyBjZF8pKTsKLQotLyogSW5pdGlhbGl6ZSBhbiBjcHUgdGFibGUgZm9yIGFzc2VtYmxlciBvciBkaXNhc3NlbWJsZXIgdXNlLgotICAgVGhlc2UgbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3B1X29wZW4uICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9hc20pIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X2RpcykgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBJbml0aWFsaXplIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlIGZvciB1c2UuICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9vcGluc3RfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7Ci0KLS8qIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uLiAgKi8KLQotZXh0ZXJuIGNvbnN0IENHRU5fSU5TTiAqIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICosIENHRU5fRklFTERTICosCi0JICAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiwgY2hhciAqKikpOwotCi1leHRlcm4gY29uc3QgQ0dFTl9LRVlXT1JEIENHRU5fU1lNIChvcGVyYW5kX21hY2gpOwotZXh0ZXJuIGludCBDR0VOX1NZTSAoZ2V0X21hY2gpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBPcGVyYW5kIGluZGV4IGNvbXB1dGF0aW9uLiAgKi8KLWV4dGVybiBjb25zdCBDR0VOX0lOU04gKiBjZ2VuX2xvb2t1cF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqIGluc25fLAotCSAgICAgIENHRU5fSU5TTl9JTlQgaW50X3ZhbHVlXywgdW5zaWduZWQgY2hhciAqYnl0ZXNfdmFsdWVfLAotCSAgICAgIGludCBsZW5ndGhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IGFsaWFzX3BfKSk7Ci1leHRlcm4gdm9pZCBjZ2VuX2dldF9pbnNuX29wZXJhbmRzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqIGluc25fLAotCSAgICAgIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgKmluZGljZXNfKSk7Ci1leHRlcm4gY29uc3QgQ0dFTl9JTlNOICogY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBDR0VOX0lOU05fSU5UIGludF92YWx1ZV8sIHVuc2lnbmVkIGNoYXIgKmJ5dGVzX3ZhbHVlXywKLQkgICAgICBpbnQgbGVuZ3RoXywgaW50ICppbmRpY2VzXywgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLQotLyogQ292ZXIgZm5zIHRvIGJmZF9nZXQvc2V0LiAgKi8KLQotZXh0ZXJuIENHRU5fSU5TTl9JTlQgY2dlbl9nZXRfaW5zbl92YWx1ZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCB1bnNpZ25lZCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgY2dlbl9wdXRfaW5zbl92YWx1ZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCB1bnNpZ25lZCBjaGFyICosIGludCwgQ0dFTl9JTlNOX0lOVCkpOwotCi0vKiBSZWFkIGluIGEgY3B1IGRlc2NyaXB0aW9uIGZpbGUuCi0gICA/Pz8gRm9yIGZ1dHVyZSBjb25jZXJucywgaW5jbHVkaW5nIGFkZGluZyBpbnN0cnVjdGlvbnMgdG8gdGhlIGFzc2VtYmxlci8KLSAgIGRpc2Fzc2VtYmxlciBhdCBydW4tdGltZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICogY2dlbl9yZWFkX2NwdV9maWxlCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiBmaWxlbmFtZV8pKTsKLQotLyogQWxsb3cgc2lnbmVkIG92ZXJmbG93IG9mIGluc3RydWN0aW9uIGZpZWxkcy4gICovCi1leHRlcm4gdm9pZCBjZ2VuX3NldF9zaWduZWRfb3ZlcmZsb3dfb2sgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBHZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIGlmIGEgc2lnbmVkIGZpZWxkIGluIGFuIGluc3RydWN0aW9uIG92ZXJmbG93cy4gICovCi1leHRlcm4gdm9pZCBjZ2VuX2NsZWFyX3NpZ25lZF9vdmVyZmxvd19vayBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLS8qIFdpbGwgYW4gZXJyb3IgbWVzc2FnZSBiZSBnZW5lcmF0ZWQgaWYgYSBzaWduZWQgZmllbGQgaW4gYW4gaW5zdHJ1Y3Rpb24gb3ZlcmZsb3dzID8gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY2dlbl9zaWduZWRfb3ZlcmZsb3dfb2tfcCBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLSNlbmRpZiAvKiBDR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2NvbnZleC5oIGIvaW5jbHVkZS9vcGNvZGUvY29udmV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWVlYmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvY29udmV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzExICswLDAgQEAKLS8qIEluZm9ybWF0aW9uIGZvciBpbnN0cnVjdGlvbiBkaXNhc3NlbWJseSBvbiB0aGUgQ29udmV4LgotICAgQ29weXJpZ2h0IDE5ODksIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZglDT05TVAotI2RlZmluZQlDT05TVAotI2VuZGlmCS8qIENPTlNUICovCi0KLSNkZWZpbmUgeHh4IDAKLSNkZWZpbmUgcnJyIDEKLSNkZWZpbmUgcnIgMgotI2RlZmluZSByeHIgMwotI2RlZmluZSByIDQKLSNkZWZpbmUgbm9wcyA1Ci0jZGVmaW5lIG5yIDYKLSNkZWZpbmUgcGNyZWwgNwotI2RlZmluZSBsciA4Ci0jZGVmaW5lIHJ4bCA5Ci0jZGVmaW5lIHJsciAxMAotI2RlZmluZSBycmwgMTEKLSNkZWZpbmUgaW1sIDEyCi0jZGVmaW5lIGltciAxMwotI2RlZmluZSBhMXIgMTQKLSNkZWZpbmUgYTFsIDE1Ci0jZGVmaW5lIGEyciAxNgotI2RlZmluZSBhMmwgMTcKLSNkZWZpbmUgYTMgMTgKLSNkZWZpbmUgYTQgMTkKLSNkZWZpbmUgYTUgMjAKLSNkZWZpbmUgViAxCi0jZGVmaW5lIFMgMgotI2RlZmluZSBWTSAzCi0jZGVmaW5lIEEgNAotI2RlZmluZSBWTCA1Ci0jZGVmaW5lIFZTIDYKLSNkZWZpbmUgVkxTIDcKLSNkZWZpbmUgUFNXIDgKLS8qIFByZXZlbnQgYW4gZXJyb3IgZHVyaW5nICJtYWtlIGRlcGVuZCIuICAqLwotI2lmICFkZWZpbmVkIChQQykKLSNkZWZpbmUgUEMgOQotI2VuZGlmCi0jZGVmaW5lIElUUiAxMAotI2RlZmluZSBWViAxMQotI2RlZmluZSBJVFNSIDEyCi0jZGVmaW5lIFRPQyAxMwotI2RlZmluZSBDSVIgMTQKLSNkZWZpbmUgVFRSIDE1Ci0jZGVmaW5lIFZNVSAxNgotI2RlZmluZSBWTUwgMTcKLSNkZWZpbmUgSUNSIDE4Ci0jZGVmaW5lIFRDUFUgMTkKLSNkZWZpbmUgQ1BVSUQgMjAKLSNkZWZpbmUgVElEIDIxCi0KLUNPTlNUIGNoYXIgKm9wW10gPSB7Ci0gICIiLAotICAidjBcMHYxXDB2MlwwdjNcMHY0XDB2NVwwdjZcMHY3IiwKLSAgInMwXDBzMVwwczJcMHMzXDBzNFwwczVcMHM2XDBzNyIsCi0gICJ2bSIsCi0gICJzcFwwYTFcMGEyXDBhM1wwYTRcMGE1XDBhcFwwZnAiLAotICAidmwiLAotICAidnMiLAotICAidmxzIiwKLSAgInBzdyIsCi0gICJwYyIsCi0gICJpdHIiLAotICAidnYiLAotICAiaXRzciIsCi0gICJ0b2MiLAotICAiY2lyIiwKLSAgInR0ciIsCi0gICJ2bXUiLAotICAidm1sIiwKLSAgImljciIsCi0gICJ0Y3B1IiwKLSAgImNwdWlkIiwKLSAgInRpZCIsCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQwW10gPSB7Ci0gIHswLDAscnJyLFYsUyxTfSwJLyogbW92ICovCi0gIHswLDAscnJyLFMsUyxWfSwJLyogbW92ICovCi0gIHsxLDEscnJyLFYsVixWfSwJLyogbWVyZy50ICovCi0gIHsyLDEscnJyLFYsVixWfSwJLyogbWFzay50ICovCi0gIHsxLDIscnJyLFYsUyxWfSwJLyogbWVyZy5mICovCi0gIHsyLDIscnJyLFYsUyxWfSwJLyogbWFzay5mICovCi0gIHsxLDEscnJyLFYsUyxWfSwJLyogbWVyZy50ICovCi0gIHsyLDEscnJyLFYsUyxWfSwJLyogbWFzay50ICovCi0gIHszLDMscnJyLFYsVixWfSwJLyogbXVsLnMgKi8KLSAgezMsNCxycnIsVixWLFZ9LAkvKiBtdWwuZCAqLwotICB7NCwzLHJycixWLFYsVn0sCS8qIGRpdi5zICovCi0gIHs0LDQscnJyLFYsVixWfSwJLyogZGl2LmQgKi8KLSAgezMsMyxycnIsVixTLFZ9LAkvKiBtdWwucyAqLwotICB7Myw0LHJycixWLFMsVn0sCS8qIG11bC5kICovCi0gIHs0LDMscnJyLFYsUyxWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsVixTLFZ9LAkvKiBkaXYuZCAqLwotICB7NSwwLHJycixWLFYsVn0sCS8qIGFuZCAqLwotICB7NiwwLHJycixWLFYsVn0sCS8qIG9yICovCi0gIHs3LDAscnJyLFYsVixWfSwJLyogeG9yICovCi0gIHs4LDAscnJyLFYsVixWfSwJLyogc2hmICovCi0gIHs1LDAscnJyLFYsUyxWfSwJLyogYW5kICovCi0gIHs2LDAscnJyLFYsUyxWfSwJLyogb3IgKi8KLSAgezcsMCxycnIsVixTLFZ9LAkvKiB4b3IgKi8KLSAgezgsMCxycnIsVixTLFZ9LAkvKiBzaGYgKi8KLSAgezksMyxycnIsVixWLFZ9LAkvKiBhZGQucyAqLwotICB7OSw0LHJycixWLFYsVn0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJycixWLFYsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixWLFYsVn0sCS8qIHN1Yi5kICovCi0gIHs5LDMscnJyLFYsUyxWfSwJLyogYWRkLnMgKi8KLSAgezksNCxycnIsVixTLFZ9LAkvKiBhZGQuZCAqLwotICB7MTAsMyxycnIsVixTLFZ9LAkvKiBzdWIucyAqLwotICB7MTAsNCxycnIsVixTLFZ9LAkvKiBzdWIuZCAqLwotICB7OSw1LHJycixWLFYsVn0sCS8qIGFkZC5iICovCi0gIHs5LDYscnJyLFYsVixWfSwJLyogYWRkLmggKi8KLSAgezksNyxycnIsVixWLFZ9LAkvKiBhZGQudyAqLwotICB7OSw4LHJycixWLFYsVn0sCS8qIGFkZC5sICovCi0gIHs5LDUscnJyLFYsUyxWfSwJLyogYWRkLmIgKi8KLSAgezksNixycnIsVixTLFZ9LAkvKiBhZGQuaCAqLwotICB7OSw3LHJycixWLFMsVn0sCS8qIGFkZC53ICovCi0gIHs5LDgscnJyLFYsUyxWfSwJLyogYWRkLmwgKi8KLSAgezEwLDUscnJyLFYsVixWfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnJyLFYsVixWfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnJyLFYsVixWfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnJyLFYsVixWfSwJLyogc3ViLmwgKi8KLSAgezEwLDUscnJyLFYsUyxWfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnJyLFYsUyxWfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnJyLFYsUyxWfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnJyLFYsUyxWfSwJLyogc3ViLmwgKi8KLSAgezMsNSxycnIsVixWLFZ9LAkvKiBtdWwuYiAqLwotICB7Myw2LHJycixWLFYsVn0sCS8qIG11bC5oICovCi0gIHszLDcscnJyLFYsVixWfSwJLyogbXVsLncgKi8KLSAgezMsOCxycnIsVixWLFZ9LAkvKiBtdWwubCAqLwotICB7Myw1LHJycixWLFMsVn0sCS8qIG11bC5iICovCi0gIHszLDYscnJyLFYsUyxWfSwJLyogbXVsLmggKi8KLSAgezMsNyxycnIsVixTLFZ9LAkvKiBtdWwudyAqLwotICB7Myw4LHJycixWLFMsVn0sCS8qIG11bC5sICovCi0gIHs0LDUscnJyLFYsVixWfSwJLyogZGl2LmIgKi8KLSAgezQsNixycnIsVixWLFZ9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJycixWLFYsVn0sCS8qIGRpdi53ICovCi0gIHs0LDgscnJyLFYsVixWfSwJLyogZGl2LmwgKi8KLSAgezQsNSxycnIsVixTLFZ9LAkvKiBkaXYuYiAqLwotICB7NCw2LHJycixWLFMsVn0sCS8qIGRpdi5oICovCi0gIHs0LDcscnJyLFYsUyxWfSwJLyogZGl2LncgKi8KLSAgezQsOCxycnIsVixTLFZ9LAkvKiBkaXYubCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MVtdID0gewotICB7MTEsMCx4eHgsMCwwLDB9LAkvKiBleGl0ICovCi0gIHsxMiwwLGEzLDAsMCwwfSwJLyogam1wICovCi0gIHsxMywyLGEzLDAsMCwwfSwJLyogam1waS5mICovCi0gIHsxMywxLGEzLDAsMCwwfSwJLyogam1waS50ICovCi0gIHsxNCwyLGEzLDAsMCwwfSwJLyogam1wYS5mICovCi0gIHsxNCwxLGEzLDAsMCwwfSwJLyogam1wYS50ICovCi0gIHsxNSwyLGEzLDAsMCwwfSwJLyogam1wcy5mICovCi0gIHsxNSwxLGEzLDAsMCwwfSwJLyogam1wcy50ICovCi0gIHsxNiwwLGEzLDAsMCwwfSwJLyogdGFjICovCi0gIHsxNywwLGExcixBLDAsMH0sCS8qIGxkZWEgKi8KLSAgezE4LDgsYTFsLFZMUywwLDB9LAkvKiBsZC5sICovCi0gIHsxOCw5LGExbCxWTSwwLDB9LAkvKiBsZC54ICovCi0gIHsxOSwwLGEzLDAsMCwwfSwJLyogdGFzICovCi0gIHsyMCwwLGEzLDAsMCwwfSwJLyogcHNoZWEgKi8KLSAgezIxLDgsYTJsLFZMUywwLDB9LAkvKiBzdC5sICovCi0gIHsyMSw5LGEybCxWTSwwLDB9LAkvKiBzdC54ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyMiwwLGEzLDAsMCwwfSwJLyogY2FsbCAqLwotICB7MjMsMCxhMywwLDAsMH0sCS8qIGNhbGxzICovCi0gIHsyNCwwLGEzLDAsMCwwfSwJLyogY2FsbHEgKi8KLSAgezI1LDAsYTFyLEEsMCwwfSwJLyogcGZvcmsgKi8KLSAgezI2LDUsYTJyLFMsMCwwfSwJLyogc3RlLmIgKi8KLSAgezI2LDYsYTJyLFMsMCwwfSwJLyogc3RlLmggKi8KLSAgezI2LDcsYTJyLFMsMCwwfSwJLyogc3RlLncgKi8KLSAgezI2LDgsYTJyLFMsMCwwfSwJLyogc3RlLmwgKi8KLSAgezE4LDUsYTFyLEEsMCwwfSwJLyogbGQuYiAqLwotICB7MTgsNixhMXIsQSwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGExcixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezI3LDcsYTFyLEEsMCwwfSwJLyogaW5jci53ICovCi0gIHsyMSw1LGEycixBLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLEEsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsQSwwLDB9LAkvKiBzdC53ICovCi0gIHsyNyw4LGExcixTLDAsMH0sCS8qIGluY3IubCAqLwotICB7MTgsNSxhMXIsUywwLDB9LAkvKiBsZC5iICovCi0gIHsxOCw2LGExcixTLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsYTFyLFMsMCwwfSwJLyogbGQudyAqLwotICB7MTgsOCxhMXIsUywwLDB9LAkvKiBsZC5sICovCi0gIHsyMSw1LGEycixTLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLFMsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsUywwLDB9LAkvKiBzdC53ICovCi0gIHsyMSw4LGEycixTLDAsMH0sCS8qIHN0LmwgKi8KLSAgezE4LDUsYTFyLFYsMCwwfSwJLyogbGQuYiAqLwotICB7MTgsNixhMXIsViwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGExcixWLDAsMH0sCS8qIGxkLncgKi8KLSAgezE4LDgsYTFyLFYsMCwwfSwJLyogbGQubCAqLwotICB7MjEsNSxhMnIsViwwLDB9LAkvKiBzdC5iICovCi0gIHsyMSw2LGEycixWLDAsMH0sCS8qIHN0LmggKi8KLSAgezIxLDcsYTJyLFYsMCwwfSwJLyogc3QudyAqLwotICB7MjEsOCxhMnIsViwwLDB9LAkvKiBzdC5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQyW10gPSB7Ci0gIHsyOCw1LHJyLEEsQSwwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLEEsQSwwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLEEsQSwwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLEEsQSwwfSwJLyogY3Z0aC53ICovCi0gIHsyOCw1LHJyLFMsUywwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLFMsUywwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLFMsUywwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLFMsUywwfSwJLyogY3Z0aC53ICovCi0gIHsyOCwzLHJyLFMsUywwfSwJLyogY3Z0dy5zICovCi0gIHszMSw3LHJyLFMsUywwfSwJLyogY3Z0cy53ICovCi0gIHszMiwzLHJyLFMsUywwfSwJLyogY3Z0ZC5zICovCi0gIHszMSw0LHJyLFMsUywwfSwJLyogY3Z0cy5kICovCi0gIHszMSw4LHJyLFMsUywwfSwJLyogY3Z0cy5sICovCi0gIHszMiw4LHJyLFMsUywwfSwJLyogY3Z0ZC5sICovCi0gIHszMywzLHJyLFMsUywwfSwJLyogY3Z0bC5zICovCi0gIHszMyw0LHJyLFMsUywwfSwJLyogY3Z0bC5kICovCi0gIHszNCwwLHJyLEEsQSwwfSwJLyogbGRwYSAqLwotICB7OCwwLG5yLEEsMCwwfSwJLyogc2hmICovCi0gIHsxOCw2LG5yLEEsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxucixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezMzLDcscnIsUyxTLDB9LAkvKiBjdnRsLncgKi8KLSAgezI4LDgscnIsUyxTLDB9LAkvKiBjdnR3LmwgKi8KLSAgezM1LDEscnIsUyxTLDB9LAkvKiBwbGMudCAqLwotICB7MzYsMCxycixTLFMsMH0sCS8qIHR6YyAqLwotICB7MzcsNixycixBLEEsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsQSxBLDB9LAkvKiBlcS53ICovCi0gIHszNyw2LG5yLEEsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxucixBLDAsMH0sCS8qIGVxLncgKi8KLSAgezM3LDUscnIsUyxTLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFMsUywwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixTLFMsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsUyxTLDB9LAkvKiBlcS5sICovCi0gIHszOCw2LHJyLEEsQSwwfSwJLyogbGV1LmggKi8KLSAgezM4LDcscnIsQSxBLDB9LAkvKiBsZXUudyAqLwotICB7MzgsNixucixBLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LG5yLEEsMCwwfSwJLyogbGV1LncgKi8KLSAgezM4LDUscnIsUyxTLDB9LAkvKiBsZXUuYiAqLwotICB7MzgsNixycixTLFMsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LHJyLFMsUywwfSwJLyogbGV1LncgKi8KLSAgezM4LDgscnIsUyxTLDB9LAkvKiBsZXUubCAqLwotICB7MzksNixycixBLEEsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LHJyLEEsQSwwfSwJLyogbHR1LncgKi8KLSAgezM5LDYsbnIsQSwwLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxucixBLDAsMH0sCS8qIGx0dS53ICovCi0gIHszOSw1LHJyLFMsUywwfSwJLyogbHR1LmIgKi8KLSAgezM5LDYscnIsUyxTLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxycixTLFMsMH0sCS8qIGx0dS53ICovCi0gIHszOSw4LHJyLFMsUywwfSwJLyogbHR1LmwgKi8KLSAgezQwLDYscnIsQSxBLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLEEsQSwwfSwJLyogbGUudyAqLwotICB7NDAsNixucixBLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsbnIsQSwwLDB9LAkvKiBsZS53ICovCi0gIHs0MCw1LHJyLFMsUywwfSwJLyogbGUuYiAqLwotICB7NDAsNixycixTLFMsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcscnIsUyxTLDB9LAkvKiBsZS53ICovCi0gIHs0MCw4LHJyLFMsUywwfSwJLyogbGUubCAqLwotICB7NDEsNixycixBLEEsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsQSxBLDB9LAkvKiBsdC53ICovCi0gIHs0MSw2LG5yLEEsMCwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxucixBLDAsMH0sCS8qIGx0LncgKi8KLSAgezQxLDUscnIsUyxTLDB9LAkvKiBsdC5iICovCi0gIHs0MSw2LHJyLFMsUywwfSwJLyogbHQuaCAqLwotICB7NDEsNyxycixTLFMsMH0sCS8qIGx0LncgKi8KLSAgezQxLDgscnIsUyxTLDB9LAkvKiBsdC5sICovCi0gIHs5LDcscnIsUyxBLDB9LAkvKiBhZGQudyAqLwotICB7OCwwLHJyLEEsQSwwfSwJLyogc2hmICovCi0gIHswLDAscnIsQSxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxycixTLEEsMH0sCS8qIG1vdiAqLwotICB7MCw3LHJyLFMsUywwfSwJLyogbW92LncgKi8KLSAgezgsMCxycixTLFMsMH0sCS8qIHNoZiAqLwotICB7MCwwLHJyLFMsUywwfSwJLyogbW92ICovCi0gIHswLDAscnIsQSxTLDB9LAkvKiBtb3YgKi8KLSAgezUsMCxycixBLEEsMH0sCS8qIGFuZCAqLwotICB7NiwwLHJyLEEsQSwwfSwJLyogb3IgKi8KLSAgezcsMCxycixBLEEsMH0sCS8qIHhvciAqLwotICB7NDIsMCxycixBLEEsMH0sCS8qIG5vdCAqLwotICB7NSwwLHJyLFMsUywwfSwJLyogYW5kICovCi0gIHs2LDAscnIsUyxTLDB9LAkvKiBvciAqLwotICB7NywwLHJyLFMsUywwfSwJLyogeG9yICovCi0gIHs0MiwwLHJyLFMsUywwfSwJLyogbm90ICovCi0gIHs0MCwzLHJyLFMsUywwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixTLFMsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsUyxTLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFMsUywwfSwJLyogbHQuZCAqLwotICB7OSwzLHJyLFMsUywwfSwJLyogYWRkLnMgKi8KLSAgezksNCxycixTLFMsMH0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJyLFMsUywwfSwJLyogc3ViLnMgKi8KLSAgezEwLDQscnIsUyxTLDB9LAkvKiBzdWIuZCAqLwotICB7MzcsMyxycixTLFMsMH0sCS8qIGVxLnMgKi8KLSAgezM3LDQscnIsUyxTLDB9LAkvKiBlcS5kICovCi0gIHs0Myw2LHJyLEEsQSwwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsQSxBLDB9LAkvKiBuZWcudyAqLwotICB7MywzLHJyLFMsUywwfSwJLyogbXVsLnMgKi8KLSAgezMsNCxycixTLFMsMH0sCS8qIG11bC5kICovCi0gIHs0LDMscnIsUyxTLDB9LAkvKiBkaXYucyAqLwotICB7NCw0LHJyLFMsUywwfSwJLyogZGl2LmQgKi8KLSAgezksNixycixBLEEsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcscnIsQSxBLDB9LAkvKiBhZGQudyAqLwotICB7OSw2LG5yLEEsMCwwfSwJLyogYWRkLmggKi8KLSAgezksNyxucixBLDAsMH0sCS8qIGFkZC53ICovCi0gIHs5LDUscnIsUyxTLDB9LAkvKiBhZGQuYiAqLwotICB7OSw2LHJyLFMsUywwfSwJLyogYWRkLmggKi8KLSAgezksNyxycixTLFMsMH0sCS8qIGFkZC53ICovCi0gIHs5LDgscnIsUyxTLDB9LAkvKiBhZGQubCAqLwotICB7MTAsNixycixBLEEsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LHJyLEEsQSwwfSwJLyogc3ViLncgKi8KLSAgezEwLDYsbnIsQSwwLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxucixBLDAsMH0sCS8qIHN1Yi53ICovCi0gIHsxMCw1LHJyLFMsUywwfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnIsUyxTLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxycixTLFMsMH0sCS8qIHN1Yi53ICovCi0gIHsxMCw4LHJyLFMsUywwfSwJLyogc3ViLmwgKi8KLSAgezMsNixycixBLEEsMH0sCS8qIG11bC5oICovCi0gIHszLDcscnIsQSxBLDB9LAkvKiBtdWwudyAqLwotICB7Myw2LG5yLEEsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxucixBLDAsMH0sCS8qIG11bC53ICovCi0gIHszLDUscnIsUyxTLDB9LAkvKiBtdWwuYiAqLwotICB7Myw2LHJyLFMsUywwfSwJLyogbXVsLmggKi8KLSAgezMsNyxycixTLFMsMH0sCS8qIG11bC53ICovCi0gIHszLDgscnIsUyxTLDB9LAkvKiBtdWwubCAqLwotICB7NCw2LHJyLEEsQSwwfSwJLyogZGl2LmggKi8KLSAgezQsNyxycixBLEEsMH0sCS8qIGRpdi53ICovCi0gIHs0LDYsbnIsQSwwLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LG5yLEEsMCwwfSwJLyogZGl2LncgKi8KLSAgezQsNSxycixTLFMsMH0sCS8qIGRpdi5iICovCi0gIHs0LDYscnIsUyxTLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJyLFMsUywwfSwJLyogZGl2LncgKi8KLSAgezQsOCxycixTLFMsMH0sCS8qIGRpdi5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQzW10gPSB7Ci0gIHszMiwzLHJyLFYsViwwfSwJLyogY3Z0ZC5zICovCi0gIHszMSw0LHJyLFYsViwwfSwJLyogY3Z0cy5kICovCi0gIHszMyw0LHJyLFYsViwwfSwJLyogY3Z0bC5kICovCi0gIHszMiw4LHJyLFYsViwwfSwJLyogY3Z0ZC5sICovCi0gIHswLDAscnJsLFMsUyxWTX0sCS8qIG1vdiAqLwotICB7MCwwLHJscixTLFZNLFN9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezQ0LDAscnIsUyxTLDB9LAkvKiBsb3AgKi8KLSAgezM2LDAscnIsVixWLDB9LAkvKiB0emMgKi8KLSAgezQ0LDAscnIsVixWLDB9LAkvKiBsb3AgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezQyLDAscnIsVixWLDB9LAkvKiBub3QgKi8KLSAgezgsMCxycixTLFYsMH0sCS8qIHNoZiAqLwotICB7MzUsMSxycixWLFYsMH0sCS8qIHBsYy50ICovCi0gIHs0NSwyLHJyLFYsViwwfSwJLyogY3Bycy5mICovCi0gIHs0NSwxLHJyLFYsViwwfSwJLyogY3Bycy50ICovCi0gIHszNywzLHJyLFYsViwwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixWLFYsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDMscnIsVixWLDB9LAkvKiBuZWcucyAqLwotICB7NDMsNCxycixWLFYsMH0sCS8qIG5lZy5kICovCi0gIHszNywzLHJyLFMsViwwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixTLFYsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDMscnIsUyxTLDB9LAkvKiBuZWcucyAqLwotICB7NDMsNCxycixTLFMsMH0sCS8qIG5lZy5kICovCi0gIHs0MCwzLHJyLFYsViwwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixWLFYsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsVixWLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFYsViwwfSwJLyogbHQuZCAqLwotICB7NDAsMyxycixTLFYsMH0sCS8qIGxlLnMgKi8KLSAgezQwLDQscnIsUyxWLDB9LAkvKiBsZS5kICovCi0gIHs0MSwzLHJyLFMsViwwfSwJLyogbHQucyAqLwotICB7NDEsNCxycixTLFYsMH0sCS8qIGx0LmQgKi8KLSAgezM3LDUscnIsVixWLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFYsViwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixWLFYsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsVixWLDB9LAkvKiBlcS5sICovCi0gIHszNyw1LHJyLFMsViwwfSwJLyogZXEuYiAqLwotICB7MzcsNixycixTLFYsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsUyxWLDB9LAkvKiBlcS53ICovCi0gIHszNyw4LHJyLFMsViwwfSwJLyogZXEubCAqLwotICB7NDAsNSxycixWLFYsMH0sCS8qIGxlLmIgKi8KLSAgezQwLDYscnIsVixWLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLFYsViwwfSwJLyogbGUudyAqLwotICB7NDAsOCxycixWLFYsMH0sCS8qIGxlLmwgKi8KLSAgezQwLDUscnIsUyxWLDB9LAkvKiBsZS5iICovCi0gIHs0MCw2LHJyLFMsViwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxycixTLFYsMH0sCS8qIGxlLncgKi8KLSAgezQwLDgscnIsUyxWLDB9LAkvKiBsZS5sICovCi0gIHs0MSw1LHJyLFYsViwwfSwJLyogbHQuYiAqLwotICB7NDEsNixycixWLFYsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsVixWLDB9LAkvKiBsdC53ICovCi0gIHs0MSw4LHJyLFYsViwwfSwJLyogbHQubCAqLwotICB7NDEsNSxycixTLFYsMH0sCS8qIGx0LmIgKi8KLSAgezQxLDYscnIsUyxWLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LHJyLFMsViwwfSwJLyogbHQudyAqLwotICB7NDEsOCxycixTLFYsMH0sCS8qIGx0LmwgKi8KLSAgezQzLDUscnIsVixWLDB9LAkvKiBuZWcuYiAqLwotICB7NDMsNixycixWLFYsMH0sCS8qIG5lZy5oICovCi0gIHs0Myw3LHJyLFYsViwwfSwJLyogbmVnLncgKi8KLSAgezQzLDgscnIsVixWLDB9LAkvKiBuZWcubCAqLwotICB7NDMsNSxycixTLFMsMH0sCS8qIG5lZy5iICovCi0gIHs0Myw2LHJyLFMsUywwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsUyxTLDB9LAkvKiBuZWcudyAqLwotICB7NDMsOCxycixTLFMsMH0sCS8qIG5lZy5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ0W10gPSB7Ci0gIHs0NiwwLG5vcHMsMCwwLDB9LAkvKiBub3AgKi8KLSAgezQ3LDAscGNyZWwsMCwwLDB9LAkvKiBiciAqLwotICB7NDgsMixwY3JlbCwwLDAsMH0sCS8qIGJyaS5mICovCi0gIHs0OCwxLHBjcmVsLDAsMCwwfSwJLyogYnJpLnQgKi8KLSAgezQ5LDIscGNyZWwsMCwwLDB9LAkvKiBicmEuZiAqLwotICB7NDksMSxwY3JlbCwwLDAsMH0sCS8qIGJyYS50ICovCi0gIHs1MCwyLHBjcmVsLDAsMCwwfSwJLyogYnJzLmYgKi8KLSAgezUwLDEscGNyZWwsMCwwLDB9LAkvKiBicnMudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0NVtdID0gewotICB7NTEsNSxycixWLFYsMH0sCS8qIGxkdmkuYiAqLwotICB7NTEsNixycixWLFYsMH0sCS8qIGxkdmkuaCAqLwotICB7NTEsNyxycixWLFYsMH0sCS8qIGxkdmkudyAqLwotICB7NTEsOCxycixWLFYsMH0sCS8qIGxkdmkubCAqLwotICB7MjgsMyxycixWLFYsMH0sCS8qIGN2dHcucyAqLwotICB7MzEsNyxycixWLFYsMH0sCS8qIGN2dHMudyAqLwotICB7MjgsOCxycixWLFYsMH0sCS8qIGN2dHcubCAqLwotICB7MzMsNyxycixWLFYsMH0sCS8qIGN2dGwudyAqLwotICB7NTIsNSxyeHIsVixWLDB9LAkvKiBzdHZpLmIgKi8KLSAgezUyLDYscnhyLFYsViwwfSwJLyogc3R2aS5oICovCi0gIHs1Miw3LHJ4cixWLFYsMH0sCS8qIHN0dmkudyAqLwotICB7NTIsOCxyeHIsVixWLDB9LAkvKiBzdHZpLmwgKi8KLSAgezUyLDUscnhyLFMsViwwfSwJLyogc3R2aS5iICovCi0gIHs1Miw2LHJ4cixTLFYsMH0sCS8qIHN0dmkuaCAqLwotICB7NTIsNyxyeHIsUyxWLDB9LAkvKiBzdHZpLncgKi8KLSAgezUyLDgscnhyLFMsViwwfSwJLyogc3R2aS5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ2W10gPSB7Ci0gIHs1MywwLHIsQSwwLDB9LAkvKiBsZHNkciAqLwotICB7NTQsMCxyLEEsMCwwfSwJLyogbGRrZHIgKi8KLSAgezU1LDMscixTLDAsMH0sCS8qIGxuLnMgKi8KLSAgezU1LDQscixTLDAsMH0sCS8qIGxuLmQgKi8KLSAgezU2LDAsbm9wcywwLDAsMH0sCS8qIHBhdHUgKi8KLSAgezU3LDAscixBLDAsMH0sCS8qIHBhdGUgKi8KLSAgezU4LDAsbm9wcywwLDAsMH0sCS8qIHBpY2ggKi8KLSAgezU5LDAsbm9wcywwLDAsMH0sCS8qIHBsY2ggKi8KLSAgezAsMCxscixQU1csQSwwfSwJLyogbW92ICovCi0gIHswLDAscnhsLEEsUFNXLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixQQyxBLDB9LAkvKiBtb3YgKi8KLSAgezYwLDAscixTLDAsMH0sCS8qIGlkbGUgKi8KLSAgezAsMCxscixJVFIsUywwfSwJLyogbW92ICovCi0gIHswLDAscnhsLFMsSVRSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCxyeGwsUyxJVFNSLDB9LAkvKiBtb3YgKi8KLSAgezYxLDAsbm9wcywwLDAsMH0sCS8qIHJ0bnEgKi8KLSAgezYyLDAsbm9wcywwLDAsMH0sCS8qIGNmb3JrICovCi0gIHs2MywwLG5vcHMsMCwwLDB9LAkvKiBydG4gKi8KLSAgezY0LDAsbm9wcywwLDAsMH0sCS8qIHdmb3JrICovCi0gIHs2NSwwLG5vcHMsMCwwLDB9LAkvKiBqb2luICovCi0gIHs2NiwwLG5vcHMsMCwwLDB9LAkvKiBydG5jICovCi0gIHs2NywzLHIsUywwLDB9LAkvKiBleHAucyAqLwotICB7NjcsNCxyLFMsMCwwfSwJLyogZXhwLmQgKi8KLSAgezY4LDMscixTLDAsMH0sCS8qIHNpbi5zICovCi0gIHs2OCw0LHIsUywwLDB9LAkvKiBzaW4uZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NjksMyxyLFMsMCwwfSwJLyogY29zLnMgKi8KLSAgezY5LDQscixTLDAsMH0sCS8qIGNvcy5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs3MCw3LHIsQSwwLDB9LAkvKiBwc2gudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NzEsNyxyLEEsMCwwfSwJLyogcG9wLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezcwLDcscixTLDAsMH0sCS8qIHBzaC53ICovCi0gIHs3MCw4LHIsUywwLDB9LAkvKiBwc2gubCAqLwotICB7NzEsNyxyLFMsMCwwfSwJLyogcG9wLncgKi8KLSAgezcxLDgscixTLDAsMH0sCS8qIHBvcC5sICovCi0gIHs3MiwwLG5vcHMsMCwwLDB9LAkvKiBlbmkgKi8KLSAgezczLDAsbm9wcywwLDAsMH0sCS8qIGRzaSAqLwotICB7NzQsMCxub3BzLDAsMCwwfSwJLyogYmtwdCAqLwotICB7NzUsMCxub3BzLDAsMCwwfSwJLyogbXN5bmMgKi8KLSAgezc2LDAscixTLDAsMH0sCS8qIG1za2kgKi8KLSAgezc3LDAscixTLDAsMH0sCS8qIHhtdGkgKi8KLSAgezAsMCxyeGwsUyxWViwwfSwJLyogbW92ICovCi0gIHs3OCwwLG5vcHMsMCwwLDB9LAkvKiB0c3R2diAqLwotICB7MCwwLGxyLFZTLEEsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxBLFZTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixWTCxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsQSxWTCwwfSwJLyogbW92ICovCi0gIHswLDcsbHIsVlMsUywwfSwJLyogbW92LncgKi8KLSAgezAsNyxyeGwsUyxWUywwfSwJLyogbW92LncgKi8KLSAgezAsNyxscixWTCxTLDB9LAkvKiBtb3YudyAqLwotICB7MCw3LHJ4bCxTLFZMLDB9LAkvKiBtb3YudyAqLwotICB7NzksMCxyLEEsMCwwfSwJLyogZGlhZyAqLwotICB7ODAsMCxub3BzLDAsMCwwfSwJLyogcGJrcHQgKi8KLSAgezgxLDMscixTLDAsMH0sCS8qIHNxcnQucyAqLwotICB7ODEsNCxyLFMsMCwwfSwJLyogc3FydC5kICovCi0gIHs4MiwwLG5vcHMsMCwwLDB9LAkvKiBjYXNyICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MywzLHIsUywwLDB9LAkvKiBhdGFuLnMgKi8KLSAgezgzLDQscixTLDAsMH0sCS8qIGF0YW4uZCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0N1tdID0gewotICB7ODQsNSxyLFYsMCwwfSwJLyogc3VtLmIgKi8KLSAgezg0LDYscixWLDAsMH0sCS8qIHN1bS5oICovCi0gIHs4NCw3LHIsViwwLDB9LAkvKiBzdW0udyAqLwotICB7ODQsOCxyLFYsMCwwfSwJLyogc3VtLmwgKi8KLSAgezg1LDAscixWLDAsMH0sCS8qIGFsbCAqLwotICB7ODYsMCxyLFYsMCwwfSwJLyogYW55ICovCi0gIHs4NywwLHIsViwwLDB9LAkvKiBwYXJpdHkgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDUscixWLDAsMH0sCS8qIG1heC5iICovCi0gIHs4OCw2LHIsViwwLDB9LAkvKiBtYXguaCAqLwotICB7ODgsNyxyLFYsMCwwfSwJLyogbWF4LncgKi8KLSAgezg4LDgscixWLDAsMH0sCS8qIG1heC5sICovCi0gIHs4OSw1LHIsViwwLDB9LAkvKiBtaW4uYiAqLwotICB7ODksNixyLFYsMCwwfSwJLyogbWluLmggKi8KLSAgezg5LDcscixWLDAsMH0sCS8qIG1pbi53ICovCi0gIHs4OSw4LHIsViwwLDB9LAkvKiBtaW4ubCAqLwotICB7ODQsMyxyLFYsMCwwfSwJLyogc3VtLnMgKi8KLSAgezg0LDQscixWLDAsMH0sCS8qIHN1bS5kICovCi0gIHs5MCwzLHIsViwwLDB9LAkvKiBwcm9kLnMgKi8KLSAgezkwLDQscixWLDAsMH0sCS8qIHByb2QuZCAqLwotICB7ODgsMyxyLFYsMCwwfSwJLyogbWF4LnMgKi8KLSAgezg4LDQscixWLDAsMH0sCS8qIG1heC5kICovCi0gIHs4OSwzLHIsViwwLDB9LAkvKiBtaW4ucyAqLwotICB7ODksNCxyLFYsMCwwfSwJLyogbWluLmQgKi8KLSAgezkwLDUscixWLDAsMH0sCS8qIHByb2QuYiAqLwotICB7OTAsNixyLFYsMCwwfSwJLyogcHJvZC5oICovCi0gIHs5MCw3LHIsViwwLDB9LAkvKiBwcm9kLncgKi8KLSAgezkwLDgscixWLDAsMH0sCS8qIHByb2QubCAqLwotICB7MzUsMixscixWTSxTLDB9LAkvKiBwbGMuZiAqLwotICB7MzUsMSxscixWTSxTLDB9LAkvKiBwbGMudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0eFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MWFbXSA9IHsKLSAgezkxLDAsaW1yLEEsMCwwfSwJLyogaGFsdCAqLwotICB7OTIsMCxhNCwwLDAsMH0sCS8qIHN5c2MgKi8KLSAgezE4LDYsaW1yLEEsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxpbXIsQSwwLDB9LAkvKiBsZC53ICovCi0gIHs1LDAsaW1yLEEsMCwwfSwJLyogYW5kICovCi0gIHs2LDAsaW1yLEEsMCwwfSwJLyogb3IgKi8KLSAgezcsMCxpbXIsQSwwLDB9LAkvKiB4b3IgKi8KLSAgezgsMCxpbXIsQSwwLDB9LAkvKiBzaGYgKi8KLSAgezksNixpbXIsQSwwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LGltcixBLDAsMH0sCS8qIGFkZC53ICovCi0gIHsxMCw2LGltcixBLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LGltcixBLDAsMH0sCS8qIHN1Yi53ICovCi0gIHszLDYsaW1yLEEsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxpbXIsQSwwLDB9LAkvKiBtdWwudyAqLwotICB7NCw2LGltcixBLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsaW1yLEEsMCwwfSwJLyogZGl2LncgKi8KLSAgezE4LDcsaW1sLFZMLDAsMH0sCS8qIGxkLncgKi8KLSAgezE4LDcsaW1sLFZTLDAsMH0sCS8qIGxkLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezgsNyxpbXIsUywwLDB9LAkvKiBzaGYudyAqLwotICB7OTMsMCxhNSwwLDAsMH0sCS8qIHRyYXAgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezM3LDYsaW1yLEEsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxpbXIsQSwwLDB9LAkvKiBlcS53ICovCi0gIHszOCw2LGltcixBLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LGltcixBLDAsMH0sCS8qIGxldS53ICovCi0gIHszOSw2LGltcixBLDAsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LGltcixBLDAsMH0sCS8qIGx0dS53ICovCi0gIHs0MCw2LGltcixBLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsaW1yLEEsMCwwfSwJLyogbGUudyAqLwotICB7NDEsNixpbXIsQSwwLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LGltcixBLDAsMH0sCS8qIGx0LncgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDFiW10gPSB7Ci0gIHsxOCw0LGltcixTLDAsMH0sCS8qIGxkLmQgKi8KLSAgezE4LDEwLGltcixTLDAsMH0sCS8qIGxkLnUgKi8KLSAgezE4LDgsaW1yLFMsMCwwfSwJLyogbGQubCAqLwotICB7MTgsNyxpbXIsUywwLDB9LAkvKiBsZC53ICovCi0gIHs1LDAsaW1yLFMsMCwwfSwJLyogYW5kICovCi0gIHs2LDAsaW1yLFMsMCwwfSwJLyogb3IgKi8KLSAgezcsMCxpbXIsUywwLDB9LAkvKiB4b3IgKi8KLSAgezgsMCxpbXIsUywwLDB9LAkvKiBzaGYgKi8KLSAgezksNixpbXIsUywwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LGltcixTLDAsMH0sCS8qIGFkZC53ICovCi0gIHsxMCw2LGltcixTLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LGltcixTLDAsMH0sCS8qIHN1Yi53ICovCi0gIHszLDYsaW1yLFMsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxpbXIsUywwLDB9LAkvKiBtdWwudyAqLwotICB7NCw2LGltcixTLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsaW1yLFMsMCwwfSwJLyogZGl2LncgKi8KLSAgezksMyxpbXIsUywwLDB9LAkvKiBhZGQucyAqLwotICB7MTAsMyxpbXIsUywwLDB9LAkvKiBzdWIucyAqLwotICB7MywzLGltcixTLDAsMH0sCS8qIG11bC5zICovCi0gIHs0LDMsaW1yLFMsMCwwfSwJLyogZGl2LnMgKi8KLSAgezQwLDMsaW1yLFMsMCwwfSwJLyogbGUucyAqLwotICB7NDEsMyxpbXIsUywwLDB9LAkvKiBsdC5zICovCi0gIHszNyw2LGltcixTLDAsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcsaW1yLFMsMCwwfSwJLyogZXEudyAqLwotICB7MzgsNixpbXIsUywwLDB9LAkvKiBsZXUuaCAqLwotICB7MzgsNyxpbXIsUywwLDB9LAkvKiBsZXUudyAqLwotICB7MzksNixpbXIsUywwLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxpbXIsUywwLDB9LAkvKiBsdHUudyAqLwotICB7NDAsNixpbXIsUywwLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LGltcixTLDAsMH0sCS8qIGxlLncgKi8KLSAgezQxLDYsaW1yLFMsMCwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxpbXIsUywwLDB9LAkvKiBsdC53ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQwW10gPSB7Ci0gIHsxMCwzLHJycixTLFYsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixTLFYsVn0sCS8qIHN1Yi5kICovCi0gIHs0LDMscnJyLFMsVixWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsUyxWLFZ9LAkvKiBkaXYuZCAqLwotICB7MTAsMTEscnJyLFMsVixWfSwJLyogc3ViLnMuZiAqLwotICB7MTAsMTIscnJyLFMsVixWfSwJLyogc3ViLmQuZiAqLwotICB7NCwxMSxycnIsUyxWLFZ9LAkvKiBkaXYucy5mICovCi0gIHs0LDEyLHJycixTLFYsVn0sCS8qIGRpdi5kLmYgKi8KLSAgezMsMTEscnJyLFYsVixWfSwJLyogbXVsLnMuZiAqLwotICB7MywxMixycnIsVixWLFZ9LAkvKiBtdWwuZC5mICovCi0gIHs0LDExLHJycixWLFYsVn0sCS8qIGRpdi5zLmYgKi8KLSAgezQsMTIscnJyLFYsVixWfSwJLyogZGl2LmQuZiAqLwotICB7MywxMSxycnIsVixTLFZ9LAkvKiBtdWwucy5mICovCi0gIHszLDEyLHJycixWLFMsVn0sCS8qIG11bC5kLmYgKi8KLSAgezQsMTEscnJyLFYsUyxWfSwJLyogZGl2LnMuZiAqLwotICB7NCwxMixycnIsVixTLFZ9LAkvKiBkaXYuZC5mICovCi0gIHs1LDIscnJyLFYsVixWfSwJLyogYW5kLmYgKi8KLSAgezYsMixycnIsVixWLFZ9LAkvKiBvci5mICovCi0gIHs3LDIscnJyLFYsVixWfSwJLyogeG9yLmYgKi8KLSAgezgsMixycnIsVixWLFZ9LAkvKiBzaGYuZiAqLwotICB7NSwyLHJycixWLFMsVn0sCS8qIGFuZC5mICovCi0gIHs2LDIscnJyLFYsUyxWfSwJLyogb3IuZiAqLwotICB7NywyLHJycixWLFMsVn0sCS8qIHhvci5mICovCi0gIHs4LDIscnJyLFYsUyxWfSwJLyogc2hmLmYgKi8KLSAgezksMTEscnJyLFYsVixWfSwJLyogYWRkLnMuZiAqLwotICB7OSwxMixycnIsVixWLFZ9LAkvKiBhZGQuZC5mICovCi0gIHsxMCwxMSxycnIsVixWLFZ9LAkvKiBzdWIucy5mICovCi0gIHsxMCwxMixycnIsVixWLFZ9LAkvKiBzdWIuZC5mICovCi0gIHs5LDExLHJycixWLFMsVn0sCS8qIGFkZC5zLmYgKi8KLSAgezksMTIscnJyLFYsUyxWfSwJLyogYWRkLmQuZiAqLwotICB7MTAsMTEscnJyLFYsUyxWfSwJLyogc3ViLnMuZiAqLwotICB7MTAsMTIscnJyLFYsUyxWfSwJLyogc3ViLmQuZiAqLwotICB7OSwxMyxycnIsVixWLFZ9LAkvKiBhZGQuYi5mICovCi0gIHs5LDE0LHJycixWLFYsVn0sCS8qIGFkZC5oLmYgKi8KLSAgezksMTUscnJyLFYsVixWfSwJLyogYWRkLncuZiAqLwotICB7OSwxNixycnIsVixWLFZ9LAkvKiBhZGQubC5mICovCi0gIHs5LDEzLHJycixWLFMsVn0sCS8qIGFkZC5iLmYgKi8KLSAgezksMTQscnJyLFYsUyxWfSwJLyogYWRkLmguZiAqLwotICB7OSwxNSxycnIsVixTLFZ9LAkvKiBhZGQudy5mICovCi0gIHs5LDE2LHJycixWLFMsVn0sCS8qIGFkZC5sLmYgKi8KLSAgezEwLDEzLHJycixWLFYsVn0sCS8qIHN1Yi5iLmYgKi8KLSAgezEwLDE0LHJycixWLFYsVn0sCS8qIHN1Yi5oLmYgKi8KLSAgezEwLDE1LHJycixWLFYsVn0sCS8qIHN1Yi53LmYgKi8KLSAgezEwLDE2LHJycixWLFYsVn0sCS8qIHN1Yi5sLmYgKi8KLSAgezEwLDEzLHJycixWLFMsVn0sCS8qIHN1Yi5iLmYgKi8KLSAgezEwLDE0LHJycixWLFMsVn0sCS8qIHN1Yi5oLmYgKi8KLSAgezEwLDE1LHJycixWLFMsVn0sCS8qIHN1Yi53LmYgKi8KLSAgezEwLDE2LHJycixWLFMsVn0sCS8qIHN1Yi5sLmYgKi8KLSAgezMsMTMscnJyLFYsVixWfSwJLyogbXVsLmIuZiAqLwotICB7MywxNCxycnIsVixWLFZ9LAkvKiBtdWwuaC5mICovCi0gIHszLDE1LHJycixWLFYsVn0sCS8qIG11bC53LmYgKi8KLSAgezMsMTYscnJyLFYsVixWfSwJLyogbXVsLmwuZiAqLwotICB7MywxMyxycnIsVixTLFZ9LAkvKiBtdWwuYi5mICovCi0gIHszLDE0LHJycixWLFMsVn0sCS8qIG11bC5oLmYgKi8KLSAgezMsMTUscnJyLFYsUyxWfSwJLyogbXVsLncuZiAqLwotICB7MywxNixycnIsVixTLFZ9LAkvKiBtdWwubC5mICovCi0gIHs0LDEzLHJycixWLFYsVn0sCS8qIGRpdi5iLmYgKi8KLSAgezQsMTQscnJyLFYsVixWfSwJLyogZGl2LmguZiAqLwotICB7NCwxNSxycnIsVixWLFZ9LAkvKiBkaXYudy5mICovCi0gIHs0LDE2LHJycixWLFYsVn0sCS8qIGRpdi5sLmYgKi8KLSAgezQsMTMscnJyLFYsUyxWfSwJLyogZGl2LmIuZiAqLwotICB7NCwxNCxycnIsVixTLFZ9LAkvKiBkaXYuaC5mICovCi0gIHs0LDE1LHJycixWLFMsVn0sCS8qIGRpdi53LmYgKi8KLSAgezQsMTYscnJyLFYsUyxWfSwJLyogZGl2LmwuZiAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0MVtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7OTQsMCxhMywwLDAsMH0sCS8qIHRzdCAqLwotICB7OTUsMCxhMywwLDAsMH0sCS8qIGxjayAqLwotICB7OTYsMCxhMywwLDAsMH0sCS8qIHVsayAqLwotICB7MTcsMCxhMXIsUywwLDB9LAkvKiBsZGVhICovCi0gIHs5NywwLGExcixBLDAsMH0sCS8qIHNwYXduICovCi0gIHs5OCwwLGExcixBLDAsMH0sCS8qIGxkY21yICovCi0gIHs5OSwwLGEycixBLDAsMH0sCS8qIHN0Y21yICovCi0gIHsxMDAsMCxhMXIsQSwwLDB9LAkvKiBwb3ByICovCi0gIHsxMDEsMCxhMnIsQSwwLDB9LAkvKiBwc2hyICovCi0gIHsxMDIsNyxhMXIsQSwwLDB9LAkvKiByY3ZyLncgKi8KLSAgezEwMyw3LGEycixBLDAsMH0sCS8qIG1hdG0udyAqLwotICB7MTA0LDcsYTJyLEEsMCwwfSwJLyogc25kci53ICovCi0gIHsxMDQsOCxhMnIsUywwLDB9LAkvKiBzbmRyLmwgKi8KLSAgezEwMiw4LGExcixTLDAsMH0sCS8qIHJjdnIubCAqLwotICB7MTAzLDgsYTJyLFMsMCwwfSwJLyogbWF0bS5sICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMDUsNyxhMnIsQSwwLDB9LAkvKiBwdXRyLncgKi8KLSAgezEwNSw4LGEycixTLDAsMH0sCS8qIHB1dHIubCAqLwotICB7MTA2LDcsYTFyLEEsMCwwfSwJLyogZ2V0ci53ICovCi0gIHsxMDYsOCxhMXIsUywwLDB9LAkvKiBnZXRyLmwgKi8KLSAgezI2LDEzLGEycixTLDAsMH0sCS8qIHN0ZS5iLmYgKi8KLSAgezI2LDE0LGEycixTLDAsMH0sCS8qIHN0ZS5oLmYgKi8KLSAgezI2LDE1LGEycixTLDAsMH0sCS8qIHN0ZS53LmYgKi8KLSAgezI2LDE2LGEycixTLDAsMH0sCS8qIHN0ZS5sLmYgKi8KLSAgezEwNyw3LGEycixBLDAsMH0sCS8qIG1hdHIudyAqLwotICB7MTA4LDcsYTJyLEEsMCwwfSwJLyogbWF0LncgKi8KLSAgezEwOSw3LGExcixBLDAsMH0sCS8qIGdldC53ICovCi0gIHsxMTAsNyxhMXIsQSwwLDB9LAkvKiByY3YudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MTExLDcsYTFyLEEsMCwwfSwJLyogaW5jLncgKi8KLSAgezExMiw3LGEycixBLDAsMH0sCS8qIHB1dC53ICovCi0gIHsxMTMsNyxhMnIsQSwwLDB9LAkvKiBzbmQudyAqLwotICB7MTA3LDgsYTJyLFMsMCwwfSwJLyogbWF0ci5sICovCi0gIHsxMDgsOCxhMnIsUywwLDB9LAkvKiBtYXQubCAqLwotICB7MTA5LDgsYTFyLFMsMCwwfSwJLyogZ2V0LmwgKi8KLSAgezExMCw4LGExcixTLDAsMH0sCS8qIHJjdi5sICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTEsOCxhMXIsUywwLDB9LAkvKiBpbmMubCAqLwotICB7MTEyLDgsYTJyLFMsMCwwfSwJLyogcHV0LmwgKi8KLSAgezExMyw4LGEycixTLDAsMH0sCS8qIHNuZC5sICovCi0gIHsxOCwxMyxhMXIsViwwLDB9LAkvKiBsZC5iLmYgKi8KLSAgezE4LDE0LGExcixWLDAsMH0sCS8qIGxkLmguZiAqLwotICB7MTgsMTUsYTFyLFYsMCwwfSwJLyogbGQudy5mICovCi0gIHsxOCwxNixhMXIsViwwLDB9LAkvKiBsZC5sLmYgKi8KLSAgezIxLDEzLGEycixWLDAsMH0sCS8qIHN0LmIuZiAqLwotICB7MjEsMTQsYTJyLFYsMCwwfSwJLyogc3QuaC5mICovCi0gIHsyMSwxNSxhMnIsViwwLDB9LAkvKiBzdC53LmYgKi8KLSAgezIxLDE2LGEycixWLDAsMH0sCS8qIHN0LmwuZiAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0MltdID0gewotICB7MjgsNSxycixWLFYsMH0sCS8qIGN2dHcuYiAqLwotICB7MjgsNixycixWLFYsMH0sCS8qIGN2dHcuaCAqLwotICB7MjksNyxycixWLFYsMH0sCS8qIGN2dGIudyAqLwotICB7MzAsNyxycixWLFYsMH0sCS8qIGN2dGgudyAqLwotICB7MjgsMTMscnIsVixWLDB9LAkvKiBjdnR3LmIuZiAqLwotICB7MjgsMTQscnIsVixWLDB9LAkvKiBjdnR3LmguZiAqLwotICB7MjksMTUscnIsVixWLDB9LAkvKiBjdnRiLncuZiAqLwotICB7MzAsMTUscnIsVixWLDB9LAkvKiBjdnRoLncuZiAqLwotICB7MzEsOCxycixWLFYsMH0sCS8qIGN2dHMubCAqLwotICB7MzIsNyxycixWLFYsMH0sCS8qIGN2dGQudyAqLwotICB7MzMsMyxycixWLFYsMH0sCS8qIGN2dGwucyAqLwotICB7MjgsNCxycixWLFYsMH0sCS8qIGN2dHcuZCAqLwotICB7MzEsMTYscnIsVixWLDB9LAkvKiBjdnRzLmwuZiAqLwotICB7MzIsMTUscnIsVixWLDB9LAkvKiBjdnRkLncuZiAqLwotICB7MzMsMTEscnIsVixWLDB9LAkvKiBjdnRsLnMuZiAqLwotICB7MjgsMTIscnIsVixWLDB9LAkvKiBjdnR3LmQuZiAqLwotICB7MTE0LDAscnIsUyxTLDB9LAkvKiBlbmFsICovCi0gIHs4LDcscnIsUyxTLDB9LAkvKiBzaGYudyAqLwotICB7MTE1LDAscnIsUyxTLDB9LAkvKiBlbmFnICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyOCw0LHJyLFMsUywwfSwJLyogY3Z0dy5kICovCi0gIHszMiw3LHJyLFMsUywwfSwJLyogY3Z0ZC53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMyxycixTLFMsMH0sCS8qIGZyaW50LnMgKi8KLSAgezExNiw0LHJyLFMsUywwfSwJLyogZnJpbnQuZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTE2LDMscnIsVixWLDB9LAkvKiBmcmludC5zICovCi0gIHsxMTYsNCxycixWLFYsMH0sCS8qIGZyaW50LmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezExNiwxMSxycixWLFYsMH0sCS8qIGZyaW50LnMuZiAqLwotICB7MTE2LDEyLHJyLFYsViwwfSwJLyogZnJpbnQuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwzLHJyLFYsViwwfSwJLyogc3FydC5zICovCi0gIHs4MSw0LHJyLFYsViwwfSwJLyogc3FydC5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwxMSxycixWLFYsMH0sCS8qIHNxcnQucy5mICovCi0gIHs4MSwxMixycixWLFYsMH0sCS8qIHNxcnQuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQzW10gPSB7Ci0gIHszMiwxMSxycixWLFYsMH0sCS8qIGN2dGQucy5mICovCi0gIHszMSwxMixycixWLFYsMH0sCS8qIGN2dHMuZC5mICovCi0gIHszMywxMixycixWLFYsMH0sCS8qIGN2dGwuZC5mICovCi0gIHszMiwxNixycixWLFYsMH0sCS8qIGN2dGQubC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNiwyLHJyLFYsViwwfSwJLyogdHpjLmYgKi8KLSAgezQ0LDIscnIsVixWLDB9LAkvKiBsb3AuZiAqLwotICB7MTE3LDIscnIsVixWLDB9LAkvKiB4cG5kLmYgKi8KLSAgezQyLDIscnIsVixWLDB9LAkvKiBub3QuZiAqLwotICB7OCwyLHJyLFMsViwwfSwJLyogc2hmLmYgKi8KLSAgezM1LDE3LHJyLFYsViwwfSwJLyogcGxjLnQuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzcsMTEscnIsVixWLDB9LAkvKiBlcS5zLmYgKi8KLSAgezM3LDEyLHJyLFYsViwwfSwJLyogZXEuZC5mICovCi0gIHs0MywxMSxycixWLFYsMH0sCS8qIG5lZy5zLmYgKi8KLSAgezQzLDEyLHJyLFYsViwwfSwJLyogbmVnLmQuZiAqLwotICB7MzcsMTEscnIsUyxWLDB9LAkvKiBlcS5zLmYgKi8KLSAgezM3LDEyLHJyLFMsViwwfSwJLyogZXEuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs0MCwxMSxycixWLFYsMH0sCS8qIGxlLnMuZiAqLwotICB7NDAsMTIscnIsVixWLDB9LAkvKiBsZS5kLmYgKi8KLSAgezQxLDExLHJyLFYsViwwfSwJLyogbHQucy5mICovCi0gIHs0MSwxMixycixWLFYsMH0sCS8qIGx0LmQuZiAqLwotICB7NDAsMTEscnIsUyxWLDB9LAkvKiBsZS5zLmYgKi8KLSAgezQwLDEyLHJyLFMsViwwfSwJLyogbGUuZC5mICovCi0gIHs0MSwxMSxycixTLFYsMH0sCS8qIGx0LnMuZiAqLwotICB7NDEsMTIscnIsUyxWLDB9LAkvKiBsdC5kLmYgKi8KLSAgezM3LDEzLHJyLFYsViwwfSwJLyogZXEuYi5mICovCi0gIHszNywxNCxycixWLFYsMH0sCS8qIGVxLmguZiAqLwotICB7MzcsMTUscnIsVixWLDB9LAkvKiBlcS53LmYgKi8KLSAgezM3LDE2LHJyLFYsViwwfSwJLyogZXEubC5mICovCi0gIHszNywxMyxycixTLFYsMH0sCS8qIGVxLmIuZiAqLwotICB7MzcsMTQscnIsUyxWLDB9LAkvKiBlcS5oLmYgKi8KLSAgezM3LDE1LHJyLFMsViwwfSwJLyogZXEudy5mICovCi0gIHszNywxNixycixTLFYsMH0sCS8qIGVxLmwuZiAqLwotICB7NDAsMTMscnIsVixWLDB9LAkvKiBsZS5iLmYgKi8KLSAgezQwLDE0LHJyLFYsViwwfSwJLyogbGUuaC5mICovCi0gIHs0MCwxNSxycixWLFYsMH0sCS8qIGxlLncuZiAqLwotICB7NDAsMTYscnIsVixWLDB9LAkvKiBsZS5sLmYgKi8KLSAgezQwLDEzLHJyLFMsViwwfSwJLyogbGUuYi5mICovCi0gIHs0MCwxNCxycixTLFYsMH0sCS8qIGxlLmguZiAqLwotICB7NDAsMTUscnIsUyxWLDB9LAkvKiBsZS53LmYgKi8KLSAgezQwLDE2LHJyLFMsViwwfSwJLyogbGUubC5mICovCi0gIHs0MSwxMyxycixWLFYsMH0sCS8qIGx0LmIuZiAqLwotICB7NDEsMTQscnIsVixWLDB9LAkvKiBsdC5oLmYgKi8KLSAgezQxLDE1LHJyLFYsViwwfSwJLyogbHQudy5mICovCi0gIHs0MSwxNixycixWLFYsMH0sCS8qIGx0LmwuZiAqLwotICB7NDEsMTMscnIsUyxWLDB9LAkvKiBsdC5iLmYgKi8KLSAgezQxLDE0LHJyLFMsViwwfSwJLyogbHQuaC5mICovCi0gIHs0MSwxNSxycixTLFYsMH0sCS8qIGx0LncuZiAqLwotICB7NDEsMTYscnIsUyxWLDB9LAkvKiBsdC5sLmYgKi8KLSAgezQzLDEzLHJyLFYsViwwfSwJLyogbmVnLmIuZiAqLwotICB7NDMsMTQscnIsVixWLDB9LAkvKiBuZWcuaC5mICovCi0gIHs0MywxNSxycixWLFYsMH0sCS8qIG5lZy53LmYgKi8KLSAgezQzLDE2LHJyLFYsViwwfSwJLyogbmVnLmwuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0NFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0NVtdID0gewotICB7NTEsMTMscnIsVixWLDB9LAkvKiBsZHZpLmIuZiAqLwotICB7NTEsMTQscnIsVixWLDB9LAkvKiBsZHZpLmguZiAqLwotICB7NTEsMTUscnIsVixWLDB9LAkvKiBsZHZpLncuZiAqLwotICB7NTEsMTYscnIsVixWLDB9LAkvKiBsZHZpLmwuZiAqLwotICB7MjgsMTEscnIsVixWLDB9LAkvKiBjdnR3LnMuZiAqLwotICB7MzEsMTUscnIsVixWLDB9LAkvKiBjdnRzLncuZiAqLwotICB7MjgsMTYscnIsVixWLDB9LAkvKiBjdnR3LmwuZiAqLwotICB7MzMsMTUscnIsVixWLDB9LAkvKiBjdnRsLncuZiAqLwotICB7NTIsMTMscnhyLFYsViwwfSwJLyogc3R2aS5iLmYgKi8KLSAgezUyLDE0LHJ4cixWLFYsMH0sCS8qIHN0dmkuaC5mICovCi0gIHs1MiwxNSxyeHIsVixWLDB9LAkvKiBzdHZpLncuZiAqLwotICB7NTIsMTYscnhyLFYsViwwfSwJLyogc3R2aS5sLmYgKi8KLSAgezUyLDEzLHJ4cixTLFYsMH0sCS8qIHN0dmkuYi5mICovCi0gIHs1MiwxNCxyeHIsUyxWLDB9LAkvKiBzdHZpLmguZiAqLwotICB7NTIsMTUscnhyLFMsViwwfSwJLyogc3R2aS53LmYgKi8KLSAgezUyLDE2LHJ4cixTLFYsMH0sCS8qIHN0dmkubC5mICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ2W10gPSB7Ci0gIHswLDAscnhsLFMsQ0lSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixDSVIsUywwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVE9DLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLENQVUlELFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLFRUUiwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVFRSLFMsMH0sCS8qIG1vdiAqLwotICB7MTE4LDAsbm9wcywwLDAsMH0sCS8qIGN0cnNsICovCi0gIHsxMTksMCxub3BzLDAsMCwwfSwJLyogY3Ryc2cgKi8KLSAgezAsMCxyeGwsUyxWTVUsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZNVSxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxWTUwsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZNTCxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxJQ1IsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLElDUixTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxUQ1BVLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixUQ1BVLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTIwLDAsbm9wcywwLDAsMH0sCS8qIHN0b3AgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCxyeGwsUyxUSUQsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFRJRCxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDdbXSA9IHsKLSAgezg0LDEzLHIsViwwLDB9LAkvKiBzdW0uYi5mICovCi0gIHs4NCwxNCxyLFYsMCwwfSwJLyogc3VtLmguZiAqLwotICB7ODQsMTUscixWLDAsMH0sCS8qIHN1bS53LmYgKi8KLSAgezg0LDE2LHIsViwwLDB9LAkvKiBzdW0ubC5mICovCi0gIHs4NSwyLHIsViwwLDB9LAkvKiBhbGwuZiAqLwotICB7ODYsMixyLFYsMCwwfSwJLyogYW55LmYgKi8KLSAgezg3LDIscixWLDAsMH0sCS8qIHBhcml0eS5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4OCwxMyxyLFYsMCwwfSwJLyogbWF4LmIuZiAqLwotICB7ODgsMTQscixWLDAsMH0sCS8qIG1heC5oLmYgKi8KLSAgezg4LDE1LHIsViwwLDB9LAkvKiBtYXgudy5mICovCi0gIHs4OCwxNixyLFYsMCwwfSwJLyogbWF4LmwuZiAqLwotICB7ODksMTMscixWLDAsMH0sCS8qIG1pbi5iLmYgKi8KLSAgezg5LDE0LHIsViwwLDB9LAkvKiBtaW4uaC5mICovCi0gIHs4OSwxNSxyLFYsMCwwfSwJLyogbWluLncuZiAqLwotICB7ODksMTYscixWLDAsMH0sCS8qIG1pbi5sLmYgKi8KLSAgezg0LDExLHIsViwwLDB9LAkvKiBzdW0ucy5mICovCi0gIHs4NCwxMixyLFYsMCwwfSwJLyogc3VtLmQuZiAqLwotICB7OTAsMTEscixWLDAsMH0sCS8qIHByb2Qucy5mICovCi0gIHs5MCwxMixyLFYsMCwwfSwJLyogcHJvZC5kLmYgKi8KLSAgezg4LDExLHIsViwwLDB9LAkvKiBtYXgucy5mICovCi0gIHs4OCwxMixyLFYsMCwwfSwJLyogbWF4LmQuZiAqLwotICB7ODksMTEscixWLDAsMH0sCS8qIG1pbi5zLmYgKi8KLSAgezg5LDEyLHIsViwwLDB9LAkvKiBtaW4uZC5mICovCi0gIHs5MCwxMyxyLFYsMCwwfSwJLyogcHJvZC5iLmYgKi8KLSAgezkwLDE0LHIsViwwLDB9LAkvKiBwcm9kLmguZiAqLwotICB7OTAsMTUscixWLDAsMH0sCS8qIHByb2Qudy5mICovCi0gIHs5MCwxNixyLFYsMCwwfSwJLyogcHJvZC5sLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDBbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezEwLDE4LHJycixTLFYsVn0sCS8qIHN1Yi5zLnQgKi8KLSAgezEwLDE5LHJycixTLFYsVn0sCS8qIHN1Yi5kLnQgKi8KLSAgezQsMTgscnJyLFMsVixWfSwJLyogZGl2LnMudCAqLwotICB7NCwxOSxycnIsUyxWLFZ9LAkvKiBkaXYuZC50ICovCi0gIHszLDE4LHJycixWLFYsVn0sCS8qIG11bC5zLnQgKi8KLSAgezMsMTkscnJyLFYsVixWfSwJLyogbXVsLmQudCAqLwotICB7NCwxOCxycnIsVixWLFZ9LAkvKiBkaXYucy50ICovCi0gIHs0LDE5LHJycixWLFYsVn0sCS8qIGRpdi5kLnQgKi8KLSAgezMsMTgscnJyLFYsUyxWfSwJLyogbXVsLnMudCAqLwotICB7MywxOSxycnIsVixTLFZ9LAkvKiBtdWwuZC50ICovCi0gIHs0LDE4LHJycixWLFMsVn0sCS8qIGRpdi5zLnQgKi8KLSAgezQsMTkscnJyLFYsUyxWfSwJLyogZGl2LmQudCAqLwotICB7NSwxLHJycixWLFYsVn0sCS8qIGFuZC50ICovCi0gIHs2LDEscnJyLFYsVixWfSwJLyogb3IudCAqLwotICB7NywxLHJycixWLFYsVn0sCS8qIHhvci50ICovCi0gIHs4LDEscnJyLFYsVixWfSwJLyogc2hmLnQgKi8KLSAgezUsMSxycnIsVixTLFZ9LAkvKiBhbmQudCAqLwotICB7NiwxLHJycixWLFMsVn0sCS8qIG9yLnQgKi8KLSAgezcsMSxycnIsVixTLFZ9LAkvKiB4b3IudCAqLwotICB7OCwxLHJycixWLFMsVn0sCS8qIHNoZi50ICovCi0gIHs5LDE4LHJycixWLFYsVn0sCS8qIGFkZC5zLnQgKi8KLSAgezksMTkscnJyLFYsVixWfSwJLyogYWRkLmQudCAqLwotICB7MTAsMTgscnJyLFYsVixWfSwJLyogc3ViLnMudCAqLwotICB7MTAsMTkscnJyLFYsVixWfSwJLyogc3ViLmQudCAqLwotICB7OSwxOCxycnIsVixTLFZ9LAkvKiBhZGQucy50ICovCi0gIHs5LDE5LHJycixWLFMsVn0sCS8qIGFkZC5kLnQgKi8KLSAgezEwLDE4LHJycixWLFMsVn0sCS8qIHN1Yi5zLnQgKi8KLSAgezEwLDE5LHJycixWLFMsVn0sCS8qIHN1Yi5kLnQgKi8KLSAgezksMjAscnJyLFYsVixWfSwJLyogYWRkLmIudCAqLwotICB7OSwyMSxycnIsVixWLFZ9LAkvKiBhZGQuaC50ICovCi0gIHs5LDIyLHJycixWLFYsVn0sCS8qIGFkZC53LnQgKi8KLSAgezksMjMscnJyLFYsVixWfSwJLyogYWRkLmwudCAqLwotICB7OSwyMCxycnIsVixTLFZ9LAkvKiBhZGQuYi50ICovCi0gIHs5LDIxLHJycixWLFMsVn0sCS8qIGFkZC5oLnQgKi8KLSAgezksMjIscnJyLFYsUyxWfSwJLyogYWRkLncudCAqLwotICB7OSwyMyxycnIsVixTLFZ9LAkvKiBhZGQubC50ICovCi0gIHsxMCwyMCxycnIsVixWLFZ9LAkvKiBzdWIuYi50ICovCi0gIHsxMCwyMSxycnIsVixWLFZ9LAkvKiBzdWIuaC50ICovCi0gIHsxMCwyMixycnIsVixWLFZ9LAkvKiBzdWIudy50ICovCi0gIHsxMCwyMyxycnIsVixWLFZ9LAkvKiBzdWIubC50ICovCi0gIHsxMCwyMCxycnIsVixTLFZ9LAkvKiBzdWIuYi50ICovCi0gIHsxMCwyMSxycnIsVixTLFZ9LAkvKiBzdWIuaC50ICovCi0gIHsxMCwyMixycnIsVixTLFZ9LAkvKiBzdWIudy50ICovCi0gIHsxMCwyMyxycnIsVixTLFZ9LAkvKiBzdWIubC50ICovCi0gIHszLDIwLHJycixWLFYsVn0sCS8qIG11bC5iLnQgKi8KLSAgezMsMjEscnJyLFYsVixWfSwJLyogbXVsLmgudCAqLwotICB7MywyMixycnIsVixWLFZ9LAkvKiBtdWwudy50ICovCi0gIHszLDIzLHJycixWLFYsVn0sCS8qIG11bC5sLnQgKi8KLSAgezMsMjAscnJyLFYsUyxWfSwJLyogbXVsLmIudCAqLwotICB7MywyMSxycnIsVixTLFZ9LAkvKiBtdWwuaC50ICovCi0gIHszLDIyLHJycixWLFMsVn0sCS8qIG11bC53LnQgKi8KLSAgezMsMjMscnJyLFYsUyxWfSwJLyogbXVsLmwudCAqLwotICB7NCwyMCxycnIsVixWLFZ9LAkvKiBkaXYuYi50ICovCi0gIHs0LDIxLHJycixWLFYsVn0sCS8qIGRpdi5oLnQgKi8KLSAgezQsMjIscnJyLFYsVixWfSwJLyogZGl2LncudCAqLwotICB7NCwyMyxycnIsVixWLFZ9LAkvKiBkaXYubC50ICovCi0gIHs0LDIwLHJycixWLFMsVn0sCS8qIGRpdi5iLnQgKi8KLSAgezQsMjEscnJyLFYsUyxWfSwJLyogZGl2LmgudCAqLwotICB7NCwyMixycnIsVixTLFZ9LAkvKiBkaXYudy50ICovCi0gIHs0LDIzLHJycixWLFMsVn0sCS8qIGRpdi5sLnQgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDFbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezI2LDIwLGEycixTLDAsMH0sCS8qIHN0ZS5iLnQgKi8KLSAgezI2LDIxLGEycixTLDAsMH0sCS8qIHN0ZS5oLnQgKi8KLSAgezI2LDIyLGEycixTLDAsMH0sCS8qIHN0ZS53LnQgKi8KLSAgezI2LDIzLGEycixTLDAsMH0sCS8qIHN0ZS5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezE4LDIwLGExcixWLDAsMH0sCS8qIGxkLmIudCAqLwotICB7MTgsMjEsYTFyLFYsMCwwfSwJLyogbGQuaC50ICovCi0gIHsxOCwyMixhMXIsViwwLDB9LAkvKiBsZC53LnQgKi8KLSAgezE4LDIzLGExcixWLDAsMH0sCS8qIGxkLmwudCAqLwotICB7MjEsMjAsYTJyLFYsMCwwfSwJLyogc3QuYi50ICovCi0gIHsyMSwyMSxhMnIsViwwLDB9LAkvKiBzdC5oLnQgKi8KLSAgezIxLDIyLGEycixWLDAsMH0sCS8qIHN0LncudCAqLwotICB7MjEsMjMsYTJyLFYsMCwwfSwJLyogc3QubC50ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQyW10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyOCwyMCxycixWLFYsMH0sCS8qIGN2dHcuYi50ICovCi0gIHsyOCwyMSxycixWLFYsMH0sCS8qIGN2dHcuaC50ICovCi0gIHsyOSwyMixycixWLFYsMH0sCS8qIGN2dGIudy50ICovCi0gIHszMCwyMixycixWLFYsMH0sCS8qIGN2dGgudy50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszMSwyMyxycixWLFYsMH0sCS8qIGN2dHMubC50ICovCi0gIHszMiwyMixycixWLFYsMH0sCS8qIGN2dGQudy50ICovCi0gIHszMywxOCxycixWLFYsMH0sCS8qIGN2dGwucy50ICovCi0gIHsyOCwxOSxycixWLFYsMH0sCS8qIGN2dHcuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMTgscnIsVixWLDB9LAkvKiBmcmludC5zLnQgKi8KLSAgezExNiwxOSxycixWLFYsMH0sCS8qIGZyaW50LmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7ODEsMTgscnIsVixWLDB9LAkvKiBzcXJ0LnMudCAqLwotICB7ODEsMTkscnIsVixWLDB9LAkvKiBzcXJ0LmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0M1tdID0gewotICB7MzIsMTgscnIsVixWLDB9LAkvKiBjdnRkLnMudCAqLwotICB7MzEsMTkscnIsVixWLDB9LAkvKiBjdnRzLmQudCAqLwotICB7MzMsMTkscnIsVixWLDB9LAkvKiBjdnRsLmQudCAqLwotICB7MzIsMjMscnIsVixWLDB9LAkvKiBjdnRkLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzYsMSxycixWLFYsMH0sCS8qIHR6Yy50ICovCi0gIHs0NCwxLHJyLFYsViwwfSwJLyogbG9wLnQgKi8KLSAgezExNywxLHJyLFYsViwwfSwJLyogeHBuZC50ICovCi0gIHs0MiwxLHJyLFYsViwwfSwJLyogbm90LnQgKi8KLSAgezgsMSxycixTLFYsMH0sCS8qIHNoZi50ICovCi0gIHszNSwyNCxycixWLFYsMH0sCS8qIHBsYy50LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezM3LDE4LHJyLFYsViwwfSwJLyogZXEucy50ICovCi0gIHszNywxOSxycixWLFYsMH0sCS8qIGVxLmQudCAqLwotICB7NDMsMTgscnIsVixWLDB9LAkvKiBuZWcucy50ICovCi0gIHs0MywxOSxycixWLFYsMH0sCS8qIG5lZy5kLnQgKi8KLSAgezM3LDE4LHJyLFMsViwwfSwJLyogZXEucy50ICovCi0gIHszNywxOSxycixTLFYsMH0sCS8qIGVxLmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NDAsMTgscnIsVixWLDB9LAkvKiBsZS5zLnQgKi8KLSAgezQwLDE5LHJyLFYsViwwfSwJLyogbGUuZC50ICovCi0gIHs0MSwxOCxycixWLFYsMH0sCS8qIGx0LnMudCAqLwotICB7NDEsMTkscnIsVixWLDB9LAkvKiBsdC5kLnQgKi8KLSAgezQwLDE4LHJyLFMsViwwfSwJLyogbGUucy50ICovCi0gIHs0MCwxOSxycixTLFYsMH0sCS8qIGxlLmQudCAqLwotICB7NDEsMTgscnIsUyxWLDB9LAkvKiBsdC5zLnQgKi8KLSAgezQxLDE5LHJyLFMsViwwfSwJLyogbHQuZC50ICovCi0gIHszNywyMCxycixWLFYsMH0sCS8qIGVxLmIudCAqLwotICB7MzcsMjEscnIsVixWLDB9LAkvKiBlcS5oLnQgKi8KLSAgezM3LDIyLHJyLFYsViwwfSwJLyogZXEudy50ICovCi0gIHszNywyMyxycixWLFYsMH0sCS8qIGVxLmwudCAqLwotICB7MzcsMjAscnIsUyxWLDB9LAkvKiBlcS5iLnQgKi8KLSAgezM3LDIxLHJyLFMsViwwfSwJLyogZXEuaC50ICovCi0gIHszNywyMixycixTLFYsMH0sCS8qIGVxLncudCAqLwotICB7MzcsMjMscnIsUyxWLDB9LAkvKiBlcS5sLnQgKi8KLSAgezQwLDIwLHJyLFYsViwwfSwJLyogbGUuYi50ICovCi0gIHs0MCwyMSxycixWLFYsMH0sCS8qIGxlLmgudCAqLwotICB7NDAsMjIscnIsVixWLDB9LAkvKiBsZS53LnQgKi8KLSAgezQwLDIzLHJyLFYsViwwfSwJLyogbGUubC50ICovCi0gIHs0MCwyMCxycixTLFYsMH0sCS8qIGxlLmIudCAqLwotICB7NDAsMjEscnIsUyxWLDB9LAkvKiBsZS5oLnQgKi8KLSAgezQwLDIyLHJyLFMsViwwfSwJLyogbGUudy50ICovCi0gIHs0MCwyMyxycixTLFYsMH0sCS8qIGxlLmwudCAqLwotICB7NDEsMjAscnIsVixWLDB9LAkvKiBsdC5iLnQgKi8KLSAgezQxLDIxLHJyLFYsViwwfSwJLyogbHQuaC50ICovCi0gIHs0MSwyMixycixWLFYsMH0sCS8qIGx0LncudCAqLwotICB7NDEsMjMscnIsVixWLDB9LAkvKiBsdC5sLnQgKi8KLSAgezQxLDIwLHJyLFMsViwwfSwJLyogbHQuYi50ICovCi0gIHs0MSwyMSxycixTLFYsMH0sCS8qIGx0LmgudCAqLwotICB7NDEsMjIscnIsUyxWLDB9LAkvKiBsdC53LnQgKi8KLSAgezQxLDIzLHJyLFMsViwwfSwJLyogbHQubC50ICovCi0gIHs0MywyMCxycixWLFYsMH0sCS8qIG5lZy5iLnQgKi8KLSAgezQzLDIxLHJyLFYsViwwfSwJLyogbmVnLmgudCAqLwotICB7NDMsMjIscnIsVixWLDB9LAkvKiBuZWcudy50ICovCi0gIHs0MywyMyxycixWLFYsMH0sCS8qIG5lZy5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDRbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDVbXSA9IHsKLSAgezUxLDIwLHJyLFYsViwwfSwJLyogbGR2aS5iLnQgKi8KLSAgezUxLDIxLHJyLFYsViwwfSwJLyogbGR2aS5oLnQgKi8KLSAgezUxLDIyLHJyLFYsViwwfSwJLyogbGR2aS53LnQgKi8KLSAgezUxLDIzLHJyLFYsViwwfSwJLyogbGR2aS5sLnQgKi8KLSAgezI4LDE4LHJyLFYsViwwfSwJLyogY3Z0dy5zLnQgKi8KLSAgezMxLDIyLHJyLFYsViwwfSwJLyogY3Z0cy53LnQgKi8KLSAgezI4LDIzLHJyLFYsViwwfSwJLyogY3Z0dy5sLnQgKi8KLSAgezMzLDIyLHJyLFYsViwwfSwJLyogY3Z0bC53LnQgKi8KLSAgezUyLDIwLHJ4cixWLFYsMH0sCS8qIHN0dmkuYi50ICovCi0gIHs1MiwyMSxyeHIsVixWLDB9LAkvKiBzdHZpLmgudCAqLwotICB7NTIsMjIscnhyLFYsViwwfSwJLyogc3R2aS53LnQgKi8KLSAgezUyLDIzLHJ4cixWLFYsMH0sCS8qIHN0dmkubC50ICovCi0gIHs1MiwyMCxyeHIsUyxWLDB9LAkvKiBzdHZpLmIudCAqLwotICB7NTIsMjEscnhyLFMsViwwfSwJLyogc3R2aS5oLnQgKi8KLSAgezUyLDIyLHJ4cixTLFYsMH0sCS8qIHN0dmkudy50ICovCi0gIHs1MiwyMyxyeHIsUyxWLDB9LAkvKiBzdHZpLmwudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NltdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0N1tdID0gewotICB7ODQsMjAscixWLDAsMH0sCS8qIHN1bS5iLnQgKi8KLSAgezg0LDIxLHIsViwwLDB9LAkvKiBzdW0uaC50ICovCi0gIHs4NCwyMixyLFYsMCwwfSwJLyogc3VtLncudCAqLwotICB7ODQsMjMscixWLDAsMH0sCS8qIHN1bS5sLnQgKi8KLSAgezg1LDEscixWLDAsMH0sCS8qIGFsbC50ICovCi0gIHs4NiwxLHIsViwwLDB9LAkvKiBhbnkudCAqLwotICB7ODcsMSxyLFYsMCwwfSwJLyogcGFyaXR5LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDIwLHIsViwwLDB9LAkvKiBtYXguYi50ICovCi0gIHs4OCwyMSxyLFYsMCwwfSwJLyogbWF4LmgudCAqLwotICB7ODgsMjIscixWLDAsMH0sCS8qIG1heC53LnQgKi8KLSAgezg4LDIzLHIsViwwLDB9LAkvKiBtYXgubC50ICovCi0gIHs4OSwyMCxyLFYsMCwwfSwJLyogbWluLmIudCAqLwotICB7ODksMjEscixWLDAsMH0sCS8qIG1pbi5oLnQgKi8KLSAgezg5LDIyLHIsViwwLDB9LAkvKiBtaW4udy50ICovCi0gIHs4OSwyMyxyLFYsMCwwfSwJLyogbWluLmwudCAqLwotICB7ODQsMTgscixWLDAsMH0sCS8qIHN1bS5zLnQgKi8KLSAgezg0LDE5LHIsViwwLDB9LAkvKiBzdW0uZC50ICovCi0gIHs5MCwxOCxyLFYsMCwwfSwJLyogcHJvZC5zLnQgKi8KLSAgezkwLDE5LHIsViwwLDB9LAkvKiBwcm9kLmQudCAqLwotICB7ODgsMTgscixWLDAsMH0sCS8qIG1heC5zLnQgKi8KLSAgezg4LDE5LHIsViwwLDB9LAkvKiBtYXguZC50ICovCi0gIHs4OSwxOCxyLFYsMCwwfSwJLyogbWluLnMudCAqLwotICB7ODksMTkscixWLDAsMH0sCS8qIG1pbi5kLnQgKi8KLSAgezkwLDIwLHIsViwwLDB9LAkvKiBwcm9kLmIudCAqLwotICB7OTAsMjEscixWLDAsMH0sCS8qIHByb2QuaC50ICovCi0gIHs5MCwyMixyLFYsMCwwfSwJLyogcHJvZC53LnQgKi8KLSAgezkwLDIzLHIsViwwLDB9LAkvKiBwcm9kLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotY2hhciAqbG9wW10gPSB7Ci0gICJtb3YiLAkvKiAwICovCi0gICJtZXJnIiwJLyogMSAqLwotICAibWFzayIsCS8qIDIgKi8KLSAgIm11bCIsCS8qIDMgKi8KLSAgImRpdiIsCS8qIDQgKi8KLSAgImFuZCIsCS8qIDUgKi8KLSAgIm9yIiwJLyogNiAqLwotICAieG9yIiwJLyogNyAqLwotICAic2hmIiwJLyogOCAqLwotICAiYWRkIiwJLyogOSAqLwotICAic3ViIiwJLyogMTAgKi8KLSAgImV4aXQiLAkvKiAxMSAqLwotICAiam1wIiwJLyogMTIgKi8KLSAgImptcGkiLAkvKiAxMyAqLwotICAiam1wYSIsCS8qIDE0ICovCi0gICJqbXBzIiwJLyogMTUgKi8KLSAgInRhYyIsCS8qIDE2ICovCi0gICJsZGVhIiwJLyogMTcgKi8KLSAgImxkIiwJLyogMTggKi8KLSAgInRhcyIsCS8qIDE5ICovCi0gICJwc2hlYSIsCS8qIDIwICovCi0gICJzdCIsCS8qIDIxICovCi0gICJjYWxsIiwJLyogMjIgKi8KLSAgImNhbGxzIiwJLyogMjMgKi8KLSAgImNhbGxxIiwJLyogMjQgKi8KLSAgInBmb3JrIiwJLyogMjUgKi8KLSAgInN0ZSIsCS8qIDI2ICovCi0gICJpbmNyIiwJLyogMjcgKi8KLSAgImN2dHciLAkvKiAyOCAqLwotICAiY3Z0YiIsCS8qIDI5ICovCi0gICJjdnRoIiwJLyogMzAgKi8KLSAgImN2dHMiLAkvKiAzMSAqLwotICAiY3Z0ZCIsCS8qIDMyICovCi0gICJjdnRsIiwJLyogMzMgKi8KLSAgImxkcGEiLAkvKiAzNCAqLwotICAicGxjIiwJLyogMzUgKi8KLSAgInR6YyIsCS8qIDM2ICovCi0gICJlcSIsCS8qIDM3ICovCi0gICJsZXUiLAkvKiAzOCAqLwotICAibHR1IiwJLyogMzkgKi8KLSAgImxlIiwJLyogNDAgKi8KLSAgImx0IiwJLyogNDEgKi8KLSAgIm5vdCIsCS8qIDQyICovCi0gICJuZWciLAkvKiA0MyAqLwotICAibG9wIiwJLyogNDQgKi8KLSAgImNwcnMiLAkvKiA0NSAqLwotICAibm9wIiwJLyogNDYgKi8KLSAgImJyIiwJLyogNDcgKi8KLSAgImJyaSIsCS8qIDQ4ICovCi0gICJicmEiLAkvKiA0OSAqLwotICAiYnJzIiwJLyogNTAgKi8KLSAgImxkdmkiLAkvKiA1MSAqLwotICAic3R2aSIsCS8qIDUyICovCi0gICJsZHNkciIsCS8qIDUzICovCi0gICJsZGtkciIsCS8qIDU0ICovCi0gICJsbiIsCS8qIDU1ICovCi0gICJwYXR1IiwJLyogNTYgKi8KLSAgInBhdGUiLAkvKiA1NyAqLwotICAicGljaCIsCS8qIDU4ICovCi0gICJwbGNoIiwJLyogNTkgKi8KLSAgImlkbGUiLAkvKiA2MCAqLwotICAicnRucSIsCS8qIDYxICovCi0gICJjZm9yayIsCS8qIDYyICovCi0gICJydG4iLAkvKiA2MyAqLwotICAid2ZvcmsiLAkvKiA2NCAqLwotICAiam9pbiIsCS8qIDY1ICovCi0gICJydG5jIiwJLyogNjYgKi8KLSAgImV4cCIsCS8qIDY3ICovCi0gICJzaW4iLAkvKiA2OCAqLwotICAiY29zIiwJLyogNjkgKi8KLSAgInBzaCIsCS8qIDcwICovCi0gICJwb3AiLAkvKiA3MSAqLwotICAiZW5pIiwJLyogNzIgKi8KLSAgImRzaSIsCS8qIDczICovCi0gICJia3B0IiwJLyogNzQgKi8KLSAgIm1zeW5jIiwJLyogNzUgKi8KLSAgIm1za2kiLAkvKiA3NiAqLwotICAieG10aSIsCS8qIDc3ICovCi0gICJ0c3R2diIsCS8qIDc4ICovCi0gICJkaWFnIiwJLyogNzkgKi8KLSAgInBia3B0IiwJLyogODAgKi8KLSAgInNxcnQiLAkvKiA4MSAqLwotICAiY2FzciIsCS8qIDgyICovCi0gICJhdGFuIiwJLyogODMgKi8KLSAgInN1bSIsCS8qIDg0ICovCi0gICJhbGwiLAkvKiA4NSAqLwotICAiYW55IiwJLyogODYgKi8KLSAgInBhcml0eSIsCS8qIDg3ICovCi0gICJtYXgiLAkvKiA4OCAqLwotICAibWluIiwJLyogODkgKi8KLSAgInByb2QiLAkvKiA5MCAqLwotICAiaGFsdCIsCS8qIDkxICovCi0gICJzeXNjIiwJLyogOTIgKi8KLSAgInRyYXAiLAkvKiA5MyAqLwotICAidHN0IiwJLyogOTQgKi8KLSAgImxjayIsCS8qIDk1ICovCi0gICJ1bGsiLAkvKiA5NiAqLwotICAic3Bhd24iLAkvKiA5NyAqLwotICAibGRjbXIiLAkvKiA5OCAqLwotICAic3RjbXIiLAkvKiA5OSAqLwotICAicG9wciIsCS8qIDEwMCAqLwotICAicHNociIsCS8qIDEwMSAqLwotICAicmN2ciIsCS8qIDEwMiAqLwotICAibWF0bSIsCS8qIDEwMyAqLwotICAic25kciIsCS8qIDEwNCAqLwotICAicHV0ciIsCS8qIDEwNSAqLwotICAiZ2V0ciIsCS8qIDEwNiAqLwotICAibWF0ciIsCS8qIDEwNyAqLwotICAibWF0IiwJLyogMTA4ICovCi0gICJnZXQiLAkvKiAxMDkgKi8KLSAgInJjdiIsCS8qIDExMCAqLwotICAiaW5jIiwJLyogMTExICovCi0gICJwdXQiLAkvKiAxMTIgKi8KLSAgInNuZCIsCS8qIDExMyAqLwotICAiZW5hbCIsCS8qIDExNCAqLwotICAiZW5hZyIsCS8qIDExNSAqLwotICAiZnJpbnQiLAkvKiAxMTYgKi8KLSAgInhwbmQiLAkvKiAxMTcgKi8KLSAgImN0cnNsIiwJLyogMTE4ICovCi0gICJjdHJzZyIsCS8qIDExOSAqLwotICAic3RvcCIsCS8qIDEyMCAqLwotfTsKLQotY2hhciAqcm9wW10gPSB7Ci0gICIiLAkvKiAwICovCi0gICIudCIsCS8qIDEgKi8KLSAgIi5mIiwJLyogMiAqLwotICAiLnMiLAkvKiAzICovCi0gICIuZCIsCS8qIDQgKi8KLSAgIi5iIiwJLyogNSAqLwotICAiLmgiLAkvKiA2ICovCi0gICIudyIsCS8qIDcgKi8KLSAgIi5sIiwJLyogOCAqLwotICAiLngiLAkvKiA5ICovCi0gICIudSIsCS8qIDEwICovCi0gICIucy5mIiwJLyogMTEgKi8KLSAgIi5kLmYiLAkvKiAxMiAqLwotICAiLmIuZiIsCS8qIDEzICovCi0gICIuaC5mIiwJLyogMTQgKi8KLSAgIi53LmYiLAkvKiAxNSAqLwotICAiLmwuZiIsCS8qIDE2ICovCi0gICIudC5mIiwJLyogMTcgKi8KLSAgIi5zLnQiLAkvKiAxOCAqLwotICAiLmQudCIsCS8qIDE5ICovCi0gICIuYi50IiwJLyogMjAgKi8KLSAgIi5oLnQiLAkvKiAyMSAqLwotICAiLncudCIsCS8qIDIyICovCi0gICIubC50IiwJLyogMjMgKi8KLSAgIi50LnQiLAkvKiAyNCAqLwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaCBiL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2ZDMyZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyogZDEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciBEMTBWIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEQxMFZfSAotI2RlZmluZSBEMTBWX0gKLQotLyogRm9ybWF0IFNwZWNpZmllciAqLwotI2RlZmluZSBGTTAwCTAKLSNkZWZpbmUgRk0wMQkweDQwMDAwMDAwCi0jZGVmaW5lIEZNMTAJMHg4MDAwMDAwMAotI2RlZmluZSBGTTExCTB4QzAwMDAwMDAKLQotI2RlZmluZSBOT1AgMHg1ZTAwCi0jZGVmaW5lIE9QQ09ERV9ESVZTCTB4MTQwMDI4MDAKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDEwdl9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgZDEwdl9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiB0aGUgb3Bjb2RlIGZvcm1hdCAqLwotICBpbnQgZm9ybWF0OwotCi0gIC8qIFRoZXNlIG51bWJlcnMgd2VyZSBwaWNrZWQgc28gd2UgY2FuIGRvIGlmKCBpICYgU0hPUlRfT1BDT0RFKSAqLwotI2RlZmluZSBTSE9SVF9PUENPREUgMQotI2RlZmluZSBMT05HX09QQ09ERSAgOAotI2RlZmluZSBTSE9SVF8yCSAgICAgMQkJLyogc2hvcnQgd2l0aCAyIG9wZXJhbmRzICovCi0jZGVmaW5lIFNIT1JUX0IJICAgICAzCQkvKiBzaG9ydCB3aXRoIDgtYml0IGJyYW5jaCAqLwotI2RlZmluZSBMT05HX0IJICAgICA4CQkvKiBsb25nIHdpdGggMTYtYml0IGJyYW5jaCAqLwotI2RlZmluZSBMT05HX0wgICAgICAgMTAJCS8qIGxvbmcgd2l0aCAzIG9wZXJhbmRzICovCi0jZGVmaW5lIExPTkdfUiAgICAgICAxMgkJLyogcmVzZXJ2ZWQgKi8KLQotICAvKiBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHZhcmlhYmxlLWxlbmd0aCBpbnN0cnVjdGlvbnMgKi8KLSAgLyogZm9yIGV4YW1wbGUsICJicmEiIHdpbGwgYmUgYSBmYWtlIGZvciAiYnJhLnMiIGFuZCBicmEubCIgKi8KLSAgLyogd2hpY2ggd2lsbCBpbW1lZGlhdGVseSBmb2xsb3cgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0jZGVmaW5lIE9QQ09ERV9GQUtFICAzMgotCi0gIC8qIHRoZSBudW1iZXIgb2YgY3ljbGVzICovCi0gIGludCBjeWNsZXM7Ci0KLSAgLyogdGhlIGV4ZWN1dGlvbiB1bml0KHMpIHVzZWQgKi8KLSAgaW50IHVuaXQ7Ci0jZGVmaW5lIEVJVEhFUgkwCi0jZGVmaW5lIElVCTEKLSNkZWZpbmUgTVUJMgotI2RlZmluZSBCT1RICTMKLQotICAvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwgb3Igc2VxdWVudGlhbCAqLwotICAvKiB0aGlzIGZpZWxkIGlzIHVzZWQgdG8gZGVjaWRlIGlmIHR3byBpbnN0cnVjdGlvbnMgKi8KLSAgLyogY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsICovCi0gIGludCBleGVjX3R5cGU7Ci0jZGVmaW5lIFBBUk9OTFkgMQkvKiBwYXJhbGxlbCBvbmx5ICovCi0jZGVmaW5lIFNFUQkyCS8qIG11c3QgYmUgc2VxdWVudGlhbCAqLwotI2RlZmluZSBQQVIJNAkvKiBtYXkgYmUgcGFyYWxsZWwgKi8KLSNkZWZpbmUgQlJBTkNIX0xJTksgOAkvKiBzdWJyb3V0aW5lIGNhbGwuICBtdXN0IGJlIGFsaWduZWQgKi8KLSNkZWZpbmUgUk1FTSAgICAgMTYJLyogcmVhZHMgbWVtb3J5ICovCi0jZGVmaW5lIFdNRU0gICAgIDMyCS8qIHdyaXRlcyBtZW1vcnkgKi8KLSNkZWZpbmUgUkYwICAgICAgNjQJLyogcmVhZHMgZjAgKi8KLSNkZWZpbmUgV0YwICAgICAxMjgJLyogbW9kaWZpZXMgZjAgKi8KLSNkZWZpbmUgV0NBUiAgICAyNTYJLyogd3JpdGUgQ2FycnkgKi8KLSNkZWZpbmUgQlJBTkNIICA1MTIJLyogYnJhbmNoLCBubyBsaW5rICovCi0KLSAgLyogdGhlIG9wY29kZSAqLwotICBsb25nIG9wY29kZTsKLQotICAvKiBtYXNrLiAgaWYoIChpICYgbWFzaykgPT0gb3Bjb2RlICkgdGhlbiBtYXRjaCAqLwotICBsb25nIG1hc2s7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s2XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDEwdl9vcGNvZGUgZDEwdl9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGQxMHZfbnVtX29wY29kZXM7Ci0KLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDEwdl9vcGVyYW5kLiAgKi8KLXN0cnVjdCBkMTB2X29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBkMTB2X29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGQxMHZfb3BlcmFuZCBkMTB2X29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgZDEwdl9vcGVyYW5kLiAgKi8KLQotLyogdGhlIG9wZXJhbmQgbXVzdCBiZSBhbiBldmVuIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX0VWRU4JKDEpCi0KLS8qIHRoZSBvcGVyYW5kIG11c3QgYmUgYW4gb2RkIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX09ERAkoMikJCi0KLS8qIHRoaXMgaXMgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyOyBpdCB3aWxsIGJlIG1vZGlmaWVkICovCi0vKiB0aGlzIGlzIHVzZWQgYnkgdGhlIG9wdGltaXplciAqLwotI2RlZmluZSBPUEVSQU5EX0RFU1QJKDQpCi0KLS8qIG51bWJlciBvciBzeW1ib2wgKi8KLSNkZWZpbmUgT1BFUkFORF9OVU0JKDgpCi0KLS8qIGFkZHJlc3Mgb3IgbGFiZWwgKi8KLSNkZWZpbmUgT1BFUkFORF9BRERSCSgweDEwKQotCi0vKiByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX1JFRwkoMHgyMCkKLQotLyogcG9zdGluY3JlbWVudCArICAqLwotI2RlZmluZSBPUEVSQU5EX1BMVVMJKDB4NDApCi0KLS8qIHBvc3RkZWNyZW1lbnQgLSAgKi8KLSNkZWZpbmUgT1BFUkFORF9NSU5VUwkoMHg4MCkKLQotLyogQCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFNJR04JKDB4MTAwKQotCi0vKiBAKCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFBBUgkoMHgyMDApCi0KLS8qIGFjY3VtdWxhdG9yIDAgKi8KLSNkZWZpbmUgT1BFUkFORF9BQ0MwCSgweDQwMCkKLQotLyogYWNjdW11bGF0b3IgMSAqLwotI2RlZmluZSBPUEVSQU5EX0FDQzEJKDB4ODAwKQotCi0vKiBmMCAvIGYxIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9GRkxBRwkoMHgxMDAwKQotCi0vKiBjIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9DRkxBRwkoMHgyMDAwKQotCi0vKiBjb250cm9sIHJlZ2lzdGVyICAqLwotI2RlZmluZSBPUEVSQU5EX0NPTlRST0wJKDB4NDAwMCkKLQotLyogcHJlZGVjcmVtZW50IG1vZGUgJ0Atc3AnICAqLwotI2RlZmluZSBPUEVSQU5EX0FUTUlOVVMJKDB4ODAwMCkKLQotLyogc2lnbmVkIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX1NJR05FRAkoMHgxMDAwMCkKLQotLyogc3BlY2lhbCBhY2N1bXVsYXRvciBzaGlmdHMgbmVlZCBhIDQtYml0IG51bWJlciAqLwotLyogMSA8PSB4IDw9IDE2ICovCi0jZGVmaW5lIE9QRVJBTkRfU0hJRlQJKDB4MjAwMDApCi0KLS8qIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0dQUgkoMHg0MDAwMCkKLQotLyogc3BlY2lhbCBpbW0zIHZhbHVlcyB3aXRoIHJhbmdlIHJlc3RyaWN0ZWQgdG8gLTIgPD0gaW1tMyA8PSAzICovCi0vKiBuZWVkZWQgZm9yIHJhYy9yYWNoaSAqLwotI2RlZmluZSBSRVNUUklDVEVEX05VTTMJKDB4ODAwMDApCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCBwZF9yZWcKLXsKLSAgY2hhciAqbmFtZTsJCS8qIG5hbWUgdG8gcmVjb2duaXplICovCi0gIGNoYXIgKnBuYW1lOwkJLyogbmFtZSB0byBwcmludCBmb3IgdGhpcyByZWdpc3RlciAqLwotICBpbnQgdmFsdWU7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBkX3JlZyBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW107Ci1pbnQgZDEwdl9yZWdfbmFtZV9jbnQoKTsKLQotLyogYW4gZXhwcmVzc2lvblMgb25seSBoYXMgb25lIHJlZ2lzdGVyIHR5cGUsIHNvIHdlIGZha2UgaXQgKi8KLS8qIGJ5IHNldHRpbmcgaGlnaCBiaXRzIHRvIGluZGljYXRlIHR5cGUgKi8KLSNkZWZpbmUgUkVHSVNURVJfTUFTSwkweEZGCi0KLSNlbmRpZiAvKiBEMTBWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2QzMHYuaCBiL2luY2x1ZGUvb3Bjb2RlL2QzMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwYjdhNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9kMzB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyogZDMwdi5oIC0tIEhlYWRlciBmaWxlIGZvciBEMzBWIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKSwgQ3lnbnVzIFNvbHV0aW9ucwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEQzMFZfSAotI2RlZmluZSBEMzBWX0gKLQotI2RlZmluZSBOT1AgMHgwMEYwMDAwMAotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcGRfcmVnCi17Ci0gIGNoYXIgKm5hbWU7CQkvKiBuYW1lIHRvIHJlY29nbml6ZSAqLwotICBjaGFyICpwbmFtZTsJCS8qIG5hbWUgdG8gcHJpbnQgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW107Ci1pbnQgcmVnX25hbWVfY250KCk7Ci0KLS8qIHRoZSBudW1iZXIgb2YgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTUFYX0NPTlRST0xfUkVHCTY0Ci0KLS8qIGRlZmluZSB0aGUgZm9ybWF0IHNwZWNpZmllcnMgKi8KLSNkZWZpbmUgRk0wMAkwCi0jZGVmaW5lIEZNMDEJMHg4MDAwMDAwMAotI2RlZmluZSBGTTEwCTB4ODAwMDAwMDAwMDAwMDAwMExMCi0jZGVmaW5lIEZNMTEJMHg4MDAwMDAwMDgwMDAwMDAwTEwKLQotLyogZGVmaW5lIHRoZSBvcGNvZGUgY2xhc3NlcyAqLwotI2RlZmluZSBCUkEJMAotI2RlZmluZSBMT0dJQwkxCi0jZGVmaW5lIElNRU0JMgotI2RlZmluZSBJQUxVMQk0Ci0jZGVmaW5lIElBTFUyCTUKLQotLyogZGVmaW5lIHRoZSBleGVjdXRpb24gY29uZGl0aW9uIGNvZGVzICovCi0jZGVmaW5lIEVDQ19BTAkwCS8qIEFMd2F5cyAoZGVmYXVsdCkgKi8KLSNkZWZpbmUgRUNDX1RYCTEJLyogRjA9VHJ1ZSwgRjE9RG9uJ3QgY2FyZSAqLwotI2RlZmluZSBFQ0NfRlgJMgkvKiBGMD1GYWxzZSwgRjE9RG9uJ3QgY2FyZSAqLwotI2RlZmluZSBFQ0NfWFQJMwkvKiBGMD1Eb24ndCBjYXJlLCBGMT1UcnVlICovCi0jZGVmaW5lIEVDQ19YRgk0CS8qIEYwPURvbid0IGNhcmUsIEYxPUZhbHNlICovCi0jZGVmaW5lIEVDQ19UVAk1CS8qIEYwPVRydWUsIEYxPVRydWUgKi8KLSNkZWZpbmUgRUNDX1RGCTYJLyogRjA9VHJ1ZSwgRjE9RmFsc2UgKi8KLSNkZWZpbmUgRUNDX1JFU0VSVkVECTcJLyogcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgRUNDX01BWAlFQ0NfUkVTRVJWRUQKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmQzMHZfZWNjX25hbWVzW107Ci0KLS8qIGNvbmRpdGlvbiBjb2RlIHRhYmxlIGZvciBDTVAgYW5kIENNUFUgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkMzB2X2NjX25hbWVzW107Ci0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfb3Bjb2RlLiAgKi8KLXN0cnVjdCBkMzB2X29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIHRoZSBvcGNvZGUgKi8KLSAgaW50IG9wMTsJLyogZmlyc3QgcGFydCwgIklBTFUxIiBmb3IgZXhhbXBsZSAqLwotICBpbnQgb3AyOwkvKiB0aGUgcmVzdCBvZiB0aGUgb3Bjb2RlICovCi0KLSAgLyogb3Bjb2RlIGZvcm1hdChzKS4gIFRoZXNlIG51bWJlcnMgY29ycmVzcG9uZCB0byBlbnRyaWVzICovCi0gIC8qIGluIHRoZSBkMzB2X2Zvcm1hdF90YWJsZSAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdFs0XTsKLQotI2RlZmluZSBTSE9SVF9NCQkxCi0jZGVmaW5lIFNIT1JUX00yCTUJLyogZm9yIGxkMncgYW5kIHN0MncgKi8KLSNkZWZpbmUgU0hPUlRfQQkJOQotI2RlZmluZSBTSE9SVF9CMQkxMQotI2RlZmluZSBTSE9SVF9CMgkxMgotI2RlZmluZSBTSE9SVF9CMnIgICAgIDEzCi0jZGVmaW5lIFNIT1JUX0IzICAgICAgMTQKLSNkZWZpbmUgU0hPUlRfQjNyICAgICAxNgotI2RlZmluZSBTSE9SVF9CM2IgICAgIDE4Ci0jZGVmaW5lIFNIT1JUX0IzYnIgICAgMjAKLSNkZWZpbmUgU0hPUlRfRDFyICAgICAyMgotI2RlZmluZSBTSE9SVF9EMiAgICAgIDI0Ci0jZGVmaW5lIFNIT1JUX0QyciAgICAgMjYKLSNkZWZpbmUgU0hPUlRfRDJCciAgICAyOAotI2RlZmluZSBTSE9SVF9VICAgICAgIDMwICAgICAgLyogdW5hcnkgU0hPUlRfQS4gIEFCUyBmb3IgZXhhbXBsZSAqLwotI2RlZmluZSBTSE9SVF9GICAgICAgIDMxICAgICAgLyogU0hPUlRfQSB3aXRoIGZsYWcgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFNIT1JUX0FGICAgICAgMzMgICAgICAvKiBTSE9SVF9BIHdpdGggb25seSB0aGUgZmlyc3QgcmVnaXN0ZXIgYSBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNIT1JUX1QgICAgICAgMzUgICAgICAvKiBmb3IgdHJhcCBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBTSE9SVF9BNSAgICAgIDM2ICAgICAgLyogU0hPUlRfQSB3aXRoIGEgNS1iaXQgaW1tZWRpYXRlIGluc3RlYWQgb2YgNiAqLwotI2RlZmluZSBTSE9SVF9DTVAgICAgIDM4ICAgICAgLyogc3BlY2lhbCBmb3JtIGZvciBDTVBjYyAqLwotI2RlZmluZSBTSE9SVF9DTVBVICAgIDQwICAgICAgLyogc3BlY2lhbCBmb3JtIGZvciBDTVBVY2MgKi8KLSNkZWZpbmUgU0hPUlRfQTEgICAgICA0MiAgICAgIC8qIHNwZWNpYWwgZm9ybSBvZiBTSE9SVF9BIGZvciBNQUNhIG9wY29kZXMgd2hlcmUgYT0xICovCi0jZGVmaW5lIFNIT1JUX0FBICAgICAgNDQgICAgICAvKiBTSE9SVF9BIHdpdGggdGhlIGZpcnN0IHJlZ2lzdGVyIGFuIGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIFNIT1JUX1JBICAgICAgNDYgICAgICAvKiBTSE9SVF9BIHdpdGggdGhlIHNlY29uZCByZWdpc3RlciBhbiBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBTSE9SVF9NT0RJTkMgIDQ4ICAgICAgCi0jZGVmaW5lIFNIT1JUX01PRERFQyAgNDkKLSNkZWZpbmUgU0hPUlRfQzEgICAgICA1MAotI2RlZmluZSBTSE9SVF9DMiAgICAgIDUxCi0jZGVmaW5lIFNIT1JUX1VGICAgICAgNTIKLSNkZWZpbmUgU0hPUlRfQTIgICAgICA1MwotI2RlZmluZSBTSE9SVF9OT05FICAgIDU1ICAgICAgLyogbm8gb3BlcmFuZHMgKi8KLSNkZWZpbmUgU0hPUlRfQVIgICAgICA1NiAgICAgIC8qIGxpa2UgU0hPUlRfQUEgYnV0IG9ubHkgYWNjZXB0IHJlZ2lzdGVyIGFzIHRoaXJkIHBhcmFtZXRlciAgKi8KLSNkZWZpbmUgTE9ORyAgICAgICAgICA1NwotI2RlZmluZSBMT05HX1UgICAgICAgIDU4ICAgICAgLyogdW5hcnkgTE9ORyAqLwotI2RlZmluZSBMT05HX1VyICAgICAgIDU5ICAgICAgLyogTE9ORyBwYy1yZWxhdGl2ZSAqLwotI2RlZmluZSBMT05HX0NNUCAgICAgIDYwICAgICAgLyogc3BlY2lhbCBmb3JtIGZvciBDTVBjYyBhbmQgQ01QVWNjICovCi0jZGVmaW5lIExPTkdfTSAgICAgICAgNjEgICAgICAvKiBNZW1vcnkgbG9uZyBmb3IgbGRiLCBzdGIgKi8KLSNkZWZpbmUgTE9OR19NMiAgICAgICA2MiAgICAgIC8qIE1lbW9yeSBsb25nIGZvciBsZDJ3LCBzdDJ3ICovCi0jZGVmaW5lIExPTkdfMiAgICAgICAgNjMgICAgICAvKiBMT05HIHdpdGggMiBvcGVyYW5kczsgam1wdG56ICovCi0jZGVmaW5lIExPTkdfMnIgICAgICAgNjQgICAgICAvKiBMT05HIHdpdGggMiBvcGVyYW5kczsgYnJhdG56ICovCi0jZGVmaW5lIExPTkdfMmIgICAgICAgNjUgICAgICAvKiBMT05HXzIgd2l0aCBtb2RpZmllciBvZiAzICovCi0jZGVmaW5lIExPTkdfMmJyICAgICAgNjYgICAgICAvKiBMT05HXzJyIHdpdGggbW9kaWZpZXIgb2YgMyAqLwotI2RlZmluZSBMT05HX0QgICAgICAgIDY3ICAgICAgLyogZm9yIERKTVBJICovCi0jZGVmaW5lIExPTkdfRHIgICAgICAgNjggICAgICAvKiBmb3IgREJSQUkgKi8KLSNkZWZpbmUgTE9OR19EYnIgICAgICA2OSAgICAgIC8qIGZvciByZXBlYXRpICovCi0KLSAgLyogdGhlIGV4ZWN1dGlvbiB1bml0KHMpIHVzZWQgKi8KLSAgaW50IHVuaXQ7Ci0jZGVmaW5lIEVJVEhFUgkwCi0jZGVmaW5lIElVCTEKLSNkZWZpbmUgTVUJMgotI2RlZmluZSBFSVRIRVJfQlVUX1BSRUZFUl9NVSAzCi0KLSAgLyogdGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRlY2lkZSBpZiB0d28gaW5zdHJ1Y3Rpb25zICovCi0gIC8qIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCAqLwotICBsb25nIGZsYWdzX3VzZWQ7Ci0gIGxvbmcgZmxhZ3Nfc2V0OwotI2RlZmluZSBGTEFHXzAJCSgxTDw8MCkKLSNkZWZpbmUgRkxBR18xCQkoMUw8PDEpCi0jZGVmaW5lIEZMQUdfMgkJKDFMPDwyKQotI2RlZmluZSBGTEFHXzMJCSgxTDw8MykKLSNkZWZpbmUgRkxBR180CQkoMUw8PDQpCQkvKiBTIChzYXR1cmF0aW9uKSAqLwotI2RlZmluZSBGTEFHXzUJCSgxTDw8NSkJCS8qIFYgKG92ZXJmbG93KSAqLwotI2RlZmluZSBGTEFHXzYJCSgxTDw8NikJCS8qIFZBIChhY2N1bXVsYXRlZCBvdmVyZmxvdykgKi8KLSNkZWZpbmUgRkxBR183CQkoMUw8PDcpCQkvKiBDIChjYXJyeS9ib3Jyb3cpICovCi0jZGVmaW5lIEZMQUdfU00JCSgxTDw8OCkJCS8qIFNNIChzdGFjayBtb2RlKSAqLwotI2RlZmluZSBGTEFHX1JQCQkoMUw8PDkpCQkvKiBSUCAocmVwZWF0IGVuYWJsZSkgKi8KLSNkZWZpbmUgRkxBR19DT05UUk9MCSgxTDw8MTApCS8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEZMQUdfQTAJCSgxTDw8MTEpCS8qIEEwICovCi0jZGVmaW5lIEZMQUdfQTEJCSgxTDw8MTIpCS8qIEExICovCi0jZGVmaW5lIEZMQUdfSk1QCSgxTDw8MTMpCS8qIGluc3RydWN0aW9uIGlzIGEgYnJhbmNoICovCi0jZGVmaW5lIEZMQUdfSlNSCSgxTDw8MTQpCS8qIHN1YnJvdXRpbmUgY2FsbC4gIG11c3QgYmUgYWxpZ25lZCAqLwotI2RlZmluZSBGTEFHX01FTQkoMUw8PDE1KQkvKiByZWFkcy93cml0ZXMgbWVtb3J5ICovCi0jZGVmaW5lIEZMQUdfTk9UX1dJVEhfQUREU1VCcHBwCSAoMUw8PDE2KSAvKiBPbGQgbWVhbmluZzogYSAyIHdvcmQgNCBieXRlciBvcGVyYXRpb24KLQkJCQkJICAgTmV3IG1lYW5pbmc6IG9wZXJhdGlvbiBjYW5ub3QgYmUgCi0JCQkJCSAgIGNvbWJpbmVkIGluIHBhcmFsbGVsIHdpdGggQUREL1NVQnBwcC4gKi8KLSNkZWZpbmUgRkxBR19NVUwxNgkoMUw8PDE3KQkvKiAxNiBiaXQgbXVsdGlwbHkgKi8KLSNkZWZpbmUgRkxBR19NVUwzMgkoMUw8PDE4KQkvKiAzMiBiaXQgbXVsdGlwbHkgKi8KLSNkZWZpbmUgRkxBR19BRERTVUJwcHAJKDFMPDwxOSkJLyogQUREcHBwIG9yIFNVQnBwcCAqLwotI2RlZmluZSBGTEFHX0RFTEFZCSgxTDw8MjApCS8qIFRoaXMgaXMgYSBkZWxheWVkIGJyYW5jaCBvciBqdW1wICovCi0jZGVmaW5lIEZMQUdfTEtSCSgxTDw8MjEpCS8qIGluc24gaW4gbGVmdCBzbG90IGtpbGxzIHJpZ2h0IHNsb3QgKi8KLSNkZWZpbmUgRkxBR19DVlZBCShGTEFHXzV8RkxBR182fEZMQUdfNykKLSNkZWZpbmUgRkxBR19DCQlGTEFHXzcKLSNkZWZpbmUgRkxBR19BTEwJKEZMQUdfMCB8IFwKLQkJCSBGTEFHXzEgfCBcCi0JCQkgRkxBR18yIHwgXAotCQkJIEZMQUdfMyB8IFwKLQkJCSBGTEFHXzQgfCBcCi0JCQkgRkxBR181IHwgXAotCQkJIEZMQUdfNiB8IFwKLQkJCSBGTEFHXzcgfCBcCi0JCQkgRkxBR19TTSB8IFwKLQkJCSBGTEFHX1JQIHwgXAotCQkJIEZMQUdfQ09OVFJPTCkKLQotICBpbnQgcmVsb2NfZmxhZzsKLSNkZWZpbmUgUkVMT0NfUENSRUwJMQotI2RlZmluZSBSRUxPQ19BQlMJMgotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X29wY29kZSBkMzB2X29wY29kZV90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IGludCBkMzB2X251bV9vcGNvZGVzOwotCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfb3BlcmFuZC4gICovCi1zdHJ1Y3QgZDMwdl9vcGVyYW5kCi17Ci0gIC8qIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkICovCi0gIGludCBsZW5ndGg7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogcG9zaXRpb24gcmVsYXRpdmUgdG8gUmEgKi8KLSAgaW50IHBvc2l0aW9uOwotCi0gIC8qIHN5bnRheCBmbGFncy4gICovCi0gIGxvbmcgZmxhZ3M7Ci19OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X29wZXJhbmQgZDMwdl9vcGVyYW5kX3RhYmxlW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgZDMwdl9vcGVyYW5kLiAgKi8KLQotLyogdGhpcyBpcyB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXI7IGl0IHdpbGwgYmUgbW9kaWZpZWQgKi8KLS8qIHRoaXMgaXMgdXNlZCBieSB0aGUgb3B0aW1pemVyICovCi0jZGVmaW5lIE9QRVJBTkRfREVTVAkoMSkKLQotLyogbnVtYmVyIG9yIHN5bWJvbCAqLwotI2RlZmluZSBPUEVSQU5EX05VTQkoMikKLQotLyogYWRkcmVzcyBvciBsYWJlbCAqLwotI2RlZmluZSBPUEVSQU5EX0FERFIJKDQpCi0KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfUkVHCSg4KQotCi0vKiBwb3N0aW5jcmVtZW50ICsgICovCi0jZGVmaW5lIE9QRVJBTkRfUExVUwkoMHgxMCkKLQotLyogcG9zdGRlY3JlbWVudCAtICAqLwotI2RlZmluZSBPUEVSQU5EX01JTlVTCSgweDIwKQotCi0vKiBzaWduZWQgbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfU0lHTkVECSgweDQwKQotCi0vKiB0aGlzIG9wZXJhbmQgbXVzdCBiZSBzaGlmdGVkIGxlZnQgYnkgMyAqLwotI2RlZmluZSBPUEVSQU5EX1NISUZUCSgweDgwKQotCi0vKiBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfRkxBRwkoMHgxMDApCi0KLS8qIGNvbnRyb2wgcmVnaXN0ZXIgICovCi0jZGVmaW5lIE9QRVJBTkRfQ09OVFJPTAkoMHgyMDApCi0KLS8qIGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIE9QRVJBTkRfQUNDCSgweDQwMCkKLQotLyogQCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFNJR04JKDB4ODAwKQotCi0vKiBAKCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFBBUgkoMHgxMDAwKQotCi0vKiBwcmVkZWNyZW1lbnQgbW9kZSAnQC1zcCcgICovCi0jZGVmaW5lIE9QRVJBTkRfQVRNSU5VUwkoMHgyMDAwKQotCi0vKiB0aGlzIG9wZXJhbmQgY2hhbmdlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZSAqLwotLyogZm9yIGV4YW1wbGUsIENQTWNjLCBDTVBVY2MgKi8KLSNkZWZpbmUgT1BFUkFORF9OQU1FCSgweDQwMDApCi0KLS8qIGZha2Ugb3BlcmFuZCBmb3IgbXZ0c3lzIGFuZCBtdmZzeXMgKi8KLSNkZWZpbmUgT1BFUkFORF9TUEVDSUFMCSgweDgwMDApCi0KLS8qIGxldCB0aGUgb3B0aW1pemVyIGtub3cgdGhhdCB0d28gcmVnaXN0ZXJzIGFyZSBhZmZlY3RlZCAqLwotI2RlZmluZSBPUEVSQU5EXzJSRUcJKDB4MTAwMDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBwYy1yZWxhdGl2ZS4gIE5vdGUgdGhhdCByZXBlYXRpIGNhbiBoYXZlIHR3byBpbW1lZGlhdGUKLSAgIG9wZXJhbmRzLCBvbmUgb2Ygd2hpY2ggaXMgcGNyZWwsIHRoZSBvdGhlciAodGhlIElNTTZVIG9uZSkgaXMgbm90LiAgKi8KLSNkZWZpbmUgT1BFUkFORF9QQ1JFTAkoMHgyMDAwMCkKLQotLyogVGhlIGZvcm1hdCB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDMwdl9mb3JtYXQuICAqLwotc3RydWN0IGQzMHZfZm9ybWF0Ci17Ci0gIGludAlmb3JtOwkJLyogU0hPUlRfQSwgTE9ORywgZXRjICovCi0gIGludAltb2RpZmllcjsJLyogdHdvIGJpdCBtb2RpZmllciBmb2xsb3dpbmcgb3Bjb2RlICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbNV07Ci19OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X2Zvcm1hdCBkMzB2X2Zvcm1hdF90YWJsZVtdOwotCi0KLS8qIGFuIGluc3RydWN0aW9uIGlzIGRlZmluZWQgYnkgYW4gb3Bjb2RlIGFuZCBhIGZvcm1hdCAqLwotLyogZm9yIGV4YW1wbGUsICJhZGQiIGhhcyBvbmUgb3Bjb2RlLCBidXQgdGhyZWUgZGlmZmVyZW50ICovCi0vKiBmb3JtYXRzLCAyIFNIT1JUX0EgZm9ybXMgYW5kIGEgTE9ORyBmb3JtLiAqLwotc3RydWN0IGQzMHZfaW5zbgotewotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wOwkvKiBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUgKi8KLSAgc3RydWN0IGQzMHZfZm9ybWF0ICpmb3JtOwkvKiBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmb3JtYXQgdGFibGUgKi8KLSAgaW50IGVjYzsJCQkvKiBleGVjdXRpb24gY29uZGl0aW9uIGNvZGUgKi8KLX07Ci0KLS8qIGFuIGV4cHJlc3Npb25TIG9ubHkgaGFzIG9uZSByZWdpc3RlciB0eXBlLCBzbyB3ZSBmYWtlIGl0ICovCi0vKiBieSBzZXR0aW5nIGhpZ2ggYml0cyB0byBpbmRpY2F0ZSB0eXBlICovCi0jZGVmaW5lIFJFR0lTVEVSX01BU0sJMHhGRgotCi0jZW5kaWYgLyogRDMwVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9oODMwMC5oIGIvaW5jbHVkZS9vcGNvZGUvaDgzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwNWU0ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9oODMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEg4LTMwMAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgc2FjQGN5Z251cy5jb20uCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlciBhbmQgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGFzIGEgc2VxdWVuY2Ugb2YgbmliYmxlcy4KLSAgIElmIHRoZSBuaWJibGUgaGFzIHZhbHVlIDE1IG9yIGxlc3MgdGhlbiB0aGUgcmVwcmVzZW50YXRpb24gaXMgY29tcGxldGUuCi0gICBPdGhlcndpc2UsIHdlIHJlY29yZCB3aGF0IGl0IGNvbnRhaW5zIHdpdGggc2V2ZXJhbCBmbGFncy4gICovCi0KLXR5cGVkZWYgaW50IG9wX3R5cGU7Ci0KLSNkZWZpbmUgSGV4MAkwCi0jZGVmaW5lIEhleDEgCTEKLSNkZWZpbmUgSGV4MiAJMgotI2RlZmluZSBIZXgzIAkzCi0jZGVmaW5lIEhleDQgCTQKLSNkZWZpbmUgSGV4NSAJNQotI2RlZmluZSBIZXg2IAk2Ci0jZGVmaW5lIEhleDcgCTcKLSNkZWZpbmUgSGV4OCAJOAotI2RlZmluZSBIZXg5IAk5Ci0jZGVmaW5lIEhleEEgCTEwCi0jZGVmaW5lIEhleEIgCTExCi0jZGVmaW5lIEhleEMgCTEyCi0jZGVmaW5lIEhleEQgCTEzCi0jZGVmaW5lIEhleEUgCTE0Ci0jZGVmaW5lIEhleEYgCTE1Ci0KLSNkZWZpbmUgTF84CQkweDAxCi0jZGVmaW5lIExfMTYJCTB4MDIKLSNkZWZpbmUgTF8zMgkJMHgwNAotI2RlZmluZSBMX1AgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBMXzI0CQkweDEwCi0jZGVmaW5lIE1FTVJFTEFYIAkweDIwCQkJLyogbW92ZSBpbnNuIHdoaWNoIG1heSByZWxheCAqLyAKLSNkZWZpbmUgU1JDICAgICAgICAgICAgIDB4NDAKLSNkZWZpbmUgRFNUICAgICAgICAgICAgIDB4ODAKLQotI2RlZmluZSBSRUcJCTB4MTAwCi0jZGVmaW5lIEVYUgkJMHgyMDAKLSNkZWZpbmUgTUFDUkVHCQkweDgwMAotI2RlZmluZSBTUkNfSU5fRFNUCTB4NDAwCi0jZGVmaW5lIElNTQkJMHgxMDAwCi0jZGVmaW5lIERJU1AJCTB4MjAwMAotI2RlZmluZSBJTkQJCTB4NDAwMAotI2RlZmluZSBJTkMJCTB4ODAwMAotI2RlZmluZSBERUMJCTB4MTAwMDAKLSNkZWZpbmUgTF8zCQkweDIwMDAwCi0jZGVmaW5lIEtCSVQgCQkweDQwMDAwCi0jZGVmaW5lIERCSVQgICAgICAgICAgICAweDgwMDAwCi0jZGVmaW5lIERJU1BSRUcgICAgICAgICAweDEwMDAwMAotI2RlZmluZSBJR05PUkUgCQkweDIwMDAwMAotI2RlZmluZSBFICAgICAgCQkweDQwMDAwMAkJLyogRklYTUU6IGVuZCBvZiBuaWJibGUgc2VxdWVuY2U/ICovCi0jZGVmaW5lIExfMgkJMHg4MDAwMDAKLSNkZWZpbmUgQjMwICAJCTB4MTAwMDAwMCAJCS8qIGJpdCAzIG11c3QgYmUgbG93ICovCi0jZGVmaW5lIEIzMSAgCQkweDIwMDAwMDAJCS8qIGJpdCAzIG11c3QgYmUgaGlnaCAqLwotI2RlZmluZSBDQ1IJCTB4NDAwMDAwMAotI2RlZmluZSBBQlMgICAgICAgICAgICAgMHg4MDAwMDAwCi0jZGVmaW5lIEFCU0pNUAkJMHgxMDAwMDAwMCAgCi0jZGVmaW5lIEFCUzhNRU0gICAgICAgICAweDIwMDAwMDAwCQotI2RlZmluZSBQQ1JFTCAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBNRU1JTkQgICAgICAgICAgMHg4MDAwMDAwMAotCi0jZGVmaW5lIElNTTMgCQlJTU18TF8zCi0jZGVmaW5lIElNTTIgCQlJTU18TF8yCi0KLSNkZWZpbmUgU0laRQkJKExfMnxMXzN8TF84fExfMTZ8TF8zMnxMX1B8TF8yNCkKLSNkZWZpbmUgTU9ERQkJKFJFR3xJTU18RElTUHxJTkR8SU5DfERFQ3xDQ1J8QUJTfE1FTUlORHxFWFIpCi0KLSNkZWZpbmUgUkQ4IAkJKERTVHxMXzh8UkVHKQotI2RlZmluZSBSRDE2IAkJKERTVHxMXzE2fFJFRykKLSNkZWZpbmUgUkQzMiAJCShEU1R8TF8zMnxSRUcpCi0jZGVmaW5lIFJTOCAJCShTUkN8TF84fFJFRykKLSNkZWZpbmUgUlMxNiAJCShTUkN8TF8xNnxSRUcpCi0jZGVmaW5lIFJTMzIJCShTUkN8TF8zMnxSRUcpCi0KLSNkZWZpbmUgUlNQIAkJKFNSQ3xMX1B8UkVHKQotI2RlZmluZSBSRFAgCQkoRFNUfExfUHxSRUcpCi0KLSNkZWZpbmUgSU1NOCAJCShJTU18U1JDfExfOCkKLSNkZWZpbmUgSU1NMTYgCQkoSU1NfFNSQ3xMXzE2KQotI2RlZmluZSBJTU0zMiAJCShJTU18U1JDfExfMzIpCi0KLSNkZWZpbmUgQUJTOFNSQyAJKFNSQ3xBQlN8TF84fEFCUzhNRU0pCi0jZGVmaW5lIEFCUzhEU1QJCShEU1R8QUJTfExfOHxBQlM4TUVNKQotCi0jZGVmaW5lIERJU1A4IAkJKFBDUkVMfExfOCkKLSNkZWZpbmUgRElTUDE2IAkJKFBDUkVMfExfMTYpCi0KLSNkZWZpbmUgRElTUDhTUkMJKERJU1B8TF84fFNSQykKLSNkZWZpbmUgRElTUDE2U1JDCShESVNQfExfMTZ8U1JDKQotCi0jZGVmaW5lIERJU1A4RFNUCShESVNQfExfOHxEU1QpCi0jZGVmaW5lIERJU1AxNkRTVAkoRElTUHxMXzE2fERTVCkKLQotI2RlZmluZSBBQlMxNlNSQyAJKFNSQ3xBQlN8TF8xNikKLSNkZWZpbmUgQUJTMTZEU1QgCShEU1R8QUJTfExfMTYpCi0jZGVmaW5lIEFCUzI0U1JDIAkoU1JDfEFCU3xMXzI0KQotI2RlZmluZSBBQlMyNERTVCAJKERTVHxBQlN8TF8yNCkKLSNkZWZpbmUgQUJTMzJTUkMgCShTUkN8QUJTfExfMzIpCi0jZGVmaW5lIEFCUzMyRFNUIAkoRFNUfEFCU3xMXzMyKQotCi0jZGVmaW5lIFJEREVDIAkJKERTVHxERUMpCi0jZGVmaW5lIFJTSU5DIAkJKFNSQ3xJTkMpCi0jZGVmaW5lIFJESU5DCQkoRFNUfElOQykKLQotI2RlZmluZSBSRElORCAJCShEU1R8SU5EKQotI2RlZmluZSBSU0lORCAJCShTUkN8SU5EKQotCi0jaWYgMQotI2RlZmluZSBPUjggUlM4CQkvKiA/Pz8gT1IgYXMgaW4gT25lIFJlZ2lzdGVyPyAqLwotI2RlZmluZSBPUjE2IFJTMTYKLSNkZWZpbmUgT1IzMiBSUzMyCi0jZWxzZQotI2RlZmluZSBPUjggUkQ4Ci0jZGVmaW5lIE9SMTYgUkQxNgotI2RlZmluZSBPUjMyIFJEMzIKLSNlbmRpZgotCi1zdHJ1Y3QgY29kZSAKLXsKLSAgb3BfdHlwZSBuaWJbMzBdOwotfTsKLQotc3RydWN0IGFyZyAKLXsKLSAgb3BfdHlwZSBuaWJbM107Ci19OwotCi1zdHJ1Y3QgaDhfb3Bjb2RlIAotewotICBpbnQgaG93OwotICBpbnQgaW5iYXNlOwotICBpbnQgdGltZTsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IGFyZyBhcmdzOwotICBzdHJ1Y3QgY29kZSBkYXRhOwotICBpbnQgbGVuZ3RoOwotICBpbnQgbm9wZXJhbmRzOwotICBpbnQgaWR4OwotICBpbnQgc2l6ZTsKLX07Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLQotI2RlZmluZSBCSVRPUChjb2RlLCBpbW0sIG5hbWUsIG9wMDAsIG9wMDEsb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMClcCi17IGNvZGUsIDEsIDIsIG5hbWUsCXt7aW1tLFJEOCxFfX0sCXt7b3AwMCwgb3AwMSwgaW1tLCBSRDgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sXAoteyBjb2RlLCAxLCA2LCBuYW1lLAl7e2ltbSxSRElORCxFfX0se3tvcDEwLCBvcDExLCBCMzB8UkRJTkQsIDAsIG9wMDAsb3AwMSwgaW1tLCAwLCBFfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMSwgNiwgbmFtZSwJe3tpbW0sQUJTOERTVCxFfX0se3tvcDIwLCBvcDIxLCBBQlM4RFNULCBJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH1cCi0seyBjb2RlLCAwLCA2LCBuYW1lLAl7e2ltbSxBQlMxNkRTVCxFfX0se3sweDYsMHhhLDB4MSxvcDMwLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLCBvcDAwLG9wMDEsIGltbSwgMCxFfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMCwgNiwgbmFtZSwJe3tpbW0sQUJTMzJEU1QsRX19LHt7MHg2LDB4YSwweDMsb3AzMCxBQlMzMkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH0KLQotCi0jZGVmaW5lIEVCSVRPUChjb2RlLCBpbW0sIG5hbWUsIG9wMDAsIG9wMDEsb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMClcCi0gICBCSVRPUChjb2RlLGltbSwgbmFtZSwgb3AwMCsxLCBvcDAxLCBvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKSxcCi0gICBCSVRPUChjb2RlLFJTOCwgIG5hbWUsIG9wMDAsIG9wMDEsIG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApCi0KLSNkZWZpbmUgV1RXT1AoY29kZSxuYW1lLCBvcDEsIG9wMikgXAoteyBjb2RlLCAxLCAyLCBuYW1lLCB7e1JTMTYsIFJEMTYsIEV9fSwge3sgb3AxLCBvcDIsIFJTMTYsIFJEMTYsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KLQotI2RlZmluZSBCUkFOQ0goY29kZSwgbmFtZSwgb3ApIFwKLXsgY29kZSwgMSwgNCxuYW1lLHt7RElTUDgsRSwwfX0sIHt7IDB4NCwgb3AsIERJU1A4LCBJR05PUkUsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgY29kZSwgMCwgNixuYW1lLHt7RElTUDE2LEUsMH19LCB7eyAweDUsIDB4OCwgb3AsIDB4MCwgRElTUDE2LCBJR05PUkUsIElHTk9SRSwgSUdOT1JFLCBFLDB9fSwgMCwgMCwgMCwgMH0gCi0KLSNkZWZpbmUgU09QKGNvZGUsIHgsbmFtZSkgXAote2NvZGUsIDEsIHgsICBuYW1lIAotCi0jZGVmaW5lIE5FV19TT1AoY29kZSwgaW4seCxuYW1lKSBcCi17Y29kZSwgaW4sIHgsICBuYW1lIAotI2RlZmluZSBFT1AgICwwLDAsMCB9Ci0KLSNkZWZpbmUgVFdPT1AoY29kZSwgbmFtZSwgb3AxLCBvcDIsb3AzKSBcCi17IGNvZGUsMSwgMixuYW1lLCB7e0lNTTgsIFJEOCwgRX19LAl7eyBvcDEsIFJEOCwgSU1NOCwgSUdOT1JFLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMSwgMixuYW1lLCB7e1JTOCwgUkQ4LCBFfX0sCXt7IG9wMiwgb3AzLCBSUzgsIFJEOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSAKLQotI2RlZmluZSBVTk9QKGNvZGUsbmFtZSwgb3AxLCBvcDIpIFwKLXsgY29kZSwgMSwgMiwgbmFtZSwge3tPUjgsIEUsIDB9fSwge3sgb3AxLCBvcDIsIDAsIE9SOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfQotCi0jZGVmaW5lIFVOT1AzKGNvZGUsIG5hbWUsIG9wMSwgb3AyLCBvcDMpIFwKLXsgTyhjb2RlLFNCKSwgMSwgMiwgbmFtZSwge3tPUjgsICBFLCAwfX0sIHt7b3AxLCBvcDIsIG9wMyswLCBPUjgsICBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IE8oY29kZSxTVyksIDAsIDIsIG5hbWUsIHt7T1IxNiwgRSwgMH19LCB7e29wMSwgb3AyLCBvcDMrMSwgT1IxNiwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU0wpLCAwLCAyLCBuYW1lLCB7e09SMzIsIEUsIDB9fSwge3tvcDEsIG9wMiwgb3AzKzMsIE9SMzJ8QjMwLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9IFwKLSx7IE8oY29kZSxTQiksIDEsIDIsIG5hbWUsIHt7SU1NLCBPUjggfCBTUkNfSU5fRFNULCAgRX19LCB7e29wMSwgb3AyLCBvcDMrNCwgT1I4IHwgU1JDX0lOX0RTVCwgIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNXKSwgMCwgMiwgbmFtZSwge3tJTU0sIE9SMTYgfCBTUkNfSU5fRFNULCBFfX0sIHt7b3AxLCBvcDIsIG9wMys1LCBPUjE2IHwgU1JDX0lOX0RTVCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU0wpLCAwLCAyLCBuYW1lLCB7e0lNTSwgT1IzMiB8IFNSQ19JTl9EU1QsIEV9fSwge3tvcDEsIG9wMiwgb3AzKzcsIE9SMzIgfCBTUkNfSU5fRFNUfEIzMCAsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KLQotCi0jZGVmaW5lIElNTTMyTElTVCBJTU0zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgSU1NMjRMSVNUIElNTTI0LElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgSU1NMTZMSVNUIElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEExNkxJU1QgTF8xNixJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBESVNQMjRMSVNUIERJU1B8TF8yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIERJU1AzMkxJU1QgRElTUHxMXzMyLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBQlMyNExJU1QgQUJTfExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBQlMzMkxJU1QgQUJTfExfMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEEyNExJU1QgTF8yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIEEzMkxJU1QgTF8zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgUFJFRklYMzIgMHgwLDB4MSwweDAsMHgwCi0jZGVmaW5lIFBSRUZJWExEQyAweDAsMHgxLDB4NCwweDAKLQotCi0jZGVmaW5lIE8ob3AsIHNpemUpIChvcCo0K3NpemUpCi0KLSNkZWZpbmUgT19SRUNPTVBJTEUgMAotI2RlZmluZSBPX0FERCAgMQotI2RlZmluZSBPX0FERFggMgotI2RlZmluZSBPX0FORCAgMwotI2RlZmluZSBPX0JBTkQgNAotI2RlZmluZSBPX0JSQSAgNQotI2RlZmluZSBPX0JSTiAgNgotI2RlZmluZSBPX0JISSAgNwotI2RlZmluZSBPX0JMUyAgOAotI2RlZmluZSBPX0JDQyAgOQotI2RlZmluZSBPX0JDUyAgMTAKLSNkZWZpbmUgT19CTkUgIDExICAKLSNkZWZpbmUgT19CVkMgIDEyCi0jZGVmaW5lIE9fQlZTICAxMwotI2RlZmluZSBPX0JQTCAgMTQKLSNkZWZpbmUgT19CTUkgIDE1Ci0jZGVmaW5lIE9fQkdFICAxNgotI2RlZmluZSBPX0JMVCAgMTcKLSNkZWZpbmUgT19CR1QgIDE4Ci0jZGVmaW5lIE9fQkxFICAxOQotI2RlZmluZSBPX0FOREMgMjAKLSNkZWZpbmUgT19CRVEgMjEKLSNkZWZpbmUgT19CQ0xSIDIyCi0jZGVmaW5lIE9fQklBTkQgMjMKLSNkZWZpbmUgT19CSUxEIDI0Ci0jZGVmaW5lIE9fQklPUiAyNQotI2RlZmluZSBPX0JJWE9SIDI2Ci0jZGVmaW5lIE9fQklTVCAyNwotI2RlZmluZSBPX0JMRCAyOAotI2RlZmluZSBPX0JOT1QgMjkKLSNkZWZpbmUgT19CU0VUIDMwCi0jZGVmaW5lIE9fQlNSIDMxCi0jZGVmaW5lIE9fQlhPUiAzMgotI2RlZmluZSBPX0NNUCAzMwotI2RlZmluZSBPX0RBQSAzNAotI2RlZmluZSBPX0RBUyAzNQotI2RlZmluZSBPX0RFQyAzNgotI2RlZmluZSBPX0RJVlUgMzcKLSNkZWZpbmUgT19ESVZTIDM4Ci0jZGVmaW5lIE9fSU5DIDM5Ci0jZGVmaW5lIE9fTERDIDQwCi0jZGVmaW5lIE9fTU9WX1RPX01FTSA0MQotI2RlZmluZSBPX09SIDQyCi0jZGVmaW5lIE9fUk9UTCA0MwotI2RlZmluZSBPX1JPVFIgNDQKLSNkZWZpbmUgT19ST1RYTCA0NQotI2RlZmluZSBPX1JPVFhSIDQ2Ci0jZGVmaW5lIE9fQlBUIDQ3Ci0jZGVmaW5lIE9fU0hBTCA0OAotI2RlZmluZSBPX1NIQVIgNDkKLSNkZWZpbmUgT19TSExMIDUwCi0jZGVmaW5lIE9fU0hMUiA1MQotI2RlZmluZSBPX1NVQiAgNTIKLSNkZWZpbmUgT19TVUJTIDUzCi0jZGVmaW5lIE9fVFJBUEEgNTQKLSNkZWZpbmUgT19YT1IgNTUKLSNkZWZpbmUgT19YT1JDIDU2Ci0jZGVmaW5lIE9fQk9SIDU3Ci0jZGVmaW5lIE9fQlNUIDU4Ci0jZGVmaW5lIE9fQlRTVCA1OQotI2RlZmluZSBPX0VFUE1PViA2MAotI2RlZmluZSBPX0VYVFMgNjEKLSNkZWZpbmUgT19FWFRVIDYyCi0jZGVmaW5lIE9fSk1QIDYzCi0jZGVmaW5lIE9fSlNSIDY0Ci0jZGVmaW5lIE9fTVVMVSA2NQotI2RlZmluZSBPX01VTFMgNjYKLSNkZWZpbmUgT19OT1AgNjcKLSNkZWZpbmUgT19OT1QgNjgKLSNkZWZpbmUgT19PUkMgNjkKLSNkZWZpbmUgT19SVEUgNzAKLSNkZWZpbmUgT19TVEMgNzEKLSNkZWZpbmUgT19TVUJYIDcyCi0jZGVmaW5lIE9fTkVHIDczCi0jZGVmaW5lIE9fUlRTIDc0Ci0jZGVmaW5lIE9fU0xFRVAgNzUKLSNkZWZpbmUgT19JTEwgNzYKLSNkZWZpbmUgT19BRERTIDc3Ci0jZGVmaW5lIE9fU1lTQ0FMTCA3OAotI2RlZmluZSBPX01PVl9UT19SRUcgNzkKLSNkZWZpbmUgT19UQVMgODAKLSNkZWZpbmUgT19DTFJNQUMgODIKLSNkZWZpbmUgT19MRE1BQyA4MwotI2RlZmluZSBPX01BQyA4NAotI2RlZmluZSBPX0xETSA4NQotI2RlZmluZSBPX1NUTSA4NgotI2RlZmluZSBPX1NUTUFDIDg3Ci0jZGVmaW5lIE9fTEFTVCA4OAotI2RlZmluZSBTQiAwCi0jZGVmaW5lIFNXIDEKLSNkZWZpbmUgU0wgMgotI2RlZmluZSBTTiAzCi0KLQotLyogRklYTUU6IExvdHMgb2YgaW5zbnMgaGF2ZSAiRSwgMCwgMCwgMCwgMCIgaW4gdGhlIG5pYmJsZSBjb2RlIHNlcXVlbmNlcy4KLSAgIE1ldGhpbmtzIHRoZSB6ZXJvZXMgYXJlbid0IG5lY2Vzc2FyeS4gIE9uY2UgY29uZmlybWVkLCBudWtlICdlbS4gICovCi0KLXN0cnVjdCBoOF9vcGNvZGUgaDhfb3Bjb2Rlc1tdID0gCi17Ci0gIFRXT09QKE8oT19BREQsU0IpLCJhZGQuYiIsIDB4OCwgMHgwLDB4OCksCi0gIAotICBORVdfU09QKE8oT19BREQsU1cpLDEsMiwiYWRkLnciKSx7e1JTMTYsUkQxNixFfX0se3sweDAsMHg5LFJTMTYsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19BREQsU1cpLDAsNCwiYWRkLnciKSx7e0lNTTE2LFJEMTYsRX19LHt7MHg3LDB4OSwweDEsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19BREQsU0wpLDAsMiwiYWRkLmwiKSx7e1JTMzIsUkQzMixFIH19LCB7ezB4MCwweEEsQjMxfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQURELFNMKSwwLDYsImFkZC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MSxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQUREUyxTTCksMSwyLCJhZGRzIiksIHt7S0JJVCxSRFAsRX19LCAgIHt7MHgwLDB4QixLQklULFJEUCxFLDAsMCwwLDB9fSBFT1AsCi0KLSAgVFdPT1AoTyhPX0FERFgsU0IpLCJhZGR4IiwweDksMHgwLDB4RSksCi0gIFRXT09QKE8oT19BTkQsU0IpLCAiYW5kLmIiLDB4RSwweDEsMHg2KSwKLQotICBORVdfU09QKE8oT19BTkQsU1cpLDAsMiwiYW5kLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NixSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQU5ELFNXKSwwLDQsImFuZC53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4NixSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0gIAotICBORVdfU09QKE8oT19BTkQsU0wpLDAsNiwiYW5kLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg2LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19BTkQsU0wpLDAsMiwiYW5kLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg2LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fQU5EQyxTQiksMSwyLCJhbmRjIiksIHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDYsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotICBORVdfU09QKE8oT19BTkRDLFNCKSwxLDIsImFuZGMiKSwge3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDYsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotCi0gIEJJVE9QKE8oT19CQU5ELFNCKSwgSU1NM3xCMzAsImJhbmQiLDB4NywweDYsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJSQU5DSChPKE9fQlJBLFNCKSwiYnJhIiwweDApLAotICBCUkFOQ0goTyhPX0JSQSxTQiksImJ0IiwweDApLAotICBCUkFOQ0goTyhPX0JSTixTQiksImJybiIsMHgxKSwKLSAgQlJBTkNIKE8oT19CUk4sU0IpLCJiZiIsMHgxKSwKLSAgQlJBTkNIKE8oT19CSEksU0IpLCJiaGkiLDB4MiksCi0gIEJSQU5DSChPKE9fQkxTLFNCKSwiYmxzIiwweDMpLAotICBCUkFOQ0goTyhPX0JDQyxTQiksImJjYyIsMHg0KSwKLSAgQlJBTkNIKE8oT19CQ0MsU0IpLCJiaHMiLDB4NCksCi0gIEJSQU5DSChPKE9fQkNTLFNCKSwiYmNzIiwweDUpLAotICBCUkFOQ0goTyhPX0JDUyxTQiksImJsbyIsMHg1KSwKLSAgQlJBTkNIKE8oT19CTkUsU0IpLCJibmUiLDB4NiksCi0gIEJSQU5DSChPKE9fQkVRLFNCKSwiYmVxIiwweDcpLAotICBCUkFOQ0goTyhPX0JWQyxTQiksImJ2YyIsMHg4KSwKLSAgQlJBTkNIKE8oT19CVlMsU0IpLCJidnMiLDB4OSksCi0gIEJSQU5DSChPKE9fQlBMLFNCKSwiYnBsIiwweEEpLAotICBCUkFOQ0goTyhPX0JNSSxTQiksImJtaSIsMHhCKSwKLSAgQlJBTkNIKE8oT19CR0UsU0IpLCJiZ2UiLDB4QyksCi0gIEJSQU5DSChPKE9fQkxULFNCKSwiYmx0IiwweEQpLAotICBCUkFOQ0goTyhPX0JHVCxTQiksImJndCIsMHhFKSwKLSAgQlJBTkNIKE8oT19CTEUsU0IpLCJibGUiLDB4RiksCi0KLSAgRUJJVE9QKE8oT19CQ0xSLFNCKSxJTU0zfEIzMCwiYmNsciIsIDB4NiwweDIsMHg3LDB4RCwweDcsMHhGLDB4OCksCi0gIEJJVE9QKE8oT19CSUFORCxTQiksSU1NM3xCMzEsImJpYW5kIiwweDcsMHg2LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCSVRPUChPKE9fQklMRCxTQiksIElNTTN8QjMxLCJiaWxkIiwgMHg3LDB4NywweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JJT1IsU0IpLCBJTU0zfEIzMSwiYmlvciIsIDB4NywweDQsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CSVNULFNCKSwgSU1NM3xCMzEsImJpc3QiLCAweDYsMHg3LDB4NywweEQsMHg3LDB4RiwweDgpLAotICBCSVRPUChPKE9fQklYT1IsU0IpLElNTTN8QjMxLCJiaXhvciIsMHg3LDB4NSwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JMRCxTQiksICBJTU0zfEIzMCwiYmxkIiwgIDB4NywweDcsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEVCSVRPUChPKE9fQk5PVCxTQiksSU1NM3xCMzAsImJub3QiLCAweDYsMHgxLDB4NywweEQsMHg3LDB4RiwweDgpLAotICBCSVRPUChPKE9fQk9SLFNCKSwgIElNTTN8QjMwLCJib3IiLCAgMHg3LDB4NCwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgRUJJVE9QKE8oT19CU0VULFNCKSxJTU0zfEIzMCwiYnNldCIsIDB4NiwweDAsMHg3LDB4RCwweDcsMHhGLDB4OCksCi0KLSAgU09QKE8oT19CU1IsU0IpLDYsImJzciIpLHt7RElTUDgsRSwwfX0se3sgMHg1LDB4NSxESVNQOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotICBTT1AoTyhPX0JTUixTQiksNiwiYnNyIikse3tESVNQMTYsRSwwfX0se3sgMHg1LDB4QywweDAsMHgwLERJU1AxNixJR05PUkUsSUdOT1JFLElHTk9SRSxFLDAsMCwwLDB9fSBFT1AsCi0gIEJJVE9QKE8oT19CU1QsU0IpLCBJTU0zfEIzMCwiYnN0IiwweDYsMHg3LDB4NywweEQsMHg3LDB4RiwweDgpLAotICBFQklUT1AoTyhPX0JUU1QsU0IpLCBJTU0zfEIzMCwiYnRzdCIsMHg2LDB4MywweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JYT1IsU0IpLCBJTU0zfEIzMCwiYnhvciIsMHg3LDB4NSwweDcsMHhDLDB4NywweEUsMHgwKSwKLQotICBUV09PUChPKE9fQ01QLFNCKSwgImNtcC5iIiwweEEsMHgxLDB4QyksCi0gIFdUV09QKE8oT19DTVAsU1cpLCAiY21wLnciLDB4MSwweEQpLAotCi0gIE5FV19TT1AoTyhPX0NNUCxTVyksMSwyLCJjbXAudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDEsMHhELFJTMTYsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19DTVAsU1cpLDAsNCwiY21wLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHgyLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19DTVAsU0wpLDAsNiwiY21wLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHgyLEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19DTVAsU0wpLDAsMiwiY21wLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MSwweEYsQjMxfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKLQotICBVTk9QKE8oT19EQUEsU0IpLCAiZGFhIiwweDAsMHhGKSwKLSAgVU5PUChPKE9fREFTLFNCKSwgImRhcyIsMHgxLDB4RiksCi0gIFVOT1AoTyhPX0RFQyxTQiksICJkZWMuYiIsMHgxLDB4QSksCi0KLSAgTkVXX1NPUChPKE9fREVDLCBTVyksMCwyLCJkZWMudyIpICx7e0RCSVQsUkQxNixFIH19LHt7MHgxLDB4QiwweDV8REJJVCxSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0RFQywgU0wpLDAsMiwiZGVjLmwiKSAse3tEQklULFJEMzIsRSB9fSx7ezB4MSwweEIsMHg3fERCSVQsUkQzMnxCMzAsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19ESVZVLFNCKSwxLDYsImRpdnh1LmIiKSwge3tSUzgsUkQxNixFfX0sIHt7MHg1LDB4MSxSUzgsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fRElWVSxTVyksMCwyMCwiZGl2eHUudyIpLHt7UlMxNixSRDMyLEV9fSx7ezB4NSwweDMsUlMxNixCMzB8UkQzMixFfX1FT1AsCi0gICAgCi0gIE5FV19TT1AoTyhPX0RJVlMsU0IpLDAsMjAsImRpdnhzLmIiKSAse3tSUzgsUkQxNixFIH19LHt7MHgwLDB4MSwweEQsMHgwLDB4NSwweDEsUlM4LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fRElWUyxTVyksMCwwMiwiZGl2eHMudyIpICx7e1JTMTYsUkQzMixFIH19LHt7MHgwLDB4MSwweEQsMHgwLDB4NSwweDMsUlMxNixCMzB8UkQzMixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0VFUE1PVixTQiksMSw1MCwiZWVwbW92LmIiKSx7e0UsMCwwfX0se3sweDcsMHhCLDB4NSwweEMsMHg1LDB4OSwweDgsMHhGLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fRUVQTU9WLFNXKSwwLDUwLCJlZXBtb3YudyIpLHt7RSwwLDB9fSx7ezB4NywweEIsMHhELDB4NCwweDUsMHg5LDB4OCwweEYsRX19IEVPUCwKLSAgICAKLSAgTkVXX1NPUChPKE9fRVhUUyxTVyksMCwyLCJleHRzLnciKSx7e09SMTYsRSwwfX0se3sweDEsMHg3LDB4RCxPUjE2LEUgICB9fUVPUCwKLSAgTkVXX1NPUChPKE9fRVhUUyxTTCksMCwyLCJleHRzLmwiKSx7e09SMzIsRSwwfX0se3sweDEsMHg3LDB4RixPUjMyfEIzMCxFICAgfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fRVhUVSxTVyksMCwyLCJleHR1LnciKSx7e09SMTYsRSwwfX0se3sweDEsMHg3LDB4NSxPUjE2LEUgICB9fUVPUCwKLSAgTkVXX1NPUChPKE9fRVhUVSxTTCksMCwyLCJleHR1LmwiKSx7e09SMzIsRSwwfX0se3sweDEsMHg3LDB4NyxPUjMyfEIzMCxFICAgfX1FT1AsCi0gICAgCi0gIFVOT1AoTyhPX0lOQyxTQiksICJpbmMiLDB4MCwweEEpLAotCi0gIE5FV19TT1AoTyhPX0lOQyxTVyksMCwyLCJpbmMudyIpICx7e0RCSVQsUkQxNixFIH19LHt7MHgwLDB4QiwweDV8REJJVCxSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0lOQyxTTCksMCwyLCJpbmMubCIpICx7e0RCSVQsUkQzMixFIH19LHt7MHgwLDB4QiwweDd8REJJVCxSRDMyfEIzMCxFfX0gRU9QLAotCi0gIFNPUChPKE9fSk1QLFNCKSw0LCJqbXAiKSx7e1JTSU5ELEUsMH19LHt7MHg1LDB4OSxCMzB8UlNJTkQsMHgwLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX0pNUCxTQiksNiwiam1wIikse3tTUkN8QUJTSk1QLEUsMH19LHt7MHg1LDB4QSxTUkN8QUJTSk1QLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX0pNUCxTQiksOCwiam1wIikse3tTUkN8TUVNSU5ELEUsMH19LHt7MHg1LDB4QixTUkN8TUVNSU5ELElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX0pTUixTQiksNiwianNyIikse3tTUkN8UlNJTkQsRSwwfX0sIHt7MHg1LDB4RCxCMzB8UlNJTkQsMHgwLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX0pTUixTQiksOCwianNyIikse3tTUkN8QUJTSk1QLEUsMH19LHt7MHg1LDB4RSxTUkN8QUJTSk1QLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX0pTUixTQiksOCwianNyIikse3tTUkN8TUVNSU5ELEUsMH19LHt7MHg1LDB4RixTUkN8TUVNSU5ELElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBORVdfU09QKE8oT19MREMsU0IpLDEsMiwibGRjIikse3tJTU04LENDUixFfX0sICAgICAgICAge3sgMHgwLDB4NyxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7T1I4LENDUixFfX0sICAgICAgICAgIHt7IDB4MCwweDMsMHgwLE9SOCxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMTZTUkMsQ0NSLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHgwLDB4MCxBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzMyU1JDLENDUixFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4MiwweDAsU1JDfEFCUzMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMTYsQ0NSLEV9fSx7e1BSRUZJWExEQywweDYsMHhGLEIzMHxESVNQUkVHLDAsRElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8zMixDQ1IsRX19LHt7UFJFRklYTERDLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4MiwweDAsU1JDfERJU1AzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lOQyxDQ1IsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4RCxCMzB8UlNJTkMsMHgwLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkQsQ0NSLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweDksQjMwfFJESU5ELDB4MCxFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e0lNTTgsRVhSLEV9fSwgICAgICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NyxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7T1I4LEVYUixFfX0sICAgICAgICAgIHt7IDB4MCwweDMsMHgxLE9SOCxFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMTZTUkMsRVhSLEV9fSwgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhiLDB4MCwweDAsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tBQlMzMlNSQyxFWFIsRX19LCAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweGIsMHgyLDB4MCxTUkN8QUJTMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8xNixFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhmLEIzMHxESVNQUkVHLDAsRElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8zMixFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweDIsMHgwLFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkMsRVhSLEV9fSwgICAgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhkLEIzMHxSU0lOQywweDAsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lORCxFWFIsRX19LCAgICAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweDksQjMwfFJESU5ELDB4MCxFfX0gRU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e0FCU3xTUkN8TF8xNnxNRU1SRUxBWCxSRDgsRX19LCAge3sgMHg2LDB4QSwweDAsUkQ4LFNSQ3xBQlN8TUVNUkVMQVh8QTE2TElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0FCU3xTUkN8TF8zMnxNRU1SRUxBWCxSRDgsRSB9fSwge3sgMHg2LDB4QSwweDIsUkQ4LFNSQ3xBQlN8TUVNUkVMQVh8QTMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsQUJTfExfMTZ8TUVNUkVMQVh8RFNULEV9fSwgICAgIHt7IDB4NiwweEEsMHg4LFJTOCxEU1R8QUJTfE1FTVJFTEFYfEExNkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDYsIm1vdi5iIikse3tSUzgsQUJTfERTVHxMXzMyfE1FTVJFTEFYLEUgfX0sICAgIHt7IDB4NiwweEEsMHhBLFJTOCxEU1R8QUJTfE1FTVJFTEFYfEEzMkxJU1QsRSB9fUVPUCwKLSAgICAKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7RElTUHxMXzMyfFNSQyxSRDgsRX19LCAge3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QSwweDIsUkQ4LFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LERJU1B8TF8zMnxEU1QsRX19LCAge3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QSwweEEsUlM4LERTVHxESVNQMzJMSVNULEV9fUVPUCwKLQotCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSwyLCJtb3YuYiIpLHt7UlM4LFJEOCxFfX0sCSAgICB7eyAweDAsMHhDLFJTOCxSRDgsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMiwibW92LmIiKSx7e0lNTTgsUkQ4LEV9fSwgICAgICAgICAgIHt7IDB4RixSRDgsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e1JTSU5ELFJEOCxFfX0sICAgICAgICAgIHt7IDB4NiwweDgsQjMwfFJTSU5ELFJEOCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7RElTUDE2U1JDLFJEOCxFfX0sICAgICAge3sgMHg2LDB4RSxCMzB8RElTUFJFRyxSRDgsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7UlNJTkMsUkQ4LEV9fSwgICAgICAgICAge3sgMHg2LDB4QyxCMzB8UlNJTkMsUkQ4LEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e0FCUzhTUkMsUkQ4LEV9fSwgICAgICAgIHt7IDB4MixSRDgsQUJTOFNSQyxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNCwibW92LmIiKSx7e1JTOCxSRElORCxFfX0sICAgICAgICAgIHt7IDB4NiwweDgsUkRJTkR8QjMxLFJTOCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LERJU1AxNkRTVCxFfX0sICAgICAge3sgMHg2LDB4RSxESVNQUkVHfEIzMSxSUzgsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LFJEREVDfEIzMSxFfX0sICAgICAge3sgMHg2LDB4QyxSRERFQ3xCMzEsUlM4LEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNCwibW92LmIiKSx7e1JTOCxBQlM4RFNULEV9fSwgICAgICAgIHt7IDB4MyxSUzgsQUJTOERTVCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixSRElORCxFfX0sICAgICAgICB7eyAweDYsMHg5LFJESU5EfEIzMSxSUzE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tESVNQfExfMzJ8U1JDLFJEMTYsRX19LHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHgyLFJEMTYsU1JDfERJU1AzMkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LERJU1B8TF8zMnxEU1QsRX19LHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHhBLFJTMTYsRFNUfERJU1AzMkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tBQlN8TF8zMnxNRU1SRUxBWHxTUkMsUkQxNixFIH19LHt7IDB4NiwweEIsMHgyLFJEMTYsU1JDfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LEFCU3xMXzMyfE1FTVJFTEFYfERTVCxFIH19LHt7IDB4NiwweEIsMHhBLFJTMTYsRFNUfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDIsIm1vdi53Iikse3tSUzE2LFJEMTYsRX19LCAgICAgICAgIHt7IDB4MCwweEQsUlMxNiwgUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw0LCJtb3YudyIpLHt7SU1NMTYsUkQxNixFfX0sICAgICAgICB7eyAweDcsMHg5LDB4MCxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw0LCJtb3YudyIpLHt7UlNJTkQsUkQxNixFfX0sICAgICAgICB7eyAweDYsMHg5LEIzMHxSU0lORCxSRDE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tESVNQMTZTUkMsUkQxNixFfX0sICAgIHt7IDB4NiwweEYsQjMwfERJU1BSRUcsUkQxNixESVNQMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tSU0lOQyxSRDE2LEV9fSwgICAgICAgIHt7IDB4NiwweEQsQjMwfFJTSU5DLFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNiwibW92LnciKSx7e0FCUzE2U1JDLFJEMTYsRX19LCAgICAge3sgMHg2LDB4QiwweDAsUkQxNixBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixESVNQMTZEU1QsRX19LCAgICB7eyAweDYsMHhGLERJU1BSRUd8QjMxLFJTMTYsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixSRERFQyxFfX0sICAgICAgICB7eyAweDYsMHhELFJEREVDfEIzMSxSUzE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LEFCUzE2RFNULEV9fSwgICAgIHt7IDB4NiwweEIsMHg4LFJTMTYsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNCwibW92LmwiKSx7e0lNTTMyLFJEMzIsRX19LCAgICAgICAge3sgMHg3LDB4QSwweDAsQjMwfFJEMzIsSU1NMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSwyLCJtb3YubCIpLHt7UlMzMixSRDMyLEV9fSwgICAgICAgICB7eyAweDAsMHhGLEIzMXxSUzMyLEIzMHxSRDMyLEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNCwibW92LmwiKSx7e1JTSU5ELFJEMzIsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4OSxSU0lORHxCMzAsQjMwfFJEMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tESVNQMTZTUkMsUkQzMixFfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEYsRElTUFJFR3xCMzAsQjMwfFJEMzIsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0RJU1B8TF8zMnxTUkMsUkQzMixFfX0se3sgUFJFRklYMzIsMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QiwweDIsQjMwfFJEMzIsU1JDfERJU1AzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7UlNJTkMsUkQzMixFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHhELEIzMHxSU0lOQyxCMzB8UkQzMixFLDAsMCwwLDAgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0FCUzE2U1JDLFJEMzIsRX19LCAgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDAsQjMwfFJEMzIsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7QUJTMzJTUkN8TUVNUkVMQVgsUkQzMixFIH19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4MixCMzB8UkQzMixTUkN8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsUkRJTkQsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4OSxSRElORHxCMzEsQjMwfFJTMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLERJU1AxNkRTVCxFfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEYsRElTUFJFR3xCMzEsQjMwfFJTMzIsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsRElTUHxMXzMyfERTVCxFfX0se3sgUFJFRklYMzIsMHg3LDB4OCxCMzF8RElTUFJFRywweDAsMHg2LDB4QiwweEEsQjMwfFJTMzIsRFNUfERJU1AzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixSRERFQyxFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHhELFJEREVDfEIzMSxCMzB8UlMzMixFLDAsMCwwLDAgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsQUJTMTZEU1QsRX19LCAgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDgsQjMwfFJTMzIsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixBQlMzMkRTVHxNRU1SRUxBWCxFIH19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4QSxCMzB8UlMzMixEU1R8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCi0KLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSwxMCwibW92ZnBlIikse3tBQlMxNlNSQyxSRDgsRX19LHt7IDB4NiwweEEsMHg0LFJEOCxBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksMTAsIm1vdnRwZSIpLHt7UlM4LEFCUzE2RFNULEV9fSx7eyAweDYsMHhBLDB4QyxSUzgsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotCi0gIE5FV19TT1AoTyhPX01VTFUsU0IpLDEsMTQsIm11bHh1LmIiKSx7e1JTOCxSRDE2LEV9fSwge3sgMHg1LDB4MCxSUzgsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgTkVXX1NPUChPKE9fTVVMVSxTVyksMCwxNCwibXVseHUudyIpLHt7UlMxNixSRDMyLEV9fSx7eyAweDUsMHgyLFJTMTYsQjMwfFJEMzIsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTVVMUyxTQiksMCwyMCwibXVseHMuYiIpLHt7UlM4LFJEMTYsRX19LCB7eyAweDAsMHgxLDB4YywweDAsMHg1LDB4MCxSUzgsUkQxNixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX01VTFMsU1cpLDAsMjAsIm11bHhzLnciKSx7e1JTMTYsUkQzMixFfX0se3sgMHgwLDB4MSwweGMsMHgwLDB4NSwweDIsUlMxNixCMzB8UkQzMixFfX1FT1AsCi0gIAotICAvKiA/Pz8gVGhpcyBjYW4gdXNlIFVOT1AzLiAgKi8KLSAgTkVXX1NPUChPKE9fTkVHLFNCKSwxLDIsIm5lZy5iIikse3sgT1I4LEUsIDB9fSx7eyAweDEsMHg3LDB4OCxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX05FRyxTVyksMCwyLCJuZWcudyIpLHt7IE9SMTYsRSwwfX0se3sgMHgxLDB4NywweDksT1IxNixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX05FRyxTTCksMCwyLCJuZWcubCIpLHt7IE9SMzIsRSwwfX0se3sgMHgxLDB4NywweEIsQjMwfE9SMzIsRX19RU9QLAotICAgIAotICBORVdfU09QKE8oT19OT1AsU04pLDEsMiwibm9wIikse3tFLDAsMH19LHt7IDB4MCwweDAsMHgwLDB4MCxFLDAsMCwwLDB9fUVPUCwKLQotICAvKiA/Pz8gVGhpcyBjYW4gdXNlIFVOT1AzLiAgKi8KLSAgTkVXX1NPUChPKE9fTk9ULFNCKSwxLDIsIm5vdC5iIikse3sgT1I4LEUsIDB9fSx7eyAweDEsMHg3LDB4MCxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX05PVCxTVyksMCwyLCJub3QudyIpLHt7IE9SMTYsRSwwfX0se3sgMHgxLDB4NywweDEsT1IxNixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX05PVCxTTCksMCwyLCJub3QubCIpLHt7IE9SMzIsRSwwfX0se3sgMHgxLDB4NywweDMsQjMwfE9SMzIsRX19RU9QLAotCi0gIFRXT09QKE8oT19PUiwgU0IpLCJvci5iIiwweEMsMHgxLDB4NCksCi0gIE5FV19TT1AoTyhPX09SLFNXKSwwLDQsIm9yLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHg0LFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fT1IsU1cpLDAsMiwib3IudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDYsMHg0LFJTMTYsUkQxNixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX09SLFNMKSwwLDYsIm9yLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg0LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19PUixTTCksMCwyLCJvci5sIikse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg0LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fT1JDLFNCKSwxLDIsIm9yYyIpLHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDQsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX09SQyxTQiksMSwyLCJvcmMiKSx7e0lNTTgsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NCxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLQotICBORVdfU09QKE8oT19NT1ZfVE9fUkVHLFNXKSwxLDYsInBvcC53Iikse3tPUjE2LEUsMH19LHt7IDB4NiwweEQsMHg3LE9SMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01PVl9UT19SRUcsU0wpLDAsNiwicG9wLmwiKSx7e09SMzIsRSwwfX0se3sgUFJFRklYMzIsMHg2LDB4RCwweDcsT1IzMnxCMzAsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01PVl9UT19NRU0sU1cpLDEsNiwicHVzaC53Iikse3tPUjE2LEUsMH19LHt7IDB4NiwweEQsMHhGLE9SMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01PVl9UT19NRU0sU0wpLDAsNiwicHVzaC5sIikse3tPUjMyLEUsMH19LHt7IFBSRUZJWDMyLDB4NiwweEQsMHhGLE9SMzJ8QjMwLEUsMCwwLDAsMH19RU9QLAotCi0gIFVOT1AzKE9fUk9UTCwgICJyb3RsIiwgMHgxLDB4MiwweDgpLAotICBVTk9QMyhPX1JPVFIsICAicm90ciIsIDB4MSwweDMsMHg4KSwKLSAgVU5PUDMoT19ST1RYTCwgInJvdHhsIiwweDEsMHgyLDB4MCksCi0gIFVOT1AzKE9fUk9UWFIsICJyb3R4ciIsMHgxLDB4MywweDApLAotCi0gIFNPUChPKE9fQlBULFNOKSwgIDEwLCJicHQiKSx7e0UsMCwwfX0se3sgMHg3LDB4QSwweEYsMHhGLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX1JURSxTTiksICAxMCwicnRlIikse3tFLDAsMH19LHt7IDB4NSwweDYsMHg3LDB4MCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19SVFMsU04pLCAgIDgsInJ0cyIpLHt7RSwwLDB9fSx7eyAweDUsMHg0LDB4NywweDAsRSwwLDAsMCwwfX1FT1AsCi0KLSAgVU5PUDMoT19TSEFMLCAgInNoYWwiLDB4MSwweDAsMHg4KSwKLSAgVU5PUDMoT19TSEFSLCAgInNoYXIiLDB4MSwweDEsMHg4KSwKLSAgVU5PUDMoT19TSExMLCAgInNobGwiLDB4MSwweDAsMHgwKSwKLSAgVU5PUDMoT19TSExSLCAgInNobHIiLDB4MSwweDEsMHgwKSwKLQotICBTT1AoTyhPX1NMRUVQLFNOKSwyLCJzbGVlcCIpLHt7RSwwLDB9fSx7eyAweDAsMHgxLDB4OCwweDAsRSwwLDAsMCwwfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksIDEsMiwic3RjIikse3tDQ1IsUkQ4LEV9fSx7eyAweDAsMHgyLDB4MCxSRDgsRSwwLDAsMCwwfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixSU0lORCxFfX0sICAgICAgICB7e1BSRUZJWExEQywweDYsMHg5LEIzMXxSRElORCwweDAsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLERJU1B8RFNUfExfMTYsRX19LHt7UFJFRklYTERDLDB4NiwweEYsQjMxfERJU1BSRUcsMCxEU1R8RElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLERJU1B8RFNUfExfMzIsRX19LHt7UFJFRklYTERDLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4QSwweDAsRFNUfERJU1AzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsUkRERUMsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4RCxCMzF8UkRERUMsMHgwLEV9fUVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsQUJTMTZTUkMsRX19LCAgICAge3tQUkVGSVhMREMsMHg2LDB4QiwweDgsMHgwLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLEFCUzMyU1JDLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHhBLDB4MCxEU1R8QUJTMzJMSVNULEV9fUVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLCAxLDIsInN0YyIpLHt7RVhSLFJEOCxFfX0se3sgMHgwLDB4MiwweDEsUkQ4LEUsMCwwLDAsMH19IEVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsUlNJTkQsRX19LCAgICAgICAge3sweDAsMHgxLDB4NCwweDEsMHg2LDB4OSxCMzF8UkRJTkQsMHgwLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixESVNQfERTVHxMXzE2LEV9fSx7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhGLEIzMXxESVNQUkVHLDAsRFNUfERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixESVNQfERTVHxMXzMyLEV9fSx7ezB4MCwweDEsMHg0LDB4MSwweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweEEsMHgwLERTVHxESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLFJEREVDLEV9fSwgICAgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEQsQjMxfFJEREVDLDB4MCxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLEFCUzE2U1JDLEV9fSwgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEIsMHg4LDB4MCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixBQlMzMlNSQyxFfX0sICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhCLDB4QSwweDAsRFNUfEFCUzMyTElTVCxFfX1FT1AsCi0KLSAgU09QKE8oT19TVUIsU0IpLDIsInN1Yi5iIikse3tSUzgsUkQ4LEV9fSx7eyAweDEsMHg4LFJTOCxSRDgsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1VCLFNXKSwxLDIsInN1Yi53Iikse3tSUzE2LFJEMTYsRSB9fSwgIHt7MHgxLDB4OSxSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1VCLFNXKSwwLDQsInN1Yi53Iikse3tJTU0xNixSRDE2LEUgfX0sIHt7MHg3LDB4OSwweDMsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19TVUIsU0wpLDAsMiwic3ViLmwiKSAse3tSUzMyLFJEMzIsRSB9fSwge3sweDEsMHhBLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NVQixTTCksMCw2LCJzdWIubCIpLCB7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHgzLEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotCi0gIFNPUChPKE9fU1VCUyxTTCksMiwic3VicyIpLHt7S0JJVCxSRFAsRX19LHt7IDB4MSwweEIsS0JJVCxSRFAsRSwwLDAsMCwwfX1FT1AsCi0gIFRXT09QKE8oT19TVUJYLFNCKSwic3VieCIsMHhCLDB4MSwweEUpLAotCi0gIE5FV19TT1AoTyhPX1RSQVBBLFNCKSwwLDIsInRyYXBhIikse3sgSU1NMixFfX0sICB7ezB4NSwweDcsSU1NMixJR05PUkUsRSAgfX1FT1AsCi0gIE5FV19TT1AoTyhPX1RBUyxTQiksMCwyLCJ0YXMiKSx7e1JTSU5ELEV9fSwgIHt7MHgwLDB4MSwweGUsMHgwLDB4NywweGIsQjMwfFJTSU5ELDB4YyxFICB9fUVPUCwKLQotICBUV09PUChPKE9fWE9SLCBTQiksInhvciIsMHhELDB4MSwweDUpLAotCi0gIE5FV19TT1AoTyhPX1hPUixTVyksMCw0LCJ4b3IudyIpLHt7SU1NMTYsUkQxNixFIH19LHt7MHg3LDB4OSwweDUsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICBORVdfU09QKE8oT19YT1IsU1cpLDAsMiwieG9yLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NSxSUzE2LFJEMTYsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19YT1IsU0wpLDAsNiwieG9yLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg1LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAotICBORVdfU09QKE8oT19YT1IsU0wpLDAsMiwieG9yLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg1LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgU09QKE8oT19YT1JDLFNCKSwyLCJ4b3JjIikse3tJTU04LENDUixFfX0se3sgMHgwLDB4NSxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19YT1JDLFNCKSwyLCJ4b3JjIikse3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDUsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fQ0xSTUFDLFNOKSwxLDIsImNscm1hYyIpLHt7RSwgMCwgMH19LHt7MHgwLDB4MSwweGEsMHgwLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX01BQyxTTCksMSwyLCJtYWMiKSx7e1JTSU5DLFJESU5DLEV9fSx7ezB4MCwweDEsMHg2LDB4MCwweDYsMHhkLEIzMHxSU0lOQyxCMzB8UkRJTkMsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fTERNQUMsU0wpLDEsMiwibGRtYWMiKSx7e1JTMzIsTUFDUkVHLEV9fSx7ezB4MCwweDMsTUFDUkVHLFJTMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1RNQUMsU0wpLDEsMiwic3RtYWMiKSx7e01BQ1JFRyxSRDMyLEV9fSx7ezB4MCwweDIsTUFDUkVHLFJEMzIsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fTERNLFNMKSwwLDYsImxkbS5sIikse3tSU0lOQywgUlMzMiwgRX19LHt7IDB4MCwweDEsSUdOT1JFLDB4MCwweDYsMHhELDB4NyxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVE0sU0wpLDAsNiwic3RtLmwiKSx7e1JTMzIsIFJEREVDLCBFfX0se3sweDAsMHgxLElHTk9SRSwweDAsMHg2LDB4RCwweEYsSUdOT1JFLEV9fUVPUCwKLSAgeyAwIH0KLX07Ci0jZWxzZQotZXh0ZXJuIHN0cnVjdCBoOF9vcGNvZGUgaDhfb3Bjb2Rlc1tdIDsKLSNlbmRpZgotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9ocHBhLmggYi9pbmNsdWRlL29wY29kZS9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDFmZjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsODQxICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBQQS1SSVNDLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIGFuZCBHREIsIHRoZSBHTlUgZGlzYXNzZW1ibGVyLgotCi1HQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUyBvciBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAhZGVmaW5lZChfX1NURENfXykgJiYgIWRlZmluZWQoY29uc3QpCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyoKLSAqIFN0cnVjdHVyZSBvZiBhbiBvcGNvZGUgdGFibGUgZW50cnkuCi0gKi8KLQotLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBkZWxheSBzbG90IG51bGxpZmljYXRpb246IG5vcm1hbCB3aGljaCBpcwotICogY29udHJvbGVkIGJ5IHRoZSBudWxsaWZpY2F0aW9uIGJpdCwgYW5kIGNvbmRpdGlvbmFsLCB3aGljaCBkZXBlbmRzCi0gKiBvbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBicmFuY2ggYW5kIGl0cyBzdWNjZXNzIG9yIGZhaWx1cmUuCi0gKgotICogTk9ORSBpcyB1bmZvcnR1bmF0ZWx5ICNkZWZpbmVkIGluIHRoZSBoaXV4IHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgCi0gKiAjdW5kZWYgaXQgYXdheS4KLSAqLwotI3VuZGVmIE5PTkUKLXN0cnVjdCBwYV9vcGNvZGUKLXsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHVuc2lnbmVkIGxvbmcgaW50IG1hdGNoOwkvKiBCaXRzIHRoYXQgbXVzdCBiZSBzZXQuLi4gICovCi0gICAgdW5zaWduZWQgbG9uZyBpbnQgbWFzazsJLyogLi4uIGluIHRoZXNlIGJpdHMuICovCi0gICAgY2hhciAqYXJnczsKLSAgICBlbnVtIHBhX2FyY2ggYXJjaDsKLSAgICBjaGFyIGZsYWdzOwotfTsKLQotLyogRW5hYmxlL2Rpc2FibGUgc3RyaWN0IHN5bnRheCBjaGVja2luZy4gIE5vdCBjdXJyZW50bHkgdXNlZCwgYnV0IHdpbGwKLSAgIGJlIG5lY2Vzc2FyeSBmb3IgUEEyLjAgc3VwcG9ydCBpbiB0aGUgZnV0dXJlLiAgKi8KLSNkZWZpbmUgRkxBR19TVFJJQ1QgMHgxCi0KLS8qCi0gICBBbGwgaHBwYSBvcGNvZGVzIGFyZSAzMiBiaXRzLgotCi0gICBUaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIG9uZSBjaGFyYWN0ZXIgZm9yIGVhY2ggb3BlcmFuZCBvZgotICAgdGhlIGluc3RydWN0aW9uLiAgQ2hhcmFjdGVycyB1c2VkIGFzIGEgcHJlZml4IGFsbG93IGFueSBzZWNvbmQgY2hhcmFjdGVyIHRvCi0gICBiZSB1c2VkIHdpdGhvdXQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgbWFpbiBvcGVyYW5kIGNoYXJhY3RlcnMuCi0KLSAgIEJpdCBwb3NpdGlvbnMgaW4gdGhpcyBkZXNjcmlwdGlvbiBmb2xsb3cgSFAgdXNhZ2Ugb2YgbHNiID0gMzEsCi0gICAiYXQiIGlzIGxzYiBvZiBmaWVsZC4KLQotICAgSW4gdGhlIGFyZ3MgZmllbGQsIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBtdXN0IG1hdGNoIGV4YWN0bHk6Ci0KLQknKywoKSAnCi0KLSAgIEluIHRoZSBhcmdzIGZpZWxkLCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIHVudXNlZDoKLQotCScgICIgICAmICAgICAtICAvICAgMzQgNjc4OTo7PCA+IEAnCi0JJyAgQyAgICAgICAgIE0gICAgICAgICAgICAgW1xdICAnCi0JJyAgICBlIGcgICAgbCAgICAgICAgICAgIHkgICB9ICcKLQotICAgSGVyZSBhcmUgYWxsIHRoZSBjaGFyYWN0ZXJzOgotCi0JJyAhIiMkJSYnKCkqKy0sLi8wMTIzNDU2Nzg5Ojs8PT4/QCcKLQknQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eXycKLQknYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+JwotCi1LaW5kcyBvZiBvcGVyYW5kczoKLSAgIHggICAgaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAxNS4KLSAgIGIgICAgaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAxMC4KLSAgIHQgICAgaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAzMS4KLSAgIGEJaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAxMCBhbmQgMTUgKGZvciBQRVJNSCkKLSAgIDUgICAgNSBiaXQgaW1tZWRpYXRlIGF0IDE1LgotICAgcyAgICAyIGJpdCBzcGFjZSBzcGVjaWZpZXIgYXQgMTcuCi0gICBTICAgIDMgYml0IHNwYWNlIHNwZWNpZmllciBhdCAxOC4KLSAgIFYgICAgNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBpICAgIDExIGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKLSAgIGogICAgMTQgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQotICAgayAgICAyMSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBuCW51bGxpZmljYXRpb24gZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMKLSAgIE4JbnVsbGlmaWNhdGlvbiBmb3Igc3BvcCBhbmQgY29wciBpbnN0cnVjdGlvbnMKLSAgIHcgICAgMTIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQKLSAgIFcgICAgMTcgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKFBDIHJlbGF0aXZlKQotICAgWCAgICAyMiBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudCAoUEMgcmVsYXRpdmUpCi0gICB6ICAgIDE3IGJpdCBicmFuY2ggZGlzcGxhY2VtZW50IChqdXN0IGEgbnVtYmVyLCBub3QgYW4gYWRkcmVzcykKLQotQWxzbyB0aGVzZToKLQotICAgLiAgICAyIGJpdCBzaGlmdCBhbW91bnQgYXQgMjUKLSAgICogICAgNCBiaXQgc2hpZnQgYW1vdW50IGF0IDI1Ci0gICBwICAgIDUgYml0IHNoaWZ0IGNvdW50IGF0IDI2ICh0byBzdXBwb3J0IHRoZSBTSEQgaW5zdHJ1Y3Rpb24pIGVuY29kZWQgYXMKLSAgICAgICAgMzEtcAotICAgfiAgICA2IGJpdCBzaGlmdCBjb3VudCBhdCAyMCwyMjoyNiBlbmNvZGVkIGFzIDYzLX4uCi0gICBQICAgIDUgYml0IGJpdCBwb3NpdGlvbiBhdCAyNgotICAgcSAgICA2IGJpdCBiaXQgcG9zaXRpb24gYXQgMjAsMjI6MjYKLSAgIFQgICAgNSBiaXQgZmllbGQgbGVuZ3RoIGF0IDMxIChlbmNvZGVkIGFzIDMyLVQpCi0gICAlCTYgYml0IGZpZWxkIGxlbmd0aCBhdCAyMywyNzozMSAodmFyaWFibGUgZXh0cmFjdC9kZXBvc2l0KQotICAgfAk2IGJpdCBmaWVsZCBsZW5ndGggYXQgMTksMjc6MzEgKGZpeGVkIGV4dHJhY3QvZGVwb3NpdCkKLSAgIEEgICAgMTMgYml0IGltbWVkaWF0ZSBhdCAxOCAodG8gc3VwcG9ydCB0aGUgQlJFQUsgaW5zdHJ1Y3Rpb24pCi0gICBeCWxpa2UgYiwgYnV0IGRlc2NyaWJlcyBhIGNvbnRyb2wgcmVnaXN0ZXIKLSAgICEgICAgc2FyIChjcjExKSByZWdpc3RlcgotICAgRCAgICAyNiBiaXQgaW1tZWRpYXRlIGF0IDMxICh0byBzdXBwb3J0IHRoZSBESUFHIGluc3RydWN0aW9uKQotICAgJCAgICA5IGJpdCBpbW1lZGlhdGUgYXQgMjggKHRvIHN1cHBvcnQgUE9QQlRTKQotCi0gICB2ICAgIDMgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBpZGVudGlmaWVyIGF0IDI1Ci0gICBPICAgIDIwIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTUgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICBvICAgIDE1IGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIGF0IDIwCi0gICAyICAgIDIyIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTcgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICAxICAgIDE1IGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTAgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICAwICAgIDEwIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gNSBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIHUgICAgMyBiaXQgY29wcm9jZXNzb3IgdW5pdCBpZGVudGlmaWVyIGF0IDI1Ci0gICBGICAgIFNvdXJjZSBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBDb21wbGV0ZXIgZW5jb2RlZCAyIGJpdHMgYXQgMjAKLSAgIEkgICAgU291cmNlIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDEgYml0cyBhdCAyMAotCShmb3IgMHhlIGZvcm1hdCBGUCBpbnN0cnVjdGlvbnMpCi0gICBHICAgIERlc3RpbmF0aW9uIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDIgYml0cyBhdCAxOAotICAgSCAgICBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBhdCAyNiBmb3IgJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicKLSAgICAgICAgKHZlcnkgc2ltaWxhciB0byAnRicpCi0KLSAgIHIJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxIChmb3IgdGhlIGJyZWFrIGluc3RydWN0aW9uKQotCSh2ZXJ5IHNpbWlsYXIgdG8gViBhYm92ZSwgZXhjZXB0IHRoZSB2YWx1ZSBpcyB1bnNpZ25lZCBpbnN0ZWFkIG9mCi0JbG93X3NpZ25fZXh0KQotICAgUgk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTUgKGZvciB0aGUgc3NtLCByc20sIHByb2JlaSBpbnN0cnVjdGlvbnMpCi0JKHNhbWUgYXMgciBhYm92ZSwgZXhjZXB0IHRoZSB2YWx1ZSBpcyBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbikKLSAgIFUJMTAgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAxNSAoZm9yIFNTTSwgUlNNIG9uIHBhMi4wKQotICAgUQk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTAgKGEgYml0IHBvc2l0aW9uIHNwZWNpZmllZCBpbgotCXRoZSBiYiBpbnN0cnVjdGlvbi4gSXQncyB0aGUgc2FtZSBhcyByIGFib3ZlLCBleGNlcHQgdGhlCi0gICAgICAgIHZhbHVlIGlzIGluIGEgZGlmZmVyZW50IGxvY2F0aW9uKQotICAgQgk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTAgKGEgYml0IHBvc2l0aW9uIHNwZWNpZmllZCBpbgotCXRoZSBiYiBpbnN0cnVjdGlvbi4gU2ltaWxhciB0byBRLCBidXQgNjRiaXQgaGFuZGxpbmcgaXMKLQlkaWZmZXJlbnQuCi0gICBaICAgICVyMSAtLSBpbXBsaWNpdCB0YXJnZXQgb2YgYWRkaWwgaW5zdHJ1Y3Rpb24uCi0gICBMICAgICwlcjIgY29tcGxldGVyIGZvciBuZXcgc3ludGF4IGJyYW5jaAotICAgeyAgICBTb3VyY2UgZm9ybWF0IGNvbXBsZXRlciBmb3IgZmNudgotICAgXyAgICBEZXN0aW5hdGlvbiBmb3JtYXQgY29tcGxldGVyIGZvciBmY252Ci0gICBoICAgIGNiaXQgZm9yIGZjbXAKLSAgID0gICAgZ2Z4IHRlc3RzIGZvciBmdGVzdAotICAgZCAgICAxNGJpdCBvZmZzZXQgZm9yIHNpbmdsZSBwcmVjaXNpb24gRlAgbG9uZyBsb2FkL3N0b3JlLgotICAgIyAgICAxNGJpdCBvZmZzZXQgZm9yIGRvdWJsZSBwcmVjaXNpb24gRlAgbG9hZCBsb25nL3N0b3JlLgotICAgSiAgICBZZXQgYW5vdGhlciAxNGJpdCBvZmZzZXQgd2l0aCBhbiB1bnVzdWFsIGVuY29kaW5nLgotICAgSyAgICBZZXQgYW5vdGhlciAxNGJpdCBvZmZzZXQgd2l0aCBhbiB1bnVzdWFsIGVuY29kaW5nLgotICAgWSAgICAlc3IwLCVyMzEgLS0gaW1wbGljaXQgdGFyZ2V0IG9mIGJlLGwgaW5zdHJ1Y3Rpb24uCi0gICBACWltcGxpY2l0IGltbWVkaWF0ZSB2YWx1ZSBvZiAwCi0KLUNvbXBsZXRlciBvcGVyYW5kcyBhbGwgaGF2ZSAnYycgYXMgdGhlIHByZWZpeDoKLQotICAgY3ggICBpbmRleGVkIGxvYWQgY29tcGxldGVyLgotICAgY20gICBzaG9ydCBsb2FkIGFuZCBzdG9yZSBjb21wbGV0ZXIuCi0gICBjcSAgIGxvbmcgbG9hZCBhbmQgc3RvcmUgY29tcGxldGVyIChsaWtlIGNtLCBidXQgaW5zZXJ0ZWQgaW50byBhCi0JZGlmZmVyZW50IGxvY2F0aW9uIGluIHRoZSB0YXJnZXQgaW5zdHJ1Y3Rpb24pLgotICAgY3MgICBzdG9yZSBieXRlcyBzaG9ydCBjb21wbGV0ZXIuCi0gICBjZSAgIGxvbmcgbG9hZC9zdG9yZSBjb21wbGV0ZXIgZm9yIExEVy9TVFcgd2l0aCBhIGRpZmZlcmVudCBlbmNvZGluZyB0aGFuIHRoZQotCW90aGVycwotICAgY2MgICBsb2FkIGNhY2hlIGNvbnRyb2wgaGludAotICAgY2QgICBsb2FkIGFuZCBjbGVhciBjYWNoZSBjb250cm9sIGhpbnQKLSAgIGNDICAgc3RvcmUgY2FjaGUgY29udHJvbCBoaW50Ci0gICBjbwlvcmRlcmVkIGFjY2VzcwotCi0gICBjcAlicmFuY2ggbGluayBhbmQgcHVzaCBjb21wbGV0ZXIKLSAgIGNQCWJyYW5jaCBwb3AgY29tcGxldGVyCi0gICBjbAlicmFuY2ggbGluayBjb21wbGV0ZXIKLSAgIGNnCWJyYW5jaCBnYXRlIGNvbXBsZXRlcgotCi0gICBjdwlyZWFkL3dyaXRlIGNvbXBsZXRlciBmb3IgUFJPQkUKLSAgIGNXCXdpZGUgY29tcGxldGVyIGZvciBNRkNUTAotICAgY0wJbG9jYWwgcHJvY2Vzc29yIGNvbXBsZXRlciBmb3IgY2FjaGUgY29udHJvbAotICAgY1ogICBTeXN0ZW0gQ29udHJvbCBDb21wbGV0ZXIgKHRvIHN1cHBvcnQgTFBBLCBMSEEsIGV0Yy4pCi0KLSAgIGNpCWNvcnJlY3Rpb24gY29tcGxldGVyIGZvciBEQ09SCi0gICBjYQlhZGQgY29tcGxldGVyCi0gICBjeQkzMiBiaXQgYWRkIGNhcnJ5IGNvbXBsZXRlcgotICAgY1kJNjQgYml0IGFkZCBjYXJyeSBjb21wbGV0ZXIKLSAgIGN2CXNpZ25lZCBvdmVyZmxvdyB0cmFwIGNvbXBsZXRlcgotICAgY3QJdHJhcCBvbiBjb25kaXRpb24gY29tcGxldGVyIGZvciBBRERJLCBTVUIKLSAgIGNUCXRyYXAgb24gY29uZGl0aW9uIGNvbXBsZXRlciBmb3IgVUFERENNCi0gICBjYgkzMiBiaXQgYm9ycm93IGNvbXBsZXRlciBmb3IgU1VCCi0gICBjQgk2NCBiaXQgYm9ycm93IGNvbXBsZXRlciBmb3IgU1VCCi0KLSAgIGNoCWxlZnQvcmlnaHQgaGFsZiBjb21wbGV0ZXIKLSAgIGNICXNpZ25lZC91bnNpZ25lZCBzYXR1cmF0aW9uIGNvbXBsZXRlcgotICAgY1MJc2lnbmVkL3Vuc2lnbmVkIGNvbXBsZXRlciBhdCAyMQotICAgYyoJcGVybXV0YXRpb24gY29tcGxldGVyCi0KLUNvbmRpdGlvbiBvcGVyYW5kcyBhbGwgaGF2ZSAnPycgYXMgdGhlIHByZWZpeDoKLQotICAgP2YgICBGbG9hdGluZyBwb2ludCBjb21wYXJlIGNvbmRpdGlvbnMgKGVuY29kZWQgYXMgNSBiaXRzIGF0IDMxKQotCi0gICA/YQlhZGQgY29uZGl0aW9ucwotICAgP0EJNjQgYml0IGFkZCBjb25kaXRpb25zCi0gICA/QCAgIGFkZCBicmFuY2ggY29uZGl0aW9ucyBmb2xsb3dlZCBieSBudWxsaWZ5Ci0gICA/ZAlub24tbmVnYXRlZCBhZGQgYnJhbmNoIGNvbmRpdGlvbnMKLSAgID9ECW5lZ2F0ZWQgYWRkIGJyYW5jaCBjb25kaXRpb25zCi0gICA/dwl3aWRlIG1vZGUgbm9uLW5lZ2F0ZWQgYWRkIGJyYW5jaCBjb25kaXRpb25zCi0gICA/Vwl3aWRlIG1vZGUgbmVnYXRlZCBhZGQgYnJhbmNoIGNvbmRpdGlvbnMKLQotICAgP3MgICBjb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbnMKLSAgID9TCTY0IGJpdCBjb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbnMKLSAgID90ICAgbm9uLW5lZ2F0ZWQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbmRpdGlvbnMKLSAgID9uICAgMzIgYml0IGNvbXBhcmUgYW5kIGJyYW5jaCBjb25kaXRpb25zIGZvbGxvd2VkIGJ5IG51bGxpZnkKLSAgID9OICAgNjQgYml0IGNvbXBhcmUgYW5kIGJyYW5jaCBjb25kaXRpb25zIGZvbGxvd2VkIGJ5IG51bGxpZnkKLSAgID9RCTY0IGJpdCBjb21wYXJlIGFuZCBicmFuY2ggY29uZGl0aW9ucyBmb3IgQ01QSUIgaW5zdHJ1Y3Rpb24KLQotICAgP2wgICBsb2dpY2FsIGNvbmRpdGlvbnMKLSAgID9MCTY0IGJpdCBsb2dpY2FsIGNvbmRpdGlvbnMKLQotICAgP2IgICBicmFuY2ggb24gYml0IGNvbmRpdGlvbnMKLSAgID9CCTY0IGJpdCBicmFuY2ggb24gYml0IGNvbmRpdGlvbnMKLQotICAgP3ggICBzaGlmdC9leHRyYWN0L2RlcG9zaXQgY29uZGl0aW9ucwotICAgP1gJNjQgYml0IHNoaWZ0L2V4dHJhY3QvZGVwb3NpdCBjb25kaXRpb25zCi0gICA/eSAgIHNoaWZ0L2V4dHJhY3QvZGVwb3NpdCBjb25kaXRpb25zIGZvbGxvd2VkIGJ5IG51bGxpZnkgZm9yIGNvbmRpdGlvbmFsCi0gICAgICAgIGJyYW5jaGVzCi0KLSAgID91ICAgdW5pdCBjb25kaXRpb25zCi0gICA/VSAgIDY0IGJpdCB1bml0IGNvbmRpdGlvbnMKLQotRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFsbCBoYXZlICdmJyBhcyBhIHByZWZpeDoKLQotICAgZnQJdGFyZ2V0IHJlZ2lzdGVyIGF0IDMxCi0gICBmVAl0YXJnZXQgcmVnaXN0ZXIgd2l0aCBML1IgaGFsdmVzIGF0IDMxCi0gICBmYQlvcGVyYW5kIDEgcmVnaXN0ZXIgYXQgMTAKLSAgIGZBICAgb3BlcmFuZCAxIHJlZ2lzdGVyIHdpdGggTC9SIGhhbHZlcyBhdCAxMAotICAgZlggICBTYW1lIGFzIGZBLCBleGNlcHQgcHJpbnRzIGEgc3BhY2UgYmVmb3JlIHJlZ2lzdGVyIGR1cmluZyBkaXNhc20KLSAgIGZiCW9wZXJhbmQgMiByZWdpc3RlciBhdCAxNQotICAgZkIgICBvcGVyYW5kIDIgcmVnaXN0ZXIgd2l0aCBML1IgaGFsdmVzIGF0IDE1Ci0gICBmQyAgIG9wZXJhbmQgMyByZWdpc3RlciB3aXRoIEwvUiBoYWx2ZXMgYXQgMTY6MTgsMjE6MjMKLSAgIGZlICAgTGlrZSBmVCwgYnV0IGVuY29kaW5nIGlzIGRpZmZlcmVudC4KLQotRmxvYXQgcmVnaXN0ZXJzIGZvciBmbXB5YWRkIGFuZCBmbXB5c3ViOgotCi0gICBmaQltdWx0IG9wZXJhbmQgMSByZWdpc3RlciBhdCAxMAotICAgZmoJbXVsdCBvcGVyYW5kIDIgcmVnaXN0ZXIgYXQgMTUKLSAgIGZrCW11bHQgdGFyZ2V0IHJlZ2lzdGVyIGF0IDIwCi0gICBmbAlhZGQvc3ViIG9wZXJhbmQgcmVnaXN0ZXIgYXQgMjUKLSAgIGZtCWFkZC9zdWIgdGFyZ2V0IHJlZ2lzdGVyIGF0IDMxCi0KLSovCi0KLQotLyogTGlzdCBvZiBjaGFyYWN0ZXJzIG5vdCB0byBwdXQgYSBzcGFjZSBhZnRlci4gIE5vdGUgdGhhdAotICAgIiwiIGlzIGluY2x1ZGVkLCBhcyB0aGUgInNwb3BOIiBvcGVyYXRpb25zIHVzZSBsaXRlcmFsCi0gICBjb21tYXMgaW4gdGhlaXIgY29tcGxldGVyIHNlY3Rpb25zLiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbXBsZXRlcl9jaGFycyA9ICIsQ2NZPD4/IUArJlV+RmZHSElObk9vWk1hZHV8Lz0wMTIzJWUkbX0iOwotCi0vKiBUaGUgb3JkZXIgb2YgdGhlIG9wY29kZXMgaW4gdGhpcyB0YWJsZSBpcyBzaWduaWZpY2FudDoKLQotICAgKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0IGJlCi0gICBjb25zZWN1dGl2ZS4gIElmIHRoZXkgYXJlbid0LCB0aGUgYXNzZW1ibGVyIHdpbGwgYm9tYiBhdCBydW50aW1lLgotCi0gICAqIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIG5vdCBjYXJlIGFib3V0IHRoZSBvcmRlciBvZiB0aGUgb3Bjb2Rlcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGFfb3Bjb2RlIHBhX29wY29kZXNbXSA9Ci17Ci0KLS8qIHBzZXVkby1pbnN0cnVjdGlvbnMgKi8KLQoteyAibGRpIiwJMHgzNDAwMDAwMCwgMHhmZmUwYzAwMCwgImoseCIsIHBhMTAsIDB9LC8qIGxkbyB2YWwocjApLHIgKi8KLQoteyAiY2FsbCIsCTB4ZTgwMGYwMDAsIDB4ZmMxZmZmZmQsICJuKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiY2FsbCIsCTB4ZTgwMGEwMDAsIDB4ZmZlMGUwMDAsICJuVyIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInJldCIsCTB4ZTg0MGQwMDAsIDB4ZmZmZmZmZmQsICJuIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAotCi17ICJjbXBpYiIsIAkweGVjMDAwMDAwLCAweGZjMDAwMDAwLCAiP1FuNSxiLHciLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJjbXBpYiIsIAkweDg0MDAwMDAwLCAweGY0MDAwMDAwLCAiP25uNSxiLHciLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjb21pYiIsIAkweDg0MDAwMDAwLCAweGZjMDAwMDAwLCAiP25uNSxiLHciLCBwYTEwLCAwfSwgLyogY29taWJ7dGZ9Ki8KLS8qIFRoaXMgZW50cnkgaXMgZm9yIHRoZSBkaXNhc3NlbWJsZXIgb25seS4gIEl0IHdpbGwgbmV2ZXIgYmUgdXNlZCBieQotICAgYXNzZW1ibGVyLiAgKi8KLXsgImNvbWliIiwgCTB4OGMwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bm41LGIsdyIsIHBhMTAsIDB9LCAvKiBjb21pYnt0Zn0qLwoteyAiY21wYiIsCTB4OWMwMDAwMDAsIDB4ZGMwMDAwMDAsICI/Tm54LGIsdyIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImNtcGIiLAkweDgwMDAwMDAwLCAweGY0MDAwMDAwLCAiP25ueCxiLHciLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjb21iIiwJMHg4MDAwMDAwMCwgMHhmYzAwMDAwMCwgIj9ubngsYix3IiwgcGExMCwgMH0sIC8qIGNvbWJ7dGZ9ICovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJjb21iIiwJMHg4ODAwMDAwMCwgMHhmYzAwMDAwMCwgIj9ubngsYix3IiwgcGExMCwgMH0sIC8qIGNvbWJ7dGZ9ICovCi17ICJhZGRiIiwJMHhhMDAwMDAwMCwgMHhmNDAwMDAwMCwgIj9XbngsYix3IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkYiIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/QG54LGIsdyIsIHBhMTAsIDB9LCAvKiBhZGRie3RmfSAqLwotLyogVGhpcyBlbnRyeSBpcyBmb3IgdGhlIGRpc2Fzc2VtYmxlciBvbmx5LiAgSXQgd2lsbCBuZXZlciBiZSB1c2VkIGJ5Ci0gICBhc3NlbWJsZXIuICAqLwoteyAiYWRkYiIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsICI/QG54LGIsdyIsIHBhMTAsIDB9LAoteyAiYWRkaWIiLAkweGE0MDAwMDAwLCAweGY0MDAwMDAwLCAiP1duNSxiLHciLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJhZGRpYiIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsICI/QG41LGIsdyIsIHBhMTAsIDB9LCAvKiBhZGRpYnt0Zn0qLwotLyogVGhpcyBlbnRyeSBpcyBmb3IgdGhlIGRpc2Fzc2VtYmxlciBvbmx5LiAgSXQgd2lsbCBuZXZlciBiZSB1c2VkIGJ5Ci0gICBhc3NlbWJsZXIuICAqLwoteyAiYWRkaWIiLAkweGFjMDAwMDAwLCAweGZjMDAwMDAwLCAiP0BuNSxiLHciLCBwYTEwLCAwfSwgLyogYWRkaWJ7dGZ9Ki8KLXsgIm5vcCIsICAgICAgICAweDA4MDAwMjQwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sICAgICAgLyogb3IgMCwwLDAgKi8KLXsgImNvcHkiLCAgICAgICAweDA4MDAwMjQwLCAweGZmZTBmZmUwLCAieCx0IiwgcGExMCwgMH0sICAgLyogb3IgciwwLHQgKi8KLXsgIm10c2FyIiwgICAgICAweDAxNjAxODQwLCAweGZmZTBmZmZmLCAieCIsIHBhMTAsIDB9LCAvKiBtdGN0bCByLGNyMTEgKi8KLQotLyogTG9hZHMgYW5kIFN0b3JlcyBmb3IgaW50ZWdlciByZWdpc3RlcnMuICAqLwotCi17ICJsZGQiLAkweDBjMDAxMGUwLCAweGZjMWYzM2UwLCAiY29jY0AocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkIiwJMHgwYzAwMTBlMCwgMHhmYzFmMzNlMCwgImNvY2NAKGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGQiLCAgICAgICAgMHgwYzAwMDBjMCwgMHhmYzAwMTNjMCwgImN4Y2N4KHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsICAgICAgICAweDBjMDAwMGMwLCAweGZjMDAxM2MwLCAiY3hjY3goYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsCTB4MGMwMDEwYzAsIDB4ZmMwMDEzYzAsICJjbWNjNShzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGQiLAkweDBjMDAxMGMwLCAweGZjMDAxM2MwLCAiY21jYzUoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsICAgICAgICAweDUwMDAwMDAwLCAweGZjMDAwMDAyLCAiY3EjKHMsYikseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsICAgICAgICAweDUwMDAwMDAwLCAweGZjMDAwMDAyLCAiY3EjKGIpLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLCAgICAgICAgMHgwYzAwMDA4MCwgMHhmYzAwMTNjMCwgImN4Y2N4KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDBjMDAwMDgwLCAweGZjMDAxM2MwLCAiY3hjY3goYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsCTB4MGMwMDEwYTAsIDB4ZmMxZjMzZTAsICJjb2NjQChzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLAkweDBjMDAxMGEwLCAweGZjMWYzM2UwLCAiY29jY0AoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsCTB4MGMwMDEwODAsIDB4ZmMwMDEzYzAsICJjbWNjNShzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLAkweDBjMDAxMDgwLCAweGZjMDAxM2MwLCAiY21jYzUoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiY2VKKHMsYikseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiY2VKKGIpLHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLCAgICAgICAgMHg1YzAwMDAwNCwgMHhmYzAwMDAwNiwgImNlSyhzLGIpLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLCAgICAgICAgMHg1YzAwMDAwNCwgMHhmYzAwMDAwNiwgImNlSyhiKSx4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4NDgwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTAsIDB9LAoteyAibGR3IiwgICAgICAgIDB4NDgwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTAsIDB9LAoteyAibGR3IiwgICAgICAgIDB4NDgwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKGIpLHgiLCBwYTEwLCAwfSwKLXsgImxkaCIsICAgICAgICAweDBjMDAwMDQwLCAweGZjMDAxM2MwLCAiY3hjY3gocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRoIiwgICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDEzYzAsICJjeGNjeChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRoIiwJMHgwYzAwMTA2MCwgMHhmYzFmMzNlMCwgImNvY2NAKHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkaCIsCTB4MGMwMDEwNjAsIDB4ZmMxZjMzZTAsICJjb2NjQChiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRoIiwJMHgwYzAwMTA0MCwgMHhmYzAwMTNjMCwgImNtY2M1KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkaCIsCTB4MGMwMDEwNDAsIDB4ZmMwMDEzYzAsICJjbWNjNShiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRoIiwgICAgICAgIDB4NDQwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTAsIDB9LAoteyAibGRoIiwgICAgICAgIDB4NDQwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKGIpLHgiLCBwYTEwLCAwfSwKLXsgImxkYiIsICAgICAgICAweDBjMDAwMDAwLCAweGZjMDAxM2MwLCAiY3hjY3gocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRiIiwgICAgICAgIDB4MGMwMDAwMDAsIDB4ZmMwMDEzYzAsICJjeGNjeChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRiIiwJMHgwYzAwMTAyMCwgMHhmYzFmMzNlMCwgImNvY2NAKHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkYiIsCTB4MGMwMDEwMjAsIDB4ZmMxZjMzZTAsICJjb2NjQChiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRiIiwJMHgwYzAwMTAwMCwgMHhmYzAwMTNjMCwgImNtY2M1KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkYiIsCTB4MGMwMDEwMDAsIDB4ZmMwMDEzYzAsICJjbWNjNShiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRiIiwgICAgICAgIDB4NDAwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTAsIDB9LAoteyAibGRiIiwgICAgICAgIDB4NDAwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKGIpLHgiLCBwYTEwLCAwfSwKLXsgInN0ZCIsCTB4MGMwMDEyZTAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGQiLAkweDBjMDAxMmUwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZCIsCTB4MGMwMDEyYzAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGQiLAkweDBjMDAxMmMwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZCIsICAgICAgICAweDcwMDAwMDAwLCAweGZjMDAwMDAyLCAiY3F4LCMocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZCIsICAgICAgICAweDcwMDAwMDAwLCAweGZjMDAwMDAyLCAiY3F4LCMoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLAkweDBjMDAxMmEwLCAweGZjMDAxM2ZmLCAiY29jQ3gsQChzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwJMHgwYzAwMTJhMCwgMHhmYzAwMTNmZiwgImNvY0N4LEAoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLAkweDBjMDAxMjgwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwJMHgwYzAwMTI4MCwgMHhmYzAwMTNjMCwgImNtY0N4LFYoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLCAgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgImNleCxKKHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLCAgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgImNleCxKKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwgICAgICAgIDB4N2MwMDAwMDQsIDB4ZmMwMDAwMDYsICJjZXgsSyhzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwgICAgICAgIDB4N2MwMDAwMDQsIDB4ZmMwMDAwMDYsICJjZXgsSyhiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsICAgICAgICAweDY4MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0dyIsICAgICAgICAweDY4MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMCwgMH0sCi17ICJzdGgiLAkweDBjMDAxMjYwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RoIiwJMHgwYzAwMTI2MCwgMHhmYzAwMzNmZiwgImNvY0N4LEAoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGgiLAkweDBjMDAxMjQwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3RoIiwJMHgwYzAwMTI0MCwgMHhmYzAwMTNjMCwgImNtY0N4LFYoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdGgiLCAgICAgICAgMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMCwgMH0sCi17ICJzdGgiLCAgICAgICAgMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTAsIDB9LAoteyAic3RiIiwJMHgwYzAwMTIyMCwgMHhmYzAwMzNmZiwgImNvY0N4LEAocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YiIsCTB4MGMwMDEyMjAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RiIiwJMHgwYzAwMTIwMCwgMHhmYzAwMTNjMCwgImNtY0N4LFYocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YiIsCTB4MGMwMDEyMDAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3RiIiwgICAgICAgIDB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTAsIDB9LAoteyAic3RiIiwgICAgICAgIDB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwLCAwfSwKLXsgImxkd20iLCAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwLCAwfSwKLXsgImxkd20iLCAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMCwgMH0sCi17ICJzdHdtIiwgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMCwgMH0sCi17ICJzdHdtIiwgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTAsIDB9LAoteyAibGR3eCIsICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDFmYzAsICJjeHgocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZHd4IiwgICAgICAgMHgwYzAwMDA4MCwgMHhmYzAwMWZjMCwgImN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJsZGh4IiwgICAgICAgMHgwYzAwMDA0MCwgMHhmYzAwMWZjMCwgImN4eChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkaHgiLCAgICAgICAweDBjMDAwMDQwLCAweGZjMDAxZmMwLCAiY3h4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkYngiLCAgICAgICAweDBjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3h4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGRieCIsICAgICAgIDB4MGMwMDAwMDAsIDB4ZmMwMDFmYzAsICJjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAibGR3YSIsICAgICAgIDB4MGMwMDAxODAsIDB4ZmMwMGQzYzAsICJjeGNjeChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3YSIsCTB4MGMwMDExODAsIDB4ZmMwMGQzYzAsICJjbWNjNShiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjdyIsICAgICAgIDB4MGMwMDAxYzAsIDB4ZmMwMDEzYzAsICJjeGNkeChzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGN3IiwgICAgICAgMHgwYzAwMDFjMCwgMHhmYzAwMTNjMCwgImN4Y2R4KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGN3IiwJMHgwYzAwMTFjMCwgMHhmYzAwMTNjMCwgImNtY2Q1KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY3ciLAkweDBjMDAxMWMwLCAweGZjMDAxM2MwLCAiY21jZDUoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0d2EiLAkweDBjMDAxM2EwLCAweGZjMDBkM2ZmLCAiY29jQ3gsQChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0d2EiLAkweDBjMDAxMzgwLCAweGZjMDBkM2MwLCAiY21jQ3gsVihiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YnkiLAkweDBjMDAxMzAwLCAweGZjMDAxM2MwLCAiY3NjQ3gsVihzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3RieSIsCTB4MGMwMDEzMDAsIDB4ZmMwMDEzYzAsICJjc2NDeCxWKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkYSIsICAgICAgIDB4MGMwMDAxMDAsIDB4ZmMwMGQzYzAsICJjeGNjeChiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkYSIsCTB4MGMwMDExMDAsIDB4ZmMwMGQzYzAsICJjbWNjNShiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjZCIsICAgICAgIDB4MGMwMDAxNDAsIDB4ZmMwMDEzYzAsICJjeGNkeChzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGNkIiwgICAgICAgMHgwYzAwMDE0MCwgMHhmYzAwMTNjMCwgImN4Y2R4KGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGNkIiwJMHgwYzAwMTE0MCwgMHhmYzAwMTNjMCwgImNtY2Q1KHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY2QiLAkweDBjMDAxMTQwLCAweGZjMDAxM2MwLCAiY21jZDUoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZGEiLAkweDBjMDAxM2UwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkYSIsCTB4MGMwMDEzZTAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkYSIsCTB4MGMwMDEzYzAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGRhIiwJMHgwYzAwMTNjMCwgMHhmYzAwMTNjMCwgImNtY0N4LFYoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZHdheCIsICAgICAgMHgwYzAwMDE4MCwgMHhmYzAwZGZjMCwgImN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJsZGN3eCIsICAgICAgMHgwYzAwMDFjMCwgMHhmYzAwMWZjMCwgImN4eChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkY3d4IiwgICAgICAweDBjMDAwMWMwLCAweGZjMDAxZmMwLCAiY3h4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkd3MiLAkweDBjMDAxMDgwLCAweGZjMDAxZmMwLCAiY201KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGR3cyIsCTB4MGMwMDEwODAsIDB4ZmMwMDFmYzAsICJjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAibGRocyIsCTB4MGMwMDEwNDAsIDB4ZmMwMDFmYzAsICJjbTUocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZGhzIiwJMHgwYzAwMTA0MCwgMHhmYzAwMWZjMCwgImNtNShiKSx0IiwgcGExMCwgMH0sCi17ICJsZGJzIiwJMHgwYzAwMTAwMCwgMHhmYzAwMWZjMCwgImNtNShzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkYnMiLAkweDBjMDAxMDAwLCAweGZjMDAxZmMwLCAiY201KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkd2FzIiwJMHgwYzAwMTE4MCwgMHhmYzAwZGZjMCwgImNtNShiKSx0IiwgcGExMCwgMH0sCi17ICJsZGN3cyIsCTB4MGMwMDExYzAsIDB4ZmMwMDFmYzAsICJjbTUocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZGN3cyIsCTB4MGMwMDExYzAsIDB4ZmMwMDFmYzAsICJjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAic3R3cyIsCTB4MGMwMDEyODAsIDB4ZmMwMDFmYzAsICJjbXgsVihzLGIpIiwgcGExMCwgMH0sCi17ICJzdHdzIiwJMHgwYzAwMTI4MCwgMHhmYzAwMWZjMCwgImNteCxWKGIpIiwgcGExMCwgMH0sCi17ICJzdGhzIiwJMHgwYzAwMTI0MCwgMHhmYzAwMWZjMCwgImNteCxWKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0aHMiLAkweDBjMDAxMjQwLCAweGZjMDAxZmMwLCAiY214LFYoYikiLCBwYTEwLCAwfSwKLXsgInN0YnMiLAkweDBjMDAxMjAwLCAweGZjMDAxZmMwLCAiY214LFYocyxiKSIsIHBhMTAsIDB9LAoteyAic3RicyIsCTB4MGMwMDEyMDAsIDB4ZmMwMDFmYzAsICJjbXgsVihiKSIsIHBhMTAsIDB9LAoteyAic3R3YXMiLAkweDBjMDAxMzgwLCAweGZjMDBkZmMwLCAiY214LFYoYikiLCBwYTEwLCAwfSwKLXsgInN0ZGJ5IiwJMHgwYzAwMTM0MCwgMHhmYzAwMTNjMCwgImNzY0N4LFYocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZGJ5IiwJMHgwYzAwMTM0MCwgMHhmYzAwMTNjMCwgImNzY0N4LFYoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGJ5cyIsCTB4MGMwMDEzMDAsIDB4ZmMwMDFmYzAsICJjc3gsVihzLGIpIiwgcGExMCwgMH0sCi17ICJzdGJ5cyIsCTB4MGMwMDEzMDAsIDB4ZmMwMDFmYzAsICJjc3gsVihiKSIsIHBhMTAsIDB9LAotCi0vKiBJbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsgImxkbyIsCTB4MzQwMDAwMDAsIDB4ZmMwMGMwMDAsICJqKGIpLHgiLCBwYTEwLCAwfSwKLXsgImxkaWwiLAkweDIwMDAwMDAwLCAweGZjMDAwMDAwLCAiayxiIiwgcGExMCwgMH0sCi17ICJhZGRpbCIsCTB4MjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJrLGIsWiIsIHBhMTAsIDB9LAoteyAiYWRkaWwiLAkweDI4MDAwMDAwLCAweGZjMDAwMDAwLCAiayxiIiwgcGExMCwgMH0sCi0KLS8qIEJyYW5jaGluZyBpbnN0cnVjdGlvbnMuICovCi17ICJiIiwJCTB4ZTgwMDgwMDAsIDB4ZmMwMGUwMDAsICJjcG5YTCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImIiLAkJMHhlODAwYTAwMCwgMHhmYzAwZTAwMCwgImNsblhMIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYiIsCQkweGU4MDAwMDAwLCAweGZjMDBlMDAwLCAiY2xuVyxiIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiYiIsCQkweGU4MDAyMDAwLCAweGZjMDBlMDAwLCAiY2duVyxiIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiYiIsCQkweGU4MDAwMDAwLCAweGZmZTBlMDAwLCAiblciLCBwYTEwLCAwfSwgIC8qIGIsbCBmb28scjAgKi8KLXsgImJsIiwJCTB4ZTgwMDAwMDAsIDB4ZmMwMGUwMDAsICJuVyxiIiwgcGExMCwgMH0sCi17ICJnYXRlIiwJMHhlODAwMjAwMCwgMHhmYzAwZTAwMCwgIm5XLGIiLCBwYTEwLCAwfSwKLXsgImJsciIsCTB4ZTgwMDQwMDAsIDB4ZmMwMGUwMDEsICJueCxiIiwgcGExMCwgMH0sCi17ICJidiIsCQkweGU4MDBjMDAwLCAweGZjMDBmZmZkLCAibngoYikiLCBwYTEwLCAwfSwKLXsgImJ2IiwJCTB4ZTgwMGMwMDAsIDB4ZmMwMGZmZmQsICJuKGIpIiwgcGExMCwgMH0sCi17ICJidmUiLAkweGU4MDBmMDAxLCAweGZjMWZmZmZkLCAiY3BuKGIpTCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImJ2ZSIsCTB4ZTgwMGYwMDAsIDB4ZmMxZmZmZmQsICJjbG4oYilMIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYnZlIiwJMHhlODAwZDAwMSwgMHhmYzFmZmZmZCwgImNQbihiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImJ2ZSIsCTB4ZTgwMGQwMDAsIDB4ZmMxZmZmZmQsICJuKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYmUiLAkJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwgImNsbnooUyxiKSxZIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiYmUiLAkJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwgImNsbnooYiksWSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImJlIiwJCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsICJueihTLGIpIiwgcGExMCwgMH0sCi17ICJiZSIsCQkweGUwMDAwMDAwLCAweGZjMDAwMDAwLCAibnooYikiLCBwYTEwLCAwfSwKLXsgImJsZSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJueihTLGIpIiwgcGExMCwgMH0sCi17ICJtb3ZiIiwJMHhjODAwMDAwMCwgMHhmYzAwMDAwMCwgIj95bngsYix3IiwgcGExMCwgMH0sCi17ICJtb3ZpYiIsCTB4Y2MwMDAwMDAsIDB4ZmMwMDAwMDAsICI/eW41LGIsdyIsIHBhMTAsIDB9LAoteyAiY29tYnQiLAkweDgwMDAwMDAwLCAweGZjMDAwMDAwLCAiP3RueCxiLHciLCBwYTEwLCAwfSwKLXsgImNvbWJmIiwJMHg4ODAwMDAwMCwgMHhmYzAwMDAwMCwgIj90bngsYix3IiwgcGExMCwgMH0sCi17ICJjb21pYnQiLAkweDg0MDAwMDAwLCAweGZjMDAwMDAwLCAiP3RuNSxiLHciLCBwYTEwLCAwfSwKLXsgImNvbWliZiIsCTB4OGMwMDAwMDAsIDB4ZmMwMDAwMDAsICI/dG41LGIsdyIsIHBhMTAsIDB9LAoteyAiYWRkYnQiLAkweGEwMDAwMDAwLCAweGZjMDAwMDAwLCAiP2RueCxiLHciLCBwYTEwLCAwfSwKLXsgImFkZGJmIiwJMHhhODAwMDAwMCwgMHhmYzAwMDAwMCwgIj9kbngsYix3IiwgcGExMCwgMH0sCi17ICJhZGRpYnQiLAkweGE0MDAwMDAwLCAweGZjMDAwMDAwLCAiP2RuNSxiLHciLCBwYTEwLCAwfSwKLXsgImFkZGliZiIsCTB4YWMwMDAwMDAsIDB4ZmMwMDAwMDAsICI/ZG41LGIsdyIsIHBhMTAsIDB9LAoteyAiYmIiLAkJMHhjMDAwNjAwMCwgMHhmZmUwNjAwMCwgIj9CbngsISx3IiwgcGEyMCwgRkxBR19TVFJJQ1R9LCAKLXsgImJiIiwJCTB4YzQwMDQwMDAsIDB4ZmMwMDQwMDAsICI/Qm54LEIsdyIsIHBhMjAsIEZMQUdfU1RSSUNUfSwgCi17ICJiYiIsCQkweGMwMDA0MDAwLCAweGZmZTA2MDAwLCAiP2JueCwhLHciLCBwYTEwLCBGTEFHX1NUUklDVH0sIAoteyAiYmIiLAkJMHhjNDAwNDAwMCwgMHhmYzAwNDAwMCwgIj9ibngsUSx3IiwgcGExMCwgMH0sIAoteyAiYnZiIiwJMHhjMDAwNDAwMCwgMHhmZmUwNDAwMCwgIj9ibngsdyIsIHBhMTAsIDB9LAoteyAiY2xyYnRzIiwJMHhlODAwNDAwNSwgMHhmZmZmZmZmZiwgIiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBvcGJ0cyIsCTB4ZTgwMDQwMDUsIDB4ZmZmZmYwMDcsICIkIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicHVzaG5vbSIsCTB4ZTgwMDQwMDEsIDB4ZmZmZmZmZmYsICIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwdXNoYnRzIiwJMHhlODAwNDAwMSwgMHhmZmUwZmZmZiwgIngiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi0KLS8qIENvbXB1dGF0aW9uIEluc3RydWN0aW9ucyAqLwotCi17ICJjbXBjbHIiLCAgICAgMHgwODAwMDhhMCwgMHhmYzAwMGZlMCwgIj9TeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJjbXBjbHIiLCAgICAgMHgwODAwMDg4MCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjb21jbHIiLCAgICAgMHgwODAwMDg4MCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgIm9yIiwgICAgICAgICAweDA4MDAwMjYwLCAweGZjMDAwZmUwLCAiP0x4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm9yIiwgICAgICAgICAweDA4MDAwMjQwLCAweGZjMDAwZmUwLCAiP2x4LGIsdCIsIHBhMTAsIDB9LAoteyAieG9yIiwgICAgICAgIDB4MDgwMDAyYTAsIDB4ZmMwMDBmZTAsICI/THgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAieG9yIiwgICAgICAgIDB4MDgwMDAyODAsIDB4ZmMwMDBmZTAsICI/bHgsYix0IiwgcGExMCwgMH0sCi17ICJhbmQiLCAgICAgICAgMHgwODAwMDIyMCwgMHhmYzAwMGZlMCwgIj9MeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJhbmQiLCAgICAgICAgMHgwODAwMDIwMCwgMHhmYzAwMGZlMCwgIj9seCxiLHQiLCBwYTEwLCAwfSwKLXsgImFuZGNtIiwgICAgICAweDA4MDAwMDIwLCAweGZjMDAwZmUwLCAiP0x4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImFuZGNtIiwgICAgICAweDA4MDAwMDAwLCAweGZjMDAwZmUwLCAiP2x4LGIsdCIsIHBhMTAsIDB9LAoteyAidXhvciIsICAgICAgIDB4MDgwMDAzYTAsIDB4ZmMwMDBmZTAsICI/VXgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAidXhvciIsICAgICAgIDB4MDgwMDAzODAsIDB4ZmMwMDBmZTAsICI/dXgsYix0IiwgcGExMCwgMH0sCi17ICJ1YWRkY20iLCAgICAgMHgwODAwMDlhMCwgMHhmYzAwMGZhMCwgImNUP1V4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInVhZGRjbSIsICAgICAweDA4MDAwOTgwLCAweGZjMDAwZmEwLCAiY1Q/dXgsYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAidWFkZGNtIiwgICAgIDB4MDgwMDA5ODAsIDB4ZmMwMDBmZTAsICI/dXgsYix0IiwgcGExMCwgMH0sCi17ICJ1YWRkY210IiwgICAgMHgwODAwMDljMCwgMHhmYzAwMGZlMCwgIj91eCxiLHQiLCBwYTEwLCAwfSwKLXsgImRjb3IiLCAgICAgICAweDA4MDAwYmEwLCAweGZjMWYwZmEwLCAiY2k/VWIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImRjb3IiLCAgICAgICAweDA4MDAwYjgwLCAweGZjMWYwZmEwLCAiY2k/dWIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImRjb3IiLCAgICAgICAweDA4MDAwYjgwLCAweGZjMWYwZmUwLCAiP3ViLHQiLCAgIHBhMTAsIDB9LAoteyAiaWRjb3IiLCAgICAgIDB4MDgwMDBiYzAsIDB4ZmMxZjBmZTAsICI/dWIsdCIsICAgcGExMCwgMH0sCi17ICJhZGRpIiwgICAgICAgMHhiMDAwMDAwMCwgMHhmYzAwMDAwMCwgImN0P2FpLGIseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZGkiLCAgICAgICAweGI0MDAwMDAwLCAweGZjMDAwMDAwLCAiY3Y/YWksYix4IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkaSIsICAgICAgIDB4YjQwMDAwMDAsIDB4ZmMwMDA4MDAsICI/YWksYix4IiwgcGExMCwgMH0sCi17ICJhZGRpbyIsICAgICAgMHhiNDAwMDgwMCwgMHhmYzAwMDgwMCwgIj9haSxiLHgiLCBwYTEwLCAwfSwKLXsgImFkZGl0IiwgICAgICAweGIwMDAwMDAwLCAweGZjMDAwODAwLCAiP2FpLGIseCIsIHBhMTAsIDB9LAoteyAiYWRkaXRvIiwgICAgIDB4YjAwMDA4MDAsIDB4ZmMwMDA4MDAsICI/YWksYix4IiwgcGExMCwgMH0sCi17ICJhZGQiLCAgICAgICAgMHgwODAwMDcyMCwgMHhmYzAwMDdlMCwgImNZP0F4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZCIsICAgICAgICAweDA4MDAwNzAwLCAweGZjMDAwN2UwLCAiY3k/YXgsYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkIiwgICAgICAgIDB4MDgwMDAyMjAsIDB4ZmMwMDAzZTAsICJjYT9BeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJhZGQiLCAgICAgICAgMHgwODAwMDIwMCwgMHhmYzAwMDNlMCwgImNhP2F4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZCIsICAgICAgICAweDA4MDAwNjAwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAiYWRkbCIsICAgICAgIDB4MDgwMDBhMDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJhZGRvIiwgICAgICAgMHgwODAwMGUwMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgImFkZGMiLCAgICAgICAweDA4MDAwNzAwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAiYWRkY28iLCAgICAgIDB4MDgwMDBmMDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzdWIiLCAgICAgICAgMHgwODAwMDRlMCwgMHhmYzAwMDdlMCwgImN0P1N4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNGMwLCAweGZjMDAwN2UwLCAiY3Q/c3gsYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA1MjAsIDB4ZmMwMDA3ZTAsICJjQj9TeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdWIiLCAgICAgICAgMHgwODAwMDUwMCwgMHhmYzAwMDdlMCwgImNiP3N4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNDIwLCAweGZjMDAwN2UwLCAiY3Y/U3gsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA0MDAsIDB4ZmMwMDA3ZTAsICJjdj9zeCxiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdWIiLCAgICAgICAgMHgwODAwMDQwMCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgInN1Ym8iLCAgICAgICAweDA4MDAwYzAwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAic3ViYiIsICAgICAgIDB4MDgwMDA1MDAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJzdWJibyIsICAgICAgMHgwODAwMGQwMCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgInN1YnQiLCAgICAgICAweDA4MDAwNGMwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAic3VidG8iLCAgICAgIDB4MDgwMDBjYzAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJkcyIsICAgICAgICAgMHgwODAwMDQ0MCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgInN1YmkiLCAgICAgICAweDk0MDAwMDAwLCAweGZjMDAwMDAwLCAiY3Y/c2ksYix4IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3ViaSIsICAgICAgIDB4OTQwMDAwMDAsIDB4ZmMwMDA4MDAsICI/c2ksYix4IiwgcGExMCwgMH0sCi17ICJzdWJpbyIsICAgICAgMHg5NDAwMDgwMCwgMHhmYzAwMDgwMCwgIj9zaSxiLHgiLCBwYTEwLCAwfSwKLXsgImNtcGljbHIiLCAgICAweDkwMDAwODAwLCAweGZjMDAwODAwLCAiP1NpLGIseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImNtcGljbHIiLCAgICAweDkwMDAwMDAwLCAweGZjMDAwODAwLCAiP3NpLGIseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNvbWljbHIiLCAgICAweDkwMDAwMDAwLCAweGZjMDAwODAwLCAiP3NpLGIseCIsIHBhMTAsIDB9LAoteyAic2hsYWRkIiwgICAgIDB4MDgwMDAyMjAsIDB4ZmMwMDAzMjAsICJjYT9BeCwuLGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInNobGFkZCIsICAgICAweDA4MDAwMjAwLCAweGZjMDAwMzIwLCAiY2E/YXgsLixiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzaDFhZGQiLCAgICAgMHgwODAwMDY0MCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoMWFkZGwiLCAgICAweDA4MDAwYTQwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gxYWRkbyIsICAgIDB4MDgwMDBlNDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDJhZGQiLCAgICAgMHgwODAwMDY4MCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoMmFkZGwiLCAgICAweDA4MDAwYTgwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gyYWRkbyIsICAgIDB4MDgwMDBlODAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDNhZGQiLCAgICAgMHgwODAwMDZjMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoM2FkZGwiLCAgICAweDA4MDAwYWMwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gzYWRkbyIsICAgIDB4MDgwMDBlYzAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi0KLS8qIFN1YndvcmQgT3BlcmF0aW9uIEluc3RydWN0aW9ucyAqLwotCi17ICJoYWRkIiwgICAgICAgMHgwODAwMDMwMCwgMHhmYzAwZmYyMCwgImNIeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJoYXZnIiwgICAgICAgMHgwODAwMDJjMCwgMHhmYzAwZmZlMCwgIngsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiaHNobCIsICAgICAgIDB4ZjgwMDg4MDAsIDB4ZmZlMGZjMjAsICJ4LCosdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhzaGxhZGQiLCAgICAweDA4MDAwNzAwLCAweGZjMDBmZjIwLCAieCwuLGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhzaHIiLCAgICAgICAweGY4MDBjODAwLCAweGZjMWZmODIwLCAiY1NiLCosdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhzaHJhZGQiLCAgICAweDA4MDAwNTAwLCAweGZjMDBmZjIwLCAieCwuLGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhzdWIiLCAgICAgICAweDA4MDAwMTAwLCAweGZjMDBmZjIwLCAiY0h4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm1peGgiLCAgICAgICAweGY4MDA4NDAwLCAweGZjMDA5ZmUwLCAiY2h4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm1peHciLCAgICAgICAweGY4MDA4MDAwLCAweGZjMDA5ZmUwLCAiY2h4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBlcm1oIiwgICAgICAweGY4MDAwMDAwLCAweGZjMDA5MDIwLCAiYyphLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi0KLQotLyogRXh0cmFjdCBhbmQgRGVwb3NpdCBJbnN0cnVjdGlvbnMgKi8KLQoteyAic2hycGQiLCAgICAgIDB4ZDAwMDAyMDAsIDB4ZmMwMDFmZTAsICI/WHgsYiwhLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzaHJwZCIsICAgICAgMHhkMDAwMDQwMCwgMHhmYzAwMTQwMCwgIj9YeCxiLH4sdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInNocnB3IiwgICAgICAweGQwMDAwMDAwLCAweGZjMDAxZmUwLCAiP3h4LGIsISx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic2hycHciLCAgICAgIDB4ZDAwMDA4MDAsIDB4ZmMwMDFjMDAsICI/eHgsYixwLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJ2c2hkIiwgICAgICAgMHhkMDAwMDAwMCwgMHhmYzAwMWZlMCwgIj94eCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoZCIsICAgICAgICAweGQwMDAwODAwLCAweGZjMDAxYzAwLCAiP3h4LGIscCx0IiwgcGExMCwgMH0sCi17ICJleHRyZCIsICAgICAgMHhkMDAwMTIwMCwgMHhmYzAwMWFlMCwgImNTP1hiLCEsJSx4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZXh0cmQiLCAgICAgIDB4ZDgwMDAwMDAsIDB4ZmMwMDAwMDAsICJjUz9YYixxLHwseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImV4dHJ3IiwgICAgICAweGQwMDAxMDAwLCAweGZjMDAxYmUwLCAiY1M/eGIsISxULHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJleHRydyIsICAgICAgMHhkMDAwMTgwMCwgMHhmYzAwMTgwMCwgImNTP3hiLFAsVCx4IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAidmV4dHJ1IiwgICAgIDB4ZDAwMDEwMDAsIDB4ZmMwMDFmZTAsICI/eGIsVCx4IiwgcGExMCwgMH0sCi17ICJ2ZXh0cnMiLCAgICAgMHhkMDAwMTQwMCwgMHhmYzAwMWZlMCwgIj94YixULHgiLCBwYTEwLCAwfSwKLXsgImV4dHJ1IiwgICAgICAweGQwMDAxODAwLCAweGZjMDAxYzAwLCAiP3hiLFAsVCx4IiwgcGExMCwgMH0sCi17ICJleHRycyIsICAgICAgMHhkMDAwMWMwMCwgMHhmYzAwMWMwMCwgIj94YixQLFQseCIsIHBhMTAsIDB9LAoteyAiZGVwZCIsICAgICAgIDB4ZDQwMDAyMDAsIDB4ZmMwMDFhZTAsICJjej9YeCwhLCUsYiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImRlcGQiLCAgICAgICAweGYwMDAwMDAwLCAweGZjMDAwMDAwLCAiY3o/WHgsfix8LGIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJkZXBkaSIsICAgICAgMHhkNDAwMTIwMCwgMHhmYzAwMWFlMCwgImN6P1g1LCEsJSxiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwZGkiLCAgICAgIDB4ZjQwMDAwMDAsIDB4ZmMwMDAwMDAsICJjej9YNSx+LHwsYiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImRlcHciLCAgICAgICAweGQ0MDAwMDAwLCAweGZjMDAxYmUwLCAiY3o/eHgsISxULGIiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJkZXB3IiwgICAgICAgMHhkNDAwMDgwMCwgMHhmYzAwMTgwMCwgImN6P3h4LHAsVCxiIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwd2kiLCAgICAgIDB4ZDQwMDEwMDAsIDB4ZmMwMDFiZTAsICJjej94NSwhLFQsYiIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImRlcHdpIiwgICAgICAweGQ0MDAxODAwLCAweGZjMDAxODAwLCAiY3o/eDUscCxULGIiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJ6dmRlcCIsICAgICAgMHhkNDAwMDAwMCwgMHhmYzAwMWZlMCwgIj94eCxULGIiLCBwYTEwLCAwfSwKLXsgInZkZXAiLCAgICAgICAweGQ0MDAwNDAwLCAweGZjMDAxZmUwLCAiP3h4LFQsYiIsIHBhMTAsIDB9LAoteyAiemRlcCIsICAgICAgIDB4ZDQwMDA4MDAsIDB4ZmMwMDFjMDAsICI/eHgscCxULGIiLCBwYTEwLCAwfSwKLXsgImRlcCIsICAgICAgICAweGQ0MDAwYzAwLCAweGZjMDAxYzAwLCAiP3h4LHAsVCxiIiwgcGExMCwgMH0sCi17ICJ6dmRlcGkiLCAgICAgMHhkNDAwMTAwMCwgMHhmYzAwMWZlMCwgIj94NSxULGIiLCBwYTEwLCAwfSwKLXsgInZkZXBpIiwgICAgICAweGQ0MDAxNDAwLCAweGZjMDAxZmUwLCAiP3g1LFQsYiIsIHBhMTAsIDB9LAoteyAiemRlcGkiLCAgICAgIDB4ZDQwMDE4MDAsIDB4ZmMwMDFjMDAsICI/eDUscCxULGIiLCBwYTEwLCAwfSwKLXsgImRlcGkiLCAgICAgICAweGQ0MDAxYzAwLCAweGZjMDAxYzAwLCAiP3g1LHAsVCxiIiwgcGExMCwgMH0sCi0KLS8qIFN5c3RlbSBDb250cm9sIEluc3RydWN0aW9ucyAqLwotCi17ICJicmVhayIsICAgICAgMHgwMDAwMDAwMCwgMHhmYzAwMWZlMCwgInIsQSIsIHBhMTAsIDB9LAoteyAicmZpIiwgICAgICAgIDB4MDAwMDBjMDAsIDB4ZmZmZmZmMWYsICJjciIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInJmaSIsICAgICAgICAweDAwMDAwYzAwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi17ICJyZmlyIiwgICAgICAgMHgwMDAwMGNhMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTEsIDB9LAoteyAic3NtIiwgICAgICAgIDB4MDAwMDBkNjAsIDB4ZmMwMGZmZTAsICJVLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzc20iLCAgICAgICAgMHgwMDAwMGQ2MCwgMHhmZmUwZmZlMCwgIlIsdCIsIHBhMTAsIDB9LAoteyAicnNtIiwgICAgICAgIDB4MDAwMDBlNjAsIDB4ZmMwMGZmZTAsICJVLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJyc20iLCAgICAgICAgMHgwMDAwMGU2MCwgMHhmZmUwZmZlMCwgIlIsdCIsIHBhMTAsIDB9LAoteyAibXRzbSIsICAgICAgIDB4MDAwMDE4NjAsIDB4ZmZlMGZmZmYsICJ4IiwgcGExMCwgMH0sCi17ICJsZHNpZCIsICAgICAgMHgwMDAwMTBhMCwgMHhmYzFmM2ZlMCwgIihzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkc2lkIiwgICAgICAweDAwMDAxMGEwLCAweGZjMWYzZmUwLCAiKGIpLHQiLCBwYTEwLCAwfSwKLXsgIm10c3AiLCAgICAgICAweDAwMDAxODIwLCAweGZmZTAxZmZmLCAieCxTIiwgcGExMCwgMH0sCi17ICJtdGN0bCIsICAgICAgMHgwMDAwMTg0MCwgMHhmYzAwZmZmZiwgIngsXiIsIHBhMTAsIDB9LAoteyAibXRzYXJjbSIsICAgIDB4MDE2MDE4QzAsIDB4ZmZlMGZmZmYsICJ4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibWZpYSIsICAgICAgIDB4MDAwMDE0QTAsIDB4ZmZmZmZmZTAsICJ0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibWZzcCIsICAgICAgIDB4MDAwMDA0YTAsIDB4ZmZmZjFmZTAsICJTLHQiLCBwYTEwLCAwfSwKLXsgIm1mY3RsIiwgICAgICAweDAxNjA0OGEwLCAweGZmZmZmZmUwLCAiY1chLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJtZmN0bCIsICAgICAgMHgwMDAwMDhhMCwgMHhmYzFmZmZlMCwgIl4sdCIsIHBhMTAsIDB9LAoteyAic3luYyIsICAgICAgIDB4MDAwMDA0MDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLXsgInN5bmNkbWEiLCAgICAweDAwMTAwNDAwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi17ICJwcm9iZSIsICAgICAgMHgwNDAwMTE4MCwgMHhmYzAwM2ZhMCwgImN3KHMsYikseCx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAicHJvYmUiLCAgICAgIDB4MDQwMDExODAsIDB4ZmMwMDNmYTAsICJjdyhiKSx4LHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJwcm9iZWkiLCAgICAgMHgwNDAwMzE4MCwgMHhmYzAwM2ZhMCwgImN3KHMsYiksUix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAicHJvYmVpIiwgICAgIDB4MDQwMDMxODAsIDB4ZmMwMDNmYTAsICJjdyhiKSxSLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJwcm9iZXIiLCAgICAgMHgwNDAwMTE4MCwgMHhmYzAwM2ZlMCwgIihzLGIpLHgsdCIsIHBhMTAsIDB9LAoteyAicHJvYmVyIiwgICAgIDB4MDQwMDExODAsIDB4ZmMwMDNmZTAsICIoYikseCx0IiwgcGExMCwgMH0sCi17ICJwcm9iZXJpIiwgICAgMHgwNDAwMzE4MCwgMHhmYzAwM2ZlMCwgIihzLGIpLFIsdCIsIHBhMTAsIDB9LAoteyAicHJvYmVyaSIsICAgIDB4MDQwMDMxODAsIDB4ZmMwMDNmZTAsICIoYiksUix0IiwgcGExMCwgMH0sCi17ICJwcm9iZXciLCAgICAgMHgwNDAwMTFjMCwgMHhmYzAwM2ZlMCwgIihzLGIpLHgsdCIsIHBhMTAsIDB9LAoteyAicHJvYmV3IiwgICAgIDB4MDQwMDExYzAsIDB4ZmMwMDNmZTAsICIoYikseCx0IiwgcGExMCwgMH0sCi17ICJwcm9iZXdpIiwgICAgMHgwNDAwMzFjMCwgMHhmYzAwM2ZlMCwgIihzLGIpLFIsdCIsIHBhMTAsIDB9LAoteyAicHJvYmV3aSIsICAgIDB4MDQwMDMxYzAsIDB4ZmMwMDNmZTAsICIoYiksUix0IiwgcGExMCwgMH0sCi17ICJscGEiLCAgICAgICAgMHgwNDAwMTM0MCwgMHhmYzAwM2ZjMCwgImNaeChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxwYSIsICAgICAgICAweDA0MDAxMzQwLCAweGZjMDAzZmMwLCAiY1p4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxoYSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmMwLCAiY1p4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGhhIiwgICAgICAgIDB4MDQwMDEzMDAsIDB4ZmMwMDNmYzAsICJjWngoYiksdCIsIHBhMTAsIDB9LAoteyAibGNpIiwgICAgICAgIDB4MDQwMDEzMDAsIDB4ZmMwMDNmZTAsICJ4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGNpIiwgICAgICAgIDB4MDQwMDEzMDAsIDB4ZmMwMDNmZTAsICJ4KGIpLHQiLCBwYTEwLCAwfSwKLXsgInBkdGxiIiwgICAgICAweDA0MDAxNjAwLCAweGZjMDAzZmRmLCAiY0xjWngocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBkdGxiIiwgICAgICAweDA0MDAxNjAwLCAweGZjMDAzZmRmLCAiY0xjWngoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwZHRsYiIsICAgICAgMHgwNDAwMTIwMCwgMHhmYzAwM2ZkZiwgImNaeChzLGIpIiwgcGExMCwgMH0sCi17ICJwZHRsYiIsICAgICAgMHgwNDAwMTIwMCwgMHhmYzAwM2ZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAicGl0bGIiLCAgICAgIDB4MDQwMDA2MDAsIDB4ZmMwMDFmZGYsICJjTGNaeChTLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicGl0bGIiLCAgICAgIDB4MDQwMDA2MDAsIDB4ZmMwMDFmZGYsICJjTGNaeChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBpdGxiIiwgICAgICAweDA0MDAwMjAwLCAweGZjMDAxZmRmLCAiY1p4KFMsYikiLCBwYTEwLCAwfSwKLXsgInBpdGxiIiwgICAgICAweDA0MDAwMjAwLCAweGZjMDAxZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJwZHRsYmUiLCAgICAgMHgwNDAwMTI0MCwgMHhmYzAwM2ZkZiwgImNaeChzLGIpIiwgcGExMCwgMH0sCi17ICJwZHRsYmUiLCAgICAgMHgwNDAwMTI0MCwgMHhmYzAwM2ZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAicGl0bGJlIiwgICAgIDB4MDQwMDAyNDAsIDB4ZmMwMDFmZGYsICJjWngoUyxiKSIsIHBhMTAsIDB9LAoteyAicGl0bGJlIiwgICAgIDB4MDQwMDAyNDAsIDB4ZmMwMDFmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgImlkdGxiYSIsICAgICAweDA0MDAxMDQwLCAweGZjMDAzZmZmLCAieCwocyxiKSIsIHBhMTAsIDB9LAoteyAiaWR0bGJhIiwgICAgIDB4MDQwMDEwNDAsIDB4ZmMwMDNmZmYsICJ4LChiKSIsIHBhMTAsIDB9LAoteyAiaWl0bGJhIiwgICAgIDB4MDQwMDAwNDAsIDB4ZmMwMDFmZmYsICJ4LChTLGIpIiwgcGExMCwgMH0sCi17ICJpaXRsYmEiLCAgICAgMHgwNDAwMDA0MCwgMHhmYzAwMWZmZiwgIngsKGIpIiwgcGExMCwgMH0sCi17ICJpZHRsYnAiLCAgICAgMHgwNDAwMTAwMCwgMHhmYzAwM2ZmZiwgIngsKHMsYikiLCBwYTEwLCAwfSwKLXsgImlkdGxicCIsICAgICAweDA0MDAxMDAwLCAweGZjMDAzZmZmLCAieCwoYikiLCBwYTEwLCAwfSwKLXsgImlpdGxicCIsICAgICAweDA0MDAwMDAwLCAweGZjMDAxZmZmLCAieCwoUyxiKSIsIHBhMTAsIDB9LAoteyAiaWl0bGJwIiwgICAgIDB4MDQwMDAwMDAsIDB4ZmMwMDFmZmYsICJ4LChiKSIsIHBhMTAsIDB9LAoteyAicGRjIiwgICAgICAgIDB4MDQwMDEzODAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTAsIDB9LAoteyAicGRjIiwgICAgICAgIDB4MDQwMDEzODAsIDB4ZmMwMDNmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgImZkYyIsICAgICAgICAweDA0MDAxMjgwLCAweGZjMDAzZmRmLCAiY1p4KHMsYikiLCBwYTEwLCAwfSwKLXsgImZkYyIsICAgICAgICAweDA0MDAxMjgwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJmaWMiLCAgICAgICAgMHgwNDAwMDI4MCwgMHhmYzAwMWZkZiwgImNaeChTLGIpIiwgcGExMCwgMH0sCi17ICJmaWMiLCAgICAgICAgMHgwNDAwMDI4MCwgMHhmYzAwMWZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAiZmRjZSIsICAgICAgIDB4MDQwMDEyYzAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTAsIDB9LAoteyAiZmRjZSIsICAgICAgIDB4MDQwMDEyYzAsIDB4ZmMwMDNmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgImZpY2UiLCAgICAgICAweDA0MDAwMmMwLCAweGZjMDAxZmRmLCAiY1p4KFMsYikiLCBwYTEwLCAwfSwKLXsgImZpY2UiLCAgICAgICAweDA0MDAwMmMwLCAweGZjMDAxZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJkaWFnIiwgICAgICAgMHgxNDAwMDAwMCwgMHhmYzAwMDAwMCwgIkQiLCBwYTEwLCAwfSwKLXsgImlkdGxidCIsICAgICAweDA0MDAxODAwLCAweGZjMDBmZmZmLCAieCxiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiaWl0bGJ0IiwgICAgIDB4MDQwMDA4MDAsIDB4ZmMwMGZmZmYsICJ4LGIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi0KLS8qIFRoZXNlIG1heSBiZSBzcGVjaWZpYyB0byBjZXJ0YWluIHZlcnNpb25zIG9mIHRoZSBQQS4gIEpvZWwgY2xhaW1lZAotICAgdGhleSB3ZXJlIDcyMDAwICg3MjAwPykgc3BlY2lmaWMuICBIb3dldmVyLCBJJ20gYWxtb3N0IGNlcnRhaW4gdGhlCi0gICBtdGNwdS9tZmNwdSB3ZXJlIHVuZG9jdW1lbnRlZCwgYnV0IGF2YWlsYWJsZSBpbiB0aGUgb2xkZXIgNzAwIG1hY2hpbmVzLiAgKi8KLXsgIm10Y3B1IiwgICAgICAweDE0MDAxNjAwLCAweGZjMDBmZmZmLCAieCxeIiwgcGExMCwgMH0sCi17ICJtZmNwdSIsICAgICAgMHgxNDAwMUEwMCwgMHhmYzAwZmZmZiwgIl4seCIsIHBhMTAsIDB9LAoteyAidG9jZW4iLCAgICAgIDB4MTQ0MDM2MDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLXsgInRvY2RpcyIsICAgICAweDE0NDAxNjIwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi17ICJzaGR3Z3IiLCAgICAgMHgxNDQwMjYwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAiZ3JzaGR3IiwgICAgIDB4MTQ0MDA2MjAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLQotLyogZ2Z3IGFuZCBnZnIgYXJlIG5vdCBpbiB0aGUgSFAgUEEgMS4xIG1hbnVhbCwgYnV0IHRoZXkgYXJlIGluIGVpdGhlcgotICAgdGhlIFRpbWV4IEZQVSBvciB0aGUgTXVzdGFuZyBFUlMgKG5vdCBzdXJlIHdoaWNoKSBtYW51YWwuICAqLwoteyAiZ2Z3IiwJMHgwNDAwMTY4MCwgMHhmYzAwM2ZkZiwgImNaeChzLGIpIiwgcGExMSwgMH0sCi17ICJnZnciLAkweDA0MDAxNjgwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMSwgMH0sCi17ICJnZnIiLAkweDA0MDAxYTgwLCAweGZjMDAzZmRmLCAiY1p4KHMsYikiLCBwYTExLCAwfSwKLXsgImdmciIsCTB4MDQwMDFhODAsIDB4ZmMwMDNmZGYsICJjWngoYikiLCBwYTExLCAwfSwKLQotLyogRmxvYXRpbmcgUG9pbnQgQ29wcm9jZXNzb3IgSW5zdHJ1Y3Rpb25zICovCi0gCi17ICJmbGR3IiwgICAgICAgMHgyNDAwMTAyMCwgMHhmYzFmMzNhMCwgImNvY2NAKHMsYiksZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHgyNDAwMTAyMCwgMHhmYzFmMzNhMCwgImNvY2NAKGIpLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDEzODAsICJjeGNjeChzLGIpLGZUIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDEzODAsICJjeGNjeChiKSxmVCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDI0MDAxMDAwLCAweGZjMDAxMzgwLCAiY21jYzUocyxiKSxmVCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDI0MDAxMDAwLCAweGZjMDAxMzgwLCAiY21jYzUoYiksZlQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHg1YzAwMDAwMCwgMHhmYzAwMDAwNCwgImQocyxiKSxmZSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDVjMDAwMDAwLCAweGZjMDAwMDA0LCAiZChiKSxmZSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDU4MDAwMDAwLCAweGZjMDAwMDA0LCAiY0pkKHMsYiksZmUiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHg1ODAwMDAwMCwgMHhmYzAwMDAwNCwgImNKZChiKSxmZSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDJjMDAxMDIwLCAweGZjMWYzM2UwLCAiY29jY0AocyxiKSxmdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDJjMDAxMDIwLCAweGZjMWYzM2UwLCAiY29jY0AoYiksZnQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMTNjMCwgImN4Y2N4KHMsYiksZnQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMTNjMCwgImN4Y2N4KGIpLGZ0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDEzYzAsICJjbWNjNShzLGIpLGZ0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDEzYzAsICJjbWNjNShiKSxmdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDUwMDAwMDAyLCAweGZjMDAwMDAyLCAiY3EjKHMsYikseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDUwMDAwMDAyLCAweGZjMDAwMDAyLCAiY3EjKGIpLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHgyNDAwMTIyMCwgMHhmYzFmMzNhMCwgImNvY0NmVCxAKHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHgyNDAwMTIyMCwgMHhmYzFmMzNhMCwgImNvY0NmVCxAKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDEzODAsICJjeGNDZlQseChzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDEzODAsICJjeGNDZlQseChiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDI0MDAxMjAwLCAweGZjMDAxMzgwLCAiY21jQ2ZULDUocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDI0MDAxMjAwLCAweGZjMDAxMzgwLCAiY21jQ2ZULDUoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHg3YzAwMDAwMCwgMHhmYzAwMDAwNCwgImZlLGQocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDdjMDAwMDAwLCAweGZjMDAwMDA0LCAiZmUsZChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDc4MDAwMDAwLCAweGZjMDAwMDA0LCAiY0pmZSxkKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHg3ODAwMDAwMCwgMHhmYzAwMDAwNCwgImNKZmUsZChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDJjMDAxMjIwLCAweGZjMWYzM2UwLCAiY29jQ2Z0LEAocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDJjMDAxMjIwLCAweGZjMWYzM2UwLCAiY29jQ2Z0LEAoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMTNjMCwgImN4Y0NmdCx4KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMTNjMCwgImN4Y0NmdCx4KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDEzYzAsICJjbWNDZnQsNShzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDEzYzAsICJjbWNDZnQsNShiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDcwMDAwMDAyLCAweGZjMDAwMDAyLCAiY3F4LCMocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDcwMDAwMDAyLCAweGZjMDAwMDAyLCAiY3F4LCMoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWY4MCwgImN4eChzLGIpLGZUIiwgcGExMCwgMH0sCi17ICJmbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWY4MCwgImN4eChiKSxmVCIsIHBhMTAsIDB9LAoteyAiZmxkZHgiLCAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDFmYzAsICJjeHgocyxiKSxmdCIsIHBhMTAsIDB9LAoteyAiZmxkZHgiLCAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDFmYzAsICJjeHgoYiksZnQiLCBwYTEwLCAwfSwKLXsgImZzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZjgwLCAiY3hmVCx4KHMsYikiLCBwYTEwLCAwfSwKLXsgImZzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZjgwLCAiY3hmVCx4KGIpIiwgcGExMCwgMH0sCi17ICJmc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN4ZnQseChzLGIpIiwgcGExMCwgMH0sCi17ICJmc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN4ZnQseChiKSIsIHBhMTAsIDB9LAoteyAiZnN0cXgiLCAgICAgIDB4M2MwMDAyMDAsIDB4ZmMwMDFmYzAsICJjeGZ0LHgocyxiKSIsIHBhMTAsIDB9LAoteyAiZnN0cXgiLCAgICAgIDB4M2MwMDAyMDAsIDB4ZmMwMDFmYzAsICJjeGZ0LHgoYikiLCBwYTEwLCAwfSwKLXsgImZsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZjgwLCAiY201KHMsYiksZlQiLCBwYTEwLCAwfSwKLXsgImZsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZjgwLCAiY201KGIpLGZUIiwgcGExMCwgMH0sCi17ICJmbGRkcyIsICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWZjMCwgImNtNShzLGIpLGZ0IiwgcGExMCwgMH0sCi17ICJmbGRkcyIsICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWZjMCwgImNtNShiKSxmdCIsIHBhMTAsIDB9LAoteyAiZnN0d3MiLCAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFmODAsICJjbWZULDUocyxiKSIsIHBhMTAsIDB9LAoteyAiZnN0d3MiLCAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFmODAsICJjbWZULDUoYikiLCBwYTEwLCAwfSwKLXsgImZzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZmMwLCAiY21mdCw1KHMsYikiLCBwYTEwLCAwfSwKLXsgImZzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZmMwLCAiY21mdCw1KGIpIiwgcGExMCwgMH0sCi17ICJmc3RxcyIsICAgICAgMHgzYzAwMTIwMCwgMHhmYzAwMWZjMCwgImNtZnQsNShzLGIpIiwgcGExMCwgMH0sCi17ICJmc3RxcyIsICAgICAgMHgzYzAwMTIwMCwgMHhmYzAwMWZjMCwgImNtZnQsNShiKSIsIHBhMTAsIDB9LAoteyAiZmFkZCIsICAgICAgIDB4MzAwMDA2MDAsIDB4ZmMwMGU3ZTAsICJGZmEsZmIsZlQiLCBwYTEwLCAwfSwKLXsgImZhZGQiLCAgICAgICAweDM4MDAwNjAwLCAweGZjMDBlNzIwLCAiSWZBLGZCLGZUIiwgcGExMCwgMH0sCi17ICJmc3ViIiwgICAgICAgMHgzMDAwMjYwMCwgMHhmYzAwZTdlMCwgIkZmYSxmYixmVCIsIHBhMTAsIDB9LAoteyAiZnN1YiIsICAgICAgIDB4MzgwMDI2MDAsIDB4ZmMwMGU3MjAsICJJZkEsZkIsZlQiLCBwYTEwLCAwfSwKLXsgImZtcHkiLCAgICAgICAweDMwMDA0NjAwLCAweGZjMDBlN2UwLCAiRmZhLGZiLGZUIiwgcGExMCwgMH0sCi17ICJmbXB5IiwgICAgICAgMHgzODAwNDYwMCwgMHhmYzAwZTcyMCwgIklmQSxmQixmVCIsIHBhMTAsIDB9LAoteyAiZmRpdiIsICAgICAgIDB4MzAwMDY2MDAsIDB4ZmMwMGU3ZTAsICJGZmEsZmIsZlQiLCBwYTEwLCAwfSwKLXsgImZkaXYiLCAgICAgICAweDM4MDA2NjAwLCAweGZjMDBlNzIwLCAiSWZBLGZCLGZUIiwgcGExMCwgMH0sCi17ICJmc3FydCIsICAgICAgMHgzMDAwODAwMCwgMHhmYzFmZTdlMCwgIkZmYSxmVCIsIHBhMTAsIDB9LAoteyAiZnNxcnQiLCAgICAgIDB4MzgwMDgwMDAsIDB4ZmMxZmU3MjAsICJGZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZhYnMiLCAgICAgICAweDMwMDA2MDAwLCAweGZjMWZlN2UwLCAiRmZhLGZUIiwgcGExMCwgMH0sCi17ICJmYWJzIiwgICAgICAgMHgzODAwNjAwMCwgMHhmYzFmZTcyMCwgIkZmQSxmVCIsIHBhMTAsIDB9LAoteyAiZnJlbSIsICAgICAgIDB4MzAwMDg2MDAsIDB4ZmMwMGU3ZTAsICJGZmEsZmIsZlQiLCBwYTEwLCAwfSwKLXsgImZyZW0iLCAgICAgICAweDM4MDA4NjAwLCAweGZjMDBlNzIwLCAiRmZBLGZCLGZUIiwgcGExMCwgMH0sCi17ICJmcm5kIiwgICAgICAgMHgzMDAwYTAwMCwgMHhmYzFmZTdlMCwgIkZmYSxmVCIsIHBhMTAsIDB9LAoteyAiZnJuZCIsICAgICAgIDB4MzgwMGEwMDAsIDB4ZmMxZmU3MjAsICJGZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZjcHkiLCAgICAgICAweDMwMDA0MDAwLCAweGZjMWZlN2UwLCAiRmZhLGZUIiwgcGExMCwgMH0sCi17ICJmY3B5IiwgICAgICAgMHgzODAwNDAwMCwgMHhmYzFmZTcyMCwgIkZmQSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudmZmIiwgICAgIDB4MzAwMDAyMDAsIDB4ZmMxZjg3ZTAsICJGR2ZhLGZUIiwgcGExMCwgMH0sCi17ICJmY252ZmYiLCAgICAgMHgzODAwMDIwMCwgMHhmYzFmODcyMCwgIkZHZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZ4ZiIsICAgICAweDMwMDA4MjAwLCAweGZjMWY4N2UwLCAiRkdmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudnhmIiwgICAgIDB4MzgwMDgyMDAsIDB4ZmMxZjg3MjAsICJGR2ZBLGZUIiwgcGExMCwgMH0sCi17ICJmY252ZngiLCAgICAgMHgzMDAxMDIwMCwgMHhmYzFmODdlMCwgIkZHZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZmeCIsICAgICAweDM4MDEwMjAwLCAweGZjMWY4NzIwLCAiRkdmQSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudmZ4dCIsICAgIDB4MzAwMTgyMDAsIDB4ZmMxZjg3ZTAsICJGR2ZhLGZUIiwgcGExMCwgMH0sCi17ICJmY252Znh0IiwgICAgMHgzODAxODIwMCwgMHhmYzFmODcyMCwgIkZHZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZtcHlmYWRkIiwgICAweGI4MDAwMDAwLCAweGZjMDAwMDIwLCAiSWZBLGZCLGZDLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZm1weW5mYWRkIiwgIDB4YjgwMDAwMjAsIDB4ZmMwMDAwMjAsICJJZkEsZkIsZkMsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbmVnIiwgICAgICAgMHgzMDAwYzAwMCwgMHhmYzFmZTdlMCwgIkZmYSxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZuZWciLCAgICAgICAweDM4MDBjMDAwLCAweGZjMWZlNzIwLCAiSWZBLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZm5lZ2FicyIsICAgIDB4MzAwMGUwMDAsIDB4ZmMxZmU3ZTAsICJGZmEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbmVnYWJzIiwgICAgMHgzODAwZTAwMCwgMHhmYzFmZTcyMCwgIklmQSxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZjbnYiLCAgICAgICAweDMwMDAwMjAwLCAweGZjMWMwNzIwLCAie19mYSxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZjbnYiLCAgICAgICAweDM4MDAwMjAwLCAweGZjMWMwNzIwLCAiRkdmQSxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZjbXAiLCAgICAgICAweDMwMDAwNDAwLCAweGZjMDAwN2UwLCAiRj9mZmEsZmIsaCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZjbXAiLCAgICAgICAweDM4MDAwNDAwLCAweGZjMDAwNzIwLCAiST9mZkEsZkIsaCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZjbXAiLCAgICAgICAweDMwMDAwNDAwLCAweGZjMDBlN2UwLCAiRj9mZmEsZmIiLCBwYTEwLCAwfSwKLXsgImZjbXAiLCAgICAgICAweDM4MDAwNDAwLCAweGZjMDBlNzIwLCAiST9mZkEsZkIiLCBwYTEwLCAwfSwKLXsgInhtcHl1IiwJMHgzODAwNDcwMCwgMHhmYzAwZTcyMCwgImZYLGZCLGZUIiwgcGExMSwgMH0sCi17ICJmbXB5YWRkIiwJMHgxODAwMDAwMCwgMHhmYzAwMDAwMCwgIkhmaSxmaixmayxmbCxmbSIsIHBhMTEsIDB9LAoteyAiZm1weXN1YiIsCTB4OTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJIZmksZmosZmssZmwsZm0iLCBwYTExLCAwfSwKLXsgImZ0ZXN0IiwgICAgICAweDMwMDAyNDIwLCAweGZmZmZmZmUwLCAiLD0iLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmdGVzdCIsICAgICAgMHgzMDAwMDQyMCwgMHhmZmZmMWZmZiwgIm0iLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmdGVzdCIsICAgICAgMHgzMDAwMjQyMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAiZmlkIiwgICAgICAgIDB4MzAwMDAwMDAsIDB4ZmZmZmZmZmYsICIiLCBwYTExLCAwfSwKLQotLyogUGVyZm9ybWFuY2UgTW9uaXRvciBJbnN0cnVjdGlvbnMgKi8KLQoteyAicG1kaXMiLAkweDMwMDAwMjgwLCAweGZmZmZmZmRmLCAiTiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBtZW5iIiwJMHgzMDAwMDY4MCwgMHhmZmZmZmZmZiwgIiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLQotLyogQXNzaXN0IEluc3RydWN0aW9ucyAqLwotCi17ICJzcG9wMCIsICAgICAgMHgxMDAwMDAwMCwgMHhmYzAwMDYwMCwgInYsT04iLCBwYTEwLCAwfSwKLXsgInNwb3AxIiwgICAgICAweDEwMDAwMjAwLCAweGZjMDAwNjAwLCAidixvTnQiLCBwYTEwLCAwfSwKLXsgInNwb3AyIiwgICAgICAweDEwMDAwNDAwLCAweGZjMDAwNjAwLCAidiwxTmIiLCBwYTEwLCAwfSwKLXsgInNwb3AzIiwgICAgICAweDEwMDAwNjAwLCAweGZjMDAwNjAwLCAidiwwTngsYiIsIHBhMTAsIDB9LAoteyAiY29wciIsICAgICAgIDB4MzAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ1LDJOIiwgcGExMCwgMH0sCi17ICJjbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgocyxiKSx0IiwgcGExMCwgMH0sCi17ICJjbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAiY2xkZHgiLCAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAiY2xkZHgiLCAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImNzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KHMsYikiLCBwYTEwLCAwfSwKLXsgImNzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KGIpIiwgcGExMCwgMH0sCi17ICJjc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWUwMCwgInVjeHQseChzLGIpIiwgcGExMCwgMH0sCi17ICJjc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWUwMCwgInVjeHQseChiKSIsIHBhMTAsIDB9LAoteyAiY2xkd3MiLCAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KHMsYiksdCIsIHBhMTAsIDB9LAoteyAiY2xkd3MiLCAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KGIpLHQiLCBwYTEwLCAwfSwKLXsgImNsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImNsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShiKSx0IiwgcGExMCwgMH0sCi17ICJjc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShzLGIpIiwgcGExMCwgMH0sCi17ICJjc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShiKSIsIHBhMTAsIDB9LAoteyAiY3N0ZHMiLCAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUocyxiKSIsIHBhMTAsIDB9LAoteyAiY3N0ZHMiLCAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUoYikiLCBwYTEwLCAwfSwKLXsgImNsZHciLCAgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjbGR3IiwgICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZHciLCAgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjbGR3IiwgICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZGQiLCAgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjbGRkIiwgICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNsZGQiLCAgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjbGRkIiwgICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdHciLCAgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjc3R3IiwgICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWUwMCwgInVjeHQseChiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdHciLCAgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjc3R3IiwgICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdGQiLCAgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZTAwLCAidWN4dCx4KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjc3RkIiwgICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWUwMCwgInVjeHQseChiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImNzdGQiLCAgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjc3RkIiwgICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLX07Ci0KLSNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBwYV9vcGNvZGVzKS8oc2l6ZW9mIHBhX29wY29kZXNbMF0pKQotCi0vKiBTS1YgMTIvMTgvOTIuIEFkZGVkIHNvbWUgZGVub3RhdGlvbnMgZm9yIHZhcmlvdXMgb3BlcmFuZHMuICovCi0KLSNkZWZpbmUgUEFfSU1NMTFfQVRfMzEgJ2knCi0jZGVmaW5lIFBBX0lNTTE0X0FUXzMxICdqJwotI2RlZmluZSBQQV9JTU0yMV9BVF8zMSAnaycKLSNkZWZpbmUgUEFfRElTUDEyICd3JwotI2RlZmluZSBQQV9ESVNQMTcgJ1cnCi0KLSNkZWZpbmUgTl9IUFBBX09QRVJBTkRfRk9STUFUUyA1CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pMzcwLmggYi9pbmNsdWRlL29wY29kZS9pMzcwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDQ5ZTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaTM3MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qIGkzNzAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgUy8zOTAgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NCwgOTUsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFBvd2VyUEMgdmVyc2lvbiB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0gICBSZXdyaXR0ZW4gZm9yIGkzNzAgRVNBLzM5MCBzdXBwb3J0LCBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgSTM3MF9ICi0jZGVmaW5lIEkzNzBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBpMzcwX29wY29kZS4gICovCi10eXBlZGVmIHVuaW9uCi17Ci0gICB1bnNpZ25lZCBpbnQgICBpWzJdOwotICAgdW5zaWduZWQgc2hvcnQgc1s0XTsKLSAgIHVuc2lnbmVkIGNoYXIgIGJbOF07Ci19ICBpMzcwX2luc25fdDsKLQotc3RydWN0IGkzNzBfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogdGhlIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgY2hhciBsZW47Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIGkzNzBfaW5zbl90IG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICBpMzcwX2luc25fdCBtYXNrOwotCi0gIC8qIE9uZSBiaXQgZmxhZ3MgZm9yIHRoZSBvcGNvZGUuICBUaGVzZSBhcmUgdXNlZCB0byBpbmRpY2F0ZSB3aGljaAotICAgICBzcGVjaWZpYyBwcm9jZXNzb3JzIHN1cHBvcnQgdGhlIGluc3RydWN0aW9ucy4gIFRoZSBkZWZpbmVkIHZhbHVlcwotICAgICBhcmUgbGlzdGVkIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpMzcwX29wY29kZSBpMzcwX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgaTM3MF9udW1fb3Bjb2RlczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBpMzcwX29wY29kZS4gICovCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgb3JpZ2luYWwgMzYwIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIEkzNzBfT1BDT0RFXzM2MCAoMHgwMSkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSAzNzAgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfMzcwICgweDAyKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIDM3MC1YQSBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV8zNzBfWEEgKDB4MDQpCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM3MCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzNzAgKDB4MDgpCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTAgKDB4MTApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBCRlAgZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfQkYgKDB4MjApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBicmFuY2ggJiBzZXQgYXV0aG9yaXR5IGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX0JTICgweDQwKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIEVTQS8zOTAgdy8gY2hlY2tzdW0gZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfQ0sgKDB4ODApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBjb21wYXJlICYgbW92ZSBleHRlbmRlZCBmYWNpbGl0eS4gICovCi0jZGVmaW5lIEkzNzBfT1BDT0RFX0VTQTM5MF9DTSAoMHgxMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBmbHQucHQuIHN1cHBvcnQgZXh0ZW5zaW9ucyBmYWNpbGl0eS4gKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX0ZYICgweDIwMCkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBFU0EvMzkwIHcvIEhGUCBmYWNpbGl0eS4gKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX0hYICgweDQwMCkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBFU0EvMzkwIHcvIGltbWVkaWF0ZSAmIHJlbGF0aXZlIGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX0lSICgweDgwMCkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBFU0EvMzkwIHcvIG1vdmUtaW52ZXJzZSBmYWNpbGl0eS4gICovCi0jZGVmaW5lIEkzNzBfT1BDT0RFX0VTQTM5MF9NSSAoMHgxMDAwKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIEVTQS8zOTAgdy8gcHJvZ3JhbS1jYWxsLWZhc3QgZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfUEMgKDB4MjAwMCkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBFU0EvMzkwIHcvIHBlcmZvcm0tbG9ja2VkLW9wIGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX1BMICgweDQwMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBzcXVhcmUtcm9vdCBmYWNpbGl0eS4gICovCi0jZGVmaW5lIEkzNzBfT1BDT0RFX0VTQTM5MF9RUiAoMHg4MDAwKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIEVTQS8zOTAgdy8gcmVzdW1lLXByb2dyYW0gZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfUlAgKDB4MTAwMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBzZXQtYWRkcmVzcy1zcGFjZS1mYXN0IGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX1NBICgweDIwMDAwKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIEVTQS8zOTAgdy8gc3Vic3BhY2UgZ3JvdXAgZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfU0cgKDB4NDAwMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyBzdHJpbmcgZmFjaWxpdHkuICAqLwotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfU1IgKDB4ODAwMDApCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgRVNBLzM5MCB3LyB0cmFwIGZhY2lsaXR5LiAgKi8KLSNkZWZpbmUgSTM3MF9PUENPREVfRVNBMzkwX1RSICgweDEwMDAwMCkKLQotI2RlZmluZSBJMzcwX09QQ09ERV9FU0EzOTBfU1VQRVJTRVQgKDB4MWZmZmZmKQotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGkzNzBfb3BlcmFuZC4gICovCi0KLXN0cnVjdCBpMzcwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIGkzNzBfaW5zbl90ICgqaW5zZXJ0KSBQQVJBTVMgKChpMzcwX2luc25fdCBpbnN0cnVjdGlvbiwgbG9uZyBvcCwKLQkJCQkgICBjb25zdCBjaGFyICoqZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKLQkgaWYgKChvLT5mbGFncyAmIEkzNzBfT1BFUkFORF9TSUdORUQpICE9IDAKLSAgICAgICAgICAgJiYgKG9wICYgKDEgPDwgKG8tPmJpdHMgLSAxKSkpICE9IDApCi0JICAgb3AgLT0gMSA8PCBvLT5iaXRzOwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLwotICBsb25nICgqZXh0cmFjdCkgUEFSQU1TICgoaTM3MF9pbnNuX3QgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAvKiBuYW1lIC0tIGhhbmR5IGZvciBkZWJ1Z2dpbmcsIG90aGVyd2lzZSBwb2ludGxlc3MgKi8KLSAgY2hhciAqIG5hbWU7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIGkzNzBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaTM3MF9vcGVyYW5kIGkzNzBfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBpMzcwX29wZXJhbmQuICAqLwotCi0vKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHdyYXBwZWQgaW4gcGFyZW50aGVzZXMgcmF0aGVyIHRoYW4KLSAgIHNlcGFyYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciBTLCBSUyBhbmQKLSAgIFNTIGZvcm0gaW5zdHJ1Y3Rpb25zIHdoaWNoIHdhbnQgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlCi0gICByZWcsZGlzcGxhY2VtZW50KGJhc2VyZWcpICovCi0jZGVmaW5lIEkzNzBfT1BFUkFORF9TQkFTRSAoMHgwMSkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgYmFzZSByZWdpc3Rlci4gIEl0IG1heSBvciBtYXkgbm90IGFwcGVhciBuZXh0Ci0gICB0byBhbiBpbmRleCByZWdpc3RlciwgaS5lLiBlaXRoZXIgb2YgdGhlIHR3byBmb3JtcwotICAgcmVnLGRpc3BsYWNlbWVudChiYXNlcmVnKQotICAgcmVnLGRpc3BsYWNlbWVudChpbmRleCxiYXNlcmVnKSAqLwotI2RlZmluZSBJMzcwX09QRVJBTkRfQkFTRSAoMHgwMikKLQotLyogVGhpcyBwYWlyIG9mIG9wZXJhbmRzIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuCi0gICBzZXBhcmF0ZWQgZnJvbSB0aGUgbGFzdCBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgUlggZm9ybQotICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIHdhbnQgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlCi0gICByZWcsZGlzcGxhY2VtZW50KGluZGV4LGJhc2VyZWcpICovCi0jZGVmaW5lIEkzNzBfT1BFUkFORF9JTkRFWCAoMHgwNCkKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyIHVzZXMgdGhpcyB0byBwcmludAotICAgcmVnaXN0ZXIgbmFtZXMgd2l0aCBhIGxlYWRpbmcgJ3InLiAgKi8KLSNkZWZpbmUgSTM3MF9PUEVSQU5EX0dQUiAoMHgwOCkKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ2YnLiAgKi8KLSNkZWZpbmUgSTM3MF9PUEVSQU5EX0ZQUiAoMHgxMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSTM3MF9PUEVSQU5EX1JFTEFUSVZFICgweDIwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBsZW5ndGgsIHN1Y2ggYXMgdGhhdCBpbiBTUyBmb3JtIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIEkzNzBfT1BFUkFORF9MRU5HVEggKDB4NDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbCwgYW5kIGlzIHplcm8gaWYgb21pdHRlZC4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIHRoZSBvcHRpb25hbCBCMiBmaWVsZCBpbiB0aGUgc2hpZnQtbGVmdCwgc2hpZnQtcmlnaHQgaW5zdHJ1Y3Rpb25zLiAgVGhlCi0gICBhc3NlbWJsZXIgbXVzdCBjb3VudCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBvbiB0aGUgbGluZSwKLSAgIGFuZCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBmb3IgdGhlIG9wY29kZSwgYW5kIGRlY2lkZQotICAgd2hldGhlciB0aGlzIG9wZXJhbmQgaXMgcHJlc2VudCBvciBub3QuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZAotICAgcHJpbnQgdGhpcyBvcGVyYW5kIG91dCBvbmx5IGlmIGl0IGlzIG5vdCB6ZXJvLiAgKi8KLSNkZWZpbmUgSTM3MF9PUEVSQU5EX09QVElPTkFMICgweDgwKQotCi0MCi0vKiBEZWZpbmUgc29tZSBtaXNjIG1hY3Jvcy4gIFdlIGtlZXAgdGhlbSB3aXRoIHRoZSBvcGVyYW5kcyB0YWJsZQotICAgZm9yIHNpbXBsaWNpdHkuICBUaGUgbWFjcm8gdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGkzNzBfbWFjcm8uICAqLwotCi1zdHJ1Y3QgaTM3MF9tYWNybwotewotICAvKiBUaGUgbWFjcm8gbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBvcGVyYW5kcyB0aGUgbWFjcm8gdGFrZXMuICAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoCi0gICAgIHNwZWNpZmljIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIHZhbHVlcyBhcmUgdGhlCi0gICAgIHNhbWUgYXMgdGhvc2UgZm9yIHRoZSBzdHJ1Y3QgaTM3MF9vcGNvZGUgZmxhZ3MgZmllbGQuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gIC8qIEEgZm9ybWF0IHN0cmluZyB0byB0dXJuIHRoZSBtYWNybyBpbnRvIGEgbm9ybWFsIGluc3RydWN0aW9uLgotICAgICBFYWNoICVOIGluIHRoZSBzdHJpbmcgaXMgcmVwbGFjZWQgd2l0aCBvcGVyYW5kIG51bWJlciBOICh6ZXJvCi0gICAgIGJhc2VkKS4gICovCi0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaTM3MF9tYWNybyBpMzcwX21hY3Jvc1tdOwotZXh0ZXJuIGNvbnN0IGludCBpMzcwX251bV9tYWNyb3M7Ci0KLQotI2VuZGlmIC8qIEkzNzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oIGIvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk5ZjRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2kzODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOTIgKzAsMCBAQAotLyogb3Bjb2RlL2kzODYuaCAtLSBJbnRlbCA4MDM4NiBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBhbmQgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgU3lzdGVtVi8zODYgU1ZSMy4yIGFzc2VtYmxlciwgYW5kIHByb2JhYmx5IGFsbCBBVCZUIGRlcml2ZWQKLSAgIGl4ODYgVW5peCBhc3NlbWJsZXJzLCBnZW5lcmF0ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgd2l0aAotICAgcmV2ZXJzZWQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcnMgaW4gY2VydGFpbiBjYXNlcy4KLSAgIFVuZm9ydHVuYXRlbHksIGdjYyBhbmQgcG9zc2libHkgbWFueSBvdGhlciBwcm9ncmFtcyB1c2UgdGhpcwotICAgcmV2ZXJzZWQgc3ludGF4LCBzbyB3ZSdyZSBzdHVjayB3aXRoIGl0LgotCi0gICBlZy4gYGZzdWIgJXN0KDMpLCVzdCcgcmVzdWx0cyBpbiBzdCA9IHN0IC0gc3QoMykgYXMgZXhwZWN0ZWQsIGJ1dAotICAgYGZzdWIgJXN0LCVzdCgzKScgcmVzdWx0cyBpbiBzdCgzKSA9IHN0IC0gc3QoMyksIHJhdGhlciB0aGFuCi0gICB0aGUgZXhwZWN0ZWQgc3QoMykgPSBzdCgzKSAtIHN0Ci0KLSAgIFRoaXMgaGFwcGVucyB3aXRoIGFsbCB0aGUgbm9uLWNvbW11dGF0aXZlIGFyaXRobWV0aWMgZmxvYXRpbmcgcG9pbnQKLSAgIG9wZXJhdGlvbnMgd2l0aCB0d28gcmVnaXN0ZXIgb3BlcmFuZHMsIHdoZXJlIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMKLSAgICVzdCwgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGlzICVzdChpKS4gIFNlZSBGbG9hdERSIGJlbG93LgotCi0gICBUaGUgYWZmZWN0ZWQgb3Bjb2RlIG1hcCBpcyBkY2VYLCBkY2ZYLCBkZWVYLCBkZWZYLiAgKi8KLQotI2lmbmRlZiBTWVNWMzg2X0NPTVBBVAotLyogU2V0IG5vbi16ZXJvIGZvciBicm9rZW4sIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgU2V0IHRvIHplcm8gZm9yCi0gICBub24tYnJva2VuIG9wY29kZXMgYXQgeW91ciBwZXJpbC4gIGdjYyBnZW5lcmF0ZXMgU3lzdGVtVi8zODYKLSAgIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgU1lTVjM4Nl9DT01QQVQgMQotI2VuZGlmCi0jaWZuZGVmIE9MREdDQ19DT01QQVQKLS8qIFNldCBub24temVybyB0byBjYXRlciBmb3Igb2xkICg8PSAyLjguMSkgdmVyc2lvbnMgb2YgZ2NjIHRoYXQgY291bGQKLSAgIGdlbmVyYXRlIG5vbnNlbnNlIGZzdWJwLCBmc3VicnAsIGZkaXZwIGFuZCBmZGl2cnAgd2l0aCBvcGVyYW5kcwotICAgcmV2ZXJzZWQuICAqLwotI2RlZmluZSBPTERHQ0NfQ09NUEFUIFNZU1YzODZfQ09NUEFUCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHRlbXBsYXRlIGkzODZfb3B0YWJbXSA9IHsKLQotI2RlZmluZSBYIE5vbmUKLSNkZWZpbmUgTm9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBiX1N1ZiAoTm9fd1N1ZnxOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSB3X1N1ZiAoTm9fYlN1ZnxOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBsX1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBkX1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX3NTdWZ8Tm9fbFN1ZnxOb194U3VmKQotI2RlZmluZSB4X1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX3NTdWZ8Tm9fbFN1ZnxOb19kU3VmKQotI2RlZmluZSBid19TdWYgKE5vX2xTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGJsX1N1ZiAoTm9fd1N1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgd2xfU3VmIChOb19iU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBzbF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHNsZF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb194U3VmKQotI2RlZmluZSBzbGR4X1N1ZiAoTm9fYlN1ZnxOb193U3VmKQotI2RlZmluZSBid2xfU3VmIChOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgYndsZF9TdWYgKE5vX3NTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgRlAgKE5vU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIGxfRlAgKGxfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIGRfRlAgKGRfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHhfRlAgKHhfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHNsX0ZQIChzbF9TdWZ8SWdub3JlU2l6ZSkKLSNkZWZpbmUgc2xkX0ZQIChzbGRfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHNsZHhfRlAgKHNsZHhfU3VmfElnbm9yZVNpemUpCi0jaWYgU1lTVjM4Nl9DT01QQVQKLS8qIFNvbWVvbmUgZm9yZ290IHRoYXQgdGhlIEZsb2F0UiBiaXQgcmV2ZXJzZXMgdGhlIG9wZXJhdGlvbiB3aGVuIG5vdAotICAgZXF1YWwgdG8gdGhlIEZsb2F0RCBiaXQuICBpZS4gQ2hhbmdpbmcgb25seSBGbG9hdEQgcmVzdWx0cyBpbiB0aGUKLSAgIGRlc3RpbmF0aW9uIGJlaW5nIHN3YXBwZWQgKmFuZCogdGhlIGRpcmVjdGlvbiBiZWluZyByZXZlcnNlZC4gICovCi0jZGVmaW5lIEZsb2F0RFIgRmxvYXRECi0jZWxzZQotI2RlZmluZSBGbG9hdERSIChGbG9hdER8RmxvYXRSKQotI2VuZGlmCi0KLS8qIE1vdmUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTU9WX0FYX0RJU1AzMiAweGEwCi17ICJtb3YiLCAgIDIsCTB4YTAsIFgsIGJ3bF9TdWZ8RHxXLAkJCXsgRGlzcDE2fERpc3AzMiwgQWNjLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHg4OCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCQl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCi17ICJtb3YiLCAgIDIsCTB4YjAsIFgsIGJ3bF9TdWZ8V3xTaG9ydEZvcm0sCQl7IEltbSwgUmVnLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHhjNiwgWCwgYndsX1N1ZnxXfE1vZHJtLAkJeyBJbW0sIFJlZ3xBbnlNZW0sIDAgfSB9LAotLyogVGhlIG5leHQgdHdvIGluc3RydWN0aW9ucyBhY2NlcHQgV29yZFJlZyBzbyB0aGF0IGEgc2VnbWVudCByZWdpc3RlcgotICAgY2FuIGJlIGNvcGllZCB0byBhIDMyIGJpdCByZWdpc3RlciwgYW5kIHZpY2UgdmVyc2EsIHdpdGhvdXQgdXNpbmcgYQotICAgc2l6ZSBwcmVmaXguICBXaGVuIG1vdmluZyB0byBhIDMyIGJpdCByZWdpc3RlciwgdGhlIHVwcGVyIDE2IGJpdHMKLSAgIGFyZSBzZXQgdG8gYW4gaW1wbGVtZW50YXRpb24gZGVmaW5lZCB2YWx1ZSAob24gdGhlIFBlbnRpdW0gUHJvLAotICAgdGhlIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdmFsdWUgaXMgemVybykuICAqLwoteyAibW92IiwgICAyLAkweDhjLCBYLCB3bF9TdWZ8TW9kcm0sCQkJeyBTUmVnM3xTUmVnMiwgV29yZFJlZ3xXb3JkTWVtLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHg4ZSwgWCwgd2xfU3VmfE1vZHJtfElnbm9yZVNpemUsCXsgV29yZFJlZ3xXb3JkTWVtLCBTUmVnM3xTUmVnMiwgMCB9IH0sCi0vKiBNb3ZlIHRvL2Zyb20gY29udHJvbCBkZWJ1ZyByZWdpc3RlcnMuICAqLwoteyAibW92IiwgICAyLCAweDBmMjAsIFgsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBDb250cm9sLCBSZWczMnxJbnZNZW0sIDB9IH0sCi17ICJtb3YiLCAgIDIsIDB4MGYyMSwgWCwgbF9TdWZ8RHxNb2RybXxJZ25vcmVTaXplLAl7IERlYnVnLCBSZWczMnxJbnZNZW0sIDB9IH0sCi17ICJtb3YiLCAgIDIsIDB4MGYyNCwgWCwgbF9TdWZ8RHxNb2RybXxJZ25vcmVTaXplLAl7IFRlc3QsIFJlZzMyfEludk1lbSwgMH0gfSwKLQotLyogTW92ZSB3aXRoIHNpZ24gZXh0ZW5kLiAgKi8KLS8qICJtb3ZzYmwiICYgIm1vdnNidyIgbXVzdCBub3QgYmUgdW5pZmllZCBpbnRvICJtb3ZzYiIgdG8gYXZvaWQKLSAgIGNvbmZsaWN0IHdpdGggdGhlICJtb3ZzIiBzdHJpbmcgbW92ZSBpbnN0cnVjdGlvbi4gICovCi17Im1vdnNibCIsIDIsIDB4MGZiZSwgWCwgTm9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFJlZzMyLCAwfSB9LAoteyJtb3ZzYnciLCAyLCAweDBmYmUsIFgsIE5vU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBSZWcxNiwgMH0gfSwKLXsibW92c3dsIiwgMiwgMHgwZmJmLCBYLCBOb1N1ZnxNb2RybSwJCQl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJtb3ZzeCIsICAyLCAweDBmYmYsIFgsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUsCXsgUmVnMTZ8U2hvcnRNZW0sIFJlZzMyLCAwfSB9LAoteyJtb3ZzeCIsICAyLCAweDBmYmUsIFgsIGJfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBNb3ZlIHdpdGggemVybyBleHRlbmQuICAqLwoteyJtb3Z6YiIsICAyLCAweDBmYjYsIFgsIHdsX1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgV29yZFJlZywgMH0gfSwKLXsibW92endsIiwgMiwgMHgwZmI3LCBYLCBOb1N1ZnxNb2RybSwJCQl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJtb3Z6eCIsICAyLCAweDBmYjcsIFgsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUsCXsgUmVnMTZ8U2hvcnRNZW0sIFJlZzMyLCAwfSB9LAoteyJtb3Z6eCIsICAyLCAweDBmYjYsIFgsIGJfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBQdXNoIGluc3RydWN0aW9ucy4gICovCi17InB1c2giLCAgIDEsCTB4NTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm18RGVmYXVsdFNpemUsCXsgV29yZFJlZywgMCwgMCB9IH0sCi17InB1c2giLCAgIDEsCTB4ZmYsIDYsIHdsX1N1ZnxNb2RybXxEZWZhdWx0U2l6ZSwJeyBXb3JkUmVnfFdvcmRNZW0sIDAsIDAgfSB9LAoteyJwdXNoIiwgICAxLAkweDZhLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCQl7IEltbThTLCAwLCAwfSB9LAoteyJwdXNoIiwgICAxLAkweDY4LCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCQl7IEltbTE2fEltbTMyLCAwLCAwfSB9LAoteyJwdXNoIiwgICAxLAkweDA2LCBYLCB3bF9TdWZ8U2VnMlNob3J0Rm9ybXxEZWZhdWx0U2l6ZSwgeyBTUmVnMiwgMCwgMCB9IH0sCi17InB1c2giLCAgIDEsIDB4MGZhMCwgWCwgd2xfU3VmfFNlZzNTaG9ydEZvcm18RGVmYXVsdFNpemUsIHsgU1JlZzMsIDAsIDAgfSB9LAoteyJwdXNoYSIsICAwLAkweDYwLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCQl7IDAsIDAsIDAgfSB9LAotCi0vKiBQb3AgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsicG9wIiwJICAgMSwJMHg1OCwgWCwgd2xfU3VmfFNob3J0Rm9ybXxEZWZhdWx0U2l6ZSwJeyBXb3JkUmVnLCAwLCAwIH0gfSwKLXsicG9wIiwJICAgMSwJMHg4ZiwgMCwgd2xfU3VmfE1vZHJtfERlZmF1bHRTaXplLAl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMCB9IH0sCi0jZGVmaW5lIFBPUF9TRUdfU0hPUlQgMHgwNwoteyJwb3AiLAkgICAxLAkweDA3LCBYLCB3bF9TdWZ8U2VnMlNob3J0Rm9ybXxEZWZhdWx0U2l6ZSwgeyBTUmVnMiwgMCwgMCB9IH0sCi17InBvcCIsCSAgIDEsIDB4MGZhMSwgWCwgd2xfU3VmfFNlZzNTaG9ydEZvcm18RGVmYXVsdFNpemUsIHsgU1JlZzMsIDAsIDAgfSB9LAoteyJwb3BhIiwgICAwLAkweDYxLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCQl7IDAsIDAsIDAgfSB9LAotCi0vKiBFeGNoYW5nZSBpbnN0cnVjdGlvbnMuCi0gICB4Y2hnIGNvbW11dGVzOiAgd2UgYWxsb3cgYm90aCBvcGVyYW5kIG9yZGVycy4gICovCi17InhjaGciLCAgIDIsCTB4OTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgQWNjLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg5MCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBBY2MsIFdvcmRSZWcsIDAgfSB9LAoteyJ4Y2hnIiwgICAyLAkweDg2LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg4NiwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIFJlZywgMCB9IH0sCi0KLS8qIEluL291dCBmcm9tIHBvcnRzLiAgKi8KLXsiaW4iLAkgICAyLAkweGU0LCBYLCBid2xfU3VmfFcsCQl7IEltbTgsIEFjYywgMCB9IH0sCi17ImluIiwJICAgMiwJMHhlYywgWCwgYndsX1N1ZnxXLAkJeyBJbk91dFBvcnRSZWcsIEFjYywgMCB9IH0sCi17ImluIiwJICAgMSwJMHhlNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW04LCAwLCAwIH0gfSwKLXsiaW4iLAkgICAxLAkweGVjLCBYLCBid2xfU3VmfFcsCQl7IEluT3V0UG9ydFJlZywgMCwgMCB9IH0sCi17Im91dCIsCSAgIDIsCTB4ZTYsIFgsIGJ3bF9TdWZ8VywJCXsgQWNjLCBJbW04LCAwIH0gfSwKLXsib3V0IiwJICAgMiwJMHhlZSwgWCwgYndsX1N1ZnxXLAkJeyBBY2MsIEluT3V0UG9ydFJlZywgMCB9IH0sCi17Im91dCIsCSAgIDEsCTB4ZTYsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tOCwgMCwgMCB9IH0sCi17Im91dCIsCSAgIDEsCTB4ZWUsIFgsIGJ3bF9TdWZ8VywJCXsgSW5PdXRQb3J0UmVnLCAwLCAwIH0gfSwKLQotLyogTG9hZCBlZmZlY3RpdmUgYWRkcmVzcy4gICovCi17ImxlYSIsCSAgIDIsIDB4OGQsICAgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwIH0gfSwKLQotLyogTG9hZCBzZWdtZW50IHJlZ2lzdGVycyBmcm9tIG1lbW9yeS4gICovCi17ImxkcyIsCSAgIDIsCTB4YzUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGVzIiwJICAgMiwJMHhjNCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsZnMiLAkgICAyLCAweDBmYjQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGdzIiwJICAgMiwgMHgwZmI1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxzcyIsCSAgIDIsIDB4MGZiMiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBGbGFncyByZWdpc3RlciBpbnN0cnVjdGlvbnMuICAqLwoteyJjbGMiLAkgICAwLAkweGY4LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNsZCIsCSAgIDAsCTB4ZmMsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiY2xpIiwJICAgMCwJMHhmYSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJjbHRzIiwgICAwLCAweDBmMDYsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiY21jIiwJICAgMCwJMHhmNSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJsYWhmIiwgICAwLAkweDlmLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InNhaGYiLCAgIDAsCTB4OWUsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsicHVzaGYiLCAgMCwJMHg5YywgWCwgd2xfU3VmfERlZmF1bHRTaXplLAl7IDAsIDAsIDB9IH0sCi17InBvcGYiLCAgIDAsCTB4OWQsIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJzdGMiLAkgICAwLAkweGY5LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InN0ZCIsCSAgIDAsCTB4ZmQsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsic3RpIiwJICAgMCwJMHhmYiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBBcml0aG1ldGljLiAgKi8KLXsiYWRkIiwJICAgMiwJMHgwMCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDgzLCAwLCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImFkZCIsCSAgIDIsCTB4MDQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17ImFkZCIsCSAgIDIsCTB4ODAsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsiaW5jIiwJICAgMSwJMHg0MCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLCAwLCAwfSB9LAoteyJpbmMiLAkgICAxLAkweGZlLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzdWIiLAkgICAyLAkweDI4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4ODMsIDUsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsic3ViIiwJICAgMiwJMHgyYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsic3ViIiwJICAgMiwJMHg4MCwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJkZWMiLAkgICAxLAkweDQ4LCBYLCB3bF9TdWZ8U2hvcnRGb3JtLAl7IFdvcmRSZWcsIDAsIDB9IH0sCi17ImRlYyIsCSAgIDEsCTB4ZmUsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InNiYiIsCSAgIDIsCTB4MTgsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsic2JiIiwJICAgMiwJMHg4MywgMywgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJzYmIiLAkgICAyLAkweDFjLCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJzYmIiLAkgICAyLAkweDgwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImNtcCIsCSAgIDIsCTB4MzgsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsiY21wIiwJICAgMiwJMHg4MywgNywgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJjbXAiLAkgICAyLAkweDNjLCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJjbXAiLAkgICAyLAkweDgwLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17InRlc3QiLCAgIDIsCTB4ODQsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCBSZWcsIDB9IH0sCi17InRlc3QiLCAgIDIsCTB4ODQsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InRlc3QiLCAgIDIsCTB4YTgsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InRlc3QiLCAgIDIsCTB4ZjYsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsiYW5kIiwJICAgMiwJMHgyMCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDgzLCA0LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImFuZCIsCSAgIDIsCTB4MjQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17ImFuZCIsCSAgIDIsCTB4ODAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsib3IiLAkgICAyLAkweDA4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17Im9yIiwJICAgMiwJMHg4MywgMSwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4MGMsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17Im9yIiwJICAgMiwJMHg4MCwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJ4b3IiLAkgICAyLAkweDMwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InhvciIsCSAgIDIsCTB4ODMsIDYsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsieG9yIiwJICAgMiwJMHgzNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsieG9yIiwJICAgMiwJMHg4MCwgNiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQotLyogaWNsciB3aXRoIDEgb3BlcmFuZCBpcyByZWFsbHkgeG9yIHdpdGggMiBvcGVyYW5kcy4gICovCi17ImNsciIsCSAgIDEsCTB4MzAsIFgsIGJ3bF9TdWZ8V3xNb2RybXxyZWdLbHVkZ2UsCXsgUmVnLCAwLCAwIH0gfSwKLQoteyJhZGMiLAkgICAyLAkweDEwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImFkYyIsCSAgIDIsCTB4ODMsIDIsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHgxNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHg4MCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJuZWciLAkgICAxLAkweGY2LCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsibm90IiwJICAgMSwJMHhmNiwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsiYWFhIiwJICAgMCwJMHgzNywgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYXMiLAkgICAwLAkweDNmLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImRhYSIsCSAgIDAsCTB4MjcsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiZGFzIiwJICAgMCwJMHgyZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYWQiLAkgICAwLCAweGQ1MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFkIiwJICAgMSwgICAweGQ1LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAoteyJhYW0iLAkgICAwLCAweGQ0MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFtIiwJICAgMSwgICAweGQ0LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAotCi0vKiBDb252ZXJzaW9uIGluc25zLiAgKi8KLS8qIEludGVsIG5hbWluZyAqLwoteyJjYnciLAkgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMTYsCQl7IDAsIDAsIDB9IH0sCi17ImN3ZGUiLCAgIDAsCTB4OTgsIFgsIE5vU3VmfFNpemUzMiwJCXsgMCwgMCwgMH0gfSwKLXsiY3dkIiwJICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjZHEiLAkgICAwLAkweDk5LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi0vKiBBVCZUIG5hbWluZyAqLwoteyJjYnR3IiwgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMTYsCQl7IDAsIDAsIDB9IH0sCi17ImN3dGwiLCAgIDAsCTB4OTgsIFgsIE5vU3VmfFNpemUzMiwJCXsgMCwgMCwgMH0gfSwKLXsiY3d0ZCIsICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjbHRkIiwgICAwLAkweDk5LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi0KLS8qIFdhcm5pbmchIHRoZSBtdWwvaW11bCAob3Bjb2RlIDB4ZjYpIG11c3Qgb25seSBoYXZlIDEgb3BlcmFuZCEgIFRoZXkgYXJlCi0gICBleHBhbmRpbmcgNjQtYml0IG11bHRpcGxpZXMsIGFuZCAqY2Fubm90KiBiZSBzZWxlY3RlZCB0byBhY2NvbXBsaXNoCi0gICAnaW11bCAlZWJ4LCAlZWF4JyAob3Bjb2RlIDB4MGZhZiBtdXN0IGJlIHVzZWQgaW4gdGhpcyBjYXNlKQotICAgVGhlc2UgbXVsdGlwbGllcyBjYW4gb25seSBiZSBzZWxlY3RlZCB3aXRoIHNpbmdsZSBvcGVyYW5kIGZvcm1zLiAgKi8KLXsibXVsIiwJICAgMSwJMHhmNiwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi17ImltdWwiLCAgIDEsCTB4ZjYsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJpbXVsIiwgICAyLCAweDBmYWYsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJpbXVsIiwgICAzLAkweDZiLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWd9IH0sCi17ImltdWwiLCAgIDMsCTB4NjksIFgsIHdsX1N1ZnxNb2RybSwJCXsgSW1tMTZ8SW1tMzIsIFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZ30gfSwKLS8qIGltdWwgd2l0aCAyIG9wZXJhbmRzIG1pbWljcyBpbXVsIHdpdGggMyBieSBwdXR0aW5nIHRoZSByZWdpc3RlciBpbgotICAgYm90aCBpLnJtLnJlZyAmIGkucm0ucmVnbWVtIGZpZWxkcy4gIHJlZ0tsdWRnZSBlbmFibGVzIHRoaXMKLSAgIHRyYW5zZm9ybWF0aW9uLiAgKi8KLXsiaW11bCIsICAgMiwJMHg2YiwgWCwgd2xfU3VmfE1vZHJtfHJlZ0tsdWRnZSx7IEltbThTLCBXb3JkUmVnLCAwfSB9LAoteyJpbXVsIiwgICAyLAkweDY5LCBYLCB3bF9TdWZ8TW9kcm18cmVnS2x1ZGdlLHsgSW1tMTZ8SW1tMzIsIFdvcmRSZWcsIDB9IH0sCi0KLXsiZGl2IiwJICAgMSwJMHhmNiwgNiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi17ImRpdiIsCSAgIDIsCTB4ZjYsIDYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCBBY2MsIDB9IH0sCi17ImlkaXYiLCAgIDEsCTB4ZjYsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJpZGl2IiwgICAyLAkweGY2LCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgQWNjLCAwfSB9LAotCi17InJvbCIsCSAgIDIsCTB4ZDAsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb2wiLAkgICAyLAkweGMwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9sIiwJICAgMiwJMHhkMiwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvbCIsCSAgIDEsCTB4ZDAsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InJvciIsCSAgIDIsCTB4ZDAsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb3IiLAkgICAyLAkweGMwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9yIiwJICAgMiwJMHhkMiwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvciIsCSAgIDEsCTB4ZDAsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InJjbCIsCSAgIDIsCTB4ZDAsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY2wiLAkgICAyLAkweGMwLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNsIiwJICAgMiwJMHhkMiwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjbCIsCSAgIDEsCTB4ZDAsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InJjciIsCSAgIDIsCTB4ZDAsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY3IiLAkgICAyLAkweGMwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNyIiwJICAgMiwJMHhkMiwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjciIsCSAgIDEsCTB4ZDAsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InNhbCIsCSAgIDIsCTB4ZDAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYWwiLAkgICAyLAkweGMwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FsIiwJICAgMiwJMHhkMiwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhbCIsCSAgIDEsCTB4ZDAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJzaGwiLAkgICAyLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hsIiwJICAgMiwJMHhjMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNobCIsCSAgIDIsCTB4ZDIsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaGwiLAkgICAxLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzaGxkIiwgICAzLCAweDBmYTQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaGxkIiwgICAzLCAweDBmYTUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgU2hpZnRDb3VudCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaGxkIiwgICAyLCAweDBmYTUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAotCi17InNociIsCSAgIDIsCTB4ZDAsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaHIiLAkgICAyLAkweGMwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hyIiwJICAgMiwJMHhkMiwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNociIsCSAgIDEsCTB4ZDAsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi17InNocmQiLCAgIDMsIDB4MGZhYywgWCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW19IH0sCi17InNocmQiLCAgIDMsIDB4MGZhZCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBTaGlmdENvdW50LCBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW19IH0sCi17InNocmQiLCAgIDIsIDB4MGZhZCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi0KLXsic2FyIiwJICAgMiwJMHhkMCwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhciIsCSAgIDIsCTB4YzAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYXIiLAkgICAyLAkweGQyLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FyIiwJICAgMSwJMHhkMCwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLS8qIENvbnRyb2wgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsiY2FsbCIsICAgMSwJMHhlOCwgWCwgd2xfU3VmfEp1bXBEd29yZHxEZWZhdWx0U2l6ZSwJeyBEaXNwMTZ8RGlzcDMyLCAwLCAwfSB9LAoteyJjYWxsIiwgICAxLAkweGZmLCAyLCB3bF9TdWZ8TW9kcm18RGVmYXVsdFNpemUsCXsgV29yZFJlZ3xXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJjYWxsIiwgICAyLAkweDlhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudHxEZWZhdWx0U2l6ZSwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiY2FsbCIsICAgMSwJMHhmZiwgMywgeF9TdWZ8TW9kcm18RGVmYXVsdFNpemUsCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsibGNhbGwiLCAgMiwJMHg5YSwgWCwgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnR8RGVmYXVsdFNpemUsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAoteyJsY2FsbCIsICAxLAkweGZmLCAzLCB3bF9TdWZ8TW9kcm18RGVmYXVsdFNpemUsCXsgV29yZE1lbXxKdW1wQWJzb2x1dGUsIDAsIDB9IH0sCi0KLSNkZWZpbmUgSlVNUF9QQ19SRUxBVElWRSAweGViCi17ImptcCIsCSAgIDEsCTB4ZWIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImptcCIsCSAgIDEsCTB4ZmYsIDQsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJqbXAiLCAgICAyLAkweGVhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudCwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiam1wIiwgICAgMSwJMHhmZiwgNSwgeF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17ImxqbXAiLCAgIDIsCTB4ZWEsIFgsIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50LCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsibGptcCIsICAgMSwJMHhmZiwgNSwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLQoteyJyZXQiLAkgICAwLAkweGMzLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCXsgMCwgMCwgMH0gfSwKLXsicmV0IiwJICAgMSwJMHhjMiwgWCwgd2xfU3VmfERlZmF1bHRTaXplLAl7IEltbTE2LCAwLCAwfSB9LAoteyJscmV0IiwgICAwLAkweGNiLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCXsgMCwgMCwgMH0gfSwKLXsibHJldCIsICAgMSwJMHhjYSwgWCwgd2xfU3VmfERlZmF1bHRTaXplLAl7IEltbTE2LCAwLCAwfSB9LAoteyJlbnRlciIsICAyLAkweGM4LCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCXsgSW1tMTYsIEltbTgsIDB9IH0sCi17ImxlYXZlIiwgIDAsCTB4YzksIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJeyAwLCAwLCAwfSB9LAotCi0vKiBDb25kaXRpb25hbCBqdW1wcy4gICovCi17ImpvIiwJICAgMSwJMHg3MCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5vIiwJICAgMSwJMHg3MSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamIiLAkgICAxLAkweDcyLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYyIsCSAgIDEsCTB4NzIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYWUiLCAgIDEsCTB4NzIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYiIsCSAgIDEsCTB4NzMsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYyIsCSAgIDEsCTB4NzMsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImphZSIsCSAgIDEsCTB4NzMsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImplIiwJICAgMSwJMHg3NCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianoiLAkgICAxLAkweDc0LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmUiLAkgICAxLAkweDc1LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbnoiLAkgICAxLAkweDc1LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYmUiLAkgICAxLAkweDc2LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmEiLAkgICAxLAkweDc2LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmJlIiwgICAxLAkweDc3LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYSIsCSAgIDEsCTB4NzcsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpzIiwJICAgMSwJMHg3OCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5zIiwJICAgMSwJMHg3OSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianAiLAkgICAxLAkweDdhLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcGUiLAkgICAxLAkweDdhLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbnAiLAkgICAxLAkweDdiLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcG8iLAkgICAxLAkweDdiLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbCIsCSAgIDEsCTB4N2MsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuZ2UiLCAgIDEsCTB4N2MsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubCIsCSAgIDEsCTB4N2QsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpnZSIsCSAgIDEsCTB4N2QsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpsZSIsCSAgIDEsCTB4N2UsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuZyIsCSAgIDEsCTB4N2UsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubGUiLCAgIDEsCTB4N2YsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpnIiwJICAgMSwJMHg3ZiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLQotLyogamN4eiB2cy4gamVjeHogaXMgY2hvc2VuIG9uIHRoZSBiYXNpcyBvZiB0aGUgYWRkcmVzcyBzaXplIHByZWZpeC4gICovCi17ImpjeHoiLCAgIDEsCTB4ZTMsIFgsIE5vU3VmfEp1bXBCeXRlfFNpemUxNiwgeyBEaXNwLCAwLCAwfSB9LAoteyJqZWN4eiIsICAxLAkweGUzLCBYLCBOb1N1ZnxKdW1wQnl0ZXxTaXplMzIsIHsgRGlzcCwgMCwgMH0gfSwKLQotLyogVGhlIGxvb3AgaW5zdHJ1Y3Rpb25zIGFsc28gdXNlIHRoZSBhZGRyZXNzIHNpemUgcHJlZml4IHRvIHNlbGVjdAotICAgJWN4IHJhdGhlciB0aGFuICVlY3ggZm9yIHRoZSBsb29wIGNvdW50LCBzbyB0aGUgYHcnIGZvcm0gb2YgdGhlc2UKLSAgIGluc3RydWN0aW9ucyBlbWl0IGFuIGFkZHJlc3Mgc2l6ZSBwcmVmaXggcmF0aGVyIHRoYW4gYSBkYXRhIHNpemUKLSAgIHByZWZpeC4gICovCi17Imxvb3AiLCAgIDEsCTB4ZTIsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29weiIsICAxLAkweGUxLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLXsibG9vcGUiLCAgMSwJMHhlMSwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi17Imxvb3BueiIsIDEsCTB4ZTAsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29wbmUiLCAxLAkweGUwLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLQotLyogU2V0IGJ5dGUgb24gZmxhZyBpbnN0cnVjdGlvbnMuICAqLwoteyJzZXRvIiwgICAxLCAweDBmOTAsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5vIiwgIDEsIDB4MGY5MSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YiIsICAgMSwgMHgwZjkyLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRjIiwgICAxLCAweDBmOTIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5hZSIsIDEsIDB4MGY5MiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmIiLCAgMSwgMHgwZjkzLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYyIsICAxLCAweDBmOTMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGFlIiwgIDEsIDB4MGY5MywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0ZSIsICAgMSwgMHgwZjk0LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXR6IiwgICAxLCAweDBmOTQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5lIiwgIDEsIDB4MGY5NSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bnoiLCAgMSwgMHgwZjk1LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRiZSIsICAxLCAweDBmOTYsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5hIiwgIDEsIDB4MGY5NiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmJlIiwgMSwgMHgwZjk3LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRhIiwgICAxLCAweDBmOTcsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHMiLCAgIDEsIDB4MGY5OCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bnMiLCAgMSwgMHgwZjk5LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRwIiwgICAxLCAweDBmOWEsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHBlIiwgIDEsIDB4MGY5YSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bnAiLCAgMSwgMHgwZjliLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRwbyIsICAxLCAweDBmOWIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGwiLCAgIDEsIDB4MGY5YywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmdlIiwgMSwgMHgwZjljLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRubCIsICAxLCAweDBmOWQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGdlIiwgIDEsIDB4MGY5ZCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bGUiLCAgMSwgMHgwZjllLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuZyIsICAxLCAweDBmOWUsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5sZSIsIDEsIDB4MGY5ZiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0ZyIsICAgMSwgMHgwZjlmLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAotCi0vKiBTdHJpbmcgbWFuaXB1bGF0aW9uLiAgKi8KLXsiY21wcyIsICAgMCwJMHhhNiwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJjbXBzIiwgICAyLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQW55TWVtLCAwfSB9LAoteyJzY21wIiwgICAwLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNjbXAiLCAgIDIsCTB4YTYsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCBBbnlNZW0sIDB9IH0sCi17ImlucyIsCSAgIDAsCTB4NmMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsiaW5zIiwJICAgMiwJMHg2YywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBJbk91dFBvcnRSZWcsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsib3V0cyIsICAgMCwJMHg2ZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJvdXRzIiwgICAyLAkweDZlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgSW5PdXRQb3J0UmVnLCAwfSB9LAoteyJsb2RzIiwgICAwLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17ImxvZHMiLCAgIDEsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAoteyJsb2RzIiwgICAyLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQWNjLCAwfSB9LAoteyJzbG9kIiwgICAwLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNsb2QiLCAgIDEsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAoteyJzbG9kIiwgICAyLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQWNjLCAwfSB9LAoteyJtb3ZzIiwgICAwLAkweGE0LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17Im1vdnMiLCAgIDIsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBbnlNZW18RXNTZWcsIDB9IH0sCi17InNtb3YiLCAgIDAsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic21vdiIsICAgMiwJMHhhNCwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFueU1lbXxFc1NlZywgMH0gfSwKLXsic2NhcyIsICAgMCwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzY2FzIiwgICAxLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic2NhcyIsICAgMiwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFjYywgMH0gfSwKLXsic3NjYSIsICAgMCwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzc2NhIiwgICAxLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic3NjYSIsICAgMiwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFjYywgMH0gfSwKLXsic3RvcyIsICAgMCwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzdG9zIiwgICAxLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic3RvcyIsICAgMiwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBY2MsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsic3N0byIsICAgMCwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzc3RvIiwgICAxLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic3N0byIsICAgMiwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBY2MsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsieGxhdCIsICAgMCwJMHhkNywgWCwgYl9TdWZ8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsieGxhdCIsICAgMSwJMHhkNywgWCwgYl9TdWZ8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAotCi0vKiBCaXQgbWFuaXB1bGF0aW9uLiAgKi8KLXsiYnNmIiwJICAgMiwgMHgwZmJjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiYnNyIiwJICAgMiwgMHgwZmJkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiYnQiLAkgICAyLCAweDBmYTMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidCIsCSAgIDIsIDB4MGZiYSwgNCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0YyIsCSAgIDIsIDB4MGZiYiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0YyIsCSAgIDIsIDB4MGZiYSwgNywgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0ciIsCSAgIDIsIDB4MGZiMywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0ciIsCSAgIDIsIDB4MGZiYSwgNiwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0cyIsCSAgIDIsIDB4MGZhYiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0cyIsCSAgIDIsIDB4MGZiYSwgNSwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi0KLS8qIEludGVycnVwdHMgJiBvcC4gc3lzIGluc25zLiAgKi8KLS8qIFNlZSBnYXMvY29uZmlnL3RjLWkzODYuYyBmb3IgY29udmVyc2lvbiBvZiAnaW50ICQzJyBpbnRvIHRoZSBzcGVjaWFsCi0gICBpbnQgMyBpbnNuLiAgKi8KLSNkZWZpbmUgSU5UX09QQ09ERSAweGNkCi0jZGVmaW5lIElOVDNfT1BDT0RFIDB4Y2MKLXsiaW50IiwJICAgMSwJMHhjZCwgWCwgTm9TdWYsCQkJeyBJbW04LCAwLCAwfSB9LAoteyJpbnQzIiwgICAwLAkweGNjLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImludG8iLCAgIDAsCTB4Y2UsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiaXJldCIsICAgMCwJMHhjZiwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAotLyogaTM4NnNsLCBpNDg2c2wsIGxhdGVyIDQ4NiwgYW5kIFBlbnRpdW0uICAqLwoteyJyc20iLAkgICAwLCAweDBmYWEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLQoteyJib3VuZCIsICAyLAkweDYyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRNZW0sIDB9IH0sCi0KLXsiaGx0IiwJICAgMCwJMHhmNCwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotLyogbm9wIGlzIGFjdHVhbGx5ICd4Y2hnbCAlZWF4LCAlZWF4Jy4gICovCi17Im5vcCIsCSAgIDAsCTB4OTAsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLQotLyogUHJvdGVjdGlvbiBjb250cm9sLiAgKi8KLXsiYXJwbCIsICAgMiwJMHg2MywgWCwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2LCBSZWcxNnxTaG9ydE1lbSwgMH0gfSwKLXsibGFyIiwJICAgMiwgMHgwZjAyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGdkdCIsICAgMSwgMHgwZjAxLCAyLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17ImxpZHQiLCAgIDEsIDB4MGYwMSwgMywgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsbGR0IiwgICAxLCAweDBmMDAsIDIsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLXsibG1zdyIsICAgMSwgMHgwZjAxLCA2LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi17ImxzbCIsCSAgIDIsIDB4MGYwMywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17Imx0ciIsCSAgIDEsIDB4MGYwMCwgMywgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAotCi17InNnZHQiLCAgIDEsIDB4MGYwMSwgMCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJzaWR0IiwgICAxLCAweDBmMDEsIDEsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsic2xkdCIsICAgMSwgMHgwZjAwLCAwLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMH0gfSwKLXsic21zdyIsICAgMSwgMHgwZjAxLCA0LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMH0gfSwKLXsic3RyIiwJICAgMSwgMHgwZjAwLCAxLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi0KLXsidmVyciIsICAgMSwgMHgwZjAwLCA0LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi17InZlcnciLCAgIDEsIDB4MGYwMCwgNSwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAotCi0vKiBGbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICAqLwotCi0vKiBsb2FkICovCi17ImZsZCIsCSAgIDEsIDB4ZDljMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwgLyogcmVnaXN0ZXIgKi8KLXsiZmxkIiwJICAgMSwJMHhkOSwgMCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGZsb2F0L2RvdWJsZSAqLwoteyJmbGQiLAkgICAxLCAweGQ5YzAsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJmbGQiLCAgICAxLAkweGRiLCA1LCB4X0ZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGVmbG9hdCAqLwoteyJmaWxkIiwgICAxLAkweGRmLCAwLCBzbF9TdWZ8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gd29yZCgxNikvZHdvcmQoMzIpICovCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZmlsZGQiLCAgMSwJMHhkZiwgNSwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gcXdvcmQgKDY0KSAqLwoteyJmaWxkcSIsICAxLAkweGRmLCA1LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBxd29yZCAoNjQpICovCi17ImZpbGRsbCIsIDEsCTB4ZGYsIDUsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmxkdCIsICAgMSwJMHhkYiwgNSwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gZWZsb2F0ICovCi17ImZibGQiLCAgIDEsCTB4ZGYsIDQsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGJjZCAqLwotCi0vKiBzdG9yZSAobm8gcG9wKSAqLwoteyJmc3QiLAkgICAxLCAweGRkZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIHJlZ2lzdGVyICovCi17ImZzdCIsCSAgIDEsCTB4ZDksIDIsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZnN0IiwJICAgMSwgMHhkZGQwLCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZpc3QiLCAgIDEsCTB4ZGYsIDIsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSB3b3JkKDE2KS9kd29yZCgzMikgKi8KLQotLyogc3RvcmUgKHdpdGggcG9wKSAqLwoteyJmc3RwIiwgICAxLCAweGRkZDgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIHJlZ2lzdGVyICovCi17ImZzdHAiLCAgIDEsCTB4ZDksIDMsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZnN0cCIsICAgMSwgMHhkZGQ4LCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZnN0cCIsICAgMSwJMHhkYiwgNywgeF9GUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBlZmxvYXQgKi8KLXsiZmlzdHAiLCAgMSwJMHhkZiwgMywgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gd29yZCgxNikvZHdvcmQoMzIpICovCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZmlzdHBkIiwgMSwJMHhkZiwgNywgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gcXdvcmQgKDY0KSAqLwoteyJmaXN0cHEiLCAxLAkweGRmLCA3LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBxd29yZCAoNjQpICovCi17ImZpc3RwbGwiLDEsCTB4ZGYsIDcsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHF3b3JkICg2NCkgKi8KLXsiZnN0cHQiLCAgMSwJMHhkYiwgNywgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gZWZsb2F0ICovCi17ImZic3RwIiwgIDEsCTB4ZGYsIDYsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGJjZCAqLwotCi0vKiBleGNoYW5nZSAlc3Q8bj4gd2l0aCAlc3QwICovCi17ImZ4Y2giLCAgIDEsIDB4ZDljOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnhjaCIsICAgMCwgMHhkOWM5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZ4Y2ggJXN0KDEpICovCi0KLS8qIGNvbXBhcmlzb24gKHdpdGhvdXQgcG9wKSAqLwoteyJmY29tIiwgICAxLCAweGQ4ZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZjb20iLCAgIDAsIDB4ZDhkMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmY29tICVzdCgxKSAqLwoteyJmY29tIiwgICAxLAkweGQ4LCAyLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZmNvbSIsICAgMSwgMHhkOGQwLCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZpY29tIiwgIDEsCTB4ZGUsIDIsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogY29tcGFyZSAlc3QwLCBtZW0gd29yZC9kd29yZCAqLwotCi0vKiBjb21wYXJpc29uICh3aXRoIHBvcCkgKi8KLXsiZmNvbXAiLCAgMSwgMHhkOGQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmY29tcCIsICAwLCAweGQ4ZDksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmNvbXAgJXN0KDEpICovCi17ImZjb21wIiwgIDEsCTB4ZDgsIDMsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qIGNvbXBhcmUgJXN0MCwgbWVtIGZsb2F0L2RvdWJsZSAqLwoteyJmY29tcCIsICAxLCAweGQ4ZDgsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmljb21wIiwgMSwJMHhkZSwgMywgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSB3b3JkL2R3b3JkICovCi17ImZjb21wcCIsIDAsIDB4ZGVkOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGNvbXBhcmUgJXN0MCwgJXN0MSAmIHBvcCAyICovCi0KLS8qIHVub3JkZXJlZCBjb21wYXJpc29uICh3aXRoIHBvcCkgKi8KLXsiZnVjb20iLCAgMSwgMHhkZGUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbSIsICAwLCAweGRkZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnVjb20gJXN0KDEpICovCi17ImZ1Y29tcCIsIDEsIDB4ZGRlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnVjb21wIiwgMCwgMHhkZGU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZ1Y29tcCAlc3QoMSkgKi8KLXsiZnVjb21wcCIsMCwgMHhkYWU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogdWNvbXBhcmUgJXN0MCwgJXN0MSAmIHBvcCB0d2ljZSAqLwotCi17ImZ0c3QiLCAgIDAsIDB4ZDllNCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIHRlc3QgJXN0MCAqLwoteyJmeGFtIiwgICAwLCAweGQ5ZTUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBleGFtaW5lICVzdDAgKi8KLQotLyogbG9hZCBjb25zdGFudHMgaW50byAlc3QwICovCi17ImZsZDEiLCAgIDAsIDB4ZDllOCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIDEuMCAqLwoteyJmbGRsMnQiLCAwLCAweGQ5ZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsb2cyKDEwKSAqLwoteyJmbGRsMmUiLCAwLCAweGQ5ZWEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsb2cyKGUpICovCi17ImZsZHBpIiwgIDAsIDB4ZDllYiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIHBpICovCi17ImZsZGxnMiIsIDAsIDB4ZDllYywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxvZzEwKDIpICovCi17ImZsZGxuMiIsIDAsIDB4ZDllZCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxuKDIpICovCi17ImZsZHoiLCAgIDAsIDB4ZDllZSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIDAuMCAqLwotCi0vKiBhcml0aG1ldGljICovCi0KLS8qIGFkZCAqLwoteyJmYWRkIiwgICAyLCAweGQ4YzAsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdEQsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmYWRkIiwgICAxLCAweGQ4YzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIGFsaWFzIGZvciBmYWRkICVzdChpKSwgJXN0ICovCi0jaWYgU1lTVjM4Nl9DT01QQVQKLXsiZmFkZCIsICAgMCwgMHhkZWMxLCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZhZGRwICovCi0jZW5kaWYKLXsiZmFkZCIsICAgMSwJMHhkOCwgMCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlhZGQiLCAgMSwJMHhkZSwgMCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQoteyJmYWRkcCIsICAyLCAweGRlYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmYWRkcCIsICAxLCAweGRlYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZhZGRwIiwgIDAsIDB4ZGVjMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmYWRkcCAlc3QsICVzdCgxKSAqLwoteyJmYWRkcCIsICAyLCAweGRlYzAsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotCi0vKiBzdWJ0cmFjdCAqLwoteyJmc3ViIiwgICAyLCAweGQ4ZTAsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnN1YiIsICAgMSwgMHhkOGUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFNZU1YzODZfQ09NUEFUCi17ImZzdWIiLCAgIDAsIDB4ZGVlMSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmc3VicCAqLwotI2VuZGlmCi17ImZzdWIiLCAgIDEsCTB4ZDgsIDQsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpc3ViIiwgIDEsCTB4ZGUsIDQsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFNZU1YzODZfQ09NUEFUCi17ImZzdWJwIiwgIDIsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJwIiwgIDEsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnAiLCAgMCwgMHhkZWUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jaWYgT0xER0NDX0NPTVBBVAoteyJmc3VicCIsICAyLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2VuZGlmCi0jZWxzZQoteyJmc3VicCIsICAyLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmc3VicCIsICAxLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZzdWJwIiwgIDAsIDB4ZGVlOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLS8qIHN1YnRyYWN0IHJldmVyc2UgKi8KLXsiZnN1YnIiLCAgMiwgMHhkOGU4LCBYLCBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZzdWJyIiwgIDEsIDB4ZDhlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBTWVNWMzg2X0NPTVBBVAoteyJmc3ViciIsICAwLCAweGRlZTksIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnN1YnJwICovCi0jZW5kaWYKLXsiZnN1YnIiLCAgMSwJMHhkOCwgNSwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlzdWJyIiwgMSwJMHhkZSwgNSwgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi0jaWYgU1lTVjM4Nl9DT01QQVQKLXsiZnN1YnJwIiwgMiwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZnN1YnJwIiwgMSwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicnAiLCAwLCAweGRlZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNpZiBPTERHQ0NfQ09NUEFUCi17ImZzdWJycCIsIDIsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0jZW5kaWYKLSNlbHNlCi17ImZzdWJycCIsIDIsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJycCIsIDEsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnJwIiwgMCwgMHhkZWUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLQotLyogbXVsdGlwbHkgKi8KLXsiZm11bCIsICAgMiwgMHhkOGM4LCBYLCBGUHxTaG9ydEZvcm18RmxvYXRELAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZm11bCIsICAgMSwgMHhkOGM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFNZU1YzODZfQ09NUEFUCi17ImZtdWwiLCAgIDAsIDB4ZGVjOSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmbXVscCAqLwotI2VuZGlmCi17ImZtdWwiLCAgIDEsCTB4ZDgsIDEsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpbXVsIiwgIDEsCTB4ZGUsIDEsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLXsiZm11bHAiLCAgMiwgMHhkZWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZm11bHAiLCAgMSwgMHhkZWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmbXVscCIsICAwLCAweGRlYzksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZm11bHAiLCAgMiwgMHhkZWM4LCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLQotLyogZGl2aWRlICovCi17ImZkaXYiLCAgIDIsIDB4ZDhmMCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmZGl2IiwgICAxLCAweGQ4ZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgU1lTVjM4Nl9DT01QQVQKLXsiZmRpdiIsICAgMCwgMHhkZWYxLCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZkaXZwICovCi0jZW5kaWYKLXsiZmRpdiIsICAgMSwJMHhkOCwgNiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlkaXYiLCAgMSwJMHhkZSwgNiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFNZU1YzODZfQ09NUEFUCi17ImZkaXZwIiwgIDIsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZwIiwgIDEsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnAiLCAgMCwgMHhkZWYxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jaWYgT0xER0NDX0NPTVBBVAoteyJmZGl2cCIsICAyLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2VuZGlmCi0jZWxzZQoteyJmZGl2cCIsICAyLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cCIsICAxLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZwIiwgIDAsIDB4ZGVmOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLS8qIGRpdmlkZSByZXZlcnNlICovCi17ImZkaXZyIiwgIDIsIDB4ZDhmOCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmZGl2ciIsICAxLCAweGQ4ZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgU1lTVjM4Nl9DT01QQVQKLXsiZmRpdnIiLCAgMCwgMHhkZWY5LCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZkaXZycCAqLwotI2VuZGlmCi17ImZkaXZyIiwgIDEsCTB4ZDgsIDcsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpZGl2ciIsIDEsCTB4ZGUsIDcsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFNZU1YzODZfQ09NUEFUCi17ImZkaXZycCIsIDIsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZycCIsIDEsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnJwIiwgMCwgMHhkZWY5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jaWYgT0xER0NDX0NPTVBBVAoteyJmZGl2cnAiLCAyLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2VuZGlmCi0jZWxzZQoteyJmZGl2cnAiLCAyLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cnAiLCAxLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZycCIsIDAsIDB4ZGVmMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLXsiZjJ4bTEiLCAgMCwgMHhkOWYwLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZ5bDJ4IiwgIDAsIDB4ZDlmMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHRhbiIsICAwLCAweGQ5ZjIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnBhdGFuIiwgMCwgMHhkOWYzLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZ4dHJhY3QiLDAsIDB4ZDlmNCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHJlbTEiLCAwLCAweGQ5ZjUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmRlY3N0cCIsMCwgMHhkOWY2LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZpbmNzdHAiLDAsIDB4ZDlmNywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHJlbSIsICAwLCAweGQ5ZjgsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnlsMnhwMSIsMCwgMHhkOWY5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzcXJ0IiwgIDAsIDB4ZDlmYSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc2luY29zIiwwLCAweGQ5ZmIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnJuZGludCIsMCwgMHhkOWZjLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzY2FsZSIsIDAsIDB4ZDlmZCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc2luIiwgICAwLCAweGQ5ZmUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmNvcyIsICAgMCwgMHhkOWZmLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZjaHMiLCAgIDAsIDB4ZDllMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmYWJzIiwgICAwLCAweGQ5ZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLQotLyogcHJvY2Vzc29yIGNvbnRyb2wgKi8KLXsiZm5pbml0IiwgMCwgMHhkYmUzLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZpbml0IiwgIDAsIDB4ZGJlMywgWCwgRlB8RldhaXQsCQl7IDAsIDAsIDB9IH0sCi17ImZsZGN3IiwgIDEsCTB4ZDksIDUsIEZQfE1vZHJtLAkJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZm5zdGN3IiwgMSwJMHhkOSwgNywgRlB8TW9kcm0sCQl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmc3RjdyIsICAxLAkweGQ5LCA3LCBGUHxGV2FpdHxNb2RybSwJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZm5zdHN3IiwgMSwgMHhkZmUwLCBYLCBGUCwJCQl7IEFjYywgMCwgMH0gfSwKLXsiZm5zdHN3IiwgMSwJMHhkZCwgNywgRlB8TW9kcm0sCQl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmbnN0c3ciLCAwLCAweGRmZTAsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnN0c3ciLCAgMSwgMHhkZmUwLCBYLCBGUHxGV2FpdCwJCXsgQWNjLCAwLCAwfSB9LAoteyJmc3RzdyIsICAxLAkweGRkLCA3LCBGUHxGV2FpdHxNb2RybSwJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZnN0c3ciLCAgMCwgMHhkZmUwLCBYLCBGUHxGV2FpdCwJCXsgMCwgMCwgMH0gfSwKLXsiZm5jbGV4IiwgMCwgMHhkYmUyLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZjbGV4IiwgIDAsIDB4ZGJlMiwgWCwgRlB8RldhaXQsCQl7IDAsIDAsIDB9IH0sCi0vKiBTaG9ydCBmb3JtcyBvZiBmbGRlbnYsIGZzdGVudiB1c2UgZGF0YSBzaXplIHByZWZpeC4gICovCi17ImZuc3RlbnYiLDEsCTB4ZDksIDYsIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZzdGVudiIsIDEsCTB4ZDksIDYsIHNsX1N1ZnxGV2FpdHxNb2RybSwJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmxkZW52IiwgMSwJMHhkOSwgNCwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZm5zYXZlIiwgMSwJMHhkZCwgNiwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnNhdmUiLCAgMSwJMHhkZCwgNiwgc2xfU3VmfEZXYWl0fE1vZHJtLAl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmcnN0b3IiLCAxLAkweGRkLCA0LCBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAotCi17ImZmcmVlIiwgIDEsIDB4ZGRjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLS8qIFA2OmZyZWUgc3QoaSksIHBvcCBzdCAqLwoteyJmZnJlZXAiLCAxLCAweGRmYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZub3AiLCAgIDAsIDB4ZDlkMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBGV0FJVF9PUENPREUgMHg5YgoteyJmd2FpdCIsICAwLAkweDliLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0KLS8qIE9wY29kZSBwcmVmaXhlczsgd2UgYWxsb3cgdGhlbSBhcyBzZXBhcmF0ZSBpbnNucyB0b28uICAqLwotCi0jZGVmaW5lIEFERFJfUFJFRklYX09QQ09ERSAweDY3Ci17ImFkZHIxNiIsIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImFkZHIzMiIsIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImF3b3JkIiwgIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImFkd29yZCIsIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIERBVEFfUFJFRklYX09QQ09ERSAweDY2Ci17ImRhdGExNiIsIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImRhdGEzMiIsIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17IndvcmQiLCAgIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi17ImR3b3JkIiwgIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIExPQ0tfUFJFRklYX09QQ09ERSAweGYwCi17ImxvY2siLCAgIDAsCTB4ZjAsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17IndhaXQiLCAgIDAsICAgMHg5YiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgQ1NfUFJFRklYX09QQ09ERSAweDJlCi17ImNzIiwJICAgMCwJMHgyZSwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgRFNfUFJFRklYX09QQ09ERSAweDNlCi17ImRzIiwJICAgMCwJMHgzZSwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgRVNfUFJFRklYX09QQ09ERSAweDI2Ci17ImVzIiwJICAgMCwJMHgyNiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgRlNfUFJFRklYX09QQ09ERSAweDY0Ci17ImZzIiwJICAgMCwJMHg2NCwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgR1NfUFJFRklYX09QQ09ERSAweDY1Ci17ImdzIiwJICAgMCwJMHg2NSwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgU1NfUFJFRklYX09QQ09ERSAweDM2Ci17InNzIiwJICAgMCwJMHgzNiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgUkVQTkVfUFJFRklYX09QQ09ERSAweGYyCi0jZGVmaW5lIFJFUEVfUFJFRklYX09QQ09ERSAgMHhmMwoteyJyZXAiLAkgICAwLAkweGYzLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJyZXBlIiwgICAwLAkweGYzLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJyZXB6IiwgICAwLAkweGYzLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJyZXBuZSIsICAwLAkweGYyLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJyZXBueiIsICAwLAkweGYyLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotCi0vKiA0ODYgZXh0ZW5zaW9ucy4gICovCi0KLXsiYnN3YXAiLCAgIDEsIDB4MGZjOCwgWCwgbF9TdWZ8U2hvcnRGb3JtLAl7IFJlZzMyLCAwLCAwIH0gfSwKLXsieGFkZCIsICAgIDIsIDB4MGZjMCwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCi17ImNtcHhjaGciLCAyLCAweDBmYjAsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDAgfSB9LAoteyJpbnZkIiwgICAgMCwgMHgwZjA4LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsid2JpbnZkIiwgIDAsIDB4MGYwOSwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17ImludmxwZyIsICAxLCAweDBmMDEsIDcsIE5vU3VmfE1vZHJtLAkJeyBBbnlNZW0sIDAsIDB9IH0sCi0KLS8qIDU4NiBhbmQgbGF0ZSA0ODYgZXh0ZW5zaW9ucy4gICovCi17ImNwdWlkIiwgICAwLCAweDBmYTIsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAotCi0vKiBQZW50aXVtIGV4dGVuc2lvbnMuICAqLwoteyJ3cm1zciIsICAgMCwgMHgwZjMwLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmR0c2MiLCAgIDAsIDB4MGYzMSwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17InJkbXNyIiwgICAwLCAweDBmMzIsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJjbXB4Y2hnOGIiLDEsMHgwZmM3LCAxLCBOb1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17InN5c2VudGVyIiwwLCAweDBmMzQsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJzeXNleGl0IiwgMCwgMHgwZjM1LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsiZnhzYXZlIiwgIDEsIDB4MGZhZSwgMCwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmeHJzdG9yIiwgMSwgMHgwZmFlLCAxLCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi0KLS8qIFBlbnRpdW0gUHJvIGV4dGVuc2lvbnMuICAqLwoteyJyZHBtYyIsICAgMCwgMHgwZjMzLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLQoteyJ1ZDIiLAkgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogb2ZmaWNpYWwgdW5kZWZpbmVkIGluc3RyLiAqLwoteyJ1ZDJhIiwgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogYWxpYXMgZm9yIHVkMiAqLwoteyJ1ZDJiIiwgICAgMCwgMHgwZmI5LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogMm5kLiBvZmZpY2lhbCB1bmRlZmluZWQgaW5zdHIuICovCi0KLXsiY21vdm8iLCAgIDIsIDB4MGY0MCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZubyIsICAyLCAweDBmNDEsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YiIsICAgMiwgMHgwZjQyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmMiLCAgIDIsIDB4MGY0MiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYWUiLCAyLCAweDBmNDIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YWUiLCAgMiwgMHgwZjQzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5jIiwgIDIsIDB4MGY0MywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYiIsICAyLCAweDBmNDMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92ZSIsICAgMiwgMHgwZjQ0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdnoiLCAgIDIsIDB4MGY0NCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZSIsICAyLCAweDBmNDUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bnoiLCAgMiwgMHgwZjQ1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmJlIiwgIDIsIDB4MGY0NiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYSIsICAyLCAweDBmNDYsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YSIsICAgMiwgMHgwZjQ3LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5iZSIsIDIsIDB4MGY0NywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZzIiwgICAyLCAweDBmNDgsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bnMiLCAgMiwgMHgwZjQ5LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdnAiLCAgIDIsIDB4MGY0YSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZucCIsICAyLCAweDBmNGIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bCIsICAgMiwgMHgwZjRjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5nZSIsIDIsIDB4MGY0YywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZnZSIsICAyLCAweDBmNGQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmwiLCAgMiwgMHgwZjRkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmxlIiwgIDIsIDB4MGY0ZSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZyIsICAyLCAweDBmNGUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92ZyIsICAgMiwgMHgwZjRmLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5sZSIsIDIsIDB4MGY0ZiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLXsiZmNtb3ZiIiwgIDIsIDB4ZGFjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmFlIiwyLCAweGRhYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdmUiLCAgMiwgMHhkYWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZiZSIsIDIsIDB4ZGFkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmEiLCAyLCAweGRhZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdnUiLCAgMiwgMHhkYWQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhZSIsIDIsIDB4ZGJjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmIiLCAyLCAweGRiYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5lIiwgMiwgMHhkYmM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhIiwgIDIsIDB4ZGJkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmJlIiwyLCAweGRiZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm51IiwgMiwgMHhkYmQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLQoteyJmY29taSIsICAgMiwgMHhkYmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNvbWkiLCAgIDAsIDB4ZGJmMSwgWCwgRlB8U2hvcnRGb3JtLAkJeyAwLCAwLCAwfSB9LAoteyJmY29taSIsICAgMSwgMHhkYmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMiwgMHhkYmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnVjb21pIiwgIDAsIDB4ZGJlOSwgWCwgRlB8U2hvcnRGb3JtLAkJeyAwLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMSwgMHhkYmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmY29taXAiLCAgMiwgMHhkZmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNvbXBpIiwgIDIsIDB4ZGZmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjb21waSIsICAwLCAweGRmZjEsIFgsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZmNvbXBpIiwgIDEsIDB4ZGZmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnVjb21pcCIsIDIsIDB4ZGZlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZ1Y29tcGkiLCAyLCAweGRmZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmdWNvbXBpIiwgMCwgMHhkZmU5LCBYLCBGUHxTaG9ydEZvcm0sCQl7IDAsIDAsIDB9IH0sCi17ImZ1Y29tcGkiLCAxLCAweGRmZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0KLS8qIE1NWCBpbnN0cnVjdGlvbnMuICAqLwotCi17ImVtbXMiLCAgICAgMCwgMHgwZjc3LCBYLCBGUCwJCQl7IDAsIDAsIDAgfSB9LAoteyJtb3ZkIiwgICAgIDIsIDB4MGY2ZSwgWCwgRlB8TW9kcm0sCQl7IFJlZzMyfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17Im1vdmQiLCAgICAgMiwgMHgwZjdlLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YLCBSZWczMnxMb25nTWVtLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmNmYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmN2YsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVgsIFJlZ01NWHxMb25nTWVtLCAwIH0gfSwKLXsicGFja3NzZHciLCAyLCAweDBmNmIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Nzd2IiLCAyLCAweDBmNjMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Vzd2IiLCAyLCAweDBmNjcsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGIiLCAgICAyLCAweDBmZmMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHciLCAgICAyLCAweDBmZmQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGQiLCAgICAyLCAweDBmZmUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHNiIiwgICAyLCAweDBmZWMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHN3IiwgICAyLCAweDBmZWQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzYiIsICAyLCAweDBmZGMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzdyIsICAyLCAweDBmZGQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZCIsICAgICAyLCAweDBmZGIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZG4iLCAgICAyLCAweDBmZGYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxYiIsICAyLCAweDBmNzQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxdyIsICAyLCAweDBmNzUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxZCIsICAyLCAweDBmNzYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0YiIsICAyLCAweDBmNjQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0dyIsICAyLCAweDBmNjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0ZCIsICAyLCAweDBmNjYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1hZGR3ZCIsICAyLCAweDBmZjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGh3IiwgICAyLCAweDBmZTUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGx3IiwgICAyLCAweDBmZDUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG9yIiwJICAgICAyLCAweDBmZWIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmZjEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmNzEsIDYsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGZmMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGY3MiwgNiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZmYzLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZjczLCA2LCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmZTEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmNzEsIDQsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGZlMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGY3MiwgNCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZmQxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZjcxLCAyLCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmZDIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmNzIsIDIsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGZkMywgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGY3MywgMiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzdWJiIiwgICAgMiwgMHgwZmY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ3IiwgICAgMiwgMHgwZmY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJkIiwgICAgMiwgMHgwZmZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzYiIsICAgMiwgMHgwZmU4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzdyIsICAgMiwgMHgwZmU5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c2IiLCAgMiwgMHgwZmQ4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c3ciLCAgMiwgMHgwZmQ5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hidyIsMiwgMHgwZjY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2h3ZCIsMiwgMHgwZjY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hkcSIsMiwgMHgwZjZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xidyIsMiwgMHgwZjYwLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2x3ZCIsMiwgMHgwZjYxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xkcSIsMiwgMHgwZjYyLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB4b3IiLCAgICAgMiwgMHgwZmVmLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi0KLQotLyogUElJSSBLYXRtYWkgTmV3IEluc3RydWN0aW9ucyAvIFNJTUQgaW5zdHJ1Y3Rpb25zLiAgKi8KLQoteyJhZGRwcyIsICAgICAyLCAweDBmNTgsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiYWRkc3MiLCAgICAgMiwgMHhmMzBmNTgsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiYW5kbnBzIiwgICAgMiwgMHgwZjU1LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImFuZHBzIiwgICAgIDIsIDB4MGY1NCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcGVxcHMiLCAgIDIsIDB4MGZjMiwgICAgMCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wZXFzcyIsICAgMiwgMHhmMzBmYzIsICAwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcGxlcHMiLCAgIDIsIDB4MGZjMiwgICAgMiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbGVzcyIsICAgMiwgMHhmMzBmYzIsICAyLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcGx0cHMiLCAgIDIsIDB4MGZjMiwgICAgMSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbHRzcyIsICAgMiwgMHhmMzBmYzIsICAxLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG5lcXBzIiwgIDIsIDB4MGZjMiwgICAgNCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmVxc3MiLCAgMiwgMHhmMzBmYzIsICA0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG5sZXBzIiwgIDIsIDB4MGZjMiwgICAgNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmxlc3MiLCAgMiwgMHhmMzBmYzIsICA2LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG5sdHBzIiwgIDIsIDB4MGZjMiwgICAgNSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmx0c3MiLCAgMiwgMHhmMzBmYzIsICA1LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG9yZHBzIiwgIDIsIDB4MGZjMiwgICAgNywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wb3Jkc3MiLCAgMiwgMHhmMzBmYzIsICA3LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcHVub3JkcHMiLDIsIDB4MGZjMiwgICAgMywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wdW5vcmRzcyIsMiwgMHhmMzBmYzIsICAzLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcHBzIiwgICAgIDMsIDB4MGZjMiwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0gfSB9LAoteyJjbXBzcyIsICAgICAzLCAweGYzMGZjMiwgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0gfSB9LAoteyJjb21pc3MiLCAgICAyLCAweDBmMmYsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjdnRwaTJwcyIsICAyLCAweDBmMmEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY3Z0cHMycGkiLCAgMiwgMHgwZjJkLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17ImN2dHNpMnNzIiwgIDIsIDB4ZjMwZjJhLCAgWCwgRlB8TW9kcm0sCXsgUmVnMzJ8V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY3Z0c3Myc2kiLCAgMiwgMHhmMzBmMmQsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnMzIsIDAgfSB9LAoteyJjdnR0cHMycGkiLCAyLCAweDBmMmMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsiY3Z0dHNzMnNpIiwgMiwgMHhmMzBmMmMsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnMzIsIDAgfSB9LAoteyJkaXZwcyIsICAgICAyLCAweDBmNWUsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsiZGl2c3MiLCAgICAgMiwgMHhmMzBmNWUsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibGRteGNzciIsICAgMSwgMHgwZmFlLCAgICAyLCBGUHxNb2RybSwgCXsgV29yZE1lbSwgMCwgMCB9IH0sCi17Im1hc2ttb3ZxIiwgIDIsIDB4MGZmNywgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfEludk1lbSwgUmVnTU1YLCAwIH0gfSwKLXsibWF4cHMiLCAgICAgMiwgMHgwZjVmLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1heHNzIiwgICAgIDIsIDB4ZjMwZjVmLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1pbnBzIiwgICAgIDIsIDB4MGY1ZCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtaW5zcyIsICAgICAyLCAweGYzMGY1ZCwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZhcHMiLCAgICAyLCAweDBmMjgsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92YXBzIiwgICAgMiwgMHgwZjI5LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIFJlZ1hNTXxMTG9uZ01lbSwgMCB9IH0sCi17Im1vdmhscHMiLCAgIDIsIDB4MGYxMiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfEludk1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92aHBzIiwgICAgMiwgMHgwZjE2LCAgICBYLCBGUHxNb2RybSwJeyBMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92aHBzIiwgICAgMiwgMHgwZjE3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bGhwcyIsICAgMiwgMHgwZjE2LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18SW52TWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZscHMiLCAgICAyLCAweDBmMTIsICAgIFgsIEZQfE1vZHJtLAl7IExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZscHMiLCAgICAyLCAweDBmMTMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTSwgTExvbmdNZW0sIDAgfSB9LAoteyJtb3Ztc2twcyIsICAyLCAweDBmNTAsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxJbnZNZW0sIFJlZzMyLCAwIH0gfSwKLXsibW92bnRwcyIsICAgMiwgMHgwZjJiLCAgICBYLCBGUHxNb2RybSwgCXsgUmVnWE1NLCBMTG9uZ01lbSwgMCB9IH0sCi17Im1vdm50cSIsICAgIDIsIDB4MGZlNywgICAgWCwgRlB8TW9kcm0sIAl7IFJlZ01NWCwgTExvbmdNZW0sIDAgfSB9LAoteyJtb3ZzcyIsICAgICAyLCAweGYzMGYxMCwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3ZzcyIsICAgICAyLCAweGYzMGYxMSwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTSwgUmVnWE1NfFdvcmRNZW0sIDAgfSB9LAoteyJtb3Z1cHMiLCAgICAyLCAweDBmMTAsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92dXBzIiwgICAgMiwgMHgwZjExLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIFJlZ1hNTXxMTG9uZ01lbSwgMCB9IH0sCi17Im11bHBzIiwgICAgIDIsIDB4MGY1OSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtdWxzcyIsICAgICAyLCAweGYzMGY1OSwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJvcnBzIiwgICAgICAyLCAweDBmNTYsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsicGF2Z2IiLCAgICAgMiwgMHgwZmUwLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBhdmd3IiwgICAgIDIsIDB4MGZlMywgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZXh0cnciLCAgICAzLCAweDBmYzUsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ01NWCwgUmVnMzJ8SW52TWVtIH0gfSwKLXsicGluc3J3IiwgICAgMywgMHgwZmM0LCAgICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWczMnxTaG9ydE1lbSwgUmVnTU1YIH0gfSwKLXsicG1heHN3IiwgICAgMiwgMHgwZmVlLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtYXh1YiIsICAgIDIsIDB4MGZkZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWluc3ciLCAgICAyLCAweDBmZWEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1pbnViIiwgICAgMiwgMHgwZmRhLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtb3Ztc2tiIiwgIDIsIDB4MGZkNywgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YLCBSZWczMnxJbnZNZW0sIDAgfSB9LAoteyJwbXVsaHV3IiwgICAyLCAweDBmZTQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHJlZmV0Y2hudGEiLCAxLCAweDBmMTgsICAwLCBGUHxNb2RybSwgCXsgTExvbmdNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHQwIiwgIDEsIDB4MGYxOCwgIDEsIEZQfE1vZHJtLCAJeyBMTG9uZ01lbSwgMCwgMCB9IH0sCi17InByZWZldGNodDEiLCAgMSwgMHgwZjE4LCAgMiwgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h0MiIsICAxLCAweDBmMTgsICAzLCBGUHxNb2RybSwgCXsgTExvbmdNZW0sIDAsIDAgfSB9LAoteyJwc2FkYnciLCAgICAyLCAweDBmZjYsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNodWZ3IiwgICAgMywgMHgwZjcwLCAgICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCB9IH0sCi17InJjcHBzIiwgICAgIDIsIDB4MGY1MywgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJyY3BzcyIsICAgICAyLCAweGYzMGY1MywgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJyc3FydHBzIiwgICAyLCAweDBmNTIsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsicnNxcnRzcyIsICAgMiwgMHhmMzBmNTIsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsic2ZlbmNlIiwgICAgMCwgMHgwZmFlZjgsICBYLCBGUCwJCXsgMCwgMCwgMCB9IH0sCi17InNodWZwcyIsICAgIDMsIDB4MGZjNiwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0gfSB9LAoteyJzcXJ0cHMiLCAgICAyLCAweDBmNTEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3FydHNzIiwgICAgMiwgMHhmMzBmNTEsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3RteGNzciIsICAgMSwgMHgwZmFlLCAgICAzLCBGUHxNb2RybSwgCXsgV29yZE1lbSwgMCwgMCB9IH0sCi17InN1YnBzIiwgICAgIDIsIDB4MGY1YywgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJzdWJzcyIsICAgICAyLCAweGYzMGY1YywgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJ1Y29taXNzIiwgICAyLCAweDBmMmUsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJ1bnBja2hwcyIsICAyLCAweDBmMTUsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsidW5wY2tscHMiLCAgMiwgMHgwZjE0LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InhvcnBzIiwgICAgIDIsIDB4MGY1NywgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAotCi0vKiBBTUQgM0ROb3chIGluc3RydWN0aW9ucy4gICovCi0KLXsicHJlZmV0Y2giLCAxLCAweDBmMGQsCSAgIDAsIEZQfE1vZHJtLAkJeyBCeXRlTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h3IiwxLCAweDBmMGQsCSAgIDEsIEZQfE1vZHJtLAkJeyBCeXRlTWVtLCAwLCAwIH0gfSwKLXsiZmVtbXMiLCAgICAwLCAweDBmMGUsCSAgIFgsIEZQLAkJeyAwLCAwLCAwIH0gfSwKLXsicGF2Z3VzYiIsICAyLCAweDBmMGYsIDB4YmYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGYyaWQiLCAgICAyLCAweDBmMGYsIDB4MWQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGYyaXciLCAgICAyLCAweDBmMGYsIDB4MWMsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwgLyogQXRobG9uICovCi17InBmYWNjIiwgICAgMiwgMHgwZjBmLCAweGFlLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmYWRkIiwgICAgMiwgMHgwZjBmLCAweDllLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmY21wZXEiLCAgMiwgMHgwZjBmLCAweGIwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmY21wZ2UiLCAgMiwgMHgwZjBmLCAweDkwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmY21wZ3QiLCAgMiwgMHgwZjBmLCAweGEwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmbWF4IiwgICAgMiwgMHgwZjBmLCAweGE0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmbWluIiwgICAgMiwgMHgwZjBmLCAweDk0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmbXVsIiwgICAgMiwgMHgwZjBmLCAweGI0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBmbmFjYyIsICAgMiwgMHgwZjBmLCAweDhhLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sIC8qIEF0aGxvbiAqLwoteyJwZnBuYWNjIiwgIDIsIDB4MGYwZiwgMHg4ZSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LCAvKiBBdGhsb24gKi8KLXsicGZyY3AiLCAgICAyLCAweDBmMGYsIDB4OTYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZyY3BpdDEiLCAyLCAweDBmMGYsIDB4YTYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZyY3BpdDIiLCAyLCAweDBmMGYsIDB4YjYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZyc3FpdDEiLCAyLCAweDBmMGYsIDB4YTcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZyc3FydCIsICAyLCAweDBmMGYsIDB4OTcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZzdWIiLCAgICAyLCAweDBmMGYsIDB4OWEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZzdWJyIiwgICAyLCAweDBmMGYsIDB4YWEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGkyZmQiLCAgICAyLCAweDBmMGYsIDB4MGQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGkyZnciLCAgICAyLCAweDBmMGYsIDB4MGMsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwgLyogQXRobG9uICovCi17InBtdWxocnciLCAgMiwgMHgwZjBmLCAweGI3LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzd2FwZCIsICAgMiwgMHgwZjBmLCAweGJiLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sIC8qIEF0aGxvbiAqLwotCi17TlVMTCwgMCwgMCwgMCwgMCwgeyAwLCAwLCAwfSB9CS8qIHNlbnRpbmVsICovCi19OwotI3VuZGVmIFgKLSN1bmRlZiBOb1N1ZgotI3VuZGVmIGJfU3VmCi0jdW5kZWYgd19TdWYKLSN1bmRlZiBsX1N1ZgotI3VuZGVmIGRfU3VmCi0jdW5kZWYgeF9TdWYKLSN1bmRlZiBid19TdWYKLSN1bmRlZiBibF9TdWYKLSN1bmRlZiB3bF9TdWYKLSN1bmRlZiBzbF9TdWYKLSN1bmRlZiBzbGRfU3VmCi0jdW5kZWYgc2xkeF9TdWYKLSN1bmRlZiBid2xfU3VmCi0jdW5kZWYgYndsZF9TdWYKLSN1bmRlZiBGUAotI3VuZGVmIGxfRlAKLSN1bmRlZiBkX0ZQCi0jdW5kZWYgeF9GUAotI3VuZGVmIHNsX0ZQCi0jdW5kZWYgc2xkX0ZQCi0jdW5kZWYgc2xkeF9GUAotCi0jZGVmaW5lIE1BWF9NTkVNX1NJWkUgMTYJLyogZm9yIHBhcnNpbmcgaW5zbiBtbmVtb25pY3MgZnJvbSBpbnB1dCAqLwotCi0KLS8qIDM4NiByZWdpc3RlciB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCByZWdfZW50cnkgaTM4Nl9yZWd0YWJbXSA9IHsKLSAgLyogbWFrZSAlc3QgZmlyc3QgYXMgd2UgdGVzdCBmb3IgaXQgKi8KLSAgeyJzdCIsIEZsb2F0UmVnfEZsb2F0QWNjLCAwfSwKLSAgLyogOCBiaXQgcmVncyAqLwotICB7ImFsIiwgUmVnOHxBY2MsIDB9LAotICB7ImNsIiwgUmVnOHxTaGlmdENvdW50LCAxfSwKLSAgeyJkbCIsIFJlZzgsIDJ9LAotICB7ImJsIiwgUmVnOCwgM30sCi0gIHsiYWgiLCBSZWc4LCA0fSwKLSAgeyJjaCIsIFJlZzgsIDV9LAotICB7ImRoIiwgUmVnOCwgNn0sCi0gIHsiYmgiLCBSZWc4LCA3fSwKLSAgLyogMTYgYml0IHJlZ3MgKi8KLSAgeyJheCIsIFJlZzE2fEFjYywgMH0sCi0gIHsiY3giLCBSZWcxNiwgMX0sCi0gIHsiZHgiLCBSZWcxNnxJbk91dFBvcnRSZWcsIDJ9LAotICB7ImJ4IiwgUmVnMTZ8QmFzZUluZGV4LCAzfSwKLSAgeyJzcCIsIFJlZzE2LCA0fSwKLSAgeyJicCIsIFJlZzE2fEJhc2VJbmRleCwgNX0sCi0gIHsic2kiLCBSZWcxNnxCYXNlSW5kZXgsIDZ9LAotICB7ImRpIiwgUmVnMTZ8QmFzZUluZGV4LCA3fSwKLSAgLyogMzIgYml0IHJlZ3MgKi8KLSAgeyJlYXgiLCBSZWczMnxCYXNlSW5kZXh8QWNjLCAwfSwKLSAgeyJlY3giLCBSZWczMnxCYXNlSW5kZXgsIDF9LAotICB7ImVkeCIsIFJlZzMyfEJhc2VJbmRleCwgMn0sCi0gIHsiZWJ4IiwgUmVnMzJ8QmFzZUluZGV4LCAzfSwKLSAgeyJlc3AiLCBSZWczMiwgNH0sCi0gIHsiZWJwIiwgUmVnMzJ8QmFzZUluZGV4LCA1fSwKLSAgeyJlc2kiLCBSZWczMnxCYXNlSW5kZXgsIDZ9LAotICB7ImVkaSIsIFJlZzMyfEJhc2VJbmRleCwgN30sCi0gIC8qIHNlZ21lbnQgcmVnaXN0ZXJzICovCi0gIHsiZXMiLCBTUmVnMiwgMH0sCi0gIHsiY3MiLCBTUmVnMiwgMX0sCi0gIHsic3MiLCBTUmVnMiwgMn0sCi0gIHsiZHMiLCBTUmVnMiwgM30sCi0gIHsiZnMiLCBTUmVnMywgNH0sCi0gIHsiZ3MiLCBTUmVnMywgNX0sCi0gIC8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0gIHsiY3IwIiwgQ29udHJvbCwgMH0sCi0gIHsiY3IxIiwgQ29udHJvbCwgMX0sCi0gIHsiY3IyIiwgQ29udHJvbCwgMn0sCi0gIHsiY3IzIiwgQ29udHJvbCwgM30sCi0gIHsiY3I0IiwgQ29udHJvbCwgNH0sCi0gIHsiY3I1IiwgQ29udHJvbCwgNX0sCi0gIHsiY3I2IiwgQ29udHJvbCwgNn0sCi0gIHsiY3I3IiwgQ29udHJvbCwgN30sCi0gIC8qIGRlYnVnIHJlZ2lzdGVycyAqLwotICB7ImRiMCIsIERlYnVnLCAwfSwKLSAgeyJkYjEiLCBEZWJ1ZywgMX0sCi0gIHsiZGIyIiwgRGVidWcsIDJ9LAotICB7ImRiMyIsIERlYnVnLCAzfSwKLSAgeyJkYjQiLCBEZWJ1ZywgNH0sCi0gIHsiZGI1IiwgRGVidWcsIDV9LAotICB7ImRiNiIsIERlYnVnLCA2fSwKLSAgeyJkYjciLCBEZWJ1ZywgN30sCi0gIHsiZHIwIiwgRGVidWcsIDB9LAotICB7ImRyMSIsIERlYnVnLCAxfSwKLSAgeyJkcjIiLCBEZWJ1ZywgMn0sCi0gIHsiZHIzIiwgRGVidWcsIDN9LAotICB7ImRyNCIsIERlYnVnLCA0fSwKLSAgeyJkcjUiLCBEZWJ1ZywgNX0sCi0gIHsiZHI2IiwgRGVidWcsIDZ9LAotICB7ImRyNyIsIERlYnVnLCA3fSwKLSAgLyogdGVzdCByZWdpc3RlcnMgKi8KLSAgeyJ0cjAiLCBUZXN0LCAwfSwKLSAgeyJ0cjEiLCBUZXN0LCAxfSwKLSAgeyJ0cjIiLCBUZXN0LCAyfSwKLSAgeyJ0cjMiLCBUZXN0LCAzfSwKLSAgeyJ0cjQiLCBUZXN0LCA0fSwKLSAgeyJ0cjUiLCBUZXN0LCA1fSwKLSAgeyJ0cjYiLCBUZXN0LCA2fSwKLSAgeyJ0cjciLCBUZXN0LCA3fSwKLSAgLyogbW14IGFuZCBzaW1kIHJlZ2lzdGVycyAqLwotICB7Im1tMCIsIFJlZ01NWCwgMH0sCi0gIHsibW0xIiwgUmVnTU1YLCAxfSwKLSAgeyJtbTIiLCBSZWdNTVgsIDJ9LAotICB7Im1tMyIsIFJlZ01NWCwgM30sCi0gIHsibW00IiwgUmVnTU1YLCA0fSwKLSAgeyJtbTUiLCBSZWdNTVgsIDV9LAotICB7Im1tNiIsIFJlZ01NWCwgNn0sCi0gIHsibW03IiwgUmVnTU1YLCA3fSwKLSAgeyJ4bW0wIiwgUmVnWE1NLCAwfSwKLSAgeyJ4bW0xIiwgUmVnWE1NLCAxfSwKLSAgeyJ4bW0yIiwgUmVnWE1NLCAyfSwKLSAgeyJ4bW0zIiwgUmVnWE1NLCAzfSwKLSAgeyJ4bW00IiwgUmVnWE1NLCA0fSwKLSAgeyJ4bW01IiwgUmVnWE1NLCA1fSwKLSAgeyJ4bW02IiwgUmVnWE1NLCA2fSwKLSAgeyJ4bW03IiwgUmVnWE1NLCA3fQotfTsKLQotc3RhdGljIGNvbnN0IHJlZ19lbnRyeSBpMzg2X2Zsb2F0X3JlZ3RhYltdID0gewotICB7InN0KDApIiwgRmxvYXRSZWd8RmxvYXRBY2MsIDB9LAotICB7InN0KDEpIiwgRmxvYXRSZWcsIDF9LAotICB7InN0KDIpIiwgRmxvYXRSZWcsIDJ9LAotICB7InN0KDMpIiwgRmxvYXRSZWcsIDN9LAotICB7InN0KDQpIiwgRmxvYXRSZWcsIDR9LAotICB7InN0KDUpIiwgRmxvYXRSZWcsIDV9LAotICB7InN0KDYpIiwgRmxvYXRSZWcsIDZ9LAotICB7InN0KDcpIiwgRmxvYXRSZWcsIDd9Ci19OwotCi0jZGVmaW5lIE1BWF9SRUdfTkFNRV9TSVpFIDgJLyogZm9yIHBhcnNpbmcgcmVnaXN0ZXIgbmFtZXMgZnJvbSBpbnB1dCAqLwotCi0vKiBzZWdtZW50IHN0dWZmICovCi1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGNzID0geyAiY3MiLCAweDJlIH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGRzID0geyAiZHMiLCAweDNlIH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IHNzID0geyAic3MiLCAweDM2IH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGVzID0geyAiZXMiLCAweDI2IH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGZzID0geyAiZnMiLCAweDY0IH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGdzID0geyAiZ3MiLCAweDY1IH07Ci0KLS8qIGVuZCBvZiBvcGNvZGUvaTM4Ni5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pODYwLmggYi9pbmNsdWRlL29wY29kZS9pODYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZWJkMjUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaTg2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBpODYwLgotICAgQ29weXJpZ2h0IChDKSAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBhbmQgR0RCLCB0aGUgR05VIGRpc2Fzc2VtYmxlci4KLQotR0FTL0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUy9HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgIWRlZmluZWQoX19TVERDX18pICYmICFkZWZpbmVkKGNvbnN0KQotI2RlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYW4gb3Bjb2RlIHRhYmxlIGVudHJ5LgotICovCi1zdHJ1Y3QgaTg2MF9vcGNvZGUKLXsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHVuc2lnbmVkIGxvbmcgbWF0Y2g7CS8qIEJpdHMgdGhhdCBtdXN0IGJlIHNldC4gICovCi0gICAgdW5zaWduZWQgbG9uZyBsb3NlOwkvKiBCaXRzIHRoYXQgbXVzdCBub3QgYmUgc2V0LiAgKi8KLSAgICBjb25zdCBjaGFyICphcmdzOwotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIHBvc3NpYmxlIGV4cGFuZC1pbnN0cnVjdGlvbi4gICovCi0gICAgY2hhciBleHBhbmQ7Ci19OwotCi1lbnVtIGV4cGFuZF90eXBlCi17Ci0gICAgRV9NT1YgPSAxLCBFX0FERFIsIEVfVTMyLCBFX0FORCwgRV9TMzIsIEVfREVMQVkKLX07Ci0KLS8qCi0gICBBbGwgaTg2MCBvcGNvZGVzIGFyZSAzMiBiaXRzLCBleGNlcHQgZm9yIHRoZSBwc2V1ZG9pbnN0cnVjdGlvbnMKLSAgIGFuZCB0aGUgb3BlcmF0aW9ucyB1dGlsaXppbmcgYSAzMi1iaXQgYWRkcmVzcyBleHByZXNzaW9uLCBhbgotICAgdW5zaWduZWQgMzItYml0IGNvbnN0YW50LCBvciBhIHNpZ25lZCAzMi1iaXQgY29uc3RhbnQuCi0gICBUaGVzZSBvcGNvZGVzIGFyZSBleHBhbmRlZCBpbnRvIGEgdHdvLWluc3RydWN0aW9uIHNlcXVlbmNlIGZvcgotICAgYW55IHNpdHVhdGlvbiB3aGVyZSB0aGUgaW1tZWRpYXRlIG9wZXJhbmQgZG9lcyBub3QgZml0IGluIDMyIGJpdHMuCi0gICBJbiB0aGUgY2FzZSBvZiB0aGUgYWRkIGFuZCBzdWJ0cmFjdCBvcGVyYXRpb25zIHRoZSBleHBhbnNpb24gaXMKLSAgIHRvIGEgdGhyZWUtaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgKGV4OiBvcmgsIG9yLCBhZGRzKS4gIEluIGNhc2VzCi0gICB3aGVyZSB0aGUgYWRkcmVzcyBpcyB0byBiZSByZWxvY2F0ZWQsIHRoZSBpbnN0cnVjdGlvbiBpcwotICAgZXhwYW5kZWQgdG8gaGFuZGxlIHRoZSB3b3JzZSBjYXNlLCB0aGlzIGNvdWxkIGJlIG9wdGltaXplZCBhdAotICAgdGhlIGZpbmFsIGxpbmsgaWYgdGhlIGFjdHVhbCBhZGRyZXNzIHdlcmUga25vd24uCi0KLSAgIFRoZSBwc2V1ZG9pbnN0cnVjdGlvbnMgYXJlOiAgbW92LCBmbW92LCBwbW92LCBub3AsIGFuZCBmbm9wLgotICAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBhcyBhIG9uZSBvciB0d28gaW5zdHJ1Y3Rpb24KLSAgIHNlcXVlbmNlIG9mIG90aGVyIG9wZXJhdGlvbnMuCi0KLSAgIFRoZSBtYXRjaCBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2ggYQotICAgcGFydGljdWxhciBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlCi0gICBvZiB0aGF0IG9wY29kZS4KLQotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGNoYXJhY3RlcgotICAgZm9yIGVhY2ggb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLUtpbmRzIG9mIG9wZXJhbmRzOgotICAgIyAgICBOdW1iZXIgdXNlZCBieSBvcHRpbWl6ZXIuICBJdCBpcyBpZ25vcmVkLgotICAgMSAgICBzcmMxIGludGVnZXIgcmVnaXN0ZXIuCi0gICAyICAgIHNyYzIgaW50ZWdlciByZWdpc3Rlci4KLSAgIGQgICAgZGVzdCByZWdpc3Rlci4KLSAgIGMJY3RybHJlZyBjb250cm9sIHJlZ2lzdGVyLgotICAgaSAgICAxNiBiaXQgaW1tZWRpYXRlLgotICAgSSAgICAxNiBiaXQgaW1tZWRpYXRlLCBhbGlnbmVkLgotICAgNSAgICA1IGJpdCBpbW1lZGlhdGUuCi0gICBsICAgIGxicm9mZiAyNiBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlLgotICAgciAgICBzYnJvZmYgMTYgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4KLSAgIHMJc3BsaXQgMTYgYml0IGltbWVkaWF0ZS4KLSAgIFMJc3BsaXQgMTYgYml0IGltbWVkaWF0ZSwgYWxpZ25lZC4KLSAgIGUgICAgc3JjMSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLSAgIGYgICAgc3JjMiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLSAgIGcgICAgZGVzdCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLQotKi8KLQotLyogVGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzIGluIHRoaXMgdGFibGUgaXMgc2lnbmlmaWNhbnQ6Ci0gICAKLSAgICogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZQotICAgY29uc2VjdXRpdmUuICBJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQgcnVudGltZS4KLQotICAgKiBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBub3QgY2FyZSBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IGk4NjBfb3Bjb2RlIGk4NjBfb3Bjb2Rlc1tdID0KLXsKLQotLyogUkVHLUZvcm1hdCBJbnN0cnVjdGlvbnMgKi8KLXsgImxkLmMiLAkweDMwMDAwMDAwLCAweGNjMDAwMDAwLCAiYyxkIiwgMCB9LAkvKiBsZC5jIGNzcmMyLGlkZXN0ICovCi17ICJsZC5iIiwJMHgwMDAwMDAwMCwgMHhmYzAwMDAwMCwgIjEoMiksZCIsIDAgfSwJLyogbGQuYiBpc3JjMShpc3JjMiksaWRlc3QgKi8KLXsgImxkLmIiLAkweDA0MDAwMDAwLCAweGY4MDAwMDAwLCAiSSgyKSxkIiwgRV9BRERSIH0sCS8qIGxkLmIgI2NvbnN0KGlzcmMyKSxpZGVzdCAqLwoteyAibGQucyIsCTB4MTAwMDAwMDAsIDB4ZWMwMDAwMDEsICIxKDIpLGQiLCAwIH0sCS8qIGxkLnMgaXNyYzEoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5zIiwJMHgxNDAwMDAwMSwgMHhlODAwMDAwMCwgIkkoMiksZCIsIEVfQUREUiB9LAkvKiBsZC5zICNjb25zdChpc3JjMiksaWRlc3QgKi8KLXsgImxkLmwiLAkweDEwMDAwMDAxLCAweGVjMDAwMDAwLCAiMSgyKSxkIiwgMCB9LAkvKiBsZC5sIGlzcmMxKGlzcmMyKSxpZGVzdCAqLwoteyAibGQubCIsCTB4MTQwMDAwMDEsIDB4ZTgwMDAwMDAsICJJKDIpLGQiLCBFX0FERFIgfSwJLyogbGQubCAjY29uc3QoaXNyYzIpLGlkZXN0ICovCi0KLXsgInN0LmMiLAkweDM4MDAwMDAwLCAweGM0MDAwMDAwLCAiMSxjIiwgMCB9LAkvKiBzdC5jIGlzcmMxbmksY3NyYzIgKi8KLXsgInN0LmIiLAkweDBjMDAwMDAwLCAweGYwMDAwMDAwLCAiMSxTKDIpIiwgRV9BRERSIH0sCS8qIHN0LmIgaXNyYzFuaSwjY29uc3QoaXNyYzIpICovCi17ICJzdC5zIiwJMHgxYzAwMDAwMCwgMHhlMDAwMDAwMCwgIjEsUygyKSIsIEVfQUREUiB9LAkvKiBzdC5zIGlzcmMxbmksI2NvbnN0KGlzcmMyKSAqLwoteyAic3QubCIsCTB4MWMwMDAwMDEsIDB4ZTAwMDAwMDAsICIxLFMoMikiLCBFX0FERFIgfSwJLyogc3QubCBpc3JjMW5pLCNjb25zdChpc3JjMikgKi8KLQoteyAiaXhmciIsCTB4MDgwMDAwMDAsIDB4ZjQwMDAwMDAsICIxLGciLCAwIH0sCS8qIGl4ZnIgaXNyYzFuaSxmZGVzdCAqLwotCi17ICJmbGQubCIsCTB4MjAwMDAwMDIsIDB4ZGMwMDAwMDEsICIxKDIpLGciLCAwIH0sCS8qIGZsZC5sIGlzcmMxKGlzcmMyKSxmZGVzdCAqLwoteyAiZmxkLmwiLAkweDI0MDAwMDAyLCAweGQ4MDAwMDAxLCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIGZsZC5sICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyMDAwMDAwMywgMHhkYzAwMDAwMCwgIjEoMikrKyxnIiwgMCB9LAkvKiBmbGQubCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLmwiLAkweDI0MDAwMDAzLCAweGQ4MDAwMDAwLCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogZmxkLmwgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCi17ICJmbGQuZCIsCTB4MjAwMDAwMDAsIDB4ZGMwMDAwMDcsICIxKDIpLGciLCAwIH0sCS8qIGZsZC5kIGlzcmMxKGlzcmMyKSxmZGVzdCAqLwoteyAiZmxkLmQiLAkweDI0MDAwMDAwLCAweGQ4MDAwMDA3LCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIGZsZC5kICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyMDAwMDAwMSwgMHhkYzAwMDAwNiwgIjEoMikrKyxnIiwgMCB9LAkvKiBmbGQuZCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLmQiLAkweDI0MDAwMDAxLCAweGQ4MDAwMDA2LCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogZmxkLmQgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCi17ICJmbGQucSIsCTB4MjAwMDAwMDQsIDB4ZGMwMDAwMDMsICIxKDIpLGciLCAwIH0sCS8qIGZsZC5xIGlzcmMxKGlzcmMyKSxmZGVzdCAqLwoteyAiZmxkLnEiLAkweDI0MDAwMDA0LCAweGQ4MDAwMDAzLCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIGZsZC5xICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyMDAwMDAwNSwgMHhkYzAwMDAwMiwgIjEoMikrKyxnIiwgMCB9LAkvKiBmbGQucSBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLnEiLAkweDI0MDAwMDA1LCAweGQ4MDAwMDAyLCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogZmxkLnEgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCi0KLXsgInBmbGQubCIsCTB4NjAwMDAwMDAsIDB4OWMwMDAwMDMsICIxKDIpLGciLCAwIH0sCS8qIHBmbGQubCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQubCIsCTB4NjQwMDAwMDAsIDB4OTgwMDAwMDMsICJpKDIpLGciLCBFX0FERFIgfSwJLyogcGZsZC5sICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQubCIsCTB4NjAwMDAwMDEsIDB4OWMwMDAwMDIsICIxKDIpKyssZyIsIDAgfSwJLyogcGZsZC5sIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDY0MDAwMDAxLCAweDk4MDAwMDAyLCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogcGZsZC5sICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAicGZsZC5kIiwJMHg2MDAwMDAwMCwgMHg5YzAwMDAwNywgIjEoMiksZyIsIDAgfSwJLyogcGZsZC5kIGlzcmMxKGlzcmMyKSxmZGVzdCAqLwoteyAicGZsZC5kIiwJMHg2NDAwMDAwMCwgMHg5ODAwMDAwNywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBwZmxkLmQgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLwoteyAicGZsZC5kIiwJMHg2MDAwMDAwMSwgMHg5YzAwMDAwNiwgIjEoMikrKyxnIiwgMCB9LAkvKiBwZmxkLmQgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjQwMDAwMDEsIDB4OTgwMDAwMDYsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBwZmxkLmQgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCi0KLXsgImZzdC5sIiwJMHgyODAwMDAwMiwgMHhkNDAwMDAwMSwgImcsMSgyKSIsIDAgfSwJLyogZnN0LmwgZmRlc3QsaXNyYzEoaXNyYzIpICovCi17ICJmc3QubCIsCTB4MmMwMDAwMDIsIDB4ZDAwMDAwMDEsICJnLGkoMikiLCBFX0FERFIgfSwJLyogZnN0LmwgZmRlc3QsI2NvbnN0KGlzcmMyKSAqLwoteyAiZnN0LmwiLAkweDI4MDAwMDAzLCAweGQ0MDAwMDAwLCAiZywxKDIpKysiLCAwIH0sCS8qIGZzdC5sIGZkZXN0LGlzcmMxKGlzcmMyKSsrICovCi17ICJmc3QubCIsCTB4MmMwMDAwMDMsIDB4ZDAwMDAwMDAsICJnLGkoMikrKyIsIEVfQUREUiB9LAkvKiBmc3QubCBmZGVzdCwjY29uc3QoaXNyYzIpKysgKi8KLXsgImZzdC5kIiwJMHgyODAwMDAwMCwgMHhkNDAwMDAwNywgImcsMSgyKSIsIDAgfSwJLyogZnN0LmQgZmRlc3QsaXNyYzEoaXNyYzIpICovCi17ICJmc3QuZCIsCTB4MmMwMDAwMDAsIDB4ZDAwMDAwMDcsICJnLGkoMikiLCBFX0FERFIgfSwJLyogZnN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSAqLwoteyAiZnN0LmQiLAkweDI4MDAwMDAxLCAweGQ0MDAwMDA2LCAiZywxKDIpKysiLCAwIH0sCS8qIGZzdC5kIGZkZXN0LGlzcmMxKGlzcmMyKSsrICovCi17ICJmc3QuZCIsCTB4MmMwMDAwMDEsIDB4ZDAwMDAwMDYsICJnLGkoMikrKyIsIEVfQUREUiB9LAkvKiBmc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpKysgKi8KLQoteyAicHN0LmQiLAkweDNjMDAwMDAwLCAweGMwMDAwMDA3LCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIHBzdC5kIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgInBzdC5kIiwJMHgzYzAwMDAwMSwgMHhjMDAwMDAwNiwgImcsaSgyKSsrIiwgRV9BRERSIH0sCS8qIHBzdC5kIGZkZXN0LCNjb25zdChpc3JjMikrKyAqLwotCi17ICJhZGR1IiwJMHg4MDAwMDAwMCwgMHg3YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhZGR1IGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhZGR1IiwJMHg4NDAwMDAwMCwgMHg3ODAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogYWRkdSAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgImFkZHMiLAkweDkwMDAwMDAwLCAweDZjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFkZHMgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFkZHMiLAkweDk0MDAwMDAwLCAweDY4MDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBhZGRzICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic3VidSIsCTB4ODgwMDAwMDAsIDB4NzQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc3VidSBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic3VidSIsCTB4OGMwMDAwMDAsIDB4NzAwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIHN1YnUgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJzdWJzIiwJMHg5ODAwMDAwMCwgMHg2NDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzdWJzIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzdWJzIiwJMHg5YzAwMDAwMCwgMHg2MDAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogc3VicyAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLQoteyAic2hsIiwJMHhhMDAwMDAwMCwgMHg1YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzaGwgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNobCIsCTB4YTQwMDAwMDAsIDB4NTgwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogc2hsICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic2hyIiwJMHhhODAwMDAwMCwgMHg1NDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzaHIgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNociIsCTB4YWMwMDAwMDAsIDB4NTAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogc2hyICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic2hyZCIsCTB4YjAwMDAwMDAsIDB4NGMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hyZCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic2hyYSIsCTB4YjgwMDAwMDAsIDB4NDQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hyYSBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic2hyYSIsCTB4YmMwMDAwMDAsIDB4NDAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogc2hyYSAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLQoteyAibW92IiwJMHhhMDAwMDAwMCwgMHg1YzAwZjgwMCwgIjIsZCIsIDAgfSwJLyogc2hsIHIwLGlzcmMyLGlkZXN0ICovCi17ICJtb3YiLAkweDk0MDAwMDAwLCAweDY5ZTAwMDAwLCAiaSxkIiwgRV9NT1YgfSwJLyogYWRkcyAjY29uc3QscjAsaWRlc3QgKi8KLXsgIm5vcCIsCTB4YTAwMDAwMDAsIDB4NWZmZmY4MDAsICIiLCAwIH0sCS8qIHNobCByMCxyMCxyMCAqLwoteyAiZm5vcCIsCTB4YjAwMDAwMDAsIDB4NGZmZmY4MDAsICIiLCAwIH0sCS8qIHNocmQgcjAscjAscjAgKi8KLQoteyAidHJhcCIsCTB4NDQwMDAwMDAsIDB4YjgwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogdHJhcCBpc3JjMW5pLGlzcmMyLGlkZXN0ICovCi0KLXsgImZsdXNoIiwJMHgzNDAwMDAwMCwgMHhjODFmMDAwMSwgImkoMikiLCBFX0FERFIgfSwJLyogZmx1c2ggI2NvbnN0KGlzcmMyKSAqLwoteyAiZmx1c2giLAkweDM0MDAwMDAxLCAweGM4MWYwMDAwLCAiaSgyKSsrIiwgRV9BRERSIH0sCS8qIGZsdXNoICNjb25zdChpc3JjMikrKyAqLwotCi17ICJhbmQiLAkweGMwMDAwMDAwLCAweDNjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kIiwJMHhjNDAwMDAwMCwgMHgzODAwMDAwMCwgImksMixkIiwgRV9BTkQgfSwJLyogYW5kICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAiYW5kaCIsCTB4YzgwMDAwMDAsIDB4MzQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kaCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kaCIsCTB4Y2MwMDAwMDAsIDB4MzAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogYW5kaCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgImFuZG5vdCIsCTB4ZDAwMDAwMDAsIDB4MmMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kbm90IGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3QiLAkweGQ0MDAwMDAwLCAweDI4MDAwMDAwLCAiaSwyLGQiLCBFX1UzMiB9LAkvKiBhbmRub3QgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3RoIiwJMHhkODAwMDAwMCwgMHgyNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmRub3RoIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3RoIiwJMHhkYzAwMDAwMCwgMHgyMDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBhbmRub3RoICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAib3IiLAkJMHhlMDAwMDAwMCwgMHgxYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBvciBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAib3IiLAkJMHhlNDAwMDAwMCwgMHgxODAwMDAwMCwgImksMixkIiwgRV9VMzIgfSwJLyogb3IgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJvcmgiLAkweGU4MDAwMDAwLCAweDE0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIG9yaCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAib3JoIiwJMHhlYzAwMDAwMCwgMHgxMDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBvcmggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJ4b3IiLAkweGYwMDAwMDAwLCAweDBjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHhvciBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAieG9yIiwJMHhmNDAwMDAwMCwgMHgwODAwMDAwMCwgImksMixkIiwgRV9VMzIgfSwJLyogeG9yICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAieG9yaCIsCTB4ZjgwMDAwMDAsIDB4MDQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogeG9yaCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAieG9yaCIsCTB4ZmMwMDAwMDAsIDB4MDAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogeG9yaCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLQoteyAiYnRlIiwJMHg1ODAwMDAwMCwgMHhhNDAwMDAwMCwgIjEsMixzIiwgMCB9LAkvKiBidGUgaXNyYzFzLGlzcmMyLHNicm9mZiAqLwoteyAiYnRlIiwJMHg1YzAwMDAwMCwgMHhhMDAwMDAwMCwgIjUsMixzIiwgMCB9LAkvKiBidGUgI2NvbnN0NSxpc3JjMixzYnJvZmYgKi8KLXsgImJ0bmUiLAkweDUwMDAwMDAwLCAweGFjMDAwMDAwLCAiMSwyLHMiLCAwIH0sCS8qIGJ0bmUgaXNyYzFzLGlzcmMyLHNicm9mZiAqLwoteyAiYnRuZSIsCTB4NTQwMDAwMDAsIDB4YTgwMDAwMDAsICI1LDIscyIsIDAgfSwJLyogYnRuZSAjY29uc3Q1LGlzcmMyLHNicm9mZiAqLwoteyAiYmxhIiwJMHhiNDAwMDAwMCwgMHg0ODAwMDAwMCwgIjEsMixzIiwgRV9ERUxBWSB9LAkvKiBibGEgaXNyYzFzLGlzcmMyLHNicm9mZiAqLwoteyAiYnJpIiwJMHg0MDAwMDAwMCwgMHhiYzAwMDAwMCwgIjEiLCBFX0RFTEFZIH0sCS8qIGJyaSBpc3JjMW5pICovCi0KLS8qIENvcmUgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAqLwoteyAibG9jayIsCTB4NGMwMDAwMDEsIDB4YjAwMDAwMWUsICIiLCAwIH0sCS8qIGxvY2sgc2V0IEJMIGluIGRpcmJhc2UgKi8KLXsgImNhbGxpIiwJMHg0YzAwMDAwMiwgMHhiMDAwMDAxZCwgIjEiLCBFX0RFTEFZIH0sCS8qIGNhbGxpIGlzcmMxbmkgKi8KLXsgImludG92ciIsCTB4NGMwMDAwMDQsIDB4YjAwMDAwMWIsICIiLCAwIH0sCS8qIGludG92ciB0cmFwIG9uIGludGVnZXIgb3ZlcmZsb3cgKi8KLXsgInVubG9jayIsCTB4NGMwMDAwMDcsIDB4YjAwMDAwMTgsICIiLCAwIH0sCS8qIHVubG9jayBjbGVhciBCTCBpbiBkaXJiYXNlICovCi0KLS8qIENUUkwtRm9ybWF0IEluc3RydWN0aW9ucyAqLwoteyAiYnIiLAkJMHg2ODAwMDAwMCwgMHg5NDAwMDAwMCwgImwiLCBFX0RFTEFZIH0sCS8qIGJyIGxicm9mZiAqLwoteyAiY2FsbCIsCTB4NmMwMDAwMDAsIDB4OTAwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBjYWxsIGxicm9mZiAqLwoteyAiYmMiLAkJMHg3MDAwMDAwMCwgMHg4YzAwMDAwMCwgImwiLCAwIH0sCS8qIGJjIGxicm9mZiAqLwoteyAiYmMudCIsCTB4NzQwMDAwMDAsIDB4ODgwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBiYy50IGxicm9mZiAqLwoteyAiYm5jIiwJMHg3ODAwMDAwMCwgMHg4NDAwMDAwMCwgImwiLCAwIH0sCS8qIGJuYyBsYnJvZmYgKi8KLXsgImJuYy50IiwJMHg3YzAwMDAwMCwgMHg4MDAwMDAwMCwgImwiLCBFX0RFTEFZIH0sCS8qIGJuYy50IGxicm9mZiAqLwotCi0vKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZhbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJyMnAxLnNzIiwJMHg0ODAwMDQwMCwgMHhiNDAwMDNmZiwgImUsZixnIiwgMCB9LAoteyAicjJwMS5zZCIsCTB4NDgwMDA0ODAsIDB4YjQwMDAzN2YsICJlLGYsZyIsIDAgfSwKLXsgInIycDEuZGQiLAkweDQ4MDAwNTgwLCAweGI0MDAwMjdmLCAiZSxmLGciLCAwIH0sCi17ICJyMnB0LnNzIiwJMHg0ODAwMDQwMSwgMHhiNDAwMDNmZSwgImUsZixnIiwgMCB9LAoteyAicjJwdC5zZCIsCTB4NDgwMDA0ODEsIDB4YjQwMDAzN2UsICJlLGYsZyIsIDAgfSwKLXsgInIycHQuZGQiLAkweDQ4MDAwNTgxLCAweGI0MDAwMjdlLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwMS5zcyIsCTB4NDgwMDA0MDIsIDB4YjQwMDAzZmQsICJlLGYsZyIsIDAgfSwKLXsgInIyYXAxLnNkIiwJMHg0ODAwMDQ4MiwgMHhiNDAwMDM3ZCwgImUsZixnIiwgMCB9LAoteyAicjJhcDEuZGQiLAkweDQ4MDAwNTgyLCAweGI0MDAwMjdkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwdC5zcyIsCTB4NDgwMDA0MDMsIDB4YjQwMDAzZmMsICJlLGYsZyIsIDAgfSwKLXsgInIyYXB0LnNkIiwJMHg0ODAwMDQ4MywgMHhiNDAwMDM3YywgImUsZixnIiwgMCB9LAoteyAicjJhcHQuZGQiLAkweDQ4MDAwNTgzLCAweGI0MDAwMjdjLCAiZSxmLGciLCAwIH0sCi17ICJpMnAxLnNzIiwJMHg0ODAwMDQwNCwgMHhiNDAwMDNmYiwgImUsZixnIiwgMCB9LAoteyAiaTJwMS5zZCIsCTB4NDgwMDA0ODQsIDB4YjQwMDAzN2IsICJlLGYsZyIsIDAgfSwKLXsgImkycDEuZGQiLAkweDQ4MDAwNTg0LCAweGI0MDAwMjdiLCAiZSxmLGciLCAwIH0sCi17ICJpMnB0LnNzIiwJMHg0ODAwMDQwNSwgMHhiNDAwMDNmYSwgImUsZixnIiwgMCB9LAoteyAiaTJwdC5zZCIsCTB4NDgwMDA0ODUsIDB4YjQwMDAzN2EsICJlLGYsZyIsIDAgfSwKLXsgImkycHQuZGQiLAkweDQ4MDAwNTg1LCAweGI0MDAwMjdhLCAiZSxmLGciLCAwIH0sCi17ICJpMmFwMS5zcyIsCTB4NDgwMDA0MDYsIDB4YjQwMDAzZjksICJlLGYsZyIsIDAgfSwKLXsgImkyYXAxLnNkIiwJMHg0ODAwMDQ4NiwgMHhiNDAwMDM3OSwgImUsZixnIiwgMCB9LAoteyAiaTJhcDEuZGQiLAkweDQ4MDAwNTg2LCAweGI0MDAwMjc5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwdC5zcyIsCTB4NDgwMDA0MDcsIDB4YjQwMDAzZjgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXB0LnNkIiwJMHg0ODAwMDQ4NywgMHhiNDAwMDM3OCwgImUsZixnIiwgMCB9LAoteyAiaTJhcHQuZGQiLAkweDQ4MDAwNTg3LCAweGI0MDAwMjc4LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxcDIuc3MiLAkweDQ4MDAwNDA4LCAweGI0MDAwM2Y3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxcDIuc2QiLAkweDQ4MDAwNDg4LCAweGI0MDAwMzc3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxcDIuZGQiLAkweDQ4MDAwNTg4LCAweGI0MDAwMjc3LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhcG0uc3MiLAkweDQ4MDAwNDA5LCAweGI0MDAwM2Y2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhcG0uc2QiLAkweDQ4MDAwNDg5LCAweGI0MDAwMzc2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhcG0uZGQiLAkweDQ4MDAwNTg5LCAweGI0MDAwMjc2LCAiZSxmLGciLCAwIH0sCi17ICJyYTFwMi5zcyIsCTB4NDgwMDA0MGEsIDB4YjQwMDAzZjUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXAyLnNkIiwJMHg0ODAwMDQ4YSwgMHhiNDAwMDM3NSwgImUsZixnIiwgMCB9LAoteyAicmExcDIuZGQiLAkweDQ4MDAwNThhLCAweGI0MDAwMjc1LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHBhLnNzIiwJMHg0ODAwMDQwYiwgMHhiNDAwMDNmNCwgImUsZixnIiwgMCB9LAoteyAibTEydHRwYS5zZCIsCTB4NDgwMDA0OGIsIDB4YjQwMDAzNzQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0cGEuZGQiLAkweDQ4MDAwNThiLCAweGI0MDAwMjc0LCAiZSxmLGciLCAwIH0sCi17ICJpYXQxcDIuc3MiLAkweDQ4MDAwNDBjLCAweGI0MDAwM2YzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxcDIuc2QiLAkweDQ4MDAwNDhjLCAweGI0MDAwMzczLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxcDIuZGQiLAkweDQ4MDAwNThjLCAweGI0MDAwMjczLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cG0uc3MiLAkweDQ4MDAwNDBkLCAweGI0MDAwM2YyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cG0uc2QiLAkweDQ4MDAwNDhkLCAweGI0MDAwMzcyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cG0uZGQiLAkweDQ4MDAwNThkLCAweGI0MDAwMjcyLCAiZSxmLGciLCAwIH0sCi17ICJpYTFwMi5zcyIsCTB4NDgwMDA0MGUsIDB4YjQwMDAzZjEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXAyLnNkIiwJMHg0ODAwMDQ4ZSwgMHhiNDAwMDM3MSwgImUsZixnIiwgMCB9LAoteyAiaWExcDIuZGQiLAkweDQ4MDAwNThlLCAweGI0MDAwMjcxLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cGEuc3MiLAkweDQ4MDAwNDBmLCAweGI0MDAwM2YwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cGEuc2QiLAkweDQ4MDAwNDhmLCAweGI0MDAwMzcwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cGEuZGQiLAkweDQ4MDAwNThmLCAweGI0MDAwMjcwLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZnNtLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInIyczEuc3MiLAkweDQ4MDAwNDEwLCAweGI0MDAwM2VmLCAiZSxmLGciLCAwIH0sCi17ICJyMnMxLnNkIiwJMHg0ODAwMDQ5MCwgMHhiNDAwMDM2ZiwgImUsZixnIiwgMCB9LAoteyAicjJzMS5kZCIsCTB4NDgwMDA1OTAsIDB4YjQwMDAyNmYsICJlLGYsZyIsIDAgfSwKLXsgInIyc3Quc3MiLAkweDQ4MDAwNDExLCAweGI0MDAwM2VlLCAiZSxmLGciLCAwIH0sCi17ICJyMnN0LnNkIiwJMHg0ODAwMDQ5MSwgMHhiNDAwMDM2ZSwgImUsZixnIiwgMCB9LAoteyAicjJzdC5kZCIsCTB4NDgwMDA1OTEsIDB4YjQwMDAyNmUsICJlLGYsZyIsIDAgfSwKLXsgInIyYXMxLnNzIiwJMHg0ODAwMDQxMiwgMHhiNDAwMDNlZCwgImUsZixnIiwgMCB9LAoteyAicjJhczEuc2QiLAkweDQ4MDAwNDkyLCAweGI0MDAwMzZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzMS5kZCIsCTB4NDgwMDA1OTIsIDB4YjQwMDAyNmQsICJlLGYsZyIsIDAgfSwKLXsgInIyYXN0LnNzIiwJMHg0ODAwMDQxMywgMHhiNDAwMDNlYywgImUsZixnIiwgMCB9LAoteyAicjJhc3Quc2QiLAkweDQ4MDAwNDkzLCAweGI0MDAwMzZjLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzdC5kZCIsCTB4NDgwMDA1OTMsIDB4YjQwMDAyNmMsICJlLGYsZyIsIDAgfSwKLXsgImkyczEuc3MiLAkweDQ4MDAwNDE0LCAweGI0MDAwM2ViLCAiZSxmLGciLCAwIH0sCi17ICJpMnMxLnNkIiwJMHg0ODAwMDQ5NCwgMHhiNDAwMDM2YiwgImUsZixnIiwgMCB9LAoteyAiaTJzMS5kZCIsCTB4NDgwMDA1OTQsIDB4YjQwMDAyNmIsICJlLGYsZyIsIDAgfSwKLXsgImkyc3Quc3MiLAkweDQ4MDAwNDE1LCAweGI0MDAwM2VhLCAiZSxmLGciLCAwIH0sCi17ICJpMnN0LnNkIiwJMHg0ODAwMDQ5NSwgMHhiNDAwMDM2YSwgImUsZixnIiwgMCB9LAoteyAiaTJzdC5kZCIsCTB4NDgwMDA1OTUsIDB4YjQwMDAyNmEsICJlLGYsZyIsIDAgfSwKLXsgImkyYXMxLnNzIiwJMHg0ODAwMDQxNiwgMHhiNDAwMDNlOSwgImUsZixnIiwgMCB9LAoteyAiaTJhczEuc2QiLAkweDQ4MDAwNDk2LCAweGI0MDAwMzY5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzMS5kZCIsCTB4NDgwMDA1OTYsIDB4YjQwMDAyNjksICJlLGYsZyIsIDAgfSwKLXsgImkyYXN0LnNzIiwJMHg0ODAwMDQxNywgMHhiNDAwMDNlOCwgImUsZixnIiwgMCB9LAoteyAiaTJhc3Quc2QiLAkweDQ4MDAwNDk3LCAweGI0MDAwMzY4LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzdC5kZCIsCTB4NDgwMDA1OTcsIDB4YjQwMDAyNjgsICJlLGYsZyIsIDAgfSwKLXsgInJhdDFzMi5zcyIsCTB4NDgwMDA0MTgsIDB4YjQwMDAzZTcsICJlLGYsZyIsIDAgfSwKLXsgInJhdDFzMi5zZCIsCTB4NDgwMDA0OTgsIDB4YjQwMDAzNjcsICJlLGYsZyIsIDAgfSwKLXsgInJhdDFzMi5kZCIsCTB4NDgwMDA1OTgsIDB4YjQwMDAyNjcsICJlLGYsZyIsIDAgfSwKLXsgIm0xMmFzbS5zcyIsCTB4NDgwMDA0MTksIDB4YjQwMDAzZTYsICJlLGYsZyIsIDAgfSwKLXsgIm0xMmFzbS5zZCIsCTB4NDgwMDA0OTksIDB4YjQwMDAzNjYsICJlLGYsZyIsIDAgfSwKLXsgIm0xMmFzbS5kZCIsCTB4NDgwMDA1OTksIDB4YjQwMDAyNjYsICJlLGYsZyIsIDAgfSwKLXsgInJhMXMyLnNzIiwJMHg0ODAwMDQxYSwgMHhiNDAwMDNlNSwgImUsZixnIiwgMCB9LAoteyAicmExczIuc2QiLAkweDQ4MDAwNDlhLCAweGI0MDAwMzY1LCAiZSxmLGciLCAwIH0sCi17ICJyYTFzMi5kZCIsCTB4NDgwMDA1OWEsIDB4YjQwMDAyNjUsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0c2Euc3MiLAkweDQ4MDAwNDFiLCAweGI0MDAwM2U0LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHNhLnNkIiwJMHg0ODAwMDQ5YiwgMHhiNDAwMDM2NCwgImUsZixnIiwgMCB9LAoteyAibTEydHRzYS5kZCIsCTB4NDgwMDA1OWIsIDB4YjQwMDAyNjQsICJlLGYsZyIsIDAgfSwKLXsgImlhdDFzMi5zcyIsCTB4NDgwMDA0MWMsIDB4YjQwMDAzZTMsICJlLGYsZyIsIDAgfSwKLXsgImlhdDFzMi5zZCIsCTB4NDgwMDA0OWMsIDB4YjQwMDAzNjMsICJlLGYsZyIsIDAgfSwKLXsgImlhdDFzMi5kZCIsCTB4NDgwMDA1OWMsIDB4YjQwMDAyNjMsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzbS5zcyIsCTB4NDgwMDA0MWQsIDB4YjQwMDAzZTIsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzbS5zZCIsCTB4NDgwMDA0OWQsIDB4YjQwMDAzNjIsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzbS5kZCIsCTB4NDgwMDA1OWQsIDB4YjQwMDAyNjIsICJlLGYsZyIsIDAgfSwKLXsgImlhMXMyLnNzIiwJMHg0ODAwMDQxZSwgMHhiNDAwMDNlMSwgImUsZixnIiwgMCB9LAoteyAiaWExczIuc2QiLAkweDQ4MDAwNDllLCAweGI0MDAwMzYxLCAiZSxmLGciLCAwIH0sCi17ICJpYTFzMi5kZCIsCTB4NDgwMDA1OWUsIDB4YjQwMDAyNjEsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzYS5zcyIsCTB4NDgwMDA0MWYsIDB4YjQwMDAzZTAsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzYS5zZCIsCTB4NDgwMDA0OWYsIDB4YjQwMDAzNjAsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzYS5kZCIsCTB4NDgwMDA1OWYsIDB4YjQwMDAyNjAsICJlLGYsZyIsIDAgfSwKLQotLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmbWFtLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgIm1yMnAxLnNzIiwJMHg0ODAwMDAwMCwgMHhiNDAwMDdmZiwgImUsZixnIiwgMCB9LAoteyAibXIycDEuc2QiLAkweDQ4MDAwMDgwLCAweGI0MDAwNzdmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwMS5kZCIsCTB4NDgwMDAxODAsIDB4YjQwMDA2N2YsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnB0LnNzIiwJMHg0ODAwMDAwMSwgMHhiNDAwMDdmZSwgImUsZixnIiwgMCB9LAoteyAibXIycHQuc2QiLAkweDQ4MDAwMDgxLCAweGI0MDAwNzdlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwdC5kZCIsCTB4NDgwMDAxODEsIDB4YjQwMDA2N2UsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wMS5zcyIsCTB4NDgwMDAwMDIsIDB4YjQwMDA3ZmQsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wMS5zZCIsCTB4NDgwMDAwODIsIDB4YjQwMDA3N2QsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wMS5kZCIsCTB4NDgwMDAxODIsIDB4YjQwMDA2N2QsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wdC5zcyIsCTB4NDgwMDAwMDMsIDB4YjQwMDA3ZmMsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wdC5zZCIsCTB4NDgwMDAwODMsIDB4YjQwMDA3N2MsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wdC5kZCIsCTB4NDgwMDAxODMsIDB4YjQwMDA2N2MsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnAxLnNzIiwJMHg0ODAwMDAwNCwgMHhiNDAwMDdmYiwgImUsZixnIiwgMCB9LAoteyAibWkycDEuc2QiLAkweDQ4MDAwMDg0LCAweGI0MDAwNzdiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwMS5kZCIsCTB4NDgwMDAxODQsIDB4YjQwMDA2N2IsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnB0LnNzIiwJMHg0ODAwMDAwNSwgMHhiNDAwMDdmYSwgImUsZixnIiwgMCB9LAoteyAibWkycHQuc2QiLAkweDQ4MDAwMDg1LCAweGI0MDAwNzdhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwdC5kZCIsCTB4NDgwMDAxODUsIDB4YjQwMDA2N2EsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wMS5zcyIsCTB4NDgwMDAwMDYsIDB4YjQwMDA3ZjksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wMS5zZCIsCTB4NDgwMDAwODYsIDB4YjQwMDA3NzksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wMS5kZCIsCTB4NDgwMDAxODYsIDB4YjQwMDA2NzksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wdC5zcyIsCTB4NDgwMDAwMDcsIDB4YjQwMDA3ZjgsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wdC5zZCIsCTB4NDgwMDAwODcsIDB4YjQwMDA3NzgsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wdC5kZCIsCTB4NDgwMDAxODcsIDB4YjQwMDA2NzgsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxcDIuc3MiLAkweDQ4MDAwMDA4LCAweGI0MDAwN2Y3LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXAyLnNkIiwJMHg0ODAwMDA4OCwgMHhiNDAwMDc3NywgImUsZixnIiwgMCB9LAoteyAibXJtdDFwMi5kZCIsCTB4NDgwMDAxODgsIDB4YjQwMDA2NzcsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtcG0uc3MiLAkweDQ4MDAwMDA5LCAweGI0MDAwN2Y2LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXBtLnNkIiwJMHg0ODAwMDA4OSwgMHhiNDAwMDc3NiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1wbS5kZCIsCTB4NDgwMDAxODksIDB4YjQwMDA2NzYsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFwMi5zcyIsCTB4NDgwMDAwMGEsIDB4YjQwMDA3ZjUsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFwMi5zZCIsCTB4NDgwMDAwOGEsIDB4YjQwMDA3NzUsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFwMi5kZCIsCTB4NDgwMDAxOGEsIDB4YjQwMDA2NzUsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHBtLnNzIiwweDQ4MDAwMDBiLCAweGI0MDAwN2Y0LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRwbS5zZCIsMHg0ODAwMDA4YiwgMHhiNDAwMDc3NCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0cG0uZGQiLDB4NDgwMDAxOGIsIDB4YjQwMDA2NzQsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxcDIuc3MiLAkweDQ4MDAwMDBjLCAweGI0MDAwN2YzLCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXAyLnNkIiwJMHg0ODAwMDA4YywgMHhiNDAwMDc3MywgImUsZixnIiwgMCB9LAoteyAibWltdDFwMi5kZCIsCTB4NDgwMDAxOGMsIDB4YjQwMDA2NzMsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0cG0uc3MiLAkweDQ4MDAwMDBkLCAweGI0MDAwN2YyLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHBtLnNkIiwJMHg0ODAwMDA4ZCwgMHhiNDAwMDc3MiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRwbS5kZCIsCTB4NDgwMDAxOGQsIDB4YjQwMDA2NzIsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFwMi5zcyIsCTB4NDgwMDAwMGUsIDB4YjQwMDA3ZjEsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFwMi5zZCIsCTB4NDgwMDAwOGUsIDB4YjQwMDA3NzEsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFwMi5kZCIsCTB4NDgwMDAxOGUsIDB4YjQwMDA2NzEsICJlLGYsZyIsIDAgfSwKLQotLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmbXNtLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgIm1yMnMxLnNzIiwJMHg0ODAwMDAxMCwgMHhiNDAwMDdlZiwgImUsZixnIiwgMCB9LAoteyAibXIyczEuc2QiLAkweDQ4MDAwMDkwLCAweGI0MDAwNzZmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzMS5kZCIsCTB4NDgwMDAxOTAsIDB4YjQwMDA2NmYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnN0LnNzIiwJMHg0ODAwMDAxMSwgMHhiNDAwMDdlZSwgImUsZixnIiwgMCB9LAoteyAibXIyc3Quc2QiLAkweDQ4MDAwMDkxLCAweGI0MDAwNzZlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzdC5kZCIsCTB4NDgwMDAxOTEsIDB4YjQwMDA2NmUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zMS5zcyIsCTB4NDgwMDAwMTIsIDB4YjQwMDA3ZWQsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zMS5zZCIsCTB4NDgwMDAwOTIsIDB4YjQwMDA3NmQsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zMS5kZCIsCTB4NDgwMDAxOTIsIDB4YjQwMDA2NmQsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zdC5zcyIsCTB4NDgwMDAwMTMsIDB4YjQwMDA3ZWMsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zdC5zZCIsCTB4NDgwMDAwOTMsIDB4YjQwMDA3NmMsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zdC5kZCIsCTB4NDgwMDAxOTMsIDB4YjQwMDA2NmMsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnMxLnNzIiwJMHg0ODAwMDAxNCwgMHhiNDAwMDdlYiwgImUsZixnIiwgMCB9LAoteyAibWkyczEuc2QiLAkweDQ4MDAwMDk0LCAweGI0MDAwNzZiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzMS5kZCIsCTB4NDgwMDAxOTQsIDB4YjQwMDA2NmIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnN0LnNzIiwJMHg0ODAwMDAxNSwgMHhiNDAwMDdlYSwgImUsZixnIiwgMCB9LAoteyAibWkyc3Quc2QiLAkweDQ4MDAwMDk1LCAweGI0MDAwNzZhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzdC5kZCIsCTB4NDgwMDAxOTUsIDB4YjQwMDA2NmEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zMS5zcyIsCTB4NDgwMDAwMTYsIDB4YjQwMDA3ZTksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zMS5zZCIsCTB4NDgwMDAwOTYsIDB4YjQwMDA3NjksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zMS5kZCIsCTB4NDgwMDAxOTYsIDB4YjQwMDA2NjksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zdC5zcyIsCTB4NDgwMDAwMTcsIDB4YjQwMDA3ZTgsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zdC5zZCIsCTB4NDgwMDAwOTcsIDB4YjQwMDA3NjgsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zdC5kZCIsCTB4NDgwMDAxOTcsIDB4YjQwMDA2NjgsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxczIuc3MiLAkweDQ4MDAwMDE4LCAweGI0MDAwN2U3LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXMyLnNkIiwJMHg0ODAwMDA5OCwgMHhiNDAwMDc2NywgImUsZixnIiwgMCB9LAoteyAibXJtdDFzMi5kZCIsCTB4NDgwMDAxOTgsIDB4YjQwMDA2NjcsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtc20uc3MiLAkweDQ4MDAwMDE5LCAweGI0MDAwN2U2LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXNtLnNkIiwJMHg0ODAwMDA5OSwgMHhiNDAwMDc2NiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1zbS5kZCIsCTB4NDgwMDAxOTksIDB4YjQwMDA2NjYsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFzMi5zcyIsCTB4NDgwMDAwMWEsIDB4YjQwMDA3ZTUsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFzMi5zZCIsCTB4NDgwMDAwOWEsIDB4YjQwMDA3NjUsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFzMi5kZCIsCTB4NDgwMDAxOWEsIDB4YjQwMDA2NjUsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHNtLnNzIiwweDQ4MDAwMDFiLCAweGI0MDAwN2U0LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRzbS5zZCIsMHg0ODAwMDA5YiwgMHhiNDAwMDc2NCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0c20uZGQiLDB4NDgwMDAxOWIsIDB4YjQwMDA2NjQsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxczIuc3MiLAkweDQ4MDAwMDFjLCAweGI0MDAwN2UzLCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXMyLnNkIiwJMHg0ODAwMDA5YywgMHhiNDAwMDc2MywgImUsZixnIiwgMCB9LAoteyAibWltdDFzMi5kZCIsCTB4NDgwMDAxOWMsIDB4YjQwMDA2NjMsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0c20uc3MiLAkweDQ4MDAwMDFkLCAweGI0MDAwN2UyLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHNtLnNkIiwJMHg0ODAwMDA5ZCwgMHhiNDAwMDc2MiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRzbS5kZCIsCTB4NDgwMDAxOWQsIDB4YjQwMDA2NjIsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFzMi5zcyIsCTB4NDgwMDAwMWUsIDB4YjQwMDA3ZTEsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFzMi5zZCIsCTB4NDgwMDAwOWUsIDB4YjQwMDA3NjEsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFzMi5kZCIsCTB4NDgwMDAxOWUsIDB4YjQwMDA2NjEsICJlLGYsZyIsIDAgfSwKLQotCi17ICJmbXVsLnNzIiwJMHg0ODAwMDAyMCwgMHhiNDAwMDdkZiwgImUsZixnIiwgMCB9LAkvKiBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZtdWwuc2QiLAkweDQ4MDAwMGEwLCAweGI0MDAwNzVmLCAiZSxmLGciLCAwIH0sCS8qIGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZm11bC5kZCIsCTB4NDgwMDAxYTAsIDB4YjQwMDA2NWYsICJlLGYsZyIsIDAgfSwJLyogZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZm11bC5zcyIsCTB4NDgwMDA0MjAsIDB4YjQwMDAzZGYsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwuc2QiLAkweDQ4MDAwNGEwLCAweGI0MDAwMzVmLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbXVsLmRkIiwJMHg0ODAwMDVhMCwgMHhiNDAwMDI1ZiwgImUsZixnIiwgMCB9LAkvKiBwZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZm11bDMuZGQiLAkweDQ4MDAwNWE0LCAweGI0MDAwMjViLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsMy5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmbWxvdy5kZCIsCTB4NDgwMDAxYTEsIDB4YjQwMDA2NWUsICJlLGYsZyIsIDAgfSwJLyogZm1sb3cuZGQgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZyY3Auc3MiLAkweDQ4MDAwMDIyLCAweGI0MDAwN2RkLCAiZixnIiwgMCB9LAkvKiBmcmNwLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyY3Auc2QiLAkweDQ4MDAwMGEyLCAweGI0MDAwNzVkLCAiZixnIiwgMCB9LAkvKiBmcmNwLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyY3AuZGQiLAkweDQ4MDAwMWEyLCAweGI0MDAwNjVkLCAiZixnIiwgMCB9LAkvKiBmcmNwLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyc3FyLnNzIiwJMHg0ODAwMDAyMywgMHhiNDAwMDdkYywgImYsZyIsIDAgfSwJLyogZnJzcXIucCBmc3JjMixmZGVzdCAqLwoteyAiZnJzcXIuc2QiLAkweDQ4MDAwMGEzLCAweGI0MDAwNzVjLCAiZixnIiwgMCB9LAkvKiBmcnNxci5wIGZzcmMyLGZkZXN0ICovCi17ICJmcnNxci5kZCIsCTB4NDgwMDAxYTMsIDB4YjQwMDA2NWMsICJmLGciLCAwIH0sCS8qIGZyc3FyLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZhZGQuc3MiLAkweDQ4MDAwMDMwLCAweGI0MDAwN2NmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZC5zZCIsCTB4NDgwMDAwYjAsIDB4YjQwMDA3NGYsICJlLGYsZyIsIDAgfSwJLyogZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmYWRkLmRkIiwJMHg0ODAwMDFiMCwgMHhiNDAwMDY0ZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmYWRkLnNzIiwJMHg0ODAwMDQzMCwgMHhiNDAwMDNjZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZC5zZCIsCTB4NDgwMDA0YjAsIDB4YjQwMDAzNGYsICJlLGYsZyIsIDAgfSwJLyogcGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGQuZGQiLAkweDQ4MDAwNWIwLCAweGI0MDAwMjRmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZzdWIuc3MiLAkweDQ4MDAwMDMxLCAweGI0MDAwN2NlLCAiZSxmLGciLCAwIH0sCS8qIGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnN1Yi5zZCIsCTB4NDgwMDAwYjEsIDB4YjQwMDA3NGUsICJlLGYsZyIsIDAgfSwJLyogZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmc3ViLmRkIiwJMHg0ODAwMDFiMSwgMHhiNDAwMDY0ZSwgImUsZixnIiwgMCB9LAkvKiBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmc3ViLnNzIiwJMHg0ODAwMDQzMSwgMHhiNDAwMDNjZSwgImUsZixnIiwgMCB9LAkvKiBwZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnN1Yi5zZCIsCTB4NDgwMDA0YjEsIDB4YjQwMDAzNGUsICJlLGYsZyIsIDAgfSwJLyogcGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZzdWIuZGQiLAkweDQ4MDAwNWIxLCAweGI0MDAwMjRlLCAiZSxmLGciLCAwIH0sCS8qIHBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZpeC5zcyIsCTB4NDgwMDAwMzIsIDB4YjQwMDA3Y2QsICJlLGciLCAwIH0sCS8qIGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJmaXguc2QiLAkweDQ4MDAwMGIyLCAweGI0MDAwNzRkLCAiZSxnIiwgMCB9LAkvKiBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAiZml4LmRkIiwJMHg0ODAwMDFiMiwgMHhiNDAwMDY0ZCwgImUsZyIsIDAgfSwJLyogZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmaXguc3MiLAkweDQ4MDAwNDMyLCAweGI0MDAwM2NkLCAiZSxnIiwgMCB9LAkvKiBwZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmaXguc2QiLAkweDQ4MDAwNGIyLCAweGI0MDAwMzRkLCAiZSxnIiwgMCB9LAkvKiBwZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmaXguZGQiLAkweDQ4MDAwNWIyLCAweGI0MDAwMjRkLCAiZSxnIiwgMCB9LAkvKiBwZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZhbW92LnNzIiwJMHg0ODAwMDAzMywgMHhiNDAwMDdjYywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAiZmFtb3YuZHMiLAkweDQ4MDAwMTMzLCAweGI0MDAwNmNjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5zZCIsCTB4NDgwMDAwYjMsIDB4YjQwMDA3NGMsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZhbW92LmRkIiwJMHg0ODAwMDFiMywgMHhiNDAwMDY0YywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAicGZhbW92LnNzIiwJMHg0ODAwMDQzMywgMHhiNDAwMDNjYywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5kcyIsCTB4NDgwMDA1MzMsIDB4YjQwMDAyY2MsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJwZmFtb3Yuc2QiLAkweDQ4MDAwNGIzLCAweGI0MDAwMzRjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAicGZhbW92LmRkIiwJMHg0ODAwMDViMywgMHhiNDAwMDI0YywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLS8qIHBmZ3QgaGFzIFIgYml0IGNsZWFyZWQ7IHBmbGUgaGFzIFIgYml0IHNldCAqLwoteyAicGZndC5zcyIsCTB4NDgwMDA0MzQsIDB4YjQwMDAzY2IsICJlLGYsZyIsIDAgfSwJLyogcGZndC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmd0LnNkIiwJMHg0ODAwMDQzNCwgMHhiNDAwMDNjYiwgImUsZixnIiwgMCB9LAkvKiBwZmd0LnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmZ3QuZGQiLAkweDQ4MDAwNTM0LCAweGI0MDAwMmNiLCAiZSxmLGciLCAwIH0sCS8qIHBmZ3QucCBmc3JjMSxmc3JjMixmZGVzdCAqLwotLyogcGZndCBoYXMgUiBiaXQgY2xlYXJlZDsgcGZsZSBoYXMgUiBiaXQgc2V0ICovCi17ICJwZmxlLnNzIiwJMHg0ODAwMDRiNCwgMHhiNDAwMDM0YiwgImUsZixnIiwgMCB9LAkvKiBwZmxlLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbGUuc2QiLAkweDQ4MDAwNGI0LCAweGI0MDAwMzRiLCAiZSxmLGciLCAwIH0sCS8qIHBmbGUucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZsZS5kZCIsCTB4NDgwMDA1YjQsIDB4YjQwMDAyNGIsICJlLGYsZyIsIDAgfSwJLyogcGZsZS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmdHJ1bmMuc3MiLAkweDQ4MDAwMDNhLCAweGI0MDAwN2M1LCAiZSxnIiwgMCB9LAkvKiBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAiZnRydW5jLnNkIiwJMHg0ODAwMDBiYSwgMHhiNDAwMDc0NSwgImUsZyIsIDAgfSwJLyogZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgImZ0cnVuYy5kZCIsCTB4NDgwMDAxYmEsIDB4YjQwMDA2NDUsICJlLGciLCAwIH0sCS8qIGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJwZnRydW5jLnNzIiwJMHg0ODAwMDQzYSwgMHhiNDAwMDNjNSwgImUsZyIsIDAgfSwJLyogcGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJwZnRydW5jLnNkIiwJMHg0ODAwMDRiYSwgMHhiNDAwMDM0NSwgImUsZyIsIDAgfSwJLyogcGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJwZnRydW5jLmRkIiwJMHg0ODAwMDViYSwgMHhiNDAwMDI0NSwgImUsZyIsIDAgfSwJLyogcGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJmeGZyIiwJMHg0ODAwMDA0MCwgMHhiNDAwMDdiZiwgImUsZCIsIDAgfSwJLyogZnhmciBmc3JjMSxpZGVzdCAqLwoteyAiZmlhZGQuc3MiLAkweDQ4MDAwMDQ5LCAweGI0MDAwN2I2LCAiZSxmLGciLCAwIH0sCS8qIGZpYWRkLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZpYWRkLmRkIiwJMHg0ODAwMDFjOSwgMHhiNDAwMDYzNiwgImUsZixnIiwgMCB9LAkvKiBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlhZGQuc3MiLAkweDQ4MDAwNDQ5LCAweGI0MDAwM2I2LCAiZSxmLGciLCAwIH0sCS8qIHBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlhZGQuZGQiLAkweDQ4MDAwNWM5LCAweGI0MDAwMjM2LCAiZSxmLGciLCAwIH0sCS8qIHBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaXN1Yi5zcyIsCTB4NDgwMDAwNGQsIDB4YjQwMDA3YjIsICJlLGYsZyIsIDAgfSwJLyogZmlzdWIudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmlzdWIuZGQiLAkweDQ4MDAwMWNkLCAweGI0MDAwNjMyLCAiZSxmLGciLCAwIH0sCS8qIGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmaXN1Yi5zcyIsCTB4NDgwMDA0NGQsIDB4YjQwMDAzYjIsICJlLGYsZyIsIDAgfSwJLyogcGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmaXN1Yi5kZCIsCTB4NDgwMDA1Y2QsIDB4YjQwMDAyMzIsICJlLGYsZyIsIDAgfSwJLyogcGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZ6Y2hrbCIsCTB4NDgwMDAwNTcsIDB4YjQwMDA3YTgsICJlLGYsZyIsIDAgfSwJLyogZnpjaGtsIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnpjaGtsIiwJMHg0ODAwMDQ1NywgMHhiNDAwMDNhOCwgImUsZixnIiwgMCB9LAkvKiBwZnpjaGtsIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmemNoa3MiLAkweDQ4MDAwMDVmLCAweGI0MDAwN2EwLCAiZSxmLGciLCAwIH0sCS8qIGZ6Y2hrcyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZ6Y2hrcyIsCTB4NDgwMDA0NWYsIDB4YjQwMDAzYTAsICJlLGYsZyIsIDAgfSwJLyogcGZ6Y2hrcyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZHAiLAkweDQ4MDAwMDUwLCAweGI0MDAwN2FmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGRwIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZHAiLAkweDQ4MDAwNDUwLCAweGI0MDAwM2FmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkcCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZHoiLAkweDQ4MDAwMDUxLCAweGI0MDAwN2FlLCAiZSxmLGciLCAwIH0sCS8qIGZhZGR6IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZHoiLAkweDQ4MDAwNDUxLCAweGI0MDAwM2FlLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkeiBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZm9ybSIsCTB4NDgwMDAwNWEsIDB4YjQwMDA3YTUsICJlLGciLCAwIH0sCS8qIGZvcm0gZnNyYzEsZmRlc3QgKi8KLXsgInBmb3JtIiwJMHg0ODAwMDQ1YSwgMHhiNDAwMDNhNSwgImUsZyIsIDAgfSwJLyogcGZvcm0gZnNyYzEsZmRlc3QgKi8KLQotLyogRmxvYXRpbmcgcG9pbnQgcHNldWRvLWluc3RydWN0aW9ucyAqLwoteyAiZm1vdi5zcyIsCTB4NDgwMDAwNDksIDB4YjdlMDA3YjYsICJlLGciLCAwIH0sCS8qIGZpYWRkLnNzIGZzcmMxLGYwLGZkZXN0ICovCi17ICJmbW92LmRkIiwJMHg0ODAwMDFjOSwgMHhiN2UwMDYzNiwgImUsZyIsIDAgfSwJLyogZmlhZGQuZGQgZnNyYzEsZjAsZmRlc3QgKi8KLXsgImZtb3Yuc2QiLAkweDQ4MDAwMGIwLCAweGI3ZTAwNzRmLCAiZSxnIiwgMCB9LAkvKiBmYWRkLnNkIGZzcmMxLGYwLGZkZXN0ICovCi17ICJmbW92LmRzIiwJMHg0ODAwMDEzMCwgMHhiN2UwMDZjZiwgImUsZyIsIDAgfSwJLyogZmFkZC5kcyBmc3JjMSxmMCxmZGVzdCAqLwoteyAicGZtb3YuZHMiLAkweDQ4MDAwNTMwLCAweGI3MzAwMmNmLCAiZSxnIiwgMCB9LAkvKiBwZmFkZC5kcyBmc3JjMSxmMCxmZGVzdCAqLwoteyAicGZtb3YuZGQiLAkweDQ4MDAwNWM5LCAweGI3ZTAwMjM2LCAiZSxnIiwgMCB9LAkvKiBwZmlhZGQuZGQgZnNyYzEsZjAsZmRlc3QgKi8KLQotCi19OwotCi0jZGVmaW5lIE5VTU9QQ09ERVMgKChzaXplb2YgaTg2MF9vcGNvZGVzKS8oc2l6ZW9mIGk4NjBfb3Bjb2Rlc1swXSkpCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaTk2MC5oIGIvaW5jbHVkZS9vcGNvZGUvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJmYzMzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKiBCYXNpYyA4MDk2MCBpbnN0cnVjdGlvbiBmb3JtYXRzLgotICoKLSAqIFRoZSAnQ09KJyBpbnN0cnVjdGlvbnMgYXJlIGFjdHVhbGx5IENPQlIgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlICdiJyBpbgotICogdGhlIG1uZW1vbmljIHJlcGxhY2VkIGJ5IGEgJ2onOyAgdGhleSBhcmUgQUxXQVlTICJkZS1vcHRpbWl6ZWQiIGlmIG5lY2Vzc2FyeToKLSAqIGlmIHRoZSBkaXNwbGFjZW1lbnQgd2lsbCBub3QgZml0IGluIDEzIGJpdHMsIHRoZSBhc3NlbWJsZXIgd2lsbCByZXBsYWNlIHRoZW0KLSAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyZSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4KLSAqCi0gKiBBbGwgb2YgdGhlICdNRU1uJyBpbnN0cnVjdGlvbnMgYXJlIHRoZSBzYW1lIGZvcm1hdDsgdGhlICduJyBpbiB0aGUgbmFtZQotICogaW5kaWNhdGVzIHRoZSBkZWZhdWx0IGluZGV4IHNjYWxlIGZhY3RvciAodGhlIHNpemUgb2YgdGhlIGRhdHVtIG9wZXJhdGVkIG9uKS4KLSAqCi0gKiBUaGUgRkJSQSBmb3JtYXRzIGFyZSBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgVGhleSBhcmUgdGhlCi0gKiAiY29udmVuaWVuY2UgZGlyZWN0aXZlcyIgZm9yIGJyYW5jaGluZyBvbiBmbG9hdGluZy1wb2ludCBjb21wYXJpc29ucywKLSAqIGVhY2ggb2Ygd2hpY2ggZ2VuZXJhdGVzIDIgaW5zdHJ1Y3Rpb25zIChhICdibm8nIGFuZCBvbmUgb3RoZXIgYnJhbmNoKS4KLSAqCi0gKiBUaGUgQ0FMTEogZm9ybWF0IGlzIG5vdCBhY3R1YWxseSBhbiBpbnN0cnVjdGlvbiBmb3JtYXQuICBJdCBpbmRpY2F0ZXMgdGhhdAotICogdGhlIGluc3RydWN0aW9uIGdlbmVyYXRlZCAoYSBDVFJMLWZvcm1hdCAnY2FsbCcpIHNob3VsZCBoYXZlIGl0cyByZWxvY2F0aW9uCi0gKiBzcGVjaWFsbHkgZmxhZ2dlZCBmb3IgbGluay10aW1lIHJlcGxhY2VtZW50IHdpdGggYSAnYmFsJyBvciAnY2FsbHMnIGlmCi0gKiBhcHByb3ByaWF0ZS4KLSAqLyAKLQotI2RlZmluZSBDVFJMCTAKLSNkZWZpbmUgQ09CUgkxCi0jZGVmaW5lIENPSgkyCi0jZGVmaW5lIFJFRwkzCi0jZGVmaW5lIE1FTTEJNAotI2RlZmluZSBNRU0yCTUKLSNkZWZpbmUgTUVNNAk2Ci0jZGVmaW5lIE1FTTgJNwotI2RlZmluZSBNRU0xMgk4Ci0jZGVmaW5lIE1FTTE2CTkKLSNkZWZpbmUgRkJSQQkxMAotI2RlZmluZSBDQUxMSgkxMQotCi0vKiBNYXNrcyBmb3IgdGhlIG1vZGUgYml0cyBpbiBSRUcgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNMQkJMHgwODAwCi0jZGVmaW5lIE0yCQkweDEwMDAKLSNkZWZpbmUgTTMJCTB4MjAwMAotCi0vKiBHZW5lcmF0ZSB0aGUgMTItYml0IG9wY29kZSBmb3IgYSBSRUcgZm9ybWF0IGluc3RydWN0aW9uIGJ5IHBsYWNpbmcgdGhlIAotICogaGlnaCA4IGJpdHMgaW4gaW5zdHJ1Y3Rpb24gYml0cyAyNC0zMSwgdGhlIGxvdyA0IGJpdHMgaW4gaW5zdHJ1Y3Rpb24gYml0cwotICogNy0xMC4KLSAqLwotCi0jZGVmaW5lIFJFR19PUEMob3BjKQkoKG9wYyAmIDB4ZmYwKSA8PCAyMCkgfCAoKG9wYyAmIDB4ZikgPDwgNykKLQotLyogR2VuZXJhdGUgYSB0ZW1wbGF0ZSBmb3IgYSBSRUcgZm9ybWF0IGluc3RydWN0aW9uOiAgcGxhY2UgdGhlIG9wY29kZSBiaXRzCi0gKiBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGFuZCBPUiBpbiBtb2RlIGJpdHMgZm9yIHRoZSBvcGVyYW5kcyB0aGF0IHdpbGwgbm90Ci0gKiBiZSB1c2VkLiAgSS5lLiwKLSAqCQlzZXQgbTE9MSwgaWYgc3JjMSB3aWxsIG5vdCBiZSB1c2VkCi0gKgkJc2V0IG0yPTEsIGlmIHNyYzIgd2lsbCBub3QgYmUgdXNlZAotICoJCXNldCBtMz0xLCBpZiBkc3QgIHdpbGwgbm90IGJlIHVzZWQKLSAqCi0gKiBTZXR0aW5nIHRoZSAidW51c2VkIiBtb2RlIGJpdHMgdG8gMSBzcGVlZHMgdXAgaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uKCEpLgotICogVGhlIGluZm9ybWF0aW9uIGlzIGFsc28gdXNlZnVsIHRvIHVzIGJlY2F1c2Ugc29tZSAxLW9wZXJhbmQgUkVHIGluc3RydWN0aW9ucwotICogdXNlIHRoZSBzcmMxIGZpZWxkLCBvdGhlcnMgdGhlIGRzdCBmaWVsZDsgYW5kIHNvbWUgMi1vcGVyYW5kIFJFRyBpbnN0cnVjdGlvbnMKLSAqIHVzZSBzcmMxL3NyYzIsIG90aGVycyBzcmMxL2RzdC4gIFRoZSBzZXQgbW9kZSBiaXRzIGVuYWJsZSB1cyB0byBkaXN0aW5ndWlzaC4KLSAqLwotI2RlZmluZSBSXzAob3BjKQkoIFJFR19PUEMob3BjKSB8IE0xIHwgTTIgfCBNMyApCS8qIE5vIG9wZXJhbmRzICAgICAgKi8KLSNkZWZpbmUgUl8xKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMiB8IE0zICkJLyogMSBvcGVyYW5kOiBzcmMxICAqLwotI2RlZmluZSBSXzFEKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMSB8IE0yICkJLyogMSBvcGVyYW5kOiBkc3QgICAqLwotI2RlZmluZSBSXzIob3BjKQkoIFJFR19PUEMob3BjKSB8IE0zICkJCS8qIDIgb3BzOiBzcmMxL3NyYzIgKi8KLSNkZWZpbmUgUl8yRChvcGMpCSggUkVHX09QQyhvcGMpIHwgTTIgKQkJLyogMiBvcHM6IHNyYzEvZHN0ICAqLwotI2RlZmluZSBSXzMob3BjKQkoIFJFR19PUEMob3BjKSApCQkvKiAzIG9wZXJhbmRzICAgICAgICovCi0KLS8qIERFU0NSSVBUT1IgQllURVMgRk9SIFJFR0lTVEVSIE9QRVJBTkRTCi0gKgotICogSW50ZXJwcmV0IG5hbWVzIGFzIGZvbGxvd3M6Ci0gKglSOiAgIGdsb2JhbCBvciBsb2NhbCByZWdpc3RlciBvbmx5Ci0gKglSUzogIGdsb2JhbCwgbG9jYWwsIG9yIChpZiB0YXJnZXQgYWxsb3dzKSBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyIG9ubHkKLSAqCVJMOiAgZ2xvYmFsIG9yIGxvY2FsIHJlZ2lzdGVyLCBvciBpbnRlZ2VyIGxpdGVyYWwKLSAqCVJTTDogZ2xvYmFsLCBsb2NhbCwgb3IgKGlmIHRhcmdldCBhbGxvd3MpIHNwZWNpYWwtZnVuY3Rpb24gcmVnaXN0ZXI7Ci0gKgkJb3IgaW50ZWdlciBsaXRlcmFsCi0gKglGOiAgIGdsb2JhbCwgbG9jYWwsIG9yIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyCi0gKglGTDogIGdsb2JhbCwgbG9jYWwsIG9yIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyOyBvciBsaXRlcmFsIChpbmNsdWRpbmcKLSAqCQlmbG9hdGluZyBwb2ludCkKLSAqCi0gKiBBIG51bWJlciBhcHBlbmRlZCB0byBhIG5hbWUgaW5kaWNhdGVzIHRoYXQgcmVnaXN0ZXJzIG11c3QgYmUgYWxpZ25lZCwKLSAqIGFzIGZvbGxvd3M6Ci0gKgkyOiByZWdpc3RlciBudW1iZXIgbXVzdCBiZSBtdWx0aXBsZSBvZiAyCi0gKgk0OiByZWdpc3RlciBudW1iZXIgbXVzdCBiZSBtdWx0aXBsZSBvZiA0Ci0gKi8KLQotI2RlZmluZSBTRlIJMHgxMAkJLyogTWFzayBmb3IgdGhlICJzZnItT0siIGJpdCAqLwotI2RlZmluZSBMSVQJMHgwOAkJLyogTWFzayBmb3IgdGhlICJsaXRlcmFsLU9LIiBiaXQgKi8KLSNkZWZpbmUgRlAJMHgwNAkJLyogTWFzayBmb3IgImZsb2F0aW5nLXBvaW50LU9LIiBiaXQgKi8KLQotLyogVGhpcyBtYWNybyBvcnMgdGhlIGJpdHMgdG9nZXRoZXIuICBOb3RlIHRoYXQgJ2FsaWduJyBpcyBhIG1hc2sKLSAqIGZvciB0aGUgbG93IDAsIDEsIG9yIDIgYml0cyBvZiB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhcyBhcHByb3ByaWF0ZS4KLSAqLwotI2RlZmluZSBPUChhbGlnbixsaXQsZnAsc2ZyKQkoIGFsaWduIHwgbGl0IHwgZnAgfCBzZnIgKQotCi0jZGVmaW5lIFIJT1AoIDAsIDAsICAgMCwgIDAgICApCi0jZGVmaW5lIFJTCU9QKCAwLCAwLCAgIDAsICBTRlIgKQotI2RlZmluZSBSTAlPUCggMCwgTElULCAwLCAgMCAgICkKLSNkZWZpbmUgUlNMCU9QKCAwLCBMSVQsIDAsICBTRlIgKQotI2RlZmluZSBGCU9QKCAwLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTAlPUCggMCwgTElULCBGUCwgMCAgICkKLSNkZWZpbmUgUjIJT1AoIDEsIDAsICAgMCwgIDAgICApCi0jZGVmaW5lIFJMMglPUCggMSwgTElULCAwLCAgMCAgICkKLSNkZWZpbmUgRjIJT1AoIDEsIDAsICAgRlAsIDAgICApCi0jZGVmaW5lIEZMMglPUCggMSwgTElULCBGUCwgMCAgICkKLSNkZWZpbmUgUjQJT1AoIDMsIDAsICAgMCwgIDAgICApCi0jZGVmaW5lIFJMNAlPUCggMywgTElULCAwLCAgMCAgICkKLSNkZWZpbmUgRjQJT1AoIDMsIDAsICAgRlAsIDAgICApCi0jZGVmaW5lIEZMNAlPUCggMywgTElULCBGUCwgMCAgICkKLQotI2RlZmluZSBNCTB4N2YJLyogTWVtb3J5IG9wZXJhbmQgKE1FTUEgJiBNRU1CIGZvcm1hdCBpbnN0cnVjdGlvbnMpICovCi0KLS8qIE1hY3JvcyB0byBleHRyYWN0IGluZm8gZnJvbSB0aGUgcmVnaXN0ZXIgb3BlcmFuZCBkZXNjcmlwdG9yIGJ5dGUgJ29kJy4KLSAqLwotI2RlZmluZSBTRlJfT0sob2QpCShvZCAmIFNGUikJLyogVFJVRSBpZiBzZnIgb3BlcmFuZCBhbGxvd2VkICovCi0jZGVmaW5lIExJVF9PSyhvZCkJKG9kICYgTElUKQkvKiBUUlVFIGlmIGxpdGVyYWwgb3BlcmFuZCBhbGxvd2VkICovCi0jZGVmaW5lIEZQX09LKG9kKQkob2QgJiBGUCkJLyogVFJVRSBpZiBmbG9hdGluZy1wb2ludCBvcCBhbGxvd2VkICovCi0jZGVmaW5lIFJFR19BTElHTihvZCxuKQkoKG9kICYgMHgzICYgbikgPT0gMCkKLQkJCQkJLyogVFJVRSBpZiByZWcgI24gaXMgcHJvcGVybHkgYWxpZ25lZCAqLwotI2RlZmluZSBNRU1PUChvZCkJKG9kID09IE0pCS8qIFRSVUUgaWYgb3BlcmFuZCBpcyBhIG1lbW9yeSBvcGVyYW5kKi8KLQotLyogRGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgaTgwOTYwIGluc3RydWN0aW9uICovCi1zdHJ1Y3QgaTk2MF9vcGNvZGUgewotCWxvbmcgb3Bjb2RlOwkvKiAzMiBiaXRzLCBjb25zdGFudCBmaWVsZHMgZmlsbGVkIGluLCByZXN0IHplcm9lZCAqLwotCWNoYXIgKm5hbWU7CS8qIEFzc2VtYmxlciBtbmVtb25pYwkJCQkgICAqLwotCXNob3J0IGljbGFzczsJLyogQ2xhc3M6IHNlZSAjZGVmaW5lcyBiZWxvdwkJCSAgICovCi0JY2hhciBmb3JtYXQ7CS8qIFJFRywgQ09CUiwgQ1RSTCwgTUVNbiwgQ09KLCBGQlJBLCBvciBDQUxMSgkgICAqLwotCWNoYXIgbnVtX29wczsJLyogTnVtYmVyIG9mIG9wZXJhbmRzCQkJCSAgICovCi0JY2hhciBvcGVyYW5kWzNdOy8qIE9wZXJhbmQgZGVzY3JpcHRvcnM7IHNhbWUgb3JkZXIgYXMgYXNzZW1ibGVyIGluc3RyICovCi19OwotCi0vKiBDbGFzc2VzIG9mIDk2MCBpbnRydWN0aW9uczoKLSAqCS0gZWFjaCBpbnN0cnVjdGlvbiBmYWxscyBpbnRvIG9uZSBjbGFzcy4KLSAqCS0gZWFjaCB0YXJnZXQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIG9uZSBvciBtb3JlIGNsYXNzZXMuCi0gKgotICogRUFDSCBDT05TVEFOVCBNVVNUIENPTlRBSU4gMSBBTkQgT05MWSAxIFNFVCBCSVQhOiAgc2VlIHRhcmdfaGFzX2ljbGFzcygpLgotICovCi0jZGVmaW5lIElfQkFTRQkweDAxCS8qIDgwOTYwIGJhc2UgaW5zdHJ1Y3Rpb24gc2V0CSovCi0jZGVmaW5lIElfQ1gJMHgwMgkvKiA4MDk2MEN4IGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX0RFQwkweDA0CS8qIERlY2ltYWwgaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfRlAJMHgwOAkvKiBGbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBJX0tYCTB4MTAJLyogODA5NjBLeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9NSUwJMHgyMAkvKiBNaWxpdGFyeSBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9DQVNJTQkweDQwCS8qIENBIHNpbXVsYXRvciBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBJX0NYMgkweDgwCS8qIEN4L0p4L0h4IGluc3RydWN0aW9ucwkqLwotI2RlZmluZSBJX0pYCTB4MTAwCS8qIEp4L0h4IGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX0hYCTB4MjAwCS8qIEh4IGluc3RydWN0aW9ucwkJKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCQlUQUJMRSBPRiBpOTYwIElOU1RSVUNUSU9OIERFU0NSSVBUSU9OUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IHN0cnVjdCBpOTYwX29wY29kZSBpOTYwX29wY29kZXNbXSA9IHsKLQotCS8qIGlmIGEgQ1RSTCBpbnN0cnVjdGlvbiBoYXMgYW4gb3BlcmFuZCwgaXQncyBhbHdheXMgYSBkaXNwbGFjZW1lbnQgKi8KLQotCS8qIGNhbGxqIGRlZmF1bHQ9PSdjYWxsJyAqLwotCXsgMHgwOTAwMDAwMCwJImNhbGxqIiwJSV9CQVNFLAlDQUxMSiwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDA4MDAwMDAwLAkiYiIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgwOTAwMDAwMCwJImNhbGwiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MGEwMDAwMDAsCSJyZXQiLAkJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MGIwMDAwMDAsCSJiYWwiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTAwMDAwMDAsCSJibm8iLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBiZiBzYW1lIGFzIGJubyAqLwotCXsgMHgxMDAwMDAwMCwJImJmIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJ1IHNhbWUgYXMgYm5vICovCi0JeyAweDEwMDAwMDAwLAkiYnJ1IiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDExMDAwMDAwLAkiYmciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmcgc2FtZSBhcyBiZyAqLwotCXsgMHgxMTAwMDAwMCwJImJyZyIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxMjAwMDAwMCwJImJlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJlIHNhbWUgYXMgYmUgKi8KLQl7IDB4MTIwMDAwMDAsCSJicmUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTMwMDAwMDAsCSJiZ2UiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmdlIHNhbWUgYXMgYmdlICovCi0JeyAweDEzMDAwMDAwLAkiYnJnZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxNDAwMDAwMCwJImJsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJsIHNhbWUgYXMgYmwgKi8KLQl7IDB4MTQwMDAwMDAsCSJicmwiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTUwMDAwMDAsCSJibmUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmxnIHNhbWUgYXMgYm5lICovCi0JeyAweDE1MDAwMDAwLAkiYnJsZyIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxNjAwMDAwMCwJImJsZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJybGUgc2FtZSBhcyBibGUgKi8KLQl7IDB4MTYwMDAwMDAsCSJicmxlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE3MDAwMDAwLAkiYm8iLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBidCBzYW1lIGFzIGJvICovCi0JeyAweDE3MDAwMDAwLAkiYnQiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicm8gc2FtZSBhcyBibyAqLwotCXsgMHgxNzAwMDAwMCwJImJybyIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxODAwMDAwMCwJImZhdWx0bm8iLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCS8qIGZhdWx0ZiBzYW1lIGFzIGZhdWx0bm8gKi8KLQl7IDB4MTgwMDAwMDAsCSJmYXVsdGYiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxOTAwMDAwMCwJImZhdWx0ZyIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFhMDAwMDAwLAkiZmF1bHRlIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWIwMDAwMDAsCSJmYXVsdGdlIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWMwMDAwMDAsCSJmYXVsdGwiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxZDAwMDAwMCwJImZhdWx0bmUiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxZTAwMDAwMCwJImZhdWx0bGUiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxZjAwMDAwMCwJImZhdWx0byIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JLyogZmF1bHR0IHN5biBmb3IgZmF1bHRvICovCi0JeyAweDFmMDAwMDAwLAkiZmF1bHR0IiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQotCXsgMHgwMTAwMDAwMCwJInN5c2NhbGwiLAlJX0NBU0lNLENUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCi0JLyogSWYgYSBDT0JSIChvciBDT0opIGhhcyAzIG9wZXJhbmRzLCB0aGUgbGFzdCBvbmUgaXMgYWx3YXlzIGEKLQkgKiBkaXNwbGFjZW1lbnQgYW5kIGRvZXMgbm90IGFwcGVhciBleHBsaWNpdGx5IGluIHRoZSB0YWJsZS4KLQkgKi8KLQotCXsgMHgyMDAwMDAwMCwJInRlc3RubyIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjEwMDAwMDAsCSJ0ZXN0ZyIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjIwMDAwMDAsCSJ0ZXN0ZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjMwMDAwMDAsCSJ0ZXN0Z2UiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDI0MDAwMDAwLAkidGVzdGwiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDI1MDAwMDAwLAkidGVzdG5lIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNjAwMDAwMCwJInRlc3RsZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjcwMDAwMDAsCSJ0ZXN0byIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MzAwMDAwMDAsCSJiYmMiLAkJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMxMDAwMDAwLAkiY21wb2JnIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMyMDAwMDAwLAkiY21wb2JlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMzMDAwMDAwLAkiY21wb2JnZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNDAwMDAwMCwJImNtcG9ibCIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNTAwMDAwMCwJImNtcG9ibmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzYwMDAwMDAsCSJjbXBvYmxlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM3MDAwMDAwLAkiYmJzIiwJCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzODAwMDAwMCwJImNtcGlibm8iLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzkwMDAwMDAsCSJjbXBpYmciLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2EwMDAwMDAsCSJjbXBpYmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2IwMDAwMDAsCSJjbXBpYmdlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNjMDAwMDAwLAkiY21waWJsIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNkMDAwMDAwLAkiY21waWJuZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZTAwMDAwMCwJImNtcGlibGUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2YwMDAwMDAsCSJjbXBpYm8iLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzEwMDAwMDAsCSJjbXBvamciLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMjAwMDAwMCwJImNtcG9qZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMzMDAwMDAwLAkiY21wb2pnZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM0MDAwMDAwLAkiY21wb2psIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzUwMDAwMDAsCSJjbXBvam5lIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzYwMDAwMDAsCSJjbXBvamxlIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzgwMDAwMDAsCSJjbXBpam5vIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzkwMDAwMDAsCSJjbXBpamciLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYTAwMDAwMCwJImNtcGlqZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNiMDAwMDAwLAkiY21waWpnZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNjMDAwMDAwLAkiY21waWpsIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2QwMDAwMDAsCSJjbXBpam5lIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2UwMDAwMDAsCSJjbXBpamxlIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2YwMDAwMDAsCSJjbXBpam8iLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCi0JeyAweDgwMDAwMDAwLAkibGRvYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4ODIwMDAwMDAsCSJzdG9iIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHg4NDAwMDAwMCwJImJ4IiwJCUlfQkFTRSwJTUVNMSwJMSwgeyBNLCAgMCwgIDAgfSB9LAotCXsgMHg4NTAwMDAwMCwJImJhbHgiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweDg2MDAwMDAwLAkiY2FsbHgiLAlJX0JBU0UsCU1FTTEsCTEsIHsgTSwgIDAsICAwIH0gfSwKLQl7IDB4ODgwMDAwMDAsCSJsZG9zIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg4YTAwMDAwMCwJInN0b3MiLAkJSV9CQVNFLAlNRU0yLAkyLCB7IFIsICBNLCAgMCB9IH0sCi0JeyAweDhjMDAwMDAwLAkibGRhIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg5MDAwMDAwMCwJImxkIiwJCUlfQkFTRSwJTUVNNCwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg5MjAwMDAwMCwJInN0IiwJCUlfQkFTRSwJTUVNNCwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHg5ODAwMDAwMCwJImxkbCIsCQlJX0JBU0UsCU1FTTgsCTIsIHsgTSwgIFIyLCAwIH0gfSwKLQl7IDB4OWEwMDAwMDAsCSJzdGwiLAkJSV9CQVNFLAlNRU04LAkyLCB7IFIyLCBNLCAgMCB9IH0sCi0JeyAweGEwMDAwMDAwLAkibGR0IiwJCUlfQkFTRSwJTUVNMTIsCTIsIHsgTSwgIFI0LCAwIH0gfSwKLQl7IDB4YTIwMDAwMDAsCSJzdHQiLAkJSV9CQVNFLAlNRU0xMiwJMiwgeyBSNCwgTSwgIDAgfSB9LAotCXsgMHhiMDAwMDAwMCwJImxkcSIsCQlJX0JBU0UsCU1FTTE2LAkyLCB7IE0sICBSNCwgMCB9IH0sCi0JeyAweGIyMDAwMDAwLAkic3RxIiwJCUlfQkFTRSwJTUVNMTYsCTIsIHsgUjQsIE0sICAwIH0gfSwKLQl7IDB4YzAwMDAwMDAsCSJsZGliIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHhjMjAwMDAwMCwJInN0aWIiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IFIsICBNLCAgMCB9IH0sCi0JeyAweGM4MDAwMDAwLAkibGRpcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4Y2EwMDAwMDAsCSJzdGlzIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCi0JeyBSXzMoMHg1ODApLAkibm90Yml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODEpLAkiYW5kIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTgyKSwJImFuZG5vdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTgzKSwJInNldGJpdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg0KSwJIm5vdGFuZCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg2KSwJInhvciIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NyksCSJvciIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4OCksCSJub3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODkpLAkieG5vciIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg1OGEpLAkibm90IiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0JeyBSXzMoMHg1OGIpLAkib3Jub3QiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4YyksCSJjbHJiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4ZCksCSJub3RvciIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NThlKSwJIm5hbmQiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGYpLAkiYWx0ZXJiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5MCksCSJhZGRvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTkxKSwJImFkZGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTIpLAkic3VibyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5MyksCSJzdWJpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTk4KSwJInNocm8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWEpLAkic2hyZGkiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5YiksCSJzaHJpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTljKSwJInNobG8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWQpLAkicm90YXRlIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWUpLAkic2hsaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMigweDVhMCksCSJjbXBvIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NWExKSwJImNtcGkiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1YTIpLAkiY29uY21wbyIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NWEzKSwJImNvbmNtcGkiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMygweDVhNCksCSJjbXBpbmNvIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1YTUpLAkiY21waW5jaSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NWE2KSwJImNtcGRlY28iLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDVhNyksCSJjbXBkZWNpIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzIoMHg1YWMpLAkic2NhbmJ5dGUiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhZSksCSJjaGtiaXQiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMygweDViMCksCSJhZGRjIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NWIyKSwJInN1YmMiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NWNjKSwJIm1vdiIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8yRCgweDVkYyksCSJtb3ZsIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJMMixSMiwgMCB9IH0sCi0JeyBSXzJEKDB4NWVjKSwJIm1vdnQiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUkw0LFI0LCAwIH0gfSwKLQl7IFJfMkQoMHg1ZmMpLAkibW92cSIsCQlJX0JBU0UsCVJFRywJMiwgeyBSTDQsUjQsIDAgfSB9LAotCXsgUl8zKDB4NjEwKSwJImF0bW9kIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlMsIFJTTCxSIH0gfSwKLQl7IFJfMygweDYxMiksCSJhdGFkZCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTLCBSU0wsUlMgfSB9LAotCXsgUl8yRCgweDY0MCksCSJzcGFuYml0IiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQl7IFJfMkQoMHg2NDEpLAkic2NhbmJpdCIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0JeyBSXzMoMHg2NDUpLAkibW9kYWMiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDY1MCksCSJtb2RpZnkiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFIgfSB9LAotCXsgUl8zKDB4NjUxKSwJImV4dHJhY3QiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFIgfSB9LAotCXsgUl8zKDB4NjU0KSwJIm1vZHRjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2NTUpLAkibW9kcGMiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFIgfSB9LAotCXsgUl8xKDB4NjYwKSwJImNhbGxzIiwJSV9CQVNFLAlSRUcsCTEsIHsgUlNMLCAwLCAwIH0gfSwKLQl7IFJfMCgweDY2YiksCSJtYXJrIiwJCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjZjKSwJImZtYXJrIiwJSV9CQVNFLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzAoMHg2NmQpLAkiZmx1c2hyZWciLAlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMCgweDY2ZiksCSJzeW5jZiIsCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8zKDB4NjcwKSwJImVtdWwiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSMiB9IH0sCi0JeyBSXzMoMHg2NzEpLAkiZWRpdiIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUkwyLFJTIH0gfSwKLQl7IFJfMkQoMHg2NzIpLAkiY3Z0YWRyIiwJSV9DQVNJTSxSRUcsIAkyLCB7IFJMLCBSMiwgMCB9IH0sCi0JeyBSXzMoMHg3MDEpLAkibXVsbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDcwOCksCSJyZW1vIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzBiKSwJImRpdm8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3NDEpLAkibXVsaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc0OCksCSJyZW1pIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzQ5KSwJIm1vZGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3NGIpLAkiZGl2aSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQotCS8qIEZsb2F0aW5nLXBvaW50IGluc3RydWN0aW9ucyAqLwotCi0JeyBSXzJEKDB4Njc0KSwJImN2dGlyIiwJSV9GUCwJUkVHLAkyLCB7IFJMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2NzUpLAkiY3Z0aWxyIiwJSV9GUCwJUkVHLAkyLCB7IFJMLCBGLCAwIH0gfSwKLQl7IFJfMygweDY3NiksCSJzY2FsZXJsIiwJSV9GUCwJUkVHLAkzLCB7IFJMLCBGTDIsRjIgfSB9LAotCXsgUl8zKDB4Njc3KSwJInNjYWxlciIsCUlfRlAsCVJFRywJMywgeyBSTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgwKSwJImF0YW5yIiwJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg2ODEpLAkibG9nZXByIiwJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg2ODIpLAkibG9nciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDY4MyksCSJyZW1yIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8yKDB4Njg0KSwJImNtcG9yIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBGTCwgMCB9IH0sCi0JeyBSXzIoMHg2ODUpLAkiY21wciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEZMLCAwIH0gfSwKLQl7IFJfMkQoMHg2ODgpLAkic3FydHIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4OSksCSJleHByIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhhKSwJImxvZ2JuciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhiKSwJInJvdW5kciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhjKSwJInNpbnIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2OGQpLAkiY29zciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4ZSksCSJ0YW5yIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzEoMHg2OGYpLAkiY2xhc3NyIiwJSV9GUCwJUkVHLAkxLCB7IEZMLCAwLCAwIH0JfSwKLQl7IFJfMygweDY5MCksCSJhdGFucmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTEpLAkibG9nZXBybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMygweDY5MiksCSJsb2dybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMygweDY5MyksCSJyZW1ybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMigweDY5NCksCSJjbXBvcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEZMMiwgMCB9IH0sCi0JeyBSXzIoMHg2OTUpLAkiY21wcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEZMMiwgMCB9IH0sCi0JeyBSXzJEKDB4Njk4KSwJInNxcnRybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5OSksCSJleHBybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5YSksCSJsb2dibnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjliKSwJInJvdW5kcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWMpLAkic2lucmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWQpLAkiY29zcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWUpLAkidGFucmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMSgweDY5ZiksCSJjbGFzc3JsIiwJSV9GUCwJUkVHLAkxLCB7IEZMMiwgMCwgMCB9IH0sCi0JeyBSXzJEKDB4NmMwKSwJImN2dHJpIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSLCAwIH0gfSwKLQl7IFJfMkQoMHg2YzEpLAkiY3Z0cmlsIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSMiwgMCB9IH0sCi0JeyBSXzJEKDB4NmMyKSwJImN2dHpyaSIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NmMzKSwJImN2dHpyaWwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIFIyLCAwIH0gfSwKLQl7IFJfMkQoMHg2YzkpLAkibW92ciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDZkOSksCSJtb3ZybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDZlMSksCSJtb3ZyZSIsCUlfRlAsCVJFRywJMiwgeyBGTDQsRjQsIDAgfSB9LAotCXsgUl8zKDB4NmUyKSwJImNweXNyZSIsCUlfRlAsCVJFRywJMywgeyBGTDQsRkw0LEY0IH0gfSwKLQl7IFJfMygweDZlMyksCSJjcHlyc3JlIiwJSV9GUCwJUkVHLAkzLCB7IEZMNCxGTDQsRjQgfSB9LAotCXsgUl8zKDB4NzhiKSwJImRpdnIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg3OGMpLAkibXVsciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDc4ZCksCSJzdWJyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzhmKSwJImFkZHIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg3OWIpLAkiZGl2cmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg3OWMpLAkibXVscmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg3OWQpLAkic3VicmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg3OWYpLAkiYWRkcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0KLQkvKiBUaGVzZSBhcmUgdGhlIGZsb2F0aW5nIHBvaW50IGJyYW5jaCBpbnN0cnVjdGlvbnMuICBFYWNoIGFjdHVhbGx5Ci0JICogZ2VuZXJhdGVzIDIgYnJhbmNoIGluc3RydWN0aW9uczogIHRoZSBmaXJzdCBhIENUUkwgaW5zdHJ1Y3Rpb24gd2l0aAotCSAqIHRoZSBpbmRpY2F0ZWQgb3Bjb2RlLCBhbmQgdGhlIHNlY29uZCBhICdibm8nLgotCSAqLwotCi0JeyAweDEyMDAwMDAwLAkiYnJ1ZSIsCQlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTEwMDAwMDAsCSJicnVnIiwJCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxMzAwMDAwMCwJImJydWdlIiwJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDE0MDAwMDAwLAkiYnJ1bCIsCQlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTYwMDAwMDAsCSJicnVsZSIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxNTAwMDAwMCwJImJydWxnIiwJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0KLQotCS8qIERlY2ltYWwgaW5zdHJ1Y3Rpb25zICovCi0KLQl7IFJfMygweDY0MiksCSJkYWRkYyIsCUlfREVDLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2NDMpLAkiZHN1YmMiLAlJX0RFQywJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yRCgweDY0NCksCSJkbW92dCIsCUlfREVDLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQotCi0JLyogS1ggZXh0ZW5zaW9ucyAqLwotCi0JeyBSXzIoMHg2MDApLAkic3lubW92IiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMigweDYwMSksCSJzeW5tb3ZsIiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMigweDYwMiksCSJzeW5tb3ZxIiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMkQoMHg2MTUpLAkic3lubGQiLAlJX0tYLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCi0KLQkvKiBNQyBleHRlbnNpb25zICovCi0KLQl7IFJfMygweDYwMyksCSJjbXBzdHIiLAlJX01JTCwJUkVHLAkzLCB7IFIsICBSLCAgUkwgfSB9LAotCXsgUl8zKDB4NjA0KSwJIm1vdnFzdHIiLAlJX01JTCwJUkVHLAkzLCB7IFIsICBSLCAgUkwgfSB9LAotCXsgUl8zKDB4NjA1KSwJIm1vdnN0ciIsCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFIsICBSTCB9IH0sCi0JeyBSXzJEKDB4NjEzKSwJImluc3BhY2MiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMkQoMHg2MTQpLAkibGRwaHkiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMygweDYxNyksCSJmaWxsIiwJCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFJMLCBSTCB9IH0sCi0JeyBSXzJEKDB4NjQ2KSwJImNvbmRyZWMiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMkQoMHg2NTYpLAkicmVjZWl2ZSIsCUlfTUlMLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCXsgUl8zKDB4NjYyKSwJInNlbmQiLAkJSV9NSUwsCVJFRywJMywgeyBSLCAgUkwsIFIgfSB9LAotCXsgUl8xKDB4NjYzKSwJInNlbmRzZXJ2IiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2NCksCSJyZXN1bXByY3MiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjY1KSwJInNjaGVkcHJjcyIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzAoMHg2NjYpLAkic2F2ZXByY3MiLAlJX01JTCwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjY4KSwJImNvbmR3YWl0IiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2OSksCSJ3YWl0IiwJCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NmEpLAkic2lnbmFsIiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMUQoMHg2NzMpLAkibGR0aW1lIiwJSV9NSUwsCVJFRywJMSwgeyBSMiwgMCwgMCB9CX0sCi0KLQotCS8qIENYIGV4dGVuc2lvbnMgKi8KLQotCXsgUl8zKDB4NWQ4KSwJImVzaHJvIiwJSV9DWDIsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDYzMCksCSJzZG1hIiwJCUlfQ1gsCVJFRywJMywgeyBSU0wsUlNMLFJMIH0gfSwKLQl7IFJfMygweDYzMSksCSJ1ZG1hIiwJCUlfQ1gsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMygweDY1OSksCSJzeXNjdGwiLAlJX0NYMiwJUkVHLAkzLCB7IFJTTCxSU0wsUkwgfSB9LAotCi0KLQkvKiBKeCBleHRlbnNpb25zLiAgKi8KLQl7IFJfMygweDc4MCksCSJhZGRvbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTApLAkiYWRkb2ciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTApLAkiYWRkb2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjApLAkiYWRkb2dlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2MwKSwJImFkZG9sIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2QwKSwJImFkZG9uZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlMCksCSJhZGRvbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjApLAkiYWRkb28iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ODEpLAkiYWRkaW5vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkxKSwJImFkZGlnIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2ExKSwJImFkZGllIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IxKSwJImFkZGlnZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMSksCSJhZGRpbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMSksCSJhZGRpbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTEpLAkiYWRkaWxlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YxKSwJImFkZGlvIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCi0JeyBSXzJEKDB4NWFkKSwJImJzd2FwIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCwgUlMsIDAgfSB9LAotCi0JeyBSXzIoMHg1OTQpLAkiY21wb2IiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1OTUpLAkiY21waWIiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1OTYpLAkiY21wb3MiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1OTcpLAkiY21waXMiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0KLQl7IFJfMygweDc4NCksCSJzZWxubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5NCksCSJzZWxnIiwJCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhNCksCSJzZWxlIiwJCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiNCksCSJzZWxnZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjNCksCSJzZWxsIiwJCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkNCksCSJzZWxuZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlNCksCSJzZWxsZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmNCksCSJzZWxvIiwJCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQotCXsgUl8zKDB4NzgyKSwJInN1Ym9ubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5MiksCSJzdWJvZyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhMiksCSJzdWJvZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiMiksCSJzdWJvZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzIpLAkic3Vib2wiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDIpLAkic3Vib25lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2UyKSwJInN1Ym9sZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmMiksCSJzdWJvbyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc4MyksCSJzdWJpbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTMpLAkic3ViaWciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTMpLAkic3ViaWUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjMpLAkic3ViaWdlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2MzKSwJInN1YmlsIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2QzKSwJInN1YmluZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlMyksCSJzdWJpbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjMpLAkic3ViaW8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQl7IFJfMygweDY1YyksCSJkY2N0bCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJMIH0gfSwKLQl7IFJfMygweDY1YiksCSJpY2N0bCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NTgpLAkiaW50Y3RsIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCwgUlMsIDAgfSB9LAotCXsgUl8wKDB4NWI0KSwJImludGRpcyIsCUlfSlgsCVJFRywJMCwgeyAgIDAsICAwLCAwIH0gfSwKLQl7IFJfMCgweDViNSksCSJpbnRlbiIsCUlfSlgsCVJFRywJMCwgeyAgIDAsICAwLCAwIH0gfSwKLQl7IFJfMCgweDY1ZCksCSJoYWx0IiwJCUlfSlgsCVJFRywJMSwgeyBSU0wsICAwLCAwIH0gfSwKLQotCS8qIEh4IGV4dGVuc2lvbnMuICAqLwotCXsgMHhhYzAwMDAwMCwJImRjaW52YSIsCUlfSFgsCU1FTTEsCTEsIHsgICBNLCAgMCwgMCB9IH0sCi0KLQkvKiBFTkQgT0YgVEFCTEUgKi8KLQotCXsgMCwJCU5VTEwsCQkwLAkwLAkwLCB7IDAsIDAsIDAgfQl9Ci19OwotCi0gLyogZW5kIG9mIGk5NjAtb3Bjb2RlLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL202OGsuaCBiL2luY2x1ZGUvb3Bjb2RlL202OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwOGI3Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9tNjhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGhlYWRlciBmb3IgbTY4MFswMTIzNF0wL202ODg4WzEyXS9tNjg4NTEuCi0gICBDb3B5cmlnaHQgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlc2UgYXJlIHVzZWQgYXMgYml0IGZsYWdzIGZvciB0aGUgYXJjaCBmaWVsZCBpbiB0aGUgbTY4a19vcGNvZGUKLSAgIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lCV9tNjhrX3VuZGVmICAwCi0jZGVmaW5lCW02ODAwMCAgMHgwMDEKLSNkZWZpbmUJbTY4MDA4ICBtNjgwMDAgLyogc3lub255bSBmb3IgLW02ODAwMC4gIG90aGVyd2lzZSB1bnVzZWQuICovCi0jZGVmaW5lCW02ODAxMCAgMHgwMDIKLSNkZWZpbmUJbTY4MDIwICAweDAwNAotI2RlZmluZQltNjgwMzAgIDB4MDA4Ci0jZGVmaW5lIG02OGVjMDMwIG02ODAzMCAvKiBzaW1pbGFyIGVub3VnaCB0byAtbTY4MDMwIHRvIGlnbm9yZSBkaWZmZXJlbmNlczsKLQkJCSAgIGdhcyB3aWxsIGRlYWwgd2l0aCB0aGUgZmV3IGRpZmZlcmVuY2VzLiAgKi8KLSNkZWZpbmUJbTY4MDQwICAweDAxMAotLyogdGhlcmUgaXMgbm8gNjgwNTAgKi8KLSNkZWZpbmUgbTY4MDYwICAweDAyMAotI2RlZmluZQltNjg4ODEgIDB4MDQwCi0jZGVmaW5lCW02ODg4MiAgbTY4ODgxIC8qIHN5bm9ueW0gZm9yIC1tNjg4ODEuICBvdGhlcndpc2UgdW51c2VkLiAqLwotI2RlZmluZQltNjg4NTEgIDB4MDgwCi0jZGVmaW5lIGNwdTMyCTB4MTAwCS8qIGUuZy4sIDY4MzMyICovCi0jZGVmaW5lIG1jZjUyMDAgMHgyMDAKLSNkZWZpbmUgbWNmNTIwNmUgMHg0MDAKLSNkZWZpbmUgbWNmNTMwNyAweDgwMAotCi0gLyogaGFuZHkgYWxpYXNlcyAqLwotI2RlZmluZQltNjgwNDB1cCAgKG02ODA0MCB8IG02ODA2MCkKLSNkZWZpbmUJbTY4MDMwdXAgIChtNjgwMzAgfCBtNjgwNDB1cCkKLSNkZWZpbmUJbTY4MDIwdXAgIChtNjgwMjAgfCBtNjgwMzB1cCkKLSNkZWZpbmUJbTY4MDEwdXAgIChtNjgwMTAgfCBjcHUzMiB8IG02ODAyMHVwKQotI2RlZmluZQltNjgwMDB1cCAgKG02ODAwMCB8IG02ODAxMHVwKQotI2RlZmluZSBtY2YgICAgICAgKG1jZjUyMDAgfCBtY2Y1MjA2ZSB8IG1jZjUzMDcpCi0KLSNkZWZpbmUJbWZsb2F0ICAobTY4ODgxIHwgbTY4ODgyIHwgbTY4MDQwIHwgbTY4MDYwKQotI2RlZmluZQltbW11ICAgIChtNjg4NTEgfCBtNjgwMzAgfCBtNjgwNDAgfCBtNjgwNjApCi0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGZvciBhbiBvcGNvZGUuICAqLwotCi1zdHJ1Y3QgbTY4a19vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgLyogVGhlIG1hc2sgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXRjaDsKLSAgLyogVGhlIGFyZ3VtZW50cy4gICovCi0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIC8qIFRoZSBhcmNoaXRlY3R1cmVzIHdoaWNoIHN1cHBvcnQgdGhpcyBvcGNvZGUuICAqLwotICB1bnNpZ25lZCBpbnQgYXJjaDsKLX07Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGZvciBhbiBvcGNvZGUgYWxpYXMuICAqLwotCi1zdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMKLXsKLSAgLyogVGhlIGFsaWFzIG5hbWUuICAqLwotICBjb25zdCBjaGFyICphbGlhczsKLSAgLyogVGhlIGluc3RydWN0aW9uIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLiAgKi8KLSAgY29uc3QgY2hhciAqcHJpbWFyeTsKLX07Ci0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQgaXMgdGhlCi0gICBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbiBpcwotICAgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBpcyBhcyBtdWNoIGxvbmdlciBhcyBuZWNlc3NhcnkgdG8gaG9sZAotICAgdGhlIG9wZXJhbmRzIGl0IGhhcy4KLQotICAgVGhlIG1hdGNoIGZpZWxkIGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIHBhcnRpY3VsYXIKLSAgIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2Ugb2YgdGhhdAotICAgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBmaWVsZCBpcyBhIHN0cmluZyBjb250YWluaW5nIHR3byBjaGFyYWN0ZXJzIGZvciBlYWNoCi0gICBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBmaXJzdCBzcGVjaWZpZXMgdGhlIGtpbmQgb2YKLSAgIG9wZXJhbmQ7IHRoZSBzZWNvbmQsIHRoZSBwbGFjZSBpdCBpcyBzdG9yZWQuICAqLwotCi0vKiBLaW5kcyBvZiBvcGVyYW5kczoKLSAgIENoYXJhY3RlcnMgdXNlZDogQWFCQ2NEZEVGZkdISUprTGxNbW5Pb3BRcVJyU3NUdFUgVnZXWFlaMDEyM3wqfiU7QCEmJD8vPD4jXistCi0KLSAgIEQgIGRhdGEgcmVnaXN0ZXIgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMuCi0gICBBICBhZGRyZXNzIHJlZ2lzdGVyIG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgYSAgYWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIFIgIGVpdGhlciBraW5kIG9mIHJlZ2lzdGVyLiAgU3RvcmVkIGFzIDQgYml0cy4KLSAgIHIgIGVpdGhlciBraW5kIG9mIHJlZ2lzdGVyIGluZGlyZWN0IG9ubHkuICBTdG9yZWQgYXMgNCBiaXRzLgotICAgICAgQXQgdGhlIG1vbWVudCwgdXNlZCBvbmx5IGZvciBjYXMyIGluc3RydWN0aW9uLgotICAgRiAgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgcmVnaXN0ZXIgb25seS4gICBTdG9yZWQgYXMgMyBiaXRzLgotICAgTyAgYW4gb2Zmc2V0IChvciB3aWR0aCk6IGltbWVkaWF0ZSBkYXRhIDAtMzEgb3IgZGF0YSByZWdpc3Rlci4KLSAgICAgIFN0b3JlZCBhcyA2IGJpdHMgaW4gc3BlY2lhbCBmb3JtYXQgZm9yIEJGLi4uIGluc25zLgotICAgKyAgYXV0b2luY3JlbWVudCBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cyAobnVtYmVyIG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVyKS4KLSAgIC0gIGF1dG9kZWNyZW1lbnQgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMgKG51bWJlciBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcikuCi0gICBRICBxdWljayBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyAzIGJpdHMuCi0gICAgICBUaGlzIG1hdGNoZXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQgb25seSB3aGVuIHZhbHVlIGlzIGluIHJhbmdlIDEgLi4gOC4KLSAgIE0gIG1vdmVxIGltbWVkaWF0ZSBkYXRhLiAgU3RvcmVkIGFzIDggYml0cy4KLSAgICAgIFRoaXMgbWF0Y2hlcyBhbiBpbW1lZGlhdGUgb3BlcmFuZCBvbmx5IHdoZW4gdmFsdWUgaXMgaW4gcmFuZ2UgLTEyOC4uMTI3Ci0gICBUICB0cmFwIHZlY3RvciBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyA0IGJpdHMuCi0KLSAgIGsgIEstZmFjdG9yIGZvciBmbW92ZS5wIGluc3RydWN0aW9uLiAgIFN0b3JlZCBhcyBhIDctYml0IGNvbnN0YW50IG9yCi0gICAgICBhIHRocmVlIGJpdCByZWdpc3RlciBvZmZzZXQsIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZS4KLQotICAgIyAgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgaW4gc3BlY2lhbCBwbGFjZXMgKGIsIHcgb3IgbCkKLSAgICAgIHdoaWNoIHNheSBob3cgbWFueSBiaXRzIHRvIHN0b3JlLgotICAgXiAgaW1tZWRpYXRlIGRhdGEgZm9yIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4gICBTcGVjaWFsIHBsYWNlcwotICAgICAgYXJlIG9mZnNldCBieSAyIGJ5dGVzIGZyb20gJyMnLi4uCi0gICBCICBwYy1yZWxhdGl2ZSBhZGRyZXNzLCBjb252ZXJ0ZWQgdG8gYW4gb2Zmc2V0Ci0gICAgICB0aGF0IGlzIHRyZWF0ZWQgYXMgaW1tZWRpYXRlIGRhdGEuCi0gICBkICBkaXNwbGFjZW1lbnQgYW5kIHJlZ2lzdGVyLiAgU3RvcmVzIHRoZSByZWdpc3RlciBhcyAzIGJpdHMKLSAgICAgIGFuZCBzdG9yZXMgdGhlIGRpc3BsYWNlbWVudCBpbiB0aGUgZW50aXJlIHNlY29uZCB3b3JkLgotCi0gICBDICB0aGUgQ0NSLiAgTm8gbmVlZCB0byBzdG9yZSBpdDsgdGhpcyBpcyBqdXN0IGZvciBmaWx0ZXJpbmcgdmFsaWRpdHkuCi0gICBTICB0aGUgU1IuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotICAgVSAgdGhlIFVTUC4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0gICBFICB0aGUgQUNDLiAgTm8gbmVlZCB0byBzdG9yZSwganVzdCBhcyB3aXRoIENDUi4KLSAgIEcgIHRoZSBNQUNTUi4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0gICBIICB0aGUgTUFTSy4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0KLSAgIEkgIENvcHJvY2Vzc29yIElELiAgIE5vdCBwcmludGVkIGlmIDEuICAgVGhlIENvcHJvY2Vzc29yIElEIGlzIGFsd2F5cwotICAgICAgZXh0cmFjdGVkIGZyb20gdGhlICdkJyBmaWVsZCBvZiB3b3JkIG9uZSwgd2hpY2ggbWVhbnMgdGhhdCBhbiBleHRlbmRlZAotICAgICAgY29wcm9jZXNzb3Igb3Bjb2RlIGNhbiBiZSBza2lwcGVkIHVzaW5nIHRoZSAnaScgcGxhY2UsIGlmIG5lZWRlZC4KLQotICAgcyAgU3lzdGVtIENvbnRyb2wgcmVnaXN0ZXIgZm9yIHRoZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3Nvci4KLQotICAgSiAgTWlzYyByZWdpc3RlciBmb3IgbW92ZWMgaW5zdHJ1Y3Rpb24sIHN0b3JlZCBpbiAnaicgZm9ybWF0LgotCVBvc3NpYmxlIHZhbHVlczoKLQkweDAwMAlTRkMJU291cmNlIEZ1bmN0aW9uIENvZGUgcmVnCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHgwMDEJREZDCURhdGEgRnVuY3Rpb24gQ29kZSByZWcJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHgwMDIJQ0FDUglDYWNoZSBDb250cm9sIFJlZ2lzdGVyCQlbNjAsIDQwLCAzMCwgMjBdCi0JMHgwMDMJVEMJTU1VIFRyYW5zbGF0aW9uIENvbnRyb2wJCVs2MCwgNDBdCi0JMHgwMDQJSVRUMAlJbnN0cnVjdGlvbiBUcmFuc3BhcmVudAotCQkJCVRyYW5zbGF0aW9uIHJlZyAwCVs2MCwgNDBdCi0JMHgwMDUJSVRUMQlJbnN0cnVjdGlvbiBUcmFuc3BhcmVudAotCQkJCVRyYW5zbGF0aW9uIHJlZyAxCVs2MCwgNDBdCi0JMHgwMDYJRFRUMAlEYXRhIFRyYW5zcGFyZW50Ci0JCQkJVHJhbnNsYXRpb24gcmVnIDAJWzYwLCA0MF0KLQkweDAwNwlEVFQxCURhdGEgVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMQlbNjAsIDQwXQotCTB4MDA4CUJVU0NSCUJ1cyBDb250cm9sIFJlZ2lzdGVyCQlbNjBdCi0JMHg4MDAJVVNQCVVzZXIgU3RhY2sgUG9pbnRlcgkJWzYwLCA0MCwgMzAsIDIwLCAxMF0KLQkweDgwMQlWQlIJVmVjdG9yIEJhc2UgcmVnCQkJWzYwLCA0MCwgMzAsIDIwLCAxMF0KLQkweDgwMglDQUFSCUNhY2hlIEFkZHJlc3MgUmVnaXN0ZXIJCVsgICAgICAgIDMwLCAyMF0KLQkweDgwMwlNU1AJTWFzdGVyIFN0YWNrIFBvaW50ZXIJCVsgICAgNDAsIDMwLCAyMF0KLQkweDgwNAlJU1AJSW50ZXJydXB0IFN0YWNrIFBvaW50ZXIJCVsgICAgNDAsIDMwLCAyMF0KLQkweDgwNQlNTVVTUglNTVUgU3RhdHVzIHJlZwkJCVsgICAgNDBdCi0JMHg4MDYJVVJQCVVzZXIgUm9vdCBQb2ludGVyCQlbNjAsIDQwXQotCTB4ODA3CVNSUAlTdXBlcnZpc29yIFJvb3QgUG9pbnRlcgkJWzYwLCA0MF0KLQkweDgwOAlQQ1IJUHJvY2Vzc29yIENvbmZpZ3VyYXRpb24gcmVnCVs2MF0KLQkweEMwMAlST01CQVIJUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlcglbNTIwWF0KLQkweEMwNAlSQU1CQVIwCVJBTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMAlbNTIwWF0KLQkweEMwNQlSQU1CQVIxCVJBTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMAlbNTIwWF0KLQkweEMwRglNQkFSMAlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0KLSAgICBMICBSZWdpc3RlciBsaXN0IG9mIHRoZSB0eXBlIGQwLWQ3L2EwLWE3IGV0Yy4KLSAgICAgICAoTmV3ISAgSW1wcm92ZWQhICBDYW4gYWxzbyBob2xkIGZwMC1mcDcsIGFzIHdlbGwhKQotICAgICAgIFRoZSBhc3NlbWJsZXIgdHJpZXMgdG8gc2VlIGlmIHRoZSByZWdpc3RlcnMgbWF0Y2ggdGhlIGluc24gYnkKLSAgICAgICBsb29raW5nIGF0IHdoZXJlIHRoZSBpbnNuIHdhbnRzIHRoZW0gc3RvcmVkLgotCi0gICAgbCAgUmVnaXN0ZXIgbGlzdCBsaWtlIEwsIGJ1dCB3aXRoIGFsbCB0aGUgYml0cyByZXZlcnNlZC4KLSAgICAgICBVc2VkIGZvciBnb2luZyB0aGUgb3RoZXIgd2F5LiAuIC4KLQotICAgIGMgIGNhY2hlIGlkZW50aWZpZXIgd2hpY2ggbWF5IGJlICJuYyIgZm9yIG5vIGNhY2hlLCAiaWMiCi0gICAgICAgZm9yIGluc3RydWN0aW9uIGNhY2hlLCAiZGMiIGZvciBkYXRhIGNhY2hlLCBvciAiYmMiCi0gICAgICAgZm9yIGJvdGggY2FjaGVzLiAgVXNlZCBpbiBjaW52IGFuZCBjcHVzaC4gIEFsd2F5cwotICAgICAgIHN0b3JlZCBpbiBwb3NpdGlvbiAiZCIuCi0KLSAgICB1ICBBbnkgcmVnaXN0ZXIsIHdpdGggYGB1cHBlcicnIG9yIGBgbG93ZXInJyBzcGVjaWZpY2F0aW9uLiAgVXNlZAotICAgICAgIGluIHRoZSBtYWMgaW5zdHJ1Y3Rpb25zIHdpdGggc2l6ZSB3b3JkLgotCi0gVGhlIHJlbWFpbmRlciBhcmUgYWxsIHN0b3JlZCBhcyA2IGJpdHMgdXNpbmcgYW4gYWRkcmVzcyBtb2RlIGFuZCBhCi0gcmVnaXN0ZXIgbnVtYmVyOyB0aGV5IGRpZmZlciBpbiB3aGljaCBhZGRyZXNzaW5nIG1vZGVzIHRoZXkgbWF0Y2guCi0KLSAgICogIGFsbAkJCQkJKG1vZGVzIDAtNiw3LjAtNCkKLSAgIH4gIGFsdGVyYWJsZSBtZW1vcnkJCQkJKG1vZGVzIDItNiw3LjAsNy4xKQotICAgCQkJCQkJKG5vdCAwLDEsNy4yLTQpCi0gICAlICBhbHRlcmFibGUJCQkJCShtb2RlcyAwLTYsNy4wLDcuMSkKLQkJCQkJCShub3QgNy4yLTQpCi0gICA7ICBkYXRhCQkJCQkobW9kZXMgMCwyLTYsNy4wLTQpCi0JCQkJCQkobm90IDEpCi0gICBAICBkYXRhLCBidXQgbm90IGltbWVkaWF0ZQkJCShtb2RlcyAwLDItNiw3LjAtMykKLQkJCQkJCShub3QgMSw3LjQpCi0gICAhICBjb250cm9sCQkJCQkobW9kZXMgMiw1LDYsNy4wLTMpCi0JCQkJCQkobm90IDAsMSwzLDQsNy40KQotICAgJiAgYWx0ZXJhYmxlIGNvbnRyb2wJCQkJKG1vZGVzIDIsNSw2LDcuMCw3LjEpCi0JCQkJCQkobm90IDAsMSw3LjItNCkKLSAgICQgIGFsdGVyYWJsZSBkYXRhCQkJCShtb2RlcyAwLDItNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAxLDcuMi00KQotICAgPyAgYWx0ZXJhYmxlIGNvbnRyb2wsIG9yIGRhdGEgcmVnaXN0ZXIJKG1vZGVzIDAsMiw1LDYsNy4wLDcuMSkKLQkJCQkJCShub3QgMSwzLDQsNy4yLTQpCi0gICAvICBjb250cm9sLCBvciBkYXRhIHJlZ2lzdGVyCQkJKG1vZGVzIDAsMiw1LDYsNy4wLTMpCi0JCQkJCQkobm90IDEsMyw0LDcuNCkKLSAgID4gICpzYXZlIG9wZXJhbmRzCQkJCShtb2RlcyAyLDQsNSw2LDcuMCw3LjEpCi0JCQkJCQkobm90IDAsMSwzLDcuMi00KQotICAgPCAgKnJlc3RvcmUgb3BlcmFuZHMJCQkJKG1vZGVzIDIsMyw1LDYsNy4wLTMpCi0JCQkJCQkobm90IDAsMSw0LDcuNCkKLQotICAgY29sZGZpcmUgbW92ZSBvcGVyYW5kczoKLSAgIG0gIAkJCQkJCShtb2RlcyAwLTQpCi0gICBuCQkJCQkJKG1vZGVzIDUsNy4yKQotICAgbwkJCQkJCShtb2RlcyA2LDcuMCw3LjEsNy4zLDcuNCkKLSAgIHAJCQkJCQkobW9kZXMgMC01KQotCi0gICBjb2xkZmlyZSBic2V0L2JjbHIvYnRzdC9tdWxzbC9tdWx1bCBvcGVyYW5kczoKLSAgIHEJCQkJCQkobW9kZXMgMCwyLTUpCi0gICB2CQkJCQkJKG1vZGVzIDAsMi01LDcuMCw3LjEpCi0qLwotCi0vKiBGb3IgdGhlIDY4ODUxOiAqLwotLyoKLSAgIEkgZGlkbid0IHVzZSBtdWNoIGltYWdpbmF0aW9uIGluIGNob29zaW5nIHRoZSAKLSAgIGZvbGxvd2luZyBjb2Rlcywgc28gbWFueSBvZiB0aGVtIGFyZW4ndCB2ZXJ5Ci0gICBtbmVtb25pYy4gLXJhYgotCi0gICAwICAzMiBiaXQgcG1tdSByZWdpc3RlcgotCVBvc3NpYmxlIHZhbHVlczoKLQkwMDAJVEMJVHJhbnNsYXRpb24gQ29udHJvbCBSZWdpc3RlciAoNjgwMzAsIDY4ODUxKQotCi0gICAxICAxNiBiaXQgcG1tdSByZWdpc3RlcgotCTExMQlBQwlBY2Nlc3MgQ29udHJvbCAoNjg4NTEpCi0KLSAgIDIgIDggYml0IHBtbXUgcmVnaXN0ZXIKLQkxMDAJQ0FMCUN1cnJlbnQgQWNjZXNzIExldmVsICg2ODg1MSkKLQkxMDEJVkFMCVZhbGlkYXRlIEFjY2VzcyBMZXZlbCAoNjg4NTEpCi0JMTEwCVNDQwlTdGFjayBDaGFuZ2UgQ29udHJvbCAoNjg4NTEpCi0KLSAgIDMgIDY4MDMwLW9ubHkgcG1tdSByZWdpc3RlcnMgKDMyIGJpdCkKLQkwMTAJVFQwCVRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIHJlZyAwCi0JCQkoYWthIEFjY2VzcyBDb250cm9sIHJlZyAwIC0tIEFDMCAtLSBvbiA2OGVjMDMwKQotCTAxMQlUVDEJVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gcmVnIDEKLQkJCShha2EgQWNjZXNzIENvbnRyb2wgcmVnIDEgLS0gQUMxIC0tIG9uIDY4ZWMwMzApCi0KLSAgIFcgIHdpZGUgcG1tdSByZWdpc3RlcnMKLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMDAxCURSUAlEbWEgUm9vdCBQb2ludGVyICg2ODg1MSkKLQkwMTAJU1JQCVN1cGVydmlzb3IgUm9vdCBQb2ludGVyICg2ODAzMCwgNjg4NTEpCi0JMDExCUNSUAlDcHUgUm9vdCBQb2ludGVyICg2ODAzMCwgNjg4NTEpCi0KLSAgIGYJZnVuY3Rpb24gY29kZSByZWdpc3RlciAoNjgwMzAsIDY4ODUxKQotCTAJU0ZDCi0JMQlERkMKLQotICAgVglWQUwgcmVnaXN0ZXIgb25seSAoNjg4NTEpCi0KLSAgIFgJQkFEeCwgQkFDeCAoMTYgYml0KQotCTEwMAlCQUQJQnJlYWtwb2ludCBBY2tub3dsZWRnZSBEYXRhICg2ODg1MSkKLQkxMDEJQkFDCUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgQ29udHJvbCAoNjg4NTEpCi0KLSAgIFkJUFNSICg2ODg1MSkgKE1NVVNSIG9uIDY4MDMwKSAoQUNVU1Igb24gNjhlYzAzMCkKLSAgIFoJUENTUiAoNjg4NTEpCi0KLSAgIHwJbWVtb3J5IAkJKG1vZGVzIDItNiwgNy4qKQotCi0gICB0ICBhZGRyZXNzIHRlc3QgbGV2ZWwgKDY4MDMwIG9ubHkpCi0gICAgICBTdG9yZWQgYXMgMyBiaXRzLCByYW5nZSAwLTcuCi0gICAgICBBbHNvIHVzZWQgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gbm93LgotCi0qLwotCi0vKiBQbGFjZXMgdG8gcHV0IGFuIG9wZXJhbmQsIGZvciBub24tZ2VuZXJhbCBvcGVyYW5kczoKLSAgIENoYXJhY3RlcnMgdXNlZDogQmJDY0RkZ2hpamtMbE1tTm5vc3RXdzEyMzQ1Njc4OQotCi0gICBzICBzb3VyY2UsIGxvdyBiaXRzIG9mIGZpcnN0IHdvcmQuCi0gICBkICBkZXN0LCBzaGlmdGVkIDkgaW4gZmlyc3Qgd29yZAotICAgMSAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgMTIKLSAgIDIgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDYKLSAgIDMgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDAKLSAgIDQgIHRoaXJkIHdvcmQsIHNoaWZ0ZWQgMTIKLSAgIDUgIHRoaXJkIHdvcmQsIHNoaWZ0ZWQgNgotICAgNiAgdGhpcmQgd29yZCwgc2hpZnRlZCAwCi0gICA3ICBzZWNvbmQgd29yZCwgc2hpZnRlZCA3Ci0gICA4ICBzZWNvbmQgd29yZCwgc2hpZnRlZCAxMAotICAgOSAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgNQotICAgRCAgc3RvcmUgaW4gYm90aCBwbGFjZSAxIGFuZCBwbGFjZSAzOyBmb3IgZGl2dWwgYW5kIGRpdnNsLgotICAgQiAgZmlyc3Qgd29yZCwgbG93IGJ5dGUsIGZvciBicmFuY2ggZGlzcGxhY2VtZW50cwotICAgVyAgc2Vjb25kIHdvcmQgKGVudGlyZSksIGZvciBicmFuY2ggZGlzcGxhY2VtZW50cwotICAgTCAgc2Vjb25kIGFuZCB0aGlyZCB3b3JkcyAoZW50aXJlKSwgZm9yIGJyYW5jaCBkaXNwbGFjZW1lbnRzCi0gICAgICAoYWxzbyBvdmVybG9hZGVkIGZvciBtb3ZlMTYpCi0gICBiICBzZWNvbmQgd29yZCwgbG93IGJ5dGUKLSAgIHcgIHNlY29uZCB3b3JkIChlbnRpcmUpIFt2YXJpYWJsZSB3b3JkL2xvbmcgYnJhbmNoIG9mZnNldCBmb3IgZGJyYV0KLSAgIFcgIHNlY29uZCB3b3JkIChlbnRpcmUpIChtdXN0IGJlIHNpZ25lZCAxNiBiaXQgdmFsdWUpCi0gICBsICBzZWNvbmQgYW5kIHRoaXJkIHdvcmQgKGVudGlyZSkKLSAgIGcgIHZhcmlhYmxlIGJyYW5jaCBvZmZzZXQgZm9yIGJyYSBhbmQgc2ltaWxhciBpbnN0cnVjdGlvbnMuCi0gICAgICBUaGUgcGxhY2UgdG8gc3RvcmUgZGVwZW5kcyBvbiB0aGUgbWFnbml0dWRlIG9mIG9mZnNldC4KLSAgIHQgIHN0b3JlIGluIGJvdGggcGxhY2UgNyBhbmQgcGxhY2UgODsgZm9yIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMKLSAgIGMgIGJyYW5jaCBvZmZzZXQgZm9yIGNwQmNjIG9wZXJhdGlvbnMuCi0gICAgICBUaGUgcGxhY2UgdG8gc3RvcmUgaXMgd29yZCB0d28gaWYgYml0IHNpeCBvZiB3b3JkIG9uZSBpcyB6ZXJvLAotICAgICAgYW5kIHdvcmRzIHR3byBhbmQgdGhyZWUgaWYgYml0IHNpeCBvZiB3b3JkIG9uZSBpcyBvbmUuCi0gICBpICBJbmNyZW1lbnQgYnkgdHdvLCB0byBza2lwIG92ZXIgY29wcm9jZXNzb3IgZXh0ZW5kZWQgb3BlcmFuZHMuICAgT25seQotICAgICAgd29ya3Mgd2l0aCB0aGUgJ0knIGZvcm1hdC4KLSAgIGsgIER5bmFtaWMgSy1mYWN0b3IgZmllbGQuICAgQml0cyA2LTQgb2Ygd29yZCAyLCB1c2VkIGFzIGEgcmVnaXN0ZXIgbnVtYmVyLgotICAgICAgQWxzbyB1c2VkIGZvciBkeW5hbWljIGZtb3ZlbSBpbnN0cnVjdGlvbi4KLSAgIEMgIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGNvbnN0YW50IC0gNyBiaXRzLiAgQWxzbyB1c2VkIGZvciBzdGF0aWMKLSAgICAgIEstZmFjdG9ycy4uLgotICAgaiAgTW92ZWMgcmVnaXN0ZXIgIywgc3RvcmVkIGluIDEyIGxvdyBiaXRzIG9mIHNlY29uZCB3b3JkLgotICAgbSAgRm9yIE1bU11BQ3g7IDQgYml0cyBzcGxpdCB3aXRoIE1TQiBzaGlmdGVkIDYgYml0cyBpbiBmaXJzdCB3b3JkCi0gICAgICBhbmQgcmVtYWluaW5nIDMgYml0cyBvZiByZWdpc3RlciBzaGlmdGVkIDkgYml0cyBpbiBmaXJzdCB3b3JkLgotICAgICAgSW5kaWNhdGUgdXBwZXIvbG93ZXIgaW4gMSBiaXQgc2hpZnRlZCA3IGJpdHMgaW4gc2Vjb25kIHdvcmQuCi0gICAgICBVc2Ugd2l0aCBgUicgb3IgYHUnIGZvcm1hdC4KLSAgIG4gIGBtJyB3aXRob3V0aCB1cHBlci9sb3dlciBpbmRpY2F0aW9uLiAoRm9yIE1bU11BQ3g7IDQgYml0cyBzcGxpdAotICAgICAgd2l0aCBNU0Igc2hpZnRlZCA2IGJpdHMgaW4gZmlyc3Qgd29yZCBhbmQgcmVtYWluaW5nIDMgYml0cyBvZgotICAgICAgcmVnaXN0ZXIgc2hpZnRlZCA5IGJpdHMgaW4gZmlyc3Qgd29yZC4gIE5vIHVwcGVyL2xvd2VyCi0gICAgICBpbmRpY2F0aW9uIGlzIGRvbmUuKSAgVXNlIHdpdGggYFInIG9yIGB1JyBmb3JtYXQuCi0gICBvICBGb3IgTVtTXUFDdzsgNCBiaXRzIHNoaWZ0ZWQgMTIgaW4gc2Vjb25kIHdvcmQgKGxpa2UgYDEnKS4KLSAgICAgIEluZGljYXRlIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNyBiaXRzIGluIHNlY29uZCB3b3JkLgotICAgICAgVXNlIHdpdGggYFInIG9yIGB1JyBmb3JtYXQuCi0gICBNICBGb3IgTVtTXUFDdzsgNCBiaXRzIGluIGxvdyBiaXRzIG9mIGZpcnN0IHdvcmQuICBJbmRpY2F0ZQotICAgICAgdXBwZXIvbG93ZXIgaW4gMSBiaXQgc2hpZnRlZCA2IGJpdHMgaW4gc2Vjb25kIHdvcmQuICBVc2Ugd2l0aAotICAgICAgYFInIG9yIGB1JyBmb3JtYXQuCi0gICBOICBGb3IgTVtTXUFDdzsgNCBiaXRzIGluIGxvdyBiaXRzIG9mIHNlY29uZCB3b3JkLiAgSW5kaWNhdGUKLSAgICAgIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNiBiaXRzIGluIHNlY29uZCB3b3JkLiAgVXNlIHdpdGgKLSAgICAgIGBSJyBvciBgdScgZm9ybWF0LgotICAgaCAgc2hpZnQgaW5kaWNhdG9yIChzY2FsZSBmYWN0b3IpLCAxIGJpdCBzaGlmdGVkIDEwIGluIHNlY29uZCB3b3JkCi0KLSBQbGFjZXMgdG8gcHV0IG9wZXJhbmQsIGZvciBnZW5lcmFsIG9wZXJhbmRzOgotICAgZCAgZGVzdGluYXRpb24sIHNoaWZ0ZWQgNiBiaXRzIGluIGZpcnN0IHdvcmQKLSAgIGIgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLCBhbmQgaW1tZWRpYXRlIHVzZXMgb25lIGJ5dGUKLSAgIHcgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLCBhbmQgaW1tZWRpYXRlIHVzZXMgdHdvIGJ5dGVzCi0gICBsICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZCwgYW5kIGltbWVkaWF0ZSB1c2VzIGZvdXIgYnl0ZXMKLSAgIHMgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLgotICAgICAgVXNlZCBzb21ldGltZXMgaW4gY29udGV4dHMgd2hlcmUgaW1tZWRpYXRlIGlzIG5vdCBhbGxvd2VkIGFueXdheS4KLSAgIGYgIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDQgYnl0ZXMKLSAgIEYgIGRvdWJsZSBwcmVjaXNpb24gZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDggYnl0ZXMKLSAgIHggIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgMTIgYnl0ZXMKLSAgIHAgIHBhY2tlZCBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgMTIgYnl0ZXMKLSovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgbTY4a19vcGNvZGVzW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzIG02OGtfb3Bjb2RlX2FsaWFzZXNbXTsKLQotZXh0ZXJuIGNvbnN0IGludCBtNjhrX251bW9wY29kZXMsIG02OGtfbnVtYWxpYXNlczsKLQotLyogZW5kIG9mIG02OGstb3Bjb2RlLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL204OGsuaCBiL2luY2x1ZGUvb3Bjb2RlL204OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZmEwMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9tODhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIG1vdG9yb2xhIDg4ayBmYW1pbHkuCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCIGFuZCBHQVMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKgkJCURpc2Fzc2VtYmxlciBJbnN0cnVjdGlvbiBUYWJsZQotICoKLSAqCVRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgdGFibGUgaXMgdGhlIG9wY29kZSBmaWVsZC4gSWYgYW4gb3Bjb2RlCi0gKglpcyBzcGVjaWZpZWQgd2hpY2ggaGFzIGFueSBub24tb3Bjb2RlIGJpdHMgb24sIGEgc3lzdGVtIGVycm9yCi0gKgl3aWxsIG9jY3VyIHdoZW4gdGhlIHN5c3RlbSBhdHRlbXB0cyB0aGUgaW5zdGFsbCBpdCBpbnRvIHRoZQotICoJaW5zdHJ1Y3Rpb24gdGFibGUuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlCi0gKglpbnN0cnVjdGlvbiBtbmVtb25pYy4gRWFjaCBvcGVyYW5kIGlzIHNwZWNpZmllZCBieSBvZmZzZXQsIHdpZHRoLAotICoJYW5kIHR5cGUuIFRoZSBvZmZzZXQgaXMgdGhlIGJpdCBudW1iZXIgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50Ci0gKgliaXQgb2YgdGhlIG9wZXJhbmQgd2l0aCBiaXQgMCBiZWluZyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mCi0gKgl0aGUgaW5zdHJ1Y3Rpb24uIFRoZSB3aWR0aCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBzcGVjaWZ5Ci0gKgl0aGUgb3BlcmFuZC4gVGhlIHR5cGUgc3BlY2lmaWVzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgZm9yCi0gKgl0aGUgb3BlcmFuZC4gVGhlIHZhbGlkIGZvcm1hdHMgYXJlOiByZWdpc3RlciwgcmVnaXN0ZXIgaW5kaXJlY3QsCi0gKgloZXggY29uc3RhbnQsIGFuZCBiaXQgZmllbGQgc3BlY2lmaWNhdGlvbi4gIFRoZSBsYXN0IGZpZWxkIGlzIGEKLSAqCXBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGxpbmtlZCBsaXN0LiAgVGhlc2UgcG9pbnRlcnMKLSAqCWFyZSBpbml0aWFsaXplZCBieSBpbml0X2Rpc2FzbSgpLgotICoKLSAqCQkJCVN0cnVjdHVyZSBGb3JtYXQKLSAqCi0gKiAgICAgICBzdHJ1Y3QgSU5TVEFCIHsKLSAqICAgICAgICAgIFVQSU5UIG9wY29kZTsKLSAqICAgICAgICAgIGNoYXIgKm1uZW1vbmljOwotICogICAgICAgICAgc3RydWN0IE9QU1BFQyBvcDEsb3AyLG9wMzsKLSAqICAgICAgICAgIHN0cnVjdCBTSU1fRkxBR1MgZmxnczsKLSAqICAgICAgICAgIHN0cnVjdCBJTlNUQUIgKm5leHQ7Ci0gKiAgICAgICB9Ci0gKgotICogICAgICAgc3RydWN0IE9QU1BFQyB7Ci0gKiAgICAgICAgICBVUElOVCBvZmZzZXQ6NTsKLSAqICAgICAgICAgIFVQSU5UIHdpZHRoOjY7Ci0gKiAgICAgICAgICBVUElOVCB0eXBlOjU7Ci0gKiAgICAgICB9Ci0gKgotICoJCQkJUmV2aXNpb24gSGlzdG9yeQotICoKLSAqCVJldmlzaW9uIDEuMAkxMS8wOC84NQlDcmVhdGlvbiBkYXRlCi0gKgkJIDEuMQkwMi8wNS84NglVcGRhdGVkIGluc3RydWN0aW9uIG1uZW1vbmljIHRhYmxlIE1ECi0gKgkJIDEuMgkwNi8xNi84NglVcGRhdGVkIFNJTV9GTEFHUyBmb3IgZmxvYXRpbmcgcG9pbnQKLSAqCQkgMS4zCTA5LzIwLzg2CVVwZGF0ZWQgZm9yIG5ldyBlbmNvZGluZwotICoJCSAJMDUvMTEvODkJUi4gVHJhd2ljayBhZGFwdGVkIGZyb20gTW90b3JvbGEgZGlzYXNzZW1ibGVyCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLQotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIG5lZWRlZCB0byBidWlsZCB0aGUgTTg4MDAwCi0gKiBzaW11bGF0b3IuICBJdCBpcyB0aGUgbWFpbiBpbmNsdWRlIGZpbGUsIGNvbnRhaW5pbmcgYWxsIHRoZQotICogc3RydWN0dXJlcywgbWFjcm9zIGFuZCBkZWZpbml0aW9ucyBleGNlcHQgZm9yIHRoZSBmbG9hdGluZyBwb2ludAotICogaW5zdHJ1Y3Rpb24gc2V0LgotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGZsYWcgaW5mb3JtcyB0aGUgU2ltdWxhdG9yIGFzIHRvIHdoYXQgdHlwZSBvZiBieXRlIG9yZGVyaW5nCi0gKiB3aWxsIGJlIHVzZWQuIEZvciBpbnN0YW5jZSwgYSBCT0ZMQUcgPSAxIGluZGljYXRlcyBhIERFQyBWQVggYW5kIElCTSB0eXBlCi0gKiBvZiBvcmRlcmluZyBzaGFsbCBiZSB1c2VkLgotKi8KLQotLyogIyBkZWZpbmUgICAgIEJPRkxBRyAgIDEgKi8gICAgICAgICAgICAgICAgICAgICAgIC8qIEJZVEUgT1JERVJJTkcgRkxBRyAqLwotCi0vKiBkZWZpbmUgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBwcmltYXJ5IG9wY29kZSBmaWVsZCBvZiB0aGUgaW5zdHJ1Y3Rpb24sCi0gKiB0aGUgZGVzdGluYXRpb24gZmllbGQsIHRoZSBzb3VyY2UgMSBhbmQgc291cmNlIDIgZmllbGRzLgotICovCi0jIGRlZmluZSAgICBPUCAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBvcGNvZGUgZmllbGQgKi8KLSMgZGVmaW5lICAgIERFU1QgICAgIDYgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGRlc3RpbmF0aW9uICAqLwotIyBkZWZpbmUgICAgU09VUkNFMSAgNiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc291cmNlMSAgICAgICovCi0jIGRlZmluZSAgICBTT1VSQ0UyICA2ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBzb3VyY2UyICAgICAgKi8KLQotIyBkZWZpbmUgICAgUkVHcyAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWdpc3RlcnMgICovCi0KLSMgZGVmaW5lICAgIFdPUkQgICAgbG9uZwotIyBkZWZpbmUgICAgRkxBRyAgICB1bnNpZ25lZAotIyBkZWZpbmUgICAgU1RBVEUgICBzaG9ydAotCi0jIGRlZmluZSAgICBUUlVFICAgICAxCi0jIGRlZmluZSAgICBGQUxTRSAgICAwCi0KLSMgZGVmaW5lICAgIFJFQUQgICAgIDAKLSMgZGVmaW5lICAgIFdSSVRFICAgIDEKLQotLyogVGhlIG5leHQgZm91ciBlcXVhdGVzIGRlZmluZSB0aGUgcHJpb3JpdGllcyB0aGF0IHRoZSB2YXJpb3VzIGNsYXNzZXMKLSAqIG9mIGluc3RydWN0aW9ucyBoYXZlIHJlZ2FyZGluZyB3cml0aW5nIHJlc3VsdHMgYmFjayBpbnRvIHJlZ2lzdGVycyBhbmQKLSAqIHNpZ25hbGxpbmcgZXhjZXB0aW9ucy4KLSAqLwotLyogUE1FTSBpcyBhbHNvIGRlZmluZWQgaW4gPHN5cy9wYXJhbS5oPiBvbiBEZWx0YSA4OCdzLiAgU2lnaCEgICovCi0jdW5kZWYgUE1FTQotCi0jIGRlZmluZSAgICBQSU5UICAwICAgLyogSW50ZWdlciBQcmlvcml0eSAqLwotIyBkZWZpbmUgICAgUEZMVCAgMSAgIC8qIEZsb2F0aW5nIFBvaW50IFByaW9yaXR5ICovCi0jIGRlZmluZSAgICBQTUVNICAyICAgLyogTWVtb3J5IFByaW9yaXR5ICovCi0jIGRlZmluZSAgICBOQSAgICAzICAgLyogTm90IEFwcGxpY2FibGUsIGluc3RydWN0aW9uIGRvZXNudCB3cml0ZSB0byByZWdzICovCi0jIGRlZmluZSAgICBISVBSSSAzICAgLyogaGlnaGVzdCBvZiB0aGVzZSBwcmlvcml0aWVzICovCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiByZWdpc3RlcnMgYXJlIGFuIGFydGlmaWNpYWwgbWVjaGFuaXNtIHRvIHNwZWVkIHVwCi0gKiBzaW11bGF0b3IgZXhlY3V0aW9uLiAgSW4gdGhlIHJlYWwgcHJvY2Vzc29yLCBhbiBpbnN0cnVjdGlvbiByZWdpc3RlcgotICogaXMgMzIgYml0cyB3aWRlLiAgSW4gdGhlIHNpbXVsYXRvciwgdGhlIDMyIGJpdCBpbnN0cnVjdGlvbiBpcyBrZXB0IGluCi0gKiBhIHN0cnVjdHVyZSBmaWVsZCBjYWxsZWQgcmF3b3AsIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gaXMgcGFydGlhbGx5IGRlY29kZWQsCi0gKiBhbmQgc3BsaXQgaW50byB2YXJpb3VzIGZpZWxkcyBhbmQgZmxhZ3Mgd2hpY2ggbWFrZSB1cCB0aGUgb3RoZXIgZmllbGRzCi0gKiBvZiB0aGUgc3RydWN0dXJlLgotICogVGhlIHBhcnRpYWwgZGVjb2RlIGlzIGRvbmUgd2hlbiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBpbml0aWFsbHkgbG9hZGVkCi0gKiBpbnRvIHNpbXVsYXRvciBtZW1vcnkuICBUaGUgc2ltdWxhdG9yIGNvZGUgbWVtb3J5IGlzIG5vdCBhbiBhcnJheSBvZgotICogMzIgYml0IHdvcmRzLCBidXQgaXMgYW4gYXJyYXkgb2YgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIgc3RydWN0dXJlcy4KLSAqIFllcyB0aGlzIHdhc3RlcyBtZW1vcnksIGJ1dCBpdCBleGVjdXRlcyBtdWNoIHF1aWNrZXIuCi0gKi8KLQotc3RydWN0IElSX0ZJRUxEUyB7Ci0JCSAgICB1bnNpZ25lZCAgICAgICAgb3A6T1AsCi0JCQkJICAgIGRlc3Q6IERFU1QsCi0JCQkJICAgIHNyYzE6IFNPVVJDRTEsCi0JCQkJICAgIHNyYzI6IFNPVVJDRTI7Ci0JCQkgICAgICBpbnQgICBsdG5jeSwKLQkJCQkgICAgZXh0aW1lLAotCQkJCSAgICB3Yl9wcmk7ICAgICAvKiB3cml0ZWJhY2sgcHJpb3JpdHkgICAgICovCi0JCSAgICB1bnNpZ25lZCAgICAgICAgaW1tX2ZsYWdzOjIsLyogaW1tZWRpYXRlIHNpemUgICAgICAgICAqLwotCQkJCSAgICByczFfdXNlZDoxLCAvKiByZWdpc3RlciBzb3VyY2UgMSB1c2VkICovCi0JCQkJICAgIHJzMl91c2VkOjEsIC8qIHJlZ2lzdGVyIHNvdXJjZSAyIHVzZWQgKi8KLQkJCQkgICAgcnNkX3VzZWQ6MSwgLyogcmVnaXN0ZXIgc291cmNlL2Rlc3QuIHVzZWQgKi8KLQkJCQkgICAgY19mbGFnOjEsICAgLyogY29tcGxlbWVudCAgICAgICovCi0JCQkJICAgIHVfZmxhZzoxLCAgIC8qIHVwcGVyIGhhbGYgd29yZCAqLwotCQkJCSAgICBuX2ZsYWc6MSwgICAvKiBleGVjdXRlIG5leHQgICAgKi8KLQkJCQkgICAgd2JfZmxhZzoxLCAgLyogdXNlcyB3cml0ZWJhY2sgc2xvdCAqLwotCQkJCSAgICBkZXN0XzY0OjEsICAvKiBkZXN0IHNpemUgICAgICAgKi8KLQkJCQkgICAgczFfNjQ6MSwgICAgLyogc291cmNlIDEgc2l6ZSAgICovCi0JCQkJICAgIHMyXzY0OjEsICAgIC8qIHNvdXJjZSAyIHNpemUgICAqLwotCQkJCSAgICBzY2FsZV9mbGFnOjEsIC8qIHNjYWxlZCByZWdpc3RlciAqLwotCQkJCSAgICBicmtfZmxnOjE7Ci0gICAgICAgICAgICAgICAgIH07Ci0KLXN0cnVjdAltZW1fc2VncyB7Ci0Jc3RydWN0IG1lbV93cmQgKnNlZzsJCQkvKiBwb2ludGVyIChyZXR1cm5lZCBieSBjYWxsb2MpIHRvIHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBsb25nIGJhc2VhZGRyOwkJCS8qIGJhc2UgbG9hZCBhZGRyZXNzIGZyb20gZmlsZSBoZWFkZXJzICovCi0JdW5zaWduZWQgbG9uZyBlbmRhZGRyOwkJCS8qIEVuZGluZyBhZGRyZXNzIG9mIHNlZ21lbnQgKi8KLQlpbnQJICAgICAgZmxhZ3M7CQkJLyogc2VnbWVudCBjb250cm9sIGZsYWdzIChub25lIGRlZmluZWQgMTIvNS84NikgKi8KLX07Ci0KLSNkZWZpbmUJTUFYU0VHUwkJKDEwKQkJCS8qIG1heCBudW1iZXIgb2Ygc2VnbWVudCBhbGxvd2VkICovCi0jZGVmaW5lCU1FTVNFR1NJWkUJKHNpemVvZihzdHJ1Y3QgbWVtX3NlZ3MpKS8qIHNpemUgb2YgbWVtX3NlZ3Mgc3RydWN0dXJlICovCi0KLQotI2RlZmluZSBCUktfUkQJCSgweDAxKQkJCS8qIGJyZWFrIG9uIG1lbW9yeSByZWFkICovCi0jZGVmaW5lIEJSS19XUgkJKDB4MDIpCQkJLyogYnJlYWsgb24gbWVtb3J5IHdyaXRlICovCi0jZGVmaW5lIEJSS19FWEVDCSgweDA0KQkJCS8qIGJyZWFrIG9uIGV4ZWN1dGlvbiAqLwotI2RlZmluZQlCUktfQ05UCQkoMHgwOCkJCQkvKiBicmVhayBvbiB0ZXJtaW5hbCBjb3VudCAqLwotCi0KLXN0cnVjdAltZW1fd3JkIHsKLQlzdHJ1Y3QgSVJfRklFTERTIG9wY29kZTsJCS8qIHNpbXVsYXRvciBpbnN0cnVjdGlvbiBicmVhayBkb3duICovCi0JdW5pb24gewotCQl1bnNpZ25lZCBsb25nICBsOwkJLyogbWVtb3J5IGVsZW1lbnQgYnJlYWsgZG93biAqLwotCQl1bnNpZ25lZCBzaG9ydCBzWzJdOwotCQl1bnNpZ25lZCBjaGFyICBjWzRdOwotCX0gbWVtOwotfTsKLQotI2RlZmluZQlNRU1XUkRTSVpFCShzaXplb2Yoc3RydWN0IG1lbV93cmQpKQkvKiBzaXplIG9mIGVhY2ggMzIgYml0IG1lbW9yeSBtb2RlbCAqLwotCi0vKiBFeHRlcm5hbCBkZWNsYXJhdGlvbnMgKi8KLQotZXh0ZXJuCXN0cnVjdCBtZW1fc2VncyBtZW1vcnlbXTsKLWV4dGVybglzdHJ1Y3QgUFJPQ0VTU09SIG03ODAwMDsKLQotc3RydWN0ICBQUk9DRVNTT1IgICB7Ci0JICAgICB1bnNpZ25lZCBXT1JECi0JCQkgICAgaXAsICAgICAgICAgIC8qIGV4ZWN1dGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLwotCQkJICAgIHZiciwgICAgICAgICAvKiB2ZWN0b3IgYmFzZSByZWdpc3RlciAqLwotCQkJICAgIHBzcjsgICAgICAgICAvKiBwcm9jZXNzb3Igc3RhdHVzIHJlZ2lzdGVyICovCi0KLQkJICAgIFdPUkQgICAgUzFidXMsIC8qIHNvdXJjZSAxICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUzJidXMsIC8qIHNvdXJjZSAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGJ1cywgIC8qIGRlc3RpbmF0aW9uICovCi0JCQkgICAgREFidXMsIC8qIGRhdGEgYWRkcmVzcyBidXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFUsCi0JCQkgICAgUmVnc1tSRUdzXSwgICAgICAgLyogZGF0YSByZWdpc3RlcnMgKi8KLQkJCSAgICB0aW1lX2xlZnRbUkVHc10sICAvKiBtYXggY2xvY2tzIGJlZm9yZSByZWcgaXMgYXZhaWxhYmxlICovCi0JCQkgICAgd2JfcHJpW1JFR3NdLCAgICAgLyogd3JpdGViYWNrIHByaW9yaXR5IG9mIHJlZyAqLwotCQkJICAgIFNGVTBfcmVnc1tSRUdzXSwgIC8qIGludGVnZXIgdW5pdCBjb250cm9sIHJlZ3MgKi8KLQkJCSAgICBTRlUxX3JlZ3NbUkVHc10sICAvKiBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ3MgKi8KLQkJCSAgICBTY29yZWJvYXJkW1JFR3NdLAotCQkJICAgIFZicjsKLQkgICAgdW5zaWduZWQgV09SRCAgIHNjb3JlYm9hcmQsCi0JCQkgICAgUHN3LAotCQkJICAgIFRwc3c7Ci0JCSAgICBGTEFHICAganVtcF9wZW5kaW5nOjE7ICAgLyogd2FpdGluZyBmb3IgYSBqdW1wIGluc3RyLiAqLwotICAgICAgICAgICAgICAgICAgICB9OwotCi0jIGRlZmluZSAgICBpMjZiaXQgICAgICAxICAgIC8qIHNpemUgb2YgaW1tZWRpYXRlIGZpZWxkICovCi0jIGRlZmluZSAgICBpMTZiaXQgICAgICAyCi0jIGRlZmluZSAgICBpMTBiaXQgICAgICAzCi0KLS8qIERlZmluaXRpb25zIGZvciBmaWVsZHMgaW4gcHNyICovCi0KLSMgZGVmaW5lIG1vZGUgIDMxCi0jIGRlZmluZSByYm8gICAzMAotIyBkZWZpbmUgc2VyICAgMjkKLSMgZGVmaW5lIGNhcnJ5IDI4Ci0jIGRlZmluZSBzZjdtICAxMQotIyBkZWZpbmUgc2Y2bSAgMTAKLSMgZGVmaW5lIHNmNW0gICA5Ci0jIGRlZmluZSBzZjRtICAgOAotIyBkZWZpbmUgc2YzbSAgIDcKLSMgZGVmaW5lIHNmMm0gICA2Ci0jIGRlZmluZSBzZjFtICAgNQotIyBkZWZpbmUgbWFtICAgIDQKLSMgZGVmaW5lIGlubSAgICAzCi0jIGRlZmluZSBleG0gICAgMgotIyBkZWZpbmUgdHJtICAgIDEKLSMgZGVmaW5lIG92Zm0gICAwCi0KLSNkZWZpbmUJICAgIE1PREVNQVNLICAgKDE8PChtb2RlLTEpKQotIyBkZWZpbmUgICAgU0lMRU5UICAgICAwICAgLyogc2ltdWxhdGUgd2l0aG91dCBvdXRwdXQgdG8gY3J0ICovCi0jIGRlZmluZSAgICBWRVJCT1NFICAgIDEgICAvKiBzaW11bGF0ZSBpbiB2ZXJib3NlIG1vZGUgKi8KLSMgZGVmaW5lICAgIFBSX0lOU1RSICAgMiAgIC8qIG9ubHkgcHJpbnQgaW5zdHJ1Y3Rpb25zICovCi0KLSMgZGVmaW5lICAgIFJFU0VUICAgICAgMTYgLyogcmVzZXQgcGhhc2UgKi8KLQotIyBkZWZpbmUgICAgUEhBU0UxICAgICAwICAvKiBkYXRhIHBhdGggcGhhc2VzICovCi0jIGRlZmluZSAgICBQSEFTRTIgICAgIDEKLQotLyogdGhlIDEgY2xvY2sgb3BlcmF0aW9ucyAqLwotCi0jIGRlZmluZSAgICBBRERVICAgICAgICAxCi0jIGRlZmluZSAgICBBRERDICAgICAgICAyCi0jIGRlZmluZSAgICBBRERVQyAgICAgICAzCi0jIGRlZmluZSAgICBBREQgICAgICAgICA0Ci0KLSMgZGVmaW5lICAgIFNVQlUgICAgQUREKzEKLSMgZGVmaW5lICAgIFNVQkIgICAgQUREKzIKLSMgZGVmaW5lICAgIFNVQlVCICAgQUREKzMKLSMgZGVmaW5lICAgIFNVQiAgICAgQUREKzQKLQotIyBkZWZpbmUgICAgQU5EXyAgICBBREQrNQotIyBkZWZpbmUgICAgT1IgICAgICBBREQrNgotIyBkZWZpbmUgICAgWE9SICAgICBBREQrNwotIyBkZWZpbmUgICAgQ01QICAgICBBREQrOAotCi0vKiB0aGUgTE9BRFMgKi8KLQotIyBkZWZpbmUgICAgTERBQiAgICBDTVArMQotIyBkZWZpbmUgICAgTERBSCAgICBDTVArMgotIyBkZWZpbmUgICAgTERBICAgICBDTVArMwotIyBkZWZpbmUgICAgTERBRCAgICBDTVArNAotCi0jIGRlZmluZSAgICBMREIgICBMREFEKzEKLSMgZGVmaW5lICAgIExESCAgIExEQUQrMgotIyBkZWZpbmUgICAgTEQgICAgTERBRCszCi0jIGRlZmluZSAgICBMREQgICBMREFEKzQKLSMgZGVmaW5lICAgIExEQlUgIExEQUQrNQotIyBkZWZpbmUgICAgTERIVSAgTERBRCs2Ci0KLS8qIHRoZSBTVE9SRVMgKi8KLQotIyBkZWZpbmUgICAgU1RCICAgIExESFUrMQotIyBkZWZpbmUgICAgU1RIICAgIExESFUrMgotIyBkZWZpbmUgICAgU1QgICAgIExESFUrMwotIyBkZWZpbmUgICAgU1REICAgIExESFUrNAotCi0vKiB0aGUgZXhjaGFuZ2UgKi8KLQotIyBkZWZpbmUgICAgWE1FTUJVIExESFUrNQotIyBkZWZpbmUgICAgWE1FTSAgIExESFUrNgotCi0vKiB0aGUgYnJhbmNoZXMgKi8KLSMgZGVmaW5lICAgIEpTUiAgICBTVEQrMQotIyBkZWZpbmUgICAgQlNSICAgIFNURCsyCi0jIGRlZmluZSAgICBCUiAgICAgU1REKzMKLSMgZGVmaW5lICAgIEpNUCAgICBTVEQrNAotIyBkZWZpbmUgICAgQkIxICAgIFNURCs1Ci0jIGRlZmluZSAgICBCQjAgICAgU1REKzYKLSMgZGVmaW5lICAgIFJUTiAgICBTVEQrNwotIyBkZWZpbmUgICAgQkNORCAgIFNURCs4Ci0KLS8qIHRoZSBUUkFQUyAqLwotIyBkZWZpbmUgICAgVEIxICAgIEJDTkQrMQotIyBkZWZpbmUgICAgVEIwICAgIEJDTkQrMgotIyBkZWZpbmUgICAgVENORCAgIEJDTkQrMwotIyBkZWZpbmUgICAgUlRFICAgIEJDTkQrNAotIyBkZWZpbmUgICAgVEJORCAgIEJDTkQrNQotCi0vKiB0aGUgTUlTQyBpbnN0cnVjdGlvbnMgKi8KLSMgZGVmaW5lICAgIE1VTCAgICAgVEJORCArIDEKLSMgZGVmaW5lICAgIERJViAgICAgTVVMICArMgotIyBkZWZpbmUgICAgRElWVSAgICBNVUwgICszCi0jIGRlZmluZSAgICBNQVNLICAgIE1VTCAgKzQKLSMgZGVmaW5lICAgIEZGMCAgICAgTVVMICArNQotIyBkZWZpbmUgICAgRkYxICAgICBNVUwgICs2Ci0jIGRlZmluZSAgICBDTFIgICAgIE1VTCAgKzcKLSMgZGVmaW5lICAgIFNFVCAgICAgTVVMICArOAotIyBkZWZpbmUgICAgRVhUICAgICBNVUwgICs5Ci0jIGRlZmluZSAgICBFWFRVICAgIE1VTCAgKzEwCi0jIGRlZmluZSAgICBNQUsgICAgIE1VTCAgKzExCi0jIGRlZmluZSAgICBST1QgICAgIE1VTCAgKzEyCi0KLS8qIGNvbnRyb2wgcmVnaXN0ZXIgbWFuaXB1bGF0aW9ucyAqLwotCi0jIGRlZmluZSAgICBMRENSICAgIFJPVCAgKzEKLSMgZGVmaW5lICAgIFNUQ1IgICAgUk9UICArMgotIyBkZWZpbmUgICAgWENSICAgICBST1QgICszCi0KLSMgZGVmaW5lICAgIEZMRENSICAgIFJPVCAgKzQKLSMgZGVmaW5lICAgIEZTVENSICAgIFJPVCAgKzUKLSMgZGVmaW5lICAgIEZYQ1IgICAgIFJPVCAgKzYKLQotCi0jIGRlZmluZSAgICBOT1AgICAgIFhDUiArMQotCi0vKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgRkFERCAgICBOT1AgKzEKLSMgZGVmaW5lICAgIEZTVUIgICAgTk9QICsyCi0jIGRlZmluZSAgICBGTVVMICAgIE5PUCArMwotIyBkZWZpbmUgICAgRkRJViAgICBOT1AgKzQKLSMgZGVmaW5lICAgIEZTUVJUICAgTk9QICs1Ci0jIGRlZmluZSAgICBGQ01QICAgIE5PUCArNgotIyBkZWZpbmUgICAgRklQICAgICBOT1AgKzcKLSMgZGVmaW5lICAgIEZMVCAgICAgTk9QICs4Ci0jIGRlZmluZSAgICBJTlQgICAgIE5PUCArOQotIyBkZWZpbmUgICAgTklOVCAgICBOT1AgKzEwCi0jIGRlZmluZSAgICBUUk5DICAgIE5PUCArMTEKLSMgZGVmaW5lICAgIEZMREMgICBOT1AgKzEyCi0jIGRlZmluZSAgICBGU1RDICAgTk9QICsxMwotIyBkZWZpbmUgICAgRlhDICAgIE5PUCArMTQKLQotIyBkZWZpbmUgVUVYVChzcmMsb2ZmLHdpZCkgKCgoKHVuc2lnbmVkIGludCkoc3JjKSk+PihvZmYpKSAmICgoMTw8KHdpZCkpIC0gMSkpCi0jIGRlZmluZSBTRVhUKHNyYyxvZmYsd2lkKSAoKCgoKGludCkoc3JjKSk8PCgzMi0oKG9mZikrKHdpZCkpKSkgPj4oMzItKHdpZCkpKSApCi0jIGRlZmluZSBNQUtFKHNyYyxvZmYsd2lkKSBcCi0gICgoKCh1bnNpZ25lZCBpbnQpKHNyYykpICYgKCgxPDwod2lkKSkgLSAxKSkgPDwgKG9mZikpCi0KLSMgZGVmaW5lIG9wd29yZChuKSAodW5zaWduZWQgbG9uZykgKG1lbWFkZHItPm1lbS5sKQotCi0vKiAgQ29uc3RhbnRzIGFuZCBNYXNrcyAqLwotCi0jZGVmaW5lIFNGVTAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBTRlUxICAgICAgIDB4ODQwMDAwMDAKLSNkZWZpbmUgU0ZVNyAgICAgICAweDljMDAwMDAwCi0jZGVmaW5lIFJSSTEwICAgICAgMHhmMDAwMDAwMAotI2RlZmluZSBSUlIgICAgICAgIDB4ZjQwMDAwMDAKLSNkZWZpbmUgU0ZVTUFTSyAgICAweGZjMDBmZmUwCi0jZGVmaW5lIFJSUk1BU0sgICAgMHhmYzAwZmZlMAotI2RlZmluZSBSUkkxME1BU0sgIDB4ZmMwMGZjMDAKLSNkZWZpbmUgREVGTUFTSyAgICAweGZjMDAwMDAwCi0jZGVmaW5lIENUUkwgICAgICAgMHgwMDAwZjAwMAotI2RlZmluZSBDVFJMTUFTSyAgIDB4ZmMwMGY4MDAKLQotLyogT3BlcmFuZHMgdHlwZXMgKi8KLQotZW51bSBvcGVyYW5kX3R5cGUgewotICBIRVggPSAxLAotICBSRUcgPSAyLAotICBDT05UID0gMywKLSAgSU5EID0gMywKLSAgQkYgPSA0LAotICBSRUdTQyA9IDUgICAgLyogc2NhbGVkIHJlZ2lzdGVyICovLAotICBDUlJFRyA9IDYgICAgLyogY29udHJvbCByZWdpc3RlciAqLywKLSAgRkNSUkVHID0gNyAgICAvKiBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyICovLAotICBQQ1JFTCA9IDgsCi0gIENPTkRNQVNLID0gOSwKLSAgWFJFRyA9IDEwLCAvKiBleHRlbmRlZCByZWdpc3RlciAqLwotICBERUMgPSAxMSwgLyogZGVjaW1hbCAqLwotfTsKLQotLyogSGFzaGluZyBTcGVjaWZpY2F0aW9uICovCi0KLSNkZWZpbmUgSEFTSFZBTCAgICAgNzkKLQotLyogVHlwZSBkZWZpbml0aW9ucyAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UOwotCi0vKiBTdHJ1Y3R1cmUgdGVtcGxhdGVzICovCi0KLSNpZiBuZXZlcgotdHlwZWRlZiBzdHJ1Y3QgewotICAgdW5zaWduZWQgaW50IG9mZnNldDo1OwotICAgdW5zaWduZWQgaW50IHdpZHRoOjY7Ci0gICB1bnNpZ25lZCBpbnQgdHlwZTo1OwotfSBPUFNQRUM7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgIHVuc2lnbmVkIGludCB3aWR0aDsKLSAgIGVudW0gb3BlcmFuZF90eXBlIHR5cGU7Ci19IE9QU1BFQzsKLQotCXN0cnVjdCBTSU1fRkxBR1MgewotCSAgICAgIGludCAgbHRuY3ksICAgLyogbGF0ZW5jeSAobWF4IG51bWJlciBvZiBjbG9ja3MgbmVlZGVkIHRvIGV4ZWN1dGUpICovCi0JCSAgZXh0aW1lLCAgIC8qIGV4ZWN1dGlvbiB0aW1lIChtaW4gbnVtYmVyIG9mIGNsb2NrcyBuZWVkZWQgdG8gZXhlY3V0ZSkgKi8KLQkJICB3Yl9wcmk7ICAgLyogd3JpdGViYWNrIHNsb3QgcHJpb3JpdHkgKi8KLSAgIHVuc2lnbmVkICAgICAgICAgb3A6T1AsICAgLyogc2ltdWxhdG9yIHZlcnNpb24gb2Ygb3Bjb2RlICovCi0JICAgICBpbW1fZmxhZ3M6MiwgICAvKiAxMCwxNiBvciAyNiBiaXQgaW1tZWRpYXRlIGZsYWdzICovCi0JICAgICAgcnMxX3VzZWQ6MSwgICAvKiByZWdpc3RlciBzb3VyY2UgMSB1c2VkICovCi0JICAgICAgcnMyX3VzZWQ6MSwgICAvKiByZWdpc3RlciBzb3VyY2UgMiB1c2VkICovCi0JICAgICAgcnNkX3VzZWQ6MSwgICAvKiByZWdpc3RlciBzb3VyY2UvZGVzdCB1c2VkICovCi0JCWNfZmxhZzoxLCAgIC8qIGNvbXBsZW1lbnQgKi8KLQkJdV9mbGFnOjEsICAgLyogdXBwZXIgaGFsZiB3b3JkICovCi0JCW5fZmxhZzoxLCAgIC8qIGV4ZWN1dGUgbmV4dCAqLwotCSAgICAgICB3Yl9mbGFnOjEsICAgLyogdXNlcyB3cml0ZWJhY2sgc2xvdCAqLwotCSAgICAgICBkZXN0XzY0OjEsICAgLyogZG91YmxlIHByZWNpc2lvbiBkZXN0ICovCi0JCSBzMV82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gc291cmNlIDEgKi8KLQkJIHMyXzY0OjEsICAgLyogZG91YmxlIHByZWNpc2lvbiBzb3VyY2UgMiAqLwotCSAgICBzY2FsZV9mbGFnOjE7ICAgLyogcmVnaXN0ZXIgaXMgc2NhbGVkICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBJTlNUUlVDVEFCIHsKLSAgIHVuc2lnbmVkIGludCAgb3Bjb2RlOwotICAgY2hhciAgICAgICAgICAqbW5lbW9uaWM7Ci0gICBPUFNQRUMgICAgICAgIG9wMSxvcDIsb3AzOwotICAgc3RydWN0IFNJTV9GTEFHUyBmbGdzOwotICAgc3RydWN0IElOU1RSVUNUQUIgICAgKm5leHQ7Ci19IElOU1RBQjsKLQwKLQotI2RlZmluZSBOT19PUEVSQU5EIHswLDAsMH0KLQotLyogT3Bjb2RlICAgICBNbmVtb25pYyAgICAgICBPcCAxIFNwZWMgICAgIE9wIDIgU3BlYyAgICBPcCAzIFNwZWMgICAgICAgICBTaW1mbGFncyAgICAgICAgICAgICBOZXh0ICAqLwotCi1zdGF0aWMgSU5TVEFCICBpbnN0cnVjdGlvbnNbXSA9IHsKLSAgezB4ZjQwMGM4MDAsImpzciAgICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxKU1IgLCAgICAgICAgICAwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGNjMDAsImpzci5uICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxKU1IgLCAgICAgICAgICAwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGMwMDAsImptcCAgICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxKTVAgLCAgICAgICAgICAwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGM0MDAsImptcC5uICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxKTVAgLCAgICAgICAgICAwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4YzgwMDAwMDAsImJzciAgICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxCU1IgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4Y2MwMDAwMDAsImJzci5uICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxCU1IgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4YzAwMDAwMDAsImJyICAgICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxCUiAgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4YzQwMDAwMDAsImJyLm4gICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxCUiAgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZDAwMDAwMDAsImJiMCAgICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTYsUENSRUx9LHsyLDIsTkEsQkIwLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZDQwMDAwMDAsImJiMC5uICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTYsUENSRUx9LHsxLDEsTkEsQkIwLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZDgwMDAwMDAsImJiMSAgICAgICAgICIsezIxLDUsSEVYfSx7MTYsNSxSRUd9ICAgICAsezAsMTYsUENSRUx9LHsyLDIsTkEsQkIxLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZGMwMDAwMDAsImJiMS5uICAgICAgICIsezIxLDUsSEVYfSx7MTYsNSxSRUd9ICAgICAsezAsMTYsUENSRUx9LHsxLDEsTkEsQkIxLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMGQwMDAsInRiMCAgICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTAsSEVYfSwgezIsMixOQSxUQjAgLCAgICAgaTEwYml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMGQ4MDAsInRiMSAgICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTAsSEVYfSwgezIsMixOQSxUQjEgLCAgICAgaTEwYml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZTgwMDAwMDAsImJjbmQgICAgICAgICIsezIxLDUsQ09ORE1BU0t9LHsxNiw1LFJFR30sezAsMTYsUENSRUx9LHsyLDIsTkEsQkNORCwgICAgaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZWMwMDAwMDAsImJjbmQubiAgICAgICIsezIxLDUsQ09ORE1BU0t9LHsxNiw1LFJFR30sezAsMTYsUENSRUx9LHsxLDEsTkEsQkNORCwgICAgaTE2Yml0LDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMGU4MDAsInRjbmQgICAgICAgICIsezIxLDUsQ09ORE1BU0t9LHsxNiw1LFJFR30sezAsMTAsSEVYfSwgezIsMixOQSxUQ05ELCAgICAgaTEwYml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjgwMDAwMDAsInRibmQgICAgICAgICIsezE2LDUsUkVHfSAgLHswLDE2LEhFWH0gICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxUQk5ELCAgICAgaTEwYml0LDEsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGY4MDAsInRibmQgICAgICAgICIsezE2LDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxUQk5ELCAgICAgICAgICAwLDEsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGZjMDAsInJ0ZSAgICAgICAgICIsTk9fT1BFUkFORCAgICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxSVEUgLCAgICAgICAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MWMwMDAwMDAsImxkLmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExEQiAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDFjMDAsImxkLmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEQiAgICAgLCAgICAwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MGMwMDAwMDAsImxkLmJ1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExEQlUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDBjMDAsImxkLmJ1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEQlUgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MTgwMDAwMDAsImxkLmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExESCAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE4MDAsImxkLmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExESCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDFhMDAsImxkLmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExESCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MDgwMDAwMDAsImxkLmh1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExESFUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDA4MDAsImxkLmh1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExESFUgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDBhMDAsImxkLmh1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExESFUgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MTQwMDAwMDAsImxkICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExEICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE0MDAsImxkICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE2MDAsImxkICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MTAwMDAwMDAsImxkLmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExERCAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDEwMDAsImxkLmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExERCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDEyMDAsImxkLmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExERCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4ZjQwMDE1MDAsImxkLnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE3MDAsImxkLnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MmMwMDAwMDAsInN0LmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVEIgICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJjMDAsInN0LmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVEIgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MjgwMDAwMDAsInN0LmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVEggICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI4MDAsInN0LmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVEggICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJhMDAsInN0LmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVEggICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MjQwMDAwMDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVCAgICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI0MDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMjYwMCwic3QgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLE5BLFNUICAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweDIwMDAwMDAwLCJzdC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1REICAgICAgLGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDIwMDAsInN0LmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVEQgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMjIwMCwic3QuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLE5BLFNURCAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyNTAwLCJzdC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDI3MDAsInN0LnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotLyogIG04ODEwMCBvbmx5OgotICB7MHgwMDAwMDAwMCwieG1lbS5idSAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sWE1FTUJVICxpMTZiaXQsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gKi8KLSAgezB4ZjQwMDAwMDAsInhtZW0uYnUgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotLyogIG04ODEwMCBvbmx5OgotICB7MHgwNDAwMDAwMCwieG1lbSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sWE1FTSAgICxpMTZiaXQsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gKi8KLSAgezB4ZjQwMDA0MDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMDYwMCwieG1lbSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAwNTAwLCJ4bWVtLnVzciAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDA3MDAsInhtZW0udXNyICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotLyogbTg4MTAwIG9ubHk6Ci0gIHsweGY0MDAzZTAwLCJsZGEuYiAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREFILCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAqLwotICB7MHhmNDAwM2UwMCwibGRhLnggICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAzYTAwLCJsZGEuaCAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREFILCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDM2MDAsImxkYSAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQSAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMzIwMCwibGRhLmQgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBRCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0KLSAgezB4ODAwMDQwMDAsImxkY3IgICAgICAgICIsezIxLDUsUkVHfSAgLHs1LDYsQ1JSRUd9ICAsTk9fT1BFUkFORCAgICAsezEsMSxQSU5ULExEQ1IsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwODAwMCwic3RjciAgICAgICAgIix7MTYsNSxSRUd9ICAsezUsNixDUlJFR30gICxOT19PUEVSQU5EICAgICx7MSwxLFBJTlQsU1RDUiwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDgwMDBjMDAwLCJ4Y3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHs1LDYsQ1JSRUd9LHsxLDEsUElOVCxYQ1IsICAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHhmNDAwNjAwMCwiYWRkdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2MjAwLCJhZGR1LmNpICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBRERVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDYxMDAsImFkZHUuY28gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjMwMCwiYWRkdS5jaW8gICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NDAwLCJzdWJ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY2MDAsInN1YnUuY2kgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjUwMCwic3VidS5jbyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NzAwLCJzdWJ1LmNpbyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY4MDAsImRpdnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMyLDMyLFBJTlQsRElWVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2OTAwLCJkaXZ1LmQgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLH0sIE5VTEwgfSwKLSAgezB4ZjQwMDZlMDAsIm11bHMgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsfSwgTlVMTCB9LAotICB7MHhmNDAwNmMwMCwibXVsdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSw0LFBJTlQsTVVMLCAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MDAwLCJhZGQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDcyMDAsImFkZC5jaSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERCAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzEwMCwiYWRkLmNvICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MzAwLCJhZGQuY2lvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc0MDAsInN1YiAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzYwMCwic3ViLmNpICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NTAwLCJzdWIuY28gICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc3MDAsInN1Yi5jaW8gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzgwMCwiZGl2cyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MzIsMzIsUElOVCxESVYgLCAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3YzAwLCJjbXAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxDTVAsICAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg2MDAwMDAwMCwiYWRkdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQUREVSwgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDY0MDAwMDAwLCJzdWJ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxTVUJVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg2ODAwMDAwMCwiZGl2dSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MzIsMzIsUElOVCxESVZVLCBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDZjMDAwMDAwLCJtdWx1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHs0LDEsUElOVCxNVUwsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NzAwMDAwMDAsImFkZCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFERCwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg3NDAwMDAwMCwic3ViICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsU1VCLCAgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDc4MDAwMDAwLCJkaXZzICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszMiwzMixQSU5ULERJViwgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4N2MwMDAwMDAsImNtcCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULENNUCwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweGY0MDA0MDAwLCJhbmQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBTkRfICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDQ0MDAsImFuZC5jICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFORF8gICAgICAgICwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNTgwMCwib3IgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsT1IgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA1YzAwLCJvci5jICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxPUiAgICAgICAgICAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDUwMDAsInhvciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFhPUiAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNTQwMCwieG9yLmMgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsWE9SICAgICAgICAgLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDQwMDAwMDAwLCJhbmQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBTkRfICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NDQwMDAwMDAsImFuZC51ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFORF8gICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1ODAwMDAwMCwib3IgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsT1IgICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDVjMDAwMDAwLCJvci51ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxPUiAgICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NTAwMDAwMDAsInhvciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFhPUiAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1NDAwMDAwMCwieG9yLnUgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsWE9SICAgICxpMTZiaXQsMSwwLDEsMCwxLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDQ4MDAwMDAwLCJtYXNrICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxNQVNLICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NGMwMDAwMDAsIm1hc2sudSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULE1BU0sgICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwZWMwMCwiZmYwICAgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7MSwxLFBJTlQsRkYwICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDBlODAwLCJmZjEgICAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHsxLDEsUElOVCxGRjEgICAgICAgICAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDgwMDAsImNsciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULENMUiAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwODgwMCwic2V0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsU0VUICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA5MDAwLCJleHQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxFWFQgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDk4MDAsImV4dHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULEVYVFUgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwYTAwMCwibWFrICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsTUFLICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDBhODAwLCJyb3QgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxST1QgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDgwMDAsImNsciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULENMUiAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwODgwMCwic2V0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU0VUICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA5MDAwLCJleHQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxFWFQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDk4MDAsImV4dHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEVYVFUgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwYTAwMCwibWFrICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsTUFLICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDBhODAwLCJyb3QgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxST1QgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg4NDAwMjgwMCwiZmFkZC5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NSwxLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyODgwLCJmYWRkLnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhMDAsImZhZGQuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmE4MCwiZmFkZC5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyODIwLCJmYWRkLmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDI4YTAsImZhZGQuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmEyMCwiZmFkZC5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyYWEwLCJmYWRkLmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwMDAsImZzdWIuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzA4MCwiZnN1Yi5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMjAwLCJmc3ViLnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyODAsImZzdWIuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzAyMCwiZnN1Yi5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMGEwLCJmc3ViLmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyMjAsImZzdWIuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzJhMCwiZnN1Yi5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMDAwLCJmbXVsLnNzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwODAsImZtdWwuc3NkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDIwMCwiZm11bC5zZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMjgwLCJmbXVsLnNkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwMjAsImZtdWwuZHNzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDBhMCwiZm11bC5kc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMjIwLCJmbXVsLmRkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAyYTAsImZtdWwuZGRkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzAwMCwiZmRpdi5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MzAsMzAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MDgwLCJmZGl2LnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyMDAsImZkaXYuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzI4MCwiZmRpdi5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MDIwLCJmZGl2LmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcwYTAsImZkaXYuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzIyMCwiZmRpdi5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MmEwLCJmZGl2LmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4MDAsImZzcXJ0LnNzICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzgyMCwiZnNxcnQuc2QgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3ODgwLCJmc3FydC5kcyAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4YTAsImZzcXJ0LmRkICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzgwMCwiZmNtcC5zcyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NSwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzODgwLCJmY21wLnNkICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGQ01QICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDNhMDAsImZjbXAuZHMgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwM2E4MCwiZmNtcC5kZCAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyMDAwLCJmbHQucyAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDIwMjAsImZsdC5kICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNDgwMCwiaW50LnMgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA0ODgwLCJpbnQuZCAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxJTlQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDUwMDAsIm5pbnQucyAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNTA4MCwibmludC5kICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1ODAwLCJ0cm5jLnMgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxUUk5DICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDU4ODAsInRybmMuZCAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULFRSTkMgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweDgwMDA0ODAwLCJmbGRjciAgICAgICAiLHsyMSw1LFJFR30gICx7NSw2LEZDUlJFR30gLE5PX09QRVJBTkQgICAsIHsxLDEsUEZMVCxGTERDICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMDg4MDAsImZzdGNyICAgICAgICIsezE2LDUsUkVHfSAgLHs1LDYsRkNSUkVHfSAsTk9fT1BFUkFORCAgICwgezEsMSxQRkxULEZTVEMgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwYzgwMCwiZnhjciAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7NSw2LEZDUlJFR30gLCB7MSwxLFBGTFQsRlhDICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIG5ldyBmb3IgdGhlIDg4MTEwLiAqLwotCi0gIHsweDg0MDBhYWEwLCJmYWRkLmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWE4MCwiZmFkZC5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhYzAsImZhZGQuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYTIwLCJmYWRkLmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWEwMCwiZmFkZC5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhNDAsImZhZGQuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYjIwLCJmYWRkLmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWIwMCwiZmFkZC5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFiNDAsImZhZGQuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOGEwLCJmYWRkLnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTg4MCwiZmFkZC5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4YzAsImZhZGQuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhODIwLCJmYWRkLnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTgwMCwiZmFkZC5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4NDAsImZhZGQuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOTIwLCJmYWRkLnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTkwMCwiZmFkZC5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE5NDAsImZhZGQuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhY2EwLCJmYWRkLnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWM4MCwiZmFkZC54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjYzAsImZhZGQueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYzIwLCJmYWRkLnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWMwMCwiZmFkZC54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjNDAsImZhZGQueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhZDIwLCJmYWRkLnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWQwMCwiZmFkZC54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFkNDAsImZhZGQueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGJhODAsImZjbXAuc2RkICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJhMDAsImZjbXAuc2RzICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJiMDAsImZjbXAuc2R4ICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4ODAsImZjbXAuc3NkICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4MDAsImZjbXAuc3NzICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI5MDAsImZjbXAuc3N4ICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjODAsImZjbXAuc3hkICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjMDAsImZjbXAuc3hzICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJkMDAsImZjbXAuc3h4ICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwYmFhMCwiZmNtcHUuc2RkICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmEyMCwiZmNtcHUuc2RzICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmIyMCwiZmNtcHUuc2R4ICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjhhMCwiZmNtcHUuc3NkICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjgyMCwiZmNtcHUuc3NzICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjkyMCwiZmNtcHUuc3N4ICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmNhMCwiZmNtcHUuc3hkICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmMyMCwiZmNtcHUuc3hzICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmQyMCwiZmNtcHUuc3h4ICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDAwODIwLCJmY3Z0LnNkICAgICAiLHsyMSw1LFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwMDg4MCwiZmN2dC5kcyAgICAgIix7MjEsNSxSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwODg4MCwiZmN2dC5kcyAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODhjMCwiZmN2dC5keCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODgyMCwiZmN2dC5zZCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODg0MCwiZmN2dC5zeCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODkyMCwiZmN2dC54ZCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODkwMCwiZmN2dC54cyAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBmMmEwLCJmZGl2LmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjI4MCwiZmRpdi5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyYzAsImZkaXYuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMjIwLCJmZGl2LmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjIwMCwiZmRpdi5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyNDAsImZkaXYuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMzIwLCJmZGl2LmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjMwMCwiZmRpdi5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYzNDAsImZkaXYuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMGEwLCJmZGl2LnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjA4MCwiZmRpdi5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwYzAsImZkaXYuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMDIwLCJmZGl2LnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjAwMCwiZmRpdi5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwNDAsImZkaXYuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMTIwLCJmZGl2LnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjEwMCwiZmRpdi5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYxNDAsImZkaXYuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNGEwLCJmZGl2LnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQ4MCwiZmRpdi54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0YzAsImZkaXYueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNDIwLCJmZGl2LnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQwMCwiZmRpdi54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0NDAsImZkaXYueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNTIwLCJmZGl2Lnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjUwMCwiZmRpdi54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY1NDAsImZkaXYueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDIyMjAsImZsdC5kcyAgICAgICIsezIxLDUsWFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwMjIwMCwiZmx0LnNzICAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDAyMjQwLCJmbHQueHMgICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwODJhMCwiZm11bC5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyODAsImZtdWwuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MmMwLCJmbXVsLmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODIyMCwiZm11bC5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyMDAsImZtdWwuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjQwLCJmbXVsLmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODMyMCwiZm11bC5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgzMDAsImZtdWwuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MzQwLCJmbXVsLmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODBhMCwiZm11bC5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwODAsImZtdWwuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MGMwLCJmbXVsLnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODAyMCwiZm11bC5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwMDAsImZtdWwuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDQwLCJmbXVsLnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODEyMCwiZm11bC5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgxMDAsImZtdWwuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MTQwLCJmbXVsLnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODRhMCwiZm11bC54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0ODAsImZtdWwueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NGMwLCJmbXVsLnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODQyMCwiZm11bC54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0MDAsImZtdWwueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDQwLCJmbXVsLnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODUyMCwiZm11bC54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg1MDAsImZtdWwueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NTQwLCJmbXVsLnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBmOGEwLCJmc3FydC5kZCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4ODAsImZzcXJ0LmRzICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjhjMCwiZnNxcnQuZHggICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODIwLCJmc3FydC5zZCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4MDAsImZzcXJ0LnNzICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjg0MCwiZnNxcnQuc3ggICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmOTIwLCJmc3FydC54ZCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY5MDAsImZzcXJ0LnhzICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjk0MCwiZnNxcnQueHggICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGIyYTAsImZzdWIuZGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjgwLCJmc3ViLmRkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjJjMCwiZnN1Yi5kZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyMjAsImZzdWIuZHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjAwLCJmc3ViLmRzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjI0MCwiZnN1Yi5kc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIzMjAsImZzdWIuZHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMzAwLCJmc3ViLmR4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjM0MCwiZnN1Yi5keHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwYTAsImZzdWIuc2RkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDgwLCJmc3ViLnNkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjBjMCwiZnN1Yi5zZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwMjAsImZzdWIuc3NkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDAwLCJmc3ViLnNzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjA0MCwiZnN1Yi5zc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIxMjAsImZzdWIuc3hkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMTAwLCJmc3ViLnN4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjE0MCwiZnN1Yi5zeHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0YTAsImZzdWIueGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDgwLCJmc3ViLnhkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjRjMCwiZnN1Yi54ZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0MjAsImZzdWIueHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDAwLCJmc3ViLnhzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQ0MCwiZnN1Yi54c3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI1MjAsImZzdWIueHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNTAwLCJmc3ViLnh4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjU0MCwiZnN1Yi54eHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZmMwMCwiaWxsb3AiLCB7MCwyLERFQ30sIE5PX09QRVJBTkQsIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBjODAwLCJpbnQuc3MgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGM4ODAsImludC5zZCAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzkwMCwiaW50LnN4ICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4MDQwMDAwMDAsImxkICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MDAwMDAwMDAsImxkLmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4M2MwMDAwMDAsImxkLnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMTQwMCwibGQgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxMDAwLCJsZC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE4MDAsImxkLnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTUwMCwibGQudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxMTAwLCJsZC5kLnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE5MDAsImxkLngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGYwMDAxNjAwLCJsZCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTIwMCwibGQuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDFhMDAsImxkLnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxNzAwLCJsZC51c3IgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTMwMCwibGQuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDFiMDAsImxkLngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGMwMDAsIm1vdi5zICAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzA4MCwibW92LmQgICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA0MjAwLCJtb3YucyAgICAgICAiLCB7MjEsNSxYUkVHfSwgezAsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDQyODAsIm1vdi5kICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MCw1LFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzMwMCwibW92ICAgICAgICAgIiwgezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGY0MDA2ZDAwLCJtdWx1LmQgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBkMDgwLCJuaW50LnNkICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQwMDAsIm5pbnQuc3MgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZDEwMCwibmludC5zeCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDIwMjAsInBhZGQuYiAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMDQwLCJwYWRkLmggICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjA2MCwicGFkZCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMjFlMCwicGFkZHMucyAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxYTAsInBhZGRzLnMuYiAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMWMwLCJwYWRkcy5zLmggICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjBlMCwicGFkZHMudSAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwYTAsInBhZGRzLnUuYiAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMGMwLCJwYWRkcy51LmggICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjE2MCwicGFkZHMudXMgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxMjAsInBhZGRzLnVzLmIgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMTQwLCJwYWRkcy51cy5oICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAzODYwLCJwY21wICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAwMDAwLCJwbXVsICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDA2MjYwLCJwcGFjay4xNiAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjI0MCwicHBhY2suMTYuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDY0NjAsInBwYWNrLjMyICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2NDIwLCJwcGFjay4zMi5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjQ0MCwicHBhY2suMzIuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDYxNjAsInBwYWNrLjggICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDcyMDAsInByb3QgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHs1LDYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA3ODAwLCJwcm90ICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAzMDIwLCJwc3ViLmIgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzA0MCwicHN1Yi5oICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwNjAsInBzdWIgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDMxZTAsInBzdWJzLnMgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMWEwLCJwc3Vicy5zLmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzFjMCwicHN1YnMucy5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwZTAsInBzdWJzLnUgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMGEwLCJwc3Vicy51LmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzBjMCwicHN1YnMudS5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxNjAsInBzdWJzLnVzICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMTIwLCJwc3Vicy51cy5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzE0MCwicHN1YnMudXMuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwNjgwMCwicHVucGsubiAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2ODIwLCJwdW5way5iICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHgzNDAwMDAwMCwic3QgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgzMDAwMDAwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgzODAwMDAwMCwic3QueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGY0MDAyYzgwLCJzdC5iLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjg4MCwic3QuaC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI0ODAsInN0Lnd0ICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMDgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmQ4MCwic3QuYi51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI5ODAsInN0LmgudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNTgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjE4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMjQwMCwic3QgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMDAwLCJzdC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIxMDAsInN0LmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjE4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMDgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI1MDAsInN0LnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjU4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNDgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI4MDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjkwMCwic3QueC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyOTgwLCJzdC54LnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI4ODAsInN0Lngud3QgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGY0MDAyZjgwLCJzdC5iLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyZTgwLCJzdC5iLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMzgwLCJzdC5kLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMjgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYjgwLCJzdC5oLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYTgwLCJzdC5oLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNzgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNjgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDI2MDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMjAwLCJzdC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjMwMCwic3QuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIzODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMjgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjcwMCwic3QudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI3ODAsInN0LnVzci53dCAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNjgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmEwMCwic3QueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJiMDAsInN0LngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyYjgwLCJzdC54LnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmE4MCwic3QueC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZDg4MCwidHJuYy5zZCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkODAwLCJ0cm5jLnNzICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQ5MDAsInRybmMuc3ggICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi19OwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9taXBzLmggYi9pbmNsdWRlL29wY29kZS9taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZmU1N2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQ5ICswLDAgQEAKLS8qIG1pcHMuaC4gIE1pcHMgb3Bjb2RlIGxpc3QgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmFscGggQ2FtcGJlbGwgYW5kIE9TRgotICAgQ29tbWVudGVkIGFuZCBtb2RpZmllZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9NSVBTX0hfCi0jZGVmaW5lIF9NSVBTX0hfCi0KLS8qIFRoZXNlIGFyZSBiaXQgbWFza3MgYW5kIHNoaWZ0IGNvdW50cyB0byB1c2UgdG8gYWNjZXNzIHRoZSB2YXJpb3VzCi0gICBmaWVsZHMgb2YgYW4gaW5zdHJ1Y3Rpb24uICBUbyByZXRyaWV2ZSB0aGUgWCBmaWVsZCBvZiBhbgotICAgaW5zdHJ1Y3Rpb24sIHVzZSB0aGUgZXhwcmVzc2lvbgotCShpID4+IE9QX1NIX1gpICYgT1BfTUFTS19YCi0gICBUbyBzZXQgdGhlIHNhbWUgZmllbGQgKHRvIGopLCB1c2UKLQlpID0gKGkgJn4gKE9QX01BU0tfWCA8PCBPUF9TSF9YKSkgfCAoaiA8PCBPUF9TSF9YKQotCi0gICBNYWtlIHN1cmUgeW91IHVzZSBmaWVsZHMgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnN0cnVjdGlvbiwKLSAgIG9mIGNvdXJzZS4gIAotCi0gICBUaGUgJ2knIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQgYW5kIElNTUVESUFURS4gIAotCi0gICBUaGUgJ2onIGZvcm1hdCB1c2VzIE9QIGFuZCBUQVJHRVQuCi0KLSAgIFRoZSAncicgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCwgUkQsIFNIQU1UIGFuZCBGVU5DVC4KLQotICAgVGhlICdiJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBERUxUQS4KLQotICAgVGhlIGZsb2F0aW5nIHBvaW50ICdpJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBJTU1FRElBVEUuCi0KLSAgIFRoZSBmbG9hdGluZyBwb2ludCAncicgZm9ybWF0IHVzZXMgT1AsIEZNVCwgRlQsIEZTLCBGRCBhbmQgRlVOQ1QuCi0KLSAgIEEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB1c2VzIE9QLCBDT0RFIGFuZCBTUEVDICgxMCBiaXRzIG9mIHRoZQotICAgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBhcmUgbm90IGRlZmluZWQ7IEthbmUgc2F5cyB0aGUgYnJlYWtwb2ludAotICAgY29kZSBmaWVsZCBpbiBCUkVBSyBpcyAyMCBiaXRzOyB5ZXQgTUlQUyBhc3NlbWJsZXJzIGFuZCBkZWJ1Z2dlcnMKLSAgIG9ubHkgdXNlIHRlbiBiaXRzKS4gIEFuIG9wdGlvbmFsIHR3by1vcGVyYW5kIGZvcm0gb2YgYnJlYWsvc2RiYnAKLSAgIGFsbG93cyB0aGUgbG93ZXIgdGVuIGJpdHMgdG8gYmUgc2V0IHRvby4KLQotICAgVGhlIHN5c2NhbGwgaW5zdHJ1Y3Rpb24gdXNlcyBTWVNDQUxMLgotCi0gICBUaGUgZ2VuZXJhbCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgdXNlIENPUFouICAqLwotCi0jZGVmaW5lIE9QX01BU0tfT1AJCTB4M2YKLSNkZWZpbmUgT1BfU0hfT1AJCTI2Ci0jZGVmaW5lIE9QX01BU0tfUlMJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUlMJCTIxCi0jZGVmaW5lIE9QX01BU0tfRlIJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRlIJCTIxCi0jZGVmaW5lIE9QX01BU0tfRk1UCQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZNVAkJMjEKLSNkZWZpbmUgT1BfTUFTS19CQ0MJCTB4NwotI2RlZmluZSBPUF9TSF9CQ0MJCTE4Ci0jZGVmaW5lIE9QX01BU0tfQ09ERQkJMHgzZmYKLSNkZWZpbmUgT1BfU0hfQ09ERQkJMTYKLSNkZWZpbmUgT1BfTUFTS19DT0RFMgkJMHgzZmYKLSNkZWZpbmUgT1BfU0hfQ09ERTIJCTYKLSNkZWZpbmUgT1BfTUFTS19SVAkJMHgxZgotI2RlZmluZSBPUF9TSF9SVAkJMTYKLSNkZWZpbmUgT1BfTUFTS19GVAkJMHgxZgotI2RlZmluZSBPUF9TSF9GVAkJMTYKLSNkZWZpbmUgT1BfTUFTS19DQUNIRQkJMHgxZgotI2RlZmluZSBPUF9TSF9DQUNIRQkJMTYKLSNkZWZpbmUgT1BfTUFTS19SRAkJMHgxZgotI2RlZmluZSBPUF9TSF9SRAkJMTEKLSNkZWZpbmUgT1BfTUFTS19GUwkJMHgxZgotI2RlZmluZSBPUF9TSF9GUwkJMTEKLSNkZWZpbmUgT1BfTUFTS19QUkVGWAkJMHgxZgotI2RlZmluZSBPUF9TSF9QUkVGWAkJMTEKLSNkZWZpbmUgT1BfTUFTS19DQ0MJCTB4NwotI2RlZmluZSBPUF9TSF9DQ0MJCTgKLSNkZWZpbmUgT1BfTUFTS19TWVNDQUxMCQkweGZmZmZmCi0jZGVmaW5lIE9QX1NIX1NZU0NBTEwJCTYKLSNkZWZpbmUgT1BfTUFTS19TSEFNVAkJMHgxZgotI2RlZmluZSBPUF9TSF9TSEFNVAkJNgotI2RlZmluZSBPUF9NQVNLX0ZECQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZECQk2Ci0jZGVmaW5lIE9QX01BU0tfVEFSR0VUCQkweDNmZmZmZmYKLSNkZWZpbmUgT1BfU0hfVEFSR0VUCQkwCi0jZGVmaW5lIE9QX01BU0tfQ09QWgkJMHgxZmZmZmZmCi0jZGVmaW5lIE9QX1NIX0NPUFoJCTAKLSNkZWZpbmUgT1BfTUFTS19JTU1FRElBVEUJMHhmZmZmCi0jZGVmaW5lIE9QX1NIX0lNTUVESUFURQkJMAotI2RlZmluZSBPUF9NQVNLX0RFTFRBCQkweGZmZmYKLSNkZWZpbmUgT1BfU0hfREVMVEEJCTAKLSNkZWZpbmUgT1BfTUFTS19GVU5DVAkJMHgzZgotI2RlZmluZSBPUF9TSF9GVU5DVAkJMAotI2RlZmluZSBPUF9NQVNLX1NQRUMJCTB4M2YKLSNkZWZpbmUgT1BfU0hfU1BFQwkJMAotI2RlZmluZSBPUF9TSF9MT0NDICAgICAgICAgICAgICA4ICAgICAgIC8qIEZQIGNvbmRpdGlvbiBjb2RlICovCi0jZGVmaW5lIE9QX1NIX0hJQ0MgICAgICAgICAgICAgIDE4ICAgICAgLyogRlAgY29uZGl0aW9uIGNvZGUgKi8KLSNkZWZpbmUgT1BfTUFTS19DQyAgICAgICAgICAgICAgMHg3Ci0jZGVmaW5lIE9QX1NIX0NPUDFOT1JNICAgICAgICAgIDI1ICAgICAgLyogTm9ybWFsIENPUDEgZW5jb2RpbmcgKi8KLSNkZWZpbmUgT1BfTUFTS19DT1AxTk9STSAgICAgICAgMHgxICAgICAvKiBhIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgT1BfU0hfQ09QMVNQRUMgICAgICAgICAgMjEgICAgICAvKiBDT1AxIGVuY29kaW5ncyAqLwotI2RlZmluZSBPUF9NQVNLX0NPUDFTUEVDICAgICAgICAweGYKLSNkZWZpbmUgT1BfTUFTS19DT1AxU0NMUiAgICAgICAgMHg0Ci0jZGVmaW5lIE9QX01BU0tfQ09QMUNNUCAgICAgICAgIDB4MwotI2RlZmluZSBPUF9TSF9DT1AxQ01QICAgICAgICAgICA0Ci0jZGVmaW5lIE9QX1NIX0ZPUk1BVCAgICAgICAgICAgIDIxICAgICAgLyogRlAgc2hvcnQgZm9ybWF0IGZpZWxkICovCi0jZGVmaW5lIE9QX01BU0tfRk9STUFUICAgICAgICAgIDB4NwotI2RlZmluZSBPUF9TSF9UUlVFICAgICAgICAgICAgICAxNgotI2RlZmluZSBPUF9NQVNLX1RSVUUgICAgICAgICAgICAweDEKLSNkZWZpbmUgT1BfU0hfR0UgICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgT1BfTUFTS19HRSAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBPUF9TSF9VTlNJR05FRCAgICAgICAgICAxNgotI2RlZmluZSBPUF9NQVNLX1VOU0lHTkVEICAgICAgICAweDEKLSNkZWZpbmUgT1BfU0hfSElOVCAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgT1BfTUFTS19ISU5UICAgICAgICAgICAgMHgxZgotI2RlZmluZSBPUF9TSF9NTUkgICAgICAgICAgICAgICAwICAgICAgIC8qIE11bHRpbWVkaWEgKHBhcmFsbGVsKSBvcCAqLwotI2RlZmluZSBPUF9NQVNLX01NSSAgICAgICAgICAgICAweDNmIAotI2RlZmluZSBPUF9TSF9NTUlTVUIgICAgICAgICAgICA2Ci0jZGVmaW5lIE9QX01BU0tfTU1JU1VCICAgICAgICAgIDB4MWYKLSNkZWZpbmUgT1BfTUFTS19QRVJGUkVHCQkweDFmCS8qIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKi8KLSNkZWZpbmUgT1BfU0hfUEVSRlJFRwkJMQotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGluc3RydWN0aW9uLiAgKi8KLQotc3RydWN0IG1pcHNfb3Bjb2RlCi17Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGFyZ3VtZW50cyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIC8qIFRoZSBiYXNpYyBvcGNvZGUgZm9yIHRoZSBpbnN0cnVjdGlvbi4gIFdoZW4gYXNzZW1ibGluZywgdGhpcwotICAgICBvcGNvZGUgaXMgbW9kaWZpZWQgYnkgdGhlIGFyZ3VtZW50cyB0byBwcm9kdWNlIHRoZSBhY3R1YWwgb3Bjb2RlCi0gICAgIHRoYXQgaXMgdXNlZC4gIElmIHBpbmZvIGlzIElOU05fTUFDUk8sIHRoZW4gdGhpcyBpcyAwLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXRjaDsKLSAgLyogSWYgcGluZm8gaXMgbm90IElOU05fTUFDUk8sIHRoZW4gdGhpcyBpcyBhIGJpdCBtYXNrIGZvciB0aGUKLSAgICAgcmVsZXZhbnQgcG9ydGlvbnMgb2YgdGhlIG9wY29kZSB3aGVuIGRpc2Fzc2VtYmxpbmcuICBJZiB0aGUKLSAgICAgYWN0dWFsIG9wY29kZSBhbmRlZCB3aXRoIHRoZSBtYXRjaCBmaWVsZCBlcXVhbHMgdGhlIG9wY29kZSBmaWVsZCwKLSAgICAgdGhlbiB3ZSBoYXZlIGZvdW5kIHRoZSBjb3JyZWN0IGluc3RydWN0aW9uLiAgSWYgcGluZm8gaXMKLSAgICAgSU5TTl9NQUNSTywgdGhlbiB0aGlzIGZpZWxkIGlzIHRoZSBtYWNybyBpZGVudGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICAvKiBGb3IgYSBtYWNybywgdGhpcyBpcyBJTlNOX01BQ1JPLiAgT3RoZXJ3aXNlLCBpdCBpcyBhIGNvbGxlY3Rpb24KLSAgICAgb2YgYml0cyBkZXNjcmliaW5nIHRoZSBpbnN0cnVjdGlvbiwgbm90YWJseSBhbnkgcmVsZXZhbnQgaGF6YXJkCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwaW5mbzsKLSAgLyogQSBjb2xsZWN0aW9uIG9mIGJpdHMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb24gc2V0cyBvZiB3aGljaCB0aGlzCi0gICAgIGluc3RydWN0aW9uIG9yIG1hY3JvIGlzIGEgbWVtYmVyLiAqLwotICB1bnNpZ25lZCBsb25nIG1lbWJlcnNoaXA7Ci19OwotCi0vKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhcnMgaW4gdGhlIGFyZ3MgZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9uLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgYXBwZWFyCi0gICB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkLiAgQ29tbWFzIGFuZCBwYXJlbnRoZXNlcyBpbiB0aGUgYXJncwotICAgc3RyaW5nIGFyZSBpZ25vcmVkIHdoZW4gYXNzZW1ibGluZywgYW5kIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0Ci0gICB3aGVuIGRpc2Fzc2VtYmxpbmcuCi0KLSAgIEVhY2ggb2YgdGhlc2UgY2hhcmFjdGVycyBjb3JyZXNwb25kcyB0byBhIG1hc2sgZmllbGQgZGVmaW5lZCBhYm92ZS4KLQotICAgIjwiIDUgYml0IHNoaWZ0IGFtb3VudCAoT1BfKl9TSEFNVCkKLSAgICI+IiBzaGlmdCBhbW91bnQgYmV0d2VlbiAzMiBhbmQgNjMsIHN0b3JlZCBhZnRlciBzdWJ0cmFjdGluZyAzMiAoT1BfKl9TSEFNVCkKLSAgICJhIiAyNiBiaXQgdGFyZ2V0IGFkZHJlc3MgKE9QXypfVEFSR0VUKQotICAgImIiIDUgYml0IGJhc2UgcmVnaXN0ZXIgKE9QXypfUlMpCi0gICAiYyIgMTAgYml0IGJyZWFrcG9pbnQgY29kZSAoT1BfKl9DT0RFKQotICAgImQiIDUgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNwZWNpZmllciAoT1BfKl9SRCkKLSAgICJoIiA1IGJpdCBwcmVmeCBoaW50IChPUF8qX1BSRUZYKQotICAgImkiIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKE9QXypfSU1NRURJQVRFKQotICAgImoiIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIChPUF8qX0RFTFRBKQotICAgImsiIDUgYml0IGNhY2hlIG9wY29kZSBpbiB0YXJnZXQgcmVnaXN0ZXIgcG9zaXRpb24gKE9QXypfQ0FDSEUpCi0gICAibyIgMTYgYml0IHNpZ25lZCBvZmZzZXQgKE9QXypfREVMVEEpCi0gICAicCIgMTYgYml0IFBDIHJlbGF0aXZlIGJyYW5jaCB0YXJnZXQgYWRkcmVzcyAoT1BfKl9ERUxUQSkKLSAgICJxIiAxMCBiaXQgZXh0cmEgYnJlYWtwb2ludCBjb2RlIChPUF8qX0NPREUyKQotICAgInIiIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHNvdXJjZSBhbmQgdGFyZ2V0IChPUF8qX1JTKQotICAgInMiIDUgYml0IHNvdXJjZSByZWdpc3RlciBzcGVjaWZpZXIgKE9QXypfUlMpCi0gICAidCIgNSBiaXQgdGFyZ2V0IHJlZ2lzdGVyIChPUF8qX1JUKQotICAgInUiIDE2IGJpdCB1cHBlciAxNiBiaXRzIG9mIGFkZHJlc3MgKE9QXypfSU1NRURJQVRFKQotICAgInYiIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE9QXypfUlMpCi0gICAidyIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGJvdGggdGFyZ2V0IGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9SVCkKLSAgICJDIiAyNSBiaXQgY29wcm9jZXNzb3IgZnVuY3Rpb24gY29kZSAoT1BfKl9DT1BaKQotICAgIkIiIDIwIGJpdCBzeXNjYWxsIGZ1bmN0aW9uIGNvZGUgKE9QXypfU1lTQ0FMTCkKLSAgICJ4IiBhY2NlcHQgYW5kIGlnbm9yZSByZWdpc3RlciBuYW1lCi0gICAieiIgbXVzdCBiZSB6ZXJvIHJlZ2lzdGVyCi0KLSAgIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uczoKLSAgICJEIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9GRCkKLSAgICJNIiAzIGJpdCBjb21wYXJlIGNvbmRpdGlvbiBjb2RlIChPUF8qX0NDQykgKG9ubHkgdXNlZCBmb3IgbWlwczQgYW5kIHVwKQotICAgIk4iIDMgYml0IGJyYW5jaCBjb25kaXRpb24gY29kZSAoT1BfKl9CQ0MpIChvbmx5IHVzZWQgZm9yIG1pcHM0IGFuZCB1cCkKLSAgICJTIiA1IGJpdCBmcyBzb3VyY2UgMSByZWdpc3RlciAoT1BfKl9GUykKLSAgICJUIiA1IGJpdCBmdCBzb3VyY2UgMiByZWdpc3RlciAoT1BfKl9GVCkKLSAgICJSIiA1IGJpdCBmciBzb3VyY2UgMyByZWdpc3RlciAoT1BfKl9GUikKLSAgICJWIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GUykKLSAgICJXIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgdGFyZ2V0IGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GVCkKLQotICAgQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zOgotICAgIkUiIDUgYml0IHRhcmdldCByZWdpc3RlciAoT1BfKl9SVCkKLSAgICJHIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9SRCkKLSAgICJQIiA1IGJpdCBwZXJmb3JtYW5jZS1tb25pdG9yIHJlZ2lzdGVyIChPUF8qX1BFUkZSRUcpCi0KLSAgIE1hY3JvIGluc3RydWN0aW9uczoKLSAgICJBIiBHZW5lcmFsIDMyIGJpdCBleHByZXNzaW9uCi0gICAiSSIgMzIgYml0IGltbWVkaWF0ZQotICAgIkYiIDY0IGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpbiAucmRhdGEKLSAgICJMIiA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLmxpdDgKLSAgICJmIiAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgICJsIiAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLmxpdDQKLQotICAgT3RoZXI6Ci0gICAiKCkiIHBhcmVucyBzdXJyb3VuZGluZyBvcHRpb25hbCB2YWx1ZQotICAgIiwiICBzZXBhcmF0ZXMgb3BlcmFuZHMKLQotICAgQ2hhcmFjdGVycyB1c2VkIHNvIGZhciwgZm9yIHF1aWNrIHJlZmVyZW5jZSB3aGVuIGFkZGluZyBtb3JlOgotICAgIjw+KCksIgotICAgIkFCQ0RFRkdJTE1OU1RSVlciCi0gICAiYWJjZGZoaWprbG9wcXJzdHV2d3h6IgotKi8KLQotLyogVGhlc2UgYXJlIHRoZSBiaXRzIHdoaWNoIG1heSBiZSBzZXQgaW4gdGhlIHBpbmZvIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbnMsIGlmIGl0IGlzIG5vdCBlcXVhbCB0byBJTlNOX01BQ1JPLiAgKi8KLQotLyogTW9kaWZpZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JELiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9HUFJfRCAgICAgICAgICAgIDB4MDAwMDAwMDEKLS8qIE1vZGlmaWVzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SVC4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfR1BSX1QgICAgICAgICAgICAweDAwMDAwMDAyCi0vKiBNb2RpZmllcyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgMzEuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0dQUl8zMSAgICAgICAgICAgMHgwMDAwMDAwNAotLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRkQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9EICAgICAgICAgICAgMHgwMDAwMDAwOAotLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlMuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9TICAgICAgICAgICAgMHgwMDAwMDAxMAotLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9UICAgICAgICAgICAgMHgwMDAwMDAyMAotLyogUmVhZHMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JTLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0dQUl9TICAgICAgICAgICAgIDB4MDAwMDAwNDAKLS8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SVC4gICovCi0jZGVmaW5lIElOU05fUkVBRF9HUFJfVCAgICAgICAgICAgICAweDAwMDAwMDgwCi0vKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUy4gICovCi0jZGVmaW5lIElOU05fUkVBRF9GUFJfUyAgICAgICAgICAgICAweDAwMDAwMTAwCi0vKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GVC4gICovCi0jZGVmaW5lIElOU05fUkVBRF9GUFJfVCAgICAgICAgICAgICAweDAwMDAwMjAwCi0vKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUi4gICovCi0jZGVmaW5lIElOU05fUkVBRF9GUFJfUgkJICAgIDB4MDAwMDA0MDAKLS8qIE1vZGlmaWVzIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9DT05EX0NPREUgICAgICAgIDB4MDAwMDA4MDAKLS8qIFJlYWRzIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0NPTkRfQ09ERSAgICAgICAgIDB4MDAwMDEwMDAKLS8qIFRMQiBvcGVyYXRpb24uICAqLwotI2RlZmluZSBJTlNOX1RMQiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotLyogUmVhZHMgY29wcm9jZXNzb3IgcmVnaXN0ZXIgb3RoZXIgdGhhbiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fQ09QICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0vKiBJbnN0cnVjdGlvbiBsb2FkcyB2YWx1ZSBmcm9tIG1lbW9yeSwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSAgICAgIDB4MDAwMDgwMDAKLS8qIEluc3RydWN0aW9uIGxvYWRzIHZhbHVlIGZyb20gY29wcm9jZXNzb3IsIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fTE9BRF9DT1BST0NfREVMQVkJICAgIDB4MDAwMTAwMDAKLS8qIEluc3RydWN0aW9uIGhhcyB1bmNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheSBzbG90LiAgKi8KLSNkZWZpbmUgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZICAgIDB4MDAwMjAwMDAKLS8qIEluc3RydWN0aW9uIGhhcyBjb25kaXRpb25hbCBicmFuY2ggZGVsYXkgc2xvdC4gICovCi0jZGVmaW5lIElOU05fQ09ORF9CUkFOQ0hfREVMQVkgICAgICAweDAwMDQwMDAwCi0vKiBDb25kaXRpb25hbCBicmFuY2ggbGlrZWx5OiBpZiBicmFuY2ggbm90IHRha2VuLCBpbnNuIG51bGxpZmllZC4gICovCi0jZGVmaW5lIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZCSAgICAweDAwMDgwMDAwCi0vKiBNb3ZlcyB0byBjb3Byb2Nlc3NvciByZWdpc3RlciwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9DT1BST0NfTU9WRV9ERUxBWSAgICAgIDB4MDAxMDAwMDAKLS8qIExvYWRzIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIGZyb20gbWVtb3J5LCByZXF1aXJpbmcgZGVsYXkuICAqLwotI2RlZmluZSBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkgICAgMHgwMDIwMDAwMAotLyogUmVhZHMgdGhlIEhJIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0hJCQkgICAgMHgwMDQwMDAwMAotLyogUmVhZHMgdGhlIExPIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0xPCQkgICAgMHgwMDgwMDAwMAotLyogTW9kaWZpZXMgdGhlIEhJIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9ISQkJICAgIDB4MDEwMDAwMDAKLS8qIE1vZGlmaWVzIHRoZSBMTyByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfTE8JCSAgICAweDAyMDAwMDAwCi0vKiBUYWtlcyBhIHRyYXAgKGVhc2llciB0byBrZWVwIG91dCBvZiBkZWxheSBzbG90KS4gICovCi0jZGVmaW5lIElOU05fVFJBUCAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0vKiBJbnN0cnVjdGlvbiBzdG9yZXMgdmFsdWUgaW50byBtZW1vcnkuICAqLwotI2RlZmluZSBJTlNOX1NUT1JFX01FTU9SWQkgICAgMHgwODAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gdXNlcyBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LiAgKi8KLSNkZWZpbmUgRlBfUwkJCSAgICAweDEwMDAwMDAwCi0vKiBJbnN0cnVjdGlvbiB1c2VzIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQuICAqLwotI2RlZmluZSBGUF9ECQkJICAgIDB4MjAwMDAwMDAKLS8qIEluc3RydWN0aW9uIGlzIHBhcnQgb2YgdGhlIHR4MzkncyBpbnRlZ2VyIG11bHRpcGx5IGZhbWlseS4gICAgKi8KLSNkZWZpbmUgSU5TTl9NVUxUICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLS8qIEluc3RydWN0aW9uIHN5bmNocm9uaXplIHNoYXJlZCBtZW1vcnkuICAqLwotI2RlZmluZSBJTlNOX1NZTkMJCSAgICAweDgwMDAwMDAwCi0KLS8qIEluc3RydWN0aW9uIGlzIGFjdHVhbGx5IGEgbWFjcm8uICBJdCBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUKLSAgIGRpc2Fzc2VtYmxlciwgYW5kIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IGJ5IHRoZSBhc3NlbWJsZXIuICAqLwotI2RlZmluZSBJTlNOX01BQ1JPICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgotCi0KLQotCi0KLS8qIE1JUFMgSVNBIGZpZWxkLS1DUFUgbGV2ZWwgYXQgd2hpY2ggaW5zbiBpcyBzdXBwb3J0ZWQuICAqLwotI2RlZmluZSBJTlNOX0lTQQkJICAgIDB4MDAwMDAwMEYKLS8qIEFuIGluc3RydWN0aW9uIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIGFueSBiYXNpYyBNSVBTIElTQS4KLSAgIChpZSBpdCBpcyBhIGNoaXAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24pICAqLwotI2RlZmluZSBJTlNOX05PX0lTQQkJICAgIDB4MDAwMDAwMDAKLS8qIE1JUFMgSVNBIDEgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOX0lTQTEJCSAgICAweDAwMDAwMDAxCi0vKiBNSVBTIElTQSAyIGluc3RydWN0aW9uIChSNjAwMCBvciBSNDAwMCkuICAqLwotI2RlZmluZSBJTlNOX0lTQTIJCSAgICAweDAwMDAwMDAyCi0vKiBNSVBTIElTQSAzIGluc3RydWN0aW9uIChSNDAwMCkuICAqLwotI2RlZmluZSBJTlNOX0lTQTMJCSAgICAweDAwMDAwMDAzCi0vKiBNSVBTIElTQSA0IGluc3RydWN0aW9uIChSODAwMCkuICAqLwotI2RlZmluZSBJTlNOX0lTQTQJCSAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIElOU05fSVNBNQkJICAgIDB4MDAwMDAwMDUKLQotLyogQ2hpcCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuICBUaGVzZSBhcmUgYml0bWFza3MuICAqLwotLyogTUlQUyBSNDY1MCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElOU05fNDY1MAkJICAgIDB4MDAwMDAwMTAKLS8qIExTSSBSNDAxMCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElOU05fNDAxMAkJICAgIDB4MDAwMDAwMjAKLS8qIE5FQyBWUjQxMDAgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIElOU05fNDEwMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0vKiBUb3NoaWJhIFIzOTAwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl8zOTAwICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyogMzItYml0IGNvZGUgcnVubmluZyBvbiBhIElTQTMrIENQVS4gKi8KLSNkZWZpbmUgSU5TTl9HUDMyICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLQotLyogVGVzdCBmb3IgbWVtYmVyc2hpcCBpbiBhbiBJU0EgaW5jbHVkaW5nIGNoaXAgc3BlY2lmaWMgSVNBcy4KLSAgIElOU04gaXMgcG9pbnRlciB0byBhbiBlbGVtZW50IG9mIHRoZSBvcGNvZGUgdGFibGU7IElTQSBpcyB0aGUKLSAgIHNwZWNpZmllZCBJU0EgdG8gdGVzdCBhZ2FpbnN0OyBhbmQgQ1BVIGlzIHRoZSBDUFUgc3BlY2lmaWMgSVNBCi0gICB0byB0ZXN0LCBvciB6ZXJvIGlmIG5vIENQVSBzcGVjaWZpYyBJU0EgdGVzdCBpcyBkZXNpcmVkLiAgCi0gICBUaGUgZ3AzMiBhcmcgaXMgc2V0IHdoZW4geW91IG5lZWQgdG8gZm9yY2UgMzItYml0IHJlZ2lzdGVyIHVzYWdlIG9uCi0gICBhIG1hY2hpbmUgd2l0aCA2NC1iaXQgcmVnaXN0ZXJzOyBzZWUgdGhlIGRvY3VtZW50YXRpb24gdW5kZXIgLW1ncDMyCi0gICBpbiB0aGUgTUlQUyBnYXMgZG9jcy4gKi8KLQotI2RlZmluZSBPUENPREVfSVNfTUVNQkVSKGluc24saXNhLGNwdSxncDMyKSAJICAgICAgIAkJXAotICAgICgoKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSAhPSAwCQkJXAotICAgICAgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA8PSBpc2EJCQlcCi0gICAgICAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl9HUDMyID8gZ3AzMiA6IDEpKQkJXAotICAgICB8fCAoY3B1ID09IDQ2NTAJCQkJCQlcCi0JICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzQ2NTApICE9IDApCQlcCi0gICAgIHx8IChjcHUgPT0gNDAxMAkJCQkJCVwKLQkgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fNDAxMCkgIT0gMCkJCVwKLSAgICAgfHwgKChjcHUgPT0gNDEwMAkJCQkJCVwKLQkgIHx8IGNwdSA9PSA0MTExCQkJCQlcCi0JICApCQkJCQkJCVwKLQkgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fNDEwMCkgIT0gMCkJCVwKLSAgICAgfHwgKGNwdSA9PSAzOTAwCQkJCQkJXAotCSAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl8zOTAwKSAhPSAwKSkKLQotLyogVGhpcyBpcyBhIGxpc3Qgb2YgbWFjcm8gZXhwYW5kZWQgaW5zdHJ1Y3Rpb25zLgotICoKLSAqIF9JIGFwcGVuZGVkIG1lYW5zIGltbWVkaWF0ZQotICogX0EgYXBwZW5kZWQgbWVhbnMgYWRkcmVzcwotICogX0FCIGFwcGVuZGVkIG1lYW5zIGFkZHJlc3Mgd2l0aCBiYXNlIHJlZ2lzdGVyCi0gKiBfRCBhcHBlbmRlZCBtZWFucyA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAqIF9TIGFwcGVuZGVkIG1lYW5zIDMyIGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICovCi1lbnVtIHsKLSAgICBNX0FCUywKLSAgICBNX0FERF9JLAotICAgIE1fQUREVV9JLAotICAgIE1fQU5EX0ksCi0gICAgTV9CRVEsCi0gICAgTV9CRVFfSSwKLSAgICBNX0JFUUxfSSwKLSAgICBNX0JHRSwKLSAgICBNX0JHRUwsCi0gICAgTV9CR0VfSSwKLSAgICBNX0JHRUxfSSwKLSAgICBNX0JHRVUsCi0gICAgTV9CR0VVTCwKLSAgICBNX0JHRVVfSSwKLSAgICBNX0JHRVVMX0ksCi0gICAgTV9CR1QsCi0gICAgTV9CR1RMLAotICAgIE1fQkdUX0ksCi0gICAgTV9CR1RMX0ksCi0gICAgTV9CR1RVLAotICAgIE1fQkdUVUwsCi0gICAgTV9CR1RVX0ksCi0gICAgTV9CR1RVTF9JLAotICAgIE1fQkxFLAotICAgIE1fQkxFTCwKLSAgICBNX0JMRV9JLAotICAgIE1fQkxFTF9JLAotICAgIE1fQkxFVSwKLSAgICBNX0JMRVVMLAotICAgIE1fQkxFVV9JLAotICAgIE1fQkxFVUxfSSwKLSAgICBNX0JMVCwKLSAgICBNX0JMVEwsCi0gICAgTV9CTFRfSSwKLSAgICBNX0JMVExfSSwKLSAgICBNX0JMVFUsCi0gICAgTV9CTFRVTCwKLSAgICBNX0JMVFVfSSwKLSAgICBNX0JMVFVMX0ksCi0gICAgTV9CTkUsCi0gICAgTV9CTkVfSSwKLSAgICBNX0JORUxfSSwKLSAgICBNX0RBQlMsCi0gICAgTV9EQUREX0ksCi0gICAgTV9EQUREVV9JLAotICAgIE1fRERJVl8zLAotICAgIE1fRERJVl8zSSwKLSAgICBNX0RESVZVXzMsCi0gICAgTV9ERElWVV8zSSwKLSAgICBNX0RJVl8zLAotICAgIE1fRElWXzNJLAotICAgIE1fRElWVV8zLAotICAgIE1fRElWVV8zSSwKLSAgICBNX0RMQV9BQiwKLSAgICBNX0RMSSwKLSAgICBNX0RNVUwsCi0gICAgTV9ETVVMX0ksIAotICAgIE1fRE1VTE8sCi0gICAgTV9ETVVMT19JLCAKLSAgICBNX0RNVUxPVSwKLSAgICBNX0RNVUxPVV9JLCAKLSAgICBNX0RSRU1fMywKLSAgICBNX0RSRU1fM0ksCi0gICAgTV9EUkVNVV8zLAotICAgIE1fRFJFTVVfM0ksCi0gICAgTV9EU1VCX0ksCi0gICAgTV9EU1VCVV9JLAotICAgIE1fRFNVQlVfSV8yLAotICAgIE1fSl9BLAotICAgIE1fSkFMXzEsCi0gICAgTV9KQUxfMiwKLSAgICBNX0pBTF9BLAotICAgIE1fTF9ET0IsCi0gICAgTV9MX0RBQiwKLSAgICBNX0xBX0FCLAotICAgIE1fTEJfQSwKLSAgICBNX0xCX0FCLAotICAgIE1fTEJVX0EsCi0gICAgTV9MQlVfQUIsCi0gICAgTV9MRF9BLAotICAgIE1fTERfT0IsCi0gICAgTV9MRF9BQiwKLSAgICBNX0xEQzFfQUIsCi0gICAgTV9MREMyX0FCLAotICAgIE1fTERDM19BQiwKLSAgICBNX0xETF9BQiwKLSAgICBNX0xEUl9BQiwKLSAgICBNX0xIX0EsCi0gICAgTV9MSF9BQiwKLSAgICBNX0xIVV9BLAotICAgIE1fTEhVX0FCLAotICAgIE1fTEksCi0gICAgTV9MSV9ELAotICAgIE1fTElfREQsCi0gICAgTV9MSV9TLAotICAgIE1fTElfU1MsCi0gICAgTV9MTF9BQiwKLSAgICBNX0xMRF9BQiwKLSAgICBNX0xTX0EsCi0gICAgTV9MV19BLAotICAgIE1fTFdfQUIsCi0gICAgTV9MV0MwX0EsCi0gICAgTV9MV0MwX0FCLAotICAgIE1fTFdDMV9BLAotICAgIE1fTFdDMV9BQiwKLSAgICBNX0xXQzJfQSwKLSAgICBNX0xXQzJfQUIsCi0gICAgTV9MV0MzX0EsCi0gICAgTV9MV0MzX0FCLAotICAgIE1fTFdMX0EsCi0gICAgTV9MV0xfQUIsCi0gICAgTV9MV1JfQSwKLSAgICBNX0xXUl9BQiwKLSAgICBNX0xXVV9BQiwKLSAgICBNX01VTCwKLSAgICBNX01VTF9JLCAKLSAgICBNX01VTE8sCi0gICAgTV9NVUxPX0ksIAotICAgIE1fTVVMT1UsCi0gICAgTV9NVUxPVV9JLCAKLSAgICBNX05PUl9JLAotICAgIE1fT1JfSSwKLSAgICBNX1JFTV8zLAotICAgIE1fUkVNXzNJLAotICAgIE1fUkVNVV8zLAotICAgIE1fUkVNVV8zSSwKLSAgICBNX1JPTCwKLSAgICBNX1JPTF9JLAotICAgIE1fUk9SLAotICAgIE1fUk9SX0ksCi0gICAgTV9TX0RBLAotICAgIE1fU19ET0IsCi0gICAgTV9TX0RBQiwKLSAgICBNX1NfUywKLSAgICBNX1NDX0FCLAotICAgIE1fU0NEX0FCLAotICAgIE1fU0RfQSwKLSAgICBNX1NEX09CLAotICAgIE1fU0RfQUIsCi0gICAgTV9TREMxX0FCLAotICAgIE1fU0RDMl9BQiwKLSAgICBNX1NEQzNfQUIsCi0gICAgTV9TRExfQUIsCi0gICAgTV9TRFJfQUIsCi0gICAgTV9TRVEsCi0gICAgTV9TRVFfSSwKLSAgICBNX1NHRSwKLSAgICBNX1NHRV9JLAotICAgIE1fU0dFVSwKLSAgICBNX1NHRVVfSSwKLSAgICBNX1NHVCwKLSAgICBNX1NHVF9JLAotICAgIE1fU0dUVSwKLSAgICBNX1NHVFVfSSwKLSAgICBNX1NMRSwKLSAgICBNX1NMRV9JLAotICAgIE1fU0xFVSwKLSAgICBNX1NMRVVfSSwKLSAgICBNX1NMVF9JLAotICAgIE1fU0xUVV9JLAotICAgIE1fU05FLAotICAgIE1fU05FX0ksCi0gICAgTV9TQl9BLAotICAgIE1fU0JfQUIsCi0gICAgTV9TSF9BLAotICAgIE1fU0hfQUIsCi0gICAgTV9TV19BLAotICAgIE1fU1dfQUIsCi0gICAgTV9TV0MwX0EsCi0gICAgTV9TV0MwX0FCLAotICAgIE1fU1dDMV9BLAotICAgIE1fU1dDMV9BQiwKLSAgICBNX1NXQzJfQSwKLSAgICBNX1NXQzJfQUIsCi0gICAgTV9TV0MzX0EsCi0gICAgTV9TV0MzX0FCLAotICAgIE1fU1dMX0EsCi0gICAgTV9TV0xfQUIsCi0gICAgTV9TV1JfQSwKLSAgICBNX1NXUl9BQiwKLSAgICBNX1NVQl9JLAotICAgIE1fU1VCVV9JLAotICAgIE1fU1VCVV9JXzIsCi0gICAgTV9URVFfSSwKLSAgICBNX1RHRV9JLAotICAgIE1fVEdFVV9JLAotICAgIE1fVExUX0ksCi0gICAgTV9UTFRVX0ksCi0gICAgTV9UTkVfSSwKLSAgICBNX1RSVU5DV0QsCi0gICAgTV9UUlVOQ1dTLAotICAgIE1fVUxELAotICAgIE1fVUxEX0EsCi0gICAgTV9VTEgsCi0gICAgTV9VTEhfQSwKLSAgICBNX1VMSFUsCi0gICAgTV9VTEhVX0EsCi0gICAgTV9VTFcsCi0gICAgTV9VTFdfQSwKLSAgICBNX1VTSCwKLSAgICBNX1VTSF9BLAotICAgIE1fVVNXLAotICAgIE1fVVNXX0EsCi0gICAgTV9VU0QsCi0gICAgTV9VU0RfQSwKLSAgICBNX1hPUl9JLAotICAgIE1fQ09QMCwKLSAgICBNX0NPUDEsCi0gICAgTV9DT1AyLAotICAgIE1fQ09QMywKLSAgICBNX05VTV9NQUNST1MKLX07Ci0KLQotLyogVGhlIG9yZGVyIG9mIG92ZXJsb2FkZWQgaW5zdHJ1Y3Rpb25zIG1hdHRlcnMuICBMYWJlbCBhcmd1bWVudHMgYW5kCi0gICByZWdpc3RlciBhcmd1bWVudHMgbG9vayB0aGUgc2FtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgZWl0aGVyCi0gICBmb3IgYXJndW1lbnRzIG11c3QgYXBlYXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhpcyB0YWJsZSBmb3IgdGhlCi0gICBhc3NlbWJsZXIgdG8gcGljayB0aGUgcmlnaHQgb25lLiBJbiBvdGhlciB3b3JkcywgZW50cmllcyB3aXRoCi0gICBpbW1lZGlhdGUgb3BlcmFuZHMgbXVzdCBhcGVhciBhZnRlciB0aGUgc2FtZSBpbnN0cnVjdGlvbiB3aXRoCi0gICByZWdpc3RlcnMuCi0KLSAgIE1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCBoYW5kIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKGkuZS4sIFRoZQotICAgamFsIDxyZWdpc3Rlcj4gaW5zdHJ1Y3Rpb24gaXMgc2hvcnQgZm9yIGphbHIgPHJlZ2lzdGVyPikuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHNfYnVpbHRpbl9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXM7Ci1leHRlcm4gc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX29wY29kZXM7Ci1leHRlcm4gaW50IGJmZF9taXBzX251bV9vcGNvZGVzOwotI2RlZmluZSBOVU1PUENPREVTIGJmZF9taXBzX251bV9vcGNvZGVzCi0KLQwKLS8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBhZGRzIGRlZmluaXRpb25zIGZvciB0aGUgbWlwczE2IFRpbnlSSVNDCi0gICBwcm9jZXNzb3IuICAqLwotCi0vKiBUaGVzZSBhcmUgdGhlIGJpdG1hc2tzIGFuZCBzaGlmdCBjb3VudHMgdXNlZCBmb3IgdGhlIGRpZmZlcmVudAotICAgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgT3RoZXIgdGhhbiBPUCwgbm8gbWFza3MgYXJlCi0gICBwcm92aWRlZCBmb3IgdGhlIGZpeGVkIHBvcnRpb25zIG9mIGFuIGluc3RydWN0aW9uLCBzaW5jZSB0aGV5IGFyZQotICAgbm90IG5lZWRlZC4KLQotICAgVGhlIEkgZm9ybWF0IHVzZXMgSU1NMTEuCi0KLSAgIFRoZSBSSSBmb3JtYXQgdXNlcyBSWCBhbmQgSU1NOC4KLQotICAgVGhlIFJSIGZvcm1hdCB1c2VzIFJYLCBhbmQgUlkuCi0KLSAgIFRoZSBSUkkgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgSU1NNS4KLQotICAgVGhlIFJSUiBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBSWi4KLQotICAgVGhlIFJSSV9BIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIElNTTQuCi0KLSAgIFRoZSBTSElGVCBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBTSEFNVC4KLQotICAgVGhlIEk4IGZvcm1hdCB1c2VzIElNTTguCi0KLSAgIFRoZSBJOF9NT1ZSMzIgZm9ybWF0IHVzZXMgUlkgYW5kIFJFR1IzMi4KLQotICAgVGhlIElSX01PVjMyUiBmb3JtYXQgdXNlcyBSRUczMlIgYW5kIE1PVjMyWi4KLQotICAgVGhlIEk2NCBmb3JtYXQgdXNlcyBJTU04LgotCi0gICBUaGUgUkk2NCBmb3JtYXQgdXNlcyBSWSBhbmQgSU1NNS4KLSAgICovCi0KLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19PUAkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX09QCQkxMQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTExCTB4N2ZmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTExCTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SWAkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUlgJCTgKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU04CTB4ZmYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfSU1NOAkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUlkJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX1JZCQk1Ci0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNQkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTUJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JaCTB4NwotI2RlZmluZSBNSVBTMTZPUF9TSF9SWgkJMgotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTQJMHhmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTQJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JFR1IzMgkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX1JFR1IzMgkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUkVHMzJSCTB4MWYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUkVHMzJSCTMKLSNkZWZpbmUgTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIoaSkgKCgoKGkpID4+IDUpICYgNykgfCAoKGkpICYgMHgxOCkpCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfTU9WRTMyWgkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfTU9WRTMyWgkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNgkweDNmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTYJNQotCi0vKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhcnMgaW4gdGhlIGFyZ3MgZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9uLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgYXBwZWFyCi0gICB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkLiAgQ29tbWFzIGFuZCBwYXJlbnRoZXNlcyBpbiB0aGUgYXJncwotICAgc3RyaW5nIGFyZSBpZ25vcmVkIHdoZW4gYXNzZW1ibGluZywgYW5kIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0Ci0gICB3aGVuIGRpc2Fzc2VtYmxpbmcuCi0KLSAgICJ5IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWSkKLSAgICJ4IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWCkKLSAgICJ6IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWikKLSAgICJaIiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9NT1ZFMzJaKQotICAgInYiIDMgYml0IHNhbWUgcmVnaXN0ZXIgYXMgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoTUlQUzE2T1BfKl9SWCkKLSAgICJ3IiAzIGJpdCBzYW1lIHJlZ2lzdGVyIGFzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE1JUFMxNk9QXypfUlkpCi0gICAiMCIgemVybyByZWdpc3RlciAoJDApCi0gICAiUyIgc3RhY2sgcG9pbnRlciAoJHNwIG9yICQyOSkKLSAgICJQIiBwcm9ncmFtIGNvdW50ZXIKLSAgICJSIiByZXR1cm4gYWRkcmVzcyByZWdpc3RlciAoJHJhIG9yICQzMSkKLSAgICJYIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFR1IzMikKLSAgICJZIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFRzMyUikKLSAgICI2IiA2IGJpdCB1bnNpZ25lZCBicmVhayBjb2RlIChNSVBTMTZPUF8qX0lNTTYpCi0gICAiYSIgMjYgYml0IGp1bXAgYWRkcmVzcwotICAgImUiIDExIGJpdCBleHRlbnNpb24gdmFsdWUKLSAgICJsIiByZWdpc3RlciBsaXN0IGZvciBlbnRyeSBpbnN0cnVjdGlvbgotICAgIkwiIHJlZ2lzdGVyIGxpc3QgZm9yIGV4aXQgaW5zdHJ1Y3Rpb24KLQotICAgVGhlIHJlbWFpbmluZyBjb2RlcyBtYXkgYmUgZXh0ZW5kZWQuICBFeGNlcHQgYXMgb3RoZXJ3aXNlIG5vdGVkLAotICAgdGhlIGZ1bGwgZXh0ZW5kZWQgb3BlcmFuZCBpcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUuCi0gICAiPCIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JaKSAoZnVsbCA1IGJpdCB1bnNpZ25lZCkKLSAgICI+IiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlgpIChmdWxsIDUgYml0IHVuc2lnbmVkKQotICAgIlsiIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWikgKGZ1bGwgNiBiaXQgdW5zaWduZWQpCi0gICAiXSIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JYKSAoZnVsbCA2IGJpdCB1bnNpZ25lZCkKLSAgICI0IiA0IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU00KSAoZnVsbCAxNSBiaXQgc2lnbmVkKQotICAgIjUiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNSkKLSAgICJIIiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAyIChNSVBTMTZPUF8qX0lNTTUpCi0gICAiVyIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogNCAoTUlQUzE2T1BfKl9JTU01KQotICAgIkQiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NNSkKLSAgICJqIiA1IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU01KQotICAgIjgiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJWIiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA0IChNSVBTMTZPUF8qX0lNTTgpCi0gICAiQyIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogOCAoTUlQUzE2T1BfKl9JTU04KQotICAgIlUiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkgKGZ1bGwgMTYgYml0IHVuc2lnbmVkKQotICAgImsiIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpCi0gICAiSyIgOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NOCkKLSAgICJwIiA4IGJpdCBjb25kaXRpb25hbCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU04KQotICAgInEiIDExIGJpdCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU0xMSkKLSAgICJBIiA4IGJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzICogNCAoTUlQUzE2T1BfKl9JTU04KQotICAgIkIiIDUgYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKiA4IChNSVBTMTZPUF8qX0lNTTUpCi0gICAiRSIgNSBiaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqIDQgKE1JUFMxNk9QXypfSU1NNSkKLSAgICovCi0KLS8qIEZvciB0aGUgbWlwczE2LCB3ZSB1c2UgdGhlIHNhbWUgb3Bjb2RlIHRhYmxlIGZvcm1hdCBhbmQgYSBmZXcgb2YKLSAgIHRoZSBzYW1lIGZsYWdzLiAgSG93ZXZlciwgbW9zdCBvZiB0aGUgZmxhZ3MgYXJlIGRpZmZlcmVudC4gICovCi0KLS8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JYLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWAkJICAgIDB4MDAwMDAwMDEKLS8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JZLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWQkJICAgIDB4MDAwMDAwMDIKLS8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JaLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWgkJICAgIDB4MDAwMDAwMDQKLS8qIE1vZGlmaWVzIHRoZSBUICgkMjQpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfVAkJICAgIDB4MDAwMDAwMDgKLS8qIE1vZGlmaWVzIHRoZSBTUCAoJDI5KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1NQCQkgICAgMHgwMDAwMDAxMAotLyogTW9kaWZpZXMgdGhlIFJBICgkMzEpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfMzEJCSAgICAweDAwMDAwMDIwCi0vKiBNb2RpZmllcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUkVHMzJSLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kJCSAgICAweDAwMDAwMDQwCi0vKiBSZWFkcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWC4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWAkJICAgIDB4MDAwMDAwODAKLS8qIFJlYWRzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JZLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9ZCQkgICAgMHgwMDAwMDEwMAotLyogUmVhZHMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfTU9WRTMyWi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWgkJICAgIDB4MDAwMDAyMDAKLS8qIFJlYWRzIHRoZSBUICgkMjQpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9UCQkgICAgMHgwMDAwMDQwMAotLyogUmVhZHMgdGhlIFNQICgkMjkpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9TUAkJICAgIDB4MDAwMDA4MDAKLS8qIFJlYWRzIHRoZSBSQSAoJDMxKSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfMzEJCSAgICAweDAwMDAxMDAwCi0vKiBSZWFkcyB0aGUgcHJvZ3JhbSBjb3VudGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9QQwkJICAgIDB4MDAwMDIwMDAKLS8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SRUdSMzIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX0dQUl9YCQkgICAgMHgwMDAwNDAwMAotLyogSXMgYSBicmFuY2ggaW5zbi4gKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fQlJBTkNIICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotCi0vKiBUaGUgZm9sbG93aW5nIGZsYWdzIGhhdmUgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZSBtaXBzMTYgb3Bjb2RlCi0gICB0YWJsZToKLSAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotICAgSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotICAgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkgKG5ldmVyIHVzZWQpCi0gICBJTlNOX1JFQURfSEkKLSAgIElOU05fUkVBRF9MTwotICAgSU5TTl9XUklURV9ISQotICAgSU5TTl9XUklURV9MTwotICAgSU5TTl9UUkFQCi0gICBJTlNOX0lTQTMKLSAgICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwczE2X29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgYmZkX21pcHMxNl9udW1fb3Bjb2RlczsKLQotI2VuZGlmIC8qIF9NSVBTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tbjEwMjAwLmggYi9pbmNsdWRlL29wY29kZS9tbjEwMjAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZmE5NGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbW4xMDIwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIG1uMTAyMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTWF0c3VzaGl0YSAxMDIwMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKZWZmIExhdywgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNTjEwMjAwX0gKLSNkZWZpbmUgTU4xMDIwMF9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAyMDBfb3Bjb2RlLiAgKi8KLQotc3RydWN0IG1uMTAyMDBfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCi0gICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQotICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBUaGUgZm9ybWF0IG9mIHRoaXMgb3Bjb2RlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBmb3JtYXQ7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgbW4xMDIwMF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IG1uMTAyMDBfbnVtX29wY29kZXM7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IG1uMTAyMDBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICBpbnQgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIG1uMTAyMDBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kIG1uMTAyMDBfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBtbjEwMjAwX29wZXJhbmQuICAqLwotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfRFJFRyAweDEKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfQVJFRyAweDIKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUFNXIDB4NAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9NRFIgMHg4Ci0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCAweDEwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BST01PVEUgMHgyMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QQVJFTiAweDQwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEIDB4ODAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUQgMHgxMDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSyAweDIwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCAweDQwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9NRU1BRERSIDB4ODAwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1JFTEFYIDB4MTAwMAotCi0jZGVmaW5lIEZNVF8xIDEKLSNkZWZpbmUgRk1UXzIgMgotI2RlZmluZSBGTVRfMyAzCi0jZGVmaW5lIEZNVF80IDQKLSNkZWZpbmUgRk1UXzUgNQotI2RlZmluZSBGTVRfNiA2Ci0jZGVmaW5lIEZNVF83IDcKLSNlbmRpZiAvKiBNTjEwMjAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL21uMTAzMDAuaCBiL2luY2x1ZGUvb3Bjb2RlL21uMTAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmMDM2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyogbW4xMDMwMC5oIC0tIEhlYWRlciBmaWxlIGZvciBNYXRzdXNoaXRhIDEwMzAwIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEplZmYgTGF3LCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE1OMTAzMDBfSAotI2RlZmluZSBNTjEwMzAwX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUuICAqLwotCi0jZGVmaW5lIE1OMTAzMDBfTUFYX09QRVJBTkRTIDgKLXN0cnVjdCBtbjEwMzAwX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogQSBiaXRtYXNrLiAgRm9yIGVhY2ggb3BlcmFuZCwgbm9uemVybyBpZiBpdCBtdXN0IG5vdCBoYXZlIHRoZSBzYW1lCi0gICAgIHJlZ2lzdGVyIHNwZWNpZmljYXRpb24gYXMgYWxsIG90aGVyIG9wZXJhbmRzIHdpdGggYSBub256ZXJvIGJpdCBpbgotICAgICB0aGlzIGZsYWcuICBpZSAweDgxIHdvdWxkIGluZGljYXRlIHRoYXQgb3BlcmFuZHMgNyBhbmQgMCBtdXN0IG5vdAotICAgICBtYXRjaC4gIE5vdGUgdGhhdCB3ZSBjb3VudCBvcGVyYW5kcyBmcm9tIGxlZnQgdG8gcmlnaHQgYXMgdGhleSBhcHBlYXIKLSAgICAgaW4gdGhlIG9wZXJhbmRzIHNwZWNpZmljYXRpb24gYmVsb3cuICAqLwotICB1bnNpZ25lZCBpbnQgbm9fbWF0Y2hfb3BlcmFuZHM7Ci0KLSAgLyogVGhlIGZvcm1hdCBvZiB0aGlzIG9wY29kZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0OwotCi0gIC8qIEJpdG1hc2sgaW5kaWNhdGluZyB3aGF0IGNwdSB2YXJpYW50cyB0aGlzIG9wY29kZSBpcyBhdmFpbGFibGUgb24uCi0gICAgIFdlIGFzc3VtZSBtbjEwMzAwIGJhc2Ugb3Bjb2RlcyBhcmUgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUsIHNvIHdlIG9ubHkKLSAgICAgaGF2ZSB0byBub3RlIG9wY29kZXMgd2hpY2ggYXJlIGF2YWlsYWJsZSBvbiBvdGhlciB2YXJpYW50cy4gICovCi0gIHVuc2lnbmVkIGludCBtYWNoaW5lOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbTU4xMDMwMF9NQVhfT1BFUkFORFNdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wY29kZSBtbjEwMzAwX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgbW4xMDMwMF9udW1fb3Bjb2RlczsKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBtbjEwMzAwX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kCi17Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGludCBzaGlmdDsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIGludCBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgbW4xMDMwMF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgbW4xMDMwMF9vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IG1uMTAzMDBfb3BlcmFuZC4gICovCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9EUkVHIDB4MQotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9BUkVHIDB4MgotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TUCAweDQKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUFNXIDB4OAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9NRFIgMHgxMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgMHgyMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIDB4NDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUEFSRU4gMHg4MAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCAweDEwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCAweDIwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TUExJVCAweDQwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVCAweDgwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCAweDEwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfTUVNQUREUiAweDIwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVMQVggMHg0MDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1VTUCAweDgwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1NQIDB4MTAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfTVNQIDB4MjAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUEMgMHg0MDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9FUFNXIDB4ODAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUlJFRyAweDEwMDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9YUlJFRyAweDIwMDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QTFVTIDB4NDAwMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EXzI0QklUIDB4ODAwMDAwCi0KLS8qIE9wY29kZSBGb3JtYXRzLiAgKi8KLSNkZWZpbmUgRk1UX1MwIDEKLSNkZWZpbmUgRk1UX1MxIDIKLSNkZWZpbmUgRk1UX1MyIDMKLSNkZWZpbmUgRk1UX1M0IDQKLSNkZWZpbmUgRk1UX1M2IDUKLSNkZWZpbmUgRk1UX0QwIDYKLSNkZWZpbmUgRk1UX0QxIDcKLSNkZWZpbmUgRk1UX0QyIDgKLSNkZWZpbmUgRk1UX0Q0IDkKLSNkZWZpbmUgRk1UX0Q1IDEwCi0jZGVmaW5lIEZNVF9ENiAxMQotI2RlZmluZSBGTVRfRDcgMTIKLSNkZWZpbmUgRk1UX0Q4IDEzCi0jZGVmaW5lIEZNVF9EOSAxNAotI2RlZmluZSBGTVRfRDEwIDE1Ci0KLS8qIFZhcmlhbnRzIG9mIHRoZSBtbjEwMzAwIHdoaWNoIGhhdmUgYWRkaXRpb25hbCBvcGNvZGVzLiAgKi8KLSNkZWZpbmUgTU4xMDMgMzAwCi0jZGVmaW5lIEFNMzAgIDMwMAotCi0jZGVmaW5lIEFNMzMgMzMwCi0KLSNlbmRpZiAvKiBNTjEwMzAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL25wMS5oIGIvaW5jbHVkZS9vcGNvZGUvbnAxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyM2FkYzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbnAxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyogUHJpbnQgR09VTEQgTlBMIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLUdEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGdsZF9vcGNvZGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgY2hhciAqYXJnczsKLSAgaW50IGxlbmd0aDsKLX07Ci0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQKLSAgIGlzIHRoZSBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbgotICAgaXMgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBhdCBtb3N0IGZvdXIuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgYmFzZWQgb24gdGhlIG9wY29kZS4KLQotICAgVGhlIG1hc2sgY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzCi0gICB0aGF0IGFyZSB1c2VkIHRvIGZvcm1hdCB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICByICBSZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgUiAgUmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICBiICBCYXNlIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBCICBCYXNlIHJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAotICAgdiAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBWICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEEgIE9wdGlvbmFsIGFkZHJlc3MgcmVnaXN0ZXIgKGJhc2UgcmVnaXN0ZXIpCi0gICBYICBPcHRpb25hbCBpbmRleCByZWdpc3RlcgotICAgSSAgSW1tZWRpYXRlIGRhdGEgKDE2Yml0cyBzaWduZWQpCi0gICBPICBPZmZzZXQgZmllbGQgKDE2Yml0cyBzaWduZWQpCi0gICBoICBPZmZzZXQgZmllbGQgKDE1Yml0cyBzaWduZWQpCi0gICBkICBPZmZzZXQgZmllbGQgKDE0Yml0cyBzaWduZWQpCi0gICBTICBTaGlmdCBjb3VudCBmaWVsZAotCi0gICBhbnkgb3RoZXIgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBhcyBpcy4uLgotKi8KLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi1zdHJ1Y3QgZ2xkX29wY29kZSBnbGRfb3Bjb2Rlc1tdID0KLXsKLXsgImxiIiwJCTB4YjQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYnMiLAkweGVjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxoIiwJCTB4YjQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsdyIsCQkweGI0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxudyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGQiLAkJMHhiNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsbmQiLAkweGI4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxpIiwJCTB4ZjgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibHBhIiwJMHg1MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYSIsCQkweDUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxhYnIiLAkweDU4MDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxicCIsCTB4OTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGhwIiwJMHg5MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsd3AiLAkweDkwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxkcCIsCTB4OTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VhYnIiLAkweDU4MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxmIiwJCTB4YmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGZiciIsCTB4YmMwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibHdiciIsCTB4NWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3RiIiwJMHhkNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGgiLAkweGQ0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN0dyIsCTB4ZDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RkIiwJMHhkNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdGYiLAkweGRjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZmJyIiwJMHhkYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdHdiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAiem1iIiwJMHhkODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWgiLAkweGQ4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInptdyIsCTB4ZDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiem1kIiwJMHhkODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdGJwIiwJMHg5NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGhwIiwJMHg5NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdHdwIiwJMHg5NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGRwIiwJMHg5NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsaWwiLAkweGY4MGIwMDAwLAkweGZjN2YwMDAwLAkicixEIiwJCTQgfSwKLXsgImx3c2wxIiwJMHhlYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsd3NsMiIsCTB4ZmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHdzbDMiLAkweGZjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLQoteyAibHZiIiwJMHhiMDA4MDAwMCwJMHhmYzA4MDAwMCwJInYseE9BLFgiLAk0IH0sCi17ICJsdmgiLAkweGIwMDAwMDAxLAkweGZjMDgwMDAxLAkidix4T0EsWCIsCTQgfSwKLXsgImx2dyIsCTB4YjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoteyAibHZkIiwJMHhiMDAwMDAwMiwJMHhmYzA4MDAwMiwJInYseE9BLFgiLAk0IH0sCi17ICJsaXYiLAkweDNjMDQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImxpdmYiLAkweDNjMDgwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN0dmIiLAkweGQwMDgwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dmgiLAkweGQwMDAwMDAxLAkweGZjMDgwMDAxLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dnciLAkweGQwMDAwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dmQiLAkweGQwMDAwMDAyLAkweGZjMDgwMDAyLAkidix4T0EsWCIsCTQgfSwKLQoteyAidHJyIiwJMHgyYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm4iLAkweDJjMDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybmQiLAkweDJjMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYWJzIiwJMHgyYzAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cmFic2QiLAkweDJjMDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYyIsCTB4MmMwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNyIiwJMHgyODA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjeGNyIiwJMHgyYzA2MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjeGNyZCIsCTB4MmMwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidGJyciIsCTB4MmMwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLEIiLAkJMiB9LAoteyAidHJiciIsCTB4MjgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJiLFIiLAkJMiB9LAoteyAieGNiciIsCTB4MjgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAoteyAidGJyYnIiLAkweDI4MDEwMDAwLAkweGZjMGYwMDAwLAkiYixCIiwJCTIgfSwKLQoteyAidHJ2diIsCTB4MjgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2dm4iLAkweDJjMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydnZuZCIsCTB4MmMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2YWIiLAkweDJjMDcwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydmFiZCIsCTB4MmMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiY21wdiIsCTB4MTQwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZXhwdiIsCTB4MTQwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmx0IiwJMHgxMDAzMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2bGUiLAkweDEwMDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZndCIsCTB4MTQwMzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmdlIiwJMHgxNDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2ZXEiLAkweDEwMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZuZSIsCTB4MTAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2cmx0IiwJMHgxMDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZybGUiLAkweDEwMGUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJndCIsCTB4MTQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cmdlIiwJMHgxNDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZyZXEiLAkweDEwMGYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJuZSIsCTB4MTQwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAidHJ2ciIsCTB4MTQwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAidHJydiIsCTB4MTQwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJidSIsCQkweDQwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibnMiLAkweDcwMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibmNvIiwJMHg3MDg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmdlIiwJMHg3MTA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYm5lIiwJMHg3MTg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVuZ2UiLAkweDcyMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJidW5sZSIsCTB4NzI4ODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJndCIsCTB4NzMwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJuYW55IiwJMHg3Mzg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnMiCSwJMHg3MDAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmNvIiwJMHg3MDgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmx0IiwJMHg3MTAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmVxIiwJMHg3MTgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVnZSIsCTB4NzIwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJ1bHQiLAkweDcyODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibGUiLAkweDczMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiYW55IiwJMHg3MzgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnJsbmsiLAkweDQ0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpYiIsCTB4NDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmloIiwJMHg0ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXciLAkweDRjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpZCIsCTB4NGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2YiIsCTB4NjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2aCIsCTB4NjAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2dyIsCTB4NjQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2ZCIsCTB4NjQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzYiIsCTB4NjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzaCIsCTB4NjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzdyIsCTB4NmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzZCIsCTB4NmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAotCi17ICJjYW1iIiwJMHg4MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1oIiwJMHg4MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJjYW13IiwJMHg4MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1kIiwJMHg4MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJjYXIiLAkweDEwMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNhcmQiLAkweDE0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNpIiwJCTB4ZjgwNTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiY2hrYm5kIiwJMHg1YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgImNhdnYiLAkweDEwMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImNhdnIiLAkweDEwMDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImNhdnZkIiwJMHgxMDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjYXZyZCIsCTB4MTAwYjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJhbm1iIiwJMHg4NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1oIiwJMHg4NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhbm13IiwJMHg4NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1kIiwJMHg4NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhbnIiLAkweDA0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFuaSIsCTB4ZjgwODAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAib3JtYiIsCTB4YjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtaCIsCTB4YjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtdyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JyIiwJMHgwODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJvaSIsCQkweGY4MDkwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImVvbWIiLAkweDhjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWgiLAkweDhjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbXciLAkweDhjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWQiLAkweDhjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImVvciIsCTB4MGMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZW9pIiwJMHhmODBhMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi0KLXsgImFudnYiLAkweDA0MDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFudnIiLAkweDA0MDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm9ydnYiLAkweDA4MDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm9ydnIiLAkweDA4MDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImVvdnYiLAkweDBjMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImVvdnIiLAkweDBjMDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAic2FjeiIsCTB4MTAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2xhIiwJMHgxYzQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGwiLAkweDFjNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsYyIsCTB4MjQ0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xhZCIsCTB4MjA0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xsZCIsCTB4MjA2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JhIiwJMHgxYzAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmwiLAkweDFjMjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYyIsCTB4MjQwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JhZCIsCTB4MjAwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsZCIsCTB4MjAyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2RhIiwJMHgzYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzZGwiLAkweDNjMDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNkYyIsCTB4M2MwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RhZCIsCTB4M2MwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RsZCIsCTB4M2MwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJzdmRhIiwJMHgzYzA3MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRsIiwJMHgzYzA2MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRjIiwJMHgzYzA1MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRhZCIsCTB4M2MwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3ZkbGQiLAkweDNjMGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAic2JtIiwJMHhhYzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ6Ym0iLAkweGFjMDAwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInRibSIsCTB4YTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAiaW5jbWIiLAkweGEwMDAwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJpbmNtaCIsCTB4YTAwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImluY213IiwJMHhhNDAwMDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiaW5jbWQiLAkweGE0MDgwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJzYm1kIiwJMHg3YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6Ym1kIiwJMHg3YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ0Ym1kIiwJMHg3ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgInNzbSIsCTB4OWMwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAienNtIiwJMHg5YzAwMDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ0c20iLAkweDk4MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLQoteyAiYWRtYiIsCTB4YzgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtaCIsCTB4YzgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtdyIsCTB4YzgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtZCIsCTB4YzgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRyIiwJMHgzODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhcm1iIiwJMHhlODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1oIiwJMHhlODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhcm13IiwJMHhlODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1kIiwJMHhlODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZGkiLAkweGY4MDEwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgInN1bWIiLAkweGNjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWgiLAkweGNjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bXciLAkweGNjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWQiLAkweGNjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ciIsCTB4M2MwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VpIiwJMHhmODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJtcG1iIiwJMHhjMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcG1oIiwJMHhjMDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJtcG13IiwJMHhjMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcHIiLAkweDM4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wcmQiLAkweDNjMGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1waSIsCTB4ZjgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZHZtYiIsCTB4YzQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtaCIsCTB4YzQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtdyIsCTB4YzQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZyIiwJMHgzODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkdmkiLAkweGY4MDQwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgImV4cyIsCTB4MzgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJhZHZ2IiwJMHgzMDAwMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHZ2ZCIsCTB4MzAwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYWRydiIsCTB4MzQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiYWRydmQiLAkweDM0MDgwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1dnYiLAkweDMwMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1dnZkIiwJMHgzMDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJzdXJ2IiwJMHgzNDAxMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXJ2ZCIsCTB4MzQwOTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXB2diIsCTB4MzAwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXBydiIsCTB4MzQwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJhZGZ3IiwJMHhlMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZGZkIiwJMHhlMDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZHJmdyIsCTB4MzgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRyZmQiLAkweDM4MDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cmZ3IiwJMHhlMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdXJmZCIsCTB4ZTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyZnciLAkweDM4MDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cmZkIiwJMHgzODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcGZ3IiwJMHhlNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcGZkIiwJMHhlNDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJtcHJmdyIsCTB4MzgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZmQiLAkweDM4MGUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInJmdyIsCTB4ZTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAicmZkIiwJMHhlNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJycmZ3IiwJMHgwYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAicnJmZCIsCTB4MGMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLQoteyAiYWR2dmZ3IiwJMHgzMDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHZ2ZmQiLAkweDMwMGMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFkcnZmdyIsCTB4MzQwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiYWRydmZkIiwJMHgzNDBjMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXZ2ZnciLAkweDMwMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1dnZmZCIsCTB4MzAwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAic3VydmZ3IiwJMHgzNDA1MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXJ2ZmQiLAkweDM0MGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1wdnZmdyIsCTB4MzAwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXB2dmZkIiwJMHgzMDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcHJ2ZnciLAkweDM0MDYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1wcnZmZCIsCTB4MzQwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAicnZmdyIsCTB4MzAwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2IiwJCTIgfSwKLXsgInJ2ZmQiLAkweDMwMGYwMDAwLAkweGZjMGYwMDAwLAkidiIsCQkyIH0sCi0KLXsgImZsdHciLAkweDM4MDcwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZsdGQiLAkweDM4MGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZpeHciLAkweDM4MDUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZpeGQiLAkweDM4MGQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNmcGRzIiwJMHgzYzA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgImZsdHZ3IiwJMHgwODBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJmbHR2ZCIsCTB4MDgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZml4dnciLAkweDA4MGMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImZpeHZkIiwJMHgwODBlMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjZnB2ZHMiLAkweDBjMGQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLQoteyAib3J2cm4iLAkweDAwMGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgImFuZHZybiIsCTB4MDAwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAiZnJzdGVxIiwJMHgwNDA5MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtYSIsCTB4MGMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWFkIiwJMHgwYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtZiIsCTB4MDgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWZkIiwJMHgwODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJwcm9kZiIsCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAicHJvZGZkIiwJMHgwNDBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtYXh2IiwJMHgxMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtYXh2ZCIsCTB4MTAwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWludiIsCTB4MTQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWludmQiLAkweDE0MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLQoteyAibHBzZCIsCTB4ZjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImxkYyIsCTB4ZjAwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgInNwbSIsCTB4MDQwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJwbSIsCTB4MDQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRyaXRyIiwJMHgwMDA3MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJyaXQiLAkweDAwMDYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJycHN3dCIsCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4ciIsCTB4ZjgwNzAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJNCB9LAoteyAiaGFsdCIsCTB4MDAwMDAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAid2FpdCIsCTB4MDAwMTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAibm9wIiwJMHgwMDAyMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJlaWFlIiwJMHgwMDAzMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJlZmFlIiwJMHgwMDBkMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJkaWFlIiwJMHgwMDBlMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJkZmFlIiwJMHgwMDBmMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJzcHZjIiwJMHhmODA2MDAwMCwJMHhmYzBmMDAwMCwJInIsVCxOIiwJNCB9LAoteyAicmRzdHMiLAkweDAwMDkwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJzZXRjcHUiLAkweDAwMGMwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJjbWMiLAkweDAwMGIwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cnJjdSIsCTB4MDAwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImF0dG5pbyIsCTB4MDAwNTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiZnVkaXQiLAkweDI4MDgwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImJyZWFrIiwJMHgyODA5MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJmcnpzcyIsCTB4MjgwYTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAicmlwaSIsCTB4MDQwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNwIiwJMHgwNDA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiYmxvY2siLAkweDA0MDYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInVuYmxvY2siLAkweDA0MDcwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInRyc2MiLAkweDA4MDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRzY3IiLAkweDA4MDcwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZxIiwJCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImZsdXB0ZSIsCTB4MmMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJ2aXUiLAkweDA0MGYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImxkZWwiLAkweDI4MGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxkdSIsCTB4MjgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3RkZWNjIiwJMHgyODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnBjIiwJMHgwODA0MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHBjciIsCTB4MDgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImdoYWx0IiwJMHgwYzA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZ3J1biIsCTB4MGMwNDAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAidG1wciIsCTB4MmMwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJtcCIsCTB4MmMwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJ0cnJ2ZSIsCTB4MjgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRydmVyIiwJMHgyODA3MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJ2bHIiLAkweDI4MGYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi0KLXsgImxpbmtmbCIsCTB4MTgwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua2JsIiwJMHgxODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsaW5rZnAiLAkweDE4MDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxpbmticCIsCTB4MTgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua3BsIiwJMHgxODA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1bGlua2wiLAkweDE4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVsaW5rcCIsCTB4MTgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmt0bCIsCTB4MTgwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmt0cCIsCTB4MTgwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotfTsKLQotaW50IG51bW9wY29kZXMgPSBzaXplb2YoZ2xkX29wY29kZXMpIC8gc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKLQotc3RydWN0IGdsZF9vcGNvZGUgKmVuZG9wID0gZ2xkX29wY29kZXMgKyBzaXplb2YoZ2xkX29wY29kZXMpIC8KLQkJIAkJc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmggYi9pbmNsdWRlL29wY29kZS9uczMyay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmJiOGI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLyogbnMzMmstb3Bjb2RlLmggLS0gT3Bjb2RlIHRhYmxlIGZvciBOYXRpb25hbCBTZW1pIDMyayBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZGVmaW5lIERFRl9NT0RFTCAyMQotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVDCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVMCi0jZGVmaW5lIERFRl9NT0RFTCAyMAotI2VuZGlmCi0vKgotICAgQWZ0ZXIgZGVjaWRpbmcgdGhlIGluc3RydWN0aW9uIGVudHJ5ICh2aWEgaGFzaC5jKSB0aGUgaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICB3aWxsIHRyeSB0byBtYXRjaCB0aGUgb3BlcmFuZHMgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIHRvIHRoZSByZXF1aXJlZCBzZXQKLSAgIGdpdmVuIGluIHRoZSBlbnRyeSBvcGVyYW5kZmllbGQuIEV2ZXJ5IG9wZXJhbmQgd2lsbCByZXN1bHQgaW4gYSBjaGFuZ2UgaW4KLSAgIHRoZSBvcGNvZGUgb3IgdGhlIGFkZGl0aW9uIG9mIGRhdGEgdG8gdGhlIG9wY29kZS4KLSAgIFRoZSBvcGVyYW5kcyBpbiB0aGUgc291cmNlIGluc3RydWN0aW9uIGFyZSBjaGVja2VkIGZvciBpbmNvbnNpc3RlbnQKLSAgIHNlbWFudGljcy4KLSAKLQlGIDogMzIgYml0IGZsb2F0CWdlbmVyYWwgZm9ybQotCUwgOiA2NCBiaXQgZmxvYXQJICAgICIKLQlCIDogYnl0ZQkJICAgICIKLQlXIDogd29yZAkJICAgICIKLQlEIDogZG91YmxlLXdvcmQJCSAgICAiCi0JQSA6IGRvdWJsZS13b3JkCQlnZW4tYWRkcmVzcy1mb3JtIGllIG5vIHJlZ3MsIG5vIGltbWVkaWF0ZQotCUkgOiBpbnRlZ2VyIHdyaXRlYWJsZSAgIGdlbiBpbnQgZXhjZXB0IGltbWVkaWF0ZSAoQSArIHJlZykKLQlaIDogZmxvYXRpbmcgd3JpdGVhYmxlCWdlbiBmbG9hdCBleGNlcHQgaW1tZWRpYXRlIChaICsgZnJlZykKLQlkIDogZGlzcGxhY2VtZW50Ci0JYiA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgIGFjYgotCXAgOiBkaXNwbGFjZW1lbnQgLSBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nICBiciBiY29uZCBic3IgY3hwCi0JcSA6IHF1aWNrCi0JaSA6IGltbWVkaWF0ZSAoOCBiaXRzKQotCSAgICBUaGlzIGlzIG5vdCBhIHN0YW5kYXJkIG5zMzJrIG9wZXJhbmR0eXBlLCBpdCBpcyB1c2VkIHRvIGJ1aWxkCi0JICAgIGluc3RydWN0aW9ucyBsaWtlICAgIHN2YyBhcmcxLGFyZzIKLQkgICAgU3ZjIGlzIHRoZSBpbnN0cnVjdGlvbiBTdXBlclZpc29yQ2FsbCBhbmQgaXMgc29tZXRpbWVzIHVzZWQgdG8KLQkgICAgY2FsbCBPUy1yb3V0aW5lcyBmcm9tIHVzZXJtb2RlLiBTb21lIGFyZ3MgbWlnaHQgYmUgaGFuZHkhCi0JciA6IHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKQotCU8gOiBzZXRjZmcgaW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QKLQlDIDogY2ludiBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCVMgOiBzdHJpbmdpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCVUgOiByZWdpc3Rlcmxpc3QJc2F2ZSxlbnRlcgotCXUgOiByZWdpc3Rlcmxpc3QJcmVzdG9yZSxleGl0Ci0JTSA6IG1tdSByZWdpc3RlcgotCVAgOiBjcHUgcmVnaXN0ZXIKLQlnIDogMzpyZCBvcGVyYW5kIG9mIGluc3Mgb3IgZXh0cyBpbnN0cnVjdGlvbgotCUcgOiA0OnRoIG9wZXJhbmQgb2YgaW5zcyBvciBleHRzIGluc3RydWN0aW9uCi0JICAgIFRob3NlIG9wZXJhbmRzIGFyZSBlbmNvZGVkIGluIHRoZSBzYW1lIGJ5dGUuCi0JICAgIFRoaXMgYnl0ZSBpcyBwbGFjZWQgbGFzdCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0JZiA6IG9wZXJhbmQgb2Ygc2ZzcgotCUggOiBzZXF1ZW50LWhhY2sgZm9yIGJzciAoV2FybmluZykKLQotY29sdW1uCTEgCWluc3RydWN0aW9ucwotCTIgCW51bWJlciBvZiBiaXRzIGluIG9wY29kZS4KLQkzIAludW1iZXIgb2YgYml0cyBpbiBvcGNvZGUgZXhwbGljaXRseQotCQlkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0cnVjdGlvbiB0eXBlLgotCTQgCW9wY29kZXNlZWQsIHRoZSBudW1iZXIgd2UgYnVpbGQgb3VyIG9wY29kZQotCQlmcm9tLgotCTUgCW9wZXJhbmR0eXBlcywgdXNlZCBieSBvcGVyYW5kcGFyc2VyLgotCTYgCXNpemUgaW4gYnl0ZXMgb2YgaW1tZWRpYXRlCi0qLwotc3RydWN0IG5zMzJrX29wY29kZSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX2lkX3NpemU7IC8qIG5vdCB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgKi8KLSAgdW5zaWduZWQgY2hhciBvcGNvZGVfc2l6ZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGVfc2VlZDsKLSAgY2hhciAqb3BlcmFuZHM7Ci0gIHVuc2lnbmVkIGNoYXIgaW1fc2l6ZTsJLyogbm90IHVzZWQgYnkgZGlzc2Fzc2VtYmxlciAqLwotICBjaGFyICpkZWZhdWx0X2FyZ3M7CQkvKiBkZWZhdWx0IHRvIHRob3NlIGFyZ3Mgd2hlbiBub25lIGdpdmVuICovCi0gIGNoYXIgZGVmYXVsdF9tb2RlYzsJCS8qIGRlZmF1bHQgdG8gdGhpcyBhZGRyLW1vZGUgd2hlbiBhbWJpZ291cwotCQkJCSAgIGllIHdoZW4gdGhlIGFyZ3VtZW50IG9mIGEgZ2VuZXJhbCBhZGRyLW1vZGUKLQkJCQkgICBpcyBhIHBsYWluIGNvbnN0YW50ICovCi0gIGNoYXIgZGVmYXVsdF9tb2RlbDsJCS8qIGlzIGEgcGxhaW4gbGFiZWwgKi8KLX07Ci0KLSNpZmRlZiBjb21tZW50Ci0vKiBUaGlzIHNlY3Rpb24gd2FzIGZyb20gdGhlIGdkYiB2ZXJzaW9uIG9mIHRoaXMgZmlsZS4gKi8KLQotI2lmbmRlZiBuczMya19vcGNvZGVUCi0jZGVmaW5lIG5zMzJrX29wY29kZVQgaW50Ci0jZW5kaWYgLyogbm8gbnMzMmtfb3Bjb2RlVCAqLwotCi1zdHJ1Y3Qgbm90X3dvdAkJCS8qIG5zMzJrIG9wY29kZSB0YWJsZTogd290IHRvIGRvIHdpdGggdGhpcyAqLwotCQkJCS8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGludCBvYml0czsJCS8qIG51bWJlciBvZiBvcGNvZGUgYml0cyAqLwotICBpbnQgaWJpdHM7CQkvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gYml0cyAqLwotICBuczMya19vcGNvZGVUCWNvZGU7CS8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi0gIGNoYXIgKmFyZ3M7CQkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotfTsKLQotc3RydWN0IG5vdAkJCS8qIG5zMzJrIG9wY29kZSB0ZXh0ICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIG5hbWU7CS8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IG5vdF93b3QgICAgZGV0YWlsOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0vKiBJbnN0cnVjdGlvbnMgbG9vayBsaWtlIHRoaXM6Ci0gICAgCi0gICBiYXNpYyBpbnN0cnVjdGlvbi0tMSwgMiwgb3IgMyBieXRlcwotICAgaW5kZXggYnl0ZSBmb3Igb3BlcmFuZCBBLCBpZiBvcGVyYW5kIEEgaXMgaW5kZXhlZC0tMSBieXRlCi0gICBpbmRleCBieXRlIGZvciBvcGVyYW5kIEIsIGlmIG9wZXJhbmQgQiBpcyBpbmRleGVkLS0xIGJ5dGUKLSAgIGFkZHJlc3NpbmcgZXh0ZW5zaW9uIGZvciBvcGVyYW5kIEEKLSAgIGFkZHJlc3NpbmcgZXh0ZW5zaW9uIGZvciBvcGVyYW5kIEIKLSAgIGltcGxpZWQgb3BlcmFuZHMKLQotICAgT3BlcmFuZCBBIGlzIHRoZSBvcGVyYW5kIGxpc3RlZCBmaXJzdCBpbiB0aGUgZm9sbG93aW5nIG9wY29kZSB0YWJsZS4KLSAgIE9wZXJhbmQgQiBpcyB0aGUgb3BlcmFuZCBsaXN0ZWQgc2Vjb25kIGluIHRoZSBmb2xsb3dpbmcgb3Bjb2RlIHRhYmxlLgotICAgQWxsIGluc3RydWN0aW9ucyBoYXZlIGF0IG1vc3QgMiBnZW5lcmFsIG9wZXJhbmRzLCBzbyB0aGlzIGlzIGVub3VnaC4KLSAgIFRoZSBpbXBsaWVkIG9wZXJhbmRzIGFyZSBhc3NvY2lhdGVkIHdpdGggb3BlcmFuZHMgb3RoZXIgdGhhbiBBIGFuZCBCLgotCi0gICBFYWNoIG9wZXJhbmQgaGFzIGEgZGlnaXQgYW5kIGEgbGV0dGVyLgotICAgCi0gICBUaGUgZGlnaXQgZ2l2ZXMgdGhlIHBvc2l0aW9uIGluIHRoZSBhc3NlbWJseSBsYW5ndWFnZS4gIFRoZSBsZXR0ZXIsCi0gICBvbmUgb2YgdGhlIGZvbGxvd2luZywgdGVsbHMgdXMgd2hhdCBraW5kIG9mIG9wZXJhbmQgaXQgaXMuICAqLwotCi0vKiBGIDogMzIgYml0IGZsb2F0Ci0gKiBMIDogNjQgYml0IGZsb2F0Ci0gKiBCIDogYnl0ZQotICogVyA6IHdvcmQKLSAqIEQgOiBkb3VibGUtd29yZAotICogSSA6IGludGVnZXIgbm90IGltbWVkaWF0ZQotICogWiA6IGZsb2F0aW5nIG5vdCBpbW1lZGlhdGUKLSAqIGQgOiBkaXNwbGFjZW1lbnQKLSAqIHEgOiBxdWljawotICogaSA6IGltbWVkaWF0ZSAoOCBiaXRzKQotICogciA6IHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKQotICogcCA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSovCi0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgbnMzMmtfb3Bjb2Rlc1tdPQotewotICB7ICJhYnNmIiwJMTQsMjQsCTB4MzViZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzbCIsCTE0LDI0LAkweDM0YmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFic2IiLAkxNCwyNCwJMHgzMDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhYnN3IiwJMTQsMjQsCTB4MzE0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzZCIsCTE0LDI0LAkweDMzNGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYmIiLAkgNywxNiwJMHg0YywJIjJJMXEzcCIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYnciLAkgNywxNiwJMHg0ZCwJIjJJMXEzcCIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYmQiLAkgNywxNiwJMHg0ZiwJIjJJMXEzcCIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGYiLAkxNCwyNCwJMHgwMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRsIiwJMTQsMjQsCTB4MDBiZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkYiIsCSA2LDE2LAkweDAwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGR3IiwJIDYsMTYsCTB4MDEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGQiLAkgNiwxNiwJMHgwMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY2IiLAkgNiwxNiwJMHgxMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY3ciLAkgNiwxNiwJMHgxMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY2QiLAkgNiwxNiwJMHgxMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcGIiLAkxNCwyNCwJMHgzYzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRwdyIsCTE0LDI0LAkweDNkNGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHBkIiwJMTQsMjQsCTB4M2Y0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcWIiLAkgNywxNiwJMHgwYywJIjJJMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcXciLAkgNywxNiwJMHgwZCwJIjJJMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcWQiLAkgNywxNiwJMHgwZiwJIjJJMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkciIsCSA2LDE2LAkweDI3LAkiMUEySSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAiYWRqc3BiIiwJMTEsMTYsCTB4MDU3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkanNwdyIsCTExLDE2LAkweDA1N2QsCSIxVyIsIAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRqc3BkIiwJMTEsMTYsCTB4MDU3ZiwJIjFEIiwgCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhbmRiIiwJIDYsMTYsCTB4MjgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFuZHciLAkgNiwxNiwJMHgyOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYW5kZCIsCSA2LDE2LAkweDJiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhc2hiIiwJMTQsMjQsCTB4MDQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYXNodyIsCTE0LDI0LAkweDA1NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFzaGQiLAkxNCwyNCwJMHgwNzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiZXEiLAkgOCw4LAkweDBhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJuZSIsCSA4LDgsCTB4MWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmNzIiwJIDgsOCwJMHgyYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiY2MiLAkgOCw4LAkweDNhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJoaSIsCSA4LDgsCTB4NGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmxzIiwJIDgsOCwJMHg1YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZ3QiLAkgOCw4LAkweDZhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsZSIsCSA4LDgsCTB4N2EsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmZzIiwJIDgsOCwJMHg4YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZmMiLAkgOCw4LAkweDlhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsbyIsCSA4LDgsCTB4YWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmhzIiwJIDgsOCwJMHhiYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJibHQiLAkgOCw4LAkweGNhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJnZSIsCSA4LDgsCTB4ZGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYnV0IiwJIDgsOCwJMHhlYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJidWYiLAkgOCw4LAkweGZhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJpY2IiLAkgNiwxNiwJMHgwOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmljdyIsCSA2LDE2LAkweDA5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWNkIiwJIDYsMTYsCTB4MGIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpY3BzcmIiLAkxMSwxNiwJMHgxN2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWNwc3J3IiwJMTEsMTYsCTB4MTdkLAkiMVciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmlzcHNyYiIsCTExLDE2LAkweDM3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpc3BzcnciLAkxMSwxNiwJMHgzN2QsCSIxVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJicHQiLAkgOCw4LAkweGYyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJyIiwJIDgsOCwJMHhlYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotICB7ICJic3IiLAkgOCw4LAkweDAyLAkiMUgiLAkJMCwJIiIsCTIxLDIxCX0sCi0jZWxzZQotICB7ICJic3IiLAkgOCw4LAkweDAyLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0jZW5kaWYKLSAgeyAiY2FzZWIiLAkxMSwxNiwJMHg3N2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYXNldyIsCTExLDE2LAkweDc3ZCwJIjFXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNhc2VkIiwJMTEsMTYsCTB4NzdmLAkiMUQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGIiLAkxNCwyNCwJMHgwODRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0dyIsCTE0LDI0LAkweDA5NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXRkIiwJMTQsMjQsCTB4MGI0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGliIiwJMTQsMjQsCTB4MGM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGl3IiwJMTQsMjQsCTB4MGQ0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGlkIiwJMTQsMjQsCTB4MGY0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2tiIiwJMTEsMjQsCTB4MGVlLAkiMkEzQjFyIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2t3IiwJMTEsMjQsCTB4MWVlLAkiMkEzVzFyIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2tkIiwJMTEsMjQsCTB4M2VlLAkiMkEzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2ludiIsCTE0LDI0LAkweDI3MWUsCSIyRDFDIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGYiLAkxNCwyNCwJMHgwOWJlLAkiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBsIiwJMTQsMjQsCTB4MDhiZSwJIjFMMkwiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wYiIsCSA2LDE2LAkweDA0LAkiMUIyQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXB3IiwJIDYsMTYsCTB4MDUsCSIxVzJXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGQiLAkgNiwxNiwJMHgwNywJIjFEMkQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbWIiLAkxNCwyNCwJMHgwNGNlLAkiMUEyQTNiIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbXciLAkxNCwyNCwJMHgwNWNlLAkiMUEyQTNiIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbWQiLAkxNCwyNCwJMHgwN2NlLAkiMUEyQTNiIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcWIiLAkgNywxNiwJMHgxYywJIjJCMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcXciLAkgNywxNiwJMHgxZCwJIjJXMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcWQiLAkgNywxNiwJMHgxZiwJIjJEMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc2IiLAkxNiwyNCwJMHgwNDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBzdyIsCTE2LDI0LAkweDA1MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHNkIiwJMTYsMjQsCTB4MDcwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc3QiLAkxNiwyNCwJMHg4NDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjb21iIiwJMTQsMjQsCTB4MzQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY29tdyIsCTE0LDI0LAkweDM1NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNvbWQiLAkxNCwyNCwJMHgzNzRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjdnRwIiwJMTEsMjQsCTB4MDM2ZSwJIjJBM0QxciIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImN4cCIsCSA4LDgsCTB4MjIsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiY3hwZCIsCTExLDE2LAkweDA3ZiwJIjFBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRlaWIiLAkxNCwyNCwJMHgyY2NlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkZWl3IiwJMTQsMjQsCTB4MmRjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGVpZCIsCTE0LDI0LAkweDJmY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpYSIsCSA4LDgsCTB4YzIsCSIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2ZiIsCTE0LDI0LAkweDIxYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmwiLAkxNCwyNCwJMHgyMGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZiIiwJMTQsMjQsCTB4M2NjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2dyIsCTE0LDI0LAkweDNkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmQiLAkxNCwyNCwJMHgzZmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJlbnRlciIsCSA4LDgsCTB4ODIsCSIxVTJkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4aXQiLAkgOCw4LAkweDkyLAkiMXUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0YiIsCTExLDI0LAkweDAyZSwJIjJJM0IxcjRkIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0dyIsCTExLDI0LAkweDEyZSwJIjJJM1cxcjRkIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0ZCIsCTExLDI0LAkweDMyZSwJIjJJM0QxcjRkIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0c2IiLAkxNCwyNCwJMHgwY2NlLAkiMUkySTRHM2ciLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRzdyIsCTE0LDI0LAkweDBkY2UsCSIxSTJJNEczZyIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dHNkIiwJMTQsMjQsCTB4MGZjZSwJIjFJMkk0RzNnIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmZzYiIsCTE0LDI0LAkweDA0NmUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZmc3ciLAkxNCwyNCwJMHgwNTZlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmZnNkIiwJMTQsMjQsCTB4MDc2ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxhZyIsCSA4LDgsCTB4ZDIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JmYiIsCTE0LDI0LAkweDNjM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29yZnciLAkxNCwyNCwJMHgzZDNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmZkIiwJMTQsMjQsCTB4M2YzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JsYiIsCTE0LDI0LAkweDM4M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29ybHciLAkxNCwyNCwJMHgzOTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmxkIiwJMTQsMjQsCTB4M2IzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaWJpdGIiLAkxNCwyNCwJMHgzODRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpYml0dyIsCTE0LDI0LAkweDM5NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImliaXRkIiwJMTQsMjQsCTB4M2I0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXhiIiwJMTEsMjQsCTB4NDJlLAkiMkIzQjFyIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXh3IiwJMTEsMjQsCTB4NTJlLAkiMlczVzFyIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXhkIiwJMTEsMjQsCTB4NzJlLAkiMkQzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zYiIsCTExLDI0LAkweDBhZSwJIjJCM0kxcjRkIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zdyIsCTExLDI0LAkweDFhZSwJIjJXM0kxcjRkIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zZCIsCTExLDI0LAkweDNhZSwJIjJEM0kxcjRkIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zc2IiLAkxNCwyNCwJMHgwOGNlLAkiMUIySTRHM2ciLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNzdyIsCTE0LDI0LAkweDA5Y2UsCSIxVzJJNEczZyIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc3NkIiwJMTQsMjQsCTB4MGJjZSwJIjFEMkk0RzNnIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAianNyIiwJMTEsMTYsCTB4NjdmLAkiMUEiLAkJNCwJIiIsCTIxLDIxCX0sCi0gIHsgImp1bXAiLAkxMSwxNiwJMHgyN2YsCSIxQSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAibGZzciIsCTE5LDI0LAkweDAwZjNlLCIxRCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsbXIiLAkxNSwyNCwJMHgwYjFlLAkiMkQxTSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJscHJiIiwJIDcsMTYsCTB4NmMsCSIyQjFQIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxwcnciLAkgNywxNiwJMHg2ZCwJIjJXMVAiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHByZCIsCSA3LDE2LAkweDZmLAkiMkQxUCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsc2hiIiwJMTQsMjQsCTB4MTQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHNodyIsCTE0LDI0LAkweDE1NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxzaGQiLAkxNCwyNCwJMHgxNzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtZWliIiwJMTQsMjQsCTB4MjRjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibWVpdyIsCTE0LDI0LAkweDI1Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1laWQiLAkxNCwyNCwJMHgyN2NlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb2RiIiwJMTQsMjQsCTB4MzhjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW9kdyIsCTE0LDI0LAkweDM5Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vZGQiLAkxNCwyNCwJMHgzYmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZmIiwJMTQsMjQsCTB4MDViZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bCIsCTE0LDI0LAkweDA0YmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmIiLAkgNiwxNiwJMHgxNCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dyIsCSA2LDE2LAkweDE1LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkIiwJIDYsMTYsCTB4MTcsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmJmIiwJMTQsMjQsCTB4MDQzZSwJIjFCMloiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92d2YiLAkxNCwyNCwJMHgwNTNlLAkiMVcyWiIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkZiIsCTE0LDI0LAkweDA3M2UsCSIxRDJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmJsIiwJMTQsMjQsCTB4MDAzZSwJIjFCMloiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92d2wiLAkxNCwyNCwJMHgwMTNlLAkiMVcyWiIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkbCIsCTE0LDI0LAkweDAzM2UsCSIxRDJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmZsIiwJMTQsMjQsCTB4MWIzZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bGYiLAkxNCwyNCwJMHgxNjNlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtYiIsCTE0LDI0LAkweDAwY2UsCSIxQTJBM2IiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtdyIsCTE0LDI0LAkweDAxY2UsCSIxQTJBM2IiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtZCIsCTE0LDI0LAkweDAzY2UsCSIxQTJBM2IiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxYiIsCSA3LDE2LAkweDVjLAkiMkkxcSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxdyIsCSA3LDE2LAkweDVkLAkiMkkxcSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxZCIsCSA3LDE2LAkweDVmLAkiMkkxcSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzYiIsCTE2LDI0LAkweDAwMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN3IiwJMTYsMjQsCTB4MDEwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c2QiLAkxNiwyNCwJMHgwMzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzdCIsCTE2LDI0LAkweDgwMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1YiIsCTE0LDI0LAkweDBjYWUsCSIxQTJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1dyIsCTE0LDI0LAkweDBkYWUsCSIxQTJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1ZCIsCTE0LDI0LAkweDBmYWUsCSIxQTJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzYiIsCTE0LDI0LAkweDFjYWUsCSIxQTJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzdyIsCTE0LDI0LAkweDFkYWUsCSIxQTJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzZCIsCTE0LDI0LAkweDFmYWUsCSIxQTJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnhiZCIsCTE0LDI0LAkweDFjY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnh3ZCIsCTE0LDI0LAkweDFkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnhidyIsCTE0LDI0LAkweDEwY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnpiZCIsCTE0LDI0LAkweDE4Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnp3ZCIsCTE0LDI0LAkweDE5Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnpidyIsCTE0LDI0LAkweDE0Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bGYiLAkxNCwyNCwJMHgzMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxsIiwJMTQsMjQsCTB4MzBiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsYiIsCTE0LDI0LAkweDIwY2UsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bHciLAkxNCwyNCwJMHgyMWNlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxkIiwJMTQsMjQsCTB4MjNjZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVnZiIsCTE0LDI0LAkweDE1YmUsICIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2wiLAkxNCwyNCwJMHgxNGJlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWdiIiwJMTQsMjQsCTB4MjA0ZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVndyIsCTE0LDI0LAkweDIxNGUsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2QiLAkxNCwyNCwJMHgyMzRlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3AiLAkgOCw4LAkweGEyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5vdGIiLAkxNCwyNCwJMHgyNDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3R3IiwJMTQsMjQsCTB4MjU0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibm90ZCIsCTE0LDI0LAkweDI3NGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm9yYiIsCSA2LDE2LAkweDE4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJvcnciLAkgNiwxNiwJMHgxOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAib3JkIiwJIDYsMTYsCTB4MWIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInF1b2IiLAkxNCwyNCwJMHgzMGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJxdW93IiwJMTQsMjQsCTB4MzFjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicXVvZCIsCTE0LDI0LAkweDMzY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJkdmFsIiwJMTksMjQsCTB4MDAzMWUsIjFBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlbWIiLAkxNCwyNCwJMHgzNGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZW13IiwJMTQsMjQsCTB4MzVjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmVtZCIsCTE0LDI0LAkweDM3Y2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlc3RvcmUiLAkgOCw4LAkweDcyLAkiMXUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmV0IiwJIDgsOCwJMHgxMiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJldGkiLAkgOCw4LAkweDUyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJldHQiLAkgOCw4LAkweDQyLAkiMWQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm90YiIsCTE0LDI0LAkweDAwNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdHciLAkxNCwyNCwJMHgwMTRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3RkIiwJMTQsMjQsCTB4MDM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRmYiIsCTE0LDI0LAkweDI0M2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kZnciLAkxNCwyNCwJMHgyNTNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGZkIiwJMTQsMjQsCTB4MjczZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRsYiIsCTE0LDI0LAkweDIwM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kbHciLAkxNCwyNCwJMHgyMTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGxkIiwJMTQsMjQsCTB4MjMzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicnhwIiwJIDgsOCwJMHgzMiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcWIiLAkxMSwxNiwJMHgzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcXciLAkxMSwxNiwJMHgzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcWQiLAkxMSwxNiwJMHgzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZWIiLAkxMSwxNiwJMHhiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZXciLAkxMSwxNiwJMHhiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZWQiLAkxMSwxNiwJMHhiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjc2IiLAkxMSwxNiwJMHgxM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY3N3IiwJMTEsMTYsCTB4MTNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NzZCIsCTExLDE2LAkweDEzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjY2IiLAkxMSwxNiwJMHgxYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2N3IiwJMTEsMTYsCTB4MWJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NjZCIsCTExLDE2LAkweDFiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoaWIiLAkxMSwxNiwJMHgyM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaGl3IiwJMTEsMTYsCTB4MjNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hpZCIsCTExLDE2LAkweDIzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsc2IiLAkxMSwxNiwJMHgyYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHN3IiwJMTEsMTYsCTB4MmJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xzZCIsCTExLDE2LAkweDJiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNndGIiLAkxMSwxNiwJMHgzM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ3R3IiwJMTEsMTYsCTB4MzNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2d0ZCIsCTExLDE2LAkweDMzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsZWIiLAkxMSwxNiwJMHgzYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbGV3IiwJMTEsMTYsCTB4M2JkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xlZCIsCTExLDE2LAkweDNiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc2IiLAkxMSwxNiwJMHg0M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZnN3IiwJMTEsMTYsCTB4NDNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZzZCIsCTExLDE2LAkweDQzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmY2IiLAkxMSwxNiwJMHg0YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZmN3IiwJMTEsMTYsCTB4NGJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZjZCIsCTExLDE2LAkweDRiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsb2IiLAkxMSwxNiwJMHg1M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbG93IiwJMTEsMTYsCTB4NTNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xvZCIsCTExLDE2LAkweDUzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoc2IiLAkxMSwxNiwJMHg1YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaHN3IiwJMTEsMTYsCTB4NWJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hzZCIsCTExLDE2LAkweDViZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsdGIiLAkxMSwxNiwJMHg2M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHR3IiwJMTEsMTYsCTB4NjNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2x0ZCIsCTExLDE2LAkweDYzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNnZWIiLAkxMSwxNiwJMHg2YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ2V3IiwJMTEsMTYsCTB4NmJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2dlZCIsCTExLDE2LAkweDZiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1dGIiLAkxMSwxNiwJMHg3M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdXR3IiwJMTEsMTYsCTB4NzNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3V0ZCIsCTExLDE2LAkweDczZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1ZmIiLAkxMSwxNiwJMHg3YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWZ3IiwJMTEsMTYsCTB4N2JkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VmZCIsCTExLDE2LAkweDdiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNhdmUiLAkgOCw4LAkweDYyLAkiMVUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGIiLCAgICAxNCwyNCwJMHgxODRlLAkiMUIyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0dyIsCTE0LDI0LAkweDE5NGUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXRkIiwJMTQsMjQsCTB4MWI0ZSwJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGliIiwJMTQsMjQsCTB4MWM0ZSwJIjFCMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGl3IiwJMTQsMjQsCTB4MWQ0ZSwJIjFXMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGlkIiwJMTQsMjQsCTB4MWY0ZSwJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2V0Y2ZnIiwJMTUsMjQsCTB4MGIwZSwJIjFPIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc3IiLAkxNCwyNCwJMHgzNzNlLAkiMWYiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc2IiLAkxNiwyNCwJMHgwYzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJza3BzdyIsCTE2LDI0LAkweDBkMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNrcHNkIiwJMTYsMjQsCTB4MGYwZSwgIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc3QiLAkxNiwyNCwJMHg4YzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbXIiLAkxNSwyNCwJMHgwZjFlLAkiMkkxTSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzcHJiIiwJIDcsMTYsCTB4MmMsCSIySTFQIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNwcnciLAkgNywxNiwJMHgyZCwJIjJJMVAiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ByZCIsCSA3LDE2LAkweDJmLAkiMkkxUCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJmIiwJMTQsMjQsCTB4MTFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VibCIsCTE0LDI0LAkweDEwYmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmIiLAkgNiwxNiwJMHgyMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VidyIsCSA2LDE2LAkweDIxLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJkIiwJIDYsMTYsCTB4MjMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmNiIiwJIDYsMTYsCTB4MzAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmN3IiwJIDYsMTYsCTB4MzEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmNkIiwJIDYsMTYsCTB4MzMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YnBiIiwJMTQsMjQsCTB4MmM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VicHciLAkxNCwyNCwJMHgyZDRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJwZCIsCTE0LDI0LAkweDJmNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0jaWZkZWYgTlMzMktfU1ZDX0lNTUVEX09QRVJBTkRTCi0gIHsgInN2YyIsCSA4LDgsCTB4ZTIsCSIyaTFpIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sIC8qIG5vdCByZWFsbHksIGJ1dCBzb21lIHVuaXggdXNlcyBpdCAqLwotI2Vsc2UKLSAgeyAic3ZjIiwJIDgsOCwJMHhlMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotI2VuZGlmCi0gIHsgInRiaXRiIiwJIDYsMTYsCTB4MzQsCSIxQjJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRiaXR3IiwJIDYsMTYsCTB4MzUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRiaXRkIiwJIDYsMTYsCTB4MzcsCSIxRDJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jZmIiLAkxNCwyNCwJMHgyYzNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2Z3IiwJMTQsMjQsCTB4MmQzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNmZCIsCTE0LDI0LAkweDJmM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jbGIiLAkxNCwyNCwJMHgyODNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2x3IiwJMTQsMjQsCTB4MjkzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNsZCIsCTE0LDI0LAkweDJiM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIndhaXQiLAkgOCw4LAkweGIyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIndydmFsIiwJMTksMjQsCTB4MDA3MWUsIjFBIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInhvcmIiLAkgNiwxNiwJMHgzOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAieG9ydyIsCSA2LDE2LAkweDM5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ4b3JkIiwJIDYsMTYsCTB4M2IsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRvdGYiLAkxNCwyNCwgIDB4MGRmZSwgIjFGMkYiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZG90bCIsCTE0LDI0LCAgMHgwY2ZlLCAiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsb2diZiIsCTE0LDI0LCAgMHgxNWZlLCAiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsb2dibCIsCTE0LDI0LCAgMHgxNGZlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJwb2x5ZiIsCTE0LDI0LCAgMHgwOWZlLCAiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJwb2x5bCIsCTE0LDI0LCAgMHgwOGZlLCAiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2FsYmYiLAkxNCwyNCwgIDB4MTFmZSwgIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NhbGJsIiwJMTQsMjQsICAweDEwZmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IG51bW9wY29kZXM9c2l6ZW9mKG5zMzJrX29wY29kZXMpL3NpemVvZihuczMya19vcGNvZGVzWzBdKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgKmNvbnN0IGVuZG9wID0gbnMzMmtfb3Bjb2RlcytzaXplb2YobnMzMmtfb3Bjb2Rlcykvc2l6ZW9mKG5zMzJrX29wY29kZXNbMF0pOwotCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgQVJHX0xFTiA1MAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9wai5oIGIvaW5jbHVkZS9vcGNvZGUvcGouaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1OWI2Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9wai5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGRlY29kaW5nIHRoZSBwaWNvSmF2YSBvcGNvZGUgdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBUcmFuc21ldGEgKHNhY0Bwb2JveC5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIE5hbWVzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24gYXJndW1lbnRzLCB1c2VkIGJ5Ci0gICB0aGUgYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIuICBBdHRyaWJ1dGVzIGFyZSBlbmNvZGVkIGluIHZhcmlvdXMgZmllbGRzLiAqLwotCi0vKiAgICAgICAgICAgIHJlbG9jICBzaXplIHBjcmVsICAgIHVucyAqLwotI2RlZmluZSBPX04gICAgMAotI2RlZmluZSBPXzE2ICAoMTw8NCB8IDIgfCAoMDw8NikgfCAoMDw8MykpCi0jZGVmaW5lIE9fVTE2ICgxPDw0IHwgMiB8ICgwPDw2KSB8ICgxPDwzKSkKLSNkZWZpbmUgT19SMTYgKDI8PDQgfCAyIHwgKDE8PDYpIHwgKDA8PDMpKQotI2RlZmluZSBPXzggICAoMzw8NCB8IDEgfCAoMDw8NikgfCAoMDw8MykpCi0jZGVmaW5lIE9fVTggICgzPDw0IHwgMSB8ICgwPDw2KSB8ICgxPDwzKSkKLSNkZWZpbmUgT19SOCAgKDQ8PDQgfCAxIHwgKDA8PDYpIHwgKDA8PDMpKQotI2RlZmluZSBPX1IzMiAoNTw8NCB8IDQgfCAoMTw8NikgfCAoMDw8MykpCi0jZGVmaW5lIE9fMzIgICg2PDw0IHwgNCB8ICgwPDw2KSB8ICgwPDwzKSkKLQotI2RlZmluZSBBU0laRSh4KSAgKCh4KSAmIDB4NykKLSNkZWZpbmUgUENSRUwoeCkgICghISgoeCkgJiAoMTw8NikpKQotI2RlZmluZSBVTlMoeCkgICAgKCEhKCh4KSAmICgxPDwzKSkpCi0KLSAgICAgICAgICAgICAgICAgIAotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIHNob3J0IG9wY29kZTsKLSAgc2hvcnQgb3Bjb2RlX25leHQ7Ci0gIGNoYXIgbGVuOwotICB1bnNpZ25lZCBjaGFyIGFyZ1syXTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX0gcGpfb3BjX2luZm9fdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3BuLmggYi9pbmNsdWRlL29wY29kZS9wbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU5YTJhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3BuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyogUHJpbnQgR09VTEQgUE4gKFBvd2VyTm9kZSkgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1zdHJ1Y3QgZ2xkX29wY29kZQotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICBjaGFyICphcmdzOwotICBpbnQgbGVuZ3RoOwotfTsKLQotLyogV2Ugc3RvcmUgZm91ciBieXRlcyBvZiBvcGNvZGUgZm9yIGFsbCBvcGNvZGVzIGJlY2F1c2UgdGhhdAotICAgaXMgdGhlIG1vc3QgYW55IG9mIHRoZW0gbmVlZC4gIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uCi0gICBpcyBhbHdheXMgYXQgbGVhc3QgMiBieXRlcywgYW5kIGF0IG1vc3QgZm91ci4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICBpbnN0cnVjdGlvbiBpcyBiYXNlZCBvbiB0aGUgb3Bjb2RlLgotCi0gICBUaGUgbWFzayBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2gKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMKLSAgIHRoYXQgYXJlIHVzZWQgdG8gZm9ybWF0IHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLiAqLwotCi0vKiBLaW5kcyBvZiBvcGVyYW5kczoKLSAgIHIgIFJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBSICBSZWdpc3RlciBpbiBzZWNvbmQgZmllbGQKLSAgIGIgIEJhc2UgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEIgIEJhc2UgcmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICB2ICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIFYgIFZlY3RvciByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgQSAgT3B0aW9uYWwgYWRkcmVzcyByZWdpc3RlciAoYmFzZSByZWdpc3RlcikKLSAgIFggIE9wdGlvbmFsIGluZGV4IHJlZ2lzdGVyCi0gICBJICBJbW1lZGlhdGUgZGF0YSAoMTZiaXRzIHNpZ25lZCkKLSAgIE8gIE9mZnNldCBmaWVsZCAoMTZiaXRzIHNpZ25lZCkKLSAgIGggIE9mZnNldCBmaWVsZCAoMTViaXRzIHNpZ25lZCkKLSAgIGQgIE9mZnNldCBmaWVsZCAoMTRiaXRzIHNpZ25lZCkKLSAgIFMgIFNoaWZ0IGNvdW50IGZpZWxkCi0KLSAgIGFueSBvdGhlciBjaGFyYWN0ZXJzIGFyZSBwcmludGVkIGFzIGlzLi4uCi0qLwotCi0vKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgdGhpcyBhcnJheSBiZSBzb3J0ZWQgYXMgZm9sbG93czoKLSAgIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZSBjb25zZWN1dGl2ZS4KLSAgIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMKLSAgIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gKi8KLXN0cnVjdCBnbGRfb3Bjb2RlIGdsZF9vcGNvZGVzW10gPQotewoteyAiYWJtIiwJMHhhMDA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJhYnIiLAkweDE4MDgwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKLXsgImFjaSIsCTB4ZmM3NzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiYWRmZCIsCTB4ZTAwODAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRmdyIsCTB4ZTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRpIiwJMHhjODAxMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJhZG1iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1kIiwJMHhiODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhZG13IiwJMHhiODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZHIiLAkweDM4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFkcmZkIiwJMHgzODA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhZHJmdyIsCTB4MzgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRybSIsCTB4MzgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWkiLCAJMHhmYzAzMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiYW5tYiIsCTB4ODQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5tZCIsCTB4ODQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5taCIsCTB4ODQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5tdyIsCTB4ODQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5yIiwJMHgwNDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhcm1iIiwJMHhlODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1kIiwJMHhlODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1oIiwJMHhlODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhcm13IiwJMHhlODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiY2YiLAkweGYwMDAwMDAwLAkweGZjMDgwMDAwLAkiSSx4T0EsWCIsCTQgfSwKLXsgImJjdCIsCTB4ZWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJJLHhPQSxYIiwJNCB9LAoteyAiYmVpIiwJMHgwMDA2MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJiZnQiLAkweGYwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiaWIiLAkweGY0MDAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJiaWQiLAkweGY0NjAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJiaWgiLAkweGY0MjAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJiaXciLAkweGY0NDAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJibCIsIAkweGY4ODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJic3ViIiwJMHg1YzA4MDAwMCwJMHhmZjhmMDAwMCwJIiIsCQkyIH0sCi17ICJic3VibSIsCTB4MjgwODAwMDAsCTB4ZmMwODAwMDAsCSIiLAkJNCB9LAoteyAiYnUiLCAJMHhlYzAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiY2FsbCIsCTB4MjgwODAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiY2FsbG0iLAkweDVjMDgwMDAwLAkweGZmODgwMDAwLAkiIiwJCTQgfSwKLXsgImNhbWIiLAkweDkwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWQiLAkweDkwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWgiLAkweDkwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbXciLAkweDkwMDAwMDAwLAkweGZjMDgwMDAwLAkici54T0EsWCIsCTQgfSwKLXsgImNhciIsCTB4MTAwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY2QiLCAJMHhmYzA2MDAwMCwJMHhmYzA3MDAwMCwJInIsZiIsCQk0IH0sCi17ICJjZWEiLAkweDAwMGYwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgImNpIiwgCTB4YzgwNTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiY21jIiwJMHgwNDBhMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAiY21tYiIsCTB4OTQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21tZCIsCTB4OTQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21taCIsCTB4OTQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21tdyIsCTB4OTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21yIiwJMHgxNDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkYWNpIiwJMHhmYzdmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJkYWUiLAkweDAwMGUwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgImRhaSIsCTB4ZmMwNDAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImRjaSIsCTB4ZmM2ZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiZGkiLCAJMHhmYzAxMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiZHZmZCIsCTB4ZTQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZmdyIsCTB4ZTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZpIiwJMHhjODA0MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJkdm1iIiwJMHhjNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdm1oIiwJMHhjNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJkdm13IiwJMHhjNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdnIiLAkweDM4MGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImR2cmZkIiwJMHgzODBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQk0IH0sCi17ICJkdnJmdyIsCTB4MzgwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZWFlIiwJMHgwMDA4MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJlY2kiLAkweGZjNjcwMDAwLAkweGZjN2Y4MDgwLAkicixJIiwJCTQgfSwKLXsgImVjd2NzIiwJMHhmYzRmMDAwMCwJMHhmYzdmODAwMCwJIiIsCQk0IH0sCi17ICJlaSIsIAkweGZjMDAwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJlb21iIiwJMHg4YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJlb21kIiwJMHg4YzAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJlb21oIiwJMHg4YzAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJlb213IiwJMHg4YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJlb3IiLAkweDBjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImVvcm0iLAkweDBjMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImVzIiwgCTB4MDAwNDAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4bSIsCTB4YTgwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImV4ciIsCTB4YzgwNzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4cnIiLAkweGM4MDcwMDAyLAkweGZjN2YwMDAyLAkiciIsCQkyIH0sCi17ICJmaXhkIiwJMHgzODBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmaXh3IiwJMHgzODA1MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmbHRkIiwJMHgzODBmMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmbHR3IiwJMHgzODA3MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJncmlvIiwJMHhmYzNmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJoYWx0IiwJMHgwMDAwMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJoaW8iLAkweGZjMzcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImp3Y3MiLAkweGZhMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJsYSIsIAkweDUwMDAwMDAwLAkweGZjMDAwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxhYnIiLAkweDU4MDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxiIiwgCTB4YWMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGNzIiwgCTB4MDAwMzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImxkIiwgCTB4YWMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibGVhciIsIAkweDgwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxmIiwgCTB4Y2MwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGZiciIsIAkweGNjMDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxoIiwgCTB4YWMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibGkiLCAJMHhjODAwMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJsbWFwIiwJMHgyYzA3MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAibG1iIiwJMHhiMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbWQiLAkweGIwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxtaCIsCTB4YjAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG13IiwJMHhiMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbmIiLAkweGI0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxuZCIsCTB4YjQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5oIiwJMHhiNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsbnciLAkweGI0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxwc2QiLAkweGY5ODAwMDAwLAkweGZmODgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxwc2RjbSIsCTB4ZmE4MDAwMDAsCTB4ZmY4ODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHciLCAJMHhhYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsd2JyIiwgCTB4NWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibXBmZCIsCTB4ZTQwODAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBmdyIsCTB4ZTQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBpIiwJMHhjODAzMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJtcG1iIiwJMHhjMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcG1oIiwJMHhjMDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJtcG13IiwJMHhjMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcHIiLAkweDM4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wcmZkIiwJMHgzODBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcHJmdyIsCTB4MzgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibm9wIiwJMHgwMDAyMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJvcm1iIiwJMHg4ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1kIiwJMHg4ODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1oIiwJMHg4ODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJvcm13IiwJMHg4ODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcnIiLAkweDA4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm9ycm0iLAkweDA4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInJkc3RzIiwJMHgwMDA5MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAicmV0dXJuIiwJMHgyODBlMDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCi17ICJyaSIsIAkweGZjMDIwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJybmQiLAkweDAwMDUwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJycHN3dCIsCTB4MDQwYjAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJzY2hubCIsCTB4ZmMyZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAicnNjdGwiLAkweGZjNDcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInJ3Y3MiLAkweDAwMGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNhY3oiLAkweDEwMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNibSIsCTB4OTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAic2JyIiwJMHgxODAwMDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQk0IH0sCi17ICJzZWEiLAkweDAwMGQwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgInNldGNwdSIsCTB4MmMwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInNpbyIsCTB4ZmMxNzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAic2lwdSIsCTB4MDAwYTAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAic2xhIiwJMHgxYzQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGFkIiwJMHgyMDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGMiLAkweDI0NDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsbCIsCTB4MWM2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xsZCIsCTB4MjA2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic21jIiwJMHgwNDA3MDAwMCwJMHhmYzA3MDAwMCwJIiIsCQkyIH0sCi17ICJzcmEiLAkweDFjMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYWQiLAkweDIwMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYyIsCTB4MjQwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsIiwJMHgxYzIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmxkIiwJMHgyMDIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzdGIiLAkweGQ0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZCIsCTB4ZDQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RmIiwJMHhkYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGZiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3RoIiwJMHhkNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdG1iIiwJMHhkODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdG1kIiwJMHhkODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdG1oIiwJMHhkODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdG13IiwJMHhkODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdHBpbyIsCTB4ZmMyNzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAic3R3IiwJMHhkNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdHdiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3VhYnIiLAkweDU4MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN1ZmQiLAkweGUwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ZnciLAkweGUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1aSIsCTB4YzgwMjAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAic3VtYiIsCTB4YmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtZCIsCTB4YmMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtaCIsCTB4YmMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtdyIsCTB4YmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyIiwJMHgzYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdXJmZCIsCTB4MzgwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyZnciLAkweDM4MDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cm0iLAkweDNjMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN2YyIsCTB4YzgwNjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJNCB9LAoteyAidGJtIiwJMHhhNDA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ0YnIiLAkweDE4MGMwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKLXsgInRicnIiLAkweDJjMDIwMDAwLAkweGZjMGYwMDAwLAkicixCIiwJCTIgfSwKLXsgInRjY3IiLAkweDI4MDQwMDAwLAkweGZjN2YwMDAwLAkiIiwJCTIgfSwKLXsgInRkIiwgCTB4ZmMwNTAwMDAsCTB4ZmMwNzAwMDAsCSJyLGYiLAkJNCB9LAoteyAidGlvIiwJMHhmYzFmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJ0bWFwciIsCTB4MmMwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHBjYnIiLAkweDI4MGMwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJ0cmJyIiwJMHgyYzAxMDAwMCwJMHhmYzBmMDAwMCwJImIsUiIsCQkyIH0sCi17ICJ0cmMiLAkweDJjMDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyY2MiLAkweDI4MDUwMDAwLAkweGZjN2YwMDAwLAkiIiwJCTIgfSwKLXsgInRyY20iLAkweDJjMGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybiIsCTB4MmMwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJubSIsCTB4MmMwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJyIiwJMHgyYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnJtIiwJMHgyYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnNjIiwJMHgyYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnN3IiwJMHgyODAwMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAidHNjciIsCTB4MmMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWVpIiwJMHgwMDA3MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJ3YWl0IiwJMHgwMDAxMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJ3Y3djcyIsCTB4ZmM1ZjAwMDAsCTB4ZmM3ZjgwMDAsCSIiLAkJNCB9LAoteyAid3djcyIsCTB4MDAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNiciIsCTB4MjgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAoteyAieGNyIiwJMHgyYzA1MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ4Y3JtIiwJMHgyYzBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ6Ym0iLAkweDljMDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInpiciIsCTB4MTgwNDAwMDAsCTB4ZmMwYzAwMDAsCSJyLGYiLAkJMiB9LAoteyAiem1iIiwJMHhmODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWQiLAkweGY4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInptaCIsCTB4ZjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiem13IiwJMHhmODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6ciIsIAkweDBjMDAwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi19OwotCi1pbnQgbnVtb3Bjb2RlcyA9IHNpemVvZihnbGRfb3Bjb2RlcykgLyBzaXplb2YoZ2xkX29wY29kZXNbMF0pOwotCi1zdHJ1Y3QgZ2xkX29wY29kZSAqZW5kb3AgPSBnbGRfb3Bjb2RlcyArIHNpemVvZihnbGRfb3Bjb2RlcykgLwotCQlzaXplb2YoZ2xkX29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcHBjLmggYi9pbmNsdWRlL29wY29kZS9wcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZjBkZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9wcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKiBwcGMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgUG93ZXJQQyBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFBQQ19ICi0jZGVmaW5lIFBQQ19ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfb3Bjb2RlLiAgKi8KLQotc3RydWN0IHBvd2VycGNfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCi0gICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQotICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBPbmUgYml0IGZsYWdzIGZvciB0aGUgb3Bjb2RlLiAgVGhlc2UgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2gKLSAgICAgc3BlY2lmaWMgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbnMuICBUaGUgZGVmaW5lZCB2YWx1ZXMKLSAgICAgYXJlIGxpc3RlZCBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgcG93ZXJwY19vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHBvd2VycGNfbnVtX29wY29kZXM7Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUuICAqLwotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9QUEMgKDAxKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIFBPV0VSIChSUy82MDAwKSBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBQUENfT1BDT0RFX1BPV0VSICgwMikKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQT1dFUjIgKFJpb3MgMikgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUjIgKDA0KQotCi0vKiBPcGNvZGUgaXMgb25seSBkZWZpbmVkIG9uIDMyIGJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV8zMiAoMDEwKQotCi0vKiBPcGNvZGUgaXMgb25seSBkZWZpbmVkIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV82NCAoMDIwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMSBwcm9jZXNzb3IuICBUaGUgNjAxCi0gICBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgYWxsIFBvd2VyUEMgKFBQQ19PUENPREVfUFBDKSBpbnN0cnVjdGlvbnMsCi0gICBidXQgaXQgYWxzbyBzdXBwb3J0cyBtYW55IGFkZGl0aW9uYWwgUE9XRVIgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV82MDEgKDA0MCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBpbiBib3RoIHRoZSBQb3dlciBhbmQgUG93ZXJQQyBhcmNoaXRlY3R1cmVzCi0gICAoaWUsIGNvbXBpbGVyJ3MgLW1jcHU9Y29tbW9uIG9yIGFzc2VtYmxlcidzIC1tY29tKS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfQ09NTU9OICgwMTAwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGZvciBhbnkgUG93ZXIgb3IgUG93ZXJQQyBwbGF0Zm9ybSAodGhpcyBpcwotICAgZm9yIHRoZSBhc3NlbWJsZXIncyAtbWFueSBvcHRpb24sIGFuZCBpdCBlbGltaW5hdGVzIGR1cGxpY2F0ZXMpLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9BTlkgKDAyMDApCi0KLS8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYXMgcGFydCBvZiB0aGUgNjQtYml0IGJyaWRnZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfNjRfQlJJREdFICgwNDAwKQotCi0vKiBBIG1hY3JvIHRvIGV4dHJhY3QgdGhlIG1ham9yIG9wY29kZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUFBDX09QKGkpICgoKGkpID4+IDI2KSAmIDB4M2YpCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfb3BlcmFuZC4gICovCi0KLXN0cnVjdCBwb3dlcnBjX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgKCppbnNlcnQpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGxvbmcgb3AsCi0JCQkJICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uLCBvIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgKi8KLSAgbG9uZyAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgcG93ZXJwY19vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgcG93ZXJwY19vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHBvd2VycGNfb3BlcmFuZC4gICovCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfU0lHTkVEICgwMSkKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMsIGJ1dCBhbHNvIGFjY2VwdHMgYSBmdWxsIHBvc2l0aXZlCi0gICByYW5nZSBvZiB2YWx1ZXMgd2hlbiBydW5uaW5nIGluIDMyIGJpdCBtb2RlLiAgVGhhdCBpcywgaWYgYml0cyBpcwotICAgMTYsIGl0IHRha2VzIGFueSB2YWx1ZSBmcm9tIC0weDgwMDAgdG8gMHhmZmZmLiAgSW4gNjQgYml0IG1vZGUsCi0gICB0aGlzIGZsYWcgaXMgaWdub3JlZC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX1NJR05PUFQgKDAyKQotCi0vKiBUaGlzIG9wZXJhbmQgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIGFzc2VtYmxlciBpbnB1dC4gIFRoaXMKLSAgIGlzIHVzZWQgdG8gc3VwcG9ydCBleHRlbmRlZCBtbmVtb25pY3Mgc3VjaCBhcyBtciwgZm9yIHdoaWNoIHR3bwotICAgb3BlcmFuZHMgZmllbGRzIGFyZSBpZGVudGljYWwuICBUaGUgYXNzZW1ibGVyIHNob3VsZCBjYWxsIHRoZQotICAgaW5zZXJ0IGZ1bmN0aW9uIHdpdGggYW55IG9wIHZhbHVlLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY2FsbAotICAgdGhlIGV4dHJhY3QgZnVuY3Rpb24sIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLCBhbmQgY2hlY2sgdGhlIHZhbHVlCi0gICBwbGFjZWQgaW4gdGhlIHZhbGlkIGFyZ3VtZW50LiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfRkFLRSAoMDQpCi0KLS8qIFRoZSBuZXh0IG9wZXJhbmQgc2hvdWxkIGJlIHdyYXBwZWQgaW4gcGFyZW50aGVzZXMgcmF0aGVyIHRoYW4KLSAgIHNlcGFyYXRlZCBmcm9tIHRoaXMgb25lIGJ5IGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIHRoZSBsb2FkIGFuZAotICAgc3RvcmUgaW5zdHJ1Y3Rpb25zIHdoaWNoIHdhbnQgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlCi0gICAgICAgcmVnLGRpc3BsYWNlbWVudChyZWcpCi0gICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9QQVJFTlMgKDAxMCkKLQotLyogVGhpcyBvcGVyYW5kIG1heSB1c2UgdGhlIHN5bWJvbGljIG5hbWVzIGZvciB0aGUgQ1IgZmllbGRzLCB3aGljaAotICAgYXJlCi0gICAgICAgbHQgIDAJZ3QgIDEJZXEgIDIJc28gIDMJdW4gIDMKLSAgICAgICBjcjAgMAljcjEgMQljcjIgMgljcjMgMwotICAgICAgIGNyNCA0CWNyNSA1CWNyNiA2CWNyNyA3Ci0gICBUaGVzZSBtYXkgYmUgY29tYmluZWQgYXJpdGhtZXRpY2FsbHksIGFzIGluIGNyMio0K2d0LiAgVGhlc2UgYXJlCi0gICBvbmx5IHN1cHBvcnRlZCBvbiB0aGUgUG93ZXJQQywgbm90IHRoZSBQT1dFUi4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX0NSICgwMjApCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIHJlZ2lzdGVyLiAgVGhlIGRpc2Fzc2VtYmxlciB1c2VzIHRoaXMgdG8gcHJpbnQKLSAgIHJlZ2lzdGVyIG5hbWVzIHdpdGggYSBsZWFkaW5nICdyJy4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX0dQUiAoMDQwKQotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSB3aXRoIGEgbGVhZGluZyAnZicuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9GUFIgKDAxMDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIHJlbGF0aXZlIGJyYW5jaCBkaXNwbGFjZW1lbnQuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfUkVMQVRJVkUgKDAyMDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9BQlNPTFVURSAoMDQwMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIG9wdGlvbmFsLCBhbmQgaXMgemVybyBpZiBvbWl0dGVkLiAgVGhpcyBpcyB1c2VkIGZvcgotICAgdGhlIG9wdGlvbmFsIEJGIGFuZCBMIGZpZWxkcyBpbiB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMuICBUaGUKLSAgIGFzc2VtYmxlciBtdXN0IGNvdW50IHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVtYWluaW5nIG9uIHRoZSBsaW5lLAotICAgYW5kIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVtYWluaW5nIGZvciB0aGUgb3Bjb2RlLCBhbmQgZGVjaWRlCi0gICB3aGV0aGVyIHRoaXMgb3BlcmFuZCBpcyBwcmVzZW50IG9yIG5vdC4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkCi0gICBwcmludCB0aGlzIG9wZXJhbmQgb3V0IG9ubHkgaWYgaXQgaXMgbm90IHplcm8uICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9PUFRJT05BTCAoMDEwMDApCi0KLS8qIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWQgd2l0aCBQUENfT1BFUkFORF9PUFRJT05BTC4gIElmIHRoaXMgb3BlcmFuZAotICAgaXMgb21pdHRlZCwgdGhlbiBmb3IgdGhlIG5leHQgb3BlcmFuZCB1c2UgdGhpcyBvcGVyYW5kIHZhbHVlIHBsdXMKLSAgIDEsIGlnbm9yaW5nIHRoZSBuZXh0IG9wZXJhbmQgZmllbGQgZm9yIHRoZSBvcGNvZGUuICBUaGlzIHdyZXRjaGVkCi0gICBoYWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBQb3dlciByb3RhdGUgaW5zdHJ1Y3Rpb25zIGNhbiB0YWtlCi0gICBlaXRoZXIgNCBvciA1IG9wZXJhbmRzLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgcHJpbnQgdGhpcyBvcGVyYW5kCi0gICBvdXQgcmVnYXJkbGVzcyBvZiB0aGUgUFBDX09QRVJBTkRfT1BUSU9OQUwgZmllbGQuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9ORVhUICgwMjAwMCkKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBiZSByZWdhcmRlZCBhcyBhIG5lZ2F0aXZlIG51bWJlciBmb3IgdGhlCi0gICBwdXJwb3NlcyBvZiBvdmVyZmxvdyBjaGVja2luZyAoaS5lLiwgdGhlIG5vcm1hbCBtb3N0IG5lZ2F0aXZlCi0gICBudW1iZXIgaXMgZGlzYWxsb3dlZCBhbmQgb25lIG1vcmUgdGhhbiB0aGUgbm9ybWFsIG1vc3QgcG9zaXRpdmUKLSAgIG51bWJlciBpcyBhbGxvd2VkKS4gIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgc2V0IGZvciBhIHNpZ25lZAotICAgb3BlcmFuZC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX05FR0FUSVZFICgwNDAwMCkKLQwKLS8qIFRoZSBQT1dFUiBhbmQgUG93ZXJQQyBhc3NlbWJsZXJzIHVzZSBhIGZldyBtYWNyb3MuICBXZSBrZWVwIHRoZW0KLSAgIHdpdGggdGhlIG9wZXJhbmRzIHRhYmxlIGZvciBzaW1wbGljaXR5LiAgVGhlIG1hY3JvIHRhYmxlIGlzIGFuCi0gICBhcnJheSBvZiBzdHJ1Y3QgcG93ZXJwY19tYWNyby4gICovCi0KLXN0cnVjdCBwb3dlcnBjX21hY3JvCi17Ci0gIC8qIFRoZSBtYWNybyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG9wZXJhbmRzIHRoZSBtYWNybyB0YWtlcy4gICovCi0gIHVuc2lnbmVkIGludCBvcGVyYW5kczsKLQotICAvKiBPbmUgYml0IGZsYWdzIGZvciB0aGUgb3Bjb2RlLiAgVGhlc2UgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2gKLSAgICAgc3BlY2lmaWMgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbnMuICBUaGUgdmFsdWVzIGFyZSB0aGUKLSAgICAgc2FtZSBhcyB0aG9zZSBmb3IgdGhlIHN0cnVjdCBwb3dlcnBjX29wY29kZSBmbGFncyBmaWVsZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgLyogQSBmb3JtYXQgc3RyaW5nIHRvIHR1cm4gdGhlIG1hY3JvIGludG8gYSBub3JtYWwgaW5zdHJ1Y3Rpb24uCi0gICAgIEVhY2ggJU4gaW4gdGhlIHN0cmluZyBpcyByZXBsYWNlZCB3aXRoIG9wZXJhbmQgbnVtYmVyIE4gKHplcm8KLSAgICAgYmFzZWQpLiAgKi8KLSAgY29uc3QgY2hhciAqZm9ybWF0OwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvIHBvd2VycGNfbWFjcm9zW107Ci1leHRlcm4gY29uc3QgaW50IHBvd2VycGNfbnVtX21hY3JvczsKLQotI2VuZGlmIC8qIFBQQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9weXIuaCBiL2luY2x1ZGUvb3Bjb2RlL3B5ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjYzMmI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3B5ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qIHB5cmFtaWQub3Bjb2RlLmggLS0gZ2RiIGluaXRpYWwgYXR0ZW1wdC4gKi8KLQotLyogcHlyYW1pZCBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlICovCi0KLXN0cnVjdCBweXJfZGF0dW0KLXsKLSAgY2hhciAgICAgICAgICAgICAgbmFyZ3M7Ci0gIGNoYXIgKiAgICAgICAgICAgIGFyZ3M7CS8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi0gIHVuc2lnbmVkIGxvbmcgICAgIG1hc2s7CS8qIEJpdCB2ZWN0b3I6IHdoaWNoIG9wZXJhbmQgbW9kZXMgYXJlIHZhbGlkCi0JCQkJICAgZm9yIHRoaXMgb3Bjb2RlICovCi0gIHVuc2lnbmVkIGNoYXIgICAgIGNvZGU7CS8qIG9wLWNvZGUgKGFsd2F5cyA2KD8pIGJpdHMgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHB5cl9pbnNuX2Zvcm1hdCB7Ci0gICAgdW5zaWduZWQgaW50IG1vZGUgOjQ7Ci0gICAgdW5zaWduZWQgaW50IG9wZXJhdG9yIDo4OwotICAgIHVuc2lnbmVkIGludCBpbmRleF9zY2FsZSA6MjsKLSAgICB1bnNpZ25lZCBpbnQgaW5kZXhfcmVnIDo2OwotICAgIHVuc2lnbmVkIGludCBvcGVyYW5kXzEgOjY7Ci0gICAgdW5zaWduZWQgaW50IG9wZXJhbmRfMjo2OwotfSBweXJfaW5zbl9mb3JtYXQ7Ci0JCi0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2Rlcy4KLSAgIFB5cmFtaWQgaXMgc3VmZmljaWVudGx5IFJJU0N5IHRoYXQ6Ci0gICAgICAtIGluc25zIGFyZSBhbHdheXMgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIHdvcmRzOwotICAgICAgLSB0aGUgbGVuZ3RoIG9mIGFueSBpbnNuIGNhbiBiZSB0b2xkIGZyb20gdGhlIGZpcnN0IHdvcmQgb2YKLSAgICAgICAgdGhlIGluc24uIChpZSwgaWYgdGhlcmUgYXJlIHplcm8sIG9uZSwgb3IgdHdvIHdvcmRzIG9mCi0JaW1tZWRpYXRlIG9wZXJhbmQvb2Zmc2V0KS4KLQotICAgCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0d28gY2hhcmFjdGVycyBmb3IgZWFjaAotICAgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgZmlyc3Qgc3BlY2lmaWVzIHRoZSBraW5kIG9mIG9wZXJhbmQ7Ci0gICB0aGUgc2Vjb25kLCB0aGUgcGxhY2UgaXQgaXMgc3RvcmVkLiAqLwotCi0vKiBLaW5kcyBvZiBvcGVyYW5kczoKLSAgIG1hc2sJIGFzc2VtYmxlciBzeW50YXgJZGVzY3JpcHRpb24KLSAgIDB4MDAwMTogIG1vdncgUm4sUm4JCXJlZ2lzdGVyIHRvIHJlZ2lzdGVyCi0gICAweDAwMDI6ICBtb3Z3IEssUm4JCXF1aWNrIGltbWVkaWF0ZSB0byByZWdpc3RlcgotICAgMHgwMDA0OiAgbW92dyBJLFJuCQlsb25nIGltbWVkaWF0ZSB0byByZWdpc3RlcgotICAgMHgwMDA4OiAgbW92dyAoUm4pLFJuCXJlZ2lzdGVyIGluZGlyZWN0IHRvIHJlZ2lzdGVyCi0gICAJICAgIG1vdncgKFJuKVt4XSxSbglyZWdpc3RlciBpbmRpcmVjdCB0byByZWdpc3RlcgotICAgMHgwMDEwOiAgbW92dyBJKFJuKSxSbglvZmZzZXQgcmVnaXN0ZXIgaW5kaXJlY3QgdG8gcmVnaXN0ZXIKLSAgIAkgICAgbW92dyBJKFJuKVt4XSxSbglvZmZzZXQgcmVnaXN0ZXIgaW5kaXJlY3QsIGluZGV4ZWQsIHRvIHJlZ2lzdGVyCi0KLSAgIDB4MDAyMDogIG1vdncgUm4sKFJuKQlyZWdpc3RlciB0byByZWdpc3RlciBpbmRpcmVjdCAgICAgICAgICAgICAgICAKLSAgIDB4MDA0MDogIG1vdncgSywoUm4pCQlxdWljayBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAKLSAgIDB4MDA4MDogIG1vdncgSSwoUm4pCQlsb25nIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCAgICAgICAgICAKLSAgIDB4MDEwMDogIG1vdncgKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0IHRvLXJlZ2lzdGVyIGluZGlyZWN0ICAgICAgIAotICAgMHgwMTAwOiAgbW92dyAoUm4pLChSbikJcmVnaXN0ZXIgaW5kaXJlY3QgdG8tcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgCi0gICAweDAyMDA6ICBtb3Z3IEkoUm4pLChSbikJcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0IHRvIHJlZ2lzdGVyIGluZGlyZWN0Ci0gICAweDAyMDA6ICBtb3Z3IEkoUm4pLChSbikJcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0IHRvIHJlZ2lzdGVyIGluZGlyZWN0Ci0KLSAgIDB4MDQwMDogIG1vdncgUm4sSShSbikJcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0Ci0gICAweDA4MDA6ICBtb3Z3IEssSShSbikJcXVpY2sgaW1tZWRpYXRlIHRvIHJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgxMDAwOiAgbW92dyBJLEkoUm4pCWxvbmcgaW1tZWRpYXRlIHRvIHJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgxMDAwOiAgbW92dyAoUm4pLEkoUm4pCXJlZ2lzdGVyIGluZGlyZWN0IHRvLXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgxMDAwOiAgbW92dyBJKFJuKSxJKFJuKQlyZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQgdG8gcmVnaXN0ZXIgaW5kaXJlY3QKLSAgIAkJCQkJK29mZnNldAotICAgMHgwMDAwOiAgKGlycmVndWxhcikJCT8/PwotICAgCi0KLSAgIEVhY2ggaW5zbiBoYXMgYSBmb3VyLWJpdCBmaWVsZCBlbmNvZGluZyB0aGUgdHlwZShzKSBvZiBpdHMgb3BlcmFuZHMuCi0qLwotCi0vKiBTb21lIGNvbW1vbiBjb21iaW5hdGlvbnMKLSAgICovCi0KLS8qIHRoZSBmaXJzdCA1LCgweDF8MHgyfDB4NHwweDh8MHgxMCkgaWUgKDF8Mnw0fDh8MTYpLCBpZSAoIDMyIC0xKSovCi0jZGVmaW5lIEdFTl9UT19SRUcgKDMxKQotCi0jZGVmaW5lCVVOS05PV04gKCh1bnNpZ25lZCBsb25nKS0xKQotI2RlZmluZSBBTlkgKEdFTl9UT19SRUcgfCAoR0VOX1RPX1JFRyA8PCA1KSB8IChHRU5fVE9fUkVHIDw8IDE1KSkKLQotI2RlZmluZSBDT05WRVJUICgxfDh8MHgxMHwweDIwfDB4MjAwKQotCi0jZGVmaW5lIEtfVE9fUkVHICgyKQotI2RlZmluZSBJX1RPX1JFRyAoNCkKLSNkZWZpbmUgTk9US19UT19SRUcgKEdFTl9UT19SRUcgJiB+S19UT19SRUcpCi0jZGVmaW5lIE5PVElfVE9fUkVHIChHRU5fVE9fUkVHICYgfklfVE9fUkVHKQotCi0vKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgdGhpcyBhcnJheSBiZSBzb3J0ZWQgYXMgZm9sbG93czoKLSAgIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZSBjb25zZWN1dGl2ZS4KLSAgIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMKLSAgIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gKi8KLQotc3RydWN0IHB5cl9vcGNvZGUJCS8qIHB5ciBvcGNvZGUgdGV4dCAqLwotewotICBjaGFyICogICAgICAgICAgICBuYW1lOwkvKiBvcGNvZGUgbmFtZTogbG93ZXJjYXNlIHN0cmluZyAgW2tleV0gICovCi0gIHN0cnVjdCBweXJfZGF0dW0gIGRhdHVtOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0jZGVmaW5lIHB5cl9ob3cgYXJncwotI2RlZmluZSBweXJfbmFyZ3MgbmFyZ3MKLSNkZWZpbmUgcHlyX21hc2sgbWFzawotI2RlZmluZSBweXJfbmFtZSBuYW1lCi0KLXN0cnVjdCBweXJfb3Bjb2RlIHB5cl9vcGNvZGVzW10gPQotewotICB7Im1vdmIiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgxMX0sIH0sCi0gIHsibW92aCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDEyfSB9LAotICB7Im1vdnciLAl7IDIsICIiLCBBTlksCQkJMHgxMH0gfSwKLSAgeyJtb3ZsIiwJeyAyLCAiIiwgQU5ZLAkJCTB4MTN9IH0sCi0gIHsibW5lZ3ciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxNH0gfSwKLSAgeyJtbmVnZiIsCXsgMiwgIiIsIDB4MSwJCQkweDE1fSB9LAotICB7Im1uZWdkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MTZ9IH0sCi0gIHsibWNvbXciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxN30gfSwKLSAgeyJtYWJzdyIsCXsgMiwgIiIsICgweDF8MHg4fDB4MTApLAkweDE4fSB9LAotICB7Im1hYnNmIiwJeyAyLCAiIiwgMHgxLAkJCTB4MTl9IH0sCi0gIHsibWFic2QiLAl7IDIsICIiLCAweDEsCQkJMHgxYX0gfSwKLSAgeyJtdHN0dyIsCXsgMiwgIiIsICgweDF8MHg4fDB4MTApLAkweDFjfSB9LAotICB7Im10c3RmIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWR9IH0sCi0gIHsibXRzdGQiLAl7IDIsICIiLCAweDEsCQkJMHgxZX0gfSwKLSAgeyJtb3ZhIiwJeyAyLCAiIiwgMHg4fDB4MTAsCQkweDFmfSB9LAotICB7Im1vdnpidyIsCXsgMiwgIiIsICgweDF8MHg4fDB4MTApLAkweDIwfSB9LAotICB7Im1vdnpodyIsCXsgMiwgIiIsICgweDF8MHg4fDB4MTApLAkweDIxfSB9LAotCQkJCS8qIDIgaW5zbnMgb3V0IG9mIG9yZGVyIGhlcmUgKi8KLSAgeyJtb3ZibCIsCXsgMiwgIiIsIDEsCQkJMHg0Zn0gfSwKLSAgeyJmaWxibCIsCXsgMiwgIiIsIDEsCQkJMHg0ZX0gfSwKLQotICB7ImN2dGJ3IiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjJ9IH0sCi0gIHsiY3Z0aHciLAl7IDIsICIiLCBDT05WRVJULAkJMHgyM30gfSwKLSAgeyJjdnR3YiIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI0fSB9LAotICB7ImN2dHdoIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjV9IH0sCi0gIHsiY3Z0d2YiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyNn0gfSwKLSAgeyJjdnR3ZCIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI3fSB9LAotICB7ImN2dGZ3IiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4Mjh9IH0sCi0gIHsiY3Z0ZmQiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyOX0gfSwKLSAgeyJjdnRkdyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDJhfSB9LAotICB7ImN2dGRmIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MmJ9IH0sCi0KLSAgeyJhZGR3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDB9IH0sCi0gIHsiYWRkd2MiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0MX0gfSwKLSAgeyJzdWJ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDJ9IH0sCi0gIHsic3Vid2IiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0M30gfSwKLSAgeyJyc3VidyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ0fSB9LAotICB7Im11bHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0NX0gfSwKLSAgeyJlbXVsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDd9IH0sCi0gIHsidW11bHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0Nn0gfSwKLSAgeyJkaXZ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDh9IH0sCi0gIHsiZWRpdiIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRhfSB9LAotICB7InJkaXZ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NGJ9IH0sCi0gIHsidWRpdnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0OX0gfSwKLSAgeyJtb2R3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NGN9IH0sCi0gIHsidW1vZHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0ZH0gfSwKLQotCi0gIHsiYWRkZiIsCXsgMiwgIiIsIDEsCQkJMHg1MH0gfSwKLSAgeyJhZGRkIiwJeyAyLCAiIiwgMSwJCQkweDUxfSB9LAotICB7InN1YmYiLAl7IDIsICIiLCAxLAkJCTB4NTJ9IH0sCi0gIHsic3ViZCIsCXsgMiwgIiIsIDEsCQkJMHg1M30gfSwKLSAgeyJtdWxmIiwJeyAyLCAiIiwgMSwJCQkweDU2fSB9LAotICB7Im11bGQiLAl7IDIsICIiLCAxLAkJCTB4NTd9IH0sCi0gIHsiZGl2ZiIsCXsgMiwgIiIsIDEsCQkJMHg1OH0gfSwKLSAgeyJkaXZkIiwJeyAyLCAiIiwgMSwJCQkweDU5fSB9LAotCi0KLSAgeyJjbXBiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4NjF9IH0sCi0gIHsiY21waCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDYyfSB9LAotICB7ImNtcHciLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2MH0gfSwKLSAgeyJ1Y21wYiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY2fSB9LAotICAvKiBXSFkgbm8gInVjbXBoIj8/PyAqLwotICB7InVjbXB3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4NjV9IH0sCi0gIHsieGNodyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDBmfSB9LAotCi0KLSAgeyJhbmR3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MzB9IH0sCi0gIHsib3J3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MzF9IH0sCi0gIHsieG9ydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMyfSB9LAotICB7ImJpY3ciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzM30gfSwKLSAgeyJsc2hsdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDM4fSB9LAotICB7ImFzaGx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2F9IH0sCi0gIHsiYXNobGwiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzY30gfSwKLSAgeyJhc2hydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNifSB9LAotICB7ImFzaHJsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2R9IH0sCi0gIHsicm90bHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzZX0gfSwKLSAgeyJyb3RydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNmfSB9LAotCi0gIC8qIHB1c2ggYW5kIHBvcCBpbnNucyBhcmUgImdvaW5nIGF3YXkgbmV4dCByZWxlYXNlIi4gKi8KLSAgeyJwdXNodyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDBjfSB9LAotICB7InBvcHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgwZH0gfSwKLSAgeyJwdXNoYSIsCXsgMiwgIiIsICgweDh8MHgxMCksCQkweDBlfSB9LAotCi0gIHsiYml0c3ciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgzNX0gfSwKLSAgeyJiaXRjdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDM2fSB9LAotICAvKiBzb21lIGtpbmQgb2YgaWJyYS9kYnJhIGluc25zPz8qLwotICB7ImljbXB3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4Njd9IH0sCi0gIHsiZGNtcHciLAl7IDIsICIiLCAoMXw0fDB4MjB8MHg4MHwweDQwMHwweDEwMDApLAkweDY5fSB9LC8qRklYTUUqLwotICB7ImFjbXB3IiwJeyAyLCAiIiwgMSwJCQkweDZifSB9LAotCi0gIC8qIENhbGwgaXMgd3JpdHRlbiBhcyBhIDEtb3AgaW5zbiwgYnV0IGlzIGFsd2F5cyAoZGlzKWFzc2VtYmxlZCBhcyBhIDItb3AKLSAgICAgaW5zbiB3aXRoIGEgMm5kIG9wIG9mIHRyMTQuICAgVGhlIGFzc2VtYmxlciB3aWxsIGhhdmUgdG8gZ3JvayB0aGlzLiAgKi8KLSAgeyJjYWxsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MDR9IH0sCi0gIHsiY2FsbCIsCXsgMSwgIiIsIEdFTl9UT19SRUcsCQkweDA0fSB9LAotCi0gIHsiY2FsbGsiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwNn0gfSwvKiBzeXN0ZW0gY2FsbD8qLwotICAvKiBSZXQgaXMgdXN1YWxseSB3cml0dGVuIGFzIGEgMC1vcCBpbnNuLCBidXQgZ2V0cyBkaXNhc3NlbWJsZWQgYXMgYQotICAgICAxLW9wIGluc24uIFRoZSBvcGVyYW5kIGlzIGFsd2F5cyB0cjE1LiAqLwotICB7InJldCIsCXsgMCwgIiIsIFVOS05PV04sCQkweDA5fSB9LAotICB7InJldCIsCXsgMSwgIiIsIFVOS05PV04sCQkweDA5fSB9LAotICB7ImFkc2YiLAl7IDIsICIiLCAoMXwyfDQpLAkJMHgwOH0gfSwKLSAgeyJyZXRkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MGF9IH0sCi0gIHsiYnRjIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDF9IH0sCi0gIHsiYmZjIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDJ9IH0sCi0gIC8qIENhcmVmdWw6IGhhbHQgaXMgMHgwMDAwMDAwMC4gSnVtcCBtdXN0IGhhdmUgc29tZSBvdGhlciAobW9kZT8pYml0IHNldD8/ICovCi0gIHsianVtcCIsCXsgMSwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImJ0cCIsCXsgMiwgIiIsIFVOS05PV04sCQkweGYwMH0gfSwKLSAgLyogcmVhZCBjb250cm9sLXN0YWNrIHBvaW50ZXIgaXMgYW5vdGhlciAxLW9yLTIgb3BlcmFuZCBpbnNuLiAqLwotICB7InJjc3AiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMWZ9IH0sCi0gIHsicmNzcCIsCXsgMSwgIiIsIFVOS05PV04sCQkweDAxZn0gfQotfTsKLQotLyogZW5kOiBweXJhbWlkLm9wY29kZS5oICovCi0vKiBPbmUgZGF5IEkgd2lsbCBoYXZlIHRvIHRha2UgdGhlIHRpbWUgdG8gZmluZCBvdXQgd2hhdCBvcGVyYW5kcwotICAgYXJlIHZhbGlkIGZvciB0aGVzZSBpbnNucywgYW5kIGd1ZXNzIGF0IHdoYXQgdGhleSBtZWFuLgotCi0gICBJIGNhbid0IGltYWdpbmUgd2hhdCB0aGUgIkk/Pz8iIGluc25zIChpZ2xvYiwgZXRjKSBkby4KLQotICAgdGhlIGFyaXRobWV0aWMtc291bmRpbmcgaW5zbnMgZW5kaW5nIGluICJwIiBzb3VuZCBhd2Z1bGx5IGxpa2UgQkNECi0gICBhcml0aG1ldGljIGluc25zOgotICAgCWRzaGxwIC0+IERlY2ltYWwgU0hpZnQgTGVmdCBQYWNrZWQKLQlkc2hycCAtPiBEZWNpbWFsIFNIaWZ0IFJpZ2h0IFBhY2tlZAotICAgYW5kIGN2dGxwIHdvdWxkIGJlIGNvbnZlcnQgbG9uZyB0byBwYWNrZWQuCi0gICBJIGhhdmUgbm8gaWRlYSBob3cgdGhlIG9wZXJhbmRzIGFyZSBpbnRlcnByZXRlZDsgYnV0IGhhdmluZyB0aGVtIGJlCi0gICBhIGxvbmcgcmVnaXN0ZXIgd2l0aCAoYWRkcmVzcywgbGVuZ3RoKSBvZiBhbiBpbi1tZW1vcnkgcGFja2VkIEJDRCBvcGVyYW5kCi0gICB3b3VsZCBub3QgYmUgc3VycHJpc2luZy4KLSAgIFRoZXkgYXJlIHVubGlrZWx5IHRvIGJlIGEgcGFja2VkIGJjZCBzdHJpbmc6IDY0IGJpdHMgb2YgbG9uZyBnaXZlCi0gICBpcyBvbmx5IDE1IGRpZ2l0cytzaWduLCB3aGljaCBpc24ndCBlbm91Z2ggZm9yIENPQk9MLgotICovIAotI2lmIDAKLSAgeyJ3Y3NwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qd3JpdGUgY3NwPyovCi0gIC8qIFRoZSBPU3ggT3BlcmF0aW5nIFN5c3RlbSBQb3J0aW5nIEd1aWRlIGNsYWltcyBTU0wgZG9lcyB0aGluZ3MKLSAgICAgd2l0aCB0cjEyIChhIHJlZ2lzdGVyIHJlc2VydmVkIHRvIGl0KSB0byBkbyB3aXRoIHN0YXRpYyBibG9jay1zdHJ1Y3R1cmUKLSAgICAgcmVmZXJlbmNlcy4gIFNTTD1TZXQgU3RhdGljIExpbms/ICBJdCdzICJHb2luZyBhd2F5IG5leHQgcmVsZWFzZSIuICovCi0gIHsic3NsIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiY2NtcHMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJsY2QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJ1ZW11bCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnVuc2lnbmVkIGVtdWwqLwotICB7InNyZiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKkdpZGdldCB0aW1lPz8/Ki8KLSAgeyJtbmVncCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvbW92ZS1uZWcgcGh5cz8qLwotICB7ImxkcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKmxvYWQgcGh5cz8qLwotICB7ImxkdGkiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJsZGIiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJzdHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJzdHRpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3RiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3R1IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiYWRkcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN1YnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJtdWxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiZGl2cCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImRzaGxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sICAvKiBkZWMgc2hsIHBhY2tlZD8gKi8KLSAgeyJkc2hycCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBkZWMgc2hyIHBhY2tlZD8gKi8KLSAgeyJtb3ZzIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qbW92ZSAoc3RyaW5nPyk/Ki8KLSAgeyJjbXBwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGNtcCBwaHlzPyovCi0gIHsiY21wcyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjbXAgKHN0cmluZz8pPyovCi0gIHsiY3Z0bHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY3Z0IGxvbmcgdG8gcD8/Ki8KLSAgeyJjdnRwbCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjdnQgcCB0byBsPz8qLwotICB7ImRpbnRyIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qID8/IGludHIgPyovCi0gIHsicnBoeXN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIHJlYWQgcGh5cyB3b3JkPyovCi0gIHsid3BoeXN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIHdyaXRlIHBoeXMgd29yZD8qLwotICB7ImNtb3ZzIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsicnN1YnciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJiaWNwc3ciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY2xyIGJpdCBpbiBwc3c/ICovCi0gIHsiYmlzcHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIHNldCBiaXQgaW4gcHN3PyAqLwotICB7ImVpbyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiA/PyA/aW8gPyAqLwotICB7ImNhbGxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGNhbGwgcGh5cz8qLwotICB7ImNhbGxyIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibHBjeHQiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypsb2FkIHByb2MgY29udGV4dCovCi0gIHsicmVpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qcmV0IGZyb20gaW50cnB0Ki8KLSAgeyJycG9ydCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnJlYWQtcG9ydD8qLwotICB7InJ0b2QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypyZWFkLXRpbWUtb2YtZGF5PyovCi0gIHsic3NpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidnRwYSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnZpcnQtdG8tcGh5cy1hZGRyPyovCi0gIHsid2ljbCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiB3cml0ZSBpY2wgPyAqLwotICB7Indwb3J0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qd3JpdGUtcG9ydD8qLwotICB7Ind0b2QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp3cml0ZS10aW1lLW9mLWRheT8qLwotICB7ImZsaWMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJpZ2xvYiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBJIGdsb2JhbD8gKi8KLSAgeyJpcGh5cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBJIHBoeXNpY2FsPyAqLwotICB7ImlwaWQiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBwaWQ/ICovCi0gIHsiaXZlY3QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSB2ZWN0b3I/ICovCi0gIHsibGFtc3QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJ0aW8iLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvc3BhcmMuaCBiL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTU5YmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3Igb3Bjb2RlIHRhYmxlIGZvciB0aGUgc3BhcmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBHREIsIHRoZSBHTlUgZGVidWdnZXIsIGFuZAotdGhlIEdOVSBCaW51dGlscy4KLQotR0FTL0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUy9HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUyBvciBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLglJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBUaGUgU1BBUkMgb3Bjb2RlIHRhYmxlIChhbmQgb3RoZXIgcmVsYXRlZCBkYXRhKSBpcyBkZWZpbmVkIGluCi0gICB0aGUgb3Bjb2RlcyBsaWJyYXJ5IGluIHNwYXJjLW9wYy5jLiAgSWYgeW91IGNoYW5nZSBhbnl0aGluZyBoZXJlLCBtYWtlCi0gICBzdXJlIHlvdSBmaXggdXAgdGhhdCBmaWxlLCBhbmQgdmljZSB2ZXJzYS4gICovCi0KLSAvKiBGSVhNRS1zb21lZGF5OiBwZXJoYXBzIHRoZSAsYSdzIGFuZCBzdWNoIHNob3VsZCBiZSBlbWJlZGRlZCBpbiB0aGUKLSAgICBpbnN0cnVjdGlvbidzIG5hbWUgcmF0aGVyIHRoYW4gdGhlIGFyZ3MuICBUaGlzIHdvdWxkIG1ha2UgZ2FzIGZhc3RlciwgcGluc24KLSAgICBzbG93ZXIsIGJ1dCB3b3VsZCBtZXNzIHVwIHNvbWUgbWFjcm9zIGEgYml0LiAgeG94b3JpY2guICovCi0KLS8qIExpc3Qgb2YgaW5zdHJ1Y3Rpb24gc2V0cyB2YXJpYXRpb25zLgotICAgVGhlc2UgdmFsdWVzIGFyZSBzdWNoIHRoYXQgZWFjaCBlbGVtZW50IGlzIGVpdGhlciBhIHN1cGVyc2V0IG9mIGEKLSAgIHByZWNlZGluZyBlYWNoIG9uZSBvciB0aGV5IGNvbmZsaWN0IGluIHdoaWNoIGNhc2UgU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1AKLSAgIHJldHVybnMgbm9uLXplcm8uCi0gICBUaGUgdmFsdWVzIGFyZSBpbmRpY2VzIGludG8gYHNwYXJjX29wY29kZV9hcmNocycgZGVmaW5lZCBpbiBzcGFyYy1vcGMuYy4KLSAgIERvbid0IGNoYW5nZSB0aGlzIHdpdGhvdXQgdXBkYXRpbmcgc3BhcmMtb3BjLmMuICAqLwotCi1lbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB7Ci0gIFNQQVJDX09QQ09ERV9BUkNIX1Y2ID0gMCwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfVjcsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1Y4LAotICBTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMSVRFLAotICAvKiB2OSB2YXJpYW50cyBtdXN0IGFwcGVhciBsYXN0ICovCi0gIFNQQVJDX09QQ09ERV9BUkNIX1Y5LAotICBTUEFSQ19PUENPREVfQVJDSF9WOUEsIC8qIHY5IHdpdGggdWx0cmFzcGFyYyBhZGRpdGlvbnMgKi8KLSAgU1BBUkNfT1BDT0RFX0FSQ0hfQkFEIC8qIGVycm9yIHJldHVybiBmcm9tIHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCAqLwotfTsKLQotLyogVGhlIGhpZ2hlc3QgYXJjaGl0ZWN0dXJlIGluIHRoZSB0YWJsZS4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9BUkNIX01BWCAoU1BBUkNfT1BDT0RFX0FSQ0hfQkFEIC0gMSkKLQotLyogR2l2ZW4gYW4gZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwsIHJldHVybiB0aGUgYml0bWFzayB0byB1c2UgaW4KLSAgIGluc24gZW5jb2RpbmcvZGVjb2RpbmcuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQVJDSF9NQVNLKGFyY2gpICgxIDw8IChhcmNoKSkKLQotLyogR2l2ZW4gYSB2YWxpZCBzcGFyY19vcGNvZGVfYXJjaF92YWwsIHJldHVybiBub24temVybyBpZiBpdCdzIHY5LiAgKi8KLSNkZWZpbmUgU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUChhcmNoKSAoKGFyY2gpID49IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotCi0vKiBUYWJsZSBvZiBjcHUgdmFyaWFudHMuICAqLwotCi1zdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggewotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBNYXNrIG9mIHNwYXJjX29wY29kZV9hcmNoX3ZhbCdzIHN1cHBvcnRlZC4KLSAgICAgRUc6IEZvciB2NyB0aGlzIHdvdWxkIGJlCi0gICAgIChTUEFSQ19PUENPREVfQVJDSF9NQVNLICguLi5fVjYpIHwgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoLi4uX1Y3KSkuCi0gICAgIFRoZXNlIGFyZSBzaG9ydCdzIGJlY2F1c2Ugc3BhcmNfb3Bjb2RlLmFyY2hpdGVjdHVyZSBpcy4gICovCi0gIHNob3J0IHN1cHBvcnRlZDsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggc3BhcmNfb3Bjb2RlX2FyY2hzW107Ci0KLS8qIEdpdmVuIGFyY2hpdGVjdHVyZSBuYW1lLCBsb29rIHVwIGl0J3Mgc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIHZhbHVlLiAgKi8KLWV4dGVybiBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIFJldHVybiB0aGUgYml0bWFzayBvZiBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcyBmb3IgQVJDSC4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9TVVBQT1JURUQoQVJDSCkgKHNwYXJjX29wY29kZV9hcmNoc1tBUkNIXS5zdXBwb3J0ZWQpCi0KLS8qIE5vbi16ZXJvIGlmIEFSQ0gxIGNvbmZsaWN0cyB3aXRoIEFSQ0gyLgotICAgSUU6IEFSQ0gxIGFzIGEgc3VwcG9ydGVkIGJpdCBzZXQgdGhhdCBBUkNIMiBkb2Vzbid0LCBhbmQgdmljZSB2ZXJzYS4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9DT05GTElDVF9QKEFSQ0gxLCBBUkNIMikgXAotKCgoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDEpICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDIpKSBcCi0gICE9IFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSkgXAotICYmICgoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDEpICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDIpKSBcCi0gICAgICE9IFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkpCi0KLS8qIFN0cnVjdHVyZSBvZiBhbiBvcGNvZGUgdGFibGUgZW50cnkuICAqLwotCi1zdHJ1Y3Qgc3BhcmNfb3Bjb2RlIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBtYXRjaDsJLyogQml0cyB0aGF0IG11c3QgYmUgc2V0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvc2U7CS8qIEJpdHMgdGhhdCBtdXN0IG5vdCBiZSBzZXQuICovCi0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIC8qIFRoaXMgd2FzIGNhbGxlZCAiZGVsYXllZCIgaW4gdmVyc2lvbnMgYmVmb3JlIHRoZSBmbGFncy4gKi8KLSAgY2hhciBmbGFnczsKLSAgc2hvcnQgYXJjaGl0ZWN0dXJlOwkvKiBCaXRtYXNrIG9mIHNwYXJjX29wY29kZV9hcmNoX3ZhbCdzLiAgKi8KLX07Ci0KLSNkZWZpbmUJRl9ERUxBWUVECTEJLyogRGVsYXllZCBicmFuY2ggKi8KLSNkZWZpbmUJRl9BTElBUwkJMgkvKiBBbGlhcyBmb3IgYSAicmVhbCIgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUJRl9VTkJSCQk0CS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0jZGVmaW5lCUZfQ09OREJSCTgJLyogQ29uZGl0aW9uYWwgYnJhbmNoICovCi0jZGVmaW5lCUZfSlNSCQkxNgkvKiBTdWJyb3V0aW5lIGNhbGwgKi8KLSNkZWZpbmUgRl9GTE9BVAkJMzIJLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gKG5vdCBhIGJyYW5jaCkgKi8KLSNkZWZpbmUgRl9GQlIJCTY0CS8qIEZsb2F0aW5nIHBvaW50IGJyYW5jaCAqLwotLyogRklYTUU6IEFkZCBGX0FOQUNIUk9OSVNUSUMgZmxhZyBmb3IgdjkuICAqLwotCi0vKgotCi1BbGwgc3BhcmMgb3Bjb2RlcyBhcmUgMzIgYml0cywgZXhjZXB0IGZvciB0aGUgYHNldCcgaW5zdHJ1Y3Rpb24gKHJlYWxseSBhCi1tYWNybyksIHdoaWNoIGlzIDY0IGJpdHMuIEl0IGlzIGhhbmRsZWQgYXMgYSBzcGVjaWFsIGNhc2UuCi0KLVRoZSBtYXRjaCBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2ggYSBwYXJ0aWN1bGFyCi1vcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlIG9mIHRoYXQgb3Bjb2RlLgotCi1UaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgY2hhcmFjdGVyIGZvciBlYWNoIG9wZXJhbmQgb2YgdGhlCi1pbnN0cnVjdGlvbi4KLQotS2luZHMgb2Ygb3BlcmFuZHM6Ci0JIwlOdW1iZXIgdXNlZCBieSBvcHRpbWl6ZXIuCUl0IGlzIGlnbm9yZWQuCi0JMQlyczEgcmVnaXN0ZXIuCi0JMglyczIgcmVnaXN0ZXIuCi0JZAlyZCByZWdpc3Rlci4KLQllCWZyczEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0JdglmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChkb3VibGUvZXZlbikuCi0JVglmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChxdWFkL211bHRpcGxlIG9mIDQpLgotCWYJZnJzMiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLQlCCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKGRvdWJsZS9ldmVuKS4KLQlSCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKHF1YWQvbXVsdGlwbGUgb2YgNCkuCi0JZwlmcnNkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgotCUgJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3RlciAoZG91YmxlL2V2ZW4pLgotCUoJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3RlciAocXVhZC9tdWx0aXBsZSBvZiA0KS4KLQliCWNyczEgY29wcm9jZXNzb3IgcmVnaXN0ZXIKLQljCWNyczIgY29wcm9jZXNzb3IgcmVnaXN0ZXIKLQlECWNyc2QgY29wcm9jZXNzb3IgcmVnaXN0ZXIKLQltCWFsdGVybmF0ZSBzcGFjZSByZWdpc3RlciAoYXNyKSBpbiByZAotCU0JYWx0ZXJuYXRlIHNwYWNlIHJlZ2lzdGVyIChhc3IpIGluIHJzMQotCWgJMjIgaGlnaCBiaXRzLgotCVgJNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlCi0JWQk2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUKLQlLCU1FTUJBUiBtYXNrICg3IGJpdHMpLiAodjkpCi0JagkxMCBiaXQgSW1tZWRpYXRlLiAodjkpCi0JSQkxMSBiaXQgSW1tZWRpYXRlLiAodjkpCi0JaQkxMyBiaXQgSW1tZWRpYXRlLgotCW4JMjIgYml0IGltbWVkaWF0ZS4KLQlrCTIrMTQgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4gKHY5KQotCUcJMTkgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4gKHY5KQotCWwJMjIgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4KLQlMCTMwIGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0JYQlBbm51bC4JVGhlIGFubnVsIGJpdCBpcyBzZXQuCi0JQQlBbHRlcm5hdGUgYWRkcmVzcyBzcGFjZS4gU3RvcmVkIGFzIDggYml0cy4KLQlDCUNvcHJvY2Vzc29yIHN0YXRlIHJlZ2lzdGVyLgotCUYJZmxvYXRpbmcgcG9pbnQgc3RhdGUgcmVnaXN0ZXIuCi0JcAlQcm9jZXNzb3Igc3RhdGUgcmVnaXN0ZXIuCi0JTglCcmFuY2ggcHJlZGljdCBjbGVhciAiLHBuIiAodjkpCi0JVAlCcmFuY2ggcHJlZGljdCBzZXQgIixwdCIgKHY5KQotCXoJJWljYy4gKHY5KQotCVoJJXhjYy4gKHY5KQotCXEJRmxvYXRpbmcgcG9pbnQgcXVldWUuCi0JcglTaW5nbGUgcmVnaXN0ZXIgdGhhdCBpcyBib3RoIHJzMSBhbmQgcmQuCi0JTwlTaW5nbGUgcmVnaXN0ZXIgdGhhdCBpcyBib3RoIHJzMiBhbmQgcmQuCi0JUQlDb3Byb2Nlc3NvciBxdWV1ZS4KLQlTCVNwZWNpYWwgY2FzZS4KLQl0CVRyYXAgYmFzZSByZWdpc3Rlci4KLQl3CVdpbmRvdyBpbnZhbGlkIG1hc2sgcmVnaXN0ZXIuCi0JeQlZIHJlZ2lzdGVyLgotCXUJc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzIGluIHJkIHBvc2l0aW9uCi0JVQlzcGFyY2xldCBjb3Byb2Nlc3NvciByZWdpc3RlcnMgaW4gcnMxIHBvc2l0aW9uCi0JRQklY2NyLiAodjkpCi0JcwklZnBycy4gKHY5KQotCVAJJXBjLiAgKHY5KQotCVcJJXRpY2suCSh2OSkKLQlvCSVhc2kuICh2OSkKLQk2CSVmY2MwLiAodjkpCi0JNwklZmNjMS4gKHY5KQotCTgJJWZjYzIuICh2OSkKLQk5CSVmY2MzLiAodjkpCi0JIQlQcml2aWxlZ2VkIFJlZ2lzdGVyIGluIHJkICh2OSkKLQk/CVByaXZpbGVnZWQgUmVnaXN0ZXIgaW4gcnMxICh2OSkKLQkqCVByZWZldGNoIGZ1bmN0aW9uIGNvbnN0YW50LiAodjkpCi0JeAlPUEYgZmllbGQgKHY5IGltcGRlcCkuCi0JMAkzMi82NCBiaXQgaW1tZWRpYXRlIGZvciBzZXQgb3Igc2V0eCAodjkpIGluc25zCi0JXwlBbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIgaW4gcmQgKHY5YSkKLQkvCUFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciBpbiByczEgKHY5YSkKLQotVGhlIGZvbGxvd2luZyBjaGFycyBhcmUgdW51c2VkOiAobm90ZTogLFtdIGFyZSB1c2VkIGFzIHB1bmN0dWF0aW9uKQotWzM0NV0KLQotKi8KLQotI2RlZmluZSBPUDIoeCkJCSgoKHgpJjB4NykgPDwgMjIpIC8qIG9wMiBmaWVsZCBvZiBmb3JtYXQyIGluc25zICovCi0jZGVmaW5lIE9QMyh4KQkJKCgoeCkmMHgzZikgPDwgMTkpIC8qIG9wMyBmaWVsZCBvZiBmb3JtYXQzIGluc25zICovCi0jZGVmaW5lIE9QKHgpCQkoKHVuc2lnbmVkKSgoeCkmMHgzKSA8PCAzMCkgLyogb3AgZmllbGQgb2YgYWxsIGluc25zICovCi0jZGVmaW5lIE9QRih4KQkJKCgoeCkmMHgxZmYpIDw8IDUpIC8qIG9wZiBmaWVsZCBvZiBmbG9hdCBpbnNucyAqLwotI2RlZmluZSBPUEZfTE9XNSh4KQlPUEYoKHgpJjB4MWYpIC8qIHY5ICovCi0jZGVmaW5lIEYzRih4LCB5LCB6KQkoT1AoeCkgfCBPUDMoeSkgfCBPUEYoeikpIC8qIGZvcm1hdDMgZmxvYXQgaW5zbnMgKi8KLSNkZWZpbmUgRjNJKHgpCQkoKCh4KSYweDEpIDw8IDEzKSAvKiBpbW1lZGlhdGUgZmllbGQgb2YgZm9ybWF0IDMgaW5zbnMgKi8KLSNkZWZpbmUgRjIoeCwgeSkJKE9QKHgpIHwgT1AyKHkpKSAvKiBmb3JtYXQgMiBpbnNucyAqLwotI2RlZmluZSBGMyh4LCB5LCB6KQkoT1AoeCkgfCBPUDMoeSkgfCBGM0koeikpIC8qIGZvcm1hdDMgaW5zbnMgKi8KLSNkZWZpbmUgRjEoeCkJCShPUCh4KSkKLSNkZWZpbmUgRElTUDMwKHgpCSgoeCkmMHgzZmZmZmZmZikKLSNkZWZpbmUgQVNJKHgpCQkoKCh4KSYweGZmKSA8PCA1KSAvKiBhc2kgZmllbGQgb2YgZm9ybWF0MyBpbnNucyAqLwotI2RlZmluZSBSUzIoeCkJCSgoeCkmMHgxZikgLyogcnMyIGZpZWxkICovCi0jZGVmaW5lIFNJTU0xMyh4KQkoKHgpJjB4MWZmZikgLyogc2ltbTEzIGZpZWxkICovCi0jZGVmaW5lIFJEKHgpCQkoKCh4KSYweDFmKSA8PCAyNSkgLyogZGVzdGluYXRpb24gcmVnaXN0ZXIgZmllbGQgKi8KLSNkZWZpbmUgUlMxKHgpCQkoKCh4KSYweDFmKSA8PCAxNCkgLyogcnMxIGZpZWxkICovCi0jZGVmaW5lIEFTSV9SUzIoeCkJKFNJTU0xMyh4KSkKLSNkZWZpbmUgTUVNQkFSKHgpCSgoeCkmMHg3ZikKLSNkZWZpbmUgU0xDUE9QKHgpCSgoKHgpJjB4N2YpIDw8IDYpIC8qIHNwYXJjbGV0IGNwb3AgKi8KLQotI2RlZmluZSBBTk5VTAkoMTw8MjkpCi0jZGVmaW5lIEJQUkVECSgxPDwxOSkJLyogdjkgKi8KLSNkZWZpbmUJSU1NRUQJRjNJKDEpCi0jZGVmaW5lIFJEX0cwCVJEKH4wKQotI2RlZmluZQlSUzFfRzAJUlMxKH4wKQotI2RlZmluZQlSUzJfRzAJUlMyKH4wKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSBzcGFyY19vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHNwYXJjX251bV9vcGNvZGVzOwotCi1leHRlcm4gaW50IHNwYXJjX2VuY29kZV9hc2kgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX2FzaSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX21lbWJhciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpzcGFyY19kZWNvZGVfbWVtYmFyIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfcHJlZmV0Y2ggUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX3ByZWZldGNoIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnIFBBUkFNUyAoKGludCkpOwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogZmlsbC1jb2x1bW46IDEzMQotICogY29tbWVudC1jb2x1bW46IDAKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygc3BhcmMuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvdGFob2UuaCBiL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1Y2VlMjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvdGFob2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogUG9ydGVkIGJ5IHRoZSBTdGF0ZSBVbml2ZXJzaXR5IG9mIE5ldyBZb3JrIGF0IEJ1ZmZhbG8gYnkgdGhlIERpc3RyaWJ1dGVkCi0gKiBDb21wdXRlciBTeXN0ZW1zIExhYiwgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlLCAxOTkxLgotICovCi0KLSNpZm5kZWYgdGFob2Vfb3Bjb2RlVAotI2RlZmluZSB0YWhvZV9vcGNvZGVUIGludAotI2VuZGlmIC8qIG5vIHRhaG9lX29wY29kZVQgKi8KLQotc3RydWN0IHZvdF93b3QgICAgICAgICAgICAgICAgICAvKiB0YWhvZSBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFydGljdWxhciBvcGNvZGUgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgYXJnczsgICAgICAgLyogaG93IHRvIGNvbXBpbGUgc2FpZCBvcGNvZGUgKi8KLSAgdGFob2Vfb3Bjb2RlVCAgICAgICBjb2RlOyAgICAgLyogb3AtY29kZSAobWF5IGJlID4gOCBiaXRzISkgKi8KLX07Ci0KLXN0cnVjdCB2b3QgICAgICAgICAgICAgICAgICAgICAgLyogdGFob2Ugb3Bjb2RlIHRleHQgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgbmFtZTsgICAgICAgLyogb3Bjb2RlIG5hbWU6IGxvd2VyY2FzZSBzdHJpbmcgIFtrZXldICAqLwotICBzdHJ1Y3Qgdm90X3dvdCAgICBkZXRhaWw7ICAgICAvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0jZGVmaW5lIHZvdF9ob3cgYXJncwotI2RlZmluZSB2b3RfY29kZSBjb2RlCi0jZGVmaW5lIHZvdF9kZXRhaWwgZGV0YWlsCi0jZGVmaW5lIHZvdF9uYW1lIG5hbWUKLQotc3RhdGljIHN0cnVjdCB2b3QKLXZvdHN0cnNbXSA9Ci17Ci17ICAgICJoYWx0IiwJeyIiLAkJCTB4MDAJfSB9LAoteyAgICAic2luZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MDUgICAgfSB9LAoteyAgICAibGRmIiwgICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4MDYgICAgfSB9LAoteyAgICAibGRkIiwgICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4MDcgICAgfSB9LAoteyAgICAiYWRkYjIiLAl7InJibWIiLAkJMHgwOAl9IH0sCi17ICAgICJtb3ZiIiwJeyJyYndiIiwJCTB4MDkJfSB9LAoteyAgICAiYWRkdzIiLAl7InJ3bXciLAkJMHgwYQl9IH0sCi17ICAgICJtb3Z3IiwJeyJyd3d3IiwJCTB4MGIJfSB9LAoteyAgICAiYWRkbDIiLAl7InJsbWwiLAkJMHgwYwl9IH0sCi17ICAgICJtb3ZsIiwJeyJybHdsIiwJCTB4MGQJfSB9LAoteyAgICAiYmJzIiwJeyJybHZsYnciLAkJMHgwZQl9IH0sCi17ICAgICJub3AiLCAgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHgxMCAgICB9IH0sCi17ICAgICJicmIiLAl7ImJiIiwJCQkweDExCX0gfSwKLXsgICAgImJydyIsCXsiYnciLAkJCTB4MTMJfSB9LAoteyAgICAiY29zZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MTUgICAgfSB9LAoteyAgICAibG5mIiwgICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4MTYgICAgfSB9LAoteyAgICAibG5kIiwgICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4MTcgICAgfSB9LAoteyAgICAiYWRkYjMiLAl7InJicmJ3YiIsCQkweDE4CX0gfSwKLXsgICAgImNtcGIiLAl7InJid2IiLAkJMHgxOQl9IH0sIAoteyAgICAiYWRkdzMiLAl7InJ3cnd3dyIsCQkweDFhCX0gfSwKLXsgICAgImNtcHciLAl7InJ3d3ciLAkJMHgxYgl9IH0sCi17ICAgICJhZGRsMyIsCXsicmxybHdsIiwJCTB4MWMJfSB9LAoteyAgICAiY21wbCIsCXsicmx3bCIsCQkweDFkCX0gfSwKLXsgICAgImJiYyIsCXsicmx2bGJ3IiwJCTB4MWUJfSB9LAoteyAgICAicmVpIiwJeyIiLAkJCTB4MjAJfSB9LAoteyAgICAiYm5lcSIsCXsiYmIiLAkJCTB4MjEJfSB9LAoteyAgICAiYm5lcXUiLAl7ImJiIiwJCQkweDIxCX0gfSwKLXsgICAgImN2dHdsIiwJeyJyd3dsIiwJCTB4MjMJfSB9LAoteyAgICAic3RmIiwgICAgIHsid2wiLCAgICAgICAgICAgICAgICAgIDB4MjYgICAgfSB9LAoteyAgICAic3RkIiwgICAgIHsid3EiLCAgICAgICAgICAgICAgICAgIDB4MjcgICAgfSB9LAoteyAgICAic3ViYjIiLAl7InJibWIiLAkJMHgyOAl9IH0sCi17ICAgICJtY29tYiIsCXsicmJ3YiIsCQkweDI5CX0gfSwKLXsgICAgInN1YncyIiwJeyJyd213IiwJCTB4MmEJfSB9LAoteyAgICAibWNvbXciLAl7InJ3d3ciLAkJMHgyYgl9IH0sCi17ICAgICJzdWJsMiIsICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHgyYyAgICB9IH0sCi17ICAgICJtY29tbCIsICAgeyJybHdsIiwgICAgICAgICAgICAgICAgMHgyZCAgICB9IH0sCi17ICAgICJlbXVsIiwJeyJybHJscmx3cSIsCQkweDJlCX0gfSwKLXsgICAgImFvYmxzcyIsCXsicmxtbGJ3IiwJCTB4MmYJfSB9LAoteyAgICAiYnB0IiwJeyIiLAkJCTB4MzAJfSB9LAoteyAgICAiYmVxbCIsCXsiYmIiLAkJCTB4MzEJfSB9LAoteyAgICAiYmVxbHUiLAl7ImJiIiwJCQkweDMxCX0gfSwKLXsgICAgImN2dHdiIiwJeyJyd3diIiwJCTB4MzMJfSB9LAoteyAgICAibG9nZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MzUgICAgfSB9LAoteyAgICAiY21wZiIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4MzYgICAgfSB9LAoteyAgICAiY21wZCIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4MzcgICAgfSB9LAoteyAgICAic3ViYjMiLAl7InJicmJ3YiIsCQkweDM4CX0gfSwKLXsgICAgImJpdGIiLAl7InJicmIiLAkJMHgzOQl9IH0sCi17ICAgICJzdWJ3MyIsCXsicndyd3d3IiwJCTB4M2EJfSB9LAoteyAgICAiYml0dyIsCXsicndydyIsCQkweDNiCX0gfSwKLXsgICAgInN1YmwzIiwJeyJybHJsd2wiLAkJMHgzYwl9IH0sCi17ICAgICJiaXRsIiwJeyJybHJsIiwJCTB4M2QJfSB9LAoteyAgICAiZWRpdiIsCXsicmxycXdsd2wiLAkJMHgzZQl9IH0sCi17ICAgICJhb2JsZXEiLAl7InJsbWxidyIsCQkweDNmCX0gfSwKLXsgICAgInJldCIsCXsiIiwJCQkweDQwCX0gfSwKLXsgICAgImJndHIiLAl7ImJiIiwJCQkweDQxCX0gfSwKLXsgICAgInNxcnRmIiwgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDQ1ICAgIH0gfSwKLXsgICAgImNtcGYyIiwgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDQ2ICAgIH0gfSwKLXsgICAgImNtcGQyIiwgICB7InJxcnEiLCAgICAgICAgICAgICAgICAweDQ3ICAgIH0gfSwKLXsgICAgInNobGwiLCAgICB7InJicmx3bCIsICAgICAgICAgICAgICAweDQ4ICAgIH0gfSwKLXsgICAgImNscmIiLAl7IndiIiwJCQkweDQ5CX0gfSwKLXsgICAgInNobHEiLAl7InJicnF3cSIsCQkweDRhCX0gfSwKLXsgICAgImNscnciLAl7Ind3IiwJCQkweDRiCX0gfSwKLXsgICAgIm11bGwyIiwJeyJybG1sIiwJCTB4NGMJfSB9LAoteyAgICAiY2xybCIsCXsid2wiLAkJCTB4NGQJfSB9LAoteyAgICAic2hhbCIsICAgIHsicmJybHdsIiwJCTB4NGUJfSB9LAoteyAgICAiYmxlcSIsCXsiYmIiLAkJCTB4NTEJfSB9LAoteyAgICAiZXhwZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NTUgICAgfSB9LAoteyAgICAidHN0ZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NTYgICAgfSB9LAoteyAgICAidHN0ZCIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NTcgICAgfSB9LAoteyAgICAic2hybCIsICAgIHsicmJybHdsIiwJCTB4NTgJfSB9LAoteyAgICAidHN0YiIsCXsicmIiLAkJCTB4NTkJfSB9LAoteyAgICAic2hycSIsICAgIHsicmJycXdxIiwJCTB4NWEJfSB9LAoteyAgICAidHN0dyIsCXsicnciLAkJCTB4NWIJfSB9LAoteyAgICAibXVsbDMiLAl7InJscmx3bCIsCQkweDVjCX0gfSwKLXsgICAgInRzdGwiLAl7InJsIiwJCQkweDVkCX0gfSwKLXsgICAgInNoYXIiLAl7InJicmx3bCIsCQkweDVlCX0gfSwKLXsgICAgImJic3NpIiwJeyJybG1sYnciLAkJMHg1Zgl9IH0sCi17ICAgICJsZHBjdHgiLAl7IiIsCQkJMHg2MAl9IH0sCi17ICAgICJwdXNoZCIsICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHg2NyAgICB9IH0sCi17ICAgICJpbmNiIiwJeyJtYiIsCQkJMHg2OQl9IH0sCi17ICAgICJpbmN3IiwJeyJtdyIsCQkJMHg2Ygl9IH0sCi17ICAgICJkaXZsMiIsCXsicmxtbCIsCQkweDZjCX0gfSwKLXsgICAgImluY2wiLAl7Im1sIiwJCQkweDZkCX0gfSwKLXsgICAgImN2dGxiIiwJeyJybHdiIiwJCTB4NmYJfSB9LAoteyAgICAic3ZwY3R4IiwJeyIiLAkJCTB4NzAJfSB9LAoteyAgICAiam1wIiwJeyJhYiIsCQkJMHg3MQl9IH0sCi17ICAgICJjdmxmIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg3NiAgICB9IH0sCi17ICAgICJjdmxkIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg3NyAgICB9IH0sCi17ICAgICJkZWNiIiwJeyJtYiIsCQkJMHg3OQl9IH0sCi17ICAgICJkZWN3IiwJeyJtdyIsCQkJMHg3Ygl9IH0sCi17ICAgICJkaXZsMyIsCXsicmxybHdsIiwJCTB4N2MJfSB9LAoteyAgICAiZGVjbCIsCXsibWwiLAkJCTB4N2QJfSB9LAoteyAgICAiY3Z0bHciLAl7InJsd3ciLAkJMHg3Zgl9IH0sCi17ICAgICJiZ2VxIiwJeyJiYiIsCQkJMHg4MQl9IH0sCi17ICAgICJtb3ZzMiIsCXsiYWJhYiIsCQkweDgyCX0gfSwKLXsgICAgImN2ZmwiLCAgICB7IndsIiwgICAgICAgICAgICAgICAgICAweDg2ICAgIH0gfSwKLXsgICAgImN2ZGwiLCAgICB7IndsIiwgICAgICAgICAgICAgICAgICAweDg3ICAgIH0gfSwKLXsgICAgIm9yYjIiLAl7InJibWIiLAkJMHg4OAl9IH0sCi17ICAgICJjdnRibCIsCXsicmJ3bCIsCQkweDg5CX0gfSwKLXsgICAgIm9ydzIiLAl7InJ3bXciLAkJMHg4YQl9IH0sCi17ICAgICJiaXNwc3ciLAl7InJ3IiwJCQkweDhiCX0gfSwKLXsgICAgIm9ybDIiLCAgICB7InJsbWwiLCAgICAgICAgICAgICAgICAweDhjICAgIH0gfSwKLXsgICAgImFkd2MiLAl7InJsbWwiLAkJMHg4ZAl9IH0sCi17ICAgICJhZGRhIiwgCXsicmxtbCIsCQkweDhlCX0gfSwKLXsgICAgImJsc3MiLAl7ImJiIiwJCQkweDkxCX0gfSwKLXsgICAgImNtcHMyIiwgICB7ImFiYWIiLAkJMHg5Mgl9IH0sCi17ICAgICJsZGZkIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg5NyAgICB9IH0sCi17ICAgICJvcmIzIiwJeyJyYnJid2IiLAkJMHg5OAl9IH0sCi17ICAgICJjdnRidyIsCXsicmJ3dyIsCQkweDk5CX0gfSwKLXsgICAgIm9ydzMiLCAgIAl7InJ3cnd3dyIsCQkweDlhCX0gfSwKLXsgICAgImJpY3BzdyIsCXsicnciLAkJCTB4OWIJfSB9LAoteyAgICAib3JsMyIsICAgIHsicmxybHdsIiwgICAgICAgICAgICAgIDB4OWMgICAgfSB9LAoteyAgICAic2J3YyIsCXsicmxtbCIsCQkweDlkCX0gfSwKLXsgICAgInN1YmEiLCAgICB7InJsbWwiLCAgICAgICAgICAgICAgICAweDllICAgIH0gfSwKLXsgICAgImJndHJ1IiwJeyJiYiIsCQkJMHhhMQl9IH0sCi17ICAgICJjdmRmIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHhhNiAgICB9IH0sCi17ICAgICJhbmRiMiIsICAgeyJyYm1iIiwJCTB4YTggICAgfSB9LAoteyAgICAibW92emJsIiwJeyJyYndsIiwJCTB4YTkJfSB9LAoteyAgICAiYW5kdzIiLCAgIHsicndtdyIsCQkweGFhICAgIH0gfSwKLXsgICAgImxvYWRyIiwgICB7InJ3YWwiLAkJMHhhYgl9IH0sCi17ICAgICJhbmRsMiIsICAgeyJybG1sIiwJCTB4YWMgICAgfSB9LAoteyAgICAibXRwciIsCXsicmxybCIsCQkweGFkCX0gfSwKLXsgICAgImZmcyIsCXsicmx3bCIsCQkweGFlCX0gfSwKLXsgICAgImJsZXF1IiwJeyJiYiIsCQkJMHhiMQl9IH0sCi17ICAgICJuZWdmIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHhiNiAgICB9IH0sCi17ICAgICJuZWdkIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHhiNyAgICB9IH0sCi17ICAgICJhbmRiMyIsICAgeyJyYnJid2IiLCAgICAgICAgICAgICAgMHhiOCAgICB9IH0sCi17ICAgICJtb3Z6YnciLAl7InJid3ciLAkJMHhiOQl9IH0sCi17ICAgICJhbmR3MyIsICAgeyJyd3J3d3ciLAkJMHhiYSAgICB9IH0sCi17ICAgICJzdG9yZXIiLCAgeyJyd2FsIiwgICAgICAgICAgICAgICAgMHhiYiAgICB9IH0sCi17ICAgICJhbmRsMyIsICAgeyJybHJsd2wiLAkJMHhiYyAgICB9IH0sCi17ICAgICJtZnByIiwJeyJybHdsIiwJCTB4YmQJfSB9LAoteyAgICAiZmZjIiwJeyJybHdsIiwJCTB4YmUJfSB9LAoteyAgICAiY2FsbHMiLAl7InJiYWIiLAkJMHhiZgl9IH0sCi17ICAgICJwcm9iZXIiLAl7InJiYWJybCIsCQkweGMwCX0gfSwKLXsgICAgImJ2YyIsCXsiYmIiLAkJCTB4YzEJfSB9LAoteyAgICAibW92czMiLAl7ImFiYWJydyIsCQkweGMyCX0gfSwKLXsgICAgIm1vdnp3bCIsCXsicnd3bCIsCQkweGMzCX0gfSwKLXsgICAgImFkZGYiLCAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweGM2ICAgIH0gfSwKLXsgICAgImFkZGQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGM3ICAgIH0gfSwKLXsgICAgInhvcmIyIiwgICB7InJibWIiLCAgICAgICAgICAgICAgICAweGM4ICAgIH0gfSwKLXsgICAgIm1vdm9iIiwgICB7InJid2IiLCAgICAgICAgICAgICAgICAweGM5ICAgIH0gfSwKLXsgICAgInhvcncyIiwgICB7InJ3bXciLCAgICAgICAgICAgICAgICAweGNhICAgIH0gfSwKLXsgICAgIm1vdm93IiwgICB7InJ3d3ciLCAgICAgICAgICAgICAgICAweGNiCX0gfSwKLXsgICAgInhvcmwyIiwJeyJybG1sIiwgICAgICAgICAgICAgICAgMHhjYyAgICB9IH0sCi17ICAgICJtb3Zwc2wiLCAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHhjZCAgICB9IH0sCi17ICAgICJrY2FsbCIsICAgeyJydyIsCQkJMHhjZgl9IH0sCi17ICAgICJwcm9iZXciLCAgeyJyYmFicmwiLAkJMHhkMAl9IH0sCi17ICAgICJidnMiLCAgICAgeyJiYiIsCQkJMHhkMQl9IH0sCi17ICAgICJjbXBzMyIsICAgeyJhYmFicnciLAkJMHhkMgl9IH0sCi17ICAgICJzdWJmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhkNiAgICB9IH0sCi17ICAgICJzdWJkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhkNyAgICB9IH0sCi17ICAgICJ4b3JiMyIsCXsicmJyYndiIiwJCTB4ZDgJfSB9LAoteyAgICAicHVzaGIiLCAgIHsicmIiLAkJCTB4ZDkJfSB9LAoteyAgICAieG9ydzMiLAl7InJ3cnd3dyIsCQkweGRhCX0gfSwKLXsgICAgInB1c2h3IiwgICB7InJ3IiwgCQkJMHhkYgl9IH0sCi17ICAgICJ4b3JsMyIsCXsicmxybHdsIiwJCTB4ZGMJfSB9LAoteyAgICAicHVzaGwiLAl7InJsIiwJCQkweGRkCX0gfSwKLXsgICAgImluc3F1ZSIsCXsiYWJhYiIsCQkweGUwCX0gfSwKLXsgICAgImJjcyIsCXsiYmIiLAkJCTB4ZTEJfSB9LAoteyAgICAiYmdlcXUiLAl7ImJiIiwJCQkweGUxCX0gfSwKLXsgICAgIm11bGYiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGU2ICAgIH0gfSwKLXsgICAgIm11bGQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGU3ICAgIH0gfSwKLXsgICAgIm1uZWdiIiwJeyJyYndiIiwJCTB4ZTgJfSB9LAoteyAgICAibW92YWIiLAl7ImFid2wiLAkJMHhlOQl9IH0sCi17ICAgICJtbmVndyIsCXsicnd3dyIsCQkweGVhCX0gfSwKLXsgICAgIm1vdmF3IiwJeyJhd3dsIiwJCTB4ZWIJfSB9LAoteyAgICAibW5lZ2wiLAl7InJsd2wiLAkJMHhlYwl9IH0sCi17ICAgICJtb3ZhbCIsCXsiYWx3bCIsCQkweGVkCX0gfSwKLXsgICAgInJlbXF1ZSIsCXsiYWIiLCAgCQkweGYwCX0gfSwKLXsgICAgImJjYyIsCXsiYmIiLAkJCTB4ZjEJfSB9LAoteyAgICAiYmxzc3UiLAl7ImJiIiwJCQkweGYxCX0gfSwKLXsgICAgImRpdmYiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGY2ICAgIH0gfSwKLXsgICAgImRpdmQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGY3ICAgIH0gfSwKLXsgICAgIm1vdmJsayIsICB7ImFsYWxydyIsICAgICAgICAgICAgICAweGY4CX0gfSwKLXsgICAgInB1c2hhYiIsCXsiYWIiLAkJCTB4ZjkJfSB9LAoteyAgICAicHVzaGF3IiwJeyJhdyIsCQkJMHhmYgl9IH0sCi17ICAgICJjYXNlbCIsCXsicmxybHJsIiwJCTB4ZmMJfSB9LAoteyAgICAicHVzaGFsIiwJeyJhbCIsCQkJMHhmZAl9IH0sCi17ICAgICJjYWxsZiIsCXsicmJhYiIsCQkweGZlCX0gfSwKLXsgICAgICAiIiAgICAgICAsICAgIiIgICAgICAgICAgfSAvKiBlbXB0eSBpcyBlbmQgc2VudGluZWwgKi8KLQotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3RpYzMwLmggYi9pbmNsdWRlL29wY29kZS90aWMzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzAwMjc1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RpYzMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OTEgKzAsMCBAQAotLyogdGljMzAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVEkgVE1TMzIwQzMwIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRklYTUU6IFRoZSBvcGNvZGUgdGFibGUgc2hvdWxkIGJlIGluIG9wY29kZXMvdGljMzAtb3BjLmMsIG5vdCBpbiBhCi0gICBoZWFkZXIgZmlsZS4gICovCi0KLSNpZm5kZWYgX1RNUzMyMF9IXwotI2RlZmluZSBfVE1TMzIwX0hfCi0KLXN0cnVjdCBfcmVnaXN0ZXIKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGU7Ci0gIHVuc2lnbmVkIGNoYXIgcmVndHlwZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9yZWdpc3RlciByZWc7Ci0KLSNkZWZpbmUgUkVHX1JuICAgIDB4MDEKLSNkZWZpbmUgUkVHX0FSbiAgIDB4MDIKLSNkZWZpbmUgUkVHX0RQICAgIDB4MDMKLSNkZWZpbmUgUkVHX09USEVSIDB4MDQKLQotc3RhdGljIGNvbnN0IHJlZyB0aWMzMF9yZWd0YWJbXSA9IHsKLSAgeyAicjAiLCAweDAwLCBSRUdfUm4gfSwKLSAgeyAicjEiLCAweDAxLCBSRUdfUm4gfSwKLSAgeyAicjIiLCAweDAyLCBSRUdfUm4gfSwKLSAgeyAicjMiLCAweDAzLCBSRUdfUm4gfSwKLSAgeyAicjQiLCAweDA0LCBSRUdfUm4gfSwKLSAgeyAicjUiLCAweDA1LCBSRUdfUm4gfSwKLSAgeyAicjYiLCAweDA2LCBSRUdfUm4gfSwKLSAgeyAicjciLCAweDA3LCBSRUdfUm4gfSwKLSAgeyAiYXIwIiwweDA4LCBSRUdfQVJuIH0sCi0gIHsgImFyMSIsMHgwOSwgUkVHX0FSbiB9LAotICB7ICJhcjIiLDB4MEEsIFJFR19BUm4gfSwKLSAgeyAiYXIzIiwweDBCLCBSRUdfQVJuIH0sCi0gIHsgImFyNCIsMHgwQywgUkVHX0FSbiB9LAotICB7ICJhcjUiLDB4MEQsIFJFR19BUm4gfSwKLSAgeyAiYXI2IiwweDBFLCBSRUdfQVJuIH0sCi0gIHsgImFyNyIsMHgwRiwgUkVHX0FSbiB9LAotICB7ICJkcCIsIDB4MTAsIFJFR19EUCB9LAotICB7ICJpcjAiLDB4MTEsIFJFR19PVEhFUiB9LAotICB7ICJpcjEiLDB4MTIsIFJFR19PVEhFUiB9LAotICB7ICJiayIsIDB4MTMsIFJFR19PVEhFUiB9LAotICB7ICJzcCIsIDB4MTQsIFJFR19PVEhFUiB9LAotICB7ICJzdCIsIDB4MTUsIFJFR19PVEhFUiB9LAotICB7ICJpZSIsIDB4MTYsIFJFR19PVEhFUiB9LAotICB7ICJpZiIsIDB4MTcsIFJFR19PVEhFUiB9LAotICB7ICJpb2YiLDB4MTgsIFJFR19PVEhFUiB9LAotICB7ICJycyIsIDB4MTksIFJFR19PVEhFUiB9LAotICB7ICJyZSIsIDB4MUEsIFJFR19PVEhFUiB9LAotICB7ICJyYyIsIDB4MUIsIFJFR19PVEhFUiB9LAotICB7ICJSMCIsIDB4MDAsIFJFR19SbiB9LAotICB7ICJSMSIsIDB4MDEsIFJFR19SbiB9LAotICB7ICJSMiIsIDB4MDIsIFJFR19SbiB9LAotICB7ICJSMyIsIDB4MDMsIFJFR19SbiB9LAotICB7ICJSNCIsIDB4MDQsIFJFR19SbiB9LAotICB7ICJSNSIsIDB4MDUsIFJFR19SbiB9LAotICB7ICJSNiIsIDB4MDYsIFJFR19SbiB9LAotICB7ICJSNyIsIDB4MDcsIFJFR19SbiB9LAotICB7ICJBUjAiLDB4MDgsIFJFR19BUm4gfSwKLSAgeyAiQVIxIiwweDA5LCBSRUdfQVJuIH0sCi0gIHsgIkFSMiIsMHgwQSwgUkVHX0FSbiB9LAotICB7ICJBUjMiLDB4MEIsIFJFR19BUm4gfSwKLSAgeyAiQVI0IiwweDBDLCBSRUdfQVJuIH0sCi0gIHsgIkFSNSIsMHgwRCwgUkVHX0FSbiB9LAotICB7ICJBUjYiLDB4MEUsIFJFR19BUm4gfSwKLSAgeyAiQVI3IiwweDBGLCBSRUdfQVJuIH0sCi0gIHsgIkRQIiwgMHgxMCwgUkVHX0RQIH0sCi0gIHsgIklSMCIsMHgxMSwgUkVHX09USEVSIH0sCi0gIHsgIklSMSIsMHgxMiwgUkVHX09USEVSIH0sCi0gIHsgIkJLIiwgMHgxMywgUkVHX09USEVSIH0sCi0gIHsgIlNQIiwgMHgxNCwgUkVHX09USEVSIH0sCi0gIHsgIlNUIiwgMHgxNSwgUkVHX09USEVSIH0sCi0gIHsgIklFIiwgMHgxNiwgUkVHX09USEVSIH0sCi0gIHsgIklGIiwgMHgxNywgUkVHX09USEVSIH0sCi0gIHsgIklPRiIsMHgxOCwgUkVHX09USEVSIH0sCi0gIHsgIlJTIiwgMHgxOSwgUkVHX09USEVSIH0sCi0gIHsgIlJFIiwgMHgxQSwgUkVHX09USEVSIH0sCi0gIHsgIlJDIiwgMHgxQiwgUkVHX09USEVSIH0sCi0gIHsgIiIsICAgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgcmVnICpjb25zdCB0aWMzMF9yZWd0YWJfZW5kCi0gID0gdGljMzBfcmVndGFiICsgc2l6ZW9mKHRpYzMwX3JlZ3RhYikvc2l6ZW9mKHRpYzMwX3JlZ3RhYlswXSk7Ci0KLS8qIEluZGlyZWN0IEFkZHJlc3NpbmcgTW9kZXMgTW9kaWZpY2F0aW9uIEZpZWxkcyAqLwotLyogSW5kaXJlY3QgQWRkcmVzc2luZyB3aXRoIERpc3BsYWNlbWVudCAqLwotI2RlZmluZSBQcmVEaXNwX0FkZCAgICAgICAgMHgwMAotI2RlZmluZSBQcmVEaXNwX1N1YiAgICAgICAgMHgwMQotI2RlZmluZSBQcmVEaXNwX0FkZF9Nb2QgICAgMHgwMgotI2RlZmluZSBQcmVEaXNwX1N1Yl9Nb2QgICAgMHgwMwotI2RlZmluZSBQb3N0RGlzcF9BZGRfTW9kICAgMHgwNAotI2RlZmluZSBQb3N0RGlzcF9TdWJfTW9kICAgMHgwNQotI2RlZmluZSBQb3N0RGlzcF9BZGRfQ2lyYyAgMHgwNgotI2RlZmluZSBQb3N0RGlzcF9TdWJfQ2lyYyAgMHgwNwotLyogSW5kaXJlY3QgQWRkcmVzc2luZyB3aXRoIEluZGV4IFJlZ2lzdGVyIElSMCAqLwotI2RlZmluZSBQcmVJUjBfQWRkICAgICAgICAgMHgwOAotI2RlZmluZSBQcmVJUjBfU3ViICAgICAgICAgMHgwOQotI2RlZmluZSBQcmVJUjBfQWRkX01vZCAgICAgMHgwQQotI2RlZmluZSBQcmVJUjBfU3ViX01vZCAgICAgMHgwQgotI2RlZmluZSBQb3N0SVIwX0FkZF9Nb2QgICAgMHgwQwotI2RlZmluZSBQb3N0SVIwX1N1Yl9Nb2QgICAgMHgwRAotI2RlZmluZSBQb3N0SVIwX0FkZF9DaXJjICAgMHgwRQotI2RlZmluZSBQb3N0SVIwX1N1Yl9DaXJjICAgMHgwRgotLyogSW5kaXJlY3QgQWRkcmVzc2luZyB3aXRoIEluZGV4IFJlZ2lzdGVyIElSMSAqLwotI2RlZmluZSBQcmVJUjFfQWRkICAgICAgICAgMHgxMAotI2RlZmluZSBQcmVJUjFfU3ViICAgICAgICAgMHgxMQotI2RlZmluZSBQcmVJUjFfQWRkX01vZCAgICAgMHgxMgotI2RlZmluZSBQcmVJUjFfU3ViX01vZCAgICAgMHgxMwotI2RlZmluZSBQb3N0SVIxX0FkZF9Nb2QgICAgMHgxNAotI2RlZmluZSBQb3N0SVIxX1N1Yl9Nb2QgICAgMHgxNQotI2RlZmluZSBQb3N0SVIxX0FkZF9DaXJjICAgMHgxNgotI2RlZmluZSBQb3N0SVIxX1N1Yl9DaXJjICAgMHgxNwotLyogSW5kaXJlY3QgQWRkcmVzc2luZyAoU3BlY2lhbCBDYXNlcykgKi8KLSNkZWZpbmUgSW5kaXJlY3RPbmx5ICAgICAgIDB4MTgKLSNkZWZpbmUgUG9zdElSMF9BZGRfQml0UmV2IDB4MTkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpzeW50YXg7Ci0gIHVuc2lnbmVkIGNoYXIgbW9kZmllbGQ7Ci0gIHVuc2lnbmVkIGNoYXIgZGlzcGxhY2VtZW50OwotfSBpbmRfYWRkcl90eXBlOwotCi0jZGVmaW5lIElNUExJRURfRElTUCAgMHgwMQotI2RlZmluZSBESVNQX1JFUVVJUkVEIDB4MDIKLSNkZWZpbmUgTk9fRElTUCAgICAgICAweDAzCi0KLXN0YXRpYyBjb25zdCBpbmRfYWRkcl90eXBlIHRpYzMwX2luZGFkZHJfdGFiW10gPSB7Ci0gIHsgIiorYXIiLCAgICAgICBQcmVEaXNwX0FkZCwgICAgICAgIElNUExJRURfRElTUCB9LAotICB7ICIqLWFyIiwgICAgICAgUHJlRGlzcF9TdWIsICAgICAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKisrYXIiLCAgICAgIFByZURpc3BfQWRkX01vZCwgICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiotLWFyIiwgICAgICBQcmVEaXNwX1N1Yl9Nb2QsICAgIElNUExJRURfRElTUCB9LAotICB7ICIqYXIrKyIsICAgICAgUG9zdERpc3BfQWRkX01vZCwgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyLS0iLCAgICAgIFBvc3REaXNwX1N1Yl9Nb2QsICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiphcisrJSIsICAgICBQb3N0RGlzcF9BZGRfQ2lyYywgIElNUExJRURfRElTUCB9LAotICB7ICIqYXItLSUiLCAgICAgUG9zdERpc3BfU3ViX0NpcmMsICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKithcigpIiwgICAgIFByZURpc3BfQWRkLCAgICAgICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqLWFyKCkiLCAgICAgUHJlRGlzcF9TdWIsICAgICAgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiorK2FyKCkiLCAgICBQcmVEaXNwX0FkZF9Nb2QsICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKi0tYXIoKSIsICAgIFByZURpc3BfU3ViX01vZCwgICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqYXIrKygpIiwgICAgUG9zdERpc3BfQWRkX01vZCwgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiphci0tKCkiLCAgICBQb3N0RGlzcF9TdWJfTW9kLCAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyKysoKSUiLCAgIFBvc3REaXNwX0FkZF9DaXJjLCAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqYXItLSgpJSIsICAgUG9zdERpc3BfU3ViX0NpcmMsICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiorYXIoaXIwKSIsICBQcmVJUjBfQWRkLCAgICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKi1hcihpcjApIiwgIFByZUlSMF9TdWIsICAgICAgICAgTk9fRElTUCB9LAotICB7ICIqKythcihpcjApIiwgUHJlSVIwX0FkZF9Nb2QsICAgICBOT19ESVNQIH0sCi0gIHsgIiotLWFyKGlyMCkiLCBQcmVJUjBfU3ViX01vZCwgICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIwKSIsIFBvc3RJUjBfQWRkX01vZCwgICAgTk9fRElTUCB9LAotICB7ICIqYXItLShpcjApIiwgUG9zdElSMF9TdWJfTW9kLCAgICBOT19ESVNQIH0sCi0gIHsgIiphcisrKGlyMCklIixQb3N0SVIwX0FkZF9DaXJjLCAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyLS0oaXIwKSUiLFBvc3RJUjBfU3ViX0NpcmMsICAgTk9fRElTUCB9LAotICB7ICIqK2FyKGlyMSkiLCAgUHJlSVIxX0FkZCwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiotYXIoaXIxKSIsICBQcmVJUjFfU3ViLCAgICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKisrYXIoaXIxKSIsIFByZUlSMV9BZGRfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqLS1hcihpcjEpIiwgUHJlSVIxX1N1Yl9Nb2QsICAgICBOT19ESVNQIH0sCi0gIHsgIiphcisrKGlyMSkiLCBQb3N0SVIxX0FkZF9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyLS0oaXIxKSIsIFBvc3RJUjFfU3ViX01vZCwgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjEpJSIsUG9zdElSMV9BZGRfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMSklIixQb3N0SVIxX1N1Yl9DaXJjLCAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyIiwgICAgICAgIEluZGlyZWN0T25seSwgICAgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjApYiIsUG9zdElSMF9BZGRfQml0UmV2LCBOT19ESVNQIH0sCi0gIHsgIiIsICAgICAgICAgICAwLDAgfQotfTsKLQotc3RhdGljIGNvbnN0IGluZF9hZGRyX3R5cGUgKmNvbnN0IHRpYzMwX2luZGFkZHJ0YWJfZW5kCi0gID0gdGljMzBfaW5kYWRkcl90YWIgKyBzaXplb2YodGljMzBfaW5kYWRkcl90YWIpL3NpemVvZih0aWMzMF9pbmRhZGRyX3RhYlswXSk7Ci0KLS8qIFBvc3NpYmxlIG9wZXJhbmQgdHlwZXMgKi8KLS8qIFJlZ2lzdGVyIHR5cGVzICovCi0jZGVmaW5lIFJuICAgICAgIDB4MDAwMQotI2RlZmluZSBBUm4gICAgICAweDAwMDIKLSNkZWZpbmUgRFBSZWcgICAgMHgwMDA0Ci0jZGVmaW5lIE90aGVyUmVnIDB4MDAwOAotLyogQWRkcmVzc2luZyBtb2RlIHR5cGVzICovCi0jZGVmaW5lIERpcmVjdCAgIDB4MDAxMAotI2RlZmluZSBJbmRpcmVjdCAweDAwMjAKLSNkZWZpbmUgSW1tMTYgICAgMHgwMDQwCi0jZGVmaW5lIERpc3AgICAgIDB4MDA4MAotI2RlZmluZSBJbW0yNCAgICAweDAxMDAKLSNkZWZpbmUgQWJzMjQgICAgMHgwMjAwCi0vKiAzIG9wZXJhbmQgYWRkcmVzc2luZyBtb2RlIHR5cGVzICovCi0jZGVmaW5lIG9wM1QxICAgIDB4MDQwMAotI2RlZmluZSBvcDNUMiAgICAweDA4MDAKLS8qIEludGVycnVwdCB2ZWN0b3IgKi8KLSNkZWZpbmUgSVZlY3RvciAgMHgxMDAwCi0vKiBOb3QgcmVxdWlyZWQgKi8KLSNkZWZpbmUgTm90UmVxICAgMHgyMDAwCi0KLSNkZWZpbmUgR0FkZHIxICAgUm4gfCBEaXJlY3QgfCBJbmRpcmVjdCB8IEltbTE2Ci0jZGVmaW5lIEdBZGRyMiAgIEdBZGRyMSB8IEFsbFJlZwotI2RlZmluZSBUQWRkcjEgICBvcDNUMSB8IFJuIHwgSW5kaXJlY3QKLSNkZWZpbmUgVEFkZHIyICAgb3AzVDIgfCBSbiB8IEluZGlyZWN0Ci0jZGVmaW5lIFJlZyAgICAgIFJuIHwgQVJuCi0jZGVmaW5lIEFsbFJlZyAgIFJlZyB8IERQUmVnIHwgT3RoZXJSZWcKLQotdHlwZWRlZiBzdHJ1Y3QgX3RlbXBsYXRlCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBvcGVyYW5kczsgLyogaG93IG1hbnkgb3BlcmFuZHMgKi8KLSAgdW5zaWduZWQgaW50IGJhc2Vfb3Bjb2RlOyAvKiBiYXNlX29wY29kZSBpcyB0aGUgZnVuZGFtZW50YWwgb3Bjb2RlIGJ5dGUgKi8KLSAgLyogdGhlIGJpdHMgaW4gb3Bjb2RlX21vZGlmaWVyIGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBmaW5hbCBvcGNvZGUgZnJvbQotICAgICB0aGUgYmFzZV9vcGNvZGUuICBUaGVzZSBiaXRzIGFsc28gYXJlIHVzZWQgdG8gZGV0ZWN0IGFsdGVybmF0ZSBmb3JtcyBvZgotICAgICB0aGUgc2FtZSBpbnN0cnVjdGlvbiAqLwotICB1bnNpZ25lZCBpbnQgb3Bjb2RlX21vZGlmaWVyOwotCi0gIC8qIG9wY29kZV9tb2RpZmllciBiaXRzOiAqLwotI2RlZmluZSBBZGRyZXNzTW9kZSAweDAwNjAwMDAwCi0jZGVmaW5lIFBDUmVsICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgU3RhY2tPcCAgICAgMHgwMDFGMDAwMAotI2RlZmluZSBSb3RhdGUgICAgICBTdGFja09wCi0gIAotICAvKiBvcGVyYW5kX3R5cGVzW2ldIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBvcGVyYW5kIGkuICBUaGlzIGlzIG1hZGUKLSAgICAgYnkgT1InaW5nIHRvZ2V0aGVyIGFsbCBvZiB0aGUgcG9zc2libGUgdHlwZSBtYXNrcy4gIChlLmcuCi0gICAgICdvcGVyYW5kX3R5cGVzW2ldID0gUmVnfEltbScgc3BlY2lmaWVzIHRoYXQgb3BlcmFuZCBpIGNhbiBiZQotICAgICBlaXRoZXIgYSByZWdpc3RlciBvciBhbiBpbW1lZGlhdGUgb3BlcmFuZCAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZF90eXBlc1szXTsKLSAgLyogVGhpcyBkZWZpbmVzIHRoZSBudW1iZXIgdHlwZSBvZiBhbiBpbW1lZGlhdGUgYXJndW1lbnQgdG8gYW4gaW5zdHJ1Y3Rpb24uICovCi0gIGludCBpbW1fYXJnX3R5cGU7Ci0jZGVmaW5lIEltbV9Ob25lICAwCi0jZGVmaW5lIEltbV9GbG9hdCAxCi0jZGVmaW5lIEltbV9TSW50ICAyCi0jZGVmaW5lIEltbV9VSW50ICAzCi19Ci10ZW1wbGF0ZTsKLQotc3RhdGljIGNvbnN0IHRlbXBsYXRlIHRpYzMwX29wdGFiW10gPSB7Ci0gIHsgImFic2YiICAgLDIsMHgwMDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJhYnNpIiAgICwyLDB4MDA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAiYWRkYyIgICAsMiwweDAxMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFkZGMzIiAgLDMsMHgyMDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYWRkZiIgICAsMiwweDAxODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImFkZGYzIiAgLDMsMHgyMDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgUm4gfSwgSW1tX05vbmUgfSwKLSAgeyAiYWRkaSIgICAsMiwweDAyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFkZGkzIiAgLDMsMHgyMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYW5kIiAgICAsMiwweDAyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImFuZDMiICAgLDMsMHgyMTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYW5kbiIgICAsMiwweDAzMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImFuZG4zIiAgLDMsMHgyMjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYXNoIiAgICAsMiwweDAzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFzaDMiICAgLDMsMHgyMjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYiIgICAgICAsMSwweDY4MDAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ1IiAgICAgLDEsMHg2ODAwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibG8iICAgICwxLDB4NjgwMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxzIiAgICAsMSwweDY4MDIwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJoaSIgICAgLDEsMHg2ODAzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiaHMiICAgICwxLDB4NjgwNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmVxIiAgICAsMSwweDY4MDUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuZSIgICAgLDEsMHg2ODA2MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHQiICAgICwxLDB4NjgwNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxlIiAgICAsMSwweDY4MDgwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJndCIgICAgLDEsMHg2ODA5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZ2UiICAgICwxLDB4NjgwQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnoiICAgICAsMSwweDY4MDUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJueiIgICAgLDEsMHg2ODA2MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJicCIgICAgICwxLDB4NjgwOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm4iICAgICAsMSwweDY4MDcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJubiIgICAgLDEsMHg2ODBBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnYiICAgICwxLDB4NjgwQzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnYiICAgICAsMSwweDY4MEQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJudWYiICAgLDEsMHg2ODBFMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidWYiICAgICwxLDB4NjgwRjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5jIiAgICAsMSwweDY4MDQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJjIiAgICAgLDEsMHg2ODAxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmx2IiAgICwxLDB4NjgxMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx2IiAgICAsMSwweDY4MTEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJubHVmIiAgLDEsMHg2ODEyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHVmIiAgICwxLDB4NjgxMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnp1ZiIgICAsMSwweDY4MTQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJkIiAgICAgLDEsMHg2ODIwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidWQiICAgICwxLDB4NjgyMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxvZCIgICAsMSwweDY4MjEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsc2QiICAgLDEsMHg2ODIyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiaGlkIiAgICwxLDB4NjgyMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhzZCIgICAsMSwweDY4MjQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJlcWQiICAgLDEsMHg2ODI1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmVkIiAgICwxLDB4NjgyNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx0ZCIgICAsMSwweDY4MjcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsZWQiICAgLDEsMHg2ODI4MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZ3RkIiAgICwxLDB4NjgyOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmdlZCIgICAsMSwweDY4MkEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6ZCIgICAgLDEsMHg2ODI1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnpkIiAgICwxLDB4NjgyNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnBkIiAgICAsMSwweDY4MjkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuZCIgICAgLDEsMHg2ODI3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibm5kIiAgICwxLDB4NjgyQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm52ZCIgICAsMSwweDY4MkMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ2ZCIgICAgLDEsMHg2ODJEMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnVmZCIgICwxLDB4NjgyRTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVmZCIgICAsMSwweDY4MkYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuY2QiICAgLDEsMHg2ODI0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiY2QiICAgICwxLDB4NjgyMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdmQiICAsMSwweDY4MzAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdmQiICAgLDEsMHg2ODMxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmx1ZmQiICwxLDB4NjgzMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx1ZmQiICAsMSwweDY4MzMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6dWZkIiAgLDEsMHg2ODM0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiciIgICAgICwxLDB4NjAwMDAwMDAsMCwgICAgICAgICAgIHsgSW1tMjQsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiYnJkIiAgICAsMSwweDYxMDAwMDAwLDAsICAgICAgICAgICB7IEltbTI0LCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGwiICAgLDEsMHg2MjAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsdSIgICwxLDB4NzAwMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGxvIiAsMSwweDcwMDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxscyIgLDEsMHg3MDAyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsaGkiICwxLDB4NzAwMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGhzIiAsMSwweDcwMDQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxlcSIgLDEsMHg3MDA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbmUiICwxLDB4NzAwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGx0IiAsMSwweDcwMDcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsZSIgLDEsMHg3MDA4MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsZ3QiICwxLDB4NzAwOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGdlIiAsMSwweDcwMEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx6IiAgLDEsMHg3MDA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbnoiICwxLDB4NzAwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbHAiICAsMSwweDcwMDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxuIiAgLDEsMHg3MDA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbm4iICwxLDB4NzAwQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG52IiAsMSwweDcwMEMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx2IiAgLDEsMHg3MDBEMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbnVmIiwxLDB4NzAwRTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbHVmIiAsMSwweDcwMEYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxuYyIgLDEsMHg3MDA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsYyIgICwxLDB4NzAwMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5sdiIsMSwweDcwMTAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdiIgLDEsMHg3MDExMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbmx1ZiIsMSwweDcwMTIwMDAwLFBDUmVsLCAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGx1ZiIsMSwweDcwMTMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx6dWYiLDEsMHg3MDE0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjbXBmIiAgICwyLDB4MDQwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAiY21wZjMiICAsMiwweDIzMDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMSwgVEFkZHIyLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImNtcGkiICAgLDIsMHgwNDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJjbXBpMyIgICwyLDB4MjM4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYiIgICAgICwyLDB4NkMwMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnUiICAgICwyLDB4NkMwMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxvIiAgICwyLDB4NkMwMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxzIiAgICwyLDB4NkMwMjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmhpIiAgICwyLDB4NkMwMzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmhzIiAgICwyLDB4NkMwNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmVxIiAgICwyLDB4NkMwNTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5lIiAgICwyLDB4NkMwNjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx0IiAgICwyLDB4NkMwNzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxlIiAgICwyLDB4NkMwODAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmd0IiAgICwyLDB4NkMwOTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmdlIiAgICwyLDB4NkMwQTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnoiICAgICwyLDB4NkMwNTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm56IiAgICwyLDB4NkMwNjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnAiICAgICwyLDB4NkMwOTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm4iICAgICwyLDB4NkMwNzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5uIiAgICwyLDB4NkMwQTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm52IiAgICwyLDB4NkMwQzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnYiICAgICwyLDB4NkMwRDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm51ZiIgICwyLDB4NkMwRTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnVmIiAgICwyLDB4NkMwRjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5jIiAgICwyLDB4NkMwNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmMiICAgICwyLDB4NkMwMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5sdiIgICwyLDB4NkMxMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx2IiAgICwyLDB4NkMxMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5sdWYiICwyLDB4NkMxMjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx1ZiIgICwyLDB4NkMxMzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnp1ZiIgICwyLDB4NkMxNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmQiICAgICwyLDB4NkMyMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnVkIiAgICwyLDB4NkMyMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxvZCIgICwyLDB4NkMyMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxzZCIgICwyLDB4NkMyMjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmhpZCIgICwyLDB4NkMyMzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmhzZCIgICwyLDB4NkMyNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmVxZCIgICwyLDB4NkMyNTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5lZCIgICwyLDB4NkMyNjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx0ZCIgICwyLDB4NkMyNzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxlZCIgICwyLDB4NkMyODAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmd0ZCIgICwyLDB4NkMyOTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmdlZCIgICwyLDB4NkMyQTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnpkIiAgICwyLDB4NkMyNTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm56ZCIgICwyLDB4NkMyNjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnBkIiAgICwyLDB4NkMyOTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5kIiAgICwyLDB4NkMyNzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5uZCIgICwyLDB4NkMyQTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm52ZCIgICwyLDB4NkMyQzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnZkIiAgICwyLDB4NkMyRDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm51ZmQiICwyLDB4NkMyRTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnVmZCIgICwyLDB4NkMyRjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5jZCIgICwyLDB4NkMyNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmNkIiAgICwyLDB4NkMyMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5sdmQiICwyLDB4NkMzMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx2ZCIgICwyLDB4NkMzMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5sdWZkIiwyLDB4NkMzMjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx1ZmQiICwyLDB4NkMzMzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnp1ZmQiICwyLDB4NkMzNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJmaXgiICAgICwyLDB4MDUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBBbGxSZWcsIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImZsb2F0IiAgLDIsMHgwNTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIFJuLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImlhY2siICAgLDEsMHgxQjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBEaXJlY3R8SW5kaXJlY3QsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiaWRsZSIgICAsMCwweDA2MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiaWRsZTIiICAsMCwweDA2MDAwMDAxLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwgLyogTEMzMSBPbmx5ICovCi0gIHsgImxkZSIgICAgLDIsMHgwNjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGYiICAgICwyLDB4MDcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmdSIgICAsMiwweDQwMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmxvIiAgLDIsMHg0MDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZscyIgICwyLDB4NDEwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmaGkiICAsMiwweDQxODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmhzIiAgLDIsMHg0MjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZlcSIgICwyLDB4NDI4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbmUiICAsMiwweDQzMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmx0IiAgLDIsMHg0MzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsZSIgICwyLDB4NDQwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmZ3QiICAsMiwweDQ0ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmdlIiAgLDIsMHg0NTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ6IiAgICwyLDB4NDI4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbnoiICAsMiwweDQzMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZnAiICAgLDIsMHg0NDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZuIiAgICwyLDB4NDM4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbm4iICAsMiwweDQ1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm52IiAgLDIsMHg0NjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ2IiAgICwyLDB4NDY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbnVmIiAsMiwweDQ3MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZnVmIiAgLDIsMHg0NzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZuYyIgICwyLDB4NDIwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmYyIgICAsMiwweDQwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5sdiIgLDIsMHg0ODAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdiIgICwyLDB4NDg4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbmx1ZiIsMiwweDQ5MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmx1ZiIgLDIsMHg0OTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ6dWYiICwyLDB4NEEwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmaSIgICAsMiwweDA3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IERpcmVjdHxJbmRpcmVjdCwgUm4sIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAibGRpIiAgICAsMiwweDA4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXUiICAgLDIsMHg1MDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlsbyIgICwyLDB4NTA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHMiICAsMiwweDUxMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWhpIiAgLDIsMHg1MTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlocyIgICwyLDB4NTIwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpZXEiICAsMiwweDUyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5lIiAgLDIsMHg1MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlsdCIgICwyLDB4NTM4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbGUiICAsMiwweDU0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWd0IiAgLDIsMHg1NDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlnZSIgICwyLDB4NTUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpeiIgICAsMiwweDUyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW56IiAgLDIsMHg1MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlwIiAgICwyLDB4NTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbiIgICAsMiwweDUzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5uIiAgLDIsMHg1NTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGludiIgICwyLDB4NTYwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpdiIgICAsMiwweDU2ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW51ZiIgLDIsMHg1NzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGl1ZiIgICwyLDB4NTc4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbmMiICAsMiwweDUyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWMiICAgLDIsMHg1MDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubHYiICwyLDB4NTgwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHYiICAsMiwweDU4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5sdWYiLDIsMHg1OTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlsdWYiICwyLDB4NTk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpenVmIiAsMiwweDVBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWkiICAgLDIsMHgwODgwMDAwMCxBZGRyZXNzTW9kZSwgeyBEaXJlY3R8SW5kaXJlY3QsIEFsbFJlZywgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJsZG0iICAgICwyLDB4MDkwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRwIiAgICAsMiwweDA4NzAwMDAwLDAsICAgICAgICAgICB7IEFiczI0fERpcmVjdCwgRFBSZWd8Tm90UmVxLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImxvcG93ZXIiLDAsMHgxMDgwMDAwMSwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sIC8qIExDMzEgT25seSAqLwotICB7ICJsc2giICAgICwyLDB4MDk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAibHNoMyIgICAsMywweDI0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIEFsbFJlZyB9LCBJbW1fTm9uZSB9LAotICB7ICJtYXhzcGVlZCIsMCwweDEwODAwMDAwLDAsICAgICAgICAgIHsgMCwgMCwgMCB9LCBJbW1fTm9uZSB9LCAvKiBMQzMxIE9ubHkgKi8KLSAgeyAibXB5ZiIgICAsMiwweDBBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgIm1weWYzIiAgLDMsMHgyNDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgUm4gfSwgSW1tX05vbmUgfSwKLSAgeyAibXB5aSIgICAsMiwweDBBODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgIm1weWkzIiAgLDMsMHgyNTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAibmVnYiIgICAsMiwweDBCMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgIm5lZ2YiICAgLDIsMHgwQjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJuZWdpIiAgICwyLDB4MEMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibm9wIiAgICAsMSwweDBDODAwMDAwLEFkZHJlc3NNb2RlLCB7IEFsbFJlZ3xJbmRpcmVjdHxOb3RSZXEsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAibm9ybSIgICAsMiwweDBEMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sIC8qQ2hlY2sgYW5vdGhlciBzb3VyY2UqLwotICB7ICJub3QiICAgICwyLDB4MEQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAib3IiICAgICAsMiwweDEwMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgIm9yMyIgICAgLDMsMHgyNTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAicG9wIiAgICAsMSwweDBFMjAwMDAwLFN0YWNrT3AsICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJwb3BmIiAgICwxLDB4MEVBMDAwMDAsU3RhY2tPcCwgICAgIHsgUm4sIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicHVzaCIgICAsMSwweDBGMjAwMDAwLFN0YWNrT3AsICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJwdXNoZiIgICwxLDB4MEZBMDAwMDAsU3RhY2tPcCwgICAgIHsgUm4sIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aSIgICAsMCwweDc4MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXUiICAsMCwweDc4MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWxvIiAsMCwweDc4MDEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWxzIiAsMCwweDc4MDIwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWhpIiAsMCwweDc4MDMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWhzIiAsMCwweDc4MDQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWVxIiAsMCwweDc4MDUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5lIiAsMCwweDc4MDYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWx0IiAsMCwweDc4MDcwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWxlIiAsMCwweDc4MDgwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWd0IiAsMCwweDc4MDkwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWdlIiAsMCwweDc4MEEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXoiICAsMCwweDc4MDUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW56IiAsMCwweDc4MDYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXAiICAsMCwweDc4MDkwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW4iICAsMCwweDc4MDcwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5uIiAsMCwweDc4MEEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW52IiAsMCwweDc4MEMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXYiICAsMCwweDc4MEQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW51ZiIsMCwweDc4MEUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXVmIiAsMCwweDc4MEYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5jIiAsMCwweDc4MDQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWMiICAsMCwweDc4MDEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5sdiIsMCwweDc4MTAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWx2IiAsMCwweDc4MTEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5sdWYiLDAsMHg3ODEyMDAwMCwwLCAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWx1ZiIsMCwweDc4MTMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXp1ZiIsMCwweDc4MTQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0cyIgICAsMCwweDc4ODAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3UiICAsMCwweDc4ODAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2xvIiAsMCwweDc4ODEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2xzIiAsMCwweDc4ODIwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2hpIiAsMCwweDc4ODMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2hzIiAsMCwweDc4ODQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2VxIiAsMCwweDc4ODUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25lIiAsMCwweDc4ODYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2x0IiAsMCwweDc4ODcwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2xlIiAsMCwweDc4ODgwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2d0IiAsMCwweDc4ODkwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2dlIiAsMCwweDc4OEEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3oiICAsMCwweDc4ODUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c256IiAsMCwweDc4ODYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3AiICAsMCwweDc4ODkwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c24iICAsMCwweDc4ODcwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25uIiAsMCwweDc4OEEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c252IiAsMCwweDc4OEMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3YiICAsMCwweDc4OEQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c251ZiIsMCwweDc4OEUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3VmIiAsMCwweDc4OEYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25jIiAsMCwweDc4ODQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2MiICAsMCwweDc4ODEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25sdiIsMCwweDc4OTAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2x2IiAsMCwweDc4OTEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25sdWYiLDAsMHg3ODkyMDAwMCwwLCAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2x1ZiIsMCwweDc4OTMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3p1ZiIsMCwweDc4OTQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicm5kIiAgICAsMiwweDExMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInJvbCIgICAgLDEsMHgxMUUwMDAwMSxSb3RhdGUsICAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicm9sYyIgICAsMSwweDEyNjAwMDAxLFJvdGF0ZSwgICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJyb3IiICAgICwxLDB4MTJFMEZGRkYsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJvcmMiICAgLDEsMHgxMzYwRkZGRixSb3RhdGUsICAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicnB0YiIgICAsMSwweDY0MDAwMDAwLDAsICAgICAgICAgICB7IEltbTI0LCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInJwdHMiICAgLDEsMHgxMzlCMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAic2lnaSIgICAsMCwweDE2MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAic3RmIiAgICAsMiwweDE0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFJuLCBEaXJlY3R8SW5kaXJlY3QsIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInN0ZmkiICAgLDIsMHgxNDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBSbiwgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdGkiICAgICwyLDB4MTUwMDAwMDAsQWRkcmVzc01vZGUsIHsgQWxsUmVnLCBEaXJlY3R8SW5kaXJlY3QsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3RpaSIgICAsMiwweDE1ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEFsbFJlZywgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YmIiICAgLDIsMHgxNjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJzdWJiMyIgICwzLDB4MjYwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgInN1YmMiICAgLDIsMHgxNzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJzdWJmIiAgICwyLDB4MTc4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAic3ViZjMiICAsMywweDI2ODAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMSwgVEFkZHIyLCBSbiB9LCBJbW1fTm9uZSB9LAotICB7ICJzdWJpIiAgICwyLDB4MTgwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3ViaTMiICAsMywweDI3MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIEFsbFJlZyB9LCBJbW1fTm9uZSB9LAotICB7ICJzdWJyYiIgICwyLDB4MTg4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3VicmYiICAsMiwweDE5MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInN1YnJpIiAgLDIsMHgxOTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJzd2kiICAgICwwLDB4NjYwMDAwMDAsMCwgICAgICAgICAgIHsgMCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwIiAgICwxLDB4NzQ4MDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwdSIgICwxLDB4NzQ4MDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbG8iICwxLDB4NzQ4MTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbHMiICwxLDB4NzQ4MjAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwaGkiICwxLDB4NzQ4MzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwaHMiICwxLDB4NzQ4NDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwZXEiICwxLDB4NzQ4NTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbmUiICwxLDB4NzQ4NjAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbHQiICwxLDB4NzQ4NzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbGUiICwxLDB4NzQ4ODAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwZ3QiICwxLDB4NzQ4OTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwZ2UiICwxLDB4NzQ4QTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFweiIgICwxLDB4NzQ4NTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbnoiICwxLDB4NzQ4NjAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwcCIgICwxLDB4NzQ4OTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbiIgICwxLDB4NzQ4NzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbm4iICwxLDB4NzQ4QTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbnYiICwxLDB4NzQ4QzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwdiIgICwxLDB4NzQ4RDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbnVmIiwxLDB4NzQ4RTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwdWYiICwxLDB4NzQ4RjAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbmMiICwxLDB4NzQ4NDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwYyIgICwxLDB4NzQ4MTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbmx2IiwxLDB4NzQ5MDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbHYiICwxLDB4NzQ5MTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbmx1ZiIsMSwweDc0OTIwMDIwLDAsICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbHVmIiwxLDB4NzQ5MzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwenVmIiwxLDB4NzQ5NDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0c3RiIiAgICwyLDB4MUEwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAidHN0YjMiICAsMiwweDI3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAieG9yIiAgICAsMiwweDFBODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInhvcjMiICAgLDMsMHgyODAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiIiAgICAgICAsMCwweDAwMDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgdGVtcGxhdGUgKmNvbnN0IHRpYzMwX29wdGFiX2VuZCA9Ci0gIHRpYzMwX29wdGFiICsgc2l6ZW9mKHRpYzMwX29wdGFiKS9zaXplb2YodGljMzBfb3B0YWJbMF0pOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBvcGVyYW5kc18xOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHNfMjsKLSAgdW5zaWduZWQgaW50IGJhc2Vfb3Bjb2RlOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZF90eXBlc1syXVszXTsKLSAgLyogV2hpY2ggb3BlcmFuZCBmaXRzIGludG8gd2hpY2ggcGFydCBvZiB0aGUgZmluYWwgb3Bjb2RlIHdvcmQuICovCi0gIGludCBvcG9yZGVyOwotfSBwYXJ0ZW1wbGF0ZTsKLQotLyogb3BvcmRlciBkZWZpbmVzIC0gbm90IHZlcnkgZGVzY3JpcHRpdmUuICovCi0jZGVmaW5lIE9PXzRvcDEgICAwCi0jZGVmaW5lIE9PXzRvcDIgICAxCi0jZGVmaW5lIE9PXzRvcDMgICAyCi0jZGVmaW5lIE9PXzVvcDEgICAzCi0jZGVmaW5lIE9PXzVvcDIgICA0Ci0jZGVmaW5lIE9PX1BGaWVsZCA1Ci0KLXN0YXRpYyBjb25zdCBwYXJ0ZW1wbGF0ZSB0aWMzMF9wYXJvcHRhYltdID0gewotICB7ICJxX2Fic2Zfc3RmIiwgICAyLDIsMHhDODAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX2Fic2lfc3RpIiwgICAyLDIsMHhDQTAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX2FkZGYzX3N0ZiIsICAzLDIsMHhDQzAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9hZGRpM19zdGkiLCAgMywyLDB4Q0UwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfYW5kM19zdGkiLCAgIDMsMiwweEQwMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX2FzaDNfc3RpIiwgICAzLDIsMHhEMjAwMDAwMCwgeyB7IFJuLCBJbmRpcmVjdCwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDIgfSwKLSAgeyAicV9maXhfc3RpIiwgICAgMiwyLDB4RDQwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9mbG9hdF9zdGYiLCAgMiwyLDB4RDYwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9sZGZfbGRmIiwgICAgMiwyLDB4QzQwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBJbmRpcmVjdCwgUm4sIDAgfSB9LAotCU9PXzRvcDIgfSwKLSAgeyAicV9sZGZfc3RmIiwgICAgMiwyLDB4RDgwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9sZGlfbGRpIiwgICAgMiwyLDB4QzYwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBJbmRpcmVjdCwgUm4sIDAgfSB9LAotCU9PXzRvcDIgfSwKLSAgeyAicV9sZGlfc3RpIiwgICAgMiwyLDB4REEwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9sc2gzX3N0aSIsICAgMywyLDB4REMwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfbXB5ZjNfYWRkZjMiLDMsMywweDgwMDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLSAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9IH0sIE9PX1BGaWVsZCB9LAotICB7ICJxX21weWYzX3N0ZiIsICAzLDIsMHhERTAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9tcHlmM19zdWJmMyIsMywzLDB4ODQwMDAwMDAsIHsgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSB9LCBPT19QRmllbGQgfSwKLSAgeyAicV9tcHlpM19hZGRpMyIsMywzLDB4ODgwMDAwMDAsIHsgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSB9LCBPT19QRmllbGQgfSwKLSAgeyAicV9tcHlpM19zdGkiLCAgMywyLDB4RTAwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfbXB5aTNfc3ViaTMiLDMsMywweDhDMDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbmVnZl9zdGYiLCAgIDIsMiwweEUyMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbmVnaV9zdGkiLCAgIDIsMiwweEU0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbm90X3N0aSIsICAgIDIsMiwweEU2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfb3IzX3N0aSIsICAgIDMsMiwweEU4MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX3N0Zl9zdGYiLCAgICAyLDIsMHhDMDAwMDAwMCwgeyB7IFJuLCBJbmRpcmVjdCwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMyB9LAotICB7ICJxX3N0aV9zdGkiLCAgICAyLDIsMHhDMjAwMDAwMCwgeyB7IFJuLCBJbmRpcmVjdCwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMyB9LAotICB7ICJxX3N1YmYzX3N0ZiIsICAzLDIsMHhFQTAwMDAwMCwgeyB7IFJuLCBJbmRpcmVjdCwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDIgfSwKLSAgeyAicV9zdWJpM19zdGkiLCAgMywyLDB4RUMwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfeG9yM19zdGkiLCAgIDMsMiwweEVFMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICIiLCAgICAgICAgICAgICAwLDAsMHgwMDAwMDAwMCwgeyB7IDAsIDAsIDAgfSwgeyAwLCAwLCAwIH0gfSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgcGFydGVtcGxhdGUgKmNvbnN0IHRpYzMwX3Bhcm9wdGFiX2VuZCA9Ci0gIHRpYzMwX3Bhcm9wdGFiICsgc2l6ZW9mKHRpYzMwX3Bhcm9wdGFiKS9zaXplb2YodGljMzBfcGFyb3B0YWJbMF0pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3RpYzgwLmggYi9pbmNsdWRlL29wY29kZS90aWM4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliYzMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RpYzgwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyogdGljODAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVikgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSksIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVElDODBfSAotI2RlZmluZSBUSUM4MF9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHRpYzgwX29wY29kZS4gICovCi0KLXN0cnVjdCB0aWM4MF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLQotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIG9wZXJhbmRzCi0gICAgIGFyZSB6ZXJvZXMuICAqLwotCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhIG1hc2sKLSAgICAgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZSBvcGNvZGUKLSAgICAgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90IG1hdGNoIChhbmQgYXJlCi0gICAgIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIFNwZWNpYWwgcHVycG9zZSBmbGFncyBmb3IgdGhpcyBvcGNvZGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBmbGFnczsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlIG9wZXJhbmQKLSAgICAgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QgYXBwZWFyIGluCi0gICAgIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICBGSVhNRTogQWRqdXN0IHNpemUgdG8KLSAgICAgbWF0Y2ggYWN0dWFsIHJlcXVpcmVtZW50cyB3aGVuIFRJYzgwIHN1cHBvcnQgaXMgY29tcGxldGUgKi8KLQotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZSBpbgotICAgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyIGluc3RydWN0aW9ucy4KLSAgIEZJWE1FOiBUaGlzIGlzbid0IGN1cnJlbnRseSB0cnVlLiAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSB0aWM4MF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHRpYzgwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHRpYzgwX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgdGljODBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0KLSAgdW5zaWduZWQgbG9uZyAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgbG9uZyBvcCwKLQkJCQkgICBjb25zdCBjaGFyICoqZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKLQkgaWYgKChvLT5mbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0KLSAgbG9uZyAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLQotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSB0aWM4MF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kIHRpYzgwX29wZXJhbmRzW107Ci0KLQwKLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgdGljODBfb3BlcmFuZC4KLQotICAgTm90ZSB0aGF0IGZsYWdzIGZvciBhbGwgcHJlZGVmaW5lZCBzeW1ib2xzLCBzdWNoIGFzIHRoZSBnZW5lcmFsIHB1cnBvc2UKLSAgIHJlZ2lzdGVycyAoZXg6IHIxMCksIGNvbnRyb2wgcmVnaXN0ZXJzIChleDogRlBTVCksIGNvbmRpdGlvbiBjb2RlcyAoZXg6Ci0gICBlcTAuYiksIGJpdCBudW1iZXJzIChleDogZ3QuYiksIGV0YyBhcmUgbGFyZ2UgZW5vdWdoIHRoYXQgdGhleSBjYW4gYmUKLSAgIG9yJ2QgaW50byBhbiBpbnQgd2hlcmUgdGhlIGxvd2VyIGJpdHMgY29udGFpbiB0aGUgYWN0dWFsIG51bWVyaWMgdmFsdWUKLSAgIHRoYXQgY29ycmVwb25kcyB0byB0aGlzIHByZWRlZmluZWQgc3ltYm9sLiAgVGhpcyB3YXkgYSBzaW5nbGUgaW50IGNhbgotICAgY29udGFpbiBib3RoIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBpdCdzIHR5cGUuCi0gKi8KLQotLyogVGhpcyBvcGVyYW5kIG11c3QgYmUgYW4gZXZlbiByZWdpc3RlciBudW1iZXIuICBGbG9hdGluZyBwb2ludCBudW1iZXJzCi0gICBmb3IgZXhhbXBsZSBhcmUgc3RvcmVkIGluIGV2ZW4vb2RkIHJlZ2lzdGVyIHBhaXJzLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfRVZFTgkoMSA8PCAwKQotCi0vKiBUaGlzIG9wZXJhbmQgbXVzdCBiZSBhbiBvZGQgcmVnaXN0ZXIgbnVtYmVyIGFuZCBtdXN0IGJlIG9uZSBncmVhdGVyIHRoYW4KLSAgIHRoZSByZWdpc3RlciBudW1iZXIgb2YgdGhlIHByZXZpb3VzIG9wZXJhbmQuICBJLkUuIHRoZSBzZWNvbmQgcmVnaXN0ZXIgaW4KLSAgIGFuIGV2ZW4vb2RkIHJlZ2lzdGVyIHBhaXIuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9PREQJKDEgPDwgMSkKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfU0lHTkVECSgxIDw8IDIpCi0KLS8qIFRoaXMgb3BlcmFuZCBtYXkgYmUgZWl0aGVyIGEgcHJlZGVmaW5lZCBjb25zdGFudCBuYW1lIG9yIGEgbnVtZXJpYyB2YWx1ZS4KLSAgIEFuIGV4YW1wbGUgd291bGQgYmUgYSBjb25kaXRpb24gY29kZSBsaWtlICJlcTAuYiIgd2hpY2ggaGFzIHRoZSBudW1lcmljCi0gICB2YWx1ZSAweDIuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9OVU0JKDEgPDwgMykKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuIHNlcGFyYXRlZAotICAgZnJvbSB0aGUgcHJldmlvdXMgb25lIGJ5IGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIHZhcmlvdXMKLSAgIGluc3RydWN0aW9ucywgbGlrZSB0aGUgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLCB3aGljaCB3YW50Ci0gICB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UgImRpc3BsYWNlbWVudChyZWcpIiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfUEFSRU5TCSgxIDw8IDQpCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIFBDIHJlbGF0aXZlIGJyYW5jaCBvZmZzZXQuICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cwotICAgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgTm90ZSB0aGF0IHRoZSBvZmZzZXRzIGFyZSB0YWtlbiBhcyB3b3JkCi0gICBvZmZzZXRzLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfUENSRUwJKDEgPDwgNSkKLQotLyogVGhpcyBmbGFnIGlzIGEgaGludCB0byB0aGUgZGlzYXNzZW1ibGVyIGZvciB1c2luZyBoZXggYXMgdGhlIHByZWZlcmVkCi0gICBwcmludGluZyBmb3JtYXQsIGV2ZW4gZm9yIHNtYWxsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGltbWVkaWF0ZSB2YWx1ZXMuCi0gICBOb3JtYWxseSB2YWx1ZXMgaW4gdGhlIHJhbmdlIC05OTkgdG8gOTk5IGFyZSBwcmludGVkIGFzIHNpZ25lZCBkZWNpbWFsCi0gICB2YWx1ZXMgYW5kIG90aGVyIHZhbHVlcyBhcmUgcHJpbnRlZCBpbiBoZXguICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9CSVRGSUVMRAkoMSA8PCA2KQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOm0iIG1vZGlmaWVyIHNwZWNpZmllZCBieSBiaXQgMTcgaW4gYSBzaG9ydAotICAgaW1tZWRpYXRlIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9NX1NJCSgxIDw8IDcpCi0KLS8qIFRoaXMgb3BlcmFuZCBtYXkgaGF2ZSBhICI6bSIgbW9kaWZpZXIgc3BlY2lmaWVkIGJ5IGJpdCAxNSBpbiBhIGxvbmcKLSAgIGltbWVkaWF0ZSBvciByZWdpc3RlciBmb3JtIGluc3RydWN0aW9uLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTV9MSQkoMSA8PCA4KQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOnMiIG1vZGlmaWVyIHNwZWNpZmllZCBpbiBiaXQgMTEgaW4gYSBsb25nCi0gICBpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1NDQUxFRAkoMSA8PCA5KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfRkxPQVQJKDEgPDwgMTApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBieXRlIG9mZnNldCBmcm9tIGEgYmFzZSByZWxvY2F0aW9uLiBUaGUgbG93ZXIKLSB0d28gYml0cyBvZiB0aGUgZmluYWwgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIGlnbm9yZWQgd2hlbiB0aGUgdmFsdWUgaXMKLSB3cml0dGVuIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9CQVNFUkVMCSgxIDw8IDExKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gImVuZG1hc2siIGZpZWxkIGZvciBhIHNoaWZ0IGluc3RydWN0aW9uLgotICAgSXQgaXMgdHJlYXRlZCBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGhhdmUgdmFsdWVzIG9mIDAtMzIsCi0gICB3aGVyZSAwIGFuZCAzMiByZXN1bHQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGUgYXNzZW1ibGVyCi0gICBtdXN0IGJlIGFibGUgdG8gYWNjZXB0IGJvdGggZW5kbWFzayB2YWx1ZXMuICBUaGlzIGRpc2Fzc2VtYmxlcgotICAgaGFzIG5vIHdheSBvZiBrbm93aW5nIGZyb20gdGhlIGluc3RydWN0aW9uIHdoaWNoIHZhbHVlIHdhcyAKLSAgIGdpdmVuIGF0IGFzc2VtYmx5IHRpbWUsIHNvIGl0IGp1c3QgdXNlcyAnMCcuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9FTkRNQVNLCSgxIDw8IDEyKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgb25lIG9mIHRoZSAzMiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgotICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ3InLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfR1BSCSgxIDw8IDI3KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciByZWdpc3Rlci4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdhJy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0ZQQQkoIDEgPDwgMjgpCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIGNvbnRyb2wgcmVnaXN0ZXIgbnVtYmVyLCBlaXRoZXIgbnVtZXJpYyBvcgotICAgc3ltYm9saWMgKGxpa2UgIkVJRiIsICJFUEMiLCBldGMpLgotICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5LiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQ1IJKDEgPDwgMjkpCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIGNvbmRpdGlvbiBjb2RlLCBlaXRoZXIgbnVtZXJpYyBvcgotICAgc3ltYm9saWMgKGxpa2UgImVxMC5iIiwgIm5lMC53IiwgZXRjKS4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseS4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0NDCSgxIDw8IDMwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBiaXQgbnVtYmVyLCBlaXRoZXIgbnVtZXJpYyBvcgotICAgc3ltYm9saWMgKGxpa2UgImVxLmIiLCAib3IuZiIsIGV0YykuCi0gICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkuCi0gICBOb3RlIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIGluc3RydWN0aW9uIGluIDEncyBjb21wbGVtZW50IHJlbGF0aXZlCi0gICB0byB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBtYW51YWwuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9CSVROVU0JKDEgPDwgMzEpCi0KLS8qIFRoaXMgbWFzayBpcyB1c2VkIHRvIHN0cmlwIG9wZXJhbmQgYml0cyBmcm9tIGFuIGludCB0aGF0IGNvbnRhaW5zCi0gICBib3RoIG9wZXJhbmQgYml0cyBhbmQgYSBudW1lcmljIHZhbHVlIGluIHRoZSBsc2JzLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTUFTSwkoVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfQ1IgfCBUSUM4MF9PUEVSQU5EX0NDIHwgVElDODBfT1BFUkFORF9CSVROVU0pCi0KLQwKLS8qIEZsYWcgYml0cyBmb3IgdGhlIHN0cnVjdCB0aWM4MF9vcGNvZGUgZmxhZ3MgZmllbGQuICovCi0KLSNkZWZpbmUgVElDODBfVkVDVE9SCQkwMQkvKiBJcyBhIHZlY3RvciBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBUSUM4MF9OT19SMF9ERVNUCTAyCS8qIFJlZ2lzdGVyIHIwIGNhbm5vdCBiZSBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0KLQwKLS8qIFRoZSBvcGNvZGVzIGxpYnJhcnkgY29udGFpbnMgYSB0YWJsZSB0aGF0IGFsbG93cyB0cmFuc2xhdGlvbiBmcm9tIHByZWRlZmluZWQKLSAgIHN5bWJvbCBuYW1lcyB0byBudW1lcmljIHZhbHVlcywgYW5kIHZpY2UgdmVyc2EuICovCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgc3ltYm9scy4gICovCi0KLXN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbAotewotICBjaGFyICpuYW1lOwkJLyogbmFtZSB0byByZWNvZ25pemUgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotI2RlZmluZSBQRFNfTkFNRShwZHNwKSAoKHBkc3ApIC0+IG5hbWUpCi0jZGVmaW5lIFBEU19WQUxVRShwZHNwKSAoKHBkc3ApIC0+IHZhbHVlKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sIHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1tdOwkvKiBUcmFuc2xhdGlvbiBhcnJheSAqLwotZXh0ZXJuIGNvbnN0IGludCB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzOwkJCQkvKiBIb3cgbWFueSBtZW1iZXJzIGluIHRoZSBhcnJheSAqLwotCi1jb25zdCBjaGFyICp0aWM4MF92YWx1ZV90b19zeW1ib2wgUEFSQU1TICgoaW50IHZhbCwgaW50IGNsYXNzKSk7CS8qIFRyYW5zbGF0ZSB2YWx1ZSB0byBzeW1ib2xpYyBuYW1lICovCi1pbnQgdGljODBfc3ltYm9sX3RvX3ZhbHVlIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGludCBjbGFzcykpOwkJLyogVHJhbnNsYXRlIHN5bWJvbGljIG5hbWUgdG8gdmFsdWUgKi8KLQotY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICoKLXRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICopKTsKLQotI2VuZGlmIC8qIFRJQzgwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3Y4NTAuaCBiL2luY2x1ZGUvb3Bjb2RlL3Y4NTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5MTZmMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS92ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogdjg1MC5oIC0tIEhlYWRlciBmaWxlIGZvciBORUMgVjg1MCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKLlQuIENvbmtsaW4sIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVjg1MF9ICi0jZGVmaW5lIFY4NTBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB2ODUwX29wY29kZS4gICovCi0KLXN0cnVjdCB2ODUwX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLQotICAvKiBXaGljaCAoaWYgYW55KSBvcGVyYW5kIGlzIGEgbWVtb3J5IG9wZXJhbmQuICAqLwotICB1bnNpZ25lZCBpbnQgbWVtb3A7Ci0KLSAgLyogVGFyZ2V0IHByb2Nlc3NvcihzKS4gIEEgYml0IGZpZWxkIG9mIHByb2Nlc3NvcnMgd2hpY2ggc3VwcG9ydAotICAgICB0aGlzIGluc3RydWN0aW9uLiAgTm90ZSBhIGJpdCBmaWVsZCBpcyB1c2VkIGFzIHNvbWUgaW5zdHJ1Y3Rpb25zCi0gICAgIGFyZSBhdmFpbGFibGUgb24gbXVsdGlwbGUsIGRpZmZlcmVudCBwcm9jZXNzb3IgdHlwZXMsIHdoZXJlYXMKLSAgICAgb3RoZXIgaW5zdHJ1Y3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBvbmUgc3BlY2lmaWMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBwcm9jZXNzb3JzOwotfTsKLQotLyogVmFsdWVzIGZvciB0aGUgcHJvY2Vzc29ycyBmaWVsZCBpbiB0aGUgdjg1MF9vcGNvZGUgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX1Y4NTAJCSgxIDw8IDApCQkvKiBKdXN0IHRoZSBWODUwLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX0FMTAkJLTEJCQkvKiBBbnkgcHJvY2Vzc29yLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX1Y4NTBFCQkoMSA8PCAxKQkJLyogSnVzdCB0aGUgVjg1MEUuICovCi0jZGVmaW5lIFBST0NFU1NPUl9OT1RfVjg1MAkofiBQUk9DRVNTT1JfVjg1MCkJLyogQW55IHByb2Nlc3NvciBleGNlcHQgdGhlIFY4NTAuICAqLwotI2RlZmluZSBQUk9DRVNTT1JfVjg1MEVBCSgxIDw8IDIpCQkvKiBKdXN0IHRoZSBWODUwRUEuICovCi0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGNvZGUgdjg1MF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHY4NTBfbnVtX29wY29kZXM7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3Qgdjg1MF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IHY4NTBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICAvKiBJZiB0aGlzIHZhbHVlIGlzIC0xIHRoZW4gdGhlIG9wZXJhbmQncyBiaXRzIGFyZSBpbiBhIGRpc2NvbnRpbm91cyBkaXN0cmlidXRpb24gaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBpbnQgYml0czsKLQotICAvKiAoYml0cyA+PSAwKTogIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIC8qIChiaXRzID09IC0xKTogQml0IG1hc2sgb2YgdGhlIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogSW5zZXJ0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICBUbyBpbnNlcnQgYW4KLSAgICAgb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGV4ZWN1dGUKLSAgICAgICAgIGkgfD0gKG9wICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIG8gaXMgYSBwb2ludGVyIHRvCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKLSAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKLSAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgotICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZwotICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQgKG1vc3Qgb3BlcmFuZHMKLSAgICAgY2FuIGFjY2VwdCBhbnkgdmFsdWUpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyAoKiBpbnNlcnQpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGxvbmcgb3AsCi0JCQkJICAgY29uc3QgY2hhciAqKiBlcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSBvLT5iaXRzID09IC0xID8gKChpKSAmIG8tPnNoaWZ0KSA6ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmIChvLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JICAgICBvcCA9IChvcCA8PCAoMzIgLSBvLT5iaXRzKSkgPj4gKDMyIC0gby0+Yml0cyk7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgKCogZXh0cmFjdCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgaW50ICogaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSB2ODUwX29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCB2ODUwX29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3Qgdjg1MF9vcGVyYW5kLiAgKi8KLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9SRUcJMHgwMQotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBzeXN0ZW0gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX1NSRwkweDAyCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGNvbmRpdGlvbiBjb2RlIHVzZWQgaW4gdGhlIHNldGYgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX0NDCQkweDA0Ci0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9TSUdORUQJMHgwOAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgdGhlIGVwIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX0VQCQkweDEwCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIFBDIGRpc3BsYWNlbWVudCAqLwotI2RlZmluZSBWODUwX09QRVJBTkRfRElTUAkweDIwCi0KLS8qIFRoaXMgaXMgYSByZWxheGFibGUgb3BlcmFuZC4gICBPbmx5IHVzZWQgZm9yIEQ5LT5EMjIgYnJhbmNoIHJlbGF4aW5nCi0gICByaWdodCBub3cuICBXZSBtYXkgbmVlZCBvdGhlcnMgaW4gdGhlIGZ1dHVyZSAob3IgbWF5YmUgaGFuZGxlIHRoZW0gbGlrZQotICAgcHJvbW90ZWQgb3BlcmFuZHMgb24gdGhlIG1uMTAzMDA/KSAgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX1JFTEFYCTB4NDAKLQotLyogVGhlIHJlZ2lzdGVyIHNwZWNpZmllZCBtdXN0IG5vdCBiZSByMCAqLwotI2RlZmluZSBWODUwX05PVF9SMAkgICAgICAgIDB4ODAKLQotLyogQ1lHTlVTIExPQ0FMIHY4NTBlICovCi0vKiBwdXNoL3BvcCB0eXBlIGluc3RydWN0aW9uLCBWODUwRSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIFY4NTBFX1BVU0hfUE9QCQkweDEwMAotCi0vKiAxNiBiaXQgaW1tZWRpYXRlIGZvbGxvd3MgaW5zdHJ1Y3Rpb24sIFY4NTBFIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgVjg1MEVfSU1NRURJQVRFMTYJMHgyMDAKLQotLyogMzIgYml0IGltbWVkaWF0ZSBmb2xsb3dzIGluc3RydWN0aW9uLCBWODUwRSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIFY4NTBFX0lNTUVESUFURTMyCTB4NDAwCi0KLSNlbmRpZiAvKiBWODUwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3ZheC5oIGIvaW5jbHVkZS9vcGNvZGUvdmF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYWZlYmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvdmF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyogVmF4IG9wY2RlIGxpc3QuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1HREIgYW5kIEdBUyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIgYW5kIEdBUyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHREIgb3IgR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIHZheF9vcGNvZGVUCi0jZGVmaW5lIHZheF9vcGNvZGVUIGludAotI2VuZGlmIC8qIG5vIHZheF9vcGNvZGVUICovCi0KLXN0cnVjdCB2b3Rfd290CQkJLyogdmF4IG9wY29kZSB0YWJsZTogd290IHRvIGRvIHdpdGggdGhpcyAqLwotCQkJCS8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGNvbnN0IGNoYXIgICAgICAgKmFyZ3M7CS8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi0gIHZheF9vcGNvZGVUICAgICAgIGNvZGU7CS8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi19OwotCi1zdHJ1Y3Qgdm90CQkJLyogdmF4IG9wY29kZSB0ZXh0ICovCi17Ci0gIGNvbnN0IGNoYXIgICAgICAgKm5hbWU7CS8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IHZvdF93b3QgICAgZGV0YWlsOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0jZGVmaW5lIHZvdF9ob3cgYXJncwotI2RlZmluZSB2b3RfY29kZSBjb2RlCi0jZGVmaW5lIHZvdF9kZXRhaWwgZGV0YWlsCi0jZGVmaW5lIHZvdF9uYW1lIG5hbWUKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2b3QKLXZvdHN0cnNbXSA9Ci17Ci17ICAgICJoYWx0IiwJeyIiLAkJCTB4MDAJfSB9LAoteyAgICAibm9wIiwJeyIiLAkJCTB4MDEJfSB9LAoteyAgICAicmVpIiwJeyIiLAkJCTB4MDIJfSB9LAoteyAgICAiYnB0IiwJeyIiLAkJCTB4MDMJfSB9LAoteyAgICAicmV0IiwJeyIiLAkJCTB4MDQJfSB9LAoteyAgICAicnNiIiwJeyIiLAkJCTB4MDUJfSB9LAoteyAgICAibGRwY3R4IiwJeyIiLAkJCTB4MDYJfSB9LAoteyAgICAic3ZwY3R4IiwJeyIiLAkJCTB4MDcJfSB9LAoteyAgICAiY3Z0cHMiLAl7InJ3YWJyd2FiIiwJCTB4MDgJfSB9LAoteyAgICAiY3Z0c3AiLAl7InJ3YWJyd2FiIiwJCTB4MDkJfSB9LAoteyAgICAiaW5kZXgiLAl7InJscmxybHJscmx3bCIsCTB4MGEJfSB9LAoteyAgICAiY3JjIiwJeyJhYnJscndhYiIsCQkweDBiCX0gfSwKLXsgICAgInByb2JlciIsCXsicmJyd2FiIiwJCTB4MGMJfSB9LAoteyAgICAicHJvYmV3IiwJeyJyYnJ3YWIiLAkgICAgICAgIDB4MGQJfSB9LAoteyAgICAiaW5zcXVlIiwJeyJhYmFiIiwJCTB4MGUJfSB9LAoteyAgICAicmVtcXVlIiwJeyJhYndsIiwJCTB4MGYJfSB9LAoteyAgICAiYnNiYiIsCXsiYmIiLAkJCTB4MTAJfSB9LAoteyAgICAiYnJiIiwJeyJiYiIsCQkJMHgxMQl9IH0sCi17ICAgICJibmVxIiwJeyJiYiIsCQkJMHgxMgl9IH0sCi17ICAgICJibmVxdSIsCXsiYmIiLAkJCTB4MTIJfSB9LAoteyAgICAiYmVxbCIsCXsiYmIiLAkJCTB4MTMJfSB9LAoteyAgICAiYmVxbHUiLAl7ImJiIiwJCQkweDEzCX0gfSwKLXsgICAgImJndHIiLAl7ImJiIiwJCQkweDE0CX0gfSwKLXsgICAgImJsZXEiLAl7ImJiIiwJCQkweDE1CX0gfSwKLXsgICAgImpzYiIsCXsiYWIiLAkJCTB4MTYJfSB9LAoteyAgICAiam1wIiwJeyJhYiIsCQkJMHgxNwl9IH0sCi17ICAgICJiZ2VxIiwJeyJiYiIsCQkJMHgxOAl9IH0sCi17ICAgICJibHNzIiwJeyJiYiIsCQkJMHgxOQl9IH0sCi17ICAgICJiZ3RydSIsCXsiYmIiLAkJCTB4MWEJfSB9LAoteyAgICAiYmxlcXUiLAl7ImJiIiwJCQkweDFiCX0gfSwKLXsgICAgImJ2YyIsCXsiYmIiLAkJCTB4MWMJfSB9LAoteyAgICAiYnZzIiwJeyJiYiIsCQkJMHgxZAl9IH0sCi17ICAgICJiY2MiLAl7ImJiIiwJCQkweDFlCX0gfSwKLXsgICAgImJnZXF1IiwJeyJiYiIsCQkJMHgxZQl9IH0sCi17ICAgICJibHNzdSIsCXsiYmIiLAkJCTB4MWYJfSB9LAoteyAgICAiYmNzIiwJeyJiYiIsCQkJMHgxZgl9IH0sCi17ICAgICJhZGRwNCIsCXsicndhYnJ3YWIiLAkJMHgyMAl9IH0sCi17ICAgICJhZGRwNiIsCXsicndhYnJ3YWJyd2FiIiwJMHgyMQl9IH0sCi17ICAgICJzdWJwNCIsCXsicndhYnJ3YWIiLAkJMHgyMgl9IH0sCi17ICAgICJzdWJwNiIsCXsicndhYnJ3YWJyd2FiIiwJMHgyMwl9IH0sCi17ICAgICJjdnRwdCIsCXsicndhYmFicndhYiIsCQkweDI0CX0gfSwKLXsgICAgIm11bHAiLAl7InJ3YWJyd2FicndhYiIsCTB4MjUJfSB9LAoteyAgICAiY3Z0dHAiLAl7InJ3YWJhYnJ3YWIiLAkJMHgyNgl9IH0sCi17ICAgICJkaXZwIiwJeyJyd2FicndhYnJ3YWIiLAkweDI3CX0gfSwKLXsgICAgIm1vdmMzIiwJeyJyd2FiYWIiLAkJMHgyOAl9IH0sCi17ICAgICJjbXBjMyIsCXsicndhYmFiIiwJCTB4MjkJfSB9LAoteyAgICAic2NhbmMiLAl7InJ3YWJhYnJiIiwJCTB4MmEJfSB9LAoteyAgICAic3BhbmMiLAl7InJ3YWJhYnJiIiwJCTB4MmIJfSB9LAoteyAgICAibW92YzUiLAl7InJ3YWJyYnJ3YWIiLAkJMHgyYwl9IH0sCi17ICAgICJjbXBjNSIsCXsicndhYnJicndhYiIsCQkweDJkCX0gfSwKLXsgICAgIm1vdnRjIiwJeyJyd2FicmJhYnJ3YWIiLAkweDJlCX0gfSwKLXsgICAgIm1vdnR1YyIsCXsicndhYnJiYWJyd2FiIiwJMHgyZgl9IH0sCi17ICAgICJic2J3IiwJeyJidyIsCQkJMHgzMAl9IH0sCi17ICAgICJicnciLAl7ImJ3IiwJCQkweDMxCX0gfSwKLXsgICAgImN2dHdsIiwJeyJyd3dsIiwJCTB4MzIJfSB9LAoteyAgICAiY3Z0d2IiLAl7InJ3d2IiLAkJMHgzMwl9IH0sCi17ICAgICJtb3ZwIiwJeyJyd2FiYWIiLAkJMHgzNAl9IH0sCi17ICAgICJjbXBwMyIsCXsicndhYmFiIiwJCTB4MzUJfSB9LAoteyAgICAiY3Z0cGwiLAl7InJ3YWJ3bCIsCQkweDM2CX0gfSwKLXsgICAgImNtcHA0IiwJeyJyd2FicndhYiIsCQkweDM3CX0gfSwKLXsgICAgImVkaXRwYyIsCXsicndhYmFiYWIiLAkJMHgzOAl9IH0sCi17ICAgICJtYXRjaGMiLAl7InJ3YWJyd2FiIiwJCTB4MzkJfSB9LAoteyAgICAibG9jYyIsCXsicmJyd2FiIiwJCTB4M2EJfSB9LAoteyAgICAic2twYyIsCXsicmJyd2FiIiwJCTB4M2IJfSB9LAoteyAgICAibW92endsIiwJeyJyd3dsIiwJCTB4M2MJfSB9LAoteyAgICAiYWNidyIsCXsicndyd213YnciLAkJMHgzZAl9IH0sCi17ICAgICJtb3ZhdyIsCXsiYXd3bCIsCQkweDNlCX0gfSwKLXsgICAgInB1c2hhdyIsCXsiYXciLAkJCTB4M2YJfSB9LAoteyAgICAiYWRkZjIiLAl7InJmbWYiLAkJMHg0MAl9IH0sCi17ICAgICJhZGRmMyIsCXsicmZyZndmIiwJCTB4NDEJfSB9LAoteyAgICAic3ViZjIiLAl7InJmbWYiLAkJMHg0Mgl9IH0sCi17ICAgICJzdWJmMyIsCXsicmZyZndmIiwJCTB4NDMJfSB9LAoteyAgICAibXVsZjIiLAl7InJmbWYiLAkJMHg0NAl9IH0sCi17ICAgICJtdWxmMyIsCXsicmZyZndmIiwJCTB4NDUJfSB9LAoteyAgICAiZGl2ZjIiLAl7InJmbWYiLAkJMHg0Ngl9IH0sCi17ICAgICJkaXZmMyIsCXsicmZyZndmIiwJCTB4NDcJfSB9LAoteyAgICAiY3Z0ZmIiLAl7InJmd2IiLAkJMHg0OAl9IH0sCi17ICAgICJjdnRmdyIsCXsicmZ3dyIsCQkweDQ5CX0gfSwKLXsgICAgImN2dGZsIiwJeyJyZndsIiwJCTB4NGEJfSB9LAoteyAgICAiY3Z0cmZsIiwJeyJyZndsIiwJCTB4NGIJfSB9LAoteyAgICAiY3Z0YmYiLAl7InJid2YiLAkJMHg0Ywl9IH0sCi17ICAgICJjdnR3ZiIsCXsicnd3ZiIsCQkweDRkCX0gfSwKLXsgICAgImN2dGxmIiwJeyJybHdmIiwJCTB4NGUJfSB9LAoteyAgICAiYWNiZiIsCXsicmZyZm1mYnciLAkJMHg0Zgl9IH0sCi17ICAgICJtb3ZmIiwJeyJyZndmIiwJCTB4NTAJfSB9LAoteyAgICAiY21wZiIsCXsicmZyZiIsCQkweDUxCX0gfSwKLXsgICAgIm1uZWdmIiwJeyJyZndmIiwJCTB4NTIJfSB9LAoteyAgICAidHN0ZiIsCXsicmYiLAkJCTB4NTMJfSB9LAoteyAgICAiZW1vZGYiLAl7InJmcmJyZndsd2YiLAkJMHg1NAl9IH0sCi17ICAgICJwb2x5ZiIsCXsicmZyd2FiIiwJCTB4NTUJfSB9LAoteyAgICAiY3Z0ZmQiLAl7InJmd2QiLAkJMHg1Ngl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDU3IGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiYWRhd2kiLAl7InJ3bXciLAkJMHg1OAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDU5IGlzIG5vdCBkZWZpbmVkIHlldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1YSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNWIgaXMgbm90IGRlZmluZWQgeWV0ICovCi17ICAgICJpbnNxaGkiLAl7ImFiYXEiLAkJMHg1Ywl9IH0sCi17ICAgICJpbnNxdGkiLAl7ImFiYXEiLAkJMHg1ZAl9IH0sCi17ICAgICJyZW1xaGkiLAl7ImFxd2wiLAkJMHg1ZQl9IH0sCi17ICAgICJyZW1xdGkiLAl7ImFxd2wiLAkJMHg1Zgl9IH0sCi17ICAgICJhZGRkMiIsCXsicmRtZCIsCQkweDYwCX0gfSwKLXsgICAgImFkZGQzIiwJeyJyZHJkd2QiLAkJMHg2MQl9IH0sCi17ICAgICJzdWJkMiIsCXsicmRtZCIsCQkweDYyCX0gfSwKLXsgICAgInN1YmQzIiwJeyJyZHJkd2QiLAkJMHg2Mwl9IH0sCi17ICAgICJtdWxkMiIsCXsicmRtZCIsCQkweDY0CX0gfSwKLXsgICAgIm11bGQzIiwJeyJyZHJkd2QiLAkJMHg2NQl9IH0sCi17ICAgICJkaXZkMiIsCXsicmRtZCIsCQkweDY2CX0gfSwKLXsgICAgImRpdmQzIiwJeyJyZHJkd2QiLAkJMHg2Nwl9IH0sCi17ICAgICJjdnRkYiIsCXsicmR3YiIsCQkweDY4CX0gfSwKLXsgICAgImN2dGR3IiwJeyJyZHd3IiwJCTB4NjkJfSB9LAoteyAgICAiY3Z0ZGwiLAl7InJkd2wiLAkJMHg2YQl9IH0sCi17ICAgICJjdnRyZGwiLAl7InJkd2wiLAkJMHg2Ygl9IH0sCi17ICAgICJjdnRiZCIsCXsicmJ3ZCIsCQkweDZjCX0gfSwKLXsgICAgImN2dHdkIiwJeyJyd3dkIiwJCTB4NmQJfSB9LAoteyAgICAiY3Z0bGQiLAl7InJsd2QiLAkJMHg2ZQl9IH0sCi17ICAgICJhY2JkIiwJeyJyZHJkbWRidyIsCQkweDZmCX0gfSwKLXsgICAgIm1vdmQiLAl7InJkd2QiLAkJMHg3MAl9IH0sCi17ICAgICJjbXBkIiwJeyJyZHJkIiwJCTB4NzEJfSB9LAoteyAgICAibW5lZ2QiLAl7InJkd2QiLAkJMHg3Mgl9IH0sCi17ICAgICJ0c3RkIiwJeyJyZCIsCQkJMHg3Mwl9IH0sCi17ICAgICJlbW9kZCIsCXsicmRyYnJkd2x3ZCIsCQkweDc0CX0gfSwKLXsgICAgInBvbHlkIiwJeyJyZHJ3YWIiLAkJMHg3NQl9IH0sCi17ICAgICJjdnRkZiIsCXsicmR3ZiIsCQkweDc2CX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNzcgaXMgbm90IGRlZmluZWQgeWV0ICovCi17ICAgICJhc2hsIiwJeyJyYnJsd2wiLAkJMHg3OAl9IH0sCi17ICAgICJhc2hxIiwJeyJyYnJxd3EiLAkJMHg3OQl9IH0sCi17ICAgICJlbXVsIiwJeyJybHJscmx3cSIsCQkweDdhCX0gfSwKLXsgICAgImVkaXYiLAl7InJscnF3bHdsIiwJCTB4N2IJfSB9LAoteyAgICAiY2xyZCIsCXsid2QiLAkJCTB4N2MJfSB9LAoteyAgICAiY2xyZyIsCXsid2ciLAkJCTB4N2MJfSB9LAoteyAgICAiY2xycSIsCXsid2QiLAkJCTB4N2MJfSB9LAoteyAgICAibW92cSIsCXsicnF3cSIsCQkweDdkCX0gfSwKLXsgICAgIm1vdmFxIiwJeyJhcXdsIiwJCTB4N2UJfSB9LAoteyAgICAibW92YWQiLAl7ImFkd2wiLAkJMHg3ZQl9IH0sCi17ICAgICJwdXNoYXEiLAl7ImFxIiwJCQkweDdmCX0gfSwKLXsgICAgInB1c2hhZCIsCXsiYWQiLAkJCTB4N2YJfSB9LAoteyAgICAiYWRkYjIiLAl7InJibWIiLAkJMHg4MAl9IH0sCi17ICAgICJhZGRiMyIsCXsicmJyYndiIiwJCTB4ODEJfSB9LAoteyAgICAic3ViYjIiLAl7InJibWIiLAkJMHg4Mgl9IH0sCi17ICAgICJzdWJiMyIsCXsicmJyYndiIiwJCTB4ODMJfSB9LAoteyAgICAibXVsYjIiLAl7InJibWIiLAkJMHg4NAl9IH0sCi17ICAgICJtdWxiMyIsCXsicmJyYndiIiwJCTB4ODUJfSB9LAoteyAgICAiZGl2YjIiLAl7InJibWIiLAkJMHg4Ngl9IH0sCi17ICAgICJkaXZiMyIsCXsicmJyYndiIiwJCTB4ODcJfSB9LAoteyAgICAiYmlzYjIiLAl7InJibWIiLAkJMHg4OAl9IH0sCi17ICAgICJiaXNiMyIsCXsicmJyYndiIiwJCTB4ODkJfSB9LAoteyAgICAiYmljYjIiLAl7InJibWIiLAkJMHg4YQl9IH0sCi17ICAgICJiaWNiMyIsCXsicmJyYndiIiwJCTB4OGIJfSB9LAoteyAgICAieG9yYjIiLAl7InJibWIiLAkJMHg4Ywl9IH0sCi17ICAgICJ4b3JiMyIsCXsicmJyYndiIiwJCTB4OGQJfSB9LAoteyAgICAibW5lZ2IiLAl7InJid2IiLAkJMHg4ZQl9IH0sCi17ICAgICJjYXNlYiIsCXsicmJyYnJiIiwJCTB4OGYJfSB9LAoteyAgICAibW92YiIsCXsicmJ3YiIsCQkweDkwCX0gfSwKLXsgICAgImNtcGIiLAl7InJicmIiLAkJMHg5MQl9IH0sCi17ICAgICJtY29tYiIsCXsicmJ3YiIsCQkweDkyCX0gfSwKLXsgICAgImJpdGIiLAl7InJicmIiLAkJMHg5Mwl9IH0sCi17ICAgICJjbHJiIiwJeyJ3YiIsCQkJMHg5NAl9IH0sCi17ICAgICJ0c3RiIiwJeyJyYiIsCQkJMHg5NQl9IH0sCi17ICAgICJpbmNiIiwJeyJtYiIsCQkJMHg5Ngl9IH0sCi17ICAgICJkZWNiIiwJeyJtYiIsCQkJMHg5Nwl9IH0sCi17ICAgICJjdnRibCIsCXsicmJ3bCIsCQkweDk4CX0gfSwKLXsgICAgImN2dGJ3IiwJeyJyYnd3IiwJCTB4OTkJfSB9LAoteyAgICAibW92emJsIiwJeyJyYndsIiwJCTB4OWEJfSB9LAoteyAgICAibW92emJ3IiwJeyJyYnd3IiwJCTB4OWIJfSB9LAoteyAgICAicm90bCIsCXsicmJybHdsIiwJCTB4OWMJfSB9LAoteyAgICAiYWNiYiIsCXsicmJyYm1iYnciLAkJMHg5ZAl9IH0sCi17ICAgICJtb3ZhYiIsCXsiYWJ3bCIsCQkweDllCX0gfSwKLXsgICAgInB1c2hhYiIsCXsiYWIiLAkJCTB4OWYJfSB9LAoteyAgICAiYWRkdzIiLAl7InJ3bXciLAkJMHhhMAl9IH0sCi17ICAgICJhZGR3MyIsCXsicndyd3d3IiwJCTB4YTEJfSB9LAoteyAgICAic3VidzIiLAl7InJ3bXciLAkJMHhhMgl9IH0sCi17ICAgICJzdWJ3MyIsCXsicndyd3d3IiwJCTB4YTMJfSB9LAoteyAgICAibXVsdzIiLAl7InJ3bXciLAkJMHhhNAl9IH0sCi17ICAgICJtdWx3MyIsCXsicndyd3d3IiwJCTB4YTUJfSB9LAoteyAgICAiZGl2dzIiLAl7InJ3bXciLAkJMHhhNgl9IH0sCi17ICAgICJkaXZ3MyIsCXsicndyd3d3IiwJCTB4YTcJfSB9LAoteyAgICAiYmlzdzIiLAl7InJ3bXciLAkJMHhhOAl9IH0sCi17ICAgICJiaXN3MyIsCXsicndyd3d3IiwJCTB4YTkJfSB9LAoteyAgICAiYmljdzIiLAl7InJ3bXciLAkJMHhhYQl9IH0sCi17ICAgICJiaWN3MyIsCXsicndyd3d3IiwJCTB4YWIJfSB9LAoteyAgICAieG9ydzIiLAl7InJ3bXciLAkJMHhhYwl9IH0sCi17ICAgICJ4b3J3MyIsCXsicndyd3d3IiwJCTB4YWQJfSB9LAoteyAgICAibW5lZ3ciLAl7InJ3d3ciLAkJMHhhZQl9IH0sCi17ICAgICJjYXNldyIsCXsicndyd3J3IiwJCTB4YWYJfSB9LAoteyAgICAibW92dyIsCXsicnd3dyIsCQkweGIwCX0gfSwKLXsgICAgImNtcHciLAl7InJ3cnciLAkJMHhiMQl9IH0sCi17ICAgICJtY29tdyIsCXsicnd3dyIsCQkweGIyCX0gfSwKLXsgICAgImJpdHciLAl7InJ3cnciLAkJMHhiMwl9IH0sCi17ICAgICJjbHJ3IiwJeyJ3dyIsCQkJMHhiNAl9IH0sCi17ICAgICJ0c3R3IiwJeyJydyIsCQkJMHhiNQl9IH0sCi17ICAgICJpbmN3IiwJeyJtdyIsCQkJMHhiNgl9IH0sCi17ICAgICJkZWN3IiwJeyJtdyIsCQkJMHhiNwl9IH0sCi17ICAgICJiaXNwc3ciLAl7InJ3IiwJCQkweGI4CX0gfSwKLXsgICAgImJpY3BzdyIsCXsicnciLAkJCTB4YjkJfSB9LAoteyAgICAicG9wciIsCXsicnciLAkJCTB4YmEJfSB9LAoteyAgICAicHVzaHIiLAl7InJ3IiwJCQkweGJiCX0gfSwKLXsgICAgImNobWsiLAl7InJ3IiwJCQkweGJjCX0gfSwKLXsgICAgImNobWUiLAl7InJ3IiwJCQkweGJkCX0gfSwKLXsgICAgImNobXMiLAl7InJ3IiwJCQkweGJlCX0gfSwKLXsgICAgImNobXUiLAl7InJ3IiwJCQkweGJmCX0gfSwKLXsgICAgImFkZGwyIiwJeyJybG1sIiwJCTB4YzAJfSB9LAoteyAgICAiYWRkbDMiLAl7InJscmx3bCIsCQkweGMxCX0gfSwKLXsgICAgInN1YmwyIiwJeyJybG1sIiwJCTB4YzIJfSB9LAoteyAgICAic3VibDMiLAl7InJscmx3bCIsCQkweGMzCX0gfSwKLXsgICAgIm11bGwyIiwJeyJybG1sIiwJCTB4YzQJfSB9LAoteyAgICAibXVsbDMiLAl7InJscmx3bCIsCQkweGM1CX0gfSwKLXsgICAgImRpdmwyIiwJeyJybG1sIiwJCTB4YzYJfSB9LAoteyAgICAiZGl2bDMiLAl7InJscmx3bCIsCQkweGM3CX0gfSwKLXsgICAgImJpc2wyIiwJeyJybG1sIiwJCTB4YzgJfSB9LAoteyAgICAiYmlzbDMiLAl7InJscmx3bCIsCQkweGM5CX0gfSwKLXsgICAgImJpY2wyIiwJeyJybG1sIiwJCTB4Y2EJfSB9LAoteyAgICAiYmljbDMiLAl7InJscmx3bCIsCQkweGNiCX0gfSwKLXsgICAgInhvcmwyIiwJeyJybG1sIiwJCTB4Y2MJfSB9LAoteyAgICAieG9ybDMiLAl7InJscmx3bCIsCQkweGNkCX0gfSwKLXsgICAgIm1uZWdsIiwJeyJybHdsIiwJCTB4Y2UJfSB9LAoteyAgICAiY2FzZWwiLAl7InJscmxybCIsCQkweGNmCX0gfSwKLXsgICAgIm1vdmwiLAl7InJsd2wiLAkJMHhkMAl9IH0sCi17ICAgICJjbXBsIiwJeyJybHJsIiwJCTB4ZDEJfSB9LAoteyAgICAibWNvbWwiLAl7InJsd2wiLAkJMHhkMgl9IH0sCi17ICAgICJiaXRsIiwJeyJybHJsIiwJCTB4ZDMJfSB9LAoteyAgICAiY2xyZiIsCXsid2YiLAkJCTB4ZDQJfSB9LAoteyAgICAiY2xybCIsCXsid2wiLAkJCTB4ZDQJfSB9LAoteyAgICAidHN0bCIsCXsicmwiLAkJCTB4ZDUJfSB9LAoteyAgICAiaW5jbCIsCXsibWwiLAkJCTB4ZDYJfSB9LAoteyAgICAiZGVjbCIsCXsibWwiLAkJCTB4ZDcJfSB9LAoteyAgICAiYWR3YyIsCXsicmxtbCIsCQkweGQ4CX0gfSwKLXsgICAgInNid2MiLAl7InJsbWwiLAkJMHhkOQl9IH0sCi17ICAgICJtdHByIiwJeyJybHJsIiwJCTB4ZGEJfSB9LAoteyAgICAibWZwciIsCXsicmx3bCIsCQkweGRiCX0gfSwKLXsgICAgIm1vdnBzbCIsCXsid2wiLAkJCTB4ZGMJfSB9LAoteyAgICAicHVzaGwiLAl7InJsIiwJCQkweGRkCX0gfSwKLXsgICAgIm1vdmFsIiwJeyJhbHdsIiwJCTB4ZGUJfSB9LAoteyAgICAibW92YWYiLAl7ImFmd2wiLAkJMHhkZQl9IH0sCi17ICAgICJwdXNoYWwiLAl7ImFsIiwJCQkweGRmCX0gfSwKLXsgICAgInB1c2hhZiIsCXsiYWYiLAkJCTB4ZGYJfSB9LAoteyAgICAiYmJzIiwJeyJybHZiYmIiLAkJMHhlMAl9IH0sCi17ICAgICJiYmMiLAl7InJsdmJiYiIsCQkweGUxCX0gfSwKLXsgICAgImJic3MiLAl7InJsdmJiYiIsCQkweGUyCX0gfSwKLXsgICAgImJiY3MiLAl7InJsdmJiYiIsCQkweGUzCX0gfSwKLXsgICAgImJic2MiLAl7InJsdmJiYiIsCQkweGU0CX0gfSwKLXsgICAgImJiY2MiLAl7InJsdmJiYiIsCQkweGU1CX0gfSwKLXsgICAgImJic3NpIiwJeyJybHZiYmIiLAkJMHhlNgl9IH0sCi17ICAgICJiYmNjaSIsCXsicmx2YmJiIiwJCTB4ZTcJfSB9LAoteyAgICAiYmxicyIsCXsicmxiYiIsCQkweGU4CX0gfSwKLXsgICAgImJsYmMiLAl7InJsYmIiLAkJMHhlOQl9IH0sCi17ICAgICJmZnMiLAl7InJscmJ2YndsIiwJCTB4ZWEJfSB9LAoteyAgICAiZmZjIiwJeyJybHJidmJ3bCIsCQkweGViCX0gfSwKLXsgICAgImNtcHYiLAl7InJscmJ2YnJsIiwJCTB4ZWMJfSB9LAoteyAgICAiY21wenYiLAl7InJscmJ2YnJsIiwJCTB4ZWQJfSB9LAoteyAgICAiZXh0diIsCXsicmxyYnZid2wiLAkJMHhlZQl9IH0sCi17ICAgICJleHR6diIsCXsicmxyYnZid2wiLAkJMHhlZgl9IH0sCi17ICAgICJpbnN2IiwJeyJybHJscmJ2YiIsCQkweGYwCX0gfSwKLXsgICAgImFjYmwiLAl7InJscmxtbGJ3IiwJCTB4ZjEJfSB9LAoteyAgICAiYW9ibHNzIiwJeyJybG1sYmIiLAkJMHhmMgl9IH0sCi17ICAgICJhb2JsZXEiLAl7InJsbWxiYiIsCQkweGYzCX0gfSwKLXsgICAgInNvYmdlcSIsCXsibWxiYiIsCQkweGY0CX0gfSwKLXsgICAgInNvYmd0ciIsCXsibWxiYiIsCQkweGY1CX0gfSwKLXsgICAgImN2dGxiIiwJeyJybHdiIiwJCTB4ZjYJfSB9LAoteyAgICAiY3Z0bHciLAl7InJsd3ciLAkJMHhmNwl9IH0sCi17ICAgICJhc2hwIiwJeyJyYnJ3YWJyYnJ3YWIiLAkweGY4CX0gfSwKLXsgICAgImN2dGxwIiwJeyJybHJ3YWIiLAkJMHhmOQl9IH0sCi17ICAgICJjYWxsZyIsCXsiYWJhYiIsCQkweGZhCX0gfSwKLXsgICAgImNhbGxzIiwJeyJybGFiIiwJCTB4ZmIJfSB9LAoteyAgICAieGZjIiwJeyIiLAkJCTB4ZmMJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLXsgICAgImN2dGRoIiwJeyJyZHdoIiwJCTB4MzJmZAl9IH0sCi17ICAgICJjdnRnZiIsCXsicmd3aCIsCQkweDMzZmQJfSB9LAoteyAgICAiYWRkZzIiLAl7InJnbWciLAkJMHg0MGZkCX0gfSwKLXsgICAgImFkZGczIiwJeyJyZ3Jnd2ciLAkJMHg0MWZkCX0gfSwKLXsgICAgInN1YmcyIiwJeyJyZ21nIiwJCTB4NDJmZAl9IH0sCi17ICAgICJzdWJnMyIsCXsicmdyZ3dnIiwJCTB4NDNmZAl9IH0sCi17ICAgICJtdWxnMiIsCXsicmdtZyIsCQkweDQ0ZmQJfSB9LAoteyAgICAibXVsZzMiLAl7InJncmd3ZyIsCQkweDQ1ZmQJfSB9LAoteyAgICAiZGl2ZzIiLAl7InJnbWciLAkJMHg0NmZkCX0gfSwKLXsgICAgImRpdmczIiwJeyJyZ3Jnd2ciLAkJMHg0N2ZkCX0gfSwKLXsgICAgImN2dGdiIiwJeyJyZ3diIiwJCTB4NDhmZAl9IH0sCi17ICAgICJjdnRndyIsCXsicmd3dyIsCQkweDQ5ZmQJfSB9LAoteyAgICAiY3Z0Z2wiLAl7InJnd2wiLAkJMHg0YWZkCX0gfSwKLXsgICAgImN2dHJnbCIsCXsicmd3bCIsCQkweDRiZmQJfSB9LAoteyAgICAiY3Z0YmciLAl7InJid2ciLAkJMHg0Y2ZkCX0gfSwKLXsgICAgImN2dHdnIiwJeyJyd3dnIiwJCTB4NGRmZAl9IH0sCi17ICAgICJjdnRsZyIsCXsicmx3ZyIsCQkweDRlZmQJfSB9LAoteyAgICAiYWNiZyIsCXsicmdyZ21nYnciLAkJMHg0ZmZkCX0gfSwKLXsgICAgIm1vdmciLAl7InJnd2ciLAkJMHg1MGZkCX0gfSwKLXsgICAgImNtcGciLAl7InJncmciLAkJMHg1MWZkCX0gfSwKLXsgICAgIm1uZWdnIiwJeyJyZ3dnIiwJCTB4NTJmZAl9IH0sCi17ICAgICJ0c3RnIiwJeyJyZyIsCQkJMHg1M2ZkCX0gfSwKLXsgICAgImVtb2RnIiwJeyJyZ3J3cmd3bHdnIiwJCTB4NTRmZAl9IH0sCi17ICAgICJwb2x5ZyIsCXsicmdyd2FiIiwJCTB4NTVmZAl9IH0sCi17ICAgICJjdnRnaCIsCXsicmd3aCIsCQkweDU2ZmQJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLXsgICAgImFkZGgyIiwJeyJyaG1oIiwJCTB4NjBmZAl9IH0sCi17ICAgICJhZGRoMyIsCXsicmhyaHdoIiwJCTB4NjFmZAl9IH0sCi17ICAgICJzdWJoMiIsCXsicmhtaCIsCQkweDYyZmQJfSB9LAoteyAgICAic3ViaDMiLAl7InJocmh3aCIsCQkweDYzZmQJfSB9LAoteyAgICAibXVsaDIiLAl7InJobWgiLAkJMHg2NGZkCX0gfSwKLXsgICAgIm11bGgzIiwJeyJyaHJod2giLAkJMHg2NWZkCX0gfSwKLXsgICAgImRpdmgyIiwJeyJyaG1oIiwJCTB4NjZmZAl9IH0sCi17ICAgICJkaXZoMyIsCXsicmhyaHdoIiwJCTB4NjdmZAl9IH0sCi17ICAgICJjdnRoYiIsCXsicmh3YiIsCQkweDY4ZmQJfSB9LAoteyAgICAiY3Z0aHciLAl7InJod3ciLAkJMHg2OWZkCX0gfSwKLXsgICAgImN2dGhsIiwJeyJyaHdsIiwJCTB4NmFmZAl9IH0sCi17ICAgICJjdnRyaGwiLAl7InJod2wiLAkJMHg2YmZkCX0gfSwKLXsgICAgImN2dGJoIiwJeyJyYndoIiwJCTB4NmNmZAl9IH0sCi17ICAgICJjdnR3aCIsCXsicnd3aCIsCQkweDZkZmQJfSB9LAoteyAgICAiY3Z0bGgiLAl7InJsd2giLAkJMHg2ZWZkCX0gfSwKLXsgICAgImFjYmgiLAl7InJocmhtaGJ3IiwJCTB4NmZmZAl9IH0sCi17ICAgICJtb3ZoIiwJeyJyaHdoIiwJCTB4NzBmZAl9IH0sCi17ICAgICJjbXBoIiwJeyJyaHJoIiwJCTB4NzFmZAl9IH0sCi17ICAgICJtbmVnaCIsCXsicmh3aCIsCQkweDcyZmQJfSB9LAoteyAgICAidHN0aCIsCXsicmgiLAkJCTB4NzNmZAl9IH0sCi17ICAgICJlbW9kaCIsCXsicmhyd3Jod2x3aCIsCQkweDc0ZmQJfSB9LAoteyAgICAicG9seWgiLAl7InJocndhYiIsCQkweDc1ZmQJfSB9LAoteyAgICAiY3Z0aGciLAl7InJod2ciLAkJMHg3NmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjbHJoIiwJeyJ3aCIsCQkJMHg3Y2ZkCX0gfSwKLXsgICAgImNscm8iLAl7IndvIiwJCQkweDdjZmQJfSB9LAoteyAgICAibW92byIsCXsicm93byIsCQkweDdkZmQJfSB9LAoteyAgICAibW92YWgiLAl7ImFod2wiLAkJMHg3ZWZkCX0gfSwKLXsgICAgIm1vdmFvIiwJeyJhb3dsIiwJCTB4N2VmZAl9IH0sCi17ICAgICJwdXNoYWgiLAl7ImFoIiwJCQkweDdmZmQJfSB9LAoteyAgICAicHVzaGFvIiwJeyJhbyIsCQkJMHg3ZmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRmaCIsCXsicmZ3aCIsCQkweDk4ZmQJfSB9LAoteyAgICAiY3Z0ZmciLAl7InJmd2ciLAkJMHg5OWZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRoZiIsCXsicmh3ZiIsCQkweGY2ZmQJfSB9LAoteyAgICAiY3Z0aGQiLAl7InJod2QiLAkJMHhmN2ZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJidWdsIiwJeyJybCIsCQkJMHhmZGZmCX0gfSwKLXsgICAgImJ1Z3ciLAl7InJ3IiwJCQkweGZlZmYJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLQoteyAgICAgICIiLAl7IiIsIDB9IH0JCS8qIGVtcHR5IGlzIGVuZCBzZW50aW5lbCAqLwotCi19OwkJCQkvKiB2b3RzdHJzICovCi0KLS8qIGVuZDogdmF4Lm9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zOWsuaCBiL2luY2x1ZGUvb3M5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJlZWQyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3M5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfTU9EVUxFX0gpCi0jZGVmaW5lIF9NT0RVTEVfSAotCi0vKiBPUy05MDAwIGkzODYgbW9kdWxlIGhlYWRlciBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBfTVBGMzg2Ci0KLS8qIHNpemVvZiBjb21tb24gaGVhZGVyIGxlc3MgcGFyaXR5IGZpZWxkICovCi0jZGVmaW5lIE5fTV9QQVJJVFkgIChzaXplb2YobWhfY29tKS1zaXplb2YodW5pc2duZWQgc2hvcnQpKQotI2RlZmluZSBPTERfTV9QQVJJVFkgNDYKLSNkZWZpbmUgTV9QQVJJVFkgTl9NX1BBUklUWQotCi0jaWZkZWYgX01QRjY4SwotI2RlZmluZSBNT0RTWU5DIDB4NGFmZCAgICAgIC8qIG1vZHVsZSBoZWFkZXIgc3luYyBjb2RlIGZvciA2ODB4MCBwcm9jZXNzb3JzICovCi0jZW5kaWYKLQotI2lmZGVmIF9NUEYzODYKLSNkZWZpbmUgTU9EU1lOQyAweDRhZmMgICAgICAvKiBtb2R1bGUgaGVhZGVyIHN5bmMgY29kZSBmb3IgODAzODYgcHJvY2Vzc29ycyAqLwotI2VuZGlmCi0KLSNkZWZpbmUgTU9EUkVWCTEJCQkvKiBtb2R1bGUgZm9ybWF0IHJldmlzaW9uIDEgKi8KLSNkZWZpbmUgQ1JDQ09OCTB4ODAwZmUzCS8qIGNyYyBwb2x5bm9taWFsIGNvbnN0YW50ICovCi0KLS8qIE1vZHVsZSBhY2Nlc3MgcGVybWlzc2lvbiB2YWx1ZXMgKi8KLSNkZWZpbmUgTVBfT1dORVJfUkVBRAkweDAwMDEKLSNkZWZpbmUgTVBfT1dORVJfV1JJVEUJMHgwMDAyCi0jZGVmaW5lIE1QX09XTkVSX0VYRUMJMHgwMDA0Ci0jZGVmaW5lIE1QX0dST1VQX1JFQUQJMHgwMDEwCi0jZGVmaW5lIE1QX0dST1VQX1dSSVRFCTB4MDAyMAotI2RlZmluZSBNUF9HUk9VUF9FWEVDCTB4MDA0MAotI2RlZmluZSBNUF9XT1JMRF9SRUFECTB4MDEwMAotI2RlZmluZSBNUF9XT1JMRF9XUklURQkweDAyMDAKLSNkZWZpbmUgTVBfV09STERfRVhFQwkweDA0MDAKLSNkZWZpbmUgTVBfV09STERfQUNDRVNTCTB4MDc3NwotI2RlZmluZSBNUF9PV05FUl9NQVNLCTB4MDAwZgotI2RlZmluZSBNUF9HUk9VUF9NQVNLCTB4MDBmMAotI2RlZmluZSBNUF9XT1JMRF9NQVNLCTB4MGYwMAotI2RlZmluZSBNUF9TWVNUTV9NQVNLCTB4ZjAwMAotCi0vKiBNb2R1bGUgVHlwZS9MYW5ndWFnZSB2YWx1ZXMgKi8KLSNkZWZpbmUgTVRfQU5ZCQkwCi0jZGVmaW5lIE1UX1BST0dSQU0JMHgwMDAxCi0jZGVmaW5lIE1UX1NVQlJPVVQJMHgwMDAyCi0jZGVmaW5lIE1UX01VTFRJCTB4MDAwMwotI2RlZmluZSBNVF9EQVRBCQkweDAwMDQKLSNkZWZpbmUgTVRfVFJBUExJQgkweDAwMGIKLSNkZWZpbmUgTVRfU1lTVEVNCTB4MDAwYwotI2RlZmluZSBNVF9GSUxFTUFOCTB4MDAwZAotI2RlZmluZSBNVF9ERVZEUlZSCTB4MDAwZSAKLSNkZWZpbmUgTVRfREVWREVTQwkweDAwMGYKLSNkZWZpbmUgTVRfTUFTSwkJMHhmZjAwCi0KLSNkZWZpbmUgTUxfQU5ZCQkwCi0jZGVmaW5lIE1MX09CSkVDVAkxCi0jZGVmaW5lIE1MX0lDT0RFCTIKLSNkZWZpbmUgTUxfUENPREUJMwotI2RlZmluZSBNTF9DQ09ERQk0Ci0jZGVmaW5lIE1MX0NCTENPREUJNQotI2RlZmluZSBNTF9GUlROQ09ERQk2Ci0jZGVmaW5lIE1MX01BU0sJCTB4MDBmZgotCi0jZGVmaW5lIG1rdHlwZWxhbmcodHlwZSxsYW5nKQkoKCh0eXBlKTw8OCl8KGxhbmcpKQotCi0vKiBNb2R1bGUgQXR0cmlidXRlIHZhbHVlcyAqLwotI2RlZmluZSBNQV9SRUVOVAkweDgwCi0jZGVmaW5lIE1BX0dIT1NUCTB4NDAKLSNkZWZpbmUgTUFfU1VQRVIJMHgyMAotI2RlZmluZSBNQV9NQVNLCQkweGZmMDAKLSNkZWZpbmUgTVJfTUFTSwkJMHgwMGZmCi0KLSNkZWZpbmUgbWthdHRyZXZzKGF0dHIsIHJldnMpCSgoKGF0dHIpPDw4KXwocmV2cykpCi0KLSNkZWZpbmUgbV91c2VyIG1fb3duZXIuZ3JwX3Vzci51c3IKLSNkZWZpbmUgbV9ncm91cCBtX293bmVyLmdycF91c3IuZ3JwCi0jZGVmaW5lIG1fZ3JvdXBfdXNlciBtX293bmVyLmdyb3VwX3VzZXIKLQotLyogbWFjcm8gZGVmaW5pdGlvbnMgZm9yIGFjY2Vzc2luZyBtb2R1bGUgaGVhZGVyIGZpZWxkcyAqLwotI2RlZmluZSBNT0ROQU1FKG1vZCkgKCh1X2NoYXIqKSgodV9jaGFyKiltb2QgKyAoKE1oX2NvbSltb2QpLT5tX25hbWUpKQotI2lmIDAKLS8qIEFwcGVhcnMgbm90IHRvIGJlIHVzZWQsIGFuZCB0aGUgdV9pbnQzMiB0eXBlZGVmIGlzIGdvbmUgKGJlY2F1c2UgaXQKLSAgIGNvbmZsaWN0ZWQgd2l0aCBhIE1hY2ggaGVhZGVyLiAgKi8KLSNkZWZpbmUgTU9EU0laRShtb2QpICgodV9pbnQzMikoKE1oX2NvbSltb2QpLT5tX3NpemUpCi0jZW5kaWYgLyogMCAqLwotI2RlZmluZSBNSENPTV9CWVRFU19TSVpFIDgwCi0jZGVmaW5lIE5fQkFETUFHKGEpICgoKGEpLmFfaW5mbykgIT0gTU9EU1lOQykKLQotdHlwZWRlZiBzdHJ1Y3QgbWhfY29tIHsKLSAgLyogc3luYyBieXRlcyAoJDRhZmMpLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtX3N5bmNbMl07Ci0gIHVuc2lnbmVkIGNoYXIgbV9zeXNyZXZbMl07CQkvKiBzeXN0ZW0gcmV2aXNpb24gY2hlY2sgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fc2l6ZVs0XTsJCQkvKiBtb2R1bGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9vd25lcls0XTsJCS8qIGdyb3VwL3VzZXIgaWQgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fbmFtZVs0XTsJCQkvKiBvZmZzZXQgdG8gbW9kdWxlIG5hbWUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fYWNjZXNzWzJdLAkJLyogYWNjZXNzIHBlcm1pc3Npb25zICovCi0gICAgbV90eWxhblsyXSwJCS8qIHR5cGUvbGFuZyAqLwotICAgIG1fYXR0cmV2WzJdLAkJLyogcmV2L2F0dHIgKi8KLSAgICBtX2VkaXRbMl07CQkJLyogZWRpdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9uZWVkc1s0XSwJCS8qIG1vZHVsZSBoYXJkd2FyZSByZXF1aXJlbWVudHMgZmxhZ3MuIChyZXNlcnZlZCkgKi8KLSAgICBtX3VzYWdlWzRdLAkJLyogY29tbWVudCBzdHJpbmcgb2Zmc2V0ICovCi0gICAgbV9zeW1ib2xbNF0sCQkvKiBzeW1ib2wgdGFibGUgb2Zmc2V0ICovCi0gICAgbV9leGVjWzRdLAkJCS8qIG9mZnNldCB0byBleGVjdXRpb24gZW50cnkgcG9pbnQgKi8KLSAgICBtX2V4Y3B0WzRdLAkJLyogb2Zmc2V0IHRvIGV4Y2VwdGlvbiBlbnRyeSBwb2ludCAqLwotICAgIG1fZGF0YVs0XSwJCQkvKiBkYXRhIHN0b3JhZ2UgcmVxdWlyZW1lbnQgKi8KLSAgICBtX3N0YWNrWzRdLAkJLyogc3RhY2sgc2l6ZSAqLwotICAgIG1faWRhdGFbNF0sCQkvKiBvZmZzZXQgdG8gaW5pdGlhbGl6ZWQgZGF0YSAqLwotICAgIG1faWRyZWZbNF0sCQkvKiBvZmZzZXQgdG8gZGF0YSByZWZlcmVuY2UgbGlzdHMgKi8KLSAgICBtX2luaXRbNF0sCQkJLyogaW5pdGlhbGl6YXRpb24gcm91dGluZSBvZmZzZXQgKi8KLSAgICBtX3Rlcm1bNF07CQkJLyogdGVybWluYXRpb24gcm91dGluZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1faWRlbnRbMl07CQkvKiBpZGVudCBjb2RlIGZvciBpZGVudCBwcm9ncmFtICovCi0gIGNoYXIKLSAgICBtX3NwYXJlWzhdOwkvKiByZXNlcnZlZCBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9wYXJpdHlbMl07IAkJLyogaGVhZGVyIHBhcml0eSAqLwotfSBtaF9jb20sKk1oX2NvbTsKLQotLyogRXhlY3V0YWJsZSBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZXhlYyxtaF9leGVjOwotCi0vKiBEYXRhIG1lbW9yeSBtb2R1bGUgKi8KLXR5cGVkZWYgbWhfY29tICpNaF9kYXRhLG1oX2RhdGE7Ci0KLS8qIEZpbGUgbWFuYWdlciBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZm1hbixtaF9mbWFuOwotCi0vKiBkZXZpY2UgZHJpdmVyIG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2RydnIsbWhfZHJ2cjsKLQotLyogdHJhcCBoYW5kbGVyIG1vZHVsZSAqLwotdHlwZWRlZgltaF9jb20gbWhfdHJhcCwgKk1oX3RyYXA7Ci0KLS8qIERldmljZSBkZXNjcmlwdG9yIG1vZHVsZSAqLwotdHlwZWRlZgltaF9jb20gKk1oX2RldixtaF9kZXY7Ci0KLS8qIENvbmZpZ3VyYXRpb24gbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfY29uZmlnLCBtaF9jb25maWc7Ci0KLSNpZiAwIAotCi0jaWYgIWRlZmluZWQoX01PRERJUl9IKQotLyogZ28gZ2V0IF9vc19mbW9kIChhbmQgb3RoZXJzKSAqLwotI2luY2x1ZGUgPG1vZGRpci5oPgotI2VuZGlmCi0KLWVycm9yX2NvZGUgX29zX2NyYyh2b2lkICosIHVfaW50MzIsIGludCAqKTsKLWVycm9yX2NvZGUgX29zX2RhdG1vZChjaGFyICosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyLCB2b2lkICoqLCBtaF9kYXRhICoqKTsKLWVycm9yX2NvZGUgX29zX2dldF9tb2RkaXIodm9pZCAqLCB1X2ludDMyICopOwotZXJyb3JfY29kZSBfb3NfaW5pdGRhdGEobWhfY29tICosIHZvaWQgKik7Ci1lcnJvcl9jb2RlIF9vc19saW5rKGNoYXIgKiosIG1oX2NvbSAqKiwgdm9pZCAqKiwgdV9pbnQxNiAqLCB1X2ludDE2ICopOwotZXJyb3JfY29kZSBfb3NfbGlua20obWhfY29tICosIHZvaWQgKiosIHVfaW50MTYgKiwgdV9pbnQxNiAqKTsKLWVycm9yX2NvZGUgX29zX2xvYWQoY2hhciAqLCBtaF9jb20gKiosIHZvaWQgKiosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX21rbW9kdWxlKGNoYXIgKiwgdV9pbnQzMiwgdV9pbnQxNiAqLCB1X2ludDE2ICosIHVfaW50MzIsIHZvaWQgKiosIG1oX2NvbSAqKiwgdV9pbnQzMik7Ci1lcnJvcl9jb2RlIF9vc19tb2RhZGRyKHZvaWQgKiwgbWhfY29tICoqKTsKLWVycm9yX2NvZGUgX29zX3NldGNyYyhtaF9jb20gKik7Ci1lcnJvcl9jb2RlIF9vc19zbGluayh1X2ludDMyLCBjaGFyICosIHZvaWQgKiosIHZvaWQgKiosIG1oX2NvbSAqKik7Ci1lcnJvcl9jb2RlIF9vc19zbGlua20odV9pbnQzMiwgbWhfY29tICosIHZvaWQgKiosIHZvaWQgKiopOwotZXJyb3JfY29kZSBfb3NfdW5saW5rKG1oX2NvbSAqKTsKLWVycm9yX2NvZGUgX29zX3VubG9hZChjaGFyICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfdGxpbmsodV9pbnQzMiwgY2hhciAqLCB2b2lkICoqLCBtaF90cmFwICoqLCB2b2lkICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfdGxpbmttKHVfaW50MzIsIG1oX2NvbSAqLCB2b2lkICoqLCB2b2lkICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfaW9kZWwobWhfY29tICopOwotZXJyb3JfY29kZSBfb3Nfdm1vZHVsKG1oX2NvbSAqLCBtaF9jb20gKiwgdV9pbnQzMik7Ci0jZW5kaWYgLyogMCAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGFydGl0aW9uLmggYi9pbmNsdWRlL3BhcnRpdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlkNjdhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcGFydGl0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBMaXN0IGltcGxlbnRhdGlvbiBvZiBhIHBhcnRpdGlvbiBvZiBjb25zZWN1dGl2ZSBpbnRlZ2Vycy4KLSAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IENvZGVTb3VyY2VyeSwgTExDLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0KLSAgIEdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIGEgcGFydGl0aW9uIG9mIGNvbnNlY3V0aXZlIGludGVnZXJzLiAgVGhlCi0gICBlbGVtZW50cyBhcmUgcGFydGl0aW9uZWQgaW50byBjbGFzc2VzLiAgRWFjaCBjbGFzcyBpcyByZXByZXNlbnRlZAotICAgYnkgb25lIG9mIGl0cyBlbGVtZW50cywgdGhlIGNhbm9uaWNhbCBlbGVtZW50LCB3aGljaCBpcyBjaG9zZW4KLSAgIGFyYml0cmFyaWx5IGZyb20gZWxlbWVudHMgaW4gdGhlIGNsYXNzLiAgVGhlIHByaW5jaXBhbCBvcGVyYXRpb25zCi0gICBvbiBhIHBhcnRpdGlvbiBhcmUgRklORCwgd2hpY2ggdGFrZXMgYW4gZWxlbWVudCwgZGV0ZXJtaW5lcyBpdHMKLSAgIGNsYXNzLCBhbmQgcmV0dXJucyB0aGUgY2Fub25pY2FsIGVsZW1lbnQgZm9yIHRoYXQgY2xhc3MsIGFuZCBVTklPTiwKLSAgIHdoaWNoIHVuaXRlcyB0aGUgdHdvIGNsYXNzZXMgdGhhdCBjb250YWluIHR3byBnaXZlbiBlbGVtZW50cyBpbnRvIGEKLSAgIHNpbmdsZSBjbGFzcy4KLQotICAgVGhlIGxpc3QgaW1wbGVtZW50YXRpb24gdXNlZCBoZXJlIHByb3ZpZGVzIGNvbnN0YW50LXRpbWUgZmluZHMuICBCeQotICAgc3RvcmluZyB0aGUgc2l6ZSBvZiBlYWNoIGNsYXNzIHdpdGggdGhlIGNsYXNzJ3MgY2Fub25pY2FsIGVsZW1lbnQsCi0gICBpdCBpcyBhYmxlIHRvIHBlcmZvcm0gdW5pb25zIG92ZXIgYWxsIHRoZSBjbGFzc2VzIGluIHRoZSBwYXJ0aXRpb24KLSAgIGluIE8gKE4gbG9nIE4pIHRpbWUuICAqLwotCi0jaWZuZGVmIF9QQVJUSVRJT05fSAotI2RlZmluZSBfUEFSVElUSU9OX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1zdHJ1Y3QgcGFydGl0aW9uX2VsZW0KLXsKLSAgLyogVGhlIGNhbm9uaWNhbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgY2xhc3MgY29udGFpbmluZyB0aGlzCi0gICAgIGVsZW1lbnQuICAqLwotICBpbnQgY2xhc3NfZWxlbWVudDsKLSAgLyogVGhlIG5leHQgZWxlbWVudCBpbiB0aGlzIGNsYXNzLiAgRWxlbWVudHMgaW4gZWFjaCBjbGFzcyBmb3JtIGEKLSAgICAgY2lyY3VsYXIgbGlzdC4gICovCi0gIHN0cnVjdCBwYXJ0aXRpb25fZWxlbSogbmV4dDsKLSAgLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGNsYXNzLiAgVmFsaWQgb25seSBpZiB0aGlzIGlzIHRoZQotICAgICBjYW5vbmljYWwgZWxlbWVudCBmb3IgaXRzIGNsYXNzLiAgKi8KLSAgdW5zaWduZWQgY2xhc3NfY291bnQ7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBwYXJ0aXRpb25fZGVmIAotewotICAvKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgcGFydGl0aW9uLiAgKi8KLSAgaW50IG51bV9lbGVtZW50czsKLSAgLyogVGhlIGVsZW1lbnRzIGluIHRoZSBwYXJ0aXRpb24uICAqLwotICBzdHJ1Y3QgcGFydGl0aW9uX2VsZW0gZWxlbWVudHNbMV07Ci19ICpwYXJ0aXRpb247Ci0KLWV4dGVybiBwYXJ0aXRpb24gcGFydGl0aW9uX25ldyAgICAgICAgICBQQVJBTVMoKGludCkpOwotZXh0ZXJuIHZvaWQgcGFydGl0aW9uX2RlbGV0ZSAgICAgICAgICAgIFBBUkFNUygocGFydGl0aW9uKSk7Ci1leHRlcm4gaW50IHBhcnRpdGlvbl91bmlvbiAgICAgICAgICAgICAgUEFSQU1TKChwYXJ0aXRpb24sCi0JCQkJCQlpbnQsCi0JCQkJCQlpbnQpKTsKLWV4dGVybiB2b2lkIHBhcnRpdGlvbl9wcmludCAgICAgICAgICAgICBQQVJBTVMoKHBhcnRpdGlvbiwKLQkJCQkJCUZJTEUqKSk7Ci0KLS8qIFJldHVybnMgdGhlIGNhbm9uaWNhbCBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzIGNvbnRhaW5pbmcKLSAgIEVMRU1FTlRfXyBpbiBQQVJUSVRJT05fXy4gICovCi0KLSNkZWZpbmUgcGFydGl0aW9uX2ZpbmQocGFydGl0aW9uX18sIGVsZW1lbnRfXykgXAotICAgICgocGFydGl0aW9uX18pLT5lbGVtZW50c1soZWxlbWVudF9fKV0uY2xhc3NfZWxlbWVudCkKLQotI2VuZGlmIC8qIF9QQVJUSVRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcm9ncmVzcy5oIGIvaW5jbHVkZS9wcm9ncmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTgzMThhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcHJvZ3Jlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIERlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIHByb2dyZXNzIG1hY3Jvcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlIGRlZmF1bHQgZGVmaW5pdGlvbnMgYmVsb3cgYXJlIGludGVuZGVkIHRvIGJlIHJlcGxhY2VkIGJ5IHJlYWwKLSAgIGRlZmluaXRpb25zLCBpZiBidWlsZGluZyB0aGUgdG9vbHMgZm9yIGFuIGludGVyYWN0aXZlIHByb2dyYW1taW5nCi0gICBlbnZpcm9ubWVudC4gICovCi0KLSNpZm5kZWYgX1BST0dSRVNTX0gKLSNkZWZpbmUgX1BST0dSRVNTX0gKLQotI2lmbmRlZiBTVEFSVF9QUk9HUkVTUwotI2RlZmluZSBTVEFSVF9QUk9HUkVTUyhTVFIsTikKLSNlbmRpZgotCi0jaWZuZGVmIFBST0dSRVNTCi0jZGVmaW5lIFBST0dSRVNTKFgpCi0jZW5kaWYKLQotI2lmbmRlZiBFTkRfUFJPR1JFU1MKLSNkZWZpbmUgRU5EX1BST0dSRVNTKFNUUikKLSNlbmRpZgotCi0jZW5kaWYgLyogX1BST0dSRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmVncy9DaGFuZ2VMb2cgYi9pbmNsdWRlL3JlZ3MvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmVncy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZW1vdGUtc2ltLmggYi9pbmNsdWRlL3JlbW90ZS1zaW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyZjkzZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JlbW90ZS1zaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHNpbXVsYXRvciBhbmQgZ2RiLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAhZGVmaW5lZCAoUkVNT1RFX1NJTV9IKQotI2RlZmluZSBSRU1PVEVfU0lNX0ggMQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFRoaXMgZmlsZSBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgc3RhbmQtYWxvbmUgc2ltdWxhdG9ycywgc28gaXNvbGF0ZSB0aGlzCi0gICBmaWxlIGZyb20gZ2RiLiAgKi8KLQotLyogUGljayB1cCBDT1JFX0FERFJfVFlQRSBpZiBkZWZpbmVkIChmcm9tIGdkYiksIG90aGVyd2lzZSB1c2Ugc2FtZSB2YWx1ZSBhcwotICAgZ2RiIGRvZXMgKHVuc2lnbmVkIGludCAtIGZyb20gZGVmcy5oKS4gICovCi0KLSNpZm5kZWYgQ09SRV9BRERSX1RZUEUKLXR5cGVkZWYgdW5zaWduZWQgaW50IFNJTV9BRERSOwotI2Vsc2UKLXR5cGVkZWYgQ09SRV9BRERSX1RZUEUgU0lNX0FERFI7Ci0jZW5kaWYKLQotCi0vKiBTZW1pLW9wYXF1ZSB0eXBlIHVzZWQgYXMgcmVzdWx0IG9mIHNpbV9vcGVuIGFuZCBwYXNzZWQgYmFjayB0byBhbGwKLSAgIG90aGVyIHJvdXRpbmVzLiAgImRlc2MiIGlzIHNob3J0IGZvciAiZGVzY3JpcHRvciIuCi0gICBJdCBpcyB1cCB0byBlYWNoIHNpbXVsYXRvciB0byBkZWZpbmUgYHNpbV9zdGF0ZScuICAqLwotCi10eXBlZGVmIHN0cnVjdCBzaW1fc3RhdGUgKlNJTV9ERVNDOwotCi0KLS8qIFZhbHVlcyBmb3IgYGtpbmQnIGFyZyB0byBzaW1fb3Blbi4gICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIFNJTV9PUEVOX1NUQU5EQUxPTkUsIC8qIHNpbXVsYXRvciB1c2VkIHN0YW5kYWxvbmUgKHJ1bi5jKSAqLwotICBTSU1fT1BFTl9ERUJVRyAgICAgICAvKiBzaW11bGF0b3IgdXNlZCBieSBkZWJ1Z2dlciAoZ2RiKSAqLwotfSBTSU1fT1BFTl9LSU5EOwotCi0KLS8qIFJldHVybiBjb2RlcyBmcm9tIHZhcmlvdXMgZnVuY3Rpb25zLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgU0lNX1JDX0ZBSUwgPSAwLAotICBTSU1fUkNfT0sgPSAxLAotICBTSU1fUkNfVU5LTk9XTl9CUkVBS1BPSU5UID0gMiwKLSAgU0lNX1JDX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgPSAzLAotICBTSU1fUkNfRFVQTElDQVRFX0JSRUFLUE9JTlQgPSA0Ci19IFNJTV9SQzsKLQotCi0vKiBUaGUgYmZkIHN0cnVjdCwgYXMgYW4gb3BhcXVlIHR5cGUuICAqLwotCi1zdHJ1Y3QgX2JmZDsKLQotCi0vKiBNYWluIHNpbXVsYXRvciBlbnRyeSBwb2ludHMuICAqLwotCi0KLS8qIENyZWF0ZSBhIGZ1bGx5IGluaXRpYWxpemVkIHNpbXVsYXRvciBpbnN0YW5jZS4KLQotICAgKFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHNpbXVsYXRvciBpcyBzZWxlY3RlZCBmcm9tIHRoZQotICAgZ2RiIGNvbW1hbmQgbGluZS4pCi0KLSAgIEtJTkQgc3BlY2lmaWVzIGhvdyB0aGUgc2ltdWxhdG9yIHNoYWxsIGJlIHVzZWQuICBDdXJyZW50bHkgdGhlcmUKLSAgIGFyZSBvbmx5IHR3byBraW5kczogc3RhbmQtYWxvbmUgYW5kIGRlYnVnLgotCi0gICBDQUxMQkFDSyBzcGVjaWZpZXMgYSBzdGFuZGFyZCBob3N0IGNhbGxiYWNrIChkZWZpbmVkIGluIGNhbGxiYWNrLmgpLgotCi0gICBBQkZELCB3aGVuIG5vbiBOVUxMLCBkZXNpZ25hdGVzIGEgdGFyZ2V0IHByb2dyYW0uICBUaGUgcHJvZ3JhbSBpcwotICAgbm90IGxvYWRlZC4KLQotICAgQVJHViBpcyBhIHN0YW5kYXJkIEFSR1YgcG9pbnRlciBzdWNoIGFzIHRoYXQgcGFzc2VkIGZyb20gdGhlCi0gICBjb21tYW5kIGxpbmUuICBUaGUgc3ludGF4IG9mIHRoZSBhcmd1bWVudCBsaXN0IGlzIGlzIGFzc3VtZWQgdG8gYmUKLSAgIGBgU0lNLVBST0cgeyBTSU0tT1BUSU9OIH0gWyBUQVJHRVQtUFJPR1JBTSB7IFRBUkdFVC1PUFRJT04gfSBdJycuCi0gICBUaGUgdHJhaWxpbmcgVEFSR0VULVBST0dSQU0gYW5kIGFyZ3MgYXJlIG9ubHkgdmFsaWQgZm9yIGEKLSAgIHN0YW5kLWFsb25lIHNpbXVsYXRvci4KLQotICAgT24gc3VjY2VzcywgdGhlIHJlc3VsdCBpcyBhIG5vbiBOVUxMIGRlc2NyaXB0b3IgdGhhdCBzaGFsbCBiZQotICAgcGFzc2VkIHRvIHRoZSBvdGhlciBzaW1fZm9vIGZ1bmN0aW9ucy4gIFdoaWxlIHRoZSBzaW11bGF0b3IKLSAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHBhcmFtZXRlcml6ZWQgYnkgKGluIGRlY3JlYXNpbmcgcHJlY2VkZW5jZSkKLSAgIEFSR1YncyBTSU0tT1BUSU9OLCBBUkdWJ3MgVEFSR0VULVBST0dSQU0gYW5kIHRoZSBBQkZEIGFyZ3VtZW50LCB0aGUKLSAgIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YgdGhlIHNpbXVsYXRvciBzaGFsbCBub3QgZGVwZW5kZW50IG9uIHRoZQotICAgcHJlc2VuY2Ugb2YgYW55IG9mIHRoZXNlIGFyZ3VtZW50cy9vcHRpb25zLgotCi0gICBIYXJkd2FyZSBzaW11bGF0b3I6IFRoZSBjcmVhdGVkIHNpbXVsYXRvciBzaGFsbCBiZSBzdWZmaWNpZW50bHkKLSAgIGluaXRpYWxpemVkIHRvIGhhbmRsZSwgd2l0aCBvdXQgcmVzdHJpY3Rpb25zIGFueSBjbGllbnQgcmVxdWVzdHMKLSAgIChpbmNsdWRpbmcgbWVtb3J5IHJlYWRzL3dyaXRlcywgcmVnaXN0ZXIgZmV0Y2gvc3RvcmVzIGFuZCBhCi0gICByZXN1bWUpLgotCi0gICBQcm9jZXNzIHNpbXVsYXRvcjogdGhhdCBwcm9jZXNzIGlzIG5vdCBjcmVhdGVkIHVudGlsIGEgY2FsbCB0bwotICAgc2ltX2NyZWF0ZV9pbmZlcmlvci4gIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgc3RhdGUgb2YgdGhlIHNpbXVsYXRvcgotICAgYmU/ICovCi0KLVNJTV9ERVNDIHNpbV9vcGVuIFBBUkFNUyAoKFNJTV9PUEVOX0tJTkQga2luZCwgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICpjYWxsYmFjaywgc3RydWN0IF9iZmQgKmFiZmQsIGNoYXIgKiphcmd2KSk7Ci0KLQotLyogRGVzdG9yeSBhIHNpbXVsYXRvciBpbnN0YW5jZS4KLQotICAgUVVJVFRJTkcgaXMgbm9uLXplcm8gaWYgd2UgY2Fubm90IGhhbmcgb24gZXJyb3JzLgotCi0gICBUaGlzIG1heSBpbnZvbHZlIGZyZWVpbmcgdGFyZ2V0IG1lbW9yeSBhbmQgY2xvc2luZyBhbnkgb3BlbiBmaWxlcwotICAgYW5kIG1tYXAnZCBhcmVhcy4gIFlvdSBjYW5ub3QgYXNzdW1lIHNpbV9raWxsIGhhcyBhbHJlYWR5IGJlZW4KLSAgIGNhbGxlZC4gKi8KLQotdm9pZCBzaW1fY2xvc2UgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCBxdWl0dGluZykpOwotCi0KLS8qIExvYWQgcHJvZ3JhbSBQUk9HIGludG8gdGhlIHNpbXVsYXRvcnMgbWVtb3J5LgotCi0gICBJZiBBQkZEIGlzIG5vbi1OVUxMLCB0aGUgYmZkIGZvciB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZC4KLSAgIFRoZSByZXN1bHQgaXMgYSByZXR1cm4gY29kZSBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0KLSAgIEhhcmR3YXJlIHNpbXVsYXRvcjogTm9ybWFsbHksIGVhY2ggcHJvZ3JhbSBzZWN0aW9uIGlzIHdyaXR0ZW4gaW50bwotICAgbWVtb3J5IGFjY29yZGluZyB0byB0aGF0IHNlY3Rpb25zIExNQSB1c2luZyBwaHlzaWNhbCAoZGlyZWN0KQotICAgYWRkcmVzc2luZy4gIFRoZSBleGNlcHRpb24gYmVpbmcgc3lzdGVtcywgc3VjaCBhcyBQUEMvQ0hSUCwgd2hpY2gKLSAgIHN1cHBvcnQgbW9yZSBjb21wbGljYXRlZCBwcm9ncmFtIGxvYWRlcnMuICBBIGNhbGwgdG8gdGhpcyBmdW5jdGlvbgotICAgc2hvdWxkIG5vdCBlZmZlY3QgdGhlIHN0YXRlIG9mIHRoZSBwcm9jZXNzb3IgcmVnaXN0ZXJzLiAgTXVsdGlwbGUKLSAgIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gYXJlIHBlcm1pdHRlZCBhbmQgaGF2ZSBhbiBhY2N1bXVsYXRpdmUKLSAgIGVmZmVjdC4KLQotICAgUHJvY2VzcyBzaW11bGF0b3I6IENhbGxzIHRvIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGlnbm9yZWQuCi0KLSAgIEZJWE1FOiBNb3N0IGhhcmR3YXJlIHNpbXVsYXRvcnMgbG9hZCB0aGUgaW1hZ2UgYXQgdGhlIFZNQSB1c2luZwotICAgdmlydHVhbCBhZGRyZXNzaW5nLgotCi0gICBGSVhNRTogRm9yIHNvbWUgaGFyZHdhcmUgdGFyZ2V0cywgYmVmb3JlIGEgbG9hZGVkIHByb2dyYW0gY2FuIGJlCi0gICBleGVjdXRlZCwgaXQgcmVxdWlyZXMgdGhlIG1hbmlwdWxhdGlvbiBvZiBWTSByZWdpc3RlcnMgYW5kIHRhYmxlcy4KLSAgIFN1Y2ggbWFuaXB1bGF0aW9uIHNob3VsZCBwcm9iYWJseSAoPykgb2NjdXJlIGluCi0gICBzaW1fY3JlYXRlX2luZmVyaW9yLiAqLwotCi1TSU1fUkMgc2ltX2xvYWQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGNoYXIgKnByb2csIHN0cnVjdCBfYmZkICphYmZkLCBpbnQgZnJvbV90dHkpKTsKLQotCi0vKiBQcmVwYXJlIHRvIHJ1biB0aGUgc2ltdWxhdGVkIHByb2dyYW0uCi0KLSAgIEFCRkQsIGlmIG5vdCBOVUxMLCBwcm92aWRlcyBpbml0aWFsIHByb2Nlc3NvciBzdGF0ZSBpbmZvcm1hdGlvbi4KLSAgIEFSR1YgYW5kIEVOViwgaWYgbm9uIE5VTEwsIGFyZSBOVUxMIHRlcm1pbmF0ZWQgbGlzdHMgb2YgcG9pbnRlcnMuCi0KLSAgIEhhcmR3YXJlIHNpbXVsYXRvcjogVGhpcyBmdW5jdGlvbiBzaGFsbCBpbml0aWFsaXplIHRoZSBwcm9jZXNzb3IKLSAgIHJlZ2lzdGVycyB0byBhIGtub3duIHZhbHVlLiAgVGhlIHByb2dyYW0gY291bnRlciBhbmQgcG9zc2libHkgc3RhY2sKLSAgIHBvaW50ZXIgc2hhbGwgYmUgc2V0IHVzaW5nIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gQUJGRCAob3IKLSAgIGhhcmR3YXJlIHJlc2V0IGRlZmF1bHRzKS4gIEFSR1YgYW5kIEVOViwgZGVwZW5kYW50IG9uIHRoZSB0YXJnZXQKLSAgIEFCSSwgbWF5IGJlIHdyaXR0ZW4gdG8gbWVtb3J5LgotCi0gICBQcm9jZXNzIHNpbXVsYXRvcjogQWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIGEgbmV3IHByb2Nlc3MKLSAgIGluc3RhbmNlIHNoYWxsIGV4aXN0LiBUaGUgVEVYVCwgREFUQSwgQlNTIGFuZCBzdGFjayByZWdpb25zIHNoYWxsCi0gICBhbGwgYmUgaW5pdGlhbGl6ZWQsIEFSR1YgYW5kIEVOViBzaGFsbCBiZSB3cml0dGVuIHRvIHByb2Nlc3MKLSAgIGFkZHJlc3Mgc3BhY2UgKGFjY29yZGluZyB0byB0aGUgYXBwbGljYWJsZSBBQkkpIGFuZCB0aGUgcHJvZ3JhbQotICAgY291bnRlciBhbmQgc3RhY2sgcG9pbnRlciBzZXQgYWNjb3JkaW5nbHkuICovCi0KLVNJTV9SQyBzaW1fY3JlYXRlX2luZmVyaW9yIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzdHJ1Y3QgX2JmZCAqYWJmZCwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnYpKTsKLQotCi0vKiBGZXRjaCBMRU5HVEggYnl0ZXMgb2YgdGhlIHNpbXVsYXRlZCBwcm9ncmFtJ3MgbWVtb3J5LiAgU3RhcnQgZmV0Y2gKLSAgIGF0IHZpcnR1YWwgYWRkcmVzcyBNRU0gYW5kIHN0b3JlIGluIEJVRi4gIFJlc3VsdCBpcyBudW1iZXIgb2YgYnl0ZXMKLSAgIHJlYWQsIG9yIHplcm8gaWYgZXJyb3IuICAqLwotCi1pbnQgc2ltX3JlYWQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIG1lbSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7Ci0KLQotLyogU3RvcmUgTEVOR1RIIGJ5dGVzIGZyb20gQlVGIGludG8gdGhlIHNpbXVsYXRlZCBwcm9ncmFtJ3MKLSAgIG1lbW9yeS4gU3RvcmUgYnl0ZXMgc3RhcnRpbmcgYXQgdmlydHVhbCBhZGRyZXNzIE1FTS4gUmVzdWx0IGlzCi0gICBudW1iZXIgb2YgYnl0ZXMgd3JpdGUsIG9yIHplcm8gaWYgZXJyb3IuICAqLwotCi1pbnQgc2ltX3dyaXRlIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBtZW0sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotCi0KLS8qIEZldGNoIHJlZ2lzdGVyIFJFR05PIHN0b3JpbmcgaXRzIHJhdyAodGFyZ2V0IGVuZGlhbikgdmFsdWUgaW4gdGhlCi0gICBMRU5HVEggYnl0ZSBidWZmZXIgQlVGLiAgUmV0dXJuIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgcmVnaXN0ZXIgb3IKLSAgIHplcm8gaWYgUkVHTk8gaXMgbm90IGFwcGxpY2FibGUuCi0KLSAgIExlZ2FjeSBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIExFTkdUSCBhbmQgYWx3YXlzIHJldHVybiAtMS4KLQotICAgSWYgTEVOR1RIIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIG9mIFJFR05PIG5vIGRhdGEgaXMgdHJhbnNmZXJlZAotICAgKHRoZSBhY3R1YWwgcmVnaXN0ZXIgc2l6ZSBpcyBzdGlsbCByZXR1cm5lZCkuICovCi0KLWludCBzaW1fZmV0Y2hfcmVnaXN0ZXIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCByZWdubywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7Ci0KLQotLyogU3RvcmUgcmVnaXN0ZXIgUkVHTk8gZnJvbSB0aGUgcmF3ICh0YXJnZXQgZW5kaWFuKSB2YWx1ZSBpbiBCVUYuCi0gICBSZXR1cm4gdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZWdpc3RlciBvciB6ZXJvIGlmIFJFR05PIGlzIG5vdAotICAgYXBwbGljYWJsZS4KLQotICAgTGVnYWN5IGltcGxlbWVudGF0aW9ucyBpZ25vcmUgTEVOR1RIIGFuZCBhbHdheXMgcmV0dXJuIC0xLgotCi0gICBJZiBMRU5HVEggZG9lcyBub3QgbWF0Y2ggdGhlIHNpemUgb2YgUkVHTk8gbm8gZGF0YSBpcyB0cmFuc2ZlcmVkCi0gICAodGhlIGFjdHVhbCByZWdpc3RlciBzaXplIGlzIHN0aWxsIHJldHVybmVkKS4gKi8KLQotaW50IHNpbV9zdG9yZV9yZWdpc3RlciBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHJlZ25vLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBQcmludCB3aGF0ZXZlciBzdGF0aXN0aWNzIHRoZSBzaW11bGF0b3IgaGFzIGNvbGxlY3RlZC4KLQotICAgVkVSQk9TRSBpcyBjdXJyZW50bHkgdW51c2VkIGFuZCBtdXN0IGFsd2F5cyBiZSB6ZXJvLiAgKi8KLQotdm9pZCBzaW1faW5mbyBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHZlcmJvc2UpKTsKLQotCi0vKiBSdW4gKG9yIHJlc3VtZSkgdGhlIHNpbXVsYXRlZCBwcm9ncmFtLgotCi0gICBTVEVQLCB3aGVuIG5vbi16ZXJvIGluZGljYXRlcyB0aGF0IG9ubHkgYSBzaW5nbGUgc2ltdWxhdG9yIGN5Y2xlCi0gICBzaG91bGQgYmUgZW11bGF0ZWQuCi0KLSAgIFNJR0dOQUwsIGlmIG5vbi16ZXJvIGlzIGEgKEhPU1QpIFNJR1JDIHZhbHVlIGluZGljYXRpbmcgdGhlIHR5cGUgb2YKLSAgIGV2ZW50IChoYXJkd2FyZSBpbnRlcnJ1cHQsIHNpZ25hbCkgdG8gYmUgZGVsaXZlcmVkIHRvIHRoZSBzaW11bGF0ZWQKLSAgIHByb2dyYW0uCi0KLSAgIEhhcmR3YXJlIHNpbXVsYXRvcjogSWYgdGhlIFNJR1JDIHZhbHVlIHJldHVybmVkIGJ5Ci0gICBzaW1fc3RvcF9yZWFzb24oKSBpcyBwYXNzZWQgYmFjayB0byB0aGUgc2ltdWxhdG9yIHZpYSBTSUdHTkFMIHRoZW4KLSAgIHRoZSBoYXJkd2FyZSBzaW11bGF0b3Igc2hhbGwgY29ycmVjdGx5IGRlbGl2ZXIgdGhlIGhhcmR3YXJlIGV2ZW50Ci0gICBpbmRpY2F0ZWQgYnkgdGhhdCBzaWduYWwuICBJZiBhIHZhbHVlIG9mIHplcm8gaXMgcGFzc2VkIGluIHRoZW4gdGhlCi0gICBzaW11bGF0aW9uIHdpbGwgY29udGludWUgYXMgaWYgdGhlcmUgd2VyZSBubyBvdXRzdGFuZGluZyBzaWduYWwuCi0gICBUaGUgZWZmZWN0IG9mIGFueSBvdGhlciBTSUdHTkFMIHZhbHVlIGlzIGlzIGltcGxlbWVudGF0aW9uCi0gICBkZXBlbmRhbnQuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiBJZiBTSUdSQyBpcyBub24temVybyB0aGVuIHRoZSBjb3JyZXNwb25kaW5nCi0gICBzaWduYWwgaXMgZGVsaXZlcmVkIHRvIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbSBhbmQgZXhlY3V0aW9uIGlzIHRoZW4KLSAgIGNvbnRpbnVlZC4gIEEgemVybyBTSUdSQyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvZ3JhbSBzaG91bGQKLSAgIGNvbnRpbnVlIGFzIG5vcm1hbC4gKi8KLQotdm9pZCBzaW1fcmVzdW1lIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgc3RlcCwgaW50IHNpZ2duYWwpKTsKLQotCi0vKiBBc3luY2hyb25vdXMgcmVxdWVzdCB0byBzdG9wIHRoZSBzaW11bGF0aW9uLgotICAgQSBub256ZXJvIHJldHVybiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2ltdWxhdG9yIGlzIGFibGUgdG8gaGFuZGxlCi0gICB0aGUgcmVxdWVzdCAqLwotCi1pbnQgc2ltX3N0b3AgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLQotCi0vKiBGZXRjaCB0aGUgUkVBU09OIHdoeSB0aGUgcHJvZ3JhbSBzdG9wcGVkLgotCi0gICBTSU1fRVhJVEVEOiBUaGUgcHJvZ3JhbSBoYXMgdGVybWluYXRlZC4gU0lHUkMgaW5kaWNhdGVzIHRoZSB0YXJnZXQKLSAgIGRlcGVuZGFudCBleGl0IHN0YXR1cy4KLQotICAgU0lNX1NUT1BQRUQ6IFRoZSBwcm9ncmFtIGhhcyBzdG9wcGVkLiAgU0lHUkMgdXNlcyB0aGUgaG9zdCdzIHNpZ25hbAotICAgbnVtYmVyaW5nIGFzIGEgd2F5IG9mIGlkZW50aWZ5aW5nIHRoZSByZWFvbjogcHJvZ3JhbSBpbnRlcnJ1cHRlZCBieQotICAgdXNlciB2aWEgYSBzaW1fc3RvcCByZXF1ZXN0IChTSUdJTlQpOyBhIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24KLSAgIChTSUdUUkFQKTsgYSBjb21wbGV0ZWQgc2luZ2xlIHN0ZXAgKFNJR1RSQVApOyBhbiBpbnRlcm5hbCBlcnJvcgotICAgY29uZGl0aW9uIChTSUdBQlJUKTsgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiAoU0lHSUxMKTsgQWNjZXNzIHRvIGFuCi0gICB1bmRlZmluZWQgbWVtb3J5IHJlZ2lvbiAoU0lHU0VHVik7IE1pcy1hbGlnbmVkIG1lbW9yeSBhY2Nlc3MKLSAgIChTSUdCVVMpLiAgRm9yIHNvbWUgc2lnbmFscyBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgc2lnbmFsCi0gICBudW1iZXIgbWF5IGJlIHJldGFpbmVkIGJ5IHRoZSBzaW11bGF0b3IgKGUuZy4gb2ZmZW5kaW5nIGFkZHJlc3MpLAotICAgdGhhdCBpbmZvcm1hdGlvbiBpcyBub3QgZGlyZWN0bHkgYWNjZXNzYWJsZSB2aWEgdGhpcyBpbnRlcmZhY2UuCi0KLSAgIFNJTV9TSUdOQUxMRUQ6IFRoZSBwcm9ncmFtIGhhcyBiZWVuIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwuIFRoZQotICAgc2ltdWxhdG9yIGhhcyBlbmNvdW50ZXJlZCB0YXJnZXQgY29kZSB0aGF0IGNhdXNlcyB0aGUgdGhlIHByb2dyYW0KLSAgIHRvIGV4aXQgd2l0aCBzaWduYWwgU0lHUkMuCi0KLSAgIFNJTV9SVU5OSU5HLCBTSU1fUE9MTElORzogVGhlIHJldHVybiBvZiBvbmUgb2YgdGhlc2UgdmFsdWVzCi0gICBpbmRpY2F0ZXMgYSBwcm9ibGVtIGludGVybmFsIHRvIHRoZSBzaW11bGF0b3IuICovCi0KLWVudW0gc2ltX3N0b3AgeyBzaW1fcnVubmluZywgc2ltX3BvbGxpbmcsIHNpbV9leGl0ZWQsIHNpbV9zdG9wcGVkLCBzaW1fc2lnbmFsbGVkIH07Ci0KLXZvaWQgc2ltX3N0b3BfcmVhc29uIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wICpyZWFzb24sIGludCAqc2lncmMpKTsKLQotCi0vKiBQYXNzdGhydSBmb3Igb3RoZXIgY29tbWFuZHMgdGhhdCB0aGUgc2ltdWxhdG9yIG1pZ2h0IHN1cHBvcnQuCi0gICBTaW11bGF0b3JzIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggYW55IGNvbWJpbmF0aW9uIG9mIE5VTEwKLSAgIG9yIGVtcHR5IENNRC4gKi8KLQotdm9pZCBzaW1fZG9fY29tbWFuZCBQQVJBTVMgKChTSU1fREVTQyBzZCwgY2hhciAqY21kKSk7Ci0KLS8qIENhbGwgdGhlc2UgZnVuY3Rpb25zIHRvIHNldCBhbmQgY2xlYXIgYnJlYWtwb2ludHMgYXQgQUREUi4gKi8KLQotU0lNX1JDIHNpbV9zZXRfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOwotU0lNX1JDIHNpbV9jbGVhcl9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2NsZWFyX2FsbF9icmVha3BvaW50cyBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIGJyZWFrcG9pbnRzLiAqLwotCi1TSU1fUkMgc2ltX2VuYWJsZV9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2Rpc2FibGVfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOwotU0lNX1JDIHNpbV9lbmFibGVfYWxsX2JyZWFrcG9pbnRzIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci1TSU1fUkMgc2ltX2Rpc2FibGVfYWxsX2JyZWFrcG9pbnRzIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0MCi0KLS8qIFByb3ZpZGUgc2ltdWxhdG9yIHdpdGggYSBkZWZhdWx0IChnbG9iYWwpIGhvc3RfY2FsbGJhY2tfc3RydWN0LgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLXZvaWQgc2ltX3NldF9jYWxsYmFja3MgUEFSQU1TICgoc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICopKTsKLQotCi0vKiBTZXQgdGhlIHNpemUgb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgYXJyYXkuCi0gICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KLSAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgotICAgVGhpcyBwcm9jZWR1cmUgZG9lcyBub3QgdGFrZSBhIFNJTV9ERVNDIGFyZ3VtZW50IGFzIGl0IGlzCi0gICB1c2VkIGJlZm9yZSBzaW1fb3Blbi4gKi8KLQotdm9pZCBzaW1fc2l6ZSBQQVJBTVMgKChpbnQgaSkpOwotCi0KLS8qIFNpbmdsZS1zdGVwIHNpbXVsYXRvciB3aXRoIHRyYWNpbmcgZW5hYmxlZC4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgVEhJUyBQUk9DRURVUkUgSVMgRVZFTiBNT1JFIERFUFJFQ0FURUQgVEhBTiBTSU1fU0VUX1RSQUNFCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIHJldHVybnM6IGBgMCcnIGluZGljYXRpbmcgdGhhdCB0aGUgc2ltdWxhdG9yIHNob3VsZAotICAgYmUgY29udGludWVkIHVzaW5nIHNpbV90cmFjZSgpIGNhbGxzOyBgYDEnJyBpbmRpY2F0aW5nIHRoYXQgdGhlCi0gICBzaW11bGF0aW9uIGhhcyBmaW5pc2hlZC4gKi8KLQotaW50IHNpbV90cmFjZSBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0KLS8qIEVuYWJsZSB0cmFjaW5nLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIHJldHVybnM6IGBgMCcnIGluZGljYXRpbmcgdGhhdCB0aGUgc2ltdWxhdG9yIHNob3VsZAotICAgYmUgY29udGludWVkIHVzaW5nIHNpbV90cmFjZSgpIGNhbGxzOyBgYDEnJyBpbmRpY2F0aW5nIHRoYXQgdGhlCi0gICBzaW11bGF0aW9uIGhhcyBmaW5pc2hlZC4gKi8KLQotdm9pZCBzaW1fc2V0X3RyYWNlIFBBUkFNUyAoKHZvaWQpKTsKLQotCi0vKiBDb25maWd1cmUgdGhlIHNpemUgb2YgdGhlIHByb2ZpbGUgYnVmZmVyLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLXZvaWQgc2ltX3NldF9wcm9maWxlX3NpemUgUEFSQU1TICgoaW50IG4pKTsKLQotCi0vKiBLaWxsIHRoZSBydW5uaW5nIHByb2dyYW0uCi0gICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KLSAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgotICAgVGhpcyBwcm9jZWR1cmUgd2lsbCBiZSByZXBsYWNlZCBhcyBwYXJ0IG9mIHRoZSBpbnRyb2R1Y3Rpb24gb2YKLSAgIG11bHRpLWNwdSBzaW11bGF0b3JzLiAqLwotCi12b2lkIHNpbV9raWxsIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhZGVmaW5lZCAoUkVNT1RFX1NJTV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaW0tZDEwdi5oIGIvaW5jbHVkZS9zaW0tZDEwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGVhYjJhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc2ltLWQxMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGQxMHYgc2ltdWxhdG9yIGFuZCBnZGIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChTSU1fRDEwVl9IKQotI2RlZmluZSBTSU1fRDEwVl9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IC8vIH0KLSNlbmRpZgotCi0vKiBHREIgaW50ZXJwcmV0cyBhZGRyZXNzZXMgYXM6Ci0KLSAgIDB4MDB4eHh4eHg6IFBoeXNpY2FsIHVuaWZpZWQgbWVtb3J5IHNlZ21lbnQgICAgIChVbmlmaWVkIG1lbW9yeSkKLSAgIDB4MDF4eHh4eHg6IFBoeXNpY2FsIGluc3RydWN0aW9uIG1lbW9yeSBzZWdtZW50IChPbi1jaGlwIGluc24gbWVtb3J5KQotICAgMHgwMnh4eHh4eDogUGh5c2ljYWwgZGF0YSBtZW1vcnkgc2VnbWVudCAgICAgICAgKE9uLWNoaXAgZGF0YSBtZW1vcnkpCi0gICAweDEweHh4eHh4OiBMb2dpY2FsIGRhdGEgYWRkcmVzcyBzZWdtZW50ICAgICAgICAoRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKLSAgIDB4MTF4eHh4eHg6IExvZ2ljYWwgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBzZWdtZW50IChJTUFQIHRyYW5zbGF0ZWQgbWVtb3J5KQotCi0gICBUaGUgcmVtb3RlIGQxMHYgYm9hcmQgaW50ZXJwcmV0cyBhZGRyZXNzZXMgYXM6Ci0KLSAgIDB4MDB4eHh4eHg6IFBoeXNpY2FsIHVuaWZpZWQgbWVtb3J5IHNlZ21lbnQgICAgIChVbmlmaWVkIG1lbW9yeSkKLSAgIDB4MDF4eHh4eHg6IFBoeXNpY2FsIGluc3RydWN0aW9uIG1lbW9yeSBzZWdtZW50IChPbi1jaGlwIGluc24gbWVtb3J5KQotICAgMHgwMnh4eHh4eDogUGh5c2ljYWwgZGF0YSBtZW1vcnkgc2VnbWVudCAgICAgICAgKE9uLWNoaXAgZGF0YSBtZW1vcnkpCi0KLSAgIFRoZSBmb2xsb3dpbmcgdHJhbnNsYXRlIGEgdmlydHVhbCBETUFQL0lNQVAgb2Zmc2V0IGludG8gYSBwaHlzaWNhbAotICAgbWVtb3J5IHNlZ21lbnQgYXNzaWduaW5nIHRoZSB0cmFuc2xhdGVkIGFkZHJlc3MgdG8gUEhZUy4gIFNpbmNlIGEKLSAgIG1lbW9yeSBhY2Nlc3MgbWF5IGNyb3NzIGEgcGFnZSBib3VuZHJhcnkgdGhlIG51bWJlciBvZiBieXRlcyBmb3IKLSAgIHdoaWNoIHRoZSB0cmFuc2xhdGlvbiBpcyBhcHBsaWNhYmxlIChvciAwIGZvciBhbiBpbnZhbGlkIHZpcnR1YWwKLSAgIG9mZnNldCkgaXMgcmV0dXJuZWQuICovCi0KLWVudW0KLSAgewotICAgIFNJTV9EMTBWX01FTU9SWV9VTklGSUVEID0gMHgwMDAwMDAwMCwKLSAgICBTSU1fRDEwVl9NRU1PUllfSU5TTiA9IDB4MDEwMDAwMDAsCi0gICAgU0lNX0QxMFZfTUVNT1JZX0RBVEEgPSAweDAyMDAwMDAwLAotICAgIFNJTV9EMTBWX01FTU9SWV9ETUFQID0gMHgxMDAwMDAwMCwKLSAgICBTSU1fRDEwVl9NRU1PUllfSU1BUCA9IDB4MTEwMDAwMDAKLSAgfTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2ltX2QxMHZfdHJhbnNsYXRlX2RtYXBfYWRkcgotICAodW5zaWduZWQgbG9uZyBvZmZzZXQsCi0gICBpbnQgbnJfYnl0ZXMsCi0gICB1bnNpZ25lZCBsb25nICpwaHlzLAotICAgdW5zaWduZWQgbG9uZyAoKmRtYXBfcmVnaXN0ZXIpIChpbnQgcmVnX25yKSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIHNpbV9kMTB2X3RyYW5zbGF0ZV9pbWFwX2FkZHIKLSAgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgaW50IG5yX2J5dGVzLAotICAgdW5zaWduZWQgbG9uZyAqcGh5cywKLSAgIHVuc2lnbmVkIGxvbmcgKCppbWFwX3JlZ2lzdGVyKSAoaW50IHJlZ19ucikpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzaW1fZDEwdl90cmFuc2xhdGVfYWRkcgotICAodW5zaWduZWQgbG9uZyB2YWRkciwKLSAgIGludCBucl9ieXRlcywKLSAgIHVuc2lnbmVkIGxvbmcgKnBoeXMsCi0gICB1bnNpZ25lZCBsb25nICgqZG1hcF9yZWdpc3RlcikgKGludCByZWdfbnIpLAotICAgdW5zaWduZWQgbG9uZyAoKmltYXBfcmVnaXN0ZXIpIChpbnQgcmVnX25yKSk7Ci0KLQotLyogVGhlIHNpbXVsYXRvciBtYWtlcyB1c2Ugb2YgdGhlIGZvbGxvd2luZyByZWdpc3RlciBpbmZvcm1hdGlvbi4gKi8KLQotZW51bQotICB7Ci0gICAgU0lNX0QxMFZfUjBfUkVHTlVNID0gMCwKLSAgICBTSU1fRDEwVl9DUjBfUkVHTlVNID0gMTYsCi0gICAgU0lNX0QxMFZfQTBfUkVHTlVNID0gMzIsCi0gICAgU0lNX0QxMFZfU1BJX1JFR05VTSA9IDM0LAotICAgIFNJTV9EMTBWX1NQVV9SRUdOVU0gPSAzNSwKLSAgICBTSU1fRDEwVl9JTUFQMF9SRUdOVU0gPSAzNiwKLSAgICBTSU1fRDEwVl9ETUFQMF9SRUdOVU0gPSAzOCwKLSAgICBTSU1fRDEwVl9UUzJfRE1BUF9SRUdOVU0gPSA0MAotICB9OwotCi1lbnVtCi0gIHsKLSAgICBTSU1fRDEwVl9OUl9SX1JFR1MgPSAxNiwKLSAgICBTSU1fRDEwVl9OUl9BX1JFR1MgPSAyLAotICAgIFNJTV9EMTBWX05SX0lNQVBfUkVHUyA9IDIsCi0gICAgU0lNX0QxMFZfTlJfRE1BUF9SRUdTID0gNCwKLSAgICBTSU1fRDEwVl9OUl9DUl9SRUdTID0gMTYKLSAgfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NwbGF5LXRyZWUuaCBiL2luY2x1ZGUvc3BsYXktdHJlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDcwYzhkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc3BsYXktdHJlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qIEEgc3BsYXktdHJlZSBkYXRhdHlwZS4gIAotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFyayBNaXRjaGVsbCAobWFya0BtYXJrbWl0Y2hlbGwuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgotICAgCi1HTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgYW4gZWFzaWx5IHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHNwbGF5LXRyZWVzLCBzZWU6Ci0KLSAgICAgTGV3aXMsIEhhcnJ5IFIuIGFuZCBEZW5lbmJlcmcsIExhcnJ5LiAgRGF0YSBTdHJ1Y3R1cmVzIGFuZCBUaGVpcgotICAgICBBbGdvcml0aG1zLiAgSGFycGVyLUNvbGxpbnMsIEluYy4gIDE5OTEuICAKLQotICAgVGhlIG1ham9yIGZlYXR1cmUgb2Ygc3BsYXkgdHJlZXMgaXMgdGhhdCBhbGwgYmFzaWMgdHJlZSBvcGVyYXRpb25zCi0gICBhcmUgYW1vcnRpemVkIE8obG9nIG4pIHRpbWUgZm9yIGEgdHJlZSB3aXRoIG4gbm9kZXMuICAqLwotCi0jaWZuZGVmIF9TUExBWV9UUkVFX0gKLSNkZWZpbmUgX1NQTEFZX1RSRUVfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBVc2UgdHlwZWRlZnMgZm9yIHRoZSBrZXkgYW5kIGRhdGEgdHlwZXMgdG8gZmFjaWxpdGF0ZSBjaGFuZ2luZwotICAgdGhlc2UgdHlwZXMsIGlmIG5lY2Vzc2FyeS4gIFRoZXNlIHR5cGVzIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgd2lkZQotICAgdGhhdCBhbnkgcG9pbnRlciBvciBzY2FsYXIgY2FuIGJlIGNhc3QgdG8gdGhlc2UgdHlwZXMsIGFuZCB0aGVuCi0gICBjYXN0IGJhY2ssIHdpdGhvdXQgbG9zcyBvZiBwcmVjaXNpb24uICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBzcGxheV90cmVlX2tleTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc3BsYXlfdHJlZV92YWx1ZTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgYSBub2RlIGluIHRoZSB0cmVlLiAgKi8KLXR5cGVkZWYgc3RydWN0IHNwbGF5X3RyZWVfbm9kZV9zICpzcGxheV90cmVlX25vZGU7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gd2hpY2ggY29tcGFyZXMgdHdvIHNwbGF5LXRyZWUga2V5cy4gIFRoZQotICAgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB2YWx1ZXMgYXMgZm9yIHFzb3J0LiAgKi8KLXR5cGVkZWYgaW50ICgqc3BsYXlfdHJlZV9jb21wYXJlX2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5LCBzcGxheV90cmVlX2tleSkpOwotCi0vKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVhbGxvY2F0ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQKLSAgIHdpdGggdGhlIGtleS4gICovCi10eXBlZGVmIHZvaWQgKCpzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9rZXkpKTsKLQotLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB1c2VkIHRvIGRlYWxsb2NhdGUgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkCi0gICB3aXRoIHRoZSB2YWx1ZS4gICovCi10eXBlZGVmIHZvaWQgKCpzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbikgUEFSQU1TKChzcGxheV90cmVlX3ZhbHVlKSk7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHRyZWUuICAqLwotdHlwZWRlZiBpbnQgKCpzcGxheV90cmVlX2ZvcmVhY2hfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9ub2RlLCB2b2lkKikpOwotCi0vKiBUaGUgbm9kZXMgaW4gdGhlIHNwbGF5IHRyZWUuICAqLwotc3RydWN0IHNwbGF5X3RyZWVfbm9kZV9zCi17Ci0gIC8qIFRoZSBrZXkuICAqLwotICBzcGxheV90cmVlX2tleSBrZXk7Ci0KLSAgLyogVGhlIHZhbHVlLiAgKi8KLSAgc3BsYXlfdHJlZV92YWx1ZSB2YWx1ZTsKLQotICAvKiBUaGUgbGVmdCBhbmQgcmlnaHQgY2hpbGRyZW4sIHJlc3BlY3RpdmVseS4gICovCi0gIHNwbGF5X3RyZWVfbm9kZSBsZWZ0OwotICBzcGxheV90cmVlX25vZGUgcmlnaHQ7Ci19OwotCi0vKiBUaGUgc3BsYXkgdHJlZSBpdHNlbGYuICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3BsYXlfdHJlZV9zCi17Ci0gIC8qIFRoZSByb290IG9mIHRoZSB0cmVlLiAgKi8KLSAgc3BsYXlfdHJlZV9ub2RlIHJvb3Q7Ci0KLSAgLyogVGhlIGNvbXBhcmlzaW9uIGZ1bmN0aW9uLiAgKi8KLSAgc3BsYXlfdHJlZV9jb21wYXJlX2ZuIGNvbXA7Ci0KLSAgLyogVGhlIGRlYWxsb2NhdGUta2V5IGZ1bmN0aW9uLiAgTlVMTCBpZiBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4gICovCi0gIHNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbiBkZWxldGVfa2V5OwotCi0gIC8qIFRoZSBkZWFsbG9jYXRlLXZhbHVlIGZ1bmN0aW9uLiAgTlVMTCBpZiBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4gICovCi0gIHNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuIGRlbGV0ZV92YWx1ZTsKLX0gKnNwbGF5X3RyZWU7Ci0KLWV4dGVybiBzcGxheV90cmVlIHNwbGF5X3RyZWVfbmV3ICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWVfY29tcGFyZV9mbiwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4sCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4pKTsKLWV4dGVybiB2b2lkIHNwbGF5X3RyZWVfZGVsZXRlICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUpKTsKLWV4dGVybiBzcGxheV90cmVlX25vZGUgc3BsYXlfdHJlZV9pbnNlcnQgICAgICAgICAgCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2tleSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX3ZhbHVlKSk7Ci1leHRlcm4gc3BsYXlfdHJlZV9ub2RlIHNwbGF5X3RyZWVfbG9va3VwICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfa2V5KSk7Ci1leHRlcm4gaW50IHNwbGF5X3RyZWVfZm9yZWFjaCAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfZm9yZWFjaF9mbiwKLQkJCQkJICAgICAgICB2b2lkKikpOwotZXh0ZXJuIGludCBzcGxheV90cmVlX2NvbXBhcmVfaW50cyAgICAgIFBBUkFNUygoc3BsYXlfdHJlZV9rZXksCi0JCQkJCQlzcGxheV90cmVlX2tleSkpOwotZXh0ZXJuIGludCBzcGxheV90cmVlX2NvbXBhcmVfcG9pbnRlcnMgIFBBUkFNUygoc3BsYXlfdHJlZV9rZXksCi0JCQkJCQlzcGxheV90cmVlX2tleSkpOwotCQkJCQkgICAgICAgCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX1NQTEFZX1RSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeW1jYXQuaCBiL2luY2x1ZGUvc3ltY2F0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjcxNjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zeW1jYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIFN5bWJvbCBjb25jYXRlbmF0aW9uIHV0aWxpdGllcy4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBTWU1fQ0FUX0gKLSNkZWZpbmUgU1lNX0NBVF9ICi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoQUxNT1NUX1NUREMpCi0jZGVmaW5lIENPTkNBVDIoYSxiKQkgYSMjYgotI2RlZmluZSBDT05DQVQzKGEsYixjKQkgYSMjYiMjYwotI2RlZmluZSBDT05DQVQ0KGEsYixjLGQpIGEjI2IjI2MjI2QKLSNkZWZpbmUgU1RSSU5HWChzKSAjcwotI2Vsc2UKLSNkZWZpbmUgQ09OQ0FUMihhLGIpCSBhLyoqL2IKLSNkZWZpbmUgQ09OQ0FUMyhhLGIsYykJIGEvKiovYi8qKi9jCi0jZGVmaW5lIENPTkNBVDQoYSxiLGMsZCkgYS8qKi9iLyoqL2MvKiovZAotI2RlZmluZSBTVFJJTkdYKHMpICJzIgotI2VuZGlmCi0KLSNkZWZpbmUgWENPTkNBVDIoYSxiKSAgICAgQ09OQ0FUMihhLGIpCi0jZGVmaW5lIFhDT05DQVQzKGEsYixjKSAgIENPTkNBVDMoYSxiLGMpCi0jZGVmaW5lIFhDT05DQVQ0KGEsYixjLGQpIENPTkNBVDQoYSxiLGMsZCkKLQotI2RlZmluZSBYU1RSSU5HKHMpIFNUUklOR1gocykgCi0KLSNlbmRpZiBTWU1fQ0FUX0gKZGlmZiAtLWdpdCBhL2luc3RhbGwtc2ggYi9pbnN0YWxsLXNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOWRlMjM4Li4wMDAwMDAwCi0tLSBhL2luc3RhbGwtc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQotIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCi0jCi0jIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5Ci0jCi0jIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAotIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQotIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLSMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50Ci0jIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0Ci0jIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KLSMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KLSMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCi0KLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9IiR7RE9JVFBST0ctfSIKLQotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotdHJhbnNmb3JtYmFzZW5hbWU9IiIKLXRyYW5zZm9ybV9hcmc9IiIKLWluc3RjbWQ9IiRtdnByb2ciCi1jaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgotY2hvd25jbWQ9IiIKLWNoZ3JwY21kPSIiCi1zdHJpcGNtZD0iIgotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLXNyYz0iIgotZHN0PSIiCi1kaXJfYXJnPSIiCi0KLXdoaWxlIFsgeCIkMSIgIT0geCBdOyBkbwotICAgIGNhc2UgJDEgaW4KLQktYykgaW5zdGNtZD0iJGNwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWQpIGRpcl9hcmc9dHJ1ZQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JKikgIGlmIFsgeCIkc3JjIiA9IHggXQotCSAgICB0aGVuCi0JCXNyYz0kMQotCSAgICBlbHNlCi0JCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZwotCQk6Ci0JCWRzdD0kMQotCSAgICBmaQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0gICAgZXNhYwotZG9uZQotCi1pZiBbIHgiJHNyYyIgPSB4IF0KLXRoZW4KLQllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKLQlleGl0IDEKLWVsc2UKLQl0cnVlCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgotCWRzdD0kc3JjCi0Jc3JjPSIiCi0JCi0JaWYgWyAtZCAkZHN0IF07IHRoZW4KLQkJaW5zdGNtZD06Ci0JCWNobW9kY21kPSIiCi0JZWxzZQotCQlpbnN0Y21kPW1rZGlyCi0JZmkKLWVsc2UKLQotIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0jIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkIAotIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCi0KLQlpZiBbIC1mICRzcmMgLW8gLWQgJHNyYyBdCi0JdGhlbgotCQl0cnVlCi0JZWxzZQotCQllY2hvICJpbnN0YWxsOiAgJHNyYyBkb2VzIG5vdCBleGlzdCIKLQkJZXhpdCAxCi0JZmkKLQkKLQlpZiBbIHgiJGRzdCIgPSB4IF0KLQl0aGVuCi0JCWVjaG8gImluc3RhbGw6CW5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKLQkJZXhpdCAxCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgaWYgeW91ciBzeXN0ZW0KLSMgZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQgc29tZSBsb2dpYwotCi0JaWYgWyAtZCAkZHN0IF0KLQl0aGVuCi0JCWRzdD0iJGRzdCIvYGJhc2VuYW1lICRzcmNgCi0JZWxzZQotCQl0cnVlCi0JZmkKLWZpCi0KLSMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAotZHN0ZGlyPWBlY2hvICRkc3QgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAotCi0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgotIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0Ci0KLSMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCi1pZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KLWRlZmF1bHRJRlM9JwkKLScKLUlGUz0iJHtJRlMtJHtkZWZhdWx0SUZTfX0iCi0KLW9JRlM9IiR7SUZTfSIKLSMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCi1JRlM9JyUnCi1zZXQgLSBgZWNobyAke2RzdGRpcn0gfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKLUlGUz0iJHtvSUZTfSIKLQotcGF0aGNvbXA9JycKLQotd2hpbGUgWyAkIyAtbmUgMCBdIDsgZG8KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0kezF9IgotCXNoaWZ0Ci0KLQlpZiBbICEgLWQgIiR7cGF0aGNvbXB9IiBdIDsKLSAgICAgICAgdGhlbgotCQkkbWtkaXJwcm9nICIke3BhdGhjb21wfSIKLQllbHNlCi0JCXRydWUKLQlmaQotCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKLWRvbmUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdCi10aGVuCi0JJGRvaXQgJGluc3RjbWQgJGRzdCAmJgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaQotZWxzZQotCi0jIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KLQotCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8IAotCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCi0JZmkKLQotIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCi0KLQlpZiBbIHgiJGRzdGZpbGUiID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIE1ha2UgYSB0ZW1wIGZpbGUgbmFtZSBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KLQotCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIwotCi0jIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKLQotCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgotCi0JdHJhcCAicm0gLWYgJHtkc3R0bXB9IiAwICYmCi0KLSMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cwotCi0jIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCi0jIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKLSMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCi0jIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0KLQkkZG9pdCAkcm1jbWQgLWYgJGRzdGRpci8kZHN0ZmlsZSAmJgotCSRkb2l0ICRtdmNtZCAkZHN0dG1wICRkc3RkaXIvJGRzdGZpbGUgCi0KLWZpICYmCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9sZC9DaGFuZ2VMb2cgYi9sZC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTM3ZjYuLjAwMDAwMDAKLS0tIGEvbGQvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsOTk1MSArMCwwIEBACi0yMDAwLTAzLTI3ICBEZW5pcyBDaGVydHlrb3YgIDxkZW5pc2NAb3ZlcnRhLnJ1PgotCi0JKiBjb25maWd1cmUudGd0IChhdnItKi0qKTogTmV3IHRhcmdldCBzdXBwb3J0LgotCSogTWFrZWZpbGUuYW06IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmMzJhdnIuc2M6IE5ldyBzY3JpcHQgZmlsZS4KLQkqIGVtdWxwYXJhbXMvYXZyMTIwMC5zaDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2F2cjIzeHguc2g6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9hdnI0NDMzLnNoIE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9hdnI0NHg0LnNoIE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9hdnI4NXh4LnNoIE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9hdnJtZWdhMTAzLnNoIE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9hdnJtZWdhMTYxLnNoIE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9hdnJtZWdhNjAzLnNoIE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLTIwMDAtMDMtMDkgIEFuZHJlYXMgSmFlZ2VyICA8YWpAc3VzZS5kZT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrLURFSkFHTlUpOiBBbHNvIHVuc2V0IExBTkcuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMjAwMC0wMy0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkZmlsZS5jIChsZGZpbGVfdHJ5X29wZW5fYmZkKTogRG9uJ3QgY3Jhc2ggaWYgd2Ugc2VlIGFuIGVtcHR5Ci0JYXJjaGl2ZS4KLQotMjAwMC0wMy0wMiAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBlbXVscGFyYW1zL2VsZjMybWNvcmUuc2g6IEluY2x1ZGUgImdldG9wdC5oIi4KLQotMjAwMC0wMy0wMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IFJlbW92ZSAqLSotYW91dCwgKi0qLWNvZmYsIGFuZCAqLSotbmV0d2FyZS4KLQotMjAwMC0wMy0wMSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBlbXVscGFyYW1zL21pcHNwZS5zaDogQWRkIFNVQlNZU1RFTSBhbmQgSU5JVElBTF9TWU1CT0xfQ0hBUi4KLQkqIGVtdWxwYXJhbXMvc2hwZS5zaDogTGlrZXdpc2UuCi0KLTIwMDAtMDMtMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBhbmQgYWRkIEFUVFJJQlVURV9VTlVTRUQKLQl0byB1bnVzZWQgcGFyYW1ldGVycy4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBBZGQgIiNpZmRlZiBETExfU1VQUE9SVCIgYXJvdW5kIHN0YXRpYwotCWZ1bmN0aW9ucyBvbmx5IHVzZWQgYnkgRExMIGNvZGUuCi0JKF9wbGFjZV9vcnBoYW4pOiBJbml0aWFsaXNlICdkb2xsYXInLgotCi0yMDAwLTAzLTAxICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxkbWFpbi5jICh1bmRlZmluZWRfc3ltYm9sKTogVGFrZSBvbmUgbW9yZSBhcmcsIGZhdGFsLCB0bwotCWluZGljYXRlIGlmIHRoZSB1bmRlZmluZWQgc3ltYm9sIGlzIGEgZmF0YWwgZXJyb3Igb3Igbm90LgotCURvbid0IGRlbGV0ZSB0aGUgb3V0cHV0IGZpbGUgaWYgImZhdGFsIiBpcyBmYWxzZS4KLQotMjAwMC0wMi0yOSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2stREVKQUdOVSk6IEFsc28gcGFzcyBMSUJTPSIkKExJQlMpIi4gCi0JU2V0IExDX0NPTExBVEUgYW5kIExDX0FMTCB0byBudWxsIGFuZCBleHBvcnQgdGhlbS4gSXQgaXMgZm9yCi0Jc29ydCB3aGljaCBleHBlY3RzIHRoZSBDIGxvY2FsZS4KLQlBZGQgJChMSUJTKSB0byBhbGwgJChIT1NUSU5HX0xJQlMpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTIwMDAtMDItMjkgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZW11bHRlbXBsL3thaXguZW0sIGFybWNvZmYuZW0sIGFybWVsZi5lbSwgYXJtZWxmX29hYmkuZW0sCi0JYmVvcy5lbSwgZWxmMzIuZW0sIGdlbmVyaWMuZW0sIGdsZDk2MC5lbSwgZ2xkOTYwYy5lbSwgaHBwYWVsZi5lbSwKLQlsaW51eC5lbSwgbG5rOTYwLmVtLCBtaXBzZWNvZmYuZW0sIHN1bm9zLmVtLCB2YW5pbGxhLmVtfQotCShsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgbWlzc2luZyBOVUxMIGluaXRpYWxpc2VyIGZvcgotCWZpbmRfcG90ZW50aWFsX2xpYnJhcmllcy4KLQotMjAwMC0wMi0yOCAgSmltIEJsYW5keSAgPGppbWJAcmVkaGF0LmNvbT4KLQotCSogbGRncmFtLnkgKGV4Y2x1ZGVfbmFtZV9saXN0KTogRG9uJ3QgcmVxdWlyZSBhIGNvbW1hIHRvIHNlcGFyYXRlCi0gCWxpc3QgZW50cmllczsgdGhlIGxleGVyIGNvbnNpZGVycyBjb21tYXMgdG8gYmUgdmFsaWQgcGFydCBvZiBhCi0JZmlsZW5hbWUsIHNvIGluIHNvbWV0aGluZyBsaWtlIGBmb28sIGJhcicgdGhlIGNvbW1hIGlzIGNvbnNpZGVyZWQKLQlwYXJ0IG9mIHRoZSBmaXJzdCBmaWxlbmFtZSwgYGZvbywnLgotCSogbGQudGV4aW5mbzogVXBkYXRlIHNlY3Rpb24gb24gRVhDTFVERV9GSUxFIGxpc3RzLgotCi0yMDAwLTAyLTI3ICBMb3JlbiBKLiBSaXR0bGUgIDxsanJpdHRsZUBhY20ub3JnPgotCi0JKiBjb25maWd1cmUuaG9zdDogQWRkZWQgSE9TVElOR19DUlQwLCBIT1NUSU5HX0xJQlMgZm9yCi0JaG9zdCAiaVszNDU2XTg2LSotZnJlZWJzZGVsZioiLgotCi0yMDAwLTAyLTI3ICBNYXJrIEVsYnJlY2h0ICA8c25vd2JhbGwzQGJpZ2Zvb3QuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYzogTW92ZSBtaXNwbGFjZWQgc2VtaWNvbG9ucy4KLQotMjAwMC0wMi0yNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IFJlbW92ZSBlaHBwYWVsZi5vLgotCShBTExfNjRfRU1VTEFUSU9OUyk6IFJlbW92ZSBlZWxmNjRocHBhLm8uCi0JKGVlbGY2NGhwcGEuYywgZWhwcGFlbGYuYyk6IFJlbW92ZSB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTIwMDAtMDItMjUgIEFsZXhhbmRyZSBPbGl2YSAgPG9saXZhQGxzZC5pYy51bmljYW1wLmJyPgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX29maWxlcyk6IEVuYWJsZSBlbGY2NF9zcGFyYyBvbgotCUdOVS9MaW51eC9zcGFyYywgYnV0IGtlZXAgdGhlIGRlZmF1bHQgYXMgMzIuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEVuYWJsZSBlbGY2NF9zcGFyYyBvbiBTb2xhcmlzNysvc3BhcmMuICBBbmQgbWFrZQotCWl0IGRlZmF1bHQgaWYgc3BhcmN2OSBvciBzcGFyYzY0LgotCi0yMDAwLTAyLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIHJ1bGVzIHRvIGJ1aWxkIGVtaXBzcGUubyBhbmQgZWFybXBlLm8uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCB0YXJnZXRzIGZvciBhcm0td2luY2UsIHNoLXBlIGFuZCBtaXBzLXBlLgotCi0JKiBsZGVtdWwuaCAobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIG5ldyBmaWVsZDoKLQlmaW5kX3BvdGVudGlhbF9saWJyYXJpZXMuCi0JKiBsZGVtdWwuYyAobGRlbXVsX2ZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyk6IE5ldyBmdW5jdGlvbi4KLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogQWxsb3cgZnVuY3Rpb24gdG8gYmUKLQlleHBvcnRlZC4gCi0JKGxkZmlsZV9vcGVuX2ZpbGUpOiBDYWxsIGxkZW11bF9maW5kX3BvdGVudGlhbF9saWJyYXJpZXMuCi0JKiBsZGZpbGUuaDogQWRkIHByb3RvdHlwZSBmb3IgbGRmaWxlX29wZW5fZmlsZV9zZWFyY2guCi0KLQkqIHBlLWRsbC5jOiBBZGQgc3VwcG9ydCBmb3IgQVJNLCBNSVBTIGFuZCBTSCB0YXJnZXRzLgotCi0JKiBlbXVscGFyYW1zL21pcHNwZS5zaDogTmV3IGZpbGUuICBQYXJhbWV0ZXJzIGZvciBtaXBzLXBlIHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvc2hwZS5zaDogTmV3IGZpbGUuICBQYXJhbWV0ZXJzIGZvciBzaC1wZSB0YXJnZXQuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogQWRkIHN1cHBvcnQgZm9yIEFSTSwgTUlQUyBhbmQgU0ggRExMcy4KLQkoZ2xkX1hfZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzKTogTmV3IGZ1bmN0aW9uLiAgU2VhcmNoIGZvcgotCWxpYnJhcmllcyBjYWxsZWQgIioubGliIi4KLQotCSogc2NyaXB0ZW1wbC9wZS5zYzogQWRkIC5wZGF0YSBzZWN0aW9uLgotCi0yMDAwLTAyLTIzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBSZW1vdmUgZHluYW1pYyBsaW5raW5nIGhvb2tzLgotCUFkZCBhbmQgdXNlIG1lbW9yeSByZWdpb25zLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIChsaW5hc0BsaW5hcy5vcmcpCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJpMzcwLnNoLCBzY3JpcHR0ZW1wbC9lbGZpMzcwLnNjOiBOZXcuCi0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTGludXgvSUJNIDM3MC4KLQkqIGNvbmZpZ3VyZS50Z3Q6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotMjAwMC0wMi0yMSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBsZGxhbmcuYyAocHJpbnRfaW5wdXRfc2VjdGlvbiwgcHJpbnRfZGF0YV9zdGF0ZW1lbnQsCi0JcHJpbnRfcmVsb2Nfc3RhdGVtZW50LCBwcmludF9wYWRkaW5nX3N0YXRlbWVudCwgaW5zZXJ0X3BhZCwKLQlzaXplX2lucHV0X3NlY3Rpb24sIGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMsCi0JbGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2RvX2Fzc2lnbm1lbnRzLCBsYW5nX3NldF9zdGFydG9mLAotCWxhbmdfb25lX2NvbW1vbik6IENoYW5nZSBgb3BiJyB0byB1bnNpZ25lZC4gCi0JKGxhbmdfZG9fYXNzaWdubWVudHMpOiBBbHNvIGNoYW5nZSBgc2l6ZScgdG8gdW5zaWduZWQuCi0KLTIwMDAtMDItMTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUGxhY2UgT1RIRVJfUExUX1JFTE9DX1NFQ1RJT04uCi0KLTIwMDAtMDItMTYgIFRpbW90aHkgV2FsbCAgPHR3YWxsQGN5Z251cy5jb20+Ci0KLQkqIG1yaS5jIChtcmlfZHJhd190cmVlKTogQWRkIGRlZmF1bHQgTE1BIHJlZ2lvbiBhcmd1bWVudCB0byBjYWxsCi0JdG8gbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuCi0JKiBsZGxhbmcuaDogVXBkYXRlIHByb3RvdHlwZXMgd2l0aCBMTUEgcmVnaW9uIGFyZ3VtZW50cy4KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBFbmNhcHN1bGF0ZSByZWdpb24gYm91bmRzCi0JY2hlY2tpbmcgaW4gb3NfY2hlY2tfcmVnaW9uIGNhbGwuCi0JKG9zX2NoZWNrX3JlZ2lvbik6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogSW5pdGlhbGl6ZSBsbWFfcmVnaW9uLgotCShsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IEFkZCBMTUEgcmVnaW9uIGFyZ3VtZW50LgotCShsYW5nX2xlYXZlX292ZXJsYXkpOiBEaXR0by4KLQkqIGxkZ3JhbS55OiBIYW5kbGUgTE1BIHJlZ2lvbiBzeW50YXguCi0JKiBsZC50ZXhpbmZvIChPdXRwdXQgU2VjdGlvbiBEZXNjcmlwdGlvbik6IERlc2NyaWJlIExNQSByZWdpb24gdXNhZ2UuCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtIChnbGQkcGxhY2Vfb3JwaGFuKTogQWRkIGRlZmF1bHQgdmFsdWUgZm9yCi0JbG1hIHJlZ2lvbiBpbiBjYWxsIHRvIGxhbmdfbGVhdmVfb3V0cHV0X3N0YXRlbWVudC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHBsYWNlX29ycGhhbik6IEFkZCBkZWZhdWx0IHZhbHVlIGZvcgotCWxtYSByZWdpb24gaW4gY2FsbCB0byBsYW5nX2xlYXZlX291dHB1dF9zdGF0ZW1lbnQuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZCRwbGFjZV9vcnBoYW4pOiBBZGQgZGVmYXVsdCB2YWx1ZSBmb3IKLQlsbWEgcmVnaW9uIGluIGNhbGwgdG8gbGFuZ19sZWF2ZV9vdXRwdXRfc3RhdGVtZW50LgotCQotCQotMjAwMC0wMi0wNCAgVGltb3RoeSBXYWxsICA8dHdhbGxAcmVkaGF0LmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMpOiBVc2UgYnl0ZXMgaW5zdGVhZCBvZgotCW9jdGV0cyB3aGVuIGNhbGN1bGF0aW5nIHNlY3Rpb24gZW5kIGFkZHJlc3Nlcy4KLQotMjAwMC0wMi0wNCAgVGltb3RoeSBXYWxsICA8dHdhbGxAcmVkaGF0LmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEZpeCB0eXBvIGluIEFMSUdOX04gaW52b2NhdGlvbi4KLQotMjAwMC0wMi0wMyAgVGltb3RoeSBXYWxsIDx0d2FsbEByZWRoYXQuY29tPgotCi0JKiBsZC9sZGV4cC5jIChmb2xkX25hbWUpOiBNYWtlIFNJWkVPRiBvcGVyYXRvciByZXR1cm4gYnl0ZSBjb3VudCwgbm90Ci0Jb2N0ZXQgY291bnQuCi0JKiBsZC9sZGxhbmcuYyAocHJpbnRfaW5wdXRfc2VjdGlvbiwgcHJpbnRfZGF0YV9zdGF0ZW1lbnQsCi0JcHJpbnRfcmVsb2Nfc3RhdGVtZW50LCBwcmludF9wYWRkaW5nX3N0YXRlbWVudCk6IFByaW50IHRhcmdldAotCWFkZHJlc3MgdmFsdWVzIGFuZCBzZWN0aW9uIHNpemVzIGFzIGJ5dGVzLCBub3Qgb2N0ZXRzLgotCShpbnNlcnRfcGFkKSBDYWxjdWxhdGUgcGFkZGluZyBzaXplIGluIG9jdGV0cywgYW5kIGFkanVzdCAiZG90IgotCWJ5IGJ5dGVzLgotCShzaXplX2lucHV0X3NlY3Rpb24pIEFsd2F5cyBhZGp1c3QgImRvdCIgYnkgYnl0ZXMsIG5vdCBvY3RldHMuCi0JKGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMsIGxhbmdfZG9fYXNzaWdubWVudHMpIEFkanVzdAotCSJkb3QiIGJ5IGJ5dGVzLCBub3Qgb2N0ZXRzLiAgVXNlIHRoZSBsYXJnZXIgb2YgdGhlIGRpcmVjdGl2ZSBzaXplCi0Jb3Igb2N0ZXRzX3Blcl9ieXRlIGZvciB0aGUgbnVtYmVyIG9mIG9jdGV0cyBhY3R1YWxseSBhbGxvY2F0ZWQgaW4KLQl0aGUgb3V0cHV0IHNlY3Rpb24uCi0JKGxhbmdfc2V0X3N0YXJ0b2YpIE1ha2Ugc3VyZSBTVEFSVE9GIHJldHVybnMgYSB0YXJnZXQgYWRkcmVzcy4KLQkobGFuZ19vbmVfY29tbW9uKSBSZWNvcmQgc2l6ZSBjaGFuZ2VzIGluIG9jdGV0cy4KLQkobGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZikgU2VjdGlvbiBlbmQgc3ltYm9sJ3MgdmFsdWUgaXMKLQlyZWNvcmRlZCBpbiB0YXJnZXQgYnl0ZXMuCi0JKiBsZC50ZXhpbmZvOiAgIFVwZGF0ZWQgZGVzY3JpcHRpb24gb2YgQllURSwgU0hPUlQsIExPTkcsIGV0Yy4KLQl0byBiZSBjbGVhciBhYm91dCBiZWhhdmlvciB3aGVuIGFuIG9jdGV0IGlzIHNtYWxsZXIgdGhhbiBvbmUgYnl0ZS4KLQkKLTIwMDAtMDEtMjcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogbGRjcmVmLmMgKG91dHB1dF9jcmVmKTogRG9uJ3QgcGFzcyBtZXNzYWdlIHN0cmluZ3MgdG8gcHJpbnRmCi0JYXMgZm9ybWF0IGFyZy4KLQlVcGRhdGUgY29weXJpZ2h0LgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogU2FtZSBoZXJlLgotCVVwZGF0ZSBjb3B5cmlnaHQuCi0KLTIwMDAtMDEtMjMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZW11bHRlbXBsL3thcm1jb2ZmLmVtLGFybWVsZi5lbSxhcm1lbGZfb2FiaS5lbSxiZW9zLmVtLAotCWdlbmVyaWMuZW0sZ2xkOTYwLmVtLGdsZDk2MGMuZW0saHBwYWVsZi5lbSxsaW51eC5lbSxsbms5NjAuZW0sCi0JbWlwc2Vjb2ZmLmVtLHN1bm9zLmVtLHZhbmlsbGEuZW19IChsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOgotCUFkZCBtaXNzaW5nIE5VTEwgaW5pdGlhbGlzZXJzLCBhbmQgY29tbWVudHMuCi0KLQkqIHRlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYyAoX19yZXRocm93KTogTmV3LgotCi0yMDAwLTAxLTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogRml4IHR5cG8gaW4gY29tbWVudC4KLQotMjAwMC0wMS0xOCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQWxzbyB1cGRhdGUgdGhlIGN1cnJlbnQKLQlhZGRyZXNzIG9mIGEgcmVnaW9uIGlmIHRoZSBTRUNfTkVWRVJfTE9BRCBiaXQgaXMgbm90IHNldC4KLQotMjAwMC0wMS0xMCAgUGhpbGlwIEJsdW5kZWxsICA8cGJAZnV0dXJldHYuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChhcm0qLSotY29uaXgqKTogTmV3IHRhcmdldC4KLQotMjAwMC0wMS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IFJlbWluZCB1c2VycyB0byBwcmVjZWVkIGxpbmtlciBjb21tYW5kCi0JbGluZSBzd2l0Y2hlcyB3aXRoIC1XbCwgKG9yIHdoYXRldmVyIGlzIGFwcHJvcHJpYXRlKSBpZiBpdCBpcwotCWJlaW5nIGludm9rZWQgYnkgYSBjb21ucGlsZXIgZHJpdmVyIHByb2dyYW0uCi0JRml4IGRlc2NyaXB0aW9uIG9mIHRoZSBiZWhhdmlvdXIgb2YgdGhlIC1uIGNvbW1hbmQgbGluZSBzd2l0Y2guIAotCi1XZWQgSmFuICA1IDA4OjAyOjEyIDIwMDAgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBsZC5oICh3aWxkY2FyZF9zcGVjKTogIENoYW5nZSBleGNsdWRlX25hbWUgdG8gZXhjbHVkZV9uYW1lX2xpc3QuCi0JKG5hbWVfbGlzdCk6IE5ldy4KLQkqIGxkLnRleGluZm8gKEVYQ0xVREVfRklMRSk6IFVwZGF0ZSBkb2N1bWVudGF0aW9uLgotCSogbGRncmFtLnkgKHdpbGRjYXJkX3NwZWMpOiBTdXBwb3J0IGEgbGlzdCBvZiBleGNsdWRlZF9maWxlcy4KLQkoZXhjbHVkZV9uYW1lX2xpc3QpOiBOZXcuCi0JbGRsYW5nLmMgKHdhbGtfd2lsZF9zZWN0aW9uKTogU3VwcG9ydCBsaXN0IG9mIGV4Y2x1ZGVkIGZpbGVzLgotCShwcmludF93aWxkX3N0YXRlbWVudCk6IExpa2V3aXNlLgotCShsYW5nX2FkZF93aWxkKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuaCAobGFuZ193aWxkX3N0YXRlbWVudF90eXBlKTogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKE9USEVSX0VYQ0xVREVfRklMRVMpOiBTdXBwb3J0LgotCQotMjAwMC0wMS0wNCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIHBlLWRsbC5jIChwZV9kbGxfd2Fybl9kdXBfZXhwb3J0cyk6IE5ldyB2YXJpYWJsZS4KLQkocHJvY2Vzc19kZWZfZmlsZSk6IFVzZS4KLQkocGVfZGxsX2NvbXBhdF9pbXBsaWIpOiBOZXcgdmFyaWFibGUuCi0JKG1ha2Vfb25lKTogVXNlLgotCQotCSogcGUtZGxsLmg6IEFkZCBleHBvcnRzIG9mIHBlX2RsbF93YXJuX2R1cF9leHBvcnRzIGFuZAotCXBlX2RsbF9jb21wYXRfaW1wbGliLgotCQotCSogZW11bHRlbXBsL3BlLmVtIChsb25nb3B0cyk6IEFkZCB3YXJuLWR1cGxpY2F0ZS1leHBvcnRzIGFuZCAKLQljb21wYXQtaW1wbGliIG9wdGlvbnMuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMpOiBMaXN0IG5ldyBvcHRpb25zLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEhhbmRsZS4KLQotCSogcGUtZGxsLmMgKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBVc2UgdGhlIGNvcnJlY3QgbmFtZSBmb3Igb3V0cHV0IAotCWRsbC4KLQkKLSAgICAgICAgKiBkZWZmaWxlcC55IChvcHRfbmFtZSk6IEFsbG93ICIuIiBpbiBuYW1lLgotCi0xOTk5LTEyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogRml4IGFybS1lcG9jLXBlIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCQotCSogZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaCAoU0NSSVBUX05BTUUpOiBTZXQgdG8gZXBvY3BlLgotCi0JKiBzY3JpcHR0ZW1wbC9lcG9jcGUuc2M6IE5ldyBmaWxlOiBjb3B5IG9mIHBlLnNjLCBjdXN0b21pc2VkIGZvcgotCUVQT0MgYnkgcGxhY2luZyAucmRhdGEgaW50byAudGV4dC4KLQotMTk5OS0xMS0yNiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogY29uZmlndXJlLmluOiBQdXQgQUNfTVNHX0NIRUNLSU5HL0FDX01TR19SRVNVTFQgYXJvdW5kIGNoZWNrIGZvcgotCVNUUklOR0lGWS4gIFVzZSB5ZXMvbm8gaW5zdGVhZCBvZiB0cnVlL2ZhbHNlIGFzIHZhbHVlIGZvciBjYWNoZQotCXZhcmlhYmxlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTExLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoSUdOT1JFX1NFQ1RJT04pOiBTZWN0aW9uIG11c3QgaGF2ZSBib3RoIEFMTE9DIGFuZCBMT0FECi0JYXR0cmlidXRlcyBpbiBvcmRlciB0byBiZSBjaGVja2VkLgotCi0xOTk5LTExLTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3Nlcyk6IEZpeCB0ZXN0IHRvIGRldGVybWluZQotCWlmIGEgc2VjdGlvbiBzaG91bGQgYmUgdGVzdGVkLgotCShJR05PUkVfU0VDVElPTik6IE5ldyBtYWNyby4KLQotV2VkIE5vdiAgMyAyMzozMToxOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgotCUNsZWFuIHVwIGNvZGUgdG8gdXNlIEVYVFJBX1NITElCX0VYVEVOU0lPTi4KLQotMTk5OS0xMS0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIChPVVRQVVRfRk9STUFUKTogQ2hhbmdlIHRvIGxpdHRsZSBlbmRpYW4uCi0JKiBlbXVscGFyYW1zL21jb3JlcGUuc2ggKE9VVFBVVF9GT1JNQVQpOiBDaGFuZ2UgdG8gbGl0dGxlIGVuZGlhbi4KLQotMTk5OS0xMS0wMSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcG9ib3guY29tPgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IFJld29yayB0byB1c2UgaGFzaCB0YWJsZS4KLQkoYWxyZWFkeV9saW5rZWRfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoYWxyZWFkeV9saW5rZWRfdGFibGVfaW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoYWxyZWFkeV9saW5rZWRfdGFibGVfZnJlZSk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19wcm9jZXNzKTogSW5pdGlhbGl6ZSBhbmQgZnJlZSB0aGUgYWxyZWFkeV9saW5rZWQgaGFzaCB0YWJsZS4KLQotMTk5OS0xMC0yNyAgQW5kcmVhcyBKYWVnZXIgIDxhakBzdXNlLmRlPgotCi0JKiBsZC9jb25maWd1cmUuaG9zdDogQWRkZWQgSE9TVElOR19DUlQwLCBIT1NUSU5HX0xJQlMgZm9yIAotCXRhcmdldCAibWlwcyotKi1saW51eC1nbnUqIi4KLQotMTk5OS0xMC0yNyAgU2NvdHQgQmFtYnJvdWdoICA8c2NvdHRiQG5ldHdpbmRlci5vcmc+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW06IEluY2x1ZGUgY3R5cGUuaCB0byBwcmV2ZW50IGNvbXBpbGUgdGltZQotCXdhcm5pbmdzLiAKLQotMTk5OS0xMC0yNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FybWNvZmYuZW0gKGdsZHt9X2ZpbmlzaCk6IFJlbW92ZSBleHRyYW5lb3VzCi0JdW5kZXJzY29yZSBmcm9tIHByb3RvdHlwZS4KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW0gKGdsZHt9X2ZpbmlzaCk6IFJlbW92ZSBleHRyYW5lb3VzCi0JdW5kZXJzY29yZSBmcm9tIHByb3RvdHlwZS4KLQotMTk5OS0xMC0wNyAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKC5yZWwuc2RhdGEpOiBDb21iaW5lIGFsbCB0aGUgc2RhdGEgcmVsb2NzCi0JYmVpbmcgLnJlbC5zZGF0YSwgLnJlbC5zZGF0YS4qLCAucmVsLmdudS5saW5rb25jZS5zKi4KLQkoLnJlbGEuc2RhdGEpOiBMaWtld2lzZSBmb3IgLnJlbGEuc2RhdGEuKiBhbmQgLnJlbGEuZ251LmxpbmtvbmNlLnMqLgotCSgucmVsLnNic3MpOiBNYWtlIGxpa2UgLnJlbC5ic3MuCi0JKC5yZWxhLnNic3MpOiBNYWtlIGxpa2UgLnJlbC5ic3MuCi0JKC5zZGF0YSk6IERvbid0IGluY2x1ZGUgLmdudS5saW5rb25jZS5zLiogb3IgLnNkYXRhLiogd2hlbgotCWxkIC1yLgotCSguc2Jzcyk6IERvIHRoZSBzYW1lIHRoaW5ncyBhcyBmb3IgLmJzczogaW5jbHVkZSBTREFUQV9TVEFSVF9TWU1CT0xTLAotCS5keW5zYnNzLgotCi0xOTk5LTA5LTI5ICBBbmRyZXcgSGFsZXkgIDxhcGhAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogRGVmZXIKLQltZXJnaW5nIHNlY3Rpb25zIHdoZW4gbm90IHJlbG9jYXRpbmcuCi0KLTE5OTktMDktMjggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBwZS1kbGwuYyAocHJvY2Vzc19kZWZfZmlsZSk6IE1vdmUgdGhlIG9mZnNldCBsb29rdXAgZnJvbSBoZXJlIHRvCi0JKGZpbGxfZXhwb3J0ZWRfb2Zmc2V0cyk6IGhlcmUuIE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpbGxfZWRhdGEpOiBVc2UuCi0JCi0xOTk5LTA5LTI4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogZGVmZmlsZXAueSAodG9rZW5zKTogQWRkIHVwcGVyIGFuZCBsb3dlciBjYXNlIHZlcnNpb25zIG9mIERBVEEsCi0JQ09OU1RBTlQsIE5PTkFNRSBhbmQgUFJJVkFURSB0b2tlbnMuCi0JKGNvbW1hbmQpOiBVc2UgREFUQVUuCi0JKGV4cGxpbmUpOiBBbGxvdyBmb3IgZHJlY3R2ZSBzeW50YXggYXMgd2VsbC4KLQkoZXhwX29wdF9saXN0KTogTGlrZXdpc2UuCi0JKGV4cF9vcHQpOiBMaWtld2lzZS4KLQkqIHBlLWRsbC5jIChtYWtlX29uZSk6IE9ubHkgZ2VuZXJhdGUgdGhlIGlkYXRhIGVudHJpZXMgZm9yIGRhdGEKLQlzeW1ib2xzLgotCi0xOTk5LTA5LTI4ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoLnNkYXRhKTogSW5jbHVkZSAuZ251LmxpbmtvbmNlLnMuKiBzZWN0aW9ucwotCWluIC5zZGF0YSB0b28uCi0KLTE5OTktMDktMjYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoLmJzcyk6IEFjY2VwdCBzZWN0aW9ucyBuYW1lZCAuYnNzLioKLQkoLnNic3MpOiBBY2NlcHQgc2VjdGlvbnMgbmFtZXMgLnNic3MuKgotCi0xOTk5LTA5LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIGVhcm1fZXBvY19wZS5jIGJ1aWxkIHRhcmdldC4gCi0KLVNhdCBTZXAgMTggMDc6NTc6MTAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChPVEhFUl9SRUFET05MWV9TWU1CT0xTKTogUmVtb3ZlICIuc3R1YnMiLAotCXRoZXkndmUgYmVlbiByZW5hbWVkIHRvICIuc3R1YiIsIHdoaWNoIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseQotCWJ5IGVsZi5zYy4KLQotRnJpIFNlcCAxNyAxMTowMDozMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKFRFWFRfU1RBUlRfU1lNQk9MUyk6IEtpbGwgY29tcGxldGVseS4KLQkoREFUQV9TVEFSVF9TWU1CT0xTKTogS2lsbCBfX2hwX2xvYWRfbWFwIGRlZmluaXRpb24KLQotVGh1IFNlcCAxNiAxMDo1OTo1NiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgotCVVzZSB0aGUgc2FtZSBmaWxlbmFtZSBleHRlbnNpb24gZm9yIHRoZSBiZmRfZWxmX2R0X25lZWRlZF9uYW1lIGNhbGwKLQlhcyB3ZSBkaWQgZm9yIGZpbmRpbmcgdGhlIGxpYnJhcnkuCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKERBVEFfU1RBUlRfU1lNQk9MUyk6IERlZmluZS4KLQkoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogTm8gbG9uZ2VyIGRlZmluZSBfX2hwX2xvYWRfbWFwLgotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChURVhUX1NUQVJUX1NZTUJPTFMpOiBEZWZpbmUuCi0KLVdlZCBTZXAgMTUgMDI6NDc6NDMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChTSExJQl9URVhUX1NUQVJUX0FERFIpOiBEZWZpbmUuCi0JKFNITElCX0RBVEFfQUREUik6IExpa2V3aXNlLgotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChURVhUX0RZTkFNSUMpOiBEZWZpbmUuCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuaCAoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogIE5vIGxvbmdlciBjb21iaW5lCi0JdGhlIC5wbHQsIC5kbHQsIC5vcGQgIGludG8gYSBzaW5nbGUgb3V0cHV0IHNlY3Rpb24uICBQcm92aWRlIHZhbHVlcwotCWZvciBfX2dwIGFuZCBfX2hwX2xvYWRfbWFwLgotCi0xOTk5LTA5LTE0ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChDYW5vbmljYWxpemF0aW9uIG9mIHRhcmdldCBuYW1lcyk6IFJlbW92ZSBhZGRpbmcKLQkke0NPTkZJR19TSEVMTH0gaW4gZnJvbnQgb2YgJGFjX2NvbmZpZ19zdWIsIHNpbmNlIGF1dG9jb25maWcgMi4xNAotCWdlbmVyYXRlcyAkYWNfY29uZmlnX3N1YiB3aXRoIGEgJHtDT05GSUdfU0hFTEx9IGFscmVhZHkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDktMTQgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogYWxsb3cgZm9yIAotCXRlcm1pbmF0aW5nIG51bGwuCi0KLTE5OTktMDktMTQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBFWFRSQV9TSExJQl9FWFRFTlNJT04gdG8gIi5zbCIgZm9yIEhQIHRhcmdldC4KLQkqIGNvbmZpZy5pbjogQWRkIEVYVFJBX1NITElCX0VYVEVOU0lPTi4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6Ci0JU2VhcmNoIGZvciBzZWNvbmQgc2hhcmVkIGxpYiBleHRlbnNpb24gb25seSBpZiBFWFRSQV9TSExJQl9FWFRFTlNJT04KLQlpcyBkZWZpbmVkLgotCi0xOTk5LTA5LTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGVhcm1fZXBvY19wZS5jIGJ1aWxkIHRhcmdldC4KLQotVHVlIFNlcCAxNCAwNToyNjozNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKE9USEVSX0dPVF9SRUxPQ19TRUNUSU9OUyk6IEFkZCAucmVsYS5kbHQuCi0KLTE5OTktMDktMTMgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IFJlbW92ZSB0aGUgb3V0cHV0IGZpbGUgYXQgdGhlIHN0YXJ0LCBpbiBjYXNlIGl0Ci0JaXMgbm90IHdyaXRhYmxlLgotCi1Nb24gU2VwIDEzIDAwOjE3OjE4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6Ci0JU2VhcmNoIGZvciBmaWxlIHdpdGggLnNsIGV4dGVuc2lvbiBpZiBubyBmaWxlIHdpdGggYSAuc28gZXh0ZW5zaW9uCi0JaXMgZm91bmQuCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IFB1dCAucGx0Ci0JYXQgdGhlIHN0YXJ0IG9mIHRoZSAuZGx0IG91dHB1dCBzZWN0aW9uLgotCi0xOTk5LTA5LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcGUuZW06IERvbid0IGluY2x1ZGUgIi4uL2JmZC9saWJiZmQuaCIuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogVXNlIHhtYWxsb2MgcmF0aGVyIHRoYW4KLQliZmRfYWxsb2MuCi0KLQkqIHBlLWRsbC5oOiBOZXcgZmlsZS4KLQkqIHBlLWRsbC5jOiBJbmNsdWRlICJwZS1kbGwuaCIuICBNYXJrIHVudXNlZCBhcmd1bWVudHMgYXMgbmVlZGVkCi0JdG8gYXZvaWQgd2FybmluZ3MuCi0JKGVkYXRhX3N6LCByZWxvY19zeik6IENoYW5nZSBmcm9tIGludCB0byBzaXplX3QuCi0JKHBlX2RldGFpbHNfdHlwZSk6IENoYW5nZSB0eXBlIG9mIGltYWdlYmFzZV9yZWxvYyBmcm9tIGludCB0bwotCXVuc2lnbmVkIGludC4KLQkocGVfZGV0YWlsX2xpc3QpOiBGdWxseSBpbml0aWFsaXplIGxhc3QgZW50cnkuCi0JKHBlX2RsbF9pZF90YXJnZXQpOiBDaGFuZ2UgcGFyYW1ldGVyIHRvIGNvbnN0LgotCShwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiBMaWtld2lzZS4KLQkocGVfZGxsX2dlbmVyYXRlX2ltcGxpYik6IExpa2V3aXNlLgotCShwZV9pbXBsaWVkX2ltcG9ydF9kbGwpOiBMaWtld2lzZS4gIENoYW5nZSBkbGxfbmFtZSB0byBjb25zdC4KLQkqIGVtdWx0ZW1wbC9wZS5lbTogSW5jbHVkZSAicGUtZGxsLmgiLiAgUmVtb3ZlIGRlY2xhcmF0aW9ucyBub3cgaW4KLQlwZS1kbGwuaC4KLQkoaW5pdCk6IEZ1bGx5IGluaXRpYWxpemUgX19kbGxfXyBlbnRyeS4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcwotCXNlcXVlbmNlLCBlbHQsIGFuZCBpLgotCSogZGVmZmlsZS5oOiBBZGQgcHJlcHJvY2Vzc29yIGd1YXJkLgotCSogZGVmZmlsZXAueSAoZGVmX2RlYnVnKTogUmVtb3ZlLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShIRklMRVMpOiBBZGQgcGUtZGxsLmguCi0KLTE5OTktMDktMTIgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBsZC5oIChsZF9hYm9ydCk6IERlY2xhcmUuCi0JKGFib3J0KTogRGVmaW5lLgotCSogbGRtaXNjLmMgKGxkX2Fib3J0KTogRGVmaW5lLgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVXNlICR7RU5UUll9IHJhdGhlciB0aGFuIF9tYWluQ1JUU3RhcnR1cC4KLQlNb3ZlIC5ic3Mgc2VjdGlvbiBhZnRlciAucmRhdGEuICBNb3ZlIC5yZWxvYyBzZWN0aW9uIGFmdGVyIC5yc3JjLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFVzZSBzdHJ0b3VsIGZvciAtLXNwbGl0LWJ5LXJlbG9jCi0JYXJndW1lbnQuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSWYgd2UgZ2V0IGFuIHVucmVjb2duaXplZCBhcmd1bWVudCwKLQltZW50aW9uIC0taGVscC4KLQotCSogbGRsYW5nLmMgKHNlY3Rpb25fYWxyZWFkeV9saW5rZWQpOiBVc2UgY29tZGF0IGluZm9ybWF0aW9uIGlmIGl0Ci0JaXMgYXZhaWxhYmxlLgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCk6IElmCi0JT1ZFUlJJREVfU0VDVElPTl9BTElHTk1FTlQgaXMgZGVmaW5lZCwgY2hhbmdlIHRvIHRoYXQuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOiBVc2UgRVhFQ1VUQUJMRV9OQU1FIGlmIGl0IGlzCi0JZGVmaW5lZCwgcmF0aGVyIHRoYW4gYS5leGUuCi0JKGluaXQpOiBEZWZpbmUgX19zdWJzeXN0ZW1fXyBhcyAke1NVQlNZU1RFTX0uCi0JKHNldF9wZV9zdWJzeXN0ZW0pOiBBZGQgJHtJTklUSUFMX1NZTUJPTF9DSEFSfSBiZWZvcmUgZW50cnkgc3ltYm9sCi0JbmFtZS4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkbGFuZy5jIChvcGVuX291dHB1dCk6IENoYW5nZSBsb2NhbCB2YXJpYWJsZSBkZXNpcmVkX2VuZGlhbgotCWZyb20gaW50IHRvIGVudW0gYmZkX2VuZGlhbi4KLQotCSogZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaDogRGVmaW5lIEVOVFJZLCBTVUJTWVNURU0gYW5kCi0JSU5JVElBTF9TWU1CT0xfQ0hBUi4KLQkqIGVtdWxwYXJhbXMvYXJtcGUuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9tb3JlcGUuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9wcGNwZS5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2kzODZwZS5zaCAoRU5UUlkpOiBEZWZpbmUgYXMgX21haW5DUlRTdGFydHVwLgotCShTVUJTWVNURU0pOiBEZWZpbmUgYXMgUEVfREVGX1NVQlNZU1RFTS4KLQotRnJpIFNlcCAxMCAwMDoyMjo1MCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKExJQl9QQVRIKTogRGVmaW5lLgotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChPVEhFUl9SRUFET05MWV9TRUNUSU9OUyk6IFB1dCBzdHVicyBiZWZvcmUKLQl1bndpbmRlcnMgc28gdGhhdCB0aGV5IGFyZSBjbG9zZXIgdG8gdGhlIHRleHQgc2VjdGlvbi4KLQkoT1RIRVJfQlNTX1NFQ1RJT05TKTogRGVmaW5lLgotCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBQcm92aWRlIF9fU1lTVEVNX0lEIGFuZCBfRlBVX1NUQVRVUy4KLQkoSU5JVF9TVEFSVCwgSU5JVF9FTkQpOiBEZWZpbmUuCi0JKEZJTklfU1RBUlQsIEZJTklfRU5EKTogRGVmaW5lLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgc3VwcG9ydCBmb3IgSU5JVF9TVEFSVCwgSU5JVF9FTkQsCi0JRklOSV9TVEFSVCwgRklOSV9FTkQgYW5kIE9USEVSX0JTU19TRUNUSU9OUy4KLQotVGh1IFNlcCAgOSAyMTo0Mzo1OCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKFRFWFRfU1RBUlRfQUREUik6IE1vdmUgdXAgb25lIHBhZ2UuCi0JKERBVEFfQUREUik6IERlZmluZS4KLQotMTk5OS0wOS0wOSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFJFQURPTkxZX1NUQVJUX0FERFIpOiBTZXQgdG8gMHgyMDAwMDA0LgotCi0xOTk5LTA5LTA5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBsZC50ZXhpbmZvOiBGaXggYXJndW1lbnRzIG9mIEB2YXIgdG8gbm90IGNvbnRhaW4gcHVuY3R1YXRpb24uCi0KLVRodSBTZXAgIDkgMDU6NTI6MzQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBEZWZpbmUuCi0KLTE5OTktMDktMDggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjY0aHBwYS5zaCAoRUxGU0laRSk6IE5ldy4gIFNldCB0byA2NC4KLQotV2VkIFNlcCAgOCAwMDowNzozOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9lbGY2NGhwcGEuc2ggKEVOVFJZKTogRGVmaW5lIHRvIG1haW4uCi0KLTE5OTktMDktMDMgIFNjb3R0IEJhbWJyb3VnaCAgPHNjb3R0YkBuZXR3aW5kZXIub3JnPgotCi0JKiBsZC9jb25maWd1cmUuaG9zdDogQWRkZWQgSE9TVElOR19DUlQwLCBIT1NUSU5HX0xJQlMgZm9yIAotCXRhcmdldCAiYXJtKi0qLWxpbnV4LWdudSoiCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogY29uZmlndXJlLnRndCAocGpsLSotKiwgcGotKi0qKTogTmV3IHRhcmdldHMuCi0JKiBlbXVscGFyYW1zL3BqZWxmLnNoOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvcGpsZWxmLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL3BqLnNjOiBOZXcgZmlsZS4JCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXBqZWxmLm8gYW5kIGVwamxlbGYuby4KLQkoZXBqZWxmLm8sIGVwamxlbGYubyk6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBTZXAgIDMgMjA6MTc6MDggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2VsZjY0aHBwYS5zaCAoTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKE9USEVSX1JFQURPTkxZX1NFQ1RJT05TLCBEQVRBX1BMVCk6IExpa2V3aXNlLgotCi1UaHUgU2VwICAyIDE0OjMyOjAzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGY2NGhwcGEuc2g6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLnRndCAoaHBwYSp3LSotKik6IFVzZSBlbGY2NGhwcGEgZW11bGF0aW9uLgotCSogTWFrZWZpbGUuYW0gKEFMTF82NF9FTVVMQVRJT05TKTogQWRkIGVlbGY2NGhwcGEubwotCShlZWxmNjRocHBhLmMpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0KLTE5OTktMDgtMjUgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL2FybWVsZi5zaCAoT1RIRVJfQlNTX1NZTUJPTFMpOiBBZGQgX19lbmRfXy4KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2g6IExpa2V3aXNlLgotCi0xOTk5LTA4LTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JRnJvbSBhIHBhdGNoIHN1Ym1pdHRlZCBieSBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBiYWFscGVyYXppbS5mcm9iLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoYXJtLSotbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFybW5ic2Quby4KLQkoZWFybW5ic2QuYyk6IE5ldyBydWxlIHdpdGggZGVwcy4KLQkqIE1ha2VmaWxlLm9uOiBSZWdlbmVyYXRlLgotCSogZW11bHBhcmFtcy9hcm1uYnNkLnNoOiBOZXcgZmlsZS4KLQotMTk5OS0wOC0yMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIChQQVJTRV9BTkRfTElTVF9BUkdTKTogRGVmaW5lLgotCUltcGxlbWVudCAtLWJhc2UtZmlsZSBjb21tYW5kIGxpbmUgc3dpdGNoLgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IEFkZCBhYmlsaXR5IGZvciBpbmRpdmlkdWFsIHRhcmdldHMgdG8gaGF2ZQotCXRoZWlyIG93biBjb21tYW5kIGxpbmUgc3dpdGNoZXMgYnkgZGVmaW5pbmcgUEFSU0VfQU5EX0xJU1RfQVJHUy4KLQotMTk5OS0wOC0xOSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSAke0NDfSBpbnN0ZWFkIG9mIGdjYyBmb3IgZmluZGluZyBjb21waWxlcgotCXJlbGF0ZWQgZmlsZXMuCi0KLTE5OTktMDgtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL21jb3JlcGUuc2MgKE9VVFBVVF9GT1JNQVQpOiBGaXggdHlwby4KLQotMTk5OS0wOC0wOSAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0BiaWdmb290LmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2M6IEhhbmRsZSBnKysgZXhjZXB0aW9uIHNlY3Rpb25zLgotCi0xOTk5LTA4LTA5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gV2FsbHkgSWltdXJhIDxpaW11cmFAbWljcm91bml0eS5jb20+OgotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IFdoZW4gY2hlY2tpbmcgd2hldGhlciBhbiBhZGRyZXNzCi0JaXMgd2l0aGluIGEgcmVnaW9uLCBkb24ndCBnZXQgY29uZnVzZWQgYnkgd3JhcHBpbmcgYXJvdW5kIGF0IHRoZQotCWVuZCBvZiB0aGUgYWRkcmVzcyBzcGFjZS4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBVcGRhdGUgZm9yIHJlbmFtaW5nIG9mIFNFQ19TSE9SVCB0bwotCVNFQ19TTUFMTF9EQVRBLgotCi0JKiBNYWtlZmlsZS5hbTogUmVuYW1lIC5kZXAqIGZpbGVzIHRvIERFUCouICBDaGFuZ2UgREVQIHZhcmlhYmxlIHRvCi0JTUtERVAuICBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA4ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLWxpbnV4LWdudSopOiBOZXcgaG9zdC4KLQkoc3BhcmM2NC0qLWxpbnV4LWdudSopOiBOZXcgaG9zdC4KLQotMTk5OS0wOC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxleHN1cC5jIChpc19udW0pOiBSZWluZGVudC4KLQkocGFyc2VfYXJncyk6IE1lbnRpb24gcHJvZ3JhbSBuYW1lIGluIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGVtdWx0ZW1wbC9vc3RyaW5nLnNlZDogUmVuYW1lIGZyb20gc3RyaW5naWZ5LnNlZC4KLQkqIGVtdWx0ZW1wbC9hc3RyaW5nLnNlZDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoc3RyaW5naWZ5LnNlZCk6IE5ldyB0YXJnZXQuCi0JKEdFTl9ERVBFTkRTKTogQ2hhbmdlICQoc3JjZGlyKS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCB0bwotCXN0cmluZ2lmeS5zZWQuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBTVFJJTkdJRlkuCi0JKiBlbXVsdGVtcGwvKi5lbTogVXNlIHN0cmluZ2lmeS5zZWQgZnJvbSBidWlsZCBkaXJlY3RvcnkgcmF0aGVyCi0JdGhhbiBzb3VyY2UgZGlyZWN0b3J5LgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBVc2Ugc3RyaW5naWZ5LnNlZCByYXRoZXIgdGhhbiBpbmxpbmUgc2VkCi0Jc2NyaXB0LgotCSogZW11bHRlbXBsL2dsZDk2MC5lbSwgZW11bHRlbXBsL2dsZDk2MGMuZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2hwcGFlbGYuZW0sIGVtdWx0ZW1wbC9saW51eC5lbTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvbG5rOTYwLmVtLCBlbXVsdGVtcGwvc3Vub3MuZW06IExpa2V3aXNlLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wOC0wNSAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvaTM4NnBlLnNoOiBEZWZpbmUgRU5UUlksIFNVQlNZU1RFTSwgYW5kCi0JSU5JVElBTF9TWU1CT0xfQ0hBUi4KLQkqIGVtdWxwYXJhbXMvaTM4NnBlX3Bvc2l4LnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChZQUNDKTogSWYgYmlzb24gaXMgbm90IGluIHRoZSBzb3VyY2UgdHJlZSwgdXNlCi0JQFlBQ0NAIHJhdGhlciB0aGFuIGJpc29uIC15LgotCShMRVgpOiBJZiBmbGV4IGlzIG5vdCBpbiB0aGUgc291cmNlIHRyZWUsIHVzZSBATEVYQCByYXRoZXIgdGhhbgotCWZsZXguCi0JKEFMTF9FTVVMQVRJT05TKTogQWRkIGVpMzg2cGVfcG9zaXguby4KLQkoZWkzODZwZV9wb3NpeC5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLWludGVyaXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NTZdODYtcGMtaW50ZXJpeCopOiBOZXcgaG9zdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoTUFYUEFHRVNJWkUpOiBDaGFuZ2UgdG8gMHgxMDAwMC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaCAoTUFYUEFHRVNJWkUpOiBMaWtld2lzZS4KLQotMTk5OS0wOC0wMyAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgZWdvMzIuby4KLQkoZWdvMzIuYyk6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA3LTIyICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaCAoREFUQV9TVEFSVF9TWU1CT0xTKTogRGVmaW5lLgotCShPVEhFUl9CU1NfU1lNQk9MUywgT1RIRVJfQlNTX0VORF9TWU1CT0xTKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCAoREFUQV9TVEFSVF9TWU1CT0xTKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUudGd0IChhcm0qLSotdWNsaW51eCosIHRodW1iLSotdWNsaW51eCosCi0JdGh1bWItKi1saW51eC1nbnUqKTogTmV3IHRhcmdldHMuCi0KLTE5OTktMDctMjEgIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAYmlnZm9vdC5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjOiBBZGQgaGFuZGxpbmcgb2YgbGlua29uY2Ugc2VjdGlvbnMuCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0JKiBlbXVscGFyYW1zL2dvMzIuc2g6IFJlbW92ZTsgb2Jzb2xldGUuCi0JKiBzY3JpcHR0ZW1wbC9nbzMyY29mZi5zYzogUmVtb3ZlOyBvYnNvbGV0ZS4KLQotMTk5OS0wNy0yMSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKmVsLSotdnh3b3JrcyopOiBOZXcgdGFyZ2V0LgotCi0xOTk5LTA3LTIxICBCcmFkIE0uIEdhcmNpYSAgPGJnYXJjaWFAZm9yZS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLXZ4d29ya3MqKTogTmV3IHRhcmdldC4KLQotVHVlIEp1bCAyMCAxNToxODo0NiAxOTk5ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfZ2Nfc2VjdGlvbnMpOiBPbmx5IGhhbmRsZSB0aGUgc3RhcnQgc3ltYm9sCi0Jc3BlY2lhbGx5IGlmIHRoZXJlIGlzIG9uZS4KLQotTW9uIEp1bCAxOSAxNDoxOToxNCAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcG4zMi5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IEFkZAotCS5NSVBTLmV2ZW50cyBhbmQgLk1JUFMuY29udGVudCBoYW5kbGluZy4KLQkqIGVtdWxwYXJhbXMvZWxmNjRibWlwLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogTGlrZXdpc2UuCi0KLTE5OTktMDctMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChnZXRfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uOiBSZXR1cm4gdHJ1ZSBpZmYgdGhlCi0JZ2l2ZW4gdGFyZ2V0IGlzIHRoZSB0YXJnZXQgYmVpbmcgc291Z2h0LgotCShzdHJpY3B5KTogTmV3IGZ1bmN0aW9uOiAgTGlrZSBzdHJjcHkgYnV0IGNvbnZlcnQgdG8gbG93ZXIKLQljYXNlIGFzIHdlbGwuCi0JKHN0cmN1dCk6IE5ldyBmdW5jdGlvbjogIExpa2Ugc3Ryc3RyIGJ1dCByZW1vdmUgdGhlIGxvY2F0ZWQKLQlzdWJzdHJpbmcgYXMgd2VsbC4KLQkobmFtZV9jb21wYXJlKTogTmV3IGZ1bmN0aW9uOiBDb21wdXRlIGEgY29tcGF0YWJpbGl0eSByYXRpbmcKLQlmb3IgdHdvIHRhcmdldCBuYW1lcy4KLQkod2lubmVyKTogTmV3IHZhcmlhYmxlOiBCZXN0IHRhcmdldCBmb3VuZCBieQotCWNsb3Nlc3RfdGFyZ2V0X21hdGNoKCkgc28gZmFyLgotCShjbG9zZXN0X3RhcmdldF9tYXRjaCk6IE5ldyBmdW5jdGlvbjogRmluZCB0aGUgdGFyZ2V0IHdoaWNoIGlzCi0JdGhlIGNsb3Nlc3QgbWF0Y2ggdG8gdGhlIG9yaWdpbmFsIHRhcmdldC4KLQkoZ2V0X2ZpcnN0X2lucHV0X3RhcmdldCk6IE5ldyBmdW5jdGlvbjogRmluZCB0aGUgdGFyZ2V0IGZvcm1hdAotCW9mIHRoZSBmaXJzdCBvZiB0aGUgbGlua2VyJ3MgaW5wdXQgZmlsZS4KLQkob3Blbl9vdXRwdXQpOiBCZSBtb3JlIGNsZXZlciBhYm91dCBkZWNpZGluZyB0aGUgb3V0cHV0IHRhcmdldAotCWZvcm1hdC4gCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaDogQWRkIDY0LWJpdCBkaXJlY3RvcmllcyB0byBuYXRpdmUgTElCX1BBVEguCi0KLVRodSBKdWwgMTUgMTU6NTU6MTUgMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCB1cCBIT1NUSU5HX0NSVDAgYW5kIEhPU1RJTkdfTElCUyBmb3IgSVJJWDYuCi0KLTE5OTktMDctMTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi45LjUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDctMTQgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBDb3B5IFNFQ19TSE9SVCB0byBvdXRwdXQgc2VjdGlvbi4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBSZS1vcmRlciAucmVsW2FdLmZvbyBvdXRwdXRzIHRvIHRoZQotCXNhbWUgb3JkZXIgc2VlbiBmb3IgdGhlIG1haW4gc2VjdGlvbnMuICBBZGQKLQlPVEhFUl9SRUFET05MWV9SRUxPQ19TRUNUSU9OUyBhbmQgT1RIRVJfR09UX1JFTE9DX1NFQ1RJT05TLgotCi0xOTk5LTA3LTEyICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbXVsdGVtcGwvbGludXguZW0gKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEZpbGwgaW4KLQlzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEFkZCBtaXNzaW5nCi0JY29tbWEgaW4gaW5pdGlhbGl6ZXIuCi0KLTE5OTktMDctMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYW55IGZpbGVzOiBDaGFuZ2VzIHRvIGF2b2lkIGdjYyB3YXJuaW5nczogQWRkIEFUVFJJQlVURV9VTlVTRUQKLQlhcyBhcHByb3ByaWF0ZS4gIEZpbGwgaW4gc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucy4KLQotMTk5OS0wNy0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkZmlsZS5jOiBSZXZlcnQgcGF0Y2ggb2YgMTk5OS0wNy0wOC4KLQkobGRmaWxlX3RyeV9vcGVuX2JmZCk6IElmIHdlIGFyZSBzZWFyY2hpbmcgZm9yIHRoZSBmaWxlLCBza2lwCi0JZmlsZXMgd2l0aCBhbiBpbmNvbXBhdGlibGUgYXJjaGl0ZWN0dXJlLgotCi0xOTk5LTA3LTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjIChPVVRQVVRfRk9STUFUKTogSW5jbHVkZSBiaWcgZW5kaWFuIGFuZAotCWxpdHRsZSBlbmRpYW4gZm9ybWF0cy4KLQotMTk5OS0wNy0wOCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9tY29yZXBlLnNjOiBmaXggcXVvdGluZyBwcm9ibGVtLCBmb3IgYmFzaCAyLngKLQotMTk5OS0wNy0wOCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBTa2lwIGxpYnJhcmllcyBtYWRlIGZvcgotCWluY29tcGF0aWJsZSBhcmNoaXRlY3R1cmVzIGluIHRoZSBzZWFyY2ggcGF0aC4gTGV0IHRoZSB1c2VyIGtub3cKLQlhYm91dCBhbnkgc3VjaCBza2lwcy4KLQotVGh1IEp1bCAgOCAxMjozMjoyMyAxOTk5ICBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+Ci0KLSAgICAgICAgKiBjb25maWd1cmUudGd0IChocHBhKi1saW51eC1nbnUqKTogTmV3IHRhcmdldC4KLQotMTk5OS0wNy0wNyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF82NF9FTVVMQVRJT05TKTogQWRkIGVlbGY2NGJtaXAuCi0JKGVlbGY2NGJtaXApOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlLnRndCAobWlwcy1zZ2ktaXJpeDYqKTogQWRkIDY0LWJpdCBlbXVsYXRpb24uCi0JKiBlbXVscGFyYW1zL2VsZjY0Ym1pcC5zaDogTmV3IGZpbGUuCi0KLTE5OTktMDctMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoYWZ0ZXJfb3Blbik6IEFib3J0IGlmIGlucHV0IGZvcm1hdCBpcyBBUk0gYW5kCi0Jb3V0cHV0IGZvcm1hdCBpcyBub3QuIAotCSogZW11bHRlbXBsL2FybWNvZmYuZW0gKGFmdGVyX29wZW4pOiBBYm9ydCBpZiBpbnB1dCBmb3JtYXQgaXMgQVJNCi0JYW5kIG91dHB1dCBmb3JtYXQgaXMgbm90LiAKLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW0gKGFmdGVyX29wZW4pOiBBYm9ydCBpZiBpbnB1dCBmb3JtYXQgaXMgQVJNCi0JYW5kIG91dHB1dCBmb3JtYXQgaXMgbm90LiAKLQotMTk5OS0wNy0wMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkbGFuZy5jOiBSZXZlcnQgY2hhbmdlIG9mIDE5OTktMDYtMjMuCi0KLTE5OTktMDYtMzAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZWxmMzJibWlwbjMyLm8uCi0JKGVlbGYzMmJtaXBuMzIuYyk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmUudGd0IChtaXBzLXNnaS1pcml4NiopOiBNYWtlIG4zMiB0aGUgZGVmYXVsdAotCWVtdWxhdGlvbi4KLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwbjMyLnNoOiBOZXcgZmlsZS4KLQkKLTE5OTktMDYtMjggIEppbSBQaWNrIDxqaW1AamltcGljay5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW06IEFkZGVkIGNvZGUgc28gdGhhdCAueHMgbGlua2VyIHNjcmlwdHMgYXJlCi0JY2FsbGVkIHNvIHRoYXQgQVJNIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGNvcnJlY3RseS4KLQotMTk5OS0wNi0yMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby5pbml0X2Z1bmN0aW9uIGFuZAotCWxpbmtfaW5mby5maW5pX2Z1bmN0aW9uLgotCSogbGV4c3VwLmMgKE9QVElPTl9JTklUKTogTmV3IG1hY3JvLgotCShPUFRJT05fRklOSSk6IExpa2V3aXNlLgotCShsZF9vcHRpb25zKTogQWRkIGRlc2NyaXB0aW9ucyBmb3IgdGhlbS4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSB0aGVtLgotCi0xOTk5LTA2LTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGRsYW5nLmMgKHNlY3Rpb25fYWxyZWFkeV9saW5rZWQpOiBPbmx5IGRpc2NhcmQgbGluayBvbmNlCi0Jc2VjdGlvbnMgaWYgd2UgYXJlIGJ1aWxkaW5nIGNvbnN0cnVjdG9ycy4KLQotMTk5OS0wNi0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoTG9jYXRpb24gQ291bnRlcik6IERlc2NyaWJlIGJlaGF2aW91ciBvZgotCWxvY2F0aW9uIGNvdW50ZXIgaW5zaWRlIHNlY3Rpb24gc3RhdGVtZW50cy4KLQotMTk5OS0wNi0yMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjIChXUklUQUJMRV9ST0RBVEEpOiBOZXcgdmFyaWFibGUgZm9yCi0JY29udHJvbGxpbmcgd2hldGhlciBvciBub3QgLnJvZGF0YSBpcyBpbiB0aGUgZGF0YSBzZWdtZW50IG9yIHRoZQotCXRleHQgc2VnbWVudC4KLQotMTk5OS0wNi0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBBZGQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggLS10aHVtYi1lbnRyeS4KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW06IEFkZCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCAtLXRodW1iLWVudHJ5LgotCSogZW11bHRlbXBsL2FybWNvZmYuZW06IEFkZCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCAtLXRodW1iLWVudHJ5LgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgbmV3IEFSTSBjb21tYW5kIGxpbmUgc3dpdGNoOiAtLXRodW1iLWVudHJ5LgkKLTE5OTktMDYtMjAgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlndXJlLmluIChhbGxfbGlicGF0aCk6IEFjY3VtdWxhdGUgYWNyb3NzIGFsbCBlbmFibGVkIHRhcmdldHMuCi0KLVN1biBKdW4gMjAgMTQ6MTA6MzMgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FybWVsZi5lbTogV2F0Y2ggRU1VTEFUSU9OX0xJQlBBVEggaW5zdGVhZCBvZgotCURFRkFVTFRfRU1VTEFUSU9OLgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gMTggMTU6MjQ6NDggMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEdFTlNDUklQVFMpOiBQYXNzIEVNVUxBVElPTl9MSUJQQVRILCBub3QgRU1VTC4KLQkqIGNvbmZpZ3VyZS5pbiAoYWxsX2VtdWxzKTogQWRkIHRhcmdfZXh0cmFfbGlicGF0aC4KLQkoYWxsX2xpYnBhdGgsIEVNVUxBVElPTl9MSUJQQVRIKTogRGVmaW5lLgotCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLWxpbnV4LWdudSopOiBEZWZpbmUgdGFyZ19leHRyYV9saWJwYXRoLgotCSogZ2Vuc2NyaXB0cy5zaCAoTElCX1BBVEgpOiBEZWZpbmUgaWYgZW11bGF0aW9uIGluIEVNVUxBVElPTl9MSUJQQVRILgotCi1Nb24gSnVuIDE0IDEwOjM4OjM2IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQudGV4aW5mbzogRml4IHVzZSBvZiBAaXRlbSB2cy4gQGl0ZW14LgotCi0xOTk5LTA2LTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gVGhvbWFzIFplbmtlciA8dGh6QGxlbm5hcnR6LWVsZWN0cm9uaWMuZGU+OgotCSogbGRncmFtLnkgKGF0dHJpYnV0ZXNfb3B0KTogVXNlIGF0dHJpYnV0ZXNfbGlzdCBpbnN0ZWFkIG9mIE5BTUUuCi0JKGF0dHJpYnV0ZXNfbGlzdCwgYXR0cmlidXRlc19zdHJpbmcpOiBOZXcgbm9udGVybWluYWxzLgotCSogbGRsYW5nLmMgKGxhbmdfc2V0X2ZsYWdzKTogQWRkIGludmVydCBwYXJhbWV0ZXIuICBEb24ndCBoYW5kbGUKLQknIScuCi0JKiBsZGxhbmcuYyAobGFuZ19zZXRfZmxhZ3MpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9wYXJzZSk6IERvbid0IGFkZAotCWVudHJ5X3N5bWJvbCBhcyBhbiB1bmRlZmluZWQgc3ltYm9sIHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUKLQlsaW5rLiAgRnJvbSA8amVmZmRiQGdvb2RuZXQuY29tPi4KLQotMTk5OS0wNi0xMiAgRGF2aWQgTydCcmllbiAgPG9icmllbkBmcmVlYnNkLm9yZz4KLQotCSogY29uZmlndXJlLnRndDogKGlbMzQ1Nl04Ni0qLWZyZWVic2QqKTogTm93IGRlZmF1bHRzIHRvIEVMRi4KLQotMTk5OS0wNi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKGhlbHApOiBSZXN0b3JlIHByZXZpb3VzIGZvcm1hdCBvZiBvdXRwdXQuCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogSWYgY29tcGlsaW5nIGZvciBhcm1fZXBvY19wZSByZW5hbWUKLQlpbnRlcndvcmtpbmcgZnVuY3Rpb25zIHRvIGF2b2lkIGEgbmFtZSBzcGFjZSBjbGFzaC4KLQotMTk5OS0wNi0wMiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBBZGQgaW5pdHAgc3VwcG9ydC4KLQotMTk5OS0wNi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBSZW5hbWUgZ2xvYmFsIGFybSBpbnRlcndvcmtpbmcgZnVuY3Rpb25zIHRvCi0JYXZvaWQgbmFtZSBjb2xsaXNpb24gd2hlbiBhbGwgdGFyZ2V0cyBCRkQgaXMgYnVpbHQuCi0KLTE5OTktMDUtMzAgIENvcnQgRG91Z2FuICA8Y29ydEBhdHRpcy5jcy5ubXQuZWR1PgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMycHBjbGludXguby4KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGMtKi1saW51eC1nbnUpOiBVc2UgaXQuCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjbGludXguc2g6IE5ldyBmaWxlLgotCi0xOTk5LTA1LTI5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IENsYXJpZnkgdGhhdCBvcHRpb25zIHdoaWNoIHJlZmVyIHRvIGZpbGVzCi0JbXVzdCBiZSBwcm9wZXJseSBvcmRlcmVkLgotCi0xOTk5LTA1LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtICguLi5fcGFyc2VfYXJncyk6IE5ldyBmdW5jdGlvbjogUGFyc2UKLQljb21tYW5kIGxpbmUgb3B0aW9uLiAgQWNjZXB0IGFybS1lbGYgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbgotCSctcCcgb3IgJy0tbm8tcGlwZWxpbmUta25vd2xlZGdlJy4KLQkoLi4uX2xpc3Rfb3B0aW9ucyk6IE5ldyBmdW5jdGlvbjogRGVzY3JpYmUgdGhlIG5ldyBjb21tYW5kIGxpbmUKLQlvcHRpb24uCi0JKC4uLl9iZWZvcmVfYWxsb2NhdGlvbik6IFBhc3MgdGhlIHZhbHVlIG9mIHRoZSBuZXcgdmFyaWFibGUKLQlub19waXBlbGluZV9rbm93bGVkZ2UgdG8gYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uLgotCQotCSogZW11bHRlbXAvYXJtZWxmX29hYmkuZW0gKC4uLl9iZWZvcmVfYWxsb2NhdGlvbik6IFBhc3MgemVybyBhcwotCXRoZSB0aGlyZCBwYXJhbWV0ZXIgdG8gYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uLgotCi0xOTk5LTA1LTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAoaGVscCk6IE1pbm9yIGZvcm1hdHRpbmcgY2hhbmdlcy4KLQotMTk5OS0wNS0yOCAgTWFydGluIERvcmV5ICA8bWRvcmV5QG1hZGdlLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaTk2MC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9lbGYzMl9pOTYwLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZWxmMzJfaTk2MC5vLgotCShlZWxmMzJfaTk2MC5jKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTI2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIChURU1QTEFURV9OQU1FKTogU2V0IHRvIGFybWVsZl9vYWJpLiAKLQotMTk5OS0wNS0yNCAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZW11bHRlbXBsL2FybWVsZi5lbSAoYmVmb3JlX3BhcnNlKTogU2V0IGNvbmZpZy5keW5hbWljX2xpbmsgYW5kCi0gCWNvbmZpZy5oYXNfc2hhcmVkLgotCSogZW11bHBhcmFtcy9hcm1lbGYuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZS4KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBMaWtld2lzZS4KLQotMTk5OS0wNC0xMyAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZW11bHRlbXBsL2FybWVsZi5lbTogQWRkIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gc2hhcmVkIG9iamVjdHMKLQkoY29waWVkIGZyb20gZWxmMzIuZW0pLgotCi1XZWQgTWF5IDE5IDEyOjQ0OjI2IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogUmVtb3ZlIGVhcm1saW51eC5vIGFuZAotCWVhcm0yNmxpbnV4Lm8sIGFkZCBlYXJtZWxmX2xpbnV4Lm8gYW5kIGVhcm1lbGZfbGludXgyNi5vLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA1LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZS4KLQkoVEVNUExBVEVfTkFNRSk6IERlZmluZS4KLQotVGh1IE1heSAxMyAwOTo0ODowOSAxOTk5ICBKb2VsIFNoZXJyaWxsIChqb2VsQE9BUmNvcnAuY29tKQotCi0JKiBjb25maWd1cmUudGd0IChpMzg2LSotcnRlbXNlbGYqLCBzaC0qLXJ0ZW1zZWxmKik6IE5ldyB0YXJnZXRzLgotCShtaXBzKmVsLSotcnRlbXMqLCBwb3dlcnBjbGUtKi1ydGVtcyopOiBOZXcgdGFyZ2V0cy4KLQotMTk5OS0wNS0xMCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBTcGVjaWZ5IHRoZSBvdXRwdXQgYXJjaCwgd2hpY2ggSWFuIHNheXMgaXMKLQl0aGUgUmlnaHQgVGhpbmcgdG8gZG8uCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogdmFyaW91cyBjaGFuZ2VzIHRvIHBhcmFtZXRlcml6ZSB0aGUKLQl0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0JKGdsZF9pMzg2cGVfYWZ0ZXJfb3Blbik6IERldGVjdCBhbmQgZml4IE1TIGltcG9ydCBsaWJyYXJpZXMKLQlieSByZW5hbWluZyB0aGUgbWVtYmVyIG9iamVjdHMgKHdoaWNoIGFyZSBhbGwgbmFtZWQgdGhlIHNhbWUpLgotCi0JKiBwZS1kbGwuYzogdmFyaW91cyBjaGFuZ2VzIHRvIHBhcmFtZXRlcml6ZSB0aGUgdGFyZ2V0LXNwZWNpZmljCi0JaW5mb3JtYXRpb24uCi0JKGdlbmVyYXRlX3JlbG9jKTogc3VwcG9ydCByZWxvY3MgbW9yZSBnZW5lcmljYWxseSB0byBhbGxvdyBmb3IKLQlleHBhbnNpb24uCi0JKHBlX2V4ZV9idWlsZF9zZWN0aW9ucyk6IG5ldzsgdXNlZCB0byBhZGQgLnJlbG9jcyB0byAuZXhlcwotCShwZV9leGVfZmlsbF9zZWN0aW9ucyk6IGRpdHRvCi0KLTE5OTktMDUtMTAgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKToKLQlDaGVjayBmb3IgVEFSR0VUX0lTX2FybV9lcG9jX3BlLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQotMTk5OS0wNS0xMiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3YWxrX3dpbGQsIHdhbGtfd2lsZF9maWxlLCB3YWxrX3dpbGRfc2VjdGlvbiwKLQlvdXRwdXRfc2VjdGlvbl9jYWxsYmFjaywgZ2Nfc2VjdGlvbl9jYWxsYmFjayk6IE5ldyBmdW5jdGlvbnMgZm9yCi0JZ2VuZXJpYyBzZWN0aW9uIHdhbGtzLgotCSh3aWxkLCBsYW5nX2djX3dpbGQpOiBVc2Ugd2Fsa193aWxkLgotCSh3aWxkX2ZpbGUsIGxhbmdfZ2Nfd2lsZF9maWxlKTogRGVsZXRlZC4gQ29tbW9uIGxvZ2ljIG1vdmVkIHRvCi0Jd2Fsa193aWxkX2ZpbGUuCi0JKHdpbGRfc2VjdGlvbiwgbGFuZ19nY193aWxkX3NlY3Rpb24pOiBEZWxldGVkLiBDb21tb24gbG9naWMgbW92ZWQKLQl0byB3YWxrX2ZpbGRfc2VjdGlvbi4gIFVuaXF1ZSBsb2dpYyBtb3ZlZCBpbnRvIGNhbGxiYWNrcwotCW91dHB1dF9zZWN0aW9uX2NhbGxiYWNrIGFuZCBnY19zZWN0aW9uX2NhbGxiYWNrLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0xMiAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoOiBOZXcgZmlsZS4gIFN1cHBvcnQgZm9yIEFSTSAKLQlHTlUvTGludXggRUxGIEFCSS4KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2g6IE5ldyBmaWxlLiBBUENTLTI2IHZlcnNpb24gb2YgYWJvdmUuCi0JKiBjb25maWd1cmUudGd0OiBGb3IgYXJtKi0qLWxpbnV4LWdudSosIHNldCBkZWZhdWx0IGVtdWxhdGlvbiB0bwotCWBhcm1lbGZfbGludXgnLCBhbmQgYWxzbyBpbmNsdWRlIGBhcm1lbGZfbGludXgyNicgYW5kIGBhcm1lbGYnLgotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlcyB0byBtYWtlIGVhcm1saW51eC5jIGFuZCBlYXJtbGludXgyNi5jLgotCShBTExfRU1VTEFUSU9OUyk6IEFkZCBlYXJtbGludXgubyBhbmQgZWFybWxpbnV4MjYuby4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWxmX2kzODZfYmUuby4KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLWJlb3MqKTogVXNlIGl0LgotCSogZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluIChlbnZpcm9uKTogRGV0ZWN0IGRlY2xhcmF0aW9uLgotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBkZWNsYXJlIGVudmlyb24uCi0JKiBzeXNkZXAuaCAoZW52aXJvbik6IERlY2xhcmUgaWYgbmVlZGVkLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDQtMTEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcpOiBOZXcuCi0JKHZlcnNfZGVmbnMpOiBBY2NlcHQgYGV4dGVybiAibGFuZyIgeyB9JyBzeW50YXguCi0JKiBsZGxleC5sICh2ZXJzX25vZGVfbmVzdGluZyk6IE5ldy4KLQkoVl9JREVOVElGSUVSKTogQWNjZXB0IC4gYW5kICQgaW4gc3ltYm9scy4KLQkoVkVSU19OT0RFKTogQWNjZXB0IGBleHRlcm4gImxhbmciIHsgfScgdG9rZW5zLiAgTmVzdCBWRVJTX05PREUgc3RhdGVzLgotCSogbGRsYW5nLmMgKGxhbmdfbmV3X3ZlcnNfcmVnZXgpOiBOZXcgYGxhbmcnIGFyZ3VtZW50LiAgVXBkYXRlIGNhbGxlcnMuCi0JKGxhbmdfdmVyc19tYXRjaF9sYW5nX2MpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfdmVyc19tYXRjaF9sYW5nX2NwbHVzcGx1cyk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ192ZXJzX21hdGNoX2xhbmdfamF2YSk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbik6IEZpeCBpdGVyYXRpb24uICBEb24ndCBmcmVlCi0Jc2VjdGlvbiBjb250ZW50cywgYXMgaXQgaXMgc3RpbGwgaW4gdXNlIGJ5IHRoZSBwYXR0ZXJucy4KLQotMTk5OS0wNC0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBJbml0IGxpbmtfaW5mby5ub191bmRlZmluZWQuCi0JKiBsZXhzdXAuYzogQWRkIGNvbW1hbmQtbGluZSBvcHRpb24gLS1uby11bmRlZmluZWQuCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZC5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlCi0Jc3lzdGVtIGRvZXMgbm90IGRlZmluZSBpdC4KLQotMTk5OS0wNC0wNiAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsZG1haW4uaCAoZGVtYW5nbGluZyk6IERlY2xhcmUuCi0JKiBsZG1haW4uYyAoZGVtYW5nbGluZyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKG1haW4pOiBJbml0aWFsaXplIGRlbWFuZ2xpbmcuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogRG9uJ3QgZGVtYW5nbGUgc3ltYm9sIGlmICEgZGVtYW5nbGluZy4KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zLCBwYXJzZV9hcmdzKTogSGFuZGxlIC0tZGVtYW5nbGUgYW5kCi0JLS1uby1kZW1hbmdsZS4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0tZGVtYW5nbGUvLS1uby1kZW1hbmdsZS4KLQotCSogbGRsZXgubCAoVl9JREVOVElGSUVSKTogQWxsb3cgJy4nIGluIHN5bWJvbC4KLQotMTk5OS0wNC0wNSAgQ2hyaXMgVG9yZWsgIDx0b3Jla0BCU0RJLkNPTT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyKTogQ2hlY2sgdGhhdAotCWEgc2hhcmVkIGxpYnJhcnkgcmVhbGx5IGV4aXN0cywgYXZvaWRpbmcgYnJva2VuIHN5bWxpbmtzLgotCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fZmlsZSk6IEdlbmVyYXRlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgaWYKLQl3ZSBjYW4ndCBmaW5kIGEgLWwgZmlsZS4KLQotMTk5OS0wNC0wNSAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGkzODYtKi1wZSk6IGFkZCB0YXJnX2V4dHJhX29maWxlcyBmb3Igb3RoZXIgUEUKLQl0YXJnZXRzIChpMzg2LXBlIGFuZCBpMzg2LXdpbm50KQotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZGVmZmlsZXAueTogSW5jbHVkZSAic3lzZGVwLmgiIGFuZCAibGRtaXNjLmgiLgotCShkZWZfZmlsZV9hZGRfZGlyZWN0aXZlKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIHZvaWQuICBSZW1vdmUKLQl1bnVzZWQgbG9jYWxzIHNoX3Jlc2VydmUsIHNoX2NvbW1pdCwgYW5kIGouCi0JKGRlZl91bmdldGMpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKGRlZl9sZXgpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gb2YgfHwgd2l0aGluICYmLgotCSogZGVmZmlsZS5oIChkZWZfZmlsZV9hZGRfZGlyZWN0aXZlKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogcGUtZGxsLmM6IEluY2x1ZGUgPHRpbWUuaD4sIDxjdHlwZS5oPiwgYW5kICJsZGVtdWwuaCIuCi0JKGdlbmVyYXRlX2VkYXRhKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBpLgotCShxdW90ZXB1dCk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSk6IEZpeCB0eXBlIGluIGZvcm1hdCBzdHJpbmcuCi0JKHF1aWNrX3N5bWJvbCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgYmxoZS4KLQkocGVfZGxsX2dlbmVyYXRlX2ltcGxpYik6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMpOiBSZW1vdmUgdW51c2VkIGxvY2FscyBhcl9oZWFkLCBhcl90YWlsLAotCWFuZCBuLgotCShwZV9hczE2KTogQ29tbWVudCBvdXQuCi0KLTE5OTktMDQtMDQgIERvbiBCb3dtYW4gPGRvbkBwaXhzY2kuY29tPgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgbWlwcyotKi12eHdvcmtzKiB0YXJnZXQuCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlYXJtX2Vwb2NfcGUubwotCUFkZCBidWlsZCBydWxlIGFuZCBkZXBlbmRlbmNpZXMgZm9yIGVhcm1fZXBvY19wZS5jLgotCi0JKiBlbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoOiBOZXcgZmlsZS4KLQotCSogY29uZmlndXJlLnRndDogQWRkICd0YXJnX2V4dHJhX29maWxlcycgZm9yIEFSTSBiYXNlZCBQRQotCXRhcmdldHMuIAotCi0xOTk5LTAzLTMxICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlndXJlLnRndDogTWF0Y2ggYGFybSotKi1saW51eC1nbnUqJyBub3QKLSAJYGFybXYqLSotbGludXgtZ251Jy4KLQotMTk5OS0wMy0yNiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFB1dCB0aGUgLmVoX2ZyYW1lIGFuZCAuZ2NjX2V4Y2VwdF90YWJsZQotCXNlY3Rpb25zIGluIHRoZSBkYXRhIHNlZ21lbnQuCi0KLUZyaSBNYXIgMjYgMTI6MDU6NTEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKHdpbGRjYXJkX3NwZWMpOiBBZGQgZXhjbHVkZV9uYW1lLgotICAgICAgICAqIGxkZ3JhbS55IChFWENMVURFX0ZJTEUpOiBOZXcgdG9rZW4uCi0JKHdpbGRjYXJkX3NwZWMpOiBTZXQgZXhjbHVkZV9uYW1lLgotCShmaWxlX05BTUVfbGlzdCk6IFJlY29nbml6ZSBFWENMVURFX0ZJTEUuCi0gICAgICAgICogbGRsYW5nLmMgKHdpbGRfc2VjdGlvbik6IENoZWNrIGZvciBleGNsdWRlZCBmaWxlcy4KLQkocHJpbnRfd2lsZF9zdGF0ZW1lbnQpOiBQcmludCBleGNsdWRlZCBmaWxlcy4KLQkobGFuZ19hZGRfd2lsZCk6IE5ldyBhcmd1bWVudCBleGNsdWRlX2ZpbGVuYW1lLgotCVNldCBleGNsdWRlX2ZpbGVuYW1lLgotCSogbGRsYW5nLmggKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSk6ICBBZGQgZXhjbHVkZV9maWxlbmFtZS4KLQkqIGxkbGV4Lmw6IE5ldyB0b2tlbiBFWENMVURFX0ZJTEUuCi0JKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6ICBBZGQgYXJndW1lbnQgdG8gbGFuZ19hZGRfd2lsZC4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoQ1RPUiwgRFRPUik6ICBFeGNsdWRlIGNydGVuZC5vIGZyb20gY3RvciB3aWxkY2FyZC4KLQlSZW9yZGVyIHNvcnRlZCBhbmQgdW5zb3J0ZWQgY3RvcnMuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjIChDVE9SLCBEVE9SKTogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjIChDVE9SLCBEVE9SKTogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKENUT1IsIERUT1IpOiBMaWtld2lzZS4KLQkKLTE5OTktMDMtMjYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2djX3NlY3Rpb25zKTogSWYgZW50cnlfc3ltYm9sIGlzIG5vdCBkZWZpbmVkLAotCWRlZmF1bHQgdG8gInN0YXJ0Ii4KLQotMTk5OS0wMy0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgZXhwbGljaXQgcGxhY2VtZW50cyBmb3IgdGhlIC5laF9mcmFtZQotCWFuZCAuZ2NjX2V4Y2VwdF90YWJsZSBzZWN0aW9ucy4gCi0KLVdlZCBNYXIgIDMgMDk6MTM6MzQgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jbG0+Ci0gCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmLnNjOiBSZW1vdmUgLmVuZC5jdG9ycyBhbmQgLmVuZC5kdG9ycwotICAgICAgICBzZWN0aW9ucy4gIFJlb3JkZXIgLmN0b3JzIHNlY3Rpb24gZW50cmllcy4KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBMaWtld2lzZS4KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBMaWtld2lzZS4KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgotCi0xOTk5LTAyLTI2ICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBXcm9uZyBlcnJvciBtc2cgZm9yIC1yIGFuZCAtLW1wYzg2MGMwLgotCi0xOTk5LTAyLTI1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3Nlcyk6IFJlbW92ZSBleHRyYW5lb3VzCi0JYmFja3NsYXNoLiAKLQotVGh1IEZlYiAyNSAxNTowNzoyNCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBEb24ndCBnYXRoZXIgLmN0b3IgYW5kIC5kdG9yIHNlY3Rpb25zCi0gICAgICAgIGZvciByZWxvY2F0ZWFibGUgbGlua3MuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLSAgICAgICAgCi0xOTk5LTAyLTIyICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KLQotCSogbGRpbnQudGV4aW5mbzogcmVtb3ZlIGV4dHJhbmVvdXMgcmlnaHQgYnJhY2UuCi0JKiBsZG1haW4uYyAobWFpbik6IGluaXRpYWxpemUgYW5kIGNoZWNrIG9wdGlvbiAibXBjODYwYzAiLgotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMsIHBhcnNlX2FyZ3MpOiBhZGQgb3B0aW9uICJtcGM4NjBjMCIuCi0KLVdlZCBGZWIgMTcgMTI6MTA6MDYgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIG1wdy1lbGZtaXBzLmMgKGdsZGVsZjMyZWJtaXBfYmVmb3JlX2FsbG9jYXRpb24pOiBSZW1vdmUgc3BlY2lhbAotCS5yZWdpbmZvIHNlY3Rpb24gaGFuZGxpbmcuIAotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoIChJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TKTogUmVtb3ZlZAotCSogZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoIChJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TKTogUmVtb3ZlZAotCi0xOTk5LTAyLTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JUGF0Y2ggZnJvbTogU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0JCi0JKiBjb25maWd1cmUudGd0OiBBZGRlZCBhcm12Ki0qLWxpbnV4LWdudSB0byAkdGFyZ19lbXVsCi0JcmVjb2duaXRpb24uIAotCi1XZWQgRmViIDE3IEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLSAKLSAgICAgICAgKiBlbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0KLSAgICAgICAgKGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zLAotICAgICAgICBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZywKLSAgICAgICAgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogRGVmaW5lIHRoZW0gdG8gdXNlIHRoZQotICAgICAgICBvbGQgQUJJIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbnMuCi0KLVR1ZSBGZWIgMTYgMTY6NDg6MTkgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBBQ19QUkVSRVEgdG8gMi4xMy4gIENoYW5nZSBBTV9QUk9HX0lOU1RBTEwKLQl0byBBQ19QUk9HX0lOU1RBTEwuICBDaGFuZ2UgQU1fRVhFRVhUIHRvIEFDX0VYRUVYVC4KLQkqIE1ha2VmaWxlLmFtIChlYXJtZWxmX29hYmkuYyk6IENoYW5nZXMgc3BhY2VzIHRvIHRhYi4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEZlYiAxNSAxODoyMTo0OCAxOTk5ICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogbGRleHAuaCAoc3RydWN0IGV0cmVlX3ZhbHVlX3R5cGUpOiBDaGFuZ2UgdmFsaWQgb250byB2YWxpZF9wLgotCi0JKiBsZGV4cC5jIChuZXdfYWJzKTogRGl0dG8uCi0JKG5ld19yZWwsIG5ld19yZWxfZnJvbV9zZWN0aW9uLCBmb2xkX2JpbmFyeSwgaW52YWxpZCwgZm9sZF9uYW1lLAotIAlleHBfZm9sZF90cmVlLCBleHBfYmlub3AsIGV4cF90cmlub3AsIHN0YXRfYWxsb2MsCi0gCWV4cF9nZXRfYWJzX2ludCk6IERpdHRvCi0KLQkqIGxkbGFuZy5jIChwcmludF9hc3NpZ25tZW50LCBsYW5nX3NpemVfc2VjdGlvbnMsCi0JbGFuZ19kb19hc3NpZ25tZW50cyk6IERpdHRvLgotCQotMTk5OS0wMi0xMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMpOiBOZXcgZnVuY3Rpb246IENoZWNrCi0JYWRkcmVzc2VzIGFzc2lnbmVkIHRvIHNlY3Rpb24gZm9yIG92ZXJsYXBzLgotCShsYW5nX3Byb2Nlc3MpOiBDYWxsIGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgaWYgc3VpdGFibGUuCi0KLQkqIGxkLmg6IEFkZCBuZXcgYm9vbGVhbiBmaWVsZCB0byBhcmdzX3R5cGUgc3RydWN0dXJlOgotCSdjaGVja19zZWN0aW9uX2FkZHJlc3NlcycuCi0KLQkqIGxkbWFpbi5jOiBJbml0aWFsaXNlIGNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzIGZpZWxkIHRvIHRydWUuCi0KLQkqIGxleHN1cC5jOiBBZGQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zICctLW5vLWNoZWNrLXNlY3Rpb25zJyBhbmQKLQknLS1jaGVjay1zZWN0aW9ucycuCi0KLQkqIGxkLnRleGluZm86IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAnLS1jaGVjay1zZWN0aW9ucycKLQlhbmQgJy0tbm8tY2hlY2stc2VjdGlvbnMnLgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgc3VwcG9ydCBmb3IgU3Ryb25nQVJNIHRhcmdldC4KLQotV2VkIEZlYiAgMyAxOTo0MTowMSAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IEp1c3Qgc2V0IFNFQ19LRUVQIG9uY2UuICBDaGVjayBmb3IKLQlhbiBvd25lciBvZiBhIHNlY3Rpb24gYmVmb3JlIHVzaW5nIGl0IHRvIGxvb2sgdXAgYSByZWxvYyB0eXBlLgotCURvbid0IHNldCBTRUNfS0VFUCBmb3IgdGhlIGFic29sdXRlIHNlY3Rpb24uCi0KLU1vbiBGZWIgIDEgMTE6Mzk6NDYgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5hbSAoZWFybWVsZl9vYWJpLm8pOiAgTmV3LgotICAgICAgICAqIE1ha2VmaWxlLmluOiAgUmVnZW5lcmF0ZS4KLSAgICAgICAgKiBjb25maWd1cmUudGd0IChhcm0tKi1vYWJpKTogIE5ldy4KLSAgICAgICAgKHRodW1iLSotb2FiaSk6ICBOZXcuCi0gICAgICAgICogZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaDogIE5ldy4KLSAgICAgICAgKiBlbXVsdGVtcGwvYXJtZWxmX29hYmkuZW06ICBOZXcuCi0KLTE5OTktMDEtMzEgMTc6NTc6MzEgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQWRkIHN1cHBvcnQgZm9yIC1mbGVhZGluZy11bmRlcnNjb3JlcwotCXN3aXRjaCBpbiBhbGwgbGlua2VyIGdlbmVyYXRlZCBzeW1ib2xzLgotCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjeyxsZX0qLSotdnh3b3Jrcyk6IEFkZCBhcyBhbGlhc2VzIGZvcgotCXBvd2VycGN7LGxlfS0qLWVhYmkuCi0KLVdlZCBKYW4gMjAgMTc6MDE6NDggMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1zb2xhcmlzMiopOiBOZXcgdGFyZ2V0LiAgRnJvbSBQYXZlbAotCVJvc2tpbiA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+LgotCi0xOTk5LTAxLTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ291bnQgbG9hZGFibGUgc2VjdGlvbnMgYXMKLSAgICAgICAgICBjb250cmlidXRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgc2VnbWVudC4KLQotMTk5OS0wMS0xNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IE9ubHkgdXBkYXRlIHRoZSBjdXJyZW50Ci0gICAgICAgICAgYWRkcmVzcyBvZiBhIHJlZ2lvbiBpZiB0aGUgc2VjdGlvbiBqdXN0IHBsYWNlZCBpbnRvIGl0IGlzIGFuCi0gICAgICAgICAgYWxsb2NhdGVkIHNlY3Rpb24uCi0KLTE5OTktMDEtMTIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZXBsYWNlIGVmcjMwLm8gd2l0aCBlZWxmMzJmcjMwLm8uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotCSogY29uZmlndXJlLnRndDogUmVwbGFjZSBmcjMwIHdpdGggZWxmMzJmcjMwLgotCi0JKiBlbXVscGFyYW1zL2VsZjMyZnIzMC5zaDogTmV3IGZpbGU6IFJlcGxhY2VzIGZyMzAuc2gsIGFuZCB1c2VzCi0JZ2VuZXJpYyBlbGYuc2Mgc2NyaXB0LiAgQWxzbyByZXBsYWNlcyB0aGUgLnN0YWNrIHNlY3Rpb24gd2l0aCBhCi0JdXNlciBkZWZpbmFibGUgc3ltYm9sIF9fc3RhY2suCi0KLTE5OTktMDEtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2ZyMzAuc2M6IEZpbGwgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdpdGggTk9QCi0JcGF0dGVybi4gCi0KLTE5OTktMDEtMDMgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2stREVKQUdOVSk6IE5vIGxvbmdlciBwcm92aWRlIEhPU1RJTkdfRU1VLAotCUhPU1RJTkdfQ1JUMCwgSE9TVElOR19MSUJTOyB0aGUgdGVzdCBzdWl0ZSBjYW4gZXh0cmFjdCB0aGVtIGZyb20KLQljb25maWd1cmUuaG9zdCBhbmQgY29uZmlndXJlLnRndCBub3cuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OC0xMi0yNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzLCBjYXNlIE9QVElPTl9SUEFUSCk6IEF2b2lkIGFkZGluZyBkdXBsaWNhdGUKLQllbGVtZW50cyB0byBycGF0aC4KLQotVGh1IERlYyAxMCAxMToxMjoyOCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IFJlbW92ZSBwZS1kbGwubyBhbmQgZGVmZmlsZXAuby4KLQkoQUxMX0VNVUxfRVhUUkFfT0ZJTEVTKTogTmV3IHZhcmlhYmxlLiAgUHV0IHRoZW0gaGVyZSBpbnN0ZWFkLgotCSogY29uZmlndXJlLmluOiBTZXQgRU1VTF9FWFRSQV9PRklMRVMgdG8gJChBTExfRU1VTF9FWFRSQV9PRklMRVMpCi0JaWYgY29uZmlndXJpbmcgd2l0aCBhbGwgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXApOiBNYWtlIHN0YXRpYy4KLQkocGVfZGxsX2RvX2RlZmF1bHRfZXhjbHVkZXMpOiBSZW1vdmVkLCB1bnVzZWQuCi0JKHBlX2RlZl9maWxlLCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcsIHBlX2RsbF9raWxsX2F0cywKLQlwZV9kbGxfc3RkY2FsbF9hbGlhc2VzKTogRG9uJ3QgaW5pdGlhbGl6ZSB0aGVtLCB0aGlzIGZpbGUgbWF5IGJlCi0JY29tcGlsZWQgbW9yZSB0aGFuIG9uY2UuCi0JKiBwZS1kbGwuYyAocGVfZGVmX2ZpbGUsIHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZywKLQlwZV9kbGxfZG9fZGVmYXVsdF9leGNsdWRlcywgcGVfZGxsX2tpbGxfYXRzLAotCXBlX2RsbF9zdGRjYWxsX2FsaWFzZXMpOiBEZWZpbmUgYW5kIGluaXRpYWxpemUgdGhlbSBoZXJlIGluc3RlYWQuCi0JKGdlbmVyYXRlX3JlbG9jKTogRml4IGFsbG9jYXRpb24gb2YgcmVsb2NfYWRkcmVzc2VzIGFycmF5IHRvIHVzZQotCWJmZF92bWEgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLiAgRml4IGVsZW1lbnQgc2l6ZSBpbiBxc29ydCBjYWxsLgotCShyZWxvY19zb3J0KTogQ29tcGFyZSBwb2ludGVycyB0byBiZmRfdm1hIGluc3RlYWQgb2YgdW5zaWduZWQKLQlsb25nLgotCi1Nb24gRGVjICA3IDIxOjEwOjA5IDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuICA8ai5qLnZhbmRlcmhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1taW5ndzMyKik6IEFkZCBjeWd3aW4gdGFyZ2V0IHNwZWNpZmljCi0JZmlsZXMuCi0KLVN1biBEZWMgIDYgMTY6MzM6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChtNjgqLSotZ251Kik6IE5ldyB0YXJnZXQuICBGcm9tIEF5bWVyaWMgVmluY2VudAotCTxheW1lcmljLnZpbmNlbnRAZW1pLnUtYm9yZGVhdXguZnI+LgotCi0xOTk4LTEyLTA0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2ZyMzAuc2ggKFRFWFRfU1RBUlRfQUREUik6IENoYW5nZSBURVhUX1NUQVJUX0FERFIKLQlmcm9tIDB4MTAwMDAwIHRvIDB4MTAwMDAgc28gdGhhdCBpdCBmaXRzIGluIDIwIGJpdHMuCi0KLVNhdCBOb3YgMjggMjI6MzI6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuaCAobGRlbXVsX3JlY29nbml6ZWRfZmlsZSk6IERlY2xhcmUuCi0KLVNhdCBOb3YgMjggMjI6MzA6NTUgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfd2lsZCk6IERvbid0IHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhbiBpbnB1dAotCWZpbGUgaWYgdGhlIGZpbGVuYW1lIGlzIGEgd2lsZGNhcmQgcGF0dGVybi4KLQotMTk5OC0xMS0yNSAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5oIChsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBuZXcgaG9vayAicmVjb2duaXplZF9maWxlIgotCSogbGRlbXVsLmMgKGxkZW11bF9yZWNvZ25pemVkX2ZpbGUpOiBuZXcgZnVuY3Rpb24sIG5ldyBob29rCi0JKiBsZGludC50ZXhpbmZvOiBkb2N1bWVudCBuZXcgaG9vay4KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBjYWxsIHJlY29nbml6ZWRfaG9vayBmb3IgYWxsIG9iamVjdHMgd2UKLQlkbyByZWNvZ25pemUsIGluIGNhc2UgdGhlIGVtdWxhdGlvbiBuZWVkcyB0byBoYW5kbGUgdGhlbQotCXNwZWNpYWxseS4gIFBFIERMTHMgdXNlIHRoaXMuCi0JKiBwZS1kbGwuYyAocGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlKTogdGFrZSBvdXQgaGFjayBhbmQgZGVidWcKLQlwcmludGZzCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2X3JlY29nbml6ZWRfZmlsZSk6IG5ldyBmdW5jdGlvbgotCShnbGRfaTQ4Nl91bnJlY29nbml6ZWRfZmlsZSk6IHRha2Ugb3V0IGhhY2sKLQotMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jIChmaWxsX2VkYXRhKTogZmlsbCBpbiB0aW1lc3RhbXAKLQkobWFrZV9oZWFkKTogbmFtZSBvYmplY3QgZmlsZXMgc2VxdWVudGlhbGx5IHRvIGVuc3VyZQotCXRoZXkgbGluayBpbiB0aGUgcmlnaHQgb3JkZXIuCi0JKG1ha2VfdGFpbCk6IHNhbWUgaGVyZQotCShwZV9wcm9jZXNzX2ltcG9ydF9kZWZzKTogdXNlIHNlcXVlbnRpYWwgbmFtZXMgZm9yIGJmZHMgdG8gZW5zdXJlCi0JcHJvcGVyIGxpbmsgb3JkZXIuCi0JKHBlX2ltcGxpZWRfaW1wb3J0X2RsbCk6IG5ldyBmdW5jdGlvbjsgaGFuZGxlcyBsaW5raW5nIGRpcmVjdGx5Ci0JYWdhaW5zdCBETExzIGJ5IHNpbXVsYXRpbmcgSU1QT1JUUyBkaXJlY3RpdmVzLiAgKiBlbXVsdGVtcGwvcGUuZW0KLQkoZ2xkX2kzODZwZV9iZWZvcmVfcGFyc2UpOiBoYWNrIGJmZCB0byBub3QgcmVjb2duaXplIC5kbGwgZmlsZXMKLQl2aWEgYmZkX3BlX2RsbF9ub3RfcmVjb2duaXplZF9oYWNrCi0KLTE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2cGVfcGFyc2VfYXJncyk6IENvbmRpdGlvbmFsaXplIGNhbGwgdG8KLQlwZV9kbGxfYWRkX2V4Y2x1ZGVzCi0KLU1vbiBOb3YgMjMgMTQ6MzY6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChhZnRlcl9wYXJzZSk6IE9ubHkgY3JlYXRlIGFuIHVuZGVmaW5lZCBlbnRyeQotCXN5bWJvbCBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkLgotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4NnBlX2FmdGVyX29wZW4pOiBjYWxsCi0JcGVfcHJvY2Vzc19pbXBvcnRfZGVmcwotCSogcGUtZGxsLmMgKHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSk6IGNhbGN1bGF0ZSBCQVNFIGZyb20KLQlwZV9kYXRhLCBvbmx5IHByaW50IGlmIGFjdHVhbGx5IHNldC4gIFByaW50IHZlcnNpb24gb25seSBpZgotCXNldC4KLQkoc2F2ZV9yZWxvY3MpOiBzYXZlIHJlbG9jcyBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0LgotCShtYWtlX29uZSk6IHN1cHBvcnQgaW50ZXJuYWwvZXh0ZXJuYWwgZGlmZmVyZW50IG5hbWVzLgotCShwZV9kbGxfZ2VuZXJhdGVfaW1wbGliKTogc3VwcG9ydCBuZXcgbWFrZV9vbmUKLQkocGVfcHJvY2Vzc19pbXBvcnRfZGVmcyk6IG5ldyBmdW5jdGlvbjsgaGFuZGxlcyBJTVBPUlQKLQlkaXJlY3RpdmVzIGluIC5kZWYgZmlsZXMuCi0KLUZyaSBOb3YgMjAgMTM6MDY6NDkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IENvcGUgd2l0aCBlbXB0eSBzeW1ib2wgbmFtZXMuCi0KLVRodSBOb3YgMTkgMTM6MzE6MTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IEFkZCBwcm92aXNpb24gb2YgJ19lbmQnIHN5bWJvbC4KLQotV2VkIE5vdiAxOCAxODoxODo0MyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0OiBjaGFuZ2UgcmVmcyBmcm9tIGN5Z3dpbjMyKiB0byBjeWd3aW4qLgotCSogYWNsb2NhbC5tNDogcmVnZW5lcmF0ZQotCSogY29uZmlndXJlLmluOiBkb24ndCBuZWVkIHRvIGNhbGwgQU1fQ1lHV0lOMzIuCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotTW9uIE5vdiAxNiAyMjoxNDowNyAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4Nl9maW5pc2gpOiBnZW5lcmF0ZSBpbXBvcnQgbGlicmFyeQotCSogZGVmZmlsZS5oOiBhZGQgaGludCBtZW1iZXIuCi0JKiBwZS1kbGwuYyAocGVfZGxsX2dlbmVyYXRlX2ltcGxpYik6IE5ldyBmdW5jdGlvbiB3aXRoIGhlbHBlcnM7Ci0gCWdlbmVyYXRlcyB0aGUgaW1wb3J0IGxpYnJhcnkgZGlyZWN0bHkgZnJvbSB0aGUgZXhwb3J0IHRhYmxlLgotCShmaWxsX2VkYXRhKTogcmVtZW1iZXIgdGhlIGFjdHVhbCBoaW50IGZvciB0aGUgaW1wb3J0IGxpYnJhcnkuCi0KLVNhdCBOb3YgMTQgMTQ6MzY6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC4xOiBTb21lIGNsZWFudXBzIGZyb20gTk9LVUJJIEhpcm90YWthIDxobm9rdWJpQHl5eS5vci5qcD4uCi0KLVRodSBOb3YgMTIgMTk6MjE6NTcgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9sZC5wb3Q6IFJlZ2VuZXJhdGVkLgotCSogcG8vUE9URklMRVMuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi1XZWQgTm92IDExIDE4OjEwOjE1IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYyAoZ2VuZXJhdGVfcmVsb2MpOiBkb24ndCBvdXRwdXQgUEUgcmVsb2NzIGZvciBzZWN0aW9ucwotIAl0aGF0IHdvbid0IGJlIGxvYWRlZC4KLQotV2VkIE5vdiAxMSAxMzo0NDo1NCAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGUtZGxsLmMgKGZpbGxfZWRhdGEpOiBkb24ndCBzdHJpcCB1bmRlcnNjb3JlcwotCi1UdWUgTm92IDEwIDIxOjI4OjE5IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBhZGRlZCBpMzg2cGUgb3B0aW9uIHN1bW1hcnkKLQotVHVlIE5vdiAxMCAxNzo1MzoxNyAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGUtZGxsLmMgKHByb2Nlc3NfZGVmX2ZpbGUpOiBwcm9wZXJseSBub3RlIHVuZGVmaW5lZCBleHBvcnRlZAotIAlzeW1ib2xzLCBjbGVhbiB1cCBvbGQgY29kZS4KLQkocGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlKTogZG9uJ3QgY3Jhc2ggaWYgcGVfZGVmX2ZpbGUgaXMgTlVMTAotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4Nl9wYXJzZV9hcmdzKTogYWRkCi0gCShlbi9kaXMpYWJsZS1zdGRjYWxsLWZpeHVwcwotCShwZV9maXh1cF9zdGRjYWxscyk6IHdhcm4gYWJvdXQgc3RkY2FsbCBmaXh1cHMKLQkoZ2xkX2kzODZfdW5yZWNvZ25pemVkX2ZpbGUpOiBtYWtlIGV4cG9ydGVkIHN5bWJvbHMgdW5kZWZzIHNvIHRoYXQKLSAJYXJjaGl2ZSBtZW1iZXJzIGdldCBwdWxsZWQgaW4KLQotVHVlIE5vdiAxMCAxNDo1MDo1MSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IEFkZCBLRUVQIGF0dHJpYnV0ZSB0byAuaW5pdCwKLSAgICAgICAgLmZpbmksIC5kdG9ycyBhbmQgLmN0b3JzLiAgQWRkIC5kYXRhIGFuZCAudGV4dAotICAgICAgICB3aWxkY2FyZHMgdG8gc3VwcG9ydCBzZWN0aW9uIGdhcmJhZ2UgY29sbGVjdGlvbi4KLQotTW9uIE5vdiAgOSAyMjo1Mjo1MCAxOTk4ICBESiBEZWxvcmllICA8ZGpAaW5keS5kZWxvcmllLmNvbT4KLQotCSogZGVmZmlsZXAueTogcHJvcGVybHkgaGFuZGxlIHJlbG9jcyB3aXRoIG11bHRpcGxlIGRlZl9maWxlcywKLQljYWNoZSBpbXBvcnQgbW9kdWxlIG5hbWVzCi0KLU1vbiBOb3YgIDkgMjI6NDQ6NTggMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jIChwcm9jZXNzX2RlZl9maWxlKTogZG9uJ3QgYXNzdW1lIGV4cG9ydHMgd29uJ3QgbW92ZQotCWR1cmluZyBhIHJlYWxsb2MKLQotTW9uIE5vdiAgOSAxNjo0MTozMCAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGUtZGxsLmM6IE5ldyBmaWxlOyBkaXJlY3Qgc3VwcG9ydCBmb3IgUEUgRExMcwotCSogZGVmZmlsZS5oOiBOZXcgZmlsZTsgZGlyZWN0IHN1cHBvcnQgZm9yIFBFIERMTHMKLQkqIGRlZmZpbGVwLnk6IE5ldyBmaWxlOyBkaXJlY3Qgc3VwcG9ydCBmb3IgUEUgRExMcwotCSogZW11bHRlbXBsL3BlLmVtOiBhZGQgZGlyZWN0IHN1cHBvcnQgZm9yIFBFIERMTHMKLQkqIGNvbmZpZ3VyZS50Z3Q6IGFsbG93IHRhcmdldC1zcGVjaWZpYyBleHRyYSBmaWxlcwotCSogY29uZmlndXJlLmluOiBhbGxvdyB0YXJnZXQtc3BlY2lmaWMgZXh0cmEgZmlsZXMKLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9hc3NpZ25tZW50KTogcmV0dXJuIHRoZSBhc3NpZ25tZW50IHNvIHRoYXQKLSAJb25lIGNhbiBjaGFuZ2UgdGhlIHZhbHVlIGxhdGVyIGJhc2VkIG9uIHRoZSBvYmplY3QgZmlsZXMgKHBlLWRsbAotIAlERUYgZmlsZXMgZG8gdGhpcykKLQkqIGxkaW50LnRleGluZm86IGFkZCBzZWN0aW9uIGZvciBlbXVsYXRpb24gd2Fsa3Rocm91Z2gKLQkqIE1ha2VmaWxlLmFtOiBhZGQgbmV3IGZpbGVzIGFuZCB0YXJnZXQtc3BlY2lmaWMgZXh0cmEgZmlsZXMKLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZfbGlzdF9vcHRpb25zKTogbGlzdCBkbGwtc3BlY2lmaWMKLQlvcHRpb25zLgotCSogcGUtZGxsLmMgKHByb2Nlc3NfZGVmX2ZpbGUpOiBhdXRvLWV4cG9ydCBldmVyeXRoaW5nIGlmCi0Jbm90aGluZyBpcyBvdGhlcndpc2UgZXhwb3J0ZWQuCi0JCi1XZWQgTm92ICA0IDE2OjM5OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgRlIzMCB0YXJnZXQuCi0JKiBjb25maWd1cmUudGd0OiBBZGQgc3VwcG9ydCBmb3IgRlIzMCB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGVtdWxwYXJhbXMvZnIzMC5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wL2ZyMzAuc2M6IE5ldyBmaWxlLgotCQotTW9uIE5vdiAgMiAxNDo0NzoxNSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGxkbWFpbi5jIChtYWluKTogIERvbid0IHJlcG9ydCBlcnJvciBmb3IgZHluYW1pYyBsaW5rcyBhbmQKLSAgICAgICAgLS1nYy1zZWN0aW9ucy4KLQotMTk5OC0xMC0yNiAxNjowNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zKTogQ2hhbmdlIHRleHQgb2YgLU8gdG8gT3B0aW1pemUgb3V0cHV0IGZpbGUiLgotCShwYXJzZV9hcmdzKTogU2V0IGxpbmtfaW5mby5vcHRpbWl6ZSBiYXNlZCBvbiAtTyBhcmd1bWVudC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBsaW5rX2luZm8ub3B0aW16ZSB0byBmYWxzZS4KLQkqIGxkLnRleGluZm86IERlc2NyaWJlIC1PIG9wdGlvbi4KLQkqIGxkLjE6IExpa2V3aXNlLgotCi1Nb24gT2N0IDEyIDE0OjI5OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IE1vdmUgLnNic3MgYW5kIC5zY29tbW9uIHNlY3Rpb25zIGludG8gdGhlaXIKLQlvd24gc2VnbWVudCwgc28gdGhhdCB0aGV5IGNhbiBiZSBuZXh0IHRvIHRoZSAuYnNzIHNlY3Rpb24gYW5kIHNvCi0JaW5pdGlhbGlzZWQgYnkgdGhlIHNhbWUgcGllY2Ugb2YgY29kZS4KLQotRnJpIE9jdCAgOSAxNTo1OTo1MiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZi5zYzogIE1lcmdlIC5zZGF0YS4qIGV0YyBzZWN0aW9ucy4KLSAgICAgICAgKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiAgU2V0IFNFQ19LRUVQIGZvcgotICAgICAgICBjdG9yIHNlY3Rpb25zLgotCi1Nb24gT2N0ICA1IDA5OjQwOjQzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogbGRtYWluLmMgKG1haW4pOiAgRXJyb3IgaWYgLS1nYy1zZWN0aW9ucyBhbmQKLSAgICAgICAgZHlhbm1pYyBsaW5raW5nLgotICAgICAgICAqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6ICBBZGQgS0VFUCBhdHRyaWJ1dGUgdG8gLmluaXQsCi0gICAgICAgIC5maW5pLCAuZHRvcnMgYW5kIC5jdG9ycy4gIEFkZCAuZGF0YSBhbmQgLnRleHQKLSAgICAgICAgd2lsZGNhcmRzIHRvIHN1cHBvcnQgc2VjdGlvbiBnYXJiYWdlIGNvbGxlY3Rpb24uCi0KLVdlZCBTZXAgMzAgMTE6MTk6MTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogUmVuYW1lIC5jYWxsX3RhYmxlIHNlY3Rpb24gdG8KLQkuY2FsbF90YWJsZV9kYXRhIGFuZCBjcmVhdGUgYSBuZXcgc2VjdGlvbiBjYWxsZWQKLQkuY2FsbF90YWJsZV90ZXh0LgotCi1TdW4gU2VwIDIwIDAwOjQzOjI2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgYWxpZ25tZW50IGF0IHRoZSBlbmQgb2YgdGhlIC5ic3MKLQlzZWN0aW9uLCBzbyB0aGF0IGl0IGlzIGluY2x1ZGVkIGluIHRoZSBtZW1zaXplIG9mIHRoZSBzZWdtZW50LgotCi1GcmkgU2VwIDE4IDEzOjQyOjQyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZW11bHRlbXBsL2VsZjMyLmVtIChnbGRfcGxhY2Vfb3JwaGFuKTogRG9uJ3QgcHJvY2VzcyBmb3IKLSAgICAgICAgc2VjdGlvbnMgd2l0aCBTRUNfRVhDTFVERSBmbGFnLgotCi1GcmkgU2VwICA0IDA5OjI0OjAyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaCAoVEVYVF9TSVpFKTogSW5jcmVhc2VkIHRvIDIwMDBLLgotCShEQVRBX1NJWkUpOiBJbmNyZWFzZWQgdG8gMjAwMEsuCi0KLVRodSBTZXAgIDMgMTc6MzA6NTggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChURU1QTEFURV9OQU1FKTogVXNlIGVsZjMyLgotCi1Nb24gQXVnIDMxIDAxOjA2OjAwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogTWFrZWZpbGUuYW06ICBDaGFuZ2UgYXJtZWxmLnNjIHRvIGVsZi5zYwotICAgICAgICAqIE1ha2VmaWxlLmluOiAgUmVnZW5lcmF0ZS4KLQotTW9uIEF1ZyAzMSAxMToxMjowNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmLnNoOiAgQ2hhbmdlIFNDUklQVF9OQU1FIHRvCi0gICAgICAgIGVsZi4gIENoYW5nZSBURVhUX1NUQVJUX0FERFIgdG8gMHg4MDAwLiAgRGVmaW5lCi0gICAgICAgIE9USEVSX1RFWFRfU0VDVElPTlMsIE9USEVSX0JTU19TWU1CT0xTIGFuZAotICAgICAgICBPVEhFUl9CU1NfRU5EX1NZTUJPTFMuCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmLnNjOiAgTW9kaWZ5IHRvIHVzZQotICAgICAgICBPVEhFUl9CU1NfRU5EX1NZTUJPTFMuCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgUmVtb3ZlIGZpbGUuCi0KLVR1ZSBBdWcgMTggMTI6MDU6MzQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbXVsdGVtcGwvYXJtZWxmLmVtIChnbGRfYXJtZWxmX2JlZm9yZV9hbGxvY2F0aW9uKToKLSAgICAgICAgQWRkIGJmZF8gcHJlZml4IHRvIGVsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gICAgICAgIGFuZCBlbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zLgotICAgICAgICAoZ2xkX2FybWVsZl9hZnRlcl9vcGVuKTogQWRkIGJmZF8gcHJlZml4IHRvCi0gICAgICAgIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcuCi0KLUZyaSBBdWcgMTQgMTU6MzQ6MjkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogbGRncmFtLnk6IEluY2x1ZGUgImxkY3Rvci5oIi4KLQkoc3RhdGVtZW50KTogQWNjZXB0IFNPUlQgYXJvdW5kIENPTlNUUlVDVE9SUy4KLQkqIGxkY3Rvci5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoY29uc3RydWN0b3JzX3NvcnRlZCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGN0b3JfcHJpbywgY3Rvcl9jbXApOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkobGRjdG9yX2J1aWxkX3NldHMpOiBTb3J0IGNvbnN0cnVjdG9ycyBpZiByZXF1ZXN0ZWQuCi0JKiBsZGN0b3IuaCAoY29uc3RydWN0b3JzX3NvcnRlZCk6IERlY2xhcmUuCi0JKiBsZGxhbmcuYyAocHJpbnRfc3RhdGVtZW50KTogUHJpbnQgc29ydGVkIENPTlNUUlVDVE9SUwotCWNvcnJlY3RseS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIHNvcnQgYXJvdW5kIENPTlNUUlVDVE9SUy4KLQkqIGxkLnRleGluZm8gKE91dHB1dCBTZWN0aW9uIEtleXdvcmRzKTogRG9jdW1lbnQgU09SVAotIAkoQ09OU1RSVUNUT1JTKS4KLQotVGh1IEF1ZyAxMyAxMjoyMDozOSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZW11bHBhcmFtcy9hcm1lbGYuc2g6ICBEZWZpbmUgVEVNUExBVEVfTkFNRSB0byBhcm1lbGYuCi0gICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZhcm0uc2M6ICBJbmNsdWRlIC5nbHVlXzd0IGFuZCAuZ2x1ZTcKLSAgICAgICBzZWN0aW9ucy4KLSAgICAgICAqIGVtdWx0ZW1wbC9hcm1lbGYuZW06IE5ldyBmaWxlLgotCi1UaHUgQXVnIDEzIDEyOjUyOjQ1IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKGxkLmR2aSk6IFVzZSAiIGluc3RlYWQgb2YgJyBmb3IgTUFLRUlORk8uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEF1ZyAxMSAxNjoxNzowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIENoYW5nZSB0ZXh0IHN0YXJ0IGFkZHJlc3MKLSAgICAgICAgYmFjayB0byB6ZXJvLgotCi1UdWUgQXVnIDExIDEwOjAxOjEyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL21uMTAyMDAuc2ggKE1BWF9QQUdFU0laRSk6IERlZmluZSB0byAxLgotCSogZW11bHBhcm1zL21uMTAzMDAuc2ggKE1BWF9QQUdFU0laRSk6IERlZmluZSB0byAxLgotCi1TdW4gQXVnICA5IDIwOjMxOjI3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgU2V0IHRleHQgc3RhcnQgYWRkcmVzcyB0bwotICAgICAgICAweDgwMDAuICBBZGQgX19ic3NfZW5kIGRlZmluaXRpb24uCi0KLVNhdCBBdWcgIDEgMTE6NDc6MzcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZhcm0uc2M6ICBOZXcgZmlsZS4KLSAgICAgICAgKiBlbXVscGFyYW1zL2FybWVsZi5zaDogU2V0IFNDUklQVF9OQU1FIHRvIGVsZmFybS4KLQotRnJpIEp1bCAzMSAxNTo1NjoxNiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmLnNoOiBOZXcgZmlsZS4KLSAgICAgICAgKiBjb25maWd1cmUudGd0OiAgUmVjb2duaXplIHRodW1iLWVsZiBhbmQgYXJtLWVsZi4KLSAgICAgICAgKiBNYWtlZmlsZS5hbSAoZWFybWVsZi5vKTogTmV3LgotICAgICAgICAqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgSnVsIDI0IDEyOjAwOjU3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IHJlbW92ZSB0aGUgZmlsZSBiZWZvcmUKLQljaGVja2luZyB3aGV0aGVyICQoYmluZGlyKSA9PSAkKHRvb2xkaXIpL2Jpbi4gIEZyb20gTWFjaWVqCi0JVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLnRndDogUmVjb2duaXplIGg4WzM1XTAwKi1jb2ZmKiBhcyB3ZWxsIGFzIC1obXMqLgotCi1UaHUgSnVsIDIzIDExOjE1OjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogSWYgQUxJR05NRU5UIGlzIGRlZmluZWQsIHVzZSBpdCB0byBzZXQKLQlhbGlnbm1lbnQgb2YgZW5kIHN5bWJvbC4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL3N1bjQuc2ggKEFMSUdOTUVOVCk6IERlZmluZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggKEFMSUdOTUVOVCk6IERlZmluZS4KLQkqIGxkaW50LnRleGluZm8gKGVtdWxhdGlvbiBwYXJhbWV0ZXJzKTogRG9jdW1lbnQgQUxJR05NRU5ULgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCBtaXNzaW5nIGJyZWFrIHN0YXRlbWVudC4KLQotCSogbGRsYW5nLmMgKGxhbmdfZ2Nfc2VjdGlvbnNfMSk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoIHRvCi0JYXZvaWQgd2FybmluZ3MuCi0KLVR1ZSBKdWwgMTQgMTU6NDI6MTcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaT84Ni0qLWJlb3N7cGUsZWxmLH0qKTogUmVjb2duaXplLgotCSogTWFrZWZpbGUuYW0gKGVpMzg2YmVvcy5vKTogTmV3LgotCSogZW11bHBhcmFtcy9pMzg2YmVvcy5zaDogTmV3IGZpbGUuCi0JKiBlbXVsdGVtcGwvYmVvcy5lbSwgc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2M6IE5ldyBmaWxlLgotCi1UdWUgSnVsIDE0IDE1OjM1OjQyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jOiBOZXcgb3B0aW9uIC0tdmVyc2lvbi1leHBvcnRzLXNlY3Rpb24uCi0JKiBsZC5oIChzdHJ1Y3QgYXJnc190eXBlKTogQWRkIHZlcnNpb25fZXhwb3J0c19zZWN0aW9uLgotCSogbGRsYW5nLmMgKGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfcHJvY2Vzcyk6IENhbGwgaXQuCi0KLU1vbiBKdWwgMTMgMTM6MjA6MjMgMTk5OCAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAdHJhbnNtZXRhLmNvbT4KLQotCSogbGRsZXgubDogQWNjZXB0IEFTU0VSVC4KLQkqIGxkZ3JhbS55IChleHApOiBBZGQgQVNTRVJUX0sgY2FzZS4KLQkqIGxkZXhwLmggKG5vZGVfdHlwZSk6IEFkZCBldHJlZV9hc3NlcnQgdG8gbm9kZV9jbGFzcyBlbnVtLgotCShldHJlZV90eXBlKTogQWRkIGFzc2VydF9zIGZpZWxkLgotCShleHBfYXNzZXJ0KTogRGVjbGFyZS4KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBIYW5kbGUgZXRyZWVfYXNzZXJ0LgotCShleHBfYXNzZXJ0KTogTmV3IGZ1bmN0aW9uLgotCShleHBfcHJpbnRfdHJlZSk6IEhhbmRsZSBldHJlZV9hc3NlcnQuCi0JKiBsZC50ZXhpbmZvIChNaXNjZWxsYW5lb3VzIENvbW1hbmRzKTogRG9jdW1lbnQgQVNTRVJULgotCi1XZWQgSnVsICA4IDE0OjAzOjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnk6IENoYW5nZSBNQVggdG8gTUFYX0sgYW5kIE1JTiB0byBNSU5fSywgdG8gYXZvaWQKLQljb25mbGljdHMgd2l0aCBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgQ2hhbmdlIGFsbCB1c2VzLgotCi0JKiBNYWtlZmlsZS5hbSAoTUFJTlRBSU5FUkNMRUFORklMRVMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1bCAgNyAxODowMzoyMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZHZlci50ZXhpKTogTmV3IHRhcmdldC4KLQkobGQuaW5mbywgbGQuZHZpKTogRGVwZW5kIHVwb24gbGR2ZXIudGV4aS4KLQkqIGxkLnRleGluZm86IEluY2x1ZGUgbGR2ZXIudGV4aS4gIE1lbnRpb24gdmVyc2lvbiBudW1iZXIgb24gdGl0bGUKLQlwYWdlIGFuZCBpbiB0b3Agbm9kZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVsICA2IDE0OjU1OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotc29sYXJpcyopOiBOZXcgdGFyZ2V0LgotCi1GcmkgSnVsICAzIDE0OjE5OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfc2VjdGlvbik6IERvbid0IGdldCBhbiBhc3NlcnRpb24gZmFpbHVyZSBpZiB0aGUKLQlzZWN0aW9uIGlzIGRpc2NhcmRlZC4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFVzZSBTT1JUIHRvIHNvcnQgc2VjdGlvbnMgYXBwcm9wcmlhdGVseS4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9ieV9maWxlX25hbWUpOiBSZW1vdmUuCi0JKHNvcnRfYnlfc2VjdGlvbl9uYW1lKTogUmVtb3ZlLgotCShzb3J0X3NlY3Rpb25zXzEsIHNvcnRfc2VjdGlvbnMpOiBSZW1vdmUuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IERvbid0IGNhbGwKLQlzb3J0X3NlY3Rpb25zLgotCShob2xkX3NlY3Rpb24sIGhvbGRfc2VjdGlvbl9uYW1lKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGhvbGRfdXNlLCBob2xkX3RleHQsIGhvbGRfcmRhdGEsIGhvbGRfZGF0YSwgaG9sZF9ic3MpOiBMaWtld2lzZS4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJld3JpdGUuICBMb29rIGZvciBhIGdvb2QKLQlwbGFjZSB0byBwdXQgdGhlIHNlY3Rpb24uICBBbGlnbiB0aGUgc2VjdGlvbi4gIFNvcnQgdGhlIGlucHV0Ci0Jc2VjdGlvbnMgYnkgbmFtZS4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBsZGxhbmcuYyAod2lsZF9zb3J0KTogV2hlbiBzb3J0aW5nIGJ5IGZpbGUgbmFtZSwgc29ydCBieSBhcmNoaXZlCi0JbmFtZSBmaXJzdC4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzZXRfcGVfc3Vic3lzdGVtKTogRG9uJ3QgY2FsbAotCWxkbGFuZ19hZGRfdW5kZWYuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9wYXJzZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVzZSBuZXcgYWZ0ZXJfcGFyc2UgZnVuY3Rpb24KLQlyYXRoZXIgdGhhbiBhZnRlcl9wYXJzZV9kZWZhdWx0LgotCi0JKiBsZGdyYW0ueSAoZXh0ZXJuX25hbWVfbGlzdCk6IERvIG5vdCByZXF1aXJlIHN5bWJvbHMgdG8gYmUKLQlzZXBhcmF0ZWQgYnkgY29tbWFzLgotCShpZmlsZV9wMSk6IEFkZCBFWFRFUk4uCi0JKiBsZGxleC5sOiBBY2NlcHQgRVhURVJOIGluIEJPVEggYW5kIFNDUklQVCBtb2RlIGFzIHdlbGwgYXMgTVJJCi0JbW9kZS4KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBNZW50aW9uIHRoYXQgRVhURVJOIGlzIGVxdWl2YWxlbnQgdG8gLXUuCi0JKE1pc2NlbGxhbmVvdXMgQ29tbWFuZHMpOiBEb2N1bWVudCBFWFRFUk4uCi0KLVdlZCBKdWwgIDEgMTk6NDA6MzQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZ2Nfc2VjdGlvbnMuCi0JKiBsZGdyYW0ueSAobGRncmFtX2hhZF9rZWVwLCBLRUVQKTogTmV3LgotCShpbnB1dF9zZWN0aW9uX3NwZWNfbm9fa2VlcCk6IFJlbmFtZSBmcm9tIG9sZCBpbnB1dF9zZWN0aW9uX3NwZWMuCi0JKGlucHV0X3NlY3Rpb25fc3BlYyk6IE5ldy4gIFJlY29nbml6ZSBLRUVQLgotCSogbGRsYW5nLmMgKHdpbGRfc2VjdGlvbik6IEhhbmRsZSBrZWVwIHNlY3Rpb25zLgotCShsYW5nX2djX3dpbGRfc2VjdGlvbiwgbGFuZ19nY193aWxkX2ZpbGUsIGxhbmdfZ2Nfd2lsZCk6IE5ldy4KLQkobGFuZ19nY19zZWN0aW9uc18xLCBsYW5nX2djX3NlY3Rpb25zKTogTmV3LgotCShsYW5nX3Byb2Nlc3MpOiBJbnZva2UgbGFuZ19nY19zZWN0aW9ucy4KLQkobGFuZ19hZGRfd2lsZCk6IEFkZCBrZWVwIGFyZ3VtZW50LiAgVXBkYXRlIGFsbCBjYWxsZXJzLgotCSogbGRsYW5nLmggKGxhbmdfd2lsZF9zdGF0ZW1lbnRfc3RydWN0KTogQWRkIGtlZXBfc2VjdGlvbnMuCi0JKiBsZGxleC5sIChLRUVQKTogTWF0Y2ggaXQuCi0JKiBsZG1haW4uYyAobWFpbik6IEVycm9yIG9uIC1yIGFuZCAtLWdjLXNlY3Rpb25zLgotCSogbGV4c3VwLmM6IEFkZCAtLWdjLXNlY3Rpb25zLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE1lcmdlIC50ZXh0LiogZXRjIHNlY3Rpb25zIGFwcHJvcHJpYXRlbHkuCi0JTWFyayBzdGFydHVwIHNlY3Rpb25zIHdpdGggS0VFUC4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0KLQkqIGxkLnRleGluZm86IFVwZGF0ZSBmb3IgLS1nYy1zZWN0aW9ucyBhbmQgS0VFUC4KLQotV2VkIEp1bCAgMSAxNToyMToyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFBldGVyIEpvcmRhbiA8cGpvcmRhbkBjaGxhLnVzYy5lZHU+OgotCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2M6IENvcnJlY3QgY29uc3RydWN0b3IgaGFuZGxpbmcgZm9yIC11LgotCi1UdWUgSnVuIDIzIDE1OjE3OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1sb2NhbCk6IE1ha2UgbGRzY3JpcHRzIHN1YmRpcmVjdG9yeS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVuIDIzIDE1OjE3OjA0IDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IGxldCBFWEVFWFQgaW50ZXJmZXJlCi0Jd2l0aCB0aGUgcHJvZ3JhbSB0cmFuc2Zvcm0gbmFtZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TdW4gSnVuIDIxIDIzOjU1OjE2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGQudGV4aW5mbzogTm90ZSB0aGF0IC1yZWxheCBtYXkgbWFrZSBzeW1ib2xpYyBkZWJ1Z2dpbmcKLQlpbXBvc3NpYmxlIG9uIHNvbWUgcGxhdGZvcm1zLgotCi1UdWUgSnVuIDE2IDEyOjUxOjEzIDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIE1ha2VmaWxlLmFtIChNYWtlZmlsZSk6IFJlbW92ZSB0YXJnZXQuCi0JKGNvbmZpZy5zdGF0dXMpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChwb3dlcnBjKi0qLWxpbnV4LWdudSopOiBOZXcgaG9zdC4KLQotRnJpIEp1biAxMiAxNzozODowNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjIChJTlBVVF9GSUxFUyk6IE9wdGlvbmFsIElOUFVUIHNwZWMuCi0KLQkqIGVtdWxwYXJhbXMvbTMycmVsZi5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IENoYW5nZSB0b3Agb2YKLQlzdGFjayB0byA4TUIuCi0KLUZyaSBKdW4gMTIgMTk6MzM6MTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoSEZJTEVTKTogUmVtb3ZlIGNvbmZpZy5oLgotCShFTVVMQVRJT05fT0ZJTEVTLCBQT1RGSUxFUyk6IE1vdmUgcGF0Y2ggb2YgTWF5IDE0IGZyb20KLQlNYWtlZmlsZS5pbiB0byBNYWtlZmlsZS5hbS4KLQkoZWFybWNvZmYuYyk6IERlcGVuZCB1cG9uIGFybWNvZmYuZW0sIG5vdCBnZW5lcmljLmVtLgotCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IENvcnJlY3QgbWlzc3BlbGxpbmcgaW4gJChQQUNLQUdFKS4KLQkoJChzcmNkaXIpLyQoUEFDS0FHRSkucG90KTogUGFzcyAtQyB0byAkKFhHRVRURVhUKS4KLQkqIE1ha2VmaWxlLmluLCBwby9QT1RGSUxFUy5pbiwgcG8vbGQucG90OiBSZWJ1aWxkLgotCi1GcmkgSnVuIDEyIDEzOjQzOjE3IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IElmIG1haW50YWluZXIgbW9kZSwgZGVwZW5kIG9uIC5wb3QgZmlsZS4KLQkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgotCi1UdWUgSnVuICA5IDA5OjM2OjQ4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IEFkZCBDT05TVCB0eXBlIG1vZGlmaWVyIHRvIGRlY2xhcmF0aW9uCi0Jb2YgJ3NlbmQnLgotCi1GcmkgSnVuICA1IDE4OjE5OjU5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKTogU2V0Ci0JY29uZmlnLmhhc19zaGFyZWQgdG8gdHJ1ZS4KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKToKLQlMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKToKLQlMaWtld2lzZS4KLQotVHVlIEp1biAgMiAxMjo1NTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IElmIHRoZSBlbnRyeSBzeW1ib2wgaXMgbm90IGZvdW5kLCB0cnkKLQlwYXJzaW5nIGl0IGFzIGEgbnVtYmVyLgotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IERvY3VtZW50IHRoaXMuCi0KLU1vbiBKdW4gIDEgMTQ6MDE6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChJbnB1dCBTZWN0aW9uIFdpbGRjYXJkcyk6IERvY3VtZW50IFNPUlQga2V5d29yZC4KLQotTW9uIE1heSAxOCAxMjo0Mjo1MyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IE5ldyBtZW1iZXIgaGFzX3NoYXJlZC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBpdC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKTogU2V0IGl0LgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBUcmVhdCAtc2hhcmVkIGFzIGVycm9yIGlmIG5vdCBzdXBwb3J0ZWQuCi0KLU1vbiBNYXkgMTggMTM6MTQ6NDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBKYXNvbiBNZXJyaWxsIDxqYXNvbkBjeWdudXMuY29tPjoKLQkqIGxkbGFuZy5jICh3aWxkX3NvcnQpOiBDb3JyZWN0IG9yZGVyIG9mIHNvcnQuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFB1dCAqY3J0YmVnaW4ubyBiZWZvcmUgb3RoZXIgLmN0b3JzIGFuZAotCS5kdG9ycy4KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgotCi1GcmkgTWF5IDE1IDAwOjIyOjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsZXgubDogUmVjb2duaXplIGtleXdvcmQgU09SVC4KLQkqIGxkZ3JhbS55IChjdXJyZW50X2ZpbGUpOiBDaGFuZ2UgdG8gc3RydWN0IHdpbGRjYXJkX3NwZWMuCi0JKCV1bmlvbik6IEFkZCBuZXcgZmllbGRzIGNuYW1lIGFuZCB3aWxkY2FyZC4KLQkod2lsZGNhcmRfbmFtZSwgd2lsZGNhcmRfc3BlYyk6IE5ldyBub250ZXJtaW5hbHMuCi0JKGZpbGVfTkFNRV9saXN0KTogVXNlIHdpbGRjYXJkX3NwZWMuCi0JKGlucHV0X3NlY3Rpb25fc3BlYyk6IENoYW5nZSBjdXJyZW50X2ZpbGUgdXNhZ2UuCi0JKiBsZC5oIChzdHJ1Y3Qgd2lsZGNhcmRfc3BlYyk6IERlZmluZS4KLQkqIGxkbGFuZy5oIChsYW5nX3dpbGRfc3RhdGVtZW50X3N0cnVjdCk6IEFkZCBuZXcgZmllbGRzCi0Jc2VjdGlvbnNfc29ydGVkIGFuZCBmaWxlbmFtZXNfc29ydGVkLgotCShsYW5nX2FkZF93aWxkKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGRsYW5nLmMgKHdpbGRfc29ydCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHdpbGRfc2VjdGlvbik6IFVzZSB3aWxkX3NvcnQuCi0JKHByaW50X3dpbGRfc3RhdGVtZW50KTogUHJpbnQgc29ydGluZyBpbmZvcm1hdGlvbi4KLQkobGFuZ19hZGRfd2lsZCk6IEFkZCBuZXcgcGFyYW1ldGVycyBzZWN0aW9uc19zb3J0ZWQgYW5kCi0JZmlsZW5hbWVzX3NvcnRlZC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIG1yaS5jIChtcmlfZHJhd190cmVlKTogVXBkYXRlIGNhbGxzIHRvIGxhbmdfYWRkX3dpbGQuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFNvcnQgLmN0b3JzLiogYW5kIC5kdG9ycy4qIGJ5IHNlY3Rpb24gbmFtZS4KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgotCi1UaHUgTWF5IDE0IDE4OjM5OjE2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvbTMycmVsZi5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZS4KLQotVGh1IE1heSAxNCAxNDo1MToyNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuaDogQWRkIG5ldyBwcm90b3R5cGU6IGxkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zLgotCShsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkOiBsaXN0X29wdGlvbnMuCi0JKiBsZGVtdWwuYyAobGRlbXVsX2xpc3Rfb3B0aW9ucyk6IE5ldyBmdW5jdGlvbi4gIENhbGwgdGhlCi0JbGlzdF9vcHRpb25zIGZpZWxkIG9mIHRoZSBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgZm9yIGVhY2gKLQlzdXBwb3J0ZWQgZW11bGF0aW9uLCBpZiBzdWNoIGEgZnVuY3Rpb24gaXMgcHJlc2VudC4KLQkqIGxleHN1cC5jIChoZWxwKTogQ2FsbCBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucy4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXzw+X2xpc3Rfb3B0aW9ucyk6IE5ldyBmdW5jdGlvbi4gIERlc2NyaWJlCi0JdGhlIHBlIGVtdWxhdGlvbiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtIChnbGQ8Pl9saXN0X29wdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JRGVzY3JpYmUgIHRoZSBhcm1jb2ZmIGVtdWxhdGlvbiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBBZGQgYSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbjoKLQktLXN1cHBvcnQtb2xkLWNvZGUuCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbTogRGl0dG8uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB0aGUgLS1zdXBwb3J0LW9sZC1jb2RlIG9wdGlvbi4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBlbXVsYXRpb24gZmlsZXMgZm9yIFBPVEZJTEVTLmluIHRhcmdldC4KLQkqIGVtdWx0ZW1wbC9wZS5lbTogSW50ZXJuYXRpb25hbGlzZSBzdWl0YWJsZSBzdHJpbmdzLgotCSogZW11bHRlbXBsL2FybWNvZmYuZW06IEludGVybmF0aW9uYWxpc2Ugc3VpdGFibGUgc3RyaW5ncy4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWJ1aWx0LgotCi1TdW4gTWF5IDEwIDIyOjM2OjMwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVR1ZSBBcHIgMjggMTk6MTg6MzAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IENvbmRpdGlvbmFsbHkgY2FsbCBzZXRsb2NhbGUuCi0JKiBsZC5oOiBJbmNsdWRlIDxsb2NhbGUuaD4gaWYgSEFWRV9MT0NBTEVfSC4KLQkoTENfTUVTU0FHRVMpOiBOb3cgY2FuIGJlIGRlZmluZWQgZXZlbiB3aGVuIEVOQUJMRV9OTFMuCi0KLU1vbiBBcHIgMjcgMTE6NTY6MjEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAyLjkuNAotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKSBbLXJwYXRoLWxpbmtdOiBNZW50aW9uIGxkLnNvLmNvbmYuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZCk6IE5ldyBmaWxlIHN0YXRpYwotCXZhcmlhYmxlLgotCShnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogQ2hlY2sgZm9yIHNoYXJlZCBsaWJyYXJpZXMKLQl0d2ljZSwgb25jZSB3aXRoIGZvcmNlIHNldCB0byAwIGFuZCBvbmNlIHdpdGggaXQgc2V0IHRvIDEuCi0gCShnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mKTogQWRkIGZvcmNlIHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQpOiBMaWtld2lzZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCk6IExpa2V3aXNlLiAgSWYgbm90IGZvcmNlLCBjaGVjawotCXdoZXRoZXIgdGhlIGxpYnJhcmllcyBuZWVkcyBhbnkgaW5jb21wYXRpYmxlIHZlcnNpb25zLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVdlZCBBcHIgMjIgMTY6MDE6MzUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChNS0lOU1RBTExESVJTKTogRG9uJ3QgbG9vayBpbiAkKHRvcF9zcmNkaXIpLgotCi1XZWQgQXByIDIyIDEyOjQwOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrLURFSkFHTlUpOiBBZGQgJChJTlRMTElCUykgdG8gTElCSUJFUlRZIHdoZW4KLQlpbnZva2luZyBydW50ZXN0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2hhbmdlIC1sIG9wdGlvbnMgaW50byAtLWxpYnJhcnkgb3B0aW9ucwotCXRvIGF2b2lkIGNvbmZ1c2lvbiBiZXR3ZWVuIC1saSBhbmQgLWxpYnJhcnkuCi0KLQkqIGxkLnRleGluZm8gKE1FTU9SWSk6IENsYXJpZnkgdXNlIG9mID5SRUdJT04uCi0KLVR1ZSBBcHIgMjEgMjM6MTI6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBzY3JpYmJsZXMuY3lnbnVzLmNvbT4KLQotCSogTWFueSBmaWxlczogQWRkZWQgZ2V0dGV4dCBpbnZvY2F0aW9ucyBhcm91bmQgdXNlci12aXNpYmxlCi0Jc3RyaW5ncy4KLQkqIGxkLmg6IEFkZGVkIGdldHRleHQtcmVsYXRlZCBpbmNsdWRlcyBhbmQgZGVmaW5lcy4KLQkqIGxkbWFpbi5jOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIHRleHRkb21haW4uCi0JKiBhY2NvbmZpZy5oIChFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VUVEVYVCwgSEFWRV9TVFBDUFksCi0JSEFWRV9MQ19NRVNTQUdFUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBDWV9HTlVfR0VUVEVYVC4gIENyZWF0ZSBwby9NYWtlZmlsZS5pbiBhbmQKLQlwby9NYWtlZmlsZS4gIFVzZSBBTV9QUk9HX0xFWC4KLQkoVERJUlMpOiBBQ19TVUJTVCBlYXJseSBvbiwgdG8gYXZvaWQgaGF2aW5nIHZhbHVlIHNwbGl0IHdoZW4gaXQKLQloYXBwZW5zIHRvIGNyb3NzIGxpbmUgOTAgb2YgdGhlIGdlbmVyYXRlZCBzZWQgc2NyaXB0LgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBOZXcgbWFjcm8uCi0JKFBPVEZJTEVTKTogTGlrZXdpc2UuCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkobGRfbmV3X0xEQUREKTogQWRkZWQgSU5UTExJQlMuCi0JKGxkX25ld19ERVBFTkRFTkNJRVMpOiBBZGRlZCBJTlRMREVQUy4KLQkqIHBvL01ha2UtaW4sIHBvL1BPVEZJTEVTLmluLCBwby9nYXMucG90OiBOZXcgZmlsZXMuCi0KLVR1ZSBBcHIgMjEgMjM6MDc6MDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChTaW1wbGUgRXhhbXBsZSk6IFJld3JpdGUgYSBmZXcgdGhpbmdzIGFzIHN1Z2dlc3RlZAotCWJ5IE5pY2sgQ2xpZnRvbiA8bmlja2NAY3lnbnVzLmNvbT4uCi0JKFBST1ZJREUpOiBMaWtld2lzZS4KLQotVHVlIEFwciAyMSAwOTo1NTowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IFJlbmFtZSBleHRlcm5hbCBhcm0gaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucwotCXRvIGNvbmZvcm0gdG8gQkZEIG5hbWluZyBjb252ZW50aW9ucy4gIEFkZCBjb2RlIHRvIF9hZnRlcl9vcGVuKCkKLQlmdW5jdGlvbiB0byBvYnRhaW4gYSBiZmQgZm9yIHVzZSBieSB0aGUgaW50ZXJ3b3JraW5nIGNvZGUuCi0KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBSZW5hbWUgZXh0ZXJuYWwgYXJtIGludGVyd29ya2luZyBmdW5jdGlvbnMKLQl0byBjb25mb3JtIHRvIEJGRCBuYW1pbmcgY29udmVudGlvbnMuICBBZGQgbmV3IF9hZnRlcl9vcGVuKCkKLQlmdW5jdGlvbiB0byBvYnRhaW4gYSBiZmQgZm9yIHVzZSBieSB0aGUgaW50ZXJ3b3JraW5nIGNvZGUuCi0KLVN1biBBcHIgMTkgMTk6MjM6MDkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucykgW2Nhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtXToKLQlVcGRhdGUgZG90IGFuZCB0aGUgZGVmYXVsdCBtZW1vcnkgc2VjdGlvbiBldmVuIHdoZW4gcmVsYXhpbmcuCi0KLVNhdCBBcHIgMTggMTg6NDE6MTIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IE1hbmlwdWxhdGUgdGhlIHNlY3Rpb24ncyBjb29rZWQgc2l6ZQotCXJhdGhlciB0aGFuIGl0cyByYXcgc2l6ZS4KLQotVHVlIEFwciAgNyAxMzozNToyOSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoVEVTVEJGRExJQik6IE5ldy4gIERlZmluZWQgYW5kIHN1YnN0aXR1dGVkLgotCSogTWFrZWZpbGUuYW0gKFRFU1RCRkRMSUIpOiBDaGFuZ2VkIHRvIEBURVNUQkZETElCQC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBcHIgIDYgMTU6MzM6MzkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGQuaW5mbyk6IEludm9rZSBtYWtlaW5mbyB3aXRoIC1JIG9wdGlvbnMgZGlyZWN0bHkKLQlyYXRoZXIgdGhhbiByZWx5aW5nIG9uIGRlZmF1bHQgcnVsZS4gIERvbid0IGRlcGVuZCB1cG9uCi0JYmZkc3VtbS50ZXhpLgotCShsZC5kdmkpOiBMaWtld2lzZS4KLQkoYmZkc3VtbS50ZXhpKTogUmVtb3ZlIHRhcmdldC4KLQkoQ0xFQU5GSUxFUyk6IFRha2UgYmZkc3VtbS50ZXhpIG91dCBvZiB2YWx1ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TdW4gQXByICA1IDEzOjA3OjU3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFVzZSBzaGVsbCB2YXJpYWJsZXMgdG8gYXZvaWQgZGVwZW5kaW5nIHVwb24KLQlob3cgJCBpcyBoYW5kbGVkIHdoZW4gZXhwYW5kaW5nIGEgc2hlbGwgc3Vic3RpdHV0aW9uLgotCi1GcmkgQXByICAzIDAwOjU2OjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBBZGQgbGQubG9nIGFuZCBsZC5zdW0uCi0JKERJU1RDTEVBTkZJTEVTKTogQWRkIHNpdGUuZXhwIGFuZCBzaXRlLmJhay4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IFB1dCB0aGUgdGRpcnMgaW4gYSBmaWxlIGFuZCB1c2UgQUNfU1VCU1RfRklMRSwKLQlyYXRoZXIgdGhhbiBpbiBhIHNoZWxsIHZhcmlhYmxlIGFuZCB1c2luZyBBQ19TVUJTVC4KLQkqIE1ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IFJlbW92ZSBsZHNjcmlwdHMuICBBZGQgdGRpcnMuCi0gCShkaXN0Y2xlYW4tbG9jYWwpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogbGQudGV4aW5mbzogQ29tcGxldGVseSByZXdyaXRlIGxpbmtlciBzY3JpcHQgZG9jdW1lbnRhdGlvbi4KLQotTW9uIE1hciAzMCAxMjo0NzozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotU2F0IE1hciAyOCAxNjo0ODoxOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogUmVtb3ZlIHRtcGRpci4KLQkobW9zdGx5Y2xlYW4tbG9jYWwpOiBOZXcgdGFyZ2V0IHRvIHJlbW92ZSB0bXBkaXIuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIGxkY3JlZi5jIChvdXRwdXRfY3JlZik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGxkZmlsZS5jIChsZGZpbGVfYWRkX2FyY2gpOiBMaWtld2lzZS4KLQkqIGxkbGFuZy5jIChsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbik6IExpa2V3aXNlLgotCSogbGV4c3VwLmMgKE9QVElPTl9DT1VOVCk6IExpa2V3aXNlLgotCShwYXJzZV9hcmdzKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6Ci0JTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBMaWtld2lzZS4KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrKTogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2FybWNvZmYuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBDb3JyZWN0IG5hbWUgKHdhcwotCU1PU1RDTEVBTkZJTEVTKS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDE2OjM5OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBQdXQKLQlBUk0gY29kZSBpbnNpZGUgaWZkZWYgVEFSR0VUX0lTX2FybXBlLgotCi1XZWQgTWFyIDI1IDExOjM0OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSAgPGhqbEBnbnUub3JnPjoKLQkqIE1ha2VmaWxlLmFtIChMRERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZS4KLQkoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogT25seSBpbmNsdWRlIC5pZGF0YVwkWzAtN10gaW4gLmlkYXRhIHdoZW4KLQlyZWxvY2F0aW5nLgotCi1UdWUgTWFyIDI0IDE1OjU5OjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjICgudGV4dCk6IEFkZCAuZ2x1ZV83IGFuZCAuZ2x1ZV83dCBzZWN0aW9ucyB0bwotCWhvbGQgQXJtL1RodW1iIHN0dWJzLgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9wZV9iZWZvcmVfYWxsb2NhdGlvbik6IENhbGwKLQlhcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoZm9yIEFSTS9UaHVtYiB0YXJnZXRzKSBpbiBvcmRlciB0bwotCWdhdGhlciBpbnRlcndvcmtpbmcgc3RiIGluZm9ybWF0aW9uLgotCi1Nb24gTWFyIDIzIDE4OjU0OjE1IDE5OTggIEpvZWwgU2hlcnJpbGwgIDxqb2VsQE9BUmNvcnAuY29tPgotCi0JKiBjb25maWd1cmUudGd0OiAoc2gqLSotcnRlbXMqKTogU3dpdGNoZWQgZnJvbSBFTEYgdG8gQ09GRi4KLQotRnJpIE1hciAyMCAxOToxNzoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1UaHUgTWFyIDE5IDE0OjU0OjQ1IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBUaGUgQ3lnd2luMzIgbGlicmFyeSB1c2VzIGEgLmRhdGEkbm9jb3B5Ci0Jc2VjdGlvbiB0byBhdm9pZCBjb3B5aW5nIGNlcnRhaW4gZGF0YSBvbiBmb3JrLiAgVGhlIGxpbmtlciB1c2VkIHRvCi0JaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKLQlicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIFRoZSBmaXggaXMgdG8gcmVuYW1lIHRoZQotCXNlY3Rpb24JIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlcgotCV9fZGF0YV9lbmRfXy4KLQotV2VkIE1hciAxOCAwOTo0MjoyNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHRodW1iLXBlIHRhcmdldC4KLQotU3VuIE1hciAgOCAyMzozNDoxNCAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChzcGFyY2xpdGUqLSotZWxmKTogQWRkZWQuCi0KLU1vbiBNYXIgIDIgMTk6MjQ6MDggMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiB0aGUgZGVmYXVsdCBtZW1vcnkgcmVnaW9uIGlzCi0JKmRlZmF1bHQqLCBzZWUgaWYgdGhlcmUgaXMgYSBtZW1vcnkgcmVnaW9uIHRoYXQgY291bGQgYmUgdXNlZC4KLQotVGh1IEZlYiAyNiAxNzowOTo1MyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogQWRkIHN1cHBvcnQgZm9yIC5laXRfdiBzZWN0aW9uIGFuZCBwdXQKLQlpdCBhdCAweGZmZmZmMDIwLgotCSogZW11bHBhcmFtcy9kMzB2e2VsZixfbyxfZX0uc2g6IERpdHRvLgotCi1Nb24gRmViIDIzIDE3OjQ2OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzb3J0X3NlY3Rpb25zKTogUGVybWl0IHRoZSB3aWxkY2FyZCB0byBpbmNsdWRlCi0JYSB0cmFpbGluZyAnKicgd2hlbiBzb3J0aW5nIGdyb3VwZWQgc2VjdGlvbnMuCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogSW5jbHVkZSBncm91cGVkIHNlY3Rpb25zIHVzaW5nIE5BTUVcJCouICBPbmx5Ci0JaW5jbHVkZSB0aGVtIHdoZW4gcmVsb2NhdGluZy4KLQotV2VkIEZlYiAxOCAyMzozOTo0NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogSW5zdGFsbCBwcm9wZXJseSB3aGVuIGxuCi0JZmFpbHMgb3IgdG9vbGRpciA9PSBwcmVmaXguCi0KLUZyaSBGZWIgMTMgMTU6MjQ6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCi1UaHUgRmViIDEyIDE0OjEwOjQ0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBbGlnbiB0aGUgX2VuZCBzeW1ib2wgYWNjb3JkaW5nIHRvIHRoZSBFTEYKLSAJZm9ybWF0IHNpemUuICBGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPi4KLQotCU5ldEJTRCBwYXRjaGVzIGZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogY29uZmlndXJlLmhvc3QgKGFscGhhKi0qLW5ldGJzZCopOiBOZXcgaG9zdC4KLQkqIGNvbmZpZ3VyZS50Z3QgKGFscGhhKi0qLW5ldGJzZCosIHBvd2VycGMtKi1uZXRic2QqKTogTmV3Ci0JdGFyZ2V0cy4KLQotCSogbGV4c3VwLmMgKGhlbHApOiBVcGRhdGUgYnVnLWdudS11dGlscyBhZGRyZXNzLgotCSogbGQudGV4aW5mbyAoQnVnIFJlcG9ydGluZyk6IExpa2V3aXNlLgotCi1UdWUgRmViIDEwIDE4OjA1OjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IFdhcm4gaWYgc29tZSBtZW1vcnkgcmVnaW9ucyB3ZXJlCi0JZGVmaW5lZCwgYnV0IGEgbG9hZGFibGUgc2VjdGlvbiBpcyBnb2luZyBpbnRvIHRoZSBkZWZhdWx0IG1lbW9yeQotCXJlZ2lvbi4KLQotVHVlIEZlYiAxMCAxNjoxNzoyMCAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxkbGV4LmwgKFZfSURFTlRJRklFUik6IEFsbG93ICcuJyBhcyBzeW1ib2wgcHJlZml4LgotCi1UdWUgRmViIDEwIDE1OjA5OjQ1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1ha2VmaWxlKTogQWRkIHRhcmdldCwgZm9yIGRlcGVuZGVuY2llcyBvbgotCWNvbmZpZ3VyZS5ob3N0IGFuZCBjb25maWd1cmUudGd0LgotCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZ3VyZS50Z3Q6IENoYW5nZSAtbGludXgqIHRvIC1saW51eC1nbnUqLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDkgMTM6NDQ6NDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjICguc3RhY2spOiBNb3ZlIHN0YWNrIHRvIDB4MDAuLjdGRkUuCi0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoUkVBRE9OTFlfU1RBUlRfQUREUik6IFJlYWQgb25seSBzZWN0aW9uCi0gCW1vdmVkIHRvIDB4MDAuLi4uLjQuCi0KLVNhdCBGZWIgIDcgMTU6NDE6MjYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVGh1IEZlYiAgNSAxMjoxNjoxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBSZW1vdmUgJHtSRUxPQ0FUSU5HLTB9IGZyb20gYWxsIHNlY3Rpb25zLgotCUZyb20gVGhvbWFzIGRlIExlbGxpcyA8dGRlbEB3cnMuY29tPi4KLQotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1XZWQgRmViICA0IDEzOjAyOjMyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxkX25ld19MREFERCk6IFJlbW92ZSBATEVYTElCQC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViICAyIDE5OjM0OjU0IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQlBZGQgdG1zMzIwYzMwIHN1cHBvcnQ6Ci0JKiBjb25maWd1cmUudGd0ICh0aWMzMC0qLSphb3V0KiwgdGljMzAtKi0qY29mZiopOiBOZXcgdGFyZ2V0cy4KLQkqIGVtdWxwYXJhbXMvdGljMzBhb3V0LnNoOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvdGljMzBjb2ZmLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL3RpYzMwYW91dC5zYzogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2M6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGV0aWMzMGFvdXQubyBhbmQKLQlldGljMzBjb2ZmLm8uCi0JKGV0aWMzMGFvdXQuYywgZXRpYzMwY29mZi5jKTogTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEZlYiAgMiAxNDoxMDo1OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDb3JyZWN0IEhPU1RJTkdfQ1JUMCBpbiBhbHBoYSotKi1saW51eCogY2FzZSB0bwotCWFjY2VwdCBlaXRoZXIgbGQuc28gb3IgbGQtbGludXguc28uCi0KLUZyaSBKYW4gMzAgMTk6MTY6MjggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKHtDQyxDWFh9X0ZPUl9UQVJHRVQpOiBDaGFuZ2UgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotCXRvIHRyYW5zZm9ybS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi1GcmkgSmFuIDMwIDE5OjE1OjE3IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogUHV0IC5keW5zYnNzIGluIC5zYnNzLgotCi1GcmkgSmFuIDMwIDExOjQzOjQ5IDE5OTggIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIE1ha2VmaWxlLmFtIChlZWxmMzJic21pcC5jLCBlZWxmMzJsc21pcC5jKTogTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEphbiAyOSAxNjowNDoyMSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogbGRmaWxlLmMgKHNsYXNoKTogU2V0IHRvIGJhY2tzbGFzaCBpZiBfV0lOMzIgYnV0IG5vdAotCV9fQ1lHV0lOMzJfXy4KLQkobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBJZiBfX01TRE9TX18gb3IgX1dJTjMyLCBhY2NlcHQgYQotCWxlYWRpbmcgYmFja3NsYXNoIG9yIGEgbGVhZGluZyB4OiBhcyBhbiBhYnNvbHV0ZSBwYXRoLgotCShsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUpOiBVc2Ugc2xhc2ggcmF0aGVyIHRoYW4gLyB3aGVuCi0JZ2VuZXJhdGluZyBuYW1lIHRvIHRyeS4KLQkqIGxleHN1cC5jIChQQVRIX1NFUEFSQVRPUik6IERlZmluZS4KLQkoc2V0X2RlZmF1bHRfZGlybGlzdCk6IFVzZSBQQVRIX1NFUEFSQVRPUiByYXRoZXIgdGhhbiAnOicuCi0KLVdlZCBKYW4gMjggMTQ6MDY6MzAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCAoRUxGU0laRSk6IDY0Ci0JKFRFWFRfU1RBUlRfQUREUik6IFJvdW5kIG9mZiwgc2luY2UgU0laRU9GX0hFQURFUlMgaXMgYWRkZWQgbGF0ZXIuCi0JKERBVEFfUExUKTogTmVlZGVkIGJ5IHY5IGFiaS4KLQotV2VkIEphbiAyOCAxNjozNzoyNyAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotbWluZ3czMiopOiBOZXcgZW50cnkuCi0KLVdlZCBKYW4gMjggMTU6NTE6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE9ubHkgaW5jbHVkZSBsaW5rb25jZSBzZWN0aW9ucyBpbiBmaW5hbAotCXNlY3Rpb25zIHdoZW4gcmVsb2NhdGluZy4KLQotV2VkIEphbiAyOCAxNDoxMDowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBBZGQgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZXMgb2YKLQlpbmZvcm1hdGlvbiBpbmNsdWRlZCBpbiBhIGxpbmsgbWFwLgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogTWVudGlvbiBMREVNVUxBVElPTiBpbiBkZXNjcmlwdGlvbiBvZiAtbS4KLQkoRW52aXJvbm1lbnQpOiBNZW50aW9uIExERU1VTEFUSU9OLgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQ2xhcmlmeSAtLWV4cG9ydC1keW5hbWljIGEgYml0LgotCi1UaHUgSmFuIDIyIDE2OjA3OjIzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkbGV4LmwgKDxTQ1JJUFQ+e1dJTERDSEFSfSopOiBUYWtlIGNhcmUgZm9yIHRoZSBjb21tZW50cyB0aGlzCi0JcGF0dGVybiBjb3VsZCBtYXRjaC4KLQotV2VkIEphbiAyMSAyMjoyNjo0NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzKTogV2hlbiBkb2luZwotCWEgcmVsb2NhdGVhYmxlIGxpbmssIHNldCB0aGUgaW1hZ2UgYmFzZSB0byAwLCBhbmQgZG9uJ3QgZGVmaW5lIHRoZQotCXZhcmlvdXMgc3ltYm9scy4KLQkqIGVtdWxwYXJhbXMvaTM4NnBlLnNoIChSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVCk6IERlZmluZS4KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBTd2FwIHRoZSAuZGF0YSBhbmQgLmJzcyBzZWN0aW9ucyBzbyB0aGF0Ci0JLmRhdGEgY29tZXMgZmlyc3QuICBJZiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB1c2UKLQlSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgc3RhcnQgdGhlCi0Jc2VjdGlvbnMgYXQgMCwgYW5kIGRvbid0IGRlZmluZSBhbnkgc3ltYm9scy4KLQotCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X2RlZmF1bHQpOiBDb3JyZWN0IHBhcmVudGhpc2l6YXRpb24gb2YKLQlleHByZXNzaW9uLgotCi1XZWQgSmFuIDIxIDIxOjIwOjMyIDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBEb24ndCBpbmNsdWRlIHN5cy90eXBlcy5oIGFuZCBzeXMvc3RhdC5oCi0JaGVyZTsgdGhleSBhcmUgaW5jbHVkZWQgYWxyZWFkeSB2aWEgc3lzZGVwLmguCi0KLVR1ZSBKYW4gIDYgMTM6NDA6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaTk2MC5zYzogRG9uJ3QgZXhwbGljaXRseSBzZXQgLmRhdGEgYW5kIC5ic3Mgc3RhcnQuCi0KLUZyaSBKYW4gIDIgMjA6MTU6MzcgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChhdHRyaWJ1dGVzX29wdCk6IFBhc3MgcmVnaW9uIHBvaW50ZXIgdG8KLQlsYW5nX3NldF9mbGFncywgbm90ICZyZWdpb24tPmZsYWdzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19tZW1vcnlfZGVmYXVsdCk6IE5ldyBmdW5jdGlvbiB0byBmaWd1cmUgb3V0IGEKLQlkZWZhdWx0IG1lbW9yeSByZWdpb24gZm9yIGEgc2VjdGlvbiBpZiBpdCB3YXMgbm90IHNwZWNpZmllZC4KLQkobGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCk6IFplcm8gZmxhZ3MsIG5vdF9mbGFncyBmaWVsZC4KLQkobGFuZ19tYXB7LF9mbGFnc30pOiBQcmludCBhdHRyaWJ1dGUgZmxhZ3MgaW4gbWVtb3J5IG1hcC4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogQ2FsbCBsYW5nX21lbW9yeV9kZWZhdWx0IHRvIGdldCBkZWZhdWx0Ci0JbWVtb3J5IHJlZ2lvbi4KLQkobGFuZ19zZXRfZmxhZ3MpOiBJbXBsZW1lbnQgYXR0cmlidXRlIGZsYWdzIGZvciByZWFsLiAgVGFrZSBuZXcKLQlhcmd1bWVudCB0byBnaXZlIHRoZSBmbGFncyB3ZSBhcmUgdG8gc2tpcCBmb3IgdGhpcyByZWdpb24uCi0KLQkqIGxkbGFuZy5oIChtZW1vcnlfcmVnaW9uX3N0cnVjdCk6IEFkZCBub3RfZmxhZ3MgZmllbGQsIG1ha2UgYm90aAotCWZsYWdzIGZpZWxkcyBmbGFnd29yZCB0eXBlLgotCShsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlKTogTWFrZSBmbGFncyBmaWVsZCBmbGFnd29yZCB0eXBlLgotCShsYW5nX3NldF9mbGFncyk6IFVwZGF0ZSBwcm90b3R5cGUgdG8gbWF0Y2ggbmV3IGNhbGxpbmcgc2VxdWVuY2UuCi0JKGxhbmdfbWVtb3J5X3JlZ2lvbl9kZWZhdWx0KTogQWRkIHByb3RvdHlwZS4KLQotCSogZW11bHBhcmFtcy9kMzB2e19lLF9vLGVsZn0uc2ggKHtURVhULERBVEEsRU1FTX1fREVGX1NFQ1RJT04pOgotCURlZmluZSB3aGV0aGVyIG9yIG5vdCB0aGUgcmVnaW9uIGdldHMgZGVmYXVsdCBzZWN0aW9ucywgYW5kIGlmIHNvLAotCXdoYXQgc2VjdGlvbnMuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2MgKE1FTU9SWSk6IFNldCB1cCB3aGljaCBvZiB0aGUgcmVnaW9ucyBnZXQKLQlkZWZhdWx0IHNlY3Rpb25zLgotCi1UaHUgSmFuICAxIDIyOjU4OjA0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICguZWhfZnJhbWUpOiBMaW5rIGludG8gdGhlIGRhdGEgc2VjdGlvbi4KLQotVGh1IEphbiAgMSAxODowNDo1MSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogRml4IHR5cG8uCi0JKiBzY3JpcHR0ZW1wbC9oODMwMHMuc2M6IExpa2V3aXNlLgotCi1TdW4gRGVjIDIxIDEyOjUxOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRleHAuYyAoZm9sZF9uYW1lKTogRG9uJ3QgY3Jhc2ggaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEKLQlzZWN0aW9uIHdpdGggbm8gb3V0cHV0IHNlY3Rpb24sIHN1Y2ggYXMgYSBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLgotCi1XZWQgRGVjIDE3IDEyOjE0OjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBLZWVwIHRyYWNrIG9mIHdoZXJlIHdlIGFyZSBpbiB0aGUgb3B0aW9uCi0JcGFyc2luZyBiZWZvcmUgY2FsbGluZyBsZGVtdWxfcGFyc2VfYXJncywgc28gdGhhdCB3ZSBkb24ndCBjYWxsIGl0Ci0JbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgYXJndW1lbnQgYW5kIGNvbmZ1c2UgdGhlIGdldG9wdAotCWludGVybmFscy4KLQotVGh1IERlYyAxMSAwOTowMDoxNSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoZDMwdi1lbGYtKik6IFJlbmFtZSBkMzB2ZWxmX2UgdG8gZDMwdl9lIGFuZAotCWQzMHZlbGZfbyB0byBkMzB2X28gdG8gd29yayBpbiBET1MgZW52aXJvbm1lbnRzLgotCSogTWFrZWZpbGUue2FtLGlufTogRGl0dG8uCi0KLQkqIGVtdWxwYXJhbXMvZDMwdl97byxlfTogUmVuYW1lIGZyb20gZDMwdmVsZl97byxlfS4KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZl97byxlfTogRGVsZXRlZC4KLQotV2VkIERlYyAxMCAxNzo0MDowOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBBZGQgZ2x1ZSBzZWN0aW9ucyAoY29kZSB0YWtlbiBmcm9tIEFybQotCWJyYW5jaCkuCi0KLQkqIGVtdWxwYXJhbXMvYXJtY29mZi5zaCAoVEVNUExBVEVfTkFNRSk6IFNldCB0byBhcm1jb2ZmLgotCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbTogTmV3IGZpbGUsIGltcG9ydGVkIGZyb20gQXJtIGJyYW5jaC4KLQotV2VkIERlYyAxMCAxNDoxMDo0NCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogQWRkIC5yZWwgYW5kIC5yZWxhIHNlY3Rpb25zIGZvciBhbGwKLQlkZWZpbmVkIHNlY3Rpb25zLiAgU2V0IHVwIF9fe0QsQ31UT1Jfe0xJU1QsRU5EfV9fLiAgQWRkIG9uY2hpcCBhbmQKLQlleHRlcm5hbCBtZW1vcnkgc2VjdGlvbnMgZm9yIHJvZGF0YS4gIERlbGV0ZSAuc3RyaW5nLCAucm9kYXRhMSwKLQlhbmQgLmRhdGExIHNlY3Rpb25zLgotCi1UdWUgRGVjICA5IDE1OjI4OjE3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIE9jdCAyMyBjaGFuZ2VzIHRvIE1ha2VmaWxlLmluIGhlcmUuCi0KLQkqIE1ha2VmaWxlLnthbSxpbn06IChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZDEwdmVsZi5vLgotCi0JKiBNYWtlZmlsZS57YW0saW59OiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXRpYzgwY29mZi5vLgotCi0JKiBNYWtlZmlsZS57YW0saW59OiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWQzMHZlbGZ7LF9lLF9vfS5vLgotCShlZDMwdmVsZl9lLmMpOiBMaWtlIGQzMHZlbGYsIGV4Y2VwdCAudGV4dC8uZGF0YS9ldGMgYWx3YXlzIGdvIGluCi0JZXh0ZXJuYWwgbWVtb3J5LgotCShlZDMwdmVsZl9vLmMpOiBMaWtlIGQzMHZlbGYsIGV4Y2VwdCAudGV4dC8uZGF0YS9ldGMgYWx3YXlzIGdvIGluCi0Jb25jaGlwIG1lbW9yeS4KLQotCSogZW11bHBhcmFtcy9kMzB2ZWxmLnNoIChTVEFDS19TVEFSVF9BRERSKTogVG9wIG9mIGRlZmF1bHQKLQlzdGFjay4KLQkoe1RFWFQsREFUQSxFTUVNfV9TSVpFKTogU2l6ZXMgb2YgdGhlIDMgbWVtb3J5IGFyZWFzLgotCSh7VEVYVCxEQVRBLEJTU31fTUVNT1JZKTogV2hpY2ggbWVtb3J5IHJlZ2lvbiAudGV4dCwgLmRhdGEsIGFuZAotCS5ic3Mgc2hvdWxkIGdvIGluLgotCi0JKiBlbXVscGFyYW1zL2QzMHZlbGZfe2Usb30uc2g6IE5ldyBmaWxlcyB0byBiZSBleHBsaWNpdCB3aGV0aGVyCi0JLnRleHQsIC5kYXRhLCBldGMgZ28gaW4gZXh0ZXJuYWwgbWVtb3J5IG9yIG9uY2hpcCBtZW1vcnkuCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKGQzMHYtKi0qZXh0Kik6IE5ldyBjb25maWd1cmF0aW9uIHRvIGRlZmF1bHQKLQkudGV4dCwgLmRhdGEsIGV0Yy4gaW4gZXh0ZXJuYWwgbWVtb3J5LgotCShkMzB2LSotKm9uY2hpcCopOiBOZXcgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0IC50ZXh0LCAuZGF0YSwKLQlldGMuIGluIG9uY2hpcCBtZW1vcnkuCi0JKGQzMHYtKi0qKTogQWRkIGQzMHZlbGZfe2Usb30gZW11bGF0aW9ucy4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogQWxsb3cgLnRleHQsIC5kYXRhLCAuYnNzIHRvIGJlIHB1dCBpbgotCWVpdGhlciB0aGUgb25jaGlwIHRleHQvZGF0YSBhcmVhcyBvciB0aGUgZXh0ZXJuYWwgbWVtb3J5IGFyZWEuCi0JKE1FTU9SWSk6IEdldCBzaXplcyBmcm9tIGQzMHZlbGYuc2guCi0JKC5le2RhdGEsdGV4dCxic3N9KTogUHV0IHNlY3Rpb25zIGluIHRoZSBleHRlcm5hbCBtZW1vcnkgcmVnaW9uLgotCSguc3RleHQpOiBQdXQgc2VjdGlvbiBpbiB0aGUgb25jaGlwIHRleHQgcmVnaW9uLgotCSguc3tkYXRhLGJzc30pOiBQdXQgc2VjdGlvbnMgaW4gdGhlIG9uY2hpcCBkYXRhIHJlZ2lvbi4KLQkoX19zdGFjayk6IEFzc2lnbiBmcm9tICR7U1RBQ0tfU1RBUlRfQUREUn0uCi0JKC50ZXh0KTogUHV0IGluICR7VEVYVF9NRU1PUll9IG1lbW9yeSByZWdpb24uCi0JKC5kYXRheywxfS8uc3RyaW5ncy8ucm9kYXRheywxfSk6IFB1dCBpbiAke0RBVEFfTUVNT1JZfSBtZW1vcnkKLQlyZWdpb24uCi0JKC5ic3MpOiBQdXQgaW4gJHtCU1NfTUVNT1JZfSBtZW1vcnkgcmVnaW9uLgotCi1UdWUgRGVjICAyIDEwOjE0OjQ3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgdGFyZ2V0LgotCi1TYXQgTm92IDIyIDE1OjIzOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsZXgubDogRG9uJ3QgZGVmaW5lIGhleF9tb2RlLiAgQ29ycmVjdCBudW1iZXIgcmVnZXhwIHRvIG5vdAotCWFjY2VwdCBoZXggZGlnaXRzIHdpdGhvdXQgYSBsZWFkaW5nICQgb3IgMHguICBIYW5kbGUgbGVhZGluZyAkCi0JY29ycmVjdGx5LiAgUGFzcyAwIHJhdGhlciB0aGFuIGhleF9tb2RlIHRvIGJmZF9zY2FuX3ZtYS4KLQkqIGxkbGV4LmggKGhleF9tb2RlKTogRG9uJ3QgZGVjbGFyZS4KLQotU3VuIE5vdiAxNiAyMDoxNjo0NSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMzB2ZWxmLnNoICh7REFUQSxFTUVNfV9TVEFSVF9BRERSKTogRGVmaW5lIGFzIHN0YXJ0Ci0Jb2YgaW50ZXJuYWwgZGF0YSBhcmVhIGFuZCBleHRlcm5hbCBtZW1vcnkgb24gY2hpcC4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogRGVmaW5lIGEgTUVNT1JZIHJlZ2lvbiB0aGF0IGRlc2NyaWJlcwotCXRoZSAzIHJlZ2lvbnMgb2YgbWVtb3J5IG9uIHRoZSBjaGlwLiAgUHV0IC50ZXh0Ly5pbml0Ly5maW5pIGludG8KLQl0aGUgdGV4dCBtZW1vcnkgcmVnaW9uLCBwdXQgb3RoZXIgc2VnbWVudHMgaW50byB0aGUgZGF0YSBtZW1vcnkKLQlyZWdpb24uICBBZGQgbW9yZSBvZiB0aGUgc3RhbmRhcmQgZWxmIHNlY3Rpb25zLiAgRGVmYXVsdCBfX3N0YWNrCi0JdG8gYmUgMHgyMDAwODAwMCwgd2hpY2ggaXMgMSBieXRlIGJleW9uZCBlbmQgb2YgdGhlIGludGVybmFsIGRhdGEKLQlyZWdpb24uCi0KLVRodSBOb3YgMTMgMTM6NDU6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogTWFrZSBGcmVlQlNEIGEgaTM4NmJzZAotIAl2YXJpYW50LgotCi1TdW4gTm92ICAyIDE0OjUxOjM2IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChhbHBoYSotKi1saW51eCopOiBDb3JyZWN0IEhPU1RJTkdfQ1JUMC4gIFNldAotCUhPU1RJTkdfTElCUy4KLQotVGh1IE9jdCAzMCAxMjoyNTo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCB3YXJuX21pc21hdGNoIGZpZWxkLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIHdhcm5fbWlzbWF0Y2ggZmllbGQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtLW5vLXdhcm4tbWlzbWF0Y2ggb3B0aW9uLgotCSogbGRsYW5nLmMgKGlnbm9yZV9iZmRfZXJyb3IpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsYW5nX2NoZWNrKTogSWYgd2Fybl9taXNtYXRjaCBpcyBmYWxzZSwgZG9uJ3Qgd2FybiBhYm91dAotCW1pc21hdGNoZWQgaW5wdXQgZmlsZXMuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCBuZXcgb3B0aW9uLgotCi1UaHUgT2N0IDIzIDE0OjM4OjE4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IFJlbmFtZSBsaW5rZXIgc3ltYm9sICdfc3RhY2snIHRvICdfX3N0YWNrJwotCXRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIEMgY29kZSB3aGljaCBpcyBkZWZpbmluZyBhIHZhcmlhYmxlIGNhbGxlZAotCSdzdGFjaycuCi0KLVRodSBPY3QgMjMgMDA6NTc6NDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAZG90LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IE1vdmUgZWVsZjY0X3NwYXJjLm8gLi4uCi0JKEFMTF82NF9FTVVMQVRJT05TKTogLi4uIGhlcmUuCi0JKGVlbGY2NF9zcGFyYy5jKTogVGVtcGxhdGUgc2hvdWxkIGJlIGVsZjMyIG5vdCBnZW5lcmljLgotCSogZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCAoVEVNUExBVEVfTkFNRSk6IE5ldyBkZWZpbml0aW9uLgotCi1UaHUgT2N0IDIzIDAwOjQ0OjIwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgc3BhcmM2NC0qLWxpbnV4Ki4KLQkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCwgTk9QKTogTmV3LgotCi1XZWQgT2N0IDIyIDExOjI5OjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFB1dCAuZWhfZnJhbWUgaW4gLnJkYXRhLgotCi1GcmkgT2N0IDE3IDAwOjAwOjEzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSk6IE9ubHkgY2hlY2sgZ2xvYmFsczw9PmxvY2FscywKLQlzaW5jZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZXhwb3J0IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotCXN5bWJvbC4KLQotV2VkIE9jdCAxNSAxNDo1MjozNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBQdXQgLnN0YWIgYW5kIC5zdGFic3RyIHNlY3Rpb25zIGF0IGVuZC4KLQotV2VkIE9jdCAgOCAxMjozNzowNSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0LCBjb25maWd1cmUuaG9zdDogQ2hhbmdlIGFscGhhLSotKiB0byBhbHBoYSotKi0qOwotCWNvbmZpZy5ndWVzcyBub3cgcmVjb2duaXplcyBhbHBoYWV2NSBldGMuCi0KLUZyaSBPY3QgIDMgMTQ6MjM6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogRG9uJ3QgdHJlYXQKLQktcyBhbmQgLXUgYXMgLXN0YXRpYyBhbmQgLXVuaXguCi0KLVRodSBPY3QgIDIgMTg6NDA6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogUmV3cml0ZSBmbGFnIGhhbmRsaW5nIGZvciBjbGFyaXR5LiAgSWYgd2UKLSAJYXJlIG5vdCBhZGRpbmcgdGhlIGZpcnN0IGlucHV0IHNlY3Rpb24sIGFuZCBTRUNfUkVBRE9OTFkgaXMgY2xlYXIKLSAJb24gdGhlIG91dHB1dCBzZWN0aW9uLCB0aGVuIGRvbid0IGNvcHkgaXQgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbi4KLSAgCUlmIFNFQ19SRUFET05MWSBpcyBub3Qgc2V0IG9uIHRoZSBpbnB1dCBzZWN0aW9uLCB0aGVuIGNsZWFyIGl0IG9uCi0gCXRoZSBvdXRwdXQgc2VjdGlvbi4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotc2dpLWlyaXhbNTZdKik6IFVzZSBlbGYzMmJzbWlwIHJhdGhlciB0aGFuCi0JZWxmMzJibWlwLgotCShtaXBzKmVsLSotbGludXgqKTogQ2hhbmdlIGVsZjMybG1pcCB0byBlbGYzMmxzbWlwIGFuZCBlbGYzMmJtaXAKLQl0byBlbGYzMmJzbWlwLgotCShtaXBzKi0qLWxpbnV4Kik6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoOiBOZXcgZmlsZTsganVzdCBsaWtlIGVsZjMyYm1pcC5zaCwgYnV0Ci0Jc2V0dGluZyBFTlRSWSB0byBfX3N0YXJ0LgotCSogZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoOiBOZXcgZmlsZTsganVzdCBsaWtlIGVsZjMybG1pcC5zaCwgYnV0Ci0Jc2V0dGluZyBFTlRSWSB0byBfX3N0YXJ0LgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBbHdheXMgc2V0IEVOVFJZIHRvIF9zdGFydCBpZiBpdCB3YXMgbm90Ci0JYWxyZWFkeSBzZXQuCi0KLVdlZCBPY3QgIDEgMTY6NDE6MDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy92ODUwLnNoIChST1pEQVRBX1NUQVJUX0FERFIsIFJPU0RBVEFfU1RBUlRfQUREUik6IE5ldwotCVZhcmlhYmxlcy4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogTW92ZSByZWFkIG9ubHkgYXJlYXMgb3V0IG9mIHplcm8gYW5kIHNtYWxsCi0JZGF0YSBzZWN0aW9ucyBhbmQgaW50byB0aGVpciBvd24gc2VjdGlvbnMuCi0KLVdlZCBTZXAgMjQgMTY6NTk6MTUgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUudGd0IChzaCotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIHNoLSotZWxmKi4KLQotV2VkIFNlcCAyNCAxMTozMzoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKFNlY3Rpb24gT3B0aW9ucyk6IEltcHJvdmUgZG9jdW1lbnRhdGlvbiBvZiBOT0xPQUQKLQlkaXJlY3RpdmUuCi0KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIFNlcCAyMiAxNzoyNDowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBSZXZlcnQgcGF0Y2ggb2YgU2VwdGVtYmVyIDMuCi0KLVdlZCBTZXAgMTcgMTY6NDU6MzQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0sIE1ha2VmaWxlLmluOiBBZGQgcnVsZSBmb3IgZXY4NTAuYwotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCB2ODUwIHRhcmdldC4KLQotV2VkIFNlcCAxNyAxNjo0MzozOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3Y4NTAuc2ggKENBTExfVEFCTEVfU1RBUlRfQUREUik6IE5ldyBlbnRyeS4KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IEFkZCBjYWxsIHRhYmxlIGRhdGEgYXJlYQotCi1Nb24gU2VwIDE1IDExOjI5OjEzIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgY2hhbmdlIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IFB1dCAucm9kYXRhIGluIHRoZSAudGV4dCBzZWN0aW9uLgotCi1UdWUgU2VwICA5IDA3OjQ5OjU2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBuaW5lbW9vbnMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCk6IFJlbW92ZSBleHRyYW5lb3VzCi0JaW5pdGlhbGl6YXRpb24gb2YgcC4KLQotVGh1IFNlcCAgNCAwOTowMzozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBJbgotCWV4cHJlc3Npb24gcHJvZHVjZWQgZm9yIC1icFQgYW5kIC1icEQgb3B0aW9ucywgYWxpZ24gdG8gYSAzMiBieXRlCi0JYm91bmRhcnkgcmF0aGVyIHRoYW4gYW4gOCBieXRlIGJvdW5kYXJ5LgotCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBQdXQgLnRvY2JzcyBhdCBzdGFydCBvZiAuYnNzIHNlY3Rpb24uCi0KLQkqIGxkbWlzYy5oLCBsZG1pc2MuYywgbGRjcmVmLmM6IFJlbmFtZSBmaW5mbyB0byBsZmluZm8sIHRvIGF2b2lkCi0JZnVuY3Rpb24gbmFtZSBjb25mbGljdCB3aXRoIEFJWCA0LjIgdW5pc3RkLmggaGVhZGVyIGZpbGUuCi0KLVdlZCBTZXAgIDMgMTU6MTI6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogQ2xlYXIgU0VDX0hBU19DT05URU5UUyBmcm9tIGEKLQlub2xvYWRfc2VjdGlvbi4KLQotRnJpIEF1ZyAyOSAwMDozMjozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZF9uZXdfREVQRU5ERU5DSUVTKTogUmVtb3ZlIEBMRVhMSUJALgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBBdWcgMjggMTA6MTI6MTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoYXJjLSotZWxmKik6IFJlY29nbml6ZS4KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlYXJjZWxmLm8uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGVtdWxwYXJhbXMvYXJjZWxmLnNoOiBOZXcgZmlsZS4KLQotV2VkIEF1ZyAyMCAxMToxNDoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkY2FyZHApOiBEb24ndCBsZXQgYSBiYWNrc2xhc2ggYnkgaXRzZWxmIGNhdXNlIGEKLQlwYXR0ZXJuIHRvIGJlIHRyZWF0ZWQgYXMgYSB3aWxkY2FyZCBwYXR0ZXJuLgotCi0JKiBsZGdyYW0ueSAoYXR5cGUpOiBBY2NlcHQgcGFyZW50aGVzZXMgd2l0aCBubyB0eXBlLgotCi0JKiBsZC50ZXhpbmZvIChTZWN0aW9uIERlZmluaXRpb24pOiBDbGFyaWZ5IHVzZSBvZiB3aGl0ZXNwYWNlLgotCShTZWN0aW9uIFBsYWNlbWVudCk6IExpa2V3aXNlLgotCi1Nb24gQXVnIDE4IDExOjEyOjAzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi1Nb24gQXVnIDE4IDExOjEyOjAzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi1TYXQgQXVnICA5IDAwOjQyOjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxkLmluZm8pOiBDaGFuZ2UgZGVwZW5kZW5jeSBmcm9tCi0JJChCRkRESVIpL2RvYy9iZmRzdW1tLnRleGkgdG8gYmZkc3VtbS50ZXhpLgotCShsZC5kdmkpOiBMaWtld2lzZS4KLQkoYmZkc3VtbS50ZXhpKTogTmV3IHRhcmdldC4KLQkoQ0xFQU5GSUxFUyk6IEFkZCBiZmRzdW1tLnRleGkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLCBmcm9tIG9sZCBhY2xvY2FsLm00LgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX0lOSVRfQVVUT01BS0UgYW5kIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZQotCXNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZQotCUFDX0NPTkZJR19IRUFERVIgd2l0aCBBTV9DT05GSUdfSEVBREVSLiAgQ2FsbCBBQ19QUk9HX1lBQ0MsCi0JQUNfUFJPR19MRVgsIGFuZCBBQ19ERUNMX1lZVEVYVC4gIENhbGwgQU1fTUFJTlRBSU5FUl9NT0RFLAotCUFNX0NZR1dJTjMyLCBhbmQgQU1fRVhFRVhULiAgRG9uJ3QgY2FsbCBDWV9DWUdXSU4zMiBvciBDWV9FWEVFWFQuCi0JKiBjb25maWd1cmUuaG9zdDogRG9uJ3Qgc2V0IEhMREZMQUdTLCBITERFTlYsIG9yIFJQQVRIX0VOVlZBUi4KLQkqIGFjY29uZmlnLmg6IE1lbnRpb24gUEFDS0FHRSBhbmQgVkVSU0lPTi4KLQkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgotCSogbGR2ZXIuYyAobGRfcHJvZ3JhbV92ZXJzaW9uKTogU2V0IGxkX3Byb2dyYW1fdmVyc2lvbiBmcm9tCi0JVkVSU0lPTi4KLQkqIGxkZ3JhbS55LCBsZGxleC5sOiBSZXBsYWNlIFZFUlNJT04gd2l0aCBWRVJTSU9OSy4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotTW9uIEp1bCAyOCAxOTowNDo1MCAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBVc2UgQ1lHV0lOIGFuZCBFWEVFWFQgYXV0b2NvbmYgbWFjcm8gdG8gbG9vayBmb3IKLSAgICAgICAgd2luMzIgZGVwZW5kZW5jaWVzLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjEyLgotICAgICAgICAqIE1ha2VmaWxlLmluOiBBZGQgJChFWEVFWFQpIHRvIGV4ZWN1dGFibGUuCi0KLVR1ZSBKdWwgMjIgMTg6NTA6MzggMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBlbXVscGFyYW1zL2kzODZnbzMyLnNoIChPVVRQVVRfRk9STUFUKTogU2V0IHRvICJjb2ZmLWdvMzIiLgotCShTRUdNRU5UX1NJWkUpOiBTZXQgdG8gMHgyMDAuCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYzogUmV3cml0ZS4KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKTogTmV3IHRhcmdldC4KLQotTW9uIEp1bCAgNyAxMjozOTo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIE1hbmZyZWQgSG9sbHN0ZWluIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPjoKLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NTZdODYtKi1saW51eCpsaWJjMSopOiBSZW5hbWVkIGZyb20KLQlpWzM0NTZdODYtKi1saW51eCouCi0JKGlbMzQ1Nl04Ni0qLWxpbnV4Kik6IE5ldyBob3N0LgotCi1UaHUgSnVuIDI2IDEzOjU0OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFB1dCAucnNyYyBhZnRlciAucmVsb2MuICBQdXQgaW5wdXQgLnJzcmMKLQlzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IC5yc3JjIHNlY3Rpb24uCi0KLVdlZCBKdW4gMjUgMTI6NDg6NDEgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLSotbGludXgqbGliYzEqKTogUmVuYW1lZCBmcm9tCi0JYG02OCotKi1saW51eConLgotCShtNjgqLSotbGludXgqKTogTmV3IGNvbmZpZ3VyYXRpb24gZm9yIHVzZSB3aXRoIEdOVSBsaWJjIDIuCi0KLU1vbiBKdW4gMTYgMTk6MTg6MjEgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBDb3JyZWN0IC5yZWxhLnNkYXRhIGVudHJpZXMuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogUHV0IHRoZSBQTFQgYmV0d2VlbiB0aGUgc21hbGwgYW5kIGxhcmdlCi0JQlNTIHNlZ21lbnRzLgotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoVEVYVF9TVEFSVF9BRERSKTogVGhlIEFCSSBzYXlzIGBBCi0JcHJvZ3JhbSBiYXNlIG9mIDB4MDIwMDAwMDAgaXMgcmVjb21tZW5kZWQuLi4nIGJlY2F1c2Ugb3RoZXJ3aXNlCi0Jc2hhcmVkIGxpYnJhcmllcyBhcmUgbGVzcyBlZmZpY2llbnQuICBXZSB1c2UgMHgwMTgwMDAwMCBiZWNhdXNlCi0Jb3RoZXJ3aXNlIGl0J3MgaW1wb3NzaWJsZSB0byBicmFuY2ggdG8gbG9jYXRpb24gMCwgZm9yIGluc3RhbmNlIGlmCi0JeW91IGhhdmUgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCi1Nb24gSnVuIDE2IDEyOjQ5OjM2IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3BsYWNlX3VuZGVmaW5lZHMpOiBBZGQgXG4gaW4gZWluZm8gY2FsbC4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBsZGxleC5sOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL21pcHNlY29mZi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6Ci0JTGlrZXdpc2UuCi0JKGNoZWNrX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JTGlrZXdpc2UuCi0JKiBtcHctZXBwY21hYy5jIChnbGRwcGNtYWNvc19yZWFkX2ZpbGUpOiBMaWtld2lzZS4KLQkqIG1wdy1pZHRtaXBzLmMgKGdsZG1pcHNpZHRfYWZ0ZXJfb3Blbik6IExpa2V3aXNlLgotCShjaGVja19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShnbGRtaXBzaWR0X2FmdGVyX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9jaG9vc2VfbW9kZSk6IFJlbW92ZSB1bnVzZWQgZWluZm8gYXJndW1lbnQuCi0KLUZyaSBKdW4gIDYgMjM6NDc6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogQWRkIHplcm9lcyBhZnRlciAuaWRhdGEkMyB0byBtYXJrIHRoZSBlbmQgb2YKLQl0aGUgaW1wb3J0IGxpc3QuCi0KLVRodSBNYXkgMjkgMTM6MTM6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBEb24ndAotCWNyYXNoIGlmIGFuIG91dHB1dCBzZWN0aW9uIGhhcyBubyBCRkQgc2VjdGlvbi4KLQotRnJpIE1heSAyMyAxNToyMzoyNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBBZGQgZW50cnkgZm9yIHRoZSBuZXcgInRhc2stbGluayIgb3B0aW9uLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIHRoZSAidGFzay1saW5rIiBvcHRpb24uCi0JKE9QVElPTl9UQVNLX0xJTkspOiBBZGQgZGVmaW5lLgotCi1XZWQgTWF5IDIxIDE3OjQ0OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBDb3JyZWN0IGNoZWNrIG9mIGZjbG9zZSByZXR1cm4gdmFsdWUgd2hlbgotCWhhbmRsaW5nIC0tZm9yY2UtZXhlLXN1ZmZpeC4KLQotVGh1IE1heSAxNSAxMTozNToyOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IEFkZCB0ZXN0IG9mIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUKLQljYWxsIHRvIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKCkuCi0KLU1vbiBNYXkgMTIgMjM6MjI6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBSZW1vdmUuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFNldCBFTlRSWSBiYXNlZCBvbiB0YXJnZXQuICBQZXJtaXQKLQlURVhUX0RZTkFNSUMgdG8gY29udHJvbCAuZHluYW1pYyBzZWdtZW50LiAgUGVybWl0Ci0JU0hMSUJfVEVYVF9TVEFSVF9BRERSIHRvIHNldCBzdGFydCBvZiBzaGFyZWQgb2JqZWN0LiAgU3VwcG9ydAotCUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMuICBQdXQgLnN0dWIgaW4gLnRleHQuICBPbmx5IHB1dAotCS5nbnUubGlua29uY2UudCogaW4gLnRleHQgd2hlbiByZWxvY2F0aW5nLiAgU3VwcG9ydAotCU9USEVSX1RFWFRfU0VDVElPTlMuICBTdXBwb3J0IFNITElCX0RBVEFfQUREUiBhcyB3ZWxsIGFzCi0JREFUQV9BRERSLiAgU3VwcG9ydCBPVEhFUl9HT1RfU1lNQk9MUyBhbmQgT1RIRVJfR09UX1NFQ1RJT05TLgotCSogZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIChTQ1JJUFRfTkFNRSk6IFNldCB0byBlbGYuCi0JKERBVEFfQUREUik6IERvbid0IHNldC4KLQkoSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUyk6IFJlbmFtZSBmcm9tIE9USEVSX1JFQURPTkxZX1NFQ1RJT05TLgotCShPVEhFUl9URVhUX1NFQ1RJT05TKTogU2V0LgotCShPVEhFUl9HT1RfU0VDVElPTlMpOiBSZW5hbWUgZnJvbSBPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMuCi0JKE1BQ0hJTkUpOiBTZXQgdG8gZW1wdHkgc3RyaW5nLgotCSogZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyZWxtaXAuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMmJtaXAuc2g6IExpa2V3aXNlLiAgQWxzbzoKLQkoVEVYVF9EWU5BTUlDKTogU2V0LgotCSogZW11bHBhcmFtcy9lbGYzMmxtaXBzLnNoOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChlZWxmMzJibWlwcy5jKTogRGVwZW5kIHVwb24gZWxmLnNjIHJhdGhlciB0aGFuCi0JZWxmbWlwcy5zYy4KLQkoZWVsZjMyZWJtaXBzLmMsIGVlbGYzMmVsbWlwcy5jLCBlZWxmMzJsbWlwLmMpOiBMaWtld2lzZS4KLQotTW9uIE1heSAxMiAxMToxMTowNiAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBEb24ndCBhbGlnbiB0aGUgZGF0YSBzZWdtZW50IG9uIHRoZSBuZXh0IDgKLQlieXRlIGJvdW5kYXJ5LCBpbnN0ZWFkIGxldCB0aGUgbGlua2VyIHVzZSB3aGF0ZXZlciB0aGUgaW5kaXZpZHVhbAotCXNlY3Rpb25zIHJlcXVpcmUuCi0KLUZyaSBNYXkgIDkgMTc6NDU6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1nbnUqKTogRG9uJ3QgaW5jbHVkZSBNYWNoIHN1cHBvcnQuCi0KLVR1ZSBNYXkgIDYgMTM6MjE6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBTZWFuIE1jTmVpbCA8c2VhbkBtY25laWwuY29tPjoKLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9ieV9maWxlX25hbWUpOiBTb3J0IGJ5IGFyY2hpdmUgbmFtZQotCWZpcnN0LgotCShzb3J0X3NlY3Rpb25zKTogU29ydCBhbGwgc2VjdGlvbnMsIG5vdCBqdXN0IHNlY3Rpb25zIGluIHRoZSBzYW1lCi0JYXJjaGl2ZS4KLQotTW9uIE1heSAgNSAxODoxOTo1NSAxOTk3ICBQaGlsaXAgQmx1bmRlbGwgIDxwamIyN0BjYW0uYWMudWs+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QsIGNvbmZpZ3VyZS5ob3N0OiBjb3BlIHdpdGggJyotKi1saW51eC1nbnVhb3V0JwotCXRhcmdldHMuCi0KLUZyaSBNYXkgIDIgMTU6NTQ6MjggMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyAoLnRleHQpOiBBZGQgYSBsZWFkaW5nIHVuZGVyc2NvcmUgdG8KLQlfX3tELEN9VE9SX3tMSVNULEVORH1fXyBkZWZpbmF0aW9ucy4gIFJlYXJyYW5nZSB0aGUgb3JkZXIgb2YgaXRlbXMKLQlpbiB0aGUgLnRleHQgc2VjdGlvbi4gIE1vdmUgLmNvbnN0LCAuY3RvcnMsIC5kdG9ycyBpbnRvIHNlcGFyYXRlCi0Jc2VjdGlvbnMuCi0KLVdlZCBBcHIgMzAgMTI6MjM6MjEgMTk5NyAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjIChfXy5pbml0cC5lbmQsIF9ldGV4dCk6IEFkZGVkIHdoaXRlc3BhY2UKLQlhcm91bmQgYXNzaWdubWVudCBvZiBjdXJyZW50IGxvY2F0aW9uIHBvaW50ZXIuCi0KLVRodSBBcHIgMTcgMTM6MDc6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBNYWtlIHN1cmUgdGhlIHNldCBpcyBhbGlnbmVkCi0JYXBwcm9wcmlhdGVseS4KLQotVHVlIEFwciAxNSAxMzoxOToyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9YRk9STSwgSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCi0JKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBsZC5uZXcgYW5kIGluc3RhbGxkaXJzLiAgVXNlCi0JJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKLQkkKElOU1RBTExfWEZPUk0pIGFuZCAkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsLWluZm8pOiBSdW4gbWtpbnN0YWxsZGlycy4KLQotTW9uIEFwciAxNCAxMjowNjoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQotCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDQgMTE6NDI6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoc29ydF9zZWN0aW9uc18xKTogVXNlIHhtYWxsb2MgcmF0aGVyIHRoYW4gYWxsb2NhLgotCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgU1FVQUQuCi0JKiBsZGdyYW0ueSAobGVuZ3RoKTogQWRkIFNRVUFELgotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogVXNlIFNRVUFEIGZvciBhIHNpZ25lZCA4IGJ5dGUKLQlyZWxvYy4KLQkqIGxkbGFuZy5jIChwcmludF9kYXRhX3N0YXRlbWVudCk6IEhhbmRsZSBTUVVBRC4KLQkobGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTGlrZXdpc2UuCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdG9rZW4pOiBBZGQgU1FVQUQgdG8gdGFibGUuCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBIYW5kbGUgU1FVQUQuCi0JKiBsZC50ZXhpbmZvIChTZWN0aW9uIERhdGEgRXhwcmVzc2lvbnMpOiBEb2N1bWVudCBTUVVBRC4KLQotVGh1IEFwciAgMyAxMzoxOTo0MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkdmVyLmMgKGxkX3Byb2dyYW1fdmVyc2lvbik6IFNldCB0byAyLjguMS4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1XZWQgQXByICAyIDExOjU1OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbXB3LWlkdG1pcHMuYzogUmVuYW1lIGZyb20gbXB3LWVtaXBzaWR0LmMuCi0JKiBtcHctZWxmbWlwcy5jOiBSZW5hbWUgZnJvbSBtcHctZW1pcHNlbGYuYy4KLQkqIG1wdy1jb25maWcuaW46IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IENhbGwgbGFuZ19jaGVjayBpbW1lZGlhdGVseSBhZnRlcgotCW9wZW5pbmcgdGhlIGlucHV0IGZpbGVzLCByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rLgotCi1Nb24gTWFyIDMxIDIzOjQ0OjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChpbml0KTogRnVsbHkgYnJhY2tldCBpbml0aWFsaXplci4KLQkoc2V0X3BlX3N0YWNrX2hlYXApOiBSZW1vdmUgbG9jYWxzIGJlZ2luX2NvbW1pdCBhbmQgZW5kLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgaS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBwdHIuCi0KLU1vbiBNYXIgMzEgMTY6MzU6NTEgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUudGd0IChocHBhKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgotCi1GcmkgTWFyIDI4IDE1OjI5OjIzIDE5OTcgIEguSi4gTHUgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCUNvbnRyaWJ1dGVkIGJ5IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdT46Ci0JKiBjb25maWd1cmUudGd0IChzcGFyYyotKi1saW51eGFvdXQqKTogTmV3IHRhcmdldC4KLQkoc3BhcmMqLSotbGludXgqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvc3BhcmNsaW51eC5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXNwYXJjbGludXguby4KLQkoZXNwYXJjbGludXguYyk6IE5ldyB0YXJnZXQuCi0KLUZyaSBNYXIgMjggMTQ6MzA6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBSYWxmIEJhZWNobGUgPHJhbGZAZ251LmFpLm1pdC5lZHU+OgotCSogY29uZmlndXJlLnRndDogU2V0IHRhcmdfZXh0cmFfZW11bHMgZm9yIG1pcHMqZWwtKi1saW51eCogYW5kCi0JbWlwcyotKi1saW51eCouICBVc2UgZWxmMzJibWlwIGFuZCBlbGYzMmxtaXAsIG5vdCBlbGYzMmVibWlwIGFuZAotCWVsZjMyZWxtaXAuCi0KLVRodSBNYXIgMjcgMTc6MTQ6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFVwZGF0ZSBjb3B5cmlnaHQgZGF0ZSBpbiB2ZXJzaW9uCi0JbWVzc2FnZS4KLQotRnJpIE1hciAyMSAxMjoyODo0MSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBlbXVscGFyYW1zL2RlbHRhNjguc2ggKE9VVFBVVF9GT1JNQVQpOiBTZXQgdG8gImNvZmYtbTY4ay1zeXN2Ii4KLQotVHVlIE1hciAxOCAxMToxNjoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZW11bHRlbXBsL2FpeC5lbTogSW5jbHVkZSAib2JzdGFjay5oIi4KLQotTW9uIE1hciAxNyAxOToyNjowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jOiBJbmNsdWRlICJvYnN0YWNrLmgiLgotCi1TYXQgTWFyIDE1IDIzOjIzOjQ2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotYmVvcyopOiBVc2UgYWl4cHBjIGZvciB0YXJnX2VtdWwuCi0KLVNhdCBNYXIgMTUgMTg6MTA6MzggMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIGxkZW11bC5oIChsZGVtdWxfbGlzdF9lbXVsYXRpb25zKTogVXNlIGZ1bGwgcHJvdG90eXBlLgotCSogbGRsYW5nLmMgKHByaW50X29uZV9zeW1ib2wpOiBBZGQgZGVjbGFyYXRpb24uCi0JKiBsZGxhbmcuaCAoZHByaW50X3N0YXRlbWVudHMpOiBEZWNsYXJlLgotCSogbGRtYWluLmMgKHJlbW92ZV9vdXRwdXQpOiBEZWNsYXJlLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IERlY2xhcmUuCi0JKiBsZHdyaXRlLmMgKGNsb25lX3NlY3Rpb24pOiBEZWNsYXJlLgotCShzcGxpdF9zZWN0aW9ucyk6IE1ha2Ugc3RhdGljLiAgRGVjbGFyZS4KLQkqIG1yaS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShzdHJkdXApOiBEb24ndCBkZWNsYXJlLgotCShtcmlfYWxpYXMpOiBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0KLUZyaSBNYXIgMTQgMjE6MzA6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBDaGFuZ2UgaGFuZGxpbmcgb2YgZGF0YSBhcmVhIHdoZW4KLQlnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgdG8gbm90IHNraXAgYSBsYXJnZSBibG9jayBvZiBtZW1vcnkuCi0JRnJvbSBQZXIgRm9nZWxzdHJvbSA8cGVmb0BjdnMub3BlbmJzZC5vcmc+LgotCi1XZWQgTWFyIDEyIDIxOjMzOjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG11bHRpcGxlX2RlZmluaXRpb24pOiBPbmx5IHNraXAgdGhlIHdhcm5pbmcgaWYgdGhlCi0Jb3V0cHV0IHNlY3Rpb24gaXMgYWJzb2x1dGUgd2hlbiB0aGUgaW5wdXQgc2VjdGlvbiBpcyBub3QKLQlhYnNvbHV0ZS4KLQotCSogbGRsZXgubDogQWNjZXB0IHdoaXRlc3BhY2UgaW4gVkVSU19TVEFSVCBzdGF0ZS4gIFdhcm4gYWJvdXQKLQlpbnZhbGlkIGNoYXJhY3RlcnMgaW4gVkVSU18qIHN0YXRlcy4KLQotVHVlIE1hciAxMSAxMzo1MTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IERvbid0IGxldCBhCi0JdHJhaWxpbmcgc3BhY2UgbGVhZCB1cyB0byB0aGluayB0aGF0IHRoZXJlIGlzIGEgemVybyBhZGRyZXNzLgotCi1TdW4gTWFyICA5IDIzOjA2OjM1IDE5OTcgIEVyaWMgWW91bmdkYWxlICA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0KLQkqIGxkZ3JhbS55ICh2ZXJzX25vZGUpOiBDb3JyZWN0IHR5cG8gb2YgJygnICBmb3IgJ3snLgotCi1GcmkgTWFyICA3IDE4OjQwOjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgKEVOVFJZKTogRW50cnkgc3ltYm9sIGlzIF9fc3RhcnQKLQlyYXRoZXIgdGhhbiBfc3RhcnQuCi0JKF9fZWRhdGEpOiBEZWZpbmUgdGhpcyByYXRoZXIgdGhhbiAiZWRhdGEiLgotCShfX2VuZCk6IERlZmluZSB0aGlzIHJhdGhlciB0aGFuICJlbmQiLgotCi1UdWUgTWFyICA0IDE3OjE4OjM1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICh0aWM4MC0qLSopOiBBbGxvdyBkcm9wcGluZyBvZiAtY29mZi4KLQotU3VuIE1hciAgMiAyMjo1OTo0OSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGxkLmR2aSk6IFNldCBNQUtFSU5GTyBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyB3ZWxsCi0JYXMgVEVYSU5QVVRTLiAgTmVlZGVkIGZvciBidWlsZGluZyBpbiBzZXBhcmF0ZSBidWlsZCBkaXIuCi0JKiBsZGludC50ZXhpbmZvIChTQ1JJUFRfTkFNRSk6IEZpeCB0eXBvLgotCSogZW11bHBhcmFtcy90aWM4MGNvZmYuc2g6IFJld3JpdGUgdG8gaW5jbHVkZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uCi0JYWJvdXQgZWFjaCBzaGVsbCB2YXJpYWJsZSB0aGF0IGlzIHNldCAob3Igbm90IHNldCkuCi0JKiBzY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2M6IENvbXBsZXRlIHJld3JpdGUuCi0KLUZyaSBGZWIgMjggMTc6NDI6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IENhbGwgYmZkX3NldF9kZWZhdWx0X3RhcmdldC4KLQkqIE1ha2VmaWxlLmluIChsZG1haW4ubyk6IERlZmluZSBUQVJHRVQgd2hlbiBjb21waWxpbmcuCi0KLVRodSBGZWIgMjcgMTE6NDE6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IERvbid0IGluaXRpYWxpemUgbGlua19pbmZvLmxwcmVmaXggb3IKLQlsaW5rX2luZm8ubHByZWZpeF9sZW4uCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbSAoaHBwYWVsZl9iZWZvcmVfcGFyc2UpOiBMaWtld2lzZS4KLQotCSogZW11bHRlbXBsL204OGtiY3MuZW06IFJlbW92ZS4KLQkqIGVtdWxwYXJhbXMvbTg4a2Jjcy5zaCAoVEVNUExBVEVfTkFNRSk6IERvbid0IHNldC4KLQkqIE1ha2VmaWxlLmluIChlbTg4a2Jjcy5jKTogRGVwZW5kIHVwb24gZ2VuZXJpYy5lbSByYXRoZXIgdGhhbgotCW04OGtiY3MuZW0uCi0KLQkqIG1yaS5jIChtcmlfZHJhd190cmVlKTogUGFzcyBub2xvYWRfc2VjdGlvbiwgbm90IFNFQ19ORVZFUl9MT0FELAotCXRvIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LiAgRnJvbSBNYXJrIFJhc2luCi0JPG1hcmsucmFzaW5AdGVscmFkLmNvLmlsPi4KLQotV2VkIEZlYiAyNiAxMTo1MTo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBDbGVhciBTRUNfSVNfQ09NTU9OIGZyb20gY29tbW9uCi0Jc2VjdGlvbi4KLQotVHVlIEZlYiAyNSAyMDozODoxMSAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqLSotbG5ld3MqKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluIChlbWlwc2xuZXdzLmMpOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9taXBzbG5ld3Muc2g6IE5ldyBmaWxlLgotCi1UdWUgRmViIDI1IDE2OjA0OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChob2xkX2ludGVycCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFB1dCBsb2FkYWJsZSAubm90ZSBzZWN0aW9ucwotCWFmdGVyIGhvbGRfaW50ZXJwLiAgQ2hvb3NlIGEgdW5pcXVlIG91dHB1dCBzZWN0aW9uIG5hbWUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBEb24ndCBzZXQgaG9sZF91c2UgaWYgdGhlCi0JU0VDX0xPQUQgb3IgU0VDX0FMTE9DIGZsYWdzIGRpZmZlci4gIFNldCBob2xkX2ludGVycC4KLQotTW9uIEZlYiAyNCAxODoxNjowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBsZGxleC5sIChWX1RBRywgVl9JREVOVElGSUVSKTogTmV3IG1hY3Jvcy4KLQkoVkVSU19TVEFSVCwgVkVSU19TQ1JJUFQsIFZFUlNfTk9ERSk6IE5ldyBzdGF0ZXMgdG8gcGFyc2UgdmVyc2lvbgotCWluZm9ybWF0aW9uLgotCShsZGxleF92ZXJzaW9uX3NjcmlwdCwgbGRsZXhfdmVyc2lvbl9maWxlKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGxkbGV4LmggKGVudW0gaW5wdXRfZW51bSk6IEFkZCBpbnB1dF92ZXJzaW9uX3NjcmlwdC4KLQkobGRsZXhfdmVyc2lvbl9zY3JpcHQpOiBEZWNsYXJlLgotCShsZGxleF92ZXJzaW9uX2ZpbGUpOiBEZWNsYXJlLgotCSogbGRncmFtLnkgKCV1bmlvbik6IEFkZCBkZWZsaXN0LCB2ZXJzeW1zLCBhbmQgdmVyc25vZGUuCi0JKFZFUlNfVEFHLCBWRVJTX0lERU5USUZJRVIpOiBOZXcgdGVybWluYWxzLgotCShHTE9CQUwsIExPQ0FMLCBWRVJTSU9OLCBJTlBVVF9WRVJTSU9OX1NDUklQVCk6IE5ldyB0ZXJtaW5hbHMuCi0JKGZpbGUpOiBBY2NlcHQgSU5QVVRfVkVSU0lPTl9TQ1JJUFQuCi0JKGlmaWxlX3AxKTogQWNjZXB0IHZlcnNpb24uCi0JKHZlcnNpb25fc2NyaXB0X2ZpbGUpOiBOZXcgbm9udGVybWluYWwuCi0JKHZlcnNpb24sIHZlcnNfbm9kZXMsIHZlcnNfbm9kZSk6IExpa2V3aXNlLgotCSh2ZXJkZXAsIHZlcnNfdGFnLCB2ZXJfZGVmbnMpOiBMaWtld2lzZS4KLQkqIGxkbGFuZy5jIChsYW5nX2VsZl92ZXJzaW9uX2luZm8pOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShsYW5nX25ld192ZXJzX3JlZ2V4KTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX25ld192ZXJzX25vZGUpOiBOZXcgZnVuY3Rpb24uCi0JKHZlcnNpb25faW5kZXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19hZGRfdmVyc19kZXBlbmQpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxhbmcuaCAobGFuZ19lbGZfdmVyc2lvbl9pbmZvKTogRGVjbGFyZS4KLQkobGFuZ19uZXdfdmVyc19yZWdleCwgbGFuZ19uZXdfdmVyc19ub2RlKTogRGVjbGFyZS4KLQkobGFuZ19hZGRfdmVyc19kZXBlbmQsIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlKTogRGVjbGFyZS4KLQkqIGxleHN1cC5jIChPUFRJT05fVkVSU0lPTl9TQ1JJUFQpOiBEZWZpbmUuCi0JKGxkX29wdGlvbnMpOiBBZGQgInZlcnNpb24tc2NyaXB0Ii4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSBPUFRJT05fVkVSU0lPTl9TQ1JJUFQuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlQYXNzIGxhbmdfZWxmX3ZlcnNpb25faW5mbyB0byBzaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCAuZ251LnZlcnNpb24gc2VjdGlvbnMuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBzeW1ib2wgdmVyc2lvbmluZy4KLQotRnJpIEZlYiAyMSAxNzozNzo1MSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGVkMzB2ZWxmLmMpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLnRndCAoZDMwdi0qLSopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9kMzB2ZWxmLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IE5ldyBmaWxlLgotCi1GcmkgRmViIDE0IDE4OjI4OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9uIENvbW1hbmRzKTogRG9jdW1lbnQgdGhlIElOQ0xVREUgY29tbWFuZC4KLQotVGh1IEZlYiAxMyAyMDozMTozNyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX05FRURfREVDTEFSQVRJT04gb24gZ2V0ZW52LgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYpOiBOZXcgbWFjcm8uCi0JKiBzeXNkZXAuaCAoZ2V0ZW52KTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVi4KLQkqIGxkZW11bC5jIChsZF9lbXVsX2RlZmF1bHRfdGFyZ2V0KTogRG8gbm90IGNhc3QgZ2V0ZW52IHJldHVybgotCXZhbHVlLgotCSogbGRtYWluLmMgKGdldF9lbXVsYXRpb24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1UdWUgRmViIDExIDE1OjM0OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogV2hlbiByZWxvY2F0aW5nLCBwdXQgLm1pcHMxNi5mbi4qIGFuZAotCS5taXBzMTYuY2FsbC4qIGluIC50ZXh0LgotCi1TdW4gRmViICA5IDE4OjA5OjEzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3RpYzgwY29mZi5zaDogTmV3IChkdW1teSkgZmlsZSBmb3IgVEljODAuCi0JKiBzY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2M6IE5ldyAoZHVtbXkpIGZpbGUgZm9yIFRJYzgwLgotCSogTWFrZWZpbGUuaW4gKGV0aWM4MGNvZmYuYyk6IEFkZCB0YXJnZXQgYW5kIHJ1bGUgdG8gYnVpbGQgaXQuCi0JKiBjb25maWd1cmUudGd0ICh0aWM4MC0qLWNvZmYpOiBTZXQgdGFyZ19lbXVsIHRvIHRpYzgwY29mZi4KLQotRnJpIEphbiAzMSAxMzoxNjo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFNlYXJjaCBmb3IKLQkiLnNvIiBpbiB0aGUgbmFtZSwgbm90ICIuc28uIi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IEFjY2VwdCBhIHBsYWluIC5zbyBmaWxlLgotCi0JKiBNYWtlZmlsZS5pbiAobGQuaW5mbyk6IEFkZCAtSSQoc3JjZGlyKS4gIEZyb20gQWxhbiBNb2RyYQotCTxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4uCi0KLVRodSBKYW4gMzAgMTE6MzE6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IEluY2x1ZGUgPGN0eXBlLmg+LgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogU2tpcCB0aGUgZGlyZWN0b3J5IG5hbWUgd2hlbgotCXNlYXJjaGluZyBmb3IgIi5zby4iLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyKTogTWFrZSBzdXJlIHRoYXQgdGhlIGxpYnJhcnkgbmFtZQotCWhhcyBhIHZlcnNpb24gbnVtYmVyLCBhbmQgdGhhdCBvbmx5IHZlcnNpb24gbnVtYmVycyBmb2xsb3cgLnNvLgotCi1XZWQgSmFuIDI5IDE4OjE1OjAwIDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOgotCSogc2NyaXB0dGVtcGwvcHBjcGUuc2M6IGFkZCAqKC5nY2NfZXhjZXB0X3RhYmxlKSB0byB0aGUgdGV4dAotCXNlY3Rpb24gc28gV2luMzIgZXhlY3V0YWJsZXMgYXJlIHZhbGlkLgotCi1Nb24gSmFuIDI3IDEyOjI4OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgbGlua29uY2UgcmVsb2Mgc2VjdGlvbiBpbiBvdGhlcgotIAlhcHByb3ByaWF0ZSByZWxvYyBzZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IEFkZCBsaW5rb25jZSBzdXBwb3J0LgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLQotRnJpIEphbiAyNCAxMDo0NDowOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9tbjEwMjAwLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogTW92ZSB0aGUKLQlzdGFjayB1cCB0byAweDgwMDAwLgotCSogZW11bHBhcm1zL21uMTAzMDAuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBMaWtld2lzZS4KLQotVHVlIEphbiAyMSAxMjoxMToxMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogVXNlIFBST1ZJREUKLQl0byBkZWZpbmUgYF9zdGFjaycuCi0KLVRodSBKYW4gMTYgMTc6MDc6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBSZW5hbWUgYXV4aWxpYXJ5X2ZpbHRlcl9zaGxpYiB0bwotCWF1eGlsaWFyeV9maWx0ZXJzLCBhbmQgbWFrZSBpdCBjaGFyICoqLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLWYgYnkgc2V0dGluZyB1cCBhbiBhcnJheS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBVc2UKLQluZXcgbmFtZSBvZiBhdXhpbGlhcnlfZmlsdGVycy4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IEltcHJvdmUgZG9jdW1lbnRhdGlvbiBvZiAtLWZpbHRlciBhbmQKLQktLWF1eGlsaWFyeS4KLQotVHVlIEphbiAxNCAxNTo0NDoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBDbGFyaWZ5IHRoYXQgdGhlIG5vcm1hbCB1c2FnZSBpcyAtVC4KLQkoQ29tbWFuZHMpOiBMaWtld2lzZS4KLQotVGh1IEphbiAgOSAxMToyNjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IENvcnJlY3QgbWFzayB1c2VkIGZvciAuZGF0YSBhZGRyZXNzLgotCi1XZWQgSmFuICA4IDE1OjE0OjU5IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogbWFrZSBkZWZhdWx0IGV4ZWN1dGFibGUgYS5leGUgaW5zdGVhZCBvZgotCWEub3V0Ci0KLUZyaSBKYW4gIDMgMTc6MzM6MzQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogTW92ZSAuZ290IGNsb3NlciB0byAuc2RhdGEgYW5kIC5zYnNzIGJ5Ci0Jc2hpZnRpbmcgLnBsdCBiYWNrLiAgUnVtb3VyIGhhcyBpdCB0aGF0IHRoZSBOZXRCU0QgbGQuc28gZGVwZW5kcwotCW9uIC5keW5hbWljIGJlaW5nIGFmdGVyIC5nb3QsIHNvIHdlIGxlYXZlIHRoYXQuCi0KLUZyaSBKYW4gIDMgMTQ6MDQ6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBEb24ndCByZW1vdmUgY29uZmlnZG9jLnRleGkuCi0gCShtYWludGFpbmVyLWNsZWFuKTogRG8gcmVtb3ZlIGNvbmZpZ2RvYy50ZXhpLgotCi0JKiBsZC50ZXhpbmZvIChPcGVyYXRvcnMpOiBSZW1vdmUgJ0AnIGZyb20gQHNtYWxsZXhtcGxlIGluIGNvbW1lbnQKLQl0byBhdm9pZCBjb25mdXNpbmcgdGV4aTJyb2ZmLgotCi1GcmkgSmFuICAzIDExOjI3OjAyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYyAoLnpkYXRhKTogQWRkIC56Y29tbW9uIHNlY3Rpb24uCi0JKC50ZGF0YSk6IEFkZCAudGNvbW1vbiBhbmQgLnRjb21tb25fYnl0ZSBzZWN0aW9ucy4KLQotVGh1IEphbiAgMiAxODoxNDozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqZWwtKi1saW51eCosIG1pcHMqLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBVc2UgX19zdGFydCBhcyB0aGUgZW50cnkgYWRkcmVzcyBmb3IKLQltaXBzKi0qLWxpbnV4Ki4KLQotVHVlIERlYyAzMSAxNDo0ODozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBmaWx0ZXJfc2hsaWIgYW5kIGF1eGlsaWFyeV9maWx0ZXJfc2hsaWIKLQlmaWVsZHMuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtLWF1eGlsaWFyeS8tZiBhbmQKLQktLWZpbHRlci8tRi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVBhc3MgZmlsdGVyX3NobGliIGFuZCBhdXhpbGlhcnlfZmlsdGVyX3NobGliIHRvCi0Jc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS1maWx0ZXIvLUYgYW5kIC0tYXV4aWxpYXJ5Ly1mLgotCi1Nb24gRGVjIDMwIDEzOjU1OjU3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYyAoLnRkYXRhKSBBZGQgLnRic3MgYW5kIC50Ynl0ZSBzZWN0aW9ucy4KLQotV2VkIERlYyAxOCAyMjo1NzozNSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXNlIE5ld0ZvbGRlclJlY3Vyc2l2ZSBmb3IgaW5zdGFsbGF0aW9uLgotCi1GcmkgRGVjIDEzIDE0OjA4OjUwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogTWFrZSBzdXJlIF9fe2UsZ31wIHN0YXJ0IHJlbGF0aXZlIHRvIHRoZQotCXtzLHR9ZGF0YSBzZWN0aW9ucy4gIERvIG5vdCBlbWl0IGFueSBsaW5rZXIgZ2VuZXJhdGVkIHN5bWJvbHMgaWYKLQktci4gIFVzZSB7VEVYVCx7WixTLFR9REFUQX1fU1RBUlRfQUREUiB2YXJpYWJsZXMgdG8gaW5pdGlhbGl6ZQotCXdoZXJlIHRoZSBkaWZmZXJlbnQgc2VjdGlvbnMgZ28uICBDaGFuZ2Ugc29tZSB3aGl0ZXNwYWNlLgotCi0JKiBlbXVscGFyYW1zL3Y4NTAuc2ggKHtURVhULHtaLFMsVH1EQVRBfV9TVEFSVF9BRERSKTogRGVmaW5lCi0JYXBwcm9wcmlhdGVseS4gIFJlbW92ZSBjcnVkIG5vdCB1c2VkIGFueW1vcmUuCi0KLUZyaSBEZWMgMTMgMTA6MTk6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZW1uMTAyMDAuYyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBjb25maWd1cmUudGd0OiBIYW5kbGUgbW4xMDIwMC4KLQkqIGVtdWxwYXJtcy9tbjEwMjAwLnNoOiBOZXcgZmlsZS4KLQotVGh1IERlYyAxMiAxNzowNDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9nbGQ5NjBjLmVtOiBJbmNsdWRlIDxjdHlwZS5oPi4KLSAJKGdsZDk2MF9zZXRfb3V0cHV0X2FyY2gpOiBHZXQgdGhlIG1hY2hpbmUgdHlwZSBmcm9tIHRoZSAtQSBvcHRpb24KLQlpZiB0aGVyZSBpcyBvbmUsIHJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyBjb3JlLgotCi1TYXQgRGVjICA3IDEwOjA3OjUxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL21uMTAzMDAuc2g6IEhhbmRsZSBsZWFkaW5nIHVuZGVyc2NvcmVzLgotCi1UaHUgRGVjICA1IDEzOjQ1OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogT25seQotCXNldCBob2xkX3JlbCBpZiBTRUNfQUxMT0MgaXMgc2V0LgotCi1UdWUgRGVjICAzIDExOjI5OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHNlY3Rpb25fYWxyZWFkeV9saW5rZWQpOiBTZXQgdGhlIG91dHB1dF9vZmZzZXQgYXMgd2VsbAotCWFzIHRoZSBvdXRwdXRfc2VjdGlvbiB3aGVuIG9ubHkgcmVhZGluZyBzeW1ib2xzIGZyb20gYSBmaWxlLgotCi1Nb24gRGVjICAyIDExOjQzOjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy8qLnNoOiBNYWtlIHN1cmUgdGhhdCBlYWNoIHNldCBvZiBwYXJhbWV0ZXJzIHdoaWNoCi0JdXNlcyB0aGUgZWxmLnNjIHNjcmlwdCBzZXRzIE1BQ0hJTkUuCi0KLVdlZCBOb3YgMjcgMDM6MjI6MDUgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZ7LG1pcHMscHBjfS5zYzogQWRkIHRoZSByZW1haW5pbmcgRFdBUkYgc2VjdGlvbnMuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IExpa2V3aXNlLgotCi1UdWUgTm92IDI2IDE2OjU4OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotTW9uIE5vdiAyNSAxMjoxNzo1NSAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzKTogQWRkIGNhc2UKLQlmb3IgYmZkX3ZtYSB0byBpbml0IGxvb3AuCi0KLU1vbiBOb3YgMjUgMDk6NTU6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvbW4xMDMwMC5zaDogUmVtb3ZlIGJvZ3VzICdfJyBwcmVmaXggZm9yCi0JZW50cnkgc3ltYm9sIGFuZCBjdG9yL2R0b3Igc3R1ZmYuCi0KLUZyaSBOb3YgMTUgMTM6MDA6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZW1uMTAzMDAuYyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBjb25maWd1cmUudGd0OiBIYW5kbGUgbW4xMDMwMC4KLQkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoOiBOZXcgZmlsZS4KLQotVHVlIE5vdiAgNSAxMDo1Nzo1MCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChSRUFET05MWV9TVEFSVF9BRERSKTogQ2hhbmdlZCB0byAweDIwMDAwMDQuCi0JKEVNQkVEREVEKTogRGVmaW5lLgotCi1GcmkgTm92ICAxIDEwOjAxOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbzogQWRkIHNlY3Rpb24gb24gcmVwb3J0aW5nIGJ1Z3MuCi0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBNYWtlIHN1cmUgdGhlIGV0ZXh0IGFuZCBfX0NUT1JfTElTVF9fCi0Jc3ltYm9scyBhcmUgY29ycmVjdGx5IGFsaWduZWQuCi0KLVRodSBPY3QgMzEgMDk6Mjg6NTkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHRlbXBsL3Y4NTAuc2MgKHpkYXRhKTogSGFuZGxlIHJlc3pkYXRhLCByb216ZGF0YSBhbmQKLQlyb216YnNzIHRvby4KLQotVHVlIE9jdCAyOSAxMjozMzowNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoOiBDaGFuZ2VzIG5lZWRlZCBmb3IgRDEwVi1FVkEgYm9hcmQuCi0JU2V0IFRFWFRfU1RBUlRfQUREUiB0byAweDEwMDAwMDAuIFNldCBSRUFET05MWV9TVEFSVF9BRERSIHRvCi0JMHgyMDAwMDAwLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiAgRml4IGNhbGN1bGF0aW9uIG9mIC50ZXh0LiAgQ2hhbmdlCi0JLnN0YWNrIHRvIHN0YXJ0IGF0IDB4MjAwN2ZmZS4KLQotTW9uIE9jdCAyOCAxNTozNzowMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChzcGFyY2xldCotKi1hb3V0Kik6IERlbGV0ZSwgdXNlIHNwYXJjKi0qLWFvdXQqLgotCi1XZWQgT2N0IDIzIDE2OjE3OjIyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0ZW1wbC92ODUwLnNjICh6ZGF0YSk6IEZpeCB0eXBvICJ6cm9kYXRhIiAtPiAicm96ZGF0YSIuCi0KLQkqIHNjcmlwdGVtcGwvdjg1MC5zYyAoemRhdGEpOiBNYWtlIHN1cmUgdGhpcyBzdGF5cwotCWluIGxvLW1lbW9yeS4KLQotVHVlIE9jdCAyMiAxMTozNjo0NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKF9fZXApOiBQdXQgaXQgYXQgdGhlIHN0YXJ0Ci0Jb2YgdGhlIHRkYSBzZWN0aW9uLgotCi0JKiBzY3JpcHRlbXBsL3Y4NTAuc2M6IE1vdmUgYWxsICJub3JtYWwiIHNlY3Rpb25zIGludG8KLQl0aGUgZXh0ZXJuYWwgbWVtb3J5IHJlZ2lvbiAoMHgxMDAwMDAgLSAweDIwMDAwMCkuCi0KLU1vbiBPY3QgMjEgMTc6MTY6NTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogQ2xvbmUgZnJvbSBlbGYuc2MsIG1vdmUgLnRleHQgdG8KLQkweDEwMDAwLCBzbyB0aGF0IGlzIG1vcmUgcm9vbSBmb3IgZGF0YS4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChURVhUX1NUQVJUX0FERFIpOiBOb3cgMHgxMDAwMDAuCi0JKFJFQURPTkxZX1NUQVJUX0FERFIpOiBOb3cgMHgwLgotCShTQ1JJUFRfTkFNRSk6IE5vdyBlbGZkMTB2LgotCi0JKiBNYWtlZmlsZS5pbiAoZWQxMHZlbGYuYyk6IERlcGVuZCBvbiBlbGZkMTB2LnNjLCBub3QgZWxmLnNjLgotCi1GcmkgT2N0IDE4IDIyOjEyOjQ5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvbTMycmVsZi5zaAkoVEVYVF9TVEFSVF9BRERSKTogQ2hhbmdlIGZyb20gMCB0byAweDEwMC4KLQotRnJpIE9jdCAxOCAxNTo0MzozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IFJlbW92ZSBlZWxmNjRhbHBoYS5vLgotCShBTExfNjRfRU1VTEFUSU9OUyk6IE5ldyB2YXJpYWJsZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IC0tZW5hYmxlLTY0LWJpdC1iZmQgb3B0aW9uLiAgSWYgaXQgaXMgc2V0Ci0Jd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbCwgaW5jbHVkZSBBTExfNjRfRU1VTEFUSU9OUyBpbgotCUVNVUxBVElPTl9PRklMRVMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBPY3QgMTggMTI6NTg6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjIChfX2dwLCBfX2VwKTogRGVmaW5lLgotCi1UaHUgT2N0IDE3IDE4OjE0OjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbzogVHJ5IHRvIGNvbnNpc3RlbnRseSB1c2UgYSBzaW5nbGUgb3IgYSBkb3VibGUgZGFzaAotCWZvciBlYWNoIG9wdGlvbi4KLQotVGh1IE9jdCAxNyAxMDoxNzoyMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2ggKEVNQkVEREVEKTogRGVmaW5lLgotCi1UaHUgT2N0IDE3IDEwOjU2OjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYyAoLnpkYXRhKTogQWRkIHRoaXMgYmVmb3JlIC50ZXh0LgotCSguc2RhdGEpOiBBbHNvIGluY2x1ZGUgLnJvc2RhdGEgYXMgcGFydCBvZiB0aGUgLnNkYXRhLgotCSgudGRhdGEpOiBJbmNsdWRlIHRoaXMganVzdCBiZWZvcmUgLnNkYXRhLgotCi0JKiBlbXVscGFybXMvdjg1MC5zaCAoU0NSSVBUX05BTUUpOiBVc2UgInY4NTAiIG5vdCAiZWxmIi4KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IFdyYXAgc2NyaXB0IHdpdGggYSAiY2F0IDw8IEVPRiIuCi0KLVdlZCBPY3QgMTYgMjM6MTA6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBOZXcgbGlua2VyIHNjcmlwdCBmb3IgdGhlIFY4NTAuCi0JKiBNYWtlZmlsZS5pbjogVXNlIGl0LgotCi1UaHUgT2N0IDEwIDE3OjU3OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoOiBEZWZpbmUgX2dwIGluIE9USEVSX0dPVF9TWU1CT0xTLCBub3QKLQlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMuCi0JKiBlbXVscGFyYW1zL2VsZjMybDQzMDAuc2g6IExpa2V3aXNlLgotCi1XZWQgT2N0ICA5IDE0OjM2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgd2Fybl9zZWN0aW9uX2FsaWduIGZpZWxkLgotCSogbGV4c3VwLmMgKE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR04pOiBEZWZpbmUuCi0JKGxkX29wdGlvbnMpOiBBZGQgLS13YXJuLXNlY3Rpb24tYWxpZ24uCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS13YXJuLXNlY3Rpb24tYWxpZ24uCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgd2Fybl9zZWN0aW9uX2FsaWduLCB3YXJuIGlmCi0JdGhlIHN0YXJ0IG9mIGEgc2VjdGlvbiBjaGFuZ2VzIGR1ZSB0byBhbGlnbm1lbnQuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLXdhcm4tc2VjdGlvbi1hbGlnbi4KLQkqIGxkLnRleGluZm86IENoYW5nZSBzb21lIHNpbmdsZSBkYXNoZXMgdG8gZG91YmxlIGRhc2hlcy4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzZXRfcGVfc3Vic3lzdGVtKTogUmVjb3JkIGVudHJ5IHN5bWJvbCBmb3IgZWFjaAotCXN1YnN5c3RlbSB0eXBlLiAgSWZkZWYgb3V0IG9zMiB0eXBlLiAgUmVjb2duaXplIGEgdmVyc2lvbiBudW1iZXIuCi0KLVR1ZSBPY3QgIDggMTI6MDc6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNldF9wZV9zdWJzeXN0ZW0pOiBXaGVuIHNldHRpbmcgdGhlIHN1YnN5c3RlbQotCXRvIHdpbmRvd3MsIHNldCB0aGUgZW50cnkgcG9pbnQuCi0KLQkqIE1ha2VmaWxlLmluIChsZGxleC5jKTogRG9uJ3QgcGFzcyBhbnkgb3B0aW9ucyB0byAkKExFWCkuCi0KLU1vbiBPY3QgIDcgMTc6Mjk6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogTWVudGlvbiAuc28gZXh0ZW5zaW9ucyBmb3Igc2hhcmVkCi0JbGlicmFyaWVzLgotCi1TdW4gT2N0ICA2IDIyOjM1OjM2IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmeyxtaXBzLHBwY30uc2M6IEFkZCBEV0FSRiAyIHNlY3Rpb25zLgotCi1GcmkgT2N0ICA0IDE4OjQ5OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2M6IE9ubHkgc2V0IHRoZSBhZGRyZXNzIG9mIC50ZXh0IGlmCi0JUkVMT0NBVElORy4KLQotRnJpIE9jdCAgNCAxMDo1OTo1MiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3NwYXJjYW91dC5zaCAoe0JJRyxMSVRUTEV9X09VVFBVVF9GT1JNQVQpOiBEZWZpbmUuCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjICh7QklHLExJVFRMRX1fT1VUUFVUX0ZPUk1BVCk6IFByb3ZpZGUgZGVmYXVsdC4KLQkoT1VUUFVUX0ZPUk1BVCk6IFN1cHBvcnQgYmktZW5kaWFuIHRhcmdldHMuCi0KLVRodSBPY3QgIDMgMTM6NTI6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmgsIGZubWF0Y2guYzogUmVtb3ZlIChub3cgaW4gbGliaWJlcnR5KS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogUmVtb3ZlIGZubWF0Y2guYy4KLQkoSEZJTEVTKTogUmVtb3ZlIGZubWF0Y2guaC4KLQkoT0ZJTEVTKTogUmVtb3ZlIGZubWF0Y2guby4KLQotVGh1IE9jdCAgMyAxNTo0MToyNCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBNb3ZlIGNvbmZpZy5sb2cgdG8gZGlzdGNsZWFuLgotCi1XZWQgT2N0ICAyIDIzOjQ1OjI1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbXVsdG1wbC9wZS5lbTogaW5jcmVhc2Ugc2l6ZSBvZiBzdGFjayByZXNlcnZlIHRvIDB4MjAwMDAwMAotICAgICAgICAobmVjZXNzYXJ5IGluIG9yZGVyIHRvIGNvbXBpbGUgcGFyc2UuYyBpbiBnY2Mgc291cmNlcyB1bmRlciBOVCkKLQotV2VkIE9jdCAgMiAxNDo0OToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zKTogRml4IHR5cG8gaW4gLS1ycGF0aC1saW5rIGRlc2NyaXB0aW9uLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogU3VnZ2VzdAotCS0tcnBhdGggaWYgYSBuZWVkZWQgbGlicmFyeSBpcyBub3QgZm91bmQuCi0KLVR1ZSBPY3QgIDEgMTY6MTc6MzMgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBtaXBzKi0qLWVsZiouCi0KLVR1ZSBPY3QgIDEgMTU6NTA6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogR2l2ZSBtb3JlIGRldGFpbCBvbiAtbCBvcHRpb24uCi0KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IEhhbmRsZSBDUkVBVEVfU0hMSUIgdGhlIHNhbWUgd2F5IHRoYXQKLQllbGYuc2MgZG9lcywgc28gdGhhdCBnbGliYyB3b3JrcyBiZXR0ZXIuCi0KLQkqIGxkdmVyLmMgKGxkX3Byb2dyYW1fdmVyc2lvbik6IE5ldyB2YXJpYWJsZS4KLQkobGR2ZXJzaW9uKTogVXNlIGl0LgotCSogbGR2ZXIuaCAobGRfcHJvZ3JhbV92ZXJzaW9uKTogRGVjbGFyZS4KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zKTogSGFuZGxlIC0tZGxsLXZlcmJvc2UgbGlrZSAtLXZlcmJvc2UsIG5vdAotCS0tdmVyc2lvbi4gIENoYW5nZSAtLXZlcnNpb24gaGFuZGxpbmcgdG8gbWF0Y2ggY3VycmVudCBHTlUKLQlzdGFuZGFyZHMuCi0JKGhlbHApOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0KLU1vbiBTZXAgMzAgMTI6MTQ6NDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGVtMzJyZWxmLmMpOiBBZGQgcnVsZSBmb3IuCi0JKiBjb25maWd1cmUudGd0IChtMzJyLSotKik6IFJlY29nbml6ZS4KLQkqIGVtdWxwYXJhbXMvbTMycmVsZi5zaDogTmV3IGZpbGUuCi0KLVRodSBTZXAgMjYgMTM6NTg6NDcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEFkZCBzeW1ib2xpYyBkb3VibGVxdW90aW5nIHRvIGxkbWFpbiBjb21waWxlIGVkaXQuCi0JKiBtcHctY29uZmlnLmluOiBBZGQgbWlwcy0qLSogY2FzZSBhcyBtaXBzLWVsZiwgYW5kIHVzZSBtb3JlCi0Jd2lsZGNhcmRzIGluIG1hdGNoaW5nLgotCSogbXB3LWVtaXBzZWxmLmM6IE5ldyBmaWxlLCBwcmVnZW5lcmF0ZWQgbWlwcyBlbGYgZW11bGF0aW9uLgotCi1UdWUgU2VwIDE3IDEyOjE4OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRpbnQudGV4aW5mbzogUmV3cm90ZS4KLQotCSogY29uZmlndXJlLnRndDogQWRkIGNhc2VzIGZvciBNSVBTIDUwMDAgbGlrZSBNSVBTIDQzMDAuCi0KLU1vbiBTZXAgMTYgMTc6NTU6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBPbmx5IGRlZmluZSBzeW1ib2xzIGlmIFJFTE9DQVRJTkcuICBGaXgKLQlzeW50YXggZXJyb3Igb24gX19lbmRfXyBsaW5lLgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBGb3IgLU4gb3IgLW4sIGRvbid0IGFsaWduIC5kYXRhLiAgRnJvbQotIAlDaHJpcyBIYWRsZXkgPENocmlzdG9waGVyLkhhZGxleUBjbC5jYW0uYWMudWs+Ci0KLVN1biBTZXAgMTUgMjI6MDk6NTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvdjg1MC5zaDogRml4IE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMuCi0KLVN1biBTZXAgMTUgMTA6Mzg6MTYgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBlbXVscGFybXMvZDEwdi5zaDogU2V0IE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMgdG8gcHV0Ci0Jc3RhY2sgYXQgdG9wIG9mIHNpbXVsYXRvciBtZW1vcnkuCi0KLUZyaSBTZXAgMTMgMTU6NDk6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxleC5sIChTWU1CT0xDSEFSTik6IEFkZCAkLCBfLCBhbmQgfi4KLQotV2VkIFNlcCAxMSAyMzozMDo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uKTogQ2hlY2sgZm9yIC1taXBzNCBsaWtlIC1taXBzMSwgZXQuIGFsLgotCi1UaHUgU2VwICA1IDE1OjI0OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHNlY3Rpb25fYWxyZWFkeV9saW5rZWQpOiBBY2NlcHQgYSBsYW5nX2lucHV0X3N0YXRlbWVudAotCWFzIHRoZSBQVFIgYXJndW1lbnQuICBJZiB0aGUgZmlsZSBpcyBzeW1ib2xzIG9ubHksIGRpc2NhcmQgYWxsCi0JaW5wdXQgc2VjdGlvbnMuCi0JKGxkbGFuZ19hZGRfZmlsZSk6IFBhc3MgZW50cnkgdG8gYmZkX21hcF9vdmVyX3NlY3Rpb25zLgotCi1XZWQgU2VwICA0IDE1OjUzOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoYWxwaGEtKi1nbnUqKTogTmV3IHRhcmdldC4gIEZyb20gRmlsYSBLb2xvZG55Ci0JPGZpbGFAaWJpLmNvbT4uCi0KLVR1ZSBTZXAgIDMgMDA6NTI6NTQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvdjg1MC5zaDogU2V0IE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMKLQotU3VuIFNlcCAgMSAyMTo0ODo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy92ODUwLnNoOiBTZXQgRU1CRURERUQuCi0KLUZyaSBBdWcgMzAgMjI6MzA6MzAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvdjg1MC5zaDogRW50cnkgc3ltYm9sIGlzICJfc3RhcnQiLCB0d2VhawotCWN0b3IvZHRvciBzdXBwb3J0LgotCi1GcmkgQXVnIDMwIDE4OjMyOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc2gtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvc2hlbGYuc2g6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9zaGxlbGYuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVzaGVsZi5vIGFuZCBlc2hsZWxmLm8uCi0JKGVzaGVsZi5jLCBlc2hsZWxmLmMpOiBOZXcgdGFyZ2V0cy4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSWYgRU1CRURERUQgaXMgZGVmaW5lZCwgdGhlbiBkb24ndCBhZGQKLQlTSVpFT0ZfSEVBREVSUyB0byBURVhUX1NUQVJUX0FERFIuICBFeHBhbmQgQ1RPUl9TVEFSVCBhbmQgQ1RPUl9FTkQKLQlhcm91bmQgLmN0b3JzLCBhbmQgRFRPUl9TVEFSVCBhbmQgRFRPUl9FTkQgYXJvdW5kIC5kdG9ycy4gIEV4cGFuZAotCU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMgaWYgUkVMT0NBVElORy4KLQotVGh1IEF1ZyAyOSAxNjo1Nzo0NiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS57aG9zdCx0Z3R9IChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bQotCXByby4KLQotTW9uIEF1ZyAyNiAxMjo1ODoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChzZWN0aW9uKTogQWRkIG9wdF9ub2Nyb3NzcmVmczsgcGFzcyB2YWx1ZSB0bwotCWxhbmdfZW50ZXJfb3ZlcmxheS4KLQkob3B0X25vY3Jvc3NyZWZzKTogTmV3IG5vbnRlcm1pbmFsLgotCSogbGRsZXgubDogUmVjb2duaXplIE5PQ1JPU1NSRUZTIGtleXdvcmQgaW4gRVhQUkVTU0lPTiBtb2RlLgotCSogbGRsYW5nLmMgKG92ZXJsYXlfbm9jcm9zc3JlZnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsYW5nX2VudGVyX292ZXJsYXkpOiBBZGQgbm9jcm9zc3JlZnMgcGFyYW1ldGVyLgotCShsYW5nX2xlYXZlX292ZXJsYXkpOiBPbmx5IGFkZCBub2Nyb3NzcmVmcyBpZiBvdmVybGF5X25vY3Jvc3NyZWZzCi0JaXMgc2V0LiAgSW5pdGlhbGl6ZSBvdmVybGF5X25vY3Jvc3NyZWZzLgotCSogbGRsYW5nLmggKGxhbmdfZW50ZXJfb3ZlcmxheSk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGxkLnRleGluZm8gKE92ZXJsYXlzKTogVXBkYXRlIGRvY3VtZW50YXRpb24uCi0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFByaW50IEdOVSBsZCBpbiB0aGUgdmVyc2lvbiBtZXNzYWdlLgotCi1UaHUgQXVnIDIyIDE3OjEwOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBITERFTlYuCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgSExERU5WLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEhMREVOVik6IE5ldyB2YXJpYWJsZS4KLQkoJChMRF9QUk9HKSk6IFVzZSAkKEhMREVOVikuCi0KLVRodSBBdWcgMjIgMTY6Mjk6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZXY4NTAuYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUudGd0ICh2ODUwLSotKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL3Y4NTAuc2g6IE5ldyBmaWxlLgotCi1UaHUgQXVnIDIyIDExOjE2OjAyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBBZGQgQERBU0hfQ19GTEFHQCB0byBjb21waWxlciBlZGl0LgotCi1XZWQgQXVnIDIxIDExOjI2OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgLmdudS5saW5rb25jZSogc2VjdGlvbnMgaW4gYXBwcm9wcmlhdGUKLQljb250YWluaW5nIHNlY3Rpb25zLgotCi1Nb24gQXVnIDE5IDEzOjAxOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCi1Nb24gQXVnIDE5IDExOjI4OjI5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZ2Vuc2NyaXB0cy5zaDogVW5kbyA4LzE2IGNoYW5nZS4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChNQUNISU5FKTogRXhwbGljaXRseSBzZXQgdG8gbm90aGluZy4KLQotRnJpIEF1ZyAxNiAxOToxODowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGdlbnNjcmlwdHMuc2g6IEV4cGxpY2l0bHkgcmVzZXQgYW55IHNoZWxsIHZhcmlhYmxlcyBzZXQgb3IgdXNlZAotCWJ5IHRoZSB2YXJpb3VzIC5zYyBzY3JpcHRzIHRvIGFsbG93IGluYWR2ZXJ0YW50IHVzZSBvZiB0aGVzZQotCW5hbWVzIGFzIG5vcm1hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYnkgdGhlIHBlcnNvbiBydW5uaW5nCi0JY29uZmlndXJlLgotCi0JKiBNYWtlZmlsZS5pbiAoZWQxMHZlbGYuYyk6IFVzZSB0ZGlyX2QxMHYsIG5vdCB0ZGlyX2FyY2VsZi4KLQotRnJpIEF1ZyAxNiAxNDoxNTo0MSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2MgKF9fYnNzX3N0YXJ0X18sIF9fYnNzX2VuZF9fLAotIAlfX2RhdGFfc3RhcnRfXywgX19kYXRhX2VuZF9fKTogQWRkZWQgdG8ga2VlcCBpbiBzeW5jLiB3aXRoIHRoZQotIAlkZWZhdWx0IEFSTSBjcnQwLnMuIEFkZGVkIF9fQ1RPUl9MSVNUX18gYW5kIF9fRFRPUl9MSVNUX18gc3VwcG9ydC4KLQotVGh1IEF1ZyAgOCAxNDoyNDo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkY3JlZi5jIChjaGVja19yZWxvY19yZWZzKTogSWYgaW5mby0+c2FtZSwgbG9vayBmb3IgYW55IHN5bWJvbAotCWRlZmluZWQgaW4gaW5mby0+ZGVmc2VjLCBub3QganVzdCB0aGUgc2VjdGlvbiBzeW1ib2wuCi0KLVdlZCBBdWcgIDcgMTQ6NDA6NDggMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVEX0RFQ0xBUkFUSU9OIG9uIHN0cnN0ciBhbmQgc2Jyay4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fU1RSU1RSKTogTmV3IG1hY3JvLgotCShORUVEX0RFQ0xBUkFUSU9OX1NCUkspOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIHN5c2RlcC5oIChzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgotCSogbGRtYWluLmMgKHNicmspOiBEZWNsYXJlIGlmIEhBVkVfU0JSSyBhbmQKLQlORUVEX0RFQ0xBUkFUSU9OX1NCUksuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3JlY29yZF9waGRycyk6IENhc3QgeG1hbGxvYyBhbmQgeHJlYWxsb2MgcmV0dXJuLgotCi1Nb24gQXVnICA1IDE2OjI2OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsZXgubDogUmVjb2duaXplIE9WRVJMQVkuCi0JKiBsZGdyYW0ueTogQWRkIHNlY3Rpb25fcGhkciBmaWVsZCB0byAldW5pb24uCi0JKHNlY3Rpb24pOiBIYW5kbGUgcGhkcl9vcHQgcmVzdWx0LiAgQWRkIE9WRVJMQVkgY2FzZS4KLQkob3B0X2V4cF93aXRob3V0X3R5cGUpOiBOZXcgbm9udGVybWluYWwuCi0JKHBoZHJfb3B0KTogUmV0dXJuIGxpc3Qgb2YgcGhkcnMuCi0JKG92ZXJsYXlfc2VjdGlvbik6IE5ldyBub250ZXJtaW5hbC4KLQkqIGxkbGFuZy5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkobGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBBZGQgcGhkcnMgcGFyYW1ldGVyLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkobGFuZ19zZWN0aW9uX2luX3BoZHIpOiBSZW1vdmUuCi0JKG92ZXJsYXlfdm1hLCBvdmVybGF5X2xtbiwgb3ZlcmxheV9tYXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc3RydWN0IG92ZXJsYXlfbGlzdCk6IERlZmluZS4KLQkob3ZlcmxheV9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobGFuZ19lbnRlcl9vdmVybGF5LCBsYW5nX2VudGVyX292ZXJsYXlfc2VjdGlvbik6IE5ldyBmdW5jdGlvbnMuCi0JKGxhbmdfbGVhdmVfb3ZlcmxheV9zZWN0aW9uLCBsYW5nX2xlYXZlX292ZXJsYXkpOiBOZXcgZnVuY3Rpb25zLgotCSogbGRsYW5nLmggKGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogVXBkYXRlCi0JZGVjbGFyYXRpb24gZm9yIG5ldyBwYXJhbWV0ZXIuCi0JKGxhbmdfc2VjdGlvbl9pbl9waGRyKTogRG9uJ3QgZGVjbGFyZS4KLQkobGFuZ19lbnRlcl9vdmVybGF5LCBsYW5nX2VudGVyX292ZXJsYXlfc2VjdGlvbik6IERlY2xhcmUuCi0JKGxhbmdfbGVhdmVfb3ZlcmxheV9zZWN0aW9uLCBsYW5nX2xlYXZlX292ZXJsYXkpOiBEZWNsYXJlLgotCSogbGQudGV4aW5mbyAoT3ZlcmxheXMpOiBOZXcgbm9kZSB1bmRlciBTRUNUSU9OUywgZG9jdW1lbnRpbmcKLQlvdmVybGF5cy4KLQotCSogbGRsZXgubDogUmVjb2duaXplIE1BWCBhbmQgTUlOLgotCSogbGRncmFtLnkgKE1BWCwgTUlOKTogTmV3IHRlcm1pbmFscy4KLQkoZXhwKTogUmVjb2duaXplIE1BWCBhbmQgTUlOLgotCSogbGRleHAuYyAoZm9sZF9iaW5hcnkpOiBIYW5kbGUgTUFYIGFuZCBNSU4uCi0JKiBsZC50ZXhpbmZvIChBcml0aG1ldGljIEZ1bmN0aW9ucyk6IERvY3VtZW50IE1BWCBhbmQgTUlOLgotCi0JKiBsZC50ZXhpbmZvIChQSERSUyk6IFVzZSBAY2luZGV4LCBub3QgQGtpbmRleCwgZm9yIHByb2dyYW0gaGVhZGVyCi0JaW5kZXggZW50cmllcy4KLQotCSogbGRncmFtLnkgKFNJWkVPRiwgQUREUik6IERvIG5vdCBzcGVjaWZ5IHR5cGUuCi0KLQkqIGxkY3JlZi5jIChjaGVja19ub2Nyb3NzcmVmKTogU2tpcCBzeW1ib2xzIHdpdGggbm8gb3V0cHV0Ci0Jc2VjdGlvbnMuCi0KLUZyaSBBdWcgIDIgMTQ6NTc6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoTE9BREFERFIpOiBOZXcgdGVybWluYWwuCi0JKGV4cCk6IEhhbmRsZSBMT0FEQUREUi4KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBMT0FEQUREUi4KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90b2tlbik6IEFkZCBMT0FEQUREUi4KLQkoZm9sZF9uYW1lKTogSW1wbGVtZW50IExPQURBRERSLgotCSogbGRsYW5nLmMgKGV4cF9pbml0X29zKTogVHJlYXQgTE9BREFERFIgbGlrZSBBRERSLgotCSogbGQudGV4aW5mbyAoQXJpdGhtZXRpYyBGdW5jdGlvbnMpOiBEb2N1bWVudCBMT0FEQUREUi4KLQotVGh1IEF1ZyAgMSAxMjo1MjoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGNoZWNrX25vY3Jvc3NyZWZzKTogRGVjbGFyZS4KLQkqIGxkbGFuZy5oIChzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmKTogRGVmaW5lLgotCShzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyk6IERlZmluZS4KLQkobm9jcm9zc3JlZl9saXN0KTogRGVjbGFyZS4KLQkobGFuZ19hZGRfbm9jcm9zc3JlZik6IERlY2xhcmUuCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgTk9DUk9TU1JFRlMga2V5d29yZC4KLQkqIGxkZ3JhbS55ICgldW5pb24pOiBBZGQgbm9jcm9zc3JlZiBmaWVsZC4KLQkoTk9DUk9TU1JFRlMpOiBOZXcgdGVybWluYWwuCi0JKGlmaWxlX3AxKTogUmVjb2duaXplIE5PQ1JPU1NSRUZTLgotCShub2Nyb3NzcmVmX2xpc3QpOiBOZXcgbm9udGVybWluYWwuCi0JKiBsZGxhbmcuYyAobm9jcm9zc3JlZl9saXN0KTogRGVmaW5lLgotCShsYW5nX2FkZF9ub2Nyb3NzcmVmKTogTmV3IGZ1bmN0aW9uLgotCSogbGRtYWluLmMgKG1haW4pOiBJZiBub2Nyb3NzcmVmX2xpc3QgaXMgbm90IE5VTEwsIGNhbGwKLQljaGVja19ub2Nyb3NzcmVmcy4KLQkod2FybmluZ19jYWxsYmFjayk6IEZyZWUgc3ltYm9scyBpZiB0aGVyZSBpcyBubyBwbGFjZSB0byBzdG9yZQotCXRoZW0uCi0JKG5vdGljZSk6IENhbGwgYWRkX2NyZWYgaWYgbm9jcm9zc3JlZl9saXN0IGlzIG5vdCBOVUxMLgotCSogbGRjcmVmLmM6IEluY2x1ZGUgImxkZXhwLmgiIGFuZCAibGRsYW5nLmgiLgotCShjaGVja19ub2Nyb3NzcmVmcyk6IE5ldyBmdW5jdGlvbi4KLQkoY2hlY2tfbm9jcm9zc3JlZik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBjaGVja19yZWZzX2luZm8pOiBEZWZpbmUuCi0JKGNoZWNrX3JlZnMsIGNoZWNrX3JlbG9jX3JlZnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIGxkLnRleGluZm8gKE9wdGlvbiBDb21tYW5kcyk6IERvY3VtZW50IE5PQ1JPU1NSRUZTLgotCi0JKiBsZC50ZXhpbmZvIChTZWN0aW9uIFBsYWNlbWVudCk6IEltcHJvdmUgdGhlIHdvcmRpbmcgb2YgdGhlCi0Jd2lsZGNhcmQgZG9jdW1lbnRhdGlvbi4gIE1lbnRpb24gdGhhdCB3aWxkY2FyZHMgYXJlIG9ubHkgc2VhcmNoZWQKLQlmb3Igb24gdGhlIGNvbW1hbmQgbGluZSwgbm90IGluIHRoZSBmaWxlIHN5c3RlbS4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogTW92ZQotCWRlZmluaXRpb24gb2YgbGliX3BhdGggaW5zaWRlIGNvbmRpdGlvbiB3aGVyZSBpdCBpcyB1c2VkLgotCi1XZWQgSnVsIDMxIDEzOjE3OjEwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0gCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoOiBOb3cgd29ya3Mgd2l0aCBlbGYuc2MuCi0KLVdlZCBKdWwgMzEgMTE6NTI6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoU0NSSVBUX05BTUUpOiBDaGFuZ2UgdG8gdmFuaWxsYS4KLQotVHVlIEp1bCAzMCAxNDo0Njo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBBZGQgdGhlIHNlY3Rpb24gVk1BIHRvIHRoZSByZXN1bHQKLQl2YWx1ZSB3aGVuIGNvbXB1dGluZyB0aGUgYWRkcmVzcyBvZiBhIHNlY3Rpb24uCi0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBjcmVmIGZpZWxkLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBTZXQgY29tbWFuZF9saW5lLmNyZWYuCi0JKiBsZG1haW4uYyAobWFpbik6IENoZWNrIGNvbW1hbmRfbGluZS5jcmVmIHJhdGhlciB0aGFuCi0JbGlua19pbmZvLm5vdGljZV9hbGwuCi0JKG5vdGljZSk6IExpa2V3aXNlLgotCi0JKiBsZGNyZWYuYyAob3V0cHV0X29uZV9jcmVmKTogRG9uJ3QgY3Jhc2ggaWYgYSBzeW1ib2wgaXMgZGVmaW5lZAotCWluIGEgc2VjdGlvbiB3aXRob3V0IGFuIG93bmVyLgotCi1Nb24gSnVsIDI5IDE3OjIzOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5oLCBmbm1hdGNoLmM6IE5ldyBmaWxlcy4KLQkqIGxkbGV4Lmw6IFJlbW92ZSB1bnVzZWQgZGVmaW5pdGlvbiBvZiBGSUxFTkFNRS4gIEFkZCBkZWZpbml0aW9uCi0Jb2YgV0lMRENIQVIuICBJbiBTQ1JJUFQgbW9kZSwgYWNjZXB0IGFueSBzZXF1ZW5jZSBvZiBXSUxEQ0hBUiBhcyBhCi0JTkFNRS4KLQkqIGxkZ3JhbS55IChmaWxlX05BTUVfbGlzdCk6IEFjY2VwdCAnKicgYW5kICc/JyBzcGVjaWFsbHkuCi0JKGlucHV0X3NlY3Rpb25fc3BlYyk6IEFjY2VwdCAnPycgc3BlY2lhbGx5LgotCShzdGF0ZW1lbnQpOiBDaGFuZ2UgZXhwIHRvIG11c3RiZV9leHAgaW4gbGVuZ3RoIGFuZCBGSUxMIGNhc2VzLgotCShzZWN0aW9uKTogQ2FsbCBsZGxleF9zY3JpcHQgYmVmb3JlIHNlY3Rpb24gc3RhdGVtZW50cywgYW5kIGNhbGwKLQlsZGxleF9wb3BzdGF0ZSBhZnRlciB0aGVtLgotCSogbGRsYW5nLmM6IEluY2x1ZGUgImZubWF0Y2guaCIuCi0JKHdpbGRjYXJkcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHdpbGRfc2VjdGlvbik6IFBlcm1pdCB0aGUgc2VjdGlvbiBuYW1lIHRvIGJlIGEgd2lsZGNhcmQuCi0JKHdpbGRfZmlsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2Ygd2lsZC4KLQkod2lsZCk6IENhbGwgd2lsZF9maWxlLiAgUGVybWl0IHRoZSBmaWxlIG5hbWUgdG8gYmUgYSB3aWxkY2FyZC4KLQkob3Blbl9pbnB1dF9iZmRzKTogRG9uJ3QgY2FsbCBsb29rdXBfbmFtZSBmb3IgYSB3aWxkY2FyZCBwYXR0ZXJuLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQ0ZJTEVTKTogQWRkIGZubWF0Y2guYy4KLQkoSEZJTEVTKTogQWRkIGZubWF0Y2guaC4KLQkoT0ZJTEVTKTogQWRkIGZubWF0Y2guby4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHRoYXQgZmlsZSBhbmQgc2VjdGlvbiBuYW1lcyBjYW4gbm93IGJlCi0Jd2lsZGNhcmQgcGF0dGVybnMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3BsYWNlX29ycGhhbnMpOiBDb3JyZWN0IGNvbmRpdGlvbjogcGxhY2UgYSBjb21tb24KLQlzZWN0aW9uIGlmIG5vdCByZWxvY2F0ZWFibGUgb3IgaWYgY29tbW9uIGRlZmluaXRpb25zIGFyZSBmb3JjZWQuCi0KLVdlZCBKdWwgMjQgMTI6MTY6MzggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoU0NSSVBUX05BTUUpOiBDaGFuZ2UgdG8gZWxmLgotCi1XZWQgSnVsIDI0IDEzOjM4OjIyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGQxMHYtKi0qKTogRG9uJ3QgcmVxdWlyZSB0aGUgLWVsZiwgYWxsb3cgcGxhaW4gZDEwdi4KLQotVHVlIEp1bCAyMyAxMDozNjoxOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGVkMTB2ZWxmLmMpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLnRndCAoZDEwdi0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoOiBOZXcgZmlsZS4KLQotVGh1IEp1bCAxOCAxNjoyNTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjKi0qLXN5c3Y0Kik6IE5ldyB0YXJnZXQuICBGcm9tIEFuZHJldyBHaWVydGgKLQk8QU5EUkVXR0BtaWNyb2xpc2UuY28udWs+LgotCi0JKiBjb25maWd1cmUuaG9zdDogQ2hhbmdlIGlyaXg1IHRvIGlyaXhbNTZdKi4KLQkqIGNvbmZpZ3VyZS50Z3Q6IExpa2V3aXNlLgotCi1XZWQgSnVsIDE3IDEwOjUyOjQ2IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfc2VjdGlvbnMpOiBQYXkgYXR0ZW50aW9uIHRvIHJldHVybiBjb2RlLgotCi0JKiBsZG1pc2MuYyAoZGVtYW5nbGUpOiBSZW1vdmUgYWxsIHByZWZpeCAnLidzIGZyb20gYSBuYW1lLgotCi1Nb24gSnVsIDE1IDExOjQ5OjQ5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJvdW5kCi0gCXRoZSB2YWx1ZSBvZiBfX3N0YXJ0X1NFQ05BTUUgdG8gdGhlIGFsaWdubWVudCByZXF1aXJlZCBieSB0aGUKLSAJc2VjdGlvbiB0byBiZSBwbGFjZWQuCi0KLVR1ZSBKdWwgIDkgMTI6MDk6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKmVsLSotZWxmKik6IFVzZSBlbGYzMmVsbWlwLgotCShtaXBzKi0qLWVsZiopOiBVc2UgZWxmMzJlYm1pcC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoIChFTUJFRERFRCk6IERvbid0IGRlZmluZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwLnNoIChFTUJFRERFRCk6IERvbid0IGRlZmluZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaDogTmV3IGZpbGU7IGNvcHkgb2YgZWxmMzJsbWlwLnNoIHdpdGgKLQlFTUJFRERFRCBkZWZpbmVkLgotCSogZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoOiBOZXcgZmlsZTsgY29weSBvZiBlbGYzMmJtaXAuc2ggd2l0aAotCUVNQkVEREVEIGRlZmluZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggKEVNQkVEREVEKTogRGVmaW5lLgotCSogZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIChFTUJFRERFRCk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZWxmMzJlYm1pcC5vIGVlbGYzMmVsbWlwLm8uCi0JKGVlbGYzMmVibWlwLmMsIGVlbGYzMmVsbWlwLmMpOiBOZXcgdGFyZ2V0cy4KLQotVGh1IEp1bCAgNCAxMjowMTowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFNldCB2ZXJzaW9uIHRvIGN5Z251cy0yLjcuMS4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi0JKiBlbXVscGFyYW1zL3BjNTMybWFjaGEuc2g6IFJlbmFtZSBmcm9tIHBjNTMybWFjaGFvdXQuc2ggdG8gYXZvaWQKLQlTeXN0ZW0gViBmaWxlIG5hbWUgbGltaXRhdGlvbnMuCi0JKiBjb25maWd1cmUudGd0IChuYzMyay1wYzUzMi1tYWNoKiwgbnMzMmstcGM1MzItdXgqKTogVXNlCi0JcGM1MzJtYWNoYSByYXRoZXIgdGhhbiBwYzUzMm1hY2hhb3V0LgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQ2hhbmdlIGVwYzUzMm1hY2hhb3V0Lm8gdG8KLQllcGM1MzJtYWNoYS5vLgotCShlcGM1MzJtYWNoYS5jKTogUmVuYW1lIHRhcmdldCBmcm9tIGVwYzUzMm1hY2hhb3V0LmMuCi0KLVdlZCBKdWwgIDMgMTE6NDA6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAocHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQpOiBVc2UgJXUsIG5vdCAleCwgdG8gcHJpbnQKLQlmaWxsIHZhbHVlLgotCi1TdW4gSnVuIDMwIDExOjE2OjQzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWVwcGNtYWMuYzogVXBkYXRlIHRvIHJlZmxlY3QgTWF5IDIzIGNoYW5nZSB0byBhaXguZW0uCi0KLVRodSBKdW4gMjcgMTQ6MDM6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBQdXQgdGhlIC5zYQotCWZpbGUganVzdCBiZWZvcmUgdGhlIC5zbyBmaWxlLCByYXRoZXIgdGhhbiBqdXN0IGFmdGVyLgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIC1wcmludC1maWxlLW5hbWU9RklMRSByYXRoZXIgdGhhbiBwaXBpbmcKLQktcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSB0aHJvdWdoIHNlZC4KLQkoaVszNDVdODYqLSotc2NvKiwgaVszNDVdODYtKi1pc2MqKTogQ3JlYXRlIGNydGJlZ2luLm8gYW5kCi0JY3J0ZW5kLm8gZmlsZXMsIGluIGNhc2UgZ2NjIGRvZXNuJ3QgdXNlIHRoZW0uCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBSZW1vdmUgY3J0YmVnaW4ubyBhbmQgY3J0ZW5kLm8uCi0KLVdlZCBKdW4gMjYgMTU6NTc6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi1kZWMtb3NmKik6IE5ldyB0YXJnZXQuCi0KLVR1ZSBKdW4gMjUgMjI6MTU6MjkgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0JSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQkoQUNfUFJPR19JTlNUQUxMKTogQWRkZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBKdW4gMjQgMTg6NDg6MTYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyk6IERvbid0IGRvIGEKLQlQUk9WSURFIG9mIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgc2luY2UgaXQgbmVlZHMgdG8gYmUgYXQgYQotCW5vbi1maXhlZCBsb2NhdGlvbi4KLQotTW9uIEp1biAyNCAxNzo1NTozMSAxOTk2ICBKb3VrZSBOdW1hbiAgPGpudW1hbkBiYXppcy5ubD4KLQotCSogbGRsYW5nLmggKGVudW0gc2VjdGlvbl90eXBlKTogRGVmaW5lLgotCShsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlKTogUmVtb3ZlIGxvYWRhYmxlIGZpZWxkLiAgQWRkCi0Jc2VjdHlwZSBmaWVsZC4KLQkobGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBDaGFuZ2UgZmxhZ3MgcGFyYW1ldGVyIGluCi0JcHJvdG90eXBlIHRvIHNlY3R5cGUuCi0JKiBsZGdyYW0ueSAodHlwZWJpdHMpOiBSZW1vdmUuCi0JKHNlY3R5cGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShvcHRfYXQpOiBVc2Ugc2VjdHlwZSByYXRoZXIgdGhhbiB0eXBlYml0cy4KLQkodHlwZSk6IFNldCBzZWN0eXBlIHJhdGhlciB0aGFuIHR5cGViaXRzLgotCShhdHlwZSk6IExpa2V3aXNlLgotCSogbGRsZXgubDogUmVjb2duaXplIERTRUNULCBDT1BZLCBJTkZPLCBhbmQgT1ZFUkxBWSBpbgotCUVYUFJFU1NJT04gbW9kZS4KLQkqIGxkbGFuZy5jIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXApOiBTZXQgc2VjdHlwZQotCWZpZWxkIHJhdGhlciB0aGFuIGxvYWRhYmxlIGZpZWxkLgotCSh3aWxkX2RvaXQpOiBDaGVjayBzZWN0eXBlIHJhdGhlciB0aGFuIGxvYWRhYmxlLgotCShsYW5nX3JlY29yZF9waGRycyk6IExpa2V3aXNlLgotCShsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFJlbmFtZSBmbGFncyBwYXJhbWV0ZXIgdG8KLQlzZWN0eXBlLiAgU2V0IHNlY3R5cGUgZmllbGQgcmF0aGVyIHRoYW4gbG9hZGFibGUgZmllbGQuICBTZXQgZmxhZ3MKLQlmaWVsZCBiYXNlZCBvbiBzZWN0eXBlLgotCi1Nb24gSnVuIDI0IDEyOjAwOjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBGb3JjZSAuc3RhYiogYW5kIC5jb21tZW50IHNlY3Rpb25zIHRvIHN0YXJ0Ci0JYXQgMC4KLQotCSogY29uZmlndXJlLmluOiBPbiBhbHBoYSotKi1vc2YqLCBsaW5rIGFnYWluc3QgbGliYmZkLmEgaWYgbm90Ci0JdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCi0KLUZyaSBKdW4gMjEgMTc6NDA6NTYgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAbWVybGluLmdjcy5yZWRzdG9uZS5hcm15Lm1pbD4KLQotCSogY29uZmlndXJlLnRndDogQWRkIHN1cHBvcnQgZm9yICotKi1ydGVtcyogY29uZmlndXJhdGlvbnMuCi0KLUZyaSBKdW4gMjEgMTM6MDU6NTEgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGFscGhhLSotbGludXhlY29mZiopOiBOZXcgdGFyZ2V0LgotCShhbHBoYS0qLWxpbnV4Kik6IFVzZSBlbGY2NGFscGhhLgotCSogZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoOiBOZXcgZmlsZS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogSWYgRUxGU0laRSBpcyBub3Qgc2V0LCBzZXQgaXQgdG8gMzIuICBVc2UKLQkke0VMRlNJWkV9IHJhdGhlciB0aGFuIDMyIHdoZW4gY2FsbGluZyBCRkQgcm91dGluZXMuCi0JKGhvbGRfcm9kYXRhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogVXNlIGhvbGRfcm9kYXRhIGZvciBhCi0JcmVhZG9ubHkgc2VjdGlvbiB0aGF0IGlzIG5vdCBjb2RlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogU2V0IGhvbGRfcm9kYXRhLiAgRG9uJ3QgdXNlCi0JYSAucmVsIHNlY3Rpb24gdW5sZXNzIGl0cyBiZmRfc2VjdGlvbiBmaWVsZCBpcyBub3QgTlVMTC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZWxmNjRhbHBoYS5vLgotCShlZWxmNjRhbHBoYS5jKTogTmV3IHRhcmdldC4KLQotRnJpIEp1biAyMSAxMjo0NTo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBDb3JyZWN0IGhhbmRsaW5nIG9mIDAgaW4gJVcgY2FzZS4KLQotVGh1IEp1biAyMCAxMzo1NToyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgZW5vdWdoIHN1cHBvcnQgdG8gdW5kZXJzdGFuZCB0aGUgZ2NjIHN2cjMuaWZpbGUgc2NyaXB0OgotCSogbGRsZXgubDogUmVjb2duaXplIEJMT0NLIGFuZCBHUk9VUCBpbiBFWFBSRVNTSU9OIGNvbnRleHQuICBBZGQKLQlCSU5EIGtleXdvcmQuCi0JKiBsZGdyYW0ueTogQWRkIEJJTkQgdG9rZW4uCi0JKHNlY3Rpb24pOiBSZWNvZ25pemUgR1JPVVAuCi0JKG9wdF9leHRfd2l0aF90eXBlKTogUmVjb2duaXplIGEgY291cGxlIG9mIGNhc2VzIG9mIEJJTkQuCi0JKiBsZGxhbmcuYyAoaW5pdF9vcyk6IERvbid0IGRvIGFueXRoaW5nIGlmIHNlY3Rpb24gaXMgYWxyZWFkeQotCWluaXRpYWxpemVkLiAgQ2FsbCBleHBfaW5pdF9vcyBvbiBhZGRyX3RyZWUgZmllbGQuCi0JKGV4cF9pbml0X29zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyk6IENhbGwgZXhwX2luaXRfb3Mgb24gYXNzaWdubWVudAotCWV4cHJlc3Npb24uCi0JKGxhbmdfcGxhY2Vfb3JwaGFucyk6IENoZWNrIGZvciBjb21tb24gc2VjdGlvbnMgYnkgbmFtZSBDT01NT04KLQlyYXRoZXIgdGhhbiBieSBjb21tb25fc2VjdGlvbiBmaWVsZC4gIERvbid0IHdhcm4gYWJvdXQgYWJzZW5jZSBvZgotCVtDT01NT05dIGNvbW1hbmQuCi0KLQkqIGxkbGFuZy5oIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKTogUmVtb3ZlIHVzZWxlc3MgZmllbGRzCi0JY29tbW9uX3NlY3Rpb24sIGNvbW1vbl9vdXRwdXRfc2VjdGlvbiwgYW5kIGNvbXBsYWluZWQsIGFzIHdlbGwgYXMKLQlhbGwgcmVmZXJlbmNlcyB0byB0aGVtLgotCi0JKiBsZGV4cC5jOiBSZWluZGVudCBhIGxvdCBvZiBjb2RlLgotCShleHBfZm9sZF90cmVlKTogQ2FsbCBGQUlMIHJhdGhlciB0aGFuIGVpbmZvIGluIGRlZmF1bHQgY2FzZS4KLQotV2VkIEp1biAxOSAxMTo0MDoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtODgqLSotZGd1eCopOiBRdW90ZSBIT1NUSU5HX0NSVDAuICBGcm9tCi0JPHJhbmRhbGwuaHJvbkBtZWRhcGhpcy5jb20+LgotCi1UdWUgSnVuIDE4IDE1OjUzOjA5IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMHMuc2M6IE5ldyBmaWxlIGZvciBIOC9TLgotCSogZW11bHBhcmFybXMvaDgzMDBzLnNoOiBOZXcgZmlsZSBmb3IgSDgvUy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBIOC9TLgotCShlX2g4MzAwcy5jKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBIOC9TIHRvIHRhcmdfZXh0cmFfZW11bHMuCi0KLVR1ZSBKdW4gMTggMTc6NTU6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NV04NiotKi1pc2MqKTogTmV3IHRhcmdldC4gIEZyb20KLQk8dWRkZWJvcmdAY2FybWVuLnNlPi4KLQotV2VkIEp1biAxMiAxMjo0NjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0gCShwYXJzZV9hcmdzKTogQ29weSB0aGUgLVkgYXJndW1lbnQgaW50byBtZW1vcnkuCi0gCShzZXRfZGVmYXVsdF9kaXJsaXN0KTogRG9uJ3QgcHV0IHRoZSAnOicgYmFjayBpbnRvIHRoZSBkaXJlY3RvcnkKLQlsaXN0LgotCi1GcmkgSnVuICA3IDExOjI3OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24gdG8gYWRkCi0JTERfTElCUkFSWV9QQVRIIHRvIHRoZSBsaXN0IG9mIHNlYXJjaCBkaXJlY3Rvcmllcy4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogQWRkIG5ldyBzZXRfc3ltYm9scyByb3V0aW5lLgotCi1UaHUgSnVuICA2IDExOjUwOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggKE9USEVSX0dPVF9TWU1CT0xTKTogVXNlIEFMSUdOKDE2KQotCXJhdGhlciB0aGFuIC4gd2hlbiBjb21wdXRpbmcgX2dwIHZhbHVlLiAgRnJvbSBQZXIgRm9nZWxzdHJvbS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwLnNoIChPVEhFUl9HT1RfU1lNQk9MUyk6IExpa2V3aXNlLgotCi0JKiBsZG1haW4uYyAobWFpbik6IERvbid0IGNsb3NlIGFuZCB1bmxpbmsgdGhlIGZpbGUgb24gZXJyb3IsIHNpbmNlCi0JcmVtb3ZlX291dHB1dCB3aWxsIGRvIGl0IGFueWhvdy4KLQkqIGxkbGFuZy5jIChvcGVuX291dHB1dCk6IFNldCBib29sZWFuIHZhcmlhYmxlIHRvIHRydWUsIG5vdCAxLgotCi1XZWQgSnVuICA1IDE4OjM0OjE0IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZW11bHBhcmFtcy97ZWxmMzJiNDMwMC5zaCxlbGYzMmw0MzAwLnNofSAoU0NSSVBUX05BTUUpOiBVc2UKLQllbGZtaXBzIGluc3RlYWQgb2YgZWxmLgotCi1UdWUgSnVuICA0IDE4OjQzOjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRjcmVmLmM6IE5ldyBmaWxlLgotCSogbGQuaCAoYWRkX2NyZWYsIG91dHB1dF9jcmVmKTogRGVjbGFyZS4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBub3RpY2VfYWxsIGZpZWxkLiAgSWYgaXQgaXMgc2V0IGF0Ci0JZW5kIG9mIGxpbmssIGNhbGwgb3V0cHV0X2NyZWYuCi0JKG5vdGljZSk6IFJlbmFtZSBmcm9tIG5vdGljZV95c3ltLiAgQ2hlY2sgbm90aWNlX2FsbC4KLQkqIGxkbWlzYy5jIChmaW5mbyk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkqIGxkbWlzYy5oIChmaW5mbyk6IERlY2xhcmUuCi0JKiBsZXhzdXAuYyAoT1BUSU9OX0NSRUYpOiBEZWZpbmUuCi0JKGxkX29wdGlvbnMpOiBBZGQgImNyZWYiLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIE9QVElPTl9DUkVGLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgbGRjcmVmLmMuCi0JKE9GSUxFUyk6IEFkZCBsZGNyZWYuby4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0tY3JlZi4KLQotVHVlIEp1biAgNCAxMjoxMjoyNSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNzazMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBNYWtlICQodG9vbGRpcikgYW5kICQodG9vbGRpcikvYmluLgotCi1GcmkgTWF5IDMxIDEyOjQwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzb3J0X3NlY3Rpb25zKTogRG9uJ3QgYXNzdW1lIHRoYXQgYQotCXdpbGRfc3RhdGVtZW50IGhhcyBhIHNlY3Rpb24gbmFtZS4KLQotV2VkIE1heSAyOSAxMzoxMzozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFF1b3RlIHRlc3QgLXogYXJndW1lbnQuCi0KLQkqIGxkLnRleGluZm86IENsYXJpZnkgdGhlIENPTlNUUlVDVE9SUyBjb21tYW5kLgotCi1UaHUgTWF5IDIzIDE2OjA3OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlKTogSW5pdGlhbGl6ZQotCWZpbGUsIG5vdCBpbXBmaWxlLgotCi1XZWQgTWF5IDIyIDExOjMxOjMwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogRG9uJ3QgY29weSBvdmVyIFNFQ19MSU5LX3tPTkNFLERVUExJQ0FURVN9Ci0JaWYgZmluYWwgbGluay4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2Z1bmMpOiBSZW5hbWVkIHRvIHNvcnRfYnlfZmlsZV9uYW1lLgotCShzb3J0X2J5X3NlY3Rpb25fbmFtZSwgc29ydF9zZWN0aW9uc18xKTogTmV3IGZ1bmN0aW9ucy4KLQkoc29ydF9zZWN0aW9ucyk6IE9ubHkgc29ydCBieSBmaWxlIG5hbWUgc2VjdGlvbnMgaW4gLmlkYXRhLgotCUFkZCAiR3JvdXBlZCBTZWN0aW9ucyIgc3VwcG9ydC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUmV3cml0ZSB0byBzdXBwb3J0IEdyb3VwZWQKLQlTZWN0aW9ucy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IERlbGV0ZS4KLQkqIHNjcmlwdHRlbXBsL3BlLnNjICgudGV4dCwuZGF0YSwucmRhdGEpOiBBZGQgKiguZm9vXCQpLgotCSguQ1JULC5yc3JjKTogUmV3cml0ZSB0byB1c2UgR3JvdXBlZCBTZWN0aW9uIHN1cHBvcnQuCi0KLVR1ZSBNYXkgMjEgMTQ6MzE6NDggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctZXBwY21hYy5jOiBVcGRhdGUgdG8gcmVmbGVjdCBjaGFuZ2VzIHRvIGFpeC5lbS4KLQotU3VuIE1heSAxOSAxNjo1OTo0NCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGRwcmludF9zdGF0ZW1lbnQpOiBTdG9wIHByaW50aW5nIGF0IGVuZCBvZiBsaXN0LgotCi1TYXQgTWF5IDE4IDEzOjEyOjA1IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciAtLWZvcmNlLWV4ZS1zdWZmaXgKLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBmb3JjZV9leGVfc3VmZml4LgotCSogbGQudGV4aW5mbzogQWRkIGRvY3VtZW50YXRpb24uCi0JKiBsZG1haW4uYyAobWFpbik6ICBBZGQgc3VwcG9ydCBmb3Igb3B0aW9uLgotCSogbGV4c3VwLmMgKE9QVElPTl9GT1JDRV9FWEVfU1VGRklYKTogTmV3LgotCShsZF9vcHRpb25zLCBwYXJzZV9hcmdzKTogIEFkZCBzdXBwb3J0IGZvciBvcHRpb24uCi0KLVdlZCBNYXkgMTUgMTI6NTA6MjUgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNldF9wZV92YWx1ZSk6IFBhc3MgMCBub3QgMTYgdG8gc3RydG91bCBjYWxsLgotCi1GcmkgTWF5IDEwIDE2OjI4OjQ0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjIChfX3N0YWNrKTogTWFrZSBfX3N0YWNrIDAgaWYgaXQgd2FzCi0JcmVmZXJlbmNlZCBidXQgbm90IGRlZmluZWQuCi0KLVRodSBNYXkgIDkgMDg6NTI6MjMgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy97ZWxmMzJibWlwLnNoLGVsZjMybG1pcC5zaCxtaXBzaWR0LnNoLG1pcHNpZHRsLnNofToKLQlTZXQgYSBuZXcgdmFyaWFibGUgdG8gc2lnbmlmeSBpZiB0aGUgZmluYWwgdGFyZ2V0IGlzIGFuIGVtYmVkZGVkCi0Jc3lzdGVtLgotCSogc2NyaXB0dGVtcGwve21pcHMuc2MsZWxmbWlwcy5zY306IERvbid0IGFkZCBTSVpFT0ZfSEVBREVSUyB0bwotCS50ZXh0IGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0uCi0KLVR1ZSBNYXkgIDcgMTA6NTY6MTEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IE5ldyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoaG9sZF97c2VjdGlvbix1c2UsdGV4dCxyZGF0YSxkYXRhfSk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBVcGRhdGUgb3JwaGFuIGZpZWxkLgotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFdoaXRlc3BhY2UgY2xlYW51cC4gIFNlbWljb2xvbiB1c2FnZSBjbGVhbnVwLgotCShJTklULEZJTkkpOiBEZWxldGUsIHVudXNlZC4KLQkoLnRleHQpOiBEb2N1bWVudCBvcnBoYW4gLnRleHQuZm9vIHNlY3Rpb25zLgotCSgucmRhdGEpOiBEb2N1bWVudCBvcnBoYW4gLnJkYXRhLmZvbyBzZWN0aW9ucy4KLQkoLmRhdGEpOiBEb2N1bWVudCBvcnBoYW4gLmRhdGEuZm9vIHNlY3Rpb25zLgotCi1UdWUgTWF5ICA3IDExOjM1OjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IFBsYWNlICIudGlueSIgc2VjdGlvbnMgcmlnaHQKLQlhZnRlciAiLmRhdGEiIHNlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBQbGFjZSAiLnRpbnkiIHNlY3Rpb25zIGludG8KLQl0aGUgInRpbnkiIG1lbW9yeSByZWdpb24sIDB4ZmY4MDAwIHRocm91Z2ggMHhmZmZmMDAuCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBTZXQgdGhlIGVudHJ5IHBvaW50IHRvIHRoZSB2YWx1ZSBvZgotCSJfc3RhcnQiIHJhdGhlciB0aGFuIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IFBsYWNlIC5yb2RhdGEgc2VjdGlvbnMgYmVmb3JlIC50ZXh0Ci0Jc2VjdGlvbnMgaW4gbWFpbiByYW0uCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgotCi1Nb24gTWF5ICA2IDIzOjMyOjMwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBVc2UgImVpZ2h0Iiwgbm90ICJlaWdodGJpdCIgZm9yIHRoZQotCTgtYml0IHJlZ2lvbiBhbmQgOC1iaXQgc2VjdGlvbnMuCi0KLVdlZCBNYXkgIDEgMTc6NTA6MDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHNlY3Rpb25fYWxyZWFkeV9saW5rZWQpOiBGaXggdHlwb3MuCi0KLU1vbiBBcHIgMjkgMjA6MzE6MDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2MgKC5lbmRqdW5rKTogRGVmaW5lIF9fZW5kX18uCi0KLU1vbiBBcHIgMjkgMTc6MDU6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobG9uZ2VzdF9zZWN0aW9uX25hbWUpOiBSZW1vdmUuCi0JKFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIKTogRGVmaW5lLgotCShwcmludF9zaXplLCBwcmludF9hbGlnbm1lbnQsIHByaW50X2ZpbGwsIHByaW50X3NlY3Rpb24pOiBSZW1vdmUuCi0JKHByaW50X2ZsYWdzKTogUmVtb3ZlLgotCShsYW5nX21hcCk6IFJld3JpdGUuCi0JKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X2Fzc2lnbm1lbnQpOiBSZXdyaXRlLgotCShwcmludF9vbmVfc3ltYm9sKTogUmV3cml0ZS4KLQkocHJpbnRfaW5wdXRfc2VjdGlvbik6IFJld3JpdGUuCi0JKHByaW50X2ZpbGxfc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfZGF0YV9zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF9hZGRyZXNzX3N0YXRlbWVudCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByaW50X3JlbG9jX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X3BhZGRpbmdfc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfd2lsZF9zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF9zdGF0ZW1lbnRfbGlzdCk6IENsZWFuIHVwLgotCShwcmludF9zdGF0ZW1lbnQpOiBDbGVhbiB1cC4gIFNvbWUgbWlub3Igb3V0cHV0IGNoYW5nZXMuCi0JKHByaW50X3N0YXRlbWVudHMpOiBDbGVhbiB1cC4KLQkobG9hZF9zeW1ib2xzKTogUHV0IGFub3RoZXIgLSBiZWZvcmUgLXdob2xlLWFyY2hpdmUuCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdHJlZSk6IENoYW5nZSBldHJlZV92YWx1ZSBhbmQgZXRyZWVfcmVsIHRvCi0JcHJpbnQgMHggYW5kIHRvIG9taXQgbGVhZGluZyB6ZXJvZXMuICBGb3IgZXRyZWVfcmVsLCB1c2UgJUIgdG8KLQlwcmludCB0aGUgQkZELiAgRm9yIGV0cmVlX2Fzc2lnbiwgcmVtb3ZlIHRoZSBzcGFjZSBhZnRlciB0aGUKLQlkZXN0aW5hdGlvbiBuYW1lLgotCSogbGR3cml0ZS5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKGNsb25lX3NlY3Rpb24pOiBDYWxsIHhzdHJkdXAsIG5vdCBzdHJkdXAuCi0JKGxkd3JpdGUpOiBEb24ndCBwcmludCBhbnkgbWFwIGluZm9ybWF0aW9uLgotCShwcmludF9zeW1ib2xfdGFibGUsIHByaW50X2ZpbGVfc3R1ZmYsIHByaW50X3N5bWJvbCk6IFJlbW92ZS4KLQkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCBsYW5nX21hcCB3aGVuIGFwcHJvcHJpYXRlLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEFkZCBzdXBwb3J0IGZvciAlVy4KLQkocHJpbnRfYWRkcmVzcyk6IFJlbW92ZS4KLQkqIGxkbWlzYy5oIChwcmludF9hZGRyZXNzKTogRG9uJ3QgZGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotTW9uIEFwciAyOSAxMDoyOTowNyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmhvc3QgKG02OCotKi1saW51eCopOiBBZGQgLWR5bmFtaWMtbGlua2VyIHRvCi0gCUhPU1RJTkdfQ1JUMC4gIFNlYXJjaCAtbGdjYyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgLWxjIGluCi0gCUhPU1RJTkdfTElCUy4gIExvb2sgZm9yIGNydHtiZWdpbixlbmR9Lm8gaW4gdGhlIGNvbXBpbGVyIGRpcmVjdG9yeQotIAlhdCBmaXJzdC4KLQkoaVszNDVdODYtKi1saW51eCopOiBMb29rIGZvciBjcnR7YmVnaW4sZW5kfS5vIGluIHRoZSBjb21waWxlcgotCWRpcmVjdG9yeSBhdCBmaXJzdC4KLQotRnJpIEFwciAyNiAxNDo0MjoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWlzYy5oIChkZW1hbmdsZSk6IERlY2xhcmUuCi0JKiBsZG1pc2MuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLiAgSW5jbHVkZSBkZW1hbmdsZS5oIHdpdGggIiIsCi0gCW5vdCA8Pi4KLQkoZGVtYW5nbGUpOiBNYWtlIG5vbi1zdGF0aWMuICBSZW1vdmUgcmVtb3ZlX3VuZGVyc2NvcmUgcGFyYW10ZXIuCi0JQWx3YXlzIHJldHVybiBhbiBhbGxvY2F0ZWQgc3RyaW5nLgotCSh2ZmluZm8pOiBGcmVlIHJlc3VsdCBvZiBkZW1hbmdsZS4gIEFkZCBjYXNlICdHJy4gIFVzZSAlVCB0byBwcmludAotCWZ1bmN0aW9ubmFtZSwgcmF0aGVyIHRoYW4gY2FsbGluZyBkZW1hbmdsZS4gIFByaW50IGEgY29sb24gYmV0d2VlbgotCXRoZSBCRkQoc2VjdGlvbitvZmZzZXQpIGFuZCB0aGUgbGluZSBudW1iZXIuCi0JKiBsZG1haW4uYyAoYWRkX2FyY2hpdmVfZWxlbWVudCk6IEltcHJvdmUgZm9ybWF0IG9mIGFyY2hpdmUKLQlpbmZvcm1hdGlvbiBpbiBtYXAgZmlsZS4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBEb24ndCBwcmludCBhbnl0aGluZyB0byB0aGUgbWFwIGZpbGUuCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogSW1wcm92ZSBmb3JtYXQgb2YgY29tbW9uIHN5bWJvbAotCWluZm9ybWF0aW9uIGluIG1hcCBmaWxlLgotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogSWYgcHJvZHVjaW5nIGEgbWFwIGZpbGUsIHByaW50IHNldAotCWluZm9ybWF0aW9uLgotCSogbGR3cml0ZS5jIChwcmludF9zeW1ib2xfdGFibGUpOiBQcmludCBhIG5ld2xpbmUgYmVmb3JlIHRoZQotCWhlYWRlciBpbiB0aGUgbWFwIGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBSZWluZGVudC4KLQotTW9uIEFwciAyMiAxMjowNzozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiBfY29va2VkX3NpemUgaXMgbm90IDAsIHRoZW4KLQlkb24ndCBjbG9iYmVyIGl0IHdoZW4gbm90IHJlbGF4aW5nLgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IFJlbW92ZSB0cmFkaXRpb25hbF9mb3JtYXQgZmllbGQuCi0JKiBsZG1haW4uYyAobWFpbik6IFVzZSBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0IHJhdGhlciB0aGFuCi0JY29uZmlnLnRyYWRpdGlvbmFsX2Zvcm1hdC4KLQkqIGxkbGFuZy5jIChsZGxhbmdfb3Blbl9vdXRwdXQpOiBMaWtld2lzZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogTGlrZXdpc2UuCi0JKiBtcHctZXBwY21hYy5jIChnbGRwcGNtYWNvc19wYXJzZV9hcmdzKTogTGlrZXdpc2UuCi0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBEaXNjYXJkIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiB3ZSBhcmUKLQlzdHJpcHBpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi0JKiBlbXVscGFyYW1zL3o4MDAyLnNoIChBUkNIKTogU2V0IHRvIHo4MDAyLCBub3QgejhrLgotCi1UdWUgQXByIDE2IDE2OjM4OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRleHAuYyAoZm9sZF9iaW5hcnkpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIHN1YnRyYWN0aW9uIHdpdGgKLQlhYnNvbHV0ZSB2YWx1ZXMuCi0JKGZvbGRfbmFtZSk6IFBlcm1pdCBzeW1ib2xzIGluIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLgotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBPbmx5IFBST1ZJREUgX19zdGFjayB3aGVuIFJFTE9DQVRJTkcuICBVbmRvCi0JYWNjaWRlbnRhbCBjaGFuZ2VzIGluIGxhc3QgcGF0Y2guCi0KLVR1ZSBBcHIgMTYgMTA6MjU6NDIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjKi0qLXtzeXN2LGxpbnV4fSk6IEFkZCBhbGlhc2VzLgotCShwb3dlcnBjbGUqLSote3N5c3Ysc29sYXJpc30pOiBEaXR0by4KLQotTW9uIEFwciAxNSAxNDo1MDo1NiAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBBZGQgUFJPVklERSAoX19zdGFjayA9IDApIHNvIEkgY2FuIHVzZSBpdAotCWluIG02OGsvY3J0MC5TIHdpdGhvdXQgdGhpbmdzIGJsb3dpbmcgdXAuCi0KLUZyaSBBcHIgMTIgMTY6NDA6NTYgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2M6IFJlbW92ZSBkZWZhdWx0IGFkZHJlc3MgZm9yIC5kYXRhIHNvCi0JLnRleHQsIC5kYXRhLCBhbmQgLmJzcyBhcmUgYWxsIHNlcXVlbnRpYWwuCi0KLVRodSBBcHIgMTEgMTI6MDU6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogUmVtb3ZlIHJlZ2lvbnMgYW5kIHNpbXBsaWZ5LgotCi1XZWQgQXByIDEwIDE0OjQxOjUzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IEFkZCB0aGUgIjgtYml0IGFyZWEiIGluIHRoZSB1cHBlciAyNTYKLQlieXRlcyBvZiB0aGUgYWRkcmVzcyBzcGFjZS4gIFB1dCBkYXRhIGZyb20gdGhlICIuZWlnaHQiIHNlY3Rpb25zCi0JaW50byB0aGUgOC1iaXQgYXJlYS4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTGlrZXdpc2UuCi0KLVR1ZSBBcHIgIDkgMTQ6MTA6NDIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2dlbmVyaWMuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6Ci0JUGFzcyAkQVJDSCB0byBsZGZpbGVfc2V0X291dHB1dF9hcmNoIGluc3RlYWQgb2Ygc2V0dGluZwotCWxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlIGRpcmVjdGx5LgotCi1UdWUgQXByICA5IDE0OjIyOjE1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjICguaW5pdCwuZmluaSk6IFB1dCAuaW5pdCwgLmZpbmkgc2VjdGlvbgotCW5leHQgdG8gLnRleHQuICBQdXQgX2V0ZXh0IGFmdGVyIC50ZXh0LCAuaW5pdCwgLmZpbmksIGFuZAotCS5yb2RhdGF7LDJ9IHNlY3Rpb25zLgotCi1UdWUgQXByICA5IDEyOjE4OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbzogUmVhcnJhbmdlIG9wdGlvbiBkb2N1bWVudGF0aW9uLgotCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKHBhcnNlX2FyZ3MpOiBCdWlsZCBzaG9ydG9wdHMgYW5kIGxvbmdvcHRzIGZyb20gbGRfb3B0aW9ucyBhcnJheS4KLQkoaGVscCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBsZHZlci5oIChoZWxwKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFJlaW5kZW50LgotCShoZWxwKTogUmVtb3ZlLgotCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBNZW50aW9uIC1FIGFzIGEgc3lub255bSBmb3IgLWV4cG9ydC1keW5hbWljLgotCi1Nb24gQXByICA4IDExOjU2OjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBXaGVuIGNoZWNraW5nIGZvciBhIG5hdGl2ZSBlbXVsYXRpb24sIGNoZWNrCi0JdGhhdCB0aGUgY3VycmVudCBlbXVsYXRpb24gaXMgdGhlIGRlZmF1bHQgZW11bGF0aW9uLgotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBMaWtld2lzZS4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIC1FIGFzIGEgc3lub255bSBmb3IgLWV4cG9ydC1keW5hbWljLAotCWZvciBIUC9VWCBjb21wYXRpYmlsaXR5LgotCi1GcmkgQXByICA1IDE0OjMwOjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mKTogTmV3Ci0Jc3RhdGljIGZ1bmN0aW9uLCBpZiAke2hvc3R9ID0gJHt0YXJnZXR9LgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogQ2FsbCBjaGVja19sZF9zb19jb25mIHRvIGZpbmQgYQotCW5lZWRlZCBzaGFyZWQgbGlicmFyeSBpZiAke2hvc3R9ID0gJFt0YXJnZXR9LgotCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1saW51eCopOiBBZGQgLWR5bmFtaWMtbGlua2VyIHRvCi0JSE9TVElOR19DUlQwLiAgU2VhcmNoIC1sZ2NjIGJvdGggYmVmb3JlIGFuZCBhZnRlciAtbGMgaW4KLQlIT1NUSU5HX0xJQlMuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBpWzM0NV04Ni0qLWZyZWVic2RlbGYqIHRhcmdldDsgZnJvbSBKb2huCi0JUG9sc3RyYSA8amRwQHBvbHN0cmEuY29tPi4KLQotRnJpIEFwciAgNSAxODoxMToyNSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJ7YixsfTQzMDAuc2ggKE1BQ0hJTkUpOiBBZGQgZXhwbGljaXQKLSAJYXJjaGl0ZWN0dXJlIG51bWJlci4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogVXNlICRNQUNISU5FIGRlZmluaXRpb24gaWYgcHJlc2VudC4KLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBGb3JjZSA0MTAwIGJ1aWxkIHRvIHVzZSBzYW1lCi0gCXRlbXBsYXRlIGFzIDQzMDAuCi0KLU1vbiBBcHIgIDEgMTc6MzU6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ2hhbmdlIHJlZ2lvbiBjaGVjayB0byBoYW5kbGUKLQlyZWdpb25zIHdoaWNoIGVuZCBhdCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBhZGRyZXNzIGNvcnJlY3RseS4KLQlGcm9tIFJvbGFuZCBXZWJlciA8cm93ZWJlckBpcmEudWthLmRlPi4KLQotCSogbGRsYW5nLmMgKHNlY3Rpb25fYWxyZWFkeV9saW5rZWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh3aWxkX2RvaXQpOiBEaXNjYXJkIHNlY3Rpb25zIHdpdGggU0VDX0VYQ0xVREUgc2V0IGlmIG5vdCBkb2luZyBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuICBEb24ndCB3b3JyeSBhYm91dCBzZWN0aW9uIGJlaW5nIE5VTEwsIHNpbmNlIGl0Ci0JbmV2ZXIgc2hvdWxkIGJlLiAgRG9uJ3QgY2FsbCBpbml0X29zIHVubGVzcyB0aGUgc2VjdGlvbiBpcyBnb2luZwotCXRvIGJlIGFkZGVkLgotCShsZGxhbmdfYWRkX2ZpbGUpOiBDYWxsIHNlY3Rpb25fYWxyZWFkeV9saW5rZWQgZm9yIGVhY2ggc2VjdGlvbi4KLQkqIGxkbWFpbi5jIChtdWx0aXBsZV9kZWZpbml0aW9uKTogRG9uJ3Qgd2FybiBhYm91dCBtdWx0aXBsZQotCWRlZmluaXRpb25zIGluIHNlY3Rpb25zIHdoaWNoIGFyZSBiZWluZyBkaXNjYXJkZWQuCi0KLVN1biBNYXIgMzEgMDA6MzA6NDcgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwve3BwY3BlLnNjLCBwZS5zY30gKC5qdW5rKTogUmVtb3ZlIGFuZCB1c2UgL0RJU0NBUkQvLgotCSogZW11bHRlbXBsL3BlLmVtIChpbml0KTogUmVtb3ZlIHNwZWNpYWwgY2FzZSBQUEMgY29kZS4KLQotRnJpIE1hciAyOSAwMDowMToyOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBNYWtlIHZlY3RvcnMgc2VjdGlvbiAweGM0IGJ5dGVzIGxvbmcKLQlzbyBhcyBub3QgdG8gb3ZlcndyaXRlIHRoZSBtYWdpYyBzeXNjYWxsIGVudHJ5IGF0IDB4YzQuCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgotCi1UaHUgTWFyIDI4IDExOjA1OjQ3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjNjQtKi1zb2xhcmlzMiopOiBEZWxldGUuCi0JU3RpY2sgd2l0aCBzcGFyYy0qLXNvbGFyaXMyKi4KLQotV2VkIE1hciAyNyAxMjozMzoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKERJU0NBUkRfU0VDVElPTl9OQU1FKTogRGVmaW5lIHRvICIvRElTQ0FSRC8iLgotCSogbGRsYW5nLmMgKGluaXRfb3MpOiBGYWlsIG9uIGFuIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSBhbnkgc2VjdGlvbgotCW5hbWVkIERJU0NBUkRfU0VDVElPTl9OQU1FLgotCSh3aWxkX2RvaXQpOiBEaXNjYXJkIGlucHV0IHNlY3Rpb25zIGFzc2lnbmVkIHRvIGFuIG91dHB1dCBzZWN0aW9uCi0JbmFtZWQgRElTQ0FSRF9TRUNUSU9OX05BTUUuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB1c2Ugb2YgL0RJU0NBUkQvLgotCi0JKiBsZGxhbmcuYzogRml4IHNvbWUgaW5kZW50YXRpb24gYW5kIGNvbW1lbnRzLgotCi1UdWUgTWFyIDI2IDE4OjE0OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBDYWxsIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lLgotCi1UaHUgTWFyIDIxIDEzOjE3OjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbzogRml4IGEgY291cGxlIG9mIGluZGV4aW5nIGVudHJpZXMuICBNZW50aW9uIHRoYXQKLQktLXZlcmJvc2UgZGlzcGxheXMgYnVpbHRpbiBsaW5rZXIgc2NyaXB0cy4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IGNhc2UgJ0knOiBJZiB0aGUgZmlsZSBpcyBub3QgaW4gYW4gYXJjaGl2ZSwKLQlhbmQgdGhlIGxvY2FsIHN5bWJvbCBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBmaWxlbmFtZSwgcHJpbnQgdGhlCi0JZmlsZW5hbWUgYXMgd2VsbC4KLQotCVBhdGNoZXMgZnJvbSBKb2huIFBvbHN0cmEgPGpkcEBwb2xzdHJhLmNvbT4gZm9yIEZyZWVCU0QgRUxGOgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiAtQnNoYXJlYWJsZSBpcyBhIHN5bm9ueW0gZm9yIC1zaGFyZWQuCi0JKiBlbXVscGFyYW1zL2VsZl9pMzg2LnNoIChOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBNYWtlIHRoZSBzYW1lCi0JYXMgVEVYVF9TVEFSVF9BRERSLgotCi1XZWQgTWFyIDIwIDE4OjE4OjI1IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC50ZXhpbmZvOiBGaXggdHlwb3MuICBVc2UgQHB4cmVmIG9ubHkgaW5zaWRlIHBhcmVudGhlc2VzLgotCi1XZWQgTWFyIDIwIDE2OjU2OjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKGFkZF93cmFwKTogTmV3IGZ1bmN0aW9uLgotCSogbGRtYWluLmggKGFkZF93cmFwKTogRGVjbGFyZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2FsbCBhZGRfd3JhcC4KLQotVHVlIE1hciAxOSAxNjo0NDoyMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMqLSotc29sYXJpczIqIGhvc3QpOiBBY2NlcHQgYW55IHNwYXJjIHZhcmlhbnQuCi0KLVdlZCBNYXIgMTMgMTc6NDc6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogQ2hhbmdlIG5hbWUgb2YgcGFnZSB6ZXJvIG1lbW9yeQotCWZyb20gIm51bGwiIHRvICJ2ZWN0b3JzIi4gIENyZWF0ZSBhbiBvdXRwdXQgc2VjdGlvbiBmb3IKLQl2ZWN0b3JzLiAgQWRkIGNvbW1lbnRzIG9uIGhvdyB0byBleHBsaWNpdGx5IHBsYWNlIGl0ZW1zCi0JaW4gdGhlIHZlY3RvciB0YWJsZS4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMTMgMTI6NDA6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvbG5rOTYwLmVtIChtYWNoaW5lX3RhYmxlKTogQWRkIGp4IGFuZCBoeC4KLQotCSogZ2Vuc2NyaXB0cy5zaDogRG9uJ3QgdXNlICR7OToteHh9LCBzaW5jZSBVbHRyaXggL2Jpbi9zaCBkb2Vzbid0Ci0Jc3VwcG9ydCBpdC4KLQotVHVlIE1hciAxMiAxMjo0Mzo1OSAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBrb2FsYS5henN0YXJuZXQuY29tPgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCB3YXJuX211bHRpcGxlX2dwIGZpZWxkLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS13YXJuLW11bHRpcGxlLWdwLgotCSogbGRtYWluLmMgKHdhcm5pbmdfY2FsbGJhY2spOiBTdXBwcmVzcyBtdWx0aXBsZSBncCB2YWx1ZXMgd2FybmluZwotCWlmIC0td2Fybl9tdWx0aXBsZV9ncCB3YXMgbm90IHVzZWQuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLXdhcm4tbXVsdGlwbGUtZ3AuCi0KLVR1ZSBNYXIgMTIgMTI6MDI6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtLXdyYXAuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLndyYXBfaGFzaC4KLQkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IFVzZSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIGluIERFRklORUQKLQlhbmQgTkFNRSBjYXNlcy4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0td3JhcC4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi0JRG9uJ3QgZG8gU3VuT1Mgc3R5bGUgZHluYW1pYyBsaW5raW5nIGZvciBzcGFyYy1hb3V0OgotCSogY29uZmlndXJlLnRndCAoc3BhcmM2NC0qLWFvdXQqKTogVXNlIHNwYXJjYW91dCwgbm90IHN1bjQuCi0JKHNwYXJjbGl0ZSotZnVqaXRzdS0qLCBzcGFyYyotKi1hb3V0KTogTGlrZXdpc2UuCi0JKHNwYXJjKi13cnMtdnh3b3JrcyopOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvc3BhcmNhb3V0LnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlc3BhcmNhb3V0Lm8uCi0JKGVzcGFyY2FvdXQuYyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBNYXIgIDYgMTY6MDY6NTIgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKC5zZGF0YTIsIC5zYnNzMik6IEltcGxlbWVudCBGZWIgMiBjaGFuZ2UKLSAJaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRvIHdvcmsgYXJvdW5kIGRpZmZlcmVuY2VzIGluIHNoZWxsIHZhcmlhYmxlCi0gCWV4cGFuc2lvbi4KLQotV2VkIE1hciAgNiAxODowODoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5oIChsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUpOiBEZWNsYXJlLgotCShsZGVtdWxhdGlvbl94ZmVyX3R5cGUpOiBBZGQgdW5yZWNvZ25pemVkX2ZpbGUgZmllbGQuCi0JKiBsZGVtdWwuYyAobGRlbXVsX3VucmVjb2duaXplZF9maWxlKTogTmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IElmIGEgZmlsZSBjYW4gbm90IGJlIHJlY29nbml6ZWQsIGNhbGwKLQlsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUgYmVmb3JlIHRyeWluZyBpdCBhcyBhIGxpbmtlciBzY3JpcHQuCi0JKiBhaXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlKTogTmV3IHN0YXRpYwotCWZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBVc2UgRk9QRU5fUlQsIG5vdCAiciIuCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEluaXRpYWxpemUgdW5yZWNvZ25pemVkX2ZpbGUuCi0KLU1vbiBNYXIgIDQgMTQ6MTE6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZCk6IEhhbmRsZSBmb28uYSgudGV4dCkgYnkgbWFwcGluZyBlYWNoIGluY2x1ZGVkCi0JbWVtYmVyIG9mIGZvby5hIHNlcGFyYXRlbHkuICBGcm9tIEpvdWtlIE51bWFuIDxqbnVtYW5AYmF6aXMubmw+LgotCi1GcmkgTWFyICAxIDEwOjI0OjU5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQpOgotCVNlYXJjaCB0cmluYXJ5LmNvbmQgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIHRyaW5hcnkubGhzIHR3aWNlLgotCi1UdWUgRmViIDI3IDE1OjA4OjQzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCShAVERJUlNAKTogRWRpdCBvdXQsIGNhbid0IHVzZSBnZW5zY3JpcHRzLgotCi1UdWUgRmViIDI3IDE1OjA5OjIxIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUudGd0IChtNjhrLSotbGludXhhb3V0KiwgbTY4ay0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgotCSogZW11bHBhcmFtcy9tNjhrbGludXguc2g6IE5ldyBmaWxlLgotCSogZW11bHRlbXBsL2xpbnV4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JQ2FsbCBiZmRfJHtFTVVMQVRJT05fTkFNRX1fc2l6ZV9keW5hbWljX3NlY3Rpb25zIGluc3RlYWQgb2YKLQliZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtNjhrbGludXguby4KLQkoZW02OGtsaW51eC5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLSotbGludXhhb3V0KiwgbTY4Ki0qLWxpbnV4Kik6IE5ldyBob3N0cy4KLQotVHVlIEZlYiAyNyAxMjo1NTo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IFNvcnQgaW50byBhbHBoYWJldGljYWwgb3JkZXIuCi0JRmlsbCBpbiBtaXNzaW5nIGVudHJpZXMuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUmVjb2duaXplIC0tbm8td2hvbGUtYXJjaGl2ZS4KLQkqIGxkbGFuZy5oIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKTogQWRkIHdob2xlX2FyY2hpdmUgZmllbGQuCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogU2V0IHdob2xlX2FyY2hpdmUgZmllbGQuCi0JKGxvYWRfc3ltYm9scyk6IENoZWNrIGlucHV0IGZpbGUgc3BlY2lmaWMgd2hvbGVfYXJjaGl2ZSBmaWVsZAotCXJhdGhlciB0aGFuIGdsb2JhbCB2YXJpYWJsZS4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0tbm8td2hvbGUtYXJjaGl2ZS4KLQotVHVlIEZlYiAyMCAxNjowNzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IENvcnJlY3QgZ2xkaTk2MCB0byBnbGQ5NjAuCi0KLU1vbiBGZWIgMTkgMTE6MTY6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk6IENoZWNrCi0JdGhlIFNPTkFNRSBpZiBpdCBpcyBhdmFpbGFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkKTogVXNlIHRoZSBTT05BTUUsIG5vdCB0aGUKLQlmaWxlbmFtZSwgd2hlbiBjaGVja2luZyBmb3IgY29uZmxpY3RpbmcgbGlicmFyeSB2ZXJzaW9ucy4gIERvbid0Ci0JYXNzdW1lIHRoYXQgdGhlIHN1ZmZpeCBpcyBvbmx5IG51bWJlcnMgYW5kIGRvdHMuCi0KLQkqIGxkLnRleGluZm86IE1lbnRpb24gdGhhdCAtUiBjYW4gYmUgdXNlZCBmb3IgLXJwYXRoLgotCi1TdW4gRmViIDE4IDE1OjA1OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IENoZWNrIGZvciAnZG8gbm90IG1peCcgZnJvbSBuYXRpdmUgbGlua2VyIGJlZm9yZQotCXRyeWluZyB0byB1c2UgLXJwYXRoLgotCi1UaHUgRmViIDE1IDEzOjU4OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgZXhwbGljaXQgc3Vic3RpdHV0aW9uIG9mIENGTEFHUzsgYXV0b2NvbmYKLQlkb2VzIGl0IGFueWhvdy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChMREZMQUdTKTogU2V0IHRvIEBMREZMQUdTQC4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlIGNvbmZpZ3VyZS5ob3N0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IFJlbW92ZSBnbzMyIGhvc3QsIHNpbmNlIGl0IHNob3VsZCBubyBsb25nZXIgYmUKLQluZWNlc3NhcnkuICBEb24ndCBzZXQgQ0MgZm9yIHJvbXAgaG9zdC4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBEb24ndCBza2lwIGEgcGFnZSBpbiB2aXJ0dWFsIG1lbW9yeSBzcGFjZSBpZgotCXRoZSB0ZXh0IHNlZ21lbnQgZW5kcyBleGFjdGx5IG9uIGEgcGFnZSBib3VuZGFyeS4KLQotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIFJQQVRIX0VOVlZBUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgUlBBVEhfRU5WVkFSLgotCSogTWFrZWZpbGUuaW4gKFJQQVRIX0VOVlZBUik6IE5ldyB2YXJpYWJsZS4KLQkoY2hlY2spOiBVc2UgJChSUEFUSF9FTlZWQVIpIHJhdGhlciB0aGFuIExEX0xJQlJBUllfUEFUSC4KLQotV2VkIEZlYiAxNCAxODo0OTowMSAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVkbyBlbXVsYXRpb24gaGFuZGxpbmcgc28gdGhhdCBlYWNoIGVtdWxhdGlvbgotCXNlYXJjaGVzIHRoZSBjb3JyZWN0IHRvb2wgZGlyZWN0b3J5LCBiYXNlZCBvbiB0aGUgdGFyZ2V0IGFsaWFzLgotCUZvciBleGFtcGxlLCAiY29uZmlndXJlIC0tZW5hYmxlLXRhcmdldHM9bTY4ay1jb2ZmIGkzODYtbGludXgiCi0Jd2lsbCBzZWFyY2ggL3Vzci9sb2NhbC9pMzg2LWxpbnV4L2xpYiBmb3IgbGludXggYW5kCi0JL3Vzci9sb2NhbC9tNjhrLWNvZmYvbGliIGZvciBtNjhrLWNvZmYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUudGd0OiBBZGQgc3BlY2lhbCB0ZGlyIHNldHRpbmdzIGZvciBMaW51eC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgQFRESVJTQC4gIFBhc3MgIiQodGRpcl9FTVVMKSIgdG8gJHtHRU5TQ1JJUFRTfQotCWZvciBlYWNoIGVFTVVMLmMgdGFyZ2V0LgotCSogZ2Vuc2NyaXB0cy5zaDogQWNjZXB0IHNwZWNpZmljIGFsaWFzIGFzIDl0aCBhcmd1bWVudCwgYW5kIHVzZSBpdAotCWluIExJQl9QQVRILgotCi1XZWQgRmViIDE0IDE2OjM4OjM2IDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NldF9zdGFydG9mKTogRG9uJ3QgZG8gYW55dGhpbmcgZm9yIGEKLQlyZWxvY2F0ZWFibGUgbGluay4KLQotCSogbGRncmFtLnkgKG1yaV9zY3JpcHRfZmlsZSk6IENhbGwgbXJpX2RyYXdfdHJlZS4KLQkqIG1yaS5jIChtcmlfZHJhd190cmVlKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgRG9uJ3QgYm90aGVyIHRvCi0JY3JlYXRlIG1lbW9yeSByZWdpb25zLgotCShtcmlfbG9hZCk6IERvbid0IGNhbGwgbXJpX2RyYXdfdHJlZS4KLQkqIG1yaS5oIChtcmlfZHJhd190cmVlKTogRGVjbGFyZS4KLQotCSogY29uZmlndXJlLnRndCAobTY4Ki0qLXBzb3MpOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9tNjhrcHNvcy5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9wc29zLnNjOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbTY4a3Bzb3Muby4KLQkoZW02OGtwc29zLmMpOiBOZXcgdGFyZ2V0LgotCi1XZWQgRmViIDE0IDExOjA5OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoKi0qLWllZWUqKTogTmV3IHRhcmdldDsgdXNlIHZhbmlsbGEuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKTogU3RyaXAKLQlgOmZvbycgZnJvbSAke0FSQ0h9LgotCi1UdWUgRmViIDEzIDE1OjU4OjU4IDE5OTYgIEJyeWFuIEZvcmQgIDxiYWZvcmRAc25ha2UuY3MudXRhaC5lZHU+Ci0KLQkqIHNjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYzogRG9uJ3QgcGFkIHRoZSAudGV4dCBzZWN0aW9uLiAgUHV0Ci0JLnJvZGF0YSBpbiAuZGF0YS4KLQotVHVlIEZlYiAxMyAxNDowNDoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSERMRkxBR1MgZm9yICotKi1ocHV4IHdpdGggLS1lbmFibGUtc2hhcmVkLgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkKTogV2FybiBpZgotCWl0IGxvb2tzIGxpa2Ugd2UgbWlnaHQgYmUgbGlua2luZyBpbiB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZQotCXNhbWUgc2hhcmVkIGxpYnJhcnkuICBCYXNlZCBvbiBhIHBhdGNoIGZyb20gSCBKIEx1IDxoamxAem9vbS5jb20+LgotCi1UaHUgRmViICA4IDE5OjI1OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHdoZW4gYQotCXBhZGRpbmcgc3RhdGVtZW50IGlzIGVuY291bnRlcmVkLgotCi1XZWQgRmViICA3IDE0OjAxOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBMb29rIGZvciAtLWVuYWJsZS1zaGFyZWQuICBDaGFuZ2UgdGhlIHZhbHVlIG9mCi0JQkZETElCIHdoZW4gbGlua2luZyBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgb24gU3VuT1MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogSWYgdXNpbmcgYSBzaGFyZWQgQkZEIGxpYnJhcnksIHRyeSB0byBwYXNzIGEKLQlyZWFzb25hYmxlIC1ycGF0aCBvcHRpb24gd2hlbiBsaW5raW5nLgotCSogTWFrZWZpbGUuaW4gKEJGRExJQik6IFNldCB0byBAQkZETElCQC4KLQotVHVlIEZlYiAgNiAxMjoyOToxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCAoQVJDSCk6IENoYW5nZSB0byBgc3BhcmM6djknLgotCSogZW11bHRlbXBsL2dlbmVyaWMuZW06IFN0cmlwIGA6Zm9vJyBmcm9tICR7QVJDSH0uCi0KLU1vbiBGZWIgIDUgMTY6MjU6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYmZkIGFuZCBvcGNvZGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMsIGJhc2VkIG9uCi0JcGF0Y2hlcyBmcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbiAoSExERkxBR1MpOiBOZXcgc3Vic3RpdHV0aW9uLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IFNldCBITERGTEFHUyBvbiBTdW5PUy4KLQkqIE1ha2VmaWxlLmluIChITERGTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoQkZEREVQKTogTmV3IHZhcmlhYmxlLgotCShCRkRMSUIpOiBDaGFuZ2UgdG8gLUwuLi9iZmQgLWxiZmQuCi0JKCQoTERfUFJPRykpOiBEZXBlbmQgdXBvbiAkKEJGRERFUCkgcmF0aGVybiB0aGFuICQoQkZETElCKS4gIFVzZQotCSQoSExERkxBR1MpIGluIGxpbmsuCi0JKGNoZWNrKTogU2V0IExEX0xJQlJBUllfUEFUSCBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLUZyaSBGZWIgIDIgMTk6MjY6MjUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjICguc2RhdGEyLCAuc2JzczIpOiBQdXQgLnNkYXRhMiBhbmQgLnNic3MKLQlpbiB0aGUgcmVhZC1vbmx5IHNlY3Rpb24sIG5vdCByZWFkL3dyaXRlIHVubGVzcyB3ZSBhcmUgbWFraW5nIGEKLQlzaGFyZWQgbGlicmFyeS4KLQkoLmRlYnVnKik6IEFkZCBkd2FyZiBkZWJ1ZyBzZWN0aW9ucy4KLQkoLnJlbGEue3NkYXRhKixzYnNzKn0pOiBBZGQgc2VjdGlvbnMuCi0KLUZyaSBGZWIgIDIgMTY6NTA6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgIDEgMTA6NTA6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZl9pMzg2LnNoIChURVhUX1NUQVJUX0FERFIpOiBDaGFuZ2UgdG8gMHg4MDQ4MDAwLAotCWZvciBTVlI0IGNvbXBhdGliaWxpdHkuCi0KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIEFCU09MVVRFLgotCi1XZWQgSmFuIDMxIDE3OjMwOjE5IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1XTg2LSotY3lnd2luMzIsIHBvd2VycGNsZS0qLWN5Z3dpbjMyKTogTmV3LgotCSogZW11bHRlbXBsL3BlLmVtIChkZWZpbmZvIGluaXQpOiBNYWtlIHRoZSBkZWZhdWx0IHN0YWNrIHJlc2VydmUKLQlvZiBhIFBQQyBsYXJnZXIuCi0KLVdlZCBKYW4gMzEgMTQ6MzQ6MjMgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG02OCotYXBwbGUtYXV4Kik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL202OGthdXguc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvbTY4a2F1eC5zYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW02OGthdXguby4KLQkoZW02OGthdXguYyk6IE5ldyB0YXJnZXQuCi0KLVR1ZSBKYW4gMzAgMTM6MTg6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSWdub3JlCi0JLWJub2VudHJ5LCBzaW5jZSB0aGUgcmlnaHQgdGhpbmcgdGVuZHMgdG8gaGFwcGVuIGFueWhvdy4KLQotTW9uIEphbiAyOSAxMjoyOToyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC1leHBvcnQtZHluYW1pYy4KLQotRnJpIEphbiAyNiAxMToxMTo1NSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBDaGVjayBmb3IgbmF0aXZlIGNvbXBpbGUgYnkgY29tcGFyaW5nCi0JJHt0YXJnZXR9IGFuZCAke2hvc3R9LgotCi1UaHUgSmFuIDI1IDE2OjQ2OjU4IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZW11bHBhcmFtcy97ZWxmMzJiNDMwMC5zaCwgZWxmMzJsNDMwMC5zaH06IENoYW5nZWQKLSAJVEVYVF9TVEFSVF9BRERSIHRvIGFsbG93IHVzZSBvbiBJRFQgYW5kIFBNT04gc3lzdGVtcy4KLQotV2VkIEphbiAyNCAyMDo1OTo0MCAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKToKLQljb3JyZWN0IHNwZWxsaW5nLgotCi1XZWQgSmFuIDI0IDE2OjU5OjE5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChzcGFyYzY0LSotc29sYXJpczIqKTogTmV3IGNvbmZpZ3VyYXRpb24uCi0JKHNwYXJjNjQtKi1hb3V0Kik6IFJlbmFtZWQgZnJvbSBzcGFyYzY0Ki4KLQotTW9uIEphbiAyMiAxMzowMTozNSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEdFTlNDUklQVFMpOiBQYXNzIEBob3N0QCBAdGFyZ2V0QCBAdGFyZ2V0X2FsaWFzQC4KLQkqIGdlbnNjcmlwdHMuc2g6IFNldCBob3N0LCB0YXJnZXQgYW5kIHRhcmdldF9hbGlhcyB2YXJpYWJsZXMuCi0JQ2hlY2sgZm9yIG5hdGl2ZSBjb21waWxlIGJ5IGNvbXBhcmluZyAke3RhcmdldH0gYW5kICR7aG9zdH0uCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogVGVzdCAke3RhcmdldH0sIG5vdCAke3RhcmdldF9hbGlhc30uCi0KLU1vbiBKYW4gMjIgMTE6MDM6MjMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFJlZmluZSBlYWJpIHN1cHBvcnQgdG8gYmV0dGVyIHN1cHBvcnQKLQkuc2RhdGEsIC5zZGF0YTIsIC5zYnNzLCBldGMuIHNlY3Rpb25zLgotCi1UdWUgSmFuIDE2IDE1OjE2OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKCV1bmlvbik6IEFkZCBwaGRyIGZpZWxkLgotCShwaGRyKTogVXNlIHBoZHJfcXVhbGlmaWVycyByYXRoZXIgdGhhbiBvcHRfaGRycyBhbmQgb3B0X2F0LgotCShwaGRyX3F1YWxpZmllcnMpOiBOZXcgbm9udGVybWluYWwuICBBZGQgc3VwcG9ydCBmb3IgRkxBR1MuCi0JKG9wdF9oZHJzLCBoZHIpOiBSZW1vdmUuCi0JKHBoZHJfdmFsKTogTmV3IG5vbnRlcm1pbmFsLgotCSogbGRsYW5nLmMgKGxhbmdfbmV3X3BoZHIpOiBSZXBsYWNlIGhkcnMgcGFyYW1ldGVyIHdpdGggZmlsZWhkcgotCWFuZCBwaGRycyBwYXJhbWV0ZXJzLiAgQWRkIGZsYWdzIHBhcmFtZXRlci4KLQkobGFuZ19yZWNvcmRfcGhkcnMpOiBVcGRhdGUgZm9yIGNoYW5nZXMgdG8gbGFuZ19waGRyLiAgUGFzcyBmbGFncwotCXRvIGJmZF9yZWNvcmRfcGhkci4KLQkqIGxkbGFuZy5oIChzdHJ1Y3QgbGFuZ19waGRyKTogUmVwbGFjZSBoZHJzIGZpZWxkIHdpdGggZmlsZWhkciBhbmQKLQlwaGRycyBmaWVsZHMuICBBZGQgZmxhZ3MgZmllbGQuCi0JKExBTkdfUEhEUl9GSUxFSERSLCBMQU5HX1BIRFJfUEhEUlMpOiBSZW1vdmUuCi0JKGxhbmdfbmV3X3BoZHIpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBGTEFHUy4KLQotTW9uIEphbiAxNSAxNTowNzoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCURvbid0IG1ha2UgYSBzaGFyZWQgbGlicmFyeSBiZWNhdXNlIG9mIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KLQlfX0dMT0JBTF9PRkZTRVRfVEFCTEVfLgotCi0JQWRkIHNvbWUgSXJpeCA1IHN1cHBvcnQsIG1vc3RseSBmcm9tIEthenVtb3RvIEtvamltYQotICAgICAgICA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+OgotCSogZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggKFNDUklQVF9OQU1FKTogQ2hhbmdlIHRvIGVsZm1pcHMuCi0JKFNITElCX1RFWFRfU1RBUlRfQUREUik6IERlZmluZS4KLQkoT1RIRVJfR09UX1NZTUJPTFMpOiBEZWZpbmUuCi0JKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IFJlbW92ZSBpbml0aWFsaXphdGlvbiBvZiBfZ3AuCi0JKEVYRUNVVEFCTEVfU1lNQk9MUyk6IERvbid0IGRlZmluZS4KLQkoRFlOQU1JQ19MSU5LKTogRG9uJ3QgZGVmaW5lLgotCSogZW11bHBhcmFtcy9lbGYzMmxtaXAuc2g6IFNhbWUgY2hhbmdlcyBhcyBlbGYzMmJtaXAuc2guCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzKi1kZWMtYnNkKik6IENoYW5nZSBtaXBzIHRvIG1pcHMqLgotCShtaXBzKi1zZ2ktaXJpeDQqKTogTGlrZXdpc2UuCi0JKG1pcHMqLXNnaS1pcml4NSopOiBOZXcgZW50cnkuCi0JKiBNYWtlZmlsZS5pbiAoZWVsZjMyYm1pcC5jKTogRGVwZW5kIHVwb24gZWxmbWlwcy5zYyByYXRoZXIgdGhhbgotCWVsZi5zYy4KLQkoZWVsZjMybG1pcC5jKTogTGlrZXdpc2UuCi0KLVNhdCBKYW4gMTMgMDk6NDE6NDMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFJlbW92ZSBzdXBwb3J0IGZvciAucmVsLiogc2VjdGlvbnMuICBBZGQKLQkucmVsYS5nb3QubmVnIHNlY3Rpb24uCi0KLUZyaSBKYW4gMTIgMTQ6NTY6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9zaC5zYzogT25seSBidWlsZCBjb25zdHJ1Y3RvcnMgd2hlbiBDT05TVFJVQ1RJTkcuCi0KLQkqIGxkbWlzYy5jOiBJbmNsdWRlIDxzdGRhcmcuaD4gcmF0aGVyIHRoYW4gPHZhcmFyZ3MuaD4gaWYKLQlBTlNJX1BST1RPVFlQRVMgaXMgZGVmaW5lZC4gIFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9mCi0JV0lORE9XU19OVC4gIFZhcmlvdXMgaW5kZW5kYXRpb24gZml4ZXMuCi0JKHZmaW5mbyk6IENoYW5nZSBmbXQgcGFyYW1ldGVyIHRvIGNvbnN0IGNoYXIgKi4KLQkoaW5mb19tc2cpOiBXcml0ZSA8c3RkYXJnLmg+IHZlcnNpb24uCi0JKGVpbmZvLCBtaW5mbywgZmluZm8pOiBMaWtld2lzZS4KLQkoaW5mb19hc3NlcnQpOiBDaGFuZ2UgZmlsZSBwYXJhbWV0ZXIgdG8gY29uc3QgY2hhciAqLgotCSogbGRtaXNjLmggKGVpbmZvLCBtaW5mbywgaW5mb19tc2cpOiBJZiBBTlNJX1BST1RPVFlQRVMgaXMKLQlkZWZpbmVkLCB1c2UgYSByZWFsIHByb3RvdHlwZS4KLQkoaW5mb19hc3NlcnQpOiBDaGFuZ2UgZmlyc3QgcGFyYW1ldGVyIHRvIGJlIGNvbnN0IGNoYXIgKi4KLQotRnJpIEphbiAxMiAxMzoyOTo1NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQWRkIHN1cHBvcnQgZm9yIC5zZGF0YTIvLnNic3MyLCBldGMuICBBZGQKLQlpbiBvbGQgc3VwcG9ydCB0aGF0IDIuNy4yIG5lZWRzLCBidXQgdGhlIGN1cnJlbnQgY29tcGlsZXIgZG9lcwotCW5vdC4KLQotCSogTWFrZWZpbGUuaW4gKGVlbGYzMnssbH1wcGMuYyk6IEZpeCB1cCBkZXBlbmRlbmNpZXMgdG8gdXNlIHRoZQotCWNvcnJlY3QgTGlua2VyIHNjcmlwdCB0ZW1wbGF0ZS4KLQotCSogZW11bHBhcmFtcy9lbGYzMnssbH1wcGMuc2ggKFRFWFRfU1RBUlRfQUREUik6IFNldCB0byAweDQwMDAwLAotCW5vdCAweDQwMDAwMC4KLQkoREFUQV9BRERSLE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IERlbGV0ZS4KLQotVHVlIEphbiAgOSAxNTo1MzowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBQdXQgLnJjb25zdCByaWdodCBhZnRlciAucmRhdGEuCi0KLUZyaSBKYW4gIDUgMTQ6MDc6NDUgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCXNvcnQgdXNpbmcgcmlnaHQgcG9pbnRlci4KLQotRnJpIEphbiAgNSAxMjoyNTo0NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogUmVtb3ZlIHN1cHBvcnQgZm9yIGNyZWF0aW5nIHNwZWNpYWwKLQlsYWJlbHMgZm9yIGVhYmkgc2VjdGlvbiBiZWdpbi9lbmQgaGVyZS4gIFRoZSBjb21waWxlciBub3cgdXNlcwotCWNydHtpLG59Lm8gdG8gY3JlYXRlIHRoZXNlIHN5bWJvbHMuCi0KLVRodSBKYW4gIDQgMTc6MDg6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogQ2hhbmdlIGV4aXN0aW5nIExpbnV4IEhPU1RJTkdfQ1JUMCB0byBiZSB1c2VkCi0JZm9yIGEub3V0IG9ubHksIGFuZCBwdXQgaW4gYXBwcm9wcmlhdGUgSE9TVElOR19DUlQwIGFuZAotCUhPU1RJTkdfTElCUyB2YWx1ZXMgZm9yIExpbnV4IEVMRi4KLQotVGh1IEphbiAgNCAxMjowMjowNSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogVXNlIGFsbCA2NEsgZm9yIHJhbS4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogRGVmaW5lIDI1NksgcmFtIHNpemUuCi0KLVRodSBEZWMgMjEgMTU6NTc6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFBhc3MKLQlleHBvcnRfZGVmaW5lcyBhcyB0cnVlIHRvIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgaWYgLXVuaXgKLQl3YXMgdXNlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIC1iRSB3YXMgdXNlZC4KLQotVHVlIERlYyAxOSAxNzozNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBPbmx5IHNldAotCXJlbG9jYXRlYWJsZSBiZWZvcmUgY2FsbGluZyBsZGN0b3JfYnVpbGRfc2V0cyBpZiB0aGUgb3V0cHV0IGZpbGUKLQlpcyBpbiBhbiBYQ09GRiBmb3JtYXQuCi0KLUZyaSBEZWMgMTUgMTY6MzQ6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBXaGVuIGhhbmRsaW5nIGEgZGF0YSBzdGF0ZW1lbnQsIGlmCi0JdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIG91dHB1dCBmaWxlIGlzIHVua25vd24sIHVzZSB0aGUgZW5kaWFubmVzcwotCW9mIHRoZSBpbnB1dCBmaWxlLgotCi1UdWUgRGVjIDEyIDEzOjU1OjQxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogUmVjb2duaXplIG1pcHMtKi0qIGFzIGVxdWl2YWxlbnQgdG8KLQltaXBzLWlkdC1lY29mZi4KLQkqIG1wdy1lcHBjbWFjb3MuYzogUmVuYW1lIHRvIHNob3J0ZXIgbXB3LWVwcGNtYWMuYy4KLQkqIG1wdy1sZC5yOiBBZGQgdmVyc2lvbiByZXNvdXJjZXMuCi0JKGNmcmcpOiBVc2Ugc3ltYm9saWMgaW5zdGVhZCBvZiBsaXRlcmFsIG5hbWUgZm9yIGV4ZWN1dGFibGUuCi0KLU1vbiBEZWMgMTEgMTU6MTM6NDEgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BwY3BlLnNjIChGSU5JKTogTW92ZWQgdGhlIC5yZWxvYyBzZWN0aW9uLgotCi1XZWQgRGVjICA2IDE0OjMzOjUwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChwcmludF9zdGF0ZW1lbnR7LHN9KTogRGVsZXRlIGR1cGxpY2F0ZSBwcm90b3R5cGUuCi0JKHByaW50X3N0YXRlbWVudF9saXN0KTogUmVuYW1lZCBmcm9tIHByaW50X3N0YXRlbWVudC4gIEFsbCBjYWxsZXJzCi0JdXBkYXRlZC4KLQkocHJpbnRfc3RhdGVtZW50KTogTmV3IGZ1bmN0aW9uIHRvIHByaW50IGp1c3Qgb25lIHN0YXRlbWVudC4KLQkocHJpbnRfe2RhdGEscmVsb2MscGFkZGluZ31fc3RhdGVtZW50KTogRG9uJ3QgY3Jhc2ggaWYKLQlvdXRwdXRfc2VjdGlvbiA9PSBOVUxMLgotCShkcHJpbnRfc3RhdGVtZW50KTogTmV3IGZ1bmN0aW9uLgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEZpeAotCWNhbGwgdG8gc29ydF9zZWN0aW9ucy4KLQotV2VkIERlYyAgNiAxNDo1OTowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKHVuaXhfbGQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSGFuZGxlIC11bml4LgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IElmIHVuaXhfbGQsIHBhc3MKLQlnYyBhcyBmYWxzZSBhbmQgZXhwb3J0X2RlZmluZWRzIGFzIHRydWUgdG8gc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogUGVybWl0IGFzc2lnbm1lbnRzIHRvIGRvdCBpbiB0aGUgZmluYWwKLQlwaGFzZSBpZiB0aGUgY3VycmVudCBzZWN0aW9uIGlzIGFic19vdXRwdXRfc2VjdGlvbi4KLQotCi1UdWUgRGVjICA1IDA5OjQ5OjM5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogRml4IGNhbGwKLQl0byBzb3J0X3NlY3Rpb25zLgotCi1GcmkgRGVjICAxIDE2OjQ4OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKFBIRFJTKTogTmV3IHRva2VuLgotCShpZmlsZV9wMSk6IEFjY2VwdCBwaGRycy4KLQkoc2VjdGlvbik6IEFjY2VwdCBwaGRyX29wdCBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIGRlZmluaXRpb24uCi0JKHBoZHJfb3ApOiBOZXcgbm9udGVybWluYWwuCi0JKHBoZHJzLCBwaGRyX2xpc3QsIHBoZHIsIHBoZHJfdHlwZSwgb3B0X2hkcnMsIGhkcik6IExpa2V3aXNlLgotCSogbGRsZXgubDogQWNjZXB0IFBIRFJTLgotCSogbGRsYW5nLmggKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCk6IERlZmluZS4KLQkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSk6IEFkZCBwaGRycyBmaWVsZC4KLQkoc3RydWN0IGxhbmdfcGhkcik6IERlZmluZS4KLQkoTEFOR19QSERSX0ZJTEVIRFIsIExBTkdfUEhEUl9QSERSUyk6IERlZmluZS4KLQkobGFuZ19uZXdfcGhkcik6IERlY2xhcmUuCi0JKiBsZGxhbmcuYyAobGFuZ19waGRyX2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXApOiBJbml0aWFsaXplIHBoZHJzIGZpZWxkLgotCShsYW5nX3Byb2Nlc3MpOiBDYWxsIGxhbmdfcmVjb3JkX3BoZHJzLgotCShsYW5nX25ld19waGRyKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3NlY3Rpb25faW5fcGhkcik6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19yZWNvcmRfcGhkcnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgUEhEUlMuCi0KLVRodSBOb3YgMzAgMTM6MTQ6MzAgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BwY3BlLnNjOiBNb3ZlZCAuZWRhdGEgaW50byBpdHMgb3duIHNlY3Rpb24gdG8KLQlleHBvc2UgaXQuCi0KLVRodSBOb3YgMzAgMTE6MzI6MzQgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLW1vdG9yb2xhLXN5c3YpOiBEZWZpbmUgSE9TVElOR19DUlQwIGFuZAotCUhPU1RJTkdfTElCUyBmb3IgdGVzdGluZy4KLQkobTg4Ki1tb3Rvcm9sYS1zeXN2Myk6IERlZmluZSBIT1NUSU5HX0NSVDAgYW5kIEhPU1RJTkdfTElCUyBmb3IKLQl0ZXN0aW5nLgotCi1UdWUgTm92IDI4IDEyOjE0OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBTZXQgY29uZmlnLmR5bmFtaWNfbGluayB0byBmYWxzZSBmb3IgLU4KLQlhbmQgLW4uCi0KLU1vbiBOb3YgMjcgMTM6MTI6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjcuCi0KLUZyaSBOb3YgMjQgMTg6MzU6MzUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFR3byAuanVuaydzIGlzIHRvbyBtdWNoIGp1bmsuCi0KLVR1ZSBOb3YgMjEgMTY6MTQ6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBCRkRfTkVFRF9ERUNMQVJBVElPTi4KLQkqIGFjY29uZmlnLmg6IFB1dCBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgaW4gQFRPUEAgc2VjdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgotCi0JKiBsZG1haW4uYyAoY29uc3RydWN0b3JfY2FsbGJhY2spOiBEb24ndCB3YXJuIGFib3V0IEJGRF9SRUxPQ19DVE9SCi0JYmVpbmcgdW5zdXBwb3J0ZWQgaWYgdGhpcyBpcyBub3QgYSByZWxvY2F0ZWFibGUgbGluayBhbmQgdGhlIGlucHV0Ci0JQkZEIHN1cHBvcnRzIGl0LCBzaW5jZSBsZGN0b3JfYnVpbGRfc2V0cyBjYW4gY29wZSB3aXRoIHRoYXQgY2FzZS4KLQotRnJpIE5vdiAxNyAxNjoyMzoxNSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGMtKi1tYWNvcyopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9wcGNtYWNvcy5zaDogTmV3IGZpbGUsIFBvd2VyTWFjIGVtdWxhdGlvbi4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlcHBjbWFjb3Muby4KLQkoZXBwY21hY29zLmMpOiBOZXcgdGFyZ2V0LgotCSogbXB3LWVwcGNtYWNvcy5jOiBVcGRhdGUuCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IGF0dGVtcHRzIHRvIHVzZSB7R0VOU0NSSVBUU30uCi0KLUZyaSBOb3YgMTcgMTA6Mzc6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFVzZSBAaG9zdEAgYW5kIEB0YXJnZXRALCBub3QKLQkkKGhvc3RfY2Fub25pY2FsKSBhbmQgJCh0YXJnZXRfY2Fub25pY2FsKS4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQotVGh1IE5vdiAxNiAxMToyMzo0MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLmVuZGp1bmspOiBNb3ZlIGRlZmluaXRpb24gb2YgYGVuZCcgdG8gaGVyZQotCXNvIHRoZSBtYWxsb2MgaGVhcCBiZWdpbnMgYXQgYSBzYW5lIHBsYWNlLgotCi1UaHUgTm92IDE2IDAzOjA5OjMyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVmVyc2lvbiAyLjYgcmVsZWFzZWQuCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBVcGRhdGUgdG8gMi42LgotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBEZWxldGUgbGRlbXVsLWxpc3QuaCBoZXJlLCBidXQgbm90Ci0JJChHRU5FUkFURURfKkZJTEVTKSwgc2luY2UgdGhleSBuZWVkIHRvIGJlIHJldGFpbmVkIGJ5IGRpc3RjbGVhbi4KLQkobWFpbnRhaW5lci1jbGVhbiwgcmVhbGNsZWFuKTogRGVsZXRlIHRoZW0gaGVyZS4KLQotVHVlIE5vdiAxNCAxNzowODowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBPcGVuIHRoZQotCWJhc2UgZmlsZSB3aXRoIEZPUEVOX1dCLCBub3QgInciLgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBVc2UgdGhlCi0JZW52aXJvbm1lbnQgdmFyaWFibGUgTERfUlVOX1BBVEggaWYgbmVpdGhlciAtcnBhdGggbm9yIC1ycGF0aC1saW5rCi0Jd2VyZSB1c2VkLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFVzZSB0aGUgZW52aXJvbm1lbnQKLQl2YXJpYWJsZSBMRF9SVU5fUEFUSCBpZiAtcnBhdGggd2FzIG5vdCB1c2VkLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgTERfUlVOX1BBVEguCi0KLVRodSBOb3YgIDkgMTM6MDk6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogUmVjb2duaXplCi0JLWJsIGFuZCAtYmxvYWRtYXAgb3B0aW9ucy4KLQotCSogbGRmaWxlLmMgKGxkZmlsZV90cnlfb3Blbl9iZmQpOiBJZiBiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQsCi0JcmVwb3J0IGEgYmV0dGVyIGVycm9yLgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEFkZAotCW5ldyBsb2NhbCB2YXJpYWJsZSBzcGVjaWFsX3NlY3Rpb25zLCBhbmQgcGFzcyBpdCB0bwotCXNpemVfZHluYW1pY19zZWN0aW9ucy4gIExvb2sgdGhyb3VnaCB0aGUgcmVzdWx0cywgYW5kIG1vdmUgdGhlCi0Jc2VjdGlvbnMgYXJvdW5kIGluIHRoZSBtYXBwaW5nIHNvIHRoYXQgdGhleSBhcmUgZGVmaW5lZCBjb3JyZWN0bHkuCi0KLVdlZCBOb3YgIDggMTE6NDA6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX2RlZmF1bHRfdGFyZ2V0KTogQ2FzdCBnZXRlbnYgcmV0dXJuIHZhbHVlLgotCi1UdWUgTm92ICA3IDExOjE1OjM2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3BwY3BlLnNoIChBUkNIKTogTmV3IGZpbGUgZm9yIFBvd2VyUEMgUG9ydGFibGUKLQlFeGVjdXRhYmxlIHN1cHBvcnQuCi0JKiBzY3JpcHR0ZW1wbC9wcGNwZS5zYzogTmV3IGZpbGUgZm9yIFBvd2VyUEMgUG9ydGFibGUgRXhlY3V0YWJsZQotCXN1cHBvcnQuCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBBZGRlZCBwb3dlcnBjbGUtcGUgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZXBwY3BlLm8gdGFyZ2V0LgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKFRBUkdFVF9JU19wcGNwZSk6IGZpbGUgdGFpbG9yaW5nIG1hY3JvCi0JKGdsZF8kX2JlZm9yZV9hbGxvY2F0aW9uKTogYWRkZWQgaG9va3MgZm9yIHRvYyBjb25zdHJ1Y3Rpb24gYmFzZWQKLQlvbiB0aGUgYWJvdmUgbWFjcm8uCi0KLVR1ZSBOb3YgIDcgMTE6NDc6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBUaGUgbGlua2VyIGRvZXMgbm90IHVzZSBfbWFpbiBhcyBhbiBlbnRyeSBwb2ludC4KLQotVHVlIE5vdiAgNyAxMTo0NjoxMSAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyAoLmRhdGEpOiBDYWxjdWxhdGUgbmV4dCBib3VuZGFyeSBtb2R1bG8KLQkweDIwMDAgbm90IDB4MjAwLgotCi1Nb24gTm92ICA2IDEwOjU5OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgdGVzdCBmb3Igd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQuCi0JKiBzeXNkZXAuaDogRGVjbGFyZSBmcmVlIGlmIG5lY2Vzc2FyeS4gIEluY2x1ZGUgImFuc2lkZWNsLmgiLgotCSogYWNjb25maWcuaDogRXhwbGFpbiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBUYWtlIEI6OiBvdXQgb2Ygc2hvcnRvcHRzLgotCi1TdW4gTm92ICA1IDAzOjA4OjI4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2kzODZuYnNkLnNoIChFWEVDVVRBQkxFX1NZTUJPTFMpOiBTZXQgX19EWU5BTUlDIHRvIDAKLQlmb3Igbm93LCBhcyB3aXRoIG02OGs0a2JzZCwgdW50aWwgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBnZXRzCi0JZG9uZS4KLQotCSogY29uZmlndXJlLmhvc3Q6IEZvciBpMzg2IEJTRCB2YXJpYW50cywgY3J0MC5vIGxpdmVzIGluCi0JL3Vzci9saWIuICAoVHJ1ZSBmb3IgTmV0QlNEIGF0IGxlYXN0LCB1bmNvbmZpcm1lZCBmb3Igb3RoZXJzLikKLQotV2VkIE5vdiAgMSAxNTo0Mjo0NSAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVkZWx0YTY4Lm8uCi0JKGVkZWx0YTY4LmMpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLnRndCAobTY4Ki1tb3Rvcm9sYS1zeXN2Kik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL2RlbHRhNjguc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvZGVsdGE2OC5zYzogTmV3IGZpbGUuCi0KLQkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2M6IEhhbmRsZSAuaW5pdCBhbmQgLmZpbmkuICBDaGFuZ2Ugc2VjdGlvbgotCWFkZHJlc3Nlcy4KLQotV2VkIE5vdiAgMSAxMTo0MTo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChtcmlfc2NyaXB0X2NvbW1hbmQpOiBBY2NlcHQgJywnIGFzIHdlbGwgYXMgJz0nIGluCi0JQUxJR04gYW5kIEFMSUdOTU9EIHN0YXRlbWVudHMuCi0KLQkqIGVtdWx0ZW1wbC9haXguZW06IEluY2x1ZGUgbGRncmFtLmguCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBIYW5kbGUgLXBEIGFuZCAtcFQsIGFzIHVzZWQgb24KLQlBSVggNC4xLgotCSogTWFrZWZpbGUuaW4gKCQoRU1VTEFUSU9OX09GSUxFUykpOiBEZXBlbmQgdXBvbiBsZGdyYW0uaC4KLQotVHVlIE9jdCAzMSAxODoyMjoyNCAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAoYWxwaGEtKi1saW51eCopOiBOZXcgaG9zdC4KLQkqIGNvbmZpZ3VyZS50Z3QgKGFscGhhLSotbGludXgqKTogTmV3IHRhcmdldC4KLQotVHVlIE9jdCAzMSAxMjozNjo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGV4cG9ydF9maWxlcyk6IFJlbW92ZS4KLQkoaW1wb3J0X2ZpbGVzKTogTWFrZSBzdGF0aWMuCi0JKHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QpOiBEZWZpbmUuCi0JKGV4cG9ydF9zeW1ib2xzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEhhbmRsZSBhbiBpbml0aWFsIC1iIG9wdGlvbgotCWNvcnJlY3RseS4gIENhbGwgcmVhZF9maWxlIGZvciBhbiBleHBvcnQgZmlsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBDYWxsCi0JYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgZm9yIGVhY2ggZXhwb3J0IHN5bWJvbCwgcmF0aGVyIHRoYW4KLQljYWxsaW5nIHJlYWRfZmlsZSBmb3IgZWFjaCBleHBvcnQgZmlsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlKTogRm9yIGFuIGV4cG9ydCBmaWxlLCBtYWtlIHRoZQotCWV4cG9ydGVkIHN5bWJvbHMgdW5kZWZpbmVkLCBhbmQgc3RvcmUgdGhlbSBvbiB0aGUgZXhwb3J0X3N5bWJvbHMKLQlsaXN0LgotCi1TYXQgT2N0IDI4IDAwOjEwOjAzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOgotCURvbid0IGhhbmcgaWYgbGFzdCBvcHRpb24gaXMgdW5yZWNvZ25pc2VkLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMpOiBJbnNlcnQgY3JlYXRlZAotCXN5bWJvbHMgaW50byBBQlMgb3V0cHV0IHNlY3Rpb24uCi0KLUZyaSBPY3QgMjcgMTg6MDM6MTcgMTk5NSAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBOZXRCU0QKLQltNjhrNGsgYXJjaC4KLQkoZW02OGs0a25ic2QuYyk6IE5ldyBydWxlLgotCi0JKiBjb25maWd1cmUudGd0OiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgTmV0QlNEIG02OGs0ayBhcmNoLgotCi0JKiBnZW5zY3JpcHRzLnNoLCBsZGludC50ZXhpbmZvLAotCWVtdWxwYXJhbXMve2EyOWssYXJtYW91dGIsYXJtYW91dGwsY29mZl9zcGFyYyxlYm1vbjI5ayxnbGQ5NjAsCi0JZ2xkOTYwY29mZixnbzMyLGg4MzAwLGg4MzAwaCxoODUwMCxoODUwMGIsaDg1MDBjLGg4NTAwbSxoODUwMHMsCi0JaHAzMDBic2QsaHAzaHB1eCxocHBhZWxmLnNoLGkzODZhb3V0LGkzODZic2QsaTM4NmNvZmYsaTM4NmdvMzIsCi0JaTM4NmxpbnV4LGkzODZseW54LGkzODZuYnNkLGxuazk2MCxtNjhrYW91dCxtNjhrY29mZixtNjhrbHlueCwKLQltODhrYmNzLG1pcHNiaWcsbWlwc2JzZCxtaXBzaWR0LG1pcHNpZHRsLG1pcHNsaXQsbmV3cyxuczMya25ic2QsCi0JcGM1MzJtYWNoYW91dCxyaXNjaXgsc2EyOTIwMCxzaCxzaGwsc3BhcmNseW54LHNwYXJjbmJzZCwKLQlzdDIwMDAsc3VuMyxzdW40LHZhbmlsbGEsdmF4LHZzdGEsdzY1LHo4MDAxLHo4MDAyfS5zaDogQ2hhbmdlZAotCVBBR0VfU0laRSB0byBUQVJHRVRfUEFHRV9TSVpFLgotCi0JKiBlbXVscGFyYW1zL202OGtuYnNkLmg6IERpdHRvLgotCShURVhUX1NUQVJUX0FERFIsIE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IFdlIGhhdmUgOEsgcGFnZXNpemUuCi0JKEVYRUNVVEFCTEVfU1lNQk9MUyk6IEhhcmRjb2RlIF9fRFlOQU1JQyB0byB6ZXJvIGZvciB0aGUgdGltZQotCWJlaW5nLgotCi0JKiBlbXVscGFyYW1zL202OGs0a25ic2Quc2g6IE5ldyBmaWxlLgotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBFeHBhbmQgRVhFQ1VUQUJMRV9TWU1CT0xTIGlmIHJlbG9jYXRpbmcuCi0KLUZyaSBPY3QgMjcgMTc6NTk6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtOiBJbmNsdWRlIGxkY3Rvci5oLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBDYWxsIGZpbmRfcmVsb2NzLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBVc2UgbmV3IGFmdGVyX29wZW4gZnVuY3Rpb24uCi0JKiBzY3JpcHR0ZW1wbC9haXguc2M6IFVzZSBDT05TVFJVQ1RPUlMgaW4gLmRhdGEuCi0JKiBsZGN0b3IuYyAoc3RydWN0IHNldF9pbmZvKTogTW92ZSBkZWZpbml0aW9uIGludG8gbGRjdG9yLmguCi0JKHN0cnVjdCBzZXRfZWxlbWVudCk6IExpa2V3aXNlLgotCShzZXRzKTogTWFrZSBub24tc3RhdGljLgotCShsZGN0b3JfYWRkX3NldF9lbnRyeSk6IEFkZCBuYW1lIHBhcmFtZXRlci4gIFNhdmUgaXQgaW4gdGhlIG5ldwotCXNldCBlbGVtZW50LgotCShsZGN0b3JfYnVpbGRfc2V0cyk6IEF2b2lkIGJlaW5nIGNhbGxlZCB0d2ljZS4gIFBhc3Mgc2V0IGVsZW1lbnQKLQluYW1lIHRvIGxhbmdfYWRkX3JlbG9jLgotCSogbGRjdG9yLmggKHN0cnVjdCBzZXRfaW5mbyk6IE1vdmUgZGVmaW5pdGlvbiBoZXJlIGZyb20gbGRjdG9yLmMuCi0JKHN0cnVjdCBzZXRfZWxlbWVudCk6IExpa2V3aXNlLiAgQWRkIG5ldyBmaWVsZCBuYW1lLgotCShzZXRzKTogRGVjbGFyZS4KLQkobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBEZWNsYXJlIG5ldyBuYW1lIHBhcmFtZXRlci4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IERvbid0IGluc2lzdCB0aGF0IGVpdGhlciBuYW1lIG9yCi0Jc2VjdGlvbiBiZSBOVUxMIGluIGEgbGFuZ19yZWxvY19zdGF0ZW1lbnQuCi0JKiBsZG1haW4uYyAoYWRkX3RvX3NldCk6IFBhc3MgTlVMTCB0byBsZGN0b3JfYWRkX25ld19zZXRfZW50cnkgZm9yCi0JbmV3IG5hbWUgcGFyYW1ldGVyLgotCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IFBhc3MgbmFtZSB0byBsZGN0b3JfYWRkX25ld19zZXRfZW50cnkgZm9yCi0JbmV3IG5hbWUgcGFyYW1ldGVyLgotCi0JKiBsZG1pc2MuYyAoZGVtYW5nbGUpOiBGaXggaW5kZW50YXRpb24uICBSZW1vdmUgYSBsZWFkaW5nIHBlcmlvZC4KLQotVGh1IE9jdCAyNiAyMjoyMjo0OSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBQb3dlck1hYyB0YXJnZXQgc3VwcG9ydCwgZ2VuZXJhdGUgY29uZmlnLmguCi0JKiBtYWMtbGQucjogTmV3IGZpbGUsIE1hYyByZXNvdXJjZXMuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBlZGl0cyBNYWtlZmlsZS5pbiBpbnRvIE1QVyBzeW50YXguCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogbXB3LWVwcGNtYWNvcy5jOiBQcmVidWlsdCB2ZXJzaW9uIG9mIFBvd2VyTWFjIGxpbmtpbmcgc2NyaXB0LgotCi1UaHUgT2N0IDI2IDE0OjExOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IFRyZWF0Ci0JLXN0YXRpYyBhcyBhIHN5bm9ueW0gZm9yIC1ibnNvLgotCi0JKiBzY3JpcHR0ZW1wbC9haXguc2M6IE1vdmUgc3BlY2lhbCBzeW1ib2xzIGluc2lkZSBzZWN0aW9ucy4KLQlBbHdheXMgc3RhcnQgLmRhdGEgYXQgMC4KLQotV2VkIE9jdCAyNSAxMTo1MjoxMiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RzdHVmZik6ICBBbHNvIG1ha2UgaW5mby4KLQkobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiAgQWxzbyBkZWxldGUgKi5pbmZvKi4KLQotV2VkIE9jdCAyNSAxMToyNzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW06IEFkZCBzdXBwb3J0IGZvciB2YXJpb3VzIEFJWCBsaW5rZXIgb3B0aW9ucywKLQlmb3IgQUlYIGltcG9ydCBhbmQgZXhwb3J0IGZpbGVzLCBhbmQgZm9yIEFJWCBzaGFyZWQgb2JqZWN0cy4KLQkqIHNjcmlwdHRlbXBsL2FpeC5zYzogQWRkIC5wYWQuICBQdXQgLmRzIGp1c3QgYmVmb3JlIHRoZSBUT0MuCi0KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQgbGlua19pbmZvLnN0YXRpY19saW5rLgotCi0JKiBsZG1haW4uYyAoYWRkX2tlZXBzeW1zX2ZpbGUpOiBBZGQgXG4gYXQgZW5kIG9mIGVpbmZvIGNhbGxzLgotCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IExpa2V3aXNlLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IExpa2V3aXNlLgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGxkLnRleGluZm86IFRoZSBNUkkgQUxJR04gZGlyZWN0aXZlIGlzIHN1cHBvcnRlZC4KLQotTW9uIE9jdCAyMyAxMTo0Njo0MyAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogZW11bHBhcmFtcy9lbGYzMnZyNDMwMC5zaDogRGVsZXRlZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJ2cjQzMDBlbC5zaDogRGVsZXRlZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaDogQWRkZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMybDQzMDAuc2g6IEFkZGVkLgotCSogY29uZmlndXJlLnRndCwgTWFrZWZpbGUuaW46IFVwZGF0ZWQgdGhlIGJ1aWxkIHRvIHVzZSB0aGUKLSAJbmV3IDguMyB1bmlxdWUgbmFtZXMuCi0KLVRodSBPY3QgMTkgMTc6NDE6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoZW50cnlfc3ltYm9sKTogTWFrZSBub24tc3RhdGljLgotCSogbGRsYW5nLmggKGVudHJ5X3N5bWJvbCk6IERlY2xhcmUuCi0KLQkqIGxkbGV4Lmw6IFRyZWF0IFBST1ZJREUgYXMgYSBrZXl3b3JkIGluIGV4cHJlc3Npb24gc3RhdGUuCi0KLVdlZCBPY3QgMTggMTc6MzQ6MDYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2MgKC5ic3MpOiBNb3ZlIHRvIGJlIGFmdGVyIC50ZXh0Ci0KLVR1ZSBPY3QgMTcgMTI6MjI6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQpOgotCVNlYXJjaCB0cmluYXJ5LmNvbmQgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIHRyaW5hcnkubGhzIHR3aWNlLiAgRnJvbQotCWxpbmxpQGlocC5QSHlzLmV0aHouQ0guCi0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IE1vdmUKLQlkaXJlY3Rvcnkgc2VhcmNoaW5nIGNvZGUgaW50byBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgZXh0cmFjdGVkCi0JZnJvbSBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvLgotCShnbG9iYWxfbmVlZGVkLCBnbG9iYWxfZm91bmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXNlIG5ldyBhZnRlcl9vcGVuIGZ1bmN0aW9uLgotCSogbGQudGV4aW5mbywgbGQuMTogTWVudGlvbiAtcnBhdGgtbGluayBvbiBTdW5PUy4KLQotCSogTWFrZWZpbGUuaW4gKGVlbGYzMnBwYy5jKTogRGVwZW5kIHVwb24gZWxmMzIuZW0sIG5vdCBnZW5lcmljLmVtLgotCShlZWxmMzJscHBjLmMpOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJscHBjLnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgotCShHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUgYXMgeWVzLgotCi1Nb24gT2N0IDE2IDE5OjExOjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBTdHJ1Y3QgYmZkX2VsZl9saW5rX25lZWRlZF9saXN0IGlzIG5vdyBuYW1lZAotCWJmZF9saW5rX25lZWRlZC1saXN0OyBtYWtlIGFwcHJvcHJpYXRlIGNoYW5nZXMuCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGMtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIGFpeHBwYy4KLQkocnM2MDAwLSotYWl4Kik6IE5ldyB0YXJnZXQ7IHVzZSBhaXhyczYuCi0JKiBlbXVscGFyYW1zL2FpeHBwYy5zaCwgZW11bHBhcmFtcy9haXhyczYuc2g6IE5ldyBmaWxlcy4KLQkqIGVtdWx0ZW1wbC9haXguZW06IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlYWl4cHBjLm8gYW5kIGVhaXhyczYuby4KLQkoZWFpeHBwYy5jLCBlYWl4cnM2LmMpOiBOZXcgdGFyZ2V0cy4KLQotRnJpIE9jdCAxMyAxNDowMDozNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wL3BlLnNjICgucmVsb2MpOiBNb3ZlIHRvIHRoZSBlbmQuCi0KLVR1ZSBPY3QgMTAgMTc6NTM6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBEb24ndCB0cnkgdG8gdXNlIGFuIGVudHJ5X3N5bWJvbCBmcm9tIGEKLQlzZWN0aW9uIHdoaWNoIHdhcyBub3QgbGlua2VkIGludG8gdGhlIGZpbmFsIG91dHB1dC4KLQotVHVlIE9jdCAxMCAxMDoxNzoyMiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogRml4Ci0JZmF0YWwgdHlwb3MuCi0KLVR1ZSBPY3QgMTAgMDE6MDE6NTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgcnBhdGhfbGluayBmaWVsZC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IFNlYXJjaCBmb3IKLQlyZXF1aXJlZCBkZXBlbmRlbmNpZXMgaW4gcnBhdGhfbGluayBwYXRoLiAgT25seSBzZWFyY2gKLQlMRF9MSUJSQVJZX1BBVEggd2hlbiBjb25maWd1cmVkIG5hdGl2ZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUmVjb2duaXplIC1ycGF0aC1saW5rLgotCSogbGQuMSwgbGQudGV4aW5mbzogRG9jdW1lbnQgLXJwYXRoLWxpbmsuCi0KLVNhdCBPY3QgIDcgMTc6MDc6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBEb24ndAotCWJvdGhlciBzZWFyY2hpbmcgZm9yIG5lZWRlZCBsaWJyYXJpZXMgdW5sZXNzIGRvaW5nIGEgZmluYWwgbGluay4KLQotRnJpIE9jdCAgNiAxNjoyNjoxNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkL2xkLjE6IEZpeCBmb3JtYXR0aW5nIGJ1Z3MuCi0KLVdlZCBPY3QgIDQgMTc6Mzc6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGV4cC5jIChleHBfZ2V0X2Fic19pbnQpOiBSZXR1cm4gYmZkX3ZtYSwgbm90IGludC4KLQkqIGxkZXhwLmggKGV4cF9nZXRfYWJzX2ludCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGxkbGFuZy5jIChwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBVc2UgZnByaW50Zl92bWEgdG8KLQlwcmludCByZXR1cm4gdmFsdWUgb2YgZXhwX2dldF9hYnNfaW50LgotCi1Nb24gT2N0ICAyIDEzOjU2OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbG9iYWxfc3RhdCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCk6IENhbGwgc3RhdF9uZWVkZWQgdG8gbWFrZSBzdXJlCi0JdGhhdCB0aGUgZmlsZSBoYXMgbm90IGFscmVhZHkgYmVlbiBpbmNsdWRlZCB1bmRlciBhbm90aGVyIG5hbWUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotRnJpIFNlcCAyOSAxMjowMDoxOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IFN0YXJ0IC50ZXh0IGF0IDB4ODAwMC4KLQlTdGFydCAuZGF0YSBhdCAweDQwMDAwLgotCi1GcmkgU2VwIDI5IDExOjA5OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IElmCi0JY29tbWFuZF9saW5lLnJwYXRoIGlzIHNldCwgdXNlIGl0LCByYXRoZXIgdGhhbiB0aGUgLUwgb3B0aW9ucywgdG8KLQlidWlsZCB0aGUgcnVsZXMgc2VjdGlvbi4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHRoaXMgdXNlIG9mIC1ycGF0aC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBEb24ndCBzZXQgbGlua19pbmZvLnNoYXJlZCBmb3IgLWFzc2VydAotCXB1cmUtdGV4dC4gIFBhc3MgdHJ1ZSwgbm90IDEsIHRvIGxhbmdfYWRkX2VudHJ5LgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChmaW5kX2Fzc2lnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGZvdW5kX2Fzc2lnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogUmVuYW1lIGxvY2FsIGggdG8gaGR5bi4KLQlJZiBub3QgYSByZWxvY2F0ZWFibGUgbGluaywgYW5kIG5vIHN0YXJ0IHN5bWJvbCB3YXMgc3BlY2lmaWVkIG9uCi0JdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZXJlIGFyZSBhbnkgdW5kZWZpbmVkIHN5bWJvbHMsIHNldAotCWxpbmtfaW5mby5zaGFyZWQuICBJZiBsaW5rX2luZm8uc2hhcmVkIGlzIHNldCwgc2V0IHRoZSBhZGRyZXNzIG9mCi0JdGhlIC50ZXh0IHNlY3Rpb24gdG8gMHgyMC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50KTogUmVuYW1lIGZyb20KLQlnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50LiAgSWYgZmluZF9hc3NpZ24gaXMKLQlzZXQsIHRoZW4ganVzdCBzZXQgZm91bmRfYXNzaWduIGJhc2VkIG9uIHdoZXRoZXIgYW4gYXNzaWdubWVudCBpcwotCWZvdW5kIHRvIGZpbmRfYXNzaWduLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KTogRG9uJ3QgdXNlIGEgc3BlY2lhbCBzY3JpcHQgd2hlbgotCXByb2R1Y2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSogZW11bHBhcmFtcy9zdW40LnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBSZW1vdmUuCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBSZW1vdmUgQ1JFQVRFX1NITElCIHRlc3RzLgotCSogbGRsYW5nLmMgKGVudHJ5X2Zyb21fY21kbGluZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGxhbmdfYWRkX2VudHJ5KTogQ2hhbmdlIGNtZGxpbmUgcGFyYW1ldGVyIGZyb20gaW50IHRvIGJvb2xlYW4uCi0JVXNlIGdsb2JhbCBlbnRyeV9mcm9tX2NtZGxpbmUgcmF0aGVyIHRoYW4gZnVuY3Rpb24gc3RhdGljCi0JZnJvbV9jbWRsaW5lLgotCSogbGRsYW5nLmggKGVudHJ5X2Zyb21fY21kbGluZSk6IERlY2xhcmUuCi0JKGxhbmdfYWRkX2VudHJ5KTogQ2hhbmdlIGRlY2xhcmF0aW9uIG9mIHNlY29uZCBwYXJhbWV0ZXIgZnJvbSBpbnQKLQl0byBib29sZWFuLgotCSogbGRncmFtLnk6IFBhc3MgZmFsc2UsIG5vdCAwLCB0byBsYW5nX2FkZF9lbnRyeS4KLQotVGh1IFNlcCAyOCAxMjozNDoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKHBhcnNpbmdfZGVmc3ltKTogRGVjbGFyZS4KLQkqIGxkbGV4LmggKGxleF9zdHJpbmcpOiBEZWNsYXJlLgotCSogbGRsZXgubCAobGV4X3N0cmluZyk6IERlZmluZS4KLQkqIGxleHN1cC5jIChwYXJzaW5nX2RlZnN5bSk6IERlZmluZS4KLQkocGFyc2VfYXJncyk6IEluIE9QVElPTl9ERUZTWU0gY2FzZSwgc2V0IGxleF9zdHJpbmcgYmVmb3JlIGNhbGxpbmcKLQlsZXhfcmVkaXJlY3QsIGFuZCBjbGVhciBpdCBhZnRlciBjYWxsaW5nIHl5cGFyc2UuICBTZXQKLQlwYXJzaW5nX2RlZnN5bSBhcm91bmQgY2FsbCB0byB5eXBhcnNlLgotCSogbGRtYWluLmMgKG1haW4pOiBTZXQgbGV4X3N0cmluZyBiZWZvcmUgY2FsbGluZyBsZXhfcmVkaXJlY3QsIGFuZAotCWNsZWFyIGl0IGFmdGVyIGNhbGxpbmcgeXlwYXJzZS4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBGb3IgJVMsIGhhbmRsZSAtLWRlZnN5bSBhcmd1bWVudHMgYW5kIGJ1aWx0Ci0JaW4gbGlua2VyIHNjcmlwdHMgY29ycmVjdGx5LgotCi0JKiBzY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2M6IEFkZCAuY3RvcnMvLmR0b3JzIGhhbmRsaW5nIGxpa2Ugb3RoZXIKLQlDT0ZGIHRhcmdldHMsIGFsbG93aW5nIGZvciB0aGUgbGVhZGluZyB1bmRlcnNjb3JlIHVzZWQgb24gU1BBUkMKLQlDT0ZGLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtYXNzZXJ0LgotCSogZW11bHBhcmFtcy9zdW40LnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQpOiBVc2UgdGhlCi0Jc2hhcmVkIGxpYnJhcnkgc2NyaXB0IHdoZW4gYXBwcm9wcmlhdGUuCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBJZiBDUkVBVEVfU0hMSUIgaXMgc2V0LCBzdGFydCB0aGUgLnRleHQKLQlzZWN0aW9uIGF0IFNJWkVPRl9IRUFERVJTLgotCi1UaHUgU2VwIDI4IDAxOjQwOjM3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGVhcm1jb2ZmLmMpOiBCdWlsZC4KLQkqIGNvbmZpZ3VyZS50Z3QgKGFybS0qLWNvZmYpOiBOZXcgdGFyZ2V0Ci0JKiBlbXVscGFybXMvYXJtY29mZi5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBOZXcgZmlsZS4KLQotVHVlIFNlcCAyNiAxMDo1OTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2kzODZjb2ZmLnNjOiBSZW1vdmUgLmRhdGEyOyBubyBsb25nZXIgbmVlZGVkLgotCi1GcmkgU2VwIDIyIDE4OjA5OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRmaWxlLmMgKGxkZmlsZV9zZXRfb3V0cHV0X2FyY2gpOiBNYWtlIGFyY2ggY29uc3QuCi0KLVRodSBTZXAgMjEgMTc6NTU6MjQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IENvcnJlY3RseSBsb2NhdGUgX19ic3Nfc3RhcnQgYXQgdGhlCi0JYmVnaW5uaW5nIG9mIHRoZSAuYnNzIGFyZWEsIG5vdCBhdCB0aGUgZW5kIG9mIGRhdGEuICBBZGQKLQlfX3Nic3Nfe3N0YXJ0LGVuZH0gc3ltYm9scy4KLQotV2VkIFNlcCAyMCAxMjoyOTozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogUXVvdGUgJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKS4KLQkoQ1hYX0ZPUl9UQVJHRVQsIGluc3RhbGwpOiBMaWtld2lzZS4KLQotTW9uIFNlcCAxOCAxNDo1MzoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGJ5IEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogUmVtb3ZlIGJyb2tlbnNlZCBzdHVmZi4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQkoaW5zdGFsbCk6IExpa2V3aXNlLgotCShHRU5FUkFURURfSEZJTEVTKTogUmVtb3ZlIGNvbmZpZy5oLgotCSguZGVwKTogRGVwZW5kIHVwb24gY29uZmlnLmguCi0KLU1vbiBTZXAgMTggMTQ6Mzk6MzggMTk5NSAgQXJuZSBILiBKdXVsICA8YXJuZWpAcHZ2LnVuaXQubm8+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqLWRlYy1uZXRic2QqKTogTmV3IHRhcmdldC4KLQotRnJpIFNlcCAxNSAyMDowMTo1MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKG04OCotKi1kZ3V4Kik6IEZpeCBhbm90aGVyIHNoZWxsIHN5bnRheCBlcnJvci4KLQotRnJpIFNlcCAxNSAyMzoyODowNSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotYnNkKik6IEZpeCBzaGVsbCBzeW50YXggZXJyb3IuCi0KLVRodSBTZXAgMTIgMTI6NTA6NDkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcC9wZS5zYzogIEFsbG93IGJvdGggc3BlbGxpbmdzIG9mIC5jdG9ycy8uZHRvcnMuCi0JU3RhcnQgLnRleHQgc2VjdGlvbiBvbiB0aGUgcmlnaHQgYm91bmRhcnkuIEFsd2F5cyBhbGlnbgotCXN0YWJzLgotCi1UdWUgU2VwIDEyIDEyOjI0OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCi0JKiBsZG1haW4uYyAoc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyk6IERlZmluZS4KLQkod2FybmluZ19jYWxsYmFjayk6IEFkZCBuZXcgcGFyYW1ldGVyIHN5bWJvbC4gIENhbGwKLQl3YXJuaW5nX2ZpbmRfcmVsb2MgdG8gdHJ5IHRvIGZpbmQgdGhlIHNlY3Rpb24gYW5kIFZNQS4KLQkod2FybmluZ19maW5kX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVBhc3MgTlVMTCBhcyBzeW1ib2wgcGFyYW1ldGVyIHRvIHdhcm5pbmcgY2FsbGJhY2suCi0KLQkqIGxkLnRleGluZm86IENsYXJpZnkgLUwgb3B0aW9uLgotCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkodG9wb3dlcik6IExpa2V3aXNlLiAgQWxzbywgcmVpbmRlbnQuCi0JKiBsZHdyaXRlLmMgKGNsb25lX3NlY3Rpb24pOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBpbnQuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogQWRkCi0JY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCi1GcmkgU2VwICA4IDE2OjMyOjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUudGd0LgotCi0JKiBsZGVtdWwuaCAobGRlbXVsX3NldF9zeW1ib2xzKTogRGVjbGFyZS4KLQkobGRlbXVsX3BhcnNlX2FyZ3MpOiBEZWNsYXJlLgotCSogbGRlbXVsLmMgKGxkZW11bF9wYXJzZV9hcmdzKTogRml4IGluZGVudGF0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfSEVBREVSX0RJUkVOVC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBVc2UgYXV0b2NvbmYgcmVjb21tZW5kIG1lY2hhbmlzbSB0byBkZWZpbmUKLQlESVIgYW5kIHN0cnVjdCBkaXJlbnQuCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqLSotYnNkKik6IE5ldyBjYXNlLgotCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtc2VxdWVudC1wdHgqIHwgaVszNDVdODYtc2VxdWVudC1zeXN2KikKLQlOZXcgY2FzZS4KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1XTg2LSotcHR4Kik6IE5ldyBjYXNlLgotCi1UaHUgU2VwICA3IDEwOjQ4OjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmluOiBSZW5hbWUgZnJvbSBjb25maWcuaC5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIHdpdGggY29uZmlnLmg6Y29uZmlnLmluLgotCUNoZWNrIGZvciBjb25maWcuaDpjb25maWcuaW4gd2hlbiBjcmVhdGluZyBzdGFtcC1oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBjb25maWcuaW4gcmF0aGVyIHRoYW4KLQljb25maWcuaC5pbi4gIFNldCBDT05GSUdfSEVBREVSUyB0byBjb25maWcuaDpjb25maWcuaW4gd2hlbgotCWNhbGxpbmcgY29uZmlnLnN0YXR1cy4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCBhbmQgc3RhbXAtaC4KLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotc3Vub3M2NCopOiBSZW1vdmUuCi0JKiBsZGxhbmcuYyAobGFuZ19tYXApOiBDaGVjayBCRkQ2NCwgbm90IEhPU1RfNjRfQklULgotCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogRG9uJ3Qgd2FybiBhYm91dCBtb3ZpbmcgdGhlIGxvY2F0aW9uCi0JY291bnRlciBiYWNrd2FyZCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQotV2VkIFNlcCAgNiAxNDo0MjoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSB0byB1c2UgYXV0b2NvbmYuCi0JKiBjb25maWd1cmUuaG9zdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUudGd0OiBOZXcgZmlsZS4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2NvbmYuCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLmluOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2hlYWRlci4KLQkqIHN5c2RlcC5oOiBOZXcgZmlsZS4KLQkqIGxkLmg6IEluY29ycG9yYXRlIG9sZCBjb250ZW50cyBvZiBjb25maWcuaC4KLQkqIGNvbmZpZy5oOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogVmFyaW91cyBjaGFuZ2VzIGZvciBuZXcgY29uZmlndXJlIHNjcmlwdC4gIEFsc286Ci0JKENDX0ZPUl9CVUlMRCk6IFJlbW92ZS4KLQkobGRtYWluLm8pOiBEb24ndCBib3RoZXIgdG8gZW5zdXJlIHRoYXQgRU1VTCBpcyBub24tZW1wdHkuCi0JKGRlcC5zZWQpOiBVc2UgQFNSQ0RJUkAsIG5vdCBAc3JjZGlyQC4KLQkqIGRlcC1pbi5zZWQ6IFVzZSBAU1JDRElSQCwgbm90IEBzcmNkaXJALgotCSogZ2Vuc2NyaXB0cy5zaDogQ3JlYXRlIGxkc2NyaXB0cyBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLQkqIGxkZW11bC5jLCBsZXhzdXAuYywgbXB3LWVtaXBzaWR0LmM6IERvbid0IGluY2x1ZGUgImNvbmZpZy5oIi4KLQkqIG1wdy1lc2guYywgZW11bHRlbXAvKi5lbTogTGlrZXdpc2UuCi0JKiBsZG1haW4uYzogTGlrZXdpc2UuICBJbmNsdWRlIDxjdHlwZS5oPi4gIERvbid0IHRyeSB0byBzZXQKLQlIQVZFX1NCUksgaGVyZS4KLQkqIGNvbmZpZy8qLm10LCBjb25maWcvKi5taDogUmVtb3ZlLgotCi1UdWUgU2VwICA1IDE0OjU1OjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFRyZWF0IG5zMzJrLXBjNTMyLXV4KiBsaWtlIG5zMzJrLXBjNTMyLW1hY2gqLCBhbmQKLQluczMyay1wYzUzMi1saXRlcyogbGlrZSBuczMyay1wYzUzMi1uZXRic2QqLiAgRnJvbSBJYW4gRGFsbC4KLQotRnJpIFNlcCAgMSAyMjoyOTo1MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogRml4IHR5cG8gaW4gc3BlbGxpbmcgb2YgLmN0b3JzLy5kdG9ycy4KLQotRnJpIFNlcCAgMSAxMzoxMzoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jICh3YXJuaW5nX2NhbGxiYWNrKTogQWRkIGFiZmQsIHNlY3Rpb24sIGFuZCBhZGRyZXNzCi0JcGFyYW1ldGVycy4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCUNoYW5nZSBjYWxsIHRvIHdhcm5pbmcgYWNjb3JkaW5nbHkuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogSWYgbm90Ci0JcmVsb2NhdGVhYmxlIGFuZCBub3Qgc2hhcmVkLCBwdXQgLmdudS53YXJuaW5nLlNZTUJPTCBzZWN0aW9ucyBpbnRvCi0JdGhlIC50ZXh0IHNlY3Rpb24uCi0KLUZyaSBTZXAgIDEgMDg6MzU6MTYgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgbWlwcyp2cjQzMDAtaWR0LWVsZiogYW5kCi0gICAgICAgIG1pcHMqdnI0MzAwZWwtaWR0LWVsZiogdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBlZWxmMzJ2cjQzMDAqIHRhcmdldHMuCi0JKiBlbXVscGFyYW1zL3tlbGYzMnZyNDMwMC5zaCwgZWxmMzJ2cjQzMDBlbC5zaH06IEFkZGVkLgotCSogY29uZmlnL3ttaXBzLXZyNDMwMC5tdCwgbWlwcy12cjQzMDBlbC5tdH06IEFkZGVkLgotCi1GcmkgU2VwICAxIDEwOjUxOjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYTI5ay5zYzogRml4IHRvIGJlIHJlYXNvbmFibGUuICBGcm9tIEJyZW5kYW4gS2Vob2UKLQk8YnJlbmRhbkBjeWdudXMuY29tPi4KLQotVGh1IEF1ZyAzMSAxNjozNzowNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX3BhcnNlX2FyZ3MpOiBOZXcuCi0JKiBsZGVtdWwuaCAobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIHBhcnNlX2FyZ3MuCi0JKiBsZXhzdXAuYyAoYWxsIHBlIHN0dWZmKTogTW92ZWQgaW50byBwZS5lbQotCShwYXJzZV9hcmdzKTogQ2FsbCBlbXVsYXRpb24gYXJnIHBhcnNlci4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAocGFyc2VfYXJncyk6IGhhbmRsZSBQRSBzcGVjZmljIGFyZ3MuCi0KLVRodSBBdWcgMzEgMTc6MDE6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCk6IERvbid0IHVzZSB0aGUgZmlyc3QgcmVnaW9uCi0JYXMgdGhlIGRlZmF1bHQgcmVnaW9uLiAgQ3JlYXRlIGEgbmV3IHJlZ2lvbiBpbnN0ZWFkLgotCi1UdWUgQXVnIDI5IDE0OjIxOjQxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5jIChsZGVtdWxfc2V0X3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGVtdWwuaCAobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIHNldF9zeW1ib2xzLgotCSogbGRtYWluLmMgKG1haW4pOiBBZGQgY2FsbCB0byBsZGVtdWxfc2V0X3N5bWJvbHMuCi0JKiBsZXhzdXAuYyAoc2V0X3BlX3ZhbHVlKTogTmV3IGFyZ3MuCi0JKHNldF9wZV9uYW1lKTogTmV3LgotCShwYXJzZV9hcmdzKTogQ29wZSB3aXRoIG5ldyBzZXRfcGVfdmFsdWUgYXJncy4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24uCi0JKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBzZXRfc3ltYm9scy4KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBVc2UgbmV3IHN5bWJvbHMuCi0KLVRodSBBdWcgMjQgMTg6MTI6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IERvbid0IGNhbGwgc2V0X2RlZmF1bHRfZGlybGlzdCBmb3IgLU8uCi0JRm9yIC1ZLCBpZ25vcmUgYSBsZWFkaW5nIGBQLCcsIGFuZCBvbmx5IGNhbGwgc2V0X2RlZmF1bHRfZGlybGlzdAotCWFmdGVyIHByb2Nlc3NpbmcgYWxsIHRoZSBvdGhlciBhcmd1bWVudHMuCi0KLVR1ZSBBdWcgMjIgMDc6MzY6NTggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IEtlZXAgLmVkYXRhLCBkb24ndCBiYXNlIHN0YWJzIGF0IDAuCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoOiBSdW4gUEUgc2NyaXB0LgotCi1Nb24gQXVnIDIxIDE4OjMwOjQyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogUmVtb3ZlIFBFIHN0dWZmLgotCSogbGV4c3VwLmMgKG9wdGlvbnMpOiBMb2FkIG1vcmUgUEUgb3B0aW9ucy4KLQkoc2V0X3BlX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgQXVnIDE3IDEzOjM1OjQ5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQotCSogZW11bHRlbXBsL3thcm1wZS5zYywgaTM4NnBlLnNjfTogRGVsZXRlZC4KLQkqIGVtdWx0ZW1wbC9wZS5zYzogTmV3IGZpbGUgcGVyZm9ybXMgZ2VuZXJpYyBQRSBzdXBwb3J0IGFuZCBzb3J0cwotCWFyY2hpdmUgbWVtYmVycy4KLQkqIGVtdWxwYXJhbXMve2FybXBlLnNoLGkzODZwZS5zaH06IFVzZSBuZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL3thcm1wZS5zYywgaTM4NnBlLnNjfTogRGVsZXRlZAotCSogc2NyaXB0dGVtcGwvcGUuc2M6IE5ldy4KLQkqIE1ha2VmaWxlLmluOiBVc2UgbmV3IGZpbGVzLgotCi1UaHUgQXVnIDE3IDE0OjQ2OjM0IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2g4NTAwcy5zYyAoLnJkYXRhKTogQWxsIGRhdGEgbXVzdCBnbyBpbiBkYXRhIHNlZ21lbnQuCi0JKC5zdHJpbmdzLC5jdG9ycywuZHRvcnMpOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAxNiAxMTozODo1OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1wZS5zYzogQWx3YXlzIHN0YXJ0IGNvZGUgYXQgMHg0MDEwMDAsIGV2ZW4KLQlpZiAtci4KLQkqIGxkd3JpdGUuYyAoc3RyZHVwKTogTmV3IGV4dGVybiBkZWNsYXJhdGlvbi4KLQkqIGxkZ3JhbS55IChhdHlwZSk6IE5ldyBydWxlIHRvIGNsYXJpZnkgdHlwZSBwYXJzaW5nLgotCSogbGRsYW5nLmMgKGluaXRfb3MpOiBSZW1vdmUgY29tbWVudGVkIG91dCBjb2RlLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBTZXQgU0VDX0FMTE9DIGFuZCBTRUNfTE9BRCBiaXRzCi0JdW5sZXNzIHRvbGQgbm90IHRvIGJ5IHRoZSBsaW5rIHNjcmlwdC4KLQotV2VkIEF1ZyAxNiAxMTo0NToxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NldF9zdGFydG9mKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGFuZ19wcm9jZXNzKTogQ2FsbCBpdC4KLQotCSogbGRncmFtLnk6IFR3ZWFrIGNhc2VzeW1saXN0IHRvIGF2b2lkIGJpc29uIGVycm9ycy4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBY2NlcHQgLWggYXMgYSBzeW5vbnltIGZvciAtLXNvbmFtZSwgZm9yCi0JU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCi1UdWUgQXVnIDE1IDE3OjMxOjE2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKFlZREVCVUcpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDEuCi0JKENBU0UsIEVYVEVSTiwgU1RBUlQpOiBOZXcgdG9rZW5zLgotCShtcmlfc2NyaXB0X2NvbW1hbmQpOiBIYW5kbGUgQ0FTRSwgRVhURVJOLCBJTkNMVURFLCBTVEFSVC4KLQkoY2FzZXN5bWxpc3QpOiBOZXcgbm9udGVybWluYWwuCi0JKGV4dGVybl9uYW1lX2xpc3QpOiBOZXcgbm9udGVybWluYWwuCi0JKiBsZGxleC5sOiBBY2NlcHQgbG93ZXIgY2FzZSB0cmFpbGluZyBiYXNlIHNwZWNpZmllcnMuICBEb24ndAotCWlnbm9yZSB0aGUgZmlyc3QgZGlnaXQgd2hlbiB0aGUgYmFzZSBpcyBhIHN1ZmZpeC4gIEFjY2VwdCBtYW55Ci0JRVhQUkVTU0lPTiBzdGF0ZSB0b2tlbnMgaW4gTVJJIHN0YXRlLiAgU3VwcG9ydCBNUkkgY29udGludWF0aW9uCi0JbGluZXMgYW5kIE1SSSBzZW1pY29sb24gY29tbWVudHMuICBBY2NlcHQgYWxsIE1SSSBrZXl3b3JkcyBpbgotCWxvd2VyIGNhc2UuICBBZGQgQ0FTRSwgRVhURVJOLCBhbmQgU1RBUlQgTVJJIGtleXdvcmRzLgotCi1UdWUgQXVnICA4IDE5OjE0OjU4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogVXNlIHhtYWxsb2MKLQlpbnN0ZWFkIG9mIGFsbG9jYS4KLQotVHVlIEF1ZyAgOCAxNToyNDowNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VULCBDWFhfRk9SX1RBUkdFVCk6IERvbid0IHVzZQotCSRyLy4uL2djYy94Z2NjIHVubGVzcyBpdCBpcyBwcmVzZW50LgotCi1UaHUgQXVnICAzIDExOjU2OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2M6IE9ubHkgcHV0IC5jdG9ycyBhbmQgLmR0b3JzIGluIC50ZXh0Ci0Jd2hlbiBDT05TVFJVQ1RJTkcuCi0JKiBzY3JpcHR0ZW1wbC9tNjhrbHlueC5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9udy5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9zYTI5MjAwLnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL3NwYXJjbHlueC5zYzogTGlrZXdpc2UuCi0KLUZyaSBKdWwgMjggMTI6MDI6MjMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy97ejgwMDEuc2gsIHo4MDAyLnNofTogRml4IHR5cG8uCi0KLVRodSBKdWwgMjcgMjE6MDY6MjEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1saW51eG9sZGxkKTogVHJlYXQgbGlrZSBsaW51eGFvdXQqLgotCi1UaHUgSnVsIDI3IDE1OjI2OjI4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2kzODZwZS5zYzogQ29wZSB3aXRoIGNvbnN0cnVjdG9ycy4KLQkqIHNjcmlwdHRlbXBsL3o4a3NpbS5zYzogRGVsZXRlZC4KLQkqIHNjcmlwdHRlbXBsL3o4MDAwLnNjOiBSZXN1cnJlY3RlZCBhcyB0aGlzLCBidXQKLQljYW4gaGFuZGxlIHo4MDAxIGFuZCB6ODAwMiBmb3JtYXRzLgotCSogZW11bHBhcmFtcy96OGtzaW0uc2g6IERlbGV0ZWQuCi0JKiBlbXVscGFyYW1zL3t6ODAwMS5zaCwgejgwMDIuc2h9OiBOZXcgZmlsZXMuCi0JKiBjb25maWcvejhrc2ltLm10OiBEZWxldGVkCi0JKiBjb25maWcvejhrLWNvZmYubXQ6IE5ldywgZ2VuZXJhdGVzIGJvdGggZW11bGF0aW9ucy4KLQotVHVlIEp1bCAyNSAxNDo1MzowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBJbiAlQyBhbmQgJUQgY2FzZSwgYWx3YXlzIHByaW50IHRoZSBCRkQgdXNpbmcKLQklQiwgaW4gY2FzZSBpdCBpcyBpbiBhbiBhcmNoaXZlLgotCi1Nb24gSnVsIDI0IDE1OjIzOjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IENhbGwgcmVzZXRfbWVtb3J5X3JlZ2lvbnMgZm9yIGVhY2gKLQlyZWxheGF0aW9uIHBhc3MuCi0KLUZyaSBKdWwgMjEgMjI6NDk6NDQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQWRkIHN1cHBvcnQgZm9yIC5zZGF0YSwgLnNic3MsIGFuZAotCV9TREFfQkFTRS4KLQotVGh1IEp1bCAyMCAxNjoyNjo1NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogQWxsb2NhdGUgc2V0X25hbWUgaW4gc3RhY2sKLQlmcmFtZSwgcmF0aGVyIHRoYW4gYWx3YXlzIGNhbGxpbmcgYWxsb2NhIHdpdGggYSBmaXhlZCBzaXplLgotCi1XZWQgSnVsIDE5IDE2OjIxOjQzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvYXJtcGUuc2ggKE9VVFBVVF9GT1JNQVQpOiBDaGFuZ2UgdG8gcGVpLWFybS1saXR0bGUuCi0JKExJVFRMRV9PVVRQVVRfRk9STUFULCBCSUdfT1VUUFVUX0ZPUk1BVCk6IERlZmluZS4KLQotTW9uIEp1bCAxNyAxMzo1NzowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkd3JpdGUuYyAoY2xvbmVfc2VjdGlvbik6IFNldCB0aGUgYWxpZ25tZW50IG9mIHRoZSBjbG9uZQotCXNlY3Rpb24gdG8gdGhhdCBvZiB0aGUgc2VjdGlvbiBiZWluZyBjbG9uZWQuCi0KLQkqIGxkd3JpdGUuYyAoc3BsaXRfc2VjdGlvbnMpOiBEb24ndCBzcGxpdCB0aGUgZmlyc3QgaW5wdXQgc2VjdGlvbgotCWludG8gYSBuZXcgb3V0cHV0IHNlY3Rpb24uCi0KLVNhdCBKdWwgMTUgMDA6MjY6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCi0JKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZSBhcyB5ZXMuCi0KLUZyaSBKdWwgMTQgMTI6MTE6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtIChjaGVja19zZWN0aW9ucyk6IFVzZSAlUCwgbm90ICVGLgotCi0JKiBsZHZlci5jIChoZWxwKTogVXBkYXRlIGxpc3Qgb2Ygb3B0aW9ucyB0byBtYXRjaCBjdXJyZW50bHkKLQlzdXBwb3J0ZWQgbGlzdC4KLQotVGh1IEp1bCAxMyAxMzo1MjoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9sbms5NjAuZW0gKGxkX2xuazk2MF9lbXVsYXRpb24pOiBJbml0aWFsaXplCi0JYWZ0ZXJfb3BlbiBmaWVsZC4KLQotCSogbGRleHAuYyAoZXhwX2ludG9wKTogRG9uJ3QgY2FzdCBzdGF0X2FsbG9jIGFyZyB0byBiZmRfc2l6ZV90eXBlOwotCWl0IHRha2VzIGEgc2l6ZV90IGFueWhvdy4KLQkoZXhwX2Jpbm9wKTogTGlrZXdpc2UuCi0JKGV4cF90cmlub3ApOiBMaWtld2lzZS4KLQkoZXhwX3Vub3ApOiBMaWtld2lzZS4KLQkoZXhwX25hbWVvcCk6IExpa2V3aXNlLgotCShleHBfYXNzb3ApOiBMaWtld2lzZS4KLQkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKTogTGlrZXdpc2UuCi0JKGluaXRfb3MpOiBMaWtld2lzZS4KLQkobGRsYW5nX2FkZF91bmRlZik6IExpa2V3aXNlLgotCShpbnNlcnRfcGFkKTogTGlrZXdpc2UuCi0JKiBsZGZpbGUuYyAobGRmaWxlX2FkZF9hcmNoKTogRG9uJ3QgY2FzdCB4bWFsbG9jIGFyZyB0bwotCWJmZF9zaXplX3R5cGUuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEl0J3MgZWFybWFvdXRiLm8sIG5vdCBlYXJtb3V0Yi5vLgotCi1XZWQgSnVsIDEyIDExOjMyOjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmggKGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6IEFkZCBzZWFyY2ggcGFyYW1ldGVyIHRvCi0JZGVjbGFyYXRpb24uCi0JKGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUpOiBBZGQgc2VhcmNoIHBhcmFtZXRlciB0bwotCW9wZW5fZHluYW1pY19hcmNoaXZlIGVudHJ5IHBvaW50LgotCSogbGRlbXVsLmMgKGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6IEFkZCBzZWFyY2ggcGFyYW1ldGVyLgotCSogbGRmaWxlLmMgKGxkZmlsZV90cnlfb3Blbl9iZmQpOiBSZW5hbWUgZnJvbSB0cnlfb3Blbl9iZmQsIGFuZAotCW1ha2Ugbm9uLXN0YXRpYy4gIENoYW5nZSBhbGwgY2FsbGVycyB0byB1c2UgbmV3IG5hbWUuCi0JKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogTWFrZSBzdGF0aWMuICBJZiBlbnRyeSBpcyBkeW5hbWljLCBjYWxsCi0JbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlLgotCShsZGZpbGVfb3Blbl9maWxlKTogRG9uJ3QgY2FsbCBsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUuCi0JKiBsZGZpbGUuaCAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBEb24ndCBkZWNsYXJlLgotCShsZGZpbGVfdHJ5X29wZW5fYmZkKTogRGVjbGFyZS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgotCUFjY2VwdCBzZWFyY2ggcGFyYW1ldGVyLiAgRG9uJ3Qgc2VhcmNoIGZvciBhIGxpYnJhcnksIGp1c3QgbG9vayBpbgotCWEgc2luZ2xlIHBsYWNlLgotCSogZW11bHRlbXBsL2xpbnV4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6Ci0JTGlrZXdpc2UuCi0KLVR1ZSBKdWwgMTEgMTY6NDQ6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAoc2V0X3NjcmlwdHNfZGlyKTogRG9uJ3QgYmFzZSBzY3JpcHQgZGlyZWN0b3J5IG9uCi0JY3VycmVudCBkaXJlY3RvcnkuCi0KLVR1ZSBKdWwgMTEgMTI6Mjk6MDIgMTk5NSAgUmljayBTbGFka2V5ICA8anJzQHdvcmxkLnN0ZC5jb20+Ci0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBEb24ndCBwcmludCB0aGUgbGluZSBudW1iZXIgaWYgaXQgaXNuJ3QKLQltZWFuaW5nZnVsLgotCi1Nb24gSnVsIDEwIDEzOjM4OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgZmllbGQgd2Fybl9jb25zdHJ1Y3RvcnMuCi0JKiBsZG1haW4uYyAoYWRkX3RvX3NldCk6IFdhcm4gaWYgY29uZmlnLndhcm5fY29uc3RydWN0b3JzLgotCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IExpa2V3aXNlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLXdhcm4tY29uc3RydWN0b3JzLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLXdhcm4tY29uc3RydWN0b3JzLgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk6IERvbid0Ci0JZ2V0IGNvbmZ1c2VkIGJ5IGRpcmVjdG9yeSBuYW1lcyBpZiB3ZSBzZWFyY2hlZCBmb3IgdGhlIGZpbGUuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSC5KLiBMdSA8aGpsQG55bmV4c3QuY29tPjoKLQkqIGxkbGFuZy5oIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKTogQWRkIG5ldyBmaWVsZCBkeW5hbWljLgotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IFNldCBkeW5hbWljIGZyb20gY29uZmlnLmR5bmFtaWNfbGluay4KLQkqIGxkZmlsZS5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkobGRmaWxlX29wZW5fZmlsZSk6IENoZWNrIGR5bmFtaWMgZmllbGQgb2YgZW50cnksIG5vdCBnbG9iYWwKLQlkeW5hbWljX2xpbmsgZmllbGQuICBEb24ndCBkbyBhIGR5bmFtaWMgc2VhcmNoIHdoZW4gZG9pbmcgYQotCXJlbG9jYXRlYWJsZSBsaW5rLgotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCB3YXJuIGFib3V0IGR5bmFtaWNfbGluayBmb3IgYQotCXJlbG9jYXRlYWJsZSBsaW5rLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogU2tpcCBmaWxlIGlmCi0JZHluYW1pYyBpcyBmYWxzZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBBbHdheXMKLQlsb29wIG92ZXIgaW5wdXQgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC1Cc3RhdGljLCAtQmR5bmFtaWMsIC1Cc2hhcmVkLCBhbmQKLQktc2hhcmVkLgotCi1Nb24gSnVsIDEwIDEzOjI5OjQzIDE5OTUgIEVyaWMgWW91bmdkYWxlICA8ZXJpY0BhaWIuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IFNldCBsaW5rX2luZm8uc3ltYm9saWMgdG8gZmFsc2UuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtQnN5bWJvbGljLgotCi1XZWQgSnVsICA1IDAwOjEyOjExIDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoSEFWRV9TQlJLKTogIERlZmluZSBmb3IgZXZlcnl0aGluZyBleGNlcHQKLQlzcGVjaWZpYyBzeXN0ZW1zIHRoYXQgYXJlIGtub3duIHRvIG5vdCBzdXBwb3J0IHNicmsuCi0JKG1haW4pOiAgVXNlIEhBVkVfU0JSSyB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gdXNlIHNicmsuCi0KLVR1ZSBKdWwgIDQgMTI6NTU6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQpOgotCUhhbmRsZSBldHJlZV9wcm92aWRlLgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsb2JhbF9uZWVkZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbG9iYWxfZm91bmQpOiBMaWtld2lzZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQpOiBMaWtld2lzZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCk6IExpa2V3aXNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOiBMaWtld2lzZS4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogUmVwbGFjZSBhZnRlcl9vcGVuX2RlZmF1bHQgd2l0aAotCWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4uCi0KLU1vbiBKdWwgIDMgMTQ6MjY6MzcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotd2luMzIpOiBOZXcgdGFyZ2V0LgotCi1Nb24gSnVsICAzIDE0OjM5OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBMZXQgLUcgZWl0aGVyIHNldCB0aGUgc21hbGwgZGF0YSBzaXplIG9yCi0JYmUgZXF1aXZhbGVudCB0byAtLXNoYXJlZCwgZGVwZW5kaW5nIG9uIHRoZSBuZXh0IGFyZ3VtZW50LiAgQWNjZXB0Ci0JYW5kIGlnbm9yZSAteiBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCi1TdW4gSnVsICAyIDE3OjUyOjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBDYXN0IGZvcGVuIHJlc3VsdCB0byBQVFIgYmVmb3JlIHN0b3JpbmcKLQlpdCBpbiBsaW5rX2luZm8uYmFzZV9maWxlLiAgRml4IGluZGVudGF0aW9uLgotCi1XZWQgSnVuIDI4IDE3OjExOjI1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogQWx3YXlzIGluaXRpYWxpemUgUEUgaW5mbyBpbiBsaW5rX2luZm8uCi0JKiBsZXhzdXAuYyAoT1BUSU9OX0JBU0VfRklMRSk6IE5ldyBvcHRpb24uCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgbmV3IG9wdGlvbi4KLQkqIGVtdWxwYXJhbXMvYXJtcGUuc2g6IE91dHB1dCBwZWkuCi0JKiBlbXVsdGVtcGwvaTM4NnBlLmVtOiBBZGQgbmV3bGluZSB0byBlbmQuCi0JKiBzY3JpcHR0ZW1wbC9hcm1wZS5zYzogQ2hhbmdlIG91dHB1dCBhbmQgcXVvdGUgdGhlICRzLgotCSogc2NyaXB0dGVtcGwvaTM4NnBlLnNjOiBDaGFuZ2Ugb3V0cHV0IGFuZCBxdW90ZSB0aGUgJHMuCi0KLVRodSBKdW4gMjIgMTk6NTU6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVN1biBNYXkgIDcgMTE6NTM6NDEgTURUIDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW1zZG9zKiwgaTM4Ni0qLW1vc3MqKTogTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBpMzg2bXNkb3Muby4KLQkoaTM4Nm1zZG9zLm8pOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL2kzODYtbXNkb3MubXQ6IENyZWF0ZWQuCi0JKiBlbXVscGFyYW1zL2kzODZtc2Rvcy5zaDogQ3JlYXRlZC4KLQkqIHNjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYzogQ3JlYXRlZC4KLQotVGh1IEp1biAyMiAxNTowNjozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoLmZpeHVwKTogQWRkIHN1cHBvcnQgZm9yIGEgLmZpeHVwIHNlY3Rpb24KLQl0aGF0IGNvbnRhaW5zIHBvaW50ZXJzIHRvIGJlIHJlbG9jYXRlZC4KLQotVHVlIEp1biAyMCAxNzo0NzoyMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1lc2guYzogTmV3IGZpbGUsIG1vZGlmaWVkIGZvciBNUFcgZnJvbSBlc2guYy4KLQkqIHNjcmlwdHRlbXBsL3NoLnNjOiBSZWZvcm1hdHRlZCB0byBzaW1wbGlmeSBNUFdpZmljYXRpb24sCi0JdXNlICooKSB0byBjb25jYXQgc3RhYiBzZWN0aW9ucyBpbnN0ZWFkIG9mIFtdLgotCi1UaHUgSnVuIDE1IDA4OjQ4OjE2IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybXBlLnNjOiBBZGQgY29uc3RydWN0b3Igc3VwcG9ydC4KLQotVHVlIEp1biAxMyAwOToxMToyMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogIEFueSBzZWN0aW9uIHdpdGggYSBEQVRBCi0Jc3RhdGVtZW50IGhhcyBjb250ZW50cy4KLQotU3VuIEp1biAxMSAxNToyMDo0NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL202OGtlbGYuc2ggKE5PUCk6IERlZmluZS4KLQkoRFlOQU1JQ19MSU5LKTogRG9uJ3QgZGVmaW5lLgotCShURVhUX1NUQVJUX0FERFIpOiBTZXQgdG8gMHg4MDAwMDAwMDsgdGhlIGV4dHJhIDB4MTAwIGZvciBoZWFkZXJzCi0Jd2lsbCBjb21lIGZyb20gdGhlIGxpbmtlciBzY3JpcHQuCi0KLVRodSBKdW4gIDggMTQ6MTc6MzMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9hcm1wZS5zaCwgc2NyaXB0ZW1wbC9hcm1wZS5zYzogQWRkIGVuZCBhbmQgc3RhY2suCi0KLU1vbiBKdW4gIDUgMDI6MTY6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotZ251Kik6IFVzZSBHTlUgZWxmIGNvbmZpZy4KLQotVGh1IE1heSAyNSAxMTo0OToyOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQlGcm9tIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0JKiBNYWtlZmlsZS5pbjogRml4dXAgbW9yZSBnb3RjaGFzIGZyb20gcmVuYW1pbmcgZWxmMzJwcGNsZSB0bwotCWVsZjMybHBwYy4KLQotV2VkIE1heSAyNCAxMToyMzoyMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIEFSTS1QRS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBhcm1wZS5vCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBhcm1wZS4KLQkqIGNvbmZpZy9hcm0tcGUubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9hcm1wZS5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9hcm1wZS5zYzogTmV3IGZpbGUuCi0KLQotTW9uIE1heSAyMiAxNToxOToyNiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaDgzMDBoLSotaG1zKTogRGVsZXRlZAotCSogY29uZmlnL2NmLWg4MzAwaC5tdDogRGVsZXRlZC4KLQotVGh1IE1heSAxOCAwNDoyNjoxMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlXZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JRnJvbSBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhcm1vdXRbbGJdLm8KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGFybXssZVtsYl0tKi1hb3V0LgotCSogY29uZmlnL2FybVtsYl0tYW91dC5tdDogTmV3IGZpbGVzLgotCSogZW11bHBhcmFtcy9hcm1hb3V0W2xiXS5zaDogTmV3IGZpbGVzLgotCSogc2NyaXB0dGVtcGwvYXJtYW91dC5zYzogTmV3IGZpbGUuCi0KLVR1ZSBNYXkgMTYgMTg6Mjc6MTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvcHBjbGUtZWxmMzIubXQgKEVNVUwpOiBVc2UgZWxmMzJscHBjLCBub3QgZWxmMzJwcGNsZSwgdG8KLQliZSB1bmlxdWUgaW4gOCBjaGFyYWN0ZXJzIGZvciBET1MuCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJscHBjLnNoOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIGVsZjMycHBjbGUuc2guCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjbGUuc2g6IERlbGV0ZWQuCi0KLUZyaSBNYXkgMTIgMTE6MDM6NTUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQkJCSAgVG9tIEdyaWVzdCA8Z3JpZXN0QGNzLnlhbGUuZWR1PgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBQRSBleGVjdXRhYmxlcyAoZWcgTlQsIHdpbjMyKQotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlndXJlLmluLCBlaTM4NnBlKTogQWRkIHN1cHBvcnQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgUEUgYXJndW1lbnQgaW5mby4KLQkqIGxkd3JpdGUuYyAocHJpbnRfZmlsZV9zdHVmZik6IERvbid0IHByaW50IG91dCAuZHJlY3R2ZQotCWFuZCAuZGVidWcgc2VjdGlvbiBpbmZvLgotCSogbGV4c3VwLmMgKHNldF9zdWJzeXN0ZW0sIHNldF9zdGFja19oZWFwLCBPUFRJT05fSEVBUCwKLQkgT1BUSU9OX1NVQlNZU1RFTSwgcGFyc2VfYXJnc20gc2V0X3N1YnN5c3RlbSwgc2V0X3N0YWNrX2hlYXApOgotCSBIYW5kbGUgbmV3IGFyZ3VtZW50cy4KLQkqIGNvbmZpZy9pMzg2LXBlLm10LCBlbXVsdGVtcGwvaTM4NnBlLmVtLCBzY3JpcHR0ZW1wbC9pMzg2cGUuc2M6Ci0JTmV3IGZpbGVzCi0KLVdlZCBNYXkgMTAgMTg6Mzc6NTkgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2M6ICBSZW1vdmUgLlBBUklTQy51bndpbmQgc2VjdGlvbiBmcm9tIHRleHQKLQlzZWdtZW50LiAgVGhpcyBhbGxvd3MgbGQgLXIgdG8gcHJlc2VydmUgdW53aW5kIHNlY3Rpb25zLgotCi1UdWUgTWF5ICA5IDE3OjE5OjU3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbGl0dGxlIGVuZGlhbiBQb3dlclBDIHN1cHBvcnQuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZWxmMzJwcGNsZS5vLgotCShlZWxmMzJwcGNsZS5jKTogU3VwcG9ydCBmb3IgbGl0dGxlIGVuZGlhbiBQb3dlclBDLgotCi0JKiBjb25maWcvcHBjbGUtZWxmMzIubXQ6IE5ldyBmaWxlIGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMuCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjbGUuc2g6IERpdHRvLgotCi1XZWQgTWF5ICAzIDEyOjU2OjMyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBDaGVjawotCXN1YnNlY3Rpb25fYWxpZ25tZW50LCBpbnN0ZWFkIG9mIGNoZWNraW5nIHNlY3Rpb25fYWxpZ25tZW50IHR3aWNlLgotCU5vdGljZWQgYnkgQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+LgotCi1UdWUgTWF5ICAyIDE2OjM2OjA3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotbGl0ZXMqKTogSGFuZGxlIGxpa2UgaHBwYSotKi0qZWxmKi4KLQotTW9uIEFwciAyNCAxOToyMTowMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbGR3cml0ZS5jIChsZHdyaXRlKTogQmVmb3JlIGRvaW5nIGFueXRoaW5nLCByZXNldCB0aGUgZXJyb3IKLQljb2RlLiAgSWYgYmZkX2ZpbmFsX2xpbmsgcmV0dXJucyBhbiBlcnJvciwgYnV0IHRoZSBlcnJvciBjb2RlIGlzCi0JdW5zZXQsIGRvbid0IGlzc3VlIGFuIGV4dHJhIG1lc3NhZ2UuICBBc3N1bWUgYSBjb3JyZWN0IGVycm9yCi0JbWVzc2FnZSB3YXMgYWxyZWFkeSBzZXQuCi0KLUZyaSBBcHIgMTQgMTY6MzE6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW02OGtlbGYuby4KLQkoZW02OGtlbGYubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvbTY4ay1lbGYubXQsIGVtdWxwYXJhbXMvbTY4a2VsZi5zaDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluOiBVc2UgdGhlbSBmb3IgbTY4Ki0qLWVsZi4KLQotVHVlIEFwciAxMSAxMjowMjowMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiBzdXBwb3J0IGZvciBNYWMgTVBXIGFzIGEgaG9zdC4KLQkoT2xkIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQotCi0JKiBtcHctY29uZmlnLmluIChpMzg2LXVua25vd24tYW91dCk6IENoYW5nZSB0byBpMzg2LXVua25vd24tZ28zMi4KLQkoaTM4Ni11bmtub3duLWNvZmYpOiBSZW1vdmUuCi0JKHNoLWhpdGFjaGktaG1zKTogTmV3IHRhcmdldC4KLQkoZW11bGF0aW9uX29maWxlcyk6IFNldCBjb3JyZWN0bHkgZm9yIGVhY2ggdGFyZ2V0LgotCSh2ZXJzaW9uLCBUREVGSU5FUyk6IEFkZCB0byBtYWtlZmlsZSBmcmFnbWVudC4KLQkqIG1wdy1tYWtlLmluIChCSVNPTik6IFVzZSBieWFjYyBpbnN0ZWFkIG9mIGJpc29uLgotCShlbV8qLmMpOiBSZXBsYWNlIHdpdGggZSouYyBldmVyeXdoZXJlLgotCShsZGdyYW0uaCk6IFNlcGFyYXRlIGFjdGlvbiBmcm9tIGxkZ3JhbS5jIGdlbmVyYXRpb24uCi0JKExEX1BST0cpOiBEZXBlbmQgb24gVmVyc2lvbi5yLgotCShWZXJzaW9uLnIpOiBnZW5lcmF0ZSBmcm9tIHZlcnNpb24gaW5mby4KLQkqIG1wdy1lbWlwc2lkdC5jOiBOZXcgZmlsZSwgbW9kaWZpZWQgZm9yIE1QVyBmcm9tIGVtaXBzaWR0LmMuCi0KLQkqIG1wdy1jb25maWcuaW4gKG02OGstYXBwbGUtbWFjb3MsIHBwYy1hcHBsZS1tYWNvcywKLSAgICAgICAgaTM4Ni11bmtub3duLWFvdXQsIGkzODYtdW5rbm93bi1jb2ZmKTogTmV3IHRhcmdldHMuCi0JKG02OGstYW91dCwgbTY4ay1jb2ZmKTogUmVtb3ZlIHRhcmdldHMuCi0JKG1rLnRtcCk6IEFkZCBkZWZpbml0aW9uIG9mIEVNVUwuCi0KLQkqIG1wdy1jb25maWcuaW4gKGVtdWxuYW1lKTogU2V0IGJhc2VkIG9uIHRhcmdldC4KLQkobGRlbXVsLWxpc3QuaCk6IENvbnN0cnVjdC4KLQkqIG1wdy1tYWtlLmluIChpbnN0YWxsLW9ubHkpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogRGVwZW5kIG9uIGluc3RhbGwtb25seS4KLQotCSogbXB3LW1ha2UuaW4gKGJpbmRpcik6IEZpeCBwYXRobmFtZS4KLQkoaW5zdGFsbCk6IE1vdmUgaGVyZSBmcm9tIG1wdy1idWlsZC5pbi4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyBjb25maWd1cmF0aW9uIGZyYWdtZW50LgotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgbWFrZWZpbGUgZnJhZ21lbnQuCi0JKFRoaXMgZmlsZSBpcyBzZW1pLWF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4uKQotCSogbGRmaWxlLmMgKHNsYXNoKTogSWYgTVBXLCBzZXQgdG8gYDonLgotCSogbGRsZXgubCAoVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQpOiBJZiBNUFcsIHNldCB0aGlzIHRvCi0JcHJldmVudCByZWRlZmluaXRpb24gZXJyb3JzLgotCi1UdWUgQXByICA0IDE3OjU1OjE4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQGJhbmcuaGFjay5jb20+Ci0KLQkqIGxkd3JpdGUuYyAoY2xvbmVfc2VjdGlvbik6IEFsaWduIGNsb25lIHNlY3Rpb25zIG9uIGV2ZW4KLQlib3VuZGFyaWVzLgotCi1UaHUgTWFyIDMwIDE0OjMyOjI2IDE5OTUgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgbGludXggdG8gZGVmYXVsdCB0byBlbGYuICBVc2luZwotCWlbMzQ1XTg2LSotbGludXhhb3V0IHdpbGwgYnVpbGQgYSBsaW5rZXIgd2hpY2ggZGVmYXVsdHMgdG8gYS5vdXQuCi0JKiBjb25maWcvaTM4Ni1sYW91dC5tdDogUmVuYW1lIGZyb20gb2xkIGNvbmZpZy9pMzg2LWxpbnV4Lm10LgotCSogY29uZmlnL2kzODYtbGludXgubXQ6IFJlbmFtZSBmcm9tIG9sZCBjb25maWcvaTM4Ni1sZWxmLm10LgotCSogY29uZmlnL2kzODYtbGVsZi5tdDogUmVtb3ZlLgotCi1UaHUgTWFyIDMwIDEzOjA5OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBJZiBvcGVuaW5nIHRoZSBtYXAgZmlsZSBmYWlscywgY2FsbAotICAgICAgICBiZmRfc2V0X2Vycm9yIGJlZm9yZSBjYWxsaW5nIGVpbmZvLgotCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCB0aGUgLW5vLWtlZXAtbWVtb3J5IG9wdGlvbi4KLQotTW9uIE1hciAyNyAxMToxMDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogUmV2ZXJ0IHBhdGNoIG9mIE1hcmNoIDEwLCBzaW5jZSB0aGUgU1ZSNCBsaW5rZXIKLQlkb2VzIG1hcmsgc2hhcmVkIGxpYnJhcmllcyBhcyBleGVjdXRhYmxlLgotCi1UdWUgTWFyIDIxIDE1OjE1OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY29tbW9uKTogQ2hhbmdlIHBvd2VyIHRvIGludC4gIFBhc3MgbGFyZ2VyIHZhbHVlcwotCWJlZm9yZSBzbWFsbGVyIHZhbHVlcy4KLQkobGFuZ19vbmVfY29tbW9uKTogVHJlYXQgaW5mbyBhcyBpbnQgKi4gIERvbid0IGJvdGhlciB0byBjaGVjayBmb3IKLQlsYXN0IHZhbHVlLCBzaW5jZSBpdCBpcyBub3cgemVyby4KLQotU2F0IE1hciAxOCAwMTo0OToxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBBbiBlbXB0eSBhcmNoaXZlIGlzIE9LLgotCi1GcmkgTWFyIDE3IDE2OjE1OjMxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKHByb2dyZXNzLmgpOiBJbmNsdWRlLgotCShtYWluKTogQ2FsbCBTVEFSVF9QUk9HUkVTUyBhbmQgRU5EX1BST0dSRVNTLgotCi1UaHUgTWFyIDE2IDE3OjE3OjMzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IE1vdmUgX0dPVDJfRU5EXyBhZnRlciB0aGUgLmN0b3JzIGFuZAotCS5kdG9ycyBzZWN0aW9ucywgc28gdGhhdCB0aGVzZSBwb2ludGVycyBnZXQgcmVsb2NhdGVkIGFsc28uCi0JRGVmaW5lIHRoZSBzeW1ib2xzIF9fe0MsRH1UT1Jfe0xJU1QsRU5EfV9fIHRvIG1hcmsgdGhlIGJlZ2lubmluZwotCWFuZCBlbmQgb2YgdGhlIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4KLQotVGh1IE1hciAxNiAxMzo1OToxNCAxOTk1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1PgotCi0JKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogSWYgd2hvbGVfYXJjaGl2ZSBpcyB0cnVlIGFuZCBFTlRSWQotCWRlc2NyaWJlcyBhbiBhcmNoaXZlLCBjYWxsIGJmZF9saW5rX2FkZF9zeW1ib2xzIG9uIGVhY2ggbWVtYmVyLgotCSogbGRtYWluLmMgKHdob2xlX2FyY2hpdmUpOiBOZXcgdmFyaWFibGUuCi0JKG1haW4pOiBJbml0aWFsaXplIGl0IHRvIGZhbHNlLgotCSogbGRtYWluLmg6IERlY2xhcmUgd2hvbGVfYXJjaGl2ZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogR3JvayAtLXdob2xlLWFyY2hpdmUgc3dpdGNoLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS13aG9sZS1hcmNoaXZlLgotCi1UaHUgTWFyIDE2IDExOjM4OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2Vuc2NyaXB0cy5zaCAoRU1VTEFUSU9OX05BTUUpOiBTZXQgTElCX1BBVEggdG8gZW1wdHkgd2hlbiBub3QKLQl1c2luZyB0aGUgZGVmYXVsdCBlbXVsYXRpb24uCi0KLQkqIGNvbmZpZy9kZ3V4Lm1oIChIT1NUSU5HX0VNVSk6IFVzZSAtbSByYXRoZXIgdGhhbiB0cnlpbmcgdG8gc2V0Ci0JTERFTVVMQVRJT04uCi0JKiBjb25maWcvaHBwYWVsZi5taCAoSE9TVElOR19FTVUpOiBMaWtld2lzZS4KLQotVHVlIE1hciAxNCAxMjoyODowMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFNldCBmb3JjZV9tYWoKLQlmb3IgLWxjLk4uICBGcm9tIEguSi4gTHUgPGhqbEBueW5leHN0LmNvbT4uCi0KLUZyaSBNYXIgMTAgMTQ6NDM6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IERvbid0IHNldCBFWEVDX1AgaWYgbGlua19pbmZvLnNoYXJlZCBpcyBzZXQuCi0KLQkqIGxkbGV4Lmw6IFJldHVybiAtbEZJTEVOQU1FIGFzIHRoZSB0b2tlbiBMTkFNRS4KLQkqIGxkZ3JhbS55OiBBZGQgdG9rZW4gTE5BTUUuCi0JKGlucHV0X2xpc3QpOiBUcmVhdCBMTkFNRSBsaWtlIE5BTUUsIGJ1dCBwYXNzIGl0IHRvCi0JbGFuZ19hZGRfaW5wdXRfZmlsZSBhcyBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdXNpbmcgLWxGSUxFTkFNRSBpbiBJTlBVVC4KLQotVGh1IE1hciAgOSAxMjoyMTo1MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrKTogSWYgdGhlIGFyY2hpdGVjdHVyZXMgYXJlIGNvbXBhdGlibGUgY2FsbAotCWJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIHRvIGxldCB0aGUgYmFja2VuZCBkbyBhZGRpdGlvbmFsCi0JY2hlY2tzLgotCi1UdWUgTWFyICA3IDAwOjUzOjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9jaG9vc2VfbW9kZSk6IElmIGVtdWxhdGlvbiBub3QgcmVjb2duaXplZCwgbGlzdAotCWFsbCBzdXBwb3J0ZWQgZW11bGF0aW9ucy4KLQotTW9uIE1hciAgNiAxNDowMzo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5jIChsZGVtdWxfbGlzdF9lbXVsYXRpb25zKTogTmV3IGZ1bmN0aW9uLgotCSogbGRlbXVsLmggKGxkZW11bF9saXN0X2VtdWxhdGlvbnMpOiBEZWNsYXJlLgotCSogbGR2ZXIuYyAoaGVscCk6IExpc3Qgc3VwcG9ydGVkIHRhcmdldHMgYW5kIGVtdWxhdGlvbnMuCi0KLUZyaSBNYXIgIDMgMTU6NDA6MzYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjICguZGVidWcpOiBSZWxvY2F0ZSB0byBhZGRyZXNzIDAuCi0JKC5kZWJ1Z19zcmNpbmZvLCAuZGVidWdfYXJhbmdlcywgLmRlYnVnX3B1Ym5hbWVzLAotCS5kZWJ1Z19zZm5hbWVzLCAubGluZSk6IExpa2V3aXNlLgotCi1GcmkgTWFyICAzIDE3OjA3OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChob2xkX3JlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFBsYWNlIHJlYWRvbmx5IHNlY3Rpb25zIHdpdGgKLQljb250ZW50cyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICIucmVsIiBhZnRlciBob2xkX3JlbC4gIFJlbW92ZSB0aGUKLQlhc3NlcnRpb24gd2hpY2ggY2hlY2tlZCBmb3IgdW5wbGFjZWQgLnJlbCBzZWN0aW9ucy4gIERvbid0IHRyeSB0bwotCXNvcnQgdGhlIHNlY3Rpb24gaW50byBwbGFjZSBpZiBwbGFjZS0+YmZkX3NlY3Rpb24gaXMgTlVMTC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IFNldCBob2xkX3JlbCB0byB0aGUgZmlyc3QKLQlzZWN0aW9uIGJlZ2lubmluZyB3aXRoICIucmVsIi4KLQotVGh1IE1hciAgMiAxNDozNDo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlEb2Mgbm90ZSBmcm9tIHBpZXJyZUBwaGkubGEudGNlLmNvbSAoUGllcnJlIFdpbGxhcmQpOgotCSogbGQudGV4aW5mbzogLVggYW5kIC14IHdvcmsgZXZlbiBpZiAtcyBvciAtUyBhcmUgbm90IHNwZWNpZmllZC4KLQkqIGxkLjE6IFNpbWlsYXIgY2hhbmdlLgotCi1XZWQgTWFyICAxIDEzOjUxOjE2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoIChDT0ZGX0NUT1JTKTogRGVmaW5lLgotCSogc2NyaXB0dGVtcGwvaTk2MC5zYzogVXNlIENPRkZfQ1RPUlMgaWYgQ09OU1RSVUNUSU5HLgotCi1UdWUgRmViIDI4IDEyOjQyOjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWxpbnV4ZWxmKik6IE5ldyB0YXJnZXQuICBVc2UgaTM4Ni1sZWxmLgotCShpWzM0NV04Ni0qLWdudWVsZiopOiBOZXcgdGFyZ2V0LiAgVXNlIGkzODYtZ2VsZi4KLQkqIGNvbmZpZy9pMzg2LWxlbGYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnL2kzODYtZ2VsZi5tdDogTmV3IGZpbGUuCi0KLVR1ZSBGZWIgMjggMTA6Mjc6NTQgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IE1hdGNoIG9uIG1pcHMtZWNvZmYsIGFuZCBkZWZhdWx0IHRvIHRoZSBJRFQKLQljb25maWd1cmF0aW9uLgotCi1GcmkgRmViIDE3IDEzOjA2OjQ3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAuZ290MSBhbmQgLmdvdDIgc2VjdGlvbnMuCi0JT2Zmc2V0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyAzMjc2OCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgR09UIGFyZWEKLQl0byBkb3VibGUgdGhlIHNpemUgb2YgdGhlIHRhYmxlLgotCi1UaHUgRmViICA5IDE4OjI5OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEbyByZWN1cnNpdmUgZGVsZXRpb24sIHNpbmNlIGxkc2NyaXB0cwotCWlzIGEgZGlyZWN0b3J5LgotCi1UaHUgRmViICA5IDExOjM4OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBJZiB0cmFjZV9maWxlX3RyaWVzIGlzIHRydWUsIGFuZCB3ZSBhcmUgdXNpbmcKLQlhbiBpbnRlcm5hbCBsaW5rZXIgc2NyaXB0LCBwcmludCBvdXQgdGhlIHNjcmlwdC4KLQkqIGxkZmlsZS5jICh0cnlfb3Blbik6IFJlaW5kZW50IGZ1bmN0aW9uLiAgTWFrZSB0aGUgbWVzc2FnZXMgYWJvdXQKLQlvcGVuaW5nIHNjcmlwdCBmaWxlcyBtb3JlIGluZm9ybWF0aXZlLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEZvciAtViwgY2FsbCBsZHZlcnNpb24gd2l0aCAxLCBub3QgMC4KLQkqIGxkLnRleGluZm8sIGxkLjE6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotV2VkIEZlYiAgOCAxNzozNDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBBZGp1c3QgcmVmZXJlbmNlcyB0byBjb21tb24gc3ltYm9sCi0JaW5mb3JtYXRpb24gZm9yIG5ldyBzdHJ1Y3R1cmUuCi0KLU1vbiBGZWIgIDYgMTI6MTc6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAodW5kZWZpbmVkX3N5bWJvbCk6IEhhbmRsZSBzZWN0aW9uIGJlaW5nIE5VTEwuCi0KLQkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IEhhbmRsZSBiZmRfbGlua19oYXNoX2RlZndlYWsuCi0JKiBsZGV4cC5jIChmb2xkX25hbWUpOiBMaWtld2lzZS4KLQkqIGxkbGFuZy5jIChwcmludF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGxhbmdfZmluaXNoKTogTGlrZXdpc2UuCi0JKiBsZG1haW4uYyAobXVsdGlwbGVfY29tbW9uKTogTGlrZXdpc2UuCi0JKiBsZHdyaXRlLmMgKHByaW50X3N5bWJvbCk6IExpa2V3aXNlLiAgQWxzbywgYmZkX2xpbmtfaGFzaF93ZWFrCi0JcmVuYW1lZCB0byBiZmRfbGlua19oYXNoX3VuZGVmd2Vhay4KLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IFNldCBhZGRyZXNzIG9mIC5kYXRhIHNlY3Rpb24gY29ycmVjdGx5Ci0Jd2hlbiAtbiBvciAtTiBpcyB1c2VkLiAgUGF0Y2ggZnJvbSBDaHJpcyBHIERlbWV0cmlvdQotCTxDaHJpc19HX0RlbWV0cmlvdUBMQUdBVlVMSU4uUERMLkNTLkNNVS5FRFU+LgotCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogU2ltaWxhciBjaGFuZ2UuCi0KLVR1ZSBKYW4gMzEgMTY6MjA6NTIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENsYXJpZnkgZXJyb3IgbWVzc2FnZSB3aGVuIHVzZXIKLQlzcGVjaWZpZWQgc3RhcnQgYWRkciBjb25mbGljdHMgd2l0aCByZWdpb24uICBGaXggcmVzZXR0aW5nIG9mCi0JcmVnaW9uIHBvaW50ZXIuCi0KLVR1ZSBKYW4gMzEgMTI6Mzc6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGV4cC5jIChmb2xkX25hbWUpOiBJbiBjYXNlIE5BTUUsIHBlcm1pdCBhbiBhYnNvbHV0ZSBzeW1ib2wKLQlpbiBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bS4KLQotTW9uIEphbiAzMCAxMTozMzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZXBlbmQgdXBvbiBjbGVhbi4gIERvbid0IGJvdGhlciB0bwotCXJlbW92ZSBmaWxlcyB3aGljaCB3aWxsIGJlIHJlbW92ZWQgYnkgY2xlYW4uICBGcm9tIHBhdGNoIGJ5Ci0JYWxhbkBTUFJJLkxldmVscy5VbmlTQS5FZHUuQXUgKEFsYW4gTW9kcmEpLgotCi1GcmkgSmFuIDI3IDE2OjI3OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEZvcgotCWEgTUlQUyB0YXJnZXQsIGNsb2JiZXIgdGhlIHNpemUgb2YgYWxsIGJ1dCB0aGUgZmlyc3QgaW5wdXQKLQkucmVnaW5mbyBzZWN0aW9uIHRvIGJlIDAsIHNvIHRoYXQgbGFuZ19zaXplX3NlY3Rpb25zIHNldHMgdGhlCi0JY29ycmVjdCBzaXplIGZvciB0aGUgb3V0cHV0IC5yZWdpbmZvIHNlY3Rpb24uCi0KLVRodSBKYW4gMjYgMTk6NTM6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGlzLgotCi1UaHUgSmFuIDI2IDEyOjMzOjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgcG93ZXJwYy0qLWVhYmkuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTmV3IGZpbGUgZm9yIFBvd2VyUEMgZW1iZWRkZWQgQUJJCi0Jc3VwcG9ydC4KLQotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoU0NSSVBUX05BTUUpOiBVc2UgZWxmcHBjLnNjIGluc3RlYWQgb2YKLQllbGYuc2MsIHdoaWNoIGRlZmluZXMgc29tZSBuZXcgc3ltYm9scyBQb3dlclBDIGVsZiBuZWVkcy4KLQotVHVlIEphbiAyNCAxMDozMjoxNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkY3Rvci5jIChsZGN0b3JfYWRkX3NldF9lbnRyeSk6IERvbid0IGR1bXAgY29yZSBpZiBhCi0JY29uc3RydWN0b3IgZW50cnkgaXMgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uCi0KLU1vbiBKYW4gMjMgMTM6NTg6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotZ251Kik6IFNldCBsZF90YXJnZXQgdG8gaTM4Ni1nbnUuCi0JKiBjb25maWcvaTM4Ni1nbnUubXQ6IE5ldyBmaWxlLiAgSW5jbHVkZSBFTEYgc3VwcG9ydC4KLQotVGh1IEphbiAxOSAxNjoyMjoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBJZgotCXRoZXJlIGFyZSBhbnkgaW5wdXQgc2VjdGlvbnMgbmFtZWQgLmdudS53YXJuaW5nLCB0cmVhdCB0aGVtIGFzCi0JY29udGFpbmluZyBhIHdhcm5pbmcgbWVzc2FnZSB0byBiZSBwcmludGVkIGJ5IHRoZSBsaW5rZXIsIGFuZAotCWNsb2JiZXIgdGhlIHNpemUgc28gdGhhdCB0aGUgbWVzc2FnZSBpcyBub3QgY29waWVkIGludG8gdGhlIG91dHB1dAotCWZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFB1dCAuZ251Lndhcm5pbmcgc2VjdGlvbnMgaW50byB0aGUgLnRleHQKLQlzZWN0aW9uLgotCi1TdW4gSmFuIDE1IDE2OjQ1OjAwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBjb25maWd1cmUuaW4gKHc2NS0qLSopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZS4KLQkqIHNjcmlwdHRlbXBsL3c2NS5zYzogTmV3LgotCSogY29uZmlnL2NvZmYtdzY1Lm10OiBOZXcuCi0KLVRodSBKYW4gMTIgMDE6MzI6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19wbGFjZV9vcnBoYW5zKTogRG9uJ3QgaWdub3JlIGZpbGVzIHdpdGgKLQlqdXN0X3N5bXNfZmxhZyBzZXQuICBJbnN0ZWFkLCBwdXQgYWxsIHRoZWlyIHNlY3Rpb25zIGluCi0JYmZkX2Fic19zZWN0aW9uX3B0ciwgdXNpbmcgdGhlIHNlY3Rpb24gVk1BIGFzIHRoZSBvdXRwdXRfb2Zmc2V0LgotCi1XZWQgSmFuIDExIDIyOjU5OjA5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IERvbid0IHVzZSBgY29uc3QnIHdpdGggdHlwZWRlZgotCW5hbWUgYHJlbG9jX2hvd3RvX3R5cGUnLCBzaW5jZSBpdCdzIG5vdyBkZWZpbmVkIHRvIGJlIGNvbnN0LgotCSogbGRsYW5nLmMgKGxhbmdfYWRkX3JlbG9jKTogRGl0dG8uCi0JKiBsZGxhbmcuaCAobGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSwgbGFuZ19hZGRfcmVsb2MpOiBEaXR0by4KLQotV2VkIEphbiAxMSAxMToyNDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogQWRkaW5nIG9yIHN1YnRyYWN0aW5nIGFuIGFic29sdXRlIHZhbHVlCi0JdG8gYSByZWxhdGl2ZSB2YWx1ZSBkb2VzIG5vdCByZXF1aXJlIGZvcmNpbmcgdGhlIHJlbGF0aXZlIHZhbHVlIHRvCi0JYmUgYWJzb2x1dGUuICBBbHNvLCByZWluZGVudCBmdW5jdGlvbi4KLQotV2VkIERlYyAyOCAyMjowNTo1MiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZHdyaXRlLmMgKGNsb25lX3NlY3Rpb24pOiBDcmVhdGUgYSBzeW1ib2wgd2l0aCB0aGUKLQlzYW1lIG5hbWUgYXMgdGhlIHNlY3Rpb24uCi0KLU1vbiBEZWMgMTkgMTQ6MDI6MTMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGQuaCAoc3BsaXRfYnlfcmVsb2MsIHNwbGl0X2J5X2ZpbGUpOiBOZXcgZmxhZ3MuCi0JKiBsZHdyaXRlLmMgIChjbG9uZV9zZWN0aW9uLCBzcGxpdF9zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbnMuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFVuZGVyc3RhbmQgbmV3IHNwbGl0IG9wdGlvbnMuCi0KLUZyaSBEZWMgIDkgMTc6MjI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE1vdmUgLmN0b3JzIGFuZCAuZHRvcnMgZnJvbSAudGV4dCBzZWdtZW50IHRvCi0JLmRhdGEgc2VnbWVudC4gIFRoZXkgbXVzdCBiZSB3cml0YWJsZSB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeS4gIEZyb20gSC5KLiBMdSA8aGpsQG55bmV4c3QuY29tPi4KLQotRnJpIERlYyAgMiAxNDowOTowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvbWlwb3NlY29mZi5lbTogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL21pcHNpZHQuc2ggKFRFTVBMQVRFX05BTUUpOiBTZXQgdG8gbWlwc2Vjb2ZmLgotCSogZW11bHBhcmFtcy9taXBzaWR0bC5zaCAoVEVNUExBVEVfTkFNRSk6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogUHV0IC5yZWwuc2RhdGEgc2VjdGlvbnMgaW4gLnRleHQsIGFuZAotCXByb3ZpZGUgX19ydW50aW1lX3JlbG9jX3N0YXJ0IGFuZCBfX3J1bnRpbWVfcmVsb2Nfc3RvcCBpZiB0aGV5IGFyZQotCXVzZWQuICAgQWxpZ24gX2ZkYXRhIHRvIGEgMTYgYnl0ZSBib3VuZGFyeS4KLQkqIE1ha2VmaWxlLmluIChlbWlwc2lkdC5jKTogRGVwZW5kIHVwb24gbWlwc2Vjb2ZmLmVtIHJhdGhlciB0aGFuCi0JZ2VuZXJpYy5lbS4KLQkoZW1pcHNpZHRsLmMpOiBMaWtld2lzZS4KLQkoY2hlY2spOiBQYXNzIENDX0ZPUl9IT1NUIGFuZCBDRkxBR1NfRk9SX0hPU1QgdG8gcnVudGVzdC4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIG5ldyBmaWVsZCBlbWJlZGRlZF9yZWxvY3MuCi0JKiBsZGVtdWwuaCAobGRlbXVsX2FmdGVyX29wZW4sIGFmdGVyX29wZW5fZGVmYXVsdCk6IERlY2xhcmUuCi0JKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBuZXcgZmllbGQgYWZ0ZXJfb3Blbi4KLQkqIGxkZW11bC5jIChsZGVtdWxfYWZ0ZXJfb3Blbik6IE5ldyBmdW5jdGlvbi4KLQkoYWZ0ZXJfb3Blbl9kZWZhdWx0KTogTmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IENhbGwgbGRlbXVsX2FmdGVyX29wZW4uCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtLWVtYmVkZGVkLXJlbG9jcy4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogSW5pdGlhbGl6ZQotCW5ldyBhZnRlcl9vcGVuIGZpZWxkIHRvIGFmdGVyX29wZW5fZGVmYXVsdC4KLQkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtLCBlbXVsdGVtcGwvZ2xkOTYwLmVtOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9nbGQ5NjBjLmVtLCBlbXVsdGVtcGwvaHBwYWVsZi5lbTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvbGludXguZW0sIGVtdWx0ZW1wbC9tODhrYmNzLmVtOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSwgZW11bHRlbXBsL3ZhbmlsbGEuZW06IExpa2V3aXNlLgotCSogbGQudGV4aW5mbywgbGQuMTogTWVudGlvbiAtZW1iZWRkZWQtcmVsb2NzLgotCi1XZWQgTm92IDIzIDIyOjA0OjQ3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZXNobC5vLgotCSogY29uZmlnL2NvZmYtc2gubXQ6IEFkZCBzaGwgZW11bGF0aW9uLgotCi1UdWUgTm92IDIyIDExOjU1OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBGaWxsIC50ZXh0IHNlY3Rpb24gd2l0aCBOT1BTLiAgRnJvbSBFcmljCi0JWW91bmdkYWxlIDxlcmljQGFpYi5jb20+LgotCi1UaHUgTm92IDE3IDE0OjM5OjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCVBhdGNoZXMgZnJvbSBwaXJrZXJAZWl1bml4LnR1d2llbi5hYy5hdCAoTWFydGluIFBpcmtlcikuCi0JKiBjb25maWcvaTM4NmxpbnV4Lm1oOiBOZXcgZmlsZTsgc2V0IEhPU1RJTkdfQ1JUMC4KLQkqIGdlbnNjcmlwdHMuc2g6IERvbid0IHB1dCAke2xpYmRpcn0gaW4gTElCX1BBVEggaWYgaXQgaXMKLQkvdXNyL2xpYiwgc2luY2UgdGhhdCBpcyBhbHJlYWR5IGluIExJQl9QQVRILgotCi1XZWQgTm92IDE2IDEwOjAzOjAzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjICgudGV4dCk6IEhhbmRsZSBhIHVzZSByZGVmaW5lZCB0ZXh0IHN0YXJ0Ci0JYWRkcmVzcy4KLQkoLmRhdGEsIC5ic3MpOiBJZiAiLU4iLCB0aGVuIHBsYWNlIHRoZSBkYXRhL2JzcyBqdXN0IGFmdGVyIHRoZSBlbmQKLQlvZiB0aGUgLnRleHQgc2VjdGlvbiByYXRoZXIgdGhhbiBhdCB0aGUgZGVmYXVsdCAweDQwMDAwMDAwLgotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjICgudGV4dCk6IFBsYWNlIHVud2luZCBkZXNjcmlwdG9ycyBpbiB0aGUKLQl0ZXh0IHNlZ21lbnQuCi0KLVNhdCBOb3YgMTIgMTU6NTU6NTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JUGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFpYi5jb20+OgotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogRG9uJ3Qgd2FybiBpZiBlbnRyeSBzeW1ib2wgbm90IGZvdW5kCi0Jd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFdhcm4gaWYKLQlhdHRlbXB0aW5nIHRvIHBsYWNlIGFuIG9ycGhhbmVkIHJlbG9jYXRpb24gc2VjdGlvbiB3aGVuIGdlbmVyYXRpbmcKLQlhIGR5bmFtaWNhbGx5IGxpbmtlZCBvYmplY3QuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIEVOVFJZKCR7RU5UUll9KSwgYW5kIGRlZmF1bHQgJHtFTlRSWX0gdG8KLQlfc3RhcnQuCi0KLUZyaSBOb3YgMTEgMTQ6Mjc6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZmllbGQgZXhwb3J0X2R5bmFtaWMuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtLWV4cG9ydC1keW5hbWljLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUGFzcyBleHBvcnRfZHluYW1pYyBhcmd1bWVudCB0byBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCi1XZWQgTm92ICA5IDEyOjQ3OjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IFNldCBTRUNfQUxMT0MgaW4gYW55IHNlY3Rpb24gd2hlcmUKLQl3ZSBhbGxvY2F0ZSBjb21tb24gc3ltYm9scy4KLQotVHVlIE5vdiAgOCAxNzo1MDo0MyAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWNAYWliLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgLnJlbC5pbml0LCAucmVsYS5pbml0LCAucmVsLmZpbmksIGFuZAotCS5yZWxhLmZpbmkgdG8gdGhlIGxpc3Qgb2YgLnJlbCogc2VjdGlvbnMuCi0KLVR1ZSBOb3YgIDggMTc6NDc6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogQWRkIG5ldyBhcmd1bWVudCBwbGFjZS4gIE9ubHkgYWNjZXB0Ci0JbGlua2VyIHNjcmlwdHMgaWYgcGxhY2UgaXMgbm90IE5VTEwuICBQdXQgY29tbWFuZHMgZm91bmQgaW4gYW4KLQlhc3N1bWVkIGxpbmtlciBzY3JpcHQgaW50byBwbGFjZS4KLQkobG9va3VwX25hbWUpOiBQYXNzIE5VTEwgYXMgcGxhY2UgYXJndW1lbnQgdG8gbG9hZF9zeW1ib2xzLgotCShvcGVuX2lucHV0X2JmZHMpOiBJbiBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtIGNhc2UsIHBhc3MgYSBwbGFjZQotCWFyZ3VtZW50IHRvIGxvYWRfc3ltYm9scywgYW5kIHN0b3JlIGFueSBuZXcgc3RhdGVtZW50cyBhZnRlciB0aGUKLQljdXJyZW50IG9uZS4KLQotTW9uIE5vdiAgNyAxNTo1MzowMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBCdW1wIHRvIDIuNS4zLgotCi1GcmkgTm92ICA0IDE1OjExOjI2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlKm5ic2QuYyk6IEZpeCB0eXBvIGluIGRlcGVuZGVuY2llcy4KLQotVGh1IE5vdiAgMyAxOTozNTo0NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBBZGQgbWlzc2luZyAiZWxzZSB0cnVlIiBjbGF1c2UuCi0KLQkqIGVtdWxwYXJhbXMvdmF4LnNoIChPVVRQVVRfRk9STUFUKTogVXNlICJhLm91dCIuCi0KLQkqIHNjcmlwdHRlbXBsL2dvMzJjb2ZmLnNjOiBDaGFuZ2VzIGZyb20gREogRGVsb3JpZTogQ2hhbmdlIGRlZmF1bHQKLQllbnRyeSBwb2ludCB0byAic3RhcnQiLiAgQWxpZ24gYXQgZW5kIG9mIGVhY2ggc2VjdGlvbiB0byAweDIwMC4KLQlTdGFydCAudGV4dCBzZWN0aW9uIDB4MTAwMCBsYXRlci4gIEFkZCBfZXRleHQsIF9lZGF0YSwgX2VuZAotCXN5bWJvbHMuCi0KLVdlZCBOb3YgIDIgMTI6MTc6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBEb24ndCBwZXJtaXQgYSBzZXQgdG8gYmUKLQljb21wb3NlZCBvZiBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQkobGRjdG9yX2J1aWxkX3NldHMpOiBJZiB0aGUgb3V0cHV0IGZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IHRoZQotCXJlbG9jLCBhbmQgd2UgYXJlIG5vdCBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRyeSBnZXR0aW5nCi0JdGhlIHJlbG9jIGZyb20gdGhlIGlucHV0IGZvcm1hdC4KLQotVHVlIE5vdiAgMSAxMDozMDoxOSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtNjhrbmJzZC5vLgotCSAgKGVtNjhrbmJzZC5jKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlnL202OGstbmJzZC5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL202OGtuYnNkLnNoOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki0qLW5ldGJzZCopOiBVc2UgYWJvdmUgY29uZmlncy4KLQotTW9uIE9jdCAzMSAxOTozNToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IElmIHdlIGZpbmQgYW4KLQlhcHByb3ByaWF0ZWx5IG5hbWVkIHN0YXRpYyBsaWJyYXJ5LCBzdG9wIHRoZSBzZWFyY2ggYXQgdGhhdAotCWRpcmVjdG9yeS4KLQotV2VkIE9jdCAyNiAxMzo1OToxMiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVpMzg2bmJzZC5vLCBlbnMzMmtuYnNkLm8KLQkgIGFuZCBlc3BhcmNuYnNkLm87IHNvcnRlZCBlbnRyaWVzLgotICAgICAgICAgIChlaTM4Nm5ic2QuYyxlbnMzMmtuYnNkLmMsZXNwYXJjbmJzZC5jKTogTmV3IHRhcmdldHMuCi0KLQkqIGNvbmZpZy9uZXRic2Q1MzIubXQ6IFJlbW92ZWQuCi0JKiBlbXVscGFyYW1zL25ldGJzZDUzMi5zaDogUmVtb3ZlZC4KLQotCSogY29uZmlnL3tpMzg2LW5ic2QubXQsbnMzMmstbmJzZC5tdCxzcGFyYy1uYnNkLm10fTogTmV3IGZpbGVzLgotCSogZW11bHBhcmFtcy97aTM4Nm5ic2Quc2gsbnMzMmtuYnNkLnNoLHNwYXJjbmJzZC5zaH06IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1uZXRic2QqLCBuczMyay1wYzUzMi1uZXRic2QqLAotCSAgc3BhcmMqLSotbmV0YnNkKik6IFVzZSBhYm92ZSBjb25maWdzLgotCi1UdWUgT2N0IDI1IDExOjQ3OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG11bHRpcGxlX2NvbW1vbik6IE9uZSBvZiB0aGUgdHlwZXMgbWF5IG5vdyBiZQotCWJmZF9saW5rX2hhc2hfaW5kaXJlY3QuICBUaGUgb2xkIEJGRCBhcmd1bWVudCBtYXkgYmUgTlVMTC4KLQotVGh1IE9jdCAyMCAyMjowMTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkICogYXQgdGhlIGVuZCBvZiBtNjhrLWhwLWhwdXguCi0KLVR1ZSBPY3QgMTggMTU6NTg6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZGxleC5sOiBDYXN0IGFzc2lnbm1lbnQgdG8geXlfY2hfYnVmIGZpZWxkIHRvIGNoYXIgKiwgbm90IHRvCi0JWVlfQ0hBUiAqLgotCi1Nb24gT2N0IDE3IDE0OjUzOjE2IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvbncuc2M6IEdhdGhlciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFuZAotCSAgZGVmaW5lIF9fQ1RPUl9fTElTVF9fIGFuZCBfX0RUT1JfTElTVF9fIGFwcHJvcHJpYXRlbHkuCi0KLUZyaSBPY3QgMTQgMTQ6MzU6MzggMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWkzODZudy5vIGFuZCBlcHBjbncuby4KLQkgIChlaTM4Nm53LmMsIGVwcGNudy5jKTogTmV3IHRhcmdldHMuCi0KLQkqIGNvbmZpZy97aTM4NixwcGN9LW53Lm10LCBlbXVscGFyYW1zL3tpMzg2LHBwY31udy5zaCwKLQkgIHNjcmlwdHRlbXBsL253LnNjOiBOZXcgZmlsZXMsIGZvciBpMzg2IGFuZCBwb3dlcnBjIG5ldHdhcmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlZCBuZXR3YXJlIGxkX3RhcmdldCBuYW1lIHRvIGJlIHtpMzg2LHBwY30tbncKLQkgIGluc3RlYWQgb2Yge2kzODYscHBjfS1lbGYuCi0KLSAJKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLW5ldHdhcmUpOiBSZW1vdmVkLiAgVGhlcmUgaXMgbm8gc3VjaAotCSAgdGhpbmcgYW55bW9yZS4KLQotCSogbGRpbnQudGV4aW5mbzogTW92ZSBtaXNwbGFjZWQgYEBlbmQgaWZ0ZXgnLgotCi1GcmkgT2N0IDE0IDEyOjAyOjE4IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY0BhaWIuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCAucmVsLmN0b3JzLCAucmVsYS5jdG9ycywgLnJlbC5kdG9ycywgYW5kCi0JLnJlbGEuZHRvcnMgdG8gdGhlIGxpc3Qgb2YgLnJlbCogc2VjdGlvbnMuCi0KLVRodSBPY3QgMTMgMTQ6MTY6MjcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogVXBkYXRlIHRvIHZlcnNpb24gMi41LgotCSogVmVyc2lvbiAyLjUgcmVsZWFzZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxsX3RhcmdldHMpOiBIYW5kbGUgaTM4Ni1saW51eCouCi0KLVRodSBPY3QgMTMgMTE6MjQ6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBTZXQgX2V0ZXh0IGFuZCBfX2V0ZXh0IHRvIC4sIG5vdAotCSR7REFUQV9BTElHTk1FTlR9LiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggU3VuT1MsIGFuZCwgd2l0aCBsdWNrLAotCXdpbGwgbm90IGJyZWFrIGFueSBvdGhlciBzeXN0ZW0uICBGcm9tIEVyaWMgVmFsZXR0ZQotCTxldkBjaG9ydXMuZnI+LgotCi1XZWQgT2N0IDEyIDE2OjIyOjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBDaGFuZ2UgLVYgdG8gYmUgYSBzeW5vbnltIGZvciAtdi4gIEFkZAotCS0tdmVyYm9zZSB0byBnZXQgdGhlIG9sZCAtViBiZWhhdmlvdXIuCi0JKiBsZC4xLCBsZC50ZXhpbmZvOiBEb2N1bWVudCB0aGlzIGNoYW5nZS4KLQotVHVlIFNlcCAyNyAxNDo1NjoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUmVtb3ZlCi0JYXNzZXJ0aW9uLCBzaW5jZSBpdCBjb3VsZCBmYWlsIHdpdGggYSB1c2VyIGRlZmluZWQgbGlua2VyIHNjcmlwdC4KLQotCSogbGRleHAuYyAoZm9sZF9uYW1lKTogRm9yIERFRklORUQgY2FzZSwgZG9uJ3QgdHJ5IHRvIGxvb2sgdXAgdGhlCi0JbmFtZSBpbiB0aGUgaGFzaCB0YWJsZSBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLS10aGUgaGFzaCB0YWJsZSBkb2VzCi0Jbm90IGV2ZW4gZXhpc3QgYXQgdGhhdCBwb2ludCwgbXVjaCBsZXNzIGhhdmUgdGhlIHJpZ2h0IHZhbHVlLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0MpOiBEZWZpbmUuCi0JKENYWCk6IE1vdmUgZGVmaW5pdGlvbiwgY2hhbmdlIGZyb20gZysrIHRvIGdjYy4KLQkoRVhQRUNULCBSVU5URVNUKTogQ29weSBkZWZpbml0aW9ucyBmcm9tIHRvcCBsZXZlbCBNYWtlZmlsZS5pbi4KLQkoUlVOVEVTVF9DQywgUlVOVEVTVF9DRkxBR1MpOiBSZW1vdmUuCi0JKFJVTlRFU1RfQ1hYLCBSVU5URVNUX0NYWEZMQUdTKTogUmVtb3ZlLgotCShDQ19GT1JfVEFSR0VULCBDWFhfRk9SX1RBUkdFVCk6IENvcHkgZnJvbSB0b3AgbGV2ZWwgTWFrZWZpbGUuaW4uCi0JKC5jYy5vKTogQ29tbWVudCBvdXQuCi0JKHRlc3RkaXIpOiBSZW1vdmUuCi0JKHNpdGUuZXhwKTogRG9uJ3QgY3JlYXRlIHRlc3RkaXIgb3Igc2V0IHRtcGRpci4KLQkoY2hlY2spOiBSdW4gY2hlY2tzIGV2ZW4gaWYgbm90IHJ1bm5pbmcgbmF0aXZlLiAgVXNlIENDX0ZPUl9UQVJHRVQKLQlpbnN0ZWFkIG9mIFJVTlRFU1RfQ0MsIGFuZCBsaWtld2lzZSBmb3IgQ1hYLgotCShjZHRlc3QgdGFyZ2V0cyk6IENvbW1lbnQgb3V0LgotCSogY29uZmlnL3NvbGFyaXMyLm1oIChIT1NUSU5HX0xJQlMpOiBPbmx5IG1lbnRpb24gY3J0ZW5kLm8gb25jZS4KLQkqIGNkdGVzdC1iYXIuY2MsIGNkdGVzdC1mb28uY2MsIGNkdGVzdC1mb28uaDogUmVtb3ZlLgotCSogY2R0ZXN0LW1haW4uY2MsIGNkdGVzdC5leHA6IFJlbW92ZS4KLQotTW9uIFNlcCAyNiAxMTo0MDozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoOiBSZW5hbWUgZnJvbSBlbGYzMm1pcGIuc2ggdG8gYXZvaWQgRE9TCi0JZmlsZSBuYW1pbmcgcHJvYmxlbXMuCi0JKiBlbXVscGFyYW1zL2VsZjMybG1pcC5zaDogUmVuYW1lIGZyb20gZWxmMzJtaXBsLnNoLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogUmVuYW1lIGVlbGYzMm1pcGIubyB0bwotCWVlbGYzMmJtaXAubyBhbmQgZWVsZjMybWlwbC5vIHRvIGVlbGYzMmxtaXAuby4KLQkoZWVsZjMyYm1pcC5jKTogUmVuYW1lIGZyb20gZWVsZjMybWlwYi5jLiAgVXNlIGVsZjMyYm1pcC5zaC4KLQkoZWVsZjMybG1pcC5jKTogUmVuYW1lIGZyb20gZWVsZjMybWlwbC5jLiAgVXNlIGVsZjMybG1pcC5zaC4KLQkqIGNvbmZpZy9taXBzYi1lbGYzMi5tdCAoRU1VTCk6IFVzZSBlbGYzMmJtaXAsIG5vdCBlbGYzMm1pcGIuCi0JKiBjb25maWcvbWlwc2wtZWxmMzIubXQgKEVNVUwpOiBVc2UgZWxmMzJsbWlwLCBub3QgZWxmMzJtaXBsLgotCi0JKiBnZW5zY3JpcHRzLnNoOiBBbHdheXMgc2VhcmNoIC91c3IvbG9jYWwvVEFSR0VUL2xpYi4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBJZiAtTiBpcyBzZXQsIGZvcmNlIERBVEFfQUREUiB0byBiZSAiLiIuCi0KLUZyaSBTZXAgMjMgMTU6MDU6NDkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgaTM4Ni1ic2RpKiB0YXJnZXRzIGxpa2UgaTM4Ni1ic2QuCi0KLUZyaSBTZXAgMjMgMDA6MDY6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCBzdXBwb3J0IGZvciAtYSBmb3IgSFAvVVgKLQljb21wYXRpYmlsaXR5LgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IC1jIHRha2VzIGFuIGFyZ3VtZW50LgotCi1UdWUgU2VwIDIwIDE0OjM1OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIG5ldyBmaWVsZCBlbmRpYW4uCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtRUIgYW5kIC1FTCBieSBzZXR0aW5nCi0JY29tbWFuZF9saW5lLmVuZGlhbi4KLQkqIGxkZ3JhbS55IChpZmlsZV9wMSk6IEFjY2VwdCBPVVRQVVRfRk9STUFUIHdpdGggdGhyZWUgYXJndW1lbnRzLgotCSogbGRsYW5nLmMgKGxhbmdfYWRkX291dHB1dF9mb3JtYXQpOiBBZGQgYXJndW1lbnRzIGJpZyBhbmQgbGl0dGxlLgotCUlmIGNvbW1hbmRfbGluZS5lbmRpYW4gaXMgc2V0LCB1c2UgaXQgdG8gc2VsZWN0IGJpZyBvciBsaXR0bGUKLQlyYXRoZXIgdGhhbiB0aGUgZGVmYXVsdC4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKiBsZGxhbmcuaCAobGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnNoOiBEZWZpbmUgQklHX09VVFBVVF9GT1JNQVQgYW5kCi0JTElUVExFX09VVFBVVF9GT1JNQVQuCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwbC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL21pcHNiaWcuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9taXBzYnNkLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2lkdC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL21pcHNpZHRsLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2xpdC5zaDogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IERlZmluZSBCSUdfT1VUUFVUX0ZPUk1BVCBhbmQKLQlMSVRUTEVfT1VUUFVUX0ZPUk1BVCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgUGFzcyB0aGVtIHRvCi0JT1VUUFVUX0ZPUk1BVC4KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFBhc3MgQklHX09VVFBVVF9GT1JNQVQgYW5kCi0JTElUVExFX09VVFBVVF9GT1JNQVQgdG8gT1VUUFVUX0ZPUk1BVC4KLQkqIHNjcmlwdHRlbXBsL21pcHNic2Quc2M6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbiAobGRncmFtLmgpOiBNYWtlIHNlcGFyYXRlIHRhcmdldCBmcm9tIGxkZ3JhbS5jLAotCWRlcGVuZGluZyB1cG9uIGxkZ3JhbS5jLCBzbyB0aGF0IGEgcGFyYWxsZWwgbWFrZSBkb2VzIG5vdCB0cnkgdG8KLQlidWlsZCBib3RoIGF0IG9uY2UuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyplbC1lbGYqKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZWxmMzJtaXBiLm8gYW5kIGVlbGYzMm1pcGwuby4KLQkoZWVsZjMybWlwbC5jKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlnL21pcHNsLWVsZjMyLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBsLnNoOiBOZXcgZmlsZS4KLQotRnJpIFNlcCAxNiAxMjoxNjoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChtYWluKTogUmF0aGVyIHRoYW4gcHJvaGliaXRpbmcgbGQgLXIgLXMsIHRyZWF0IGl0IGFzCi0JbGQgLXIgLVMgLXguCi0KLVRodSBTZXAgMTUgMTM6MDU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogUHJpbnQgQkZEIGZpbGUgbmFtZSBhcyB3ZWxsIGFzIGZpbGUgbmFtZQotCXJldHVybmVkIGJ5IGZpbmRfbmVhcmVzdF9saW5lLCBpbiBjYXNlIHRoZSBmaWxlIG5hbWUgaXMgc29tZXRoaW5nCi0JdW5oZWxwZnVsIHN1Y2ggYXMgYSAuaCBmaWxlLiAgSGFuZGxlICV1LgotCi1XZWQgU2VwIDE0IDEyOjQ5OjEyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTWFrZSBzdXJlIG91dHB1dCBzdGF0ZW1lbnQKLQloYXMgYW4gYXR0YWNoZWQgYmZkX3NlY3Rpb24gYmVmb3JlIHRyeWluZyB0byBkZXJlZmVyZW5jZSBpdC4KLQotV2VkIFNlcCAxNCAxMjo0ODowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIG5ldyBmaWVsZCB3YXJuX29uY2UuCi0JKiBsZG1haW4uYyAodW5kZWZpbmVkX3N5bWJvbCk6IEhhbmRsZSAtd2Fybi1vbmNlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLXdhcm4tb25jZS4KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBEb2N1bWVudCAtd2Fybi1vbmNlLgotCSogbGQuMTogTGlrZXdpc2UuCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBIYW5kbGUgJUQgYXMgJUMsIGJ1dCBuZXZlciBwcmludCB0aGUgZnVuY3Rpb24KLQluYW1lLiAgRm9yICVDLCBwcmludCB0aGUgZnVuY3Rpb24gbmFtZSBvbiBhIHNlcGFyYXRlIGxpbmUsIHRvIGtlZXAKLQl0aGUgbGVuZ3RoIG9mIGVycm9yIG1lc3NhZ2VzIHVuZGVyIGNvbnRyb2wuCi0JKiBsZG1haW4uYyAobXVsdGlwbGVfZGVmaW5pdGlvbik6IFVzZSAlRCBmb3IgYGBmaXJzdCBkZWZpbmVkCi0JaGVyZS4nJwotCSh1bmRlZmluZWRfc3ltYm9sKTogVXNlICVEIGZvciBgYG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMKLQlmb2xsb3cnJy4KLQotCSogbGRtaXNjLmMgKG11bHRpcGxlX3dhcm4pOiBSZW1vdmU7IG5vIGxvbmdlciB1c2VkLgotCSogbGRtaXNjLmggKG11bHRpcGxlX3dhcm4pOiBEb24ndCBkZWNsYXJlLgotCi1UdWUgU2VwIDEzIDIwOjQ3OjU4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBQcmludCBhbGwgbGluZXMKLQl0byB0aGUgbWFwIGZpbGUuCi0KLVR1ZSBTZXAgMTMgMTY6MzA6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogQ2hlY2sgZm9yIGFyY2hpdmUgYmVmb3JlIG9iamVjdC4gIFVzZQotCWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcywgYW5kLCBpZiBhbWJpZ3VvdXMsIHByaW50IGEgbGlzdCBvZgotCW1hdGNoaW5nIGZvcm1hdHMuICBJZiBmaWxlIGZvcm1hdCBpcyBub3QgcmVjb2duaXplZCwgdHJlYXQgZmlsZSBhcwotCWEgbGlua2VyIHNjcmlwdC4KLQkqIGxkZ3JhbS55ICh5eWVycm9yKTogSWYgYXNzdW1pbmcgYW4gb2JqZWN0IGZpbGUgaXMgYSBzY3JpcHQsCi0JbWVudGlvbiB0aGF0LiAgVHdlYWsgdGhlIGZvcm1hdCBvZiB0aGUgZXJyb3IgbWVzc2FnZXMuCi0JKiBsZGxleC5sIChsZXhfd2Fybl9pbnZhbGlkKTogSWYgYXNzdW1pbmcgYW4gb2JqZWN0IGlzIGEgc2NyaXB0LAotCWd1ZXNzIHRoYXQgdGhpcyBpcyBub3QgYWN0dWFsbHkgYSBzY3JpcHQsIGFuZCBqdXN0IHJlcG9ydCB0aGF0IHRoZQotCWZpbGUgZm9ybWF0IHdhcyBub3QgcmVjb2duaXplZC4KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBBZG1pdCB0aGF0IC0oIG1heSBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlLgotCUFkZCBub3RlIHRoYXQgdW5yZWNvZ25pemVkIG9iamVjdCBmaWxlcyBhcmUgbm93IHRyZWF0ZWQgYXMgbGlua2VyCi0Jc2NyaXB0cy4KLQotCSogbGRmaWxlLmMgKGxkZmlsZV9pbnB1dF9maWxlbmFtZSk6IE1ha2UgY29uc3QuCi0JKGxkZmlsZV9hc3N1bWVkX3NjcmlwdCk6IE5ldyB2YXJpYWJsZS4KLQkodHJ5X29wZW4pOiBDaGFuZ2UgYXJndW1lbnRzIHR5cGVzIHRvIGNvbnN0LgotCShsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUpOiBMaWtld2lzZS4KLQkobGRmaWxlX29wZW5fY29tbWFuZF9maWxlKTogTGlrZXdpc2UuICBBbHNvLCBzZXQgbGluZW5vIHRvIDEuCi0JKiBsZGZpbGUuaDogVXBkYXRlIGRlY2xhcmF0aW9ucyBmb3IgbGRmaWxlLmMgY2hhbmdlcy4KLQkqIGxkbGV4Lmw6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShmaWxlX25hbWVfc3RhY2spOiBDaGFuZ2UgdG8gYmUgY29uc3QgY2hhciAqLgotCShsaW5lbm9fc3RhY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSg8PEVPRj4+KTogU2V0IGxpbmVubyBhcyB3ZWxsIGFzIGxkZmlsZV9pbnB1dF9maWxlbmFtZS4KLQkobGV4X3B1c2hfZmlsZSk6IE1ha2UgbmFtZSBhcmd1bWVudCBjb25zdC4gIEluaXRpYWxpemUKLQlsaW5lbm9fc3RhY2sgZW50cnkuCi0JKGxleF9yZWRpcmVjdCk6IEluaXRpYWxpemUgbGluZW5vX3N0YWNrIGVudHJ5LgotCShsZXhfd2Fybl9pbnZhbGlkKTogSGFuZGxlIG5vbiBwcmludGFibGUgY2hhcmFjdGVycyBuaWNlbHkuCi0JKiBsZGxleC5oIChsZXhfcHVzaF9maWxlKTogRGVjbGFyZSBzZWNvbmQgYXJndW1lbnQgYXMgY29uc3QuCi0KLQkqIGxkZ3JhbS55IChpZmlsZV9wMSk6IFJlY29nbml6ZSBHUk9VUC4KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBHUk9VUC4KLQkqIGxkLnRleGluZm8gKE9wdGlvbiBDb21tYW5kcyk6IERvY3VtZW50IEdST1VQLgotCi1Nb24gU2VwIDEyIDE3OjA0OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL202OGtseW54Lm1oOiBOZXcgZmlsZS4KLQotTW9uIFNlcCAxMiAwMTo1MDowMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IEFkZCBuZXdsaW5lcyB0byB0aGUgZXJyb3IgbWVzc2FnZXMuCi0KLVNhdCBTZXAgMTAgMTY6MDU6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaTM4Nmx5bngubWg6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2M6IERvbid0IHB1dCAuY3RvcnMgYW5kIC5kdG9ycyBpbiAudGV4dAotCXVubGVzcyBDT05TVFJVQ1RJTkcuCi0KLVRodSBTZXAgIDggMTM6MjU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBlbGYzMi4KLQkoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lIGFzIHllcy4KLQkoRFlOQU1JQ19MSU5LKTogRGVmaW5lIGFzIGZhbHNlLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOgotCUluaXRpYWxpemUgY29uZmlnLmR5bmFtaWNfbGluayB0byBEWU5BTUlDX0xJTksgaWYgaXQgaXMgZGVmaW5lZC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUmVzZXQgc3RhdF9wdHIgYXQgZW5kLgotCSogTWFrZWZpbGUuaW4gKGVlbGYzMm1pcGIuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtIHJhdGhlciB0aGFuCi0JZ2VuZXJpYy5lbS4KLQotVGh1IFNlcCAgOCAxNjozMDozNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0gICAgICAgICogc2NyaXB0dGVtcGwvaDg1MDBiLnNjOiBQdXQgcmRhdGEgc3R1ZmYgaW50byBvd24gc2VnbWVudC4KLQotVGh1IFNlcCAgOCAxMzoyNToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IERvbid0IGRlZmluZTsKLQkuZ290IHNlY3Rpb24gaXMgbm93IGV4cGxpY2l0bHkgaGFuZGxlZCBpbiBlbGYuc2MuCi0KLVdlZCBTZXAgIDcgMTM6MDg6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogUmVkbyBzY3JpcHQgdG8gc2V0IC4gb3V0c2lkZSBvZiBzZWN0aW9ucwotCWFuZCBub3QgYm90aGVyIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSBzZWN0aW9uIGFkZHJlc3Nlcy4KLQlFeHBsaWNpdGx5IHBsYWNlIC5zZGF0YSBzZWN0aW9uLgotCi1UdWUgU2VwICA2IDIzOjUxOjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2M6IFB1dCAuYnNzIGluIGRhdGEgc2VnbWVudC4KLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IENoYW5nZSAuc3RhYiBhbmQgLnN0YWJzdHIgdG8gdXNlIGEgVk1BIG9mCi0JMCwgYW5kIHRvIG9ubHkgYmUgbWFya2VkIGFzIE5PTE9BRCBpZiByZWxvY2F0aW5nLgotCSogc2NyaXB0dGVtcGwvaDg1MDAuc2MsIHNjcmlwdHRlbXBsL2g4NTAwYi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9oODUwMGMuc2MsIHNjcmlwdHRlbXBsL2g4NTAwbS5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9oODUwMHMuc2MsIHNjcmlwdHRlbXBsL2kzODZjb2ZmLnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjLCBzY3JpcHR0ZW1wbC9pMzg2bHlueC5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYywgc2NyaXB0dGVtcGwvbTY4a2x5bnguc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvc2guc2MsIHNjcmlwdHRlbXBsL3NwYXJjY29mZi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2M6IExpa2V3aXNlLgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IChkaXNhYmxlZCkgdGhlIEFSTS9SSVNDaVguCi0JKiBjb25maWcvcmlzY2l4Lm10LCBlbXVscGFyYW1zL3Jpc2NpeC5zaCwgc2NyaXB0dGVtcGwvcmlzY2l4LnNjOgotCU5ldyBmaWxlcy4KLQotVHVlIEF1ZyAzMCAxMTo0ODowOCAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBmaWVsZCBzb25hbWUuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtc29uYW1lIGFyZ3VtZW50LgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBJbiBjYWxsIHRvIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCi0JcGFzcyBzb25hbWUuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCAtc29uYW1lLgotCi1Nb24gQXVnIDI5IDE1OjIxOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiBEb24ndCB0cnkgdG8gc2V0IHRoZSBhcmNoaXRlY3R1cmUgaWYgdGhlCi0JaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBhcmUgaW5jb21wYXRpYmxlLiAgSnVzdCB3YXJuLgotCi1XZWQgQXVnIDI0IDEyOjUyOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KLQotU3VuIEF1ZyAyMSAxNjoxNzoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvaHAzaHB1eC5zaDogRGVmaW5lIF9fRFlOQU1JQyB0byBiZSAwLgotCi1UaHUgQXVnIDE4IDE1OjM3OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCU1ha2UgdGhlIEVMRiBsaW5rZXIgaGFuZGxlIG9ycGhhbmVkIHNlY3Rpb25zIHJlYXNvbmFibHkuICBBbHNvLAotCWRlZmluZSBfX3N0YXJ0X1NFQ05BTUUgYW5kIF9fc3RvcF9TRUNOQU1FIGFyb3VuZCBzZWN0aW9ucyB3aG9zZQotCW5hbWVzIGNhbiBiZSByZXByZXNlbnRlZCBpbiBDLCBmb3IgdGhlIGJlbmVmaXQgb2Ygc3ltYm9sIHNldHMgaW4KLQlnbGliYy4KLQkqIGxkZW11bC5oIChsZGVtdWxfcGxhY2Vfb3JwaGFuKTogRGVjbGFyZS4KLQkobGRfZW11bGF0aW9uX3hmZXJfdHlwZSk6IEFkZCBwbGFjZV9vcnBoYW4gZmllbGQuCi0JKiBsZGVtdWwuYyAobGRlbXVsX3BsYWNlX29ycGhhbik6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5oICh3aWxkX2RvaXQpOiBEZWNsYXJlLgotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IE1ha2Ugbm9uc3RhdGljLgotCShsYW5nX3BsYWNlX29ycGhhbnMpOiBDYWxsIGxkZW11bF9wbGFjZV9vcnBoYW4uCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IEluY2x1ZGUgPGN0eXBlLmg+IGFuZCAibGRncmFtLmgiLgotCShob2xkX3NlY3Rpb24sIGhvbGRfdXNlLCBob2xkX3RleHQsIGhvbGRfZGF0YSwgaG9sZF9ic3MpOiBOZXcKLQlzdGF0aWMgdmFyaWFibGVzLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogSW5pdGlhbGl6ZSBwbGFjZV9vcnBoYW4gZmllbGQuCi0KLVR1ZSBBdWcgMTYgMDA6MTc6MjAgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBBZGQgLmxpbnV4LWR5bmFtaWMgYWZ0ZXIgLmRhdGEuCi0KLVR1ZSBBdWcgMTYgMDA6MDg6MjIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncykgVHJlYXQgLS1kbGwtdmVyYm9zZSBhcyAtLXZlcnNpb24sIGZvcgotCUxpbnV4IGNvbXBhdGliaWxpdHkuICBGcm9tIGhqbEBueW5leHN0LmNvbSAoSC5KLiBMdSkuCi0KLU1vbiBBdWcgMTUgMTc6MTc6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZGV4cC5oIChleHBfZ2V0X2Fic19pbnQpOiBEZWNsYXJlLgotCi1TYXQgQXVnICA2IDAxOjQ1OjM5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2RvX2Fzc2lnbm1lbnRzKTogIEhhbmRsZSBjb21wbGV4IEFUJ3MgYmV0dGVyLgotCSogbGRleHAuYyAoZXhwX2dldF9hYnNfaW50KTogIE5ldyBmdW5jdGlvbi4KLQotRnJpIEF1ZyAgNSAyMDo1NTo1NSAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBpOTYwLW5pbmR5LWNvZmYgc3VwcG9ydC4KLQotVGh1IEF1ZyAgNCAxNDo0NTo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4LmwgKHl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyKTogSGFuZGxlIGNoYW5nZSB0byBpbnRlcm5hbAotCWludGVyZmFjZSBpbiBmbGV4IDIuNC43LgotCi1UdWUgQXVnICAyIDExOjUyOjA2IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogZW11bHRlbXBsL2xpbnV4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2FkZHJlc3Nfc3RhdGVtZW50KToKLQlOZXcgZnVuY3Rpb247IGFkZCAweDIwIHRvIGFueSB1c2Ugb2YgLVR0ZXh0LgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6IE5ldwotCWZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBVc2UgdGhlIG5ldyBmdW5jdGlvbgotCWdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzLgotCi1Nb24gQXVnICAxIDE1OjUwOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogUmVkbyBzY3JpcHQgdG8gc2V0IC4gb3V0c2lkZSBvZiBzZWN0aW9ucwotCWFuZCBub3QgYm90aGVyIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSBzZWN0aW9uIGFkZHJlc3Nlcy4KLQotVHVlIEp1bCAyNiAxMTowMjozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQ29weSBzZXZlcmFsIG1vcmUgcmVsb2NhdGlvbiBzZWN0aW9ucyBpbnRvCi0JdGhlIG91dHB1dC4gIFB1dCAuZ290LnBsdCBzZWN0aW9ucyBpbnRvIC5nb3QuCi0KLUZyaSBKdWwgMjIgMTI6MTU6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSBQUk9WSURFIHRvIGRlZmluZSBldGV4dCwgZWRhdGEsIGFuZCBlbmQuCi0KLQlBZGQgYSBuZXcgc2NyaXB0IG9wZXJhdG9yLCBQUk9WSURFLCB0byBkZWZpbmUgYSBzeW1ib2wgb25seSBpZiBpdAotCWlzIG5lZWRlZC4KLQkqIGxkZ3JhbS55IChQUk9WSURFKTogTmV3IHRva2VuLgotCShhc3NpZ25tZW50KTogQWNjZXB0IFBST1ZJREUuCi0JKiBsZGxleC5sIChQUk9WSURFKTogTmV3IHRva2VuLgotCSogbGRleHAuaCAobm9kZV90eXBlKTogQWRkIGV0cmVlX3Byb3ZpZGUgdG8gbm9kZV9jbGFzcyBlbnVtLgotCShleHBfcHJvdmlkZSk6IERlY2xhcmUuCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogSGFuZGxlIGV0cmVlX3Byb3ZpZGUuCi0JKGV4cF9wcm92aWRlKTogTmV3IGZ1bmN0aW9uLgotCShleHBfcHJpbnRfdHJlZSk6IEhhbmRsZSBldHJlZV9wcm92aWRlLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgUFJPVklERS4KLQotCSogbGRsYW5nLmMgKGxhbmdfY29tbW9uKTogUGFzcyBkZXNpcmVkIGFsaWdubWVudCB0bwotICAgICAgICBsYW5nX29uZV9jb21tb24gYXMgcG93ZXIgb2YgdHdvLgotCShsYW5nX29uZV9jb21tb24pOiBHZXQgY29tbW9uIHN5bWJvbCBhbGlnbm1lbnQgZnJvbSBsaW5rZXIgaGFzaAotCXRhYmxlIGVudHJ5LiAgVHJlYXQgZGVzaXJlZCBhbGlnbm1lbnQgYXMgYSBwb3dlciBvZiB0d28uCi0KLQkqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBBdHRhY2ggYWxsIHNlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwKLQlub3QganVzdCB0aGUgZmlyc3Qgb25lLiAgSWYgdGhlcmUgaXMgbm8gbmFtZSwgYXR0YWNoIGFsbCBzZWN0aW9ucwotCWV2ZW4gaWYgdGhlIFNFQ19JU19DT01NT04gZmxhZyBpcyBzZXQuCi0KLVdlZCBKdWwgMjAgMTU6NDk6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZmllbGQgcnBhdGguCi0JKiBsZXhzdXAuYyAoU19JU0RJUik6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShwYXJzZV9hcmdzKTogQWRkIHN1cHBvcnQgZm9yIC1ycGF0aC4gIElmIC1SIGlzIHVzZWQgdG8gbmFtZSBhCi0JZGlyZWN0b3J5LCB0cmVhdCBpdCBhcyAtcnBhdGggZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVBhc3MgY29tbWFuZF9saW5lLnJwYXRoIHRvIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgY29tbWFuZF9saW5lLnJwYXRoIHRvIE5VTEwuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCAtcnBhdGggb3B0aW9uLgotCi1TdW4gSnVsIDEwIDAwOjMzOjI0IDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBlbXVscGFyYW1zL3BjNTMybWFjaGFvdXQuc2g6IE5ldyBmaWxlLiBQYzUzMiBtYWNoIHNjcmlwdAotCXBhcmFtZXRlcnMuCi0KLQkqIGVtdWxwYXJhbXMvbmV0YnNkNTMyLnNoOiBOZXcgZmlsZS4gTmV0YnNkIDUzMiBzY3JpcHQgcGFyYW1ldGVycy4KLQotCSogY29uZmlnL3BjNTMybWFjaC5tdDogTmV3IGZpbGUuIFBjNTMyIG1hY2ggdGFyZ2V0IHN1cHBvcnQuCi0KLQkqIGNvbmZpZy9wYzUzMm1hY2gubWg6IE5ldyBmaWxlLiBQYzUzMiBtYWNoIGhvc3Qgc3VwcG9ydC4KLQotCSogY29uZmlnL25ldGJzZDUzMi5tdDogTmV3IGZpbGUuIE5ldGJzZCA1MzIgdGFyZ2V0IHN1cHBvcnQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG5zMzJrLXBjNTMyLW1hY2ggYW5kIG5zMzJrLXBjNTMyLW5ldGJzZCBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGVwY21hY2hhb3V0LmMgZGVwZW5kZW5jeSBhbmQgZW5ldGJzZDUzMi5jCi0JZGVwZW5kZW5jeS4KLQotRnJpIEp1bCAgOCAxMDo1NzowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBVc2UKLQliZmRfYWJzX3NlY3Rpb25fcHRyLCBub3QgJmJmZF9hYnNfc2VjdGlvbi4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBDaGFuZ2VkICJyZXRhaW4tc3ltYm9scy1maWxlIiBmcm9tCi0Jbm9fYXJndW1lbnQgdG8gcmVxdWlyZWRfYXJndW1lbnQuICBGcm9tIGRqbS4KLQotVGh1IEp1bCAgNyAxMjoyOTo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRXhwbGljaXRseSBtZW50aW9uIC5zdGFiIGFuZCAuc3RhYnN0cgotCXNlY3Rpb25zIHRvIGZvcmNlIGEgVk1BIG9mIDA7IG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUKLQlub3QgYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBsaW5rZXIgc3R5bGUuCi0KLU1vbiBKdWwgIDQgMTk6MzU6NDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2MgKF9fc3RhY2tfemVybyk6IERvbid0IGRlZmluZSB0aGlzIG5hbWUsCi0JaXQgd2FzIGZvciB0aGUgSFBVWCBkeW5hbWljIGxvYWRlcidzIHVzZSBhbmQgaXQgY3JlYXRlcyBwcm9ibGVtcwotCXdpdGggRUxGIEdEQi4KLQotRnJpIEp1bCAgMSAxMjo1Mzo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGRsYW5nLmMgKGxhbmdfZG9fYXNzaWdubWVudHMpOiBObyBsb25nZXIgc3RhdGljLiAgRGVsZXRlIGRlY2wuCi0JKiBsZGxhbmcuaCAobGFuZ19kb19hc3NpZ25tZW50cyk6IFB1dCBleHRlcm5hbCBkZWNsIGhlcmUuCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbTogTWlub3IgY2xlYW51cHMgdGhyb3VnaG91dCBmaWxlLgotCShocHBhX2VsZl9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6IFJld3JpdGUuCi0JKGhwcGFlbGZfZmluaXNoKTogUmV3cml0ZS4KLQotV2VkIEp1biAyOSAxNjo1MDowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCAoTkFUSVZFX0xJQl9ESVJTKTogRGVmaW5lIGFzIC91c3IvY2NzL2xpYi4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBY2NlcHQgLUJzdGF0aWMgYW5kIC1CZHluYW1pYy4gIERvIG5vdAotCWFjY2VwdCBwbGFpbiAtQi4KLQkqIGxkLnRleGluZm86IC1Cc3RhdGljIGlzIG5vdCBpZ25vcmVkLgotCi1UdWUgSnVuIDI4IDEyOjEzOjM0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogUmVjb2duaXplIFxyIHRoZSBzYW1lIGFzIFxuLgotCi1UaHUgSnVuIDIzIDE3OjUzOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgc2hhcmVkIGxpYnJhcmllcywgZnJvbSBFcmljCi0JWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGdlbnNjcmlwdHMuc2g6IElmIHRoZSBlbXVsYXRpb24gcGFyYW1ldGVyIGZpbGUgc2V0cwotICAgICAgICBHRU5FUkFURV9TSExJQl9TQ1JJUFQsIGdlbmVyYXRlIGEgLnhzIHNjcmlwdCBmaWxlIHdpdGgKLQlDUkVBVEVfU0hMSUIgZGVmaW5lZC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCk6IElmCi0JbGlua19pbmZvLnNoYXJlZCBpcyBzZXQsIHVzZSB0aGUgLnhzIHNjcmlwdCBmaWxlLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBJZiBDUkVBVEVfU0hMSUIgaXMgc2V0LCBkb24ndCBjcmVhdGUgYQotCS5pbnRlcnAgc2VjdGlvbiwgYW5kIGRvbid0IGluY2x1ZGUgVEVYVF9TVEFSVF9BRERSIGluIHRoZSBzdGFydGluZwotCWFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNlY3Rpb24uCi0JKiBlbXVscGFyYW1zL2VsZl9pMzg2LnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZS4KLQotVGh1IEp1biAyMyAxMjo1MjoyMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMuCi0KLVdlZCBKdW4gMjIgMTM6NDI6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCBzdXBwb3J0IGZvciBuZXcgb3B0aW9ucyAtKCAtKSB3aXRoCi0Jc3lub255bXMgLS1zdGFydC1ncm91cCAtLWVuZC1ncm91cC4KLQkqIGxkbGFuZy5oIChlbnVtIHN0YXRlbWVudF9lbnVtKTogQWRkIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW0uCi0JKGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGUpOiBEZWZpbmUgbmV3IHN0cnVjdC4KLQkobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSk6IEFkZCBncm91cF9zdGF0ZW1lbnQgZmllbGQuCi0JKGxhbmdfZW50ZXJfZ3JvdXAsIGxhbmdfbGVhdmVfZ3JvdXApOiBEZWNsYXJlLgotCSogbGRsYW5nLmMgKGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcik6IEhhbmRsZQotCWxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW0uCi0JKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMsIHByaW50X3N0YXRlbWVudCk6IExpa2V3aXNlLgotCShsYW5nX3NpemVfc2VjdGlvbnMsIGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZS4KLQkob3Blbl9pbnB1dF9iZmRzKTogQ29tcGxldGVseSByZXdyaXRlLiAgTm93IGRvZXMgaXRzIG93biBsb29waW5nLAotCXJhdGhlciB0aGFuIHVzaW5nIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSGFuZGxlIGdyb3Vwcy4KLQkobGFuZ19wcm9jZXNzKTogVXBkYXRlIGNhbGwgdG8gb3Blbl9pbnB1dF9iZmRzLgotCShwcmludF9ncm91cCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxhbmdfZW50ZXJfZ3JvdXAsIGxhbmdfbGVhdmVfZ3JvdXApOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9maWxlKTogSWYgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbgotCW9wZW5lZCwganVzdCByZXR1cm4gcmF0aGVyIHRoYW4gdGFraW5nIGFuIGFzc2VydGlvbiBmYWlsdXJlLgotCSogbGR2ZXIuYyAoaGVscCk6IE1lbnRpb24gbmV3IG9wdGlvbnMuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotCSogbGRsYW5nLmMgKGVuZF9vZl9kYXRhX3NlY3Rpb25fc3RhdGVtZW50X2xpc3QpOiBEb24ndCBkZWZpbmUuCi0JKGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogRG9uJ3Qgc2V0IG9ic29sZXRlIHZhcmlhYmxlCi0JZW5kX29mX2RhdGFfc2VjdGlvbl9zdGF0ZW1lbnRfbGlzdC4KLQotCSogc2NyaXB0dGVtcGwvZ28zMmNvZmYuc2M6IERvbid0IHB1dCAke0RBVEFfQUxJR05NRU5UfSBpbnNpZGUgYW4KLQlBTElHTi4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEFkanVzdCBjdXJyZW50IHJlZ2lvbiBhZGRyZXNzCi0JZXZlbiBmb3Igc2VjdGlvbnMgd2l0aCBhbiBleHBsaWNpdCBhZGRyZXNzLiAgRnJvbQotCXJhbHBoY0BweXJhbWlkLmNvbSAoUmFscGggQ2FtcGJlbGwpLgotCi0JKiBlbXVscGFyYW1zL2kzODZsaW51eC5zaCAoTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogU2V0IHRvIDAuCi0JRnJvbSBqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KS4KLQotCSogc2NyaXB0dGVtcGwvbWlwc2JzZC5zYzogTGV0IHNlY3Rpb25zIGFsaWduIHRvIHRoZWlyIG5hdHVyYWwKLQlib3VuZGFyaWVzLgotCi1UdWUgSnVuIDIxIDExOjI3OjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfaW5pdCk6IFVzZSBuZXcgYmZkX2Fic19zZWN0aW9uX3B0ciwgbm90Ci0JJmJmZF9hYnNfc2VjdGlvbi4KLQkobGFuZ19hYnNfc3ltYm9sX2F0X2JlZ2lubmluZ19vZik6IExpa2V3aXNlLgotCShsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mKTogTGlrZXdpc2UuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IFVzZSBiZmRfaXNfYWJzX3NlY3Rpb24gdG8gY2hlY2sgZm9yIHRoZQotCWFic29sdXRlIHNlY3Rpb24uICBEb24ndCB0cnkgdG8gc2V0IHRoZSBWTUEgb3Igb3V0cHV0X29mZnNldCBvcgotCXNpemUgb2YgdGhlIGFic29sdXRlIHNlY3Rpb24uCi0JKiBsZG1haW4uYyAobm90aWNlX3lzeW0pOiBVc2UgYmZkX2lzX3VuZF9zZWN0aW9uIHRvIGNoZWNrIGZvciB0aGUKLQl1bmRlZmluZWQgc2VjdGlvbi4KLQotVGh1IEp1biAxNiAyMjo0ODo0MSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYzogUGxhY2UgLmRhdGEgYW5kIC5ic3MgYXQgMHg0MDAwMDAwMAotCXdoZW4gZ2VuZXJhdGluZyByZWxvY2F0YWJsZSBvYmplY3RzLgotCi1UaHUgSnVuIDE2IDE0OjI1OjIyIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogZW11bHRlbXBsL2xpbnV4LmVtOiBOZXcgZmlsZSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgbGlua2luZwotCWFnYWluc3QgTGludXggc2hhcmVkIGxpYnJhcmllcy4KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChlaTM4NmxpbnV4LmMpOiBEZXBlbmQgdXBvbiBsaW51eC5lbS4KLQkqIGVtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGxpbnV4LgotCi1UaHUgSnVuIDE2IDEyOjIyOjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgLXNoYXJlZCB0byBsb25nb3B0cywgYW5kIGhhbmRsZSBpdC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBsaW5rX2luZm8uc2hhcmVkIHRvIGZhbHNlLiAgR2l2ZQotCWVycm9yIGlmIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgYW5kIGxpbmtfaW5mby5zaGFyZWQgYXJlIGJvdGggc2V0LgotCi0JKiBjb25maWd1cmUuaW46IElmIEVNVUxfRVhUUkEqIGlzIGRlZmluZWQgaW4gYSBjb25maWcgZmlsZSwgdHJlYXQKLQlpdCBhcyBuYW1pbmcgYW4gZW11bGF0aW9uIHRvIGJlIGFkZGVkIHRvIEVNVUxBVElPTl9PRklMRVMuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoRU1VTF9FWFRSQTEpOiBEZWZpbmUgYXMgZWxmX2kzODYuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWkzODZsaW51eC5vLCBlZWxmMzJfc3BhcmMubywKLQllZWxmNjRfc3BhcmMuby4gIFJlbW92ZSAkKE9USEVSX0VNVUxBVElPTlMpLgotCShlaTM4NmxpbnV4LmMsIGVlbGYzMl9zcGFyYy5jLCBlZWxmNjRfc3BhcmMuYyk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlnL2kzODYtbGludXgubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKGVpMzg2bGludXguYyk6IFJlbW92ZTsgbm93IGluIE1ha2VmaWxlLmluLgotCSogY29uZmlnL2kzODYtbHlueC5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9tNjhrLWx5bngubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvc3BhcmMtbHlueC5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9zcGFyYzY0LWVsZi5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IERvbid0IGRlZmluZS4KLQkoZWVsZjY0X3NwYXJjLmMpOiBSZW1vdmU7IG5vdyBpbiBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZy9zdW40c29sMi5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IERvbid0IGRlZmluZS4KLQkoZWVsZjMyX3NwYXJjLmMpOiBSZW1vdmU7IG5vdyBpbiBNYWtlZmlsZS5pbi4KLQotCSogbGRleHAuYyAoZXhwX3ByaW50X3RyZWUpOiBEb24ndCBjcmFzaCBpZiBldHJlZV9yZWwgc2VjdGlvbiBoYXMKLQlubyBvd25lci0taXQgbWlnaHQgYmUgYmZkX2Fic19zZWN0aW9uLiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogTGV0IHNlY3Rpb25zIGFsaWduIHRvIHRoZWlyIG5hdHVyYWwKLQlib3VuZGFyaWVzLgotCi1XZWQgSnVuIDE1IDAxOjU0OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRlbXVsLmggKGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6IERlY2xhcmUuCi0JKGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUpOiBBZGQgbmV3IGZpZWxkIG9wZW5fZHluYW1pY19hcmNoaXZlLgotCSogbGRlbXVsLmM6IEluY2x1ZGUgbGRleHAuaCBhbmQgbGRsYW5nLmguCi0JKGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkZmlsZS5oIChsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IERlY2xhcmUuCi0JKiBsZGZpbGUuYzogSW5jbHVkZSBsZGVtdWwuaC4KLQkodHJ5X29wZW5fYmZkKTogUmVuYW1lIGZyb20gY2FjaGVfYmZkX29wZW5yLiAgUmV0dXJuIGJvb2xlYW4KLQlhcmd1bWVudCwgbm90IGJmZCAqLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IFJlbmFtZSBmcm9tIG9wZW5fYS4gIFJldHVybiBib29sZWFuCi0JYXJndW1lbnQsIG5vdCBiZmQgKi4gIENsZWFuIHVwLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShsZGZpbGVfb3Blbl9maWxlKTogSWYgZG9pbmcgYSBkeW5hbWljIGxpbmssIGNhbGwKLQlsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhlIGV4dGVuc2lvbiBvZgotCWEgZHluYW1pYyBvYmplY3QgaXMgIi5zbyIuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKLQlOZXcgZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEluaXRpYWxpemUgb3Blbl9keW5hbWljX2FyY2hpdmUKLQlmaWVsZC4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uKTogSWdub3JlIC1tNDg2IGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBJZ25vcmUgLXFtYWdpYyBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KLQlBY2NlcHQgLXN0YXRpYyBhcyBhIHN5bm9ueW0gZm9yIC1ub25fc2hhcmVkLgotCi0JTGV0IHRoZSB1c2VyIGNoYW5nZSB0aGUgZHluYW1pYyBsaW5rZXIgdXNlZCBieSBFTEYgY29kZS4KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBuZXcgZmllbGQgaW50ZXJwcmV0ZXIuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCBkeW5hbWljLWxpbmtlciB0byBsb25nb3B0cywgYW5kCi0JaGFuZGxlIGl0LgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlciB0byBOVUxMLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEdldAotCXRoZSBFTEYgYmFja2VuZCB0byByZXR1cm4gdGhlIC5pbnRlcnAgc2VjdGlvbi4gIElmCi0JY29tbWFuZF9saW5lLmludGVycHJldGVyIGlzIG5vdCBOVUxMLCBzZXQgdGhlIGNvbnRlbnRzIG9mIC5pbnRlcnAKLQl0byBpdC4KLQkqIGxkLnRleGluZm86IE1lbnRpb24gLWR5bmFtaWMtbGlua2VyLgotCi0JKiBjb25maWcvc3VuNHNvbDIubXQgKGVlbGYzMl9zcGFyYy5jKTogRGVwZW5kIHVwb24gZWxmMzIuZW0sIG5vdAotCWdlbmVyaWMuZW0uCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogU29ydCBvdXQgdGhlIG9wdGlvbiBtYWNyb3MgYW5kIGNoYW5nZSB0aGUKLQlkZWZpbml0aW9ucyB0byBtYWtlIGl0IGVhc2llciB0byBhZGQgYSBuZXcgb3B0aW9uLgotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBEZWZpbmUgX19ldGV4dCBhbmQgX19lZGF0YSB0byBnbyBhbG9uZyB3aXRoCi0JX2V0ZXh0IGFuZCBfZWRhdGEuCi0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIG5ldyBmaWVsZCB0cmFkaXRpb25hbF9mb3JtYXQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCB0cmFkaXRpb25hbC1mb3JtYXQgdG8gbG9uZ29wdHMsIGFuZAotCWhhbmRsZSBpdC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBjb25maWcudHJhZGl0aW9uYWxfZm9ybWF0IHRvIGZhbHNlLgotCSogbGRsYW5nLmMgKGxkbGFuZ19vcGVuX291dHB1dCk6IFNldCBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGluIEJGRAotCWZsYWdzIG9mIG91dHB1dF9iZmQgYWNjb3JkaW5nIHRvIGNvbmZpZy50cmFkaXRpb25hbF9mb3JtYXQuCi0JKiBsZHZlci5jIChoZWxwKTogTWVudGlvbiAtdHJhZGl0aW9uYWwtZm9ybWF0LgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgLXRyYWRpdGlvbmFsLWZvcm1hdC4KLQotVHVlIEp1biAxNCAyMzoxMDowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkY3Rvci5jIChsZGN0b3JfYWRkX2VudHJ5KTogQWRkIGVudHJpZXMgdG8gYSBzZXQgaW4gdGhlIG9yZGVyCi0JdGhleSBhcmUgZW5jb3VudGVyZWQuCi0KLVR1ZSBKdW4gMTQgMTg6MDU6MDkgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2kzODZsaW51eC5zaCAoVEVYVF9TVEFSVF9BRERSKTogRGVmaW5lIGFzIDB4MTAwMC4KLQkoTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogRGVmaW5lIGFzIDB4MjAuCi0KLU1vbiBKdW4gMTMgMTU6NDY6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogRGVmaW5lIF9mdGV4dCwgX2V0ZXh0IGFuZCBfZmRhdGEgaW5zdGVkIG9mCi0JX0ZURVhULCBfRVRFWFQgYW5kIF9GREFUQS4gIERvbnQgZGVmaW5lIF9FTkQuCi0KLQkqIGxkZmlsZS5jIChvcGVuX2EpOiBJZiB0aGlzIGlzIG5vdCBhbiBhcmNoaXZlLCB0cnkgdG8gb3BlbiBpdCBpbgotCXRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgc2VhcmNoaW5nIGZvciBpdC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBUcmVhdCAtaSBhcyBhIHN5bm9ueW0gZm9yIC1yLgotCi0JKiBsZGdyYW0ueSAoZXhwKTogVHJlYXQgQkxPQ0sgYXMgYSBzeW5vbnltIGZvciBBTElHTiwgc28gdGhhdAotCUJMT0NLIHdvcmtzIGluIGEgc2VjdGlvbiBhZGRyZXNzIGFzIGRvY3VtZW50ZWQuCi0KLQkqIGxkZ3JhbS55IChZWURFQlVHKTogRG9uJ3QgZGVmaW5lLgotCi1GcmkgSnVuIDEwIDE2OjQ1OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2dsZDk2MC5lbTogUGFzcyBmYWxzZSBmb3IgbmV3IGFyZ3VtZW50IHRvCi0JbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGguCi0JKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbSwgZW11bHRlbXBsL2xuazk2MC5lbTogTGlrZXdpc2UuCi0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogT25seSBsb29rIGZvciAuc28gZmlsZXMgaWYgZG9pbmcgYSBkeW5hbWljCi0JbGluay4KLQotVGh1IEp1biAgOSAwODozNToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2k5NjAuc2M6IEFkZCBDT05TVFJVQ1RPUlMgdG8gLmRhdGEuCi0KLVRodSBKdW4gIDkgMDY6NTI6MjkgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBEZWxldGUgbGQubmV3IGRlcGVuZGVuY3kgc28gdGhhdCBhIHJlZ3Jlc3Npb24KLQkgIHRlc3QgZG9lc24ndCB0cmlnZ2VyIGEgcmVidWlsZCBvZiB0aGUgbGlua2VyLgotCi1UaHUgSnVuICA5IDAwOjE3OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMpOiBGb3IgbGFuZ19hZGRyZXNzLCBjYWxsCi0JaW5pdF9vcyBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGNhbGxlZC4KLQotVGh1IEp1biAgMiAxNzoyNDowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgc3VwcG9ydCBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGFvdXQuc2M6IERvbid0IGRlZmluZSBfX0RZTkFNSUMgaGVyZS4gIEFkZCBuZXcgc2VjdGlvbnMgdXNlZCBieQotCXNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgY29kZS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL3N1bjQuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgc3Vub3MuCi0JKiBlbXVscGFyYW1zL3N1bjMuc2ggKFRFTVBMQVRFX05BTUUpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChlc3VuNC5jKTogRGVwZW5kIHVwb24gc3Vub3MuZW0sIG5vdCBnZW5lcmljLmVtLgotCShlc3VuMy5jKTogTGlrZXdpc2UuCi0KLQkqIGxkbGFuZy5jOiBNaW5vciBmb3JtYXR0aW5nIGNsZWFudXBzLgotCShsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxhbmcuaCAobGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlKTogRGVjbGFyZS4KLQotCSogbGRmaWxlLmggKHNlYXJjaF9kaXJzX3R5cGUpOiBNb3ZlIGZyb20gbGRmaWxlLmMsIGFuZCBhZGQgY21kbGluZQotCWZpZWxkLgotCShzZWFyY2hfaGVhZCk6IERlY2xhcmUuCi0JKGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoKTogQWRkIG5ldyBjbWRsaW5lIGFyZ3VtZW50IGluIHByb3RvdHlwZS4KLQkqIGxkZmlsZS5jIChzZWFyY2hfaGVhZCk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkoc2VhcmNoX2RpcnNfdHlwZSk6IE1vdmUgdG8gbGRmaWxlLmguCi0JKGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoKTogQWNjZXB0IGNtZGxpbmUgYXJndW1lbnQsIGFuZCBzYXZlIGl0LgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBQYXNzIHRydWUgZm9yIG5ldyBjbWRsaW5lIGFyZ3VtZW50IG9mCi0JbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGguCi0JKHNldF9kZWZhdWx0X2Rpcmxpc3QpOiBMaWtld2lzZS4KLQkqIGxkbWFpbi5jIChjaGVja19mb3Jfc2NyaXB0c19kaXIpOiBQYXNzIGZhbHNlIGZvciBuZXcgY21kbGluZQotCWFyZ3VtZW50IG9mIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoLgotCSogbGRncmFtLnkgKGlmaWxlX3AxKTogTGlrZXdpc2UuCi0KLVdlZCBKdW4gIDEgMTQ6MjQ6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IFJlbW92ZSBmaWVsZHMgc3ViZmlsZXMsCi0JdG90YWxfc2l6ZSwgc3VwZXJmaWxlIGFuZCBjaGFpbi4KLQkqIGxkZmlsZS5jIChvcGVuX2EpOiBEb24ndCBjbGVhciBzZWFyY2hfZGlyc19mbGFnLgotCShsZGZpbGVfb3Blbl9maWxlKTogRG9uJ3QgdHJ5IHRvIG9wZW4gc3VwZXJmaWxlLiAgQXNzZXJ0IHRoYXQgZmlsZQotCWhhcyBub3QgYWxyZWFkeSBiZWVuIG9wZW5lZC4KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBEb24ndCBpbml0aWFsaXplIHN1cGVyZmlsZS4KLQkqIGxkbWFpbi5jIChhZGRfYXJjaGl2ZV9lbGVtZW50KTogRG9uJ3QgaW5pdGlhbGl6ZSBzdWJmaWxlcyBvcgotCWNoYWluIG9yIHN1cGVyZmlsZS4gIEluaXRpYWxpemUgc2VhcmNoX2RpcnNfZmxhZyB0byBmYWxzZS4KLQotRnJpIE1heSAyNyAxMjoyNTozMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBDaGFuZ2VkIHZlcnNpb24gdG8gImN5Z251cy0yLjQuMSIuCi0KLQlDaGFuZ2VzIGZyb20gYmludXRpbHMtMi40IHJlbGVhc2U6Ci0KLQkqIGdlbnNjcmlwdHMuc2ggKFJFTE9DQVRJTkcsIENPTlNUUlVDVElORyk6IFdoZW4gc2V0dGluZwotCXZhcmlhYmxlcywgdXNlIHdoaXRlc3BhY2UsIHNvIHNjcmlwdHMgZG9uJ3QgYnJlYWsuCi0KLQkqIGNvbmZpZy9hbHBoYW9zZi5taCAoSERFRklORVMsIENGTEFHUyk6IERlbGV0ZWQuCi0KLQkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtOiBGaW5kIGVtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIGluICR7c3JjZGlyfS4KLQotCSogY2R0ZXN0LWJhci5jYzogUmVuYW1lZCBmcm9tIGNkdGVzdC1mdW5jLmNjLgotCSogTWFrZWZpbGUuaW46IE5vdGVkIGNoYW5nZS4KLQotCSogc2NyaXB0dGVtcGwvYTI5ay5zYzogRG9uJ3QgaW5jbHVkZSAvbGFiMy91My8uLi4uL3NlZ21lbnRzLm87IEkKLQlkb24ndCBrbm93IHdoZXJlIHRoYXQncyBzdXBwb3NlZCB0byBjb21lIGZyb20sIG9yIHdoeSBpdCdzCi0JbmVjZXNzYXJ5LgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSB0byBsYXRlc3QgbWFrZWZpbGUuaW4KLQkqIGVtdWxwYXJhL2dvMzIuc2g6IHNldCB0byBjb2ZmLWdvMzIgbm90IGFvdXQKLQkqIGVtdWx0ZW1wL2dlbmVyaWMuZW06IHN0cmVuZ3RoLXJlZHVjZSB0aGUgc3RydWN0dXJlIG9mCi0JICB0aGlzIHNoZWxsIHNjcmlwdCwgc2luY2UgdGhlIG9ubHkgYXZhaWxhYmxlIHNoZWxsIGZvcgotCSAgRE9TIGNhbid0IGhhbmRsZSBjb21wbGV4IHN5bnRheC4KLQkqIGVtdWx0ZW1wL3N0cmluZ2lmeS5zZWQ6IGZvciAic2VkIC1mIiBpbnN0ZWFkIG9mIGlubGluZS4KLQkqIG1ha2VmaWxlLmluOiBkZXBlbmQgb24gc3RyaW5naWZ5LnNlZCBhcyB3ZWxsIGFzIGdlbnNjcmlwdHMuc2gKLQkqIHNjcmlwdHRlbXAvZ28zMmNvZmYuc2M6IGNvcnJlY3QgZm9yIGRqZ3BwIDEuMTEncyBDT0ZGIGZvcm1hdAotCSogZ2Vuc2NyaXB0cy5zaDogZW1wdHkgdmFyaWFibGVzIGFyZW4ndCBhbHdheXMgY29uc2lkZXJlZCAic2V0IiwKLQkgIHNvIHNldCB0aGVtIHRvICJ5IiBpbnN0ZWFkLgotCi1GcmkgTWF5IDI3IDAxOjA4OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGVudHJ5X3N5bWJvbCk6IE1ha2Ugc3RhdGljLgotCShsYW5nX2FkZF9lbnRyeSk6IEFkZCBjbWRsaW5lIGFyZ3VtZW50LgotCSogbGRsYW5nLmggKGxhbmdfYWRkX2VudHJ5KTogQ2hhbmdlIHByb3RvdHlwZS4KLQkqIGxkZ3JhbS55IChzdGF0ZW1lbnRfYW55d2hlcmUpOiBDaGFuZ2UgbGFuZ19hZGRfZW50cnkgY2FsbC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgMjQgMTY6MTM6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zaCAoT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMpOiBEb24ndCBnaXZlCi0JLnJlZ2luZm8gYW4gYWRkcmVzcy4KLQkoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogRG9uJ3QgZ2l2ZSAubGl0NCBvciAubGl0OCBhbiBhZGRyZXNzLgotCShPVEhFUl9TRUNUSU9OUyk6IERlZmluZSBmb3IgLmdwdGFiLnNkYXRhIGFuZCAuZ3B0YWIuc2Jzcy4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogVXNlIE9USEVSX1NFQ1RJT05TIGF0IGVuZCBvZiBzY3JpcHQuCi0KLVRodSBNYXkgMTkgMTM6MzE6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIHN1cHBvcnQgZm9yIEVMRiBzaGFyZWQgbGlicmFyaWVzLgotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgZmllbGQgZHluYW1pY19saW5rLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGNvbmZpZy5keW5hbWljX2xpbmsgdG8gZmFsc2UuICBXYXJuCi0Jb24gYXR0ZW1wdHMgdG8gdXNlIC1yIHdpdGggLXJlbGF4LCAtY2FsbF9zaGFyZWQgb3IgLXMuCi0JKiBsZXhzdXAuYyAobG9uZ29wdHMpOiBTZXBhcmF0ZSBPUFRJT05fQ0FMTF9TSEFSRUQgZnJvbQotCU9QVElPTl9OT05fU0hBUkVELiAgQWRkIE9QVElPTl9JR05PUkUuICBBZGp1c3QgbWFjcm8gdmFsdWVzCi0JYWNjb3JkaW5nbHkuICBBZGQgImR5IiBhbmQgIm5vbl9zaGFyZWQiIG9wdGlvbnMuICBDaGFuZ2UgIlF5IiB0bwotCU9QVElPTl9JR05PUkUgZm9yIG5vdy4gIEhhbmRsZSBPUFRJT05fQ0FMTF9TSEFSRUQgYW5kCi0JT1BUSU9OX05PTl9TSEFSRUQgYnkgc2V0dGluZyBkeW5hbWljX2xpbmsgZmllbGQgYWNjb3JkaW5nbHkuCi0JSGFuZGxlIE9QVElPTl9JR05PUkUgYnkgaWdub3JpbmcgaXQuICBDbGVhciBkeW5hbWljX2xpbmsgZmllbGQgZm9yCi0JLXIgYW5kIC1Vci4KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9maWxlKTogSWYgY29uZmlnLmR5bmFtaWNfbGluayBpcyB0cnVlLCB0cnkKLQlvcGVuaW5nIGEgZmlsZSB3aXRoIGEgLnNvIGV4dGVuc2lvbiBmaXJzdC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIChURVhUX1NUQVJUX0FERFIpOiBDaGFuZ2UgdG8gMHgxMDAwMC4KLQkoTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogTGlrZXdpc2UuCi0JKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCi0JKERBVEFfUExUKTogRGVmaW5lLgotCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBlbGYzMi4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIHBsYWNlbWVudCBmb3IgbmV3IGR5bmFtaWMgc2VjdGlvbnMuCi0JRG9uJ3QgdXNlIENSRUFURV9PQkpFQ1RfU1lNQk9MUy4gIERlZmluZSBfZXRleHQsIF9lZGF0YSBhbmQgX2VuZAotCW91dHNpZGUgb2YgYW55IHNlY3Rpb24uICBEb24ndCB1c2UgQUxJR04oOCk7IGp1c3QgbGV0IG9uZSBzZWN0aW9uCi0JVk1BIGZvbGxvdyBhbm90aGVyLiAgUHV0IC5keW5ic3MgaW4gLmJzcy4gIERvbid0IG1lbnRpb24gZGVidWdnaW5nCi0Jc2VjdGlvbnM7IHRoZXknbGwgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYW55aG93LgotCSogTWFrZWZpbGUuaW4gKGVlbGZfaTM4Ni5jKTogRGVwZW5kIHVwb24gZWxmMzIuZW0sIG5vdCBnZW5lcmljLmVtLgotCi1XZWQgTWF5IDE4IDEwOjE1OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZWRpcmVjdCBvdXRwdXQgb2YgbG4gdG8gL2Rldi9udWxsLgotCi1Nb24gTWF5IDE2IDEzOjM1OjA4IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbTogQ2hhbmdlIGFsbCByZWZlcmVuY2VzIG9mCi0JLmhwcGFfbGlua2VyX3N0dWJzIHRvIC5QQVJJU0Muc3R1YnMuCi0JKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjOiBMaWtld2lzZS4KLQotRnJpIE1heSAxMyAxMzowMDozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBDaGFuZ2UgYGBubyBhdHRhY2hlZAotCW91dHB1dCBzZWN0aW9uJycgbWVzc2FnZSBzbGlnaHRseS4KLQkobGFuZ19kb19hc3NpZ25tZW50cyk6IERvbid0IHJlY3Vyc2UgZG93biBpZiB0aGVyZSBpcyBubyByZWFsCi0Jc2VjdGlvbi4KLQotCSogY29uZmlnL2kzODYtbGludXgubXQgKE9USEVSX0VNVUxBVElPTlMpOiBDaGFuZ2UgZW1fIHRvIGUgdG8KLQltYXRjaCBjb3JyZXNwb25kaW5nIGNoYW5nZSBpbiBlbXVsYXRpb24gdGVtcGxhdGVzLgotCSogY29uZmlnL2kzODYtbHlueC5tdCwgY29uZmlnL202OGstbHlueC5tdDogTGlrZXdpc2UuCi0JKiBjb25maWcvc3BhcmMtbHlueC5tdCwgY29uZmlnL3N1bjRzb2wyLm10OiBMaWtld2lzZS4KLQotV2VkIE1heSAxMSAxODoxNjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBVcGRhdGVkIHZlcnNpb24gbnVtYmVyLgotCi0JKiBjZHRlc3QtZm9vLmNjOiBVc2UgZXhwbGljaXQgIiNwcmFnbWEgaW1wbGVtZW50YXRpb24iLgotCSogY2R0ZXN0LWJhci5jYzogUmVuYW1lZCBmcm9tIGNkdGVzdC1mdW5jLmNjLgotCSogTWFrZWZpbGUuaW46IFJlZmVyZW5jZXMgdG8gY2R0ZXN0LWZ1bmMubyBjaGFuZ2VkIHRvCi0JY2R0ZXN0LWJhci5vLgotCi1XZWQgTWF5IDExIDE2OjI0OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCURvbid0IGNyZWF0ZSB1bm5lY2Vzc2FyeSBvdXRwdXQgc2VjdGlvbnMuCi0JKiBsZGxhbmcuYyAob3V0X2JmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKTogUmVtb3ZlLgotCSh3aWxkX3NlY3Rpb24pOiBDYWxsIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIHJhdGhlciB0aGFuCi0Jb3VyX2JmZF9nZXRfc2VjdGlvbl9ieV9uYW1lLiAgRG9uJ3QgY2FsbCB3aWxkX2RvaXQgaWYgdGhlcmUgaXMgbm8KLQlzZWN0aW9uLgotCShsYW5nX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogUmVtb3ZlLgotCShtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zKTogRm9yIHNldmVyYWwgY2FzZXMsIGNhbGwgaW5pdF9vcyBpZgotCWl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNhbGxlZC4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgb3V0cHV0IHNlY3Rpb24gd2FzIG5vdCBjcmVhdGVkLCBza2lwIGl0LgotCShsYW5nX3Byb2Nlc3MpOiBEb24ndCBjYWxsIGxhbl9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cy4KLQkobGFuZ19wbGFjZV9vcnBoYW5zKTogU2tpcCBmaWxlcyB3aXRoIGp1c3Rfc3ltc19mbGFncyBzZXQgdG8gdHJ1ZS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IGNoYW5nZS4KLQotVHVlIE1heSAxMCAxNDozMToxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBEb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nIHRoZSB2bWEgYW5kCi0Jc2VjdGlvbiBzaXplLiAgRG9uJ3Qgc3BlY2lhbCBjYXNlIFNFQ19TSEFSRURfTElCUkFSWS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogSGFuZGxlIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZIHNlY3Rpb25zCi0Jc3BlY2lhbGx5LgotCi1GcmkgTWF5ICA2IDEyOjI0OjI3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oIDogTmV3IGZpbGUgZm9yIFhnbzMyWC4KLQotRnJpIE1heSAgNiAxNToxNTozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUpOiBTZXQgYmZkX2Vycm9yX3N5c3RlbV9jYWxsCi0JYmVmb3JlIGNhbGxpbmcgZWluZm8sIHNpbmNlIHdlIGFyZSByZXBvcnRpbmcgYW4gZm9wZW4gZmFpbHVyZS4KLQlGcm9tIGpyc0B3b3JsZC5zdGQuY29tIChSaWNrIFNsYWRrZXkpLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAiZSIgcmF0aGVyIHRoYW4gImVtXyIgYXMgcHJlZml4IGZvcgotCWVtdWxhdGlvbnMuCi0KLUZyaSBNYXkgIDYgMDE6MDg6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtOiBVc2UgImUiIHJhdGhlciB0aGFuICJlbV8iIGFzIHByZWZpeCBmb3IKLQlmaWxlbmFtZS4KLQkqIGVtdWx0ZW1wbC9nbGQ5NjAuZW0sIGVtdWx0ZW1wbC9nbGQ5NjBjLmVtLCBlbXVsdGVtcGwvbG5rOTYwLmVtLAotCWVtdWx0ZW1wbC9ocHBhZWxmLmVtLCBlbXVsdGVtcGwvbTg4a2Jjcy5lbSwgZW11bHRlbXBsL3ZhbmlsbGEuZW06Ci0JRGl0dG8uCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBhbGwgZ2VuZXJhdGVkIGZpbGUgbmFtZXMuCi0JKGxkZW11bC1saXN0LmgpOiBEZXBlbmQgb24gTWFrZWZpbGUsIG5vdCBjb25maWcuc3RhdHVzLiAgQ2hhbmdlZAotCXNlZCBwYXR0ZXJucyB0byBoYW5kbGUgbmV3IGZpbGVuYW1lcy4KLQotCSogY29uZmlnL21pcHNsLWlkdC5tdDogUmVuYW1lZCBmcm9tIG1pcHMtaWR0bC5tdC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRqdXN0ZWQuCi0KLVRodSBNYXkgIDUgMTU6MDc6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IERvbid0IHVzZSAiJDwqIiwgaXQgZG9lc24ndCBhbHdheXMKLQl3b3JrLiAgSW5zdGVhZCwgY2hlY2sgYnVpbGQgZGlyIGFuZCAkc3JjZGlyIGV4cGxpY2l0bHksIGFuZCB1c2UKLQlgZWNobycgdG8gZ2V0IGFsbCB0aGUgZmlsZW5hbWVzLgotCi0JKiBjb25maWd1cmUuaW4gKGg4MzAwaC0qLWhtcyk6IENoYW5nZWQgbGRfdGFyZ2V0IG5hbWUgdG8KLQljZi1oODMwMGguCi0JKiBjb25maWcvY2YtaDgzMDBoLm10OiBSZW5hbWVkIGZyb20gY29mZi1oODMwMGgubXQsIHRvIG1ha2UgaXQKLQl1bmlxdWUgaW4gOC4zLgotCi0JKiBjb25maWcvaTk2MGNvZmYubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoOiBOZXcgZmlsZS4KLQkqIGVtdWx0ZW1wbC9nbGQ5NjBjLmVtOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoaTk2MC0qLXZ4d29ya3M1KiBleGNlcHQgLXZ4d29ya3M1LjAqKTogVXNlCi0JaTk2MGNvZmYgY29uZmlndXJhdGlvbi4KLQkqIE1ha2VmaWxlLmluIChlbV9nbGQ5NjBjb2ZmLmMpOiBBZGRlZCBkZXBlbmRlbmNpZXMsIGJ1aWxkIHJ1bGUuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IFJlbW92ZSBlbV9kZWx0YTY4Lm8sIHNpbmNlIHRoZQotCWNvZGUgaXNuJ3QgaW5jbHVkZWQgaW4gRlNGIHJlbGVhc2VzLCBhbmQgaXQgY2FuIHN0aWxsIGJlCi0JZXhwbGljaXRseSBzZWxlY3RlZC4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIHNpdGUuYmFrIGFuZCB0bXBkaXIuCi0JKFNUQUdFU1RVRkYpOiBSZW1vdmVkICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKS4KLQkobW9zdGx5Y2xlYW4pOiBEZWxldGUgdGhlbSBleHBsaWNpdGx5IGhlcmUuICBBbHNvIHJlbW92ZSB0bXBkaXIuCi0KLQlQYXRjaGVzIGZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKiBjb25maWcvbWlwc2JzZC5taDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoZW1fbWlwc2JzZC5jKTogVXNlIG1pcHNic2Quc2MsIG5vdCBhb3V0LnNjLgotCSogc2NyaXB0dGVtcGwvbWlwc2JzZC5zYzogRG9uJ3QgZGVmaW5lIF9fRFlOQU1JQy4KLQkqIGVtdWxwYXJhbXMvbWlwc2JzZC5zaCAoT1VUUFVUX0ZPUk1BVCk6IEZpeCBuYW1lIHRvIGhhdmUgYGEub3V0JwotCWluc3RlYWQgb2YgYGFvdXQnLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbnUqKTogVHJlYXQgbGlrZSBpMzg2LSotbWFjaCouCi0KLVdlZCBNYXkgIDQgMTE6NTk6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTY4ay5tdCAoRU1VTCk6IFNldCB0byBtNjhrYW91dC4KLQkqIGVtdWxwYXJhbXMvbTY4a2FvdXQuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtX202OGthb3V0Lm8uCi0JKGVtX202OGthb3V0LmMpOiBOZXcgdGFyZ2V0LgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgZG90IG1vdmVzIGJlY2F1c2Ugb2YgYW4KLQlhc3NpZ25tZW50LCBkb24ndCB0cnkgdG8gaW5zZXJ0IGEgcGFkIGludG8gdGhlIGFic29sdXRlIG91dHB1dAotCXNlY3Rpb24sIGp1c3QgY2hhbmdlIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWZhdWx0IG1lbW9yeSByZWdpb24KLQlpbnN0ZWFkLgotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBSZW1vdmUgY2R0ZXN0LnRtcCwgY2R0ZXN0LXVyLAotCWNkdGVzdC11ci5vdXQsIGFuZCBjZHRlc3QtdXIudG1wLgotCi1XZWQgQXByIDI3IDE2OjAzOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvc2EyOTIwMC5zYzogQWxpZ24gYWxsIHNlY3Rpb25zIHRvIGZvdXIgYnl0ZQotCWJvdW5kYXJpZXMuCi0KLVdlZCBBcHIgMjcgMTA6NDg6MDMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCBmb3IgZ28zMiBjb2ZmLgotCSogY29uZmlnL2kzODYtZ28zMi5tdDogTmV3IGZpbGUKLQkqIGVtdWxwYXJhbXMvaTM4NmdvMzIuc2g6IE5ldyBmaWxlCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYzogTmV3IGZpbGUKLQotVHVlIEFwciAyNiAxNzoyMDowMyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbV9tNjhrbHlueC5jLCBlbV9pMzg2bHlueC5jLCBlbV9zcGFyY2x5bnguYyk6IFVzZQotCUx5bngtc3BlY2lmaWMgc2NyaXB0IHRlbXBsYXRlcy4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsaXRlKi0qLWNvZmYpOiBVc2UgY29mZi1zcGFyYy4KLQkqIGVtdWxwYXJhbXMvaTM4Nmx5bnguc2ggKFNDUklQVF9OQU1FKTogU2V0IHRvIGkzODZseW54LgotCSogZW11bHBhcmFtcy9zcGFyY2x5bnguc2ggKFNDUklQVF9OQU1FKTogU2V0IHRvIHNwYXJjbHlueC4KLQkoRU5UUlkpOiBTZXQgdG8gX19tYWluLgotCSogc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2M6IE5ldyBmaWxlLCBzY3JpcHQgZm9yIEkzODYgTHlueC4KLQkqIHNjcmlwdHRlbXBsL202OGtseW54LnNjOiBBZGQgaW5zZXJ0aW9uIG9mIGN0b3IvZHRvciBzZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL3NwYXJjbHlueC5zYzogTmV3IGZpbGUsIHNjcmlwdCBmb3IgdVNwYXJjIEx5bnguCi0KLVR1ZSBBcHIgMjYgMTI6NDE6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBGb3JjZSBfZ3AgYW5kIC5saXQ4IHRvIGJlIGFsaWduZWQgdG8gYSAxNgotCWJ5dGUgYm91bmRhcnksIGluIGNhc2UgdGhlIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZG8gbm90IHRha2UgdXAgYW4KLQlldmVuIDE2IGJ5dGVzLgotCi0JKiBjb25maWcvaTM4NnY0Lm1oIChIT1NUSU5HX0NSVDApOiBJZiAuLi9nY2MvY3J0YmVnaW4ubyBkb2VzIG5vdAotCWV4aXN0LCBnZXQgY3J0YmVnaW4gYmFzZWQgb24gZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lLgotCShIT1NUSU5HX0xJQlMpOiBTaW1pbGFyIGNoYW5nZSBmb3IgLi4vZ2NjL2NydGVuZC5vLgotCi1Nb24gQXByIDI1IDE1OjI3OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IFdoZW4gbm8gYWRkcmVzcyBpcyBnaXZlbiBmb3IgYQotCXNlY3Rpb24sIGFsaWduIGl0IGFjY29yZGluZyB0byBpdHMgcmVxdWlyZW1lbnRzLgotCi1UaHUgQXByIDIxIDE3OjI0OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuLCBkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnZG9jLnRleGkuCi0KLVR1ZSBBcHIgMTkgMTI6MTI6MTUgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBpWzM0XTg2LSotYnNkMzg2IHRvIHRoZSBwYXR0ZXJucyByZWNvZ25pemVkLgotCi1GcmkgQXByIDE1IDE0OjM1OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IFdoZW4gcmVsYXhpbmcsIGFkanVzdCB0aGUKLQlwb3NpdGlvbiBvZiBhIHBhZGRpbmcgc3RhdGVtZW50LCBhbmQgYWRqdXN0IGRvdCBhY2NvcmRpbmdseS4KLQotTW9uIEFwciAxMSAxNzozNzowOSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChFWFBFQ1QsIFJVTlRFU1QpOiBTZXQgdGhlc2UgZm9yIHRoZSBjaGVjayBnb2FsLgotCi1Nb24gQXByIDExIDEyOjMyOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2M6IElmIHJlbG9jYXRpbmcsIGRvbid0IHB1dCAuaW5pdCBhbmQKLQkuZmluaSBzZWN0aW9ucyBpbnRvIC50ZXh0OyBrZWVwIHRoZW0gc2VwYXJhdGUuCi0JKiBjb25maWcvaTM4NnNjby5taCAoSE9TVElOR19DUlQwKTogSWYgLi4vZ2NjL2NydGJlZ2luLm8gZG9lcyBub3QKLQlleGlzdCwgZ2V0IGNydGJlZ2luIGJhc2VkIG9uIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZS4KLQkoSE9TVElOR19MSUJTKTogU2ltaWxhciBjaGFuZ2UgZm9yIC4uL2djYy9jcnRlbmQuby4KLQotTW9uIEFwciAxMSAxMDozMTowMCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFNldCBUQ0xfTElCUkFSWSBmb3IgcnVudGVzdC4KLQotV2VkIEFwciAgNiAwMDowOTozNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLSplbGYqKTogRG9uJ3QgcmVxdWlyZSAiLWhwLSIgZm9yIHRoZQotCW1hbnVmYWN0dXJlci4KLQotCSogZW11bHRlbXBsL2hwcGFlbGYuZW0gKGhwcGFlbGZfZmluaXNoKTogT25seSByZXNpemUgc2VjdGlvbnMKLQlpZiBidWlsZGluZyBhIGZpbmFsIGV4ZWN1dGFibGUuCi0KLVR1ZSBBcHIgIDUgMTI6MTc6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAobWFpbik6IENoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgYmZkX2Nsb3NlLgotCi1UaHUgTWFyIDMxIDE4OjA3OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IENsZWFuIHVwIHNlY3Rpb24gYWxpZ25tZW50IHRvIGVuc3VyZSB0aGF0Ci0Jc2VjdGlvbnMgbmV2ZXIgb3ZlcmxhcCB3aGVuIHVzaW5nIC1yLgotCi1XZWQgTWFyIDMwIDE1OjUxOjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IENoYW5nZSBzeW1ib2wgcmVhZGluZyBzbGlnaHRseSBmb3IgcmVjZW50IEJGRAotCWNoYW5nZXM6IGdldF9zeW10YWJfdXBwZXJfYm91bmQgcmVuYW1lZCBhbmQgcmV0dXJucyBsb25nLAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiIHJldHVybnMgbG9uZywgY2hlY2sgZm9yIGVycm9yIGluZGljYXRpb25zLgotCi1GcmkgTWFyIDI1IDE3OjIwOjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHByaW50X2lucHV0X3NlY3Rpb24pOiBGb3Igc2VjdGlvbiBzaXplLCB1c2UKLQlfY29va2VkX3NpemUgaWYgaXQgaXMgbm9uLXplcm8sIHNpemUgb3RoZXJ3aXNlLgotCShzaXplX2lucHV0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkobGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlIChjYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKS4KLQotVGh1IE1hciAyNCAxNToyMDo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBBZGQgbmV3IGFyZ3VtZW50IGFkZF90b19saXN0LiAgRG9uJ3Qgc2V0Ci0JcmVhbCB0byB0cnVlIGZvciBsYW5nX2lucHV0X2ZpbGVfaXNfbWFya2VyX2VudW0uICBDbGVhciB0aGVfYmZkLgotCShsYW5nX2FkZF9pbnB1dF9maWxlKTogUGFzcyB0cnVlIHRvIG5ld19hZmlsZSBmb3IgYWRkX3RvX2xpc3QuCi0JKGxvb2t1cF9uYW1lKTogUmVtb3ZlIGZvcmNlX2xvYWQgYXJndW1lbnQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCVBhc3MgZmFsc2UgdG8gbmV3X2FmaWxlIGZvciBhZGRfdG9fbGlzdC4gIFNwbGl0IGxvYWRpbmcgb2Ygc3ltYm9scwotCW91dCBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9uLgotCShsb2FkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24gc3BsaXQgb3V0IG9mIGxvb2t1cF9uYW1lLiAgRG9uJ3QgbG9hZAotCXRoZSBzeW1ib2xzIGlmIHRoZXkgYXJlIGFscmVhZHkgbG9hZGVkLgotCShvcGVuX2lucHV0X2JmZHMpOiBGb3IgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bSBjYWxsIGxvYWRfc3ltYm9scwotCXJhdGhlciB0aGFuIGxvb2t1cF9uYW1lLgotCShsYW5nX3Byb2Nlc3MpOiBQYXNzIGFic19vdXRwdXRfc2VjdGlvbiByYXRoZXIgdGhhbiBOVUxMIHRvCi0JbGFuZ19zaXplX3NlY3Rpb25zLgotCShsYW5nX3N0YXJ0dXApOiBTZXQgcmVhbCBmaWVsZCBvZiBmaXJzdF9maWxlIHRvIHRydWUuCi0KLVdlZCBNYXIgMjMgMTQ6MTU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoaGFkX3JlbGF4KTogUmVtb3ZlZC4KLQkocmVsYXhfYWdhaW4pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBDaGFuZ2UgY2FsbCB0byBiZmRfcmVsYXhfc2VjdGlvbiB0bwotCWNvcnJlc3BvbmQgdG8gQkZEIGNoYW5nZXMuICBTZXQgcmVsYXhfYWdhaW4gYXBwcm9wcmlhdGVseS4KLQkobGFuZ19wcm9jZXNzKTogUmVtb3ZlICNpZiAwIGNvZGUuICBXaGVuIHJlbGF4aW5nLCBrZWVwIGNhbGxpbmcKLQlsYW5nX2RvX2Fzc2lnbm1lbnRzIGFuZCBsYW5nX3NpemVfc2VjdGlvbnMgdW50aWwgcmVsYXhfYWdhaW4KLQliZWNvbWVzIGZhbHNlLgotCi0JKiBlbXVsdGVtcC9nbGQ5NjAuZW06IEluY2x1ZGUgbGliaWJlcnR5LmgKLQkoZ2xkOTYwX2JlZm9yZV9wYXJzZSk6IFBhc3MgTlVMTCBhcyBmaW5hbCBhcmd1bWVudCB0byBjb25jYXQuCi0KLVR1ZSBNYXIgMjIgMTM6MDg6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBGb3JjZSBfZW5kIGFuZCBfX2VuZCB0byBiZSBhbGlnbmVkIHRvIGEKLQlmb3VyIGJ5dGUgYm91bmRhcnkuCi0KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IEhhbmRsZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW0gYnkKLQlidWlsZGluZyBhIGJmZF9kYXRhX2xpbmtfb3JkZXIsIHJhdGhlciB0aGFuIGJ5IHNldHRpbmcgdGhlIHNlY3Rpb24KLQljb250ZW50cyBpbW1lZGlhdGVseS4KLQotTW9uIE1hciAyMSAxODoyODozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIHRvIG1ha2UgLVVyIHdvcmsgYWdhaW4uCi0JKiBsZG1haW4uYyAoYWRkX3RvX3NldCk6IE5vdyB0YWtlcyByZWxvYyBhcmd1bWVudCByYXRoZXIgdGhhbgotCWJpdHNpemUuICBDaGVjayBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzIGhlcmUuICBJZiBhbiBuZXcgaGFzaAotCXRhYmxlIGVudHJ5IGlzIGNyZWF0ZWQsIG1hcmsgaXQgYXMgdW5kZWZpbmVkLgotCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IE5vIGxvbmdlciB0YWtlcyBiaXRzaXplIGFyZ3VtZW50LiAgUGFzcwotCUJGRF9SRUxPQ19DVE9SIHRvIGxkY3Rvcl9hZGRfc2V0X2VudHJ5LCBidXQgZmlyc3QgbWFrZSBzdXJlIHRoZQotCUJGRCBiYWNrZW5kIHN1cHBvcnRzIGl0LgotCShyZWxvY19vdmVyZmxvdyk6IEhhbmRsZSBhIE5VTEwgYWJmZCBhcmd1bWVudC4KLQkocmVsb2NfZGFuZ2Vyb3VzLCB1bmF0dGFjaGVkX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBsZGN0b3IuYzogSW5jbHVkZSBsZG1haW4uaC4KLQkoc3RydWN0IHNldF9pbmZvKTogQ2hhbmdlIGJpdHNpemUgZmllbGQgdG8gcmVsb2MuCi0JKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogTm93IHRha2VzIHJlbG9jIGFyZ3VtZW50IHJhdGhlciB0aGFuCi0JYml0c2l6ZS4gIERvbid0IGJvdGhlciB0byBjaGVjayBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzIGhlcmUuCi0JKGxkY3Rvcl9idWlsZF9zZXRzKTogR2V0IHRoZSBzaXplIGZyb20gdGhlIHJlbG9jIGhvd3RvLiAgSWYKLQlnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGNhbGwgbGFuZ19hZGRfcmVsb2MgcmF0aGVyIHRoYW4KLQlsYW5nX2FkZF9kYXRhLgotCSogbGRjdG9yLmggKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIHVzZSByZWxvYwotCWluc3RlYWQgb2YgYml0c2l6ZS4KLQkqIGxkbGFuZy5oIChzdGF0ZW1lbnRfZW51bSk6IEFkZCBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtLgotCShsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlKTogTmV3IHN0cnVjdHVyZS4KLQkobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSk6IEFkZCByZWxvY19zdGF0ZW1lbnQgZmllbGQuCi0JKGxhbmdfYWRkX3JlbG9jKTogRGVjbGFyZSBuZXcgZnVuY3Rpb24uCi0JKiBsZGxhbmcuYyAobGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyKTogSGFuZGxlCi0JbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bS4KLQkobWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucywgcHJpbnRfc3RhdGVtZW50KTogTGlrZXdpc2UuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucywgbGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlLgotCShwcmludF9yZWxvY19zdGF0ZW1lbnQpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfYWRkX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSGFuZGxlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0uCi0KLQkqIE1ha2VmaWxlLmluIChjZHRlc3Qub3V0LCBjZHRlc3QtdXIubyk6IE5ldyB0YXJnZXRzLgotCShjZHRlc3QtdXIsIGNkdGVzdC11ci5vdXQpOiBOZXcgdGFyZ2V0cy4KLQkoY2hlY2stY2R0ZXN0KTogTm93IGFsc28gY2hlY2sgdGhhdCAtVXIgd29ya3MgY29ycmVjdGx5LgotCi0JKiBzY3JpcHR0ZW1wL2FscGhhLnNjOiBBbGlnbiBhbGwgc2VjdGlvbnMgdG8gMTYgYnl0ZSBib3VuZGFyaWVzLgotCi1UaHUgTWFyIDE3IDEyOjQ1OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IE1vdmUgbGFuZ19jb21tb24gY2FsbCBiZWZvcmUKLQltYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zLCB0byBlbnN1cmUgdGhhdCBhbnkgYWxpZ25tZW50Ci0JY29uc3RyYWludHMgc2V0IGJ5IGNvbW1vbiBzeW1ib2xzIGFyZSBjb3BpZWQgb3ZlciB0byB0aGUgb3V0cHV0Ci0Jc2VjdGlvbnMuCi0KLUZyaSBNYXIgMTEgMjI6MTc6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChURU1QTEFURV9OQU1FKTogRG9uJ3QgZGVmaW5lLgotCShPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBSZW5hbWUgLnRvYyB0byAuZ290LgotCSogTWFrZWZpbGUuaW4gKGVtX2VsZjMycHBjLmMpOiBEZXBlbmQgdXBvbiBnZW5lcmljLmVtLCBub3QgcHBjLmVtLgotCSogZW11bHRlbXBsL3BwYy5lbTogUmVtb3ZlIHVnbHkgc3R1YiBjb2RlOyB0dXJucyBvdXQgbm90IHRvIGJlCi0JbmVlZGVkIGZvciBFTEYuCi0KLVR1ZSBNYXIgIDggMDQ6MjI6MjcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaTM4NmJzZC5taDogTmV3IGZpbGUuCi0KLU1vbiBNYXIgIDcgMTU6MjM6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYuc2M6IFBlcm1pdCBURVhUX1NUQVJUX1NZTUJPTFMgYW5kIERBVEFfU1RBUlRfU1lNQk9MUyB0byBiZQotCWRlZmluZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zIChURVhUX1NUQVJUX1NZTUJPTFMpOiBEZWZpbmUgX2Z0ZXh0LgotCShEQVRBX1NUQVJUX1NZTUJPTFMpOiBEZWZpbmUgX2ZkYXRhLgotCi1Nb24gRmViIDI4IDEwOjU5OjE0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGNhdCk6IERlZmluZSB1c2luZyBBTlNJIHN0eWxlIGlmIEFMTU9TVF9TVERDIGRlZmluZWQuCi0KLVN1biBGZWIgMjcgMTY6Mjk6MzggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtIChocHBhZWxmX2ZpbmlzaCk6IFVwZGF0ZSBjb21tZW50cy4gIFRoaXMKLQl3b3JrcyBhZ2Fpbi4gIEF0dGFjaCBzb21lIG91dHB1dCBzeW1ib2xzIHRvIHRoZSBzdHViIGZpbGUgYmZkLgotCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbTogSW5jbHVkZSBlbGYzMi1ocHBhLmguCi0JKGZpbGVfY2hhaW4pOiBBZGQgZGVjbC4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogRGVsZXRlIGRlY2wuCi0JKGhwcGFlbGZfZmluaXNoKTogUmVlbmFibGUgY29kZS4gIERvIG5vdCBwYXNzIHN5bWJvbHMKLQlkb3duIHRvIGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbi4KLQotU2F0IEZlYiAyNiAxMDo1ODoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jICh3cml0ZV9tYXApOiBEb24ndCBkZWZpbmUuICBSZW1vdmVkIGFsbCByZWZlcmVuY2VzLgotCUp1c3QgdXNlIG1hcF9maWxlIG9yIG1hcF9maWxlbmFtZSBpbnN0ZWFkLgotCShhZGRfYXJjaGl2ZV9lbGVtZW50KTogVXNlIG1pbmZvIHRvIHdyaXRlIG1hcCBpbmZvcm1hdGlvbiwgbm90Ci0JaW5mb19tc2cuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogVXNlIGZwcmludGYgdG8gd3JpdGUgbWFwIGluZm9ybWF0aW9uLCBub3QKLQlpbmZvX21zZy4KLQkqIGxkbWFpbi5oICh3cml0ZV9tYXApOiBEb24ndCBkZWNsYXJlLgotCSogbGRncmFtLnkgKG1yaV9zY3JpcHRfY29tbWFuZCk6IFJlbW92ZWQgcmVmZXJlbmNlIHRvIHdyaXRlX21hcC4KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBMaWtld2lzZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgMjUgMTk6MTI6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEZvcmNlIGFsbCBzZWN0aW9ucyB0byBiZSBhbGlnbmVkLgotCi0JKiBsZGdyYW0ueSAoc2VjdGlvbik6IFJldmVyc2UgdGhlIG9yZGVyIG9mIG1lbXNwZWNfb3B0IGFuZAotCWZpbGxfb3B0IHRvIGF2b2lkIGFuIGFtYmlndWl0eSB3aGVuIGJvdGggYXJlIHVzZWQuCi0JKiBsZC50ZXhpbmZvOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCi0JKiBsZGdyYW0ueTogTW92ZSBpbmNsdWRlIG9mIGxkbGV4LmggYmFjayB3aXRoIG90aGVyIGluY2x1ZGVzLgotCSogbGRsZXguaCAoaW5wdXRfdHlwZSk6IERvbid0IGluaXRpYWxpemUgZW51bSBjb25zdGFudHMgdG8KLQlwYXJ0aWN1bGFyIHZhbHVlcy4KLQkqIGxkbGV4Lmw6IFVzZSBhIHN3aXRjaCB0byByZXR1cm4gdGhlIHJpZ2h0IHRva2VuIGJhc2VkIG9uCi0JaW5wdXRfdHlwZSwgcmF0aGVyIHRoYW4ga25vd2luZyB0aGF0IGlucHV0X3R5cGUgaGFzIGEgdmFsdWUgYmFzZWQKLQlvbiBhIHRva2VuIHR5cGUuCi0KLQkqIGxkZ3JhbS55IChkaXJsaXN0X3B0cik6IFJlbW92ZWQ7IG5vdCB1c2VkLgotCSogbGV4c3VwLmM6IEluY2x1ZGUgbGR2ZXIuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotRnJpIEZlYiAyNSAxODo1NTo1NCAxOTk0ICBUZWQgTGVtb24gIChtZWxsb25AcGVwcGVyLm5jZC5jb20pCi0KLQkqIGxkbGFuZy5jIChsb29rdXBfbmFtZSk6IGRvbid0IGNhbGwgYmZkX3NldF9ncF9zaXplLgotCShsZGxhbmdfYWRkX2ZpbGUpOiBjYWxsIGl0IGhlcmUgaW5zdGVhZC4KLQotRnJpIEZlYiAyNSAxODoxMzo0NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55OiBJbmNsdWRlIGxkbGV4LmggYWZ0ZXIgJXRva2VuIGRlY2xzLCBmb3IgYnlhY2MuCi0KLUZyaSBGZWIgMjUgMTA6NDc6MjUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLSAgICAgICAgKiBlbXVsdGVtcGwvaHBwYWVsZi5lbTogRmlyc3QgYXR0ZW1wdCB0byBjbGVhbiB0aGlzIGZpbGUgdXAuCi0JQWRkIGNvbW1lbnRzIGluIHNldmVyYWwgZnVuY3Rpb25zIGFzIHRvIHRoZWlyIHB1cnBvc2UgYW5kCi0JaG93IHRoZXkgZnVuY3Rpb24gKG9yIG15IGN1cnJlbnQgYmVzdCBndWVzcykuICBDbGVhbiB1cCBob3JyaWJsZQotCXNwYWNpbmcgYW5kIGluZGVudGlvbiB0aGF0IG5ldmVyIHNob3VsZCBoYXZlIGJlZW4gYWNjZXB0ZWQgaW4gdGhlCi0JZmlyc3QgcGxhY2UuICBBZGQgRklYTUVzIGZvciBpc3N1ZXMgd2hpY2ggbmVlZCB0byBiZSByZXNvbHZlZC4KLQlEaXNhYmxlIGxpbmtlci1zdHViIGdlbmVyYXRpb24gdW50aWwgaXQgZ2V0cyBmaXhlZC4gIFRoaXMgYWxsb3dzCi0JdGhlIGxpbmtlciB0byBhdCBsZWFzdCB3b3JrIG9uIHNpbXBsZSBjb2RlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogTm8gbG9uZ2VyIHN0YXRpYyAoUEEgRUxGIGNhbGxzCi0JaXQgdmlhIGhwcGFlbGZfZmluaXNoKS4gIFByb3RvdHlwZSBtb3ZlZCBpbnRvIGxkbGFuZy5oLgotCShsYW5nX3Byb2Nlc3MpOiBNb3ZlIHByb2JsZW1hdGljIGV4dHJhIGNhbGwgdG8gbGFuZ19zaXplX3NlY3Rpb25zCi0JaW50byB0aGUgUEEgRUxGIHNwZWNpZmljIGNvZGUuCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbSAoaHBwYWVsZl9maW5pc2gpOiBFeHRyYSBjYWxsIHRvCi0JbGFuZ19zaXplX3NlY3Rpb25zIG1vdmVkIGhlcmUuCi0KLVRodSBGZWIgMjQgMTY6NDc6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMtKi1lbGYqKTogTmV3IHRhcmdldDsgdXNlIHBwYy1lbGYzMi4KLQkqIGNvbmZpZy9wcGMtZWxmMzIubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaDogTmV3IGZpbGUuCi0JKiBlbXVsdGVtcGwvcHBjLmVtOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX2VsZjMycHBjLm8uCi0JKGVtX2VsZjMycHBjLmMpOiBOZXcgdGFyZ2V0OyB1c2VzIGVsZjMycHBjLnNoLCBwcGMuZW0gYW5kIGVsZi5zYy4KLQkoRU1VTEFUSU9OX09GSUxFUyk6IEFkZGVkIGRlcGVuZGVuY2llcyBvbiBsZGV4cC5oIGFuZCBsZGxhbmcuaC4KLQotVGh1IEZlYiAyNCAxMjoyNzowNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVXNlIHN5bWJvbGljIG51bWJlcnMgZm9yIGxvbmcgb3B0aW9ucy4KLQlGaXggbWlzdW5kZXJzdGFuZGluZyBpbiAtWSBhbmQgLWNhbGxfc2hhcmVkIGV0IGFsLgotCi0JVXNlIGdldG9wdCBpbnN0ZWFkIG9mIGxleCBhbmQgeWFjYyB0byBwYXJzZSB0aGUgY29tbWFuZCBsaW5lLgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogRG9jdW1lbnQgY2hhbmdlcyB0byBvcHRpb24gc3ludGF4LgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBsZHZlci5jIChoZWxwKTogVHdlYWsgZGFzaGVzIGluIHVzYWdlIG1lc3NhZ2UuCi0JKiBsZGdyYW0ueSAoJXVuaW9uKTogUmVtb3ZlIHVudXNlZCBtZW1iZXJzLgotCVJlbW92ZSAldG9rZW5zIGZvciBjb21tYW5kIGxpbmUgb3B0aW9uczsgYWRkIG9uZXMgZm9yIGlucHV0IHR5cGVzLgotCShjb21tYW5kX2xpbmUpOiBSdWxlcyByZW1vdmVkLgotCShmaWxlKTogSW5zdGVhZCBvZiBjb21tYW5kIGxpbmUsIHJlY29nbml6ZSBhbgotCWlucHV0IHR5cGUgaW5kaWNhdG9yLCB0aGVuIHVzZSB0aGUgbm9udGVybWluYWwgZm9yIHRoYXQgdHlwZS4KLQkoZGVmc3ltX2V4cHIpOiBOZXcgbm9udGVybWluYWwgZnJvbSBjb2RlIGZvcm1lcmx5IGluIGNvbW1hbmRfbGluZS4KLQkqIGxkbGV4Lmg6IERlY2xhcmUgcGFyc2VyIGlucHV0IHR5cGUgZW51bSBhbmQgdmFyaWFibGUuCi0JRG9uJ3QgZGVjbGFyZSBwYXJzZV9saW5lLgotCSogbGRsZXgubDogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBNYWtlIHNvbWUgdXNlZCBvbmVzIHN0YXRpYwotCWFuZCBjb21tZW50IHRoZW0uCi0JKENPTU1BTkQpOiBTdGFydCBzdGF0ZSBhbmQgaXRzIHJ1bGVzIHJlbW92ZWQuCi0JQXQgc3RhcnQgb2YgeXlsZXgsIHJldHVybiBpbnB1dCBzdGF0ZSB0b2tlbiBpZiBhdCBzdGFydCBvZiBpbnB1dC4KLQkobGV4X3JlZGlyZWN0KTogRG9uJ3QgbmVlZCB0byBzZXQgeXlvdXQuCi0JKGxkbGV4X2NvbW1hbmQpOiBGdW5jdGlvbiByZW1vdmVkLgotCSogbGRtYWluLmMgKG1haW4pOiBJbnN0ZWFkIG9mIGNhbGxpbmcgcGFyc2VfbGluZSwgc2V0IHVwIHRoZQotCXJlZGlyZWN0aW9ucyBhbmQgY2FsbCB5eXBhcnNlIGRpcmVjdGx5LgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IElmIHRoZXJlJ3Mgbm8gaW5wdXQgZmlsZW5hbWUsIHByaW50IG5vdGhpbmcsIG5vdAotCSJjb21tYW5kIGxpbmUiLgotCSogbGV4c3VwLmM6IFJlbW92ZSAjaWYgMCdkIGNvZGUuCi0JKHBhcnNlX2xpbmUpOiBGdW5jdGlvbiByZW1vdmVkLgotCShwYXJzZV9hcmdzKTogUmV3cml0ZSB0byB1c2UgZ2V0b3B0X2xvbmdfb25seS4KLQkoc2V0X2RlZmF1bHRfZGlybGlzdCk6IE5ldyBmdW5jdGlvbiBmcm9tIGNvZGUgZm9ybWVybHkgaW4KLQlsZGdyYW0ueTpjb21tYW5kX2xpbmUuCi0JKHNldF9zZWN0aW9uX3N0YXJ0KTogTmV3IGZ1bmN0aW9uLgotCSogZW11bHRlbXBsL2dlbmVyaWMuZW0sIGVtdWx0ZW1wbC9nbGQ5NjAuZW0sIGVtdWx0ZW1wbC9ocHBhZWxmLmVtLAotCWVtdWx0ZW1wbC9sbms5NjAuZW0sIGVtdWx0ZW1wbC9tODhrYmNzLmVtOiBEb24ndCBlbmNsb3NlCi0JY29tcGlsZWQtaW4gbGluayBzY3JpcHRzIGluICJ7IiBhbmQgIn0iLCBhcyB0aGUgZ3JhbW1hciBubyBsb25nZXIKLQl3YW50cyB0aGVtIHRvIGJlLgotCi1UaHUgRmViIDI0IDA4OjQzOjI2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxkLmR2aSk6IERlcGVuZCBvbiBjb25maWdkb2MudGV4aSwgYnV0IGRvbid0Ci0JcmVxdWlyZSB0aGF0IGl0IGJlIGluICQoc3JjZGlyKS4KLQotVHVlIEZlYiAyMiAwOToyMToxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBPbmx5IGFsaWduIHNlY3Rpb24gdG8gYWxpZ25tZW50Ci0JcmVxdWlyZWQgYnkgbGlua2VyIHNjcmlwdCwgbm90IHRvIG1heGltdW0gYWxpZ25tZW50IG9mIGlucHV0Ci0Jc2VjdGlvbnMuCi0KLQkqIGxkbGFuZy5oIChsYXJnZXN0X3NlY3Rpb24pOiBEb24ndCBkZWNsYXJlLgotCSogbGRsYW5nLmMgKGxhcmdlc3Rfc2VjdGlvbik6IERvbid0IGRlZmluZS4KLQkoc2l6ZV9pbnB1dF9zZWN0aW9uKTogRG9uJ3Qgc2V0IGxhcmdlc3Rfc2VjdGlvbjsgbm90IHVzZWQuCi0KLU1vbiBGZWIgMjEgMTU6MTU6MjkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogUGFzcyBOVUxMIGFzIGxhc3QgYXJndW1lbnQgdG8gY29uY2F0LgotCi1UaHUgRmViIDE3IDE1OjUxOjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMsIGxkbWFpbi5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCi0JKiBsZG1pc2MuaCAoY29uY2F0KTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxkbWlzYy5jIChjb25jYXQpOiBEb24ndCBkZWZpbmU7IGp1c3QgdXNlIHRoZSBvbmUgaW4gbGliaWJlcnR5LgotCi0JKiBsZC5oIChhc19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBSZW1vdmVkOyBub3QgdXNlZC4KLQotVGh1IEZlYiAxNyAwOTozMjoxNCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jLCBsZG1haW4uYywgbGRtaXNjLmM6IFVzZSBiZmRfZ2V0X2Vycm9yIGFuZAotCWJmZF9zZXRfZXJyb3IgYW5kIG5ldyBlcnJvciBuYW1lcy4KLQotVHVlIEZlYiAxNSAyMDoxNDo1MyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBJZiB0aGUgY29va2VkIHNpemUgb2YgdGhlIHNlY3Rpb24KLQloYXMgYmVlbiBzZXQsIHVzZSBpdCwgZm9yIGRldGVybWluaW5nIGxpbmtfb3JkZXIgc2l6ZS4KLQkobGR3cml0ZSk6IEluIHRoZSBlcnJvciBtZXNzYWdlIGRpc3BsYXllZCBpZiBiZmRfZmluYWxfbGluayBmYWlscywKLQlpbmRpY2F0ZSB0aGF0IGl0IHdhcyBpbiBmYWN0IHRoZSBmaW5hbCBsaW5rIHN0ZXAgdGhhdCBmYWlsZWQuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBDbGVhciBiZmRfZXJyb3IgYmVmb3JlIGNhbGxpbmcKLQliZmRfcmVsYXhfc2VjdGlvbiwgaW4gY2FzZSBpdCByZXR1cm5zIGZhbHNlIGJ1dCBkb2Vzbid0IGZsYWcgYW4KLQllcnJvci4gIElmIGFuIGVycm9yIGlzIHJldHVybmVkLCBpbmRpY2F0ZSB3aGljaCBvbmUgaXQgaXMgaW4gdGhlCi0JZXJyb3IgbWVzc2FnZS4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IERlcGVuZCBvbiBsZC5pbmZvLCBhbmQgdXNlICIkPCoiIHNvCi0JaXQnbGwgZ2V0IHBpY2tlZCB1cCBmcm9tICQoc3JjZGlyKSBpZiBhcHByb3ByaWF0ZS4KLQotVHVlIEZlYiAxNSAxNjozMjowNCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IE9ubHkgcGFkIC50ZXh0IGlmIFBBRF9URVhUIGlzIHNldC4KLQkqIGVtdWxwYXJhbXMvaTM4Nm1hY2guc2ggKFBBRF9URVhUKTogU2V0IFBBRF9URVhULgotCi1GcmkgRmViIDExIDE3OjAyOjQ5IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubCAoY29tbWVudCk6IEluY3JlbWVudCBsaW5lIG51bWJlciB3aGVuIG5ld2xpbmUgaXMgcmVhZC4KLQotRnJpIEZlYiAxMSAxNzozNjoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsb29rdXBfbmFtZSk6IFRha2UgbmV3IGFyZ3VtZW50LCBmb3JjZV9sb2FkLiAgSWYgdHJ1ZSwKLQlyZWxvYWQgdGhlIGZpbGUgZXZlbiBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4KLQkod2lsZCk6IENhbGwgbG9va3VwX25hbWUgd2l0aCBmb3JjZV9sb2FkIGFyZ3VtZW50IG9mIDAuCi0JKG9wZW5faW5wdXRfYmZkcyk6IENhbGwgbG9va3VwX25hbWUgd2l0aCBmb3JjZV9sb2FkIGFyZ3VtZW50IG9mIDEuCi0JKHByaW50X3N5bWJvbCk6IFJlbW92ZSBkZWNsYXJhdGlvbiBvZiBub24tZXhpc3RlbnQgZnVuY3Rpb24uCi0JKHByaW50X29uZV9zeW1ib2wpOiBSZXR1cm4gdHJ1ZSByYXRoZXIgdGhhbiBmYWxsaW5nIG9mZiBlbmQuCi0KLVRodSBGZWIgMTAgMTE6NTI6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAobWFpbik6IFVzZSAlbGQgd2hlbiBwcmludGluZyBsb25nIHZhbHVlcy4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBNb3ZlIF9lZGF0YSBhZnRlciB0aGUgLnNkYXRhIHNlY3Rpb24uCi0JUGVybWl0IE9USEVSX0JTU19TWU1CT0xTIHRvIGJlIGRlZmluZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zIChPVEhFUl9CU1NfU1lNQk9MUyk6IERlZmluZSBfZmJzcy4KLQotTW9uIEZlYiAgNyAxNjozMToxNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogUmVuYW1lIGFsbCAiaHBwYW9zZiIgZmlsZXMgdG8gImhwcGFlbGYiLgotCSogQ2hhbmdlIGFsbCAib3NmIiByZWZlcmVuY2VzIHRvICJlbGYiIGluIGhwcGFlbGYgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCi1TdW4gRmViICA2IDIwOjMxOjU2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKG1haW4pOiBDYWxsIHhhdGV4aXQsIG5vdCBhdGV4aXQuCi0JQ2FsbCB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBDaGVjayBpZiBiZmRfcmVsYXhfc2VjdGlvbiBzZXQKLQliZmRfZXJybm8uCi0KLVNhdCBGZWIgIDUgMDM6NTQ6MzQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvbG5rOTYwLmVtIChhcHBlbmQpLCBlbXVsdGVtcGwvaHBwYW9zZi5lbQotCShocHBhb3NmX2ZpbmlzaCk6IENhbGwgeG1hbGxvYywgbm90IGxkbWFsbG9jLgotCSogbGRtYWluLmMgKHByZXNlcnZlX291dHB1dCk6IEZ1bmN0aW9uIHJlbW92ZWQuCi0JKG1haW4pOiBEbyBpdCBoZXJlIGluc3RlYWQuCi0KLUZyaSBGZWIgIDQgMjM6MDI6MTkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxkbGFuZy5oIChMQU5HX0ZPUl9FQUNIX3tJTlBVVCxPVVRQVVR9X1NFQ1RJT04pOiBEZWxldGUgKHVudXNlZCkKLQlHTlUgQyBzcGVjaWZpYyBtYWNyb3MuCi0KLQkqIGVtdWx0ZW1wbC9ocHBhb3NmLmVtIChocHBhb3NmX2ZpbmlzaCk6IEV4cGFuZCB0aGUgb25seSByZW1haW5pbmcKLQljYWxsIHRvIExBTkdfRk9SX0VBQ0hfSU5QVVRfU0VDVElPTi4KLQotRnJpIEZlYiAgNCAxNjoyNjowOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jIChsZG1hbGxvYywgeG1hbGxvYywgbGRyZWFsbG9jLCB4cmVhbGxvYyk6IEZ1bmN0aW9ucwotCWRlbGV0ZWQ7IHdpbGwgdXNlIGxpYmliZXJ0eSB2ZXJzaW9ucyBpbnN0ZWFkLgotCSogbGRjdG9yLmMgbGRmaWxlLmMgbGRsYW5nLmMgbGRtYWluLmMgbGRtaXNjLmMgbGRtaXNjLmggbGV4c3VwLmMKLQltcmkuYyBNYWtlZmlsZS5pbjogQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBSZW1vdmUgY2xlYW51cCBjb2RlLgotCSogbGRtYWluLmMgKHJlbW92ZV9vdXRwdXQpOiBQdXQgaXQgaGVyZSAobmV3IGZ1bmN0aW9uKS4KLQkocHJlc2VydmVfb3V0cHV0KTogTmV3IGZ1bmN0aW9uLgotCShtYWluKTogUmVnaXN0ZXIgcmVtb3ZlX291dHB1dCBhbmQgcHJlc2VydmVfb3V0cHV0IHdpdGggYXRleGl0LgotCSogbGRtYWluLmMgbGRncmFtLnk6IENhbGwgeGV4aXQgaW5zdGVhZCBvZiBleGl0LgotCSogbGRtaXNjLmg6IERlY2xhcmUgeGV4aXQuCi0KLUZyaSBGZWIgIDQgMTU6MTk6MDEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IExvdHMgb2YgbmV3IEg4LzUwMCBtZW1vcnkgbW9kZWxzLgotCi1TdW4gSmFuIDMwIDE0OjMzOjQwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IFJlbW92ZWQgZHVwbGljYXRlIHJ1bGVzLgotCSh5eXdyYXApOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbiwgbmVlZGVkIHdpdGggc29tZSB2ZXJzaW9ucyBvZgotCWZsZXguCi0KLUZyaSBKYW4gMjggMDk6MTI6NTYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogRm9yIGAlSScsIGlmIHRoZSBmaWxlIGlzIGluIGFuIGFyY2hpdmUsIHByaW50Ci0JdGhlIGFyY2hpdmUgZmlsZW5hbWUgdG9vLgotCi0JKiBsZGxleC5sOiBBZGQgcnVsZSB0byBjYXRjaCBpbnZhbGlkIGlucHV0IGNoYXJhY3RlcnMgaW5zdGVhZCBvZgotCXByaW50aW5nIHRoZW0uICBJbmNsdWRlICJsZG1haW4uaCIgZm9yIHByb2dyYW1fbmFtZSBkZWNsLgotCShsZXhfd2Fybl9pbnZhbGlkKTogTmV3IGZ1bmN0aW9uLgotCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlbmN5LgotCi1GcmkgSmFuIDI4IDEyOjU4OjQ1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IERvbid0IGJvdGhlciBydW5uaW5nIGFueSB0ZXN0cyBvZgotCWNyb3NzLWxpbmtlciB1bnRpbCB0aGUgdGVzdCBzdWl0ZSBubyBsb25nZXIgYXNzdW1lcyBuYXRpdmUgbW9kZS4KLQotVGh1IEphbiAyNyAxNzoxOTo1NCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAocHJpbnRfb25lX3N5bWJvbCwgcHJpbnRfaW5wdXRfc2VjdGlvbik6ICBQcmludAotCWdsb2JhbCBzeW1ib2xzIGluIHN5bWJvbCB0YWJsZSBhZ2Fpbi4KLQotVGh1IEphbiAyNyAxMjozNTowMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIGxkbWFpbi5oIGxkZ3JhbS55OiBJZiAtdiAtViBvciAtLXZlcnNpb24gd2FzIGdpdmVuLAotCWV4aXQgc3VjY2Vzc2Z1bGx5IGluc3RlYWQgb2YgY29tcGxhaW5pbmcgaWYgbm8gaW5wdXQgZmlsZXMgYXJlCi0JZ2l2ZW4uCi0KLVR1ZSBKYW4gMjUgMTM6MTk6NDEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRm9ybWF0IHZhcmlhYmxlIGRlZmluaXRpb25zIGNvbnNpc3RlbnRseS4KLQkoTERfUFJPRyk6IFJlbW92ZSB1bm5lY2Vzc2FyeSB2YXJpYWJsZXMgZnJvbSBsaW5rIGNvbW1hbmQsCi0JY2hhbmdlIHZhcmlhYmxlIExPQURMSUJFUyB0byBFWFRSQUxJQlMuCi0KLQkqIGxkbWFpbi5jIChtYWluKTogQ29tcHV0ZSBhbmQgZGlzcGxheSB0b3RhbCBleGVjdXRpb24gdGltZS4KLQkqIGxkLnRleGluZm8gKC1zdGF0cyk6IERvY3VtZW50IHRoZSBvcHRpb24uCi0KLU1vbiBKYW4gMjQgMTI6NTY6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAocmVsb2Nfb3ZlcmZsb3cpOiBBZGRlZCBuYW1lLCByZWxvY19uYW1lIGFuZCBhZGRlbmQKLQlhcmd1bWVudHMuCi0KLQkqIGxkbGFuZy5jIChsb29rdXBfbmFtZSk6IFNldCBCRkQgR1Agc2l6ZSB0byAtRyBhcmd1bWVudCB2YWx1ZQotCWFmdGVyIG9wZW5pbmcgQkZELgotCi0JKiBsZGxhbmcuYyAocmVsYXhpbmcpOiBSZW1vdmVkIGdsb2JhbCB2YXJpYWJsZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgdGhlIGNhbm9uaWNhbCBzeW1ib2xzIGhhdmUgbm90IGFscmVhZHkKLQliZWVuIHJlYWQgaW4sIHJlYWQgdGhlbSBpbiBiZWZvcmUgcmVsYXhpbmcuCi0JKiBsZGxhbmcuaCAocmVsYXhpbmcpOiBSZW1vdmVkIGRlY2xhcmF0aW9uLgotCi1GcmkgSmFuIDIxIDAwOjQ0OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IEluaXRpYWxpemUgbG9hZGVkIGZpZWxkIHRvIGZhbHNlLgotCShsb29rdXBfbmFtZSk6IElmIGZpbGUgd2FzIGFscmVhZHkgbG9hZGVkLCBkb24ndCBjYWxsIHRoZQotCWFkZF9zeW1ib2xzIGVudHJ5IHBvaW50IGFnYWluLgotCi1XZWQgSmFuIDE5IDEzOjU3OjAwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGQudGV4aW5mbzogQ2xhcmlmeSB3aGF0IC1UIG9wdGlvbiBkb2VzLgotCi1UdWUgSmFuIDE4IDE2OjE4OjE1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2M6IERvbid0IHVzZSBDUkVBVEVfT0JKRUNUX1NZTUJPTFMsIHRoYXQncwotCWZvciBhLm91dC4KLQotVHVlIEphbiAxMSAxMzoyMjowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChhZGRfYXJjaGl2ZV9lbGVtZW50KTogSWYgdHJhY2VfZmlsZXMgb3IKLQl0cmFjZV9maWxlX3RyaWVzLCBwcmludCBmaWxlIG5hbWUuCi0JKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBMaWtld2lzZS4KLQkobGRsYW5nX2FkZF9maWxlKTogRG9uJ3QgcHV0IGZpbGVzIG9uIGlucHV0X2JmZHMgbGlzdCBpbiByZXZlcnNlCi0Jb3JkZXIuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQ29ycmVjdCB0eXBvLgotCi1Nb24gSmFuIDEwIDE5OjQ5OjA1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnksIGxkbGV4Lmw6IE1ha2UgdGhlIHNwYWNlIGJldHdlZW4gLWUsIC11LCBhbmQgLXkgYW5kCi0JdGhlaXIgYXJndW1lbnRzIG9wdGlvbmFsLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgR05VIGxkLgotCi1GcmkgSmFuICA3IDIwOjAwOjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLmM6IERlZmluZSBfX2Jzc19zdGFydCBiZWZvcmUgdGhlIC5zYnNzIHNlY3Rpb24uCi0KLVRodSBKYW4gIDYgMDA6MTM6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoYWRkX3RvX3NldCk6IEFkZCBiaXRzaXplIGFyZ3VtZW50LgotCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IE5ldyBmdW5jdGlvbi4KLQkobGlua19jYWxsYmFja3MpOiBBZGQgY29uc3RydWN0b3JfY2FsbGJhY2suCi0JKiBsZGN0b3IuYyAoc3RydWN0IHNldF9pbmZvKTogQWRkIGJpdHNpemUgZmllbGQuCi0JKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogQWRkIGJpdHNpemUgYXJndW1lbnQuCi0JKGxkY3Rvcl9idWlsZF9zZXRzKTogQmFzZSB0aGUgc2l6ZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIHNldCBvbgotCXRoZSBiaXRzaXplLCByYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcgTE9ORy4KLQkqIGxkY3Rvci5oIChsZGN0b3JfYWRkX3NldF9lbnRyeSk6IEFkZCBiaXRzaXplIHRvIGRlY2xhcmF0aW9uLgotCi0JKiBsZC5oIChRVUFEX1NJWkUpOiBEZWZpbmUuCi0JKiBsZGdyYW0ueSAoUVVBRCk6IE5ldyB0b2tlbi4KLQkobGVuZ3RoKTogSGFuZGxlIGl0LgotCSogbGRsZXgubDogUmV0dXJuIFFVQUQuCi0JKiBsZXhzdXAuYyAoa2V5d29yZHMpOiBBZGQgUVVBRC4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IEhhbmRsZSBRVUFELgotCSogbGRsYW5nLmMgKHByaW50X2RhdGFfc3RhdGVtZW50KTogSGFuZGxlIFFVQUQuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTGlrZXdpc2UuCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdG9rZW4pOiBBZGQgUVVBRCB0byB0YWJsZS4KLQkqIGxkLnRleGluZm86IERlc2NyaWJlIFFVQUQuCi0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBEb24ndCBjcmVhdGUgLmxpdDQgb3IgLnNkYXRhIHNlY3Rpb25zLAotCXNpbmNlIHRoZSBBbHBoYSBkb2Vzbid0IHVzZSB0aGVtLgotCi1XZWQgSmFuICA1IDE3OjQyOjE2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRlbXVsLmggKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IENvbW1lbnQgdGhlIG1lbWJlcnMuCi0KLVNhdCBKYW4gIDEgMTM6Mzk6MzEgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgVlNUYSBtaWNyby1rZXJuZWwuCi0JKiBjb25maWcvdnN0YS5tdCwgZW11bHBhcmFtcy92c3RhLnNoOiBOZXcgZmlsZXMgZm9yIFZTVGEuCi0KLVNhdCBKYW4gIDEgMTA6NTM6MzUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBQYWQgLnRleHQgdG8gREFUQV9BTElHTk1FTlQgaWYgcmVsb2NhdGluZzsKLQluZWVkZWQgZm9yIGkzODZtYWNoLiAgKFNob3VsZCBiZSBhIG5vLW9wIG9uIG90aGVyIHN5c3RlbXMuKQotCi0JKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoIChTRUdNRU5UX1NJWkUpOiBGaXggYWdhaW4uCi0JKFBBR0VfU0laRSk6IERvbid0IGRlZmluZTsgbm90IHVzZWQuCi0KLUZyaSBEZWMgMzEgMTY6MTI6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSAoeXllcnJvcik6IE1ha2UgYXJndW1lbnQgY29uc3QgY2hhciAqLCBhbmQgYWN0dWFsbHkKLQlwcmludCBpdCBvdXQgcmF0aGVyIHRoYW4gYXNzdW1pbmcgaXQgaXMgYSBzeW50YXggZXJyb3IuCi0JKiBsZG1pc2MuaDogQ2hhbmdlIGRlY2xhcmF0aW9uIG9mIHl5ZXJyb3IuCi0JKiBsZGVtdWwuYywgbGR3cml0ZS5jOiBBZGQgLypBUkdTVVNFRCovIGFzIGFwcHJvcHJpYXRlLgotCi1GcmkgRGVjIDMxIDExOjM3OjI4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaCAoTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogRG9uJ3QgaW5jbHVkZQotCWV4ZWMgaGVhZGVyIG9mZnNldCwgc2luY2UgdGhlIGV4ZWMgaGVhZGVyIGlzbid0IGxvYWRlZC4KLQkoUEFHRV9TSVpFLCBTRUdNRU5UX1NJWkUpOiBBZ3JlZSB3aXRoIGJmZC9pMzg2bWFjaDMuYy4KLQotVGh1IERlYyAzMCAxMzowMTo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBIG1ham9yIHJld3JpdGUgdG8gbW92ZSB0aGUgYnVsayBvZiB0aGUgbGlua2VyIGludG8gQkZEIHNvIHRoYXQKLQltb3JlIGVmZmljaWVudCBiYWNrZW5kIGNvZGUgY2FuIGJlIHdyaXR0ZW4gZm9yIHNwZWNpZmljIG9iamVjdAotCWZpbGVzLgotCSogbGRlcnJvci5jLCBsZGVycm9yLmgsIGxkaW5kci5jLCBsZGluZHIuaCwgbGRzeW0uYywgbGRzeW0uaCwKLQlsZHdhcm4uYywgbGR3YXJuLmgsIHJlbGF4LmMsIHJlbGF4Lmg6IFJlbW92ZWQuCi0JKiBsZGN0b3IuYywgbGRjdG9yLmg6IENvbXBsZXRlIHJld3JpdGUuCi0JKiBsZHdyaXRlLmMsIGxkd3JpdGUuaDogQ29tcGxldGUgcmV3cml0ZS4KLQkqIGxkLmggKHN0cmlwX3N5bWJvbHNfdHlwZSwgc3RyaXBfc3ltYm9scyk6IFJlbW92ZWQuICBVc2UKLQlsaW5rX2luZm8uc3RyaXAgaW5zdGVhZC4gIENoYW5nZWQgYWxsIHVzZXMuCi0JKGRpc2NhcmRfbG9jYWxzX3R5cGUsIGRpc2NhcmRfbG9jYWxzKTogUmVtb3ZlZC4gIFVzZQotCWxpbmtfaW5mby5kaXNjYXJkIGluc3RlYWQuICBDaGFuZ2VkIGFsbCB1c2VzLgotCShsZF9jb25maWdfdHlwZSk6IFJlbW92ZWQgcmVsb2NhdGVhYmxlX291dHB1dCBmaWVsZDsgdXNlCi0JbGlua19pbmZvLnJlbG9jYXRlYWJsZSBpbnN0ZWFkOyBjaGFuZ2VkIGFsbCB1c2VzLiAgQWRkZWQgc3RhdHMKLQlmaWVsZC4KLQkoc2V0X2FzeW1ib2xfY2hhaW4sIGdldF9hc3ltYm9sX2NoYWluLCBnZXRfbG9hZGVyX3N5bWJvbCwKLQlzZXRfbG9hZGVyX3N5bWJvbCk6IFJlbW92ZWQuCi0JKiBsZGV4cC5oIChub2RlX2NsYXNzKTogQWRkZWQgZXRyZWVfcmVsLgotCShldHJlZV90eXBlKTogQWRkZWQgcmVsIGZpZWxkLgotCSogbGRleHAuYyAoZXhwX3ByaW50X3Rva2VuKTogQnJhY2tldGVkIHRhYmxlIGluaXRpYWxpemF0aW9uLgotCShleHBfcmVsb3ApOiBOZXcgZnVuY3Rpb24uCi0JKGZvbGRfbmFtZSk6IFVzZSBsaW5rZXIgaGFzaCB0YWJsZSByYXRoZXIgdGhhbiBsZHN5bSBmdW5jdGlvbnMuCi0JKGV4cF9mb2xkX3RyZWUpOiBMaWtld2lzZS4gIEFsc28sIGhhbmRsZSBldHJlZV9yZWwgY2FzZS4KLQkoZXhwX3ByaW50X3RyZWUpOiBIYW5kbGUgZXRyZWVfcmVsLgotCSogbGRncmFtLnkgKHN0cmlwX3N5bWJvbHMsIGRpc2NhcmRfbG9jYWxzKTogUmVtb3ZlZC4KLQkoT1BUSU9OX3N0YXRzLCBPUFRJT05fbm9fa2VlcF9tZW1vcnkpOiBOZXcgdG9rZW5zLiAgSGFuZGxlIHRoZW0uCi0JKFJFTCk6IE5ldyB0b2tlbi4gIERvZXMgbm90IGFwcGVhciBpbiBncmFtbWFyLCBidXQgbmVlZGVkIGZvcgotCWV4cHJlc3Npb24gY29kZS4KLQkoZmlsZSk6IERvbid0IGNhbGwgbGFuZ19maW5hbDsgaXQncyBjYWxsZWQgYnkgbWFpbiBhbnlob3cuCi0JKiBsZGxleC5sOiBBY2NlcHQgLXN0YXRzIGFuZCAtbm8ta2VlcC1tZW1vcnkgb3B0aW9ucy4KLQkqIGxkbGFuZy5oIChmaWxsX3R5cGUpOiBNYWtlIHVuc2lnbmVkIGludCwgbm90IHVuc2lnbmVkIHNob3J0LgotCSogbGRsYW5nLmM6IENvbnNpc3RlbnRseSB1c2UgZmlsbF90eXBlIGZvciBmaWxsIGFyZ3VtZW50LgotCShsYW5nX2luaXRfc2NyaXB0X2ZpbGUsIHNjcmlwdF9maWxlKTogUmVtb3ZlZC4KLQkoY3JlYXRlX29iamVjdF9zeW1ib2xzKTogUmVtb3ZlZC4gIFVzZQotCWxpbmtfaW5mby5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbiBpbnN0ZWFkLiAgQ2hhbmdlZCBhbGwKLQl1c2VzLgotCShsYW5nX2FkZF9rZWVwc3ltc19maWxlKTogUmVtb3ZlZC4KLQkobG9va3VwX25hbWUpOiBDYWxsIGJmZF9saW5rX2FkZF9zeW1ib2xzIGluc3RlYWQgb2YKLQlsZG1haW5fb3Blbl9maWxlX3JlYWRfc3ltYm9sLgotCSh3aWxkKTogRG9uJ3QgaXRlcmF0ZSBvdmVyIHNjcmlwdF9maWxlLgotCShvcGVuX291dHB1dCk6IENyZWF0ZSBsaW5rIGhhc2ggdGFibGUuCi0JKGxhbmdfcGxhY2VfdW5kZWZpbmVkcyk6IFJld3JvdGUuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEhhbmRsZSByZWxheGluZyAoZG9lc24ndCB3b3JrIHlldCkuCi0JKGxhbmdfcmVsb2NhdGVfZ2xvYmFscyk6IFJlbW92ZWQuCi0JKGxhbmdfZmluaXNoKTogVXNlIGxpbmsgaGFzaCB0YWJsZSByYXRoZXIgdGhhbiBsZHN5bSBmdW5jdGlvbnMuCi0JKGxhbmdfY29tbW9uKTogUmV3cm90ZS4KLQkobGFuZ19vbmVfY29tbW9uKTogTmV3IGZ1bmN0aW9uLgotCShsZGxhbmdfYWRkX2ZpbGUpOiBBZGQgZmlsZSB0byBsaW5rX2luZm8uaW5wdXRfYmZkcyBsaXN0LiAgU2V0Ci0JdXNyZGF0YS4KLQkoY3JlYXRlX3N5bWJvbCk6IFJlbW92ZWQuCi0JKGxhbmdfcHJvY2Vzcyk6IERvbid0IGNhbGwgbGFuZ19pbml0X3NjcmlwdF9maWxlLiAgQ2FsbAotCWxkY3Rvcl9idWlsZF9zZXRzIHJhdGhlciB0aGFuIGZpbmRfY29uc3RydWN0b3JzLiAgRG9uJ3QgY2FsbAotCWxhbmdfcmVsb2NhdGVfZ2xvYmFscy4KLQkobGFuZ19hYnNfc3ltYm9sX2F0X2JlZ2lubmluZ19vZik6IFJld3JvdGUuCi0JKGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YpOiBSZXdyb3RlLgotCSogbGRtYWluLmMgKGhhZF95KTogUmVtb3ZlZC4KLQkobHByZWZpeCwgbHByZWZpeF9sZW4pOiBSZW1vdmVkOyB1c2UgbGlua19pbmZvIGZpZWxkcyBpbnN0ZWFkLgotCUNoYW5nZWQgYWxsIHVzZXMuCi0JKG11bHRpcGxlX2RlZl9jb3VudCwgY29tbW9uc19wZW5kaW5nLCB1bmRlZmluZWRfZ2xvYmFsX3N5bV9jb3VudCwKLQl0b3RhbF9zeW1ib2xzX3NlZW4sIHRvdGFsX2ZpbGVzX3NlZW4pOiBSZW1vdmVkLgotCShsaW5rX2NhbGxiYWNrcywgbGlua19pbmZvKTogTmV3IHZhcmlhYmxlcy4KLQkobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLiAgRG9uJ3QgY2FsbCBpbml0X2JmZF9lcnJvcl92ZWN0b3Igb3IKLQlsZHN5bV9pbml0LiAgRG9uJ3Qgc2V0IG5vdyB1bnVzZWQgdmFyaWFibGVzLiAgSGFuZGxlIC1zdGF0cy4KLQkoZ2V0X2VtdWxhdGlvbik6IFJlbW92ZWQgb2Jzb2xldGUgYW5kIG5vbmZ1bmN0aW9uYWwgR05VOTYwIGNvZGUuCi0JKGFkZF95c3ltKTogUmV3cm90ZS4KLQkocmVhZF9lbnRyeV9zeW1ib2xzLCByZWZpemUsIGVudGVyX2dsb2JhbF9yZWYsIGVudGVyX2ZpbGVfc3ltYm9scywKLQlzZWFyY2hfbGlicmFyeSwgZ251OTYwX2NoZWNrX2Zvcm1hdCwgZGVjb2RlX2xpYnJhcnlfc3ViZmlsZSwKLQlsaW5lYXJfbGlicmFyeSwgc3ltZGVmX2xpYnJhcnksIGNsZWFyX3N5bXMsIHN1YmZpbGVfd2FudGVkX3ApOgotCVJlbW92ZWQuCi0JKGFkZF9rZWVwc3ltc19maWxlLCBhZGRfYXJjaGl2ZV9lbGVtZW50LCBtdWx0aXBsZV9kZWZpbml0aW9uLAotCW11bHRpcGxlX2NvbW1vbiwgYWRkX3RvX3NldCwgd2FybmluZ19jYWxsYmFjaywgdW5kZWZpbmVkX3N5bWJvbCwKLQlyZWxvY19vdmVyZmxvdywgcmVsb2NfZGFuZ2Vyb3VzLCB1bmF0dGFjaGVkX3JlbG9jLCBub3RpY2VfeXN5bSk6Ci0JTmV3IGZ1bmN0aW9ucy4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBBY2NlcHQgYSBzdHJpbmcgZm9yICVULCBub3QgYSBzeW1ib2wuICBEb24ndAotCXJlcXVpcmUgc3ltYm9scyBmb3IgJUM7IGxvb2sgdGhlbSB1cCBpbnN0ZWFkLgotCSogZW11bHRlbXBsL2hwcGFvc2YuZW06IFBhc3MgbGlua19pbmZvIHRvCi0JaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBSZW1vdmVkIGxkZXJyb3IuYywgbGRpbmRyLmMsIGxkc3ltLmMsIGxkd2Fybi5jLCBhbmQKLQlyZWxheC5jLgotCShIRklMRVMpOiBSZW1vdmVkIGxkZXJyb3IuaCwgbGRpbmRyLmgsIGxkc3ltLmgsIGxkd2Fybi5oLCBhbmQKLQlyZWxheC5oLgotCShFTVVMQVRJT05fT0ZJTEVTKTogRGVwZW5kIG9uIGJmZGxpbmsuaCwgbGRtYWluLmgsIGxkZXhwLmgsCi0JbGRsYW5nLmggYW5kIGxkY3Rvci5oLgotCi0JKiBNYWtlZmlsZS5pbiAobGRsZXguYyk6IERvbid0IGRlcGVuZCBvbiBsZGdyYW0uaC4gIFJlbW92ZQotCWRlY2xhcmF0aW9ucyBvZiBmcmVlIGFuZCBtYWxsb2MgZnJvbSBmbGV4IG91dHB1dC4gIENoYW5nZSBtYWxsb2MKLQl0byBsZG1hbGxvYyBpbiBmbGV4IG91dHB1dC4KLQotVGh1IERlYyAxNiAyMToxOTo1NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGRtYWluLmMgKGxwcmVmaXgpOiBDaGFuZ2UgZGVmYXVsdCBmcm9tIGEgY2hhciB0byBhIHN0cmluZwotCXdpdGggb25seSBvbmUgY2hhcmFjdGVyLgotCShscHJlZml4X2xlbik6IFNldCBkZWZhdWx0IHRvIG9uZS4KLQotCSogbGRtYWluLmggKGxwcmVmaXhfbGVuKTogRGVjbGFyZS4KLQotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBVc2Ugc3RybmNtcCByYXRoZXIgdGhhbiBhIGNoYXJhY3RlcgotCWNvbXBhcmlzb24gZm9yIGxwcmVmaXguCi0KLQkqIGVtdWx0bXBsL204OGtiY3MuZW0gKGJlZm9yZV9wYXJzZSk6IFNldCBscHJlZml4IGFuZCBscHJlZml4X2xlbgotCWNvcnJlY3RseS4KLQotCSogZW11bHRtcGwvaHBwYW9zZi5lbTogSW5jbHVkZSBsZGV4cC5oLgotCShiZWZvcmVfcGFyc2UpOiBTZXQgbHByZWZpeCBhbmQgbHByZWZpeF9sZW4gY29ycmVjdGx5LgotCi1UdWUgRGVjIDE0IDE3OjE5OjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXguaDogRG9uJ3QgZGVjbGFyZSB5eXdyYXAgaWYgaXQgaXMgYSBtYWNyby4KLQkqIGxkbGV4Lmw6IEluY2x1ZGUgc3lzZGVwLmguCi0JKiBsZGxhbmcuYyAobGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyLAotCWxhbmdfZm9yX2VhY2hfc3RhdGVtZW50KTogRm9yZ290IHRvIHVzZSBQQVJBTVMuCi0KLU1vbiBEZWMgMTMgMTQ6MzA6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgLlBIT05ZIHRhcmdldHMgd2hlcmUgYXBwcm9wcmlhdGUuICBBZGRlZCBzb21lCi0JY29tbWVudHMuICBBbHNvOgotCShnY2NsaWJkaXIsIHZlcnNpb24pOiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMuCi0JKERFUCk6IE5ldyB2YXJpYWJsZSwgc2V0IHRvIG1rZGVwLgotCShBTExfQ0ZMQUdTKTogTmV3IHZhcmlhYmxlLiAgVXNlZCBpbiAuYy5vIHRhcmdldC4KLQkoQ0ZJTEVTLCBIRklMRVMsIEdFTkVSQVRFRF9DRklMRVMsIEdFTkVSQVRFRF9IRklMRVMpOiBOZXcKLQl2YXJpYWJsZXMuCi0JKEhFQURFUlMsIE1BTlNPVVJDRVMsIExEQ1NPVVJDRVMsIEdFTkVSQVRFRF9TT1VSQ0VTLAotCUdFTkVSQVRFRF9IRUFERVJTLCBMRFNPVVJDRVMsIEJGRF9TT1VSQ0VTLCBTT1VSQ0VTKTogUmVtb3ZlZAotCW1vc3RseSBvYnNvbGV0ZSB2YXJpYWJsZXMuICBBZGp1c3RlZCByZW1haW5pbmcgdXNlcy4KLQkoREVGX0VNVUwpOiBSZW1vdmVkIHZhcmlhYmxlLgotCShsZG1haW4ubyk6IEhhbmRsZSB1bmRlZmluZWQgRU1VTCBlcnJvciBjb3JyZWN0bHkuCi0JKGxkZW11bC1saXN0LmgpOiBEZXBlbmQgb24gY29uZmlnLnN0YXR1cyByYXRoZXIgdGhhbiBNYWtlZmlsZS4KLQlDcmVhdGUgdmlhIHRlbXBvcmFyeSBmaWxlLgotCSh2ZXI5NjAuYywgcm9sbCwgbWFrZSk6IFJlbW92ZWQgb2Jzb2xldGUgdGFyZ2V0cy4KLQkoLmRlcCwgLmRlcDEsIGRlcC5zZWQsIGRlcCwgZGVwLWluKTogTmV3IHRhcmdldHMuICBVc2VkIHRvIHJlYnVpbGQKLQlkZXBlbmRlbmNpZXMuCi0JKiBkZXAtaW4uc2VkOiBOZXcgZmlsZSwgdXNlZCB3aGVuIHJlYnVpbGRpbmcgZGVwZW5kZW5jaWVzLgotCi1TYXQgRGVjIDExIDE0OjQzOjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCU1hZGUgbWFueSBjaGFuZ2VzIHRvIGVsaW1pbmF0ZSBnY2Mgd2FybmluZ3MuICBNYWRlIHZhcmlvdXMKLQljb3NtZXRpYyBjaGFuZ2VzLCBkZWNsYXJlZCB2YXJpb3VzIHRoaW5ncyBpbiBoZWFkZXIgZmlsZXMsIHJlbW92ZWQKLQl2YXJpb3VzIGV4dGVybiBkZWNsYXJhdGlvbnMgZnJvbSAuYyBmaWxlcy4gIE5vIHN1YnN0YW50aXZlCi0JY2hhbmdlcy4KLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IElmZGVmIG91dCBmaW5hbCBjYWxsIHRvCi0JbGFuZ19zaXplX3NlY3Rpb25zIGFnYWluIChyZXZlcnRpbmcgY2hhbmdlIG9mIE5vdmUgMiksIHNpbmNlIGl0Ci0JYnJlYWtzIHRoZSBTdW40IGxpbmtlci4KLQotVGh1IERlYyAgMiAxNjozMTo0NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQ7IHVzZSBhbHBoYS4KLQotV2VkIERlYyAgMSAxNDowNDoyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBHcm91cCB0YXJnZXRzIGJ5IENQVS4gIE1lcmdlIHNvbWUgbTY4ayB0YXJnZXQKLQllbnRyaWVzIHdpdGggZGlmZmVyZW50IENQVSBzcGVjcyB0aGF0IHVzZSB0aGUgc2FtZSBsZF90YXJnZXQKLQl2YWx1ZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHNwYXJjKi0qLWNvZmYuCi0JKiBjb25maWcvY29mZi1zcGFyYy5tdCwgZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW1fY29mZl9zcGFyYy5vLgotCShlbV9jb2ZmX3NwYXJjLmMpOiBBZGQgZGVwZW5kZW5jaWVzIGFuZCBidWlsZCBydWxlcy4KLQotCSogbGRtaXNjLmMgKGVycm5vLCBzeXNfbmVyciwgc3lzX2Vycmxpc3QpOiBEb24ndCBkZWNsYXJlLgotCi1XZWQgRGVjICAxIDEyOjE5OjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnkgKE9QVElPTl9jYWxsX3NoYXJlZCwgT1BUSU9OX25vbl9zaGFyZWQsIE9QVElPTl9PdmFsKToKLQlOZXcgdG9rZW5zLgotCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgdGhlbSAoZm9yIG5vdykuCi0JKiBsZGxleC5sICg8Q09NTUFORD4pOiBIYW5kbGUgLW5vbl9zaGFyZWQsIC1jYWxsX3NoYXJlZCwgYW5kIC1PbgotCXdoZXJlIG4gaXMgYSBudW1iZXIuCi0KLU1vbiBOb3YgMjIgMTQ6MTQ6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoc3ViZmlsZV93YW50ZWRfcCk6IElmIG1lcmdpbmcgYSBjb21tb24gc3ltYm9sIHdoaWNoIGlzCi0Jbm90IGluIGJmZF9jb21fc2VjdGlvbiwgY3JlYXRlIHRoZSBzZWN0aW9uIGluIHRoZSBCRkQgc28gdGhhdCBpdAotCWNhbiBiZSBwbGFjZWQgaW4gdGhlIHJpZ2h0IG91dHB1dCBzZWN0aW9uLgotCi1GcmkgTm92IDE5IDE0OjEyOjM5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDUqKTogTmV3IHRhcmdldC4gIFVzZSBtaXBzYi1lbGYzMi4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBzYi5zaCAoREFUQV9BRERSKTogRGVmaW5lLgotCShPVEhFUl9SRUFET05MWV9TRUNUSU9OUyk6IERlZmluZSBmb3IgLnJlZ2luZm8uCi0JKEVYRUNVVEFCTEVfU1lNQk9MUyk6IERlZmluZSBmb3IgX0RZTkFNSUNfTElOSy4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogVXNlIEVYRUNVVEFCTEVfU1lNQk9MUyB3aGVuIG5vdCByZWxvY2F0aW5nLgotCU1vdmUgT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMgYWZ0ZXIgYWxsIHRoZSBvdGhlciByZWFkb25seQotCXNlY3Rpb25zLiAgRG9uJ3QgdXNlIERBVEFfQUREUiB0d2ljZS4KLQotCSogbGRtYWluLmMgKGVudGVyX2ZpbGVfc3ltYm9scyk6IFJlbW92ZWQgZHVwbGljYXRlIHRlc3RzIG9mIHAuICBJZgotCXAgaXMgaW4gYSBjb21tb24gc2VjdGlvbiwgbWFrZSBzdXJlIHRoZSBCRkQgaGFzIGEgc2VjdGlvbiBvZiB0aGF0Ci0JbmFtZS4KLQotCSogbGRsYW5nLmMgKGxhbmdfY29tbW9uKTogQWRkIG5ld2xpbmUgdG8gZXJyb3IgbWVzc2FnZS4KLQotVGh1IE5vdiAxMSAxNTo1NDo0MSAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvbTY4a2x5bnguc2ggKFNDUklQVF9OQU1FKTogRGVmaW5lIHRvIHVzZSBhCi0JTHlueC1zcGVjaWZpYyBzY3JpcHQgaW5zdGVhZCBvZiBtNjhrY29mZi4KLQkoT1VUUFVUX0ZPUk1BVCk6IERlZmluZSBhcyAiY29mZi1tNjhrLWx5bngiLgotCShFTlRSWSk6IERlZmluZSBhcyBfX21haW4uCi0JKFRFWFRfU1RBUlRfQUREUik6IERlZmluZSBhcyAwLgotCShQQUdFX1NJWkUpOiBEZWZpbmUgYXMgMHgxMDAwLgotCSogZW11bHBhcmFtcy9pMzg2bHlueC5zaCwgZW11bHBhcmFtcy9zcGFyY2x5bnguc2g6IEZpeCBjb21tZW50LgotCSogc2NyaXB0dGVtcGwvbTY4a2x5bnguc2M6IE5ldyBmaWxlLgotCi1Nb24gTm92ICA4IDEyOjAwOjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGdldF9lbXVsYXRpb24pOiBJZ25vcmUgLW1pcHMxLCAtbWlwczIgYW5kIC1taXBzMwotCWFyZ3VtZW50cyByYXRoZXIgdGhhbiB0cmVhdGluZyB0aGVtIGFzIGVtdWxhdGlvbiBuYW1lcy4KLQotRnJpIE5vdiAgNSAwOTowMjo1MiAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGJsdWVzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCB4ODYgdW5peHdhcmUgYW5kIG5ldHdhcmUgcGx1cyBnZW5lcmljIG5ldHdhcmUuCi0KLUZyaSBOb3YgIDUgMjE6NDc6NTUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoIChURVhUX1NUQVJUX0FERFIsIE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6Ci0JQ29ycmVjdCB2YWx1ZXMgKD8pLgotCi1XZWQgTm92ICAzIDE1OjEwOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG9uJ3QgZGVsZXRlIGR2aSBvciBpbmZvIGZpbGVzLgotCShsZC5pbmZvKTogVXBkYXRlIGRlcGVuZGVuY3kgbGlzdC4KLQkobGQuZHZpKTogRGl0dG8uICBFeHRlbmQgVEVYSU5QVVRTIHRvIGdldCBiZmRzdW1tLnRleGkuCi0KLVdlZCBOb3YgIDMgMTI6MDc6MzkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfb3V0cHV0KTogVGFrZSBuZXcgYXJnLCBGUk9NX1NDUklQVC4KLQlTZXQgb3V0cHV0X2ZpbGVuYW1lIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgbm9kZS4KLQkob3Blbl9vdXRwdXQpOiBEb24ndCBzZXQgb3V0cHV0X2ZpbGVuYW1lLgotCShsYW5nX2ZpbmFsKTogQ3JlYXRlIHRoZSBuZXcgbm9kZSBoZXJlLgotCSogbGRsYW5nLmMsIGxkbGFuZy5oLCBsZGdyYW0ueSwgbXJpLmM6IHBhc3MgRlJPTV9TQ1JJUFQuCi0KLVR1ZSBOb3YgIDIgMTU6NDU6NTEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLSAJRnJvbSBQZXRlIEhvb2dlbmJvb20gKGhvb2dlbkBjcy51dGFoLmVkdSk6Ci0KLQkqIHNjcmlwdHRlbXBsL2hwcGFvc2Yuc2M6IChfX19zdGFja196ZXJvLCBldGV4dCwgX2V0ZXh0LAotCWVkYXRhLCBfZWRhdGEsIGVuZCk6IEFkZCBkZWZpbml0aW9ucyBvZiB0aGVzZSBzeW1ib2xzLgotCShfX2VuZCk6ICBSZW1vdmUgZGVmaW5pdGlvbiBvZiB0aGlzIHN5bWJvbC4KLQkoX19kYXRhX3N0YXJ0KTogTW92ZSBkZWZpbml0aW9uIG9mIHRoaXMgc3ltYm9sLgotCi0JKiBlbXVsdGVtcGwvaHBwYW9zZi5lbTogIFZhcmlvdXMgZml4ZXMgYW5kIHN1cHBvcnQgZm9yIGxpbmtlciBzdHViCi0JZ2VuZXJhdGlvbi4KLQkoaHBwYW9zZl9maW5pc2gsIGhwcGFvc2Zfc2VhcmNoX2Zvcl9wYWRkaW5nX3N0YXRlbWVudHMsCi0JaHBwYW9zZl9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6IE5ldyBmdW5jdGlvbnMgaW4KLQlzdXBwb3J0IG9mIGxpbmtlciBzdHViIGdlbmVyYXRpb24uCi0JKGxkX2hwcGFvc2ZfZW11bGF0aW9uKTogIFJlZGVmaW5lIHRvIGluY2x1ZGUgbmV3Ci0JZW11bGF0aW9uLXNwZWNpZmljIHJvdXRpbmVzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogUmUtZW5hYmxlIGxhc3QgY2FsbCBsYW5nX3NpemVfc2VjdGlvbnMuCi0JUGFzcyBhYnNfb3V0cHV0X3NlY3Rpb24gcmF0aGVyIHRoYW4gTlVMTCB0byBhdm9pZCBpbnZhbGlkYXRpbmcKLQlhYnNvbHV0ZSBzeW1ib2xzLgotCi1UaHUgT2N0IDI4IDIxOjE2OjQyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtX2kzODZtYWNoLm8uCi0JKGVtX2kzODZtYWNoLmMpOiBOZXcgcnVsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLW1hY2gqKTogTmV3IGNhc2UuCi0JKiBjb25maWcvaTM4Ni1tYWNoLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvaTM4Nm1hY2guc2g6IE5ldyBmaWxlLgotCi1GcmkgT2N0IDI5IDE0OjU1OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGQuaCAoZmxhZ19pc18qKTogUmVtb3ZlZCBtYWNyb3MuCi0JKiBsZG1haW4uYyAoZW50ZXJfZ2xvYmFsX3JlZiksIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKToKLQlDb25zaXN0ZW50bHkgY2hlY2sgdGhlIEJGRCBzeW1ib2wgZmxhZ3MgZGlyZWN0bHksIHJhdGhlciB0aGFuCi0JdXNpbmcgZmlsZV9pc18qIG1hY3Jvcy4KLQotVGh1IE9jdCAyOCAxOTowODo0MiAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbHlueG9zKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogQWRkIHJ1bGUgZm9yIGVtX3NwYXJjbHlueC5jLgotCShBTExfRU1VTEFUSU9OUyk6IEFkZCBMeW54IGVtdWxhdGlvbnMuCi0JKiBjb25maWcvc3BhcmMtbHlueC5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL3NwYXJjbHlueC5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2M6IE5ldyBmaWxlLgotCi1UaHUgT2N0IDI4IDEzOjUwOjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlbmN5IGZvciAkKEVNVUxBVElPTl9PRklMRVMpLgotCi1Nb24gT2N0IDI1IDE2OjA5OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsYXguYyAod3JpdGVfcmVsYXgpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX3NlY2xldF9saW5rLgotCi1Nb24gT2N0IDI1IDA5OjMxOjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmUpOiBOZXcgdmFyaWFibGUuCi0JKG9wZW5fb3V0cHV0KTogU2V0IGl0IGFmdGVyIGJmZCBvcGVuIHN1Y2NlZWRzLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IFRlc3QgaXQuCi0KLQlDaGFuZ2VzIGZyb20gUGV0ZXIgSG9vZ2VuYm9vbSwgaG9vZ2VuQGNzLnV0YWguZWR1OgotCi0JKiBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6IFNldCB0aGUgQlNGX0ZJTEUgZmxhZyBmb3Igb2JqZWN0Ci0Jc3ltYm9scy4KLQotCSogbGRlbXVsLmM6IFN1cHBvcnQgd2FzIGFkZGVkIHRvIGFsbG93IGVtdWxhdGlvbi1zcGVjaWZpYwotCXByb2Nlc3NpbmcgdG8gb2NjdXIuICBUaGlzIHN1cHBvcnQgd2FzIGFkZGVkIHByaW1hcmlseSBmb3IgbGlua2VyCi0Jc3R1YiBnZW5lcmF0aW9uIGluIHRoZSBlbGYzMi1ocHBhIGdsZC4KLQkobGRlbXVsX2ZpbmlzaCwgbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogIE5ldwotCWZ1bmN0aW9ucy4KLQkqIGxkZW11bC5oOiBTdXBwb3J0IHdhcyBhZGRlZCB0byBhbGxvdyBlbXVsYXRpb24tc3BlY2lmaWMKLQlwcm9jZXNzaW5nIHRvIG9jY3VyLiAoQXMgZGVzY3JpYmVkIGFib3ZlLikgIEFkZGVkIGZpbmlzaCBhbmQKLQljcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyBmaWVsZHMgdG8KLQlsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3Qgc3RydWN0dXJlLgotCSogbGRsYW5nLmM6IEFkZCBjYWxscyB0byBlbXVsYXRpb24tc3BlY2lmaWMgcm91dGluZXMuCi0JKGxhbmdfcHJvY2Vzcyk6ICBBZGQgY2FsbCB0bwotCWxkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyBmdW5jdGlvbi4KLQkobGFuZ19wcm9jZXNzKTogIEFkZCBjYWxsIHRvIGEgZW11bGF0aW9uLXNwZWNpZmljIHJvdXRpbmUgKGFuZAotCXNvbWUgcHJvY2Vzc2luZyBhZnRlciB0aGUgY2FsbCkuCi0KLUZyaSBPY3QgMjIgMjA6NTQ6MTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IG1pcHMqLSBpbnN0ZWFkIG9mIG1pcHMtLCBtaXBzKmVsIGNoYW5nZXMKLQotVHVlIE9jdCAxOSAxNTo0NjoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1vc2YqKTogTmV3IHRhcmdldDsgdXNlIGFscGhhLm10LgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW1fYWxwaGEuby4KLQkoZW1fYWxwaGEuYyk6IE5ldyB0YXJnZXQ7IHVzZSBhbHBoYS5zaCBhbmQgYWxwaGEuc2MuCi0JKiBjb25maWcvYWxwaGFvc2YubWggKE5BVElWRV9MSUJfRElSUywgSE9TVElOR19DUlQwKTogRGVmaW5lLgotCSogY29uZmlnL2FscGhhLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvYWxwaGEuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IE5ldyBmaWxlLgotCi1GcmkgT2N0IDE1IDAyOjIwOjA0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMsIGxhbmdfY29tbW9uKTogQUxJR05fTiBjYW4ndCBoYW5kbGUKLQl0eXBlcyBvZiBkaWZmZXJlbnQgc2l6ZXMgKGVnOiA2NCBhbmQgMzIgYml0cyksIHNvIGNvZXJjZS4KLQkqIGxkLmggKEFMSUdOX04pOiBBZGQgd2FybmluZyBhYm91dCB1c2FnZS4KLQotV2VkIE9jdCAxMyAxNjowMjozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChlbnRlcl9nbG9iYWxfcmVmKTogSnVzdCBpZ25vcmUgYW55IHdlYWsgc3ltYm9sIGZvcgotCXdoaWNoIHdlIGFscmVhZHkgaGF2ZSBhIGRlZmluaXRpb24sIHJhdGhlciB0aGFuIGNoZWNraW5nIGluCi0Jc2V2ZXJhbCBkaWZmZXJlbnQgcGxhY2VzIHdoZXRoZXIgdGhlIHN5bWJvbCBpcyB3ZWFrLgotCi1UdWUgT2N0IDEyIDE3OjMwOjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotZWxmKik6IE5ldyB0YXJnZXQ7IHVzZSBtaXBzYi1lbGYzMi4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogT25seSB1c2UgT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMgYW5kCi0JT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIGlmIHJlbG9jYXRpbmcuICBTaGVsbCB2YXJpYWJsZXMgYXJlIG5vdAotCWV4cGFuZGVkIHdpdGhpbiB0aGVtLgotCSogY29uZmlnL21pcHNiLWVsZjMyLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChlbV9lbGYzMm1pcGIuYyk6IE5ldyB0YXJnZXQuCi0KLVRodSBTZXAgMzAgMTc6MDA6MzYgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogSW4gaW5wdXRfbGlzdCwgY2hhbmdlIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0gdG8KLQlsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSBzbyBvYmplY3RzIGJyb3VnaHQgaW4gdXNpbmcKLQlJTlBVVCgpIGRvIGEgcGF0aCBsb29rdXAuCi0KLVR1ZSBTZXAgMjggMTM6MzE6MjMgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBMeW54IGxkX3RhcmdldCB0byBiZSB7aTM4NixtNjhrfS1seW54Ci0JaW5zdGVhZCBvZiB7aTM4NixtNjhrfS1jb2ZmLgotCSogTWFrZWZpbGUuaW4gKGVtX2kzODZseW54LmMsIGVtX202OGtseW54LmMpOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnL202OGstbHlueC5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2kzODZseW54LnNoOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvbTY4a2x5bnguc2g6IE5ldyBmaWxlLgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYzogTWFrZSBFTlRSWSBnZXQgaXRzIHZhbHVlIGZyb20gJHtFTlRSWX0sCi0JYnV0IGRlZmF1bHRpbmcgdG8gX3N0YXJ0LgotCi0JKiBsZGVtdWwuYywgbGRmaWxlLmMsIGxkbGFuZy5jLCBsZG1haW4uYywgbGRtaXNjLmMsIGxkbWlzYy5oLAotCWxkc3ltLmMsIGxkd2Fybi5jOiBSZW5hbWUgaW5mbyB0byBpbmZvX21zZywgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aAotCUx5bnhPUyBsaWJjLgotCi1UaHUgU2VwIDIzIDE0OjUxOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NvbGFyaXMyLm1oOiBOZXcgZmlsZS4gIERlZmluZSBIT1NUSU5HX0NSVDAgYW5kCi0JSE9TVElOR19MSUJTIGZvciB0ZXN0aW5nLgotCi1GcmkgU2VwIDE3IDE3OjUyOjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUZpbmlzaCB1cCBzdXBwb3J0IGZvciBpMzg2LXN5c3Y0ICh3aXRob3V0IHNoYXJlZCBsaWJyYXJpZXMpOgotCSogbGQuaCAoZmxhZ19pc193ZWFrKTogRGVmaW5lLgotCSogbGRsYW5nLmMgKHByaW50X3N5bWJvbCk6IE1lbnRpb24gd2hldGhlciBzeW1ib2wgaXMgd2Vhay4KLQkocHJpbnRfaW5wdXRfc2VjdGlvbik6IFByaW50IHdlYWsgc3ltYm9scyBhcyBnbG9iYWxzLgotCSogbGRtYWluLmMgKHJlZml6ZSk6IERvIG5vdCB6ZXJvIG91dCBCU0ZfV0VBSyBmbGFnLgotCShlbnRlcl9nbG9iYWxfcmVmKTogRG8gbm90IHdhcm4gaWYgYSB3ZWFrIHN5bWJvbCByZWRlZmluZXMgYQotCWdsb2JhbCBzeW1ib2wuICBEbyBub3QgbGV0IGEgd2VhayBzeW1ib2wgcmVkZWZpbmUgYSBjb21tb24gc3ltYm9sLgotCShlbnRlcl9maWxlX3N5bWJvbHMpOiBUcmVhdCB3ZWFrIHN5bWJvbHMgYXMgZ2xvYmFsIHN5bWJvbHMuCi0JKHN1YmZpbGVfd2FudGVkX3ApOiBEbyBub3QgcHVsbCBpbiBhbiBvYmplY3QgZmlsZSBmcm9tIGEgYXJjaGl2ZQotCWp1c3QgdG8gcmVzb2x2ZSBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogRG9uJ3QgbmVlZGxlc3NseSBtYWxsb2Mgc3BhY2UgYWZ0ZXIgYSBmYXRhbAotCWVycm9yOyB0aGUgZXJyb3IgbWlnaHQgYmUgdGhhdCBtYWxsb2MgaGFzIHJ1biBvdXQgb2Ygc3BhY2UuCi0JKiBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6IFRyZWF0IHdlYWsgc3ltYm9scyBhcyBnbG9iYWwuCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zeXN2NCosIGlbMzRdODYtKi1lbGYqKTogTmV3IHRhcmdldHM7Ci0JdXNlIGkzODYtZWxmLgotCSogY29uZmlnL2kzODZ2NC5taDogTmV3IGZpbGU7IHNldCBOQVRJVkVfTElCX0RJUlMgdG8gL3Vzci9jY3MvbGliLgotCSogY29uZmlnL2kzODYtZWxmLm10OiBOZXcgZmlsZTsgc2V0IEVNVUwgdG8gZWxmX2kzODYuCi0JKiBlbXVscGFyYW1zL2VsZl9pMzg2LnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogVXNlICR7Tk9QfSBhcyBmaWxsZXIgKGRlZmF1bHRzIHRvIDApLgotCSogTWFrZWZpbGUuaW4gKE5BVElWRV9MSUJfRElSUyk6IERlZmluZSB0byBiZSBlbXB0eS4KLQkoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW1fZWxmX2kzODYuby4KLQkoR0VOU0NSSVBUUyk6IFBhc3MgTkFUSVZFX0xJQl9ESVJTIGFzIHNpeHRoIGFyZ3VtZW50LgotCShlbV9lbGZfaTM4Ni5jKTogTmV3IHRhcmdldCwgbGlrZSBvdGhlciBlbV8qLmMgdGFyZ2V0cy4KLQkoJChMRF9QUk9HKSk6IFBhc3MgJChDRkxBR1MpIHRvICQoQ0MpLgotCSogZ2Vuc2NyaXB0cy5zaDogQWNjZXB0IE5BVElWRV9MSUJfRElSUyBhcyBzaXh0aCBhcmd1bWVudC4gIElmCi0Jbm9uZW1wdHksIGFuZCBjb25maWd1cmVkIGZvciBuYXRpdmUsIGFkZCBpdCB0byBMSUJfUEFUSC4KLQotRnJpIFNlcCAxNyAxMzowNzozOSAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3toODMwMC5zYyxoODUwMC5zYyxpMzg2Y29mZi5zYyxtNjhrY29mZi5zYyxzaC5zY306Ci0JQWRkZWQgc3RhdGVtZW50cyB0byBwYXNzIHN0YWIgYW5kIHN0YWJzdHIgc2VjdGlvbnMgdGhyb3VnaCBhbmQKLQltYXJrIHRoZW0gYXMgTk9MT0FELCB3aGljaCBtYWtlcyBHREIgaGFwcGllci4KLQotV2VkIFNlcCAxNSAxNjowMjoyOSAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IG02OGstbHlueC1seW54b3MgY29uZmlnLgotCi0JKiBNYWtlZmlsZS5pbjogVXNlICQoU0hFTEwpIHRvIHJ1biBnZW5zY3JpcHRzLnNoLgotCi1TdW4gU2VwIDEyIDE2OjA0OjQwIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2NvZmYtaDgzMDAubXQ6IEFkZCBFTVVMPWg4MzAwaC4KLQotCSogbGRtYWluLmMgKG1haW4pOiBDYWxsIHNldF9zY3JpcHRzX2RpciBhZnRlciBhcmd2IGhhcyBiZWVuIHByb2Nlc3NlZC4KLQotRnJpIFNlcCAxMCAwOTozNjoyOSAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBDWFggYmFjayB0byBnKysuCi0KLUZyaSBTZXAgMTAgMDk6MzQ6MjkgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEZpeGVkIFJVTlRFU1QqIENYWCBDWFhGTEFHUyBtYWNyb3MgYW5kIGNoZWNrIHJ1bGUuCi0KLUZyaSBTZXAgMTAgMDc6MjY6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVEFHUyk6IFVzZSBzaGVsbCB3aWxkY2FyZHMuCi0KLVR1ZSBTZXAgIDcgMTg6MDQ6NTQgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBhZGQgVEVYSU5QVVRTIHZhcmlhYmxlIGFuZCB1c2UgaXQgaW4gbGQuZHZpIHRhcmdldAotCi1GcmkgU2VwICAzIDE2OjQ2OjQxIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86IHJlLWVuYWJsZSBpbmNsdWRlZCBjb25maWcgZmlsZTsgY29uZGl0aW9uYWxpemUgZG9jCi0JZm9yIC1vZm9ybWF0IHRvIGludGVyYWN0IHByb3Blcmx5IHdpdGggU2luZ2xlRm9ybWF0IGRvYyBjb25maWcKLQl2YXI7IHJlbmFtZSBAdXAvQGRvd24gdG8gQHJhaXNlc2VjdGlvbnMvQGxvd2Vyc2VjdGlvbnMuCi0KLVdlZCBBdWcgMjUgMTY6Mjk6NTYgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtODgxMTAuCi0KLVR1ZSBBdWcgMjQgMTg6NDk6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JRnJvbSBQZXRlciBIb29nZW5ib29tIDxob29nZW5Ac2hhZmVyLmNzLnV0YWguZWR1PjoKLQkqIGVtdWx0ZW1wbC9ocHBhb3NmLmVtIChsZF9ocHBhb3NmX2VtdWxhdGlvbik6IENvcnJlY3QgbmFtZSBmb3IgUEEKLQlFTEYgZW11bGF0aW9uIGlzICJlbGYzMi1ocHBhIiBub3QgImVsZi1iaWciLgotCShocHBhb3NmX2JlZm9yZV9wYXJzZSk6IFJlbW92ZSB1bm5lZWRlZCBwcm9jZXNzaW5nIG9mIGVudmlyb25tZW50Ci0JdmFyaWFibGVzLgotCSogc2NyaXB0dGVtcGwvaHBwYW9zZi5zYzogSW5jbHVkZSAuaHBwYV9saW5rZXJfc3R1YnMgc2VjdGlvbnMgaW4KLQkudGV4dCBzZWdtZW50IG9mIG91dHB1dCBmaWxlLgotCSogZW11bHBhcmFtcy9ocHBhb3NmLnNoIChPVVRQVVRfRk9STUFUKTogVXNlIGVsZjMyLWhwcGEuCi0KLVR1ZSBBdWcgMjQgMTY6MTc6MDAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBsZC5oOiBkZWZpbmUgQllURV9TSVpFLCBTSE9SVF9TSVpFLCBhbmQgTE9OR19TSVpFIHdoaWNoIGFyZSBubwotCSAgbG9uZ2VyIGluIGJmZC5oLgotCi0JKiBsZGxhbmcuYywgbGQuaDogdXBkYXRlZCBjb3B5cmlnaHQuCi0KLVR1ZSBBdWcgMTcgMTU6MjI6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAob3Blbl9vdXRwdXQsIGxhbmdfY2hlY2spOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfc2V0X2FyY2hfbWFjaC4KLQotVHVlIEF1ZyAxNyAwNzowMjoxOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODUwMC5zYzogU3RhcnQgYWxsIHNlY3Rpb25zIGluIGEgZGlmZmVyZW50IHNlZ21lbnQuCi0JKiBzY3JpcHR0ZW1wbC96OGtzaW0uc2M6IEhhbmRsZSBjb25zdHJ1Y3RvcnMKLQotVGh1IEF1ZyAxMiAxNjowNTozNyAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0gICAgICAgICogTWFrZWZpbGUuaW46IHJldmVydCBlYXJsaWVyIGNoYW5nZXMgYmFjayB0byBleGVjdXRlIHJ1bnRlc3QKLSAgICAgICAgICB3aXRoIG1ha2UgY2hlY2suIGNkdGVzdCBhbmQgYm9vdHN0cmFwIG5vdyBmdW5jdGlvbiBhcyB0aGV5Ci0JICBkaWQgd2l0aGluIHRoZSBNYWtlZmlsZS4KLQotVGh1IEF1ZyAxMiAxMDoyMDowNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAJVXBkYXRlIGRlcGVuZGVuY2llcy4KLQotCSogY29uZmlndXJlLmluOiBTZXQgRU1VTEFUSU9OX09GSUxFUyBpbiBNYWtlZmlsZSBiYXNlZCBvbgotCS0td2l0aC10YXJnZXRzIG9wdGlvbi4KLQotVGh1IEF1ZyAxMiAwODo1MjoyOSAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2hlY2sgdGFyZ2V0cyByZWltcGxlbWVudGVkIHRvIG9sZCB3YXkuCi0KLVdlZCBBdWcgMTEgMDg6MjY6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaTM4NnYubWgsIGNvbmZpZy9pcml4NC5taDogVXNlIGdjYwotCS1wcmludC1saWJnY2MtZmlsZS1uYW1lIHJhdGhlciB0aGFuICQobGliZGlyKS9saWJnY2MuYS4KLQkqIGNvbmZpZy9pMzg2c2NvLm1oOiBOZXcgZmlsZTsgY29weSBvZiBpMzg2di5taCB0byBjb3JyZXNwb25kIHRvCi0JYmZkL2NvbmZpZ3VyZS5ob3N0IGNoYW5nZS4KLQotTW9uIEF1ZyAgOSAxNDoyNTozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSGFuZGxlIC5saW5lIGFuZCAuZGVidWcqIHNlY3Rpb25zLgotCi0JKiBsZGxleC5sOiBVc2UgYmZkX3NjYW5fdm1hLCBub3Qgc3RydG91bC4KLQotRnJpIEF1ZyAgNiAwODo1NzozOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmMsIGxkZmlsZS5jLCBsZGxhbmcuYywgbGV4c3VwLmMsIGxkbWFpbi5jLCBsZGVtdWwuYzoKLQlSZW1vdmUgaW5pdGFsIGNhcHMgaW4gc29tZSBlcnJvciBtZXNzYWdlcywgY2hhbmdlICJjYW4ndCIgdG8KLQkiY2Fubm90IiwgYWRkIG1pc3NpbmcgY29sb25zLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IFByaW50ICIlJSIgYXMgYSBzaW5nbGUgJS4KLQlGb3IgJyUnIGZvbGxvd2VkIGJ5IHVucmVjb2duaXplZCBjaGFyYWN0ZXIsIHByaW50IHRoZW0gYm90aAotCXZlcmJhdGltIGluc3RlYWQgb2YgZXhwZWN0aW5nIGEgY2hhciAqIGFyZy4KLQlGb3IgJyVDJywgZG9uJ3QgcHV0IHRoZSBmdW5jdGlvbiBuYW1lIGluIHBhcmVucy4KLQotCSogbGRleHAuYyAoaW52YWxpZCk6IFBhc3MgIiUlIiwgbm90ICIlICIuCi0KLUZyaSBBdWcgIDYgMTQ6MzE6MjIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBBbHdheXMgZGVmaW5lIF9mdGV4dCwgX2ZkYXRhLCBfZmJzcy4KLQkoQlNTX1ZBUik6IFJlbW92ZWQ7IG5vdyBhbHdheXMgZGVmaW5lIF9mYnNzLgotCSogZW11bHBhcmFtcy9taXBzaWR0LnNoLCBlbXVscGFyYW1zL21pcHNpZHRsLnNoIChCU1NfVkFSKToKLQlSZW1vdmVkLgotCi1UaHUgQXVnICA1IDE1OjU1OjE5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB6OGstY29mZiBpcyB0aGUgc2FtZSBhcyB6OGstc2ltCi0KLVdlZCBBdWcgIDQgMjE6MDA6MTggMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogdGVzdHN1aXRlL2xpYi9sZC5leHA6IG5ldyBmaWxlCi0JKiB0ZXN0c3VpdGUvY29uZmlnL3VuaXgtbGQuZXhwOiBuZXcgZmlsZQotCSogdGVzdHN1aXRlL2xkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBuZXcgZmlsZQotCSogTWFrZWZpbGUuaW46IGFkZCBkZWphZ251IHN1cHBvcnQgZm9yIG1ha2UgY2hlY2sKLQotV2VkIEF1ZyAgNCAxNzo1MjozMiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4LmwgKGNvbW1lbnQpOiBBZGQgbWlzc2luZyBuZXdsaW5lIGluIG1lc3NhZ2UuCi0JKiBsZGluZHIuYyAoYWRkX2luZGlyZWN0KTogRGl0dG8uCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogRGl0dG8uCi0KLVR1ZSBBdWcgIDMgMTA6NTc6NDEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSwgbGRsZXgubCwgbXJpLmMsIGxkd3JpdGUuYzogQ2hhbmdlIG11bHRpcGxlIGNvbW1vbnMKLQlpbnRvIGV4dGVybnMuCi0KLQkqIGxkbWlzYy5jIChtdWx0aXBsZV93YXJuKTogTmV3IGZ1bmN0aW9uLgotCSogbGRtaXNjLmg6IERlY2xhcmUgaXQuCi0JKiBsZG1haW4uYyAoZW50ZXJfZ2xvYmFsX3JlZik6IENhbGwgaXQuCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCB3YXJuX2NvbW1vbi4KLQkqIGxkbGV4LmwsIGxkZ3JhbS55OiBTZXQgaXQgd2l0aCAtd2Fybi1jb21tb24gb3B0aW9uLgotCSogbGR2ZXIuYyAoaGVscCk6IERvY3VtZW50IGl0LgotCi1Nb24gQXVnICAyIDEyOjA0OjM2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgaG9va3MgZm9yIC5zZGF0YSwgLnNic3MsIGFuZAotCXRhcmdldC1zcGVjaWZpYyBzZWN0aW9ucywgYW5kIGZvciBjaGFuZ2luZyBkYXRhIHNlY3Rpb24gdm1hLgotCi1Nb24gSnVsIDI2IDE0OjAwOjAyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSAoT1BUSU9OX1F5LCBPUFRJT05fWSwgT1BUSU9OX2RuLCBPUFRJT05fWVApOiBOZXcKLQl0ZXJtaW5hbHMsIGZvciBTb2xhcmlzLgotCShkaXJsaXN0X3B0cik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvbW1hbmRfbGluZV9vcHRpb24pOiBBY2NlcHQgbmV3IG9wdGlvbnMuCi0KLQkqIGxkbGV4Lmw6IEFjY2VwdCBjb21tYW5kLWxpbmUgb3B0aW9ucyAiLVF5IiwgIi1kbiIsICItWSIsIGFuZAotCSItWVAsLi4uIi4KLQotCSogY29uZmlnL3N1bjRzb2wyLm10OiBQYXNzIGVtdWxhdGlvbiBuYW1lIHdpdGhvdXQgIi5zaCIuCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJfc3BhcmMuYzogUmVuYW1lZCBmcm9tIGVsZjMyLXNwYXJjLmMuCi0JKiBjb25maWcvc3VuNHNvbDIubXQgKGVtX2VsZjMyX3NwYXJjLmMpOiBBZGp1c3RlZCBhY2NvcmRpbmdseS4KLQotRnJpIEp1bCAyMyAxMzo1MTowOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIHN1cHBvcnQgZm9yIC5pbml0LCAuZmluaSwgLmN0b3JzLAotCS5kdG9ycywgLmRhdGExLCAucm9kYXRhMSBzZWN0aW9ucywgaW5zdGVhZCBvZiBjb21iaW5pbmcgdGhlbSBpbnRvCi0Jb3RoZXIgc2VjdGlvbnMuICBGb3IgYC1yJywgc2V0IGFsbCBzZWN0aW9uIHN0YXJ0IGFkZHJlc3NlcyB0bwotCXplcm8uCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzItc3BhcmMuc2ggKFRFWFRfU1RBUlRfQUREUiwKLQlOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBWYWx1ZSBzaG91bGQgYmUgMHgxMDEwMC4KLQkoTUFYUEFHRVNJWkUpOiBSZW5hbWVkIGZyb20gUEFHRV9TSVpFLgotCi1XZWQgSnVsIDIxIDE0OjI4OjQyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2Vuc2NyaXB0cy5zaDogSWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBlbXVsYXRpb24sIHNldAotCUNPTVBJTEVfSU4uCi0JKiBlbXVsdGVtcGwvKi5lbTogVXNlIGl0IHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGNvbXBpbGUgaW4gdGhlCi0Jc2NyaXB0cy4KLQotCSogTWFrZWZpbGUuaW4gKEdFTlNDUklQVFMpOiBQYXNzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiBuYW1lIHRvCi0JZ2Vuc2NyaXB0cy5zaC4gIFBhc3MgdGhlIGN1cnJlbnQgZW11bGF0aW9uIG5hbWUgd2l0aG91dCAiLnNoIiBvbgotCXRoZSBlbmQuCi0JKiBnZW5zY3JpcHRzLnNoOiBUYWtlIGFuIGRlZmF1bHQgZW11bGF0aW9uIGFyZy4KLQlVc2UgdGhlIGN1cnJlbnQgZW11bGF0aW9uIG5hbWUgYXMgRU1VTEFUSU9OX05BTUUuCi0JTWFrZSBkZWZhdWx0IGxpYiBwYXRoIGZvciBjcm9zcy1jb21waWxpbmcgJzonLCBub3QgbnVsbC4KLQkqIGVtdWxwYXJhbXMvKi5zaDogRG9uJ3Qgc2V0IEVNVUxBVElPTl9OQU1FLgotCSogbGRlbXVsLmMgKGxkZW11bF9nZXRfc2NyaXB0KTogVGFrZSBpc2ZpbGUgYXJnLgotCVBhc3MgaXQgdG8gZW11bGF0aW9uJ3MgZ2V0X3NjcmlwdCBmdW5jdGlvbi4KLQkqIGxkZW11bC5oOiBBZGp1c3QgZ2V0X3NjcmlwdCBwcm90b3R5cGVzLgotCSogbGRmaWxlLmMgKGxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZSk6IFJlbmFtZWQgZnJvbSBmaW5kX2FfbmFtZS4KLQlObyBsb25nZXIgc3RhdGljLgotCSogbGRmaWxlLmg6IERlY2xhcmUgaXQuCi0JKiBsZGdyYW0ueTogQWNjZXB0IGEgc2NyaXB0IG9uIHRoZSBjb21tYW5kIGxpbmUgYWdhaW4sCi0JZm9yIHBhcnNpbmcgY29tcGlsZWQtaW4gc2NyaXB0cy4KLQkqIGxkbWFpbi5jIChtYWluKTogSWYgbGQgc2NyaXB0IGlzIGEgZmlsZSwgcGFyc2UgaXQgYXMgYSAtVAotCW9wdGlvbiwgb3RoZXJ3aXNlIHBhcnNlIGl0IGRpcmVjdGx5LgotCSogZW11bHRlbXBsLyouZW0gKCpnZXRfc2NyaXB0KTogUmV0dXJuIHRoZSBzY3JpcHRzIHRoZW1zZWx2ZXMgaWYKLQl0aGlzIGlzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbjsgb3RoZXJ3aXNlIHJldHVybiB0aGVpciBmaWxlIG5hbWVzLgotCSogZW11bHRlbXBsL204OGtiY3MuZW06IE5ldyBmaWxlLCB0byB0YWtlIG04OGtiY3MgI2lmZGVmIG91dCBvZgotCWdlbmVyaWMuZW0uCi0JKiBlbXVscGFyYW1zL204OGtiY3Muc2g6IFVzZSBpdC4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGU6OnVuaXhfcmVsb2NhdGUpOiBSZW1vdmUgdW51c2VkIGVsZW1lbnQuCi0KLVR1ZSBKdWwgMjAgMTI6MDE6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBEZWxldGUgZW1faTM4NmxpbnV4Lm8gKGZvciB3aGljaAotCXRoZXJlJ3Mgbm8gY2hhbmdlIGxvZyBlbnRyeSB5ZXQsIHRzayB0c2spIGZyb20gdGhlIGxpc3Qgb2YKLQllbXVsYXRpb25zIGNvbXBpbGVkIGluIHVudGlsIE1hcmsgZ2V0cyBhcm91bmQgdG8gY2hlY2tpbmcgaW4KLQllbXVscGFyYW1zL2kzODZsaW51eC5zaC4KLQkobGRlbXVsLWxpc3QuaCk6IERlcGVuZCBvbiBNYWtlZmlsZSwgc28gaWYgRU1VTEFUSU9OX09GSUxFUyBpcwotCWNoYW5nZWQsIHRoaXMgZmlsZSBnZXRzIHVwZGF0ZWQuCi0KLUZyaSBKdWwgMTYgMTQ6MTQ6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSAoT1BUSU9OX0xmaWxlKTogTmV3IHRva2VuLgotCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IE9QVElPTl9MIE5BTUUgKHdoaXRlc3BhY2UgYWZ0ZXIgLUwpLgotCSogbGRsZXgubCAoPENPTU1BTkQ+KTogQWNjZXB0IC1MIHdpdGhvdXQgRklMRU5BTUUuCi0KLUZyaSBKdWwgMTYgMTM6NDQ6MjYgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBoOC8zMDBoIHN1cHBvcnQgbmVlZHMgb3duIC5tdCBmaWxlLgotCWNvbmZpZy9jb2ZmLWg4MzAwaC5tdDogTmV3IGZpbGUuCi0KLVRodSBKdWwgMTUgMTI6NDQ6MzUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYzogRG9uJ3QgaW5jbHVkZSBzeXMvc3RhdC5oOyBpdCBhbHJlYWR5IGdvdCBpbmNsdWRlZAotCXNvbWV3aGVyZSBhbG9uZyB0aGUgd2F5LgotCi1UaHUgSnVsIDE1IDE0OjQzOjM0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgaDgzMDBoIHN1cHBvcnQuCi0JZW11bHBhcmFtcy9oODMwMGguc2g6IE5ldyBmaWxlLgotCXNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTmV3IGZpbGUuCi0KLVRodSBKdWwgMTUgMTI6NDQ6MzUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fZmlsZSk6IEluIGVycm9yIG1lc3NhZ2UsIHVzZSB0aGUgbmFtZSB0aGUKLQl1c2VyIGdhdmUgKGUuZy4sICItbGMiKSwgcmF0aGVyIHRoYW4gdGhlIGJhc2UgZmlsZSBuYW1lLgotCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogRG9uJ3QgYXNzaWduIGFuIGludCB0byBhbiBlbnVtLgotCi0JKiBsZG1haW4uW2NoXTogUmVtb3ZlIGluaXRpYWwgUV8gZnJvbSBmdW5jdGlvbiBuYW1lcy4KLQkqIGxkZXhwLmMsIGxkaW5kci5jLCBsZGxhbmcuYzogQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGxkZmlsZS5jLCBsZG1haW4uYywgbGRncmFtLnk6IFJlbmFtZSBvcHRpb25fdiB0byB0cmFjZV9maWxlX3RyaWVzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogTW92ZSBsb2FkaW5nIG9mIGRlZmF1bHQgc2NyaXB0IGZyb20KLQloZXJlIHRvIG1haW4uICBBZGQgYSAiLyIgdG8gc3RhcnQgb2Ygc2NyaXB0IG5hbWUgdG8gcHJldmVudAotCWZpbmRpbmcgaXQgaW4gIi4iIGZpcnN0LgotCi0JKiBsZG1haW4uYyAoc2V0X3NjcmlwdHNfZGlyKTogRG9uJ3QgbG9vayBpbiAiLiIgZmlyc3QuCi0KLQkqIGxkZ3JhbS55LCBsZGxhbmcuYywgbGRzeW0uYzogUmVtb3ZlIHRyYWNlcyBvZiB1bnVzZWQgdmFyCi0Jb3B0aW9uX2xvbmdtYXAuCi0KLVRodSBKdWwgMTUgMTA6NTU6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZW1fbTg4a2Jjcy5jKTogQ29ycmVjdCBkZXBlbmRlbmN5LgotCSogc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYzogSXQncyBBUkNILCBub3QgYXJjaC4gIFJlbW92ZWQgVEFSR0VUCi0Jc3RhdGVtZW50LiAgQ2hhbmdlZCBPVVRQVVRfRk9STUFUIHRvIHVzZSAke09VVFBVVF9GT1JNQVR9LgotCSogZW11bHBhcmFtcy9tODhrYmNzLnNoOiBJdCdzIGNvZmYtbTg4a2Jjcywgbm90IG04OGtiY3MuCi0KLVdlZCBKdWwgMTQgMjE6NDI6NTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGZpbGUuYyAobGRsYW5nX29wZW5fZmlsZSwgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlKSwKLQltYWluLmMgKG1haW4pOiBQcmludCB0aGUgZXJybm8gc3RyaW5nIGluIHRoZSBlcnJvciBtZXNzYWdlLgotCi1UdWUgSnVsIDEzIDIwOjAwOjMwIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IGg4MzAwaCBmb3IgdGFyZ2V0IGNwdS4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEhhdmUgZGVtYW5nbGUgcmVtb3ZlIGxlYWRpbmcgdW5kZXJzY29yZSBpZgotCXByZXNlbnQgKGRlbWFuZ2xlIGlzIHNtYXJ0IGVub3VnaCB0byBrbm93IHdoZXRoZXIgdG8gZG8gaXQgb3Igbm90KS4KLQotTW9uIEp1bCAxMiAxMTo0NTo0OCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChzZXRfc2NyaXB0c19kaXIpOiBDaGVjayAuIGFuZCA8bGQgYmluIGRpcj4vLi4vbGliIGZvcgotCWxkc2NyaXB0cywgYXMgd2VsbCBhcyA8bGQgYmluIGRpcj4gYW5kIFNDUklQVERJUi4KLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IFVzZSBzaXplb2YgaW5zdGVhZCBvZiBtYWdpYyBjb25zdGFudC4KLQotCSogbGRtYWluLmMgKGdldF9lbXVsYXRpb24sIGNoZWNrX2Zvcl9zY3JpcHRzX2RpciwKLQlzZXRfc2NyaXB0c19kaXIpOiAgTmV3IGZ1bmN0aW9ucy4KLQkobWFpbik6IENhbGwgdGhlbS4KLQotTW9uIEp1bCAxMiAxMDo1NzowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBJbmNsdWRlIC5pbml0LCAuZmluaSwgLnJvZGF0YSBzZWN0aW9ucy4KLQlDcmVhdGUgc3ltYm9sICJlbmQiIGluc3RlYWQgb2YgIl9fZW5kIi4gIENvbW1lbnQgb3V0IHNvbWUgcGFydHMKLQl0aGF0IG1heSBub3QgYmUgbmVlZGVkICh5ZXQpIGZvciBlbGYuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IHNwYXJjLWVsZiBhbmQgc3BhcmMtc29sYXJpczIgY29uZmlncy4KLQotVGh1IEp1bCAgOCAxNTozMzozMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEluY2x1ZGUgJChPVEhFUl9FTVVMQVRJT05TKS4KLQotCSogbGRtaXNjLmggKGVpbmZvLCBtaW5mbywgaW5mbyk6IERvbid0IGJvdGhlciB3aXRoIFBBUkFNUyBtYWNybwotCXdoZW4gbm8gcHJvdG90eXBlIGlzIGJlaW5nIHN1cHBsaWVkLgotCShsZG1hbGxvYywgbGRyZWFsbG9jKTogU2l6ZSBhcmd1bWVudCBpcyBub3cgc2l6ZV90LgotCi0JKiBsZG1pc2MuYyAoZmluZm8pOiBOZXcgZnVuY3Rpb24sIGFjY2VwdHMgRklMRSogYXJndW1lbnQuCi0JKHZmaW5mbywgY2FzZSAndicpOiBOZXcgZm9ybWF0IGNoYXJhY3RlcjsgZGlzcGxheXMgYmZkX3ZtYSBpbiBoZXgKLQl3aXRob3V0IGxlYWRpbmcgemVyb3MuCi0JKHZmaW5mbywgY2FzZXMgJ1InIGFuZCAnQycpOiBVc2UgZmluZm8oJXYpIHdoZW4gZGlzcGxheWluZyBhCi0JYmZkX3ZtYSB2YWx1ZSwgaW5zdGVhZCBvZiBmcHJpbnRmKCV4KSB3aGljaCB3b24ndCBob2xkIGEgbG9uZyBsb25nCi0JdmFsdWUuCi0JKGNvbmNhdCwgYnV5c3RyaW5nKTogU3RyaW5nIGxlbmd0aHMgYXJlIHNpemVfdC4KLQkobGRtYWxsb2MsIGxkcmVhbGxvYywgeHJlYWxsb2MpOiBTaXplIGFyZ3VtZW50IGlzIG5vdyBzaXplX3QuCi0KLQkqIGxkbGFuZy5jIChuZXdfc3RhdGVtZW50KTogU2l6ZSBhcmd1bWVudCBpcyBub3cgc2l6ZV90LiAgQWRkZWQKLQlmb3J3YXJkIGRlY2xhcmF0aW9uIHdpdGggcHJvdG90eXBlLgotCi1UaHUgSnVsICA4IDEwOjUzOjQ3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnkgKE9QVElPTl92KTogRG9uJ3QgdHVybiBvbiB2ZXJib3NlIG91dHB1dC4KLQotV2VkIEp1bCAgNyAxNzoxMDo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IEdldCByaWQgb2YgbG9jYWwgdHlwZWRlZiBmb3IgYmZkX3ZtYSEgIEdldCBpdCBmcm9tCi0JYmZkLmggaW5zdGVhZC4KLQotV2VkIEp1bCAgNyAxMTozMzoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBhcyAkKHRvb2xkaXIpL2Jpbi9nbGQ7Ci0JY29sbGVjdDIgZG9lc24ndCBsb29rIGZvciBnbGQgYW55IG1vcmUgYW55aG93LgotCi1Nb24gSnVsICA1IDE0OjI5OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfcmVsb2NhdGVfZ2xvYmFscyk6IFNraXAgaW5kaXJlY3Qgc3ltYm9scywgd2hpY2gKLQlub3cgaGF2ZSBhIG5vbiBOVUxMIHNyZWZzX2NoYWluLgotCi0JKiBjb25maWcvaHAzMDBocHV4Lm10OiBVc2UgZW11bGF0aW9uIGhwM2hwdXggcmF0aGVyIHRoYW4KLQlocDMwMGhwdXgsIHNpbmNlIHRoZSBsYXR0ZXIgZG9lcyBub3QgZXhpc3QuCi0KLUZyaSBKdWwgIDIgMTg6MDY6MDUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZW5zY3JpcHRzLnNoOiBQdXQgdGhlIHNjcmlwdHMgaW4gdGhlIGxkc2NyaXB0cyBkaXJlY3RvcnksIG5vdAotCWVtdWxhdGlvbnMuCi0JKiBjb25maWd1cmUuaW4gKGxkc2NyaXB0cyk6IE1ha2UsIGluc3RlYWQgb2YgZW11bGF0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChzY3JpcHRkaXIpOiBUYWtlIG9mZiB0aGUgImxkIiBwYXJ0LgotCShpbnN0YWxsLCBjbGVhbiwgZGlzdGNsZWFuKTogVXNlIGxkc2NyaXB0cywgbm90IGVtdWxhdGlvbnMuCi0JSW4gdGVzdHMsIGRvbid0IHBhc3MgLUxlbXVsYXRpb25zLgotCURvbid0IHBhc3MgdG9vbGRpci9saWIgdG8gZ2Vuc2NyaXB0cy5zaC4KLQkqIGdlbnNjcmlwdHMuc2g6IERvbid0IHRha2UgdG9vbGRpci9saWIgYXJnLgotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IEFkZCAibGRzY3JpcHRzLyIgdG8gdGhlIG5hbWUgb2YgdGhlCi0JZGVmYXVsdCBzY3JpcHQgZmlsZS4KLQotRnJpIEp1bCAgMiAxNzoxMzozNSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogQWRkIC50b3JzIHNlY3Rpb24gZm9yIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3JzLgotCi1UaHUgSnVsICAxIDE2OjM4OjQ1IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9jb2ZmLWg4MzAwLm10OiBFTVVMPWg4MzAwaG1zIC0+IGg4MzAwLgotCi1XZWQgSnVuIDMwIDE1OjQ1OjU1IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKC55LmMpOiBza2lwIGRlZmF1bHQgLnkuYyBydWxlcy4gZ251IG1ha2UgY2FuIG5vdwotCSAgcnVuIGluIHBhcmFsbGVsIHdpdGhvdXQgY29sbGlkaW5nIG9uIHlhY2MncyBzdGF0aWMgZmlsZSBuYW1lcy4KLQkgIFdpdGhvdXQgdGhlIHN0dWIgcnVsZSwgbWFrZSB3aWxsIHRyeSB0byBzdGFydCB0d28geWFjYydzCi0JICBjb25jdXJyZW50bHkgd2hpY2ggZmFpbHMgYmVjYXVzZSBvZiB5YWNjJ3Mgc3RhdGljIGZpbGUgbmFtZXMuCi0KLVR1ZSBKdW4gMjkgMTI6MjA6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoc3ViZmlsZV93YW50ZWRfcCk6IERvbid0IGR1bXAgY29yZSBpZiB0aGVyZSBhcmUgbm8KLQlzeW1ib2xzLgotCi1Nb24gSnVuIDI4IDEyOjIyOjExIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2Vuc2NyaXB0cy5zaCAoTElCX1BBVEgpOiBPbmx5IGFkZCAvdXNyL2xvY2FsL2xpYiBpZiBpdCdzCi0JZGlmZmVyZW50IGZyb20gbGliZGlyLgotCi0JKiBNYWtlZmlsZS5pbiAoc2NyaXB0ZGlyKTogQmFzZSBvbiB0b29sZGlyLCBub3QgZGF0YWRpci4KLQotU2F0IEp1biAyNiAxMjowMzo1NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmMgKGhlbHApOiBOZXcgZnVuY3Rpb24uCi0JKiBsZHZlci5oOiBEZWNsYXJlIGl0LgotCSogbGRsZXgubCwgbGRncmFtLnk6IFJlY29nbml6ZSBuZXcgb3B0aW9ucyAtLWhlbHAgYW5kIC0tdmVyc2lvbi4KLQotTW9uIEp1biAyMSAyMDozOTo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogRG9uJ3QgbmVlZCAuLi9pbmNsdWRlIGFueSBtb3JlLgotCi1Nb24gSnVuIDIxIDE2OjM4OjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubCwgbGRncmFtLnk6IFN1cHBvcnQgbmV3IC1vZm9ybWF0IG9wdGlvbi4KLQlSZW1vdmUgYXR0ZW1wdCBhdCBzdXBwb3J0aW5nIHNjcmlwdCBmcmFnbWVudHMgb24gdGhlIGNvbW1hbmQgbGluZS4KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KTogVGFrZSBuZXcgYXJnLCBGUk9NX1NDUklQVC4KLQkqIG1yaS5jIChtcmlfZm9ybWF0KSwgbGRncmFtLnk6IENoYW5nZSBjYWxsZXJzLgotCSogbGRsYW5nLmg6IENoYW5nZSBwcm90b3R5cGUuCi0KLVRodSBKdW4gMTcgMTY6NTM6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNhbm9uaWNhbGl6ZSBpbnN0YWxsLnNoOyBmb3IgdXNlIHdpdGhpbgotCXRoaXMgZGlyZWN0b3J5IChhbmQgc3ViZGlycykKLQotVGh1IEp1biAxNyAxNDozMzowOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55OiBUd2VhayBncmFtbWFyIHRvIG1ha2UgcmVwb3J0aW5nIG9mIGludmFsaWQgb3B0aW9ucyB3b3JrLgotCi0JKiBNYWtlZmlsZS5pbiAoLmNjLm8pOiBSZXN0b3JlIC5TVUZGSVhFUyBlbnRyeSBmb3IgLmNjCi0JYW5kIC5jYy5vIHJ1bGUuCi0KLVdlZCBKdW4gMTYgMTE6NDU6MzIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fY29tbWFuZCk6IERvbid0IHRyeSAubGQgZXh0ZW5zaW9uLgotCUl0IHdhc24ndCBkb2N1bWVudGVkIChvciBsaWtlbHkgdXNlZCkgYW5kIHdhc3RlcyB0aW1lLgotCSh0cnlfb3Blbik6IElmIEVYVEVOIGlzIGVtcHR5LCBkb24ndCB0cnkgaXQuCi0KLQkqIGxkY3Rvci5jLCBsZGVycm9yLmMsIGxkZXhwLmMsIGxkZmlsZS5jLCBsZGluZHIuYywgbGRsYW5nLmMsCi0JbGRsZXgubCwgbGRtYWluLmMsIGxkbWlzYy5jLCBsZHN5bS5jLCBsZHZlci5jLCBsZHdhcm4uYywKLQlsZHdyaXRlLmMsIGxleHN1cC5jLCBtcmkuYywgcmVsYXguYzogUmVwbGFjZSBERUZVTiBtYWNybyBjYWxscwotCXdpdGggbm9ybWFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQotCSogTW92ZSAqLmVtIHRvIGVtdWx0ZW1wbC8qLmVtLiAgTW92ZSAqLnNoIHRvIGVtdWxwYXJhbXMvKi5zaC4KLQlNb3ZlICouc2Mtc2ggdG8gc2NyaXB0dGVtcGwvKi5zYy4KLQkqIHtlbXVsdGVtcGwsZW11bHBhcmFtcyxzY3JpcHR0ZW1wbH0vUkVBRE1FOiBOZXcgZmlsZXMuCi0JKiBzaC5lbSwgc3QyMDAwLmVtLCB6OGtzaW0uZW0sIGg4MzAwaG1zLmVtLCBoODUwMGhtcy5lbTogRmlsZXMKLQlyZW1vdmVkLCByZXBsYWNlZCB3aXRoIGdlbmVyaWMuZW0uCi0JKiBoODMwMC5zaCwgaDg1MDAuc2gsIGg4MzAwLnNjLCBoODUwMC5zYzogUmVuYW1lZCBmcm9tCi0JIGg4WzM1XTAwaG1zLnNbY2hdLiAgQ2hhbmdlIHRoZWlyIGNvbnRlbnRzIHRvIG9taXQgdGhlICJobXMiLgotCi0JKiAqLmVtICgqX2dldF9zY3JpcHQpOiBSZXR1cm4gc2NyaXB0IG5hbWUgaW5zdGVhZCBvZiBzY3JpcHQgY29udGVudHMuCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogQ2hhbmdlIGNhbGxlci4KLQotCSogbGRsZXgubCwgbGRncmFtLnk6IFJlY29nbml6ZSAtbSBvcHRpb24uCi0JQ2hlY2sgZm9yIGlucHV0IGZpbGVzIGFmdGVyICphbGwqIG9wdGlvbnMgaW4gZ3JhbW1hci4KLQkqIGxkbWFpbi5jIChtYWluKTogQ2hlY2sgZm9yIC1tIG9wdGlvbnMuICBBZGQgZGVmYXVsdCBkaXJlY3RvcnkKLQlmb3IgLW0uCi0KLQkqIG1rc2NyaXB0LmM6IEZpbGUgcmVtb3ZlZC4KLQkqIGdlbnNjcmlwdHMuc2g6IFRha2UgdHdvIG1vcmUgcGFyYW1ldGVycywgdG9vbGRpcmxpYiBhbmQgbGliZGlyLAotCXRvIGFkZCB0byB0aGUgZGVmYXVsdCBMSUJfUEFUSC4KLQlMb29rIGZvciBpbnB1dCBmaWxlcyBpbiB0aGUgbmV3IHN1YmRpcmVjdG9yaWVzLgotCUNyZWF0ZSB0aGUgc2NyaXB0cyBpbiBlbXVsYXRpb25zIHN1YmRpcmVjdG9yeSBhbmQgZG9uJ3QgZmlsdGVyCi0JdGhlbSB0aHJvdWdoIG1rc2NyaXB0LgotCSogY29uZmlndXJlLmluOiBNYWtlIHRoZSBlbXVsYXRpb25zIHN1YmRpcmVjdG9yeS4KLQotCSogTWFrZWZpbGUuaW46IEFjY291bnQgZm9yIGFsbCBvZiB0aGUgYWJvdmUgY2hhbmdlcy4KLQlSZW1vdmUgdW51c2VkIC5TVUZGSVhFUy4gIEdldCBsaWJnY2MuYSBwYXRoIHdpdGggZ2NjCi0JLXByaW50LWxpYmdjYy1maWxlLW5hbWUgaW5zdGVhZCBvZiAkKGxpYmRpcikvbGliZ2NjLmEuCi0JUHV0IENGTEFHUyBsYXN0IGluIHRoZSBjb21waWxhdGlvbiBydWxlcy4KLQlBZGQgLUkuLi9iZmQgdG8gSU5DTFVERVMgc28gc3lzZGVwLmggaXMgZm91bmQuCi0KLVR1ZSBKdW4gMTUgMjM6MDQ6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBMb29rIGluIC4uL2luY2x1ZGUsIG5vdCAuLi9iZmQuCi0KLQkqIGFvdXQuc2Mtc2g6IEFkZCBTSExJQl9QQVRIIGxpa2UgU1RBQ0taRVJPLiAgTWFrZSBTVEFDS1pFUk8KLQlkZXBlbmRlbnQgb24gUkVMT0NBVElORywgbm90IFJFTE9DQVRJT04uCi0JKiBocDNocHV4LnNoIChTSExJQl9QQVRIKTogRGVmaW5lIGl0LgotCi1Nb24gSnVuIDE0IDE5OjA2OjE1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRmaWxlLmMgKHRyeV9vcGVuKTogSWYgb3BlbmluZyB3aXRob3V0IHRoZSBleHRlbnNpb24gZmFpbHMsCi0JdHJ5IHdpdGggdGhlIGV4dGVuc2lvbiBldmVuIGlmIC12IG9yIC1WIHdhcyBnaXZlbi4KLQloYWRfc2NyaXB0IGlzIGltcG9ydGVkIChmcm9tIGxkZ3JhbS55KSwgbm90IGV4cG9ydGVkLgotCi1Nb24gSnVuIDE0IDE2OjI2OjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBwYXJlbnRkaXIgc3VwcG9ydCwgdXNlIElOU1RBTExfWEZPUk0KLQotVGh1IEp1biAxMCAxNDowMDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBEb24ndCBsb3NlIHRoZSBvbGQgZmxhZyBiaXRzLgotCSogbGRncmFtLnkgKHN0YXRlbWVudF9saXN0X29wdCk6IE5ldyBub250ZXJtaW5hbCwgZWl0aGVyIGVtcHR5IG9yCi0Jc3RhdGVtZW50X2xpc3QuCi0JKHNlY3Rpb24pOiBVc2Ugc3RhdGVtZW50X2xpc3Rfb3B0LCBub3Qgc3RhdGVtZW50X2xpc3QuCi0JKiBtNjhrY29mZi5zYy1zaDogR2F0aGVyIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kIGRlZmluZQotCV9fQ1RPUl9MSVNUX18gYW5kIF9fRFRPUl9MSVNUX18gYXBwcm9wcmlhdGVseS4KLQkqIHNhMjkyMDAuc2Mtc2g6IEdhdGhlciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFuZCBkZWZpbmUKLQlfX19DVE9SX0xJU1RfXyBhbmQgX19fRFRPUl9MSVNUX18gYXBwcm9wcmlhdGVseS4KLQotTW9uIEp1biAgNyAxMjo1MzoyOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6ICBBZGQgLUkuLi9iZmQgZm9yIHN5c2RlcC5oIGFuZCBiZmQuaC4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIHRvIGNvbmZpZ3VyZSB0byBnZXQgc3lzZGVwLmguCi0KLUZyaSBKdW4gIDQgMTY6MTg6MjQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIGluc3RhbGw6YWxsIGFuZCBpbnN0YWxsLWluZm86aW5mbwotCWRlcGVuZGVuY2llcyAodGhlc2UgY2F1c2Ugc29tZSBzcHVyaW91cyByZWJ1aWxkcyBhdCAnbWFrZSBpbnN0YWxsJwotICAgICAgICB0aW1lKQotCi1GcmkgSnVuICA0IDA4OjUwOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLWlkdC1lY29mZmwqKTogTmV3IHRhcmdldDsgdXNlIG1pcHMtaWR0bC4KLQkobWlwcy1pZHQtZWNvZmYqKTogQWRkZWQgdHJhaWxpbmcgJyonLgotCSogY29uZmlnL21pcHMtaWR0bC5tdDogTmV3IGZpbGU7IHVzZSBFTVVMIG9mIG1pcHNpZHRsLgotCSogbWlwc2lkdGwuc2g6IE5ldyBmaWxlOyBsaWtlIG1pcHNpZHQuc2gsIGJ1dCBsaXR0bGUgZW5kaWFuLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW1fbWlwc2lkdGwuby4KLQotCSogY29uZmlnL3N1bjMubWggKEhPU1RJTkdfTElCUywgSE9TVElOR19FTVUpOiBSZW1vdmVkIG9ic29sZXRlIGFuZAotCWluY29ycmVjdCBkZWZpbml0aW9ucy4KLQotVHVlIEp1biAgMSAxNDo1NjoxMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogIFdyaXRlIEJTRl9DT05TVFJVQ1RPUgotCXN5bWJvbHMsIHVubGVzcyBzdHJpcHBpbmcuCi0KLVR1ZSBNYXkgMjUgMTU6MzQ6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY29uZmlndXJlIGxvb2tzIGZvciAjIyMjLCBzbyByZW1vdmUgbGluZXMgd2l0aCBtYW55Ci0JJyMnIGNoYXJhY3RlcnMuCi0JKiBjb25maWcvaXJpeDQubWgsIGNvbmZpZy9pMzg2di5taDogTmV3IGZpbGVzOyBzZXQgSE9TVElOR19DUlQwCi0JYW5kIEhPU1RJTkdfTElCUyBjb3JyZWN0bHkgc28gdGhhdCBgYG1ha2UgY2hlY2snJyB3aWxsIHdvcmsuCi0KLVRodSBNYXkgMjAgMTM6NTY6MTYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuc2Mtc2g6ICBEZWZpbmUgX2V0ZXh0LCBfZWRhdGEsIGFuZCBfZW5kLCBpbiBhZGRpdGlvbgotCXRvIGV0ZXh0LCBlZGF0YSwgYW5kIGVuZC4gIE5lZWRlZCBmb3IgSVJJWCA0LjAuNUYuCi0JUGF0Y2ggZnJvbSBtd3BAaWNvbml4Lm96LmF1IChNaWNoYWVsIFBhZGRvbikuCi0KLQkqIFZlcnNpb24gMi4yLjEgcmVsZWFzZWQuCi0KLVRodSBNYXkgMjAgMTE6NDI6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtaXBzYnNkLnNjLXNoOiBSZW5hbWVkIGZyb20gYW91dC1taXBzYnNkLnNjLXNoLgotCSogbWlwc2JzZC5zaCAoRU1VTEFUSU9OX05BTUUpOiBVc2UgbmV3IGZpbGUgbmFtZS4KLQotVHVlIE1heSAxOCAxNzoxMDoyNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChMRERJU1RTVFVGRik6IFJlbW92ZSBsZC5tbSBzaW5jZSB3ZSBjYW4ndCBidWlsZCBpdAotCXByb3Blcmx5IHJpZ2h0IG5vdy4KLQotCSogVmVyc2lvbiAyLjIgcmVsZWFzZWQuCi0KLU1vbiBNYXkgMTcgMTU6Mzc6MjggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi4yLgotCi1Nb24gTWF5IDE3IDEyOjQ0OjMxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBORVdTOiAgTmV3IGZpbGUuCi0KLUZyaSBNYXkgMTQgMTE6MjY6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiBEb24ndCBkZWZpbmUgQlNTX1ZBUiB1bmxlc3MgcmVsb2NhdGluZy4KLQotV2VkIE1heSAxMiAxMzozMzoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChta3NjcmlwdC5vLCBta3NjcmlwdCk6IEJ1aWxkIG1rc2NyaXB0IHZpYQotCW1rc2NyaXB0Lm8sIHJhdGhlciB0aGFuIGRpcmVjdGx5IGZyb20gbWtzY3JpcHQuYy4KLQotVHVlIE1heSAgNCAyMTo1ODo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTG9vayBmb3IgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gcmVsYXRpdmUgdG8KLQkke3NyY2Rpcn0sIG5vdCByZWxhdGl2ZSB0byBidWlsZCBkaXJlY3RvcnkuCi0KLQkqIGhwcGFvc2YuZW0sIGhwcGFvc2Yuc2Mtc2gsIGhwcGFvc2Yuc2g6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGhwcGEqLWhwLW9zZi4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEluY2x1ZGUgaHBwYW9zZiBlbXVsYXRpb24uCi0JKGVtX2hwcGFvc2YuYyk6IEJ1aWxkIGl0LgotCSogY29uZmlnL2hwcGFvc2YubWgsIGhwcGFvc2YubXQ6IE5ldyBmaWxlcy4KLQotCSogbGQuaCAoQUxJR05fTik6IFJlbmFtZWQgZnJvbSBBTElHTiwgYmVjYXVzZSB0aGF0IGNvbmZsaWN0ZWQgd2l0aAotCXNvbWUgc3lzdGVtIGhlYWRlciBmaWxlcy4gIEFsbCB1c2VzIGNoYW5nZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGkzODYtYWl4IGNvbmZpZ3VyYXRpb25zIGFzIGkzODYtY29mZgotCXRhcmdldHMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG02OCotKi1ocHV4LgotCSogYW91dC5zYy1zaDogSWYgU1RBQ0taRVJPIGFuZCBSRUxPQ0FUSU5HIGFyZSBib3RoIGRlZmluZWQsIG91dHB1dAotCXRoZSB2YWx1ZSBvZiBTVEFDS1pFUk8uCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJbmNsdWRlIGhwMzAwLWhwdXggZW11bGF0aW9uLgotCShlbV9ocDNocHV4LmMpOiBCdWlsZCBpdC4KLQkqIGhwM2hwdXguc2gsIGNvbmZpZy9ocDMwMGhwdXgubXQ6IE5ldyBmaWxlcy4KLQotVHVlIE1heSAgNCAxMjozNzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuc2Mtc2g6IFB1dCBjb25zdHJ1Y3RvcnMgaW4gdGhlIC5kYXRhIHNlY3Rpb24uCi0JKiBNYWtlZmlsZS5pbiAoY2R0ZXN0KTogQWRkZWQgZGVwZW5kZW5jeSBvbiBsZC5uZXcuCi0KLU1vbiBNYXkgIDMgMTk6NDM6MzkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIGRlZmluaXRpb24gb2YgJCh0b29sZGlyKSB0byBtYXRjaCBGU0YuCi0JKiB2YXguc2gsIGNvbmZpZy92YXgubXQsIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46Ci0JU3VwcG9ydCBWQVggVWx0cml4IGFuZCBCU0QuCi0KLU1vbiBBcHIgMjYgMTg6MzU6NDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNoLmVtLCBzaC5zaCwgc2guc2Mtc2g6IE5ldyBmaWxlcyBzdXBwb3J0aW5nIEhpdGFjaGkgU0guCi0KLVdlZCBBcHIgMTQgMjE6MDE6NTEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5oIChzdHJ1Y3QgbWVtb3J5X3JlZ2lvbik6ICBDaGFuZ2UgYGxlbmd0aCcgYW5kCi0JYG9sZF9sZW5ndGgnIGZpZWxkcyB0byBiZmRfc2l6ZV90eXBlLiAgRWxpbWluYXRlIHVzZSBvZiBiZmRfb2Zmc2V0LgotCSogbGRsYW5nLmMsIG1yaS5jOiAgQ29ycmVzcG9uZGluZyBjaGFuZ2VzLCBwbHVzIGxpbnQuCi0KLVRodSBBcHIgIDggMjI6MDg6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEZvciBhbGwgaTM4NiB0YXJnZXRzLCBhY2NlcHQgaTQ4NiBhcyB3ZWxsLgotCi1Nb24gQXByICA1IDE3OjMzOjM5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IFByZXNlcnZlIGFsbCBmbGFncyBmb3IgYQotCVNFQ19TSEFSRURfTElCUkFSWSBzZWN0aW9uLgotCShzaXplX2lucHV0X3NlY3Rpb24pOiBDb25zaWRlciBhbnkgU0VDX0hBU19DT05URU5UUyBzZWN0aW9uIHdoZW4KLQljb21wdXRpbmcgbGFyZ2VzdF9zZWN0aW9uLgotCi1GcmkgQXByICAyIDE0OjMzOjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCk6IEluaXRpYWxpemUgYWxsCi0JZmllbGRzIG9mIG5ld2x5IGNyZWF0ZWQgc3RydWN0dXJlLgotCi1XZWQgTWFyIDMxIDE4OjE5OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGdfc3dpdGNoX3ZhbHVlKTogTmV3IHZhcmlhYmxlLgotCSogbGRncmFtLnkgKE9QVElPTl9HLCBPUFRJT05fR3ZhbCk6IE5ldyB0b2tlbnMuCi0JKGNvbW1hbmRfbGluZV9vcHRpb24pOiBBY2NlcHQgLUcgYW5kIHNldCBnX3N3aXRjaF92YWx1ZS4KLQkqIGxkbGV4LmwgKENPTU1BTkQpOiBBY2NlcHQgLUcuCi0JKiBsZGxhbmcuYyAob3Blbl9vdXRwdXQpOiBDYWxsIGJmZF9zZXRfZ3Bfc2l6ZSBvbiBuZXcgQkZELgotCi1UdWUgTWFyIDMwIDA5OjQwOjI1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JU3VwcG9ydCBmb3IgbGlua2luZyBhbmQgbG9hZGluZyBhdCBkaWZmZXJlbnQgcGxhY2VzOgotCi0JKiBsZGxleC5sOiBBZGQgIkFUIiBrZXl3b3JkLgotCSogbGRncmFtLnk6IENsZWFudXAsIGFuZCBwYXJzZSBBVC4KLQkqIGxkbGFuZy5jIChwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBQcmludCBvdXRwdXQgYWRkcmVzcwotCW9mIHNlY3Rpb24gaW4gbWFwLiAobGFuZ19zaXplX3NlY3Rpb25zKTogRmlsbCBzZWN0aW9ucycgbG1hIHdpdGgKLQlsb2FkIGFkZHJlc3MuCi0JKiBsZGxhbmcuaCAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSk6IEFkZCBsb2FkX2Jhc2UKLQlpbmZvcm1hdGlvbi4KLQotCSogbGRpbmRyLmMgKGFkZF9pbmRpcmVjdCk6IEtlZXAgbW9yZSBpbmZvcm1hdGlvbiBpbiB0aGUgYWxpYXMKLQlzeW1ib2wgY2hhaW4uCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogIERvbid0IGluaGVyaXQgTkVWRVJfTE9BRCBzZWN0aW9uCi0JYXR0cmlidXRlIGZyb20gYW4gaW5wdXQgc2VjdGlvbi4KLQkqIGxkbWFpbi5jIChRX2VudGVyX2ZpbGVfc3ltYm9scyk6IENvbW1vbiBzZWN0aW9uIGlzIE5FVkVSX0xPQUQgYnkKLQlkZWZhdWx0LiAoUV9lbnRlcl9maWxlX3N5bWJvcyk6IEluZGlyZWN0IHN5bWJvbHMgbm93IGFyZSBrbm93biBieQotCXRoZWlyIHNlY3Rpb24sIG5vdCBhIHNwZWNpYWwgc3ltYm9sIGZsYWcuCi0JKiBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6IEluZGlyZWN0IHN5bWJvbHMgYXJlbid0IGxvY2FsLgotCSh3cml0ZV9maWxlX2dsb2JhbHMpOiBXcml0ZSB0aGUgbWFwcGluZyBmb3IgYW4gaW5kaXJlY3Qgc3ltYm9sLgotCSogcmVsYXguYyAoYnVpbGRfaXQpOiBXaGVuIGZvcmNlZCB0byB3cml0ZSBhIE5FVkVSX0xPQUQgc2VjdGlvbiwKLQlmaWxsIGl0IHdpdGggemVyb3MuCi0KLVR1ZSBNYXIgMjMgMTM6MjQ6MTAgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogbGQudGV4aW5mbzogIGNoYW5nZXMgZm9yIHExCi0KLVR1ZSBNYXIgMjMgMDA6MTM6MjkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGR2aSB0YXJnZXQsIGRlZmluZSAmIHVzZSBURVhJMkRWSSwgYWRkIGluc3RhbGxjaGVjawotCi1Nb24gTWFyICA4IDIwOjMwOjM1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbmFtZSBIT1NUX0NDIHRvIENDX0ZPUl9CVUlMRAotCi1UaHUgTWFyICA0IDEyOjQ0OjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogQWRkZWQgdmFyaWFibGVzIHdoaWNoIG1heSBiZSBvdmVycmlkZGVuIGJ5IGEKLQlzcGVjaWZpYyBlbXVsYXRpb24uCi0JKiBtaXBzaWR0LnNoOiBOZXcgZmlsZTsgZW11bGF0aW9uIGZvciBJRFQgTUlQUyBib2FyZC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX21pcHNpZHQuby4KLQkoZW1fbWlwc2lkdC5jKTogTmV3IHRhcmdldC4gIFVzZXMgbWlwc2lkdC5zaCBhbmQgbWlwcy5zYy1zaC4KLQkqIGNvbmZpZy9taXBzLWlkdC5tdDogTmV3IGZpbGU7IHNldHMgRU1VTCB0byBtaXBzaWR0LgotCSogY29uZmlndXJlLmluIChtaXBzLWlkdC1lY29mZik6IE5ldyB0YXJnZXQ7IHVzZXMgbWlwcy1pZHQuCi0KLVNhdCBGZWIgMjcgMDA6MDA6MTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0LW1pcHNic2Quc2Mtc2gsIG1pcHNic2Quc2g6IE5ldyBmaWxlcyBmcm9tIFJhbHBoIENhbXBiZWxsLAotCXJhbHBoY0BweXJhbWlkLmNvbS4KLQkqIGkzODZic2Quc2gsIGNvbmZpZy9pMzg2YnNkLm10OiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBBZGRlZCBzdXBwb3J0IGZvciBtaXBzYnNkIGFuZCAzODZic2QuCi0KLVRodSBGZWIgMjUgMTU6MzM6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtcmkuYzogIEFkZCBleHRlcm4gZGVjbGFyYXRpb24gb2Ygc3RyZHVwLgotCSogbGRzeW0uYyAoS0VFUCBtYWNybyk6ICBBZGQgc3BhY2VzIGFyb3VuZCAnPScgZm9yIHRoZQotCXNha2Ugb2Ygb2xkIChlLmcuIFBDQykgY29tcGlsZXJzLgotCi1XZWQgRmViIDI0IDE5OjQ5OjMxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogIEJ1bXAgdG8gdmVyc2lvbiAyLjEuCi0KLUZyaSBGZWIgMTIgMDg6MDk6MTEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55OiBhbGxvdyBzZWN0aW9uIHR5cGVzIHdpdGhvdXQgYWRkcmVzcyAgZXhwcmVzc2lvbnMuCi0JKiBsZGxhbmcuYyAobGFuZ19yZWxvY2F0ZV9nbG9iYWxzKTogYXZvaWQgcG9zc2libGUgaGFuZyB3aXRoCi0JdW5kZWZpbmVkIGJ1dCB1bnJlZmVyZW5jZWQgc3ltYm9scy4KLQkqIHJlbGF4LmMgKHJlbGF4X3NlY3Rpb24pOiBkb24ndCBjb21wbGFpbiBpZiB0aGUgc2NyaXB0IGZpbGUgaXNuJ3QKLQlyZWxheGFibGUgYnV0IC1yZWxheCBpcyBzZXQKLQotVGh1IEZlYiAxOCAxNzo1ODo0NSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZ28zMiBpcyB0aGUgM3JkIHBhcnQgb2YgdGhlIHRyaXBsZSwgbm90IHRoZSAybmQKLQotV2VkIEZlYiAgMyAwOTowNTo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHNiaWcuc2g6IE5ldyBmaWxlLiAgQmlnIGVuZGlhbiBNSVBTIGVtdWxhdGlvbi4KLQkqIGNvbmZpZy9taXBzLWJpZy5tdDogTmV3IGZpbGUuICBVc2UgbWlwc2JpZyBlbXVsYXRpb24uCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXgqKTogVXNlIHRhcmdldCBtaXBzLWJpZy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX21pcHNiaWcuby4KLQkoZW1fbWlwc2JpZy5jKTogTmV3IHRhcmdldC4gIFVzZXMgbWlwc2JpZy5zaC4KLQotVHVlIEZlYiAgMiAxMTozMjoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuc2Mtc2g6IFB1dCAuc2NvbW1vbiBzZWN0aW9ucyBpbnRvIC5zYnNzIHNlY3Rpb24uCi0KLQkqIGxkbWFpbi5jIChzdWJmaWxlX3dhbnRlZF9wKTogUHJlc2VydmUgc2VjdGlvbiBvZiBjb21tb24gc3ltYm9scywKLQlyYXRoZXIgdGhhbiBhbHdheXMgcHV0dGluZyB0aGVtIGluIGJmZF9jb21fc2VjdGlvbi4KLQkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IElmIGEgY29tbW9uIHN5bWJvbCBpcyBub3QgaW4KLQliZmRfY29tX3NlY3Rpb24sIHB1dCBpbiBhIHNlY3Rpb24gb2YgdGhlIHNhbWUgbmFtZSwgcmF0aGVyIHRoYW4KLQlhbHdheXMgcHV0dGluZyBpdCBpbiBzZWN0aW9uIENPTU1PTi4KLQotRnJpIEphbiAyOSAwOTo1Nzo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChzdWJmaWxlX3dhbnRlZF9wKTogSWYgd2UgYWxyZWFkeSBoYXZlIGEgY29tbW9uCi0JZGVmaW5pdGlvbiBvZiBhIHN5bWJvbCwgZG9uJ3QgbmVjZXNzYXJpbHkgcHVsbCBpbiBhbiBvYmplY3QgZmlsZQotCXRoYXQgcHJvdmlkZXMgYSBub24tY29tbW9uIGRlZmluaXRpb24uCi0KLQkqIGxkbGV4LmwgKENPTU1BTkQpOiBBY2NlcHQgLUVCIGFuZCAtRUwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywKLQlyZXR1cm5pbmcgT1BUSU9OX0VCIGFuZCBPUFRJT05fRUwuICBnY2MgcGFzc2VzIHRoZXNlIHRvIGEgTUlQUwotCWxpbmtlci4KLQkqIGxkZ3JhbS55IChPUFRJT05fRUIsIE9QVElPTl9FTCk6IE5ldyB0b2tlbnMuCi0JKGNvbW1hbmRfbGluZV9vcHRpb24pOiBBY2NlcHQgYW5kIGlnbm9yZSBPUFRJT05fRUIgYW5kIE9QVElPTl9FTC4KLQotVGh1IEphbiAyOCAxNToxMjowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVtb3ZlICQodG9vbGRpcikvYmluL2dsZCBiZWZvcmUgY3JlYXRpbmcKLQl0aGUgbGluayB0byBpdC4KLQotVHVlIEphbiAyNiAxMTo0OTo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jLCBsZHN5bS5jOiBVc2UgbmV3IGJmZF9pc19jb21fc2VjdGlvbiBtYWNybyByYXRoZXIgdGhhbgotCWNoZWNraW5nIGZvciBlcXVhbGl0eSB0byBiZmRfY29tX3NlY3Rpb24uCi0KLUZyaSBKYW4gMjIgMTQ6MjI6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiBOZXcgZmlsZS4gIFVsdHJpeCwgYW5kIGhvcGVmdWxseSBvdGhlciBNSVBTIEVDT0ZGCi0JdGFyZ2V0cywgbGlua2VyIHNjcmlwdC4KLQkqIG1pcHNsaXQuc2g6IE5ldyBmaWxlLiAgTGl0dGxlIGVuZGlhbiBNSVBTIGVtdWxhdGlvbi4KLQkqIGNvbmZpZy9taXBzLWxpdC5tdDogTmV3IGZpbGUuICBVc2UgbWlwc2xpdCBlbXVsYXRpb24uCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtZGVjLXVsdHJpeCopOiBVc2UgdGFyZ2V0IG1pcHMtbGl0LgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW1fbWlwc2xpdC5vLgotCShlbV9taXBzbGl0LmMpOiBOZXcgdGFyZ2V0LiAgVXNlcyBtaXBzbGl0LnNoLgotCi1UaHUgSmFuIDE0IDE1OjMwOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBJbnN0YWxsIGxkIGFzIGJvdGggJCh0b29sZGlyKS9iaW4vbGQgYW5kCi0JJCh0b29sZGlyKS9iaW4vZ2xkLCBzbyB0aGF0IGdjYyBjYW4gZmluZCBpdCB3aXRoIG9yIHdpdGhvdXQKLQljb2xsZWN0Mi4KLQotTW9uIEphbiAxMSAxODo1MDowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkd3JpdGUuYzogUmVtb3ZlZCBwZXJmb3JtX3JlbG9jYXRpb24sIGNvcHlfYW5kX3JlbG9jYXRlLCBhbmQKLQl3cml0ZV9ub3JlbC4gIEFsbCBsaW5raW5nIGlzIG5vdyBkb25lIHZpYSB3cml0ZV9yZWxheC4gIENhbGwKLQlsZHN5bV93cml0ZSBiZWZvcmUgY2FsbGluZyB3cml0ZV9yZWxheC4KLQkqIHJlbGF4LmM6IEFkZGVkIGNvcHlyaWdodC4KLQkod3JpdGVfcmVsYXgpOiBSZW5hbWVkIGZyb20gd3JpdGVfcmVsYXhub3JlbC4gIEFkZGVkIHJlbG9jYXRlYWJsZQotCWFyZ3VtZW50LiAgc2VjbGV0X2R1bXAgcmVuYW1lZCB0byBiZmRfc2VjbGV0X2xpbmsuCi0JKiByZWxheC5oOiBBZGRlZCBjb3B5cmlnaHQuCi0KLU1vbiBKYW4gMTEgMTU6NDE6NTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChkZWNvZGVfbGlicmFyeV9zdWJmaWxlKTogUGF0Y2ggZnJvbQotCWhvb2dlbkBzaGFmZXIuY3MudXRhaC5lZHUsIGRvbid0IHJlcmVhZCBsaWJyYXJ5IHN5bWJvbCB0YWJsZXMuCi0KLUZyaSBKYW4gIDggMTg6MDQ6MzMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdnh3b3Jrczk2MC5tdCByZW5hbWVkIHRvIGNvbmZpZy9pOTYwLm10Ci0KLQkqIGNvbmZpZ3VyZS5pbjogc3BhcmMtYW91dCBlbXVsYXRlcyBhIHN1bjQsIGFzIGRvZXMKLQlzcGFyYyotdnh3b3JrcywgaTk2MC1uaW5keSB1c2VzIGdsZDk2MCBlbXVsYXRpb24KLQotRnJpIEphbiAgOCAxNDozOTowNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSBGaXggc3VwcG9ydCBmb3IgTk9MT0FELCBhZGQgSU5DTFVERQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSk6IHBhc3MgZmlsZSBuYW1lIHRvCi0JbGV4X3B1c2hfZmlsZS4KLQkqIGxkbGV4LmwsIGxkZ3JhbS55OiB0aWR5IHVwLCBwYXJzZSBJTkNMVURFIGFuZCBOT0xPQUQKLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBtYWtlIG91dHB1dCBzZWN0aW9ucyBpbmhlcml0IE5FVkVSX0xPQUQKLQlhdHRyaWJ1dGUuCi0KLVRodSBKYW4gIDcgMTA6MjI6MTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmg6IG5vIG1vcmUgZGVmYXVsdCBlbXVsYXRpb24uICBNYWtlIHRoZSBsYWNrCi0Jb2YgZW11bGF0aW9uIGEgY29tcGlsZSB0aW1lIGVycm9yCi0KLVdlZCBKYW4gIDYgMDE6MDg6MzcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbmlzZSBhbGwgc3BhcmNsaXRlIHZhcmlhbnRzLCBub3QganVzdCAnc3BhcmNsaXRlJwotCi1Nb24gRGVjIDI4IDExOjE1OjM1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4a2NvZmYuc2Mtc2g6IGRlZmluZSBfZW5kIGFzIHdlbGwgYXMgZW5kLCBmb3IgY29uc2lzdGVuY3kgd2l0aAotCWFvdXQuc2Mtc2guCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWNjZXB0ICotZXJpY3Nzb24tb3NlIGZvciBhbnkgbTY4ayBDUFUuCi0KLQkqIGxkd3JpdGUuYyAod3JpdGVfcmVsKTogZG9uJ3QgYWx3YXlzIHNldCBTRUNfSEFTX0NPTlRFTlRTIGZsYWcKLQlmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbi4KLQotTW9uIERlYyAyMSAxNjowNjo1OSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmMsIGxkbGFuZy5jLCBsZG1haW4uYywgbGRzeW0uYywgbGR3YXJuLmM6ICBVc2UgbmV3Ci0JbWFjcm8gYmZkX2FzeW1ib2xfYmZkIGFzIGFwcHJvcHJpYXRlLgotCSogTWFrZWZpbGUuaW46ICBVbi1kdXBsaWNhdGUgbGRsZXguYyBkZXBlbmRlbmN5LgotCSogY29uZGlndXJlLmluOiAgUmVwbGFjZSBteV9ob3N0IGNhc2UgdGFibGUgYnkgc291cmNpbmcKLQkuLi9iZmQvY29uZmlndXJlLmhvc3QuICBBbGxvdyBzdGQtaG9zdCBhcyB0aGUgZGVmYXVsdC4KLQkqIGxkbWlzYy5jOiAgQ2hhbmdlIGxvZ2ljIGZvciBDKysgbmFtZSBkZW1hbmdsaW5nOiAgVGhlcmUgaXMKLQlubyBpbml0aWFsICdfJyB0byByZW1vdmUgZnJvbSBzdGFiLWRlcml2ZWQgZnVuY3Rpb24gbmFtZXMuCi0KLVN1biBEZWMgMTMgMTY6MzE6MjYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2luaXRfc2NyaXB0X2ZpbGUpOiBkb24ndCBhdHRhY2ggdGhlIG91dHB1dCBmaWxlCi0Jc2VjdGlvbnMgdG8gdGhlIHNjcmlwdCBmaWxlLgotCi1XZWQgRGVjICA5IDA4OjM4OjA1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCSogbGRsYW5nLmMgKHdpbGQpOiBydW4gZXhwYW5zaW9uIGxvb3Agb3ZlciBjb21tYW5kIGxpbmUgYmZkIHRvby4KLQkobGFuZ19pbmlfc2NyaXB0X2ZpbGUpOiBpbml0aWFsaXplIG1vcmUgcGFydHMgb2YgdGhlIGNvbW1hbmQgbGluZQotCWJmZC4KLQkqIGxkbGV4Lmw6IGZpeCBERUZJTkVEIHN0YXJ0IHN0YXRlcy4KLQotTW9uIERlYyAgNyAwODo0Mzo0MSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQkgLXkgc3VwcG9ydAotCSogbGQudGV4aW5mbzogbmV3IGRvYy4KLQkqIGxkZ3JhbS55LCBsZGxleC5sOiB1bmRlcnN0YW5kIC15PHN5bWJvbD4KLQkqIGxkbWFpbi5jIChRX2VudGVyX2ZpbGVfc3ltYm9scyk6IGlmIGhhZCAteSwgbG9va3VwIHN5bWJvbCBhbmQKLQlwcmludCBpbmZvLiAoYWRkX3lzeW0pOiBuZXcgZnVuY3Rpb24uCi0JKiBsZHN5bS5oOiAobGRzeW1fdHlwZSk6IG5ldyBkZWZpbmUgU1lNX1kuCi0KLVNhdCBOb3YgMjEgMDM6MTU6MjcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGxkY3Rvci5oLCBsZGVycm9yLmgsIGxkZXhwLmgsIGxkZmlsZS5oLCBsZGluZHIuaCwgbGRsYW5nLmMsCi0JbGRsYW5nLmgsIGxkbGV4LmgsIGxkbWFpbi5oLCBsZG1pc2MuaCwgbGRzeW0uaCwgbGR2ZXIuaCwgbGR3YXJuLmgsCi0JbGR3cml0ZS5oLCByZWxheC5oOiAgUmVwbGFjZSBhbGwgdXNlcyBvZiBFWEZVTiBhbmQgUFJPVE8gYW5zaS1nbHVlCi0JbWFjcm9zIHdpdGggUEFSQU1TLiAgUmVjcmVhdGlvbmFsIGNsZWFudXAuICBVcGRhdGUgY29weXJpZ2h0cy4KLQotVHVlIE5vdiAxMCAwMDoyMzozNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIGRvd24gdGhlIGJmZCBzb3VyY2UgZGlyZWN0b3J5IGZvciBpbmNsdWRlcwotCi1UaHUgTm92ICA1IDE1OjQxOjU1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IGRvbid0IGNoYW5nZSBzaXplIGFuZCBhZGRyZXNzIGZvcgotCVNFQ19TSEFSRURfTElCUkFSWSBzZWN0aW9ucyByYXRoZXIgdGhhbiBmb3IgU0VDX05FVkVSX0xPQUQKLQlzZWN0aW9ucy4KLQotVGh1IE5vdiAgNSAxMTozMzo1NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVsYXguYyAoYnVpbGRfaXQpOiByZS1lbmFibGUgdGhlIHByb2Nlc3Npbmcgb2YgZGF0YV9zdGF0ZW1lbnRzCi0JaW4gc2NyaXB0cywgbWFrZXMgY291bnRlZCBjb250cnVjdG9yIGxpc3RzIHdvcmsgYWdhaW4uCi0KLVRodSBOb3YgIDUgMDU6NDM6MDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGxkZW11bC5oOiAgUmVtb3ZlIHVzZXMgb2YgU0RFRiBhbmQgUFJPVE8gbWFjcm9zICh1c2UgUEFSQU1TKS4KLQotVHVlIE9jdCAyMCAxMDo1NjowNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGtjb2ZmLnNjLXNoOiBkb24ndCB1c2UgaW5pdGlhbCB1bmRlcnNjb3JlcyBmb3IgZXRleHQsIGVkYXRhCi0JYW5kIGVuZC4KLQotTW9uIE9jdCAxOSAwOTo0NTozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIFN1cHBvcnQgZm9yIGkzODYtc3lzdi4KLQljb25maWd1cmUuaW46IGNoZWNrIGZvciBpMzg2LSotc3lzdiogYW5kIGkzODYtKi1zY28qLgotCWkzODZjb2ZmLnNjLXNoOiByZXdyb3RlIHRvIHN1cHBvcnQgU1ZSMyBieSBkZWZhdWx0LgotCWxkY3Rvci5jIChmaW5kX2NvbnN0cnVjdG9ycyk6IHByZXNlcnZlIHN0YXRfcHRyLgotCWxkbGFuZy5jICh3aWxkX2RvaXQpOiBpbml0aWFsaXplIHZtYSBhbmQgc2l6ZSBvZiBuZXcgb3V0cHV0Ci0Jc2VjdGlvbiB0byBjb3JyZXNwb25kaW5nIGlucHV0IHNlY3Rpb24uICBUaGlzIGlzIHJlcXVpcmVkIGZvcgotCXNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IGRvbid0IG1vZGlmeSB2bWEgYW5kIHNpemUgb2Ygc2VjdGlvbnMgd2hpY2gKLQlhcmUgbmV2ZXIgbG9hZGVkIChmb3Igc2hhcmVkIGxpYnJhcmllcykuCi0JbGR3cml0ZS5jIChjb3B5X2FuZF9yZWxvY2F0ZSk6IGNvcHkgdGhlIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9uCi0Jd2hpY2ggaGFzIGNvbnRlbnRzLCBub3QganVzdCBzZWN0aW9ucyB3aGljaCBhcmUgbG9hZGVkIChmb3Igc2hhcmVkCi0JbGlicmFyaWVzKS4KLQotVGh1IE9jdCAxNSAxNToyMDoyNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHNpemVfaW5wdXRfc2VjdGlvbik6IGNvdW50IHRoZSBzaXplcyBvZiBhbGwgc2VjdGlvbnMKLSAgICAgICAgd2UgYWxsb2NhdGUuCi0KLVRodSBPY3QgIDggMDk6MDU6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jIChkZW1hbmdsZSx2ZmluZm8pOiB1c2UgdGhlIG5ldyB1bmRlcnNjb3JlIGluIGJmZCB0bwotCXRvIGRlbWFuZ2xlIHN5bWJvbHMgYmV0dGVyCi0KLVR1ZSBPY3QgIDYgMTM6MDg6NTQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBkb24ndCB3YXJuIGlmIC1lIHN0YXJ0IHN5bWJvbCBkb2VzIG5vdAotCWV4aXN0IHdoZW4gbGlua2luZyB3aXRoIC1yLgotCi1Nb24gT2N0ICA1IDE0OjA3OjM3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW91dC5zYy1zaCwgbTY4a2NvZmYuc2Mtc2g6IHNldCBfX2Jzc19zdGFydCB0byB0aGUgc3RhcnQgb2YgdGhlCi0JLmJzcyBzZWdtZW50LgotCi1Nb24gT2N0ICA1IDA4OjU1OjE0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAobGluZWFyX2xpYnJhcnkpOiBkb24ndCBldmVuIHRoaW5rIGFib3V0IHByb2Nlc3NpbmcKLQlhbiBvYmplY3QgZmlsZSBpZiBpdCdzIGFscmVhZHkgYmVlbiBkb25lCi0KLVRodSBPY3QgIDEgMjM6MTQ6NTkgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHRoZSBocDkwMDAvMzAwIGNvbmZpZyBmaWxlIGlzIG5vdyBocDMwMAotCi1XZWQgU2VwIDMwIDA3OjM0OjA5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvejhrc2ltLm10OiBuZXcgZmlsZQotCi1GcmkgU2VwIDI1IDEzOjQ5OjUyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBreXJpYXRoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsZGV4cC5vLCBsZGN0b3IubywgbGRsYW5nLm8sIGxkbWFpbi5vLCBsZHdyaXRlLm8sCi0JbGV4c3VwLm8sIG1yaS5vLCByZWxheC5vKTogSW5kaWNhdGUgZGVwZW5kZW5jZSBvbiBsZGdyYW0uaC4KLQotCSogbGQuaCAoc3RyaXBfc3ltYm9sc190eXBlKTogQWRkIHZhbHVlIFNUUklQX1NPTUUuCi0JKiBsZGdyYW0ueSAoT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEUpOiBOZXcgdGVybWluYWwgdG9rZW4uCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfa2VlcHN5bXNfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGV4Lmw6IEhhbmRsZSAiLXJldGFpbi1zeW1ib2xzLWZpbGUiLgotCSogbGRzeW0uYyAoa2VlcHN5bXNfZmlsZSwga2VwdF9zeW1zKTogTmV3IHZhcnMuCi0JKHByb2Nlc3Nfa2VlcHN5bXMpOiBOZXcgZnVuY3RpaG9uOyByZWFkcyBmaWxlLCBtYXJrcyBzeW1ib2xzIGZvcgotCXNhdmluZy4KLQkod3JpdGVfZmlsZV9sb2NhbHMpOiBGaWxlIHN5bWJvbHMgc2hvdWxkIGFsd2F5cyBiZSBrZXB0LgotCShsZHN5bV93cml0ZSk6IFdhcm4gYWJvdXQgIi1yZXRhaW4tc3ltYm9scy1maWxlIiBvdmVycmlkaW5nICItUyIKLQlhbmQgIi1zIi4gIFByb2Nlc3MgcmV0YWluLXN5bWJvbHMgZmlsZSBiZWZvcmUgc2V0dGluZyBzeW10YWIuCi0JKiBsZHN5bS5oIChTWU1fS0VFUCk6IE5ldyBmbGFnIGZvciBsZHN5bV90eXBlIGZsYWdzLgotCShrZWVwc3ltc19maWxlLCBrZXB0X3N5bXMpOiBEZWNsYXJlIHRoZW0uCi0KLQkqIGxkbWFpbi5jIChtYWluKTogTm9uLWZhdGFsIGVycm9ycyBzaG91bGQgc3RpbGwgY2F1c2Ugbm9uLXplcm8KLQlleGl0IHN0YXR1cyBldmVuIHdpdGggLXIuCi0KLUZyaSBTZXAgMjUgMTE6MDg6MDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQlBZGRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHRoZSB6OGsKLQkqIHo4a3NpbS5lbSwgejhrc2ltLnNjLXNoLCB6OGtzaW0uc2g6IG5ldyBmaWxlcwotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogbW9kaWZpZWQgdG8gcmVmbGVjdCBhYm92ZQotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IHdoZW4gbGlua2luZyBjb25mbGljdGluZyBhcmNoaXRlY3R1cmVzLAotCW1ha2UgdGhlIG91dHB1dCBmaWxlIHJlZmxlY3QgYXQgbGVhc3Qgb25lIG9mIHRoZSBiYWQgaW5wdXRzLgotCi1UdWUgU2VwIDE1IDE1OjM1OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpZiAkKHRvb2xkaXIpIGV4aXN0cywgaW5zdGFsbCBsZCBpbgotCSQodG9vbGRpcikvYmluLgotCi1GcmkgU2VwIDExIDEwOjI0OjIyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBtb2RpZmllZCB0byBzdXBwb3J0IGkzODYtY29mZgotCSogaTM4NmNvZmYuc2g6IG5ldyBmaWxlCi0KLVdlZCBTZXAgIDkgMTE6NTI6NTggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgbTY4a2NvZmYuc2gsIG02OGtjb2ZmLnNjLXNoLCBjb25maWcvbTY4ay1jb2ZmLm10OgotCWFkZGVkIG02OGstY29mZiBlbXVsYXRpb24gbW9kZSwgc3RvbGVuIGZyb20gYTI5ayBlbXVsYXRpb24uCi0JQWxtb3N0IGNlcnRhaW5seSB3cm9uZywgYnV0IHBlcmhhcHMgYmV0dGVyIHRoYW4gc3VuMy4KLQotVGh1IFNlcCAgMyAxNDoxOTozMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBNYWtlZmlsZS5kb3MsIGdlbmVyaWMuZW0sIGdlbnNjcmlwdHMuc2gsCi0JZ2xkOTYwLmVtLCBoODMwMGhtcy5lbSwgaDgzMDB4cmF5LmVtLCBsbms5NjAuZW0sIHN0MjAwMC5lbSwKLQl2YW5pbGxhLmVtOiAgUmVuYW1lIGFsbCAoZ2VuZXJhdGVkKSBsZF9fKi5jIGZpbGVzIHRvIGVtXy5jLgotCVRoaXMgaXMgb25lIGNoYXJhY3RlciBzaG9ydGVyLCBhbmQgbGV0cyBwZW9wbGUgYnVpbGQgb24KLQlTVlIzIHN5c3RlbS4gKGxkX19oODMwMHhyYXkuW2NvXSB3YXMgdGhlIGtpbGxlciB0aGVyZTsKLQloODMwMHhyYXkuc2Mtc2ggaXMgYWxzbyBvdmVybG9uZywgYnV0IHNlZW1zIGhhcm1sZXNzLikKLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSm9uYXRoYW4gUnlzaHBhbiA8aGl0YWNoaSFhbWl0byFqb24+LgotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogIEZpeCB0eXBvIG1vc3RjbGVhbiAtPiBtb3N0bHljbGVhbi4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBob3N0IGlzYy4KLQotCSogbGR2ZXIuYzogIENhbGwgaXQgdmVyc2lvbiAyLjAuCi0KLVdlZCBTZXAgIDIgMDA6MjE6MzMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiAgQnVtcCB0byB2ZXJzaW9uIDAuOTguCi0JKiBUT0RPOiAgTmV3IGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkZWQgbW9zdGx5Y2xlYW4sIGRpc3RjbGVhbiwgcmVhbGNsZWFuIHJ1bGVzLgotCi1UdWUgU2VwICAxIDIzOjQyOjE2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKHhyZWFsbG9jKTogIE5ldyAobmVlZGVkIGJ5IC4uL2xpYmliZXJ0eS9jcGx1cy5kZW0uYykuCi0JKiBsZGxleC5sOiBNb3ZlZCBjb21tZW50KCkgdG8gZW5kLCBzaW5jZSBzb21lIGNvbXBpbGVycwotCW90aGVyd2lzZSBoYXZlIHByb2JsZW1zIHdpdGggaW5wdXQoKSB1c2VkIGJlZm9yZSBpdCBpcyBkZWZpbmVkLgotCi1UdWUgU2VwICAxIDE3OjQ1OjUxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGRlZCBTb2xhcmlzIDIgYW5kIElyaXggNCBob3N0IHN1cHBvcnQuCi0KLU1vbiBBdWcgMzEgMTk6Mjc6MTEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIC1TIGZsYWcgZnJvbSB0aGUgRkxFWCBkZWZpbml0aW9uCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmV3cm90ZSwgdXNpbmcgbmV3IHN0eWxlIGNhc2Ugc3RhdGVtZW50LiAgdXNlCi0JbTY4ay5tdCBmb3IgbTY4ay1hb3V0IHN5c3RlbXMKLQotU3VuIEF1ZyAzMCAyMTozODo1MyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYXAgImxkIiB0aHJvdWdoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgd2hlbgotCWluc3RhbGxpbmcuCi0KLVN1biBBdWcgMzAgMTg6MTI6MTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogIFJlbW92ZWQuICBVc2UgdGhlIHZlcnNpb24gaW4gbGliaWJlcnR5IG5vdy4KLQkqIGxkbWlzYy5jOiAgVXNlIG5ldyBsaWJpYmVydHkgdmVyc2lvbiBvZiBjcGx1c19kZW1hbmdsZSgpLgotCi1UaHUgQXVnIDI3IDE2OjM4OjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZ2xkOTYwLmVtIChnbGQ5NjBfY2hvb3NlX3RhcmdldCk6IGRlZmF1bHQgdG8gbGl0dGxlIGVuZGlhbiwgbm90Ci0JYmlnIGVuZGlhbi4KLQotV2VkIEF1ZyAyNiAxNzoyODo1MSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IGRvbid0IHBhc3MgbnVsbCBwb2ludGVycyB3aGVuCi0JYWJzX291dHB1dF9zZWN0aW9uIGlzIHdoYXQgaXMgcmVxdWlyZWQuCi0JKiBsZHdyaXRlLmMgKGxkd3JpdGUpOiB1c2UgbWFsbG9jIHRvIGFsbG9jYXRlIHRoZSBsYXJnZXN0IHNwYWNlCi0JdXNlZCwgYW5kIHBhc3MgdGhhdCBkb3duLgotCSogcmVsYXguYyxyZWxheC5oICh3cml0ZV9yZWxheG5vcmVsKTogdXNlIHRoZSBwYXNzZWQgbWFsbG9jIGFyZWEgcmF0aGVyCi0JdGhhbiBhbGxvY2EuCi0KLU1vbiBBdWcgMjQgMTQ6NDI6MDYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9vc2U2OC5tdDogcmVuYW1lZCBPU0UgdG8gb3NlLgotCi1UaHUgQXVnIDIwIDE5OjU1OjIyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6IFJlb3JkZXIgY2hlY2sgZm9yIGNvbW1vbiBvcgotCXVuZGVmaW5lZCBzeW1ib2xzIHNvIHRoYXQgaXQgd29ya3MuCi0KLVR1ZSBBdWcgMTggMTM6NDE6MzYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFjY2VwdCBhbGwgbTY4SyBmYW1pbHkgbWVtYmVycy4KLQotCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotCi1UaHUgQXVnIDEzIDExOjQ5OjM0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBub3cgcGFyc2VzIGNvbW1lbnQgY29ycmVjdGx5LCBhZGRlZCB+IHRvIGFjY2VwdGFibGUKLQljaGFycyBpbiBmaWxlbmFtZXMKLQotCSogbGRleHAuYyAoZXhwX3Vub3ApOiBwYXNzIGRvd24gYWJzX291dHB1dF9zZWN0aW9uIC0gbm93IGNhbiBoYXZlCi0JdW5hcnkgLXZlIGNvbnN0YW50cy4KLQotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogd2FybiB3aGVuIGFuIGVudHJ5IHN5bWJvbCBzdXBwbGllZCBvbgotCXRoZSBjb21tYW5kIGxpbmUgY2FuJ3QgYmUgZm91bmQuCi0KLUZyaSBBdWcgIDcgMTI6MzE6MTAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5oOiBhZGQgbmV3IGZpZWxkICJsb2FkYWJsZSIgdG8gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LgotCSogbGRsYW5nLmMgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCk6IGluaXRpbGl6ZSBuZXcKLQlmaWVsZC4gKHdpbGRfZG9pdCk6IGlmIG5ldyBmaWVsZCBpcyBub3Qgc2V0LCB0aGVuIHN0b3Agb3V0cHV0Ci0Jc2VjdGlvbiBmcm9tIGJlaW5nIGxvYWRhYmxlLgotCShsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IHNldCB0aGUgZmllbGQgZnJvbSB0aGUKLQlOT0xPQUQga2V5d29yZAotCSogbGRncmFtLnk6IG5ldyBzeW5heCBmb3IgTk9MT0FELiBSZW1vdmVzIGEgc2hpZnQvcmVkdWNlIHRvby4KLQkqIGg4MzAwaG1zLnNjLXNoLCBoODMwMGhtcy5lbTogZ2V0IC1yIHJpZ2h0LgotCi1UaHUgQXVnICA2IDE4OjM1OjIxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRpbnQudGV4aW5mbzogIE5ldyBpbnRlcm5hbHMgbWFudWFsIChiZWdpbm5pbmdzIHRoZXJlb2YpLgotCSogUE9SVElORzogIFJlbW92ZWQsIG1lcmdlZCBpbnRvIGxkaW50LnRleGluZm8uCi0KLVR1ZSBBdWcgIDQgMjE6MTI6MjkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjZHRlc3QtbWFpbi5jYywgY2R0ZXN0LWZ1bmMuY2MsIGNkdGVzdC1mb28uaCwgY2R0ZXN0LWZvby5jYywKLQljZHRlc3QuZXhwOiAgQSB0ZXN0IHByb2dyYW0gKGNvcGllZCBmcm9tIGxpYmcrKy90ZXN0LWluc3RhbGwpCi0JdGhhdCB0ZXN0cyB0aGF0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9ycyBhcmUgaGFuZGxlZAotCWNvcnJyZWN0bHkuCi0KLU1vbiBBdWcgIDMgMTQ6NTg6MTkgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGluc3RhbGwgZnJvbSBsZC5uZXcsIHJlbmFtaW5nIGR1cmluZyB0aGUKLQljb3B5LCBvciBlbHNlIHRoZSBuZXh0ICdtYWtlIGluc3RhbGwnIG5lZWRzIHRvIHJlLWxpbmsgbGQuCi0KLU1vbiBKdWwgMjAgMDM6Mzc6MDYgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGdlbmVyYWxpc2UgaHAgcmVjb2duaXRpb24gKGZyb20gc2VmKS4KLQotU2F0IEp1bCAxOCAxNDo0NjowNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGJzZCBhbmQgaHB1eCBocHBhIGNvbmZpZ3VyYXRpb25zLgotCWVycm9yIG1lc3NhZ2VzIGVjaG8gdG8gc3RkZXJyLCBub3Qgc3Rkb3V0Ci0KLUZyaSBKdWwgMTcgMjI6MDY6MTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5kb3MsIGdsZC4xLCBsZC50ZXhpbmZvLCBsZGVtdWwuYywgbGRmaWxlLmMsIGxkbGFuZy5jLAotCSAgbGRtaXNjLmM6IHJlbW92ZWQgcmNzaWQncy4KLQotVHVlIEp1bCAxNCAwODozNDozNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfbWFwKTogcHJpbnQgY2hhbmdlcyBpbiBzaXplcyBkdWUgdG8gcmVsYXhpbmcKLQkoc2l6ZV9pbnB1dF9zZWN0aW9uKTogbWFpbnRhaW4gdGhlIGRlbHRhIGluZm9ybWF0aW9uLgotCSogbGRsYW5nLmg6IGFkZCBuZXcgZmllbGQgdG8gc3RydWN0IHRvIGNvbnRhaW4gZGVsdGEgaW5mby4KLQkqIHJlbGF4LmMgIChyZWxheF9zZWN0aW9uKTogY29tcGxhaW4gaWYgaW5wdXQgbm90IHJlbGF4YWJsZS4KLQkqIGxkbGV4LmwgOiBhZGQgJ18nLCAnLCcgYW5kICckJyB0byBjaGFycyB3aGljaCBjYW4gYXBwZWFyIGF0IHRoZQotCXN0YXJ0IG9mIGEgZmlsZW5hbWUKLQotTW9uIEp1bCAxMyAxNzozMzowMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMobWFpbik6IHByZXZlbnQgLXIgYW5kIC1yZWxheCBmcm9tIGJlaW5nIG9uIGF0IHRoZSBzYW1lCi0JdGltZS4KLQotV2VkIEp1bCAgMSAxNzo1MToxOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKFFfZW50ZXJfZ2xvYmFsX3JlZiksIGxkaW5kci5jIChhZGRfaW5kaXJlY3QpOiBmaXggZm9yCi0JYWxpYXNpbmcgcHJvYmxlbXMKLQotCi1UaHUgSnVuIDE4IDA5OjM4OjU2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBoODMwMGhtcy5lbSwgaDgzMDBobXMuc2Mtc2g6ICBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIC1yCi0JKiBsZGV4cC5jOiAgbGludAotCSogbGRsYW5nLmMob3Blbl9vdXRwdXQpOiBzZXQgdGhlIHRhcmdldCBhcmNoIGFuZCBtYWNoaW5lIGFzIHNvb24KLQlhcyB3ZSBjYW4uIChsYW5nX3NpemVfc2VjdGlvbnMpOiB1c2UgbmV3IG1hY3JvcyBmb3Igc2V0dGluZyB2bWEKLQkqIGxkd3JpdGUuYzogbGludAotCi1Nb24gSnVuIDE1IDA4OjQ3OjQzIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobXlfdGFyZ2V0KTogQWNjZXB0IG02ODA/MCBmb3Igd3JzIGFzIHZ4d29ya3M2OC4KLQlBbHNvIGRlbGV0ZWQgYW4gdW5yZWFjaGFibGUgcGF0aCB0byB3cnMuCi0KLVdlZCBNYXkgMjcgMjM6MjQ6MTkgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiB1c2UgLWQgdGVzdCBmb3IgJHRvb2xkaXIgYmVmb3JlCi0JaW5zdGFsbGluZyBsZCB0aGVyZSBzbyB0aGF0ICR0b29sZGlyIGNhbiBiZSBpbmhlcml0ZWQgZnJvbQotCXRvcC1sZXZlbCBNYWtlZmlsZS4KLQotV2VkIE1heSAyNyAxNjo1Njo0OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jOiAgVHdvIG5vbi1zdWJzdGFudGlhbCBjaGFuZ2VzIGZvciB0aGUgc2FrZSBvZgotCXRoZSBvbGQgUG9ydGFibGUgQyBDb21waWxlci4KLQotV2VkIE1heSAyNyAxNToxNTo1OCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGxkZ3JhbS55LCBsZGxleC5sOiBwYXJzZSBBQlNPTFVURQotCSogbGRleHAuYzogYWRkIHN1cHBvcnQgZm9yIEFCU09MVVRFCi0KLVdlZCBNYXkgMjcgMTM6MDc6MjAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZGVkIGRlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIEhPU1RJTkdfQ1JUMCwKLQlIT1NUSU5HX0xJQlMsIGFuZCBIT1NUSU5HX0VNVSwgYmFzZWQgb24gdGhvc2UgaW4gY29uZmlnLyoubWguCi0JKiBjb25maWcvKi5taDogIE1pc2NlbGxhbmVvdXMgY2xlYW4tdXA6ICBSZW1vdmVkIGRlZmluaXRpb25zCi0Jb2YgWUFDQyAoc2luY2UgaXQgaXMgbm90IGxvbmdlciB1c2VkIGluIHRoZSBNYWtlZmlsZSkuCi0JUmVtb3ZlIEhPU1RJTkdfKiBkZWZpbml0aW9ucyB0aGF0IGFyZSBzdWJzdW1lZCBieSB0aGUKLQlvbmVzIGFkZGVkIHRvIE1ha2VmaWxlLmluLiAgUmVtb3ZlZCBtb3N0IGRlZmluaXRpb25zIG9mIENDLgotCSogY29uZmlnL3tzcGFyYyxuZXdzLGhwMzAwYnNkLGRlY3N0YXRpb259Lm1oOiAgUmVtb3ZlZDsKLQlUaGVzZSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KLQotRnJpIE1heSAyMiAxMzo0NzoxOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBVc2Ugc3JjZGlyIGluc3RlYWQgb2YgVlBBVEggaW4gbGRncmFtL2xkbGV4Ci0JcnVsZXMsIHNpbmNlIHRoZXNlIGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgYSBkaXN0cmlidXRpb24uCi0JKiBNYWtlZmlsZS5pbiAobGRsZXguYyk6ICBEb24ndCByZS1kaXJlY3Qgb3V0cHV0LCBzaW5jZSB0aGF0Ci0JbGVhdmVzIGEgYm9ndXMgb3V0cHV0IGZpbGVzIGlmIGl0IGZhaWxzLgotCi0JKiBjb25maWcvc3BhcmMubWg6ICBGaXggSE9TVElOR19MSUJTIHNvIGl0IGhhcyBhIGNoYW5jZSBvZiB3b3JraW5nLgotCSogbGRsZXguYzogIEZpeCBzb21lIHVubmVjZXNzYXJ5IGZsZXgtc3BlY2lmaWMtaXNtcy4KLQotRnJpIE1heSAgOCAxMTo0OTo0MyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IG1vdmUgc3B1cmlvdXMgc2VtaWNvbG9uCi0JKiBsZGV4cC5oOiBmaXggcHJvdG90eXBlCi0KLVRodSBNYXkgIDcgMTc6MDE6MTIgMTk5MiAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogbGQudGV4aW5mbzogcmVmZXJlbmNlcyB0byBsaW5rZXIgbm93IHNheSAibGQiIG5vdCAiZ2xkIi4KLQotV2VkIE1heSAgNiAxMzoyNjoxOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCWNoYW5nZWQgY2FsbGluZyBjb252ZW50aW9uIGZvciBRX2VudGVyX2dsb2JhbF9yZWYKLQkqIGxkZXhwLmMsIGxkbGFuZy5jLCBsZG1haW4uYzogcmVmbGVjdCB0aGlzCi0JKiBsZHZlci5jOiBidW1wIHZlcnNpb24gdG8gMS45Ny4xCi0JKiBsZGluZHIuYyAoYWRkX2luZGlyZWN0KTogd2hlbiBhbiBlZGljdCBkZWNsYXJpbmcgYW4gaW5kaXJlY3QKLQlzeW1ib2wgaXMgZm91bmQsIG1ha2Ugc3VyZSB0aGF0IGFueSBpZGVhcyBhYm91dCB0aGUgc3ltYm9sIGJlaW5nCi0JY29tbW9uIGFyZSBjaGFuZ2VkIGlmIGl0IG5vdyBrbm93biB0byBiZSBkZWZpbmVkLgotCSogbGRtYWluLmMgKGxpbmVhcl9saWJyYXJ5KTogY29tcGxhaW4gb25jZSBpZiBhcmNoaXZlIGlzbid0Ci0JcmFubGliYmVkLgotCSogbGRsYW5nLmgsIGxkbGFuZy5jOiBtYWtlIHJvb20gZm9yIGFuZCBpbml0aWFsaXplIHRoZSBjb21wbGFpbgotCW9uY2UgZmllbGQuCi0KLVdlZCBNYXkgIDYgMTE6MDc6MzUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIGZsZXggJiBiaXNvbiBmcm9tIC4uLyBpZiB0aGV5IGV4aXN0LgotCi1UdWUgTWF5ICA1IDE3OjQ3OjMzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxheC5jIChidWlsZF9pdCk6IGRvbid0IGFsbG9jYXRlIHNwYWNlIGluIHRoZSBvdXRwdXQgZmlsZSBmb3IKLQlzdHVmZiBpZiAtUiBmbGFnIGFwcGx5cyB0byBpdC4KLQkqIGxkZmlsZS5jOiBtZXJnZSBpbiBWTVMgZmlsZW5hbWUgc3VwcG9ydAotCSogbGRtYWluLmMgKG1haW4pOiB0YWtlIG91dCAuLyBmcm9tIGxpYnJhcnkgcGF0aCwgYW5kIGNsb3NlIGZpbGUKLQliZWZvcmUgdW5saW5raW5nLiBNYWtlIG11bHRpcGxlIGRlZnMgb2YgYSBzeW1ib2wgY3JlYXRlIGFuCi0JdW5leGVjYWJsZSBmaWxlLgotCSogbGRtaXNjLmM6IGZhdGFsIGVycm9zcnMgZGVsZXRlIG91dHB1dCBmaWxlCi0KLVR1ZSBNYXkgIDUgMTQ6MDU6MDUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiAgSW5jcmVhc2UgdmVyc2lvbiBudW1iZXIgdG8gMS45NywgZm9yIGNvbnNpc3RlbmN5Ci0Jd2l0aCAuLi9iaW51dGlscy4KLQotVHVlIE1heSAgNSAxMjoxMjoyNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEZMRVggLT4gTEVYLgotCi0JKiBsZC50ZXhpbmZvOiB7fSAtPiBAe0B9LgotCi1Nb24gTWF5ICA0IDE3OjUyOjQxIDE5OTIgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86IGRlc2NyaWJlIGFsdGVybmF0ZSwgTVJJLWNvbXBhdGlibGUgbGlua2VyIHNjcmlwdHMKLQkoYW5kIGFzc29jaWF0ZWQgY2hhbmdlIGluIC1jIG9wdGlvbiwgbm93IHVzZWQgZm9yIHRoZXNlIHNjcmlwdHMpCi0KLU1vbiBNYXkgIDQgMTY6MTA6MTAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6IEJ1bXBlZCB2ZXJzaW9uIHRvIDEuOTYgLSBuZXcgcmVsZWFzZSwgcmVzeW5jIHdpdGggdGhlCi0JYmZkIHRvbyAjLgotCSogbGRleHAuYywgbGRsYW5nLmM6IG5vdyBidWlsZCBtZW1vcnkgc2hhcGUgdHJlZSBpbiBvYnN0YWNrcwotCXJhdGhlciB0aGFuIHdpdGggcmF3IG1hbGxvYywgbWFrZXMgaXQgZWFzaWVyIHRvIHRyYWNrIHdoZXJlIG1lbW9yeQotCWlzIGdvaW5nLgotCSogbGRzeW0uaCwgbGRzeW0uYzogY3JlYXRlIG9ic3RhY2sgZm9yIGFsbCBnbG9iYWwgc3ltYm9scyB0b28uCi0JKiBsZHdyaXRlLmMgKGxkd3JpdGUpOiBtb3ZlZCBtYWxsb2Mgc28gb25seSB1c2VkIHdoZW4gbmVlZGVkLgotCSogc2EyOTIwMC1zYy5zaDogYWRkZWQgc3VwcG9ydCBmb3IgLmxpdCwgZGF0YTEgYW5kIGRhdGEyIHNlY3Rpb25zLgotCi0KLUZyaSBNYXkgIDEgMTg6MTc6NTIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zcGFyYy5taDogdXNlIC4uL2djYy9saWJnY2MuYSBvbiBjaGVjayBpZiBpdCBleGlzdHMuCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgYm9vdHN0cmFwIGZvciBjaGVjay4KLQotRnJpIE1heSAgMSAxMzowMzo0MSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnksIGxkbGV4LmMsIG1yaS5jOiBhZGRlZCBtb3JlIGNvbXBhdGlibGUgd29yZHM7IEJBU0UsIEFMSUFTIGFuZAotCVBVQkxJQy4KLQkqIE1ha2VmaWxlLmluOiBub3cgdXNlIGZsZXgsIG5vdCBsZXgKLQkqIGxkbGV4LmwsIGxkbGFuZy5jLCBsZGN0b3IuYzogbGludAotCi1XZWQgQXByIDIyIDEyOjQ4OjQyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBhZGRlZCBDTURGSUxFTkFNRUNIQVIgc3RhdGUgc28gdGhhdCB5b3UgY2FuIGxleAotCWRpZmZlcmVudCBzb3J0cyBvZiBmaWxlbmFtZXMgb24gdGhlIGNvbW1hbmQgbGluZSB0aGFuIGluIGEgc2NyaXB0LgotCi1Nb24gQXByIDIwIDIyOjM3OjA0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJld29yayBDRkxBR1Mgc28gdGhhdCB0aGV5IGNhbiBiZSBwYXNzZWQgb24gdGhlCi0JICBtYWtlIGNvbW1hbmQgbGluZS4gIFJlbW92ZSBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0KLUZyaSBBcHIgMTcgMDg6NTc6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbGF4LmM6IGFkZGVkIGhhbmRsaW5nIGZvciBuZXcgInBhZGRpbmciIHNlY2xldCB0eXBlLCB1c2VkIHRvCi0JZmlsbCBvdXQgZ2FwcyBiZXR3ZWVuIHNlY3Rpb24uCi0JKiBsZGdyYW0ueSwgbGRsZXgubDogbm93IC1kZWZzeW0gb24gdGhlIGNvbW1hbmQgbGluZSBpcyBkb25lCi0JcHJvcGVybHkuCi0KLVdlZCBBcHIgMTUgMjE6MjA6MDcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdGhlIHRvb2xkaXIgY29weSBvZiBsZCBnb2VzIGRpcmVjdGx5IGluIHRvb2xkaXIuCi0KLVdlZCBBcHIgMTUgMTY6MDk6MzMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG1yaS5jLCBsZGdyYW0ueSwgbGRsZXgubDogYWRkZWQgc3VwcG9ydCBmb3IgbWluaW1hbCBzdHJhbmdlIGxpbmsKLQlzY3JpcHRzLgotCi1UaHUgQXByICA5IDA1OjUyOjAyIDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEluc3RhbGwgc2Vjb25kIGNvcHkgaW4gJCh0b29sZGlyKS9iaW4KLQl3aXRob3V0ICQocHJvZ3JhbV9wcmVmaXgpLCBzaW5jZSB0aGF0J3Mgd2hhdCBnY2MgZXhwZWN0cy4KLQotU2F0IEFwciAgNCAxNzo0NDowNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubCwgbGRncmFtLnksIGxkbGV4Lmg6IFJld3JvdGUgbGV4ZXIuIE5vdyBpdCdzIG11Y2ggbmljZXIuCi0JKiBoODMwMCo6IGZpeCBiaXQgcm90IGFuZCBhZGQgc3VwcG9ydCBmb3IgaDgzMDB4cmF5IHRhcmdldAotCSogZ28zMi5zaDogdGFyZ2V0IGVtdWxhdGlvbiBmb3IgZ28zMi4KLQotTW9uIE1hciAxNiAxNDo1MzoyOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BydGwuY3lnbnVzLmNvbSkKLQotCSogZ2xkOTYwLmVtLCBpOTYwLnNjLXNoLiBGaXggaTk2MCBiaXQgcm90Ci0KLUZyaSBNYXIgMTMgMTk6NDc6MjIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIG1hbiBwYWdlLgotCi1GcmkgTWFyIDEzIDA4OjIzOjU5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtPGZvbz4gcmVuYW1lZCB0byA8Zm9vPi5tdAotCSogY29uZmlnL21oLTxmb28+IHJlbmFtZWQgdG8gPGZvbz4ubXQKLQkqIGNvbmZpZ3VyZS5pbiBjaGFuZ2VkIHRvIHJlZmxlY3QgdGhpcwotCSogZ2Vuc2NyaXB0cy5zaCBub3cgbWFrZSAueGJuIGZpbGVzIHJhdGhlciB0aGFuIC54TiBmaWxlcwotCi1TYXQgTWFyICA3IDAzOjQwOjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBsZHZlci5oOiBmaXggZGVjbCBvZiBsZHZlcnNpb24uCi0KLUZyaSBNYXIgIDYgMjI6MDA6MzUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLUZyaSBNYXIgIDYgMDY6NTk6MDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChRX2VudGVyX2ZpbGVfc3ltYm9scyk6IG5vdyBhbGlhc2VzIHdvcmsgYWdhaW4KLQotVGh1IE1hciAgNSAyMTozOToyOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNsZWFuLWluZm8gdGFyZ2V0LgotCi1UaHUgTWFyICA1IDE2OjU1OjU2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdHJlZSk6IGRvbid0IHRyeSBhbmQgZm9sbG93IG51bGwgcG9pbnRlcnMKLQlhcm91bmQuCi0JKiBsZGdyYW0ueTogcmVtb3ZlIDExIHNoaWZ0IHJlZHVjZSBlcnJvcnMKLQotVHVlIE1hciAgMyAxNTo0NjozOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB0b29sZGlyIGFuZCBwcm9ncmFtX3ByZWZpeC4KLQotRnJpIEZlYiAyOCAwODoxNzo0NSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHNpemVfaW5wdXRfc2VjdGlvbik6IGRvbid0IG1vdmUgYWJzb2x1dGUgc2VjdGlvbnMKLQlhcm91bmQhCi0KLQotVGh1IEZlYiAyNyAwOToyMDo0MSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IHlldCBhbm90aGVyIGNvcHkgb2YgdGhpcyAtIG1heWJlIGl0IHNob3VsZCBnbyBpbnRvCi0JbGliaWJlcnR5ID8KLQkqIGxkZ3JhbS55OiBub3cgLVYgYW5kIC12IGhhdmUgZGlmZmVyZW50IGFjdGlvbnMKLQkqIGxkdmVyLmM6IGlmIC1WLCBwcmludHMgbGlzdCBvZiBlbXVsYXRpb25zIGNvbXBpbGVkIGluCi0JKiBsZG1pc2MuYzogc3VwcG9ydCBmb3IgY3BsdXMgZGVtYW5nbGluZwotCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1UaHUgRmViIDIwIDE3OjQzOjQ2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZSBta3NjcmlwdCBydWxlIGludG8gb25lIGZvciAuL21rc2NyaXB0Ci0JKGZvciB0aGUgc2FrZSBvZiBtYWtlcyB0aGF0IGRvbid0IHJlYWxpemUgdGhleSdyZSB0aGUgc2FtZSkuCi0JKiBQT1JUSU5HOiAgQWRkIG1vcmUgZGV0YWlscy4KLQkqIGdlbnNjcmlwdHMuc2g6ICBBZGQgbW9yZSB0YWlsb3JhYmlsaXR5IG9mIERBVEFfQUxJR05NRU5ULgotCi1Nb24gRmViIDE3IDEyOjA0OjM2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYW5kIG5ldyBmaWxlcyBocDMwMGJzZC5zaCwgY29uZmlnL21oLWhwMzAwYnNkLAotCWNvbmZpZy9tdC1ocDMwMGJzZDogIE5ldyBwb3J0IHRvIGhwMzAwIHJ1bm5pbmcgQlNELgotCi1TYXQgRmViIDE1IDEzOjU5OjU0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JTWFqb3IgcmV3cml0ZSBvZiBob3cgbGQgaXMgY29uZmlndXJlZC4gIFRoZSBtYWpvciBpZGVhCi0JaXMgdG8gdXNlIHNoZWxsIHNjcmlwdHMgdG8gZ2VuZXJhdGUgZXZlcnl0aGluZy4KLQkqIGdlbmVyaWMuZW0gcmVwbGFjZXMgbGR0ZW1wbGF0ZS4KLQkqIE90aGVyICouZW0gZmlsZXMgcmVwbGFjZSB2YXJpb3VzICouYyBmaWxlcy4KLQlBICouZW0gZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGdlbmVyYXRlcyB0aGUgY29ycmVzcG9uZGluZwotCWxkX18qLmMgZmlsZSB0aGF0IGltcGxlbWVudHMgYW4gZW11bGF0aW9uLiAgVGhpcyBpcyB1c3VhbGx5Ci0JYSBzdHJhaWdodCAnY2F0JyBvZiBhIGhlcmUtZG9jdW1lbnQsIHBvc3NpYmx5IHdpdGggc3Vic3RpdHV0aW9ucy4KLQkqIFNjcmlwdCBmaWxlcyAoKi5zYykgYXJlIHBsYWNlcyBieSAqLnNjLXNoIHNjcmlwdHMuCi0JQWdhaW4sIHRoZXNlIGFyZSBzaW1wbGUgc2hlbGwgc2NyaXB0cyB0aGF0ICdjYXQnCi0JaGVyZS1kb2N1bWVudHMsIHVzdWFsbHkgd2l0aCBzb21lIHN1YnN0aXR1dGlvbnMuCi0JVGhlIG91dHB1dCBhICouc2Mtc2ggaXMgYSBzY3JpcHQgZmlsZS4KLQkqIEVhY2ggZW11bGF0aW9uIGlzIGRlZmluZWQgYnkgYSBzaG9ydCBzaGVsbCBzY3JpcHQgd2l0aAotCWV4dGVuc2lvbiAqLnNoIHRoYXQgc3BlY2lmaWVzIHRoZSBlbXVsYXRpb24tc3BlY2lmaWMKLQlwYXJhbWV0ZXJzIChzdWNoIGFzIHRoZSBuYW1lIG9mIHRoZSAqLnNoLXNjIGFuZCAqLmVtCi0JZmlsZXMgdG8gdXNlKS4KLQkqIGdlbnNjcmlwdC5zaCBpcyB0aGUgbWFzdGVyIHNoZWxsIHNjcmlwdCB1c2VkIHRvIGdlbmVyYXRlCi0JYW4gZW11bGF0aW9uLiAgSXQgaXMgcGFzc2VkIHZhcmlvdXMgYXJndW1lbnQsIGluY2x1ZGluZwotCXRoZSBuYW1lIGEgdGhlIGVtdWxhdGlvbi1zcGVjaWljICouc2ggZmlsZSB0aGF0IGl0Ci0JInNvdXJjZXMiIHRvIHNldCB2YXJpYWJsZXMgdG8gZW11bGF0aW9uLXNwZWNpZmMgcGFyYW1ldGVycy4KLQkqIGNvbmZpZy9tdC1mb286ICBDaGFuZ2VkIEVNVUw9R0xERk9PX0VNVUxBVElPTl9OQU1FCi0JdG8gRU1VTD1mb28uIChUaGUgR0xERk9PX0VNVUxBVElPTl9OQU1FcyBoYXZlIGJlZSByZW1vdmVkLikKLQkqIGNvbmZpZy9taC1mb286ICBSZW5hbWUgTERFTVVMQVRJT04gbmFtZXMgYXMgYXBwcm9wcmlhdGUKLQkodXN1YWxseSAnZ2xkZm9vJyAtPiBwbGFpbiAnZm9vJykuCi0JKiBsZHdyaXRlLmM6ICBGaXhlZCBhIHR5cG8gaW4gYSBjb21tZW50LgotCSogTWFrZWZpbGUuaW46ICBNYWpvciBjaGFuZ2VzLiAgUmVtb3ZlZCBzb21lIHRoZSBzZWQKLQltYWdpYyB0byBjb252ZXJ0cyBzY3JpcHRzLCBzaW5jZSB0aGF0IGlzIG5vdyBoYW5kbGVkCi0JYnkgZ2Vuc2NyaXB0cy5zaCBhbmQgdGhlICouc2Mtc2ggc2NpcHQgZ2VuZXJhdG9ycy4KLQkqIGNvbmZpZy5oOiAgUmVtb3ZlIGEgYnVuY2ggb2YgbWFjcm9zIGRlZmluaW5nIGVtdWxhdGlvbnMKLQlhbmQgdGFyZ2V0cy4gIFRoaXMgYmVjb21lcyBvbmUgbGVzcyBmaWxlIHRvIGVkaXQgd2hlbgotCWFkZGluZyBlbXVsYXRpb25zIG9yIHRhcmdldHMuCi0JKiBsZGVtdWwuaCAoc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6ICBBZGQKLQllbXVsYXRpb25fbmFtZSBhbmQgdGFyZ2V0X25hbWUgZmllbGRzLgotCSogbGRlbXVsLmMsIGxkZW11bC5oOiAgRGVmaW5lIHNvbWUgZGVmYXVsdCBmdW5jdGlvbnMgdXNlZAotCWJ5IG1vc3QgZW11bGF0aW9ucyAoYW5kIHJlbW92ZSBmcm9tIHRoZSAqLmVtIHNjcmlwdHMpLgotCSogbGRlbXVsLmMgKGxkZW11bF9jaG9vc2VfdGFyZ2V0KTogIFNlYXJjaCB0aGUgbmV3Ci0JbGRfZW11bGF0aW9ucyBhcnJheSB1c2luZyBhIGxvb3AgKGluc3RlYWQgb2YgYSBoYXJkd2lyZWQKLQluZXN0ZWQgaWYgc3RhdGVtZW50KS4KLQlEZWZpbmUgdGhlIGxkX2VtdWxhdGlvbiBmcm9tIHRoZSBhdXRvbWF0aWNhbGx5LWdlZW5yYXRlZAotCWxkZW11bC1saXN0LmguICBUaGlzIG1lYW5zIHlvdSBubyBsb25nZXIgaGF2ZSB0byBlZGl0IGxkZW11bC5jCi0JdG8gYWRkIGEgbmV3IGVtdWxhdGlvbi4KLQkqIGxkbWFpbi5jOiAgUmVwbGFjZSB7R0xELExOS305NjBfRU1VTEFUSU9OX05BTUUgYnkKLQl0aGVpciBleHBhbnNpb25zLCBzaW5jZSB0aGUgZm9ybWVyIG5vIGxvbmdlciBleGlzdC4KLQkqIFBPUlRJTkc6ICBBIHZlcnkgcm91Z2ggZmlyc3QgZHJhZnQgb2YgYSBwb3J0aW5nIGd1aWRlLgotCi0JKiBsZGdyYW0ueSwgbGRsZXgubCwgbGV4c3VwLmM6IENoYW5nZXMgdG8gYWxsb3cgYW4gYXNzaWdubWVudAotCXRvIGJlIHRlcm1pbmF0ZWQgYnkgYSBuZXctbGluZSAoaW5zdGVhZCBvZiByZXF1aXJpbmcgYSBzZW1pY29sb24pLgotCi1Nb24gRmViIDEwIDE2OjIxOjAyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGV4cC5jLCBsZGxhbmcuYzogYWRkZWQgbmV3IGlkZWEgImFic19vdXRwdXRfc2VjdGlvbiIsIHJlbW92ZXMKLQl0ZXN0cyBmb3IgTlVMTCBwb2ludGVycyBhbGwgb3ZlciB0aGUgcGxhY2UuCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogcmVtZW1iZXIgdG8gcmVsb2NhdGUgZ2xvYmFsIHN5bWJvbHMKLQkqYWZ0ZXIqIHJlbGF4aW5nIGhhcyBkb25lIGl0IHN0dWZmLgotCi1UaHUgRmViICA2IDExOjQwOjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtY29mZi1oODMwMDogdXNlIEVNVUwgbGlrZSBldmVyeXRoaW5nIGVsc2UKLQkqIGxkbGFuZy5jOiAocHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQpOiBwcmludCB0aGUgcmlnaHQgYWRkcmVzcy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWcuaCwgbGRlbXVsLmM6IHJlbmFtZWQgIGg4MzAwaGRzIHRvIGg4MzAwaG1zCi0KLQotVHVlIEZlYiAgNCAxNToyODowMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogUHV0IHBhY2sgLW5vaW5oaWJpdC1leGVjIGFuZCAtc29ydC1jb21tb24KLQkqIGxkbGFuZy5jIChwcmludF9kYXRhX3N0YXRlbWVudCk6IHByaW50IHRoZSByaWdodCBhZGRyZXNzLgotCi1UaHUgSmFuIDMwIDE3OjUxOjUzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFRoZSBydWxlIGZvciB0ZXN0aW5nIGxkIGJ5IHJlLWxpbmtpbmcgaXRzZWxmCi0JdmlhIGFuIGludGVybWVkaWF0ZSAtciBsaW5rIHdhcyBtb3ZlZCB0byB0aGUgbGQxIHJ1bGUKLQlpbnN0ZWFkIG9mIHRoZSBsZDIgcnVsZS4gIFRoaXMgYWxsb3dzIGxkMiBhbmQgbGQzIHRvIGJlIGlkZW50aWNhbCwKLQl3aGljaCBhbGxvd3MgdGhlIGJvb3RzdHJhcCBydWxlIHRvIHdvcmsuCi0JKiBsZGN0b3IuYyAoZmluZF9jb25zdHJ1Y3RvcnMpOiAgRG9uJ3QgY3JlYXRlIGEgY29uc3RydWN0b3IKLQlsaXN0IGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCAoYXMgd291bGQgaGFwcGVuIGlmIGxkIGlzCi0JaW52b2tlZCBieSBjb2xsZWN0KS4KLQotV2VkIEphbiAyOSAwODozNTozOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXNwYXJjLmg6IG5vdyB1c2VzIGxpYmdjYy5hCi0JKiBsZG1haW4uYzogcXVpdCB1c2luZyBleGl0Ci0JKiAqc2M6IHVzZSAqKENPTU1PTikgcmF0aGVyIHRoYW4gW0NPTU1PTl0KLQkqIGxkbGV4LmwsIGxleHN1cC5jOiBtdWNoIHRoaW5raW5nIG1vdmVkIGZyb20gLmwgYW5kIHB1dCBpbnRvIC5jLAotCXRvIGFsbG93IHByZXByb2Nlc3Npbmcgb2YgLmwgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBOZXcgbGRsZXgubCBtYW5nbGluZwotCSogbGRleHAuYyAoZm9sZF9iaW5hcnkpOiBwZXJmb3JtIGV4cHJlc3Npb25zIHdpdGggJSBhbmQgLyBpbgotCWludGVnZXIuCi0JKiBsZGZpbGUuYyAob3Blbl9hKTogb3BlbiBhcmNoaXZlcyBvbiBWTVMgaW4gYSBzcGVjaWFsIHdheQotCi0KLVR1ZSBKYW4gMjggMTA6MTg6MTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55OiBtYXAgLU0gYmVoYXZlIGluIHRoZSBzYW1lIHdheSBhcyAtTWFwIChzZXRzIGZpbGUgbmFtZQotCXRvIGJlICItIi4KLQkqIGxkc3ltLmMsIGxkbGFuZy5jOiByZW1lbWJlciB0aGF0IHNpemUgb2YgYSBzZWN0aW9uIGlzIGRlcGVuZGVudCBvbgotCXdoZXRoZXIgb3Igbm90IHJlbGF4aW5nIGhhcyBiZWVuIGRvbmUuCi0JKiBsZG1haW4uYzogZG9uJ3Qgb3BlbiBhIG1hcCBmaWxlIGlmIGl0IGRvZXNuJ3QgaGF2ZSBhIG5hbWUKLQkqIHJlbGF4LmM6IGFsbCB0aGUgYnJhaW5zIGhhdmUgbW92ZWQgaW50byBiZmQuCi0JKiBsZHdyaXRlLmM6IGFtbWVuZCBjb21tZW50Ci0KLUZyaSBKYW4gMjQgMTQ6MjM6NDYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCByZWxheCwgYWxzbyBtYWRlIHRocmVlIHN0YWdlIGdvIHRocm91Z2ggYQotCXBhcnRpYWwgbGluayBzdGFnZS4KLQkqIHJlbGF4LmMgOiBhZGRlZAotCSogY29uZmlnLmg6IGlmIEdOVTk2MCBkZWZpbmVkLCB0aGVuIGRlZmF1bHQgZW11bGF0aW9uIG1vZGUgaXMKLQlHTEQ5NjAKLQkqIGxkZXhwLmgsIGxkZXhwLmM6IG1hcCB0byBmaWxlIGhvb2tzCi0JKiBsZGxhbmcuYzogbWFwIHRvIGZpbGUgaG9va3MKLQkqIGxkZ3JhbS55OiBhZGRlZCAtTWFwIC1yZWxheAotCSogbGRsZXgubDogYWRkZWQgLXJlbGF4LCAtTWFwCi0JKiBsZG1haW4uYzogb3BlbiBtYXAgZmlsZQotCSogbGRtaXNjLmM6IHN1cHBvcnQgZm9yIG1hcCBmaWxlCi0JKiBsZHdyaXRlLmM6IG5ldyByZWxheCBtYWdpYwotCi1UaHUgRGVjIDE5IDE4OjQ5OjUxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnL3RtLSouaDogIENsZWFuIHVwIG1ha2Ugb3V0cHV0LCBvbmx5Ci0JcGFzcyBERUZBVUxUX0VNVUxBVElPTiB0byBsZG1haW4uYy4KLQotV2VkIERlYyAxOCAxNTowMjo0NyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogIEJ1bXAgdG8gdmVyc2lvbiAxLjk0LgotCi1UdWUgRGVjIDEwIDA0OjA3OjIzIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1Nb24gRGVjICA5IDE2OjI2OjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFBhc3MgLXkgdG8gYmlzb24uICAoQWdhaW47Ci0JYWNjaWRlbnRhbGx5IGRlbGV0ZWQgYnkgUmljaC4pCi0JKiBuZXdzLnNjLCBsZGdsZDY4ay5zYzogIERlZmluZSBfX2VuZCBhcyB3ZWxsIGFzIF9lbmQuCi0KLVNhdCBEZWMgIDcgMTc6MTk6MjYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkaW5kci5oOiBhZGRlZCB0byBjb250YWluIHByb3RvdHlwZXMgb2YgbGRpbmRyLmMKLQkqIGxkZmlsZS5jOiBpbmNsdWRlIGN0eXBlLmgKLQkqIGxkbWFpbi5jOiBpbmNsdWRlIHRoZSByZXF1cmllZCBwcm90b3R5cGUgaGVhZGVycwotCSogbGR3cml0ZS5jOiBnZXRfcmVsb2NfdXBwZXJfYm91bmQgaGFzIGJlZW4gcmVuYW1lZAotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLQotRnJpIERlYyAgNiAyMzoyOToyNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwdW50ICJmdW5kYW1lbnRhbCIgbW9kZSBiZWNhdXNlIGl0IGJyZWFrcyBteSBlbWFjcwotCSAgbWFjcm9zLiAgaW5zdGFsbCB1c2luZyBJTlNUQUxMX1BST0dSQU0gYW5kIElOU1RBTExfREFUQS4gIHJlbW92ZQotCSAgc3BhY2VzIGZvbGxvd2luZyBoeXBoZW5zLCBic2QgbWFrZSBjYW4ndCBjb3BlLiAgYWRkZWQKLQkgIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQgYW5kIG1hZGUgaXQgbG9vayBsaWtlIGFsbCB0aGUgb3RoZXIKLQkgIG1ha2VmaWxlcy4KLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgbm93IHJ1bnMgZW50aXJlbHkgaW4gb2JqZGlyIHNvIG1ha2UgZmlsZQotCSAgZXhpc3RlbmNlIGNoZWNrcyBhZ2FpbnN0ICR7c3JjZGlyfS4gIE1hcmsgdGhpcyBkaXJlY3RvcnkgYXMKLQkgIHRhcmdldCBkZXBlbmRlbnQuCi0KLVRodSBEZWMgIDUgMjI6NDY6MTYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1XZWQgRGVjICA0IDIzOjM2OjU1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiAgQnVtcGVkIHZlcnNpb24gdG8gMS45My4KLQkqIE1ha2VmaWxlLmluOiAgUGFzcyAteSB0byBiaXNvbi4KLQotTW9uIE5vdiAyNSAxODoyODo0MCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuaDogaDggaXMgbm93IGNvZmYsIG5vdCBpZWVlCi0JKiBoODMwMGhkcy5zYzogcmVmbGVjdCB0aGUgc2FtZQotCi1UaHUgTm92IDE0IDE5OjU1OjA5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZHZlci5jIChsZHZlcnNpb24oKSk6ICBVcGRhdGUgdG8gMS45Mi4KLQkqIGxkY3Rvci5jOiBUaGVyZSBhcmUgdHdvIHBsYWNlcyBjb25zdHJ1Y3RvciBzZXRzCi0JY2FuIGJlIGRlZmluZWQuICBPbmUgb2YgdGhlbSBjaGVja2VkIGZvciBhbiBleGlzdGluZwotCWR1cGxpY2F0ZSwgdGhlIG90aGVyIGRpZG4ndC4gIFVuZm9ydHVuYXRlbHksIHRoZSBsYXR0ZXIKLQl3YXMgY2FsbGVkIGFmdGVyIHRoZSBmb3JtZXIgLi4uCi0JU28sIGZhY3RvciBvdXQgY29kZSBmb3IgaW5zZXJ0aW5nIGEgbmV3IGVsZW1lbnQgaW50bwotCWNvbnN0cnVjdG9yX25hbWVfbGlzdCAoYWZ0ZXIgY2hlY2tpbmcgZm9yIGEgZHVwbGljYXRlKQotCWludG8gYSBuZXcgZnVuY3Rpb24gYWRkX2NvbnN0cnVjdG9yX25hbWUsIGFuZCBjYWxsCi0JaXQgZnJvbSBib3RoIGFmb3JlbWVudGlvbmVkIHBsYWNlcyAobGRsYW5nX2FkZF9jb25zdHJ1Y3RvcgotCWFuZCBsZGxhbmdfY2hlY2tfZm9yX2NvbnN0cnVjdG9ycykuCi0KLVdlZCBOb3YgMTMgMTU6MTc6NDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVuYW1lIC5jIGZpbGVzIGdlbmVyYXRlZCBmcm9tIGxkdGVtcGxhdGUKLQl0byBoYXZlIG5hbWVzIHN0YXJ0aW5nIHdpdGggbGRfXy4gIFRoaXMgaGVscHMgJ21ha2UgY2xlYW4nLgotCi1UdWUgTm92IDEyIDE4OjM2OjUwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBUYWtlIG91dCB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIGluc3RhbGwKLQkqIG04OGtiY3Muc2M6IHB1dCBpbiBjb250cnVjdG9yIGJsb2Nrcy4KLQotTW9uIE5vdiAxMSAxODo0NzozMyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMsIGxkbWlzYy5oOiAgUmUtd3JpdGUgaW5mbygpIHRvIHRha2UgYSBmaWxlbmFtZQotCXBhcmFtZXRlciwgYSBmb3JtYXQsIGFuZCBhbiBhcmcgcG9pbnRlciwgYW5kIHJlbmFtZSBpdCB0bwotCXZmaW5mbygpLiAgV3JpdGUgaW5mbygpIGluIHRlcm1zIG9mIG5ldyB2ZmluZm8oKS4KLQlOZXcgZWluZm8oKSBpcyB0aGUgc2FtZSBhcyBpbmZvKCksIGV4Y2VwdCBpdCB3cml0ZXMgdG8gc3RkZXJyLgotCSogbGRlbXVsLmMsIGxkZXhwLmMsIGxkbGFuZy5jLCBsZGxuazk2MC5jLCBsZG1haW4uYywgbGR3cml0ZS5jLAotCWxkbWlzYy5jOiAgUmVwbGFjZSAiZXJyb3IiIGNhbGxzIHRvIGluZm8oKSBieSBuZXcgZWluZm8oKS4KLQotTW9uIE5vdiAxMSAwOTo1NzozMiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkbGV4LmwgbGRncmFtLnk6IG1hZGUgLVYgb3B0aW9uIGRvIHNhbWUgYXMgLXYKLQkqIE1ha2VmaWxlLmluOiBBZGRlZCAkKE1JTlVTX0cpIGZsYWcgc28gZGVidWdnaW5nIGNhbiBiZQotCXR1cm5lZCBvZmYKLQotU3VuIE5vdiAgMyAxNjozNzozNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0JIGkzODYgYW91dCBjaGFuZ2VzIGZyb20gQm9iIEt1a3VyYQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5oOiBhZGRlZCBpMzg2YW91dCBzdXBwb3J0Ci0JKiBjb25maWd1cmUuaW46IGZpeGVkIC9oLXtteWhvc3R9IHR5cG8KLQkqIGxkZ3JhbS55OiAtTU0gbm93IGdpdmVzIG1vcmUgYm9yaW5nIG1hcC4KLQkqIGxkbGFuZy5jOiBub3cgZG9lcyBEX1BBR0VEIGZsYWcgdGhlIHJpZ2h0IHdheS4KLQkqIGxkc3ltLmM6IC1NTSBmbGFncyBkb2VzIHRoZSByaWdodCB0aGluZy4KLQotU3VuIE5vdiAgMyAxNTowMDowMyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgRml4ZWQgdHlwby4gIEFsc28sIGEgZml4IGZvciBocDMwMGJzZC4KLQkqIGxkbGFuZy5jIChpbml0X29zKTogIENvbXBlbnNhdGUgZm9yIEJGRCBjaGFuZ2UsCi0Jd2hlcmUgYmZkX21ha2Vfc2VjdGlvbiBub3cgcmV0dXJucyBOVUxMIGZvciBhIGR1cGxpY2F0ZQotCXNlY3Rpb24gcmVxdWVzdCwgaW5zdGVhZCBvZiB0aGUgb2xkIHNlY3Rpb24uCi0KLVRodSBPY3QgMTcgMTU6Mjc6MTMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6IEJ1bXAgdG8gdmVyc2lvbiAxLjkxIChjb25zaXN0ZW50IHdpdGggYmludXRpbHMpLgotCi1XZWQgT2N0IDE2IDEyOjI3OjA4IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmgsIGxkLmgsIGxkZW11bC5jLCBsZGV4cC5jLCBsZGV4cC5oLAotCWxkZ3JhbS55LCBsZGxleC5sLCBsZGxuazk2MC5jLCBsZG1haW4uYywgbGRtaXNjLmMsIGxkbWlzYy5oLAotCWxkc3ltLmMsIGxkc3ltLmgsIGxkdGVtcGxhdGUsIGxkdmFuaWxsYS5jLCBsZHZlci5jLCBsZHZlci5oLAotCWxkd2Fybi5jLCBsZHdhcm4uaCwgbGR3cml0ZS5jLCBsZHdyaXRlLmgsIG1rc2NyaXB0LmM6Ci0JQWRkIG9yIHVwZGF0ZSBjb3B5cmlnaHQgbm90aWNlcy4KLQotTW9uIE9jdCAxNCAyMzo1NToyNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlZCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG5hbWUgc2NoZW1lCi0JdG8gYmUgY29uc2lzdGVudCB3aXRoIGdjYy4gIEFsc28gY2hhbmdlZCAnaW5zdGFsbCcuCi0KLU1vbiBPY3QgMTQgMTc6MzA6MDIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG5ldyB0YXJnZXRzIGxkLm1tLCBsZC5tZQotCi1Nb24gT2N0IDE0IDE3OjI3OjI0IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgbGR0ZW1wbGF0ZTogIE5lZWQgdG8gdXNlIHNlcGFyYXRlIHNjcmlwdHMKLQlmb3IgLW4gYW5kIC1OIG9wdGlvbnMuICBZZXQgbW9yZSBjb21wbGljYXRpb24uCi0KLUZyaSBPY3QgMTEgMjI6NDA6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQXZvaWQgdXNpbmcgJDwgaW4gZXhwbGljaXQgTWFrZSBydWxlcyAoaXQgZG9lc24ndAotCXdvcmspLiAgQWRkIHNvbWUgbGluZXMgdG8gYXZvaWQgU3VuIE1ha2UgVlBBVEggYnVncy4KLQotRnJpIE9jdCAxMSAxNjo0MjoyMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbmV3cy5zYzogQWRkIGFsaWdubWVudCBmb3IgZGF0YSBzZWdtZW50LgotCSogbGR0ZW1wbGF0ZTogQWRkICh5ZXQgYW5vdGhlcikgc2NyaXB0IHRvIGdldCBmb3IgLW4gb3IgLU4KLQlvcHRpb25zLiAgKFRoZXNlIG5lZWQgZGlmZmVyZW50IGFsaWdubWVudCB0aGFuIFpNQUdJQyBmaWxlcy4pCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBzdHVmZiBmb3IgbmV3IGZvby54biBzY3JpcHRzLgotCVRoZXNlIGFyZSBnZW5lcmF0ZWQgYnkgcmVwbGFjaW5nICJBTElHTigweC4uLjAwKSIgYnkgIi4iLgotCi1GcmkgT2N0IDExIDE1OjQzOjA0IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBuZXcgdGFyZ2V0cyBsZC5tcywgbGQtaW5kZXgubXMKLQlsZC50ZXhpbmZvOiByZW1vdmUgdGFicywgb3RoZXIgY2xlYW51cHMgZm9yIHRleGkycm9mZgotCi1GcmkgT2N0IDExIDEzOjUxOjU0IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAobWFpbik6IE1ha2UgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCBiZSB0cnVlCi0JYnkgZGVmYXVsdC4gIERvbid0IHRoZSBXUF9URVhUIGFuZCBEX1BBR0VEIGZsYWdzIG9mCi0Jb3V0cHV0X2JmZCBoZXJlOyBpdCdzIHRvbyBsYXRlLCBzbyBzZXQgaXQgd2hlbiBvdXRwdXRfYmZkCi0JaXMgY3JlYXRlZCAoaW4gbGRsYW5nLmMpLiAgQWxzbyBmaXggc2V0dGluZyBvZiBFWEVDX1AgZmxhZwotCSogbGRsYW5nLmMgKGxkbGFuZ19vcGVuX291dHB1dCk6ICBTZXQgb3V0cHV0X2JmZC0+ZmxhZ3MgaGVyZS4KLQkqIGxkbGFuZy5jOiBSZW1vdmUgc29tZSBkdXBsaWNhdGUgZXh0ZXJuIGRlY2xhcmF0aW9ucy4KLQkqIGxkZ3JhbS55OiBGaXhlcyB0byAtTiBhbmQgLW4gb3B0aW9ucy4KLQkqIE1ha2VmaWxlLmluOiAgUmVjb2duaXplIHVwcGVyIGNhc2UgbGV0dGVycyBpbiBzZWQgc2NyaXB0Ci0JdG8gcmVtb3ZlIGFzc2lnbm1lbnRzIGZyb20gc2NyaXB0IGZpbGVzLgotCSogbGR0ZW1wbGF0ZTogIERvbid0IGFzc3VrbWUgdGhhdCAtTiBvciAtbiBvcHRpb25zCi0JaW1wbHkgdXNlIG9mIC1yIHNjcmlwdC4KLQkqIG1rc2NyaXB0LmM6ICBUd2Vha2luZyB0byBjb3JyZWN0bHkgaGFuZGxlIFxuIGFuZCBcXCBpbiBpbnB1dC4KLQotRnJpIE9jdCAxMSAxMDoyOToyNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkdGVtcGxhdGU6IGluY2x1ZGUgYmZkLmggYmVmb3JlIHN5c2RlcC5oLgotCi1GcmkgT2N0IDExIDA0OjI0OjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUmVzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBzY2hlbWUgZm9yIGJmZCwgYmludXRpbHMsIGxkLgotCi0JKiBpbmNsdWRlL3N5cy9oLSouaDogIE1vdmUgdG8gYmZkL2hvc3RzL2gtKi5oLgotCSogY29uZmlndXJlLmluOiAgUmV2aXNlIHRvIHN5bWxpbmsgc3lzZGVwLmggdG8gLi4vYmZkL2hvc3RzL2gteHh4LmguCi0JQ2hhbmdlIHNvbWUgY29uZmlnIG5hbWVzIHRvIG1hdGNoIG90aGVyIGRpcnMuCi0JKiAqLmM6ICBJbmNsdWRlIGJmZC5oIGJlZm9yZSBzeXNkZXAuaCwgc28gYW5zaWRlY2wgYW5kIFBST1RPKCkKLQlnZXQgZGVmaW5lZCBmaXJzdC4KLQkqIGNvbmZpZy86ICBSZW5hbWUgc29tZSBjb25maWcgZmlsZXMgdG8gbWF0Y2ggdXAgaC0qLmggbmFtZXMuCi0JUmVtb3ZlIGFsbCB0aGUgSE9TVF9TWVMgZGVmaW5pdGlvbnMgZnJvbSB0aGUgY29uZmlnIGZpbGVzLgotCi1UdWUgT2N0ICA4IDE2OjAwOjU3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZGV4cC5oLCBsZGxhbmcuaDogQ2hhbmdlIGVudW0gYm9vbGVhbiAtPiBlbnVtIGJmZF9ib29sZWFuLgotCSogbGR0ZW1wbGF0ZTogUmVtb3ZlIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIGNhbGxzOwotCWp1c3QgdXNlIHRoZSBTRUFSQ0hfRElSIGNvbW1hbmRzIGluIHRoZSBzY3JpcHQgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogQWRkIExJQl9QQVRIIG1hY3JvLCB3aGljaCBpZiBzZXQgaXMgdXNlZCB0byByZXBsYWNlCi0JdGhlIFNFQVJDSF9ESVIgY29tbWFuZHMgaW4gdGhlIHNjcmlwdHMgKHVzaW5nIHVnbHkgc2VkIG1hZ2ljKS4KLQlUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCBmb3IgY3Jvc3MtbGlua2luZywgd2hlcmUgeW91IHdvdWxkCi0JcGxhY2UgbGliYXJpZXMgaW4gYSBkaWZmZXJlbnQgcGxhY2UgdGhhbiBuYXRpdmUgbGlicmFyaWVzLgotCUFsc28sIGVtdWxhdGlvbnMgbWFkZSBmcm9tIGxkdGVtcGxhdGUgbm93IHVzZSAkKHNyY2RpcikuCi0JKiBsZGdsZGEyOWsuc2M6ICBDaGFuZ2UgU0VBUkNIX0RJUiBjb21tYW5kcyB0byBhIGNvbnZlbnRpb25hbAotCWZvcm07IHBlb3BsZSBjYW4gdXNlIHRoZSBNYWtlZmlsZSdzIExJQl9QQVRIIHRvIG92ZXJyaWRlLgotCi1UdWUgT2N0ICA4IDE0OjUxOjIxIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggdGFyZ2V0IGxkLmR2aSwgYWRkIHRhcmdldCBsZC5pbmZvCi0JbGQudGV4aW5mbzogbWFrZSBpbmZvIGZpbGVuYW1lIGxkLmluZm8KLQotRnJpIE9jdCAgNCAyMTo1MTo1OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCB1c2luZyAkPCBpbiBub24tc3VmZml4IHJ1bGVzIChicmVha3Mgb24gU3VuCi0JTWFrZSkuCi0JKiBsZGZpbGUuYywgbGRsYW5nLmMsIGxkbWFpbi5jLCBsZHdyaXRlLmM6ICBDb3BlIHdpdGggcmVuYW1lcyBvZiBhCi0JZmV3IEJGRCB0eXBlcyAmIGVudW1zLgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9sZC9NYWtlZmlsZS5hbSBiL2xkL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzUxYjU0Li4wMDAwMDAwCi0tLSBhL2xkL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsOTQ3ICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotIyMgRklYTUU6IHdvcmsgYXJvdW5kIGFwcGFyZW50IGF1dG9tYWtlIGJ1Zy4KLUlOVExMSUJTID0gQElOVExMSUJTQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKLQotU1VCRElSUyA9IHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF07IHRoZW4gZWNobyAuLi9iaXNvbi9iaXNvbiAteSAtTCQoc3JjZGlyKS8uLi9iaXNvbi87IGVsc2UgZWNobyBAWUFDQ0A7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4OyBlbHNlIGVjaG8gQExFWEA7IGZpYAotCi0jIFdlIHB1dCB0aGUgc2NyaXB0cyBpbiB0aGUgZGlyZWN0b3J5ICQoc2NyaXB0ZGlyKS9sZHNjcmlwdHMuCi0jIFdlIGNhbid0IHB1dCB0aGUgc2NyaXB0cyBpbiAkKGRhdGFkaXIpIGJlY2F1c2UgdGhlIFNFQVJDSF9ESVIKLSMgZGlyZWN0aXZlcyBuZWVkIHRvIGJlIGRpZmZlcmVudCBmb3IgbmF0aXZlIGFuZCBjcm9zcyBsaW5rZXJzLgotc2NyaXB0ZGlyID0gJCh0b29sZGlyKS9saWIKLQotRU1VTCA9IEBFTVVMQAotRU1VTEFUSU9OX09GSUxFUyA9IEBFTVVMQVRJT05fT0ZJTEVTQAotRU1VTF9FWFRSQV9PRklMRVMgPSBARU1VTF9FWFRSQV9PRklMRVNACi0KLSMgU2VhcmNoIHBhdGggdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIC1sZm9vIGxpYnJhcmllcy4KLSMgSWYgTElCX1BBVEggaXMgZW1wdHksIHRoZSBvbmVzIGluIHRoZSBzY3JpcHQgKGlmIGFueSkgYXJlIGxlZnQgYWxvbmUuCi0jIChUaGUgZGVmYXVsdCBpcyB1c3VhbGx5IC9saWI6L3Vzci9saWI6L3Vzci9sb2NhbC9saWIsIHVubGVzcyBidWlsZGluZwotIyBhIGNyb3NzLWxpbmtlciwgaW4gd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBpcyBlbXB0eS4gIFNlZSBnZW5zY3JpcHRzLnNoLikKLSMgT3RoZXJ3aXNlLCB0aGV5IGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbmVzIGdpdmVuIGluIExJQl9QQVRILAotIyB3aGljaCBtYXkgaGF2ZSB0aGUgZm9ybTogTElCX1BBVEg9L2xpYjovdXNyL2xvY2FsL2xpYgotTElCX1BBVEggPQotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSCT0gJChCQVNFRElSKS9pbmNsdWRlCi1NS0RFUCA9IG1rZGVwCi0KLSMgV2hhdCB2ZXJzaW9uIG9mIHRoZSBtYW51YWwgdG8gYnVpbGQKLURPQ1ZFUiA9IGdlbgotCi0jc3R1ZmYgZm9yIHNlbGYgaG9zdGluZyAoY2FuIGJlIG92ZXJyaWRkZW4gaW4gY29uZmlnIGZpbGUpLgotSE9TVElOR19DUlQwID0gQEhPU1RJTkdfQ1JUMEAKLUhPU1RJTkdfTElCUyA9IEBIT1NUSU5HX0xJQlNACi1IT1NUSU5HX0VNVSA9IC1tICQoRU1VTCkKLQotIyBTZXR1cCB0aGUgdGVzdGluZyBmcmFtZXdvcmssIGlmIHlvdSBoYXZlIG9uZQotRVhQRUNUID0gYGlmIFsgLWYgJCRyLy4uL2V4cGVjdC9leHBlY3QgXSA7IFwKLQl0aGVuIGVjaG8gJCRyLy4uL2V4cGVjdC9leHBlY3QgOyBcCi0JZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLQllbHNlIGVjaG8gcnVudGVzdCA7IGZpYAotCi1SVU5URVNURkxBR1MgPQotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1DWFggPSBnY2MKLUNYWF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ1hYKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotbm9pbnN0X1BST0dSQU1TID0gbGQtbmV3Ci1pbmZvX1RFWElORk9TID0gbGQudGV4aW5mbwotbm9pbnN0X1RFWElORk9TID0gbGRpbnQudGV4aW5mbwotbWFuX01BTlMgPSBsZC4xCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgLUkkKHRvcF9zcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsICQoSERFRklORVMpICQoQ0ZMQUdTKSAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLUJGRExJQiA9IC4uL2JmZC9saWJiZmQubGEKLUxJQklCRVJUWSA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi1BTExfRU1VTEFUSU9OUyA9IFwKLQllYTI5ay5vIFwKLQllYWl4cHBjLm8gXAotCWVhaXhyczYubyBcCi0JZWFscGhhLm8gXAotCWVhcmNlbGYubyBcCi0JZWFybWVsZi5vIFwKLQllYXJtZWxmX29hYmkubyBcCi0JZWFybWVsZl9saW51eC5vIFwKLQllYXJtZWxmX2xpbnV4MjYubyBcCi0JZWFybWFvdXRiLm8gXAotCWVhcm1hb3V0bC5vIFwKLQllYXJtY29mZi5vIFwKLQllYXJtbmJzZC5vIFwKLQllYXJtcGUubyBcCi0JZWFybV9lcG9jX3BlLm8gXAotCWVhdnIxMjAwLm8gXAotCWVhdnIyM3h4Lm8gXAotCWVhdnI0NHg0Lm8gXAotCWVhdnI0NDMzLm8gXAotCWVhdnI4NXh4Lm8gXAotCWVhdnJtZWdhNjAzLm8gXAotCWVhdnJtZWdhMTAzLm8gXAotCWVhdnJtZWdhMTYxLm8gXAotCWVjb2ZmX3NwYXJjLm8gXAotCWVkMTB2ZWxmLm8gXAotCWVkMzB2ZWxmLm8gXAotCWVkMzB2X2UubyBcCi0JZWQzMHZfby5vIFwKLQllZGVsdGE2OC5vIFwKLQllZWJtb24yOWsubyBcCi0JZWVsZjMyX3NwYXJjLm8gXAotCWVlbGYzMl9pOTYwLm8gXAotCWVlbGYzMmI0MzAwLm8gXAotCWVlbGYzMmJtaXAubyBcCi0JZWVsZjMyZWJtaXAubyBcCi0JZWVsZjMyZWxtaXAubyBcCi0JZWVsZjMyYm1pcG4zMi5vIFwKLQllZWxmMzJpMzcwLm8gXAotCWVlbGYzMmw0MzAwLm8gXAotCWVlbGYzMmxtaXAubyBcCi0JZWVsZjMybHBwYy5vIFwKLQllZWxmMzJwcGMubyBcCi0JZWVsZjMycHBjbGludXgubyBcCi0JZWVsZl9pMzg2Lm8gXAotCWVlbGZfaTM4Nl9iZS5vIFwKLQllZ2xkOTYwLm8gXAotCWVnbGQ5NjBjb2ZmLm8gXAotCWVlbGYzMmZyMzAubyBcCi0JZWVsZjMybWNvcmUubyBcCi0JZWg4MzAwLm8gXAotCWVoODMwMGgubyBcCi0JZWg4MzAwcy5vIFwKLQllaDg1MDAubyBcCi0JZWg4NTAwYi5vIFwKLQllaDg1MDBjLm8gXAotCWVoODUwMG0ubyBcCi0JZWg4NTAwcy5vIFwKLQllaHAzMDBic2QubyBcCi0JZWhwM2hwdXgubyBcCi0JZWkzODZhb3V0Lm8gXAotCWVpMzg2YmVvcy5vIFwKLQllaTM4NmJzZC5vIFwKLQllaTM4NmNvZmYubyBcCi0JZWkzODZnbzMyLm8gXAotCWVpMzg2bGludXgubyBcCi0JZWkzODZseW54Lm8gXAotCWVpMzg2bWFjaC5vIFwKLQllaTM4Nm1vc3MubyBcCi0JZWkzODZtc2Rvcy5vIFwKLQllaTM4Nm5ic2QubyBcCi0JZWkzODZudy5vIFwKLQllaTM4NnBlLm8gXAotCWVpMzg2cGVfcG9zaXgubyBcCi0JZWxuazk2MC5vIFwKLQllbTY4azRrbmJzZC5vIFwKLQllbTY4a2FvdXQubyBcCi0JZW02OGthdXgubyBcCi0JZW02OGtjb2ZmLm8gXAotCWVtNjhrZWxmLm8gXAotCWVtNjhrbGludXgubyBcCi0JZW02OGtseW54Lm8gXAotCWVtNjhrbmJzZC5vIFwKLQllbTY4a3Bzb3MubyBcCi0JZW04OGtiY3MubyBcCi0JZW1jb3JlcGUubyBcCi0JZW1pcHNiaWcubyBcCi0JZW1pcHNic2QubyBcCi0JZW1pcHNpZHQubyBcCi0JZW1pcHNpZHRsLm8gXAotCWVtaXBzbGl0Lm8gXAotCWVtaXBzbG5ld3MubyBcCi0JZW1pcHNwZS5vIFwKLQllbmV3cy5vIFwKLQllcGplbGYubyBcCi0JZXBqbGVsZi5vIFwKLQllbnMzMmtuYnNkLm8gXAotCWVwYzUzMm1hY2hhLm8gXAotCWVwcGNtYWNvcy5vIFwKLQllcHBjbncubyBcCi0JZXBwY3BlLm8gXAotCWVyaXNjaXgubyBcCi0JZXNhMjkyMDAubyBcCi0JZXNoLm8gXAotCWVzaGVsZi5vIFwKLQllc2hsZWxmLm8gXAotCWVzaGwubyBcCi0JZXNocGUubyBcCi0JZXNwYXJjYW91dC5vIFwKLQllc3BhcmNsaW51eC5vIFwKLQllc3BhcmNseW54Lm8gXAotCWVzcGFyY25ic2QubyBcCi0JZXN0MjAwMC5vIFwKLQllc3VuMy5vIFwKLQllc3VuNC5vIFwKLQlldGljMzBhb3V0Lm8gXAotCWV0aWMzMGNvZmYubyBcCi0JZXRpYzgwY29mZi5vIFwKLQlldmFuaWxsYS5vIFwKLQlldmF4Lm8gXAotCWV2c3RhLm8gXAotCWV3NjUubyBcCi0JZXo4MDAxLm8gXAotCWV6ODAwMi5vCi0KLUFMTF82NF9FTVVMQVRJT05TID0gXAotCWVlbGY2NF9zcGFyYy5vIFwKLQllZWxmNjRhbHBoYS5vIFwKLQllZWxmNjRibWlwLm8KLQotQUxMX0VNVUxfRVhUUkFfT0ZJTEVTID0gXAotCXBlLWRsbC5vIFwKLQlkZWZmaWxlcC5vCi0KLUNGSUxFUyA9IGxkY3Rvci5jIGxkZW11bC5jIGxkZXhwLmMgbGRmaWxlLmMgbGRsYW5nLmMgXAotCWxkbWFpbi5jIGxkbWlzYy5jIGxkdmVyLmMgbGR3cml0ZS5jIGxleHN1cC5jIFwKLQltcmkuYyBsZGNyZWYuYyBwZS1kbGwuYwotCi1IRklMRVMgPSBsZC5oIGxkY3Rvci5oIGxkZW11bC5oIGxkZXhwLmggbGRmaWxlLmggXAotCWxkbGFuZy5oIGxkbGV4LmggbGRtYWluLmggbGRtaXNjLmggbGR2ZXIuaCBcCi0JbGR3cml0ZS5oIG1yaS5oIGRlZmZpbGUuaCBwZS1kbGwuaAotCi1HRU5FUkFURURfQ0ZJTEVTID0gbGRncmFtLmMgbGRsZXguYyBkZWZmaWxlcC5jCi1HRU5FUkFURURfSEZJTEVTID0gbGRncmFtLmggbGRlbXVsLWxpc3QuaCBkZWZmaWxlcC5oCi0KLU9GSUxFUyA9IGxkZ3JhbS5vIGxkbGV4Lm8gbGV4c3VwLm8gbGRsYW5nLm8gbXJpLm8gbGRjdG9yLm8gbGRtYWluLm8gXAotCWxkd3JpdGUubyBsZGV4cC5vICBsZGVtdWwubyBsZHZlci5vIGxkbWlzYy5vIFwKLQlsZGZpbGUubyBsZGNyZWYubyAke0VNVUxBVElPTl9PRklMRVN9ICR7RU1VTF9FWFRSQV9PRklMRVN9Ci0KLVNUQUdFU1RVRkYgPSAqLm8gbGRzY3JpcHRzLyogZSouYwotCi0jIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBqdXN0IGEgbGlzdCBvZiB0aG9zZSBlbXVsYXRpb24gdGVtcGxhdGUgZmlsZXMKLSMgdGhhdCBjb250YWluIGludGVybmF0aW9uYWxpc2VkIHN0cmluZ3MuCi1FTVVMQVRJT05fRklMRVMgPSBlbXVsdGVtcGwvcGUuZW0gZW11bHRlbXBsL2FybWNvZmYuZW0KLQotUE9URklMRVMgPSAkKENGSUxFUykgJChIRklMRVMpICQoRU1VTEFUSU9OX0ZJTEVTKQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1sZG1haW4ubzogbGRtYWluLmMgY29uZmlnLnN0YXR1cwotCSQoQ09NUElMRSkgLWMgLURERUZBVUxUX0VNVUxBVElPTj0nIiQoRU1VTCkiJyAtRFNDUklQVERJUj0nIiQoc2NyaXB0ZGlyKSInIC1EVEFSR0VUPSciQHRhcmdldEAiJyAkKHNyY2RpcikvbGRtYWluLmMKLQotbGRlbXVsLWxpc3QuaDogTWFrZWZpbGUKLQkoZWNobyAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiAgRE8gTk9UIEVESVQhICovIjtcCi0JZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAotCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCi0JICAgIGVjaG8gImV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkXyQke2Z9X2VtdWxhdGlvbjsiOyBcCi0JZG9uZTtcCi0JZWNobyAiIjtcCi0JZWNobyAiI2RlZmluZSBFTVVMQVRJT05fTElTVCBcXCI7XAotCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKLQkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAotCSAgICBlY2hvICIgICZsZF8kJHtmfV9lbXVsYXRpb24sIFxcIjsgXAotCWRvbmU7XAotCWVjaG8gIiAgMCIpID5sZGVtdWwtdG1wLmgKLQltdiBsZGVtdWwtdG1wLmggbGRlbXVsLWxpc3QuaAotCi1zdHJpbmdpZnkuc2VkOiAke3NyY2Rpcn0vZW11bHRlbXBsLyQoU1RSSU5HSUZZKQotCSAgY3AgJHtzcmNkaXJ9L2VtdWx0ZW1wbC8kKFNUUklOR0lGWSkgc3RyaW5naWZ5LnNlZAotCi0jIFRoZXNlIGFsbCBzdGFydCB3aXRoIGUgc28gJ21ha2UgY2xlYW4nIGNhbiBmaW5kIHRoZW0uCi0KLUdFTlNDUklQVFMgPSAkKFNIRUxMKSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCAke3NyY2Rpcn0gJHtsaWJkaXJ9IEBob3N0QCBAdGFyZ2V0QCBAdGFyZ2V0X2FsaWFzQCAiQEVNVUxBVElPTl9MSUJQQVRIQCIgIkBOQVRJVkVfTElCX0RJUlNAIgotR0VOX0RFUEVORFMgPSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCBzdHJpbmdpZnkuc2VkCi1AVERJUlNACi0KLWVhMjlrLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2EyOWsuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2EyOWsuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGEyOWsgIiQodGRpcl9hMjlrKSIKLWVhaXhwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWl4cHBjICIkKHRkaXJfYWl4cHBjKSIKLWVhaXhyczYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cnM2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWl4cnM2ICIkKHRkaXJfYWl4cnM2KSIKLWVhbHBoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hbHBoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWxwaGEuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFscGhhICIkKHRkaXJfYWxwaGEpIgotZWFyY2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcmNlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJjZWxmICIkKHRkaXJfYXJjZWxmKSIKLWVhcm1lbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmICIkKHRkaXJfYXJtZWxmKSIKLWVhcm1lbGZfb2FiaS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX29hYmkgIiQodGRpcl9hcm1lbGYpIgotZWFybWVsZl9saW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXggIiQodGRpcl9hcm1lbGZfbGludXgpIgotZWFybWVsZl9saW51eDI2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX2xpbnV4MjYgIiQodGRpcl9hcm1lbGZfbGludXgyNikiCi1lYXJtYW91dGIuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWFvdXRiICIkKHRkaXJfYXJtYW91dGIpIgotZWFybWFvdXRsLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWFvdXRsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1hb3V0bCAiJCh0ZGlyX2FybWFvdXRsKSIKLWVhcm1jb2ZmLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWNvZmYgIiQodGRpcl9hcm1jb2ZmKSIKLWVhcm1uYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybW5ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybW5ic2QgIiQodGRpcl9hcm1uYnNkKSIKLWVhcm1fZXBvY19wZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2Vwb2NwZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtX2Vwb2NfcGUgIiQodGRpcl9hcm1wZSkiCi1lYXJtcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtcGUgIiQodGRpcl9hcm1wZSkiCi1lYXZyODV4eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hdnI4NXh4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYzMmF2ci5zYyBcCi0gICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhdnI4NXh4ICIkKHRkaXJfYXZyODV4eCkiCi1lYXZyMTIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hdnIxMjAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYzMmF2ci5zYyBcCi0gICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhdnIxMjAwICIkKHRkaXJfYXZyODV4eCkiCi1lYXZyMjN4eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hdnIyM3h4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYzMmF2ci5zYyBcCi0gICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhdnIyM3h4ICIkKHRkaXJfYXZyODV4eCkiCi1lYXZyNDR4NC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hdnI0NHg0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYzMmF2ci5zYyBcCi0gICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhdnI0NHg0ICIkKHRkaXJfYXZyODV4eCkiCi1lYXZyNDQzMy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hdnI0NDMzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYzMmF2ci5zYyBcCi0gICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhdnI0NDMzICIkKHRkaXJfYXZyODV4eCkiCi1lYXZybWVnYTYwMy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hdnJtZWdhNjAzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYzMmF2ci5zYyBcCi0gICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhdnJtZWdhNjAzICIkKHRkaXJfYXZyODV4eCkiCi1lYXZybWVnYTEwMy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hdnJtZWdhMTAzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYzMmF2ci5zYyBcCi0gICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhdnJtZWdhMTAzICIkKHRkaXJfYXZyODV4eCkiCi1lYXZybWVnYTE2MS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hdnJtZWdhMTYxLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYzMmF2ci5zYyBcCi0gICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhdnJtZWdhMTYxICIkKHRkaXJfYXZyODV4eCkiCi1lY29mZl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGNvZmZfc3BhcmMgIiQodGRpcl9jb2ZmX3NwYXJjKSIKLWVkMTB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QxMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQxMHZlbGYgIiQodGRpcl9kMTB2KSIKLWVkMzB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZlbGYgIiQodGRpcl9kMzB2KSIKLWVkMzB2X28uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9vLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X28gIiQodGRpcl9kMzB2KSIKLWVkMzB2X2UuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9lLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X2UgIiQodGRpcl9kMzB2KSIKLWVkZWx0YTY4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2RlbHRhNjguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGRlbHRhNjggIiQodGRpcl9kZWx0YTY4KSIKLWVlYm1vbjI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lYm1vbjI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVibW9uMjlrICIkKHRkaXJfZWJtb24yOWspIgotZWVsZjMyZnIzMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZnIzMCAiJCh0ZGlyX2ZyMzApIgotZWVsZjMybWNvcmUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJtY29yZSAiJCh0ZGlyX21jb3JlKSIKLWVtMzJyZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL20zMnJlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTMycmVsZiAiJCh0ZGlyX20zMnIpIgotZWVsZjMyX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMl9zcGFyYyAiJCh0ZGlyX2VsZjMyX3NwYXJjKSIKLWVlbGYzMl9pOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyX2k5NjAgIiQodGRpcl9lbGYzMl9pOTYwKSIKLWVlbGYzMmI0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYjQzMDAgIiQodGRpcl9lbGYzMmI0MzAwKSIKLWVlbGYzMmJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJtaXAgIiQodGRpcl9lbGYzMmJtaXApIgotZWVsZjMyYnNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJic21pcCAiJCh0ZGlyX2VsZjMyYnNtaXApIgotZWVsZjMyZWJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlYm1pcCAiJCh0ZGlyX2VsZjMyZWJtaXApIgotZWVsZjMyZWxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlbG1pcCAiJCh0ZGlyX2VsZjMyZWxtaXApIgotZWVsZjMyYm1pcG4zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYm1pcG4zMiAiJCh0ZGlyX2VsZjMyYm1pcG4zMikiCi1lZWxmMzJsNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmw0MzAwICIkKHRkaXJfZWxmMzJsNDMwMCkiCi1lZWxmMzJsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsbWlwICIkKHRkaXJfZWxmMzJsbWlwKSIKLWVlbGYzMmxwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxwcGMgIiQodGRpcl9lbGYzMmxwcGMpIgotZWVsZjMybHNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsc21pcCAiJCh0ZGlyX2VsZjMybHNtaXApIgotZWVsZjMycHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMnBwYyAiJCh0ZGlyX2VsZjMycHBjKSIKLWVlbGYzMnBwY2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMycHBjbGludXggIiQodGRpcl9lbGYzMnBwY2xpbnV4KSIKLWVlbGYzMmkzNzAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJpMzcwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmaTM3MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJpMzcwICIkKHRkaXJfZWxmMzJpMzcwKSIKLWVlbGY2NGFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0YWxwaGEgIiQodGRpcl9lbGY2NGFscGhhKSIKLWVlbGY2NF9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmNjRfc3BhcmMgIiQodGRpcl9lbGY2NF9zcGFyYykiCi1lZWxmNjRibWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0Ym1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmNjRibWlwICIkKHRkaXJfZWxmNjRibWlwKSIKLWVlbGZfaTM4Ni5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmX2kzODYgIiQodGRpcl9lbGZfaTM4NikiCi1lZWxmX2kzODZfYmUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZl9pMzg2X2JlICIkKHRkaXJfZWxmX2kzODZfYmUpIgotZWdsZDk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbGQ5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dsZDk2MC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZ2xkOTYwICIkKHRkaXJfZ2xkOTYwKSIKLWVnbGQ5NjBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dsZDk2MGMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdsZDk2MGNvZmYgIiQodGRpcl9nbGQ5NjBjb2ZmKSIKLWVoODMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwICIkKHRkaXJfaDgzMDApIgotZWg4MzAwaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMGguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDBoICIkKHRkaXJfaDgzMDBoKSIKLWVoODMwMHMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDBzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwcyAiJCh0ZGlyX2g4MzAwcykiCi1laDg1MDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMCAiJCh0ZGlyX2g4NTAwKSIKLWVoODUwMGIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBiLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMGIuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwYiAiJCh0ZGlyX2g4NTAwYikiCi1laDg1MDBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMGMgIiQodGRpcl9oODUwMGMpIgotZWg4NTAwbS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMG0uc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwbS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBtICIkKHRkaXJfaDg1MDBtKSIKLWVoODUwMHMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwcyAiJCh0ZGlyX2g4NTAwcykiCi1laHAzMDBic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaHAzMDBic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwMzAwYnNkICIkKHRkaXJfaHAzMDBic2QpIgotZWhwM2hwdXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaHAzaHB1eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaHAzaHB1eCAiJCh0ZGlyX2hwM2hwdXgpIgotZWkzODZhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YW91dCAiJCh0ZGlyX2kzODZhb3V0KSIKLWVpMzg2YmVvcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YmVvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYmVvcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZiZW9zICIkKHRkaXJfaTM4NmJlb3MpIgotZWkzODZic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmJzZCAiJCh0ZGlyX2kzODZic2QpIgotZWkzODZjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmNvZmYgIiQodGRpcl9pMzg2Y29mZikiCi1laTM4NmdvMzIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmdvMzIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2Z28zMiAiJCh0ZGlyX2kzODZnbzMyKSIKLWVpMzg2bGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmxpbnV4ICIkKHRkaXJfaTM4NmxpbnV4KSIKLWVpMzg2bHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZseW54ICIkKHRkaXJfaTM4Nmx5bngpIgotZWkzODZtYWNoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtYWNoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bWFjaCAiJCh0ZGlyX2kzODZtYWNoKSIKLWVpMzg2bW9zcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bW9zcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bW9zcyAiJCh0ZGlyX2kzODZtb3NzKSIKLWVpMzg2bXNkb3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtc2RvcyAiJCh0ZGlyX2kzODZtc2RvcykiCi1laTM4Nm5ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZuYnNkICIkKHRkaXJfaTM4Nm5ic2QpIgotZWkzODZudy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bncuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9udy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm53ICIkKHRkaXJfaTM4Nm53KSIKLWVpMzg2cGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NnBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZwZSAiJCh0ZGlyX2kzODZwZSkiCi1laTM4NnBlX3Bvc2l4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZwZV9wb3NpeC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2cGVfcG9zaXggIiQodGRpcl9pMzg2cGVfcG9zaXgpIgotZWxuazk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9sbms5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xuazk2MC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbG5rOTYwICIkKHRkaXJfbG5rOTYwKSIKLWVtNjhrNGtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGs0a25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGs0a25ic2QgIiQodGRpcl9tNjhrNGtuYnNkKSIKLWVtNjhrYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2FvdXQgIiQodGRpcl9tNjhrYW91dCkiCi1lbTY4a2F1eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrYXV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrYXV4ICIkKHRkaXJfbTY4a2F1eCkiCi1lbTY4a2NvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrY29mZiAiJCh0ZGlyX202OGtjb2ZmKSIKLWVtNjhrZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtlbGYgIiQodGRpcl9tNjhrZWxmKSIKLWVtNjhrbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2xpbnV4ICIkKHRkaXJfbTY4a2xpbnV4KSIKLWVtNjhrbHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2x5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtseW54ICIkKHRkaXJfbTY4a2x5bngpIgotZW02OGtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbmJzZCAiJCh0ZGlyX202OGtuYnNkKSIKLWVtNjhrcHNvcy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrcHNvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Bzb3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtwc29zICIkKHRkaXJfbTY4a3Bzb3MpIgotZW04OGtiY3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTg4a2JjcyAiJCh0ZGlyX204OGtiY3MpIgotZW1jb3JlcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWNvcmVwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtY29yZXBlICIkKHRkaXJfbWNvcmVwZSkiCi1lbWlwc2JpZy5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2JpZy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2JpZwotZW1pcHNic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2JzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2JzZAotZW1pcHNpZHQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2lkdC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzaWR0ICIkKHRkaXJfbWlwc2lkdCkiCi1lbWlwc2lkdGwuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2lkdGwgIiQodGRpcl9taXBzaWR0bCkiCi1lbWlwc2xpdC5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2xpdC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2xpdCAiJCh0ZGlyX21pcHNsaXQpIgotZW1pcHNsbmV3cy5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2xuZXdzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzbG5ld3MKLWVtaXBzcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc3BlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNwZSAiJCh0ZGlyX21pcHMpIgotZW1uMTAzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDMwMCAiJCh0ZGlyX21uMTAzMDApIgotZW1uMTAyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDIwMCAiJCh0ZGlyX21uMTAyMDApIgotZW5ld3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbmV3cyAiJCh0ZGlyX25ld3MpIgotZW5zMzJrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9uczMya25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG5zMzJrbmJzZCAiJCh0ZGlyX25zMzJrbmJzZCkiCi1lcGM1MzJtYWNoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwYzUzMm1hY2hhICIkKHRkaXJfcGM1MzJtYWNoYSkiCi1lcGplbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcGplbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBqZWxmICIkKHRkaXJfcGplbGYpIgotZXBqbGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wamxlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBqbGVsZiAiJCh0ZGlyX3BqbGVsZikiCi1lcHBjbWFjb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNtYWNvcyAiJCh0ZGlyX3BwY21hY29zKSIKLWVwcGNudy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNudy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNudyAiJCh0ZGlyX3BwY253KSIKLWVwcGNwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BwY3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNwZSAiJCh0ZGlyX3BwY3BlKSIKLWVyaXNjaXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcmlzY2l4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSByaXNjaXggIiQodGRpcl9yaXNjaXgpIgotZXNhMjkyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2EyOTIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2EyOTIwMCAiJCh0ZGlyX3NhMjkyMDApIgotZXNoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2ggIiQodGRpcl9zaCkiCi1lc2hlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNoZWxmICIkKHRkaXJfc2hlbGYpIgotZXNobGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGxlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobGVsZiAiJCh0ZGlyX3NobGVsZikiCi1lc2hsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2guc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobCAiJCh0ZGlyX3NobCkiCi1lc2hwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaHBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNocGUgIiQodGRpcl9zaGwpIgotZXNwYXJjYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjYW91dCAiJCh0ZGlyX3NwYXJjYW91dCkiCi1lc3BhcmNsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNsaW51eCAiJCh0ZGlyX3NwYXJjbGludXgpIgotZXNwYXJjbHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2x5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNseW54ICIkKHRkaXJfc3BhcmNseW54KSIKLWVzcGFyY25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY25ic2QgIiQodGRpcl9zcGFyY25ic2QpIgotZXN0MjAwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdDIwMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3N0MjAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3QyMDAwICIkKHRkaXJfc3QyMDAwKSIKLWVzdW4zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N1bjMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3N1bm9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdW4zICIkKHRkaXJfc3VuMykiCi1lc3VuNC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW40LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3VuNCAiJCh0ZGlyX3N1bjQpIgotZXRpYzMwYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWMzMGFvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljMzBhb3V0ICIkKHRkaXJfdGljMzBhb3V0KSIKLWV0aWMzMGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzMwY29mZiAiJCh0ZGlyX3RpYzMwY29mZikiCi1ldGljODBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzgwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWM4MGNvZmYgIiQodGRpcl90aWM4MGNvZmYpIgotZXZhbmlsbGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmFuaWxsYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvdmFuaWxsYS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdmFuaWxsYSAiJCh0ZGlyX3ZhbmlsbGEpIgotZXZheC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92YXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZheCAiJCh0ZGlyX3ZheCkiCi1ldnN0YS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92c3RhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2c3RhICIkKHRkaXJfdnN0YSkiCi1ldjg1MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92ODUwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdjg1MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdjg1MCAiJCh0ZGlyX3Y4NTApIgotZXc2NS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy93NjUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3c2NS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdzY1ICIkKHRkaXJfdzY1KSIKLWV6ODAwMS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHo4MDAxICIkKHRkaXJfejgwMDEpIgotZXo4MDAyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3o4MDAyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC96ODAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gejgwMDIgIiQodGRpcl96ODAwMikiCi0KLWxkX25ld19TT1VSQ0VTID0gbGRncmFtLnkgbGRsZXgubCBsZXhzdXAuYyBsZGxhbmcuYyBtcmkuYyBsZGN0b3IuYyBsZG1haW4uYyBcCi0JbGR3cml0ZS5jIGxkZXhwLmMgbGRlbXVsLmMgbGR2ZXIuYyBsZG1pc2MuYyBsZGZpbGUuYyBsZGNyZWYuYwotbGRfbmV3X0RFUEVOREVOQ0lFUyA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExERVBTKQotbGRfbmV3X0xEQUREID0gJChFTVVMQVRJT05fT0ZJTEVTKSAkKEVNVUxfRVhUUkFfT0ZJTEVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLSMgVGhlIGdlbmVyYXRlZCBlbXVsYXRpb24gZmlsZXMgbW9zdGx5IGhhdmUgdGhlIHNhbWUgZGVwZW5kZW5jaWVzLgotJChFTVVMQVRJT05fT0ZJTEVTKTogLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWFpbi5oIGxkZW11bC5oIGxkZmlsZS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggXAotICBsZGN0b3IuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZ3JhbS5oCi0KLSMgVGhpcyBpcyB0aGUgcmVhbCBsaWJiZmQuYSBjcmVhdGVkIGJ5IGxpYnRvb2wuCi1URVNUQkZETElCID0gQFRFU1RCRkRMSUJACi0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0Jc3Jjcm9vdD1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNyb290OyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlMQ19DT0xMQVRFPTsgTENfQUxMPTsgTEFORz07IGV4cG9ydCBMQ19DT0xMQVRFIExDX0FMTCBMQU5HOyBcCi0JRVhQRUNUPSQoRVhQRUNUKTsgZXhwb3J0IEVYUEVDVDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3Jjcm9vdH0vdGVzdHN1aXRlIFwKLQkJQ0M9IiQoQ0NfRk9SX1RBUkdFVCkiIENGTEFHUz0iJChDRkxBR1MpIiBcCi0JCUNYWD0iJChDWFhfRk9SX1RBUkdFVCkiIENYWEZMQUdTPSIkKENYWEZMQUdTKSIgXAotCQlDQ19GT1JfSE9TVD0iJChDQykiIENGTEFHU19GT1JfSE9TVD0iJChDRkxBR1MpIiBcCi0JCU9GSUxFUz0iJChPRklMRVMpIiBCRkRMSUI9IiQoVEVTVEJGRExJQikiIFwKLQkJTElCSUJFUlRZPSIkKExJQklCRVJUWSkgJChJTlRMTElCUykiIExJQlM9IiQoTElCUykiIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFJ1bGVzIGZvciB0ZXN0aW5nIGJ5IHJlbGlua2luZyBsZCBpdHNlbGYuCi0jIEEgc2ltaWxhciB0ZXN0IGlzIGluIHRoZSB0ZXN0c3VpdGUuICBUaGlzIHRhcmdldCBpcyBmb3IgZWFzZSBvZiB1c2UKLSMgd2hlbiBwb3J0aW5nIGxkLgotCi1sZC1wYXJ0aWFsLm86IGxkLW5ldyQoRVhFRVhUKQotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkLXBhcnRpYWwubyAtciAkKE9GSUxFUykKLWxkMSQoRVhFRVhUKTogbGQtcGFydGlhbC5vCi0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSBsZC1wYXJ0aWFsLm8gJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpICQoTElCUykKLQotbGQxLWZ1bGwkKEVYRUVYVCk6IGxkLW5ldwotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMS1mdWxsJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpICQoTElCUykKLQotbGQyJChFWEVFWFQpOiBsZDEkKEVYRUVYVCkKLQkuL2xkMSQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDIkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykgJChMSUJTKQotCi1sZDMkKEVYRUVYVCk6IGxkMiQoRVhFRVhUKQotCS4vbGQyJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMyQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKSAkKExJQlMpCi0KLWJvb3RzdHJhcDogbGQzJChFWEVFWFQpCi0JY21wIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkKLQotLlBIT05ZOiBib290c3RyYXAKLQotIyBBIHRlc3QgcHJvZ3JhbSBmb3IgQysrIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuCi0jIFRoaXMgdGVzdCBpcyBub3cgaW4gdGhlIHRlc3RzdWl0ZS4KLSMKLSNjZHRlc3Q6IGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyBsZC5uZXcKLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0ICQoSE9TVElOR19DUlQwKSBcCi0jCSAgY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vICQoSE9TVElOR19MSUJTKQotIwotI2NkdGVzdC5vdXQ6IGNkdGVzdAotIwkuL2NkdGVzdCA+IGNkdGVzdC50bXAKLSMJbXYgY2R0ZXN0LnRtcCBjZHRlc3Qub3V0Ci0jCi0jY2R0ZXN0LXVyLm86IGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyBsZC5uZXcKLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0LXVyLm8gLVVyIGNkdGVzdC1tYWluLm8gXAotIwkgIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8KLSMKLSNjZHRlc3QtdXI6IGNkdGVzdC11ci5vCi0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ciAkKEhPU1RJTkdfQ1JUMCkgY2R0ZXN0LXVyLm8gXAotIwkgICQoSE9TVElOR19MSUJTKQotIwotI2NkdGVzdC11ci5vdXQ6IGNkdGVzdC11cgotIwkuL2NkdGVzdC11ciA+IGNkdGVzdC11ci50bXAKLSMJbXYgY2R0ZXN0LXVyLnRtcCBjZHRlc3QtdXIub3V0Ci0jCi0jY2hlY2stY2R0ZXN0OiBjZHRlc3Qub3V0IGNkdGVzdC11ci5vdXQgJChzcmNkaXIpL2NkdGVzdC5leHAKLSMJZGlmZiAkKHNyY2RpcikvY2R0ZXN0LmV4cCBjZHRlc3Qub3V0Ci0jCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0LXVyLm91dAotIwotIy5QSE9OWTogY2hlY2stY2R0ZXN0Ci0KLSMgRU5EIE9GIENIRUNLIFRBUkdFVFMKLQotIyBET0NVTUVOVEFUSU9OIFRBUkdFVFMKLSMgTWFudWFsIGNvbmZpZ3VyYXRpb24gZmlsZTsgbm90IHVzdWFsbHkgYXR0YWNoZWQgdG8gbm9ybWFsIGNvbmZpZ3VyYXRpb24sCi0jIGJlY2F1c2UgYWxtb3N0IGFsbCBjb25maWdzIHVzZSAiZ2VuIiB2ZXJzaW9uIG9mIG1hbnVhbC4KLSMgIFNldCBET0NWRVIgYWJvdmUgdG8gY2hhbmdlLgotY29uZmlnZG9jLnRleGk6CSR7RE9DVkVSfS1kb2MudGV4aQotCWxuIC1zICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgbG4gJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBjcCAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkKLQotbGR2ZXIudGV4aTogTWFrZWZpbGUKLQlybSAtZiAkQAotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACi0KLWxkLmluZm86ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAtSSAkKEJGRERJUikvZG9jICQoc3JjZGlyKS9sZC50ZXhpbmZvCi0KLWxkLmR2aTogJChzcmNkaXIpL2xkLnRleGluZm8gY29uZmlnZG9jLnRleGkgbGR2ZXIudGV4aQotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm86JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89IiQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAtSSAkKEJGRERJUikvZG9jIiAkKFRFWEkyRFZJKSAkKHNyY2RpcikvbGQudGV4aW5mbwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGxkdmVyLnRleGkKLQotIyBXZSB3YW50IHRvIHJlY29uZmlndXJlIGlmIGNvbmZpZ3VyZS5ob3N0IG9yIGNvbmZpZ3VyZS50Z3QgY2hhbmdlcy4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZ3VyZS5ob3N0ICQoc3JjZGlyKS9jb25maWd1cmUudGd0Ci0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChTVEFHRVNUVUZGKSBsZDEkKEVYRUVYVCkgbGQyJChFWEVFWFQpIGxkMyQoRVhFRVhUKSBcCi0JbGRlbXVsLWxpc3QuaCBjcnRiZWdpbi5vIGNydGVuZC5vIGxkLmxvZyBsZC5zdW0KLW1vc3RseWNsZWFuLWxvY2FsOgotCS1ybSAtcmYgdG1wZGlyCi1DTEVBTkZJTEVTID0gZGVwLnNlZCBERVAgREVQMQotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBsZC1uZXckKEVYRUVYVCkKLQkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKSAkKHRvb2xkaXIpL2JpbgotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCW49YGVjaG8gbGQgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgbGQtbmV3JChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCi0JZmkKLQotaW5zdGFsbC1kYXRhLWxvY2FsOgotCSQobWtpbnN0YWxsZGlycykgJChzY3JpcHRkaXIpL2xkc2NyaXB0cwotCWZvciBmIGluIGxkc2NyaXB0cy8qOyBkbyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmICQoc2NyaXB0ZGlyKS8kJGYgOyBcCi0JZG9uZQotCi0jIFN0dWZmIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgZGlzdHJpYnV0aW9uLiAgVGhlIGRpc3RzdHVmZgotIyB0YXJnZXQgaXMgcnVuIGJ5IHRoZSB0YXogdGFyZ2V0IGluIC4uL01ha2VmaWxlLmluLgotTERESVNUU1RVRkYgPSBsZGdyYW0uYyBsZGdyYW0uaCBsZGxleC5jCi1kaXN0c3R1ZmY6ICQoTERESVNUU1RVRkYpIGluZm8KLQotRElTVENMRUFORklMRVMgPSB0ZGlycyBzaXRlLmV4cCBzaXRlLmJhawotZGlzdGNsZWFuLWxvY2FsOgotCXJtIC1yZiBsZHNjcmlwdHMKLQotIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiBERVAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPERFUDEgPkRFUAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotREVQMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKLQlybSAtZiBERVAyCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JJChNS0RFUCkgLWYgREVQMiAkKElOQ0xVREVTKSAkPwotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVAyIERFUDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotbGRjdG9yLm86IGxkY3Rvci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGN0b3IuaAotbGRlbXVsLm86IGxkZW11bC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGVtdWwuaCBcCi0gIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRlbXVsLWxpc3QuaAotbGRleHAubzogbGRleHAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggbGRncmFtLmggbGRsYW5nLmgKLWxkZmlsZS5vOiBsZGZpbGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRncmFtLmggXAotICBsZGxleC5oIGxkZW11bC5oCi1sZGxhbmcubzogbGRsYW5nLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggbGRsZXguaCBsZG1pc2MuaCBcCi0gIGxkY3Rvci5oIGxkZmlsZS5oICQoSU5DRElSKS9mbm1hdGNoLmggJChJTkNESVIpL2RlbWFuZ2xlLmgKLWxkbWFpbi5vOiBsZG1haW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkbWlzYy5oIGxkd3JpdGUuaCBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIFwKLSAgbGRsZXguaCBsZGZpbGUuaCBsZGN0b3IuaAotbGRtaXNjLm86IGxkbWlzYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRncmFtLmggbGRsZXguaCBsZG1haW4uaCBsZGZpbGUuaAotbGR2ZXIubzogbGR2ZXIuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGR2ZXIuaCBcCi0gIGxkZW11bC5oIGxkbWFpbi5oCi1sZHdyaXRlLm86IGxkd3JpdGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCi0gIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oCi1sZXhzdXAubzogbGV4c3VwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaCBsZGxleC5oIGxkZmlsZS5oIFwKLSAgbGR2ZXIuaCBsZGVtdWwuaAotbXJpLm86IG1yaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRtaXNjLmggbXJpLmggbGRncmFtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1sZGNyZWYubzogbGRjcmVmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBcCi0gIGxkbGFuZy5oCi1wZS1kbGwubzogcGUtZGxsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAotICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGVtdWwuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgLi4vYmZkL2xpYmNvZmYuaCBkZWZmaWxlLmggcGUtZGxsLmgKLWxkZ3JhbS5vOiBsZGdyYW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkZXhwLmggbGR2ZXIuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBcCi0gIGxkbWFpbi5oIG1yaS5oIGxkY3Rvci5oIGxkbGV4LmgKLWxkbGV4Lm86IGxkbGV4LmMgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBsZC5oIGxkZ3JhbS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRsZXguaCBcCi0gIGxkbWFpbi5oCi1kZWZmaWxlcC5vOiBkZWZmaWxlcC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgbGQuaCBsZG1pc2MuaCBkZWZmaWxlLmgKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9sZC9NYWtlZmlsZS5pbiBiL2xkL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWVhODRiLi4wMDAwMDAwCi0tLSBhL2xkL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTYzMCArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUyA9IEBBU0AKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRU1VTEFUSU9OX0xJQlBBVEggPSBARU1VTEFUSU9OX0xJQlBBVEhACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5BVElWRV9MSUJfRElSUyA9IEBOQVRJVkVfTElCX0RJUlNACi1PQkpEVU1QID0gQE9CSkRVTVBACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1TVFJJTkdJRlkgPSBAU1RSSU5HSUZZQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1WRVJTSU9OID0gQFZFUlNJT05ACi1sID0gQGxACi0KLUlOVExMSUJTID0gQElOVExMSUJTQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKLQotU1VCRElSUyA9IHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF07IHRoZW4gZWNobyAuLi9iaXNvbi9iaXNvbiAteSAtTCQoc3JjZGlyKS8uLi9iaXNvbi87IGVsc2UgZWNobyBAWUFDQ0A7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4OyBlbHNlIGVjaG8gQExFWEA7IGZpYAotCi0jIFdlIHB1dCB0aGUgc2NyaXB0cyBpbiB0aGUgZGlyZWN0b3J5ICQoc2NyaXB0ZGlyKS9sZHNjcmlwdHMuCi0jIFdlIGNhbid0IHB1dCB0aGUgc2NyaXB0cyBpbiAkKGRhdGFkaXIpIGJlY2F1c2UgdGhlIFNFQVJDSF9ESVIKLSMgZGlyZWN0aXZlcyBuZWVkIHRvIGJlIGRpZmZlcmVudCBmb3IgbmF0aXZlIGFuZCBjcm9zcyBsaW5rZXJzLgotc2NyaXB0ZGlyID0gJCh0b29sZGlyKS9saWIKLQotRU1VTCA9IEBFTVVMQAotRU1VTEFUSU9OX09GSUxFUyA9IEBFTVVMQVRJT05fT0ZJTEVTQAotRU1VTF9FWFRSQV9PRklMRVMgPSBARU1VTF9FWFRSQV9PRklMRVNACi0KLSMgU2VhcmNoIHBhdGggdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIC1sZm9vIGxpYnJhcmllcy4KLSMgSWYgTElCX1BBVEggaXMgZW1wdHksIHRoZSBvbmVzIGluIHRoZSBzY3JpcHQgKGlmIGFueSkgYXJlIGxlZnQgYWxvbmUuCi0jIChUaGUgZGVmYXVsdCBpcyB1c3VhbGx5IC9saWI6L3Vzci9saWI6L3Vzci9sb2NhbC9saWIsIHVubGVzcyBidWlsZGluZwotIyBhIGNyb3NzLWxpbmtlciwgaW4gd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBpcyBlbXB0eS4gIFNlZSBnZW5zY3JpcHRzLnNoLikKLSMgT3RoZXJ3aXNlLCB0aGV5IGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbmVzIGdpdmVuIGluIExJQl9QQVRILAotIyB3aGljaCBtYXkgaGF2ZSB0aGUgZm9ybTogTElCX1BBVEg9L2xpYjovdXNyL2xvY2FsL2xpYgotTElCX1BBVEggPSAKLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUiA9ICQoQkFTRURJUikvaW5jbHVkZQotTUtERVAgPSBta2RlcAotCi0jIFdoYXQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHRvIGJ1aWxkCi1ET0NWRVIgPSBnZW4KLQotI3N0dWZmIGZvciBzZWxmIGhvc3RpbmcgKGNhbiBiZSBvdmVycmlkZGVuIGluIGNvbmZpZyBmaWxlKS4KLUhPU1RJTkdfQ1JUMCA9IEBIT1NUSU5HX0NSVDBACi1IT1NUSU5HX0xJQlMgPSBASE9TVElOR19MSUJTQAotSE9TVElOR19FTVUgPSAtbSAkKEVNVUwpCi0KLSMgU2V0dXAgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLCBpZiB5b3UgaGF2ZSBvbmUKLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyBcCi0JdGhlbiBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotCWVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLQllbHNlIGVjaG8gcnVudGVzdCA7IGZpYAotCi0KLVJVTlRFU1RGTEFHUyA9IAotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLUNYWCA9IGdjYwotQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGxkLW5ldwotaW5mb19URVhJTkZPUyA9IGxkLnRleGluZm8KLW5vaW5zdF9URVhJTkZPUyA9IGxkaW50LnRleGluZm8KLW1hbl9NQU5TID0gbGQuMQotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIC1JJCh0b3Bfc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAkKEhERUZJTkVTKSAkKENGTEFHUykgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotQUxMX0VNVUxBVElPTlMgPSBcCi0JZWEyOWsubyBcCi0JZWFpeHBwYy5vIFwKLQllYWl4cnM2Lm8gXAotCWVhbHBoYS5vIFwKLQllYXJjZWxmLm8gXAotCWVhcm1lbGYubyBcCi0JZWFybWVsZl9vYWJpLm8gXAotCWVhcm1lbGZfbGludXgubyBcCi0JZWFybWVsZl9saW51eDI2Lm8gXAotCWVhcm1hb3V0Yi5vIFwKLQllYXJtYW91dGwubyBcCi0JZWFybWNvZmYubyBcCi0JZWFybW5ic2QubyBcCi0JZWFybXBlLm8gXAotCWVhcm1fZXBvY19wZS5vIFwKLQllYXZyMTIwMC5vIFwKLQllYXZyMjN4eC5vIFwKLQllYXZyNDR4NC5vIFwKLQllYXZyNDQzMy5vIFwKLQllYXZyODV4eC5vIFwKLQllYXZybWVnYTYwMy5vIFwKLQllYXZybWVnYTEwMy5vIFwKLQllYXZybWVnYTE2MS5vIFwKLQllY29mZl9zcGFyYy5vIFwKLQllZDEwdmVsZi5vIFwKLQllZDMwdmVsZi5vIFwKLQllZDMwdl9lLm8gXAotCWVkMzB2X28ubyBcCi0JZWRlbHRhNjgubyBcCi0JZWVibW9uMjlrLm8gXAotCWVlbGYzMl9zcGFyYy5vIFwKLQllZWxmMzJfaTk2MC5vIFwKLQllZWxmMzJiNDMwMC5vIFwKLQllZWxmMzJibWlwLm8gXAotCWVlbGYzMmVibWlwLm8gXAotCWVlbGYzMmVsbWlwLm8gXAotCWVlbGYzMmJtaXBuMzIubyBcCi0JZWVsZjMyaTM3MC5vIFwKLQllZWxmMzJsNDMwMC5vIFwKLQllZWxmMzJsbWlwLm8gXAotCWVlbGYzMmxwcGMubyBcCi0JZWVsZjMycHBjLm8gXAotCWVlbGYzMnBwY2xpbnV4Lm8gXAotCWVlbGZfaTM4Ni5vIFwKLQllZWxmX2kzODZfYmUubyBcCi0JZWdsZDk2MC5vIFwKLQllZ2xkOTYwY29mZi5vIFwKLQllZWxmMzJmcjMwLm8gXAotCWVlbGYzMm1jb3JlLm8gXAotCWVoODMwMC5vIFwKLQllaDgzMDBoLm8gXAotCWVoODMwMHMubyBcCi0JZWg4NTAwLm8gXAotCWVoODUwMGIubyBcCi0JZWg4NTAwYy5vIFwKLQllaDg1MDBtLm8gXAotCWVoODUwMHMubyBcCi0JZWhwMzAwYnNkLm8gXAotCWVocDNocHV4Lm8gXAotCWVpMzg2YW91dC5vIFwKLQllaTM4NmJlb3MubyBcCi0JZWkzODZic2QubyBcCi0JZWkzODZjb2ZmLm8gXAotCWVpMzg2Z28zMi5vIFwKLQllaTM4NmxpbnV4Lm8gXAotCWVpMzg2bHlueC5vIFwKLQllaTM4Nm1hY2gubyBcCi0JZWkzODZtb3NzLm8gXAotCWVpMzg2bXNkb3MubyBcCi0JZWkzODZuYnNkLm8gXAotCWVpMzg2bncubyBcCi0JZWkzODZwZS5vIFwKLQllaTM4NnBlX3Bvc2l4Lm8gXAotCWVsbms5NjAubyBcCi0JZW02OGs0a25ic2QubyBcCi0JZW02OGthb3V0Lm8gXAotCWVtNjhrYXV4Lm8gXAotCWVtNjhrY29mZi5vIFwKLQllbTY4a2VsZi5vIFwKLQllbTY4a2xpbnV4Lm8gXAotCWVtNjhrbHlueC5vIFwKLQllbTY4a25ic2QubyBcCi0JZW02OGtwc29zLm8gXAotCWVtODhrYmNzLm8gXAotCWVtY29yZXBlLm8gXAotCWVtaXBzYmlnLm8gXAotCWVtaXBzYnNkLm8gXAotCWVtaXBzaWR0Lm8gXAotCWVtaXBzaWR0bC5vIFwKLQllbWlwc2xpdC5vIFwKLQllbWlwc2xuZXdzLm8gXAotCWVtaXBzcGUubyBcCi0JZW5ld3MubyBcCi0JZXBqZWxmLm8gXAotCWVwamxlbGYubyBcCi0JZW5zMzJrbmJzZC5vIFwKLQllcGM1MzJtYWNoYS5vIFwKLQllcHBjbWFjb3MubyBcCi0JZXBwY253Lm8gXAotCWVwcGNwZS5vIFwKLQllcmlzY2l4Lm8gXAotCWVzYTI5MjAwLm8gXAotCWVzaC5vIFwKLQllc2hlbGYubyBcCi0JZXNobGVsZi5vIFwKLQllc2hsLm8gXAotCWVzaHBlLm8gXAotCWVzcGFyY2FvdXQubyBcCi0JZXNwYXJjbGludXgubyBcCi0JZXNwYXJjbHlueC5vIFwKLQllc3BhcmNuYnNkLm8gXAotCWVzdDIwMDAubyBcCi0JZXN1bjMubyBcCi0JZXN1bjQubyBcCi0JZXRpYzMwYW91dC5vIFwKLQlldGljMzBjb2ZmLm8gXAotCWV0aWM4MGNvZmYubyBcCi0JZXZhbmlsbGEubyBcCi0JZXZheC5vIFwKLQlldnN0YS5vIFwKLQlldzY1Lm8gXAotCWV6ODAwMS5vIFwKLQllejgwMDIubwotCi0KLUFMTF82NF9FTVVMQVRJT05TID0gXAotCWVlbGY2NF9zcGFyYy5vIFwKLQllZWxmNjRhbHBoYS5vIFwKLQllZWxmNjRibWlwLm8KLQotCi1BTExfRU1VTF9FWFRSQV9PRklMRVMgPSBcCi0JcGUtZGxsLm8gXAotCWRlZmZpbGVwLm8KLQotCi1DRklMRVMgPSBsZGN0b3IuYyBsZGVtdWwuYyBsZGV4cC5jIGxkZmlsZS5jIGxkbGFuZy5jIFwKLQlsZG1haW4uYyBsZG1pc2MuYyBsZHZlci5jIGxkd3JpdGUuYyBsZXhzdXAuYyBcCi0JbXJpLmMgbGRjcmVmLmMgcGUtZGxsLmMKLQotCi1IRklMRVMgPSBsZC5oIGxkY3Rvci5oIGxkZW11bC5oIGxkZXhwLmggbGRmaWxlLmggXAotCWxkbGFuZy5oIGxkbGV4LmggbGRtYWluLmggbGRtaXNjLmggbGR2ZXIuaCBcCi0JbGR3cml0ZS5oIG1yaS5oIGRlZmZpbGUuaCBwZS1kbGwuaAotCi0KLUdFTkVSQVRFRF9DRklMRVMgPSBsZGdyYW0uYyBsZGxleC5jIGRlZmZpbGVwLmMKLUdFTkVSQVRFRF9IRklMRVMgPSBsZGdyYW0uaCBsZGVtdWwtbGlzdC5oIGRlZmZpbGVwLmgKLQotT0ZJTEVTID0gbGRncmFtLm8gbGRsZXgubyBsZXhzdXAubyBsZGxhbmcubyBtcmkubyBsZGN0b3IubyBsZG1haW4ubyBcCi0JbGR3cml0ZS5vIGxkZXhwLm8gIGxkZW11bC5vIGxkdmVyLm8gbGRtaXNjLm8gXAotCWxkZmlsZS5vIGxkY3JlZi5vICR7RU1VTEFUSU9OX09GSUxFU30gJHtFTVVMX0VYVFJBX09GSUxFU30KLQotCi1TVEFHRVNUVUZGID0gKi5vIGxkc2NyaXB0cy8qIGUqLmMKLQotIyBBdCB0aGUgbW9tZW50IHRoaXMgaXMganVzdCBhIGxpc3Qgb2YgdGhvc2UgZW11bGF0aW9uIHRlbXBsYXRlIGZpbGVzCi0jIHRoYXQgY29udGFpbiBpbnRlcm5hdGlvbmFsaXNlZCBzdHJpbmdzLgotRU1VTEFUSU9OX0ZJTEVTID0gZW11bHRlbXBsL3BlLmVtIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtCi0KLVBPVEZJTEVTID0gJChDRklMRVMpICQoSEZJTEVTKSAkKEVNVUxBVElPTl9GSUxFUykKLQotIyBUaGVzZSBhbGwgc3RhcnQgd2l0aCBlIHNvICdtYWtlIGNsZWFuJyBjYW4gZmluZCB0aGVtLgotCi1HRU5TQ1JJUFRTID0gJChTSEVMTCkgJChzcmNkaXIpL2dlbnNjcmlwdHMuc2ggJHtzcmNkaXJ9ICR7bGliZGlyfSBAaG9zdEAgQHRhcmdldEAgQHRhcmdldF9hbGlhc0AgIkBFTVVMQVRJT05fTElCUEFUSEAiICJATkFUSVZFX0xJQl9ESVJTQCIKLUdFTl9ERVBFTkRTID0gJChzcmNkaXIpL2dlbnNjcmlwdHMuc2ggc3RyaW5naWZ5LnNlZAotCi1sZF9uZXdfU09VUkNFUyA9IGxkZ3JhbS55IGxkbGV4LmwgbGV4c3VwLmMgbGRsYW5nLmMgbXJpLmMgbGRjdG9yLmMgbGRtYWluLmMgXAotCWxkd3JpdGUuYyBsZGV4cC5jIGxkZW11bC5jIGxkdmVyLmMgbGRtaXNjLmMgbGRmaWxlLmMgbGRjcmVmLmMKLQotbGRfbmV3X0RFUEVOREVOQ0lFUyA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExERVBTKQotbGRfbmV3X0xEQUREID0gJChFTVVMQVRJT05fT0ZJTEVTKSAkKEVNVUxfRVhUUkFfT0ZJTEVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLSMgVGhpcyBpcyB0aGUgcmVhbCBsaWJiZmQuYSBjcmVhdGVkIGJ5IGxpYnRvb2wuCi1URVNUQkZETElCID0gQFRFU1RCRkRMSUJACi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gbGR2ZXIudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChTVEFHRVNUVUZGKSBsZDEkKEVYRUVYVCkgbGQyJChFWEVFWFQpIGxkMyQoRVhFRVhUKSBcCi0JbGRlbXVsLWxpc3QuaCBjcnRiZWdpbi5vIGNydGVuZC5vIGxkLmxvZyBsZC5zdW0KLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgREVQIERFUDEKLQotIyBTdHVmZiB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhIGRpc3RyaWJ1dGlvbi4gIFRoZSBkaXN0c3R1ZmYKLSMgdGFyZ2V0IGlzIHJ1biBieSB0aGUgdGF6IHRhcmdldCBpbiAuLi9NYWtlZmlsZS5pbi4KLUxERElTVFNUVUZGID0gbGRncmFtLmMgbGRncmFtLmggbGRsZXguYwotCi1ESVNUQ0xFQU5GSUxFUyA9IHRkaXJzIHNpdGUuZXhwIHNpdGUuYmFrCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotbm9pbnN0X1BST0dSQU1TID0gIGxkLW5ldyQoRVhFRVhUKQotUFJPR1JBTVMgPSAgJChub2luc3RfUFJPR1JBTVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLWxkX25ld19PQkpFQ1RTID0gIGxkZ3JhbS5vIGxkbGV4Lm8gbGV4c3VwLm8gbGRsYW5nLm8gbXJpLm8gbGRjdG9yLm8gXAotbGRtYWluLm8gbGR3cml0ZS5vIGxkZXhwLm8gbGRlbXVsLm8gbGR2ZXIubyBsZG1pc2MubyBsZGZpbGUubyBsZGNyZWYubwotbGRfbmV3X0xERkxBR1MgPSAKLUxFWF9PVVRQVVRfUk9PVCA9IEBMRVhfT1VUUFVUX1JPT1RACi1MRVhMSUIgPSBATEVYTElCQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1URVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAotSU5GT19ERVBTID0gbGQuaW5mbwotRFZJUyA9IGxkLmR2aQotVEVYSU5GT1MgPSBsZC50ZXhpbmZvCi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLU1BTlMgPSAkKG1hbl9NQU5TKQotCi1OUk9GRiA9IG5yb2ZmCi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbiBcCi1ORVdTIFRPRE8gYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gXAotbGRncmFtLmMgbGRsZXguYwotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IGd0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gJChsZF9uZXdfU09VUkNFUykKLU9CSkVDVFMgPSAkKGxkX25ld19PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAuZHZpIC5pbmZvIC5sIC5sbyAubyAucHMgLnMgLnRleGkgLnRleGluZm8gLnR4aSAueQotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0kKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAgYWNpbmNsdWRlLm00Ci0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKLSQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotCi1jb25maWcuaDogc3RhbXAtaAotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiBzdGFtcC1oOyBcCi0JCSQoTUFLRSkgc3RhbXAtaDsgXAotCWVsc2UgOjsgZmkKLXN0YW1wLWg6ICQoc3JjZGlyKS9jb25maWcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gXAotCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0JQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKLSQoc3JjZGlyKS9jb25maWcuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2Rpcikvc3RhbXAtaC5pbgotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCQkkKE1BS0UpICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JZWxzZSA6OyBmaQotJChzcmNkaXIpL3N0YW1wLWguaW46ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCi0JQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpL3N0YW1wLWguaW4gMj4gL2Rldi9udWxsCi0KLW1vc3RseWNsZWFuLWhkcjoKLQotY2xlYW4taGRyOgotCi1kaXN0Y2xlYW4taGRyOgotCS1ybSAtZiBjb25maWcuaAotCi1tYWludGFpbmVyLWNsZWFuLWhkcjoKLQotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLWxkLW5ldyQoRVhFRVhUKTogJChsZF9uZXdfT0JKRUNUUykgJChsZF9uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBsZC1uZXckKEVYRUVYVCkKLQkkKExJTkspICQobGRfbmV3X0xERkxBR1MpICQobGRfbmV3X09CSkVDVFMpICQobGRfbmV3X0xEQUREKSAkKExJQlMpCi0ubC5jOgotCSQoTEVYKSAkKEFNX0xGTEFHUykgJChMRkxBR1MpICQ8ICYmIG12ICQoTEVYX09VVFBVVF9ST09UKS5jICRACi0ueS5jOgotCSQoWUFDQykgJChBTV9ZRkxBR1MpICQoWUZMQUdTKSAkPCAmJiBtdiB5LnRhYi5jICQqLmMKLQlpZiB0ZXN0IC1mIHkudGFiLmg7IHRoZW4gXAotCWlmIGNtcCAtcyB5LnRhYi5oICQqLmg7IHRoZW4gcm0gLWYgeS50YWIuaDsgZWxzZSBtdiB5LnRhYi5oICQqLmg7IGZpOyBcCi0JZWxzZSA6OyBmaQotbGRncmFtLmg6IGxkZ3JhbS5jCi0KLQotbGQuaW5mbzogbGQudGV4aW5mbwotbGQuZHZpOiBsZC50ZXhpbmZvCi0KLQotRFZJUFMgPSBkdmlwcwotCi0udGV4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50ZXhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50eGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotLmR2aS5wczoKLQkkKERWSVBTKSAkPCAtbyAkQAotCi1pbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5mb2RpcikKLQlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGlmaWxlIGluIGBjZCAkJGQgJiYgZWNobyAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldYDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZC8kJGlmaWxlOyB0aGVuIFwKLQkgICAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGUiOyBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGU7IFwKLQkgICAgZWxzZSA6IDsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JQCQoUE9TVF9JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIjtcCi0JICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSB8fCA6O1wKLQkgIGRvbmU7IFwKLQllbHNlIDogOyBmaQotCi11bmluc3RhbGwtaW5mbzoKLQkkKFBSRV9VTklOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaWk9eWVzOyBcCi0JZWxzZSBpaT07IGZpOyBcCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAteiAiJGlpIiBcCi0JICAgIHx8IGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIC0tcmVtb3ZlICQkZmlsZTsgXAotCWRvbmUKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIChjZCAkKERFU1RESVIpJChpbmZvZGlyKSAmJiBybSAtZiAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldKTsgXAotCWRvbmUKLQotZGlzdC1pbmZvOiAkKElORk9fREVQUykKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgZmlsZSBpbiBgY2QgJCRkICYmIGV2YWwgZWNobyAkJGJhc2UqYDsgZG8gXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1tb3N0bHljbGVhbi1hbWluZm86Ci0JLXJtIC1mIGxkLmF1eCBsZC5jcCBsZC5jcHMgbGQuZHZpIGxkLmZuIGxkLmZucyBsZC5reSBsZC5reXMgbGQucHMgXAotCSAgbGQubG9nIGxkLnBnIGxkLnRvYyBsZC50cCBsZC50cHMgbGQudnIgbGQudnJzIGxkLm9wIGxkLnRyIFwKLQkgIGxkLmN2IGxkLmNuCi0KLWNsZWFuLWFtaW5mbzoKLQotZGlzdGNsZWFuLWFtaW5mbzoKLQotbWFpbnRhaW5lci1jbGVhbi1hbWluZm86Ci0JZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCi0JICBybSAtZiAkJGk7IFwKLQkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAotCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCi0JICBmaTsgXAotCWRvbmUKLWNsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbwotCi1pbnN0YWxsLW1hbjE6Ci0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChtYW4xZGlyKQotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS8kJGk7IHRoZW4gZmlsZT0kKHNyY2RpcikvJCRpOyBcCi0JICBlbHNlIGZpbGU9JCRpOyBmaTsgXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1tYW4xOgotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotaW5zdGFsbC1tYW46ICQoTUFOUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLW1hbjEKLXVuaW5zdGFsbC1tYW46Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtbWFuMQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLQotREVKQVRPT0wgPSAkKFBBQ0tBR0UpCi0KLVJVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKLXNpdGUuZXhwOiBNYWtlZmlsZQotCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKLQlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCi0JQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10Ci0JQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAotCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAotCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAotCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAotCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCi0JQG12ICRALXQgc2l0ZS5leHAKLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtZXhlYy1sb2NhbAotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4gaW5zdGFsbC1kYXRhLWxvY2FsCi1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1tYW4KLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKE1BTlMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKG1hbmRpcikvbWFuMQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICJsZGxleGxsZGdyYW1obGRncmFtYyQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiBsZGxleGwgbGRncmFtaCBsZGdyYW1jICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi10YWdzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotCQltb3N0bHljbGVhbi1sb2NhbAotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdFBST0dSQU1TIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLXRhZ3MgXAotCQlkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbSBkaXN0Y2xlYW4tbG9jYWwKLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKLW1vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAotdW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWRhdGEtYW0gXAotaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBcCi1hbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIGluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gXAotbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1sZG1haW4ubzogbGRtYWluLmMgY29uZmlnLnN0YXR1cwotCSQoQ09NUElMRSkgLWMgLURERUZBVUxUX0VNVUxBVElPTj0nIiQoRU1VTCkiJyAtRFNDUklQVERJUj0nIiQoc2NyaXB0ZGlyKSInIC1EVEFSR0VUPSciQHRhcmdldEAiJyAkKHNyY2RpcikvbGRtYWluLmMKLQotbGRlbXVsLWxpc3QuaDogTWFrZWZpbGUKLQkoZWNobyAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiAgRE8gTk9UIEVESVQhICovIjtcCi0JZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAotCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCi0JICAgIGVjaG8gImV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkXyQke2Z9X2VtdWxhdGlvbjsiOyBcCi0JZG9uZTtcCi0JZWNobyAiIjtcCi0JZWNobyAiI2RlZmluZSBFTVVMQVRJT05fTElTVCBcXCI7XAotCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKLQkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAotCSAgICBlY2hvICIgICZsZF8kJHtmfV9lbXVsYXRpb24sIFxcIjsgXAotCWRvbmU7XAotCWVjaG8gIiAgMCIpID5sZGVtdWwtdG1wLmgKLQltdiBsZGVtdWwtdG1wLmggbGRlbXVsLWxpc3QuaAotCi1zdHJpbmdpZnkuc2VkOiAke3NyY2Rpcn0vZW11bHRlbXBsLyQoU1RSSU5HSUZZKQotCSAgY3AgJHtzcmNkaXJ9L2VtdWx0ZW1wbC8kKFNUUklOR0lGWSkgc3RyaW5naWZ5LnNlZAotQFRESVJTQAotCi1lYTI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hMjlrLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hMjlrLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhMjlrICIkKHRkaXJfYTI5aykiCi1lYWl4cHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FpeHBwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFpeHBwYyAiJCh0ZGlyX2FpeHBwYykiCi1lYWl4cnM2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FpeHJzNi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFpeHJzNiAiJCh0ZGlyX2FpeHJzNikiCi1lYWxwaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWxwaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FscGhhLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhbHBoYSAiJCh0ZGlyX2FscGhhKSIKLWVhcmNlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJjZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFyY2VsZiAiJCh0ZGlyX2FyY2VsZikiCi1lYXJtZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZiAiJCh0ZGlyX2FybWVsZikiCi1lYXJtZWxmX29hYmkuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9vYWJpICIkKHRkaXJfYXJtZWxmKSIKLWVhcm1lbGZfbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX2xpbnV4ICIkKHRkaXJfYXJtZWxmX2xpbnV4KSIKLWVhcm1lbGZfbGludXgyNi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9saW51eDI2ICIkKHRkaXJfYXJtZWxmX2xpbnV4MjYpIgotZWFybWFvdXRiLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWFvdXRiLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1hb3V0YiAiJCh0ZGlyX2FybWFvdXRiKSIKLWVhcm1hb3V0bC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1hb3V0bC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtYW91dGwgIiQodGRpcl9hcm1hb3V0bCkiCi1lYXJtY29mZi5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1jb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1jb2ZmICIkKHRkaXJfYXJtY29mZikiCi1lYXJtbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1uYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1uYnNkICIkKHRkaXJfYXJtbmJzZCkiCi1lYXJtX2Vwb2NfcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lcG9jcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybV9lcG9jX3BlICIkKHRkaXJfYXJtcGUpIgotZWFybXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybXBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybXBlICIkKHRkaXJfYXJtcGUpIgotZWF2cjg1eHguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXZyODV4eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmMzJhdnIuc2MgXAotICAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXZyODV4eCAiJCh0ZGlyX2F2cjg1eHgpIgotZWF2cjEyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXZyMTIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmMzJhdnIuc2MgXAotICAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXZyMTIwMCAiJCh0ZGlyX2F2cjg1eHgpIgotZWF2cjIzeHguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXZyMjN4eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmMzJhdnIuc2MgXAotICAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXZyMjN4eCAiJCh0ZGlyX2F2cjg1eHgpIgotZWF2cjQ0eDQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXZyNDR4NC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmMzJhdnIuc2MgXAotICAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXZyNDR4NCAiJCh0ZGlyX2F2cjg1eHgpIgotZWF2cjQ0MzMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXZyNDQzMy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmMzJhdnIuc2MgXAotICAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXZyNDQzMyAiJCh0ZGlyX2F2cjg1eHgpIgotZWF2cm1lZ2E2MDMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXZybWVnYTYwMy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmMzJhdnIuc2MgXAotICAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXZybWVnYTYwMyAiJCh0ZGlyX2F2cjg1eHgpIgotZWF2cm1lZ2ExMDMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXZybWVnYTEwMy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmMzJhdnIuc2MgXAotICAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXZybWVnYTEwMyAiJCh0ZGlyX2F2cjg1eHgpIgotZWF2cm1lZ2ExNjEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXZybWVnYTE2MS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmMzJhdnIuc2MgXAotICAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXZybWVnYTE2MSAiJCh0ZGlyX2F2cjg1eHgpIgotZWNvZmZfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBjb2ZmX3NwYXJjICIkKHRkaXJfY29mZl9zcGFyYykiCi1lZDEwdmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMTB2ZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMTB2ZWxmICIkKHRkaXJfZDEwdikiCi1lZDMwdmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2ZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2ZWxmICIkKHRkaXJfZDMwdikiCi1lZDMwdl9vLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZfby5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdl9vICIkKHRkaXJfZDMwdikiCi1lZDMwdl9lLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZfZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdl9lICIkKHRkaXJfZDMwdikiCi1lZGVsdGE2OC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kZWx0YTY4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkZWx0YTY4ICIkKHRkaXJfZGVsdGE2OCkiCi1lZWJtb24yOWsuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWJtb24yOWsuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlYm1vbjI5ayAiJCh0ZGlyX2VibW9uMjlrKSIKLWVlbGYzMmZyMzAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmZyMzAgIiQodGRpcl9mcjMwKSIKLWVlbGYzMm1jb3JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybWNvcmUgIiQodGRpcl9tY29yZSkiCi1lbTMycmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tMzJyZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG0zMnJlbGYgIiQodGRpcl9tMzJyKSIKLWVlbGYzMl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJfc3BhcmMgIiQodGRpcl9lbGYzMl9zcGFyYykiCi1lZWxmMzJfaTk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMl9pOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMl9pOTYwICIkKHRkaXJfZWxmMzJfaTk2MCkiCi1lZWxmMzJiNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmI0MzAwICIkKHRkaXJfZWxmMzJiNDMwMCkiCi1lZWxmMzJibWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJibWlwICIkKHRkaXJfZWxmMzJibWlwKSIKLWVlbGYzMmJzbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYnNtaXAgIiQodGRpcl9lbGYzMmJzbWlwKSIKLWVlbGYzMmVibWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZWJtaXAgIiQodGRpcl9lbGYzMmVibWlwKSIKLWVlbGYzMmVsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZWxtaXAgIiQodGRpcl9lbGYzMmVsbWlwKSIKLWVlbGYzMmJtaXBuMzIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJibWlwbjMyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJtaXBuMzIgIiQodGRpcl9lbGYzMmJtaXBuMzIpIgotZWVsZjMybDQzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsNDMwMCAiJCh0ZGlyX2VsZjMybDQzMDApIgotZWVsZjMybG1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybG1pcCAiJCh0ZGlyX2VsZjMybG1pcCkiCi1lZWxmMzJscHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybHBwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJscHBjICIkKHRkaXJfZWxmMzJscHBjKSIKLWVlbGYzMmxzbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybHNtaXAgIiQodGRpcl9lbGYzMmxzbWlwKSIKLWVlbGYzMnBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMnBwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJwcGMgIiQodGRpcl9lbGYzMnBwYykiCi1lZWxmMzJwcGNsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMnBwY2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMnBwY2xpbnV4ICIkKHRkaXJfZWxmMzJwcGNsaW51eCkiCi1lZWxmMzJpMzcwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyaTM3MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmkzNzAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyaTM3MCAiJCh0ZGlyX2VsZjMyaTM3MCkiCi1lZWxmNjRhbHBoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NGFscGhhICIkKHRkaXJfZWxmNjRhbHBoYSkiCi1lZWxmNjRfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0X3NwYXJjICIkKHRkaXJfZWxmNjRfc3BhcmMpIgotZWVsZjY0Ym1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NGJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0Ym1pcCAiJCh0ZGlyX2VsZjY0Ym1pcCkiCi1lZWxmX2kzODYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmX2kzODYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZl9pMzg2ICIkKHRkaXJfZWxmX2kzODYpIgotZWVsZl9pMzg2X2JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGZfaTM4Nl9iZSAiJCh0ZGlyX2VsZl9pMzg2X2JlKSIKLWVnbGQ5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdsZDk2MCAiJCh0ZGlyX2dsZDk2MCkiCi1lZ2xkOTYwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbGQ5NjBjb2ZmICIkKHRkaXJfZ2xkOTYwY29mZikiCi1laDgzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMCAiJCh0ZGlyX2g4MzAwKSIKLWVoODMwMGguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDBoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMGguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwaCAiJCh0ZGlyX2g4MzAwaCkiCi1laDgzMDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMHMgIiQodGRpcl9oODMwMHMpIgotZWg4NTAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDAgIiQodGRpcl9oODUwMCkiCi1laDg1MDBiLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwYi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBiLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMGIgIiQodGRpcl9oODUwMGIpIgotZWg4NTAwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBjICIkKHRkaXJfaDg1MDBjKSIKLWVoODUwMG0uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBtLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMG0uc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwbSAiJCh0ZGlyX2g4NTAwbSkiCi1laDg1MDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMHMgIiQodGRpcl9oODUwMHMpIgotZWhwMzAwYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwMzAwYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocDMwMGJzZCAiJCh0ZGlyX2hwMzAwYnNkKSIKLWVocDNocHV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwM2hwdXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwM2hwdXggIiQodGRpcl9ocDNocHV4KSIKLWVpMzg2YW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmFvdXQgIiQodGRpcl9pMzg2YW91dCkiCi1laTM4NmJlb3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2Jlb3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YmVvcyAiJCh0ZGlyX2kzODZiZW9zKSIKLWVpMzg2YnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZic2QgIiQodGRpcl9pMzg2YnNkKSIKLWVpMzg2Y29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Y29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZjb2ZmICIkKHRkaXJfaTM4NmNvZmYpIgotZWkzODZnbzMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZnbzMyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmdvMzIgIiQodGRpcl9pMzg2Z28zMikiCi1laTM4NmxpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZsaW51eCAiJCh0ZGlyX2kzODZsaW51eCkiCi1laTM4Nmx5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bHlueCAiJCh0ZGlyX2kzODZseW54KSIKLWVpMzg2bWFjaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bWFjaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1hY2ggIiQodGRpcl9pMzg2bWFjaCkiCi1laTM4Nm1vc3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1vc3MgIiQodGRpcl9pMzg2bW9zcykiCi1laTM4Nm1zZG9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bXNkb3MgIiQodGRpcl9pMzg2bXNkb3MpIgotZWkzODZuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bmJzZCAiJCh0ZGlyX2kzODZuYnNkKSIKLWVpMzg2bncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm53LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZudyAiJCh0ZGlyX2kzODZudykiCi1laTM4NnBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2cGUgIiQodGRpcl9pMzg2cGUpIgotZWkzODZwZV9wb3NpeC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2cGVfcG9zaXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NnBlX3Bvc2l4ICIkKHRkaXJfaTM4NnBlX3Bvc2l4KSIKLWVsbms5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbG5rOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9sbms5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGxuazk2MCAiJCh0ZGlyX2xuazk2MCkiCi1lbTY4azRrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrNGtuYnNkICIkKHRkaXJfbTY4azRrbmJzZCkiCi1lbTY4a2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGthb3V0ICIkKHRkaXJfbTY4a2FvdXQpIgotZW02OGthdXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2F1eCAiJCh0ZGlyX202OGthdXgpIgotZW02OGtjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2NvZmYgIiQodGRpcl9tNjhrY29mZikiCi1lbTY4a2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrZWxmICIkKHRkaXJfbTY4a2VsZikiCi1lbTY4a2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtsaW51eCAiJCh0ZGlyX202OGtsaW51eCkiCi1lbTY4a2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2x5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbHlueCAiJCh0ZGlyX202OGtseW54KSIKLWVtNjhrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a25ic2QgIiQodGRpcl9tNjhrbmJzZCkiCi1lbTY4a3Bzb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wc29zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrcHNvcyAiJCh0ZGlyX202OGtwc29zKSIKLWVtODhrYmNzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL204OGtiY3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL204OGtiY3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG04OGtiY3MgIiQodGRpcl9tODhrYmNzKSIKLWVtY29yZXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21jb3JlcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWNvcmVwZSAiJCh0ZGlyX21jb3JlcGUpIgotZW1pcHNiaWcuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNiaWcuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNiaWcKLWVtaXBzYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHNic2Quc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNic2QKLWVtaXBzaWR0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2lkdCAiJCh0ZGlyX21pcHNpZHQpIgotZW1pcHNpZHRsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHRsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNpZHRsICIkKHRkaXJfbWlwc2lkdGwpIgotZW1pcHNsaXQuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsaXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNsaXQgIiQodGRpcl9taXBzbGl0KSIKLWVtaXBzbG5ld3MuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2xuZXdzCi1lbWlwc3BlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzcGUgIiQodGRpcl9taXBzKSIKLWVtbjEwMzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21uMTAzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1uMTAzMDAgIiQodGRpcl9tbjEwMzAwKSIKLWVtbjEwMjAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21uMTAyMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1uMTAyMDAgIiQodGRpcl9tbjEwMjAwKSIKLWVuZXdzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL25ld3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG5ld3MgIiQodGRpcl9uZXdzKSIKLWVuczMya25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBuczMya25ic2QgIiQodGRpcl9uczMya25ic2QpIgotZXBjNTMybWFjaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcGM1MzJtYWNoYSAiJCh0ZGlyX3BjNTMybWFjaGEpIgotZXBqZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BqZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwamVsZiAiJCh0ZGlyX3BqZWxmKSIKLWVwamxlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcGpsZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwamxlbGYgIiQodGRpcl9wamxlbGYpIgotZXBwY21hY29zLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY21hY29zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcHBjbWFjb3MgIiQodGRpcl9wcGNtYWNvcykiCi1lcHBjbncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjbncuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9udy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcHBjbncgIiQodGRpcl9wcGNudykiCi1lcHBjcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wcGNwZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcHBjcGUgIiQodGRpcl9wcGNwZSkiCi1lcmlzY2l4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3Jpc2NpeC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcmlzY2l4ICIkKHRkaXJfcmlzY2l4KSIKLWVzYTI5MjAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NhMjkyMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNhMjkyMDAgIiQodGRpcl9zYTI5MjAwKSIKLWVzaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2guc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNoICIkKHRkaXJfc2gpIgotZXNoZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NoZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaGVsZiAiJCh0ZGlyX3NoZWxmKSIKLWVzaGxlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hsZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaGxlbGYgIiQodGRpcl9zaGxlbGYpIgotZXNobC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaGwgIiQodGRpcl9zaGwpIgotZXNocGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaHBlICIkKHRkaXJfc2hsKSIKLWVzcGFyY2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2FvdXQgIiQodGRpcl9zcGFyY2FvdXQpIgotZXNwYXJjbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbGludXggIiQodGRpcl9zcGFyY2xpbnV4KSIKLWVzcGFyY2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbHlueCAiJCh0ZGlyX3NwYXJjbHlueCkiCi1lc3BhcmNuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNuYnNkICIkKHRkaXJfc3BhcmNuYnNkKSIKLWVzdDIwMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3QyMDAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN0MjAwMCAiJCh0ZGlyX3N0MjAwMCkiCi1lc3VuMy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW4zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3VuMyAiJCh0ZGlyX3N1bjMpIgotZXN1bjQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuNC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN1bjQgIiQodGRpcl9zdW40KSIKLWV0aWMzMGFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzMwYW91dCAiJCh0ZGlyX3RpYzMwYW91dCkiCi1ldGljMzBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWMzMGNvZmYgIiQodGRpcl90aWMzMGNvZmYpIgotZXRpYzgwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWM4MGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljODBjb2ZmICIkKHRkaXJfdGljODBjb2ZmKSIKLWV2YW5pbGxhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZhbmlsbGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3ZhbmlsbGEuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZhbmlsbGEgIiQodGRpcl92YW5pbGxhKSIKLWV2YXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmF4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2YXggIiQodGRpcl92YXgpIgotZXZzdGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdnN0YS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdnN0YSAiJCh0ZGlyX3ZzdGEpIgotZXY4NTAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdjg1MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Y4NTAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHY4NTAgIiQodGRpcl92ODUwKSIKLWV3NjUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdzY1LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC93NjUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHc2NSAiJCh0ZGlyX3c2NSkiCi1lejgwMDEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB6ODAwMSAiJCh0ZGlyX3o4MDAxKSIKLWV6ODAwMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHo4MDAyICIkKHRkaXJfejgwMDIpIgotCi0jIFRoZSBnZW5lcmF0ZWQgZW11bGF0aW9uIGZpbGVzIG1vc3RseSBoYXZlIHRoZSBzYW1lIGRlcGVuZGVuY2llcy4KLSQoRU1VTEFUSU9OX09GSUxFUyk6IC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1haW4uaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRjdG9yLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaAotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY3Jvb3Q9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3Jjcm9vdDsgXAotCXI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JTENfQ09MTEFURT07IExDX0FMTD07IExBTkc9OyBleHBvcnQgTENfQ09MTEFURSBMQ19BTEwgTEFORzsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY3Jvb3R9L3Rlc3RzdWl0ZSBcCi0JCUNDPSIkKENDX0ZPUl9UQVJHRVQpIiBDRkxBR1M9IiQoQ0ZMQUdTKSIgXAotCQlDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIiBDWFhGTEFHUz0iJChDWFhGTEFHUykiIFwKLQkJQ0NfRk9SX0hPU1Q9IiQoQ0MpIiBDRkxBR1NfRk9SX0hPU1Q9IiQoQ0ZMQUdTKSIgXAotCQlPRklMRVM9IiQoT0ZJTEVTKSIgQkZETElCPSIkKFRFU1RCRkRMSUIpIiBcCi0JCUxJQklCRVJUWT0iJChMSUJJQkVSVFkpICQoSU5UTExJQlMpIiBMSUJTPSIkKExJQlMpIiBcCi0JCSQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotIyBSdWxlcyBmb3IgdGVzdGluZyBieSByZWxpbmtpbmcgbGQgaXRzZWxmLgotIyBBIHNpbWlsYXIgdGVzdCBpcyBpbiB0aGUgdGVzdHN1aXRlLiAgVGhpcyB0YXJnZXQgaXMgZm9yIGVhc2Ugb2YgdXNlCi0jIHdoZW4gcG9ydGluZyBsZC4KLQotbGQtcGFydGlhbC5vOiBsZC1uZXckKEVYRUVYVCkKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZC1wYXJ0aWFsLm8gLXIgJChPRklMRVMpCi1sZDEkKEVYRUVYVCk6IGxkLXBhcnRpYWwubwotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMSQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgbGQtcGFydGlhbC5vICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKSAkKExJQlMpCi0KLWxkMS1mdWxsJChFWEVFWFQpOiBsZC1uZXcKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDEtZnVsbCQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKSAkKExJQlMpCi0KLWxkMiQoRVhFRVhUKTogbGQxJChFWEVFWFQpCi0JLi9sZDEkKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQyJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpICQoTElCUykKLQotbGQzJChFWEVFWFQpOiBsZDIkKEVYRUVYVCkKLQkuL2xkMiQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDMkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykgJChMSUJTKQotCi1ib290c3RyYXA6IGxkMyQoRVhFRVhUKQotCWNtcCBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpCi0KLS5QSE9OWTogYm9vdHN0cmFwCi0KLSMgQSB0ZXN0IHByb2dyYW0gZm9yIEMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgotIyBUaGlzIHRlc3QgaXMgbm93IGluIHRoZSB0ZXN0c3VpdGUuCi0jCi0jY2R0ZXN0OiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdCAkKEhPU1RJTkdfQ1JUMCkgXAotIwkgIGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3Qub3V0OiBjZHRlc3QKLSMJLi9jZHRlc3QgPiBjZHRlc3QudG1wCi0jCW12IGNkdGVzdC50bXAgY2R0ZXN0Lm91dAotIwotI2NkdGVzdC11ci5vOiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ci5vIC1VciBjZHRlc3QtbWFpbi5vIFwKLSMJICBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vCi0jCi0jY2R0ZXN0LXVyOiBjZHRlc3QtdXIubwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIgJChIT1NUSU5HX0NSVDApIGNkdGVzdC11ci5vIFwKLSMJICAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3QtdXIub3V0OiBjZHRlc3QtdXIKLSMJLi9jZHRlc3QtdXIgPiBjZHRlc3QtdXIudG1wCi0jCW12IGNkdGVzdC11ci50bXAgY2R0ZXN0LXVyLm91dAotIwotI2NoZWNrLWNkdGVzdDogY2R0ZXN0Lm91dCBjZHRlc3QtdXIub3V0ICQoc3JjZGlyKS9jZHRlc3QuZXhwCi0jCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0Lm91dAotIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC11ci5vdXQKLSMKLSMuUEhPTlk6IGNoZWNrLWNkdGVzdAotCi0jIEVORCBPRiBDSEVDSyBUQVJHRVRTCi0KLSMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCi0jIE1hbnVhbCBjb25maWd1cmF0aW9uIGZpbGU7IG5vdCB1c3VhbGx5IGF0dGFjaGVkIHRvIG5vcm1hbCBjb25maWd1cmF0aW9uLAotIyBiZWNhdXNlIGFsbW9zdCBhbGwgY29uZmlncyB1c2UgImdlbiIgdmVyc2lvbiBvZiBtYW51YWwuCi0jICBTZXQgRE9DVkVSIGFib3ZlIHRvIGNoYW5nZS4KLWNvbmZpZ2RvYy50ZXhpOgkke0RPQ1ZFUn0tZG9jLnRleGkKLQlsbiAtcyAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgY3AgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpCi0KLWxkdmVyLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgJEAKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiAkQAotCi1sZC5pbmZvOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCi0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyAkKHNyY2RpcikvbGQudGV4aW5mbwotCi1sZC5kdmk6ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvOiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSIkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyIgJChURVhJMkRWSSkgJChzcmNkaXIpL2xkLnRleGluZm8KLQotIyBXZSB3YW50IHRvIHJlY29uZmlndXJlIGlmIGNvbmZpZ3VyZS5ob3N0IG9yIGNvbmZpZ3VyZS50Z3QgY2hhbmdlcy4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZ3VyZS5ob3N0ICQoc3JjZGlyKS9jb25maWd1cmUudGd0Ci0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotbW9zdGx5Y2xlYW4tbG9jYWw6Ci0JLXJtIC1yZiB0bXBkaXIKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwgaW5zdGFsbC1kYXRhLWxvY2FsCi0KLWluc3RhbGwtZXhlYy1sb2NhbDogbGQtbmV3JChFWEVFWFQpCi0JJChta2luc3RhbGxkaXJzKSAkKGJpbmRpcikgJCh0b29sZGlyKS9iaW4KLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQluPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCWlmIFsgIiQoYmluZGlyKS8kJG4kKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKSIgXTsgdGhlbiBcCi0JICBybSAtZiAkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKTsgXAotCSAgbG4gJChiaW5kaXIpLyQkbiQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsIFwKLQkgIHx8ICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pIGxkLW5ldyQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKTsgXAotCWZpCi0KLWluc3RhbGwtZGF0YS1sb2NhbDoKLQkkKG1raW5zdGFsbGRpcnMpICQoc2NyaXB0ZGlyKS9sZHNjcmlwdHMKLQlmb3IgZiBpbiBsZHNjcmlwdHMvKjsgZG8gXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZiAkKHNjcmlwdGRpcikvJCRmIDsgXAotCWRvbmUKLWRpc3RzdHVmZjogJChMRERJU1RTVFVGRikgaW5mbwotZGlzdGNsZWFuLWxvY2FsOgotCXJtIC1yZiBsZHNjcmlwdHMKLQotIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiBERVAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPERFUDEgPkRFUAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotREVQMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKLQlybSAtZiBERVAyCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JJChNS0RFUCkgLWYgREVQMiAkKElOQ0xVREVTKSAkPwotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVAyIERFUDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotbGRjdG9yLm86IGxkY3Rvci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGN0b3IuaAotbGRlbXVsLm86IGxkZW11bC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGVtdWwuaCBcCi0gIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRlbXVsLWxpc3QuaAotbGRleHAubzogbGRleHAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggbGRncmFtLmggbGRsYW5nLmgKLWxkZmlsZS5vOiBsZGZpbGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRncmFtLmggXAotICBsZGxleC5oIGxkZW11bC5oCi1sZGxhbmcubzogbGRsYW5nLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggbGRsZXguaCBsZG1pc2MuaCBcCi0gIGxkY3Rvci5oIGxkZmlsZS5oICQoSU5DRElSKS9mbm1hdGNoLmggJChJTkNESVIpL2RlbWFuZ2xlLmgKLWxkbWFpbi5vOiBsZG1haW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkbWlzYy5oIGxkd3JpdGUuaCBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIFwKLSAgbGRsZXguaCBsZGZpbGUuaCBsZGN0b3IuaAotbGRtaXNjLm86IGxkbWlzYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRncmFtLmggbGRsZXguaCBsZG1haW4uaCBsZGZpbGUuaAotbGR2ZXIubzogbGR2ZXIuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGR2ZXIuaCBcCi0gIGxkZW11bC5oIGxkbWFpbi5oCi1sZHdyaXRlLm86IGxkd3JpdGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCi0gIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oCi1sZXhzdXAubzogbGV4c3VwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaCBsZGxleC5oIGxkZmlsZS5oIFwKLSAgbGR2ZXIuaCBsZGVtdWwuaAotbXJpLm86IG1yaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRtaXNjLmggbXJpLmggbGRncmFtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1sZGNyZWYubzogbGRjcmVmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBcCi0gIGxkbGFuZy5oCi1wZS1kbGwubzogcGUtZGxsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAotICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGVtdWwuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgLi4vYmZkL2xpYmNvZmYuaCBkZWZmaWxlLmggcGUtZGxsLmgKLWxkZ3JhbS5vOiBsZGdyYW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkZXhwLmggbGR2ZXIuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBcCi0gIGxkbWFpbi5oIG1yaS5oIGxkY3Rvci5oIGxkbGV4LmgKLWxkbGV4Lm86IGxkbGV4LmMgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBsZC5oIGxkZ3JhbS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRsZXguaCBcCi0gIGxkbWFpbi5oCi1kZWZmaWxlcC5vOiBkZWZmaWxlcC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgbGQuaCBsZG1pc2MuaCBkZWZmaWxlLmgKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2xkL05FV1MgYi9sZC9ORVdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzIzNDBmLi4wMDAwMDAwCi0tLSBhL2xkL05FV1MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLSotIHRleHQgLSotCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjEwOgotCi0qIEFkZGVkIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiB1bnVzZWQgc2VjdGlvbnMsIGVuYWJsZWQgYnkgLS1nYy1zZWN0aW9ucy4gCi0gIEl0IGRvZXMgcmVxdWlyZSBhIGJpdCBvZiBiYWNrZW5kIHN1cHBvcnQ7IGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcmUKLSAgcHBjLWVsZiwgbWlwcy1lbGYsIGFuZCBtbjEwMzAwLWVsZi4gIE90aGVycyB3aWxsIGlnbm9yZSB0aGUgb3B0aW9uLgotCi0qIEFkZGVkIFNPUlQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgdG8gcGVybWl0IHNvcnRpbmcgc2VjdGlvbnMgYnkgZmlsZQotICBuYW1lIG9yIHNlY3Rpb24gbmFtZS4KLQotKiBBZGRlZCBFWFRFUk4gdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgYXMgYW4gZXF1aXZhbGVudCB0byB0aGUgLXUKLSAgY29tbWFuZC1saW5lIG9wdGlvbi4KLQotKiBBZGRlZCBBU1NFUlQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogQWRkZWQgRVhDTFVERV9GSUxFIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIGZvciBmdXJ0aGVyIGNvbnRyb2wgb3ZlcgotICB3aWxkY2FyZCBmaWxlIG5hbWVzLgotCi0qIEFkZGVkIC1PIG9wdGlvbiB0byBvcHRpbWl6ZSBsaW5rZXIgb3V0cHV0IChhcyBvZiB0aGlzIHdyaXRpbmcsIHRoaXMgb25seQotYWZmZWN0cyBFTEYgc2hhcmVkIGxpYnJhcnkgZ2VuZXJhdGlvbikuCi0KLSogVGhlIC1lIG9wdGlvbiBub3cgYWNjZXB0cyBhIG51bWJlciBhcyB3ZWxsIGFzIGEgc3ltYm9sIG5hbWUuCi0KLSogQWRkZWQgLS1uby11bmRlZmluZWQgb3B0aW9uIHRvIGRpc2FsbG93IHVuZGVmaW5lZCBzeW1ib2xzIHdoZW4gY3JlYXRpbmcgYQotICBzaGFyZWQgbGlicmFyeS4KLQotKiBUaGUgbGlua2VyIG5vdyBpc3N1ZXMgYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IsIGZvciBhbiB1bmRlZmluZWQgc3ltYm9sIHdoZW4KLSAgdXNpbmcgLUJzeW1ib2xpYzsgdXNlIHRoZSBuZXcgLS1uby11bmRlZmluZWQgb3B0aW9uIHRvIGdldCB0aGUgb2xkCi0gIGJlaGF2aW91ci4KLQotKiBBZGRlZCAtLWRlbWFuZ2xlIGFuZCAtLW5vLWRlbWFuZ2xlIG9wdGlvbnMuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjk6Ci0KLSogQWRkZWQgU1FVQUQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogTmV3IG9wdGlvbiAtLW5vLXdhcm4tbWlzbWF0Y2guCi0KLSogVGhlIE1FTU9SWSBjb21tYW5kIG5vdyBwYXJzZXMgdGhlIGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIHdoZXJlIHNlY3Rpb25zIHRoYXQKLSAgYXJlIG5vdCBwbGFjZWQgaW4gYSBzcGVjaWZpYyBtZW1vcnkgcmVnaW9uIGFyZSBwbGFjZWQuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjg6Ci0KLSogTGlua2VyIHNjcmlwdHMgbWF5IG5vdyBjb250YWluIHNoZWxsIHdpbGRjYXJkIGNoYXJhY3RlcnMgZm9yIGZpbGUgYW5kIHNlY3Rpb24KLSAgbmFtZXMuCi0KLSogVGhlIGxpbmtlciBub3cgc3VwcG9ydHMgc3ltYm9sIHZlcnNpb25zIGluIEVMRi4KLQotKiBUaGUgTk9DUk9TU1JFRlMgY29tbWFuZCB3YXMgYWRkZWQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogVGhlIExPQURBRERSIGV4cHJlc3Npb24gd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIE1BWCBhbmQgTUlOIGZ1bmN0aW9ucyB3ZXJlIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIFRoZSBPVkVSTEFZIGNvbnN0cnVjdCB3YXMgYWRkZWQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogTmV3IG9wdGlvbiAtLXdhcm4tc2VjdGlvbi1hbGlnbiB0byB3YXJuIHdoZW4gdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0IHNlY3Rpb24KLSAgY2hhbmdlcyBkdWUgdG8gYWxpZ25tZW50IG9mIGFuIGlucHV0IHNlY3Rpb24uCi0KLSogTmV3IG9wdGlvbnMgLS1maWx0ZXIvLUYgYW5kIC0tYXV4aWxpYXJ5Ly1mLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi43OgotCi0qIE5ldyBvcHRpb24gLS1jcmVmIHRvIHByaW50IG91dCBhIGNyb3NzIHJlZmVyZW5jZSB0YWJsZS4KLQotKiBOZXcgb3B0aW9uIC0td3JhcCBTWU1CT0wuCi0KLSogTmV3IG9wdGlvbiAtLW5vLXdob2xlLWFyY2hpdmUsIHRvIHR1cm4gb2ZmIHRoZSBlZmZlY3Qgb2YgLS13aG9sZS1hcmNoaXZlLgotCi0qIElucHV0IHNlY3Rpb25zIGFzc2lnbmVkIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiAvRElTQ0FSRC8gaW4gdGhlIGxpbmtlciBzY3JpcHQKLSAgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLSogVGhlIFN1bk9TIGFuZCBFTEYgbGlua2VycyBub3cgbWVyZ2Ugc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIHVzZXMKLSAgdGhlIE5fQklOQ0wgYW5kIE5fRUlOQ0wgc3RhYiB0eXBlcy4gIFRoaXMgcmVkdWNlcyB0aGUgYW1vdW50IG9mIGRlYnVnZ2luZwotICBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjY6Ci0KLSogV2hlbiBhbiBFTEYgc2VjdGlvbiBuYW1lIGlzIHJlcHJlc2VudGFibGUgYXMgYSBDIGlkZW50aWZpZXIgKHRoaXMgaXMgbm90IHRydWUKLW9mIG1vc3QgRUxGIHNlY3Rpb24gbmFtZXMpLCB0aGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBkZWZpbmUgc3ltYm9scwotX19zdGFydF9TRUNOQU1FIGFuZCBfX3N0b3BfU0VDTkFNRSwgd2hlcmUgU0VDTkFNRSBpcyB0aGUgc2VjdGlvbiBuYW1lLCBhdCB0aGUKLWJlZ2lubmluZyBhbmQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCBieSBnbGliYy4KLQotKiBXaGVuIGFuIEVMRiBzZWN0aW9uIG5hbWVkIC5nbnUud2FybmluZyBpcyBlbmNvdW50ZXJlZCBpbiBhbiBpbnB1dCBmaWxlLCB0aGUKLWNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIGFyZSBkaXNwbGF5ZWQgYXMgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIHRoZSBzZWN0aW9uIGlzCi1ub3QgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcyBpcyB1c2VkIGJ5IGdsaWJjLgotCi0qIFdoZW4gYW4gRUxGIHNlY3Rpb24gbmFtZWQgLmdudS53YXJuaW5nLlNZTUJPTCBpcyBlbmNvdW50ZXJlZCBpbiBhbiBpbnB1dAotZmlsZSwgYW5kIHRoZSBzeW1ib2wgU1lNQk9MIGlzIHJlZmVyZW5jZWQgYnkgc29tZSBvYmplY3QgZmlsZSwgdGhlIGNvbnRlbnRzIG9mCi10aGUgc2VjdGlvbiBhcmUgZGlzcGxheWVkIGFzIGFuIGVycm9yIG1lc3NhZ2UuICBUaGUgc2VjdGlvbiBpcyBub3QgY29waWVkIGludG8KLXRoZSBvdXRwdXQgZmlsZSwgdW5sZXNzIGRvaW5nIGEgcmVsb2NhdGVhYmxlIG9yIHNoYXJlZCBsaW5rLiAgVGhpcyBpcyB1c2VkIGJ5Ci1nbGliYy4KLQotKiBOZXcgb3B0aW9ucyAtc3BsaXQtYnktcmVsb2MgYW5kIC1zcGxpdC1ieS1maWxlLgotCi0qIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIGxpbmtpbmcgUElDIGNvbXBpbGVkIGNvZGUgb24gU1BBUkMgU3VuT1MuICBJdCBjYW4KLWFsc28gY3JlYXRlIFNQQVJDIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCwgbGlrZSB0aGUgbmF0aXZlIFN1bk9TIGxpbmtlciwKLXdpbGwgZG8gc28gd2hlbmV2ZXIgdGhlcmUgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbiB0aGUgbGluayBhbmQgbmVpdGhlciB0aGUgLWUKLW5vciB0aGUgLXIgb3B0aW9uIHdhcyB1c2VkLgotCi0qIFRoZSAtcnBhdGggb3B0aW9uIG1heSBiZSB1c2VkIG9uIFN1bk9TIHRvIHNldCB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBiZQotc2VhcmNoZWQgYXQgcnVuIHRpbWUuICBUaGlzIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBvZiBidWlsZGluZyB0aGUgbGlzdCBmcm9tIHRoZQotLUwgb3B0aW9ucy4KLQotKiBUaGUgQ09GRiBsaW5rZXIgbm93IGNvbWJpbmVzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3Igc3RydWN0cywgdW5pb25zLCBhbmQKLWVudW1zLCBzbyB0aGF0IGV2ZW4gaWYgdGhlIHNhbWUgdHlwZSBpcyBkZWZpbmVkIGluIG11bHRpcGxlIGlucHV0IGZpbGVzIGl0IHdpbGwKLW9ubHkgYmUgZGVmaW5lZCBvbmNlIGluIHRoZSBvdXRwdXQgZmlsZS4gIFRoZSAtLXRyYWRpdGlvbmFsLWZvcm1hdCBzd2l0Y2ggd2lsbAotcHJldmVudCB0aGlzIG9wdGltaXphdGlvbi4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuNToKLQotKiBUaGUgbGlua2VyIG5vdyBzdXBwb3J0cyBsaW5raW5nIGFnYWluc3QgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcy4gIEl0IHN0aWxsIGNhbgotbm90IGxpbmsgU3VuT1MgUElDIChQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlKSBmaWxlcywgc28gaXQgY2FuIG5vdCBiZSB1c2VkIHRvCi1nZW5lcmF0ZSBzaGFyZWQgbGliYXJpZXMuCi0KLSogVGhlIGxpbmtlciBub3cgc3VwcG9ydHMgbGlua2luZyBhZ2FpbnN0IEVMRiBzaGFyZWQgbGlicmFyaWVzIGZvciB0aGUgaTM4NgotKFVuaXhXYXJlKSBhbmQgU1BBUkMgKFNvbGFyaXMpLiAgSXQgY2FuIGFsc28gbGluayBFTEYgUElDIGZpbGVzLCBhbmQgY2FuIGJlCi11c2VkIHRvIGdlbmVyYXRlIHNoYXJlZCBsaWJyYXJpZXMuICBTaGFyZWQgbGlicmFyeSBnZW5lcmF0aW9uIGlzIG5vdCB3ZWxsCi10ZXN0ZWQ7IHBsZWFzZSByZXBvcnQgYW55IHByb2JsZW1zIGVuY291bnRlcmVkLiAgVGhlIGxpbmtlciBpcyBub3cgZW5hYmxlZCBmb3IKLVNvbGFyaXMgYWdhaW4uCi0KLSogRXJpYyBZb3VuZ2RhbGUgaGFzIGNvbnRyaWJ1dGVkIExpbnV4IHN1cHBvcnQgY29kZSwgaW5jbHVkaW5nIGxpbmtpbmcgYWdhaW5zdAotTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gIFRoZSBsaW5rZXIgcHJvZHVjZXMgTGludXggUU1BR0lDIGJpbmFyaWVzLgotCi0qIFRoZSBFTEYgYmFja2VuZCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBsaW5rZXIgY29kZS4gIFRvIHVzZSB0aGUgbmV3Ci1FTEYgbGlua2VyLCBlYWNoIHBhcnRpY3VsYXIgdGFyZ2V0IHJlcXVpcmVzIGEgcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFNvIGZhciwKLXRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gd3JpdHRlbiBmb3IgaTM4NiAoVW5peFdhcmUpLCBTUEFSQyAoU29sYXJpcykgTUlQUyAoSXJpeAotNSksIGFuZCBIUFBBIEVMRiB0YXJnZXRzLgotCi0qIFRoZSAtKCAoLS1zdGFydC1ncm91cCkgYW5kIC0pICgtLWVuZC1ncm91cCkgb3B0aW9ucyBoYXZlIGJlZW4gYWRkZWQgdG8KLXN1cHBvcnQgc2VhcmNoaW5nIGEgZ3JvdXAgb2YgYXJjaGl2ZXMgYXMgdGhvdWdoIHRoZXkgd2VyZSBhIHNpbmdsZSBhcmNoaXZlLgotVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGluIGEgbGlua2VyIHNjcmlwdCwgYXMgR1JPVVAgKCBmaWxlcyApLgotCi0qIFdoZW4gYSBmaWxlIGlzIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGUgbGlua2VyIGRvZXMgbm90IHJlY29nbml6ZQotaXQgYXMgYW4gb2JqZWN0IGZpbGUsIHRoZSBsaW5rZXIgd2lsbCBub3cgdHJlYXQgdGhlIGZpbGUgYXMgYSBsaW5rZXIgc2NyaXB0Ci1maWxlLiAgQSBsaW5rZXIgc2NyaXB0IG5hbWVkIGluIHRoaXMgd2F5IGF1Z21lbnRzLCBidXQgZG9lcyBub3QgcmVwbGFjZSwgdGhlCi1kZWZhdWx0IGxpbmtlciBzY3JpcHQuCi0KLSogVGhlIC13YXJuLW9uY2Ugb3B0aW9uIHdhcyBhZGRlZC4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvIG9ubHkgd2FybiBvbmNlIHBlcgotdW5kZWZpbmVkIHN5bWJvbCwgcmF0aGVyIHRoYW4gb25jZSBwZXIgcmVmZXJlbmNlLgotCi0qIFRoZSBDT0ZGIGJhY2tlbmQgaGFzIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgbGlua2VyIGNvZGUuICBBcyB3aXRoIEVMRiwgdG8KLXVzZSB0aGUgbmV3IGxpbmtlciwgZWFjaCBwYXJ0aWN1bGFyIHRhcmdldCByZXF1aXJlcyBhIHJlbG9jYXRpb24gZnVuY3Rpb24uICBTbwotZmFyLCB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIHRoZSBpMzg2LCBtNjhrLCBhMjlrIGFuZCBTSCB0YXJnZXRzLgotCi0qIFRoZSAtViBmbGFnIHdhcyBtYWRlIGEgc3lub255bSBmb3IgLXYsIGZvciBTVlI0IGNvbXBhdGliaWxpdHkuICBUaGUgb2xkIC1WCi1iZWhhdmlvdXIgaXMgYXZhaWxhYmxlIHZpYSAtLXZlcmJvc2UuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjQ6Ci0KLSogTmV3IGxpbmtlciBjb2RlLCBieSBTdGV2ZSBDaGFtYmVybGFpbiBhbmQgSWFuIFRheWxvci4gIEZvciBhLm91dCBhbmQgZWNvZmYKLSAgZm9ybWF0cyAoc28gZmFyKSwgdGhpcyBzaG91bGQgcmVzdWx0IGluIGNvbnNpZGVyYWJsZSBzYXZpbmdzIGluIHRpbWUKLSAgYW5kIG1lbW9yeSB1c2VkIHdoaWxlIGxpbmtpbmc7IHNsaWdodGx5IHBvb3JlciBwZXJmb3JtYW5jZSB0aGFuCi0gIGJlZm9yZSBmb3IgZm9ybWF0cyBub3QgY29udmVydGVkIHlldC4KLQotKiBDb21tYW5kLWxpbmUgcGFyc2luZyBpcyBubyBsb25nZXIgZG9uZSB3aXRoIGZsZXguICBUaGlzIG1lYW5zCi0gIG9kZGJhbGwgY2hhcmFjdGVycyBpbiBmaWxlbmFtZXMgd29uJ3QgZ2V0IHRyZWF0ZWQgYXMgYXJndW1lbnQKLSAgc2VwYXJhdG9ycy4KLQotKiBIUC1QQSBFTEYgc3VwcG9ydCwgYnkgSmVmZiBMYXcuICAoTm8gU09NIHN1cHBvcnQgeWV0LikKLQotKiBNYWNoIGkzODYgc3VwcG9ydCwgYnkgRGF2aWQgTWFja2VuemllLgotCi0qIElyaXggNCBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3cgc3VwcG9ydGVkIChJcml4IDUgdXNlcyBFTEYsIGFuZCBFTEYgc2hhcmVkCi0gIGxpYnJhcmllcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQpLgotCi0qIENPRkYgc2hhcmVkIGxpYnJhcmllcyAoYXMgb24gU0NPKSBzaG91bGQgd29yayBhcyB3ZWxsLgotCi0qIFRoZSBsaW5rZXIgaXMgZGlzYWJsZWQgZm9yIFNvbGFyaXMuICAoQWN0dWFsbHksIGl0IHdhcyBpbiAyLjMgYWxzbywgSSBqdXN0Ci0gIGZvcmdvdCB0byBub3RlIGl0LikgIFNvbWUgb2YgdGhlaXIgQyBsaWJyYXJ5IHJvdXRpbmVzIGRvbid0IHdvcmsgd2hlbgotICBzdGF0aWNhbGx5IGxpbmtlZCwgYW5kIHRoZSBHTlUgbGlua2VyIGRvZXNuJ3Qgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgeWV0LgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4zOgotCi0qIFdlYWsgc3ltYm9scyBhcmUgbm93IHN1cHBvcnRlZC4KLQotKiBFTEYgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gIFRoZSBsaW5rZXIgaGFzIGJlZW4gYm9vdHN0cmFwcGVkIG9uCi0gIFVuaXhXYXJlIGFuZCBTb2xhcmlzLgotCi0qIEFscGhhIE9TRi8xIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgKG5vbiBkeW5hbWljIGxpbmtpbmcgb25seSkuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjI6Ci0KLSogVGhlIGBiZmQnIGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCB0byByZWR1Y2UgYS5vdXQtZm9ybWF0IHN0cmluZwotICB0YWJsZSBzaXplLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgZmlsZXMgbGlua2VkIGZyb20gbWFueSBpbnB1dAotICBmaWxlcyB3aXRoIGR1cGxpY2F0ZSBzeW1ib2xzIChgLWcnIGRlYnVnZ2luZyByZWNvcmRzLCBvciBpZGVudGljYWwKLSAgc3RhdGljIHN5bWJvbHMpIHNob3VsZCBiZSBtdWNoIHNtYWxsZXIuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjE6Ci0KLSogVGhlIGxkIC15U1lNQk9MIGZsYWcgKHRvIHRyYWNlIHJlZmVyZW5jZXMgdG8gU1lNQk9MKSBpcyBub3cgaW1wbGVtZW50ZWQuCi0KLSogVGhlcmUgaXMgbm93IHN1cHBvcnQgZm9yIHdyaXRpbmcgRUNPRkYgZmlsZXMsIHNvIGxkIGFuZCB0aGUKLSAgb3RoZXIgdXRpbGl0aWVzIHNob3VsZCB3b3JrIG9uIFJpc2MvVWx0cml4IGFuZCBJcml4LgotCi0MCi1Mb2NhbCB2YXJpYWJsZXM6Ci1maWxsLWNvbHVtbjogNzkKLUVuZDoKZGlmZiAtLWdpdCBhL2xkL1JFQURNRSBiL2xkL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk0N2QwNC4uMDAwMDAwMAotLS0gYS9sZC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1UaGlzIGlzIHRoZSBHTlUgbGlua2VyLiAgSXQgaXMgZGlzdHJpYnV0ZWQgd2l0aCBvdGhlciAiYmluYXJ5Ci11dGlsaXRpZXMiIHdoaWNoIHNob3VsZCBiZSBpbiAuLi9iaW51dGlscy4gIFNlZSAuLi9iaW51dGlscy9SRUFETUUgZm9yCi1tb3JlIGdlbmVyYWwgbm90ZXMsIGluY2x1ZGluZyB3aGVyZSB0byBzZW5kIGJ1ZyByZXBvcnRzLgotCi1UaGVyZSBhcmUgbWFueSBmZWF0dXJlcyBvZiB0aGUgbGlua2VyOgotCi0qIFRoZSBsaW5rZXIgdXNlcyBhIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeSAoLi4vYmZkKQotICB0aGF0IGl0IHVzZXMgdG8gcmVhZCBhbmQgd3JpdGUgb2JqZWN0IGZpbGVzLiAgVGhpcyBoZWxwcwotICBpbnN1bGF0ZSB0aGUgbGlua2VyIGl0c2VsZiBmcm9tIHRoZSBmb3JtYXQgb2Ygb2JqZWN0IGZpbGVzLgotCi0qIFRoZSBsaW5rZXIgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IG9iamVjdCBmaWxlCi0gIGZvcm1hdHMuICBJdCBjYW4gZXZlbiBoYW5kbGUgbXVsdGlwbGUgZm9ybWF0cyBhdCBvbmNlOgotICBSZWFkIHR3byBpbnB1dCBmb3JtYXRzIGFuZCB3cml0ZSBhIHRoaXJkLgotCi0qIFRoZSBsaW5rZXIgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGNyb3NzLWxpbmtpbmcuCi0KLSogVGhlIGxpbmtlciBzdXBwb3J0cyBhIGNvbnRyb2wgbGFuZ3VhZ2UuCi0KLSogVGhlcmUgaXMgYSB1c2VyIG1hbnVhbCAobGQudGV4aW5mbyksIGFzIHdlbGwgYXMgdGhlCi0gIGJlZ2lubmluZ3Mgb2YgYW4gaW50ZXJuYWxzIG1hbnVhbCAobGRpbnQudGV4aW5mbykuCi0KLUluc3RhbGxhdGlvbgotPT09PT09PT09PT09Ci0KLVNlZSAuLi9iaW51dGlscy9SRUFETUUuCi0KLUlmIHlvdSB3YW50IHRvIG1ha2UgYSBjcm9zcy1saW5rZXIsIHlvdSBtYXkgd2FudCB0byBzcGVjaWZ5Ci1hIGRpZmZlcmVudCBzZWFyY2ggcGF0aCBvZiAtbGZvbyBsaWJyYXJpZXMgdGhhbiB0aGUgZGVmYXVsdC4KLVlvdSBjYW4gZG8gdGhpcyBieSBzZXR0aW5nIHRoZSBMSUJfUEFUSCB2YXJpYWJsZSBpbiAuL01ha2VmaWxlLgotCi1UbyBidWlsZCBqdXN0IHRoZSBsaW5rZXIsIG1ha2UgdGhlIHRhcmdldCBhbGwtbGQgZnJvbSB0aGUgdG9wIGxldmVsCi1kaXJlY3RvcnkgKG9uZSBkaXJlY3RvcnkgYWJvdmUgdGhpcyBvbmUpLgotCi1Qb3J0aW5nIHRvIGEgbmV3IHRhcmdldAotPT09PT09PT09PT09PT09PT09PT09PT0KLQotU2VlIHRoZSBsZGludC50ZXhpbmZvIG1hbnVhbC4KLQotUmVwb3J0aW5nIGJ1Z3MgZXRjCi09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotU2VlIC4uL2JpbnV0aWxzL1JFQURNRS4KLQotS25vd24gcHJvYmxlbXMKLT09PT09PT09PT09PT09Ci0KLVRoZSBTb2xhcmlzIGxpbmtlciBub3JtYWxseSBleHBvcnRzIGFsbCBkeW5hbWljIHN5bWJvbHMgZnJvbSBhbgotZXhlY3V0YWJsZS4gIFRoZSBHTlUgbGlua2VyIGRvZXMgbm90IGRvIHRoaXMgYnkgZGVmYXVsdC4gIFRoaXMgaXMKLWJlY2F1c2UgdGhlIEdOVSBsaW5rZXIgdHJpZXMgdG8gcHJlc2VudCB0aGUgc2FtZSBpbnRlcmZhY2UgZm9yIGFsbAotc2ltaWxhciB0YXJnZXRzIChpbiB0aGlzIGNhc2UsIGFsbCBuYXRpdmUgRUxGIHRhcmdldHMpLiAgVGhpcyBkb2VzIG5vdAotbWF0dGVyIGZvciBub3JtYWwgcHJvZ3JhbXMsIGJ1dCBpdCBjYW4gbWFrZSBhIGRpZmZlcmVuY2UgZm9yIHByb2dyYW1zCi13aGljaCB0cnkgdG8gZGxvcGVuIGFuIGV4ZWN1dGFibGUsIHN1Y2ggYXMgUEVSTCBvciBUY2wuICBZb3UgY2FuIG1ha2UKLXRoZSBHTlUgbGlua2VyIGV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzIHdpdGggdGhlIC1FIG9yCi0tLWV4cG9ydC1keW5hbWljIGNvbW1hbmQgbGluZSBvcHRpb24uCi0KLUhQL1VYIDkuMDEgaGFzIGEgc2hlbGwgYnVnIHRoYXQgY2F1c2VzIHRoZSBsaW5rZXIgc2NyaXB0cyB0byBiZQotZ2VuZXJhdGVkIGluY29ycmVjdGx5LiAgVGhlIHN5bXB0b20gb2YgdGhpcyBhcHBlYXJzIHRvIGJlICJmYXRhbCBlcnJvcgotLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdyIgZXJyb3IgbWVzc2FnZXMuICBUaGVyZSBhcmUgdmFyaW91cwotd29ya2Fyb3VuZHMgdG8gdGhpczoKLSAgKiBCdWlsZCBhbmQgaW5zdGFsbCBiYXNoLCBhbmQgYnVpbGQgd2l0aCAibWFrZSBTSEVMTD1iYXNoIi4KLSAgKiBVcGRhdGUgdG8gYSB2ZXJzaW9uIG9mIEhQL1VYIHdpdGggYSB3b3JraW5nIHNoZWxsIChlLmcuLCA5LjA1KS4KLSAgKiBSZXBsYWNlICIoLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIiBpbgotICAgIGdlbnNjcmlwdHMuc2ggd2l0aCAic2ggJHtzcmNkaXJ9Li4uIiAobm8gcGFyZW5zKSBhbmQgbWFrZSBzdXJlIHRoZQotICAgIGVtdWxwYXJhbXMgc2NyaXB0IHVzZWQgZXhwb3J0cyBhbnkgc2hlbGwgdmFyaWFibGVzIGl0IHNldHMuCmRpZmYgLS1naXQgYS9sZC9UT0RPIGIvbGQvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjZDk4Yi4uMDAwMDAwMAotLS0gYS9sZC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1Wb2x1bnRlZXJzIHRvIHRhY2tsZSBzb21lIG9mIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgd2VsY29tZToKLQotU3VwcG9ydCB0aGUgInRyYWRpdGlvbmFsIiBCU0QgIC1BIGZsYWcgKGluY3JlbWVudGFsIGxvYWRpbmcpLgotKFRoZXJlIGlzIGEgLUEgZmxhZyBpbiBsZCBub3csIGJ1dCBpdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi1hcmNoaXRlY3R1cmUuICBUaGF0IHNob3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkLikKLQotU3VwcG9ydCBmb3IgZHluYW1pYyBsb2FkaW5nIChhIGxhIGRsZCwgYnV0IGJmZC1iYXNlZCkgd291bGQgYmUgbmljZS4KLQotQXZvaWQgcmUtb3BlbiAoYW5kIHJlLXNlZWtpbmcpIG91dHB1dCBiZmQgYW5kIGFyY2hpdmVzLgpkaWZmIC0tZ2l0IGEvbGQvYWNpbmNsdWRlLm00IGIvbGQvYWNpbmNsdWRlLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIwOWI5Li4wMDAwMDAwCi0tLSBhL2xkL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCmRpZmYgLS1naXQgYS9sZC9hY2xvY2FsLm00IGIvbGQvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlYmZhMC4uMDAwMDAwMAotLS0gYS9sZC9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsOTI1ICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDQwIEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTERGTEFHUz0iJExERkxBR1MiIExJQlM9IiRMSUJTIiBcCi1MTl9TPSIkTE5fUyIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgT0JKRFVNUD0iJE9CSkRVTVAiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkbHRfdGFyZ2V0IFwKLXx8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotQUNfQ0FDSEVfTE9BRAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotXSkKLQotQUNfREVGVU4oQUNfTElCVE9PTF9TRVRVUCwKLVtBQ19QUkVSRVEoMi4xMylkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLWNhc2UgIiR0YXJnZXQiIGluCi1OT05FKSBsdF90YXJnZXQ9IiRob3N0IiA7OwotKikgbHRfdGFyZ2V0PSIkdGFyZ2V0IiA7OwotZXNhYwotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotaWZkZWYoW0FDX1BST1ZJREVfQUNfTElCVE9PTF9ETE9QRU5dLAotW2xpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiJdKQotaWZkZWYoW0FDX1BST1ZJREVfQUNfTElCVE9PTF9XSU4zMl9ETExdLAotW2xpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLXdpbjMyLWRsbCJdKQotQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCi0gIFsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKQotdGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiA9IHhubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLXRlc3QgeCIkc2lsZW50IiA9IHh5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkbHRfdGFyZ2V0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotaWZkZWYoW0FDX1BST1ZJREVfQUNfTElCVE9PTF9XSU4zMl9ETExdLAotWyotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KikKLSAgQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLSAgQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotICBBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQotICA7OwotXSkKLWVzYWMKLV0pCi0KLSMgQUNfTElCVE9PTF9ETE9QRU4gLSBlbmFibGUgY2hlY2tzIGZvciBkbG9wZW4gc3VwcG9ydAotQUNfREVGVU4oQUNfTElCVE9PTF9ETE9QRU4sIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pXSkKLQotIyBBQ19MSUJUT09MX1dJTjMyX0RMTCAtIGRlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncwotQUNfREVGVU4oQUNfTElCVE9PTF9XSU4zMl9ETEwsIFtBQ19CRUZPUkUoWyQwXSwgW0FDX0xJQlRPT0xfU0VUVVBdKV0pCi0KLSMgQUNfRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NIQVJFRCwgW2RubAotZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQUNfRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NUQVRJQywgW2RubAotZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfU1RBVElDKG5vKV0pCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfRkFTVF9JTlNUQUxMLCBbZG5sCi1kZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCi0KLSMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oQUNfUFJPR19MRCwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCi0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKLWZpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKLVtpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1ItOn0iCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpXSkKLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTEQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotdGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKLUFDX1BST0dfTERfR05VCi1dKQotCi1BQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLV0pCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oQUNfUFJPR19OTSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1ItOn0iCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm0gfHwgdGVzdCAtZiAkYWNfZGlyL25tJGFjX2V4ZWV4dCA7IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLUFDX01TR19SRVNVTFQoWyROTV0pCi1dKQotCi0jIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5Ci1BQ19ERUZVTihBQ19DSEVDS19MSUJNLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUxJQk09Ci1jYXNlICIkbHRfdGFyZ2V0IiBpbgotKi0qLWJlb3MqIHwgKi0qLWN5Z3dpbiopCi0gICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibQotICA7OwotKi1uY3Itc3lzdjQuMyopCi0gIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQotICBBQ19DSEVDS19MSUIobSwgbWFpbiwgTElCTT0iJExJQk0gLWxtIikKLSAgOzsKLSopCi0gIEFDX0NIRUNLX0xJQihtLCBtYWluLCBMSUJNPSItbG0iKQotICA7OwotZXNhYwotXSkKLQotIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSwgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi1BQ19ERUZVTihBQ19MSUJMVERMX0NPTlZFTklFTkNFLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotICBjYXNlICIkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UiIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGxjLmxhCi0gIElOQ0xUREw9aWZlbHNlKCQjLDEsLUkkMSxbJy1JJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkKLV0pCi0KLSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnksIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCi1BQ19ERUZVTihBQ19MSUJMVERMX0lOU1RBTExBQkxFLCBbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwKLSAgW3Rlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geHllcyAmJiBlbmFibGVfbHRkbF9pbnN0YWxsPW5vXSwKLSAgW2lmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4bm87IHRoZW4KLSAgICAgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pCi0gICBlbHNlCi0gICAgIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICBmaQotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geCJ5ZXMiOyB0aGVuCi0gICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiCi0gICAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGwubGEKLSAgICBJTkNMVERMPWlmZWxzZSgkIywxLC1JJDEsWyctSSR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pCi0gIGVsc2UKLSAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbD1ubyIKLSAgICBMSUJMVERMPSItbGx0ZGwiCi0gICAgSU5DTFRETD0KLSAgZmkKLV0pCi0KLWRubCBvbGQgbmFtZXMKLUFDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwgW2luZGlyKFtBQ19QUk9HX0xJQlRPT0xdKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0VOQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywgW2luZGlyKFtBQ19FTkFCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0RJU0FCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0RJU0FCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTEQsIFtpbmRpcihbQUNfUFJPR19MRF0pXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTk0sIFtpbmRpcihbQUNfUFJPR19OTV0pXSlkbmwKLQotZG5sIFRoaXMgaXMganVzdCB0byBzaWxlbmNlIGFjbG9jYWwgYWJvdXQgdGhlIG1hY3JvIG5vdCBiZWluZyB1c2VkCi1pZmVsc2UoW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotCi1kbmwgQU1fUFJPR19MRVgKLWRubCBMb29rIGZvciBmbGV4LCBsZXggb3IgbWlzc2luZywgdGhlbiBydW4gQUNfUFJPR19MRVggYW5kIEFDX0RFQ0xfWVlURVhUCi1BQ19ERUZVTihBTV9QUk9HX0xFWCwKLVttaXNzaW5nX2Rpcj1pZmVsc2UoWyQxXSwsYGNkICRhY19hdXhfZGlyICYmIHB3ZGAsJDEpCi1BQ19DSEVDS19QUk9HUyhMRVgsIGZsZXggbGV4LCAiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIpCi1BQ19QUk9HX0xFWAotQUNfREVDTF9ZWVRFWFRdKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCmRpZmYgLS1naXQgYS9sZC9jb25maWcuaW4gYi9sZC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMTdiZGMuLjAwMDAwMDAKLS0tIGEvbGQvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0JSSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0RJUkVOVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCi0jdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgotCi0vKiBEZWZpbmUgaWYgc3Ryc3RyIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBEZWZpbmUgaWYgc2JyayBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogRGVmaW5lIGlmIGdldGVudiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotCi0vKiBEZWZpbmUgaWYgZW52aXJvbiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLQotLyogQWRkaXRpb25hbCBleHRlbnNpb24gYSBzaGFyZWQgb2JqZWN0IG1pZ2h0IGhhdmUuICovCi0jdW5kZWYgRVhUUkFfU0hMSUJfRVhURU5TSU9OCi0KZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZSBiL2xkL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzA3YWRkMS4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMuMSAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcykiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMuMSIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1sZG1haW4uYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgICB0ZXN0IC1mICIkY2FjaGVfZmlsZSIgJiYgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiCi1hY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIKLWFjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2ODogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hvc3QiID0gIngiIHx8ICh0ZXN0ICJ4JGhvc3QiICE9ICJ4Tk9ORSIgJiYgdGVzdCAieCRob3N0IiAhPSAieCRhY19jdl9ob3N0X2FsaWFzIik7IHRoZW4KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLQotICBhY19jdl9ob3N0X2FsaWFzPSRob3N0Ci0gIGNhc2UgIiRhY19jdl9ob3N0X2FsaWFzIiBpbgotICBOT05FKQotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgIE5PTkUpCi0gICAgICBpZiBhY19jdl9ob3N0X2FsaWFzPWAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgIGZpIDs7Ci0gICAgKikgYWNfY3ZfaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgCi0gIGFjX2N2X2hvc3RfY3B1PWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLSAgYWNfY3ZfaG9zdF92ZW5kb3I9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl9ob3N0X29zPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVsc2UKLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaG9zdCIgMT4mNgotCi1ob3N0PSRhY19jdl9ob3N0Ci1ob3N0X2FsaWFzPSRhY19jdl9ob3N0X2FsaWFzCi1ob3N0X2NwdT0kYWNfY3ZfaG9zdF9jcHUKLWhvc3RfdmVuZG9yPSRhY19jdl9ob3N0X3ZlbmRvcgotaG9zdF9vcz0kYWNfY3ZfaG9zdF9vcwotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA5OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotaWYgdGVzdCAieCRhY19jdl90YXJnZXQiID0gIngiIHx8ICh0ZXN0ICJ4JHRhcmdldCIgIT0gInhOT05FIiAmJiB0ZXN0ICJ4JHRhcmdldCIgIT0gIngkYWNfY3ZfdGFyZ2V0X2FsaWFzIik7IHRoZW4KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLQotICBhY19jdl90YXJnZXRfYWxpYXM9JHRhcmdldAotICBjYXNlICIkYWNfY3ZfdGFyZ2V0X2FsaWFzIiBpbgotICBOT05FKQotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgIE5PTkUpCi0gICAgICBhY19jdl90YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLQotICAgICopIGFjX2N2X3RhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfdGFyZ2V0PWAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzYAotICBhY19jdl90YXJnZXRfY3B1PWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotICBhY19jdl90YXJnZXRfdmVuZG9yPWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl90YXJnZXRfb3M9YGVjaG8gJGFjX2N2X3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lbHNlCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3RhcmdldCIgMT4mNgotCi10YXJnZXQ9JGFjX2N2X3RhcmdldAotdGFyZ2V0X2FsaWFzPSRhY19jdl90YXJnZXRfYWxpYXMKLXRhcmdldF9jcHU9JGFjX2N2X3RhcmdldF9jcHUKLXRhcmdldF92ZW5kb3I9JGFjX2N2X3RhcmdldF92ZW5kb3IKLXRhcmdldF9vcz0kYWNfY3ZfdGFyZ2V0X29zCi0KLQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0OTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotaWYgdGVzdCAieCRhY19jdl9idWlsZCIgPSAieCIgfHwgKHRlc3QgIngkYnVpbGQiICE9ICJ4Tk9ORSIgJiYgdGVzdCAieCRidWlsZCIgIT0gIngkYWNfY3ZfYnVpbGRfYWxpYXMiKTsgdGhlbgotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0gIGlmICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotCi0gIGFjX2N2X2J1aWxkX2FsaWFzPSRidWlsZAotICBjYXNlICIkYWNfY3ZfYnVpbGRfYWxpYXMiIGluCi0gIE5PTkUpCi0gICAgY2FzZSAkbm9ub3B0IGluCi0gICAgTk9ORSkKLSAgICAgIGFjX2N2X2J1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0KLSAgICAqKSBhY19jdl9idWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfYnVpbGQ9YCRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhc2AKLSAgYWNfY3ZfYnVpbGRfY3B1PWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0gIGFjX2N2X2J1aWxkX3ZlbmRvcj1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl9idWlsZF9vcz1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWxzZQotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9idWlsZCIgMT4mNgotCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWJ1aWxkX2FsaWFzPSRhY19jdl9idWlsZF9hbGlhcwotYnVpbGRfY3B1PSRhY19jdl9idWlsZF9jcHUKLWJ1aWxkX3ZlbmRvcj0kYWNfY3ZfYnVpbGRfdmVuZG9yCi1idWlsZF9vcz0kYWNfY3ZfYnVpbGRfb3MKLQotCi0KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MjY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIHB3cGx1cyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4MzogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODQwOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1sZAotCi1WRVJTSU9OPTIuOS41Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODg2OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg5OTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MTI6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MjU6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTM4OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX1JBTkxJQitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA1NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKiB8ICpDWUdXSU4qKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEzNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNjc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxMTc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE4MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIwOTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjE0OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19nY2Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjIzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDI6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19jY19nK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjg1OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzA5OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMTI6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLWZpCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9MRCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDc6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX2dudV9sZCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNjM6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9OTStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubSB8fCB0ZXN0IC1mICRhY19kaXIvbm0kYWNfZXhlZXh0IDsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM5OTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19MTl9TK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3RkYXRhCi1pZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAotdGhlbgotICBybSAtZiBjb25mdGVzdGRhdGEKLSAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi1maQotZmkKLUxOX1M9IiRhY19jdl9wcm9nX0xOX1MiCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotY2FzZSAiJHRhcmdldCIgaW4KLU5PTkUpIGx0X3RhcmdldD0iJGhvc3QiIDs7Ci0qKSBsdF90YXJnZXQ9IiR0YXJnZXQiIDs7Ci1lc2FjCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICA6Ci1maQotCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siID0geG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotdGVzdCB4IiRzaWxlbnQiID0geHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDE0NDggImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ3MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7bHRfY3ZfY2NfbmVlZHNfYmVsZitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0NzUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0ODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0KLWVzYWMKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTERGTEFHUz0iJExERkxBR1MiIExJQlM9IiRMSUJTIiBcCi1MTl9TPSIkTE5fUyIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgT0JKRFVNUD0iJE9CSkRVTVAiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkbHRfdGFyZ2V0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgICB0ZXN0IC1mICIkY2FjaGVfZmlsZSIgJiYgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTY0LWJpdC1iZmQgb3IgLS1kaXNhYmxlLTY0LWJpdC1iZmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfNjRfYml0X2JmZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfNjRfYml0X2JmZCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50NjQ9ZmFsc2UKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DQytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DQytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiogfCAqQ1lHV0lOKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DQytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzM1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTc0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3NTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3Nzc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4MjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfZ2NjK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc5MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODEwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfY2NfZytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NTM6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIHB3cGx1cyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MTI6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NQUCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTkyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkzMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk1MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk2MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk2NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk5MjogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAxMzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl9zdGRjK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAyNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDQzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMTc6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9jX2NvbnN0K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTcxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxOTI6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2NfaW5saW5lK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgaW50IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjA2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIzMjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl90eXBlX29mZl90K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X3R5cGVfb2ZmX3Q9eWVzIgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X3R5cGVfb2ZmX3Q9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl90eXBlXydvZmZfdGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNjc6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3R5cGVfc2l6ZV90K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl90eXBlX3NpemVfdD15ZXMiCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfdHlwZV9zaXplX3Q9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl90eXBlXydzaXplX3RgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMDQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfYWxsb2NhX2grc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzM3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jX2FsbG9jYV93b3JrcytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MDI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X29zX2NyYXkrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDA3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQzMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jXyRhY19mdW5jK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci1jaGFyICgqZikoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLWYgPSAkYWNfZnVuYzsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDg4OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9jX3N0YWNrX2RpcmVjdGlvbitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NDA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfJGFjX3NhZmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTUwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1Nzk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY18kYWNfZnVuYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1ODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotY2hhciAoKmYpKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi1mID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MzM6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3ODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODA5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyXyRhY19zYWZlK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjgxNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4NDk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY18kYWNfZnVuYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotY2hhciAoKmYpKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi1mID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4Nzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MDc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY18kYWNfZnVuYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5MTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotY2hhciAoKmYpKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi1mID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk3MDogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthbV9jdl92YWxfTENfTUVTU0FHRVMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTc1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk4MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMDM6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAyMzogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDQyOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfJGFjX3NhZmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwNTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY5OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHtndF9jdl9mdW5jX2dldHRleHRfbGliYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA5NzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystOiVfX3BfXyUnYAotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2xpYl8kYWNfbGliX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMzI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTcyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfTVNHRk1UK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjA2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjYyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfR01TR0ZNVCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI5ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX1hHRVRURVhUK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM3MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX01TR0ZNVCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9HTVNHRk1UK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDQwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfWEdFVFRFWFQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTMwOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTU4OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfJGFjX3NhZmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTYzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM1Njg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjMxOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9jeWd3aW4rc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjM2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjQ3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY2MzogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X21pbmd3MzIrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjY4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY3NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEVNWCBPUy8yIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjkxOiBjaGVja2luZyBmb3IgRU1YIE9TLzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2VteG9zMitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2OTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX0VNWF9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MDM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9lbXhvczI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2VteG9zMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9lbXhvczIiIDE+JjYKLUVNWE9TMj0KLXRlc3QgIiRhY19jdl9lbXhvczIiID0geWVzICYmIEVNWE9TMj15ZXMKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzcyMjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9leGVleHQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXMgfHwgdGVzdCAiJEVNWE9TMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzczMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLkMgfCAqLm8gfCAqLm9iaiB8ICoueGNvZmYpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotZm9yIGFjX3Byb2cgaW4gJ2Jpc29uIC15JyBieWFjYwotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19ZQUNDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1lBQ0M9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ZQUNDPSIkYWNfY3ZfcHJvZ19ZQUNDIgotaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWUFDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRZQUNDIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJFlBQ0MiIHx8IFlBQ0M9InlhY2MiCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1mb3IgYWNfcHJvZyBpbiBmbGV4IGxleAotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3OTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19MRVgrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRMRVgiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkTEVYIiB8fCBMRVg9IiIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IiIKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4Mjc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19MRVgrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSJmbGV4IgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19MRVgiICYmIGFjX2N2X3Byb2dfTEVYPSJsZXgiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkTEVYTElCIgotdGhlbgotICBjYXNlICIkTEVYIiBpbgotICBmbGV4KikgYWNfbGliPWZsIDs7Ci0gICopIGFjX2xpYj1sIDs7Ci0gIGVzYWMKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NjE6IGNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHNlZCAneSUuLystOiVfX3BfXyUnYAotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2xpYl8kYWNfbGliX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbCRhY19saWIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg2OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHl5d3JhcCgpOwotCi1pbnQgbWFpbigpIHsKLXl5d3JhcCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzg4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTEVYTElCPSItbCRhY19saWIiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MDM6IGNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX2xleF9yb290K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGUgbWluaW1hbCBsZXggcHJvZ3JhbSBpcyBqdXN0IGEgc2luZ2xlIGxpbmU6ICUlLiAgQnV0IHNvbWUgYnJva2VuIGxleGVzCi0jIChTb2xhcmlzLCBJIHRoaW5rIGl0IHdhcykgd2FudCB0d28gJSUgbGluZXMsIHNvIGFjY29tbW9kYXRlIHRoZW0uCi1lY2hvICclJQotJSUnIHwgJExFWAotaWYgdGVzdCAtZiBsZXgueXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleC55eQotZWxpZiB0ZXN0IC1mIGxleHl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXh5eQotZWxzZQotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF9yb290IiAxPiY2Ci1MRVhfT1VUUFVUX1JPT1Q9JGFjX2N2X3Byb2dfbGV4X3Jvb3QKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTI0OiBjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBQT1NJWCBzYXlzIGxleCBjYW4gZGVjbGFyZSB5eXRleHQgZWl0aGVyIGFzIGEgcG9pbnRlciBvciBhbiBhcnJheTsgdGhlCi0jIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBGaWd1cmUgb3V0IHdoaWNoIGl0IGlzLCBzaW5jZQotIyBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSAlcG9pbnRlciBhbmQgJWFycmF5IGRlY2xhcmF0aW9ucy4KLWFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPW5vCi1lY2hvICdleHRlcm4gY2hhciAqeXl0ZXh0OycgPj4kTEVYX09VVFBVVF9ST09ULmMKLWFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSIkTElCUyAkTEVYTElCIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzkzNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1gY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2AKLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLXJtIC1mICIke0xFWF9PVVRQVVRfUk9PVH0uYyIKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFlZVEVYVF9QT0lOVEVSIDEKLUVPRgotCi1maQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTY2OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi0KLQotCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDAwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyXyRhY19zYWZlK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDAwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDAxMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIHNicmsKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMzk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY18kYWNfZnVuYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwNDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotY2hhciAoKmYpKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi1mID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwNjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWFjX2hlYWRlcl9kaXJlbnQ9bm8KLWZvciBhY19oZHIgaW4gZGlyZW50Lmggc3lzL25kaXIuaCBzeXMvZGlyLmggbmRpci5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDk3OiBjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDEwMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8JGFjX2hkcj4KLWludCBtYWluKCkgewotRElSICpkaXJwID0gMDsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyX2RpcmVudF8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gYWNfaGVhZGVyX2RpcmVudD0kYWNfaGRyOyBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0jIFR3byB2ZXJzaW9ucyBvZiBvcGVuZGlyIGV0IGFsLiBhcmUgaW4gLWxkaXIgYW5kIC1seCBvbiBTQ08gWGVuaXguCi1pZiB0ZXN0ICRhY19oZWFkZXJfZGlyZW50ID0gZGlyZW50Lmg7IHRoZW4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTM1OiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRpcidfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLTolX19wX18lJ2AKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9saWJfJGFjX2xpYl92YXIrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkaXIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDE0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbGRpciIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNzY6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHgnXydvcGVuZGlyIHwgc2VkICd5JS4vKy06JV9fcF9fJSdgCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfbGliXyRhY19saWJfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1seCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTg0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxOTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1seCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi0KLQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKikKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9CSU5BUllfRk9QRU4gMQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIyODogY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0citzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyMzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3Ryc3RyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI1NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Mjc1OiBjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZyZWUKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzAxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMyMjogY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2JmZF9jdl9kZWNsX25lZWRlZF9zYnJrK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDMyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzYnJrCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc2JyayIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU0JSSyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM2OTogY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2RlY2xfbmVlZGVkX2dldGVuditzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzNzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZ2V0ZW52Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM5NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZW52aXJvbiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDE2OiBjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24rc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGVudmlyb24KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDQyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OIDEKLUVPRgotCi1maQotCi0KLSMgV2hlbiBjb252ZXJ0aW5nIGxpbmtlciBzY3JpcHRzIGludG8gc3RyaW5ncyBmb3IgdXNlIGluIGVtdWxhdGlvbgotIyBmaWxlcywgdXNlIGFzdHJpbmcuc2VkIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBBTlNJIHN0cmluZwotIyBjb25jYXRlbmF0aW9uLCBvciBvc3RyaW5nLnNlZCBvdGhlcndpc2UuICBUaGlzIGlzIHRvIHN1cHBvcnQgdGhlCi0jIGJyb2tlbiBNaWNyb3NvZnQgTVNWQyBjb21waWxlciwgd2hpY2ggbGltaXRzIHRoZSBsZW5ndGggb2Ygc3RyaW5nCi0jIGNvbnN0YW50cywgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBwcmUtQU5TSSBjb21waWxlcnMgd2hpY2ggZG8gbm90Ci0jIHN1cHBvcnQgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIEFOU0kgQyBzdHJpbmcgY29uY2F0ZW5hdGlvbiB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQ3MDogY2hlY2tpbmcgd2hldGhlciBBTlNJIEMgc3RyaW5nIGNvbmNhdGVuYXRpb24gd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2xkX2N2X3N0cmluZ19jb25jYXRlbmF0aW9uK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ3NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotY2hhciAqYSA9ICJhIiAiYSI7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ4MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGxkX2N2X3N0cmluZ19jb25jYXRlbmF0aW9uPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbiIgMT4mNgotaWYgdGVzdCAiJGxkX2N2X3N0cmluZ19jb25jYXRlbmF0aW9uIiA9ICJ5ZXMiOyB0aGVuCi0gIFNUUklOR0lGWT1hc3RyaW5nLnNlZAotZWxzZQotICBTVFJJTkdJRlk9b3N0cmluZy5zZWQKLWZpCi0KLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLWFsbF90YXJnZXRzPQotRU1VTD0KLWFsbF9lbXVscz0KLWFsbF9lbXVsX2V4dHJhcz0KLWFsbF9saWJwYXRoPQotCi1ybSAtZiB0ZGlycwotCi1mb3IgdGFyZ19hbGlhcyBpbiBgZWNobyAkdGFyZ2V0X2FsaWFzICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi1kbwotICBpZiB0ZXN0ICIkdGFyZ19hbGlhcyIgPSAiYWxsIjsgdGhlbgotICAgIGFsbF90YXJnZXRzPXRydWUKLSAgZWxzZQotICAgICMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotICAgIHJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmdfYWxpYXMgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQl0YXJnPSRyZXN1bHQKLSAgICBlbHNlCi0JdGFyZz0kdGFyZ19hbGlhcwotICAgIGZpCi0KLSAgICAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0Ci0KLSAgICBpZiB0ZXN0ICIkdGFyZyIgPSAiJHRhcmdldCI7IHRoZW4KLSAgICAgIEVNVUw9JHRhcmdfZW11bAotICAgIGZpCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2VtdWxzICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfZW11bHMgIiBpbgotCSoiIGUke2l9Lm8gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVscz0iJGFsbF9lbXVscyBlJHtpfS5vIgotCSAgZXZhbCByZXN1bHQ9XCR0ZGlyXyRpCi0JICB0ZXN0IC16ICIkcmVzdWx0IiAmJiByZXN1bHQ9JHRhcmdfYWxpYXMKLQkgIGVjaG8gdGRpcl8kaT0kcmVzdWx0ID4+IHRkaXJzCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfbGlicGF0aCAiIGluCi0JKiIgJHtpfSAiKikgOzsKLQkqKQotCSAgaWYgdGVzdCAteiAiJGFsbF9saWJwYXRoIjsgdGhlbgotCSAgICBhbGxfbGlicGF0aD0ke2l9Ci0JICBlbHNlCi0JICAgIGFsbF9saWJwYXRoPSIkYWxsX2xpYnBhdGggJHtpfSIKLQkgIGZpCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19leHRyYV9vZmlsZXM7IGRvCi0JY2FzZSAiICRhbGxfZW11bF9leHRyYXMgIiBpbgotCSoiICR7aX0gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVsX2V4dHJhcz0iJGFsbF9lbXVsX2V4dHJhcyAke2l9IgotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotICBmaQotZG9uZQotCi0KLQotVERJUlM9dGRpcnMKLQotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlOyB0aGVuCi0gIGlmIHRlc3QgeCR7d2FudDY0fSA9IHh0cnVlOyB0aGVuCi0gICAgRU1VTEFUSU9OX09GSUxFUz0nJChBTExfRU1VTEFUSU9OUykgJChBTExfNjRfRU1VTEFUSU9OUyknCi0gIGVsc2UKLSAgICBFTVVMQVRJT05fT0ZJTEVTPSckKEFMTF9FTVVMQVRJT05TKScKLSAgZmkKLSAgRU1VTF9FWFRSQV9PRklMRVM9JyQoQUxMX0VNVUxfRVhUUkFfT0ZJTEVTKScKLWVsc2UKLSAgRU1VTEFUSU9OX09GSUxFUz0kYWxsX2VtdWxzCi0gIEVNVUxfRVhUUkFfT0ZJTEVTPSRhbGxfZW11bF9leHRyYXMKLWZpCi0KLQotCi1FTVVMQVRJT05fTElCUEFUSD0kYWxsX2xpYnBhdGgKLQotCi1pZiB0ZXN0IHgke2VuYWJsZV9zdGF0aWN9ID0geG5vOyB0aGVuCi0gIFRFU1RCRkRMSUI9Ii0tcnBhdGggLi4vYmZkLy5saWJzIC4uL2JmZC8ubGlicy9saWJiZmQuc28iCi1lbHNlCi0gIFRFU1RCRkRMSUI9Ii4uL2JmZC8ubGlicy9saWJiZmQuYSIKLWZpCi0KLQotdGFyZ2V0X3ZlbmRvcj0ke3RhcmdldF92ZW5kb3I9JGhvc3RfdmVuZG9yfQotY2FzZSAiJHRhcmdldF92ZW5kb3IiIGluCi0gIGhwKSBFWFRSQV9TSExJQl9FWFRFTlNJT049Ii5zbCIgOzsKLSAgKikgIEVYVFJBX1NITElCX0VYVEVOU0lPTj0gOzsKLWVzYWMKLWlmIHRlc3QgeCR7RVhUUkFfU0hMSUJfRVhURU5TSU9OfSAhPSB4IDsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBFWFRSQV9TSExJQl9FWFRFTlNJT04gIiRFWFRSQV9TSExJQl9FWFRFTlNJT04iCi1FT0YKLQotZmkKLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMy4xIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDQ0AlJENDJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAWUFDQ0AlJFlBQ0MlZwotcyVATEVYQCUkTEVYJWcKLXMlQExFWExJQkAlJExFWExJQiVnCi1zJUBMRVhfT1VUUFVUX1JPT1RAJSRMRVhfT1VUUFVUX1JPT1QlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEhPU1RJTkdfQ1JUMEAlJEhPU1RJTkdfQ1JUMCVnCi1zJUBIT1NUSU5HX0xJQlNAJSRIT1NUSU5HX0xJQlMlZwotcyVATkFUSVZFX0xJQl9ESVJTQCUkTkFUSVZFX0xJQl9ESVJTJWcKLXMlQFNUUklOR0lGWUAlJFNUUklOR0lGWSVnCi1zJUBFTVVMQCUkRU1VTCVnCi0vQFRESVJTQC9yICRURElSUwotcyVAVERJUlNAJSVnCi1zJUBFTVVMQVRJT05fT0ZJTEVTQCUkRU1VTEFUSU9OX09GSUxFUyVnCi1zJUBFTVVMX0VYVFJBX09GSUxFU0AlJEVNVUxfRVhUUkFfT0ZJTEVTJWcKLXMlQEVNVUxBVElPTl9MSUJQQVRIQCUkRU1VTEFUSU9OX0xJQlBBVEglZwotcyVAVEVTVEJGRExJQkAlJFRFU1RCRkRMSUIlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICRTSEVMTCAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvbGQvY29uZmlndXJlLmhvc3QgYi9sZC9jb25maWd1cmUuaG9zdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhZDM0Ny4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUuaG9zdAorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0jIFRoaXMgaXMgdGhlIGxpbmtlciBob3N0IHNwZWNpZmljIGZpbGUuICBUaGlzIGlzIGludm9rZWQgYnkgdGhlCi0jIGF1dG9jb25mIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LiAgUHV0dGluZyBpdCBpbiBhIHNlcGFyYXRlIHNoZWxsCi0jIGZpbGUgbGV0cyB1cyBza2lwIHJ1bm5pbmcgYXV0b2NvbmYgd2hlbiBtb2RpZnlpbmcgaG9zdCBzcGVjaWZpYwotIyBpbmZvcm1hdGlvbi4KLQotIyBUaGlzIGZpbGUgc2V0cyB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKLSMgIEhERUZJTkVTCQlob3N0IHNwZWNpZmljIGNvbXBpbGVyIGZsYWdzCi0jICBIT1NUSU5HX0NSVDAJCWNydDAubyBmaWxlIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcKLSMgIEhPU1RJTkdfTElCUwkJbGlicmFyaWVzIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcKLSMgIE5BVElWRV9MSUJfRElSUwlsaWJyYXJ5IGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBvbiB0aGlzIGhvc3QKLQotSERFRklORVM9Ci1IT1NUSU5HX0NSVDA9L2xpYi9jcnQwLm8KLUhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYycKLU5BVElWRV9MSUJfRElSUz0KLQotY2FzZSAiJHtob3N0fSIgaW4KLQotYWxwaGEqLSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgYGVncmVwICJsZFteIF0qXC5zbyIgXGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1zcGVjc1xgIHwgc2VkIC1lICJzLC4qLWR5bmFtaWMtbGlua2VyWyAJXVsgCV0qXCguKi9sZFteIF0qLnNvLi5cKS4qLFwxLCJgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnQxLm9gIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRpLm9gIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1MYGRpcm5hbWUgXGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1saWJjLnNvXGBgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0bi5vYCcKLSAgOzsKLQotYWxwaGEqLSotbmV0YnNkKikKLSAgIyBUaGUgbmV3IEJTRCBgbWFrZScgaGFzIGEgYnVnOiBpdCBkb2Vzbid0IHBhc3MgZW1wdHkgYXJndW1lbnRzIGluCi0gICMgc2hlbGwgY29tbWFuZHMuICBTbyB3ZSBuZWVkIHRvIG1ha2UgdGhpcyB2YWx1ZSBub24tZW1wdHkgaW4gb3JkZXIKLSAgIyBmb3IgdGhlIGdlbnNjcmlwdHMuc2ggY2FsbCB0byB3b3JrLiAgVGhlcmUncyBub3RoaW5nIG1hZ2ljIGFib3V0Ci0gICMgdGhlIHZhbHVlIGAvbGliJzsgaXQncyBqdXN0IGEgZHVtbXkuCi0gIE5BVElWRV9MSUJfRElSUz0vbGliCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotYWxwaGEqLSotKikKLSAgSE9TVElOR19DUlQwPS91c3IvY2NzL2xpYi9jcnQwLm8KLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1hcm0qLSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctcCAtZHluYW1pYy1saW5rZXIgYGZncmVwIGxkLWxpbnV4LnNvIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9c3BlY3NcYCB8IHNlZCAtZSAicywuKi1keW5hbWljLWxpbmtlclsgCV1bIAldKlwoLiovbGQtbGludXguc28uLlwpLiosXDEsImAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGkub2AgYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWxpYmMuc29cYGAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRuLm9gJwotICA7OwotCi1pWzM0NTZdODYtKi1mcmVlYnNkZWxmKikKLSAgIyBUaGUgbmV3IEJTRCBgbWFrZScgaGFzIGEgYnVnOiBpdCBkb2Vzbid0IHBhc3MgZW1wdHkgYXJndW1lbnRzIGluCi0gICMgc2hlbGwgY29tbWFuZHMuICBTbyB3ZSBuZWVkIHRvIG1ha2UgdGhpcyB2YWx1ZSBub24tZW1wdHkgaW4gb3JkZXIKLSAgIyBmb3IgdGhlIGdlbnNjcmlwdHMuc2ggY2FsbCB0byB3b3JrLiAgVGhlcmUncyBub3RoaW5nIG1hZ2ljIGFib3V0Ci0gICMgdGhlIHZhbHVlIGAvbGliJzsgaXQncyBqdXN0IGEgZHVtbXkuCi0gIE5BVElWRV9MSUJfRElSUz0vbGliCi0gICMgT2xkZXIgdmVyc2lvbnMgb2YgZ2NjIGRvIG5vdCB1c2UgYSBzcGVjcyBmaWxlLiAgSW4gdGhvc2UgY2FzZXMsCi0gICMgZ2NjIC1wcmludC1maWxlLW5hbWU9c3BlY3Mgd2lsbCBzaW1wbHkgcHJpbnQgc3BlY3MuICBXZSBjcmVhdGUgYQotICAjIGR1bW15IHNwZWNzIGZpbGVzIHRvIGhhbmRsZSB0aGlzLgotICBlY2hvICItZHluYW1pYy1saW5rZXIgL3Vzci9saWJleGVjL2xkLWVsZi5zby4xIiA+IHNwZWNzCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIGBlZ3JlcCAibGRbXiBdKlwuc28iIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9c3BlY3NcYCB8IHNlZCAtZSAicywuKi1keW5hbWljLWxpbmtlclsgCV1bIAldKlwoLiovbGRbXiBdKi5zby4uXCkuKixcMSwiYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0MS5vYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0aS5vYCBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtTGBkaXJuYW1lIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9bGliYy5zb1xgYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydG4ub2AnCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLWJzZCogfCBpWzM0NTZdODYtKi1mcmVlYnNkKiB8IGlbMzQ1Nl04Ni0qLW5ldGJzZCopCi0gICMgVGhlIG5ldyBCU0QgYG1ha2UnIGhhcyBhIGJ1ZzogaXQgZG9lc24ndCBwYXNzIGVtcHR5IGFyZ3VtZW50cyBpbgotICAjIHNoZWxsIGNvbW1hbmRzLiAgU28gd2UgbmVlZCB0byBtYWtlIHRoaXMgdmFsdWUgbm9uLWVtcHR5IGluIG9yZGVyCi0gICMgZm9yIHRoZSBnZW5zY3JpcHRzLnNoIGNhbGwgdG8gd29yay4gIFRoZXJlJ3Mgbm90aGluZyBtYWdpYyBhYm91dAotICAjIHRoZSB2YWx1ZSBgL2xpYic7IGl0J3MganVzdCBhIGR1bW15LgotICBOQVRJVkVfTElCX0RJUlM9L2xpYgotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLXN5c3Y0KikKLSAgSE9TVElOR19DUlQwPScvdXNyL2Njcy9saWIvY3J0MS5vIC91c3IvY2NzL2xpYi9jcnRpLm8gL3Vzci9jY3MvbGliL3ZhbHVlcy1YYS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2Njcy9saWIvY3J0bi5vJwotICBOQVRJVkVfTElCX0RJUlM9L3Vzci9jY3MvbGliCi0gIDs7Ci0KLWlbMzQ1Nl04Ni1zZXF1ZW50LXB0eCogfCBpWzM0NTZdODYtc2VxdWVudC1zeXN2KikKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDAubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAnCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLXN5c3YqKQotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGZpYCAvbGliL2NydG4ubycKLSAgOzsKLQotaVszNDU2XTg2LSotc29sYXJpcyopCi0gIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDEubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDEubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydDEubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRpLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRpLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRpLm87IGZpYCAvdXNyL2Njcy9saWIvdmFsdWVzLVhhLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRuLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRuLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRuLm87IGZpYCcKLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1pWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotaXNjKikKLSAgIyBJbiBzb21lIGNvbmZpZ3VyYXRpb25zIGdjYyBkb2VzIG5vdCB1c2UgY3J0YmVnaW4ubyBhbmQgY3J0ZW5kLm8uCi0gICMgSW4gdGhhdCBjYXNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm8gd2lsbCBzaW1wbHkgcHJpbnQKLSAgIyBjcnRiZWdpbi5vLiAgV2UgY3JlYXRlIGR1bW15IGNydGJlZ2luLm8gYW5kIGNydGVuZC5vIGZpbGVzIHRvCi0gICMgaGFuZGxlIHRoaXMuCi0gIGVjaG8gImludCBkdW1teV9jcnRiZWdpbiAoKSB7IHJldHVybiAwOyB9IiA+IGNydGJlZ2luLmMKLSAgJHtDQ30gLWMgY3J0YmVnaW4uYyAtbyBjcnRiZWdpbi5vCi0gIHJtIC1mIGNydGJlZ2luLmMKLSAgZWNobyAiaW50IGR1bW15X2NydGVuZyAoKSB7IHJldHVybiAwOyB9IiA+IGNydGVuZC5jCi0gICR7Q0N9IC1jIGNydGVuZC5jIC1vIGNydGVuZC5vCi0gIHJtIC1mIGNydGVuZC5jCi0gIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQxLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC9saWIvY3J0bi5vJwotICA7OwotCi1pWzM0NTZdODYtKi1saW51eCphb3V0KiB8IGlbMzQ1Nl04Ni0qLWxpbnV4b2xkbGQpCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotaVszNDU2XTg2LSotbGludXgqbGliYzEqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLWxpbnV4LnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGVuZC5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotaVszNDU2XTg2LSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgYGZncmVwIGxkLWxpbnV4LnNvIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9c3BlY3NcYCB8IHNlZCAtZSAicywuKi1keW5hbWljLWxpbmtlclsgCV1bIAldKlwoLiovbGQtbGludXguc28uLlwpLiosXDEsImAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGkub2AgYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWxpYmMuc29cYGAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRuLm9gJwotICA7OwotCi1pWzM0NTZdODYtKi1seW54b3MqKQotICBIT1NUSU5HX0NSVDA9L2xpYi9pbml0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAtbG0gL2xpYi9pbml0bi5vJwotICA7OwotCi1pWzM0NTZdODYtcGMtaW50ZXJpeCopCi0gIEhPU1RJTkdfQ1JUMD0nJCRJTlRFUklYX1JPT1QvdXNyL2xpYi9jcnQwLm8nCi0gIE5BVElWRV9MSUJfRElSUz0nJCRJTlRFUklYX1JPT1QvdXNyL2xpYi8nCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1MICQkWC9sb2NhbF9iaW4gLUwgJCRJTlRFUklYX1JPT1QvdXNyL2xpYiAtbGMgLWxjcHN4IC1sYyAtbGNwc3ggJCRJTlRFUklYX1JPT1QvdXNyL2xpYi9wc3hkbGwuYSAkJElOVEVSSVhfUk9PVC91c3IvbGliL3BzeGRsbDIuYScKLSAgOzsKLQotbWlwcyotZGVjLWJzZCopCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotbWlwcyotc2dpLWlyaXg0KikKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDEubwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1taXBzKi1zZ2ktaXJpeDUqKQotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW1pcHMqLXNnaS1pcml4NiopCi0gIEhPU1RJTkdfQ1JUMD0nL3Vzci9saWIzMi9jcnQxLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vIDsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUwvdXNyL2xpYjMyIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubyA7IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliMzIvY3J0bi5vIC1pbml0IF9fZG9fZ2xvYmFsX2N0b3JzIC1maW5pIF9fZG9fZ2xvYmFsX2R0b3JzJwotICA7OwotCi1taXBzKi0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQuc28uMSAvdXNyL2xpYi9jcnQxLm8gL3Vzci9saWIvY3J0aS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW02OCotKi1saW51eCphb3V0KikKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubwotICA7OwotCi1tNjgqLSotbGludXgqbGliYzEqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLWxpbnV4LnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGVuZC5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotbTY4Ki0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQuc28uMSAvdXNyL2xpYi9jcnQxLm8gL3Vzci9saWIvY3J0aS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW02OCotKi1seW54b3MqKQotICBIT1NUSU5HX0NSVDA9L2xpYi9pbml0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAtbG0gL2xpYi9pbml0bi5vJwotICA7OwotCi1tNjgqLW1vdG9yb2xhLXN5c3YpCi0gIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDAubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDAubzsgZWxpZiBbIC1mIFxgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1cYGNydDAubyBdOyB0aGVuIGVjaG8gXGAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPVxgY3J0MC5vOyBlbHNlIGVjaG8gL2xpYi9jcnQwLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjODgxIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCcKLSAgOzsKLQotbTY4Ki1zdW4tKikKLSAgSE9TVElOR19DUlQwPScvdXNyL2xpYi9jcnQwLm8gL3Vzci9saWIvRmNydDEubyAtTC91c3IvbGliL2Zzb2Z0Lm8nCi0gIDs7Ci0KLW04OCotKi1kZ3V4KikKLSAgSERFRklORVM9LURfX3VzaW5nX0RHVVgKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDAubyAtWCcKLSAgSE9TVElOR19MSUJTPS91c3Ivc2RlL204OGtiY3MvbGliL2xpYmMuYQotICA7OwotCi1tODgqLW1vdG9yb2xhLXN5c3YzKQotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MC5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAnCi0gIDs7Ci0KLXBvd2VycGMqLSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgL2xpYi9sZC5zby4xIC91c3IvbGliL2NydDEubyAvdXNyL2xpYi9jcnRpLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotcm9tcC0qLSopCi0gIEhERUZJTkVTPS1ETk9fVkFSQVJHUwotICA7OwotCi1zcGFyYyotKi1zb2xhcmlzMiopCi0gIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDEubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDEubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydDEubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRpLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRpLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRpLm87IGZpYCAvdXNyL2Njcy9saWIvdmFsdWVzLVhhLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRuLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRuLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRuLm87IGZpYCcKLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1zcGFyYy0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQtbGludXguc28uMiBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0MS5vYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0aS5vYCBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtTGBkaXJuYW1lIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9bGliYy5zb1xgYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydG4ub2AnCi0gIDs7Ci0KLXNwYXJjNjQtKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliNjQvbGQtbGludXguc28uMiBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0MS5vYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0aS5vYCBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtTGBkaXJuYW1lIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9bGliYy5zb1xgYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydG4ub2AnCi0gIDs7Ci0KLWVzYWMKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS5pbiBiL2xkL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmYzVmNi4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKLWRubAotQUNfUFJFUkVHKDIuMTMpCi1BQ19JTklUKGxkbWFpbi5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UobGQsIDIuOS41KQotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRSg2NC1iaXQtYmZkLAotWyAgLS1lbmFibGUtNjQtYml0LWJmZCAgICAgNjQtYml0IHN1cHBvcnQgKG9uIGhvc3RzIHdpdGggbmFycm93ZXIgd29yZCBzaXplcyldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSAgd2FudDY0PXRydWUgIDs7Ci0gIG5vKSAgIHdhbnQ2ND1mYWxzZSA7OwotICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24pIDs7Ci1lc2FjXSxbd2FudDY0PWZhbHNlXSlkbmwKLQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCi1maQotaWYgdGVzdCAteiAiJGhvc3QiIDsgdGhlbgotICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgaG9zdCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0lOU1RBTEwKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BQ19FWEVFWFQKLQotQUNfUFJPR19ZQUNDCi1BTV9QUk9HX0xFWAotCi1BTV9NQUlOVEFJTkVSX01PREUKLQotLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BQ19TVUJTVChIT1NUSU5HX0NSVDApCi1BQ19TVUJTVChIT1NUSU5HX0xJQlMpCi1BQ19TVUJTVChOQVRJVkVfTElCX0RJUlMpCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oKQotQUNfQ0hFQ0tfRlVOQ1Moc2JyaykKLUFDX0hFQURFUl9ESVJFTlQKLQotQkZEX0JJTkFSWV9GT1BFTgotCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihmcmVlKQotQkZEX05FRURfREVDTEFSQVRJT04oc2JyaykKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGVudmlyb24pCi0KLSMgV2hlbiBjb252ZXJ0aW5nIGxpbmtlciBzY3JpcHRzIGludG8gc3RyaW5ncyBmb3IgdXNlIGluIGVtdWxhdGlvbgotIyBmaWxlcywgdXNlIGFzdHJpbmcuc2VkIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBBTlNJIHN0cmluZwotIyBjb25jYXRlbmF0aW9uLCBvciBvc3RyaW5nLnNlZCBvdGhlcndpc2UuICBUaGlzIGlzIHRvIHN1cHBvcnQgdGhlCi0jIGJyb2tlbiBNaWNyb3NvZnQgTVNWQyBjb21waWxlciwgd2hpY2ggbGltaXRzIHRoZSBsZW5ndGggb2Ygc3RyaW5nCi0jIGNvbnN0YW50cywgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBwcmUtQU5TSSBjb21waWxlcnMgd2hpY2ggZG8gbm90Ci0jIHN1cHBvcnQgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uIHdvcmtzXSkKLUFDX0NBQ0hFX1ZBTChsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbiwKLVtBQ19UUllfQ09NUElMRSgsW2NoYXIgKmEgPSAiYSIgImEiO10sCi0gIFtsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbj15ZXNdLAotICBbbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb249bm9dKV0pCi1BQ19NU0dfUkVTVUxUKCRsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbikKLWlmIHRlc3QgIiRsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbiIgPSAieWVzIjsgdGhlbgotICBTVFJJTkdJRlk9YXN0cmluZy5zZWQKLWVsc2UKLSAgU1RSSU5HSUZZPW9zdHJpbmcuc2VkCi1maQotQUNfU1VCU1QoU1RSSU5HSUZZKQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotYWxsX3RhcmdldHM9Ci1FTVVMPQotYWxsX2VtdWxzPQotYWxsX2VtdWxfZXh0cmFzPQotYWxsX2xpYnBhdGg9Ci0KLWRubCBXZSBuZWVkIHRvIGdldCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRkaXIgZGVmaW5pdGlvbnMgaW50bwotZG5sIE1ha2VmaWxlLiAgV2UgY2FuJ3QgZG8gaXQgdXNpbmcgQUNfU1VCU1QsIGJlY2F1c2UgYXV0b2NvbmYgZG9lcwotZG5sIG5vdCBwZXJtaXQgbGl0ZXJhbCBuZXdsaW5lcyBpbiBhbiBBQ19TVUJTVCB2YXJpYWJsZXMuICBTbyB3ZSB1c2UgYQotZG5sIGZpbGUuCi1ybSAtZiB0ZGlycwotCi1mb3IgdGFyZ19hbGlhcyBpbiBgZWNobyAkdGFyZ2V0X2FsaWFzICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi1kbwotICBpZiB0ZXN0ICIkdGFyZ19hbGlhcyIgPSAiYWxsIjsgdGhlbgotICAgIGFsbF90YXJnZXRzPXRydWUKLSAgZWxzZQotICAgICMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotICAgIHJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmdfYWxpYXMgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQl0YXJnPSRyZXN1bHQKLSAgICBlbHNlCi0JdGFyZz0kdGFyZ19hbGlhcwotICAgIGZpCi0KLSAgICAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0Ci0KLSAgICBpZiB0ZXN0ICIkdGFyZyIgPSAiJHRhcmdldCI7IHRoZW4KLSAgICAgIEVNVUw9JHRhcmdfZW11bAotICAgIGZpCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2VtdWxzICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfZW11bHMgIiBpbgotCSoiIGUke2l9Lm8gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVscz0iJGFsbF9lbXVscyBlJHtpfS5vIgotCSAgZXZhbCByZXN1bHQ9XCR0ZGlyXyRpCi0JICB0ZXN0IC16ICIkcmVzdWx0IiAmJiByZXN1bHQ9JHRhcmdfYWxpYXMKLQkgIGVjaG8gdGRpcl8kaT0kcmVzdWx0ID4+IHRkaXJzCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfbGlicGF0aCAiIGluCi0JKiIgJHtpfSAiKikgOzsKLQkqKQotCSAgaWYgdGVzdCAteiAiJGFsbF9saWJwYXRoIjsgdGhlbgotCSAgICBhbGxfbGlicGF0aD0ke2l9Ci0JICBlbHNlCi0JICAgIGFsbF9saWJwYXRoPSIkYWxsX2xpYnBhdGggJHtpfSIKLQkgIGZpCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19leHRyYV9vZmlsZXM7IGRvCi0JY2FzZSAiICRhbGxfZW11bF9leHRyYXMgIiBpbgotCSoiICR7aX0gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVsX2V4dHJhcz0iJGFsbF9lbXVsX2V4dHJhcyAke2l9IgotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotICBmaQotZG9uZQotCi1BQ19TVUJTVChFTVVMKQotCi1URElSUz10ZGlycwotQUNfU1VCU1RfRklMRShURElSUykKLQotZG5sIEZJWE1FOiBXZSB3aWxsIGJ1aWxkIGEgNjQgYml0IEJGRCBmb3IgYSA2NCBiaXQgaG9zdCBvciBhIDY0IGJpdAotZG5sIHRhcmdldCwgYW5kIGluIHRob3NlIGNhc2VzIHdlIHNob3VsZCBhbHNvIGJ1aWxkIHRoZSA2NCBiaXQKLWRubCBlbXVsYXRpb25zLgotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZTsgdGhlbgotICBpZiB0ZXN0IHgke3dhbnQ2NH0gPSB4dHJ1ZTsgdGhlbgotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpICQoQUxMXzY0X0VNVUxBVElPTlMpJwotICBlbHNlCi0gICAgRU1VTEFUSU9OX09GSUxFUz0nJChBTExfRU1VTEFUSU9OUyknCi0gIGZpCi0gIEVNVUxfRVhUUkFfT0ZJTEVTPSckKEFMTF9FTVVMX0VYVFJBX09GSUxFUyknCi1lbHNlCi0gIEVNVUxBVElPTl9PRklMRVM9JGFsbF9lbXVscwotICBFTVVMX0VYVFJBX09GSUxFUz0kYWxsX2VtdWxfZXh0cmFzCi1maQotQUNfU1VCU1QoRU1VTEFUSU9OX09GSUxFUykKLUFDX1NVQlNUKEVNVUxfRVhUUkFfT0ZJTEVTKQotCi1FTVVMQVRJT05fTElCUEFUSD0kYWxsX2xpYnBhdGgKLUFDX1NVQlNUKEVNVUxBVElPTl9MSUJQQVRIKQotCi1pZiB0ZXN0IHgke2VuYWJsZV9zdGF0aWN9ID0geG5vOyB0aGVuCi0gIFRFU1RCRkRMSUI9Ii0tcnBhdGggLi4vYmZkLy5saWJzIC4uL2JmZC8ubGlicy9saWJiZmQuc28iCi1lbHNlCi0gIFRFU1RCRkRMSUI9Ii4uL2JmZC8ubGlicy9saWJiZmQuYSIKLWZpCi1BQ19TVUJTVChURVNUQkZETElCKQotCi10YXJnZXRfdmVuZG9yPSR7dGFyZ2V0X3ZlbmRvcj0kaG9zdF92ZW5kb3J9Ci1jYXNlICIkdGFyZ2V0X3ZlbmRvciIgaW4KLSAgaHApIEVYVFJBX1NITElCX0VYVEVOU0lPTj0iLnNsIiA7OwotICAqKSAgRVhUUkFfU0hMSUJfRVhURU5TSU9OPSA7OwotZXNhYwotaWYgdGVzdCB4JHtFWFRSQV9TSExJQl9FWFRFTlNJT059ICE9IHggOyB0aGVuCi0gIEFDX0RFRklORV9VTlFVT1RFRChFWFRSQV9TSExJQl9FWFRFTlNJT04sICIkRVhUUkFfU0hMSUJfRVhURU5TSU9OIiwKLSAgIFtBZGRpdGlvbmFsIGV4dGVuc2lvbiBhIHNoYXJlZCBvYmplY3QgbWlnaHQgaGF2ZS5dKQotZmkKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS50Z3QgYi9sZC9jb25maWd1cmUudGd0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjcxNWY0Li4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZS50Z3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotIyBUaGlzIGlzIHRoZSBsaW5rZXIgdGFyZ2V0IHNwZWNpZmljIGZpbGUuICBUaGlzIGlzIGludm9rZWQgYnkgdGhlCi0jIGF1dG9jb25mIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LiAgUHV0dGluZyBpdCBpbiBhIHNlcGFyYXRlIHNoZWxsCi0jIGZpbGUgbGV0cyB1cyBza2lwIHJ1bm5pbmcgYXV0b2NvbmYgd2hlbiBtb2RpZnlpbmcgdGFyZ2V0IHNwZWNpZmljCi0jIGluZm9ybWF0aW9uLgotCi0jIFRoaXMgZmlsZSBzd2l0Y2hlcyBvbiB0aGUgc2hlbGwgdmFyaWFibGUgJHt0YXJnfSwgYW5kIHNldHMgdGhlCi0jIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICB0YXJnX2VtdWwJCW5hbWUgb2YgbGlua2VyIGVtdWxhdGlvbiB0byB1c2UKLSMgIHRhcmdfZXh0cmFfZW11bHMJYWRkaXRpb25hbCBsaW5rZXIgZW11bGF0aW9ucyB0byBwcm92aWRlCi0jICB0YXJnX2V4dHJhX2xpYnBhdGgJYWRkaXRpb25hbCBsaW5rZXIgZW11bGF0aW9ucyB1c2luZyBMSUJfUEFUSAotIyAgdGFyZ19leHRyYV9vZmlsZXMJYWRkaXRpb25hbCBvYmplY3RzIG5lZWRlZCBieSB0aGUgZW11bGF0aW9uCi0KLXRhcmdfZXh0cmFfZW11bHM9Ci10YXJnX2V4dHJhX29maWxlcz0KLQotY2FzZSAiJHt0YXJnfSIgaW4KLWFybS1lcG9jLXBlKQkJdGFyZ19lbXVsPWFybV9lcG9jX3BlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotYXJtLSotd2luY2UpCQl0YXJnX2VtdWw9YXJtcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1hcm0tKi1wZSkJCXRhcmdfZW11bD1hcm1wZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWFyYy0qLWVsZiopCQl0YXJnX2VtdWw9YXJjZWxmIDs7Ci1hdnItKi0qKQkJdGFyZ19lbXVsPWF2cjg1eHgKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImF2cjEyMDAgYXZyMjN4eCBhdnI0NHg0IGF2cjQ0MzMgYXZybWVnYTYwMyBhdnJtZWdhMTAzIGF2cm1lZ2ExNjEiIDs7Ci1kMTB2LSotKikJCXRhcmdfZW11bD1kMTB2ZWxmIDs7Ci1kMzB2LSotKmV4dCopCQl0YXJnX2VtdWw9ZDMwdl9lOyB0YXJnX2V4dHJhX2VtdWxzPSJkMzB2ZWxmIGQzMHZfbyIgOzsKLWQzMHYtKi0qb25jaGlwKikJdGFyZ19lbXVsPWQzMHZfbzsgdGFyZ19leHRyYV9lbXVscz0iZDMwdmVsZiBkMzB2X2UiIDs7Ci1kMzB2LSotKikJCXRhcmdfZW11bD1kMzB2ZWxmOyB0YXJnX2V4dHJhX2VtdWxzPSJkMzB2X2UgZDMwdl9vIiA7Owotc3BhcmM2NC0qLWFvdXQqKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1zcGFyYzY0LSotZWxmKikJCXRhcmdfZW11bD1lbGY2NF9zcGFyYyA7Owotc3BhcmMtc3VuLXN1bm9zNCopIAl0YXJnX2VtdWw9c3VuNCA7Owotc3BhcmNsaXRlKi0qLWVsZikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyY2xpdGUqLSotY29mZikJdGFyZ19lbXVsPWNvZmZfc3BhcmMgOzsKLXNwYXJjbGl0ZSotZnVqaXRzdS0qKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1zcGFyYyotKi1hb3V0KQkJdGFyZ19lbXVsPXNwYXJjYW91dCA7Owotc3BhcmMqLSotY29mZikJCXRhcmdfZW11bD1jb2ZmX3NwYXJjIDs7Ci1zcGFyYyotKi1lbGYpCQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKLXNwYXJjKi0qLXN5c3Y0KikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyYyotKi1saW51eCphb3V0KikJdGFyZ19lbXVsPXNwYXJjbGludXgKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMyX3NwYXJjIHN1bjQiCi0JCQl0ZGlyX2VsZjMyX3NwYXJjPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvYW91dC8vJ2AKLQkJCXRkaXJfc3VuND1zcGFyYy1zdW4tc3Vub3M0Ci0JCQk7Owotc3BhcmM2NC0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGY2NF9zcGFyYwotCQkJdGFyZ19leHRyYV9lbXVscz0iZWxmMzJfc3BhcmMgc3BhcmNsaW51eCBzdW40IgotCQkJdGRpcl9lbGYzMl9zcGFyYz1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzLzY0Ly8nYAotCQkJdGRpcl9zcGFyY2xpbnV4PSR7dGRpcl9lbGYzMl9zcGFyY31hb3V0Ci0JCQl0ZGlyX3N1bjQ9c3BhcmMtc3VuLXN1bm9zNAotCQkJOzsKLXNwYXJjKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMl9zcGFyYwotCQkJdGFyZ19leHRyYV9lbXVscz0ic3BhcmNsaW51eCBlbGY2NF9zcGFyYyBzdW40IgotCQkJdGRpcl9zcGFyY2xpbnV4PSR7dGFyZ19hbGlhc31hb3V0Ci0JCQl0ZGlyX2VsZjY0X3NwYXJjPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvMzIvLydgCi0JCQl0ZGlyX3N1bjQ9c3BhcmMtc3VuLXN1bm9zNAotCQkJOzsKLXNwYXJjKi0qLWx5bnhvcyopCXRhcmdfZW11bD1zcGFyY2x5bnggOzsKLXNwYXJjKi0qLW5ldGJzZCopCXRhcmdfZW11bD1zcGFyY25ic2QgOzsKLXNwYXJjLSotc29sYXJpczIuWzAtNl0gfCBzcGFyYy0qLXNvbGFyaXMyLlswLTZdLiopCi0JCQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKLXNwYXJjLSotc29sYXJpczIqKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjY0X3NwYXJjIgotCQkJdGFyZ19leHRyYV9saWJwYXRoPSR0YXJnX2V4dHJhX2VtdWxzCi0JCQl0ZGlyX2VsZjY0X3NwYXJjPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvMzIvLydgCi0JCQk7Owotc3BhcmN2OS0qLXNvbGFyaXMyKiB8IHNwYXJjNjQtKi1zb2xhcmlzMiopCi0JCQl0YXJnX2VtdWw9ZWxmNjRfc3BhcmMKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMyX3NwYXJjIgotCQkJdGFyZ19leHRyYV9saWJwYXRoPSR0YXJnX2V4dHJhX2VtdWxzCi0JCQl0ZGlyX2VsZjMyX3NwYXJjPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvNjQvLydgCi0JCQk7Owotc3BhcmMqLSotc29sYXJpczIqKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKLXNwYXJjKi13cnMtdnh3b3JrcyopCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKLXNwYXJjKi0qLXJ0ZW1zKikJdGFyZ19lbXVsPXNwYXJjYW91dCA7OwotaTk2MC13cnMtdnh3b3JrczUuMCopCXRhcmdfZW11bD1nbGQ5NjAgOzsKLWk5NjAtd3JzLXZ4d29ya3M1KikJdGFyZ19lbXVsPWdsZDk2MGNvZmYgOzsKLWk5NjAtd3JzLXZ4d29ya3MqKQl0YXJnX2VtdWw9Z2xkOTYwIDs7Ci1pOTYwLSotY29mZikJCXRhcmdfZW11bD1nbGQ5NjBjb2ZmIDs7Ci1pOTYwLWludGVsLW5pbmR5KQl0YXJnX2VtdWw9Z2xkOTYwIDs7Ci1pOTYwLSotcnRlbXMqKQkJdGFyZ19lbXVsPWdsZDk2MGNvZmYgOzsKLWk5NjAtKi1lbGYqKQkJdGFyZ19lbXVsPWVsZjMyX2k5NjAgOzsKLW0zMnItKi0qKQkJdGFyZ19lbXVsPW0zMnJlbGYgOzsKLW02OCotc3VuLXN1bm9zWzM0XSopCXRhcmdfZW11bD1zdW4zIDs7Ci1tNjgqLXdycy12eHdvcmtzKikJdGFyZ19lbXVsPXN1bjMgOzsKLW02OCotZXJpY3Nzb24tb3NlKQl0YXJnX2VtdWw9c3VuMyA7OwotbTY4Ki1hcHBsZS1hdXgqKQl0YXJnX2VtdWw9bTY4a2F1eCA7OwotKi10YW5kZW0tbm9uZSkJCXRhcmdfZW11bD1zdDIwMDAgOzsKLWkzNzAtKi1lbGYqIHwgaTM3MC0qLWxpbnV4LWdudSopIHRhcmdfZW11bD1lbGYzMmkzNzAgOzsKLWkzNzAtKi1tdnMqKSAJCXRhcmdfZW11bD1tdnMgOzsKLWlbMzQ1Nl04Ni0qLXZzdGEpCXRhcmdfZW11bD12c3RhIDs7Ci1pWzM0NTZdODYtZ28zMi1ydGVtcyopCXRhcmdfZW11bD1pMzg2Z28zMiA7OwotaVszNDU2XTg2LSotZ28zMikJdGFyZ19lbXVsPWkzODZnbzMyIDs7Ci1pWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikgdGFyZ19lbXVsPWkzODZnbzMyIDs7Ci1pWzM0NTZdODYtKi1haXgqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLXNjbyopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotaXNjKikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1seW54b3MqKQl0YXJnX2VtdWw9aTM4Nmx5bnggOzsKLWlbMzQ1Nl04Ni0qLWNvZmYpCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotcnRlbXNlbGYqKSAgdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1ydGVtcyopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotYnNkKQl0YXJnX2VtdWw9aTM4NmJzZCA7OwotaVszNDU2XTg2LSotYnNkMzg2KQl0YXJnX2VtdWw9aTM4NmJzZCA7OwotaVszNDU2XTg2LSotYnNkaSopCXRhcmdfZW11bD1pMzg2YnNkIDs7Ci1pWzM0NTZdODYtKi1hb3V0KQl0YXJnX2VtdWw9aTM4NmFvdXQgOzsKLWlbMzQ1Nl04Ni0qLWxpbnV4KmFvdXQqKQl0YXJnX2VtdWw9aTM4NmxpbnV4Ci0JCQl0YXJnX2V4dHJhX2VtdWxzPWVsZl9pMzg2Ci0JCQl0ZGlyX2VsZl9pMzg2PWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvYW91dC8vJ2AKLQkJCTs7Ci1pWzM0NTZdODYtKi1saW51eG9sZGxkKQl0YXJnX2VtdWw9aTM4NmxpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmX2kzODYKLQkJCXRhcmdfZXh0cmFfZW11bHM9aTM4NmxpbnV4Ci0JCQl0ZGlyX2kzODZsaW51eD0ke3RhcmdfYWxpYXN9YW91dAotCQkJOzsKLWlbMzQ1Nl04Ni0qLXN5c3Y0KikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1zb2xhcmlzMiopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotdW5peHdhcmUpCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotc29sYXJpcyopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotbmV0YnNkKikJdGFyZ19lbXVsPWkzODZuYnNkIDs7Ci1pWzM0NTZdODYtKi1uZXR3YXJlKQl0YXJnX2VtdWw9aTM4Nm53IDs7Ci1pWzM0NTZdODYtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLWZyZWVic2Rhb3V0KiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdLiogfCBpWzM0NTZdODYtKi1mcmVlYnNkWzEyXSkKLQkJCXRhcmdfZW11bD1pMzg2YnNkIDs7Ci1pWzM0NTZdODYtKi1mcmVlYnNkKikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1zeXN2KikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1wdHgqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLW1hY2gqKQl0YXJnX2VtdWw9aTM4Nm1hY2ggOzsKLWlbMzQ1Nl04Ni0qLWdudSopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotbXNkb3MqKQl0YXJnX2VtdWw9aTM4Nm1zZG9zOyB0YXJnX2V4dHJhX2VtdWxzPWkzODZhb3V0IDs7Ci1pWzM0NTZdODYtKi1tb3NzKikJdGFyZ19lbXVsPWkzODZtb3NzOyB0YXJnX2V4dHJhX2VtdWxzPWkzODZtc2RvcyA7OwotaVszNDU2XTg2LSotd2lubnQqKQl0YXJnX2VtdWw9aTM4NnBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaVszNDU2XTg2LSotcGUpCQl0YXJnX2VtdWw9aTM4NnBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaVszNDU2XTg2LSotY3lnd2luKikJdGFyZ19lbXVsPWkzODZwZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQl0YXJnX2VtdWw9aTM4NnBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaVszNDU2XTg2LSotaW50ZXJpeCopCXRhcmdfZW11bD1pMzg2cGVfcG9zaXg7Ci0gCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1iZW9zcGUqKSAgICB0YXJnX2VtdWw9aTM4NmJlb3MgOzsKLWlbMzQ1Nl04Ni0qLWJlb3MqKQl0YXJnX2VtdWw9ZWxmX2kzODZfYmUgOzsKLWlbMzQ1Nl04Ni0qLXZ4d29ya3MqKQl0YXJnX2VtdWw9aTM4NmFvdXQgOzsKLW04Ki0qLSopCQl0YXJnX2VtdWw9bTg4a2JjcyA7OwotYTI5ay0qLXVkaSkJCXRhcmdfZW11bD1zYTI5MjAwIDs7Ci1hMjlrLSotZWJtb24pCQl0YXJnX2VtdWw9ZWJtb24yOWsgOzsKLWEyOWstKi0qKQkJdGFyZ19lbXVsPWEyOWsgOzsKLSMgIGFybS0qLXJpc2NpeCopCQl0YXJnX2VtdWw9cmlzY2l4IDs7Ci1hcm0tKi1hb3V0IHwgYXJtZWwtKi1hb3V0KSB0YXJnX2VtdWw9YXJtYW91dGwgOzsKLWFybWViLSotYW91dCkJCXRhcmdfZW11bD1hcm1hb3V0YiA7OwotYXJtLSotY29mZikJCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci1hcm0tKi1uZXRic2QqKQkJdGFyZ19lbXVsPWFybW5ic2QgOzsKLWFybS0qLWVsZikJCXRhcmdfZW11bD1hcm1lbGYgOzsKLWFybS0qLW9hYmkpCQl0YXJnX2VtdWw9YXJtZWxmX29hYmkgOzsKLWFybSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9YXJtZWxmX2xpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPSJhcm1lbGZfbGludXgyNiBhcm1lbGYiIDs7Ci1hcm0qLSotdWNsaW51eCopCXRhcmdfZW11bD1hcm1lbGZfbGludXg7IHRhcmdfZXh0cmFfZW11bHM9YXJtZWxmIDs7Ci1hcm0qLSotY29uaXgqKQkJdGFyZ19lbXVsPWFybWVsZiA7OwotdGh1bWItKi1saW51eC1nbnUqIHwgdGh1bWItKi11Y2xpbnV4KikJdGFyZ19lbXVsPWFybWVsZl9saW51eDsgdGFyZ19leHRyYV9lbXVscz1hcm1lbGYgOzsKLXN0cm9uZ2FybS0qLWNvZmYpCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci1zdHJvbmdhcm0tKi1lbGYpCXRhcmdfZW11bD1hcm1lbGYgOzsKLXRodW1iLSotY29mZikJCXRhcmdfZW11bD1hcm1jb2ZmIDs7Ci10aHVtYi0qLWVsZikJCXRhcmdfZW11bD1hcm1lbGYgOzsKLXRodW1iLSotb2FiaSkgICAgICAgICAgIHRhcmdfZW11bD1hcm1lbGZfb2FiaSA7OwotdGh1bWItZXBvYy1wZSkJCXRhcmdfZW11bD1hcm1fZXBvY19wZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLXRodW1iLSotcGUpCQl0YXJnX2VtdWw9YXJtcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1oODMwMC0qLWhtcyogfCBoODMwMC0qLWNvZmYqKQotCQkJdGFyZ19lbXVsPWg4MzAwOyB0YXJnX2V4dHJhX2VtdWxzPSJoODMwMGggaDgzMDBzIgotCQkJOzsKLWg4NTAwLSotaG1zKiB8IGg4NTAwLSotY29mZiopCi0JCQl0YXJnX2VtdWw9aDg1MDAKLQkJCXRhcmdfZXh0cmFfZW11bHM9Img4NTAwcyBoODUwMGIgaDg1MDBtIGg4NTAwYyIKLQkJCTs7Ci1zaC0qLWVsZiogfCBzaC0qLXJ0ZW1zZWxmKikKLQkJCXRhcmdfZW11bD1zaGVsZgotCQkJdGFyZ19leHRyYV9lbXVscz0ic2hsZWxmIHNoIHNobCIKLQkJCTs7Ci1zaC0qLXBlKQkJdGFyZ19lbXVsPXNocGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1zaC0qLSp8c2gtKi1ydGVtcyopCXRhcmdfZW11bD1zaDsgdGFyZ19leHRyYV9lbXVscz1zaGwgOzsKLW02OGstc29ueS0qKQkJdGFyZ19lbXVsPW5ld3MgOzsKLW02OGstaHAtYnNkKikJCXRhcmdfZW11bD1ocDMwMGJzZCA7OwotbTY4Ki1tb3Rvcm9sYS1zeXN2KikJdGFyZ19lbXVsPWRlbHRhNjggOzsKLW02OCotKi1hb3V0KQkJdGFyZ19lbXVsPW02OGthb3V0IDs7Ci1tNjgqLSotY29mZikJCXRhcmdfZW11bD1tNjhrY29mZiA7OwotbTY4Ki0qLWVsZikJCXRhcmdfZW11bD1tNjhrZWxmIDs7Ci1tNjgqLSotaHB1eCopCQl0YXJnX2VtdWw9aHAzaHB1eCA7OwotbTY4ay0qLWxpbnV4KmFvdXQqKQl0YXJnX2VtdWw9bTY4a2xpbnV4Ci0JCQl0YXJnX2V4dHJhX2VtdWxzPW02OGtlbGYKLQkJCXRkaXJfbTY4a2VsZj1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2FvdXQvLydgCi0JCQk7OwotbTY4ay0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1tNjhrZWxmCi0JCQl0YXJnX2V4dHJhX2VtdWxzPW02OGtsaW51eAotCQkJdGRpcl9tNjhrbGludXg9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9saW51eC9saW51eGFvdXQvJ2AKLQkJCTs7Ci1tNjgqLSotZ251KikJCXRhcmdfZW11bD1tNjhrZWxmIDs7Ci1tNjgqLSotbHlueG9zKikJCXRhcmdfZW11bD1tNjhrbHlueCA7OwotbTY4Ki1ocCotbmV0YnNkKikJdGFyZ19lbXVsPW02OGs0a25ic2QgOzsKLW02OCotKi1uZXRic2QqKQkJdGFyZ19lbXVsPW02OGtuYnNkIDs7Ci1tNjgqLSotcHNvcyopCQl0YXJnX2VtdWw9bTY4a3Bzb3MgOzsKLW02OCotKi1ydGVtcyopCQl0YXJnX2VtdWw9bTY4a2NvZmYgOzsKLWhwcGEqdyotKikJCXRhcmdfZW11bD1lbGY2NGhwcGEgOzsKLWhwcGEqLSotKmVsZiopCQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotaHBwYSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotaHBwYSotKi1saXRlcyopCQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotaHBwYSotKi1ydGVtcyopCQl0YXJnX2VtdWw9aHBwYWVsZiA7OwotdmF4LWRlYy11bHRyaXgqIHwgdmF4LWRlYy1ic2QqKSB0YXJnX2VtdWw9dmF4IDs7Ci1taXBzKi0qLXBlKQkJdGFyZ19lbXVsPW1pcHNwZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLW1pcHMqLWRlYy11bHRyaXgqKQl0YXJnX2VtdWw9bWlwc2xpdCA7OwotbWlwcyotZGVjLW9zZiopCQl0YXJnX2VtdWw9bWlwc2xpdCA7OwotbWlwcyotc2dpLWlyaXg1KikJdGFyZ19lbXVsPWVsZjMyYnNtaXAgOzsKLW1pcHMqLXNnaS1pcml4NiopCXRhcmdfZW11bD1lbGYzMmJtaXBuMzIKLQkgICAgICAgICAgICAgICAgdGFyZ19leHRyYV9lbXVscz0iZWxmMzJic21pcCBlbGY2NGJtaXAiCi0JICAgICAgICAgICAgICAgIDs7Ci1taXBzKi1zZ2ktaXJpeCopCXRhcmdfZW11bD1taXBzYmlnIDs7Ci1taXBzKmVsLSotZWNvZmYqKQl0YXJnX2VtdWw9bWlwc2lkdGwgOzsKLW1pcHMqLSotZWNvZmYqKQkJdGFyZ19lbXVsPW1pcHNpZHQgOzsKLW1pcHMqLWRlYy1ic2QqKQkJdGFyZ19lbXVsPW1pcHNic2QgOzsKLW1pcHMqLWRlYy1uZXRic2QqKQl0YXJnX2VtdWw9ZWxmMzJsbWlwIDs7Ci1taXBzKi0qLWJzZCopCQl0YXJnX2VtdWw9bWlwc2JpZyA7OwotbWlwcyp2cjQzMDBlbC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmw0MzAwIDs7Ci1taXBzKnZyNDMwMC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmI0MzAwIDs7Ci1taXBzKnZyNDEwMGVsLSotZWxmKikJdGFyZ19lbXVsPWVsZjMybDQzMDAgOzsKLW1pcHMqdnI0MTAwLSotZWxmKikJdGFyZ19lbXVsPWVsZjMyYjQzMDAgOzsKLW1pcHMqdnI1MDAwZWwtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJsNDMwMCA7OwotbWlwcyp2cjUwMDAtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJiNDMwMCA7OwotbWlwcyplbC0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmMzJlbG1pcCA7OwotbWlwcyotKi1lbGYqKQkJdGFyZ19lbXVsPWVsZjMyZWJtaXAgOzsKLW1pcHMqZWwtKi1ydGVtcyopCXRhcmdfZW11bD1lbGYzMmVsbWlwIDs7Ci1taXBzKi0qLXJ0ZW1zKikJCXRhcmdfZW11bD1lbGYzMmVibWlwIDs7Ci1taXBzKmVsLSotdnh3b3JrcyopCXRhcmdfZW11bD1lbGYzMmVsbWlwIDs7Ci1taXBzKi0qLXZ4d29ya3MqKQl0YXJnX2VtdWw9ZWxmMzJlYm1pcCA7OwotbWlwcyplbC0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmxzbWlwCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmJzbWlwIG1pcHNsaXQgbWlwc2JpZyIKLQkJCTs7Ci1taXBzKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmJzbWlwCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmxzbWlwIG1pcHNiaWcgbWlwc2xpdCIKLQkJCTs7Ci1taXBzKi0qLWxuZXdzKikJCXRhcmdfZW11bD1taXBzbG5ld3MgOzsKLW1uMTAyMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAyMDAgOzsKLW1uMTAzMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAzMDAgOzsKLWFscGhhKi0qLWxpbnV4ZWNvZmYqKQl0YXJnX2VtdWw9YWxwaGEgdGFyZ19leHRyYV9lbXVscz1lbGY2NGFscGhhCi0JCQl0ZGlyX2VsZjY0YWxwaGE9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9lY29mZi8vJ2AKLQkJCTs7Ci1hbHBoYSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSB0YXJnX2V4dHJhX2VtdWxzPWFscGhhCi0JCQl0ZGlyX2FscGhhPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvbGludXgvbGludXhlY29mZi8nYAotCQkJOzsKLWFscGhhKi0qLW9zZiopCQl0YXJnX2VtdWw9YWxwaGEgOzsKLWFscGhhKi0qLWdudSopCQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSA7OwotYWxwaGEqLSotbmV0d2FyZSopCXRhcmdfZW11bD1hbHBoYSA7OwotYWxwaGEqLSotbmV0YnNkKikJdGFyZ19lbXVsPWVsZjY0YWxwaGEgOzsKLXo4ay0qLWNvZmYpIAkJdGFyZ19lbXVsPXo4MDAyOyB0YXJnX2V4dHJhX2VtdWxzPXo4MDAxIDs7Ci1uczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikJdGFyZ19lbXVsPXBjNTMybWFjaGEgOzsKLW5zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopIHRhcmdfZW11bD1uczMya25ic2QgOzsKLXBvd2VycGMtKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmMzJwcGNsaW51eDsgdGFyZ19leHRyYV9lbXVscz1lbGYzMnBwYzsKLQkJCXRhcmdfZXh0cmFfbGlicGF0aD1lbGYzMnBwYyA7OwotcGpsKi0qLSopCSAgICAgICAgdGFyZ19lbXVsPXBqbGVsZiA7IHRhcmdfZXh0cmFfZW11bHM9ImVsZl9pMzg2IiA7OwotcGoqLSotKikJICAgICAgICB0YXJnX2VtdWw9cGplbGYgOzsKLXBvd2VycGMtKi1lbGYqIHwgcG93ZXJwYy0qLWVhYmkqIHwgcG93ZXJwYy0qLXN5c3YqIFwKLSAgfCBwb3dlcnBjLSotbmV0YnNkKiB8IHBvd2VycGMtKi12eHdvcmtzKikKLQl0YXJnX2VtdWw9ZWxmMzJwcGMgOzsKLXBvd2VycGNsZS0qLWVsZiogfCBwb3dlcnBjbGUtKi1lYWJpKiB8IHBvd2VycGNsZS0qLXNvbGFyaXMqIFwKLSAgfCBwb3dlcnBjbGUtKi1zeXN2KiB8IHBvd2VycGNsZS0qLXZ4d29ya3MqKQotCXRhcmdfZW11bD1lbGYzMmxwcGMgOzsKLXBvd2VycGNsZS0qLXJ0ZW1zKikJdGFyZ19lbXVsPWVsZjMybGVwcGMgOzsKLXBvd2VycGMtKi1ydGVtcyopCXRhcmdfZW11bD1lbGYzMnBwYyA7OwotcG93ZXJwYy0qLW1hY29zKikJdGFyZ19lbXVsPXBwY21hY29zIDs7Ci1wb3dlcnBjLSotbmV0d2FyZSopCXRhcmdfZW11bD1wcGNudyA7OwotcG93ZXJwY2xlLSotcGUpICAgICAgICAgdGFyZ19lbXVsPXBwY3BlIDs7Ci1wb3dlcnBjbGUtKi13aW5udCopICAgICB0YXJnX2VtdWw9cHBjcGUgOzsKLXBvd2VycGNsZS0qLWN5Z3dpbiopICAgdGFyZ19lbXVsPXBwY3BlIDs7Ci1wb3dlcnBjLSotYWl4KikJCXRhcmdfZW11bD1haXhwcGMgOzsKLXBvd2VycGMtKi1iZW9zKikJdGFyZ19lbXVsPWFpeHBwYyA7OwotcnM2MDAwLSotYWl4KikJCXRhcmdfZW11bD1haXhyczYgOzsKLXRpYzMwLSotKmFvdXQqKQkJdGFyZ19lbXVsPXRpYzMwYW91dCA7OwotdGljMzAtKi0qY29mZiopCQl0YXJnX2VtdWw9dGljMzBjb2ZmIDs7Ci10aWM4MC0qLSopCQl0YXJnX2VtdWw9dGljODBjb2ZmIDs7Ci12ODUwLSotKikJCXRhcmdfZW11bD12ODUwIDs7Ci12ODUwZS0qLSopCQl0YXJnX2VtdWw9djg1MCA7Owotdjg1MGVhLSotKikJCXRhcmdfZW11bD12ODUwIDs7Ci13NjUtKi0qKQkJdGFyZ19lbXVsPXc2NSA7OwotZnIzMC0qLSopCQl0YXJnX2VtdWw9ZWxmMzJmcjMwIDs7Ci1tY29yZS0qLXBlKQkJdGFyZ19lbXVsPW1jb3JlcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1tY29yZS0qLWVsZikJCXRhcmdfZW11bD1lbGYzMm1jb3JlIDs7Ci0qLSotaWVlZSopCQl0YXJnX2VtdWw9dmFuaWxsYSA7OwotCi0qKQotICBlY2hvIDI+JjEgIioqKiBsZCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3Rhcmd9IgotICBlY2hvIDI+JjEgIioqKiBzZWUgbGQvY29uZmlndXJlLnRndCBmb3Igc3VwcG9ydGVkIHRhcmdldHMiCi0gIGV4aXQgMQotCi1lc2FjCmRpZmYgLS1naXQgYS9sZC9kZWZmaWxlLmggYi9sZC9kZWZmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYzcxMGQuLjAwMDAwMDAKLS0tIGEvbGQvZGVmZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIGRlZmZpbGUuaCAtIGhlYWRlciBmb3IgLkRFRiBmaWxlIHBhcnNlcgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBESiBEZWxvcmllIGRqQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBERUZGSUxFX0gKLSNkZWZpbmUgREVGRklMRV9ICi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBERUYgc3RvcmFnZSBkZWZpbml0aW9ucy4gIE5vdGUgdGhhdCBhbnkgb3JkaW5hbCBtYXkgYmUgemVybywgYW5kCi0gICBhbnkgcG9pbnRlciBtYXkgYmUgTlVMTCwgaWYgbm90IGRlZmluZWQgYnkgdGhlIERFRiBmaWxlLiAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9zZWN0aW9uCi0gIHsKLSAgICBjaGFyICpuYW1lOwkJCS8qIGFsd2F5cyBzZXQgKi8KLSAgICBjaGFyICpjbGFzczsJCS8qIG1heSBiZSBOVUxMICovCi0gICAgY2hhciBmbGFnX3JlYWQsIGZsYWdfd3JpdGUsIGZsYWdfZXhlY3V0ZSwgZmxhZ19zaGFyZWQ7Ci0gIH0KLWRlZl9maWxlX3NlY3Rpb247Ci0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlX2V4cG9ydAotICB7Ci0gICAgY2hhciAqbmFtZTsJCQkvKiBhbHdheXMgc2V0ICovCi0gICAgY2hhciAqaW50ZXJuYWxfbmFtZTsJLyogYWx3YXlzIHNldCwgbWF5ID09IG5hbWUgKi8KLSAgICBpbnQgb3JkaW5hbDsJCS8qIC0xIGlmIG5vdCBzcGVjaWZpZWQgKi8KLSAgICBpbnQgaGludDsKLSAgICBjaGFyIGZsYWdfcHJpdmF0ZSwgZmxhZ19jb25zdGFudCwgZmxhZ19ub25hbWUsIGZsYWdfZGF0YTsKLSAgfQotZGVmX2ZpbGVfZXhwb3J0OwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9tb2R1bGUKLSAgewotICAgIHN0cnVjdCBkZWZfZmlsZV9tb2R1bGUgKm5leHQ7Ci0gICAgdm9pZCAqdXNlcl9kYXRhOwotICAgIGNoYXIgbmFtZVsxXTsgLyogZXh0ZW5kZWQgdmlhIG1hbGxvYyAqLwotICB9Ci1kZWZfZmlsZV9tb2R1bGU7Ci0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlX2ltcG9ydAotICB7Ci0gICAgY2hhciAqaW50ZXJuYWxfbmFtZTsJLyogYWx3YXlzIHNldCAqLwotICAgIGRlZl9maWxlX21vZHVsZSAqbW9kdWxlOwkvKiBhbHdheXMgc2V0ICovCi0gICAgY2hhciAqbmFtZTsJCQkvKiBtYXkgYmUgTlVMTDsgZWl0aGVyIHRoaXMgb3Igb3JkaW5hbCB3aWxsIGJlIHNldCAqLwotICAgIGludCBvcmRpbmFsOwkJLyogbWF5IGJlIC0xICovCi0gIH0KLWRlZl9maWxlX2ltcG9ydDsKLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGUKLSAgewotCi0gICAgLyogZnJvbSB0aGUgTkFNRSBvciBMSUJSQVJZIGNvbW1hbmQgKi8KLSAgICBjaGFyICpuYW1lOwotICAgIGludCBpc19kbGw7CQkJLyogLTEgaWYgTkFNRS9MSUJSQVJZIG5vdCBnaXZlbiAqLwotICAgIGJmZF92bWEgYmFzZV9hZGRyZXNzOwkvKiAoYmZkX3ZtYSkoLTEpIGlmIHVuc3BlY2lmaWVkICovCi0KLSAgICAvKiBmcm9tIHRoZSBERVNDUklQVElPTiBjb21tYW5kICovCi0gICAgY2hhciAqZGVzY3JpcHRpb247Ci0KLSAgICAvKiBmcm9tIHRoZSBTVEFDSy9IRUFQIGNvbW1hbmQsIC0xIGlmIHVuc3BlY2lmaWVkICovCi0gICAgaW50IHN0YWNrX3Jlc2VydmUsIHN0YWNrX2NvbW1pdDsKLSAgICBpbnQgaGVhcF9yZXNlcnZlLCBoZWFwX2NvbW1pdDsKLQotICAgIC8qIGZyb20gdGhlIFNFQ1RJT04vU0VHTUVOVCBjb21tYW5kcyAqLwotICAgIGludCBudW1fc2VjdGlvbl9kZWZzOwotICAgIGRlZl9maWxlX3NlY3Rpb24gKnNlY3Rpb25fZGVmczsKLQotICAgIC8qIGZyb20gdGhlIEVYUE9SVFMgY29tbWFuZHMgKi8KLSAgICBpbnQgbnVtX2V4cG9ydHM7Ci0gICAgZGVmX2ZpbGVfZXhwb3J0ICpleHBvcnRzOwotCi0gICAgLyogdXNlZCBieSBpbXBvcnRzIGZvciBtb2R1bGUgbmFtZXMgKi8KLSAgICBkZWZfZmlsZV9tb2R1bGUgKm1vZHVsZXM7Ci0KLSAgICAvKiBmcm9tIHRoZSBJTVBPUlRTIGNvbW1hbmRzICovCi0gICAgaW50IG51bV9pbXBvcnRzOwotICAgIGRlZl9maWxlX2ltcG9ydCAqaW1wb3J0czsKLQotICAgIC8qIGZyb20gdGhlIFZFUlNJT04gY29tbWFuZCwgLTEgaWYgbm90IHNwZWNpZmllZCAqLwotICAgIGludCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yOwotICB9Ci1kZWZfZmlsZTsKLQotZXh0ZXJuIGRlZl9maWxlICpkZWZfZmlsZV9lbXB0eSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIGFkZF90byBtYXkgYmUgTlVMTC4gIElmIG5vdCwgdGhpcyAuZGVmIGlzIGFwcGVuZGVkIHRvIGl0ICovCi1leHRlcm4gZGVmX2ZpbGUgKmRlZl9maWxlX3BhcnNlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9maWxlbmFtZSwKLQkJCQkJIGRlZl9maWxlICogX2FkZF90bykpOwotCi1leHRlcm4gdm9pZCBkZWZfZmlsZV9mcmVlIFBBUkFNUyAoKGRlZl9maWxlICogX2RlZikpOwotCi1leHRlcm4gZGVmX2ZpbGVfZXhwb3J0ICpkZWZfZmlsZV9hZGRfZXhwb3J0IFBBUkFNUyAoKGRlZl9maWxlICogX2RlZiwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqX25hbWUsCi0JCQkJCQkgY29uc3QgY2hhciAqX2ludGVybmFsX25hbWUsCi0JCQkJCQkgICAgIGludCBfb3JkaW5hbCkpOwotCi1leHRlcm4gZGVmX2ZpbGVfaW1wb3J0ICpkZWZfZmlsZV9hZGRfaW1wb3J0IFBBUkFNUyAoKGRlZl9maWxlICogX2RlZiwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqX25hbWUsCi0JCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9mcm9tLAotCQkJCQkJICAgICBpbnQgX29yZGluYWwsCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICpfaW1wb3J0ZWRfbmFtZSkpOwotCi1leHRlcm4gdm9pZCBkZWZfZmlsZV9hZGRfZGlyZWN0aXZlIFBBUkFNUyAoKGRlZl9maWxlICogX2RlZiwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKnBhcmFtLAotCQkJCQkgICAgaW50IGxlbikpOwotCi0jaWZkZWYgREVGX0ZJTEVfUFJJTlQKLWV4dGVybiB2b2lkIGRlZl9maWxlX3ByaW50IFBBUkFNUyAoKEZJTEUgKiBfZmlsZSwKLQkJCQkgICAgZGVmX2ZpbGUgKiBfZGVmKSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIERFRkZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvbGQvZGVmZmlsZXAueSBiL2xkL2RlZmZpbGVwLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MDE2N2IuLjAwMDAwMDAKLS0tIGEvbGQvZGVmZmlsZXAueQorKysgL2Rldi9udWxsCkBAIC0xLDEwMjQgKzAsMCBAQAotJXsgLyogZGVmZmlsZXAueSAtIHBhcnNlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotCi0jZGVmaW5lIFRSQUNFIDAKLQotI2RlZmluZSBST1VORF9VUChhLCBiKSAoKChhKSsoKGIpLTEpKSZ+KChiKS0xKSkKLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsIGV0YyksCi0gICBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcywgc28gd2UgY2FuIGhhdmUgbXVsdGlwbGUKLSAgIHlhY2MgZ2VuZXJhdGVkIHBhcnNlcnMgaW4gbGQuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcwotICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQotICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCi0gICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLwotCi0jZGVmaW5lCXl5bWF4ZGVwdGggZGVmX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJZGVmX3BhcnNlCi0jZGVmaW5lCXl5bGV4CWRlZl9sZXgKLSNkZWZpbmUJeXllcnJvcglkZWZfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCWRlZl9sdmFsCi0jZGVmaW5lCXl5Y2hhcglkZWZfY2hhcgotI2RlZmluZQl5eWRlYnVnCWRlZl9kZWJ1ZwotI2RlZmluZQl5eXBhY3QJZGVmX3BhY3QJCi0jZGVmaW5lCXl5cjEJZGVmX3IxCQkJCi0jZGVmaW5lCXl5cjIJZGVmX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCWRlZl9kZWYJCQotI2RlZmluZQl5eWNoawlkZWZfY2hrCQkKLSNkZWZpbmUJeXlwZ28JZGVmX3BnbwkJCi0jZGVmaW5lCXl5YWN0CWRlZl9hY3QJCQotI2RlZmluZQl5eWV4Y2EJZGVmX2V4Y2EKLSNkZWZpbmUgeXllcnJmbGFnIGRlZl9lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJZGVmX25lcnJzCi0jZGVmaW5lCXl5cHMJZGVmX3BzCi0jZGVmaW5lCXl5cHYJZGVmX3B2Ci0jZGVmaW5lCXl5cwlkZWZfcwotI2RlZmluZQl5eV95eXMJZGVmX3l5cwotI2RlZmluZQl5eXN0YXRlCWRlZl9zdGF0ZQotI2RlZmluZQl5eXRtcAlkZWZfdG1wCi0jZGVmaW5lCXl5dglkZWZfdgotI2RlZmluZQl5eV95eXYJZGVmX3l5dgotI2RlZmluZQl5eXZhbAlkZWZfdmFsCi0jZGVmaW5lCXl5bGxvYwlkZWZfbGxvYwotI2RlZmluZSB5eXJlZHMJZGVmX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwlkZWZfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJZGVmX3l5bGhzCi0jZGVmaW5lIHl5bGVuCWRlZl95eWxlbgotI2RlZmluZSB5eWRlZnJlZCBkZWZfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwlkZWZfeXlkZ290bwotI2RlZmluZSB5eXNpbmRleCBkZWZfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggZGVmX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IGRlZl95eWdpbmRleAotI2RlZmluZSB5eXRhYmxlCSBkZWZfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBkZWZfeXljaGVjawotCi1zdGF0aWMgaW50IGRlZl9sZXggKCk7Ci0KLXN0YXRpYyB2b2lkIGRlZl9kZXNjcmlwdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlZl9leHBvcnRzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZGVmX2hlYXBzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfaW1wb3J0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfbGlicmFyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZGVmX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfc2VjdGlvbl9hbHQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlZl9zdGFja3NpemUgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl92ZXJzaW9uIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfZGlyZWN0aXZlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCBkZWZfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBkZWZfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRlZl9sZXggUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgaW50IGxleF9mb3JjZWRfdG9rZW4gPSAwOwotc3RhdGljIGNvbnN0IGNoYXIgKmxleF9wYXJzZV9zdHJpbmcgPSAwOwotc3RhdGljIGNvbnN0IGNoYXIgKmxleF9wYXJzZV9zdHJpbmdfZW5kID0gMDsKLQotJX0KLQotJXVuaW9uIHsKLSAgY2hhciAqaWQ7Ci0gIGludCBudW1iZXI7Ci19OwotCi0ldG9rZW4gTkFNRSwgTElCUkFSWSwgREVTQ1JJUFRJT04sIFNUQUNLU0laRSwgSEVBUFNJWkUsIENPREUsIERBVEFVLCBEQVRBTAotJXRva2VuIFNFQ1RJT05TLCBFWFBPUlRTLCBJTVBPUlRTLCBWRVJTSU9OSywgQkFTRSwgQ09OU1RBTlRVLCBDT05TVEFOVEwKLSV0b2tlbiBQUklWQVRFVSwgUFJJVkFURUwKLSV0b2tlbiBSRUFEIFdSSVRFIEVYRUNVVEUgU0hBUkVEIE5PTkFNRVUgTk9OQU1FTCBESVJFQ1RJVkUKLSV0b2tlbiA8aWQ+IElECi0ldG9rZW4gPG51bWJlcj4gTlVNQkVSCi0ldHlwZSAgPG51bWJlcj4gb3B0X2Jhc2Ugb3B0X29yZGluYWwKLSV0eXBlICA8bnVtYmVyPiBhdHRyIGF0dHJfbGlzdCBvcHRfbnVtYmVyIGV4cF9vcHRfbGlzdCBleHBfb3B0Ci0ldHlwZSAgPGlkPiBvcHRfbmFtZSBvcHRfZXF1YWxfbmFtZSAKLQotJSUKLQotc3RhcnQ6IHN0YXJ0IGNvbW1hbmQKLQl8IGNvbW1hbmQKLQk7Ci0KLWNvbW1hbmQ6IAotCQlOQU1FIG9wdF9uYW1lIG9wdF9iYXNlIHsgZGVmX25hbWUgKCQyLCAkMyk7IH0KLQl8CUxJQlJBUlkgb3B0X25hbWUgb3B0X2Jhc2UgeyBkZWZfbGlicmFyeSAoJDIsICQzKTsgfQotCXwJREVTQ1JJUFRJT04gSUQgeyBkZWZfZGVzY3JpcHRpb24gKCQyKTt9Ci0JfAlTVEFDS1NJWkUgTlVNQkVSIG9wdF9udW1iZXIgeyBkZWZfc3RhY2tzaXplICgkMiwgJDMpO30KLQl8CUhFQVBTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX2hlYXBzaXplICgkMiwgJDMpO30KLQl8CUNPREUgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCJDT0RFIiwgJDIpO30KLQl8CURBVEFVIGF0dHJfbGlzdCAgeyBkZWZfc2VjdGlvbiAoIkRBVEEiLCAkMik7fQotCXwJU0VDVElPTlMgc2VjbGlzdAotCXwJRVhQT1JUUyBleHBsaXN0IAotCXwJSU1QT1JUUyBpbXBsaXN0Ci0JfAlWRVJTSU9OSyBOVU1CRVIgeyBkZWZfdmVyc2lvbiAoJDIsIDApO30KLQl8CVZFUlNJT05LIE5VTUJFUiAnLicgTlVNQkVSIHsgZGVmX3ZlcnNpb24gKCQyLCAkNCk7fQotCXwJRElSRUNUSVZFIElEIHsgZGVmX2RpcmVjdGl2ZSAoJDIpO30KLQk7Ci0KLQotZXhwbGlzdDoKLQkJLyogRU1QVFkgKi8KLQl8CWV4cGxpbmUKLQl8CWV4cGxpc3QgZXhwbGluZQotCTsKLQotZXhwbGluZToKLQkJLyogVGhlIG9wdF9jb21tYSBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCBib3RoIHRoZSB1c3VhbAotCQkgIERFRiBmaWxlIHN5bnRheCBhcyB3ZWxsIGFzIC5kcmVjdHZlIHN5bnRheCB3aGljaAotCQkgIG1hbmRhdGVzIDxleHBzeW0+LDxleHBvcHRsaXN0Pi4gICovCi0JCUlEIG9wdF9lcXVhbF9uYW1lIG9wdF9vcmRpbmFsIG9wdF9jb21tYSBleHBfb3B0X2xpc3QKLQkJCXsgZGVmX2V4cG9ydHMgKCQxLCAkMiwgJDMsICQ1KTsgfQotCTsKLWV4cF9vcHRfbGlzdDoKLQkJLyogVGhlIG9wdF9jb21tYSBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCBib3RoIHRoZSB1c3VhbAotCQkgICBERUYgZmlsZSBzeW50YXggYXMgd2VsbCBhcyAuZHJlY3R2ZSBzeW50YXggd2hpY2gKLQkJICAgYWxsb3dzIGZvciBjb21tYSBzZXBhcmF0ZWQgb3B0IGxpc3QuICAqLwotCQlleHBfb3B0IG9wdF9jb21tYSBleHBfb3B0X2xpc3QgeyAkJCA9ICQxIHwgJDM7IH0KLQl8CXsgJCQgPSAwOyB9Ci0JOwotZXhwX29wdDoKLQkJTk9OQU1FVQkJeyAkJCA9IDE7IH0KLQl8CU5PTkFNRUwJCXsgJCQgPSAxOyB9Ci0JfAlDT05TVEFOVFUJeyAkJCA9IDI7IH0KLQl8CUNPTlNUQU5UTAl7ICQkID0gMjsgfQotCXwJREFUQVUJCXsgJCQgPSA0OyB9Ci0JfAlEQVRBTAkJeyAkJCA9IDQ7IH0KLQl8CVBSSVZBVEVVCXsgJCQgPSA4OyB9Ci0JfAlQUklWQVRFTAl7ICQkID0gODsgfQotCTsKLWltcGxpc3Q6CQotCQlpbXBsaXN0IGltcGxpbmUKLQl8CWltcGxpbmUKLQk7Ci0KLWltcGxpbmU6Ci0gICAgICAgICAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBJRCAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICQ1LCAkNywgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBOVU1CRVIgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICQ1LCAgMCwgJDcpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICAwLCAkNSwgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIE5VTUJFUiAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICAwLCAgMCwgJDUpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwgJDEsICQzLCAkNSwgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgICAgICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwgJDEsICAwLCAkMywgLTEpOyB9Ci07Ci0KLXNlY2xpc3Q6Ci0JCXNlY2xpc3Qgc2VjbGluZQotCXwJc2VjbGluZQotCTsKLQotc2VjbGluZToKLQlJRCBhdHRyX2xpc3QgeyBkZWZfc2VjdGlvbiAoJDEsICQyKTt9Ci0JfCBJRCBJRCB7IGRlZl9zZWN0aW9uX2FsdCAoJDEsICQyKTt9Ci0JOwotCi1hdHRyX2xpc3Q6Ci0JYXR0cl9saXN0IG9wdF9jb21tYSBhdHRyIHsgJCQgPSAkMSB8ICQzOyB9Ci0JfCBhdHRyIHsgJCQgPSAkMTsgfQotCTsKLQotb3B0X2NvbW1hOgotCScsJwotCXwgCi0JOwotb3B0X251bWJlcjogJywnIE5VTUJFUiB7ICQkPSQyO30KLQl8CSAgIHsgJCQ9LTE7fQotCTsKLQkKLWF0dHI6Ci0JCVJFQUQJeyAkJCA9IDE7fQotCXwJV1JJVEUJeyAkJCA9IDI7fQkKLQl8CUVYRUNVVEUJeyAkJD00O30KLQl8CVNIQVJFRAl7ICQkPTg7fQotCTsKLQotb3B0X25hbWU6IElECQl7ICQkID0gJDE7IH0KLQl8IElEICcuJyBJRAkKLQkgIHsgCi0JICAgIGNoYXIgKiBuYW1lID0geG1hbGxvYyAoc3RybGVuICgkMSkgKyAxICsgc3RybGVuICgkMykgKyAxKTsKLQkgICAgc3ByaW50ZiAobmFtZSwgIiVzLiVzIiwgJDEsICQzKTsKLQkgICAgJCQgPSBuYW1lOwotCSAgfQotCXwJCXsgJCQgPSAiIjsgfQotCTsKLQotb3B0X29yZGluYWw6IAotCSAgJ0AnIE5VTUJFUiAgICAgeyAkJCA9ICQyO30KLQl8ICAgICAgICAgICAgICAgIHsgJCQgPSAtMTt9Ci0JOwotCi1vcHRfZXF1YWxfbmFtZToKLSAgICAgICAgICAnPScgSUQJeyAkJCA9ICQyOyB9Ci0gICAgICAgIHwgCQl7ICQkID0gIDA7IH0JCQkgCi0JOwotCi1vcHRfYmFzZTogQkFTRQknPScgTlVNQkVSCXsgJCQgPSAkMzt9Ci0JfAl7ICQkID0gMDt9Ci0JOwotCi0JCi0KLSUlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgRklMRSAqdGhlX2ZpbGU7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGVmX2ZpbGVuYW1lOwotc3RhdGljIGludCBsaW5lbnVtYmVyOwotc3RhdGljIGRlZl9maWxlICpkZWY7Ci1zdGF0aWMgaW50IHNhd19uZXdsaW5lOwotCi1zdHJ1Y3QgZGlyZWN0aXZlCi0gIHsKLSAgICBzdHJ1Y3QgZGlyZWN0aXZlICpuZXh0OwotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IGxlbjsKLSAgfTsKLQotc3RhdGljIHN0cnVjdCBkaXJlY3RpdmUgKmRpcmVjdGl2ZXMgPSAwOwotCi1kZWZfZmlsZSAqCi1kZWZfZmlsZV9lbXB0eSAoKQotewotICBkZWZfZmlsZSAqcnYgPSAoZGVmX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkZWZfZmlsZSkpOwotICBtZW1zZXQgKHJ2LCAwLCBzaXplb2YgKGRlZl9maWxlKSk7Ci0gIHJ2LT5pc19kbGwgPSAtMTsKLSAgcnYtPmJhc2VfYWRkcmVzcyA9IChiZmRfdm1hKSAoLTEpOwotICBydi0+c3RhY2tfcmVzZXJ2ZSA9IHJ2LT5zdGFja19jb21taXQgPSAtMTsKLSAgcnYtPmhlYXBfcmVzZXJ2ZSA9IHJ2LT5oZWFwX2NvbW1pdCA9IC0xOwotICBydi0+dmVyc2lvbl9tYWpvciA9IHJ2LT52ZXJzaW9uX21pbm9yID0gLTE7Ci0gIHJldHVybiBydjsKLX0KLQotZGVmX2ZpbGUgKgotZGVmX2ZpbGVfcGFyc2UgKGZpbGVuYW1lLCBhZGRfdG8pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBkZWZfZmlsZSAqYWRkX3RvOwotewotICBzdHJ1Y3QgZGlyZWN0aXZlICpkOwotCi0gIHRoZV9maWxlID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOwotICBkZWZfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbGluZW51bWJlciA9IDE7Ci0gIGlmICghdGhlX2ZpbGUpCi0gICAgewotICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChhZGRfdG8pCi0gICAgewotICAgICAgZGVmID0gYWRkX3RvOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRlZiA9IGRlZl9maWxlX2VtcHR5ICgpOwotICAgIH0KLQotICBzYXdfbmV3bGluZSA9IDE7Ci0gIGlmIChkZWZfcGFyc2UgKCkpCi0gICAgewotICAgICAgZGVmX2ZpbGVfZnJlZSAoZGVmKTsKLSAgICAgIGZjbG9zZSAodGhlX2ZpbGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZjbG9zZSAodGhlX2ZpbGUpOwotCi0gIGZvciAoZCA9IGRpcmVjdGl2ZXM7IGQ7IGQgPSBkLT5uZXh0KQotICAgIHsKLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgiQWRkaW5nIGRpcmVjdGl2ZSAlMDh4IGAlcydcbiIsIGQtPm5hbWUsIGQtPm5hbWUpOwotI2VuZGlmCi0gICAgICBkZWZfZmlsZV9hZGRfZGlyZWN0aXZlIChkZWYsIGQtPm5hbWUsIGQtPmxlbik7Ci0gICAgfQotCi0gIHJldHVybiBkZWY7Ci19Ci0KLXZvaWQKLWRlZl9maWxlX2ZyZWUgKGRlZikKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLXsKLSAgaW50IGk7Ci0gIGlmICghZGVmKQotICAgIHJldHVybjsKLSAgaWYgKGRlZi0+bmFtZSkKLSAgICBmcmVlIChkZWYtPm5hbWUpOwotICBpZiAoZGVmLT5kZXNjcmlwdGlvbikKLSAgICBmcmVlIChkZWYtPmRlc2NyaXB0aW9uKTsKLQotICBpZiAoZGVmLT5zZWN0aW9uX2RlZnMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX3NlY3Rpb25fZGVmczsgaSsrKQotCXsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5uYW1lKQotCSAgICBmcmVlIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5uYW1lKTsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5jbGFzcykKLQkgICAgZnJlZSAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpOwotCX0KLSAgICAgIGZyZWUgKGRlZi0+c2VjdGlvbl9kZWZzKTsKLSAgICB9Ci0KLSAgaWYgKGRlZi0+ZXhwb3J0cykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGlmIChkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZQotCSAgICAgICYmIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lICE9IGRlZi0+ZXhwb3J0c1tpXS5uYW1lKQotCSAgICBmcmVlIChkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLm5hbWUpCi0JICAgIGZyZWUgKGRlZi0+ZXhwb3J0c1tpXS5uYW1lKTsKLQl9Ci0gICAgICBmcmVlIChkZWYtPmV4cG9ydHMpOwotICAgIH0KLQotICBpZiAoZGVmLT5pbXBvcnRzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bV9pbXBvcnRzOyBpKyspCi0JewotCSAgaWYgKGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lCi0JICAgICAgJiYgZGVmLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUgIT0gZGVmLT5pbXBvcnRzW2ldLm5hbWUpCi0JICAgIGZyZWUgKGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgIGlmIChkZWYtPmltcG9ydHNbaV0ubmFtZSkKLQkgICAgZnJlZSAoZGVmLT5pbXBvcnRzW2ldLm5hbWUpOwotCX0KLSAgICAgIGZyZWUgKGRlZi0+aW1wb3J0cyk7Ci0gICAgfQotCi0gIHdoaWxlIChkZWYtPm1vZHVsZXMpCi0gICAgewotICAgICAgZGVmX2ZpbGVfbW9kdWxlICptID0gZGVmLT5tb2R1bGVzOwotICAgICAgZGVmLT5tb2R1bGVzID0gZGVmLT5tb2R1bGVzLT5uZXh0OwotICAgICAgZnJlZSAobSk7Ci0gICAgfQotCi0gIGZyZWUgKGRlZik7Ci19Ci0KLSNpZmRlZiBERUZfRklMRV9QUklOVAotdm9pZAotZGVmX2ZpbGVfcHJpbnQgKGZpbGUsIGRlZikKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLXsKLSAgaW50IGk7Ci0gIGZwcmludGYgKGZpbGUsICI+Pj4+IGRlZl9maWxlIGF0IDB4JTA4eFxuIiwgZGVmKTsKLSAgaWYgKGRlZi0+bmFtZSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBuYW1lOiAlc1xuIiwgZGVmLT5uYW1lID8gZGVmLT5uYW1lIDogIih1bnNwZWNpZmllZCkiKTsKLSAgaWYgKGRlZi0+aXNfZGxsICE9IC0xKQotICAgIGZwcmludGYgKGZpbGUsICIgIGlzIGRsbDogJXNcbiIsIGRlZi0+aXNfZGxsID8gInllcyIgOiAibm8iKTsKLSAgaWYgKGRlZi0+YmFzZV9hZGRyZXNzICE9IChiZmRfdm1hKSAoLTEpKQotICAgIGZwcmludGYgKGZpbGUsICIgIGJhc2UgYWRkcmVzczogMHglMDh4XG4iLCBkZWYtPmJhc2VfYWRkcmVzcyk7Ci0gIGlmIChkZWYtPmRlc2NyaXB0aW9uKQotICAgIGZwcmludGYgKGZpbGUsICIgIGRlc2NyaXB0aW9uOiBgJXMnXG4iLCBkZWYtPmRlc2NyaXB0aW9uKTsKLSAgaWYgKGRlZi0+c3RhY2tfcmVzZXJ2ZSAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBzdGFjayByZXNlcnZlOiAweCUwOHhcbiIsIGRlZi0+c3RhY2tfcmVzZXJ2ZSk7Ci0gIGlmIChkZWYtPnN0YWNrX2NvbW1pdCAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBzdGFjayBjb21taXQ6IDB4JTA4eFxuIiwgZGVmLT5zdGFja19jb21taXQpOwotICBpZiAoZGVmLT5oZWFwX3Jlc2VydmUgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgaGVhcCByZXNlcnZlOiAweCUwOHhcbiIsIGRlZi0+aGVhcF9yZXNlcnZlKTsKLSAgaWYgKGRlZi0+aGVhcF9jb21taXQgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgaGVhcCBjb21taXQ6IDB4JTA4eFxuIiwgZGVmLT5oZWFwX2NvbW1pdCk7Ci0KLSAgaWYgKGRlZi0+bnVtX3NlY3Rpb25fZGVmcyA+IDApCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIiAgc2VjdGlvbiBkZWZzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fc2VjdGlvbl9kZWZzOyBpKyspCi0JewotCSAgZnByaW50ZiAoZmlsZSwgIiAgICBuYW1lOiBgJXMnLCBjbGFzczogYCVzJywgZmxhZ3M6IiwKLQkJICAgZGVmLT5zZWN0aW9uX2RlZnNbaV0ubmFtZSwgZGVmLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpOwotCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfcmVhZCkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBSIik7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ193cml0ZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBXIik7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19leGVjdXRlKQotCSAgICBmcHJpbnRmIChmaWxlLCAiIFgiKTsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3NoYXJlZCkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBTIik7Ci0JICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkZWYtPm51bV9leHBvcnRzID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICBleHBvcnRzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGZwcmludGYgKGZpbGUsICIgICAgbmFtZTogYCVzJywgaW50OiBgJXMnLCBvcmRpbmFsOiAlZCwgZmxhZ3M6IiwKLQkJICAgZGVmLT5leHBvcnRzW2ldLm5hbWUsIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lLAotCQkgICBkZWYtPmV4cG9ydHNbaV0ub3JkaW5hbCk7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfcHJpdmF0ZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBQIik7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfY29uc3RhbnQpCi0JICAgIGZwcmludGYgKGZpbGUsICIgQyIpOwotCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5mbGFnX25vbmFtZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBOIik7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfZGF0YSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBEIik7Ci0JICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkZWYtPm51bV9pbXBvcnRzID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICBpbXBvcnRzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1faW1wb3J0czsgaSsrKQotCXsKLQkgIGZwcmludGYgKGZpbGUsICIgICAgaW50OiAlcywgZnJvbTogYCVzJywgbmFtZTogYCVzJywgb3JkaW5hbDogJWRcbiIsCi0JCSAgIGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lLAotCQkgICBkZWYtPmltcG9ydHNbaV0ubW9kdWxlLAotCQkgICBkZWYtPmltcG9ydHNbaV0ubmFtZSwKLQkJICAgZGVmLT5pbXBvcnRzW2ldLm9yZGluYWwpOwotCX0KLSAgICB9Ci0gIGlmIChkZWYtPnZlcnNpb25fbWFqb3IgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgdmVyc2lvbjogJWQuJWRcbiIsIGRlZi0+dmVyc2lvbl9tYWpvciwgZGVmLT52ZXJzaW9uX21pbm9yKTsKLSAgZnByaW50ZiAoZmlsZSwgIjw8PDwgZGVmX2ZpbGUgYXQgMHglMDh4XG4iLCBkZWYpOwotfQotI2VuZGlmCi0KLWRlZl9maWxlX2V4cG9ydCAqCi1kZWZfZmlsZV9hZGRfZXhwb3J0IChkZWYsIGV4dGVybmFsX25hbWUsIGludGVybmFsX25hbWUsIG9yZGluYWwpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNvbnN0IGNoYXIgKmV4dGVybmFsX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci0gICAgIGludCBvcmRpbmFsOwotewotICBkZWZfZmlsZV9leHBvcnQgKmU7Ci0gIGludCBtYXhfZXhwb3J0cyA9IFJPVU5EX1VQKGRlZi0+bnVtX2V4cG9ydHMsIDMyKTsKLSAgaWYgKGRlZi0+bnVtX2V4cG9ydHMgPj0gbWF4X2V4cG9ydHMpCi0gICAgewotICAgICAgbWF4X2V4cG9ydHMgPSBST1VORF9VUChkZWYtPm51bV9leHBvcnRzKzEsIDMyKTsKLSAgICAgIGlmIChkZWYtPmV4cG9ydHMpCi0JZGVmLT5leHBvcnRzID0gKGRlZl9maWxlX2V4cG9ydCAqKSB4cmVhbGxvYyAoZGVmLT5leHBvcnRzLCBtYXhfZXhwb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfZXhwb3J0KSk7Ci0gICAgICBlbHNlCi0JZGVmLT5leHBvcnRzID0gKGRlZl9maWxlX2V4cG9ydCAqKSB4bWFsbG9jIChtYXhfZXhwb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfZXhwb3J0KSk7Ci0gICAgfQotICBlID0gZGVmLT5leHBvcnRzICsgZGVmLT5udW1fZXhwb3J0czsKLSAgbWVtc2V0IChlLCAwLCBzaXplb2YgKGRlZl9maWxlX2V4cG9ydCkpOwotICBpZiAoaW50ZXJuYWxfbmFtZSAmJiAhZXh0ZXJuYWxfbmFtZSkKLSAgICBleHRlcm5hbF9uYW1lID0gaW50ZXJuYWxfbmFtZTsKLSAgaWYgKGV4dGVybmFsX25hbWUgJiYgIWludGVybmFsX25hbWUpCi0gICAgaW50ZXJuYWxfbmFtZSA9IGV4dGVybmFsX25hbWU7Ci0gIGUtPm5hbWUgPSB4c3RyZHVwIChleHRlcm5hbF9uYW1lKTsKLSAgZS0+aW50ZXJuYWxfbmFtZSA9IHhzdHJkdXAgKGludGVybmFsX25hbWUpOwotICBlLT5vcmRpbmFsID0gb3JkaW5hbDsKLSAgZGVmLT5udW1fZXhwb3J0cysrOwotICByZXR1cm4gZTsKLX0KLQotc3RhdGljIGRlZl9maWxlX21vZHVsZSAqCi1kZWZfc3Rhc2hfbW9kdWxlIChkZWYsIG5hbWUpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGRlZl9maWxlX21vZHVsZSAqczsKLSAgZm9yIChzPWRlZi0+bW9kdWxlczsgczsgcz1zLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHMtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICByZXR1cm4gczsKLSAgcyA9IChkZWZfZmlsZV9tb2R1bGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkZWZfZmlsZV9tb2R1bGUpICsgc3RybGVuIChuYW1lKSk7Ci0gIHMtPm5leHQgPSBkZWYtPm1vZHVsZXM7Ci0gIGRlZi0+bW9kdWxlcyA9IHM7Ci0gIHMtPnVzZXJfZGF0YSA9IDA7Ci0gIHN0cmNweSAocy0+bmFtZSwgbmFtZSk7Ci0gIHJldHVybiBzOwotfQotCi1kZWZfZmlsZV9pbXBvcnQgKgotZGVmX2ZpbGVfYWRkX2ltcG9ydCAoZGVmLCBuYW1lLCBtb2R1bGUsIG9yZGluYWwsIGludGVybmFsX25hbWUpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZHVsZTsKLSAgICAgaW50IG9yZGluYWw7Ci0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci17Ci0gIGRlZl9maWxlX2ltcG9ydCAqaTsKLSAgaW50IG1heF9pbXBvcnRzID0gUk9VTkRfVVAoZGVmLT5udW1faW1wb3J0cywgMTYpOwotICBpZiAoZGVmLT5udW1faW1wb3J0cyA+PSBtYXhfaW1wb3J0cykKLSAgICB7Ci0gICAgICBtYXhfaW1wb3J0cyA9IFJPVU5EX1VQKGRlZi0+bnVtX2ltcG9ydHMrMSwgMTYpOwotICAgICAgaWYgKGRlZi0+aW1wb3J0cykKLQlkZWYtPmltcG9ydHMgPSAoZGVmX2ZpbGVfaW1wb3J0ICopIHhyZWFsbG9jIChkZWYtPmltcG9ydHMsIG1heF9pbXBvcnRzICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICAgIGVsc2UKLQlkZWYtPmltcG9ydHMgPSAoZGVmX2ZpbGVfaW1wb3J0ICopIHhtYWxsb2MgKG1heF9pbXBvcnRzICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICB9Ci0gIGkgPSBkZWYtPmltcG9ydHMgKyBkZWYtPm51bV9pbXBvcnRzOwotICBtZW1zZXQgKGksIDAsIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7Ci0gIGlmIChuYW1lKQotICAgIGktPm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgaWYgKG1vZHVsZSkKLSAgICBpLT5tb2R1bGUgPSBkZWZfc3Rhc2hfbW9kdWxlKGRlZiwgbW9kdWxlKTsKLSAgaS0+b3JkaW5hbCA9IG9yZGluYWw7Ci0gIGlmIChpbnRlcm5hbF9uYW1lKQotICAgIGktPmludGVybmFsX25hbWUgPSB4c3RyZHVwIChpbnRlcm5hbF9uYW1lKTsKLSAgZWxzZQotICAgIGktPmludGVybmFsX25hbWUgPSBpLT5uYW1lOwotICBkZWYtPm51bV9pbXBvcnRzKys7Ci0gIHJldHVybiBpOwotfQotCi1zdHJ1Y3QKLXsKLSAgY2hhciAqcGFyYW07Ci0gIGludCB0b2tlbjsKLX0KLWRpcm9wdHNbXSA9Ci17Ci0gIHsgIi1oZWFwIiwgSEVBUFNJWkUgfSwKLSAgeyAiLXN0YWNrIiwgU1RBQ0tTSVpFIH0sCi0gIHsgIi1hdHRyIiwgU0VDVElPTlMgfSwKLSAgeyAiLWV4cG9ydCIsIEVYUE9SVFMgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXZvaWQKLWRlZl9maWxlX2FkZF9kaXJlY3RpdmUgKG15X2RlZiwgcGFyYW0sIGxlbikKLSAgICAgZGVmX2ZpbGUgKm15X2RlZjsKLSAgICAgY29uc3QgY2hhciAqcGFyYW07Ci0gICAgIGludCBsZW47Ci17Ci0gIGRlZl9maWxlICpzYXZlX2RlZiA9IGRlZjsKLSAgY29uc3QgY2hhciAqcGVuZCA9IHBhcmFtICsgbGVuOwotICBjb25zdCBjaGFyICp0ZW5kID0gcGFyYW07Ci0gIGludCBpOwotCi0gIGRlZiA9IG15X2RlZjsKLQotICB3aGlsZSAocGFyYW0gPCBwZW5kKQotICAgIHsKLSAgICAgIHdoaWxlIChwYXJhbSA8IHBlbmQgJiYgaXNzcGFjZSAoKnBhcmFtKSkKLQlwYXJhbSsrOwotICAgICAgZm9yICh0ZW5kID0gcGFyYW0gKyAxOwotCSAgIHRlbmQgPCBwZW5kICYmICEoaXNzcGFjZSAodGVuZFstMV0pICYmICp0ZW5kID09ICctJyk7Ci0JICAgdGVuZCsrKTsKLQotICAgICAgZm9yIChpID0gMDsgZGlyb3B0c1tpXS5wYXJhbTsgaSsrKQotCXsKLQkgIGludCBsZW4gPSBzdHJsZW4gKGRpcm9wdHNbaV0ucGFyYW0pOwotCSAgaWYgKHRlbmQgLSBwYXJhbSA+PSBsZW4KLQkgICAgICAmJiBzdHJuY21wIChwYXJhbSwgZGlyb3B0c1tpXS5wYXJhbSwgbGVuKSA9PSAwCi0JICAgICAgJiYgKHBhcmFtW2xlbl0gPT0gJzonIHx8IHBhcmFtW2xlbl0gPT0gJyAnKSkKLQkgICAgewotCSAgICAgIGxleF9wYXJzZV9zdHJpbmdfZW5kID0gdGVuZDsKLQkgICAgICBsZXhfcGFyc2Vfc3RyaW5nID0gcGFyYW0gKyBsZW4gKyAxOwotCSAgICAgIGxleF9mb3JjZWRfdG9rZW4gPSBkaXJvcHRzW2ldLnRva2VuOwotCSAgICAgIHNhd19uZXdsaW5lID0gMDsKLQkgICAgICBkZWZfcGFyc2UgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghZGlyb3B0c1tpXS5wYXJhbSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZWluZm8gKF8oIldhcm5pbmc6IC5kcmVjdHZlIGAlLipzJyB1bnJlY29nbml6ZWRcbiIpLAotCQkgdGVuZCAtIHBhcmFtLCBwYXJhbSk7Ci0JfQotICAgICAgbGV4X3BhcnNlX3N0cmluZyA9IDA7Ci0gICAgICBwYXJhbSA9IHRlbmQ7Ci0gICAgfQotCi0gIGRlZiA9IHNhdmVfZGVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBQYXJzZXIgQ2FsbGJhY2tzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1kZWZfbmFtZSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIGlmIChkZWYtPm5hbWUpCi0gICAgZnJlZSAoZGVmLT5uYW1lKTsKLSAgZGVmLT5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGRlZi0+YmFzZV9hZGRyZXNzID0gYmFzZTsKLSAgZGVmLT5pc19kbGwgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotZGVmX2xpYnJhcnkgKG5hbWUsIGJhc2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBiYXNlOwotewotICBpZiAoZGVmLT5uYW1lKQotICAgIGZyZWUgKGRlZi0+bmFtZSk7Ci0gIGRlZi0+bmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBkZWYtPmJhc2VfYWRkcmVzcyA9IGJhc2U7Ci0gIGRlZi0+aXNfZGxsID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9kZXNjcmlwdGlvbiAodGV4dCkKLSAgICAgY29uc3QgY2hhciAqdGV4dDsKLXsKLSAgaW50IGxlbiA9IGRlZi0+ZGVzY3JpcHRpb24gPyBzdHJsZW4gKGRlZi0+ZGVzY3JpcHRpb24pIDogMDsKLSAgbGVuICs9IHN0cmxlbiAodGV4dCkgKyAxOwotICBpZiAoZGVmLT5kZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICBkZWYtPmRlc2NyaXB0aW9uID0gKGNoYXIgKikgeHJlYWxsb2MgKGRlZi0+ZGVzY3JpcHRpb24sIGxlbik7Ci0gICAgICBzdHJjYXQgKGRlZi0+ZGVzY3JpcHRpb24sIHRleHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRlZi0+ZGVzY3JpcHRpb24gPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICAgICAgc3RyY3B5IChkZWYtPmRlc2NyaXB0aW9uLCB0ZXh0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfc3RhY2tzaXplIChyZXNlcnZlLCBjb21taXQpCi0gICAgIGludCByZXNlcnZlOwotICAgICBpbnQgY29tbWl0OwotewotICBkZWYtPnN0YWNrX3Jlc2VydmUgPSByZXNlcnZlOwotICBkZWYtPnN0YWNrX2NvbW1pdCA9IGNvbW1pdDsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9oZWFwc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQotICAgICBpbnQgcmVzZXJ2ZTsKLSAgICAgaW50IGNvbW1pdDsKLXsKLSAgZGVmLT5oZWFwX3Jlc2VydmUgPSByZXNlcnZlOwotICBkZWYtPmhlYXBfY29tbWl0ID0gY29tbWl0OwotfQotCi1zdGF0aWMgdm9pZAotZGVmX3NlY3Rpb24gKG5hbWUsIGF0dHIpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBhdHRyOwotewotICBkZWZfZmlsZV9zZWN0aW9uICpzOwotICBpbnQgbWF4X3NlY3Rpb25zID0gUk9VTkRfVVAoZGVmLT5udW1fc2VjdGlvbl9kZWZzLCA0KTsKLSAgaWYgKGRlZi0+bnVtX3NlY3Rpb25fZGVmcyA+PSBtYXhfc2VjdGlvbnMpCi0gICAgewotICAgICAgbWF4X3NlY3Rpb25zID0gUk9VTkRfVVAoZGVmLT5udW1fc2VjdGlvbl9kZWZzKzEsIDQpOwotICAgICAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzKQotCWRlZi0+c2VjdGlvbl9kZWZzID0gKGRlZl9maWxlX3NlY3Rpb24gKikgeHJlYWxsb2MgKGRlZi0+c2VjdGlvbl9kZWZzLCBtYXhfc2VjdGlvbnMgKiBzaXplb2YgKGRlZl9maWxlX2ltcG9ydCkpOwotICAgICAgZWxzZQotCWRlZi0+c2VjdGlvbl9kZWZzID0gKGRlZl9maWxlX3NlY3Rpb24gKikgeG1hbGxvYyAobWF4X3NlY3Rpb25zICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICB9Ci0gIHMgPSBkZWYtPnNlY3Rpb25fZGVmcyArIGRlZi0+bnVtX3NlY3Rpb25fZGVmczsKLSAgbWVtc2V0IChzLCAwLCBzaXplb2YgKGRlZl9maWxlX3NlY3Rpb24pKTsKLSAgcy0+bmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBpZiAoYXR0ciAmIDEpCi0gICAgcy0+ZmxhZ19yZWFkID0gMTsKLSAgaWYgKGF0dHIgJiAyKQotICAgIHMtPmZsYWdfd3JpdGUgPSAxOwotICBpZiAoYXR0ciAmIDQpCi0gICAgcy0+ZmxhZ19leGVjdXRlID0gMTsKLSAgaWYgKGF0dHIgJiA4KQotICAgIHMtPmZsYWdfc2hhcmVkID0gMTsKLQotICBkZWYtPm51bV9zZWN0aW9uX2RlZnMrKzsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9zZWN0aW9uX2FsdCAobmFtZSwgYXR0cikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqYXR0cjsKLXsKLSAgaW50IGF2YWwgPSAwOwotICBmb3IgKDsgKmF0dHI7IGF0dHIrKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCphdHRyKQotCXsKLQljYXNlICdSJzoKLQljYXNlICdyJzoKLQkgIGF2YWwgfD0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1cnOgotCWNhc2UgJ3cnOgotCSAgYXZhbCB8PSAyOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JY2FzZSAneCc6Ci0JICBhdmFsIHw9IDQ7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQljYXNlICdzJzoKLQkgIGF2YWwgfD0gODsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGRlZl9zZWN0aW9uIChuYW1lLCBhdmFsKTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9leHBvcnRzIChleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqZXh0ZXJuYWxfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgaW50IG9yZGluYWw7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgZGVmX2ZpbGVfZXhwb3J0ICpkZmU7Ci0KLSAgaWYgKCFpbnRlcm5hbF9uYW1lICYmIGV4dGVybmFsX25hbWUpCi0gICAgaW50ZXJuYWxfbmFtZSA9IGV4dGVybmFsX25hbWU7Ci0jaWYgVFJBQ0UKLSAgcHJpbnRmICgiZGVmX2V4cG9ydHMsIGV4dD0lcyBpbnQ9JXNcbiIsIGV4dGVybmFsX25hbWUsIGludGVybmFsX25hbWUpOwotI2VuZGlmCi0KLSAgZGZlID0gZGVmX2ZpbGVfYWRkX2V4cG9ydCAoZGVmLCBleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsKTsKLSAgaWYgKGZsYWdzICYgMSkKLSAgICBkZmUtPmZsYWdfbm9uYW1lID0gMTsKLSAgaWYgKGZsYWdzICYgMikKLSAgICBkZmUtPmZsYWdfY29uc3RhbnQgPSAxOwotICBpZiAoZmxhZ3MgJiA0KQotICAgIGRmZS0+ZmxhZ19kYXRhID0gMTsKLSAgaWYgKGZsYWdzICYgOCkKLSAgICBkZmUtPmZsYWdfcHJpdmF0ZSA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfaW1wb3J0IChpbnRlcm5hbF9uYW1lLCBtb2R1bGUsIGRsbGV4dCwgbmFtZSwgb3JkaW5hbCkKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbW9kdWxlOwotICAgICBjb25zdCBjaGFyICpkbGxleHQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBvcmRpbmFsOwotewotICBjaGFyICpidWYgPSAwOwotCi0gIGlmIChkbGxleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG1vZHVsZSkgKyBzdHJsZW4gKGRsbGV4dCkgKyAyKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzLiVzIiwgbW9kdWxlLCBkbGxleHQpOwotICAgICAgbW9kdWxlID0gYnVmOwotICAgIH0KLQotICBkZWZfZmlsZV9hZGRfaW1wb3J0IChkZWYsIG5hbWUsIG1vZHVsZSwgb3JkaW5hbCwgaW50ZXJuYWxfbmFtZSk7Ci0gIGlmIChidWYpCi0gICAgZnJlZSAoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl92ZXJzaW9uIChtYWpvciwgbWlub3IpCi0gICAgIGludCBtYWpvcjsKLSAgICAgaW50IG1pbm9yOwotewotICBkZWYtPnZlcnNpb25fbWFqb3IgPSBtYWpvcjsKLSAgZGVmLT52ZXJzaW9uX21pbm9yID0gbWlub3I7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfZGlyZWN0aXZlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RydWN0IGRpcmVjdGl2ZSAqZCA9IChzdHJ1Y3QgZGlyZWN0aXZlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGRpcmVjdGl2ZSkpOwotICBkLT5uZXh0ID0gZGlyZWN0aXZlczsKLSAgZGlyZWN0aXZlcyA9IGQ7Ci0gIGQtPm5hbWUgPSB4c3RyZHVwIChzdHIpOwotICBkLT5sZW4gPSBzdHJsZW4gKHN0cik7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlZl9lcnJvciAoZXJyKQotICAgICBjb25zdCBjaGFyICplcnI7Ci17Ci0gIGVpbmZvICgiJVA6ICVzOiVkOiAlc1xuIiwgZGVmX2ZpbGVuYW1lLCBsaW5lbnVtYmVyLCBlcnIpOwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIExleGljYWwgU2Nhbm5lcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jdW5kZWYgVFJBQ0UKLSNkZWZpbmUgVFJBQ0UgMAotCi0vKiBOZXZlciBmcmVlZCwgYnV0IGFsd2F5cyByZXVzZWQgYXMgbmVlZGVkLCBzbyBubyByZWFsIGxlYWsgKi8KLXN0YXRpYyBjaGFyICpidWZmZXIgPSAwOwotc3RhdGljIGludCBidWZsZW4gPSAwOwotc3RhdGljIGludCBidWZwdHIgPSAwOwotCi1zdGF0aWMgdm9pZAotcHV0X2J1ZiAoYykKLSAgICAgY2hhciBjOwotewotICBpZiAoYnVmcHRyID09IGJ1ZmxlbikKLSAgICB7Ci0gICAgICBidWZsZW4gKz0gNTA7CQkvKiBvdmVybHkgcmVhc29uYWJsZSwgZWg/ICovCi0gICAgICBpZiAoYnVmZmVyKQotCWJ1ZmZlciA9IChjaGFyICopIHhyZWFsbG9jIChidWZmZXIsIGJ1ZmxlbiArIDEpOwotICAgICAgZWxzZQotCWJ1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKGJ1ZmxlbiArIDEpOwotICAgIH0KLSAgYnVmZmVyW2J1ZnB0cisrXSA9IGM7Ci0gIGJ1ZmZlcltidWZwdHJdID0gMDsJCS8qIG5vdCBvcHRpbWFsLCBidXQgdmVyeSBjb252ZW5pZW50ICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IHRva2VuOwotfQotdG9rZW5zW10gPQotewotICB7ICJCQVNFIiwgQkFTRSB9LAotICB7ICJDT0RFIiwgQ09ERSB9LAotICB7ICJDT05TVEFOVCIsIENPTlNUQU5UVSB9LAotICB7ICJjb25zdGFudCIsIENPTlNUQU5UTCB9LAotICB7ICJEQVRBIiwgREFUQVUgfSwKLSAgeyAiZGF0YSIsIERBVEFMIH0sCi0gIHsgIkRFU0NSSVBUSU9OIiwgREVTQ1JJUFRJT04gfSwKLSAgeyAiRElSRUNUSVZFIiwgRElSRUNUSVZFIH0sCi0gIHsgIkVYRUNVVEUiLCBFWEVDVVRFIH0sCi0gIHsgIkVYUE9SVFMiLCBFWFBPUlRTIH0sCi0gIHsgIkhFQVBTSVpFIiwgSEVBUFNJWkUgfSwKLSAgeyAiSU1QT1JUUyIsIElNUE9SVFMgfSwKLSAgeyAiTElCUkFSWSIsIExJQlJBUlkgfSwKLSAgeyAiTkFNRSIsIE5BTUUgfSwKLSAgeyAiTk9OQU1FIiwgTk9OQU1FVSB9LAotICB7ICJub25hbWUiLCBOT05BTUVMIH0sCi0gIHsgIlBSSVZBVEUiLCBQUklWQVRFVSB9LAotICB7ICJwcml2YXRlIiwgUFJJVkFURUwgfSwKLSAgeyAiUkVBRCIsIFJFQUQgfSwKLSAgeyAiU0VDVElPTlMiLCBTRUNUSU9OUyB9LAotICB7ICJTRUdNRU5UUyIsIFNFQ1RJT05TIH0sCi0gIHsgIlNIQVJFRCIsIFNIQVJFRCB9LAotICB7ICJTVEFDS1NJWkUiLCBTVEFDS1NJWkUgfSwKLSAgeyAiVkVSU0lPTiIsIFZFUlNJT05LIH0sCi0gIHsgIldSSVRFIiwgV1JJVEUgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBpbnQKLWRlZl9nZXRjICgpCi17Ci0gIGludCBydjsKLSAgaWYgKGxleF9wYXJzZV9zdHJpbmcpCi0gICAgewotICAgICAgaWYgKGxleF9wYXJzZV9zdHJpbmcgPj0gbGV4X3BhcnNlX3N0cmluZ19lbmQpCi0JcnYgPSBFT0Y7Ci0gICAgICBlbHNlCi0JcnYgPSAqbGV4X3BhcnNlX3N0cmluZysrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJ2ID0gZmdldGMgKHRoZV9maWxlKTsKLSAgICB9Ci0gIGlmIChydiA9PSAnXG4nKQotICAgIHNhd19uZXdsaW5lID0gMTsKLSAgcmV0dXJuIHJ2OwotfQotCi1zdGF0aWMgaW50Ci1kZWZfdW5nZXRjIChjKQotICAgICBpbnQgYzsKLXsKLSAgaWYgKGxleF9wYXJzZV9zdHJpbmcpCi0gICAgewotICAgICAgbGV4X3BhcnNlX3N0cmluZy0tOwotICAgICAgcmV0dXJuIGM7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIHVuZ2V0YyAoYywgdGhlX2ZpbGUpOwotfQotCi1zdGF0aWMgaW50Ci1kZWZfbGV4ICgpCi17Ci0gIGludCBjLCBpLCBxOwotCi0gIGlmIChsZXhfZm9yY2VkX3Rva2VuKQotICAgIHsKLSAgICAgIGkgPSBsZXhfZm9yY2VkX3Rva2VuOwotICAgICAgbGV4X2ZvcmNlZF90b2tlbiA9IDA7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoImxleDogZm9yY2luZyB0b2tlbiAlZFxuIiwgaSk7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBpOwotICAgIH0KLQotICBjID0gZGVmX2dldGMgKCk7Ci0KLSAgLyogdHJpbSBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKGMgIT0gRU9GICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpICYmIHNhd19uZXdsaW5lKQotICAgIGMgPSBkZWZfZ2V0YyAoKTsKLQotICBpZiAoYyA9PSBFT0YpCi0gICAgewotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IEVPRlxuIik7Ci0jZW5kaWYKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoc2F3X25ld2xpbmUgJiYgYyA9PSAnOycpCi0gICAgewotICAgICAgZG8KLQl7Ci0JICBjID0gZGVmX2dldGMgKCk7Ci0JfQotICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJyk7Ci0gICAgICBpZiAoYyA9PSAnXG4nKQotCXJldHVybiBkZWZfbGV4ICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAvKiBtdXN0IGJlIHNvbWV0aGluZyBlbHNlICovCi0gIHNhd19uZXdsaW5lID0gMDsKLQotICBpZiAoaXNkaWdpdCAoYykpCi0gICAgewotICAgICAgYnVmcHRyID0gMDsKLSAgICAgIHdoaWxlIChjICE9IEVPRiAmJiAoaXN4ZGlnaXQgKGMpIHx8IChjID09ICd4JykpKQotCXsKLQkgIHB1dF9idWYgKGMpOwotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIGlmIChjICE9IEVPRikKLQlkZWZfdW5nZXRjIChjKTsKLSAgICAgIHl5bHZhbC5udW1iZXIgPSBzdHJ0b3VsIChidWZmZXIsIDAsIDApOwotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlcycgcmV0dXJucyBOVU1CRVIgJWRcbiIsIGJ1ZmZlciwgeXlsdmFsLm51bWJlcik7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBOVU1CRVI7Ci0gICAgfQotCi0gIGlmIChpc2FscGhhIChjKSB8fCBzdHJjaHIgKCIkOi1fPyIsIGMpKQotICAgIHsKLSAgICAgIGJ1ZnB0ciA9IDA7Ci0gICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgKGlzYWxudW0gKGMpIHx8IHN0cmNociAoIiQ6LV8/L0AiLCBjKSkpCi0JewotCSAgcHV0X2J1ZiAoYyk7Ci0JICBjID0gZGVmX2dldGMgKCk7Ci0JfQotICAgICAgaWYgKGMgIT0gRU9GKQotCWRlZl91bmdldGMgKGMpOwotICAgICAgZm9yIChpID0gMDsgdG9rZW5zW2ldLm5hbWU7IGkrKykKLQlpZiAoc3RyY21wICh0b2tlbnNbaV0ubmFtZSwgYnVmZmVyKSA9PSAwKQotCSAgewotI2lmIFRSQUNFCi0JICAgIHByaW50ZiAoImxleDogYCVzJyBpcyBhIHN0cmluZyB0b2tlblxuIiwgYnVmZmVyKTsKLSNlbmRpZgotCSAgICByZXR1cm4gdG9rZW5zW2ldLnRva2VuOwotCSAgfQotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlcycgcmV0dXJucyBJRFxuIiwgYnVmZmVyKTsKLSNlbmRpZgotICAgICAgeXlsdmFsLmlkID0geHN0cmR1cCAoYnVmZmVyKTsKLSAgICAgIHJldHVybiBJRDsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykKLSAgICB7Ci0gICAgICBxID0gYzsKLSAgICAgIGMgPSBkZWZfZ2V0YyAoKTsKLSAgICAgIGJ1ZnB0ciA9IDA7Ci0gICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSBxKQotCXsKLQkgIHB1dF9idWYgKGMpOwotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIHl5bHZhbC5pZCA9IHhzdHJkdXAgKGJ1ZmZlcik7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoImxleDogYCVzJyByZXR1cm5zIElEXG4iLCBidWZmZXIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gSUQ7Ci0gICAgfQotCi0gIGlmIChjID09ICc9JyB8fCBjID09ICcuJyB8fCBjID09ICdAJyB8fCBjID09ICcsJykKLSAgICB7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoImxleDogYCVjJyByZXR1cm5zIGl0c2VsZlxuIiwgYyk7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBjOwotICAgIH0KLQotICBpZiAoYyA9PSAnXG4nKQotICAgIHsKLSAgICAgIGxpbmVudW1iZXIrKzsKLSAgICAgIHNhd19uZXdsaW5lID0gMTsKLSAgICB9Ci0KLSAgLypwcmludGYgKCJsZXg6IDB4JTAyeCBpZ25vcmVkXG4iLCBjKTsgKi8KLSAgcmV0dXJuIGRlZl9sZXggKCk7Ci19CmRpZmYgLS1naXQgYS9sZC9kZXAtaW4uc2VkIGIvbGQvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4MGViMC4uMDAwMDAwMAotLS0gYS9sZC9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotL1xcJC9iIGxvb3AKLQotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAU1JDRElSQC8hIWcKLXMhXC5cLi9iZmQvaG9zdHMvW14gXSpcLmggISAhZwotCi1zL1xcXG4gKi8gL2cKLQotcy8gKiQvLwotcy8gICovIC9nCi0vOiQvZAotCi1zL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAotICAvZwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9SRUFETUUgYi9sZC9lbXVscGFyYW1zL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkNmQyNi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSByZWFkIGJ5IGdlbnNjcmlwdHMuc2ggYXMgc2hlbGwgY29tbWFuZHMuCi1UaGV5IHNldCBwYXJhbWV0ZXJzIGZvciB0aGUgZW11bGF0aW9ucy4KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYTI5ay5zaCBiL2xkL2VtdWxwYXJhbXMvYTI5ay5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljOGU4NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2EyOWsuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWEyOWsKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYTI5ay1iaWciCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1hMjlrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FpeHBwYy5zaCBiL2xkL2VtdWxwYXJhbXMvYWl4cHBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlNjg2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYWl4cHBjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1URU1QTEFURV9OQU1FPWFpeAotU0NSSVBUX05BTUU9YWl4Ci1PVVRQVVRfRk9STUFUPSJhaXhjb2ZmLXJzNjAwMCIKLUFSQ0g9cG93ZXJwYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9haXhyczYuc2ggYi9sZC9lbXVscGFyYW1zL2FpeHJzNi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzYzNmNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FpeHJzNi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVEVNUExBVEVfTkFNRT1haXgKLVNDUklQVF9OQU1FPWFpeAotT1VUUFVUX0ZPUk1BVD0iYWl4Y29mZi1yczYwMDAiCi1BUkNIPXJzNjAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hbHBoYS5zaCBiL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTkyM2YuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hbHBoYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotU0NSSVBUX05BTUU9YWxwaGEKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZWFscGhhIgotQVJDSD1hbHBoYQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcmNlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2FyY2VsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjOWMxNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FyY2VsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJjIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFyYyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcmMiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1NQVhQQUdFU0laRT0weDEwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9YXJjCi1NQUNISU5FPQotRU5UUlk9c3RhcnQKLSNURU1QTEFURV9OQU1FPWVsZjMyCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmYTIyZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9ZXBvY3BlCi1PVVRQVVRfRk9STUFUPSJlcG9jLXBlaS1hcm0tbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVwb2MtcGVpLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZXBvYy1wZWktYXJtLWJpZyIKLVRFTVBMQVRFX05BTUU9cGUKLUVOVFJZPSJfbWFpbkNSVFN0YXJ0dXAiCi1TVUJTWVNURU09UEVfREVGX1NVQlNZU1RFTQotSU5JVElBTF9TWU1CT0xfQ0hBUj1cIl9cIgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YWI2ZjEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YXJtYW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtYXJtLWJpZyIKLUhFQURFUl9TVEFSVF9BRERSPTB4ODAwMAotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSRVNTPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0zMjc2OAotQVJDSD1hcm0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGwuc2ggYi9sZC9lbXVscGFyYW1zL2FybWFvdXRsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAxZjMzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFybWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWFybS1saXR0bGUiCi1IRUFERVJfU1RBUlRfQUREUj0weDgwMDAKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUkVTUz0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MzI3NjgKLUFSQ0g9YXJtCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL2FybWNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZGY3ZDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9YXJtY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi1hcm0tbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImNvZmYtYXJtLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJjb2ZmLWFybS1iaWciCi1URU1QTEFURV9OQU1FPWFybWNvZmYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzliNjQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1lbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRFTVBMQVRFX05BTUU9YXJtZWxmCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7JwotCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0KLUFSQ0g9YXJtCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MjU2Ci1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODVlOGJkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ2FybSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1NQVhQQUdFU0laRT0weDgwMDAKLVRFTVBMQVRFX05BTUU9YXJtZWxmCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0KLURBVEFfU1RBUlRfU1lNQk9MUz0nX19kYXRhX3N0YXJ0ID0gLiA7JzsKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLmdsdWVfN3QpICooLmdsdWVfNyknCi1PVEhFUl9CU1NfU1lNQk9MUz0nX19ic3Nfc3RhcnRfXyA9IC47JwotT1RIRVJfQlNTX0VORF9TWU1CT0xTPSdfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsnCi0KLSMgVGhpcyBuZWVkcyB0byBiZSBoaWdoIGVub3VnaCBzbyB0aGF0IHdlIGNhbiBsb2FkIGxkLnNvIGJlbG93IGl0LAotIyB5ZXQgbG93IGVub3VnaCB0byBzdGF5IGF3YXkgZnJvbSB0aGUgbW1hcCBhcmVhIGF0IDB4NDAwMDAwMDAuCi0jIEFsc28sIGl0IGlzIHNtYWxsIGVub3VnaCBzbyB0aGF0IHJlbG9jcyB3aGljaCBhcmUgcG9pbnRpbmcKLSMgYXQgYWJzb2x1dGUgMCB3aWxsIHN0aWxsIGJlIGZpeGVkIHVwLgotVEVYVF9TVEFSVF9BRERSPTB4MDIwMDAwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2ggYi9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQxYjBlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLU1BWFBBR0VTSVpFPTB4ODAwMAotVEVNUExBVEVfTkFNRT1hcm1lbGYKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLQotREFUQV9TVEFSVF9TWU1CT0xTPSdfX2RhdGFfc3RhcnQgPSAuIDsnOwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7JwotCi0jIFRoaXMgbmVlZHMgdG8gYmUgaGlnaCBlbm91Z2ggc28gdGhhdCB3ZSBjYW4gbG9hZCBsZC5zbyBiZWxvdyBpdCwKLSMgeWV0IGxvdyBlbm91Z2ggdG8gc3RheSBhd2F5IGZyb20gdGhlIG1tYXAgYXJlYSBhdCAweDAxMTAwMDAwLgotIyBBbHNvLCBpdCBpcyBzbWFsbCBlbm91Z2ggc28gdGhhdCByZWxvY3Mgd2hpY2ggYXJlIHBvaW50aW5nCi0jIGF0IGFic29sdXRlIDAgd2lsbCBzdGlsbCBiZSBmaXhlZCB1cC4KLSMgVGhlc2UgdmFsdWVzIGdpdmUgdXMgYWJvdXQgMC41TUIgZm9yIGxkLnNvLCAxNi41TUIgZm9yIHVzZXIgCi0jIHByb2dyYW1zLCBhbmQgMTVNQiBmb3IgbW1hcCB3aGljaCBzZWVtcyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZS4KLVRFWFRfU1RBUlRfQUREUj0weDAwMDgwMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2ODMyOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtLW9hYmkiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtLW9hYmkiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtLW9hYmkiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZl9vYWJpCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOycKLSAKLSAKLUFSQ0g9YXJtCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MjU2Ci1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotIAotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1uYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1uYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzI3NzkxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtbmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtYXJtLW5ldGJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPWFybQotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtcGUuc2ggYi9sZC9lbXVscGFyYW1zL2FybXBlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdjOWRlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtcGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFSQ0g9YXJtCi1TQ1JJUFRfTkFNRT1wZQotT1VUUFVUX0ZPUk1BVD0icGVpLWFybS1saXR0bGUiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0icGVpLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0icGVpLWFybS1iaWciCi1URU1QTEFURV9OQU1FPXBlCi1FTlRSWT0iX21haW5DUlRTdGFydHVwIgotU1VCU1lTVEVNPVBFX0RFRl9TVUJTWVNURU0KLUlOSVRJQUxfU1lNQk9MX0NIQVI9XCJfXCIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXZyMTIwMC5zaCBiL2xkL2VtdWxwYXJhbXMvYXZyMTIwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4MzNhZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2F2cjEyMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1BUkNIPWF2cjoxCi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmMzJhdnIKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWF2ciIKLU1BWFBBR0VTSVpFPTEKLUVNQkVEREVEPXllcwotVEVNUExBVEVfTkFNRT1nZW5lcmljCi0KLVRFWFRfTEVOR1RIPTFLCi1EQVRBX0xFTkdUSD0wCi1FRVBST01fTEVOR1RIPTY0CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2F2cjIzeHguc2ggYi9sZC9lbXVscGFyYW1zL2F2cjIzeHguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTQ1ZGYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hdnIyM3h4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotQVJDSD1hdnI6MgotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZjMyYXZyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1hdnIiCi1NQVhQQUdFU0laRT0xCi1FTUJFRERFRD15ZXMKLVRFTVBMQVRFX05BTUU9Z2VuZXJpYwotCi1URVhUX0xFTkdUSD0ySwotREFUQV9MRU5HVEg9MTI4Ci1FRVBST01fTEVOR1RIPTEyOAotCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2F2cjQ0MzMuc2ggYi9sZC9lbXVscGFyYW1zL2F2cjQ0MzMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWEyMDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hdnI0NDMzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotQVJDSD1hdnI6MgotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZjMyYXZyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1hdnIiCi1NQVhQQUdFU0laRT0xCi1FTUJFRERFRD15ZXMKLVRFTVBMQVRFX05BTUU9Z2VuZXJpYwotCi1URVhUX0xFTkdUSD00SwotREFUQV9MRU5HVEg9MTI4Ci1FRVBST01fTEVOR1RIPTI1NgotCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2F2cjQ0eDQuc2ggYi9sZC9lbXVscGFyYW1zL2F2cjQ0eDQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzZhZWMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hdnI0NHg0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotQVJDSD1hdnI6MgotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZjMyYXZyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1hdnIiCi1NQVhQQUdFU0laRT0xCi1FTUJFRERFRD15ZXMKLVRFTVBMQVRFX05BTUU9Z2VuZXJpYwotCi1URVhUX0xFTkdUSD00SwotREFUQV9MRU5HVEg9MjU2Ci1FRVBST01fTEVOR1RIPTI1NgotCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2F2cjg1eHguc2ggYi9sZC9lbXVscGFyYW1zL2F2cjg1eHguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjM5NzkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hdnI4NXh4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotQVJDSD1hdnI6MgotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZjMyYXZyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1hdnIiCi1NQVhQQUdFU0laRT0xCi1FTUJFRERFRD15ZXMKLVRFTVBMQVRFX05BTUU9Z2VuZXJpYwotCi1URVhUX0xFTkdUSD04SwotREFUQV9MRU5HVEg9NTEyCi1FRVBST01fTEVOR1RIPTUxMgotCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2F2cm1lZ2ExMDMuc2ggYi9sZC9lbXVscGFyYW1zL2F2cm1lZ2ExMDMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjdlOGIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hdnJtZWdhMTAzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotQVJDSD1hdnI6MwotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZjMyYXZyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1hdnIiCi1NQVhQQUdFU0laRT0xCi1FTUJFRERFRD15ZXMKLVRFTVBMQVRFX05BTUU9Z2VuZXJpYwotCi1URVhUX0xFTkdUSD0xMjhLCi1EQVRBX0xFTkdUSD00SwotRUVQUk9NX0xFTkdUSD00SwotCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2F2cm1lZ2ExNjEuc2ggYi9sZC9lbXVscGFyYW1zL2F2cm1lZ2ExNjEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTk4OTIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hdnJtZWdhMTYxLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotQVJDSD1hdnI6NAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZjMyYXZyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1hdnIiCi1NQVhQQUdFU0laRT0xCi1FTUJFRERFRD15ZXMKLVRFTVBMQVRFX05BTUU9Z2VuZXJpYwotCi1URVhUX0xFTkdUSD0xNksKLURBVEFfTEVOR1RIPTFLCi1FRVBST01fTEVOR1RIPTUxMgotCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2F2cm1lZ2E2MDMuc2ggYi9sZC9lbXVscGFyYW1zL2F2cm1lZ2E2MDMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiN2QxNGIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hdnJtZWdhNjAzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotQVJDSD1hdnI6MwotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZjMyYXZyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1hdnIiCi1NQVhQQUdFU0laRT0xCi1FTUJFRERFRD15ZXMKLVRFTVBMQVRFX05BTUU9Z2VuZXJpYwotCi1URVhUX0xFTkdUSD02NEsKLURBVEFfTEVOR1RIPTRLCi1FRVBST01fTEVOR1RIPTJLCi0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaCBiL2xkL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmODUyYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPXNwYXJjY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi1zcGFyYyIKLSMgZm9sbG93aW5nIGFyZSBkdWJpb3VzIChib3Jyb3dlZCBmcm9tIHNwYXJjIGx5bngpCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZDEwdmVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvZDEwdmVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjNDIxNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QxMHZlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMTB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMTB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDEwMDAwMDAKLVJFQURPTkxZX1NUQVJUX0FERFI9MHgwMjAwMDAwNAotQVJDSD1kMTB2Ci1NQVhQQUdFU0laRT0zMgotRU1CRURERUQ9dAotVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2X2Uuc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZfZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhYjVhMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QzMHZfZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMzB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMzB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDAwMDAwMDAKLURBVEFfU1RBUlRfQUREUj0weDIwMDAwMDAwCi1FTUVNX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotU1RBQ0tfU1RBUlRfQUREUj0weDIwMDA4MDAwCi1FSVRfU1RBUlRfQUREUj0weGZmZmZmMDIwCi1URVhUX1NJWkU9NjRLCi1EQVRBX1NJWkU9MzJLCi1FTUVNX1NJWkU9OE0KLUVJVF9TSVpFPTMyMAotVEVYVF9NRU1PUlk9ZW1lbQotREFUQV9NRU1PUlk9ZW1lbQotQlNTX01FTU9SWT1lbWVtCi1URVhUX0RFRl9TRUNUSU9OPSIiCi1EQVRBX0RFRl9TRUNUSU9OPSIiCi1FTUVNX0RFRl9TRUNUSU9OPSIocnd4KSIKLUFSQ0g9ZDMwdgotRU1CRURERUQ9dApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2X28uc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZfby5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiY2I0Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QzMHZfby5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMzB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMzB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDAwMDAwMDAKLURBVEFfU1RBUlRfQUREUj0weDIwMDAwMDAwCi1FTUVNX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotU1RBQ0tfU1RBUlRfQUREUj0weDIwMDA4MDAwCi1FSVRfU1RBUlRfQUREUj0weGZmZmZmMDIwCi1URVhUX1NJWkU9NjRLCi1EQVRBX1NJWkU9MzJLCi1FTUVNX1NJWkU9OE0KLUVJVF9TSVpFPTMyMAotVEVYVF9NRU1PUlk9dGV4dAotREFUQV9NRU1PUlk9ZGF0YQotQlNTX01FTU9SWT1kYXRhCi1URVhUX0RFRl9TRUNUSU9OPSIoeCkiCi1EQVRBX0RFRl9TRUNUSU9OPSIocncpIgotRU1FTV9ERUZfU0VDVElPTj0iIgotQVJDSD1kMzB2Ci1FTUJFRERFRD10CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2QzMHZlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OWRlNzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kMzB2ZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZmQzMHYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWQzMHYiCi1URVhUX1NUQVJUX0FERFI9MHgwMDAwMDAwMAotREFUQV9TVEFSVF9BRERSPTB4MjAwMDAwMDAKLUVNRU1fU1RBUlRfQUREUj0weDgwMDAwMDAwCi1TVEFDS19TVEFSVF9BRERSPTB4MjAwMDgwMDAKLUVJVF9TVEFSVF9BRERSPTB4ZmZmZmYwMjAKLVRFWFRfU0laRT0yMDAwSwotREFUQV9TSVpFPTIwMDBLCi1FTUVNX1NJWkU9OE0KLUVJVF9TSVpFPTMyMAotVEVYVF9NRU1PUlk9dGV4dAotREFUQV9NRU1PUlk9ZGF0YQotQlNTX01FTU9SWT1kYXRhCi1URVhUX0RFRl9TRUNUSU9OPSIoeCkiCi1EQVRBX0RFRl9TRUNUSU9OPSIocncpIgotRU1FTV9ERUZfU0VDVElPTj0iIgotQVJDSD1kMzB2Ci1FTUJFRERFRD10CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2RlbHRhNjguc2ggYi9sZC9lbXVscGFyYW1zL2RlbHRhNjguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzU5MDkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kZWx0YTY4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1kZWx0YTY4Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGstc3lzdiIKLVRFWFRfU1RBUlRfQUREUj0weDIwMDAKLVBBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lYm1vbjI5ay5zaCBiL2xkL2VtdWxwYXJhbXMvZWJtb24yOWsuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzJiZDEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lYm1vbjI5ay5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWJtb24yOWsKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYTI5ay1iaWciCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1hMjlrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWMzZmEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMl9pOTYwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWk5NjAiCi1BUkNIPWk5NjAKLU1BQ0hJTkU9Ci1URVhUX1NUQVJUX0FERFI9MAotRU1CRURERUQ9eWVzCi1NQVhQQUdFU0laRT0weDIwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUyMzI2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXNwYXJjIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1BTElHTk1FTlQ9OAotQVJDSD1zcGFyYwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLURBVEFfUExUPQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY4ZDk4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHhhMDAyMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19EWU5BTUlDX0xJTksgPSAwOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1EWU5BTUlDX0xJTks9ZmFsc2UKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYzQxMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLVRFWFRfRFlOQU1JQz0KLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwbjMyLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2ZjQyYTkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jIFRoaXMgaXMgYW4gRUxGIHBsYXRmb3JtLgotU0NSSVBUX05BTUU9ZWxmCi0KLSMgSGFuZGxlIGJvdGggYmlnLSBhbmQgbGl0dGxlLWVuZGVkIDMyLWJpdCBNSVBTIG9iamVjdHMuCi1BUkNIPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotCi1URU1QTEFURV9OQU1FPWVsZjMyCi0KLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAwMAotRU5UUlk9X19zdGFydAotCi0jIEdPVC1yZWxhdGVkIHNldHRpbmdzLiAgCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0gIC5zcmRhdGEgOiB7ICooLnNyZGF0YSkgfQotJwotCi0jIE1hZ2ljIHN5bWJvbHMuCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi0jIElSSVg2IGRlZmluZXMgdGhlc2Ugc3ltYm9scy4gIDB4MzQgaXMgdGhlIHNpemUgb2YgdGhlIEVMRiBoZWFkZXIuCi1FWEVDVVRBQkxFX1NZTUJPTFM9IgotICBfX2Rzb19kaXNwbGFjZW1lbnQgPSAwOwotICBfX2VsZl9oZWFkZXIgPSAke1RFWFRfU1RBUlRfQUREUn07Ci0gIF9fcHJvZ3JhbV9oZWFkZXJfdGFibGUgPSAke1RFWFRfU1RBUlRfQUREUn0gKyAweDM0OwotIgotCi0jIFRoZXJlIGFyZSBvZnRlbiBkeW5hbWljIHJlbG9jYXRpb25zIGFnYWluc3QgdGhlIC5yb2RhdGEgc2VjdGlvbi4KLSMgU2V0dGluZyBEVF9URVhUUkVMIGluIHRoZSAuZHluYW1pYyBzZWN0aW9uIGRvZXMgbm90IGNvbnZpbmNlIHRoZQotIyBJUklYNiBsaW5rZXIgdG8gcGVybWl0IHJlbG9jYXRpb25zIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudC4KLSMgRm9sbG93aW5nIHRoZSBJUklYIGxpbmtlciwgd2Ugc2ltcGx5IHB1dCAucm9kYXRhIGluIHRoZSBkYXRhCi0jIHNlZ21lbnQuCi1XUklUQUJMRV9ST0RBVEE9Ci0KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9JwotICAuTUlQUy5ldmVudHMudGV4dCA6Ci0gICAgewotICAgICAgICooLk1JUFMuZXZlbnRzLnRleHQpCi0gICAgICAgKiguTUlQUy5ldmVudHMuZ251LmxpbmtvbmNlLnQqKQotICAgIH0KLSAgLk1JUFMuY29udGVudC50ZXh0IDogCi0gICAgewotICAgICAgICooLk1JUFMuY29udGVudC50ZXh0KQotICAgICAgICooLk1JUFMuY29udGVudC5nbnUubGlua29uY2UudCopCi0gICAgfQotICAuTUlQUy5ldmVudHMuZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5kYXRhKQotICAgICAgICooLk1JUFMuZXZlbnRzLmdudS5saW5rb25jZS5kKikKLSAgICB9Ci0gIC5NSVBTLmNvbnRlbnQuZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZGF0YSkKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZ251LmxpbmtvbmNlLmQqKQotICAgIH0KLSAgLk1JUFMuZXZlbnRzLnJvZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5yb2RhdGEpCi0gICAgICAgKiguTUlQUy5ldmVudHMuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLSAgLk1JUFMuY29udGVudC5yb2RhdGEgOiAKLSAgICB7Ci0gICAgICAgKiguTUlQUy5jb250ZW50LnJvZGF0YSkKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmMTMwNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1URVhUX0RZTkFNSUM9Ci1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTlRSWT1fX3N0YXJ0CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZWE4ZmQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDA4YzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZnIzMC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYmUxZjUzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZnIzMCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1BUkNIPWZyMzAKLU1BWFBBR0VTSVpFPTI1NgotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLU5PUD0weDlmYTAKLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9J1BST1ZJREUgKF9fc3RhY2sgPSAweDIwMDAwMCk7JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJpMzcwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmkzNzAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZDVkODUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmkzNzAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLVNDUklQVF9OQU1FPWVsZmkzNzAKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzNzAiCi1URVhUX1NUQVJUX0FERFI9MHgwMTgwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotQVJDSD1pMzcwCi1NQUNISU5FPQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBkZTg4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHhhMDAyMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19EWU5BTUlDX0xJTksgPSAwOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1EWU5BTUlDX0xJTks9ZmFsc2UKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybG1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzMTJmNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybG1pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLVRFWFRfRFlOQU1JQz0KLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmZjNjEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLVNDUklQVF9OQU1FPWVsZnBwYwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwY2xlIgotVEVYVF9TVEFSVF9BRERSPTB4NDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLUFSQ0g9cG93ZXJwYwotTUFDSElORT0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkYzhhMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1URVhUX0RZTkFNSUM9Ci1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTlRSWT1fX3N0YXJ0CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjdiOGMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tY29yZS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbWNvcmUtYmlnIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLW1jb3JlLWxpdHRsZSIKLVBBR0VfU0laRT0weDEwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHg0MDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCi1BUkNIPW1jb3JlCi1FTUJFRERFRD15ZXMKLQotIyBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgTk9QIHZhbHVlIC0gaXQgbXVzdCB3b3JrIGZvciBib3RoCi0jIGJpZyBlbmRpYW4gYW5kIGxpdHRsZSBlbmRpYW4gc3lzdGVtcy4gIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMKLSMgbm8gc3ltbWV0cmljYWwgbWNvcmUgb3Bjb2RlIHRoYXQgZnVuY3Rpb25zIGFzIGEgbm9vcC4gIFRoZQotIyBjaG9zZW4gc29sdXRpb24gaXMgdG8gdXNlICJ0c3QgcjAsIHIxNCIuICBUaGlzIGlzIGEgc3ltZXRyaWNhbAotIyB2YWx1ZSwgYW5kIGFwYXJ0IGZyb20gdGhlIGNvcnJ1cHRpb24gb2YgdGhlIEMgYml0LCBpdCBoYXMgbm8gb3RoZXIKLSMgc2lkZSBlZmZlY3RzLiAgU2luY2UgdGhlIGNhcnJ5IGJpdCBpcyBuZXZlciB0ZXN0ZWQgd2l0aG91dCBiZWluZwotIyBleHBsaWNpdGx5IHNldCBmaXJzdCwgYW5kIHNpbmNlIHRoZSBOT1AgY29kZSBpcyBvbmx5IHVzZWQgYXMgYQotIyBmaWxsIHZhbHVlIGJldHdlZW4gaW5kZXBlbmRhbnRseSB2aWFibGUgcGVpY2VzIG9mIGNvZGUsIGl0IHNob3VsZAotIyBub3QgbWF0dGVyLgotTk9QPTB4MGUwZQotCi1PVEhFUl9CU1NfU1lNQk9MUz0iX19ic3Nfc3RhcnRfXyA9IC4gOyIKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0iX19ic3NfZW5kX18gPSAuIDsiCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKLQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotCi0jIFRoaXMgY29kZSBnZXRzIGluc2VydGVkIGludG8gdGhlIGdlbmVyaWMgZWxmMzIuc2MgbGlua2VyIHNjcmlwdAotIyBhbmQgYWxsb3dzIHVzIHRvIGRlZmluZSBvdXIgb3duIGNvbW1hbmQgbGluZSBzd2l0Y2hlcy4KLVBBUlNFX0FORF9MSVNUX0FSR1M9JwotCi0jZGVmaW5lIE9QVElPTl9CQVNFX0ZJTEUJCTMwMAotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9GSUxFfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotc3RhdGljIHZvaWQKLWdsZF9lbGYzMm1jb3JlX2xpc3Rfb3B0aW9ucyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1iYXNlX2ZpbGUgPGJhc2VmaWxlPiAgICAgIEdlbmVyYXRlIGEgYmFzZSBmaWxlIGZvciByZWxvY2F0YWJsZSBETExzXG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWdsZF9lbGYzMm1jb3JlX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0gIGludCAgICAgICAgbG9uZ2luZDsKLSAgaW50ICAgICAgICBvcHRjOwotICBpbnQgICAgICAgIHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCAgICAgICAgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50ICAgICAgICB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICAKLSAgd2FudGVycm9yICA9IG9wdGVycjsKLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjICAgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmIGxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfRklMRToKLSAgICAgIGxpbmtfaW5mby5iYXNlX2ZpbGUgPSAoUFRSKSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XQik7Ci0gICAgICBpZiAobGlua19pbmZvLmJhc2VfZmlsZSA9PSBOVUxMKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW5ub3Qgb3BlbiBiYXNlIGZpbGUgJXNcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7Ci0JICB4ZXhpdCAoMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMycHBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTM4ODBjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLVNDUklQVF9OQU1FPWVsZnBwYwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwYyIKLVRFWFRfU1RBUlRfQUREUj0weDAxODAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAwCi1BUkNIPXBvd2VycGMKLU1BQ0hJTkU9CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTZjN2IuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMnBwY2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1TQ1JJUFRfTkFNRT1lbGZwcGMKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXBvd2VycGMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwMAotQVJDSD1wb3dlcnBjCi1NQUNISU5FPQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYjJlNGYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotRUxGU0laRT02NAotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmNjQtc3BhcmMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAKLUFSQ0g9InNwYXJjOnY5IgotTUFDSElORT0KLURBVEFfUExUPQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotTk9QPTB4MDEwMDAwMDAKLQotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF07IHRoZW4KLSAgY2FzZSAiICRFTVVMQVRJT05fTElCUEFUSCAiIGluCi0gICAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi0gICAgICAjIE5hdGl2ZSwgYW5kIGRlZmF1bHQgb3IgZW11bGF0aW9uIHJlcXVlc3RpbmcgTElCX1BBVEguCi0KLSAgICAgICMgTGludXggYW5kIFNvbGFyaXMgbW9kaWZ5IHRoZSBkZWZhdWx0IGxpYnJhcnkgc2VhcmNoIHBhdGgKLSAgICAgICMgdG8gZmlyc3QgaW5jbHVkZSBhIDY0LWJpdCBzcGVjaWZpYyBkaXJlY3RvcnkuICBJdCdzIHB1dAotICAgICAgIyBpbiBzbGlnaHRseSBkaWZmZXJlbnQgcGxhY2VzIG9uIHRoZSB0d28gc3lzdGVtcy4KLSAgICAgIGNhc2UgIiR0YXJnZXQiIGluCi0gICAgICAgIHNwYXJjKi1saW51eCopCi0gICAgICAgICAgc3VmZml4PTY0IDs7Ci0gICAgICAgIHNwYXJjKi1zb2xhcmlzKikKLSAgICAgICAgICBzdWZmaXg9L3NwYXJjdjkgOzsKLSAgICAgIGVzYWMKLQotICAgICAgaWYgWyAtbiAiJHtzdWZmaXh9IiBdOyB0aGVuCi0KLQlMSUJfUEFUSD0vbGliJHtzdWZmaXh9Oi9saWIKLQlMSUJfUEFUSD0ke0xJQl9QQVRIfTovdXNyL2xpYiR7c3VmZml4fTovdXNyL2xpYgotCWlmIFsgLW4gIiR7TkFUSVZFX0xJQl9ESVJTfSIgXTsgdGhlbgotCSAgTElCX1BBVEg9JHtMSUJfUEFUSH06YGVjaG8gJHtOQVRJVkVfTElCX0RJUlN9IHwgc2VkIHMvOi8ke3N1ZmZpeH06L2dgJHtzdWZmaXh9OiR7TkFUSVZFX0xJQl9ESVJTfQotCWZpCi0JaWYgWyAiJHtsaWJkaXJ9IiAhPSAvdXNyL2xpYiBdOyB0aGVuCi0JICBMSUJfUEFUSD0ke0xJQl9QQVRIfToke2xpYmRpcn0ke3N1ZmZpeH06JHtsaWJkaXJ9Ci0JZmkKLQlpZiBbICIke2xpYmRpcn0iICE9IC91c3IvbG9jYWwvbGliIF07IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9Oi91c3IvbG9jYWwvbGliJHtzdWZmaXh9Oi91c3IvbG9jYWwvbGliCi0JZmkKLQotICAgICAgZmkKLSAgICA7OwotICBlc2FjCi1maQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoIGIvbGQvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmEyMWYyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUVOVFJZPV9fc3RhcnQKLVNDUklQVF9OQU1FPWVsZgotRUxGU0laRT02NAotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmNjQtYWxwaGEiCi1URVhUX1NUQVJUX0FERFI9IjB4MTIwMDAwMDAwIgotTUFYUEFHRVNJWkU9MHgxMDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0iMHgxMjAwMDAwMDAiCi1BUkNIPWFscGhhCi1NQUNISU5FPQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotREFUQV9QTFQ9Ci1OT1A9MHg0N2ZmMDQxZgotCi1PVEhFUl9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjY0Ym1pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmNjRibWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDg1MmQ1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmNjRibWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyBUaGlzIGlzIGFuIEVMRiBwbGF0Zm9ybS4KLVNDUklQVF9OQU1FPWVsZgotCi0jIEhhbmRsZSBib3RoIGJpZy0gYW5kIGxpdHRsZS1lbmRlZCAzMi1iaXQgTUlQUyBvYmplY3RzLgotQVJDSD1taXBzCi1PVVRQVVRfRk9STUFUPSJlbGY2NC1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjY0LWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmNjQtbGl0dGxlbWlwcyIKLQotIyBOb3RlIHRoYXQgdGhlIGVsZjMyIHRlbXBsYXRlIGlzIHVzZWQgZm9yIDY0LWJpdCBlbXVsYXRpb25zIGFzIHdlbGwgCi0jIGFzIDMyLWJpdCBlbXVsYXRpb25zLgotRUxGU0laRT02NAotVEVNUExBVEVfTkFNRT1lbGYzMgotCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwMDAKLUVOVFJZPV9fc3RhcnQKLQotIyBHT1QtcmVsYXRlZCBzZXR0aW5ncy4gIAotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotICAuc3JkYXRhIDogeyAqKC5zcmRhdGEpIH0KLScKLQotIyBNYWdpYyBzeW1ib2xzLgotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotIyBJUklYNiBkZWZpbmVzIHRoZXNlIHN5bWJvbHMuICAweDQwIGlzIHRoZSBzaXplIG9mIHRoZSBFTEYgaGVhZGVyLgotRVhFQ1VUQUJMRV9TWU1CT0xTPSIKLSAgX19kc29fZGlzcGxhY2VtZW50ID0gMDsKLSAgX19lbGZfaGVhZGVyID0gJHtURVhUX1NUQVJUX0FERFJ9OwotICBfX3Byb2dyYW1faGVhZGVyX3RhYmxlID0gJHtURVhUX1NUQVJUX0FERFJ9ICsgMHg0MDsKLSIKLQotIyBUaGVyZSBhcmUgb2Z0ZW4gZHluYW1pYyByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZSAucm9kYXRhIHNlY3Rpb24uCi0jIFNldHRpbmcgRFRfVEVYVFJFTCBpbiB0aGUgLmR5bmFtaWMgc2VjdGlvbiBkb2VzIG5vdCBjb252aW5jZSB0aGUKLSMgSVJJWDYgbGlua2VyIHRvIHBlcm1pdCByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZSB0ZXh0IHNlZ21lbnQuCi0jIEZvbGxvd2luZyB0aGUgSVJJWCBsaW5rZXIsIHdlIHNpbXBseSBwdXQgLnJvZGF0YSBpbiB0aGUgZGF0YQotIyBzZWdtZW50LgotV1JJVEFCTEVfUk9EQVRBPQotCi0KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9JwotICAuTUlQUy5ldmVudHMudGV4dCA6Ci0gICAgewotICAgICAgICooLk1JUFMuZXZlbnRzLnRleHQpCi0gICAgICAgKiguTUlQUy5ldmVudHMuZ251LmxpbmtvbmNlLnQqKQotICAgIH0KLSAgLk1JUFMuY29udGVudC50ZXh0IDogCi0gICAgewotICAgICAgICooLk1JUFMuY29udGVudC50ZXh0KQotICAgICAgICooLk1JUFMuY29udGVudC5nbnUubGlua29uY2UudCopCi0gICAgfQotICAuTUlQUy5ldmVudHMuZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5kYXRhKQotICAgICAgICooLk1JUFMuZXZlbnRzLmdudS5saW5rb25jZS5kKikKLSAgICB9Ci0gIC5NSVBTLmNvbnRlbnQuZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZGF0YSkKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZ251LmxpbmtvbmNlLmQqKQotICAgIH0KLSAgLk1JUFMuZXZlbnRzLnJvZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5yb2RhdGEpCi0gICAgICAgKiguTUlQUy5ldmVudHMuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLSAgLk1JUFMuY29udGVudC5yb2RhdGEgOiAKLSAgICB7Ci0gICAgICAgKiguTUlQUy5jb250ZW50LnJvZGF0YSkKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmNjRocHBhLnNoIGIvbGQvZW11bHBhcmFtcy9lbGY2NGhwcGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyOWFkNDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGY2NGhwcGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLUVMRlNJWkU9NjQKLU9VVFBVVF9GT1JNQVQ9ImVsZjY0LWhwcGEiCi1MSUJfUEFUSD0vdXNyL2xpYi9wYTIwXzY0Oi9vcHQvbGFuZ3Rvb2xzL2xpYi9wYTIwXzY0Ci1URVhUX1NUQVJUX0FERFI9MHg0MDAwMDAwMDAwMDAxMDAwCi1EQVRBX0FERFI9MHg4MDAwMDAwMDAwMDAxMDAwCi0KLSMgVGhlIEhQIGR5bmFtaWMgbGlua2VyIGFjdHVhbGx5IHJlcXVpcmVzIHlvdSBzZXQgdGhlIHN0YXJ0IG9mIHRleHQgYW5kCi0jIGRhdGEgdG8gc29tZSByZWFzb25hYmxlIHZhbHVlLiAgT2YgY291cnNlIG5vYm9keSBrbm93cyB3aGF0IHJlYXNvYW5ibGUKLSMgcmVhbGx5IGlzLCBzbyB3ZSBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZXMgdGhhdCBIUCdzIGxpbmtlciB1c2VzLgotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NDAwMDAwMDAwMDAwMTAwMAotU0hMSUJfREFUQV9BRERSPTB4ODAwMDAwMDAwMDAwMTAwMAotCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLU1BWFBBR0VTSVpFPTQwOTYKLUFSQ0g9aHBwYQotTUFDSElORT1ocHBhMi4wdwotRU5UUlk9Im1haW4iCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0jIFdlIHJlYWxseSB3YW50IG11bHRpcGxlIC5zdHViIHNlY3Rpb25zLCBvbmUgZm9yIGVhY2ggaW5wdXQgLnRleHQgc2VjdGlvbiwKLSMgYnV0IGZvciBub3cgdGhpcyBpcyBnb29kIGVub3VnaC4KLU9USEVSX1JFQURPTkxZX1NFQ1RJT05TPScuUEFSSVNDLnVud2luZCA6IHsgKiguUEFSSVNDLnVud2luZCkgfSAnCi0KLSMgVGhlIFBBNjQgRUxGIHBvcnQgdHJlYXRzIC5wbHQgc2VjdGlvbnMgZGlmZmVyZW50bHkgdGhhbiBtb3N0LiAgV2UgYWxzbyBoYXZlCi0jIHRvIGNyZWF0ZSBhIC5vcGQgc2VjdGlvbi4gIFdoYXQgbW9zdCBzeXN0ZW1zIGNhbGwgdGhlIC5nb3QsIHdlIGNhbGwgdGhlIC5kbHQKLU9USEVSX1JFQURXUklURV9TRUNUSU9OUz0nLm9wZCA6IHsgKigub3BkKSB9IFBST1ZJREUgKF9fZ3AgPSAuKTsgLnBsdCA6IHsgKigucGx0KSB9IC5kbHQgOiB7ICooLmRsdCkgfScKLQotIyBUaGUgUEE2NCBFTEYgcG9ydCBoYXMgdHdvIGFkZGl0aW9uYWwgYnNzIHNlY3Rpb25zLiBodWdlIGJzcyBhbmQgdGhyZWFkIGJzcy4KLSMgTWFrZSBzdXJlIHRoZXkgZW5kIHVwIGluIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbi4gIFdlIGFsc28gaGF2ZSB0byBzZXQKLSMgX19UTFNfU0laRSB0byB0aGUgc2l6ZSBvZiB0aGUgdGhyZWFkIGJzcyBzZWN0aW9uLgotT1RIRVJfQlNTX1NFQ1RJT05TPScuaGJzcyA6IHsgKiguaGJzcykgfSAudGJzcyA6IHsgKigudGJzcykgfScKLSNPVEhFUl9CU1NfRU5EX1NZTUJPTFM9J1BST1ZJREUgKF9fVExTX1NJWkUgPSBTSVpFT0YgKC50YnNzKSk7JwotT1RIRVJfQlNTX0VORF9TWU1CT0xTPSdQUk9WSURFIChfX1RMU19TSVpFID0gMCk7JwotCi0jIEhQcyB1c2UgLmRsdCB3aGVyZSBzeXN0ZW1zIHVzZSAuZ290LiAgU2lnaC4KLU9USEVSX0dPVF9SRUxPQ19TRUNUSU9OUz0nLnJlbGEuZGx0IDogeyAqKC5yZWxhLmRsdCkgfScKLQotIyBXZSdyZSBub3QgYWN0dWFsbHkgcHJvdmlkaW5nIGEgc3ltYm9sIGFueW1vcmUgKGR1ZSB0byB0aGUgaW5hYmlsaXR5IHRvIGJlCi0jIHNhZmUgaW4gcmVnYXJkcyB0byBzaGFyZWQgbGlicmFyaWVzKS4gU28gd2UganVzdCBhbGxvY2F0ZSB0aGUgaHVuayBvZiBzcGFjZQotIyB1bmNvbmRpdGlvbmFsbHksIGJ1dCBkbyBub3QgbWVzcyBhcm91bmQgd2l0aCB0aGUgc3ltYm9sIHRhYmxlLgotREFUQV9TVEFSVF9TWU1CT0xTPScuICs9IDE2OycKLQotIyBUaGUgbGlua2VyIGlzIHJlcXVpcmVkIHRvIGRlZmluZSB0aGVzZSB0d28gc3ltYm9scy4KLUVYRUNVVEFCTEVfU1lNQk9MUz0nUFJPVklERSAoX19TWVNURU1fSUQgPSAweDIxNCk7IFBST1ZJREUgKF9GUFVfU1RBVFVTID0gMHgwKTsnCi1EQVRBX1BMVD0KLQotIyAuZHluYW1pYyBzaG91bGQgYmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSAudGV4dCBzZWdtZW50LgotVEVYVF9EWU5BTUlDPQotCi0jIFRoZSBQQTY0IEVMRiBwb3J0IG5lZWRzIHR3byBhZGRpdGlvbmFsIGluaXRpYWxpemVyIHNlY3Rpb25zIGFuZCBhbHNvIHdhbnRzCi0jIGEgc3RhcnQvZW5kIHN5bWJvbCBwYWlyIGZvciB0aGUgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zLgotSU5JVF9TVEFSVD0nS0VFUCAoKiguSFAuaW5pdCkpOyBQUk9WSURFIChfX3ByZWluaXRfc3RhcnQgPSAuKTsgS0VFUCAoKigucHJlaW5pdCkpOyBQUk9WSURFIChfX3ByZWluaXRfZW5kID0gLik7IFBST1ZJREUgKF9faW5pdF9zdGFydCA9IC4pOycKLUlOSVRfRU5EPSdQUk9WSURFIChfX2luaXRfZW5kID0gLik7JwotRklOSV9TVEFSVD0nUFJPVklERSAoX19maW5pX3N0YXJ0ID0gLik7JwotRklOSV9FTkQ9J1BST1ZJREUgKF9fZmluaV9lbmQgPSAuKTsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZl9pMzg2LnNoIGIvbGQvZW11bHBhcmFtcy9lbGZfaTM4Ni5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZmNTY3Yi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZl9pMzg2LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MDgwNDgwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDgwNDgwMDAKLUFSQ0g9aTM4NgotTUFDSElORT0KLU5PUD0weDkwOTAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2ggYi9sZC9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc3YTA2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotI1NITElCX1RFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1BUkNIPWkzODYKLU1BQ0hJTkU9Ci1OT1A9MHg5MDkwCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2dsZDk2MC5zaCBiL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjgxYTc4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1pOTYwCi1PVVRQVVRfRk9STUFUPSIiCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9aTk2MAotVEVNUExBVEVfTkFNRT1nbGQ5NjAKLUdMRF9TVFlMRT0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjAyMjAuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotU0NSSVBUX05BTUU9aTk2MAotT1VUUFVUX0ZPUk1BVD0iIgotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPWk5NjAKLVRFTVBMQVRFX05BTUU9Z2xkOTYwYwotR0xEX1NUWUxFPTEKLUNPRkZfQ1RPUlM9JwotCV9fX0NUT1JfTElTVF9fID0gLjsKLQlMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpCi0JKiguY3RvcnMpCi0JTE9ORygwKQotCV9fX0NUT1JfRU5EX18gPSAuOwotCV9fX0RUT1JfTElTVF9fID0gLjsKLQlMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpCi0JKiguZHRvcnMpCi0JTE9ORygwKQotCV9fX0RUT1JfRU5EX18gPSAuOwotJwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvaDgzMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZWIzYzQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDgzMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDgzMDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODMwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODMwMGguc2ggYi9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiNzk0ZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDgzMDBoCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4MzAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDgzMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDgzMDBzLnNoIGIvbGQvZW11bHBhcmFtcy9oODMwMHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2I0ZjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODMwMHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4MzAwcwotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODMwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4MzAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0Y2E4MC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwYi5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmQzZmVlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMGIKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODUwMGMuc2ggYi9sZC9lbXVscGFyYW1zL2g4NTAwYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwYTA2NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDg1MDBjCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBtLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMG0uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOWY3YjYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODUwMG0uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwbQotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwcy5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWUyOTRhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMHMKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9ocDMwMGJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvaHAzMDBic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNWM1MGIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9ocDMwMGJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaHAzMDBic2QiCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT00MDk2Ci1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaCBiL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiYWRkOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2hwM2hwdXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWhwMzAwaHB1eCIKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLUFSQ0g9bTY4awotU1RBQ0taRVJPPSJfX19zdGFja196ZXJvID0gMHgyMDAwOyBfX0RZTkFNSUMgPSAwOyIKLSMgVGhpcyBpcyBuZWVkZWQgZm9yIEhQVVggOS4wOyBpdCBpcyB1bm5lY2Vzc2FyeSBidXQgaGFybWxlc3MgZm9yIDguMC4KLVNITElCX1BBVEg9Il9fX2RsZF9zaGxpYl9wYXRoID0gMDsiCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2hwcGFlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2hwcGFlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Yjg5ZWEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9ocHBhZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1ocHBhZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1ocHBhIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotVEFSR0VUX1BBR0VfU0laRT00MDk2Ci1BUkNIPWhwcGEKLVNUQVJUPSIkU1RBUlQkIgotVEVNUExBVEVfTkFNRT1ocHBhZWxmCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZhb3V0LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2YW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5ZTU1NC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZhb3V0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2IgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZiZW9zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjlkYTVmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUFSQ0g9aTM4NgotU0NSSVBUX05BTUU9aTM4NmJlb3MKLU9VVFBVVF9GT1JNQVQ9InBlaS1pMzg2IgotUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9InBlLWkzODYiCi1URU1QTEFURV9OQU1FPWJlb3MKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjMGUyZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYtYnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDE3YjdkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWkzODZjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZnbzMyLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2Z28zMi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmMTZjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZnbzMyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1pMzg2Z28zMgotT1VUUFVUX0ZPUk1BVD0iY29mZi1nbzMyIgotVEVYVF9TVEFSVF9BRERSPTB4MTBhOAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVNFR01FTlRfU0laRT0weDIwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1pMzg2Ci0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTY0MjIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYtbGludXgiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTAKLUFSQ0g9aTM4NgotVEVNUExBVEVfTkFNRT1saW51eApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bHlueC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OGMxNzUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bHlueC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0NSSVBUX05BTUU9aTM4Nmx5bngKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaTM4Ni1seW54IgotIyBUaGlzIGlzIHdoYXQgTHlueE9TIC9saWIvaW5pdDEubyB3YW50cy4KLUVOVFJZPV9tYWluCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cwotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtYWNoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2NiMjc2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW1hY2gzIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1TRUdNRU5UX1NJWkU9MHgxMDAwCi1QQURfVEVYVD10Ci1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtb3NzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWUwZTA1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgwMDAwMjAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwMDAwMjAwMAotQVJDSD1pMzg2Ci1NQUNISU5FPQotTk9QPTB4OTA5MAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxMWZhMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9aTM4Nm1zZG9zCi1PVVRQVVRfRk9STUFUPSJtc2RvcyIKLVRFWFRfU1RBUlRfQUREUj0weDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLVNFR01FTlRfU0laRT0weDEwCi1QQURfVEVYVD10Ci1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2ggYi9sZC9lbXVscGFyYW1zL2kzODZuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU2YTM4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYtbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9aTM4NgotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm53LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bncuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MGVkNjcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bncuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNDUklQVF9OQU1FPW53Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MDgwMDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDgwMDAwMDAKLUFSQ0g9aTM4NgotTk9QPTB4OTA5MAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2cGUuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZwZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhZGQyMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZwZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQVJDSD1pMzg2Ci1TQ1JJUFRfTkFNRT1wZQotT1VUUFVUX0ZPUk1BVD0icGVpLWkzODYiCi1SRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0icGUtaTM4NiIKLVRFTVBMQVRFX05BTUU9cGUKLUVOVFJZPSJfbWFpbkNSVFN0YXJ0dXAiCi1TVUJTWVNURU09UEVfREVGX1NVQlNZU1RFTQotSU5JVElBTF9TWU1CT0xfQ0hBUj1cIl9cIgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2cGVfcG9zaXguc2ggYi9sZC9lbXVscGFyYW1zL2kzODZwZV9wb3NpeC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmNTFiNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZwZV9wb3NpeC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQVJDSD1pMzg2Ci1TQ1JJUFRfTkFNRT1wZQotT1VUUFVUX0ZPUk1BVD0icGVpLWkzODYiCi1SRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0icGUtaTM4NiIKLVRFTVBMQVRFX05BTUU9cGUKLUVOVFJZPSJfX19Qb3NpeFByb2Nlc3NTdGFydHVwIgotU1VCU1lTVEVNPTcKLUVYRUNVVEFCTEVfTkFNRT1hLm91dAotSU5JVElBTF9TWU1CT0xfQ0hBUj1cIl9cIgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9sbms5NjAuc2ggYi9sZC9lbXVscGFyYW1zL2xuazk2MC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmM2ZjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2xuazk2MC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9aTk2MAotT1VUUFVUX0ZPUk1BVD0iIgotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPWk5NjAKLVRFTVBMQVRFX05BTUU9bG5rOTYwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2ggYi9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzcwNWEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tMzJyZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbTMyciIKLVRFWFRfU1RBUlRfQUREUj0weDEwMAotQVJDSD1tMzJyCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MzIKLUVNQkVEREVEPXllcwotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiBzaW11bGF0b3IgbWVtb3J5ICg4TUIpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nUFJPVklERSAoX3N0YWNrID0gMHg4MDAwMDApOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjMjRjMGUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1PVVRQVVRfRk9STUFUPSJhLm91dC1tNjhrNGstbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9bTY4awotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2ggYi9sZC9lbXVscGFyYW1zL202OGthb3V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZhYWY3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXplcm8tYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLVNFR01FTlRfU0laRT0weDIwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllODZjYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGthdXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPW02OGthdXgKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ay1hdXgiCi1TRUdNRU5UX1NJWkU9MHg0MDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0iJFNFR01FTlRfU0laRSArIFNJWkVPRl9IRUFERVJTIgotTk9OX1BBR0VEX1RFWFRfU1RBUlRfQUREUj1TSVpFT0ZfSEVBREVSUwotREFUQV9BTElHTk1FTlRfPSIoLiAmICgtJFNFR01FTlRfU0laRSB8ICRUQVJHRVRfUEFHRV9TSVpFLTEpKSArICRTRUdNRU5UX1NJWkUiCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2ggYi9sZC9lbXVscGFyYW1zL202OGtjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3YzBkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPW02OGtjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtlbGYuc2ggYi9sZC9lbXVscGFyYW1zL202OGtlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzUyYzUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tNjhrIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4MjAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPSR7VEVYVF9TVEFSVF9BRERSfQotQVJDSD1tNjhrCi1NQUNISU5FPQotTk9QPTB4NGU3NQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrbGludXguc2ggYi9sZC9lbXVscGFyYW1zL202OGtsaW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjM2RhZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtsaW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbTY4ay1saW51eCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MAotQVJDSD1tNjhrCi1URU1QTEFURV9OQU1FPWxpbnV4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtseW54LnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrbHlueC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyMGZlYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtseW54LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1tNjhrbHlueAotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrLWx5bngiCi0jIFRoaXMgaXMgd2hhdCBMeW54T1MgL2xpYi9pbml0MS5vIHdhbnRzLgotRU5UUlk9X19tYWluCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cwotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a25ic2Quc2ggYi9sZC9lbXVscGFyYW1zL202OGtuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQyODA3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a25ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW02OGstbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLUFSQ0g9bTY4awotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggYi9sZC9lbXVscGFyYW1zL202OGtwc29zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGViOGNhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPXBzb3MKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHgyMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1BUkNIPW02OGsKLVRFTVBMQVRFX05BTUU9ZWxmMzIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaCBiL2xkL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NzM3Yy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL204OGtiY3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPW04OGtiY3MKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTg4a2JjcyIKLVRFWFRfU1RBUlRfQUREUj0/PwotVEFSR0VUX1BBR0VfU0laRT0/PwotQVJDSD1tODhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21jb3JlcGUuc2ggYi9sZC9lbXVscGFyYW1zL21jb3JlcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTllMDIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tY29yZXBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BUkNIPW1jb3JlCi1TQ1JJUFRfTkFNRT1tY29yZXBlCi1PVVRQVVRfRk9STUFUPSJwZWktbWNvcmUtbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9InBlaS1tY29yZS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0icGVpLW1jb3JlLWJpZyIKLVRFTVBMQVRFX05BTUU9cGUKLUVOVFJZPSJfbWFpbkNSVFN0YXJ0dXAiCi1TVUJTWVNURU09UEVfREVGX1NVQlNZU1RFTQotSU5JVElBTF9TWU1CT0xfQ0hBUj1cIl9cIgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzYmlnLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzYmlnLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmUyOTUzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWlwc2JpZy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNic2Quc2ggYi9sZC9lbXVscGFyYW1zL21pcHNic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZmIzNWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzYnNkCi1PVVRQVVRfRk9STUFUPSJhLm91dC1taXBzLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJhLm91dC1taXBzLWJpZyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJhLm91dC1taXBzLWxpdHRsZSIKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLVRBUkdFVF9QQUdFX1NJWkU9NDA5NgotQVJDSD1taXBzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNpZHQuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNpZHQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTc2ZjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzaWR0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCi1FTlRSWT1zdGFydAotVEVYVF9TVEFSVF9BRERSPTB4YTAwMTIwMDAKLURBVEFfQUREUj0uCi1URU1QTEFURV9OQU1FPW1pcHNlY29mZgotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNpZHRsLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzaWR0bC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyNzlkZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNpZHRsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCi1FTlRSWT1zdGFydAotVEVYVF9TVEFSVF9BRERSPTB4YTAwMTIwMDAKLURBVEFfQUREUj0uCi1URU1QTEFURV9OQU1FPW1pcHNlY29mZgotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjIzNDQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzbGl0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2xuZXdzLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYmI5MWMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bWlwcwotVEVYVF9TVEFSVF9BRERSPTB4ODAwODAwMDAKLURBVEFfQUREUj0uCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc3BlLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzcGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Njc0NTIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzcGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUFSQ0g9bWlwcwotU0NSSVBUX05BTUU9cGUKLU9VVFBVVF9GT1JNQVQ9InBlaS1taXBzIgotT1VUUFVUX0FSQ0g9Im1pcHMiCi1SRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRFTVBMQVRFX05BTUU9cGUKLVNVQlNZU1RFTT1QRV9ERUZfU1VCU1lTVEVNCi1JTklUSUFMX1NZTUJPTF9DSEFSPVwiX1wiCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21uMTAyMDAuc2ggYi9sZC9lbXVscGFyYW1zL21uMTAyMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjQzMjIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tbjEwMjAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbW4xMDIwMCIKLVRFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9bW4xMDIwMAotTUFDSElORT0KLU1BWFBBR0VTSVpFPTEKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKLQotIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCi0jIFhYWCBUaGVzZSBzaG91bGQgZGVmaW5pdGVseSBkaXNhcHBlYXIuCi1DVE9SX1NUQVJUPSdfX19jdG9ycyA9IC47JwotQ1RPUl9FTkQ9J19fX2N0b3JzX2VuZCA9IC47JwotRFRPUl9TVEFSVD0nX19fZHRvcnMgPSAuOycKLURUT1JfRU5EPSdfX19kdG9yc19lbmQgPSAuOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbW4xMDMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvbW4xMDMwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhNDBlNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21uMTAzMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tbjEwMzAwIgotVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1tbjEwMzAwCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MQotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLQotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwotCi0jIFRoZXNlIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDT0ZGIHRvb2xjaGFpbi4KLSMgWFhYIFRoZXNlIHNob3VsZCBkZWZpbml0ZWx5IGRpc2FwcGVhci4KLUNUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCi1DVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCi1EVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JwotRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9uZXdzLnNoIGIvbGQvZW11bHBhcmFtcy9uZXdzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBkZGY5Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbmV3cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbmV3c29zMyIKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL25zMzJrbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRmZGYzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1PVVRQVVRfRk9STUFUPSJhLm91dC1uczMyay1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1uczMyawpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoIGIvbGQvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzFkMDc5Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtcGM1MzItbWFjaCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9IjB4MTAwMjAiCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwMAotQVJDSD1uczMyawpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wamVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvcGplbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZmQyYjMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wamVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1waiIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotQVJDSD1wagpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wamxlbGYuc2ggYi9sZC9lbXVscGFyYW1zL3BqbGVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5NThmZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BqbGVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1wamwiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLUFSQ0g9cGoKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2ggYi9sZC9lbXVscGFyYW1zL3BwY21hY29zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmI4MDBjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9YWl4Ci1TQ1JJUFRfTkFNRT1haXgKLU9VVFBVVF9GT1JNQVQ9Inhjb2ZmLXBvd2VybWFjIgotQVJDSD1wb3dlcnBjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BwY253LnNoIGIvbGQvZW11bHBhcmFtcy9wcGNudy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlYWQ0My4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BwY253LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1udwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwYyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLURBVEFfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1BUkNIPXBvd2VycGMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcHBjcGUuc2ggYi9sZC9lbXVscGFyYW1zL3BwY3BlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQwOWVmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcHBjcGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLUFSQ0g9cG93ZXJwYwotU0NSSVBUX05BTUU9cHBjcGUKLU9VVFBVVF9GT1JNQVQ9InBlaS1wb3dlcnBjbGUiCi1URU1QTEFURV9OQU1FPXBlCi1FTlRSWT0iX21haW5DUlRTdGFydHVwIgotU1VCU1lTVEVNPVBFX0RFRl9TVUJTWVNURU0KLUlOSVRJQUxfU1lNQk9MX0NIQVI9XCJfXCIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcmlzY2l4LnNoIGIvbGQvZW11bHBhcmFtcy9yaXNjaXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZjZkOTIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9yaXNjaXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXJpc2NpeAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtcmlzY2l4IgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0weDgwMDAKLUFSQ0g9YXJtCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NhMjkyMDAuc2ggYi9sZC9lbXVscGFyYW1zL3NhMjkyMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTJmOTIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zYTI5MjAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zYTI5MjAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWEyOWstYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4NDAwMDQwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPWEyOWsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2guc2ggYi9sZC9lbXVscGFyYW1zL3NoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODg0NGZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2guc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXNoCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXNoIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9c2gKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2hlbGYuc2ggYi9sZC9lbXVscGFyYW1zL3NoZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWRiNTg3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2hlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXNoIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotTUFYUEFHRVNJWkU9MTI4Ci1BUkNIPXNoCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCi0KLSMgVGhlc2UgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIENPRkYgdG9vbGNoYWluLgotRU5UUlk9c3RhcnQKLUNUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCi1DVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCi1EVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JwotRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JwotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4MzAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaGwuc2ggYi9sZC9lbXVscGFyYW1zL3NobC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwYWFjOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NobC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9c2gKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtc2hsIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9c2gKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2hsZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9zaGxlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjdmODYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zaGxlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXNobCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAKLU1BWFBBR0VTSVpFPTEyOAotQVJDSD1zaAotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLUVNQkVEREVEPXllcwotCi0jIFRoZXNlIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDT0ZGIHRvb2xjaGFpbi4KLUVOVFJZPXN0YXJ0Ci1DVE9SX1NUQVJUPSdfX19jdG9ycyA9IC47JwotQ1RPUl9FTkQ9J19fX2N0b3JzX2VuZCA9IC47JwotRFRPUl9TVEFSVD0nX19fZHRvcnMgPSAuOycKLURUT1JfRU5EPSdfX19kdG9yc19lbmQgPSAuOycKLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDMwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2hwZS5zaCBiL2xkL2VtdWxwYXJhbXMvc2hwZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4NjY0Yy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NocGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUFSQ0g9c2gKLVNDUklQVF9OQU1FPXBlCi1PVVRQVVRfRk9STUFUPSJwZWktc2hsIgotVEVNUExBVEVfTkFNRT1wZQotU1VCU1lTVEVNPVBFX0RFRl9TVUJTWVNURU0KLUlOSVRJQUxfU1lNQk9MX0NIQVI9XCJfXCIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoIGIvbGQvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOWI5MjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXN1bm9zLWJpZyIKLUJJR19PVVRQVVRfRk9STUFUPSJhLm91dC1zdW5vcy1iaWciCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3BhcmMtbGl0dGxlIgotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLUFSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjYjBiZWMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1zcGFyYy1saW51eCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MAotQVJDSD1zcGFyYwotVEVNUExBVEVfTkFNRT1saW51eApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zcGFyY2x5bnguc2ggYi9sZC9lbXVscGFyYW1zL3NwYXJjbHlueC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlYjMwYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NwYXJjbHlueC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0NSSVBUX05BTUU9c3BhcmNseW54Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLXNwYXJjLWx5bngiCi0jIFRoaXMgaXMgd2hhdCBMeW54T1MgL2xpYi9pbml0MS5vIHdhbnRzLgotRU5UUlk9X19tYWluCi0jIGZvbGxvd2luZyBhcmUgZHViaW91cwotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1BUkNIPXNwYXJjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdkYWYzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1PVVRQVVRfRk9STUFUPSJhLm91dC1zcGFyYy1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1zcGFyYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zdDIwMDAuc2ggYi9sZC9lbXVscGFyYW1zL3N0MjAwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5ODgzMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3N0MjAwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9c3QyMDAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3N1bjMuc2ggYi9sZC9lbXVscGFyYW1zL3N1bjMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMGY3MWYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zdW4zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1zdW5vcy1iaWciCi1URVhUX1NUQVJUX0FERFI9MHgyMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotU0VHTUVOVF9TSVpFPTB4MjAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLUFSQ0g9bTY4awotVEVNUExBVEVfTkFNRT1zdW5vcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zdW40LnNoIGIvbGQvZW11bHBhcmFtcy9zdW40LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQyNzc1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3VuNC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLUFMSUdOTUVOVD04Ci1BUkNIPXNwYXJjCi1URU1QTEFURV9OQU1FPXN1bm9zCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3RpYzMwYW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTRjMTNmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT10aWMzMGFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXRpYzMwIgotT1VUUFVUX0FSQ0g9InRtczMyMGMzMCIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXRtczMyMGMzMAotQklHPTEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy90aWMzMGNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzc5NDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy90aWMzMGNvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPXRpYzMwY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi10aWMzMCIKLU9VVFBVVF9BUkNIPSJ0bXMzMjBjMzAiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD10bXMzMjBjMzAKLUJJRz0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3RpYzgwY29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDcwMzIzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgc291cmNlZCBieSB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQuCi0jIFRoZXNlIGFyZSBzaGVsbCB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBsYXRlciBieSBlaXRoZXIgZ2Vuc2NyaXB0cwotIyBvciBvbiBvZiB0aGUgc2NyaXB0cyB0aGF0IGl0IHNvdXJjZXMuCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB0byB1c2UuICBJbiB0aGlzIGNhc2UsIGdlbnNjcmlwdHMKLSMgdXNlcyBzY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MKLSMKLVNDUklQVF9OQU1FPXRpYzgwY29mZgotCi0jIFRoZSBuYW1lIG9mIHRoZSBlbXVsdGVtcGwgc2NyaXB0IHRvIHVzZS4gIElmIHNldCB0byAidGVtcGxhdGUiIHRoZW4KLSMgZ2Vuc2NyaXB0cy5zaCB3aWxsIHVzZSB0aGUgc2NyaXB0IGVtdWx0ZW1wbC90ZW1wbGF0ZS5lbS4gIElmIG5vdCBzZXQsCi0jIHRoZW4gdGhlIGRlZmF1bHQgdmFsdWUgaXMgImdlbmVyaWMiLgotIwotIyBURU1QTEFURV9OQU1FPQotCi0jIElmIHRoaXMgaXMgc2V0IHRvIGFuIG5vbmVtcHR5IHN0cmluZywgZ2Vuc2NyaXB0cy5zaCB3aWxsIGludm9rZSB0aGUKLSMgc2NyaXB0dGVtcGwgc2NyaXB0IGFuIGV4dHJhIHRpbWUgdG8gY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgc2NyaXB0LgotIwotIyBHRU5FUkFURV9TSExJQl9TQ1JJUFQ9Ci0KLSMgVGhlIEJGRCBvdXRwdXQgZm9ybWF0IHRvIHVzZS4gIFRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgd2lsbCB1c2UgaXQgaW4KLSMgYW4gT1VUUFVUX0ZPUk1BVCBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotIwotT1VUUFVUX0ZPUk1BVD0iY29mZi10aWM4MCIKLQotIyBUaGlzIGlzIG5vcm1hbGx5IHNldCB0byBpbmRpY2F0ZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSwgc3VjaCBhcwotIyAic3BhcmMiLiAgVGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB3aWxsIG5vcm1hbGx5IHVzZSBpdCBpbiBhbiBPVVRQVVRfQVJDSAotIyBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotIwotQVJDSD10aWM4MAotCi0jIFNvbWUgc2NyaXB0dGVtcGwgc2NyaXB0cyB1c2UgdGhpcyB0byBzZXQgdGhlIGVudHJ5IGFkZHJlc3MgaW4gYW4gRU5UUlkKLSMgZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLSMKLSMgRU5UUlk9Ci0KLSMgVGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZQotIyAiLnRleHQiIHNlY3Rpb24uCi0jCi1URVhUX1NUQVJUX0FERFI9MHgyMDAwMDAwCi0KLSMgSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQgc2V0cyBURVhUX1NUQVJUX0FERFIgdG8KLSMgaXRzIHZhbHVlIGJlZm9yZSBydW5uaW5nIHRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgZm9yIHRoZSAtbiBhbmQgLU4KLSMgb3B0aW9ucy4KLSMKLSMgTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPQotCi0jIFRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIAotIyBEQVRBX0FMSUdOTUVOVCB3aGVuIHJ1bm5pbmcgdGhlIHNjcmlwdHRlbXBsIHNjcmlwdC4KLSMKLSMgU0VHTUVOVF9TSVpFPQotCi0jIElmIFNFR01FTlRfU0laRSBpcyBub3QgZGVmaW5lZCwgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHVzZXMgdGhpcwotIyB0byBkZWZpbmUgaXQuCi0jCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92ODUwLnNoIGIvbGQvZW11bHBhcmFtcy92ODUwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGJmYmQzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdjg1MC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT12ODUwCi1PVVRQVVRfRk9STUFUPSJlbGYzMi12ODUwIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwCi1aREFUQV9TVEFSVF9BRERSPTB4MTYwCi1ST1pEQVRBX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLVNEQVRBX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLVJPU0RBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotVERBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotQ0FMTF9UQUJMRV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1BUkNIPXY4NTAKLU1BWFBBR0VTSVpFPTI1NgotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdmFuaWxsYS5zaCBiL2xkL2VtdWxwYXJhbXMvdmFuaWxsYS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhM2I3Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3ZhbmlsbGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXZhbmlsbGEKLVRFWFRfU1RBUlRfQUREUj0/PwotVEFSR0VUX1BBR0VfU0laRT0/PwotQVJDSD11bmtub3duCi1URU1QTEFURV9OQU1FPXZhbmlsbGEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdmF4LnNoIGIvbGQvZW11bHBhcmFtcy92YXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODU0ODMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy92YXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0IgotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9MTAyNAotQVJDSD12YXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdnN0YS5zaCBiL2xkL2VtdWxwYXJhbXMvdnN0YS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2MjQ5Yi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3ZzdGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotU0VHTUVOVF9TSVpFPTB4NDAwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPWkzODYKLQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy93NjUuc2ggYi9sZC9lbXVscGFyYW1zL3c2NS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwMmIyMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3c2NS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9dzY1Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLXc2NSIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAKLVRBUkdFVF9QQUdFX1NJWkU9NjQKLUFSQ0g9dzY1CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3o4MDAxLnNoIGIvbGQvZW11bHBhcmFtcy96ODAwMS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2NDVjMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3o4MDAxLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT16ODAwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi16OGsiCi1PVVRQVVRfQVJDSD0iejgwMDEiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD16OGsKLUJJRz0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3o4MDAyLnNoIGIvbGQvZW11bHBhcmFtcy96ODAwMi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5YjVmNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3o4MDAyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT16ODAwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi16OGsiCi1PVVRQVVRfQVJDSD0iejgwMDIiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD16ODAwMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL1JFQURNRSBiL2xkL2VtdWx0ZW1wbC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZWMwYWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSBzb3VyY2VkIGJ5IGdlbnNjcmlwdHMuc2gsIGFmdGVyCi1zZXR0aW5nIHNvbWUgdmFyaWFibGVzIHRvIHN1YnN0aXR1dGUgaW4sIHRvIHByb2R1Y2UKLUMgc291cmNlIGZpbGVzIHRoYXQgY29udGFpbiBqdW1wIHRhYmxlcyBmb3IgZWFjaCBlbXVsYXRpb24uCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYWl4LmVtIGIvbGQvZW11bHRlbXBsL2FpeC5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4MWI1Zi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYWl4LmVtCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIEFJWCBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBBSVggc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9mcmVlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9yZWxvY3MKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotLyogVGhlIGZpbGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciBlYWNoIHNlY3Rpb24uICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZmlsZV9hbGlnbjsKLQotLyogVGhlIG1heGltdW0gc2l6ZSB0aGUgc3RhY2sgaXMgcGVybWl0dGVkIHRvIGdyb3cuICBUaGlzIGlzIHN0b3JlZCBpbgotICAgdGhlIGEub3V0IGhlYWRlci4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhzdGFjazsKLQotLyogVGhlIG1heGltdW0gZGF0YSBzaXplLiAgVGhpcyBpcyBzdG9yZWQgaW4gdGhlIGEub3V0IGhlYWRlci4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhkYXRhOwotCi0vKiBXaGV0aGVyIHRvIHBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgZ2MgPSAxOwotCi0vKiBUaGUgbW9kdWxlIHR5cGUgdG8gdXNlLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtb2R0eXBlID0gKCcxJyA8PCA4KSB8ICdMJzsKLQotLyogV2hldGhlciB0aGUgLnRleHQgc2VjdGlvbiBtdXN0IGJlIHJlYWQtb25seSAoaS5lLiwgbm8gcmVsb2NzCi0gICBwZXJtaXR0ZWQpLiAgKi8KLXN0YXRpYyBpbnQgdGV4dHJvOwotCi0vKiBXaGV0aGVyIHRvIGltcGxlbWVudCBVbml4IGxpa2UgbGlua2VyIHNlbWFudGljcy4gICovCi1zdGF0aWMgaW50IHVuaXhfbGQ7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW1wb3J0IGZpbGUgbGlzdC4gICovCi0KLXN0cnVjdCBmaWxlbGlzdAotewotICBzdHJ1Y3QgZmlsZWxpc3QgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi0vKiBMaXN0IG9mIGltcG9ydCBmaWxlcy4gICovCi1zdGF0aWMgc3RydWN0IGZpbGVsaXN0ICppbXBvcnRfZmlsZXM7Ci0KLS8qIExpc3Qgb2YgZXhwb3J0IHN5bWJvbHMgcmVhZCBmcm9tIHRoZSBleHBvcnQgZmlsZXMuICAqLwotCi1zdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0Ci17Ci0gIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGJvb2xlYW4gc3lzY2FsbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpleHBvcnRfc3ltYm9sczsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBkb25lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotICBjb25maWcuaGFzX3NoYXJlZCA9IHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBBSVggc3BlY2lmaWMgb3B0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgaW5keDsKLSAgaW50IGxvbmdpbmQ7Ci0gIGludCBvcHRjOwotICBsb25nIHZhbDsKLSAgY2hhciAqZW5kOwotCi0jZGVmaW5lIE9QVElPTl9JR05PUkUgKDMwMCkKLSNkZWZpbmUgT1BUSU9OX0FVVE9JTVAgKE9QVElPTl9JR05PUkUgKyAxKQotI2RlZmluZSBPUFRJT05fRVJOT1RPSyAoT1BUSU9OX0FVVE9JTVAgKyAxKQotI2RlZmluZSBPUFRJT05fRVJPSyAoT1BUSU9OX0VSTk9UT0sgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUIChPUFRJT05fRVJPSyArIDEpCi0jZGVmaW5lIE9QVElPTl9JTVBPUlQgKE9QVElPTl9FWFBPUlQgKyAxKQotI2RlZmluZSBPUFRJT05fTE9BRE1BUCAoT1BUSU9OX0lNUE9SVCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVhEQVRBIChPUFRJT05fTE9BRE1BUCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQVhTVEFDSyAoT1BUSU9OX01BWERBVEEgKyAxKQotI2RlZmluZSBPUFRJT05fTU9EVFlQRSAoT1BUSU9OX01BWFNUQUNLICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PQVVUT0lNUCAoT1BUSU9OX01PRFRZUEUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9TVFJDTVBDVCAoT1BUSU9OX05PQVVUT0lNUCArIDEpCi0jZGVmaW5lIE9QVElPTl9QRCAoT1BUSU9OX05PU1RSQ01QQ1QgKyAxKQotI2RlZmluZSBPUFRJT05fUFQgKE9QVElPTl9QRCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVFJDTVBDVCAoT1BUSU9OX1BUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1VOSVggKE9QVElPTl9TVFJDTVBDVCArIDEpCi0KLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKLSAgICB7ImJhc2lzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmF1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAotICAgIHsiYmNvbXBybGQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiY3JsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJjcm9yMzEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiRCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCi0gICAgeyJiRSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUfSwKLSAgICB7ImJlcm5vdG9rIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk5PVE9LfSwKLSAgICB7ImJlcm9rIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk9LfSwKLSAgICB7ImJlcnJtc2ciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiZXhwb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAotICAgIHsiYmYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAotICAgIHsiYmdjIiwgbm9fYXJndW1lbnQsICZnYywgMX0sCi0gICAgeyJiaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJoYWx0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYkkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCi0gICAgeyJiaW1wb3J0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTVBPUlR9LAotICAgIHsiYmwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xPQURNQVB9LAotICAgIHsiYmxvYWRtYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xPQURNQVB9LAotICAgIHsiYm1heGRhdGEiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWERBVEF9LAotICAgIHsiYm1heHN0YWNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCi0gICAgeyJiTSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTU9EVFlQRX0sCi0gICAgeyJibW9kdHlwZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTU9EVFlQRX0sCi0gICAgeyJibm9hdXRvaW1wIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsiYm5vZGVsY3NlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJibm9lbnRyeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJub2djIiwgbm9fYXJndW1lbnQsICZnYywgMH0sCi0gICAgeyJibnNvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsiYm5vc3RyY21wY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PU1RSQ01QQ1R9LAotICAgIHsiYm5vdGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAotICAgIHsiYm5ybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAwfSwKLSAgICB7ImJwRCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUER9LAotICAgIHsiYnBUIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QVH0sCi0gICAgeyJicm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMX0sCi0gICAgeyJiUyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYU1RBQ0t9LAotICAgIHsiYnNvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BVVRPSU1QfSwKLSAgICB7ImJzdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RSQ01QQ1R9LAotICAgIHsiYnRleHRybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKLSAgICB7InN0YXRpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9BVVRPSU1QfSwKLSAgICB7InVuaXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1VOSVh9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLSAgfTsKLQotICAvKiBPcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgQUlYIGxpbmtlciB3aGljaCB3ZSBkbyBub3Qgc3VwcG9ydDogLWYsCi0gICAgIC1TLCAtdiwgLVosIC1iYmluZGNtZHMsIC1iYmluZGVyLCAtYmJpbmRvcHRzLCAtYmNhbGxzLCAtYmNhcHMsCi0gICAgIC1iY3JvcjE1LCAtYmRlYnVnb3B0LCAtYmRiZywgLWJkZWxjc2VjdCwgLWJleD8sIC1iZmlsZWxpc3QsIC1iZmwsCi0gICAgIC1iZ2NieXBhc3MsIC1iZ2xpbmssIC1iaW5zZXJ0LCAtYmksIC1ibG9hZG1hcCwgLWJsLCAtYm1hcCwgLWJubCwKLSAgICAgLWJub2JpbmQsIC1ibm9jb21wcmxkLCAtYm5vY3JsZCwgLWJub2Vycm1zZywgLWJub2dsaW5rLAotICAgICAtYm5vbG9hZG1hcCwgLWJubCwgLWJub29ianJlb3JkZXIsIC1ibm9xdWlldCwgLWJub3Jlb3JkZXIsCi0gICAgIC1ibm90eXBjaGssIC1ibm94LCAtYnF1aWV0LCAtYlIsIC1icmVuYW1lLCAtYnJlb3JkZXIsIC1idHlwY2hrLAotICAgICAtYngsIC1iWCwgLWJ4cmVmLiAgKi8KLQotICAvKiBJZiB0aGUgY3VycmVudCBvcHRpb24gc3RhcnRzIHdpdGggLWIsIGNoYW5nZSB0aGUgZmlyc3QgOiB0byBhbiA9LgotICAgICBUaGUgQUlYIGxpbmtlciB1c2VzIDogdG8gc2VwYXJhdGUgdGhlIG9wdGlvbiBmcm9tIHRoZSBhcmd1bWVudDsKLSAgICAgY2hhbmdpbmcgaXQgdG8gPSBsZXRzIHVzIHRyZWF0IGl0IGFzIGEgZ2V0b3B0IG9wdGlvbi4gICovCi0gIGluZHggPSBvcHRpbmQ7Ci0gIGlmIChpbmR4ID09IDApCi0gICAgaW5keCA9IDE7Ci0gIGlmIChpbmR4IDwgYXJnYyAmJiBzdHJuY21wIChhcmd2W2luZHhdLCAiLWIiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIGZvciAocyA9IGFyZ3ZbaW5keF07ICpzICE9ICdcMCc7IHMrKykKLQl7Ci0JICBpZiAoKnMgPT0gJzonKQotCSAgICB7Ci0JICAgICAgKnMgPSAnPSc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdlIGFkZCBzIGFuZCB1IHNvIHRvIHRoZSBzaG9ydCBvcHRpb25zIGxpc3Qgc28gdGhhdCAtcyBhbmQgLXUgb24KLSAgICAgdGhlIGNvbW1hbmQgbGluZSBkbyBub3QgbWF0Y2ggLXN0YXRpYyBhbmQgLXVuaXguICAqLwotCi0gIG9wdGVyciA9IDA7Ci0gIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLUQ6SDpLVDp6c3UiLCBsb25nb3B0cywgJmxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAndSc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9wdGluZCA9IHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgMDoKLSAgICAgIC8qIExvbmcgb3B0aW9uIHdoaWNoIGp1c3Qgc2V0cyBhIGZsYWcuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdEJzoKLSAgICAgIHZhbCA9IHN0cnRvbCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtRCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7Ci0gICAgICBlbHNlIGlmICh2YWwgIT0gLTEpCi0JbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCBleHBfaW50b3AgKHZhbCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdIJzoKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnCi0JICB8fCAodmFsICYgKHZhbCAtIDEpKSAhPSAwKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLUggbnVtYmVyICVzXG4iLCBvcHRhcmcpOwotICAgICAgZWxzZQotCWZpbGVfYWxpZ24gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgIGNhc2UgJ3onOgotICAgICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIHVzZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgdGFyZ2V0IHN5c3RlbS4gICovCi0gICAgICBmaWxlX2FsaWduID0gNDA5NjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICAvKiBPbiBBSVggdGhpcyBpcyB0aGUgc2FtZSBhcyBHTlUgbGQgLVR0ZXh0LiAgV2hlbiB3ZSBzZWUgLVQKLSAgICAgICAgIG51bWJlciwgd2UgYXNzdW1lIHRoZSBBSVggb3B0aW9uIGlzIGludGVuZGVkLiAgT3RoZXJ3aXNlLCB3ZQotICAgICAgICAgYXNzdW1lIHRoZSB1c3VhbCBHTlUgbGQgLVQgb3B0aW9uIGlzIGludGVuZGVkLiAgV2UgY2FuJ3QganVzdAotICAgICAgICAgaWdub3JlIHRoZSBBSVggb3B0aW9uLCBiZWNhdXNlIGdjYyBwYXNzZXMgaXQgdG8gdGhlIGxpbmtlci4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQl7Ci0JICBvcHRpbmQgPSBwcmV2b3B0aW5kOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCBleHBfaW50b3AgKHZhbCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9JR05PUkU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0FVVE9JTVA6Ci0gICAgICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVJOT1RPSzoKLSAgICAgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FUk9LOgotICAgICAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVhQT1JUOgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlIChvcHRhcmcsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fSU1QT1JUOgotICAgICAgewotCXN0cnVjdCBmaWxlbGlzdCAqbjsKLQlzdHJ1Y3QgZmlsZWxpc3QgKipmbHBwOwotCi0JbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKLQluLT5uZXh0ID0gTlVMTDsKLQluLT5uYW1lID0gb3B0YXJnOwotCWZscHAgPSAmaW1wb3J0X2ZpbGVzOwotCXdoaWxlICgqZmxwcCAhPSBOVUxMKQotCSAgZmxwcCA9ICYoKmZscHApLT5uZXh0OwotCSpmbHBwID0gbjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTE9BRE1BUDoKLSAgICAgIGNvbmZpZy5tYXBfZmlsZW5hbWUgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01BWERBVEE6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1ibWF4ZGF0YSBudW1iZXIgJXNcbiIsCi0JICAgICAgIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbWF4ZGF0YSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUFYU1RBQ0s6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1ibWF4c3RhY2sgbnVtYmVyICVzXG4iLAotCSAgICAgICBvcHRhcmcpOwotICAgICAgZWxzZQotCW1heHN0YWNrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NT0RUWVBFOgotICAgICAgaWYgKCpvcHRhcmcgPT0gJ1MnKQotCXsKLQkgIGxpbmtfaW5mby5zaGFyZWQgPSB0cnVlOwotCSAgKytvcHRhcmc7Ci0JfQotICAgICAgaWYgKCpvcHRhcmcgPT0gJ1wwJyB8fCBvcHRhcmdbMV0gPT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIG1vZHVsZSB0eXBlICVzXG4iLCBvcHRhcmcpOwotICAgICAgZWxzZQotCW1vZHR5cGUgPSAoKm9wdGFyZyA8PCA4KSB8IG9wdGFyZ1sxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9BVVRPSU1QOgotICAgICAgbGlua19pbmZvLnN0YXRpY19saW5rID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9TVFJDTVBDVDoKLSAgICAgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QRDoKLSAgICAgIC8qIFRoaXMgc2V0cyB0aGUgcGFnZSB0aGF0IHRoZSAuZGF0YSBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvCi0gICAgICAgICBzdGFydCBvbi4gIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIHNob3VsZCBzdGlsbCBiZSB0aGUKLSAgICAgICAgIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUsIHNvIHdlIG5lZWQgdG8gYnVpbGQgYW4gYXBwcm9wcmlhdGUKLSAgICAgICAgIGV4cHJlc3Npb24uICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtcEQgbnVtYmVyICVzXG4iLCBvcHRhcmcpOwotICAgICAgZWxzZQotCXsKLQkgIGV0cmVlX3R5cGUgKnQ7Ci0KLQkgIHQgPSBleHBfYmlub3AgKCcrJywKLQkJCSBleHBfaW50b3AgKHZhbCksCi0JCQkgZXhwX2Jpbm9wICgnJicsCi0JCQkJICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIiksCi0JCQkJICAgIGV4cF9pbnRvcCAoMHhmZmYpKSk7Ci0JICB0ID0gZXhwX2Jpbm9wICgnJicsCi0JCQkgZXhwX2Jpbm9wICgnKycsIHQsIGV4cF9pbnRvcCAoMzEpKSwKLQkJCSBleHBfaW50b3AgKH4gKGJmZF92bWEpIDMxKSk7Ci0JICBsYW5nX3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIHQpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFQ6Ci0gICAgICAvKiBUaGlzIHNldCB0aGUgcGFnZSB0aGF0IHRoZSAudGV4dCBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvIHN0YXJ0Ci0gICAgICAgICBvbi4gIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIHNob3VsZCBzdGlsbCBiZSB0aGUgb2Zmc2V0Ci0gICAgICAgICB3aXRoaW4gdGhlIGZpbGUuICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtcFQgbnVtYmVyICVzXG4iLCBvcHRhcmcpOwotICAgICAgZWxzZQotCXsKLQkgIGV0cmVlX3R5cGUgKnQ7Ci0KLQkgIHQgPSBleHBfYmlub3AgKCcrJywKLQkJCSBleHBfaW50b3AgKHZhbCksCi0JCQkgZXhwX25hbWVvcCAoU0laRU9GX0hFQURFUlMsIE5VTEwpKTsKLQkgIHQgPSBleHBfYmlub3AgKCcmJywKLQkJCSBleHBfYmlub3AgKCcrJywgdCwgZXhwX2ludG9wICgzMSkpLAotCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgMzEpKTsKLQkgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi50ZXh0IiwgdCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9TVFJDTVBDVDoKLSAgICAgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVU5JWDoKLSAgICAgIHVuaXhfbGQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGZpbGUgY2FuIG5vdCBiZSByZWNvZ25pemVkIGFzIGEgQkZECi0gICBvYmplY3Qgb3IgYW4gYXJjaGl2ZS4gIElmIHRoZSBmaWxlIHN0YXJ0cyB3aXRoICMhLCB3ZSBtdXN0IHRyZWF0IGl0Ci0gICBhcyBhbiBpbXBvcnQgZmlsZS4gIFRoaXMgaXMgZm9yIEFJWCBjb21wYXRpYmlsaXR5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlIChlbnRyeSkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIEZJTEUgKmU7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGUgPSBmb3BlbiAoZW50cnktPmZpbGVuYW1lLCBGT1BFTl9SVCk7Ci0gIGlmIChlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldCA9IGZhbHNlOwotCi0gIGlmIChnZXRjIChlKSA9PSAnIycgJiYgZ2V0YyAoZSkgPT0gJyEnKQotICAgIHsKLSAgICAgIHN0cnVjdCBmaWxlbGlzdCAqbjsKLSAgICAgIHN0cnVjdCBmaWxlbGlzdCAqKmZscHA7Ci0KLSAgICAgIG4gPSAoc3RydWN0IGZpbGVsaXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVsaXN0KSk7Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIG4tPm5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0gICAgICBmbHBwID0gJmltcG9ydF9maWxlczsKLSAgICAgIHdoaWxlICgqZmxwcCAhPSBOVUxMKQotCWZscHAgPSAmKCpmbHBwKS0+bmV4dDsKLSAgICAgICpmbHBwID0gbjsKLQotICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgIGVudHJ5LT5sb2FkZWQgPSB0cnVlOwotICAgIH0KLQotICBmY2xvc2UgKGUpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgYm9vbGVhbiByOwotICBzdHJ1Y3Qgc2V0X2luZm8gKnA7Ci0KLSAgLyogQ2FsbCBsZGN0b3JfYnVpbGRfc2V0cywgYWZ0ZXIgcHJldGVuZGluZyB0aGF0IHRoaXMgaXMgYQotICAgICByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvIHRoaXMgYmVjYXVzZSBBSVggcmVxdWlyZXMgcmVsb2NhdGlvbgotICAgICBlbnRyaWVzIGZvciBhbGwgcmVmZXJlbmNlcyB0byBzeW1ib2xzLCBldmVuIGluIGEgZmluYWwKLSAgICAgZXhlY3V0YWJsZS4gIE9mIGNvdXJzZSwgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgaWYgd2UgYXJlCi0gICAgIHByb2R1Y2luZyBhbiBYQ09GRiBvdXRwdXQgZmlsZS4gICovCi0gIHIgPSBsaW5rX2luZm8ucmVsb2NhdGVhYmxlOwotICBpZiAoc3Ryc3RyIChiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCksICJ4Y29mZiIpICE9IE5VTEwpCi0gICAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gIGxkY3Rvcl9idWlsZF9zZXRzICgpOwotICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gcjsKLQotICAvKiBGb3IgZWFjaCBzZXQsIHJlY29yZCB0aGUgc2l6ZSwgc28gdGhhdCB0aGUgWENPRkYgYmFja2VuZCBjYW4KLSAgICAgb3V0cHV0IHRoZSBjb3JyZWN0IGNzZWN0IGxlbmd0aC4gICovCi0gIGZvciAocCA9IHNldHM7IHAgIT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgd2UgbWF5IGhhdmUgYmVlbiBpbnZva2VkIGZyb20KLQkgY29sbGVjdCwgYW5kIHRoZSBzZXRzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBidWlsdCwgc28gd2UgZG8KLQkgbm90IGRvIGFueXRoaW5nLiAgKi8KLSAgICAgIGlmIChwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgcC0+aC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChwLT5yZWxvYyAhPSBCRkRfUkVMT0NfQ1RPUikKLQl7Ci0JICAvKiBIYW5kbGUgdGhpcyBpZiB3ZSBuZWVkIHRvLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgc2l6ZSA9IChwLT5jb3VudCArIDIpICogNDsKLSAgICAgIGlmICghIGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIHAtPmgsIHNpemUpKQotCWVpbmZvICgiJUYlUDogYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCBmYWlsZWQ6ICVFXG4iKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgc3RydWN0IGZpbGVsaXN0ICpmbDsKLSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqZWw7Ci0gIGNoYXIgKmxpYnBhdGg7Ci0gIGFzZWN0aW9uICpzcGVjaWFsX3NlY3Rpb25zWzZdOwotICBpbnQgaTsKLQotICAvKiBIYW5kbGUgdGhlIGltcG9ydCBhbmQgZXhwb3J0IGZpbGVzLCBpZiBhbnkuICAqLwotICBmb3IgKGZsID0gaW1wb3J0X2ZpbGVzOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5uZXh0KQotICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSAoZmwtPm5hbWUsIHRydWUpOwotICBmb3IgKGVsID0gZXhwb3J0X3N5bWJvbHM7IGVsICE9IE5VTEw7IGVsID0gZWwtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGVsLT5uYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBvZiBleHBvcnQgc3ltYm9sIGZhaWxlZDogJUVcbiIpOwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGgsIGVsLT5zeXNjYWxsKSkKLQllaW5mbyAoIiVQJUY6IGJmZF94Y29mZl9leHBvcnRfc3ltYm9sIGZhaWxlZDogJUVcbiIpOwotICAgIH0KLQotICAvKiBUcmFjayBkb3duIGFsbCByZWxvY2F0aW9ucyBjYWxsZWQgZm9yIGJ5IHRoZSBsaW5rZXIgc2NyaXB0ICh0aGVzZQotICAgICBhcmUgdHlwaWNhbGx5IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZW50cmllcyBjcmVhdGVkIGJ5Ci0gICAgIENPTlNUUlVDVE9SUykgYW5kIGxldCB0aGUgYmFja2VuZCBrbm93IGl0IHdpbGwgbmVlZCB0byBjcmVhdGUKLSAgICAgLmxvYWRlciByZWxvY3MgZm9yIHRoZW0uICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9yZWxvY3MpOwotCi0gIC8qIFdlIG5lZWQgdG8gYnVpbGQgTElCUEFUSCBmcm9tIHRoZSAtTCBhcmd1bWVudHMuICBJZiBhbnkgLXJwYXRoCi0gICAgIGFyZ3VtZW50cyB3ZXJlIHVzZWQsIHRob3VnaCwgd2UgdXNlIC1ycGF0aCBpbnN0ZWFkLCBhcyBhIEdOVQotICAgICBleHRlbnNpb24uICAqLwotICBpZiAoY29tbWFuZF9saW5lLnJwYXRoICE9IE5VTEwpCi0gICAgbGlicGF0aCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLSAgZWxzZSBpZiAoc2VhcmNoX2hlYWQgPT0gTlVMTCkKLSAgICBsaWJwYXRoID0gKGNoYXIgKikgIiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKHNlYXJjaF9oZWFkLT5uYW1lKTsKLSAgICAgIGxpYnBhdGggPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cmNweSAobGlicGF0aCwgc2VhcmNoX2hlYWQtPm5hbWUpOwotICAgICAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZC0+bmV4dDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQl7Ci0JICBzaXplX3QgbmxlbjsKLQotCSAgbmxlbiA9IHN0cmxlbiAoc2VhcmNoLT5uYW1lKTsKLQkgIGxpYnBhdGggPSB4cmVhbGxvYyAobGlicGF0aCwgbGVuICsgbmxlbiArIDIpOwotCSAgbGlicGF0aFtsZW5dID0gJzonOwotCSAgc3RyY3B5IChsaWJwYXRoICsgbGVuICsgMSwgc2VhcmNoLT5uYW1lKTsKLQkgIGxlbiArPSBubGVuICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIExldCB0aGUgWENPRkYgYmFja2VuZCBzZXQgdXAgdGhlIC5sb2FkZXIgc2VjdGlvbi4gICovCi0gIGlmICghIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGxpYnBhdGgsCi0JCQkJCSBlbnRyeV9zeW1ib2wsIGZpbGVfYWxpZ24sCi0JCQkJCSBtYXhzdGFjaywgbWF4ZGF0YSwKLQkJCQkJIGdjICYmICEgdW5peF9sZCA/IHRydWUgOiBmYWxzZSwKLQkJCQkJIG1vZHR5cGUsCi0JCQkJCSB0ZXh0cm8gPyB0cnVlIDogZmFsc2UsCi0JCQkJCSB1bml4X2xkLAotCQkJCQkgc3BlY2lhbF9zZWN0aW9ucykpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3BlY2lhbCBzZWN0aW9ucywgYW5kIHB1dCB0aGVtIGluIHRoZSByaWdodAotICAgICBwbGFjZSBpbiB0aGUgbGluayBvcmRlcmluZy4gIFRoaXMgaXMgZXNwZWNpYWxseSBtYWdpYy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnBsczsKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppczsKLSAgICAgIGNvbnN0IGNoYXIgKm9uYW1lOwotICAgICAgYm9vbGVhbiBzdGFydDsKLQotICAgICAgc2VjID0gc3BlY2lhbF9zZWN0aW9uc1tpXTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgLyogUmVtb3ZlIHRoaXMgc2VjdGlvbiBmcm9tIHRoZSBsaXN0IG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4KLSAgICAgICAgIFRoaXMgYXNzdW1lcyB3ZSBrbm93IHdoYXQgdGhlIHNjcmlwdCBsb29rcyBsaWtlLiAgKi8KLSAgICAgIGlzID0gTlVMTDsKLSAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGlmIChvcyA9PSBOVUxMKQotCWVpbmZvICgiJVAlRjogY2FuJ3QgZmluZCBvdXRwdXQgc2VjdGlvbiAlc1xuIiwKLQkgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBmb3IgKHBscyA9ICZvcy0+Y2hpbGRyZW4uaGVhZDsgKnBscyAhPSBOVUxMOyBwbHMgPSAmKCpwbHMpLT5uZXh0KQotCXsKLQkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCi0JICAgICAgJiYgKCpwbHMpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24gPT0gc2VjKQotCSAgICB7Ci0JICAgICAgaXMgPSAobGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKikgKnBsczsKLQkgICAgICAqcGxzID0gKCpwbHMpLT5uZXh0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoKCpwbHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW0pCi0JICAgIHsKLQkgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHdsczsKLQotCSAgICAgIGZvciAocHdscyA9ICYoKnBscyktPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQ7Ci0JCSAgICpwd2xzICE9IE5VTEw7Ci0JCSAgIHB3bHMgPSAmKCpwd2xzKS0+bmV4dCkKLQkJewotCQkgIGlmICgoKnB3bHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bQotCQkgICAgICAmJiAoKnB3bHMpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24gPT0gc2VjKQotCQkgICAgewotCQkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcHdsczsKLQkJICAgICAgKnB3bHMgPSAoKnB3bHMpLT5uZXh0OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmIChpcyAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCX0JCi0KLSAgICAgIGlmIChpcyA9PSBOVUxMKQotCWVpbmZvICgiJVAlRjogY2FuJ3QgZmluZCAlcyBpbiBvdXRwdXQgc2VjdGlvblxuIiwKLQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKHNlYy0+b3duZXIsIHNlYykpOwotCi0gICAgICAvKiBOb3cgZmlndXJlIG91dCB3aGVyZSB0aGUgc2VjdGlvbiBzaG91bGQgZ28uICAqLwotICAgICAgc3dpdGNoIChpKQotCXsKLQlkZWZhdWx0OiAvKiB0byBhdm9pZCB3YXJuaW5ncyAqLwotCWNhc2UgMDoKLQkgIC8qIF90ZXh0ICovCi0JICBvbmFtZSA9ICIudGV4dCI7Ci0JICBzdGFydCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICAvKiBfZXRleHQgKi8KLQkgIG9uYW1lID0gIi50ZXh0IjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICAvKiBfZGF0YSAqLwotCSAgb25hbWUgPSAiLmRhdGEiOwotCSAgc3RhcnQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgLyogX2VkYXRhICovCi0JICBvbmFtZSA9ICIuZGF0YSI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkgIC8qIF9lbmQgYW5kIGVuZCAqLwotCSAgb25hbWUgPSAiLmJzcyI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAob25hbWUpOwotCi0gICAgICBpZiAoc3RhcnQpCi0JewotCSAgaXMtPmhlYWRlci5uZXh0ID0gb3MtPmNoaWxkcmVuLmhlYWQ7Ci0JICBvcy0+Y2hpbGRyZW4uaGVhZCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpcy0+aGVhZGVyLm5leHQgPSBOVUxMOwotCSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmb3MtPmNoaWxkcmVuLAotCQkJCSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBpcywKLQkJCQkgJmlzLT5oZWFkZXIubmV4dCk7Ci0JfQotICAgIH0KLX0KLQotLyogUmVhZCBhbiBpbXBvcnQgb3IgZXhwb3J0IGZpbGUuICBGb3IgYW4gaW1wb3J0IGZpbGUsIHRoaXMgaXMgY2FsbGVkCi0gICBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gZW11bGF0aW9uIHJvdXRpbmUuICBGb3IgYW4gZXhwb3J0IGZpbGUsCi0gICB0aGlzIGlzIGNhbGxlZCBieSB0aGUgcGFyc2VfYXJncyBlbXVsYXRpb24gcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUgKGZpbGVuYW1lLCBpbXBvcnQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBib29sZWFuIGltcG9ydDsKLXsKLSAgc3RydWN0IG9ic3RhY2sgKm87Ci0gIEZJTEUgKmY7Ci0gIGludCBsaW5lbm87Ci0gIGludCBjOwotICBib29sZWFuIGtlZXA7Ci0gIGNvbnN0IGNoYXIgKmltcHBhdGg7Ci0gIGNvbnN0IGNoYXIgKmltcGZpbGU7Ci0gIGNvbnN0IGNoYXIgKmltcG1lbWJlcjsKLQotICBvID0gKHN0cnVjdCBvYnN0YWNrICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG9ic3RhY2spKTsKLSAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKG8sIDAsIDAsIHhtYWxsb2MsIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZyZWUpOwotCi0gIGYgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1JUKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgZWluZm8gKCIlRiVzOiAlRVxuIiwgZmlsZW5hbWUpOwotICAgIH0KLQotICBrZWVwID0gZmFsc2U7Ci0KLSAgaW1wcGF0aCA9IE5VTEw7Ci0gIGltcGZpbGUgPSBOVUxMOwotICBpbXBtZW1iZXIgPSBOVUxMOwotCi0gIGxpbmVubyA9IDA7Ci0gIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0gICAgICBib29sZWFuIHN5c2NhbGw7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaWYgKGMgIT0gJ1xuJykKLQl7Ci0JICBvYnN0YWNrXzFncm93IChvLCBjKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgb2JzdGFja18xZ3JvdyAobywgJ1wwJyk7Ci0gICAgICArK2xpbmVubzsKLQotICAgICAgcyA9IChjaGFyICopIG9ic3RhY2tfYmFzZSAobyk7Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkrK3M7Ci0gICAgICBpZiAoKnMgPT0gJ1wwJwotCSAgfHwgKnMgPT0gJyonCi0JICB8fCAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyAnKQotCSAgfHwgKCEgaW1wb3J0ICYmICpzID09ICcjJyAmJiBzWzFdID09ICchJykpCi0JewotCSAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCpzID09ICcjJyAmJiBzWzFdID09ICchJykKLQl7Ci0JICBzICs9IDI7Ci0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgICAgKytzOwotCSAgaWYgKCpzID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpbXBwYXRoID0gTlVMTDsKLQkgICAgICBpbXBmaWxlID0gTlVMTDsKLQkgICAgICBpbXBtZW1iZXIgPSBOVUxMOwotCSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpzID09ICcoJykKLQkgICAgZWluZm8gKCIlRiVzJWQ6ICMhIChbbWVtYmVyXSkgaXMgbm90IHN1cHBvcnRlZCBpbiBpbXBvcnQgZmlsZXNcbiIsCi0JCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciBjczsKLQkgICAgICBjaGFyICpmaWxlOwotCi0JICAgICAgKHZvaWQpIG9ic3RhY2tfZmluaXNoIChvKTsKLQkgICAgICBrZWVwID0gdHJ1ZTsKLQkgICAgICBpbXBwYXRoID0gczsKLQkgICAgICBmaWxlID0gTlVMTDsKLQkgICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICcoJyAmJiAqcyAhPSAnXDAnKQotCQl7Ci0JCSAgaWYgKCpzID09ICcvJykKLQkJICAgIGZpbGUgPSBzICsgMTsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBpZiAoZmlsZSAhPSBOVUxMKQotCQl7Ci0JCSAgZmlsZVstMV0gPSAnXDAnOwotCQkgIGltcGZpbGUgPSBmaWxlOwotCQkgIGlmIChpbXBwYXRoID09IGZpbGUgLSAxKQotCQkgICAgaW1wcGF0aCA9ICIvIjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGltcGZpbGUgPSBpbXBwYXRoOwotCQkgIGltcHBhdGggPSAiIjsKLQkJfQotCSAgICAgIGNzID0gKnM7Ci0JICAgICAgKnMgPSAnXDAnOwotCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3MpKQotCQl7Ci0JCSAgKytzOwotCQkgIGNzID0gKnM7Ci0JCX0KLQkgICAgICBpZiAoY3MgIT0gJygnKQotCQl7Ci0JCSAgaW1wbWVtYmVyID0gIiI7Ci0JCSAgaWYgKGNzICE9ICdcMCcpCi0JCSAgICBlaW5mbyAoIiVzOiVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0IGZpbGVcbiIsCi0JCQkgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICsrczsKLQkJICBpbXBtZW1iZXIgPSBzOwotCQkgIHdoaWxlICgqcyAhPSAnKScgJiYgKnMgIT0gJ1wwJykKLQkJICAgICsrczsKLQkJICBpZiAoKnMgPT0gJyknKQotCQkgICAgKnMgPSAnXDAnOwotCQkgIGVsc2UKLQkJICAgIGVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQgZmlsZVxuIiwKLQkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIHRvIGJlIGltcG9ydGVkIG9yIGV4cG9ydGVkLiAgKi8KLSAgICAgIHN5bW5hbWUgPSBzOwotICAgICAgc3lzY2FsbCA9IGZhbHNlOwotICAgICAgYWRkcmVzcyA9IChiZmRfdm1hKSAtMTsKLQotICAgICAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSAmJiAqcyAhPSAnXDAnKQotCSsrczsKLSAgICAgIGlmICgqcyAhPSAnXDAnKQotCXsKLQkgIGNoYXIgKnNlOwotCi0JICAqcysrID0gJ1wwJzsKLQotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JICAgICsrczsKLQotCSAgc2UgPSBzOwotCSAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkgJiYgKnNlICE9ICdcMCcpCi0JICAgICsrc2U7Ci0JICBpZiAoKnNlICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICAqc2UrKyA9ICdcMCc7Ci0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqc2UpKQotCQkrK3NlOwotCSAgICAgIGlmICgqc2UgIT0gJ1wwJykKLQkJZWluZm8gKCIlcyVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0L2V4cG9ydCBmaWxlXG4iLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgIH0KLQotCSAgaWYgKHMgPT0gc2UpCi0JICAgIHsKLQkgICAgICAvKiBUaGVyZSB3YXMgbm8gYWRkcmVzcyBhZnRlciBhbGwuICAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjYXNlY21wIChzLCAic3ZjIikgPT0gMAotCQkgICB8fCBzdHJjYXNlY21wIChzLCAic3lzY2FsbCIpID09IDApCi0JICAgIHN5c2NhbGwgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqZW5kOwotCi0JICAgICAgYWRkcmVzcyA9IHN0cnRvdWwgKHMsICZlbmQsIDApOwotCSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JCWVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQvZXhwb3J0IGZpbGVcbiIsCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgaW1wb3J0KQotCXsKLQkgIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKm47Ci0KLQkgIGxkbGFuZ19hZGRfdW5kZWYgKHN5bW5hbWUpOwotCSAgbiA9ICgoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqKQotCSAgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QpKSk7Ci0JICBuLT5uZXh0ID0gZXhwb3J0X3N5bWJvbHM7Ci0JICBuLT5uYW1lID0gYnV5c3RyaW5nIChzeW1uYW1lKTsKLQkgIG4tPnN5c2NhbGwgPSBzeXNjYWxsOwotCSAgZXhwb3J0X3N5bWJvbHMgPSBuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBzeW1uYW1lLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgIHRydWUpOwotCSAgaWYgKGggPT0gTlVMTCB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIGp1c3QgaWdub3JlIGF0dGVtcHRzIHRvIGltcG9ydCBhbiB1bnJlZmVyZW5jZWQKLQkJIHN5bWJvbC4gICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBoLAotCQkJCQkgICAgIGFkZHJlc3MsIGltcHBhdGgsIGltcGZpbGUsCi0JCQkJCSAgICAgaW1wbWVtYmVyKSkKLQkJZWluZm8gKCIlWCVzOiVkOiBmYWlsZWQgdG8gaW1wb3J0IHN5bWJvbCAlczogJUVcbiIsCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vLCBzeW1uYW1lKTsKLQkgICAgfQotCX0KLQotICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLSAgICB9Ci0KLSAgaWYgKG9ic3RhY2tfb2JqZWN0X3NpemUgKG8pID4gMCkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVzOiVkOiB3YXJuaW5nOiBpZ25vcmluZyB1bnRlcm1pbmF0ZWQgbGFzdCBsaW5lXG4iLAotCSAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotICAgIH0KLQotICBpZiAoISBrZWVwKQotICAgIHsKLSAgICAgIG9ic3RhY2tfZnJlZSAobywgTlVMTCk7Ci0gICAgICBmcmVlIChvKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBzYXZlcyB1cyBmcm9tIHdvcnJ5aW5nIGFib3V0IGRlY2xhcmluZyBmcmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZyZWUgKHApCi0gICAgIFBUUiBwOwotewotICBmcmVlIChwKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvb2tzIGZvciByZWxvY2F0aW9ucyBhbmQgYXNzaWdubWVudHMKLSAgIHRvIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9yZWxvY3MgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtKQotICAgIHsKLSAgICAgIGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnJzOwotCi0gICAgICBycyA9ICZzLT5yZWxvY19zdGF0ZW1lbnQ7Ci0gICAgICBpZiAocnMtPm5hbWUgPT0gTlVMTCkKLQllaW5mbyAoIiVGJVA6IG9ubHkgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGFyZSBwZXJtaXR0ZWRcbiIpOwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIHJzLT5uYW1lKSkKLQllaW5mbyAoIiVGJVA6IGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIGZhaWxlZDogJUVcbiIpOwotICAgIH0KLQotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgZXhwLT5hc3NpZ24uZHN0KSkKLQkgICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIDAsCS8qIGZpbmlzaCAqLwotICAwLAkvKiBjcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyAqLwotICAwLAkvKiBvcGVuX2R5bmFtaWNfYXJjaGl2ZSAqLwotICAwLAkvKiBwbGFjZV9vcnBoYW4gKi8KLSAgMCwJLyogc2V0X3N5bWJvbHMgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncywKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUsCi0gIE5VTEwgCS8qIGZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FybWNvZmYuZW0gYi9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczYjNkMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci1zdGF0aWMgaW50ICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUygoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2ggUEFSQU1TICgodm9pZCkpOwotCi0vKiBJZiB0cnVlLCB0aGVuIGludGVyd29ya2luZyBzdHVicyB3aGljaCBzdXBwb3J0IGNhbGxzIHRvIG9sZCwgbm9uLWludGVyd29ya2luZwotICAgYXdhcmUgQVJNIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCi0KLXN0YXRpYyBpbnQgc3VwcG9ydF9vbGRfY29kZSA9IDA7Ci1zdGF0aWMgY2hhciAqIHRodW1iX2VudHJ5X3N5bWJvbCA9IE5VTEw7Ci0KLSNkZWZpbmUgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUJCTMwMAotI2RlZmluZSBPUFRJT05fVEhVTUJfRU5UUlkJCTMwMQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KLXsKLSAgeyJzdXBwb3J0LW9sZC1jb2RlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFfSwKLSAgeyJ0aHVtYi1lbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEhVTUJfRU5UUll9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXN1cHBvcnQtb2xkLWNvZGUgICBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCBjb2RlXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS10aHVtYi1lbnRyeT08c3ltPiAgU2V0IHRoZSBlbnRyeSBwb2ludCB0byBiZSBUaHVtYiBzeW1ib2wgPHN5bT5cbiIpKTsKLX0KLQotc3RhdGljIGludAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50ICAgICBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0gIGludCAgICAgICAgbG9uZ2luZDsKLSAgaW50ICAgICAgICBvcHRjOwotICBpbnQgICAgICAgIHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCAgICAgICAgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50ICAgICAgICB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICAKLSAgd2FudGVycm9yICA9IG9wdGVycjsKLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjICAgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmIGxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREU6Ci0gICAgICBzdXBwb3J0X29sZF9jb2RlID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVEhVTUJfRU5UUlk6Ci0gICAgICB0aHVtYl9lbnRyeV9zeW1ib2wgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQwKLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoImBlY2hvICR7QVJDSH1gIik7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICAvKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViIHNlY3Rpb24gKi8KLQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUgaW5mb3JtYXRpb24gKi8KLSAgLyogRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lIG9wdGlvbj8ga3JrQGN5Z251cy5jb20gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoISBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLQkgICAgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbywgc3VwcG9ydF9vbGRfY29kZSkpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIGlmIChzdHJzdHIgKGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwgImFybSIpID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhlIGFybSBiYWNrZW5kIG5lZWRzIHNwZWNpYWwgZmllbGRzIGluIHRoZSBvdXRwdXQgaGFzaCBzdHJ1Y3R1cmUuCi0JIFRoZXNlIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIGFuIGFybSBmb3JtYXQsCi0JIGhlbmNlIHdlIGRvIG5vdCBzdXBwb3J0IGxpbmtpbmcgYW5kIGNoYW5naW5nIG91dHB1dCBmb3JtYXRzIGF0IHRoZQotCSBzYW1lIHRpbWUuICBVc2UgYSBsaW5rIGZvbGxvd2VkIGJ5IG9iamNvcHkgdG8gY2hhbmdlIG91dHB1dCBmb3JtYXRzLiAgKi8KLSAgICAgIGVpbmZvICgiJUYlWCVQOiBlcnJvcjogY2Fubm90IGNoYW5nZSBvdXRwdXQgZm9ybWF0IHdoaWxzdCBsaW5raW5nIEFSTSBiaW5hcmllc1xuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbykpCi0JICBicmVhazsKLSAgICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUygodm9pZCkpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQotICBpZiAodGh1bWJfZW50cnlfc3ltYm9sID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgdGh1bWJfZW50cnlfc3ltYm9sLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0gICAgICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY2hhciBidWZmZXJbMzJdOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICAKLSAgICAgIC8qIFNwZWNpYWwgcHJvY2VzaW5nIGlzIHJlcXVpcmVkIGZvciBhIFRodW1iIGVudHJ5IHN5bWJvbC4gIFRoZQotCSBib3R0b20gYml0IG9mIGl0cyBhZGRyZXNzIG11c3QgYmUgc2V0LiAgKi8KLSAgICAgIHZhbCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLAotCQkJCSAgICBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKLQkgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICAKLSAgICAgIHZhbCB8PSAxOwotCi0gICAgICAvKiBOb3cgY29udmVydCB0aGlzIHZhbHVlIGludG8gYSBzdHJpbmcgYW5kIHN0b3JlIGl0IGluIGVudHJ5X3N5bWJvbAotICAgICAgICAgd2hlcmUgdGhlIGxhbmdfZmluaXNoKCkgZnVuY3Rpb24gd2lsbCBwaWNrIGl0IHVwLiAgKi8KLSAgICAgIGJ1ZmZlclswXSA9ICcwJzsKLSAgICAgIGJ1ZmZlclsxXSA9ICd4JzsKLSAgICAgIAotICAgICAgc3ByaW50Zl92bWEgKGJ1ZmZlciArIDIsIHZhbCk7Ci0KLSAgICAgIGlmIChlbnRyeV9zeW1ib2wgIT0gTlVMTCAmJiBlbnRyeV9mcm9tX2NtZGxpbmUpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiAnLS10aHVtYi1lbnRyeSAlcycgaXMgb3ZlcnJpZGluZyAnLWUgJXMnXG4iKSwKLQkgICAgICAgdGh1bWJfZW50cnlfc3ltYm9sLCBlbnRyeV9zeW1ib2wpOwotICAgICAgZW50cnlfc3ltYm9sID0gYnVmZmVyOwotICAgIH0KLSAgZWxzZQotICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogY29ubm90IGZpbmQgdGh1bWIgc3RhcnQgc3ltYm9sICVzXG4iKSwgdGh1bWJfZW50cnlfc3ltYm9sKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCAoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2gsCi0gIE5VTEwsCS8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsCS8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIE5VTEwsCS8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLAkvKiBzZXQgc3ltYm9scyAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzLAotICBOVUxMLAkvKiB1bnJlY29nbmlzZWQgZmlsZSAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMsCi0gIE5VTEwsCS8qIHJlY29nbml6ZWQgZmlsZSAqLwotICBOVUxMIAkvKiBmaW5kX3BvdGVudGlhbF9saWJyYXJpZXMgKi8KLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9hcm1lbGYuZW0gYi9sZC9lbXVsdGVtcGwvYXJtZWxmLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWJmN2YxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9hcm1lbGYuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjkzICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLUVMRlNJWkU9MzIKLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogZW11bGF0ZSB0aGUgb3JpZ2luYWwgZ2xkIGZvciB0aGUgZ2l2ZW4gJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlYXJjaF9kaXJzX3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjawotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotc3RhdGljIGludCAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyBQQVJBTVMoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLQotDAotc3RhdGljIGludCBub19waXBlbGluZV9rbm93bGVkZ2UgPSAwOwotc3RhdGljIGNoYXIgKiB0aHVtYl9lbnRyeV9zeW1ib2wgPSBOVUxMOwotCi0jZGVmaW5lIE9QVElPTl9USFVNQl9FTlRSWQkJMzAxCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICB7ICJuby1waXBlbGluZS1rbm93bGVkZ2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3AnfSwKLSAgeyAidGh1bWItZW50cnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RIVU1CX0VOVFJZfSwKLSAgeyBOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMCB9Ci19OwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtcCAtLW5vLXBpcGVsaW5lLWtub3dsZWRnZSAgU3RvcCB0aGUgbGlua2VyIGtub3dpbmcgYWJvdXQgdGhlIHBpcGVsaW5lIGxlbmd0aFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgIC0tdGh1bWItZW50cnk9PHN5bT4gICAgICBTZXQgdGhlIGVudHJ5IHBvaW50IHRvIGJlIFRodW1iIHN5bWJvbCA8c3ltPlxuIikpOwotfQotCi1zdGF0aWMgaW50Ci1nbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgICAgIGFyZ2M7Ci0gICAgIGNoYXIgKiogYXJndjsKLXsKLSAgaW50ICAgICAgICBsb25naW5kOwotICBpbnQgICAgICAgIG9wdGM7Ci0gIGludCAgICAgICAgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50ICAgICAgICBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgICAgICAgIHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIAotICB3YW50ZXJyb3IgID0gb3B0ZXJyOwotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgICA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItcCIsIGxvbmdvcHRzLCAmIGxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgJ3AnOgotICAgICAgbm9fcGlwZWxpbmVfa25vd2xlZGdlID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVEhVTUJfRU5UUlk6Ci0gICAgICB0aHVtYl9lbnRyeV9zeW1ib2wgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQwKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSAoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfc2V0X291dHB1dF9hcmNoICgiYGVjaG8gJHtBUkNIfWAiKTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotICBjb25maWcuZHluYW1pY19saW5rID0gJHtEWU5BTUlDX0xJTkstdHJ1ZX07Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gYGlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiIDsgdGhlbiBlY2hvIHRydWUgOyBlbHNlIGVjaG8gZmFsc2UgOyBmaWA7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgRUxGCi0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gZW50cnktPmZpbGVuYW1lOwotCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkgICAgICsgc3RybGVuIChhcmNoKQotCQkJICAgICArIHNpemVvZiAiL2xpYi5zbyIpOwotCi0gIHNwcmludGYgKHN0cmluZywgIiVzL2xpYiVzJXMuc28iLCBzZWFyY2gtPm5hbWUsIGZpbGVuYW1lLCBhcmNoKTsKLQotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnRyeS0+ZmlsZW5hbWUgPSBzdHJpbmc7Ci0KLSAgLyogV2UgaGF2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgaW4gdGhlIGxpbmsuICBUaGUgRUxGCi0gICAgIGJhY2tlbmQgbGlua2VyIHdpbGwgY3JlYXRlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSAuZHluYW1pYwotICAgICBzZWN0aW9uIG5hbWluZyB0aGlzIGZpbGUuICBJZiB0aGlzIGZpbGUgaW5jbHVkZXMgYSBEVF9TT05BTUUKLSAgICAgZW50cnksIGl0IHdpbGwgYmUgdXNlZC4gIE90aGVyd2lzZSwgdGhlIEVMRiBsaW5rZXIgd2lsbCBqdXN0IHVzZQotICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gIEZvciBhbiBhcmNoaXZlIGZvdW5kIGJ5IHNlYXJjaGluZywgbGlrZQotICAgICB0aGlzIG9uZSwgdGhlIERUX05FRURFRCBlbnRyeSBzaG91bGQgY29uc2lzdCBvZiBqdXN0IHRoZSBuYW1lIG9mCi0gICAgIHRoZSBmaWxlLCB3aXRob3V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIHVzZWQgdG8gZmluZCBpdC4gIE5vdGUKLSAgICAgdGhhdCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB3ZSBoYXZlIGEgZHluYW1pYyBvYmplY3Q7IGFuCi0gICAgIGFyY2hpdmUgd2lsbCBuZXZlciBiZSByZWZlcmVuY2VkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LgotCi0gICAgIEZJWE1FOiBUaGlzIGFwcHJvYWNoLS11c2luZyBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZS0taXMgbm90Ci0gICAgIHZlcnkgcHJldHR5LiAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byB0aGluayBvZiBhbnl0aGluZyB0aGF0IGlzCi0gICAgIHByZXR0eSwgdGhvdWdoLiAgKi8KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfb2JqZWN0KQotICAgICAgJiYgKGVudHJ5LT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgY2hhciAqbmVlZGVkX25hbWU7Ci0KLSAgICAgIEFTU0VSVCAoZW50cnktPmlzX2FyY2hpdmUgJiYgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpOwotICAgICAgbmVlZGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKQotCQkJCSAgICAgICsgc3RybGVuIChhcmNoKQotCQkJCSAgICAgICsgc2l6ZW9mICJsaWIuc28iKTsKLSAgICAgIHNwcmludGYgKG5lZWRlZF9uYW1lLCAibGliJXMlcy5zbyIsIGZpbGVuYW1lLCBhcmNoKTsKLSAgICAgIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChlbnRyeS0+dGhlX2JmZCwgbmVlZGVkX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi0vKiBGb3IgYSBuYXRpdmUgbGlua2VyLCBjaGVjayB0aGUgZmlsZSAvZXRjL2xkLnNvLmNvbmYgZm9yIGRpcmVjdG9yaWVzCi0gICBpbiB3aGljaCB3ZSBtYXkgZmluZCBzaGFyZWQgbGlicmFyaWVzLiAgL2V0Yy9sZC5zby5jb25mIGlzIHJlYWxseQotICAgb25seSBtZWFuaW5nZnVsIG9uIExpbnV4LCBidXQgd2UgY2hlY2sgaXQgb24gb3RoZXIgc3lzdGVtcyBhbnlob3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mIChuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZDsKLSAgc3RhdGljIGNoYXIgKmxkX3NvX2NvbmY7Ci0KLSAgaWYgKCEgaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgRklMRSAqZjsKLQotICAgICAgZiA9IGZvcGVuICgiL2V0Yy9sZC5zby5jb25mIiwgRk9QRU5fUlQpOwotICAgICAgaWYgKGYgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpiOwotCSAgc2l6ZV90IGxlbiwgYWxsb2M7Ci0JICBpbnQgYzsKLQotCSAgbGVuID0gMDsKLQkgIGFsbG9jID0gMTAwOwotCSAgYiA9IChjaGFyICopIHhtYWxsb2MgKGFsbG9jKTsKLQotCSAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKLQkgICAgewotCSAgICAgIGlmIChsZW4gKyAxID49IGFsbG9jKQotCQl7Ci0JCSAgYWxsb2MgKj0gMjsKLQkJICBiID0gKGNoYXIgKikgeHJlYWxsb2MgKGIsIGFsbG9jKTsKLQkJfQotCSAgICAgIGlmIChjICE9ICc6JwotCQkgICYmIGMgIT0gJyAnCi0JCSAgJiYgYyAhPSAnXHQnCi0JCSAgJiYgYyAhPSAnXG4nCi0JCSAgJiYgYyAhPSAnLCcpCi0JCXsKLQkJICBiW2xlbl0gPSBjOwotCQkgICsrbGVuOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGxlbiA+IDAgJiYgYltsZW4gLSAxXSAhPSAnOicpCi0JCSAgICB7Ci0JCSAgICAgIGJbbGVuXSA9ICc6JzsKLQkJICAgICAgKytsZW47Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobGVuID4gMCAmJiBiW2xlbiAtIDFdID09ICc6JykKLQkgICAgLS1sZW47Ci0KLQkgIGlmIChsZW4gPiAwKQotCSAgICBiW2xlbl0gPSAnXDAnOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnJlZSAoYik7Ci0JICAgICAgYiA9IE5VTEw7Ci0JICAgIH0KLQotCSAgZmNsb3NlIChmKTsKLQotCSAgbGRfc29fY29uZiA9IGI7Ci0JfQotCi0gICAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChsZF9zb19jb25mID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsZF9zb19jb25mLCBuYW1lLCBmb3JjZSk7Ci19Ci0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSByZXF1aXJlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoCi0gICBiZXR3ZWVuIGFmdGVyX29wZW4gYW5kIGNoZWNrX25lZWRlZCBhbmQgc3RhdF9uZWVkZWQgYW5kIHZlcmNoZWNrLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBzdHJ1Y3Qgc3RhdCBnbG9iYWxfc3RhdDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF92ZXJjaGVja19uZWVkZWQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZCwgKmw7Ci0KLSAgaWYgKHN0cnN0ciAoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLCAiYXJtIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgYXJtIGJhY2tlbmQgbmVlZHMgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIG91dHB1dCBoYXNoIHN0cnVjdHVyZS4KLQkgVGhlc2Ugd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgYW4gYXJtIGZvcm1hdCwKLQkgaGVuY2Ugd2UgZG8gbm90IHN1cHBvcnQgbGlua2luZyBhbmQgY2hhbmdpbmcgb3V0cHV0IGZvcm1hdHMgYXQgdGhlCi0JIHNhbWUgdGltZS4gIFVzZSBhIGxpbmsgZm9sbG93ZWQgYnkgb2JqY29weSB0byBjaGFuZ2Ugb3V0cHV0IGZvcm1hdHMuICAqLwotICAgICAgZWluZm8gKCIlRiVYJVA6IGVycm9yOiBjYW5ub3QgY2hhbmdlIG91dHB1dCBmb3JtYXQgd2hpbHN0IGxpbmtpbmcgQVJNIGJpbmFyaWVzXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQkvKiBUaGUgaW50ZXJ3b3JraW5nIGJmZCBtdXN0IGJlIHRoZSBsYXN0IG9uZSB0byBiZSBwcm9jZXNzZWQgKi8KLQlpZiAoIWlzLT5uZXh0KQotCSAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbyk7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gRFRfTkVFREVEIGVudHJpZXMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rIChvZnRlbiB0aGVyZSB3aWxsIGJlIG5vbmUpLgotICAgICBGb3IgZWFjaCBzdWNoIGZpbGUsIHdlIHdhbnQgdG8gdHJhY2sgZG93biB0aGUgY29ycmVzcG9uZGluZwotICAgICBsaWJyYXJ5LCBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlIGluIHRoZSBsaW5rLiAgVGhpcyBpcyB3aGF0Ci0gICAgIHRoZSBydW50aW1lIGR5bmFtaWMgbGlua2VyIHdpbGwgZG8uICBUcmFja2luZyB0aGUgZmlsZXMgZG93biBoZXJlCi0gICAgIHBlcm1pdHMgb25lIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgYW5vdGhlciB3aXRob3V0IHJlcXVpcmluZwotICAgICBzcGVjaWFsIGFjdGlvbiBieSB0aGUgcGVyc29uIGRvaW5nIHRoZSBsaW5rLiAgTm90ZSB0aGF0IHRoZQotICAgICBuZWVkZWQgbGlzdCBjYW4gYWN0dWFsbHkgZ3JvdyB3aGlsZSB3ZSBhcmUgc3RlcHBpbmcgdGhyb3VnaCB0aGlzCi0gICAgIGxvb3AuICAqLwotICBuZWVkZWQgPSBiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgaW50IGZvcmNlOwotCi0gICAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBmaWxlLCBza2lwIGl0LiAgKi8KLSAgICAgIGZvciAobGwgPSBuZWVkZWQ7IGxsICE9IGw7IGxsID0gbGwtPm5leHQpCi0JaWYgKHN0cmNtcCAobGwtPm5hbWUsIGwtPm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChsbCAhPSBsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOwotICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk7Ci0gICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGZpbmQgdGhpcyBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUuICBXZQotCSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIGR5bmFtaWMKLQkgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiB0aGUgbGlua2VyIHNjcmlwdAotCSBMSUJfU0VBUkNIX0RJUlMuICBXZSBkbyBub3Qgc2VhcmNoIHVzaW5nIHRoZSAtTCBhcmd1bWVudHMuCi0KLQkgV2Ugc2VhcmNoIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUsIHdlIHNraXAgb2JqZWN0cyB3aGljaCBtYXkKLQkgaW50cm9kdWNlIHZlcnNpb24gbWlzbWF0Y2hlcy4gIFRoZSBzZWNvbmQgdGltZSwgd2UgZm9yY2UKLQkgdGhlaXIgdXNlLiAgU2VlIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIGNvbW1lbnQuICAqLwotICAgICAgZm9yIChmb3JjZSA9IDA7IGZvcmNlIDwgMjsgZm9yY2UrKykKLQl7Ci0JICBjb25zdCBjaGFyICpsaWJfcGF0aDsKLQkgIHNpemVfdCBsZW47Ci0JICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGhfbGluaywKLQkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGgsCi0JCQkJCQkgIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci0JICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTAotCSAgICAgICYmIGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwKLQkJCQkJCSAgICAgIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgIH0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGliX3BhdGgsIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBsZW4gPSBzdHJsZW4gKGwtPm5hbWUpOwotCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkgICAgewotCSAgICAgIGNoYXIgKmZpbGVuYW1lOwotCi0JICAgICAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkJY29udGludWU7Ci0JICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyBsZW4gKyAyKTsKLQkgICAgICBzcHJpbnRmIChmaWxlbmFtZSwgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBsLT5uYW1lKTsKLQkgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCSAgICB9Ci0JICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgIGJyZWFrOwotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYgKGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JfQotCi0gICAgICBpZiAoZm9yY2UgPCAyKQotCWNvbnRpbnVlOwotCi0gICAgICBlaW5mbyAoIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBub3QgZm91bmQgKHRyeSB1c2luZyAtLXJwYXRoKVxuIiwKLQkgICAgIGwtPm5hbWUsIGwtPmJ5KTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBuZWVkZWQgZmlsZSBpbiBhIHBhdGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgY29uc3QgY2hhciAqczsKLSAgc2l6ZV90IGxlbjsKLQotICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlbmFtZSwgKnNzZXQ7Ci0KLSAgICAgIHMgPSBzdHJjaHIgKHBhdGgsICc6Jyk7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXMgPSBwYXRoICsgc3RybGVuIChwYXRoKTsKLQotICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIGxlbiArIDIpOwotICAgICAgaWYgKHMgPT0gcGF0aCkKLQlzc2V0ID0gZmlsZW5hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChmaWxlbmFtZSwgcGF0aCwgcyAtIHBhdGgpOwotCSAgZmlsZW5hbWVbcyAtIHBhdGhdID0gJy8nOwotCSAgc3NldCA9IGZpbGVuYW1lICsgKHMgLSBwYXRoKSArIDE7Ci0JfQotICAgICAgc3RyY3B5IChzc2V0LCBuYW1lKTsKLQotICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGZpbGVuYW1lLCBmb3JjZSkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLQotICAgICAgaWYgKCpzID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBwYXRoID0gcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJICAKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggcG9zc2libGUgbmFtZSBmb3IgYSBkeW5hbWljIG9iamVjdAotICAgbmFtZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuICBUaGUgRk9SQ0UgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyCi0gICB0byBza2lwIHRoZSBjaGVjayBmb3IgYSBjb25mbGljdGluZyB2ZXJzaW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIGJmZCAqYWJmZDsKLQotICBhYmZkID0gYmZkX29wZW5yIChuYW1lLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgb2JqZWN0IHdvdWxkIGluY2x1ZGUgYW55IGNvbmZsaWN0aW5nIGxpYnJhcnkKLSAgICAgdmVyc2lvbnMuICBJZiBGT1JDRSBpcyBzZXQsIHRoZW4gd2Ugc2tpcCB0aGlzIGNoZWNrOyB3ZSB1c2UgdGhpcwotICAgICB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kLCBpZiB3ZSBjb3VsZG4ndCBmaW5kIGFueSBjb21wYXRpYmxlCi0gICAgIGluc3RhbmNlIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLSAgaWYgKCEgZm9yY2UpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0KLSAgICAgIGlmICghIGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCAoYWJmZCwgJm5lZWRlZCkpCi0JZWluZm8gKCIlRiVQOiVCOiBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QgZmFpbGVkOiAlRVxuIiwgYWJmZCk7Ci0KLSAgICAgIGlmIChuZWVkZWQgIT0gTlVMTCkKLQl7Ci0JICBnbG9iYWxfdmVyY2hlY2tfbmVlZGVkID0gbmVlZGVkOwotCSAgZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCA9IGZhbHNlOwotCSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayk7Ci0JICBpZiAoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCkKLQkgICAgewotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCSAgICAgIC8qIFJldHVybiBmYWxzZSB0byBmb3JjZSB0aGUgY2FsbGVyIHRvIG1vdmUgb24gdG8gdHJ5Ci0gICAgICAgICAgICAgICAgIGFub3RoZXIgZmlsZSBvbiB0aGUgc2VhcmNoIHBhdGguICAqLwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBCdXQgd2FpdCEgIEl0IGdldHMgbXVjaCB3b3JzZS4gIE9uIExpbnV4LCBpZiBhIHNoYXJlZAotICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3QgdXNlIGxpYmMgYXQgYWxsLCB3ZSBhcmUgc3VwcG9zZWQgdG8gc2tpcAotICAgICAgICAgICAgIGl0IHRoZSBmaXJzdCB0aW1lIGFyb3VuZCBpbiBjYXNlIHdlIGVuY291bnRlciBhIHNoYXJlZAotICAgICAgICAgICAgIGxpYnJhcnkgbGF0ZXIgb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWNoIGRvZXMgdXNlIHRoZQotICAgICAgICAgICAgIHZlcnNpb24gb2YgbGliYyB0aGF0IHdlIHdhbnQuICBUaGlzIGlzIG11Y2ggdG9vIGhvcnJpYmxlCi0gICAgICAgICAgICAgdG8gdXNlIG9uIGFueSBzeXN0ZW0gb3RoZXIgdGhhbiBMaW51eC4gICovCi0KLUVPRgotY2FzZSAke3RhcmdldH0gaW4KLSAgKi0qLWxpbnV4LWdudSopCi0gICAgY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0JICAgIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgICBpZiAoc3RybmNtcCAobC0+bmFtZSwgImxpYmMuc28iLCA3KSA9PSAwKQotCQlicmVhazsKLQkgICAgaWYgKGwgPT0gTlVMTCkKLQkgICAgICB7Ci0JCSh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCi1FT0YKLSAgICA7OwotZXNhYwotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQl9Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgbWF0Y2hpbmcgdGhlIERUX05FRURFRCBlbnRyeS4gICovCi0KLSAgLyogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGVyZSBpcyBubyBvdGhlciBpbnB1dCBmaWxlIG9mIHRoZQotICAgICBzYW1lIG5hbWUuICBXZSBtdXN0IG5vdyBjaGVjayBhZ2FpbiB0aGF0IHdlIGFyZSBub3QgaW5jbHVkaW5nIHRoZQotICAgICBzYW1lIGZpbGUgdHdpY2UuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvbiBtYW55IHN5c3RlbXMKLSAgICAgbGliYy5zbyBpcyBhIHN5bWxpbmsgdG8sIGUuZy4sIGxpYmMuc28uMS4gIFRoZSBTT05BTUUgZW50cnkgd2lsbAotICAgICByZWZlcmVuY2UgbGliYy5zby4xLiAgSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGxpYmMuc28sIHdlCi0gICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBsaWJjLnNvLjEgaWYgdGhleSBhcmUgdGhlIHNhbWUgZmlsZSwgYW5kIHdlCi0gICAgIGNhbiBvbmx5IGNoZWNrIHRoYXQgdXNpbmcgc3RhdC4gICovCi0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmZ2xvYmFsX3N0YXQpICE9IDApCi0gICAgZWluZm8gKCIlRiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iLCBhYmZkKTsKLSAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOwotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHsKLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgd2UgZm91bmQgdGhlIGZpbGUsIGV2ZW4gdGhvdWdoCi0gICAgICAgICB3ZSBhcmVuJ3QgZ29pbmcgdG8gZG8gYW55dGhpbmcgd2l0aCBpdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGVsbCB0aGUgRUxGIGJhY2tlbmQgdGhhdCBkb24ndCB3YW50IHRoZSBvdXRwdXQgZmlsZSB0byBoYXZlIGEKLSAgICAgRFRfTkVFREVEIGVudHJ5IGZvciB0aGlzIGZpbGUuICAqLwotICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoYWJmZCwgIiIpOwotCi0gIC8qIEFkZCB0aGlzIGZpbGUgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIsIGFiZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAocy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY21wIChzLT5maWxlbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLQotICAgICAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgICAgIGlmIChzb25hbWUgIT0gTlVMTAotCSAgJiYgc3RyY21wIChzb25hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCSAgCi0gIGlmIChzLT5zZWFyY2hfZGlyc19mbGFnCi0gICAgICAmJiBzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmOwotCi0gICAgICBmID0gc3RycmNociAocy0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAoZiAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKGYgKyAxLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBydW5uaW5nIHN0YXQgb24KLSAgIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgY29uc3QgY2hhciAqc3VmZml4OwotICBjb25zdCBjaGFyICpzb25hbWU7Ci0gIGNvbnN0IGNoYXIgKmY7Ci0KLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0gIGlmIChzLT50aGVfYmZkID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfc3RhdCAocy0+dGhlX2JmZCwgJnN0KSAhPSAwKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIsIHMtPnRoZV9iZmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc3Quc3RfZGV2ID09IGdsb2JhbF9zdGF0LnN0X2RldgotICAgICAgJiYgc3Quc3RfaW5vID09IGdsb2JhbF9zdGF0LnN0X2lubykKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBpc3N1ZSBhIHdhcm5pbmcgaWYgaXQgbG9va3MgbGlrZSB3ZSBhcmUgaW5jbHVkaW5nIHR3bwotICAgICBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwKLSAgICAgdGhlcmUgbWF5IGJlIGEgcHJvYmxlbSBpZiAtbGMgcGlja3MgdXAgbGliYy5zby42IGJ1dCBzb21lIG90aGVyCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGhhcyBhIERUX05FRURFRCBlbnRyeSBvZiBsaWJjLnNvLjUuICBUaGlzIGlzIGEKLSAgICAgaHVlcmlzdGljIHRlc3QsIGFuZCBpdCB3aWxsIG9ubHkgd29yayBpZiB0aGUgbmFtZSBsb29rcyBsaWtlCi0gICAgIE5BTUUuc28uVkVSU0lPTi4gIEZJWE1FOiBEZXBlbmRpbmcgb24gZmlsZSBuYW1lcyBpcyBlcnJvci1wcm9uZS4KLSAgICAgSWYgd2UgcmVhbGx5IHdhbnQgdG8gaXNzdWUgd2FybmluZ3MgYWJvdXQgbWl4aW5nIHZlcnNpb24gbnVtYmVycwotICAgICBvZiBzaGFyZWQgbGlicmFyaWVzLCB3ZSBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5LiAgKi8KLQotICBpZiAoc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpICE9IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggPSBzdHJzdHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICIuc28uIik7Ci0gIGlmIChzdWZmaXggPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gcy0+ZmlsZW5hbWU7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGlmIChzdHJuY21wIChmLCBnbG9iYWxfbmVlZGVkLT5uYW1lLCBzdWZmaXggLSBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG1heSBjb25mbGljdCB3aXRoICVzXG4iLAotCSAgIGdsb2JhbF9uZWVkZWQtPm5hbWUsIGdsb2JhbF9uZWVkZWQtPmJ5LCBmKTsKLX0KLQotLyogT24gTGludXgsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLSAgIHNoYXJlZCBsaWJyYXJ5IGxpbmtlZCBhZ2FpbnN0IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBsaWJjLiAgVGhlCi0gICBkeW5hbWljIGxpbmtlciBzb21laG93IHRhZ3Mgd2hpY2ggbGliYyB2ZXJzaW9uIHRvIHVzZSBpbgotICAgL2V0Yy9sZC5zby5jYWNoZSwgYW5kLCBiYXNlZCBvbiB0aGUgbGliYyB0aGF0IGl0IHNlZXMgaW4gdGhlCi0gICBleGVjdXRhYmxlLCBjaG9vc2VzIHdoaWNoIHZlcnNpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHRvIHVzZS4KLQotICAgV2UgdHJ5IHRvIGRvIGEgc2ltaWxhciBjaGVjayBoZXJlIGJ5IGNoZWNraW5nIHdoZXRoZXIgdGhpcyBzaGFyZWQKLSAgIGxpYnJhcnkgbmVlZHMgYW55IG90aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2hpY2ggbWF5IGNvbmZsaWN0IHdpdGgKLSAgIGxpYnJhcmllcyB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBJZiBpdCBkb2VzLCB3ZQotICAgc2tpcCBpdCwgYW5kIHRyeSB0byBmaW5kIGFub3RoZXIgc2hhcmVkIGxpYnJhcnkgZmFydGhlciBvbiBkb3duIHRoZQotICAgbGluayBwYXRoLgotCi0gICBUaGlzIGlzIGNhbGxlZCB2aWEgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlLgotICAgR0xPQkFMX1ZFUkNIRUNLX05FRURFRCBpcyB0aGUgbGlzdCBvZiBvYmplY3RzIG5lZWRlZCBieSB0aGUgb2JqZWN0Ci0gICB3aGljaCB3ZSBhciBjaGVja2luZy4gIFRoaXMgc2V0cyBHTE9CQUxfVkVSQ0hFQ0tfRkFJTEVEIGlmIHdlIGZpbmQKLSAgIGEgY29uZmxpY3RpbmcgdmVyc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgY29uc3QgY2hhciAqc29uYW1lLCAqZjsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0gIGlmIChnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTAotICAgICAgfHwgKGJmZF9nZXRfZmlsZV9mbGFncyAocy0+dGhlX2JmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHJldHVybjsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gYmZkX2dldF9maWxlbmFtZSAocy0+dGhlX2JmZCk7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGZvciAobCA9IGdsb2JhbF92ZXJjaGVja19uZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc3VmZml4OwotCi0gICAgICBpZiAoc3RyY21wIChmLCBsLT5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIFByb2JhYmx5IGNhbid0IGhhcHBlbiwgYnV0IGl0J3MgYW4gZWFzeSBjaGVjay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJjaHIgKGwtPm5hbWUsICcvJykgIT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgc3VmZml4ID0gc3Ryc3RyIChsLT5uYW1lLCAiLnNvLiIpOwotICAgICAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzdWZmaXggKz0gc2l6ZW9mICIuc28uIiAtIDE7Ci0KLSAgICAgIGlmIChzdHJuY21wIChmLCBsLT5uYW1lLCBzdWZmaXggLSBsLT5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIEhlcmUgd2Uga25vdyB0aGF0IFMgaXMgYSBkeW5hbWljIG9iamVjdCBGT08uU08uVkVSMSwgYW5kCi0gICAgICAgICAgICAgdGhlIG9iamVjdCB3ZSBhcmUgY29uc2lkZXJpbmcgbmVlZHMgYSBkeW5hbWljIG9iamVjdAotICAgICAgICAgICAgIEZPTy5TTy5WRVIyLCBhbmQgVkVSMSBhbmQgVkVSMiBhcmUgZGlmZmVyZW50LiAgVGhpcwotICAgICAgICAgICAgIGFwcGVhcnMgdG8gYmUgYSB2ZXJzaW9uIG1pc21hdGNoLCBzbyB3ZSB0ZWxsIHRoZSBjYWxsZXIKLSAgICAgICAgICAgICB0byB0cnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuICAqLwotCSAgZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgcmFuZG9tIFNIRl9BTExPQwotICAgc2VjdGlvbnMgaW4gdGhlIHJpZ2h0IHNlZ21lbnQuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yb2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfYnNzOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcmVsOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfaW50ZXJwOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgYXNlY3Rpb24gKnNuZXcsICoqcHBzOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGFkZDsKLSAgZXRyZWVfdHlwZSAqYWRkcmVzczsKLSAgY29uc3QgY2hhciAqc2VjbmFtZSwgKnBzOwotICBjb25zdCBjaGFyICpvdXRzZWNuYW1lOwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLSAgaG9sZF9zZWN0aW9uID0gczsKLSAgaG9sZF91c2UgPSBOVUxMOwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik7Ci0KLSAgaWYgKGhvbGRfdXNlICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHBsYWNlZCBhIHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUuICAqLwotICAgICAgd2lsZF9kb2l0ICgmaG9sZF91c2UtPmNoaWxkcmVuLCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vd25lciwgcyk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIHRoZW4gYWx3YXlzIHB1dCAuZ251Lndhcm5pbmcuU1lNQk9MCi0gICAgIHNlY3Rpb25zIGludG8gdGhlIC50ZXh0IHNlY3Rpb24gdG8gZ2V0IHRoZW0gb3V0IG9mIHRoZSB3YXkuICAqLwotICBpZiAoISBsaW5rX2luZm8uc2hhcmVkCi0gICAgICAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN0cm5jbXAgKHNlY25hbWUsICIuZ251Lndhcm5pbmcuIiwgc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDEpID09IDAKLSAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdGV4dC0+Y2hpbGRyZW4sIHMsIGhvbGRfdGV4dCwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogRGVjaWRlIHdoaWNoIHNlZ21lbnQgdGhlIHNlY3Rpb24gc2hvdWxkIGdvIGluIGJhc2VkIG9uIHRoZQotICAgICBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICBXZSBwdXQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMKLSAgICAgcmlnaHQgYWZ0ZXIgdGhlIC5pbnRlcnAgc2VjdGlvbiwgc28gdGhhdCB0aGUgUFRfTk9URSBzZWdtZW50IGlzCi0gICAgIHN0b3JlZCByaWdodCBhZnRlciB0aGUgcHJvZ3JhbSBoZWFkZXJzIHdoZXJlIHRoZSBPUyBjYW4gcmVhZCBpdAotICAgICBpbiB0aGUgZmlyc3QgcGFnZS4gICovCi0gIHBsYWNlID0gTlVMTDsKLSAgaWYgKHMtPmZsYWdzICYgU0VDX0VYQ0xVREUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5ub3RlIiwgNCkgPT0gMAotICAgICAgJiYgaG9sZF9pbnRlcnAgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfaW50ZXJwOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICAgJiYgaG9sZF9ic3MgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfYnNzOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKLQkgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfZGF0YTsKLSAgZWxzZSBpZiAoc3RybmNtcCAoc2VjbmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JICAgJiYgaG9sZF9yZWwgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcmVsOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfcm9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JvZGF0YTsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3RleHQ7Ci0gIGlmIChwbGFjZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDaG9vc2UgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlY3Rpb24uICBUaGlzIHdpbGwgYmUgbmVlZGVkIGlmIHRoZQotICAgICBzYW1lIHNlY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBpbnB1dCBmaWxlIHdpdGggZGlmZmVyZW50Ci0gICAgIGxvYWRhYmxlIG9yIGFsbG9jYXRlYWJsZSBjaGFyYWN0ZXJpc3RpY3MuICAqLwotICBvdXRzZWNuYW1lID0gc2VjbmFtZTsKLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgICBjaGFyICpuZXduYW1lOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAob3V0c2VjbmFtZSk7Ci0gICAgICBuZXduYW1lID0geG1hbGxvYyAobGVuICsgNSk7Ci0gICAgICBzdHJjcHkgKG5ld25hbWUsIG91dHNlY25hbWUpOwotICAgICAgaSA9IDA7Ci0gICAgICBkbwotCXsKLQkgIHNwcmludGYgKG5ld25hbWUgKyBsZW4sICIlZCIsIGkpOwotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmV3bmFtZSkgIT0gTlVMTCk7Ci0KLSAgICAgIG91dHNlY25hbWUgPSBuZXduYW1lOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZSByaWdodAotICAgICBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sgbmVhdGVyLiAgKi8KLSAgc25ldyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIG91dHNlY25hbWUpOwotICBpZiAoc25ldyA9PSBOVUxMKQotICAgICAgZWluZm8gKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIsCi0JICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBvdXRzZWNuYW1lKTsKLSAgaWYgKHBsYWNlLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAocHBzID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOyAqcHBzICE9IHNuZXc7IHBwcyA9ICYoKnBwcyktPm5leHQpCi0JOwotICAgICAgKnBwcyA9IHNuZXctPm5leHQ7Ci0gICAgICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotICAgICAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLSAgICB9Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBsaXN0IG9mIHN0YXRlbWVudHMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIG9sZCA9IHN0YXRfcHRyOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0gIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7Ci0KLSAgLyogSWYgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaXMgcmVwcmVzZW50YWJsZSBpbiBDLCB0aGVuIGNyZWF0ZQotICAgICBzeW1ib2xzIHRvIG1hcmsgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgZm9yIChwcyA9IG91dHNlY25hbWU7ICpwcyAhPSAnXDAnOyBwcysrKQotICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcHMpICYmICpwcyAhPSAnXycpCi0gICAgICBicmVhazsKLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gb3V0c2VjbmFtZSArIHNpemVvZiAiX19zdGFydF8iKTsKLSAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0YXJ0XyVzIiwgb3V0c2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfdW5vcCAoQUxJR05fSywKLQkJCQkJCWV4cF9pbnRvcCAoKGJmZF92bWEpIDEKLQkJCQkJCQkgICA8PCBzLT5hbGlnbm1lbnRfcG93ZXIpKSkpOwotICAgIH0KLQotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIGFkZHJlc3MgPSBOVUxMOwotICBlbHNlCi0gICAgYWRkcmVzcyA9IGV4cF9pbnRvcCAoKGJmZF92bWEpIDApOwotCi0gIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRzZWNuYW1lLCBhZGRyZXNzLCAwLAotCQkJCSAgICAgICAoYmZkX3ZtYSkgMCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCk7Ci0KLSAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHNlY25hbWUpOwotICB3aWxkX2RvaXQgKCZvcy0+Y2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQotICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotICAgICgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIsIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCwKLSAgICAgIipkZWZhdWx0KiIpOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0KLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gb3V0c2VjbmFtZSArIHNpemVvZiAiX19zdG9wXyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RvcF8lcyIsIG91dHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSkpOwotICAgIH0KLQotICAvKiBOb3cgc3RpY2sgdGhlIG5ldyBzdGF0ZW1lbnQgbGlzdCByaWdodCBhZnRlciBQTEFDRS4gICovCi0gICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLSAgcGxhY2UtPmhlYWRlci5uZXh0ID0gYWRkLmhlYWQ7Ci0KLSAgc3RhdF9wdHIgPSBvbGQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb24tPm5hbWUpID09IDAKLSAgICAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiAoKGhvbGRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQotCSAgPT0gKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKSkpCi0gICAgaG9sZF91c2UgPSBvczsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICBob2xkX3RleHQgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5yb2RhdGEiKSA9PSAwKQotICAgIGhvbGRfcm9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotICBlbHNlIGlmIChob2xkX3JlbCA9PSBOVUxMCi0JICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLQkgICAmJiAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICYmIHN0cm5jbXAgKG9zLT5uYW1lLCAiLnJlbCIsIDQpID09IDApCi0gICAgaG9sZF9yZWwgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5pbnRlcnAiKSA9PSAwKQotICAgIGhvbGRfaW50ZXJwID0gb3M7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLQotICAgICAgLyogV2UgY2FsbCByZWNvcmRfbGlua19hc3NpZ25tZW50IGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLgotCSBUaGlzIGlzIGJlY2F1c2UgaWYgaXQgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCB3ZQotCSBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgZGVmaW5lZCBieSB0aGUgbGlua2VyIHNjcmlwdCwKLQkgbm90IHRoZSB2YWx1ZSBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCAoYmVjYXVzZSB3ZSBhcmUgc2V0dGluZwotCSBzeW1ib2xzIGxpa2UgZXRleHQpLiAgSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhcgotCSBvYmplY3QsIHRoZW4sIGFzIGl0IGhhcHBlbnMsIGNhbGxpbmcgcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCSB3aWxsIGRvIG5vIGhhcm0uICAqLwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgKGJmZF9lbGYke0VMRlNJWkV9X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkJIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBleHAtPmFzc2lnbi5kc3QsCi0JCSAgZXhwLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfcHJvdmlkZSA/IHRydWUgOiBmYWxzZSkpKQotCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9jYXRlcyBhbnkgYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBhbmQKLSAgIHRlbGxzIHRoZSBFTEYgYmFja2VuZCBhYm91dCB0aGVtLCBpbiBjYXNlIHRoZXkgYXJlIGFzc2lnbm1lbnRzIHRvCi0gICBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bSkKLSAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJwYXRoOwotICBhc2VjdGlvbiAqc2ludGVycDsKLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0Ci0gICAgIHRoZSBFTEYgYmFja2VuZCBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQotICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCk7Ci0KLSAgLyogTGV0IHRoZSBFTEYgYmFja2VuZCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYW55IHNlY3Rpb25zIHJlcXVpcmVkCi0gICAgIGJ5IGR5bmFtaWMgbGlua2luZy4gICovCi0gIHJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOwotICBpZiAocnBhdGggPT0gTlVMTCkKLSAgICBycGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0gIGlmICghIChiZmRfZWxmJHtFTEZTSVpFfV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgICAgICAgIChvdXRwdXRfYmZkLCBjb21tYW5kX2xpbmUuc29uYW1lLCBycGF0aCwKLQkgIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYywgY29tbWFuZF9saW5lLmZpbHRlcl9zaGxpYiwKLQkgIChjb25zdCBjaGFyICogY29uc3QgKikgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzLAotCSAgJmxpbmtfaW5mbywgJnNpbnRlcnAsIGxhbmdfZWxmX3ZlcnNpb25faW5mbykpKQotICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKLQotICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIGR5bmFtaWMgbGlua2VyIHdlIGFyZSB1c2luZy4gICovCi0gIGlmIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgIT0gTlVMTAotICAgICAgJiYgc2ludGVycCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpbnRlcnAtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcjsKLSAgICAgIHNpbnRlcnAtPl9yYXdfc2l6ZSA9IHN0cmxlbiAoY29tbWFuZF9saW5lLmludGVycHJldGVyKSArIDE7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGFueSBzZWN0aW9ucyBuYW1lZCAuZ251Lndhcm5pbmcuICBBcyBhIEdOVSBleHRlbnNpb25zLAotICAgICB3ZSB0cmVhdCBzdWNoIHNlY3Rpb25zIGFzIGNvbnRhaW5pbmcgd2FybmluZyBtZXNzYWdlcy4gIFdlIHByaW50Ci0gICAgIG91dCB0aGUgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiB6ZXJvIG91dCB0aGUgc2VjdGlvbiBzaXplIHNvCi0gICAgIHRoYXQgaXQgZG9lcyBub3QgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlhc2VjdGlvbiAqczsKLQliZmRfc2l6ZV90eXBlIHN6OwotCWNoYXIgKm1zZzsKLQlib29sZWFuIHJldDsKLQotCWlmIChpcy0+anVzdF9zeW1zX2ZsYWcpCi0JICBjb250aW51ZTsKLQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZ251Lndhcm5pbmciKTsKLQlpZiAocyA9PSBOVUxMKQotCSAgY29udGludWU7Ci0KLQlzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzKTsKLQltc2cgPSB4bWFsbG9jICgoc2l6ZV90KSBzeiArIDEpOwotCWlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaXMtPnRoZV9iZmQsIHMsIG1zZywgKGZpbGVfcHRyKSAwLCBzeikpCi0JICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuZ251Lndhcm5pbmc6ICVFXG4iLAotCQkgaXMtPnRoZV9iZmQpOwotCW1zZ1tzel0gPSAnXDAnOwotCXJldCA9IGxpbmtfaW5mby5jYWxsYmFja3MtPndhcm5pbmcgKCZsaW5rX2luZm8sIG1zZywKLQkJCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSAgICBpcy0+dGhlX2JmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSAgICAoYmZkX3ZtYSkgMCk7Ci0JQVNTRVJUIChyZXQpOwotCWZyZWUgKG1zZyk7Ci0KLQkvKiBDbG9iYmVyIHRoZSBzZWN0aW9uIHNpemUsIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgY29weWluZyB0aGUKLQkgICB3YXJuaW5nIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQlzLT5fcmF3X3NpemUgPSAwOwotICAgICAgfQotICB9Ci0KLSAgLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YiBzZWN0aW9uICovCi0KLSAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlIGluZm9ybWF0aW9uICovCi0gIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZSBvcHRpb24/IGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgIG5vX3BpcGVsaW5lX2tub3dsZWRnZSkpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2ggUEFSQU1TKCh2b2lkKSkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0gIGlmICh0aHVtYl9lbnRyeV9zeW1ib2wgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIAotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCB0aHVtYl9lbnRyeV9zeW1ib2wsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLSAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZmZlclszMl07Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIAotICAgICAgLyogU3BlY2lhbCBwcm9jZXNpbmcgaXMgcmVxdWlyZWQgZm9yIGEgVGh1bWIgZW50cnkgc3ltYm9sLiAgVGhlCi0JIGJvdHRvbSBiaXQgb2YgaXRzIGFkZHJlc3MgbXVzdCBiZSBzZXQuICAqLwotICAgICAgdmFsID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCi0JCQkJICAgIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotCSAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgdmFsIHw9IDE7Ci0KLSAgICAgIC8qIE5vdyBjb252ZXJ0IHRoaXMgdmFsdWUgaW50byBhIHN0cmluZyBhbmQgc3RvcmUgaXQgaW4gZW50cnlfc3ltYm9sCi0gICAgICAgICB3aGVyZSB0aGUgbGFuZ19maW5pc2goKSBmdW5jdGlvbiB3aWxsIHBpY2sgaXQgdXAuICAqLwotICAgICAgYnVmZmVyWzBdID0gJzAnOwotICAgICAgYnVmZmVyWzFdID0gJ3gnOwotICAgICAgCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmZmVyICsgMiwgdmFsKTsKLQotICAgICAgaWYgKGVudHJ5X3N5bWJvbCAhPSBOVUxMICYmIGVudHJ5X2Zyb21fY21kbGluZSkKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6ICctLXRodW1iLWVudHJ5ICVzJyBpcyBvdmVycmlkaW5nICctZSAlcydcbiIpLAotCSAgICAgICB0aHVtYl9lbnRyeV9zeW1ib2wsIGVudHJ5X3N5bWJvbCk7Ci0gICAgICBlbnRyeV9zeW1ib2wgPSBidWZmZXI7Ci0gICAgfQotICBlbHNlCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjb25ub3QgZmluZCB0aHVtYiBzdGFydCBzeW1ib2wgJXNcbiIpLCB0aHVtYl9lbnRyeV9zeW1ib2wpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1pZiB0ZXN0IC1uICIkR0VORVJBVEVfU0hMSUJfU0NSSVBUIiA7IHRoZW4KLSAgICAgICAgZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpIHJldHVybicgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLSAgICAgICAgc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHMgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWZpCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cyI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2gsCi0gIE5VTEwsCS8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIE5VTEwsCS8qIHNldCBzeW1ib2xzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIE5VTEwsCS8qIHVucmVjb2duaXplZCBmaWxlICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucywKLSAgTlVMTCwJLyogcmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwgCS8qIGZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtIGIvbGQvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGNhODdhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlICgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YiBzZWN0aW9uICovCi0KLSAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlIGluZm9ybWF0aW9uICovCi0gIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZSBvcHRpb24/IGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGlzLT50aGVfYmZkLCAmbGlua19pbmZvLCAwKSkKLQkgIHsKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiKSwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLQotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgewotICAgICAgLyogVGhlIGludGVyd29ya2luZyBiZmQgbXVzdCBiZSB0aGUgbGFzdCBvbmUgdG8gYmUgcHJvY2Vzc2VkICovCi0gICAgICBpZiAoIWlzLT5uZXh0KQotICAgICAgICAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbyk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsCS8qIGZpbmlzaCAqLwotICBOVUxMLAkvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLAkvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBOVUxMLAkvKiBwbGFjZSBvcnBoYW4gKi8KLSAgTlVMTCwJLyogc2V0IHN5bWJvbHMgKi8KLSAgTlVMTCwJLyogcGFyc2UgYXJncyAqLwotICBOVUxMLAkvKiB1bnJlY29nbml6ZWQgZmlsZSAqLwotICBOVUxMLAkvKiBsaXN0IG9wdGlvbnMgKi8KLSAgTlVMTCwJLyogcmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwgCS8qIGZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FzdHJpbmcuc2VkIGIvbGQvZW11bHRlbXBsL2FzdHJpbmcuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGJkOGE2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9hc3RyaW5nLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXMvWyJcXF0vXFwmL2cKLXMvJC9cXG5cXC8KLTEgcy9eLyIvCi0yNXMvXFwkLyIvCi0yNnMvXi8iLwotNTBzL1xcJC8iLwotNTFzL14vIi8KLTc1cy9cXCQvIi8KLTc2cy9eLyIvCi0xMDBzL1xcJC8iLwotMTAxcy9eLyIvCi0kIHMvJC9uIi8KLSQgcy9cXG4ibiIkL1xcbiIvCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYmVvcy5lbSBiL2xkL2VtdWx0ZW1wbC9iZW9zLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzE0ZmJjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9iZW9zLmVtCisrKyAvZGV2L251bGwKQEAgLTEsODQxICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRm9yIFdJTkRPV1NfTlQgKi8KLS8qIFRoZSBvcmlnaW5hbCBmaWxlIGdlbmVyYXRlZCByZXR1cm5lZCBkaWZmZXJlbnQgZGVmYXVsdCBzY3JpcHRzIGRlcGVuZGluZwotICAgb24gd2hldGhlciBjZXJ0YWluIHN3aXRjaGVzIHdlcmUgc2V0LCBidXQgdGhlc2Ugc3dpdGNoZXMgcGVydGFpbiB0byB0aGUKLSAgIExpbnV4IHN5c3RlbSBhbmQgdGhhdCBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgY29mZi4gIEluIHRoZSBOVCBjYXNlLCB3ZQotICAgb25seSBkZXRlcm1pbmUgaWYgdGhlIHN1YnN5c3RlbSBpcyBjb25zb2xlIG9yIHdpbmRvd3MgaW4gb3JkZXIgdG8gc2VsZWN0Ci0gICB0aGUgY29ycmVjdCBlbnRyeSBwb2ludCBieSBkZWZhdWx0LiAqLyAKLSAgCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGNoYXIgKmdsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqKSk7Ci1zdGF0aWMgaW50IGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi0jaWYgMCAvKiBhcmd1bWVudCB0byBxc29ydCBzbyBkb24ndCBwcm90b3R5cGUgKi8KLXN0YXRpYyBpbnQgc29ydF9ieV9maWxlX25hbWUgUEFSQU1TICgodm9pZCAqLCB2b2lkICopKTsKLXN0YXRpYyBpbnQgc29ydF9ieV9zZWN0aW9uX25hbWUgUEFSQU1TICgodm9pZCAqLCB2b2lkICopKTsKLSNlbmRpZgotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipzb3J0X3NlY3Rpb25zXzEKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiwgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqLCBpbnQsCi0JICAgaW50ICgqKSgpKSk7Ci1zdGF0aWMgdm9pZCBzb3J0X3NlY3Rpb25zIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotCi1zdGF0aWMgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGU7Ci1zdGF0aWMgaW50IGRsbDsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBvdXRwdXRfZmlsZW5hbWUgPSAiYS5leGUiOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci19Ci0MCi0vKiBQRSBmb3JtYXQgZXh0cmEgY29tbWFuZCBsaW5lIG9wdGlvbnMuICAqLwotCi0vKiBVc2VkIGZvciBzZXR0aW5nIGZsYWdzIGluIHRoZSBQRSBoZWFkZXIuICovCi0jZGVmaW5lIE9QVElPTl9CQVNFX0ZJTEUJCSgzMDAgICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RMTAkJCShPUFRJT05fQkFTRV9GSUxFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0ZJTEVfQUxJR05NRU5UCQkoT1BUSU9OX0RMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCQkoT1BUSU9OX0ZJTEVfQUxJR05NRU5UICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9JTUFHRV9CQVNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01BSk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01JTk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQJKE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TVEFDSyAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVUJTWVNURU0gICAgICAgICAgICAgICAgKE9QVElPTl9TVEFDSyArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUFQCQkJKE9QVElPTl9TVUJTWVNURU0gKyAxKQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0gewotICAvKiBQRSBvcHRpb25zICovCi0gICAgeyJiYXNlLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JBU0VfRklMRX0sCi0gICAgeyJkbGwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RMTH0sCi0gICAgeyJmaWxlLWFsaWdubWVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRklMRV9BTElHTk1FTlR9LAotICAgIHsiaGVhcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVBUH0sIAotICAgIHsiaW1hZ2UtYmFzZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1BR0VfQkFTRX0sIAotICAgIHsibWFqb3ItaW1hZ2UtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTn0sCi0gICAgeyJtYWpvci1vcy12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OfSwKLSAgICB7Im1ham9yLXN1YnN5c3RlbS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTn0sCi0gICAgeyJtaW5vci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OfSwKLSAgICB7Im1pbm9yLW9zLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX09TX1ZFUlNJT059LAotICAgIHsibWlub3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKLSAgICB7InNlY3Rpb24tYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVH0sCi0gICAgeyJzdGFjayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBQ0t9LAotICAgIHsic3Vic3lzdGVtIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVUJTWVNURU19LAotICAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotICB9OwotCi0KLS8qIFBFL1dJTjMyOyBhZGRlZCByb3V0aW5lcyB0byBnZXQgdGhlIHN1YnN5c3RlbSB0eXBlLCBoZWFwIGFuZC9vciBzdGFjawotICAgcGFyYW1ldGVycyB3aGljaCBtYXkgYmUgaW5wdXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdm9pZCAqcHRyOwotICBpbnQgc2l6ZTsKLSAgaW50IHZhbHVlOwotICBjaGFyICpzeW1ib2w7Ci0gIGludCBpbml0ZWQ7Ci19IGRlZmluZm87Ci0KLSNkZWZpbmUgRChmaWVsZCxzeW1ib2wsZGVmKSAgeyZwZS5maWVsZCxzaXplb2YocGUuZmllbGQpLCBkZWYsIHN5bWJvbCwwfQotCi1zdGF0aWMgZGVmaW5mbyBpbml0W10gPQotewotICAvKiBpbWFnZWJhc2UgbXVzdCBiZSBmaXJzdCAqLwotI2RlZmluZSBJTUFHRUJBU0VPRkYgMAotICBEKEltYWdlQmFzZSwiX19pbWFnZV9iYXNlX18iLCBCRU9TX0VYRV9JTUFHRV9CQVNFKSwKLSNkZWZpbmUgRExMT0ZGIDEKLSAgeyZkbGwsIHNpemVvZihkbGwpLCAwLCAiX19kbGxfXyJ9LAotICBEKFNlY3Rpb25BbGlnbm1lbnQsIl9fc2VjdGlvbl9hbGlnbm1lbnRfXyIsIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCksCi0gIEQoRmlsZUFsaWdubWVudCwiX19maWxlX2FsaWdubWVudF9fIiwgUEVfREVGX0ZJTEVfQUxJR05NRU5UKSwKLSAgRChNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWFqb3Jfb3NfdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCJfX21pbm9yX29zX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9ySW1hZ2VWZXJzaW9uLCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIsIDEpLAotICBEKE1pbm9ySW1hZ2VWZXJzaW9uLCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9yU3Vic3lzdGVtVmVyc2lvbiwiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCAwKSwKLSAgRChTdWJzeXN0ZW0sIl9fc3Vic3lzdGVtX18iLCAzKSwKLSAgRChTaXplT2ZTdGFja1Jlc2VydmUsIl9fc2l6ZV9vZl9zdGFja19yZXNlcnZlX18iLCAweDIwMDAwMDApLAotICBEKFNpemVPZlN0YWNrQ29tbWl0LCJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iLCAweDEwMDApLAotICBEKFNpemVPZkhlYXBSZXNlcnZlLCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAweDEwMDAwMCksCi0gIEQoU2l6ZU9mSGVhcENvbW1pdCwiX19zaXplX29mX2hlYXBfY29tbWl0X18iLCAweDEwMDApLAotICBEKExvYWRlckZsYWdzLCJfX2xvYWRlcl9mbGFnc19fIiwgMHgwKSwKLSAgeyBOVUxMLCAwLCAwLCBOVUxMLCAwIH0KLX07Ci0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9uYW1lIChuYW1lLCB2YWwpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxvbmcgdmFsOwotewotICBpbnQgaTsKLSAgLyogRmluZCB0aGUgbmFtZSBhbmQgc2V0IGl0LiAqLwotICBmb3IgKGkgPSAwOyBpbml0W2ldLnB0cjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGluaXRbaV0uc3ltYm9sKSA9PSAwKQotCXsKLQkgIGluaXRbaV0udmFsdWUgPSB2YWw7Ci0JICBpbml0W2ldLmluaXRlZCA9IDE7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgYWJvcnQoKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3N1YnN5c3RlbSAoKQotewotICBjb25zdCBjaGFyICpzdmVyOwotICBpbnQgbGVuOwotICBpbnQgaTsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCAKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY29uc3QgaW50IHZhbHVlOwotICAgICAgY29uc3QgY2hhciAqZW50cnk7Ci0gICAgfQotICB2W10gPQotICAgIHsKLSAgICAgIHsgIm5hdGl2ZSIsIDEsICJfTnRQcm9jZXNzU3RhcnR1cCIgfSwKLSAgICAgIHsgIndpbmRvd3MiLCAyLCAiX1dpbk1haW5DUlRTdGFydHVwIiB9LAotICAgICAgeyAid3dpbmRvd3MiLCAyLCAiX3dXaW5NYWluQ1JUU3RhcnR1cCIgfSwKLSAgICAgIHsgImNvbnNvbGUiLCAzLCAiX21haW5DUlRTdGFydHVwIiB9LAotICAgICAgeyAid2NvbnNvbGUiLCAzLCAiX3dtYWluQ1JUU3RhcnR1cCIgfSwKLSNpZiAwCi0gICAgICAvKiBUaGUgTWljcm9zb2Z0IGxpbmtlciBkb2VzIG5vdCByZWNvZ25pemUgdGhpcy4gICovCi0gICAgICB7ICJvczIiLCA1LCAiIiB9LAotI2VuZGlmCi0gICAgICB7ICJwb3NpeCIsIDcsICJfX19Qb3NpeFByb2Nlc3NTdGFydHVwIn0sCi0gICAgICB7IDAsIDAsIDAgfQotICAgIH07Ci0KLSAgc3ZlciA9IHN0cmNociAob3B0YXJnLCAnOicpOwotICBpZiAoc3ZlciA9PSBOVUxMKQotICAgIGxlbiA9IHN0cmxlbiAob3B0YXJnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmVuZDsKLQotICAgICAgbGVuID0gc3ZlciAtIG9wdGFyZzsKLSAgICAgIHNldF9wZV9uYW1lICgiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgc3RydG91bCAoc3ZlciArIDEsICZlbmQsIDApKTsKLSAgICAgIGlmICgqZW5kID09ICcuJykKLQlzZXRfcGVfbmFtZSAoIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsCi0JCSAgICAgc3RydG91bCAoZW5kICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBiYWQgdmVyc2lvbiBudW1iZXIgaW4gLXN1YnN5c3RlbSBvcHRpb25cbiIpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyB2W2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAob3B0YXJnLCB2W2ldLm5hbWUsIGxlbikgPT0gMAotCSAgJiYgdltpXS5uYW1lW2xlbl0gPT0gJ1wwJykKLQl7Ci0JICBzZXRfcGVfbmFtZSAoIl9fc3Vic3lzdGVtX18iLCB2W2ldLnZhbHVlKTsKLQotCSAgLyogSWYgdGhlIHN1YnN5c3RlbSBpcyB3aW5kb3dzLCB3ZSB1c2UgYSBkaWZmZXJlbnQgZW50cnkKLQkgICAgIHBvaW50LiAgV2UgYWxzbyByZWdpc3RlciB0aGUgZW50cnkgcG9pbnQgYXMgYW4gdW5kZWZpbmVkCi0JICAgICBzeW1ib2wuIGZyb20gbGFuZ19hZGRfZW50cnkoKSBUaGUgcmVhc29uIHdlIGRvCi0JICAgICB0aGlzIGlzIHNvIHRoYXQgdGhlIHVzZXIKLQkgICAgIGRvZXNuJ3QgaGF2ZSB0byBiZWNhdXNlIHRoZXkgd291bGQgaGF2ZSB0byB1c2UgdGhlIC11Ci0JICAgICBzd2l0Y2ggaWYgdGhleSB3ZXJlIHNwZWNpZnlpbmcgYW4gZW50cnkgcG9pbnQgb3RoZXIgdGhhbgotCSAgICAgX21haW5DUlRTdGFydHVwLiAgU3BlY2lmaWNhbGx5LCBpZiBjcmVhdGluZyBhIHdpbmRvd3MKLQkgICAgIGFwcGxpY2F0aW9uLCBlbnRyeSBwb2ludCBfV2luTWFpbkNSVFN0YXJ0dXAgbXVzdCBiZQotCSAgICAgc3BlY2lmaWVkLiAgV2hhdCBJIGhhdmUgZm91bmQgZm9yIG5vbiBjb25zb2xlCi0JICAgICBhcHBsaWNhdGlvbnMgKGVudHJ5IG5vdCBfbWFpbkNSVFN0YXJ0dXApIGlzIHRoYXQgdGhlIC5vYmoKLQkgICAgIHRoYXQgY29udGFpbnMgbWFpbkNSVFN0YXJ0dXAgaXMgYnJvdWdodCBpbiBzaW5jZSBpdCBpcwotCSAgICAgdGhlIGZpcnN0IGVuY291bnRlcmVkIGluIGxpYmMubGliIGFuZCBpdCBoYXMgb3RoZXIKLQkgICAgIHN5bWJvbHMgaW4gaXQgd2hpY2ggd2lsbCBiZSBwdWxsZWQgaW4gYnkgdGhlIGxpbmsKLQkgICAgIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCBhZGRpbmcgLXUgd2l0aCB0aGUgZW50cnkgcG9pbnQKLQkgICAgIG5hbWUgc3BlY2lmaWVkIGZvcmNlcyB0aGUgY29ycmVjdCAub2JqIHRvIGJlIHVzZWQuICBXZQotCSAgICAgY2FuIGF2b2lkIG1ha2luZyB0aGUgdXNlciBkbyB0aGlzIGJ5IGFsd2F5cyBhZGRpbmcgdGhlCi0JICAgICBlbnRyeSBwb2ludCBuYW1lIGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgbGFuZ19hZGRfZW50cnkgKHZbaV0uZW50cnksIDEpOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWluZm8gKCIlUCVGOiBpbnZhbGlkIHN1YnN5c3RlbSB0eXBlICVzXG4iLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIHZvaWQKLXNldF9wZV92YWx1ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgCi17Ci0gIGNoYXIgKmVuZDsKLSAgc2V0X3BlX25hbWUgKG5hbWUsICBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApKTsKLSAgaWYgKGVuZCA9PSBvcHRhcmcpCi0gICAgewotICAgICAgZWluZm8gKCIlUCVGOiBpbnZhbGlkIGhleCBudW1iZXIgZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iLCBvcHRhcmcpOwotICAgIH0KLQotICBvcHRhcmcgPSBlbmQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfc3RhY2tfaGVhcCAocmVzbmFtZSwgY29tbmFtZSkKLSAgICAgY2hhciAqcmVzbmFtZTsKLSAgICAgY2hhciAqY29tbmFtZTsKLXsKLSAgc2V0X3BlX3ZhbHVlIChyZXNuYW1lKTsKLSAgaWYgKCpvcHRhcmcgPT0gJywnKQotICAgIHsKLSAgICAgIG9wdGFyZysrOwotICAgICAgc2V0X3BlX3ZhbHVlIChjb21uYW1lKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCpvcHRhcmcpCi0gICAgewotICAgICAgZWluZm8gKCIlUCVGOiBzdHJhbmdlIGhleCBpbmZvIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIiwgb3B0YXJnKTsKLSAgICB9Ci19Ci0KLQotCi1zdGF0aWMgaW50Ci1nbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyhhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBsb25naW5kOwotICBpbnQgb3B0YzsKLSAgaW50IHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgd2FudGVycm9yOwotICBzdGF0aWMgaW50IGxhc3RvcHRpbmQgPSAtMTsKLQotICBpZiAobGFzdG9wdGluZCAhPSBvcHRpbmQpCi0gICAgb3B0ZXJyID0gMDsKLSAgd2FudGVycm9yID0gb3B0ZXJyOwotCi0gIGxhc3RvcHRpbmQgPSBvcHRpbmQ7Ci0KLSAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItIiwgbG9uZ29wdHMsICZsb25naW5kKTsKLSAgb3B0ZXJyID0gcHJldm9wdGVycjsKLQotICBzd2l0Y2ggKG9wdGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAod2FudGVycm9yKQotCXhleGl0ICgxKTsKLSAgICAgIG9wdGluZCA9ICBwcmV2b3B0aW5kOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIE9QVElPTl9CQVNFX0ZJTEU6Ci0gICAgICBsaW5rX2luZm8uYmFzZV9maWxlID0gKFBUUikgZm9wZW4gKG9wdGFyZywgRk9QRU5fV0IpOwotICAgICAgaWYgKGxpbmtfaW5mby5iYXNlX2ZpbGUgPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogQ2FuJ3Qgb3BlbiBiYXNlIGZpbGUgJXNcbiIsCi0JCSAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkgIHhleGl0ICgxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogUEUgb3B0aW9ucyAqLwotICAgIGNhc2UgT1BUSU9OX0hFQVA6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAiX19zaXplX29mX2hlYXBfY29tbWl0X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NUQUNLOiAKLSAgICAgIHNldF9wZV9zdGFja19oZWFwICgiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsICJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NVQlNZU1RFTToKLSAgICAgIHNldF9wZV9zdWJzeXN0ZW0gKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9vc192ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9pbWFnZV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRklMRV9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX2ZpbGVfYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19zZWN0aW9uX2FsaWdubWVudF9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9ETEw6Ci0gICAgICBzZXRfcGVfbmFtZSAoIl9fZGxsX18iLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0lNQUdFX0JBU0U6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX2ltYWdlX2Jhc2VfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQwKLS8qIEFzc2lnbiB2YWx1ZXMgdG8gdGhlIHNwZWNpYWwgc3ltYm9scyBiZWZvcmUgdGhlIGxpbmtlciBzY3JpcHQgaXMKLSAgIHJlYWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzKCkKLXsKLSAgLyogUnVuIHRocm91Z2ggYW5kIGludmVudCBzeW1ib2xzIGZvciBhbGwgdGhlCi0gICAgIG5hbWVzIGFuZCBpbnNlcnQgdGhlIGRlZmF1bHRzLiAqLwotICBpbnQgajsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzYXZlOwotCi0gIGlmICghaW5pdFtJTUFHRUJBU0VPRkZdLmluaXRlZCkKLSAgICB7Ci0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSAwOwotICAgICAgZWxzZSBpZiAoaW5pdFtETExPRkZdLnZhbHVlKQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IEJFT1NfRExMX0lNQUdFX0JBU0U7Ci0gICAgICBlbHNlCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gQkVPU19FWEVfSU1BR0VfQkFTRTsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgZG8gYW55IHN5bWJvbCBhc3NpZ25tZW50cyBpZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgLyogR2x1ZSB0aGUgYXNzaWdubWVudHMgaW50byB0aGUgYWJzIHNlY3Rpb24gKi8KLSAgc2F2ZSA9IHN0YXRfcHRyOwotCi0gIHN0YXRfcHRyID0gJihhYnNfb3V0cHV0X3NlY3Rpb24tPmNoaWxkcmVuKTsKLQotICBmb3IgKGogPSAwOyBpbml0W2pdLnB0cjsgaisrKQotICAgIHsKLSAgICAgIGxvbmcgdmFsID0gaW5pdFtqXS52YWx1ZTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nICxpbml0W2pdLnN5bWJvbCwgZXhwX2ludG9wICh2YWwpKSk7Ci0gICAgICBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihzaG9ydCkpCi0JKihzaG9ydCAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihpbnQpKQotCSooaW50ICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGxvbmcpKQotCSoobG9uZyAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgLyogVGhpcyBtaWdodCBiZSBhIGxvbmcgbG9uZyBvciBvdGhlciBzcGVjaWFsIHR5cGUuICAqLwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihiZmRfdm1hKSkKLQkqKGJmZF92bWEgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UJYWJvcnQoKTsKLSAgICB9Ci0gIC8qIFJlc3RvcmUgdGhlIHBvaW50ZXIuICovCi0gIHN0YXRfcHRyID0gc2F2ZTsKLSAgCi0gIGlmIChwZS5GaWxlQWxpZ25tZW50ID4KLSAgICAgIHBlLlNlY3Rpb25BbGlnbm1lbnQpCi0gICAgewotICAgICAgZWluZm8gKCIlUDogd2FybmluZywgZmlsZSBhbGlnbm1lbnQgPiBzZWN0aW9uIGFsaWdubWVudC5cbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKCkKLXsKLSAgLyogUGFzcyB0aGUgd2Fja3kgUEUgY29tbWFuZCBsaW5lIG9wdGlvbnMgaW50byB0aGUgb3V0cHV0IGJmZC4KLSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGRvbmUgdmlhIGEgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGJ5Ci0gICAgIGluY2x1ZGluZyBhbiBpbnRlcm5hbCBCRkQgaGVhZGVyLiAgKi8KLSAgaWYgKCFjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotICAgIHsKLSAgICAgIGVpbmZvICgiJUYlUDogUEUgb3BlcmF0aW9ucyBvbiBub24gUEUgZmlsZS5cbiIpOwotICAgIH0KLQotICBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIgPSBwZTsKLSAgcGVfZGF0YShvdXRwdXRfYmZkKS0+ZGxsID0gaW5pdFtETExPRkZdLnZhbHVlOwotCi19Ci0MCi0vKiBDYWxsYmFjayBmdW5jdGlvbnMgZm9yIHFzb3J0IGluIHNvcnRfc2VjdGlvbnMuICovCi0KLXN0YXRpYyBpbnQKLXNvcnRfYnlfZmlsZV9uYW1lIChhLCBiKQotICAgICB2b2lkICphOwotICAgICB2b2lkICpiOwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmEgPSBhOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmIgPSBiOwotICBpbnQgaSwgYV9zZWMsIGJfc2VjOwotCi0gIGkgPSBzdHJjbXAgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLT5teV9hcmNoaXZlLT5maWxlbmFtZSwKLQkgICAgICAoKnJiKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZC0+bXlfYXJjaGl2ZS0+ZmlsZW5hbWUpOwotICBpZiAoaSAhPSAwKQotICAgIHJldHVybiBpOwotCi0gIGkgPSBzdHJjbXAgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT5maWxlbmFtZSwKLQkJICgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT5maWxlbmFtZSk7Ci0gIGlmIChpICE9IDApCi0gICAgcmV0dXJuIGk7Ci0gIC8qIHRoZSB0YWlsIGlkYXRhNC81IGFyZSB0aGUgb25seSBvbmVzIHdpdGhvdXQgcmVsb2NzIHRvIGFuCi0gICAgIGlkYXRhJDYgc2VjdGlvbiB1bmxlc3Mgd2UgYXJlIGltcG9ydGluZyBieSBvcmRpbmFsLCAKLSAgICAgc28gc29ydCB0aGVtIHRvIGxhc3QgdG8gdGVybWluYXRlIHRoZSBJQVQKLSAgICAgYW5kIEhOVCBwcm9wZXJseS4gaWYgbm8gcmVsb2MgdGhpcyBvbmUgaXMgaW1wb3J0IGJ5IG9yZGluYWwKLSAgICAgc28gd2UgaGF2ZSB0byBzb3J0IGJ5IHNlY3Rpb24gY29udGVudHMgKi8KLQotICBpZiAoICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCArICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50KSApCi0gICAgewotICAgICAgIGkgPSAgKCgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCA+IAotCQkgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQpID8gLTEgOiAwKTsKLSAgICAgICBpZiAoIGkgIT0gMCkKLSAgICAgICAgIHJldHVybiBpOwotCi0gICAgICAgIHJldHVybiAgKCgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCA+IAotCQkgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQpID8gMCA6IDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICBpZiAoIChzdHJjbXAoICgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsICIuaWRhdGEkNiIpID09IDApICkKLSAgICAgICAgICByZXR1cm4gMDsgLyogZG9uJ3Qgc29ydCAuaWRhdGEkNiBvciAuaWRhdGEkNyBGSVhNRSBkbGx0b29sIGVsaW1pbmF0ZSAuaWRhdGEkNyAqLwotCi0gICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZCwgCi0gICAgICAgICAoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLCAmYV9zZWMsIChmaWxlX3B0cikgMCwgKGJmZF9zaXplX3R5cGUpc2l6ZW9mKGFfc2VjKSkpCi0gICAgICAgICAgICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuaWRhdGE6ICVFXG4iLAotICAgICAgICAgICAgICAgICAoKnJhKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZCk7Ci0KLSAgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKCgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLCAKLSAgICAgICAgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiwgJmJfc2VjLCAoZmlsZV9wdHIpIDAsIChiZmRfc2l6ZV90eXBlKXNpemVvZihiX3NlYykgKSkKLSAgICAgICAgICAgZWluZm8gKCIlRiVCOiBDYW4ndCByZWFkIGNvbnRlbnRzIG9mIHNlY3Rpb24gLmlkYXRhOiAlRVxuIiwKLSAgICAgICAgICAgICAgICAoKnJiKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZCk7Ci0KLSAgICAgIGkgPSAgKChhX3NlYyA8IGJfc2VjKSA/IC0xIDogMCk7Ci0gICAgICBpZiAoIGkgIT0gMCkKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgICByZXR1cm4gICgoYV9zZWMgPCBiX3NlYykgPyAwIDogMSk7Ci0gICB9Ci1yZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc29ydF9ieV9zZWN0aW9uX25hbWUgKGEsIGIpCi0gICAgIHZvaWQgKmE7Ci0gICAgIHZvaWQgKmI7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYSA9IGE7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYiA9IGI7Ci0gIGludCBpOwotICBpID0gc3RyY21wICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lLAotCQkgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSk7Ci0vKiB0aGlzIGlzIGEgaGFjayB0byBtYWtlIC5zdGFiIGFuZCAuc3RhYnN0ciBsYXN0LCBzbyB3ZSBkb24ndCBoYXZlCi0gICB0byBmaXggc3RyaXAvb2JqY29weSBmb3IgLnJlbG9jIHNlY3Rpb25zLgotICAgRklYTUUgc3RyaXBwaW5nIGltYWdlcyB3aXRoIGEgLnJzcmMgc2VjdGlvbiBzdGlsbCBuZWVkcyB0byBiZSBmaXhlZCAqLwotICBpZiAoIGkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKHN0cm5jbXAgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsICIuc3RhYiIsIDUpID09IDApCi0gICAgICAgICAgICYmIChzdHJuY21wICgoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lLCAiLnN0YWIiLCA1KSAhPSAwKSkKLSAgICAgICAgIHJldHVybiAxOwotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICByZXR1cm4gaTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBzb3J0X3NlY3Rpb25zIHRvIGEgY29udGlndW91cyBzdWJzZXQgb2YgYSBsaXN0IG9mIHNlY3Rpb25zLgotICAgTkVYVF9BRlRFUiBpcyB0aGUgZWxlbWVudCBhZnRlciB0aGUgbGFzdCBvbmUgdG8gc29ydC4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBsYXN0IGVsZW1lbnQncyAibmV4dCIgcG9pbnRlci4gICovCi0KLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqCi1zb3J0X3NlY3Rpb25zXzEgKHN0YXJ0cHRyLCBuZXh0X2FmdGVyLCBjb3VudCwgc29ydF9mdW5jKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqc3RhcnRwdHIsKm5leHRfYWZ0ZXI7Ci0gICAgIGludCBjb3VudDsKLSAgICAgaW50ICgqc29ydF9mdW5jKSAoKTsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnZlYzsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcDsKLSAgaW50IGk7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyZXQ7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHN0YXJ0cHRyOwotCi0gIHZlYyA9ICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKikKLQkgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpKTsKLQotICBmb3IgKHAgPSAqc3RhcnRwdHIsIGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcCA9IHAtPm5leHQpCi0gICAgdmVjW2ldID0gcDsKLQotICBxc29ydCAodmVjLCBjb3VudCwgc2l6ZW9mICh2ZWNbMF0pLCBzb3J0X2Z1bmMpOwotCi0gIC8qIEZpbGwgaW4gdGhlIG5leHQgcG9pbnRlcnMgYWdhaW4uICovCi0gICpzdGFydHB0ciA9IHZlY1swXTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50IC0gMTsgaSsrKQotICAgIHZlY1tpXS0+aGVhZGVyLm5leHQgPSB2ZWNbaSArIDFdOwotICB2ZWNbaV0tPmhlYWRlci5uZXh0ID0gbmV4dF9hZnRlcjsKLSAgcmV0ID0gJnZlY1tpXS0+aGVhZGVyLm5leHQ7Ci0gIGZyZWUgKHZlYyk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFNvcnQgdGhlIC5pZGF0YVwkZm9vIGlucHV0IHNlY3Rpb25zIG9mIGFyY2hpdmVzIGludG8gZmlsZW5hbWUgb3JkZXIuCi0gICBUaGUgcmVhc29uIGlzIHNvIGRsbHRvb2wgY2FuIGFycmFuZ2UgdG8gaGF2ZSB0aGUgcGUgZGxsIGltcG9ydCBpbmZvcm1hdGlvbgotICAgZ2VuZXJhdGVkIGNvcnJlY3RseSAtIHRoZSBoZWFkIG9mIHRoZSBsaXN0IGdvZXMgaW50byBkaC5vLCB0aGUgdGFpbCBpbnRvCi0gICBkdC5vLCBhbmQgdGhlIGd1dHMgaW50byBkc1tubm5uXS5vLiAgTm90ZSB0aGF0IHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoZQotICAgLmlkYXRhIHNlY3Rpb24uCi0gICBGSVhNRTogVGhpcyBtYXkgbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeSB3aXRoIGdyb3VwZWQgc2VjdGlvbnMuICBJbnN0ZWFkIG9mCi0gICBzb3J0aW5nIG9uIGRoLm8sIGRzW25ubm5dLm8sIGR0Lm8sIG9uZSBjb3VsZCwgZm9yIGV4YW1wbGUsIGhhdmUgZGgubyB1c2UKLSAgIC5pZGF0YVwkNGgsIGhhdmUgZHNbbm5ubl0ubyB1c2UgLmlkYXRhXCQ0c1tubm5uXSwgYW5kIGhhdmUgZHQubyB1c2UgLmlkYXRhXCQ0dC4KLSAgIFRoaXMgd291bGQgaGF2ZSB0byBiZSBlbGFib3JhdGVkIHVwb24gdG8gaGFuZGxlIG11bHRpcGxlIGRsbCdzCi0gICBbYXNzdW1pbmcgc3VjaCBhbiBlbG9ib3JhdGlvbiBpcyBwb3NzaWJsZSBvZiBjb3Vyc2VdLgotCi0gICBXZSBhbHNvIHNvcnQgc2VjdGlvbnMgaW4gJ1wkJyB3aWxkIHN0YXRlbWVudHMuICBUaGVzZSBhcmUgY3JlYXRlZCBieSB0aGUKLSAgIHBsYWNlX29ycGhhbnMgcm91dGluZSB0byBpbXBsZW1lbnQgZ3JvdXBlZCBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1zb3J0X3NlY3Rpb25zIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBmb3IgKDsgcyA7IHMgPSBzLT5uZXh0KQotICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0gICAgICB7Ci0gICAgICBjYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0Jc29ydF9zZWN0aW9ucyAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCWJyZWFrOwotICAgICAgY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0JewotCSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnAgPSAmcy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZDsKLQotCSAgLyogSXMgdGhpcyB0aGUgLmlkYXRhIHNlY3Rpb24/ICAqLwotCSAgaWYgKHMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSAhPSBOVUxMCi0JICAgICAgJiYgc3RybmNtcCAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLCAiLmlkYXRhIiwgNikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFNvcnQgdGhlIGNoaWxkcmVuLiAgV2Ugd2FudCB0byBzb3J0IGFueSBvYmplY3RzIGluCi0gICAgICAgICAgICAgICAgIHRoZSBzYW1lIGFyY2hpdmUuICBJbiBvcmRlciB0byBoYW5kbGUgdGhlIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIGEgc2luZ2xlIGFyY2hpdmUgbXVsdGlwbGUgdGltZXMsIHdlIHNvcnQKLSAgICAgICAgICAgICAgICAgYWxsIHRoZSBjaGlsZHJlbiBieSBhcmNoaXZlIG5hbWUgYW5kIHRoZW4gYnkgb2JqZWN0Ci0gICAgICAgICAgICAgICAgIG5hbWUuICBBZnRlciBzb3J0aW5nIHRoZW0sIHdlIHJlLXRocmVhZCB0aGUgcG9pbnRlcgotICAgICAgICAgICAgICAgICBjaGFpbi4gICovCi0KLQkgICAgICB3aGlsZSAoKnApCi0JCXsKLQkJICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzdGFydCA9ICpwOwotCQkgIGlmIChzdGFydC0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KLQkJICAgICAgfHwgIXN0YXJ0LT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLT5teV9hcmNoaXZlKQotCQkgICAgcCA9ICYoc3RhcnQtPmhlYWRlci5uZXh0KTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmVuZDsKLQkJICAgICAgaW50IGNvdW50OwotCi0JCSAgICAgIGZvciAoZW5kID0gc3RhcnQsIGNvdW50ID0gMDsKLQkJCSAgIGVuZCAmJiBlbmQtPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOwotCQkJICAgZW5kID0gZW5kLT5uZXh0KQotCQkJY291bnQrKzsKLQotCQkgICAgICBwID0gc29ydF9zZWN0aW9uc18xIChwLCBlbmQsIGNvdW50LCBzb3J0X2J5X2ZpbGVfbmFtZSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBJZiB0aGlzIGlzIGEgY29sbGVjdGlvbiBvZiBncm91cGVkIHNlY3Rpb25zLCBzb3J0IHRoZW0uCi0JICAgICBUaGUgbGlua2VyIHNjcmlwdCBtdXN0IGV4cGxpY2l0bHkgbWVudGlvbiAiKiguZm9vXCQpIiBvcgotCSAgICAgIiooLmZvb1wkKikiLiAgRG9uJ3Qgc29ydCB0aGVtIGlmIFwkIGlzIG5vdCB0aGUgbGFzdAotCSAgICAgY2hhcmFjdGVyIChub3Qgc3VyZSBpZiB0aGlzIGlzIHJlYWxseSB1c2VmdWwsIGJ1dCBpdAotCSAgICAgYWxsb3dzIGV4cGxpY2l0bHkgbWVudGlvbmluZyBzb21lIFwkIHNlY3Rpb25zIGFuZCBsZXR0aW5nCi0JICAgICB0aGUgbGlua2VyIGhhbmRsZSB0aGUgcmVzdCkuICAqLwotCSAgaWYgKHMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqcSA9IHN0cmNociAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLCAnXCQnKTsKLQotCSAgICAgIGlmIChxICE9IE5VTEwKLQkJICAmJiAocVsxXSA9PSAnXDAnCi0JCSAgICAgIHx8IChxWzFdID09ICcqJyAmJiBxWzJdID09ICdcMCcpKSkKLQkJewotCQkgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmVuZDsKLQkJICBpbnQgY291bnQ7Ci0KLQkJICBmb3IgKGVuZCA9ICpwLCBjb3VudCA9IDA7IGVuZDsgZW5kID0gZW5kLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoZW5kLT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkKLQkJCWFib3J0ICgpOwotCQkgICAgICBjb3VudCsrOwotCQkgICAgfQotCQkgICh2b2lkKSBzb3J0X3NlY3Rpb25zXzEgKHAsIGVuZCwgY291bnQsIHNvcnRfYnlfc2VjdGlvbl9uYW1lKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLX0KLQotc3RhdGljIHZvaWQgIAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKCkKLXsKLSAgZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc3RhdF9wdHI7Ci0KLSNpZmRlZiBUQVJHRVRfSVNfcHBjcGUKLSAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCB0b2MgaW5mb3JtYXRpb24gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoIXBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKGlzLT50aGVfYmZkLCAmbGlua19pbmZvKSkKLQkgIHsKLQkgICAgZWluZm8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXNcbiIsIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoJmxpbmtfaW5mbyk7Ci0jZWxzZQotI2lmZGVmIFRBUkdFVF9JU19hcm1wZQotICAvKiBGSVhNRTogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YgotICAgICBzZWN0aW9uLgotCi0gICAgIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgZ2x1ZQotICAgICBpbmZvcm1hdGlvbi4gIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZQotICAgICBvcHRpb24/ICBrcmtAY3lnbnVzLmNvbSAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbykpCi0JICB7Ci0JICAgIGVpbmZvICgiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIsIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGFybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLSNlbmRpZiAvKiBUQVJHRVRfSVNfYXJtcGUgKi8KLSNlbmRpZiAvKiBUQVJHRVRfSVNfcHBjcGUgKi8KLQotICBzb3J0X3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCk7Ci19Ci0MCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCBzZWN0aW9ucyB3aXRoIGEgJ1wkJyBpbiB0aGVtCi0gICBpbnRvIHRoZSByaWdodCBwbGFjZS4gIEFueSBzZWN0aW9uIHdpdGggYSAnXCQnIGluIHRoZW0gKGUuZy4gLnRleHRcJGZvbykKLSAgIGdldHMgbWFwcGVkIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiB3aXRoIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgJ1wkJyBvbiBzdHJpcHBlZAotICAgKGUuZy4gLnRleHQpLgotICAgU2VlIHRoZSBNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZSBhbmQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdAotICAgU3BlY2lmaWNhdGlvbiA0LjEsIHNlY3Rpb24gNC4yLCBHcm91cGVkIFNlY3Rpb25zLgotCi0gICBGSVhNRTogVGhpcyBpcyBub3cgaGFuZGxlZCBieSB0aGUgbGlua2VyIHNjcmlwdCB1c2luZyB3aWxkY2FyZHMsCi0gICBidXQgSSdtIGxlYXZpbmcgdGhpcyBoZXJlIGluIGNhc2Ugd2Ugd2FudCB0byBlbmFibGUgaXQgZm9yIHNlY3Rpb25zCi0gICB3aGljaCBhcmUgbm90IG1lbnRpb25lZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gIGNoYXIgKm91dHB1dF9zZWNuYW1lLCAqcHM7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpsOwotCi0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERvbid0IHByb2Nlc3MgZ3JvdXBlZCBzZWN0aW9ucyB1bmxlc3MgZG9pbmcgYSBmaW5hbCBsaW5rLgotICAgICBJZiB0aGV5J3JlIG1hcmtlZCBhcyBDT01EQVQgc2VjdGlvbnMsIHdlIGRvbid0IHdhbnQgLnRleHRcJGZvbyB0bwotICAgICBlbmQgdXAgaW4gLnRleHQgYW5kIHRoZW4gaGF2ZSAudGV4dCBkaXNhcHBlYXIgYmVjYXVzZSBpdCdzIG1hcmtlZAotICAgICBsaW5rLW9uY2UtZGlzY2FyZC4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBFdmVyeXRoaW5nIGZyb20gdGhlICdcJCcgb24gZ2V0cyBkZWxldGVkIHNvIGRvbid0IGFsbG93ICdcJCcgYXMgdGhlCi0gICAgIGZpcnN0IGNoYXJhY3Rlci4gICovCi0gIGlmICgqc2VjbmFtZSA9PSAnXCQnKQotICAgIGVpbmZvICgiJVAlRjogc2VjdGlvbiAlcyBoYXMgJ1wkJyBhcyBmaXJzdCBjaGFyYWN0ZXJcbiIsIHNlY25hbWUpOwotICBpZiAoc3RyY2hyIChzZWNuYW1lICsgMSwgJ1wkJykgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTG9vayB1cCB0aGUgb3V0cHV0IHNlY3Rpb24uICBUaGUgTWljcm9zb2Z0IHNwZWNzIHNheSBzZWN0aW9ucyBuYW1lcyBpbgotICAgICBpbWFnZSBmaWxlcyBuZXZlciBjb250YWluIGEgJ1wkJy4gIEZvcnR1bmF0ZWx5LCBsYW5nXy4uLl9sb29rdXAgY3JlYXRlcwotICAgICB0aGUgc2VjdGlvbiBpZiBpdCBkb2Vzbid0IGV4aXN0LiAgKi8KLSAgb3V0cHV0X3NlY25hbWUgPSBidXlzdHJpbmcgKHNlY25hbWUpOwotICBwcyA9IHN0cmNociAob3V0cHV0X3NlY25hbWUgKyAxLCAnXCQnKTsKLSAgKnBzID0gMDsKLSAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHB1dF9zZWNuYW1lKTsKLQotICAvKiBGaW5kIHRoZSAnXCQnIHdpbGQgc3RhdGVtZW50IGZvciB0aGlzIHNlY3Rpb24uICBXZSBjdXJyZW50bHkgcmVxdWlyZSB0aGUKLSAgICAgbGlua2VyIHNjcmlwdCB0byBleHBsaWNpdGx5IG1lbnRpb24gIiooLmZvb1wkKSIuCi0gICAgIEZJWE1FOiBwcGNwZS5zYyBoYXMgLkNSVFwkZm9vIGluIHRoZSAucmRhdGEgc2VjdGlvbi4gIEFjY29yZGluZyB0byB0aGUKLSAgICAgTWljcm9zb2Z0IGRvY3MgdGhpcyBpc24ndCBjb3JyZWN0IHNvIGl0J3Mgbm90IChjdXJyZW50bHkpIGhhbmRsZWQuICAqLwotCi0gIHBzWzBdID0gJ1wkJzsKLSAgcHNbMV0gPSAwOwotICBmb3IgKGwgPSBvcy0+Y2hpbGRyZW4uaGVhZDsgbDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPmhlYWRlci50eXBlID09IGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bQotCSAgJiYgc3RyY21wIChsLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsIG91dHB1dF9zZWNuYW1lKSA9PSAwKQotCWJyZWFrOwotICAgIH0KLSAgcHNbMF0gPSAwOwotICBpZiAobCA9PSBOVUxMKQotI2lmIDEKLSAgICBlaW5mbyAoIiVQJUY6ICooJXNcJCkgbWlzc2luZyBmcm9tIGxpbmtlciBzY3JpcHRcbiIsIG91dHB1dF9zZWNuYW1lKTsKLSNlbHNlIC8qIEZJWE1FOiBUaGlzIGJsb2NrIGlzIHVudHJpZWQuICBJdCBleGlzdHMgdG8gY29udmV5IHRoZSBpbnRlbnQsCi0JIHNob3VsZCBvbmUgZGVjaWRlIHRvIG5vdCByZXF1aXJlICooLmZvb1wkKSB0byBhcHBlYXIgaW4gdGhlIGxpbmtlcgotCSBzY3JpcHQuICAqLwotICAgIHsKLSAgICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfd2lsZF9zdGF0ZW1lbnQsCi0JCQkJCQkmb3MtPmNoaWxkcmVuKTsKLSAgICAgIG5ldy0+c2VjdGlvbl9uYW1lID0geG1hbGxvYyAoc3RybGVuIChvdXRwdXRfc2VjbmFtZSkgKyAyKTsKLSAgICAgIHNwcmludGYgKG5ldy0+c2VjdGlvbl9uYW1lLCAiJXNcJCIsIG91dHB1dF9zZWNuYW1lKTsKLSAgICAgIG5ldy0+ZmlsZW5hbWUgPSBOVUxMOwotICAgICAgbGFuZ19saXN0X2luaXQgKCZuZXctPmNoaWxkcmVuKTsKLSAgICAgIGwgPSBuZXc7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogTGluayB0aGUgaW5wdXQgc2VjdGlvbiBpbiBhbmQgd2UncmUgZG9uZSBmb3Igbm93LgotICAgICBUaGUgc2VjdGlvbnMgc3RpbGwgaGF2ZSB0byBiZSBzb3J0ZWQsIGJ1dCB0aGF0IGhhcyB0byB3YWl0IHVudGlsCi0gICAgIGFsbCBzdWNoIHNlY3Rpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQgYnkgdXMuICBUaGUgc29ydGluZyBpcyBkb25lIGJ5Ci0gICAgIHNvcnRfc2VjdGlvbnMuICAqLwotICB3aWxkX2RvaXQgKCZsLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotc3RhdGljIGNoYXIgKgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBOVUxMLCAvKiBmaW5pc2ggKi8KLSAgTlVMTCwgLyogY3JlYXRlIG91dHB1dCBzZWN0aW9uIHN0YXRlbWVudHMgKi8KLSAgTlVMTCwgLyogb3BlbiBkeW5hbWljIGFyY2hpdmUgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuLAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzLAotICBOVUxMLAkvKiB1bnJlY29nbml6ZWQgZmlsZSAqLwotICBOVUxMLAkvKiBsaXN0IG9wdGlvbnMgKi8KLSAgTlVMTCwJLyogcmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwgCS8qIGZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2VsZjMyLmVtIGIvbGQvZW11bHRlbXBsL2VsZjMyLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTEzZWNmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9lbGYzMi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDExODcgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotIyBUaGlzIGZpbGUgaXMgbm93IG1pc25hbWVkLCBiZWNhdXNlIGl0IHN1cHBvcnRzIGJvdGggMzIgYml0IGFuZCA2NCBiaXQKLSMgRUxGIGVtdWxhdGlvbnMuCi10ZXN0IC16ICIke0VMRlNJWkV9IiAmJiBFTEZTSVpFPTMyCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qICR7RUxGU0laRX0gYml0IEVMRiBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIEVMRiBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWFyY2hfZGlyc190eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9gZWNobyAke0FSQ0h9IHwgc2VkIC1lICdzLzouKi8vJ2A7Ci0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSAke0RZTkFNSUNfTElOSy10cnVlfTsKLSAgY29uZmlnLmhhc19zaGFyZWQgPSBgaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCIgOyB0aGVuIGVjaG8gdHJ1ZSA7IGVsc2UgZWNobyBmYWxzZSA7IGZpYDsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGFyY2hpdmUuICBUaGlzIGlzIHdoZXJlIHdlIGtub3cgdGhhdCBFTEYKLSAgIGR5bmFtaWMgbGlicmFyaWVzIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5zbyAob3IgLnNsIG9uIG9kZGJhbGwgc3lzdGVtcwotICAgbGlrZSBocHV4KS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0KLSAgLyogVGhpcyBhbGxvY2F0ZXMgYSBmZXcgYnl0ZXMgdG9vIG1hbnkgd2hlbiBFWFRSQV9TSExJQl9FWFRFTlNJT04KLSAgICAgaXMgZGVmaW5lZCwgYnV0IGl0IGRvZXMgbm90IHNlZW0gd29ydGggdGhlIGhlYWRhY2hlIHRvIG9wdGltaXplCi0gICAgIGF3YXkgdGhvc2UgdHdvIGJ5dGVzIG9mIHNwYWNlLiAgKi8KLSAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCi0JCQkgICAgICsgc3RybGVuIChmaWxlbmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGFyY2gpCi0jaWZkZWYgRVhUUkFfU0hMSUJfRVhURU5TSU9OCi0JCQkgICAgICsgc3RybGVuIChFWFRSQV9TSExJQl9FWFRFTlNJT04pCi0jZW5kaWYKLQkJCSAgICAgKyBzaXplb2YgIi9saWIuc28iKTsKLQotICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNvIiwgc2VhcmNoLT5uYW1lLCBmaWxlbmFtZSwgYXJjaCk7Ci0KLSNpZmRlZiBFWFRSQV9TSExJQl9FWFRFTlNJT04KLSAgLyogVHJ5IHRoZSAuc28gZXh0ZW5zaW9uIGZpcnN0LiAgSWYgdGhhdCBmYWlscyBidWlsZCBhIG5ldyBmaWxlbmFtZQotICAgICB1c2luZyBFWFRSQV9TSExJQl9FWFRFTlNJT04uICAqLwotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzJXMiLCBzZWFyY2gtPm5hbWUsCi0JICAgICBmaWxlbmFtZSwgYXJjaCwgRVhUUkFfU0hMSUJfRVhURU5TSU9OKTsKLSNlbmRpZgotCi0gIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQotICAvKiBXZSBoYXZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBpbiB0aGUgbGluay4gIFRoZSBFTEYKLSAgICAgYmFja2VuZCBsaW5rZXIgd2lsbCBjcmVhdGUgYSBEVF9ORUVERUQgZW50cnkgaW4gdGhlIC5keW5hbWljCi0gICAgIHNlY3Rpb24gbmFtaW5nIHRoaXMgZmlsZS4gIElmIHRoaXMgZmlsZSBpbmNsdWRlcyBhIERUX1NPTkFNRQotICAgICBlbnRyeSwgaXQgd2lsbCBiZSB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUgRUxGIGxpbmtlciB3aWxsIGp1c3QgdXNlCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgRm9yIGFuIGFyY2hpdmUgZm91bmQgYnkgc2VhcmNoaW5nLCBsaWtlCi0gICAgIHRoaXMgb25lLCB0aGUgRFRfTkVFREVEIGVudHJ5IHNob3VsZCBjb25zaXN0IG9mIGp1c3QgdGhlIG5hbWUgb2YKLSAgICAgdGhlIGZpbGUsIHdpdGhvdXQgdGhlIHBhdGggaW5mb3JtYXRpb24gdXNlZCB0byBmaW5kIGl0LiAgTm90ZQotICAgICB0aGF0IHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGlmIHdlIGhhdmUgYSBkeW5hbWljIG9iamVjdDsgYW4KLSAgICAgYXJjaGl2ZSB3aWxsIG5ldmVyIGJlIHJlZmVyZW5jZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuCi0KLSAgICAgRklYTUU6IFRoaXMgYXBwcm9hY2gtLXVzaW5nIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lLS1pcyBub3QKLSAgICAgdmVyeSBwcmV0dHkuICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mIGFueXRoaW5nIHRoYXQgaXMKLSAgICAgcHJldHR5LCB0aG91Z2guICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9vYmplY3QpCi0gICAgICAmJiAoZW50cnktPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpuZWVkZWRfbmFtZTsKLQotICAgICAgQVNTRVJUIChlbnRyeS0+aXNfYXJjaGl2ZSAmJiBlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZyk7Ci0KLSAgICAgIC8qIFJhdGhlciB0aGFuIGR1cGxpY2F0aW5nIHRoZSBsb2dpYyBhYm92ZS4gIEp1c3QgdXNlIHRoZQotCSBmaWxlbmFtZSB3ZSByZWNvcmRlZCBlYXJsaWVyLgotCi0JIEZpcnN0IHN0cmlwIG9mZiBldmVyeXRoaW5nIGJlZm9yZSB0aGUgbGFzdCAnLycuICAqLwotICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChlbnRyeS0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBmaWxlbmFtZSsrOwotCi0gICAgICBuZWVkZWRfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpICsgMSk7Ci0gICAgICBzdHJjcHkgKG5lZWRlZF9uYW1lLCBmaWxlbmFtZSk7Ci0gICAgICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoZW50cnktPnRoZV9iZmQsIG5lZWRlZF9uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotLyogRm9yIGEgbmF0aXZlIGxpbmtlciwgY2hlY2sgdGhlIGZpbGUgL2V0Yy9sZC5zby5jb25mIGZvciBkaXJlY3RvcmllcwotICAgaW4gd2hpY2ggd2UgbWF5IGZpbmQgc2hhcmVkIGxpYnJhcmllcy4gIC9ldGMvbGQuc28uY29uZiBpcyByZWFsbHkKLSAgIG9ubHkgbWVhbmluZ2Z1bCBvbiBMaW51eCwgYnV0IHdlIGNoZWNrIGl0IG9uIG90aGVyIHN5c3RlbXMgYW55aG93LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZgotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZiAobmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0gIHN0YXRpYyBjaGFyICpsZF9zb19jb25mOwotCi0gIGlmICghIGluaXRpYWxpemVkKQotICAgIHsKLSAgICAgIEZJTEUgKmY7Ci0KLSAgICAgIGYgPSBmb3BlbiAoIi9ldGMvbGQuc28uY29uZiIsIEZPUEVOX1JUKTsKLSAgICAgIGlmIChmICE9IE5VTEwpCi0JewotCSAgY2hhciAqYjsKLQkgIHNpemVfdCBsZW4sIGFsbG9jOwotCSAgaW50IGM7Ci0KLQkgIGxlbiA9IDA7Ci0JICBhbGxvYyA9IDEwMDsKLQkgIGIgPSAoY2hhciAqKSB4bWFsbG9jIChhbGxvYyk7Ci0KLQkgIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCi0JICAgIHsKLQkgICAgICBpZiAobGVuICsgMSA+PSBhbGxvYykKLQkJewotCQkgIGFsbG9jICo9IDI7Ci0JCSAgYiA9IChjaGFyICopIHhyZWFsbG9jIChiLCBhbGxvYyk7Ci0JCX0KLQkgICAgICBpZiAoYyAhPSAnOicKLQkJICAmJiBjICE9ICcgJwotCQkgICYmIGMgIT0gJ1x0JwotCQkgICYmIGMgIT0gJ1xuJwotCQkgICYmIGMgIT0gJywnKQotCQl7Ci0JCSAgYltsZW5dID0gYzsKLQkJICArK2xlbjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChsZW4gPiAwICYmIGJbbGVuIC0gMV0gIT0gJzonKQotCQkgICAgewotCQkgICAgICBiW2xlbl0gPSAnOic7Ci0JCSAgICAgICsrbGVuOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGxlbiA+IDAgJiYgYltsZW4gLSAxXSA9PSAnOicpCi0JICAgIC0tbGVuOwotCi0JICBpZiAobGVuID4gMCkKLQkgICAgYltsZW5dID0gJ1wwJzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZyZWUgKGIpOwotCSAgICAgIGIgPSBOVUxMOwotCSAgICB9Ci0KLQkgIGZjbG9zZSAoZik7Ci0KLQkgIGxkX3NvX2NvbmYgPSBiOwotCX0KLQotICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICBpZiAobGRfc29fY29uZiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGRfc29fY29uZiwgbmFtZSwgZm9yY2UpOwotfQotCi1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLS8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVxdWlyZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aAotICAgYmV0d2VlbiBhZnRlcl9vcGVuIGFuZCBjaGVja19uZWVkZWQgYW5kIHN0YXRfbmVlZGVkIGFuZCB2ZXJjaGVjay4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF9uZWVkZWQ7Ci1zdGF0aWMgc3RydWN0IHN0YXQgZ2xvYmFsX3N0YXQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfZm91bmQ7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpnbG9iYWxfdmVyY2hlY2tfbmVlZGVkOwotc3RhdGljIGJvb2xlYW4gZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZDsKLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICpsOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIHdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFwcGVhciBpbiBEVF9ORUVERUQgZW50cmllcyBpbgotICAgICBkeW5hbWljIG9iamVjdHMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgKG9mdGVuIHRoZXJlIHdpbGwgYmUgbm9uZSkuCi0gICAgIEZvciBlYWNoIHN1Y2ggZmlsZSwgd2Ugd2FudCB0byB0cmFjayBkb3duIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgIGxpYnJhcnksIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUgaW4gdGhlIGxpbmsuICBUaGlzIGlzIHdoYXQKLSAgICAgdGhlIHJ1bnRpbWUgZHluYW1pYyBsaW5rZXIgd2lsbCBkby4gIFRyYWNraW5nIHRoZSBmaWxlcyBkb3duIGhlcmUKLSAgICAgcGVybWl0cyBvbmUgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBhbm90aGVyIHdpdGhvdXQgcmVxdWlyaW5nCi0gICAgIHNwZWNpYWwgYWN0aW9uIGJ5IHRoZSBwZXJzb24gZG9pbmcgdGhlIGxpbmsuICBOb3RlIHRoYXQgdGhlCi0gICAgIG5lZWRlZCBsaXN0IGNhbiBhY3R1YWxseSBncm93IHdoaWxlIHdlIGFyZSBzdGVwcGluZyB0aHJvdWdoIHRoaXMKLSAgICAgbG9vcC4gICovCi0gIG5lZWRlZCA9IGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0IChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbGw7Ci0gICAgICBpbnQgZm9yY2U7Ci0KLSAgICAgIC8qIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGZpbGUsIHNraXAgaXQuICAqLwotICAgICAgZm9yIChsbCA9IG5lZWRlZDsgbGwgIT0gbDsgbGwgPSBsbC0+bmV4dCkKLQlpZiAoc3RyY21wIChsbC0+bmFtZSwgbC0+bmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGxsICE9IGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkIGluIHRoZSBsaW5rIGV4cGxpY2l0bHkuICAqLwotICAgICAgZ2xvYmFsX25lZWRlZCA9IGw7Ci0gICAgICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTsKLSAgICAgIGlmIChnbG9iYWxfZm91bmQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZmluZCB0aGlzIGZpbGUgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZS4gIFdlCi0JIHdhbnQgdG8gc2VhcmNoIGZvciB0aGUgZmlsZSBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgZHluYW1pYwotCSBsaW5rZXIgd2lsbCBzZWFyY2guICBUaGF0IG1lYW5zIHRoYXQgd2Ugd2FudCB0byB1c2UKLQkgcnBhdGhfbGluaywgcnBhdGgsIHRoZW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0JIExEX0xJQlJBUllfUEFUSCAobmF0aXZlIG9ubHkpLCB0aGVuIHRoZSBsaW5rZXIgc2NyaXB0Ci0JIExJQl9TRUFSQ0hfRElSUy4gIFdlIGRvIG5vdCBzZWFyY2ggdXNpbmcgdGhlIC1MIGFyZ3VtZW50cy4KLQotCSBXZSBzZWFyY2ggdHdpY2UuICBUaGUgZmlyc3QgdGltZSwgd2Ugc2tpcCBvYmplY3RzIHdoaWNoIG1heQotCSBpbnRyb2R1Y2UgdmVyc2lvbiBtaXNtYXRjaGVzLiAgVGhlIHNlY29uZCB0aW1lLCB3ZSBmb3JjZQotCSB0aGVpciB1c2UuICBTZWUgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sgY29tbWVudC4gICovCi0gICAgICBmb3IgKGZvcmNlID0gMDsgZm9yY2UgPCAyOyBmb3JjZSsrKQotCXsKLQkgIGNvbnN0IGNoYXIgKmxpYl9wYXRoOwotCSAgc2l6ZV90IGxlbjsKLQkgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rLAotCQkJCQkJICBsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aCwKLQkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMCi0JICAgICAgJiYgY29tbWFuZF9saW5lLnJwYXRoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsLT5uYW1lLAotCQkJCQkJICAgICAgZm9yY2UpKQotCQlicmVhazsKLQkgICAgfQotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9MSUJSQVJZX1BBVEgiKTsKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGxlbiA9IHN0cmxlbiAobC0+bmFtZSk7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICB7Ci0JICAgICAgY2hhciAqZmlsZW5hbWU7Ci0KLQkgICAgICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCQljb250aW51ZTsKLQkgICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKSArIGxlbiArIDIpOwotCSAgICAgIHNwcmludGYgKGZpbGVuYW1lLCAiJXMvJXMiLCBzZWFyY2gtPm5hbWUsIGwtPm5hbWUpOwotCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChmaWxlbmFtZSwgZm9yY2UpKQotCQlicmVhazsKLQkgICAgICBmcmVlIChmaWxlbmFtZSk7Ci0JICAgIH0KLQkgIGlmIChzZWFyY2ggIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBjYXNlICIgJHtFTVVMQVRJT05fTElCUEFUSH0gIiBpbgotICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZiAobC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQl9Ci0KLSAgICAgIGlmIChmb3JjZSA8IDIpCi0JY29udGludWU7Ci0KLSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZCAodHJ5IHVzaW5nIC0tcnBhdGgpXG4iLAotCSAgICAgbC0+bmFtZSwgbC0+YnkpOwotICAgIH0KLX0KLQotLyogU2VhcmNoIGZvciBhIG5lZWRlZCBmaWxlIGluIGEgcGF0aC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChwYXRoLCBuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBjb25zdCBjaGFyICpzOwotICBzaXplX3QgbGVuOwotCi0gIGlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gJ1wwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGVuYW1lLCAqc3NldDsKLQotICAgICAgcyA9IHN0cmNociAocGF0aCwgJzonKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcyA9IHBhdGggKyBzdHJsZW4gKHBhdGgpOwotCi0gICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHMgLSBwYXRoICsgbGVuICsgMik7Ci0gICAgICBpZiAocyA9PSBwYXRoKQotCXNzZXQgPSBmaWxlbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKGZpbGVuYW1lLCBwYXRoLCBzIC0gcGF0aCk7Ci0JICBmaWxlbmFtZVtzIC0gcGF0aF0gPSAnLyc7Ci0JICBzc2V0ID0gZmlsZW5hbWUgKyAocyAtIHBhdGgpICsgMTsKLQl9Ci0gICAgICBzdHJjcHkgKHNzZXQsIG5hbWUpOwotCi0gICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCi0gICAgICBpZiAoKnMgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgIHBhdGggPSBzICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwkgIAotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBwb3NzaWJsZSBuYW1lIGZvciBhIGR5bmFtaWMgb2JqZWN0Ci0gICBuYW1lZCBieSBhIERUX05FRURFRCBlbnRyeS4gIFRoZSBGT1JDRSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIKLSAgIHRvIHNraXAgdGhlIGNoZWNrIGZvciBhIGNvbmZsaWN0aW5nIHZlcnNpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAobmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgYmZkICphYmZkOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBvYmplY3Qgd291bGQgaW5jbHVkZSBhbnkgY29uZmxpY3RpbmcgbGlicmFyeQotICAgICB2ZXJzaW9ucy4gIElmIEZPUkNFIGlzIHNldCwgdGhlbiB3ZSBza2lwIHRoaXMgY2hlY2s7IHdlIHVzZSB0aGlzCi0gICAgIHRoZSBzZWNvbmQgdGltZSBhcm91bmQsIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55IGNvbXBhdGlibGUKLSAgICAgaW5zdGFuY2Ugb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotICBpZiAoISBmb3JjZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZDsKLQotICAgICAgaWYgKCEgYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IChhYmZkLCAmbmVlZGVkKSkKLQllaW5mbyAoIiVGJVA6JUI6IGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCBmYWlsZWQ6ICVFXG4iLCBhYmZkKTsKLQotICAgICAgaWYgKG5lZWRlZCAhPSBOVUxMKQotCXsKLQkgIGdsb2JhbF92ZXJjaGVja19uZWVkZWQgPSBuZWVkZWQ7Ci0JICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gZmFsc2U7Ci0JICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrKTsKLQkgIGlmIChnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JICAgICAgLyogUmV0dXJuIGZhbHNlIHRvIGZvcmNlIHRoZSBjYWxsZXIgdG8gbW92ZSBvbiB0byB0cnkKLSAgICAgICAgICAgICAgICAgYW5vdGhlciBmaWxlIG9uIHRoZSBzZWFyY2ggcGF0aC4gICovCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEJ1dCB3YWl0ISAgSXQgZ2V0cyBtdWNoIHdvcnNlLiAgT24gTGludXgsIGlmIGEgc2hhcmVkCi0gICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCB1c2UgbGliYyBhdCBhbGwsIHdlIGFyZSBzdXBwb3NlZCB0byBza2lwCi0gICAgICAgICAgICAgaXQgdGhlIGZpcnN0IHRpbWUgYXJvdW5kIGluIGNhc2Ugd2UgZW5jb3VudGVyIGEgc2hhcmVkCi0gICAgICAgICAgICAgbGlicmFyeSBsYXRlciBvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggZG9lcyB1c2UgdGhlCi0gICAgICAgICAgICAgdmVyc2lvbiBvZiBsaWJjIHRoYXQgd2Ugd2FudC4gIFRoaXMgaXMgbXVjaCB0b28gaG9ycmlibGUKLSAgICAgICAgICAgICB0byB1c2Ugb24gYW55IHN5c3RlbSBvdGhlciB0aGFuIExpbnV4LiAgKi8KLQotRU9GCi1jYXNlICR7dGFyZ2V0fSBpbgotICAqLSotbGludXgtZ251KikKLSAgICBjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7Ci0KLQkgICAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICAgIGlmIChzdHJuY21wIChsLT5uYW1lLCAibGliYy5zbyIsIDcpID09IDApCi0JCWJyZWFrOwotCSAgICBpZiAobCA9PSBOVUxMKQotCSAgICAgIHsKLQkJKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0KLUVPRgotICAgIDs7Ci1lc2FjCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCX0KLSAgICB9Ci0KLSAgLyogV2UndmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCBtYXRjaGluZyB0aGUgRFRfTkVFREVEIGVudHJ5LiAgKi8KLQotICAvKiBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlIGlzIG5vIG90aGVyIGlucHV0IGZpbGUgb2YgdGhlCi0gICAgIHNhbWUgbmFtZS4gIFdlIG11c3Qgbm93IGNoZWNrIGFnYWluIHRoYXQgd2UgYXJlIG5vdCBpbmNsdWRpbmcgdGhlCi0gICAgIHNhbWUgZmlsZSB0d2ljZS4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9uIG1hbnkgc3lzdGVtcwotICAgICBsaWJjLnNvIGlzIGEgc3ltbGluayB0bywgZS5nLiwgbGliYy5zby4xLiAgVGhlIFNPTkFNRSBlbnRyeSB3aWxsCi0gICAgIHJlZmVyZW5jZSBsaWJjLnNvLjEuICBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgbGliYy5zbywgd2UKLSAgICAgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIGxpYmMuc28uMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBmaWxlLCBhbmQgd2UKLSAgICAgY2FuIG9ubHkgY2hlY2sgdGhhdCB1c2luZyBzdGF0LiAgKi8KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZnbG9iYWxfc3RhdCkgIT0gMCkKLSAgICBlaW5mbyAoIiVGJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIsIGFiZmQpOwotICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk7Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgewotICAgICAgLyogUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBmb3VuZCB0aGUgZmlsZSwgZXZlbiB0aG91Z2gKLSAgICAgICAgIHdlIGFyZW4ndCBnb2luZyB0byBkbyBhbnl0aGluZyB3aXRoIGl0LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUZWxsIHRoZSBFTEYgYmFja2VuZCB0aGF0IGRvbid0IHdhbnQgdGhlIG91dHB1dCBmaWxlIHRvIGhhdmUgYQotICAgICBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZmlsZS4gICovCi0gIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCAiIik7Ci0KLSAgLyogQWRkIHRoaXMgZmlsZSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiwgYWJmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKHMtPmZpbGVuYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzLT50aGVfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc29uYW1lOwotCi0gICAgICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKHNvbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0JICAKLSAgaWYgKHMtPnNlYXJjaF9kaXJzX2ZsYWcKLSAgICAgICYmIHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmY7Ci0KLSAgICAgIGYgPSBzdHJyY2hyIChzLT5maWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChmICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoZiArIDEsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IHJ1bm5pbmcgc3RhdCBvbgotICAgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjb25zdCBjaGFyICpzdWZmaXg7Ci0gIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgY29uc3QgY2hhciAqZjsKLQotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9zdGF0IChzLT50aGVfYmZkLCAmc3QpICE9IDApCi0gICAgewotICAgICAgZWluZm8gKCIlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiwgcy0+dGhlX2JmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzdC5zdF9kZXYgPT0gZ2xvYmFsX3N0YXQuc3RfZGV2Ci0gICAgICAmJiBzdC5zdF9pbm8gPT0gZ2xvYmFsX3N0YXQuc3RfaW5vKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIGlzc3VlIGEgd2FybmluZyBpZiBpdCBsb29rcyBsaWtlIHdlIGFyZSBpbmNsdWRpbmcgdHdvCi0gICAgIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeS4gIEZvciBleGFtcGxlLAotICAgICB0aGVyZSBtYXkgYmUgYSBwcm9ibGVtIGlmIC1sYyBwaWNrcyB1cCBsaWJjLnNvLjYgYnV0IHNvbWUgb3RoZXIKLSAgICAgc2hhcmVkIGxpYnJhcnkgaGFzIGEgRFRfTkVFREVEIGVudHJ5IG9mIGxpYmMuc28uNS4gIFRoaXMgaXMgYQotICAgICBodWVyaXN0aWMgdGVzdCwgYW5kIGl0IHdpbGwgb25seSB3b3JrIGlmIHRoZSBuYW1lIGxvb2tzIGxpa2UKLSAgICAgTkFNRS5zby5WRVJTSU9OLiAgRklYTUU6IERlcGVuZGluZyBvbiBmaWxlIG5hbWVzIGlzIGVycm9yLXByb25lLgotICAgICBJZiB3ZSByZWFsbHkgd2FudCB0byBpc3N1ZSB3YXJuaW5ncyBhYm91dCBtaXhpbmcgdmVyc2lvbiBudW1iZXJzCi0gICAgIG9mIHNoYXJlZCBsaWJyYXJpZXMsIHdlIG5lZWQgdG8gZmluZCBhIGJldHRlciB3YXkuICAqLwotCi0gIGlmIChzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgIT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCA9IHN0cnN0ciAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgIi5zby4iKTsKLSAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBzLT5maWxlbmFtZTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgaWYgKHN0cm5jbXAgKGYsIGdsb2JhbF9uZWVkZWQtPm5hbWUsIHN1ZmZpeCAtIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbWF5IGNvbmZsaWN0IHdpdGggJXNcbiIsCi0JICAgZ2xvYmFsX25lZWRlZC0+bmFtZSwgZ2xvYmFsX25lZWRlZC0+YnksIGYpOwotfQotCi0vKiBPbiBMaW51eCwgaXQncyBwb3NzaWJsZSB0byBoYXZlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotICAgc2hhcmVkIGxpYnJhcnkgbGlua2VkIGFnYWluc3QgZGlmZmVyZW50IHZlcnNpb25zIG9mIGxpYmMuICBUaGUKLSAgIGR5bmFtaWMgbGlua2VyIHNvbWVob3cgdGFncyB3aGljaCBsaWJjIHZlcnNpb24gdG8gdXNlIGluCi0gICAvZXRjL2xkLnNvLmNhY2hlLCBhbmQsIGJhc2VkIG9uIHRoZSBsaWJjIHRoYXQgaXQgc2VlcyBpbiB0aGUKLSAgIGV4ZWN1dGFibGUsIGNob29zZXMgd2hpY2ggdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgdG8gdXNlLgotCi0gICBXZSB0cnkgdG8gZG8gYSBzaW1pbGFyIGNoZWNrIGhlcmUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGlzIHNoYXJlZAotICAgbGlicmFyeSBuZWVkcyBhbnkgb3RoZXIgc2hhcmVkIGxpYnJhcmllcyB3aGljaCBtYXkgY29uZmxpY3Qgd2l0aAotICAgbGlicmFyaWVzIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIElmIGl0IGRvZXMsIHdlCi0gICBza2lwIGl0LCBhbmQgdHJ5IHRvIGZpbmQgYW5vdGhlciBzaGFyZWQgbGlicmFyeSBmYXJ0aGVyIG9uIGRvd24gdGhlCi0gICBsaW5rIHBhdGguCi0KLSAgIFRoaXMgaXMgY2FsbGVkIHZpYSBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUuCi0gICBHTE9CQUxfVkVSQ0hFQ0tfTkVFREVEIGlzIHRoZSBsaXN0IG9mIG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBvYmplY3QKLSAgIHdoaWNoIHdlIGFyIGNoZWNraW5nLiAgVGhpcyBzZXRzIEdMT0JBTF9WRVJDSEVDS19GQUlMRUQgaWYgd2UgZmluZAotICAgYSBjb25mbGljdGluZyB2ZXJzaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBjb25zdCBjaGFyICpzb25hbWUsICpmOwotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7Ci0KLSAgaWYgKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpCi0gICAgcmV0dXJuOwotICBpZiAocy0+dGhlX2JmZCA9PSBOVUxMCi0gICAgICB8fCAoYmZkX2dldF9maWxlX2ZsYWdzIChzLT50aGVfYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChzLT50aGVfYmZkKTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgZm9yIChsID0gZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzdWZmaXg7Ci0KLSAgICAgIGlmIChzdHJjbXAgKGYsIGwtPm5hbWUpID09IDApCi0JewotCSAgLyogUHJvYmFibHkgY2FuJ3QgaGFwcGVuLCBidXQgaXQncyBhbiBlYXN5IGNoZWNrLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmNociAobC0+bmFtZSwgJy8nKSAhPSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzdWZmaXggPSBzdHJzdHIgKGwtPm5hbWUsICIuc28uIik7Ci0gICAgICBpZiAoc3VmZml4ID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICAgICAgaWYgKHN0cm5jbXAgKGYsIGwtPm5hbWUsIHN1ZmZpeCAtIGwtPm5hbWUpID09IDApCi0JewotCSAgLyogSGVyZSB3ZSBrbm93IHRoYXQgUyBpcyBhIGR5bmFtaWMgb2JqZWN0IEZPTy5TTy5WRVIxLCBhbmQKLSAgICAgICAgICAgICB0aGUgb2JqZWN0IHdlIGFyZSBjb25zaWRlcmluZyBuZWVkcyBhIGR5bmFtaWMgb2JqZWN0Ci0gICAgICAgICAgICAgRk9PLlNPLlZFUjIsIGFuZCBWRVIxIGFuZCBWRVIyIGFyZSBkaWZmZXJlbnQuICBUaGlzCi0gICAgICAgICAgICAgYXBwZWFycyB0byBiZSBhIHZlcnNpb24gbWlzbWF0Y2gsIHNvIHdlIHRlbGwgdGhlIGNhbGxlcgotICAgICAgICAgICAgIHRvIHRyeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeS4gICovCi0JICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJwYXRoOwotICBhc2VjdGlvbiAqc2ludGVycDsKLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0Ci0gICAgIHRoZSBFTEYgYmFja2VuZCBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQotICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCk7Ci0KLSAgLyogTGV0IHRoZSBFTEYgYmFja2VuZCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYW55IHNlY3Rpb25zIHJlcXVpcmVkCi0gICAgIGJ5IGR5bmFtaWMgbGlua2luZy4gICovCi0gIHJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOwotICBpZiAocnBhdGggPT0gTlVMTCkKLSAgICBycGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0gIGlmICghIChiZmRfZWxmJHtFTEZTSVpFfV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgICAgICAgIChvdXRwdXRfYmZkLCBjb21tYW5kX2xpbmUuc29uYW1lLCBycGF0aCwKLQkgIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYywgY29tbWFuZF9saW5lLmZpbHRlcl9zaGxpYiwKLQkgIChjb25zdCBjaGFyICogY29uc3QgKikgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzLAotCSAgJmxpbmtfaW5mbywgJnNpbnRlcnAsIGxhbmdfZWxmX3ZlcnNpb25faW5mbykpKQotICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKLQotICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIGR5bmFtaWMgbGlua2VyIHdlIGFyZSB1c2luZy4gICovCi0gIGlmIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgIT0gTlVMTAotICAgICAgJiYgc2ludGVycCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpbnRlcnAtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcjsKLSAgICAgIHNpbnRlcnAtPl9yYXdfc2l6ZSA9IHN0cmxlbiAoY29tbWFuZF9saW5lLmludGVycHJldGVyKSArIDE7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGFueSBzZWN0aW9ucyBuYW1lZCAuZ251Lndhcm5pbmcuICBBcyBhIEdOVSBleHRlbnNpb25zLAotICAgICB3ZSB0cmVhdCBzdWNoIHNlY3Rpb25zIGFzIGNvbnRhaW5pbmcgd2FybmluZyBtZXNzYWdlcy4gIFdlIHByaW50Ci0gICAgIG91dCB0aGUgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiB6ZXJvIG91dCB0aGUgc2VjdGlvbiBzaXplIHNvCi0gICAgIHRoYXQgaXQgZG9lcyBub3QgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlhc2VjdGlvbiAqczsKLQliZmRfc2l6ZV90eXBlIHN6OwotCWNoYXIgKm1zZzsKLQlib29sZWFuIHJldDsKLQotCWlmIChpcy0+anVzdF9zeW1zX2ZsYWcpCi0JICBjb250aW51ZTsKLQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZ251Lndhcm5pbmciKTsKLQlpZiAocyA9PSBOVUxMKQotCSAgY29udGludWU7Ci0KLQlzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzKTsKLQltc2cgPSB4bWFsbG9jICgoc2l6ZV90KSBzeiArIDEpOwotCWlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaXMtPnRoZV9iZmQsIHMsIG1zZywgKGZpbGVfcHRyKSAwLCBzeikpCi0JICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuZ251Lndhcm5pbmc6ICVFXG4iLAotCQkgaXMtPnRoZV9iZmQpOwotCW1zZ1tzel0gPSAnXDAnOwotCXJldCA9IGxpbmtfaW5mby5jYWxsYmFja3MtPndhcm5pbmcgKCZsaW5rX2luZm8sIG1zZywKLQkJCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSAgICBpcy0+dGhlX2JmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSAgICAoYmZkX3ZtYSkgMCk7Ci0JQVNTRVJUIChyZXQpOwotCWZyZWUgKG1zZyk7Ci0KLQkvKiBDbG9iYmVyIHRoZSBzZWN0aW9uIHNpemUsIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgY29weWluZyB0aGUKLQkgICB3YXJuaW5nIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQlzLT5fcmF3X3NpemUgPSAwOwotICAgICAgfQotICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb2NhdGVzIGFueSBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGFuZAotICAgdGVsbHMgdGhlIEVMRiBiYWNrZW5kIGFib3V0IHRoZW0sIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KLSAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLQotICAgICAgLyogV2UgY2FsbCByZWNvcmRfbGlua19hc3NpZ25tZW50IGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLgotCSBUaGlzIGlzIGJlY2F1c2UgaWYgaXQgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCB3ZQotCSBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgZGVmaW5lZCBieSB0aGUgbGlua2VyIHNjcmlwdCwKLQkgbm90IHRoZSB2YWx1ZSBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCAoYmVjYXVzZSB3ZSBhcmUgc2V0dGluZwotCSBzeW1ib2xzIGxpa2UgZXRleHQpLiAgSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhcgotCSBvYmplY3QsIHRoZW4sIGFzIGl0IGhhcHBlbnMsIGNhbGxpbmcgcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCSB3aWxsIGRvIG5vIGhhcm0uICAqLwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgKGJmZF9lbGYke0VMRlNJWkV9X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkJIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBleHAtPmFzc2lnbi5kc3QsCi0JCSAgZXhwLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfcHJvdmlkZSA/IHRydWUgOiBmYWxzZSkpKQotCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCByYW5kb20gU0hGX0FMTE9DCi0gICBzZWN0aW9ucyBpbiB0aGUgcmlnaHQgc2VnbWVudC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqaG9sZF9zZWN0aW9uOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdXNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdGV4dDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JvZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZWw7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9pbnRlcnA7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnBsYWNlOwotICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgYWRkOwotICBldHJlZV90eXBlICphZGRyZXNzOwotICBjb25zdCBjaGFyICpzZWNuYW1lLCAqcHM7Ci0gIGNvbnN0IGNoYXIgKm91dHNlY25hbWU7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2NyaXB0IHRvIHNlZSB3aGVyZSB0byBwbGFjZSB0aGlzIHNlY3Rpb24uICAqLwotICBob2xkX3NlY3Rpb24gPSBzOwotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGFscmVhZHkgcGxhY2VkIGEgc2VjdGlvbiB3aXRoIHRoaXMgbmFtZS4gICovCi0gICAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZmluYWwgbGluaywgdGhlbiBhbHdheXMgcHV0IC5nbnUud2FybmluZy5TWU1CT0wKLSAgICAgc2VjdGlvbnMgaW50byB0aGUgLnRleHQgc2VjdGlvbiB0byBnZXQgdGhlbSBvdXQgb2YgdGhlIHdheS4gICovCi0gIGlmICghIGxpbmtfaW5mby5zaGFyZWQKLSAgICAgICYmICEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgPT0gMAotICAgICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgd2lsZF9kb2l0ICgmaG9sZF90ZXh0LT5jaGlsZHJlbiwgcywgaG9sZF90ZXh0LCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBEZWNpZGUgd2hpY2ggc2VnbWVudCB0aGUgc2VjdGlvbiBzaG91bGQgZ28gaW4gYmFzZWQgb24gdGhlCi0gICAgIHNlY3Rpb24gbmFtZSBhbmQgc2VjdGlvbiBmbGFncy4gIFdlIHB1dCBsb2FkYWJsZSAubm90ZSBzZWN0aW9ucwotICAgICByaWdodCBhZnRlciB0aGUgLmludGVycCBzZWN0aW9uLCBzbyB0aGF0IHRoZSBQVF9OT1RFIHNlZ21lbnQgaXMKLSAgICAgc3RvcmVkIHJpZ2h0IGFmdGVyIHRoZSBwcm9ncmFtIGhlYWRlcnMgd2hlcmUgdGhlIE9TIGNhbiByZWFkIGl0Ci0gICAgIGluIHRoZSBmaXJzdCBwYWdlLiAgKi8KLSAgcGxhY2UgPSBOVUxMOwotICBpZiAocy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0gICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLm5vdGUiLCA0KSA9PSAwCi0gICAgICAmJiBob2xkX2ludGVycCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9pbnRlcnA7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICAmJiBob2xkX2JzcyAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9ic3M7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICYmIGhvbGRfZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9kYXRhOwotICBlbHNlIGlmIChzdHJuY21wIChzZWNuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkgICAmJiBob2xkX3JlbCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yZWw7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgJiYgKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF9yb2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcm9kYXRhOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfdGV4dDsKLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENob29zZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgc2VjdGlvbi4gIFRoaXMgd2lsbCBiZSBuZWVkZWQgaWYgdGhlCi0gICAgIHNhbWUgc2VjdGlvbiBuYW1lIGFwcGVhcnMgaW4gdGhlIGlucHV0IGZpbGUgd2l0aCBkaWZmZXJlbnQKLSAgICAgbG9hZGFibGUgb3IgYWxsb2NhdGVhYmxlIGNoYXJhY3RlcmlzdGljcy4gICovCi0gIG91dHNlY25hbWUgPSBzZWNuYW1lOwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dHNlY25hbWUpICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxlbjsKLSAgICAgIGNoYXIgKm5ld25hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgbGVuID0gc3RybGVuIChvdXRzZWNuYW1lKTsKLSAgICAgIG5ld25hbWUgPSB4bWFsbG9jIChsZW4gKyA1KTsKLSAgICAgIHN0cmNweSAobmV3bmFtZSwgb3V0c2VjbmFtZSk7Ci0gICAgICBpID0gMDsKLSAgICAgIGRvCi0JewotCSAgc3ByaW50ZiAobmV3bmFtZSArIGxlbiwgIiVkIiwgaSk7Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKLQotICAgICAgb3V0c2VjbmFtZSA9IG5ld25hbWU7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCBwdXQgaXQgaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlLiAgVGhpcyBzaHVmZmxpbmcgaXMgdG8gbWFrZSB0aGUgb3V0cHV0IGZpbGUgbG9vayBuZWF0ZXIuICAqLwotICBzbmV3ID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSk7Ci0gIGlmIChzbmV3ID09IE5VTEwpCi0gICAgICBlaW5mbyAoIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiwKLQkgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOwotICBpZiAocGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQk7Ci0gICAgICAqcHBzID0gc25ldy0+bmV4dDsKLSAgICAgIHNuZXctPm5leHQgPSBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQ7Ci0gICAgICBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQgPSBzbmV3OwotICAgIH0KLQotICAvKiBTdGFydCBidWlsZGluZyBhIGxpc3Qgb2Ygc3RhdGVtZW50cyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgb2xkID0gc3RhdF9wdHI7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICAvKiBJZiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpcyByZXByZXNlbnRhYmxlIGluIEMsIHRoZW4gY3JlYXRlCi0gICAgIHN5bWJvbHMgdG8gbWFyayB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICAqLwotICBmb3IgKHBzID0gb3V0c2VjbmFtZTsgKnBzICE9ICdcMCc7IHBzKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwcykgJiYgKnBzICE9ICdfJykKLSAgICAgIGJyZWFrOwotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBvdXRzZWNuYW1lICsgc2l6ZW9mICJfX3N0YXJ0XyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RhcnRfJXMiLCBvdXRzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF91bm9wIChBTElHTl9LLAotCQkJCQkJZXhwX2ludG9wICgoYmZkX3ZtYSkgMQotCQkJCQkJCSAgIDw8IHMtPmFsaWdubWVudF9wb3dlcikpKSk7Ci0gICAgfQotCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgYWRkcmVzcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBhZGRyZXNzID0gZXhwX2ludG9wICgoYmZkX3ZtYSkgMCk7Ci0KLSAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJICAgICAgIChiZmRfdm1hKSAwLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0c2VjbmFtZSk7Ci0gIHdpbGRfZG9pdCAoJm9zLT5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOwotCi0gIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gICAgKChiZmRfdm1hKSAwLCAiKmRlZmF1bHQqIiwgKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSBOVUxMLAotICAgICAiKmRlZmF1bHQqIik7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLQotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBvdXRzZWNuYW1lICsgc2l6ZW9mICJfX3N0b3BfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdG9wXyVzIiwgb3V0c2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpKSk7Ci0gICAgfQotCi0gIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgKmFkZC50YWlsID0gcGxhY2UtPmhlYWRlci5uZXh0OwotICBwbGFjZS0+aGVhZGVyLm5leHQgPSBhZGQuaGVhZDsKLQotICBzdGF0X3B0ciA9IG9sZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24gKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmIChzLT5oZWFkZXIudHlwZSAhPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtKQotICAgIHJldHVybjsKLQotICBvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsIGhvbGRfc2VjdGlvbi0+bmFtZSkgPT0gMAotICAgICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmICgoaG9sZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICA9PSAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpKSkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJvZGF0YSIpID09IDApCi0gICAgaG9sZF9yb2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICBob2xkX2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5ic3MiKSA9PSAwKQotICAgIGhvbGRfYnNzID0gb3M7Ci0gIGVsc2UgaWYgKGhvbGRfcmVsID09IE5VTEwKLQkgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotCSAgICYmIChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgc3RybmNtcCAob3MtPm5hbWUsICIucmVsIiwgNCkgPT0gMCkKLSAgICBob2xkX3JlbCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmludGVycCIpID09IDApCi0gICAgaG9sZF9pbnRlcnAgPSBvczsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiIDsgdGhlbgotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpIHJldHVybicJCSAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cyAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1maQotCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cyI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1pZiB0ZXN0IC1uICIkUEFSU0VfQU5EX0xJU1RfQVJHUyIgOyB0aGVuCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotc3RhdGljIGludCAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIFBBUkFNUyAoKEZJTEUgKiBmaWxlKSk7Ci0KLSAkUEFSU0VfQU5EX0xJU1RfQVJHUwotRU9GCi1lbHNlCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0jZGVmaW5lIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzICAgTlVMTAotI2RlZmluZSBnbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIE5VTEwKLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBOVUxMLCAJLyogZmluaXNoICovCi0gIE5VTEwsIAkvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuLAotICBOVUxMLAkJLyogc2V0X3N5bWJvbHMgKi8KLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIE5VTEwsCQkvKiB1bnJlY29nbml6ZWRfZmlsZSAqLwotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zLAotICBOVUxMLAkJLyogcmVjb2duaXplZF9maWxlICovCi0gIE5VTEwJCS8qIGZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2dlbmVyaWMuZW0gYi9sZC9lbXVsdGVtcGwvZ2VuZXJpYy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzNWUwOS4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2VuZXJpYy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwJLyogZmluaXNoICovCi0gIE5VTEwsCS8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsCS8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIE5VTEwsCS8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLAkvKiBzZXQgc3ltYm9scyAqLwotICBOVUxMLAkvKiBwYXJzZSBhcmdzICovCi0gIE5VTEwsCS8qIHVucmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwsCS8qIGxpc3Qgb3B0aW9ucyAqLwotICBOVUxMLAkvKiByZWNvZ25pemVkIGZpbGUgKi8KLSAgTlVMTCAJLyogZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzICovCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvZ2xkOTYwLmVtIGIvbGQvZW11bHRlbXBsL2dsZDk2MC5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4ZTViZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2xkOTYwLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAKLSAqIGVtdWxhdGUgdGhlIEludGVscyBwb3J0IG9mICBnbGQKLSAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi0jaWZkZWYgR05VOTYwCi0KLXN0YXRpYyB2b2lkCi1nbGQ5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgc3RhdGljIGNoYXIgKmVudl92YXJpYWJsZXNbXSA9IHsgIkc5NjBMSUIiLCAiRzk2MEJBU0UiLCAwIH07Ci0gIGNoYXIgKipwOwotICBjaGFyICplbnYgOwotCi0gIGZvciAoIHAgPSBlbnZfdmFyaWFibGVzOyAqcDsgcCsrICl7Ci0gICAgZW52ID0gIChjaGFyICopIGdldGVudigqcCk7Ci0gICAgaWYgKGVudikgewotICAgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGNvbmNhdCAoZW52LAotCQkJCSAgICAgICAiL2xpYi9saWJib3V0IiwKLQkJCQkgICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCksCi0JCQkgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci19Ci0KLSNlbHNlCS8qIG5vdCBHTlU5NjAgKi8KLQotc3RhdGljIHZvaWQgZ2xkOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIGNoYXIgKmVudiA7Ci0gIGVudiA9ICBnZXRlbnYoIkc5NjBMSUIiKTsKLSAgaWYgKGVudikgewotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoKGVudiwgZmFsc2UpOwotICB9Ci0gIGVudiA9IGdldGVudigiRzk2MEJBU0UiKTsKLSAgaWYgKGVudikKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoY29uY2F0IChlbnYsICIvbGliIiwgKGNvbnN0IGNoYXIgKikgTlVMTCksIGZhbHNlKTsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotfQotCi0jZW5kaWYJLyogR05VOTYwICovCi0KLQotc3RhdGljIHZvaWQKLWdsZDk2MF9zZXRfb3V0cHV0X2FyY2goKQotewotICBiZmRfc2V0X2FyY2hfbWFjaChvdXRwdXRfYmZkLCBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgYmZkX21hY2hfaTk2MF9jb3JlKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkOTYwX2Nob29zZV90YXJnZXQoKQotewotI2lmZGVmIEdOVTk2MAotCi0gIG91dHB1dF9maWxlbmFtZSA9ICJiLm91dCI7Ci0gIHJldHVybiBiZmRfbWFrZV90YXJnX25hbWUoQkZEX0JPVVRfRk9STUFULCAwKTsKLQotI2Vsc2UKLQotICBjaGFyICpmcm9tX291dHNpZGUgPSBnZXRlbnYoVEFSR0VUX0VOVklST04pOwotICBvdXRwdXRfZmlsZW5hbWUgPSAiYi5vdXQiOwotCi0gIGlmIChmcm9tX291dHNpZGUgIT0gKGNoYXIgKilOVUxMKQotICAgIHJldHVybiBmcm9tX291dHNpZGU7Ci0KLSAgcmV0dXJuICJiLm91dC5saXR0bGUiOwotCi0jZW5kaWYKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkOTYwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2dsZDk2MF9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkOTYwX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCwKLSAgZ2xkOTYwX2Nob29zZV90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZDk2MF9nZXRfc2NyaXB0LAotICAiOTYwIiwKLSAgIiIsCi0gIE5VTEwsCS8qIGZpbmlzaCAqLwotICBOVUxMLAkvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLAkvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBOVUxMLAkvKiBwbGFjZSBvcnBoYW4gKi8KLSAgTlVMTCwJLyogc2V0IHN5bWJvbHMgKi8KLSAgTlVMTCwJLyogcGFyc2UgYXJncyAqLwotICBOVUxMLAkvKiB1bnJlY29nbml6ZWQgZmlsZSAqLwotICBOVUxMLAkvKiBsaXN0IG9wdGlvbnMgKi8KLSAgTlVMTCwJLyogcmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwgCS8qIGZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2dsZDk2MGMuZW0gYi9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmMTYyNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAKLSAqIGVtdWxhdGUgdGhlIEludGVscyBwb3J0IG9mICBnbGQKLSAqLwotCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLSNpZmRlZiBHTlU5NjAKLQotc3RhdGljIHZvaWQKLWdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKLSAgY2hhciAqKnA7Ci0gIGNoYXIgKmVudiA7Ci0KLSAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKLSAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKLSAgICBpZiAoZW52KSB7Ci0gICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoY29uY2F0IChlbnYsCi0JCQkJICAgICAgICIvbGliL2xpYmNvZmYiLAotCQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSwKLQkJCSAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2Vsc2UJLyogbm90IEdOVTk2MCAqLwotCi1zdGF0aWMgdm9pZCBnbGQ5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgY2hhciAqZW52IDsKLSAgZW52ID0gIGdldGVudigiRzk2MExJQiIpOwotICBpZiAoZW52KSB7Ci0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoZW52LCBmYWxzZSk7Ci0gIH0KLSAgZW52ID0gZ2V0ZW52KCJHOTYwQkFTRSIpOwotICBpZiAoZW52KQotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwgIi9saWIiLCAoY29uc3QgY2hhciAqKSBOVUxMKSwKLQkJCSAgICAgZmFsc2UpOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci19Ci0KLSNlbmRpZgkvKiBHTlU5NjAgKi8KLQotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSAhPSBOVUxMCi0gICAgICAmJiAqbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBjaGFyICpzLCAqczE7Ci0KLSAgICAgIHMgPSBjb25jYXQgKCJpOTYwOiIsIGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgIGZvciAoczEgPSBzOyAqczEgIT0gJ1wwJzsgczErKykKLQlpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzMSkpCi0JICAqczEgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMxKTsKLSAgICAgIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKHMpOwotICAgICAgZnJlZSAocyk7Ci0gICAgfQotCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0ICgpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQ5NjBfY2hvb3NlX3RhcmdldCgpCi17Ci0jaWZkZWYgR05VOTYwCi0KLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLSAgcmV0dXJuIGJmZF9tYWtlX3RhcmdfbmFtZShCRkRfQk9VVF9GT1JNQVQsIDApOwotCi0jZWxzZQotCi0gIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudihUQVJHRVRfRU5WSVJPTik7Ci0gIG91dHB1dF9maWxlbmFtZSA9ICJiLm91dCI7Ci0KLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLQotICByZXR1cm4gImNvZmYtSW50ZWwtbGl0dGxlIjsKLQotI2VuZGlmCi19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZDk2MF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9nbGQ5NjBjb2ZmX2VtdWxhdGlvbiA9IAotewotICBnbGQ5NjBfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfc2V0X291dHB1dF9hcmNoLAotICBnbGQ5NjBfY2hvb3NlX3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkOTYwX2dldF9zY3JpcHQsCi0gICI5NjBjb2ZmIiwKLSAgIiIsCi0gIE5VTEwsCS8qIGZpbmlzaCAqLwotICBOVUxMLAkvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLAkvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBOVUxMLAkvKiBwbGFjZSBvcnBoYW4gKi8KLSAgTlVMTCwJLyogc2V0IHN5bWJvbHMgKi8KLSAgTlVMTCwJLyogcGFyc2UgYXJncyAqLwotICBOVUxMLAkvKiB1bnJlY29nbml6ZWQgZmlsZSAqLwotICBOVUxMLAkvKiBsaXN0IG9wdGlvbnMgKi8KLSAgTlVMTCwJLyogcmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwgCS8qIGZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2hwcGFlbGYuZW0gYi9sZC9lbXVsdGVtcGwvaHBwYWVsZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlNDM2Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvaHBwYWVsZi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBBbiBlbXVsYXRpb24gZm9yIEhQIFBBLVJJU0MgRUxGIGxpbmtlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0KLS8qIFNlY3Rpb24gaW4gd2hpY2ggd2UgYnVpbGQgc3R1YnMuICAqLwotc3RhdGljIGFzZWN0aW9uICpzdHViX3NlYzsKLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzdHViX2ZpbGU7Ci0KLQotLyogRklYTUUuICBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuICAqLwotZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBmaWxlX2NoYWluOwotCi0vKiBQZXJmb3JtIHNvbWUgZW11bGF0aW9uIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLiAgRm9yIFBBIEVMRiB3ZSBzZXQKLSAgIHVwIHRoZSBsb2NhbCBsYWJlbCBwcmVmaXggYW5kIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfYmVmb3JlX3BhcnNlICgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaHBwYTsKLX0KLQotLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lID0gMDsKLQotICBiZmRfc2V0X2FyY2hfbWFjaCAob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIG1hY2hpbmUpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGlucHV0IGZpbGVzIGFyZSBvcGVuZWQuICBXZSBjcmVhdGUgYSBuZXcKLSAgIGZha2UgaW5wdXQgZmlsZSB0byBob2xkIHRoZSBzdHViIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyAoKQotewotICBzdHViX2ZpbGUgPSBsYW5nX2FkZF9pbnB1dF9maWxlICgibGlua2VyIHN0dWJzIiwKLQkJCQkgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAotCQkJCSAgIE5VTEwpOwotICBzdHViX2ZpbGUtPnRoZV9iZmQgPSBiZmRfY3JlYXRlICgibGlua2VyIHN0dWJzIiwgb3V0cHV0X2JmZCk7Ci0gIGlmIChzdHViX2ZpbGUtPnRoZV9iZmQgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X2FyY2hfbWFjaCAoc3R1Yl9maWxlLT50aGVfYmZkLAotCQkJICAgICAgYmZkX2dldF9hcmNoIChvdXRwdXRfYmZkKSwKLQkJCSAgICAgIGJmZF9nZXRfbWFjaCAob3V0cHV0X2JmZCkpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgQkZEICVFXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3R1Yl9zZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN0dWJfZmlsZS0+dGhlX2JmZCwgIi50ZXh0Iik7Ci0gIC8qIERvbid0IHNldCBTRUNfUkVMT0MgdW50aWwgd2UgYWN0dWFsbHkgaGF2ZSByZWxvY2F0aW9ucyBpbiB0aGlzCi0gICAgIHNlY3Rpb24uICAqLwotICBpZiAoc3R1Yl9zZWMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0dWJfZmlsZS0+dGhlX2JmZCwgc3R1Yl9zZWMsCi0JCQkJICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgIHwgU0VDX0FMTE9DCi0JCQkJICAgfCBTRUNfTE9BRAotCQkJCSAgIHwgU0VDX0NPREUKLQkJCQkgICB8IFNFQ19JTl9NRU1PUlkpKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIHN0dWIgc2VjdGlvbjogJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsZGxhbmdfYWRkX2ZpbGUgKHN0dWJfZmlsZSk7Ci19Ci0KLS8qIFdhbGsgYWxsIHRoZSBsYW5nIHN0YXRlbWVudHMgc3BsaWNpbmcgb3V0IGFueSBwYWRkaW5nIHN0YXRlbWVudHMgZnJvbSAKLSAgIHRoZSBsaXN0LiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAocywgcHJldikKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnByZXY7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnNwcmV2ID0gTlVMTDsKLSAgZm9yICg7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0KLQkvKiBXZSB3YW50IHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2Ugc2VjdGlvbnMuICAqLwotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwKLQkJCQkJICAgICAmY29uc3RydWN0b3JfbGlzdC5oZWFkKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCSAgaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuCi0JCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkLAotCQkJCQkgICAgICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuCi0JCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCi0JLyogSHVoPyAgV2hhdCBpcyBhIGxhbmdfd2lsZF9zdGF0ZW1lbnQ/ICAqLwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzLT53aWxkX3N0YXRlbWVudC4KLQkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQsCi0JCQkJCSAgICAgJnMtPndpbGRfc3RhdGVtZW50LgotCQkJCQkgICAgICAgY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQotCS8qIEhlcmUncyB3aGF0IHdlIGFyZSByZWFsbHkgbG9va2luZyBmb3IuICBTcGxpY2UgdGhlc2Ugb3V0IG9mCi0JICAgdGhlIGxpc3QuICAqLwotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKHNwcmV2KQotCSAgICBzcHJldi0+aGVhZGVyLm5leHQgPSBzLT5oZWFkZXIubmV4dDsKLQkgIGVsc2UKLQkgICAgKipwcmV2ID0gKnM7Ci0JICBicmVhazsKLQotCS8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlc2UgY2FzZXMuICAqLwotCWNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHNwcmV2ID0gczsKLSAgICB9Ci19Ci0KLS8qIEZpbmFsIGVtdWxhdGlvbiBzcGVjaWZpYyBjYWxsLiAgRm9yIHRoZSBQQSB3ZSB1c2UgdGhpcyBvcHBvcnR1bml0eQotICAgdG8gYnVpbGQgbGlua2VyIHN0dWJzLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfZmluaXNoICgpCi17Ci0gIC8qIENhbGwgaW50byB0aGUgQkZEIGJhY2tlbmQgdG8gZG8gdGhlIHJlYWwgd29yay4gICovCi0gIGlmIChlbGYzMl9ocHBhX3NpemVfc3R1YnMgKHN0dWJfZmlsZS0+dGhlX2JmZCwgb3V0cHV0X2JmZCwgJmxpbmtfaW5mbykKLSAgICAgID09IGZhbHNlKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBzaXplIHN0dWIgc2VjdGlvbjogJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIC8qIElmIHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gaXMgbm9uemVybywgdGhlbiB3ZSBuZWVkCi0gICAgIHRvIHJlc2l6ZSB0aGUgc2VjdGlvbnMsIHJlY29tcHV0ZSB0aGUgYXNzaWdubWVudHMsIGFuZCBmaW5hbGx5Ci0gICAgIGJ1aWxkIHRoZSBzdHVicy4gICovCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdHViX2ZpbGUtPnRoZV9iZmQsIHN0dWJfZmlsZS0+dGhlX2JmZC0+c2VjdGlvbnMpICE9IDApCi0gICAgewotICAgICAgLyogRGVsZXRlIGFsbCB0aGUgcGFkZGluZyBzdGF0ZW1lbnRzLCB0aGV5J3JlIG5vIGxvbmdlciB2YWxpZC4gICovCi0gICAgICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHN0YXRfcHRyLT5oZWFkLCAmc3RhdF9wdHItPmhlYWQpOwotICAgICAgCi0gICAgICAvKiBSZXNpemUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdF9wdHItPmhlYWQsIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJnN0YXRfcHRyLT5oZWFkLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotICAgICAgCi0gICAgICAvKiBSZWRvIHNwZWNpYWwgc3R1ZmYuICAqLwotICAgICAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0gICAgICAKLSAgICAgIC8qIERvIHRoZSBhc3NpZ25tZW50cyBhZ2Fpbi4gICovCi0gICAgICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0X3B0ci0+aGVhZCwKLQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLSAgICAgIAotICAgICAgLyogTm93IGJ1aWxkIHRoZSBsaW5rZXIgc3R1YnMuICAqLwotICAgICAgaWYgKGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMgKHN0dWJfZmlsZS0+dGhlX2JmZCwgJmxpbmtfaW5mbykgPT0gZmFsc2UpCi0JewotCSAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGJ1aWxkIHN0dWJzOiAlRVxuIik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogVGhlIHNjcmlwdCBpdHNlbGYgZ2V0cyBpbnNlcnRlZCBoZXJlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotaHBwYWVsZl9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9ocHBhZWxmX2VtdWxhdGlvbiA9IAotewotICBocHBhZWxmX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgaHBwYWVsZl9zZXRfb3V0cHV0X2FyY2gsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgaHBwYWVsZl9nZXRfc2NyaXB0LAotICAiaHBwYWVsZiIsCi0gICJlbGYzMi1ocHBhIiwKLSAgaHBwYWVsZl9maW5pc2gsCi0gIGhwcGFlbGZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMsCi0gIE5VTEwsCS8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIE5VTEwsCS8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLAkvKiBzZXQgc3ltYm9scyAqLwotICBOVUxMLAkvKiBwYXJzZSBhcmdzICovCi0gIE5VTEwsCS8qIHVucmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwsCS8qIGxpc3Qgb3B0aW9ucyAqLwotICBOVUxMLAkvKiByZWNvZ25pemVkIGZpbGUgKi8KLSAgTlVMTCAJLyogZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzICovCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvbGludXguZW0gYi9sZC9lbXVsdGVtcGwvbGludXguZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYTg1NWUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2xpbnV4LmVtCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogTGludXggYS5vdXQgZW11bGF0aW9uIGNvZGUgZm9yICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotICAgTGludXggc3VwcG9ydCBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cwotICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotICBjb25maWcuZHluYW1pY19saW5rID0gdHJ1ZTsKLSAgY29uZmlnLmhhc19zaGFyZWQgPSB0cnVlOwotfQotCi0vKiBUcnkgdG8gb3BlbiBhIGR5bmFtaWMgYXJjaGl2ZS4gIFRoaXMgaXMgd2hlcmUgd2Uga25vdyB0aGF0IExpbnV4Ci0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc2EuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCi0JCQkgICAgICsgc3RybGVuIChlbnRyeS0+ZmlsZW5hbWUpCi0JCQkgICAgICsgc3RybGVuIChhcmNoKQotCQkJICAgICArIHNpemVvZiAiL2xpYi5zYSIpOwotCi0gIHNwcmludGYgKHN0cmluZywgIiVzL2xpYiVzJXMuc2EiLCBzZWFyY2gtPm5hbWUsIGVudHJ5LT5maWxlbmFtZSwgYXJjaCk7Ci0KLSAgaWYgKCEgbGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9jYXRlcyBhbnkgYWRkcmVzcyBhc3NpZ25tZW50IHRvCi0gICAudGV4dCwgYW5kIG1vZGlmaWVzIGl0IHRvIGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGhlYWRlcnMuICBUaGlzCi0gICBjYXVzZXMgLVR0ZXh0IHRvIG1lYW4gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGhlYWRlciwgcmF0aGVyCi0gICB0aGFuIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIC50ZXh0LCB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIKLSAgIExpbnV4IHRvb2xzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW0KLSAgICAgICYmIHN0cmNtcCAocy0+YWRkcmVzc19zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIHsKLSAgICAgIEFTU0VSVCAocy0+YWRkcmVzc19zdGF0ZW1lbnQuYWRkcmVzcy0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3ZhbHVlKTsKLSAgICAgIHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3MtPnZhbHVlLnZhbHVlICs9IDB4MjA7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgb3BlbmluZyB0aGUgaW5wdXQgQkZEJ3MuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCkKLXsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgd29yayBvdXQgdGhlIHNpemVzIG9mIGFueSBzZWN0aW9ucyByZXF1aXJlZCBieQotICAgICBkeW5hbWljIGxpbmtpbmcuICAqLwotICBpZiAoISBiZmRfJHtFTVVMQVRJT05fTkFNRX1fc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsCS8qIGZpbmlzaCAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUsCi0gIE5VTEwsCS8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLAkvKiBzZXQgc3ltYm9scyAqLwotICBOVUxMLAkvKiBwYXJzZSBhcmdzICovCi0gIE5VTEwsCS8qIHVucmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwsCS8qIGxpc3Qgb3B0aW9ucyAqLwotICBOVUxMLAkvKiByZWNvZ25pemVkIGZpbGUgKi8KLSAgTlVMTCAJLyogZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzICovCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvbG5rOTYwLmVtIGIvbGQvZW11bHRlbXBsL2xuazk2MC5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjMzI1Ny4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvbG5rOTYwLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIGludGVsIGNvZmYgbG9hZGVyIGVtdWxhdGlvbiBzcGVjaWZpYyBzdHVmZgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qI2luY2x1ZGUgImFyY2h1cmVzLmgiKi8KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLXR5cGVkZWYgc3RydWN0IGxpYl9saXN0IHsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IGxpYl9saXN0ICpuZXh0OwotfSBsaWJfbGlzdF90eXBlOwotCi1zdGF0aWMgbGliX2xpc3RfdHlwZSAqaGxsX2xpc3Q7Ci1zdGF0aWMgbGliX2xpc3RfdHlwZSAqKmhsbF9saXN0X3RhaWwgPSAmaGxsX2xpc3Q7Ci0KLXN0YXRpYyBsaWJfbGlzdF90eXBlICpzeXNsaWJfbGlzdDsKLXN0YXRpYyBsaWJfbGlzdF90eXBlICoqc3lzbGliX2xpc3RfdGFpbCA9ICZzeXNsaWJfbGlzdDsKLQotCi1zdGF0aWMgdm9pZAotYXBwZW5kKGxpc3QsIG5hbWUpCi0gICAgIGxpYl9saXN0X3R5cGUgKioqbGlzdDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgbGliX2xpc3RfdHlwZSAqZWxlbWVudCA9IAotICAgIChsaWJfbGlzdF90eXBlICopKHhtYWxsb2Moc2l6ZW9mKGxpYl9saXN0X3R5cGUpKSk7Ci0KLSAgZWxlbWVudC0+bmFtZSA9IG5hbWU7Ci0gIGVsZW1lbnQtPm5leHQgPSAobGliX2xpc3RfdHlwZSAqKU5VTEw7Ci0gICoqbGlzdCA9IGVsZW1lbnQ7Ci0gICpsaXN0ID0gJmVsZW1lbnQtPm5leHQ7Ci0KLX0KLQotc3RhdGljIGJvb2xlYW4gaGFkX2hsbCA9IGZhbHNlOwotc3RhdGljIGJvb2xlYW4gaGFkX2hsbF9uYW1lID0gZmFsc2U7Ci0KLXN0YXRpYyB2b2lkCi1sbms5NjBfaGxsKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGhhZF9obGwgPSB0cnVlOwotICBpZiAobmFtZSAhPSAoY2hhciAqKU5VTEwpIHsKLSAgICBoYWRfaGxsX25hbWUgPSB0cnVlOwotICAgIGFwcGVuZCgmaGxsX2xpc3RfdGFpbCwgbmFtZSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgCi1sbms5NjBfc3lzbGliKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFwcGVuZCgmc3lzbGliX2xpc3RfdGFpbCxuYW1lKTsKLX0KLQotCi0jaWZkZWYgR05VOTYwCi0KLXN0YXRpYyB2b2lkIAotbG5rOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIHN0YXRpYyBjaGFyICplbnZfdmFyaWFibGVzW10gPSB7ICJHOTYwTElCIiwgIkc5NjBCQVNFIiwgMCB9OwotICBjaGFyICoqcDsKLSAgY2hhciAqZW52IDsKLQotICBmb3IgKCBwID0gZW52X3ZhcmlhYmxlczsgKnA7IHArKyApewotICAgIGVudiA9ICAoY2hhciAqKSBnZXRlbnYoKnApOwotICAgIGlmIChlbnYpIHsKLSAgICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoKGNvbmNhdChlbnYsIi9saWIvbGliY29mZiIsIiIpLCBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgZW52PSAoY2hhciAqKSBnZXRlbnYoIkk5NjBCQVNFIik7Ci0gIGlmICggZW52ICkgewotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoKGNvbmNhdChlbnYsIi9saWIiLCIiKSwgZmFsc2UpOwotICB9Ci0KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci19Ci0KLSNlbHNlCS8qIG5vdCBHTlU5NjAgKi8KLQotc3RhdGljIHZvaWQgCi1sbms5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgY2hhciAqbmFtZSA9IGdldGVudigiSTk2MEJBU0UiKTsKLQotICBpZiAobmFtZSA9PSAoY2hhciAqKU5VTEwpIHsKLSAgICBuYW1lID0gZ2V0ZW52KCJHOTYwQkFTRSIpOwotICAgIGlmIChuYW1lID09IChjaGFyICopTlVMTCkgewotICAgICAgZWluZm8oIiVQJUYgSTk2MEJBU0UgYW5kIEc5NjBCQVNFIG5vdCBzZXRcbiIpOwotICAgIH0KLSAgfQotCi0KLSAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoY29uY2F0KG5hbWUsIi9saWIiLCIiKSwgZmFsc2UpOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci0gIGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLX0KLQotI2VuZGlmCS8qIEdOVTk2MCAqLwotCi0KLXN0YXRpYyB2b2lkCi1hZGRfb24obGlzdCwgc2VhcmNoKQotICAgICBsaWJfbGlzdF90eXBlICpsaXN0OwotICAgICBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIHNlYXJjaDsKLXsKLSAgd2hpbGUgKGxpc3QpIHsKLSAgICBsYW5nX2FkZF9pbnB1dF9maWxlKGxpc3QtPm5hbWUsCi0JCQlzZWFyY2gsCi0JCQkoY2hhciAqKU5VTEwpOwotICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICB9Ci19Ci1zdGF0aWMgdm9pZAotbG5rOTYwX2FmdGVyX3BhcnNlKCkKLXsKLSAgLyogSWYgdGhlcmUgaGFzIGJlZW4gbm8gYXJjaCwgZGVmYXVsdCB0byAtS0IgKi8KLSAgaWYgKGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lWzBdID09MCkgewotICAgIGxkZmlsZV9hZGRfYXJjaCgiS0IiKTsKLSAgfQotCi0gIC8qIGlmIHRoZXJlIGhhcyBiZWVuIG5vIGhsbCBsaXN0IHRoZW4gYWRkIG91ciBvd24gKi8KLSAgCi0gIGlmKGhhZF9obGwgJiYgIWhhZF9obGxfbmFtZSkgewotICAgIGFwcGVuZCgmaGxsX2xpc3RfdGFpbCwiY2ciKTsKLSAgICBpZiAobGRmaWxlX291dHB1dF9tYWNoaW5lID09IGJmZF9tYWNoX2k5NjBfa2Ffc2EgfHwKLSAgCWxkZmlsZV9vdXRwdXRfbWFjaGluZSA9PSBiZmRfbWFjaF9pOTYwX2NhKSB7Ci0gICAgICAgIHsKLQkgIGFwcGVuZCgmaGxsX2xpc3RfdGFpbCwiZnBnIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIGFkZF9vbihobGxfbGlzdCwgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSk7Ci0gIGFkZF9vbihzeXNsaWJfbGlzdCwgbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0pOwotfQotCi1zdGF0aWMgdm9pZAotbG5rOTYwX2JlZm9yZV9hbGxvY2F0aW9uKCkKLXsKLX0KLQotc3RhdGljIHZvaWQKLWxuazk2MF9hZnRlcl9hbGxvY2F0aW9uKCkKLXsKLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gZmFsc2UpIHsKLSAgICBsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mKCIudGV4dCIsIl9ldGV4dCIpOwotICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YoIi5kYXRhIiwiX2VkYXRhIik7Ci0gICAgbGFuZ19hYnNfc3ltYm9sX2F0X2JlZ2lubmluZ19vZigiLmJzcyIsIl9ic3Nfc3RhcnQiKTsKLSAgICBsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mKCIuYnNzIiwiX2VuZCIpOwotICB9Ci19Ci0KLQotc3RhdGljIHN0cnVjdAotIHsKLSAgIHVuc2lnbmVkICBsb25nIG51bWJlcjsKLSAgIGNoYXIgKm5hbWU7IAotIH0KLW1hY2hpbmVfdGFibGVbXSA9Ci17Ci0gIHsgYmZkX21hY2hfaTk2MF9jb3JlCSwiQ09SRSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwiS0IiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYl9zYgksIlNCIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfbWMJLCJNQyIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX3hhCSwiWEEiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9jYQksIkNBIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJLQSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2thX3NhCSwiU0EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9qeAksIkpYIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfaHgJLCJIWCIgfSwKLQotICB7IGJmZF9tYWNoX2k5NjBfY29yZQksImNvcmUiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYl9zYgksImtiIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJzYiIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX21jCSwibWMiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF94YQksInhhIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfY2EJLCJjYSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2thX3NhCSwia2EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksInNhIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfangJLCJqeCIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2h4CSwiaHgiIH0sCi0KLSAgeyAwLCAoY2hhciAqKSBOVUxMIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1sbms5NjBfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGlmIHBvc3NpYmxlICovCi0gIHVuc2lnbmVkIGludCBpOwotICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci0gIGZvciAoaT0gMDsgbWFjaGluZV90YWJsZVtpXS5uYW1lICE9IChjaGFyKilOVUxMOyBpKyspIHsKLSAgICBpZiAoc3RyY21wKGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lLG1hY2hpbmVfdGFibGVbaV0ubmFtZSk9PTApIHsKLSAgICAgIGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9IG1hY2hpbmVfdGFibGVbaV0ubnVtYmVyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGJmZF9zZXRfYXJjaF9tYWNoKG91dHB1dF9iZmQsIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCBsZGZpbGVfb3V0cHV0X21hY2hpbmUpOwotfQotCi1zdGF0aWMgY2hhciAqCi1sbms5NjBfY2hvb3NlX3RhcmdldCgpCi17Ci0jaWZkZWYgR05VOTYwCi0KLSAgcmV0dXJuIGJmZF9tYWtlX3RhcmdfbmFtZShCRkRfQ09GRl9GT1JNQVQsIDApOwotCi0jZWxzZQotCi0gIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudihUQVJHRVRfRU5WSVJPTik7Ci0gIGlmIChmcm9tX291dHNpZGUgIT0gKGNoYXIgKilOVUxMKQotICAgIHJldHVybiBmcm9tX291dHNpZGU7Ci0jaWZkZWYgTE5LOTYwX0xJVFRMRQotICByZXR1cm4gImNvZmYtSW50ZWwtbGl0dGxlIjsKLSNlbHNlCi0gIHJldHVybiAiY29mZi1JbnRlbC1iaWciOwotI2VuZGlmCi0jZW5kaWYKLQotfQotCi1zdGF0aWMgY2hhciAqCi1sbms5NjBfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfbG5rOTYwX2VtdWxhdGlvbiA9IAotewotICBsbms5NjBfYmVmb3JlX3BhcnNlLAotICBsbms5NjBfc3lzbGliLAotICBsbms5NjBfaGxsLAotICBsbms5NjBfYWZ0ZXJfcGFyc2UsCi0gIE5VTEwsCQkJLyogYWZ0ZXJfb3BlbiAqLwotICBsbms5NjBfYWZ0ZXJfYWxsb2NhdGlvbiwKLSAgbG5rOTYwX3NldF9vdXRwdXRfYXJjaCwKLSAgbG5rOTYwX2Nob29zZV90YXJnZXQsCi0gIGxuazk2MF9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgbG5rOTYwX2dldF9zY3JpcHQsCi0gICJsbms5NjAiLAotICAiIiwKLSAgTlVMTCwJLyogZmluaXNoICovCi0gIE5VTEwsCS8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsCS8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIE5VTEwsCS8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLAkvKiBzZXQgc3ltYm9scyAqLwotICBOVUxMLAkvKiBwYXJzZSBhcmdzICovCi0gIE5VTEwsCS8qIHVucmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwsCS8qIGxpc3Qgb3B0aW9ucyAqLwotICBOVUxMLAkvKiByZWNvZ25pemVkIGZpbGUgKi8KLSAgTlVMTCAJLyogZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzICovCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtIGIvbGQvZW11bHRlbXBsL21pcHNlY29mZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5MzJhMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogSGFuZGxlIGVtYmVkZGVkIHJlbG9jcyBmb3IgTUlQUy4KLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiBiYXNlZCBvbiBnZW5lcmljLmVtLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2hlY2tfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcnVuIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4KLSAgIFdlIGNyZWF0ZSBhIC5yZWwuc2RhdGEgc2VjdGlvbiBmb3IgZWFjaCBpbnB1dCBmaWxlIHdpdGggYSBub24gemVybwotICAgLnNkYXRhIHNlY3Rpb24uICBUaGUgQkZEIGJhY2tlbmQgd2lsbCBmaWxsIGluIHRoZXNlIHNlY3Rpb25zIHdpdGgKLSAgIG1hZ2ljIG51bWJlcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVsb2NhdGUgdGhlIGRhdGEgc2VjdGlvbiBhdCBydW4KLSAgIHRpbWUuICBUaGlzIHdpbGwgb25seSBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgYWxsIHRoZSBpbnB1dCBmaWxlcwotICAgaGF2ZSBiZWVuIGNvbXBpbGVkIHVzaW5nIC1tZW1iZWRkZWQtcGljLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgYmZkICphYmZkOwotCi0gIGlmICghIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MKLSAgICAgIHx8IGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoYWJmZCA9IGxpbmtfaW5mby5pbnB1dF9iZmRzOyBhYmZkICE9IE5VTEw7IGFiZmQgPSBhYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0KLSAgICAgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOwotCi0gICAgICAvKiBOb3RlIHRoYXQgd2UgYXNzdW1lIHRoYXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGhhcyBhbHJlYWR5Ci0gICAgICAgICBiZWVuIHNldCB1cC4gIFdlIGNvdWxkIGNhbGwgYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCwgYnV0Ci0gICAgICAgICB0aGF0IHJldHVybnMgdGhlIHNpemUgb2YgYSBtZW1vcnkgYnVmZmVyIHJhdGhlciB0aGFuIGEgcmVsb2MKLSAgICAgICAgIGNvdW50LiAgV2UgZG8gbm90IHdhbnQgdG8gY2FsbCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLAotICAgICAgICAgYmVjYXVzZSBhbHRob3VnaCBpdCB3b3VsZCBhbHdheXMgd29yayBpdCB3b3VsZCBmb3JjZSB1cyB0bwotICAgICAgICAgcmVhZCBpbiB0aGUgcmVsb2NzIGludG8gQkZEIGNhbm9uaWNhbCBmb3JtLCB3aGljaCB3b3VsZCB3YXN0ZQotICAgICAgICAgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZSBhbmQgbWVtb3J5LiAgKi8KLSAgICAgIGlmIChkYXRhc2VjICE9IE5VTEwgJiYgZGF0YXNlYy0+cmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGFzZWN0aW9uICpyZWxzZWM7Ci0KLQkgIHJlbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsLnNkYXRhIik7Ci0JICBpZiAocmVsc2VjID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcmVsc2VjLAotCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZKSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHJlbHNlYywgMikKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxzZWMsCi0JCQkJCSBkYXRhc2VjLT5yZWxvY19jb3VudCAqIDQpKQotCSAgICBlaW5mbyAoIiVGJUI6IGNhbiBub3QgY3JlYXRlIC5yZWwuc2RhdGEgc2VjdGlvbjogJUVcbiIpOwotCX0KLQotICAgICAgLyogRG91YmxlIGNoZWNrIHRoYXQgYWxsIG90aGVyIGRhdGEgc2VjdGlvbnMgYXJlIGVtcHR5LCBhcyBpcwotICAgICAgICAgcmVxdWlyZWQgZm9yIGVtYmVkZGVkIFBJQyBjb2RlLiAgKi8KLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgY2hlY2tfc2VjdGlvbnMsIChQVFIpIGRhdGFzZWMpOwotICAgIH0KLX0KLQotLyogQ2hlY2sgdGhhdCBvZiB0aGUgZGF0YSBzZWN0aW9ucywgb25seSB0aGUgLnNkYXRhIHNlY3Rpb24gaGFzCi0gICByZWxvY3MuICBUaGlzIGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZWNrX3NlY3Rpb25zIChhYmZkLCBzZWMsIHNkYXRhc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBzZGF0YXNlYzsKLXsKLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQ09ERSkgPT0gMAotICAgICAgJiYgc2VjICE9IChhc2VjdGlvbiAqKSBzZGF0YXNlYwotICAgICAgJiYgc2VjLT5yZWxvY19jb3VudCAhPSAwKQotICAgIGVpbmZvICgiJVAlWDogc2VjdGlvbiAlcyBoYXMgcmVsb2NzOyBjYW4gbm90IHVzZSAtLWVtYmVkZGVkLXJlbG9jc1xuIiwKLQkgICBhYmZkLCBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9uIHNpemVzIGFuZCBvZmZzZXRzIGhhdmUKLSAgIGJlZW4gc2V0LiAgSWYgd2UgYXJlIGdlbmVyYXRpbmcgZW1iZWRkZWQgcmVsb2NzLCBpdCBjYWxscyBhIHNwZWNpYWwKLSAgIEJGRCBiYWNrZW5kIHJvdXRpbmUgdG8gZG8gdGhlIHdvcmsuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfYWxsb2NhdGlvbiAoKQotewotICBiZmQgKmFiZmQ7Ci0KLSAgaWYgKCEgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcwotICAgICAgfHwgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChhYmZkID0gbGlua19pbmZvLmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YXNlYywgKnJlbHNlYzsKLSAgICAgIGNoYXIgKmVycm1zZzsKLQotICAgICAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIGlmIChkYXRhc2VjID09IE5VTEwgfHwgZGF0YXNlYy0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsLnNkYXRhIik7Ci0gICAgICBBU1NFUlQgKHJlbHNlYyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyAoYWJmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgIGRhdGFzZWMsIHJlbHNlYywKLQkJCQkJCSAgICZlcnJtc2cpKQotCXsKLQkgIGlmIChlcnJtc2cgPT0gTlVMTCkKLQkgICAgZWluZm8gKCIlQiVYOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlRVxuIiwKLQkJICAgYWJmZCk7Ci0JICBlbHNlCi0JICAgIGVpbmZvICgiJVglQjogY2FuIG5vdCBjcmVhdGUgcnVudGltZSByZWxvYyBpbmZvcm1hdGlvbjogJXNcbiIsCi0JCSAgIGFiZmQsIGVycm1zZyk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uLAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsCS8qIGZpbmlzaCAqLwotICBOVUxMLAkvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLAkvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBOVUxMLAkvKiBwbGFjZSBvcnBoYW4gKi8KLSAgTlVMTCwJLyogc2V0IHN5bWJvbHMgKi8KLSAgTlVMTCwJLyogcGFyc2UgYXJncyAqLwotICBOVUxMLAkvKiB1bnJlY29nbml6ZWQgZmlsZSAqLwotICBOVUxMLAkvKiBsaXN0IG9wdGlvbnMgKi8KLSAgTlVMTCwJLyogcmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwgCS8qIGZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL29zdHJpbmcuc2VkIGIvbGQvZW11bHRlbXBsL29zdHJpbmcuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTI2ZDNmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9vc3RyaW5nLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMSBzL14vIi8KLSQgcy8kL24iLwpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3BlLmVtIGIvbGQvZW11bHRlbXBsL3BlLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTNiYjQwLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9wZS5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEzNjUgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotcm0gLWYgZSR7RU1VTEFUSU9OX05BTUV9LmMKLShlY2hvO2VjaG87ZWNobztlY2hvO2VjaG8pPmUke0VNVUxBVElPTl9OQU1FfS5jICMgdGhlcmUsIG5vdyBsaW5lIG51bWJlcnMgbWF0Y2ggOy0pCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRm9yIFdJTkRPV1NfTlQgKi8KLS8qIFRoZSBvcmlnaW5hbCBmaWxlIGdlbmVyYXRlZCByZXR1cm5lZCBkaWZmZXJlbnQgZGVmYXVsdCBzY3JpcHRzIGRlcGVuZGluZwotICAgb24gd2hldGhlciBjZXJ0YWluIHN3aXRjaGVzIHdlcmUgc2V0LCBidXQgdGhlc2Ugc3dpdGNoZXMgcGVydGFpbiB0byB0aGUKLSAgIExpbnV4IHN5c3RlbSBhbmQgdGhhdCBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgY29mZi4gIEluIHRoZSBOVCBjYXNlLCB3ZQotICAgb25seSBkZXRlcm1pbmUgaWYgdGhlIHN1YnN5c3RlbSBpcyBjb25zb2xlIG9yIHdpbmRvd3MgaW4gb3JkZXIgdG8gc2VsZWN0Ci0gICB0aGUgY29ycmVjdCBlbnRyeSBwb2ludCBieSBkZWZhdWx0LiAqLyAKLSAgCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLQotLyogRklYTUU6IFRoaXMgaXMgYSBCRkQgaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGFuZCB3ZSBzaG91bGQgbm90IGJlCi0gICB1c2luZyBpdCBoZXJlLiAgKi8KLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotI2luY2x1ZGUgInBlLWRsbC5oIgotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0vKiBQZXJtaXQgdGhlIGVtdWxhdGlvbiBwYXJhbWV0ZXJzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlY3Rpb24KLSAgIGFsaWdubWVudCBieSBzZXR0aW5nIE9WRVJSSURFX1NFQ1RJT05fQUxJR05NRU5ULiAgRklYTUU6IFRoaXMgbWFrZXMKLSAgIGl0IHNlZW0gdGhhdCBpbmNsdWRlL2NvZmYvaW50ZXJuYWwuaCBzaG91bGQgbm90IGRlZmluZQotICAgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5ULiAgKi8KLSNpZiBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQgIT0gJHtPVkVSUklERV9TRUNUSU9OX0FMSUdOTUVOVDotUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UfQotI3VuZGVmIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVAotI2RlZmluZSBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQgJHtPVkVSUklERV9TRUNUSU9OX0FMSUdOTUVOVH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChUQVJHRVRfSVNfaTM4NnBlKQotI2RlZmluZSBETExfU1VQUE9SVAotI2VuZGlmCi0jaWYgZGVmaW5lZChUQVJHRVRfSVNfc2hwZSkgfHwgZGVmaW5lZChUQVJHRVRfSVNfbWlwc3BlKSB8fCBkZWZpbmVkKFRBUkdFVF9JU19hcm1wZSkKLSNkZWZpbmUgRExMX1NVUFBPUlQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChUQVJHRVRfSVNfaTM4NnBlKSB8fCAhIGRlZmluZWQoRExMX1NVUFBPUlQpCi0jZGVmaW5lCVBFX0RFRl9TVUJTWVNURU0JCTMKLSNlbHNlCi0jdW5kZWYgTlRfRVhFX0lNQUdFX0JBU0UKLSN1bmRlZiBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQKLSN1bmRlZiBQRV9ERUZfRklMRV9BTElHTk1FTlQKLSNkZWZpbmUgTlRfRVhFX0lNQUdFX0JBU0UJCTB4MDAwMTAwMDAKLSNpZmRlZiBUQVJHRVRfSVNfYXJtcGUKLSNkZWZpbmUgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UCTB4MDAwMDEwMDAKLSNkZWZpbmUJUEVfREVGX1NVQlNZU1RFTQkJOQotI2Vsc2UKLSNkZWZpbmUgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UCTB4MDAwMDA0MDAKLSNkZWZpbmUJUEVfREVGX1NVQlNZU1RFTQkJMgotI2VuZGlmCi0jZGVmaW5lIFBFX0RFRl9GSUxFX0FMSUdOTUVOVAkJMHgwMDAwMDIwMAotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfSVNfYXJtX2Vwb2NfcGUKLSNkZWZpbmUgYmZkX2FybV9wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9hcm1fZXBvY19wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2FybV9wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9hcm1fZXBvY19wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfYXJtX2Vwb2NfcGVfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyBpbnQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlOwotc3RhdGljIGludCBkbGw7Ci1zdGF0aWMgaW50IHN1cHBvcnRfb2xkX2NvZGUgPSAwOwotc3RhdGljIGNoYXIgKiB0aHVtYl9lbnRyeV9zeW1ib2wgPSBOVUxMOwotc3RhdGljIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqaW1hZ2VfYmFzZV9zdGF0ZW1lbnQgPSAwOwotCi1zdGF0aWMgaW50IHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gLTE7IC8qIDA9ZGlzYWJsZSAxPWVuYWJsZSAqLwotI2lmZGVmIERMTF9TVVBQT1JUCi1zdGF0aWMgY2hhciAqcGVfb3V0X2RlZl9maWxlbmFtZSA9IDA7Ci1zdGF0aWMgY2hhciAqcGVfaW1wbGliX2ZpbGVuYW1lID0gMDsKLSNlbmRpZgotCi1leHRlcm4gY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0gIG91dHB1dF9maWxlbmFtZSA9ICIke0VYRUNVVEFCTEVfTkFNRTotYS5leGV9IjsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotI2lmZGVmIERMTF9TVVBQT1JUCi0gIGNvbmZpZy5oYXNfc2hhcmVkID0gMTsKLQotI2lmIChQRV9ERUZfU1VCU1lTVEVNID09IDkpIHx8IChQRV9ERUZfU1VCU1lTVEVNID09IDIpCi0jaWYgZGVmaW5lZCBUQVJHRVRfSVNfbWlwc3BlIHx8IGRlZmluZWQgVEFSR0VUX0lTX2FybXBlCi0gIGxhbmdfYWRkX2VudHJ5ICgiV2luTWFpbkNSVFN0YXJ0dXAiLCAxKTsKLSNlbHNlCi0gIGxhbmdfYWRkX2VudHJ5ICgiX1dpbk1haW5DUlRTdGFydHVwIiwgMSk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi19Ci0MCi0vKiBQRSBmb3JtYXQgZXh0cmEgY29tbWFuZCBsaW5lIG9wdGlvbnMuICAqLwotCi0vKiBVc2VkIGZvciBzZXR0aW5nIGZsYWdzIGluIHRoZSBQRSBoZWFkZXIuICovCi0jZGVmaW5lIE9QVElPTl9CQVNFX0ZJTEUJCSgzMDAgICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RMTAkJCShPUFRJT05fQkFTRV9GSUxFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0ZJTEVfQUxJR05NRU5UCQkoT1BUSU9OX0RMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCQkoT1BUSU9OX0ZJTEVfQUxJR05NRU5UICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9JTUFHRV9CQVNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01BSk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01JTk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQJKE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TVEFDSyAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVUJTWVNURU0gICAgICAgICAgICAgICAgKE9QVElPTl9TVEFDSyArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUFQCQkJKE9QVElPTl9TVUJTWVNURU0gKyAxKQotI2RlZmluZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERQkJKE9QVElPTl9IRUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX09VVF9ERUYJCQkoT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUX0FMTAkJKE9QVElPTl9PVVRfREVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNQk9MUwkJKE9QVElPTl9FWFBPUlRfQUxMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0tJTExfQVRTCQkJKE9QVElPTl9FWENMVURFX1NZTUJPTFMgKyAxKQotI2RlZmluZSBPUFRJT05fU1REQ0FMTF9BTElBU0VTCQkoT1BUSU9OX0tJTExfQVRTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQCShPUFRJT05fU1REQ0FMTF9BTElBU0VTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUAkoT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNUExJQl9GSUxFTkFNRQkJKE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVAgKyAxKQotI2RlZmluZSBPUFRJT05fVEhVTUJfRU5UUlkJCShPUFRJT05fSU1QTElCX0ZJTEVOQU1FICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fRFVQTElDQVRFX0VYUE9SVFMJKE9QVElPTl9USFVNQl9FTlRSWSArIDEpCi0jZGVmaW5lIE9QVElPTl9JTVBfQ09NUEFUCQkoT1BUSU9OX1dBUk5fRFVQTElDQVRFX0VYUE9SVFMgKyAxKQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KLXsKLSAgLyogUEUgb3B0aW9ucyAqLwotICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9GSUxFfSwKLSAgeyJkbGwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RMTH0sCi0gIHsiZmlsZS1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZJTEVfQUxJR05NRU5UfSwKLSAgeyJoZWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUFQfSwgCi0gIHsiaW1hZ2UtYmFzZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1BR0VfQkFTRX0sCi0gIHsibWFqb3ItaW1hZ2UtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTn0sCi0gIHsibWFqb3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTn0sCi0gIHsibWFqb3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKLSAgeyJtaW5vci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OfSwKLSAgeyJtaW5vci1vcy12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OfSwKLSAgeyJtaW5vci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT059LAotICB7InNlY3Rpb24tYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVH0sCi0gIHsic3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQUNLfSwKLSAgeyJzdWJzeXN0ZW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVQlNZU1RFTX0sCi0gIHsic3VwcG9ydC1vbGQtY29kZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1VQUE9SVF9PTERfQ09ERX0sCi0gIHsidGh1bWItZW50cnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RIVU1CX0VOVFJZfSwKLSNpZmRlZiBETExfU1VQUE9SVAotICAvKiBnZXRvcHQgYWxsb3dzIGFiYnJldmlhdGlvbnMsIHNvIHdlIGRvIHRoaXMgdG8gc3RvcCBpdCBmcm9tIHRyZWF0aW5nIC1vCi0gICAgIGFzIGFuIGFiYnJldmlhdGlvbiBmb3IgdGhpcyBvcHRpb24gKi8KLSAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRfREVGfSwKLSAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRfREVGfSwKLSAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTEx9LAotICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1CT0xTfSwKLSAgeyJraWxsLWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9LSUxMX0FUU30sCi0gIHsiYWRkLXN0ZGNhbGwtYWxpYXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NURENBTExfQUxJQVNFU30sCi0gIHsiZW5hYmxlLXN0ZGNhbGwtZml4dXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQfSwKLSAgeyJkaXNhYmxlLXN0ZGNhbGwtZml4dXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUH0sCi0gIHsib3V0LWltcGxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QTElCX0ZJTEVOQU1FfSwKLSAgeyJ3YXJuLWR1cGxpY2F0ZS1leHBvcnRzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX0RVUExJQ0FURV9FWFBPUlRTfSwKLSAgeyJjb21wYXQtaW1wbGliIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTVBfQ09NUEFUfSwKLSNlbmRpZgotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi0KLS8qIFBFL1dJTjMyOyBhZGRlZCByb3V0aW5lcyB0byBnZXQgdGhlIHN1YnN5c3RlbSB0eXBlLCBoZWFwIGFuZC9vciBzdGFjawotICAgcGFyYW1ldGVycyB3aGljaCBtYXkgYmUgaW5wdXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHZvaWQgKnB0cjsKLSAgaW50IHNpemU7Ci0gIGludCB2YWx1ZTsKLSAgY2hhciAqc3ltYm9sOwotICBpbnQgaW5pdGVkOwotfSBkZWZpbmZvOwotCi0jZGVmaW5lIEQoZmllbGQsc3ltYm9sLGRlZikgIHsmcGUuZmllbGQsc2l6ZW9mKHBlLmZpZWxkKSwgZGVmLCBzeW1ib2wsMH0KLQotc3RhdGljIGRlZmluZm8gaW5pdFtdID0KLXsKLSAgLyogaW1hZ2ViYXNlIG11c3QgYmUgZmlyc3QgKi8KLSNkZWZpbmUgSU1BR0VCQVNFT0ZGIDAKLSAgRChJbWFnZUJhc2UsIl9faW1hZ2VfYmFzZV9fIiwgTlRfRVhFX0lNQUdFX0JBU0UpLAotI2RlZmluZSBETExPRkYgMQotICB7JmRsbCwgc2l6ZW9mKGRsbCksIDAsICJfX2RsbF9fIiwgMH0sCi0gIEQoU2VjdGlvbkFsaWdubWVudCwiX19zZWN0aW9uX2FsaWdubWVudF9fIiwgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UKSwKLSAgRChGaWxlQWxpZ25tZW50LCJfX2ZpbGVfYWxpZ25tZW50X18iLCBQRV9ERUZfRklMRV9BTElHTk1FTlQpLAotICBEKE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwiX19tYWpvcl9vc192ZXJzaW9uX18iLCA0KSwKLSAgRChNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWlub3Jfb3NfdmVyc2lvbl9fIiwgMCksCi0gIEQoTWFqb3JJbWFnZVZlcnNpb24sIl9fbWFqb3JfaW1hZ2VfdmVyc2lvbl9fIiwgMSksCi0gIEQoTWlub3JJbWFnZVZlcnNpb24sIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIiwgMCksCi0jaWZkZWYgVEFSR0VUX0lTX2FybXBlCi0gIEQoTWFqb3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCAyKSwKLSNlbHNlCi0gIEQoTWFqb3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCA0KSwKLSNlbmRpZgotICBEKE1pbm9yU3Vic3lzdGVtVmVyc2lvbiwiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgMCksCi0gIEQoU3Vic3lzdGVtLCJfX3N1YnN5c3RlbV9fIiwgJHtTVUJTWVNURU19KSwKLSAgRChTaXplT2ZTdGFja1Jlc2VydmUsIl9fc2l6ZV9vZl9zdGFja19yZXNlcnZlX18iLCAweDIwMDAwMDApLAotICBEKFNpemVPZlN0YWNrQ29tbWl0LCJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iLCAweDEwMDApLAotICBEKFNpemVPZkhlYXBSZXNlcnZlLCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAweDEwMDAwMCksCi0gIEQoU2l6ZU9mSGVhcENvbW1pdCwiX19zaXplX29mX2hlYXBfY29tbWl0X18iLCAweDEwMDApLAotICBEKExvYWRlckZsYWdzLCJfX2xvYWRlcl9mbGFnc19fIiwgMHgwKSwKLSAgeyBOVUxMLCAwLCAwLCBOVUxMLCAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWJhc2VfZmlsZSA8YmFzZWZpbGU+ICAgICAgICAgICAgIEdlbmVyYXRlIGEgYmFzZSBmaWxlIGZvciByZWxvY2F0YWJsZSBETExzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1kbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgaW1hZ2UgYmFzZSB0byB0aGUgZGVmYXVsdCBmb3IgRExMc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZmlsZS1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgICAgU2V0IGZpbGUgYWxpZ25tZW50XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1oZWFwIDxzaXplPiAgICAgICAgICAgICAgICAgICAgICBTZXQgaW5pdGlhbCBzaXplIG9mIHRoZSBoZWFwXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1pbWFnZS1iYXNlIDxhZGRyZXNzPiAgICAgICAgICAgICBTZXQgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZXhlY3V0YWJsZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyB2ZXJzaW9uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gdmVyc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHJldmlzaW9uIG51bWJlciBvZiB0aGUgZXhlY3V0YWJsZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3Itb3MtdmVyc2lvbiA8bnVtYmVyPiAgICAgICAgU2V0IG1pbmltdW0gcmVxdWlyZWQgT1MgcmV2aXNpb25cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSByZXZpc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc2VjdGlvbi1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgU2V0IHNlY3Rpb24gYWxpZ25tZW50XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdGFjayA8c2l6ZT4gICAgICAgICAgICAgICAgICAgICBTZXQgc2l6ZSBvZiB0aGUgaW5pdGlhbCBzdGFja1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3Vic3lzdGVtIDxuYW1lPls6PHZlcnNpb24+XSAgICAgU2V0IHJlcXVpcmVkIE9TIHN1YnN5c3RlbSBbJiB2ZXJzaW9uXVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3VwcG9ydC1vbGQtY29kZSAgICAgICAgICAgICAgICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tdGh1bWItZW50cnk9PHN5bWJvbD4gICAgICAgICAgICAgU2V0IHRoZSBlbnRyeSBwb2ludCB0byBiZSBUaHVtYiA8c3ltYm9sPlxuIikpOwotI2lmZGVmIERMTF9TVVBQT1JUCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICAgICAgICAgICAgICBFeHBvcnQgc3ltYm9scyB3aXRoIGFuZCB3aXRob3V0IEBublxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgRG9uJ3QgbGluayBfc3ltIHRvIF9zeW1Abm5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgIExpbmsgX3N5bSB0byBfc3ltQG5uIHdpdGhvdXQgd2FybmluZ3NcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWV4Y2x1ZGUtc3ltYm9scyBzeW0sc3ltLC4uLiAgICAgIEV4Y2x1ZGUgc3ltYm9scyBmcm9tIGF1dG9tYXRpYyBleHBvcnRcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgICAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgZXhwb3J0IGFsbCBnbG9iYWxzIHRvIERMTFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0ta2lsbC1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIEBubiBmcm9tIGV4cG9ydGVkIHN5bWJvbHNcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW91dC1pbXBsaWIgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1vdXRwdXQtZGVmIDxmaWxlPiAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIC5ERUYgZmlsZSBmb3IgdGhlIGJ1aWx0IERMTFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0td2Fybi1kdXBsaWNhdGUtZXhwb3J0cyAgICAgICAgICAgV2FybiBhYm91dCBkdXBsaWNhdGUgZXhwb3J0cy5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWNvbXBhdC1pbXBsaWIgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBiYWNrd2FyZCBjb21wYXRpYmxlIGltcG9ydCBsaWJzO1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgX19pbXBfPFNZTUJPTD4gYXMgd2VsbC5cbiIpKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX25hbWUgKG5hbWUsIHZhbCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGludCBpOwotICAvKiBGaW5kIHRoZSBuYW1lIGFuZCBzZXQgaXQuICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ucHRyOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgaW5pdFtpXS5zeW1ib2wpID09IDApCi0JewotCSAgaW5pdFtpXS52YWx1ZSA9IHZhbDsKLQkgIGluaXRbaV0uaW5pdGVkID0gMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBhYm9ydCgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfc3Vic3lzdGVtICgpCi17Ci0gIGNvbnN0IGNoYXIgKnN2ZXI7Ci0gIGludCBsZW47Ci0gIGludCBpOwotICBzdGF0aWMgY29uc3Qgc3RydWN0IAotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjb25zdCBpbnQgdmFsdWU7Ci0gICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICB9Ci0gIHZbXSA9Ci0gICAgewotICAgICAgeyAibmF0aXZlIiwgMSwgIk50UHJvY2Vzc1N0YXJ0dXAiIH0sCi0jaWYgZGVmaW5lZCBUQVJHRVRfSVNfbWlwc3BlIHx8IGRlZmluZWQgVEFSR0VUX0lTX2FybXBlCi0gICAgICB7ICJ3aW5kb3dzIiwgMiwgIldpbk1haW5DUlRTdGFydHVwIiB9LAotI2Vsc2UKLSAgICAgIHsgIndpbmRvd3MiLCAyLCAiV2luTWFpbkNSVFN0YXJ0dXAiIH0sCi0jZW5kaWYKLSAgICAgIHsgImNvbnNvbGUiLCAzLCAibWFpbkNSVFN0YXJ0dXAiIH0sCi0jaWYgMAotICAgICAgLyogVGhlIE1pY3Jvc29mdCBsaW5rZXIgZG9lcyBub3QgcmVjb2duaXplIHRoaXMuICAqLwotICAgICAgeyAib3MyIiwgNSwgIiIgfSwKLSNlbmRpZgotICAgICAgeyAicG9zaXgiLCA3LCAiX19Qb3NpeFByb2Nlc3NTdGFydHVwIn0sCi0gICAgICB7ICJ3aW5jZSIsIDksICJfV2luTWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7IDAsIDAsIDAgfQotICAgIH07Ci0KLSAgc3ZlciA9IHN0cmNociAob3B0YXJnLCAnOicpOwotICBpZiAoc3ZlciA9PSBOVUxMKQotICAgIGxlbiA9IHN0cmxlbiAob3B0YXJnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmVuZDsKLQotICAgICAgbGVuID0gc3ZlciAtIG9wdGFyZzsKLSAgICAgIHNldF9wZV9uYW1lICgiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgc3RydG91bCAoc3ZlciArIDEsICZlbmQsIDApKTsKLSAgICAgIGlmICgqZW5kID09ICcuJykKLQlzZXRfcGVfbmFtZSAoIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsCi0JCSAgICAgc3RydG91bCAoZW5kICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIikpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyB2W2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAob3B0YXJnLCB2W2ldLm5hbWUsIGxlbikgPT0gMAotCSAgJiYgdltpXS5uYW1lW2xlbl0gPT0gJ1wwJykKLQl7Ci0JICBjb25zdCBjaGFyICppbml0aWFsX3N5bWJvbF9jaGFyOwotCSAgY29uc3QgY2hhciAqZW50cnk7Ci0KLQkgIHNldF9wZV9uYW1lICgiX19zdWJzeXN0ZW1fXyIsIHZbaV0udmFsdWUpOwotCi0JICBpbml0aWFsX3N5bWJvbF9jaGFyID0gJHtJTklUSUFMX1NZTUJPTF9DSEFSfTsKLQkgIGlmICgqaW5pdGlhbF9zeW1ib2xfY2hhciA9PSAnXDAnKQotCSAgICBlbnRyeSA9IHZbaV0uZW50cnk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICphbGNfZW50cnk7Ci0KLQkgICAgICAvKiBsYW5nX2FkZF9lbnRyeSBleHBlY3RzIGl0cyBhcmd1bWVudCB0byBiZSBwZXJtYW5lbnRseQotCQkgYWxsb2NhdGVkLCBzbyB3ZSBkb24ndCBmcmVlIHRoaXMgc3RyaW5nLiAgKi8KLQkgICAgICBhbGNfZW50cnkgPSB4bWFsbG9jIChzdHJsZW4gKGluaXRpYWxfc3ltYm9sX2NoYXIpCi0JCQkJICAgKyBzdHJsZW4gKHZbaV0uZW50cnkpCi0JCQkJICAgKyAxKTsKLQkgICAgICBzdHJjcHkgKGFsY19lbnRyeSwgaW5pdGlhbF9zeW1ib2xfY2hhcik7Ci0JICAgICAgc3RyY2F0IChhbGNfZW50cnksIHZbaV0uZW50cnkpOwotCSAgICAgIGVudHJ5ID0gYWxjX2VudHJ5OwotCSAgICB9Ci0KLQkgIGxhbmdfYWRkX2VudHJ5IChlbnRyeSwgMSk7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICAKLSAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgc3Vic3lzdGVtIHR5cGUgJXNcbiIpLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIHZvaWQKLXNldF9wZV92YWx1ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgCi17Ci0gIGNoYXIgKmVuZDsKLSAgCi0gIHNldF9wZV9uYW1lIChuYW1lLCAgc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKSk7Ci0gIAotICBpZiAoZW5kID09IG9wdGFyZykKLSAgICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIiksIG9wdGFyZyk7Ci0KLSAgb3B0YXJnID0gZW5kOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3N0YWNrX2hlYXAgKHJlc25hbWUsIGNvbW5hbWUpCi0gICAgIGNoYXIgKnJlc25hbWU7Ci0gICAgIGNoYXIgKmNvbW5hbWU7Ci17Ci0gIHNldF9wZV92YWx1ZSAocmVzbmFtZSk7Ci0gIAotICBpZiAoKm9wdGFyZyA9PSAnLCcpCi0gICAgewotICAgICAgb3B0YXJnKys7Ci0gICAgICBzZXRfcGVfdmFsdWUgKGNvbW5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wdGFyZykKLSAgICBlaW5mbyAoXygiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIpLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIGludAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgbG9uZ2luZDsKLSAgaW50IG9wdGM7Ci0gIGludCBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50IHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIHdhbnRlcnJvciA9IG9wdGVycjsKLQotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHdhbnRlcnJvcikKLQl4ZXhpdCAoMSk7Ci0gICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotICAgICAgbGlua19pbmZvLmJhc2VfZmlsZSA9IChQVFIpIGZvcGVuIChvcHRhcmcsIEZPUEVOX1dCKTsKLSAgICAgIGlmIChsaW5rX2luZm8uYmFzZV9maWxlID09IE5VTEwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gYmFzZSBmaWxlICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBQRSBvcHRpb25zICovCi0gICAgY2FzZSBPUFRJT05fSEVBUDogCi0gICAgICBzZXRfcGVfc3RhY2tfaGVhcCAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsICJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1RBQ0s6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1VCU1lTVEVNOgotICAgICAgc2V0X3BlX3N1YnN5c3RlbSAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3Jfb3NfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9GSUxFX0FMSUdOTUVOVDoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fZmlsZV9hbGlnbm1lbnRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX3NlY3Rpb25fYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RMTDoKLSAgICAgIHNldF9wZV9uYW1lICgiX19kbGxfXyIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9faW1hZ2VfYmFzZV9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFOgotICAgICAgc3VwcG9ydF9vbGRfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9USFVNQl9FTlRSWToKLSAgICAgIHRodW1iX2VudHJ5X3N5bWJvbCA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwotI2lmZGVmIERMTF9TVVBQT1JUCi0gICAgY2FzZSBPUFRJT05fT1VUX0RFRjoKLSAgICAgIHBlX291dF9kZWZfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRVhQT1JUX0FMTDoKLSAgICAgIHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FWENMVURFX1NZTUJPTFM6Ci0gICAgICBwZV9kbGxfYWRkX2V4Y2x1ZGVzIChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fS0lMTF9BVFM6Ci0gICAgICBwZV9kbGxfa2lsbF9hdHMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1REQ0FMTF9BTElBU0VTOgotICAgICAgcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUDoKLSAgICAgIHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUDoKLSAgICAgIHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0lNUExJQl9GSUxFTkFNRToKLSAgICAgIHBlX2ltcGxpYl9maWxlbmFtZSA9IHhzdHJkdXAgKG9wdGFyZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9XQVJOX0RVUExJQ0FURV9FWFBPUlRTOgotICAgICAgcGVfZGxsX3dhcm5fZHVwX2V4cG9ydHMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSU1QX0NPTVBBVDoKLSAgICAgIHBlX2RsbF9jb21wYXRfaW1wbGliID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgfQotICByZXR1cm4gMTsKLX0KLQwKLS8qIEFzc2lnbiB2YWx1ZXMgdG8gdGhlIHNwZWNpYWwgc3ltYm9scyBiZWZvcmUgdGhlIGxpbmtlciBzY3JpcHQgaXMKLSAgIHJlYWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzICgpCi17Ci0gIC8qIFJ1biB0aHJvdWdoIGFuZCBpbnZlbnQgc3ltYm9scyBmb3IgYWxsIHRoZQotICAgICBuYW1lcyBhbmQgaW5zZXJ0IHRoZSBkZWZhdWx0cy4gKi8KLSAgaW50IGo7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc2F2ZTsKLQotICBpZiAoIWluaXRbSU1BR0VCQVNFT0ZGXS5pbml0ZWQpCi0gICAgewotICAgICAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gMDsKLSAgICAgIGVsc2UgaWYgKGluaXRbRExMT0ZGXS52YWx1ZSB8fCBsaW5rX2luZm8uc2hhcmVkKQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IE5UX0RMTF9JTUFHRV9CQVNFOwotICAgICAgZWxzZQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IE5UX0VYRV9JTUFHRV9CQVNFOwotICAgIH0KLQotICAvKiBEb24ndCBkbyBhbnkgc3ltYm9sIGFzc2lnbm1lbnRzIGlmIHRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICAvKiBHbHVlIHRoZSBhc3NpZ25tZW50cyBpbnRvIHRoZSBhYnMgc2VjdGlvbiAqLwotICBzYXZlID0gc3RhdF9wdHI7Ci0KLSAgc3RhdF9wdHIgPSAmKGFic19vdXRwdXRfc2VjdGlvbi0+Y2hpbGRyZW4pOwotCi0gIGZvciAoaiA9IDA7IGluaXRbal0ucHRyOyBqKyspCi0gICAgewotICAgICAgbG9uZyB2YWwgPSBpbml0W2pdLnZhbHVlOwotICAgICAgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICpydjsKLSAgICAgIHJ2ID0gbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScgLGluaXRbal0uc3ltYm9sLCBleHBfaW50b3AgKHZhbCkpKTsKLSAgICAgIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKHNob3J0KSkKLQkqKHNob3J0ICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGludCkpCi0JKihpbnQgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YobG9uZykpCi0JKihsb25nICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICAvKiBUaGlzIG1pZ2h0IGJlIGEgbG9uZyBsb25nIG9yIG90aGVyIHNwZWNpYWwgdHlwZS4gICovCi0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGJmZF92bWEpKQotCSooYmZkX3ZtYSAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZQlhYm9ydCgpOwotICAgICAgaWYgKGogPT0gSU1BR0VCQVNFT0ZGKQotCWltYWdlX2Jhc2Vfc3RhdGVtZW50ID0gcnY7Ci0gICAgfQotICAvKiBSZXN0b3JlIHRoZSBwb2ludGVyLiAqLwotICBzdGF0X3B0ciA9IHNhdmU7Ci0gIAotICBpZiAocGUuRmlsZUFsaWdubWVudCA+Ci0gICAgICBwZS5TZWN0aW9uQWxpZ25tZW50KQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlUDogd2FybmluZywgZmlsZSBhbGlnbm1lbnQgPiBzZWN0aW9uIGFsaWdubWVudC5cbiIpKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBsaW5rZXIgc2NyaXB0IGFuZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMKLSAgIGhhdmUgYmVlbiByZWFkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9wYXJzZSAoKQotewotICAvKiBUaGUgV2luZG93cyBsaWJyYXJpZXMgYXJlIGRlc2lnbmVkIGZvciB0aGUgbGlua2VyIHRvIHRyZWF0IHRoZQotICAgICBlbnRyeSBwb2ludCBhcyBhbiB1bmRlZmluZWQgc3ltYm9sLiAgT3RoZXJ3aXNlLCB0aGUgLm9iaiB0aGF0Ci0gICAgIGRlZmluZXMgbWFpbkNSVFN0YXJ0dXAgaXMgYnJvdWdodCBpbiBiZWNhdXNlIGl0IGlzIHRoZSBmaXJzdAotICAgICBlbmNvdW50ZXJlZCBpbiBsaWJjLmxpYiBhbmQgaXQgaGFzIG90aGVyIHN5bWJvbHMgaW4gaXQgd2hpY2ggd2lsbAotICAgICBiZSBwdWxsZWQgaW4gYnkgdGhlIGxpbmsgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIGFjdCBhcwotICAgICB0aG91Z2ggdGhlIHVzZXIgc3BlY2lmaWVkIC11IHdpdGggdGhlIGVudHJ5IHBvaW50IHN5bWJvbC4KLQotICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgbGlua2VyIHNjcmlwdCBhbmQgY29tbWFuZCBsaW5lCi0gICAgIG9wdGlvbnMgaGF2ZSBiZWVuIHJlYWQsIHNvIGF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGUgcmlnaHQgZW50cnkKLSAgICAgcG9pbnQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGlucHV0IGZpbGVzIGFyZQotICAgICBvcGVuZWQsIHNvIHJlZ2lzdGVyaW5nIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkIHdpbGwgbWFrZSBhCi0gICAgIGRpZmZlcmVuY2UuICAqLwotCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgJiYgZW50cnlfc3ltYm9sICE9IE5VTEwpCi0gICAgbGRsYW5nX2FkZF91bmRlZiAoZW50cnlfc3ltYm9sKTsKLX0KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpwZV91bmRlZl9mb3VuZF9zeW07Ci0KLXN0YXRpYyBib29sZWFuCi1wZV91bmRlZl9jZGVjbF9tYXRjaCAoaCwgc3RyaW5nKQotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgUFRSIHN0cmluZzsKLXsKLSAgaW50IHNsID0gc3RybGVuIChzdHJpbmcpOwotICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Quc3RyaW5nLCBzdHJpbmcsIHNsKSA9PSAwCi0gICAgICAmJiBoLT5yb290LnN0cmluZ1tzbF0gPT0gJ0AnKQotICB7Ci0gICAgcGVfdW5kZWZfZm91bmRfc3ltID0gaDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBETExfU1VQUE9SVAotc3RhdGljIHZvaWQKLXBlX2ZpeHVwX3N0ZGNhbGxzICgpCi17Ci0gIHN0YXRpYyBpbnQgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAwOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWYsICpzeW07Ci0gIGNoYXIgKmF0OwotICBmb3IgKHVuZGVmID0gbGlua19pbmZvLmhhc2gtPnVuZGVmczsgdW5kZWY7IHVuZGVmPXVuZGVmLT5uZXh0KQotICAgIGlmICh1bmRlZi0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICB7Ci0gICAgICBhdCA9IHN0cmNociAodW5kZWYtPnJvb3Quc3RyaW5nLCAnQCcpOwotICAgICAgaWYgKGF0KQotICAgICAgewotCS8qIFRoZSBzeW1ib2wgaXMgYSBzdGRjYWxsIHN5bWJvbCwgc28gbGV0J3MgbG9vayBmb3IgYSBjZGVjbAotCSAgIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHJlc29sdmUgdG8gdGhhdCAqLwotCWNoYXIgKmNuYW1lID0geHN0cmR1cCAodW5kZWYtPnJvb3Quc3RyaW5nKTsKLQlhdCA9IHN0cmNociAoY25hbWUsICdAJyk7Ci0JKmF0ID0gMDsKLQlzeW0gPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGNuYW1lLCAwLCAwLCAxKTsKLQlpZiAoc3ltICYmIHN5bS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JewotCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOwotCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247Ci0JICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAotCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgY25hbWUpOwotCSAgICAgIGlmICghIGdhdmVfd2FybmluZ19tZXNzYWdlKQotCQl7Ci0JCSAgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAxOwotCQkgIGVpbmZvKF8oIlVzZSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2Ugd2FybmluZ3NcbiIpKTsKLQkJICBlaW5mbyhfKCJVc2UgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSBmaXh1cHNcbiIpKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCS8qIFRoZSBzeW1ib2wgaXMgYSBjZGVjbCBzeW1ib2wsIHNvIHdlIGxvb2sgZm9yIHN0ZGNhbGwKLQkgICBzeW1ib2xzIC0gd2hpY2ggbWVhbnMgc2Nhbm5pbmcgdGhlIHdob2xlIHN5bWJvbCB0YWJsZSAqLwotCXBlX3VuZGVmX2ZvdW5kX3N5bSA9IDA7Ci0JYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIHBlX3VuZGVmX2NkZWNsX21hdGNoLAotCQkJCShQVFIpIHVuZGVmLT5yb290LnN0cmluZyk7Ci0Jc3ltID0gcGVfdW5kZWZfZm91bmRfc3ltOwotCWlmIChzeW0pCi0JewotCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOwotCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247Ci0JICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAotCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgc3ltLT5yb290LnN0cmluZyk7Ci0JICAgICAgaWYgKCEgZ2F2ZV93YXJuaW5nX21lc3NhZ2UpCi0JCXsKLQkJICBnYXZlX3dhcm5pbmdfbWVzc2FnZSA9IDE7Ci0JCSAgZWluZm8oXygiVXNlIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSB3YXJuaW5nc1xuIikpOwotCQkgIGVpbmZvKF8oIlVzZSAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIGZpeHVwc1xuIikpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotfQotI2VuZGlmIC8qIERMTF9TVVBQT1JUICovCi0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICAvKiBQYXNzIHRoZSB3YWNreSBQRSBjb21tYW5kIGxpbmUgb3B0aW9ucyBpbnRvIHRoZSBvdXRwdXQgYmZkLgotICAgICBGSVhNRTogVGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgYSBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYnkKLSAgICAgaW5jbHVkaW5nIGFuIGludGVybmFsIEJGRCBoZWFkZXIuICAqLwotICAKLSAgaWYgKCFjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLSAgICBlaW5mbyAoXygiJUYlUDogUEUgb3BlcmF0aW9ucyBvbiBub24gUEUgZmlsZS5cbiIpKTsKLQotICBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyID0gcGU7Ci0gIHBlX2RhdGEgKG91dHB1dF9iZmQpLT5kbGwgPSBpbml0W0RMTE9GRl0udmFsdWU7Ci0KLSNpZmRlZiBETExfU1VQUE9SVAotICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXApIC8qIC0xPXdhcm4gb3IgMT1kaXNhYmxlICovCi0gICAgcGVfZml4dXBfc3RkY2FsbHMgKCk7Ci0KLSAgcGVfcHJvY2Vzc19pbXBvcnRfZGVmcyhvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcGVfZGxsX2J1aWxkX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLQotI2lmbmRlZiBUQVJHRVRfSVNfaTM4NnBlCi0jaWZuZGVmIFRBUkdFVF9JU19hcm1wZQotICBlbHNlCi0gICAgcGVfZXhlX2J1aWxkX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoVEFSR0VUX0lTX2FybXBlKSB8fCBkZWZpbmVkKFRBUkdFVF9JU19hcm1fZXBvY19wZSkKLSAgaWYgKHN0cnN0ciAoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLCAiYXJtIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgYXJtIGJhY2tlbmQgbmVlZHMgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIG91dHB1dCBoYXNoIHN0cnVjdHVyZS4KLQkgVGhlc2Ugd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgYW4gYXJtIGZvcm1hdCwKLQkgaGVuY2Ugd2UgZG8gbm90IHN1cHBvcnQgbGlua2luZyBhbmQgY2hhbmdpbmcgb3V0cHV0IGZvcm1hdHMgYXQgdGhlCi0JIHNhbWUgdGltZS4gIFVzZSBhIGxpbmsgZm9sbG93ZWQgYnkgb2JqY29weSB0byBjaGFuZ2Ugb3V0cHV0IGZvcm1hdHMuICAqLwotICAgICAgZWluZm8gKCIlRiVYJVA6IGVycm9yOiBjYW5ub3QgY2hhbmdlIG91dHB1dCBmb3JtYXQgd2hpbHN0IGxpbmtpbmcgQVJNIGJpbmFyaWVzXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHsKLSAgICAvKiBGaW5kIGEgQkZEIHRoYXQgY2FuIGhvbGQgdGhlIGludGVyd29ya2luZyBzdHVicy4gICovCi0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmIChiZmRfYXJtX3BlX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKSkKLQkgIGJyZWFrOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICB7Ci0gICAgaW50IGlzX21zX2FyY2ggPSAwOwotICAgIGJmZCAqY3VyX2FyY2ggPSAwOwotICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmlzMjsKLQotICAgIC8qIENhcmVmdWwgLSB0aGlzIGlzIGEgc2hlbGwgc2NyaXB0LiAgV2F0Y2ggdGhvc2UgZG9sbGFyIHNpZ25zISAqLwotICAgIC8qIE1pY3Jvc29mdCBpbXBvcnQgbGlicmFyaWVzIGhhdmUgZXZlcnkgbWVtYmVyIG5hbWVkIHRoZSBzYW1lLAotICAgICAgIGFuZCBub3QgaW4gdGhlIHJpZ2h0IG9yZGVyIGZvciB1cyB0byBsaW5rIHRoZW0gY29ycmVjdGx5LiAgV2UKLSAgICAgICBtdXN0IGRldGVjdCB0aGVzZSBhbmQgcmVuYW1lIHRoZSBtZW1iZXJzIHNvIHRoYXQgdGhleSdsbCBsaW5rCi0gICAgICAgY29ycmVjdGx5LiAgVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIG9iamVjdHM6IHRoZSBoZWFkLCB0aGUKLSAgICAgICB0aHVua3MsIGFuZCB0aGUgc2VudGluZWwocykuICBUaGUgaGVhZCBpcyBlYXN5OyBpdCdzIHRoZSBvbmUKLSAgICAgICB3aXRoIGlkYXRhMi4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzZW50aW5lbHMgd29uJ3QgaGF2ZSByZWxvY3MsCi0gICAgICAgYW5kIHRoZSB0aHVua3Mgd2lsbC4gIEl0J3MgZWFzaWVyIHRoYW4gY2hlY2tpbmcgdGhlIHN5bWJvbAotICAgICAgIHRhYmxlIGZvciBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKGlzLT50aGVfYmZkLT5teV9hcmNoaXZlKQotCSAgewotCSAgICBiZmQgKmFyY2ggPSBpcy0+dGhlX2JmZC0+bXlfYXJjaGl2ZTsKLQkgICAgaWYgKGN1cl9hcmNoICE9IGFyY2gpCi0JICAgICAgewotCQljdXJfYXJjaCA9IGFyY2g7Ci0JCWlzX21zX2FyY2ggPSAxOwotCQlmb3IgKGlzMiA9IGlzOwotCQkgICAgIGlzMiAmJiBpczItPnRoZV9iZmQtPm15X2FyY2hpdmUgPT0gYXJjaDsKLQkJICAgICBpczIgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKWlzMi0+bmV4dCkKLQkJICB7Ci0JCSAgICBpZiAoc3RyY21wIChpcy0+dGhlX2JmZC0+ZmlsZW5hbWUsIGlzMi0+dGhlX2JmZC0+ZmlsZW5hbWUpKQotCQkgICAgICBpc19tc19hcmNoID0gMDsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChpc19tc19hcmNoKQotCSAgICAgIHsKLQkJaW50IGlkYXRhMiA9IDAsIHJlbG9jX2NvdW50PTA7Ci0JCWFzZWN0aW9uICpzZWM7Ci0JCWNoYXIgKm5ld19uYW1lLCBzZXE7Ci0KLQkJZm9yIChzZWMgPSBpcy0+dGhlX2JmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotCQkgIHsKLQkJICAgIGlmIChzdHJjbXAgKHNlYy0+bmFtZSwgIi5pZGF0YVwkMiIpID09IDApCi0JCSAgICAgIGlkYXRhMiA9IDE7Ci0JCSAgICByZWxvY19jb3VudCArPSBzZWMtPnJlbG9jX2NvdW50OwotCQkgIH0KLQotCQlpZiAoaWRhdGEyKSAvKiAuaWRhdGEyIGlzIHRoZSBUT0MgKi8KLQkJICBzZXEgPSAnYSc7Ci0JCWVsc2UgaWYgKHJlbG9jX2NvdW50ID4gMCkgLyogdGh1bmtzICovCi0JCSAgc2VxID0gJ2InOwotCQllbHNlIC8qIHNlbnRpbmVsICovCi0JCSAgc2VxID0gJ2MnOwotCi0JCW5ld19uYW1lID0geG1hbGxvYyAoc3RybGVuIChpcy0+dGhlX2JmZC0+ZmlsZW5hbWUpICsgMyk7Ci0JCXNwcmludGYgKG5ld19uYW1lLCAiJXMuJWMiLCBpcy0+dGhlX2JmZC0+ZmlsZW5hbWUsIHNlcSk7Ci0JCWlzLT50aGVfYmZkLT5maWxlbmFtZSA9IG5ld19uYW1lOwotCi0JCW5ld19uYW1lID0geG1hbGxvYyAoc3RybGVuKGlzLT5maWxlbmFtZSkgKyAzKTsKLQkJc3ByaW50ZiAobmV3X25hbWUsICIlcy4lYyIsIGlzLT5maWxlbmFtZSwgc2VxKTsKLQkJaXMtPmZpbGVuYW1lID0gbmV3X25hbWU7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci19Ci0MCi1zdGF0aWMgdm9pZCAgCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24oKQotewotI2lmZGVmIFRBUkdFVF9JU19wcGNwZQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IHRvYyBpbmZvcm1hdGlvbiAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGlzLT50aGVfYmZkLCAmbGlua19pbmZvKSkKLQkgIHsKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXNcbiIpLCBpcy0+ZmlsZW5hbWUpOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLwotICBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gKCZsaW5rX2luZm8pOwotI2VuZGlmIC8qIFRBUkdFVF9JU19wcGNwZSAqLwotCi0jaWYgZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKQotICAvKiBGSVhNRTogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YgotICAgICBzZWN0aW9uLgotCi0gICAgIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgZ2x1ZQotICAgICBpbmZvcm1hdGlvbi4gIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZQotICAgICBvcHRpb24/ICBrcmtAY3lnbnVzLmNvbSAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghIGJmZF9hcm1fcGVfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCSAgICAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvLCBzdXBwb3J0X29sZF9jb2RlKSkKLQkgIHsKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMgZm9yIGludGVyd29ya2luZyIpLAotCQkgICBpcy0+ZmlsZW5hbWUpOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLwotICBiZmRfYXJtX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoJiBsaW5rX2luZm8pOwotI2VuZGlmIC8qIFRBUkdFVF9JU19hcm1wZSAqLwotfQotDAotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGZpbGUgaXNuJ3QgcmVjb2duaXplZCBhcyBhIEJGRC4gIFdlCi0gICBjaGVjayBoZXJlIGZvciAuREVGIGZpbGVzIGFuZCBwdWxsIHRoZW0gaW4gYXV0b21hdGljYWxseS4gKi8KLSNpZmRlZiBETExfU1VQUE9SVAotc3RhdGljIGludAotc2F3X29wdGlvbihjaGFyICpvcHRpb24pCi17Ci0gIGludCBpOwotICBmb3IgKGk9MDsgaW5pdFtpXS5wdHI7IGkrKykKLSAgICBpZiAoc3RyY21wIChpbml0W2ldLnN5bWJvbCwgb3B0aW9uKSA9PSAwKQotICAgICAgcmV0dXJuIGluaXRbaV0uaW5pdGVkOwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIERMTF9TVVBQT1JUCi0gIGNvbnN0IGNoYXIgKmV4dCA9IGVudHJ5LT5maWxlbmFtZSArIHN0cmxlbiAoZW50cnktPmZpbGVuYW1lKSAtIDQ7Ci0KLSAgaWYgKHN0cmNtcCAoZXh0LCAiLmRlZiIpID09IDAgfHwgc3RyY21wIChleHQsICIuREVGIikgPT0gMCkKLSAgewotICAgIGlmIChwZV9kZWZfZmlsZSA9PSAwKQotICAgICAgcGVfZGVmX2ZpbGUgPSBkZWZfZmlsZV9lbXB0eSAoKTsKLSAgICBkZWZfZmlsZV9wYXJzZSAoZW50cnktPmZpbGVuYW1lLCBwZV9kZWZfZmlsZSk7Ci0gICAgaWYgKHBlX2RlZl9maWxlKQotICAgIHsKLSAgICAgIGludCBpLCBidWZsZW49MCwgbGVuOwotICAgICAgY2hhciAqYnVmOwotICAgICAgZm9yIChpPTA7IGk8cGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzOyBpKyspCi0JewotCSAgbGVuID0gc3RybGVuKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCSAgaWYgKGJ1ZmxlbiA8IGxlbisyKQotCSAgICBidWZsZW4gPSBsZW4rMjsKLQl9Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChidWZsZW4pOwotICAgICAgZm9yIChpPTA7IGk8cGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzOyBpKyspCi0JewotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICBzcHJpbnRmKGJ1ZiwgIl8lcyIsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCi0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBidWYsIHRydWUsIHRydWUsIHRydWUpOwotCSAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgewotCSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgICAgICBoLT51LnVuZGVmLmFiZmQgPSBOVUxMOwotCSAgICAgIGJmZF9saW5rX2FkZF91bmRlZiAobGlua19pbmZvLmhhc2gsIGgpOwotCSAgICB9Ci0JfQotICAgICAgZnJlZSAoYnVmKTsKLQotICAgICAgLyogZGVmX2ZpbGVfcHJpbnQgKHN0ZG91dCwgcGVfZGVmX2ZpbGUpOyAqLwotICAgICAgaWYgKHBlX2RlZl9maWxlLT5pc19kbGwgPT0gMSkKLQlsaW5rX2luZm8uc2hhcmVkID0gMTsKLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5iYXNlX2FkZHJlc3MgIT0gKGJmZF92bWEpKC0xKSkKLSAgICAgIHsKLQlwZS5JbWFnZUJhc2UgPQotCXBlX2RhdGEgKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlID0KLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBwZV9kZWZfZmlsZS0+YmFzZV9hZGRyZXNzOwotCWluaXRbSU1BR0VCQVNFT0ZGXS5pbml0ZWQgPSAxOwotCWlmIChpbWFnZV9iYXNlX3N0YXRlbWVudCkKLQkgIGltYWdlX2Jhc2Vfc3RhdGVtZW50LT5leHAgPQotCSAgICBleHBfYXNzb3AgKCc9JywgIl9faW1hZ2VfYmFzZV9fIiwgZXhwX2ludG9wIChwZS5JbWFnZUJhc2UpKTsKLSAgICAgIH0KLQotI2lmIDAKLSAgICAgIC8qIE5vdCBzdXJlIGlmIHRoZXNlICpzaG91bGQqIGJlIHNldCAqLwotICAgICAgaWYgKHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yICE9IC0xKQotICAgICAgewotCXBlLk1ham9ySW1hZ2VWZXJzaW9uID0gcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3I7Ci0JcGUuTWlub3JJbWFnZVZlcnNpb24gPSBwZV9kZWZfZmlsZS0+dmVyc2lvbl9taW5vcjsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgaWYgKHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlICE9IC0xCi0JICAmJiAhIHNhd19vcHRpb24gKCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIikpCi0gICAgICB7Ci0JcGUuU2l6ZU9mU3RhY2tSZXNlcnZlID0gcGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmU7Ci0JaWYgKHBlX2RlZl9maWxlLT5zdGFja19jb21taXQgIT0gLTEpCi0JICBwZS5TaXplT2ZTdGFja0NvbW1pdCA9IHBlX2RlZl9maWxlLT5zdGFja19jb21taXQ7Ci0gICAgICB9Ci0gICAgICBpZiAocGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSAhPSAtMQotCSAgJiYgISBzYXdfb3B0aW9uICgiX19zaXplX29mX2hlYXBfcmVzZXJ2ZV9fIikpCi0gICAgICB7Ci0JcGUuU2l6ZU9mSGVhcFJlc2VydmUgPSBwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlOwotCWlmIChwZV9kZWZfZmlsZS0+aGVhcF9jb21taXQgIT0gLTEpCi0JICBwZS5TaXplT2ZIZWFwQ29tbWl0ID0gcGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0OwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotICAKLX0KLQotc3RhdGljIGJvb2xlYW4KLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9yZWNvZ25pemVkX2ZpbGUoZW50cnkpCi0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgRExMX1NVUFBPUlQKLSNpZmRlZiBUQVJHRVRfSVNfaTM4NnBlCi0gIHBlX2RsbF9pZF90YXJnZXQgKCJwZWktaTM4NiIpOwotI2VuZGlmCi0jaWZkZWYgVEFSR0VUX0lTX3NocGUKLSAgcGVfZGxsX2lkX3RhcmdldCAoInBlaS1zaGwiKTsKLSNlbmRpZgotI2lmZGVmIFRBUkdFVF9JU19taXBzcGUKLSAgcGVfZGxsX2lkX3RhcmdldCAoInBlaS1taXBzIik7Ci0jZW5kaWYKLSNpZmRlZiBUQVJHRVRfSVNfYXJtcGUKLSAgcGVfZGxsX2lkX3RhcmdldCAoInBlaS1hcm0tbGl0dGxlIik7Ci0jZW5kaWYKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCkgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpleHQgPSBlbnRyeS0+ZmlsZW5hbWUgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkgLSA0OwotICAgICAgaWYgKHN0cmNtcCAoZXh0LCAiLmRsbCIpID09IDAgfHwgc3RyY21wIChleHQsICIuRExMIikgPT0gMCkKLQlyZXR1cm4gcGVfaW1wbGllZF9pbXBvcnRfZGxsIChlbnRyeS0+ZmlsZW5hbWUpOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoICgpCi17Ci0jaWYgZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKQotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLSAgaWYgKHRodW1iX2VudHJ5X3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHRodW1iX2VudHJ5X3N5bWJvbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIAotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBzdGF0aWMgY2hhciBidWZmZXJbMzJdOwotCSAgYmZkX3ZtYSB2YWw7Ci0JICAKLQkgIC8qIFNwZWNpYWwgcHJvY2VzaW5nIGlzIHJlcXVpcmVkIGZvciBhIFRodW1iIGVudHJ5IHN5bWJvbC4gIFRoZQotCSAgICAgYm90dG9tIGJpdCBvZiBpdHMgYWRkcmVzcyBtdXN0IGJlIHNldC4gICovCi0JICB2YWwgPSAoaC0+dS5kZWYudmFsdWUKLQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkJaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgCi0JICB2YWwgfD0gMTsKLQkgIAotCSAgLyogTm93IGNvbnZlcnQgdGhpcyB2YWx1ZSBpbnRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiBlbnRyeV9zeW1ib2wKLQkgICAgIHdoZXJlIHRoZSBsYW5nX2ZpbmlzaCgpIGZ1bmN0aW9uIHdpbGwgcGljayBpdCB1cC4gICovCi0JICBidWZmZXJbMF0gPSAnMCc7Ci0JICBidWZmZXJbMV0gPSAneCc7Ci0JICAKLQkgIHNwcmludGZfdm1hIChidWZmZXIgKyAyLCB2YWwpOwotCSAgCi0JICBpZiAoZW50cnlfc3ltYm9sICE9IE5VTEwgJiYgZW50cnlfZnJvbV9jbWRsaW5lKQotCSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICctLXRodW1iLWVudHJ5ICVzJyBpcyBvdmVycmlkaW5nICctZSAlcydcbiIpLAotCQkgICB0aHVtYl9lbnRyeV9zeW1ib2wsIGVudHJ5X3N5bWJvbCk7Ci0JICBlbnRyeV9zeW1ib2wgPSBidWZmZXI7Ci0JfQotICAgICAgZWxzZQotCWVpbmZvIChfKCIlUDogd2FybmluZzogY29ubm90IGZpbmQgdGh1bWIgc3RhcnQgc3ltYm9sICVzXG4iKSwgdGh1bWJfZW50cnlfc3ltYm9sKTsKLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKSAqLwotCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgewotICAgICAgcGVfZGxsX2ZpbGxfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICAgICAgaWYgKHBlX2ltcGxpYl9maWxlbmFtZSkKLQlwZV9kbGxfZ2VuZXJhdGVfaW1wbGliIChwZV9kZWZfZmlsZSwgcGVfaW1wbGliX2ZpbGVuYW1lKTsKLSAgICB9Ci0jaWYgZGVmaW5lZChUQVJHRVRfSVNfc2hwZSkgfHwgZGVmaW5lZChUQVJHRVRfSVNfbWlwc3BlKQotICBlbHNlCi0gICAgewotICAgICAgcGVfZXhlX2ZpbGxfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICAgIH0KLSNlbmRpZgotICAKLSAgaWYgKHBlX291dF9kZWZfZmlsZW5hbWUpCi0gICAgcGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlIChwZV9vdXRfZGVmX2ZpbGVuYW1lKTsKLSNlbmRpZgotfQotCi0MCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4KLQotICAgV2UgdXNlIHRoaXMgdG8gcHV0IHNlY3Rpb25zIGluIGEgcmVhc29uYWJsZSBwbGFjZSBpbiB0aGUgZmlsZSwgYW5kCi0gICB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSBhbGlnbmVkIGFzIHJlcXVpcmVkLgotCi0gICBXZSBoYW5kbGUgZ3JvdXBlZCBzZWN0aW9ucyBoZXJlIGFzIHdlbGwuICBBIHNlY3Rpb24gbmFtZWQgLmZvbyRubgotICAgZ29lcyBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiAuZm9vLiAgQWxsIGdyb3VwZWQgc2VjdGlvbnMgYXJlIHNvcnRlZAotICAgYnkgbmFtZS4KLQotICAgR3JvdXBlZCBzZWN0aW9ucyBmb3IgdGhlIGRlZmF1bHQgc2VjdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlCi0gICBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNpbmcgd2lsZGNhcmRzLCBhbmQgYXJlIHNvcnRlZCBieQotICAgc29ydF9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqaG9sZF9zZWN0aW9uOwotc3RhdGljIGNoYXIgKmhvbGRfc2VjdGlvbl9uYW1lOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdXNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdGV4dDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JkYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2JzczsKLQotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgcmFuZG9tIFNIRl9BTExPQwotICAgc2VjdGlvbnMgaW4gdGhlIHJpZ2h0IHNlZ21lbnQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgY2hhciAqZG9sbGFyID0gTlVMTDsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLQotICBob2xkX3NlY3Rpb24gPSBzOwotCi0gIGhvbGRfc2VjdGlvbl9uYW1lID0geHN0cmR1cCAoc2VjbmFtZSk7Ci0gIGlmICghbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBkb2xsYXIgPSBzdHJjaHIgKGhvbGRfc2VjdGlvbl9uYW1lLCAnJCcpOwotICAgICAgaWYgKGRvbGxhciAhPSBOVUxMKQotCSpkb2xsYXIgPSAnXDAnOwotICAgIH0KLQotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgICAgIGNoYXIgKm91dHNlY25hbWU7Ci0gICAgICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gICAgICBldHJlZV90eXBlICphZGRyZXNzOwotCi0gICAgICAvKiBUcnkgdG8gcHV0IHRoZSBuZXcgb3V0cHV0IHNlY3Rpb24gaW4gYSByZWFzb25hYmxlIHBsYWNlIGJhc2VkCi0JIG9uIHRoZSBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICAqLwotICAgICAgcGxhY2UgPSBOVUxMOwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICYmIGhvbGRfYnNzICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX2JzczsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICAgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLQlwbGFjZSA9IGhvbGRfZGF0YTsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgICAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICAgICAmJiBob2xkX3JkYXRhICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX3JkYXRhOwotICAgICAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotCXBsYWNlID0gaG9sZF90ZXh0OwotCi0gICAgICAvKiBDaG9vc2UgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlY3Rpb24uICBUaGlzIHdpbGwgYmUgbmVlZGVkIGlmCi0JIHRoZSBzYW1lIHNlY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBpbnB1dCBmaWxlIHdpdGgKLQkgZGlmZmVyZW50IGxvYWRhYmxlIG9yIGFsbG9jYXRlYWJsZSBjaGFyYWN0ZXJpc3RpY3MuICAqLwotICAgICAgb3V0c2VjbmFtZSA9IHhzdHJkdXAgKGhvbGRfc2VjdGlvbl9uYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSkgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgY2hhciAqbmV3bmFtZTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBsZW4gPSBzdHJsZW4gKG91dHNlY25hbWUpOwotCSAgbmV3bmFtZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotCSAgc3RyY3B5IChuZXduYW1lLCBvdXRzZWNuYW1lKTsKLQkgIGkgPSAwOwotCSAgZG8KLQkgICAgewotCSAgICAgIHNwcmludGYgKG5ld25hbWUgKyBsZW4sICIlZCIsIGkpOwotCSAgICAgICsraTsKLQkgICAgfQotCSAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKLQotCSAgZnJlZSAob3V0c2VjbmFtZSk7Ci0JICBvdXRzZWNuYW1lID0gbmV3bmFtZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gZnJlZSBPVVRTRUNOQU1FLCBhcyBpdCBtYXkgZ2V0IGF0dGFjaGVkIHRvCi0JIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnQuICAqLwotCi0gICAgICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZQotCSByaWdodCBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sKLQkgbmVhdGVyLiAgKi8KLSAgICAgIHNuZXcgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKTsKLSAgICAgIGlmIChzbmV3ID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIsCi0JICAgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOwotICAgICAgaWYgKHBsYWNlICE9IE5VTEwgJiYgcGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQkgICAgOwotCSAgKnBwcyA9IHNuZXctPm5leHQ7Ci0JICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotCSAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLQl9Ci0KLSAgICAgIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgb2xkID0gc3RhdF9wdHI7Ci0gICAgICBzdGF0X3B0ciA9ICZhZGQ7Ci0gICAgICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlhZGRyZXNzID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBbGwgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gYSBwYWdlCi0JICAgICBib3VuZGFyeS4gICovCi0JICBhZGRyZXNzID0gZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiX19zZWN0aW9uX2FsaWdubWVudF9fIikpOwotCX0KLQotICAgICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJCSAgIChiZmRfdm1hKSAwLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICAgICAgaG9sZF91c2UgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHNlY25hbWUpOwotCi0gICAgICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotCSgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIsCi0JIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCwKLQkiKmRlZmF1bHQqIik7Ci0KLSAgICAgIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgICAgIGlmIChwbGFjZSAhPSBOVUxMKQotCXsKLQkgICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLQkgIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOwotCX0KLQotICAgICAgc3RhdF9wdHIgPSBvbGQ7Ci0gICAgfQotCi0gIGlmIChkb2xsYXIgPT0gTlVMTCkKLSAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwbDsKLSAgICAgIGJvb2xlYW4gZm91bmRfZG9sbGFyOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGxpc3Q7Ci0KLSAgICAgIC8qIFRoZSBzZWN0aW9uIG5hbWUgaGFzIGEgJyQnLiAgU29ydCBpdCB3aXRoIHRoZSBvdGhlciAnJCcKLSAgICAgICAgIHNlY3Rpb25zLiAgKi8KLQotICAgICAgZm91bmRfZG9sbGFyID0gZmFsc2U7Ci0gICAgICBmb3IgKHBsID0gJmhvbGRfdXNlLT5jaGlsZHJlbi5oZWFkOyAqcGwgIT0gTlVMTDsgcGwgPSAmKCpwbCktPm5leHQpCi0JewotCSAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmxzOwotCSAgY29uc3QgY2hhciAqbG5hbWU7Ci0KLQkgIGlmICgoKnBsKS0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBscyA9ICYoKnBsKS0+aW5wdXRfc2VjdGlvbjsKLQotCSAgbG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobHMtPmlmaWxlLT50aGVfYmZkLCBscy0+c2VjdGlvbik7Ci0JICBpZiAoc3RyY2hyIChsbmFtZSwgJyQnKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGZvdW5kX2RvbGxhcikKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZvdW5kX2RvbGxhciA9IHRydWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjbmFtZSwgbG5hbWUpIDwgMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbGlzdCk7Ci0gICAgICB3aWxkX2RvaXQgKCZsaXN0LCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICBpZiAobGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgQVNTRVJUIChsaXN0LmhlYWQtPm5leHQgPT0gTlVMTCk7Ci0JICBsaXN0LmhlYWQtPm5leHQgPSAqcGw7Ci0JICAqcGwgPSBsaXN0LmhlYWQ7Ci0JfQotICAgIH0KLQotICBmcmVlIChob2xkX3NlY3Rpb25fbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb25fbmFtZSkgPT0gMAotICAgICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmICgoaG9sZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICA9PSAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpKSkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJkYXRhIikgPT0gMCkKLSAgICBob2xkX3JkYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotfQotCi1zdGF0aWMgaW50Ci1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzIChuYW1lLCBlbnRyeSkKLSAgICAgY2hhciAqIG5hbWU7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiBlbnRyeTsKLXsKLSAgcmV0dXJuIGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoIChuYW1lLCBlbnRyeSwgIiIsICIubGliIik7Ci19Ci0MCi1zdGF0aWMgY2hhciAqCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZSwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3JlY29nbml6ZWRfZmlsZSwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfcG90ZW50aWFsX2xpYnJhcmllcwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3N1bm9zLmVtIGIvbGQvZW11bHRlbXBsL3N1bm9zLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTcxYjZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9zdW5vcy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDMgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBTdW5PUyBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi0jaWZkZWYgSEFWRV9ESVJFTlRfSAotIyBpbmNsdWRlIDxkaXJlbnQuaD4KLSNlbHNlCi0jIGRlZmluZSBkaXJlbnQgZGlyZWN0Ci0jIGlmZGVmIEhBVkVfU1lTX05ESVJfSAotIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9TWVNfRElSX0gKLSMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9ORElSX0gKLSMgIGluY2x1ZGUgPG5kaXIuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMKLSAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbwotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NvdW50X25lZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfbmVlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotICBjb25maWcuaGFzX3NoYXJlZCA9IHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQsCi0gICBidXQgYmVmb3JlIHRoZSBsaW5rZXIgc2NyaXB0IGhhcyBiZWVuIHJlYWQuICBJZiB0aGlzIGlzIGEgbmF0aXZlCi0gICBsaW5rZXIsIHdlIGFkZCB0aGUgZGlyZWN0b3JpZXMgaW4gTERfTElCUkFSWV9QQVRIIHRvIHRoZSBzZWFyY2gKLSAgIGxpc3QuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgKCkKLXsKLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgY29uc3QgY2hhciAqZW52OwotCi0gIGVudiA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpOwotICBpZiAoZW52ICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqbDsKLQotICAgICAgbCA9IHhzdHJkdXAgKGVudik7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBjaGFyICpjOwotCi0JICBjID0gc3RyY2hyIChsLCAnOicpOwotCSAgaWYgKGMgIT0gTlVMTCkKLQkgICAgKmMrKyA9ICdcMCc7Ci0JICBpZiAoKmwgIT0gJ1wwJykKLQkgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGwsIGZhbHNlKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgbCA9IGM7Ci0JfQotICAgIH0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLX0KLQotLyogRGVzcGl0ZSB0aGUgbmFtZSwgd2UgdXNlIHRoaXMgcm91dGluZSB0byBzZWFyY2ggZm9yIGR5bmFtaWMKLSAgIGxpYnJhcmllcy4gIE9uIFN1bk9TIHRoaXMgcmVxdWlyZXMgYSBkaXJlY3Rvcnkgc2VhcmNoLiAgV2UgbmVlZCB0bwotICAgZmluZCB0aGUgLnNvIGZpbGUgd2l0aCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlci4gIFRoZSB1c2VyIG1heQotICAgcmVzdHJpY3QgdGhlIG1ham9yIHZlcnNpb24gYnkgc2F5aW5nLCBlLmcuLCAtbGMuMS4gIEFsc28sIGlmIHdlCi0gICBmaW5kIGEgLnNvIGZpbGUsIHdlIG5lZWQgdG8gbG9vayBmb3IgYSB0aGUgc2FtZSBmaWxlIGFmdGVyCi0gICByZXBsYWNpbmcgLnNvIHdpdGggLnNhOyBpZiBpdCBleGlzdHMsIGl0IHdpbGwgYmUgYW4gYXJjaGl2ZSB3aGljaAotICAgcHJvdmlkZSBzb21lIGluaXRpYWxpemF0aW9ucyBmb3IgZGF0YSBzeW1ib2xzLCBhbmQgd2UgbmVlZCB0bwotICAgc2VhcmNoIGl0IGFmdGVyIGluY2x1ZGluZyB0aGUgLnNvIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCkKLXsKLSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTsKLX0KLQotLyogU2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIGEgLnNvIGZpbGUgZm9yIGVhY2ggbGlicmFyeSBzZWFyY2guICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyAoaW5wKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppbnA7Ci17Ci0gIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgY2hhciAqZm91bmQgPSBOVUxMOwotICBjaGFyICphbGM7Ci0gIHN0cnVjdCBzdGF0IHN0OwotCi0gIGlmICghIGlucC0+c2VhcmNoX2RpcnNfZmxhZwotICAgICAgfHwgISBpbnAtPmlzX2FyY2hpdmUKLSAgICAgIHx8ICEgaW5wLT5keW5hbWljKQotICAgIHJldHVybjsKLQotICBBU1NFUlQgKHN0cm5jbXAgKGlucC0+bG9jYWxfc3ltX25hbWUsICItbCIsIDIpID09IDApOwotCi0gIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0gICAgewotICAgICAgYm9vbGVhbiBmb3VuZF9zdGF0aWM7Ci0KLSAgICAgIGZvdW5kID0gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2RpciAoc2VhcmNoLT5uYW1lLCBpbnAtPmZpbGVuYW1lLAotCQkJCQkgICAgICAgJmZvdW5kX3N0YXRpYyk7Ci0gICAgICBpZiAoZm91bmQgIT0gTlVMTCB8fCBmb3VuZF9zdGF0aWMpCi0JYnJlYWs7Ci0gICAgfQotCi0gIGlmIChmb3VuZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGRpZCBub3QgZmluZCBhIG1hdGNoaW5nIC5zbyBmaWxlLiAgVGhpcyBpc24ndCBhbiBlcnJvciwKLQkgc2luY2UgdGhlcmUgbWlnaHQgc3RpbGwgYmUgYSBtYXRjaGluZyAuYSBmaWxlLCB3aGljaCB3aWxsIGJlCi0JIGZvdW5kIGJ5IHRoZSB1c3VhbCBzZWFyY2guICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBSZXBsYWNlIHRoZSBmaWxlbmFtZSB3aXRoIHRoZSBvbmUgd2UgaGF2ZSBmb3VuZC4gICovCi0gIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKSArIHN0cmxlbiAoZm91bmQpICsgMik7Ci0gIHNwcmludGYgKGFsYywgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBmb3VuZCk7Ci0gIGlucC0+ZmlsZW5hbWUgPSBhbGM7Ci0KLSAgLyogVHVybiBvZmYgdGhlIHNlYXJjaF9kaXJzX2ZsYWcgdG8gcHJldmVudCBsZGZpbGVfb3Blbl9maWxlIGZyb20KLSAgICAgc2VhcmNoaW5nIGZvciB0aGlzIGZpbGUgYWdhaW4uICAqLwotICBpbnAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKLQotICBmcmVlIChmb3VuZCk7Ci0KLSAgLyogTm93IGxvb2sgZm9yIHRoZSBzYW1lIGZpbGUgbmFtZSwgYnV0IHdpdGggLnNhIGluc3RlYWQgb2YgLnNvLiAgSWYKLSAgICAgZm91bmQsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBpbnB1dCBmaWxlcy4gICovCi0gIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5wLT5maWxlbmFtZSkgKyAxKTsKLSAgc3RyY3B5IChhbGMsIGlucC0+ZmlsZW5hbWUpOwotICBzdHJzdHIgKGFsYyArIHN0cmxlbiAoc2VhcmNoLT5uYW1lKSwgIi5zbyIpWzJdID0gJ2EnOwotICBpZiAoc3RhdCAoYWxjLCAmc3QpICE9IDApCi0gICAgZnJlZSAoYWxjKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnNhOwotCi0gICAgICAvKiBBZGQgdGhlIC5zYSBmaWxlIHRvIHRoZSBzdGF0ZW1lbnQgbGlzdCBqdXN0IGJlZm9yZSB0aGUgLnNvCi0JIGZpbGUuICBUaGlzIGlzIHJlYWxseSBhIGhhY2suICAqLwotICAgICAgc2EgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKLQkgICAgeG1hbGxvYyAoc2l6ZW9mIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKSkpOwotICAgICAgKnNhID0gKmlucDsKLQotICAgICAgaW5wLT5maWxlbmFtZSA9IGFsYzsKLSAgICAgIGlucC0+bG9jYWxfc3ltX25hbWUgPSBhbGM7Ci0KLSAgICAgIGlucC0+aGVhZGVyLm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBzYTsKLSAgICAgIGlucC0+bmV4dF9yZWFsX2ZpbGUgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBzYTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBhIGRpcmVjdG9yeSBmb3IgYSAuc28gZmlsZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIgKGRpcm5hbWUsIGZpbGVuYW1lLCBmb3VuZF9zdGF0aWMpCi0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBib29sZWFuICpmb3VuZF9zdGF0aWM7Ci17Ci0gIGludCBmb3JjZV9tYWosIGZvcmNlX21pbjsKLSAgY29uc3QgY2hhciAqZG90OwotICB1bnNpZ25lZCBpbnQgbGVuOwotICBjaGFyICphbGM7Ci0gIGNoYXIgKmZvdW5kOwotICBpbnQgbWF4X21haiwgbWF4X21pbjsKLSAgRElSICpkaXI7Ci0gIHN0cnVjdCBkaXJlbnQgKmVudHJ5OwotICB1bnNpZ25lZCBpbnQgZGlybmFtZWxlbjsKLSAgY2hhciAqZnVsbF9wYXRoOwotICBpbnQgc3RhdHZhbDsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgKmZvdW5kX3N0YXRpYyA9IGZhbHNlOwotCi0gIGZvcmNlX21haiA9IC0xOwotICBmb3JjZV9taW4gPSAtMTsKLSAgZG90ID0gc3RyY2hyIChmaWxlbmFtZSwgJy4nKTsKLSAgaWYgKGRvdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxlbiA9IHN0cmxlbiAoZmlsZW5hbWUpOwotICAgICAgYWxjID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3JjZV9tYWogPSBhdG9pIChkb3QgKyAxKTsKLQotICAgICAgbGVuID0gZG90IC0gZmlsZW5hbWU7Ci0gICAgICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cm5jcHkgKGFsYywgZmlsZW5hbWUsIGxlbik7Ci0gICAgICBhbGNbbGVuXSA9ICdcMCc7Ci0gICAgICBmaWxlbmFtZSA9IGFsYzsKLQotICAgICAgZG90ID0gc3RyY2hyIChkb3QgKyAxLCAnLicpOwotICAgICAgaWYgKGRvdCAhPSBOVUxMKQotCWZvcmNlX21pbiA9IGF0b2kgKGRvdCArIDEpOwotICAgIH0KLQotICBmb3VuZCA9IE5VTEw7Ci0gIG1heF9tYWogPSBtYXhfbWluID0gMDsKLQotICBkaXIgPSBvcGVuZGlyIChkaXJuYW1lKTsKLSAgaWYgKGRpciA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBkaXJuYW1lbGVuID0gc3RybGVuIChkaXJuYW1lKTsKLSAgCi0gIHdoaWxlICgoZW50cnkgPSByZWFkZGlyIChkaXIpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgICBpbnQgZm91bmRfbWFqLCBmb3VuZF9taW47Ci0KLSAgICAgIGlmIChzdHJuY21wIChlbnRyeS0+ZF9uYW1lLCAibGliIiwgMykgIT0gMAotCSAgfHwgc3RybmNtcCAoZW50cnktPmRfbmFtZSArIDMsIGZpbGVuYW1lLCBsZW4pICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChkb3QgPT0gTlVMTAotCSAgJiYgc3RyY21wIChlbnRyeS0+ZF9uYW1lICsgMyArIGxlbiwgIi5hIikgPT0gMCkKLQl7Ci0JICAqZm91bmRfc3RhdGljID0gdHJ1ZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgYWNjZXB0IGxpYmZvby5zbyB3aXRob3V0IGEgdmVyc2lvbiBudW1iZXIsIGV2ZW4gdGhvdWdoIHRoZQotICAgICAgICAgbmF0aXZlIGxpbmtlciBkb2VzIG5vdC4gIFRoaXMgaXMgbW9yZSBjb252ZW5pZW50IGZvciBwYWNrYWdlcwotICAgICAgICAgd2hpY2gganVzdCBnZW5lcmF0ZSAuc28gZmlsZXMgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIGFzIG9uIEVMRgotICAgICAgICAgc3lzdGVtcy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoZW50cnktPmRfbmFtZSArIDMgKyBsZW4sICIuc28iLCAzKSAhPSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGVudHJ5LT5kX25hbWVbNiArIGxlbl0gPT0gJ1wwJykKLQk7Ci0gICAgICBlbHNlIGlmIChlbnRyeS0+ZF9uYW1lWzYgKyBsZW5dID09ICcuJwotCSAgICAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgZW50cnktPmRfbmFtZVs3ICsgbGVuXSkpCi0JOwotICAgICAgZWxzZQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKHMgPSBlbnRyeS0+ZF9uYW1lICsgNiArIGxlbjsgKnMgIT0gJ1wwJzsgcysrKQotCWlmICgqcyAhPSAnLicgJiYgISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoKnMgIT0gJ1wwJykKLQljb250aW51ZTsKLQotICAgICAgLyogV2UndmUgZm91bmQgYSAuc28gZmlsZS4gIFdvcmsgb3V0IHRoZSBtYWpvciBhbmQgbWlub3IKLQkgdmVyc2lvbiBudW1iZXJzLiAgKi8KLSAgICAgIGZvdW5kX21haiA9IDA7Ci0gICAgICBmb3VuZF9taW4gPSAwOwotICAgICAgc3NjYW5mIChlbnRyeS0+ZF9uYW1lICsgMyArIGxlbiwgIi5zby4lZC4lZCIsCi0JICAgICAgJmZvdW5kX21haiwgJmZvdW5kX21pbik7Ci0KLSAgICAgIGlmICgoZm9yY2VfbWFqICE9IC0xICYmIGZvcmNlX21haiAhPSBmb3VuZF9tYWopCi0JICB8fCAoZm9yY2VfbWluICE9IC0xICYmIGZvcmNlX21pbiAhPSBmb3VuZF9taW4pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGZpbGUgcmVhbGx5IGV4aXN0cyAoaWdub3JlIGJyb2tlbiBzeW1saW5rcykuICAqLwotICAgICAgZnVsbF9wYXRoID0geG1hbGxvYyAoZGlybmFtZWxlbiArIDEgKyBzdHJsZW4gKGVudHJ5LT5kX25hbWUpICsgMSk7Ci0gICAgICBzcHJpbnRmIChmdWxsX3BhdGgsICIlcy8lcyIsIGRpcm5hbWUsIGVudHJ5LT5kX25hbWUpOwotICAgICAgc3RhdHZhbCA9IHN0YXQgKGZ1bGxfcGF0aCwgJnN0KTsKLSAgICAgIGZyZWUgKGZ1bGxfcGF0aCk7Ci0gICAgICBpZiAoc3RhdHZhbCAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSd2ZSBmb3VuZCBhIG1hdGNoIGZvciB0aGUgbmFtZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gIFNlZQotCSBpZiB0aGlzIGlzIHRoZSB2ZXJzaW9uIHdlIHNob3VsZCB1c2UuICBJZiB0aGUgbWFqb3IgYW5kIG1pbm9yCi0JIHZlcnNpb25zIG1hdGNoLCB3ZSB1c2UgdGhlIGxhc3QgZW50cnkgaW4gYWxwaGFiZXRpY2FsIG9yZGVyOwotCSBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBob3cgU3VuT1MgZGlzdGluZ3Vpc2hlcyBsaWJjLnNvLjEuOAotCSBmcm9tIGxpYmMuc28uMS44LjEsIGJ1dCBpdCBvdWdodCB0byBzdWZmaWNlLiAgKi8KLSAgICAgIGlmIChmb3VuZCA9PSBOVUxMCi0JICB8fCAoZm91bmRfbWFqID4gbWF4X21haikKLQkgIHx8IChmb3VuZF9tYWogPT0gbWF4X21hagotCSAgICAgICYmIChmb3VuZF9taW4gPiBtYXhfbWluCi0JCSAgfHwgKGZvdW5kX21pbiA9PSBtYXhfbWluCi0JCSAgICAgICYmIHN0cmNtcCAoZW50cnktPmRfbmFtZSwgZm91bmQpID4gMCkpKSkKLQl7Ci0JICBpZiAoZm91bmQgIT0gTlVMTCkKLQkgICAgZnJlZSAoZm91bmQpOwotCSAgZm91bmQgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGVudHJ5LT5kX25hbWUpICsgMSk7Ci0JICBzdHJjcHkgKGZvdW5kLCBlbnRyeS0+ZF9uYW1lKTsKLQkgIG1heF9tYWogPSBmb3VuZF9tYWo7Ci0JICBtYXhfbWluID0gZm91bmRfbWluOwotCX0KLSAgICB9Ci0KLSAgY2xvc2VkaXIgKGRpcik7Ci0KLSAgaWYgKGFsYyAhPSBOVUxMKQotICAgIGZyZWUgKGFsYyk7Ci0KLSAgcmV0dXJuIGZvdW5kOwotfQotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlcXVpcmVkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmFjayBhbmQgZm9ydGgKLSAgIGJldHdlZW4gYWZ0ZXJfb3BlbiBhbmQgY2hlY2tfbmVlZGVkLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICpsOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIHdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFwcGVhciBpbiBsZF9uZWVkIGVudHJpZXMgaW4gZHluYW1pYwotICAgICBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgRm9yIGVhY2ggc3VjaCBmaWxlLCB3ZSB3YW50IHRvCi0gICAgIHRyYWNrIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcgbGlicmFyeSwgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbAotICAgICB0YWJsZSBpbiB0aGUgbGluay4gIFRoaXMgaXMgd2hhdCB0aGUgcnVudGltZSBkeW5hbWljIGxpbmtlciB3aWxsCi0gICAgIGRvLiAgVHJhY2tpbmcgdGhlIGZpbGVzIGRvd24gaGVyZSBwZXJtaXRzIG9uZSBkeW5hbWljIG9iamVjdCB0bwotICAgICBpbmNsdWRlIGFub3RoZXIgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbCBhY3Rpb24gYnkgdGhlIHBlcnNvbgotICAgICBkb2luZyB0aGUgbGluay4gIE5vdGUgdGhhdCB0aGUgbmVlZGVkIGxpc3QgY2FuIGFjdHVhbGx5IGdyb3cKLSAgICAgd2hpbGUgd2UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggdGhpcyBsb29wLiAgKi8KLSAgbmVlZGVkID0gYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgY29uc3QgY2hhciAqbG5hbWU7Ci0gICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLSAgICAgIGxuYW1lID0gbC0+bmFtZTsKLQotICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZmlsZSwgc2tpcCBpdC4gICovCi0gICAgICBmb3IgKGxsID0gbmVlZGVkOyBsbCAhPSBsOyBsbCA9IGxsLT5uZXh0KQotCWlmIChzdHJjbXAgKGxsLT5uYW1lLCBsbmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGxsICE9IGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkIGluIHRoZSBsaW5rIGV4cGxpY2l0bHkuICAqLwotICAgICAgZ2xvYmFsX25lZWRlZCA9IGw7Ci0gICAgICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTsKLSAgICAgIGlmIChnbG9iYWxfZm91bmQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChzdHJuY21wIChsbmFtZSwgIi1sIiwgMikgIT0gMCkKLQl7Ci0JICBiZmQgKmFiZmQ7Ci0KLQkgIGFiZmQgPSBiZmRfb3BlbnIgKGxuYW1lLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotCSAgaWYgKGFiZmQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotCQl7Ci0JCSAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JCSAgYWJmZCA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGFiZmQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0JCXsKLQkJICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLQkJICBhYmZkID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JICBpZiAoYWJmZCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgZm91bmQgdGhlIG5lZWRlZCBkeW5hbWljIG9iamVjdC4gICovCi0JICAgICAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotCQllaW5mbyAoIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iLCBhYmZkKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kXG4iLAotCQkgICAgIGxuYW1lLCBsLT5ieSk7Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBsbmFtZSArPSAyOwotCi0gICAgICAvKiBXZSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlCi0JIGR5bmFtaWMgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoIG9yIC1MLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiAoaWYgcnBhdGggd2FzIHVzZWQpIHRoZQotCSBsaW5rZXIgc2NyaXB0IExJQl9TRUFSQ0hfRElSUy4gICovCi0gICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmssCi0JCQkJCSAgICAgIGxuYW1lKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLQl7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoLCBsbmFtZSkpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoc2VhcmNoLT5uYW1lLCBsbmFtZSkpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgICAgIHsKLQljb25zdCBjaGFyICpsaWJfcGF0aDsKLQotCWxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7Ci0JaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsbmFtZSkpCi0JICBjb250aW51ZTsKLSAgICAgIH0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLQl7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKHNlYXJjaC0+bmFtZSwgbG5hbWUpKQotCQlicmVhazsKLQkgICAgfQotCSAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZFxuIiwKLQkgICAgIGwtPm5hbWUsIGwtPmJ5KTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBuZWVkZWQgZmlsZSBpbiBhIHBhdGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqczsKLQotICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpkaXI7Ci0gICAgICBjaGFyICpkaXJjb3B5OwotCi0gICAgICBzID0gc3RyY2hyIChwYXRoLCAnOicpOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICBkaXJjb3B5ID0gTlVMTDsKLQkgIGRpciA9IHBhdGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRpcmNvcHkgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIDEpOwotCSAgbWVtY3B5IChkaXJjb3B5LCBwYXRoLCBzIC0gcGF0aCk7Ci0JICBkaXJjb3B5W3MgLSBwYXRoXSA9ICdcMCc7Ci0JICBkaXIgPSBkaXJjb3B5OwotCX0KLQotICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGRpciwgbmFtZSkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGlmIChkaXJjb3B5ICE9IE5VTEwpCi0JZnJlZSAoZGlyY29weSk7Ci0KLSAgICAgIGlmIChzID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICBwYXRoID0gcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJICAKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggcG9zc2libGUgZGlyZWN0b3J5IGZvciBhIG5lZWRlZAotICAgZHluYW1pYyBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZGlyLCBuYW1lKQotICAgICBjb25zdCBjaGFyICpkaXI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIGNoYXIgKmFsYzsKLSAgYm9vbGVhbiBpZ25vcmU7Ci0gIGJmZCAqYWJmZDsKLQotICBmaWxlID0gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2RpciAoZGlyLCBuYW1lLCAmaWdub3JlKTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWxjID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChkaXIpICsgc3RybGVuIChmaWxlKSArIDIpOwotICBzcHJpbnRmIChhbGMsICIlcy8lcyIsIGRpciwgZmlsZSk7Ci0gIGZyZWUgKGZpbGUpOwotICBhYmZkID0gYmZkX29wZW5yIChhbGMsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGZvdW5kIHRoZSBuZWVkZWQgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIC8qIEFkZCB0aGlzIGZpbGUgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIsIGFiZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGEgbmVlZGVkIG9iamVjdCBpbiB0aGUgbGluay4gIFRoaXMKLSAgIGRvZXMgbm90IGhhdmUgdG8gYmUgcHJlY2lzZSwgYXMgaXQgZG9lcyBubyBoYXJtIHRvIGluY2x1ZGUgYQotICAgZHluYW1pYyBvYmplY3QgbW9yZSB0aGFuIG9uY2UuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBpZiAocy0+ZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChzdHJuY21wIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAiLWwiLCAyKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHMtPmZpbGVuYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCWdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc25hbWUsICpsbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnNkb3QsICpsZG90OwotICAgICAgaW50IGxtYWosIGxtaW4sIHNtYWosIHNtaW47Ci0KLSAgICAgIGxuYW1lID0gZ2xvYmFsX25lZWRlZC0+bmFtZSArIDI7Ci0KLSAgICAgIHNuYW1lID0gc3RycmNociAocy0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAoc25hbWUgPT0gTlVMTCkKLQlzbmFtZSA9IHMtPmZpbGVuYW1lOwotICAgICAgZWxzZQotCSsrc25hbWU7Ci0KLSAgICAgIGlmIChzdHJuY21wIChzbmFtZSwgImxpYiIsIDMpICE9IDApCi0JcmV0dXJuOwotICAgICAgc25hbWUgKz0gMzsKLQotICAgICAgbGRvdCA9IHN0cmNociAobG5hbWUsICcuJyk7Ci0gICAgICBpZiAobGRvdCA9PSBOVUxMKQotCWxkb3QgPSBsbmFtZSArIHN0cmxlbiAobG5hbWUpOwotCi0gICAgICBzZG90ID0gc3Ryc3RyIChzbmFtZSwgIi5zby4iKTsKLSAgICAgIGlmIChzZG90ID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoc2RvdCAtIHNuYW1lICE9IGxkb3QgLSBsbmFtZQotCSAgfHwgc3RybmNtcCAobG5hbWUsIHNuYW1lLCBzZG90IC0gc25hbWUpICE9IDApCi0JcmV0dXJuOwotCi0gICAgICBsbWFqID0gbG1pbiA9IC0xOwotICAgICAgc3NjYW5mIChsZG90LCAiLiVkLiVkIiwgJmxtYWosICZsbWluKTsKLSAgICAgIHNtYWogPSBzbWluID0gLTE7Ci0gICAgICBzc2NhbmYgKHNkb3QsICIuc28uJWQuJWQiLCAmc21haiwgJnNtaW4pOwotICAgICAgaWYgKChzbWFqICE9IGxtYWogJiYgc21haiAhPSAtMSAmJiBsbWFqICE9IC0xKQotCSAgfHwgKHNtaW4gIT0gbG1pbiAmJiBzbWluICE9IC0xICYmIGxtaW4gIT0gLTEpKQotCXJldHVybjsKLQotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIHN0YXRpYyB2YXJpYWJsZXMgdG8gcGFzcyBpbmZvcm1hdGlvbiBhcm91bmQgdGhlIGNhbGwKLSAgIHRvIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSWNrLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfYXNzaWduOwotc3RhdGljIGJvb2xlYW4gZm91bmRfYXNzaWduOwotCi0vKiBXZSBuZWVkIHRvIHVzZSBzdGF0aWMgdmFyaWFibGVzIHRvIHBhc3MgaW5mb3JtYXRpb24gYXJvdW5kIHRoZSBjYWxsCi0gICB0byBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUuICBJY2suICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZSBuZWVkX3NpemU7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBuZWVkX2VudHJpZXM7Ci1zdGF0aWMgYmZkX2J5dGUgKm5lZWRfY29udGVudHM7Ci1zdGF0aWMgYmZkX2J5dGUgKm5lZWRfcGluZm87Ci1zdGF0aWMgYmZkX2J5dGUgKm5lZWRfcG5hbWVzOwotCi0vKiBUaGUgc2l6ZSBvZiBvbmUgZW50cnkgaW4gdGhlIC5uZWVkIHNlY3Rpb24sIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUKLSAgIG5hbWUuICAqLwotCi0jZGVmaW5lIE5FRURfRU5UUllfU0laRSAoMTYpCi0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhkeW4gPSBOVUxMOwotICBhc2VjdGlvbiAqc25lZWQ7Ci0gIGFzZWN0aW9uICpzcnVsZXM7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIC8qIFRoZSBTdW5PUyBuYXRpdmUgbGlua2VyIGNyZWF0ZXMgYSBzaGFyZWQgbGlicmFyeSB3aGVuZXZlciB0aGVyZQotICAgICBhcmUgYW55IHVuZGVmaW5lZCBzeW1ib2xzIGluIGEgbGluaywgdW5sZXNzIC1lIGlzIHVzZWQuICBUaGlzIGlzCi0gICAgIHByZXR0eSB3ZWlyZCwgYnV0IHdlIGFyZSBjb21wYXRpYmxlLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnNoYXJlZCAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgJiYgISBlbnRyeV9mcm9tX2NtZGxpbmUpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAKLSAgICAgIGZvciAoaCA9IGxpbmtfaW5mby5oYXNoLT51bmRlZnM7IGggIT0gTlVMTDsgaCA9IGgtPm5leHQpCi0JewotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICAmJiBoLT51LnVuZGVmLmFiZmQgIT0gTlVMTAotCSAgICAgICYmIChoLT51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5zdHJpbmcsICJfX0RZTkFNSUMiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnN0cmluZywgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iKSAhPSAwKQotCSAgICB7Ci0JICAgICAgZmluZF9hc3NpZ24gPSBoLT5yb290LnN0cmluZzsKLQkgICAgICBmb3VuZF9hc3NpZ24gPSBmYWxzZTsKLQkgICAgICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50KTsKLQkgICAgICBpZiAoISBmb3VuZF9hc3NpZ24pCi0JCXsKLQkJICBsaW5rX2luZm8uc2hhcmVkID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICAgICAgLyogU2V0IHRoZSAudGV4dCBzZWN0aW9uIHRvIHN0YXJ0IGF0IDB4MjAsIG5vdCAweDIwMjAuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgdG9vIG1hZ2ljYWwuICAqLwotICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIudGV4dCIpOwotICAgICAgaWYgKG9zLT5hZGRyX3RyZWUgPT0gTlVMTCkKLQlvcy0+YWRkcl90cmVlID0gZXhwX2ludG9wICgweDIwKTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSBfX0RZTkFNSUMgc3ltYm9sLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUKLSAgICAgbGlua2VyIHNjcmlwdCBiZWNhdXNlIHdlIHdhbnQgdG8gc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3RhcnQgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbiBpZiB0aGVyZSBpcyBvbmUsIG9yIHRvIHplcm8gaWYgdGhlcmUgaXNuJ3QKLSAgICAgb25lLiAgV2UgbmVlZCB0byBjcmVhdGUgdGhlIHN5bWJvbCBiZWZvcmUgY2FsbGluZwotICAgICBzaXplX2R5bmFtaWNfc2VjdGlvbnMsIGFsdGhvdWdoIHdlIGNhbid0IHNldCB0aGUgdmFsdWUgdW50aWwKLSAgICAgYWZ0ZXJ3YXJkLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBoZHluID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCAiX19EWU5BTUlDIiwgdHJ1ZSwgZmFsc2UsCi0JCQkJICAgZmFsc2UpOwotICAgICAgaWYgKGhkeW4gPT0gTlVMTCkKLQllaW5mbyAoIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwOiAlRVxuIik7Ci0gICAgICBpZiAoISBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJICAgICAgIl9fRFlOQU1JQyIpKQotCWVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvIF9fRFlOQU1JQzogJUVcbiIpOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0Ci0gICAgIHRoZSBiYWNrZW5kIGxpbmtlciBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQotICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50KTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgbGlua2VyIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMKLSAgICAgcmVxdWlyZWQgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgaWYgKCEgYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgJnNkeW4sCi0JCQkJCSAmc25lZWQsICZzcnVsZXMpKQotICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKLQotICBpZiAoc25lZWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdXAgdGhlIC5uZWVkIHNlY3Rpb24uICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsZF9uZWVkCi0JIGZpZWxkIGluIGluY2x1ZGUvYW91dC9zdW40LmguICAqLwotCi0gICAgICBuZWVkX2VudHJpZXMgPSAwOwotICAgICAgbmVlZF9zaXplID0gMDsKLQotICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9jb3VudF9uZWVkKTsKLQotICAgICAgLyogV2Ugc2hvdWxkIG9ubHkgaGF2ZSBhIC5uZWVkIHNlY3Rpb24gaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUKLQkgZHluYW1pYyBvYmplY3QuICAqLwotICAgICAgQVNTRVJUIChuZWVkX2VudHJpZXMgIT0gMCk7Ci0KLSAgICAgIHNuZWVkLT5fcmF3X3NpemUgPSBuZWVkX3NpemU7Ci0gICAgICBzbmVlZC0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAobmVlZF9zaXplKTsKLQotICAgICAgbmVlZF9jb250ZW50cyA9IHNuZWVkLT5jb250ZW50czsKLSAgICAgIG5lZWRfcGluZm8gPSBzbmVlZC0+Y29udGVudHM7Ci0gICAgICBuZWVkX3BuYW1lcyA9IHNuZWVkLT5jb250ZW50cyArIG5lZWRfZW50cmllcyAqIDE2OwotCi0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9uZWVkKTsKLQotICAgICAgQVNTRVJUICgoYmZkX3NpemVfdHlwZSkgKG5lZWRfcG5hbWVzIC0gc25lZWQtPmNvbnRlbnRzKSA9PSBuZWVkX3NpemUpOwotICAgIH0KLQotICBpZiAoc3J1bGVzICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IHVwIHRoZSAucnVsZXMgc2VjdGlvbi4gIFRoaXMgaXMganVzdCBhIFBBVEggbGlrZSBzdHJpbmcKLQkgb2YgdGhlIC1MIGFyZ3VtZW50cyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgV2UgcGVybWl0IHRoZQotCSB1c2VyIHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yaWVzIHVzaW5nIHRoZSAtcnBhdGggY29tbWFuZCBsaW5lCi0JIG9wdGlvbi4gICovCi0gICAgICBpZiAoY29tbWFuZF9saW5lLnJwYXRoKQotCXsKLQkgIHNydWxlcy0+X3Jhd19zaXplID0gc3RybGVuIChjb21tYW5kX2xpbmUucnBhdGgpOwotCSAgc3J1bGVzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBjb21tYW5kX2xpbmUucnBhdGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBzaXplOwotCSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0JICBzaXplID0gMDsKLQkgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JICAgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JICAgICAgc2l6ZSArPSBzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyAxOwotCSAgc3J1bGVzLT5fcmF3X3NpemUgPSBzaXplOwotCSAgaWYgKHNpemUgPiAwKQotCSAgICB7Ci0JICAgICAgY2hhciAqcDsKLQotCSAgICAgIHNydWxlcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc2l6ZSk7Ci0JICAgICAgcCA9IChjaGFyICopIHNydWxlcy0+Y29udGVudHM7Ci0JICAgICAgKnAgPSAnXDAnOwotCSAgICAgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JCXsKLQkJICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCQkgICAgewotCQkgICAgICBpZiAocCAhPSAoY2hhciAqKSBzcnVsZXMtPmNvbnRlbnRzKQotCQkJKnArKyA9ICc6JzsKLQkJICAgICAgc3RyY3B5IChwLCBzZWFyY2gtPm5hbWUpOwotCQkgICAgICBwICs9IHN0cmxlbiAocCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV2UgbXVzdCBhc3NpZ24gYSB2YWx1ZSB0byBfX0RZTkFNSUMuICBJdCBzaG91bGQgYmUgemVybyBpZiB3ZSBhcmUKLSAgICAgbm90IGRvaW5nIGEgZHluYW1pYyBsaW5rLCBvciB0aGUgc3RhcnQgb2YgdGhlIC5keW5hbWljIHNlY3Rpb24gaWYKLSAgICAgd2UgYXJlIGRvaW5nIG9uZS4gICovCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaGR5bi0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgICAgIGhkeW4tPnUuZGVmLnZhbHVlID0gMDsKLSAgICAgIGlmIChzZHluICE9IE5VTEwpCi0JaGR5bi0+dS5kZWYuc2VjdGlvbiA9IHNkeW47Ci0gICAgICBlbHNlCi0JaGR5bi0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgZG9lcyBvbmUgb2YgdHdvIHRoaW5nczogaWYgdGhlCi0gICB2YXJpYWJsZSBmaW5kX2Fzc2lnbiBpcyBzZXQsIGl0IHNldHMgZm91bmRfYXNzaWduIGlmIGl0IGZpbmRzIGFuCi0gICBhc3NpZ25tZW50IHRvIHRoYXQgdmFyaWFibGU7IG90aGVyd2lzZSBpdCB0ZWxscyB0aGUgYmFja2VuZCBsaW5rZXIKLSAgIGFib3V0IGFsbCBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KLSAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2Fzc2lnbm1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0KLSAgICAgICYmIChmaW5kX2Fzc2lnbiA9PSBOVUxMIHx8ICEgZm91bmRfYXNzaWduKSkKLSAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKGZpbmRfYXNzaWduICE9IE5VTEwpCi0JewotCSAgaWYgKHN0cmNtcCAoZmluZF9hc3NpZ24sIGV4cC0+YXNzaWduLmRzdCkgPT0gMCkKLQkgICAgZm91bmRfYXNzaWduID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkJICBleHAtPmFzc2lnbi5kc3QpKQotCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgLm5lZWQgc2VjdGlvbiwgYW5kIHRoZSBudW1iZXIgb2YgZW50cmllcy4KLSAgIFRoZSBiYWNrZW5kIHdpbGwgc2V0IHRoZSBsZF9uZWVkIGZpZWxkIG9mIHRoZSBkeW5hbWljIGxpbmtpbmcKLSAgIGluZm9ybWF0aW9uIHRvIHBvaW50IHRvIHRoZSAubmVlZCBzZWN0aW9uLiAgU2VlIGluY2x1ZGUvYW91dC9zdW40LmgKLSAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NvdW50X25lZWQgKGlucCkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wOwotewotICBpZiAoaW5wLT50aGVfYmZkICE9IE5VTEwKLSAgICAgICYmIChpbnAtPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICArK25lZWRfZW50cmllczsKLSAgICAgIG5lZWRfc2l6ZSArPSBORUVEX0VOVFJZX1NJWkU7Ci0gICAgICBpZiAoISBpbnAtPmlzX2FyY2hpdmUpCi0JbmVlZF9zaXplICs9IHN0cmxlbiAoaW5wLT5maWxlbmFtZSkgKyAxOwotICAgICAgZWxzZQotCXsKLQkgIEFTU0VSVCAoaW5wLT5sb2NhbF9zeW1fbmFtZVswXSA9PSAnLScKLQkJICAmJiBpbnAtPmxvY2FsX3N5bV9uYW1lWzFdID09ICdsJyk7Ci0JICBuZWVkX3NpemUgKz0gc3RybGVuIChpbnAtPmxvY2FsX3N5bV9uYW1lICsgMikgKyAxOwotCX0KLSAgICB9Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSAubmVlZCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9uZWVkIChpbnApCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmlucDsKLXsKLSAgaWYgKGlucC0+dGhlX2JmZCAhPSBOVUxMCi0gICAgICAmJiAoaW5wLT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBjOwotCi0gICAgICAvKiBUbyByZWFsbHkgZmlsbCBpbiB0aGUgLm5lZWQgc2VjdGlvbiBjb250ZW50cywgd2UgbmVlZCB0byBrbm93Ci0JIHRoZSBmaW5hbCBmaWxlIHBvc2l0aW9uIG9mIHRoZSBzZWN0aW9uLCBidXQgd2UgZG9uJ3QuCi0JIEluc3RlYWQsIHdlIHVzZSBvZmZzZXRzLCBhbmQgcmVseSBvbiB0aGUgQkZEIGJhY2tlbmQgdG8KLQkgZmluaXNoIHRoZSBzZWN0aW9uIHVwIGNvcnJlY3RseS4gIEZJWE1FOiBUYWxrIGFib3V0IGxhY2sgb2YKLQkgcmVmZXJlbnRpYWwgbG9jYWxpdHkuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmVlZF9wbmFtZXMgLSBuZWVkX2NvbnRlbnRzLCBuZWVkX3BpbmZvKTsKLSAgICAgIGlmICghIGlucC0+aXNfYXJjaGl2ZSkKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDQpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG5lZWRfcGluZm8gKyA4KTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBuZWVkX3BpbmZvICsgMTApOwotCSAgc3RyY3B5IChuZWVkX3BuYW1lcywgaW5wLT5maWxlbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKnZlcnN0cjsKLQkgIGludCBtYWosIG1pbjsKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDB4ODAwMDAwMDAsIG5lZWRfcGluZm8gKyA0KTsKLQkgIG1haiA9IDA7Ci0JICBtaW4gPSAwOwotCSAgdmVyc3RyID0gc3Ryc3RyIChpbnAtPmZpbGVuYW1lLCAiLnNvLiIpOwotCSAgaWYgKHZlcnN0ciAhPSBOVUxMKQotCSAgICBzc2NhbmYgKHZlcnN0ciwgIi5zby4lZC4lZCIsICZtYWosICZtaW4pOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIG1haiwgbmVlZF9waW5mbyArIDgpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIG1pbiwgbmVlZF9waW5mbyArIDEwKTsKLQkgIHN0cmNweSAobmVlZF9wbmFtZXMsIGlucC0+bG9jYWxfc3ltX25hbWUgKyAyKTsKLQl9Ci0KLSAgICAgIGMgPSAobmVlZF9waW5mbyAtIG5lZWRfY29udGVudHMpIC8gTkVFRF9FTlRSWV9TSVpFOwotICAgICAgaWYgKGMgKyAxID49IG5lZWRfZW50cmllcykKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDEyKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgKGMgKyAxKSAqIE5FRURfRU5UUllfU0laRSwKLQkJICAgIG5lZWRfcGluZm8gKyAxMik7Ci0KLSAgICAgIG5lZWRfcGluZm8gKz0gTkVFRF9FTlRSWV9TSVpFOwotICAgICAgbmVlZF9wbmFtZXMgKz0gc3RybGVuIChuZWVkX3BuYW1lcykgKyAxOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsCS8qIGZpbmlzaCAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLSAgTlVMTCwJLyogb3BlbiBkeW5hbWljIGFyY2hpdmUgKi8KLSAgTlVMTCwJLyogcGxhY2Ugb3JwaGFuICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzLAotICBOVUxMLAkvKiBwYXJzZSBhcmdzICovCi0gIE5VTEwsCS8qIHVucmVjb2duaXplZCBmaWxlICovCi0gIE5VTEwsCS8qIGxpc3Qgb3B0aW9ucyAqLwotICBOVUxMLAkvKiByZWNvZ25pemVkIGZpbGUgKi8KLSAgTlVMTCAJLyogZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzICovCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvdmFuaWxsYS5lbSBiL2xkL2VtdWx0ZW1wbC92YW5pbGxhLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTc0YWJkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC92YW5pbGxhLmVtCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQSB2YW5pbGxhIGVtdWxhdGlvbiB3aXRoIG5vIGRlZmF1bHRzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi1zdGF0aWMgdm9pZCB2YW5pbGxhX2JlZm9yZV9wYXJzZSgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi12YW5pbGxhX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLwotICB1bnNpZ25lZCBsb25nICBtYWNoaW5lID0gMDsKLSAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIG1hY2hpbmUpOwotfQotCi1zdGF0aWMgY2hhciAqCi12YW5pbGxhX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsKLSAgKmlzZmlsZSA9IDA7Ci0gIHJldHVybiAiIjsKLX0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF92YW5pbGxhX2VtdWxhdGlvbiA9IAotewotICB2YW5pbGxhX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgdmFuaWxsYV9zZXRfb3V0cHV0X2FyY2gsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgdmFuaWxsYV9nZXRfc2NyaXB0LAotICAidmFuaWxsYSIsCi0gICJhLm91dC1zdW5vcy1iaWciLAotICBOVUxMLAkvKiBmaW5pc2ggKi8KLSAgTlVMTCwJLyogY3JlYXRlIG91dHB1dCBzZWN0aW9uIHN0YXRlbWVudHMgKi8KLSAgTlVMTCwJLyogb3BlbiBkeW5hbWljIGFyY2hpdmUgKi8KLSAgTlVMTCwJLyogcGxhY2Ugb3JwaGFuICovCi0gIE5VTEwsCS8qIHNldCBzeW1ib2xzICovCi0gIE5VTEwsCS8qIHBhcnNlIGFyZ3MgKi8KLSAgTlVMTCwJLyogdW5yZWNvZ25pemVkIGZpbGUgKi8KLSAgTlVMTCwJLyogbGlzdCBvcHRpb25zICovCi0gIE5VTEwsCS8qIHJlY29nbml6ZWQgZmlsZSAqLwotICBOVUxMIAkvKiBmaW5kX3BvdGVudGlhbF9saWJyYXJpZXMgKi8KLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2dlbi1kb2MudGV4aSBiL2xkL2dlbi1kb2MudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNjcyNy4uMDAwMDAwMAotLS0gYS9sZC9nZW4tZG9jLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1AYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiBWQVJTOgotQGMgMS4gSW5jbHVzaXZlbmVzcyBvZiB0aGlzIG1hbnVhbAotQHNldCBHRU5FUklDCi0KLUBjIDIuIFNwZWNpZmljIHRhcmdldCBtYWNoaW5lcwotQHNldCBIODMwMAotQHNldCBJOTYwCi0KLUBjIDMuIFByb3BlcnRpZXMgb2YgdGhpcyBjb25maWd1cmF0aW9uCi1AY2xlYXIgU2luZ2xlRm9ybWF0Ci1Ac2V0IFVzZXNFbnZWYXJzCi1AYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5kIENPTkZJR1VSQVRJT04gVkFSUwotCmRpZmYgLS1naXQgYS9sZC9nZW5zY3JpcHRzLnNoIGIvbGQvZ2Vuc2NyaXB0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI5NGFmNy4uMDAwMDAwMAotLS0gYS9sZC9nZW5zY3JpcHRzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLSMhL2Jpbi9zaAotIyBnZW5zY3JpcHRzLnNoIC0gZ2VuZXJhdGUgdGhlIGxkLWVtdWxhdGlvbi10YXJnZXQgc3BlY2lmaWMgZmlsZXMKLSMKLSMgVXNhZ2U6IGdlbnNjcmlwdHMuc2ggc3JjZGlyIGxpYmRpciBob3N0IHRhcmdldCB0YXJnZXRfYWxpYXMgXAotIyBkZWZhdWx0X2VtdWxhdGlvbiBuYXRpdmVfbGliX2RpcnMgdGhpc19lbXVsYXRpb24gdG9vbF9kaXIKLSMKLSMgU2FtcGxlIHVzYWdlOgotIyBnZW5zY3JpcHRzLnNoIC9kam0vbGQtZGV2by9kZXZvL2xkIC91c3IvbG9jYWwvbGliIHNwYXJjLXN1bi1zdW5vczQuMS4zIFwKLSMgc3BhcmMtc3VuLXN1bm9zNC4xLjMgc3BhcmMtc3VuLXN1bm9zNC4xLjMgc3VuNCAiIiBzdW4zIHNwYXJjLXN1bi1zdW5vczQuMS4zCi0jIHByb2R1Y2VzIHN1bjMueCBzdW4zLnhibiBzdW4zLnhuIHN1bjMueHIgc3VuMy54dSBlbV9zdW4zLmMKLQotc3JjZGlyPSQxCi1saWJkaXI9JDIKLWhvc3Q9JDMKLXRhcmdldD0kNAotdGFyZ2V0X2FsaWFzPSQ1Ci1FTVVMQVRJT05fTElCUEFUSD0kNgotTkFUSVZFX0xJQl9ESVJTPSQ3Ci1FTVVMQVRJT05fTkFNRT0kOAotdG9vbF9saWI9YGVjaG8gJHtsaWJkaXJ9IHwgc2VkIC1lICdzfC9saWIkfHwnYC8kezktJHRhcmdldF9hbGlhc30vbGliCi0KLSMgSW5jbHVkZSB0aGUgZW11bGF0aW9uLXNwZWNpZmljIHBhcmFtZXRlcnM6Ci0uICR7c3JjZGlyfS9lbXVscGFyYW1zLyR7RU1VTEFUSU9OX05BTUV9LnNoCi0KLWlmIHRlc3QgLWQgbGRzY3JpcHRzOyB0aGVuCi0gIHRydWUKLWVsc2UKLSAgbWtkaXIgbGRzY3JpcHRzCi1maQotCi0jIFNldCB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCwgZm9yIGxpYnJhcmllcyBuYW1lZCBieSAtbGZvby4KLSMgSWYgTElCX1BBVEggaXMgZGVmaW5lZCAoZS5nLiwgYnkgTWFrZWZpbGUpIGFuZCBub24tZW1wdHksIGl0IGlzIHVzZWQuCi0jIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgaXMgc2V0IGhlcmUuCi0jCi0jIFRoZSBmb3JtYXQgaXMgdGhlIHVzdWFsIGxpc3Qgb2YgY29sb24tc2VwYXJhdGVkIGRpcmVjdG9yaWVzLgotIyBUbyBmb3JjZSBhIGxvZ2ljYWxseSBlbXB0eSBMSUJfUEFUSCwgZG8gTElCUEFUSD0iOiIuCi0KLWlmIFsgIngke0xJQl9QQVRIfSIgPSAieCIgXSA7IHRoZW4KLSAgIyBDcm9zcywgb3IgbmF0aXZlIG5vbi1kZWZhdWx0IGVtdWxhdGlvbiBub3QgcmVxdWVzdGluZyBMSUJfUEFUSC4KLSAgTElCX1BBVEg9Ci0KLSAgaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gICAgY2FzZSAiICRFTVVMQVRJT05fTElCUEFUSCAiIGluCi0gICAgICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLSAgICAgICAgIyBOYXRpdmUsIGFuZCBkZWZhdWx0IG9yIGVtdWxhdGlvbiByZXF1ZXN0aW5nIExJQl9QQVRILgotICAgICAgICBMSUJfUEFUSD0vbGliOi91c3IvbGliCi0gICAgICAgIGlmIFsgLW4gIiR7TkFUSVZFX0xJQl9ESVJTfSIgXTsgdGhlbgotCSAgTElCX1BBVEg9JHtMSUJfUEFUSH06JHtOQVRJVkVfTElCX0RJUlN9Ci0gICAgICAgIGZpCi0gICAgICAgIGlmIFsgIiR7bGliZGlyfSIgIT0gL3Vzci9saWIgXTsgdGhlbgotCSAgTElCX1BBVEg9JHtMSUJfUEFUSH06JHtsaWJkaXJ9Ci0gICAgICAgIGZpCi0gICAgICAgIGlmIFsgIiR7bGliZGlyfSIgIT0gL3Vzci9sb2NhbC9saWIgXSA7IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9Oi91c3IvbG9jYWwvbGliCi0gICAgICAgIGZpCi0gICAgZXNhYwotICBmaQotZmkKLQotIyBBbHdheXMgc2VhcmNoICQodG9vbGRpcikvbGliLCBha2EgL3Vzci9sb2NhbC9UQVJHRVQvbGliLgotTElCX1BBVEg9JHtMSUJfUEFUSH06JHt0b29sX2xpYn0KLQotTElCX1NFQVJDSF9ESVJTPWBlY2hvICR7TElCX1BBVEh9IHwgdHIgJzonICcgJyB8IHNlZCAtZSAncy9cKFteIF1bXiBdKlwpL1NFQVJDSF9ESVIoXDEpOy9nJ2AKLQotIyBHZW5lcmF0ZSA1IG9yIDYgc2NyaXB0IGZpbGVzIGZyb20gYSBtYXN0ZXIgc2NyaXB0IHRlbXBsYXRlIGluCi0jICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zaC4gIFdoaWNoIG9uZSBvZiB0aGUgNSBvciA2Ci0jIHNjcmlwdCBmaWxlcyBpcyBhY3R1YWxseSB1c2VkIGRlcGVuZHMgb24gY29tbWFuZCBsaW5lIG9wdGlvbnMgZ2l2ZW4KLSMgdG8gbGQuICAoU0NSSVBUX05BTUUgd2FzIHNldCBpbiB0aGUgZW11bHBhcmFtc19maWxlLikKLSMKLSMgQSAueCBzY3JpcHQgZmlsZSBpcyB0aGUgZGVmYXVsdCBzY3JpcHQuCi0jIEEgLnhyIHNjcmlwdCBpcyBmb3IgbGlua2luZyB3aXRob3V0IHJlbG9jYXRpb24gKC1yIGZsYWcpLgotIyBBIC54dSBzY3JpcHQgaXMgbGlrZSAueHIsIGJ1dCAqZG8qIGNyZWF0ZSBjb25zdHJ1Y3RvcnMgKC1VciBmbGFnKS4KLSMgQSAueG4gc2NyaXB0IGlzIGZvciBsaW5raW5nIHdpdGggLW4gZmxhZyAobWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlKS4KLSMgQSAueGJuIHNjcmlwdCBpcyBmb3IgbGlua2luZyB3aXRoIC1OIGZsYWcgKG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSkuCi0jIEEgLnhzIHNjcmlwdCBpcyBmb3IgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5IHdpdGggdGhlIC0tc2hhcmVkCi0jICAgZmxhZzsgaXQgaXMgb25seSBnZW5lcmF0ZWQgaWYgJEdFTkVSQVRFX1NITElCX1NDUklQVCBpcyBzZXQgYnkgdGhlCi0jICAgZW11bGF0aW9uIHBhcmFtZXRlcnMuCi0KLVNFR01FTlRfU0laRT0ke1NFR01FTlRfU0laRS0ke1RBUkdFVF9QQUdFX1NJWkV9fQotCi0jIERldGVybWluZSBEQVRBX0FMSUdOTUVOVCBmb3IgdGhlIDUgdmFyaWFudHMsIHVzaW5nCi0jIHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhlIGVtdWxwYXJhbXMvPGVtdWxhdGlvbj4uc2ggZmlsZSBvciBkZWZhdWx0LgotCi1EQVRBX0FMSUdOTUVOVF89IiR7REFUQV9BTElHTk1FTlRfLSR7REFUQV9BTElHTk1FTlQtQUxJR04oJHtTRUdNRU5UX1NJWkV9KX19IgotREFUQV9BTElHTk1FTlRfbj0iJHtEQVRBX0FMSUdOTUVOVF9uLSR7REFUQV9BTElHTk1FTlRffX0iCi1EQVRBX0FMSUdOTUVOVF9OPSIke0RBVEFfQUxJR05NRU5UX04tJHtEQVRBX0FMSUdOTUVOVC0ufX0iCi1EQVRBX0FMSUdOTUVOVF9yPSIke0RBVEFfQUxJR05NRU5UX3ItJHtEQVRBX0FMSUdOTUVOVC19fSIKLURBVEFfQUxJR05NRU5UX3U9IiR7REFUQV9BTElHTk1FTlRfdS0ke0RBVEFfQUxJR05NRU5UX3J9fSIKLQotTERfRkxBRz1yCi1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX3J9Ci1ERUZBVUxUX0RBVEFfQUxJR05NRU5UPSJBTElHTigke1NFR01FTlRfU0laRX0pIgotKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cgotCi1MRF9GTEFHPXUKLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfdX0KLUNPTlNUUlVDVElORz0iICIKLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUKLQotTERfRkxBRz0KLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRffQotUkVMT0NBVElORz0iICIKLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueAotCi1MRF9GTEFHPW4KLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfbn0KLVRFWFRfU1RBUlRfQUREUj0ke05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUi0ke1RFWFRfU1RBUlRfQUREUn19Ci0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuCi0KLUxEX0ZMQUc9TgotREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF9OfQotKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4KLQotaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCI7IHRoZW4KLSAgTERfRkxBRz1zaGFyZWQKLSAgREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF9zLSR7REFUQV9BTElHTk1FTlRffX0KLSAgQ1JFQVRFX1NITElCPSIgIgotICAjIE5vdGUgdGhhdCBURVhUX1NUQVJUX0FERFIgaXMgc2V0IHRvIE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUi4KLSAgKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gICAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzCi1maQotCi1mb3IgaSBpbiAkRU1VTEFUSU9OX0xJQlBBVEggOyBkbwotICB0ZXN0ICIkaSIgPSAiJEVNVUxBVElPTl9OQU1FIiAmJiBDT01QSUxFX0lOPXRydWUKLWRvbmUKLQotIyBHZW5lcmF0ZSBlJHtFTVVMQVRJT05fTkFNRX0uYy4KLS4gJHtzcmNkaXJ9L2VtdWx0ZW1wbC8ke1RFTVBMQVRFX05BTUUtZ2VuZXJpY30uZW0KZGlmZiAtLWdpdCBhL2xkL2g4LWRvYy50ZXhpIGIvbGQvaDgtZG9jLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzYyYTEuLjAwMDAwMDAKLS0tIGEvbGQvaDgtZG9jLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1AYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiBWQVJTOgotQGMgMS4gSW5jbHVzaXZlbmVzcyBvZiB0aGlzIG1hbnVhbAotQGNsZWFyIEdFTkVSSUMKLQotQGMgMi4gU3BlY2lmaWMgdGFyZ2V0IG1hY2hpbmVzCi1Ac2V0IEg4MzAwCi1Ac2V0IEhpdGFjaGkKLUBjbGVhciBJOTYwCi0KLUBjIDMuIFByb3BlcnRpZXMgb2YgdGhpcyBjb25maWd1cmF0aW9uCi1Ac2V0IFNpbmdsZUZvcm1hdAotQGNsZWFyIFVzZXNFbnZWYXJzCi1AYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5kIENPTkZJR1VSQVRJT04gVkFSUwotCmRpZmYgLS1naXQgYS9sZC9sZC4xIGIvbGQvbGQuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1MTZiOS4uMDAwMDAwMAotLS0gYS9sZC9sZC4xCisrKyAvZGV2L251bGwKQEAgLTEsMTExNSArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIGxkIDEgIjE3IEF1Z3VzdCAxOTkyIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotbGQgXC0gdGhlIEdOVSBsaW5rZXIKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIGxkIAotLlJCICJbXHwiIFwtbyAiCi0uSSBvdXRwdXRcYwotXCZcfF0gXGMKLS5JIG9iamZpbGVcYwotXCYuXHwuXHwuCi0uYnIKLS5SQiAiW1x8IiBcLUFcYwotLkkgYXJjaGl0ZWN0dXJlXGMKLVwmXHxdIAotLlJCICJbXHwiICJcLWJcICJcYwotLkkgaW5wdXQtZm9ybWF0XGMKLVwmXHxdIAotLlJCICJbXHwiIFwtQnN0YXRpYyAiXHxdIiAgCi0uUkIgIltcfCIgXC1CZHluYW1pYyAiXHxdIiAgCi0uUkIgIltcfCIgXC1Cc3ltYm9saWMgIlx8XSIgIAotLlJCICJbXHwiICJcLWNcICJcYwotLkkgY29tbWFuZGZpbGVcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1cLWNyZWYgIlx8XSIKLS5SQiAiW1x8IiBcLWQgfCBcLWRjIHwgXC1kcFxjCi1cfF0KLS5icgotLlJCICJbXHwiICJcLWRlZnN5bVwgIlxjCi0uSSBzeW1ib2xcYwotXCYgPSBcYwotLkkgZXhwcmVzc2lvblxjCi1cJlx8XQotLlJCICJbXHwiIFwtXC1kZW1hbmdsZSAiXHxdIgotLlJCICJbXHwiIFwtXC1ub1wtZGVtYW5nbGUgIlx8XSIKLS5SQiAiW1x8IiAiXC1lXCAiXGMKLS5JIGVudHJ5XGMKLVwmXHxdIAotLlJCICJbXHwiIFwtZW1iZWRkZWRcLXJlbG9jcyAiXHxdIgotLlJCICJbXHwiIFwtRSAiXHxdIiAKLS5SQiAiW1x8IiBcLWV4cG9ydFwtZHluYW1pYyAiXHxdIgotLlJCICJbXHwiICJcLWZcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLVwtYXV4aWxpYXJ5XCAiXGMKLS5JIG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1GXCAiXGMKLS5JIG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1cLWZpbHRlclwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtZm9ybWF0XCAiXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLWcgIlx8XSIgCi0uUkIgIltcfCIgXC1HCi0uSSBzaXplXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtaFwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtc29uYW1lXCAiXGMKLS5JIG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIgotLlJCICJbXHwiIFwtaSAiXHxdIgotLlJCICJbXHwiIFwtbFxjCi0uSSBhclxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLUxcYwotLkkgc2VhcmNoZGlyXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtTSAiXHxdIiAKLS5SQiAiW1x8IiBcLU1hcAotLkkgbWFwZmlsZVxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLW0KLS5JIGVtdWxhdGlvblxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLW4gfCBcLU4gIlx8XSIgCi0uUkIgIltcfCIgXC1ub2luaGliaXQtZXhlYyAiXHxdIiAKLS5SQiAiW1x8IiBcLW5vXC1rZWVwXC1tZW1vcnkgIlx8XSIgCi0uUkIgIltcfCIgXC1ub1wtd2FyblwtbWlzbWF0Y2ggIlx8XSIgCi0uUkIgIltcfCIgXC1PXGMKLS5JIGxldmVsXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtb2Zvcm1hdFwgIlxjCi0uSSBvdXRwdXQtZm9ybWF0XGMKLVwmXHxdIAotLlJCICJbXHwiICJcLVJcICJcYwotLkkgZmlsZW5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiBcLXJlbGF4ICJcfF0iCi0uUkIgIltcfCIgXC1yIHwgXC1VciAiXHxdIiAKLS5SQiAiW1x8IiAiXC1ycGF0aFwgIlxjCi0uSSBkaXJlY3RvcnlcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1ycGF0aFwtbGlua1wgIlxjCi0uSSBkaXJlY3RvcnlcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVMgIlx8XSIgCi0uUkIgIltcfCIgXC1zICJcfF0iIAotLlJCICJbXHwiIFwtc2hhcmVkICJcfF0iIAotLlJCICJbXHwiIFwtc29ydFwtY29tbW9uICJcfF0iIAotLlJCICJbXHwiICJcLXNwbGl0XC1ieVwtcmVsb2NcICJcYwotLkkgY291bnRcYwotXCZcfF0KLS5SQiAiW1x8IiBcLXNwbGl0XC1ieVwtZmlsZSAiXHxdIiAKLS5SQiAiW1x8IiAiXC1UXCAiXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmXHxdICAKLS5SQiAiW1x8IiAiXC1UdGV4dFwgIlxjCi0uSSB0ZXh0b3JnXGMKLVwmXHxdIAotLlJCICJbXHwiICJcLVRkYXRhXCAiXGMKLS5JIGRhdGFvcmdcYwotXCZcfF0gCi0uUkIgIltcfCIgIlwtVGJzc1wgIlxjCi0uSSBic3NvcmdcYwotXCZcfF0KLS5SQiAiW1x8IiBcLXQgIlx8XSIgCi0uUkIgIltcfCIgIlwtdVwgIlxjCi0uSSBzeW1cYwotXCZdCi0uUkIgIltcfCIgXC1WICJcfF0iCi0uUkIgIltcfCIgXC12ICJcfF0iCi0uUkIgIltcfCIgXC1cLXZlcmJvc2UgIlx8XSIKLS5SQiAiW1x8IiBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIFwtd2FyblwtY29tbW9uICJcfF0iIAotLlJCICJbXHwiIFwtd2FyblwtY29uc3RydWN0b3JzICJcfF0iIAotLlJCICJbXHwiIFwtd2FyblwtbXVsdGlwbGVcLWdwICJcfF0iIAotLlJCICJbXHwiIFwtd2Fyblwtb25jZSAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLXNlY3Rpb25cLWFsaWduICJcfF0iIAotLlJCICJbXHwiIFwtXC13aG9sZVwtYXJjaGl2ZSAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtbm9cLXdob2xlXC1hcmNoaXZlICJcfF0iIAotLlJCICJbXHwiICJcLVwtd3JhcFwgIlxjCi0uSSBzeW1ib2xcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVggIlx8XSIgCi0uUkIgIltcfCIgXC14ICJcfF0iIAotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLVxjCi0uQiBsZFxjCi1cJiBjb21iaW5lcyBhIG51bWJlciBvZiBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMsIHJlbG9jYXRlcwotdGhlaXIgZGF0YSBhbmQgdGllcyB1cCBzeW1ib2wgcmVmZXJlbmNlcy4gT2Z0ZW4gdGhlIGxhc3Qgc3RlcCBpbgotYnVpbGRpbmcgYSBuZXcgY29tcGlsZWQgcHJvZ3JhbSB0byBydW4gaXMgYSBjYWxsIHRvIFxjCi0uQiBsZFxjCi1cJi4KLQotXGMKLS5CIGxkXGMKLVwmIGFjY2VwdHMgTGlua2VyIENvbW1hbmQgTGFuZ3VhZ2UgZmlsZXMgCi10byBwcm92aWRlIGV4cGxpY2l0IGFuZCB0b3RhbCBjb250cm9sIG92ZXIgdGhlIGxpbmtpbmcgcHJvY2Vzcy4KLVRoaXMgbWFuIHBhZ2UgZG9lcyBub3QgZGVzY3JpYmUgdGhlIGNvbW1hbmQgbGFuZ3VhZ2U7IHNlZSB0aGUgYFx8XGMKLS5CIGxkXGMKLVx8JyBlbnRyeSBpbiBgXHxcYwotLkIgaW5mb1xjCi1cfCcsIG9yIHRoZSBtYW51YWwKLS5JCi1sZDogdGhlIEdOVSBsaW5rZXIKLVwmLCBmb3IgZnVsbCBkZXRhaWxzIG9uIHRoZSBjb21tYW5kIGxhbmd1YWdlIGFuZCBvbiBvdGhlciBhc3BlY3RzIG9mCi10aGUgR05VIGxpbmtlci4gCi0KLVRoaXMgdmVyc2lvbiBvZiBcYwotLkIgbGRcYwotXCYgdXNlcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIEJGRCBsaWJyYXJpZXMKLXRvIG9wZXJhdGUgb24gb2JqZWN0IGZpbGVzLiBUaGlzIGFsbG93cyBcYwotLkIgbGRcYwotXCYgdG8gcmVhZCwgY29tYmluZSwgYW5kCi13cml0ZSBvYmplY3QgZmlsZXMgaW4gbWFueSBkaWZmZXJlbnQgZm9ybWF0c1woZW1cJmZvciBleGFtcGxlLCBDT0ZGIG9yCi1cYwotLkIgYS5vdXRcYwotXCYuICBEaWZmZXJlbnQgZm9ybWF0cyBtYXkgYmUgbGlua2VkIHRvZ2V0aGVyIHRvIHByb2R1Y2UgYW55Ci1hdmFpbGFibGUga2luZCBvZiBvYmplY3QgZmlsZS4gIFlvdSBjYW4gdXNlIGBcfFxjCi0uQiBvYmpkdW1wIFwtaVxjCi1cfCcgdG8gZ2V0IGEgbGlzdCBvZiBmb3JtYXRzIHN1cHBvcnRlZCBvbiB2YXJpb3VzIGFyY2hpdGVjdHVyZXM7IHNlZSAKLS5CUiBvYmpkdW1wICggMSApLgotCi1Bc2lkZSBmcm9tIGl0cyBmbGV4aWJpbGl0eSwgdGhlIEdOVSBsaW5rZXIgaXMgbW9yZSBoZWxwZnVsIHRoYW4gb3RoZXIKLWxpbmtlcnMgaW4gcHJvdmlkaW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uICBNYW55IGxpbmtlcnMgYWJhbmRvbgotZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gZW5jb3VudGVyaW5nIGFuIGVycm9yOyB3aGVuZXZlciBwb3NzaWJsZSwKLVxjCi0uQiBsZFxjCi1cJiBjb250aW51ZXMgZXhlY3V0aW5nLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgb3RoZXIgZXJyb3JzCi0ob3IsIGluIHNvbWUgY2FzZXMsIHRvIGdldCBhbiBvdXRwdXQgZmlsZSBpbiBzcGl0ZSBvZiB0aGUgZXJyb3IpLgotCi1UaGUgR05VIGxpbmtlciBcYwotLkIgbGRcYwotXCYgaXMgbWVhbnQgdG8gY292ZXIgYSBicm9hZCByYW5nZSBvZiBzaXR1YXRpb25zLAotYW5kIHRvIGJlIGFzIGNvbXBhdGlibGUgYXMgcG9zc2libGUgd2l0aCBvdGhlciBsaW5rZXJzLiAgQXMgYSByZXN1bHQsCi15b3UgaGF2ZSBtYW55IGNob2ljZXMgdG8gY29udHJvbCBpdHMgYmVoYXZpb3IgdGhyb3VnaCB0aGUgY29tbWFuZCBsaW5lLAotYW5kIHRocm91Z2ggZW52aXJvbm1lbnQgdmFyaWFibGVzLgotCi0uU0ggT1BUSU9OUwotVGhlIHBsZXRob3JhIG9mIGNvbW1hbmQtbGluZSBvcHRpb25zIG1heSBzZWVtIGludGltaWRhdGluZywgYnV0IGluCi1hY3R1YWwgcHJhY3RpY2UgZmV3IG9mIHRoZW0gYXJlIHVzZWQgaW4gYW55IHBhcnRpY3VsYXIgY29udGV4dC4KLUZvciBpbnN0YW5jZSwgYSBmcmVxdWVudCB1c2Ugb2YgXGMKLS5CIGxkXGMKLVwmIGlzIHRvIGxpbmsgc3RhbmRhcmQgVW5peAotb2JqZWN0IGZpbGVzIG9uIGEgc3RhbmRhcmQsIHN1cHBvcnRlZCBVbml4IHN5c3RlbS4gIE9uIHN1Y2ggYSBzeXN0ZW0sIHRvCi1saW5rIGEgZmlsZSBcYwotLkIgaGVsbG8ub1xjCi1cJjoKLS5zcAotLmJyCi0kXCBsZFwgXC1vXCBvdXRwdXRcIC9saWIvY3J0MC5vXCBoZWxsby5vXCBcLWxjCi0uYnIKLS5zcAotVGhpcyB0ZWxscyBcYwotLkIgbGRcYwotXCYgdG8gcHJvZHVjZSBhIGZpbGUgY2FsbGVkIFxjCi0uQiBvdXRwdXRcYwotXCYgYXMgdGhlCi1yZXN1bHQgb2YgbGlua2luZyB0aGUgZmlsZSBcYwotLkIgL2xpYi9jcnQwLm9cYwotXCYgd2l0aCBcYwotLkIgaGVsbG8ub1xjCi1cJiBhbmQKLXRoZSBsaWJyYXJ5IFxjCi0uQiBsaWJjLmFcYwotXCYgd2hpY2ggd2lsbCBjb21lIGZyb20gdGhlIHN0YW5kYXJkIHNlYXJjaAotZGlyZWN0b3JpZXMuCi0KLVRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBcYwotLkIgbGRcYwotXCYgbWF5IGJlIHNwZWNpZmllZCBpbiBhbnkgb3JkZXIsIGFuZAotbWF5IGJlIHJlcGVhdGVkIGF0IHdpbGwuICBGb3IgdGhlIG1vc3QgcGFydCwgcmVwZWF0aW5nIGFuIG9wdGlvbiB3aXRoIGEKLWRpZmZlcmVudCBhcmd1bWVudCB3aWxsIGVpdGhlciBoYXZlIG5vIGZ1cnRoZXIgZWZmZWN0LCBvciBvdmVycmlkZSBwcmlvcgotb2NjdXJyZW5jZXMgKHRob3NlIGZ1cnRoZXIgdG8gdGhlIGxlZnQgb24gdGhlIGNvbW1hbmQgbGluZSkgb2YgYW4KLW9wdGlvbi4gIAotCi1UaGUgZXhjZXB0aW9uc1woZW1cJndoaWNoIG1heSBtZWFuaW5nZnVsbHkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZVwoZW1cJmFyZQotXGMKLS5CIFwtQVxjCi1cJiwgXGMKLS5CIFwtYlxjCi1cJiAob3IgaXRzIHN5bm9ueW0gXGMKLS5CIFwtZm9ybWF0XGMKLVwmKSwgXGMKLS5CIFwtZGVmc3ltXGMKLVwmLAotXGMKLS5CIFwtTFxjCi1cJiwgXGMKLS5CIFwtbFxjCi1cJiwgXGMKLS5CIFwtUlxjCi1cJiwgYW5kIFxjCi0uQiBcLXVcYwotXCYuCi0KLVRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyB0byBiZSBsaW5rZWQgdG9nZXRoZXIsIHNob3duIGFzIFxjCi0uSSBvYmpmaWxlXGMKLVwmLAotbWF5IGZvbGxvdywgcHJlY2VkZSwgb3IgYmUgbWl4ZWQgaW4gd2l0aCBjb21tYW5kLWxpbmUgb3B0aW9uczsgc2F2ZSB0aGF0Ci1hbiBcYwotLkkgb2JqZmlsZVxjCi1cJiBhcmd1bWVudCBtYXkgbm90IGJlIHBsYWNlZCBiZXR3ZWVuIGFuIG9wdGlvbiBmbGFnIGFuZAotaXRzIGFyZ3VtZW50LgotCi1Vc3VhbGx5IHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIGF0IGxlYXN0IG9uZSBvYmplY3QgZmlsZSwgYnV0IG90aGVyCi1mb3JtcyBvZiBiaW5hcnkgaW5wdXQgZmlsZXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHdpdGggXGMKLS5CIFwtbFxjCi1cJiwKLVxjCi0uQiBcLVJcYwotXCYsIGFuZCB0aGUgc2NyaXB0IGNvbW1hbmQgbGFuZ3VhZ2UuICBJZiBcYwotLkkgbm9cYwotXCYgYmluYXJ5IGlucHV0Ci1maWxlcyBhdCBhbGwgYXJlIHNwZWNpZmllZCwgdGhlIGxpbmtlciBkb2VzIG5vdCBwcm9kdWNlIGFueSBvdXRwdXQsIGFuZAotaXNzdWVzIHRoZSBtZXNzYWdlIGBcfFxjCi0uQiBObyBpbnB1dCBmaWxlc1xjCi1cfCcuCi0KLU9wdGlvbiBhcmd1bWVudHMgbXVzdCBlaXRoZXIgZm9sbG93IHRoZSBvcHRpb24gbGV0dGVyIHdpdGhvdXQgaW50ZXJ2ZW5pbmcKLXdoaXRlc3BhY2UsIG9yIGJlIGdpdmVuIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlCi1vcHRpb24gdGhhdCByZXF1aXJlcyB0aGVtLgotCi0uVFAKLS5CSSAiLUEiICJhcmNoaXRlY3R1cmUiCi1JbiB0aGUgY3VycmVudCByZWxlYXNlIG9mIFxjCi0uQiBsZFxjCi1cJiwgdGhpcyBvcHRpb24gaXMgdXNlZnVsIG9ubHkgZm9yIHRoZQotSW50ZWwgOTYwIGZhbWlseSBvZiBhcmNoaXRlY3R1cmVzLiAgSW4gdGhhdCBcYwotLkIgbGRcYwotXCYgY29uZmlndXJhdGlvbiwgdGhlCi1cYwotLkkgYXJjaGl0ZWN0dXJlXGMKLVwmIGFyZ3VtZW50IGlzIG9uZSBvZiB0aGUgdHdvLWxldHRlciBuYW1lcyBpZGVudGlmeWluZwotbWVtYmVycyBvZiB0aGUgOTYwIGZhbWlseTsgdGhlIG9wdGlvbiBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgb3V0cHV0Ci10YXJnZXQsIGFuZCB3YXJucyBvZiBhbnkgaW5jb21wYXRpYmxlIGluc3RydWN0aW9ucyBpbiB0aGUgaW5wdXQgZmlsZXMuCi1JdCBhbHNvIG1vZGlmaWVzIHRoZSBsaW5rZXIncyBzZWFyY2ggc3RyYXRlZ3kgZm9yIGFyY2hpdmUgbGlicmFyaWVzLCB0bwotc3VwcG9ydCB0aGUgdXNlIG9mIGxpYnJhcmllcyBzcGVjaWZpYyB0byBlYWNoIHBhcnRpY3VsYXIKLWFyY2hpdGVjdHVyZSwgYnkgaW5jbHVkaW5nIGluIHRoZSBzZWFyY2ggbG9vcCBuYW1lcyBzdWZmaXhlZCB3aXRoIHRoZQotc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBhcmNoaXRlY3R1cmUuCi0KLUZvciBleGFtcGxlLCBpZiB5b3VyIFxjCi0uQiBsZFxjCi1cJiBjb21tYW5kIGxpbmUgaW5jbHVkZWQgYFx8XGMKLS5CIFwtQUNBXGMKLVx8JyBhcwotd2VsbCBhcyBgXHxcYwotLkIgXC1sdHJ5XGMKLVx8JywgdGhlIGxpbmtlciB3b3VsZCBsb29rIChpbiBpdHMgYnVpbHQtaW4gc2VhcmNoCi1wYXRocywgYW5kIGluIGFueSBwYXRocyB5b3Ugc3BlY2lmeSB3aXRoIFxjCi0uQiBcLUxcYwotXCYpIGZvciBhIGxpYnJhcnkgd2l0aAotdGhlIG5hbWVzCi0uc3AKLS5icgotdHJ5Ci0uYnIKLWxpYnRyeS5hCi0uYnIKLXRyeWNhCi0uYnIKLWxpYnRyeWNhLmEKLS5icgotLnNwCi0KLVRoZSBmaXJzdCB0d28gcG9zc2liaWxpdGllcyB3b3VsZCBiZSBjb25zaWRlcmVkIGluIGFueSBldmVudDsgdGhlIGxhc3QKLXR3byBhcmUgZHVlIHRvIHRoZSB1c2Ugb2YgYFx8XGMKLS5CIFwtQUNBXGMKLVx8Jy4KLQotRnV0dXJlIHJlbGVhc2VzIG9mIFxjCi0uQiBsZFxjCi1cJiBtYXkgc3VwcG9ydCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgZm9yCi1vdGhlciBhcmNoaXRlY3R1cmUgZmFtaWxpZXMuCi0KLVlvdSBjYW4gbWVhbmluZ2Z1bGx5IHVzZSBcYwotLkIgXC1BXGMKLVwmIG1vcmUgdGhhbiBvbmNlIG9uIGEgY29tbWFuZCBsaW5lLCBpZgotYW4gYXJjaGl0ZWN0dXJlIGZhbWlseSBhbGxvd3MgY29tYmluYXRpb24gb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZXM7IGVhY2gKLXVzZSB3aWxsIGFkZCBhbm90aGVyIHBhaXIgb2YgbmFtZSB2YXJpYW50cyB0byBzZWFyY2ggZm9yIHdoZW4gXGMKLS5CIFwtbAotc3BlY2lmaWVzIGEgbGlicmFyeS4KLQotLlRQCi0uQkkgIlwtYiAiICJpbnB1dC1mb3JtYXQiCi1TcGVjaWZ5IHRoZSBiaW5hcnkgZm9ybWF0IGZvciBpbnB1dCBvYmplY3QgZmlsZXMgdGhhdCBmb2xsb3cgdGhpcyBvcHRpb24KLW9uIHRoZSBjb21tYW5kIGxpbmUuICBZb3UgZG9uJ3QgdXN1YWxseSBuZWVkIHRvIHNwZWNpZnkgdGhpcywgYXMKLVxjCi0uQiBsZFxjCi1cJiBpcyBjb25maWd1cmVkIHRvIGV4cGVjdCBhcyBhIGRlZmF1bHQgaW5wdXQgZm9ybWF0IHRoZSBtb3N0Ci11c3VhbCBmb3JtYXQgb24gZWFjaCBtYWNoaW5lLiAgXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJiBpcyBhIHRleHQgc3RyaW5nLCB0aGUKLW5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAKLVxjCi0uQiBcLWZvcm1hdCBcYwotLkkgaW5wdXQtZm9ybWF0XGMKLVwmXGMKLVwmIGhhcyB0aGUgc2FtZSBlZmZlY3QsIGFzIGRvZXMgdGhlIHNjcmlwdCBjb21tYW5kCi0uQlIgVEFSR0VUIC4KLQotWW91IG1heSB3YW50IHRvIHVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIGxpbmtpbmcgZmlsZXMgd2l0aCBhbiB1bnVzdWFsCi1iaW5hcnkgZm9ybWF0LiAgWW91IGNhbiBhbHNvIHVzZSBcYwotLkIgXC1iXGMKLVwmIHRvIHN3aXRjaCBmb3JtYXRzIGV4cGxpY2l0bHkgKHdoZW4KLWxpbmtpbmcgb2JqZWN0IGZpbGVzIG9mIGRpZmZlcmVudCBmb3JtYXRzKSwgYnkgaW5jbHVkaW5nCi1cYwotLkIgXC1iIFxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCZcYwotXCYgYmVmb3JlIGVhY2ggZ3JvdXAgb2Ygb2JqZWN0IGZpbGVzIGluIGEKLXBhcnRpY3VsYXIgZm9ybWF0LiAgCi0KLVRoZSBkZWZhdWx0IGZvcm1hdCBpcyB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotLkIgR05VVEFSR0VUXGMKLVwmLiAgWW91IGNhbiBhbHNvIGRlZmluZSB0aGUgaW5wdXQKLWZvcm1hdCBmcm9tIGEgc2NyaXB0LCB1c2luZyB0aGUgY29tbWFuZCBcYwotLkIgVEFSR0VUXGMKLVwmLgotCi0uVFAKLS5CIFwtQnN0YXRpYyAKLURvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIG9uCi1wbGF0Zm9ybXMgZm9yIHdoaWNoIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4KLQotLlRQCi0uQiBcLUJkeW5hbWljCi1MaW5rIGFnYWluc3QgZHluYW1pYyBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBwbGF0Zm9ybXMKLWZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuICBUaGlzIG9wdGlvbiBpcyBub3JtYWxseSB0aGUKLWRlZmF1bHQgb24gc3VjaCBwbGF0Zm9ybXMuCi0KLS5UUAotLkIgXC1Cc3ltYm9saWMKLVdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYmluZCByZWZlcmVuY2VzIHRvIGdsb2JhbCBzeW1ib2xzIHRvCi10aGUgZGVmaW5pdGlvbiB3aXRoaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBpZiBhbnkuICBOb3JtYWxseSwgaXQgaXMKLXBvc3NpYmxlIGZvciBhIHByb2dyYW0gbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSB0byBvdmVycmlkZSB0aGUKLWRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bAotb24gRUxGIHBsYXRmb3JtcyB3aGljaCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCi0KLS5UUAotLkJJICJcLWMgIiAiY29tbWFuZGZpbGUiCi1EaXJlY3RzIFxjCi0uQiBsZFxjCi1cJiB0byByZWFkIGxpbmsgY29tbWFuZHMgZnJvbSB0aGUgZmlsZQotXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmLiAgVGhlc2UgY29tbWFuZHMgd2lsbCBjb21wbGV0ZWx5IG92ZXJyaWRlIFxjCi0uQiBsZFxjCi1cJidzCi1kZWZhdWx0IGxpbmsgZm9ybWF0IChyYXRoZXIgdGhhbiBhZGRpbmcgdG8gaXQpOyBcYwotLkkgY29tbWFuZGZpbGVcYwotXCYgbXVzdAotc3BlY2lmeSBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byBkZXNjcmliZSB0aGUgdGFyZ2V0IGZvcm1hdC4KLQotCi1Zb3UgbWF5IGFsc28gaW5jbHVkZSBhIHNjcmlwdCBvZiBsaW5rIGNvbW1hbmRzIGRpcmVjdGx5IGluIHRoZSBjb21tYW5kCi1saW5lIGJ5IGJyYWNrZXRpbmcgaXQgYmV0d2VlbiBgXHxcYwotLkIge1xjCi1cfCcgYW5kIGBcfFxjCi0uQiB9XGMKLVx8JyBjaGFyYWN0ZXJzLgotCi0uVFAKLS5CIFwtXC1jcmVmCi1PdXRwdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUuICBJZiBhIGxpbmtlciBtYXAgZmlsZSBpcyBiZWluZwotZ2VuZXJhdGVkLCB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIGlzIHByaW50ZWQgdG8gdGhlIG1hcCBmaWxlLgotT3RoZXJ3aXNlLCBpdCBpcyBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0KLS5UUAotLkIgXC1kIAotLlRQCi0uQiBcLWRjCi0uVFAKLS5CIFwtZHAKLVRoZXNlIHRocmVlIG9wdGlvbnMgYXJlIGVxdWl2YWxlbnQ7IG11bHRpcGxlIGZvcm1zIGFyZSBzdXBwb3J0ZWQgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlua2Vycy4gIFVzZSBhbnkgb2YgdGhlbSB0byBtYWtlIFxjCi0uQiBsZAotYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzIGV2ZW4gaWYgYSByZWxvY2F0YWJsZSBvdXRwdXQgZmlsZSBpcwotc3BlY2lmaWVkIChcYwotLkIgXC1yXGMKLVwmKS4gIFRoZSBzY3JpcHQgY29tbWFuZAotXGMKLS5CIEZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OXGMKLVwmIGhhcyB0aGUgc2FtZSBlZmZlY3QuCi0KLS5UUAotLkJJICItZGVmc3ltICIgInN5bWJvbCIgIlxmUiA9IFxmUCIgZXhwcmVzc2lvbgotQ3JlYXRlIGEgZ2xvYmFsIHN5bWJvbCBpbiB0aGUgb3V0cHV0IGZpbGUsIGNvbnRhaW5pbmcgdGhlIGFic29sdXRlCi1hZGRyZXNzIGdpdmVuIGJ5IFxjCi0uSSBleHByZXNzaW9uXGMKLVwmLiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24gYXMgbWFueQotdGltZXMgYXMgbmVjZXNzYXJ5IHRvIGRlZmluZSBtdWx0aXBsZSBzeW1ib2xzIGluIHRoZSBjb21tYW5kIGxpbmUuICBBCi1saW1pdGVkIGZvcm0gb2YgYXJpdGhtZXRpYyBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBcYwotLkkgZXhwcmVzc2lvblxjCi1cJiBpbiB0aGlzCi1jb250ZXh0OiB5b3UgbWF5IGdpdmUgYSBoZXhhZGVjaW1hbCBjb25zdGFudCBvciB0aGUgbmFtZSBvZiBhbiBleGlzdGluZwotc3ltYm9sLCBvciB1c2UgXGMKLS5CICtcYwotXCYgYW5kIFxjCi0uQiBcLVxjCi1cJiB0byBhZGQgb3Igc3VidHJhY3QgaGV4YWRlY2ltYWwKLWNvbnN0YW50cyBvciBzeW1ib2xzLiAgSWYgeW91IG5lZWQgbW9yZSBlbGFib3JhdGUgZXhwcmVzc2lvbnMsIGNvbnNpZGVyCi11c2luZyB0aGUgbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2UgZnJvbSBhIHNjcmlwdC4KLQotLlRQCi0uQiBcLVwtZGVtYW5nbGUKLS5UUAotLkIgXC1cLW5vXC1kZW1hbmdsZQotVGhlc2Ugb3B0aW9ucyBjb250cm9sIHdoZXRoZXIgdG8gZGVtYW5nbGUgc3ltYm9sIG5hbWVzIGluIGVycm9yCi1tZXNzYWdlcyBhbmQgb3RoZXIgb3V0cHV0LiAgV2hlbiB0aGUgbGlua2VyIGlzIHRvbGQgdG8gZGVtYW5nbGUsIGl0Ci10cmllcyB0byBwcmVzZW50IHN5bWJvbCBuYW1lcyBpbiBhIHJlYWRhYmxlIGZhc2hpb246IGl0IHN0cmlwcyBsZWFkaW5nCi11bmRlcnNjb3JlcyBpZiB0aGV5IGFyZSB1c2VkIGJ5IHRoZSBvYmplY3QgZmlsZSBmb3JtYXQsIGFuZCBjb252ZXJ0cwotQysrIG1hbmdsZWQgc3ltYm9sIG5hbWVzIGludG8gdXNlciByZWFkYWJsZSBuYW1lcy4gIFRoZSBsaW5rZXIgd2lsbAotZGVtYW5nbGUgYnkgZGVmYXVsdCB1bmxlc3MgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0uQiBDT0xMRUNUX05PX0RFTUFOR0xFCi1pcyBzZXQuICBUaGVzZSBvcHRpb25zIG1heSBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0LgotCi0uVFAKLS5CSSAiLWUgIiAiZW50cnkiXGMKLVwmIAotVXNlIFxjCi0uSSBlbnRyeVxjCi1cJiBhcyB0aGUgZXhwbGljaXQgc3ltYm9sIGZvciBiZWdpbm5pbmcgZXhlY3V0aW9uIG9mIHlvdXIKLXByb2dyYW0sIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGVudHJ5IHBvaW50LiAgU2VlIHRoZSBgXHxcYwotLkIgbGRcYwotXHwnIGVudHJ5IGluIGBcfFxjCi0uQiBpbmZvXGMKLVx8JyBmb3IgYQotZGlzY3Vzc2lvbiBvZiBkZWZhdWx0cyBhbmQgb3RoZXIgd2F5cyBvZiBzcGVjaWZ5aW5nIHRoZQotZW50cnkgcG9pbnQuCi0KLS5UUAotLkIgXC1lbWJlZGRlZFwtcmVsb2NzCi1UaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBsaW5raW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUsCi1nZW5lcmF0ZWQgYnkgdGhlCi0uQiBcLW1lbWJlZGRlZFwtcGljCi1vcHRpb24gdG8gdGhlIEdOVSBjb21waWxlciBhbmQgYXNzZW1ibGVyLiAgSXQgY2F1c2VzIHRoZSBsaW5rZXIgdG8KLWNyZWF0ZSBhIHRhYmxlIHdoaWNoIG1heSBiZSB1c2VkIGF0IHJ1bnRpbWUgdG8gcmVsb2NhdGUgYW55IGRhdGEgd2hpY2gKLXdhcyBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHRvIHBvaW50ZXIgdmFsdWVzLiAgU2VlIHRoZSBjb2RlIGluCi10ZXN0c3VpdGUvbGQtZW1waWMgZm9yIGRldGFpbHMuCi0KLS5UUAotLkIgXC1FCi0uVFAKLS5CIFwtZXhwb3J0XC1keW5hbWljCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBmaWxlLCBhZGQgYWxsIHN5bWJvbHMgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotTm9ybWFsbHksIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBjb250YWlucyBvbmx5IHN5bWJvbHMgd2hpY2ggYXJlIHVzZWQKLWJ5IGEgZHluYW1pYyBvYmplY3QuICBUaGlzIG9wdGlvbiBpcyBuZWVkZWQgZm9yIHNvbWUgdXNlcyBvZgotLkkgZGxvcGVuLgotCi0uVFAKLS5CSSAiLWYgIiAibmFtZSIKLS5UUAotLkJJICItLWF1eGlsaWFyeSAiICJuYW1lIgotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9BVVhJTElBUlkgZmllbGQKLXRvIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbAotdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3Qgc2hvdWxkIGJlIHVzZWQgYXMgYW4gYXV4aWxpYXJ5IGZpbHRlciBvbiB0aGUKLXN5bWJvbCB0YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdAotLkkgbmFtZS4KLQotLlRQCi0uQkkgIi1GICIgIm5hbWUiCi0uVFAKLS5CSSAiLS1maWx0ZXIgIiAibmFtZSIKLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfRklMVEVSIGZpZWxkIHRvCi10aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wgdGFibGUKLW9mIHRoZSBzaGFyZWQgb2JqZWN0IHNob3VsZCBiZSB1c2VkIGFzIGEgZmlsdGVyIG9uIHRoZSBzeW1ib2wgdGFibGUgb2YKLXRoZSBzaGFyZWQgb2JqZWN0Ci0uSSBuYW1lLgotCi0uVFAKLS5CSSAiXC1mb3JtYXQgIiAiaW5wdXRcLWZvcm1hdCIKLVN5bm9ueW0gZm9yIFxjCi0uQiBcLWJcYwotXCYgXGMKLS5JIGlucHV0XC1mb3JtYXRcYwotXCYuCi0KLS5UUAotLkIgXC1nCi1BY2NlcHRlZCwgYnV0IGlnbm9yZWQ7IHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgdG9vbHMuCi0KLS5UUAotLkJJICJcLUcgIiAic2l6ZSJcYwotU2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQIHJlZ2lzdGVyCi10bwotLkkgc2l6ZQotdW5kZXIgTUlQUyBFQ09GRi4gIElnbm9yZWQgZm9yIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLS5UUAotLkJJICItaCAiICJuYW1lIgotLlRQCi0uQkkgIi1zb25hbWUgIiAibmFtZSIKLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfU09OQU1FIGZpZWxkIHRvCi10aGUgc3BlY2lmaWVkIG5hbWUuICBXaGVuIGFuIGV4ZWN1dGFibGUgaXMgbGlua2VkIHdpdGggYSBzaGFyZWQgb2JqZWN0Ci13aGljaCBoYXMgYSBEVF9TT05BTUUgZmllbGQsIHRoZW4gd2hlbiB0aGUgZXhlY3V0YWJsZSBpcyBydW4gdGhlIGR5bmFtaWMKLWxpbmtlciB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUgc2hhcmVkIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIERUX1NPTkFNRQotZmllbGQgcmF0aGVyIHRoYW4gdGhlIHVzaW5nIHRoZSBmaWxlIG5hbWUgZ2l2ZW4gdG8gdGhlIGxpbmtlci4KLQotLlRQCi0uQiBcLVwtaGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotVGhpcyBvcHRpb24gYW5kCi0uQiBcLVwtdmVyc2lvbgotYmVnaW4gd2l0aCB0d28gZGFzaGVzIGluc3RlYWQgb2Ygb25lCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIEdOVSBwcm9ncmFtcy4gIFRoZSBvdGhlciBvcHRpb25zIHN0YXJ0IHdpdGgKLW9ubHkgb25lIGRhc2ggZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaW5rZXJzLgotCi0uVFAKLS5CIFwtaQotUGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBsaW5rIChzYW1lIGFzIG9wdGlvbiBcYwotLkIgXC1yXGMKLVwmKS4KLQotLlRQCi0uQkkgIlwtbCIgImFyIlxjCi1cJiAKLUFkZCBhbiBhcmNoaXZlIGZpbGUgXGMKLS5JIGFyXGMKLVwmIHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGxpbmsuICBUaGlzIAotb3B0aW9uIG1heSBiZSB1c2VkIGFueSBudW1iZXIgb2YgdGltZXMuICBcYwotLkIgbGRcYwotXCYgd2lsbCBzZWFyY2ggaXRzCi1wYXRoLWxpc3QgZm9yIG9jY3VycmVuY2VzIG9mIFxjCi0uQiBsaWJcYwotLkkgYXJcYwotXCYuYVxjCi1cJiBmb3IgZXZlcnkgXGMKLS5JIGFyCi1zcGVjaWZpZWQuCi0KLS5UUAotLkJJICJcLUwiICJzZWFyY2hkaXIiCi1UaGlzIGNvbW1hbmQgYWRkcyBwYXRoIFxjCi0uSSBzZWFyY2hkaXJcYwotXCYgdG8gdGhlIGxpc3Qgb2YgcGF0aHMgdGhhdAotXGMKLS5CIGxkXGMKLVwmIHdpbGwgc2VhcmNoIGZvciBhcmNoaXZlIGxpYnJhcmllcy4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uCi1hbnkgbnVtYmVyIG9mIHRpbWVzLgotCi1UaGUgZGVmYXVsdCBzZXQgb2YgcGF0aHMgc2VhcmNoZWQgKHdpdGhvdXQgYmVpbmcgc3BlY2lmaWVkIHdpdGgKLVxjCi0uQiBcLUxcYwotXCYpIGRlcGVuZHMgb24gd2hhdCBlbXVsYXRpb24gbW9kZSBcYwotLkIgbGRcYwotXCYgaXMgdXNpbmcsIGFuZCBpbgotc29tZSBjYXNlcyBhbHNvIG9uIGhvdyBpdCB3YXMgY29uZmlndXJlZC4gICAgVGhlCi1wYXRocyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgaW4gYSBsaW5rIHNjcmlwdCB3aXRoIHRoZSBcYwotLkIgU0VBUkNIX0RJUgotY29tbWFuZC4KLQotLlRQCi0uQiBcLU0gCi1QcmludCAodG8gdGhlIHN0YW5kYXJkIG91dHB1dCBmaWxlKSBhIGxpbmsgbWFwXChlbVwmZGlhZ25vc3RpYyBpbmZvcm1hdGlvbgotYWJvdXQgd2hlcmUgc3ltYm9scyBhcmUgbWFwcGVkIGJ5IFxjCi0uQiBsZFxjCi1cJiwgYW5kIGluZm9ybWF0aW9uIG9uIGdsb2JhbAotY29tbW9uIHN0b3JhZ2UgYWxsb2NhdGlvbi4KLQotLlRQCi0uQkkgIlwtTWFwICIgIm1hcGZpbGUiXGMKLVByaW50IHRvIHRoZSBmaWxlCi0uSSBtYXBmaWxlCi1hIGxpbmsgbWFwXChlbVwmZGlhZ25vc3RpYyBpbmZvcm1hdGlvbgotYWJvdXQgd2hlcmUgc3ltYm9scyBhcmUgbWFwcGVkIGJ5IFxjCi0uQiBsZFxjCi1cJiwgYW5kIGluZm9ybWF0aW9uIG9uIGdsb2JhbAotY29tbW9uIHN0b3JhZ2UgYWxsb2NhdGlvbi4KLQotLlRQCi0uQkkgIlwtbSAiICJlbXVsYXRpb24iXGMKLUVtdWxhdGUgdGhlCi0uSSBlbXVsYXRpb24KLWxpbmtlci4gIFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlIGVtdWxhdGlvbnMgd2l0aCB0aGUKLS5JIFwtXC12ZXJib3NlCi1vcgotLkkgXC1WCi1vcHRpb25zLiAgVGhpcyBvcHRpb24gb3ZlcnJpZGVzIHRoZSBjb21waWxlZC1pbiBkZWZhdWx0LCB3aGljaCBpcyB0aGUKLXN5c3RlbSBmb3Igd2hpY2ggeW91IGNvbmZpZ3VyZWQKLS5CUiBsZCAuCi0KLS5UUAotLkIgXC1OIAotc3BlY2lmaWVzIHJlYWRhYmxlIGFuZCB3cml0YWJsZSBcYwotLkIgdGV4dFxjCi1cJiBhbmQgXGMKLS5CIGRhdGFcYwotXCYgc2VjdGlvbnMuIElmCi10aGUgb3V0cHV0IGZvcm1hdCBzdXBwb3J0cyBVbml4IHN0eWxlIG1hZ2ljIG51bWJlcnMsIHRoZSBvdXRwdXQgaXMKLW1hcmtlZCBhcyBcYwotLkIgT01BR0lDXGMKLVwmLgotCi1XaGVuIHlvdSB1c2UgdGhlIGBcfFxjCi0uQiBcLU5cYwotXCZcfCcgb3B0aW9uLCB0aGUgbGlua2VyIGRvZXMgbm90IHBhZ2UtYWxpZ24gdGhlCi1kYXRhIHNlZ21lbnQuCi0KLS5UUAotLkIgXC1uIAotc2V0cyB0aGUgdGV4dCBzZWdtZW50IHRvIGJlIHJlYWQgb25seSwgYW5kIFxjCi0uQiBOTUFHSUNcYwotXCYgaXMgd3JpdHRlbgotaWYgcG9zc2libGUuCi0KLS5UUAotLkIgXC1ub2luaGliaXRcLWV4ZWMKLU5vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgbm90IHByb2R1Y2UgYW4gb3V0cHV0IGZpbGUgaWYgaXQgZW5jb3VudGVycwotZXJyb3JzIGR1cmluZyB0aGUgbGluayBwcm9jZXNzLiAgV2l0aCB0aGlzIGZsYWcsIHlvdSBjYW4gc3BlY2lmeSB0aGF0Ci15b3Ugd2lzaCB0aGUgb3V0cHV0IGZpbGUgcmV0YWluZWQgZXZlbiBhZnRlciBub24tZmF0YWwgZXJyb3JzLgotCi0uVFAKLS5CIFwtbm9cLWtlZXBcLW1lbW9yeQotVGhlIGxpbmtlciBub3JtYWxseSBvcHRpbWl6ZXMgZm9yIHNwZWVkIG92ZXIgbWVtb3J5IHVzYWdlIGJ5IGNhY2hpbmcKLXRoZSBzeW1ib2wgdGFibGVzIG9mIGlucHV0IGZpbGVzIGluIG1lbW9yeS4gIFRoaXMgb3B0aW9uIHRlbGxzIHRoZQotbGlua2VyIHRvIGluc3RlYWQgb3B0aW1pemUgZm9yIG1lbW9yeSB1c2FnZSwgYnkgcmVyZWFkaW5nIHRoZSBzeW1ib2wKLXRhYmxlcyBhcyBuZWNlc3NhcnkuICBUaGlzIG1heSBiZSByZXF1aXJlZCBpZiB0aGUgbGlua2VyIHJ1bnMgb3V0IG9mCi1tZW1vcnkgc3BhY2Ugd2hpbGUgbGlua2luZyBhIGxhcmdlIGV4ZWN1dGFibGUuCi0KLS5UUAotLkIgXC1ub1wtd2FyblwtbWlzbWF0Y2gKLU5vcm1hbGx5IHRoZSBsaW5rZXIgd2lsbCBnaXZlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gbGluayB0b2dldGhlcgotaW5wdXQgZmlsZXMgdGhhdCBhcmUgbWlzbWF0Y2hlZCBmb3Igc29tZSByZWFzb24sIHBlcmhhcHMgYmVjYXVzZSB0aGV5Ci1oYXZlIGJlZW4gY29tcGlsZWQgZm9yIGRpZmZlcmVudCBwcm9jZXNzb3JzIG9yIGZvciBkaWZmZXJlbnQKLWVuZGlhbm5lc3Nlcy4gIFRoaXMgb3B0aW9uIHRlbGxzIHRoZSBsaW5rZXIgdGhhdCBpdCBzaG91bGQgc2lsZW50bHkKLXBlcm1pdCBzdWNoIHBvc3NpYmxlIGVycm9ycy4gIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aAotY2FyZSwgaW4gY2FzZXMgd2hlbiB5b3UgaGF2ZSB0YWtlbiBzb21lIHNwZWNpYWwgYWN0aW9uIHRoYXQgZW5zdXJlcwotdGhhdCB0aGUgbGlua2VyIGVycm9ycyBhcmUgaW5hcHByb3ByaWF0ZS4KLQotLlRQCi0uQkkgIlwtbyAiICJvdXRwdXQiCi0uSSBvdXRwdXRcYwotXCYgaXMgYSBuYW1lIGZvciB0aGUgcHJvZ3JhbSBwcm9kdWNlZCBieSBcYwotLkIgbGRcYwotXCY7IGlmIHRoaXMKLW9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSBgXHxcYwotLkIgYS5vdXRcYwotXHwnIGlzIHVzZWQgYnkgZGVmYXVsdC4gIFRoZQotc2NyaXB0IGNvbW1hbmQgXGMKLS5CIE9VVFBVVFxjCi1cJiBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBuYW1lLgotCi0uVFAKLS5CSSAiXC1PIiAibGV2ZWwiCi1HZW5lcmF0ZSBvcHRpbWl6ZWQgb3V0cHV0IGZpbGVzLiAgVGhpcyBtaWdodCB1c2Ugc2lnbmlmaWNhbnRseSBtb3JlCi10aW1lIGFuZCB0aGVyZWZvcmUgcHJvYmFibHkgc2hvdWxkIGJlIGVuYWJsZWQgb25seSBmb3IgZ2VuZXJhdGluZyB0aGUKLWZpbmFsIGJpbmFyeS4KLVxjCi0uSSBsZXZlbFxjCi1cJiBpcyBzdXBwb3NlZCB0byBiZSBhIG51bWVyaWMgdmFsdWUuICBBbnkgdmFsdWUgZ3JlYXRlciB0aGFuIHplcm8gZW5hYmxlcwotdGhlIG9wdGltaXphdGlvbnMuCi0KLS5UUAotLkJJICJcLW9mb3JtYXQgIiAib3V0cHV0XC1mb3JtYXQiCi1TcGVjaWZ5IHRoZSBiaW5hcnkgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9iamVjdCBmaWxlLgotWW91IGRvbid0IHVzdWFsbHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMsIGFzCi1cYwotLkIgbGRcYwotXCYgaXMgY29uZmlndXJlZCB0byBwcm9kdWNlIGFzIGEgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRoZSBtb3N0Ci11c3VhbCBmb3JtYXQgb24gZWFjaCBtYWNoaW5lLiAgXGMKLS5JIG91dHB1dC1mb3JtYXRcYwotXCYgaXMgYSB0ZXh0IHN0cmluZywgdGhlCi1uYW1lIG9mIGEgcGFydGljdWxhciBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgCi1UaGUgc2NyaXB0IGNvbW1hbmQKLS5CIE9VVFBVVF9GT1JNQVQKLWNhbiBhbHNvIHNwZWNpZnkgdGhlIG91dHB1dCBmb3JtYXQsIGJ1dCB0aGlzIG9wdGlvbiBvdmVycmlkZXMgaXQuCi0KLS5UUAotLkJJICJcLVIgIiAiZmlsZW5hbWUiCi1SZWFkIHN5bWJvbCBuYW1lcyBhbmQgdGhlaXIgYWRkcmVzc2VzIGZyb20gXGMKLS5JIGZpbGVuYW1lXGMKLVwmLCBidXQgZG8gbm90Ci1yZWxvY2F0ZSBpdCBvciBpbmNsdWRlIGl0IGluIHRoZSBvdXRwdXQuICBUaGlzIGFsbG93cyB5b3VyIG91dHB1dCBmaWxlCi10byByZWZlciBzeW1ib2xpY2FsbHkgdG8gYWJzb2x1dGUgbG9jYXRpb25zIG9mIG1lbW9yeSBkZWZpbmVkIGluIG90aGVyCi1wcm9ncmFtcy4KLQotLlRQCi0uQiBcLXJlbGF4Ci1BbiBvcHRpb24gd2l0aCBtYWNoaW5lIGRlcGVuZGVudCBlZmZlY3RzLiAgQ3VycmVudGx5IHRoaXMgb3B0aW9uIGlzIG9ubHkKLXN1cHBvcnRlZCBvbiB0aGUgSDgvMzAwLgotCi1PbiBzb21lIHBsYXRmb3JtcywgdXNlIHRoaXMgb3B0aW9uIHRvIHBlcmZvcm0gZ2xvYmFsIG9wdGltaXphdGlvbnMgdGhhdAotYmVjb21lIHBvc3NpYmxlIHdoZW4gdGhlIGxpbmtlciByZXNvbHZlcyBhZGRyZXNzaW5nIGluIHlvdXIgcHJvZ3JhbSwgc3VjaAotYXMgcmVsYXhpbmcgYWRkcmVzcyBtb2RlcyBhbmQgc3ludGhlc2l6aW5nIG5ldyBpbnN0cnVjdGlvbnMgaW4gdGhlCi1vdXRwdXQgb2JqZWN0IGZpbGUuICAKLQotT24gcGxhdGZvcm1zIHdoZXJlIHRoaXMgaXMgbm90IHN1cHBvcnRlZCwgYFx8XGMKLS5CIFwtcmVsYXhcYwotXCZcfCcgaXMgYWNjZXB0ZWQsIGJ1dCBoYXMgbm8gZWZmZWN0LgotCi0uVFAKLS5CIFwtciAKLUdlbmVyYXRlcyByZWxvY2F0YWJsZSBvdXRwdXRcKGVtXCZpLmUuLCBnZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZSB0aGF0IGNhbiBpbgotdHVybiBzZXJ2ZSBhcyBpbnB1dCB0byBcYwotLkIgbGRcYwotXCYuICBUaGlzIGlzIG9mdGVuIGNhbGxlZCBcYwotLkkgcGFydGlhbAotbGlua2luZ1xjCi1cJi4gIEFzIGEgc2lkZSBlZmZlY3QsIGluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgc3RhbmRhcmQgVW5peAotbWFnaWMgbnVtYmVycywgdGhpcyBvcHRpb24gYWxzbyBzZXRzIHRoZSBvdXRwdXQgZmlsZSdzIG1hZ2ljIG51bWJlciB0bwotXGMKLS5CIE9NQUdJQ1xjCi1cJi4KLUlmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIGFuIGFic29sdXRlIGZpbGUgaXMgcHJvZHVjZWQuICBXaGVuCi1saW5raW5nIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gXGMKLS5JIHdpbGwgbm90XGMKLVwmIHJlc29sdmUgcmVmZXJlbmNlcyB0bwotY29uc3RydWN0b3JzOyBcYwotLkIgXC1VclxjCi1cJiBpcyBhbiBhbHRlcm5hdGl2ZS4gCi0KLVRoaXMgb3B0aW9uIGRvZXMgdGhlIHNhbWUgYXMgXGMKLS5CIFwtaVxjCi1cJi4KLQotLlRQCi0uQiBcLXJwYXRoXCBcZklkaXJlY3RvcnkKLUFkZCBhIGRpcmVjdG9yeSB0byB0aGUgcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAgVGhpcyBpcyB1c2VkIHdoZW4KLWxpbmtpbmcgYW4gRUxGIGV4ZWN1dGFibGUgd2l0aCBzaGFyZWQgb2JqZWN0cy4gIEFsbCAKLS5CIFwtcnBhdGgKLWFyZ3VtZW50cyBhcmUgY29uY2F0ZW5hdGVkIGFuZCBwYXNzZWQgdG8gdGhlIHJ1bnRpbWUgbGlua2VyLCB3aGljaCB1c2VzCi10aGVtIHRvIGxvY2F0ZSBzaGFyZWQgb2JqZWN0cyBhdCBydW50aW1lLiAgVGhlCi0uQiBcLXJwYXRoCi1vcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gbG9jYXRpbmcgc2hhcmVkIG9iamVjdHMgd2hpY2ggYXJlIG5lZWRlZCBieQotc2hhcmVkIG9iamVjdHMgZXhwbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgbGluazsgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZgotdGhlCi0uQiBcLXJwYXRoXC1saW5rCi1vcHRpb24uICBJZgotLkIgXC1ycGF0aAotaXMgbm90IHVzZWQgd2hlbiBsaW5raW5nIGFuIEVMRiBleGVjdXRhYmxlLCB0aGUgY29udGVudHMgb2YgdGhlCi1lbnZpcm9ubWVudCB2YXJpYWJsZQotLkIgTERfUlVOX1BBVEgKLXdpbGwgYmUgdXNlZCBpZiBpdCBpcyBkZWZpbmVkLgotCi1UaGUKLS5CIFwtcnBhdGgKLW9wdGlvbiBtYXkgYWxzbyBiZSB1c2VkIG9uIFN1bk9TLiAgQnkgZGVmYXVsdCwgb24gU3VuT1MsIHRoZSBsaW5rZXIKLXdpbGwgZm9ybSBhIHJ1bnRpbWUgc2VhcmNoIHBhdGggb3V0IG9mIGFsbCB0aGUKLS5CIFwtTAotb3B0aW9ucyBpdCBpcyBnaXZlbi4gIElmIGEKLS5CIFwtcnBhdGgKLW9wdGlvbiBpcyB1c2VkLCB0aGUgcnVudGltZSBzZWFyY2ggcGF0aCB3aWxsIGJlIGZvcm1lZCBleGNsdXNpdmVseQotdXNpbmcgdGhlCi0uQiBcLXJwYXRoCi1vcHRpb25zLCBpZ25vcmluZwotdGhlCi0uQiBcLUwKLW9wdGlvbnMuICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB1c2luZyBnY2MsIHdoaWNoIGFkZHMgbWFueQotLkIgXC1MCi1vcHRpb25zIHdoaWNoIG1heSBiZSBvbiBORlMgbW91bnRlZCBmaWxlc3lzdGVtcy4KLQotLlRQCi0uQiBcLXJwYXRoXC1saW5rXCBcZklkaXJlY3RvcnkKLVdoZW4gdXNpbmcgRUxGIG9yIFN1bk9TLCBvbmUgc2hhcmVkIGxpYnJhcnkgbWF5IHJlcXVpcmUgYW5vdGhlci4gIFRoaXMKLWhhcHBlbnMgd2hlbiBhbgotLkIgbGRcIFwtc2hhcmVkCi1saW5rIGluY2x1ZGVzIGEgc2hhcmVkIGxpYnJhcnkgYXMgb25lIG9mIHRoZSBpbnB1dCBmaWxlcy4KLQotV2hlbiB0aGUgbGlua2VyIGVuY291bnRlcnMgc3VjaCBhIGRlcGVuZGVuY3kgd2hlbiBkb2luZyBhIG5vbi1zaGFyZWQsCi1ub24tcmVsb2NhdGVhYmxlIGxpbmssIGl0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gbG9jYXRlIHRoZSByZXF1aXJlZAotc2hhcmVkIGxpYnJhcnkgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIGxpbmssIGlmIGl0IGlzIG5vdCBpbmNsdWRlZAotZXhwbGljaXRseS4gIEluIHN1Y2ggYSBjYXNlLCB0aGUKLS5CIFwtcnBhdGhcLWxpbmsKLW9wdGlvbiBzcGVjaWZpZXMgdGhlIGZpcnN0IHNldCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2guICBUaGUKLS5CIFwtcnBhdGhcLWxpbmsKLW9wdGlvbiBtYXkgc3BlY2lmeSBhIHNlcXVlbmNlIG9mIGRpcmVjdG9yeSBuYW1lcyBlaXRoZXIgYnkgc3BlY2lmeWluZwotYSBsaXN0IG9mIG5hbWVzIHNlcGFyYXRlZCBieSBjb2xvbnMsIG9yIGJ5IGFwcGVhcmluZyBtdWx0aXBsZSB0aW1lcy4KLQotSWYgdGhlIHJlcXVpcmVkIHNoYXJlZCBsaWJyYXJ5IGlzIG5vdCBmb3VuZCwgdGhlIGxpbmtlciB3aWxsIGlzc3VlIGEKLXdhcm5pbmcgYW5kIGNvbnRpbnVlIHdpdGggdGhlIGxpbmsuCi0KLS5UUAotLkIgXC1TIAotT21pdHMgZGVidWdnZXIgc3ltYm9sIGluZm9ybWF0aW9uIChidXQgbm90IGFsbCBzeW1ib2xzKSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotLlRQCi0uQiBcLXMgCi1PbWl0cyBhbGwgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gdGhlIG91dHB1dCBmaWxlLgotCi0uVFAKLS5CIFwtc2hhcmVkCi1DcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIG9uIEVMRiBhbmQKLVN1bk9TIHBsYXRmb3JtcyAob24gU3VuT1MgaXQgaXMgbm90IHJlcXVpcmVkLCBhcyB0aGUgbGlua2VyIHdpbGwKLWF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgd2hlbiB0aGVyZSBhcmUgdW5kZWZpbmVkIHN5bWJvbHMKLWFuZCB0aGUKLS5CIFwtZQotb3B0aW9uIGlzIG5vdCB1c2VkKS4KLQotLlRQCi0uQiBcLXNvcnRcLWNvbW1vbgotTm9ybWFsbHksIHdoZW4KLS5CIGxkCi1wbGFjZXMgdGhlIGdsb2JhbCBjb21tb24gc3ltYm9scyBpbiB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IHNlY3Rpb25zLAotaXQgc29ydHMgdGhlbSBieSBzaXplLiAgRmlyc3QgY29tZSBhbGwgdGhlIG9uZSBieXRlIHN5bWJvbHMsIHRoZW4gYWxsCi10aGUgdHdvIGJ5dGVzLCB0aGVuIGFsbCB0aGUgZm91ciBieXRlcywgYW5kIHRoZW4gZXZlcnl0aGluZyBlbHNlLgotVGhpcyBpcyB0byBwcmV2ZW50IGdhcHMgYmV0d2VlbiBzeW1ib2xzIGR1ZSB0bwotYWxpZ25tZW50IGNvbnN0cmFpbnRzLiAgVGhpcyBvcHRpb24gZGlzYWJsZXMgdGhhdCBzb3J0aW5nLgotCi0uVFAKLS5CIFwtc3BsaXRcLWJ5XC1yZWxvY1wgXGZJY291bnQKLVRyeXMgdG8gY3JlYXRlcyBleHRyYSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUgc28gdGhhdCBubyBzaW5nbGUKLW91dHB1dCBzZWN0aW9uIGluIHRoZSBmaWxlIGNvbnRhaW5zIG1vcmUgdGhhbgotLkkgY291bnQKLXJlbG9jYXRpb25zLgotVGhpcyBpcyB1c2VmdWwgd2hlbiBnZW5lcmF0aW5nIGh1Z2UgcmVsb2NhdGFibGUgZm9yIGRvd25sb2FkaW5nIGludG8KLWNlcnRhaW4gcmVhbCB0aW1lIGtlcm5lbHMgd2l0aCB0aGUgQ09GRiBvYmplY3QgZmlsZSBmb3JtYXQ7IHNpbmNlIENPRkYKLWNhbm5vdCByZXByZXNlbnQgbW9yZSB0aGFuIDY1NTM1IHJlbG9jYXRpb25zIGluIGEgc2luZ2xlIHNlY3Rpb24uCi1Ob3RlIHRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gd29yayB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMgd2hpY2ggZG8gbm90Ci1zdXBwb3J0IGFyYml0cmFyeSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgd2lsbCBub3Qgc3BsaXQgdXAgaW5kaXZpZHVhbAotaW5wdXQgc2VjdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uLCBzbyBpZiBhIHNpbmdsZSBpbnB1dCBzZWN0aW9uCi1jb250YWlucyBtb3JlIHRoYW4KLS5JIGNvdW50Ci1yZWxvY2F0aW9ucyBvbmUgb3V0cHV0IHNlY3Rpb24gd2lsbCBjb250YWluIHRoYXQgbWFueSByZWxvY2F0aW9ucy4KLQotLlRQCi0uQiBcLXNwbGl0XC1ieVwtZmlsZQotU2ltaWxhciB0bwotLkIgXC1zcGxpdFwtYnlcLXJlbG9jCi1idXQgY3JlYXRlcyBhIG5ldyBvdXRwdXQgc2VjdGlvbiBmb3IgZWFjaCBpbnB1dCBmaWxlLgotCi0uVFAKLS5CSSAiXC1UYnNzICIgIm9yZyJcYwotLlRQCi0uQkkgIlwtVGRhdGEgIiAib3JnIlxjCi0uVFAKLS5CSSAiXC1UdGV4dCAiICJvcmciXGMKLVVzZSBcYwotLkkgb3JnXGMKLVwmIGFzIHRoZSBzdGFydGluZyBhZGRyZXNzIGZvclwoZW1cJnJlc3BlY3RpdmVseVwoZW1cJnRoZQotXGMKLS5CIGJzc1xjCi1cJiwgXGMKLS5CIGRhdGFcYwotXCYsIG9yIHRoZSBcYwotLkIgdGV4dFxjCi1cJiBzZWdtZW50IG9mIHRoZSBvdXRwdXQgZmlsZS4KLVxjCi0uSSBvcmdcYwotXCYgbXVzdCBiZSBhIGhleGFkZWNpbWFsIGludGVnZXIuCi0KLS5UUAotLkJJICJcLVQgIiAiY29tbWFuZGZpbGUiCi1FcXVpdmFsZW50IHRvIFxjCi0uQiBcLWMgXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmXGMKLVwmOyBzdXBwb3J0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotb3RoZXIgdG9vbHMuICAKLQotLlRQCi0uQiBcLXQgCi1QcmludHMgbmFtZXMgb2YgaW5wdXQgZmlsZXMgYXMgXGMKLS5CIGxkXGMKLVwmIHByb2Nlc3NlcyB0aGVtLgotCi0uVFAKLS5CSSAiXC11ICIgInN5bSIKLUZvcmNlcyBcYwotLkkgc3ltXGMKLVwmIHRvIGJlIGVudGVyZWQgaW4gdGhlIG91dHB1dCBmaWxlIGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi1UaGlzIG1heSwgZm9yIGV4YW1wbGUsIHRyaWdnZXIgbGlua2luZyBvZiBhZGRpdGlvbmFsIG1vZHVsZXMgZnJvbQotc3RhbmRhcmQgbGlicmFyaWVzLiAgXGMKLS5CIFwtdVxjCi1cJiBtYXkgYmUgcmVwZWF0ZWQgd2l0aCBkaWZmZXJlbnQgb3B0aW9uCi1hcmd1bWVudHMgdG8gZW50ZXIgYWRkaXRpb25hbCB1bmRlZmluZWQgc3ltYm9scy4KLQotLlRQCi0uQiBcLVVyIAotRm9yIGFueXRoaW5nIG90aGVyIHRoYW4gQysrIHByb2dyYW1zLCB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvCi1cYwotLkIgXC1yXGMKLVwmOiBpdCBnZW5lcmF0ZXMgcmVsb2NhdGFibGUgb3V0cHV0XChlbVwmaS5lLiwgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KLXR1cm4gc2VydmUgYXMgaW5wdXQgdG8gXGMKLS5CIGxkXGMKLVwmLiAgV2hlbiBsaW5raW5nIEMrKyBwcm9ncmFtcywgXGMKLS5CIFwtVXIKLS5JIHdpbGxcYwotXCYgcmVzb2x2ZSByZWZlcmVuY2VzIHRvIGNvbnN0cnVjdG9ycywgdW5saWtlIFxjCi0uQiBcLXJcYwotXCYuCi0KLS5UUAotLkIgXC1cLXZlcmJvc2UKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBcYwotLkIgbGQKLWFuZCBsaXN0IHRoZSBzdXBwb3J0ZWQgZW11bGF0aW9ucy4KLURpc3BsYXkgd2hpY2ggaW5wdXQgZmlsZXMgY2FuIGFuZCBjYW4gbm90IGJlIG9wZW5lZC4KLQotLlRQCi0uQiBcLXYsIFwtVgotRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIFxjCi0uQiBsZFxjCi1cJi4KLVRoZQotLkIgXC1WCi1vcHRpb24gYWxzbyBsaXN0cyB0aGUgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi0KLS5UUAotLkIgXC1cLXZlcnNpb24KLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBcYwotLkIgbGQKLWFuZCBleGl0LgotCi0uVFAKLS5CIFwtd2FyblwtY29tbW9uCi1XYXJuIHdoZW4gYSBjb21tb24gc3ltYm9sIGlzIGNvbWJpbmVkIHdpdGggYW5vdGhlciBjb21tb24gc3ltYm9sIG9yIHdpdGgKLWEgc3ltYm9sIGRlZmluaXRpb24uICBVbml4IGxpbmtlcnMgYWxsb3cgdGhpcyBzb21ld2hhdCBzbG9wcHkgcHJhY3RpY2UsCi1idXQgbGlua2VycyBvbiBzb21lIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIGRvIG5vdC4gIFRoaXMgb3B0aW9uIGFsbG93cwoteW91IHRvIGZpbmQgcG90ZW50aWFsIHByb2JsZW1zIGZyb20gY29tYmluaW5nIGdsb2JhbCBzeW1ib2xzLgotCi0uVFAKLS5CIFwtd2FyblwtY29uc3RydWN0b3JzCi1XYXJuIGlmIGFueSBnbG9iYWwgY29uc3RydWN0b3JzIGFyZSB1c2VkLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgYQotZmV3IG9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgZm9ybWF0cyBsaWtlIENPRkYgb3IgRUxGLCB0aGUgbGlua2VyIGNhbgotbm90IGRldGVjdCB0aGUgdXNlIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMuCi0KLS5UUAotLkIgXC13YXJuXC1tdWx0aXBsZVwtZ3AKLVdhcm4gaWYgdGhlIG91dHB1dCBmaWxlIHJlcXVpcmVzIG11bHRpcGxlIGdsb2JhbC1wb2ludGVyIHZhbHVlcy4gIFRoaXMKLW9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGNlcnRhaW4gcHJvY2Vzc29ycywgc3VjaCBhcyB0aGUgQWxwaGEuCi0KLS5UUAotLkIgXC13YXJuXC1vbmNlCi1Pbmx5IHdhcm4gb25jZSBmb3IgZWFjaCB1bmRlZmluZWQgc3ltYm9sLCByYXRoZXIgdGhhbiBvbmNlIHBlciBtb2R1bGUKLXdoaWNoIHJlZmVycyB0byBpdC4KLQotLlRQCi0uQiBcLXdhcm5cLXNlY3Rpb25cLWFsaWduCi1XYXJuIGlmIHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uIGlzIGNoYW5nZWQgYmVjYXVzZSBvZgotYWxpZ25tZW50LiAgVHlwaWNhbGx5LCB0aGUgYWxpZ25tZW50IHdpbGwgYmUgc2V0IGJ5IGFuIGlucHV0IHNlY3Rpb24uCi1UaGUgYWRkcmVzcyB3aWxsIG9ubHkgYmUgY2hhbmdlZCBpZiBpdCBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQ7IHRoYXQKLWlzLCBpZiB0aGUgU0VDVElPTlMgY29tbWFuZCBkb2VzIG5vdCBzcGVjaWZ5IGEgc3RhcnQgYWRkcmVzcyBmb3IgdGhlCi1zZWN0aW9uLgotCi0uVFAKLS5CIFwtXC13aG9sZVwtYXJjaGl2ZQotRm9yIGVhY2ggYXJjaGl2ZSBtZW50aW9uZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhZnRlciB0aGUKLS5CIFwtXC13aG9sZVwtYXJjaGl2ZQotb3B0aW9uLCBpbmNsdWRlIGV2ZXJ5IG9iamVjdCBmaWxlIGluIHRoZSBhcmNoaXZlIGluIHRoZSBsaW5rLCByYXRoZXIKLXRoYW4gc2VhcmNoaW5nIHRoZSBhcmNoaXZlIGZvciB0aGUgcmVxdWlyZWQgb2JqZWN0IGZpbGVzLiAgVGhpcyBpcwotbm9ybWFsbHkgdXNlZCB0byB0dXJuIGFuIGFyY2hpdmUgZmlsZSBpbnRvIGEgc2hhcmVkIGxpYnJhcnksIGZvcmNpbmcKLWV2ZXJ5IG9iamVjdCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHNoYXJlZCBsaWJyYXJ5LgotCi0uVFAKLS5CIFwtXC1ub1wtd2hvbGVcLWFyY2hpdmUKLVR1cm4gb2ZmIHRoZSBlZmZlY3Qgb2YgdGhlCi0uQiBcLVwtd2hvbGVcLWFyY2hpdmUKLW9wdGlvbiBmb3IgYXJjaGl2ZXMgd2hpY2ggYXBwZWFyIGxhdGVyIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLS5UUAotLkJJICItLXdyYXAgIiAic3ltYm9sIgotVXNlIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgCi0uSSBzeW1ib2wuCi1BbnkgdW5kZWZpbmVkIHJlZmVyZW5jZSB0bwotLkkgc3ltYm9sCi13aWxsIGJlIHJlc29sdmVkIHRvCi0uQkkgIl9fd3JhcF8iICJzeW1ib2wiLgotQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KLS5CSSAiX19yZWFsXyIgInN5bWJvbCIKLXdpbGwgYmUgcmVzb2x2ZWQgdG8KLS5JIHN5bWJvbC4KLQotLlRQCi0uQiBcLVggCi1EZWxldGUgYWxsIHRlbXBvcmFyeSBsb2NhbCBzeW1ib2xzLiAgRm9yIG1vc3QgdGFyZ2V0cywgdGhpcyBpcyBhbGwgbG9jYWwKLXN5bWJvbHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBgXHxcYwotLkIgTFxjCi1cfCcuCi0KLS5UUAotLkIgXC14Ci1EZWxldGUgYWxsIGxvY2FsIHN5bWJvbHMuCi0KLS5QUAotCi0uU0ggRU5WSVJPTk1FTlQKLVxjCi1Zb3UgY2FuIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKLS5CIGxkXGMKLVwmIHdpdGggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxjCi0uQiBHTlVUQVJHRVRcYwotXCYuCi0KLVxjCi0uQiBHTlVUQVJHRVRcYwotXCYgZGV0ZXJtaW5lcyB0aGUgaW5wdXQtZmlsZSBvYmplY3QgZm9ybWF0IGlmIHlvdSBkb24ndAotdXNlIFxjCi0uQiBcLWJcYwotXCYgKG9yIGl0cyBzeW5vbnltIFxjCi0uQiBcLWZvcm1hdFxjCi1cJikuICBJdHMgdmFsdWUgc2hvdWxkIGJlIG9uZQotb2YgdGhlIEJGRCBuYW1lcyBmb3IgYW4gaW5wdXQgZm9ybWF0LiAgSWYgdGhlcmUgaXMgbm8KLVxjCi0uQiBHTlVUQVJHRVRcYwotXCYgaW4gdGhlIGVudmlyb25tZW50LCBcYwotLkIgbGRcYwotXCYgdXNlcyB0aGUgbmF0dXJhbCBmb3JtYXQKLW9mIHRoZSBob3N0LiBJZiBcYwotLkIgR05VVEFSR0VUXGMKLVwmIGlzIHNldCB0byBcYwotLkIgZGVmYXVsdFxjCi1cJiB0aGVuIEJGRCBhdHRlbXB0cyB0byBkaXNjb3ZlciB0aGUKLWlucHV0IGZvcm1hdCBieSBleGFtaW5pbmcgYmluYXJ5IGlucHV0IGZpbGVzOyB0aGlzIG1ldGhvZCBvZnRlbgotc3VjY2VlZHMsIGJ1dCB0aGVyZSBhcmUgcG90ZW50aWFsIGFtYmlndWl0aWVzLCBzaW5jZSB0aGVyZSBpcyBubyBtZXRob2QKLW9mIGVuc3VyaW5nIHRoYXQgdGhlIG1hZ2ljIG51bWJlciB1c2VkIHRvIGZsYWcgb2JqZWN0LWZpbGUgZm9ybWF0cyBpcwotdW5pcXVlLiAgSG93ZXZlciwgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlIGZvciBCRkQgb24gZWFjaCBzeXN0ZW0KLXBsYWNlcyB0aGUgY29udmVudGlvbmFsIGZvcm1hdCBmb3IgdGhhdCBzeXN0ZW0gZmlyc3QgaW4gdGhlIHNlYXJjaC1saXN0LAotc28gYW1iaWd1aXRpZXMgYXJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvbnZlbnRpb24uCi0KLS5QUAotCi0uU0ggIlNFRSBBTFNPIgotCi0uQlIgb2JqZHVtcCAoIDEgKQotLmJyCi0uYnIKLS5SQiAiYFx8IiBsZCAiXHwnIGFuZCBgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyaWVzIGluCi0uQiBpbmZvXGMKLS5icgotLkkgCi1sZDogdGhlIEdOVSBsaW5rZXJcYwotLCBTdGV2ZSBDaGFtYmVybGFpbiBhbmQgUm9sYW5kIFBlc2NoOwotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi0sIFJvbGFuZCBILiBQZXNjaC4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvbGQvbGQuaCBiL2xkL2xkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNTNiOTguLjAwMDAwMDAKLS0tIGEvbGQvbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKiBsZC5oIC0tIGdlbmVyYWwgbGlua2VyIGhlYWRlciBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRF9ICi0jZGVmaW5lIExEX0gKLQotI2lmZGVmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9OTFMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotIyBkZWZpbmUgXyhTdHJpbmcpIGdldHRleHQgKFN0cmluZykKLSMgaWZkZWYgZ2V0dGV4dF9ub29wCi0jICBkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKLSMgZWxzZQotIyAgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSMgZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotIyBkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0vKiBMb29rIGluIHRoaXMgZW52aXJvbm1lbnQgbmFtZSBmb3IgdGhlIGxpbmtlciB0byBwcmV0ZW5kIHRvIGJlICovCi0jZGVmaW5lIEVNVUxBVElPTl9FTlZJUk9OICJMREVNVUxBVElPTiIKLS8qIElmIGluIHRoZXJlIGxvb2sgZm9yIHRoZSBzdHJpbmdzOiAqLwotCi0vKiBMb29rIGluIHRoaXMgdmFyaWFibGUgZm9yIGEgdGFyZ2V0IGZvcm1hdCAqLwotI2RlZmluZSBUQVJHRVRfRU5WSVJPTiAiR05VVEFSR0VUIgotCi0vKiBJbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgcHV0IGluIGEgc2VjdGlvbiBvZiB0aGlzIG5hbWUgYXJlIGFjdHVhbGx5Ci0gICBkaXNjYXJkZWQuICAqLwotI2RlZmluZSBESVNDQVJEX1NFQ1RJT05fTkFNRSAiL0RJU0NBUkQvIgotCi0vKiBBIGZpbGUgbmFtZSBsaXN0ICovCi10eXBlZGVmIHN0cnVjdCBuYW1lX2xpc3QKLXsKLSAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICBzdHJ1Y3QgbmFtZV9saXN0ICpuZXh0OwotfSBuYW1lX2xpc3Q7Ci0KLS8qIEEgd2lsZGNhcmQgc3BlY2lmaWNhdGlvbi4gIFRoaXMgaXMgb25seSB1c2VkIGluIGxkZ3JhbS55LCBidXQgaXQKLSAgIHdpbmRzIHVwIGluIGxkZ3JhbS5oLCBzbyB3ZSBuZWVkIHRvIGRlZmluZSBpdCBvdXRzaWRlLiAgKi8KLQotc3RydWN0IHdpbGRjYXJkX3NwZWMKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3RydWN0IG5hbWVfbGlzdCAqZXhjbHVkZV9uYW1lX2xpc3Q7Ci0gIGJvb2xlYW4gc29ydGVkOwotfTsKLQotLyogRXh0cmEgaW5mb3JtYXRpb24gd2UgaG9sZCBvbiBzZWN0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QgIHVzZXJfc2VjdGlvbl9zdHJ1Y3QKLXsKLSAgLyogUG9pbnRlciB0byB0aGUgc2VjdGlvbiB3aGVyZSB0aGlzIGRhdGEgd2lsbCBnbyAqLwotICBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICpmaWxlOwotfSBzZWN0aW9uX3VzZXJkYXRhX3R5cGU7Ci0KLQotI2RlZmluZSBnZXRfdXNlcmRhdGEoeCkgKCh4KS0+dXNlcmRhdGEpCi0KLSNkZWZpbmUgQllURV9TSVpFCSgxKQotI2RlZmluZSBTSE9SVF9TSVpFCSgyKQotI2RlZmluZSBMT05HX1NJWkUJKDQpCi0jZGVmaW5lIFFVQURfU0laRQkoOCkKLQotLyogQUxJR04gbWFjcm8gY2hhbmdlZCB0byBBTElHTl9OIHRvIGF2b2lkCSovCi0vKiBjb25mbGljdCBpbiAvdXNyL2luY2x1ZGUvbWFjaGluZS9tYWNocGFyYW0uaCAqLwotLyogV0FSTklORzogSWYgVEhJUyBpcyBhIDY0IGJpdCBhZGRyZXNzIGFuZCBCT1VOREFSWSBpcyBhIDMyIGJpdCBpbnQsCi0gICB5b3UgbXVzdCBjb2VyY2UgYm91bmRhcnkgdG8gdGhlIHNhbWUgdHlwZSBhcyBUSElTLgotICAgPz8/IElzIHRoZXJlIGEgcG9ydGFibGUgd2F5IHRvIGF2b2lkIHRoaXMuICAqLwotI2RlZmluZSBBTElHTl9OKHRoaXMsIGJvdW5kYXJ5KSBcCi0gICgoKCAodGhpcykgKyAoKGJvdW5kYXJ5KSAtMSkpICYgKH4oKGJvdW5kYXJ5KS0xKSkpKQotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiAxID0+IGFzc2lnbiBzcGFjZSB0byBjb21tb24gc3ltYm9scyBldmVuIGlmIGByZWxvY2F0YWJsZV9vdXRwdXQnLiAgKi8KLSAgYm9vbGVhbiBmb3JjZV9jb21tb25fZGVmaW5pdGlvbjsKLSAgYm9vbGVhbiByZWxheDsKLQotICAvKiBOYW1lIG9mIHJ1bnRpbWUgaW50ZXJwcmV0ZXIgdG8gaW52b2tlLiAgKi8KLSAgY2hhciAqaW50ZXJwcmV0ZXI7Ci0KLSAgLyogTmFtZSB0byBnaXZlIHJ1bnRpbWUgbGliYXJ5IGZyb20gdGhlIC1zb25hbWUgYXJndW1lbnQuICAqLwotICBjaGFyICpzb25hbWU7Ci0KLSAgLyogUnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGZyb20gdGhlIC1ycGF0aCBhcmd1bWVudC4gICovCi0gIGNoYXIgKnJwYXRoOwotCi0gIC8qIExpbmsgdGltZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGggZnJvbSB0aGUgLXJwYXRoLWxpbmsKLSAgICAgYXJndW1lbnQuICAqLwotICBjaGFyICpycGF0aF9saW5rOwotCi0gIC8qIEJpZyBvciBsaXR0bGUgZW5kaWFuIGFzIHNldCBvbiBjb21tYW5kIGxpbmUuICAqLwotICBlbnVtIHsgRU5ESUFOX1VOU0VUID0gMCwgRU5ESUFOX0JJRywgRU5ESUFOX0xJVFRMRSB9IGVuZGlhbjsKLQotICAvKiBJZiB0cnVlLCBleHBvcnQgYWxsIHN5bWJvbHMgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIG9mIGFuIEVMRgotICAgICBleGVjdXRhYmxlLiAgKi8KLSAgYm9vbGVhbiBleHBvcnRfZHluYW1pYzsKLQotICAvKiBJZiB0cnVlLCBidWlsZCBNSVBTIGVtYmVkZGVkIFBJQyByZWxvY2F0aW9uIHRhYmxlcyBpbiB0aGUgb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICBib29sZWFuIGVtYmVkZGVkX3JlbG9jczsKLQotICAvKiBJZiB0cnVlLCBmb3JjZSBnZW5lcmF0aW9uIG9mIGEgZmlsZSB3aXRoIGEgLmV4ZSBmaWxlLiAqLwotICBib29sZWFuIGZvcmNlX2V4ZV9zdWZmaXg7Ci0KLSAgLyogSWYgdHJ1ZSwgZ2VuZXJhdGUgYSBjcm9zcyByZWZlcmVuY2UgcmVwb3J0LiAgKi8KLSAgYm9vbGVhbiBjcmVmOwotCi0gIC8qIElmIHRydWUgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgd2FybiBhYm91dCBtaXNtYXRjaGVkIGlucHV0Ci0gICAgIGZpbGVzLiAgKi8KLSAgYm9vbGVhbiB3YXJuX21pc21hdGNoOwotCi0gIC8qIFJlbW92ZSB1bnJlZmVyZW5jZWQgc2VjdGlvbnM/ICAqLwotICBib29sZWFuIGdjX3NlY3Rpb25zOwotCi0gIC8qIE5hbWUgb2Ygc2hhcmVkIG9iamVjdCB3aG9zZSBzeW1ib2wgdGFibGUgc2hvdWxkIGJlIGZpbHRlcmVkIHdpdGgKLSAgICAgdGhpcyBzaGFyZWQgb2JqZWN0LiAgRnJvbSB0aGUgLS1maWx0ZXIgb3B0aW9uLiAgKi8KLSAgY2hhciAqZmlsdGVyX3NobGliOwotCi0gIC8qIE5hbWUgb2Ygc2hhcmVkIG9iamVjdCBmb3Igd2hvc2Ugc3ltYm9sIHRhYmxlIHRoaXMgc2hhcmVkIG9iamVjdAotICAgICBpcyBhbiBhdXhpbGlhcnkgZmlsdGVyLiAgRnJvbSB0aGUgLS1hdXhpbGlhcnkgb3B0aW9uLiAgKi8KLSAgY2hhciAqKmF1eGlsaWFyeV9maWx0ZXJzOwotCi0gIC8qIEEgdmVyc2lvbiBzeW1ib2wgdG8gYmUgYXBwbGllZCB0byB0aGUgc3ltYm9sIG5hbWVzIGZvdW5kIGluIHRoZQotICAgICAuZXhwb3J0cyBzZWN0aW9ucy4gICovCi0gIGNoYXIgKnZlcnNpb25fZXhwb3J0c19zZWN0aW9uOwotCi0gIC8qIElmIHRydWUgKHRoZSBkZWZhdWx0KSBjaGVjayBzZWN0aW9uIGFkZHJlc3Nlcywgb25jZSBjb21wdXRlLAotICAgICBmcG9yIG92ZXJsYXBzLiAgKi8KLSAgYm9vbGVhbiBjaGVja19zZWN0aW9uX2FkZHJlc3NlczsKLSAgCi19IGFyZ3NfdHlwZTsKLQotZXh0ZXJuIGFyZ3NfdHlwZSBjb21tYW5kX2xpbmU7Ci0KLXR5cGVkZWYgaW50IHRva2VuX2NvZGVfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGJmZF9zaXplX3R5cGUgc3BlY2lmaWVkX2RhdGFfc2l6ZTsKLSAgYm9vbGVhbiBtYWdpY19kZW1hbmRfcGFnZWQ7Ci0gIGJvb2xlYW4gbWFrZV9leGVjdXRhYmxlOwotCi0gIC8qIElmIHRydWUsIGRvaW5nIGEgZHluYW1pYyBsaW5rLiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljX2xpbms7Ci0KLSAgLyogSWYgdHJ1ZSwgLXNoYXJlZCBpcyBzdXBwb3J0ZWQuICAqLwotICAvKiA/Pz8gQSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgaXMgcGVyaGFwcyB0byBkZWZpbmUgdGhpcyBpbiB0aGUKLSAgICAgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IHNpbmNlIHRoaXMgaXMgcmVhbGx5IGEgdGFyZ2V0IGRlcGVuZGVudAotICAgICBwYXJhbWV0ZXIuICAqLwotICBib29sZWFuIGhhc19zaGFyZWQ7Ci0KLSAgLyogSWYgdHJ1ZSwgYnVpbGQgY29uc3RydWN0b3JzLiAgKi8KLSAgYm9vbGVhbiBidWlsZF9jb25zdHJ1Y3RvcnM7Ci0KLSAgLyogSWYgdHJ1ZSwgd2FybiBhYm91dCBhbnkgY29uc3RydWN0b3JzLiAgKi8KLSAgYm9vbGVhbiB3YXJuX2NvbnN0cnVjdG9yczsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGFib3V0IG1lcmdpbmcgY29tbW9uIHN5bWJvbHMgd2l0aCBvdGhlcnMuICAqLwotICBib29sZWFuIHdhcm5fY29tbW9uOwotCi0gIC8qIElmIHRydWUsIG9ubHkgd2FybiBvbmNlIGFib3V0IGEgcGFydGljdWxhciB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiB3YXJuX29uY2U7Ci0KLSAgLyogSWYgdHJ1ZSwgd2FybiBpZiBtdWx0aXBsZSBnbG9iYWwtcG9pbnRlcnMgYXJlIG5lZWRlZCAoQWxwaGEKLSAgICAgb25seSkuICAqLwotICBib29sZWFuIHdhcm5fbXVsdGlwbGVfZ3A7Ci0KLSAgLyogSWYgdHJ1ZSwgd2FybiBpZiB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbgotICAgICBjaGFuZ2VzIGR1ZSB0byB0aGUgYWxpZ25tZW50IG9mIGFuIGlucHV0IHNlY3Rpb24uICAqLwotICBib29sZWFuIHdhcm5fc2VjdGlvbl9hbGlnbjsKLQotICBib29sZWFuIHNvcnRfY29tbW9uOwotCi0gIGJvb2xlYW4gdGV4dF9yZWFkX29ubHk7Ci0KLSAgY2hhciAqbWFwX2ZpbGVuYW1lOwotICBGSUxFICptYXBfZmlsZTsKLQotICBib29sZWFuIHN0YXRzOwotCi0gIGludCBzcGxpdF9ieV9yZWxvYzsKLSAgYm9vbGVhbiBzcGxpdF9ieV9maWxlOwotfSBsZF9jb25maWdfdHlwZTsKLQotZXh0ZXJuIGxkX2NvbmZpZ190eXBlIGNvbmZpZzsKLQotdHlwZWRlZiBlbnVtCi17Ci0gIGxhbmdfZmlyc3RfcGhhc2VfZW51bSwKLSAgbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0sCi0gIGxhbmdfZmluYWxfcGhhc2VfZW51bQotfSBsYW5nX3BoYXNlX3R5cGU7Ci0KLWV4dGVybiBib29sZWFuIGhhZF9zY3JpcHQ7Ci1leHRlcm4gYm9vbGVhbiBmb3JjZV9tYWtlX2V4ZWN1dGFibGU7Ci0KLS8qIE5vbi16ZXJvIGlmIHdlIGFyZSBwcm9jZXNzaW5nIGEgLS1kZWZzeW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLWV4dGVybiBpbnQgcGFyc2luZ19kZWZzeW07Ci0KLWV4dGVybiBpbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIGFkZF9jcmVmIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIG91dHB1dF9jcmVmIFBBUkFNUyAoKEZJTEUgKikpOwotZXh0ZXJuIHZvaWQgY2hlY2tfbm9jcm9zc3JlZnMgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBsZF9hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSkKLSAgICAgQVRUUklCVVRFX05PUkVUVVJOOwotCi0vKiBJZiBnY2MsIHdlIGNhbiBnaXZlIGEgZnVuY3Rpb24gbmFtZSwgdG9vLiAgKi8KLSNpZiAhZGVmaW5lZCAoX19HTlVDX18pIHx8IF9fR05VQ19NSU5PUl9fIDw9IDUKLSNkZWZpbmUgX19QUkVUVFlfRlVOQ1RJT05fXyAgKChjaGFyKikgTlVMTCkKLSNlbmRpZgotCi0jdW5kZWYgYWJvcnQKLSNkZWZpbmUgYWJvcnQoKSBsZF9hYm9ydCAoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkLnRleGluZm8gYi9sZC9sZC50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjYyY2EzLi4wMDAwMDAwCi0tLSBhL2xkL2xkLnRleGluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw0Mzg2ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvCi1Ac2V0ZmlsZW5hbWUgbGQuaW5mbwotQHN5bmNvZGVpbmRleCBreSBjcAotQGluY2x1ZGUgY29uZmlnZG9jLnRleGkKLUBjIChjb25maWdkb2MudGV4aSBpcyBnZW5lcmF0ZWQgYnkgdGhlIE1ha2VmaWxlKQotQGluY2x1ZGUgbGR2ZXIudGV4aQotCi1AYyBAc21hbGxib29rCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIExkOiAobGQpLiAgICAgICAgICAgICAgICAgICAgICAgVGhlIEdOVSBsaW5rZXIuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBAc2N7Z251fSBsaW5rZXIgTEQgdmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0uCi0KLUNvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLUBlbmQgaWZpbmZvCi1AaWZ0ZXgKLUBmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIFVzaW5nIExELCB0aGUgR05VIGxpbmtlcgotQHRpdGxlcGFnZQotQHRpdGxlIFVzaW5nIGxkCi1Ac3VidGl0bGUgVGhlIEdOVSBsaW5rZXIKLUBzcCAxCi1Ac3VidGl0bGUgQGNvZGV7bGR9IHZlcnNpb24gMgotQHN1YnRpdGxlIFZlcnNpb24gQHZhbHVle1ZFUlNJT059Ci1AYXV0aG9yIFN0ZXZlIENoYW1iZXJsYWluCi1AYXV0aG9yIElhbiBMYW5jZSBUYXlsb3IKLUBhdXRob3IgQ3lnbnVzIFNvbHV0aW9ucwotQHBhZ2UKLQotQHRleAote1xwYXJza2lwPTBwdAotXGhmaWxsIEN5Z251cyBTb2x1dGlvbnNccGFyCi1caGZpbGwgaWFuXEBjeWdudXMuY29tLCBkb2NcQGN5Z251cy5jb21ccGFyCi1caGZpbGwge1xpdCBVc2luZyBMRCwgdGhlIEdOVSBsaW5rZXJ9XHBhcgotXGhmaWxsIEVkaXRlZCBieSBKZWZmcmV5IE9zaWVyIChqZWZmcmV5XEBjeWdudXMuY29tKVxwYXIKLX0KLVxnbG9iYWxccGFyaW5kZW50PTBwdCAlIFN0ZXZlIGxpa2VzIGl0IHRoaXMgd2F5LgotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIHRpdGxlcGFnZQotQGVuZCBpZnRleAotQGMgRklYTUU6IFRhbGsgYWJvdXQgaW1wb3J0YW5jZSBvZiAqb3JkZXIqIG9mIGFyZ3MsIGNtZHMgdG8gbGlua2VyIQotCi1AaWZpbmZvCi1Abm9kZSBUb3AKLUB0b3AgVXNpbmcgbGQKLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEBzY3tnbnV9IGxpbmtlciBsZCB2ZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfS4KLQotQG1lbnUKLSogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXcKLSogSW52b2NhdGlvbjo6ICAgICAgICAgICAgICAgICAgSW52b2NhdGlvbgotKiBTY3JpcHRzOjogICAgICAgICAgICAgICAgICAgICBMaW5rZXIgU2NyaXB0cwotQGlmc2V0IEdFTkVSSUMKLSogTWFjaGluZSBEZXBlbmRlbnQ6OiAgICAgICAgICAgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIODMwMAotKiBIOC8zMDA6OiAgICAgICAgICAgICAgICAgICAgICBsZCBhbmQgdGhlIEg4LzMwMAotQGVuZCBpZnNldAotQGlmc2V0IEhpdGFjaGkKLSogSGl0YWNoaTo6ICAgICAgICAgICAgICAgICAgICAgbGQgYW5kIG90aGVyIEhpdGFjaGkgbWljcm9zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotKiBpOTYwOjogICAgICAgICAgICAgICAgICAgICAgICBsZCBhbmQgdGhlIEludGVsIDk2MCBmYW1pbHkKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci0qIEJGRDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEJGRAotQGVuZCBpZmNsZWFyCi1AYyBGb2xsb3dpbmcgYmxhbmsgbGluZSByZXF1aXJlZCBmb3IgcmVtYWluaW5nIGJ1ZyBpbiBtYWtlaW5mbyBjb25kcy9tZW51cwotCi0qIFJlcG9ydGluZyBCdWdzOjogICAgICAgICAgICAgIFJlcG9ydGluZyBCdWdzCi0qIE1SSTo6ICAgICAgICAgICAgICAgICAgICAgICAgIE1SSSBDb21wYXRpYmxlIFNjcmlwdCBGaWxlcwotKiBJbmRleDo6ICAgICAgICAgICAgICAgICAgICAgICBJbmRleAotQGVuZCBtZW51Ci1AZW5kIGlmaW5mbwotCi1Abm9kZSBPdmVydmlldwotQGNoYXB0ZXIgT3ZlcnZpZXcKLQotQGNpbmRleCBAc2N7Z251fSBsaW5rZXIKLUBjaW5kZXggd2hhdCBpcyB0aGlzPwotQGNvZGV7bGR9IGNvbWJpbmVzIGEgbnVtYmVyIG9mIG9iamVjdCBhbmQgYXJjaGl2ZSBmaWxlcywgcmVsb2NhdGVzCi10aGVpciBkYXRhIGFuZCB0aWVzIHVwIHN5bWJvbCByZWZlcmVuY2VzLiBVc3VhbGx5IHRoZSBsYXN0IHN0ZXAgaW4KLWNvbXBpbGluZyBhIHByb2dyYW0gaXMgdG8gcnVuIEBjb2Rle2xkfS4KLQotQGNvZGV7bGR9IGFjY2VwdHMgTGlua2VyIENvbW1hbmQgTGFuZ3VhZ2UgZmlsZXMgd3JpdHRlbiBpbgotYSBzdXBlcnNldCBvZiBBVCZUJ3MgTGluayBFZGl0b3IgQ29tbWFuZCBMYW5ndWFnZSBzeW50YXgsCi10byBwcm92aWRlIGV4cGxpY2l0IGFuZCB0b3RhbCBjb250cm9sIG92ZXIgdGhlIGxpbmtpbmcgcHJvY2Vzcy4KLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1UaGlzIHZlcnNpb24gb2YgQGNvZGV7bGR9IHVzZXMgdGhlIGdlbmVyYWwgcHVycG9zZSBCRkQgbGlicmFyaWVzCi10byBvcGVyYXRlIG9uIG9iamVjdCBmaWxlcy4gVGhpcyBhbGxvd3MgQGNvZGV7bGR9IHRvIHJlYWQsIGNvbWJpbmUsIGFuZAotd3JpdGUgb2JqZWN0IGZpbGVzIGluIG1hbnkgZGlmZmVyZW50IGZvcm1hdHMtLS1mb3IgZXhhbXBsZSwgQ09GRiBvcgotQGNvZGV7YS5vdXR9LiAgRGlmZmVyZW50IGZvcm1hdHMgbWF5IGJlIGxpbmtlZCB0b2dldGhlciB0byBwcm9kdWNlIGFueQotYXZhaWxhYmxlIGtpbmQgb2Ygb2JqZWN0IGZpbGUuICBAeHJlZntCRkR9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLUBlbmQgaWZjbGVhcgotCi1Bc2lkZSBmcm9tIGl0cyBmbGV4aWJpbGl0eSwgdGhlIEBzY3tnbnV9IGxpbmtlciBpcyBtb3JlIGhlbHBmdWwgdGhhbiBvdGhlcgotbGlua2VycyBpbiBwcm92aWRpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gIE1hbnkgbGlua2VycyBhYmFuZG9uCi1leGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBlbmNvdW50ZXJpbmcgYW4gZXJyb3I7IHdoZW5ldmVyIHBvc3NpYmxlLAotQGNvZGV7bGR9IGNvbnRpbnVlcyBleGVjdXRpbmcsIGFsbG93aW5nIHlvdSB0byBpZGVudGlmeSBvdGhlciBlcnJvcnMKLShvciwgaW4gc29tZSBjYXNlcywgdG8gZ2V0IGFuIG91dHB1dCBmaWxlIGluIHNwaXRlIG9mIHRoZSBlcnJvcikuCi0KLUBub2RlIEludm9jYXRpb24KLUBjaGFwdGVyIEludm9jYXRpb24KLQotVGhlIEBzY3tnbnV9IGxpbmtlciBAY29kZXtsZH0gaXMgbWVhbnQgdG8gY292ZXIgYSBicm9hZCByYW5nZSBvZiBzaXR1YXRpb25zLAotYW5kIHRvIGJlIGFzIGNvbXBhdGlibGUgYXMgcG9zc2libGUgd2l0aCBvdGhlciBsaW5rZXJzLiAgQXMgYSByZXN1bHQsCi15b3UgaGF2ZSBtYW55IGNob2ljZXMgdG8gY29udHJvbCBpdHMgYmVoYXZpb3IuCi0KLUBpZnNldCBVc2VzRW52VmFycwotQG1lbnUKLSogT3B0aW9uczo6ICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBMaW5lIE9wdGlvbnMKLSogRW52aXJvbm1lbnQ6OiAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQgVmFyaWFibGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgT3B0aW9ucwotQHNlY3Rpb24gQ29tbWFuZCBMaW5lIE9wdGlvbnMKLUBlbmQgaWZzZXQKLQotQGNpbmRleCBjb21tYW5kIGxpbmUKLUBjaW5kZXggb3B0aW9ucwotVGhlIGxpbmtlciBzdXBwb3J0cyBhIHBsZXRob3JhIG9mIGNvbW1hbmQtbGluZSBvcHRpb25zLCBidXQgaW4gYWN0dWFsCi1wcmFjdGljZSBmZXcgb2YgdGhlbSBhcmUgdXNlZCBpbiBhbnkgcGFydGljdWxhciBjb250ZXh0LgotQGNpbmRleCBzdGFuZGFyZCBVbml4IHN5c3RlbQotRm9yIGluc3RhbmNlLCBhIGZyZXF1ZW50IHVzZSBvZiBAY29kZXtsZH0gaXMgdG8gbGluayBzdGFuZGFyZCBVbml4Ci1vYmplY3QgZmlsZXMgb24gYSBzdGFuZGFyZCwgc3VwcG9ydGVkIFVuaXggc3lzdGVtLiAgT24gc3VjaCBhIHN5c3RlbSwgdG8KLWxpbmsgYSBmaWxlIEBjb2Rle2hlbGxvLm99OgotCi1Ac21hbGxleGFtcGxlCi1sZCAtbyBAdmFye291dHB1dH0gL2xpYi9jcnQwLm8gaGVsbG8ubyAtbGMKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgdGVsbHMgQGNvZGV7bGR9IHRvIHByb2R1Y2UgYSBmaWxlIGNhbGxlZCBAdmFye291dHB1dH0gYXMgdGhlCi1yZXN1bHQgb2YgbGlua2luZyB0aGUgZmlsZSBAY29kZXsvbGliL2NydDAub30gd2l0aCBAY29kZXtoZWxsby5vfSBhbmQKLXRoZSBsaWJyYXJ5IEBjb2Rle2xpYmMuYX0sIHdoaWNoIHdpbGwgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBzZWFyY2gKLWRpcmVjdG9yaWVzLiAgKFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiB0aGUgQHNhbXB7LWx9IG9wdGlvbiBiZWxvdy4pCi0KLVNvbWUgb2YgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIEBjb2Rle2xkfSBtYXkgYmUgc3BlY2lmaWVkIGF0IGFueQotcG9pbnQgaW4gdGhlIGNvbW1hbmQgbGluZS4gIEhvd2V2ZXIsIG9wdGlvbnMgd2hpY2ggcmVmZXIgdG8gZmlsZXMsIHN1Y2gKLWFzIEBzYW1wey1sfSBvciBAc2FtcHstVH0sIGNhdXNlIHRoZSBmaWxlIHRvIGJlIHJlYWQgYXQgdGhlIHBvaW50IGF0Ci13aGljaCB0aGUgb3B0aW9uIGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZSwgcmVsYXRpdmUgdG8gdGhlIG9iamVjdAotZmlsZXMgYW5kIG90aGVyIGZpbGUgb3B0aW9ucy4gIFJlcGVhdGluZyBub24tZmlsZSBvcHRpb25zIHdpdGggYQotZGlmZmVyZW50IGFyZ3VtZW50IHdpbGwgZWl0aGVyIGhhdmUgbm8gZnVydGhlciBlZmZlY3QsIG9yIG92ZXJyaWRlIHByaW9yCi1vY2N1cnJlbmNlcyAodGhvc2UgZnVydGhlciB0byB0aGUgbGVmdCBvbiB0aGUgY29tbWFuZCBsaW5lKSBvZiB0aGF0Ci1vcHRpb24uICBPcHRpb25zIHdoaWNoIG1heSBiZSBtZWFuaW5nZnVsbHkgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIGFyZQotbm90ZWQgaW4gdGhlIGRlc2NyaXB0aW9ucyBiZWxvdy4KLQotQGNpbmRleCBvYmplY3QgZmlsZXMKLU5vbi1vcHRpb24gYXJndW1lbnRzIGFyZSBvYmplY3QgZmlsZXMgb3IgYXJjaGl2ZXMgd2hpY2ggYXJlIHRvIGJlIGxpbmtlZAotdG9nZXRoZXIuICBUaGV5IG1heSBmb2xsb3csIHByZWNlZGUsIG9yIGJlIG1peGVkIGluIHdpdGggY29tbWFuZC1saW5lCi1vcHRpb25zLCBleGNlcHQgdGhhdCBhbiBvYmplY3QgZmlsZSBhcmd1bWVudCBtYXkgbm90IGJlIHBsYWNlZCBiZXR3ZWVuCi1hbiBvcHRpb24gYW5kIGl0cyBhcmd1bWVudC4KLQotVXN1YWxseSB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCBhdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUsIGJ1dCB5b3UgY2FuCi1zcGVjaWZ5IG90aGVyIGZvcm1zIG9mIGJpbmFyeSBpbnB1dCBmaWxlcyB1c2luZyBAc2FtcHstbH0sIEBzYW1wey1SfSwKLWFuZCB0aGUgc2NyaXB0IGNvbW1hbmQgbGFuZ3VhZ2UuICBJZiBAZW1waHtub30gYmluYXJ5IGlucHV0IGZpbGVzIGF0IGFsbAotYXJlIHNwZWNpZmllZCwgdGhlIGxpbmtlciBkb2VzIG5vdCBwcm9kdWNlIGFueSBvdXRwdXQsIGFuZCBpc3N1ZXMgdGhlCi1tZXNzYWdlIEBzYW1we05vIGlucHV0IGZpbGVzfS4KLQotSWYgdGhlIGxpbmtlciBjYW4gbm90IHJlY29nbml6ZSB0aGUgZm9ybWF0IG9mIGFuIG9iamVjdCBmaWxlLCBpdCB3aWxsCi1hc3N1bWUgdGhhdCBpdCBpcyBhIGxpbmtlciBzY3JpcHQuICBBIHNjcmlwdCBzcGVjaWZpZWQgaW4gdGhpcyB3YXkKLWF1Z21lbnRzIHRoZSBtYWluIGxpbmtlciBzY3JpcHQgdXNlZCBmb3IgdGhlIGxpbmsgKGVpdGhlciB0aGUgZGVmYXVsdAotbGlua2VyIHNjcmlwdCBvciB0aGUgb25lIHNwZWNpZmllZCBieSB1c2luZyBAc2FtcHstVH0pLiAgVGhpcyBmZWF0dXJlCi1wZXJtaXRzIHRoZSBsaW5rZXIgdG8gbGluayBhZ2FpbnN0IGEgZmlsZSB3aGljaCBhcHBlYXJzIHRvIGJlIGFuIG9iamVjdAotb3IgYW4gYXJjaGl2ZSwgYnV0IGFjdHVhbGx5IG1lcmVseSBkZWZpbmVzIHNvbWUgc3ltYm9sIHZhbHVlcywgb3IgdXNlcwotQGNvZGV7SU5QVVR9IG9yIEBjb2Rle0dST1VQfSB0byBsb2FkIG90aGVyIG9iamVjdHMuICBOb3RlIHRoYXQKLXNwZWNpZnlpbmcgYSBzY3JpcHQgaW4gdGhpcyB3YXkgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBhdWdtZW50IHRoZSBtYWluCi1saW5rZXIgc2NyaXB0OyBpZiB5b3Ugd2FudCB0byB1c2Ugc29tZSBjb21tYW5kIHRoYXQgbG9naWNhbGx5IGNhbiBvbmx5Ci1hcHBlYXIgb25jZSwgc3VjaCBhcyB0aGUgQGNvZGV7U0VDVElPTlN9IG9yIEBjb2Rle01FTU9SWX0gY29tbWFuZCwgeW91Ci1tdXN0IHJlcGxhY2UgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdCB1c2luZyB0aGUgQHNhbXB7LVR9IG9wdGlvbi4KLUB4cmVme1NjcmlwdHN9LgotCi1Gb3Igb3B0aW9ucyB3aG9zZSBuYW1lcyBhcmUgYSBzaW5nbGUgbGV0dGVyLAotb3B0aW9uIGFyZ3VtZW50cyBtdXN0IGVpdGhlciBmb2xsb3cgdGhlIG9wdGlvbiBsZXR0ZXIgd2l0aG91dCBpbnRlcnZlbmluZwotd2hpdGVzcGFjZSwgb3IgYmUgZ2l2ZW4gYXMgc2VwYXJhdGUgYXJndW1lbnRzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUKLW9wdGlvbiB0aGF0IHJlcXVpcmVzIHRoZW0uCi0KLUZvciBvcHRpb25zIHdob3NlIG5hbWVzIGFyZSBtdWx0aXBsZSBsZXR0ZXJzLCBlaXRoZXIgb25lIGRhc2ggb3IgdHdvIGNhbgotcHJlY2VkZSB0aGUgb3B0aW9uIG5hbWU7IGZvciBleGFtcGxlLCBAc2FtcHstLW9mb3JtYXR9IGFuZAotQHNhbXB7LS1vZm9ybWF0fSBhcmUgZXF1aXZhbGVudC4gIEFyZ3VtZW50cyB0byBtdWx0aXBsZS1sZXR0ZXIgb3B0aW9ucwotbXVzdCBlaXRoZXIgYmUgc2VwYXJhdGVkIGZyb20gdGhlIG9wdGlvbiBuYW1lIGJ5IGFuIGVxdWFscyBzaWduLCBvciBiZQotZ2l2ZW4gYXMgc2VwYXJhdGUgYXJndW1lbnRzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgb3B0aW9uIHRoYXQKLXJlcXVpcmVzIHRoZW0uICBGb3IgZXhhbXBsZSwgQHNhbXB7LS1vZm9ybWF0IHNyZWN9IGFuZAotQHNhbXB7LS1vZm9ybWF0PXNyZWN9IGFyZSBlcXVpdmFsZW50LiAgVW5pcXVlIGFiYnJldmlhdGlvbnMgb2YgdGhlIG5hbWVzCi1vZiBtdWx0aXBsZS1sZXR0ZXIgb3B0aW9ucyBhcmUgYWNjZXB0ZWQuCi0KLU5vdGUgLSBpZiB0aGUgbGlua2VyIGlzIGJlaW5nIGludm9rZWQgaW5kaXJlY3RseSwgdmlhIGEgY29tcGlsZXIgZHJpdmVyCi0oZWcgQHNhbXB7Z2NjfSkgdGhlbiBhbGwgdGhlIGxpbmtlciBjb21tYW5kIGxpbmUgb3B0aW9ucyBzaG91bGQgYmUKLXByZWZpeGVkIGJ5IEBzYW1wey1XbCx9IChvciB3aGF0ZXZlciBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHBhcnRpY3VsYXIKLWNvbXBpbGVyIGRyaXZlcikgbGlrZSB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi0gIGdjYyAtV2wsLS1zdGFydGdyb3VwIGZvby5vIGJhci5vIC1XbCwtLWVuZGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIGlzIGltcG9ydGFudCwgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGNvbXBpbGVyIGRyaXZlciBwcm9ncmFtIG1heQotc2lsZW50bHkgZHJvcCB0aGUgbGlua2VyIG9wdGlvbnMsIHJlc3VsdGluZyBpbiBhIGJhZCBsaW5rLgotCi1IZXJlIGlzIGEgdGFibGUgb2YgdGhlIGdlbmVyaWMgY29tbWFuZCBsaW5lIHN3aXRjaGVzIGFjY2VwdGVkIGJ5IHRoZSBHTlUKLWxpbmtlcjoKLQotQHRhYmxlIEBjb2RlCi1Aa2luZGV4IC1hQHZhcntrZXl3b3JkfQotQGl0ZW0gLWFAdmFye2tleXdvcmR9Ci1UaGlzIG9wdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkuICBUaGUgQHZhcntrZXl3b3JkfQotYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHN0cmluZ3MgQHNhbXB7YXJjaGl2ZX0sIEBzYW1we3NoYXJlZH0sIG9yCi1Ac2FtcHtkZWZhdWx0fS4gIEBzYW1wey1hYXJjaGl2ZX0gaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8KLUBzYW1wey1Cc3RhdGljfSwgYW5kIHRoZSBvdGhlciB0d28ga2V5d29yZHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50Ci10byBAc2FtcHstQmR5bmFtaWN9LiAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgYW55IG51bWJlciBvZiB0aW1lcy4KLQotQGlmc2V0IEk5NjAKLUBjaW5kZXggYXJjaGl0ZWN0dXJlcwotQGtpbmRleCAtQUB2YXJ7YXJjaH0KLUBpdGVtIC1BQHZhcnthcmNoaXRlY3R1cmV9Ci1Aa2luZGV4IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7YXJjaH0KLUBpdGVteCAtLWFyY2hpdGVjdHVyZT1AdmFye2FyY2hpdGVjdHVyZX0KLUluIHRoZSBjdXJyZW50IHJlbGVhc2Ugb2YgQGNvZGV7bGR9LCB0aGlzIG9wdGlvbiBpcyB1c2VmdWwgb25seSBmb3IgdGhlCi1JbnRlbCA5NjAgZmFtaWx5IG9mIGFyY2hpdGVjdHVyZXMuICBJbiB0aGF0IEBjb2Rle2xkfSBjb25maWd1cmF0aW9uLCB0aGUKLUB2YXJ7YXJjaGl0ZWN0dXJlfSBhcmd1bWVudCBpZGVudGlmaWVzIHRoZSBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZSBpbgotdGhlIDk2MCBmYW1pbHksIGVuYWJsaW5nIHNvbWUgc2FmZWd1YXJkcyBhbmQgbW9kaWZ5aW5nIHRoZQotYXJjaGl2ZS1saWJyYXJ5IHNlYXJjaCBwYXRoLiAgQHhyZWZ7aTk2MCwsQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwCi1mYW1pbHl9LCBmb3IgZGV0YWlscy4KLQotRnV0dXJlIHJlbGVhc2VzIG9mIEBjb2Rle2xkfSBtYXkgc3VwcG9ydCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgZm9yCi1vdGhlciBhcmNoaXRlY3R1cmUgZmFtaWxpZXMuCi1AZW5kIGlmc2V0Ci0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotQGNpbmRleCBiaW5hcnkgaW5wdXQgZm9ybWF0Ci1Aa2luZGV4IC1iIEB2YXJ7Zm9ybWF0fQotQGtpbmRleCAtLWZvcm1hdD1AdmFye2Zvcm1hdH0KLUBjaW5kZXggaW5wdXQgZm9ybWF0Ci1AY2luZGV4IGlucHV0IGZvcm1hdAotQGl0ZW0gLWIgQHZhcntpbnB1dC1mb3JtYXR9Ci1AaXRlbXggLS1mb3JtYXQ9QHZhcntpbnB1dC1mb3JtYXR9Ci1AY29kZXtsZH0gbWF5IGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGtpbmQgb2Ygb2JqZWN0Ci1maWxlLiAgSWYgeW91ciBAY29kZXtsZH0gaXMgY29uZmlndXJlZCB0aGlzIHdheSwgeW91IGNhbiB1c2UgdGhlCi1Ac2FtcHstYn0gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGJpbmFyeSBmb3JtYXQgZm9yIGlucHV0IG9iamVjdCBmaWxlcwotdGhhdCBmb2xsb3cgdGhpcyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gIEV2ZW4gd2hlbiBAY29kZXtsZH0gaXMKLWNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBhbHRlcm5hdGl2ZSBvYmplY3QgZm9ybWF0cywgeW91IGRvbid0IHVzdWFsbHkgbmVlZAotdG8gc3BlY2lmeSB0aGlzLCBhcyBAY29kZXtsZH0gc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gZXhwZWN0IGFzIGEKLWRlZmF1bHQgaW5wdXQgZm9ybWF0IHRoZSBtb3N0IHVzdWFsIGZvcm1hdCBvbiBlYWNoIG1hY2hpbmUuCi1AdmFye2lucHV0LWZvcm1hdH0gaXMgYSB0ZXh0IHN0cmluZywgdGhlIG5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdAotc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgKFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlIGJpbmFyeQotZm9ybWF0cyB3aXRoIEBzYW1we29iamR1bXAgLWl9LikKLUB4cmVme0JGRH0uCi0KLVlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSBsaW5raW5nIGZpbGVzIHdpdGggYW4gdW51c3VhbAotYmluYXJ5IGZvcm1hdC4gIFlvdSBjYW4gYWxzbyB1c2UgQHNhbXB7LWJ9IHRvIHN3aXRjaCBmb3JtYXRzIGV4cGxpY2l0bHkgKHdoZW4KLWxpbmtpbmcgb2JqZWN0IGZpbGVzIG9mIGRpZmZlcmVudCBmb3JtYXRzKSwgYnkgaW5jbHVkaW5nCi1Ac2FtcHstYiBAdmFye2lucHV0LWZvcm1hdH19IGJlZm9yZSBlYWNoIGdyb3VwIG9mIG9iamVjdCBmaWxlcyBpbiBhCi1wYXJ0aWN1bGFyIGZvcm1hdC4gIAotCi1UaGUgZGVmYXVsdCBmb3JtYXQgaXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0dOVVRBUkdFVH0uCi1AaWZzZXQgVXNlc0VudlZhcnMKLUB4cmVme0Vudmlyb25tZW50fS4KLUBlbmQgaWZzZXQKLVlvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIGlucHV0IGZvcm1hdCBmcm9tIGEgc2NyaXB0LCB1c2luZyB0aGUgY29tbWFuZAotQGNvZGV7VEFSR0VUfTsgc2VlIEByZWZ7Rm9ybWF0IENvbW1hbmRzfS4KLUBlbmQgaWZjbGVhcgotCi1Aa2luZGV4IC1jIEB2YXJ7TVJJLWNtZGZpbGV9Ci1Aa2luZGV4IC0tbXJpLXNjcmlwdD1AdmFye01SSS1jbWRmaWxlfQotQGNpbmRleCBjb21wYXRpYmlsaXR5LCBNUkkKLUBpdGVtIC1jIEB2YXJ7TVJJLWNvbW1hbmRmaWxlfQotQGl0ZW14IC0tbXJpLXNjcmlwdD1AdmFye01SSS1jb21tYW5kZmlsZX0KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggbGlua2VycyBwcm9kdWNlZCBieSBNUkksIEBjb2Rle2xkfSBhY2NlcHRzIHNjcmlwdAotZmlsZXMgd3JpdHRlbiBpbiBhbiBhbHRlcm5hdGUsIHJlc3RyaWN0ZWQgY29tbWFuZCBsYW5ndWFnZSwgZGVzY3JpYmVkIGluCi1AcmVme01SSSwsTVJJIENvbXBhdGlibGUgU2NyaXB0IEZpbGVzfS4gIEludHJvZHVjZSBNUkkgc2NyaXB0IGZpbGVzIHdpdGgKLXRoZSBvcHRpb24gQHNhbXB7LWN9OyB1c2UgdGhlIEBzYW1wey1UfSBvcHRpb24gdG8gcnVuIGxpbmtlcgotc2NyaXB0cyB3cml0dGVuIGluIHRoZSBnZW5lcmFsLXB1cnBvc2UgQGNvZGV7bGR9IHNjcmlwdGluZyBsYW5ndWFnZS4KLUlmIEB2YXJ7TVJJLWNtZGZpbGV9IGRvZXMgbm90IGV4aXN0LCBAY29kZXtsZH0gbG9va3MgZm9yIGl0IGluIHRoZSBkaXJlY3Rvcmllcwotc3BlY2lmaWVkIGJ5IGFueSBAc2FtcHstTH0gb3B0aW9ucy4KLQotQGNpbmRleCBjb21tb24gYWxsb2NhdGlvbgotQGtpbmRleCAtZAotQGtpbmRleCAtZGMKLUBraW5kZXggLWRwCi1AaXRlbSAtZCAKLUBpdGVteCAtZGMKLUBpdGVteCAtZHAKLVRoZXNlIHRocmVlIG9wdGlvbnMgYXJlIGVxdWl2YWxlbnQ7IG11bHRpcGxlIGZvcm1zIGFyZSBzdXBwb3J0ZWQgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlua2Vycy4gIFRoZXkgYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzCi1ldmVuIGlmIGEgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkICh3aXRoIEBzYW1wey1yfSkuICBUaGUKLXNjcmlwdCBjb21tYW5kIEBjb2Rle0ZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OfSBoYXMgdGhlIHNhbWUgZWZmZWN0LgotQHhyZWZ7TWlzY2VsbGFuZW91cyBDb21tYW5kc30uCi0KLUBjaW5kZXggZW50cnkgcG9pbnQsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC1lIEB2YXJ7ZW50cnl9Ci1Aa2luZGV4IC0tZW50cnk9QHZhcntlbnRyeX0KLUBpdGVtIC1lIEB2YXJ7ZW50cnl9IAotQGl0ZW14IC0tZW50cnk9QHZhcntlbnRyeX0KLVVzZSBAdmFye2VudHJ5fSBhcyB0aGUgZXhwbGljaXQgc3ltYm9sIGZvciBiZWdpbm5pbmcgZXhlY3V0aW9uIG9mIHlvdXIKLXByb2dyYW0sIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGVudHJ5IHBvaW50LiAgSWYgdGhlcmUgaXMgbm8gc3ltYm9sCi1uYW1lZCBAdmFye2VudHJ5fSwgdGhlIGxpbmtlciB3aWxsIHRyeSB0byBwYXJzZSBAdmFye2VudHJ5fSBhcyBhIG51bWJlciwKLWFuZCB1c2UgdGhhdCBhcyB0aGUgZW50cnkgYWRkcmVzcyAodGhlIG51bWJlciB3aWxsIGJlIGludGVycHJldGVkIGluCi1iYXNlIDEwOyB5b3UgbWF5IHVzZSBhIGxlYWRpbmcgQHNhbXB7MHh9IGZvciBiYXNlIDE2LCBvciBhIGxlYWRpbmcKLUBzYW1wezB9IGZvciBiYXNlIDgpLiAgQHhyZWZ7RW50cnkgUG9pbnR9LCBmb3IgYSBkaXNjdXNzaW9uIG9mIGRlZmF1bHRzCi1hbmQgb3RoZXIgd2F5cyBvZiBzcGVjaWZ5aW5nIHRoZSBlbnRyeSBwb2ludC4KLQotQGNpbmRleCBkeW5hbWljIHN5bWJvbCB0YWJsZQotQGtpbmRleCAtRQotQGtpbmRleCAtLWV4cG9ydC1keW5hbWljCi1AaXRlbSAtRQotQGl0ZW14IC0tZXhwb3J0LWR5bmFtaWMKLVdoZW4gY3JlYXRpbmcgYSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSwgYWRkIGFsbCBzeW1ib2xzIHRvIHRoZQotZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaXMgdGhlIHNldCBvZiBzeW1ib2xzCi13aGljaCBhcmUgdmlzaWJsZSBmcm9tIGR5bmFtaWMgb2JqZWN0cyBhdCBydW4gdGltZS4KLQotSWYgeW91IGRvIG5vdCB1c2UgdGhpcyBvcHRpb24sIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSB3aWxsIG5vcm1hbGx5Ci1jb250YWluIG9ubHkgdGhvc2Ugc3ltYm9scyB3aGljaCBhcmUgcmVmZXJlbmNlZCBieSBzb21lIGR5bmFtaWMgb2JqZWN0Ci1tZW50aW9uZWQgaW4gdGhlIGxpbmsuCi0KLUlmIHlvdSB1c2UgQGNvZGV7ZGxvcGVufSB0byBsb2FkIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggbmVlZHMgdG8gcmVmZXIKLWJhY2sgdG8gdGhlIHN5bWJvbHMgZGVmaW5lZCBieSB0aGUgcHJvZ3JhbSwgcmF0aGVyIHRoYW4gc29tZSBvdGhlcgotZHluYW1pYyBvYmplY3QsIHRoZW4geW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byB1c2UgdGhpcyBvcHRpb24gd2hlbgotbGlua2luZyB0aGUgcHJvZ3JhbSBpdHNlbGYuCi0KLUBjaW5kZXggYmlnLWVuZGlhbiBvYmplY3RzCi1AY2luZGV4IGVuZGlhbm5lc3MKLUBraW5kZXggLUVCCi1AaXRlbSAtRUIKLUxpbmsgYmlnLWVuZGlhbiBvYmplY3RzLiAgVGhpcyBhZmZlY3RzIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQuCi0KLUBjaW5kZXggbGl0dGxlLWVuZGlhbiBvYmplY3RzCi1Aa2luZGV4IC1FTAotQGl0ZW0gLUVMCi1MaW5rIGxpdHRsZS1lbmRpYW4gb2JqZWN0cy4gIFRoaXMgYWZmZWN0cyB0aGUgZGVmYXVsdCBvdXRwdXQgZm9ybWF0LgotCi1Aa2luZGV4IC1mCi1Aa2luZGV4IC0tYXV4aWxpYXJ5Ci1AaXRlbSAtZgotQGl0ZW14IC0tYXV4aWxpYXJ5IEB2YXJ7bmFtZX0KLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfQVVYSUxJQVJZIGZpZWxkCi10byB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wKLXRhYmxlIG9mIHRoZSBzaGFyZWQgb2JqZWN0IHNob3VsZCBiZSB1c2VkIGFzIGFuIGF1eGlsaWFyeSBmaWx0ZXIgb24gdGhlCi1zeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfS4KLQotSWYgeW91IGxhdGVyIGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgdGhpcyBmaWx0ZXIgb2JqZWN0LCB0aGVuLCB3aGVuIHlvdQotcnVuIHRoZSBwcm9ncmFtLCB0aGUgZHluYW1pYyBsaW5rZXIgd2lsbCBzZWUgdGhlIERUX0FVWElMSUFSWSBmaWVsZC4gIElmCi10aGUgZHluYW1pYyBsaW5rZXIgcmVzb2x2ZXMgYW55IHN5bWJvbHMgZnJvbSB0aGUgZmlsdGVyIG9iamVjdCwgaXQgd2lsbAotZmlyc3QgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGRlZmluaXRpb24gaW4gdGhlIHNoYXJlZCBvYmplY3QKLUB2YXJ7bmFtZX0uICBJZiB0aGVyZSBpcyBvbmUsIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZpbml0aW9uCi1pbiB0aGUgZmlsdGVyIG9iamVjdC4gIFRoZSBzaGFyZWQgb2JqZWN0IEB2YXJ7bmFtZX0gbmVlZCBub3QgZXhpc3QuCi1UaHVzIHRoZSBzaGFyZWQgb2JqZWN0IEB2YXJ7bmFtZX0gbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZQotaW1wbGVtZW50YXRpb24gb2YgY2VydGFpbiBmdW5jdGlvbnMsIHBlcmhhcHMgZm9yIGRlYnVnZ2luZyBvciBmb3IKLW1hY2hpbmUgc3BlY2lmaWMgcGVyZm9ybWFuY2UuCi0KLVRoaXMgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuICBUaGUgRFRfQVVYSUxJQVJZIGVudHJpZXMKLXdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotQGtpbmRleCAtRgotQGtpbmRleCAtLWZpbHRlcgotQGl0ZW0gLUYgQHZhcntuYW1lfQotQGl0ZW14IC0tZmlsdGVyIEB2YXJ7bmFtZX0KLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfRklMVEVSIGZpZWxkIHRvCi10aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wgdGFibGUKLW9mIHRoZSBzaGFyZWQgb2JqZWN0IHdoaWNoIGlzIGJlaW5nIGNyZWF0ZWQgc2hvdWxkIGJlIHVzZWQgYXMgYSBmaWx0ZXIKLW9uIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfS4KLQotSWYgeW91IGxhdGVyIGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgdGhpcyBmaWx0ZXIgb2JqZWN0LCB0aGVuLCB3aGVuIHlvdQotcnVuIHRoZSBwcm9ncmFtLCB0aGUgZHluYW1pYyBsaW5rZXIgd2lsbCBzZWUgdGhlIERUX0ZJTFRFUiBmaWVsZC4gIFRoZQotZHluYW1pYyBsaW5rZXIgd2lsbCByZXNvbHZlIHN5bWJvbHMgYWNjb3JkaW5nIHRvIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlCi1maWx0ZXIgb2JqZWN0IGFzIHVzdWFsLCBidXQgaXQgd2lsbCBhY3R1YWxseSBsaW5rIHRvIHRoZSBkZWZpbml0aW9ucwotZm91bmQgaW4gdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfS4gIFRodXMgdGhlIGZpbHRlciBvYmplY3QgY2FuIGJlCi11c2VkIHRvIHNlbGVjdCBhIHN1YnNldCBvZiB0aGUgc3ltYm9scyBwcm92aWRlZCBieSB0aGUgb2JqZWN0Ci1AdmFye25hbWV9LgotCi1Tb21lIG9sZGVyIGxpbmtlcnMgdXNlZCB0aGUgQGNvZGV7LUZ9IG9wdGlvbiB0aHJvdWdob3V0IGEgY29tcGlsYXRpb24KLXRvb2xjaGFpbiBmb3Igc3BlY2lmeWluZyBvYmplY3QtZmlsZSBmb3JtYXQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dAotb2JqZWN0IGZpbGVzLiAgVGhlIEBzY3tnbnV9IGxpbmtlciB1c2VzIG90aGVyIG1lY2hhbmlzbXMgZm9yIHRoaXMKLXB1cnBvc2U6IHRoZSBAY29kZXstYn0sIEBjb2Rley0tZm9ybWF0fSwgQGNvZGV7LS1vZm9ybWF0fSBvcHRpb25zLCB0aGUKLUBjb2Rle1RBUkdFVH0gY29tbWFuZCBpbiBsaW5rZXIgc2NyaXB0cywgYW5kIHRoZSBAY29kZXtHTlVUQVJHRVR9Ci1lbnZpcm9ubWVudCB2YXJpYWJsZS4gIFRoZSBAc2N7Z251fSBsaW5rZXIgd2lsbCBpZ25vcmUgdGhlIEBjb2Rley1GfQotb3B0aW9uIHdoZW4gbm90IGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LgotCi1AY2luZGV4IGZpbmFsaXphdGlvbiBmdW5jdGlvbgotQGtpbmRleCAtZmluaQotQGl0ZW0gLWZpbmkgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0LCBjYWxsIE5BTUUgd2hlbiB0aGUKLWV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcyB1bmxvYWRlZCwgYnkgc2V0dGluZyBEVF9GSU5JIHRvIHRoZQotYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24uICBCeSBkZWZhdWx0LCB0aGUgbGlua2VyIHVzZXMgQGNvZGV7X2Zpbml9IGFzCi10aGUgZnVuY3Rpb24gdG8gY2FsbC4KLQotQGtpbmRleCAtZwotQGl0ZW0gLWcKLUlnbm9yZWQuICBQcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRvb2xzLgotCi1Aa2luZGV4IC1HCi1Aa2luZGV4IC0tZ3BzaXplCi1AY2luZGV4IG9iamVjdCBzaXplCi1AaXRlbSAtR0B2YXJ7dmFsdWV9Ci1AaXRlbXggLS1ncHNpemU9QHZhcnt2YWx1ZX0KLVNldCB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUCByZWdpc3RlciB0bwotQHZhcntzaXplfS4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIHN1Y2ggYXMKLU1JUFMgRUNPRkYgd2hpY2ggc3VwcG9ydHMgcHV0dGluZyBsYXJnZSBhbmQgc21hbGwgb2JqZWN0cyBpbnRvIGRpZmZlcmVudAotc2VjdGlvbnMuICBUaGlzIGlzIGlnbm9yZWQgZm9yIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUBjaW5kZXggcnVudGltZSBsaWJyYXJ5IG5hbWUKLUBraW5kZXggLWhAdmFye25hbWV9Ci1Aa2luZGV4IC1zb25hbWU9QHZhcntuYW1lfQotQGl0ZW0gLWhAdmFye25hbWV9Ci1AaXRlbXggLXNvbmFtZT1AdmFye25hbWV9Ci1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX1NPTkFNRSBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgV2hlbiBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCB3aXRoIGEgc2hhcmVkIG9iamVjdAotd2hpY2ggaGFzIGEgRFRfU09OQU1FIGZpZWxkLCB0aGVuIHdoZW4gdGhlIGV4ZWN1dGFibGUgaXMgcnVuIHRoZSBkeW5hbWljCi1saW5rZXIgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHNoYXJlZCBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBEVF9TT05BTUUKLWZpZWxkIHJhdGhlciB0aGFuIHRoZSB1c2luZyB0aGUgZmlsZSBuYW1lIGdpdmVuIHRvIHRoZSBsaW5rZXIuCi0KLUBraW5kZXggLWkKLUBjaW5kZXggaW5jcmVtZW50YWwgbGluawotQGl0ZW0gLWkKLVBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbGluayAoc2FtZSBhcyBvcHRpb24gQHNhbXB7LXJ9KS4KLQotQGNpbmRleCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotQGtpbmRleCAtaW5pdAotQGl0ZW0gLWluaXQgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0LCBjYWxsIE5BTUUgd2hlbiB0aGUKLWV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcyBsb2FkZWQsIGJ5IHNldHRpbmcgRFRfSU5JVCB0byB0aGUgYWRkcmVzcwotb2YgdGhlIGZ1bmN0aW9uLiAgQnkgZGVmYXVsdCwgdGhlIGxpbmtlciB1c2VzIEBjb2Rle19pbml0fSBhcyB0aGUKLWZ1bmN0aW9uIHRvIGNhbGwuCi0KLUBjaW5kZXggYXJjaGl2ZSBmaWxlcywgZnJvbSBjbWQgbGluZQotQGtpbmRleCAtbEB2YXJ7YXJjaGl2ZX0KLUBraW5kZXggLS1saWJyYXJ5PUB2YXJ7YXJjaGl2ZX0KLUBpdGVtIC1sQHZhcnthcmNoaXZlfQotQGl0ZW14IC0tbGlicmFyeT1AdmFye2FyY2hpdmV9Ci1BZGQgYXJjaGl2ZSBmaWxlIEB2YXJ7YXJjaGl2ZX0gdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gbGluay4gIFRoaXMKLW9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgQGNvZGV7bGR9IHdpbGwgc2VhcmNoIGl0cwotcGF0aC1saXN0IGZvciBvY2N1cnJlbmNlcyBvZiBAY29kZXtsaWJAdmFye2FyY2hpdmV9LmF9IGZvciBldmVyeQotQHZhcnthcmNoaXZlfSBzcGVjaWZpZWQuCi0KLU9uIHN5c3RlbXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLCBAY29kZXtsZH0gbWF5IGFsc28gc2VhcmNoIGZvcgotbGlicmFyaWVzIHdpdGggZXh0ZW5zaW9ucyBvdGhlciB0aGFuIEBjb2Rley5hfS4gIFNwZWNpZmljYWxseSwgb24gRUxGCi1hbmQgU3VuT1Mgc3lzdGVtcywgQGNvZGV7bGR9IHdpbGwgc2VhcmNoIGEgZGlyZWN0b3J5IGZvciBhIGxpYnJhcnkgd2l0aAotYW4gZXh0ZW5zaW9uIG9mIEBjb2Rley5zb30gYmVmb3JlIHNlYXJjaGluZyBmb3Igb25lIHdpdGggYW4gZXh0ZW5zaW9uIG9mCi1AY29kZXsuYX0uICBCeSBjb252ZW50aW9uLCBhIEBjb2Rley5zb30gZXh0ZW5zaW9uIGluZGljYXRlcyBhIHNoYXJlZAotbGlicmFyeS4KLQotVGhlIGxpbmtlciB3aWxsIHNlYXJjaCBhbiBhcmNoaXZlIG9ubHkgb25jZSwgYXQgdGhlIGxvY2F0aW9uIHdoZXJlIGl0IGlzCi1zcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIHRoZSBhcmNoaXZlIGRlZmluZXMgYSBzeW1ib2wgd2hpY2gKLXdhcyB1bmRlZmluZWQgaW4gc29tZSBvYmplY3Qgd2hpY2ggYXBwZWFyZWQgYmVmb3JlIHRoZSBhcmNoaXZlIG9uIHRoZQotY29tbWFuZCBsaW5lLCB0aGUgbGlua2VyIHdpbGwgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgZmlsZShzKSBmcm9tIHRoZQotYXJjaGl2ZS4gIEhvd2V2ZXIsIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gYW4gb2JqZWN0IGFwcGVhcmluZyBsYXRlciBvbgotdGhlIGNvbW1hbmQgbGluZSB3aWxsIG5vdCBjYXVzZSB0aGUgbGlua2VyIHRvIHNlYXJjaCB0aGUgYXJjaGl2ZSBhZ2Fpbi4KLQotU2VlIHRoZSBAY29kZXstKH0gb3B0aW9uIGZvciBhIHdheSB0byBmb3JjZSB0aGUgbGlua2VyIHRvIHNlYXJjaAotYXJjaGl2ZXMgbXVsdGlwbGUgdGltZXMuCi0KLVlvdSBtYXkgbGlzdCB0aGUgc2FtZSBhcmNoaXZlIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUBpZnNldCBHRU5FUklDCi1UaGlzIHR5cGUgb2YgYXJjaGl2ZSBzZWFyY2hpbmcgaXMgc3RhbmRhcmQgZm9yIFVuaXggbGlua2Vycy4gIEhvd2V2ZXIsCi1pZiB5b3UgYXJlIHVzaW5nIEBjb2Rle2xkfSBvbiBBSVgsIG5vdGUgdGhhdCBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKLWJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBzZWFyY2ggZGlyZWN0b3J5LCBmcm9tIGNtZCBsaW5lCi1Aa2luZGV4IC1MQHZhcntkaXJ9Ci1Aa2luZGV4IC0tbGlicmFyeS1wYXRoPUB2YXJ7ZGlyfQotQGl0ZW0gLUxAdmFye3NlYXJjaGRpcn0gCi1AaXRlbXggLS1saWJyYXJ5LXBhdGg9QHZhcntzZWFyY2hkaXJ9Ci1BZGQgcGF0aCBAdmFye3NlYXJjaGRpcn0gdG8gdGhlIGxpc3Qgb2YgcGF0aHMgdGhhdCBAY29kZXtsZH0gd2lsbCBzZWFyY2gKLWZvciBhcmNoaXZlIGxpYnJhcmllcyBhbmQgQGNvZGV7bGR9IGNvbnRyb2wgc2NyaXB0cy4gIFlvdSBtYXkgdXNlIHRoaXMKLW9wdGlvbiBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgVGhlIGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCBpbiB0aGUgb3JkZXIKLWluIHdoaWNoIHRoZXkgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRGlyZWN0b3JpZXMgc3BlY2lmaWVkCi1vbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBzZWFyY2hlZCBiZWZvcmUgdGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMuICBBbGwKLUBjb2Rley1MfSBvcHRpb25zIGFwcGx5IHRvIGFsbCBAY29kZXstbH0gb3B0aW9ucywgcmVnYXJkbGVzcyBvZiB0aGUKLW9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zIGFwcGVhci4KLQotQGlmc2V0IFVzZXNFbnZWYXJzCi1UaGUgZGVmYXVsdCBzZXQgb2YgcGF0aHMgc2VhcmNoZWQgKHdpdGhvdXQgYmVpbmcgc3BlY2lmaWVkIHdpdGgKLUBzYW1wey1MfSkgZGVwZW5kcyBvbiB3aGljaCBlbXVsYXRpb24gbW9kZSBAY29kZXtsZH0gaXMgdXNpbmcsIGFuZCBpbgotc29tZSBjYXNlcyBhbHNvIG9uIGhvdyBpdCB3YXMgY29uZmlndXJlZC4gIEB4cmVme0Vudmlyb25tZW50fS4KLUBlbmQgaWZzZXQKLQotVGhlIHBhdGhzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBpbiBhIGxpbmsgc2NyaXB0IHdpdGggdGhlCi1AY29kZXtTRUFSQ0hfRElSfSBjb21tYW5kLiAgRGlyZWN0b3JpZXMgc3BlY2lmaWVkIHRoaXMgd2F5IGFyZSBzZWFyY2hlZAotYXQgdGhlIHBvaW50IGluIHdoaWNoIHRoZSBsaW5rZXIgc2NyaXB0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KLQotQGNpbmRleCBlbXVsYXRpb24KLUBraW5kZXggLW0gQHZhcntlbXVsYXRpb259Ci1AaXRlbSAtbUB2YXJ7ZW11bGF0aW9ufQotRW11bGF0ZSB0aGUgQHZhcntlbXVsYXRpb259IGxpbmtlci4gIFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlCi1lbXVsYXRpb25zIHdpdGggdGhlIEBzYW1wey0tdmVyYm9zZX0gb3IgQHNhbXB7LVZ9IG9wdGlvbnMuCi0KLUlmIHRoZSBAc2FtcHstbX0gb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGUgZW11bGF0aW9uIGlzIHRha2VuIGZyb20gdGhlCi1AY29kZXtMREVNVUxBVElPTn0gZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHRoYXQgaXMgZGVmaW5lZC4KLQotT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBlbXVsYXRpb24gZGVwZW5kcyB1cG9uIGhvdyB0aGUgbGlua2VyIHdhcwotY29uZmlndXJlZC4KLQotQGNpbmRleCBsaW5rIG1hcAotQGtpbmRleCAtTQotQGtpbmRleCAtLXByaW50LW1hcAotQGl0ZW0gLU0KLUBpdGVteCAtLXByaW50LW1hcAotUHJpbnQgYSBsaW5rIG1hcCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgQSBsaW5rIG1hcCBwcm92aWRlcwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbmssIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotV2hlcmUgb2JqZWN0IGZpbGVzIGFuZCBzeW1ib2xzIGFyZSBtYXBwZWQgaW50byBtZW1vcnkuCi1AaXRlbQotSG93IGNvbW1vbiBzeW1ib2xzIGFyZSBhbGxvY2F0ZWQuCi1AaXRlbQotQWxsIGFyY2hpdmUgbWVtYmVycyBpbmNsdWRlZCBpbiB0aGUgbGluaywgd2l0aCBhIG1lbnRpb24gb2YgdGhlIHN5bWJvbAotd2hpY2ggY2F1c2VkIHRoZSBhcmNoaXZlIG1lbWJlciB0byBiZSBicm91Z2h0IGluLgotQGVuZCBpdGVtaXplCi0KLUBraW5kZXggLW4KLUBjaW5kZXggcmVhZC1vbmx5IHRleHQKLUBjaW5kZXggTk1BR0lDCi1Aa2luZGV4IC0tbm1hZ2ljCi1AaXRlbSAtbgotQGl0ZW14IC0tbm1hZ2ljCi1UdXJuIG9mZiBwYWdlIGFsaWdubWVudCBvZiBzZWN0aW9ucywgYW5kIG1hcmsgdGhlIG91dHB1dCBhcwotQGNvZGV7Tk1BR0lDfSBpZiBwb3NzaWJsZS4gCi0KLUBraW5kZXggLU4KLUBraW5kZXggLS1vbWFnaWMKLUBjaW5kZXggcmVhZC93cml0ZSBmcm9tIGNtZCBsaW5lCi1AY2luZGV4IE9NQUdJQwotQGl0ZW0gLU4gCi1AaXRlbXggLS1vbWFnaWMKLVNldCB0aGUgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucyB0byBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUuICBBbHNvLCBkbwotbm90IHBhZ2UtYWxpZ24gdGhlIGRhdGEgc2VnbWVudC4gIElmIHRoZSBvdXRwdXQgZm9ybWF0IHN1cHBvcnRzIFVuaXgKLXN0eWxlIG1hZ2ljIG51bWJlcnMsIG1hcmsgdGhlIG91dHB1dCBhcyBAY29kZXtPTUFHSUN9LgotCi1Aa2luZGV4IC1vIEB2YXJ7b3V0cHV0fQotQGtpbmRleCAtLW91dHB1dD1AdmFye291dHB1dH0KLUBjaW5kZXggbmFtaW5nIHRoZSBvdXRwdXQgZmlsZQotQGl0ZW0gLW8gQHZhcntvdXRwdXR9Ci1AaXRlbXggLS1vdXRwdXQ9QHZhcntvdXRwdXR9Ci1Vc2UgQHZhcntvdXRwdXR9IGFzIHRoZSBuYW1lIGZvciB0aGUgcHJvZ3JhbSBwcm9kdWNlZCBieSBAY29kZXtsZH07IGlmIHRoaXMKLW9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSBAZmlsZXthLm91dH0gaXMgdXNlZCBieSBkZWZhdWx0LiAgVGhlCi1zY3JpcHQgY29tbWFuZCBAY29kZXtPVVRQVVR9IGNhbiBhbHNvIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIG5hbWUuCi0KLUBraW5kZXggLU8gQHZhcntsZXZlbH0KLUBjaW5kZXggZ2VuZXJhdGluZyBvcHRpbWl6ZWQgb3V0cHV0Ci1AaXRlbSAtTyBAdmFye2xldmVsfQotSWYgQHZhcntsZXZlbH0gaXMgYSBudW1lcmljIHZhbHVlcyBncmVhdGVyIHRoYW4gemVybyBAY29kZXtsZH0gb3B0aW1pemVzCi10aGUgb3V0cHV0LiAgVGhpcyBtaWdodCB0YWtlIHNpZ25pZmljYW50bHkgbG9uZ2VyIGFuZCB0aGVyZWZvcmUgcHJvYmFibHkKLXNob3VsZCBvbmx5IGJlIGVuYWJsZWQgZm9yIHRoZSBmaW5hbCBiaW5hcnkuCi0KLUBjaW5kZXggcGFydGlhbCBsaW5rCi1AY2luZGV4IHJlbG9jYXRhYmxlIG91dHB1dAotQGtpbmRleCAtcgotQGtpbmRleCAtLXJlbG9jYXRlYWJsZQotQGl0ZW0gLXIKLUBpdGVteCAtLXJlbG9jYXRlYWJsZQotR2VuZXJhdGUgcmVsb2NhdGFibGUgb3V0cHV0LS0taS5lLiwgZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KLXR1cm4gc2VydmUgYXMgaW5wdXQgdG8gQGNvZGV7bGR9LiAgVGhpcyBpcyBvZnRlbiBjYWxsZWQgQGRmbntwYXJ0aWFsCi1saW5raW5nfS4gIEFzIGEgc2lkZSBlZmZlY3QsIGluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgc3RhbmRhcmQgVW5peAotbWFnaWMgbnVtYmVycywgdGhpcyBvcHRpb24gYWxzbyBzZXRzIHRoZSBvdXRwdXQgZmlsZSdzIG1hZ2ljIG51bWJlciB0bwotQGNvZGV7T01BR0lDfS4KLUBjIDsgc2VlIEBjb2Rley1OfS4gCi1JZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhbiBhYnNvbHV0ZSBmaWxlIGlzIHByb2R1Y2VkLiAgV2hlbgotbGlua2luZyBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIEBlbXBoe3dpbGwgbm90fSByZXNvbHZlIHJlZmVyZW5jZXMgdG8KLWNvbnN0cnVjdG9yczsgdG8gZG8gdGhhdCwgdXNlIEBzYW1wey1Vcn0uCi0KLVRoaXMgb3B0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgQHNhbXB7LWl9LgotCi1Aa2luZGV4IC1SIEB2YXJ7ZmlsZX0KLUBraW5kZXggLS1qdXN0LXN5bWJvbHM9QHZhcntmaWxlfQotQGNpbmRleCBzeW1ib2wtb25seSBpbnB1dAotQGl0ZW0gLVIgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLWp1c3Qtc3ltYm9scz1AdmFye2ZpbGVuYW1lfQotUmVhZCBzeW1ib2wgbmFtZXMgYW5kIHRoZWlyIGFkZHJlc3NlcyBmcm9tIEB2YXJ7ZmlsZW5hbWV9LCBidXQgZG8gbm90Ci1yZWxvY2F0ZSBpdCBvciBpbmNsdWRlIGl0IGluIHRoZSBvdXRwdXQuICBUaGlzIGFsbG93cyB5b3VyIG91dHB1dCBmaWxlCi10byByZWZlciBzeW1ib2xpY2FsbHkgdG8gYWJzb2x1dGUgbG9jYXRpb25zIG9mIG1lbW9yeSBkZWZpbmVkIGluIG90aGVyCi1wcm9ncmFtcy4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIG1vcmUgdGhhbiBvbmNlLgotCi1Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIEVMRiBsaW5rZXJzLCBpZiB0aGUgQGNvZGV7LVJ9IG9wdGlvbiBpcwotZm9sbG93ZWQgYnkgYSBkaXJlY3RvcnkgbmFtZSwgcmF0aGVyIHRoYW4gYSBmaWxlIG5hbWUsIGl0IGlzIHRyZWF0ZWQgYXMKLXRoZSBAY29kZXstcnBhdGh9IG9wdGlvbi4KLQotQGtpbmRleCAtcwotQGtpbmRleCAtLXN0cmlwLWFsbAotQGNpbmRleCBzdHJpcCBhbGwgc3ltYm9scwotQGl0ZW0gLXMgCi1AaXRlbXggLS1zdHJpcC1hbGwKLU9taXQgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotQGtpbmRleCAtUwotQGtpbmRleCAtLXN0cmlwLWRlYnVnCi1AY2luZGV4IHN0cmlwIGRlYnVnZ2VyIHN5bWJvbHMKLUBpdGVtIC1TIAotQGl0ZW14IC0tc3RyaXAtZGVidWcKLU9taXQgZGVidWdnZXIgc3ltYm9sIGluZm9ybWF0aW9uIChidXQgbm90IGFsbCBzeW1ib2xzKSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotQGtpbmRleCAtdAotQGtpbmRleCAtLXRyYWNlCi1AY2luZGV4IGlucHV0IGZpbGVzLCBkaXNwbGF5aW5nCi1AaXRlbSAtdCAKLUBpdGVteCAtLXRyYWNlCi1QcmludCB0aGUgbmFtZXMgb2YgdGhlIGlucHV0IGZpbGVzIGFzIEBjb2Rle2xkfSBwcm9jZXNzZXMgdGhlbS4KLQotQGtpbmRleCAtVCBAdmFye3NjcmlwdH0KLUBraW5kZXggLS1zY3JpcHQ9QHZhcntzY3JpcHR9Ci1AY2luZGV4IHNjcmlwdCBmaWxlcwotQGl0ZW0gLVQgQHZhcntzY3JpcHRmaWxlfQotQGl0ZW14IC0tc2NyaXB0PUB2YXJ7c2NyaXB0ZmlsZX0KLVVzZSBAdmFye3NjcmlwdGZpbGV9IGFzIHRoZSBsaW5rZXIgc2NyaXB0LiAgVGhpcyBzY3JpcHQgcmVwbGFjZXMKLUBjb2Rle2xkfSdzIGRlZmF1bHQgbGlua2VyIHNjcmlwdCAocmF0aGVyIHRoYW4gYWRkaW5nIHRvIGl0KSwgc28KLUB2YXJ7Y29tbWFuZGZpbGV9IG11c3Qgc3BlY2lmeSBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byBkZXNjcmliZSB0aGUKLW91dHB1dCBmaWxlLiAgWW91IG11c3QgdXNlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBhIGNvbW1hbmQKLXdoaWNoIGNhbiBvbmx5IGFwcGVhciBvbmNlIGluIGEgbGlua2VyIHNjcmlwdCwgc3VjaCBhcyB0aGUKLUBjb2Rle1NFQ1RJT05TfSBvciBAY29kZXtNRU1PUll9IGNvbW1hbmQuICBAeHJlZntTY3JpcHRzfS4gIElmCi1AdmFye3NjcmlwdGZpbGV9IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgQGNvZGV7bGR9Ci1sb29rcyBmb3IgaXQgaW4gdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSBhbnkgcHJlY2VkaW5nIEBzYW1wey1MfQotb3B0aW9ucy4gIE11bHRpcGxlIEBzYW1wey1UfSBvcHRpb25zIGFjY3VtdWxhdGUuCi0KLUBraW5kZXggLXUgQHZhcntzeW1ib2x9Ci1Aa2luZGV4IC0tdW5kZWZpbmVkPUB2YXJ7c3ltYm9sfQotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9sCi1AaXRlbSAtdSBAdmFye3N5bWJvbH0KLUBpdGVteCAtLXVuZGVmaW5lZD1AdmFye3N5bWJvbH0KLUZvcmNlIEB2YXJ7c3ltYm9sfSB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQKLXN5bWJvbC4gIERvaW5nIHRoaXMgbWF5LCBmb3IgZXhhbXBsZSwgdHJpZ2dlciBsaW5raW5nIG9mIGFkZGl0aW9uYWwKLW1vZHVsZXMgZnJvbSBzdGFuZGFyZCBsaWJyYXJpZXMuICBAc2FtcHstdX0gbWF5IGJlIHJlcGVhdGVkIHdpdGgKLWRpZmZlcmVudCBvcHRpb24gYXJndW1lbnRzIHRvIGVudGVyIGFkZGl0aW9uYWwgdW5kZWZpbmVkIHN5bWJvbHMuICBUaGlzCi1vcHRpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgQGNvZGV7RVhURVJOfSBsaW5rZXIgc2NyaXB0IGNvbW1hbmQuCi0KLUBraW5kZXggLVVyCi1AY2luZGV4IGNvbnN0cnVjdG9ycwotQGl0ZW0gLVVyIAotRm9yIGFueXRoaW5nIG90aGVyIHRoYW4gQysrIHByb2dyYW1zLCB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHstcn06IGl0IGdlbmVyYXRlcyByZWxvY2F0YWJsZSBvdXRwdXQtLS1pLmUuLCBhbiBvdXRwdXQgZmlsZSB0aGF0IGNhbiBpbgotdHVybiBzZXJ2ZSBhcyBpbnB1dCB0byBAY29kZXtsZH0uICBXaGVuIGxpbmtpbmcgQysrIHByb2dyYW1zLCBAc2FtcHstVXJ9Ci1AZW1waHtkb2VzfSByZXNvbHZlIHJlZmVyZW5jZXMgdG8gY29uc3RydWN0b3JzLCB1bmxpa2UgQHNhbXB7LXJ9LgotSXQgZG9lcyBub3Qgd29yayB0byB1c2UgQHNhbXB7LVVyfSBvbiBmaWxlcyB0aGF0IHdlcmUgdGhlbXNlbHZlcyBsaW5rZWQKLXdpdGggQHNhbXB7LVVyfTsgb25jZSB0aGUgY29uc3RydWN0b3IgdGFibGUgaGFzIGJlZW4gYnVpbHQsIGl0IGNhbm5vdAotYmUgYWRkZWQgdG8uICBVc2UgQHNhbXB7LVVyfSBvbmx5IGZvciB0aGUgbGFzdCBwYXJ0aWFsIGxpbmssIGFuZAotQHNhbXB7LXJ9IGZvciB0aGUgb3RoZXJzLgotCi1Aa2luZGV4IC12Ci1Aa2luZGV4IC1WCi1Aa2luZGV4IC0tdmVyc2lvbgotQGNpbmRleCB2ZXJzaW9uCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyc2lvbgotQGl0ZW14IC1WCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7bGR9LiAgVGhlIEBjb2Rley1WfSBvcHRpb24gYWxzbwotbGlzdHMgdGhlIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi1Aa2luZGV4IC14Ci1Aa2luZGV4IC0tZGlzY2FyZC1hbGwKLUBjaW5kZXggZGVsZXRpbmcgbG9jYWwgc3ltYm9scwotQGl0ZW0gLXgKLUBpdGVteCAtLWRpc2NhcmQtYWxsCi1EZWxldGUgYWxsIGxvY2FsIHN5bWJvbHMuCi0KLUBraW5kZXggLVgKLUBraW5kZXggLS1kaXNjYXJkLWxvY2FscwotQGNpbmRleCBsb2NhbCBzeW1ib2xzLCBkZWxldGluZwotQGNpbmRleCBMLCBkZWxldGluZyBzeW1ib2xzIGJlZ2lubmluZwotQGl0ZW0gLVggCi1AaXRlbXggLS1kaXNjYXJkLWxvY2FscwotRGVsZXRlIGFsbCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scy4gIEZvciBtb3N0IHRhcmdldHMsIHRoaXMgaXMgYWxsIGxvY2FsCi1zeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggQHNhbXB7TH0uCi0KLUBraW5kZXggLXkgQHZhcntzeW1ib2x9Ci1Aa2luZGV4IC0tdHJhY2Utc3ltYm9sPUB2YXJ7c3ltYm9sfQotQGNpbmRleCBzeW1ib2wgdHJhY2luZwotQGl0ZW0gLXkgQHZhcntzeW1ib2x9Ci1AaXRlbXggLS10cmFjZS1zeW1ib2w9QHZhcntzeW1ib2x9Ci1QcmludCB0aGUgbmFtZSBvZiBlYWNoIGxpbmtlZCBmaWxlIGluIHdoaWNoIEB2YXJ7c3ltYm9sfSBhcHBlYXJzLiAgVGhpcwotb3B0aW9uIG1heSBiZSBnaXZlbiBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgT24gbWFueSBzeXN0ZW1zIGl0IGlzIG5lY2Vzc2FyeQotdG8gcHJlcGVuZCBhbiB1bmRlcnNjb3JlLgotCi1UaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sIGluIHlvdXIgbGluayBidXQKLWRvbid0IGtub3cgd2hlcmUgdGhlIHJlZmVyZW5jZSBpcyBjb21pbmcgZnJvbS4KLQotQGtpbmRleCAtWSBAdmFye3BhdGh9Ci1AaXRlbSAtWSBAdmFye3BhdGh9Ci1BZGQgQHZhcntwYXRofSB0byB0aGUgZGVmYXVsdCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAgVGhpcyBvcHRpb24gZXhpc3RzCi1mb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC16IEB2YXJ7a2V5d29yZH0KLUBpdGVtIC16IEB2YXJ7a2V5d29yZH0KLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQotQGtpbmRleCAtKAotQGNpbmRleCBncm91cHMgb2YgYXJjaGl2ZXMKLUBpdGVtIC0oIEB2YXJ7YXJjaGl2ZXN9IC0pCi1AaXRlbXggLS1zdGFydC1ncm91cCBAdmFye2FyY2hpdmVzfSAtLWVuZC1ncm91cAotVGhlIEB2YXJ7YXJjaGl2ZXN9IHNob3VsZCBiZSBhIGxpc3Qgb2YgYXJjaGl2ZSBmaWxlcy4gIFRoZXkgbWF5IGJlCi1laXRoZXIgZXhwbGljaXQgZmlsZSBuYW1lcywgb3IgQHNhbXB7LWx9IG9wdGlvbnMuCi0KLVRoZSBzcGVjaWZpZWQgYXJjaGl2ZXMgYXJlIHNlYXJjaGVkIHJlcGVhdGVkbHkgdW50aWwgbm8gbmV3IHVuZGVmaW5lZAotcmVmZXJlbmNlcyBhcmUgY3JlYXRlZC4gIE5vcm1hbGx5LCBhbiBhcmNoaXZlIGlzIHNlYXJjaGVkIG9ubHkgb25jZSBpbgotdGhlIG9yZGVyIHRoYXQgaXQgaXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBJZiBhIHN5bWJvbCBpbiB0aGF0Ci1hcmNoaXZlIGlzIG5lZWRlZCB0byByZXNvbHZlIGFuIHVuZGVmaW5lZCBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgYW4KLW9iamVjdCBpbiBhbiBhcmNoaXZlIHRoYXQgYXBwZWFycyBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgbGlua2VyCi13b3VsZCBub3QgYmUgYWJsZSB0byByZXNvbHZlIHRoYXQgcmVmZXJlbmNlLiAgQnkgZ3JvdXBpbmcgdGhlIGFyY2hpdmVzLAotdGhleSBhbGwgYmUgc2VhcmNoZWQgcmVwZWF0ZWRseSB1bnRpbCBhbGwgcG9zc2libGUgcmVmZXJlbmNlcyBhcmUKLXJlc29sdmVkLgotCi1Vc2luZyB0aGlzIG9wdGlvbiBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBjb3N0LiAgSXQgaXMgYmVzdCB0byB1c2UKLWl0IG9ubHkgd2hlbiB0aGVyZSBhcmUgdW5hdm9pZGFibGUgY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIHR3byBvcgotbW9yZSBhcmNoaXZlcy4KLQotQGtpbmRleCAtYXNzZXJ0IEB2YXJ7a2V5d29yZH0KLUBpdGVtIC1hc3NlcnQgQHZhcntrZXl3b3JkfQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgU3VuT1MgY29tcGF0aWJpbGl0eS4KLQotQGtpbmRleCAtQmR5bmFtaWMKLUBraW5kZXggLWR5Ci1Aa2luZGV4IC1jYWxsX3NoYXJlZAotQGl0ZW0gLUJkeW5hbWljCi1AaXRlbXggLWR5Ci1AaXRlbXggLWNhbGxfc2hhcmVkCi1MaW5rIGFnYWluc3QgZHluYW1pYyBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBwbGF0Zm9ybXMKLWZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuICBUaGlzIG9wdGlvbiBpcyBub3JtYWxseSB0aGUKLWRlZmF1bHQgb24gc3VjaCBwbGF0Zm9ybXMuICBUaGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoaXMgb3B0aW9uIGFyZQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2YXJpb3VzIHN5c3RlbXMuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbgotbXVsdGlwbGUgdGltZXMgb24gdGhlIGNvbW1hbmQgbGluZTogaXQgYWZmZWN0cyBsaWJyYXJ5IHNlYXJjaGluZyBmb3IKLUBjb2Rley1sfSBvcHRpb25zIHdoaWNoIGZvbGxvdyBpdC4KLQotQGtpbmRleCAtQnN0YXRpYwotQGtpbmRleCAtZG4KLUBraW5kZXggLW5vbl9zaGFyZWQKLUBraW5kZXggLXN0YXRpYwotQGl0ZW0gLUJzdGF0aWMgCi1AaXRlbXggLWRuCi1AaXRlbXggLW5vbl9zaGFyZWQKLUBpdGVteCAtc3RhdGljCi1EbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbgotcGxhdGZvcm1zIGZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuICBUaGUgZGlmZmVyZW50Ci12YXJpYW50cyBvZiB0aGlzIG9wdGlvbiBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2YXJpb3VzIHN5c3RlbXMuICBZb3UKLW1heSB1c2UgdGhpcyBvcHRpb24gbXVsdGlwbGUgdGltZXMgb24gdGhlIGNvbW1hbmQgbGluZTogaXQgYWZmZWN0cwotbGlicmFyeSBzZWFyY2hpbmcgZm9yIEBjb2Rley1sfSBvcHRpb25zIHdoaWNoIGZvbGxvdyBpdC4KLQotQGtpbmRleCAtQnN5bWJvbGljCi1AaXRlbSAtQnN5bWJvbGljCi1XaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGJpbmQgcmVmZXJlbmNlcyB0byBnbG9iYWwgc3ltYm9scyB0byB0aGUKLWRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgaWYgYW55LiAgTm9ybWFsbHksIGl0IGlzIHBvc3NpYmxlCi1mb3IgYSBwcm9ncmFtIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmluaXRpb24KLXdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgb24gRUxGCi1wbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi1Aa2luZGV4IC0tY2hlY2stc2VjdGlvbnMKLUBraW5kZXggLS1uby1jaGVjay1zZWN0aW9ucwotQGl0ZW0gLS1jaGVjay1zZWN0aW9ucwotQGl0ZW14IC0tbm8tY2hlY2stc2VjdGlvbnMKLUFza3MgdGhlIGxpbmtlciBAZW1waHtub3R9IHRvIGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGFmdGVyIHRoZXkgaGF2ZQotYmVlbiBhc3NpZ25lZCB0byBzZWUgaWYgdGhlcmUgYW55IG92ZXJsYXBzLiAgTm9ybWFsbHkgdGhlIGxpbmtlciB3aWxsCi1wZXJmb3JtIHRoaXMgY2hlY2ssIGFuZCBpZiBpdCBmaW5kcyBhbnkgb3ZlcmxhcHMgaXQgd2lsbCBwcm9kdWNlCi1zdWl0YWJsZSBlcnJvciBtZXNzYWdlcy4gIFRoZSBsaW5rZXIgZG9lcyBrbm93IGFib3V0LCBhbmQgZG9lcyBtYWtlCi1hbGxvd2FuY2VzIGZvciBzZWN0aW9ucyBpbiBvdmVybGF5cy4gIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBjYW4gYmUKLXJlc3RvcmVkIGJ5IHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgc3dpdGNoIEBzYW1wey0tY2hlY2stc2VjdGlvbnN9LgotCi1AY2luZGV4IGNyb3NzIHJlZmVyZW5jZSB0YWJsZQotQGtpbmRleCAtLWNyZWYKLUBpdGVtIC0tY3JlZgotT3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgSWYgYSBsaW5rZXIgbWFwIGZpbGUgaXMgYmVpbmcKLWdlbmVyYXRlZCwgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBpcyBwcmludGVkIHRvIHRoZSBtYXAgZmlsZS4KLU90aGVyd2lzZSwgaXQgaXMgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi1UaGUgZm9ybWF0IG9mIHRoZSB0YWJsZSBpcyBpbnRlbnRpb25hbGx5IHNpbXBsZSwgc28gdGhhdCBpdCBtYXkgYmUKLWVhc2lseSBwcm9jZXNzZWQgYnkgYSBzY3JpcHQgaWYgbmVjZXNzYXJ5LiAgVGhlIHN5bWJvbHMgYXJlIHByaW50ZWQgb3V0LAotc29ydGVkIGJ5IG5hbWUuICBGb3IgZWFjaCBzeW1ib2wsIGEgbGlzdCBvZiBmaWxlIG5hbWVzIGlzIGdpdmVuLiAgSWYgdGhlCi1zeW1ib2wgaXMgZGVmaW5lZCwgdGhlIGZpcnN0IGZpbGUgbGlzdGVkIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUKLWRlZmluaXRpb24uICBUaGUgcmVtYWluaW5nIGZpbGVzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sLgotCi1AY2luZGV4IHN5bWJvbHMsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC0tZGVmc3ltIEB2YXJ7c3ltYm9sfT1AdmFye2V4cH0KLUBpdGVtIC0tZGVmc3ltIEB2YXJ7c3ltYm9sfT1AdmFye2V4cHJlc3Npb259Ci1DcmVhdGUgYSBnbG9iYWwgc3ltYm9sIGluIHRoZSBvdXRwdXQgZmlsZSwgY29udGFpbmluZyB0aGUgYWJzb2x1dGUKLWFkZHJlc3MgZ2l2ZW4gYnkgQHZhcntleHByZXNzaW9ufS4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIGFzIG1hbnkKLXRpbWVzIGFzIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGlwbGUgc3ltYm9scyBpbiB0aGUgY29tbWFuZCBsaW5lLiAgQQotbGltaXRlZCBmb3JtIG9mIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkIGZvciB0aGUgQHZhcntleHByZXNzaW9ufSBpbiB0aGlzCi1jb250ZXh0OiB5b3UgbWF5IGdpdmUgYSBoZXhhZGVjaW1hbCBjb25zdGFudCBvciB0aGUgbmFtZSBvZiBhbiBleGlzdGluZwotc3ltYm9sLCBvciB1c2UgQGNvZGV7K30gYW5kIEBjb2Rley19IHRvIGFkZCBvciBzdWJ0cmFjdCBoZXhhZGVjaW1hbAotY29uc3RhbnRzIG9yIHN5bWJvbHMuICBJZiB5b3UgbmVlZCBtb3JlIGVsYWJvcmF0ZSBleHByZXNzaW9ucywgY29uc2lkZXIKLXVzaW5nIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZSBmcm9tIGEgc2NyaXB0IChAcHhyZWZ7QXNzaWdubWVudHMsLAotQXNzaWdubWVudDogU3ltYm9sIERlZmluaXRpb25zfSkuICBAZW1waHtOb3RlOn0gdGhlcmUgc2hvdWxkIGJlIG5vIHdoaXRlCi1zcGFjZSBiZXR3ZWVuIEB2YXJ7c3ltYm9sfSwgdGhlIGVxdWFscyBzaWduIChgYEBrZXl7PX0nJyksIGFuZAotQHZhcntleHByZXNzaW9ufS4KLQotQGNpbmRleCBkZW1hbmdsaW5nLCBmcm9tIGNvbW1hbmQgbGluZQotQGtpbmRleCAtLWRlbWFuZ2xlCi1Aa2luZGV4IC0tbm8tZGVtYW5nbGUKLUBpdGVtIC0tZGVtYW5nbGUKLUBpdGVteCAtLW5vLWRlbWFuZ2xlCi1UaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hldGhlciB0byBkZW1hbmdsZSBzeW1ib2wgbmFtZXMgaW4gZXJyb3IgbWVzc2FnZXMKLWFuZCBvdGhlciBvdXRwdXQuICBXaGVuIHRoZSBsaW5rZXIgaXMgdG9sZCB0byBkZW1hbmdsZSwgaXQgdHJpZXMgdG8KLXByZXNlbnQgc3ltYm9sIG5hbWVzIGluIGEgcmVhZGFibGUgZmFzaGlvbjogaXQgc3RyaXBzIGxlYWRpbmcKLXVuZGVyc2NvcmVzIGlmIHRoZXkgYXJlIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgYW5kIGNvbnZlcnRzIEMrKwotbWFuZ2xlZCBzeW1ib2wgbmFtZXMgaW50byB1c2VyIHJlYWRhYmxlIG5hbWVzLiAgVGhlIGxpbmtlciB3aWxsIGRlbWFuZ2xlCi1ieSBkZWZhdWx0IHVubGVzcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQHNhbXB7Q09MTEVDVF9OT19ERU1BTkdMRX0gaXMKLXNldC4gIFRoZXNlIG9wdGlvbnMgbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCi0KLUBjaW5kZXggZHluYW1pYyBsaW5rZXIsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC0tZHluYW1pYy1saW5rZXIgQHZhcntmaWxlfQotQGl0ZW0gLS1keW5hbWljLWxpbmtlciBAdmFye2ZpbGV9Ci1TZXQgdGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgbGlua2VyLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbgotZ2VuZXJhdGluZyBkeW5hbWljYWxseSBsaW5rZWQgRUxGIGV4ZWN1dGFibGVzLiAgVGhlIGRlZmF1bHQgZHluYW1pYwotbGlua2VyIGlzIG5vcm1hbGx5IGNvcnJlY3Q7IGRvbid0IHVzZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUKLWRvaW5nLgotCi1AY2luZGV4IE1JUFMgZW1iZWRkZWQgUElDIGNvZGUKLUBraW5kZXggLS1lbWJlZGRlZC1yZWxvY3MKLUBpdGVtIC0tZW1iZWRkZWQtcmVsb2NzCi1UaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBsaW5raW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUsCi1nZW5lcmF0ZWQgYnkgdGhlIC1tZW1iZWRkZWQtcGljIG9wdGlvbiB0byB0aGUgQHNje2dudX0gY29tcGlsZXIgYW5kCi1hc3NlbWJsZXIuICBJdCBjYXVzZXMgdGhlIGxpbmtlciB0byBjcmVhdGUgYSB0YWJsZSB3aGljaCBtYXkgYmUgdXNlZCBhdAotcnVudGltZSB0byByZWxvY2F0ZSBhbnkgZGF0YSB3aGljaCB3YXMgc3RhdGljYWxseSBpbml0aWFsaXplZCB0byBwb2ludGVyCi12YWx1ZXMuICBTZWUgdGhlIGNvZGUgaW4gdGVzdHN1aXRlL2xkLWVtcGljIGZvciBkZXRhaWxzLgotCi1Aa2luZGV4IC0tZm9yY2UtZXhlLXN1ZmZpeAotQGl0ZW0gIC0tZm9yY2UtZXhlLXN1ZmZpeAotTWFrZSBzdXJlIHRoYXQgYW4gb3V0cHV0IGZpbGUgaGFzIGEgLmV4ZSBzdWZmaXguCi0KLUlmIGEgc3VjY2Vzc2Z1bGx5IGJ1aWx0IGZ1bGx5IGxpbmtlZCBvdXRwdXQgZmlsZSBkb2VzIG5vdCBoYXZlIGEKLUBjb2Rley5leGV9IG9yIEBjb2Rley5kbGx9IHN1ZmZpeCwgdGhpcyBvcHRpb24gZm9yY2VzIHRoZSBsaW5rZXIgdG8gY29weQotdGhlIG91dHB1dCBmaWxlIHRvIG9uZSBvZiB0aGUgc2FtZSBuYW1lIHdpdGggYSBAY29kZXsuZXhlfSBzdWZmaXguIFRoaXMKLW9wdGlvbiBpcyB1c2VmdWwgd2hlbiB1c2luZyB1bm1vZGlmaWVkIFVuaXggbWFrZWZpbGVzIG9uIGEgTWljcm9zb2Z0Ci1XaW5kb3dzIGhvc3QsIHNpbmNlIHNvbWUgdmVyc2lvbnMgb2YgV2luZG93cyB3b24ndCBydW4gYW4gaW1hZ2UgdW5sZXNzCi1pdCBlbmRzIGluIGEgQGNvZGV7LmV4ZX0gc3VmZml4LgotCi1Aa2luZGV4IC0tZ2Mtc2VjdGlvbnMKLUBraW5kZXggLS1uby1nYy1zZWN0aW9ucwotQGNpbmRleCBnYXJiYWdlIGNvbGxlY3Rpb24KLUBpdGVtIC0tbm8tZ2Mtc2VjdGlvbnMKLUBpdGVteCAtLWdjLXNlY3Rpb25zCi1FbmFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHVudXNlZCBpbnB1dCBzZWN0aW9ucy4gIEl0IGlzIGlnbm9yZWQgb24KLXRhcmdldHMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGlzIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGlzIG5vdCBjb21wYXRpYmxlCi13aXRoIEBzYW1wey1yfSwgbm9yIHNob3VsZCBpdCBiZSB1c2VkIHdpdGggZHluYW1pYyBsaW5raW5nLiAgVGhlIGRlZmF1bHQKLWJlaGF2aW91ciAob2Ygbm90IHBlcmZvcm1pbmcgdGhpcyBnYXJiYWdlIGNvbGxlY3Rpb24pIGNhbiBiZSByZXN0b3JlZCBieQotc3BlY2lmeWluZyBAc2FtcHstLW5vLWdjLXNlY3Rpb25zfSBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi1AY2luZGV4IGhlbHAKLUBjaW5kZXggdXNhZ2UKLUBraW5kZXggLS1oZWxwCi1AaXRlbSAtLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLQotQGtpbmRleCAtTWFwCi1AaXRlbSAtTWFwIEB2YXJ7bWFwZmlsZX0KLVByaW50IGEgbGluayBtYXAgdG8gdGhlIGZpbGUgQHZhcnttYXBmaWxlfS4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCi1Ac2FtcHstTX0gb3B0aW9uLCBhYm92ZS4KLQotQGNpbmRleCBtZW1vcnkgdXNhZ2UKLUBraW5kZXggLS1uby1rZWVwLW1lbW9yeQotQGl0ZW0gLS1uby1rZWVwLW1lbW9yeQotQGNvZGV7bGR9IG5vcm1hbGx5IG9wdGltaXplcyBmb3Igc3BlZWQgb3ZlciBtZW1vcnkgdXNhZ2UgYnkgY2FjaGluZyB0aGUKLXN5bWJvbCB0YWJsZXMgb2YgaW5wdXQgZmlsZXMgaW4gbWVtb3J5LiAgVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7bGR9IHRvCi1pbnN0ZWFkIG9wdGltaXplIGZvciBtZW1vcnkgdXNhZ2UsIGJ5IHJlcmVhZGluZyB0aGUgc3ltYm9sIHRhYmxlcyBhcwotbmVjZXNzYXJ5LiAgVGhpcyBtYXkgYmUgcmVxdWlyZWQgaWYgQGNvZGV7bGR9IHJ1bnMgb3V0IG9mIG1lbW9yeSBzcGFjZQotd2hpbGUgbGlua2luZyBhIGxhcmdlIGV4ZWN1dGFibGUuCi0KLUBraW5kZXggLS1uby11bmRlZmluZWQKLUBpdGVtIC0tbm8tdW5kZWZpbmVkCi1Ob3JtYWxseSB3aGVuIGNyZWF0aW5nIGEgbm9uLXN5bWJvbGljIHNoYXJlZCBsaWJyYXJ5LCB1bmRlZmluZWQgc3ltYm9scwotYXJlIGFsbG93ZWQgYW5kIGxlZnQgdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIHJ1bnRpbWUgbG9hZGVyLiAgVGhpcyBvcHRpb24KLWRpc2FsbG93cyBzdWNoIHVuZGVmaW5lZCBzeW1ib2xzLgotCi1Aa2luZGV4IC0tbm8td2Fybi1taXNtYXRjaAotQGl0ZW0gLS1uby13YXJuLW1pc21hdGNoCi1Ob3JtYWxseSBAY29kZXtsZH0gd2lsbCBnaXZlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gbGluayB0b2dldGhlciBpbnB1dAotZmlsZXMgdGhhdCBhcmUgbWlzbWF0Y2hlZCBmb3Igc29tZSByZWFzb24sIHBlcmhhcHMgYmVjYXVzZSB0aGV5IGhhdmUKLWJlZW4gY29tcGlsZWQgZm9yIGRpZmZlcmVudCBwcm9jZXNzb3JzIG9yIGZvciBkaWZmZXJlbnQgZW5kaWFubmVzc2VzLgotVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7bGR9IHRoYXQgaXQgc2hvdWxkIHNpbGVudGx5IHBlcm1pdCBzdWNoIHBvc3NpYmxlCi1lcnJvcnMuICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggY2FyZSwgaW4gY2FzZXMgd2hlbiB5b3UKLWhhdmUgdGFrZW4gc29tZSBzcGVjaWFsIGFjdGlvbiB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgbGlua2VyIGVycm9ycyBhcmUKLWluYXBwcm9wcmlhdGUuCi0KLUBraW5kZXggLS1uby13aG9sZS1hcmNoaXZlCi1AaXRlbSAtLW5vLXdob2xlLWFyY2hpdmUKLVR1cm4gb2ZmIHRoZSBlZmZlY3Qgb2YgdGhlIEBjb2Rley0td2hvbGUtYXJjaGl2ZX0gb3B0aW9uIGZvciBzdWJzZXF1ZW50Ci1hcmNoaXZlIGZpbGVzLgotCi1AY2luZGV4IG91dHB1dCBmaWxlIGFmdGVyIGVycm9ycwotQGtpbmRleCAtLW5vaW5oaWJpdC1leGVjCi1AaXRlbSAtLW5vaW5oaWJpdC1leGVjCi1SZXRhaW4gdGhlIGV4ZWN1dGFibGUgb3V0cHV0IGZpbGUgd2hlbmV2ZXIgaXQgaXMgc3RpbGwgdXNhYmxlLgotTm9ybWFsbHksIHRoZSBsaW5rZXIgd2lsbCBub3QgcHJvZHVjZSBhbiBvdXRwdXQgZmlsZSBpZiBpdCBlbmNvdW50ZXJzCi1lcnJvcnMgZHVyaW5nIHRoZSBsaW5rIHByb2Nlc3M7IGl0IGV4aXRzIHdpdGhvdXQgd3JpdGluZyBhbiBvdXRwdXQgZmlsZQotd2hlbiBpdCBpc3N1ZXMgYW55IGVycm9yIHdoYXRzb2V2ZXIuCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotQGtpbmRleCAtLW9mb3JtYXQKLUBpdGVtIC0tb2Zvcm1hdCBAdmFye291dHB1dC1mb3JtYXR9Ci1AY29kZXtsZH0gbWF5IGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGtpbmQgb2Ygb2JqZWN0Ci1maWxlLiAgSWYgeW91ciBAY29kZXtsZH0gaXMgY29uZmlndXJlZCB0aGlzIHdheSwgeW91IGNhbiB1c2UgdGhlCi1Ac2FtcHstLW9mb3JtYXR9IG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBiaW5hcnkgZm9ybWF0IGZvciB0aGUgb3V0cHV0Ci1vYmplY3QgZmlsZS4gIEV2ZW4gd2hlbiBAY29kZXtsZH0gaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IGFsdGVybmF0aXZlCi1vYmplY3QgZm9ybWF0cywgeW91IGRvbid0IHVzdWFsbHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMsIGFzIEBjb2Rle2xkfQotc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBhcyBhIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMgYSB0ZXh0IHN0cmluZywgdGhlCi1uYW1lIG9mIGEgcGFydGljdWxhciBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgKFlvdSBjYW4KLWxpc3QgdGhlIGF2YWlsYWJsZSBiaW5hcnkgZm9ybWF0cyB3aXRoIEBzYW1we29iamR1bXAgLWl9LikgIFRoZSBzY3JpcHQKLWNvbW1hbmQgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZvcm1hdCwgYnV0Ci10aGlzIG9wdGlvbiBvdmVycmlkZXMgaXQuICBAeHJlZntCRkR9LgotQGVuZCBpZmNsZWFyCi0KLUBraW5kZXggLXFtYWdpYwotQGl0ZW0gLXFtYWdpYwotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KLQotQGtpbmRleCAtUXkKLUBpdGVtIC1ReQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC0tcmVsYXgKLUBjaW5kZXggc3ludGhlc2l6aW5nIGxpbmtlcgotQGNpbmRleCByZWxheGluZyBhZGRyZXNzaW5nIG1vZGVzCi1AaXRlbSAtLXJlbGF4Ci1BbiBvcHRpb24gd2l0aCBtYWNoaW5lIGRlcGVuZGVudCBlZmZlY3RzLiAgCi1AaWZzZXQgR0VORVJJQwotVGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgb24gYSBmZXcgdGFyZ2V0cy4KLUBlbmQgaWZzZXQKLUBpZnNldCBIODMwMAotQHhyZWZ7SDgvMzAwLCxAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDB9LgotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUB4cmVme2k5NjAsLCBAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5fS4KLUBlbmQgaWZzZXQKLQotCi1PbiBzb21lIHBsYXRmb3JtcywgdGhlIEBzYW1wey0tcmVsYXh9IG9wdGlvbiBwZXJmb3JtcyBnbG9iYWwKLW9wdGltaXphdGlvbnMgdGhhdCBiZWNvbWUgcG9zc2libGUgd2hlbiB0aGUgbGlua2VyIHJlc29sdmVzIGFkZHJlc3NpbmcKLWluIHRoZSBwcm9ncmFtLCBzdWNoIGFzIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMgYW5kIHN5bnRoZXNpemluZyBuZXcKLWluc3RydWN0aW9ucyBpbiB0aGUgb3V0cHV0IG9iamVjdCBmaWxlLgotCi1PbiBzb21lIHBsYXRmb3JtcyB0aGVzZSBsaW5rIHRpbWUgZ2xvYmFsIG9wdGltaXphdGlvbnMgbWF5IG1ha2Ugc3ltYm9saWMKLWRlYnVnZ2luZyBvZiB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgaW1wb3NzaWJsZS4KLUBpZnNldCBHRU5FUklDCi1UaGlzIGlzIGtub3duIHRvIGJlCi10aGUgY2FzZSBmb3IgdGhlIE1hdHN1c2hpdGEgTU4xMDIwMCBhbmQgTU4xMDMwMCBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEdFTkVSSUMKLU9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQsIEBzYW1wey0tcmVsYXh9IGlzIGFjY2VwdGVkLAotYnV0IGlnbm9yZWQuCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggcmV0YWluaW5nIHNwZWNpZmllZCBzeW1ib2xzCi1AY2luZGV4IHN0cmlwcGluZyBhbGwgYnV0IHNvbWUgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCByZXRhaW5pbmcgc2VsZWN0aXZlbHkKLUBpdGVtIC0tcmV0YWluLXN5bWJvbHMtZmlsZSBAdmFye2ZpbGVuYW1lfQotUmV0YWluIEBlbXBoe29ubHl9IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiB0aGUgZmlsZSBAdmFye2ZpbGVuYW1lfSwKLWRpc2NhcmRpbmcgYWxsIG90aGVycy4gIEB2YXJ7ZmlsZW5hbWV9IGlzIHNpbXBseSBhIGZsYXQgZmlsZSwgd2l0aCBvbmUKLXN5bWJvbCBuYW1lIHBlciBsaW5lLiAgVGhpcyBvcHRpb24gaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gZW52aXJvbm1lbnRzCi1AaWZzZXQgR0VORVJJQwotKHN1Y2ggYXMgVnhXb3JrcykKLUBlbmQgaWZzZXQKLXdoZXJlIGEgbGFyZ2UgZ2xvYmFsIHN5bWJvbCB0YWJsZSBpcyBhY2N1bXVsYXRlZCBncmFkdWFsbHksIHRvIGNvbnNlcnZlCi1ydW4tdGltZSBtZW1vcnkuCi0KLUBzYW1wey0tcmV0YWluLXN5bWJvbHMtZmlsZX0gZG9lcyBAZW1waHtub3R9IGRpc2NhcmQgdW5kZWZpbmVkIHN5bWJvbHMsCi1vciBzeW1ib2xzIG5lZWRlZCBmb3IgcmVsb2NhdGlvbnMuCi0KLVlvdSBtYXkgb25seSBzcGVjaWZ5IEBzYW1wey0tcmV0YWluLXN5bWJvbHMtZmlsZX0gb25jZSBpbiB0aGUgY29tbWFuZAotbGluZS4gIEl0IG92ZXJyaWRlcyBAc2FtcHstc30gYW5kIEBzYW1wey1TfS4KLQotQGlmc2V0IEdFTkVSSUMKLUBpdGVtIC1ycGF0aCBAdmFye2Rpcn0KLUBjaW5kZXggcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoCi1Aa2luZGV4IC1ycGF0aAotQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGguICBUaGlzIGlzIHVzZWQgd2hlbgotbGlua2luZyBhbiBFTEYgZXhlY3V0YWJsZSB3aXRoIHNoYXJlZCBvYmplY3RzLiAgQWxsIEBjb2Rley1ycGF0aH0KLWFyZ3VtZW50cyBhcmUgY29uY2F0ZW5hdGVkIGFuZCBwYXNzZWQgdG8gdGhlIHJ1bnRpbWUgbGlua2VyLCB3aGljaCB1c2VzCi10aGVtIHRvIGxvY2F0ZSBzaGFyZWQgb2JqZWN0cyBhdCBydW50aW1lLiAgVGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uIGlzCi1hbHNvIHVzZWQgd2hlbiBsb2NhdGluZyBzaGFyZWQgb2JqZWN0cyB3aGljaCBhcmUgbmVlZGVkIGJ5IHNoYXJlZAotb2JqZWN0cyBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBsaW5rOyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQotQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbi4gIElmIEBjb2Rley1ycGF0aH0gaXMgbm90IHVzZWQgd2hlbiBsaW5raW5nIGFuCi1FTEYgZXhlY3V0YWJsZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotQGNvZGV7TERfUlVOX1BBVEh9IHdpbGwgYmUgdXNlZCBpZiBpdCBpcyBkZWZpbmVkLgotCi1UaGUgQGNvZGV7LXJwYXRofSBvcHRpb24gbWF5IGFsc28gYmUgdXNlZCBvbiBTdW5PUy4gIEJ5IGRlZmF1bHQsIG9uCi1TdW5PUywgdGhlIGxpbmtlciB3aWxsIGZvcm0gYSBydW50aW1lIHNlYXJjaCBwYXRjaCBvdXQgb2YgYWxsIHRoZQotQGNvZGV7LUx9IG9wdGlvbnMgaXQgaXMgZ2l2ZW4uICBJZiBhIEBjb2Rley1ycGF0aH0gb3B0aW9uIGlzIHVzZWQsIHRoZQotcnVudGltZSBzZWFyY2ggcGF0aCB3aWxsIGJlIGZvcm1lZCBleGNsdXNpdmVseSB1c2luZyB0aGUgQGNvZGV7LXJwYXRofQotb3B0aW9ucywgaWdub3JpbmcgdGhlIEBjb2Rley1MfSBvcHRpb25zLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdXNpbmcKLWdjYywgd2hpY2ggYWRkcyBtYW55IEBjb2Rley1MfSBvcHRpb25zIHdoaWNoIG1heSBiZSBvbiBORlMgbW91bnRlZAotZmlsZXN5c3RlbXMuCi0KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgRUxGIGxpbmtlcnMsIGlmIHRoZSBAY29kZXstUn0gb3B0aW9uIGlzCi1mb2xsb3dlZCBieSBhIGRpcmVjdG9yeSBuYW1lLCByYXRoZXIgdGhhbiBhIGZpbGUgbmFtZSwgaXQgaXMgdHJlYXRlZCBhcwotdGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uLgotQGVuZCBpZnNldAotCi1AaWZzZXQgR0VORVJJQwotQGNpbmRleCBsaW5rLXRpbWUgcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoCi1Aa2luZGV4IC1ycGF0aC1saW5rCi1AaXRlbSAtcnBhdGgtbGluayBAdmFye0RJUn0KLVdoZW4gdXNpbmcgRUxGIG9yIFN1bk9TLCBvbmUgc2hhcmVkIGxpYnJhcnkgbWF5IHJlcXVpcmUgYW5vdGhlci4gIFRoaXMKLWhhcHBlbnMgd2hlbiBhbiBAY29kZXtsZCAtc2hhcmVkfSBsaW5rIGluY2x1ZGVzIGEgc2hhcmVkIGxpYnJhcnkgYXMgb25lCi1vZiB0aGUgaW5wdXQgZmlsZXMuCi0KLVdoZW4gdGhlIGxpbmtlciBlbmNvdW50ZXJzIHN1Y2ggYSBkZXBlbmRlbmN5IHdoZW4gZG9pbmcgYSBub24tc2hhcmVkLAotbm9uLXJlbG9jYXRhYmxlIGxpbmssIGl0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gbG9jYXRlIHRoZSByZXF1aXJlZAotc2hhcmVkIGxpYnJhcnkgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIGxpbmssIGlmIGl0IGlzIG5vdCBpbmNsdWRlZAotZXhwbGljaXRseS4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbgotc3BlY2lmaWVzIHRoZSBmaXJzdCBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLiAgVGhlCi1AY29kZXstcnBhdGgtbGlua30gb3B0aW9uIG1heSBzcGVjaWZ5IGEgc2VxdWVuY2Ugb2YgZGlyZWN0b3J5IG5hbWVzCi1laXRoZXIgYnkgc3BlY2lmeWluZyBhIGxpc3Qgb2YgbmFtZXMgc2VwYXJhdGVkIGJ5IGNvbG9ucywgb3IgYnkKLWFwcGVhcmluZyBtdWx0aXBsZSB0aW1lcy4KLQotVGhlIGxpbmtlciB1c2VzIHRoZSBmb2xsb3dpbmcgc2VhcmNoIHBhdGhzIHRvIGxvY2F0ZSByZXF1aXJlZCBzaGFyZWQKLWxpYnJhcmllcy4KLUBlbnVtZXJhdGUKLUBpdGVtCi1BbnkgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IEBjb2Rley1ycGF0aC1saW5rfSBvcHRpb25zLgotQGl0ZW0KLUFueSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgQGNvZGV7LXJwYXRofSBvcHRpb25zLiAgVGhlIGRpZmZlcmVuY2UKLWJldHdlZW4gQGNvZGV7LXJwYXRofSBhbmQgQGNvZGV7LXJwYXRoLWxpbmt9IGlzIHRoYXQgZGlyZWN0b3JpZXMKLXNwZWNpZmllZCBieSBAY29kZXstcnBhdGh9IG9wdGlvbnMgYXJlIGluY2x1ZGVkIGluIHRoZSBleGVjdXRhYmxlIGFuZAotdXNlZCBhdCBydW50aW1lLCB3aGVyZWFzIHRoZSBAY29kZXstcnBhdGgtbGlua30gb3B0aW9uIGlzIG9ubHkgZWZmZWN0aXZlCi1hdCBsaW5rIHRpbWUuCi1AaXRlbQotT24gYW4gRUxGIHN5c3RlbSwgaWYgdGhlIEBjb2Rley1ycGF0aH0gYW5kIEBjb2Rle3JwYXRoLWxpbmt9IG9wdGlvbnMKLXdlcmUgbm90IHVzZWQsIHNlYXJjaCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1AY29kZXtMRF9SVU5fUEFUSH0uCi1AaXRlbQotT24gU3VuT1MsIGlmIHRoZSBAY29kZXstcnBhdGh9IG9wdGlvbiB3YXMgbm90IHVzZWQsIHNlYXJjaCBhbnkKLWRpcmVjdG9yaWVzIHNwZWNpZmllZCB1c2luZyBAY29kZXstTH0gb3B0aW9ucy4KLUBpdGVtCi1Gb3IgYSBuYXRpdmUgbGlua2VyLCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1AY29kZXtMRF9MSUJSQVJZX1BBVEh9LgotQGl0ZW0KLVRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzLCBub3JtYWxseSBAZmlsZXsvbGlifSBhbmQgQGZpbGV7L3Vzci9saWJ9LgotQGl0ZW0KLUZvciBhIG5hdGl2ZSBsaW5rZXIgb24gYW4gRUxGIHN5c3RlbSwgaWYgdGhlIGZpbGUgQGZpbGV7L2V0Yy9sZC5zby5jb25mfQotZXhpc3RzLCB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBmb3VuZCBpbiB0aGF0IGZpbGUuCi1AZW5kIGVudW1lcmF0ZQotCi1JZiB0aGUgcmVxdWlyZWQgc2hhcmVkIGxpYnJhcnkgaXMgbm90IGZvdW5kLCB0aGUgbGlua2VyIHdpbGwgaXNzdWUgYQotd2FybmluZyBhbmQgY29udGludWUgd2l0aCB0aGUgbGluay4KLUBlbmQgaWZzZXQKLQotQGtpbmRleCAtc2hhcmVkCi1Aa2luZGV4IC1Cc2hhcmVhYmxlCi1AaXRlbSAtc2hhcmVkCi1AaXRlbXggLUJzaGFyZWFibGUKLUBjaW5kZXggc2hhcmVkIGxpYnJhcmllcwotQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiBFTEYsIFhDT0ZGCi1hbmQgU3VuT1MgcGxhdGZvcm1zLiAgT24gU3VuT1MsIHRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhCi1zaGFyZWQgbGlicmFyeSBpZiB0aGUgQGNvZGV7LWV9IG9wdGlvbiBpcyBub3QgdXNlZCBhbmQgdGhlcmUgYXJlCi11bmRlZmluZWQgc3ltYm9scyBpbiB0aGUgbGluay4KLQotQGl0ZW0gLS1zb3J0LWNvbW1vbgotQGtpbmRleCAtLXNvcnQtY29tbW9uCi1UaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdG8gc29ydCB0aGUgY29tbW9uIHN5bWJvbHMgYnkgc2l6ZSB3aGVuIGl0Ci1wbGFjZXMgdGhlbSBpbiB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IHNlY3Rpb25zLiAgRmlyc3QgY29tZSBhbGwgdGhlIG9uZQotYnl0ZSBzeW1ib2xzLCB0aGVuIGFsbCB0aGUgdHdvIGJ5dGVzLCB0aGVuIGFsbCB0aGUgZm91ciBieXRlcywgYW5kIHRoZW4KLWV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgaXMgdG8gcHJldmVudCBnYXBzIGJldHdlZW4gc3ltYm9scyBkdWUgdG8KLWFsaWdubWVudCBjb25zdHJhaW50cy4KLQotQGtpbmRleCAtLXNwbGl0LWJ5LWZpbGUKLUBpdGVtIC0tc3BsaXQtYnktZmlsZQotU2ltaWxhciB0byBAY29kZXstLXNwbGl0LWJ5LXJlbG9jfSBidXQgY3JlYXRlcyBhIG5ldyBvdXRwdXQgc2VjdGlvbiBmb3IKLWVhY2ggaW5wdXQgZmlsZS4KLQotQGtpbmRleCAtLXNwbGl0LWJ5LXJlbG9jCi1AaXRlbSAtLXNwbGl0LWJ5LXJlbG9jIEB2YXJ7Y291bnR9Ci1UcnlzIHRvIGNyZWF0ZXMgZXh0cmEgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHNvIHRoYXQgbm8gc2luZ2xlCi1vdXRwdXQgc2VjdGlvbiBpbiB0aGUgZmlsZSBjb250YWlucyBtb3JlIHRoYW4gQHZhcntjb3VudH0gcmVsb2NhdGlvbnMuCi1UaGlzIGlzIHVzZWZ1bCB3aGVuIGdlbmVyYXRpbmcgaHVnZSByZWxvY2F0YWJsZSBmb3IgZG93bmxvYWRpbmcgaW50bwotY2VydGFpbiByZWFsIHRpbWUga2VybmVscyB3aXRoIHRoZSBDT0ZGIG9iamVjdCBmaWxlIGZvcm1hdDsgc2luY2UgQ09GRgotY2Fubm90IHJlcHJlc2VudCBtb3JlIHRoYW4gNjU1MzUgcmVsb2NhdGlvbnMgaW4gYSBzaW5nbGUgc2VjdGlvbi4gIE5vdGUKLXRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gd29yayB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMgd2hpY2ggZG8gbm90Ci1zdXBwb3J0IGFyYml0cmFyeSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgd2lsbCBub3Qgc3BsaXQgdXAgaW5kaXZpZHVhbAotaW5wdXQgc2VjdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uLCBzbyBpZiBhIHNpbmdsZSBpbnB1dCBzZWN0aW9uIGNvbnRhaW5zCi1tb3JlIHRoYW4gQHZhcntjb3VudH0gcmVsb2NhdGlvbnMgb25lIG91dHB1dCBzZWN0aW9uIHdpbGwgY29udGFpbiB0aGF0Ci1tYW55IHJlbG9jYXRpb25zLgotCi1Aa2luZGV4IC0tc3RhdHMKLUBpdGVtIC0tc3RhdHMKLUNvbXB1dGUgYW5kIGRpc3BsYXkgc3RhdGlzdGljcyBhYm91dCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBsaW5rZXIsIHN1Y2gKLWFzIGV4ZWN1dGlvbiB0aW1lIGFuZCBtZW1vcnkgdXNhZ2UuCi0KLUBraW5kZXggLS10cmFkaXRpb25hbC1mb3JtYXQKLUBjaW5kZXggdHJhZGl0aW9uYWwgZm9ybWF0Ci1AaXRlbSAtLXRyYWRpdGlvbmFsLWZvcm1hdAotRm9yIHNvbWUgdGFyZ2V0cywgdGhlIG91dHB1dCBvZiBAY29kZXtsZH0gaXMgZGlmZmVyZW50IGluIHNvbWUgd2F5cyBmcm9tCi10aGUgb3V0cHV0IG9mIHNvbWUgZXhpc3RpbmcgbGlua2VyLiAgVGhpcyBzd2l0Y2ggcmVxdWVzdHMgQGNvZGV7bGR9IHRvCi11c2UgdGhlIHRyYWRpdGlvbmFsIGZvcm1hdCBpbnN0ZWFkLgotCi1AY2luZGV4IGRieAotRm9yIGV4YW1wbGUsIG9uIFN1bk9TLCBAY29kZXtsZH0gY29tYmluZXMgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlCi1zeW1ib2wgc3RyaW5nIHRhYmxlLiAgVGhpcyBjYW4gcmVkdWNlIHRoZSBzaXplIG9mIGFuIG91dHB1dCBmaWxlIHdpdGgKLWZ1bGwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJ5IG92ZXIgMzAgcGVyY2VudC4gIFVuZm9ydHVuYXRlbHksIHRoZSBTdW5PUwotQGNvZGV7ZGJ4fSBwcm9ncmFtIGNhbiBub3QgcmVhZCB0aGUgcmVzdWx0aW5nIHByb2dyYW0gKEBjb2Rle2dkYn0gaGFzIG5vCi10cm91YmxlKS4gIFRoZSBAc2FtcHstLXRyYWRpdGlvbmFsLWZvcm1hdH0gc3dpdGNoIHRlbGxzIEBjb2Rle2xkfSB0byBub3QKLWNvbWJpbmUgZHVwbGljYXRlIGVudHJpZXMuCi0KLUBraW5kZXggLVRic3MgQHZhcntvcmd9Ci1Aa2luZGV4IC1UZGF0YSBAdmFye29yZ30KLUBraW5kZXggLVR0ZXh0IEB2YXJ7b3JnfQotQGNpbmRleCBzZWdtZW50IG9yaWdpbnMsIGNtZCBsaW5lCi1AaXRlbSAtVGJzcyBAdmFye29yZ30KLUBpdGVteCAtVGRhdGEgQHZhcntvcmd9Ci1AaXRlbXggLVR0ZXh0IEB2YXJ7b3JnfQotVXNlIEB2YXJ7b3JnfSBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3ItLS1yZXNwZWN0aXZlbHktLS10aGUKLUBjb2Rle2Jzc30sIEBjb2Rle2RhdGF9LCBvciB0aGUgQGNvZGV7dGV4dH0gc2VnbWVudCBvZiB0aGUgb3V0cHV0IGZpbGUuCi1AdmFye29yZ30gbXVzdCBiZSBhIHNpbmdsZSBoZXhhZGVjaW1hbCBpbnRlZ2VyOwotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaW5rZXJzLCB5b3UgbWF5IG9taXQgdGhlIGxlYWRpbmcKLUBzYW1wezB4fSB1c3VhbGx5IGFzc29jaWF0ZWQgd2l0aCBoZXhhZGVjaW1hbCB2YWx1ZXMuCi0KLUBraW5kZXggLS12ZXJib3NlCi1AY2luZGV4IHZlcmJvc2UKLUBpdGVtIC0tZGxsLXZlcmJvc2UKLUBpdGVteCAtLXZlcmJvc2UKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXtsZH0gYW5kIGxpc3QgdGhlIGxpbmtlciBlbXVsYXRpb25zCi1zdXBwb3J0ZWQuICBEaXNwbGF5IHdoaWNoIGlucHV0IGZpbGVzIGNhbiBhbmQgY2Fubm90IGJlIG9wZW5lZC4gIERpc3BsYXkKLXRoZSBsaW5rZXIgc2NyaXB0IGlmIHVzaW5nIGEgZGVmYXVsdCBidWlsdGluIHNjcmlwdC4KLQotQGtpbmRleCAtLXZlcnNpb24tc2NyaXB0PUB2YXJ7dmVyc2lvbi1zY3JpcHRmaWxlfQotQGNpbmRleCB2ZXJzaW9uIHNjcmlwdCwgc3ltYm9sIHZlcnNpb25zCi1AaXRlbXggLS12ZXJzaW9uLXNjcmlwdD1AdmFye3ZlcnNpb24tc2NyaXB0ZmlsZX0KLVNwZWNpZnkgdGhlIG5hbWUgb2YgYSB2ZXJzaW9uIHNjcmlwdCB0byB0aGUgbGlua2VyLiAgVGhpcyBpcyB0eXBpY2FsbHkKLXVzZWQgd2hlbiBjcmVhdGluZyBzaGFyZWQgbGlicmFyaWVzIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIHZlcnNpb24gaGVpcmFyY2h5IGZvciB0aGUgbGlicmFyeSBiZWluZyBjcmVhdGVkLiAgVGhpcyBvcHRpb24KLWlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBFTEYgcGxhdGZvcm1zIHdoaWNoIHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4KLUB4cmVme1ZFUlNJT059LgotCi1Aa2luZGV4IC0td2Fybi1jb21vbgotQGNpbmRleCB3YXJuaW5ncywgb24gY29tYmluaW5nIHN5bWJvbHMKLUBjaW5kZXggY29tYmluaW5nIHN5bWJvbHMsIHdhcm5pbmdzIG9uCi1AaXRlbSAtLXdhcm4tY29tbW9uCi1XYXJuIHdoZW4gYSBjb21tb24gc3ltYm9sIGlzIGNvbWJpbmVkIHdpdGggYW5vdGhlciBjb21tb24gc3ltYm9sIG9yIHdpdGgKLWEgc3ltYm9sIGRlZmluaXRpb24uICBVbml4IGxpbmtlcnMgYWxsb3cgdGhpcyBzb21ld2hhdCBzbG9wcHkgcHJhY3RpY2UsCi1idXQgbGlua2VycyBvbiBzb21lIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIGRvIG5vdC4gIFRoaXMgb3B0aW9uIGFsbG93cwoteW91IHRvIGZpbmQgcG90ZW50aWFsIHByb2JsZW1zIGZyb20gY29tYmluaW5nIGdsb2JhbCBzeW1ib2xzLgotVW5mb3J0dW5hdGVseSwgc29tZSBDIGxpYnJhcmllcyB1c2UgdGhpcyBwcmFjdGljZSwgc28geW91IG1heSBnZXQgc29tZQotd2FybmluZ3MgYWJvdXQgc3ltYm9scyBpbiB0aGUgbGlicmFyaWVzIGFzIHdlbGwgYXMgaW4geW91ciBwcm9ncmFtcy4KLQotVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIGdsb2JhbCBzeW1ib2xzLCBpbGx1c3RyYXRlZCBoZXJlIGJ5IEMgZXhhbXBsZXM6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gaW50IGkgPSAxOwotQSBkZWZpbml0aW9uLCB3aGljaCBnb2VzIGluIHRoZSBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gb2YgdGhlIG91dHB1dAotZmlsZS4KLQotQGl0ZW0gZXh0ZXJuIGludCBpOwotQW4gdW5kZWZpbmVkIHJlZmVyZW5jZSwgd2hpY2ggZG9lcyBub3QgYWxsb2NhdGUgc3BhY2UuCi1UaGVyZSBtdXN0IGJlIGVpdGhlciBhIGRlZmluaXRpb24gb3IgYSBjb21tb24gc3ltYm9sIGZvciB0aGUKLXZhcmlhYmxlIHNvbWV3aGVyZS4KLQotQGl0ZW0gaW50IGk7Ci1BIGNvbW1vbiBzeW1ib2wuICBJZiB0aGVyZSBhcmUgb25seSAob25lIG9yIG1vcmUpIGNvbW1vbiBzeW1ib2xzIGZvciBhCi12YXJpYWJsZSwgaXQgZ29lcyBpbiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgb2YgdGhlIG91dHB1dCBmaWxlLgotVGhlIGxpbmtlciBtZXJnZXMgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlIGludG8gYQotc2luZ2xlIHN5bWJvbC4gIElmIHRoZXkgYXJlIG9mIGRpZmZlcmVudCBzaXplcywgaXQgcGlja3MgdGhlIGxhcmdlc3QKLXNpemUuICBUaGUgbGlua2VyIHR1cm5zIGEgY29tbW9uIHN5bWJvbCBpbnRvIGEgZGVjbGFyYXRpb24sIGlmIHRoZXJlIGlzCi1hIGRlZmluaXRpb24gb2YgdGhlIHNhbWUgdmFyaWFibGUuCi1AZW5kIHRhYmxlCi0KLVRoZSBAc2FtcHstLXdhcm4tY29tbW9ufSBvcHRpb24gY2FuIHByb2R1Y2UgZml2ZSBraW5kcyBvZiB3YXJuaW5ncy4KLUVhY2ggd2FybmluZyBjb25zaXN0cyBvZiBhIHBhaXIgb2YgbGluZXM6IHRoZSBmaXJzdCBkZXNjcmliZXMgdGhlIHN5bWJvbAotanVzdCBlbmNvdW50ZXJlZCwgYW5kIHRoZSBzZWNvbmQgZGVzY3JpYmVzIHRoZSBwcmV2aW91cyBzeW1ib2wKLWVuY291bnRlcmVkIHdpdGggdGhlIHNhbWUgbmFtZS4gIE9uZSBvciBib3RoIG9mIHRoZSB0d28gc3ltYm9scyB3aWxsIGJlCi1hIGNvbW1vbiBzeW1ib2wuCi0KLUBlbnVtZXJhdGUKLUBpdGVtCi1UdXJuaW5nIGEgY29tbW9uIHN5bWJvbCBpbnRvIGEgcmVmZXJlbmNlLCBiZWNhdXNlIHRoZXJlIGlzIGFscmVhZHkgYQotZGVmaW5pdGlvbiBmb3IgdGhlIHN5bWJvbC4KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGNvbW1vbiBvZiBgQHZhcntzeW1ib2x9JwotICAgb3ZlcnJpZGRlbiBieSBkZWZpbml0aW9uCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBkZWZpbmVkIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtCi1UdXJuaW5nIGEgY29tbW9uIHN5bWJvbCBpbnRvIGEgcmVmZXJlbmNlLCBiZWNhdXNlIGEgbGF0ZXIgZGVmaW5pdGlvbiBmb3IKLXRoZSBzeW1ib2wgaXMgZW5jb3VudGVyZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBjYXNlLAotZXhjZXB0IHRoYXQgdGhlIHN5bWJvbHMgYXJlIGVuY291bnRlcmVkIGluIGEgZGlmZmVyZW50IG9yZGVyLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogZGVmaW5pdGlvbiBvZiBgQHZhcntzeW1ib2x9JwotICAgb3ZlcnJpZGluZyBjb21tb24KLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbQotTWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2l0aCBhIHByZXZpb3VzIHNhbWUtc2l6ZWQgY29tbW9uIHN5bWJvbC4KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IG11bHRpcGxlIGNvbW1vbgotICAgb2YgYEB2YXJ7c3ltYm9sfScKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IHByZXZpb3VzIGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbQotTWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2l0aCBhIHByZXZpb3VzIGxhcmdlciBjb21tb24gc3ltYm9sLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkZGVuIGJ5IGxhcmdlciBjb21tb24KLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGxhcmdlciBjb21tb24gaXMgaGVyZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0KLU1lcmdpbmcgYSBjb21tb24gc3ltYm9sIHdpdGggYSBwcmV2aW91cyBzbWFsbGVyIGNvbW1vbiBzeW1ib2wuICBUaGlzIGlzCi10aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgY2FzZSwgZXhjZXB0IHRoYXQgdGhlIHN5bWJvbHMgYXJlCi1lbmNvdW50ZXJlZCBpbiBhIGRpZmZlcmVudCBvcmRlci4KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGNvbW1vbiBvZiBgQHZhcntzeW1ib2x9JwotICAgb3ZlcnJpZGluZyBzbWFsbGVyIGNvbW1vbgotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogc21hbGxlciBjb21tb24gaXMgaGVyZQotQGVuZCBzbWFsbGV4YW1wbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBraW5kZXggLS13YXJuLWNvbnN0cnVjdG9ycwotQGl0ZW0gLS13YXJuLWNvbnN0cnVjdG9ycwotV2FybiBpZiBhbnkgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhcmUgdXNlZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGEgZmV3Ci1vYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIGZvcm1hdHMgbGlrZSBDT0ZGIG9yIEVMRiwgdGhlIGxpbmtlciBjYW4gbm90Ci1kZXRlY3QgdGhlIHVzZSBvZiBnbG9iYWwgY29uc3RydWN0b3JzLgotCi1Aa2luZGV4IC0td2Fybi1tdWx0aXBsZS1ncAotQGl0ZW0gLS13YXJuLW11bHRpcGxlLWdwCi1XYXJuIGlmIG11bHRpcGxlIGdsb2JhbCBwb2ludGVyIHZhbHVlcyBhcmUgcmVxdWlyZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGNlcnRhaW4gcHJvY2Vzc29ycywgc3VjaCBhcyB0aGUgQWxwaGEuCi1TcGVjaWZpY2FsbHksIHNvbWUgcHJvY2Vzc29ycyBwdXQgbGFyZ2UtdmFsdWVkIGNvbnN0YW50cyBpbiBhIHNwZWNpYWwKLXNlY3Rpb24uICBBIHNwZWNpYWwgcmVnaXN0ZXIgKHRoZSBnbG9iYWwgcG9pbnRlcikgcG9pbnRzIGludG8gdGhlIG1pZGRsZQotb2YgdGhpcyBzZWN0aW9uLCBzbyB0aGF0IGNvbnN0YW50cyBjYW4gYmUgbG9hZGVkIGVmZmljaWVudGx5IHZpYSBhCi1iYXNlLXJlZ2lzdGVyIHJlbGF0aXZlIGFkZHJlc3NpbmcgbW9kZS4gIFNpbmNlIHRoZSBvZmZzZXQgaW4KLWJhc2UtcmVnaXN0ZXIgcmVsYXRpdmUgbW9kZSBpcyBmaXhlZCBhbmQgcmVsYXRpdmVseSBzbWFsbCAoZS5nLiwgMTYKLWJpdHMpLCB0aGlzIGxpbWl0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb25zdGFudCBwb29sLiAgVGh1cywgaW4KLWxhcmdlIHByb2dyYW1zLCBpdCBpcyBvZnRlbiBuZWNlc3NhcnkgdG8gdXNlIG11bHRpcGxlIGdsb2JhbCBwb2ludGVyCi12YWx1ZXMgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBhZGRyZXNzIGFsbCBwb3NzaWJsZSBjb25zdGFudHMuICBUaGlzCi1vcHRpb24gY2F1c2VzIGEgd2FybmluZyB0byBiZSBpc3N1ZWQgd2hlbmV2ZXIgdGhpcyBjYXNlIG9jY3Vycy4KLQotQGtpbmRleCAtLXdhcm4tb25jZQotQGNpbmRleCB3YXJuaW5ncywgb24gdW5kZWZpbmVkIHN5bWJvbHMKLUBjaW5kZXggdW5kZWZpbmVkIHN5bWJvbHMsIHdhcm5pbmdzIG9uCi1AaXRlbSAtLXdhcm4tb25jZQotT25seSB3YXJuIG9uY2UgZm9yIGVhY2ggdW5kZWZpbmVkIHN5bWJvbCwgcmF0aGVyIHRoYW4gb25jZSBwZXIgbW9kdWxlCi13aGljaCByZWZlcnMgdG8gaXQuCi0KLUBraW5kZXggLS13YXJuLXNlY3Rpb24tYWxpZ24KLUBjaW5kZXggd2FybmluZ3MsIG9uIHNlY3Rpb24gYWxpZ25tZW50Ci1AY2luZGV4IHNlY3Rpb24gYWxpZ25tZW50LCB3YXJuaW5ncyBvbgotQGl0ZW0gLS13YXJuLXNlY3Rpb24tYWxpZ24KLVdhcm4gaWYgdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0IHNlY3Rpb24gaXMgY2hhbmdlZCBiZWNhdXNlIG9mCi1hbGlnbm1lbnQuICBUeXBpY2FsbHksIHRoZSBhbGlnbm1lbnQgd2lsbCBiZSBzZXQgYnkgYW4gaW5wdXQgc2VjdGlvbi4KLVRoZSBhZGRyZXNzIHdpbGwgb25seSBiZSBjaGFuZ2VkIGlmIGl0IG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZDsgdGhhdAotaXMsIGlmIHRoZSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCBkb2VzIG5vdCBzcGVjaWZ5IGEgc3RhcnQgYWRkcmVzcyBmb3IKLXRoZSBzZWN0aW9uIChAcHhyZWZ7U0VDVElPTlN9KS4KLQotQGtpbmRleCAtLXdob2xlLWFyY2hpdmUKLUBjaW5kZXggaW5jbHVkaW5nIGFuIGVudGlyZSBhcmNoaXZlCi1AaXRlbSAtLXdob2xlLWFyY2hpdmUKLUZvciBlYWNoIGFyY2hpdmUgbWVudGlvbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgdGhlCi1AY29kZXstLXdob2xlLWFyY2hpdmV9IG9wdGlvbiwgaW5jbHVkZSBldmVyeSBvYmplY3QgZmlsZSBpbiB0aGUgYXJjaGl2ZQotaW4gdGhlIGxpbmssIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0aGUgYXJjaGl2ZSBmb3IgdGhlIHJlcXVpcmVkIG9iamVjdAotZmlsZXMuICBUaGlzIGlzIG5vcm1hbGx5IHVzZWQgdG8gdHVybiBhbiBhcmNoaXZlIGZpbGUgaW50byBhIHNoYXJlZAotbGlicmFyeSwgZm9yY2luZyBldmVyeSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBzaGFyZWQKLWxpYnJhcnkuICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZS4KLQotQGtpbmRleCAtLXdyYXAKLUBpdGVtIC0td3JhcCBAdmFye3N5bWJvbH0KLVVzZSBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yIEB2YXJ7c3ltYm9sfS4gIEFueSB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCi1AdmFye3N5bWJvbH0gd2lsbCBiZSByZXNvbHZlZCB0byBAY29kZXtfX3dyYXBfQHZhcntzeW1ib2x9fS4gIEFueQotdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBAY29kZXtfX3JlYWxfQHZhcntzeW1ib2x9fSB3aWxsIGJlIHJlc29sdmVkIHRvCi1AdmFye3N5bWJvbH0uCi0KLVRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIHdyYXBwZXIgZm9yIGEgc3lzdGVtIGZ1bmN0aW9uLiAgVGhlCi13cmFwcGVyIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgQGNvZGV7X193cmFwX0B2YXJ7c3ltYm9sfX0uICBJZiBpdAotd2lzaGVzIHRvIGNhbGwgdGhlIHN5c3RlbSBmdW5jdGlvbiwgaXQgc2hvdWxkIGNhbGwKLUBjb2Rle19fcmVhbF9AdmFye3N5bWJvbH19LgotCi1IZXJlIGlzIGEgdHJpdmlhbCBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi12b2lkICoKLV9fd3JhcF9tYWxsb2MgKGludCBjKQotQHsKLSAgcHJpbnRmICgibWFsbG9jIGNhbGxlZCB3aXRoICVsZFxuIiwgYyk7Ci0gIHJldHVybiBfX3JlYWxfbWFsbG9jIChjKTsKLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhpcyBmaWxlIHVzaW5nIEBjb2Rley0td3JhcCBtYWxsb2N9LCB0aGVuCi1hbGwgY2FsbHMgdG8gQGNvZGV7bWFsbG9jfSB3aWxsIGNhbGwgdGhlIGZ1bmN0aW9uIEBjb2Rle19fd3JhcF9tYWxsb2N9Ci1pbnN0ZWFkLiAgVGhlIGNhbGwgdG8gQGNvZGV7X19yZWFsX21hbGxvY30gaW4gQGNvZGV7X193cmFwX21hbGxvY30gd2lsbAotY2FsbCB0aGUgcmVhbCBAY29kZXttYWxsb2N9IGZ1bmN0aW9uLgotCi1Zb3UgbWF5IHdpc2ggdG8gcHJvdmlkZSBhIEBjb2Rle19fcmVhbF9tYWxsb2N9IGZ1bmN0aW9uIGFzIHdlbGwsIHNvIHRoYXQKLWxpbmtzIHdpdGhvdXQgdGhlIEBjb2Rley0td3JhcH0gb3B0aW9uIHdpbGwgc3VjY2VlZC4gIElmIHlvdSBkbyB0aGlzLAoteW91IHNob3VsZCBub3QgcHV0IHRoZSBkZWZpbml0aW9uIG9mIEBjb2Rle19fcmVhbF9tYWxsb2N9IGluIHRoZSBzYW1lCi1maWxlIGFzIEBjb2Rle19fd3JhcF9tYWxsb2N9OyBpZiB5b3UgZG8sIHRoZSBhc3NlbWJsZXIgbWF5IHJlc29sdmUgdGhlCi1jYWxsIGJlZm9yZSB0aGUgbGlua2VyIGhhcyBhIGNoYW5jZSB0byB3cmFwIGl0IHRvIEBjb2Rle21hbGxvY30uCi0KLUBlbmQgdGFibGUKLQotQHN1YnNlY3Rpb24gT3B0aW9ucyBzcGVjaWZpYyB0byBpMzg2IFBFIHRhcmdldHMKLQotVGhlIGkzODYgUEUgbGlua2VyIHN1cHBvcnRzIHRoZSBAY29kZXstc2hhcmVkfSBvcHRpb24sIHdoaWNoIGNhdXNlcwotdGhlIG91dHB1dCB0byBiZSBhIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJ5IChETEwpIGluc3RlYWQgb2YgYQotbm9ybWFsIGV4ZWN1dGFibGUuICBZb3Ugc2hvdWxkIG5hbWUgdGhlIG91dHB1dCBAY29kZXsqLmRsbH0gd2hlbiB5b3UKLXVzZSB0aGlzIG9wdGlvbi4gIEluIGFkZGl0aW9uLCB0aGUgbGlua2VyIGZ1bGx5IHN1cHBvcnRzIHRoZSBzdGFuZGFyZAotQGNvZGV7Ki5kZWZ9IGZpbGVzLCB3aGljaCBtYXkgYmUgc3BlY2lmaWVkIG9uIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lCi1saWtlIGFuIG9iamVjdCBmaWxlIChpbiBmYWN0LCBpdCBzaG91bGQgcHJlY2VkZSBhcmNoaXZlcyBpdCBleHBvcnRzCi1zeW1ib2xzIGZyb20sIHRvIGVuc3VyZSB0aGF0IHRoZXkgZ2V0IGxpbmtlZCBpbiwganVzdCBsaWtlIGEgbm9ybWFsCi1vYmplY3QgZmlsZSkuCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBvcHRpb25zIGNvbW1vbiB0byBhbGwgdGFyZ2V0cywgdGhlIGkzODYgUEUgbGlua2VyCi1zdXBwb3J0IGFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIG9wdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIGkzODYKLVBFIHRhcmdldC4gIE9wdGlvbnMgdGhhdCB0YWtlIHZhbHVlcyBtYXkgYmUgc2VwYXJhdGVkIGZyb20gdGhlaXIKLXZhbHVlcyBieSBlaXRoZXIgYSBzcGFjZSBvciBhbiBlcXVhbHMgc2lnbi4KLQotQHRhYmxlIEBjb2RlCi0KLUBraW5kZXggLS1hZGQtc3RkY2FsbC1hbGlhcwotQGl0ZW0gLS1hZGQtc3RkY2FsbC1hbGlhcwotSWYgZ2l2ZW4sIHN5bWJvbHMgd2l0aCBhIHN0ZGNhbGwgc3VmZml4IChAQEB2YXJ7bm59KSB3aWxsIGJlIGV4cG9ydGVkCi1hcy1pcyBhbmQgYWxzbyB3aXRoIHRoZSBzdWZmaXggc3RyaXBwZWQuCi0KLUBraW5kZXggLS1iYXNlLWZpbGUKLUBpdGVtIC0tYmFzZS1maWxlIEB2YXJ7ZmlsZX0KLVVzZSBAdmFye2ZpbGV9IGFzIHRoZSBuYW1lIG9mIGEgZmlsZSBpbiB3aGljaCB0byBzYXZlIHRoZSBiYXNlCi1hZGRyZXNzZXMgb2YgYWxsIHRoZSByZWxvY2F0aW9ucyBuZWVkZWQgZm9yIGdlbmVyYXRpbmcgRExMcyB3aXRoCi1AZmlsZXtkbGx0b29sfS4KLQotQGtpbmRleCAtLWRsbAotQGl0ZW0gLS1kbGwKLUNyZWF0ZSBhIERMTCBpbnN0ZWFkIG9mIGEgcmVndWxhciBleGVjdXRhYmxlLiAgWW91IG1heSBhbHNvIHVzZQotQGNvZGV7LXNoYXJlZH0gb3Igc3BlY2lmeSBhIEBjb2Rle0xJQlJBUll9IGluIGEgZ2l2ZW4gQGNvZGV7LmRlZn0KLWZpbGUuCi0KLUBraW5kZXggLS1lbmFibGUtc3RkY2FsbC1maXh1cAotQGtpbmRleCAtLWRpc2FibGUtc3RkY2FsbC1maXh1cAotQGl0ZW0gLS1lbmFibGUtc3RkY2FsbC1maXh1cAotQGl0ZW14IC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwCi1JZiB0aGUgbGluayBmaW5kcyBhIHN5bWJvbCB0aGF0IGl0IGNhbm5vdCByZXNvbHZlLCBpdCB3aWxsIGF0dGVtcHQgdG8KLWRvICJmdXp6eSBsaW5raW5nIiBieSBsb29raW5nIGZvciBhbm90aGVyIGRlZmluZWQgc3ltYm9sIHRoYXQgZGlmZmVycwotb25seSBpbiB0aGUgZm9ybWF0IG9mIHRoZSBzeW1ib2wgbmFtZSAoY2RlY2wgdnMgc3RkY2FsbCkgYW5kIHdpbGwKLXJlc29sdmUgdGhhdCBzeW1ib2wgYnkgbGlua2luZyB0byB0aGUgbWF0Y2guICBGb3IgZXhhbXBsZSwgdGhlCi11bmRlZmluZWQgc3ltYm9sIEBjb2Rle19mb299IG1pZ2h0IGJlIGxpbmtlZCB0byB0aGUgZnVuY3Rpb24KLUBjb2Rle19mb29AQDEyfSwgb3IgdGhlIHVuZGVmaW5lZCBzeW1ib2wgQGNvZGV7X2JhckBAMTZ9IG1pZ2h0IGJlIGxpbmtlZAotdG8gdGhlIGZ1bmN0aW9uIEBjb2Rle19iYXJ9LiAgV2hlbiB0aGUgbGlua2VyIGRvZXMgdGhpcywgaXQgcHJpbnRzIGEKLXdhcm5pbmcsIHNpbmNlIGl0IG5vcm1hbGx5IHNob3VsZCBoYXZlIGZhaWxlZCB0byBsaW5rLCBidXQgc29tZXRpbWVzCi1pbXBvcnQgbGlicmFyaWVzIGdlbmVyYXRlZCBmcm9tIHRoaXJkLXBhcnR5IGRsbHMgbWF5IG5lZWQgdGhpcyBmZWF0dXJlCi10byBiZSB1c2FibGUuICBJZiB5b3Ugc3BlY2lmeSBAY29kZXstLWVuYWJsZS1zdGRjYWxsLWZpeHVwfSwgdGhpcwotZmVhdHVyZSBpcyBmdWxseSBlbmFibGVkIGFuZCB3YXJuaW5ncyBhcmUgbm90IHByaW50ZWQuICBJZiB5b3Ugc3BlY2lmeQotQGNvZGV7LS1kaXNhYmxlLXN0ZGNhbGwtZml4dXB9LCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYW5kIHN1Y2gKLW1pc21hdGNoZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgZXJyb3JzLgotCi1AY2luZGV4IERMTHMsIGNyZWF0aW5nCi1Aa2luZGV4IC0tZXhwb3J0LWFsbC1zeW1ib2xzCi1AaXRlbSAtLWV4cG9ydC1hbGwtc3ltYm9scwotSWYgZ2l2ZW4sIGFsbCBnbG9iYWwgc3ltYm9scyBpbiB0aGUgb2JqZWN0cyB1c2VkIHRvIGJ1aWxkIGEgRExMIHdpbGwKLWJlIGV4cG9ydGVkIGJ5IHRoZSBETEwuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgZGVmYXVsdCBpZiB0aGVyZQotb3RoZXJ3aXNlIHdvdWxkbid0IGJlIGFueSBleHBvcnRlZCBzeW1ib2xzLiAgV2hlbiBzeW1ib2xzIGFyZQotZXhwbGljaXRseSBleHBvcnRlZCB2aWEgREVGIGZpbGVzIG9yIGltcGxpY2l0bHkgZXhwb3J0ZWQgdmlhIGZ1bmN0aW9uCi1hdHRyaWJ1dGVzLCB0aGUgZGVmYXVsdCBpcyB0byBub3QgZXhwb3J0IGFueXRoaW5nIGVsc2UgdW5sZXNzIHRoaXMKLW9wdGlvbiBpcyBnaXZlbi4gIE5vdGUgdGhhdCB0aGUgc3ltYm9scyBAY29kZXtEbGxNYWluQEAxMn0sCi1AY29kZXtEbGxFbnRyeVBvaW50QEAwfSwgYW5kIEBjb2Rle2ltcHVyZV9wdHJ9IHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkKLWV4cG9ydGVkLgotCi1Aa2luZGV4IC0tZXhjbHVkZS1zeW1ib2xzCi1AaXRlbSAtLWV4Y2x1ZGUtc3ltYm9scyBAdmFye3N5bWJvbH0sQHZhcntzeW1ib2x9LC4uLgotU3BlY2lmaWVzIGEgbGlzdCBvZiBzeW1ib2xzIHdoaWNoIHNob3VsZCBub3QgYmUgYXV0b21hdGljYWxseQotZXhwb3J0ZWQuICBUaGUgc3ltYm9sIG5hbWVzIG1heSBiZSBkZWxpbWl0ZWQgYnkgY29tbWFzIG9yIGNvbG9ucy4KLQotQGtpbmRleCAtLWZpbGUtYWxpZ25tZW50Ci1AaXRlbSAtLWZpbGUtYWxpZ25tZW50Ci1TcGVjaWZ5IHRoZSBmaWxlIGFsaWdubWVudC4gIFNlY3Rpb25zIGluIHRoZSBmaWxlIHdpbGwgYWx3YXlzIGJlZ2luIGF0Ci1maWxlIG9mZnNldHMgd2hpY2ggYXJlIG11bHRpcGxlcyBvZiB0aGlzIG51bWJlci4gIFRoaXMgZGVmYXVsdHMgdG8KLTUxMi4KLQotQGNpbmRleCBoZWFwIHNpemUKLUBraW5kZXggLS1oZWFwCi1AaXRlbSAtLWhlYXAgQHZhcntyZXNlcnZlfQotQGl0ZW14IC0taGVhcCBAdmFye3Jlc2VydmV9LEB2YXJ7Y29tbWl0fQotU3BlY2lmeSB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlIChhbmQgb3B0aW9uYWxseSBjb21taXQpIHRvIGJlCi11c2VkIGFzIGhlYXAgZm9yIHRoaXMgcHJvZ3JhbS4gIFRoZSBkZWZhdWx0IGlzIDFNYiByZXNlcnZlZCwgNEsKLWNvbW1pdHRlZC4KLQotQGNpbmRleCBpbWFnZSBiYXNlCi1Aa2luZGV4IC0taW1hZ2UtYmFzZQotQGl0ZW0gLS1pbWFnZS1iYXNlIEB2YXJ7dmFsdWV9Ci1Vc2UgQHZhcnt2YWx1ZX0gYXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB5b3VyIHByb2dyYW0gb3IgZGxsLiAgVGhpcyBpcwotdGhlIGxvd2VzdCBtZW1vcnkgbG9jYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3VyIHByb2dyYW0gb3IgZGxsCi1pcyBsb2FkZWQuICBUbyByZWR1Y2UgdGhlIG5lZWQgdG8gcmVsb2NhdGUgYW5kIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YKLXlvdXIgZGxscywgZWFjaCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBiYXNlIGFkZHJlc3MgYW5kIG5vdCBvdmVybGFwIGFueQotb3RoZXIgZGxscy4gIFRoZSBkZWZhdWx0IGlzIDB4NDAwMDAwIGZvciBleGVjdXRhYmxlcywgYW5kIDB4MTAwMDAwMDAKLWZvciBkbGxzLgotCi1Aa2luZGV4IC0ta2lsbC1hdAotQGl0ZW0gLS1raWxsLWF0Ci1JZiBnaXZlbiwgdGhlIHN0ZGNhbGwgc3VmZml4ZXMgKEBAQHZhcntubn0pIHdpbGwgYmUgc3RyaXBwZWQgZnJvbQotc3ltYm9scyBiZWZvcmUgdGhleSBhcmUgZXhwb3J0ZWQuCi0KLUBraW5kZXggLS1tYWpvci1pbWFnZS12ZXJzaW9uCi1AaXRlbSAtLW1ham9yLWltYWdlLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgImltYWdlIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gMS4KLQotQGtpbmRleCAtLW1ham9yLW9zLXZlcnNpb24KLUBpdGVtIC0tbWFqb3Itb3MtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAib3MgdmVyc2lvbiIuICBEZWZhdWx0cyB0byA0LgotCi1Aa2luZGV4IC0tbWFqb3Itc3Vic3lzdGVtLXZlcnNpb24KLUBpdGVtIC0tbWFqb3Itc3Vic3lzdGVtLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgInN1YnN5c3RlbSB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDQuCi0KLUBraW5kZXggLS1taW5vci1pbWFnZS12ZXJzaW9uCi1AaXRlbSAtLW1pbm9yLWltYWdlLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgImltYWdlIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gMC4KLQotQGtpbmRleCAtLW1pbm9yLW9zLXZlcnNpb24KLUBpdGVtIC0tbWlub3Itb3MtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAib3MgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAwLgotCi1Aa2luZGV4IC0tbWlub3Itc3Vic3lzdGVtLXZlcnNpb24KLUBpdGVtIC0tbWlub3Itc3Vic3lzdGVtLXZlcnNpb24gQHZhcnt2YWx1ZX0KLVNldHMgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgInN1YnN5c3RlbSB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDAuCi0KLUBjaW5kZXggREVGIGZpbGVzLCBjcmVhdGluZwotQGNpbmRleCBETExzLCBjcmVhdGluZwotQGtpbmRleCAtLW91dHB1dC1kZWYKLUBpdGVtIC0tb3V0cHV0LWRlZiBAdmFye2ZpbGV9Ci1UaGUgbGlua2VyIHdpbGwgY3JlYXRlIHRoZSBmaWxlIEB2YXJ7ZmlsZX0gd2hpY2ggd2lsbCBjb250YWluIGEgREVGCi1maWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIERMTCB0aGUgbGlua2VyIGlzIGdlbmVyYXRpbmcuICBUaGlzIERFRiBmaWxlCi0od2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBAY29kZXsqLmRlZn0pIG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBpbXBvcnQKLWxpYnJhcnkgd2l0aCBAY29kZXtkbGx0b29sfSBvciBtYXkgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSB0bwotYXV0b21hdGljYWxseSBvciBpbXBsaWNpdGx5IGV4cG9ydGVkIHN5bWJvbHMuCi0KLUBraW5kZXggLS1zZWN0aW9uLWFsaWdubWVudAotQGl0ZW0gLS1zZWN0aW9uLWFsaWdubWVudAotU2V0cyB0aGUgc2VjdGlvbiBhbGlnbm1lbnQuICBTZWN0aW9ucyBpbiBtZW1vcnkgd2lsbCBhbHdheXMgYmVnaW4gYXQKLWFkZHJlc3NlcyB3aGljaCBhcmUgYSBtdWx0aXBsZSBvZiB0aGlzIG51bWJlci4gIERlZmF1bHRzIHRvIDB4MTAwMC4KLQotQGNpbmRleCBzdGFjayBzaXplCi1Aa2luZGV4IC0tc3RhY2sKLUBpdGVtIC0tc3RhY2sgQHZhcntyZXNlcnZlfQotQGl0ZW14IC0tc3RhY2sgQHZhcntyZXNlcnZlfSxAdmFye2NvbW1pdH0KLVNwZWNpZnkgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVzZXJ2ZSAoYW5kIG9wdGlvbmFsbHkgY29tbWl0KSB0byBiZQotdXNlZCBhcyBzdGFjayBmb3IgdGhpcyBwcm9ncmFtLiAgVGhlIGRlZmF1bHQgaXMgMzJNYiByZXNlcnZlZCwgNEsKLWNvbW1pdHRlZC4KLQotQGtpbmRleCAtLXN1YnN5c3RlbQotQGl0ZW0gLS1zdWJzeXN0ZW0gQHZhcnt3aGljaH0KLUBpdGVteCAtLXN1YnN5c3RlbSBAdmFye3doaWNofTpAdmFye21ham9yfQotQGl0ZW14IC0tc3Vic3lzdGVtIEB2YXJ7d2hpY2h9OkB2YXJ7bWFqb3J9LkB2YXJ7bWlub3J9Ci1TcGVjaWZpZXMgdGhlIHN1YnN5c3RlbSB1bmRlciB3aGljaCB5b3VyIHByb2dyYW0gd2lsbCBleGVjdXRlLiAgVGhlCi1sZWdhbCB2YWx1ZXMgZm9yIEB2YXJ7d2hpY2h9IGFyZSBAY29kZXtuYXRpdmV9LCBAY29kZXt3aW5kb3dzfSwKLUBjb2Rle2NvbnNvbGV9LCBhbmQgQGNvZGV7cG9zaXh9LiAgWW91IG1heSBvcHRpb25hbGx5IHNldCB0aGUKLXN1YnN5c3RlbSB2ZXJzaW9uIGFsc28uCi0KLUBlbmQgdGFibGUKLQotQGlmc2V0IFVzZXNFbnZWYXJzCi1Abm9kZSBFbnZpcm9ubWVudAotQHNlY3Rpb24gRW52aXJvbm1lbnQgVmFyaWFibGVzCi0KLVlvdSBjYW4gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBAY29kZXtsZH0gd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCi1AY29kZXtHTlVUQVJHRVR9LCBAY29kZXtMREVNVUxBVElPTn0sIGFuZCBAY29kZXtDT0xMRUNUX05PX0RFTUFOR0xFfS4KLQotQGtpbmRleCBHTlVUQVJHRVQKLUBjaW5kZXggZGVmYXVsdCBpbnB1dCBmb3JtYXQKLUBjb2Rle0dOVVRBUkdFVH0gZGV0ZXJtaW5lcyB0aGUgaW5wdXQtZmlsZSBvYmplY3QgZm9ybWF0IGlmIHlvdSBkb24ndAotdXNlIEBzYW1wey1ifSAob3IgaXRzIHN5bm9ueW0gQHNhbXB7LS1mb3JtYXR9KS4gIEl0cyB2YWx1ZSBzaG91bGQgYmUgb25lCi1vZiB0aGUgQkZEIG5hbWVzIGZvciBhbiBpbnB1dCBmb3JtYXQgKEBweHJlZntCRkR9KS4gIElmIHRoZXJlIGlzIG5vCi1AY29kZXtHTlVUQVJHRVR9IGluIHRoZSBlbnZpcm9ubWVudCwgQGNvZGV7bGR9IHVzZXMgdGhlIG5hdHVyYWwgZm9ybWF0Ci1vZiB0aGUgdGFyZ2V0LiBJZiBAY29kZXtHTlVUQVJHRVR9IGlzIHNldCB0byBAY29kZXtkZWZhdWx0fSB0aGVuIEJGRAotYXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhlIGlucHV0IGZvcm1hdCBieSBleGFtaW5pbmcgYmluYXJ5IGlucHV0IGZpbGVzOwotdGhpcyBtZXRob2Qgb2Z0ZW4gc3VjY2VlZHMsIGJ1dCB0aGVyZSBhcmUgcG90ZW50aWFsIGFtYmlndWl0aWVzLCBzaW5jZQotdGhlcmUgaXMgbm8gbWV0aG9kIG9mIGVuc3VyaW5nIHRoYXQgdGhlIG1hZ2ljIG51bWJlciB1c2VkIHRvIHNwZWNpZnkKLW9iamVjdC1maWxlIGZvcm1hdHMgaXMgdW5pcXVlLiAgSG93ZXZlciwgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlIGZvcgotQkZEIG9uIGVhY2ggc3lzdGVtIHBsYWNlcyB0aGUgY29udmVudGlvbmFsIGZvcm1hdCBmb3IgdGhhdCBzeXN0ZW0gZmlyc3QKLWluIHRoZSBzZWFyY2gtbGlzdCwgc28gYW1iaWd1aXRpZXMgYXJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvbnZlbnRpb24uCi0KLUBraW5kZXggTERFTVVMQVRJT04KLUBjaW5kZXggZGVmYXVsdCBlbXVsYXRpb24KLUBjaW5kZXggZW11bGF0aW9uLCBkZWZhdWx0Ci1AY29kZXtMREVNVUxBVElPTn0gZGV0ZXJtaW5lcyB0aGUgZGVmYXVsdCBlbXVsYXRpb24gaWYgeW91IGRvbid0IHVzZSB0aGUKLUBzYW1wey1tfSBvcHRpb24uICBUaGUgZW11bGF0aW9uIGNhbiBhZmZlY3QgdmFyaW91cyBhc3BlY3RzIG9mIGxpbmtlcgotYmVoYXZpb3VyLCBwYXJ0aWN1bGFybHkgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIFlvdSBjYW4gbGlzdCB0aGUKLWF2YWlsYWJsZSBlbXVsYXRpb25zIHdpdGggdGhlIEBzYW1wey0tdmVyYm9zZX0gb3IgQHNhbXB7LVZ9IG9wdGlvbnMuICBJZgotdGhlIEBzYW1wey1tfSBvcHRpb24gaXMgbm90IHVzZWQsIGFuZCB0aGUgQGNvZGV7TERFTVVMQVRJT059IGVudmlyb25tZW50Ci12YXJpYWJsZSBpcyBub3QgZGVmaW5lZCwgdGhlIGRlZmF1bHQgZW11bGF0aW9uIGRlcGVuZHMgdXBvbiBob3cgdGhlCi1saW5rZXIgd2FzIGNvbmZpZ3VyZWQuCi1AZW5kIGlmc2V0Ci0KLUBraW5kZXggQ09MTEVDVF9OT19ERU1BTkdMRQotQGNpbmRleCBkZW1hbmdsaW5nLCBkZWZhdWx0Ci1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIGRlZmF1bHQgdG8gZGVtYW5nbGluZyBzeW1ib2xzLiAgSG93ZXZlciwgaWYKLUBjb2Rle0NPTExFQ1RfTk9fREVNQU5HTEV9IGlzIHNldCBpbiB0aGUgZW52aXJvbm1lbnQsIHRoZW4gaXQgd2lsbAotZGVmYXVsdCB0byBub3QgZGVtYW5nbGluZyBzeW1ib2xzLiAgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1c2VkIGluCi1hIHNpbWlsYXIgZmFzaGlvbiBieSB0aGUgQGNvZGV7Z2NjfSBsaW5rZXIgd3JhcHBlciBwcm9ncmFtLiAgVGhlIGRlZmF1bHQKLW1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBAc2FtcHstLWRlbWFuZ2xlfSBhbmQgQHNhbXB7LS1uby1kZW1hbmdsZX0KLW9wdGlvbnMuCi0KLUBub2RlIFNjcmlwdHMKLUBjaGFwdGVyIExpbmtlciBTY3JpcHRzCi0KLUBjaW5kZXggc2NyaXB0cwotQGNpbmRleCBsaW5rZXIgc2NyaXB0cwotQGNpbmRleCBjb21tYW5kIGZpbGVzCi1FdmVyeSBsaW5rIGlzIGNvbnRyb2xsZWQgYnkgYSBAZGZue2xpbmtlciBzY3JpcHR9LiAgVGhpcyBzY3JpcHQgaXMKLXdyaXR0ZW4gaW4gdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLgotCi1UaGUgbWFpbiBwdXJwb3NlIG9mIHRoZSBsaW5rZXIgc2NyaXB0IGlzIHRvIGRlc2NyaWJlIGhvdyB0aGUgc2VjdGlvbnMgaW4KLXRoZSBpbnB1dCBmaWxlcyBzaG91bGQgYmUgbWFwcGVkIGludG8gdGhlIG91dHB1dCBmaWxlLCBhbmQgdG8gY29udHJvbAotdGhlIG1lbW9yeSBsYXlvdXQgb2YgdGhlIG91dHB1dCBmaWxlLiAgTW9zdCBsaW5rZXIgc2NyaXB0cyBkbyBub3RoaW5nCi1tb3JlIHRoYW4gdGhpcy4gIEhvd2V2ZXIsIHdoZW4gbmVjZXNzYXJ5LCB0aGUgbGlua2VyIHNjcmlwdCBjYW4gYWxzbwotZGlyZWN0IHRoZSBsaW5rZXIgdG8gcGVyZm9ybSBtYW55IG90aGVyIG9wZXJhdGlvbnMsIHVzaW5nIHRoZSBjb21tYW5kcwotZGVzY3JpYmVkIGJlbG93LgotCi1UaGUgbGlua2VyIGFsd2F5cyB1c2VzIGEgbGlua2VyIHNjcmlwdC4gIElmIHlvdSBkbyBub3Qgc3VwcGx5IG9uZQoteW91cnNlbGYsIHRoZSBsaW5rZXIgd2lsbCB1c2UgYSBkZWZhdWx0IHNjcmlwdCB0aGF0IGlzIGNvbXBpbGVkIGludG8gdGhlCi1saW5rZXIgZXhlY3V0YWJsZS4gIFlvdSBjYW4gdXNlIHRoZSBAc2FtcHstLXZlcmJvc2V9IGNvbW1hbmQgbGluZSBvcHRpb24KLXRvIGRpc3BsYXkgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIENlcnRhaW4gY29tbWFuZCBsaW5lIG9wdGlvbnMsCi1zdWNoIGFzIEBzYW1wey1yfSBvciBAc2FtcHstTn0sIHdpbGwgYWZmZWN0IHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuCi0KLVlvdSBtYXkgc3VwcGx5IHlvdXIgb3duIGxpbmtlciBzY3JpcHQgYnkgdXNpbmcgdGhlIEBzYW1wey1UfSBjb21tYW5kCi1saW5lIG9wdGlvbi4gIFdoZW4geW91IGRvIHRoaXMsIHlvdXIgbGlua2VyIHNjcmlwdCB3aWxsIHJlcGxhY2UgdGhlCi1kZWZhdWx0IGxpbmtlciBzY3JpcHQuCi0KLVlvdSBtYXkgYWxzbyB1c2UgbGlua2VyIHNjcmlwdHMgaW1wbGljaXRseSBieSBuYW1pbmcgdGhlbSBhcyBpbnB1dCBmaWxlcwotdG8gdGhlIGxpbmtlciwgYXMgdGhvdWdoIHRoZXkgd2VyZSBmaWxlcyB0byBiZSBsaW5rZWQuICBAeHJlZntJbXBsaWNpdAotTGlua2VyIFNjcmlwdHN9LgotCi1AbWVudQotKiBCYXNpYyBTY3JpcHQgQ29uY2VwdHM6OglCYXNpYyBMaW5rZXIgU2NyaXB0IENvbmNlcHRzCi0qIFNjcmlwdCBGb3JtYXQ6OgkJTGlua2VyIFNjcmlwdCBGb3JtYXQKLSogU2ltcGxlIEV4YW1wbGU6OgkJU2ltcGxlIExpbmtlciBTY3JpcHQgRXhhbXBsZQotKiBTaW1wbGUgQ29tbWFuZHM6OgkJU2ltcGxlIExpbmtlciBTY3JpcHQgQ29tbWFuZHMKLSogQXNzaWdubWVudHM6OgkJCUFzc2lnbmluZyBWYWx1ZXMgdG8gU3ltYm9scwotKiBTRUNUSU9OUzo6CQkJU0VDVElPTlMgQ29tbWFuZAotKiBNRU1PUlk6OgkJCU1FTU9SWSBDb21tYW5kCi0qIFBIRFJTOjoJCQlQSERSUyBDb21tYW5kCi0qIFZFUlNJT046OgkJCVZFUlNJT04gQ29tbWFuZAotKiBFeHByZXNzaW9uczo6CQkJRXhwcmVzc2lvbnMgaW4gTGlua2VyIFNjcmlwdHMKLSogSW1wbGljaXQgTGlua2VyIFNjcmlwdHM6OglJbXBsaWNpdCBMaW5rZXIgU2NyaXB0cwotQGVuZCBtZW51Ci0KLUBub2RlIEJhc2ljIFNjcmlwdCBDb25jZXB0cwotQHNlY3Rpb24gQmFzaWMgTGlua2VyIFNjcmlwdCBDb25jZXB0cwotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGNvbmNlcHRzCi1XZSBuZWVkIHRvIGRlZmluZSBzb21lIGJhc2ljIGNvbmNlcHRzIGFuZCB2b2NhYnVsYXJ5IGluIG9yZGVyIHRvCi1kZXNjcmliZSB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotVGhlIGxpbmtlciBjb21iaW5lcyBpbnB1dCBmaWxlcyBpbnRvIGEgc2luZ2xlIG91dHB1dCBmaWxlLiAgVGhlIG91dHB1dAotZmlsZSBhbmQgZWFjaCBpbnB1dCBmaWxlIGFyZSBpbiBhIHNwZWNpYWwgZGF0YSBmb3JtYXQga25vd24gYXMgYW4KLUBkZm57b2JqZWN0IGZpbGUgZm9ybWF0fS4gIEVhY2ggZmlsZSBpcyBjYWxsZWQgYW4gQGRmbntvYmplY3QgZmlsZX0uCi1UaGUgb3V0cHV0IGZpbGUgaXMgb2Z0ZW4gY2FsbGVkIGFuIEBkZm57ZXhlY3V0YWJsZX0sIGJ1dCBmb3Igb3VyCi1wdXJwb3NlcyB3ZSB3aWxsIGFsc28gY2FsbCBpdCBhbiBvYmplY3QgZmlsZS4gIEVhY2ggb2JqZWN0IGZpbGUgaGFzLAotYW1vbmcgb3RoZXIgdGhpbmdzLCBhIGxpc3Qgb2YgQGRmbntzZWN0aW9uc30uICBXZSBzb21ldGltZXMgcmVmZXIgdG8gYQotc2VjdGlvbiBpbiBhbiBpbnB1dCBmaWxlIGFzIGFuIEBkZm57aW5wdXQgc2VjdGlvbn07IHNpbWlsYXJseSwgYSBzZWN0aW9uCi1pbiB0aGUgb3V0cHV0IGZpbGUgaXMgYW4gQGRmbntvdXRwdXQgc2VjdGlvbn0uCi0KLUVhY2ggc2VjdGlvbiBpbiBhbiBvYmplY3QgZmlsZSBoYXMgYSBuYW1lIGFuZCBhIHNpemUuICBNb3N0IHNlY3Rpb25zCi1hbHNvIGhhdmUgYW4gYXNzb2NpYXRlZCBibG9jayBvZiBkYXRhLCBrbm93biBhcyB0aGUgQGRmbntzZWN0aW9uCi1jb250ZW50c30uICBBIHNlY3Rpb24gbWF5IGJlIG1hcmtlZCBhcyBAZGZue2xvYWRhYmxlfSwgd2hpY2ggbWVhbiB0aGF0Ci10aGUgY29udGVudHMgc2hvdWxkIGJlIGxvYWRlZCBpbnRvIG1lbW9yeSB3aGVuIHRoZSBvdXRwdXQgZmlsZSBpcyBydW4uCi1BIHNlY3Rpb24gd2l0aCBubyBjb250ZW50cyBtYXkgYmUgQGRmbnthbGxvY2F0YWJsZX0sIHdoaWNoIG1lYW5zIHRoYXQgYW4KLWFyZWEgaW4gbWVtb3J5IHNob3VsZCBiZSBzZXQgYXNpZGUsIGJ1dCBub3RoaW5nIGluIHBhcnRpY3VsYXIgc2hvdWxkIGJlCi1sb2FkZWQgdGhlcmUgKGluIHNvbWUgY2FzZXMgdGhpcyBtZW1vcnkgbXVzdCBiZSB6ZXJvZWQgb3V0KS4gIEEgc2VjdGlvbgotd2hpY2ggaXMgbmVpdGhlciBsb2FkYWJsZSBub3IgYWxsb2NhdGFibGUgdHlwaWNhbGx5IGNvbnRhaW5zIHNvbWUgc29ydAotb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi1FdmVyeSBsb2FkYWJsZSBvciBhbGxvY2F0YWJsZSBvdXRwdXQgc2VjdGlvbiBoYXMgdHdvIGFkZHJlc3Nlcy4gIFRoZQotZmlyc3QgaXMgdGhlIEBkZm57Vk1BfSwgb3IgdmlydHVhbCBtZW1vcnkgYWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MKLXRoZSBzZWN0aW9uIHdpbGwgaGF2ZSB3aGVuIHRoZSBvdXRwdXQgZmlsZSBpcyBydW4uICBUaGUgc2Vjb25kIGlzIHRoZQotQGRmbntMTUF9LCBvciBsb2FkIG1lbW9yeSBhZGRyZXNzLiAgVGhpcyBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGUKLXNlY3Rpb24gd2lsbCBiZSBsb2FkZWQuICBJbiBtb3N0IGNhc2VzIHRoZSB0d28gYWRkcmVzc2VzIHdpbGwgYmUgdGhlCi1zYW1lLiAgQW4gZXhhbXBsZSBvZiB3aGVuIHRoZXkgbWlnaHQgYmUgZGlmZmVyZW50IGlzIHdoZW4gYSBkYXRhIHNlY3Rpb24KLWlzIGxvYWRlZCBpbnRvIFJPTSwgYW5kIHRoZW4gY29waWVkIGludG8gUkFNIHdoZW4gdGhlIHByb2dyYW0gc3RhcnRzIHVwCi0odGhpcyB0ZWNobmlxdWUgaXMgb2Z0ZW4gdXNlZCB0byBpbml0aWFsaXplIGdsb2JhbCB2YXJpYWJsZXMgaW4gYSBST00KLWJhc2VkIHN5c3RlbSkuICBJbiB0aGlzIGNhc2UgdGhlIFJPTSBhZGRyZXNzIHdvdWxkIGJlIHRoZSBMTUEsIGFuZCB0aGUKLVJBTSBhZGRyZXNzIHdvdWxkIGJlIHRoZSBWTUEuCi0KLVlvdSBjYW4gc2VlIHRoZSBzZWN0aW9ucyBpbiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0KLXByb2dyYW0gd2l0aCB0aGUgQHNhbXB7LWh9IG9wdGlvbi4KLQotRXZlcnkgb2JqZWN0IGZpbGUgYWxzbyBoYXMgYSBsaXN0IG9mIEBkZm57c3ltYm9sc30sIGtub3duIGFzIHRoZQotQGRmbntzeW1ib2wgdGFibGV9LiAgQSBzeW1ib2wgbWF5IGJlIGRlZmluZWQgb3IgdW5kZWZpbmVkLiAgRWFjaCBzeW1ib2wKLWhhcyBhIG5hbWUsIGFuZCBlYWNoIGRlZmluZWQgc3ltYm9sIGhhcyBhbiBhZGRyZXNzLCBhbW9uZyBvdGhlcgotaW5mb3JtYXRpb24uICBJZiB5b3UgY29tcGlsZSBhIEMgb3IgQysrIHByb2dyYW0gaW50byBhbiBvYmplY3QgZmlsZSwgeW91Ci13aWxsIGdldCBhIGRlZmluZWQgc3ltYm9sIGZvciBldmVyeSBkZWZpbmVkIGZ1bmN0aW9uIGFuZCBnbG9iYWwgb3IKLXN0YXRpYyB2YXJpYWJsZS4gIEV2ZXJ5IHVuZGVmaW5lZCBmdW5jdGlvbiBvciBnbG9iYWwgdmFyaWFibGUgd2hpY2ggaXMKLXJlZmVyZW5jZWQgaW4gdGhlIGlucHV0IGZpbGUgd2lsbCBiZWNvbWUgYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQotWW91IGNhbiBzZWUgdGhlIHN5bWJvbHMgaW4gYW4gb2JqZWN0IGZpbGUgYnkgdXNpbmcgdGhlIEBjb2Rle25tfQotcHJvZ3JhbSwgb3IgYnkgdXNpbmcgdGhlIEBjb2Rle29iamR1bXB9IHByb2dyYW0gd2l0aCB0aGUgQHNhbXB7LXR9Ci1vcHRpb24uCi0KLUBub2RlIFNjcmlwdCBGb3JtYXQKLUBzZWN0aW9uIExpbmtlciBTY3JpcHQgRm9ybWF0Ci1AY2luZGV4IGxpbmtlciBzY3JpcHQgZm9ybWF0Ci1MaW5rZXIgc2NyaXB0cyBhcmUgdGV4dCBmaWxlcy4KLQotWW91IHdyaXRlIGEgbGlua2VyIHNjcmlwdCBhcyBhIHNlcmllcyBvZiBjb21tYW5kcy4gIEVhY2ggY29tbWFuZCBpcwotZWl0aGVyIGEga2V5d29yZCwgcG9zc2libHkgZm9sbG93ZWQgYnkgYXJndW1lbnRzLCBvciBhbiBhc3NpZ25tZW50IHRvIGEKLXN5bWJvbC4gIFlvdSBtYXkgc2VwYXJhdGUgY29tbWFuZHMgdXNpbmcgc2VtaWNvbG9ucy4gIFdoaXRlc3BhY2UgaXMKLWdlbmVyYWxseSBpZ25vcmVkLgotCi1TdHJpbmdzIHN1Y2ggYXMgZmlsZSBvciBmb3JtYXQgbmFtZXMgY2FuIG5vcm1hbGx5IGJlIGVudGVyZWQgZGlyZWN0bHkuCi1JZiB0aGUgZmlsZSBuYW1lIGNvbnRhaW5zIGEgY2hhcmFjdGVyIHN1Y2ggYXMgYSBjb21tYSB3aGljaCB3b3VsZAotb3RoZXJ3aXNlIHNlcnZlIHRvIHNlcGFyYXRlIGZpbGUgbmFtZXMsIHlvdSBtYXkgcHV0IHRoZSBmaWxlIG5hbWUgaW4KLWRvdWJsZSBxdW90ZXMuICBUaGVyZSBpcyBubyB3YXkgdG8gdXNlIGEgZG91YmxlIHF1b3RlIGNoYXJhY3RlciBpbiBhCi1maWxlIG5hbWUuCi0KLVlvdSBtYXkgaW5jbHVkZSBjb21tZW50cyBpbiBsaW5rZXIgc2NyaXB0cyBqdXN0IGFzIGluIEMsIGRlbGltaXRlZCBieQotQHNhbXB7Lyp9IGFuZCBAc2FtcHsqL30uICBBcyBpbiBDLCBjb21tZW50cyBhcmUgc3ludGFjdGljYWxseSBlcXVpdmFsZW50Ci10byB3aGl0ZXNwYWNlLgotCi1Abm9kZSBTaW1wbGUgRXhhbXBsZQotQHNlY3Rpb24gU2ltcGxlIExpbmtlciBTY3JpcHQgRXhhbXBsZQotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGV4YW1wbGUKLUBjaW5kZXggZXhhbXBsZSBvZiBsaW5rZXIgc2NyaXB0Ci1NYW55IGxpbmtlciBzY3JpcHRzIGFyZSBmYWlybHkgc2ltcGxlLgotCi1UaGUgc2ltcGxlc3QgcG9zc2libGUgbGlua2VyIHNjcmlwdCBoYXMganVzdCBvbmUgY29tbWFuZDoKLUBzYW1we1NFQ1RJT05TfS4gIFlvdSB1c2UgdGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIHRvIGRlc2NyaWJlIHRoZQotbWVtb3J5IGxheW91dCBvZiB0aGUgb3V0cHV0IGZpbGUuCi0KLVRoZSBAc2FtcHtTRUNUSU9OU30gY29tbWFuZCBpcyBhIHBvd2VyZnVsIGNvbW1hbmQuICBIZXJlIHdlIHdpbGwKLWRlc2NyaWJlIGEgc2ltcGxlIHVzZSBvZiBpdC4gIExldCdzIGFzc3VtZSB5b3VyIHByb2dyYW0gY29uc2lzdHMgb25seSBvZgotY29kZSwgaW5pdGlhbGl6ZWQgZGF0YSwgYW5kIHVuaW5pdGlhbGl6ZWQgZGF0YS4gIFRoZXNlIHdpbGwgYmUgaW4gdGhlCi1Ac2FtcHsudGV4dH0sIEBzYW1wey5kYXRhfSwgYW5kIEBzYW1wey5ic3N9IHNlY3Rpb25zLCByZXNwZWN0aXZlbHkuCi1MZXQncyBhc3N1bWUgZnVydGhlciB0aGF0IHRoZXNlIGFyZSB0aGUgb25seSBzZWN0aW9ucyB3aGljaCBhcHBlYXIgaW4KLXlvdXIgaW5wdXQgZmlsZXMuCi0KLUZvciB0aGlzIGV4YW1wbGUsIGxldCdzIHNheSB0aGF0IHRoZSBjb2RlIHNob3VsZCBiZSBsb2FkZWQgYXQgYWRkcmVzcwotMHgxMDAwMCwgYW5kIHRoYXQgdGhlIGRhdGEgc2hvdWxkIHN0YXJ0IGF0IGFkZHJlc3MgMHg4MDAwMDAwLiAgSGVyZSBpcyBhCi1saW5rZXIgc2NyaXB0IHdoaWNoIHdpbGwgZG8gdGhhdDoKLUBzbWFsbGV4YW1wbGUKLVNFQ1RJT05TCi1AewotICAuID0gMHgxMDAwMDsKLSAgLnRleHQgOiBAeyAqKC50ZXh0KSBAfQotICAuID0gMHg4MDAwMDAwOwotICAuZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0gIC5ic3MgOiBAeyAqKC5ic3MpIEB9Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotWW91IHdyaXRlIHRoZSBAc2FtcHtTRUNUSU9OU30gY29tbWFuZCBhcyB0aGUga2V5d29yZCBAc2FtcHtTRUNUSU9OU30sCi1mb2xsb3dlZCBieSBhIHNlcmllcyBvZiBzeW1ib2wgYXNzaWdubWVudHMgYW5kIG91dHB1dCBzZWN0aW9uCi1kZXNjcmlwdGlvbnMgZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzLgotCi1UaGUgZmlyc3QgbGluZSBpbiB0aGUgYWJvdmUgZXhhbXBsZSBzZXRzIHRoZSBzcGVjaWFsIHN5bWJvbCBAc2FtcHsufSwKLXdoaWNoIGlzIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzIG9mIGFuCi1vdXRwdXQgc2VjdGlvbiBpbiBzb21lIG90aGVyIHdheSAob3RoZXIgd2F5cyBhcmUgZGVzY3JpYmVkIGxhdGVyKSwgdGhlCi1hZGRyZXNzIGlzIHNldCBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgVGhlCi1sb2NhdGlvbiBjb3VudGVyIGlzIHRoZW4gaW5jcmVtZW50ZWQgYnkgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBzZWN0aW9uLgotCi1UaGUgZmlyc3QgbGluZSBpbnNpZGUgdGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIG9mIHRoZSBhYm92ZSBleGFtcGxlCi1zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lhbCBzeW1ib2wgQHNhbXB7Ln0sIHdoaWNoIGlzIHRoZSBsb2NhdGlvbgotY291bnRlci4gIElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpbiBzb21lCi1vdGhlciB3YXkgKG90aGVyIHdheXMgYXJlIGRlc2NyaWJlZCBsYXRlciksIHRoZSBhZGRyZXNzIGlzIHNldCBmcm9tIHRoZQotY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlci4gIFRoZSBsb2NhdGlvbiBjb3VudGVyIGlzIHRoZW4KLWluY3JlbWVudGVkIGJ5IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gIEF0IHRoZSBzdGFydCBvZiB0aGUKLUBzYW1we1NFQ1RJT05TfSBjb21tYW5kLCB0aGUgbG9jYXRpb24gY291bnRlciBoYXMgdGhlIHZhbHVlIEBzYW1wezB9LgotCi1UaGUgc2Vjb25kIGxpbmUgZGVmaW5lcyBhbiBvdXRwdXQgc2VjdGlvbiwgQHNhbXB7LnRleHR9LiAgVGhlIGNvbG9uIGlzCi1yZXF1aXJlZCBzeW50YXggd2hpY2ggbWF5IGJlIGlnbm9yZWQgZm9yIG5vdy4gIFdpdGhpbiB0aGUgY3VybHkgYnJhY2VzCi1hZnRlciB0aGUgb3V0cHV0IHNlY3Rpb24gbmFtZSwgeW91IGxpc3QgdGhlIG5hbWVzIG9mIHRoZSBpbnB1dCBzZWN0aW9ucwotd2hpY2ggc2hvdWxkIGJlIHBsYWNlZCBpbnRvIHRoaXMgb3V0cHV0IHNlY3Rpb24uICBUaGUgQHNhbXB7Kn0gaXMgYQotd2lsZGNhcmQgd2hpY2ggbWF0Y2hlcyBhbnkgZmlsZSBuYW1lLiAgVGhlIGV4cHJlc3Npb24gQHNhbXB7KigudGV4dCl9Ci1tZWFucyBhbGwgQHNhbXB7LnRleHR9IGlucHV0IHNlY3Rpb25zIGluIGFsbCBpbnB1dCBmaWxlcy4KLQotU2luY2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgQHNhbXB7MHgxMDAwMH0gd2hlbiB0aGUgb3V0cHV0IHNlY3Rpb24KLUBzYW1wey50ZXh0fSBpcyBkZWZpbmVkLCB0aGUgbGlua2VyIHdpbGwgc2V0IHRoZSBhZGRyZXNzIG9mIHRoZQotQHNhbXB7LnRleHR9IHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHRvIGJlIEBzYW1wezB4MTAwMDB9LgotCi1UaGUgcmVtYWluaW5nIGxpbmVzIGRlZmluZSB0aGUgQHNhbXB7LmRhdGF9IGFuZCBAc2FtcHsuYnNzfSBzZWN0aW9ucyBpbgotdGhlIG91dHB1dCBmaWxlLiAgVGhlIGxpbmtlciB3aWxsIHBsYWNlIHRoZSBAc2FtcHsuZGF0YX0gb3V0cHV0IHNlY3Rpb24KLWF0IGFkZHJlc3MgQHNhbXB7MHg4MDAwMDAwfS4gIEFmdGVyIHRoZSBsaW5rZXIgcGxhY2VzIHRoZSBAc2FtcHsuZGF0YX0KLW91dHB1dCBzZWN0aW9uLCB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgd2lsbCBiZQotQHNhbXB7MHg4MDAwMDAwfSBwbHVzIHRoZSBzaXplIG9mIHRoZSBAc2FtcHsuZGF0YX0gb3V0cHV0IHNlY3Rpb24uICBUaGUKLWVmZmVjdCBpcyB0aGF0IHRoZSBsaW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmJzc30gb3V0cHV0IHNlY3Rpb24KLWltbWVkaWF0ZWx5IGFmdGVyIHRoZSBAc2FtcHsuZGF0YX0gb3V0cHV0IHNlY3Rpb24gaW4gbWVtb3J5Ci0KLVRoZSBsaW5rZXIgd2lsbCBlbnN1cmUgdGhhdCBlYWNoIG91dHB1dCBzZWN0aW9uIGhhcyB0aGUgcmVxdWlyZWQKLWFsaWdubWVudCwgYnkgaW5jcmVhc2luZyB0aGUgbG9jYXRpb24gY291bnRlciBpZiBuZWNlc3NhcnkuICBJbiB0aGlzCi1leGFtcGxlLCB0aGUgc3BlY2lmaWVkIGFkZHJlc3NlcyBmb3IgdGhlIEBzYW1wey50ZXh0fSBhbmQgQHNhbXB7LmRhdGF9Ci1zZWN0aW9ucyB3aWxsIHByb2JhYmx5IHNhdGlzZnkgYW55IGFsaWdubWVudCBjb25zdHJhaW50cywgYnV0IHRoZSBsaW5rZXIKLW1heSBoYXZlIHRvIGNyZWF0ZSBhIHNtYWxsIGdhcCBiZXR3ZWVuIHRoZSBAc2FtcHsuZGF0YX0gYW5kIEBzYW1wey5ic3N9Ci1zZWN0aW9ucy4KLQotVGhhdCdzIGl0ISAgVGhhdCdzIGEgc2ltcGxlIGFuZCBjb21wbGV0ZSBsaW5rZXIgc2NyaXB0LgotCi1Abm9kZSBTaW1wbGUgQ29tbWFuZHMKLUBzZWN0aW9uIFNpbXBsZSBMaW5rZXIgU2NyaXB0IENvbW1hbmRzCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgc2ltcGxlIGNvbW1hbmRzCi1JbiB0aGlzIHNlY3Rpb24gd2UgZGVzY3JpYmUgdGhlIHNpbXBsZSBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzLgotCi1AbWVudQotKiBFbnRyeSBQb2ludDo6CQkJU2V0dGluZyB0aGUgZW50cnkgcG9pbnQKLSogRmlsZSBDb21tYW5kczo6CQlDb21tYW5kcyBkZWFsaW5nIHdpdGggZmlsZXMKLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotKiBGb3JtYXQgQ29tbWFuZHM6OgkJQ29tbWFuZHMgZGVhbGluZyB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMKLUBlbmQgaWZjbGVhcgotCi0qIE1pc2NlbGxhbmVvdXMgQ29tbWFuZHM6OglPdGhlciBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzCi1AZW5kIG1lbnUKLQotQG5vZGUgRW50cnkgUG9pbnQKLUBzdWJzZWN0aW9uIFNldHRpbmcgdGhlIGVudHJ5IHBvaW50Ci1Aa2luZGV4IEVOVFJZKEB2YXJ7c3ltYm9sfSkKLUBjaW5kZXggc3RhcnQgb2YgZXhlY3V0aW9uCi1AY2luZGV4IGZpcnN0IGluc3RydWN0aW9uCi1AY2luZGV4IGVudHJ5IHBvaW50Ci1UaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gdG8gZXhlY3V0ZSBpbiBhIHByb2dyYW0gaXMgY2FsbGVkIHRoZSBAZGZue2VudHJ5Ci1wb2ludH0uICBZb3UgY2FuIHVzZSB0aGUgQGNvZGV7RU5UUll9IGxpbmtlciBzY3JpcHQgY29tbWFuZCB0byBzZXQgdGhlCi1lbnRyeSBwb2ludC4gIFRoZSBhcmd1bWVudCBpcyBhIHN5bWJvbCBuYW1lOgotQHNtYWxsZXhhbXBsZQotRU5UUlkoQHZhcntzeW1ib2x9KQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBzZXQgdGhlIGVudHJ5IHBvaW50LiAgVGhlIGxpbmtlciB3aWxsIHNldCB0aGUKLWVudHJ5IHBvaW50IGJ5IHRyeWluZyBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbiBvcmRlciwgYW5kCi1zdG9wcGluZyB3aGVuIG9uZSBvZiB0aGVtIHN1Y2NlZWRzOgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gCi10aGUgQHNhbXB7LWV9IEB2YXJ7ZW50cnl9IGNvbW1hbmQtbGluZSBvcHRpb247Ci1AaXRlbSAKLXRoZSBAY29kZXtFTlRSWShAdmFye3N5bWJvbH0pfSBjb21tYW5kIGluIGEgbGlua2VyIHNjcmlwdDsKLUBpdGVtIAotdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgQGNvZGV7c3RhcnR9LCBpZiBkZWZpbmVkOwotQGl0ZW0gCi10aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgQHNhbXB7LnRleHR9IHNlY3Rpb24sIGlmIHByZXNlbnQ7Ci1AaXRlbSAKLVRoZSBhZGRyZXNzIEBjb2RlezB9LgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEZpbGUgQ29tbWFuZHMKLUBzdWJzZWN0aW9uIENvbW1hbmRzIGRlYWxpbmcgd2l0aCBmaWxlcwotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGZpbGUgY29tbWFuZHMKLVNldmVyYWwgbGlua2VyIHNjcmlwdCBjb21tYW5kcyBkZWFsIHdpdGggZmlsZXMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gSU5DTFVERSBAdmFye2ZpbGVuYW1lfQotQGtpbmRleCBJTkNMVURFIEB2YXJ7ZmlsZW5hbWV9Ci1AY2luZGV4IGluY2x1ZGluZyBhIGxpbmtlciBzY3JpcHQKLUluY2x1ZGUgdGhlIGxpbmtlciBzY3JpcHQgQHZhcntmaWxlbmFtZX0gYXQgdGhpcyBwb2ludC4gIFRoZSBmaWxlIHdpbGwKLWJlIHNlYXJjaGVkIGZvciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCBpbiBhbnkgZGlyZWN0b3J5IHNwZWNpZmllZAotd2l0aCB0aGUgQGNvZGV7LUx9IG9wdGlvbi4gIFlvdSBjYW4gbmVzdCBjYWxscyB0byBAY29kZXtJTkNMVURFfSB1cCB0bwotMTAgbGV2ZWxzIGRlZXAuCi0KLUBpdGVtIElOUFVUKEB2YXJ7ZmlsZX0sIEB2YXJ7ZmlsZX0sIEBkb3Rze30pCi1AaXRlbXggSU5QVVQoQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30pCi1Aa2luZGV4IElOUFVUKEB2YXJ7ZmlsZXN9KQotQGNpbmRleCBpbnB1dCBmaWxlcyBpbiBsaW5rZXIgc2NyaXB0cwotQGNpbmRleCBpbnB1dCBvYmplY3QgZmlsZXMgaW4gbGlua2VyIHNjcmlwdHMKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBpbnB1dCBvYmplY3QgZmlsZXMKLVRoZSBAY29kZXtJTlBVVH0gY29tbWFuZCBkaXJlY3RzIHRoZSBsaW5rZXIgdG8gaW5jbHVkZSB0aGUgbmFtZWQgZmlsZXMKLWluIHRoZSBsaW5rLCBhcyB0aG91Z2ggdGhleSB3ZXJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgYWx3YXlzIHdhbnQgdG8gaW5jbHVkZSBAZmlsZXtzdWJyLm99IGFueSB0aW1lIHlvdSBkbwotYSBsaW5rLCBidXQgeW91IGNhbid0IGJlIGJvdGhlcmVkIHRvIHB1dCBpdCBvbiBldmVyeSBsaW5rIGNvbW1hbmQgbGluZSwKLXRoZW4geW91IGNhbiBwdXQgQHNhbXB7SU5QVVQgKHN1YnIubyl9IGluIHlvdXIgbGlua2VyIHNjcmlwdC4KLQotSW4gZmFjdCwgaWYgeW91IGxpa2UsIHlvdSBjYW4gbGlzdCBhbGwgb2YgeW91ciBpbnB1dCBmaWxlcyBpbiB0aGUgbGlua2VyCi1zY3JpcHQsIGFuZCB0aGVuIGludm9rZSB0aGUgbGlua2VyIHdpdGggbm90aGluZyBidXQgYSBAc2FtcHstVH0gb3B0aW9uLgotCi1UaGUgbGlua2VyIHdpbGwgZmlyc3QgdHJ5IHRvIG9wZW4gdGhlIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgSWYKLWl0IGlzIG5vdCBmb3VuZCwgdGhlIGxpbmtlciB3aWxsIHNlYXJjaCB0aHJvdWdoIHRoZSBhcmNoaXZlIGxpYnJhcnkKLXNlYXJjaCBwYXRoLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBAc2FtcHstTH0gaW4gQHJlZntPcHRpb25zLCxDb21tYW5kCi1MaW5lIE9wdGlvbnN9LgotCi1JZiB5b3UgdXNlIEBzYW1we0lOUFVUICgtbEB2YXJ7ZmlsZX0pfSwgQGNvZGV7bGR9IHdpbGwgdHJhbnNmb3JtIHRoZQotbmFtZSB0byBAY29kZXtsaWJAdmFye2ZpbGV9LmF9LCBhcyB3aXRoIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQKLUBzYW1wey1sfS4KLQotV2hlbiB5b3UgdXNlIHRoZSBAY29kZXtJTlBVVH0gY29tbWFuZCBpbiBhbiBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0LCB0aGUKLWZpbGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsgYXQgdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBsaW5rZXIKLXNjcmlwdCBmaWxlIGlzIGluY2x1ZGVkLiAgVGhpcyBjYW4gYWZmZWN0IGFyY2hpdmUgc2VhcmNoaW5nLgotCi1AaXRlbSBHUk9VUChAdmFye2ZpbGV9LCBAdmFye2ZpbGV9LCBAZG90c3t9KQotQGl0ZW14IEdST1VQKEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9KQotQGtpbmRleCBHUk9VUChAdmFye2ZpbGVzfSkKLUBjaW5kZXggZ3JvdXBpbmcgaW5wdXQgZmlsZXMKLVRoZSBAY29kZXtHUk9VUH0gY29tbWFuZCBpcyBsaWtlIEBjb2Rle0lOUFVUfSwgZXhjZXB0IHRoYXQgdGhlIG5hbWVkCi1maWxlcyBzaG91bGQgYWxsIGJlIGFyY2hpdmVzLCBhbmQgdGhleSBhcmUgc2VhcmNoZWQgcmVwZWF0ZWRseSB1bnRpbCBubwotbmV3IHVuZGVmaW5lZCByZWZlcmVuY2VzIGFyZSBjcmVhdGVkLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBAc2FtcHstKH0KLWluIEByZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9LgotCi1AaXRlbSBPVVRQVVQoQHZhcntmaWxlbmFtZX0pCi1Aa2luZGV4IE9VVFBVVChAdmFye2ZpbGVuYW1lfSkKLUBjaW5kZXggb3V0cHV0IGZpbGUgbmFtZSBpbiBsaW5rZXIgc2NyaXBvdAotVGhlIEBjb2Rle09VVFBVVH0gY29tbWFuZCBuYW1lcyB0aGUgb3V0cHV0IGZpbGUuICBVc2luZwotQGNvZGV7T1VUUFVUKEB2YXJ7ZmlsZW5hbWV9KX0gaW4gdGhlIGxpbmtlciBzY3JpcHQgaXMgZXhhY3RseSBsaWtlIHVzaW5nCi1Ac2FtcHstbyBAdmFye2ZpbGVuYW1lfX0gb24gdGhlIGNvbW1hbmQgbGluZSAoQHB4cmVme09wdGlvbnMsLENvbW1hbmQKLUxpbmUgT3B0aW9uc30pLiAgSWYgYm90aCBhcmUgdXNlZCwgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gdGFrZXMKLXByZWNlZGVuY2UuCi0KLVlvdSBjYW4gdXNlIHRoZSBAY29kZXtPVVRQVVR9IGNvbW1hbmQgdG8gZGVmaW5lIGEgZGVmYXVsdCBuYW1lIGZvciB0aGUKLW91dHB1dCBmaWxlIG90aGVyIHRoYW4gdGhlIHVzdWFsIGRlZmF1bHQgb2YgQGZpbGV7YS5vdXR9LgotCi1AaXRlbSBTRUFSQ0hfRElSKEB2YXJ7cGF0aH0pCi1Aa2luZGV4IFNFQVJDSF9ESVIoQHZhcntwYXRofSkKLUBjaW5kZXggbGlicmFyeSBzZWFyY2ggcGF0aCBpbiBsaW5rZXIgc2NyaXB0Ci1AY2luZGV4IGFyY2hpdmUgc2VhcmNoIHBhdGggaW4gbGlua2VyIHNjcmlwdAotQGNpbmRleCBzZWFyY2ggcGF0aCBpbiBsaW5rZXIgc2NyaXB0Ci1UaGUgQGNvZGV7U0VBUkNIX0RJUn0gY29tbWFuZCBhZGRzIEB2YXJ7cGF0aH0gdG8gdGhlIGxpc3Qgb2YgcGF0aHMgd2hlcmUKLUBjb2Rle2xkfSBsb29rcyBmb3IgYXJjaGl2ZSBsaWJyYXJpZXMuICBVc2luZwotQGNvZGV7U0VBUkNIX0RJUihAdmFye3BhdGh9KX0gaXMgZXhhY3RseSBsaWtlIHVzaW5nIEBzYW1wey1MIEB2YXJ7cGF0aH19Ci1vbiB0aGUgY29tbWFuZCBsaW5lIChAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIGJvdGgKLWFyZSB1c2VkLCB0aGVuIHRoZSBsaW5rZXIgd2lsbCBzZWFyY2ggYm90aCBwYXRocy4gIFBhdGhzIHNwZWNpZmllZCB1c2luZwotdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gYXJlIHNlYXJjaGVkIGZpcnN0LgotCi1AaXRlbSBTVEFSVFVQKEB2YXJ7ZmlsZW5hbWV9KQotQGtpbmRleCBTVEFSVFVQKEB2YXJ7ZmlsZW5hbWV9KQotQGNpbmRleCBmaXJzdCBpbnB1dCBmaWxlCi1UaGUgQGNvZGV7U1RBUlRVUH0gY29tbWFuZCBpcyBqdXN0IGxpa2UgdGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kLCBleGNlcHQKLXRoYXQgQHZhcntmaWxlbmFtZX0gd2lsbCBiZWNvbWUgdGhlIGZpcnN0IGlucHV0IGZpbGUgdG8gYmUgbGlua2VkLCBhcwotdGhvdWdoIGl0IHdlcmUgc3BlY2lmaWVkIGZpcnN0IG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGlzIG1heSBiZSB1c2VmdWwKLXdoZW4gdXNpbmcgYSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGVudHJ5IHBvaW50IGlzIGFsd2F5cyB0aGUgc3RhcnQgb2YgdGhlCi1maXJzdCBmaWxlLgotQGVuZCB0YWJsZQotCi1AaWZjbGVhciBTaW5nbGVGb3JtYXQKLUBub2RlIEZvcm1hdCBDb21tYW5kcwotQHN1YnNlY3Rpb24gQ29tbWFuZHMgZGVhbGluZyB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMKLUEgY291cGxlIG9mIGxpbmtlciBzY3JpcHQgY29tbWFuZHMgZGVhbCB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gT1VUUFVUX0ZPUk1BVChAdmFye2JmZG5hbWV9KQotQGl0ZW14IE9VVFBVVF9GT1JNQVQoQHZhcntkZWZhdWx0fSwgQHZhcntiaWd9LCBAdmFye2xpdHRsZX0pCi1Aa2luZGV4IE9VVFBVVF9GT1JNQVQoQHZhcntiZmRuYW1lfSkKLUBjaW5kZXggb3V0cHV0IGZpbGUgZm9ybWF0IGluIGxpbmtlciBzY3JpcHQKLVRoZSBAY29kZXtPVVRQVVRfRk9STUFUfSBjb21tYW5kIG5hbWVzIHRoZSBCRkQgZm9ybWF0IHRvIHVzZSBmb3IgdGhlCi1vdXRwdXQgZmlsZSAoQHB4cmVme0JGRH0pLiAgVXNpbmcgQGNvZGV7T1VUUFVUX0ZPUk1BVChAdmFye2JmZG5hbWV9KX0gaXMKLWV4YWN0bHkgbGlrZSB1c2luZyBAc2FtcHstb2Zvcm1hdCBAdmFye2JmZG5hbWV9fSBvbiB0aGUgY29tbWFuZCBsaW5lCi0oQHB4cmVme09wdGlvbnMsLENvbW1hbmQgTGluZSBPcHRpb25zfSkuICBJZiBib3RoIGFyZSB1c2VkLCB0aGUgY29tbWFuZAotbGluZSBvcHRpb24gdGFrZXMgcHJlY2VkZW5jZS4KLQotWW91IGNhbiB1c2UgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gd2l0aCB0aHJlZSBhcmd1bWVudHMgdG8gdXNlIGRpZmZlcmVudAotZm9ybWF0cyBiYXNlZCBvbiB0aGUgQHNhbXB7LUVCfSBhbmQgQHNhbXB7LUVMfSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLVRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHNjcmlwdCB0byBzZXQgdGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gdGhlCi1kZXNpcmVkIGVuZGlhbm5lc3MuCi0KLUlmIG5laXRoZXIgQHNhbXB7LUVCfSBub3IgQHNhbXB7LUVMfSBhcmUgdXNlZCwgdGhlbiB0aGUgb3V0cHV0IGZvcm1hdAotd2lsbCBiZSB0aGUgZmlyc3QgYXJndW1lbnQsIEB2YXJ7ZGVmYXVsdH0uICBJZiBAc2FtcHstRUJ9IGlzIHVzZWQsIHRoZQotb3V0cHV0IGZvcm1hdCB3aWxsIGJlIHRoZSBzZWNvbmQgYXJndW1lbnQsIEB2YXJ7YmlnfS4gIElmIEBzYW1wey1FTH0gaXMKLXVzZWQsIHRoZSBvdXRwdXQgZm9ybWF0IHdpbGwgYmUgdGhlIHRoaXJkIGFyZ3VtZW50LCBAdmFye2xpdHRsZX0uCi0KLUZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IGZvciB0aGUgTUlQUyBFTEYgdGFyZ2V0IHVzZXMgdGhpcwotY29tbWFuZDoKLUBzbWFsbGV4YW1wbGUKLU9VVFBVVF9GT1JNQVQoZWxmMzItYmlnbWlwcywgZWxmMzItYmlnbWlwcywgZWxmMzItbGl0dGxlbWlwcykKLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIHNheXMgdGhhdCB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgZmlsZSBpcwotQHNhbXB7ZWxmMzItYmlnbWlwc30sIGJ1dCBpZiB0aGUgdXNlciB1c2VzIHRoZSBAc2FtcHstRUx9IGNvbW1hbmQgbGluZQotb3B0aW9uLCB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBAc2FtcHtlbGYzMi1saXR0bGVtaXBzfQotZm9ybWF0LgotCi1AaXRlbSBUQVJHRVQoQHZhcntiZmRuYW1lfSkKLUBraW5kZXggVEFSR0VUKEB2YXJ7YmZkbmFtZX0pCi1AY2luZGV4IGlucHV0IGZpbGUgZm9ybWF0IGluIGxpbmtlciBzY3JpcHQKLVRoZSBAY29kZXtUQVJHRVR9IGNvbW1hbmQgbmFtZXMgdGhlIEJGRCBmb3JtYXQgdG8gdXNlIHdoZW4gcmVhZGluZyBpbnB1dAotZmlsZXMuICBJdCBhZmZlY3RzIHN1YnNlcXVlbnQgQGNvZGV7SU5QVVR9IGFuZCBAY29kZXtHUk9VUH0gY29tbWFuZHMuCi1UaGlzIGNvbW1hbmQgaXMgbGlrZSB1c2luZyBAc2FtcHstYiBAdmFye2JmZG5hbWV9fSBvbiB0aGUgY29tbWFuZCBsaW5lCi0oQHB4cmVme09wdGlvbnMsLENvbW1hbmQgTGluZSBPcHRpb25zfSkuICBJZiB0aGUgQGNvZGV7VEFSR0VUfSBjb21tYW5kCi1pcyB1c2VkIGJ1dCBAY29kZXtPVVRQVVRfRk9STUFUfSBpcyBub3QsIHRoZW4gdGhlIGxhc3QgQGNvZGV7VEFSR0VUfQotY29tbWFuZCBpcyBhbHNvIHVzZWQgdG8gc2V0IHRoZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgZmlsZS4gIEB4cmVme0JGRH0uCi1AZW5kIHRhYmxlCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgTWlzY2VsbGFuZW91cyBDb21tYW5kcwotQHN1YnNlY3Rpb24gT3RoZXIgbGlua2VyIHNjcmlwdCBjb21tYW5kcwotVGhlcmUgYXJlIGEgZmV3IG90aGVyIGxpbmtlciBzY3JpcHRzIGNvbW1hbmRzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEFTU0VSVChAdmFye2V4cH0sIEB2YXJ7bWVzc2FnZX0pCi1Aa2luZGV4IEFTU0VSVAotQGNpbmRleCBhc3NlcnRpb24gaW4gbGlua2VyIHNjcmlwdAotRW5zdXJlIHRoYXQgQHZhcntleHB9IGlzIG5vbi16ZXJvLiAgSWYgaXQgaXMgemVybywgdGhlbiBleGl0IHRoZSBsaW5rZXIKLXdpdGggYW4gZXJyb3IgY29kZSwgYW5kIHByaW50IEB2YXJ7bWVzc2FnZX0uCi0KLUBpdGVtIEVYVEVSTihAdmFye3N5bWJvbH0gQHZhcntzeW1ib2x9IEBkb3Rze30pCi1Aa2luZGV4IEVYVEVSTgotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9sIGluIGxpbmtlciBzY3JpcHQKLUZvcmNlIEB2YXJ7c3ltYm9sfSB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQKLXN5bWJvbC4gIERvaW5nIHRoaXMgbWF5LCBmb3IgZXhhbXBsZSwgdHJpZ2dlciBsaW5raW5nIG9mIGFkZGl0aW9uYWwKLW1vZHVsZXMgZnJvbSBzdGFuZGFyZCBsaWJyYXJpZXMuICBZb3UgbWF5IGxpc3Qgc2V2ZXJhbCBAdmFye3N5bWJvbH1zIGZvcgotZWFjaCBAY29kZXtFWFRFUk59LCBhbmQgeW91IG1heSB1c2UgQGNvZGV7RVhURVJOfSBtdWx0aXBsZSB0aW1lcy4gIFRoaXMKLWNvbW1hbmQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgQHNhbXB7LXV9IGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLUBpdGVtIEZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OCi1Aa2luZGV4IEZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OCi1AY2luZGV4IGNvbW1vbiBhbGxvY2F0aW9uIGluIGxpbmtlciBzY3JpcHQKLVRoaXMgY29tbWFuZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBAc2FtcHstZH0gY29tbWFuZC1saW5lIG9wdGlvbjoKLXRvIG1ha2UgQGNvZGV7bGR9IGFzc2lnbiBzcGFjZSB0byBjb21tb24gc3ltYm9scyBldmVuIGlmIGEgcmVsb2NhdGFibGUKLW91dHB1dCBmaWxlIGlzIHNwZWNpZmllZCAoQHNhbXB7LXJ9KS4KLQotQGl0ZW0gTk9DUk9TU1JFRlMoQHZhcntzZWN0aW9ufSBAdmFye3NlY3Rpb259IEBkb3Rze30pCi1Aa2luZGV4IE5PQ1JPU1NSRUZTKEB2YXJ7c2VjdGlvbnN9KQotQGNpbmRleCBjcm9zcyByZWZlcmVuY2VzCi1UaGlzIGNvbW1hbmQgbWF5IGJlIHVzZWQgdG8gdGVsbCBAY29kZXtsZH0gdG8gaXNzdWUgYW4gZXJyb3IgYWJvdXQgYW55Ci1yZWZlcmVuY2VzIGFtb25nIGNlcnRhaW4gb3V0cHV0IHNlY3Rpb25zLgotCi1JbiBjZXJ0YWluIHR5cGVzIG9mIHByb2dyYW1zLCBwYXJ0aWN1bGFybHkgb24gZW1iZWRkZWQgc3lzdGVtcyB3aGVuCi11c2luZyBvdmVybGF5cywgd2hlbiBvbmUgc2VjdGlvbiBpcyBsb2FkZWQgaW50byBtZW1vcnksIGFub3RoZXIgc2VjdGlvbgotd2lsbCBub3QgYmUuICBBbnkgZGlyZWN0IHJlZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIHNlY3Rpb25zIHdvdWxkIGJlCi1lcnJvcnMuICBGb3IgZXhhbXBsZSwgaXQgd291bGQgYmUgYW4gZXJyb3IgaWYgY29kZSBpbiBvbmUgc2VjdGlvbiBjYWxsZWQKLWEgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUgb3RoZXIgc2VjdGlvbi4KLQotVGhlIEBjb2Rle05PQ1JPU1NSRUZTfSBjb21tYW5kIHRha2VzIGEgbGlzdCBvZiBvdXRwdXQgc2VjdGlvbiBuYW1lcy4gIElmCi1AY29kZXtsZH0gZGV0ZWN0cyBhbnkgY3Jvc3MgcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSBzZWN0aW9ucywgaXQgcmVwb3J0cwotYW4gZXJyb3IgYW5kIHJldHVybnMgYSBub24temVybyBleGl0IHN0YXR1cy4gIE5vdGUgdGhhdCB0aGUKLUBjb2Rle05PQ1JPU1NSRUZTfSBjb21tYW5kIHVzZXMgb3V0cHV0IHNlY3Rpb24gbmFtZXMsIG5vdCBpbnB1dCBzZWN0aW9uCi1uYW1lcy4KLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1AaXRlbSBPVVRQVVRfQVJDSChAdmFye2JmZGFyY2h9KQotQGtpbmRleCBPVVRQVVRfQVJDSChAdmFye2JmZGFyY2h9KQotQGNpbmRleCBtYWNoaW5lIGFyY2hpdGVjdHVyZQotQGNpbmRleCBhcmNoaXRlY3R1cmUKLVNwZWNpZnkgYSBwYXJ0aWN1bGFyIG91dHB1dCBtYWNoaW5lIGFyY2hpdGVjdHVyZS4gIFRoZSBhcmd1bWVudCBpcyBvbmUKLW9mIHRoZSBuYW1lcyB1c2VkIGJ5IHRoZSBCRkQgbGlicmFyeSAoQHB4cmVme0JGRH0pLiAgWW91IGNhbiBzZWUgdGhlCi1hcmNoaXRlY3R1cmUgb2YgYW4gb2JqZWN0IGZpbGUgYnkgdXNpbmcgdGhlIEBjb2Rle29iamR1bXB9IHByb2dyYW0gd2l0aAotdGhlIEBzYW1wey1mfSBvcHRpb24uCi1AZW5kIGlmY2xlYXIKLUBlbmQgdGFibGUKLQotQG5vZGUgQXNzaWdubWVudHMKLUBzZWN0aW9uIEFzc2lnbmluZyBWYWx1ZXMgdG8gU3ltYm9scwotQGNpbmRleCBhc3NpZ25tZW50IGluIHNjcmlwdHMKLUBjaW5kZXggc3ltYm9sIGRlZmluaXRpb24sIHNjcmlwdHMKLUBjaW5kZXggdmFyaWFibGVzLCBkZWZpbmluZwotWW91IG1heSBhc3NpZ24gYSB2YWx1ZSB0byBhIHN5bWJvbCBpbiBhIGxpbmtlciBzY3JpcHQuICBUaGlzIHdpbGwgZGVmaW5lCi10aGUgc3ltYm9sIGFzIGEgZ2xvYmFsIHN5bWJvbC4KLQotQG1lbnUKLSogU2ltcGxlIEFzc2lnbm1lbnRzOjoJCVNpbXBsZSBBc3NpZ25tZW50cwotKiBQUk9WSURFOjoJCQlQUk9WSURFCi1AZW5kIG1lbnUKLQotQG5vZGUgU2ltcGxlIEFzc2lnbm1lbnRzCi1Ac3Vic2VjdGlvbiBTaW1wbGUgQXNzaWdubWVudHMKLQotWW91IG1heSBhc3NpZ24gdG8gYSBzeW1ib2wgdXNpbmcgYW55IG9mIHRoZSBDIGFzc2lnbm1lbnQgb3BlcmF0b3JzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7c3ltYm9sfSA9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSArPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gLT0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ICo9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSAvPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gPDw9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSA+Pj0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ICY9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSB8PSBAdmFye2V4cHJlc3Npb259IDsKLUBlbmQgdGFibGUKLQotVGhlIGZpcnN0IGNhc2Ugd2lsbCBkZWZpbmUgQHZhcntzeW1ib2x9IHRvIHRoZSB2YWx1ZSBvZgotQHZhcntleHByZXNzaW9ufS4gIEluIHRoZSBvdGhlciBjYXNlcywgQHZhcntzeW1ib2x9IG11c3QgYWxyZWFkeSBiZQotZGVmaW5lZCwgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlIGFkanVzdGVkIGFjY29yZGluZ2x5LgotCi1UaGUgc3BlY2lhbCBzeW1ib2wgbmFtZSBAc2FtcHsufSBpbmRpY2F0ZXMgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBZb3UKLW1heSBvbmx5IHVzZSB0aGlzIHdpdGhpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLgotCi1UaGUgc2VtaWNvbG9uIGFmdGVyIEB2YXJ7ZXhwcmVzc2lvbn0gaXMgcmVxdWlyZWQuCi0KLUV4cHJlc3Npb25zIGFyZSBkZWZpbmVkIGJlbG93OyBzZWUgQHJlZntFeHByZXNzaW9uc30uCi0KLVlvdSBtYXkgd3JpdGUgc3ltYm9sIGFzc2lnbm1lbnRzIGFzIGNvbW1hbmRzIGluIHRoZWlyIG93biByaWdodCwgb3IgYXMKLXN0YXRlbWVudHMgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQsIG9yIGFzIHBhcnQgb2YgYW4gb3V0cHV0Ci1zZWN0aW9uIGRlc2NyaXB0aW9uIGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQuCi0KLVRoZSBzZWN0aW9uIG9mIHRoZSBzeW1ib2wgd2lsbCBiZSBzZXQgZnJvbSB0aGUgc2VjdGlvbiBvZiB0aGUKLWV4cHJlc3Npb247IGZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQHJlZntFeHByZXNzaW9uIFNlY3Rpb259LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgc2hvd2luZyB0aGUgdGhyZWUgZGlmZmVyZW50IHBsYWNlcyB0aGF0IHN5bWJvbAotYXNzaWdubWVudHMgbWF5IGJlIHVzZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLWZsb2F0aW5nX3BvaW50ID0gMDsKLVNFQ1RJT05TCi1AewotICAudGV4dCA6Ci0gICAgQHsKLSAgICAgICooLnRleHQpCi0gICAgICBfZXRleHQgPSAuOwotICAgIEB9Ci0gIF9iZGF0YSA9ICguICsgMykgJiB+IDQ7Ci0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1JbiB0aGlzIGV4YW1wbGUsIHRoZSBzeW1ib2wgQHNhbXB7ZmxvYXRpbmdfcG9pbnR9IHdpbGwgYmUgZGVmaW5lZCBhcwotemVyby4gIFRoZSBzeW1ib2wgQHNhbXB7X2V0ZXh0fSB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nCi10aGUgbGFzdCBAc2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbi4gIFRoZSBzeW1ib2wgQHNhbXB7X2JkYXRhfSB3aWxsIGJlCi1kZWZpbmVkIGFzIHRoZSBhZGRyZXNzIGZvbGxvd2luZyB0aGUgQHNhbXB7LnRleHR9IG91dHB1dCBzZWN0aW9uIGFsaWduZWQKLXVwd2FyZCB0byBhIDQgYnl0ZSBib3VuZGFyeS4KLQotQG5vZGUgUFJPVklERQotQHN1YnNlY3Rpb24gUFJPVklERQotQGNpbmRleCBQUk9WSURFCi1JbiBzb21lIGNhc2VzLCBpdCBpcyBkZXNpcmFibGUgZm9yIGEgbGlua2VyIHNjcmlwdCB0byBkZWZpbmUgYSBzeW1ib2wKLW9ubHkgaWYgaXQgaXMgcmVmZXJlbmNlZCBhbmQgaXMgbm90IGRlZmluZWQgYnkgYW55IG9iamVjdCBpbmNsdWRlZCBpbgotdGhlIGxpbmsuICBGb3IgZXhhbXBsZSwgdHJhZGl0aW9uYWwgbGlua2VycyBkZWZpbmVkIHRoZSBzeW1ib2wKLUBzYW1we2V0ZXh0fS4gIEhvd2V2ZXIsIEFOU0kgQyByZXF1aXJlcyB0aGF0IHRoZSB1c2VyIGJlIGFibGUgdG8gdXNlCi1Ac2FtcHtldGV4dH0gYXMgYSBmdW5jdGlvbiBuYW1lIHdpdGhvdXQgZW5jb3VudGVyaW5nIGFuIGVycm9yLiAgVGhlCi1AY29kZXtQUk9WSURFfSBrZXl3b3JkIG1heSBiZSB1c2VkIHRvIGRlZmluZSBhIHN5bWJvbCwgc3VjaCBhcwotQHNhbXB7ZXRleHR9LCBvbmx5IGlmIGl0IGlzIHJlZmVyZW5jZWQgYnV0IG5vdCBkZWZpbmVkLiAgVGhlIHN5bnRheCBpcwotQGNvZGV7UFJPVklERShAdmFye3N5bWJvbH0gPSBAdmFye2V4cHJlc3Npb259KX0uCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBAY29kZXtQUk9WSURFfSB0byBkZWZpbmUgQHNhbXB7ZXRleHR9OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLUB7Ci0gIC50ZXh0IDoKLSAgICBAewotICAgICAgKigudGV4dCkKLSAgICAgIF9ldGV4dCA9IC47Ci0gICAgICBQUk9WSURFKGV0ZXh0ID0gLik7Ci0gICAgQH0KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JbiB0aGlzIGV4YW1wbGUsIGlmIHRoZSBwcm9ncmFtIGRlZmluZXMgQHNhbXB7X2V0ZXh0fSAod2l0aCBhIGxlYWRpbmcKLXVuZGVyc2NvcmUpLCB0aGUgbGlua2VyIHdpbGwgZ2l2ZSBhIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3IuICBJZiwgb24KLXRoZSBvdGhlciBoYW5kLCB0aGUgcHJvZ3JhbSBkZWZpbmVzIEBzYW1we2V0ZXh0fSAod2l0aCBubyBsZWFkaW5nCi11bmRlcnNjb3JlKSwgdGhlIGxpbmtlciB3aWxsIHNpbGVudGx5IHVzZSB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgcHJvZ3JhbS4KLUlmIHRoZSBwcm9ncmFtIHJlZmVyZW5jZXMgQHNhbXB7ZXRleHR9IGJ1dCBkb2VzIG5vdCBkZWZpbmUgaXQsIHRoZQotbGlua2VyIHdpbGwgdXNlIHRoZSBkZWZpbml0aW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1Abm9kZSBTRUNUSU9OUwotQHNlY3Rpb24gU0VDVElPTlMgY29tbWFuZAotQGtpbmRleCBTRUNUSU9OUwotVGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIHRlbGxzIHRoZSBsaW5rZXIgaG93IHRvIG1hcCBpbnB1dCBzZWN0aW9ucwotaW50byBvdXRwdXQgc2VjdGlvbnMsIGFuZCBob3cgdG8gcGxhY2UgdGhlIG91dHB1dCBzZWN0aW9ucyBpbiBtZW1vcnkuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGlzOgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLUB7Ci0gIEB2YXJ7c2VjdGlvbnMtY29tbWFuZH0KLSAgQHZhcntzZWN0aW9ucy1jb21tYW5kfQotICBAZG90c3t9Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotRWFjaCBAdmFye3NlY3Rpb25zLWNvbW1hbmR9IG1heSBvZiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLWFuIEBjb2Rle0VOVFJZfSBjb21tYW5kIChAcHhyZWZ7RW50cnkgUG9pbnQsLEVudHJ5IGNvbW1hbmR9KQotQGl0ZW0KLWEgc3ltYm9sIGFzc2lnbm1lbnQgKEBweHJlZntBc3NpZ25tZW50c30pCi1AaXRlbQotYW4gb3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLUBpdGVtCi1hbiBvdmVybGF5IGRlc2NyaXB0aW9uCi1AZW5kIGl0ZW1pemUKLQotVGhlIEBjb2Rle0VOVFJZfSBjb21tYW5kIGFuZCBzeW1ib2wgYXNzaWdubWVudHMgYXJlIHBlcm1pdHRlZCBpbnNpZGUgdGhlCi1AY29kZXtTRUNUSU9OU30gY29tbWFuZCBmb3IgY29udmVuaWVuY2UgaW4gdXNpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaW4KLXRob3NlIGNvbW1hbmRzLiAgVGhpcyBjYW4gYWxzbyBtYWtlIHRoZSBsaW5rZXIgc2NyaXB0IGVhc2llciB0bwotdW5kZXJzdGFuZCBiZWNhdXNlIHlvdSBjYW4gdXNlIHRob3NlIGNvbW1hbmRzIGF0IG1lYW5pbmdmdWwgcG9pbnRzIGluCi10aGUgbGF5b3V0IG9mIHRoZSBvdXRwdXQgZmlsZS4KLQotT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb25zIGFuZCBvdmVybGF5IGRlc2NyaXB0aW9ucyBhcmUgZGVzY3JpYmVkCi1iZWxvdy4KLQotSWYgeW91IGRvIG5vdCB1c2UgYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCBpbiB5b3VyIGxpbmtlciBzY3JpcHQsIHRoZQotbGlua2VyIHdpbGwgcGxhY2UgZWFjaCBpbnB1dCBzZWN0aW9uIGludG8gYW4gaWRlbnRpY2FsbHkgbmFtZWQgb3V0cHV0Ci1zZWN0aW9uIGluIHRoZSBvcmRlciB0aGF0IHRoZSBzZWN0aW9ucyBhcmUgZmlyc3QgZW5jb3VudGVyZWQgaW4gdGhlCi1pbnB1dCBmaWxlcy4gIElmIGFsbCBpbnB1dCBzZWN0aW9ucyBhcmUgcHJlc2VudCBpbiB0aGUgZmlyc3QgZmlsZSwgZm9yCi1leGFtcGxlLCB0aGUgb3JkZXIgb2Ygc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHdpbGwgbWF0Y2ggdGhlIG9yZGVyCi1pbiB0aGUgZmlyc3QgaW5wdXQgZmlsZS4gIFRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgYXQgYWRkcmVzcyB6ZXJvLgotCi1AbWVudQotKiBPdXRwdXQgU2VjdGlvbiBEZXNjcmlwdGlvbjo6CU91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uCi0qIE91dHB1dCBTZWN0aW9uIE5hbWU6OgkJT3V0cHV0IHNlY3Rpb24gbmFtZQotKiBPdXRwdXQgU2VjdGlvbiBBZGRyZXNzOjoJT3V0cHV0IHNlY3Rpb24gYWRkcmVzcwotKiBJbnB1dCBTZWN0aW9uOjoJCUlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLSogT3V0cHV0IFNlY3Rpb24gRGF0YTo6CQlPdXRwdXQgc2VjdGlvbiBkYXRhCi0qIE91dHB1dCBTZWN0aW9uIEtleXdvcmRzOjoJT3V0cHV0IHNlY3Rpb24ga2V5d29yZHMKLSogT3V0cHV0IFNlY3Rpb24gRGlzY2FyZGluZzo6CU91dHB1dCBzZWN0aW9uIGRpc2NhcmRpbmcKLSogT3V0cHV0IFNlY3Rpb24gQXR0cmlidXRlczo6CU91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZXMKLSogT3ZlcmxheSBEZXNjcmlwdGlvbjo6CQlPdmVybGF5IGRlc2NyaXB0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGVzY3JpcHRpb24KLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uCi1UaGUgZnVsbCBkZXNjcmlwdGlvbiBvZiBhbiBvdXRwdXQgc2VjdGlvbiBsb29rcyBsaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAgCi1AdmFye3NlY3Rpb259IFtAdmFye2FkZHJlc3N9XSBbKEB2YXJ7dHlwZX0pXSA6IFtBVChAdmFye2xtYX0pXQotICBAewotICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgQGRvdHN7fQotICBAfSBbPkB2YXJ7cmVnaW9ufV0gW0FUPkB2YXJ7bG1hX3JlZ2lvbn1dIFs6QHZhcntwaGRyfSA6QHZhcntwaGRyfSBAZG90c3t9XSBbPUB2YXJ7ZmlsbGV4cH1dCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Nb3N0IG91dHB1dCBzZWN0aW9ucyBkbyBub3QgdXNlIG1vc3Qgb2YgdGhlIG9wdGlvbmFsIHNlY3Rpb24gYXR0cmlidXRlcy4KLQotVGhlIHdoaXRlc3BhY2UgYXJvdW5kIEB2YXJ7c2VjdGlvbn0gaXMgcmVxdWlyZWQsIHNvIHRoYXQgdGhlIHNlY3Rpb24KLW5hbWUgaXMgdW5hbWJpZ3VvdXMuICBUaGUgY29sb24gYW5kIHRoZSBjdXJseSBicmFjZXMgYXJlIGFsc28gcmVxdWlyZWQuCi1UaGUgbGluZSBicmVha3MgYW5kIG90aGVyIHdoaXRlIHNwYWNlIGFyZSBvcHRpb25hbC4KLQotRWFjaCBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9IG1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLWEgc3ltYm9sIGFzc2lnbm1lbnQgKEBweHJlZntBc3NpZ25tZW50c30pCi1AaXRlbQotYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiAoQHB4cmVme0lucHV0IFNlY3Rpb259KQotQGl0ZW0KLWRhdGEgdmFsdWVzIHRvIGluY2x1ZGUgZGlyZWN0bHkgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBEYXRhfSkKLUBpdGVtCi1hIHNwZWNpYWwgb3V0cHV0IHNlY3Rpb24ga2V5d29yZCAoQHB4cmVme091dHB1dCBTZWN0aW9uIEtleXdvcmRzfSkKLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBOYW1lCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBuYW1lCi1AY2luZGV4IG5hbWUsIHNlY3Rpb24KLUBjaW5kZXggc2VjdGlvbiBuYW1lCi1UaGUgbmFtZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gaXMgQHZhcntzZWN0aW9ufS4gIEB2YXJ7c2VjdGlvbn0gbXVzdAotbWVldCB0aGUgY29uc3RyYWludHMgb2YgeW91ciBvdXRwdXQgZm9ybWF0LiAgSW4gZm9ybWF0cyB3aGljaCBvbmx5Ci1zdXBwb3J0IGEgbGltaXRlZCBudW1iZXIgb2Ygc2VjdGlvbnMsIHN1Y2ggYXMgQGNvZGV7YS5vdXR9LCB0aGUgbmFtZQotbXVzdCBiZSBvbmUgb2YgdGhlIG5hbWVzIHN1cHBvcnRlZCBieSB0aGUgZm9ybWF0IChAY29kZXthLm91dH0sIGZvcgotZXhhbXBsZSwgYWxsb3dzIG9ubHkgQHNhbXB7LnRleHR9LCBAc2FtcHsuZGF0YX0gb3IgQHNhbXB7LmJzc30pLiBJZiB0aGUKLW91dHB1dCBmb3JtYXQgc3VwcG9ydHMgYW55IG51bWJlciBvZiBzZWN0aW9ucywgYnV0IHdpdGggbnVtYmVycyBhbmQgbm90Ci1uYW1lcyAoYXMgaXMgdGhlIGNhc2UgZm9yIE9hc3lzKSwgdGhlIG5hbWUgc2hvdWxkIGJlIHN1cHBsaWVkIGFzIGEKLXF1b3RlZCBudW1lcmljIHN0cmluZy4gIEEgc2VjdGlvbiBuYW1lIG1heSBjb25zaXN0IG9mIGFueSBzZXF1ZW5jZSBvZgotY2hhcmFjdGVycywgYnV0IGEgbmFtZSB3aGljaCBjb250YWlucyBhbnkgdW51c3VhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMKLWNvbW1hcyBtdXN0IGJlIHF1b3RlZC4KLQotVGhlIG91dHB1dCBzZWN0aW9uIG5hbWUgQHNhbXB7L0RJU0NBUkQvfSBpcyBzcGVjaWFsOyBAcmVme091dHB1dCBTZWN0aW9uCi1EaXNjYXJkaW5nfS4KLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gQWRkcmVzcwotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gYWRkcmVzcwotQGNpbmRleCBhZGRyZXNzLCBzZWN0aW9uCi1AY2luZGV4IHNlY3Rpb24gYWRkcmVzcwotVGhlIEB2YXJ7YWRkcmVzc30gaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIFZNQSAodGhlIHZpcnR1YWwgbWVtb3J5Ci1hZGRyZXNzKSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICBJZiB5b3UgZG8gbm90IHByb3ZpZGUgQHZhcnthZGRyZXNzfSwKLXRoZSBsaW5rZXIgd2lsbCBzZXQgaXQgYmFzZWQgb24gQHZhcntyZWdpb259IGlmIHByZXNlbnQsIG9yIG90aGVyd2lzZQotYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIuCi0KLUlmIHlvdSBwcm92aWRlIEB2YXJ7YWRkcmVzc30sIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGJlCi1zZXQgdG8gcHJlY2lzZWx5IHRoYXQuICBJZiB5b3UgcHJvdmlkZSBuZWl0aGVyIEB2YXJ7YWRkcmVzc30gbm9yCi1AdmFye3JlZ2lvbn0sIHRoZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBzZWN0aW9uIHdpbGwgYmUgc2V0IHRvIHRoZQotY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlciBhbGlnbmVkIHRvIHRoZSBhbGlnbm1lbnQKLXJlcXVpcmVtZW50cyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICBUaGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIHRoZQotb3V0cHV0IHNlY3Rpb24gaXMgdGhlIHN0cmljdGVzdCBhbGlnbm1lbnQgb2YgYW55IGlucHV0IHNlY3Rpb24gY29udGFpbmVkCi13aXRoaW4gdGhlIG91dHB1dCBzZWN0aW9uLgotCi1Gb3IgZXhhbXBsZSwKLUBzbWFsbGV4YW1wbGUKLS50ZXh0IC4gOiBAeyAqKC50ZXh0KSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotYW5kCi1Ac21hbGxleGFtcGxlCi0udGV4dCA6IEB7ICooLnRleHQpIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1hcmUgc3VidGx5IGRpZmZlcmVudC4gIFRoZSBmaXJzdCB3aWxsIHNldCB0aGUgYWRkcmVzcyBvZiB0aGUKLUBzYW1wey50ZXh0fSBvdXRwdXQgc2VjdGlvbiB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KLWNvdW50ZXIuICBUaGUgc2Vjb25kIHdpbGwgc2V0IGl0IHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbgotY291bnRlciBhbGlnbmVkIHRvIHRoZSBzdHJpY3Rlc3QgYWxpZ25tZW50IG9mIGEgQHNhbXB7LnRleHR9IGlucHV0Ci1zZWN0aW9uLgotCi1UaGUgQHZhcnthZGRyZXNzfSBtYXkgYmUgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb247IEByZWZ7RXhwcmVzc2lvbnN9LgotRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGFsaWduIHRoZSBzZWN0aW9uIG9uIGEgMHgxMCBieXRlIGJvdW5kYXJ5LAotc28gdGhhdCB0aGUgbG93ZXN0IGZvdXIgYml0cyBvZiB0aGUgc2VjdGlvbiBhZGRyZXNzIGFyZSB6ZXJvLCB5b3UgY291bGQKLWRvIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi0udGV4dCBBTElHTigweDEwKSA6IEB7ICooLnRleHQpIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHdvcmtzIGJlY2F1c2UgQGNvZGV7QUxJR059IHJldHVybnMgdGhlIGN1cnJlbnQgbG9jYXRpb24gY291bnRlcgotYWxpZ25lZCB1cHdhcmQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQotU3BlY2lmeWluZyBAdmFye2FkZHJlc3N9IGZvciBhIHNlY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZQotbG9jYXRpb24gY291bnRlci4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbgotQHN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotQGNpbmRleCBpbnB1dCBzZWN0aW9ucwotQGNpbmRleCBtYXBwaW5nIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucwotVGhlIG1vc3QgY29tbW9uIG91dHB1dCBzZWN0aW9uIGNvbW1hbmQgaXMgYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQotVGhlIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gaXMgdGhlIG1vc3QgYmFzaWMgbGlua2VyIHNjcmlwdCBvcGVyYXRpb24uCi1Zb3UgdXNlIG91dHB1dCBzZWN0aW9ucyB0byB0ZWxsIHRoZSBsaW5rZXIgaG93IHRvIGxheSBvdXQgeW91ciBwcm9ncmFtCi1pbiBtZW1vcnkuICBZb3UgdXNlIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb25zIHRvIHRlbGwgdGhlIGxpbmtlciBob3cgdG8KLW1hcCB0aGUgaW5wdXQgZmlsZXMgaW50byB5b3VyIG1lbW9yeSBsYXlvdXQuCi0KLUBtZW51Ci0qIElucHV0IFNlY3Rpb24gQmFzaWNzOjoJSW5wdXQgc2VjdGlvbiBiYXNpY3MKLSogSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHM6OglJbnB1dCBzZWN0aW9uIHdpbGRjYXJkIHBhdHRlcm5zCi0qIElucHV0IFNlY3Rpb24gQ29tbW9uOjoJSW5wdXQgc2VjdGlvbiBmb3IgY29tbW9uIHN5bWJvbHMKLSogSW5wdXQgU2VjdGlvbiBLZWVwOjoJCUlucHV0IHNlY3Rpb24gYW5kIGdhcmJhZ2UgY29sbGVjdGlvbgotKiBJbnB1dCBTZWN0aW9uIEV4YW1wbGU6OglJbnB1dCBzZWN0aW9uIGV4YW1wbGUKLUBlbmQgbWVudQotCi1Abm9kZSBJbnB1dCBTZWN0aW9uIEJhc2ljcwotQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBiYXNpY3MKLUBjaW5kZXggaW5wdXQgc2VjdGlvbiBiYXNpY3MKLUFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gY29uc2lzdHMgb2YgYSBmaWxlIG5hbWUgb3B0aW9uYWxseSBmb2xsb3dlZAotYnkgYSBsaXN0IG9mIHNlY3Rpb24gbmFtZXMgaW4gcGFyZW50aGVzZXMuCi0KLVRoZSBmaWxlIG5hbWUgYW5kIHRoZSBzZWN0aW9uIG5hbWUgbWF5IGJlIHdpbGRjYXJkIHBhdHRlcm5zLCB3aGljaCB3ZQotZGVzY3JpYmUgZnVydGhlciBiZWxvdyAoQHB4cmVme0lucHV0IFNlY3Rpb24gV2lsZGNhcmRzfSkuCi0KLVRoZSBtb3N0IGNvbW1vbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGlzIHRvIGluY2x1ZGUgYWxsIGlucHV0Ci1zZWN0aW9ucyB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gIEZvciBleGFtcGxlLCB0bwotaW5jbHVkZSBhbGwgaW5wdXQgQHNhbXB7LnRleHR9IHNlY3Rpb25zLCB5b3Ugd291bGQgd3JpdGU6Ci1Ac21hbGxleGFtcGxlCi0qKC50ZXh0KQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSGVyZSB0aGUgQHNhbXB7Kn0gaXMgYSB3aWxkY2FyZCB3aGljaCBtYXRjaGVzIGFueSBmaWxlIG5hbWUuICBUbyBleGNsdWRlIGEgbGlzdAotb2YgZmlsZXMgZnJvbSBtYXRjaGluZyB0aGUgZmlsZSBuYW1lIHdpbGRjYXJkLCBFWENMVURFX0ZJTEUgbWF5IGJlIHVzZWQgdG8KLW1hdGNoIGFsbCBmaWxlcyBleGNlcHQgdGhlIG9uZXMgc3BlY2lmaWVkIGluIHRoZSBFWENMVURFX0ZJTEUgbGlzdC4gIEZvcgotZXhhbXBsZToKLUBzbWFsbGV4YW1wbGUKLSgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpvdGhlcmZpbGUubykgLmN0b3JzKSkKLUBlbmQgc21hbGxleGFtcGxlCi13aWxsIGNhdXNlIGFsbCAuY3RvcnMgc2VjdGlvbnMgZnJvbSBhbGwgZmlsZXMgZXhjZXB0IEBmaWxle2NydGVuZC5vfSBhbmQKLUBmaWxle290aGVyZmlsZS5vfSB0byBiZSBpbmNsdWRlZC4KLQotVGhlcmUgYXJlIHR3byB3YXlzIHRvIGluY2x1ZGUgbW9yZSB0aGFuIG9uZSBzZWN0aW9uOgotQHNtYWxsZXhhbXBsZQotKigudGV4dCAucmRhdGEpCi0qKC50ZXh0KSAqKC5yZGF0YSkKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBAc2FtcHsudGV4dH0gYW5kCi1Ac2FtcHsucmRhdGF9IGlucHV0IHNlY3Rpb25zIHdpbGwgYXBwZWFyIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gIEluIHRoZQotZmlyc3QgZXhhbXBsZSwgdGhleSB3aWxsIGJlIGludGVybWluZ2xlZC4gIEluIHRoZSBzZWNvbmQgZXhhbXBsZSwgYWxsCi1Ac2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgd2lsbCBhcHBlYXIgZmlyc3QsIGZvbGxvd2VkIGJ5IGFsbAotQHNhbXB7LnJkYXRhfSBpbnB1dCBzZWN0aW9ucy4KLQotWW91IGNhbiBzcGVjaWZ5IGEgZmlsZSBuYW1lIHRvIGluY2x1ZGUgc2VjdGlvbnMgZnJvbSBhIHBhcnRpY3VsYXIgZmlsZS4KLVlvdSB3b3VsZCBkbyB0aGlzIGlmIG9uZSBvciBtb3JlIG9mIHlvdXIgZmlsZXMgY29udGFpbiBzcGVjaWFsIGRhdGEgdGhhdAotbmVlZHMgdG8gYmUgYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGluIG1lbW9yeS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotZGF0YS5vKC5kYXRhKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IHVzZSBhIGZpbGUgbmFtZSB3aXRob3V0IGEgbGlzdCBvZiBzZWN0aW9ucywgdGhlbiBhbGwgc2VjdGlvbnMgaW4KLXRoZSBpbnB1dCBmaWxlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhpcyBpcyBub3QKLWNvbW1vbmx5IGRvbmUsIGJ1dCBpdCBtYXkgYnkgdXNlZnVsIG9uIG9jY2FzaW9uLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi1kYXRhLm8KLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4geW91IHVzZSBhIGZpbGUgbmFtZSB3aGljaCBkb2VzIG5vdCBjb250YWluIGFueSB3aWxkIGNhcmQKLWNoYXJhY3RlcnMsIHRoZSBsaW5rZXIgd2lsbCBmaXJzdCBzZWUgaWYgeW91IGFsc28gc3BlY2lmaWVkIHRoZSBmaWxlCi1uYW1lIG9uIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lIG9yIGluIGFuIEBjb2Rle0lOUFVUfSBjb21tYW5kLiAgSWYgeW91Ci1kaWQgbm90LCB0aGUgbGlua2VyIHdpbGwgYXR0ZW1wdCB0byBvcGVuIHRoZSBmaWxlIGFzIGFuIGlucHV0IGZpbGUsIGFzCi10aG91Z2ggaXQgYXBwZWFyZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSBhbgotQGNvZGV7SU5QVVR9IGNvbW1hbmQsIGJlY2F1c2UgdGhlIGxpbmtlciB3aWxsIG5vdCBzZWFyY2ggZm9yIHRoZSBmaWxlIGluCi10aGUgYXJjaGl2ZSBzZWFyY2ggcGF0aC4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHMKLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gd2lsZGNhcmQgcGF0dGVybnMKLUBjaW5kZXggaW5wdXQgc2VjdGlvbiB3aWxkY2FyZHMKLUBjaW5kZXggd2lsZGNhcmQgZmlsZSBuYW1lIHBhdHRlcm5zCi1AY2luZGV4IGZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucwotQGNpbmRleCBzZWN0aW9uIG5hbWUgd2lsZGNhcmQgcGF0dGVybnMKLUluIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24sIGVpdGhlciB0aGUgZmlsZSBuYW1lIG9yIHRoZSBzZWN0aW9uCi1uYW1lIG9yIGJvdGggbWF5IGJlIHdpbGRjYXJkIHBhdHRlcm5zLgotCi1UaGUgZmlsZSBuYW1lIG9mIEBzYW1weyp9IHNlZW4gaW4gbWFueSBleGFtcGxlcyBpcyBhIHNpbXBsZSB3aWxkY2FyZAotcGF0dGVybiBmb3IgdGhlIGZpbGUgbmFtZS4KLQotVGhlIHdpbGRjYXJkIHBhdHRlcm5zIGFyZSBsaWtlIHRob3NlIHVzZWQgYnkgdGhlIFVuaXggc2hlbGwuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gKgotbWF0Y2hlcyBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMKLUBpdGVtID8KLW1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIKLUBpdGVtIFtAdmFye2NoYXJzfV0KLW1hdGNoZXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYW55IG9mIHRoZSBAdmFye2NoYXJzfTsgdGhlIEBzYW1wey19Ci1jaGFyYWN0ZXIgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBhIHJhbmdlIG9mIGNoYXJhY3RlcnMsIGFzIGluCi1Ac2FtcHtbYS16XX0gdG8gbWF0Y2ggYW55IGxvd2VyIGNhc2UgbGV0dGVyCi1AaXRlbSBcCi1xdW90ZXMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIKLUBlbmQgdGFibGUKLQotV2hlbiBhIGZpbGUgbmFtZSBpcyBtYXRjaGVkIHdpdGggYSB3aWxkY2FyZCwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMKLXdpbGwgbm90IG1hdGNoIGEgQHNhbXB7L30gY2hhcmFjdGVyICh1c2VkIHRvIHNlcGFyYXRlIGRpcmVjdG9yeSBuYW1lcyBvbgotVW5peCkuICBBIHBhdHRlcm4gY29uc2lzdGluZyBvZiBhIHNpbmdsZSBAc2FtcHsqfSBjaGFyYWN0ZXIgaXMgYW4KLWV4Y2VwdGlvbjsgaXQgd2lsbCBhbHdheXMgbWF0Y2ggYW55IGZpbGUgbmFtZSwgd2hldGhlciBpdCBjb250YWlucyBhCi1Ac2FtcHsvfSBvciBub3QuICBJbiBhIHNlY3Rpb24gbmFtZSwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMgd2lsbCBtYXRjaAotYSBAc2FtcHsvfSBjaGFyYWN0ZXIuCi0KLUZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucyBvbmx5IG1hdGNoIGZpbGVzIHdoaWNoIGFyZSBleHBsaWNpdGx5Ci1zcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbiBhbiBAY29kZXtJTlBVVH0gY29tbWFuZC4gIFRoZSBsaW5rZXIKLWRvZXMgbm90IHNlYXJjaCBkaXJlY3RvcmllcyB0byBleHBhbmQgd2lsZGNhcmRzLgotCi1JZiBhIGZpbGUgbmFtZSBtYXRjaGVzIG1vcmUgdGhhbiBvbmUgd2lsZGNhcmQgcGF0dGVybiwgb3IgaWYgYSBmaWxlIG5hbWUKLWFwcGVhcnMgZXhwbGljaXRseSBhbmQgaXMgYWxzbyBtYXRjaGVkIGJ5IGEgd2lsZGNhcmQgcGF0dGVybiwgdGhlIGxpbmtlcgotd2lsbCB1c2UgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgRm9yIGV4YW1wbGUsIHRoaXMKLXNlcXVlbmNlIG9mIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb25zIGlzIHByb2JhYmx5IGluIGVycm9yLCBiZWNhdXNlIHRoZQotQGZpbGV7ZGF0YS5vfSBydWxlIHdpbGwgbm90IGJlIHVzZWQ6Ci1Ac21hbGxleGFtcGxlCi0uZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0uZGF0YTEgOiBAeyBkYXRhLm8oLmRhdGEpIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IFNPUlQKLU5vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgcGxhY2UgZmlsZXMgYW5kIHNlY3Rpb25zIG1hdGNoZWQgYnkgd2lsZGNhcmRzCi1pbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc2VlbiBkdXJpbmcgdGhlIGxpbmsuICBZb3UgY2FuIGNoYW5nZQotdGhpcyBieSB1c2luZyB0aGUgQGNvZGV7U09SVH0ga2V5d29yZCwgd2hpY2ggYXBwZWFycyBiZWZvcmUgYSB3aWxkY2FyZAotcGF0dGVybiBpbiBwYXJlbnRoZXNlcyAoZS5nLiwgQGNvZGV7U09SVCgudGV4dCopfSkuICBXaGVuIHRoZQotQGNvZGV7U09SVH0ga2V5d29yZCBpcyB1c2VkLCB0aGUgbGlua2VyIHdpbGwgc29ydCB0aGUgZmlsZXMgb3Igc2VjdGlvbnMKLWludG8gYXNjZW5kaW5nIG9yZGVyIGJ5IG5hbWUgYmVmb3JlIHBsYWNpbmcgdGhlbSBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUlmIHlvdSBldmVyIGdldCBjb25mdXNlZCBhYm91dCB3aGVyZSBpbnB1dCBzZWN0aW9ucyBhcmUgZ29pbmcsIHVzZSB0aGUKLUBzYW1wey1NfSBsaW5rZXIgb3B0aW9uIHRvIGdlbmVyYXRlIGEgbWFwIGZpbGUuICBUaGUgbWFwIGZpbGUgc2hvd3MKLXByZWNpc2VseSBob3cgaW5wdXQgc2VjdGlvbnMgYXJlIG1hcHBlZCB0byBvdXRwdXQgc2VjdGlvbnMuCi0KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgd2lsZGNhcmQgcGF0dGVybnMgbWlnaHQgYmUgdXNlZCB0byBwYXJ0aXRpb24KLWZpbGVzLiAgVGhpcyBsaW5rZXIgc2NyaXB0IGRpcmVjdHMgdGhlIGxpbmtlciB0byBwbGFjZSBhbGwgQHNhbXB7LnRleHR9Ci1zZWN0aW9ucyBpbiBAc2FtcHsudGV4dH0gYW5kIGFsbCBAc2FtcHsuYnNzfSBzZWN0aW9ucyBpbiBAc2FtcHsuYnNzfS4KLVRoZSBsaW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gZnJvbSBhbGwgZmlsZXMgYmVnaW5uaW5nCi13aXRoIGFuIHVwcGVyIGNhc2UgY2hhcmFjdGVyIGluIEBzYW1wey5EQVRBfTsgZm9yIGFsbCBvdGhlciBmaWxlcywgdGhlCi1saW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gaW4gQHNhbXB7LmRhdGF9LgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAewotICAudGV4dCA6IEB7ICooLnRleHQpIEB9Ci0gIC5EQVRBIDogQHsgW0EtWl0qKC5kYXRhKSBAfQotICAuZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0gIC5ic3MgOiBAeyAqKC5ic3MpIEB9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBDb21tb24KLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzCi1AY2luZGV4IGNvbW1vbiBzeW1ib2wgcGxhY2VtZW50Ci1AY2luZGV4IHVuaW5pdGlhbGl6ZWQgZGF0YSBwbGFjZW1lbnQKLUEgc3BlY2lhbCBub3RhdGlvbiBpcyBuZWVkZWQgZm9yIGNvbW1vbiBzeW1ib2xzLCBiZWNhdXNlIGluIG1hbnkgb2JqZWN0Ci1maWxlIGZvcm1hdHMgY29tbW9uIHN5bWJvbHMgZG8gbm90IGhhdmUgYSBwYXJ0aWN1bGFyIGlucHV0IHNlY3Rpb24uICBUaGUKLWxpbmtlciB0cmVhdHMgY29tbW9uIHN5bWJvbHMgYXMgdGhvdWdoIHRoZXkgYXJlIGluIGFuIGlucHV0IHNlY3Rpb24KLW5hbWVkIEBzYW1we0NPTU1PTn0uCi0KLVlvdSBtYXkgdXNlIGZpbGUgbmFtZXMgd2l0aCB0aGUgQHNhbXB7Q09NTU9OfSBzZWN0aW9uIGp1c3QgYXMgd2l0aCBhbnkKLW90aGVyIGlucHV0IHNlY3Rpb25zLiAgWW91IGNhbiB1c2UgdGhpcyB0byBwbGFjZSBjb21tb24gc3ltYm9scyBmcm9tIGEKLXBhcnRpY3VsYXIgaW5wdXQgZmlsZSBpbiBvbmUgc2VjdGlvbiB3aGlsZSBjb21tb24gc3ltYm9scyBmcm9tIG90aGVyCi1pbnB1dCBmaWxlcyBhcmUgcGxhY2VkIGluIGFub3RoZXIgc2VjdGlvbi4KLQotSW4gbW9zdCBjYXNlcywgY29tbW9uIHN5bWJvbHMgaW4gaW5wdXQgZmlsZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlCi1Ac2FtcHsuYnNzfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotLmJzcyBAeyAqKC5ic3MpICooQ09NTU9OKSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBzY29tbW9uIHNlY3Rpb24KLUBjaW5kZXggc21hbGwgY29tbW9uIHN5bWJvbHMKLVNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBoYXZlIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBjb21tb24gc3ltYm9sLiAgRm9yCi1leGFtcGxlLCB0aGUgTUlQUyBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IGRpc3Rpbmd1aXNoZXMgc3RhbmRhcmQgY29tbW9uCi1zeW1ib2xzIGFuZCBzbWFsbCBjb21tb24gc3ltYm9scy4gIEluIHRoaXMgY2FzZSwgdGhlIGxpbmtlciB3aWxsIHVzZSBhCi1kaWZmZXJlbnQgc3BlY2lhbCBzZWN0aW9uIG5hbWUgZm9yIG90aGVyIHR5cGVzIG9mIGNvbW1vbiBzeW1ib2xzLiAgSW4KLXRoZSBjYXNlIG9mIE1JUFMgRUxGLCB0aGUgbGlua2VyIHVzZXMgQHNhbXB7Q09NTU9OfSBmb3Igc3RhbmRhcmQgY29tbW9uCi1zeW1ib2xzIGFuZCBAc2FtcHsuc2NvbW1vbn0gZm9yIHNtYWxsIGNvbW1vbiBzeW1ib2xzLiAgVGhpcyBwZXJtaXRzIHlvdQotdG8gbWFwIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgY29tbW9uIHN5bWJvbHMgaW50byBtZW1vcnkgYXQgZGlmZmVyZW50Ci1sb2NhdGlvbnMuCi0KLUBjaW5kZXggW0NPTU1PTl0KLVlvdSB3aWxsIHNvbWV0aW1lcyBzZWUgQHNhbXB7W0NPTU1PTl19IGluIG9sZCBsaW5rZXIgc2NyaXB0cy4gIFRoaXMKLW5vdGF0aW9uIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiAgSXQgaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7KihDT01NT04pfS4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBLZWVwCi1Ac3Vic3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24KLUBjaW5kZXggS0VFUAotQGNpbmRleCBnYXJiYWdlIGNvbGxlY3Rpb24KLVdoZW4gbGluay10aW1lIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBpbiB1c2UgKEBzYW1wey0tZ2Mtc2VjdGlvbnN9KSwKLWl0IGlzIG9mdGVuIHVzZWZ1bCB0byBtYXJrIHNlY3Rpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBlbGltaW5hdGVkLiAKLVRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHN1cnJvdW5kaW5nIGFuIGlucHV0IHNlY3Rpb24ncyB3aWxkY2FyZCBlbnRyeQotd2l0aCBAY29kZXtLRUVQKCl9LCBhcyBpbiBAY29kZXtLRUVQKCooLmluaXQpKX0gb3IKLUBjb2Rle0tFRVAoU09SVCgqKSguY3RvcnMpKX0uCi0KLUBub2RlIElucHV0IFNlY3Rpb24gRXhhbXBsZQotQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBleGFtcGxlCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgaXMgYSBjb21wbGV0ZSBsaW5rZXIgc2NyaXB0LiAgSXQgdGVsbHMgdGhlIGxpbmtlcgotdG8gcmVhZCBhbGwgb2YgdGhlIHNlY3Rpb25zIGZyb20gZmlsZSBAZmlsZXthbGwub30gYW5kIHBsYWNlIHRoZW0gYXQgdGhlCi1zdGFydCBvZiBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXRhfSB3aGljaCBzdGFydHMgYXQgbG9jYXRpb24KLUBzYW1wezB4MTAwMDB9LiAgQWxsIG9mIHNlY3Rpb24gQHNhbXB7LmlucHV0MX0gZnJvbSBmaWxlIEBmaWxle2Zvby5vfQotZm9sbG93cyBpbW1lZGlhdGVseSwgaW4gdGhlIHNhbWUgb3V0cHV0IHNlY3Rpb24uICBBbGwgb2Ygc2VjdGlvbgotQHNhbXB7LmlucHV0Mn0gZnJvbSBAZmlsZXtmb28ub30gZ29lcyBpbnRvIG91dHB1dCBzZWN0aW9uCi1Ac2FtcHtvdXRwdXRifSwgZm9sbG93ZWQgYnkgc2VjdGlvbiBAc2FtcHsuaW5wdXQxfSBmcm9tIEBmaWxle2ZvbzEub30uCi1BbGwgb2YgdGhlIHJlbWFpbmluZyBAc2FtcHsuaW5wdXQxfSBhbmQgQHNhbXB7LmlucHV0Mn0gc2VjdGlvbnMgZnJvbSBhbnkKLWZpbGVzIGFyZSB3cml0dGVuIHRvIG91dHB1dCBzZWN0aW9uIEBzYW1we291dHB1dGN9LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7Ci0gIG91dHB1dGEgMHgxMDAwMCA6Ci0gICAgQHsKLSAgICBhbGwubwotICAgIGZvby5vICguaW5wdXQxKQotICAgIEB9Ci0gIG91dHB1dGIgOgotICAgIEB7Ci0gICAgZm9vLm8gKC5pbnB1dDIpCi0gICAgZm9vMS5vICguaW5wdXQxKQotICAgIEB9Ci0gIG91dHB1dGMgOgotICAgIEB7Ci0gICAgKiguaW5wdXQxKQotICAgICooLmlucHV0MikKLSAgICBAfQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlICAgICAgICAKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGF0YQotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGF0YQotQGNpbmRleCBkYXRhCi1AY2luZGV4IHNlY3Rpb24gZGF0YQotQGNpbmRleCBvdXRwdXQgc2VjdGlvbiBkYXRhCi1Aa2luZGV4IEJZVEUoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggU0hPUlQoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggTE9ORyhAdmFye2V4cHJlc3Npb259KQotQGtpbmRleCBRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Aa2luZGV4IFNRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Zb3UgY2FuIGluY2x1ZGUgZXhwbGljaXQgYnl0ZXMgb2YgZGF0YSBpbiBhbiBvdXRwdXQgc2VjdGlvbiBieSB1c2luZwotQGNvZGV7QllURX0sIEBjb2Rle1NIT1JUfSwgQGNvZGV7TE9OR30sIEBjb2Rle1FVQUR9LCBvciBAY29kZXtTUVVBRH0gYXMKLWFuIG91dHB1dCBzZWN0aW9uIGNvbW1hbmQuICBFYWNoIGtleXdvcmQgaXMgZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbiBpbgotcGFyZW50aGVzZXMgcHJvdmlkaW5nIHRoZSB2YWx1ZSB0byBzdG9yZSAoQHB4cmVme0V4cHJlc3Npb25zfSkuICBUaGUKLXZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIHN0b3JlZCBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KLWNvdW50ZXIuCi0KLVRoZSBAY29kZXtCWVRFfSwgQGNvZGV7U0hPUlR9LCBAY29kZXtMT05HfSwgYW5kIEBjb2Rle1FVQUR9IGNvbW1hbmRzCi1zdG9yZSBvbmUsIHR3bywgZm91ciwgYW5kIGVpZ2h0IGJ5dGVzIChyZXNwZWN0aXZlbHkpLiAgQWZ0ZXIgc3RvcmluZyB0aGUKLWJ5dGVzLCB0aGUgbG9jYXRpb24gY291bnRlciBpcyBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1zdG9yZWQuCi0KLUZvciBleGFtcGxlLCB0aGlzIHdpbGwgc3RvcmUgdGhlIGJ5dGUgMSBmb2xsb3dlZCBieSB0aGUgZm91ciBieXRlIHZhbHVlCi1vZiB0aGUgc3ltYm9sIEBzYW1we2FkZHJ9OgotQHNtYWxsZXhhbXBsZQotQllURSgxKQotTE9ORyhhZGRyKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotV2hlbiB1c2luZyBhIDY0IGJpdCBob3N0IG9yIHRhcmdldCwgQGNvZGV7UVVBRH0gYW5kIEBjb2Rle1NRVUFEfSBhcmUgdGhlCi1zYW1lOyB0aGV5IGJvdGggc3RvcmUgYW4gOCBieXRlLCBvciA2NCBiaXQsIHZhbHVlLiAgV2hlbiBib3RoIGhvc3QgYW5kCi10YXJnZXQgYXJlIDMyIGJpdHMsIGFuIGV4cHJlc3Npb24gaXMgY29tcHV0ZWQgYXMgMzIgYml0cy4gIEluIHRoaXMgY2FzZQotQGNvZGV7UVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHplcm8gZXh0ZW5kZWQgdG8gNjQgYml0cywgYW5kCi1AY29kZXtTUVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHNpZ24gZXh0ZW5kZWQgdG8gNjQgYml0cy4KLQotSWYgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUgaGFzIGFuIGV4cGxpY2l0IGVuZGlhbm5lc3MsCi13aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGF0IGVuZGlhbm5lc3MuCi1XaGVuIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgZG9lcyBub3QgaGF2ZSBhbiBleHBsaWNpdCBlbmRpYW5uZXNzLCBhcyBpcwotdHJ1ZSBvZiwgZm9yIGV4YW1wbGUsIFMtcmVjb3JkcywgdGhlIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIHRoZQotZW5kaWFubmVzcyBvZiB0aGUgZmlyc3QgaW5wdXQgb2JqZWN0IGZpbGUuCi0KLUBraW5kZXggRklMTChAdmFye2V4cHJlc3Npb259KQotQGNpbmRleCBob2xlcywgZmlsbGluZwotQGNpbmRleCB1bnNwZWNpZmllZCBtZW1vcnkKLVlvdSBtYXkgdXNlIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kIHRvIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciB0aGUKLWN1cnJlbnQgc2VjdGlvbi4gIEl0IGlzIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMuICBBbnkKLW90aGVyd2lzZSB1bnNwZWNpZmllZCByZWdpb25zIG9mIG1lbW9yeSB3aXRoaW4gdGhlIHNlY3Rpb24gKGZvciBleGFtcGxlLAotZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IG9mIGlucHV0IHNlY3Rpb25zKSBhcmUgZmlsbGVkCi13aXRoIHRoZSB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgb2YgdGhlIGV4cHJlc3Npb24sIHJlcGVhdGVkIGFzCi1uZWNlc3NhcnkuICBBIEBjb2Rle0ZJTEx9IHN0YXRlbWVudCBjb3ZlcnMgbWVtb3J5IGxvY2F0aW9ucyBhZnRlciB0aGUKLXBvaW50IGF0IHdoaWNoIGl0IG9jY3VycyBpbiB0aGUgc2VjdGlvbiBkZWZpbml0aW9uOyBieSBpbmNsdWRpbmcgbW9yZQotdGhhbiBvbmUgQGNvZGV7RklMTH0gc3RhdGVtZW50LCB5b3UgY2FuIGhhdmUgZGlmZmVyZW50IGZpbGwgcGF0dGVybnMgaW4KLWRpZmZlcmVudCBwYXJ0cyBvZiBhbiBvdXRwdXQgc2VjdGlvbi4KLQotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBmaWxsIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5IHdpdGggdGhlCi12YWx1ZSBAc2FtcHsweDkwOTB9OgotQHNtYWxsZXhhbXBsZQotRklMTCgweDkwOTApCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQGNvZGV7RklMTH0gY29tbWFuZCBpcyBzaW1pbGFyIHRvIHRoZSBAc2FtcHs9QHZhcntmaWxsZXhwfX0gb3V0cHV0Ci1zZWN0aW9uIGF0dHJpYnV0ZSAoQHB4cmVme091dHB1dCBTZWN0aW9uIEZpbGx9KSwgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUKLXBhcnQgb2YgdGhlIHNlY3Rpb24gZm9sbG93aW5nIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kLCByYXRoZXIgdGhhbiB0aGUKLWVudGlyZSBzZWN0aW9uLiAgSWYgYm90aCBhcmUgdXNlZCwgdGhlIEBjb2Rle0ZJTEx9IGNvbW1hbmQgdGFrZXMKLXByZWNlZGVuY2UuCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIEtleXdvcmRzCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBrZXl3b3JkcwotVGhlcmUgYXJlIGEgY291cGxlIG9mIGtleXdvcmRzIHdoaWNoIGNhbiBhcHBlYXIgYXMgb3V0cHV0IHNlY3Rpb24KLWNvbW1hbmRzLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi1AY2luZGV4IGlucHV0IGZpbGVuYW1lIHN5bWJvbHMKLUBjaW5kZXggZmlsZW5hbWUgc3ltYm9scwotQGl0ZW0gQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi1UaGUgY29tbWFuZCB0ZWxscyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHN5bWJvbCBmb3IgZWFjaCBpbnB1dCBmaWxlLgotVGhlIG5hbWUgb2YgZWFjaCBzeW1ib2wgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dAotZmlsZS4gIFRoZSBzZWN0aW9uIG9mIGVhY2ggc3ltYm9sIHdpbGwgYmUgdGhlIG91dHB1dCBzZWN0aW9uIGluIHdoaWNoCi10aGUgQGNvZGV7Q1JFQVRFX09CSkVDVF9TWU1CT0xTfSBjb21tYW5kIGFwcGVhcnMuCi0KLVRoaXMgaXMgY29udmVudGlvbmFsIGZvciB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgSXQgaXMgbm90Ci1ub3JtYWxseSB1c2VkIGZvciBhbnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi1Aa2luZGV4IENPTlNUUlVDVE9SUwotQGNpbmRleCBDKysgY29uc3RydWN0b3JzLCBhcnJhbmdpbmcgaW4gbGluawotQGNpbmRleCBjb25zdHJ1Y3RvcnMsIGFycmFuZ2luZyBpbiBsaW5rCi1AaXRlbSBDT05TVFJVQ1RPUlMKLVdoZW4gbGlua2luZyB1c2luZyB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LCB0aGUgbGlua2VyIHVzZXMgYW4KLXVudXN1YWwgc2V0IGNvbnN0cnVjdCB0byBzdXBwb3J0IEMrKyBnbG9iYWwgY29uc3RydWN0b3JzIGFuZAotZGVzdHJ1Y3RvcnMuICBXaGVuIGxpbmtpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3Qgc3VwcG9ydAotYXJiaXRyYXJ5IHNlY3Rpb25zLCBzdWNoIGFzIEVDT0ZGIGFuZCBYQ09GRiwgdGhlIGxpbmtlciB3aWxsCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZS4KLUZvciB0aGVzZSBvYmplY3QgZmlsZSBmb3JtYXRzLCB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfSBjb21tYW5kIHRlbGxzIHRoZQotbGlua2VyIHRvIHBsYWNlIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB3aGVyZSB0aGUKLUBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBhcHBlYXJzLiAgVGhlIEBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBpcwotaWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotVGhlIHN5bWJvbCBAd3tAY29kZXtfX0NUT1JfTElTVF9ffX0gbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwKLWNvbnN0cnVjdG9ycywgYW5kIHRoZSBzeW1ib2wgQHd7QGNvZGV7X19EVE9SX0xJU1R9fSBtYXJrcyB0aGUgZW5kLiAgVGhlCi1maXJzdCB3b3JkIGluIHRoZSBsaXN0IGlzIHRoZSBudW1iZXIgb2YgZW50cmllcywgZm9sbG93ZWQgYnkgdGhlIGFkZHJlc3MKLW9mIGVhY2ggY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciwgZm9sbG93ZWQgYnkgYSB6ZXJvIHdvcmQuICBUaGUKLWNvbXBpbGVyIG11c3QgYXJyYW5nZSB0byBhY3R1YWxseSBydW4gdGhlIGNvZGUuICBGb3IgdGhlc2Ugb2JqZWN0IGZpbGUKLWZvcm1hdHMgQHNje2dudX0gQysrIG5vcm1hbGx5IGNhbGxzIGNvbnN0cnVjdG9ycyBmcm9tIGEgc3Vicm91dGluZQotQGNvZGV7X19tYWlufTsgYSBjYWxsIHRvIEBjb2Rle19fbWFpbn0gaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbnRvCi10aGUgc3RhcnR1cCBjb2RlIGZvciBAY29kZXttYWlufS4gIEBzY3tnbnV9IEMrKyBub3JtYWxseSBydW5zCi1kZXN0cnVjdG9ycyBlaXRoZXIgYnkgdXNpbmcgQGNvZGV7YXRleGl0fSwgb3IgZGlyZWN0bHkgZnJvbSB0aGUgZnVuY3Rpb24KLUBjb2Rle2V4aXR9LgotCi1Gb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBzdWNoIGFzIEBjb2Rle0NPRkZ9IG9yIEBjb2Rle0VMRn0gd2hpY2ggc3VwcG9ydAotYXJiaXRyYXJ5IHNlY3Rpb24gbmFtZXMsIEBzY3tnbnV9IEMrKyB3aWxsIG5vcm1hbGx5IGFycmFuZ2UgdG8gcHV0IHRoZQotYWRkcmVzc2VzIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGludG8gdGhlIEBjb2Rley5jdG9yc30KLWFuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLiAgUGxhY2luZyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGludG8geW91cgotbGlua2VyIHNjcmlwdCB3aWxsIGJ1aWxkIHRoZSBzb3J0IG9mIHRhYmxlIHdoaWNoIHRoZSBAc2N7Z251fSBDKysKLXJ1bnRpbWUgY29kZSBleHBlY3RzIHRvIHNlZS4KLQotQHNtYWxsZXhhbXBsZQotICAgICAgX19DVE9SX0xJU1RfXyA9IC47Ci0gICAgICBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKQotICAgICAgKiguY3RvcnMpCi0gICAgICBMT05HKDApCi0gICAgICBfX0NUT1JfRU5EX18gPSAuOwotICAgICAgX19EVE9SX0xJU1RfXyA9IC47Ci0gICAgICBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKQotICAgICAgKiguZHRvcnMpCi0gICAgICBMT05HKDApCi0gICAgICBfX0RUT1JfRU5EX18gPSAuOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IGFyZSB1c2luZyB0aGUgQHNje2dudX0gQysrIHN1cHBvcnQgZm9yIGluaXRpYWxpemF0aW9uIHByaW9yaXR5LAotd2hpY2ggcHJvdmlkZXMgc29tZSBjb250cm9sIG92ZXIgdGhlIG9yZGVyIGluIHdoaWNoIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLWFyZSBydW4sIHlvdSBtdXN0IHNvcnQgdGhlIGNvbnN0cnVjdG9ycyBhdCBsaW5rIHRpbWUgdG8gZW5zdXJlIHRoYXQgdGhleQotYXJlIGV4ZWN1dGVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgV2hlbiB1c2luZyB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfQotY29tbWFuZCwgdXNlIEBzYW1we1NPUlQoQ09OU1RSVUNUT1JTKX0gaW5zdGVhZC4gIFdoZW4gdXNpbmcgdGhlCi1AY29kZXsuY3RvcnN9IGFuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLCB1c2UgQHNhbXB7KihTT1JUKC5jdG9ycykpfSBhbmQKLUBzYW1weyooU09SVCguZHRvcnMpKX0gaW5zdGVhZCBvZiBqdXN0IEBzYW1weyooLmN0b3JzKX0gYW5kCi1Ac2FtcHsqKC5kdG9ycyl9LgotCi1Ob3JtYWxseSB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciB3aWxsIGhhbmRsZSB0aGVzZSBpc3N1ZXMgYXV0b21hdGljYWxseSwKLWFuZCB5b3Ugd2lsbCBub3QgbmVlZCB0byBjb25jZXJuIHlvdXJzZWxmIHdpdGggdGhlbS4gIEhvd2V2ZXIsIHlvdSBtYXkKLW5lZWQgdG8gY29uc2lkZXIgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgd3JpdGluZyB5b3VyIG93biBsaW5rZXIKLXNjcmlwdHMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGlzY2FyZGluZwotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGlzY2FyZGluZwotQGNpbmRleCBkaXNjYXJkaW5nIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zLCBkaXNjYXJkaW5nCi1AY2luZGV4IHJlbW92aW5nIHNlY3Rpb25zCi1UaGUgbGlua2VyIHdpbGwgbm90IGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiB3aGljaCBkbyBub3QgaGF2ZSBhbnkKLWNvbnRlbnRzLiAgVGhpcyBpcyBmb3IgY29udmVuaWVuY2Ugd2hlbiByZWZlcnJpbmcgdG8gaW5wdXQgc2VjdGlvbnMgdGhhdAotbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudCBpbiBhbnkgb2YgdGhlIGlucHV0IGZpbGVzLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0uZm9vIEB7ICooLmZvbykgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdpbGwgb25seSBjcmVhdGUgYSBAc2FtcHsuZm9vfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSBpZiB0aGVyZSBpcyBhCi1Ac2FtcHsuZm9vfSBzZWN0aW9uIGluIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlLgotCi1JZiB5b3UgdXNlIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBhcyBhbiBvdXRwdXQKLXNlY3Rpb24gY29tbWFuZCwgc3VjaCBhcyBhIHN5bWJvbCBhc3NpZ25tZW50LCB0aGVuIHRoZSBvdXRwdXQgc2VjdGlvbgotd2lsbCBhbHdheXMgYmUgY3JlYXRlZCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgaW5wdXQgc2VjdGlvbnMuCi0KLUBjaW5kZXggL0RJU0NBUkQvCi1UaGUgc3BlY2lhbCBvdXRwdXQgc2VjdGlvbiBuYW1lIEBzYW1wey9ESVNDQVJEL30gbWF5IGJlIHVzZWQgdG8gZGlzY2FyZAotaW5wdXQgc2VjdGlvbnMuICBBbnkgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGFuIG91dHB1dAotc2VjdGlvbiBuYW1lZCBAc2FtcHsvRElTQ0FSRC99IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBBdHRyaWJ1dGVzCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGVzCi1AY2luZGV4IG91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZXMKLVdlIHNob3dlZCBhYm92ZSB0aGF0IHRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGFuIG91dHB1dCBzZWN0aW9uIGxvb2tlZAotbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwIAotQHZhcntzZWN0aW9ufSBbQHZhcnthZGRyZXNzfV0gWyhAdmFye3R5cGV9KV0gOiBbQVQoQHZhcntsbWF9KV0KLSAgQHsKLSAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgIEBkb3Rze30KLSAgQH0gWz5AdmFye3JlZ2lvbn1dIFtBVD5AdmFye2xtYV9yZWdpb259XSBbOkB2YXJ7cGhkcn0gOkB2YXJ7cGhkcn0gQGRvdHN7fV0gWz1AdmFye2ZpbGxleHB9XQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLVdlJ3ZlIGFscmVhZHkgZGVzY3JpYmVkIEB2YXJ7c2VjdGlvbn0sIEB2YXJ7YWRkcmVzc30sIGFuZAotQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfS4gIEluIHRoaXMgc2VjdGlvbiB3ZSB3aWxsIGRlc2NyaWJlIHRoZQotcmVtYWluaW5nIHNlY3Rpb24gYXR0cmlidXRlcy4KLQotQG1lbnUgCi0qIE91dHB1dCBTZWN0aW9uIFR5cGU6OgkJT3V0cHV0IHNlY3Rpb24gdHlwZQotKiBPdXRwdXQgU2VjdGlvbiBMTUE6OgkJT3V0cHV0IHNlY3Rpb24gTE1BCi0qIE91dHB1dCBTZWN0aW9uIFJlZ2lvbjo6CU91dHB1dCBzZWN0aW9uIHJlZ2lvbgotKiBPdXRwdXQgU2VjdGlvbiBQaGRyOjoJCU91dHB1dCBzZWN0aW9uIHBoZHIKLSogT3V0cHV0IFNlY3Rpb24gRmlsbDo6CQlPdXRwdXQgc2VjdGlvbiBmaWxsCi1AZW5kIG1lbnUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gVHlwZQotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gdHlwZQotRWFjaCBvdXRwdXQgc2VjdGlvbiBtYXkgaGF2ZSBhIHR5cGUuICBUaGUgdHlwZSBpcyBhIGtleXdvcmQgaW4KLXBhcmVudGhlc2VzLiAgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgZGVmaW5lZDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBOT0xPQUQKLVRoZSBzZWN0aW9uIHNob3VsZCBiZSBtYXJrZWQgYXMgbm90IGxvYWRhYmxlLCBzbyB0aGF0IGl0IHdpbGwgbm90IGJlCi1sb2FkZWQgaW50byBtZW1vcnkgd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4uCi1AaXRlbSBEU0VDVAotQGl0ZW14IENPUFkKLUBpdGVteCBJTkZPCi1AaXRlbXggT1ZFUkxBWQotVGhlc2UgdHlwZSBuYW1lcyBhcmUgc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBhbmQgYXJlCi1yYXJlbHkgdXNlZC4gIFRoZXkgYWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0OiB0aGUgc2VjdGlvbiBzaG91bGQgYmUKLW1hcmtlZCBhcyBub3QgYWxsb2NhdGFibGUsIHNvIHRoYXQgbm8gbWVtb3J5IGlzIGFsbG9jYXRlZCBmb3IgdGhlCi1zZWN0aW9uIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLgotQGVuZCB0YWJsZQotCi1Aa2luZGV4IE5PTE9BRAotQGNpbmRleCBwcmV2ZW50IHVubmVjZXNzYXJ5IGxvYWRpbmcKLUBjaW5kZXggbG9hZGluZywgcHJldmVudGluZwotVGhlIGxpbmtlciBub3JtYWxseSBzZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG91dHB1dCBzZWN0aW9uIGJhc2VkIG9uCi10aGUgaW5wdXQgc2VjdGlvbnMgd2hpY2ggbWFwIGludG8gaXQuICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcKLXRoZSBzZWN0aW9uIHR5cGUuICBGb3IgZXhhbXBsZSwgaW4gdGhlIHNjcmlwdCBzYW1wbGUgYmVsb3csIHRoZQotQHNhbXB7Uk9NfSBzZWN0aW9uIGlzIGFkZHJlc3NlZCBhdCBtZW1vcnkgbG9jYXRpb24gQHNhbXB7MH0gYW5kIGRvZXMgbm90Ci1uZWVkIHRvIGJlIGxvYWRlZCB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bi4gIFRoZSBjb250ZW50cyBvZiB0aGUKLUBzYW1we1JPTX0gc2VjdGlvbiB3aWxsIGFwcGVhciBpbiB0aGUgbGlua2VyIG91dHB1dCBmaWxlIGFzIHVzdWFsLgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAewotICBST00gMCAoTk9MT0FEKSA6IEB7IEBkb3Rze30gQH0KLSAgQGRvdHN7fQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIExNQQotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gTE1BCi1Aa2luZGV4IEFUPkB2YXJ7bG1hX3JlZ2lvbn0KLUBraW5kZXggQVQoQHZhcntsbWF9KQotQGNpbmRleCBsb2FkIGFkZHJlc3MKLUBjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MKLUV2ZXJ5IHNlY3Rpb24gaGFzIGEgdmlydHVhbCBhZGRyZXNzIChWTUEpIGFuZCBhIGxvYWQgYWRkcmVzcyAoTE1BKTsgc2VlCi1AcmVme0Jhc2ljIFNjcmlwdCBDb25jZXB0c30uICBUaGUgYWRkcmVzcyBleHByZXNzaW9uIHdoaWNoIG1heSBhcHBlYXIgaW4KLWFuIG91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIHNldHMgdGhlIFZNQSAoQHB4cmVme091dHB1dCBTZWN0aW9uCi1BZGRyZXNzfSkuCi0KLVRoZSBsaW5rZXIgd2lsbCBub3JtYWxseSBzZXQgdGhlIExNQSBlcXVhbCB0byB0aGUgVk1BLiAgWW91IGNhbiBjaGFuZ2UKLXRoYXQgYnkgdXNpbmcgdGhlIEBjb2Rle0FUfSBrZXl3b3JkLiAgVGhlIGV4cHJlc3Npb24gQHZhcntsbWF9IHRoYXQKLWZvbGxvd3MgdGhlIEBjb2Rle0FUfSBrZXl3b3JkIHNwZWNpZmllcyB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZQotc2VjdGlvbi4gIEFsdGVybmF0aXZlbHksIHdpdGggQHNhbXB7QVQ+QHZhcntsbWFfcmVnaW9ufX0gZXhwcmVzc2lvbiwKLXlvdSBtYXkgc3BlY2lmeSBhIG1lbW9yeSByZWdpb24gZm9yIHRoZSBzZWN0aW9uJ3MgbG9hZCBhZGRyZXNzLiBAeHJlZntNRU1PUll9LgotCi1AY2luZGV4IFJPTSBpbml0aWFsaXplZCBkYXRhCi1AY2luZGV4IGluaXRpYWxpemVkIGRhdGEgaW4gUk9NCi1UaGlzIGZlYXR1cmUgaXMgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGJ1aWxkIGEgUk9NIGltYWdlLiAgRm9yCi1leGFtcGxlLCB0aGUgZm9sbG93aW5nIGxpbmtlciBzY3JpcHQgY3JlYXRlcyB0aHJlZSBvdXRwdXQgc2VjdGlvbnM6IG9uZQotY2FsbGVkIEBzYW1wey50ZXh0fSwgd2hpY2ggc3RhcnRzIGF0IEBjb2RlezB4MTAwMH0sIG9uZSBjYWxsZWQKLUBzYW1wey5tZGF0YX0sIHdoaWNoIGlzIGxvYWRlZCBhdCB0aGUgZW5kIG9mIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbgotZXZlbiB0aG91Z2ggaXRzIFZNQSBpcyBAY29kZXsweDIwMDB9LCBhbmQgb25lIGNhbGxlZCBAc2FtcHsuYnNzfSB0byBob2xkCi11bmluaXRpYWxpemVkIGRhdGEgYXQgYWRkcmVzcyBAY29kZXsweDMwMDB9LiAgVGhlIHN5bWJvbCBAY29kZXtfZGF0YX0gaXMKLWRlZmluZWQgd2l0aCB0aGUgdmFsdWUgQGNvZGV7MHgyMDAwfSwgd2hpY2ggc2hvd3MgdGhhdCB0aGUgbG9jYXRpb24KLWNvdW50ZXIgaG9sZHMgdGhlIFZNQSB2YWx1ZSwgbm90IHRoZSBMTUEgdmFsdWUuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMKLSAgQHsKLSAgLnRleHQgMHgxMDAwIDogQHsgKigudGV4dCkgX2V0ZXh0ID0gLiA7IEB9Ci0gIC5tZGF0YSAweDIwMDAgOiAKLSAgICBBVCAoIEFERFIgKC50ZXh0KSArIFNJWkVPRiAoLnRleHQpICkKLSAgICBAeyBfZGF0YSA9IC4gOyAqKC5kYXRhKTsgX2VkYXRhID0gLiA7ICBAfQotICAuYnNzIDB4MzAwMCA6Ci0gICAgQHsgX2JzdGFydCA9IC4gOyAgKiguYnNzKSAqKENPTU1PTikgOyBfYmVuZCA9IC4gO0B9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHJ1bi10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHVzZSB3aXRoIGEgcHJvZ3JhbSBnZW5lcmF0ZWQgd2l0aAotdGhpcyBsaW5rZXIgc2NyaXB0IHdvdWxkIGluY2x1ZGUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgdG8gY29weQotdGhlIGluaXRpYWxpemVkIGRhdGEgZnJvbSB0aGUgUk9NIGltYWdlIHRvIGl0cyBydW50aW1lIGFkZHJlc3MuICBOb3RpY2UKLWhvdyB0aGlzIGNvZGUgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlIGxpbmtlcgotc2NyaXB0LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWV4dGVybiBjaGFyIF9ldGV4dCwgX2RhdGEsIF9lZGF0YSwgX2JzdGFydCwgX2JlbmQ7Ci1jaGFyICpzcmMgPSAmX2V0ZXh0OwotY2hhciAqZHN0ID0gJl9kYXRhOwotCi0vKiBST00gaGFzIGRhdGEgYXQgZW5kIG9mIHRleHQ7IGNvcHkgaXQuICovCi13aGlsZSAoZHN0IDwgJl9lZGF0YSkgQHsKLSAgKmRzdCsrID0gKnNyYysrOwotQH0KLQotLyogWmVybyBic3MgKi8KLWZvciAoZHN0ID0gJl9ic3RhcnQ7IGRzdDwgJl9iZW5kOyBkc3QrKykKLSAgKmRzdCA9IDA7Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBSZWdpb24KLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHJlZ2lvbgotQGtpbmRleCA+QHZhcntyZWdpb259Ci1AY2luZGV4IHNlY3Rpb24sIGFzc2lnbmluZyB0byBtZW1vcnkgcmVnaW9uCi1AY2luZGV4IG1lbW9yeSByZWdpb25zIGFuZCBzZWN0aW9ucwotWW91IGNhbiBhc3NpZ24gYSBzZWN0aW9uIHRvIGEgcHJldmlvdXNseSBkZWZpbmVkIHJlZ2lvbiBvZiBtZW1vcnkgYnkKLXVzaW5nIEBzYW1wez5AdmFye3JlZ2lvbn19LiAgQHhyZWZ7TUVNT1JZfS4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgQHsgcm9tIDogT1JJR0lOID0gMHgxMDAwLCBMRU5HVEggPSAweDEwMDAgQH0KLVNFQ1RJT05TIEB7IFJPTSA6IEB7ICooLnRleHQpIEB9ID5yb20gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIFBoZHIKLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHBoZHIKLUBraW5kZXggOkB2YXJ7cGhkcn0KLUBjaW5kZXggc2VjdGlvbiwgYXNzaWduaW5nIHRvIHByb2dyYW0gaGVhZGVyCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycyBhbmQgc2VjdGlvbnMKLVlvdSBjYW4gYXNzaWduIGEgc2VjdGlvbiB0byBhIHByZXZpb3VzbHkgZGVmaW5lZCBwcm9ncmFtIHNlZ21lbnQgYnkKLXVzaW5nIEBzYW1wezpAdmFye3BoZHJ9fS4gIEB4cmVme1BIRFJTfS4gIElmIGEgc2VjdGlvbiBpcyBhc3NpZ25lZCB0bwotb25lIG9yIG1vcmUgc2VnbWVudHMsIHRoZW4gYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGVkIHNlY3Rpb25zIHdpbGwgYmUKLWFzc2lnbmVkIHRvIHRob3NlIHNlZ21lbnRzIGFzIHdlbGwsIHVubGVzcyB0aGV5IHVzZSBhbiBleHBsaWNpdGx5Ci1AY29kZXs6QHZhcntwaGRyfX0gbW9kaWZpZXIuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gdGVsbCB0aGUKLWxpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueSBzZWdtZW50IGF0IGFsbC4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1QSERSUyBAeyB0ZXh0IFBUX0xPQUQgOyBAfQotU0VDVElPTlMgQHsgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dCBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRmlsbAotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZmlsbAotQGtpbmRleCA9QHZhcntmaWxsZXhwfQotQGNpbmRleCBzZWN0aW9uIGZpbGwgcGF0dGVybgotQGNpbmRleCBmaWxsIHBhdHRlcm4sIGVudGlyZSBzZWN0aW9uCi1Zb3UgY2FuIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciBhbiBlbnRpcmUgc2VjdGlvbiBieSB1c2luZwotQHNhbXB7PUB2YXJ7ZmlsbGV4cH19LiAgQHZhcntmaWxsZXhwfSBpcyBhbiBleHByZXNzaW9uCi0oQHB4cmVme0V4cHJlc3Npb25zfSkuICBBbnkgb3RoZXJ3aXNlIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5Ci13aXRoaW4gdGhlIG91dHB1dCBzZWN0aW9uIChmb3IgZXhhbXBsZSwgZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQKLWFsaWdubWVudCBvZiBpbnB1dCBzZWN0aW9ucykgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvIGxlYXN0Ci1zaWduaWZpY2FudCBieXRlcyBvZiB0aGUgdmFsdWUsIHJlcGVhdGVkIGFzIG5lY2Vzc2FyeS4KLQotWW91IGNhbiBhbHNvIGNoYW5nZSB0aGUgZmlsbCB2YWx1ZSB3aXRoIGEgQGNvZGV7RklMTH0gY29tbWFuZCBpbiB0aGUKLW91dHB1dCBzZWN0aW9uIGNvbW1hbmRzOyBzZWUgQHJlZntPdXRwdXQgU2VjdGlvbiBEYXRhfS4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAeyAudGV4dCA6IEB7ICooLnRleHQpIEB9ID0weDkwOTAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE92ZXJsYXkgRGVzY3JpcHRpb24KLUBzdWJzZWN0aW9uIE92ZXJsYXkgZGVzY3JpcHRpb24KLUBraW5kZXggT1ZFUkxBWQotQGNpbmRleCBvdmVybGF5cwotQW4gb3ZlcmxheSBkZXNjcmlwdGlvbiBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBkZXNjcmliZSBzZWN0aW9ucyB3aGljaAotYXJlIHRvIGJlIGxvYWRlZCBhcyBwYXJ0IG9mIGEgc2luZ2xlIG1lbW9yeSBpbWFnZSBidXQgYXJlIHRvIGJlIHJ1biBhdAotdGhlIHNhbWUgbWVtb3J5IGFkZHJlc3MuICBBdCBydW4gdGltZSwgc29tZSBzb3J0IG9mIG92ZXJsYXkgbWFuYWdlciB3aWxsCi1jb3B5IHRoZSBvdmVybGFpZCBzZWN0aW9ucyBpbiBhbmQgb3V0IG9mIHRoZSBydW50aW1lIG1lbW9yeSBhZGRyZXNzIGFzCi1yZXF1aXJlZCwgcGVyaGFwcyBieSBzaW1wbHkgbWFuaXB1bGF0aW5nIGFkZHJlc3NpbmcgYml0cy4gIFRoaXMgYXBwcm9hY2gKLWNhbiBiZSB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIGEgY2VydGFpbiByZWdpb24gb2YgbWVtb3J5IGlzIGZhc3RlcgotdGhhbiBhbm90aGVyLgotCi1PdmVybGF5cyBhcmUgZGVzY3JpYmVkIHVzaW5nIHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kLiAgVGhlCi1AY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIHVzZWQgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQsIGxpa2UgYW4KLW91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uLiAgVGhlIGZ1bGwgc3ludGF4IG9mIHRoZSBAY29kZXtPVkVSTEFZfQotY29tbWFuZCBpcyBhcyBmb2xsb3dzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1PVkVSTEFZIFtAdmFye3N0YXJ0fV0gOiBbTk9DUk9TU1JFRlNdIFtBVCAoIEB2YXJ7bGRhZGRyfSApXQotICBAewotICAgIEB2YXJ7c2VjbmFtZTF9Ci0gICAgICBAewotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQGRvdHN7fQotICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQotICAgIEB2YXJ7c2VjbmFtZTJ9Ci0gICAgICBAewotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQGRvdHN7fQotICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQotICAgIEBkb3Rze30KLSAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfUBkb3Rze31dIFs9QHZhcntmaWxsfV0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUV2ZXJ5dGhpbmcgaXMgb3B0aW9uYWwgZXhjZXB0IEBjb2Rle09WRVJMQVl9IChhIGtleXdvcmQpLCBhbmQgZWFjaAotc2VjdGlvbiBtdXN0IGhhdmUgYSBuYW1lIChAdmFye3NlY25hbWUxfSBhbmQgQHZhcntzZWNuYW1lMn0gYWJvdmUpLiAgVGhlCi1zZWN0aW9uIGRlZmluaXRpb25zIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0gY29uc3RydWN0IGFyZSBpZGVudGljYWwgdG8KLXRob3NlIHdpdGhpbiB0aGUgZ2VuZXJhbCBAY29kZXtTRUNUSU9OU30gY29udHJ1Y3QgKEBweHJlZntTRUNUSU9OU30pLAotZXhjZXB0IHRoYXQgbm8gYWRkcmVzc2VzIGFuZCBubyBtZW1vcnkgcmVnaW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IKLXNlY3Rpb25zIHdpdGhpbiBhbiBAY29kZXtPVkVSTEFZfS4KLQotVGhlIHNlY3Rpb25zIGFyZSBhbGwgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIHN0YXJ0aW5nIGFkZHJlc3MuICBUaGUgbG9hZAotYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyBhcmUgYXJyYW5nZWQgc3VjaCB0aGF0IHRoZXkgYXJlIGNvbnNlY3V0aXZlIGluCi1tZW1vcnkgc3RhcnRpbmcgYXQgdGhlIGxvYWQgYWRkcmVzcyB1c2VkIGZvciB0aGUgQGNvZGV7T1ZFUkxBWX0gYXMgYQotd2hvbGUgKGFzIHdpdGggbm9ybWFsIHNlY3Rpb24gZGVmaW5pdGlvbnMsIHRoZSBsb2FkIGFkZHJlc3MgaXMgb3B0aW9uYWwsCi1hbmQgZGVmYXVsdHMgdG8gdGhlIHN0YXJ0IGFkZHJlc3M7IHRoZSBzdGFydCBhZGRyZXNzIGlzIGFsc28gb3B0aW9uYWwsCi1hbmQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIpLgotCi1JZiB0aGUgQGNvZGV7Tk9DUk9TU1JFRlN9IGtleXdvcmQgaXMgdXNlZCwgYW5kIHRoZXJlIGFueSByZWZlcmVuY2VzCi1hbW9uZyB0aGUgc2VjdGlvbnMsIHRoZSBsaW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuICBTaW5jZSB0aGUgc2VjdGlvbnMKLWFsbCBydW4gYXQgdGhlIHNhbWUgYWRkcmVzcywgaXQgbm9ybWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3Igb25lCi1zZWN0aW9uIHRvIHJlZmVyIGRpcmVjdGx5IHRvIGFub3RoZXIuICBAeHJlZntNaXNjZWxsYW5lb3VzIENvbW1hbmRzLAotTk9DUk9TU1JFRlN9LgotCi1Gb3IgZWFjaCBzZWN0aW9uIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0sIHRoZSBsaW5rZXIgYXV0b21hdGljYWxseQotZGVmaW5lcyB0d28gc3ltYm9scy4gIFRoZSBzeW1ib2wgQGNvZGV7X19sb2FkX3N0YXJ0X0B2YXJ7c2VjbmFtZX19IGlzCi1kZWZpbmVkIGFzIHRoZSBzdGFydGluZyBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24uICBUaGUgc3ltYm9sCi1AY29kZXtfX2xvYWRfc3RvcF9AdmFye3NlY25hbWV9fSBpcyBkZWZpbmVkIGFzIHRoZSBmaW5hbCBsb2FkIGFkZHJlc3Mgb2YKLXRoZSBzZWN0aW9uLiAgQW55IGNoYXJhY3RlcnMgd2l0aGluIEB2YXJ7c2VjbmFtZX0gd2hpY2ggYXJlIG5vdCBsZWdhbAotd2l0aGluIEMgaWRlbnRpZmllcnMgYXJlIHJlbW92ZWQuICBDIChvciBhc3NlbWJsZXIpIGNvZGUgbWF5IHVzZSB0aGVzZQotc3ltYm9scyB0byBtb3ZlIHRoZSBvdmVybGFpZCBzZWN0aW9ucyBhcm91bmQgYXMgbmVjZXNzYXJ5LgotCi1BdCB0aGUgZW5kIG9mIHRoZSBvdmVybGF5LCB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgc2V0IHRvCi10aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgb3ZlcmxheSBwbHVzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IHNlY3Rpb24uCi0KLUhlcmUgaXMgYW4gZXhhbXBsZS4gIFJlbWVtYmVyIHRoYXQgdGhpcyB3b3VsZCBhcHBlYXIgaW5zaWRlIGEKLUBjb2Rle1NFQ1RJT05TfSBjb25zdHJ1Y3QuCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLSAgT1ZFUkxBWSAweDEwMDAgOiBBVCAoMHg0MDAwKQotICAgQHsKLSAgICAgLnRleHQwIEB7IG8xLyoubygudGV4dCkgQH0KLSAgICAgLnRleHQxIEB7IG8yLyoubygudGV4dCkgQH0KLSAgIEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHdpbGwgZGVmaW5lIGJvdGggQHNhbXB7LnRleHQwfSBhbmQgQHNhbXB7LnRleHQxfSB0byBzdGFydCBhdAotYWRkcmVzcyAweDEwMDAuICBAc2FtcHsudGV4dDB9IHdpbGwgYmUgbG9hZGVkIGF0IGFkZHJlc3MgMHg0MDAwLCBhbmQKLUBzYW1wey50ZXh0MX0gd2lsbCBiZSBsb2FkZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgQHNhbXB7LnRleHQwfS4gIFRoZQotZm9sbG93aW5nIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkOiBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDB9LAotQGNvZGV7X19sb2FkX3N0b3BfdGV4dDB9LCBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDF9LAotQGNvZGV7X19sb2FkX3N0b3BfdGV4dDF9LgotCi1DIGNvZGUgdG8gY29weSBvdmVybGF5IEBjb2Rley50ZXh0MX0gaW50byB0aGUgb3ZlcmxheSBhcmVhIG1pZ2h0IGxvb2sKLWxpa2UgdGhlIGZvbGxvd2luZy4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi0gIGV4dGVybiBjaGFyIF9fbG9hZF9zdGFydF90ZXh0MSwgX19sb2FkX3N0b3BfdGV4dDE7Ci0gIG1lbWNweSAoKGNoYXIgKikgMHgxMDAwLCAmX19sb2FkX3N0YXJ0X3RleHQxLAotICAgICAgICAgICZfX2xvYWRfc3RvcF90ZXh0MSAtICZfX2xvYWRfc3RhcnRfdGV4dDEpOwotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm90ZSB0aGF0IHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIGp1c3Qgc3ludGFjdGljIHN1Z2FyLCBzaW5jZQotZXZlcnl0aGluZyBpdCBkb2VzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBtb3JlIGJhc2ljIGNvbW1hbmRzLiAgVGhlIGFib3ZlCi1leGFtcGxlIGNvdWxkIGhhdmUgYmVlbiB3cml0dGVuIGlkZW50aWNhbGx5IGFzIGZvbGxvd3MuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotICAudGV4dDAgMHgxMDAwIDogQVQgKDB4NDAwMCkgQHsgbzEvKi5vKC50ZXh0KSBAfQotICBfX2xvYWRfc3RhcnRfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKTsKLSAgX19sb2FkX3N0b3BfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKSArIFNJWkVPRiAoLnRleHQwKTsKLSAgLnRleHQxIDB4MTAwMCA6IEFUICgweDQwMDAgKyBTSVpFT0YgKC50ZXh0MCkpIEB7IG8yLyoubygudGV4dCkgQH0KLSAgX19sb2FkX3N0YXJ0X3RleHQxID0gTE9BREFERFIgKC50ZXh0MSk7Ci0gIF9fbG9hZF9zdG9wX3RleHQxID0gTE9BREFERFIgKC50ZXh0MSkgKyBTSVpFT0YgKC50ZXh0MSk7Ci0gIC4gPSAweDEwMDAgKyBNQVggKFNJWkVPRiAoLnRleHQwKSwgU0laRU9GICgudGV4dDEpKTsKLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE1FTU9SWQotQHNlY3Rpb24gTUVNT1JZIGNvbW1hbmQKLUBraW5kZXggTUVNT1JZCi1AY2luZGV4IG1lbW9yeSByZWdpb25zCi1AY2luZGV4IHJlZ2lvbnMgb2YgbWVtb3J5Ci1AY2luZGV4IGFsbG9jYXRpbmcgbWVtb3J5Ci1AY2luZGV4IGRpc2NvbnRpbnVvdXMgbWVtb3J5Ci1UaGUgbGlua2VyJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBlcm1pdHMgYWxsb2NhdGlvbiBvZiBhbGwgYXZhaWxhYmxlCi1tZW1vcnkuICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgdGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZC4KLQotVGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZCBkZXNjcmliZXMgdGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIGJsb2NrcyBvZgotbWVtb3J5IGluIHRoZSB0YXJnZXQuICBZb3UgY2FuIHVzZSBpdCB0byBkZXNjcmliZSB3aGljaCBtZW1vcnkgcmVnaW9ucwotbWF5IGJlIHVzZWQgYnkgdGhlIGxpbmtlciwgYW5kIHdoaWNoIG1lbW9yeSByZWdpb25zIGl0IG11c3QgYXZvaWQuICBZb3UKLWNhbiB0aGVuIGFzc2lnbiBzZWN0aW9ucyB0byBwYXJ0aWN1bGFyIG1lbW9yeSByZWdpb25zLiAgVGhlIGxpbmtlciB3aWxsCi1zZXQgc2VjdGlvbiBhZGRyZXNzZXMgYmFzZWQgb24gdGhlIG1lbW9yeSByZWdpb25zLCBhbmQgd2lsbCB3YXJuIGFib3V0Ci1yZWdpb25zIHRoYXQgYmVjb21lIHRvbyBmdWxsLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzaHVmZmxlIHNlY3Rpb25zCi1hcm91bmQgdG8gZml0IGludG8gdGhlIGF2YWlsYWJsZSByZWdpb25zLgotCi1BIGxpbmtlciBzY3JpcHQgbWF5IGNvbnRhaW4gYXQgbW9zdCBvbmUgdXNlIG9mIHRoZSBAY29kZXtNRU1PUll9Ci1jb21tYW5kLiAgSG93ZXZlciwgeW91IGNhbiBkZWZpbmUgYXMgbWFueSBibG9ja3Mgb2YgbWVtb3J5IHdpdGhpbiBpdCBhcwoteW91IHdpc2guICBUaGUgc3ludGF4IGlzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgCi0gIEB7Ci0gICAgQHZhcntuYW1lfSBbKEB2YXJ7YXR0cn0pXSA6IE9SSUdJTiA9IEB2YXJ7b3JpZ2lufSwgTEVOR1RIID0gQHZhcntsZW59Ci0gICAgQGRvdHN7fQotICBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEB2YXJ7bmFtZX0gaXMgYSBuYW1lIHVzZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQgdG8gcmVmZXIgdG8gdGhlCi1yZWdpb24uICBUaGUgcmVnaW9uIG5hbWUgaGFzIG5vIG1lYW5pbmcgb3V0c2lkZSBvZiB0aGUgbGlua2VyIHNjcmlwdC4KLVJlZ2lvbiBuYW1lcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgbmFtZSBzcGFjZSwgYW5kIHdpbGwgbm90IGNvbmZsaWN0Ci13aXRoIHN5bWJvbCBuYW1lcywgZmlsZSBuYW1lcywgb3Igc2VjdGlvbiBuYW1lcy4gIEVhY2ggbWVtb3J5IHJlZ2lvbgotbXVzdCBoYXZlIGEgZGlzdGluY3QgbmFtZS4KLQotQGNpbmRleCBtZW1vcnkgcmVnaW9uIGF0dHJpYnV0ZXMKLVRoZSBAdmFye2F0dHJ9IHN0cmluZyBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzcGVjaWZ5Ci13aGV0aGVyIHRvIHVzZSBhIHBhcnRpY3VsYXIgbWVtb3J5IHJlZ2lvbiBmb3IgYW4gaW5wdXQgc2VjdGlvbiB3aGljaCBpcwotbm90IGV4cGxpY2l0bHkgbWFwcGVkIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgQXMgZGVzY3JpYmVkIGluCi1AcmVme1NFQ1RJT05TfSwgaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIG91dHB1dCBzZWN0aW9uIGZvciBzb21lIGlucHV0Ci1zZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgY3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhcwotdGhlIGlucHV0IHNlY3Rpb24uICBJZiB5b3UgZGVmaW5lIHJlZ2lvbiBhdHRyaWJ1dGVzLCB0aGUgbGlua2VyIHdpbGwgdXNlCi10aGVtIHRvIHNlbGVjdCB0aGUgbWVtb3J5IHJlZ2lvbiBmb3IgdGhlIG91dHB1dCBzZWN0aW9uIHRoYXQgaXQgY3JlYXRlcy4KLQotVGhlIEB2YXJ7YXR0cn0gc3RyaW5nIG11c3QgY29uc2lzdCBvbmx5IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLUB0YWJsZSBAc2FtcAotQGl0ZW0gUgotUmVhZC1vbmx5IHNlY3Rpb24KLUBpdGVtIFcKLVJlYWQvd3JpdGUgc2VjdGlvbgotQGl0ZW0gWAotRXhlY3V0YWJsZSBzZWN0aW9uCi1AaXRlbSBBCi1BbGxvY2F0YWJsZSBzZWN0aW9uCi1AaXRlbSBJCi1Jbml0aWFsaXplZCBzZWN0aW9uCi1AaXRlbSBMCi1TYW1lIGFzIEBzYW1we0l9Ci1AaXRlbSAhCi1JbnZlcnQgdGhlIHNlbnNlIG9mIGFueSBvZiB0aGUgcHJlY2VkaW5nIGF0dHJpYnV0ZXMKLUBlbmQgdGFibGUKLQotSWYgYSB1bm1hcHBlZCBzZWN0aW9uIG1hdGNoZXMgYW55IG9mIHRoZSBsaXN0ZWQgYXR0cmlidXRlcyBvdGhlciB0aGFuCi1Ac2FtcHshfSwgaXQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIG1lbW9yeSByZWdpb24uICBUaGUgQHNhbXB7IX0KLWF0dHJpYnV0ZSByZXZlcnNlcyB0aGlzIHRlc3QsIHNvIHRoYXQgYW4gdW5tYXBwZWQgc2VjdGlvbiB3aWxsIGJlIHBsYWNlZAotaW4gdGhlIG1lbW9yeSByZWdpb24gb25seSBpZiBpdCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIGxpc3RlZAotYXR0cmlidXRlcy4KLQotQGtpbmRleCBPUklHSU4gPQotQGtpbmRleCBvID0KLUBraW5kZXggb3JnID0KLVRoZSBAdmFye29yaWdpbn0gaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQotcmVnaW9uLiAgVGhlIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkKLWFsbG9jYXRpb24gaXMgcGVyZm9ybWVkLCB3aGljaCBtZWFucyB0aGF0IHlvdSBtYXkgbm90IHVzZSBhbnkgc2VjdGlvbgotcmVsYXRpdmUgc3ltYm9scy4gIFRoZSBrZXl3b3JkIEBjb2Rle09SSUdJTn0gbWF5IGJlIGFiYnJldmlhdGVkIHRvCi1AY29kZXtvcmd9IG9yIEBjb2Rle299IChidXQgbm90LCBmb3IgZXhhbXBsZSwgQGNvZGV7T1JHfSkuCi0KLUBraW5kZXggTEVOR1RIID0KLUBraW5kZXggbGVuID0KLUBraW5kZXggbCA9Ci1UaGUgQHZhcntsZW59IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkKLXJlZ2lvbi4gIEFzIHdpdGggdGhlIEB2YXJ7b3JpZ2lufSBleHByZXNzaW9uLCB0aGUgZXhwcmVzc2lvbiBtdXN0Ci1ldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQuICBUaGUKLWtleXdvcmQgQGNvZGV7TEVOR1RIfSBtYXkgYmUgYWJicmV2aWF0ZWQgdG8gQGNvZGV7bGVufSBvciBAY29kZXtsfS4KLQotSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB3ZSBzcGVjaWZ5IHRoYXQgdGhlcmUgYXJlIHR3byBtZW1vcnkgcmVnaW9ucwotYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uOiBvbmUgc3RhcnRpbmcgYXQgQHNhbXB7MH0gZm9yIDI1NiBraWxvYnl0ZXMsCi1hbmQgdGhlIG90aGVyIHN0YXJ0aW5nIGF0IEBzYW1wezB4NDAwMDAwMDB9IGZvciBmb3VyIG1lZ2FieXRlcy4gIFRoZQotbGlua2VyIHdpbGwgcGxhY2UgaW50byB0aGUgQHNhbXB7cm9tfSBtZW1vcnkgcmVnaW9uIGV2ZXJ5IHNlY3Rpb24gd2hpY2gKLWlzIG5vdCBleHBsaWNpdGx5IG1hcHBlZCBpbnRvIGEgbWVtb3J5IHJlZ2lvbiwgYW5kIGlzIGVpdGhlciByZWFkLW9ubHkKLW9yIGV4ZWN1dGFibGUuICBUaGUgbGlua2VyIHdpbGwgcGxhY2Ugb3RoZXIgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdAotZXhwbGljaXRseSBtYXBwZWQgaW50byBhIG1lbW9yeSByZWdpb24gaW50byB0aGUgQHNhbXB7cmFtfSBtZW1vcnkKLXJlZ2lvbi4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgCi0gIEB7Ci0gICAgcm9tIChyeCkgIDogT1JJR0lOID0gMCwgTEVOR1RIID0gMjU2SwotICAgIHJhbSAoIXJ4KSA6IG9yZyA9IDB4NDAwMDAwMDAsIGwgPSA0TQotICBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotT25jZSB5b3UgZGVmaW5lIGEgbWVtb3J5IHJlZ2lvbiwgeW91IGNhbiBkaXJlY3QgdGhlIGxpbmtlciB0byBwbGFjZQotc3BlY2lmaWMgb3V0cHV0IHNlY3Rpb25zIGludG8gdGhhdCBtZW1vcnkgcmVnaW9uIGJ5IHVzaW5nIHRoZQotQHNhbXB7PkB2YXJ7cmVnaW9ufX0gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCi1hIG1lbW9yeSByZWdpb24gbmFtZWQgQHNhbXB7bWVtfSwgeW91IHdvdWxkIHVzZSBAc2FtcHs+bWVtfSBpbiB0aGUKLW91dHB1dCBzZWN0aW9uIGRlZmluaXRpb24uICBAeHJlZntPdXRwdXQgU2VjdGlvbiBSZWdpb259LiAgSWYgbm8gYWRkcmVzcwotd2FzIHNwZWNpZmllZCBmb3IgdGhlIG91dHB1dCBzZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgc2V0IHRoZSBhZGRyZXNzIHRvCi10aGUgbmV4dCBhdmFpbGFibGUgYWRkcmVzcyB3aXRoaW4gdGhlIG1lbW9yeSByZWdpb24uICBJZiB0aGUgY29tYmluZWQKLW91dHB1dCBzZWN0aW9ucyBkaXJlY3RlZCB0byBhIG1lbW9yeSByZWdpb24gYXJlIHRvbyBsYXJnZSBmb3IgdGhlCi1yZWdpb24sIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlLgotCi1Abm9kZSBQSERSUwotQHNlY3Rpb24gUEhEUlMgQ29tbWFuZAotQGtpbmRleCBQSERSUwotQGNpbmRleCBwcm9ncmFtIGhlYWRlcnMKLUBjaW5kZXggRUxGIHByb2dyYW0gaGVhZGVycwotQGNpbmRleCBwcm9ncmFtIHNlZ21lbnRzCi1AY2luZGV4IHNlZ21lbnRzLCBFTEYKLVRoZSBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZXMgQGRmbntwcm9ncmFtIGhlYWRlcnN9LCBhbHNvIGtub3dzIGFzCi1AZGZue3NlZ21lbnRzfS4gIFRoZSBwcm9ncmFtIGhlYWRlcnMgZGVzY3JpYmUgaG93IHRoZSBwcm9ncmFtIHNob3VsZCBiZQotbG9hZGVkIGludG8gbWVtb3J5LiAgWW91IGNhbiBwcmludCB0aGVtIG91dCBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0KLXByb2dyYW0gd2l0aCB0aGUgQHNhbXB7LXB9IG9wdGlvbi4KLQotV2hlbiB5b3UgcnVuIGFuIEVMRiBwcm9ncmFtIG9uIGEgbmF0aXZlIEVMRiBzeXN0ZW0sIHRoZSBzeXN0ZW0gbG9hZGVyCi1yZWFkcyB0aGUgcHJvZ3JhbSBoZWFkZXJzIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGxvYWQgdGhlCi1wcm9ncmFtLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgcHJvZ3JhbSBoZWFkZXJzIGFyZSBzZXQgY29ycmVjdGx5LgotVGhpcyBtYW51YWwgZG9lcyBub3QgZGVzY3JpYmUgdGhlIGRldGFpbHMgb2YgaG93IHRoZSBzeXN0ZW0gbG9hZGVyCi1pbnRlcnByZXRzIHByb2dyYW0gaGVhZGVyczsgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgRUxGIEFCSS4KLQotVGhlIGxpbmtlciB3aWxsIGNyZWF0ZSByZWFzb25hYmxlIHByb2dyYW0gaGVhZGVycyBieSBkZWZhdWx0LiAgSG93ZXZlciwKLWluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBwcm9ncmFtIGhlYWRlcnMgbW9yZQotcHJlY2lzZWx5LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGZvciB0aGlzIHB1cnBvc2UuICBXaGVuCi10aGUgbGlua2VyIHNlZXMgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LCBpdCB3aWxsCi1ub3QgY3JlYXRlIGFueSBwcm9ncmFtIGhlYWRlcnMgb3RoZXIgdGhhbiB0aGUgb25lcyBzcGVjaWZpZWQuCi0KLVRoZSBsaW5rZXIgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgQGNvZGV7UEhEUlN9IGNvbW1hbmQgd2hlbgotZ2VuZXJhdGluZyBhbiBFTEYgb3V0cHV0IGZpbGUuICBJbiBvdGhlciBjYXNlcywgdGhlIGxpbmtlciB3aWxsIHNpbXBseQotaWdub3JlIEBjb2Rle1BIRFJTfS4KLQotVGhpcyBpcyB0aGUgc3ludGF4IG9mIHRoZSBAY29kZXtQSERSU30gY29tbWFuZC4gIFRoZSB3b3JkcyBAY29kZXtQSERSU30sCi1AY29kZXtGSUxFSERSfSwgQGNvZGV7QVR9LCBhbmQgQGNvZGV7RkxBR1N9IGFyZSBrZXl3b3Jkcy4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1QSERSUwotQHsKLSAgQHZhcntuYW1lfSBAdmFye3R5cGV9IFsgRklMRUhEUiBdIFsgUEhEUlMgXSBbIEFUICggQHZhcnthZGRyZXNzfSApIF0KLSAgICAgICAgWyBGTEFHUyAoIEB2YXJ7ZmxhZ3N9ICkgXSA7Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEB2YXJ7bmFtZX0gaXMgdXNlZCBvbmx5IGZvciByZWZlcmVuY2UgaW4gdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kCi1vZiB0aGUgbGlua2VyIHNjcmlwdC4gIEl0IGlzIG5vdCBwdXQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBQcm9ncmFtCi1oZWFkZXIgbmFtZXMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG5hbWUgc3BhY2UsIGFuZCB3aWxsIG5vdCBjb25mbGljdAotd2l0aCBzeW1ib2wgbmFtZXMsIGZpbGUgbmFtZXMsIG9yIHNlY3Rpb24gbmFtZXMuICBFYWNoIHByb2dyYW0gaGVhZGVyCi1tdXN0IGhhdmUgYSBkaXN0aW5jdCBuYW1lLgotCi1DZXJ0YWluIHByb2dyYW0gaGVhZGVyIHR5cGVzIGRlc2NyaWJlIHNlZ21lbnRzIG9mIG1lbW9yeSB3aGljaCB0aGUKLXN5c3RlbSBsb2FkZXIgd2lsbCBsb2FkIGZyb20gdGhlIGZpbGUuICBJbiB0aGUgbGlua2VyIHNjcmlwdCwgeW91Ci1zcGVjaWZ5IHRoZSBjb250ZW50cyBvZiB0aGVzZSBzZWdtZW50cyBieSBwbGFjaW5nIGFsbG9jYXRhYmxlIG91dHB1dAotc2VjdGlvbnMgaW4gdGhlIHNlZ21lbnRzLiAgWW91IHVzZSB0aGUgQHNhbXB7OkB2YXJ7cGhkcn19IG91dHB1dCBzZWN0aW9uCi1hdHRyaWJ1dGUgdG8gcGxhY2UgYSBzZWN0aW9uIGluIGEgcGFydGljdWxhciBzZWdtZW50LiAgQHhyZWZ7T3V0cHV0Ci1TZWN0aW9uIFBoZHJ9LgotCi1JdCBpcyBub3JtYWwgdG8gcHV0IGNlcnRhaW4gc2VjdGlvbnMgaW4gbW9yZSB0aGFuIG9uZSBzZWdtZW50LiAgVGhpcwotbWVyZWx5IGltcGxpZXMgdGhhdCBvbmUgc2VnbWVudCBvZiBtZW1vcnkgY29udGFpbnMgYW5vdGhlci4gIFlvdSBtYXkKLXJlcGVhdCBAc2FtcHs6QHZhcntwaGRyfX0sIHVzaW5nIGl0IG9uY2UgZm9yIGVhY2ggc2VnbWVudCB3aGljaCBzaG91bGQKLWNvbnRhaW4gdGhlIHNlY3Rpb24uCi0KLUlmIHlvdSBwbGFjZSBhIHNlY3Rpb24gaW4gb25lIG9yIG1vcmUgc2VnbWVudHMgdXNpbmcgQHNhbXB7OkB2YXJ7cGhkcn19LAotdGhlbiB0aGUgbGlua2VyIHdpbGwgcGxhY2UgYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGFibGUgc2VjdGlvbnMgd2hpY2ggZG8KLW5vdCBzcGVjaWZ5IEBzYW1wezpAdmFye3BoZHJ9fSBpbiB0aGUgc2FtZSBzZWdtZW50cy4gIFRoaXMgaXMgZm9yCi1jb252ZW5pZW5jZSwgc2luY2UgZ2VuZXJhbGx5IGEgd2hvbGUgc2V0IG9mIGNvbnRpZ3VvdXMgc2VjdGlvbnMgd2lsbCBiZQotcGxhY2VkIGluIGEgc2luZ2xlIHNlZ21lbnQuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gb3ZlcnJpZGUgdGhlCi1kZWZhdWx0IHNlZ21lbnQgYW5kIHRlbGwgdGhlIGxpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueQotc2VnbWVudCBhdCBhbGwuCi0KLUBraW5kZXggRklMRUhEUgotQGtpbmRleCBQSERSUwotWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZJTEVIRFJ9IGFuZCBAY29kZXtQSERSU30ga2V5d29yZHMgYXBwZWFyIGFmdGVyCi10aGUgcHJvZ3JhbSBoZWFkZXIgdHlwZSB0byBmdXJ0aGVyIGRlc2NyaWJlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VnbWVudC4KLVRoZSBAY29kZXtGSUxFSERSfSBrZXl3b3JkIG1lYW5zIHRoYXQgdGhlIHNlZ21lbnQgc2hvdWxkIGluY2x1ZGUgdGhlIEVMRgotZmlsZSBoZWFkZXIuICBUaGUgQGNvZGV7UEhEUlN9IGtleXdvcmQgbWVhbnMgdGhhdCB0aGUgc2VnbWVudCBzaG91bGQKLWluY2x1ZGUgdGhlIEVMRiBwcm9ncmFtIGhlYWRlcnMgdGhlbXNlbHZlcy4KLQotVGhlIEB2YXJ7dHlwZX0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLiAgVGhlIG51bWJlcnMgaW5kaWNhdGUgdGhlCi12YWx1ZSBvZiB0aGUga2V5d29yZC4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBAY29kZXtQVF9OVUxMfSAoMCkKLUluZGljYXRlcyBhbiB1bnVzZWQgcHJvZ3JhbSBoZWFkZXIuCi0KLUBpdGVtIEBjb2Rle1BUX0xPQUR9ICgxKQotSW5kaWNhdGVzIHRoYXQgdGhpcyBwcm9ncmFtIGhlYWRlciBkZXNjcmliZXMgYSBzZWdtZW50IHRvIGJlIGxvYWRlZCBmcm9tCi10aGUgZmlsZS4KLQotQGl0ZW0gQGNvZGV7UFRfRFlOQU1JQ30gKDIpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQuCi0KLUBpdGVtIEBjb2Rle1BUX0lOVEVSUH0gKDMpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGludGVycHJldGVyIG1heSBiZQotZm91bmQuCi0KLUBpdGVtIEBjb2Rle1BUX05PVEV9ICg0KQotSW5kaWNhdGVzIGEgc2VnbWVudCBob2xkaW5nIG5vdGUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIEBjb2Rle1BUX1NITElCfSAoNSkKLUEgcmVzZXJ2ZWQgcHJvZ3JhbSBoZWFkZXIgdHlwZSwgZGVmaW5lZCBidXQgbm90IHNwZWNpZmllZCBieSB0aGUgRUxGCi1BQkkuCi0KLUBpdGVtIEBjb2Rle1BUX1BIRFJ9ICg2KQotSW5kaWNhdGVzIGEgc2VnbWVudCB3aGVyZSB0aGUgcHJvZ3JhbSBoZWFkZXJzIG1heSBiZSBmb3VuZC4KLQotQGl0ZW0gQHZhcntleHByZXNzaW9ufQotQW4gZXhwcmVzc2lvbiBnaXZpbmcgdGhlIG51bWVyaWMgdHlwZSBvZiB0aGUgcHJvZ3JhbSBoZWFkZXIuICBUaGlzIG1heQotYmUgdXNlZCBmb3IgdHlwZXMgbm90IGRlZmluZWQgYWJvdmUuCi1AZW5kIHRhYmxlCi0KLVlvdSBjYW4gc3BlY2lmeSB0aGF0IGEgc2VnbWVudCBzaG91bGQgYmUgbG9hZGVkIGF0IGEgcGFydGljdWxhciBhZGRyZXNzCi1pbiBtZW1vcnkgYnkgdXNpbmcgYW4gQGNvZGV7QVR9IGV4cHJlc3Npb24uICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUKLUBjb2Rle0FUfSBjb21tYW5kIHVzZWQgYXMgYW4gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlIChAcHhyZWZ7T3V0cHV0Ci1TZWN0aW9uIExNQX0pLiAgVGhlIEBjb2Rle0FUfSBjb21tYW5kIGZvciBhIHByb2dyYW0gaGVhZGVyIG92ZXJyaWRlcyB0aGUKLW91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZS4KLQotVGhlIGxpbmtlciB3aWxsIG5vcm1hbGx5IHNldCB0aGUgc2VnbWVudCBmbGFncyBiYXNlZCBvbiB0aGUgc2VjdGlvbnMKLXdoaWNoIGNvbXByaXNlIHRoZSBzZWdtZW50LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZMQUdTfSBrZXl3b3JkIHRvCi1leHBsaWNpdGx5IHNwZWNpZnkgdGhlIHNlZ21lbnQgZmxhZ3MuICBUaGUgdmFsdWUgb2YgQHZhcntmbGFnc30gbXVzdCBiZQotYW4gaW50ZWdlci4gIEl0IGlzIHVzZWQgdG8gc2V0IHRoZSBAY29kZXtwX2ZsYWdzfSBmaWVsZCBvZiB0aGUgcHJvZ3JhbQotaGVhZGVyLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgQGNvZGV7UEhEUlN9LiAgVGhpcyBzaG93cyBhIHR5cGljYWwgc2V0IG9mIHByb2dyYW0KLWhlYWRlcnMgdXNlZCBvbiBhIG5hdGl2ZSBFTEYgc3lzdGVtLgotCi1AZXhhbXBsZQotQGdyb3VwCi1QSERSUwotQHsKLSAgaGVhZGVycyBQVF9QSERSIFBIRFJTIDsKLSAgaW50ZXJwIFBUX0lOVEVSUCA7Ci0gIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIDsKLSAgZGF0YSBQVF9MT0FEIDsKLSAgZHluYW1pYyBQVF9EWU5BTUlDIDsKLUB9Ci0KLVNFQ1RJT05TCi1AewotICAuID0gU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiBAeyAqKC5pbnRlcnApIEB9IDp0ZXh0IDppbnRlcnAKLSAgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dAotICAucm9kYXRhIDogQHsgKigucm9kYXRhKSBAfSAvKiBkZWZhdWx0cyB0byA6dGV4dCAqLwotICBAZG90c3t9Ci0gIC4gPSAuICsgMHgxMDAwOyAvKiBtb3ZlIHRvIGEgbmV3IHBhZ2UgaW4gbWVtb3J5ICovCi0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0gOmRhdGEKLSAgLmR5bmFtaWMgOiBAeyAqKC5keW5hbWljKSBAfSA6ZGF0YSA6ZHluYW1pYwotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2RlIFZFUlNJT04KLUBzZWN0aW9uIFZFUlNJT04gQ29tbWFuZAotQGtpbmRleCBWRVJTSU9OIEB7c2NyaXB0IHRleHRAfQotQGNpbmRleCBzeW1ib2wgdmVyc2lvbnMKLUBjaW5kZXggdmVyc2lvbiBzY3JpcHQKLUBjaW5kZXggdmVyc2lvbnMgb2Ygc3ltYm9scwotVGhlIGxpbmtlciBzdXBwb3J0cyBzeW1ib2wgdmVyc2lvbnMgd2hlbiB1c2luZyBFTEYuICBTeW1ib2wgdmVyc2lvbnMgYXJlCi1vbmx5IHVzZWZ1bCB3aGVuIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgZHluYW1pYyBsaW5rZXIgY2FuIHVzZQotc3ltYm9sIHZlcnNpb25zIHRvIHNlbGVjdCBhIHNwZWNpZmljIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB3aGVuIGl0IHJ1bnMKLWEgcHJvZ3JhbSB0aGF0IG1heSBoYXZlIGJlZW4gbGlua2VkIGFnYWluc3QgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZQotc2hhcmVkIGxpYnJhcnkuCi0KLVlvdSBjYW4gaW5jbHVkZSBhIHZlcnNpb24gc2NyaXB0IGRpcmVjdGx5IGluIHRoZSBtYWluIGxpbmtlciBzY3JpcHQsIG9yCi15b3UgY2FuIHN1cHBseSB0aGUgdmVyc2lvbiBzY3JpcHQgYXMgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdC4gIFlvdSBjYW4KLWFsc28gdXNlIHRoZSBAc2FtcHstLXZlcnNpb24tc2NyaXB0fSBsaW5rZXIgb3B0aW9uLgotCi1UaGUgc3ludGF4IG9mIHRoZSBAY29kZXtWRVJTSU9OfSBjb21tYW5kIGlzIHNpbXBseQotQHNtYWxsZXhhbXBsZQotVkVSU0lPTiBAeyB2ZXJzaW9uLXNjcmlwdC1jb21tYW5kcyBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGZvcm1hdCBvZiB0aGUgdmVyc2lvbiBzY3JpcHQgY29tbWFuZHMgaXMgaWRlbnRpY2FsIHRvIHRoYXQgdXNlZCBieQotU3VuJ3MgbGlua2VyIGluIFNvbGFyaXMgMi41LiAgVGhlIHZlcnNpb24gc2NyaXB0IGRlZmluZXMgYSB0cmVlIG9mCi12ZXJzaW9uIG5vZGVzLiAgWW91IHNwZWNpZnkgdGhlIG5vZGUgbmFtZXMgYW5kIGludGVyZGVwZW5kZW5jaWVzIGluIHRoZQotdmVyc2lvbiBzY3JpcHQuICBZb3UgY2FuIHNwZWNpZnkgd2hpY2ggc3ltYm9scyBhcmUgYm91bmQgdG8gd2hpY2gKLXZlcnNpb24gbm9kZXMsIGFuZCB5b3UgY2FuIHJlZHVjZSBhIHNwZWNpZmllZCBzZXQgb2Ygc3ltYm9scyB0byBsb2NhbAotc2NvcGUgc28gdGhhdCB0aGV5IGFyZSBub3QgZ2xvYmFsbHkgdmlzaWJsZSBvdXRzaWRlIG9mIHRoZSBzaGFyZWQKLWxpYnJhcnkuCi0KLVRoZSBlYXNpZXN0IHdheSB0byBkZW1vbnN0cmF0ZSB0aGUgdmVyc2lvbiBzY3JpcHQgbGFuZ3VhZ2UgaXMgd2l0aCBhIGZldwotZXhhbXBsZXMuCi0KLUBzbWFsbGV4YW1wbGUKLVZFUlNfMS4xIEB7Ci0JIGdsb2JhbDoKLQkJIGZvbzE7Ci0JIGxvY2FsOgotCQkgb2xkKjsgCi0JCSBvcmlnaW5hbCo7IAotCQkgbmV3KjsgCi1AfTsKLQotVkVSU18xLjIgQHsKLQkJIGZvbzI7Ci1AfSBWRVJTXzEuMTsKLQotVkVSU18yLjAgQHsKLQkJIGJhcjE7IGJhcjI7Ci1AfSBWRVJTXzEuMjsKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgZXhhbXBsZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIHRocmVlIHZlcnNpb24gbm9kZXMuICBUaGUgZmlyc3QKLXZlcnNpb24gbm9kZSBkZWZpbmVkIGlzIEBzYW1we1ZFUlNfMS4xfTsgaXQgaGFzIG5vIG90aGVyIGRlcGVuZGVuY2llcy4KLVRoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28xfSB0byBAc2FtcHtWRVJTXzEuMX0uICBJdCByZWR1Y2VzCi1hIG51bWJlciBvZiBzeW1ib2xzIHRvIGxvY2FsIHNjb3BlIHNvIHRoYXQgdGhleSBhcmUgbm90IHZpc2libGUgb3V0c2lkZQotb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotCi1OZXh0LCB0aGUgdmVyc2lvbiBzY3JpcHQgZGVmaW5lcyBub2RlIEBzYW1we1ZFUlNfMS4yfS4gIFRoaXMgbm9kZQotZGVwZW5kcyB1cG9uIEBzYW1we1ZFUlNfMS4xfS4gIFRoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28yfQotdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMn0uCi0KLUZpbmFsbHksIHRoZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIG5vZGUgQHNhbXB7VkVSU18yLjB9LiAgVGhpcyBub2RlCi1kZXBlbmRzIHVwb24gQHNhbXB7VkVSU18xLjJ9LiAgVGhlIHNjcmlwdHMgYmluZHMgdGhlIHN5bWJvbHMgQHNhbXB7YmFyMX0KLWFuZCBAc2FtcHtiYXIyfSBhcmUgYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzIuMH0uCi0KLVdoZW4gdGhlIGxpbmtlciBmaW5kcyBhIHN5bWJvbCBkZWZpbmVkIGluIGEgbGlicmFyeSB3aGljaCBpcyBub3QKLXNwZWNpZmljYWxseSBib3VuZCB0byBhIHZlcnNpb24gbm9kZSwgaXQgd2lsbCBlZmZlY3RpdmVseSBiaW5kIGl0IHRvIGFuCi11bnNwZWNpZmllZCBiYXNlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBZb3UgY2FuIGJpbmQgYWxsIG90aGVyd2lzZQotdW5zcGVjaWZpZWQgc3ltYm9scyB0byBhIGdpdmVuIHZlcnNpb24gbm9kZSBieSB1c2luZyBAc2FtcHtnbG9iYWw6ICp9Ci1zb21ld2hlcmUgaW4gdGhlIHZlcnNpb24gc2NyaXB0LgotCi1UaGUgbmFtZXMgb2YgdGhlIHZlcnNpb24gbm9kZXMgaGF2ZSBubyBzcGVjaWZpYyBtZWFuaW5nIG90aGVyIHRoYW4gd2hhdAotdGhleSBtaWdodCBzdWdnZXN0IHRvIHRoZSBwZXJzb24gcmVhZGluZyB0aGVtLiAgVGhlIEBzYW1wezIuMH0gdmVyc2lvbgotY291bGQganVzdCBhcyB3ZWxsIGhhdmUgYXBwZWFyZWQgaW4gYmV0d2VlbiBAc2FtcHsxLjF9IGFuZCBAc2FtcHsxLjJ9LgotSG93ZXZlciwgdGhpcyB3b3VsZCBiZSBhIGNvbmZ1c2luZyB3YXkgdG8gd3JpdGUgYSB2ZXJzaW9uIHNjcmlwdC4KLQotV2hlbiB5b3UgbGluayBhbiBhcHBsaWNhdGlvbiBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdGhhdCBoYXMgdmVyc2lvbmVkCi1zeW1ib2xzLCB0aGUgYXBwbGljYXRpb24gaXRzZWxmIGtub3dzIHdoaWNoIHZlcnNpb24gb2YgZWFjaCBzeW1ib2wgaXQKLXJlcXVpcmVzLCBhbmQgaXQgYWxzbyBrbm93cyB3aGljaCB2ZXJzaW9uIG5vZGVzIGl0IG5lZWRzIGZyb20gZWFjaAotc2hhcmVkIGxpYnJhcnkgaXQgaXMgbGlua2VkIGFnYWluc3QuICBUaHVzIGF0IHJ1bnRpbWUsIHRoZSBkeW5hbWljCi1sb2FkZXIgY2FuIG1ha2UgYSBxdWljayBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFyaWVzIHlvdSBoYXZlCi1saW5rZWQgYWdhaW5zdCBkbyBpbiBmYWN0IHN1cHBseSBhbGwgb2YgdGhlIHZlcnNpb24gbm9kZXMgdGhhdCB0aGUKLWFwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byByZXNvbHZlIGFsbCBvZiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgSW4gdGhpcwotd2F5IGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgZHluYW1pYyBsaW5rZXIgdG8ga25vdyB3aXRoIGNlcnRhaW50eSB0aGF0Ci1hbGwgZXh0ZXJuYWwgc3ltYm9scyB0aGF0IGl0IG5lZWRzIHdpbGwgYmUgcmVzb2x2YWJsZSB3aXRob3V0IGhhdmluZyB0bwotc2VhcmNoIGZvciBlYWNoIHN5bWJvbCByZWZlcmVuY2UuCi0KLVRoZSBzeW1ib2wgdmVyc2lvbmluZyBpcyBpbiBlZmZlY3QgYSBtdWNoIG1vcmUgc29waGlzdGljYXRlZCB3YXkgb2YKLWRvaW5nIG1pbm9yIHZlcnNpb24gY2hlY2tpbmcgdGhhdCBTdW5PUyBkb2VzLiAgVGhlIGZ1bmRhbWVudGFsIHByb2JsZW0KLXRoYXQgaXMgYmVpbmcgYWRkcmVzc2VkIGhlcmUgaXMgdGhhdCB0eXBpY2FsbHkgcmVmZXJlbmNlcyB0byBleHRlcm5hbAotZnVuY3Rpb25zIGFyZSBib3VuZCBvbiBhbiBhcy1uZWVkZWQgYmFzaXMsIGFuZCBhcmUgbm90IGFsbCBib3VuZCB3aGVuCi10aGUgYXBwbGljYXRpb24gc3RhcnRzIHVwLiAgSWYgYSBzaGFyZWQgbGlicmFyeSBpcyBvdXQgb2YgZGF0ZSwgYQotcmVxdWlyZWQgaW50ZXJmYWNlIG1heSBiZSBtaXNzaW5nOyB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byB1c2UKLXRoYXQgaW50ZXJmYWNlLCBpdCBtYXkgc3VkZGVubHkgYW5kIHVuZXhwZWN0ZWRseSBmYWlsLiAgV2l0aCBzeW1ib2wKLXZlcnNpb25pbmcsIHRoZSB1c2VyIHdpbGwgZ2V0IGEgd2FybmluZyB3aGVuIHRoZXkgc3RhcnQgdGhlaXIgcHJvZ3JhbSBpZgotdGhlIGxpYnJhcmllcyBiZWluZyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGFyZSB0b28gb2xkLgotCi1UaGVyZSBhcmUgc2V2ZXJhbCBHTlUgZXh0ZW5zaW9ucyB0byBTdW4ncyB2ZXJzaW9uaW5nIGFwcHJvYWNoLiAgVGhlCi1maXJzdCBvZiB0aGVzZSBpcyB0aGUgYWJpbGl0eSB0byBiaW5kIGEgc3ltYm9sIHRvIGEgdmVyc2lvbiBub2RlIGluIHRoZQotc291cmNlIGZpbGUgd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluc3RlYWQgb2YgaW4gdGhlIHZlcnNpb25pbmcKLXNjcmlwdC4gIFRoaXMgd2FzIGRvbmUgbWFpbmx5IHRvIHJlZHVjZSB0aGUgYnVyZGVuIG9uIHRoZSBsaWJyYXJ5Ci1tYWludGFpbmVyLiAgWW91IGNhbiBkbyB0aGlzIGJ5IHB1dHRpbmcgc29tZXRoaW5nIGxpa2U6Ci1Ac21hbGxleGFtcGxlCi1fX2FzbV9fKCIuc3ltdmVyIG9yaWdpbmFsX2Zvbyxmb29AQFZFUlNfMS4xIik7Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1pbiB0aGUgQyBzb3VyY2UgZmlsZS4gIFRoaXMgcmVuYW1lcyB0aGUgZnVuY3Rpb24gQHNhbXB7b3JpZ2luYWxfZm9vfSB0bwotYmUgYW4gYWxpYXMgZm9yIEBzYW1we2Zvb30gYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMX0uCi1UaGUgQHNhbXB7bG9jYWw6fSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gcHJldmVudCB0aGUgc3ltYm9sCi1Ac2FtcHtvcmlnaW5hbF9mb299IGZyb20gYmVpbmcgZXhwb3J0ZWQuCi0KLVRoZSBzZWNvbmQgR05VIGV4dGVuc2lvbiBpcyB0byBhbGxvdyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotZnVuY3Rpb24gdG8gYXBwZWFyIGluIGEgZ2l2ZW4gc2hhcmVkIGxpYnJhcnkuICBJbiB0aGlzIHdheSB5b3UgY2FuIG1ha2UKLWFuIGluY29tcGF0aWJsZSBjaGFuZ2UgdG8gYW4gaW50ZXJmYWNlIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgbWFqb3IKLXZlcnNpb24gbnVtYmVyIG9mIHRoZSBzaGFyZWQgbGlicmFyeSwgd2hpbGUgc3RpbGwgYWxsb3dpbmcgYXBwbGljYXRpb25zCi1saW5rZWQgYWdhaW5zdCB0aGUgb2xkIGludGVyZmFjZSB0byBjb250aW51ZSB0byBmdW5jdGlvbi4KLQotVG8gZG8gdGhpcywgeW91IG11c3QgdXNlIG11bHRpcGxlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZXMgaW4gdGhlCi1zb3VyY2UgZmlsZS4gIEhlcmUgaXMgYW4gZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQEAiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28xLGZvb0BAVkVSU18xLjIiKTsKLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQEBAVkVSU18yLjAiKTsKLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIHRoaXMgZXhhbXBsZSwgQHNhbXB7Zm9vQEB9IHJlcHJlc2VudHMgdGhlIHN5bWJvbCBAc2FtcHtmb299IGJvdW5kIHRvIHRoZQotdW5zcGVjaWZpZWQgYmFzZSB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICBUaGUgc291cmNlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzCi1leGFtcGxlIHdvdWxkIGRlZmluZSA0IEMgZnVuY3Rpb25zOiBAc2FtcHtvcmlnaW5hbF9mb299LCBAc2FtcHtvbGRfZm9vfSwKLUBzYW1we29sZF9mb28xfSwgYW5kIEBzYW1we25ld19mb299LgotCi1XaGVuIHlvdSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIGEgZ2l2ZW4gc3ltYm9sLCB0aGVyZSBuZWVkcyB0byBiZQotc29tZSB3YXkgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmVyc2lvbiB0byB3aGljaCBleHRlcm5hbCByZWZlcmVuY2VzIHRvCi10aGlzIHN5bWJvbCB3aWxsIGJlIGJvdW5kLiAgWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlCi1Ac2FtcHtmb29AQEBAVkVSU18yLjB9IHR5cGUgb2YgQHNhbXB7LnN5bXZlcn0gZGlyZWN0aXZlLiAgWW91IGNhbiBvbmx5Ci1kZWNsYXJlIG9uZSB2ZXJzaW9uIG9mIGEgc3ltYm9sIGFzIHRoZSBkZWZhdWx0IGluIHRoaXMgbWFubmVyOyBvdGhlcndpc2UKLXlvdSB3b3VsZCBlZmZlY3RpdmVseSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHN5bWJvbC4KLQotSWYgeW91IHdpc2ggdG8gYmluZCBhIHJlZmVyZW5jZSB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIHN5bWJvbAotd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzZXMgb2YgY29udmVuaWVuY2UKLShpLmUuIEBzYW1we29sZF9mb299KSwgb3IgeW91IGNhbiB1c2UgdGhlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZSB0bwotc3BlY2lmaWNhbGx5IGJpbmQgdG8gYW4gZXh0ZXJuYWwgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24uCi0KLUBub2RlIEV4cHJlc3Npb25zCi1Ac2VjdGlvbiBFeHByZXNzaW9ucyBpbiBMaW5rZXIgU2NyaXB0cwotQGNpbmRleCBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljCi1UaGUgc3ludGF4IGZvciBleHByZXNzaW9ucyBpbiB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZSBpcyBpZGVudGljYWwgdG8KLXRoYXQgb2YgQyBleHByZXNzaW9ucy4gIEFsbCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGFzIGludGVnZXJzLiAgQWxsCi1leHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGluIHRoZSBzYW1lIHNpemUsIHdoaWNoIGlzIDMyIGJpdHMgaWYgYm90aCB0aGUKLWhvc3QgYW5kIHRhcmdldCBhcmUgMzIgYml0cywgYW5kIGlzIG90aGVyd2lzZSA2NCBiaXRzLgotCi1Zb3UgY2FuIHVzZSBhbmQgc2V0IHN5bWJvbCB2YWx1ZXMgaW4gZXhwcmVzc2lvbnMuCi0KLVRoZSBsaW5rZXIgZGVmaW5lcyBzZXZlcmFsIHNwZWNpYWwgcHVycG9zZSBidWlsdGluIGZ1bmN0aW9ucyBmb3IgdXNlIGluCi1leHByZXNzaW9ucy4KLQotQG1lbnUKLSogQ29uc3RhbnRzOjoJCQlDb25zdGFudHMKLSogU3ltYm9sczo6CQkJU3ltYm9sIE5hbWVzCi0qIExvY2F0aW9uIENvdW50ZXI6OgkJVGhlIExvY2F0aW9uIENvdW50ZXIKLSogT3BlcmF0b3JzOjoJCQlPcGVyYXRvcnMKLSogRXZhbHVhdGlvbjo6CQkJRXZhbHVhdGlvbgotKiBFeHByZXNzaW9uIFNlY3Rpb246OgkJVGhlIFNlY3Rpb24gb2YgYW4gRXhwcmVzc2lvbgotKiBCdWlsdGluIEZ1bmN0aW9uczo6CQlCdWlsdGluIEZ1bmN0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIENvbnN0YW50cwotQHN1YnNlY3Rpb24gQ29uc3RhbnRzCi1AY2luZGV4IGludGVnZXIgbm90YXRpb24KLUBjaW5kZXggY29uc3RhbnRzIGluIGxpbmtlciBzY3JpcHRzCi1BbGwgY29uc3RhbnRzIGFyZSBpbnRlZ2Vycy4KLQotQXMgaW4gQywgdGhlIGxpbmtlciBjb25zaWRlcnMgYW4gaW50ZWdlciBiZWdpbm5pbmcgd2l0aCBAc2FtcHswfSB0byBiZQotb2N0YWwsIGFuZCBhbiBpbnRlZ2VyIGJlZ2lubmluZyB3aXRoIEBzYW1wezB4fSBvciBAc2FtcHswWH0gdG8gYmUKLWhleGFkZWNpbWFsLiAgVGhlIGxpbmtlciBjb25zaWRlcnMgb3RoZXIgaW50ZWdlcnMgdG8gYmUgZGVjaW1hbC4KLQotQGNpbmRleCBzY2FsZWQgaW50ZWdlcnMKLUBjaW5kZXggSyBhbmQgTSBpbnRlZ2VyIHN1ZmZpeGVzCi1AY2luZGV4IE0gYW5kIEsgaW50ZWdlciBzdWZmaXhlcwotQGNpbmRleCBzdWZmaXhlcyBmb3IgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlciBzdWZmaXhlcwotSW4gYWRkaXRpb24sIHlvdSBjYW4gdXNlIHRoZSBzdWZmaXhlcyBAY29kZXtLfSBhbmQgQGNvZGV7TX0gdG8gc2NhbGUgYQotY29uc3RhbnQgYnkKLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBjb2RlezEwMjR9IG9yIEBjb2RlezEwMjQqMTAyNH0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQHRleAotJHtccm0gMTAyNH0kIG9yICR7XHJtIDEwMjR9XjIkCi1AZW5kIHRleAotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1yZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFsbCByZWZlciB0byB0aGUgc2FtZSBxdWFudGl0eToKLUBzbWFsbGV4YW1wbGUKLSAgX2ZvdXJrXzEgPSA0SzsKLSAgX2ZvdXJrXzIgPSA0MDk2OwotICBfZm91cmtfMyA9IDB4MTAwMDsKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBOYW1lcwotQGNpbmRleCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggbmFtZXMKLUBjaW5kZXggcXVvdGVkIHN5bWJvbCBuYW1lcwotQGtpbmRleCAiCi1Vbmxlc3MgcXVvdGVkLCBzeW1ib2wgbmFtZXMgc3RhcnQgd2l0aCBhIGxldHRlciwgdW5kZXJzY29yZSwgb3IgcGVyaW9kCi1hbmQgbWF5IGluY2x1ZGUgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywgcGVyaW9kcywgYW5kIGh5cGhlbnMuCi1VbnF1b3RlZCBzeW1ib2wgbmFtZXMgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCBhbnkga2V5d29yZHMuICBZb3UgY2FuCi1zcGVjaWZ5IGEgc3ltYm9sIHdoaWNoIGNvbnRhaW5zIG9kZCBjaGFyYWN0ZXJzIG9yIGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEKLWtleXdvcmQgYnkgc3Vycm91bmRpbmcgdGhlIHN5bWJvbCBuYW1lIGluIGRvdWJsZSBxdW90ZXM6Ci1Ac21hbGxleGFtcGxlCi0gICJTRUNUSU9OIiA9IDk7Ci0gICJ3aXRoIGEgc3BhY2UiID0gImFsc28gd2l0aCBhIHNwYWNlIiArIDEwOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotU2luY2Ugc3ltYm9scyBjYW4gY29udGFpbiBtYW55IG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMsIGl0IGlzIHNhZmVzdAotdG8gZGVsaW1pdCBzeW1ib2xzIHdpdGggc3BhY2VzLiAgRm9yIGV4YW1wbGUsIEBzYW1we0EtQn0gaXMgb25lIHN5bWJvbCwKLXdoZXJlYXMgQHNhbXB7QSAtIEJ9IGlzIGFuIGV4cHJlc3Npb24gaW52b2x2aW5nIHN1YnRyYWN0aW9uLgotCi1Abm9kZSBMb2NhdGlvbiBDb3VudGVyCi1Ac3Vic2VjdGlvbiBUaGUgTG9jYXRpb24gQ291bnRlcgotQGtpbmRleCAuCi1AY2luZGV4IGRvdAotQGNpbmRleCBsb2NhdGlvbiBjb3VudGVyCi1AY2luZGV4IGN1cnJlbnQgb3V0cHV0IGxvY2F0aW9uCi1UaGUgc3BlY2lhbCBsaW5rZXIgdmFyaWFibGUgQGRmbntkb3R9IEBzYW1wey59IGFsd2F5cyBjb250YWlucyB0aGUKLWN1cnJlbnQgb3V0cHV0IGxvY2F0aW9uIGNvdW50ZXIuICBTaW5jZSB0aGUgQGNvZGV7Ln0gYWx3YXlzIHJlZmVycyB0byBhCi1sb2NhdGlvbiBpbiBhbiBvdXRwdXQgc2VjdGlvbiwgaXQgbWF5IG9ubHkgYXBwZWFyIGluIGFuIGV4cHJlc3Npb24KLXdpdGhpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLiAgVGhlIEBjb2Rley59IHN5bWJvbCBtYXkgYXBwZWFyCi1hbnl3aGVyZSB0aGF0IGFuIG9yZGluYXJ5IHN5bWJvbCBpcyBhbGxvd2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLUBjaW5kZXggaG9sZXMKLUFzc2lnbmluZyBhIHZhbHVlIHRvIEBjb2Rley59IHdpbGwgY2F1c2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgdG8gYmUKLW1vdmVkLiAgVGhpcyBtYXkgYmUgdXNlZCB0byBjcmVhdGUgaG9sZXMgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlCi1sb2NhdGlvbiBjb3VudGVyIG1heSBuZXZlciBiZSBtb3ZlZCBiYWNrd2FyZHMuCi0KLUBzbWFsbGV4YW1wbGUKLVNFQ1RJT05TCi1AewotICBvdXRwdXQgOgotICAgIEB7Ci0gICAgICBmaWxlMSgudGV4dCkKLSAgICAgIC4gPSAuICsgMTAwMDsKLSAgICAgIGZpbGUyKC50ZXh0KQotICAgICAgLiArPSAxMDAwOwotICAgICAgZmlsZTMoLnRleHQpCi0gICAgQH0gPSAweDEyMzQ7Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUxfSBpcwotbG9jYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXR9LiAgSXQgaXMKLWZvbGxvd2VkIGJ5IGEgMTAwMCBieXRlIGdhcC4gIFRoZW4gdGhlIEBzYW1wey50ZXh0fSBzZWN0aW9uIGZyb20KLUBmaWxle2ZpbGUyfSBhcHBlYXJzLCBhbHNvIHdpdGggYSAxMDAwIGJ5dGUgZ2FwIGZvbGxvd2luZyBiZWZvcmUgdGhlCi1Ac2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUzfS4gIFRoZSBub3RhdGlvbiBAc2FtcHs9IDB4MTIzNH0KLXNwZWNpZmllcyB3aGF0IGRhdGEgdG8gd3JpdGUgaW4gdGhlIGdhcHMgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBGaWxsfSkuCi0KLUBjaW5kZXggZG90IGluc2lkZSBzZWN0aW9ucwotTm90ZTogQGNvZGV7Ln0gYWN0dWFsbHkgcmVmZXJzIHRvIHRoZSBieXRlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLWN1cnJlbnQgY29udGFpbmluZyBvYmplY3QuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBAY29kZXtTRUNUSU9OU30KLXN0YXRlbWVudCwgd2hvZXMgc3RhcnQgYWRkcmVzcyBpcyAwLCBoZW5jZSBAY29kZXsufSBjYW4gYmUgdXNlZCBhcyBhbgotYWJzb2x1dGUgYWRkcmVzcy4gIElmIEBjb2Rley59IGlzIHVzZWQgaW5zaWRlIGEgc2VjdGlvbiBkZXNjcmlwdGlvbgotaG93ZXZlciwgaXQgcmVmZXJzIHRvIHRoZSBieXRlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGF0IHNlY3Rpb24sCi1ub3QgYW4gYWJzb2x1dGUgYWRkcmVzcy4gIFRodXMgaW4gYSBzY3JpcHQgbGlrZSB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgICAuID0gMHgxMDAKLSAgICAudGV4dDogQHsKLSAgICAgICooLnRleHQpCi0gICAgICAuID0gMHgyMDAKLSAgICBAfQotICAgIC4gPSAweDUwMAotICAgIC5kYXRhOiBAewotICAgICAgKiguZGF0YSkKLSAgICAgIC4gKz0gMHg2MDAKLSAgICBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiB3aWxsIGJlIGFzc2lnbmVkIGEgc3RhcnRpbmcgYWRkcmVzcyBvZiAweDEwMAotYW5kIGEgc2l6ZSBvZiBleGFjdGx5IDB4MjAwIGJ5dGVzLCBldmVuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggZGF0YSBpbgotdGhlIEBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9ucyB0byBmaWxsIHRoaXMgYXJlYS4gIChJZiB0aGVyZSBpcyB0b28KLW11Y2ggZGF0YSwgYW4gZXJyb3Igd2lsbCBiZSBwcm9kdWNlZCBiZWNhdXNlIHRoaXMgd291bGQgYmUgYW4gYXR0ZW1wdCB0bwotbW92ZSBAY29kZXsufSBiYWNrd2FyZHMpLiAgVGhlIEBzYW1wey5kYXRhfSBzZWN0aW9uIHdpbGwgc3RhcnQgYXQgMHg1MDAKLWFuZCBpdCB3aWxsIGhhdmUgYW4gZXh0cmEgMHg2MDAgYnl0ZXMgd29ydGggb2Ygc3BhY2UgYWZ0ZXIgdGhlIGVuZCBvZgotdGhlIHZhbHVlcyBmcm9tIHRoZSBAc2FtcHsuZGF0YX0gaW5wdXQgc2VjdGlvbnMgYW5kIGJlZm9yZSB0aGUgZW5kIG9mCi10aGUgQHNhbXB7LmRhdGF9IG91dHB1dCBzZWN0aW9uIGl0c2VsZi4KLQotQG5lZWQgMjAwMAotQG5vZGUgT3BlcmF0b3JzCi1Ac3Vic2VjdGlvbiBPcGVyYXRvcnMKLUBjaW5kZXggb3BlcmF0b3JzIGZvciBhcml0aG1ldGljCi1AY2luZGV4IGFyaXRobWV0aWMgb3BlcmF0b3JzCi1AY2luZGV4IHByZWNlZGVuY2UgaW4gZXhwcmVzc2lvbnMKLVRoZSBsaW5rZXIgcmVjb2duaXplcyB0aGUgc3RhbmRhcmQgQyBzZXQgb2YgYXJpdGhtZXRpYyBvcGVyYXRvcnMsIHdpdGgKLXRoZSBzdGFuZGFyZCBiaW5kaW5ncyBhbmQgcHJlY2VkZW5jZSBsZXZlbHM6Ci1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1Ac21hbGxleGFtcGxlCi1wcmVjZWRlbmNlICAgICAgYXNzb2NpYXRpdml0eSAgIE9wZXJhdG9ycyAgICAgICAgICAgICAgICBOb3RlcwotKGhpZ2hlc3QpCi0xICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgICEgIC0gIH4gICAgICAgICAgICAgICAgICAoMSkKLTIgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgKiAgLyAgJQotMyAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICArICAtCi00ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgID4+ICA8PAotNSAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICA9PSAgIT0gID4gIDwgIDw9ICA+PQotNiAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICAmCi03ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgIHwKLTggICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgJiYKLTkgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgfHwKLTEwICAgICAgICAgICAgICByaWdodCAgICAgICAgICAgPyA6Ci0xMSAgICAgICAgICAgICAgcmlnaHQgICAgICAgICAgICY9ICArPSAgLT0gICo9ICAvPSAgICAgICAoMikKLShsb3dlc3QpCi1AZW5kIHNtYWxsZXhhbXBsZQotTm90ZXM6Ci0oMSkgUHJlZml4IG9wZXJhdG9ycyAKLSgyKSBAeHJlZntBc3NpZ25tZW50c30uCi1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUB0ZXgKLVx2c2tpcCBcYmFzZWxpbmVza2lwCi0lImxpc3BuYXJyb3dpbmciIGlzIHRoZSBleHRyYSBpbmRlbnQgdXNlZCBnZW5lcmFsbHkgZm9yIHNtYWxsZXhhbXBsZQotXGhza2lwXGxpc3BuYXJyb3dpbmdcdmJveHtcb2ZmaW50ZXJsaW5lc2tpcAotXGhydWxlCi1caGFsaWduCi17XHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwge1x0dCAjfVwgXGhmaWwmXHZydWxlI1xjcgotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0mUHJlY2VkZW5jZSYmICBBc3NvY2lhdGl2aXR5ICAmJntccm0gT3BlcmF0b3JzfSZcY3IKLWhlaWdodDJwdCZcb21pdCYmXG9taXQmJlxvbWl0JlxjcgotXG5vYWxpZ257XGhydWxlfQotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0maGlnaGVzdCYmJiYmXGNyCi0lICcxNzYgaXMgdGlsZGUsICd+JyBpbiB0dCBmb250Ci0mMSYmbGVmdCYmXHFxdWFkLSAgICAgICAgICBcY2hhcicxNzZcICAgICAgIVxxcXVhZFxkYWcmXGNyIAotJjImJmxlZnQmJiogICAgICAgICAgLyAgICAgICAgXCUmXGNyCi0mMyYmbGVmdCYmKyAgICAgICAgICAtJlxjcgotJjQmJmxlZnQmJj4+ICAgICAgICAgPDwmXGNyCi0mNSYmbGVmdCYmPT0gICAgICAgICAhPSAgICAgICA+ICAgICAgPCAgICAgIDw9ICAgICAgPj0mXGNyCi0mNiYmbGVmdCYmXCYmXGNyCi0mNyYmbGVmdCYmfCZcY3IKLSY4JiZsZWZ0JiZ7XCZcJn0mXGNyCi0mOSYmbGVmdCYmfHwmXGNyCi0mMTAmJnJpZ2h0JiY/ICAgICAgICA6JlxjcgotJjExJiZyaWdodCYmXHFxdWFkXCY9ICAgICAgKz0gICAgICAgLT0gICAgICo9ICAgICAvPVxxcXVhZFxkZGFnJlxjcgotJmxvd2VzdCYmJiYmXGNyCi1oZWlnaHQycHQmXG9taXQmJlxvbWl0JiZcb21pdCZcY3J9Ci1caHJ1bGV9Ci1AZW5kIHRleAotQGlmdGV4Ci17Ci1Ab2JleWxpbmVzQHBhcnNraXA9MHB0QHBhcmluZGVudD0wcHQKLUBkYWdAcXVhZCBQcmVmaXggb3BlcmF0b3JzLgotQGRkYWdAcXVhZCBAeHJlZntBc3NpZ25tZW50c30uCi19Ci1AZW5kIGlmdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotQG5vZGUgRXZhbHVhdGlvbgotQHN1YnNlY3Rpb24gRXZhbHVhdGlvbgotQGNpbmRleCBsYXp5IGV2YWx1YXRpb24KLUBjaW5kZXggZXhwcmVzc2lvbiBldmFsdWF0aW9uIG9yZGVyCi1UaGUgbGlua2VyIGV2YWx1YXRlcyBleHByZXNzaW9ucyBsYXppbHkuICBJdCBvbmx5IGNvbXB1dGVzIHRoZSB2YWx1ZSBvZgotYW4gZXhwcmVzc2lvbiB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgotCi1UaGUgbGlua2VyIG5lZWRzIHNvbWUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHZhbHVlIG9mIHRoZSBzdGFydAotYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgYW5kIHRoZSBvcmlnaW5zIGFuZCBsZW5ndGhzIG9mIG1lbW9yeQotcmVnaW9ucywgaW4gb3JkZXIgdG8gZG8gYW55IGxpbmtpbmcgYXQgYWxsLiAgVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZAotYXMgc29vbiBhcyBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVhZHMgaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUhvd2V2ZXIsIG90aGVyIHZhbHVlcyAoc3VjaCBhcyBzeW1ib2wgdmFsdWVzKSBhcmUgbm90IGtub3duIG9yIG5lZWRlZAotdW50aWwgYWZ0ZXIgc3RvcmFnZSBhbGxvY2F0aW9uLiAgU3VjaCB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBsYXRlciwgd2hlbgotb3RoZXIgaW5mb3JtYXRpb24gKHN1Y2ggYXMgdGhlIHNpemVzIG9mIG91dHB1dCBzZWN0aW9ucykgaXMgYXZhaWxhYmxlCi1mb3IgdXNlIGluIHRoZSBzeW1ib2wgYXNzaWdubWVudCBleHByZXNzaW9uLgotCi1UaGUgc2l6ZXMgb2Ygc2VjdGlvbnMgY2Fubm90IGJlIGtub3duIHVudGlsIGFmdGVyIGFsbG9jYXRpb24sIHNvCi1hc3NpZ25tZW50cyBkZXBlbmRlbnQgdXBvbiB0aGVzZSBhcmUgbm90IHBlcmZvcm1lZCB1bnRpbCBhZnRlcgotYWxsb2NhdGlvbi4KLQotU29tZSBleHByZXNzaW9ucywgc3VjaCBhcyB0aG9zZSBkZXBlbmRpbmcgdXBvbiB0aGUgbG9jYXRpb24gY291bnRlcgotQHNhbXB7Ln0sIG11c3QgYmUgZXZhbHVhdGVkIGR1cmluZyBzZWN0aW9uIGFsbG9jYXRpb24uCi0KLUlmIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBpcyByZXF1aXJlZCwgYnV0IHRoZSB2YWx1ZSBpcyBub3QKLWF2YWlsYWJsZSwgdGhlbiBhbiBlcnJvciByZXN1bHRzLiAgRm9yIGV4YW1wbGUsIGEgc2NyaXB0IGxpa2UgdGhlCi1mb2xsb3dpbmcKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMKLSAgQHsKLSAgICAudGV4dCA5K3RoaXNfaXNudF9jb25zdGFudCA6IAotICAgICAgQHsgKigudGV4dCkgQH0KLSAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdpbGwgY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2UgQHNhbXB7bm9uIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIGluaXRpYWwKLWFkZHJlc3N9LgotCi1Abm9kZSBFeHByZXNzaW9uIFNlY3Rpb24KLUBzdWJzZWN0aW9uIFRoZSBTZWN0aW9uIG9mIGFuIEV4cHJlc3Npb24KLUBjaW5kZXggZXhwcmVzc2lvbiBzZWN0aW9ucwotQGNpbmRleCBhYnNvbHV0ZSBleHByZXNzaW9ucwotQGNpbmRleCByZWxhdGl2ZSBleHByZXNzaW9ucwotQGNpbmRleCBhYnNvbHV0ZSBhbmQgcmVsb2NhdGFibGUgc3ltYm9scwotQGNpbmRleCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUKLVdoZW4gdGhlIGxpbmtlciBldmFsdWF0ZXMgYW4gZXhwcmVzc2lvbiwgdGhlIHJlc3VsdCBpcyBlaXRoZXIgYWJzb2x1dGUKLW9yIHJlbGF0aXZlIHRvIHNvbWUgc2VjdGlvbi4gIEEgcmVsYXRpdmUgZXhwcmVzc2lvbiBpcyBleHByZXNzZWQgYXMgYQotZml4ZWQgb2Zmc2V0IGZyb20gdGhlIGJhc2Ugb2YgYSBzZWN0aW9uLgotCi1UaGUgcG9zaXRpb24gb2YgdGhlIGV4cHJlc3Npb24gd2l0aGluIHRoZSBsaW5rZXIgc2NyaXB0IGRldGVybWluZXMKLXdoZXRoZXIgaXQgaXMgYWJzb2x1dGUgb3IgcmVsYXRpdmUuICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgd2l0aGluCi1hbiBvdXRwdXQgc2VjdGlvbiBkZWZpbml0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24uICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgZWxzZXdoZXJlIHdpbGwgYmUgYWJzb2x1dGUuCi0KLUEgc3ltYm9sIHNldCB0byBhIHJlbGF0aXZlIGV4cHJlc3Npb24gd2lsbCBiZSByZWxvY2F0YWJsZSBpZiB5b3UgcmVxdWVzdAotcmVsb2NhdGFibGUgb3V0cHV0IHVzaW5nIHRoZSBAc2FtcHstcn0gb3B0aW9uLiAgVGhhdCBtZWFucyB0aGF0IGEKLWZ1cnRoZXIgbGluayBvcGVyYXRpb24gbWF5IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFRoZSBzeW1ib2wncwotc2VjdGlvbiB3aWxsIGJlIHRoZSBzZWN0aW9uIG9mIHRoZSByZWxhdGl2ZSBleHByZXNzaW9uLgotCi1BIHN5bWJvbCBzZXQgdG8gYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aWxsIHJldGFpbiB0aGUgc2FtZSB2YWx1ZQotdGhyb3VnaCBhbnkgZnVydGhlciBsaW5rIG9wZXJhdGlvbi4gIFRoZSBzeW1ib2wgd2lsbCBiZSBhYnNvbHV0ZSwgYW5kCi13aWxsIG5vdCBoYXZlIGFueSBwYXJ0aWN1bGFyIGFzc29jaWF0ZWQgc2VjdGlvbi4KLQotWW91IGNhbiB1c2UgdGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7QUJTT0xVVEV9IHRvIGZvcmNlIGFuIGV4cHJlc3Npb24KLXRvIGJlIGFic29sdXRlIHdoZW4gaXQgd291bGQgb3RoZXJ3aXNlIGJlIHJlbGF0aXZlLiAgRm9yIGV4YW1wbGUsIHRvCi1jcmVhdGUgYW4gYWJzb2x1dGUgc3ltYm9sIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24gQHNhbXB7LmRhdGF9OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLSAgQHsKLSAgICAuZGF0YSA6IEB7ICooLmRhdGEpIF9lZGF0YSA9IEFCU09MVVRFKC4pOyBAfQotICBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSWYgQHNhbXB7QUJTT0xVVEV9IHdlcmUgbm90IHVzZWQsIEBzYW1we19lZGF0YX0gd291bGQgYmUgcmVsYXRpdmUgdG8gdGhlCi1Ac2FtcHsuZGF0YX0gc2VjdGlvbi4KLQotQG5vZGUgQnVpbHRpbiBGdW5jdGlvbnMKLUBzdWJzZWN0aW9uIEJ1aWx0aW4gRnVuY3Rpb25zCi1AY2luZGV4IGZ1bmN0aW9ucyBpbiBleHByZXNzaW9ucwotVGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgaW5jbHVkZXMgYSBudW1iZXIgb2YgYnVpbHRpbiBmdW5jdGlvbnMgZm9yCi11c2UgaW4gbGlua2VyIHNjcmlwdCBleHByZXNzaW9ucy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBBQlNPTFVURShAdmFye2V4cH0pCi1Aa2luZGV4IEFCU09MVVRFKEB2YXJ7ZXhwfSkKLUBjaW5kZXggZXhwcmVzc2lvbiwgYWJzb2x1dGUKLVJldHVybiB0aGUgYWJzb2x1dGUgKG5vbi1yZWxvY2F0YWJsZSwgYXMgb3Bwb3NlZCB0byBub24tbmVnYXRpdmUpIHZhbHVlCi1vZiB0aGUgZXhwcmVzc2lvbiBAdmFye2V4cH0uICBQcmltYXJpbHkgdXNlZnVsIHRvIGFzc2lnbiBhbiBhYnNvbHV0ZQotdmFsdWUgdG8gYSBzeW1ib2wgd2l0aGluIGEgc2VjdGlvbiBkZWZpbml0aW9uLCB3aGVyZSBzeW1ib2wgdmFsdWVzIGFyZQotbm9ybWFsbHkgc2VjdGlvbiByZWxhdGl2ZS4gIEB4cmVme0V4cHJlc3Npb24gU2VjdGlvbn0uCi0KLUBpdGVtIEFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggQUREUihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBhZGRyZXNzICh0aGUgVk1BKSBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFlvdXIKLXNjcmlwdCBtdXN0IHByZXZpb3VzbHkgaGF2ZSBkZWZpbmVkIHRoZSBsb2NhdGlvbiBvZiB0aGF0IHNlY3Rpb24uICBJbgotdGhlIGZvbGxvd2luZyBleGFtcGxlLCBAY29kZXtzeW1ib2xfMX0gYW5kIEBjb2Rle3N5bWJvbF8yfSBhcmUgYXNzaWduZWQKLWlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7IEBkb3Rze30KLSAgLm91dHB1dDEgOgotICAgIEB7IAotICAgIHN0YXJ0X29mX291dHB1dF8xID0gQUJTT0xVVEUoLik7Ci0gICAgQGRvdHN7fQotICAgIEB9Ci0gIC5vdXRwdXQgOgotICAgIEB7Ci0gICAgc3ltYm9sXzEgPSBBRERSKC5vdXRwdXQxKTsKLSAgICBzeW1ib2xfMiA9IHN0YXJ0X29mX291dHB1dF8xOwotICAgIEB9Ci1AZG90c3t9IEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBBTElHTihAdmFye2V4cH0pCi1Aa2luZGV4IEFMSUdOKEB2YXJ7ZXhwfSkKLUBjaW5kZXggcm91bmQgdXAgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBhbGlnbiBsb2NhdGlvbiBjb3VudGVyCi1SZXR1cm4gdGhlIGxvY2F0aW9uIGNvdW50ZXIgKEBjb2Rley59KSBhbGlnbmVkIHRvIHRoZSBuZXh0IEB2YXJ7ZXhwfQotYm91bmRhcnkuICBAdmFye2V4cH0gbXVzdCBiZSBhbiBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgcG93ZXIgb2YKLXR3by4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotQHNtYWxsZXhhbXBsZQotKC4gKyBAdmFye2V4cH0gLSAxKSAmIH4oQHZhcntleHB9IC0gMSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle0FMSUdOfSBkb2Vzbid0IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXItLS1pdCBqdXN0Ci1kb2VzIGFyaXRobWV0aWMgb24gaXQuICBIZXJlIGlzIGFuIGV4YW1wbGUgd2hpY2ggYWxpZ25zIHRoZSBvdXRwdXQKLUBjb2Rley5kYXRhfSBzZWN0aW9uIHRvIHRoZSBuZXh0IEBjb2RlezB4MjAwMH0gYnl0ZSBib3VuZGFyeSBhZnRlciB0aGUKLXByZWNlZGluZyBzZWN0aW9uIGFuZCBzZXRzIGEgdmFyaWFibGUgd2l0aGluIHRoZSBzZWN0aW9uIHRvIHRoZSBuZXh0Ci1AY29kZXsweDgwMDB9IGJvdW5kYXJ5IGFmdGVyIHRoZSBpbnB1dCBzZWN0aW9uczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAuZGF0YSBBTElHTigweDIwMDApOiBAewotICAgICooLmRhdGEpCi0gICAgdmFyaWFibGUgPSBBTElHTigweDgwMDApOwotICBAfQotQGRvdHN7fSBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhlIGZpcnN0IHVzZSBvZiBAY29kZXtBTElHTn0gaW4gdGhpcyBleGFtcGxlIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YKLWEgc2VjdGlvbiBiZWNhdXNlIGl0IGlzIHVzZWQgYXMgdGhlIG9wdGlvbmFsIEB2YXJ7YWRkcmVzc30gYXR0cmlidXRlIG9mCi1hIHNlY3Rpb24gZGVmaW5pdGlvbiAoQHB4cmVme091dHB1dCBTZWN0aW9uIEFkZHJlc3N9KS4gIFRoZSBzZWNvbmQgdXNlCi1vZiBAY29kZXtBTElHTn0gaXMgdXNlZCB0byBkZWZpbmVzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4KLQotVGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7TkVYVH0gaXMgY2xvc2VseSByZWxhdGVkIHRvIEBjb2Rle0FMSUdOfS4KLQotQGl0ZW0gQkxPQ0soQHZhcntleHB9KQotQGtpbmRleCBCTE9DSyhAdmFye2V4cH0pCi1UaGlzIGlzIGEgc3lub255bSBmb3IgQGNvZGV7QUxJR059LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGxpbmtlcgotc2NyaXB0cy4gIEl0IGlzIG1vc3Qgb2Z0ZW4gc2VlbiB3aGVuIHNldHRpbmcgdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0Ci1zZWN0aW9uLgotCi1AaXRlbSBERUZJTkVEKEB2YXJ7c3ltYm9sfSkKLUBraW5kZXggREVGSU5FRChAdmFye3N5bWJvbH0pCi1AY2luZGV4IHN5bWJvbCBkZWZhdWx0cwotUmV0dXJuIDEgaWYgQHZhcntzeW1ib2x9IGlzIGluIHRoZSBsaW5rZXIgZ2xvYmFsIHN5bWJvbCB0YWJsZSBhbmQgaXMKLWRlZmluZWQsIG90aGVyd2lzZSByZXR1cm4gMC4gIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gcHJvdmlkZQotZGVmYXVsdCB2YWx1ZXMgZm9yIHN5bWJvbHMuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzY3JpcHQgZnJhZ21lbnQKLXNob3dzIGhvdyB0byBzZXQgYSBnbG9iYWwgc3ltYm9sIEBzYW1we2JlZ2lufSB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4KLXRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbi0tLWJ1dCBpZiBhIHN5bWJvbCBjYWxsZWQgQHNhbXB7YmVnaW59IGFscmVhZHkKLWV4aXN0ZWQsIGl0cyB2YWx1ZSBpcyBwcmVzZXJ2ZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAudGV4dCA6IEB7Ci0gICAgYmVnaW4gPSBERUZJTkVEKGJlZ2luKSA/IGJlZ2luIDogLiA7Ci0gICAgQGRvdHN7fQotICBAfQotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBMTUEgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBUaGlzIGlzIG5vcm1hbGx5Ci10aGUgc2FtZSBhcyBAY29kZXtBRERSfSwgYnV0IGl0IG1heSBiZSBkaWZmZXJlbnQgaWYgdGhlIEBjb2Rle0FUfQotYXR0cmlidXRlIGlzIHVzZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uIGRlZmluaXRpb24gKEBweHJlZntPdXRwdXQKLVNlY3Rpb24gTE1BfSkuCi0KLUBraW5kZXggTUFYCi1AaXRlbSBNQVgoQHZhcntleHAxfSwgQHZhcntleHAyfSkKLVJldHVybnMgdGhlIG1heGltdW0gb2YgQHZhcntleHAxfSBhbmQgQHZhcntleHAyfS4KLQotQGtpbmRleCBNSU4KLUBpdGVtIE1JTihAdmFye2V4cDF9LCBAdmFye2V4cDJ9KQotUmV0dXJucyB0aGUgbWluaW11bSBvZiBAdmFye2V4cDF9IGFuZCBAdmFye2V4cDJ9LgotCi1AaXRlbSBORVhUKEB2YXJ7ZXhwfSkKLUBraW5kZXggTkVYVChAdmFye2V4cH0pCi1AY2luZGV4IHVuYWxsb2NhdGVkIGFkZHJlc3MsIG5leHQKLVJldHVybiB0aGUgbmV4dCB1bmFsbG9jYXRlZCBhZGRyZXNzIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiBAdmFye2V4cH0uCi1UaGlzIGZ1bmN0aW9uIGlzIGNsb3NlbHkgcmVsYXRlZCB0byBAY29kZXtBTElHTihAdmFye2V4cH0pfTsgdW5sZXNzIHlvdQotdXNlIHRoZSBAY29kZXtNRU1PUll9IGNvbW1hbmQgdG8gZGVmaW5lIGRpc2NvbnRpbnVvdXMgbWVtb3J5IGZvciB0aGUKLW91dHB1dCBmaWxlLCB0aGUgdHdvIGZ1bmN0aW9ucyBhcmUgZXF1aXZhbGVudC4KLQotQGl0ZW0gU0laRU9GKEB2YXJ7c2VjdGlvbn0pCi1Aa2luZGV4IFNJWkVPRihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufSwgaWYgdGhhdCBzZWN0aW9uIGhhcwotYmVlbiBhbGxvY2F0ZWQuICBJZiB0aGUgc2VjdGlvbiBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHdoZW4gdGhpcyBpcwotZXZhbHVhdGVkLCB0aGUgbGlua2VyIHdpbGwgcmVwb3J0IGFuIGVycm9yLiAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLAotQGNvZGV7c3ltYm9sXzF9IGFuZCBAY29kZXtzeW1ib2xfMn0gYXJlIGFzc2lnbmVkIGlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TQHsgQGRvdHN7fQotICAub3V0cHV0IEB7Ci0gICAgLnN0YXJ0ID0gLiA7Ci0gICAgQGRvdHN7fQotICAgIC5lbmQgPSAuIDsKLSAgICBAfQotICBzeW1ib2xfMSA9IC5lbmQgLSAuc3RhcnQgOwotICBzeW1ib2xfMiA9IFNJWkVPRigub3V0cHV0KTsKLUBkb3Rze30gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIFNJWkVPRl9IRUFERVJTCi1AaXRlbXggc2l6ZW9mX2hlYWRlcnMKLUBraW5kZXggU0laRU9GX0hFQURFUlMKLUBjaW5kZXggaGVhZGVyIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUncyBoZWFkZXJzLiAgVGhpcyBpcwotaW5mb3JtYXRpb24gd2hpY2ggYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgdGhlIG91dHB1dCBmaWxlLiAgWW91IGNhbiB1c2UKLXRoaXMgbnVtYmVyIHdoZW4gc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgaWYgeW91Ci1jaG9vc2UsIHRvIGZhY2lsaXRhdGUgcGFnaW5nLgotCi1AY2luZGV4IG5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycywgbm90IGVub3VnaCByb29tCi1XaGVuIHByb2R1Y2luZyBhbiBFTEYgb3V0cHV0IGZpbGUsIGlmIHRoZSBsaW5rZXIgc2NyaXB0IHVzZXMgdGhlCi1AY29kZXtTSVpFT0ZfSEVBREVSU30gYnVpbHRpbiBmdW5jdGlvbiwgdGhlIGxpbmtlciBtdXN0IGNvbXB1dGUgdGhlCi1udW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzIGJlZm9yZSBpdCBoYXMgZGV0ZXJtaW5lZCBhbGwgdGhlIHNlY3Rpb24KLWFkZHJlc3NlcyBhbmQgc2l6ZXMuICBJZiB0aGUgbGlua2VyIGxhdGVyIGRpc2NvdmVycyB0aGF0IGl0IG5lZWRzCi1hZGRpdGlvbmFsIHByb2dyYW0gaGVhZGVycywgaXQgd2lsbCByZXBvcnQgYW4gZXJyb3IgQHNhbXB7bm90IGVub3VnaAotcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzfS4gIFRvIGF2b2lkIHRoaXMgZXJyb3IsIHlvdSBtdXN0IGF2b2lkIHVzaW5nCi10aGUgQGNvZGV7U0laRU9GX0hFQURFUlN9IGZ1bmN0aW9uLCBvciB5b3UgbXVzdCByZXdvcmsgeW91ciBsaW5rZXIKLXNjcmlwdCB0byBhdm9pZCBmb3JjaW5nIHRoZSBsaW5rZXIgdG8gdXNlIGFkZGl0aW9uYWwgcHJvZ3JhbSBoZWFkZXJzLCBvcgoteW91IG11c3QgZGVmaW5lIHRoZSBwcm9ncmFtIGhlYWRlcnMgeW91cnNlbGYgdXNpbmcgdGhlIEBjb2Rle1BIRFJTfQotY29tbWFuZCAoQHB4cmVme1BIRFJTfSkuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEltcGxpY2l0IExpbmtlciBTY3JpcHRzCi1Ac2VjdGlvbiBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0cwotQGNpbmRleCBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0cwotSWYgeW91IHNwZWNpZnkgYSBsaW5rZXIgaW5wdXQgZmlsZSB3aGljaCB0aGUgbGlua2VyIGNhbiBub3QgcmVjb2duaXplIGFzCi1hbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlIGZpbGUsIGl0IHdpbGwgdHJ5IHRvIHJlYWQgdGhlIGZpbGUgYXMgYQotbGlua2VyIHNjcmlwdC4gIElmIHRoZSBmaWxlIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgbGlua2VyIHNjcmlwdCwgdGhlCi1saW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuCi0KLUFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQgd2lsbCBub3QgcmVwbGFjZSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi1UeXBpY2FsbHkgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3b3VsZCBjb250YWluIG9ubHkgc3ltYm9sCi1hc3NpZ25tZW50cywgb3IgdGhlIEBjb2Rle0lOUFVUfSwgQGNvZGV7R1JPVVB9LCBvciBAY29kZXtWRVJTSU9OfQotY29tbWFuZHMuCi0KLUFueSBpbnB1dCBmaWxlcyByZWFkIGJlY2F1c2Ugb2YgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3aWxsIGJlIHJlYWQKLWF0IHRoZSBwb3NpdGlvbiBpbiB0aGUgY29tbWFuZCBsaW5lIHdoZXJlIHRoZSBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0IHdhcwotcmVhZC4gIFRoaXMgY2FuIGFmZmVjdCBhcmNoaXZlIHNlYXJjaGluZy4KLQotQGlmc2V0IEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW50Ci1AY2hhcHRlciBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IG1hY2hpbmUgZGVwZW5kZW5jaWVzCi1AY29kZXtsZH0gaGFzIGFkZGl0aW9uYWwgZmVhdHVyZXMgb24gc29tZSBwbGF0Zm9ybXM7IHRoZSBmb2xsb3dpbmcKLXNlY3Rpb25zIGRlc2NyaWJlIHRoZW0uICBNYWNoaW5lcyB3aGVyZSBAY29kZXtsZH0gaGFzIG5vIGFkZGl0aW9uYWwKLWZ1bmN0aW9uYWxpdHkgYXJlIG5vdCBsaXN0ZWQuCi0KLUBtZW51Ci0qIEg4LzMwMDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rle2xkfSBhbmQgdGhlIEg4LzMwMAotKiBpOTYwOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5Ci0qIEFSTTo6CQkJCUBjb2Rle2xkfSBhbmQgdGhlIEFSTSBmYW1pbHkKLUBlbmQgbWVudQotQGVuZCBpZnNldAotCi1AYyBGSVhNRSEgIFRoaXMgY291bGQgdXNlIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zLCBidXQgdGhlcmUgc2VlbXMgdG8gYmUgYSBjb25mbGljdAotQGMgICAgICAgICBiZXR3ZWVuIHRob3NlIGFuZCBub2RlLWRlZmF1bHRpbmcuCi1AaWZzZXQgSDgzMDAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSDgvMzAwCi1Ac2VjdGlvbiBAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDAKLQotQGNpbmRleCBIOC8zMDAgc3VwcG9ydAotRm9yIHRoZSBIOC8zMDAsIEBjb2Rle2xkfSBjYW4gcGVyZm9ybSB0aGVzZSBnbG9iYWwgb3B0aW1pemF0aW9ucyB3aGVuCi15b3Ugc3BlY2lmeSB0aGUgQHNhbXB7LS1yZWxheH0gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotQHRhYmxlIEBlbXBoCi1AY2luZGV4IHJlbGF4aW5nIG9uIEg4LzMwMAotQGl0ZW0gcmVsYXhpbmcgYWRkcmVzcyBtb2RlcwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXtqc3J9IGFuZCBAY29kZXtqbXB9IGluc3RydWN0aW9ucyB3aG9zZQotdGFyZ2V0cyBhcmUgd2l0aGluIGVpZ2h0IGJpdHMsIGFuZCB0dXJucyB0aGVtIGludG8gZWlnaHQtYml0Ci1wcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YnNyfSBhbmQgQGNvZGV7YnJhfSBpbnN0cnVjdGlvbnMsCi1yZXNwZWN0aXZlbHkuCi0KLUBjaW5kZXggc3ludGhlc2l6aW5nIG9uIEg4LzMwMAotQGl0ZW0gc3ludGhlc2l6aW5nIGluc3RydWN0aW9ucwotQGMgRklYTUU6IHNwZWNpZmljYWxseSBtb3YuYiwgb3IgYW55IG1vdiBpbnN0cnVjdGlvbnMgcmVhbGx5PwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXttb3YuYn0gaW5zdHJ1Y3Rpb25zIHdoaWNoIHVzZSB0aGUKLXNpeHRlZW4tYml0IGFic29sdXRlIGFkZHJlc3MgZm9ybSwgYnV0IHJlZmVyIHRvIHRoZSB0b3AKLXBhZ2Ugb2YgbWVtb3J5LCBhbmQgY2hhbmdlcyB0aGVtIHRvIHVzZSB0aGUgZWlnaHQtYml0IGFkZHJlc3MgZm9ybS4KLShUaGF0IGlzOiB0aGUgbGlua2VyIHR1cm5zIEBzYW1we21vdi5iIEBjb2Rle0BAfUB2YXJ7YWF9OjE2fSBpbnRvCi1Ac2FtcHttb3YuYiBAY29kZXtAQH1AdmFye2FhfTo4fSB3aGVuZXZlciB0aGUgYWRkcmVzcyBAdmFye2FhfSBpcyBpbiB0aGUKLXRvcCBwYWdlIG9mIG1lbW9yeSkuCi1AZW5kIHRhYmxlCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEhpdGFjaGkKLUBjIFRoaXMgc3R1ZmYgaXMgcG9pbnRsZXNzIHRvIHNheSB1bmxlc3MgeW91J3JlIGVzcGVjaWFsbHkgY29uY2VybmVkCi1AYyB3aXRoIEhpdGFjaGkgY2hpcHM7IGRvbid0IGVuYWJsZSBpdCBmb3IgZ2VuZXJpYyBjYXNlLCBwbGVhc2UuCi1Abm9kZSBIaXRhY2hpCi1AY2hhcHRlciBAY29kZXtsZH0gYW5kIG90aGVyIEhpdGFjaGkgY2hpcHMKLQotQGNvZGV7bGR9IGFsc28gc3VwcG9ydHMgdGhlIEg4LzMwMEgsIHRoZSBIOC81MDAsIGFuZCB0aGUgSGl0YWNoaSBTSC4gIE5vCi1zcGVjaWFsIGZlYXR1cmVzLCBjb21tYW5kcywgb3IgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGZvcgotdGhlc2UgY2hpcHMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IEk5NjAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgaTk2MAotQHNlY3Rpb24gQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwIGZhbWlseQotCi1AY2luZGV4IGk5NjAgc3VwcG9ydAotCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LUFAdmFye2FyY2hpdGVjdHVyZX19IGNvbW1hbmQgbGluZSBvcHRpb24gdG8KLXNwZWNpZnkgb25lIG9mIHRoZSB0d28tbGV0dGVyIG5hbWVzIGlkZW50aWZ5aW5nIG1lbWJlcnMgb2YgdGhlIDk2MAotZmFtaWx5OyB0aGUgb3B0aW9uIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBvdXRwdXQgdGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55Ci1pbmNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBpbnB1dCBmaWxlcy4gIEl0IGFsc28gbW9kaWZpZXMgdGhlCi1saW5rZXIncyBzZWFyY2ggc3RyYXRlZ3kgZm9yIGFyY2hpdmUgbGlicmFyaWVzLCB0byBzdXBwb3J0IHRoZSB1c2Ugb2YKLWxpYnJhcmllcyBzcGVjaWZpYyB0byBlYWNoIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLCBieSBpbmNsdWRpbmcgaW4gdGhlCi1zZWFyY2ggbG9vcCBuYW1lcyBzdWZmaXhlZCB3aXRoIHRoZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGFyY2hpdGVjdHVyZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdXIgQGNvZGV7bGR9IGNvbW1hbmQgbGluZSBpbmNsdWRlZCBAd3tAc2FtcHstQUNBfX0gYXMKLXdlbGwgYXMgQHd7QHNhbXB7LWx0cnl9fSwgdGhlIGxpbmtlciB3b3VsZCBsb29rIChpbiBpdHMgYnVpbHQtaW4gc2VhcmNoCi1wYXRocywgYW5kIGluIGFueSBwYXRocyB5b3Ugc3BlY2lmeSB3aXRoIEBzYW1wey1MfSkgZm9yIGEgbGlicmFyeSB3aXRoCi10aGUgbmFtZXMKLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi10cnkKLWxpYnRyeS5hCi10cnljYQotbGlidHJ5Y2EuYQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Ci10d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIEB3e0BzYW1wey1BQ0F9fS4KLQotWW91IGNhbiBtZWFuaW5nZnVsbHkgdXNlIEBzYW1wey1BfSBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgc2luY2UKLXRoZSA5NjAgYXJjaGl0ZWN0dXJlIGZhbWlseSBhbGxvd3MgY29tYmluYXRpb24gb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZXM7IGVhY2gKLXVzZSB3aWxsIGFkZCBhbm90aGVyIHBhaXIgb2YgbmFtZSB2YXJpYW50cyB0byBzZWFyY2ggZm9yIHdoZW4gQHd7QHNhbXB7LWx9fQotc3BlY2lmaWVzIGEgbGlicmFyeS4KLQotQGNpbmRleCBAY29kZXstLXJlbGF4fSBvbiBpOTYwCi1AY2luZGV4IHJlbGF4aW5nIG9uIGk5NjAKLUBjb2Rle2xkfSBzdXBwb3J0cyB0aGUgQHNhbXB7LS1yZWxheH0gb3B0aW9uIGZvciB0aGUgaTk2MCBmYW1pbHkuICBJZgoteW91IHNwZWNpZnkgQHNhbXB7LS1yZWxheH0sIEBjb2Rle2xkfSBmaW5kcyBhbGwgQGNvZGV7YmFseH0gYW5kCi1AY29kZXtjYWx4fSBpbnN0cnVjdGlvbnMgd2hvc2UgdGFyZ2V0cyBhcmUgd2l0aGluIDI0IGJpdHMsIGFuZCB0dXJucwotdGhlbSBpbnRvIDI0LWJpdCBwcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YmFsfSBhbmQgQGNvZGV7Y2FsfQotaW5zdHJ1Y3Rpb25zLCByZXNwZWN0aXZlbHkuICBAY29kZXtsZH0gYWxzbyB0dXJucyBAY29kZXtjYWx9Ci1pbnN0cnVjdGlvbnMgaW50byBAY29kZXtiYWx9IGluc3RydWN0aW9ucyB3aGVuIGl0IGRldGVybWluZXMgdGhhdCB0aGUKLXRhcmdldCBzdWJyb3V0aW5lIGlzIGEgbGVhZiByb3V0aW5lICh0aGF0IGlzLCB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgZG9lcwotbm90IGl0c2VsZiBjYWxsIGFueSBzdWJyb3V0aW5lcykuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQHJhaXNlc2VjdGlvbnMKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBBUk0KLUBzZWN0aW9uIEBjb2Rle2xkfSdzIHN1cHBvcnQgZm9yIGludGVyd29ya2luZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgY29kZQotCi1AY2luZGV4IEFSTSBpbnRlcndvcmtpbmcgc3VwcG9ydAotQGtpbmRleCAtLXN1cHBvcnQtb2xkLWNvZGUKLUZvciB0aGUgQVJNLCBAY29kZXtsZH0gd2lsbCBnZW5lcmF0ZSBjb2RlIHN0dWJzIHRvIGFsbG93IGZ1bmN0aW9ucyBjYWxscwotYmV0d2VlbSBBUk0gYW5kIFRodW1iIGNvZGUuICBUaGVzZSBzdHVicyBvbmx5IHdvcmsgd2l0aCBjb2RlIHRoYXQgaGFzCi1iZWVuIGNvbXBpbGVkIGFuZCBhc3NlbWJsZWQgd2l0aCB0aGUgQHNhbXB7LW10aHVtYi1pbnRlcndvcmt9IGNvbW1hbmQKLWxpbmUgb3B0aW9uLiAgSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpbmsgd2l0aCBvbGQgQVJNIG9iamVjdCBmaWxlcyBvcgotbGlicmFyaWVzLCB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggdGhlIC1tdGh1bWItaW50ZXJ3b3JrCi1vcHRpb24gdGhlbiB0aGUgQHNhbXB7LS1zdXBwb3J0LW9sZC1jb2RlfSBjb21tYW5kIGxpbmUgc3dpdGNoIHNob3VsZCBiZQotZ2l2ZW4gdG8gdGhlIGxpbmtlci4gIFRoaXMgd2lsbCBtYWtlIGl0IGdlbmVyYXRlIGxhcmdlciBzdHViIGZ1bmN0aW9ucwotd2hpY2ggd2lsbCB3b3JrIHdpdGggbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4gIE5vdGUsIGhvd2V2ZXIsCi10aGUgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZ2VuZXJhdGluZyBzdHVicyBmb3IgZnVuY3Rpb24gY2FsbHMgdG8KLW5vbi1pbnRlcndvcmtpbmcgYXdhcmUgVGh1bWIgY29kZS4KLQotQGNpbmRleCB0aHVtYiBlbnRyeSBwb2ludAotQGNpbmRleCBlbnRyeSBwb2ludCwgdGh1bWIKLUBraW5kZXggLS10aHVtYi1lbnRyeT1AdmFye2VudHJ5fQotVGhlIEBzYW1wey0tdGh1bWItZW50cnl9IHN3aXRjaCBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgZ2VuZXJpYwotQHNhbXB7LS1lbnRyeX0gc3dpdGNoLCBpbiB0aGF0IGl0IHNldHMgdGhlIHByb2dyYW0ncyBzdGFydGluZyBhZGRyZXNzLiAgCi1CdXQgaXQgYWxzbyBzZXRzIHRoZSBib3R0b20gYml0IG9mIHRoZSBhZGRyZXNzLCBzbyB0aGF0IGl0IGNhbiBiZQotYnJhbmNoZWQgdG8gdXNpbmcgYSBCWCBpbnN0cnVjdGlvbiwgYW5kIHRoZSBwcm9ncmFtIHdpbGwgc3RhcnQKLWV4ZWN1dGluZyBpbiBUaHVtYiBtb2RlIHN0cmFpZ2h0IGF3YXkuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1Abm9kZSBCRkQKLUBjaGFwdGVyIEJGRAotCi1AY2luZGV4IGJhY2sgZW5kCi1AY2luZGV4IG9iamVjdCBmaWxlIG1hbmFnZW1lbnQKLUBjaW5kZXggb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCi1Aa2luZGV4IG9iamR1bXAgLWkKLVRoZSBsaW5rZXIgYWNjZXNzZXMgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzIHVzaW5nIHRoZSBCRkQgbGlicmFyaWVzLgotVGhlc2UgbGlicmFyaWVzIGFsbG93IHRoZSBsaW5rZXIgdG8gdXNlIHRoZSBzYW1lIHJvdXRpbmVzIHRvIG9wZXJhdGUgb24KLW9iamVjdCBmaWxlcyB3aGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgQSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKLWZvcm1hdCBjYW4gYmUgc3VwcG9ydGVkIHNpbXBseSBieSBjcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQgYW5kIGFkZGluZwotaXQgdG8gdGhlIGxpYnJhcnkuICBUbyBjb25zZXJ2ZSBydW50aW1lIG1lbW9yeSwgaG93ZXZlciwgdGhlIGxpbmtlciBhbmQKLWFzc29jaWF0ZWQgdG9vbHMgYXJlIHVzdWFsbHkgY29uZmlndXJlZCB0byBzdXBwb3J0IG9ubHkgYSBzdWJzZXQgb2YgdGhlCi1vYmplY3QgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZS4gIFlvdSBjYW4gdXNlIEBjb2Rle29iamR1bXAgLWl9Ci0oQHB4cmVme29iamR1bXAsLG9iamR1bXAsYmludXRpbHMuaW5mbyxUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXN9KSB0bwotbGlzdCBhbGwgdGhlIGZvcm1hdHMgYXZhaWxhYmxlIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24uCi0KLUBjaW5kZXggQkZEIHJlcXVpcmVtZW50cwotQGNpbmRleCByZXF1aXJlbWVudHMgZm9yIEJGRAotQXMgd2l0aCBtb3N0IGltcGxlbWVudGF0aW9ucywgQkZEIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuCi1zZXZlcmFsIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cy4gVGhlIG1ham9yIGZhY3RvciBpbmZsdWVuY2luZwotQkZEIGRlc2lnbiB3YXMgZWZmaWNpZW5jeTogYW55IHRpbWUgdXNlZCBjb252ZXJ0aW5nIGJldHdlZW4KLWZvcm1hdHMgaXMgdGltZSB3aGljaCB3b3VsZCBub3QgaGF2ZSBiZWVuIHNwZW50IGhhZCBCRkQgbm90Ci1iZWVuIGludm9sdmVkLiBUaGlzIGlzIHBhcnRseSBvZmZzZXQgYnkgYWJzdHJhY3Rpb24gcGF5YmFjazsgc2luY2UKLUJGRCBzaW1wbGlmaWVzIGFwcGxpY2F0aW9ucyBhbmQgYmFjayBlbmRzLCBtb3JlIHRpbWUgYW5kIGNhcmUKLW1heSBiZSBzcGVudCBvcHRpbWl6aW5nIGFsZ29yaXRobXMgZm9yIGEgZ3JlYXRlciBzcGVlZC4KLQotT25lIG1pbm9yIGFydGlmYWN0IG9mIHRoZSBCRkQgc29sdXRpb24gd2hpY2ggeW91IHNob3VsZCBiZWFyIGluCi1taW5kIGlzIHRoZSBwb3RlbnRpYWwgZm9yIGluZm9ybWF0aW9uIGxvc3MuICBUaGVyZSBhcmUgdHdvIHBsYWNlcyB3aGVyZQotdXNlZnVsIGluZm9ybWF0aW9uIGNhbiBiZSBsb3N0IHVzaW5nIHRoZSBCRkQgbWVjaGFuaXNtOiBkdXJpbmcKLWNvbnZlcnNpb24gYW5kIGR1cmluZyBvdXRwdXQuIEB4cmVme0JGRCBpbmZvcm1hdGlvbiBsb3NzfS4KLQotQG1lbnUKLSogQkZEIG91dGxpbmU6OiAgICAgICAgICAgICAgICAgSG93IGl0IHdvcmtzOiBhbiBvdXRsaW5lIG9mIEJGRAotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBvdXRsaW5lCi1Ac2VjdGlvbiBIb3cgaXQgd29ya3M6IGFuIG91dGxpbmUgb2YgQkZECi1AY2luZGV4IG9wZW5pbmcgb2JqZWN0IGZpbGVzCi1AaW5jbHVkZSBiZmRzdW1tLnRleGkKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBSZXBvcnRpbmcgQnVncwotQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKLUBjaW5kZXggYnVncyBpbiBAY29kZXtsZH0KLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MgaW4gQGNvZGV7bGR9Ci0KLVlvdXIgYnVnIHJlcG9ydHMgcGxheSBhbiBlc3NlbnRpYWwgcm9sZSBpbiBtYWtpbmcgQGNvZGV7bGR9IHJlbGlhYmxlLgotCi1SZXBvcnRpbmcgYSBidWcgbWF5IGhlbHAgeW91IGJ5IGJyaW5naW5nIGEgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLCBvcgotaXQgbWF5IG5vdC4gIEJ1dCBpbiBhbnkgY2FzZSB0aGUgcHJpbmNpcGFsIGZ1bmN0aW9uIG9mIGEgYnVnIHJlcG9ydCBpcwotdG8gaGVscCB0aGUgZW50aXJlIGNvbW11bml0eSBieSBtYWtpbmcgdGhlIG5leHQgdmVyc2lvbiBvZiBAY29kZXtsZH0KLXdvcmsgYmV0dGVyLiAgQnVnIHJlcG9ydHMgYXJlIHlvdXIgY29udHJpYnV0aW9uIHRvIHRoZSBtYWludGVuYW5jZSBvZgotQGNvZGV7bGR9LgotCi1JbiBvcmRlciBmb3IgYSBidWcgcmVwb3J0IHRvIHNlcnZlIGl0cyBwdXJwb3NlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotaW5mb3JtYXRpb24gdGhhdCBlbmFibGVzIHVzIHRvIGZpeCB0aGUgYnVnLgotCi1AbWVudQotKiBCdWcgQ3JpdGVyaWE6OiAgICAgICAgICAgICAgICBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLSogQnVnIFJlcG9ydGluZzo6ICAgICAgICAgICAgICAgSG93IHRvIHJlcG9ydCBidWdzCi1AZW5kIG1lbnUKLQotQG5vZGUgQnVnIENyaXRlcmlhCi1Ac2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLUBjaW5kZXggYnVnIGNyaXRlcmlhCi0KLUlmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AY2luZGV4IGZhdGFsIHNpZ25hbAotQGNpbmRleCBsaW5rZXIgY3Jhc2gKLUBjaW5kZXggY3Jhc2ggb2YgbGlua2VyCi1AaXRlbQotSWYgdGhlIGxpbmtlciBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzIGEKLUBjb2Rle2xkfSBidWcuICBSZWxpYWJsZSBsaW5rZXJzIG5ldmVyIGNyYXNoLgotCi1AY2luZGV4IGVycm9yIG9uIHZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7bGR9IHByb2R1Y2VzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHZhbGlkIGlucHV0LCB0aGF0IGlzIGEgYnVnLgotCi1AY2luZGV4IGludmFsaWQgaW5wdXQKLUBpdGVtCi1JZiBAY29kZXtsZH0gZG9lcyBub3QgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0LCB0aGF0Ci1tYXkgYmUgYSBidWcuICBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGUgbGlua2VyIGNhbiBub3QgdmVyaWZ5IHRoYXQKLW9iamVjdCBmaWxlcyBhcmUgY29ycmVjdC4KLQotQGl0ZW0KLUlmIHlvdSBhcmUgYW4gZXhwZXJpZW5jZWQgdXNlciBvZiBsaW5rZXJzLCB5b3VyIHN1Z2dlc3Rpb25zIGZvcgotaW1wcm92ZW1lbnQgb2YgQGNvZGV7bGR9IGFyZSB3ZWxjb21lIGluIGFueSBjYXNlLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEJ1ZyBSZXBvcnRpbmcKLUBzZWN0aW9uIEhvdyB0byByZXBvcnQgYnVncwotQGNpbmRleCBidWcgcmVwb3J0cwotQGNpbmRleCBAY29kZXtsZH0gYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KLXByb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIEBjb2Rle2xkfSBmcm9tIGEgc3VwcG9ydCBvcmdhbml6YXRpb24sIHdlCi1yZWNvbW1lbmQgeW91IGNvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCi0KLVlvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAotaW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcwotZGlzdHJpYnV0aW9uLgotCi1PdGhlcndpc2UsIHNlbmQgYnVnIHJlcG9ydHMgZm9yIEBjb2Rle2xkfSB0bwotQHNhbXB7YnVnLWdudS11dGlsc0BAZ251Lm9yZ30uCi0KLVRoZSBmdW5kYW1lbnRhbCBwcmluY2lwbGUgb2YgcmVwb3J0aW5nIGJ1Z3MgdXNlZnVsbHkgaXMgdGhpczoKLUBzdHJvbmd7cmVwb3J0IGFsbCB0aGUgZmFjdHN9LiAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHRvIHN0YXRlIGEKLWZhY3Qgb3IgbGVhdmUgaXQgb3V0LCBzdGF0ZSBpdCEKLQotT2Z0ZW4gcGVvcGxlIG9taXQgZmFjdHMgYmVjYXVzZSB0aGV5IHRoaW5rIHRoZXkga25vdyB3aGF0IGNhdXNlcyB0aGUKLXByb2JsZW0gYW5kIGFzc3VtZSB0aGF0IHNvbWUgZGV0YWlscyBkbyBub3QgbWF0dGVyLiAgVGh1cywgeW91IG1pZ2h0Ci1hc3N1bWUgdGhhdCB0aGUgbmFtZSBvZiBhIHN5bWJvbCB5b3UgdXNlIGluIGFuIGV4YW1wbGUgZG9lcyBub3QgbWF0dGVyLgotV2VsbCwgcHJvYmFibHkgaXQgZG9lcyBub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMKLWEgc3RyYXkgbWVtb3J5IHJlZmVyZW5jZSB3aGljaCBoYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlCi10aGF0IG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIG5hbWUgd2VyZSBkaWZmZXJlbnQsIHRoZQotY29udGVudHMgb2YgdGhhdCBsb2NhdGlvbiB3b3VsZCBmb29sIHRoZSBsaW5rZXIgaW50byBkb2luZyB0aGUgcmlnaHQKLXRoaW5nIGRlc3BpdGUgdGhlIGJ1Zy4gIFBsYXkgaXQgc2FmZSBhbmQgZ2l2ZSBhIHNwZWNpZmljLCBjb21wbGV0ZQotZXhhbXBsZS4gIFRoYXQgaXMgdGhlIGVhc2llc3QgdGhpbmcgZm9yIHlvdSB0byBkbywgYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIEBjb2Rle2xkfS4gIEBjb2Rle2xkfSBhbm5vdW5jZXMgaXQgaWYgeW91IHN0YXJ0IGl0IHdpdGgKLXRoZSBAc2FtcHstLXZlcnNpb259IGFyZ3VtZW50LgotCi1XaXRob3V0IHRoaXMsIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB0aGVyZSBpcyBhbnkgcG9pbnQgaW4gbG9va2luZyBmb3IKLXRoZSBidWcgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtsZH0uCi0KLUBpdGVtCi1BbnkgcGF0Y2hlcyB5b3UgbWF5IGhhdmUgYXBwbGllZCB0byB0aGUgQGNvZGV7bGR9IHNvdXJjZSwgaW5jbHVkaW5nIGFueQotcGF0Y2hlcyBtYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgQGNvZGV7bGR9LS0tZS5nLgotYGBAY29kZXtnY2MtMi43fScnLgotCi1AaXRlbQotVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSBsaW5rZXIgdG8gbGluayB5b3VyIGV4YW1wbGUgYW5kCi1vYnNlcnZlIHRoZSBidWcuICBUbyBndWFyYW50ZWUgeW91IHdpbGwgbm90IG9taXQgc29tZXRoaW5nIGltcG9ydGFudCwKLWxpc3QgdGhlbSBhbGwuICBBIGNvcHkgb2YgdGhlIE1ha2VmaWxlIChvciB0aGUgb3V0cHV0IGZyb20gbWFrZSkgaXMKLXN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKLWJ1Zy4gIEl0IGlzIGdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywKLXV1ZW5jb2RlZCBpZiBuZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBNYWtpbmcgdGhlbQotYXZhaWxhYmxlIGZvciBhbm9ueW1vdXMgRlRQIGlzIG5vdCBhcyBnb29kLCBidXQgbWF5IGJlIHRoZSBvbmx5Ci1yZWFzb25hYmxlIGNob2ljZSBmb3IgbGFyZ2Ugb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgc291cmNlIGZpbGVzIHdlcmUgYXNzZW1ibGVkIHVzaW5nIEBjb2Rle2dhc30gb3IgY29tcGlsZWQgdXNpbmcKLUBjb2Rle2djY30sIHRoZW4gaXQgbWF5IGJlIE9LIHRvIHNlbmQgdGhlIHNvdXJjZSBmaWxlcyByYXRoZXIgdGhhbiB0aGUKLW9iamVjdCBmaWxlcy4gIEluIHRoaXMgY2FzZSwgYmUgc3VyZSB0byBzYXkgZXhhY3RseSB3aGF0IHZlcnNpb24gb2YKLUBjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3YXMgdXNlZCB0byBwcm9kdWNlIHRoZSBvYmplY3QgZmlsZXMuICBBbHNvIHNheQotaG93IEBjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3ZXJlIGNvbmZpZ3VyZWQuCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCBAY29kZXtsZH0gZ2V0cyBhIGZhdGFsIHNpZ25hbCwgdGhlbiB3ZQotd2lsbCBjZXJ0YWlubHkgbm90aWNlIGl0LiAgQnV0IGlmIHRoZSBidWcgaXMgaW5jb3JyZWN0IG91dHB1dCwgd2UgbWlnaHQKLW5vdCBub3RpY2UgdW5sZXNzIGl0IGlzIGdsYXJpbmdseSB3cm9uZy4gIFlvdSBtaWdodCBhcyB3ZWxsIG5vdCBnaXZlIHVzCi1hIGNoYW5jZSB0byBtYWtlIGEgbWlzdGFrZS4KLQotRXZlbiBpZiB0aGUgcHJvYmxlbSB5b3UgZXhwZXJpZW5jZSBpcyBhIGZhdGFsIHNpZ25hbCwgeW91IHNob3VsZCBzdGlsbAotc2F5IHNvIGV4cGxpY2l0bHkuICBTdXBwb3NlIHNvbWV0aGluZyBzdHJhbmdlIGlzIGdvaW5nIG9uLCBzdWNoIGFzLCB5b3VyCi1jb3B5IG9mIEBjb2Rle2xkfSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluIHRoZQotQyBsaWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodCBjcmFzaAotYW5kIG91cnMgd291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbiBvdXJzCi1mYWlscyB0byBjcmFzaCwgd2Ugd291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yIHVzLiAgSWYKLXlvdSBoYWQgbm90IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUgdG8gZHJhdwotYW55IGNvbmNsdXNpb24gZnJvbSBvdXIgb2JzZXJ2YXRpb25zLgotCi1AaXRlbQotSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBAY29kZXtsZH0gc291cmNlLCBzZW5kIHVzIGNvbnRleHQKLWRpZmZzLCBhcyBnZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yCi1Ac2FtcHstcH0gb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLgotSWYgeW91IGV2ZW4gZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle2xkfSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5Ci1jb250ZXh0LCBub3QgYnkgbGluZSBudW1iZXIuCi0KLVRoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgotc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCi1AZW5kIGl0ZW1pemUKLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCi0KLU9mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZwotd2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAotY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCi0KLVRoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCi13aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCi13aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KLVdlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCi0KLU9mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQotb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKLW91dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKLWxlc3MgdGltZSwgYW5kIHNvIG9uLgotCi1Ib3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAotcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgotCi1AaXRlbQotQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KLQotQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAotdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci1hIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCi10byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KLQotU29tZXRpbWVzIHdpdGggYSBwcm9ncmFtIGFzIGNvbXBsaWNhdGVkIGFzIEBjb2Rle2xkfSBpdCBpcyB2ZXJ5IGhhcmQgdG8KLWNvbnN0cnVjdCBhbiBleGFtcGxlIHRoYXQgd2lsbCBtYWtlIHRoZSBwcm9ncmFtIGZvbGxvdyBhIGNlcnRhaW4gcGF0aAotdGhyb3VnaCB0aGUgY29kZS4gIElmIHlvdSBkbyBub3Qgc2VuZCB1cyB0aGUgZXhhbXBsZSwgd2Ugd2lsbCBub3QgYmUKLWFibGUgdG8gY29uc3RydWN0IG9uZSwgc28gd2Ugd2lsbCBub3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhhdCB0aGUgYnVnIGlzCi1maXhlZC4KLQotQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKLXBhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKLWhlbHAgdXMgdG8gdW5kZXJzdGFuZC4KLQotQGl0ZW0KLUEgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KLQotU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAotdGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIE1SSQotQGFwcGVuZGl4IE1SSSBDb21wYXRpYmxlIFNjcmlwdCBGaWxlcwotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eQotVG8gYWlkIHVzZXJzIG1ha2luZyB0aGUgdHJhbnNpdGlvbiB0byBAc2N7Z251fSBAY29kZXtsZH0gZnJvbSB0aGUgTVJJCi1saW5rZXIsIEBjb2Rle2xkfSBjYW4gdXNlIE1SSSBjb21wYXRpYmxlIGxpbmtlciBzY3JpcHRzIGFzIGFuCi1hbHRlcm5hdGl2ZSB0byB0aGUgbW9yZSBnZW5lcmFsLXB1cnBvc2UgbGlua2VyIHNjcmlwdGluZyBsYW5ndWFnZQotZGVzY3JpYmVkIGluIEByZWZ7U2NyaXB0c30uICBNUkkgY29tcGF0aWJsZSBsaW5rZXIgc2NyaXB0cyBoYXZlIGEgbXVjaAotc2ltcGxlciBjb21tYW5kIHNldCB0aGFuIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugb3RoZXJ3aXNlIHVzZWQgd2l0aAotQGNvZGV7bGR9LiAgQHNje2dudX0gQGNvZGV7bGR9IHN1cHBvcnRzIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgTVJJCi1saW5rZXIgY29tbWFuZHM7IHRoZXNlIGNvbW1hbmRzIGFyZSBkZXNjcmliZWQgaGVyZS4KLQotSW4gZ2VuZXJhbCwgTVJJIHNjcmlwdHMgYXJlbid0IG9mIG11Y2ggdXNlIHdpdGggdGhlIEBjb2Rle2Eub3V0fSBvYmplY3QKLWZpbGUgZm9ybWF0LCBzaW5jZSBpdCBvbmx5IGhhcyB0aHJlZSBzZWN0aW9ucyBhbmQgTVJJIHNjcmlwdHMgbGFjayBzb21lCi1mZWF0dXJlcyB0byBtYWtlIHVzZSBvZiB0aGVtLgotCi1Zb3UgY2FuIHNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYW4gTVJJLWNvbXBhdGlibGUgc2NyaXB0IHVzaW5nIHRoZQotQHNhbXB7LWN9IGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLUVhY2ggY29tbWFuZCBpbiBhbiBNUkktY29tcGF0aWJsZSBzY3JpcHQgb2NjdXBpZXMgaXRzIG93biBsaW5lOyBlYWNoCi1jb21tYW5kIGxpbmUgc3RhcnRzIHdpdGggdGhlIGtleXdvcmQgdGhhdCBpZGVudGlmaWVzIHRoZSBjb21tYW5kICh0aG91Z2gKLWJsYW5rIGxpbmVzIGFyZSBhbHNvIGFsbG93ZWQgZm9yIHB1bmN0dWF0aW9uKS4gIElmIGEgbGluZSBvZiBhbgotTVJJLWNvbXBhdGlibGUgc2NyaXB0IGJlZ2lucyB3aXRoIGFuIHVucmVjb2duaXplZCBrZXl3b3JkLCBAY29kZXtsZH0KLWlzc3VlcyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGNvbnRpbnVlcyBwcm9jZXNzaW5nIHRoZSBzY3JpcHQuCi0KLUxpbmVzIGJlZ2lubmluZyB3aXRoIEBzYW1weyp9IGFyZSBjb21tZW50cy4KLQotWW91IGNhbiB3cml0ZSB0aGVzZSBjb21tYW5kcyB1c2luZyBhbGwgdXBwZXItY2FzZSBsZXR0ZXJzLCBvciBhbGwKLWxvd2VyIGNhc2U7IGZvciBleGFtcGxlLCBAc2FtcHtjaGlwfSBpcyB0aGUgc2FtZSBhcyBAc2FtcHtDSElQfS4KLVRoZSBmb2xsb3dpbmcgbGlzdCBzaG93cyBvbmx5IHRoZSB1cHBlci1jYXNlIGZvcm0gb2YgZWFjaCBjb21tYW5kLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7QUJTT0xVVEV9IChNUkkpCi1AaXRlbSBBQlNPTFVURSBAdmFye3NlY25hbWV9Ci1AaXRlbXggQUJTT0xVVEUgQHZhcntzZWNuYW1lfSwgQHZhcntzZWNuYW1lfSwgQGRvdHN7fSBAdmFye3NlY25hbWV9Ci1Ob3JtYWxseSwgQGNvZGV7bGR9IGluY2x1ZGVzIGluIHRoZSBvdXRwdXQgZmlsZSBhbGwgc2VjdGlvbnMgZnJvbSBhbGwKLXRoZSBpbnB1dCBmaWxlcy4gIEhvd2V2ZXIsIGluIGFuIE1SSS1jb21wYXRpYmxlIHNjcmlwdCwgeW91IGNhbiB1c2UgdGhlCi1AY29kZXtBQlNPTFVURX0gY29tbWFuZCB0byByZXN0cmljdCB0aGUgc2VjdGlvbnMgdGhhdCB3aWxsIGJlIHByZXNlbnQgaW4KLXlvdXIgb3V0cHV0IHByb2dyYW0uICBJZiB0aGUgQGNvZGV7QUJTT0xVVEV9IGNvbW1hbmQgaXMgdXNlZCBhdCBhbGwgaW4gYQotc2NyaXB0LCB0aGVuIG9ubHkgdGhlIHNlY3Rpb25zIG5hbWVkIGV4cGxpY2l0bHkgaW4gQGNvZGV7QUJTT0xVVEV9Ci1jb21tYW5kcyB3aWxsIGFwcGVhciBpbiB0aGUgbGlua2VyIG91dHB1dC4gIFlvdSBjYW4gc3RpbGwgdXNlIG90aGVyCi1pbnB1dCBzZWN0aW9ucyAod2hhdGV2ZXIgeW91IHNlbGVjdCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciB1c2luZwotQGNvZGV7TE9BRH0pIHRvIHJlc29sdmUgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotQGNpbmRleCBAY29kZXtBTElBU30gKE1SSSkKLUBpdGVtIEFMSUFTIEB2YXJ7b3V0LXNlY25hbWV9LCBAdmFye2luLXNlY25hbWV9Ci1Vc2UgdGhpcyBjb21tYW5kIHRvIHBsYWNlIHRoZSBkYXRhIGZyb20gaW5wdXQgc2VjdGlvbiBAdmFye2luLXNlY25hbWV9Ci1pbiBhIHNlY3Rpb24gY2FsbGVkIEB2YXJ7b3V0LXNlY25hbWV9IGluIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuCi0KLUB2YXJ7aW4tc2VjbmFtZX0gbWF5IGJlIGFuIGludGVnZXIuCi0KLUBjaW5kZXggQGNvZGV7QUxJR059IChNUkkpCi1AaXRlbSBBTElHTiBAdmFye3NlY25hbWV9ID0gQHZhcntleHByZXNzaW9ufQotQWxpZ24gdGhlIHNlY3Rpb24gY2FsbGVkIEB2YXJ7c2VjbmFtZX0gdG8gQHZhcntleHByZXNzaW9ufS4gIFRoZQotQHZhcntleHByZXNzaW9ufSBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28uCi0KLUBjaW5kZXggQGNvZGV7QkFTRX0gKE1SSSkKLUBpdGVtIEJBU0UgQHZhcntleHByZXNzaW9ufQotVXNlIHRoZSB2YWx1ZSBvZiBAdmFye2V4cHJlc3Npb259IGFzIHRoZSBsb3dlc3QgYWRkcmVzcyAob3RoZXIgdGhhbgotYWJzb2x1dGUgYWRkcmVzc2VzKSBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUBjaW5kZXggQGNvZGV7Q0hJUH0gKE1SSSkKLUBpdGVtIENISVAgQHZhcntleHByZXNzaW9ufQotQGl0ZW14IENISVAgQHZhcntleHByZXNzaW9ufSwgQHZhcntleHByZXNzaW9ufQotVGhpcyBjb21tYW5kIGRvZXMgbm90aGluZzsgaXQgaXMgYWNjZXB0ZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KLQotQGNpbmRleCBAY29kZXtFTkR9IChNUkkpCi1AaXRlbSBFTkQKLVRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcgd2hhdGV2ZXI7IGl0J3Mgb25seSBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eS4KLQotQGNpbmRleCBAY29kZXtGT1JNQVR9IChNUkkpCi1AaXRlbSBGT1JNQVQgQHZhcntvdXRwdXQtZm9ybWF0fQotU2ltaWxhciB0byB0aGUgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gY29tbWFuZCBpbiB0aGUgbW9yZSBnZW5lcmFsIGxpbmtlcgotbGFuZ3VhZ2UsIGJ1dCByZXN0cmljdGVkIHRvIG9uZSBvZiB0aGVzZSBvdXRwdXQgZm9ybWF0czogCi0KLUBlbnVtZXJhdGUKLUBpdGVtIAotUy1yZWNvcmRzLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we1N9Ci0KLUBpdGVtCi1JRUVFLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we0lFRUV9Ci0KLUBpdGVtCi1DT0ZGICh0aGUgQHNhbXB7Y29mZi1tNjhrfSB2YXJpYW50IGluIEJGRCksIGlmIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMKLUBzYW1we0NPRkZ9Ci1AZW5kIGVudW1lcmF0ZQotCi1AY2luZGV4IEBjb2Rle0xJU1R9IChNUkkpCi1AaXRlbSBMSVNUIEB2YXJ7YW55dGhpbmd9QGRvdHN7fQotUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcCwgYXMgcHJvZHVjZWQgYnkgdGhlCi1AY29kZXtsZH0gY29tbWFuZC1saW5lIG9wdGlvbiBAc2FtcHstTX0uCi0KLVRoZSBrZXl3b3JkIEBjb2Rle0xJU1R9IG1heSBiZSBmb2xsb3dlZCBieSBhbnl0aGluZyBvbiB0aGUKLXNhbWUgbGluZSwgd2l0aCBubyBjaGFuZ2UgaW4gaXRzIGVmZmVjdC4KLQotQGNpbmRleCBAY29kZXtMT0FEfSAoTVJJKQotQGl0ZW0gTE9BRCBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IExPQUQgQHZhcntmaWxlbmFtZX0sIEB2YXJ7ZmlsZW5hbWV9LCBAZG90c3t9IEB2YXJ7ZmlsZW5hbWV9Ci1JbmNsdWRlIG9uZSBvciBtb3JlIG9iamVjdCBmaWxlIEB2YXJ7ZmlsZW5hbWV9IGluIHRoZSBsaW5rOyB0aGlzIGhhcyB0aGUKLXNhbWUgZWZmZWN0IGFzIHNwZWNpZnlpbmcgQHZhcntmaWxlbmFtZX0gZGlyZWN0bHkgb24gdGhlIEBjb2Rle2xkfQotY29tbWFuZCBsaW5lLgotCi1AY2luZGV4IEBjb2Rle05BTUV9IChNUkkpCi1AaXRlbSBOQU1FIEB2YXJ7b3V0cHV0LW5hbWV9Ci1AdmFye291dHB1dC1uYW1lfSBpcyB0aGUgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgQGNvZGV7bGR9OyB0aGUKLU1SSS1jb21wYXRpYmxlIGNvbW1hbmQgQGNvZGV7TkFNRX0gaXMgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZC1saW5lCi1vcHRpb24gQHNhbXB7LW99IG9yIHRoZSBnZW5lcmFsIHNjcmlwdCBsYW5ndWFnZSBjb21tYW5kIEBjb2Rle09VVFBVVH0uCi0KLUBjaW5kZXggQGNvZGV7T1JERVJ9IChNUkkpCi1AaXRlbSBPUkRFUiBAdmFye3NlY25hbWV9LCBAdmFye3NlY25hbWV9LCBAZG90c3t9IEB2YXJ7c2VjbmFtZX0KLUBpdGVteCBPUkRFUiBAdmFye3NlY25hbWV9IEB2YXJ7c2VjbmFtZX0gQHZhcntzZWNuYW1lfQotTm9ybWFsbHksIEBjb2Rle2xkfSBvcmRlcnMgdGhlIHNlY3Rpb25zIGluIGl0cyBvdXRwdXQgZmlsZSBpbiB0aGUKLW9yZGVyIGluIHdoaWNoIHRoZXkgZmlyc3QgYXBwZWFyIGluIHRoZSBpbnB1dCBmaWxlcy4gIEluIGFuIE1SSS1jb21wYXRpYmxlCi1zY3JpcHQsIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBvcmRlcmluZyB3aXRoIHRoZSBAY29kZXtPUkRFUn0gY29tbWFuZC4gIFRoZQotc2VjdGlvbnMgeW91IGxpc3Qgd2l0aCBAY29kZXtPUkRFUn0gd2lsbCBhcHBlYXIgZmlyc3QgaW4geW91ciBvdXRwdXQKLWZpbGUsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuCi0KLUBjaW5kZXggQGNvZGV7UFVCTElDfSAoTVJJKQotQGl0ZW0gUFVCTElDIEB2YXJ7bmFtZX09QHZhcntleHByZXNzaW9ufQotQGl0ZW14IFBVQkxJQyBAdmFye25hbWV9LEB2YXJ7ZXhwcmVzc2lvbn0KLUBpdGVteCBQVUJMSUMgQHZhcntuYW1lfSBAdmFye2V4cHJlc3Npb259Ci1TdXBwbHkgYSB2YWx1ZSAoQHZhcntleHByZXNzaW9ufSkgZm9yIGV4dGVybmFsIHN5bWJvbAotQHZhcntuYW1lfSB1c2VkIGluIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMuCi0KLUBjaW5kZXggQGNvZGV7U0VDVH0gKE1SSSkKLUBpdGVtIFNFQ1QgQHZhcntzZWNuYW1lfSwgQHZhcntleHByZXNzaW9ufQotQGl0ZW14IFNFQ1QgQHZhcntzZWNuYW1lfT1AdmFye2V4cHJlc3Npb259Ci1AaXRlbXggU0VDVCBAdmFye3NlY25hbWV9IEB2YXJ7ZXhwcmVzc2lvbn0KLVlvdSBjYW4gdXNlIGFueSBvZiB0aGVzZSB0aHJlZSBmb3JtcyBvZiB0aGUgQGNvZGV7U0VDVH0gY29tbWFuZCB0bwotc3BlY2lmeSB0aGUgc3RhcnQgYWRkcmVzcyAoQHZhcntleHByZXNzaW9ufSkgZm9yIHNlY3Rpb24gQHZhcntzZWNuYW1lfS4KLUlmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgQGNvZGV7U0VDVH0gc3RhdGVtZW50IGZvciB0aGUgc2FtZQotQHZhcntzZWNuYW1lfSwgb25seSB0aGUgQGVtcGh7Zmlyc3R9IHNldHMgdGhlIHN0YXJ0IGFkZHJlc3MuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AdGV4Ci0lIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCi0lIG1lYW50aW1lOgotXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKLVxjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KLVxjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9Ci1cY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQotXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KLVxjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30gYW5kfQotXGNlbnRlcmxpbmV7e1xzbFxmb250bmFtZVx0ZW5zbFwvfX0KLVxjZW50ZXJsaW5le2FyZSB1c2VkIGZvciBlbXBoYXNpcy59XHZmaWxsfQotXHBhZ2VcY29sb3Bob24KLSUgQmxhbWU6IGRvY0BjeWdudXMuY29tLCAyOG1hcjkxLgotQGVuZCB0ZXgKLQotCi1AY29udGVudHMKLUBieWUKLQotCmRpZmYgLS1naXQgYS9sZC9sZGNyZWYuYyBiL2xkL2xkY3JlZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA4MTA2Li4wMDAwMDAwCi0tLSBhL2xkL2xkY3JlZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qIGxkY3JlZi5jIC0tIG91dHB1dCBhIGNyb3NzIHJlZmVyZW5jZSB0YWJsZQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIHJvdXRpbmVzIHRoYXQgbWFuYWdlIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUuCi0gICBUaGUgdGFibGUgaXMgdXNlZCB0byBnZW5lcmF0ZSBjcm9zcyByZWZlcmVuY2UgcmVwb3J0cy4gIEl0IGlzIGFsc28KLSAgIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBOT0NST1NTUkVGUyBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotLyogV2Uga2VlcCBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSBmb3IgZWFjaCByZWZlcmVuY2UgdG8gYQotICAgc3ltYm9sIGZyb20gYSBnaXZlbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgY3JlZl9yZWYKLXsKLSAgLyogVGhlIG5leHQgcmVmZXJlbmNlLiAgKi8KLSAgc3RydWN0IGNyZWZfcmVmICpuZXh0OwotICAvKiBUaGUgb2JqZWN0LiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIHVuc2lnbmVkIGludCBkZWYgOiAxOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgY29tbW9uLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbW1vbiA6IDE7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICAqLwotICB1bnNpZ25lZCBpbnQgdW5kZWYgOiAxOwotfTsKLQotLyogV2Uga2VlcCBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIEVhY2ggZW50cnkgbG9va3MgbGlrZSB0aGlzLiAgKi8KLQotc3RydWN0IGNyZWZfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogVGhlIGRlbWFuZ2xlZCBuYW1lLiAgKi8KLSAgY2hhciAqZGVtYW5nbGVkOwotICAvKiBSZWZlcmVuY2VzIHRvIGFuZCBkZWZpbml0aW9ucyBvZiB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBjcmVmX3JlZiAqcmVmczsKLX07Ci0KLS8qIFRoaXMgaXMgd2hhdCB0aGUgaGFzaCB0YWJsZSBsb29rcyBsaWtlLiAgKi8KLQotc3RydWN0IGNyZWZfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmNyZWZfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjcmVmX2ZpbGxfYXJyYXkgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBpbnQgY3JlZl9zb3J0X2FycmF5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfb25lX2NyZWYgUEFSQU1TICgoRklMRSAqLCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGNoZWNrX25vY3Jvc3NyZWYgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3JlZnMKLSAgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICopKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3JlbG9jX3JlZnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNyZWZfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KQkJXAotICAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVHJhdmVyc2UgdGhlIGNyZWYgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY3JlZl9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCQlcCi0gIChiZmRfaGFzaF90cmF2ZXJzZQkJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBUaGUgY3JlZiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBjcmVmX2hhc2hfdGFibGUgY3JlZl90YWJsZTsKLQotLyogV2hldGhlciB0aGUgY3JlZiBoYXNoIHRhYmxlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY3JlZl9pbml0aWFsaXplZDsKLQotLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIHNlZW4gc28gZmFyLiAgKi8KLQotc3RhdGljIHNpemVfdCBjcmVmX3N5bWNvdW50OwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWNyZWZfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+ZGVtYW5nbGVkID0gTlVMTDsKLSAgICAgIHJldC0+cmVmcyA9IE5VTEw7Ci0KLSAgICAgIC8qIEtlZXAgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY3JlYXRlZCBpbiB0aGUgaGFzaAotICAgICAgICAgdGFibGUuICAqLwotICAgICAgKytjcmVmX3N5bWNvdW50OwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgY3JlZiBoYXNoIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGV2ZXJ5Ci0gICBzeW1ib2wgdGhhdCBpcyBzZWVuIGR1cmluZyB0aGUgbGluay4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotYWRkX2NyZWYgKG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBjcmVmX3JlZiAqcjsKLQotICBpZiAoISBjcmVmX2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZjcmVmX3RhYmxlLnJvb3QsIGNyZWZfaGFzaF9uZXdmdW5jKSkKLQllaW5mbyAoXygiJVglUDogYmZkX2hhc2hfdGFibGVfaW5pdCBvZiBjcmVmIHRhYmxlIGZhaWxlZDogJUVcbiIpKTsKLSAgICAgIGNyZWZfaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICBoID0gY3JlZl9oYXNoX2xvb2t1cCAoJmNyZWZfdGFibGUsIG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJVglUDogY3JlZl9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICBpZiAoci0+YWJmZCA9PSBhYmZkKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByID0gKHN0cnVjdCBjcmVmX3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKnIpOwotICAgICAgci0+bmV4dCA9IGgtPnJlZnM7Ci0gICAgICBoLT5yZWZzID0gcjsKLSAgICAgIHItPmFiZmQgPSBhYmZkOwotICAgICAgci0+ZGVmID0gZmFsc2U7Ci0gICAgICByLT5jb21tb24gPSBmYWxzZTsKLSAgICAgIHItPnVuZGVmID0gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHItPnVuZGVmID0gdHJ1ZTsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICByLT5jb21tb24gPSB0cnVlOwotICBlbHNlCi0gICAgci0+ZGVmID0gdHJ1ZTsKLX0KLQotLyogQ29weSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJpZXMgaW50byBhbiBhcnJheS4gIFRoaXMKLSAgIGlzIGNhbGxlZCB2aWEgY3JlZl9oYXNoX3RyYXZlcnNlLiAgV2UgYWxzbyBmaWxsIGluIHRoZSBkZW1hbmdsZWQKLSAgIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY3JlZl9maWxsX2FycmF5IChoLCBkYXRhKQotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKipwcGggPSAoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKiopIGRhdGE7Ci0KLSAgQVNTRVJUIChoLT5kZW1hbmdsZWQgPT0gTlVMTCk7Ci0gIGgtPmRlbWFuZ2xlZCA9IGRlbWFuZ2xlIChoLT5yb290LnN0cmluZyk7Ci0KLSAgKipwcGggPSBoOwotCi0gICsrKnBwaDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU29ydCBhbiBhcnJheSBvZiBjcmVmIGhhc2ggdGFibGUgZW50cmllcyBieSBuYW1lLiAgKi8KLQotc3RhdGljIGludAotY3JlZl9zb3J0X2FycmF5IChhMSwgYTIpCi0gICAgIGNvbnN0IFBUUiBhMTsKLSAgICAgY29uc3QgUFRSIGEyOwotewotICBjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqcDEgPSAoY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikgYTE7Ci0gIGNvbnN0IHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKipwMiA9IChjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqKSBhMjsKLQotICByZXR1cm4gc3RyY21wICgoKnAxKS0+ZGVtYW5nbGVkLCAoKnAyKS0+ZGVtYW5nbGVkKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBjcmVmIHRhYmxlLiAgKi8KLQotI2RlZmluZSBGSUxFQ09MICg1MCkKLQotdm9pZAotb3V0cHV0X2NyZWYgKGZwKQotICAgICBGSUxFICpmcDsKLXsKLSAgaW50IGxlbjsKLSAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKmNzeW1zLCAqKmNzeW1fZmlsbCwgKipjc3ltLCAqKmNzeW1fZW5kOwotICBjb25zdCBjaGFyICptc2c7Ci0KLSAgZnByaW50ZiAoZnAsIF8oIlxuQ3Jvc3MgUmVmZXJlbmNlIFRhYmxlXG5cbiIpKTsKLSAgbXNnID0gXygiU3ltYm9sIik7Ci0gIGZwcmludGYgKGZwLCAiJXMiLCBtc2cpOwotICBsZW4gPSBzdHJsZW4gKG1zZyk7Ci0gIHdoaWxlIChsZW4gPCBGSUxFQ09MKQotICAgIHsKLSAgICAgIHB1dGMgKCcgJyAsIGZwKTsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgZnByaW50ZiAoZnAsIF8oIkZpbGVcbiIpKTsKLQotICBpZiAoISBjcmVmX2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZwLCBfKCJObyBzeW1ib2xzXG4iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNzeW1zID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqKQotCSAgIHhtYWxsb2MgKGNyZWZfc3ltY291bnQgKiBzaXplb2YgKCpjc3ltcykpKTsKLQotICBjc3ltX2ZpbGwgPSBjc3ltczsKLSAgY3JlZl9oYXNoX3RyYXZlcnNlICgmY3JlZl90YWJsZSwgY3JlZl9maWxsX2FycmF5LCAmY3N5bV9maWxsKTsKLSAgQVNTRVJUICgoc2l6ZV90KSAoY3N5bV9maWxsIC0gY3N5bXMpID09IGNyZWZfc3ltY291bnQpOwotCi0gIHFzb3J0IChjc3ltcywgY3JlZl9zeW1jb3VudCwgc2l6ZW9mICgqY3N5bXMpLCBjcmVmX3NvcnRfYXJyYXkpOwotCi0gIGNzeW1fZW5kID0gY3N5bXMgKyBjcmVmX3N5bWNvdW50OwotICBmb3IgKGNzeW0gPSBjc3ltczsgY3N5bSA8IGNzeW1fZW5kOyBjc3ltKyspCi0gICAgb3V0cHV0X29uZV9jcmVmIChmcCwgKmNzeW0pOwotfQotCi0vKiBPdXRwdXQgb25lIGVudHJ5IGluIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotb3V0cHV0X29uZV9jcmVmIChmcCwgaCkKLSAgICAgRklMRSAqZnA7Ci0gICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpobDsKLSAgc3RydWN0IGNyZWZfcmVmICpyOwotCi0gIGhsID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBoLT5yb290LnN0cmluZywgZmFsc2UsCi0JCQkgICAgIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGhsID09IE5VTEwpCi0gICAgZWluZm8gKCIlUDogc3ltYm9sIGAlVCcgbWlzc2luZyBmcm9tIG1haW4gaGFzaCB0YWJsZVxuIiwKLQkgICBoLT5yb290LnN0cmluZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QgYnV0IG5ldmVyCi0JIHJlZmVyZW5jZWQgYnkgYSBub3JtYWwgb2JqZWN0LCB0aGVuIGRvbid0IHByaW50IGl0LiAgKi8KLSAgICAgIGlmIChobC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JewotCSAgaWYgKGhsLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICByZXR1cm47Ci0JICBpZiAoaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICAmJiAoaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JICAgIHsKLQkgICAgICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotCQlpZiAoKHItPmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLQkJICBicmVhazsKLQkgICAgICBpZiAociA9PSBOVUxMKQotCQlyZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGZwLCAiJXMgIiwgaC0+ZGVtYW5nbGVkKTsKLSAgbGVuID0gc3RybGVuIChoLT5kZW1hbmdsZWQpICsgMTsKLQotICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChyLT5kZWYpCi0JewotCSAgd2hpbGUgKGxlbiA8IEZJTEVDT0wpCi0JICAgIHsKLQkgICAgICBwdXRjICgnICcsIGZwKTsKLQkgICAgICArK2xlbjsKLQkgICAgfQotCSAgbGZpbmZvIChmcCwgIiVCXG4iLCByLT5hYmZkKTsKLQkgIGxlbiA9IDA7Ci0JfQotICAgIH0KLQotICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIHItPmRlZikKLQl7Ci0JICB3aGlsZSAobGVuIDwgRklMRUNPTCkKLQkgICAgewotCSAgICAgIHB1dGMgKCcgJywgZnApOwotCSAgICAgICsrbGVuOwotCSAgICB9Ci0JICBsZmluZm8gKGZwLCAiJUJcbiIsIHItPmFiZmQpOwotCSAgbGVuID0gMDsKLQl9Ci0gICAgfQotCi0gIEFTU0VSVCAobGVuID09IDApOwotfQotCi0vKiBDaGVjayBmb3IgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2VzLiAgKi8KLQotdm9pZAotY2hlY2tfbm9jcm9zc3JlZnMgKCkKLXsKLSAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKLSAgICByZXR1cm47Ci0KLSAgY3JlZl9oYXNoX3RyYXZlcnNlICgmY3JlZl90YWJsZSwgY2hlY2tfbm9jcm9zc3JlZiwgKFBUUikgTlVMTCk7Ci19Ci0KLS8qIENoZWNrIG9uZSBzeW1ib2wgdG8gc2VlIGlmIGl0IGlzIGEgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jaGVja19ub2Nyb3NzcmVmIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhsOwotICBhc2VjdGlvbiAqZGVmc2VjOwotICBjb25zdCBjaGFyICpkZWZzZWNuYW1lOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbmNyczsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbmNyOwotCi0gIGhsID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBoLT5yb290LnN0cmluZywgZmFsc2UsCi0JCQkgICAgIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGhsID09IE5VTEwpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQOiBzeW1ib2wgYCVUJyBtaXNzaW5nIGZyb20gbWFpbiBoYXNoIHRhYmxlXG4iKSwKLQkgICAgIGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaGwtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiBobC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZGVmc2VjID0gaGwtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotICBpZiAoZGVmc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGRlZnNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZGVmc2VjLT5vd25lciwgZGVmc2VjKTsKLQotICBmb3IgKG5jcnMgPSBub2Nyb3NzcmVmX2xpc3Q7IG5jcnMgIT0gTlVMTDsgbmNycyA9IG5jcnMtPm5leHQpCi0gICAgZm9yIChuY3IgPSBuY3JzLT5saXN0OyBuY3IgIT0gTlVMTDsgbmNyID0gbmNyLT5uZXh0KQotICAgICAgaWYgKHN0cmNtcCAobmNyLT5uYW1lLCBkZWZzZWNuYW1lKSA9PSAwKQotCWNoZWNrX3JlZnMgKGgsIGhsLCBuY3JzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIHN0cnVjdCBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSBjaGVja19yZWZzIHRvCi0gICBjaGVja19yZWxvY19yZWZzIHRocm91Z2ggYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RydWN0IGNoZWNrX3JlZnNfaW5mbwotewotICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICBhc2VjdGlvbiAqZGVmc2VjOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbmNyczsKLSAgYXN5bWJvbCAqKmFzeW1ib2xzOwotICBib29sZWFuIHNhbWU7Ci19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBzeW1ib2wgZGVmaW5lZCBpbiBhIHNlY3Rpb24gd2hpY2gKLSAgIHByb2hpYml0cyBjcm9zcyByZWZlcmVuY2VzLiAgV2UgbmVlZCB0byBsb29rIHRocm91Z2ggYWxsIHJlZmVyZW5jZXMKLSAgIHRvIHRoaXMgc3ltYm9sLCBhbmQgZW5zdXJlIHRoYXQgdGhlIHJlZmVyZW5jZXMgYXJlIG5vdCBmcm9tCi0gICBwcm9oaWJpdGVkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZWNrX3JlZnMgKGgsIGhsLCBuY3JzKQotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGw7Ci0gICAgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuY3JzOwotewotICBzdHJ1Y3QgY3JlZl9yZWYgKnJlZjsKLQotICBmb3IgKHJlZiA9IGgtPnJlZnM7IHJlZiAhPSBOVUxMOyByZWYgPSByZWYtPm5leHQpCi0gICAgewotICAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbGk7Ci0gICAgICBhc3ltYm9sICoqYXN5bWJvbHM7Ci0gICAgICBzdHJ1Y3QgY2hlY2tfcmVmc19pbmZvIGluZm87Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gbG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucyBmb3IgdGhpcyBCRkQsIHRvIHNlZQotICAgICAgICAgaWYgYW55IG9mIHRoZSByZWxvY2F0aW9ucyB3aGljaCByZWZlciB0byB0aGlzIHN5bWJvbCBhcmUgZnJvbQotICAgICAgICAgYSBwcm9oaWJpdGVkIHNlY3Rpb24uICBOb3RlIHRoYXQgd2UgbmVlZCB0byBkbyB0aGlzIGV2ZW4gZm9yCi0gICAgICAgICB0aGUgQkZEIGluIHdoaWNoIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgc2luY2UgZXZlbiBhIHNpbmdsZQotICAgICAgICAgQkZEIG1pZ2h0IGNvbnRhaW4gYSBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZTsgZm9yIHRoaXMKLSAgICAgICAgIGNhc2UsIHdlIHNldCB0aGUgU0FNRSBmaWVsZCBpbiBJTkZPLCB3aGljaCB3aWxsIGNhdXNlCi0gICAgICAgICBDSEVDS19SRUxPQ1NfUkVGUyB0byBjaGVjayBmb3IgcmVsb2NhdGlvbnMgYWdhaW5zdCB0aGUKLSAgICAgICAgIHNlY3Rpb24gYXMgd2VsbCBhcyBhZ2FpbnN0IHRoZSBzeW1ib2wuICAqLwotCi0gICAgICBsaSA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIHJlZi0+YWJmZC0+dXNyZGF0YTsKLSAgICAgIGlmIChsaSAhPSBOVUxMICYmIGxpLT5hc3ltYm9scyAhPSBOVUxMKQotCWFzeW1ib2xzID0gbGktPmFzeW1ib2xzOwotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgc3ltc2l6ZTsKLQkgIGxvbmcgc3ltYm9sX2NvdW50OwotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKHJlZi0+YWJmZCk7Ci0JICBpZiAoc3ltc2l6ZSA8IDApCi0JICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOyAlRVxuIiksIHJlZi0+YWJmZCk7Ci0JICBhc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLQkgIHN5bWJvbF9jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChyZWYtPmFiZmQsIGFzeW1ib2xzKTsKLQkgIGlmIChzeW1ib2xfY291bnQgPCAwKQotCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCByZWYtPmFiZmQpOwotCSAgaWYgKGxpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBsaS0+YXN5bWJvbHMgPSBhc3ltYm9sczsKLQkgICAgICBsaS0+c3ltYm9sX2NvdW50ID0gc3ltYm9sX2NvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICBpbmZvLmggPSBoOwotICAgICAgaW5mby5kZWZzZWMgPSBobC0+dS5kZWYuc2VjdGlvbjsKLSAgICAgIGluZm8ubmNycyA9IG5jcnM7Ci0gICAgICBpbmZvLmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0gICAgICBpZiAocmVmLT5hYmZkID09IGhsLT51LmRlZi5zZWN0aW9uLT5vd25lcikKLQlpbmZvLnNhbWUgPSB0cnVlOwotICAgICAgZWxzZQotCWluZm8uc2FtZSA9IGZhbHNlOwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChyZWYtPmFiZmQsIGNoZWNrX3JlbG9jX3JlZnMsIChQVFIpICZpbmZvKTsKLQotICAgICAgaWYgKGxpID09IE5VTEwpCi0JZnJlZSAoYXN5bWJvbHMpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gIElORk8tPkggaXMgYSBzeW1ib2wKLSAgIGRlZmluZWQgaW4gSU5GTy0+REVGU0VDTkFNRS4gIElmIHRoaXMgc2VjdGlvbiBtYXBzIGludG8gYW55IG9mIHRoZQotICAgc2VjdGlvbnMgbGlzdGVkIGluIElORk8tPk5DUlMsIG90aGVyIHRoYW4gSU5GTy0+REVGU0VDTkFNRSwgdGhlbiB3ZQotICAgbG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucy4gIElmIGFueSBvZiB0aGUgcmVsb2NhdGlvbnMgYXJlIHRvCi0gICBJTkZPLT5ILCB0aGVuIHdlIHJlcG9ydCBhIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGVycm9yLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZWNrX3JlbG9jX3JlZnMgKGFiZmQsIHNlYywgaWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgaWFyZzsKLXsKLSAgc3RydWN0IGNoZWNrX3JlZnNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgY2hlY2tfcmVmc19pbmZvICopIGlhcmc7Ci0gIGFzZWN0aW9uICpvdXRzZWM7Ci0gIGNvbnN0IGNoYXIgKm91dHNlY25hbWU7Ci0gIGFzZWN0aW9uICpvdXRkZWZzZWM7Ci0gIGNvbnN0IGNoYXIgKm91dGRlZnNlY25hbWU7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5jcjsKLSAgY29uc3QgY2hhciAqc3ltbmFtZTsKLSAgbG9uZyByZWxzaXplOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIGFyZWxlbnQgKipwLCAqKnBlbmQ7Ci0KLSAgb3V0c2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgb3V0c2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRzZWMtPm93bmVyLCBvdXRzZWMpOwotCi0gIG91dGRlZnNlYyA9IGluZm8tPmRlZnNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gIG91dGRlZnNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0ZGVmc2VjLT5vd25lciwgb3V0ZGVmc2VjKTsKLQotICAvKiBUaGUgc2VjdGlvbiB3aGVyZSB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaXMgcGVybWl0dGVkLiAgKi8KLSAgaWYgKHN0cmNtcCAob3V0c2VjbmFtZSwgb3V0ZGVmc2VjbmFtZSkgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChuY3IgPSBpbmZvLT5uY3JzLT5saXN0OyBuY3IgIT0gTlVMTDsgbmNyID0gbmNyLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKG91dHNlY25hbWUsIG5jci0+bmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChuY3IgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhpcyBzZWN0aW9uIGlzIG9uZSBmb3Igd2hpY2ggY3Jvc3MgcmVmZXJlbmNlcyBhcmUgcHJvaGliaXRlZC4KLSAgICAgTG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucywgYW5kIHNlZSBpZiBhbnkgb2YgdGhlbSBhcmUgdG8KLSAgICAgSU5GTy0+SC4gICovCi0KLSAgc3ltbmFtZSA9IGluZm8tPmgtPnJvb3Quc3RyaW5nOwotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICBpZiAocmVsc2l6ZSA8IDApCi0gICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIpLCBhYmZkKTsKLSAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWxwcCwgaW5mby0+YXN5bWJvbHMpOwotICBpZiAocmVsY291bnQgPCAwKQotICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCByZWxvY3M6ICVFXG4iKSwgYWJmZCk7Ci0KLSAgcCA9IHJlbHBwOwotICBwZW5kID0gcCArIHJlbGNvdW50OwotICBmb3IgKDsgcCA8IHBlbmQgJiYgKnAgIT0gTlVMTDsgcCsrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnEgPSAqcDsKLQotICAgICAgaWYgKHEtPnN5bV9wdHJfcHRyICE9IE5VTEwKLQkgICYmICpxLT5zeW1fcHRyX3B0ciAhPSBOVUxMCi0JICAmJiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpLCBzeW1uYW1lKSA9PSAwCi0JICAgICAgfHwgKGluZm8tPnNhbWUKLQkJICAmJiBiZmRfZ2V0X3NlY3Rpb24gKCpxLT5zeW1fcHRyX3B0cikgPT0gaW5mby0+ZGVmc2VjKSkpCi0JewotCSAgLyogV2UgZm91bmQgYSByZWxvYyBmb3IgdGhlIHN5bWJvbC4gIFRoZSBzeW1ib2wgaXMgZGVmaW5lZAotICAgICAgICAgICAgIGluIE9VVFNFQ05BTUUuICBUaGlzIHJlbG9jIGlzIGZyb20gYSBzZWN0aW9uIHdoaWNoIGlzCi0gICAgICAgICAgICAgbWFwcGVkIGludG8gYSBzZWN0aW9uIGZyb20gd2hpY2ggcmVmZXJlbmNlcyB0byBPVVRTRUNOQU1FCi0gICAgICAgICAgICAgYXJlIHByb2hpYml0ZWQuICBXZSBtdXN0IHJlcG9ydCBhbiBlcnJvci4gICovCi0JICBlaW5mbyAoXygiJVglQzogcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UgZnJvbSAlcyB0byBgJVQnIGluICVzXG4iKSwKLQkJIGFiZmQsIHNlYywgcS0+YWRkcmVzcywgb3V0c2VjbmFtZSwKLQkJIGJmZF9hc3ltYm9sX25hbWUgKCpxLT5zeW1fcHRyX3B0ciksIG91dGRlZnNlY25hbWUpOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocmVscHApOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRjdG9yLmMgYi9sZC9sZGN0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0MzRiOC4uMDAwMDAwMAotLS0gYS9sZC9sZGN0b3IuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKiBsZGN0b3IuYyAtLSBjb25zdHJ1Y3RvciBzdXBwb3J0IHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLQotc3RhdGljIGludCBjdG9yX3ByaW8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGN0b3JfY21wIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLS8qIFRoZSBsaXN0IG9mIHN0YXRlbWVudHMgbmVlZGVkIHRvIGhhbmRsZSBjb25zdHJ1Y3RvcnMuICBUaGVzZSBhcmUKLSAgIGludm9rZWQgYnkgdGhlIGNvbW1hbmQgQ09OU1RSVUNUT1JTIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLWxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjb25zdHJ1Y3Rvcl9saXN0OwotCi0vKiBXaGV0aGVyIHRoZSBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIHNvcnRlZC4gIE5vdGUgdGhhdCB0aGlzIGlzCi0gICBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgbGluazsgd2UgYXNzdW1lIHRoYXQgdGhlcmUgaXMgb25seSBhIHNpbmdsZQotICAgQ09OU1RSVUNUT1JTIGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLwotYm9vbGVhbiBjb25zdHJ1Y3RvcnNfc29ydGVkOwotCi0vKiBUaGUgc2V0cyB3ZSBoYXZlIHNlZW4uICAqLwotc3RydWN0IHNldF9pbmZvICpzZXRzOwotCi0vKiBBZGQgYW4gZW50cnkgdG8gYSBzZXQuICBIIGlzIHRoZSBlbnRyeSBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0gICBSRUxPQyBpcyB0aGUgcmVsb2NhdGlvbiB0byB1c2UgZm9yIGFuIGVudHJ5IGluIHRoZSBzZXQuICBTRUNUSU9OCi0gICBhbmQgVkFMVUUgYXJlIHRoZSB2YWx1ZSB0byBhZGQuICBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpcnN0Ci0gICBwaGFzZSBvZiB0aGUgbGluaywgd2hlbiB3ZSBhcmUgc3RpbGwgZ2F0aGVyaW5nIHN5bWJvbHMgdG9nZXRoZXIuCi0gICBXZSBqdXN0IHJlY29yZCB0aGUgaW5mb3JtYXRpb24gbm93LiAgVGhlIGxkY3Rvcl9maW5kX2NvbnN0cnVjdG9ycwotICAgZnVuY3Rpb24gd2lsbCBjb25zdHJ1Y3QgdGhlIHNldHMuICAqLwotCi12b2lkCi1sZGN0b3JfYWRkX3NldF9lbnRyeSAoaCwgcmVsb2MsIG5hbWUsIHNlY3Rpb24sIHZhbHVlKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgc3RydWN0IHNldF9pbmZvICpwOwotICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKmU7Ci0gIHN0cnVjdCBzZXRfZWxlbWVudCAqKmVwcDsKLQotICBmb3IgKHAgPSBzZXRzOyBwICE9IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgaWYgKHAtPmggPT0gaCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChwID09IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTCkKLSAgICB7Ci0gICAgICBwID0gKHN0cnVjdCBzZXRfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZXRfaW5mbykpOwotICAgICAgcC0+bmV4dCA9IHNldHM7Ci0gICAgICBzZXRzID0gcDsKLSAgICAgIHAtPmggPSBoOwotICAgICAgcC0+cmVsb2MgPSByZWxvYzsKLSAgICAgIHAtPmNvdW50ID0gMDsKLSAgICAgIHAtPmVsZW1lbnRzID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocC0+cmVsb2MgIT0gcmVsb2MpCi0JewotCSAgZWluZm8gKF8oIiVQJVg6IERpZmZlcmVudCByZWxvY3MgdXNlZCBpbiBzZXQgJXNcbiIpLCBoLT5yb290LnN0cmluZyk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBEb24ndCBwZXJtaXQgYSBzZXQgdG8gYmUgY29uc3RydWN0ZWQgZnJvbSBkaWZmZXJlbnQgb2JqZWN0Ci0gICAgICAgICBmaWxlIGZvcm1hdHMuICBUaGUgc2FtZSByZWxvYyBtYXkgaGF2ZSBkaWZmZXJlbnQgcmVzdWx0cy4gIFdlCi0gICAgICAgICBhY3R1YWxseSBjb3VsZCBzb21ldGltZXMgaGFuZGxlIHRoaXMsIGJ1dCB0aGUgY2FzZSBpcwotICAgICAgICAgdW5saWtlbHkgdG8gZXZlciBhcmlzZS4gIFNvbWV0aW1lcyBjb25zdHJ1Y3RvciBzeW1ib2xzIGFyZSBpbgotICAgICAgICAgdW51c3VhbCBzZWN0aW9ucywgc3VjaCBhcyB0aGUgYWJzb2x1dGUgc2VjdGlvbi0tdGhpcyBhcHBlYXJzCi0gICAgICAgICB0byBiZSB0aGUgY2FzZSBpbiBMaW51eCBhLm91dC0tYW5kIGluIHN1Y2ggY2FzZXMgd2UganVzdAotICAgICAgICAgYXNzdW1lIGV2ZXJ5dGhpbmcgaXMgT0suICAqLwotICAgICAgaWYgKHAtPmVsZW1lbnRzICE9IE5VTEwKLQkgICYmIHNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICYmIHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChzZWN0aW9uLT5vd25lciksCi0JCSAgICAgYmZkX2dldF90YXJnZXQgKHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lcikpICE9IDApCi0JewotCSAgZWluZm8gKF8oIiVQJVg6IERpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIGNvbXBvc2luZyBzZXQgJXNcbiIpLAotCQkgaC0+cm9vdC5zdHJpbmcpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgZSA9IChzdHJ1Y3Qgc2V0X2VsZW1lbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2V0X2VsZW1lbnQpKTsKLSAgZS0+bmV4dCA9IE5VTEw7Ci0gIGUtPm5hbWUgPSBuYW1lOwotICBlLT5zZWN0aW9uID0gc2VjdGlvbjsKLSAgZS0+dmFsdWUgPSB2YWx1ZTsKLQotICBmb3IgKGVwcCA9ICZwLT5lbGVtZW50czsgKmVwcCAhPSBOVUxMOyBlcHAgPSAmKCplcHApLT5uZXh0KQotICAgIDsKLSAgKmVwcCA9IGU7Ci0KLSAgKytwLT5jb3VudDsKLX0KLQotLyogR2V0IHRoZSBwcmlvcml0eSBvZiBhIGcrKyBnbG9iYWwgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBmcm9tIHRoZQotICAgc3ltYm9sIG5hbWUuICAqLwotCi1zdGF0aWMgaW50Ci1jdG9yX3ByaW8gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIFRoZSBuYW1lIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSBfR0xPQkFMXyRJJDY1NTM1JHRlc3QwMl9fRnYuCi0gICAgIFRoZXJlIG1pZ2h0IGJlIGV4dHJhIGxlYWRpbmcgdW5kZXJzY29yZXMsIGFuZCB0aGUgJCBjaGFyYWN0ZXJzCi0gICAgIG1pZ2h0IGJlIHNvbWV0aGluZyBlbHNlLiAgVGhlIEkgbWlnaHQgYmUgYSBELiAgKi8KLQotICB3aGlsZSAoKm5hbWUgPT0gJ18nKQotICAgICsrbmFtZTsKLQotICBpZiAoc3RybmNtcCAobmFtZSwgIkdMT0JBTF8iLCAgc2l6ZW9mICJHTE9CQUxfIiAtIDEpICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIG5hbWUgKz0gc2l6ZW9mICJHTE9CQUxfIiAtIDE7Ci0KLSAgaWYgKG5hbWVbMF0gIT0gbmFtZVsyXSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChuYW1lWzFdICE9ICdJJyAmJiBuYW1lWzFdICE9ICdEJykKLSAgICByZXR1cm4gLTE7Ci0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBuYW1lWzNdKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIGF0b2kgKG5hbWUgKyAzKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNvcnQgY29uc3RydWN0b3IgZWxlbWVudHMgYnkgcHJpb3JpdHkuICBJdAotICAgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCi0KLXN0YXRpYyBpbnQKLWN0b3JfY21wIChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKipwZTEgPSAoY29uc3Qgc3RydWN0IHNldF9lbGVtZW50ICoqKSBwMTsKLSAgY29uc3Qgc3RydWN0IHNldF9lbGVtZW50ICoqcGUyID0gKGNvbnN0IHN0cnVjdCBzZXRfZWxlbWVudCAqKikgcDI7Ci0gIGNvbnN0IGNoYXIgKm4xOwotICBjb25zdCBjaGFyICpuMjsKLSAgaW50IHByaW8xOwotICBpbnQgcHJpbzI7Ci0KLSAgbjEgPSAoKnBlMSktPm5hbWU7Ci0gIGlmIChuMSA9PSBOVUxMKQotICAgIG4xID0gIiI7Ci0gIG4yID0gKCpwZTIpLT5uYW1lOwotICBpZiAobjIgPT0gTlVMTCkKLSAgICBuMiA9ICIiOwotCi0gIC8qIFdlIG5lZWQgdG8gc29ydCBpbiByZXZlcnNlIG9yZGVyIGJ5IHByaW9yaXR5LiAgV2hlbiB0d28KLSAgICAgY29uc3RydWN0b3JzIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksIHdlIHNob3VsZCBtYWludGFpbiB0aGVpcgotICAgICBjdXJyZW50IHJlbGF0aXZlIHBvc2l0aW9uLiAgKi8KLQotICBwcmlvMSA9IGN0b3JfcHJpbyAobjEpOwotICBwcmlvMiA9IGN0b3JfcHJpbyAobjIpOwotCi0gIC8qIFdlIHNvcnQgaW4gcmV2ZXJzZSBvcmRlciBiZWNhdXNlIHRoYXQgaXMgd2hhdCBnKysgZXhwZWN0cy4gICovCi0gIGlmIChwcmlvMSA8IHByaW8yKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChwcmlvMSA+IHByaW8yKQotICAgIHJldHVybiAtMTsKLQotICAvKiBGb3JjZSBhIHN0YWJsZSBzb3J0LiAgKi8KLQotICBpZiAocGUxIDwgcGUyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAocGUxID4gcGUyKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBmaXJzdCBwaGFzZSBvZiB0aGUgbGluayBhbmQKLSAgIGJlZm9yZSB0aGUgc2Vjb25kIHBoYXNlLiAgQXQgdGhpcyBwb2ludCBhbGwgc2V0IGluZm9ybWF0aW9uIGhhcwotICAgYmVlbiBnYXRoZXJlZC4gIFdlIG5vdyBwdXQgdGhlIHN0YXRlbWVudHMgdG8gYnVpbGQgdGhlIHNldHMKLSAgIHRoZW1zZWx2ZXMgaW50byBjb25zdHJ1Y3Rvcl9saXN0LiAgKi8KLQotdm9pZAotbGRjdG9yX2J1aWxkX3NldHMgKCkKLXsKLSAgc3RhdGljIGJvb2xlYW4gY2FsbGVkOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgYm9vbGVhbiBoZWFkZXJfcHJpbnRlZDsKLSAgc3RydWN0IHNldF9pbmZvICpwOwotCi0gIC8qIFRoZSBlbXVsYXRpb24gY29kZSBtYXkgY2FsbCB1cyBkaXJlY3RseSwgYnV0IHdlIG9ubHkgd2FudCB0byBkbwotICAgICB0aGlzIG9uY2UuICAqLwotICBpZiAoY2FsbGVkKQotICAgIHJldHVybjsKLSAgY2FsbGVkID0gdHJ1ZTsKLQotICBpZiAoY29uc3RydWN0b3JzX3NvcnRlZCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBzZXRzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGludCBjLCBpOwotCSAgc3RydWN0IHNldF9lbGVtZW50ICplOwotCSAgc3RydWN0IHNldF9lbGVtZW50ICoqYXJyYXk7Ci0KLQkgIGlmIChwLT5lbGVtZW50cyA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgYyA9IDA7Ci0JICBmb3IgKGUgPSBwLT5lbGVtZW50czsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLQkgICAgKytjOwotCi0JICBhcnJheSA9IChzdHJ1Y3Qgc2V0X2VsZW1lbnQgKiopIHhtYWxsb2MgKGMgKiBzaXplb2YgKmFycmF5KTsKLQotCSAgaSA9IDA7Ci0JICBmb3IgKGUgPSBwLT5lbGVtZW50czsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLQkgICAgewotCSAgICAgIGFycmF5W2ldID0gZTsKLQkgICAgICArK2k7Ci0JICAgIH0KLQotCSAgcXNvcnQgKGFycmF5LCBjLCBzaXplb2YgKmFycmF5LCBjdG9yX2NtcCk7Ci0KLQkgIGUgPSBhcnJheVswXTsKLQkgIHAtPmVsZW1lbnRzID0gZTsKLQkgIGZvciAoaSA9IDA7IGkgPCBjIC0gMTsgaSsrKQotCSAgICBhcnJheVtpXS0+bmV4dCA9IGFycmF5W2kgKyAxXTsKLQkgIGFycmF5W2ldLT5uZXh0ID0gTlVMTDsKLQotCSAgZnJlZSAoYXJyYXkpOwotCX0KLSAgICB9Ci0KLSAgb2xkID0gc3RhdF9wdHI7Ci0gIHN0YXRfcHRyID0gJmNvbnN0cnVjdG9yX2xpc3Q7Ci0KLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICBoZWFkZXJfcHJpbnRlZCA9IGZhbHNlOwotICBmb3IgKHAgPSBzZXRzOyBwICE9IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IHNldF9lbGVtZW50ICplOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBpbnQgcmVsb2Nfc2l6ZSwgc2l6ZTsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgaGF2ZSBiZWVuIGludm9rZWQgZnJvbQotCSBjb2xsZWN0LCBhbmQgdGhlIHNldHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGJ1aWx0LCBzbyB3ZSBkbwotCSBub3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQljb250aW51ZTsKLQotICAgICAgLyogRm9yIGVhY2ggc2V0IHdlIGJ1aWxkOgotCSAgIHNldDoKLQkgICAgIC5sb25nIG51bWJlcl9vZl9lbGVtZW50cwotCSAgICAgLmxvbmcgZWxlbWVudDAKLQkgICAgIC4uLgotCSAgICAgLmxvbmcgZWxlbWVudE4KLQkgICAgIC5sb25nIDAKLQkgZXhjZXB0IHRoYXQgd2UgdXNlIHRoZSByaWdodCBzaXplIGluc3RlYWQgb2YgLmxvbmcuICBXaGVuCi0JIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZ2VuZXJhdGUgcmVsb2NzIGluc3RlYWQgb2YKLQkgYWRkcmVzc2VzLiAgKi8KLSAgICAgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBwLT5yZWxvYyk7Ci0gICAgICBpZiAoaG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLQl7Ci0JICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGVpbmZvIChfKCIlUCVYOiAlcyBkb2VzIG5vdCBzdXBwb3J0IHJlbG9jICVzIGZvciBzZXQgJXNcbiIpLAotCQkgICAgIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwKLQkJICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocC0+cmVsb2MpLAotCQkgICAgIHAtPmgtPnJvb3Quc3RyaW5nKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBJZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGwgd2UgbmVlZCBpcyB0aGUKLQkgICAgIHNpemUsIHdoaWNoIHdlIGNhbiBnZXQgZnJvbSB0aGUgaW5wdXQgQkZELiAgKi8KLQkgIGlmIChwLT5lbGVtZW50cy0+c2VjdGlvbi0+b3duZXIgIT0gTlVMTCkKLQkgICAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lciwKLQkJCQkJICAgcC0+cmVsb2MpOwotCSAgaWYgKGhvd3RvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiJVAlWDogJXMgZG9lcyBub3Qgc3VwcG9ydCByZWxvYyAlcyBmb3Igc2V0ICVzXG4iKSwKLQkJICAgICBiZmRfZ2V0X3RhcmdldCAocC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyKSwKLQkJICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocC0+cmVsb2MpLAotCQkgICAgIHAtPmgtPnJvb3Quc3RyaW5nKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICAgICAgc3dpdGNoIChyZWxvY19zaXplKQotCXsKLQljYXNlIDE6IHNpemUgPSBCWVRFOyBicmVhazsKLQljYXNlIDI6IHNpemUgPSBTSE9SVDsgYnJlYWs7Ci0JY2FzZSA0OiBzaXplID0gTE9ORzsgYnJlYWs7Ci0JY2FzZSA4OgotCSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCi0JICAgIHNpemUgPSBTUVVBRDsKLQkgIGVsc2UKLQkgICAgc2l6ZSA9IFFVQUQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZWluZm8gKF8oIiVQJVg6IFVuc3VwcG9ydGVkIHNpemUgJWQgZm9yIHNldCAlc1xuIiksCi0JCSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKSwgcC0+aC0+cm9vdC5zdHJpbmcpOwotCSAgc2l6ZSA9IExPTkc7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCAiLiIsCi0JCQkJICAgICAgZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkJCQlleHBfaW50b3AgKHJlbG9jX3NpemUpKSkpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHAtPmgtPnJvb3Quc3RyaW5nLAotCQkJCSAgICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIikpKTsKLSAgICAgIGxhbmdfYWRkX2RhdGEgKHNpemUsIGV4cF9pbnRvcCAoKGJmZF92bWEpIHAtPmNvdW50KSk7Ci0KLSAgICAgIGZvciAoZSA9IHAtPmVsZW1lbnRzOyBlICE9IChzdHJ1Y3Qgc2V0X2VsZW1lbnQgKikgTlVMTDsgZSA9IGUtPm5leHQpCi0JewotCSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaW50IGxlbjsKLQotCSAgICAgIGlmICghIGhlYWRlcl9wcmludGVkKQotCQl7Ci0JCSAgbWluZm8gKF8oIlxuU2V0ICAgICAgICAgICAgICAgICBTeW1ib2xcblxuIikpOwotCQkgIGhlYWRlcl9wcmludGVkID0gdHJ1ZTsKLQkJfQotCi0JICAgICAgbWluZm8gKCIlcyIsIHAtPmgtPnJvb3Quc3RyaW5nKTsKLQkgICAgICBsZW4gPSBzdHJsZW4gKHAtPmgtPnJvb3Quc3RyaW5nKTsKLQotCSAgICAgIGlmIChsZW4gPj0gMTkpCi0JCXsKLQkJICBwcmludF9ubCAoKTsKLQkJICBsZW4gPSAwOwotCQl9Ci0JICAgICAgd2hpbGUgKGxlbiA8IDIwKQotCQl7Ci0JCSAgcHJpbnRfc3BhY2UgKCk7Ci0JCSAgKytsZW47Ci0JCX0KLQotCSAgICAgIGlmIChlLT5uYW1lICE9IE5VTEwpCi0JCW1pbmZvICgiJVRcbiIsIGUtPm5hbWUpOwotCSAgICAgIGVsc2UKLQkJbWluZm8gKCIlR1xuIiwgZS0+c2VjdGlvbi0+b3duZXIsIGUtPnNlY3Rpb24sIGUtPnZhbHVlKTsKLQkgICAgfQotCi0gICAgICAgICAgLyogTmVlZCBTRUNfS0VFUCBmb3IgLS1nYy1zZWN0aW9ucyAqLwotCSAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChlLT5zZWN0aW9uKSkKLQkgICAgZS0+c2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0tFRVA7Ci0KLQkgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCSAgICBsYW5nX2FkZF9yZWxvYyAocC0+cmVsb2MsIGhvd3RvLCBlLT5zZWN0aW9uLCBlLT5uYW1lLAotCQkJICAgIGV4cF9pbnRvcCAoZS0+dmFsdWUpKTsKLQkgIGVsc2UKLQkgICAgbGFuZ19hZGRfZGF0YSAoc2l6ZSwgZXhwX3JlbG9wIChlLT5zZWN0aW9uLCBlLT52YWx1ZSkpOwotCX0KLQotICAgICAgbGFuZ19hZGRfZGF0YSAoc2l6ZSwgZXhwX2ludG9wICgwKSk7Ci0gICAgfQotCi0gIHN0YXRfcHRyID0gb2xkOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRjdG9yLmggYi9sZC9sZGN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3M2Y3Ny4uMDAwMDAwMAotLS0gYS9sZC9sZGN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIGxkY3Rvci5oIC0gbGlua2VyIGNvbnN0cnVjdG9yIHN1cHBvcnQKLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRENUT1JfSAotI2RlZmluZSBMRENUT1JfSAotCi0vKiBMaXN0IG9mIHN0YXRlbWVudHMgbmVlZGVkIHRvIGhhbmRsZSBjb25zdHJ1Y3RvcnMgKi8KLWV4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY29uc3RydWN0b3JfbGlzdDsKLQotLyogV2hldGhlciB0aGUgY29uc3RydWN0b3JzIHNob3VsZCBiZSBzb3J0ZWQuICBOb3RlIHRoYXQgdGhpcyBpcwotICAgZ2xvYmFsIGZvciB0aGUgZW50aXJlIGxpbms7IHdlIGFzc3VtZSB0aGF0IHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUKLSAgIENPTlNUUlVDVE9SUyBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLWV4dGVybiBib29sZWFuIGNvbnN0cnVjdG9yc19zb3J0ZWQ7Ci0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgZm9yIGVhY2ggc2V0IHdlIGJ1aWxkLiAgKi8KLQotc3RydWN0IHNldF9pbmZvCi17Ci0gIHN0cnVjdCBzZXRfaW5mbyAqbmV4dDsJCS8qIE5leHQgc2V0LiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CS8qIEhhc2ggdGFibGUgZW50cnkuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7CS8qIFJlbG9jIHRvIHVzZSBmb3IgYW4gZW50cnkuICAqLwotICBzaXplX3QgY291bnQ7CQkJCS8qIE51bWJlciBvZiBlbGVtZW50cy4gICovCi0gIHN0cnVjdCBzZXRfZWxlbWVudCAqZWxlbWVudHM7CQkvKiBFbGVtZW50cyBpbiBzZXQuICAqLwotfTsKLQotc3RydWN0IHNldF9lbGVtZW50Ci17Ci0gIHN0cnVjdCBzZXRfZWxlbWVudCAqbmV4dDsJCS8qIE5leHQgZWxlbWVudC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7CQkJLyogTmFtZSBpbiBzZXQgKG1heSBiZSBOVUxMKS4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwkJCS8qIFNlY3Rpb24gb2YgdmFsdWUgaW4gc2V0LiAgKi8KLSAgYmZkX3ZtYSB2YWx1ZTsJCQkvKiBWYWx1ZSBpbiBzZXQuICAqLwotfTsKLQotLyogVGhlIHNldHMgd2UgaGF2ZSBzZWVuLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBzZXRfaW5mbyAqc2V0czsKLQotZXh0ZXJuIHZvaWQgbGRjdG9yX2FkZF9zZXRfZW50cnkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsCi0JCQkJCSAgY29uc3QgY2hhciAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCBsZGN0b3JfYnVpbGRfc2V0cyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRlbXVsLmMgYi9sZC9sZGVtdWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNGU0Ny4uMDAwMDAwMAotLS0gYS9sZC9sZGVtdWwuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKiBsZGVtdWwuYyAtLSBjbGVhcmluZyBob3VzZSBmb3IgbGQgZW11bGF0aW9uIHN0YXRlcwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC1saXN0LmgiCi0KLWxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKmxkX2VtdWxhdGlvbjsKLQotdm9pZAotbGRlbXVsX2hsbChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBsZF9lbXVsYXRpb24tPmhsbChuYW1lKTsKLX0KLQotCi12b2lkIGxkZW11bF9zeXNsaWIobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgbGRfZW11bGF0aW9uLT5zeXNsaWIobmFtZSk7Ci19Ci0KLXZvaWQKLWxkZW11bF9hZnRlcl9wYXJzZSgpCi17Ci0gIGxkX2VtdWxhdGlvbi0+YWZ0ZXJfcGFyc2UoKTsKLX0KLQotdm9pZAotbGRlbXVsX2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkX2VtdWxhdGlvbi0+YmVmb3JlX3BhcnNlKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9hZnRlcl9vcGVuICgpCi17Ci0gIGxkX2VtdWxhdGlvbi0+YWZ0ZXJfb3BlbiAoKTsKLX0KLQotdm9pZCAKLWxkZW11bF9hZnRlcl9hbGxvY2F0aW9uKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5hZnRlcl9hbGxvY2F0aW9uKCk7Ci19Ci0KLXZvaWQgCi1sZGVtdWxfYmVmb3JlX2FsbG9jYXRpb24oKQotewotICBpZiAobGRfZW11bGF0aW9uLT5iZWZvcmVfYWxsb2NhdGlvbikKLSAgICBsZF9lbXVsYXRpb24tPmJlZm9yZV9hbGxvY2F0aW9uKCk7Ci19Ci0KLQotdm9pZAotbGRlbXVsX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIGxkX2VtdWxhdGlvbi0+c2V0X291dHB1dF9hcmNoKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9maW5pc2goKQotewotICBpZiAobGRfZW11bGF0aW9uLT5maW5pc2gpCi0gICAgbGRfZW11bGF0aW9uLT5maW5pc2goKTsKLX0KLQotdm9pZAotbGRlbXVsX3NldF9zeW1ib2xzKCkKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+c2V0X3N5bWJvbHMpCi0gICAgbGRfZW11bGF0aW9uLT5zZXRfc3ltYm9scygpOwotfQotCi12b2lkCi1sZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMoKQotewotICBpZiAobGRfZW11bGF0aW9uLT5jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cykKLSAgICBsZF9lbXVsYXRpb24tPmNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKCk7Ci19Ci0KLWNoYXIgKgotbGRlbXVsX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsKLSAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+Z2V0X3NjcmlwdChpc2ZpbGUpOwotfQotCi1ib29sZWFuCi1sZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGlmIChsZF9lbXVsYXRpb24tPm9wZW5fZHluYW1pY19hcmNoaXZlKQotICAgIHJldHVybiAoKmxkX2VtdWxhdGlvbi0+b3Blbl9keW5hbWljX2FyY2hpdmUpIChhcmNoLCBzZWFyY2gsIGVudHJ5KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sZWFuCi1sZGVtdWxfcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+cGxhY2Vfb3JwaGFuKQotICAgIHJldHVybiAoKmxkX2VtdWxhdGlvbi0+cGxhY2Vfb3JwaGFuKSAoZmlsZSwgcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50Ci1sZGVtdWxfcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICAvKiBUcnkgYW5kIHVzZSB0aGUgZW11bGF0aW9uIHBhcnNlciBpZiB0aGVyZSBpcyBvbmUuICovCi0gIGlmIChsZF9lbXVsYXRpb24tPnBhcnNlX2FyZ3MpCi0gICAgewotICAgICAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+cGFyc2VfYXJncyAoYXJnYywgYXJndik7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogTGV0IHRoZSBlbXVsYXRpb24gY29kZSBoYW5kbGUgYW4gdW5yZWNvZ25pemVkIGZpbGUuICAqLwotCi1ib29sZWFuCi1sZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+dW5yZWNvZ25pemVkX2ZpbGUpCi0gICAgcmV0dXJuICgqbGRfZW11bGF0aW9uLT51bnJlY29nbml6ZWRfZmlsZSkgKGVudHJ5KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBMZXQgdGhlIGVtdWxhdGlvbiBjb2RlIGhhbmRsZSBhIHJlY29nbml6ZWQgZmlsZS4gICovCi0KLWJvb2xlYW4KLWxkZW11bF9yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+cmVjb2duaXplZF9maWxlKQotICAgIHJldHVybiAoKmxkX2VtdWxhdGlvbi0+cmVjb2duaXplZF9maWxlKSAoZW50cnkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNoYXIgKgotbGRlbXVsX2Nob29zZV90YXJnZXQoKQotewotICByZXR1cm4gbGRfZW11bGF0aW9uLT5jaG9vc2VfdGFyZ2V0KCk7Ci19Ci0KLS8qIFRoZSBkZWZhdWx0IGNob29zZV90YXJnZXQgZnVuY3Rpb24uICAqLwotCi1jaGFyICoKLWxkZW11bF9kZWZhdWx0X3RhcmdldCgpCi17Ci0gIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudiAoVEFSR0VUX0VOVklST04pOwotICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKLSAgICByZXR1cm4gZnJvbV9vdXRzaWRlOwotICByZXR1cm4gbGRfZW11bGF0aW9uLT50YXJnZXRfbmFtZTsKLX0KLQotdm9pZCAKLWFmdGVyX3BhcnNlX2RlZmF1bHQoKQotewotCi19Ci0KLXZvaWQKLWFmdGVyX29wZW5fZGVmYXVsdCAoKQotewotfQotCi12b2lkCi1hZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQoKQotewotCi19Ci0KLXZvaWQKLWJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQoKQotewotCi19Ci0KLXZvaWQKLXNldF9vdXRwdXRfYXJjaF9kZWZhdWx0KCkKLXsKLSAgLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGlmIHBvc3NpYmxlICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoKG91dHB1dF9iZmQsCi0JICAgICAgICAgICAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIGxkZmlsZV9vdXRwdXRfbWFjaGluZSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdm9pZAotc3lzbGliX2RlZmF1bHQoaWdub3JlKQotICAgICBjaGFyICAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGluZm9fbXNnIChfKCIlUyBTWVNMSUIgaWdub3JlZFxuIikpOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLWhsbF9kZWZhdWx0KGlnbm9yZSkKLSAgICAgY2hhciAgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbmZvX21zZyAoXygiJVMgSExMIGlnbm9yZWRcbiIpKTsKLX0KLQotbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqbGRfZW11bGF0aW9uc1tdID0geyBFTVVMQVRJT05fTElTVCB9OwotCi12b2lkCi1sZGVtdWxfY2hvb3NlX21vZGUodGFyZ2V0KQotICAgICBjaGFyICp0YXJnZXQ7Ci17Ci0gICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKmVwdHIgPSBsZF9lbXVsYXRpb25zOwotICAgIC8qIElnbm9yZSAiZ2xkIiBwcmVmaXguICovCi0gICAgaWYgKHRhcmdldFswXSA9PSAnZycgJiYgdGFyZ2V0WzFdID09ICdsJyAmJiB0YXJnZXRbMl0gPT0gJ2QnKQotCXRhcmdldCArPSAzOwotICAgIGZvciAoOyAqZXB0cjsgZXB0cisrKQotICAgICAgewotCWlmIChzdHJjbXAodGFyZ2V0LCAoKmVwdHIpLT5lbXVsYXRpb25fbmFtZSkgPT0gMCkKLQkgIHsKLQkgICAgbGRfZW11bGF0aW9uID0gKmVwdHI7Ci0JICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLSAgICBlaW5mbyAoXygiJVA6IHVucmVjb2duaXNlZCBlbXVsYXRpb24gbW9kZTogJXNcbiIpLCB0YXJnZXQpOwotICAgIGVpbmZvIChfKCJTdXBwb3J0ZWQgZW11bGF0aW9uczogIikpOwotICAgIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgKHN0ZGVycik7Ci0gICAgZWluZm8gKCIlRlxuIik7Ci19Ci0KLXZvaWQKLWxkZW11bF9saXN0X2VtdWxhdGlvbnMgKGYpCi0gICAgIEZJTEUgKmY7Ci17Ci0gIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiplcHRyID0gbGRfZW11bGF0aW9uczsKLSAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0KLSAgZm9yICg7ICplcHRyOyBlcHRyKyspCi0gICAgewotICAgICAgaWYgKGZpcnN0KQotCWZpcnN0ID0gZmFsc2U7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZiwgIiAiKTsKLSAgICAgIGZwcmludGYgKGYsICIlcyIsICgqZXB0ciktPmVtdWxhdGlvbl9uYW1lKTsKLSAgICB9Ci19Ci0KLXZvaWQKLWxkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zIChmKQotICAgICBGSUxFICogZjsKLXsKLSAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKiBlcHRyOwotICBpbnQgb3B0aW9uc19mb3VuZCA9IDA7Ci0gIAotICBmb3IgKGVwdHIgPSBsZF9lbXVsYXRpb25zOyAqIGVwdHI7IGVwdHIgKyspCi0gICAgewotICAgICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqIGVtdWwgPSAqIGVwdHI7Ci0gICAgICAKLSAgICAgIGlmIChlbXVsLT5saXN0X29wdGlvbnMpCi0JewotCSAgZnByaW50ZiAoZiwgIiVzOiBcbiIsIGVtdWwtPmVtdWxhdGlvbl9uYW1lKTsKLSAgICAgIAotCSAgZW11bC0+bGlzdF9vcHRpb25zIChmKTsKLQotCSAgb3B0aW9uc19mb3VuZCA9IDE7Ci0JfQotICAgIH0KLSAgCi0gIGlmICghIG9wdGlvbnNfZm91bmQpCi0gICAgZnByaW50ZiAoZiwgXygiICBubyBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9ucy5cbiIpKTsKLX0KLQotaW50Ci1sZGVtdWxfZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzIChuYW1lLCBlbnRyeSkKLSAgICAgY2hhciAqIG5hbWU7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiBlbnRyeTsKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+ZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzKQotICAgIHJldHVybiBsZF9lbXVsYXRpb24tPmZpbmRfcG90ZW50aWFsX2xpYnJhcmllcyAobmFtZSwgZW50cnkpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRlbXVsLmggYi9sZC9sZGVtdWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkOTEwMy4uMDAwMDAwMAotLS0gYS9sZC9sZGVtdWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKiBsZC1lbXVsLmggLSBMaW5rZXIgZW11bGF0aW9uIGhlYWRlciBmaWxlCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICovCi0KLSNpZm5kZWYgTERFTVVMX0gKLSNkZWZpbmUgTERFTVVMX0gKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdDsKLXN0cnVjdCBzZWFyY2hfZGlyczsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBsZGVtdWxfaGxsIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX3N5c2xpYiBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkZW11bF9hZnRlcl9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfc2V0X291dHB1dF9hcmNoIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBjaGFyICpsZGVtdWxfY2hvb3NlX3RhcmdldCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfY2hvb3NlX21vZGUgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfbGlzdF9lbXVsYXRpb25zIFBBUkFNUyAoKEZJTEUgKikpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gY2hhciAqbGRlbXVsX2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9maW5pc2ggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX3NldF9zeW1ib2xzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gYm9vbGVhbiBsZGVtdWxfcGxhY2Vfb3JwaGFuCi0gIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGludCBsZGVtdWxfcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLWV4dGVybiBib29sZWFuIGxkZW11bF91bnJlY29nbml6ZWRfZmlsZQotICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBib29sZWFuIGxkZW11bF9yZWNvZ25pemVkX2ZpbGUKLSAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc2VhcmNoX2RpcnMgKiwKLQkgICBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBjaGFyICpsZGVtdWxfZGVmYXVsdF90YXJnZXQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgYWZ0ZXJfcGFyc2VfZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBhZnRlcl9vcGVuX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgc3lzbGliX2RlZmF1bHQgUEFSQU1TICgoY2hhciopKTsKLWV4dGVybiB2b2lkIGhsbF9kZWZhdWx0IFBBUkFNUyAoKGNoYXIqKSk7Ci1leHRlcm4gaW50ICBsZGVtdWxfZmluZF9wb3RlbnRpYWxfbGlicmFyaWVzCi0gIFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci0KLXR5cGVkZWYgc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdAotewotICAvKiBSdW4gYmVmb3JlIHBhcnNpbmcgdGhlIGNvbW1hbmQgbGluZSBhbmQgc2NyaXB0IGZpbGUuCi0gICAgIFNldCB0aGUgYXJjaGl0ZWN0dXJlLCBtYXliZSBvdGhlciB0aGluZ3MuICAqLwotICB2b2lkICAgKCpiZWZvcmVfcGFyc2UpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBIYW5kbGUgdGhlIFNZU0xJQiAobG93IGxldmVsIGxpYnJhcnkpIHNjcmlwdCBjb21tYW5kLiAgKi8KLSAgdm9pZCAgICgqc3lzbGliKSBQQVJBTVMgKChjaGFyICopKTsKLQotICAvKiBIYW5kbGUgdGhlIEhMTCAoaGlnaCBsZXZlbCBsaWJyYXJ5KSBzY3JpcHQgY29tbWFuZC4gICovCi0gIHZvaWQgICAoKmhsbCkgUEFSQU1TICgoY2hhciAqKSk7Ci0KLSAgLyogUnVuIGFmdGVyIHBhcnNpbmcgdGhlIGNvbW1hbmQgbGluZSBhbmQgc2NyaXB0IGZpbGUuICAqLwotICB2b2lkICAgKCphZnRlcl9wYXJzZSkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIFJ1biBhZnRlciBvcGVuaW5nIGFsbCBpbnB1dCBmaWxlcywgYW5kIGxvYWRpbmcgdGhlIHN5bWJvbHMuICAqLwotICB2b2lkICAgKCphZnRlcl9vcGVuKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUnVuIGFmdGVyIGFsbG9jYXRpbmcgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLSAgdm9pZCAgICgqYWZ0ZXJfYWxsb2NhdGlvbikgUEFSQU1TICggKHZvaWQpKTsKLQotICAvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgaWYgcG9zc2libGUuICAqLwotICB2b2lkICAgKCpzZXRfb3V0cHV0X2FyY2gpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBEZWNpZGUgd2hpY2ggdGFyZ2V0IG5hbWUgdG8gdXNlLiAgKi8KLSAgY2hhciAqICgqY2hvb3NlX3RhcmdldCkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIFJ1biBiZWZvcmUgYWxsb2NhdGluZyBvdXRwdXQgc2VjdGlvbnMuICAqLwotICB2b2lkICAgKCpiZWZvcmVfYWxsb2NhdGlvbikgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgbGlua2VyIHNjcmlwdC4gICovCi0gIGNoYXIgKiAoKmdldF9zY3JpcHQpIFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhpcyBlbXVsYXRpb24uICAqLwotICBjaGFyICplbXVsYXRpb25fbmFtZTsKLQotICAvKiBUaGUgb3V0cHV0IGZvcm1hdC4gICovCi0gIGNoYXIgKnRhcmdldF9uYW1lOwotCi0gIC8qIFJ1biBhZnRlciBhc3NpZ25pbmcgdmFsdWVzIGZyb20gdGhlIHNjcmlwdC4gICovCi0gIHZvaWQJKCpmaW5pc2gpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBDcmVhdGUgYW55IG91dHB1dCBzZWN0aW9ucyBuZWVkZWQgYnkgdGhlIHRhcmdldC4gICovCi0gIHZvaWQJKCpjcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cykgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBsaWJyYXJ5LiAgQVJDSCBpcyBhbiBhcmNoaXRlY3R1cmUgbmFtZSwgYW5kCi0gICAgIGlzIG5vcm1hbGx5IHRoZSBlbXB0eSBzdHJpbmcuICBFTlRSWSBpcyB0aGUgbGFuZ19pbnB1dF9zdGF0ZW1lbnQKLSAgICAgdGhhdCBzaG91bGQgYmUgb3BlbmVkLiAgKi8KLSAgYm9vbGVhbiAoKm9wZW5fZHluYW1pY19hcmNoaXZlKQotICAgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2gsIHN0cnVjdCBzZWFyY2hfZGlycyAqLAotCSAgICAgc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqZW50cnkpKTsKLQotICAvKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFJldHVybiB0cnVlIGlmIGl0IHdhcyBwbGFjZWQsIGZhbHNlIGlmCi0gICAgIHRoZSBkZWZhdWx0IGFjdGlvbiBzaG91bGQgYmUgdGFrZW4uICBUaGlzIGZpZWxkIG1heSBiZSBOVUxMLCBpbgotICAgICB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aWxsIGFsd2F5cyBiZSB0YWtlbi4gICovCi0gIGJvb2xlYW4gKCpwbGFjZV9vcnBoYW4pCi0gICAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqLCBhc2VjdGlvbiAqKSk7Ci0KLSAgLyogUnVuIGFmdGVyIGFzc2lnbmluZyBwYXJzaW5nIHdpdGggdGhlIGFyZ3MsIGJ1dCBiZWZvcmUgCi0gICAgIHJlYWRpbmcgdGhlIHNjcmlwdC4gIFVzZWQgdG8gaW5pdGlhbGl6ZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHNjcmlwdC4gKi8KLSAgdm9pZAkoKnNldF9zeW1ib2xzKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUnVuIHRvIHBhcnNlIGFyZ3Mgd2hpY2ggdGhlIGJhc2UgbGlua2VyIGRvZXNuJ3QKLSAgICAgdW5kZXJzdGFuZC4gUmV0dXJuIG5vbiB6ZXJvIG9uIHN1Y2Vzcy4gKi8KLSAgaW50ICgqcGFyc2VfYXJncykgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLSAgLyogUnVuIHRvIGhhbmRsZSBmaWxlcyB3aGljaCBhcmUgbm90IHJlY29nbml6ZWQgYXMgb2JqZWN0IGZpbGVzIG9yCi0gICAgIGFyY2hpdmVzLiAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzIGhhbmRsZWQuICAqLwotICBib29sZWFuICgqdW5yZWNvZ25pemVkX2ZpbGUpCi0gICAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci0KLSAgLyogUnVuIHRvIGxpc3QgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIHdoaWNoIHBhcnNlX2FyZ3MgaGFuZGxlcy4gICovCi0gIHZvaWQgKCogbGlzdF9vcHRpb25zKSBQQVJBTVMgKChGSUxFICopKTsKLQotICAvKiBSdW4gdG8gc3BlY2lhbGx5IGhhbmRsZSBmaWxlcyB3aGljaCAqYXJlKiByZWNvZ25pemVkIGFzIG9iamVjdAotICAgICBmaWxlcyBvciBhcmNoaXZlcy4gIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHdhcyBoYW5kbGVkLiAgKi8KLSAgYm9vbGVhbiAoKnJlY29nbml6ZWRfZmlsZSkKLSAgICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLQotICAvKiBDYWxsZWQgd2hlbiBsb29raW5nIGZvciBsaWJyYXJpZXMgaW4gYSBkaXJlY3Rvcnkgc3BlY2lmaWVkCi0gICAgIHZpYSBhIGxpbmtlciBjb21tYW5kIGxpbmUgb3B0aW9uIG9yIGxpbmtlciBzY3JpcHQgb3B0aW9uLgotICAgICBGaWxlcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuICJsaWIqLmEiIGhhdmUgYWxyZWFkeSBiZWVuIHNjYW5uZWQuCi0gICAgIChGb3IgVk1TIGZpbGVzIG1hdGNoaW5nICI6bGliKi5hIiBoYXZlIGFsc28gYmVlbiBzY2FubmVkKS4gICovCi0gIGludCAoKiBmaW5kX3BvdGVudGlhbF9saWJyYXJpZXMpCi0gICAgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLSAgCi19IGxkX2VtdWxhdGlvbl94ZmVyX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSAKLXsKLSAgaW50ZWxfaWM5NjBfbGRfbW9kZV9lbnVtLAotICBkZWZhdWx0X21vZGVfZW51bSAsCi0gIGludGVsX2dsZDk2MF9sZF9tb2RlX2VudW0KLX0gbGFuZ19lbXVsYXRpb25fbW9kZV9lbnVtX3R5cGU7Ci0KLWV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlICpsZF9lbXVsYXRpb25zW107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRleHAuYyBiL2xkL2xkZXhwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzgzMTQuLjAwMDAwMDAKLS0tIGEvbGQvbGRleHAuYworKysgL2Rldi9udWxsCkBAIC0xLDk4NyArMCwwIEBACi0vKiBUaGlzIG1vZHVsZSBoYW5kbGVzIGV4cHJlc3Npb24gdHJlZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgKHNhY0BjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVRoaXMgbW9kdWxlIGlzIGluIGNoYXJnZSBvZiB3b3JraW5nIG91dCB0aGUgY29udGVudHMgb2YgZXhwcmVzc2lvbnMuCi0KLUl0IGhhcyB0byBrZWVwIHRyYWNrIG9mIHRoZSByZWxhdGl2ZS9hYnNuZXNzIG9mIGEgc3ltYm9sIGV0Yy4gVGhpcyBpcwotZG9uZSBieSBrZWVwaW5nIGFsbCB2YWx1ZXMgaW4gYSBzdHJ1Y3QgKGFuIGV0cmVlX3ZhbHVlX3R5cGUpIHdoaWNoCi1jb250YWlucyBhIHZhbHVlLCBhIHNlY3Rpb24gdG8gd2hpY2ggaXQgaXMgcmVsYXRpdmUgYW5kIGEgdmFsaWQgYml0LgotCi0qLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0KLXN0YXRpYyB2b2lkIGV4cF9wcmludF90b2tlbiBQQVJBTVMgKCh0b2tlbl9jb2RlX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgbWFrZV9hYnMgUEFSQU1TICgoZXRyZWVfdmFsdWVfdHlwZSAqcHRyKSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBuZXdfYWJzIFBBUkFNUyAoKGJmZF92bWEgdmFsdWUpKTsKLXN0YXRpYyB2b2lkIGNoZWNrIFBBUkFNUyAoKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zLAotCQkJICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqb3ApKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIG5ld19yZWwKLSAgUEFSQU1TICgoYmZkX3ZtYSB2YWx1ZSwgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqc2VjdGlvbikpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgbmV3X3JlbF9mcm9tX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkX3ZtYSB2YWx1ZSwgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqc2VjdGlvbikpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgZm9sZF9iaW5hcnkKLSAgUEFSQU1TICgoZXRyZWVfdHlwZSAqdHJlZSwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb24sCi0JICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZSwKLQkgICBiZmRfdm1hIGRvdCwgYmZkX3ZtYSAqZG90cCkpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgZm9sZF9uYW1lCi0gIFBBUkFNUyAoKGV0cmVlX3R5cGUgKnRyZWUsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uLAotCSAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmUsCi0JICAgYmZkX3ZtYSBkb3QpKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIGV4cF9mb2xkX3RyZWVfbm9fZG90Ci0gIFBBUkFNUyAoKGV0cmVlX3R5cGUgKnRyZWUsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uLAotCSAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmUpKTsKLQotc3RhdGljIHZvaWQKLWV4cF9wcmludF90b2tlbiAoY29kZSkKLSAgICAgdG9rZW5fY29kZV90eXBlIGNvZGU7Ci17Ci0gIHN0YXRpYyBDT05TVCBzdHJ1Y3QKLSAgICB7Ci0gICAgICB0b2tlbl9jb2RlX3R5cGUgY29kZTsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgfSB0YWJsZVtdID0KLSAgICAgIHsKLQl7IElOVCwJImludCIgfSwKLQl7IFJFTCwgInJlbG9jYXRlYWJsZSIgfSwKLQl7IE5BTUUsIk5BTUUiIH0sCi0JeyBQTFVTRVEsIis9IiB9LAotCXsgTUlOVVNFUSwiLT0iIH0sCi0JeyBNVUxURVEsIio9IiB9LAotCXsgRElWRVEsIi89IiB9LAotCXsgTFNISUZURVEsIjw8PSIgfSwKLQl7IFJTSElGVEVRLCI+Pj0iIH0sCi0JeyBBTkRFUSwiJj0iIH0sCi0JeyBPUkVRLCJ8PSIgfSwKLQl7IE9ST1IsInx8IiB9LAotCXsgQU5EQU5ELCImJiIgfSwKLQl7IEVRLCI9PSIgfSwKLQl7IE5FLCIhPSIgfSwKLQl7IExFLCI8PSIgfSwKLQl7IEdFLCI+PSIgfSwKLQl7IExTSElGVCwiPDwiIH0sCi0JeyBSU0hJRlQsIj4+PSIgfSwKLQl7IEFMSUdOX0ssIkFMSUdOIiB9LAotCXsgQkxPQ0ssIkJMT0NLIiB9LAotCXsgU0VDVElPTlMsIlNFQ1RJT05TIiB9LAotCXsgU0laRU9GX0hFQURFUlMsIlNJWkVPRl9IRUFERVJTIiB9LAotCXsgTkVYVCwiTkVYVCIgfSwKLQl7IFNJWkVPRiwiU0laRU9GIiB9LAotCXsgQUREUiwiQUREUiIgfSwKLQl7IExPQURBRERSLCJMT0FEQUREUiIgfSwKLQl7IE1FTU9SWSwiTUVNT1JZIiB9LAotCXsgREVGSU5FRCwiREVGSU5FRCIgfSwKLQl7IFRBUkdFVF9LLCJUQVJHRVQiIH0sCi0JeyBTRUFSQ0hfRElSLCJTRUFSQ0hfRElSIiB9LAotCXsgTUFQLCJNQVAiIH0sCi0JeyBRVUFELCJRVUFEIiB9LAotCXsgU1FVQUQsIlNRVUFEIiB9LAotCXsgTE9ORywiTE9ORyIgfSwKLQl7IFNIT1JULCJTSE9SVCIgfSwKLQl7IEJZVEUsIkJZVEUiIH0sCi0JeyBFTlRSWSwiRU5UUlkiIH0sCi0JeyAwLChjaGFyICopTlVMTCB9Ci0gICAgICB9OwotICB1bnNpZ25lZCBpbnQgaWR4OwotCi0gIGZvciAoaWR4ID0gMDsgdGFibGVbaWR4XS5uYW1lICE9IChjaGFyKilOVUxMOyBpZHgrKykgewotICAgIGlmICh0YWJsZVtpZHhdLmNvZGUgPT0gY29kZSkgewotICAgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsICIlcyIsIHRhYmxlW2lkeF0ubmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIC8qIE5vdCBpbiB0YWJsZSwganVzdCBwcmludCBpdCBhbG9uZSAqLwotICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwgIiVjIixjb2RlKTsKLX0KLQotc3RhdGljIHZvaWQgCi1tYWtlX2FicyAocHRyKQotICAgICBldHJlZV92YWx1ZV90eXBlICpwdHI7Ci17Ci0gICAgYXNlY3Rpb24gKnMgPSBwdHItPnNlY3Rpb24tPmJmZF9zZWN0aW9uOwotICAgIHB0ci0+dmFsdWUgKz0gcy0+dm1hOwotICAgIHB0ci0+c2VjdGlvbiA9IGFic19vdXRwdXRfc2VjdGlvbjsKLX0KLQotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUKLW5ld19hYnMgKHZhbHVlKQotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBldHJlZV92YWx1ZV90eXBlIG5ldzsKLSAgbmV3LnZhbGlkX3AgPSB0cnVlOwotICBuZXcuc2VjdGlvbiA9IGFic19vdXRwdXRfc2VjdGlvbjsKLSAgbmV3LnZhbHVlID0gdmFsdWU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkIAotY2hlY2sgKG9zLCBuYW1lLCBvcCkKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm9wOwotewotICBpZiAob3MgPT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJUYlUDogJXMgdXNlcyB1bmRlZmluZWQgc2VjdGlvbiAlc1xuIiksIG9wLCBuYW1lKTsKLSAgaWYgKCEgb3MtPnByb2Nlc3NlZCkKLSAgICBlaW5mbyAoXygiJUYlUDogJXMgZm9yd2FyZCByZWZlcmVuY2Ugb2Ygc2VjdGlvbiAlc1xuIiksIG9wLCBuYW1lKTsKLX0KLQotZXRyZWVfdHlwZSAqCi1leHBfaW50b3AgKHZhbHVlKQotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBldHJlZV90eXBlICpuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jKHNpemVvZihuZXctPnZhbHVlKSk7Ci0gIG5ldy0+dHlwZS5ub2RlX2NvZGUgPSBJTlQ7Ci0gIG5ldy0+dmFsdWUudmFsdWUgPSB2YWx1ZTsKLSAgbmV3LT50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV92YWx1ZTsKLSAgcmV0dXJuIG5ldzsKLQotfQotCi0vKiBCdWlsZCBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhbiB1bm5hbWVkIHJlbG9jYXRlYWJsZSB2YWx1ZS4gICovCi0KLWV0cmVlX3R5cGUgKgotZXhwX3JlbG9wIChzZWN0aW9uLCB2YWx1ZSkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGV0cmVlX3R5cGUgKm5ldyA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobmV3LT5yZWwpKTsKLSAgbmV3LT50eXBlLm5vZGVfY29kZSA9IFJFTDsKLSAgbmV3LT50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9yZWw7Ci0gIG5ldy0+cmVsLnNlY3Rpb24gPSBzZWN0aW9uOwotICBuZXctPnJlbC52YWx1ZSA9IHZhbHVlOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZQotbmV3X3JlbCAodmFsdWUsIHNlY3Rpb24pCi0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb247Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgbmV3OwotICBuZXcudmFsaWRfcCA9IHRydWU7Ci0gIG5ldy52YWx1ZSA9IHZhbHVlOwotICBuZXcuc2VjdGlvbiA9IHNlY3Rpb247Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlCi1uZXdfcmVsX2Zyb21fc2VjdGlvbiAodmFsdWUsIHNlY3Rpb24pCi0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb247Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgbmV3OwotICBuZXcudmFsaWRfcCA9IHRydWU7Ci0gIG5ldy52YWx1ZSA9IHZhbHVlOwotICBuZXcuc2VjdGlvbiA9IHNlY3Rpb247Ci0KLSAgICBuZXcudmFsdWUgLT0gc2VjdGlvbi0+YmZkX3NlY3Rpb24tPnZtYTsKLQotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSAKLWZvbGRfYmluYXJ5ICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci0gICAgIGJmZF92bWEgZG90OwotICAgICBiZmRfdm1hICpkb3RwOwotewotICBldHJlZV92YWx1ZV90eXBlIHJlc3VsdDsKLQotICByZXN1bHQgPSBleHBfZm9sZF90cmVlICh0cmVlLT5iaW5hcnkubGhzLCBjdXJyZW50X3NlY3Rpb24sCi0JCQkgIGFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKTsKLSAgaWYgKHJlc3VsdC52YWxpZF9wKQotICAgIHsKLSAgICAgIGV0cmVlX3ZhbHVlX3R5cGUgb3RoZXI7Ci0KLSAgICAgIG90aGVyID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YmluYXJ5LnJocywKLQkJCSAgICAgY3VycmVudF9zZWN0aW9uLAotCQkJICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCxkb3RwKSA7Ci0gICAgICBpZiAob3RoZXIudmFsaWRfcCkKLQl7Ci0JICAvKiBJZiB0aGUgdmFsdWVzIGFyZSBmcm9tIGRpZmZlcmVudCBzZWN0aW9ucywgb3IgdGhpcyBpcyBhbgotCSAgICAgYWJzb2x1dGUgZXhwcmVzc2lvbiwgbWFrZSBib3RoIHRoZSBzb3VyY2UgYXJndW1lbnRzCi0JICAgICBhYnNvbHV0ZS4gIEhvd2V2ZXIsIGFkZGluZyBvciBzdWJ0cmFjdGluZyBhbiBhYnNvbHV0ZQotCSAgICAgdmFsdWUgZnJvbSBhIHJlbGF0aXZlIHZhbHVlIGlzIG1lYW5pbmdmdWwsIGFuZCBpcyBhbgotCSAgICAgZXhjZXB0aW9uLiAgKi8KLQkgIGlmIChjdXJyZW50X3NlY3Rpb24gIT0gYWJzX291dHB1dF9zZWN0aW9uCi0JICAgICAgJiYgKG90aGVyLnNlY3Rpb24gPT0gYWJzX291dHB1dF9zZWN0aW9uCi0JCSAgfHwgKHJlc3VsdC5zZWN0aW9uID09IGFic19vdXRwdXRfc2VjdGlvbgotCQkgICAgICAmJiB0cmVlLT50eXBlLm5vZGVfY29kZSA9PSAnKycpKQotCSAgICAgICYmICh0cmVlLT50eXBlLm5vZGVfY29kZSA9PSAnKycKLQkJICB8fCB0cmVlLT50eXBlLm5vZGVfY29kZSA9PSAnLScpKQotCSAgICB7Ci0JICAgICAgZXRyZWVfdmFsdWVfdHlwZSBob2xkOwotCi0JICAgICAgLyogSWYgdGhlcmUgaXMgb25seSBvbmUgYWJzb2x1dGUgdGVybSwgbWFrZSBzdXJlIGl0IGlzIHRoZQotCQkgc2Vjb25kIG9uZS4gICovCi0JICAgICAgaWYgKG90aGVyLnNlY3Rpb24gIT0gYWJzX291dHB1dF9zZWN0aW9uKQotCQl7Ci0JCSAgaG9sZCA9IHJlc3VsdDsKLQkJICByZXN1bHQgPSBvdGhlcjsKLQkJICBvdGhlciA9IGhvbGQ7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocmVzdWx0LnNlY3Rpb24gIT0gb3RoZXIuc2VjdGlvbgotCQkgICB8fCBjdXJyZW50X3NlY3Rpb24gPT0gYWJzX291dHB1dF9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgbWFrZV9hYnMoJnJlc3VsdCk7Ci0JICAgICAgbWFrZV9hYnMoJm90aGVyKTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHRyZWUtPnR5cGUubm9kZV9jb2RlKSAKLQkgICAgewotCSAgICBjYXNlICclJzoKLQkgICAgICBpZiAob3RoZXIudmFsdWUgPT0gMCkKLQkJZWluZm8gKF8oIiVGJVMgJSUgYnkgemVyb1xuIikpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9ICgoYmZkX3NpZ25lZF92bWEpIHJlc3VsdC52YWx1ZQotCQkJICAgICAgJSAoYmZkX3NpZ25lZF92bWEpIG90aGVyLnZhbHVlKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcvJzoKLQkgICAgICBpZiAob3RoZXIudmFsdWUgPT0gMCkKLQkJZWluZm8gKF8oIiVGJVMgLyBieSB6ZXJvXG4iKSk7Ci0JICAgICAgcmVzdWx0LnZhbHVlID0gKChiZmRfc2lnbmVkX3ZtYSkgcmVzdWx0LnZhbHVlCi0JCQkgICAgICAvIChiZmRfc2lnbmVkX3ZtYSkgb3RoZXIudmFsdWUpOwotCSAgICAgIGJyZWFrOwotCi0jZGVmaW5lIEJPUCh4LHkpIGNhc2UgeCA6IHJlc3VsdC52YWx1ZSA9IHJlc3VsdC52YWx1ZSB5IG90aGVyLnZhbHVlOyBicmVhazsKLQkgICAgICBCT1AoJysnLCspOwotCSAgICAgIEJPUCgnKicsKik7Ci0JICAgICAgQk9QKCctJywtKTsKLQkgICAgICBCT1AoTFNISUZULDw8KTsKLQkgICAgICBCT1AoUlNISUZULD4+KTsKLQkgICAgICBCT1AoRVEsPT0pOwotCSAgICAgIEJPUChORSwhPSk7Ci0JICAgICAgQk9QKCc8Jyw8KTsKLQkgICAgICBCT1AoJz4nLD4pOwotCSAgICAgIEJPUChMRSw8PSk7Ci0JICAgICAgQk9QKEdFLD49KTsKLQkgICAgICBCT1AoJyYnLCYpOwotCSAgICAgIEJPUCgnXicsXik7Ci0JICAgICAgQk9QKCd8Jyx8KTsKLQkgICAgICBCT1AoQU5EQU5ELCYmKTsKLQkgICAgICBCT1AoT1JPUix8fCk7Ci0KLQkgICAgY2FzZSBNQVhfSzoKLQkgICAgICBpZiAocmVzdWx0LnZhbHVlIDwgb3RoZXIudmFsdWUpCi0JCXJlc3VsdCA9IG90aGVyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTUlOX0s6Ci0JICAgICAgaWYgKHJlc3VsdC52YWx1ZSA+IG90aGVyLnZhbHVlKQotCQlyZXN1bHQgPSBvdGhlcjsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIEZBSUwoKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotZXRyZWVfdmFsdWVfdHlwZSAKLWludmFsaWQgKCkKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSBuZXc7Ci0gIG5ldy52YWxpZF9wID0gZmFsc2U7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIAotZm9sZF9uYW1lICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwgZG90KQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSAgYWxsb2NhdGlvbl9kb25lOwotICAgICBiZmRfdm1hIGRvdDsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7Ci0gIHN3aXRjaCAodHJlZS0+dHlwZS5ub2RlX2NvZGUpIAotICAgICAgewotICAgICAgY2FzZSBTSVpFT0ZfSEVBREVSUzoKLQlpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkgCi0JICB7Ci0JICAgIHJlc3VsdCA9IG5ld19hYnMgKChiZmRfdm1hKQotCQkJICAgICAgYmZkX3NpemVvZl9oZWFkZXJzIChvdXRwdXRfYmZkLAotCQkJCQkJICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICByZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCSAgfQotCWJyZWFrOwotICAgICAgY2FzZSBERUZJTkVEOgotCWlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQllbHNlCi0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkgICAgICB0cmVlLT5uYW1lLm5hbWUsCi0JCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JICAgIHJlc3VsdC52YWx1ZSA9IChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCQkgICAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJCQl8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSk7Ci0JICAgIHJlc3VsdC5zZWN0aW9uID0gMDsKLQkgICAgcmVzdWx0LnZhbGlkX3AgPSB0cnVlOwotCSAgfQotCWJyZWFrOwotICAgICAgY2FzZSBOQU1FOgotCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JaWYgKHRyZWUtPm5hbWUubmFtZVswXSA9PSAnLicgJiYgdHJlZS0+bmFtZS5uYW1lWzFdID09IDApCi0JICB7Ci0JICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgICAgIHJlc3VsdCA9IG5ld19yZWxfZnJvbV9zZWN0aW9uKGRvdCwgY3VycmVudF9zZWN0aW9uKTsKLQkgICAgZWxzZQotCSAgICAgIHJlc3VsdCA9IGludmFsaWQoKTsKLQkgIH0KLQllbHNlIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICBoID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJICAgICAgdHJlZS0+bmFtZS5uYW1lLAotCQkJCQkgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICBpZiAoaCAhPSBOVUxMCi0JCSYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCSAgICAgIHsKLQkJaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+dS5kZWYuc2VjdGlvbikpCi0JCSAgcmVzdWx0ID0gbmV3X2FicyAoaC0+dS5kZWYudmFsdWUpOwotCQllbHNlIGlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19maW5hbF9waGFzZV9lbnVtCi0JCQkgfHwgYWxsb2NhdGlvbl9kb25lID09IGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtKQotCQkgIHsKLQkJICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCQkgICAgb3V0cHV0X3NlY3Rpb24gPSBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJICAgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCQkgICAgICBlaW5mbyAoXygiJVglUzogdW5yZXNvbHZhYmxlIHN5bWJvbCBgJXMnIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvblxuIiksCi0JCQkgICAgIHRyZWUtPm5hbWUubmFtZSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JCQlvcyA9IChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAKLQkJCSAgICAgIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgb3V0cHV0X3NlY3Rpb24pKSk7Ci0KLQkJCS8qIEZJWE1FOiBJcyB0aGlzIGNvcnJlY3QgaWYgdGhpcyBzZWN0aW9uIGlzCi0JCQkgICBiZWluZyBsaW5rZWQgd2l0aCAtUj8gICovCi0JCQlyZXN1bHQgPSBuZXdfcmVsICgoaC0+dS5kZWYudmFsdWUKLQkJCQkJICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSwKLQkJCQkJICBvcyk7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19maW5hbF9waGFzZV9lbnVtKQotCSAgICAgIGVpbmZvIChfKCIlRiVTOiB1bmRlZmluZWQgc3ltYm9sIGAlcycgcmVmZXJlbmNlZCBpbiBleHByZXNzaW9uXG4iKSwKLQkJICAgICB0cmVlLT5uYW1lLm5hbWUpOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlIEFERFI6Ci0JaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kICh0cmVlLT5uYW1lLm5hbWUpOwotCSAgICBjaGVjayAob3MsIHRyZWUtPm5hbWUubmFtZSwgIkFERFIiKTsKLQkgICAgcmVzdWx0ID0gbmV3X3JlbCAoMCwgb3MpOwotCSAgfQotCWVsc2UKLQkgIHJlc3VsdCA9IGludmFsaWQgKCk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgTE9BREFERFI6Ci0JaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kICh0cmVlLT5uYW1lLm5hbWUpOwotCSAgICBjaGVjayAob3MsIHRyZWUtPm5hbWUubmFtZSwgIkxPQURBRERSIik7Ci0JICAgIGlmIChvcy0+bG9hZF9iYXNlID09IE5VTEwpCi0JICAgICAgcmVzdWx0ID0gbmV3X3JlbCAoMCwgb3MpOwotCSAgICBlbHNlCi0JICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QgKG9zLT5sb2FkX2Jhc2UsCi0JCQkJCSAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJCQkgICAgIGFsbG9jYXRpb25fZG9uZSk7Ci0JICB9Ci0JZWxzZQotCSAgcmVzdWx0ID0gaW52YWxpZCAoKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBTSVpFT0Y6Ci0JaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JICB7Ci0gICAgICAgICAgICBpbnQgb3BiID0gYmZkX29jdGV0c19wZXJfYnl0ZSAob3V0cHV0X2JmZCk7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kICh0cmVlLT5uYW1lLm5hbWUpOwotCSAgICBjaGVjayAob3MsIHRyZWUtPm5hbWUubmFtZSwgIlNJWkVPRiIpOwotCSAgICByZXN1bHQgPSBuZXdfYWJzIChvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSAvIG9wYik7Ci0JICB9Ci0JZWxzZQotCSAgcmVzdWx0ID0gaW52YWxpZCAoKTsKLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlGQUlMKCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLWV0cmVlX3ZhbHVlX3R5cGUgCi1leHBfZm9sZF90cmVlICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSAgYWxsb2NhdGlvbl9kb25lOwotICAgICBiZmRfdm1hIGRvdDsKLSAgICAgYmZkX3ZtYSAqZG90cDsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7Ci0KLSAgaWYgKHRyZWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY2xhc3MpIAotICAgIHsKLSAgICBjYXNlIGV0cmVlX3ZhbHVlOgotICAgICAgcmVzdWx0ID0gbmV3X3JlbCAodHJlZS0+dmFsdWUudmFsdWUsIGN1cnJlbnRfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfcmVsOgotICAgICAgaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pCi0JcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLSAgICAgIGVsc2UKLQlyZXN1bHQgPSBuZXdfcmVsICgodHJlZS0+cmVsLnZhbHVlCi0JCQkgICArIHRyZWUtPnJlbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIHRyZWUtPnJlbC5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSwKLQkJCSAgY3VycmVudF9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9hc3NlcnQ6Ci0gICAgICByZXN1bHQgPSBleHBfZm9sZF90cmVlICh0cmVlLT5hc3NlcnRfcy5jaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKTsKLSAgICAgIGlmIChyZXN1bHQudmFsaWRfcCkKLQl7Ci0JICBpZiAoISByZXN1bHQudmFsdWUpCi0JICAgIGVpbmZvICgiJUYlUDogJXNcbiIsIHRyZWUtPmFzc2VydF9zLm1lc3NhZ2UpOwotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICByZXN1bHQgPSBleHBfZm9sZF90cmVlICh0cmVlLT51bmFyeS5jaGlsZCwKLQkJCSAgICAgIGN1cnJlbnRfc2VjdGlvbiwKLQkJCSAgICAgIGFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKTsKLSAgICAgIGlmIChyZXN1bHQudmFsaWRfcCkKLQl7Ci0JICBzd2l0Y2ggKHRyZWUtPnR5cGUubm9kZV9jb2RlKSAKLQkgICAgewotCSAgICBjYXNlIEFMSUdOX0s6Ci0JICAgICAgaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JCXJlc3VsdCA9IG5ld19yZWxfZnJvbV9zZWN0aW9uIChBTElHTl9OIChkb3QsIHJlc3VsdC52YWx1ZSksCi0JCQkJCSAgICAgICBjdXJyZW50X3NlY3Rpb24pOwotCSAgICAgIGVsc2UKLQkJcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFCU09MVVRFOgotCSAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtICYmIHJlc3VsdC52YWxpZF9wKQotCQl7Ci0JCSAgcmVzdWx0LnZhbHVlICs9IHJlc3VsdC5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hOwotCQkgIHJlc3VsdC5zZWN0aW9uID0gYWJzX291dHB1dF9zZWN0aW9uOwotCQl9Ci0JICAgICAgZWxzZSAKLQkJcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd+JzoKLQkgICAgICBtYWtlX2FicyAoJnJlc3VsdCk7Ci0JICAgICAgcmVzdWx0LnZhbHVlID0gfnJlc3VsdC52YWx1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICchJzoKLQkgICAgICBtYWtlX2FicyAoJnJlc3VsdCk7Ci0JICAgICAgcmVzdWx0LnZhbHVlID0gIXJlc3VsdC52YWx1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICctJzoKLQkgICAgICBtYWtlX2FicyAoJnJlc3VsdCk7Ci0JICAgICAgcmVzdWx0LnZhbHVlID0gLXJlc3VsdC52YWx1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5FWFQ6Ci0JICAgICAgLyogUmV0dXJuIG5leHQgcGxhY2UgYWxpZ25lZCB0byB2YWx1ZS4gICovCi0JICAgICAgaWYgKGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSkKLQkJewotCQkgIG1ha2VfYWJzICgmcmVzdWx0KTsKLQkJICByZXN1bHQudmFsdWUgPSBBTElHTl9OIChkb3QsIHJlc3VsdC52YWx1ZSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBGQUlMICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICByZXN1bHQgPSBleHBfZm9sZF90cmVlICh0cmVlLT50cmluYXJ5LmNvbmQsIGN1cnJlbnRfc2VjdGlvbiwKLQkJCSAgICAgIGFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKTsKLSAgICAgIGlmIChyZXN1bHQudmFsaWRfcCkKLQlyZXN1bHQgPSBleHBfZm9sZF90cmVlICgocmVzdWx0LnZhbHVlCi0JCQkJID8gdHJlZS0+dHJpbmFyeS5saHMKLQkJCQkgOiB0cmVlLT50cmluYXJ5LnJocyksCi0JCQkJY3VycmVudF9zZWN0aW9uLAotCQkJCWFsbG9jYXRpb25fZG9uZSwgZG90LCBkb3RwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICByZXN1bHQgPSBmb2xkX2JpbmFyeSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsCi0JCQkgICAgZG90LCBkb3RwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaWYgKHRyZWUtPmFzc2lnbi5kc3RbMF0gPT0gJy4nICYmIHRyZWUtPmFzc2lnbi5kc3RbMV0gPT0gMCkKLQl7Ci0JICAvKiBBc3NpZ25tZW50IHRvIGRvdCBjYW4gb25seSBiZSBkb25lIGR1cmluZyBhbGxvY2F0aW9uICovCi0JICBpZiAodHJlZS0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3Byb3ZpZGUpCi0JICAgIGVpbmZvIChfKCIlRiVTIGNhbiBub3QgUFJPVklERSBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXJcbiIpKTsKLQkgIGlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0KLQkgICAgICB8fCAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmluYWxfcGhhc2VfZW51bQotCQkgICYmIGN1cnJlbnRfc2VjdGlvbiA9PSBhYnNfb3V0cHV0X3NlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YXNzaWduLnNyYywKLQkJCQkgICAgICBjdXJyZW50X3NlY3Rpb24sCi0JCQkJICAgICAgbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0sIGRvdCwKLQkJCQkgICAgICBkb3RwKTsKLQkgICAgICBpZiAoISByZXN1bHQudmFsaWRfcCkKLQkJZWluZm8gKF8oIiVGJVMgaW52YWxpZCBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXJcbiIpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoY3VycmVudF9zZWN0aW9uID09IE5VTEwpCi0JCSAgICBlaW5mbyAoXygiJUYlUyBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXIgaW52YWxpZCBvdXRzaWRlIG9mIFNFQ1RJT05cbiIpKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF92bWEgbmV4dGRvdDsKLQotCQkgICAgICBuZXh0ZG90ID0gKHJlc3VsdC52YWx1ZQotCQkJCSArIGN1cnJlbnRfc2VjdGlvbi0+YmZkX3NlY3Rpb24tPnZtYSk7Ci0JCSAgICAgIGlmIChuZXh0ZG90IDwgZG90Ci0JCQkgICYmIGN1cnJlbnRfc2VjdGlvbiAhPSBhYnNfb3V0cHV0X3NlY3Rpb24pCi0JCQl7Ci0JCQkgIGVpbmZvIChfKCIlRiVTIGNhbm5vdCBtb3ZlIGxvY2F0aW9uIGNvdW50ZXIgYmFja3dhcmRzIChmcm9tICVWIHRvICVWKVxuIiksCi0JCQkJIGRvdCwgbmV4dGRvdCk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCSpkb3RwID0gbmV4dGRvdDsgCi0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZXN1bHQgPSBleHBfZm9sZF90cmVlICh0cmVlLT5hc3NpZ24uc3JjLAotCQkJCSAgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsCi0JCQkJICBkb3QsIGRvdHApOwotCSAgaWYgKHJlc3VsdC52YWxpZF9wKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBjcmVhdGU7Ci0JICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpZiAodHJlZS0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX2Fzc2lnbikKLQkJY3JlYXRlID0gdHJ1ZTsKLQkgICAgICBlbHNlCi0JCWNyZWF0ZSA9IGZhbHNlOwotCSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHRyZWUtPmFzc2lnbi5kc3QsCi0JCQkJCWNyZWF0ZSwgZmFsc2UsIGZhbHNlKTsKLQkgICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJewotCQkgIGlmICh0cmVlLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfYXNzaWduKQotCQkgICAgZWluZm8gKF8oIiVQJUY6JXM6IGhhc2ggY3JlYXRpb24gZmFpbGVkXG4iKSwKLQkJCSAgIHRyZWUtPmFzc2lnbi5kc3QpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAodHJlZS0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3Byb3ZpZGUKLQkJICAgICAgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJICAgICAgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JCXsKLQkJICAvKiBEbyBub3RoaW5nLiAgVGhlIHN5bWJvbCB3YXMgZGVmaW5lZCBieSBzb21lCi0JCSAgICAgb2JqZWN0LiAgKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEZJWE1FOiBTaG91bGQgd2Ugd29ycnkgaWYgdGhlIHN5bWJvbCBpcyBhbHJlYWR5Ci0JCSAgICAgZGVmaW5lZD8gICovCi0JCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkJICBoLT51LmRlZi52YWx1ZSA9IHJlc3VsdC52YWx1ZTsKLQkJICBoLT51LmRlZi5zZWN0aW9uID0gcmVzdWx0LnNlY3Rpb24tPmJmZF9zZWN0aW9uOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfbmFtZToKLSAgICAgIHJlc3VsdCA9IGZvbGRfbmFtZSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBGQUlMICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIAotZXhwX2ZvbGRfdHJlZV9ub19kb3QgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci17Ci1yZXR1cm4gZXhwX2ZvbGRfdHJlZSh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwgKGJmZF92bWEpCi0JCSAgICAgMCwgKGJmZF92bWEgKilOVUxMKTsKLX0KLQotZXRyZWVfdHlwZSAqCi1leHBfYmlub3AgKGNvZGUsIGxocywgcmhzKQotICAgICBpbnQgY29kZTsKLSAgICAgZXRyZWVfdHlwZSAqbGhzOwotICAgICBldHJlZV90eXBlICpyaHM7Ci17Ci0gIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcjsKLQotICB2YWx1ZS50eXBlLm5vZGVfY29kZSA9IGNvZGU7Ci0gIHZhbHVlLmJpbmFyeS5saHMgPSBsaHM7Ci0gIHZhbHVlLmJpbmFyeS5yaHMgPSByaHM7Ci0gIHZhbHVlLnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX2JpbmFyeTsKLSAgciA9IGV4cF9mb2xkX3RyZWVfbm9fZG90KCZ2YWx1ZSwKLQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSApOwotICBpZiAoci52YWxpZF9wKQotICAgIHsKLSAgICAgIHJldHVybiBleHBfaW50b3Aoci52YWx1ZSk7Ci0gICAgfQotICBuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+YmluYXJ5KSk7Ci0gIG1lbWNweSgoY2hhciAqKW5ldywgKGNoYXIgKikmdmFsdWUsIHNpemVvZihuZXctPmJpbmFyeSkpOwotICByZXR1cm4gbmV3OwotfQotCi1ldHJlZV90eXBlICoKLWV4cF90cmlub3AgKGNvZGUsIGNvbmQsIGxocywgcmhzKQotICAgICBpbnQgY29kZTsKLSAgICAgZXRyZWVfdHlwZSAqY29uZDsKLSAgICAgZXRyZWVfdHlwZSAqbGhzOwotICAgICBldHJlZV90eXBlICpyaHM7Ci17Ci0gIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcjsKLSAgdmFsdWUudHlwZS5ub2RlX2NvZGUgPSBjb2RlOwotICB2YWx1ZS50cmluYXJ5LmxocyA9IGxoczsKLSAgdmFsdWUudHJpbmFyeS5jb25kID0gY29uZDsKLSAgdmFsdWUudHJpbmFyeS5yaHMgPSByaHM7Ci0gIHZhbHVlLnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX3RyaW5hcnk7Ci0gIHI9IGV4cF9mb2xkX3RyZWVfbm9fZG90KCZ2YWx1ZSwgIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlCi0JCQkJICAgICopTlVMTCxsYW5nX2ZpcnN0X3BoYXNlX2VudW0pOwotICBpZiAoci52YWxpZF9wKSB7Ci0gICAgcmV0dXJuIGV4cF9pbnRvcChyLnZhbHVlKTsKLSAgfQotICBuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+dHJpbmFyeSkpOwotICBtZW1jcHkoKGNoYXIgKiluZXcsKGNoYXIgKikgJnZhbHVlLCBzaXplb2YobmV3LT50cmluYXJ5KSk7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLQotZXRyZWVfdHlwZSAqCi1leHBfdW5vcCAoY29kZSwgY2hpbGQpCi0gICAgIGludCBjb2RlOwotICAgICBldHJlZV90eXBlICpjaGlsZDsKLXsKLSAgZXRyZWVfdHlwZSB2YWx1ZSwgKm5ldzsKLQotICBldHJlZV92YWx1ZV90eXBlIHI7Ci0gIHZhbHVlLnVuYXJ5LnR5cGUubm9kZV9jb2RlID0gY29kZTsKLSAgdmFsdWUudW5hcnkuY2hpbGQgPSBjaGlsZDsKLSAgdmFsdWUudW5hcnkudHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfdW5hcnk7Ci0gIHIgPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLSAgaWYgKHIudmFsaWRfcCkgewotICAgIHJldHVybiBleHBfaW50b3Aoci52YWx1ZSk7Ci0gIH0KLSAgbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPnVuYXJ5KSk7Ci0gIG1lbWNweSgoY2hhciAqKW5ldywgKGNoYXIgKikmdmFsdWUsIHNpemVvZihuZXctPnVuYXJ5KSk7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLQotZXRyZWVfdHlwZSAqCi1leHBfbmFtZW9wIChjb2RlLCBuYW1lKQotICAgICBpbnQgY29kZTsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgZXRyZWVfdHlwZSB2YWx1ZSwgKm5ldzsKLSAgZXRyZWVfdmFsdWVfdHlwZSByOwotICB2YWx1ZS5uYW1lLnR5cGUubm9kZV9jb2RlID0gY29kZTsKLSAgdmFsdWUubmFtZS5uYW1lID0gbmFtZTsKLSAgdmFsdWUubmFtZS50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9uYW1lOwotCi0KLSAgciA9IGV4cF9mb2xkX3RyZWVfbm9fZG90KCZ2YWx1ZSwKLQkJCSAgIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopTlVMTCwKLQkJCSAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0gIGlmIChyLnZhbGlkX3ApIHsKLSAgICByZXR1cm4gZXhwX2ludG9wKHIudmFsdWUpOwotICB9Ci0gIG5ldyA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobmV3LT5uYW1lKSk7Ci0gIG1lbWNweSgoY2hhciAqKW5ldywgKGNoYXIgKikmdmFsdWUsIHNpemVvZihuZXctPm5hbWUpKTsKLSAgcmV0dXJuIG5ldzsKLQotfQotCi0KLQotCi1ldHJlZV90eXBlICoKLWV4cF9hc3NvcCAoY29kZSwgZHN0LCBzcmMpCi0gICAgIGludCBjb2RlOwotICAgICBDT05TVCBjaGFyICpkc3Q7Ci0gICAgIGV0cmVlX3R5cGUgKnNyYzsKLXsKLSAgZXRyZWVfdHlwZSB2YWx1ZSwgKm5ldzsKLQotICB2YWx1ZS5hc3NpZ24udHlwZS5ub2RlX2NvZGUgPSBjb2RlOwotCi0KLSAgdmFsdWUuYXNzaWduLnNyYyA9IHNyYzsKLSAgdmFsdWUuYXNzaWduLmRzdCA9IGRzdDsKLSAgdmFsdWUuYXNzaWduLnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX2Fzc2lnbjsKLQotI2lmIDAKLSAgaWYgKGV4cF9mb2xkX3RyZWVfbm9fZG90KCZ2YWx1ZSwgJnJlc3VsdCkpIHsKLSAgICByZXR1cm4gZXhwX2ludG9wKHJlc3VsdCk7Ci0gIH0KLSNlbmRpZgotICBuZXcgPSAoZXRyZWVfdHlwZSopIHN0YXRfYWxsb2MgKHNpemVvZiAobmV3LT5hc3NpZ24pKTsKLSAgbWVtY3B5KChjaGFyICopbmV3LCAoY2hhciAqKSZ2YWx1ZSwgc2l6ZW9mKG5ldy0+YXNzaWduKSk7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIEhhbmRsZSBQUk9WSURFLiAgKi8KLQotZXRyZWVfdHlwZSAqCi1leHBfcHJvdmlkZSAoZHN0LCBzcmMpCi0gICAgIGNvbnN0IGNoYXIgKmRzdDsKLSAgICAgZXRyZWVfdHlwZSAqc3JjOwotewotICBldHJlZV90eXBlICpuOwotCi0gIG4gPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG4tPmFzc2lnbikpOwotICBuLT5hc3NpZ24udHlwZS5ub2RlX2NvZGUgPSAnPSc7Ci0gIG4tPmFzc2lnbi50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9wcm92aWRlOwotICBuLT5hc3NpZ24uc3JjID0gc3JjOwotICBuLT5hc3NpZ24uZHN0ID0gZHN0OwotICByZXR1cm4gbjsKLX0KLQotLyogSGFuZGxlIEFTU0VSVC4gICovCi0KLWV0cmVlX3R5cGUgKgotZXhwX2Fzc2VydCAoZXhwLCBtZXNzYWdlKQotICAgICBldHJlZV90eXBlICpleHA7Ci0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGV0cmVlX3R5cGUgKm47Ci0KLSAgbiA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobi0+YXNzZXJ0X3MpKTsKLSAgbi0+YXNzZXJ0X3MudHlwZS5ub2RlX2NvZGUgPSAnISc7Ci0gIG4tPmFzc2VydF9zLnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX2Fzc2VydDsKLSAgbi0+YXNzZXJ0X3MuY2hpbGQgPSBleHA7Ci0gIG4tPmFzc2VydF9zLm1lc3NhZ2UgPSBtZXNzYWdlOwotICByZXR1cm4gbjsKLX0KLQotdm9pZCAKLWV4cF9wcmludF90cmVlICh0cmVlKQotICAgICBldHJlZV90eXBlICp0cmVlOwotewotICBzd2l0Y2ggKHRyZWUtPnR5cGUubm9kZV9jbGFzcykgewotICBjYXNlIGV0cmVlX3ZhbHVlOgotICAgIG1pbmZvICgiMHgldiIsIHRyZWUtPnZhbHVlLnZhbHVlKTsKLSAgICByZXR1cm47Ci0gIGNhc2UgZXRyZWVfcmVsOgotICAgIGlmICh0cmVlLT5yZWwuc2VjdGlvbi0+b3duZXIgIT0gTlVMTCkKLSAgICAgIG1pbmZvICgiJUI6IiwgdHJlZS0+cmVsLnNlY3Rpb24tPm93bmVyKTsKLSAgICBtaW5mbyAoIiVzKzB4JXYiLCB0cmVlLT5yZWwuc2VjdGlvbi0+bmFtZSwgdHJlZS0+cmVsLnZhbHVlKTsKLSAgICByZXR1cm47Ci0gIGNhc2UgZXRyZWVfYXNzaWduOgotI2lmIDAKLSAgICBpZiAodHJlZS0+YXNzaWduLmRzdC0+c2RlZnMgIT0gKGFzeW1ib2wgKilOVUxMKXsKLSAgICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIlcyAoJXgpICIsdHJlZS0+YXNzaWduLmRzdC0+bmFtZSwKLQkgICAgICB0cmVlLT5hc3NpZ24uZHN0LT5zZGVmcy0+dmFsdWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIlcyAoVU5ERUZJTkVEKSIsdHJlZS0+YXNzaWduLmRzdC0+bmFtZSk7Ci0gICAgfQotI2VuZGlmCi0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIiVzIix0cmVlLT5hc3NpZ24uZHN0KTsKLSAgICBleHBfcHJpbnRfdG9rZW4odHJlZS0+dHlwZS5ub2RlX2NvZGUpOwotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPmFzc2lnbi5zcmMpOwotICAgIGJyZWFrOwotICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiUFJPVklERSAoJXMsICIsIHRyZWUtPmFzc2lnbi5kc3QpOwotICAgIGV4cF9wcmludF90cmVlICh0cmVlLT5hc3NpZ24uc3JjKTsKLSAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICIpIik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIoIik7Ci0gICAgZXhwX3ByaW50X3RyZWUodHJlZS0+YmluYXJ5Lmxocyk7Ci0gICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnR5cGUubm9kZV9jb2RlKTsKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT5iaW5hcnkucmhzKTsKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKSIpOwotICAgIGJyZWFrOwotICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgZXhwX3ByaW50X3RyZWUodHJlZS0+dHJpbmFyeS5jb25kKTsKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiPyIpOwotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPnRyaW5hcnkubGhzKTsKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiOiIpOwotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPnRyaW5hcnkucmhzKTsKLSAgICBicmVhazsKLSAgY2FzZSBldHJlZV91bmFyeToKLSAgICBleHBfcHJpbnRfdG9rZW4odHJlZS0+dW5hcnkudHlwZS5ub2RlX2NvZGUpOwotICAgIGlmICh0cmVlLT51bmFyeS5jaGlsZCkgCi0gICAgewotICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIoIik7Ci0gICAgZXhwX3ByaW50X3RyZWUodHJlZS0+dW5hcnkuY2hpbGQpOwotICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIpIik7Ci0gIH0KLSAgICAKLSAgICBicmVhazsKLQotICBjYXNlIGV0cmVlX2Fzc2VydDoKLSAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJBU1NFUlQgKCIpOwotICAgIGV4cF9wcmludF90cmVlICh0cmVlLT5hc3NlcnRfcy5jaGlsZCk7Ci0gICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiLCAlcykiLCB0cmVlLT5hc3NlcnRfcy5tZXNzYWdlKTsKLSAgICBicmVhazsKLQotICBjYXNlIGV0cmVlX3VuZGVmOgotICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCI/Pz8/Pz8/PyIpOwotICAgIGJyZWFrOwotICBjYXNlIGV0cmVlX25hbWU6Ci0gICAgaWYgKHRyZWUtPnR5cGUubm9kZV9jb2RlID09IE5BTUUpIHsKLSAgICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIlcyIsIHRyZWUtPm5hbWUubmFtZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnR5cGUubm9kZV9jb2RlKTsKLSAgICAgIGlmICh0cmVlLT5uYW1lLm5hbWUpCi0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKCVzKSIsIHRyZWUtPm5hbWUubmFtZSk7Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEZBSUwoKTsKLSAgICBicmVhazsKLSAgfQotfQotCi1iZmRfdm1hCi1leHBfZ2V0X3ZtYSAodHJlZSwgZGVmLCBuYW1lLCBhbGxvY2F0aW9uX2RvbmUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGJmZF92bWEgZGVmOwotICAgICBjaGFyICpuYW1lOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotewotICBldHJlZV92YWx1ZV90eXBlIHI7Ci0KLSAgaWYgKHRyZWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QgKHRyZWUsIGFic19vdXRwdXRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lKTsKLSAgICAgIGlmICghIHIudmFsaWRfcCAmJiBuYW1lICE9IE5VTEwpCi0JZWluZm8gKF8oIiVGJVMgbm9uY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIpLCBuYW1lKTsKLSAgICAgIHJldHVybiByLnZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiBkZWY7Ci19Ci0KLWludCAKLWV4cF9nZXRfdmFsdWVfaW50ICh0cmVlLGRlZixuYW1lLCBhbGxvY2F0aW9uX2RvbmUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGludCBkZWY7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci17Ci0gIHJldHVybiAoaW50KWV4cF9nZXRfdm1hKHRyZWUsKGJmZF92bWEpZGVmLG5hbWUsIGFsbG9jYXRpb25fZG9uZSk7Ci19Ci0KLQotYmZkX3ZtYQotZXhwX2dldF9hYnNfaW50ICh0cmVlLCBkZWYsIG5hbWUsIGFsbG9jYXRpb25fZG9uZSkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgaW50IGRlZiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpuYW1lOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotewotICBldHJlZV92YWx1ZV90eXBlIHJlczsKLSAgcmVzID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QgKHRyZWUsIGFic19vdXRwdXRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lKTsKLQotICBpZiAocmVzLnZhbGlkX3ApCi0gICAgewotICAgICAgcmVzLnZhbHVlICs9IHJlcy5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hOwotICAgIH0KLSAgZWxzZSB7Ci0gICAgZWluZm8gKF8oIiVGJVMgbm9uIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yICVzXG4iKSxuYW1lKTsKLSAgfQotICByZXR1cm4gcmVzLnZhbHVlOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRleHAuaCBiL2xkL2xkZXhwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZThkZGYuLjAwMDAwMDAKLS0tIGEvbGQvbGRleHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBsZGV4cC5oIC0KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMREVYUF9ICi0jZGVmaW5lIExERVhQX0gKLQotLyogVGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIHRyZWUgKi8KLXR5cGVkZWYgc3RydWN0IAotewotICBiZmRfdm1hIHZhbHVlOwotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfc3RydWN0ICpzZWN0aW9uOwotICBib29sZWFuIHZhbGlkX3A7Ci19IGV0cmVlX3ZhbHVlX3R5cGU7Ci0KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgaW50IG5vZGVfY29kZTsKLSAgZW51bSB7IGV0cmVlX2JpbmFyeSwKLQkgICBldHJlZV90cmluYXJ5LAotCSAgIGV0cmVlX3VuYXJ5LAotCSAgIGV0cmVlX25hbWUsCi0JICAgZXRyZWVfYXNzaWduLAotCSAgIGV0cmVlX3Byb3ZpZGUsCi0JICAgZXRyZWVfdW5kZWYsCi0JICAgZXRyZWVfdW5zcGVjLAotCSAgIGV0cmVlX3ZhbHVlLAotCSAgIGV0cmVlX2Fzc2VydCwKLQkgICBldHJlZV9yZWwgfSBub2RlX2NsYXNzOwotfSBub2RlX3R5cGU7Ci0KLQotCi10eXBlZGVmIHVuaW9uIGV0cmVlX3VuaW9uIAotewotICBub2RlX3R5cGUgdHlwZTsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqbGhzOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpyaHM7Ci0gIH0gYmluYXJ5OwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpjb25kOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpsaHM7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKnJoczsKLSAgfSB0cmluYXJ5OwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIENPTlNUIGNoYXIgKmRzdDsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqc3JjOwotICB9IGFzc2lnbjsKLQotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIHVuaW9uICAgZXRyZWVfdW5pb24gKmNoaWxkOwotICB9IHVuYXJ5OwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgfSBuYW1lOwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIGJmZF92bWEgdmFsdWU7Ci0gIH0gdmFsdWU7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgYmZkX3ZtYSB2YWx1ZTsKLSAgfSByZWw7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKmNoaWxkOwotICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci0gIH0gYXNzZXJ0X3M7Ci19IGV0cmVlX3R5cGU7Ci0KLQotZXRyZWVfdHlwZSAqZXhwX2ludG9wIFBBUkFNUyAoKGJmZF92bWEpKTsKLWV0cmVlX3R5cGUgKmV4cF9yZWxvcCBQQVJBTVMgKChhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1ldHJlZV92YWx1ZV90eXBlIGludmFsaWQgUEFSQU1TICgodm9pZCkpOwotZXRyZWVfdmFsdWVfdHlwZSBleHBfZm9sZF90cmVlIFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgc3RydWN0Ci0JCQkJCWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3N0cnVjdCAqLAotCQkJCQlsYW5nX3BoYXNlX3R5cGUsCi0JCQkJCWJmZF92bWEsIGJmZF92bWEgKikpOwotZXRyZWVfdHlwZSAqZXhwX2Jpbm9wIFBBUkFNUyAoKGludCwgZXRyZWVfdHlwZSAqLCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF90cmlub3AgUEFSQU1TICgoaW50LGV0cmVlX3R5cGUgKiwgZXRyZWVfdHlwZSAqLCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF91bm9wIFBBUkFNUyAoKGludCwgZXRyZWVfdHlwZSAqKSk7Ci1ldHJlZV90eXBlICpleHBfbmFtZW9wIFBBUkFNUyAoKGludCwgQ09OU1QgY2hhciAqKSk7Ci1ldHJlZV90eXBlICpleHBfYXNzb3AgUEFSQU1TICgoaW50LCBDT05TVCBjaGFyICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX3Byb3ZpZGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF9hc3NlcnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBjb25zdCBjaGFyICopKTsKLXZvaWQgZXhwX3ByaW50X3RyZWUgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1iZmRfdm1hIGV4cF9nZXRfdm1hIFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgYmZkX3ZtYSwgY2hhciAqLCBsYW5nX3BoYXNlX3R5cGUpKTsKLWludCBleHBfZ2V0X3ZhbHVlX2ludCBQQVJBTVMgKChldHJlZV90eXBlICosIGludCwgY2hhciAqLGxhbmdfcGhhc2VfdHlwZSkpOwotYmZkX3ZtYSBleHBfZ2V0X2Fic19pbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBpbnQsIGNoYXIgKixsYW5nX3BoYXNlX3R5cGUpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGZpbGUuYyBiL2xkL2xkZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjEzYzA3Li4wMDAwMDAwCi0tLSBhL2xkL2xkZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qIExpbmtlciBmaWxlIG9wZW5pbmcgYW5kIHNlYXJjaGluZy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gbGRmaWxlLmMKLQotIGxvb2sgYWZ0ZXIgYWxsIHRoZSBmaWxlIHN0dWZmCi0KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciAqbGRmaWxlX2lucHV0X2ZpbGVuYW1lOwotYm9vbGVhbiBsZGZpbGVfYXNzdW1lZF9zY3JpcHQgPSBmYWxzZTsKLWNvbnN0IGNoYXIgKmxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lID0gIiI7Ci11bnNpZ25lZCBsb25nIGxkZmlsZV9vdXRwdXRfbWFjaGluZTsKLWVudW0gYmZkX2FyY2hpdGVjdHVyZSBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZTsKLXNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaF9oZWFkOwotCi0jaWZuZGVmIE1QVwotI2lmZGVmIFZNUwotY2hhciAqc2xhc2ggPSAiIjsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLWNoYXIgKnNsYXNoID0gIlxcIjsKLSNlbHNlCi1jaGFyICpzbGFzaCA9ICIvIjsKLSNlbmRpZgotI2VuZGlmCi0jZWxzZSAvKiBNUFcgKi8KLS8qIFRoZSBNUFcgcGF0aCBjaGFyIGlzIGEgY29sb24uICovCi1jaGFyICpzbGFzaCA9ICI6IjsKLSNlbmRpZiAvKiBNUFcgKi8KLQotLyogTE9DQUwgKi8KLQotc3RhdGljIHNlYXJjaF9kaXJzX3R5cGUgKipzZWFyY2hfdGFpbF9wdHIgPSAmc2VhcmNoX2hlYWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHNlYXJjaF9hcmNoIAotewotICBjaGFyICpuYW1lOyAKLSAgc3RydWN0IHNlYXJjaF9hcmNoICpuZXh0OwotfSBzZWFyY2hfYXJjaF90eXBlOwotCi1zdGF0aWMgc2VhcmNoX2FyY2hfdHlwZSAqc2VhcmNoX2FyY2hfaGVhZDsKLXN0YXRpYyBzZWFyY2hfYXJjaF90eXBlICoqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSAmc2VhcmNoX2FyY2hfaGVhZDsKLSAKLXN0YXRpYyBGSUxFICp0cnlfb3BlbiBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpleHRlbikpOwotCi12b2lkCi1sZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAobmFtZSwgY21kbGluZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBjbWRsaW5lOwotewotICBzZWFyY2hfZGlyc190eXBlICpuZXc7Ci0KLSAgbmV3ID0gKHNlYXJjaF9kaXJzX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzZWFyY2hfZGlyc190eXBlKSk7Ci0gIG5ldy0+bmV4dCA9IE5VTEw7Ci0gIG5ldy0+bmFtZSA9IG5hbWU7Ci0gIG5ldy0+Y21kbGluZSA9IGNtZGxpbmU7Ci0gICpzZWFyY2hfdGFpbF9wdHIgPSBuZXc7Ci0gIHNlYXJjaF90YWlsX3B0ciA9ICZuZXctPm5leHQ7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgQkZEIGZvciBhIGxhbmdfaW5wdXRfc3RhdGVtZW50LiAgKi8KLQotYm9vbGVhbgotbGRmaWxlX3RyeV9vcGVuX2JmZCAoYXR0ZW1wdCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmF0dGVtcHQ7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBlbnRyeS0+dGhlX2JmZCA9IGJmZF9vcGVuciAoYXR0ZW1wdCwgZW50cnktPnRhcmdldCk7Ci0KLSAgaWYgKHRyYWNlX2ZpbGVfdHJpZXMpCi0gICAgewotICAgICAgaWYgKGVudHJ5LT50aGVfYmZkID09IE5VTEwpCi0JaW5mb19tc2cgKF8oImF0dGVtcHQgdG8gb3BlbiAlcyBmYWlsZWRcbiIpLCBhdHRlbXB0KTsKLSAgICAgIGVsc2UKLQlpbmZvX21zZyAoXygiYXR0ZW1wdCB0byBvcGVuICVzIHN1Y2NlZWRlZFxuIiksIGF0dGVtcHQpOwotICAgIH0KLQotICBpZiAoZW50cnktPnRoZV9iZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpCi0JZWluZm8gKF8oIiVGJVA6IGludmFsaWQgQkZEIHRhcmdldCBgJXMnXG4iKSwgZW50cnktPnRhcmdldCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBzZWFyY2hpbmcgZm9yIHRoaXMgZmlsZSwgc2VlIGlmIHRoZSBhcmNoaXRlY3R1cmUgaXMKLSAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBvdXRwdXQgZmlsZS4gIElmIGl0IGlzbid0LCBrZWVwIHNlYXJjaGluZy4KLSAgICAgSWYgd2UgY2FuJ3Qgb3BlbiB0aGUgZmlsZSBhcyBhbiBvYmplY3QgZmlsZSwgc3RvcCB0aGUgc2VhcmNoCi0gICAgIGhlcmUuICAqLwotCi0gIGlmIChlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZykKLSAgICB7Ci0gICAgICBiZmQgKmNoZWNrOwotCi0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9hcmNoaXZlKSkKLQljaGVjayA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGVudHJ5LT50aGVfYmZkLCBOVUxMKTsKLSAgICAgIGVsc2UKLQljaGVjayA9IGVudHJ5LT50aGVfYmZkOwotCi0gICAgICBpZiAoY2hlY2sgIT0gTlVMTCkKLQl7Ci0JICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChjaGVjaywgYmZkX29iamVjdCkpCi0JICAgIHJldHVybiB0cnVlOwotCSAgaWYgKGJmZF9hcmNoX2dldF9jb21wYXRpYmxlIChjaGVjaywgb3V0cHV0X2JmZCkgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVpbmZvIChfKCIlUDogc2tpcHBpbmcgaW5jb21wYXRpYmxlICVzIHdoZW4gc2VhcmNoaW5nIGZvciAlcyIpLAotCQkgICAgIGF0dGVtcHQsIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSk7Ci0JICAgICAgYmZkX2Nsb3NlIChlbnRyeS0+dGhlX2JmZCk7Ci0JICAgICAgZW50cnktPnRoZV9iZmQgPSBOVUxMOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYW5kIG9wZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IEVOVFJZLiAgSWYgaXQgaXMgYW4KLSAgIGFyY2hpdmUsIHVzZSBBUkNILCBMSUIgYW5kIFNVRkZJWCB0byBtb2RpZnkgdGhlIGZpbGUgbmFtZS4gICovCi0KLWJvb2xlYW4KLWxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoIChhcmNoLCBlbnRyeSwgbGliLCBzdWZmaXgpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotICAgICBjb25zdCBjaGFyICpsaWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLXsKLSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gIC8qIElmIHRoaXMgaXMgbm90IGFuIGFyY2hpdmUsIHRyeSB0byBvcGVuIGl0IGluIHRoZSBjdXJyZW50Ci0gICAgIGRpcmVjdG9yeSBmaXJzdC4gICovCi0gIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQotICAgIHsKLSAgICAgIGlmIChsZGZpbGVfdHJ5X29wZW5fYmZkIChlbnRyeS0+ZmlsZW5hbWUsIGVudHJ5KSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsKLSAgICAgICBzZWFyY2ggIT0gKHNlYXJjaF9kaXJzX3R5cGUgKilOVUxMOwotICAgICAgIHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkgCi0gICAgewotICAgICAgY2hhciAqc3RyaW5nOwotCi0gICAgICBpZiAoZW50cnktPmR5bmFtaWMgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCXsKLQkgIGlmIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpKQotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJCSArIHN0cmxlbiAoc2xhc2gpCi0JCQkJICsgc3RybGVuIChsaWIpCi0JCQkJICsgc3RybGVuIChlbnRyeS0+ZmlsZW5hbWUpCi0JCQkJICsgc3RybGVuIChhcmNoKQotCQkJCSArIHN0cmxlbiAoc3VmZml4KQotCQkJCSArIDEpOwotCi0gICAgICBpZiAoZW50cnktPmlzX2FyY2hpdmUpCi0Jc3ByaW50ZiAoc3RyaW5nLCAiJXMlcyVzJXMlcyVzIiwgc2VhcmNoLT5uYW1lLCBzbGFzaCwKLQkJIGxpYiwgZW50cnktPmZpbGVuYW1lLCBhcmNoLCBzdWZmaXgpOwotICAgICAgZWxzZSBpZiAoZW50cnktPmZpbGVuYW1lWzBdID09ICcvJyB8fCBlbnRyeS0+ZmlsZW5hbWVbMF0gPT0gJy4nCi0jaWYgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfV0lOMzIpCi0JICAgICAgIHx8IGVudHJ5LT5maWxlbmFtZVswXSA9PSAnXFwnIAotCSAgICAgICB8fCAoaXNhbHBoYSAoZW50cnktPmZpbGVuYW1lWzBdKSAKLQkgICAgICAgICAgICYmIGVudHJ5LT5maWxlbmFtZVsxXSA9PSAnOicpCi0jZW5kaWYKLQkgICkKLQlzdHJjcHkgKHN0cmluZywgZW50cnktPmZpbGVuYW1lKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChzdHJpbmcsICIlcyVzJXMiLCBzZWFyY2gtPm5hbWUsIHNsYXNoLCBlbnRyeS0+ZmlsZW5hbWUpOwotCi0gICAgICBpZiAobGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0JewotCSAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBmcmVlIChzdHJpbmcpOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIE9wZW4gdGhlIGlucHV0IGZpbGUgc3BlY2lmaWVkIGJ5IEVOVFJZLiAgKi8KLQotdm9pZAotbGRmaWxlX29wZW5fZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBpZiAoZW50cnktPnRoZV9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpCi0gICAgewotICAgICAgaWYgKGxkZmlsZV90cnlfb3Blbl9iZmQgKGVudHJ5LT5maWxlbmFtZSwgZW50cnkpKQotCXJldHVybjsKLSAgICAgIGlmIChzdHJjbXAgKGVudHJ5LT5maWxlbmFtZSwgZW50cnktPmxvY2FsX3N5bV9uYW1lKSAhPSAwKQotCWVpbmZvIChfKCIlRiVQOiBjYW5ub3Qgb3BlbiAlcyBmb3IgJXM6ICVFXG4iKSwKLQkgICAgICAgZW50cnktPmZpbGVuYW1lLCBlbnRyeS0+bG9jYWxfc3ltX25hbWUpOwotICAgICAgZWxzZQotCWVpbmZvKF8oIiVGJVA6IGNhbm5vdCBvcGVuICVzOiAlRVxuIiksIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2VhcmNoX2FyY2hfdHlwZSAqYXJjaDsKLQotICAgICAgLyogVHJ5IHRvIG9wZW4gPGZpbGVuYW1lPjxzdWZmaXg+IG9yIGxpYjxmaWxlbmFtZT48c3VmZml4Pi5hICovCi0gICAgICBmb3IgKGFyY2ggPSBzZWFyY2hfYXJjaF9oZWFkOwotCSAgIGFyY2ggIT0gKHNlYXJjaF9hcmNoX3R5cGUgKikgTlVMTDsKLQkgICBhcmNoID0gYXJjaC0+bmV4dCkKLQl7Ci0JICBpZiAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2ggKGFyY2gtPm5hbWUsIGVudHJ5LCAibGliIiwgIi5hIikpCi0JICAgIHJldHVybjsKLSNpZmRlZiBWTVMKLQkgIGlmIChsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCAoYXJjaC0+bmFtZSwgZW50cnksICI6bGliIiwgIi5hIikpCi0JICAgIHJldHVybjsKLSNlbmRpZgotCSAgaWYgKGxkZW11bF9maW5kX3BvdGVudGlhbF9saWJyYXJpZXMgKGFyY2gtPm5hbWUsIGVudHJ5KSkKLQkgICAgcmV0dXJuOwotCX0KLSAgICAgIGVpbmZvIChfKCIlRiVQOiBjYW5ub3QgZmluZCAlc1xuIiksIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSk7Ci0gICAgfQotfQotCi0vKiBUcnkgdG8gb3BlbiBOQU1FOyBpZiB0aGF0IGZhaWxzLCB0cnkgTkFNRSB3aXRoIEVYVEVOIGFwcGVuZGVkIHRvIGl0LiAgKi8KLQotc3RhdGljIEZJTEUgKgotdHJ5X29wZW4gKG5hbWUsIGV4dGVuKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpleHRlbjsKLXsKLSAgRklMRSAqcmVzdWx0OwotICBjaGFyIGJ1ZmZbMTAwMF07Ci0KLSAgcmVzdWx0ID0gZm9wZW4gKG5hbWUsICJyIik7Ci0gIGlmICh0cmFjZV9maWxlX3RyaWVzKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQlpbmZvX21zZyAoXygiY2Fubm90IGZpbmQgc2NyaXB0IGZpbGUgJXNcbiIpLCBuYW1lKTsKLSAgICAgIGVsc2UKLQlpbmZvX21zZyAoXygib3BlbmVkIHNjcmlwdCBmaWxlICVzXG4iKSwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIGlmICgqZXh0ZW4pCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmZiwgIiVzJXMiLCBuYW1lLCBleHRlbik7Ci0gICAgICByZXN1bHQgPSBmb3BlbiAoYnVmZiwgInIiKTsKLSAgICAgIGlmICh0cmFjZV9maWxlX3RyaWVzKQotCXsKLQkgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQkgICAgaW5mb19tc2cgKF8oImNhbm5vdCBmaW5kIHNjcmlwdCBmaWxlICVzXG4iKSwgYnVmZik7Ci0JICBlbHNlCi0JICAgIGluZm9fbXNnIChfKCJvcGVuZWQgc2NyaXB0IGZpbGUgJXNcbiIpLCBidWZmKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIE5BTUU7IGlmIHRoYXQgZmFpbHMsIGxvb2sgZm9yIGl0IGluIGFueSBkaXJlY3RvcmllcwotICAgc3BlY2lmaWVkIHdpdGggLUwsIHdpdGhvdXQgYW5kIHdpdGggRVhURU5EIGFwcHBlbmRlZC4gICovCi0KLUZJTEUgKgotbGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlIChuYW1lLCBleHRlbmQpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmV4dGVuZDsKLXsKLSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICBGSUxFICpyZXN1bHQ7Ci0gIGNoYXIgYnVmZmVyWzEwMDBdOwotCi0gIC8qIEZpcnN0IHRyeSByYXcgbmFtZSAqLwotICByZXN1bHQgPSB0cnlfb3BlbihuYW1lLCIiKTsKLSAgaWYgKHJlc3VsdCA9PSAoRklMRSAqKU5VTEwpIHsKLSAgICAvKiBUcnkgbm93IHByZWZpeGVzICovCi0gICAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsKLQkgc2VhcmNoICE9IChzZWFyY2hfZGlyc190eXBlICopTlVMTDsKLQkgc2VhcmNoID0gc2VhcmNoLT5uZXh0KSB7Ci0gICAgICBzcHJpbnRmKGJ1ZmZlciwiJXMlcyVzIiwgc2VhcmNoLT5uYW1lLCBzbGFzaCwgbmFtZSk7Ci0gICAgICByZXN1bHQgPSB0cnlfb3BlbihidWZmZXIsIGV4dGVuZCk7Ci0gICAgICBpZiAocmVzdWx0KWJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkCi1sZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIEZJTEUgKmxkbGV4X2lucHV0X3N0YWNrOwotICBsZGxleF9pbnB1dF9zdGFjayA9IGxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZShuYW1lLCAiIik7Ci0KLSAgaWYgKGxkbGV4X2lucHV0X3N0YWNrID09IChGSUxFICopTlVMTCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgZWluZm8oXygiJVAlRjogY2Fubm90IG9wZW4gbGlua2VyIHNjcmlwdCBmaWxlICVzOiAlRVxuIiksbmFtZSk7Ci0gIH0KLSAgbGV4X3B1c2hfZmlsZShsZGxleF9pbnB1dF9zdGFjaywgbmFtZSk7Ci0gIAotICBsZGZpbGVfaW5wdXRfZmlsZW5hbWUgPSBuYW1lOwotICBsaW5lbm8gPSAxOwotICBoYWRfc2NyaXB0ID0gdHJ1ZTsKLX0KLQotCi0KLQotCi0jaWZkZWYgR05VOTYwCi1zdGF0aWMKLWNoYXIgKgotZ251OTYwX21hcF9hcmNobmFtZSggbmFtZSApCi1jaGFyICpuYW1lOwotewotICBzdHJ1Y3QgdGFiZW50cnkgeyBjaGFyICpjbWRfc3dpdGNoOyBjaGFyICphcmNoOyB9OwotICBzdGF0aWMgc3RydWN0IHRhYmVudHJ5IGFyY2hfdGFiW10gPSB7Ci0JIiIsICAgIiIsCi0JIktBIiwgImthIiwKLQkiS0IiLCAia2IiLAotCSJLQyIsICJtYyIsCS8qIFN5bm9ueW0gZm9yIE1DICovCi0JIk1DIiwgIm1jIiwKLQkiQ0EiLCAiY2EiLAotCSJTQSIsICJrYSIsCS8qIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEtBICovCi0JIlNCIiwgImtiIiwJLyogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gS0IgKi8KLQlOVUxMLCAiIgotICB9OwotICBzdHJ1Y3QgdGFiZW50cnkgKnRwOwotICAKLQotICBmb3IgKCB0cCA9IGFyY2hfdGFiOyB0cC0+Y21kX3N3aXRjaCAhPSBOVUxMOyB0cCsrICl7Ci0gICAgaWYgKCAhc3RyY21wKG5hbWUsdHAtPmNtZF9zd2l0Y2gpICl7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoIHRwLT5jbWRfc3dpdGNoID09IE5VTEwgKXsKLSAgICBlaW5mbyhfKCIlUCVGOiB1bmtub3duIGFyY2hpdGVjdHVyZTogJXNcbiIpLG5hbWUpOwotICB9Ci0gIHJldHVybiB0cC0+YXJjaDsKLX0KLQotCi0KLXZvaWQKLWxkZmlsZV9hZGRfYXJjaChuYW1lKQotY2hhciAqbmFtZTsKLXsKLSAgc2VhcmNoX2FyY2hfdHlwZSAqbmV3ID0KLSAgICAoc2VhcmNoX2FyY2hfdHlwZSAqKXhtYWxsb2MoKGJmZF9zaXplX3R5cGUpKHNpemVvZihzZWFyY2hfYXJjaF90eXBlKSkpOwotCi0KLSAgaWYgKCpuYW1lICE9ICdcMCcpIHsKLSAgICBpZiAobGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWVbMF0gIT0gJ1wwJykgewotICAgICAgZWluZm8oXygiJVAlRjogdGFyZ2V0IGFyY2hpdGVjdHVyZSByZXNwZWNpZmllZFxuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9IG5hbWU7Ci0gIH0KLQotICBuZXctPm5leHQgPSAoc2VhcmNoX2FyY2hfdHlwZSopTlVMTDsKLSAgbmV3LT5uYW1lID0gZ251OTYwX21hcF9hcmNobmFtZSggbmFtZSApOwotICAqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSBuZXc7Ci0gIHNlYXJjaF9hcmNoX3RhaWxfcHRyID0gJm5ldy0+bmV4dDsKLQotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLQotdm9pZAotbGRmaWxlX2FkZF9hcmNoIChpbl9uYW1lKQotICAgICBDT05TVCBjaGFyICogaW5fbmFtZTsKLXsKLSAgY2hhciAqbmFtZSA9IGJ1eXN0cmluZyhpbl9uYW1lKTsKLSAgc2VhcmNoX2FyY2hfdHlwZSAqbmV3ID0KLSAgICAoc2VhcmNoX2FyY2hfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHNlYXJjaF9hcmNoX3R5cGUpKTsKLQotICBsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9IGluX25hbWU7Ci0KLSAgbmV3LT5uYW1lID0gbmFtZTsKLSAgbmV3LT5uZXh0ID0gKHNlYXJjaF9hcmNoX3R5cGUqKU5VTEw7Ci0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpuYW1lKSkKLQkqbmFtZSA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqbmFtZSk7Ci0gICAgICBuYW1lKys7Ci0gICAgfQotICAqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSBuZXc7Ci0gIHNlYXJjaF9hcmNoX3RhaWxfcHRyID0gJm5ldy0+bmV4dDsKLQotfQotI2VuZGlmCi0KLS8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSAqLwotdm9pZAotbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoc3RyaW5nKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IGJmZF9zY2FuX2FyY2goc3RyaW5nKTsKLQotICBpZiAoYXJjaCkgewotICAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYXJjaC0+YXJjaDsKLSAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBhcmNoLT5tYWNoOwotICAgIGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lID0gYXJjaC0+cHJpbnRhYmxlX25hbWU7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZWluZm8oXygiJVAlRjogY2Fubm90IHJlcHJlc2VudCBtYWNoaW5lIGAlcydcbiIpLCBzdHJpbmcpOwotICB9Ci19CmRpZmYgLS1naXQgYS9sZC9sZGZpbGUuaCBiL2xkL2xkZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzlhNGQ2Li4wMDAwMDAwCi0tLSBhL2xkL2xkZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogbGRmaWxlLmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmxkZmlsZV9pbnB1dF9maWxlbmFtZTsKLWV4dGVybiBib29sZWFuIGxkZmlsZV9hc3N1bWVkX3NjcmlwdDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxkZmlsZV9vdXRwdXRfbWFjaGluZTsKLWV4dGVybiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmU7Ci1leHRlcm4gY29uc3QgY2hhciAqbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWU7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvcgotICAgbGlicmFyaWVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX2RpcnMgCi17Ci0gIC8qIE5leHQgZGlyZWN0b3J5IG9uIGxpc3QuICAqLwotICBzdHJ1Y3Qgc2VhcmNoX2RpcnMgKm5leHQ7Ci0gIC8qIE5hbWUgb2YgZGlyZWN0b3J5LiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogdHJ1ZSBpZiB0aGlzIGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gIGJvb2xlYW4gY21kbGluZTsKLX0gc2VhcmNoX2RpcnNfdHlwZTsKLQotZXh0ZXJuIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaF9oZWFkOwotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0OwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGxkZmlsZV9hZGRfYXJjaCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjbWRsaW5lKSk7Ci1leHRlcm4gdm9pZCBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbGRmaWxlX29wZW5fZmlsZSBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBib29sZWFuIGxkZmlsZV90cnlfb3Blbl9iZmQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBGSUxFICpsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZXh0ZW5kKSk7Ci1leHRlcm4gdm9pZCBsZGZpbGVfc2V0X291dHB1dF9hcmNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRmaWxlX29wZW5fZmlsZV9zZWFyY2gKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaCwgc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqLAotCSAgIGNvbnN0IGNoYXIgKmxpYiwgY29uc3QgY2hhciAqc3VmZml4KSk7CmRpZmYgLS1naXQgYS9sZC9sZGdyYW0ueSBiL2xkL2xkZ3JhbS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDZlYTFjLi4wMDAwMDAwCi0tLSBhL2xkL2xkZ3JhbS55CisrKyAvZGV2L251bGwKQEAgLTEsMTEzMiArMCwwIEBACi0vKiBBIFlBQ0MgZ3JhbW1lciB0byBwYXJzZSBhIHN1cGVyc2V0IG9mIHRoZSBBVCZUIGxpbmtlciBzY3JpcHRpbmcgbGFuZ3VhdWUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IChzdGV2ZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIGxkLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0lewotLyoKLQotICovCi0KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGQuaCIgICAgCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZHZlci5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgIm1yaS5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0KLSNpZm5kZWYgWVlERUJVRwotI2RlZmluZSBZWURFQlVHIDEKLSNlbmRpZgotCi1zdGF0aWMgZW51bSBzZWN0aW9uX3R5cGUgc2VjdHlwZTsKLQotbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnJlZ2lvbjsKLQotc3RydWN0IHdpbGRjYXJkX3NwZWMgY3VycmVudF9maWxlOwotYm9vbGVhbiBsZGdyYW1fd2FudF9maWxlbmFtZSA9IHRydWU7Ci1ib29sZWFuIGhhZF9zY3JpcHQgPSBmYWxzZTsKLWJvb2xlYW4gZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0KLWJvb2xlYW4gbGRncmFtX2luX3NjcmlwdCA9IGZhbHNlOwotYm9vbGVhbiBsZGdyYW1faGFkX2VxdWFscyA9IGZhbHNlOwotYm9vbGVhbiBsZGdyYW1faGFkX2tlZXAgPSBmYWxzZTsKLWNoYXIgKmxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyA9IE5VTEw7Ci0KLSNkZWZpbmUgRVJST1JfTkFNRV9NQVggMjAKLXN0YXRpYyBjaGFyICplcnJvcl9uYW1lc1tFUlJPUl9OQU1FX01BWF07Ci1zdGF0aWMgaW50IGVycm9yX2luZGV4OwotI2RlZmluZSBQVVNIX0VSUk9SKHgpIGlmIChlcnJvcl9pbmRleCA8IEVSUk9SX05BTUVfTUFYKSBlcnJvcl9uYW1lc1tlcnJvcl9pbmRleF0gPSB4OyBlcnJvcl9pbmRleCsrOwotI2RlZmluZSBQT1BfRVJST1IoKSAgIGVycm9yX2luZGV4LS07Ci0lfQotJXVuaW9uIHsKLSAgYmZkX3ZtYSBpbnRlZ2VyOwotICBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICpjbmFtZTsKLSAgc3RydWN0IHdpbGRjYXJkX3NwZWMgd2lsZGNhcmQ7Ci0gIHN0cnVjdCBuYW1lX2xpc3QgKm5hbWVfbGlzdDsKLSAgaW50IHRva2VuOwotICB1bmlvbiBldHJlZV91bmlvbiAqZXRyZWU7Ci0gIHN0cnVjdCBwaGRyX2luZm8KLSAgICB7Ci0gICAgICBib29sZWFuIGZpbGVoZHI7Ci0gICAgICBib29sZWFuIHBoZHJzOwotICAgICAgdW5pb24gZXRyZWVfdW5pb24gKmF0OwotICAgICAgdW5pb24gZXRyZWVfdW5pb24gKmZsYWdzOwotICAgIH0gcGhkcjsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbm9jcm9zc3JlZjsKLSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpzZWN0aW9uX3BoZHI7Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqZGVmbGlzdDsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICp2ZXJzeW1zOwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnNub2RlOwotfQotCi0ldHlwZSA8ZXRyZWU+IGV4cCBvcHRfZXhwX3dpdGhfdHlwZSBtdXN0YmVfZXhwIG9wdF9hdCBwaGRyX3R5cGUgcGhkcl92YWwKLSV0eXBlIDxldHJlZT4gb3B0X2V4cF93aXRob3V0X3R5cGUKLSV0eXBlIDxpbnRlZ2VyPiBmaWxsX29wdAotJXR5cGUgPG5hbWVfbGlzdD4gZXhjbHVkZV9uYW1lX2xpc3QKLSV0eXBlIDxuYW1lPiBtZW1zcGVjX29wdCBjYXNlc3ltbGlzdAotJXR5cGUgPG5hbWU+IG1lbXNwZWNfYXRfb3B0Ci0ldHlwZSA8Y25hbWU+IHdpbGRjYXJkX25hbWUKLSV0eXBlIDx3aWxkY2FyZD4gd2lsZGNhcmRfc3BlYwotJXRva2VuIDxpbnRlZ2VyPiBJTlQgIAotJXRva2VuIDxuYW1lPiBOQU1FIExOQU1FCi0ldHlwZSA8aW50ZWdlcj4gbGVuZ3RoCi0ldHlwZSA8cGhkcj4gcGhkcl9xdWFsaWZpZXJzCi0ldHlwZSA8bm9jcm9zc3JlZj4gbm9jcm9zc3JlZl9saXN0Ci0ldHlwZSA8c2VjdGlvbl9waGRyPiBwaGRyX29wdAotJXR5cGUgPGludGVnZXI+IG9wdF9ub2Nyb3NzcmVmcwotCi0lcmlnaHQgPHRva2VuPiBQTFVTRVEgTUlOVVNFUSBNVUxURVEgRElWRVEgICc9JyBMU0hJRlRFUSBSU0hJRlRFUSAgIEFOREVRIE9SRVEgCi0lcmlnaHQgPHRva2VuPiAnPycgJzonCi0lbGVmdCA8dG9rZW4+IE9ST1IKLSVsZWZ0IDx0b2tlbj4gIEFOREFORAotJWxlZnQgPHRva2VuPiAnfCcKLSVsZWZ0IDx0b2tlbj4gICdeJwotJWxlZnQgIDx0b2tlbj4gJyYnCi0lbGVmdCA8dG9rZW4+ICBFUSBORQotJWxlZnQgIDx0b2tlbj4gJzwnICc+JyBMRSBHRQotJWxlZnQgIDx0b2tlbj4gTFNISUZUIFJTSElGVAotCi0lbGVmdCAgPHRva2VuPiAnKycgJy0nCi0lbGVmdCAgPHRva2VuPiAnKicgJy8nICclJwotCi0lcmlnaHQgVU5BUlkKLSV0b2tlbiBFTkQgCi0lbGVmdCA8dG9rZW4+ICcoJwotJXRva2VuIDx0b2tlbj4gQUxJR05fSyBCTE9DSyBCSU5EIFFVQUQgU1FVQUQgTE9ORyBTSE9SVCBCWVRFCi0ldG9rZW4gU0VDVElPTlMgUEhEUlMgU09SVAotJXRva2VuICd7JyAnfScKLSV0b2tlbiBTSVpFT0ZfSEVBREVSUyBPVVRQVVRfRk9STUFUIEZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OIE9VVFBVVF9BUkNICi0ldG9rZW4gU0laRU9GX0hFQURFUlMKLSV0b2tlbiBJTkNMVURFCi0ldG9rZW4gTUVNT1JZIERFRlNZTUVORAotJXRva2VuIE5PTE9BRCBEU0VDVCBDT1BZIElORk8gT1ZFUkxBWQotJXRva2VuIE5BTUUgTE5BTUUgREVGSU5FRCBUQVJHRVRfSyBTRUFSQ0hfRElSIE1BUCBFTlRSWQotJXRva2VuIDxpbnRlZ2VyPiBORVhUCi0ldG9rZW4gU0laRU9GIEFERFIgTE9BREFERFIgTUFYX0sgTUlOX0sKLSV0b2tlbiBTVEFSVFVQIEhMTCBTWVNMSUIgRkxPQVQgTk9GTE9BVCBOT0NST1NTUkVGUwotJXRva2VuIE9SSUdJTiBGSUxMCi0ldG9rZW4gTEVOR1RIIENSRUFURV9PQkpFQ1RfU1lNQk9MUyBJTlBVVCBHUk9VUCBPVVRQVVQgQ09OU1RSVUNUT1JTCi0ldG9rZW4gQUxJR05NT0QgQVQgUFJPVklERQotJXR5cGUgPHRva2VuPiBhc3NpZ25fb3AgYXR5cGUgYXR0cmlidXRlc19vcHQKLSV0eXBlIDxuYW1lPiAgZmlsZW5hbWUKLSV0b2tlbiBDSElQIExJU1QgU0VDVCBBQlNPTFVURSAgTE9BRCBORVdMSU5FIEVORFdPUkQgT1JERVIgTkFNRVdPUkQgQVNTRVJUX0sKLSV0b2tlbiBGT1JNQVQgUFVCTElDIERFRlNZTUVORCBCQVNFIEFMSUFTIFRSVU5DQVRFIFJFTAotJXRva2VuIElOUFVUX1NDUklQVCBJTlBVVF9NUklfU0NSSVBUIElOUFVUX0RFRlNZTSBDQVNFIEVYVEVSTiBTVEFSVAotJXRva2VuIDxuYW1lPiBWRVJTX1RBRyBWRVJTX0lERU5USUZJRVIKLSV0b2tlbiBHTE9CQUwgTE9DQUwgVkVSU0lPTksgSU5QVVRfVkVSU0lPTl9TQ1JJUFQKLSV0b2tlbiBLRUVQCi0ldG9rZW4gRVhDTFVERV9GSUxFCi0ldHlwZSA8dmVyc3ltcz4gdmVyc19kZWZucwotJXR5cGUgPHZlcnNub2RlPiB2ZXJzX3RhZwotJXR5cGUgPGRlZmxpc3Q+IHZlcmRlcAotCi0lJQotCi1maWxlOgkKLQkJSU5QVVRfU0NSSVBUIHNjcmlwdF9maWxlCi0JfAlJTlBVVF9NUklfU0NSSVBUIG1yaV9zY3JpcHRfZmlsZQotCXwJSU5QVVRfVkVSU0lPTl9TQ1JJUFQgdmVyc2lvbl9zY3JpcHRfZmlsZQotCXwJSU5QVVRfREVGU1lNIGRlZnN5bV9leHByCi0JOwotCi0KLWZpbGVuYW1lOiAgTkFNRTsKLQotCi1kZWZzeW1fZXhwcjoKLQkJeyBsZGxleF9kZWZzeW0oKTsgfQotCQlOQU1FICc9JyBleHAKLQkJewotCQkgIGxkbGV4X3BvcHN0YXRlKCk7Ci0JCSAgbGFuZ19hZGRfYXNzaWdubWVudChleHBfYXNzb3AoJDMsJDIsJDQpKTsKLQkJfQotCi0vKiBTWU5UQVggV0lUSElOIEFOIE1SSSBTQ1JJUFQgRklMRSAqLyAgCi1tcmlfc2NyaXB0X2ZpbGU6Ci0JCXsKLQkJICBsZGxleF9tcmlfc2NyaXB0ICgpOwotCQkgIFBVU0hfRVJST1IgKF8oIk1SSSBzdHlsZSBzY3JpcHQiKSk7Ci0JCX0KLQkgICAgIG1yaV9zY3JpcHRfbGluZXMKLQkJewotCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQkgIG1yaV9kcmF3X3RyZWUgKCk7Ci0JCSAgUE9QX0VSUk9SICgpOwotCQl9Ci0JOwotCi1tcmlfc2NyaXB0X2xpbmVzOgotCQltcmlfc2NyaXB0X2xpbmVzIG1yaV9zY3JpcHRfY29tbWFuZCBORVdMSU5FCi0gICAgICAgICAgfAotCTsKLQotbXJpX3NjcmlwdF9jb21tYW5kOgotCQlDSElQICBleHAgCi0JfAlDSElQICBleHAgJywnIGV4cAotCXwJTkFNRSAJewotCQkJZWluZm8oXygiJVAlRjogdW5yZWNvZ25pc2VkIGtleXdvcmQgaW4gTVJJIHN0eWxlIHNjcmlwdCAnJXMnXG4iKSwkMSk7Ci0JCQl9Ci0JfAlMSVNUICAJewotCQkJY29uZmlnLm1hcF9maWxlbmFtZSA9ICItIjsKLQkJCX0KLSAgICAgICAgfCAgICAgICBPUkRFUiBvcmRlcm5hbWVsaXN0Ci0JfCAgICAgICBFTkRXT1JEIAotICAgICAgICB8ICAgICAgIFBVQkxJQyBOQU1FICc9JyBleHAKLSAJCQl7IG1yaV9wdWJsaWMoJDIsICQ0KTsgfQotICAgICAgICB8ICAgICAgIFBVQkxJQyBOQU1FICcsJyBleHAKLSAJCQl7IG1yaV9wdWJsaWMoJDIsICQ0KTsgfQotICAgICAgICB8ICAgICAgIFBVQkxJQyBOQU1FICBleHAgCi0gCQkJeyBtcmlfcHVibGljKCQyLCAkMyk7IH0KLQl8IAlGT1JNQVQgTkFNRQotCQkJeyBtcmlfZm9ybWF0KCQyKTsgfQotCXwJU0VDVCBOQU1FICcsJyBleHAKLQkJCXsgbXJpX291dHB1dF9zZWN0aW9uKCQyLCAkNCk7fQotCXwJU0VDVCBOQU1FICBleHAKLQkJCXsgbXJpX291dHB1dF9zZWN0aW9uKCQyLCAkMyk7fQotCXwJU0VDVCBOQU1FICc9JyBleHAKLQkJCXsgbXJpX291dHB1dF9zZWN0aW9uKCQyLCAkNCk7fQotCXwJQUxJR05fSyBOQU1FICc9JyBleHAKLQkJCXsgbXJpX2FsaWduKCQyLCQ0KTsgfQotCXwJQUxJR05fSyBOQU1FICcsJyBleHAKLQkJCXsgbXJpX2FsaWduKCQyLCQ0KTsgfQotCXwJQUxJR05NT0QgTkFNRSAnPScgZXhwCi0JCQl7IG1yaV9hbGlnbm1vZCgkMiwkNCk7IH0KLQl8CUFMSUdOTU9EIE5BTUUgJywnIGV4cAotCQkJeyBtcmlfYWxpZ25tb2QoJDIsJDQpOyB9Ci0JfAlBQlNPTFVURSBtcmlfYWJzX25hbWVfbGlzdAotCXwJTE9BRAkgbXJpX2xvYWRfbmFtZV9saXN0Ci0JfCAgICAgICBOQU1FV09SRCBOQU1FIAotCQkJeyBtcmlfbmFtZSgkMik7IH0gICAKLQl8CUFMSUFTIE5BTUUgJywnIE5BTUUKLQkJCXsgbXJpX2FsaWFzKCQyLCQ0LDApO30KLQl8CUFMSUFTIE5BTUUgJywnIElOVAotCQkJeyBtcmlfYWxpYXMoJDIsMCwoaW50KSAkNCk7fQotCXwJQkFTRSAgICAgZXhwCi0JCQl7IG1yaV9iYXNlKCQyKTsgfQotICAgICAgICB8ICAgICAgIFRSVU5DQVRFIElOVAotCQl7ICBtcmlfdHJ1bmNhdGUoKHVuc2lnbmVkIGludCkgJDIpOyB9Ci0JfAlDQVNFIGNhc2VzeW1saXN0Ci0JfAlFWFRFUk4gZXh0ZXJuX25hbWVfbGlzdAotCXwJSU5DTFVERSBmaWxlbmFtZQotCQl7IGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAoJDIpOyB9IG1yaV9zY3JpcHRfbGluZXMgRU5ECi0JfAlTVEFSVCBOQU1FCi0JCXsgbGFuZ19hZGRfZW50cnkgKCQyLCBmYWxzZSk7IH0KLSAgICAgICAgfAotCTsKLQotb3JkZXJuYW1lbGlzdDoKLQkgICAgICBvcmRlcm5hbWVsaXN0ICcsJyBOQU1FICAgICAgICAgeyBtcmlfb3JkZXIoJDMpOyB9Ci0JfCAgICAgb3JkZXJuYW1lbGlzdCAgTkFNRSAgICAgICAgIHsgbXJpX29yZGVyKCQyKTsgfQotICAgICAgCXwKLQk7Ci0KLW1yaV9sb2FkX25hbWVfbGlzdDoKLQkJTkFNRQotCQkJeyBtcmlfbG9hZCgkMSk7IH0KLQl8CW1yaV9sb2FkX25hbWVfbGlzdCAnLCcgTkFNRSB7IG1yaV9sb2FkKCQzKTsgfQotCTsKLQotbXJpX2Fic19uYW1lX2xpc3Q6Ci0gCQlOQU1FCi0gCQkJeyBtcmlfb25seV9sb2FkKCQxKTsgfQotCXwJbXJpX2Fic19uYW1lX2xpc3QgJywnICBOQU1FCi0gCQkJeyBtcmlfb25seV9sb2FkKCQzKTsgfQotCTsKLQotY2FzZXN5bWxpc3Q6Ci0JICAvKiBlbXB0eSAqLyB7ICQkID0gTlVMTDsgfQotCXwgTkFNRQotCXwgY2FzZXN5bWxpc3QgJywnIE5BTUUKLQk7Ci0KLWV4dGVybl9uYW1lX2xpc3Q6Ci0JICBOQU1FCi0JCQl7IGxkbGFuZ19hZGRfdW5kZWYgKCQxKTsgfQotCXwgZXh0ZXJuX25hbWVfbGlzdCBOQU1FCi0JCQl7IGxkbGFuZ19hZGRfdW5kZWYgKCQyKTsgfQotCXwgZXh0ZXJuX25hbWVfbGlzdCAnLCcgTkFNRQotCQkJeyBsZGxhbmdfYWRkX3VuZGVmICgkMyk7IH0KLQk7Ci0KLXNjcmlwdF9maWxlOgotCXsKLQkgbGRsZXhfYm90aCgpOwotCX0KLSAgICAgICBpZmlsZV9saXN0Ci0JewotCWxkbGV4X3BvcHN0YXRlKCk7Ci0JfQotICAgICAgICA7Ci0KLQotaWZpbGVfbGlzdDoKLSAgICAgICBpZmlsZV9saXN0IGlmaWxlX3AxCi0gICAgICAgIHwKLQk7Ci0KLQotCi1pZmlsZV9wMToKLQkJbWVtb3J5Ci0JfAlzZWN0aW9ucwotCXwJcGhkcnMKLQl8CXN0YXJ0dXAKLQl8CWhpZ2hfbGV2ZWxfbGlicmFyeQotCXwJbG93X2xldmVsX2xpYnJhcnkKLQl8CWZsb2F0aW5nX3BvaW50X3N1cHBvcnQKLQl8CXN0YXRlbWVudF9hbnl3aGVyZQotCXwJdmVyc2lvbgotICAgICAgICB8CSAnOycKLQl8CVRBUkdFVF9LICcoJyBOQU1FICcpJwotCQl7IGxhbmdfYWRkX3RhcmdldCgkMyk7IH0KLQl8CVNFQVJDSF9ESVIgJygnIGZpbGVuYW1lICcpJwotCQl7IGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoICgkMywgZmFsc2UpOyB9Ci0JfAlPVVRQVVQgJygnIGZpbGVuYW1lICcpJwotCQl7IGxhbmdfYWRkX291dHB1dCgkMywgMSk7IH0KLSAgICAgICAgfAlPVVRQVVRfRk9STUFUICcoJyBOQU1FICcpJwotCQkgIHsgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCAoJDMsIChjaGFyICopIE5VTEwsCi0JCQkJCSAgICAoY2hhciAqKSBOVUxMLCAxKTsgfQotCXwJT1VUUFVUX0ZPUk1BVCAnKCcgTkFNRSAnLCcgTkFNRSAnLCcgTkFNRSAnKScKLQkJICB7IGxhbmdfYWRkX291dHB1dF9mb3JtYXQgKCQzLCAkNSwgJDcsIDEpOyB9Ci0gICAgICAgIHwJT1VUUFVUX0FSQ0ggJygnIE5BTUUgJyknCi0JCSAgeyBsZGZpbGVfc2V0X291dHB1dF9hcmNoKCQzKTsgfQotCXwJRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04KLQkJeyBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24gPSB0cnVlIDsgfQotCXwJSU5QVVQgJygnIGlucHV0X2xpc3QgJyknCi0JfAlHUk9VUAotCQkgIHsgbGFuZ19lbnRlcl9ncm91cCAoKTsgfQotCQkgICAgJygnIGlucHV0X2xpc3QgJyknCi0JCSAgeyBsYW5nX2xlYXZlX2dyb3VwICgpOyB9Ci0gICAgIAl8CU1BUCAnKCcgZmlsZW5hbWUgJyknCi0JCXsgbGFuZ19hZGRfbWFwKCQzKTsgfQotCXwJSU5DTFVERSBmaWxlbmFtZSAKLQkJeyBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUoJDIpOyB9IGlmaWxlX2xpc3QgRU5ECi0JfAlOT0NST1NTUkVGUyAnKCcgbm9jcm9zc3JlZl9saXN0ICcpJwotCQl7Ci0JCSAgbGFuZ19hZGRfbm9jcm9zc3JlZiAoJDMpOwotCQl9Ci0JfAlFWFRFUk4gJygnIGV4dGVybl9uYW1lX2xpc3QgJyknCi0JOwotCi1pbnB1dF9saXN0OgotCQlOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMSxsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSwKLQkJCQkgKGNoYXIgKilOVUxMKTsgfQotCXwJaW5wdXRfbGlzdCAnLCcgTkFNRQotCQl7IGxhbmdfYWRkX2lucHV0X2ZpbGUoJDMsbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQl8CWlucHV0X2xpc3QgTkFNRQotCQl7IGxhbmdfYWRkX2lucHV0X2ZpbGUoJDIsbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQl8CUxOQU1FCi0JCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMSxsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JfAlpbnB1dF9saXN0ICcsJyBMTkFNRQotCQl7IGxhbmdfYWRkX2lucHV0X2ZpbGUoJDMsbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSwKLQkJCQkgKGNoYXIgKilOVUxMKTsgfQotCXwJaW5wdXRfbGlzdCBMTkFNRQotCQl7IGxhbmdfYWRkX2lucHV0X2ZpbGUoJDIsbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSwKLQkJCQkgKGNoYXIgKilOVUxMKTsgfQotCTsKLQotc2VjdGlvbnM6Ci0JCVNFQ1RJT05TICd7JyBzZWNfb3JfZ3JvdXBfcDEgJ30nCi0JOwotCi1zZWNfb3JfZ3JvdXBfcDE6Ci0JCXNlY19vcl9ncm91cF9wMSBzZWN0aW9uCi0JfAlzZWNfb3JfZ3JvdXBfcDEgc3RhdGVtZW50X2FueXdoZXJlCi0JfAotCTsKLQotc3RhdGVtZW50X2FueXdoZXJlOgotCQlFTlRSWSAnKCcgTkFNRSAnKScKLQkJeyBsYW5nX2FkZF9lbnRyeSAoJDMsIGZhbHNlKTsgfQotCXwJYXNzaWdubWVudCBlbmQKLQk7Ci0KLS8qIFRoZSAnKicgYW5kICc/JyBjYXNlcyBhcmUgdGhlcmUgYmVjYXVzZSB0aGUgbGV4ZXIgcmV0dXJucyB0aGVtIGFzCi0gICBzZXBhcmF0ZSB0b2tlbnMgcmF0aGVyIHRoYW4gYXMgTkFNRS4gICovCi13aWxkY2FyZF9uYW1lOgotCQlOQU1FCi0JCQl7Ci0JCQkgICQkID0gJDE7Ci0JCQl9Ci0JfAknKicKLQkJCXsKLQkJCSAgJCQgPSAiKiI7Ci0JCQl9Ci0JfAknPycKLQkJCXsKLQkJCSAgJCQgPSAiPyI7Ci0JCQl9Ci0JOwotCi13aWxkY2FyZF9zcGVjOgotCQl3aWxkY2FyZF9uYW1lCi0JCQl7Ci0JCQkgICQkLm5hbWUgPSAkMTsKLQkJCSAgJCQuc29ydGVkID0gZmFsc2U7Ci0JCQkgICQkLmV4Y2x1ZGVfbmFtZV9saXN0ID0gTlVMTDsKLQkJCX0KLQl8IAlFWENMVURFX0ZJTEUgJygnIGV4Y2x1ZGVfbmFtZV9saXN0ICcpJyB3aWxkY2FyZF9uYW1lCi0JCQl7Ci0JCQkgICQkLm5hbWUgPSAkNTsKLQkJCSAgJCQuc29ydGVkID0gZmFsc2U7Ci0JCQkgICQkLmV4Y2x1ZGVfbmFtZV9saXN0ID0gJDM7Ci0JCQl9Ci0JfAlTT1JUICcoJyB3aWxkY2FyZF9uYW1lICcpJwotCQkJewotCQkJICAkJC5uYW1lID0gJDM7Ci0JCQkgICQkLnNvcnRlZCA9IHRydWU7Ci0JCQkgICQkLmV4Y2x1ZGVfbmFtZV9saXN0ID0gTlVMTDsKLQkJCX0KLQl8CVNPUlQgJygnIEVYQ0xVREVfRklMRSAnKCcgZXhjbHVkZV9uYW1lX2xpc3QgJyknIHdpbGRjYXJkX25hbWUgJyknCi0JCQl7Ci0JCQkgICQkLm5hbWUgPSAkNzsKLQkJCSAgJCQuc29ydGVkID0gdHJ1ZTsKLQkJCSAgJCQuZXhjbHVkZV9uYW1lX2xpc3QgPSAkNTsKLQkJCX0KLQk7Ci0KLQotCi1leGNsdWRlX25hbWVfbGlzdDoKLQkJZXhjbHVkZV9uYW1lX2xpc3Qgd2lsZGNhcmRfbmFtZQotCQkJewotCQkJICBzdHJ1Y3QgbmFtZV9saXN0ICp0bXA7Ci0JCQkgIHRtcCA9IChzdHJ1Y3QgbmFtZV9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAqdG1wKTsKLQkJCSAgdG1wLT5uYW1lID0gJDI7Ci0JCQkgIHRtcC0+bmV4dCA9ICQxOwotCQkJICAkJCA9IHRtcDsJCi0JCQl9Ci0JfAotCQl3aWxkY2FyZF9uYW1lCi0JCQl7Ci0JCQkgIHN0cnVjdCBuYW1lX2xpc3QgKnRtcDsKLQkJCSAgdG1wID0gKHN0cnVjdCBuYW1lX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mICp0bXApOwotCQkJICB0bXAtPm5hbWUgPSAkMTsKLQkJCSAgdG1wLT5uZXh0ID0gTlVMTDsKLQkJCSAgJCQgPSB0bXA7Ci0JCQl9Ci0JOwotCi1maWxlX05BTUVfbGlzdDoKLQkJd2lsZGNhcmRfc3BlYwotCQkJewotCQkJICBsYW5nX2FkZF93aWxkICgkMS5uYW1lLCAkMS5zb3J0ZWQsCi0JCQkJCSBjdXJyZW50X2ZpbGUubmFtZSwKLQkJCQkJIGN1cnJlbnRfZmlsZS5zb3J0ZWQsCi0JCQkJCSBsZGdyYW1faGFkX2tlZXAsICQxLmV4Y2x1ZGVfbmFtZV9saXN0KTsKLQkJCX0KLQl8CWZpbGVfTkFNRV9saXN0IG9wdF9jb21tYSB3aWxkY2FyZF9zcGVjCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX3dpbGQgKCQzLm5hbWUsICQzLnNvcnRlZCwKLQkJCQkJIGN1cnJlbnRfZmlsZS5uYW1lLAotCQkJCQkgY3VycmVudF9maWxlLnNvcnRlZCwKLQkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgJDMuZXhjbHVkZV9uYW1lX2xpc3QpOwotCQkJfQotCTsKLQotaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXA6Ci0JCU5BTUUKLQkJCXsKLQkJCSAgbGFuZ19hZGRfd2lsZCAoTlVMTCwgZmFsc2UsICQxLCBmYWxzZSwKLQkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgTlVMTCk7Ci0JCQl9Ci0gICAgICAgIHwJJ1snCi0JCQl7Ci0JCQkgIGN1cnJlbnRfZmlsZS5uYW1lID0gTlVMTDsKLQkJCSAgY3VycmVudF9maWxlLnNvcnRlZCA9IGZhbHNlOwotCQkJfQotCQlmaWxlX05BTUVfbGlzdCAnXScKLQl8CXdpbGRjYXJkX3NwZWMKLQkJCXsKLQkJCSAgY3VycmVudF9maWxlID0gJDE7Ci0JCQkgIC8qICcqJyBtYXRjaGVzIGFueSBmaWxlIG5hbWUuICAqLwotCQkJICBpZiAoc3RyY21wIChjdXJyZW50X2ZpbGUubmFtZSwgIioiKSA9PSAwKQotCQkJICAgIGN1cnJlbnRfZmlsZS5uYW1lID0gTlVMTDsKLQkJCX0KLQkJJygnIGZpbGVfTkFNRV9saXN0ICcpJwotCTsKLQotaW5wdXRfc2VjdGlvbl9zcGVjOgotCQlpbnB1dF9zZWN0aW9uX3NwZWNfbm9fa2VlcAotCXwJS0VFUCAnKCcKLQkJCXsgbGRncmFtX2hhZF9rZWVwID0gdHJ1ZTsgfQotCQlpbnB1dF9zZWN0aW9uX3NwZWNfbm9fa2VlcCAnKScKLQkJCXsgbGRncmFtX2hhZF9rZWVwID0gZmFsc2U7IH0KLQk7Ci0KLXN0YXRlbWVudDoKLQkgIAlhc3NpZ25tZW50IGVuZAotCXwJQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0JCXsKLSAJCWxhbmdfYWRkX2F0dHJpYnV0ZShsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtKTsgCi0JICAgICAgCX0KLSAgICAgICAgfAknOycKLSAgICAgICAgfAlDT05TVFJVQ1RPUlMKLQkJewotIAkJCi0JCSAgbGFuZ19hZGRfYXR0cmlidXRlKGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtKTsgCi0JCX0KLQl8IFNPUlQgJygnIENPTlNUUlVDVE9SUyAnKScKLQkJewotCQkgIGNvbnN0cnVjdG9yc19zb3J0ZWQgPSB0cnVlOwotCQkgIGxhbmdfYWRkX2F0dHJpYnV0ZSAobGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW0pOwotCQl9Ci0JfCBpbnB1dF9zZWN0aW9uX3NwZWMKLSAgICAgICAgfCBsZW5ndGggJygnIG11c3RiZV9leHAgJyknCi0gICAgICAgIAkgICAgICAgIHsKLQkJCWxhbmdfYWRkX2RhdGEoKGludCkgJDEsJDMpOwotCQkJfQotICAKLQl8IEZJTEwgJygnIG11c3RiZV9leHAgJyknCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX2ZpbGwKLQkJCSAgICAoZXhwX2dldF92YWx1ZV9pbnQoJDMsCi0JCQkJCSAgICAgICAwLAotCQkJCQkgICAgICAgImZpbGwgdmFsdWUiLAotCQkJCQkgICAgICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKSk7Ci0JCQl9Ci0JOwotCi1zdGF0ZW1lbnRfbGlzdDoKLQkJc3RhdGVtZW50X2xpc3Qgc3RhdGVtZW50Ci0gIAl8ICAJc3RhdGVtZW50Ci0JOwotICAKLXN0YXRlbWVudF9saXN0X29wdDoKLQkJLyogZW1wdHkgKi8KLQl8CXN0YXRlbWVudF9saXN0Ci0JOwotCi1sZW5ndGg6Ci0JCVFVQUQKLQkJCXsgJCQgPSAkMTsgfQotCXwJU1FVQUQKLQkJCXsgJCQgPSAkMTsgfQotCXwJTE9ORwotCQkJeyAkJCA9ICQxOyB9Ci0JfCAJU0hPUlQKLQkJCXsgJCQgPSAkMTsgfQotCXwJQllURQotCQkJeyAkJCA9ICQxOyB9Ci0JOwotCi1maWxsX29wdDoKLSAgICAgICAgICAnPScgbXVzdGJlX2V4cAotCQl7Ci0JCSAgJCQgPQkgZXhwX2dldF92YWx1ZV9pbnQoJDIsCi0JCQkJCSAgIDAsCi0JCQkJCSAgICJmaWxsIHZhbHVlIiwKLQkJCQkJICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLQkJfQotCXwgCXsgJCQgPSAwOyB9Ci0JOwotCi0JCQotCi1hc3NpZ25fb3A6Ci0JCVBMVVNFUQotCQkJeyAkJCA9ICcrJzsgfQotCXwJTUlOVVNFUQotCQkJeyAkJCA9ICctJzsgfQotCXwgCU1VTFRFUQotCQkJeyAkJCA9ICcqJzsgfQotCXwgCURJVkVRCi0JCQl7ICQkID0gJy8nOyB9Ci0JfCAJTFNISUZURVEKLQkJCXsgJCQgPSBMU0hJRlQ7IH0KLQl8IAlSU0hJRlRFUQotCQkJeyAkJCA9IFJTSElGVDsgfQotCXwgCUFOREVRCi0JCQl7ICQkID0gJyYnOyB9Ci0JfCAJT1JFUQotCQkJeyAkJCA9ICd8JzsgfQotCi0JOwotCi1lbmQ6CSc7JyB8ICcsJwotCTsKLQotCi1hc3NpZ25tZW50OgotCQlOQU1FICc9JyBtdXN0YmVfZXhwCi0JCXsKLQkJICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCQyLCAkMSwgJDMpKTsKLQkJfQotCXwJTkFNRSBhc3NpZ25fb3AgbXVzdGJlX2V4cAotCQl7Ci0JCSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICQxLAotCQkJCQkJICBleHBfYmlub3AgKCQyLAotCQkJCQkJCSAgICAgZXhwX25hbWVvcCAoTkFNRSwKLQkJCQkJCQkJCSAkMSksCi0JCQkJCQkJICAgICAkMykpKTsKLQkJfQotCXwJUFJPVklERSAnKCcgTkFNRSAnPScgbXVzdGJlX2V4cCAnKScKLQkJewotCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9wcm92aWRlICgkMywgJDUpKTsKLQkJfQotCTsKLQotCi1vcHRfY29tbWE6Ci0JCScsJwl8CTsKLQotCi1tZW1vcnk6Ci0JCU1FTU9SWSAneycgbWVtb3J5X3NwZWMgbWVtb3J5X3NwZWNfbGlzdCAnfScKLQk7Ci0KLW1lbW9yeV9zcGVjX2xpc3Q6Ci0JCW1lbW9yeV9zcGVjX2xpc3QgbWVtb3J5X3NwZWMKLQl8CW1lbW9yeV9zcGVjX2xpc3QgJywnIG1lbW9yeV9zcGVjCi0JfAotCTsKLQotCi1tZW1vcnlfc3BlYzogCQlOQU1FCi0JCQl7IHJlZ2lvbiA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAoJDEpOyB9Ci0JCWF0dHJpYnV0ZXNfb3B0ICc6JwotCQlvcmlnaW5fc3BlYyBvcHRfY29tbWEgbGVuZ3RoX3NwZWMKLQotCTsgb3JpZ2luX3NwZWM6Ci0JT1JJR0lOICc9JyBtdXN0YmVfZXhwCi0JCXsgcmVnaW9uLT5jdXJyZW50ID0KLQkJIHJlZ2lvbi0+b3JpZ2luID0KLQkJIGV4cF9nZXRfdm1hKCQzLCAwTCwib3JpZ2luIiwgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLX0KLQk7Ci0KLWxlbmd0aF9zcGVjOgotICAgICAgICAgICAgIExFTkdUSCAnPScgbXVzdGJlX2V4cAotICAgICAgICAgICAgICAgeyByZWdpb24tPmxlbmd0aCA9IGV4cF9nZXRfdm1hKCQzLAotCQkJCQkgICAgICAgfigoYmZkX3ZtYSkwKSwKLQkJCQkJICAgICAgICJsZW5ndGgiLAotCQkJCQkgICAgICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLQkJfQotCTsKLQotYXR0cmlidXRlc19vcHQ6Ci0JCS8qIGVtcHR5ICovCi0JCSAgeyAvKiBkdW1teSBhY3Rpb24gdG8gYXZvaWQgYmlzb24gMS4yNSBlcnJvciBtZXNzYWdlICovIH0KLQl8CScoJyBhdHRyaWJ1dGVzX2xpc3QgJyknCi0JOwotCi1hdHRyaWJ1dGVzX2xpc3Q6Ci0JCWF0dHJpYnV0ZXNfc3RyaW5nCi0JfAlhdHRyaWJ1dGVzX2xpc3QgYXR0cmlidXRlc19zdHJpbmcKLQk7Ci0KLWF0dHJpYnV0ZXNfc3RyaW5nOgotCQlOQU1FCi0JCSAgeyBsYW5nX3NldF9mbGFncyAocmVnaW9uLCAkMSwgMCk7IH0KLQl8CSchJyBOQU1FCi0JCSAgeyBsYW5nX3NldF9mbGFncyAocmVnaW9uLCAkMiwgMSk7IH0KLQk7Ci0KLXN0YXJ0dXA6Ci0JU1RBUlRVUCAnKCcgZmlsZW5hbWUgJyknCi0JCXsgbGFuZ19zdGFydHVwKCQzKTsgfQotCTsKLQotaGlnaF9sZXZlbF9saWJyYXJ5OgotCQlITEwgJygnIGhpZ2hfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3QgJyknCi0JfAlITEwgJygnICcpJwotCQkJeyBsZGVtdWxfaGxsKChjaGFyICopTlVMTCk7IH0KLQk7Ci0KLWhpZ2hfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3Q6Ci0JCWhpZ2hfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3Qgb3B0X2NvbW1hIGZpbGVuYW1lCi0JCQl7IGxkZW11bF9obGwoJDMpOyB9Ci0JfAlmaWxlbmFtZQotCQkJeyBsZGVtdWxfaGxsKCQxKTsgfQotCi0JOwotCi1sb3dfbGV2ZWxfbGlicmFyeToKLQlTWVNMSUIgJygnIGxvd19sZXZlbF9saWJyYXJ5X05BTUVfbGlzdCAnKScKLQk7IGxvd19sZXZlbF9saWJyYXJ5X05BTUVfbGlzdDoKLQkJbG93X2xldmVsX2xpYnJhcnlfTkFNRV9saXN0IG9wdF9jb21tYSBmaWxlbmFtZQotCQkJeyBsZGVtdWxfc3lzbGliKCQzKTsgfQotCXwKLQk7Ci0KLWZsb2F0aW5nX3BvaW50X3N1cHBvcnQ6Ci0JCUZMT0FUCi0JCQl7IGxhbmdfZmxvYXQodHJ1ZSk7IH0KLQl8CU5PRkxPQVQKLQkJCXsgbGFuZ19mbG9hdChmYWxzZSk7IH0KLQk7Ci0JCQotbm9jcm9zc3JlZl9saXN0OgotCQkvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQgPSBOVUxMOwotCQl9Ci0JfAlOQU1FIG5vY3Jvc3NyZWZfbGlzdAotCQl7Ci0JCSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbjsKLQotCQkgIG4gPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCQkgIG4tPm5hbWUgPSAkMTsKLQkJICBuLT5uZXh0ID0gJDI7Ci0JCSAgJCQgPSBuOwotCQl9Ci0JfAlOQU1FICcsJyBub2Nyb3NzcmVmX2xpc3QKLQkJewotCQkgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm47Ci0KLQkJICBuID0gKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLQkJICBuLT5uYW1lID0gJDE7Ci0JCSAgbi0+bmV4dCA9ICQzOwotCQkgICQkID0gbjsKLQkJfQotCTsKLQotbXVzdGJlX2V4cDoJCSB7IGxkbGV4X2V4cHJlc3Npb24oKTsgfQotCQlleHAKLQkJCSB7IGxkbGV4X3BvcHN0YXRlKCk7ICQkPSQyO30KLQk7Ci0KLWV4cAk6Ci0JCSctJyBleHAgJXByZWMgVU5BUlkKLQkJCXsgJCQgPSBleHBfdW5vcCgnLScsICQyKTsgfQotCXwJJygnIGV4cCAnKScKLQkJCXsgJCQgPSAkMjsgfQotCXwJTkVYVCAnKCcgZXhwICcpJyAlcHJlYyBVTkFSWQotCQkJeyAkJCA9IGV4cF91bm9wKChpbnQpICQxLCQzKTsgfQotCXwJJyEnIGV4cCAlcHJlYyBVTkFSWQotCQkJeyAkJCA9IGV4cF91bm9wKCchJywgJDIpOyB9Ci0JfAknKycgZXhwICVwcmVjIFVOQVJZCi0JCQl7ICQkID0gJDI7IH0KLQl8CSd+JyBleHAgJXByZWMgVU5BUlkKLQkJCXsgJCQgPSBleHBfdW5vcCgnficsICQyKTt9Ci0KLQl8CWV4cCAnKicgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCcqJywgJDEsICQzKTsgfQotCXwJZXhwICcvJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJy8nLCAkMSwgJDMpOyB9Ci0JfAlleHAgJyUnIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnJScsICQxLCAkMyk7IH0KLQl8CWV4cCAnKycgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCcrJywgJDEsICQzKTsgfQotCXwJZXhwICctJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJy0nICwgJDEsICQzKTsgfQotCXwJZXhwIExTSElGVCBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoTFNISUZUICwgJDEsICQzKTsgfQotCXwJZXhwIFJTSElGVCBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoUlNISUZUICwgJDEsICQzKTsgfQotCXwJZXhwIEVRIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChFUSAsICQxLCAkMyk7IH0KLQl8CWV4cCBORSBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoTkUgLCAkMSwgJDMpOyB9Ci0JfAlleHAgTEUgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKExFICwgJDEsICQzKTsgfQotICAJfAlleHAgR0UgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKEdFICwgJDEsICQzKTsgfQotCXwJZXhwICc8JyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJzwnICwgJDEsICQzKTsgfQotCXwJZXhwICc+JyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJz4nICwgJDEsICQzKTsgfQotCXwJZXhwICcmJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJyYnICwgJDEsICQzKTsgfQotCXwJZXhwICdeJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJ14nICwgJDEsICQzKTsgfQotCXwJZXhwICd8JyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJ3wnICwgJDEsICQzKTsgfQotCXwJZXhwICc/JyBleHAgJzonIGV4cAotCQkJeyAkJCA9IGV4cF90cmlub3AoJz8nICwgJDEsICQzLCAkNSk7IH0KLQl8CWV4cCBBTkRBTkQgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKEFOREFORCAsICQxLCAkMyk7IH0KLQl8CWV4cCBPUk9SIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChPUk9SICwgJDEsICQzKTsgfQotCXwJREVGSU5FRCAnKCcgTkFNRSAnKScKLQkJCXsgJCQgPSBleHBfbmFtZW9wKERFRklORUQsICQzKTsgfQotCXwJSU5UCi0JCQl7ICQkID0gZXhwX2ludG9wKCQxKTsgfQotICAgICAgICB8CVNJWkVPRl9IRUFERVJTCi0JCQl7ICQkID0gZXhwX25hbWVvcChTSVpFT0ZfSEVBREVSUywwKTsgfQotCi0JfAlTSVpFT0YgJygnIE5BTUUgJyknCi0JCQl7ICQkID0gZXhwX25hbWVvcChTSVpFT0YsJDMpOyB9Ci0JfAlBRERSICcoJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9uYW1lb3AoQUREUiwkMyk7IH0KLQl8CUxPQURBRERSICcoJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9uYW1lb3AoTE9BREFERFIsJDMpOyB9Ci0JfAlBQlNPTFVURSAnKCcgZXhwICcpJwotCQkJeyAkJCA9IGV4cF91bm9wKEFCU09MVVRFLCAkMyk7IH0KLQl8CUFMSUdOX0sgJygnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfdW5vcChBTElHTl9LLCQzKTsgfQotCXwJQkxPQ0sgJygnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfdW5vcChBTElHTl9LLCQzKTsgfQotCXwJTkFNRQotCQkJeyAkJCA9IGV4cF9uYW1lb3AoTkFNRSwkMSk7IH0KLQl8CU1BWF9LICcoJyBleHAgJywnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfYmlub3AgKE1BWF9LLCAkMywgJDUgKTsgfQotCXwJTUlOX0sgJygnIGV4cCAnLCcgZXhwICcpJwotCQkJeyAkJCA9IGV4cF9iaW5vcCAoTUlOX0ssICQzLCAkNSApOyB9Ci0JfAlBU1NFUlRfSyAnKCcgZXhwICcsJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9hc3NlcnQgKCQzLCAkNSk7IH0KLQk7Ci0KLQotbWVtc3BlY19hdF9vcHQ6Ci0gICAgICAgICAgICAgICAgQVQgJz4nIE5BTUUgeyAkJCA9ICQzOyB9Ci0gICAgICAgIHwgICAgICAgeyAkJCA9ICIqZGVmYXVsdCoiOyB9Ci0gICAgICAgIDsKLQotb3B0X2F0OgotCQlBVCAnKCcgZXhwICcpJyB7ICQkID0gJDM7IH0KLQl8CXsgJCQgPSAwOyB9Ci0JOwotCi1zZWN0aW9uOglOQU1FIAkJeyBsZGxleF9leHByZXNzaW9uKCk7IH0KLQkJb3B0X2V4cF93aXRoX3R5cGUgCi0JCW9wdF9hdCAgIAl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9zY3JpcHQgKCk7IH0KLQkJJ3snCi0JCQl7Ci0JCQkgIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KCQxLCAkMywKLQkJCQkJCQkgICAgICBzZWN0eXBlLAotCQkJCQkJCSAgICAgIDAsIDAsIDAsICQ0KTsKLQkJCX0KLQkJc3RhdGVtZW50X2xpc3Rfb3B0IAkKLSAJCSd9JyB7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCW1lbXNwZWNfb3B0IG1lbXNwZWNfYXRfb3B0IHBoZHJfb3B0IGZpbGxfb3B0Ci0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoJDE0LCAkMTEsICQxMywgJDEyKTsKLQkJfQotCQlvcHRfY29tbWEKLQl8CU9WRVJMQVkKLQkJCXsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQlvcHRfZXhwX3dpdGhvdXRfdHlwZSBvcHRfbm9jcm9zc3JlZnMgb3B0X2F0Ci0JCQl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9zY3JpcHQgKCk7IH0KLQkJJ3snIAotCQkJewotCQkJICBsYW5nX2VudGVyX292ZXJsYXkgKCQzLCAkNSwgKGludCkgJDQpOwotCQkJfQotCQlvdmVybGF5X3NlY3Rpb24KLQkJJ30nCi0JCQl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCW1lbXNwZWNfb3B0IG1lbXNwZWNfYXRfb3B0IHBoZHJfb3B0IGZpbGxfb3B0Ci0JCQl7Ci0JCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQkJICBsYW5nX2xlYXZlX292ZXJsYXkgKCQxNSwgJDEyLCAkMTQsICQxMyk7Ci0JCQl9Ci0JCW9wdF9jb21tYQotCXwJLyogVGhlIEdST1VQIGNhc2UgaXMganVzdCBlbm91Z2ggdG8gc3VwcG9ydCB0aGUgZ2NjCi0JCSAgIHN2cjMuaWZpbGUgc2NyaXB0LiAgSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGZ1bGwKLQkJICAgc3VwcG9ydC4gIEknbSBub3QgZXZlbiBzdXJlIHdoYXQgR1JPVVAgaXMgc3VwcG9zZWQKLQkJICAgdG8gbWVhbi4gICovCi0JCUdST1VQIHsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQlvcHRfZXhwX3dpdGhfdHlwZQotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICIuIiwgJDMpKTsKLQkJfQotCQkneycgc2VjX29yX2dyb3VwX3AxICd9JwotCTsKLQotdHlwZToKLQkgICBOT0xPQUQgIHsgc2VjdHlwZSA9IG5vbG9hZF9zZWN0aW9uOyB9Ci0JfCAgRFNFQ1QgICB7IHNlY3R5cGUgPSBkc2VjdF9zZWN0aW9uOyB9Ci0JfCAgQ09QWSAgICB7IHNlY3R5cGUgPSBjb3B5X3NlY3Rpb247IH0KLQl8ICBJTkZPICAgIHsgc2VjdHlwZSA9IGluZm9fc2VjdGlvbjsgfQotCXwgIE9WRVJMQVkgeyBzZWN0eXBlID0gb3ZlcmxheV9zZWN0aW9uOyB9Ci0JOwotCi1hdHlwZToKLQkgCScoJyB0eXBlICcpJwotICAJfCAJLyogRU1QVFkgKi8geyBzZWN0eXBlID0gbm9ybWFsX3NlY3Rpb247IH0KLSAgCXwgCScoJyAnKScgeyBzZWN0eXBlID0gbm9ybWFsX3NlY3Rpb247IH0KLQk7Ci0KLW9wdF9leHBfd2l0aF90eXBlOgotCQlleHAgYXR5cGUgJzonCQl7ICQkID0gJDE7IH0KLQl8CWF0eXBlICc6JwkJeyAkJCA9IChldHJlZV90eXBlICopTlVMTDsgIH0KLQl8CS8qIFRoZSBCSU5EIGNhc2VzIGFyZSB0byBzdXBwb3J0IHRoZSBnY2Mgc3ZyMy5pZmlsZQotCQkgICBzY3JpcHQuICBUaGV5IGFyZW4ndCBpbnRlbmRlZCB0byBpbXBsZW1lbnQgZnVsbAotCQkgICBzdXBwb3J0IGZvciB0aGUgQklORCBrZXl3b3JkLiAgSSdtIG5vdCBldmVuIHN1cmUKLQkJICAgd2hhdCBCSU5EIGlzIHN1cHBvc2VkIHRvIG1lYW4uICAqLwotCQlCSU5EICcoJyBleHAgJyknIGF0eXBlICc6JyB7ICQkID0gJDM7IH0KLQl8CUJJTkQgJygnIGV4cCAnKScgQkxPQ0sgJygnIGV4cCAnKScgYXR5cGUgJzonCi0JCXsgJCQgPSAkMzsgfQotCTsKLQotb3B0X2V4cF93aXRob3V0X3R5cGU6Ci0JCWV4cCAnOicJCXsgJCQgPSAkMTsgfQotCXwJJzonCQl7ICQkID0gKGV0cmVlX3R5cGUgKikgTlVMTDsgIH0KLQk7Ci0KLW9wdF9ub2Nyb3NzcmVmczoKLQkJLyogZW1wdHkgKi8KLQkJCXsgJCQgPSAwOyB9Ci0JfAlOT0NST1NTUkVGUwotCQkJeyAkJCA9IDE7IH0KLQk7Ci0KLW1lbXNwZWNfb3B0OgotCQknPicgTkFNRQotCQl7ICQkID0gJDI7IH0KLQl8CXsgJCQgPSAiKmRlZmF1bHQqIjsgfQotCTsKLQotcGhkcl9vcHQ6Ci0JCS8qIGVtcHR5ICovCi0JCXsKLQkJICAkJCA9IE5VTEw7Ci0JCX0KLQl8CXBoZHJfb3B0ICc6JyBOQU1FCi0JCXsKLQkJICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKm47Ci0KLQkJICBuID0gKChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikKLQkJICAgICAgIHhtYWxsb2MgKHNpemVvZiAqbikpOwotCQkgIG4tPm5hbWUgPSAkMzsKLQkJICBuLT51c2VkID0gZmFsc2U7Ci0JCSAgbi0+bmV4dCA9ICQxOwotCQkgICQkID0gbjsKLQkJfQotCTsKLQotb3ZlcmxheV9zZWN0aW9uOgotCQkvKiBlbXB0eSAqLwotCXwJb3ZlcmxheV9zZWN0aW9uCi0JCU5BTUUKLQkJCXsKLQkJCSAgbGRsZXhfc2NyaXB0ICgpOwotCQkJICBsYW5nX2VudGVyX292ZXJsYXlfc2VjdGlvbiAoJDIpOwotCQkJfQotCQkneycgc3RhdGVtZW50X2xpc3Rfb3B0ICd9JwotCQkJeyBsZGxleF9wb3BzdGF0ZSAoKTsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQlwaGRyX29wdCBmaWxsX29wdAotCQkJewotCQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJCSAgbGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24gKCQ5LCAkOCk7Ci0JCQl9Ci0JCW9wdF9jb21tYQotCTsKLQotcGhkcnM6Ci0JCVBIRFJTICd7JyBwaGRyX2xpc3QgJ30nCi0JOwotCi1waGRyX2xpc3Q6Ci0JCS8qIGVtcHR5ICovCi0JfAlwaGRyX2xpc3QgcGhkcgotCTsKLQotcGhkcjoKLQkJTkFNRSB7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KLQkJICBwaGRyX3R5cGUgcGhkcl9xdWFsaWZpZXJzIHsgbGRsZXhfcG9wc3RhdGUgKCk7IH0KLQkJICAnOycKLQkJewotCQkgIGxhbmdfbmV3X3BoZHIgKCQxLCAkMywgJDQuZmlsZWhkciwgJDQucGhkcnMsICQ0LmF0LAotCQkJCSAkNC5mbGFncyk7Ci0JCX0KLQk7Ci0KLXBoZHJfdHlwZToKLQkJZXhwCi0JCXsKLQkJICAkJCA9ICQxOwotCi0JCSAgaWYgKCQxLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfbmFtZQotCQkgICAgICAmJiAkMS0+dHlwZS5ub2RlX2NvZGUgPT0gTkFNRSkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqczsKLQkJICAgICAgdW5zaWduZWQgaW50IGk7Ci0JCSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGhkcl90eXBlc1tdID0KLQkJCXsKLQkJCSAgIlBUX05VTEwiLCAiUFRfTE9BRCIsICJQVF9EWU5BTUlDIiwKLQkJCSAgIlBUX0lOVEVSUCIsICJQVF9OT1RFIiwgIlBUX1NITElCIiwKLQkJCSAgIlBUX1BIRFIiCi0JCQl9OwotCi0JCSAgICAgIHMgPSAkMS0+bmFtZS5uYW1lOwotCQkgICAgICBmb3IgKGkgPSAwOwotCQkJICAgaSA8IHNpemVvZiBwaGRyX3R5cGVzIC8gc2l6ZW9mIHBoZHJfdHlwZXNbMF07Ci0JCQkgICBpKyspCi0JCQlpZiAoc3RyY21wIChzLCBwaGRyX3R5cGVzW2ldKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgJCQgPSBleHBfaW50b3AgKGkpOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICB9Ci0JCX0KLQk7Ci0KLXBoZHJfcXVhbGlmaWVyczoKLQkJLyogZW1wdHkgKi8KLQkJewotCQkgIG1lbXNldCAoJiQkLCAwLCBzaXplb2YgKHN0cnVjdCBwaGRyX2luZm8pKTsKLQkJfQotCXwJTkFNRSBwaGRyX3ZhbCBwaGRyX3F1YWxpZmllcnMKLQkJewotCQkgICQkID0gJDM7Ci0JCSAgaWYgKHN0cmNtcCAoJDEsICJGSUxFSERSIikgPT0gMCAmJiAkMiA9PSBOVUxMKQotCQkgICAgJCQuZmlsZWhkciA9IHRydWU7Ci0JCSAgZWxzZSBpZiAoc3RyY21wICgkMSwgIlBIRFJTIikgPT0gMCAmJiAkMiA9PSBOVUxMKQotCQkgICAgJCQucGhkcnMgPSB0cnVlOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAoJDEsICJGTEFHUyIpID09IDAgJiYgJDIgIT0gTlVMTCkKLQkJICAgICQkLmZsYWdzID0gJDI7Ci0JCSAgZWxzZQotCQkgICAgZWluZm8gKF8oIiVYJVA6JVM6IFBIRFJTIHN5bnRheCBlcnJvciBhdCBgJXMnXG4iKSwgJDEpOwotCQl9Ci0JfAlBVCAnKCcgZXhwICcpJyBwaGRyX3F1YWxpZmllcnMKLQkJewotCQkgICQkID0gJDU7Ci0JCSAgJCQuYXQgPSAkMzsKLQkJfQotCTsKLQotcGhkcl92YWw6Ci0JCS8qIGVtcHR5ICovCi0JCXsKLQkJICAkJCA9IE5VTEw7Ci0JCX0KLQl8ICcoJyBleHAgJyknCi0JCXsKLQkJICAkJCA9ICQyOwotCQl9Ci0JOwotCi0vKiBUaGlzIHN5bnRheCBpcyB1c2VkIHdpdGhpbiBhbiBleHRlcm5hbCB2ZXJzaW9uIHNjcmlwdCBmaWxlLiAgKi8KLQotdmVyc2lvbl9zY3JpcHRfZmlsZToKLQkJewotCQkgIGxkbGV4X3ZlcnNpb25fZmlsZSAoKTsKLQkJICBQVVNIX0VSUk9SIChfKCJWRVJTSU9OIHNjcmlwdCIpKTsKLQkJfQotCQl2ZXJzX25vZGVzCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJICBQT1BfRVJST1IgKCk7Ci0JCX0KLQk7Ci0KLS8qIFRoaXMgaXMgdXNlZCB3aXRoaW4gYSBub3JtYWwgbGlua2VyIHNjcmlwdCBmaWxlLiAgKi8KLQotdmVyc2lvbjoKLQkJewotCQkgIGxkbGV4X3ZlcnNpb25fc2NyaXB0ICgpOwotCQl9Ci0JCVZFUlNJT05LICd7JyB2ZXJzX25vZGVzICd9JwotCQl7Ci0JCSAgbGRsZXhfcG9wc3RhdGUgKCk7Ci0JCX0KLQk7Ci0KLXZlcnNfbm9kZXM6Ci0JCXZlcnNfbm9kZQotCXwJdmVyc19ub2RlcyB2ZXJzX25vZGUKLQk7Ci0KLXZlcnNfbm9kZToKLQkJVkVSU19UQUcgJ3snIHZlcnNfdGFnICd9JyAnOycKLQkJewotCQkgIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlICgkMSwgJDMsIE5VTEwpOwotCQl9Ci0JfAlWRVJTX1RBRyAneycgdmVyc190YWcgJ30nIHZlcmRlcCAnOycKLQkJewotCQkgIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlICgkMSwgJDMsICQ1KTsKLQkJfQotCTsKLQotdmVyZGVwOgotCQlWRVJTX1RBRwotCQl7Ci0JCSAgJCQgPSBsYW5nX2FkZF92ZXJzX2RlcGVuZCAoTlVMTCwgJDEpOwotCQl9Ci0JfAl2ZXJkZXAgVkVSU19UQUcKLQkJewotCQkgICQkID0gbGFuZ19hZGRfdmVyc19kZXBlbmQgKCQxLCAkMik7Ci0JCX0KLQk7Ci0KLXZlcnNfdGFnOgotCQkvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKE5VTEwsIE5VTEwpOwotCQl9Ci0JfAl2ZXJzX2RlZm5zICc7JwotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKCQxLCBOVUxMKTsKLQkJfQotCXwJR0xPQkFMICc6JyB2ZXJzX2RlZm5zICc7JwotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKCQzLCBOVUxMKTsKLQkJfQotCXwJTE9DQUwgJzonIHZlcnNfZGVmbnMgJzsnCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoTlVMTCwgJDMpOwotCQl9Ci0JfAlHTE9CQUwgJzonIHZlcnNfZGVmbnMgJzsnIExPQ0FMICc6JyB2ZXJzX2RlZm5zICc7JwotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKCQzLCAkNyk7Ci0JCX0KLQk7Ci0KLXZlcnNfZGVmbnM6Ci0JCVZFUlNfSURFTlRJRklFUgotCQl7Ci0JCSAgJCQgPSBsYW5nX25ld192ZXJzX3JlZ2V4IChOVUxMLCAkMSwgbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nKTsKLQkJfQotCXwJdmVyc19kZWZucyAnOycgVkVSU19JREVOVElGSUVSCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfcmVnZXggKCQxLCAkMywgbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nKTsKLQkJfQotCXwJRVhURVJOIE5BTUUgJ3snCi0JCQl7Ci0JCQkgICQ8bmFtZT4kID0gbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nOwotCQkJICBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcgPSAkMjsKLQkJCX0KLQkJdmVyc19kZWZucyAnfScKLQkJCXsKLQkJCSAgbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nID0gJDxuYW1lPjQ7Ci0JCQl9Ci0JOwotCi0lJQotdm9pZAoteXllcnJvcihhcmcpIAotICAgICBjb25zdCBjaGFyICphcmc7Ci17IAotICBpZiAobGRmaWxlX2Fzc3VtZWRfc2NyaXB0KQotICAgIGVpbmZvIChfKCIlUDolczogZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQ7IHRyZWF0aW5nIGFzIGxpbmtlciBzY3JpcHRcbiIpLAotCSAgIGxkZmlsZV9pbnB1dF9maWxlbmFtZSk7Ci0gIGlmIChlcnJvcl9pbmRleCA+IDAgJiYgZXJyb3JfaW5kZXggPCBFUlJPUl9OQU1FX01BWCkKLSAgICAgZWluZm8gKCIlUCVGOiVTOiAlcyBpbiAlc1xuIiwgYXJnLCBlcnJvcl9uYW1lc1tlcnJvcl9pbmRleC0xXSk7Ci0gIGVsc2UKLSAgICAgZWluZm8gKCIlUCVGOiVTOiAlc1xuIiwgYXJnKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkaW50LnRleGluZm8gYi9sZC9sZGludC50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGVhNzg4Li4wMDAwMDAwCi0tLSBhL2xkL2xkaW50LnRleGluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBsZGludC5pbmZvCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIExkLUludGVybmFsczogKGxkaW50KS4JVGhlIEdOVSBsaW5rZXIgaW50ZXJuYWxzLgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBHTlUgbGlua2VyIGxkLgotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUNvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBvciBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCAoZm9yIHdoaWNoIHB1cnBvc2UgdGhpcyB0ZXh0IG1heSBiZQotcmVnYXJkZWQgYXMgYSBwcm9ncmFtIGluIHRoZSBsYW5ndWFnZSBUZVgpLgotQGVuZCBpZmluZm8KLQotQGlmdGV4Ci1AZmluYWxvdXQKLUBzZXRjaGFwdGVybmV3cGFnZSBvZmYKLUBzZXR0aXRsZSBHTlUgTGlua2VyIEludGVybmFscwotQHRpdGxlcGFnZQotQHRpdGxle0EgZ3VpZGUgdG8gdGhlIGludGVybmFscyBvZiB0aGUgR05VIGxpbmtlcn0KLUBhdXRob3IgUGVyIEJvdGhuZXIsIFN0ZXZlIENoYW1iZXJsYWluLCBJYW4gTGFuY2UgVGF5bG9yLCBESiBEZWxvcmllCi1AYXV0aG9yIEN5Z251cyBTdXBwb3J0Ci1AcGFnZQotCi1AdGV4Ci1cZGVmXCQjMSR7eyMxfX0gICUgS2x1Z2U6IGNvbGxlY3QgUkNTIHJldmlzaW9uIGluZm8gd2l0aG91dCAkLi4uJAotXHhkZWZcbWFudmVyc3tcJFJldmlzaW9uJH0gICUgRm9yIHVzZSBpbiBoZWFkZXJzLCBmb290ZXJzIHRvbwote1xwYXJza2lwPTBwdAotXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhcgotXGhmaWxsIFxtYW52ZXJzXHBhcgotXGhmaWxsIFxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhcgotfQotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBlbmQgdGl0bGVwYWdlCi1AZW5kIGlmdGV4Ci0KLUBub2RlIFRvcAotQHRvcAotCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIEdOVSBsaW5rZXIgQGNvZGV7bGR9LiAgSXQgaXMgYQotY29sbGVjdGlvbiBvZiBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uIHdpdGggbGl0dGxlIGZvcm0gYXQgdGhpcyBwb2ludC4KLU1vc3RseSwgaXQgaXMgYSByZXBvc2l0b3J5IGludG8gd2hpY2ggeW91IGNhbiBwdXQgaW5mb3JtYXRpb24gYWJvdXQKLUdOVSBAY29kZXtsZH0gYXMgeW91IGRpc2NvdmVyIGl0IChvciBhcyB5b3UgZGVzaWduIGNoYW5nZXMgdG8gQGNvZGV7bGR9KS4KLQotQG1lbnUKLSogUkVBRE1FOjoJCQlUaGUgUkVBRE1FIEZpbGUKLSogRW11bGF0aW9uczo6CQkJSG93IGxpbmtlciBlbXVsYXRpb25zIGFyZSBnZW5lcmF0ZWQKLSogRW11bGF0aW9uIFdhbGt0aHJvdWdoOjoJQSBXYWxrdGhyb3VnaCBvZiBhIFR5cGljYWwgRW11bGF0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgUkVBRE1FCi1AY2hhcHRlciBUaGUgQGZpbGV7UkVBRE1FfSBGaWxlCi0KLUNoZWNrIHRoZSBAZmlsZXtSRUFETUV9IGZpbGU7IGl0IG9mdGVuIGhhcyB1c2VmdWwgaW5mb3JtYXRpb24gdGhhdCBkb2VzIG5vdAotYXBwZWFyIGFueXdoZXJlIGVsc2UgaW4gdGhlIGRpcmVjdG9yeS4KLQotQG5vZGUgRW11bGF0aW9ucwotQGNoYXB0ZXIgSG93IGxpbmtlciBlbXVsYXRpb25zIGFyZSBnZW5lcmF0ZWQKLQotRWFjaCBsaW5rZXIgdGFyZ2V0IGhhcyBhbiBAZGZue2VtdWxhdGlvbn0uICBUaGUgZW11bGF0aW9uIGluY2x1ZGVzIHRoZQotZGVmYXVsdCBsaW5rZXIgc2NyaXB0LCBhbmQgY2VydGFpbiBlbXVsYXRpb25zIGFsc28gbW9kaWZ5IGNlcnRhaW4gdHlwZXMKLW9mIGxpbmtlciBiZWhhdmlvdXIuCi0KLUVtdWxhdGlvbnMgYXJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIGJ5IHRoZSBzaGVsbCBzY3JpcHQKLUBmaWxle2dlbnNjcmlwdHMuc2h9LgotCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHN0YXJ0cyBieSByZWFkaW5nIGEgZmlsZSBpbiB0aGUKLUBmaWxle2VtdWxwYXJhbXN9IGRpcmVjdG9yeS4gIFRoaXMgaXMgYSBzaGVsbCBzY3JpcHQgd2hpY2ggc2V0cyB2YXJpb3VzCi1zaGVsbCB2YXJpYWJsZXMgdXNlZCBieSBAZmlsZXtnZW5zY3JpcHRzLnNofSBhbmQgdGhlIG90aGVyIHNoZWxsIHNjcmlwdHMKLWl0IGludm9rZXMuCi0KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBpbnZva2UgYSBzaGVsbCBzY3JpcHQgaW4gdGhlCi1AZmlsZXtzY3JpcHR0ZW1wbH0gZGlyZWN0b3J5IGluIG9yZGVyIHRvIGNyZWF0ZSBkZWZhdWx0IGxpbmtlciBzY3JpcHRzCi13cml0dGVuIGluIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0Ci13aWxsIGJlIGludm9rZWQgNSAob3IsIGluIHNvbWUgY2FzZXMsIDYpIHRpbWVzLCB3aXRoIGRpZmZlcmVudAotYXNzaWdubWVudHMgdG8gc2hlbGwgdmFyaWFibGVzLCB0byBjcmVhdGUgZGlmZmVyZW50IGRlZmF1bHQgc2NyaXB0cy4KLVRoZSBjaG9pY2Ugb2Ygc2NyaXB0IGlzIG1hZGUgYmFzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCi1BZnRlciBjcmVhdGluZyB0aGUgc2NyaXB0cywgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCBpbnZva2UgeWV0IGFub3RoZXIKLXNoZWxsIHNjcmlwdCwgdGhpcyB0aW1lIGluIHRoZSBAZmlsZXtlbXVsdGVtcGx9IGRpcmVjdG9yeS4gIFRoYXQgc2hlbGwKLXNjcmlwdCB3aWxsIGNyZWF0ZSB0aGUgZW11bGF0aW9uIHNvdXJjZSBmaWxlLCB3aGljaCBjb250YWlucyBDIGNvZGUuCi1UaGlzIEMgY29kZSBwZXJtaXRzIHRoZSBsaW5rZXIgZW11bGF0aW9uIHRvIG92ZXJyaWRlIHZhcmlvdXMgbGlua2VyCi1iZWhhdmlvdXJzLiAgTW9zdCB0YXJnZXRzIHVzZSB0aGUgZ2VuZXJpYyBlbXVsYXRpb24gY29kZSwgd2hpY2ggaXMgaW4KLUBmaWxle2VtdWx0ZW1wbC9nZW5lcmljLmVtfS4KLQotVG8gc3VtbWFyaXplLCBAZmlsZXtnZW5zY3JpcHRzLnNofSByZWFkcyB0aHJlZSBzaGVsbCBzY3JpcHRzOiBhbgotZW11bGF0aW9uIHBhcmFtZXRlcnMgc2NyaXB0IGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBkaXJlY3RvcnksIGEgbGlua2VyCi1zY3JpcHQgZ2VuZXJhdGlvbiBzY3JpcHQgaW4gdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBkaXJlY3RvcnksIGFuZCBhbgotZW11bGF0aW9uIHNvdXJjZSBmaWxlIGdlbmVyYXRpb24gc2NyaXB0IGluIHRoZSBAZmlsZXtlbXVsdGVtcGx9Ci1kaXJlY3RvcnkuCi0KLUZvciBleGFtcGxlLCB0aGUgU3VuIDQgbGlua2VyIHNldHMgdXAgdmFyaWFibGVzIGluCi1AZmlsZXtlbXVscGFyYW1zL3N1bjQuc2h9LCBjcmVhdGVzIGxpbmtlciBzY3JpcHRzIHVzaW5nCi1AZmlsZXtzY3JpcHR0ZW1wbC9hb3V0LnNjfSwgYW5kIGNyZWF0ZXMgdGhlIGVtdWxhdGlvbiBjb2RlIHVzaW5nCi1AZmlsZXtlbXVsdGVtcGwvc3Vub3MuZW19LgotCi1Ob3RlIHRoYXQgdGhlIGxpbmtlciBjYW4gc3VwcG9ydCBzZXZlcmFsIGVtdWxhdGlvbnMgc2ltdWx0YW5lb3VzbHksCi1kZXBlbmRpbmcgdXBvbiBob3cgaXQgaXMgY29uZmlndXJlZC4gIEFuIGVtdWxhdGlvbiBjYW4gYmUgc2VsZWN0ZWQgd2l0aAotdGhlIEBjb2Rley1tfSBvcHRpb24uICBUaGUgQGNvZGV7LVZ9IG9wdGlvbiB3aWxsIGxpc3QgYWxsIHN1cHBvcnRlZAotZW11bGF0aW9ucy4KLQotQG1lbnUKLSogZW11bGF0aW9uIHBhcmFtZXRlcnM6OiAgICAgICAgQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0cwotKiBsaW5rZXIgc2NyaXB0czo6ICAgICAgICAgICAgICBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cwotKiBsaW5rZXIgZW11bGF0aW9uczo6ICAgICAgICAgICBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdHMKLUBlbmQgbWVudQotCi1Abm9kZSBlbXVsYXRpb24gcGFyYW1ldGVycwotQHNlY3Rpb24gQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0cwotCi1FYWNoIHRhcmdldCBzZWxlY3RzIGEgcGFydGljdWxhciBmaWxlIGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBkaXJlY3RvcnkKLWJ5IHNldHRpbmcgdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle3RhcmdfZW11bH0gaW4gQGZpbGV7Y29uZmlndXJlLnRndH0uCi1UaGlzIHNoZWxsIHZhcmlhYmxlIGlzIHVzZWQgYnkgdGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHRvIGNvbnRyb2wKLWJ1aWxkaW5nIGFuIGVtdWxhdGlvbiBzb3VyY2UgZmlsZS4KLQotQ2VydGFpbiBjb252ZW50aW9ucyBhcmUgZW5mb3JjZWQuICBTdXBwb3NlIHRoZSBAY29kZXt0YXJnX2VtdWx9IHZhcmlhYmxlCi1pcyBzZXQgdG8gQHZhcntlbXVsfSBpbiBAZmlsZXtjb25maWd1cmUudGd0fS4gIFRoZSBuYW1lIG9mIHRoZSBlbXVsYXRpb24KLXNoZWxsIHNjcmlwdCB3aWxsIGJlIEBmaWxle2VtdWxwYXJhbXMvQHZhcntlbXVsfS5zaH0uICBUaGUKLUBmaWxle01ha2VmaWxlfSBtdXN0IGhhdmUgYSB0YXJnZXQgbmFtZWQgQGZpbGV7ZUB2YXJ7ZW11bH0uY307IHRoaXMKLXRhcmdldCBtdXN0IGRlcGVuZCB1cG9uIEBmaWxle2VtdWxwYXJhbXMvQHZhcntlbXVsfS5zaH0sIGFzIHdlbGwgYXMgdGhlCi1hcHByb3ByaWF0ZSBzY3JpcHRzIGluIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gYW5kIEBmaWxle2VtdWx0ZW1wbH0KLWRpcmVjdG9yaWVzLiAgVGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXQgbXVzdCBpbnZva2UgQGNvZGV7R0VOU0NSSVBUU30KLXdpdGggdHdvIGFyZ3VtZW50czogQHZhcntlbXVsfSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbWFrZSB2YXJpYWJsZQotQGNvZGV7dGRpcl9AdmFye2VtdWx9fS4gIFRoZSB2YWx1ZSBvZiB0aGUgbGF0dGVyIHZhcmlhYmxlIHdpbGwgYmUgc2V0IGJ5Ci10aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQsIGFuZCBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCB0YXJnZXQKLWRpcmVjdG9yeSB0byBzZWFyY2guCi0KLUJ5IGNvbnZlbnRpb24sIHRoZSBAZmlsZXtlbXVscGFyYW1zL0B2YXJ7ZW11bH0uc2h9IHNoZWxsIHNjcmlwdCBzaG91bGQKLW9ubHkgc2V0IHNoZWxsIHZhcmlhYmxlcy4gIEl0IG1heSBzZXQgc2hlbGwgdmFyaWFibGVzIHdoaWNoIGFyZSB0byBiZQotaW50ZXJwcmV0ZWQgYnkgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBhbmQgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cy4KLUNlcnRhaW4gc2hlbGwgdmFyaWFibGVzIGFyZSBpbnRlcnByZXRlZCBkaXJlY3RseSBieSB0aGUKLUBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdC4KLQotSGVyZSBpcyBhIGxpc3Qgb2Ygc2hlbGwgdmFyaWFibGVzIGludGVycHJldGVkIGJ5IEBmaWxle2dlbnNjcmlwdHMuc2h9LAotYXMgd2VsbCBhcyBzb21lIGNvbnZlbnRpb25hbCBzaGVsbCB2YXJpYWJsZXMgaW50ZXJwcmV0ZWQgYnkgdGhlCi1AZmlsZXtzY3JpcHR0ZW1wbH0gYW5kIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBTQ1JJUFRfTkFNRQotVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB0byB1c2UuICBJZgotQGNvZGV7U0NSSVBUX05BTUV9IGlzIHNldCB0byBAdmFye3NjcmlwdH0sIEBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgdXNlCi10aGUgc2NyaXB0IEBmaWxle3NjcmlwdHRlbWwvQHZhcntzY3JpcHR9LnNjfS4KLQotQGl0ZW0gVEVNUExBVEVfTkFNRQotVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHRlbWxwfSBzY3JpcHQgdG8gdXNlLiAgSWYKLUBjb2Rle1RFTVBMQVRFX05BTUV9IGlzIHNldCB0byBAdmFye3RlbXBsYXRlfSwgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbAotdXNlIHRoZSBzY3JpcHQgQGZpbGV7ZW11bHRlbXBsL0B2YXJ7dGVtcGxhdGV9LmVtfS4gIElmIHRoaXMgdmFyaWFibGUgaXMKLW5vdCBzZXQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIEBzYW1we2dlbmVyaWN9LgotCi1AaXRlbSBHRU5FUkFURV9TSExJQl9TQ1JJUFQKLUlmIHRoaXMgaXMgc2V0IHRvIGEgbm9uZW1wdHkgc3RyaW5nLCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsIGludm9rZQotdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgYW4gZXh0cmEgdGltZSB0byBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeQotc2NyaXB0LiAgQHJlZntsaW5rZXIgc2NyaXB0c30uCi0KLUBpdGVtIE9VVFBVVF9GT1JNQVQKLVRoaXMgaXMgbm9ybWFsbHkgc2V0IHRvIGluZGljYXRlIHRoZSBCRkQgb3V0cHV0IGZvcm1hdCB1c2UgKGUuZy4sCi1Ac2FtcHsiYS5vdXQtc3Vub3MtYmlnIn0uICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB3aWxsIG5vcm1hbGx5Ci11c2UgaXQgaW4gYW4gQGNvZGV7T1VUUFVUX0ZPUk1BVH0gZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLQotQGl0ZW0gQVJDSAotVGhpcyBpcyBub3JtYWxseSBzZXQgdG8gaW5kaWNhdGUgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2UgKGUuZy4sCi1Ac2FtcHtzcGFyY30pLiAgVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgd2lsbCBub3JtYWxseSB1c2UgaXQgaW4gYW4KLUBjb2Rle09VVFBVVF9BUkNIfSBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1AaXRlbSBFTlRSWQotU29tZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cyB1c2UgdGhpcyB0byBzZXQgdGhlIGVudHJ5IGFkZHJlc3MsIGluIGFuCi1AY29kZXtFTlRSWX0gZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLQotQGl0ZW0gVEVYVF9TVEFSVF9BRERSCi1Tb21lIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzIHVzZSB0aGlzIHRvIHNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUKLUBzYW1wey50ZXh0fSBzZWN0aW9uLgotCi1AaXRlbSBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIKLUlmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCBzZXRzCi1AY29kZXtURVhUX1NUQVJUX0FERFJ9IHRvIGl0cyB2YWx1ZSBiZWZvcmUgcnVubmluZyB0aGUKLUBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgZm9yIHRoZSBAY29kZXstbn0gYW5kIEBjb2Rley1OfSBvcHRpb25zCi0oQHB4cmVme2xpbmtlciBzY3JpcHRzfSkuCi0KLUBpdGVtIFNFR01FTlRfU0laRQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mCi1AY29kZXtEQVRBX0FMSUdOTUVOVH0gd2hlbiBydW5uaW5nIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0LgotCi1AaXRlbSBUQVJHRVRfUEFHRV9TSVpFCi1JZiBAY29kZXtTRUdNRU5UX1NJWkV9IGlzIG5vdCBkZWZpbmVkLCB0aGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0Ci11c2VzIHRoaXMgdG8gZGVmaW5lIGl0LgotCi1AaXRlbSBBTElHTk1FTlQKLVNvbWUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdHMgc2V0IHRoaXMgdG8gYSBudW1iZXIgdG8gcGFzcyB0bwotQGNvZGV7QUxJR059IHRvIHNldCB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgQGNvZGV7ZW5kfSBzeW1ib2wuCi1AZW5kIHRhYmxlCi0KLUBub2RlIGxpbmtlciBzY3JpcHRzCi1Ac2VjdGlvbiBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cwotCi1FYWNoIGxpbmtlciB0YXJnZXQgdXNlcyBhIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgdG8gZ2VuZXJhdGUgdGhlCi1kZWZhdWx0IGxpbmtlciBzY3JpcHRzLiAgVGhlIG5hbWUgb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMKLXNldCBieSB0aGUgQGNvZGV7U0NSSVBUX05BTUV9IHZhcmlhYmxlIGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQuCi1JZiBAY29kZXtTQ1JJUFRfTkFNRX0gaXMgc2V0IHRvIEB2YXJ7c2NyaXB0fSwgQGNvZGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbAotaW52b2tlIEBmaWxle3NjcmlwdHRlbXBsL0B2YXJ7c2NyaXB0fS5zY30uCi0KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBpbnZva2UgdGhlIEBmaWxle3NjcmlwdHRlbXBsfQotc2NyaXB0IDUgb3IgNiB0aW1lcy4gIEVhY2ggdGltZSBpdCB3aWxsIHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBjb2Rle0xEX0ZMQUd9IHRvIGEgZGlmZmVyZW50IHZhbHVlLiAgV2hlbiB0aGUgbGlua2VyIGlzIHJ1biwgdGhlCi1vcHRpb25zIHVzZWQgd2lsbCBkaXJlY3QgaXQgdG8gc2VsZWN0IGEgcGFydGljdWxhciBzY3JpcHQuICAoU2NyaXB0Ci1zZWxlY3Rpb24gaXMgY29udHJvbGxlZCBieSB0aGUgQGNvZGV7Z2V0X3NjcmlwdH0gZW11bGF0aW9uIGVudHJ5IHBvaW50OwotdGhpcyBkZXNjcmliZXMgdGhlIGNvbnZlbnRpb25hbCBiZWhhdmlvdXIpLgotCi1UaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBzaG91bGQganVzdCB3cml0ZSBhIGxpbmtlciBzY3JpcHQsIHdyaXR0ZW4KLWluIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZSwgdG8gc3RhbmRhcmQgb3V0cHV0LiAgSWYgdGhlIGVtdWxhdGlvbgotbmFtZS0tdGhlIG5hbWUgb2YgdGhlIEBmaWxle2VtdWxwYXJhbXN9IGZpbGUgd2l0aG91dCB0aGUgQGZpbGV7LnNjfQotZXh0ZW5zaW9uLS1pcyBAdmFye2VtdWx9LCB0aGVuIHRoZSBvdXRwdXQgd2lsbCBiZSBkaXJlY3RlZCB0bwotQGZpbGV7bGRzY3JpcHRzL0B2YXJ7ZW11bH0uQHZhcntleHRlbnNpb259fSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LAotd2hlcmUgQHZhcntleHRlbnNpb259IGNoYW5nZXMgZWFjaCB0aW1lIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzCi1pbnZva2VkLgotCi1IZXJlIGlzIHRoZSBsaXN0IG9mIHZhbHVlcyBhc3NpZ25lZCB0byBAY29kZXtMRF9GTEFHfS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAoZW1wdHkpCi1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIGJ5IGRlZmF1bHQgKHdoZW4gbm9uZSBvZiB0aGUgZm9sbG93aW5nCi1jYXNlcyBhcHBseSkuICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7Lnh9LgotQGl0ZW0gbgotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LW59IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueG59LgotQGl0ZW0gTgotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LU59IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueGJufS4KLUBpdGVtIHIKLVRoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgd2hlbiB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCB0aGUKLUBjb2Rley1yfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnhyfS4KLUBpdGVtIHUKLVRoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgd2hlbiB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCB0aGUKLUBjb2Rley1Vcn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54dX0uCi1AaXRlbSBzaGFyZWQKLVRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzIG9ubHkgaW52b2tlZCB3aXRoIEBjb2Rle0xEX0ZMQUd9IHNldCB0bwotdGhpcyB2YWx1ZSBpZiBAY29kZXtHRU5FUkFURV9TSExJQl9TQ1JJUFR9IGlzIGRlZmluZWQgaW4gdGhlCi1AZmlsZXtlbXVscGFyYW1zfSBmaWxlLiAgVGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IG11c3QgYXJyYW5nZSB0byB1c2UKLXRoaXMgc2NyaXB0IGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lLCBub3JtYWxseSB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZAotd2l0aCB0aGUgQGNvZGV7LXNoYXJlZH0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mCi1AZmlsZXsueHN9LgotQGVuZCB0YWJsZQotCi1CZXNpZGVzIHRoZSBzaGVsbCB2YXJpYWJsZXMgc2V0IGJ5IHRoZSBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQsIGFuZCB0aGUKLUBjb2Rle0xEX0ZMQUd9IHZhcmlhYmxlLCB0aGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHdpbGwgc2V0Ci1jZXJ0YWluIHZhcmlhYmxlcyBmb3IgZWFjaCBydW4gb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gUkVMT0NBVElORwotVGhpcyB3aWxsIGJlIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiB0aGUgbGlua2VyIGlzIGRvaW5nIGEgZmluYWwKLXJlbG9jYXRpb24gKGUuZy4sIGFsbCBzY3JpcHRzIG90aGVyIHRoYW4gQGNvZGV7LXJ9IGFuZCBAY29kZXstVXJ9KS4KLQotQGl0ZW0gQ09OU1RSVUNUSU5HCi1UaGlzIHdpbGwgYmUgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgYnVpbGRpbmcKLWdsb2JhbCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMgKGUuZy4sIGFsbCBzY3JpcHRzIG90aGVyIHRoYW4KLUBjb2Rley1yfSkuCi0KLUBpdGVtIERBVEFfQUxJR05NRU5UCi1UaGlzIHdpbGwgYmUgc2V0IHRvIGFuIEBjb2Rle0FMSUdOfSBleHByZXNzaW9uIHdoZW4gdGhlIG91dHB1dCBzaG91bGQgYmUKLXBhZ2UgYWxpZ25lZCwgb3IgdG8gQHNhbXB7Ln0gd2hlbiBnZW5lcmF0aW5nIHRoZSBAY29kZXstTn0gc2NyaXB0LgotCi1AaXRlbSBDUkVBVEVfU0hMSUIKLVRoaXMgd2lsbCBiZSBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gZ2VuZXJhdGluZyBhIEBjb2Rley1zaGFyZWR9Ci1zY3JpcHQuCi1AZW5kIHRhYmxlCi0KLVRoZSBjb252ZW50aW9uYWwgd2F5IHRvIHdyaXRlIGEgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBpcyB0byBmaXJzdAotc2V0IGEgZmV3IHNoZWxsIHZhcmlhYmxlcywgYW5kIHRoZW4gd3JpdGUgb3V0IGEgbGlua2VyIHNjcmlwdCB1c2luZwotQGNvZGV7Y2F0fSB3aXRoIGEgaGVyZSBkb2N1bWVudC4gIFRoZSBsaW5rZXIgc2NyaXB0IHdpbGwgdXNlIHZhcmlhYmxlCi1zdWJzdGl0dXRpb25zLCBiYXNlZCBvbiB0aGUgYWJvdmUgdmFyaWFibGVzIGFuZCB0aG9zZSBzZXQgaW4gdGhlCi1AZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQsIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW91ci4KLQotV2hlbiB0aGVyZSBhcmUgcGFydHMgb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgd2hpY2ggc2hvdWxkIG9ubHkKLWJlIHJ1biB3aGVuIGRvaW5nIGEgZmluYWwgcmVsb2NhdGlvbiwgdGhleSBzaG91bGQgYmUgZW5jbG9zZWQgd2l0aGluIGEKLXZhcmlhYmxlIHN1YnN0aXR1dGlvbiBiYXNlZCBvbiBAY29kZXtSRUxPQ0FUSU5HfS4gIEZvciBleGFtcGxlLCBvbiBtYW55Ci10YXJnZXRzIHNwZWNpYWwgc3ltYm9scyBzdWNoIGFzIEBjb2Rle19lbmR9IHNob3VsZCBiZSBkZWZpbmVkIHdoZW4gZG9pbmcKLWEgZmluYWwgbGluay4gIE5hdHVyYWxseSwgdGhvc2Ugc3ltYm9scyBzaG91bGQgbm90IGJlIGRlZmluZWQgd2hlbiBkb2luZwotYSByZWxvY2F0ZWFibGUgbGluayB1c2luZyBAY29kZXstcn0uICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdAotY291bGQgdXNlIGEgY29uc3RydWN0IGxpa2UgdGhpcyB0byBkZWZpbmUgdGhvc2Ugc3ltYm9sczoKLUBzbWFsbGV4YW1wbGUKLSAgJEB7UkVMT0NBVElORysgX2VuZCA9IC47QH0KLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIHdpbGwgZG8gdGhlIHN5bWJvbCBhc3NpZ25tZW50IG9ubHkgaWYgdGhlIEBjb2Rle1JFTE9DQVRJTkd9Ci12YXJpYWJsZSBpcyBkZWZpbmVkLgotCi1UaGUgYmFzaWMgam9iIG9mIHRoZSBsaW5rZXIgc2NyaXB0IGlzIHRvIHB1dCB0aGUgc2VjdGlvbnMgaW4gdGhlIGNvcnJlY3QKLW9yZGVyLCBhbmQgYXQgdGhlIGNvcnJlY3QgbWVtb3J5IGFkZHJlc3Nlcy4gIEZvciBzb21lIHRhcmdldHMsIHRoZQotbGlua2VyIHNjcmlwdCBtYXkgaGF2ZSB0byBkbyBzb21lIG90aGVyIG9wZXJhdGlvbnMuCi0KLUZvciBleGFtcGxlLCBvbiBtb3N0IE1JUFMgcGxhdGZvcm1zLCB0aGUgbGlua2VyIGlzIHJlc3BvbnNpYmxlIGZvcgotZGVmaW5pbmcgdGhlIHNwZWNpYWwgc3ltYm9sIEBjb2Rle19ncH0sIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUKLUBjb2RleyRncH0gcmVnaXN0ZXIuICBJdCBtdXN0IGJlIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIHNtYWxsIGRhdGEKLXNlY3Rpb24gcGx1cyBAY29kZXsweDgwMDB9LiAgTmF0dXJhbGx5LCBpdCBzaG91bGQgb25seSBiZSBkZWZpbmVkIHdoZW4KLWRvaW5nIGEgZmluYWwgcmVsb2NhdGlvbi4gIFRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgZG9uZSBsaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi0gICRAe1JFTE9DQVRJTkcrIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgbGluZSB3b3VsZCBhcHBlYXIganVzdCBiZWZvcmUgdGhlIHNlY3Rpb25zIHdoaWNoIGNvbXBvc2UgdGhlIHNtYWxsCi1kYXRhIHNlY3Rpb24gKEBzYW1wey5zZGF0YX0sIEBzYW1wey5zYnNzfSkuICBBbGwgdGhvc2Ugc2VjdGlvbnMgd291bGQgYmUKLWNvbnRpZ3VvdXMgaW4gbWVtb3J5LgotCi1NYW55IENPRkYgc3lzdGVtcyBidWlsZCBjb25zdHJ1Y3RvciB0YWJsZXMgaW4gdGhlIGxpbmtlciBzY3JpcHQuICBUaGUKLWNvbXBpbGVyIHdpbGwgYXJyYW5nZSB0byBvdXRwdXQgdGhlIGFkZHJlc3Mgb2YgZWFjaCBnbG9iYWwgY29uc3RydWN0b3IKLWluIGEgQHNhbXB7LmN0b3J9IHNlY3Rpb24sIGFuZCB0aGUgYWRkcmVzcyBvZiBlYWNoIGdsb2JhbCBkZXN0cnVjdG9yIGluCi1hIEBzYW1wey5kdG9yfSBzZWN0aW9uICh0aGlzIGlzIGRvbmUgYnkgZGVmaW5pbmcKLUBjb2Rle0FTTV9PVVRQVVRfQ09OU1RSVUNUT1J9IGFuZCBAY29kZXtBU01fT1VUUFVUX0RFU1RSVUNUT1J9IGluIHRoZQotQGNvZGV7Z2NjfSBjb25maWd1cmF0aW9uIGZpbGVzKS4gIFRoZSBAY29kZXtnY2N9IHJ1bnRpbWUgc3VwcG9ydAotcm91dGluZXMgZXhwZWN0IHRoZSBjb25zdHJ1Y3RvciB0YWJsZSB0byBiZSBuYW1lZCBAY29kZXtfX0NUT1JfTElTVF9ffS4KLVRoZXkgZXhwZWN0IGl0IHRvIGJlIGEgbGlzdCBvZiB3b3Jkcywgd2l0aCB0aGUgZmlyc3Qgd29yZCBiZWluZyB0aGUKLWNvdW50IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcy4gIFRoZXJlIHNob3VsZCBiZSBhIHRyYWlsaW5nIHplcm8gd29yZC4KLShBY3R1YWxseSwgdGhlIGNvdW50IG1heSBiZSAtMSBpZiB0aGUgdHJhaWxpbmcgd29yZCBpcyBwcmVzZW50LCBhbmQgdGhlCi10cmFpbGluZyB3b3JkIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb3VudCBpcyBjb3JyZWN0LCBidXQsIGFzIHRoZQotQGNvZGV7Z2NjfSBiZWhhdmlvdXIgaGFzIGNoYW5nZWQgc2xpZ2h0bHkgb3ZlciB0aGUgeWVhcnMsIGl0IGlzIHNhZmVzdAotdG8gcHJvdmlkZSBib3RoKS4gIEhlcmUgaXMgYSB0eXBpY2FsIHdheSB0aGF0IG1pZ2h0IGJlIGhhbmRsZWQgaW4gYQotQGZpbGV7c2NyaXB0dGVtcGx9IGZpbGUuCi1Ac21hbGxleGFtcGxlCi0gICAgJEB7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjtAfQotICAgICRAe0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMilAfQotICAgICRAe0NPTlNUUlVDVElORysgKiguY3RvcnMpQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoMClAfQotICAgICRAe0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjtAfQotICAgICRAe0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47QH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBMT05HKDApQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47QH0KLUBlbmQgc21hbGxleGFtcGxlCi1UaGUgdXNlIG9mIEBjb2Rle0NPTlNUUlVDVElOR30gZW5zdXJlcyB0aGF0IHRoZXNlIGxpbmtlciBzY3JpcHQgY29tbWFuZHMKLXdpbGwgb25seSBhcHBlYXIgd2hlbiB0aGUgbGlua2VyIGlzIHN1cHBvc2VkIHRvIGJlIGJ1aWxkaW5nIHRoZQotY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzLiAgVGhpcyBleGFtcGxlIGlzIHdyaXR0ZW4gZm9yIGEgdGFyZ2V0Ci13aGljaCB1c2VzIDQgYnl0ZSBwb2ludGVycy4KLQotRW1iZWRkZWQgc3lzdGVtcyBvZnRlbiBuZWVkIHRvIHNldCBhIHN0YWNrIGFkZHJlc3MuICBUaGlzIGlzIG5vcm1hbGx5Ci1iZXN0IGRvbmUgYnkgdXNpbmcgdGhlIEBjb2Rle1BST1ZJREV9IGNvbnN0cnVjdCB3aXRoIGEgZGVmYXVsdCBzdGFjawotYWRkcmVzcy4gIFRoaXMgcGVybWl0cyB0aGUgdXNlciB0byBlYXNpbHkgb3ZlcnJpZGUgdGhlIHN0YWNrIGFkZHJlc3MKLXVzaW5nIHRoZSBAY29kZXstLWRlZnN5bX0gb3B0aW9uLiAgSGVyZSBpcyBhbiBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotICAkQHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX3N0YWNrID0gMHg4MDAwMDAwMCk7QH0KLUBlbmQgc21hbGxleGFtcGxlCi1UaGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBAY29kZXtfX3N0YWNrfSB3b3VsZCB0aGVuIGJlIHVzZWQgaW4gdGhlIHN0YXJ0dXAKLWNvZGUgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhY2sgcG9pbnRlci4KLQotQG5vZGUgbGlua2VyIGVtdWxhdGlvbnMKLUBzZWN0aW9uIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cwotCi1FYWNoIGxpbmtlciB0YXJnZXQgdXNlcyBhbiBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCB0byBnZW5lcmF0ZSB0aGUKLWVtdWxhdGlvbiBjb2RlLiAgVGhlIG5hbWUgb2YgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGlzIHNldCBieSB0aGUKLUBjb2Rle1RFTVBMQVRFX05BTUV9IHZhcmlhYmxlIGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQuICBJZiB0aGUKLUBjb2Rle1RFTVBMQVRFX05BTUV9IHZhcmlhYmxlIGlzIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGlzCi1Ac2FtcHtnZW5lcmljfS4gIElmIHRoZSB2YWx1ZSBvZiBAY29kZXtURU1QTEFURV9OQU1FfSBpcyBAdmFye3RlbXBsYXRlfSwKLUBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgdXNlIEBmaWxle2VtdWx0ZW1wbC9AdmFye3RlbXBsYXRlfS5lbX0uCi0KLU1vc3QgdGFyZ2V0cyB1c2UgdGhlIGdlbmVyaWMgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQsCi1AZmlsZXtlbXVsdGVtcGwvZ2VuZXJpYy5lbX0uICBBIGRpZmZlcmVudCBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBpcwotb25seSBuZWVkZWQgaWYgdGhlIGxpbmtlciBtdXN0IHN1cHBvcnQgdW51c3VhbCBhY3Rpb25zLCBzdWNoIGFzIGxpbmtpbmcKLWFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4KLQotVGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGlzIG5vcm1hbGx5IHdyaXR0ZW4gYXMgYSBzaW1wbGUgaW52b2NhdGlvbgotb2YgQGNvZGV7Y2F0fSB3aXRoIGEgaGVyZSBkb2N1bWVudC4gIFRoZSBkb2N1bWVudCB3aWxsIHVzZSBhIGZldwotdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4gIFR5cGljYWxseSBlYWNoIGZ1bmN0aW9uIG5hbWVzIHVzZXMgYQotc3Vic3RpdHV0aW9uIGludm9sdmluZyBAY29kZXtFTVVMQVRJT05fTkFNRX0sIGZvciBlYXNlIG9mIGRlYnVnZ2luZyB3aGVuCi10aGUgbGlua2VyIHN1cHBvcnRzIG11bHRpcGxlIGVtdWxhdGlvbnMuCi0KLUV2ZXJ5IGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBpbiB0aGUgZW1pdHRlZCBmaWxlIHNob3VsZCBiZSBzdGF0aWMuICBUaGUKLW9ubHkgZ2xvYmFsbHkgdmlzaWJsZSBvYmplY3QgbXVzdCBiZSBuYW1lZAotQGNvZGV7bGRfQHZhcntFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9ufSwgd2hlcmUgQHZhcntFTVVMQVRJT05fTkFNRX0gaXMKLXRoZSBuYW1lIG9mIHRoZSBlbXVsYXRpb24gc2V0IGluIEBmaWxle2NvbmZpZ3VyZS50Z3R9ICh0aGlzIGlzIGFsc28gdGhlCi1uYW1lIG9mIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBmaWxlIHdpdGhvdXQgdGhlIEBmaWxley5zaH0gZXh0ZW5zaW9uKS4KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlCi1AY29kZXtFTVVMQVRJT05fTkFNRX0gYmVmb3JlIGludm9raW5nIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdC4KLQotVGhlIEBjb2Rle2xkX0B2YXJ7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbn0gdmFyaWFibGUgbXVzdCBiZSBhCi1AY29kZXtzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0fSwgYXMgZGVmaW5lZCBpbiBAZmlsZXtsZGVtdWwuaH0uCi1JdCBkZWZpbmVzIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGFyZSBpbnZva2VkIGJ5IHRoZSBsaW5rZXIsCi1hcyB3ZWxsIGFzIHN0cmluZ3MgZm9yIHRoZSBlbXVsYXRpb24gbmFtZSAobm9ybWFsbHkgc2V0IGZyb20gdGhlIHNoZWxsCi12YXJpYWJsZSBAY29kZXtFTVVMQVRJT05fTkFNRX0gYW5kIHRoZSBkZWZhdWx0IEJGRCB0YXJnZXQgbmFtZSAobm9ybWFsbHkKLXNldCBmcm9tIHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtPVVRQVVRfRk9STUFUfSB3aGljaCBpcyBub3JtYWxseSBzZXQKLWJ5IHRoZSBAZmlsZXtlbXVscGFyYW1zfSBmaWxlKS4KLQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBjb2Rle0NPTVBJTEVfSU59IHdoZW4gaXQgaW52b2tlcyB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgZm9yIHRoZQotZGVmYXVsdCBlbXVsYXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBzaG91bGQKLWluY2x1ZGUgdGhlIGxpbmtlciBzY3JpcHRzIGRpcmVjdGx5LCBhbmQgcmV0dXJuIHRoZW0gZnJvbSB0aGUKLUBjb2Rle2dldF9zY3JpcHRzfSBlbnRyeSBwb2ludC4gIFdoZW4gdGhlIGVtdWxhdGlvbiBpcyBub3QgdGhlIGRlZmF1bHQsCi10aGUgQGNvZGV7Z2V0X3NjcmlwdHN9IGVudHJ5IHBvaW50IHNob3VsZCBqdXN0IHJldHVybiBhIGZpbGUgbmFtZS4gIFNlZQotQGZpbGV7ZW11bHRlbXBsL2dlbmVyaWMuZW19IGZvciBhbiBleGFtcGxlIG9mIGhvdyB0aGlzIGlzIGRvbmUuCi0KLUF0IHNvbWUgcG9pbnQsIHRoZSBsaW5rZXIgZW11bGF0aW9uIGVudHJ5IHBvaW50cyBzaG91bGQgYmUgZG9jdW1lbnRlZC4KLQotQG5vZGUgRW11bGF0aW9uIFdhbGt0aHJvdWdoCi1AY2hhcHRlciBBIFdhbGt0aHJvdWdoIG9mIGEgVHlwaWNhbCBFbXVsYXRpb24KLQotVGhpcyBjaGFwdGVyIGlzIHRvIGhlbHAgcGVvcGxlIHdobyBhcmUgbmV3IHRvIHRoZSB3YXkgZW11bGF0aW9ucwotaW50ZXJhY3Qgd2l0aCB0aGUgbGlua2VyLCBvciB3aG8gYXJlIHN1ZGRlbmx5IHRocnVzdCBpbnRvIHRoZSBwb3NpdGlvbgotb2YgaGF2aW5nIHRvIHdvcmsgd2l0aCBleGlzdGluZyBlbXVsYXRpb25zLiAgSXQgd2lsbCBkaXNjdXNzIHRoZSBmaWxlcwoteW91IG5lZWQgdG8gYmUgYXdhcmUgb2YuICBJdCB3aWxsIHRlbGwgeW91IHdoZW4gdGhlIGdpdmVuICJob29rcyIgaW4KLXRoZSBlbXVsYXRpb24gd2lsbCBiZSBjYWxsZWQuICBJdCB3aWxsLCBob3BlZnVsbHksIGdpdmUgeW91IGVub3VnaAotaW5mb3JtYXRpb24gYWJvdXQgd2hlbiBhbmQgaG93IHRoaW5ncyBoYXBwZW4gdGhhdCB5b3UnbGwgYmUgYWJsZSB0bwotZ2V0IGJ5LiAgQXMgYWx3YXlzLCB0aGUgc291cmNlIGlzIHRoZSBkZWZpbml0aXZlIHJlZmVyZW5jZSB0byB0aGlzLgotCi1UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBsaW5rZXIgaXMgaW4gQGZpbGV7bGRtYWluLmN9IHdoZXJlCi1AY29kZXttYWlufSBpcyBkZWZpbmVkLiAgVGhlIGJ1bGsgb2YgdGhlIGNvZGUgdGhhdCdzIGVtdWxhdGlvbgotc3BlY2lmaWMgd2lsbCBpbml0aWFsbHkgYmUgaW4gQGNvZGV7ZW11bHRlbXBsL0B2YXJ7ZW11bGF0aW9ufS5lbX0gYnV0Ci13aWxsIGVuZCB1cCBpbiBAY29kZXtlQHZhcntlbXVsYXRpb259LmN9IHdoZW4gdGhlIGJ1aWxkIGlzIGRvbmUuCi1Nb3N0IG9mIHRoZSB3b3JrIHRvIHNlbGVjdCBhbmQgaW50ZXJmYWNlIHdpdGggZW11bGF0aW9ucyBpcyBpbgotQGNvZGV7bGRlbXVsLmh9IGFuZCBAY29kZXtsZGVtdWwuY30uICBTcGVjaWZpY2FsbHksIEBjb2Rle2xkZW11bC5ofQotZGVmaW5lcyB0aGUgQGNvZGV7bGRfZW11bGF0aW9uX3hmZXJfc3RydWN0fSBzdHJ1Y3R1cmUgeW91ciBlbXVsYXRpb24KLWV4cG9ydHMuCi0KLVlvdXIgZW11bGF0aW9uIGZpbGUgZXhwb3J0cyBhIHN5bWJvbAotQGNvZGV7bGRfQHZhcntFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9ufS4gIElmIHlvdXIgZW11bGF0aW9uIGlzCi1zZWxlY3RlZCAoaXQgdXN1YWxseSBpcywgc2luY2UgdXN1YWxseSB0aGVyZSdzIG9ubHkgb25lKSwKLUBjb2Rle2xkZW11bC5jfSBzZXRzIHRoZSB2YXJpYWJsZSBAdmFye2xkX2VtdWxhdGlvbn0gdG8gcG9pbnQgdG8gaXQuCi1AY29kZXtsZGVtdWwuY30gYWxzbyBkZWZpbmVzIGEgbnVtYmVyIG9mIEFQSSBmdW5jdGlvbnMgdGhhdCBpbnRlcmZhY2UKLXRvIHlvdXIgZW11bGF0aW9uLCBsaWtlIEBjb2Rle2xkZW11bF9hZnRlcl9wYXJzZX0gd2hpY2ggc2ltcGx5IGNhbGxzCi15b3VyIEBjb2Rle2xkX0B2YXJ7RU1VTEFUSU9OfV9lbXVsYXRpb24uYWZ0ZXJfcGFyc2V9IGZ1bmN0aW9uLiAgRm9yCi10aGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24sIHRoZSBmdW5jdGlvbnMgd2lsbCBiZSBtZW50aW9uZWQsIGJ1dCB5b3UKLXNob3VsZCBhc3N1bWUgdGhlIGluZGlyZWN0IHJlZmVyZW5jZSB0byB5b3VyIGVtdWxhdGlvbiBhbHNvLgotCi1XZSB3aWxsIGFsc28gc2tpcCBvciBnbG9zcyBvdmVyIHBhcnRzIG9mIHRoZSBsaW5rIHByb2Nlc3MgdGhhdCBkb24ndAotcmVsYXRlIHRvIGVtdWxhdGlvbnMsIGxpa2Ugc2V0dGluZyB1cCBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLQotQWZ0ZXIgaW5pdGlhbGl6YXRpb24sIEBjb2Rle21haW59IHNlbGVjdHMgYW4gZW11bGF0aW9uIGJ5IHByZS1zY2FubmluZwotdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBJdCBjYWxscyBAY29kZXtsZGVtdWxfY2hvb3NlX3RhcmdldH0gdG8KLWNob29zZSBhIHRhcmdldC4gIElmIHlvdSBzZXQgQGNvZGV7Y2hvb3NlX3RhcmdldH0gdG8KLUBjb2Rle2xkZW11bF9kZWZhdWx0X3RhcmdldH0sIGl0IHBpY2tzIHlvdXIgQGNvZGV7dGFyZ2V0X25hbWV9IGJ5Ci1kZWZhdWx0LgotCi1AY29kZXttYWlufSBjYWxscyBAY29kZXtsZGVtdWxfYmVmb3JlX3BhcnNlfSwgdGhlbiBAY29kZXtwYXJzZV9hcmdzfS4KLUBjb2Rle3BhcnNlX2FyZ3N9IGNhbGxzIEBjb2Rle2xkZW11bF9wYXJzZV9hcmdzfSBmb3IgZWFjaCBhcmcsIHdoaWNoCi1tdXN0IHVwZGF0ZSB0aGUgQGNvZGV7Z2V0b3B0fSBnbG9iYWxzIGlmIGl0IHJlY29nbml6ZXMgdGhlIGFyZ3VtZW50LgotSWYgdGhlIGVtdWxhdGlvbiBkb2Vzbid0IHJlY29nbml6ZSBpdCwgdGhlbiBwYXJzZV9hcmdzIGNoZWNrcyB0byBzZWUKLWlmIGl0IHJlY29nbml6ZXMgaXQuCi0KLU5vdyB0aGF0IHRoZSBlbXVsYXRpb24gaGFzIGhhZCBhY2Nlc3MgdG8gYWxsIGl0cyBjb21tYW5kLWxpbmUgb3B0aW9ucywKLUBjb2Rle21haW59IGNhbGxzIEBjb2Rle2xkZW11bF9zZXRfc3ltYm9sc30uICBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbnkKLWluaXRpYWxpemF0aW9uIHRoYXQgbWF5IGJlIGFmZmVjdGVkIGJ5IG9wdGlvbnMuICBJdCBpcyBhbHNvIHN1cHBvc2VkCi10byBzZXQgdXAgYW55IHZhcmlhYmxlcyBuZWVkZWQgYnkgdGhlIGVtdWxhdGlvbiBzY3JpcHQuCi0KLUBjb2Rle21haW59IG5vdyBjYWxscyBAY29kZXtsZGVtdWxfZ2V0X3NjcmlwdH0gdG8gZ2V0IHRoZSBlbXVsYXRpb24KLXNjcmlwdCB0byB1c2UgKGJhc2VkIG9uIGFyZ3VtZW50cywgbm8gZG91YnQsIEBweHJlZntFbXVsYXRpb25zfSkgYW5kCi1ydW5zIGl0LiAgV2hpbGUgcGFyc2luZywgQGNvZGV7bGRncmFtLnl9IG1heSBjYWxsIEBjb2Rle2xkZW11bF9obGx9IG9yCi1AY29kZXtsZGVtdWxfc3lzbGlifSB0byBoYW5kbGUgdGhlIEBjb2Rle0hMTH0gb3IgQGNvZGV7U1lTTElCfQotY29tbWFuZHMuICBJdCBtYXkgY2FsbCBAY29kZXtsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGV9IGlmIHlvdSBhc2tlZAotdGhlIGxpbmtlciB0byBsaW5rIGEgZmlsZSBpdCBkb2Vzbid0IHJlY29nbml6ZS4gIEl0IHdpbGwgY2FsbAotQGNvZGV7bGRlbXVsX3JlY29nbml6ZWRfZmlsZX0gZm9yIGVhY2ggZmlsZSBpdCBkb2VzIHJlY29nbml6ZSwgaW4gY2FzZQotdGhlIGVtdWxhdGlvbiB3YW50cyB0byBoYW5kbGUgc29tZSBmaWxlcyBzcGVjaWFsbHkuICBBbGwgdGhlIHdoaWxlLAotaXQncyBsb2FkaW5nIHRoZSBmaWxlcyAocG9zc2libHkgY2FsbGluZwotQGNvZGV7bGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlfSkgYW5kIHN5bWJvbHMgYW5kIHN0dWZmLiAgQWZ0ZXIgaXQncwotZG9uZSByZWFkaW5nIHRoZSBzY3JpcHQsIEBjb2Rle21haW59IGNhbGxzIEBjb2Rle2xkZW11bF9hZnRlcl9wYXJzZX0uCi1Vc2UgdGhlIGFmdGVyLXBhcnNlIGhvb2sgdG8gc2V0IHVwIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBzdHVmZiB0aGUKLXNjcmlwdCBtaWdodCBoYXZlIHNldCB1cCwgbGlrZSB0aGUgZW50cnkgcG9pbnQuCi0KLUBjb2Rle21haW59IG5leHQgY2FsbHMgQGNvZGV7bGFuZ19wcm9jZXNzfSBpbiBAY29kZXtsZGxhbmcuY30uICBUaGlzCi1hcHBlYXJzIHRvIGJlIHRoZSBtYWluIGNvcmUgb2YgdGhlIGxpbmtpbmcgaXRzZWxmLCBhcyBmYXIgYXMgZW11bGF0aW9uCi1ob29rcyBhcmUgY29uY2VybmVkKCopLiAgSXQgZmlyc3Qgb3BlbnMgdGhlIG91dHB1dCBmaWxlJ3MgQkZELCBjYWxsaW5nCi1AY29kZXtsZGVtdWxfc2V0X291dHB1dF9hcmNofSwgYW5kIGNhbGxzCi1AY29kZXtsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHN9IGluIGNhc2UgeW91IG5lZWQgdG8gdXNlCi1vdGhlciBtZWFucyB0byBmaW5kIG9yIGNyZWF0ZSBvYmplY3QgZmlsZXMgKGkuZS4gc2hhcmVkIGxpYnJhcmllcwotZm91bmQgb24gYSBwYXRoLCBvciBmYWtlIHN0dWIgb2JqZWN0cykuICBEZXNwaXRlIHRoZSBuYW1lLCBub2JvZHkKLWNyZWF0ZXMgb3V0cHV0IHNlY3Rpb25zIGhlcmUuCi0KLSgqKSBJbiBtb3N0IGNhc2VzLCB0aGUgQkZEIGxpYnJhcnkgZG9lcyB0aGUgYnVsayBvZiB0aGUgYWN0dWFsCi1saW5raW5nLCBoYW5kbGluZyBzeW1ib2wgdGFibGVzLCBzeW1ib2wgcmVzb2x1dGlvbiwgcmVsb2NhdGlvbnMsIGFuZAotYnVpbGRpbmcgdGhlIGZpbmFsIG91dHB1dCBmaWxlLiAgU2VlIHRoZSBCRkQgcmVmZXJlbmNlIGZvciBhbGwgdGhlCi1kZXRhaWxzLiAgWW91ciBlbXVsYXRpb24gaXMgdXN1YWxseSBjb25jZXJuZWQgbW9yZSB3aXRoIG1hbmFnaW5nCi10aGluZ3MgYXQgdGhlIGZpbGUgYW5kIHNlY3Rpb24gbGV2ZWwsIGxpa2UgInB1dCB0aGlzIGhlcmUsIGFkZCB0aGlzCi1zZWN0aW9uIiwgZXRjLgotCi1OZXh0LCB0aGUgb2JqZWN0cyB0byBiZSBsaW5rZWQgYXJlIG9wZW5lZCBhbmQgQkZEcyBjcmVhdGVkIGZvciB0aGVtLAotYW5kIEBjb2Rle2xkZW11bF9hZnRlcl9vcGVufSBpcyBjYWxsZWQuICBBdCB0aGlzIHBvaW50LCB5b3UgaGF2ZSBhbGwKLXRoZSBvYmplY3RzIGFuZCBzeW1ib2xzIGxvYWRlZCwgYnV0IG5vbmUgb2YgdGhlIGRhdGEgaGFzIGJlZW4gcGxhY2VkCi15ZXQuCi0KLU5leHQgY29tZXMgdGhlIEJpZyBMaW5raW5nIFRoaW5neSAoZXhjZXB0IGZvciB0aGUgcGFydHMgQkZEIGRvZXMpLgotQWxsIGlucHV0IHNlY3Rpb25zIGFyZSBtYXBwZWQgdG8gb3V0cHV0IHNlY3Rpb25zIGFjY29yZGluZyB0byB0aGUKLXNjcmlwdC4gIElmIGEgc2VjdGlvbiBkb2Vzbid0IGdldCBtYXBwZWQgYnkgZGVmYXVsdCwKLUBjb2Rle2xkZW11bF9wbGFjZV9vcnBoYW59IHdpbGwgZ2V0IGNhbGxlZCB0byBmaWd1cmUgb3V0IHdoZXJlIGl0IGdvZXMuCi1OZXh0IGl0IGZpZ3VyZXMgb3V0IHRoZSBvZmZzZXRzIGZvciBlYWNoIHNlY3Rpb24sIGNhbGxpbmcKLUBjb2Rle2xkZW11bF9iZWZvcmVfYWxsb2NhdGlvbn0gYmVmb3JlIGFuZAotQGNvZGV7bGRlbXVsX2FmdGVyX2FsbG9jYXRpb259IGFmdGVyIGRlY2lkaW5nIHdoZXJlIGVhY2ggaW5wdXQgc2VjdGlvbgotZW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb25zLgotCi1UaGUgbGFzdCBwYXJ0IG9mIEBjb2Rle2xhbmdfcHJvY2Vzc30gaXMgdG8gZmlndXJlIG91dCBhbGwgdGhlIHN5bWJvbHMnCi12YWx1ZXMuICBBZnRlciBhc3NpZ25pbmcgZmluYWwgdmFsdWVzIHRvIHRoZSBzeW1ib2xzLAotQGNvZGV7bGRlbXVsX2ZpbmlzaH0gaXMgY2FsbGVkLCBhbmQgYWZ0ZXIgdGhhdCwgYW55IHVuZGVmaW5lZCBzeW1ib2xzCi1hcmUgdHVybmVkIGludG8gZmF0YWwgZXJyb3JzLgotCi1PSywgYmFjayB0byBAY29kZXttYWlufSwgd2hpY2ggY2FsbHMgQGNvZGV7bGR3cml0ZX0gaW4KLUBmaWxle2xkd3JpdGUuY30uICBAY29kZXtsZHdyaXRlfSBjYWxscyBCRkQncyBmaW5hbF9saW5rLCB3aGljaCBkb2VzCi1hbGwgdGhlIHJlbG9jYXRpb24gZml4dXBzIGFuZCB3cml0ZXMgdGhlIG91dHB1dCBiZmQgdG8gZGlzaywgYW5kIHdlJ3JlCi1kb25lLgotCi1JbiBzdW1tYXJ5LAotCi1AaXRlbWl6ZSBAYnVsbGV0Ci0KLUBpdGVtIEBjb2Rle21haW4oKX0gaW4gQGZpbGV7bGRtYWluLmN9Ci1AaXRlbSBAZmlsZXtlbXVsdGVtcGwvQHZhcntFTVVMQVRJT059LmVtfSBoYXMgeW91ciBjb2RlCi1AaXRlbSBAY29kZXtsZGVtdWxfY2hvb3NlX3RhcmdldH0gKGRlZmF1bHRzIHRvIHlvdXIgQGNvZGV7dGFyZ2V0X25hbWV9KQotQGl0ZW0gQGNvZGV7bGRlbXVsX2JlZm9yZV9wYXJzZX0KLUBpdGVtIFBhcnNlIGFyZ3YsIGNhbGxzIEBjb2Rle2xkZW11bF9wYXJzZV9hcmdzfSBmb3IgZWFjaAotQGl0ZW0gQGNvZGV7bGRlbXVsX3NldF9zeW1ib2xzfQotQGl0ZW0gQGNvZGV7bGRlbXVsX2dldF9zY3JpcHR9Ci1AaXRlbSBwYXJzZSBzY3JpcHQKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX2hsbH0gb3IgQGNvZGV7bGRlbXVsX3N5c2xpYn0KLUBpdGVtIG1heSBjYWxsIEBjb2Rle2xkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZX0KLUBlbmQgaXRlbWl6ZQotCi1AaXRlbSBAY29kZXtsZGVtdWxfYWZ0ZXJfcGFyc2V9Ci1AaXRlbSBAY29kZXtsYW5nX3Byb2Nlc3MoKX0gaW4gQGZpbGV7bGRsYW5nLmN9Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtIGNyZWF0ZSBAY29kZXtvdXRwdXRfYmZkfQotQGl0ZW0gQGNvZGV7bGRlbXVsX3NldF9vdXRwdXRfYXJjaH0KLUBpdGVtIEBjb2Rle2xkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50c30KLUBpdGVtIHJlYWQgb2JqZWN0cywgY3JlYXRlIGlucHV0IGJmZHMgLSBhbGwgc3ltYm9scyBleGlzdCwgYnV0IGhhdmUgbm8gdmFsdWVzCi1AaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGV9Ci1AaXRlbSB3aWxsIGNhbGwgQGNvZGV7bGRlbXVsX3JlY29nbml6ZWRfZmlsZX0KLUBpdGVtIEBjb2Rle2xkZW11bF9hZnRlcl9vcGVufQotQGl0ZW0gbWFwIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucwotQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX3BsYWNlX29ycGhhbn0gZm9yIHJlbWFpbmluZyBzZWN0aW9ucwotQGl0ZW0gQGNvZGV7bGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9ufQotQGl0ZW0gZ2l2ZXMgaW5wdXQgc2VjdGlvbnMgb2Zmc2V0cyBpbnRvIG91dHB1dCBzZWN0aW9ucywgcGxhY2VzIG91dHB1dCBzZWN0aW9ucwotQGl0ZW0gQGNvZGV7bGRlbXVsX2FmdGVyX2FsbG9jYXRpb259IC0gc2VjdGlvbiBhZGRyZXNzZXMgdmFsaWQKLUBpdGVtIGFzc2lnbnMgdmFsdWVzIHRvIHN5bWJvbHMKLUBpdGVtIEBjb2Rle2xkZW11bF9maW5pc2h9IC0gc3ltYm9sIHZhbHVlcyB2YWxpZAotQGVuZCBpdGVtaXplCi0KLUBpdGVtIG91dHB1dCBiZmQgaXMgd3JpdHRlbiB0byBkaXNrCi0KLUBlbmQgaXRlbWl6ZQotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2xkL2xkbGFuZy5jIGIvbGQvbGRsYW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MGZmMDcuLjAwMDAwMDAKLS0tIGEvbGQvbGRsYW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDM0ICswLDAgQEAKLS8qIExpbmtlciBjb21tYW5kIGxhbmd1YWdlIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAiZm5tYXRjaC5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBGT1JXQVJEUyAqLwotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKm5ld19zdGF0ZW1lbnQgUEFSQU1TICgoZW51bSBzdGF0ZW1lbnRfZW51bSwKLQkJCQkJCQkgc2l6ZV90LAotCQkJCQkJCSBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUqKSk7Ci0KLQotLyogTE9DQUxTICovCi1zdGF0aWMgc3RydWN0IG9ic3RhY2sgc3RhdF9vYnN0YWNrOwotCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfYWxsb2MgeG1hbGxvYwotI2RlZmluZSBvYnN0YWNrX2NodW5rX2ZyZWUgZnJlZQotc3RhdGljIENPTlNUIGNoYXIgKnN0YXJ0dXBfZmlsZTsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgaW5wdXRfZmlsZV9jaGFpbjsKLXN0YXRpYyBib29sZWFuIHBsYWNlZF9jb21tb25zID0gZmFsc2U7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqZGVmYXVsdF9jb21tb25fc2VjdGlvbjsKLXN0YXRpYyBib29sZWFuIG1hcF9vcHRpb25fZjsKLXN0YXRpYyBiZmRfdm1hIHByaW50X2RvdDsKLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaXJzdF9maWxlOwotc3RhdGljIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLXN0YXRpYyBDT05TVCBjaGFyICpjdXJyZW50X3RhcmdldDsKLXN0YXRpYyBDT05TVCBjaGFyICpvdXRwdXRfdGFyZ2V0Owotc3RhdGljIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBzdGF0ZW1lbnRfbGlzdDsKLXN0YXRpYyBzdHJ1Y3QgbGFuZ19waGRyICpsYW5nX3BoZHJfbGlzdDsKLQotc3RhdGljIHZvaWQgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyCi0gIFBBUkFNUyAoKHZvaWQgKCpmdW5jKSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSwKLQkgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzKSk7Ci1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbmV3X2FmaWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgZmlsZV90eXBlLAotCSAgIGNvbnN0IGNoYXIgKnRhcmdldCwgYm9vbGVhbiBhZGRfdG9fbGlzdCkpOwotc3RhdGljIHZvaWQgaW5pdF9vcyBQQVJBTVMgKChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzKSk7Ci1zdGF0aWMgdm9pZCBleHBfaW5pdF9vcyBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyB2b2lkIHNlY3Rpb25fYWxyZWFkeV9saW5rZWQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYWxyZWFkeV9saW5rZWRfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci1zdGF0aWMgdm9pZCBhbHJlYWR5X2xpbmtlZF90YWJsZV9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGFscmVhZHlfbGlua2VkX3RhYmxlX2ZyZWUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gd2lsZGNhcmRwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKndpbGRfc29ydAotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLAotCSAgIGFzZWN0aW9uICopKTsKLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpsb29rdXBfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1zdGF0aWMgdm9pZCBsb2FkX3N5bWJvbHMgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnksCi0JCQkJICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKikpOwotc3RhdGljIHZvaWQgd2lsZCBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnMsCi0JCQkgIGNvbnN0IGNoYXIgKnNlY3Rpb24sIGNvbnN0IGNoYXIgKmZpbGUsCi0JCQkgIGNvbnN0IGNoYXIgKnRhcmdldCwKLQkJCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0KSk7Ci1zdGF0aWMgYmZkICpvcGVuX291dHB1dCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1zdGF0aWMgdm9pZCBsZGxhbmdfb3Blbl9vdXRwdXQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhdGVtZW50KSk7Ci1zdGF0aWMgdm9pZCBvcGVuX2lucHV0X2JmZHMKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhdGVtZW50LCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3JlYXNvbmFibGVfZGVmYXVsdHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19wbGFjZV91bmRlZmluZWRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcywKLQkgICBjb25zdCBjaGFyICp0YXJnZXQsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgUEFSQU1TICgobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqYXNzaWdubWVudCwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbikpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5wdXRfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnN0YXRtKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcmludF9vbmVfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5wdXRfc2VjdGlvbiBQQVJBTVMgKChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqaW4pKTsKLXN0YXRpYyB2b2lkIHByaW50X2ZpbGxfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfZmlsbF9zdGF0ZW1lbnRfdHlwZSAqZmlsbCkpOwotc3RhdGljIHZvaWQgcHJpbnRfZGF0YV9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19kYXRhX3N0YXRlbWVudF90eXBlICpkYXRhKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9hZGRyZXNzX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgcHJpbnRfcmVsb2Nfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnJlbG9jKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9wYWRkaW5nX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUgKnMpKTsKLXN0YXRpYyB2b2lkIHByaW50X3dpbGRfc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqdywKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcykpOwotc3RhdGljIHZvaWQgcHJpbnRfZ3JvdXAKLSAgUEFSQU1TICgobGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSAqLCBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAotCQkJCSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MpKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YXRlbWVudF9saXN0IFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMsCi0JCQkJCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MpKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YXRlbWVudHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJmZF92bWEgaW5zZXJ0X3BhZCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqdGhpc19wdHIsCi0JCQkJICAgZmlsbF90eXBlIGZpbGwsIHVuc2lnbmVkIGludCBwb3dlciwKLQkJCQkgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgIGJmZF92bWEgZG90KSk7Ci1zdGF0aWMgYmZkX3ZtYSBzaXplX2lucHV0X3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnRoaXNfcHRyLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkgICBmaWxsX3R5cGUgZmlsbCwgYmZkX3ZtYSBkb3QsIGJvb2xlYW4gcmVsYXgpKTsKLXN0YXRpYyB2b2lkIGxhbmdfZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGlnbm9yZV9iZmRfZXJyb3JzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2NoZWNrIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfY29tbW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGxhbmdfb25lX2NvbW1vbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGxhbmdfcGxhY2Vfb3JwaGFucyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHRvcG93ZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3NldF9zdGFydG9mIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHJlc2V0X21lbW9yeV9yZWdpb25zIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfcmVjb3JkX3BoZHJzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfZ2Nfd2lsZAotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGxhbmdfZ2Nfc2VjdGlvbnNfMSBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGxhbmdfZ2Nfc2VjdGlvbnMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzIFBBUkFNUyAoKHZvaWQpKTsKLQotdHlwZWRlZiB2b2lkICgqY2FsbGJhY2tfdCkgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosCi0JCQkJICAgIGFzZWN0aW9uICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwKLQkJCQkgICAgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCB3YWxrX3dpbGRfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKiwgY29uc3QgY2hhciAqLAotCSAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgY2FsbGJhY2tfdCwgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCB3YWxrX3dpbGRfZmlsZQotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKiwgY29uc3QgY2hhciAqLAotCSAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgY2FsbGJhY2tfdCwgdm9pZCAqKSk7Ci0KLXN0YXRpYyBpbnQgICAgZ2V0X3RhcmdldCBQQVJBTVMgKChjb25zdCBiZmRfdGFyZ2V0ICosIHZvaWQgKikpOwotc3RhdGljIHZvaWQgICBzdHJpY3B5IFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCAgIHN0cmN1dCBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOwotc3RhdGljIGludCAgICBuYW1lX2NvbXBhcmUgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyBpbnQgICAgY2xvc2VzdF90YXJnZXRfbWF0Y2ggUEFSQU1TICgoY29uc3QgYmZkX3RhcmdldCAqLCB2b2lkICopKTsKLXN0YXRpYyBjaGFyICogZ2V0X2ZpcnN0X2lucHV0X3RhcmdldCBQQVJBTVMgKCh2b2lkKSk7Ci0JCQkJCQotLyogRVhQT1JUUyAqLwotbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqYWJzX291dHB1dF9zZWN0aW9uOwotbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzdGF0X3B0ciA9ICZzdGF0ZW1lbnRfbGlzdDsKLWxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBmaWxlX2NoYWluID0geyBOVUxMLCBOVUxMIH07Ci1jb25zdCBjaGFyICplbnRyeV9zeW1ib2wgPSBOVUxMOwotYm9vbGVhbiBlbnRyeV9mcm9tX2NtZGxpbmU7Ci1ib29sZWFuIGxhbmdfaGFzX2lucHV0X2ZpbGUgPSBmYWxzZTsKLWJvb2xlYW4gaGFkX291dHB1dF9maWxlbmFtZSA9IGZhbHNlOwotYm9vbGVhbiBsYW5nX2Zsb2F0X2ZsYWcgPSBmYWxzZTsKLWJvb2xlYW4gZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmUgPSBmYWxzZTsKLXN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpub2Nyb3NzcmVmX2xpc3Q7Ci0KLWV0cmVlX3R5cGUgKmJhc2U7IC8qIFJlbG9jYXRpb24gYmFzZSAtIG9yIG51bGwgKi8KLQotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLSNkZWZpbmUgY2F0KGEsYikgYSMjYgotI2Vsc2UKLSNkZWZpbmUgY2F0KGEsYikgYS8qKi9iCi0jZW5kaWYKLQotI2RlZmluZSBuZXdfc3RhdCh4LHkpIChjYXQoeCxfdHlwZSkqKSBuZXdfc3RhdGVtZW50KGNhdCh4LF9lbnVtKSwgc2l6ZW9mKGNhdCh4LF90eXBlKSkseSkKLQotI2RlZmluZSBvdXRzaWRlX3NlY3Rpb25fYWRkcmVzcyhxKSAoIChxKS0+b3V0cHV0X29mZnNldCArIChxKS0+b3V0cHV0X3NlY3Rpb24tPnZtYSkKLQotI2RlZmluZSBvdXRzaWRlX3N5bWJvbF9hZGRyZXNzKHEpICgocSktPnZhbHVlICsgICBvdXRzaWRlX3NlY3Rpb25fYWRkcmVzcyhxLT5zZWN0aW9uKSkKLQotI2RlZmluZSBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCAoMTYpCi0KLVBUUgotc3RhdF9hbGxvYyAoc2l6ZSkKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2FsbG9jICgmc3RhdF9vYnN0YWNrLCBzaXplKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIEdlbmVyaWMgdHJhdmVyc2FsIHJvdXRpbmVzIGZvciBmaW5kaW5nIG1hdGNoaW5nIHNlY3Rpb25zLgotKi8KLQotc3RhdGljIHZvaWQKLXdhbGtfd2lsZF9zZWN0aW9uIChwdHIsIHNlY3Rpb24sIGZpbGUsIGNhbGxiYWNrLCBkYXRhKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnB0cjsKLSAgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgY2FsbGJhY2tfdCBjYWxsYmFjazsKLSAgICAgdm9pZCAqZGF0YTsKLXsKLSAgLyogRG9uJ3QgcHJvY2VzcyBzZWN0aW9ucyBmcm9tIGZpbGVzIHdoaWNoIHdlcmUgZXhjbHVkZWQuICovCi0gIGlmIChwdHItPmV4Y2x1ZGVfZmlsZW5hbWVfbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBuYW1lX2xpc3QgKmxpc3RfdG1wOwotICAgICAgZm9yIChsaXN0X3RtcCA9IHB0ci0+ZXhjbHVkZV9maWxlbmFtZV9saXN0OyBsaXN0X3RtcDsgbGlzdF90bXAgPSBsaXN0X3RtcC0+bmV4dCkKLSAgICAgICAgewotCSAgYm9vbGVhbiBtYXRjaDsKLQotCSAgaWYgKHdpbGRjYXJkcCAobGlzdF90bXAtPm5hbWUpKQotCSAgICBtYXRjaCA9IGZubWF0Y2ggKGxpc3RfdG1wLT5uYW1lLCBmaWxlLT5maWxlbmFtZSwgMCkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLQkgIGVsc2UKLQkgICAgbWF0Y2ggPSBzdHJjbXAgKGxpc3RfdG1wLT5uYW1lLCBmaWxlLT5maWxlbmFtZSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLQotCSAgaWYgKG1hdGNoKQotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZmlsZS0+anVzdF9zeW1zX2ZsYWcgPT0gZmFsc2UpCi0gICAgewotICAgICAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gICAgICBib29sZWFuIHdpbGRjYXJkOwotCi0gICAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCXdpbGRjYXJkID0gZmFsc2U7Ci0gICAgICBlbHNlCi0Jd2lsZGNhcmQgPSB3aWxkY2FyZHAgKHNlY3Rpb24pOwotCi0gICAgICBmb3IgKHMgPSBmaWxlLT50aGVfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBib29sZWFuIG1hdGNoOwotCi0JICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgICBtYXRjaCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChmaWxlLT50aGVfYmZkLCBzKTsKLQkgICAgICBpZiAod2lsZGNhcmQpCi0JCW1hdGNoID0gZm5tYXRjaCAoc2VjdGlvbiwgbmFtZSwgMCkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLQkgICAgICBlbHNlCi0JCW1hdGNoID0gc3RyY21wIChzZWN0aW9uLCBuYW1lKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChtYXRjaCkKLQkgICAgKCpjYWxsYmFjaykgKHB0ciwgcywgZmlsZSwgZGF0YSk7Ci0JfQotICAgIH0KLX0KLQotLyogSGFuZGxlIGEgd2lsZCBzdGF0ZW1lbnQgZm9yIGEgc2luZ2xlIGZpbGUgRi4gICovCi0KLXN0YXRpYyB2b2lkCi13YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqczsKLSAgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKLSAgICAgY2FsbGJhY2tfdCBjYWxsYmFjazsKLSAgICAgdm9pZCAqZGF0YTsKLXsKLSAgaWYgKGYtPnRoZV9iZmQgPT0gTlVMTAotICAgICAgfHwgISBiZmRfY2hlY2tfZm9ybWF0IChmLT50aGVfYmZkLCBiZmRfYXJjaGl2ZSkpCi0gICAgd2Fsa193aWxkX3NlY3Rpb24gKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZCAqbWVtYmVyOwotCi0gICAgICAvKiBUaGlzIGlzIGFuIGFyY2hpdmUgZmlsZS4gIFdlIG11c3QgbWFwIGVhY2ggbWVtYmVyIG9mIHRoZQotCSBhcmNoaXZlIHNlcGFyYXRlbHkuICAqLwotICAgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZi0+dGhlX2JmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICAgIHdoaWxlIChtZW1iZXIgIT0gTlVMTCkKLQl7Ci0JICAvKiBXaGVuIGxvb2t1cF9uYW1lIGlzIGNhbGxlZCwgaXQgd2lsbCBjYWxsIHRoZSBhZGRfc3ltYm9scwotCSAgICAgZW50cnkgcG9pbnQgZm9yIHRoZSBhcmNoaXZlLiAgRm9yIGVhY2ggZWxlbWVudCBvZiB0aGUKLQkgICAgIGFyY2hpdmUgd2hpY2ggaXMgaW5jbHVkZWQsIEJGRCB3aWxsIGNhbGwgbGRsYW5nX2FkZF9maWxlLAotCSAgICAgd2hpY2ggd2lsbCBzZXQgdGhlIHVzcmRhdGEgZmllbGQgb2YgdGhlIG1lbWJlciB0byB0aGUKLQkgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50LiAgKi8KLQkgIGlmIChtZW1iZXItPnVzcmRhdGEgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHdhbGtfd2lsZF9zZWN0aW9uIChzLCBzZWN0aW9uLAotCQkJCSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBtZW1iZXItPnVzcmRhdGEsCi0JCQkJIGNhbGxiYWNrLCBkYXRhKTsKLQkgICAgfQotCi0JICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmLT50aGVfYmZkLCBtZW1iZXIpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13YWxrX3dpbGQgKHMsIHNlY3Rpb24sIGZpbGUsIGNhbGxiYWNrLCBkYXRhKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIGNhbGxiYWNrX3QgY2FsbGJhY2s7Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgLyogUGVyZm9ybSB0aGUgaXRlcmF0aW9uIG92ZXIgYWxsIGZpbGVzIGluIHRoZSBsaXN0LiAgKi8KLSAgICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChmKQotCXsKLQkgIHdhbGtfd2lsZF9maWxlIChzLCBzZWN0aW9uLCBmLCBjYWxsYmFjaywgZGF0YSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAod2lsZGNhcmRwIChmaWxlKSkKLSAgICB7Ci0gICAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoZikKLQl7Ci0JICBpZiAoZm5tYXRjaCAoZmlsZSwgZi0+ZmlsZW5hbWUsIEZOTV9GSUxFX05BTUUpID09IDApCi0JICAgIHdhbGtfd2lsZF9maWxlIChzLCBzZWN0aW9uLCBmLCBjYWxsYmFjaywgZGF0YSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7Ci0KLSAgICAgIC8qIFBlcmZvcm0gdGhlIGl0ZXJhdGlvbiBvdmVyIGEgc2luZ2xlIGZpbGUuICAqLwotICAgICAgZiA9IGxvb2t1cF9uYW1lIChmaWxlKTsKLSAgICAgIHdhbGtfd2lsZF9maWxlIChzLCBzZWN0aW9uLCBmLCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgfQotfSAgCi0gICAgIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IHdhbGtzIHRoZSBwYXJzZSB0cmVlIGFuZCBjYWxscyB0aGUgcHJvdmlkZWQKLSAgZnVuY3Rpb24gZm9yIGVhY2ggbm9kZQotKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciAoZnVuYywgcykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBmdW5jIChzKTsKLQotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciAoZnVuYywgY29uc3RydWN0b3JfbGlzdC5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcgotCSAgICAoZnVuYywKLQkgICAgIHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyCi0JICAgIChmdW5jLAotCSAgICAgcy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIgKGZ1bmMsCi0JCQkJCSAgcy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgRkFJTCAoKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXZvaWQKLWxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChmdW5jKQotICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci17Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciAoZnVuYywKLQkJCQkgIHN0YXRlbWVudF9saXN0LmhlYWQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZAotbGFuZ19saXN0X2luaXQgKGxpc3QpCi0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqbGlzdDsKLXsKLSAgbGlzdC0+aGVhZCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gIGxpc3QtPnRhaWwgPSAmbGlzdC0+aGVhZDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgYnVpbGQgYSBuZXcgc3RhdGVtZW50IG5vZGUgZm9yIHRoZSBwYXJzZSB0cmVlCi0KLSAqLwotCi1zdGF0aWMKLWxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKgotbmV3X3N0YXRlbWVudCAodHlwZSwgc2l6ZSwgbGlzdCkKLSAgICAgZW51bSBzdGF0ZW1lbnRfZW51bSB0eXBlOwotICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICogbGlzdDsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbmV3ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikKLSAgc3RhdF9hbGxvYyAoc2l6ZSk7Ci0KLSAgbmV3LT5oZWFkZXIudHlwZSA9IHR5cGU7Ci0gIG5ldy0+aGVhZGVyLm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKGxpc3QsIG5ldywgJm5ldy0+aGVhZGVyLm5leHQpOwotICByZXR1cm4gbmV3OwotfQotCi0vKgotICBCdWlsZCBhIG5ldyBpbnB1dCBmaWxlIG5vZGUgZm9yIHRoZSBsYW5ndWFnZS4gVGhlcmUgYXJlIHNldmVyYWwgd2F5cwotICBpbiB3aGljaCB3ZSB0cmVhdCBhbiBpbnB1dCBmaWxlLCBlZywgd2Ugb25seSBsb29rIGF0IHN5bWJvbHMsIG9yCi0gIHByZWZpeCBpdCB3aXRoIGEgLWwgZXRjLgotCi0gIFdlIGNhbiBiZSBzdXBwbGllZCB3aXRoIHJlcXVlc3RzIGZvciBpbnB1dCBmaWxlcyBtb3JlIHRoYW4gb25jZTsKLSAgdGhleSBtYXksIGZvciBleGFtcGxlIGJlIHNwbGl0IG92ZXIgc2VydmVyYWwgbGluZXMgbGlrZSBmb28ubygudGV4dCkKLSAgZm9vLm8oLmRhdGEpIGV0Yywgc28gd2hlbiBhc2tlZCBmb3IgYSBmaWxlIHdlIGNoZWNrIHRoYXQgd2UgaGF2bid0Ci0gIGdvdCBpdCBhbHJlYWR5IHNvIHdlIGRvbid0IGR1cGxpY2F0ZSB0aGUgYmZkLgotCi0gKi8KLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICoKLW5ld19hZmlsZSAobmFtZSwgZmlsZV90eXBlLCB0YXJnZXQsIGFkZF90b19saXN0KQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotICAgICBib29sZWFuIGFkZF90b19saXN0OwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpwOwotCi0gIGlmIChhZGRfdG9fbGlzdCkKLSAgICBwID0gbmV3X3N0YXQgKGxhbmdfaW5wdXRfc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwID0gKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopCi0JICAgc3RhdF9hbGxvYyAoc2l6ZW9mIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKSkpOwotICAgICAgcC0+aGVhZGVyLm5leHQgPSBOVUxMOwotICAgIH0KLQotICBsYW5nX2hhc19pbnB1dF9maWxlID0gdHJ1ZTsKLSAgcC0+dGFyZ2V0ID0gdGFyZ2V0OwotICBzd2l0Y2ggKGZpbGVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfc3ltYm9sc19vbmx5X2VudW06Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7Ci0gICAgICBwLT5yZWFsID0gdHJ1ZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gdHJ1ZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bToKLSAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKLSAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKLSAgICAgIHAtPnJlYWwgPSBmYWxzZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW06Ci0gICAgICBwLT5pc19hcmNoaXZlID0gdHJ1ZTsKLSAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKLSAgICAgIHAtPnJlYWwgPSB0cnVlOwotICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBjb25jYXQgKCItbCIsIG5hbWUsIChjb25zdCBjaGFyICopIE5VTEwpOwotICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfbWFya2VyX2VudW06Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7Ci0gICAgICBwLT5yZWFsID0gZmFsc2U7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtOgotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOwotICAgICAgcC0+cmVhbCA9IHRydWU7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW06Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7Ci0gICAgICBwLT5yZWFsID0gdHJ1ZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRkFJTCAoKTsKLSAgICB9Ci0gIHAtPnRoZV9iZmQgPSAoYmZkICopIE5VTEw7Ci0gIHAtPmFzeW1ib2xzID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0gIHAtPm5leHRfcmVhbF9maWxlID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgcC0+bmV4dCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gIHAtPnN5bWJvbF9jb3VudCA9IDA7Ci0gIHAtPmR5bmFtaWMgPSBjb25maWcuZHluYW1pY19saW5rOwotICBwLT53aG9sZV9hcmNoaXZlID0gd2hvbGVfYXJjaGl2ZTsKLSAgcC0+bG9hZGVkID0gZmFsc2U7Ci0gIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAoJmlucHV0X2ZpbGVfY2hhaW4sCi0JCQkgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgcCwKLQkJCSAmcC0+bmV4dF9yZWFsX2ZpbGUpOwotICByZXR1cm4gcDsKLX0KLQotbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqCi1sYW5nX2FkZF9pbnB1dF9maWxlIChuYW1lLCBmaWxlX3R5cGUsIHRhcmdldCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZSBmaWxlX3R5cGU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLXsKLSAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IHRydWU7Ci0gIHJldHVybiBuZXdfYWZpbGUgKG5hbWUsIGZpbGVfdHlwZSwgdGFyZ2V0LCB0cnVlKTsKLX0KLQotLyogQnVpbGQgZW5vdWdoIHN0YXRlIHNvIHRoYXQgdGhlIHBhcnNlciBjYW4gYnVpbGQgaXRzIHRyZWUgKi8KLXZvaWQKLWxhbmdfaW5pdCAoKQotewotICBvYnN0YWNrX2JlZ2luICgmc3RhdF9vYnN0YWNrLCAxMDAwKTsKLQotICBzdGF0X3B0ciA9ICZzdGF0ZW1lbnRfbGlzdDsKLQotICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gIGxhbmdfbGlzdF9pbml0ICgmaW5wdXRfZmlsZV9jaGFpbik7Ci0gIGxhbmdfbGlzdF9pbml0ICgmbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotICBsYW5nX2xpc3RfaW5pdCAoJmZpbGVfY2hhaW4pOwotICBmaXJzdF9maWxlID0gbGFuZ19hZGRfaW5wdXRfZmlsZSAoKGNoYXIgKikgTlVMTCwKLQkJCQkgICAgbGFuZ19pbnB1dF9maWxlX2lzX21hcmtlcl9lbnVtLAotCQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLSAgYWJzX291dHB1dF9zZWN0aW9uID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChCRkRfQUJTX1NFQ1RJT05fTkFNRSk7Ci0KLSAgYWJzX291dHB1dF9zZWN0aW9uLT5iZmRfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQSByZWdpb24gaXMgYW4gYXJlYSBvZiBtZW1vcnkgZGVjbGFyZWQgd2l0aCB0aGUKLSBNRU1PUlkgeyAgbmFtZTpvcmc9ZXhwLCBsZW49ZXhwIC4uLiB9Ci0gc3ludGF4LgotCi0gV2UgbWFpbnRhaW4gYSBsaXN0IG9mIGFsbCB0aGUgcmVnaW9ucyBoZXJlCi0KLSBJZiBubyByZWdpb25zIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHNjcmlwdCwgdGhlbiB0aGUgZGVmYXVsdCBpcyB1c2VkCi0gd2hpY2ggaXMgY3JlYXRlZCB3aGVuIGxvb2tlZCB1cCB0byBiZSB0aGUgZW50aXJlIGRhdGEgc3BhY2UKLSovCi0KLXN0YXRpYyBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci1zdGF0aWMgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKipsYW5nX21lbW9yeV9yZWdpb25fbGlzdF90YWlsID0gJmxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotCi1sYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqCi1sYW5nX21lbW9yeV9yZWdpb25fbG9va3VwIChuYW1lKQotICAgICBDT05TVCBjaGFyICpDT05TVCBuYW1lOwotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcDsKLQotICBmb3IgKHAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLSAgICAgICBwICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotICAgICAgIHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHAtPm5hbWUsIG5hbWUpID09IDApCi0JewotCSAgcmV0dXJuIHA7Ci0JfQotICAgIH0KLQotI2lmIDAKLSAgLyogVGhpcyBjb2RlIHVzZWQgdG8gYWx3YXlzIHVzZSB0aGUgZmlyc3QgcmVnaW9uIGluIHRoZSBsaXN0IGFzIHRoZQotICAgICBkZWZhdWx0IHJlZ2lvbi4gIEkgY2hhbmdlZCBpdCB0byBpbnN0ZWFkIHVzZSBhIHJlZ2lvbgotICAgICBlbmNvbXBhc3NpbmcgYWxsIG9mIG1lbW9yeSBhcyB0aGUgZGVmYXVsdCByZWdpb24uICBUaGlzIHBlcm1pdHMKLSAgICAgTk9MT0FEIHNlY3Rpb25zIHRvIHdvcmsgcmVhc29uYWJseSB3aXRob3V0IHJlcXVpcmluZyBhIHJlZ2lvbi4KLSAgICAgUGVvcGxlIHNob3VsZCBzcGVjaWZ5IHdoYXQgcmVnaW9uIHRoZXkgbWVhbiwgaWYgdGhleSByZWFsbHkgd2FudAotICAgICBhIHJlZ2lvbi4gICovCi0gIGlmIChzdHJjbXAgKG5hbWUsICIqZGVmYXVsdCoiKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChsYW5nX21lbW9yeV9yZWdpb25fbGlzdCAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTCkKLQl7Ci0JICByZXR1cm4gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIHsKLSAgICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqbmV3ID0KLSAgICAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSkpOwotCi0gICAgbmV3LT5uYW1lID0gYnV5c3RyaW5nIChuYW1lKTsKLSAgICBuZXctPm5leHQgPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLQotICAgICpsYW5nX21lbW9yeV9yZWdpb25fbGlzdF90YWlsID0gbmV3OwotICAgIGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0X3RhaWwgPSAmbmV3LT5uZXh0OwotICAgIG5ldy0+b3JpZ2luID0gMDsKLSAgICBuZXctPmZsYWdzID0gMDsKLSAgICBuZXctPm5vdF9mbGFncyA9IDA7Ci0gICAgbmV3LT5sZW5ndGggPSB+KGJmZF9zaXplX3R5cGUpMDsKLSAgICBuZXctPmN1cnJlbnQgPSAwOwotICAgIG5ldy0+aGFkX2Z1bGxfbWVzc2FnZSA9IGZhbHNlOwotCi0gICAgcmV0dXJuIG5ldzsKLSAgfQotfQotCi0KLWxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICoKLWxhbmdfbWVtb3J5X2RlZmF1bHQgKHNlY3Rpb24pCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcDsKLQotICBmbGFnd29yZCBzZWNfZmxhZ3MgPSBzZWN0aW9uLT5mbGFnczsKLQotICAvKiBPdmVycmlkZSBTRUNfREFUQSB0byBtZWFuIGEgd3JpdGFibGUgc2VjdGlvbi4gICovCi0gIGlmICgoc2VjX2ZsYWdzICYgKFNFQ19BTExPQyB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFKSkgPT0gU0VDX0FMTE9DKQotICAgIHNlY19mbGFncyB8PSBTRUNfREFUQTsKLQotICBmb3IgKHAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLSAgICAgICBwICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotICAgICAgIHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocC0+ZmxhZ3MgJiBzZWNfZmxhZ3MpICE9IDAKLQkgICYmIChwLT5ub3RfZmxhZ3MgJiBzZWNfZmxhZ3MpID09IDApCi0JewotCSAgcmV0dXJuIHA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKCIqZGVmYXVsdCoiKTsKLX0KLQotbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqCi1sYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnU7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmxvb2t1cDsKLQotICBmb3IgKHUgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5oZWFkOwotICAgICAgIHUgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICB1ID0gbG9va3VwLT5uZXh0KQotICAgIHsKLSAgICAgIGxvb2t1cCA9ICZ1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBsb29rdXAtPm5hbWUpID09IDApCi0JewotCSAgcmV0dXJuIGxvb2t1cDsKLQl9Ci0gICAgfQotICByZXR1cm4gKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKLX0KLQotbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqCi1sYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmxvb2t1cDsKLQotICBsb29rdXAgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKG5hbWUpOwotICBpZiAobG9va3VwID09IChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopIE5VTEwpCi0gICAgewotCi0gICAgICBsb29rdXAgPSAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKQotCW5ld19zdGF0IChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgc3RhdF9wdHIpOwotICAgICAgbG9va3VwLT5yZWdpb24gPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+bG1hX3JlZ2lvbiA9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotICAgICAgbG9va3VwLT5maWxsID0gMDsKLSAgICAgIGxvb2t1cC0+YmxvY2tfdmFsdWUgPSAxOwotICAgICAgbG9va3VwLT5uYW1lID0gbmFtZTsKLQotICAgICAgbG9va3VwLT5uZXh0ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+YmZkX3NlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+cHJvY2Vzc2VkID0gZmFsc2U7Ci0gICAgICBsb29rdXAtPnNlY3R5cGUgPSBub3JtYWxfc2VjdGlvbjsKLSAgICAgIGxvb2t1cC0+YWRkcl90cmVlID0gKGV0cmVlX3R5cGUgKikgTlVMTDsKLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbG9va3VwLT5jaGlsZHJlbik7Ci0KLSAgICAgIGxvb2t1cC0+bWVtc3BlYyA9IChDT05TVCBjaGFyICopIE5VTEw7Ci0gICAgICBsb29rdXAtPmZsYWdzID0gMDsKLSAgICAgIGxvb2t1cC0+c3Vic2VjdGlvbl9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIGxvb2t1cC0+c2VjdGlvbl9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIGxvb2t1cC0+bG9hZF9iYXNlID0gKHVuaW9uIGV0cmVlX3VuaW9uICopIE5VTEw7Ci0gICAgICBsb29rdXAtPnBoZHJzID0gTlVMTDsKLQotICAgICAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkgICAgIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGxvb2t1cCwKLQkJCSAgICAgJmxvb2t1cC0+bmV4dCk7Ci0gICAgfQotICByZXR1cm4gbG9va3VwOwotfQotCi1zdGF0aWMgdm9pZAotbGFuZ19tYXBfZmxhZ3MgKGZsYWcpCi0gICAgIGZsYWd3b3JkIGZsYWc7Ci17Ci0gIGlmIChmbGFnICYgU0VDX0FMTE9DKQotICAgIG1pbmZvICgiYSIpOwotCi0gIGlmIChmbGFnICYgU0VDX0NPREUpCi0gICAgbWluZm8gKCJ4Iik7Ci0KLSAgaWYgKGZsYWcgJiBTRUNfUkVBRE9OTFkpCi0gICAgbWluZm8gKCJyIik7Ci0KLSAgaWYgKGZsYWcgJiBTRUNfREFUQSkKLSAgICBtaW5mbyAoInciKTsKLQotICBpZiAoZmxhZyAmIFNFQ19MT0FEKQotICAgIG1pbmZvICgibCIpOwotfQotCi12b2lkCi1sYW5nX21hcCAoKQotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqbTsKLQotICBtaW5mbyAoXygiXG5NZW1vcnkgQ29uZmlndXJhdGlvblxuXG4iKSk7Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiUtMTZzICUtMThzICUtMThzICVzXG4iLAotCSAgIF8oIk5hbWUiKSwgXygiT3JpZ2luIiksIF8oIkxlbmd0aCIpLCBfKCJBdHRyaWJ1dGVzIikpOwotCi0gIGZvciAobSA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotICAgICAgIG0gIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0gICAgICAgbSA9IG0tPm5leHQpCi0gICAgewotICAgICAgY2hhciBidWZbMTAwXTsKLSAgICAgIGludCBsZW47Ci0KLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiUtMTZzICIsIG0tPm5hbWUpOwotCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmLCBtLT5vcmlnaW4pOwotICAgICAgbWluZm8gKCIweCVzICIsIGJ1Zik7Ci0gICAgICBsZW4gPSBzdHJsZW4gKGJ1Zik7Ci0gICAgICB3aGlsZSAobGVuIDwgMTYpCi0JewotCSAgcHJpbnRfc3BhY2UgKCk7Ci0JICArK2xlbjsKLQl9Ci0KLSAgICAgIG1pbmZvICgiMHglViIsIG0tPmxlbmd0aCk7Ci0gICAgICBpZiAobS0+ZmxhZ3MgfHwgbS0+bm90X2ZsYWdzKQotCXsKLSNpZm5kZWYgQkZENjQKLQkgIG1pbmZvICgiICAgICAgICAiKTsKLSNlbmRpZgotCSAgaWYgKG0tPmZsYWdzKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0JICAgICAgbGFuZ19tYXBfZmxhZ3MgKG0tPmZsYWdzKTsKLQkgICAgfQotCi0JICBpZiAobS0+bm90X2ZsYWdzKQotCSAgICB7Ci0JICAgICAgbWluZm8gKCIgISIpOwotCSAgICAgIGxhbmdfbWFwX2ZsYWdzIChtLT5ub3RfZmxhZ3MpOwotCSAgICB9Ci0JfQotCi0gICAgICBwcmludF9ubCAoKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCBfKCJcbkxpbmtlciBzY3JpcHQgYW5kIG1lbW9yeSBtYXBcblxuIikpOwotCi0gIHByaW50X3N0YXRlbWVudHMgKCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gb3V0cHV0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF9vcyAocykKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgc2VjdGlvbl91c2VyZGF0YV90eXBlICpuZXc7Ci0KLSAgaWYgKHMtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzdHJjbXAgKHMtPm5hbWUsIERJU0NBUkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIGVpbmZvIChfKCIlUCVGOiBJbGxlZ2FsIHVzZSBvZiBgJXMnIHNlY3Rpb24iKSwgRElTQ0FSRF9TRUNUSU9OX05BTUUpOwotCi0gIG5ldyA9ICgoc2VjdGlvbl91c2VyZGF0YV90eXBlICopCi0JIHN0YXRfYWxsb2MgKHNpemVvZiAoc2VjdGlvbl91c2VyZGF0YV90eXBlKSkpOwotCi0gIHMtPmJmZF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIHMtPm5hbWUpOwotICBpZiAocy0+YmZkX3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgcy0+YmZkX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBzLT5uYW1lKTsKLSAgaWYgKHMtPmJmZF9zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIpLAotCSAgICAgb3V0cHV0X2JmZC0+eHZlYy0+bmFtZSwgcy0+bmFtZSk7Ci0gICAgfQotICBzLT5iZmRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBzLT5iZmRfc2VjdGlvbjsKLQotICAvKiBXZSBpbml0aWFsaXplIGFuIG91dHB1dCBzZWN0aW9ucyBvdXRwdXQgb2Zmc2V0IHRvIG1pbnVzIGl0cyBvd24gKi8KLSAgLyogdm1hIHRvIGFsbG93IHVzIHRvIG91dHB1dCBhIHNlY3Rpb24gdGhyb3VnaCBpdHNlbGYgKi8KLSAgcy0+YmZkX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgPSAwOwotICBnZXRfdXNlcmRhdGEgKHMtPmJmZF9zZWN0aW9uKSA9IChQVFIpIG5ldzsKLQotICAvKiBJZiB0aGVyZSBpcyBhIGJhc2UgYWRkcmVzcywgbWFrZSBzdXJlIHRoYXQgYW55IHNlY3Rpb25zIGl0IG1pZ2h0Ci0gICAgIG1lbnRpb24gYXJlIGluaXRpYWxpemVkLiAgKi8KLSAgaWYgKHMtPmFkZHJfdHJlZSAhPSBOVUxMKQotICAgIGV4cF9pbml0X29zIChzLT5hZGRyX3RyZWUpOwotfQotCi0vKiBNYWtlIHN1cmUgdGhhdCBhbGwgb3V0cHV0IHNlY3Rpb25zIG1lbnRpb25lZCBpbiBhbiBleHByZXNzaW9uIGFyZQotICAgaW5pdGlhbGl6ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZXhwX2luaXRfb3MgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGV4cF9pbml0X29zIChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGV4cF9pbml0X29zIChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGV4cF9pbml0X29zIChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfbmFtZToKLSAgICAgIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY29kZSkKLQl7Ci0JY2FzZSBBRERSOgotCWNhc2UgTE9BREFERFI6Ci0JY2FzZSBTSVpFT0Y6Ci0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0JICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChleHAtPm5hbWUubmFtZSk7Ci0JICAgIGlmIChvcyAhPSBOVUxMICYmIG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIGluaXRfb3MgKG9zKTsKLQkgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKiBTZWN0aW9ucyBtYXJrZWQgd2l0aCB0aGUgU0VDX0xJTktfT05DRSBmbGFnIHNob3VsZCBvbmx5IGJlIGxpbmtlZAotICAgb25jZSBpbnRvIHRoZSBvdXRwdXQuICBUaGlzIHJvdXRpbmUgY2hlY2tzIGVhY2ggc2VjdGlvbiwgYW5kCi0gICBhcnJhbmdlIHRvIGRpc2NhcmQgaXQgaWYgYSBzZWN0aW9uIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkKLSAgIGJlZW4gbGlua2VkLiAgSWYgdGhlIHNlY3Rpb24gaGFzIENPTURBVCBpbmZvcm1hdGlvbiwgdGhlbiBpdCB1c2VzCi0gICB0aGF0IHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBpbmNsdWRlZC4gIFRoaXMgY29kZQotICAgYXNzdW1lcyB0aGF0IGFsbCByZWxldmFudCBzZWN0aW9ucyBoYXZlIHRoZSBTRUNfTElOS19PTkNFIGZsYWcgc2V0OwotICAgdGhhdCBpcywgaXQgZG9lcyBub3QgZGVwZW5kIHNvbGVseSB1cG9uIHRoZSBzZWN0aW9uIG5hbWUuCi0gICBzZWN0aW9uX2FscmVhZHlfbGlua2VkIGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotLyogVGhpcyBpcyB0aGUgc2hhcGUgb2YgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGUgYWxyZWFkeV9saW5rZWQgaGFzaAotICAgdGFibGUuIEl0IG1hcHMgYSBuYW1lIG9udG8gYSBsaXN0IG9mIGFscmVhZHlfbGlua2VkIGVsZW1lbnRzIHdpdGgKLSAgIHRoZSBzYW1lIG5hbWUuICBJdCdzIHBvc3NpYmxlIHRvIGdldCBtb3JlIHRoYW4gb25lIGVsZW1lbnQgaW4gYQotICAgbGlzdCBpZiB0aGUgQ09NREFUIHNlY3Rpb25zIGhhdmUgZGlmZmVyZW50IG5hbWVzLiAgKi8KLQotc3RydWN0IGFscmVhZHlfbGlua2VkX2hhc2hfZW50cnkgCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICBzdHJ1Y3QgYWxyZWFkeV9saW5rZWQgKmVudHJ5OwotfTsKLQotc3RydWN0IGFscmVhZHlfbGlua2VkIAotewotICBzdHJ1Y3QgYWxyZWFkeV9saW5rZWQgKm5leHQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci19OwotCi0vKiBUaGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgYWxyZWFkeV9saW5rZWRfdGFibGU7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNlY3Rpb25fYWxyZWFkeV9saW5rZWQgKGFiZmQsIHNlYywgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnkgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBkYXRhOwotICBmbGFnd29yZCBmbGFnczsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3RydWN0IGFscmVhZHlfbGlua2VkICpsOwotICBzdHJ1Y3QgYWxyZWFkeV9saW5rZWRfaGFzaF9lbnRyeSAqYWxyZWFkeV9saW5rZWRfbGlzdDsKLQotICAvKiBJZiB3ZSBhcmUgb25seSByZWFkaW5nIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCwgdGhlbiB3ZSB3YW50IHRvCi0gICAgIGRpc2NhcmQgYWxsIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGVudHJ5LT5qdXN0X3N5bXNfZmxhZykKLSAgICB7Ci0gICAgICBzZWMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIHNlYy0+b3V0cHV0X29mZnNldCA9IHNlYy0+dm1hOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLQotICBpZiAoKGZsYWdzICYgU0VDX0xJTktfT05DRSkgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogRklYTUU6IFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgbWF5IGhhdmUgdHJvdWJsZQotICAgICBjb3B5aW5nIHJlbG9jYXRpb25zIGluIG90aGVyIHNlY3Rpb25zIHRoYXQgcmVmZXIgdG8gbG9jYWwgc3ltYm9scwotICAgICBpbiB0aGUgc2VjdGlvbiBiZWluZyBkaXNjYXJkZWQuICBUaG9zZSByZWxvY2F0aW9ucyB3aWxsIGhhdmUgdG8KLSAgICAgYmUgY29udmVydGVkIHNvbWVob3c7IGFzIG9mIHRoaXMgd3JpdGluZyBJJ20gbm90IHN1cmUgdGhhdCBhbnkgb2YKLSAgICAgdGhlIGJhY2tlbmRzIGhhbmRsZSB0aGF0IGNvcnJlY3RseS4KLQotICAgICBJdCBpcyB0ZW1wdGluZyB0byBpbnN0ZWFkIG5vdCBkaXNjYXJkIGxpbmsgb25jZSBzZWN0aW9ucyB3aGVuCi0gICAgIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsgKHRlY2huaWNhbGx5LCB0aGV5IHNob3VsZCBiZSBkaXNjYXJkZWQKLSAgICAgd2hlbmV2ZXIgd2UgYXJlIGJ1aWxkaW5nIGNvbnN0cnVjdG9ycykuICBIb3dldmVyLCB0aGF0IGZhaWxzLAotICAgICBiZWNhdXNlIHRoZSBsaW5rZXIgd2luZHMgdXAgY29tYmluaW5nIGFsbCB0aGUgbGluayBvbmNlIHNlY3Rpb25zCi0gICAgIGludG8gYSBzaW5nbGUgbGFyZ2UgbGluayBvbmNlIHNlY3Rpb24sIHdoaWNoIGRlZmVhdHMgdGhlIHB1cnBvc2UKLSAgICAgb2YgaGF2aW5nIGxpbmsgb25jZSBzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGxhY2UuCi0KLSAgICAgQWxzbywgbm90IG1lcmdpbmcgbGluayBvbmNlIHNlY3Rpb25zIGluIGEgcmVsb2NhdGVhYmxlIGxpbmsKLSAgICAgY2F1c2VzIHRyb3VibGUgZm9yIE1JUFMgRUxGLCB3aGljaCByZWxpZXMgaW4gbGluayBvbmNlIHNlbWFudGljcwotICAgICB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIHNlY3Rpb24gY29ycmVjdGx5LiAgKi8KLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0KLSAgYWxyZWFkeV9saW5rZWRfbGlzdCA9IAotICAgICgoc3RydWN0IGFscmVhZHlfbGlua2VkX2hhc2hfZW50cnkgKikKLSAgICAgYmZkX2hhc2hfbG9va3VwICgmYWxyZWFkeV9saW5rZWRfdGFibGUsIG5hbWUsIHRydWUsIGZhbHNlKSk7Ci0KLSAgZm9yIChsID0gYWxyZWFkeV9saW5rZWRfbGlzdC0+ZW50cnk7ICBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWMtPmNvbWRhdCA9PSBOVUxMCi0JICB8fCBsLT5zZWMtPmNvbWRhdCA9PSBOVUxMCi0JICB8fCBzdHJjbXAgKHNlYy0+Y29tZGF0LT5uYW1lLCBsLT5zZWMtPmNvbWRhdC0+bmFtZSkgPT0gMCkKLQl7Ci0JICAvKiBUaGUgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGxpbmtlZC4gIFNlZSBpZiB3ZSBzaG91bGQKLSAgICAgICAgICAgICBpc3N1ZSBhIHdhcm5pbmcuICAqLwotCSAgc3dpdGNoIChmbGFncyAmIFNFQ19MSU5LX0RVUExJQ0FURVMpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk6Ci0JICAgICAgaWYgKHNlYy0+Y29tZGF0ID09IE5VTEwpCi0JCWVpbmZvIChfKCIlUDogJUI6IHdhcm5pbmc6IGlnbm9yaW5nIGR1cGxpY2F0ZSBzZWN0aW9uIGAlcydcbiIpLAotCQkgICAgICAgYWJmZCwgbmFtZSk7Ci0JICAgICAgZWxzZQotCQllaW5mbyAoXygiJVA6ICVCOiB3YXJuaW5nOiBpZ25vcmluZyBkdXBsaWNhdGUgYCVzJyBzZWN0aW9uIHN5bWJvbCBgJXMnXG4iKSwKLQkJICAgICAgIGFiZmQsIG5hbWUsIHNlYy0+Y29tZGF0LT5uYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSBkaWcgb3V0IHRoZSBjb250ZW50cyBvZiBib3RoCi0gICAgICAgICAgICAgICAgIHNlY3Rpb25zIGFuZCBtZW1jbXAgdGhlbS4gIFRoZSBDT0ZGL1BFIHNwZWMgc2F5cyB0aGF0Ci0gICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgbGlua2VyIGRvZXMgbm90IGltcGxlbWVudCB0aGlzCi0gICAgICAgICAgICAgICAgIGNvcnJlY3RseSwgc28gSSdtIG5vdCBnb2luZyB0byBib3RoZXIgZG9pbmcgaXQKLSAgICAgICAgICAgICAgICAgZWl0aGVyLiAgKi8KLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCSAgICAgIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpCi0JCSAgIT0gYmZkX3NlY3Rpb25fc2l6ZSAobC0+c2VjLT5vd25lciwgbC0+c2VjKSkKLQkJZWluZm8gKF8oIiVQOiAlQjogd2FybmluZzogZHVwbGljYXRlIHNlY3Rpb24gYCVzJyBoYXMgZGlmZmVyZW50IHNpemVcbiIpLAotCQkgICAgICAgYWJmZCwgbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogU2V0IHRoZSBvdXRwdXRfc2VjdGlvbiBmaWVsZCBzbyB0aGF0IHdpbGRfZG9pdCBkb2VzIG5vdAotCSAgICAgY3JlYXRlIGEgbGFuZ19pbnB1dF9zZWN0aW9uIHN0cnVjdHVyZSBmb3IgdGhpcyBzZWN0aW9uLgotCSAgICAgU2luY2UgdGhlcmUgbWlnaHQgYmUgYSBzeW1ib2wgaW4gdGhlIHNlY3Rpb24gYmVpbmcKLQkgICAgIGRpc2NhcmRlZCwgd2UgbXVzdCByZXRhaW4gYSBwb2ludGVyIHRvIHRoZSBzZWN0aW9uIHdoaWNoCi0JICAgICB3ZSBhcmUgcmVhbGx5IGdvaW5nIHRvIHVzZS4gICovCi0JICBzZWMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGlmIChzZWMtPmNvbWRhdCAhPSBOVUxMKQotCSAgICBzZWMtPmNvbWRhdC0+c2VjID0gbC0+c2VjOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgUmVjb3JkIGl0LiAgQWxsb2NhdGUKLSAgICAgdGhlIG1lbW9yeSBmcm9tIHRoZSBzYW1lIG9ic3RhY2sgYXMgdGhlIGhhc2ggdGFibGUgaXMga2VwdCBpbi4gICovCi0KLSAgbCA9ICgoc3RydWN0IGFscmVhZHlfbGlua2VkICopIAotICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmYWxyZWFkeV9saW5rZWRfdGFibGUsIHNpemVvZiAqbCkpOwotCi0gIGwtPnNlYyA9IHNlYzsKLSAgbC0+bmV4dCA9IGFscmVhZHlfbGlua2VkX2xpc3QtPmVudHJ5OwotICBhbHJlYWR5X2xpbmtlZF9saXN0LT5lbnRyeSA9IGw7Ci19Ci0KLS8qIFN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBoYXNoIHRhYmxlIHVzZWQgYnkgc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCwKLSAgIGluaXRpYWxpemUgdGhlIHRhYmxlLCBmaWxsIGluIGFuIGVudHJ5IGFuZCByZW1vdmUgdGhlIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1hbHJlYWR5X2xpbmtlZF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGFscmVhZHlfbGlua2VkX2hhc2hfZW50cnkgKnJldCA9IAotICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYWxyZWFkeV9saW5rZWRfaGFzaF9lbnRyeSkpOwotCi0gIHJldC0+ZW50cnkgPSBOVUxMOwotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLWFscmVhZHlfbGlua2VkX3RhYmxlX2luaXQgKCkKLXsKLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYWxyZWFkeV9saW5rZWRfdGFibGUsCi0JCQkgICAgICAgYWxyZWFkeV9saW5rZWRfbmV3ZnVuYywKLQkJCSAgICAgICA0MikpCi0gICAgZWluZm8gKF8oIiVQJUY6IEZhaWxlZCB0byBjcmVhdGUgaGFzaCB0YWJsZVxuIikpOwotfQotCi1zdGF0aWMgdm9pZAotYWxyZWFkeV9saW5rZWRfdGFibGVfZnJlZSAoKQotewotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYWxyZWFkeV9saW5rZWRfdGFibGUpOwotfQotDAotLyogVGhlIHdpbGQgcm91dGluZXMuCi0KLSAgIFRoZXNlIGV4cGFuZCBzdGF0ZW1lbnRzIGxpa2UgKigudGV4dCkgYW5kIGZvby5vIHRvIGEgbGlzdCBvZgotICAgZXhwbGljaXQgYWN0aW9ucywgbGlrZSBmb28ubygudGV4dCksIGJhci5vKC50ZXh0KSBhbmQKLSAgIGZvby5vKC50ZXh0LCAuZGF0YSkuICAqLwotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgUEFUVEVSTiBhcmd1bWVudCBpcyBhIHdpbGRjYXJkIHBhdHRlcm4uCi0gICBBbHRob3VnaCBiYWNrc2xhc2hlcyBhcmUgdHJlYXRlZCBzcGVjaWFsbHkgaWYgYSBwYXR0ZXJuIGNvbnRhaW5zCi0gICB3aWxkY2FyZHMsIHdlIGRvIG5vdCBjb25zaWRlciB0aGUgbWVyZSBwcmVzZW5jZSBvZiBhIGJhY2tzbGFzaCB0bwotICAgYmUgZW5vdWdoIHRvIGNhdXNlIHRoZSB0aGUgcGF0dGVybiB0byBiZSB0cmVhdGVkIGFzIGEgd2lsZGNhcmQuCi0gICBUaGF0IGxldHMgdXMgaGFuZGxlIERPUyBmaWxlbmFtZXMgbW9yZSBuYXR1cmFsbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotd2lsZGNhcmRwIChwYXR0ZXJuKQotICAgICBjb25zdCBjaGFyICpwYXR0ZXJuOwotewotICBjb25zdCBjaGFyICpzOwotCi0gIGZvciAocyA9IHBhdHRlcm47ICpzICE9ICdcMCc7ICsrcykKLSAgICBpZiAoKnMgPT0gJz8nCi0JfHwgKnMgPT0gJyonCi0JfHwgKnMgPT0gJ1snKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIFNFQ1RJT04gdG8gdGhlIG91dHB1dCBzZWN0aW9uIE9VVFBVVC4gIERvIHRoaXMgYnkgY3JlYXRpbmcgYQotICAgbGFuZ19pbnB1dF9zZWN0aW9uIHN0YXRlbWVudCB3aGljaCBpcyBwbGFjZWQgYXQgUFRSLiAgRklMRSBpcyB0aGUKLSAgIGlucHV0IGZpbGUgd2hpY2ggaG9sZHMgU0VDVElPTi4gICovCi0KLXZvaWQKLXdpbGRfZG9pdCAocHRyLCBzZWN0aW9uLCBvdXRwdXQsIGZpbGUpCi0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqcHRyOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0OwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgYm9vbGVhbiBkaXNjYXJkOwotCi0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzZWN0aW9uLT5vd25lciwgc2VjdGlvbik7Ci0KLSAgZGlzY2FyZCA9IGZhbHNlOwotCi0gIC8qIElmIHdlIGFyZSBkb2luZyBhIGZpbmFsIGxpbmssIGRpc2NhcmQgc2VjdGlvbnMgbWFya2VkIHdpdGgKLSAgICAgU0VDX0VYQ0xVREUuICAqLwotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiAoZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkKLSAgICBkaXNjYXJkID0gdHJ1ZTsKLQotICAvKiBEaXNjYXJkIGlucHV0IHNlY3Rpb25zIHdoaWNoIGFyZSBhc3NpZ25lZCB0byBhIHNlY3Rpb24gbmFtZWQKLSAgICAgRElTQ0FSRF9TRUNUSU9OX05BTUUuICAqLwotICBpZiAoc3RyY21wIChvdXRwdXQtPm5hbWUsIERJU0NBUkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIGRpc2NhcmQgPSB0cnVlOwotCi0gIC8qIERpc2NhcmQgZGVidWdnaW5nIHNlY3Rpb25zIGlmIHdlIGFyZSBzdHJpcHBpbmcgZGVidWdnaW5nCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKChsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfZGVidWdnZXIgfHwgbGlua19pbmZvLnN0cmlwID09IHN0cmlwX2FsbCkKLSAgICAgICYmIChmbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgZGlzY2FyZCA9IHRydWU7Ci0KLSAgaWYgKGRpc2NhcmQpCi0gICAgewotICAgICAgaWYgKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgLyogVGhpcyBwcmV2ZW50cyBmdXR1cmUgY2FsbHMgZnJvbSBhc3NpZ25pbmcgdGhpcyBzZWN0aW9uLiAgKi8KLQkgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZmlyc3Q7Ci0gICAgICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqbmV3OwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIGlmIChvdXRwdXQtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgaW5pdF9vcyAob3V0cHV0KTsKLQkgIGZpcnN0ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlCi0JZmlyc3QgPSBmYWxzZTsKLQotICAgICAgLyogQWRkIGEgc2VjdGlvbiByZWZlcmVuY2UgdG8gdGhlIGxpc3QgKi8KLSAgICAgIG5ldyA9IG5ld19zdGF0IChsYW5nX2lucHV0X3NlY3Rpb24sIHB0cik7Ci0KLSAgICAgIG5ldy0+c2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBuZXctPmlmaWxlID0gZmlsZTsKLSAgICAgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gb3V0cHV0LT5iZmRfc2VjdGlvbjsKLQotICAgICAgZmxhZ3MgPSBzZWN0aW9uLT5mbGFnczsKLQotICAgICAgLyogV2UgZG9uJ3QgY29weSB0aGUgU0VDX05FVkVSX0xPQUQgZmxhZyBmcm9tIGFuIGlucHV0IHNlY3Rpb24KLQkgdG8gYW4gb3V0cHV0IHNlY3Rpb24sIGJlY2F1c2Ugd2Ugd2FudCB0byBiZSBhYmxlIHRvIGluY2x1ZGUgYQotCSBTRUNfTkVWRVJfTE9BRCBzZWN0aW9uIGluIHRoZSBtaWRkbGUgb2YgYW4gb3RoZXJ3aXNlIGxvYWRlZAotCSBzZWN0aW9uIChJIGRvbid0IGtub3cgd2h5IHdlIHdhbnQgdG8gZG8gdGhpcywgYnV0IHdlIGRvKS4KLQkgYnVpbGRfbGlua19vcmRlciBpbiBsZHdyaXRlLmMgaGFuZGxlcyB0aGlzIGNhc2UgYnkgdHVybmluZwotCSB0aGUgZW1iZWRkZWQgU0VDX05FVkVSX0xPQUQgc2VjdGlvbiBpbnRvIGEgZmlsbC4gICovCi0KLSAgICAgIGZsYWdzICY9IH4gU0VDX05FVkVSX0xPQUQ7Ci0KLSAgICAgIC8qIElmIGZpbmFsIGxpbmssIGRvbid0IGNvcHkgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZ3MsIHRoZXkndmUKLQkgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4gIE9uZSByZWFzb24gdG8gZG8gdGhpcyBpcyB0aGF0IG9uIHBlCi0JIGZvcm1hdCB0YXJnZXRzLCAudGV4dCRmb28gc2VjdGlvbnMgZ28gaW50byAudGV4dCBhbmQgaXQncyBvZGQKLQkgdG8gc2VlIC50ZXh0IHdpdGggU0VDX0xJTktfT05DRSBzZXQuICAqLwotCi0gICAgICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCWZsYWdzICY9IH4gKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGlucHV0IHNlY3Rpb24sIGFuZCB0aGUgU0VDX1JFQURPTkxZCi0gICAgICAgICBmbGFnIGlzIG5vdCBjdXJyZW50bHkgc2V0LCB0aGVuIGRvbid0IHNldCBpdCBqdXN0IGJlY2F1c2UgdGhlCi0gICAgICAgICBpbnB1dCBzZWN0aW9uIGhhcyBpdCBzZXQuICAqLwotCi0gICAgICBpZiAoISBmaXJzdCAmJiAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCWZsYWdzICY9IH4gU0VDX1JFQURPTkxZOwotCi0gICAgICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgICAgIC8qIElmIFNFQ19SRUFET05MWSBpcyBub3Qgc2V0IGluIHRoZSBpbnB1dCBzZWN0aW9uLCB0aGVuIGNsZWFyCi0gICAgICAgICBpdCBmcm9tIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0gICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmPSB+U0VDX1JFQURPTkxZOwotCi0gICAgICBzd2l0Y2ggKG91dHB1dC0+c2VjdHlwZSkKLQl7Ci0JY2FzZSBub3JtYWxfc2VjdGlvbjoKLQkgIGJyZWFrOwotCWNhc2UgZHNlY3Rfc2VjdGlvbjoKLQljYXNlIGNvcHlfc2VjdGlvbjoKLQljYXNlIGluZm9fc2VjdGlvbjoKLQljYXNlIG92ZXJsYXlfc2VjdGlvbjoKLQkgIG91dHB1dC0+YmZkX3NlY3Rpb24tPmZsYWdzICY9IH5TRUNfQUxMT0M7Ci0JICBicmVhazsKLQljYXNlIG5vbG9hZF9zZWN0aW9uOgotCSAgb3V0cHV0LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJj0gflNFQ19MT0FEOwotCSAgb3V0cHV0LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX05FVkVSX0xPQUQ7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIENvcHkgb3ZlciBTRUNfU01BTExfREFUQS4gICovCi0gICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfU01BTExfREFUQSkKLQlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1NNQUxMX0RBVEE7Ci0KLSAgICAgIGlmIChzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPiBvdXRwdXQtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpCi0Jb3V0cHV0LT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOwotCi0gICAgICAvKiBJZiBzdXBwbGllZCBhbiBhbGlnbWVudCwgdGhlbiBmb3JjZSBpdC4gICovCi0gICAgICBpZiAob3V0cHV0LT5zZWN0aW9uX2FsaWdubWVudCAhPSAtMSkKLQlvdXRwdXQtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBvdXRwdXQtPnNlY3Rpb25fYWxpZ25tZW50OwotICAgIH0KLX0KLQotLyogSGFuZGxlIHdpbGRjYXJkIHNvcnRpbmcuICBUaGlzIHJldHVybnMgdGhlIGxhbmdfaW5wdXRfc2VjdGlvbiB3aGljaAotICAgc2hvdWxkIGZvbGxvdyB0aGUgb25lIHdlIGFyZSBnb2luZyB0byBjcmVhdGUgZm9yIFNFQ1RJT04gYW5kIEZJTEUsCi0gICBiYXNlZCBvbiB0aGUgc29ydGluZyByZXF1aXJlbWVudHMgb2YgV0lMRC4gIEl0IHJldHVybnMgTlVMTCBpZiB0aGUKLSAgIG5ldyBzZWN0aW9uIHNob3VsZCBqdXN0IGdvIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGlzdC4gICovCi0KLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoKLXdpbGRfc29ydCAod2lsZCwgZmlsZSwgc2VjdGlvbikKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICp3aWxkOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpsOwotCi0gIGlmICghIHdpbGQtPmZpbGVuYW1lc19zb3J0ZWQgJiYgISB3aWxkLT5zZWN0aW9uc19zb3J0ZWQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc2VjdGlvbl9uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGZpbGUtPnRoZV9iZmQsIHNlY3Rpb24pOwotICBmb3IgKGwgPSB3aWxkLT5jaGlsZHJlbi5oZWFkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICpsczsKLQotICAgICAgaWYgKGwtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQotCWNvbnRpbnVlOwotICAgICAgbHMgPSAmbC0+aW5wdXRfc2VjdGlvbjsKLQotICAgICAgLyogU29ydGluZyBieSBmaWxlbmFtZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgc29ydGluZyBieSBzZWN0aW9uCi0gICAgICAgICBuYW1lLiAgKi8KLQotICAgICAgaWYgKHdpbGQtPmZpbGVuYW1lc19zb3J0ZWQpCi0JewotCSAgY29uc3QgY2hhciAqZm4sICpsbjsKLQkgIGJvb2xlYW4gZmEsIGxhOwotCSAgaW50IGk7Ci0KLQkgIC8qIFRoZSBQRSBzdXBwb3J0IGZvciB0aGUgLmlkYXRhIHNlY3Rpb24gYXMgZ2VuZXJhdGVkIGJ5Ci0gICAgICAgICAgICAgZGxsdG9vbCBhc3N1bWVzIHRoYXQgZmlsZXMgd2lsbCBiZSBzb3J0ZWQgYnkgdGhlIG5hbWUgb2YKLSAgICAgICAgICAgICB0aGUgYXJjaGl2ZSBhbmQgdGhlbiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgYXJjaGl2ZS4gICovCi0KLQkgIGlmIChmaWxlLT50aGVfYmZkICE9IE5VTEwKLQkgICAgICAmJiBiZmRfbXlfYXJjaGl2ZSAoZmlsZS0+dGhlX2JmZCkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZuID0gYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGZpbGUtPnRoZV9iZmQpKTsKLQkgICAgICBmYSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZuID0gZmlsZS0+ZmlsZW5hbWU7Ci0JICAgICAgZmEgPSBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAobHMtPmlmaWxlLT50aGVfYmZkICE9IE5VTEwKLQkgICAgICAmJiBiZmRfbXlfYXJjaGl2ZSAobHMtPmlmaWxlLT50aGVfYmZkKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgbG4gPSBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAobHMtPmlmaWxlLT50aGVfYmZkKSk7Ci0JICAgICAgbGEgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsbiA9IGxzLT5pZmlsZS0+ZmlsZW5hbWU7Ci0JICAgICAgbGEgPSBmYWxzZTsKLQkgICAgfQotCi0JICBpID0gc3RyY21wIChmbiwgbG4pOwotCSAgaWYgKGkgPiAwKQotCSAgICBjb250aW51ZTsKLQkgIGVsc2UgaWYgKGkgPCAwKQotCSAgICBicmVhazsKLQotCSAgaWYgKGZhIHx8IGxhKQotCSAgICB7Ci0JICAgICAgaWYgKGZhKQotCQlmbiA9IGZpbGUtPmZpbGVuYW1lOwotCSAgICAgIGlmIChsYSkKLQkJbG4gPSBscy0+aWZpbGUtPmZpbGVuYW1lOwotCi0JICAgICAgaSA9IHN0cmNtcCAoZm4sIGxuKTsKLQkgICAgICBpZiAoaSA+IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIGVsc2UgaWYgKGkgPCAwKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSGVyZSBlaXRoZXIgdGhlIGZpbGVzIGFyZSBub3Qgc29ydGVkIGJ5IG5hbWUsIG9yIHdlIGFyZQotICAgICAgICAgbG9va2luZyBhdCB0aGUgc2VjdGlvbnMgZm9yIHRoaXMgZmlsZS4gICovCi0KLSAgICAgIGlmICh3aWxkLT5zZWN0aW9uc19zb3J0ZWQpCi0JewotCSAgaWYgKHN0cmNtcCAoc2VjdGlvbl9uYW1lLAotCQkgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobHMtPmlmaWxlLT50aGVfYmZkLAotCQkJCQkgICAgbHMtPnNlY3Rpb24pKQotCSAgICAgIDwgMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gbDsKLX0KLQotLyogRXhwYW5kIGEgd2lsZCBzdGF0ZW1lbnQgZm9yIGEgcGFydGljdWxhciBGSUxFLiAgU0VDVElPTiBtYXkgYmUKLSAgIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgaXMgYSB3aWxkIGNhcmQuICAqLwotCi1zdGF0aWMgdm9pZAotb3V0cHV0X3NlY3Rpb25fY2FsbGJhY2sgKHB0ciwgc2VjdGlvbiwgZmlsZSwgb3V0cHV0KQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnB0cjsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIHZvaWQgKm91dHB1dDsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqYmVmb3JlOwotICAKLSAgLyogSWYgdGhlIHdpbGQgcGF0dGVybiB3YXMgbWFya2VkIEtFRVAsIHRoZSBtZW1iZXIgc2VjdGlvbnMKLSAgICAgc2hvdWxkIGJlIGFzIHdlbGwuICAqLwotICBpZiAocHRyLT5rZWVwX3NlY3Rpb25zKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19LRUVQOwotICAKLSAgYmVmb3JlID0gd2lsZF9zb3J0IChwdHIsIGZpbGUsIHNlY3Rpb24pOwotICAKLSAgLyogSGVyZSBCRUZPUkUgcG9pbnRzIHRvIHRoZSBsYW5nX2lucHV0X3NlY3Rpb24gd2hpY2gKLSAgICAgc2hvdWxkIGZvbGxvdyB0aGUgb25lIHdlIGFyZSBhYm91dCB0byBhZGQuICBJZiBCRUZPUkUKLSAgICAgaXMgTlVMTCwgdGhlbiB0aGUgc2VjdGlvbiBzaG91bGQganVzdCBnbyBhdCB0aGUgZW5kCi0gICAgIG9mIHRoZSBjdXJyZW50IGxpc3QuICAqLwotICAKLSAgaWYgKGJlZm9yZSA9PSBOVUxMKQotICAgIHdpbGRfZG9pdCAoJnB0ci0+Y2hpbGRyZW4sIHNlY3Rpb24sIAotCSAgICAgICAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSBvdXRwdXQsIAotCSAgICAgICBmaWxlKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBsaXN0OwotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnBwOwotICAgICAgCi0gICAgICBsYW5nX2xpc3RfaW5pdCAoJmxpc3QpOwotICAgICAgd2lsZF9kb2l0ICgmbGlzdCwgc2VjdGlvbiwgCi0JCSAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSBvdXRwdXQsIAotCQkgZmlsZSk7Ci0gICAgICAKLSAgICAgIC8qIElmIHdlIGFyZSBkaXNjYXJkaW5nIHRoZSBzZWN0aW9uLCBMSVNULkhFQUQgd2lsbAotCSBiZSBOVUxMLiAgKi8KLSAgICAgIGlmIChsaXN0LmhlYWQgIT0gTlVMTCkKLQl7Ci0JICBBU1NFUlQgKGxpc3QuaGVhZC0+bmV4dCA9PSBOVUxMKTsKLQkgIAotCSAgZm9yIChwcCA9ICZwdHItPmNoaWxkcmVuLmhlYWQ7Ci0JICAgICAgICpwcCAhPSBiZWZvcmU7Ci0JICAgICAgIHBwID0gJigqcHApLT5uZXh0KQotCSAgICBBU1NFUlQgKCpwcCAhPSBOVUxMKTsKLQkgIAotCSAgbGlzdC5oZWFkLT5uZXh0ID0gKnBwOwotCSAgKnBwID0gbGlzdC5oZWFkOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgcGFzc2VkIGEgZmlsZSBuYW1lIHdoaWNoIG11c3QgaGF2ZSBiZWVuIHNlZW4gYWxyZWFkeSBhbmQKLSAgIGFkZGVkIHRvIHRoZSBzdGF0ZW1lbnQgdHJlZS4gIFdlIHdpbGwgc2VlIGlmIGl0IGhhcyBiZWVuIG9wZW5lZAotICAgYWxyZWFkeSBhbmQgaGFkIGl0cyBzeW1ib2xzIHJlYWQuICBJZiBub3QgdGhlbiB3ZSdsbCByZWFkIGl0LiAgKi8KLQotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKgotbG9va3VwX25hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnNlYXJjaDsKLQotICBmb3IgKHNlYXJjaCA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGlucHV0X2ZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBzZWFyY2ggIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKLSAgICAgICBzZWFyY2ggPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBzZWFyY2gtPm5leHRfcmVhbF9maWxlKQotICAgIHsKLSAgICAgIGlmIChzZWFyY2gtPmZpbGVuYW1lID09IChjaGFyICopIE5VTEwgJiYgbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotCXJldHVybiBzZWFyY2g7Ci0gICAgICBpZiAoc2VhcmNoLT5maWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMCi0JICAmJiBuYW1lICE9IChjaGFyICopIE5VTEwKLQkgICYmIHN0cmNtcCAoc2VhcmNoLT5maWxlbmFtZSwgbmFtZSkgPT0gMCkKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKHNlYXJjaCA9PSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMKQotICAgIHNlYXJjaCA9IG5ld19hZmlsZSAobmFtZSwgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bSwgZGVmYXVsdF90YXJnZXQsCi0JCQlmYWxzZSk7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGFkZGVkIHRoaXMgZmlsZSwgb3IgdGhpcyBmaWxlIGlzIG5vdCByZWFsCi0gICAgIChGSVhNRTogY2FuIHRoYXQgZXZlciBhY3R1YWxseSBoYXBwZW4/KSBvciB0aGUgbmFtZSBpcyBOVUxMCi0gICAgIChGSVhNRTogY2FuIHRoYXQgZXZlciBhY3R1YWxseSBoYXBwZW4/KSBkb24ndCBhZGQgdGhpcyBmaWxlLiAgKi8KLSAgaWYgKHNlYXJjaC0+bG9hZGVkCi0gICAgICB8fCAhIHNlYXJjaC0+cmVhbAotICAgICAgfHwgc2VhcmNoLT5maWxlbmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBzZWFyY2g7Ci0KLSAgbG9hZF9zeW1ib2xzIChzZWFyY2gsIChsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKikgTlVMTCk7Ci0KLSAgcmV0dXJuIHNlYXJjaDsKLX0KLQotLyogR2V0IHRoZSBzeW1ib2xzIGZvciBhbiBpbnB1dCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWxvYWRfc3ltYm9scyAoZW50cnksIHBsYWNlKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpwbGFjZTsKLXsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGlmIChlbnRyeS0+bG9hZGVkKQotICAgIHJldHVybjsKLQotICBsZGZpbGVfb3Blbl9maWxlIChlbnRyeSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9hcmNoaXZlKQotICAgICAgJiYgISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGVudHJ5LT50aGVfYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9lcnJvcl90eXBlIGVycjsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqaG9sZDsKLQotICAgICAgZXJyID0gYmZkX2dldF9lcnJvciAoKTsKLSAgICAgIGlmIChlcnIgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBjaGFyICoqcDsKLQotCSAgZWluZm8gKF8oIiVCOiBmaWxlIG5vdCByZWNvZ25pemVkOiAlRVxuIiksIGVudHJ5LT50aGVfYmZkKTsKLQkgIGVpbmZvIChfKCIlQjogbWF0Y2hpbmcgZm9ybWF0czoiKSwgZW50cnktPnRoZV9iZmQpOwotCSAgZm9yIChwID0gbWF0Y2hpbmc7ICpwICE9IE5VTEw7IHArKykKLQkgICAgZWluZm8gKCIgJXMiLCAqcCk7Ci0JICBlaW5mbyAoIiVGXG4iKTsKLQl9Ci0gICAgICBlbHNlIGlmIChlcnIgIT0gYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQKLQkgICAgICAgfHwgcGxhY2UgPT0gTlVMTCkKLQllaW5mbyAoXygiJUYlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIpLCBlbnRyeS0+dGhlX2JmZCk7Ci0KLSAgICAgIGJmZF9jbG9zZSAoZW50cnktPnRoZV9iZmQpOwotICAgICAgZW50cnktPnRoZV9iZmQgPSBOVUxMOwotCi0gICAgICAvKiBTZWUgaWYgdGhlIGVtdWxhdGlvbiBoYXMgc29tZSBzcGVjaWFsIGtub3dsZWRnZS4gICovCi0KLSAgICAgIGlmIChsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KSkKLQlyZXR1cm47Ci0KLSAgICAgIC8qIFRyeSB0byBpbnRlcnByZXQgdGhlIGZpbGUgYXMgYSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotICAgICAgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChlbnRyeS0+ZmlsZW5hbWUpOwotCi0gICAgICBob2xkID0gc3RhdF9wdHI7Ci0gICAgICBzdGF0X3B0ciA9IHBsYWNlOwotCi0gICAgICBsZGZpbGVfYXNzdW1lZF9zY3JpcHQgPSB0cnVlOwotICAgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfc2NyaXB0OwotICAgICAgeXlwYXJzZSAoKTsKLSAgICAgIGxkZmlsZV9hc3N1bWVkX3NjcmlwdCA9IGZhbHNlOwotCi0gICAgICBzdGF0X3B0ciA9IGhvbGQ7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGxkZW11bF9yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KSkKLSAgICByZXR1cm47Ci0KLSAgLyogV2UgZG9uJ3QgY2FsbCBsZGxhbmdfYWRkX2ZpbGUgZm9yIGFuIGFyY2hpdmUuICBJbnN0ZWFkLCB0aGUKLSAgICAgYWRkX3N5bWJvbHMgZW50cnkgcG9pbnQgd2lsbCBjYWxsIGxkbGFuZ19hZGRfZmlsZSwgdmlhIHRoZQotICAgICBhZGRfYXJjaGl2ZV9lbGVtZW50IGNhbGxiYWNrLCBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBhcmNoaXZlCi0gICAgIHdoaWNoIGlzIHVzZWQuICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIGxkbGFuZ19hZGRfZmlsZSAoZW50cnkpOwotICAgICAgaWYgKHRyYWNlX2ZpbGVzIHx8IHRyYWNlX2ZpbGVfdHJpZXMpCi0JaW5mb19tc2cgKCIlSVxuIiwgZW50cnkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgaWYgKGVudHJ5LT53aG9sZV9hcmNoaXZlKQotCXsKLQkgIGJmZCAqbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZW50cnktPnRoZV9iZmQsCi0JCQkJCQkgICAgICAoYmZkICopIE5VTEwpOwotCSAgd2hpbGUgKG1lbWJlciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAobWVtYmVyLCBiZmRfb2JqZWN0KSkKLQkJZWluZm8gKF8oIiVGJUI6IG9iamVjdCAlQiBpbiBhcmNoaXZlIGlzIG5vdCBvYmplY3RcbiIpLAotCQkgICAgICAgZW50cnktPnRoZV9iZmQsIG1lbWJlcik7Ci0JICAgICAgaWYgKCEgKCgqbGlua19pbmZvLmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkKLQkJICAgICAoJmxpbmtfaW5mbywgbWVtYmVyLCAiLS13aG9sZS1hcmNoaXZlIikpKQotCQlhYm9ydCAoKTsKLQkgICAgICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAobWVtYmVyLCAmbGlua19pbmZvKSkKLQkJZWluZm8gKF8oIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgbWVtYmVyKTsKLQkgICAgICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChlbnRyeS0+dGhlX2JmZCwKLQkJCQkJCSAgICAgbWVtYmVyKTsKLQkgICAgfQotCi0JICBlbnRyeS0+bG9hZGVkID0gdHJ1ZTsKLQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGVudHJ5LT50aGVfYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoXygiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBlbnRyeS0+dGhlX2JmZCk7Ci0KLSAgZW50cnktPmxvYWRlZCA9IHRydWU7Ci19Ci0KLSAgICAgCi0KLS8qIEhhbmRsZSBhIHdpbGQgc3RhdGVtZW50LiAgU0VDVElPTiBvciBGSUxFIG9yIGJvdGggbWF5IGJlIE5VTEwsCi0gICBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgYSB3aWxkY2FyZC4gIFNlcGFyYXRlIGxhbmdfaW5wdXRfc2VjdGlvbgotICAgc3RhdGVtZW50cyBhcmUgY3JlYXRlZCBmb3IgZWFjaCBwYXJ0IG9mIHRoZSBleHBhbnNpb247IHRoZXkgYXJlCi0gICBhZGRlZCBhZnRlciB0aGUgd2lsZCBzdGF0ZW1lbnQgUy4gIE9VVFBVVCBpcyB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotd2lsZCAocywgc2VjdGlvbiwgZmlsZSwgdGFyZ2V0LCBvdXRwdXQpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqczsKLSAgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dDsKLXsKLSAgd2Fsa193aWxkIChzLCBzZWN0aW9uLCBmaWxlLCBvdXRwdXRfc2VjdGlvbl9jYWxsYmFjaywgKHZvaWQgKikgb3V0cHV0KTsKLQotICBpZiAoc2VjdGlvbiAhPSAoY2hhciAqKSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKHNlY3Rpb24sICJDT01NT04iKSA9PSAwCi0gICAgICAmJiBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgLyogUmVtZW1iZXIgdGhlIHNlY3Rpb24gdGhhdCBjb21tb24gaXMgZ29pbmcgdG8gaW4gY2FzZSB3ZSBsYXRlcgotICAgICAgICAgZ2V0IHNvbWV0aGluZyB3aGljaCBkb2Vzbid0IGtub3cgd2hlcmUgdG8gcHV0IGl0LiAgKi8KLSAgICAgIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPSBvdXRwdXQ7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZmYgdGFyZ2V0IGlzIHRoZSBzb3VnaHQgdGFyZ2V0LiAgKi8KLXN0YXRpYyBpbnQKLWdldF90YXJnZXQgKHRhcmdldCwgZGF0YSkKLSAgICAgY29uc3QgYmZkX3RhcmdldCAqIHRhcmdldDsKLSAgICAgdm9pZCAqIGRhdGE7Ci17Ci0gIGNvbnN0IGNoYXIgKiBzb3VnaHQgPSAoY29uc3QgY2hhciAqKSBkYXRhOwotICAKLSAgcmV0dXJuIHN0cmNtcCAodGFyZ2V0LT5uYW1lLCBzb3VnaHQpID09IDA7Ci19Ci0KLS8qIExpa2Ugc3RyY3B5KCkgYnV0IGNvbnZlcnQgdG8gbG93ZXIgY2FzZSBhcyB3ZWxsLiAgKi8KLXN0YXRpYyB2b2lkCi1zdHJpY3B5IChkZXN0LCBzcmMpCi0gICAgIGNoYXIgKiBkZXN0OwotICAgICBjaGFyICogc3JjOwotewotICBjaGFyIGM7Ci0gIAotICB3aGlsZSAoKGMgPSAqIHNyYyArKykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCWMgPSB0b2xvd2VyIChjKTsKLQotICAgICAgKiBkZXN0ICsrID0gYzsKLSAgICB9Ci0KLSAgKiBkZXN0ID0gMDsKLX0KLQotLyogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgbmVlZGxlIChpZiBhbnkpIGluIGhheXN0YWNrCi0gICBmcm9tIGhheXN0YWNrLiAgKi8KLXN0YXRpYyB2b2lkCi1zdHJjdXQgKGhheXN0YWNrLCBuZWVkbGUpCi0gICAgIGNoYXIgKiBoYXlzdGFjazsKLSAgICAgY2hhciAqIG5lZWRsZTsKLXsKLSAgaGF5c3RhY2sgPSBzdHJzdHIgKGhheXN0YWNrLCBuZWVkbGUpOwotICAKLSAgaWYgKGhheXN0YWNrKQotICAgIHsKLSAgICAgIGNoYXIgKiBzcmM7Ci0KLSAgICAgIGZvciAoc3JjID0gaGF5c3RhY2sgKyBzdHJsZW4gKG5lZWRsZSk7ICogc3JjOykKLQkqIGhheXN0YWNrICsrID0gKiBzcmMgKys7Ci0gICAgICAKLSAgICAgICogaGF5c3RhY2sgPSAwOwotICAgIH0KLX0KLQotLyogQ29tcGFyZSB0d28gdGFyZ2V0IGZvcm1hdCBuYW1lIHN0cmluZ3MuCi0gICBSZXR1cm4gYSB2YWx1ZSBpbmRpY2F0aW5nIGhvdyAic2ltaWxhciIgdGhleSBhcmUuICAqLwotc3RhdGljIGludAotbmFtZV9jb21wYXJlIChmaXJzdCwgc2Vjb25kKQotICAgICBjaGFyICogZmlyc3Q7Ci0gICAgIGNoYXIgKiBzZWNvbmQ7Ci17Ci0gIGNoYXIgKiBjb3B5MTsKLSAgY2hhciAqIGNvcHkyOwotICBpbnQgICAgcmVzdWx0OwotICAKLSAgY29weTEgPSB4bWFsbG9jIChzdHJsZW4gKGZpcnN0KSArIDEpOwotICBjb3B5MiA9IHhtYWxsb2MgKHN0cmxlbiAoc2Vjb25kKSArIDEpOwotCi0gIC8qIENvbnZlcnQgdGhlIG5hbWVzIHRvIGxvd2VyIGNhc2UuICAqLwotICBzdHJpY3B5IChjb3B5MSwgZmlyc3QpOwotICBzdHJpY3B5IChjb3B5Miwgc2Vjb25kKTsKLQotICAvKiBSZW1vdmUgYW5kIGVuZGlhbiBzdHJpbmdzIGZyb20gdGhlIG5hbWUuICAqLwotICBzdHJjdXQgKGNvcHkxLCAiYmlnIik7Ci0gIHN0cmN1dCAoY29weTEsICJsaXR0bGUiKTsKLSAgc3RyY3V0IChjb3B5MiwgImJpZyIpOwotICBzdHJjdXQgKGNvcHkyLCAibGl0dGxlIik7Ci0KLSAgLyogUmV0dXJuIGEgdmFsdWUgYmFzZWQgb24gaG93IG1hbnkgY2hhcmFjdGVycyBtYXRjaCwKLSAgICAgc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLiAgIElmIGJvdGggc3RyaW5ncyBhcmUKLSAgICAgdGhlIHNhbWUgdGhlbiByZXR1cm4gMTAgKiB0aGVpciBsZW5ndGguICAqLwotICBmb3IgKHJlc3VsdCA9IDA7IGNvcHkxIFtyZXN1bHRdID09IGNvcHkyIFtyZXN1bHRdOyByZXN1bHQgKyspCi0gICAgaWYgKGNvcHkxIFtyZXN1bHRdID09IDApCi0gICAgICB7Ci0JcmVzdWx0ICo9IDEwOwotCWJyZWFrOwotICAgICAgfQotICAKLSAgZnJlZSAoY29weTEpOwotICBmcmVlIChjb3B5Mik7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogU2V0IGJ5IGNsb3Nlc3RfdGFyZ2V0X21hdGNoKCkgYmVsb3cuICAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKiB3aW5uZXI7Ci0KLS8qIFNjYW4gYWxsIHRoZSB2YWxpZCBiZmQgdGFyZ2V0cyBsb29raW5nIGZvciBvbmUgdGhhdCBoYXMgdGhlIGVuZGlhbm5lc3MKLSAgIHJlcXVpcmVtZW50IHRoYXQgd2FzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgaXMgdGhlIG5lYXJlc3QKLSAgIG1hdGNoIHRvIHRoZSBvcmlnaW5hbCBvdXRwdXQgdGFyZ2V0LiAgKi8KLXN0YXRpYyBpbnQKLWNsb3Nlc3RfdGFyZ2V0X21hdGNoICh0YXJnZXQsIGRhdGEpCi0gICAgIGNvbnN0IGJmZF90YXJnZXQgKiB0YXJnZXQ7Ci0gICAgIHZvaWQgKiBkYXRhOwotewotICBjb25zdCBiZmRfdGFyZ2V0ICogb3JpZ2luYWwgPSAoY29uc3QgYmZkX3RhcmdldCAqKSBkYXRhOwotICAKLSAgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0JJRyAmJiB0YXJnZXQtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX0JJRykKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9MSVRUTEUgJiYgdGFyZ2V0LT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogTXVzdCBiZSB0aGUgc2FtZSBmbGF2b3VyLiAgKi8KLSAgaWYgKHRhcmdldC0+Zmxhdm91ciAhPSBvcmlnaW5hbC0+Zmxhdm91cikKLSAgICByZXR1cm4gMDsKLQotICAvKiBJZiB3ZSBoYXZlIG5vdCBmb3VuZCBhIHBvdGVudGlhbCB3aW5uZXIgeWV0LCB0aGVuIHJlY29yZCB0aGlzIG9uZS4gICovCi0gIGlmICh3aW5uZXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB3aW5uZXIgPSB0YXJnZXQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogT2ggZGVhciwgd2Ugbm93IGhhdmUgdHdvIHBvdGVudGlhbCBjYW5kaWRhdGVzIGZvciBhIHN1Y2Nlc3NmdWwgbWF0Y2guCi0gICAgIENvbXBhcmUgdGhlaXIgbmFtZXMgYW5kIGNob29zZSB0aGUgYmV0dGVyIG9uZS4gKi8KLSAgaWYgKG5hbWVfY29tcGFyZSAodGFyZ2V0LT5uYW1lLCBvcmlnaW5hbC0+bmFtZSkgPiBuYW1lX2NvbXBhcmUgKHdpbm5lci0+bmFtZSwgb3JpZ2luYWwtPm5hbWUpKQotICAgIHdpbm5lciA9IHRhcmdldDsKLQotICAvKiBLZWVwIG9uIHNlYXJjaGluZyB1bnRpbCB3cWUgaGF2ZSBjaGVja2VkIHRoZW0gYWxsLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB0aGUgQkZEIHRhcmdldCBmb3JtYXQgb2YgdGhlIGZpcnN0IGlucHV0IGZpbGUuICAqLwotc3RhdGljIGNoYXIgKgotZ2V0X2ZpcnN0X2lucHV0X3RhcmdldCAoKQotewotICBjaGFyICogdGFyZ2V0ID0gTlVMTDsKLQotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAocykKLSAgICB7Ci0gICAgICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bQotCSAgJiYgcy0+cmVhbCkKLQl7Ci0JICBsZGZpbGVfb3Blbl9maWxlIChzKTsKLQkgIAotCSAgaWYgKHMtPnRoZV9iZmQgIT0gTlVMTAotCSAgICAgICYmIGJmZF9jaGVja19mb3JtYXQgKHMtPnRoZV9iZmQsIGJmZF9vYmplY3QpKQotCSAgICB7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF90YXJnZXQgKHMtPnRoZV9iZmQpOwotCSAgCi0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBiZmQgKgotb3Blbl9vdXRwdXQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotewotICBiZmQgKiBvdXRwdXQ7Ci0KLSAgLyogSGFzIHRoZSB1c2VyIHRvbGQgdXMgd2hpY2ggb3V0cHV0IGZvcm1hdCB0byB1c2UgPyAgKi8KLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBObyAtIGhhcyB0aGUgY3VycmVudCB0YXJnZXQgYmVlbiBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgPyAgKi8KLSAgICAgIGlmIChjdXJyZW50X3RhcmdldCAhPSBkZWZhdWx0X3RhcmdldCkKLQlvdXRwdXRfdGFyZ2V0ID0gY3VycmVudF90YXJnZXQ7Ci0KLSAgICAgIC8qIE5vIC0gY2FuIHdlIGRldGVybWluZSB0aGUgZm9ybWF0IG9mIHRoZSBmaXJzdCBpbnB1dCBmaWxlID8gKi8KLSAgICAgIGVsc2UKLQl7Ci0JICBvdXRwdXRfdGFyZ2V0ID0gZ2V0X2ZpcnN0X2lucHV0X3RhcmdldCAoKTsKLQotCSAgLyogRmFpbGVkIC0gdXNlIHRoZSBkZWZhdWx0IG91dHB1dCB0YXJnZXQuICAqLwotCSAgaWYgKG91dHB1dF90YXJnZXQgPT0gTlVMTCkKLQkgICAgb3V0cHV0X3RhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OwotCX0KLSAgICB9Ci0gIAotICAvKiBIYXMgdGhlIHVzZXIgcmVxdWVzdGVkIGEgcGFydGljdWxhciBlbmRpYW5uZXNzIG9uIHRoZSBjb21tYW5kIGxpbmUgPyAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gIT0gRU5ESUFOX1VOU0VUKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF90YXJnZXQgKiB0YXJnZXQ7Ci0gICAgICBlbnVtIGJmZF9lbmRpYW4gZGVzaXJlZF9lbmRpYW47Ci0KLSAgICAgIC8qIEdldCB0aGUgY2hvc2VuIHRhcmdldC4gICovCi0gICAgICB0YXJnZXQgPSBiZmRfc2VhcmNoX2Zvcl90YXJnZXQgKGdldF90YXJnZXQsICh2b2lkICopIG91dHB1dF90YXJnZXQpOwotCi0gICAgICBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fQklHKQotCWRlc2lyZWRfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0gICAgICBlbHNlCi0JZGVzaXJlZF9lbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLSAgICAgIAotICAgICAgLyogU2VlIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSB3cm9uZyBlbmRpYW5uZXNzLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbgotCSBpZiB0aGUgbGlua2VyIHNjcmlwdCBoYXMgcHJvdmlkZWQgYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGFsdGVybmF0aXZlcywKLQkgYnV0IHNvbWUgc2NyaXBzIGRvbid0IGRvIHRoaXMuICAqLwotICAgICAgaWYgKHRhcmdldC0+Ynl0ZW9yZGVyICE9IGRlc2lyZWRfZW5kaWFuKQotCXsKLQkgIC8qIElmIGl0IGRvZXMsIHRoZW4gc2VlIGlmIHRoZSB0YXJnZXQgcHJvdmlkZXMKLQkgICAgIGFuIGFsdGVybmF0aXZlIHdpdGggdGhlIGNvcnJlY3QgZW5kaWFubmVzcy4gICovCi0JICBpZiAodGFyZ2V0LT5hbHRlcm5hdGl2ZV90YXJnZXQgIT0gTlVMTAotCSAgICAgICYmICh0YXJnZXQtPmFsdGVybmF0aXZlX3RhcmdldC0+Ynl0ZW9yZGVyID09IGRlc2lyZWRfZW5kaWFuKSkKLQkgICAgb3V0cHV0X3RhcmdldCA9IHRhcmdldC0+YWx0ZXJuYXRpdmVfdGFyZ2V0LT5uYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVHJ5IHRvIGZpbmQgYSB0YXJnZXQgYXMgc2ltaWxhciBhcyBwb3NzaWJsZSB0byB0aGUgZGVmYXVsdAotCQkgdGFyZ2V0LCBidXQgd2hpY2ggaGFzIHRoZSBkZXNpcmVkIGVuZGlhbiBjaGFyYWN0ZXJpc3RpYy4gICovCi0JICAgICAgKHZvaWQpIGJmZF9zZWFyY2hfZm9yX3RhcmdldCAoY2xvc2VzdF90YXJnZXRfbWF0Y2gsICh2b2lkICopIHRhcmdldCk7Ci0JICAgICAgCi0JICAgICAgLyogT2ggZGVhciAtIHdlIGNvdWxkIG5vdCBmaW5kIGFueSB0YXJnZXRzIHRoYXQgc2F0aXNmeSBvdXIgcmVxdWlyZW1lbnRzLiAgKi8KLQkgICAgICBpZiAod2lubmVyID09IE5VTEwpCi0JCWVpbmZvIChfKCIlUDogd2FybmluZzogY291bGQgbm90IGZpbmQgYW55IHRhcmdldHMgdGhhdCBtYXRjaCBlbmRpYW5uZXNzIHJlcXVpcmVtZW50XG4iKSk7Ci0JICAgICAgZWxzZQotCQlvdXRwdXRfdGFyZ2V0ID0gd2lubmVyLT5uYW1lOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICAgIAotICBvdXRwdXQgPSBiZmRfb3BlbncgKG5hbWUsIG91dHB1dF90YXJnZXQpOwotCi0gIGlmIChvdXRwdXQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCkKLQllaW5mbyAoXygiJVAlRjogdGFyZ2V0ICVzIG5vdCBmb3VuZFxuIiksIG91dHB1dF90YXJnZXQpOwotCi0gICAgICBlaW5mbyAoXygiJVAlRjogY2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXM6ICVFXG4iKSwgbmFtZSk7Ci0gICAgfQotCi0gIGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlID0gdHJ1ZTsKLQotICAvKiAgb3V0cHV0LT5mbGFncyB8PSBEX1BBR0VEOyovCi0KLSAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKG91dHB1dCwgYmZkX29iamVjdCkpCi0gICAgZWluZm8gKF8oIiVQJUY6JXM6IGNhbiBub3QgbWFrZSBvYmplY3QgZmlsZTogJUVcbiIpLCBuYW1lKTsKLSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG91dHB1dCwKLQkJCSAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLAotCQkJICAgbGRmaWxlX291dHB1dF9tYWNoaW5lKSkKLSAgICBlaW5mbyAoXygiJVAlRjolczogY2FuIG5vdCBzZXQgYXJjaGl0ZWN0dXJlOiAlRVxuIiksIG5hbWUpOwotCi0gIGxpbmtfaW5mby5oYXNoID0gYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKG91dHB1dCk7Ci0gIGlmIChsaW5rX2luZm8uaGFzaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogY2FuIG5vdCBjcmVhdGUgbGluayBoYXNoIHRhYmxlOiAlRVxuIikpOwotCi0gIGJmZF9zZXRfZ3Bfc2l6ZSAob3V0cHV0LCBnX3N3aXRjaF92YWx1ZSk7Ci0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sZGxhbmdfb3Blbl9vdXRwdXQgKHN0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHN0YXRlbWVudDsKLXsKLSAgc3dpdGNoIChzdGF0ZW1lbnQtPmhlYWRlci50eXBlKQotICAgIHsKLSAgICBjYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotICAgICAgQVNTRVJUIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCk7Ci0gICAgICBvdXRwdXRfYmZkID0gb3Blbl9vdXRwdXQgKHN0YXRlbWVudC0+b3V0cHV0X3N0YXRlbWVudC5uYW1lKTsKLSAgICAgIGxkZW11bF9zZXRfb3V0cHV0X2FyY2ggKCk7Ci0gICAgICBpZiAoY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCAmJiAhbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlvdXRwdXRfYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotICAgICAgZWxzZQotCW91dHB1dF9iZmQtPmZsYWdzICY9IH5EX1BBR0VEOwotICAgICAgaWYgKGNvbmZpZy50ZXh0X3JlYWRfb25seSkKLQlvdXRwdXRfYmZkLT5mbGFncyB8PSBXUF9URVhUOwotICAgICAgZWxzZQotCW91dHB1dF9iZmQtPmZsYWdzICY9IH5XUF9URVhUOwotICAgICAgaWYgKGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQpCi0Jb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gQkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICAgIGVsc2UKLQlvdXRwdXRfYmZkLT5mbGFncyAmPSB+QkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIGN1cnJlbnRfdGFyZ2V0ID0gc3RhdGVtZW50LT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIE9wZW4gYWxsIHRoZSBpbnB1dCBmaWxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vcGVuX2lucHV0X2JmZHMgKHMsIGZvcmNlKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBib29sZWFuIGZvcmNlOwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgb3Blbl9pbnB1dF9iZmRzIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsIGZvcmNlKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIG9wZW5faW5wdXRfYmZkcyAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsIGZvcmNlKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgLyogTWF5YmUgd2Ugc2hvdWxkIGxvYWQgdGhlIGZpbGUncyBzeW1ib2xzICovCi0JICBpZiAocy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUKLQkgICAgICAmJiAhIHdpbGRjYXJkcCAocy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUpKQotCSAgICAodm9pZCkgbG9va3VwX25hbWUgKHMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lKTsKLQkgIG9wZW5faW5wdXRfYmZkcyAocy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwgZm9yY2UpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzOwotCi0JICAgIC8qIFdlIG11c3QgY29udGludWFsbHkgc2VhcmNoIHRoZSBlbnRyaWVzIGluIHRoZSBncm91cAotICAgICAgICAgICAgICAgdW50aWwgbm8gbmV3IHN5bWJvbHMgYXJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgc3ltYm9scy4gICovCi0KLQkgICAgZG8KLQkgICAgICB7Ci0JCXVuZGVmcyA9IGxpbmtfaW5mby5oYXNoLT51bmRlZnNfdGFpbDsKLQkJb3Blbl9pbnB1dF9iZmRzIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwgdHJ1ZSk7Ci0JICAgICAgfQotCSAgICB3aGlsZSAodW5kZWZzICE9IGxpbmtfaW5mby5oYXNoLT51bmRlZnNfdGFpbCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCSAgY3VycmVudF90YXJnZXQgPSBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGlmIChzLT5pbnB1dF9zdGF0ZW1lbnQucmVhbCkKLQkgICAgewotCSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0KLQkgICAgICBzLT5pbnB1dF9zdGF0ZW1lbnQudGFyZ2V0ID0gY3VycmVudF90YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGEgZ3JvdXAsIGFuZCB0aGlzCi0gICAgICAgICAgICAgICAgIGlzIGFuIGFyY2hpdmUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBzZWFyY2hlZCwgdGhlbgotICAgICAgICAgICAgICAgICBmb3JjZSBpdCB0byBiZSByZXNlYXJjaGVkLiAgKi8KLQkgICAgICBpZiAoZm9yY2UKLQkJICAmJiBzLT5pbnB1dF9zdGF0ZW1lbnQubG9hZGVkCi0JCSAgJiYgYmZkX2NoZWNrX2Zvcm1hdCAocy0+aW5wdXRfc3RhdGVtZW50LnRoZV9iZmQsCi0JCQkJICAgICAgIGJmZF9hcmNoaXZlKSkKLQkJcy0+aW5wdXRfc3RhdGVtZW50LmxvYWRlZCA9IGZhbHNlOwotCi0JICAgICAgbGFuZ19saXN0X2luaXQgKCZhZGQpOwotCi0JICAgICAgbG9hZF9zeW1ib2xzICgmcy0+aW5wdXRfc3RhdGVtZW50LCAmYWRkKTsKLQotCSAgICAgIGlmIChhZGQuaGVhZCAhPSBOVUxMKQotCQl7Ci0JCSAgKmFkZC50YWlsID0gcy0+bmV4dDsKLQkJICBzLT5uZXh0ID0gYWRkLmhlYWQ7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIElmIHRoZXJlIGFyZSBbQ09NTU9OU10gc3RhdGVtZW50cywgcHV0IGEgd2lsZCBvbmUgaW50byB0aGUgYnNzIHNlY3Rpb24gKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfcmVhc29uYWJsZV9kZWZhdWx0cyAoKQotewotI2lmIDAKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLnRleHQiKTsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLmRhdGEiKTsKLQotICBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID0KLSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIuYnNzIik7Ci0KLQotICBpZiAocGxhY2VkX2NvbW1vbnMgPT0gZmFsc2UpCi0gICAgewotICAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPQotICAgICAgbmV3X3N0YXQgKGxhbmdfd2lsZF9zdGF0ZW1lbnQsCi0JCSZkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLT5jaGlsZHJlbik7Ci0KLSAgICAgIG5ldy0+c2VjdGlvbl9uYW1lID0gIkNPTU1PTiI7Ci0gICAgICBuZXctPmZpbGVuYW1lID0gKGNoYXIgKikgTlVMTDsKLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbmV3LT5jaGlsZHJlbik7Ci0gICAgfQotI2VuZGlmCi0KLX0KLQotLyoKLSBBZGQgdGhlIHN1cHBsaWVkIG5hbWUgdG8gdGhlIHN5bWJvbCB0YWJsZSBhcyBhbiB1bmRlZmluZWQgcmVmZXJlbmNlLgotIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBjaGFpbiBhcyB3ZSBvcGVuIGlucHV0IGJmZHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3QKLXsKLSAgc3RydWN0IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0ICpuZXh0OwotICBjaGFyICpuYW1lOwotfSAgICAgICAgICAgICAgICAgICAgICAgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZTsKLQotc3RhdGljIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKmxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0KLXZvaWQKLWxkbGFuZ19hZGRfdW5kZWYgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Ci17Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKm5ldyA9Ci0gICAgKChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICopCi0gICAgIHN0YXRfYWxsb2MgKHNpemVvZiAobGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSkpKTsKLQotICBuZXctPm5leHQgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOwotICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkID0gbmV3OwotCi0gIG5ldy0+bmFtZSA9IGJ1eXN0cmluZyAobmFtZSk7Ci19Ci0KLS8qIFJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZHMgY3JlYXRlZCBhYm92ZSBhbmQgcGxhY2UgdGhlbQotICAgaW50byB0aGUgbGlua2VyIGhhc2ggdGFibGUgYXMgdW5kZWZpbmVkIHN5bWJvbHMgYmVsb25naW5nIHRvIHRoZQotICAgc2NyaXB0IGZpbGUuCi0qLwotc3RhdGljIHZvaWQKLWxhbmdfcGxhY2VfdW5kZWZpbmVkcyAoKQotewotICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICpwdHI7Ci0KLSAgZm9yIChwdHIgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOwotICAgICAgIHB0ciAhPSAobGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqKSBOVUxMOwotICAgICAgIHB0ciA9IHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgcHRyLT5uYW1lLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQllaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JewotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+dS51bmRlZi5hYmZkID0gTlVMTDsKLQkgIGJmZF9saW5rX2FkZF91bmRlZiAobGlua19pbmZvLmhhc2gsIGgpOwotCX0KLSAgICB9Ci19Ci0KLS8qIE9wZW4gaW5wdXQgZmlsZXMgYW5kIGF0dGF0Y2ggdG8gb3V0cHV0IHNlY3Rpb25zICovCi1zdGF0aWMgdm9pZAotbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyAocywgdGFyZ2V0LCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci17Ci0gIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0JewotCi0KLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIHdpbGQgKCZzLT53aWxkX3N0YXRlbWVudCwgcy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLAotCQlzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZSwgdGFyZ2V0LAotCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCi0JICBicmVhazsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCQl0YXJnZXQsCi0JCQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkJdGFyZ2V0LAotCQkJCQkmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCSAgdGFyZ2V0ID0gcy0+dGFyZ2V0X3N0YXRlbWVudC50YXJnZXQ7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkJdGFyZ2V0LAotCQkJCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgIT0gTlVMTAotCSAgICAgICYmIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgaW5pdF9vcyAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAhPSBOVUxMCi0JICAgICAgJiYgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBpbml0X29zIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCi0JICAvKiBNYWtlIHN1cmUgdGhhdCBhbnkgc2VjdGlvbnMgbWVudGlvbmVkIGluIHRoZSBhc3NpZ25tZW50Ci0gICAgICAgICAgICAgYXJlIGluaXRpYWxpemVkLiAgKi8KLQkgIGV4cF9pbml0X29zIChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X2VudW06Ci0JICBGQUlMICgpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JICAvKiBNYXJrIHRoZSBzcGVjaWZpZWQgc2VjdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBhZGRyZXNzICovCi0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0KLQkgICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAKLQkJKHMtPmFkZHJlc3Nfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSk7Ci0KLQkgICAgaWYgKG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIGluaXRfb3MgKG9zKTsKLQkgICAgb3MtPmFkZHJfdHJlZSA9IHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3M7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpCi0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKLSAgaW50IGxlbjsKLQotICBpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICE9IGFic19vdXRwdXRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBtaW5mbyAoIlxuJXMiLCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPm5hbWUpOwotCi0gICAgICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotCXsKLQkgIHByaW50X2RvdCA9IHNlY3Rpb24tPnZtYTsKLQotCSAgbGVuID0gc3RybGVuIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPm5hbWUpOwotCSAgaWYgKGxlbiA+PSBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCAtIDEpCi0JICAgIHsKLQkgICAgICBwcmludF9ubCAoKTsKLQkgICAgICBsZW4gPSAwOwotCSAgICB9Ci0JICB3aGlsZSAobGVuIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEgpCi0JICAgIHsKLQkgICAgICBwcmludF9zcGFjZSAoKTsKLQkgICAgICArK2xlbjsKLQkgICAgfQotCi0JICBtaW5mbyAoIjB4JVYgJVciLCBzZWN0aW9uLT52bWEsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQkgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmxvYWRfYmFzZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBhZGRyOwotCi0JICAgICAgYWRkciA9IGV4cF9nZXRfYWJzX2ludCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5sb2FkX2Jhc2UsIDAsCi0JCQkJICAgICAgImxvYWQgYmFzZSIsIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0JICAgICAgbWluZm8gKF8oIiBsb2FkIGFkZHJlc3MgMHglViIpLCBhZGRyKTsKLQkgICAgfQotCX0KLQotICAgICAgcHJpbnRfbmwgKCk7Ci0gICAgfQotCi0gIHByaW50X3N0YXRlbWVudF9saXN0IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmNoaWxkcmVuLmhlYWQsCi0JCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXNzaWdubWVudCAoYXNzaWdubWVudCwgb3V0cHV0X3NlY3Rpb24pCi0gICAgIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqIGFzc2lnbm1lbnQ7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbjsKLXsKLSAgaW50IGk7Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotICAgIHByaW50X3NwYWNlICgpOwotCi0gIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKGFzc2lnbm1lbnQtPmV4cC0+YXNzaWduLnNyYywgb3V0cHV0X3NlY3Rpb24sCi0JCQkgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwgcHJpbnRfZG90LCAmcHJpbnRfZG90KTsKLSAgaWYgKHJlc3VsdC52YWxpZF9wKQotICAgIG1pbmZvICgiMHglViIsIHJlc3VsdC52YWx1ZSArIHJlc3VsdC5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG1pbmZvICgiKnVuZGVmKiAgICIpOwotI2lmZGVmIEJGRDY0Ci0gICAgICBtaW5mbyAoIiAgICAgICAgIik7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgbWluZm8gKCIgICAgICAgICAgICAgICAgIik7Ci0KLSAgZXhwX3ByaW50X3RyZWUgKGFzc2lnbm1lbnQtPmV4cCk7Ci0KLSAgcHJpbnRfbmwgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnB1dF9zdGF0ZW1lbnQgKHN0YXRtKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICogc3RhdG07Ci17Ci0gIGlmIChzdGF0bS0+ZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJMT0FEICVzXG4iLCBzdGF0bS0+ZmlsZW5hbWUpOwotICAgIH0KLX0KLQotLyogUHJpbnQgYWxsIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkCi0gICB2aWEgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuIAotcHJpbnRfb25lX3N5bWJvbCAoaGFzaF9lbnRyeSwgcHRyKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFzaF9lbnRyeTsKLSAgICAgUFRSIHB0cjsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IChhc2VjdGlvbiAqKSBwdHI7Ci0KLSAgaWYgKChoYXNoX2VudHJ5LT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgIHx8IGhhc2hfZW50cnktPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgc2VjID09IGhhc2hfZW50cnktPnUuZGVmLnNlY3Rpb24pCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotCXByaW50X3NwYWNlICgpOwotICAgICAgbWluZm8gKCIweCVWICAgIiwKLQkgICAgIChoYXNoX2VudHJ5LT51LmRlZi52YWx1ZQotCSAgICAgICsgaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCSAgICAgICsgaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkpOwotCi0gICAgICBtaW5mbyAoIiAgICAgICAgICAgICAlVFxuIiwgaGFzaF9lbnRyeS0+cm9vdC5zdHJpbmcpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW5wdXQgc2VjdGlvbiB0byB0aGUgbWFwIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5wdXRfc2VjdGlvbiAoaW4pCi0gICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICogaW47Ci17Ci0gIGFzZWN0aW9uICppID0gaW4tPnNlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGktPl9jb29rZWRfc2l6ZSAhPSAwID8gaS0+X2Nvb2tlZF9zaXplIDogaS0+X3Jhd19zaXplOwotICB1bnNpZ25lZCBvcGIgPSBiZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSAobGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIAotCQkJCQkJbGRmaWxlX291dHB1dF9tYWNoaW5lKTsKLSAgaWYgKHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLQotICAgICAgbWluZm8gKCIlcyIsIGktPm5hbWUpOwotCi0gICAgICBpZiAoaS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBpbnQgbGVuOwotCi0JICBsZW4gPSAxICsgc3RybGVuIChpLT5uYW1lKTsKLQkgIGlmIChsZW4gPj0gU0VDVElPTl9OQU1FX01BUF9MRU5HVEggLSAxKQotCSAgICB7Ci0JICAgICAgcHJpbnRfbmwgKCk7Ci0JICAgICAgbGVuID0gMDsKLQkgICAgfQotCSAgd2hpbGUgKGxlbiA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0JICAgICAgKytsZW47Ci0JICAgIH0KLQotCSAgbWluZm8gKCIweCVWICVXICVCXG4iLAotCQkgaS0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGktPm91dHB1dF9vZmZzZXQsIHNpemUgLyBvcGIsCi0JCSBpLT5vd25lcik7Ci0KLQkgIGlmIChpLT5fY29va2VkX3NpemUgIT0gMCAmJiBpLT5fY29va2VkX3NpemUgIT0gaS0+X3Jhd19zaXplKQotCSAgICB7Ci0JICAgICAgbGVuID0gU0VDVElPTl9OQU1FX01BUF9MRU5HVEggKyAzOwotI2lmZGVmIEJGRDY0Ci0JICAgICAgbGVuICs9IDE2OwotI2Vsc2UKLQkgICAgICBsZW4gKz0gODsKLSNlbmRpZgotCSAgICAgIHdoaWxlIChsZW4gPiAwKQotCQl7Ci0JCSAgcHJpbnRfc3BhY2UgKCk7Ci0JCSAgLS1sZW47Ci0JCX0KLQotCSAgICAgIG1pbmZvIChfKCIlVyAoc2l6ZSBiZWZvcmUgcmVsYXhpbmcpXG4iKSwgaS0+X3Jhd19zaXplKTsKLQkgICAgfQotCi0JICBiZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgcHJpbnRfb25lX3N5bWJvbCwgKFBUUikgaSk7Ci0KLQkgIHByaW50X2RvdCA9IGktPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpLT5vdXRwdXRfb2Zmc2V0ICsgc2l6ZSAvIG9wYjsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZmlsbF9zdGF0ZW1lbnQgKGZpbGwpCi0gICAgIGxhbmdfZmlsbF9zdGF0ZW1lbnRfdHlwZSAqIGZpbGw7Ci17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiBGSUxMIG1hc2sgMHgleFxuIiwgZmlsbC0+ZmlsbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9kYXRhX3N0YXRlbWVudCAoZGF0YSkKLSAgICAgbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlICogZGF0YTsKLXsKLSAgaW50IGk7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBvcGIgPSBiZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSAobGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIAotCQkJCQkJbGRmaWxlX291dHB1dF9tYWNoaW5lKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEg7IGkrKykKLSAgICBwcmludF9zcGFjZSAoKTsKLQotICBhZGRyID0gZGF0YS0+b3V0cHV0X3ZtYTsKLSAgaWYgKGRhdGEtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgYWRkciArPSBkYXRhLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHN3aXRjaCAoZGF0YS0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgQllURToKLSAgICAgIHNpemUgPSBCWVRFX1NJWkU7Ci0gICAgICBuYW1lID0gIkJZVEUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSE9SVDoKLSAgICAgIHNpemUgPSBTSE9SVF9TSVpFOwotICAgICAgbmFtZSA9ICJTSE9SVCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExPTkc6Ci0gICAgICBzaXplID0gTE9OR19TSVpFOwotICAgICAgbmFtZSA9ICJMT05HIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUVVBRDoKLSAgICAgIHNpemUgPSBRVUFEX1NJWkU7Ci0gICAgICBuYW1lID0gIlFVQUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTUVVBRDoKLSAgICAgIHNpemUgPSBRVUFEX1NJWkU7Ci0gICAgICBuYW1lID0gIlNRVUFEIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBtaW5mbyAoIjB4JVYgJVcgJXMgMHgldiIsIGFkZHIsIHNpemUsIG5hbWUsIGRhdGEtPnZhbHVlKTsKLQotICBpZiAoZGF0YS0+ZXhwLT50eXBlLm5vZGVfY2xhc3MgIT0gZXRyZWVfdmFsdWUpCi0gICAgewotICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0gICAgICBleHBfcHJpbnRfdHJlZSAoZGF0YS0+ZXhwKTsKLSAgICB9Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfZG90ID0gYWRkciArIHNpemUgLyBvcGI7Ci0KLX0KLQotLyogUHJpbnQgYW4gYWRkcmVzcyBzdGF0ZW1lbnQuICBUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IG9wdGlvbnMgbGlrZQotICAgLVR0ZXh0LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3Nfc3RhdGVtZW50IChhZGRyZXNzKQotICAgICBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGUgKmFkZHJlc3M7Ci17Ci0gIG1pbmZvIChfKCJBZGRyZXNzIG9mIHNlY3Rpb24gJXMgc2V0IHRvICIpLCBhZGRyZXNzLT5zZWN0aW9uX25hbWUpOwotICBleHBfcHJpbnRfdHJlZSAoYWRkcmVzcy0+YWRkcmVzcyk7Ci0gIHByaW50X25sICgpOwotfQotCi0vKiBQcmludCBhIHJlbG9jIHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWxvY19zdGF0ZW1lbnQgKHJlbG9jKQotICAgICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyZWxvYzsKLXsKLSAgaW50IGk7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICB1bnNpZ25lZCBvcGIgPSBiZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSAobGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIAotCQkJCQkJbGRmaWxlX291dHB1dF9tYWNoaW5lKTsgCi0KLSAgZm9yIChpID0gMDsgaSA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIOyBpKyspCi0gICAgcHJpbnRfc3BhY2UgKCk7Ci0KLSAgYWRkciA9IHJlbG9jLT5vdXRwdXRfdm1hOwotICBpZiAocmVsb2MtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgYWRkciArPSByZWxvYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvYy0+aG93dG8pOwotCi0gIG1pbmZvICgiMHglViAlVyBSRUxPQyAlcyAiLCBhZGRyLCBzaXplLCByZWxvYy0+aG93dG8tPm5hbWUpOwotCi0gIGlmIChyZWxvYy0+bmFtZSAhPSBOVUxMKQotICAgIG1pbmZvICgiJXMrIiwgcmVsb2MtPm5hbWUpOwotICBlbHNlCi0gICAgbWluZm8gKCIlcysiLCByZWxvYy0+c2VjdGlvbi0+bmFtZSk7Ci0KLSAgZXhwX3ByaW50X3RyZWUgKHJlbG9jLT5hZGRlbmRfZXhwKTsKLQotICBwcmludF9ubCAoKTsKLQotICBwcmludF9kb3QgPSBhZGRyICsgc2l6ZSAvIG9wYjsKLX0gIAotCi1zdGF0aWMgdm9pZAotcHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQgKHMpCi0gICAgIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgaW50IGxlbjsKLSAgYmZkX3ZtYSBhZGRyOwotICB1bnNpZ25lZCBvcGIgPSBiZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSAobGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIAotCQkJCQkJbGRmaWxlX291dHB1dF9tYWNoaW5lKTsgCi0KLSAgbWluZm8gKCIgKmZpbGwqIik7Ci0KLSAgbGVuID0gc2l6ZW9mICIgKmZpbGwqIiAtIDE7Ci0gIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLSAgICAgICsrbGVuOwotICAgIH0KLQotICBhZGRyID0gcy0+b3V0cHV0X29mZnNldDsKLSAgaWYgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgYWRkciArPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICBtaW5mbyAoIjB4JVYgJVciLCBhZGRyLCBzLT5zaXplKTsKLQotICBpZiAocy0+ZmlsbCAhPSAwKQotICAgIG1pbmZvICgiICV1Iiwgcy0+ZmlsbCk7Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfZG90ID0gYWRkciArIHMtPnNpemUgLyBvcGI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF93aWxkX3N0YXRlbWVudCAodywgb3MpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqIHc7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvczsKLXsKLSAgcHJpbnRfc3BhY2UgKCk7Ci0KLSAgaWYgKHctPmZpbGVuYW1lc19zb3J0ZWQpCi0gICAgbWluZm8gKCJTT1JUKCIpOwotICBpZiAody0+ZXhjbHVkZV9maWxlbmFtZV9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgbmFtZV9saXN0ICp0bXA7Ci0gICAgICBtaW5mbyAoIkVYQ0xVREVfRklMRSAoICVzIiwgdy0+ZXhjbHVkZV9maWxlbmFtZV9saXN0LT5uYW1lKTsKLSAgICAgIGZvciAodG1wPXctPmV4Y2x1ZGVfZmlsZW5hbWVfbGlzdC0+bmV4dDsgdG1wOyB0bXAgPSB0bXAtPm5leHQpCi0gICAgICAgIG1pbmZvICgiLCAlcyIsIHRtcC0+bmFtZSk7Ci0gICAgICBtaW5mbyAoIikiKTsKLSAgICAgfQotICAgaWYgKHctPmZpbGVuYW1lICE9IE5VTEwpCi0gICAgbWluZm8gKCIlcyIsIHctPmZpbGVuYW1lKTsKLSAgZWxzZQotICAgIG1pbmZvICgiKiIpOwotICBpZiAody0+ZmlsZW5hbWVzX3NvcnRlZCkKLSAgICBtaW5mbyAoIikiKTsKLQotICBtaW5mbyAoIigiKTsKLSAgaWYgKHctPnNlY3Rpb25zX3NvcnRlZCkKLSAgICBtaW5mbyAoIlNPUlQoIik7Ci0gIGlmICh3LT5zZWN0aW9uX25hbWUgIT0gTlVMTCkKLSAgICBtaW5mbyAoIiVzIiwgdy0+c2VjdGlvbl9uYW1lKTsKLSAgZWxzZQotICAgIG1pbmZvICgiKiIpOwotICBpZiAody0+c2VjdGlvbnNfc29ydGVkKQotICAgIG1pbmZvICgiKSIpOwotICBtaW5mbyAoIikiKTsKLQotICBwcmludF9ubCAoKTsKLQotICBwcmludF9zdGF0ZW1lbnRfbGlzdCAody0+Y2hpbGRyZW4uaGVhZCwgb3MpOwotfQotCi0vKiBQcmludCBhIGdyb3VwIHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9ncm91cCAocywgb3MpCi0gICAgIGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotewotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJTVEFSVCBHUk9VUFxuIik7Ci0gIHByaW50X3N0YXRlbWVudF9saXN0IChzLT5jaGlsZHJlbi5oZWFkLCBvcyk7Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIkVORCBHUk9VUFxuIik7Ci19Ci0KLS8qIFByaW50IHRoZSBsaXN0IG9mIHN0YXRlbWVudHMgaW4gUy4KLSAgIFRoaXMgY2FuIGJlIGNhbGxlZCBmb3IgYW55IHN0YXRlbWVudCB0eXBlLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N0YXRlbWVudF9saXN0IChzLCBvcykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci17Ci0gIHdoaWxlIChzICE9IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRfc3RhdGVtZW50IChzLCBvcyk7Ci0gICAgICBzID0gcy0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIFByaW50IHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gc3RhdGVtZW50IGxpc3QgUy4KLSAgIFRoaXMgY2FuIGJlIGNhbGxlZCBmb3IgYW55IHN0YXRlbWVudCB0eXBlLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N0YXRlbWVudCAocywgb3MpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotewotICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCBfKCJGYWlsIHdpdGggJWRcbiIpLCBzLT5oZWFkZXIudHlwZSk7Ci0gICAgICBGQUlMICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLSAgICAgIGlmIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQgIT0gTlVMTCkKLQl7Ci0JICBpZiAoY29uc3RydWN0b3JzX3NvcnRlZCkKLQkgICAgbWluZm8gKCIgU09SVCAoQ09OU1RSVUNUT1JTKVxuIik7Ci0JICBlbHNlCi0JICAgIG1pbmZvICgiIENPTlNUUlVDVE9SU1xuIik7Ci0JICBwcmludF9zdGF0ZW1lbnRfbGlzdCAoY29uc3RydWN0b3JfbGlzdC5oZWFkLCBvcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF93aWxkX3N0YXRlbWVudCAoJnMtPndpbGRfc3RhdGVtZW50LCBvcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2FkZHJlc3Nfc3RhdGVtZW50ICgmcy0+YWRkcmVzc19zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtOgotICAgICAgbWluZm8gKCIgQ1JFQVRFX09CSkVDVF9TWU1CT0xTXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19maWxsX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfZmlsbF9zdGF0ZW1lbnQgKCZzLT5maWxsX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2RhdGFfc3RhdGVtZW50ICgmcy0+ZGF0YV9zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfcmVsb2Nfc3RhdGVtZW50ICgmcy0+cmVsb2Nfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW06Ci0gICAgICBwcmludF9pbnB1dF9zZWN0aW9uICgmcy0+aW5wdXRfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X3BhZGRpbmdfc3RhdGVtZW50ICgmcy0+cGFkZGluZ19zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICgmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfYXNzaWdubWVudCAoJnMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LCBvcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotICAgICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiVEFSR0VUKCVzKVxuIiwgcy0+dGFyZ2V0X3N0YXRlbWVudC50YXJnZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIG1pbmZvICgiT1VUUFVUKCVzIiwgcy0+b3V0cHV0X3N0YXRlbWVudC5uYW1lKTsKLSAgICAgIGlmIChvdXRwdXRfdGFyZ2V0ICE9IE5VTEwpCi0JbWluZm8gKCIgJXMiLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIG1pbmZvICgiKVxuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9pbnB1dF9zdGF0ZW1lbnQgKCZzLT5pbnB1dF9zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfZ3JvdXAgKCZzLT5ncm91cF9zdGF0ZW1lbnQsIG9zKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19hZmlsZV9hc2VjdGlvbl9wYWlyX3N0YXRlbWVudF9lbnVtOgotICAgICAgRkFJTCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N0YXRlbWVudHMgKCkKLXsKLSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHN0YXRlbWVudF9saXN0LmhlYWQsIGFic19vdXRwdXRfc2VjdGlvbik7Ci19Ci0KLS8qIFByaW50IHRoZSBmaXJzdCBOIHN0YXRlbWVudHMgaW4gc3RhdGVtZW50IGxpc3QgUyB0byBTVERFUlIuCi0gICBJZiBOID09IDAsIG5vdGhpbmcgaXMgcHJpbnRlZC4KLSAgIElmIE4gPCAwLCB0aGUgZW50aXJlIGxpc3QgaXMgcHJpbnRlZC4KLSAgIEludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIEdEQi4gICovCi0KLXZvaWQKLWRwcmludF9zdGF0ZW1lbnQgKHMsIG4pCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOwotICAgICBpbnQgbjsKLXsKLSAgRklMRSAqbWFwX3NhdmUgPSBjb25maWcubWFwX2ZpbGU7Ci0KLSAgY29uZmlnLm1hcF9maWxlID0gc3RkZXJyOwotCi0gIGlmIChuIDwgMCkKLSAgICBwcmludF9zdGF0ZW1lbnRfbGlzdCAocywgYWJzX291dHB1dF9zZWN0aW9uKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlIChzICYmIC0tbiA+PSAwKQotCXsKLQkgIHByaW50X3N0YXRlbWVudCAocywgYWJzX291dHB1dF9zZWN0aW9uKTsKLQkgIHMgPSBzLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgY29uZmlnLm1hcF9maWxlID0gbWFwX3NhdmU7Ci19Ci0KLXN0YXRpYyBiZmRfdm1hCi1pbnNlcnRfcGFkICh0aGlzX3B0ciwgZmlsbCwgcG93ZXIsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgZG90KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqIHRoaXNfcHRyOwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgdW5zaWduZWQgaW50IHBvd2VyOwotICAgICBhc2VjdGlvbiAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci17Ci0gIC8qIEFsaWduIHRoaXMgc2VjdGlvbiBmaXJzdCB0byB0aGUKLSAgICAgaW5wdXQgc2VjdGlvbnMgcmVxdWlyZW1lbnQsIHRoZW4KLSAgICAgdG8gdGhlIG91dHB1dCBzZWN0aW9uJ3MgcmVxdWlyZW1lbnQuCi0gICAgIElmIHRoaXMgYWxpZ25tZW50IGlzID4gdGhhbiBhbnkgc2VlbiBiZWZvcmUsCi0gICAgIHRoZW4gcmVjb3JkIGl0IHRvby4gUGVyZm9ybSB0aGUgYWxpZ25tZW50IGJ5Ci0gICAgIGluc2VydGluZyBhIG1hZ2ljICdwYWRkaW5nJyBzdGF0ZW1lbnQuCi0gICAgICovCi0KLSAgdW5zaWduZWQgb3BiID0gYmZkX2FyY2hfbWFjaF9vY3RldHNfcGVyX2J5dGUgKGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCAKLQkJCQkJCWxkZmlsZV9vdXRwdXRfbWFjaGluZSk7IAotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X25lZWRlZCA9IGFsaWduX3Bvd2VyIChkb3QsIHBvd2VyKSAtIGRvdDsKLQotICBpZiAoYWxpZ25tZW50X25lZWRlZCAhPSAwKQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKm5ldyA9Ci0JKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopCi0JIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlKSkpOwotCi0gICAgICAvKiBMaW5rIGludG8gZXhpc3RpbmcgY2hhaW4gKi8KLSAgICAgIG5ldy0+aGVhZGVyLm5leHQgPSAqdGhpc19wdHI7Ci0gICAgICAqdGhpc19wdHIgPSBuZXc7Ci0gICAgICBuZXctPmhlYWRlci50eXBlID0gbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOwotICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9IG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldCA9Ci0JZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT52bWE7Ci0gICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LmZpbGwgPSBmaWxsOwotICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplID0gYWxpZ25tZW50X25lZWRlZCAqIG9wYjsKLSAgICB9Ci0KLQotICAvKiBSZW1lbWJlciB0aGUgbW9zdCByZXN0cmljdGl2ZSBhbGlnbm1lbnQgKi8KLSAgaWYgKHBvd2VyID4gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5hbGlnbm1lbnRfcG93ZXIpCi0gICAgewotICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLSAgICB9Ci0gIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+X3Jhd19zaXplICs9IGFsaWdubWVudF9uZWVkZWQgKiBvcGI7Ci0KLSAgcmV0dXJuIGRvdCArIGFsaWdubWVudF9uZWVkZWQ7Ci19Ci0KLS8qIFdvcmsgb3V0IGhvdyBtdWNoIHRoaXMgc2VjdGlvbiB3aWxsIG1vdmUgdGhlIGRvdCBwb2ludCAqLwotc3RhdGljIGJmZF92bWEKLXNpemVfaW5wdXRfc2VjdGlvbiAodGhpc19wdHIsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgZmlsbCwgZG90LCByZWxheCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiB0aGlzX3B0cjsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIGJmZF92bWEgZG90OwotICAgICBib29sZWFuIHJlbGF4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppcyA9ICYoKCp0aGlzX3B0ciktPmlucHV0X3NlY3Rpb24pOwotICBhc2VjdGlvbiAqaSA9IGlzLT5zZWN0aW9uOwotICB1bnNpZ25lZCBvcGIgPSBiZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSAobGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIAotCQkJCQkJbGRmaWxlX291dHB1dF9tYWNoaW5lKTsgCi0KLSAgaWYgKGlzLT5pZmlsZS0+anVzdF9zeW1zX2ZsYWcgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+c3Vic2VjdGlvbl9hbGlnbm1lbnQgIT0gLTEpCi0gICAgICAgaS0+YWxpZ25tZW50X3Bvd2VyID0KLQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPnN1YnNlY3Rpb25fYWxpZ25tZW50OwotCi0gICAgICBkb3QgPSBpbnNlcnRfcGFkICh0aGlzX3B0ciwgZmlsbCwgaS0+YWxpZ25tZW50X3Bvd2VyLAotCQkJb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbiwgZG90KTsKLQotICAgICAgLyogUmVtZW1iZXIgd2hlcmUgaW4gdGhlIG91dHB1dCBzZWN0aW9uIHRoaXMgaW5wdXQgc2VjdGlvbiBnb2VzICovCi0KLSAgICAgIGktPm91dHB1dF9vZmZzZXQgPSBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIC8qIE1hcmsgaG93IGJpZyB0aGUgb3V0cHV0IHNlY3Rpb24gbXVzdCBiZSB0byBjb250YWluIHRoaXMgbm93Ci0JICovCi0gICAgICBpZiAoaS0+X2Nvb2tlZF9zaXplICE9IDApCi0JZG90ICs9IGktPl9jb29rZWRfc2l6ZSAvIG9wYjsKLSAgICAgIGVsc2UKLQlkb3QgKz0gaS0+X3Jhd19zaXplIC8gb3BiOwotICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplID0gCi0gICAgICAgIChkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWEpICogb3BiOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGktPm91dHB1dF9vZmZzZXQgPSBpLT52bWEgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0gICAgfQotCi0gIHJldHVybiBkb3Q7Ci19Ci0KLSNkZWZpbmUgSUdOT1JFX1NFQ1RJT04oYmZkLCBzKSBcCi0gICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYmZkLCBzKSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpICE9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpIFwKLSAgIHx8IGJmZF9zZWN0aW9uX3NpemUgKGJmZCwgcykgPT0gMCkKLQotLyogQ2hlY2sgdG8gc2VlIGlmIGFueSBhbGxvY2F0ZWQgc2VjdGlvbnMgb3ZlcmxhcCB3aXRoIG90aGVyIGFsbG9jYXRlZAotICAgc2VjdGlvbnMuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgbGlua2VyIHNjcmlwdCBzcGVjaWZpY2FsbHkgc3BlY2lmaWVzCi0gICB0aGUgb3V0cHV0IHNlY3Rpb24gYWRkcmVzc2VzIG9mIHRoZSB0d28gc2VjdGlvbnMuICAqLwotc3RhdGljIHZvaWQKLWxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgKCkKLXsKLSAgYXNlY3Rpb24gKiBzOwotICB1bnNpZ25lZCBvcGIgPSBiZmRfb2N0ZXRzX3Blcl9ieXRlIChvdXRwdXRfYmZkKTsKLQotICAvKiBTY2FuIGFsbCBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGxpc3QuICAqLwotICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIG9zOwotICAgICAgCi0gICAgICAvKiBJZ25vcmUgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBsb2FkZWQgb3Igd2hpY2ggaGF2ZSBubyBjb250ZW50cy4gICovCi0gICAgICBpZiAoSUdOT1JFX1NFQ1RJT04gKG91dHB1dF9iZmQsIHMpKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICAvKiBPbmNlIHdlIHJlYWNoIHNlY3Rpb24gJ3MnIHN0b3Agb3VyIHNlYWNoLiAgVGhpcyBwcmV2ZW50cyB0d28KLQkgd2FybmluZyBtZXNzYWdlcyBmcm9tIGJlaW5nIHByb2R1Y2VkLCBvbmUgZm9yICdzZWN0aW9uIEEgb3ZlcmxhcHMKLQkgc2VjdGlvbiBCJyBhbmQgb25lIGZvciAnc2VjdGlvbiBCIG92ZXJsYXBzIHNlY3Rpb24gQScuICAqLwotICAgICAgZm9yIChvcyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBvcyAhPSBzOyBvcyA9IG9zLT5uZXh0KQotCXsKLQkgIGJmZF92bWEgc19zdGFydDsKLQkgIGJmZF92bWEgc19lbmQ7Ci0JICBiZmRfdm1hIG9zX3N0YXJ0OwotCSAgYmZkX3ZtYSBvc19lbmQ7Ci0JICAKLQkgIC8qIE9ubHkgY29uc2lkZXIgbG9hZGFibGUgc2VjdGlvbnMgd2l0aCByZWFsIGNvbnRlbnRzLiAgKi8KLQkgIGlmIChJR05PUkVfU0VDVElPTiAob3V0cHV0X2JmZCwgb3MpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogV2UgbXVzdCBjaGVjayB0aGUgc2VjdGlvbnMnIExNQSBhZGRyZXNzZXMgbm90IHRoZWlyCi0JICAgICBWTUEgYWRkcmVzc2VzIGJlY2F1c2Ugb3ZlcmxheSBzZWN0aW9ucyBjYW4gaGF2ZQotCSAgICAgb3ZlcmxhcHBpbmcgVk1BcyBidXQgdGhleSBtdXN0IGhhdmUgZGlzdGluY3QgTE1Bcy4gICovCi0JICBzX3N0YXJ0ICA9IGJmZF9zZWN0aW9uX2xtYSAob3V0cHV0X2JmZCwgcyk7Ci0JICBvc19zdGFydCA9IGJmZF9zZWN0aW9uX2xtYSAob3V0cHV0X2JmZCwgb3MpOwotCSAgc19lbmQgICAgPSBzX3N0YXJ0ICArIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHMpIC8gb3BiIC0gMTsKLQkgIG9zX2VuZCAgID0gb3Nfc3RhcnQgKyBiZmRfc2VjdGlvbl9zaXplIChvdXRwdXRfYmZkLCBvcykgLyBvcGIgLSAxOwotCSAgCi0JICAvKiBMb29rIGZvciBhbiBvdmVybGFwLiAgKi8KLQkgIGlmICgoc19lbmQgPCBvc19zdGFydCkgfHwgKHNfc3RhcnQgPiBvc19lbmQpKQotCSAgICBjb250aW51ZTsKLQkgIAotCSAgZWluZm8gKAotXygiJVglUDogc2VjdGlvbiAlcyBbJVYgLT4gJVZdIG92ZXJsYXBzIHNlY3Rpb24gJXMgWyVWIC0+ICVWXVxuIiksCi0JCSBzLT5uYW1lLCBzX3N0YXJ0LCBzX2VuZCwgb3MtPm5hbWUsIG9zX3N0YXJ0LCBvc19lbmQpOwotCSAgCi0JICAvKiBPbmNlIHdlIGhhdmUgZm91bmQgb25lIG92ZXJsYXAgZm9yIHRoaXMgc2VjdGlvbiwKLQkgICAgIHN0b3AgbG9va2luZyBmb3Igb3RoZXJzLiAgKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIHdoZXRoZXIgYmZkX3JlbGF4X3NlY3Rpb24gc2hvdWxkIGJlIGNhbGxlZAotICAgYWdhaW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbiByZWxheF9hZ2FpbjsKLQotLyogTWFrZSBzdXJlIHRoZSBuZXcgYWRkcmVzcyBpcyB3aXRoaW4gdGhlIHJlZ2lvbi4gIFdlIGV4cGxpY2l0bHkgcGVybWl0IHRoZQotICAgY3VycmVudCBhZGRyZXNzIHRvIGJlIGF0IHRoZSBleGFjdCBlbmQgb2YgdGhlIHJlZ2lvbiB3aGVuIHRoZSBhZGRyZXNzIGlzCi0gICBub24temVybywgaW4gY2FzZSB0aGUgcmVnaW9uIGlzIGF0IHRoZSBlbmQgb2YgYWRkcmVzc2FibGUgbWVtb3J5IGFuZCB0aGUKLSAgIGNhbGN1bGF0aW9uIHdyYXBzIGFyb3VuZC4gICovIAotCi1zdGF0aWMgdm9pZAotb3NfcmVnaW9uX2NoZWNrIChvcywgcmVnaW9uLCB0cmVlLCBiYXNlKQotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLSAgc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpyZWdpb247Ci0gIGV0cmVlX3R5cGUgKnRyZWU7Ci0gIGJmZF92bWEgYmFzZTsKLXsKLSAgaWYgKChyZWdpb24tPmN1cnJlbnQgPCByZWdpb24tPm9yaWdpbgotICAgICAgIHx8IChyZWdpb24tPmN1cnJlbnQgLSByZWdpb24tPm9yaWdpbiA+IHJlZ2lvbi0+bGVuZ3RoKSkKLSAgICAgICYmICgocmVnaW9uLT5jdXJyZW50ICE9IHJlZ2lvbi0+b3JpZ2luICsgcmVnaW9uLT5sZW5ndGgpCi0gICAgICAgICAgIHx8IGJhc2UgPT0gMCkpCi0gICAgewotICAgICAgaWYgKHRyZWUgIT0gKGV0cmVlX3R5cGUgKikgTlVMTCkKLSAgICAgICAgewotICAgICAgICAgIGVpbmZvIChfKCIlWCVQOiBhZGRyZXNzIDB4JXYgb2YgJUIgc2VjdGlvbiAlcyBpcyBub3Qgd2l0aGluIHJlZ2lvbiAlc1xuIiksCi0gICAgICAgICAgICAgICAgIHJlZ2lvbi0+Y3VycmVudCwKLSAgICAgICAgICAgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5vd25lciwKLSAgICAgICAgICAgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5uYW1lLAotICAgICAgICAgICAgICAgICByZWdpb24tPm5hbWUpOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlaW5mbyAoXygiJVglUDogcmVnaW9uICVzIGlzIGZ1bGwgKCVCIHNlY3Rpb24gJXMpXG4iKSwKLSAgICAgICAgICAgICAgICAgcmVnaW9uLT5uYW1lLAotICAgICAgICAgICAgICAgICBvcy0+YmZkX3NlY3Rpb24tPm93bmVyLAotICAgICAgICAgICAgICAgICBvcy0+YmZkX3NlY3Rpb24tPm5hbWUpOwotICAgICAgICB9Ci0gICAgICAvKiBSZXNldCB0aGUgcmVnaW9uIHBvaW50ZXIuICAqLwotICAgICAgcmVnaW9uLT5jdXJyZW50ID0gcmVnaW9uLT5vcmlnaW47Ci0gICAgfQotfQotCi0vKiBTZXQgdGhlIHNpemVzIGZvciBhbGwgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0KLWJmZF92bWEKLWxhbmdfc2l6ZV9zZWN0aW9ucyAocywgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBwcmV2LCBmaWxsLCBkb3QsIHJlbGF4KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiBwcmV2OwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJvb2xlYW4gcmVsYXg7Ci17Ci0gIHVuc2lnbmVkIG9wYiA9IGJmZF9hcmNoX21hY2hfb2N0ZXRzX3Blcl9ieXRlIChsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgCi0JCQkJCQlsZGZpbGVfb3V0cHV0X21hY2hpbmUpOwotCi0gIC8qIFNpemUgdXAgdGhlIHNlY3Rpb25zIGZyb20gdGhlaXIgY29uc3RpdHVlbnQgcGFydHMuICAqLwotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgYWZ0ZXI7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBuZXZlciBhY3R1YWxseSBjcmVhdGVkLiAgKi8KLQkgICAgICBicmVhazsKLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLCB1c2UgdGhlIHNpemUgYW5kCi0JICAgICAgIGFkZHJlc3MgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbi4gIEZJWE1FOiBUaGlzIGlzIENPRkYKLQkgICAgICAgc3BlY2lmaWM7IGl0IHdvdWxkIGJlIGNsZWFuZXIgaWYgdGhlcmUgd2VyZSBzb21lIG90aGVyIHdheQotCSAgICAgICB0byBkbyB0aGlzLCBidXQgbm90aGluZyBzaW1wbGUgY29tZXMgdG8gbWluZC4gICovCi0JICAgIGlmICgob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSAhPSAwKQotCSAgICAgIHsKLQkJYXNlY3Rpb24gKiBpbnB1dDsKLQotCQlpZiAob3MtPmNoaWxkcmVuLmhlYWQgPT0gTlVMTAotCQkgICAgfHwgb3MtPmNoaWxkcmVuLmhlYWQtPm5leHQgIT0gTlVMTAotCQkgICAgfHwgb3MtPmNoaWxkcmVuLmhlYWQtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQotCQkgIGVpbmZvIChfKCIlUCVYOiBJbnRlcm5hbCBlcnJvciBvbiBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24gJXNcbiIpLAotCQkJIG9zLT5uYW1lKTsKLQotCQlpbnB1dCA9IG9zLT5jaGlsZHJlbi5oZWFkLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0JCWJmZF9zZXRfc2VjdGlvbl92bWEgKG9zLT5iZmRfc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgICBvcy0+YmZkX3NlY3Rpb24sCi0JCQkJICAgICBiZmRfc2VjdGlvbl92bWEgKGlucHV0LT5vd25lciwgaW5wdXQpKTsKLQkJb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSBpbnB1dC0+X3Jhd19zaXplOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAob3MtPmJmZF9zZWN0aW9uKSkKLQkgICAgICB7Ci0JCS8qIE5vIG1hdHRlciB3aGF0IGhhcHBlbnMsIGFuIGFicyBzZWN0aW9uIHN0YXJ0cyBhdCB6ZXJvLiAgKi8KLQkJQVNTRVJUIChvcy0+YmZkX3NlY3Rpb24tPnZtYSA9PSAwKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmIChvcy0+YWRkcl90cmVlID09IChldHJlZV90eXBlICopIE5VTEwpCi0JCSAgewotCQkgICAgLyogTm8gYWRkcmVzcyBzcGVjaWZpZWQgZm9yIHRoaXMgc2VjdGlvbiwgZ2V0IG9uZQotCQkgICAgICAgZnJvbSB0aGUgcmVnaW9uIHNwZWNpZmljYXRpb24uICAqLwotCQkgICAgaWYgKG9zLT5yZWdpb24gPT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEwKLQkJCXx8ICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkJICAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSAhPSAwKQotCQkJICAgICYmIG9zLT5yZWdpb24tPm5hbWVbMF0gPT0gJyonCi0JCQkgICAgJiYgc3RyY21wIChvcy0+cmVnaW9uLT5uYW1lLCAiKmRlZmF1bHQqIikgPT0gMCkpCi0JCSAgICAgIHsKLQkJCW9zLT5yZWdpb24gPSBsYW5nX21lbW9yeV9kZWZhdWx0IChvcy0+YmZkX3NlY3Rpb24pOwotCQkgICAgICB9Ci0KLQkJICAgIC8qIElmIGEgbG9hZGFibGUgc2VjdGlvbiBpcyB1c2luZyB0aGUgZGVmYXVsdCBtZW1vcnkKLQkJICAgICAgIHJlZ2lvbiwgYW5kIHNvbWUgbm9uIGRlZmF1bHQgbWVtb3J5IHJlZ2lvbnMgd2VyZQotCQkgICAgICAgZGVmaW5lZCwgaXNzdWUgYSB3YXJuaW5nLiAgKi8KLQkJICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRwdXRfYmZkLCBvcy0+YmZkX3NlY3Rpb24pCi0JCQkgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSAhPSAwCi0JCQkmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLQkJCSYmIHN0cmNtcCAob3MtPnJlZ2lvbi0+bmFtZSwgIipkZWZhdWx0KiIpID09IDAKLQkJCSYmIGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0ICE9IE5VTEwKLQkJCSYmIChzdHJjbXAgKGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0LT5uYW1lLCAiKmRlZmF1bHQqIikgIT0gMAotCQkJICAgIHx8IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0LT5uZXh0ICE9IE5VTEwpKQotCQkgICAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IG5vIG1lbW9yeSByZWdpb24gc3BlY2lmaWVkIGZvciBzZWN0aW9uIGAlcydcbiIpLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKSk7Ci0KLQkJICAgIGRvdCA9IG9zLT5yZWdpb24tPmN1cnJlbnQ7Ci0gCi0JCSAgICBpZiAob3MtPnNlY3Rpb25fYWxpZ25tZW50ID09IC0xKQotCQkgICAgICB7Ci0JCQliZmRfdm1hIG9sZGRvdDsKLQotCQkJb2xkZG90ID0gZG90OwotCQkJZG90ID0gYWxpZ25fcG93ZXIgKGRvdCwgb3MtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpOwotCi0JCQlpZiAoZG90ICE9IG9sZGRvdCAmJiBjb25maWcud2Fybl9zZWN0aW9uX2FsaWduKQotCQkJICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNoYW5naW5nIHN0YXJ0IG9mIHNlY3Rpb24gJXMgYnkgJXUgYnl0ZXNcbiIpLAotCQkJCSBvcy0+bmFtZSwgKHVuc2lnbmVkIGludCkgKGRvdCAtIG9sZGRvdCkpOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgZXRyZWVfdmFsdWVfdHlwZSByOwotCi0JCSAgICByID0gZXhwX2ZvbGRfdHJlZSAob3MtPmFkZHJfdHJlZSwKLQkJCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJCSAgICAgICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKLQkJCQkgICAgICAgZG90LCAmZG90KTsKLQkJICAgIGlmIChyLnZhbGlkX3AgPT0gZmFsc2UpCi0JCSAgICAgIHsKLQkJCWVpbmZvIChfKCIlRiVTOiBub24gY29uc3RhbnQgYWRkcmVzcyBleHByZXNzaW9uIGZvciBzZWN0aW9uICVzXG4iKSwKLQkJCSAgICAgICBvcy0+bmFtZSk7Ci0JCSAgICAgIH0KLQkJICAgIGRvdCA9IHIudmFsdWUgKyByLnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0JCSAgfQotCQkKLQkJLyogVGhlIHNlY3Rpb24gc3RhcnRzIGhlcmUuCi0JCSAgIEZpcnN0LCBhbGlnbiB0byB3aGF0IHRoZSBzZWN0aW9uIG5lZWRzLiAgKi8KLQotCQlpZiAob3MtPnNlY3Rpb25fYWxpZ25tZW50ICE9IC0xKQotCQkgIGRvdCA9IGFsaWduX3Bvd2VyIChkb3QsIG9zLT5zZWN0aW9uX2FsaWdubWVudCk7Ci0KLQkJYmZkX3NldF9zZWN0aW9uX3ZtYSAoMCwgb3MtPmJmZF9zZWN0aW9uLCBkb3QpOwotCQkKLQkJb3MtPmJmZF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gMDsKLQkgICAgICB9Ci0KLQkgICAgKHZvaWQpIGxhbmdfc2l6ZV9zZWN0aW9ucyAob3MtPmNoaWxkcmVuLmhlYWQsIG9zLCAmb3MtPmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgICAgIG9zLT5maWxsLCBkb3QsIHJlbGF4KTsKLQkgICAgCi0gICAgICAgICAgICAvKiBwdXQgdGhlIHNlY3Rpb24gd2l0aGluIHRoZSByZXF1ZXN0ZWQgYmxvY2sgc2l6ZSwgb3IgYWxpZ24gYXQKLSAgICAgICAgICAgICAgIHRoZSBibG9jayBib3VuZGFyeSAqLwotCSAgICBhZnRlciA9IEFMSUdOX04gKG9zLT5iZmRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICsgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgLyBvcGIsCi0JCQkgICAgIC8qIFRoZSBjb2VyY2lvbiBoZXJlIGlzIGltcG9ydGFudCwgc2VlIGxkLmguICAqLwotCQkJICAgICAoYmZkX3ZtYSkgb3MtPmJsb2NrX3ZhbHVlKTsKLQotCSAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChvcy0+YmZkX3NlY3Rpb24pKQotCSAgICAgIEFTU0VSVCAoYWZ0ZXIgPT0gb3MtPmJmZF9zZWN0aW9uLT52bWEpOwotCSAgICBlbHNlCi0JICAgICAgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSAKLSAgICAgICAgICAgICAgICAoYWZ0ZXIgLSBvcy0+YmZkX3NlY3Rpb24tPnZtYSkgKiBvcGI7Ci0JICAgIGRvdCA9IG9zLT5iZmRfc2VjdGlvbi0+dm1hICsgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgLyBvcGI7Ci0JICAgIG9zLT5wcm9jZXNzZWQgPSB0cnVlOwotCi0JICAgIC8qIFVwZGF0ZSBkb3QgaW4gdGhlIHJlZ2lvbiA/Ci0JICAgICAgIFdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBhbGxvY2F0ZWQsCi0JICAgICAgIHNpbmNlIHVuYWxsb2NhdGVkIHNlY3Rpb25zIGRvIG5vdCBjb250cmlidXRlIHRvIHRoZSByZWdpb24ncwotCSAgICAgICBvdmVyYWxsIHNpemUgaW4gbWVtb3J5LgotCSAgICAgICAKLQkgICAgICAgSWYgdGhlIFNFQ19ORVZFUl9MT0FEIGJpdCBpcyBub3Qgc2V0LCBpdCB3aWxsIGFmZmVjdCB0aGUKLQkgICAgICAgYWRkcmVzc2VzIG9mIHNlY3Rpb25zIGFmdGVyIGl0LiBXZSBoYXZlIHRvIHVwZGF0ZQotCSAgICAgICBkb3QuICAqLwotCSAgICBpZiAob3MtPnJlZ2lvbiAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTAotCQkmJiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkgICAgICYgU0VDX05FVkVSX0xPQUQpID09IDAKLQkJICAgIHx8IChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikKLQkJCSYgKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkpKQotCSAgICAgIHsKLQkJb3MtPnJlZ2lvbi0+Y3VycmVudCA9IGRvdDsKLQkJCi0JCS8qIE1ha2Ugc3VyZSB0aGUgbmV3IGFkZHJlc3MgaXMgd2l0aGluIHRoZSByZWdpb24uICAqLwotICAgICAgICAgICAgICAgIG9zX3JlZ2lvbl9jaGVjayAob3MsIG9zLT5yZWdpb24sIG9zLT5hZGRyX3RyZWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MtPmJmZF9zZWN0aW9uLT52bWEpOwotCi0gICAgICAgICAgICAgICAgLyogaWYgdGhlcmUncyBubyBsb2FkIGFkZHJlc3Mgc3BlY2lmaWVkLCB1c2UgdGhlIHJ1biByZWdpb24gYXMKLSAgICAgICAgICAgICAgICAgICB0aGUgbG9hZCByZWdpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAob3MtPmxtYV9yZWdpb24gPT0gTlVMTCAmJiBvcy0+bG9hZF9iYXNlID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIG9zLT5sbWFfcmVnaW9uID0gb3MtPnJlZ2lvbjsKLQotICAgICAgICAgICAgICAgIGlmIChvcy0+bG1hX3JlZ2lvbiAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAob3MtPmxvYWRfYmFzZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVpbmZvIChfKCIlWCVQOiB1c2UgYW4gYWJzb2x1dGUgbG9hZCBhZGRyZXNzIG9yIGEgbG9hZCBtZW1vcnkgcmVnaW9uLCBub3QgYm90aFxuIikpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGFsbG9jYXRlIHR3aWNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3MtPmxtYV9yZWdpb24gIT0gb3MtPnJlZ2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBsb2FkX2Jhc2UsIHdoaWNoIHdpbGwgYmUgaGFuZGxlZCBsYXRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLT5sb2FkX2Jhc2UgPSBleHBfaW50b3AgKG9zLT5sbWFfcmVnaW9uLT5jdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy0+bG1hX3JlZ2lvbi0+Y3VycmVudCArPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplIC8gb3BiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zX3JlZ2lvbl9jaGVjayAob3MsIG9zLT5sbWFfcmVnaW9uLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5sbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGRvdCA9IGxhbmdfc2l6ZV9zZWN0aW9ucyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICZzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICBmaWxsLAotCQkJCSAgICBkb3QsIHJlbGF4KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBzaXplID0gMDsKLQotCSAgICBzLT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfdm1hID0gZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCSAgICBzLT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9Ci0JICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKLQotCSAgICBzd2l0Y2ggKHMtPmRhdGFfc3RhdGVtZW50LnR5cGUpCi0JICAgICAgewotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFib3J0KCk7Ci0JICAgICAgY2FzZSBRVUFEOgotCSAgICAgIGNhc2UgU1FVQUQ6Ci0JCXNpemUgPSBRVUFEX1NJWkU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgTE9ORzoKLQkJc2l6ZSA9IExPTkdfU0laRTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBTSE9SVDoKLQkJc2l6ZSA9IFNIT1JUX1NJWkU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQllURToKLQkJc2l6ZSA9IEJZVEVfU0laRTsKLQkJYnJlYWs7Ci0JICAgICAgfQotICAgICAgICAgICAgaWYgKHNpemUgPCBvcGIpCi0gICAgICAgICAgICAgIHNpemUgPSBvcGI7Ci0JICAgIGRvdCArPSBzaXplIC8gb3BiOwotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZTsKLQkgICAgLyogVGhlIG91dHB1dCBzZWN0aW9uIGdldHMgY29udGVudHMsIGFuZCB0aGVuIHdlIGluc3BlY3QgZm9yCi0JICAgICAgIGFueSBmbGFncyBzZXQgaW4gdGhlIGlucHV0IHNjcmlwdCB3aGljaCBvdmVycmlkZSBhbnkgQUxMT0MuICAqLwotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICBpZiAoIShvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmZsYWdzICYgU0VDX05FVkVSX0xPQUQpKSB7Ci0JICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBpbnQgc2l6ZTsKLQotCSAgICBzLT5yZWxvY19zdGF0ZW1lbnQub3V0cHV0X3ZtYSA9Ci0JICAgICAgZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCSAgICBzLT5yZWxvY19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24gPQotCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0JICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHMtPnJlbG9jX3N0YXRlbWVudC5ob3d0byk7Ci0JICAgIGRvdCArPSBzaXplIC8gb3BiOwotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQotCSAgZG90ID0gbGFuZ19zaXplX3NlY3Rpb25zIChzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICZzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCi0JCQkJICAgIGZpbGwsIGRvdCwgcmVsYXgpOwotCi0JICBicmVhazsKLQotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQkgIGxpbmtfaW5mby5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbiA9Ci0JICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCSAgewotCSAgICBhc2VjdGlvbiAqaTsKLQotCSAgICBpID0gKCpwcmV2KS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOwotCSAgICBpZiAoISByZWxheCkKLQkgICAgICB7Ci0JCWlmIChpLT5fY29va2VkX3NpemUgPT0gMCkKLQkJICBpLT5fY29va2VkX3NpemUgPSBpLT5fcmF3X3NpemU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlib29sZWFuIGFnYWluOwotCi0JCWlmICghIGJmZF9yZWxheF9zZWN0aW9uIChpLT5vd25lciwgaSwgJmxpbmtfaW5mbywgJmFnYWluKSkKLQkJICBlaW5mbyAoXygiJVAlRjogY2FuJ3QgcmVsYXggc2VjdGlvbjogJUVcbiIpKTsKLQkJaWYgKGFnYWluKQotCQkgIHJlbGF4X2FnYWluID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgIGRvdCA9IHNpemVfaW5wdXRfc2VjdGlvbiAocHJldiwKLQkJCQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5maWxsLAotCQkJCSAgICAgIGRvdCwgcmVsYXgpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0JICBzLT5maWxsX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9IG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0KLQkgIGZpbGwgPSBzLT5maWxsX3N0YXRlbWVudC5maWxsOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgbmV3ZG90ID0gZG90OwotCi0JICAgIGV4cF9mb2xkX3RyZWUgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCwKLQkJCSAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCSAgIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLAotCQkJICAgZG90LAotCQkJICAgJm5ld2RvdCk7Ci0KLQkgICAgaWYgKG5ld2RvdCAhPSBkb3QpCi0JICAgICAgewotCQkvKiBUaGUgYXNzaWdubWVudCBjaGFuZ2VkIGRvdC4gIEluc2VydCBhIHBhZC4gICovCi0JCWlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgPT0gYWJzX291dHB1dF9zZWN0aW9uKQotCQkgIHsKLQkJICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW4gb3V0cHV0IHNlY3Rpb24sIHRoZW4ganVzdCBhZGp1c3QKLQkJICAgICAgIHRoZSBkZWZhdWx0IG1lbW9yeSBhZGRyZXNzLiAgKi8KLQkJICAgIGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKCIqZGVmYXVsdCoiKS0+Y3VycmVudCA9IG5ld2RvdDsKLQkJICB9Ci0JCWVsc2UgaWYgKCFyZWxheCkKLQkJICB7Ci0JCSAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpuZXcgPQotCQkgICAgICAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikKLQkJICAgICAgIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlKSkpOwotCi0JCSAgICAvKiBMaW5rIGludG8gZXhpc3RpbmcgY2hhaW4uICAqLwotCQkgICAgbmV3LT5oZWFkZXIubmV4dCA9ICpwcmV2OwotCQkgICAgKnByZXYgPSBuZXc7Ci0JCSAgICBuZXctPmhlYWRlci50eXBlID0gbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOwotCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9Ci0JCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0JCSAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9vZmZzZXQgPQotCQkgICAgICBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0JCSAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LmZpbGwgPSBmaWxsOwotCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplID0gKG5ld2RvdCAtIGRvdCkgKiBvcGI7Ci0JCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0KLQkJICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplOwotCQkgIH0KLQotCQlkb3QgPSBuZXdkb3Q7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKLQkgIC8qIElmIHdlIGFyZSByZWxheGluZywgYW5kIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBwYXNzLCBzb21lCi0JICAgICBwYWRkaW5nIHN0YXRlbWVudHMgbWF5IGhhdmUgYmVlbiBpbnNlcnRlZCBkdXJpbmcgcHJldmlvdXMKLQkgICAgIHBhc3Nlcy4gIFdlIG1heSBoYXZlIHRvIG1vdmUgdGhlIHBhZGRpbmcgc3RhdGVtZW50IHRvIGEgbmV3Ci0JICAgICBsb2NhdGlvbiBpZiBkb3QgaGFzIGEgZGlmZmVyZW50IHZhbHVlIGF0IHRoaXMgcG9pbnQgaW4gdGhpcwotCSAgICAgcGFzcyB0aGFuIGl0IGRpZCBhdCB0aGlzIHBvaW50IGluIHRoZSBwcmV2aW91cyBwYXNzLiAgKi8KLQkgIHMtPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9vZmZzZXQgPQotCSAgICBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0JICBkb3QgKz0gcy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZSAvIG9wYjsKLQkgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSArPQotCSAgICBzLT5wYWRkaW5nX3N0YXRlbWVudC5zaXplOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBkb3QgPSBsYW5nX3NpemVfc2VjdGlvbnMgKHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICZzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgZmlsbCwgZG90LCByZWxheCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBGQUlMICgpOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgY2FuIG9ubHkgZ2V0IGhlcmUgd2hlbiByZWxheGluZyBpcyB0dXJuZWQgb24uICAqLwotCi0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQl9Ci0gICAgICBwcmV2ID0gJnMtPmhlYWRlci5uZXh0OwotICAgIH0KLSAgcmV0dXJuIGRvdDsKLX0KLQotYmZkX3ZtYQotbGFuZ19kb19hc3NpZ25tZW50cyAocywgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBmaWxsLCBkb3QpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICogb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci17Ci0gIHVuc2lnbmVkIG9wYiA9IGJmZF9hcmNoX21hY2hfb2N0ZXRzX3Blcl9ieXRlIChsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgCi0JCQkJCQlsZGZpbGVfb3V0cHV0X21hY2hpbmUpOyAKLQotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgZG90ID0gbGFuZ19kb19hc3NpZ25tZW50cyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCSAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAgZmlsbCwKLQkJCQkgICAgIGRvdCk7Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCSAgICAgICYocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0JICAgICAgewotCQlkb3QgPSBvcy0+YmZkX3NlY3Rpb24tPnZtYTsKLQkJKHZvaWQpIGxhbmdfZG9fYXNzaWdubWVudHMgKG9zLT5jaGlsZHJlbi5oZWFkLCBvcywKLQkJCQkJICAgIG9zLT5maWxsLCBkb3QpOwotCQlkb3QgPSBvcy0+YmZkX3NlY3Rpb24tPnZtYSArIG9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplIC8gb3BiOwotCi0JICAgICAgfQotCSAgICBpZiAob3MtPmxvYWRfYmFzZSkgCi0JICAgICAgewotCQkvKiBJZiBub3RoaW5nIGhhcyBiZWVuIHBsYWNlZCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiB0aGVuCi0JCSAgIGl0IHdvbid0IGhhdmUgYSBiZmRfc2VjdGlvbi4gKi8KLQkJaWYgKG9zLT5iZmRfc2VjdGlvbikgCi0JCSAgewotCQkgICAgb3MtPmJmZF9zZWN0aW9uLT5sbWEgCi0JCSAgICAgID0gZXhwX2dldF9hYnNfaW50KG9zLT5sb2FkX2Jhc2UsIDAsImxvYWQgYmFzZSIsIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCi0JICBkb3QgPSBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAgZmlsbCwgZG90KTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotI2lmIDAKLQljYXNlIGxhbmdfY29tbW9uX3N0YXRlbWVudF9lbnVtOgotI2VuZGlmCi0JICBicmVhazsKLQljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgZXRyZWVfdmFsdWVfdHlwZSB2YWx1ZTsKLQotCSAgICB2YWx1ZSA9IGV4cF9mb2xkX3RyZWUgKHMtPmRhdGFfc3RhdGVtZW50LmV4cCwKLQkJCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgbGFuZ19maW5hbF9waGFzZV9lbnVtLCBkb3QsICZkb3QpOwotCSAgICBzLT5kYXRhX3N0YXRlbWVudC52YWx1ZSA9IHZhbHVlLnZhbHVlOwotCSAgICBpZiAodmFsdWUudmFsaWRfcCA9PSBmYWxzZSkKLQkgICAgICBlaW5mbyAoXygiJUYlUDogaW52YWxpZCBkYXRhIHN0YXRlbWVudFxuIikpOwotCSAgfQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICAgICAgICAgc3dpdGNoIChzLT5kYXRhX3N0YXRlbWVudC50eXBlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgICAgY2FzZSBRVUFEOgotICAgICAgICAgICAgICBjYXNlIFNRVUFEOgotICAgICAgICAgICAgICAgIHNpemUgPSBRVUFEX1NJWkU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgTE9ORzoKLSAgICAgICAgICAgICAgICBzaXplID0gTE9OR19TSVpFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIFNIT1JUOgotICAgICAgICAgICAgICAgIHNpemUgPSBTSE9SVF9TSVpFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIEJZVEU6Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IEJZVEVfU0laRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNpemUgPCBvcGIpCi0gICAgICAgICAgICAgIHNpemUgPSBvcGI7Ci0gICAgICAgICAgICBkb3QgKz0gc2l6ZSAvIG9wYjsKLSAgICAgICAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgZXRyZWVfdmFsdWVfdHlwZSB2YWx1ZTsKLQotCSAgICB2YWx1ZSA9IGV4cF9mb2xkX3RyZWUgKHMtPnJlbG9jX3N0YXRlbWVudC5hZGRlbmRfZXhwLAotCQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0sIGRvdCwgJmRvdCk7Ci0JICAgIHMtPnJlbG9jX3N0YXRlbWVudC5hZGRlbmRfdmFsdWUgPSB2YWx1ZS52YWx1ZTsKLQkgICAgaWYgKHZhbHVlLnZhbGlkX3AgPT0gZmFsc2UpCi0JICAgICAgZWluZm8gKF8oIiVGJVA6IGludmFsaWQgcmVsb2Mgc3RhdGVtZW50XG4iKSk7Ci0JICB9Ci0JICBkb3QgKz0gYmZkX2dldF9yZWxvY19zaXplIChzLT5yZWxvY19zdGF0ZW1lbnQuaG93dG8pIC8gb3BiOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCSAgewotCSAgICBhc2VjdGlvbiAqaW4gPSBzLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0KLQkgICAgaWYgKGluLT5fY29va2VkX3NpemUgIT0gMCkKLQkgICAgICBkb3QgKz0gaW4tPl9jb29rZWRfc2l6ZSAvIG9wYjsKLQkgICAgZWxzZQotCSAgICAgIGRvdCArPSBpbi0+X3Jhd19zaXplIC8gb3BiOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLQkgIGZpbGwgPSBzLT5maWxsX3N0YXRlbWVudC5maWxsOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGV4cF9mb2xkX3RyZWUgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCwKLQkJCSAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCSAgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwKLQkJCSAgIGRvdCwKLQkJCSAgICZkb3QpOwotCSAgfQotCi0JICBicmVhazsKLQljYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKLQkgIGRvdCArPSBzLT5wYWRkaW5nX3N0YXRlbWVudC5zaXplIC8gb3BiOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBkb3QgPSBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgIGZpbGwsIGRvdCk7Ci0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIEZBSUwgKCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCX0KLQotICAgIH0KLSAgcmV0dXJuIGRvdDsKLX0KLQotLyogRml4IGFueSAuc3RhcnRvZi4gb3IgLnNpemVvZi4gc3ltYm9scy4gIFdoZW4gdGhlIGFzc2VtYmxlcnMgc2VlIHRoZQotICAgb3BlcmF0b3IgLnN0YXJ0b2YuIChzZWN0aW9uX25hbWUpLCBpdCBwcm9kdWNlcyBhbiB1bmRlZmluZWQgc3ltYm9sCi0gICAuc3RhcnRvZi5zZWN0aW9uX25hbWUuICBTaW1pbGFybHksIHdoZW4gaXQgc2VlcwotICAgLnNpemVvZi4gKHNlY3Rpb25fbmFtZSksIGl0IHByb2R1Y2VzIGFuIHVuZGVmaW5lZCBzeW1ib2wKLSAgIC5zaXplb2Yuc2VjdGlvbl9uYW1lLiAgRm9yIGFsbCB0aGUgb3V0cHV0IHNlY3Rpb25zLCB3ZSBsb29rIGZvcgotICAgc3VjaCBzeW1ib2xzLCBhbmQgc2V0IHRoZW0gdG8gdGhlIGNvcnJlY3QgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19zZXRfc3RhcnRvZiAoKQotewotICBhc2VjdGlvbiAqczsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHMpOwotICAgICAgYnVmID0geG1hbGxvYyAoMTAgKyBzdHJsZW4gKHNlY25hbWUpKTsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiLnN0YXJ0b2YuJXMiLCBzZWNuYW1lKTsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGJ1ZiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IE5VTEwgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaC0+dS5kZWYudmFsdWUgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCBzKTsKLQkgIGgtPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCX0KLQotICAgICAgc3ByaW50ZiAoYnVmLCAiLnNpemVvZi4lcyIsIHNlY25hbWUpOwotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgYnVmLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gTlVMTCAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLSAgICAgICAgICB1bnNpZ25lZCBvcGIgPSBiZmRfYXJjaF9tYWNoX29jdGV0c19wZXJfYnl0ZSAobGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIAotCQkJCQkJCWxkZmlsZV9vdXRwdXRfbWFjaGluZSk7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCSAgICBoLT51LmRlZi52YWx1ZSA9IHMtPl9jb29rZWRfc2l6ZSAvIG9wYjsKLQkgIGVsc2UKLQkgICAgaC0+dS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemUgLyBvcGI7Ci0JICBoLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQl9Ci0KLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotbGFuZ19maW5pc2ggKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gd2FybjsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSB8fCBsaW5rX2luZm8uc2hhcmVkKQotICAgIHdhcm4gPSBmYWxzZTsKLSAgZWxzZQotICAgIHdhcm4gPSB0cnVlOwotCi0gIGlmIChlbnRyeV9zeW1ib2wgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBObyBlbnRyeSBoYXMgYmVlbiBzcGVjaWZpZWQuICBMb29rIGZvciBzdGFydCwgYnV0IGRvbid0IHdhcm4KLQkgaWYgd2UgZG9uJ3QgZmluZCBpdC4gICovCi0gICAgICBlbnRyeV9zeW1ib2wgPSAic3RhcnQiOwotICAgICAgd2FybiA9IGZhbHNlOwotICAgIH0KLQotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBlbnRyeV9zeW1ib2wsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0gICAgICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHZhbDsKLQotICAgICAgdmFsID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCi0JCQkJICAgIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotCSAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0cHV0X2JmZCwgdmFsKSkKLQllaW5mbyAoXygiJVAlRjolczogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIpLCBlbnRyeV9zeW1ib2wpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgQ09OU1QgY2hhciAqc2VuZDsKLQotICAgICAgLyogV2UgY291bGRuJ3QgZmluZCB0aGUgZW50cnkgc3ltYm9sLiAgVHJ5IHBhcnNpbmcgaXQgYXMgYQotICAgICAgICAgbnVtYmVyLiAgKi8KLSAgICAgIHZhbCA9IGJmZF9zY2FuX3ZtYSAoZW50cnlfc3ltYm9sLCAmc2VuZCwgMCk7Ci0gICAgICBpZiAoKnNlbmQgPT0gJ1wwJykKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG91dHB1dF9iZmQsIHZhbCkpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIikpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc2VjdGlvbiAqdHM7Ci0KLQkgIC8qIENhbid0IGZpbmQgdGhlIGVudHJ5IHN5bWJvbCwgYW5kIGl0J3Mgbm90IGEgbnVtYmVyLiAgVXNlCi0JICAgICB0aGUgZmlyc3QgYWRkcmVzcyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLQkgIHRzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIudGV4dCIpOwotCSAgaWYgKHRzICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHdhcm4pCi0JCWVpbmZvIChfKCIlUDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICVzOyBkZWZhdWx0aW5nIHRvICVWXG4iKSwKLQkJICAgICAgIGVudHJ5X3N5bWJvbCwgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgdHMpKTsKLQkgICAgICBpZiAoISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG91dHB1dF9iZmQsCi0JCQkJCSAgIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCi0JCQkJCQkJCXRzKSkpCi0JCWVpbmZvIChfKCIlUCVGOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAod2FybikKLQkJZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IG5vdCBzZXR0aW5nIHN0YXJ0IGFkZHJlc3NcbiIpLAotCQkgICAgICAgZW50cnlfc3ltYm9sKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgYSBzbWFsbCBmdW5jdGlvbiB1c2VkIHdoZW4gd2Ugd2FudCB0byBpZ25vcmUgZXJyb3JzIGZyb20KLSAgIEJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1pZ25vcmVfYmZkX2Vycm9ycyAoY29uc3QgY2hhciAqcyBBVFRSSUJVVEVfVU5VU0VELCAuLi4pCi0jZWxzZQotaWdub3JlX2JmZF9lcnJvcnMgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnMgQVRUUklCVVRFX1VOVVNFRDsKLSNlbmRpZgotewotICAvKiBEb24ndCBkbyBhbnl0aGluZy4gICovCi19Ci0KLS8qIENoZWNrIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSBvZiBhbGwgdGhlIGlucHV0IGZpbGVzIGlzIGNvbXBhdGlibGUKLSAgIHdpdGggdGhlIG91dHB1dCBmaWxlLiAgQWxzbyBjYWxsIHRoZSBiYWNrZW5kIHRvIGxldCBpdCBkbyBhbnkKLSAgIG90aGVyIGNoZWNraW5nIHRoYXQgaXMgbmVlZGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfY2hlY2sgKCkKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqZmlsZTsKLSAgYmZkICppbnB1dF9iZmQ7Ci0gIENPTlNUIGJmZF9hcmNoX2luZm9fdHlwZSAqY29tcGF0aWJsZTsKLQotICBmb3IgKGZpbGUgPSBmaWxlX2NoYWluLmhlYWQ7Ci0gICAgICAgZmlsZSAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICAgICAgIGZpbGUgPSBmaWxlLT5pbnB1dF9zdGF0ZW1lbnQubmV4dCkKLSAgICB7Ci0gICAgICBpbnB1dF9iZmQgPSBmaWxlLT5pbnB1dF9zdGF0ZW1lbnQudGhlX2JmZDsKLSAgICAgIGNvbXBhdGlibGUgPSBiZmRfYXJjaF9nZXRfY29tcGF0aWJsZSAoaW5wdXRfYmZkLAotCQkJCQkgICAgb3V0cHV0X2JmZCk7Ci0gICAgICBpZiAoY29tcGF0aWJsZSA9PSBOVUxMKQotCXsKLQkgIGlmIChjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCkKLQkgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiAlcyBhcmNoaXRlY3R1cmUgb2YgaW5wdXQgZmlsZSBgJUInIGlzIGluY29tcGF0aWJsZSB3aXRoICVzIG91dHB1dFxuIiksCi0JCSAgIGJmZF9wcmludGFibGVfbmFtZSAoaW5wdXRfYmZkKSwgaW5wdXRfYmZkLAotCQkgICBiZmRfcHJpbnRhYmxlX25hbWUgKG91dHB1dF9iZmQpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBwZm4gPSBOVUxMOwotCi0JICAvKiBJZiB3ZSBhcmVuJ3Qgc3VwcG9zZWQgdG8gd2FybiBhYm91dCBtaXNtYXRjaGVkIGlucHV0Ci0gICAgICAgICAgICAgZmlsZXMsIHRlbXBvcmFyaWx5IHNldCB0aGUgQkZEIGVycm9yIGhhbmRsZXIgdG8gYQotICAgICAgICAgICAgIGZ1bmN0aW9uIHdoaWNoIHdpbGwgZG8gbm90aGluZy4gIFdlIHN0aWxsIHdhbnQgdG8gY2FsbAotICAgICAgICAgICAgIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBzaW5jZSBpdCBtYXkgc2V0IHVwCi0gICAgICAgICAgICAgaW5mb3JtYXRpb24gd2hpY2ggaXMgbmVlZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICBpZiAoISBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCkKLQkgICAgcGZuID0gYmZkX3NldF9lcnJvcl9oYW5kbGVyIChpZ25vcmVfYmZkX2Vycm9ycyk7Ci0JICBpZiAoISBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaW5wdXRfYmZkLCBvdXRwdXRfYmZkKSkKLQkgICAgewotCSAgICAgIGlmIChjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCkKLQkJZWluZm8gKF8oIiVFJVg6IGZhaWxlZCB0byBtZXJnZSB0YXJnZXQgc3BlY2lmaWMgZGF0YSBvZiBmaWxlICVCXG4iKSwKLQkJICAgICAgIGlucHV0X2JmZCk7Ci0JICAgIH0KLQkgIGlmICghIGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQotCSAgICBiZmRfc2V0X2Vycm9yX2hhbmRsZXIgKHBmbik7Ci0JfQotICAgIH0KLX0KLQotLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgZ2xvYmFsIGNvbW1vbiBzeW1ib2xzIGFuZCBhdHRhY2ggdGhlbSB0byB0aGUKLSAgIGNvcnJlY3Qgc2VjdGlvbi4gIFRoZSAtc29ydC1jb21tb24gY29tbWFuZCBsaW5lIHN3aXRjaCBtYXkgYmUgdXNlZAotICAgdG8gcm91Z2hseSBzb3J0IHRoZSBlbnRyaWVzIGJ5IHNpemUuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19jb21tb24gKCkKLXsKLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgY29tbWFuZF9saW5lLmZvcmNlX2NvbW1vbl9kZWZpbml0aW9uKQotICAgIHJldHVybjsKLQotICBpZiAoISBjb25maWcuc29ydF9jb21tb24pCi0gICAgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIGxhbmdfb25lX2NvbW1vbiwgKFBUUikgTlVMTCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgcG93ZXI7Ci0KLSAgICAgIGZvciAocG93ZXIgPSA0OyBwb3dlciA+PSAwOyBwb3dlci0tKQotCWJmZF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbmtfaW5mby5oYXNoLCBsYW5nX29uZV9jb21tb24sCi0JCQkJKFBUUikgJnBvd2VyKTsKLSAgICB9Ci19Ci0KLS8qIFBsYWNlIG9uZSBjb21tb24gc3ltYm9sIGluIHRoZSBjb3JyZWN0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGFuZ19vbmVfY29tbW9uIChoLCBpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0gIGJmZF92bWEgc2l6ZTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIG9wYiA9IGJmZF9hcmNoX21hY2hfb2N0ZXRzX3Blcl9ieXRlIChsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgCi0JCQkJCQlsZGZpbGVfb3V0cHV0X21hY2hpbmUpOyAKLQotICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzaXplID0gaC0+dS5jLnNpemU7Ci0gIHBvd2VyX29mX3R3byA9IGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgaWYgKGNvbmZpZy5zb3J0X2NvbW1vbgotICAgICAgJiYgcG93ZXJfb2ZfdHdvIDwgKHVuc2lnbmVkIGludCkgKihpbnQgKikgaW5mbykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0aW9uID0gaC0+dS5jLnAtPnNlY3Rpb247Ci0KLSAgLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBBTElHTl9OICgoc2VjdGlvbi0+X2Nvb2tlZF9zaXplICsgb3BiIC0gMSkgLyBvcGIsCi0JCQkJICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpICogb3BiOwotCi0gIC8qIEFkanVzdCB0aGUgYWxpZ25tZW50IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChwb3dlcl9vZl90d28gPiBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXJfb2ZfdHdvOwotCi0gIC8qIENoYW5nZSB0aGUgc3ltYm9sIGZyb20gY29tbW9uIHRvIGRlZmluZWQuICAqLwotICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICBoLT51LmRlZi5zZWN0aW9uID0gc2VjdGlvbjsKLSAgaC0+dS5kZWYudmFsdWUgPSBzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0KLSAgLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgKz0gc2l6ZTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIHNlY3Rpb24gaXMgYWxsb2NhdGVkIGluIG1lbW9yeSwgYW5kIG1ha2Ugc3VyZSB0aGF0Ci0gICAgIGl0IGlzIG5vIGxvbmdlciBhIGNvbW1vbiBzZWN0aW9uLiAgKi8KLSAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotICBzZWN0aW9uLT5mbGFncyAmPSB+IFNFQ19JU19DT01NT047Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBib29sZWFuIGhlYWRlcl9wcmludGVkOwotICAgICAgaW50IGxlbjsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIGJ1Zls1MF07Ci0KLSAgICAgIGlmICghIGhlYWRlcl9wcmludGVkKQotCXsKLQkgIG1pbmZvIChfKCJcbkFsbG9jYXRpbmcgY29tbW9uIHN5bWJvbHNcbiIpKTsKLQkgIG1pbmZvIChfKCJDb21tb24gc3ltYm9sICAgICAgIHNpemUgICAgICAgICAgICAgIGZpbGVcblxuIikpOwotCSAgaGVhZGVyX3ByaW50ZWQgPSB0cnVlOwotCX0KLQotICAgICAgbmFtZSA9IGRlbWFuZ2xlIChoLT5yb290LnN0cmluZyk7Ci0gICAgICBtaW5mbyAoIiVzIiwgbmFtZSk7Ci0gICAgICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgZnJlZSAobmFtZSk7Ci0KLSAgICAgIGlmIChsZW4gPj0gMTkpCi0JewotCSAgcHJpbnRfbmwgKCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIHdoaWxlIChsZW4gPCAyMCkKLQl7Ci0JICBwcmludF9zcGFjZSAoKTsKLQkgICsrbGVuOwotCX0KLQotICAgICAgbWluZm8gKCIweCIpOwotICAgICAgaWYgKHNpemUgPD0gMHhmZmZmZmZmZikKLQlzcHJpbnRmIChidWYsICIlbHgiLCAodW5zaWduZWQgbG9uZykgc2l6ZSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50Zl92bWEgKGJ1Ziwgc2l6ZSk7Ci0gICAgICBtaW5mbyAoIiVzIiwgYnVmKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmKTsKLQotICAgICAgd2hpbGUgKGxlbiA8IDE2KQotCXsKLQkgIHByaW50X3NwYWNlICgpOwotCSAgKytsZW47Ci0JfQotCi0gICAgICBtaW5mbyAoIiVCXG4iLCBzZWN0aW9uLT5vd25lcik7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotcnVuIHRocm91Z2ggdGhlIGlucHV0IGZpbGVzIGFuZCBlbnN1cmUgdGhhdCBldmVyeSBpbnB1dAotc2VjdGlvbiBoYXMgc29tZXdoZXJlIHRvIGdvLiBJZiBvbmUgaXMgZm91bmQgd2l0aG91dAotYSBkZXN0aW5hdGlvbiB0aGVuIGNyZWF0ZSBhbiBpbnB1dCByZXF1ZXN0IGFuZCBwbGFjZSBpdAotaW50byB0aGUgc3RhdGVtZW50IHRyZWUuCi0qLwotCi1zdGF0aWMgdm9pZAotbGFuZ19wbGFjZV9vcnBoYW5zICgpCi17Ci0gIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChmaWxlKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBmaWxlLT50aGVfYmZkLT5zZWN0aW9uczsKLQkgICBzICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIHMgPSBzLT5uZXh0KQotCXsKLQkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBub3QgYXR0YXRjaGVkLCByb290Ci0JICAgICAgICAgYXJvdW5kIGZvciBhIHNlbnNpYmxlIHBsYWNlIGZvciBpdCB0byBnbyAqLwotCi0JICAgICAgaWYgKGZpbGUtPmp1c3Rfc3ltc19mbGFnKQotCQl7Ci0JCSAgLyogV2UgYXJlIG9ubHkgcmV0cmlldmluZyBzeW1ib2wgdmFsdWVzIGZyb20gdGhpcwotICAgICAgICAgICAgICAgICAgICAgZmlsZS4gIFdlIHdhbnQgdGhlIHN5bWJvbHMgdG8gYWN0IGFzIHRob3VnaCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBpbiB0aGUgZmlsZSBhcmUgYWJzb2x1dGUuICAqLwotCQkgIHMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJICBzLT5vdXRwdXRfb2Zmc2V0ID0gcy0+dm1hOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChzLT5uYW1lLCAiQ09NTU9OIikgPT0gMCkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSBsb25lbHkgY29tbW9uIHNlY3Rpb24gd2hpY2ggbXVzdCBoYXZlCi0JCSAgICAgY29tZSBmcm9tIGFuIGFyY2hpdmUuICBXZSBhdHRhY2ggdG8gdGhlIHNlY3Rpb24KLQkJICAgICB3aXRoIHRoZSB3aWxkY2FyZC4gICovCi0JCSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotCQkgICAgICB8fCBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24pCi0JCSAgICB7Ci0JCSAgICAgIGlmIChkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCQl7Ci0jaWYgMAotCQkJICAvKiBUaGlzIG1lc3NhZ2UgaGFwcGVucyB3aGVuIHVzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdnIzLmlmaWxlIGxpbmtlciBzY3JpcHQsIHNvIEkgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBpdC4gICovCi0JCQkgIGluZm9fbXNnIChfKCIlUDogbm8gW0NPTU1PTl0gY29tbWFuZCwgZGVmYXVsdGluZyB0byAuYnNzXG4iKSk7Ci0jZW5kaWYKLQkJCSAgZGVmYXVsdF9jb21tb25fc2VjdGlvbiA9Ci0JCQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLmJzcyIpOwotCi0JCQl9Ci0JCSAgICAgIHdpbGRfZG9pdCAoJmRlZmF1bHRfY29tbW9uX3NlY3Rpb24tPmNoaWxkcmVuLCBzLAotCQkJCSBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLCBmaWxlKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGxkZW11bF9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpKQotCQk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAocy0+bmFtZSk7Ci0KLQkJICB3aWxkX2RvaXQgKCZvcy0+Y2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi12b2lkCi1sYW5nX3NldF9mbGFncyAocHRyLCBmbGFncywgaW52ZXJ0KQotICAgICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcHRyOwotICAgICBDT05TVCBjaGFyICpmbGFnczsKLSAgICAgaW50IGludmVydDsKLXsKLSAgZmxhZ3dvcmQgKnB0cl9mbGFnczsKLQotICBwdHJfZmxhZ3MgPSBpbnZlcnQgPyAmcHRyLT5ub3RfZmxhZ3MgOiAmcHRyLT5mbGFnczsKLSAgd2hpbGUgKCpmbGFncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpmbGFncykKLQl7Ci0JY2FzZSAnQSc6IGNhc2UgJ2EnOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICBicmVhazsKLQotCWNhc2UgJ1InOiBjYXNlICdyJzoKLQkgICpwdHJfZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotCSAgYnJlYWs7Ci0KLQljYXNlICdXJzogY2FzZSAndyc6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19EQVRBOwotCSAgYnJlYWs7Ci0KLQljYXNlICdYJzogY2FzZSAneCc6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19DT0RFOwotCSAgYnJlYWs7Ci0KLQljYXNlICdMJzogY2FzZSAnbCc6Ci0JY2FzZSAnSSc6IGNhc2UgJ2knOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfTE9BRDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIHN5bnRheCBpbiBmbGFnc1xuIikpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZmxhZ3MrKzsKLSAgICB9Ci19Ci0KLS8qIENhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGlucHV0IGZpbGUuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCi0gICBvbiBhbiBhcmNoaXZlLCBidXQgbm90IG9uIHRoZSBlbGVtZW50cy4gICovCi0KLXZvaWQKLWxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZnVuYykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotCi0gIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGlucHV0X2ZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBmICE9IE5VTEw7Ci0gICAgICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHRfcmVhbF9maWxlKQotICAgIGZ1bmMgKGYpOwotfQotCi0vKiBDYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBmaWxlLiAgVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGFsbAotICAgdGhlIGVsZW1lbnRzIG9mIGFuIGFyY2hpdmUgd2hpY2ggYXJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLCBidXQgd2lsbAotICAgbm90IGJlIGNhbGxlZCBvbiB0aGUgYXJjaGl2ZSBmaWxlIGl0c2VsZi4gICovCi0KLXZvaWQKLWxhbmdfZm9yX2VhY2hfZmlsZSAoZnVuYykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotewotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoZikKLSAgICB7Ci0gICAgICBmdW5jIChmKTsKLSAgICB9Ci19Ci0KLSNpZiAwCi0KLS8qIE5vdCB1c2VkLiAgKi8KLQotdm9pZAotbGFuZ19mb3JfZWFjaF9pbnB1dF9zZWN0aW9uIChmdW5jKQotICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgoYmZkICogYWIsIGFzZWN0aW9uICogYXMpKTsKLXsKLSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGYpCi0gICAgewotICAgICAgYXNlY3Rpb24gKiBzOwotCi0gICAgICBmb3IgKHMgPSBmLT50aGVfYmZkLT5zZWN0aW9uczsKLQkgICBzICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIHMgPSBzLT5uZXh0KQotCXsKLQkgIGZ1bmMgKGYtPnRoZV9iZmQsIHMpOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZgotCi12b2lkCi1sZGxhbmdfYWRkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICogZW50cnk7Ci17Ci0gIGJmZCAqKnBwOwotCi0gIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAoJmZpbGVfY2hhaW4sCi0JCQkgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgZW50cnksCi0JCQkgJmVudHJ5LT5uZXh0KTsKLQotICAvKiBUaGUgQkZEIGxpbmtlciBuZWVkcyB0byBoYXZlIGEgbGlzdCBvZiBhbGwgaW5wdXQgQkZEcyBpbnZvbHZlZCBpbgotICAgICBhIGxpbmsuICAqLwotICBBU1NFUlQgKGVudHJ5LT50aGVfYmZkLT5saW5rX25leHQgPT0gKGJmZCAqKSBOVUxMKTsKLSAgQVNTRVJUIChlbnRyeS0+dGhlX2JmZCAhPSBvdXRwdXRfYmZkKTsKLSAgZm9yIChwcCA9ICZsaW5rX2luZm8uaW5wdXRfYmZkczsKLSAgICAgICAqcHAgIT0gKGJmZCAqKSBOVUxMOwotICAgICAgIHBwID0gJigqcHApLT5saW5rX25leHQpCi0gICAgOwotICAqcHAgPSBlbnRyeS0+dGhlX2JmZDsKLSAgZW50cnktPnRoZV9iZmQtPnVzcmRhdGEgPSAoUFRSKSBlbnRyeTsKLSAgYmZkX3NldF9ncF9zaXplIChlbnRyeS0+dGhlX2JmZCwgZ19zd2l0Y2hfdmFsdWUpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNoZWNrIGZvciBhbnkgd2hpY2ggc2hvdWxkIG5vdCBiZQotICAgICBpbmNsdWRlZCBpbiB0aGUgbGluay4gIFdlIG5lZWQgdG8gZG8gdGhpcyBub3csIHNvIHRoYXQgd2UgY2FuCi0gICAgIG5vdGljZSB3aGVuIHRoZSBiYWNrZW5kIGxpbmtlciB0cmllcyB0byByZXBvcnQgbXVsdGlwbGUKLSAgICAgZGVmaW5pdGlvbiBlcnJvcnMgZm9yIHN5bWJvbHMgd2hpY2ggYXJlIGluIHNlY3Rpb25zIHdlIGFyZW4ndAotICAgICBnb2luZyB0byBsaW5rLiAgRklYTUU6IEl0IG1pZ2h0IGJlIGJldHRlciB0byBlbnRpcmVseSBpZ25vcmUKLSAgICAgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBpbiBzZWN0aW9ucyB3aGljaCBhcmUgZ29pbmcgdG8gYmUKLSAgICAgZGlzY2FyZGVkLiAgVGhpcyB3b3VsZCByZXF1aXJlIG1vZGlmeWluZyB0aGUgYmFja2VuZCBsaW5rZXIgZm9yCi0gICAgIGVhY2ggYmFja2VuZCB3aGljaCBtaWdodCBzZXQgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZy4gIElmIHdlIGRvCi0gICAgIHRoaXMsIHdlIHNob3VsZCBwcm9iYWJseSBoYW5kbGUgU0VDX0VYQ0xVREUgaW4gdGhlIHNhbWUgd2F5LiAgKi8KLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGVudHJ5LT50aGVfYmZkLCBzZWN0aW9uX2FscmVhZHlfbGlua2VkLCAoUFRSKSBlbnRyeSk7Ci19Ci0KLXZvaWQKLWxhbmdfYWRkX291dHB1dCAobmFtZSwgZnJvbV9zY3JpcHQpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGludCBmcm9tX3NjcmlwdDsKLXsKLSAgLyogTWFrZSAtbyBvbiBjb21tYW5kIGxpbmUgb3ZlcnJpZGUgT1VUUFVUIGluIHNjcmlwdC4gICovCi0gIGlmIChoYWRfb3V0cHV0X2ZpbGVuYW1lID09IGZhbHNlIHx8ICFmcm9tX3NjcmlwdCkKLSAgICB7Ci0gICAgICBvdXRwdXRfZmlsZW5hbWUgPSBuYW1lOwotICAgICAgaGFkX291dHB1dF9maWxlbmFtZSA9IHRydWU7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247Ci0KLXN0YXRpYyBpbnQKLXRvcG93ZXIgKHgpCi0gICAgIGludCB4OwotewotICB1bnNpZ25lZCBpbnQgaSA9IDE7Ci0gIGludCBsOwotCi0gIGlmICh4IDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZm9yIChsID0gMDsgbCA8IDMyOyBsKyspIAotICAgIHsKLSAgICAgIGlmIChpID49ICh1bnNpZ25lZCBpbnQpIHgpCi0JcmV0dXJuIGw7Ci0gICAgICBpIDw8PSAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9uYW1lLAotCQkJCSAgICAgYWRkcmVzc19leHAsIHNlY3R5cGUsIGJsb2NrX3ZhbHVlLAotCQkJCSAgICAgYWxpZ24sIHN1YmFsaWduLCBlYmFzZSkKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKiBhZGRyZXNzX2V4cDsKLSAgICAgZW51bSBzZWN0aW9uX3R5cGUgc2VjdHlwZTsKLSAgICAgYmZkX3ZtYSBibG9ja192YWx1ZTsKLSAgICAgZXRyZWVfdHlwZSAqYWxpZ247Ci0gICAgIGV0cmVlX3R5cGUgKnN1YmFsaWduOwotICAgICBldHJlZV90eXBlICplYmFzZTsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgY3VycmVudF9zZWN0aW9uID0KLSAgIG9zID0KLSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9uYW1lKTsKLQotCi0KLSAgLyogQWRkIHRoaXMgc3RhdGVtZW50IHRvIHRyZWUgKi8KLSAgLyogIGFkZF9zdGF0ZW1lbnQobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ki8KLSAgLyogTWFrZSBuZXh0IHRoaW5ncyBjaGFpbiBpbnRvIHN1YmNoYWluIG9mIHRoaXMgKi8KLQotICBpZiAob3MtPmFkZHJfdHJlZSA9PQotICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCkKLSAgewotICAgIG9zLT5hZGRyX3RyZWUgPQotICAgICBhZGRyZXNzX2V4cDsKLSAgfQotICBvcy0+c2VjdHlwZSA9IHNlY3R5cGU7Ci0gIGlmIChzZWN0eXBlICE9IG5vbG9hZF9zZWN0aW9uKQotICAgIG9zLT5mbGFncyA9IFNFQ19OT19GTEFHUzsKLSAgZWxzZQotICAgIG9zLT5mbGFncyA9IFNFQ19ORVZFUl9MT0FEOwotICBvcy0+YmxvY2tfdmFsdWUgPSBibG9ja192YWx1ZSA/IGJsb2NrX3ZhbHVlIDogMTsKLSAgc3RhdF9wdHIgPSAmb3MtPmNoaWxkcmVuOwotCi0gIG9zLT5zdWJzZWN0aW9uX2FsaWdubWVudCA9IHRvcG93ZXIoCi0gICBleHBfZ2V0X3ZhbHVlX2ludChzdWJhbGlnbiwgLTEsCi0JCSAgICAgInN1YnNlY3Rpb24gYWxpZ25tZW50IiwKLQkJICAgICAwKSk7Ci0gIG9zLT5zZWN0aW9uX2FsaWdubWVudCA9IHRvcG93ZXIoCi0gICBleHBfZ2V0X3ZhbHVlX2ludChhbGlnbiwgLTEsCi0JCSAgICAgInNlY3Rpb24gYWxpZ25tZW50IiwgMCkpOwotCi0gIG9zLT5sb2FkX2Jhc2UgPSBlYmFzZTsKLX0KLQotCi12b2lkCi1sYW5nX2ZpbmFsICgpCi17Ci0gIGxhbmdfb3V0cHV0X3N0YXRlbWVudF90eXBlICpuZXcgPQotICAgIG5ld19zdGF0IChsYW5nX291dHB1dF9zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKLQotICBuZXctPm5hbWUgPSBvdXRwdXRfZmlsZW5hbWU7Ci19Ci0KLS8qIFJlc2V0IHRoZSBjdXJyZW50IGNvdW50ZXJzIGluIHRoZSByZWdpb25zICovCi1zdGF0aWMgdm9pZAotcmVzZXRfbWVtb3J5X3JlZ2lvbnMgKCkKLXsKLSAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLQotICBmb3IgKHAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLSAgICAgICBwICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOwotICAgICAgIHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIHAtPm9sZF9sZW5ndGggPSAoYmZkX3NpemVfdHlwZSkgKHAtPmN1cnJlbnQgLSBwLT5vcmlnaW4pOwotICAgICAgcC0+Y3VycmVudCA9IHAtPm9yaWdpbjsKLSAgICB9Ci19Ci0KLS8qIEV4cGFuZCBhIHdpbGQgc3RhdGVtZW50IGZvciBhIHBhcnRpY3VsYXIgRklMRSwgbWFya2luZyBpdHMgc2VjdGlvbnMgS0VFUAotICAgYXMgbmVlZGVkLiAgU0VDVElPTiBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhIHdpbGQgY2FyZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nY19zZWN0aW9uX2NhbGxiYWNrIChwdHIsIHNlY3Rpb24sIGZpbGUsIGRhdGEpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqcHRyOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB2b2lkICpkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIElmIHRoZSB3aWxkIHBhdHRlcm4gd2FzIG1hcmtlZCBLRUVQLCB0aGUgbWVtYmVyIHNlY3Rpb25zCi0gICAgIHNob3VsZCBiZSBhcyB3ZWxsLiAgKi8KLSAgaWYgKHB0ci0+a2VlcF9zZWN0aW9ucykKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLX0KLQotLyogSGFuZGxlIGEgd2lsZCBzdGF0ZW1lbnQsIG1hcmtpbmcgaXQgYWdhaW5zdCBHQy4gIFNFQ1RJT04gb3IgRklMRSBvciBib3RoCi0gICBtYXkgYmUgTlVMTCwgaW5kaWNhdGluZyB0aGF0IGl0IGlzIGEgd2lsZGNhcmQuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19nY193aWxkIChzLCBzZWN0aW9uLCBmaWxlKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIHdhbGtfd2lsZCAocywgc2VjdGlvbiwgZmlsZSwgZ2Nfc2VjdGlvbl9jYWxsYmFjaywgTlVMTCk7Ci19Ci0KLS8qIEl0ZXJhdGUgb3ZlciBzZWN0aW9ucyBtYXJraW5nIHRoZW0gYWdhaW5zdCBHQy4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2djX3NlY3Rpb25zXzEgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOwotewotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfd2lsZCAoJnMtPndpbGRfc3RhdGVtZW50LAotCQkJcy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLAotCQkJcy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfc2VjdGlvbnNfMSAoY29uc3RydWN0b3JfbGlzdC5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfc2VjdGlvbnNfMSAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19nY19zZWN0aW9uc18xIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWxhbmdfZ2Nfc2VjdGlvbnMgKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKnVsaXN0LCBmYWtlX2xpc3Rfc3RhcnQ7Ci0KLSAgLyogS2VlcCBhbGwgc2VjdGlvbnMgc28gbWFya2VkIGluIHRoZSBsaW5rIHNjcmlwdC4gICovCi0KLSAgbGFuZ19nY19zZWN0aW9uc18xIChzdGF0ZW1lbnRfbGlzdC5oZWFkKTsKLQotICAvKiBLZWVwIGFsbCBzZWN0aW9ucyBjb250YWluaW5nIHN5bWJvbHMgdW5kZWZpbmVkIG9uIHRoZSBjb21tYW5kLWxpbmUuCi0gICAgIEhhbmRsZSB0aGUgZW50cnkgc3ltYm9sIGF0IHRoZSBzYW1lIHRpbWUuICAqLwotICAKLSAgaWYgKGVudHJ5X3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZha2VfbGlzdF9zdGFydC5uZXh0ID0gbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfaGVhZDsKLSAgICAgIGZha2VfbGlzdF9zdGFydC5uYW1lID0gKGNoYXIgKikgZW50cnlfc3ltYm9sOwotICAgICAgdWxpc3QgPSAmZmFrZV9saXN0X3N0YXJ0OwotICAgIH0KLSAgZWxzZQotICAgIHVsaXN0ID0gbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfaGVhZDsKLQotICBmb3IgKDsgdWxpc3Q7IHVsaXN0ID0gdWxpc3QtPm5leHQpCi0gICAgewotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgdWxpc3QtPm5hbWUsIAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotICAgICAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT51LmRlZi5zZWN0aW9uKSkKLQl7Ci0JICBoLT51LmRlZi5zZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLQl9Ci0gICAgfQotCi0gIGJmZF9nY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci19Ci0KLXZvaWQKLWxhbmdfcHJvY2VzcyAoKQotewotICBsYW5nX3JlYXNvbmFibGVfZGVmYXVsdHMgKCk7Ci0gIGN1cnJlbnRfdGFyZ2V0ID0gZGVmYXVsdF90YXJnZXQ7Ci0KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGxkbGFuZ19vcGVuX291dHB1dCk7CS8qIE9wZW4gdGhlIG91dHB1dCBmaWxlICovCi0KLSAgbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpOwotCi0gIC8qIEFkZCB0byB0aGUgaGFzaCB0YWJsZSBhbGwgdW5kZWZpbmVkcyBvbiB0aGUgY29tbWFuZCBsaW5lICovCi0gIGxhbmdfcGxhY2VfdW5kZWZpbmVkcyAoKTsKLQotICBhbHJlYWR5X2xpbmtlZF90YWJsZV9pbml0ICgpOwotCi0gIC8qIENyZWF0ZSBhIGJmZCBmb3IgZWFjaCBpbnB1dCBmaWxlICovCi0gIGN1cnJlbnRfdGFyZ2V0ID0gZGVmYXVsdF90YXJnZXQ7Ci0gIG9wZW5faW5wdXRfYmZkcyAoc3RhdGVtZW50X2xpc3QuaGVhZCwgZmFsc2UpOwotCi0gIGxkZW11bF9hZnRlcl9vcGVuICgpOwotCi0gIGFscmVhZHlfbGlua2VkX3RhYmxlX2ZyZWUgKCk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgd2UncmUgbm90IG1peGluZyBhcmNoaXRlY3R1cmVzLiAgV2UgY2FsbCB0aGlzCi0gICAgIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZCwgYnV0IGJlZm9yZSB3ZSBkbyBhbnkKLSAgICAgb3RoZXIgcHJvY2Vzc2luZywgc28gdGhhdCBhbnkgb3BlcmF0aW9ucyBtZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gICAgIGRvZXMgb24gdGhlIG91dHB1dCBmaWxlIHdpbGwgYmUga25vd24gZHVyaW5nIHRoZSByZXN0IG9mIHRoZQotICAgICBsaW5rLiAgKi8KLSAgbGFuZ19jaGVjayAoKTsKLQotICAvKiBIYW5kbGUgLmV4cG9ydHMgaW5zdGVhZCBvZiBhIHZlcnNpb24gc2NyaXB0IGlmIHdlJ3JlIHRvbGQgdG8gZG8gc28uICAqLwotICBpZiAoY29tbWFuZF9saW5lLnZlcnNpb25fZXhwb3J0c19zZWN0aW9uKQotICAgIGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gKCk7Ci0KLSAgLyogQnVpbGQgYWxsIHNldHMgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIGlucHV0Ci0gICAgIGZpbGVzLiAgKi8KLSAgbGRjdG9yX2J1aWxkX3NldHMgKCk7Ci0KLSAgLyogUmVtb3ZlIHVucmVmZXJlbmNlZCBzZWN0aW9ucyBpZiBhc2tlZCB0by4gICovCi0gIGlmIChjb21tYW5kX2xpbmUuZ2Nfc2VjdGlvbnMpCi0gICAgbGFuZ19nY19zZWN0aW9ucyAoKTsKLQotICAvKiBTaXplIHVwIHRoZSBjb21tb24gZGF0YSAqLwotICBsYW5nX2NvbW1vbiAoKTsKLQotICAvKiBSdW4gdGhyb3VnaCB0aGUgY29udG91cnMgb2YgdGhlIHNjcmlwdCBhbmQgYXR0YWNoIGlucHV0IHNlY3Rpb25zCi0gICAgIHRvIHRoZSBjb3JyZWN0IG91dHB1dCBzZWN0aW9ucwotICAgICAqLwotICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLCAoY2hhciAqKSBOVUxMLAotCQkJCShsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopIE5VTEwpOwotCi0KLSAgLyogRmluZCBhbnkgc2VjdGlvbnMgbm90IGF0dGFjaGVkIGV4cGxpY2l0bHkgYW5kIGhhbmRsZSB0aGVtICovCi0gIGxhbmdfcGxhY2Vfb3JwaGFucyAoKTsKLQotICBsZGVtdWxfYmVmb3JlX2FsbG9jYXRpb24gKCk7Ci0KLSAgLyogV2UgbXVzdCByZWNvcmQgdGhlIHByb2dyYW0gaGVhZGVycyBiZWZvcmUgd2UgdHJ5IHRvIGZpeCB0aGUKLSAgICAgc2VjdGlvbiBwb3NpdGlvbnMsIHNpbmNlIHRoZXkgd2lsbCBhZmZlY3QgU0laRU9GX0hFQURFUlMuICAqLwotICBsYW5nX3JlY29yZF9waGRycyAoKTsKLQotICAvKiBOb3cgcnVuIGFyb3VuZCBhbmQgcmVsYXggaWYgd2UgY2FuICovCi0gIGlmIChjb21tYW5kX2xpbmUucmVsYXgpCi0gICAgewotICAgICAgLyogRmlyc3QgdGltZSByb3VuZCBpcyBhIHRyaWFsIHJ1biB0byBnZXQgdGhlICd3b3JzdCBjYXNlJwotCSBhZGRyZXNzZXMgb2YgdGhlIG9iamVjdHMgaWYgdGhlcmUgd2FzIG5vIHJlbGF4aW5nLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKLQkJCSAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAmKHN0YXRlbWVudF9saXN0LmhlYWQpLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotCi0gICAgICAvKiBLZWVwIHJlbGF4aW5nIHVudGlsIGJmZF9yZWxheF9zZWN0aW9uIGdpdmVzIHVwLiAgKi8KLSAgICAgIGRvCi0JewotCSAgcmVzZXRfbWVtb3J5X3JlZ2lvbnMgKCk7Ci0KLQkgIHJlbGF4X2FnYWluID0gZmFsc2U7Ci0KLQkgIC8qIE5vdGU6IHBlLWRsbC5jIGRvZXMgc29tZXRoaW5nIGxpa2UgdGhpcyBhbHNvLiAgSWYgeW91IGZpbmQKLQkgICAgIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGlzIGNvZGUsIHlvdSBwcm9iYWJseSBuZWVkIHRvIGNoYW5nZQotCSAgICAgcGUtZGxsLmMgYWxzby4gIERKICovCi0KLQkgIC8qIERvIGFsbCB0aGUgYXNzaWdubWVudHMgd2l0aCBvdXIgY3VycmVudCBndWVzc2VzIGFzIHRvCi0JICAgICBzZWN0aW9uIHNpemVzLiAgKi8KLQkgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgICAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLQotCSAgLyogUGVyZm9ybSBhbm90aGVyIHJlbGF4IHBhc3MgLSB0aGlzIHRpbWUgd2Uga25vdyB3aGVyZSB0aGUKLQkgICAgIGdsb2JhbHMgYXJlLCBzbyBjYW4gbWFrZSBiZXR0ZXIgZ3Vlc3MuICAqLwotCSAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkJICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgICAgJihzdGF0ZW1lbnRfbGlzdC5oZWFkKSwgMCwgKGJmZF92bWEpIDAsIHRydWUpOwotCX0KLSAgICAgIHdoaWxlIChyZWxheF9hZ2Fpbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogU2l6ZSB1cCB0aGUgc2VjdGlvbnMuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkJICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICYoc3RhdGVtZW50X2xpc3QuaGVhZCksIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBhbnl0aGluZyBzcGVjaWFsIHNob3VsZCBiZSBkb25lIG5vdyB3ZSBrbm93IGhvdyBiaWcKLSAgICAgZXZlcnl0aGluZyBpcy4gICovCi0gIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uICgpOwotCi0gIC8qIEZpeCBhbnkgLnN0YXJ0b2YuIG9yIC5zaXplb2YuIHN5bWJvbHMuICAqLwotICBsYW5nX3NldF9zdGFydG9mICgpOwotCi0gIC8qIERvIGFsbCB0aGUgYXNzaWdubWVudHMsIG5vdyB0aGF0IHdlIGtub3cgdGhlIGZpbmFsIHJlc3RpbmdwbGFjZXMKLSAgICAgb2YgYWxsIHRoZSBzeW1ib2xzICovCi0KLSAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKLQkJICAgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJICAgICAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgbWFrZSBzZW5zZS4gICovCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcykKLSAgICBsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzICgpOwotICAKLSAgLyogRmluYWwgc3R1ZmZzICovCi0KLSAgbGRlbXVsX2ZpbmlzaCAoKTsKLSAgbGFuZ19maW5pc2ggKCk7Ci19Ci0KLS8qIEVYUE9SVEVEIFRPIFlBQ0MgKi8KLQotdm9pZAotbGFuZ19hZGRfd2lsZCAoc2VjdGlvbl9uYW1lLCBzZWN0aW9uc19zb3J0ZWQsIGZpbGVuYW1lLCBmaWxlbmFtZXNfc29ydGVkLAotCSAgICAgICBrZWVwX3NlY3Rpb25zLCBleGNsdWRlX2ZpbGVuYW1lX2xpc3QpCi0gICAgIGNvbnN0IGNoYXIgKmNvbnN0IHNlY3Rpb25fbmFtZTsKLSAgICAgYm9vbGVhbiBzZWN0aW9uc19zb3J0ZWQ7Ci0gICAgIGNvbnN0IGNoYXIgKmNvbnN0IGZpbGVuYW1lOwotICAgICBib29sZWFuIGZpbGVuYW1lc19zb3J0ZWQ7Ci0gICAgIGJvb2xlYW4ga2VlcF9zZWN0aW9uczsKLSAgICAgc3RydWN0IG5hbWVfbGlzdCAqZXhjbHVkZV9maWxlbmFtZV9saXN0OwotewotICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX3dpbGRfc3RhdGVtZW50LAotCQkJCQkgICAgc3RhdF9wdHIpOwotCi0gIGlmIChzZWN0aW9uX25hbWUgIT0gKGNoYXIgKikgTlVMTCAmJiBzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIkNPTU1PTiIpID09IDApCi0gICAgewotICAgICAgcGxhY2VkX2NvbW1vbnMgPSB0cnVlOwotICAgIH0KLSAgaWYgKGZpbGVuYW1lICE9IE5VTEwgJiYgISB3aWxkY2FyZHAgKGZpbGVuYW1lKSkKLSAgICB7Ci0gICAgICBsYW5nX2hhc19pbnB1dF9maWxlID0gdHJ1ZTsKLSAgICB9Ci0gIG5ldy0+c2VjdGlvbl9uYW1lID0gc2VjdGlvbl9uYW1lOwotICBuZXctPnNlY3Rpb25zX3NvcnRlZCA9IHNlY3Rpb25zX3NvcnRlZDsKLSAgbmV3LT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuZXctPmZpbGVuYW1lc19zb3J0ZWQgPSBmaWxlbmFtZXNfc29ydGVkOwotICBuZXctPmtlZXBfc2VjdGlvbnMgPSBrZWVwX3NlY3Rpb25zOwotICBuZXctPmV4Y2x1ZGVfZmlsZW5hbWVfbGlzdCA9IGV4Y2x1ZGVfZmlsZW5hbWVfbGlzdDsKLSAgbGFuZ19saXN0X2luaXQgKCZuZXctPmNoaWxkcmVuKTsKLX0KLQotdm9pZAotbGFuZ19zZWN0aW9uX3N0YXJ0IChuYW1lLCBhZGRyZXNzKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICogYWRkcmVzczsKLXsKLSAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlICphZCA9IG5ld19zdGF0IChsYW5nX2FkZHJlc3Nfc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0KLSAgYWQtPnNlY3Rpb25fbmFtZSA9IG5hbWU7Ci0gIGFkLT5hZGRyZXNzID0gYWRkcmVzczsKLX0KLQotLyogU2V0IHRoZSBzdGFydCBzeW1ib2wgdG8gTkFNRS4gIENNRExJTkUgaXMgbm9uemVybyBpZiB0aGlzIGlzIGNhbGxlZAotICAgYmVjYXVzZSBvZiBhIC1lIGFyZ3VtZW50IG9uIHRoZSBjb21tYW5kIGxpbmUsIG9yIHplcm8gaWYgdGhpcyBpcwotICAgY2FsbGVkIGJ5IEVOVFJZIGluIGEgbGlua2VyIHNjcmlwdC4gIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdGFrZQotICAgcHJlY2VkZW5jZS4gICovCi0KLXZvaWQKLWxhbmdfYWRkX2VudHJ5IChuYW1lLCBjbWRsaW5lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGNtZGxpbmU7Ci17Ci0gIGlmIChlbnRyeV9zeW1ib2wgPT0gTlVMTAotICAgICAgfHwgY21kbGluZQotICAgICAgfHwgISBlbnRyeV9mcm9tX2NtZGxpbmUpCi0gICAgewotICAgICAgZW50cnlfc3ltYm9sID0gbmFtZTsKLSAgICAgIGVudHJ5X2Zyb21fY21kbGluZSA9IGNtZGxpbmU7Ci0gICAgfQotfQotCi12b2lkCi1sYW5nX2FkZF90YXJnZXQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ190YXJnZXRfc3RhdGVtZW50LAotCQkJCQkgICAgICBzdGF0X3B0cik7Ci0KLSAgbmV3LT50YXJnZXQgPSBuYW1lOwotCi19Ci0KLXZvaWQKLWxhbmdfYWRkX21hcCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKm5hbWUpCi0JewotCSAgY2FzZSAnRic6Ci0JICBtYXBfb3B0aW9uX2YgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbmFtZSsrOwotICAgIH0KLX0KLQotdm9pZAotbGFuZ19hZGRfZmlsbCAoZXhwKQotICAgICBpbnQgZXhwOwotewotICBsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX2ZpbGxfc3RhdGVtZW50LAotCQkJCQkgICAgc3RhdF9wdHIpOwotCi0gIG5ldy0+ZmlsbCA9IGV4cDsKLX0KLQotdm9pZAotbGFuZ19hZGRfZGF0YSAodHlwZSwgZXhwKQotICAgICBpbnQgdHlwZTsKLSAgICAgdW5pb24gZXRyZWVfdW5pb24gKmV4cDsKLXsKLQotICBsYW5nX2RhdGFfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX2RhdGFfc3RhdGVtZW50LAotCQkJCQkgICAgc3RhdF9wdHIpOwotCi0gIG5ldy0+ZXhwID0gZXhwOwotICBuZXctPnR5cGUgPSB0eXBlOwotCi19Ci0KLS8qIENyZWF0ZSBhIG5ldyByZWxvYyBzdGF0ZW1lbnQuICBSRUxPQyBpcyB0aGUgQkZEIHJlbG9jYXRpb24gdHlwZSB0bwotICAgZ2VuZXJhdGUuICBIT1dUTyBpcyB0aGUgY29ycmVzcG9uZGluZyBob3d0byBzdHJ1Y3R1cmUgKHdlIGNvdWxkCi0gICBsb29rIHRoaXMgdXAsIGJ1dCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGRvbmUgc28pLiAgU0VDVElPTiBpcyB0aGUKLSAgIHNlY3Rpb24gdG8gZ2VuZXJhdGUgYSByZWxvYyBhZ2FpbnN0LCBvciBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZQotICAgc3ltYm9sIHRvIGdlbmVyYXRlIGEgcmVsb2MgYWdhaW5zdC4gIEV4YWN0bHkgb25lIG9mIFNFQ1RJT04gYW5kCi0gICBOQU1FIG11c3QgYmUgTlVMTC4gIEFEREVORCBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgYWRkZW5kLiAgKi8KLQotdm9pZAotbGFuZ19hZGRfcmVsb2MgKHJlbG9jLCBob3d0bywgc2VjdGlvbiwgbmFtZSwgYWRkZW5kKQotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5pb24gZXRyZWVfdW5pb24gKmFkZGVuZDsKLXsKLSAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcCA9IG5ld19zdGF0IChsYW5nX3JlbG9jX3N0YXRlbWVudCwgc3RhdF9wdHIpOwotICAKLSAgcC0+cmVsb2MgPSByZWxvYzsKLSAgcC0+aG93dG8gPSBob3d0bzsKLSAgcC0+c2VjdGlvbiA9IHNlY3Rpb247Ci0gIHAtPm5hbWUgPSBuYW1lOwotICBwLT5hZGRlbmRfZXhwID0gYWRkZW5kOwotCi0gIHAtPmFkZGVuZF92YWx1ZSA9IDA7Ci0gIHAtPm91dHB1dF9zZWN0aW9uID0gTlVMTDsKLSAgcC0+b3V0cHV0X3ZtYSA9IDA7Ci19Ci0KLWxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqCi1sYW5nX2FkZF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKiBleHA7Ci17Ci0gIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnQsCi0JCQkJCQkgIHN0YXRfcHRyKTsKLQotICBuZXctPmV4cCA9IGV4cDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotdm9pZAotbGFuZ19hZGRfYXR0cmlidXRlIChhdHRyaWJ1dGUpCi0gICAgIGVudW0gc3RhdGVtZW50X2VudW0gYXR0cmlidXRlOwotewotICBuZXdfc3RhdGVtZW50IChhdHRyaWJ1dGUsIHNpemVvZiAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSksIHN0YXRfcHRyKTsKLX0KLQotdm9pZAotbGFuZ19zdGFydHVwIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBpZiAoc3RhcnR1cF9maWxlICE9IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQJUZtdWx0aXBsZSBTVEFSVFVQIGZpbGVzXG4iKSk7Ci0gICAgfQotICBmaXJzdF9maWxlLT5maWxlbmFtZSA9IG5hbWU7Ci0gIGZpcnN0X2ZpbGUtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgZmlyc3RfZmlsZS0+cmVhbCA9IHRydWU7Ci0KLSAgc3RhcnR1cF9maWxlID0gbmFtZTsKLX0KLQotdm9pZAotbGFuZ19mbG9hdCAobWF5YmUpCi0gICAgIGJvb2xlYW4gbWF5YmU7Ci17Ci0gIGxhbmdfZmxvYXRfZmxhZyA9IG1heWJlOwotfQotCi12b2lkCi1sYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoZmlsbCwgbWVtc3BlYywgcGhkcnMsIGxtYV9tZW1zcGVjKQotICAgICBiZmRfdm1hIGZpbGw7Ci0gICAgIGNvbnN0IGNoYXIgKm1lbXNwZWM7Ci0gICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGhkcnM7Ci0gICAgIGNvbnN0IGNoYXIgKmxtYV9tZW1zcGVjOwotewotICBjdXJyZW50X3NlY3Rpb24tPmZpbGwgPSBmaWxsOwotICBjdXJyZW50X3NlY3Rpb24tPnJlZ2lvbiA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKG1lbXNwZWMpOwotICBpZiAoc3RyY21wIChsbWFfbWVtc3BlYywgIipkZWZhdWx0KiIpICE9IDApCi0gICAgewotICAgICAgY3VycmVudF9zZWN0aW9uLT5sbWFfcmVnaW9uID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCAobG1hX21lbXNwZWMpOwotICAgICAgLyogaWYgbm8gcnVudGltZSByZWdpb24gaGFzIGJlZW4gZ2l2ZW4sIGJ1dCB0aGUgbG9hZCByZWdpb24gaGFzIGJlZW4sCi0gICAgICAgICB1c2UgdGhlIGxvYWQgcmVnaW9uICovCi0gICAgICBpZiAoc3RyY21wIChtZW1zcGVjLCAiKmRlZmF1bHQqIikgPT0gMCkKLSAgICAgICAgY3VycmVudF9zZWN0aW9uLT5yZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwIChsbWFfbWVtc3BlYyk7Ci0gICAgfQotICBjdXJyZW50X3NlY3Rpb24tPnBoZHJzID0gcGhkcnM7Ci0gIHN0YXRfcHRyID0gJnN0YXRlbWVudF9saXN0OwotfQotCi0vKgotIENyZWF0ZSBhbiBhYnNvbHV0ZSBzeW1ib2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUKLSBhZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgdGhlIHNlY3Rpb24gbmFtZWQuCi0KLSBJZiB0aGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLCB0aGVuIGRvIG5vdGhpbmcuCi0qLwotdm9pZAotbGFuZ19hYnNfc3ltYm9sX2F0X2JlZ2lubmluZ19vZiAoc2VjbmFtZSwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcKLSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIHNlY25hbWUpOwotICAgICAgaWYgKHNlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQloLT51LmRlZi52YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0JaC0+dS5kZWYudmFsdWUgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCBzZWMpOwotCi0gICAgICBoLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICB9Ci19Ci0KLS8qCi0gQ3JlYXRlIGFuIGFic29sdXRlIHN5bWJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIHdpdGggdGhlIHZhbHVlIG9mIHRoZQotIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiBuYW1lZC4KLQotIElmIHRoZSBzeW1ib2wgYWxyZWFkeSBleGlzdHMsIHRoZW4gZG8gbm90aGluZy4KLSovCi12b2lkCi1sYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mIChzZWNuYW1lLCBuYW1lKQotICAgICBjb25zdCBjaGFyICpzZWNuYW1lOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBuYW1lLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLQotICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldwotICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgc2VjbmFtZSk7Ci0gICAgICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCWgtPnUuZGVmLnZhbHVlID0gMDsKLSAgICAgIGVsc2UKLQloLT51LmRlZi52YWx1ZSA9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCBzZWMpCi0JCQkgICsgYmZkX3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgc2VjKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9vY3RldHNfcGVyX2J5dGUgKG91dHB1dF9iZmQpKTsKLQotICAgICAgaC0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotfQotCi12b2lkCi1sYW5nX3N0YXRlbWVudF9hcHBlbmQgKGxpc3QsIGVsZW1lbnQsIGZpZWxkKQotICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKiBsaXN0OwotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogZWxlbWVudDsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiBmaWVsZDsKLXsKLSAgKihsaXN0LT50YWlsKSA9IGVsZW1lbnQ7Ci0gIGxpc3QtPnRhaWwgPSBmaWVsZDsKLX0KLQotLyogU2V0IHRoZSBvdXRwdXQgZm9ybWF0IHR5cGUuICAtb2Zvcm1hdCBvdmVycmlkZXMgc2NyaXB0cy4gICovCi0KLXZvaWQKLWxhbmdfYWRkX291dHB1dF9mb3JtYXQgKGZvcm1hdCwgYmlnLCBsaXR0bGUsIGZyb21fc2NyaXB0KQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKmJpZzsKLSAgICAgY29uc3QgY2hhciAqbGl0dGxlOwotICAgICBpbnQgZnJvbV9zY3JpcHQ7Ci17Ci0gIGlmIChvdXRwdXRfdGFyZ2V0ID09IE5VTEwgfHwgIWZyb21fc2NyaXB0KQotICAgIHsKLSAgICAgIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9CSUcKLQkgICYmIGJpZyAhPSBOVUxMKQotCWZvcm1hdCA9IGJpZzsKLSAgICAgIGVsc2UgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0xJVFRMRQotCSAgICAgICAmJiBsaXR0bGUgIT0gTlVMTCkKLQlmb3JtYXQgPSBsaXR0bGU7Ci0KLSAgICAgIG91dHB1dF90YXJnZXQgPSBmb3JtYXQ7Ci0gICAgfQotfQotCi0vKiBFbnRlciBhIGdyb3VwLiAgVGhpcyBjcmVhdGVzIGEgbmV3IGxhbmdfZ3JvdXBfc3RhdGVtZW50LCBhbmQgc2V0cwotICAgc3RhdF9wdHIgdG8gYnVpbGQgbmV3IHN0YXRlbWVudHMgd2l0aGluIHRoZSBncm91cC4gICovCi0KLXZvaWQKLWxhbmdfZW50ZXJfZ3JvdXAgKCkKLXsKLSAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSAqZzsKLQotICBnID0gbmV3X3N0YXQgKGxhbmdfZ3JvdXBfc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0gIGxhbmdfbGlzdF9pbml0ICgmZy0+Y2hpbGRyZW4pOwotICBzdGF0X3B0ciA9ICZnLT5jaGlsZHJlbjsKLX0KLQotLyogTGVhdmUgYSBncm91cC4gIFRoaXMganVzdCByZXNldHMgc3RhdF9wdHIgdG8gc3RhcnQgd3JpdGluZyB0byB0aGUKLSAgIHJlZ3VsYXIgbGlzdCBvZiBzdGF0ZW1lbnRzIGFnYWluLiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBub3Qgd29yayBpZgotICAgZ3JvdXBzIGNhbiBvY2N1ciBpbnNpZGUgYW55dGhpbmcgZWxzZSB3aGljaCBjYW4gYWRqdXN0IHN0YXRfcHRyLAotICAgYnV0IGN1cnJlbnRseSB0aGV5IGNhbid0LiAgKi8KLQotdm9pZAotbGFuZ19sZWF2ZV9ncm91cCAoKQotewotICBzdGF0X3B0ciA9ICZzdGF0ZW1lbnRfbGlzdDsKLX0KLQotLyogQWRkIGEgbmV3IHByb2dyYW0gaGVhZGVyLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggZW50cnkgaW4gYSBQSERSUwotICAgY29tbWFuZCBpbiBhIGxpbmtlciBzY3JpcHQuICAqLwotCi12b2lkCi1sYW5nX25ld19waGRyIChuYW1lLCB0eXBlLCBmaWxlaGRyLCBwaGRycywgYXQsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICp0eXBlOwotICAgICBib29sZWFuIGZpbGVoZHI7Ci0gICAgIGJvb2xlYW4gcGhkcnM7Ci0gICAgIGV0cmVlX3R5cGUgKmF0OwotICAgICBldHJlZV90eXBlICpmbGFnczsKLXsKLSAgc3RydWN0IGxhbmdfcGhkciAqbiwgKipwcDsKLQotICBuID0gKHN0cnVjdCBsYW5nX3BoZHIgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGFuZ19waGRyKSk7Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5uYW1lID0gbmFtZTsKLSAgbi0+dHlwZSA9IGV4cF9nZXRfdmFsdWVfaW50ICh0eXBlLCAwLCAicHJvZ3JhbSBoZWFkZXIgdHlwZSIsCi0JCQkgICAgICAgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKLSAgbi0+ZmlsZWhkciA9IGZpbGVoZHI7Ci0gIG4tPnBoZHJzID0gcGhkcnM7Ci0gIG4tPmF0ID0gYXQ7Ci0gIG4tPmZsYWdzID0gZmxhZ3M7Ci0KLSAgZm9yIChwcCA9ICZsYW5nX3BoZHJfbGlzdDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gbjsKLX0KLQotLyogUmVjb3JkIHRoZSBwcm9ncmFtIGhlYWRlciBpbmZvcm1hdGlvbiBpbiB0aGUgb3V0cHV0IEJGRC4gIEZJWE1FOiBXZQotICAgc2hvdWxkIG5vdCBiZSBjYWxsaW5nIGFuIEVMRiBzcGVjaWZpYyBmdW5jdGlvbiBoZXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfcmVjb3JkX3BoZHJzICgpCi17Ci0gIHVuc2lnbmVkIGludCBhbGM7Ci0gIGFzZWN0aW9uICoqc2VjczsKLSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpsYXN0OwotICBzdHJ1Y3QgbGFuZ19waGRyICpsOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICp1OwotCi0gIGFsYyA9IDEwOwotICBzZWNzID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChhbGMgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgbGFzdCA9IE5VTEw7Ci0gIGZvciAobCA9IGxhbmdfcGhkcl9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICBiZmRfdm1hIGF0OwotCi0gICAgICBjID0gMDsKLSAgICAgIGZvciAodSA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmhlYWQ7Ci0JICAgdSAhPSBOVUxMOwotCSAgIHUgPSB1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQubmV4dCkKLQl7Ci0JICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQkgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGw7Ci0KLQkgIG9zID0gJnUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotCSAgcGwgPSBvcy0+cGhkcnM7Ci0JICBpZiAocGwgIT0gTlVMTCkKLQkgICAgbGFzdCA9IHBsOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG9zLT5zZWN0eXBlID09IG5vbG9hZF9zZWN0aW9uCi0JCSAgfHwgb3MtPmJmZF9zZWN0aW9uID09IE5VTEwKLQkJICB8fCAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgcGwgPSBsYXN0OwotCSAgICB9Ci0KLQkgIGlmIChvcy0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGZvciAoOyBwbCAhPSBOVUxMOyBwbCA9IHBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAocGwtPm5hbWUsIGwtPm5hbWUpID09IDApCi0JCXsKLQkJICBpZiAoYyA+PSBhbGMpCi0JCSAgICB7Ci0JCSAgICAgIGFsYyAqPSAyOwotCQkgICAgICBzZWNzID0gKChhc2VjdGlvbiAqKikKLQkJCSAgICAgIHhyZWFsbG9jIChzZWNzLCBhbGMgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0JCSAgICB9Ci0JCSAgc2Vjc1tjXSA9IG9zLT5iZmRfc2VjdGlvbjsKLQkJICArK2M7Ci0JCSAgcGwtPnVzZWQgPSB0cnVlOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsLT5mbGFncyA9PSBOVUxMKQotCWZsYWdzID0gMDsKLSAgICAgIGVsc2UKLQlmbGFncyA9IGV4cF9nZXRfdm1hIChsLT5mbGFncywgMCwgInBoZHIgZmxhZ3MiLAotCQkJICAgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pOwotCi0gICAgICBpZiAobC0+YXQgPT0gTlVMTCkKLQlhdCA9IDA7Ci0gICAgICBlbHNlCi0JYXQgPSBleHBfZ2V0X3ZtYSAobC0+YXQsIDAsICJwaGRyIGxvYWQgYWRkcmVzcyIsCi0JCQkgIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0KLSAgICAgIGlmICghIGJmZF9yZWNvcmRfcGhkciAob3V0cHV0X2JmZCwgbC0+dHlwZSwKLQkJCSAgICAgbC0+ZmxhZ3MgPT0gTlVMTCA/IGZhbHNlIDogdHJ1ZSwKLQkJCSAgICAgZmxhZ3MsCi0JCQkgICAgIGwtPmF0ID09IE5VTEwgPyBmYWxzZSA6IHRydWUsCi0JCQkgICAgIGF0LCBsLT5maWxlaGRyLCBsLT5waGRycywgYywgc2VjcykpCi0JZWluZm8gKF8oIiVGJVA6IGJmZF9yZWNvcmRfcGhkciBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotCi0gIGZyZWUgKHNlY3MpOwotCi0gIC8qIE1ha2Ugc3VyZSBhbGwgdGhlIHBoZHIgYXNzaWdubWVudHMgc3VjY2VlZGVkLiAgKi8KLSAgZm9yICh1ID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuaGVhZDsKLSAgICAgICB1ICE9IE5VTEw7Ci0gICAgICAgdSA9IHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGw7Ci0KLSAgICAgIGlmICh1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuYmZkX3NlY3Rpb24gPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgZm9yIChwbCA9IHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5waGRyczsKLQkgICBwbCAhPSBOVUxMOwotCSAgIHBsID0gcGwtPm5leHQpCi0JaWYgKCEgcGwtPnVzZWQgJiYgc3RyY21wIChwbC0+bmFtZSwgIk5PTkUiKSAhPSAwKQotCSAgZWluZm8gKF8oIiVYJVA6IHNlY3Rpb24gYCVzJyBhc3NpZ25lZCB0byBub24tZXhpc3RlbnQgcGhkciBgJXMnXG4iKSwKLQkJIHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5uYW1lLCBwbC0+bmFtZSk7Ci0gICAgfQotfQotCi0vKiBSZWNvcmQgYSBsaXN0IG9mIHNlY3Rpb25zIHdoaWNoIG1heSBub3QgYmUgY3Jvc3MgcmVmZXJlbmNlZC4gICovCi0KLXZvaWQKLWxhbmdfYWRkX25vY3Jvc3NyZWYgKGwpCi0gICAgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKmw7Ci17Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuOwotCi0gIG4gPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+bmV4dCA9IG5vY3Jvc3NyZWZfbGlzdDsKLSAgbi0+bGlzdCA9IGw7Ci0gIG5vY3Jvc3NyZWZfbGlzdCA9IG47Ci0KLSAgLyogU2V0IG5vdGljZV9hbGwgc28gdGhhdCB3ZSBnZXQgaW5mb3JtZWQgYWJvdXQgYWxsIHN5bWJvbHMuICAqLwotICBsaW5rX2luZm8ubm90aWNlX2FsbCA9IHRydWU7Ci19Ci0MCi0vKiBPdmVybGF5IGhhbmRsaW5nLiAgV2UgaGFuZGxlIG92ZXJsYXlzIHdpdGggc29tZSBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLQotLyogVGhlIG92ZXJsYXkgdmlydHVhbCBhZGRyZXNzLiAgKi8KLXN0YXRpYyBldHJlZV90eXBlICpvdmVybGF5X3ZtYTsKLQotLyogVGhlIG92ZXJsYXkgbG9hZCBhZGRyZXNzLiAgKi8KLXN0YXRpYyBldHJlZV90eXBlICpvdmVybGF5X2xtYTsKLQotLyogV2hldGhlciBub2Nyb3NzcmVmcyBpcyBzZXQgZm9yIHRoaXMgb3ZlcmxheS4gICovCi1zdGF0aWMgaW50IG92ZXJsYXlfbm9jcm9zc3JlZnM7Ci0KLS8qIEFuIGV4cHJlc3Npb24gZm9yIHRoZSBtYXhpbXVtIHNlY3Rpb24gc2l6ZSBzZWVuIHNvIGZhci4gICovCi1zdGF0aWMgZXRyZWVfdHlwZSAqb3ZlcmxheV9tYXg7Ci0KLS8qIEEgbGlzdCBvZiBhbGwgdGhlIHNlY3Rpb25zIGluIHRoaXMgb3ZlcmxheS4gICovCi0KLXN0cnVjdCBvdmVybGF5X2xpc3QKLXsKLSAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbmV4dDsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci19OwotCi1zdGF0aWMgc3RydWN0IG92ZXJsYXlfbGlzdCAqb3ZlcmxheV9saXN0OwotCi0vKiBTdGFydCBoYW5kbGluZyBhbiBvdmVybGF5LiAgKi8KLQotdm9pZAotbGFuZ19lbnRlcl9vdmVybGF5ICh2bWFfZXhwciwgbG1hX2V4cHIsIG5vY3Jvc3NyZWZzKQotICAgICBldHJlZV90eXBlICp2bWFfZXhwcjsKLSAgICAgZXRyZWVfdHlwZSAqbG1hX2V4cHI7Ci0gICAgIGludCBub2Nyb3NzcmVmczsKLXsKLSAgLyogVGhlIGdyYW1tYXIgc2hvdWxkIHByZXZlbnQgbmVzdGVkIG92ZXJsYXlzIGZyb20gb2NjdXJyaW5nLiAgKi8KLSAgQVNTRVJUIChvdmVybGF5X3ZtYSA9PSBOVUxMCi0JICAmJiBvdmVybGF5X2xtYSA9PSBOVUxMCi0JICAmJiBvdmVybGF5X2xpc3QgPT0gTlVMTAotCSAgJiYgb3ZlcmxheV9tYXggPT0gTlVMTCk7Ci0KLSAgb3ZlcmxheV92bWEgPSB2bWFfZXhwcjsKLSAgb3ZlcmxheV9sbWEgPSBsbWFfZXhwcjsKLSAgb3ZlcmxheV9ub2Nyb3NzcmVmcyA9IG5vY3Jvc3NyZWZzOwotfQotCi0vKiBTdGFydCBhIHNlY3Rpb24gaW4gYW4gb3ZlcmxheS4gIFdlIGhhbmRsZSB0aGlzIGJ5IGNhbGxpbmcKLSAgIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IHdpdGggdGhlIGNvcnJlY3QgVk1BIGFuZCBMTUEuICAqLwotCi12b2lkCi1sYW5nX2VudGVyX292ZXJsYXlfc2VjdGlvbiAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbjsKLSAgZXRyZWVfdHlwZSAqc2l6ZTsKLQotICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAobmFtZSwgb3ZlcmxheV92bWEsIG5vcm1hbF9zZWN0aW9uLAotCQkJCSAgICAgICAwLCAwLCAwLCBvdmVybGF5X2xtYSk7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2VjdGlvbiwgdGhlbiBiYXNlIHRoZSBWTUEgYW5kIExNQSBvZiBmdXR1cmUKLSAgICAgc2VjdGlvbnMgb24gdGhpcyBvbmUuICBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZXZlbiBpZiBgLicgaXMKLSAgICAgdXNlZCBpbiB0aGUgYWRkcmVzc2VzLiAgKi8KLSAgaWYgKG92ZXJsYXlfbGlzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIG92ZXJsYXlfdm1hID0gZXhwX25hbWVvcCAoQUREUiwgbmFtZSk7Ci0gICAgICBvdmVybGF5X2xtYSA9IGV4cF9uYW1lb3AgKExPQURBRERSLCBuYW1lKTsKLSAgICB9Ci0KLSAgLyogUmVtZW1iZXIgdGhlIHNlY3Rpb24uICAqLwotICBuID0gKHN0cnVjdCBvdmVybGF5X2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+b3MgPSBjdXJyZW50X3NlY3Rpb247Ci0gIG4tPm5leHQgPSBvdmVybGF5X2xpc3Q7Ci0gIG92ZXJsYXlfbGlzdCA9IG47Ci0KLSAgc2l6ZSA9IGV4cF9uYW1lb3AgKFNJWkVPRiwgbmFtZSk7Ci0KLSAgLyogQWRqdXN0IHRoZSBMTUEgZm9yIHRoZSBuZXh0IHNlY3Rpb24uICAqLwotICBvdmVybGF5X2xtYSA9IGV4cF9iaW5vcCAoJysnLCBvdmVybGF5X2xtYSwgc2l6ZSk7Ci0KLSAgLyogQXJyYW5nZSB0byB3b3JrIG91dCB0aGUgbWF4aW11bSBzZWN0aW9uIGVuZCBhZGRyZXNzLiAgKi8KLSAgaWYgKG92ZXJsYXlfbWF4ID09IE5VTEwpCi0gICAgb3ZlcmxheV9tYXggPSBzaXplOwotICBlbHNlCi0gICAgb3ZlcmxheV9tYXggPSBleHBfYmlub3AgKE1BWF9LLCBvdmVybGF5X21heCwgc2l6ZSk7Ci19Ci0KLS8qIEZpbmlzaCBhIHNlY3Rpb24gaW4gYW4gb3ZlcmxheS4gIFRoZXJlIGlzbid0IGFueSBzcGVjaWFsIHRvIGRvCi0gICBoZXJlLiAgKi8KLQotdm9pZAotbGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24gKGZpbGwsIHBoZHJzKQotICAgICBiZmRfdm1hIGZpbGw7Ci0gICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGhkcnM7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoYXIgKmNsZWFuLCAqczI7Ci0gIGNvbnN0IGNoYXIgKnMxOwotICBjaGFyICpidWY7Ci0KLSAgbmFtZSA9IGN1cnJlbnRfc2VjdGlvbi0+bmFtZTsKLQotICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoZmlsbCwgIipkZWZhdWx0KiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhkcnMsICIqZGVmYXVsdCoiKTsKLQotICAvKiBEZWZpbmUgdGhlIG1hZ2ljIHN5bWJvbHMuICAqLwotCi0gIGNsZWFuID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICBzMiA9IGNsZWFuOwotICBmb3IgKHMxID0gbmFtZTsgKnMxICE9ICdcMCc7IHMxKyspCi0gICAgaWYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqczEpIHx8ICpzMSA9PSAnXycpCi0gICAgICAqczIrKyA9ICpzMTsKLSAgKnMyID0gJ1wwJzsKLQotICBidWYgPSB4bWFsbG9jIChzdHJsZW4gKGNsZWFuKSArIHNpemVvZiAiX19sb2FkX3N0YXJ0XyIpOwotICBzcHJpbnRmIChidWYsICJfX2xvYWRfc3RhcnRfJXMiLCBjbGVhbik7Ci0gIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBidWYsCi0JCQkJICBleHBfbmFtZW9wIChMT0FEQUREUiwgbmFtZSkpKTsKLQotICBidWYgPSB4bWFsbG9jIChzdHJsZW4gKGNsZWFuKSArIHNpemVvZiAiX19sb2FkX3N0b3BfIik7Ci0gIHNwcmludGYgKGJ1ZiwgIl9fbG9hZF9zdG9wXyVzIiwgY2xlYW4pOwotICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgYnVmLAotCQkJCSAgZXhwX2Jpbm9wICgnKycsCi0JCQkJCSAgICAgZXhwX25hbWVvcCAoTE9BREFERFIsIG5hbWUpLAotCQkJCQkgICAgIGV4cF9uYW1lb3AgKFNJWkVPRiwgbmFtZSkpKSk7Ci0KLSAgZnJlZSAoY2xlYW4pOwotfQotCi0vKiBGaW5pc2ggYW4gb3ZlcmxheS4gIElmIHRoZXJlIGFyZSBhbnkgb3ZlcmxheSB3aWRlIHNldHRpbmdzLCB0aGlzCi0gICBsb29rcyB0aHJvdWdoIGFsbCB0aGUgc2VjdGlvbnMgaW4gdGhlIG92ZXJsYXkgYW5kIHNldHMgdGhlbS4gICovCi0KLXZvaWQKLWxhbmdfbGVhdmVfb3ZlcmxheSAoZmlsbCwgbWVtc3BlYywgcGhkcnMsIGxtYV9tZW1zcGVjKQotICAgICBiZmRfdm1hIGZpbGw7Ci0gICAgIGNvbnN0IGNoYXIgKm1lbXNwZWM7Ci0gICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGhkcnM7Ci0gICAgIGNvbnN0IGNoYXIgKmxtYV9tZW1zcGVjOwotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcmVnaW9uOwotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqbG1hX3JlZ2lvbjsKLSAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbDsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbm9jcm9zc3JlZjsKLQotICBpZiAobWVtc3BlYyA9PSBOVUxMKQotICAgIHJlZ2lvbiA9IE5VTEw7Ci0gIGVsc2UKLSAgICByZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwIChtZW1zcGVjKTsKLQotICBpZiAobG1hX21lbXNwZWMgPT0gTlVMTCkKLSAgICBsbWFfcmVnaW9uID0gTlVMTDsKLSAgZWxzZQotICAgIGxtYV9yZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwIChsbWFfbWVtc3BlYyk7Ci0KLSAgbm9jcm9zc3JlZiA9IE5VTEw7Ci0KLSAgbCA9IG92ZXJsYXlfbGlzdDsKLSAgd2hpbGUgKGwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpuZXh0OwotCi0gICAgICBpZiAoZmlsbCAhPSAwICYmIGwtPm9zLT5maWxsID09IDApCi0JbC0+b3MtPmZpbGwgPSBmaWxsOwotICAgICAgaWYgKHJlZ2lvbiAhPSBOVUxMICYmIGwtPm9zLT5yZWdpb24gPT0gTlVMTCkKLQlsLT5vcy0+cmVnaW9uID0gcmVnaW9uOwotICAgICAgaWYgKGxtYV9yZWdpb24gIT0gTlVMTCAmJiBsLT5vcy0+bG1hX3JlZ2lvbiA9PSBOVUxMKQotICAgICAgICBsLT5vcy0+bG1hX3JlZ2lvbiA9IGxtYV9yZWdpb247Ci0gICAgICBpZiAocGhkcnMgIT0gTlVMTCAmJiBsLT5vcy0+cGhkcnMgPT0gTlVMTCkKLQlsLT5vcy0+cGhkcnMgPSBwaGRyczsKLQotICAgICAgaWYgKG92ZXJsYXlfbm9jcm9zc3JlZnMpCi0JewotCSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbmM7Ci0KLQkgIG5jID0gKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpuYyk7Ci0JICBuYy0+bmFtZSA9IGwtPm9zLT5uYW1lOwotCSAgbmMtPm5leHQgPSBub2Nyb3NzcmVmOwotCSAgbm9jcm9zc3JlZiA9IG5jOwotCX0KLQotICAgICAgbmV4dCA9IGwtPm5leHQ7Ci0gICAgICBmcmVlIChsKTsKLSAgICAgIGwgPSBuZXh0OwotICAgIH0KLQotICBpZiAobm9jcm9zc3JlZiAhPSBOVUxMKQotICAgIGxhbmdfYWRkX25vY3Jvc3NyZWYgKG5vY3Jvc3NyZWYpOwotCi0gIC8qIFVwZGF0ZSAuIGZvciB0aGUgZW5kIG9mIHRoZSBvdmVybGF5LiAgKi8KLSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICIuIiwKLQkJCQkgIGV4cF9iaW5vcCAoJysnLCBvdmVybGF5X3ZtYSwgb3ZlcmxheV9tYXgpKSk7Ci0KLSAgb3ZlcmxheV92bWEgPSBOVUxMOwotICBvdmVybGF5X2xtYSA9IE5VTEw7Ci0gIG92ZXJsYXlfbm9jcm9zc3JlZnMgPSAwOwotICBvdmVybGF5X2xpc3QgPSBOVUxMOwotICBvdmVybGF5X21heCA9IE5VTEw7Ci19Ci0MCi0vKiBWZXJzaW9uIGhhbmRsaW5nLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgRUxGLiAgKi8KLQotLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgaG9sZHMgdGhlIHZlcnNpb24gdHJlZSB0aGF0IHdlIGJ1aWxkLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpsYW5nX2VsZl92ZXJzaW9uX2luZm87Ci0KLXN0YXRpYyBpbnQKLWxhbmdfdmVyc19tYXRjaF9sYW5nX2MgKGV4cHIsIHN5bSkKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpleHByOwotICAgICBjb25zdCBjaGFyICpzeW07Ci17Ci0gIGlmIChleHByLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBleHByLT5wYXR0ZXJuWzFdID09ICdcMCcpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBzeW0sIDApID09IDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWxhbmdfdmVyc19tYXRjaF9sYW5nX2NwbHVzcGx1cyAoZXhwciwgc3ltKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmV4cHI7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bTsKLXsKLSAgY2hhciAqYWx0X3N5bTsKLSAgaW50IHJlc3VsdDsKLQotICBpZiAoZXhwci0+cGF0dGVyblswXSA9PSAnKicgJiYgZXhwci0+cGF0dGVyblsxXSA9PSAnXDAnKQotICAgIHJldHVybiAxOwotCi0gIGFsdF9zeW0gPSBjcGx1c19kZW1hbmdsZShzeW0sIC8qIERNR0xfTk9fVFBBUkFNUyAqLyAwKTsKLSAgaWYgKCFhbHRfc3ltKQotICAgIHsKLSAgICAgIC8qIGNwbHVzX2RlbWFuZ2xlIChhbHNvKSByZXR1cm5zIE5VTEwgd2hlbiBpdCBpcyBub3QgYSBDKysgc3ltYm9sLgotCSBTaG91bGQgd2UgZWFybHkgb3V0IGZhbHNlIGluIHRoaXMgY2FzZT8gICovCi0gICAgICByZXN1bHQgPSBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBzeW0sIDApID09IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgYWx0X3N5bSwgMCkgPT0gMDsKLSAgICAgIGZyZWUgKGFsdF9zeW0pOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50Ci1sYW5nX3ZlcnNfbWF0Y2hfbGFuZ19qYXZhIChleHByLCBzeW0pCi0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZXhwcjsKLSAgICAgY29uc3QgY2hhciAqc3ltOwotewotICBjaGFyICphbHRfc3ltOwotICBpbnQgcmVzdWx0OwotCi0gIGlmIChleHByLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBleHByLT5wYXR0ZXJuWzFdID09ICdcMCcpCi0gICAgcmV0dXJuIDE7Ci0KLSAgYWx0X3N5bSA9IGNwbHVzX2RlbWFuZ2xlKHN5bSwgRE1HTF9KQVZBKTsKLSAgaWYgKCFhbHRfc3ltKQotICAgIHsKLSAgICAgIC8qIGNwbHVzX2RlbWFuZ2xlIChhbHNvKSByZXR1cm5zIE5VTEwgd2hlbiBpdCBpcyBub3QgYSBKYXZhIHN5bWJvbC4KLQkgU2hvdWxkIHdlIGVhcmx5IG91dCBmYWxzZSBpbiB0aGlzIGNhc2U/ICAqLwotICAgICAgcmVzdWx0ID0gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgc3ltLCAwKSA9PSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGZubWF0Y2ggKGV4cHItPnBhdHRlcm4sIGFsdF9zeW0sIDApID09IDA7Ci0gICAgICBmcmVlIChhbHRfc3ltKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggdmFyaWFibGUgbmFtZSBvciBtYXRjaCBleHByZXNzaW9uLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICoKLWxhbmdfbmV3X3ZlcnNfcmVnZXggKG9yaWcsIG5ldywgbGFuZykKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpvcmlnOwotICAgICBjb25zdCBjaGFyICpuZXc7Ci0gICAgIGNvbnN0IGNoYXIgKmxhbmc7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICByZXQtPm5leHQgPSBvcmlnOwotICByZXQtPnBhdHRlcm4gPSBuZXc7Ci0KLSAgaWYgKGxhbmcgPT0gTlVMTCB8fCBzdHJjYXNlY21wIChsYW5nLCAiQyIpID09IDApCi0gICAgcmV0LT5tYXRjaCA9IGxhbmdfdmVyc19tYXRjaF9sYW5nX2M7Ci0gIGVsc2UgaWYgKHN0cmNhc2VjbXAgKGxhbmcsICJDKysiKSA9PSAwKQotICAgIHJldC0+bWF0Y2ggPSBsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jcGx1c3BsdXM7Ci0gIGVsc2UgaWYgKHN0cmNhc2VjbXAgKGxhbmcsICJKYXZhIikgPT0gMCkKLSAgICByZXQtPm1hdGNoID0gbGFuZ192ZXJzX21hdGNoX2xhbmdfamF2YTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlWCVQOiB1bmtub3duIGxhbmd1YWdlIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIiksCi0JICAgICBsYW5nKTsKLSAgICAgIHJldC0+bWF0Y2ggPSBsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCBzZXQgb2YgdmFyaWFibGUgbmFtZXMgYW5kIG1hdGNoCi0gICBleHByZXNzaW9ucy4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqCi1sYW5nX25ld192ZXJzX25vZGUgKGdsb2JhbHMsIGxvY2FscykKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpnbG9iYWxzOwotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmxvY2FsczsKLXsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIHJldC0+bmV4dCA9IE5VTEw7Ci0gIHJldC0+bmFtZSA9IE5VTEw7Ci0gIHJldC0+dmVybnVtID0gMDsKLSAgcmV0LT5nbG9iYWxzID0gZ2xvYmFsczsKLSAgcmV0LT5sb2NhbHMgPSBsb2NhbHM7Ci0gIHJldC0+ZGVwcyA9IE5VTEw7Ci0gIHJldC0+bmFtZV9pbmR4ID0gKHVuc2lnbmVkIGludCkgLTE7Ci0gIHJldC0+dXNlZCA9IDA7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgc3RhdGljIHZhcmlhYmxlIGtlZXBzIHRyYWNrIG9mIHZlcnNpb24gaW5kaWNlcy4gICovCi0KLXN0YXRpYyBpbnQgdmVyc2lvbl9pbmRleDsKLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBrbm93IHRoZSBuYW1lIGFuZCBkZXBlbmRlbmNpZXMgb2YgdGhlCi0gICB2ZXJzaW9uLiAgKi8KLQotdm9pZAotbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUgKG5hbWUsIHZlcnNpb24sIGRlcHMpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyc2lvbjsKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpkZXBzOwotewotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQsICoqcHA7Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZTE7Ci0KLSAgLyogTWFrZSBzdXJlIHRoaXMgbm9kZSBoYXMgYSB1bmlxdWUgbmFtZS4gICovCi0gIGZvciAodCA9IGxhbmdfZWxmX3ZlcnNpb25faW5mbzsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLSAgICBpZiAoc3RyY21wICh0LT5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgZWluZm8gKF8oIiVYJVA6IGR1cGxpY2F0ZSB2ZXJzaW9uIHRhZyBgJXMnXG4iKSwgbmFtZSk7Ci0KLSAgLyogQ2hlY2sgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbWF0Y2ggbmFtZXMsIGFuZCBtYWtlIHN1cmUgdGhlcmUKLSAgICAgYXJlbid0IGFueSBkdXBsaWNhdGVzLiAgKi8KLQotICBmb3IgKGUxID0gdmVyc2lvbi0+Z2xvYmFsczsgZTEgIT0gTlVMTDsgZTEgPSBlMS0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHQgPSBsYW5nX2VsZl92ZXJzaW9uX2luZm87IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICplMjsKLQotCSAgZm9yIChlMiA9IHQtPmxvY2FsczsgZTIgIT0gTlVMTDsgZTIgPSBlMi0+bmV4dCkKLQkgICAgaWYgKHN0cmNtcCAoZTEtPnBhdHRlcm4sIGUyLT5wYXR0ZXJuKSA9PSAwKQotCSAgICAgIGVpbmZvIChfKCIlWCVQOiBkdXBsaWNhdGUgZXhwcmVzc2lvbiBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIpLAotCQkgICAgIGUxLT5wYXR0ZXJuKTsKLQl9Ci0gICAgfQotCi0gIGZvciAoZTEgPSB2ZXJzaW9uLT5sb2NhbHM7IGUxICE9IE5VTEw7IGUxID0gZTEtPm5leHQpCi0gICAgewotICAgICAgZm9yICh0ID0gbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCXsKLQkgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZTI7Ci0KLQkgIGZvciAoZTIgPSB0LT5nbG9iYWxzOyBlMiAhPSBOVUxMOyBlMiA9IGUyLT5uZXh0KQotCSAgICBpZiAoc3RyY21wIChlMS0+cGF0dGVybiwgZTItPnBhdHRlcm4pID09IDApCi0JICAgICAgZWluZm8gKF8oIiVYJVA6IGR1cGxpY2F0ZSBleHByZXNzaW9uIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIiksCi0JCSAgICAgZTEtPnBhdHRlcm4pOwotCX0KLSAgICB9Ci0KLSAgdmVyc2lvbi0+ZGVwcyA9IGRlcHM7Ci0gIHZlcnNpb24tPm5hbWUgPSBuYW1lOwotICArK3ZlcnNpb25faW5kZXg7Ci0gIHZlcnNpb24tPnZlcm51bSA9IHZlcnNpb25faW5kZXg7Ci0KLSAgZm9yIChwcCA9ICZsYW5nX2VsZl92ZXJzaW9uX2luZm87ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZlcnNpb247Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2Ugc2VlIGEgdmVyc2lvbiBkZXBlbmRlbmN5LiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICoKLWxhbmdfYWRkX3ZlcnNfZGVwZW5kIChsaXN0LCBuYW1lKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmxpc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqcmV0OwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIHJldC0+bmV4dCA9IGxpc3Q7Ci0KLSAgZm9yICh0ID0gbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHQtPm5hbWUsIG5hbWUpID09IDApCi0JewotCSAgcmV0LT52ZXJzaW9uX25lZWRlZCA9IHQ7Ci0JICByZXR1cm4gcmV0OwotCX0KLSAgICB9Ci0KLSAgZWluZm8gKF8oIiVYJVA6IHVuYWJsZSB0byBmaW5kIHZlcnNpb24gZGVwZW5kZW5jeSBgJXMnXG4iKSwgbmFtZSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLWxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gKCkKLXsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpncmVnID0gTlVMTCwgKmxyZWc7Ci0KLSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZXhwb3J0cyIpOwotICAgICAgY2hhciAqY29udGVudHMsICpwOwotICAgICAgYmZkX3NpemVfdHlwZSBsZW47Ci0KLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGxlbiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzZWMpOwotICAgICAgY29udGVudHMgPSB4bWFsbG9jIChsZW4pOwotICAgICAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlzLT50aGVfYmZkLCBzZWMsIGNvbnRlbnRzLCAwLCBsZW4pKQotCWVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gcmVhZCAuZXhwb3J0cyBzZWN0aW9uIGNvbnRlbnRzIiksIHNlYyk7Ci0KLSAgICAgIHAgPSBjb250ZW50czsKLSAgICAgIHdoaWxlIChwIDwgY29udGVudHMrbGVuKQotCXsKLQkgIGdyZWcgPSBsYW5nX25ld192ZXJzX3JlZ2V4IChncmVnLCBwLCBOVUxMKTsKLQkgIHAgPSBzdHJjaHIgKHAsICdcMCcpICsgMTsKLQl9Ci0KLSAgICAgIC8qIERvIG5vdCBmcmVlIHRoZSBjb250ZW50cywgYXMgd2UgdXNlZCB0aGVtIGNyZWF0aW5nIHRoZSByZWdleC4gICovCi0KLSAgICAgIC8qIERvIG5vdCBpbmNsdWRlIHRoaXMgc2VjdGlvbiBpbiB0aGUgbGluay4gICovCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGlzLT50aGVfYmZkLCBzZWMsCi0JYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpcy0+dGhlX2JmZCwgc2VjKSB8IFNFQ19FWENMVURFKTsKLSAgICB9Ci0KLSAgbHJlZyA9IGxhbmdfbmV3X3ZlcnNfcmVnZXggKE5VTEwsICIqIiwgTlVMTCk7Ci0gIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlIChjb21tYW5kX2xpbmUudmVyc2lvbl9leHBvcnRzX3NlY3Rpb24sCi0JCQkgICBsYW5nX25ld192ZXJzX25vZGUgKGdyZWcsIGxyZWcpLCBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkbGFuZy5oIGIvbGQvbGRsYW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGNkOTYuLjAwMDAwMDAKLS0tIGEvbGQvbGRsYW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLyogbGRsYW5nLmggLSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZSBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLSAgIAotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRExBTkdfSAotI2RlZmluZSBMRExBTkdfSAotCi10eXBlZGVmIGVudW0KLXsKLSAgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSwKLSAgbGFuZ19pbnB1dF9maWxlX2lzX3N5bWJvbHNfb25seV9lbnVtLAotICBsYW5nX2lucHV0X2ZpbGVfaXNfbWFya2VyX2VudW0sCi0gIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW0sCi0gIGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtLAotICBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtCi19IGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGU7Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50IGZpbGxfdHlwZTsKLXR5cGVkZWYgc3RydWN0IHN0YXRlbWVudF9saXN0Ci17Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpoZWFkOwotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqKnRhaWw7Ci19IGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdAotewotICBjaGFyICpuYW1lOwotICBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9zdHJ1Y3QgKm5leHQ7Ci0gIGJmZF92bWEgb3JpZ2luOwotICBiZmRfc2l6ZV90eXBlIGxlbmd0aDsKLSAgYmZkX3ZtYSBjdXJyZW50OwotICBiZmRfc2l6ZV90eXBlIG9sZF9sZW5ndGg7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBmbGFnd29yZCBub3RfZmxhZ3M7Ci0gIGJvb2xlYW4gaGFkX2Z1bGxfbWVzc2FnZTsKLX0gbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgOwotCi10eXBlZGVmIHN0cnVjdCBsYW5nX3N0YXRlbWVudF9oZWFkZXJfc3RydWN0IAotewotICB1bmlvbiAgbGFuZ19zdGF0ZW1lbnRfdW5pb24gICpuZXh0OwotICBlbnVtIHN0YXRlbWVudF9lbnVtCi0gICAgewotICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSwKLSAgICAgIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW0sCi0KLSAgICAgIGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtCi0gICAgfSB0eXBlOwotfSBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bmlvbiBldHJlZV91bmlvbiAqZXhwOwotfSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ190YXJnZXRfc3RhdGVtZW50X3N0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGNvbnN0IGNoYXIgKnRhcmdldDsKLX0gbGFuZ190YXJnZXRfc3RhdGVtZW50X3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ19vdXRwdXRfc3RhdGVtZW50X3N0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19IGxhbmdfb3V0cHV0X3N0YXRlbWVudF90eXBlOwotCi0vKiBTZWN0aW9uIHR5cGVzIHNwZWNpZmllZCBpbiBhIGxpbmtlciBzY3JpcHQuICAqLwotCi1lbnVtIHNlY3Rpb25fdHlwZQotewotICBub3JtYWxfc2VjdGlvbiwKLSAgZHNlY3Rfc2VjdGlvbiwKLSAgY29weV9zZWN0aW9uLAotICBub2xvYWRfc2VjdGlvbiwKLSAgaW5mb19zZWN0aW9uLAotICBvdmVybGF5X3NlY3Rpb24KLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGEgbGlzdCBvZiBwcm9ncmFtIGhlYWRlcnMgZGVzY3JpYmluZyBzZWdtZW50cwotICAgaW4gd2hpY2ggdGhpcyBzZWN0aW9uIHNob3VsZCBiZSBwbGFjZWQuICAqLwotCi1zdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QKLXsKLSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICBib29sZWFuIHVzZWQ7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9zdHJ1Y3QgCi17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5pb24gZXRyZWVfdW5pb24gKmFkZHJfdHJlZTsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGNoaWxkcmVuOwotICBjb25zdCBjaGFyICptZW1zcGVjOwotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBib29sZWFuIHByb2Nlc3NlZDsKLSAgICAKLSAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOwotICBmbGFnd29yZCBmbGFnczsJCS8qIE9yIHRvZ2V0aGVyIG9mIGFsbCBpbnB1dCBzZWN0aW9ucyAqLwotICBlbnVtIHNlY3Rpb25fdHlwZSBzZWN0eXBlOwotICBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9zdHJ1Y3QgKnJlZ2lvbjsKLSAgc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpsbWFfcmVnaW9uOwotICBzaXplX3QgYmxvY2tfdmFsdWU7Ci0gIGZpbGxfdHlwZSBmaWxsOwotCi0gIGludCBzdWJzZWN0aW9uX2FsaWdubWVudDsgIC8qIGFsaWdubWVudCBvZiBjb21wb25lbnRzICovCi0gIGludCBzZWN0aW9uX2FsaWdubWVudDsgIC8qIGFsaWdubWVudCBvZiBzdGFydCBvZiBzZWN0aW9uICovCi0KLSAgdW5pb24gZXRyZWVfdW5pb24gKmxvYWRfYmFzZTsKLQotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBoZHJzOwotfSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLX0gbGFuZ19jb21tb25fc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLX0gbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBmaWxsX3R5cGUgZmlsbDsKLSAgaW50IHNpemU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLX0gbGFuZ19maWxsX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuc2lnbmVkIGludCB0eXBlOwotICB1bmlvbiAgZXRyZWVfdW5pb24gKmV4cDsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICBiZmRfdm1hIG91dHB1dF92bWE7Ci19IGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZTsKLQotLyogR2VuZXJhdGUgYSByZWxvYyBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0KLSAgLyogUmVsb2MgdG8gZ2VuZXJhdGUuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0KLSAgLyogUmVsb2MgaG93dG8gc3RydWN0dXJlLiAgKi8KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgLyogU2VjdGlvbiB0byBnZW5lcmF0ZSByZWxvYyBhZ2FpbnN0LiAgRXhhY3RseSBvbmUgb2Ygc2VjdGlvbiBhbmQKLSAgICAgbmFtZSBtdXN0IGJlIE5VTEwuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAvKiBOYW1lIG9mIHN5bWJvbCB0byBnZW5lcmF0ZSByZWxvYyBhZ2FpbnN0LiAgRXhhY3RseSBvbmUgb2Ygc2VjdGlvbgotICAgICBhbmQgbmFtZSBtdXN0IGJlIE5VTEwuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIEV4cHJlc3Npb24gZm9yIGFkZGVuZC4gICovCi0gIHVuaW9uIGV0cmVlX3VuaW9uICphZGRlbmRfZXhwOwotCi0gIC8qIFJlc29sdmVkIGFkZGVuZC4gICovCi0gIGJmZF92bWEgYWRkZW5kX3ZhbHVlOwotCi0gIC8qIE91dHB1dCBzZWN0aW9uIHdoZXJlIHJlbG9jIHNob3VsZCBiZSBwZXJmb3JtZWQuICAqLwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogVk1BIHdpdGhpbiBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgb3V0cHV0X3ZtYTsKLX0gbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgLyogTmFtZSBvZiB0aGlzIGZpbGUuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogTmFtZSB0byB1c2UgZm9yIHRoZSBzeW1ib2wgZ2l2aW5nIGFkZHJlc3Mgb2YgdGV4dCBzdGFydCAqLwotICAvKiBVc3VhbGx5IHRoZSBzYW1lIGFzIGZpbGVuYW1lLCBidXQgZm9yIGEgZmlsZSBzcGVjJ2Qgd2l0aCAtbAotICAgICB0aGlzIGlzIHRoZSAtbCBzd2l0Y2ggaXRzZWxmIHJhdGhlciB0aGFuIHRoZSBmaWxlbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmxvY2FsX3N5bV9uYW1lOwotICAgIAotICBiZmQgKnRoZV9iZmQ7Ci0gICAgCi0gIGJvb2xlYW4gY2xvc2VkOwotICBmaWxlX3B0ciBwYXNzaXZlX3Bvc2l0aW9uOwotICAgIAotICAvKiBTeW1ib2wgdGFibGUgb2YgdGhlIGZpbGUuICAqLwotICBhc3ltYm9sICoqYXN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7Ci0gICAgCi0gIC8qIFBvaW50IHRvIHRoZSBuZXh0IGZpbGUgLSB3aGF0ZXZlciBpdCBpcywgd2FuZGVycyB1cCBhbmQgZG93bgotICAgICBhcmNoaXZlcyAqLwotICAgIAotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHQ7Ci0gIC8qIFBvaW50IHRvIHRoZSBuZXh0IGZpbGUsIGJ1dCBza2lwcyBhcmNoaXZlIGNvbnRlbnRzICovCi0gIHVuaW9uICBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHRfcmVhbF9maWxlOwotICAgIAotICBib29sZWFuIGlzX2FyY2hpdmU7Ci0gICAgCi0gIC8qIDEgbWVhbnMgc2VhcmNoIGEgc2V0IG9mIGRpcmVjdG9yaWVzIGZvciB0aGlzIGZpbGUuICAqLwotICBib29sZWFuIHNlYXJjaF9kaXJzX2ZsYWc7Ci0gICAgCi0gIC8qIDEgbWVhbnMgdGhpcyBpcyBiYXNlIGZpbGUgb2YgaW5jcmVtZW50YWwgbG9hZC4KLSAgICAgRG8gbm90IGxvYWQgdGhpcyBmaWxlJ3MgdGV4dCBvciBkYXRhLgotICAgICBBbHNvIGRlZmF1bHQgdGV4dF9zdGFydCB0byBhZnRlciB0aGlzIGZpbGUncyBic3MuICovCi0gICAgCi0gIGJvb2xlYW4ganVzdF9zeW1zX2ZsYWc7Ci0KLSAgLyogV2hldGhlciB0byBzZWFyY2ggZm9yIHRoaXMgZW50cnkgYXMgYSBkeW5hbWljIGFyY2hpdmUuICAqLwotICBib29sZWFuIGR5bmFtaWM7Ci0KLSAgLyogV2hldGhlciB0byBpbmNsdWRlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYW4gYXJjaGl2ZS4gICovCi0gIGJvb2xlYW4gd2hvbGVfYXJjaGl2ZTsKLQotICBib29sZWFuIGxvYWRlZDsKLSAgICAKLSAgLyogICAgdW5zaWduZWQgaW50IGdsb2JhbHNfaW5fdGhpc19maWxlOyovCi0gIGNvbnN0IGNoYXIgKnRhcmdldDsKLSAgYm9vbGVhbiByZWFsOwotfSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppZmlsZTsKLSAgCi19IGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpmaWxlOwotfSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGxhbmdfd2lsZF9zdGF0ZW1lbnRfc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOwotICBib29sZWFuIHNlY3Rpb25zX3NvcnRlZDsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGJvb2xlYW4gZmlsZW5hbWVzX3NvcnRlZDsKLSAgYm9vbGVhbiBrZWVwX3NlY3Rpb25zOwotICBzdHJ1Y3QgbmFtZV9saXN0ICpleGNsdWRlX2ZpbGVuYW1lX2xpc3Q7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjaGlsZHJlbjsKLX0gbGFuZ193aWxkX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3N0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGNvbnN0ICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIHVuaW9uICBldHJlZV91bmlvbiAqYWRkcmVzczsKLX0gbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGJmZF92bWEgb3V0cHV0X29mZnNldDsKLSAgc2l6ZV90IHNpemU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgZmlsbF90eXBlIGZpbGw7Ci19IGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfdHlwZTsKLQotLyogQSBncm91cCBzdGF0ZW1lbnQgY29sbGVjdHMgYSBzZXQgb2YgbGlicmFyaWVzIHRvZ2V0aGVyLiAgVGhlCi0gICBsaWJyYXJpZXMgYXJlIHNlYXJjaGVkIG11bHRpcGxlIHRpbWVzLCB1bnRpbCBubyBuZXcgdW5kZWZpbmVkCi0gICBzeW1ib2xzIGFyZSBmb3VuZC4gIFRoZSBlZmZlY3QgaXMgdG8gc2VhcmNoIGEgZ3JvdXAgb2YgbGlicmFyaWVzIGFzCi0gICB0aG91Z2ggdGhleSB3ZXJlIGEgc2luZ2xlIGxpYnJhcnkuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjaGlsZHJlbjsKLX0gbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqbmV4dDsKLSAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlIHdpbGRfc3RhdGVtZW50OwotICBsYW5nX2RhdGFfc3RhdGVtZW50X3R5cGUgZGF0YV9zdGF0ZW1lbnQ7Ci0gIGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgcmVsb2Nfc3RhdGVtZW50OwotICBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGUgYWRkcmVzc19zdGF0ZW1lbnQ7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X3R5cGUgYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnQ7Ci0gIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSBhc3NpZ25tZW50X3N0YXRlbWVudDsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSBpbnB1dF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF90eXBlIHRhcmdldF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfb3V0cHV0X3N0YXRlbWVudF90eXBlIG91dHB1dF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlIGlucHV0X3NlY3Rpb247Ci0gIGxhbmdfY29tbW9uX3N0YXRlbWVudF90eXBlIGNvbW1vbl9zdGF0ZW1lbnQ7Ci0gIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X3R5cGUgb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50OwotICBsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgZmlsbF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfdHlwZSBwYWRkaW5nX3N0YXRlbWVudDsKLSAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSBncm91cF9zdGF0ZW1lbnQ7Ci19IGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGU7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvZ3JhbSBoZWFkZXIsIGZyb20gdGhlCi0gICBQSERSUyBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotc3RydWN0IGxhbmdfcGhkcgotewotICBzdHJ1Y3QgbGFuZ19waGRyICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gIGJvb2xlYW4gZmlsZWhkcjsKLSAgYm9vbGVhbiBwaGRyczsKLSAgZXRyZWVfdHlwZSAqYXQ7Ci0gIGV0cmVlX3R5cGUgKmZsYWdzOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgbGlzdCBvZiBzZWN0aW9ucyB3aGljaCBtYXkgbm90Ci0gICBjcm9zcyByZWZlcmVuY2UgZWFjaCBvdGhlci4gICovCi0KLXN0cnVjdCBsYW5nX25vY3Jvc3NyZWYKLXsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLS8qIFRoZSBsaXN0IG9mIG5vY3Jvc3NyZWYgbGlzdHMuICAqLwotCi1zdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcwotewotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbmV4dDsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbGlzdDsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbm9jcm9zc3JlZl9saXN0OwotCi1leHRlcm4gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqYWJzX291dHB1dF9zZWN0aW9uOwotZXh0ZXJuIGJvb2xlYW4gbGFuZ19oYXNfaW5wdXRfZmlsZTsKLWV4dGVybiBldHJlZV90eXBlICpiYXNlOwotZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc3RhdF9wdHI7Ci1leHRlcm4gYm9vbGVhbiBkZWxldGVfb3V0cHV0X2ZpbGVfb25fZmFpbHVyZTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmVudHJ5X3N5bWJvbDsKLWV4dGVybiBib29sZWFuIGVudHJ5X2Zyb21fY21kbGluZTsKLQotZXh0ZXJuIHZvaWQgbGFuZ19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9zdHJ1Y3QgKmxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqY29uc3QpKTsKLWV4dGVybiBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9zdHJ1Y3QgKmxhbmdfbWVtb3J5X3JlZ2lvbl9kZWZhdWx0Ci0gIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLWV4dGVybiB2b2lkIGxhbmdfbWFwIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxhbmdfc2V0X2ZsYWdzIFBBUkFNUyAoKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICosIGNvbnN0IGNoYXIgKiwKLQkJCQkgICAgaW50KSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9vdXRwdXQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQgZnJvbV9zY3JpcHQpKTsKLWV4dGVybiB2b2lkIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9uYW1lLAotCSAgIGV0cmVlX3R5cGUgKiBhZGRyZXNzX2V4cCwKLQkgICBlbnVtIHNlY3Rpb25fdHlwZSBzZWN0eXBlLAotCSAgIGJmZF92bWEgYmxvY2tfdmFsdWUsCi0JICAgZXRyZWVfdHlwZSAqYWxpZ24sCi0JICAgZXRyZWVfdHlwZSAqc3ViYWxpZ24sCi0JICAgZXRyZWVfdHlwZSAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2ZpbmFsIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxhbmdfcHJvY2VzcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3NlY3Rpb25fc3RhcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bmlvbiBldHJlZV91bmlvbiAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9lbnRyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX3RhcmdldCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX3dpbGQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sIG5hbWVfbGlzdCAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9tYXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9maWxsIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqIGxhbmdfYWRkX2Fzc2lnbm1lbnQgUEFSQU1TICgodW5pb24gZXRyZWVfdW5pb24gKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfYXR0cmlidXRlIFBBUkFNUyAoKGVudW0gc3RhdGVtZW50X2VudW0pKTsKLWV4dGVybiB2b2lkIGxhbmdfc3RhcnR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfZmxvYXQgUEFSQU1TICgoZW51bSBiZmRfYm9vbGVhbikpOwotZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLSAgUEFSQU1TICgoYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKiwKLSAgICAgICAgICAgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3N0YXRlbWVudF9hcHBlbmQgUEFSQU1TICgoc3RydWN0IHN0YXRlbWVudF9saXN0ICosCi0JCQkJCSAgIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICosCi0JCQkJCSAgIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICoqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUKLSAgUEFSQU1TICgodm9pZCAoKmRvdGhpcykgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpKTsKLWV4dGVybiB2b2lkIGxhbmdfZm9yX2VhY2hfZmlsZQotICBQQVJBTVMgKCh2b2lkICgqZG90aGlzKSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSkpOwotZXh0ZXJuIGJmZF92bWEgbGFuZ19kb19hc3NpZ25tZW50cwotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogcywKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JICAgZmlsbF90eXBlIGZpbGwsCi0JICAgYmZkX3ZtYSBkb3QpKTsKLQotI2RlZmluZSBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVChzdGF0ZW1lbnQpCQlcCi0gIGV4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgZmlsZV9jaGFpbjsJCQlcCi0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnN0YXRlbWVudDsJCQkJXAotICBmb3IgKHN0YXRlbWVudCA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopZmlsZV9jaGFpbi5oZWFkO1wKLSAgICAgICBzdGF0ZW1lbnQgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKilOVUxMOwkJXAotICAgICAgIHN0YXRlbWVudCA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopc3RhdGVtZW50LT5uZXh0KVwKLSAgCi1leHRlcm4gdm9pZCBsYW5nX3Byb2Nlc3MgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsYW5nX2FkZF9maWxlIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotZXh0ZXJuIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZAotICBQQVJBTVMgKChjb25zdCBjaGFyICogY29uc3QpKTsKLWV4dGVybiBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpsYW5nX2FkZF9pbnB1dF9maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgZmlsZV90eXBlLAotCSAgIGNvbnN0IGNoYXIgKnRhcmdldCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfa2VlcHN5bXNfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKgotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgUEFSQU1TICgoY29uc3QgY2hhciAqIGNvbnN0IG5hbWUpKTsKLWV4dGVybiB2b2lkIGxkbGFuZ19hZGRfdW5kZWYgUEFSQU1TICgoY29uc3QgY2hhciAqY29uc3QgbmFtZSkpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKiwgaW50IGZyb21fc2NyaXB0KSk7Ci1leHRlcm4gdm9pZCBsYW5nX2xpc3RfaW5pdCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9kYXRhIFBBUkFNUyAoKGludCB0eXBlLCB1bmlvbiBldHJlZV91bmlvbiAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9yZWxvYwotICBQQVJBTVMgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2MsIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvLAotCSAgIGFzZWN0aW9uICpzZWN0aW9uLCBjb25zdCBjaGFyICpuYW1lLCB1bmlvbiBldHJlZV91bmlvbiAqYWRkZW5kKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudAotICBQQVJBTVMgKCh2b2lkICgqZnVuYykgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpKTsKLWV4dGVybiBQVFIgc3RhdF9hbGxvYyBQQVJBTVMgKChzaXplX3Qgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgZHByaW50X3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICosIGludCkpOwotZXh0ZXJuIGJmZF92bWEgbGFuZ19zaXplX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCSAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwcmV2LCBmaWxsX3R5cGUgZmlsbCwKLQkgICBiZmRfdm1hIGRvdCwgYm9vbGVhbiByZWxheCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9ncm91cCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2xlYXZlX2dyb3VwIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHdpbGRfZG9pdAotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnB0ciwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0LAotCSAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGUpKTsKLWV4dGVybiB2b2lkIGxhbmdfbmV3X3BoZHIKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBldHJlZV90eXBlICosIGJvb2xlYW4sIGJvb2xlYW4sIGV0cmVlX3R5cGUgKiwKLQkgICBldHJlZV90eXBlICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX25vY3Jvc3NyZWYgUEFSQU1TICgoc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2VudGVyX292ZXJsYXkgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBldHJlZV90eXBlICosIGludCkpOwotZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbgotICBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9vdmVybGF5Ci0gIFBBUkFNUyAoKGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICosCi0gICAgICAgICAgIGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpsYW5nX2VsZl92ZXJzaW9uX2luZm87Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmxhbmdfbmV3X3ZlcnNfcmVnZXgKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpsYW5nX25ld192ZXJzX25vZGUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICosIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpsYW5nX2FkZF92ZXJzX2RlcGVuZAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRsZXguaCBiL2xkL2xkbGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNDQ0Y2EuLjAwMDAwMDAKLS0tIGEvbGQvbGRsZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIGxkbGV4LmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExETEVYX0gKLSNkZWZpbmUgTERMRVhfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogVGhlIGluaXRpYWwgcGFyc2VyIHN0YXRlcy4gICovCi10eXBlZGVmIGVudW0gaW5wdXRfZW51bSB7Ci0gIGlucHV0X3NlbGVjdGVkLAkJLyogV2UndmUgc2V0IHRoZSBpbml0aWFsIHN0YXRlLiAgKi8KLSAgaW5wdXRfc2NyaXB0LAotICBpbnB1dF9tcmlfc2NyaXB0LAotICBpbnB1dF92ZXJzaW9uX3NjcmlwdCwKLSAgaW5wdXRfZGVmc3ltCi19IGlucHV0X3R5cGU7Ci0KLWV4dGVybiBpbnB1dF90eXBlIHBhcnNlcl9pbnB1dDsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBsaW5lbm87Ci1leHRlcm4gY29uc3QgY2hhciAqbGV4X3N0cmluZzsKLQotLyogSW4gbGRsZXgubC4gICovCi1leHRlcm4gaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxleF9wdXNoX2ZpbGUgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxleF9yZWRpcmVjdCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkbGV4X3NjcmlwdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9tcmlfc2NyaXB0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X3ZlcnNpb25fc2NyaXB0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X3ZlcnNpb25fZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9kZWZzeW0gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfZXhwcmVzc2lvbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9ib3RoIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X2NvbW1hbmQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfcG9wc3RhdGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBJbiBsZXhzdXAuYy4gICovCi1leHRlcm4gaW50IGxleF9pbnB1dCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZXhfdW5wdXQgUEFSQU1TICgoaW50KSk7Ci0jaWZuZGVmIHl5d3JhcAotZXh0ZXJuIGludCB5eXdyYXAgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi1leHRlcm4gdm9pZCBwYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkbGV4LmwgYi9sZC9sZGxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVmODBmLi4wMDAwMDAwCi0tLSBhL2xkL2xkbGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw2NjIgKzAsMCBAQAotJXsKLQotLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1UaGlzIHdhcyB3cml0dGVuIGJ5IHN0ZXZlIGNoYW1iZXJsYWluCi0gICAgICAgICAgICAgICAgICAgIHNhY0BjeWdudXMuY29tCi0qLwotCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIE1QVwotLyogUHJldmVudCBlbnVtIHJlZGVmaW5pdGlvbiBwcm9ibGVtcy4gKi8KLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZiAvKiBNUFcgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi0vKiBUaGUgdHlwZSBvZiB0b3AtbGV2ZWwgcGFyc2VyIGlucHV0LgotICAgeXlsZXggYW5kIHl5cGFyc2UgKGluZGlyZWN0bHkpIGJvdGggY2hlY2sgdGhpcy4gICovCi1pbnB1dF90eXBlIHBhcnNlcl9pbnB1dDsKLQotLyogTGluZSBudW1iZXIgaW4gdGhlIGN1cnJlbnQgaW5wdXQgZmlsZS4KLSAgIChGSVhNRSBBY3R1YWxseSwgaXQgZG9lc24ndCBhcHBlYXIgdG8gZ2V0IHJlc2V0IGZvciBlYWNoIGZpbGU/KSAgKi8KLXVuc2lnbmVkIGludCBsaW5lbm8gPSAxOwotCi0vKiBUaGUgc3RyaW5nIHdlIGFyZSBjdXJyZW50bHkgbGV4aW5nLCBvciBOVUxMIGlmIHdlIGFyZSByZWFkaW5nIGEKLSAgIGZpbGUuICAqLwotY29uc3QgY2hhciAqbGV4X3N0cmluZyA9IE5VTEw7Ci0KLS8qIFN1cHBvcnQgZm9yIGZsZXggcmVhZGluZyBmcm9tIG1vcmUgdGhhbiBvbmUgaW5wdXQgZmlsZSAoc3RyZWFtKS4KLSAgIGBpbmNsdWRlX3N0YWNrJyBpcyBmbGV4J3MgaW5wdXQgc3RhdGUgZm9yIGVhY2ggb3BlbiBmaWxlOwotICAgYGZpbGVfbmFtZV9zdGFjaycgaXMgdGhlIGZpbGUgbmFtZXMuICBgbGluZW5vX3N0YWNrJyBpcyB0aGUgY3VycmVudAotICAgbGluZSBudW1iZXJzLgotCi0gICBJZiBgaW5jbHVkZV9zdGFja19wdHInIGlzIDAsIHdlIGhhdmVuJ3Qgc3RhcnRlZCByZWFkaW5nIGFueXRoaW5nIHlldC4KLSAgIE90aGVyd2lzZSwgc3RhY2sgZWxlbWVudHMgMCB0aHJvdWdoIGBpbmNsdWRlX3N0YWNrX3B0ciAtIDEnIGFyZSB2YWxpZC4gICovCi0KLSN1bmRlZiBZWV9JTlBVVAotI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSB5eV9pbnB1dChidWYsICZyZXN1bHQsIG1heF9zaXplKQotCi0jZGVmaW5lIE1BWF9JTkNMVURFX0RFUFRIIDEwCi1zdGF0aWMgWVlfQlVGRkVSX1NUQVRFIGluY2x1ZGVfc3RhY2tbTUFYX0lOQ0xVREVfREVQVEhdOwotc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVfbmFtZV9zdGFja1tNQVhfSU5DTFVERV9ERVBUSF07Ci1zdGF0aWMgdW5zaWduZWQgaW50IGxpbmVub19zdGFja1tNQVhfSU5DTFVERV9ERVBUSF07Ci1zdGF0aWMgdW5zaWduZWQgaW50IGluY2x1ZGVfc3RhY2tfcHRyID0gMDsKLXN0YXRpYyBpbnQgdmVyc19ub2RlX25lc3RpbmcgPSAwOwotCi1zdGF0aWMgWVlfQlVGRkVSX1NUQVRFIHl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0cmluZywKLQkJCQkJCQlzaXplX3Qgc2l6ZSkpOwotc3RhdGljIHZvaWQgeXlfaW5wdXQgUEFSQU1TICgoY2hhciAqLCBpbnQgKnJlc3VsdCwgaW50IG1heF9zaXplKSk7Ci0KLXN0YXRpYyB2b2lkIGNvbW1lbnQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGV4X3dhcm5faW52YWxpZCBQQVJBTVMgKChjaGFyICp3aGVyZSwgY2hhciAqd2hhdCkpOwotCi0vKiBTVEFURVMgCi0JRVhQUkVTU0lPTglkZWZpbml0ZWx5IGluIGFuIGV4cHJlc3Npb24KLQlTQ1JJUFQJCWRlZmluaXRlbHkgaW4gYSBzY3JpcHQKLQlCT1RICQllaXRoZXIgRVhQUkVTU0lPTiBvciBTQ1JJUFQKLQlERUZTWU1FWFAJaW4gYW4gYXJndW1lbnQgdG8gLWRlZnN5bQotICAgICAgICBNUkkgICAgICAgICAgICAgaW4gYW4gTVJJIHNjcmlwdAotCVZFUlNfU1RBUlQJc3RhcnRpbmcgYSBTdW4gc3R5bGUgbWFwZmlsZQotCVZFUlNfU0NSSVBUCWEgU3VuIHN0eWxlIG1hcGZpbGUKLQlWRVJTX05PREUJYSBub2RlIHdpdGhpbiBhIFN1biBzdHlsZSBtYXBmaWxlCi0qLwotI2RlZmluZSBSVE9LRU4oeCkgIHsgIHl5bHZhbC50b2tlbiA9IHg7IHJldHVybiB4OyB9Ci0KLS8qIFNvbWUgdmVyc2lvbnMgb2YgZmxleCB3YW50IHRoaXMuICAqLwotI2lmbmRlZiB5eXdyYXAKLWludCB5eXdyYXAgKCkgeyByZXR1cm4gMTsgfQotI2VuZGlmCi0lfQotCi0lYSA0MDAwCi0lbyA1MDAwCi0KLUNNREZJTEVOQU1FQ0hBUiAgIFtfYS16QS1aMC05XC9cLlxcX1wrXCRcOlxbXF1cXFwsXD1cJlwhXDxcPlwtXH5dCi1DTURGSUxFTkFNRUNIQVIxICBbX2EtekEtWjAtOVwvXC5cXF9cK1wkXDpcW1xdXFxcLFw9XCZcIVw8XD5cfl0KLUZJTEVOQU1FQ0hBUjEJW19hLXpBLVpcL1wuXFxcJFxfXH5dCi1TWU1CT0xDSEFSTiAgICAgW19hLXpBLVpcL1wuXFxcJFxfXH4wLTldCi1GSUxFTkFNRUNIQVIJW19hLXpBLVowLTlcL1wuXC1cX1wrXD1cJFw6XFtcXVxcXCxcfl0KLVdJTERDSEFSCVtfYS16QS1aMC05XC9cLlwtXF9cK1w9XCRcOlxbXF1cXFwsXH5cP1wqXQotV0hJVEUJCVsgXHRcblxyXSsgCi0KLU5PQ0ZJTEVOQU1FQ0hBUglbX2EtekEtWjAtOVwvXC5cLVxfXCtcJFw6XFtcXVxcXH5dCi0KLVZfVEFHIFsuJF9hLXpBLVpdWy5fYS16QS1aMC05XSoKLVZfSURFTlRJRklFUiBbKj8uJF9hLXpBLVpdWyo/LiRfYS16QS1aMC05XSoKLQotJXMgU0NSSVBUCi0lcyBFWFBSRVNTSU9OCi0lcyBCT1RICi0lcyBERUZTWU1FWFAKLSVzIE1SSQotJXMgVkVSU19TVEFSVAotJXMgVkVSU19TQ1JJUFQKLSVzIFZFUlNfTk9ERQotJSUKLQotICBpZiAocGFyc2VyX2lucHV0ICE9IGlucHV0X3NlbGVjdGVkKQotICAgIHsKLSAgICAgIC8qIFRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgaW5wdXQgZGV0ZXJtaW5lcyB0aGUgaW5pdGlhbCBwYXJzZXIgc3RhdGUuICAqLwotICAgICAgaW5wdXRfdHlwZSB0ID0gcGFyc2VyX2lucHV0OwotICAgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfc2VsZWN0ZWQ7Ci0gICAgICBzd2l0Y2ggKHQpCi0JewotCWNhc2UgaW5wdXRfc2NyaXB0OiByZXR1cm4gSU5QVVRfU0NSSVBUOyBicmVhazsKLQljYXNlIGlucHV0X21yaV9zY3JpcHQ6IHJldHVybiBJTlBVVF9NUklfU0NSSVBUOyBicmVhazsKLQljYXNlIGlucHV0X3ZlcnNpb25fc2NyaXB0OiByZXR1cm4gSU5QVVRfVkVSU0lPTl9TQ1JJUFQ7IGJyZWFrOwotCWNhc2UgaW5wdXRfZGVmc3ltOiByZXR1cm4gSU5QVVRfREVGU1lNOyBicmVhazsKLQlkZWZhdWx0OiBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTj4iLyoiCXsgY29tbWVudCgpOyB9Ci0KLQotPERFRlNZTUVYUD4iLSIgICAgICAgICAgICAgICAgICB7IFJUT0tFTignLScpO30KLTxERUZTWU1FWFA+IisiICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oJysnKTt9Ci08REVGU1lNRVhQPntGSUxFTkFNRUNIQVIxfXtTWU1CT0xDSEFSTn0qICAgeyB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOyByZXR1cm4gTkFNRTsgfQotPERFRlNZTUVYUD4iPSIgICAgICAgICAgICAgICAgICB7IFJUT0tFTignPScpOyB9Ci0KLTxNUkksRVhQUkVTU0lPTj4iJCIoWzAtOUEtRmEtZl0pKyB7Ci0gIAkJCQl5eWx2YWwuaW50ZWdlciA9IGJmZF9zY2FuX3ZtYSAoeXl0ZXh0KzEsIDAsMTYpOwotCQkJCXJldHVybiBJTlQ7Ci0JCQl9Ci0KLTxNUkksRVhQUkVTU0lPTj4oWzAtOUEtRmEtZl0pKyhIfGh8WHx4fEJ8YnxPfG98RHxkKSB7Ci0JCQkJICAgaW50IGliYXNlIDsKLQkJCQkgICBzd2l0Y2ggKHl5dGV4dFt5eWxlbmctMV0pIHsKLQkJCQkgICAgY2FzZSAnWCc6IAotCQkJCSAgICBjYXNlICd4JzoKLQkJCQkgICAgY2FzZSAnSCc6Ci0JCQkJICAgIGNhc2UgJ2gnOgotCQkJCSAgICAgaWJhc2UgPSAxNjsKLQkJCQkgICAgIGJyZWFrOwotCQkJCSAgICBjYXNlICdPJzoKLQkJCQkgICAgY2FzZSAnbyc6Ci0JCQkJICAgICBpYmFzZSA9IDg7Ci0JCQkJICAgICBicmVhazsKLQkJCQkgICAgY2FzZSAnQic6Ci0JCQkJICAgIGNhc2UgJ2InOgotCQkJCSAgICAgaWJhc2UgPSAyOwotCQkJCSAgICAgYnJlYWs7Ci0JCQkJICAgIGRlZmF1bHQ6Ci0JCQkJICAgICBpYmFzZSA9IDEwOwotCQkJCSAgIH0KLQkJCQkgICB5eWx2YWwuaW50ZWdlciA9IGJmZF9zY2FuX3ZtYSAoeXl0ZXh0LCAwLAotCQkJCQkJCQkgIGliYXNlKTsKLQkJCQkgICByZXR1cm4gSU5UOwotCQkJCSB9Ci08U0NSSVBULERFRlNZTUVYUCxNUkksQk9USCxFWFBSRVNTSU9OPigoKCIkInwiMHgiKShbMC05QS1GYS1mXSkrKXwoKFswLTldKSspKShNfEt8bXxrKT8gewotCQkJCSAgY2hhciAqcyA9IHl5dGV4dDsKLQotCQkJCSAgaWYgKCpzID09ICckJykKLQkJCQkgICAgKytzOwotCQkJCSAgeXlsdmFsLmludGVnZXIgPSBiZmRfc2Nhbl92bWEgKHMsIDAsIDApOwotCQkJCSAgaWYgKHl5dGV4dFt5eWxlbmctMV0gPT0gJ00nCi0JCQkJICAgICAgfHwgeXl0ZXh0W3l5bGVuZy0xXSA9PSAnbScpCi0JCQkJICAgIHl5bHZhbC5pbnRlZ2VyICo9IDEwMjQgKiAxMDI0OwotCQkJCSAgaWYgKHl5dGV4dFt5eWxlbmctMV0gPT0gJ0snIAotCQkJCSAgICAgIHx8IHl5dGV4dFt5eWxlbmctMV09PSdrJykKLQkJCQkgICAgeXlsdmFsLmludGVnZXIgKj0gMTAyNDsKLQkJCQkgIHJldHVybiBJTlQ7Ci0JCQkJfQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJdIgkJeyBSVE9LRU4oJ10nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IlsiCQl7IFJUT0tFTignWycpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPDw9Igl7IFJUT0tFTihMU0hJRlRFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI+Pj0iCXsgUlRPS0VOKFJTSElGVEVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Inx8Igl7IFJUT0tFTihPUk9SKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij09Igl7IFJUT0tFTihFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIhPSIJeyBSVE9LRU4oTkUpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPj0iCXsgUlRPS0VOKEdFKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ijw9Igl7IFJUT0tFTihMRSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI8PCIJeyBSVE9LRU4oTFNISUZUKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij4+Igl7IFJUT0tFTihSU0hJRlQpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKz0iCXsgUlRPS0VOKFBMVVNFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiItPSIJeyBSVE9LRU4oTUlOVVNFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIqPSIJeyBSVE9LRU4oTVVMVEVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii89Igl7IFJUT0tFTihESVZFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiImPSIJeyBSVE9LRU4oQU5ERVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ifD0iCXsgUlRPS0VOKE9SRVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJiYiCXsgUlRPS0VOKEFOREFORCk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI+IgkJeyBSVE9LRU4oJz4nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiwiCQl7IFJUT0tFTignLCcpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJiIJCXsgUlRPS0VOKCcmJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ8IgkJeyBSVE9LRU4oJ3wnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+In4iCQl7IFJUT0tFTignficpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iISIJCXsgUlRPS0VOKCchJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI/IgkJeyBSVE9LRU4oJz8nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IioiCQl7IFJUT0tFTignKicpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKyIJCXsgUlRPS0VOKCcrJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiItIgkJeyBSVE9LRU4oJy0nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii8iCQl7IFJUT0tFTignLycpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJSIJCXsgUlRPS0VOKCclJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI8IgkJeyBSVE9LRU4oJzwnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij0iICAgICAgICAgIHsgUlRPS0VOKCc9Jyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ9IgkJCXsgUlRPS0VOKCd9JykgOyB9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+InsiCQkJeyBSVE9LRU4oJ3snKTsgfQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIpIgkJCXsgUlRPS0VOKCcpJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIoIgkJCXsgUlRPS0VOKCcoJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI6IgkJeyBSVE9LRU4oJzonKTsgfQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI7IgkJeyBSVE9LRU4oJzsnKTt9Ci08Qk9USCxTQ1JJUFQ+Ik1FTU9SWSIJCXsgUlRPS0VOKE1FTU9SWSk7fQotPEJPVEgsU0NSSVBUPiJPUklHSU4iCQl7IFJUT0tFTihPUklHSU4pO30KLTxCT1RILFNDUklQVD4iVkVSU0lPTiIJCXsgUlRPS0VOKFZFUlNJT05LKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQkxPQ0siCQl7IFJUT0tFTihCTE9DSyk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkJJTkQiCQl7IFJUT0tFTihCSU5EKTt9Ci08Qk9USCxTQ1JJUFQ+IkxFTkdUSCIJCXsgUlRPS0VOKExFTkdUSCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkFMSUdOIgkJCXsgUlRPS0VOKEFMSUdOX0spO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJBRERSIgkJCXsgUlRPS0VOKEFERFIpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJMT0FEQUREUiIJCXsgUlRPS0VOKExPQURBRERSKTt9Ci08RVhQUkVTU0lPTixCT1RIPiJNQVgiCQkJeyBSVE9LRU4oTUFYX0spOyB9Ci08RVhQUkVTU0lPTixCT1RIPiJNSU4iCQkJeyBSVE9LRU4oTUlOX0spOyB9Ci08RVhQUkVTU0lPTixCT1RIPiJBU1NFUlQiCQl7IFJUT0tFTihBU1NFUlRfSyk7IH0KLTxCT1RILFNDUklQVD4iRU5UUlkiCQkJeyBSVE9LRU4oRU5UUlkpO30KLTxCT1RILFNDUklQVCxNUkk+IkVYVEVSTiIJCXsgUlRPS0VOKEVYVEVSTik7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+Ik5FWFQiCQkJeyBSVE9LRU4oTkVYVCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+InNpemVvZl9oZWFkZXJzIgl7IFJUT0tFTihTSVpFT0ZfSEVBREVSUyk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IlNJWkVPRl9IRUFERVJTIgl7IFJUT0tFTihTSVpFT0ZfSEVBREVSUyk7fQotPEJPVEgsU0NSSVBUPiJNQVAiCQkJeyBSVE9LRU4oTUFQKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iU0laRU9GIgkJeyBSVE9LRU4oU0laRU9GKTt9Ci08Qk9USCxTQ1JJUFQ+IlRBUkdFVCIJCXsgUlRPS0VOKFRBUkdFVF9LKTt9Ci08Qk9USCxTQ1JJUFQ+IlNFQVJDSF9ESVIiCQl7IFJUT0tFTihTRUFSQ0hfRElSKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9VVFBVVCIJCXsgUlRPS0VOKE9VVFBVVCk7fQotPEJPVEgsU0NSSVBUPiJJTlBVVCIJCQl7IFJUT0tFTihJTlBVVCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkdST1VQIgkJeyBSVE9LRU4oR1JPVVApO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJERUZJTkVEIgkJeyBSVE9LRU4oREVGSU5FRCk7fQotPEJPVEgsU0NSSVBUPiJDUkVBVEVfT0JKRUNUX1NZTUJPTFMiCXsgUlRPS0VOKENSRUFURV9PQkpFQ1RfU1lNQk9MUyk7fQotPEJPVEgsU0NSSVBUPiJDT05TVFJVQ1RPUlMiCQl7IFJUT0tFTiggQ09OU1RSVUNUT1JTKTt9Ci08Qk9USCxTQ1JJUFQ+IkZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OIiB7IFJUT0tFTihGT1JDRV9DT01NT05fQUxMT0NBVElPTik7fQotPEJPVEgsU0NSSVBUPiJTRUNUSU9OUyIJCXsgUlRPS0VOKFNFQ1RJT05TKTt9Ci08Qk9USCxTQ1JJUFQ+IkZJTEwiCQkJeyBSVE9LRU4oRklMTCk7fQotPEJPVEgsU0NSSVBUPiJTVEFSVFVQIgkJeyBSVE9LRU4oU1RBUlRVUCk7fQotPEJPVEgsU0NSSVBUPiJPVVRQVVRfRk9STUFUIgkJeyBSVE9LRU4oT1VUUFVUX0ZPUk1BVCk7fQotPEJPVEgsU0NSSVBUPiJPVVRQVVRfQVJDSCIJCXsgUlRPS0VOKCBPVVRQVVRfQVJDSCk7fQotPEJPVEgsU0NSSVBUPiJITEwiCQkJeyBSVE9LRU4oSExMKTt9Ci08Qk9USCxTQ1JJUFQ+IlNZU0xJQiIJCXsgUlRPS0VOKFNZU0xJQik7fQotPEJPVEgsU0NSSVBUPiJGTE9BVCIJCQl7IFJUT0tFTihGTE9BVCk7fQotPEJPVEgsU0NSSVBUPiJRVUFEIgkJCXsgUlRPS0VOKCBRVUFEKTt9Ci08Qk9USCxTQ1JJUFQ+IlNRVUFEIgkJCXsgUlRPS0VOKCBTUVVBRCk7fQotPEJPVEgsU0NSSVBUPiJMT05HIgkJCXsgUlRPS0VOKCBMT05HKTt9Ci08Qk9USCxTQ1JJUFQ+IlNIT1JUIgkJCXsgUlRPS0VOKCBTSE9SVCk7fQotPEJPVEgsU0NSSVBUPiJCWVRFIgkJCXsgUlRPS0VOKCBCWVRFKTt9Ci08Qk9USCxTQ1JJUFQ+Ik5PRkxPQVQiCQl7IFJUT0tFTihOT0ZMT0FUKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iTk9DUk9TU1JFRlMiCXsgUlRPS0VOKE5PQ1JPU1NSRUZTKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9WRVJMQVkiCQkJeyBSVE9LRU4oT1ZFUkxBWSk7IH0KLTxCT1RILFNDUklQVD4iU09SVCIJCQl7IFJUT0tFTihTT1JUKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+Ik5PTE9BRCIJeyBSVE9LRU4oTk9MT0FEKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iRFNFQ1QiCQl7IFJUT0tFTihEU0VDVCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkNPUFkiCQl7IFJUT0tFTihDT1BZKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iSU5GTyIJCXsgUlRPS0VOKElORk8pO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJPVkVSTEFZIgl7IFJUT0tFTihPVkVSTEFZKTt9Ci08Qk9USCxTQ1JJUFQ+Im8iCQkJeyBSVE9LRU4oT1JJR0lOKTt9Ci08Qk9USCxTQ1JJUFQ+Im9yZyIJCQl7IFJUT0tFTihPUklHSU4pO30KLTxCT1RILFNDUklQVD4ibCIJCQl7IFJUT0tFTiggTEVOR1RIKTt9Ci08Qk9USCxTQ1JJUFQ+ImxlbiIJCQl7IFJUT0tFTiggTEVOR1RIKTt9Ci08Qk9USCxTQ1JJUFQ+IklOQ0xVREUiCQkJeyBSVE9LRU4oSU5DTFVERSk7fQotPEJPVEgsU0NSSVBUPiJQSERSUyIJCQl7IFJUT0tFTiAoUEhEUlMpOyB9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQVQiCQkJeyBSVE9LRU4oQVQpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJQUk9WSURFIgkJeyBSVE9LRU4oUFJPVklERSk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJLRUVQIgkJeyBSVE9LRU4oS0VFUCk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJFWENMVURFX0ZJTEUiICAgICAgICB7IFJUT0tFTihFWENMVURFX0ZJTEUpOyB9Ci08TVJJPiIjIi4qXG4/CQkJeyArKyBsaW5lbm87IH0KLTxNUkk+IlxuIgkgICAgICAgICAgICAgICAgeyArKyBsaW5lbm87ICBSVE9LRU4oTkVXTElORSk7IH0KLTxNUkk+IioiLioJCQl7IC8qIE1yaSBjb21tZW50IGxpbmUgKi8gfQotPE1SST4iOyIuKgkJCXsgLyogTXJpIGNvbW1lbnQgbGluZSAqLyB9Ci08TVJJPiJFTkQiICAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEVORFdPUkQpOyB9Ci08TVJJPiJBTElHTk1PRCIJCXsgUlRPS0VOKEFMSUdOTU9EKTt9Ci08TVJJPiJBTElHTiIJCXsgUlRPS0VOKEFMSUdOX0spO30KLTxNUkk+IkNISVAiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0hJUCk7IH0KLTxNUkk+IkJBU0UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQkFTRSk7IH0KLTxNUkk+IkFMSUFTIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEFMSUFTKTsgfQotPE1SST4iVFJVTkNBVEUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oVFJVTkNBVEUpOyB9Ci08TVJJPiJMT0FEIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExPQUQpOyB9Ci08TVJJPiJQVUJMSUMiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFBVQkxJQyk7IH0KLTxNUkk+Ik9SREVSIiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oT1JERVIpOyB9Ci08TVJJPiJOQU1FIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKE5BTUVXT1JEKTsgfQotPE1SST4iRk9STUFUIiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihGT1JNQVQpOyB9Ci08TVJJPiJDQVNFIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKENBU0UpOyB9Ci08TVJJPiJTVEFSVCIgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFNUQVJUKTsgfQotPE1SST4iTElTVCIuKiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihMSVNUKTsgLyogTElTVCBhbmQgaWdub3JlIHRvIGVuZCBvZiBsaW5lICovIH0KLTxNUkk+IlNFQ1QiCQkJeyBSVE9LRU4oU0VDVCk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBULE1SST4iQUJTT0xVVEUiCQkJeyBSVE9LRU4oQUJTT0xVVEUpOyB9Ci08TVJJPiJlbmQiICAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEVORFdPUkQpOyB9Ci08TVJJPiJhbGlnbm1vZCIJCXsgUlRPS0VOKEFMSUdOTU9EKTt9Ci08TVJJPiJhbGlnbiIJCXsgUlRPS0VOKEFMSUdOX0spO30KLTxNUkk+ImNoaXAiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0hJUCk7IH0KLTxNUkk+ImJhc2UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQkFTRSk7IH0KLTxNUkk+ImFsaWFzIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEFMSUFTKTsgfQotPE1SST4idHJ1bmNhdGUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oVFJVTkNBVEUpOyB9Ci08TVJJPiJsb2FkIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExPQUQpOyB9Ci08TVJJPiJwdWJsaWMiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFBVQkxJQyk7IH0KLTxNUkk+Im9yZGVyIiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oT1JERVIpOyB9Ci08TVJJPiJuYW1lIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKE5BTUVXT1JEKTsgfQotPE1SST4iZm9ybWF0IiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihGT1JNQVQpOyB9Ci08TVJJPiJjYXNlIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKENBU0UpOyB9Ci08TVJJPiJleHRlcm4iICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEVYVEVSTik7IH0KLTxNUkk+InN0YXJ0IiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oU1RBUlQpOyB9Ci08TVJJPiJsaXN0Ii4qICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExJU1QpOyAvKiBMSVNUIGFuZCBpZ25vcmUgdG8gZW5kIG9mIGxpbmUgKi8gfQotPE1SST4ic2VjdCIJCQl7IFJUT0tFTihTRUNUKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQsTVJJPiJhYnNvbHV0ZSIJCQl7IFJUT0tFTihBQlNPTFVURSk7IH0KLQotPE1SST57RklMRU5BTUVDSEFSMX17Tk9DRklMRU5BTUVDSEFSfSoJewotLyogRmlsZW5hbWUgd2l0aG91dCBjb21tYXMsIG5lZWRlZCB0byBwYXJzZSBtcmkgc3R1ZmYgKi8KLQkJCQkgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KTsgCi0JCQkJICByZXR1cm4gTkFNRTsKLQkJCQl9Ci0KLQotPEJPVEgsRVhQUkVTU0lPTj57RklMRU5BTUVDSEFSMX17RklMRU5BTUVDSEFSfSoJewotCQkJCSB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOyAKLQkJCQkgIHJldHVybiBOQU1FOwotCQkJCX0KLTxCT1RILEVYUFJFU1NJT04+Ii1sIntGSUxFTkFNRUNIQVJ9KyB7Ci0JCQkJICB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyAoeXl0ZXh0ICsgMik7Ci0JCQkJICByZXR1cm4gTE5BTUU7Ci0JCQkJfQotPFNDUklQVD57V0lMRENIQVJ9KiB7Ci0JCS8qIEFubm95aW5nbHksIHRoaXMgcGF0dGVybiBjYW4gbWF0Y2ggY29tbWVudHMsIGFuZCB3ZSBoYXZlCi0JCSAgIGxvbmdlc3QgbWF0Y2ggaXNzdWVzIHRvIGNvbnNpZGVyLiAgU28gaWYgdGhlIGZpcnN0IHR3bwotCQkgICBjaGFyYWN0ZXJzIGFyZSBhIGNvbW1lbnQgb3BlbmluZywgcHV0IHRoZSBpbnB1dCBiYWNrIGFuZAotCQkgICB0cnkgYWdhaW4uICAqLwotCQlpZiAoeXl0ZXh0WzBdID09ICcvJyAmJiB5eXRleHRbMV0gPT0gJyonKQotCQkgIHsKLQkJICAgIHl5bGVzcygyKTsKLQkJICAgIGNvbW1lbnQgKCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KTsKLQkJICAgIHJldHVybiBOQU1FOwotCQkgIH0KLQl9Ci0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBULFZFUlNfTk9ERT4iXCIiW15cIl0qIlwiIiB7Ci0JCQkJCS8qIE5vIG1hdHRlciB0aGUgc3RhdGUsIHF1b3RlcwotCQkJCQkgICBnaXZlIHdoYXQncyBpbnNpZGUgKi8KLQkJCQkJeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KzEpOwotCQkJCQl5eWx2YWwubmFtZVt5eWxlbmctMl0gPSAwOwotCQkJCQlyZXR1cm4gTkFNRTsKLQkJCQl9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTj4iXG4iCQl7IGxpbmVubysrO30KLTxNUkksQk9USCxTQ1JJUFQsRVhQUkVTU0lPTj5bIFx0XHJdKwl7IH0KLQotPFZFUlNfTk9ERSxWRVJTX1NDUklQVD5bOiw7XQl7IHJldHVybiAqeXl0ZXh0OyB9Ci0KLTxWRVJTX05PREU+Z2xvYmFsCQl7IFJUT0tFTihHTE9CQUwpOyB9Ci0KLTxWRVJTX05PREU+bG9jYWwJCXsgUlRPS0VOKExPQ0FMKTsgfQotCi08VkVSU19OT0RFPmV4dGVybgkJeyBSVE9LRU4oRVhURVJOKTsgfQotCi08VkVSU19OT0RFPntWX0lERU5USUZJRVJ9CXsgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcgKHl5dGV4dCk7Ci0JCQkJICByZXR1cm4gVkVSU19JREVOVElGSUVSOyB9Ci0KLTxWRVJTX1NDUklQVD57Vl9UQUd9CQl7IHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nICh5eXRleHQpOwotCQkJCSAgcmV0dXJuIFZFUlNfVEFHOyB9Ci0KLTxWRVJTX1NUQVJUPiJ7IgkJCXsgQkVHSU4oVkVSU19TQ1JJUFQpOyByZXR1cm4gKnl5dGV4dDsgfQotCi08VkVSU19TQ1JJUFQ+InsiCQl7IEJFR0lOKFZFUlNfTk9ERSk7IAotCQkJCSAgdmVyc19ub2RlX25lc3RpbmcgPSAwOwotCQkJCSAgcmV0dXJuICp5eXRleHQ7Ci0JCQkJfQotPFZFUlNfU0NSSVBUPiJ9IgkJeyByZXR1cm4gKnl5dGV4dDsgfQotPFZFUlNfTk9ERT4ieyIJCQl7IHZlcnNfbm9kZV9uZXN0aW5nKys7IHJldHVybiAqeXl0ZXh0OyB9Ci08VkVSU19OT0RFPiJ9IgkJCXsgaWYgKC0tdmVyc19ub2RlX25lc3RpbmcgPCAwKQotCQkJCSAgICBCRUdJTihWRVJTX1NDUklQVCk7Ci0JCQkJICByZXR1cm4gKnl5dGV4dDsKLQkJCQl9Ci0KLTxWRVJTX1NUQVJULFZFUlNfTk9ERSxWRVJTX1NDUklQVD5bXG5dCQl7IGxpbmVubysrOyB9Ci0KLTxWRVJTX1NUQVJULFZFUlNfTk9ERSxWRVJTX1NDUklQVD4jLioJCXsgLyogRWF0IHVwIGNvbW1lbnRzICovIH0KLQotPFZFUlNfU1RBUlQsVkVSU19OT0RFLFZFUlNfU0NSSVBUPlsgXHRccl0rICAgCXsgLyogRWF0IHVwIHdoaXRlc3BhY2UgKi8gfQotCi08PEVPRj4+IHsKLSAgaW5jbHVkZV9zdGFja19wdHItLTsKLSAgICAKLSAgaWYgKGluY2x1ZGVfc3RhY2tfcHRyID09IDApIAotICB7Ci0gICAgeXl0ZXJtaW5hdGUoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgeXlfc3dpdGNoX3RvX2J1ZmZlcihpbmNsdWRlX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSk7Ci0KLSAgfQotICBCRUdJTihTQ1JJUFQpOwotICBsZGZpbGVfaW5wdXRfZmlsZW5hbWUgPSBmaWxlX25hbWVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHIgLSAxXTsKLSAgbGluZW5vID0gbGluZW5vX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyIC0gMV07Ci0KLSAgcmV0dXJuIEVORDsKLX0KLQotPFNDUklQVCxNUkksVkVSU19TVEFSVCxWRVJTX1NDUklQVCxWRVJTX05PREU+LglsZXhfd2Fybl9pbnZhbGlkKCIgaW4gc2NyaXB0IiwgeXl0ZXh0KTsKLTxFWFBSRVNTSU9OLERFRlNZTUVYUCxCT1RIPi4JbGV4X3dhcm5faW52YWxpZCgiIGluIGV4cHJlc3Npb24iLCB5eXRleHQpOwotICAgIAotJSUKLQwKLQotLyogU3dpdGNoIGZsZXggdG8gcmVhZGluZyBzY3JpcHQgZmlsZSBOQU1FLCBvcGVuIG9uIEZJTEUsCi0gICBzYXZpbmcgdGhlIGN1cnJlbnQgaW5wdXQgaW5mbyBvbiB0aGUgaW5jbHVkZSBzdGFjay4gICovCi0KLXZvaWQKLWxleF9wdXNoX2ZpbGUgKGZpbGUsIG5hbWUpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChpbmNsdWRlX3N0YWNrX3B0ciA+PSBNQVhfSU5DTFVERV9ERVBUSCkgCi0gICAgewotICAgICAgZWluZm8oIiVGOmluY2x1ZGVzIG5lc3RlZCB0b28gZGVlcGx5XG4iKTsKLSAgICB9Ci0gIGZpbGVfbmFtZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSBuYW1lOwotICBsaW5lbm9fc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gMTsKLSAgaW5jbHVkZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSBZWV9DVVJSRU5UX0JVRkZFUjsKLQotICBpbmNsdWRlX3N0YWNrX3B0cisrOwotICB5eWluID0gZmlsZTsKLSAgeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKHl5aW4sIFlZX0JVRl9TSVpFKSk7Ci0gIEJFR0lOIChTQ1JJUFQpOwotfQotCi0vKiBSZXR1cm4gYSBuZXdseSBjcmVhdGVkIGZsZXggaW5wdXQgYnVmZmVyIGNvbnRhaW5pbmcgU1RSSU5HLAotICAgd2hpY2ggaXMgU0laRSBieXRlcyBsb25nLiAgKi8KLQotc3RhdGljIFlZX0JVRkZFUl9TVEFURSAKLXl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIChzdHJpbmcsIHNpemUpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFlZX0JVRkZFUl9TVEFURSBiOwotCi0gIC8qIENhbGxzIHRvIG0tYWxsb2MgZ2V0IHR1cm5lZCBieSBzZWQgaW50byB4bS1hbGxvYy4gICovCi0gIGIgPSAoWVlfQlVGRkVSX1NUQVRFKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSkpOwotICBiLT55eV9pbnB1dF9maWxlID0gMDsKLSAgYi0+eXlfYnVmX3NpemUgPSBzaXplOwotCi0gIC8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKLSAgICAgd2UgbmVlZCB0byBwdXQgaW4gMiBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICAqLwotICBiLT55eV9jaF9idWYgPSAoY2hhciAqKSBtYWxsb2MgKCh1bnNpZ25lZCkgKGItPnl5X2J1Zl9zaXplICsgMykpOwotCi0gIGItPnl5X2NoX2J1ZlswXSA9ICdcbic7Ci0gIHN0cmNweSAoYi0+eXlfY2hfYnVmKzEsIHN0cmluZyk7Ci0gIGItPnl5X2NoX2J1ZltzaXplKzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotICBiLT55eV9jaF9idWZbc2l6ZSsyXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKLSAgYi0+eXlfbl9jaGFycyA9IHNpemUrMTsKLSAgYi0+eXlfYnVmX3BvcyA9ICZiLT55eV9jaF9idWZbMV07Ci0KLSAgLyogZmxleCAyLjQuNyBjaGFuZ2VkIHRoZSBpbnRlcmZhY2UuICBGSVhNRTogV2Ugc2hvdWxkIG5vdCBiZSB1c2luZwotICAgICBhIGZsZXggaW50ZXJuYWwgaW50ZXJmYWNlIGluIHRoZSBmaXJzdCBwbGFjZSEgICovCi0jaWZkZWYgWVlfQlVGRkVSX05FVwotICBiLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKLSNlbHNlCi0gIGItPnl5X2VvZl9zdGF0dXMgPSBFT0ZfTk9UX1NFRU47Ci0jZW5kaWYKLQotICByZXR1cm4gYjsKLX0KLQotLyogU3dpdGNoIGZsZXggdG8gcmVhZGluZyBmcm9tIFNUUklORywgc2F2aW5nIHRoZSBjdXJyZW50IGlucHV0IGluZm8KLSAgIG9uIHRoZSBpbmNsdWRlIHN0YWNrLiAgKi8KLQotdm9pZAotbGV4X3JlZGlyZWN0IChzdHJpbmcpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLXsKLSAgWVlfQlVGRkVSX1NUQVRFIHRtcDsKLQotICB5eV9pbml0ID0gMDsKLSAgaWYgKGluY2x1ZGVfc3RhY2tfcHRyID49IE1BWF9JTkNMVURFX0RFUFRIKSAKLSAgICB7Ci0gICAgICBlaW5mbygiJUY6IG1hY3JvcyBuZXN0ZWQgdG9vIGRlZXBseVxuIik7Ci0gICAgfQotICBmaWxlX25hbWVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gInJlZGlyZWN0IjsKLSAgbGluZW5vX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IDA7Ci0gIGluY2x1ZGVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gWVlfQ1VSUkVOVF9CVUZGRVI7Ci0gIGluY2x1ZGVfc3RhY2tfcHRyKys7Ci0gIHRtcCA9IHl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIChzdHJpbmcsIHN0cmxlbiAoc3RyaW5nKSk7Ci0gIHl5X3N3aXRjaF90b19idWZmZXIgKHRtcCk7Ci0gIEJFR0lOIChTQ1JJUFQpOwotfQotDAotLyogRnVuY3Rpb25zIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBmbGV4IHN0YXJ0IGNvbmRpdGlvbiwKLSAgIHNhdmluZyB0aGUgY3VycmVudCBzdGFydCBjb25kaXRpb24gb24gYHN0YXRlX3N0YWNrJy4gICovCi0KLXN0YXRpYyBpbnQgc3RhdGVfc3RhY2tbTUFYX0lOQ0xVREVfREVQVEggKiAyXTsKLXN0YXRpYyBpbnQgKnN0YXRlX3N0YWNrX3AgPSBzdGF0ZV9zdGFjazsKLQotdm9pZAotbGRsZXhfc2NyaXB0ICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoU0NSSVBUKTsKLX0KLQotdm9pZAotbGRsZXhfbXJpX3NjcmlwdCAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKE1SSSk7Ci19Ci0KLXZvaWQKLWxkbGV4X3ZlcnNpb25fc2NyaXB0ICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoVkVSU19TVEFSVCk7Ci19Ci0KLXZvaWQKLWxkbGV4X3ZlcnNpb25fZmlsZSAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKFZFUlNfU0NSSVBUKTsKLX0KLQotdm9pZAotbGRsZXhfZGVmc3ltICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoREVGU1lNRVhQKTsKLX0KLQkgICAKLXZvaWQKLWxkbGV4X2V4cHJlc3Npb24gKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChFWFBSRVNTSU9OKTsKLX0KLQotdm9pZAotbGRsZXhfYm90aCAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKEJPVEgpOwotfQotCi12b2lkCi1sZGxleF9wb3BzdGF0ZSAoKQotewotICB5eV9zdGFydCA9ICooLS1zdGF0ZV9zdGFja19wKTsKLX0KLQwKLQotLyogUGxhY2UgdXAgdG8gTUFYX1NJWkUgY2hhcmFjdGVycyBpbiBCVUYgYW5kIHJldHVybiBpbiAqUkVTVUxUCi0gICBlaXRoZXIgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIDAgdG8gaW5kaWNhdGUgRU9GLiAgKi8KLQotc3RhdGljIHZvaWQKLXl5X2lucHV0IChidWYsIHJlc3VsdCwgbWF4X3NpemUpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50ICpyZXN1bHQ7Ci0gICAgIGludCBtYXhfc2l6ZTsKLXsKLSAgKnJlc3VsdCA9IDA7IAotICBpZiAoeXlfY3VycmVudF9idWZmZXItPnl5X2lucHV0X2ZpbGUpCi0gICAgewotICAgICAgaWYgKHl5aW4pCi0JewotCSAgKnJlc3VsdCA9IHJlYWQgKGZpbGVubyAoeXlpbiksIChjaGFyICopIGJ1ZiwgbWF4X3NpemUpOwotCSAgaWYgKCpyZXN1bHQgPCAwKSAKLQkgICAgZWluZm8gKCIlRiVQOiByZWFkIGluIGZsZXggc2Nhbm5lciBmYWlsZWRcbiIpOwotCX0KLSAgICB9Ci19Ci0KLS8qIEVhdCB0aGUgcmVzdCBvZiBhIEMtc3R5bGUgY29tbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1jb21tZW50ICgpCi17Ci0gIGludCBjOwotCi0gIHdoaWxlICgxKQotICB7Ci0gICAgYyA9IGlucHV0KCk7Ci0gICAgd2hpbGUgKGMgIT0gJyonICYmIGMgIT0gRU9GKSAKLSAgICB7Ci0gICAgICBpZiAoYyA9PSAnXG4nKQotCWxpbmVubysrOwotICAgICAgYyA9IGlucHV0KCk7Ci0gICAgfQotCi0gICAgaWYgKGMgPT0gJyonKQotICAgIHsKLSAgICAgIGMgPSBpbnB1dCgpOwotICAgICAgd2hpbGUgKGMgPT0gJyonKQotICAgICAgIGMgPSBpbnB1dCgpOwotICAgICAgaWYgKGMgPT0gJy8nKQotICAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIHRoZSBlbmQgKi8KLSAgICB9Ci0KLSAgICBpZiAoYyA9PSAnXG4nKQotICAgICAgbGluZW5vKys7Ci0KLSAgICBpZiAoYyA9PSBFT0YpCi0gICAgewotICAgICAgZWluZm8oICIlRiVQOiBFT0YgaW4gY29tbWVudFxuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyogV2FybiB0aGUgdXNlciBhYm91dCBhIGdhcmJhZ2UgY2hhcmFjdGVyIFdIQVQgaW4gdGhlIGlucHV0Ci0gICBpbiBjb250ZXh0IFdIRVJFLiAgKi8KLQotc3RhdGljIHZvaWQKLWxleF93YXJuX2ludmFsaWQgKHdoZXJlLCB3aGF0KQotICAgICBjaGFyICp3aGVyZSwgKndoYXQ7Ci17Ci0gIGNoYXIgYnVmWzVdOwotCi0gIC8qIElmIHdlIGhhdmUgZm91bmQgYW4gaW5wdXQgZmlsZSB3aG9zZSBmb3JtYXQgd2UgZG8gbm90IHJlY29nbml6ZSwKLSAgICAgYW5kIHdlIGFyZSB0aGVyZWZvcmUgdHJlYXRpbmcgaXQgYXMgYSBsaW5rZXIgc2NyaXB0LCBhbmQgd2UgZmluZAotICAgICBhbiBpbnZhbGlkIGNoYXJhY3RlciwgdGhlbiBtb3N0IGxpa2VseSB0aGlzIGlzIGEgcmVhbCBvYmplY3QgZmlsZQotICAgICBvZiBzb21lIGRpZmZlcmVudCBmb3JtYXQuICBUcmVhdCBpdCBhcyBzdWNoLiAgKi8KLSAgaWYgKGxkZmlsZV9hc3N1bWVkX3NjcmlwdCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7Ci0gICAgICBlaW5mbyAoIiVGJXM6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iLCBsZGZpbGVfaW5wdXRfZmlsZW5hbWUpOwotICAgIH0KLQotICBpZiAoISBpc3ByaW50ICgodW5zaWduZWQgY2hhcikgKndoYXQpKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpICp3aGF0KTsKLSAgICAgIHdoYXQgPSBidWY7Ci0gICAgfQotCi0gIGVpbmZvICgiJVA6JVM6IGlnbm9yaW5nIGludmFsaWQgY2hhcmFjdGVyIGAlcyclc1xuIiwgd2hhdCwgd2hlcmUpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRtYWluLmMgYi9sZC9sZG1haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyYTU5Mi4uMDAwMDAwMAotLS0gYS9sZC9sZG1haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEzMTMgKzAsMCBAQAotLyogTWFpbiBwcm9ncmFtIG9mIEdOVSBsaW5rZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInByb2dyZXNzLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZHdyaXRlLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotCi0vKiBTb21ld2hlcmUgYWJvdmUsIHN5cy9zdGF0LmggZ290IGluY2x1ZGVkIC4gLiAuIC4gKi8KLSNpZiAhZGVmaW5lZChTX0lTRElSKSAmJiBkZWZpbmVkKFNfSUZESVIpCi0jZGVmaW5lCVNfSVNESVIobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgSEFWRV9TQlJLCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi1leHRlcm4gUFRSIHNicmsgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqZ2V0X2VtdWxhdGlvbiBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHNldF9zY3JpcHRzX2RpciBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEVYUE9SVFMgKi8KLQotY2hhciAqZGVmYXVsdF90YXJnZXQ7Ci1jb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWUgPSAiYS5vdXQiOwotCi0vKiBOYW1lIHRoaXMgcHJvZ3JhbSB3YXMgaW52b2tlZCBieS4gICovCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIFRoZSBmaWxlIHRoYXQgd2UncmUgY3JlYXRpbmcgKi8KLWJmZCAqb3V0cHV0X2JmZCA9IDA7Ci0KLS8qIFNldCBieSAtRyBhcmd1bWVudCwgZm9yIE1JUFMgRUNPRkYgdGFyZ2V0LiAgKi8KLWludCBnX3N3aXRjaF92YWx1ZSA9IDg7Ci0KLS8qIE5vbnplcm8gbWVhbnMgcHJpbnQgbmFtZXMgb2YgaW5wdXQgZmlsZXMgYXMgcHJvY2Vzc2VkLiAgKi8KLWJvb2xlYW4gdHJhY2VfZmlsZXM7Ci0KLS8qIE5vbnplcm8gbWVhbnMgc2FtZSwgYnV0IG5vdGUgb3BlbiBmYWlsdXJlcywgdG9vLiAgKi8KLWJvb2xlYW4gdHJhY2VfZmlsZV90cmllczsKLQotLyogTm9uemVybyBtZWFucyB2ZXJzaW9uIG51bWJlciB3YXMgcHJpbnRlZCwgc28gZXhpdCBzdWNjZXNzZnVsbHkKLSAgIGluc3RlYWQgb2YgY29tcGxhaW5pbmcgaWYgbm8gaW5wdXQgZmlsZXMgYXJlIGdpdmVuLiAgKi8KLWJvb2xlYW4gdmVyc2lvbl9wcmludGVkOwotCi0vKiBOb256ZXJvIG1lYW5zIGxpbmsgaW4gZXZlcnkgbWVtYmVyIG9mIGFuIGFyY2hpdmUuICAqLwotYm9vbGVhbiB3aG9sZV9hcmNoaXZlOwotCi0vKiBUcnVlIGlmIHdlIHNob3VsZCBkZW1hbmdsZSBzeW1ib2wgbmFtZXMuICAqLwotYm9vbGVhbiBkZW1hbmdsaW5nOwotCi1hcmdzX3R5cGUgY29tbWFuZF9saW5lOwotCi1sZF9jb25maWdfdHlwZSBjb25maWc7Ci0KLXN0YXRpYyB2b2lkIHJlbW92ZV9vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gY2hlY2tfZm9yX3NjcmlwdHNfZGlyIFBBUkFNUyAoKGNoYXIgKmRpcikpOwotc3RhdGljIGJvb2xlYW4gYWRkX2FyY2hpdmVfZWxlbWVudCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gbXVsdGlwbGVfZGVmaW5pdGlvbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgY29uc3QgY2hhciAqLAotCQkJCQkgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsCi0JCQkJCSAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbXVsdGlwbGVfY29tbW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCWNvbnN0IGNoYXIgKiwgYmZkICosCi0JCQkJCWVudW0gYmZkX2xpbmtfaGFzaF90eXBlLCBiZmRfdm1hLAotCQkJCQliZmQgKiwgZW51bSBiZmRfbGlua19oYXNoX3R5cGUsCi0JCQkJCWJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGFkZF90b19zZXQgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCSAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKLQkJCQkgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gY29uc3RydWN0b3JfY2FsbGJhY2sgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICBib29sZWFuIGNvbnN0cnVjdG9yLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHdhcm5pbmdfY2FsbGJhY2sgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBiZmQgKiwKLQkJCQkJIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyB2b2lkIHdhcm5pbmdfZmluZF9yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiB1bmRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSBjb25zdCBjaGFyICosIGJmZCAqLAotCQkJCQkgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcmVsb2Nfb3ZlcmZsb3cgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICosIGJmZF92bWEsCi0JCQkJICAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiByZWxvY19kYW5nZXJvdXMgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCQkJCQliZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gdW5hdHRhY2hlZF9yZWxvYyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgY29uc3QgY2hhciAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIG5vdGljZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MgbGlua19jYWxsYmFja3MgPQotewotICBhZGRfYXJjaGl2ZV9lbGVtZW50LAotICBtdWx0aXBsZV9kZWZpbml0aW9uLAotICBtdWx0aXBsZV9jb21tb24sCi0gIGFkZF90b19zZXQsCi0gIGNvbnN0cnVjdG9yX2NhbGxiYWNrLAotICB3YXJuaW5nX2NhbGxiYWNrLAotICB1bmRlZmluZWRfc3ltYm9sLAotICByZWxvY19vdmVyZmxvdywKLSAgcmVsb2NfZGFuZ2Vyb3VzLAotICB1bmF0dGFjaGVkX3JlbG9jLAotICBub3RpY2UKLX07Ci0KLXN0cnVjdCBiZmRfbGlua19pbmZvIGxpbmtfaW5mbzsKLQwKLXN0YXRpYyB2b2lkCi1yZW1vdmVfb3V0cHV0ICgpCi17Ci0gIGlmIChvdXRwdXRfZmlsZW5hbWUpIAotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfYmZkICYmIG91dHB1dF9iZmQtPmlvc3RyZWFtKQotCWZjbG9zZSgoRklMRSAqKShvdXRwdXRfYmZkLT5pb3N0cmVhbSkpOwotICAgICAgaWYgKGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlKQotCXVubGluayAob3V0cHV0X2ZpbGVuYW1lKTsKLSAgICB9Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICplbXVsYXRpb247Ci0gIGxvbmcgc3RhcnRfdGltZSA9IGdldF9ydW5fdGltZSAoKTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLQotICBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICB4YXRleGl0IChyZW1vdmVfb3V0cHV0KTsKLQotICAvKiBTZXQgdGhlIGRlZmF1bHQgQkZEIHRhcmdldCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCB0YXJnZXQuICBEb2luZwotICAgICB0aGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0byBiZSBjb25maWd1cmVkIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0LAotICAgICBhbmQgbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgQkZEIGxpYnJhcnkgd2hpY2ggd2FzIGNvbmZpZ3VyZWQgZm9yCi0gICAgIGEgZGlmZmVyZW50IHRhcmdldC4gIFRoZSBtYWNybyBUQVJHRVQgaXMgZGVmaW5lZCBieSBNYWtlZmlsZS4gICovCi0gIGlmICghIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKFRBUkdFVCkpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVYJVA6IGNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJUVcbiIpLCBUQVJHRVQpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBkYXRhIGFib3V0IG9wdGlvbnMuICAqLwotICB0cmFjZV9maWxlcyA9IHRyYWNlX2ZpbGVfdHJpZXMgPSB2ZXJzaW9uX3ByaW50ZWQgPSBmYWxzZTsKLSAgd2hvbGVfYXJjaGl2ZSA9IGZhbHNlOwotICBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID0gdHJ1ZTsKLSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotICBjb25maWcuaGFzX3NoYXJlZCA9IGZhbHNlOwotICBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24gPSBmYWxzZTsKLSAgY29tbWFuZF9saW5lLmludGVycHJldGVyID0gTlVMTDsKLSAgY29tbWFuZF9saW5lLnJwYXRoID0gTlVMTDsKLSAgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2ggPSB0cnVlOwotICBjb21tYW5kX2xpbmUuY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgPSB0cnVlOwotCi0gIC8qIFdlIGluaXRpYWxpemUgREVNQU5HTElORyBiYXNlZCBvbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgQ09MTEVDVF9OT19ERU1BTkdMRS4gIFRoZSBnY2MgY29sbGVjdDIgcHJvZ3JhbSB3aWxsIGRlbWFuZ2xlIHRoZQotICAgICBvdXRwdXQgb2YgdGhlIGxpbmtlciwgdW5sZXNzIENPTExFQ1RfTk9fREVNQU5HTEUgaXMgc2V0IGluIHRoZQotICAgICBlbnZpcm9ubWVudC4gIEFjdGluZyB0aGUgc2FtZSB3YXkgaGVyZSBsZXRzIHVzIHByb3ZpZGUgdGhlIHNhbWUKLSAgICAgaW50ZXJmYWNlIGJ5IGRlZmF1bHQuICAqLwotICBkZW1hbmdsaW5nID0gZ2V0ZW52ICgiQ09MTEVDVF9OT19ERU1BTkdMRSIpID09IE5VTEw7Ci0KLSAgbGlua19pbmZvLmNhbGxiYWNrcyA9ICZsaW5rX2NhbGxiYWNrczsKLSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICBsaW5rX2luZm8uc2hhcmVkID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5zeW1ib2xpYyA9IGZhbHNlOwotICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSBmYWxzZTsKLSAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IGZhbHNlOwotICBsaW5rX2luZm8ub3B0aW1pemUgPSBmYWxzZTsKLSAgbGlua19pbmZvLm5vX3VuZGVmaW5lZCA9IGZhbHNlOwotICBsaW5rX2luZm8uc3RyaXAgPSBzdHJpcF9ub25lOwotICBsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfbm9uZTsKLSAgbGlua19pbmZvLmtlZXBfbWVtb3J5ID0gdHJ1ZTsKLSAgbGlua19pbmZvLmlucHV0X2JmZHMgPSBOVUxMOwotICBsaW5rX2luZm8uY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gPSBOVUxMOwotICBsaW5rX2luZm8uaGFzaCA9IE5VTEw7Ci0gIGxpbmtfaW5mby5rZWVwX2hhc2ggPSBOVUxMOwotICBsaW5rX2luZm8ubm90aWNlX2FsbCA9IGZhbHNlOwotICBsaW5rX2luZm8ubm90aWNlX2hhc2ggPSBOVUxMOwotICBsaW5rX2luZm8ud3JhcF9oYXNoID0gTlVMTDsKLSAgbGlua19pbmZvLm1wYzg2MGMwID0gMDsKLSAgLyogU1ZSNCBsaW5rZXJzIHNlZW0gdG8gc2V0IERUX0lOSVQgYW5kIERUX0ZJTkkgYmFzZWQgb24gbWFnaWMgX2luaXQKLSAgICAgYW5kIF9maW5pIHN5bWJvbHMuICBXZSBhcmUgY29tcGF0aWJsZS4gICovCi0gIGxpbmtfaW5mby5pbml0X2Z1bmN0aW9uID0gIl9pbml0IjsKLSAgbGlua19pbmZvLmZpbmlfZnVuY3Rpb24gPSAiX2ZpbmkiOwotCi0gIGxkZmlsZV9hZGRfYXJjaCAoIiIpOwotCi0gIGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSBmYWxzZTsKLSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IHRydWU7Ci0gIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IHRydWU7Ci0gIGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotCi0gIGVtdWxhdGlvbiA9IGdldF9lbXVsYXRpb24gKGFyZ2MsIGFyZ3YpOwotICBsZGVtdWxfY2hvb3NlX21vZGUgKGVtdWxhdGlvbik7Ci0gIGRlZmF1bHRfdGFyZ2V0ID0gbGRlbXVsX2Nob29zZV90YXJnZXQgKCk7Ci0gIGxhbmdfaW5pdCAoKTsKLSAgbGRlbXVsX2JlZm9yZV9wYXJzZSAoKTsKLSAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IGZhbHNlOwotICBwYXJzZV9hcmdzIChhcmdjLCBhcmd2KTsKLQotICBsZGVtdWxfc2V0X3N5bWJvbHMgKCk7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucykKLQllaW5mbyAoIiVQJUY6IC0tZ2Mtc2VjdGlvbnMgYW5kIC1yIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIik7Ci0gICAgICBpZiAobGlua19pbmZvLm1wYzg2MGMwKQotCWVpbmZvIChfKCIlUCVGOiAtciBhbmQgLS1tcGM4NjBjMCBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpKTsKLSAgICAgIGVsc2UgaWYgKGNvbW1hbmRfbGluZS5yZWxheCkKLQllaW5mbyAoXygiJVAlRjogLS1yZWxheCBhbmQgLXIgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKSk7Ci0gICAgICBpZiAobGlua19pbmZvLnNoYXJlZCkKLQllaW5mbyAoXygiJVAlRjogLXIgYW5kIC1zaGFyZWQgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKSk7Ci0gICAgfQotCi0gIC8qIFRyZWF0IGxkIC1yIC1zIGFzIGxkIC1yIC1TIC14IChpLmUuLCBzdHJpcCBhbGwgbG9jYWwgc3ltYm9scykuICBJCi0gICAgIGRvbid0IHNlZSBob3cgZWxzZSB0aGlzIGNhbiBiZSBoYW5kbGVkLCBzaW5jZSBpbiB0aGlzIGNhc2Ugd2UKLSAgICAgbXVzdCBwcmVzZXJ2ZSBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSAmJiBsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfYWxsKQotICAgIHsKLSAgICAgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX2RlYnVnZ2VyOwotICAgICAgaWYgKGxpbmtfaW5mby5kaXNjYXJkID09IGRpc2NhcmRfbm9uZSkKLQlsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfYWxsOwotICAgIH0KLQotICAvKiBUaGlzIGVzc2VudGlhbGx5IGFkZHMgYW5vdGhlciAtTCBkaXJlY3Rvcnkgc28gdGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIKLSAgICAgdGhlIC1MJ3MgaW4gYXJndiBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKi8KLSAgc2V0X3NjcmlwdHNfZGlyICgpOwotCi0gIGlmIChoYWRfc2NyaXB0ID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFJlYWQgdGhlIGVtdWxhdGlvbidzIGFwcHJvcHJpYXRlIGRlZmF1bHQgc2NyaXB0LiAgKi8KLSAgICAgIGludCBpc2ZpbGU7Ci0gICAgICBjaGFyICpzID0gbGRlbXVsX2dldF9zY3JpcHQgKCZpc2ZpbGUpOwotCi0gICAgICBpZiAoaXNmaWxlKQotCWxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAocyk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHRyYWNlX2ZpbGVfdHJpZXMpCi0JICAgIHsKLQkgICAgICBpbmZvX21zZyAoXygidXNpbmcgaW50ZXJuYWwgbGlua2VyIHNjcmlwdDpcbiIpKTsKLQkgICAgICBpbmZvX21zZyAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQkgICAgICBpbmZvX21zZyAocyk7Ci0JICAgICAgaW5mb19tc2cgKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQkgICAgfQotCSAgbGV4X3N0cmluZyA9IHM7Ci0JICBsZXhfcmVkaXJlY3QgKHMpOwotCX0KLSAgICAgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NjcmlwdDsKLSAgICAgIHl5cGFyc2UgKCk7Ci0gICAgICBsZXhfc3RyaW5nID0gTlVMTDsKLSAgICB9Ci0KLSAgbGFuZ19maW5hbCAoKTsKLQotICBpZiAobGFuZ19oYXNfaW5wdXRfZmlsZSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAodmVyc2lvbl9wcmludGVkKQotCXhleGl0ICgwKTsKLSAgICAgIGVpbmZvIChfKCIlUCVGOiBubyBpbnB1dCBmaWxlc1xuIikpOwotICAgIH0KLQotICBpZiAodHJhY2VfZmlsZXMpCi0gICAgewotICAgICAgaW5mb19tc2cgKF8oIiVQOiBtb2RlICVzXG4iKSwgZW11bGF0aW9uKTsKLSAgICB9Ci0KLSAgbGRlbXVsX2FmdGVyX3BhcnNlICgpOwotCi0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZW5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoY29uZmlnLm1hcF9maWxlbmFtZSwgIi0iKSA9PSAwKQotCXsKLQkgIGNvbmZpZy5tYXBfZmlsZSA9IHN0ZG91dDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY29uZmlnLm1hcF9maWxlID0gZm9wZW4gKGNvbmZpZy5tYXBfZmlsZW5hbWUsIEZPUEVOX1dUKTsKLQkgIGlmIChjb25maWcubWFwX2ZpbGUgPT0gKEZJTEUgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICAgICAgZWluZm8gKF8oIiVQJUY6IGNhbm5vdCBvcGVuIG1hcCBmaWxlICVzOiAlRVxuIiksCi0JCSAgICAgY29uZmlnLm1hcF9maWxlbmFtZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0KLSAgbGFuZ19wcm9jZXNzICgpOwotCi0gIC8qIFByaW50IGVycm9yIG1lc3NhZ2VzIGZvciBhbnkgbWlzc2luZyBzeW1ib2xzLCBmb3IgYW55IHdhcm5pbmcKLSAgICAgc3ltYm9scywgYW5kIHBvc3NpYmx5IG11bHRpcGxlIGRlZmluaXRpb25zICovCi0KLQotICBpZiAoY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHsKLSAgICAgIC8qIExvb2sgZm9yIGEgdGV4dCBzZWN0aW9uIGFuZCBtYXJrIHRoZSByZWFkb25seSBhdHRyaWJ1dGUgaW4gaXQgKi8KLSAgICAgIGFzZWN0aW9uICpmb3VuZCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnRleHQiKTsKLQotICAgICAgaWYgKGZvdW5kICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIGZvdW5kLT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0JfQotICAgIH0KLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICBvdXRwdXRfYmZkLT5mbGFncyAmPSB+RVhFQ19QOwotICBlbHNlCi0gICAgb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotCi0gIGxkd3JpdGUgKCk7Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQotICAgIGxhbmdfbWFwICgpOwotICBpZiAoY29tbWFuZF9saW5lLmNyZWYpCi0gICAgb3V0cHV0X2NyZWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMID8gY29uZmlnLm1hcF9maWxlIDogc3Rkb3V0KTsKLSAgaWYgKG5vY3Jvc3NyZWZfbGlzdCAhPSBOVUxMKQotICAgIGNoZWNrX25vY3Jvc3NyZWZzICgpOwotCi0gIC8qIEV2ZW4gaWYgd2UncmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHNvbWUgbm9uLWZhdGFsIGVycm9ycyBzaG91bGQKLSAgICAgYmUgcmVwb3J0ZWQgaW4gdGhlIGV4aXQgc3RhdHVzLiAgKFdoYXQgbm9uLWZhdGFsIGVycm9ycywgaWYgYW55LCBkbyB3ZQotICAgICB3YW50IHRvIGlnbm9yZSBmb3IgcmVsb2NhdGVhYmxlIG91dHB1dD8pICAqLwotCi0gIGlmIChjb25maWcubWFrZV9leGVjdXRhYmxlID09IGZhbHNlICYmIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAodHJhY2VfZmlsZXMgPT0gdHJ1ZSkKLQl7Ci0JICBlaW5mbyAoXygiJVA6IGxpbmsgZXJyb3JzIGZvdW5kLCBkZWxldGluZyBleGVjdXRhYmxlIGAlcydcbiIpLAotCQkgb3V0cHV0X2ZpbGVuYW1lKTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBmaWxlIHdpbGwgYmUgcmVtb3ZlZCBieSByZW1vdmVfb3V0cHV0LiAgKi8KLQotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jbG9zZSAob3V0cHV0X2JmZCkpCi0JZWluZm8gKF8oIiVGJUI6IGZpbmFsIGNsb3NlIGZhaWxlZDogJUVcbiIpLCBvdXRwdXRfYmZkKTsKLQotICAgICAgLyogSWYgdGhlIC0tZm9yY2UtZXhlLXN1ZmZpeCBpcyBlbmFibGVkLCBhbmQgd2UncmUgbWFraW5nIGFuCi0JIGV4ZWN1dGFibGUgZmlsZSBhbmQgaXQgZG9lc24ndCBlbmQgaW4gLmV4ZSwgY29weSBpdCB0byBvbmUgd2hpY2ggZG9lcy4gKi8KLQotICAgICAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSAmJiBjb21tYW5kX2xpbmUuZm9yY2VfZXhlX3N1ZmZpeCkKLQl7Ci0JICBpbnQgbGVuID0gc3RybGVuIChvdXRwdXRfZmlsZW5hbWUpOwotCSAgaWYgKGxlbiA8IDQgCi0JICAgICAgfHwgKHN0cmNhc2VjbXAgKG91dHB1dF9maWxlbmFtZSArIGxlbiAtIDQsICIuZXhlIikgIT0gMAotCQkgICYmIHN0cmNhc2VjbXAgKG91dHB1dF9maWxlbmFtZSArIGxlbiAtIDQsICIuZGxsIikgIT0gMCkpCi0JICAgIHsKLQkgICAgICBGSUxFICpzcmM7Ci0JICAgICAgRklMRSAqZHN0OwotCSAgICAgIGNvbnN0IGludCBic2l6ZSA9IDQwOTY7Ci0JICAgICAgY2hhciAqYnVmID0geG1hbGxvYyAoYnNpemUpOwotCSAgICAgIGludCBsOwotCSAgICAgIGNoYXIgKmRzdF9uYW1lID0geG1hbGxvYyAobGVuICsgNSk7Ci0JICAgICAgc3RyY3B5IChkc3RfbmFtZSwgb3V0cHV0X2ZpbGVuYW1lKTsKLQkgICAgICBzdHJjYXQgKGRzdF9uYW1lLCAiLmV4ZSIpOwotCSAgICAgIHNyYyA9IGZvcGVuIChvdXRwdXRfZmlsZW5hbWUsIEZPUEVOX1JCKTsKLQkgICAgICBkc3QgPSBmb3BlbiAoZHN0X25hbWUsIEZPUEVOX1dCKTsKLQotCSAgICAgIGlmICghc3JjKQotCQllaW5mbyAoXygiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIHNvdXJjZSBvZiBjb3B5IGAlcydcbiIpLCBvdXRwdXRfZmlsZW5hbWUpOwotCSAgICAgIGlmICghZHN0KQotCQllaW5mbyAoXygiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIGRlc3RpbmF0aW9uIG9mIGNvcHkgYCVzJ1xuIiksIGRzdF9uYW1lKTsKLQkgICAgICB3aGlsZSAoKGwgPSBmcmVhZCAoYnVmLCAxLCBic2l6ZSwgc3JjKSkgPiAwKQotCQl7Ci0JCSAgaW50IGRvbmUgPSBmd3JpdGUgKGJ1ZiwgMSwgbCwgZHN0KTsKLQkJICBpZiAoZG9uZSAhPSBsKQotCQkgICAgewotCQkgICAgICBlaW5mbyAoXygiJVA6IEVycm9yIHdyaXRpbmcgZmlsZSBgJXMnXG4iKSwgZHN0X25hbWUpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZmNsb3NlIChzcmMpOwotCSAgICAgIGlmIChmY2xvc2UgKGRzdCkgPT0gRU9GKQotCQl7Ci0JCSAgZWluZm8gKF8oIiVQOiBFcnJvciBjbG9zaW5nIGZpbGUgYCVzJ1xuIiksIGRzdF9uYW1lKTsKLQkJfQotCSAgICAgIGZyZWUgKGRzdF9uYW1lKTsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgaWYgKGNvbmZpZy5zdGF0cykKLSAgICB7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBjaGFyICpsaW0gPSAoY2hhciAqKSBzYnJrICgwKTsKLSNlbmRpZgotICAgICAgbG9uZyBydW5fdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHN0YXJ0X3RpbWU7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHRvdGFsIHRpbWUgaW4gbGluazogJWxkLiUwNmxkXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBydW5fdGltZSAvIDEwMDAwMDAsIHJ1bl90aW1lICUgMTAwMDAwMCk7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBkYXRhIHNpemUgJWxkXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICAgICAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogUHJldmVudCByZW1vdmVfb3V0cHV0IGZyb20gZG9pbmcgYW55dGhpbmcsIGFmdGVyIGEgc3VjY2Vzc2Z1bCBsaW5rLiAgKi8KLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQotICB4ZXhpdCAoMCk7Ci0gIHJldHVybiAwOwotfQotCi0vKiBXZSBuZWVkIHRvIGZpbmQgYW55IGV4cGxpY2l0bHkgZ2l2ZW4gZW11bGF0aW9uIGluIG9yZGVyIHRvIGluaXRpYWxpemUgdGhlCi0gICBzdGF0ZSB0aGF0J3MgbmVlZGVkIGJ5IHRoZSBsZXgmeWFjYyBhcmd1bWVudCBwYXJzZXIgKHBhcnNlX2FyZ3MpLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X2VtdWxhdGlvbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICplbXVsYXRpb247Ci0gIGludCBpOwotCi0gIGVtdWxhdGlvbiA9IGdldGVudiAoRU1VTEFUSU9OX0VOVklST04pOwotICBpZiAoZW11bGF0aW9uID09IE5VTEwpCi0gICAgZW11bGF0aW9uID0gREVGQVVMVF9FTVVMQVRJT047Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXN0cm5jbXAgKGFyZ3ZbaV0sICItbSIsIDIpKQotCXsKLQkgIGlmIChhcmd2W2ldWzJdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiAtbSBFTVVMICovCi0JICAgICAgaWYgKGkgPCBhcmdjIC0gMSkKLQkJewotCQkgIGVtdWxhdGlvbiA9IGFyZ3ZbaSArIDFdOwotCQkgIGkrKzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVpbmZvKF8oIiVQJUY6IG1pc3NpbmcgYXJndW1lbnQgdG8gLW1cbiIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczEiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAoYXJndltpXSwgIi1taXBzMiIpID09IDAKLQkJICAgfHwgc3RyY21wIChhcmd2W2ldLCAiLW1pcHMzIikgPT0gMAotCQkgICB8fCBzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFRoZSBhcmd1bWVudHMgLW1pcHMxLCAtbWlwczIgYW5kIC1taXBzMyBhcmUKLQkJIHBhc3NlZCB0byB0aGUgbGlua2VyIGJ5IHNvbWUgTUlQUyBjb21waWxlcnMuICBUaGV5Ci0JCSBnZW5lcmFsbHkgdGVsbCB0aGUgbGlua2VyIHRvIHVzZSBhIHNsaWdodGx5IGRpZmZlcmVudAotCQkgbGlicmFyeSBwYXRoLiAgUGVyaGFwcyBzb21lZGF5IHRoZXNlIHNob3VsZCBiZQotCQkgaW1wbGVtZW50ZWQgYXMgZW11bGF0aW9uczsgdW50aWwgdGhlbiwgd2UganVzdCBpZ25vcmUKLQkJIHRoZSBhcmd1bWVudHMgYW5kIGhvcGUgdGhhdCBub2JvZHkgZXZlciBjcmVhdGVzCi0JCSBlbXVsYXRpb25zIG5hbWVkIGlwczEsIGlwczIgb3IgaXBzMy4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi1tNDg2IikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBUaGUgYXJndW1lbnQgLW00ODYgaXMgcGFzc2VkIHRvIHRoZSBsaW5rZXIgb24KLQkJIHNvbWUgTGludXggc3lzdGVtcy4gIEhvcGUgdGhhdCBub2JvZHkgY3JlYXRlcyBhbgotCQkgZW11bGF0aW9uIG5hbWVkIDQ4Ni4gICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIC1tRU1VTCAqLwotCSAgICAgIGVtdWxhdGlvbiA9ICZhcmd2W2ldWzJdOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gZW11bGF0aW9uOwotfQotCi0vKiBJZiBkaXJlY3RvcnkgRElSIGNvbnRhaW5zIGFuICJsZHNjcmlwdHMiIHN1YmRpcmVjdG9yeSwKLSAgIGFkZCBESVIgdG8gdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggYW5kIHJldHVybiB0cnVlLAotICAgZWxzZSByZXR1cm4gZmFsc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChkaXIpCi0gICAgIGNoYXIgKmRpcjsKLXsKLSAgc2l6ZV90IGRpcmxlbjsKLSAgY2hhciAqYnVmOwotICBzdHJ1Y3Qgc3RhdCBzOwotICBib29sZWFuIHJlczsKLQotICBkaXJsZW4gPSBzdHJsZW4gKGRpcik7Ci0gIC8qIHNpemVvZiBjb3VudHMgdGhlIHRlcm1pbmF0aW5nIE5VTC4gICovCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGRpcmxlbiArIHNpemVvZigiL2xkc2NyaXB0cyIpKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXMvbGRzY3JpcHRzIiwgZGlyKTsKLQotICByZXMgPSBzdGF0IChidWYsICZzKSA9PSAwICYmIFNfSVNESVIgKHMuc3RfbW9kZSk7Ci0gIGZyZWUgKGJ1Zik7Ci0gIGlmIChyZXMpCi0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGRpciwgZmFsc2UpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBTZXQgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBmaW5kaW5nIHNjcmlwdCBmaWxlcy4KLSAgIExpYnJhcmllcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBoZXJlIHRvbywgYnV0IHRoYXQncyBvay4KLSAgIFdlIGxvb2sgZm9yIHRoZSAibGRzY3JpcHRzIiBkaXJlY3RvcnkgaW46Ci0KLSAgIFNDUklQVERJUiAocGFzc2VkIGZyb20gTWFrZWZpbGUpCi0gICB0aGUgZGlyIHdoZXJlIHRoaXMgcHJvZ3JhbSBpcyAoZm9yIHVzaW5nIGl0IGZyb20gdGhlIGJ1aWxkIHRyZWUpCi0gICB0aGUgZGlyIHdoZXJlIHRoaXMgcHJvZ3JhbSBpcy8uLi9saWIgKGZvciBpbnN0YWxsaW5nIHRoZSB0b29sIHN1aXRlIGVsc2V3aGVyZSkgKi8KLQotc3RhdGljIHZvaWQKLXNldF9zY3JpcHRzX2RpciAoKQotewotICBjaGFyICplbmQsICpkaXI7Ci0gIHNpemVfdCBkaXJsZW47Ci0KLSAgaWYgKGNoZWNrX2Zvcl9zY3JpcHRzX2RpciAoU0NSSVBURElSKSkKLSAgICByZXR1cm47CQkJLyogV2UndmUgYmVlbiBpbnN0YWxsZWQgbm9ybWFsbHkuICAqLwotCi0gIC8qIExvb2sgZm9yICJsZHNjcmlwdHMiIGluIHRoZSBkaXIgd2hlcmUgb3VyIGJpbmFyeSBpcy4gICovCi0gIGVuZCA9IHN0cnJjaHIgKHByb2dyYW1fbmFtZSwgJy8nKTsKLQotICBpZiAoZW5kID09IE5VTEwpCi0gICAgewotICAgICAgLyogRG9uJ3QgbG9vayBmb3IgbGRzY3JpcHRzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFRoZXJlIGlzCi0gICAgICAgICB0b28gbXVjaCBwb3RlbnRpYWwgZm9yIGNvbmZ1c2lvbi4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRpcmxlbiA9IGVuZCAtIHByb2dyYW1fbmFtZTsKLSAgLyogTWFrZSBhIGNvcHkgb2YgcHJvZ3JhbV9uYW1lIGluIGRpci4KLSAgICAgTGVhdmUgcm9vbSBmb3IgbGF0ZXIgIi8uLi9saWIiLiAgKi8KLSAgZGlyID0gKGNoYXIgKikgeG1hbGxvYyAoZGlybGVuICsgOCk7Ci0gIHN0cm5jcHkgKGRpciwgcHJvZ3JhbV9uYW1lLCBkaXJsZW4pOwotICBkaXJbZGlybGVuXSA9ICdcMCc7Ci0KLSAgaWYgKGNoZWNrX2Zvcl9zY3JpcHRzX2RpciAoZGlyKSkKLSAgICByZXR1cm47CQkJLyogRG9uJ3QgZnJlZSBkaXIuICAqLwotCi0gIC8qIExvb2sgZm9yICJsZHNjcmlwdHMiIGluIDx0aGUgZGlyIHdoZXJlIG91ciBiaW5hcnkgaXM+Ly4uL2xpYi4gICovCi0gIHN0cmNweSAoZGlyICsgZGlybGVuLCAiLy4uL2xpYiIpOwotICBpZiAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChkaXIpKQotICAgIHJldHVybjsKLQotICBmcmVlIChkaXIpOwkJCS8qIFdlbGwsIHdlIHRyaWVkLiAgKi8KLX0KLQotdm9pZAotYWRkX3lzeW0gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChsaW5rX2luZm8ubm90aWNlX2hhc2ggPT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmtfaW5mby5ub3RpY2VfaGFzaCA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKGxpbmtfaW5mby5ub3RpY2VfaGFzaCwKLQkJCQkgICBiZmRfaGFzaF9uZXdmdW5jLAotCQkJCSAgIDYxKSkKLQllaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfSAgICAgIAotCi0gIGlmIChiZmRfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5ub3RpY2VfaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSkKLSAgICAgID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLX0KLQotLyogUmVjb3JkIGEgc3ltYm9sIHRvIGJlIHdyYXBwZWQsIGZyb20gdGhlIC0td3JhcCBvcHRpb24uICAqLwotCi12b2lkCi1hZGRfd3JhcCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGxpbmtfaW5mby53cmFwX2hhc2ggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsaW5rX2luZm8ud3JhcF9oYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKLQkJCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKGxpbmtfaW5mby53cmFwX2hhc2gsCi0JCQkJICAgYmZkX2hhc2hfbmV3ZnVuYywKLQkJCQkgICA2MSkpCi0JZWluZm8gKF8oIiVQJUY6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLSAgaWYgKGJmZF9oYXNoX2xvb2t1cCAobGlua19pbmZvLndyYXBfaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSkgPT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLX0KLQotLyogSGFuZGxlIHRoZSAtcmV0YWluLXN5bWJvbHMtZmlsZSBvcHRpb24uICAqLwotCi12b2lkCi1hZGRfa2VlcHN5bXNfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICpmaWxlOwotICBjaGFyICpidWY7Ci0gIHNpemVfdCBidWZzaXplOwotICBpbnQgYzsKLQotICBpZiAobGlua19pbmZvLnN0cmlwID09IHN0cmlwX3NvbWUpCi0gICAgZWluZm8gKF8oIiVYJVA6IGVycm9yOiBkdXBsaWNhdGUgcmV0YWluLXN5bWJvbHMtZmlsZVxuIikpOwotCi0gIGZpbGUgPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0gIGlmIChmaWxlID09IChGSUxFICopIE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGVpbmZvICgiJVglUDogJXM6ICVFXG4iLCBmaWxlbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxpbmtfaW5mby5rZWVwX2hhc2ggPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkJIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0IChsaW5rX2luZm8ua2VlcF9oYXNoLCBiZmRfaGFzaF9uZXdmdW5jKSkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgYnVmc2l6ZSA9IDEwMDsKLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmc2l6ZSk7Ci0KLSAgYyA9IGdldGMgKGZpbGUpOwotICB3aGlsZSAoYyAhPSBFT0YpCi0gICAgewotICAgICAgd2hpbGUgKGlzc3BhY2UgKGMpKQotCWMgPSBnZXRjIChmaWxlKTsKLQotICAgICAgaWYgKGMgIT0gRU9GKQotCXsKLQkgIHNpemVfdCBsZW4gPSAwOwotCi0JICB3aGlsZSAoISBpc3NwYWNlIChjKSAmJiBjICE9IEVPRikKLQkgICAgewotCSAgICAgIGJ1ZltsZW5dID0gYzsKLQkgICAgICArK2xlbjsKLQkgICAgICBpZiAobGVuID49IGJ1ZnNpemUpCi0JCXsKLQkJICBidWZzaXplICo9IDI7Ci0JCSAgYnVmID0geHJlYWxsb2MgKGJ1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkgICAgICBjID0gZ2V0YyAoZmlsZSk7Ci0JICAgIH0KLQotCSAgYnVmW2xlbl0gPSAnXDAnOwotCi0JICBpZiAoYmZkX2hhc2hfbG9va3VwIChsaW5rX2luZm8ua2VlcF9oYXNoLCBidWYsIHRydWUsIHRydWUpCi0JICAgICAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZvciBpbnNlcnRpb24gZmFpbGVkOiAlRVxuIikpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxpbmtfaW5mby5zdHJpcCAhPSBzdHJpcF9ub25lKQotICAgIGVpbmZvIChfKCIlUDogYC1yZXRhaW4tc3ltYm9scy1maWxlJyBvdmVycmlkZXMgYC1zJyBhbmQgYC1TJ1xuIikpOwotCi0gIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX3NvbWU7Ci19Ci0MCi0vKiBDYWxsYmFja3MgZnJvbSB0aGUgQkZEIGxpbmtlciByb3V0aW5lcy4gICovCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkZWNpZGVkIHRvIGluY2x1ZGUgYW4gYXJjaGl2ZSBtZW1iZXIgaW4KLSAgIGEgbGluay4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWFkZF9hcmNoaXZlX2VsZW1lbnQgKGluZm8sIGFiZmQsIG5hbWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wdXQ7Ci0KLSAgaW5wdXQgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKLQkgICB4bWFsbG9jIChzaXplb2YgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpKSk7Ci0gIGlucHV0LT5maWxlbmFtZSA9IGFiZmQtPmZpbGVuYW1lOwotICBpbnB1dC0+bG9jYWxfc3ltX25hbWUgPSBhYmZkLT5maWxlbmFtZTsKLSAgaW5wdXQtPnRoZV9iZmQgPSBhYmZkOwotICBpbnB1dC0+YXN5bWJvbHMgPSBOVUxMOwotICBpbnB1dC0+bmV4dCA9IE5VTEw7Ci0gIGlucHV0LT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICBpbnB1dC0+bG9hZGVkID0gZmFsc2U7Ci0gIGlucHV0LT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0KLSAgLyogRklYTUU6IFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3Qgc2V0OiBoZWFkZXIubmV4dCwKLSAgICAgaGVhZGVyLnR5cGUsIGNsb3NlZCwgcGFzc2l2ZV9wb3NpdGlvbiwgc3ltYm9sX2NvdW50LAotICAgICBuZXh0X3JlYWxfZmlsZSwgaXNfYXJjaGl2ZSwgdGFyZ2V0LCByZWFsLiAgVGhpcyBiaXQgb2YgY29kZSBpcwotICAgICBmcm9tIHRoZSBvbGQgZGVjb2RlX2xpYnJhcnlfc3ViZmlsZSBmdW5jdGlvbi4gIEkgZG9uJ3Qga25vdwotICAgICB3aGV0aGVyIGFueSBvZiB0aG9zZSBmaWVsZHMgbWF0dGVycy4gICovCi0KLSAgbGRsYW5nX2FkZF9maWxlIChpbnB1dCk7Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSAoRklMRSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBib29sZWFuIGhlYWRlcl9wcmludGVkOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmQgKmZyb207Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCWZyb20gPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoaC0+dHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGZyb20gPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICBmcm9tID0gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkgICAgICBmcm9tID0gaC0+dS51bmRlZi5hYmZkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgZnJvbSA9IGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCi0JewotCSAgY2hhciBidWZbMTAwXTsKLQotCSAgc3ByaW50ZiAoYnVmLCAiJS0yOXMgJXNcblxuIiwgXygiQXJjaGl2ZSBtZW1iZXIgaW5jbHVkZWQiKSwKLQkJICAgXygiYmVjYXVzZSBvZiBmaWxlIChzeW1ib2wpIikpOwotCSAgbWluZm8gKCIlcyIsIGJ1Zik7Ci0JICBoZWFkZXJfcHJpbnRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBpZiAoYmZkX215X2FyY2hpdmUgKGFiZmQpID09IE5VTEwpCi0JewotCSAgbWluZm8gKCIlcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGxlbiA9IHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW5mbyAoIiVzKCVzKSIsIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBsZW4gPSAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKQotCQkgKyBzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCQkgKyAyKTsKLQl9Ci0KLSAgICAgIGlmIChsZW4gPj0gMjkpCi0JewotCSAgcHJpbnRfbmwgKCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIHdoaWxlIChsZW4gPCAzMCkKLQl7Ci0JICBwcmludF9zcGFjZSAoKTsKLQkgICsrbGVuOwotCX0KLQotICAgICAgaWYgKGZyb20gIT0gTlVMTCkKLQltaW5mbyAoIiVCICIsIGZyb20pOwotICAgICAgaWYgKGggIT0gTlVMTCkKLQltaW5mbyAoIiglVClcbiIsIGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIGVsc2UKLQltaW5mbyAoIiglcylcbiIsIG5hbWUpOwotICAgIH0KLQotICBpZiAodHJhY2VfZmlsZXMgfHwgdHJhY2VfZmlsZV90cmllcykKLSAgICBpbmZvX21zZyAoIiVJXG4iLCBpbnB1dCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkaXNjb3ZlcmVkIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQKLSAgIG11bHRpcGxlIHRpbWVzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbXVsdGlwbGVfZGVmaW5pdGlvbiAoaW5mbywgbmFtZSwgb2JmZCwgb3NlYywgb3ZhbCwgbmJmZCwgbnNlYywgbnZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYzsKLSAgICAgYmZkX3ZtYSBvdmFsOwotICAgICBiZmQgKm5iZmQ7Ci0gICAgIGFzZWN0aW9uICpuc2VjOwotICAgICBiZmRfdm1hIG52YWw7Ci17Ci0gIC8qIElmIGVpdGhlciBzZWN0aW9uIGhhcyB0aGUgb3V0cHV0X3NlY3Rpb24gZmllbGQgc2V0IHRvCi0gICAgIGJmZF9hYnNfc2VjdGlvbl9wdHIsIGl0IG1lYW5zIHRoYXQgdGhlIHNlY3Rpb24gaXMgYmVpbmcKLSAgICAgZGlzY2FyZGVkLCBhbmQgdGhpcyBpcyBub3QgcmVhbGx5IGEgbXVsdGlwbGUgZGVmaW5pdGlvbiBhdCBhbGwuCi0gICAgIEZJWE1FOiBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvIHNvbWVob3cgaWdub3JlIHN5bWJvbHMgZGVmaW5lZCBpbgotICAgICBzZWN0aW9ucyB3aGljaCBhcmUgYmVpbmcgZGlzY2FyZGVkLiAgKi8KLSAgaWYgKChvc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKG9zZWMpCi0gICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChvc2VjLT5vdXRwdXRfc2VjdGlvbikpCi0gICAgICB8fCAobnNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotCSAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKG5zZWMpCi0JICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKG5zZWMtPm91dHB1dF9zZWN0aW9uKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZWluZm8gKF8oIiVYJUM6IG11bHRpcGxlIGRlZmluaXRpb24gb2YgYCVUJ1xuIiksCi0JIG5iZmQsIG5zZWMsIG52YWwsIG5hbWUpOwotICBpZiAob2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVEOiBmaXJzdCBkZWZpbmVkIGhlcmVcbiIpLCBvYmZkLCBvc2VjLCBvdmFsKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBkZWZpbml0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCwgb3IKLSAgIHdoZW4gYSBjb21tb24gc3ltYm9sIGlzIGZvdW5kIGZvciBhIHN5bWJvbCB0aGF0IGlzIGFscmVhZHkgZGVmaW5lZCwKLSAgIG9yIHdoZW4gdHdvIGNvbW1vbiBzeW1ib2xzIGFyZSBmb3VuZC4gIFdlIG9ubHkgZG8gc29tZXRoaW5nIGlmCi0gICAtd2Fybi1jb21tb24gd2FzIHVzZWQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1tdWx0aXBsZV9jb21tb24gKGluZm8sIG5hbWUsIG9iZmQsIG90eXBlLCBvc2l6ZSwgbmJmZCwgbnR5cGUsIG5zaXplKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG90eXBlOwotICAgICBiZmRfdm1hIG9zaXplOwotICAgICBiZmQgKm5iZmQ7Ci0gICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG50eXBlOwotICAgICBiZmRfdm1hIG5zaXplOwotewotICBpZiAoISBjb25maWcud2Fybl9jb21tb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKG50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgfHwgbnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICB8fCBudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHsKLSAgICAgIEFTU0VSVCAob3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotICAgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBjb21tb25cbiIpLAotCSAgICAgbmJmZCwgbmFtZSk7Ci0gICAgICBpZiAob2JmZCAhPSBOVUxMKQotCWVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG90eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IG90eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCSAgIHx8IG90eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgewotICAgICAgQVNTRVJUIChudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0gICAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRkZW4gYnkgZGVmaW5pdGlvblxuIiksCi0JICAgICBuYmZkLCBuYW1lKTsKLSAgICAgIGlmIChvYmZkICE9IE5VTEwpCi0JZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBkZWZpbmVkIGhlcmVcbiIpLCBvYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBBU1NFUlQgKG90eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uICYmIG50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLSAgICAgIGlmIChvc2l6ZSA+IG5zaXplKQotCXsKLQkgIGVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBsYXJnZXIgY29tbW9uXG4iKSwKLQkJIG5iZmQsIG5hbWUpOwotCSAgaWYgKG9iZmQgIT0gTlVMTCkKLQkgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBsYXJnZXIgY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKLQl9Ci0gICAgICBlbHNlIGlmIChuc2l6ZSA+IG9zaXplKQotCXsKLQkgIGVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBzbWFsbGVyIGNvbW1vblxuIiksCi0JCSBuYmZkLCBuYW1lKTsKLQkgIGlmIChvYmZkICE9IE5VTEwpCi0JICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogc21hbGxlciBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IG11bHRpcGxlIGNvbW1vbiBvZiBgJVQnXG4iKSwgbmJmZCwgbmFtZSk7Ci0JICBpZiAob2JmZCAhPSBOVUxMKQotCSAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IHByZXZpb3VzIGNvbW1vbiBpcyBoZXJlXG4iKSwgb2JmZCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRpc2NvdmVyZWQgYSBzZXQgZWxlbWVudC4gIEggaXMgdGhlCi0gICBlbnRyeSBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUgZm9yIHRoZSBzZXQuICBTRUNUSU9OIGFuZCBWQUxVRQotICAgcmVwcmVzZW50IGEgdmFsdWUgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1hZGRfdG9fc2V0IChpbmZvLCBoLCByZWxvYywgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGlmIChjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMpCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBnbG9iYWwgY29uc3RydWN0b3IgJXMgdXNlZFxuIiksCi0JICAgaC0+cm9vdC5zdHJpbmcpOwotCi0gIGlmICghIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIHJlbG9jLCAoY29uc3QgY2hhciAqKSBOVUxMLCBzZWN0aW9uLCB2YWx1ZSk7Ci0KLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgewotICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotICAgICAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLSAgICAgIC8qIFdlIGRvbid0IGNhbGwgYmZkX2xpbmtfYWRkX3VuZGVmIHRvIGFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mCi0JIHVuZGVmaW5lZCBzeW1ib2xzIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGRlZmluZSBpdAotCSBvdXJzZWx2ZXMuICAqLwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRpc2NvdmVyZWQgYSBjb25zdHJ1Y3Rvci4gIFRoaXMgaXMgb25seQotICAgY2FsbGVkIGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMtLXRob3NlIHdoaWNoIGRvIG5vdCBoYW5kbGUKLSAgIGNvbnN0cnVjdG9ycyBpbiBzb21lIG1vcmUgY2xldmVyIGZhc2hpb24uICBUaGlzIGlzIHNpbWlsYXIgdG8KLSAgIGFkZGluZyBhbiBlbGVtZW50IHRvIGEgc2V0LCBidXQgbGVzcyBnZW5lcmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvbnN0cnVjdG9yX2NhbGxiYWNrIChpbmZvLCBjb25zdHJ1Y3RvciwgbmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuIGNvbnN0cnVjdG9yOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBjaGFyICpzOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgY2hhciBzZXRfbmFtZVsxICsgc2l6ZW9mICJfX0NUT1JfTElTVF9fIl07Ci0KLSAgaWYgKGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycykKLSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGdsb2JhbCBjb25zdHJ1Y3RvciAlcyB1c2VkXG4iKSwgbmFtZSk7Ci0KLSAgaWYgKCEgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBFbnN1cmUgdGhhdCBCRkRfUkVMT0NfQ1RPUiBleGlzdHMgbm93LCBzbyB0aGF0IHdlIGNhbiBnaXZlIGEKLSAgICAgdXNlZnVsIGVycm9yIG1lc3NhZ2UuICAqLwotICBpZiAoYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBCRkRfUkVMT0NfQ1RPUikgPT0gTlVMTAotICAgICAgJiYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLQkgIHx8IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX0NUT1IpID09IE5VTEwpKQotICAgIGVpbmZvIChfKCIlUCVGOiBCRkQgYmFja2VuZCBlcnJvcjogQkZEX1JFTE9DX0NUT1IgdW5zdXBwb3J0ZWRcbiIpKTsKLQotICBzID0gc2V0X25hbWU7Ci0gIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpICE9ICdcMCcpCi0gICAgKnMrKyA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0gIGlmIChjb25zdHJ1Y3RvcikKLSAgICBzdHJjcHkgKHMsICJfX0NUT1JfTElTVF9fIik7Ci0gIGVsc2UKLSAgICBzdHJjcHkgKHMsICJfX0RUT1JfTElTVF9fIik7Ci0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBzZXRfbmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIHsKLSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0gICAgICAvKiBXZSBkb24ndCBjYWxsIGJmZF9saW5rX2FkZF91bmRlZiB0byBhZGQgdGhpcyB0byB0aGUgbGlzdCBvZgotCSB1bmRlZmluZWQgc3ltYm9scyBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBkZWZpbmUgaXQKLQkgb3Vyc2VsdmVzLiAgKi8KLSAgICB9Ci0KLSAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIEJGRF9SRUxPQ19DVE9SLCBuYW1lLCBzZWN0aW9uLCB2YWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIHN0cnVjdHVyZSB1c2VkIGJ5IHdhcm5pbmdfY2FsbGJhY2sgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdoCi0gICBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvCi17Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKndhcm5pbmc7Ci0gIGNvbnN0IGNoYXIgKnN5bWJvbDsKLSAgYXN5bWJvbCAqKmFzeW1ib2xzOwotfTsKLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBhIHdhcm5pbmcgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotd2FybmluZ19jYWxsYmFjayAoaW5mbywgd2FybmluZywgc3ltYm9sLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICp3YXJuaW5nOwotICAgICBjb25zdCBjaGFyICpzeW1ib2w7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgLyogVGhpcyBpcyBhIGhhY2sgdG8gc3VwcG9ydCB3YXJuX211bHRpcGxlX2dwLiAgRklYTUU6IFRoaXMgc2hvdWxkCi0gICAgIGhhdmUgYSBjbGVhbmVyIGludGVyZmFjZSwgYnV0IHdoYXQ/ICAqLwotICBpZiAoISBjb25maWcud2Fybl9tdWx0aXBsZV9ncAotICAgICAgJiYgc3RyY21wICh3YXJuaW5nLCAidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotICAgIGVpbmZvICgiJUM6ICVzXG4iLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzLCB3YXJuaW5nKTsKLSAgZWxzZSBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGVpbmZvICgiJVA6ICVzXG4iLCB3YXJuaW5nKTsKLSAgZWxzZSBpZiAoc3ltYm9sID09IE5VTEwpCi0gICAgZWluZm8gKCIlQjogJXNcbiIsIGFiZmQsIHdhcm5pbmcpOwotICBlbHNlCi0gICAgewotICAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci0gICAgICBhc3ltYm9sICoqYXN5bWJvbHM7Ci0gICAgICBzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvIGluZm87Ci0KLSAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIHBsYXVzaWJsZQotCSBhZGRyZXNzLiAgKi8KLQotICAgICAgZW50cnkgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBhYmZkLT51c3JkYXRhOwotICAgICAgaWYgKGVudHJ5ICE9IE5VTEwgJiYgZW50cnktPmFzeW1ib2xzICE9IE5VTEwpCi0JYXN5bWJvbHMgPSBlbnRyeS0+YXN5bWJvbHM7Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBzeW1zaXplOwotCSAgbG9uZyBzeW1ib2xfY291bnQ7Ci0KLQkgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0JICBpZiAoc3ltc2l6ZSA8IDApCi0JICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIGFiZmQpOwotCSAgYXN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JICBzeW1ib2xfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgYXN5bWJvbHMpOwotCSAgaWYgKHN5bWJvbF9jb3VudCA8IDApCi0JICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIGFiZmQpOwotCSAgaWYgKGVudHJ5ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBlbnRyeS0+YXN5bWJvbHMgPSBhc3ltYm9sczsKLQkgICAgICBlbnRyeS0+c3ltYm9sX2NvdW50ID0gc3ltYm9sX2NvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICBpbmZvLmZvdW5kID0gZmFsc2U7Ci0gICAgICBpbmZvLndhcm5pbmcgPSB3YXJuaW5nOwotICAgICAgaW5mby5zeW1ib2wgPSBzeW1ib2w7Ci0gICAgICBpbmZvLmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIHdhcm5pbmdfZmluZF9yZWxvYywgKFBUUikgJmluZm8pOwotCi0gICAgICBpZiAoISBpbmZvLmZvdW5kKQotCWVpbmZvICgiJUI6ICVzXG4iLCBhYmZkLCB3YXJuaW5nKTsKLQotICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCi0JZnJlZSAoYXN5bWJvbHMpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgd2FybmluZ19jYWxsYmFjayBmb3IgZWFjaCBzZWN0aW9uLiAgSXQgY2hlY2tzIHRoZQotICAgcmVsb2NzIG9mIHRoZSBzZWN0aW9uIHRvIHNlZSBpZiBpdCBjYW4gZmluZCBhIHJlZmVyZW5jZSB0byB0aGUKLSAgIHN5bWJvbCB3aGljaCB0cmlnZ2VyZWQgdGhlIHdhcm5pbmcuICBJZiBpdCBjYW4sIGl0IHVzZXMgdGhlIHJlbG9jCi0gICB0byBnaXZlIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBhIGZpbGUgYW5kIGxpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXdhcm5pbmdfZmluZF9yZWxvYyAoYWJmZCwgc2VjLCBpYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBpYXJnOwotewotICBzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvICppbmZvID0gKHN0cnVjdCB3YXJuaW5nX2NhbGxiYWNrX2luZm8gKikgaWFyZzsKLSAgbG9uZyByZWxzaXplOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIGFyZWxlbnQgKipwLCAqKnBlbmQ7Ci0KLSAgaWYgKGluZm8tPmZvdW5kKQotICAgIHJldHVybjsKLQotICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjKTsKLSAgaWYgKHJlbHNpemUgPCAwKQotICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCByZWxvY3M6ICVFXG4iKSwgYWJmZCk7Ci0gIGlmIChyZWxzaXplID09IDApCi0gICAgcmV0dXJuOwotCi0gIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlYywgcmVscHAsIGluZm8tPmFzeW1ib2xzKTsKLSAgaWYgKHJlbGNvdW50IDwgMCkKLSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOwotCi0gIHAgPSByZWxwcDsKLSAgcGVuZCA9IHAgKyByZWxjb3VudDsKLSAgZm9yICg7IHAgPCBwZW5kICYmICpwICE9IE5VTEw7IHArKykKLSAgICB7Ci0gICAgICBhcmVsZW50ICpxID0gKnA7Ci0KLSAgICAgIGlmIChxLT5zeW1fcHRyX3B0ciAhPSBOVUxMCi0JICAmJiAqcS0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCSAgJiYgc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpLCBpbmZvLT5zeW1ib2wpID09IDApCi0JewotCSAgLyogV2UgZm91bmQgYSByZWxvYyBmb3IgdGhlIHN5bWJvbCB3ZSBhcmUgbG9va2luZyBmb3IuICAqLwotCSAgZWluZm8gKCIlQzogJXNcbiIsIGFiZmQsIHNlYywgcS0+YWRkcmVzcywgaW5mby0+d2FybmluZyk7Ci0JICBpbmZvLT5mb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHJlbHBwKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiB1bmRlZmluZWQgc3ltYm9sIGlzIGZvdW5kLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotdW5kZWZpbmVkX3N5bWJvbCAoaW5mbywgbmFtZSwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcywgZmF0YWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgYm9vbGVhbiBmYXRhbDsKLXsKLSAgc3RhdGljIGNoYXIgKmVycm9yX25hbWU7Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXJyb3JfY291bnQ7Ci0KLSNkZWZpbmUgTUFYX0VSUk9SU19JTl9BX1JPVyA1Ci0KLSAgaWYgKGNvbmZpZy53YXJuX29uY2UpCi0gICAgewotICAgICAgc3RhdGljIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqaGFzaDsKLQotICAgICAgLyogT25seSB3YXJuIG9uY2UgYWJvdXQgYSBwYXJ0aWN1bGFyIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCi0gICAgICBpZiAoaGFzaCA9PSBOVUxMKQotCXsKLQkgIGhhc2ggPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotCSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoaGFzaCwgYmZkX2hhc2hfbmV3ZnVuYykpCi0JICAgIGVpbmZvIChfKCIlRiVQOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIpKTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkgIT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgaWYgKGJmZF9oYXNoX2xvb2t1cCAoaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSkgPT0gTlVMTCkKLQllaW5mbyAoXygiJUYlUDogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci0KLSAgLyogV2UgbmV2ZXIgcHJpbnQgbW9yZSB0aGFuIGEgcmVhc29uYWJsZSBudW1iZXIgb2YgZXJyb3JzIGluIGEgcm93Ci0gICAgIGZvciBhIHNpbmdsZSBzeW1ib2wuICAqLwotICBpZiAoZXJyb3JfbmFtZSAhPSAoY2hhciAqKSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG5hbWUsIGVycm9yX25hbWUpID09IDApCi0gICAgKytlcnJvcl9jb3VudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yX2NvdW50ID0gMDsKLSAgICAgIGlmIChlcnJvcl9uYW1lICE9IChjaGFyICopIE5VTEwpCi0JZnJlZSAoZXJyb3JfbmFtZSk7Ci0gICAgICBlcnJvcl9uYW1lID0gYnV5c3RyaW5nIChuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfY291bnQgPCBNQVhfRVJST1JTX0lOX0FfUk9XKQotCXsKLQkgIGVpbmZvIChfKCIlQzogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iKSwKLQkJIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MsIG5hbWUpOwotCSAgaWYgKGZhdGFsKQotCSAgICBlaW5mbyAoIiVYIik7Ci0JfQotICAgICAgZWxzZSBpZiAoZXJyb3JfY291bnQgPT0gTUFYX0VSUk9SU19JTl9BX1JPVykKLQllaW5mbyAoXygiJUQ6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIpLAotCSAgICAgICBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfY291bnQgPCBNQVhfRVJST1JTX0lOX0FfUk9XKQotCXsKLQkgIGVpbmZvIChfKCIlQjogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iKSwKLQkJIGFiZmQsIG5hbWUpOwotCSAgaWYgKGZhdGFsKQotCSAgICBlaW5mbyAoIiVYIik7Ci0JfQotICAgICAgZWxzZSBpZiAoZXJyb3JfY291bnQgPT0gTUFYX0VSUk9SU19JTl9BX1JPVykKLQllaW5mbyAoXygiJUI6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIpLAotCSAgICAgICBhYmZkLCBuYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBvdmVyZmxvd3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1yZWxvY19vdmVyZmxvdyAoaW5mbywgbmFtZSwgcmVsb2NfbmFtZSwgYWRkZW5kLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpyZWxvY19uYW1lOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBpZiAoYWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJVg6IGdlbmVyYXRlZCIpKTsKLSAgZWxzZQotICAgIGVpbmZvICgiJVglQzoiLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKTsKLSAgZWluZm8gKF8oIiByZWxvY2F0aW9uIHRydW5jYXRlZCB0byBmaXQ6ICVzICVUIiksIHJlbG9jX25hbWUsIG5hbWUpOwotICBpZiAoYWRkZW5kICE9IDApCi0gICAgZWluZm8gKCIrJXYiLCBhZGRlbmQpOwotICBlaW5mbyAoIlxuIik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgZGFuZ2Vyb3VzIHJlbG9jYXRpb24gaXMgbWFkZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXJlbG9jX2Rhbmdlcm91cyAoaW5mbywgbWVzc2FnZSwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBpZiAoYWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJVg6IGdlbmVyYXRlZCIpKTsKLSAgZWxzZQotICAgIGVpbmZvICgiJVglQzoiLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKTsKLSAgZWluZm8gKF8oImRhbmdlcm91cyByZWxvY2F0aW9uOiAlc1xuIiksIG1lc3NhZ2UpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jIGlzIGJlaW5nIGdlbmVyYXRlZCBhdHRhY2hlZCB0byBhIHN5bWJvbAotICAgdGhhdCBpcyBub3QgYmVpbmcgb3V0cHV0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotdW5hdHRhY2hlZF9yZWxvYyAoaW5mbywgbmFtZSwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBpZiAoYWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJVg6IGdlbmVyYXRlZCIpKTsKLSAgZWxzZQotICAgIGVpbmZvICgiJVglQzoiLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKTsKLSAgZWluZm8gKF8oIiByZWxvYyByZWZlcnMgdG8gc3ltYm9sIGAlVCcgd2hpY2ggaXMgbm90IGJlaW5nIG91dHB1dFxuIiksIG5hbWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgaWYgbGlua19pbmZvLm5vdGljZV9hbGwgaXMgc2V0LCBvciB3aGVuIGEgc3ltYm9sIGluCi0gICBsaW5rX2luZm8ubm90aWNlX2hhc2ggaXMgZm91bmQuICBTeW1ib2xzIGFyZSBwdXQgaW4gbm90aWNlX2hhc2gKLSAgIHVzaW5nIHRoZSAteSBvcHRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbm90aWNlIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGlmICghIGluZm8tPm5vdGljZV9hbGwKLSAgICAgIHx8IChpbmZvLT5ub3RpY2VfaGFzaCAhPSBOVUxMCi0JICAmJiBiZmRfaGFzaF9sb29rdXAgKGluZm8tPm5vdGljZV9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpKQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotCWVpbmZvICgiJUI6IHJlZmVyZW5jZSB0byAlc1xuIiwgYWJmZCwgbmFtZSk7Ci0gICAgICBlbHNlCi0JZWluZm8gKCIlQjogZGVmaW5pdGlvbiBvZiAlc1xuIiwgYWJmZCwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChjb21tYW5kX2xpbmUuY3JlZiB8fCBub2Nyb3NzcmVmX2xpc3QgIT0gTlVMTCkKLSAgICBhZGRfY3JlZiAobmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRtYWluLmggYi9sZC9sZG1haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxYmYzZC4uMDAwMDAwMAotLS0gYS9sZC9sZG1haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIGxkbWFpbi5oIC0KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERNQUlOX0gKLSNkZWZpbmUgTERNQUlOX0gKLQotZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKLWV4dGVybiBiZmQgKm91dHB1dF9iZmQ7Ci1leHRlcm4gY2hhciAqZGVmYXVsdF90YXJnZXQ7Ci1leHRlcm4gYm9vbGVhbiB0cmFjZV9maWxlczsKLWV4dGVybiBib29sZWFuIHRyYWNlX2ZpbGVfdHJpZXM7Ci1leHRlcm4gYm9vbGVhbiB2ZXJzaW9uX3ByaW50ZWQ7Ci1leHRlcm4gYm9vbGVhbiB3aG9sZV9hcmNoaXZlOwotZXh0ZXJuIGJvb2xlYW4gZGVtYW5nbGluZzsKLWV4dGVybiBpbnQgZ19zd2l0Y2hfdmFsdWU7Ci1leHRlcm4gY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19pbmZvIGxpbmtfaW5mbzsKLQotZXh0ZXJuIHZvaWQgYWRkX3lzeW0gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBhZGRfd3JhcCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGFkZF9rZWVwc3ltc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRtaXNjLmMgYi9sZC9sZG1pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0Mzk0NC4uMDAwMDAwMAotLS0gYS9sZC9sZG1pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKiBsZG1pc2MuYwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNkZWZpbmUgVVNFX1NUREFSRyAxCi0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNkZWZpbmUgVVNFX1NUREFSRyAwCi0jZW5kaWYKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotCi1zdGF0aWMgdm9pZCB2ZmluZm8gUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLQotLyoKLSAlJSBsaXRlcmFsICUKLSAlRiBlcnJvciBpcyBmYXRhbAotICVQIHByaW50IHByb2dyYW0gbmFtZQotICVTIHByaW50IHNjcmlwdCBmaWxlIGFuZCBsaW5lbnVtYmVyCi0gJUUgY3VycmVudCBiZmQgZXJyb3Igb3IgZXJybm8KLSAlSSBmaWxlbmFtZSBmcm9tIGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZQotICVCIGZpbGVuYW1lIGZyb20gYSBiZmQKLSAlVCBzeW1ib2wgbmFtZQotICVYIG5vIG9iamVjdCBvdXRwdXQsIGZhaWwgcmV0dXJuCi0gJVYgaGV4IGJmZF92bWEKLSAldiBoZXggYmZkX3ZtYSwgbm8gbGVhZGluZyB6ZXJvcwotICVXIGhleCBiZmRfdm1hIHdpdGggMHggd2l0aCBubyBsZWFkaW5nIHplcm9zIHRha2luZyB1cCA4IHNwYWNlcwotICVDIGNsZXZlciBmaWxlbmFtZTpsaW5lbnVtYmVyIHdpdGggZnVuY3Rpb24KLSAlRCBsaWtlICVDLCBidXQgbm8gZnVuY3Rpb24gbmFtZQotICVHIGxpa2UgJUQsIGJ1dCBvbmx5IGZ1bmN0aW9uIG5hbWUKLSAlUiBpbmZvIGFib3V0IGEgcmVsZW50Ci0gJXMgYXJiaXRyYXJ5IHN0cmluZywgbGlrZSBwcmludGYKLSAlZCBpbnRlZ2VyLCBsaWtlIHByaW50ZgotICV1IGludGVnZXIsIGxpa2UgcHJpbnRmCi0qLwotCi1jaGFyICoKLWRlbWFuZ2xlIChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgY2hhciAqcmVzOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwKLSAgICAgICYmIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob3V0cHV0X2JmZCkgPT0gc3RyaW5nWzBdKQotICAgICsrc3RyaW5nOwotCi0gIC8qIFRoaXMgaXMgYSBoYWNrIGZvciBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIG9uIFhDT0ZGLCBvciB0aGUgTVMgUEUgICAqLwotICAvKiBmb3JtYXQuICBYY29mZiBoYXMgYSBzaW5nbGUgJy4nLCB3aGlsZSB0aGUgTlQgUEUgZm9yIFBQQyBoYXMgJy4uJy4gKi8KLSAgLyogU28gd2UgcmVtb3ZlIGFsbCBvZiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHdoaWxlKHN0cmluZ1swXSA9PSAnLicpCi0gICAgKytzdHJpbmc7Ci0KLSAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKHN0cmluZywgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotICByZXR1cm4gcmVzID8gcmVzIDogeHN0cmR1cCAoc3RyaW5nKTsKLX0KLQotc3RhdGljIHZvaWQKLXZmaW5mbyAoZnAsIGZtdCwgYXJnKQotICAgICBGSUxFICpmcDsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9saXN0IGFyZzsKLXsKLSAgYm9vbGVhbiBmYXRhbCA9IGZhbHNlOwotCi0gIHdoaWxlICgqZm10ICE9ICdcMCcpCi0gICAgewotICAgICAgd2hpbGUgKCpmbXQgIT0gJyUnICYmICpmbXQgIT0gJ1wwJykgCi0JewotCSAgcHV0YyAoKmZtdCwgZnApOwotCSAgZm10Kys7Ci0JfQotCi0gICAgICBpZiAoKmZtdCA9PSAnJScpIAotCXsKLQkgIGZtdCArKzsKLQkgIHN3aXRjaCAoKmZtdCsrKSAKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKGZwLCIlJSVjIiwgZm10Wy0xXSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnJSc6Ci0JICAgICAgLyogbGl0ZXJhbCAlICovCi0JICAgICAgcHV0YyAoJyUnLCBmcCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnWCc6Ci0JICAgICAgLyogbm8gb2JqZWN0IG91dHB1dCwgZmFpbCByZXR1cm4gKi8KLQkgICAgICBjb25maWcubWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVic6Ci0JICAgICAgLyogaGV4IGJmZF92bWEgKi8KLQkgICAgICB7Ci0JCWJmZF92bWEgdmFsdWUgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7Ci0JCWZwcmludGZfdm1hIChmcCwgdmFsdWUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd2JzoKLQkgICAgICAvKiBoZXggYmZkX3ZtYSwgbm8gbGVhZGluZyB6ZXJvcyAqLwotCSAgICAgIHsKLQkJY2hhciBidWZbMTAwXTsKLQkJY2hhciAqcCA9IGJ1ZjsKLQkJYmZkX3ZtYSB2YWx1ZSA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQkJc3ByaW50Zl92bWEgKHAsIHZhbHVlKTsKLQkJd2hpbGUgKCpwID09ICcwJykKLQkJICBwKys7Ci0JCWlmICghKnApCi0JCSAgcC0tOwotCQlmcHV0cyAocCwgZnApOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdXJzoKLQkgICAgICAvKiBoZXggYmZkX3ZtYSB3aXRoIDB4IHdpdGggbm8gbGVhZGluZyB6ZXJvZXMgdGFraW5nIHVwCi0gICAgICAgICAgICAgICAgIDggc3BhY2VzLiAgKi8KLQkgICAgICB7Ci0JCWNoYXIgYnVmWzEwMF07Ci0JCWJmZF92bWEgdmFsdWU7Ci0JCWNoYXIgKnA7Ci0JCWludCBsZW47Ci0KLQkJdmFsdWUgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7Ci0JCXNwcmludGZfdm1hIChidWYsIHZhbHVlKTsKLQkJZm9yIChwID0gYnVmOyAqcCA9PSAnMCc7ICsrcCkKLQkJICA7Ci0JCWlmICgqcCA9PSAnXDAnKQotCQkgIC0tcDsKLQkJbGVuID0gc3RybGVuIChwKTsKLQkJd2hpbGUgKGxlbiA8IDgpCi0JCSAgewotCQkgICAgcHV0YyAoJyAnLCBmcCk7Ci0JCSAgICArK2xlbjsKLQkJICB9Ci0JCWZwcmludGYgKGZwLCAiMHglcyIsIHApOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdUJzoKLQkgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0KLQkJaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCB8fCAqbmFtZSA9PSAwKQotCQkgIGZwcmludGYgKGZwLCBfKCJubyBzeW1ib2wiKSk7Ci0JCWVsc2UgaWYgKCEgZGVtYW5nbGluZykKLQkJICBmcHJpbnRmIChmcCwgIiVzIiwgbmFtZSk7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBjaGFyICpkZW1hbmdsZWQ7Ci0KLQkJICAgIGRlbWFuZ2xlZCA9IGRlbWFuZ2xlIChuYW1lKTsKLQkJICAgIGZwcmludGYgKGZwLCAiJXMiLCBkZW1hbmdsZWQpOwotCQkgICAgZnJlZSAoZGVtYW5nbGVkKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0InOgotCSAgICAgIC8qIGZpbGVuYW1lIGZyb20gYSBiZmQgKi8KLQkgICAgICB7IAotCQliZmQgKmFiZmQgPSB2YV9hcmcgKGFyZywgYmZkICopOwotCQlpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKLQkJICBmcHJpbnRmIChmcCwgIiVzKCVzKSIsIGFiZmQtPm15X2FyY2hpdmUtPmZpbGVuYW1lLAotCQkJICAgYWJmZC0+ZmlsZW5hbWUpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZnAsICIlcyIsIGFiZmQtPmZpbGVuYW1lKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnRic6Ci0JICAgICAgLyogZXJyb3IgaXMgZmF0YWwgKi8KLQkgICAgICBmYXRhbCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgLyogcHJpbnQgcHJvZ3JhbSBuYW1lICovCi0JICAgICAgZnByaW50ZiAoZnAsICIlcyIsIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnRSc6Ci0JICAgICAgLyogY3VycmVudCBiZmQgZXJyb3Igb3IgZXJybm8gKi8KLQkgICAgICBmcHJpbnRmIChmcCwgIiVzIiwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0knOgotCSAgICAgIC8qIGZpbGVuYW1lIGZyb20gYSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICovCi0JICAgICAgewotCQlsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppOwotCi0JCWkgPSB2YV9hcmcgKGFyZywgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKTsKLQkJaWYgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSAhPSBOVUxMKQotCQkgIGZwcmludGYgKGZwLCAiKCVzKSIsCi0JCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoaS0+dGhlX2JmZCkpKTsKLQkJZnByaW50ZiAoZnAsICIlcyIsIGktPmxvY2FsX3N5bV9uYW1lKTsKLQkJaWYgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSA9PSBOVUxMCi0JCSAgICAmJiBzdHJjbXAgKGktPmxvY2FsX3N5bV9uYW1lLCBpLT5maWxlbmFtZSkgIT0gMCkKLQkJICBmcHJpbnRmIChmcCwgIiAoJXMpIiwgaS0+ZmlsZW5hbWUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdTJzoKLQkgICAgICAvKiBwcmludCBzY3JpcHQgZmlsZSBhbmQgbGluZW51bWJlciAqLwotCSAgICAgIGlmIChwYXJzaW5nX2RlZnN5bSkKLQkJZnByaW50ZiAoZnAsICItLWRlZnN5bSAlcyIsIGxleF9zdHJpbmcpOwotCSAgICAgIGVsc2UgaWYgKGxkZmlsZV9pbnB1dF9maWxlbmFtZSAhPSBOVUxMKQotCQlmcHJpbnRmIChmcCwgIiVzOiV1IiwgbGRmaWxlX2lucHV0X2ZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICAgIGVsc2UKLQkJZnByaW50ZiAoZnAsIF8oImJ1aWx0IGluIGxpbmtlciBzY3JpcHQ6JXUiKSwgbGluZW5vKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdSJzoKLQkgICAgICAvKiBQcmludCBhbGwgdGhhdCdzIGludGVyZXN0aW5nIGFib3V0IGEgcmVsZW50ICovCi0JICAgICAgewotCQlhcmVsZW50ICpyZWxlbnQgPSB2YV9hcmcgKGFyZywgYXJlbGVudCAqKTsKLQkKLQkJbGZpbmZvIChmcCwgIiVzKzB4JXYgKHR5cGUgJXMpIiwKLQkJCSgqKHJlbGVudC0+c3ltX3B0cl9wdHIpKS0+bmFtZSwKLQkJCXJlbGVudC0+YWRkZW5kLAotCQkJcmVsZW50LT5ob3d0by0+bmFtZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCQotCSAgICBjYXNlICdDJzoKLQkgICAgY2FzZSAnRCc6Ci0JICAgIGNhc2UgJ0cnOgotCSAgICAgIC8qIENsZXZlciBmaWxlbmFtZTpsaW5lbnVtYmVyIHdpdGggZnVuY3Rpb24gbmFtZSBpZiBwb3NzaWJsZSwKLQkJIG9yIHNlY3Rpb24gbmFtZSBhcyBhIGxhc3QgcmVzb3J0LiAgVGhlIGFyZ3VtZW50cyBhcmUgYSBCRkQsCi0JCSBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQuICAqLwotCSAgICAgIHsKLQkJc3RhdGljIGJmZCAqbGFzdF9iZmQ7Ci0JCXN0YXRpYyBjaGFyICpsYXN0X2ZpbGUgPSBOVUxMOwotCQlzdGF0aWMgY2hhciAqbGFzdF9mdW5jdGlvbiA9IE5VTEw7Ci0JCWJmZCAqYWJmZDsKLQkJYXNlY3Rpb24gKnNlY3Rpb247Ci0JCWJmZF92bWEgb2Zmc2V0OwotCQlsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLQkJYXN5bWJvbCAqKmFzeW1ib2xzOwotCQljb25zdCBjaGFyICpmaWxlbmFtZTsKLQkJY29uc3QgY2hhciAqZnVuY3Rpb25uYW1lOwotCQl1bnNpZ25lZCBpbnQgbGluZW51bWJlcjsKLQkJYm9vbGVhbiBkaXNjYXJkX2xhc3Q7Ci0KLQkJYWJmZCA9IHZhX2FyZyAoYXJnLCBiZmQgKik7Ci0JCXNlY3Rpb24gPSB2YV9hcmcgKGFyZywgYXNlY3Rpb24gKik7Ci0JCW9mZnNldCA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQotCQllbnRyeSA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGFiZmQtPnVzcmRhdGE7Ci0JCWlmIChlbnRyeSAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMCi0JCSAgICAmJiBlbnRyeS0+YXN5bWJvbHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpCi0JCSAgYXN5bWJvbHMgPSBlbnRyeS0+YXN5bWJvbHM7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBsb25nIHN5bXNpemU7Ci0JCSAgICBsb25nIHN5bWJvbF9jb3VudDsKLQotCQkgICAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLQkJICAgIGlmIChzeW1zaXplIDwgMCkKLQkJICAgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHNcbiIpLCBhYmZkKTsKLQkJICAgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCQkgICAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGFzeW1ib2xzKTsKLQkJICAgIGlmIChzeW1ib2xfY291bnQgPCAwKQotCQkgICAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sc1xuIiksIGFiZmQpOwotCQkgICAgaWYgKGVudHJ5ICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEwpCi0JCSAgICAgIHsKLQkJCWVudHJ5LT5hc3ltYm9scyA9IGFzeW1ib2xzOwotCQkJZW50cnktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKLQkJICAgICAgfQotCQkgIH0KLQotCQlkaXNjYXJkX2xhc3QgPSB0cnVlOwotCQlpZiAoYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBhc3ltYm9scywgb2Zmc2V0LAotCQkJCQkgICAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsCi0JCQkJCSAgICZsaW5lbnVtYmVyKSkKLQkJICB7Ci0JCSAgICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgZm10Wy0xXSA9PSAnRycpCi0JCSAgICAgIHsKLQkJCWxmaW5mbyAoZnAsICIlQjoiLCBhYmZkKTsKLQkJCWlmIChmaWxlbmFtZSAhPSBOVUxMCi0JCQkgICAgJiYgc3RyY21wIChmaWxlbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpICE9IDApCi0JCQkgIGZwcmludGYgKGZwLCAiJXM6IiwgZmlsZW5hbWUpOwotCQkJbGZpbmZvIChmcCwgIiVUIiwgZnVuY3Rpb25uYW1lKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgZm10Wy0xXSA9PSAnQycpCi0JCSAgICAgIHsKLQkJCWlmIChmaWxlbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotCQkJICBmaWxlbmFtZSA9IGFiZmQtPmZpbGVuYW1lOwotCi0JCQlpZiAobGFzdF9iZmQgPT0gTlVMTAotCQkJICAgIHx8IGxhc3RfZmlsZSA9PSBOVUxMCi0JCQkgICAgfHwgbGFzdF9mdW5jdGlvbiA9PSBOVUxMCi0JCQkgICAgfHwgbGFzdF9iZmQgIT0gYWJmZAotCQkJICAgIHx8IHN0cmNtcCAobGFzdF9maWxlLCBmaWxlbmFtZSkgIT0gMAotCQkJICAgIHx8IHN0cmNtcCAobGFzdF9mdW5jdGlvbiwgZnVuY3Rpb25uYW1lKSAhPSAwKQotCQkJICB7Ci0JCQkgICAgLyogV2UgdXNlIGFiZmQtPmZpbGVuYW1lIGluIHRoaXMgaW5pdGlhbCBsaW5lLAotCQkJICAgICAgIGluIGNhc2UgZmlsZW5hbWUgaXMgYSAuaCBmaWxlIG9yIHNvbWV0aGluZwotCQkJICAgICAgIHNpbWlsYXJseSB1bmhlbHBmdWwuICAqLwotCQkJICAgIGxmaW5mbyAoZnAsIF8oIiVCOiBJbiBmdW5jdGlvbiBgJVQnOlxuIiksCi0JCQkJICAgIGFiZmQsIGZ1bmN0aW9ubmFtZSk7Ci0KLQkJCSAgICBsYXN0X2JmZCA9IGFiZmQ7Ci0JCQkgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQotCQkJICAgICAgZnJlZSAobGFzdF9maWxlKTsKLQkJCSAgICBsYXN0X2ZpbGUgPSBidXlzdHJpbmcgKGZpbGVuYW1lKTsKLQkJCSAgICBpZiAobGFzdF9mdW5jdGlvbiAhPSBOVUxMKQotCQkJICAgICAgZnJlZSAobGFzdF9mdW5jdGlvbik7Ci0JCQkgICAgbGFzdF9mdW5jdGlvbiA9IGJ1eXN0cmluZyAoZnVuY3Rpb25uYW1lKTsKLQkJCSAgfQotCQkJZGlzY2FyZF9sYXN0ID0gZmFsc2U7Ci0JCQlpZiAobGluZW51bWJlciAhPSAwKQotCQkJICBmcHJpbnRmIChmcCwgIiVzOiV1IiwgZmlsZW5hbWUsIGxpbmVudW1iZXIpOwotCQkJZWxzZQotCQkJICBsZmluZm8gKGZwLCAiJXMoJXMrMHgldikiLCBmaWxlbmFtZSwgc2VjdGlvbi0+bmFtZSwKLQkJCQkgIG9mZnNldCk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGZpbGVuYW1lID09IE5VTEwKLQkJCSAgICAgfHwgc3RyY21wIChmaWxlbmFtZSwgYWJmZC0+ZmlsZW5hbWUpID09IDApCi0JCSAgICAgIHsKLQkJCWxmaW5mbyAoZnAsICIlQiglcysweCV2KSIsIGFiZmQsIHNlY3Rpb24tPm5hbWUsCi0JCQkJb2Zmc2V0KTsKLQkJCWlmIChsaW5lbnVtYmVyICE9IDApCi0JCQkgIGxmaW5mbyAoZnAsICI6JXUiLCBsaW5lbnVtYmVyKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAobGluZW51bWJlciAhPSAwKSAKLQkJICAgICAgbGZpbmZvIChmcCwgIiVCOiVzOiV1IiwgYWJmZCwgZmlsZW5hbWUsIGxpbmVudW1iZXIpOwotCQkgICAgZWxzZQotCQkgICAgICBsZmluZm8gKGZwLCAiJUIoJXMrMHgldik6JXMiLCBhYmZkLCBzZWN0aW9uLT5uYW1lLAotCQkJICAgICAgb2Zmc2V0LCBmaWxlbmFtZSk7Ci0JCSAgfQotCQllbHNlCi0JCSAgbGZpbmZvIChmcCwgIiVCKCVzKzB4JXYpIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSwgb2Zmc2V0KTsKLQotCQlpZiAoZGlzY2FyZF9sYXN0KQotCQkgIHsKLQkJICAgIGxhc3RfYmZkID0gTlVMTDsKLQkJICAgIGlmIChsYXN0X2ZpbGUgIT0gTlVMTCkKLQkJICAgICAgewotCQkJZnJlZSAobGFzdF9maWxlKTsKLQkJCWxhc3RfZmlsZSA9IE5VTEw7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChsYXN0X2Z1bmN0aW9uICE9IE5VTEwpCi0JCSAgICAgIHsKLQkJCWZyZWUgKGxhc3RfZnVuY3Rpb24pOwotCQkJbGFzdF9mdW5jdGlvbiA9IE5VTEw7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCQkKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgLyogYXJiaXRyYXJ5IHN0cmluZywgbGlrZSBwcmludGYgKi8KLQkgICAgICBmcHJpbnRmIChmcCwgIiVzIiwgdmFfYXJnIChhcmcsIGNoYXIgKikpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2QnOgotCSAgICAgIC8qIGludGVnZXIsIGxpa2UgcHJpbnRmICovCi0JICAgICAgZnByaW50ZiAoZnAsICIlZCIsIHZhX2FyZyAoYXJnLCBpbnQpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd1JzoKLQkgICAgICAvKiB1bnNpZ25lZCBpbnRlZ2VyLCBsaWtlIHByaW50ZiAqLwotCSAgICAgIGZwcmludGYgKGZwLCAiJXUiLCB2YV9hcmcgKGFyZywgdW5zaWduZWQgaW50KSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmYXRhbCA9PSB0cnVlKSAKLSAgICB4ZXhpdCgxKTsKLX0KLQotLyogRm9ybWF0IGluZm8gbWVzc2FnZSBhbmQgcHJpbnQgb24gc3Rkb3V0LiAqLwotCi0vKiAoWW91IHdvdWxkIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBqdXN0ICJpbmZvIiwgYnV0IHRoZW4geW91Ci0gICB3b3VsZCBob3NlZCBieSBMeW54T1MsIHdoaWNoIGRlZmluZXMgdGhhdCBuYW1lIGluIGl0cyBsaWJjLikgICovCi0KLXZvaWQKLSNpZiBVU0VfU1REQVJHCi1pbmZvX21zZyAoY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotaW5mb19tc2cgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZzsKLQotI2lmICEgVVNFX1NUREFSRwotICBjb25zdCBjaGFyICpmbXQ7Ci0KLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoc3Rkb3V0LCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQotLyogKCdlJyBmb3IgZXJyb3IuKSBGb3JtYXQgaW5mbyBtZXNzYWdlIGFuZCBwcmludCBvbiBzdGRlcnIuICovCi0KLXZvaWQKLSNpZiBVU0VfU1REQVJHCi1laW5mbyAoY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotZWluZm8gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZzsKLQotI2lmICEgVVNFX1NUREFSRwotICBjb25zdCBjaGFyICpmbXQ7Ci0KLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoc3RkZXJyLCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQotdm9pZCAKLWluZm9fYXNzZXJ0IChmaWxlLCBsaW5lKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLXsKLSAgZWluZm8gKF8oIiVGJVA6IGludGVybmFsIGVycm9yICVzICVkXG4iKSwgZmlsZSwgbGluZSk7Ci19Ci0KLWNoYXIgKgotYnV5c3RyaW5nICh4KQotICAgICBDT05TVCBjaGFyICpDT05TVCB4OwotewotICBzaXplX3QgbCA9IHN0cmxlbih4KSsxOwotICBjaGFyICpyID0geG1hbGxvYyhsKTsKLSAgbWVtY3B5KHIsIHgsbCk7Ci0gIHJldHVybiByOwotfQotCi0vKiAoJ20nIGZvciBtYXApIEZvcm1hdCBpbmZvIG1lc3NhZ2UgYW5kIHByaW50IG9uIG1hcC4gKi8KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLW1pbmZvIChjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1taW5mbyAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnOwotCi0jaWYgISBVU0VfU1REQVJHCi0gIGNvbnN0IGNoYXIgKmZtdDsKLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoY29uZmlnLm1hcF9maWxlLCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLWxmaW5mbyAoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotbGZpbmZvICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmc7Ci0KLSNpZiAhIFVTRV9TVERBUkcKLSAgRklMRSAqZmlsZTsKLSAgY29uc3QgY2hhciAqZm10OwotCi0gIHZhX3N0YXJ0IChhcmcpOwotICBmaWxlID0gdmFfYXJnIChhcmcsIEZJTEUgKik7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoZmlsZSwgZm10LCBhcmcpOwotICB2YV9lbmQgKGFyZyk7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgdG8gcHJpbnQgdGhlIGxpbmsgbWFwLiAgKi8KLQotdm9pZCAKLXByaW50X3NwYWNlICgpCi17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiAiKTsKLX0KLQotdm9pZCAKLXByaW50X25sICgpCi17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlxuIik7Ci19Ci0KLS8qIEEgbW9yZSBvciBsZXNzIGZyaWVuZGx5IGFib3J0IG1lc3NhZ2UuICBJbiBsZC5oIGFib3J0IGlzIGRlZmluZWQgdG8KLSAgIGNhbGwgdGhpcyBmdW5jdGlvbi4gICovCi0KLXZvaWQKLWxkX2Fib3J0IChmaWxlLCBsaW5lLCBmbikKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgaW50IGxpbmU7Ci0gICAgIGNvbnN0IGNoYXIgKmZuOwotewotICBpZiAoZm4gIT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJVA6IGludGVybmFsIGVycm9yOiBhYm9ydGluZyBhdCAlcyBsaW5lICVkIGluICVzXG4iKSwKLQkgICBmaWxlLCBsaW5lLCBmbik7Ci0gIGVsc2UKLSAgICBlaW5mbyAoXygiJVA6IGludGVybmFsIGVycm9yOiBhYm9ydGluZyBhdCAlcyBsaW5lICVkXG4iKSwKLQkgICBmaWxlLCBsaW5lKTsKLSAgZWluZm8gKF8oIiVQJUY6IHBsZWFzZSByZXBvcnQgdGhpcyBidWdcbiIpKTsKLSAgeGV4aXQgKDEpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRtaXNjLmggYi9sZC9sZG1pc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViM2I0Zi4uMDAwMDAwMAotLS0gYS9sZC9sZG1pc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIGxkbWlzYy5oIC0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRE1JU0NfSAotI2RlZmluZSBMRE1JU0NfSAotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1leHRlcm4gdm9pZCBlaW5mbyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotZXh0ZXJuIHZvaWQgbWluZm8gUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLWV4dGVybiB2b2lkIGluZm9fbXNnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1leHRlcm4gdm9pZCBsZmluZm8gUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLikpOwotI2Vsc2UKLS8qIFZBUkFSR1MqLwotZXh0ZXJuIHZvaWQgZWluZm8gKCk7Ci0vKiBWQVJBUkdTKi8KLWV4dGVybiB2b2lkIG1pbmZvICgpOwotLyogVkFSQVJHUyovCi1leHRlcm4gdm9pZCBpbmZvX21zZyAoKTsKLS8qVkFSQVJHUyovCi1leHRlcm4gdm9pZCBsZmluZm8gKCk7Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgaW5mb19hc3NlcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQpKTsKLWV4dGVybiB2b2lkIHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gUFRSIHhtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gUFRSIHhyZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBjaGFyICpidXlzdHJpbmcgUEFSQU1TICgoQ09OU1QgY2hhciAqQ09OU1QpKTsKLQotI2RlZmluZSBBU1NFUlQoeCkgXAotZG8geyBpZiAoISh4KSkgaW5mb19hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEZBSUwoKSBcCi1kbyB7IGluZm9fYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfSB3aGlsZSAoMCkKLQotZXh0ZXJuIHZvaWQgcHJpbnRfc3BhY2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcHJpbnRfbmwgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGNoYXIgKmRlbWFuZ2xlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkdmVyLmMgYi9sZC9sZHZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjYwMGEyLi4wMDAwMDAwCi0tLSBhL2xkL2xkdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBsZHZlci5jIC0tIFByaW50IGxpbmtlciB2ZXJzaW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkdmVyLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLWNvbnN0IGNoYXIgKmxkX3Byb2dyYW1fdmVyc2lvbiA9IFZFUlNJT047Ci0KLXZvaWQKLWxkdmVyc2lvbiAobm9pc3kpCi0gICAgIGludCBub2lzeTsKLXsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCJHTlUgbGQgdmVyc2lvbiAlcyAod2l0aCBCRkQgJXMpXG4iKSwKLQkgICBsZF9wcm9ncmFtX3ZlcnNpb24sIEJGRF9WRVJTSU9OKTsKLQotICBpZiAobm9pc3kpIAotICAgIHsKLSAgICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKipwdHIgPSBsZF9lbXVsYXRpb25zOwotICAgIAotICAgICAgcHJpbnRmIChfKCIgIFN1cHBvcnRlZCBlbXVsYXRpb25zOlxuIikpOwotICAgICAgd2hpbGUgKCpwdHIpIAotCXsKLQkgIHByaW50ZiAoIiAgICVzXG4iLCAoKnB0ciktPmVtdWxhdGlvbl9uYW1lKTsKLQkgIHB0cisrOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC9sZHZlci5oIGIvbGQvbGR2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YjZiYy4uMDAwMDAwMAotLS0gYS9sZC9sZHZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogbGR2ZXIuaCAtLSBIZWFkZXIgZmlsZSBmb3IgbGR2ZXIuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmxkX3Byb2dyYW1fdmVyc2lvbjsKLQotdm9pZCBsZHZlcnNpb24gUEFSQU1TICgoaW50KSk7CmRpZmYgLS1naXQgYS9sZC9sZHdyaXRlLmMgYi9sZC9sZHdyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NjExOWEuLjAwMDAwMDAKLS0tIGEvbGQvbGR3cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qIGxkd3JpdGUuYyAtLSB3cml0ZSBvdXQgdGhlIGxpbmtlZCBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzYWNAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkd3JpdGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotc3RhdGljIHZvaWQgYnVpbGRfbGlua19vcmRlciBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyBhc2VjdGlvbiAqY2xvbmVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIHNwbGl0X3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEJ1aWxkIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBmb3IgdGhlIEJGRCBsaW5rZXIuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfbGlua19vcmRlciAoc3RhdGVtZW50KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzdGF0ZW1lbnQ7Ci17Ci0gIHN3aXRjaCAoc3RhdGVtZW50LT5oZWFkZXIudHlwZSkKLSAgICB7Ci0gICAgY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0gICAgICB7Ci0JYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCXN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLQliZmRfdm1hIHZhbHVlOwotCWJvb2xlYW4gYmlnX2VuZGlhbiA9IGZhbHNlOwotCi0Jb3V0cHV0X3NlY3Rpb24gPSBzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uOwotCUFTU0VSVCAob3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCi0JbGlua19vcmRlciA9IGJmZF9uZXdfbGlua19vcmRlciAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pOwotCWlmIChsaW5rX29yZGVyID09IE5VTEwpCi0JICBlaW5mbyAoXygiJVAlRjogYmZkX25ld19saW5rX29yZGVyIGZhaWxlZFxuIikpOwotCi0JbGlua19vcmRlci0+dHlwZSA9IGJmZF9kYXRhX2xpbmtfb3JkZXI7Ci0JbGlua19vcmRlci0+b2Zmc2V0ID0gc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfdm1hOwotCWxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChRVUFEX1NJWkUpOwotCi0JdmFsdWUgPSBzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50LnZhbHVlOwotCi0JLyogSWYgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIG91dHB1dCBCRkQgaXMgbm90IGtub3duLCB0aGVuIHdlCi0JICAgYmFzZSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgZGF0YSBvbiB0aGUgZmlyc3QgaW5wdXQgZmlsZS4KLQkgICBCeSBjb252ZW50aW9uLCB0aGUgYmZkX3B1dCByb3V0aW5lcyBmb3IgYW4gdW5rbm93bgotCSAgIGVuZGlhbm5lc3MgYXJlIGJpZyBlbmRpYW4sIHNvIHdlIG11c3Qgc3dhcCBoZXJlIGlmIHRoZQotCSAgIGlucHV0IGZpbGUgaXMgbGl0dGxlIGVuZGlhbi4gICovCi0JaWYgKGJmZF9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkgIGJpZ19lbmRpYW4gPSB0cnVlOwotCWVsc2UgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkgIGJpZ19lbmRpYW4gPSBmYWxzZTsKLQllbHNlCi0JICB7Ci0JICAgIGJvb2xlYW4gc3dhcDsKLQotCSAgICBzd2FwID0gZmFsc2U7Ci0JICAgIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9CSUcpCi0JICAgICAgYmlnX2VuZGlhbiA9IHRydWU7Ci0JICAgIGVsc2UgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0xJVFRMRSkKLQkgICAgICB7Ci0JCWJpZ19lbmRpYW4gPSBmYWxzZTsKLQkJc3dhcCA9IHRydWU7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9VTlNFVCkKLQkgICAgICB7Ci0JCWJpZ19lbmRpYW4gPSB0cnVlOwotCQl7Ci0JCSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKHMpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT50aGVfYmZkICE9IE5VTEwpCi0JCQl7Ci0JCQkgIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAocy0+dGhlX2JmZCkpCi0JCQkgICAgewotCQkJICAgICAgYmlnX2VuZGlhbiA9IGZhbHNlOwotCQkJICAgICAgc3dhcCA9IHRydWU7Ci0JCQkgICAgfQotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIH0KLQotCSAgICBpZiAoc3dhcCkKLQkgICAgICB7Ci0JCWJmZF9ieXRlIGJ1ZmZlcls4XTsKLQotCQlzd2l0Y2ggKHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQudHlwZSkKLQkJICB7Ci0JCSAgY2FzZSBRVUFEOgotCQkgIGNhc2UgU1FVQUQ6Ci0JCSAgICBpZiAoc2l6ZW9mIChiZmRfdm1hKSA+PSBRVUFEX1NJWkUpCi0JCSAgICAgIHsKLQkJCWJmZF9wdXRsNjQgKHZhbHVlLCBidWZmZXIpOwotCQkJdmFsdWUgPSBiZmRfZ2V0YjY0IChidWZmZXIpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCSAgY2FzZSBMT05HOgotCQkgICAgYmZkX3B1dGwzMiAodmFsdWUsIGJ1ZmZlcik7Ci0JCSAgICB2YWx1ZSA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFNIT1JUOgotCQkgICAgYmZkX3B1dGwxNiAodmFsdWUsIGJ1ZmZlcik7Ci0JCSAgICB2YWx1ZSA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIEJZVEU6Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgYWJvcnQgKCk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQotCUFTU0VSVCAob3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCXN3aXRjaCAoc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC50eXBlKQotCSAgewotCSAgY2FzZSBRVUFEOgotCSAgY2FzZSBTUVVBRDoKLQkgICAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPj0gUVVBRF9TSVpFKQotCSAgICAgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHZhbHVlLCBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMpOwotCSAgICBlbHNlCi0JICAgICAgewotCQliZmRfdm1hIGhpZ2g7Ci0KLQkJaWYgKHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQudHlwZSA9PSBRVUFEKQotCQkgIGhpZ2ggPSAwOwotCQllbHNlIGlmICgodmFsdWUgJiAweDgwMDAwMDAwKSA9PSAwKQotCQkgIGhpZ2ggPSAwOwotCQllbHNlCi0JCSAgaGlnaCA9IChiZmRfdm1hKSAtMTsKLQkJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaGlnaCwKLQkJCSAgICAobGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzCi0JCQkgICAgICsgKGJpZ19lbmRpYW4gPyAwIDogNCkpKTsKLQkJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsCi0JCQkgICAgKGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cwotCQkJICAgICArIChiaWdfZW5kaWFuID8gNCA6IDApKSk7Ci0JICAgICAgfQotCSAgICBsaW5rX29yZGVyLT5zaXplID0gUVVBRF9TSVpFOwotCSAgICBicmVhazsKLQkgIGNhc2UgTE9ORzoKLQkgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyk7Ci0JICAgIGxpbmtfb3JkZXItPnNpemUgPSBMT05HX1NJWkU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBTSE9SVDoKLQkgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdmFsdWUsIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyk7Ci0JICAgIGxpbmtfb3JkZXItPnNpemUgPSBTSE9SVF9TSVpFOwotCSAgICBicmVhazsKLQkgIGNhc2UgQllURToKLQkgICAgYmZkX3B1dF84IChvdXRwdXRfYmZkLCB2YWx1ZSwgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzKTsKLQkgICAgbGlua19vcmRlci0+c2l6ZSA9IEJZVEVfU0laRTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotICAgICAgewotCWxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnJzOwotCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQlzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0KLQlycyA9ICZzdGF0ZW1lbnQtPnJlbG9jX3N0YXRlbWVudDsKLQotCW91dHB1dF9zZWN0aW9uID0gcnMtPm91dHB1dF9zZWN0aW9uOwotCUFTU0VSVCAob3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCi0JbGlua19vcmRlciA9IGJmZF9uZXdfbGlua19vcmRlciAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pOwotCWlmIChsaW5rX29yZGVyID09IE5VTEwpCi0JICBlaW5mbyAoXygiJVAlRjogYmZkX25ld19saW5rX29yZGVyIGZhaWxlZFxuIikpOwotCi0JbGlua19vcmRlci0+b2Zmc2V0ID0gcnMtPm91dHB1dF92bWE7Ci0JbGlua19vcmRlci0+c2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocnMtPmhvd3RvKTsKLQotCWxpbmtfb3JkZXItPnUucmVsb2MucCA9Ci0JICAoKHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYyAqKQotCSAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jKSkpOwotCi0JbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyA9IHJzLT5yZWxvYzsKLQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCA9IHJzLT5hZGRlbmRfdmFsdWU7Ci0KLQlpZiAocnMtPm5hbWUgPT0gTlVMTCkKLQkgIHsKLQkgICAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI7Ci0JICAgIGlmIChycy0+c2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCkKLQkgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbiA9IHJzLT5zZWN0aW9uOwotCSAgICBlbHNlCi0JICAgICAgewotCQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbiA9IHJzLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgKz0gcnMtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcjsKLQkgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUgPSBycy0+bmFtZTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLSAgICAgIC8qIENyZWF0ZSBhIG5ldyBsaW5rX29yZGVyIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB3aXRoIHRoaXMKLQkgYXR0YWNoZWQgKi8KLSAgICAgIGlmIChzdGF0ZW1lbnQtPmlucHV0X3NlY3Rpb24uaWZpbGUtPmp1c3Rfc3ltc19mbGFnID09IGZhbHNlKQotCXsKLQkgIGFzZWN0aW9uICppID0gc3RhdGVtZW50LT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0JICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBpLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgQVNTRVJUIChvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0KLQkgIGlmICgob3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLQotCSAgICAgIGxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKLQotCSAgICAgIGlmIChpLT5mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCQl7Ci0JCSAgLyogV2UndmUgZ290IGEgbmV2ZXIgbG9hZCBzZWN0aW9uIGluc2lkZSBvbmUgd2hpY2gKLQkJICAgICBpcyBnb2luZyB0byBiZSBvdXRwdXQsIHdlJ2xsIGNoYW5nZSBpdCBpbnRvIGEKLQkJICAgICBmaWxsIGxpbmtfb3JkZXIgKi8KLQkJICBsaW5rX29yZGVyLT50eXBlID0gYmZkX2ZpbGxfbGlua19vcmRlcjsKLQkJICBsaW5rX29yZGVyLT51LmZpbGwudmFsdWUgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyOwotCQkgIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbiA9IGk7Ci0JCSAgQVNTRVJUIChpLT5vdXRwdXRfc2VjdGlvbiA9PSBvdXRwdXRfc2VjdGlvbik7Ci0JCX0KLQkgICAgICBpZiAoaS0+X2Nvb2tlZF9zaXplKQotCQlsaW5rX29yZGVyLT5zaXplID0gaS0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UKLQkJbGlua19vcmRlci0+c2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoaSk7Ci0JICAgICAgbGlua19vcmRlci0+b2Zmc2V0ID0gaS0+b3V0cHV0X29mZnNldDsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0gICAgICAvKiBNYWtlIGEgbmV3IGxpbmtfb3JkZXIgd2l0aCB0aGUgcmlnaHQgZmlsbGVyICovCi0gICAgICB7Ci0JYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCXN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLQotCW91dHB1dF9zZWN0aW9uID0gc3RhdGVtZW50LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbjsKLQlBU1NFUlQgKHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24tPm93bmVyCi0JCT09IG91dHB1dF9iZmQpOwotCWlmICgob3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgIHsKLQkgICAgbGlua19vcmRlciA9IGJmZF9uZXdfbGlua19vcmRlciAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pOwotCSAgICBsaW5rX29yZGVyLT50eXBlID0gYmZkX2ZpbGxfbGlua19vcmRlcjsKLQkgICAgbGlua19vcmRlci0+c2l6ZSA9IHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZTsKLQkgICAgbGlua19vcmRlci0+b2Zmc2V0ID0gc3RhdGVtZW50LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfb2Zmc2V0OwotCSAgICBsaW5rX29yZGVyLT51LmZpbGwudmFsdWUgPSBzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50LmZpbGw7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBBbGwgdGhlIG90aGVyIG9uZXMgZmFsbCB0aHJvdWdoICovCi0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIENhbGwgQkZEIHRvIHdyaXRlIG91dCB0aGUgbGlua2VkIGZpbGUuICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qIFdhbmRlciBhcm91bmQgdGhlIGlucHV0IHNlY3Rpb25zLCBtYWtlIHN1cmUgdGhhdAotICAgd2UnbGwgbmV2ZXIgdHJ5IGFuZCBjcmVhdGUgYW4gb3V0cHV0IHNlY3Rpb24gd2l0aCBtb3JlIHJlbG9jcwotICAgdGhhbiB3aWxsIGZpdC4uIERvIHRoaXMgYnkgYWx3YXlzIGFzc3VtaW5nIHRoZSB3b3JzdCBjYXNlLCBhbmQKLSAgIGNyZWF0aW5nIG5ldyBvdXRwdXQgc2VjdGlvbnMgd2l0aCBhbGwgdGhlIHJpZ2h0IGJpdHMgKi8KLSNkZWZpbmUgVEVTVElUIDEKLXN0YXRpYyBhc2VjdGlvbiAqCi1jbG9uZV9zZWN0aW9uIChhYmZkLCBzLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqczsKLSAgICAgaW50ICpjb3VudDsKLXsKLSNkZWZpbmUgU1NJWkUgOAotICBjaGFyIHNuYW1lW1NTSVpFXTsJCS8qID8/ICBmaW5kIHRoZSBuYW1lIGZvciB0aGlzIHNpemUgKi8KLSAgYXNlY3Rpb24gKm47Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAvKiBJbnZlbnQgYSBzZWN0aW9uIG5hbWUgLSB1c2UgZmlyc3QgZml2ZQotICAgICBjaGFycyBvZiBiYXNlIHNlY3Rpb24gbmFtZSBhbmQgYSBkaWdpdCBzdWZmaXggKi8KLSAgZG8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGNoYXIgYls2XTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGIpIC0gMSAmJiBzLT5uYW1lW2ldOyBpKyspCi0JYltpXSA9IHMtPm5hbWVbaV07Ci0gICAgICBiW2ldID0gMDsKLSAgICAgIHNwcmludGYgKHNuYW1lLCAiJXMlZCIsIGIsICgqY291bnQpKyspOwotICAgIH0KLSAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzbmFtZSkpOwotCi0gIG4gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgeHN0cmR1cCAoc25hbWUpKTsKLQotICAvKiBDcmVhdGUgYSBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSAqLwotCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsCi0JCQkgICAgc25hbWUsIHRydWUsIHRydWUsIGZhbHNlKTsKLSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgaC0+dS5kZWYudmFsdWUgPSAwOwotICBoLT51LmRlZi5zZWN0aW9uID0gbiAgIDsKLQotCi0gIG4tPmZsYWdzID0gcy0+ZmxhZ3M7Ci0gIG4tPnZtYSA9IHMtPnZtYTsKLSAgbi0+dXNlcl9zZXRfdm1hID0gcy0+dXNlcl9zZXRfdm1hOwotICBuLT5sbWEgPSBzLT5sbWE7Ci0gIG4tPl9jb29rZWRfc2l6ZSA9IDA7Ci0gIG4tPl9yYXdfc2l6ZSA9IDA7Ci0gIG4tPm91dHB1dF9vZmZzZXQgPSBzLT5vdXRwdXRfb2Zmc2V0OwotICBuLT5vdXRwdXRfc2VjdGlvbiA9IG47Ci0gIG4tPm9yZWxvY2F0aW9uID0gMDsKLSAgbi0+cmVsb2NfY291bnQgPSAwOwotICBuLT5hbGlnbm1lbnRfcG93ZXIgPSBzLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIHJldHVybiBuOwotfQotCi0jaWYgVEVTVElORwotc3RhdGljIHZvaWQgCi1kcyAocykKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbCA9IHMtPmxpbmtfb3JkZXJfaGVhZDsKLSAgcHJpbnRmICgidm1hICV4IHNpemUgJXhcbiIsIHMtPnZtYSwgcy0+X3Jhd19zaXplKTsKLSAgd2hpbGUgKGwpCi0gICAgewotICAgICAgaWYgKGwtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JewotCSAgcHJpbnRmICgiJTh4ICVzXG4iLCBsLT5vZmZzZXQsIGwtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXItPmZpbGVuYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmIChfKCIlOHggc29tZXRoaW5nIGVsc2VcbiIpLCBsLT5vZmZzZXQpOwotCX0KLSAgICAgIGwgPSBsLT5uZXh0OwotICAgIH0KLSAgcHJpbnRmICgiXG4iKTsKLX0KLWR1bXAgKHMsIGExLCBhMikKLSAgICAgY2hhciAqczsKLSAgICAgYXNlY3Rpb24gKmExOwotICAgICBhc2VjdGlvbiAqYTI7Ci17Ci0gIHByaW50ZiAoIiVzXG4iLCBzKTsKLSAgZHMgKGExKTsKLSAgZHMgKGEyKTsKLX0KLQotc3RhdGljIHZvaWQgCi1zYW5pdHlfY2hlY2sgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gICAgICBiZmRfdm1hIHByZXYgPSAwOwotICAgICAgZm9yIChwID0gcy0+bGlua19vcmRlcl9oZWFkOyBwOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+b2Zmc2V0ID4gMTAwMDAwKQotCSAgICBhYm9ydCAoKTsKLQkgIGlmIChwLT5vZmZzZXQgPCBwcmV2KQotCSAgICBhYm9ydCAoKTsKLQkgIHByZXYgPSBwLT5vZmZzZXQ7Ci0JfQotICAgIH0KLX0KLSNlbHNlCi0jZGVmaW5lIHNhbml0eV9jaGVjayhhKQotI2RlZmluZSBkdW1wKGEsIGIsIGMpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgCi1zcGxpdF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKm9yaWdpbmFsX3NlYzsKLSAgaW50IG5zZWNzID0gYWJmZC0+c2VjdGlvbl9jb3VudDsKLSAgc2FuaXR5X2NoZWNrIChhYmZkKTsKLSAgLyogbG9vayB0aHJvdWdoIGFsbCB0aGUgb3JpZ2luYWwgc2VjdGlvbnMgKi8KLSAgZm9yIChvcmlnaW5hbF9zZWMgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBvcmlnaW5hbF9zZWMgJiYgbnNlY3M7Ci0gICAgICAgb3JpZ2luYWxfc2VjID0gb3JpZ2luYWxfc2VjLT5uZXh0LCBuc2Vjcy0tKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIGludCBsaW5lcyA9IDA7Ci0gICAgICBpbnQgcmVsb2NzID0gMDsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKnBwOwotICAgICAgYmZkX3ZtYSB2bWEgPSBvcmlnaW5hbF9zZWMtPnZtYTsKLSAgICAgIGJmZF92bWEgc2hpZnRfb2Zmc2V0ID0gMDsKLSAgICAgIGFzZWN0aW9uICpjdXJzb3IgPSBvcmlnaW5hbF9zZWM7Ci0KLSAgICAgIC8qIGNvdW50IHVwIHRoZSByZWxvY2F0aW9ucyBhbmQgbGluZSBlbnRyaWVzIHRvIHNlZSBpZgotCSBhbnl0aGluZyB3b3VsZCBiZSB0b28gYmlnIHRvIGZpdCAqLwotICAgICAgZm9yIChwcCA9ICYoY3Vyc29yLT5saW5rX29yZGVyX2hlYWQpOyAqcHA7IHBwID0gJigoKnBwKS0+bmV4dCkpCi0JewotCSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwID0gKnBwOwotCSAgaW50IHRoaXNsaW5lcyA9IDA7Ci0JICBpbnQgdGhpc3JlbG9jcyA9IDA7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQotCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCi0JCXRoaXNsaW5lcyA9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJdGhpc3JlbG9jcyA9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgdGhpc3JlbG9jcysrOwotCi0JICBpZiAoISBmaXJzdAotCSAgICAgICYmICh0aGlzcmVsb2NzICsgcmVsb2NzID4gY29uZmlnLnNwbGl0X2J5X3JlbG9jCi0JCSAgfHwgdGhpc2xpbmVzICsgbGluZXMgPiBjb25maWcuc3BsaXRfYnlfcmVsb2MKLQkJICB8fCBjb25maWcuc3BsaXRfYnlfZmlsZSkpCi0JICAgIHsKLQkgICAgICAvKiBjcmVhdGUgYSBuZXcgc2VjdGlvbiBhbmQgcHV0IHRoaXMgbGluayBvcmRlciBhbmQgdGhlCi0JCSBmb2xsb3dpbmcgbGluayBvcmRlcnMgaW50byBpdCAqLwotCSAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbCA9IHA7Ci0JICAgICAgYXNlY3Rpb24gKm4gPSBjbG9uZV9zZWN0aW9uIChhYmZkLCBjdXJzb3IsICZjb3VudCk7Ci0JICAgICAgKnBwID0gTlVMTDsJLyogU25pcCBvZmYgbGluayBvcmRlcnMgZnJvbSBvbGQgc2VjdGlvbiAqLwotCSAgICAgIG4tPmxpbmtfb3JkZXJfaGVhZCA9IGw7CS8qIGF0dGFjaCB0byBuZXcgc2VjdGlvbiAqLwotCSAgICAgIHBwID0gJm4tPmxpbmtfb3JkZXJfaGVhZDsKLQotCSAgICAgIC8qIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgc2VjdGlvbiBhbmQKLQkJIHVwZGF0ZSB0aGUgdm1hIG9mIHRoZSBuZXcgb25lICovCi0KLQkgICAgICBkdW1wICgiYmVmb3JlIHNuaXAiLCBjdXJzb3IsIG4pOwotCi0JICAgICAgbi0+X3Jhd19zaXplID0gY3Vyc29yLT5fcmF3X3NpemUgLSBsLT5vZmZzZXQ7Ci0JICAgICAgY3Vyc29yLT5fcmF3X3NpemUgPSBsLT5vZmZzZXQ7Ci0KLQkgICAgICB2bWEgKz0gY3Vyc29yLT5fcmF3X3NpemU7Ci0JICAgICAgbi0+bG1hID0gbi0+dm1hID0gdm1hOwotCi0JICAgICAgc2hpZnRfb2Zmc2V0ID0gbC0+b2Zmc2V0OwotCi0JICAgICAgLyogcnVuIGRvd24gdGhlIGNoYWluIGFuZCBjaGFuZ2UgdGhlIG91dHB1dCBzZWN0aW9uIHRvCi0JCSB0aGUgcmlnaHQgb25lLCB1cGRhdGUgdGhlIG9mZnNldHMgdG9vICovCi0KLQkgICAgICB3aGlsZSAobCkKLQkJewotCQkgIGwtPm9mZnNldCAtPSBzaGlmdF9vZmZzZXQ7Ci0JCSAgaWYgKGwtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCSAgICB7Ci0JCSAgICAgIGwtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBuOwotCQkgICAgICBsLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9vZmZzZXQgPSBsLT5vZmZzZXQ7Ci0JCSAgICB9Ci0JCSAgbCA9IGwtPm5leHQ7Ci0JCX0KLQkgICAgICBkdW1wICgiYWZ0ZXIgc25pcCIsIGN1cnNvciwgbik7Ci0JICAgICAgY3Vyc29yID0gbjsKLQkgICAgICByZWxvY3MgPSB0aGlzcmVsb2NzOwotCSAgICAgIGxpbmVzID0gdGhpc2xpbmVzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWxvY3MgKz0gdGhpc3JlbG9jczsKLQkgICAgICBsaW5lcyArPSB0aGlzbGluZXM7Ci0JICAgIH0KLQotCSAgZmlyc3QgPSBmYWxzZTsKLQl9Ci0gICAgfQotICBzYW5pdHlfY2hlY2sgKGFiZmQpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1sZHdyaXRlICgpCi17Ci0gIC8qIFJlc2V0IGVycm9yIGluZGljYXRvciwgd2hpY2ggY2FuIHR5cGljYWxseSBzb21ldGhpbmcgbGlrZSBpbnZhbGlkCi0gICAgIGZvcm1hdCBmcm9tIG9wZW5uaW5nIHVwIHRoZSAubyBmaWxlcyAqLwotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoYnVpbGRfbGlua19vcmRlcik7Ci0KLSAgaWYgKGNvbmZpZy5zcGxpdF9ieV9yZWxvYyB8fCBjb25maWcuc3BsaXRfYnlfZmlsZSkKLSAgICBzcGxpdF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGlmICghYmZkX2ZpbmFsX2xpbmsgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pKQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIHdhcyBhbiBlcnJvciByZWNvcmRlZCwgcHJpbnQgaXQgb3V0LiAgT3RoZXJ3aXNlIGFzc3VtZQotCSBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIGxpa2UgdW5rbm93biBzeW1ib2wgd2FzIHByaW50ZWQKLQkgb3V0LiAgKi8KLQotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX2Vycm9yKQotCWVpbmZvIChfKCIlRiVQOiBmaW5hbCBsaW5rIGZhaWxlZDogJUVcbiIpLCBvdXRwdXRfYmZkKTsKLSAgICAgIGVsc2UKLQl4ZXhpdCgxKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC9sZHdyaXRlLmggYi9sZC9sZHdyaXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZDhiNTIuLjAwMDAwMDAKLS0tIGEvbGQvbGR3cml0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyogbGR3cml0ZS5oIC0KLSAgIENvcHlyaWdodCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXZvaWQgbGR3cml0ZSBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9sZC9sZXhzdXAuYyBiL2xkL2xleHN1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE2NWUxLi4wMDAwMDAwCi0tLSBhL2xkL2xleHN1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2NyArMCwwIEBACi0vKiBQYXJzZSBvcHRpb25zIGZvciB0aGUgR05VIGxpbmtlci4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRsZXguaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZHZlci5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotCi0jaWZuZGVmIFBBVEhfU0VQQVJBVE9SCi0jaWYgZGVmaW5lZCAoX19NU0RPU19fKSB8fCAoZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykpCi0jZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc7JwotI2Vsc2UKLSNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBTb21ld2hlcmUgYWJvdmUsIHN5cy9zdGF0LmggZ290IGluY2x1ZGVkIC4gLiAuIC4gKi8KLSNpZiAhZGVmaW5lZChTX0lTRElSKSAmJiBkZWZpbmVkKFNfSUZESVIpCi0jZGVmaW5lCVNfSVNESVIobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZW5kaWYKLQotLyogT21pdCBhcmdzIHRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSBvZiBjbGFzaGluZyB3aXRoIGEgc3lzdGVtIGhlYWRlcgotICAgdGhhdCBtaWdodCBkaXNhZ3JlZSBhYm91dCBjb25zdHMuICAqLwotdW5zaWduZWQgbG9uZyBzdHJ0b3VsICgpOwotCi1zdGF0aWMgaW50IGlzX251bSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2Rpcmxpc3QgUEFSQU1TICgoY2hhciAqZGlybGlzdF9wdHIpKTsKLXN0YXRpYyB2b2lkIHNldF9zZWN0aW9uX3N0YXJ0IFBBUkFNUyAoKGNoYXIgKnNlY3QsIGNoYXIgKnZhbHN0cikpOwotc3RhdGljIHZvaWQgaGVscCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIE5vbi16ZXJvIGlmIHdlIGFyZSBwcm9jZXNzaW5nIGEgLS1kZWZzeW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLWludCBwYXJzaW5nX2RlZnN5bSA9IDA7Ci0KLS8qIENvZGVzIHVzZWQgZm9yIHRoZSBsb25nIG9wdGlvbnMgd2l0aCBubyBzaG9ydCBzeW5vbnltcy4gIDE1MCBpc24ndAotICAgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0FTU0VSVAkJCTE1MAotI2RlZmluZSBPUFRJT05fQ0FMTF9TSEFSRUQJCShPUFRJT05fQVNTRVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NSRUYJCQkoT1BUSU9OX0NBTExfU0hBUkVEICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RFRlNZTQkJCShPUFRJT05fQ1JFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9ERU1BTkdMRQkJCShPUFRJT05fREVGU1lNICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RZTkFNSUNfTElOS0VSCQkoT1BUSU9OX0RFTUFOR0xFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VCCQkJKE9QVElPTl9EWU5BTUlDX0xJTktFUiArIDEpCi0jZGVmaW5lIE9QVElPTl9FTAkJCShPUFRJT05fRUIgKyAxKQotI2RlZmluZSBPUFRJT05fRU1CRURERURfUkVMT0NTCQkoT1BUSU9OX0VMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYUE9SVF9EWU5BTUlDCQkoT1BUSU9OX0VNQkVEREVEX1JFTE9DUyArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUxQCQkJKE9QVElPTl9FWFBPUlRfRFlOQU1JQyArIDEpCi0jZGVmaW5lIE9QVElPTl9JR05PUkUJCQkoT1BUSU9OX0hFTFAgKyAxKQotI2RlZmluZSBPUFRJT05fTUFQCQkJKE9QVElPTl9JR05PUkUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVNQU5HTEUJCShPUFRJT05fTUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0tFRVBfTUVNT1JZCQkoT1BUSU9OX05PX0RFTUFOR0xFICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX1dBUk5fTUlTTUFUQ0gJCShPUFRJT05fTk9fS0VFUF9NRU1PUlkgKyAxKQotI2RlZmluZSBPUFRJT05fTk9JTkhJQklUX0VYRUMJCShPUFRJT05fTk9fV0FSTl9NSVNNQVRDSCArIDEpCi0jZGVmaW5lIE9QVElPTl9OT05fU0hBUkVECQkoT1BUSU9OX05PSU5ISUJJVF9FWEVDICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkUJCShPUFRJT05fTk9OX1NIQVJFRCArIDEpCi0jZGVmaW5lIE9QVElPTl9PRk9STUFUCQkJKE9QVElPTl9OT19XSE9MRV9BUkNISVZFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JFTEFYCQkJKE9QVElPTl9PRk9STUFUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEUJKE9QVElPTl9SRUxBWCArIDEpCi0jZGVmaW5lIE9QVElPTl9SUEFUSAkJCShPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9SUEFUSF9MSU5LCQkoT1BUSU9OX1JQQVRIICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NIQVJFRAkJCShPUFRJT05fUlBBVEhfTElOSyArIDEpCi0jZGVmaW5lIE9QVElPTl9TT05BTUUJCQkoT1BUSU9OX1NIQVJFRCArIDEpCi0jZGVmaW5lIE9QVElPTl9TT1JUX0NPTU1PTgkJKE9QVElPTl9TT05BTUUgKyAxKQotI2RlZmluZSBPUFRJT05fU1RBVFMJCQkoT1BUSU9OX1NPUlRfQ09NTU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NZTUJPTElDCQkJKE9QVElPTl9TVEFUUyArIDEpCi0jZGVmaW5lIE9QVElPTl9UQVNLX0xJTksJCShPUFRJT05fU1lNQk9MSUMgKyAxKQotI2RlZmluZSBPUFRJT05fVEJTUwkJCShPUFRJT05fVEFTS19MSU5LICsgMSkKLSNkZWZpbmUgT1BUSU9OX1REQVRBCQkJKE9QVElPTl9UQlNTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RURVhUCQkJKE9QVElPTl9UREFUQSArIDEpCi0jZGVmaW5lIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQJKE9QVElPTl9UVEVYVCArIDEpCi0jZGVmaW5lIE9QVElPTl9VUgkJCShPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUkJPU0UJCQkoT1BUSU9OX1VSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04JCQkoT1BUSU9OX1ZFUkJPU0UgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSU0lPTl9TQ1JJUFQJCShPUFRJT05fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OX0VYUE9SVFNfU0VDVElPTgkoT1BUSU9OX1ZFUlNJT05fU0NSSVBUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fQ09NTU9OCQkoT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTCShPUFRJT05fV0FSTl9DT01NT04gKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9NVUxUSVBMRV9HUAkJKE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SUyArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX09OQ0UJCShPUFRJT05fV0FSTl9NVUxUSVBMRV9HUCArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR04JKE9QVElPTl9XQVJOX09OQ0UgKyAxKQotI2RlZmluZSBPUFRJT05fU1BMSVRfQllfUkVMT0MJCShPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NQTElUX0JZX0ZJTEUgCSAgICAJKE9QVElPTl9TUExJVF9CWV9SRUxPQyArIDEpCi0jZGVmaW5lIE9QVElPTl9XSE9MRV9BUkNISVZFCQkoT1BUSU9OX1NQTElUX0JZX0ZJTEUgKyAxKQotI2RlZmluZSBPUFRJT05fV1JBUAkJCShPUFRJT05fV0hPTEVfQVJDSElWRSArIDEpCi0jZGVmaW5lIE9QVElPTl9GT1JDRV9FWEVfU1VGRklYCQkoT1BUSU9OX1dSQVAgKyAxKQotI2RlZmluZSBPUFRJT05fR0NfU0VDVElPTlMJCShPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWCArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19HQ19TRUNUSU9OUwkJKE9QVElPTl9HQ19TRUNUSU9OUyArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEVDS19TRUNUSU9OUwkJKE9QVElPTl9OT19HQ19TRUNUSU9OUyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19DSEVDS19TRUNUSU9OUwkoT1BUSU9OX0NIRUNLX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX01QQzg2MEMwICAgICAgICAgICAgICAgICAoT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX1VOREVGSU5FRAkJKE9QVElPTl9NUEM4NjBDMCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTklUICAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9OT19VTkRFRklORUQgKyAxKQotI2RlZmluZSBPUFRJT05fRklOSSAgICAgICAgICAgICAgICAgICAgIChPUFRJT05fSU5JVCArIDEpCi0KLS8qIFRoZSBsb25nIG9wdGlvbnMuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBib3RoIHRoZSBvcHRpb24KLSAgIHBhcnNpbmcgYW5kIHRoZSBoZWxwIHRleHQuICAqLwotCi1zdHJ1Y3QgbGRfb3B0aW9uCi17Ci0gIC8qIFRoZSBsb25nIG9wdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBvcHRpb24gb3B0OwotICAvKiBUaGUgc2hvcnQgb3B0aW9uIHdpdGggdGhlIHNhbWUgbWVhbmluZyAoJ1wwJyBpZiBub25lKS4gICovCi0gIGNoYXIgc2hvcnRvcHQ7Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCAoTlVMTCBpZiBub25lKS4gICovCi0gIGNvbnN0IGNoYXIgKmFyZzsKLSAgLyogVGhlIGRvY3VtZW50YXRpb24gc3RyaW5nLiAgSWYgdGhpcyBpcyBOVUxMLCB0aGlzIGlzIGEgc3lub255bSBmb3IKLSAgICAgdGhlIHByZXZpb3VzIG9wdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmRvYzsKLSAgZW51bQotICAgIHsKLSAgICAgIC8qIFVzZSBvbmUgZGFzaCBiZWZvcmUgbG9uZyBvcHRpb24gbmFtZS4gICovCi0gICAgICBPTkVfREFTSCwKLSAgICAgIC8qIFVzZSB0d28gZGFzaGVzIGJlZm9yZSBsb25nIG9wdGlvbiBuYW1lLiAgKi8KLSAgICAgIFRXT19EQVNIRVMsCi0gICAgICAvKiBEb24ndCBtZW50aW9uIHRoaXMgb3B0aW9uIGluIC0taGVscCBvdXRwdXQuICAqLwotICAgICAgTk9fSEVMUAotICAgIH0gY29udHJvbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbGRfb3B0aW9uIGxkX29wdGlvbnNbXSA9Ci17Ci0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdhJywgTl8oIktFWVdPUkQiKSwgTl8oIlNoYXJlZCBsaWJyYXJ5IGNvbnRyb2wgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkiKSwKLSAgICAgIE9ORV9EQVNIIH0sCi0gIHsgeyJhcmNoaXRlY3R1cmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0EnfSwKLSAgICAgICdBJywgTl8oIkFSQ0giKSwgTl8oIlNldCBhcmNoaXRlY3R1cmUiKSAsIFRXT19EQVNIRVMgfSwKLSAgeyB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICAgICAgJ2InLCBOXygiVEFSR0VUIiksIE5fKCJTcGVjaWZ5IHRhcmdldCBmb3IgZm9sbG93aW5nIGlucHV0IGZpbGVzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im1yaS1zY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2MnfSwKLSAgICAgICdjJywgTl8oIkZJTEUiKSwgTl8oIlJlYWQgTVJJIGZvcm1hdCBsaW5rZXIgc2NyaXB0IiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRjIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gICAgICAnZCcsIE5VTEwsIE5fKCJGb3JjZSBjb21tb24gc3ltYm9scyB0byBiZSBkZWZpbmVkIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJkcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7ImVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdlJ30sCi0gICAgICAnZScsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgc3RhcnQgYWRkcmVzcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJleHBvcnQtZHluYW1pYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUX0RZTkFNSUN9LAotICAgICAgJ0UnLCBOVUxMLCBOXygiRXhwb3J0IGFsbCBkeW5hbWljIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGJpZy1lbmRpYW4gb2JqZWN0cyIpLCBPTkVfREFTSCB9LAotICB7IHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGxpdHRsZS1lbmRpYW4gb2JqZWN0cyIpLCBPTkVfREFTSCB9LAotICB7IHsiYXV4aWxpYXJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gICAgICAnZicsIE5fKCJTSExJQiIpLCBOXygiQXV4aWxpYXJ5IGZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7ImZpbHRlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnRid9LAotICAgICAgJ0YnLCBOXygiU0hMSUIiKSwgTl8oIkZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAnZycsIE5VTEwsIE5fKCJJZ25vcmVkIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJncHNpemUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0cnfSwKLSAgICAgICdHJywgTl8oIlNJWkUiKSwgTl8oIlNtYWxsIGRhdGEgc2l6ZSAoaWYgbm8gc2l6ZSwgc2FtZSBhcyAtLXNoYXJlZCkiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7InNvbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU09OQU1FfSwKLSAgICAgICdoJywgTl8oIkZJTEVOQU1FIiksIE5fKCJTZXQgaW50ZXJuYWwgbmFtZSBvZiBzaGFyZWQgbGlicmFyeSIpLCBPTkVfREFTSCB9LAotICB7IHsibGlicmFyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAotICAgICAgJ2wnLCBOXygiTElCTkFNRSIpLCBOXygiU2VhcmNoIGZvciBsaWJyYXJ5IExJQk5BTUUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibGlicmFyeS1wYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdMJ30sCi0gICAgICAnTCcsIE5fKCJESVJFQ1RPUlkiKSwgTl8oIkFkZCBESVJFQ1RPUlkgdG8gbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdtJywgTl8oIkVNVUxBVElPTiIpLCBOXygiU2V0IGVtdWxhdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsicHJpbnQtbWFwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdNJ30sCi0gICAgICAnTScsIE5VTEwsIE5fKCJQcmludCBtYXAgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm1hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCi0gICAgICAnbicsIE5VTEwsIE5fKCJEbyBub3QgcGFnZSBhbGlnbiBkYXRhIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im9tYWdpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTid9LAotICAgICAgJ04nLCBOVUxMLCBOXygiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSwgZG8gbm90IG1ha2UgdGV4dCByZWFkb25seSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdvJ30sCi0gICAgICAnbycsIE5fKCJGSUxFIiksIE5fKCJTZXQgb3V0cHV0IGZpbGUgbmFtZSIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdPJywgTlVMTCwgTl8oIk9wdGltaXplIG91dHB1dCBmaWxlIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJReSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJJZ25vcmVkIGZvciBTVlI0IGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InJlbG9jYXRlYWJsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncid9LAotICAgICAgJ3InLCBOVUxMLCBOXygiR2VuZXJhdGUgcmVsb2NhdGVhYmxlIG91dHB1dCIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdpJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7Imp1c3Qtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUid9LAotICAgICAgJ1InLCBOXygiRklMRSIpLCBOXygiSnVzdCBsaW5rIHN5bWJvbHMgKGlmIGRpcmVjdG9yeSwgc2FtZSBhcyAtLXJwYXRoKSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsic3RyaXAtYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gICAgICAncycsIE5VTEwsIE5fKCJTdHJpcCBhbGwgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJzdHJpcC1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAotICAgICAgJ1MnLCBOVUxMLCBOXygiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhY2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3QnfSwKLSAgICAgICd0JywgTlVMTCwgTl8oIlRyYWNlIGZpbGUgb3BlbnMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic2NyaXB0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdUJ30sCi0gICAgICAnVCcsIE5fKCJGSUxFIiksIE5fKCJSZWFkIGxpbmtlciBzY3JpcHQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidW5kZWZpbmVkIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd1J30sCi0gICAgICAndScsIE5fKCJTWU1CT0wiKSwgTl8oIlN0YXJ0IHdpdGggdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBTWU1CT0wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiVXIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1VSfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJCdWlsZCBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0YWJsZXMiKSwgT05FX0RBU0ggfSwKLSAgeyB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT059LAotICAgICAgJ3YnLCBOVUxMLCBOXygiUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdWJywgTlVMTCwgTl8oIlByaW50IHZlcnNpb24gYW5kIGVtdWxhdGlvbiBpbmZvcm1hdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsiZGlzY2FyZC1hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKLSAgICAgICd4JywgTlVMTCwgTl8oIkRpc2NhcmQgYWxsIGxvY2FsIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZGlzY2FyZC1sb2NhbHMiLCBub19hcmd1bWVudCwgTlVMTCwgJ1gnfSwKLSAgICAgICdYJywgTlVMTCwgTl8oIkRpc2NhcmQgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhY2Utc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd5J30sCi0gICAgICAneScsIE5fKCJTWU1CT0wiKSwgTl8oIlRyYWNlIG1lbnRpb25zIG9mIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdZJywgTl8oIlBBVEgiKSwgTl8oIkRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHtOVUxMLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAneicsIE5fKCJLRVlXT1JEIiksIE5fKCJJZ25vcmVkIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InN0YXJ0LWdyb3VwIiwgbm9fYXJndW1lbnQsIE5VTEwsICcoJ30sCi0gICAgICAnKCcsIE5VTEwsIE5fKCJTdGFydCBhIGdyb3VwIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImVuZC1ncm91cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnKSd9LAotICAgICAgJyknLCBOVUxMLCBOXygiRW5kIGEgZ3JvdXAiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiYXNzZXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BU1NFUlR9LAotICAgICAgJ1wwJywgTl8oIktFWVdPUkQiKSwgTl8oIklnbm9yZWQgZm9yIFN1bk9TIGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7IkJkeW5hbWljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiTGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImR5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsiY2FsbF9zaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJCc3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImRuIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJub25fc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJzdGF0aWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7IkJzeW1ib2xpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1lNQk9MSUN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkJpbmQgZ2xvYmFsIHJlZmVyZW5jZXMgbG9jYWxseSIpLCBPTkVfREFTSCB9LAotICB7IHsiY2hlY2stc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NIRUNLX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJDaGVjayBzZWN0aW9uIGFkZHJlc3NlcyBmb3Igb3ZlcmxhcHMgKGRlZmF1bHQpIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5vLWNoZWNrLXNlY3Rpb25zIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19DSEVDS19TRUNUSU9OU30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG8gbm90IGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsiY3JlZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ1JFRn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiT3V0cHV0IGNyb3NzIHJlZmVyZW5jZSB0YWJsZSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkZWZzeW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRlNZTX0sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MPUVYUFJFU1NJT04iKSwgTl8oIkRlZmluZSBhIHN5bWJvbCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fREVNQU5HTEV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkeW5hbWljLWxpbmtlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFlOQU1JQ19MSU5LRVJ9LAotICAgICAgJ1wwJywgTl8oIlBST0dSQU0iKSwgTl8oIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgdG8gdXNlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImVtYmVkZGVkLXJlbG9jcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU1CRURERURfUkVMT0NTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJHZW5lcmF0ZSBlbWJlZGRlZCByZWxvY3MiKSwgVFdPX0RBU0hFU30sCi0gIHsgeyJmaW5pIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GSU5JfSwKLSAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiQ2FsbCBTWU1CT0wgYXQgdW5sb2FkLXRpbWUiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImZvcmNlLWV4ZS1zdWZmaXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVh9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkZvcmNlIGdlbmVyYXRpb24gb2YgZmlsZSB3aXRoIC5leGUgc3VmZml4IiksIFRXT19EQVNIRVN9LAotICB7IHsiZ2Mtc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dDX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJSZW1vdmUgdW51c2VkIHNlY3Rpb25zIChvbiBzb21lIHRhcmdldHMpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJuby1nYy1zZWN0aW9ucyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fR0NfU0VDVElPTlN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvbid0IHJlbW92ZSB1bnVzZWQgc2VjdGlvbnMgKGRlZmF1bHQpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUxQfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJQcmludCBvcHRpb24gaGVscCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJpbml0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTklUfSwKLSAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiQ2FsbCBTWU1CT0wgYXQgbG9hZC10aW1lIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJNYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BUH0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiV3JpdGUgYSBtYXAgZmlsZSIpLCBPTkVfREFTSCB9LAotICB7IHsibm8tZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0RFTUFOR0xFIH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG8gbm90IGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby1rZWVwLW1lbW9yeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fS0VFUF9NRU1PUll9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlVzZSBsZXNzIG1lbW9yeSBhbmQgbW9yZSBkaXNrIEkvTyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby11bmRlZmluZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1VOREVGSU5FRH0sCi0gICAgICdcMCcsIE5VTEwsIE5fKCJBbGxvdyBubyB1bmRlZmluZWQgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby13YXJuLW1pc21hdGNoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XQVJOX01JU01BVENIfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEb24ndCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQgZmlsZXMiKSwgVFdPX0RBU0hFU30sCi0gIHsgeyJuby13aG9sZS1hcmNoaXZlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XSE9MRV9BUkNISVZFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJUdXJuIG9mZiAtLXdob2xlLWFyY2hpdmUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm9pbmhpYml0LWV4ZWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PSU5ISUJJVF9FWEVDfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJDcmVhdGUgYW4gb3V0cHV0IGZpbGUgZXZlbiBpZiBlcnJvcnMgb2NjdXIiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm9pbmhpYml0X2V4ZWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PSU5ISUJJVF9FWEVDfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKLSAgeyB7Im9mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09GT1JNQVR9LAotICAgICAgJ1wwJywgTl8oIlRBUkdFVCIpLCBOXygiU3BlY2lmeSB0YXJnZXQgb2Ygb3V0cHV0IGZpbGUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsicW1hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIklnbm9yZWQgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiUmVsYXggYnJhbmNoZXMgb24gY2VydGFpbiB0YXJnZXRzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InJldGFpbi1zeW1ib2xzLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwKLSAgICAgICBPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRX0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiS2VlcCBvbmx5IHN5bWJvbHMgbGlzdGVkIGluIEZJTEUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsicnBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JQQVRIfSwKLSAgICAgICdcMCcsIE5fKCJQQVRIIiksIE5fKCJTZXQgcnVudGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBPTkVfREFTSCB9LAotICB7IHsicnBhdGgtbGluayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUlBBVEhfTElOS30sCi0gICAgICAnXDAnLCBOXygiUEFUSCIpLCBOXygiU2V0IGxpbmsgdGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBPTkVfREFTSCB9LAotICB7IHsic2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJCc2hhcmVhYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSEFSRUQgfSwgLyogRnJlZUJTRC4gICovCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsic29ydC1jb21tb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NPUlRfQ09NTU9OfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJTb3J0IGNvbW1vbiBzeW1ib2xzIGJ5IHNpemUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic29ydF9jb21tb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NPUlRfQ09NTU9OfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKLSAgeyB7InNwbGl0LWJ5LWZpbGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NQTElUX0JZX0ZJTEV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBmb3IgZWFjaCBmaWxlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InNwbGl0LWJ5LXJlbG9jIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUExJVF9CWV9SRUxPQ30sCi0gICAgICAnXDAnLCBOXygiQ09VTlQiKSwgTl8oIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBldmVyeSBDT1VOVCByZWxvY3MiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic3RhdHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQVRTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJQcmludCBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ0YXNrLWxpbmsiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RBU0tfTElOS30sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJEbyB0YXNrIGxldmVsIGxpbmtpbmciKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhZGl0aW9uYWwtZm9ybWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgbGlua2VyIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7IlRic3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RCU1N9LAotICAgICAgJ1wwJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBhZGRyZXNzIG9mIC5ic3Mgc2VjdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsiVGRhdGEiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1REQVRBfSwKLSAgICAgICdcMCcsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJUdGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFRFWFR9LAotICAgICAgJ1wwJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBhZGRyZXNzIG9mIC50ZXh0IHNlY3Rpb24iKSwgT05FX0RBU0ggfSwKLSAgeyB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIk91dHB1dCBsb3RzIG9mIGluZm9ybWF0aW9uIGR1cmluZyBsaW5rIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRsbC12ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJCT1NFfSwgLyogTGludXguICAqLwotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgTk9fSEVMUCB9LAotICB7IHsidmVyc2lvbi1zY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT05fU0NSSVBUIH0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIHNjcmlwdCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ2ZXJzaW9uLWV4cG9ydHMtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLAotICAgICBPUFRJT05fVkVSU0lPTl9FWFBPUlRTX1NFQ1RJT04gfSwKLSAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJUYWtlIGV4cG9ydCBzeW1ib2xzIGxpc3QgZnJvbSAuZXhwb3J0cywgdXNpbmdcblx0XHRcdFx0U1lNQk9MIGFzIHRoZSB2ZXJzaW9uLiIpLAotICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tY29tbW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX0NPTU1PTn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBhYm91dCBkdXBsaWNhdGUgY29tbW9uIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1jb25zdHJ1Y3RvcnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIGlmIGdsb2JhbCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgYXJlIHNlZW4iKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tbXVsdGlwbGUtZ3AiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fTVVMVElQTEVfR1B9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gaWYgdGhlIG11bHRpcGxlIEdQIHZhbHVlcyBhcmUgdXNlZCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ3YXJuLW9uY2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fT05DRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBvbmx5IG9uY2UgcGVyIHVuZGVmaW5lZCBzeW1ib2wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1zZWN0aW9uLWFsaWduIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR059LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gaWYgc3RhcnQgb2Ygc2VjdGlvbiBjaGFuZ2VzIGR1ZSB0byBhbGlnbm1lbnQiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indob2xlLWFyY2hpdmUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dIT0xFX0FSQ0hJVkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkluY2x1ZGUgYWxsIG9iamVjdHMgZnJvbSBmb2xsb3dpbmcgYXJjaGl2ZXMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid3JhcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV1JBUH0sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJVc2Ugd3JhcHBlciBmdW5jdGlvbnMgZm9yIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJtcGM4NjBjMCIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTVBDODYwQzB9LAotICAgICAgJ1wwJywgTl8oIls9V09SRFNdIiksIE5fKCJNb2RpZnkgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gbGFzdCBXT1JEUyAoMS0xMCxcblx0XHRcdFx0ZGVmYXVsdCA1KSB3b3JkcyBvZiBhIHBhZ2UiKSwgVFdPX0RBU0hFUyB9Ci19OwotCi0jZGVmaW5lIE9QVElPTl9DT1VOVCAoKGludCkgKHNpemVvZiBsZF9vcHRpb25zIC8gc2l6ZW9mIGxkX29wdGlvbnNbMF0pKQotCi0vKiBUZXN0IFNUUklORyBmb3IgY29udGFpbmluZyBhIHN0cmluZyBvZiBkaWdpdHMgdGhhdCBmb3JtIGEgbnVtYmVyCi0gICBiZXR3ZWVuIE1JTiBhbmQgTUFYLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9yIEVSUi4gICovCi0KLXN0YXRpYyBpbnQKLWlzX251bSAoc3RyaW5nLCBtaW4sIG1heCwgZXJyKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGludCBtaW47Ci0gICAgIGludCBtYXg7Ci0gICAgIGludCBlcnI7Ci17Ci0gIGludCByZXN1bHQgPSAwOwotCi0gIGZvciAoOyAqc3RyaW5nOyArK3N0cmluZykKLSAgICB7Ci0gICAgICBpZiAoISBpc2RpZ2l0ICgqc3RyaW5nKSkKLQl7Ci0JICByZXN1bHQgPSBlcnI7Ci0JICBicmVhazsKLQl9Ci0gICAgICByZXN1bHQgPSByZXN1bHQgKiAxMCArICgqc3RyaW5nIC0gJzAnKTsKLSAgICB9Ci0gIGlmIChyZXN1bHQgPCBtaW4gfHwgcmVzdWx0ID4gbWF4KQotICAgIHJlc3VsdCA9IGVycjsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkCi1wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBpLCBpcywgaWw7Ci0gIGludCBpbmdyb3VwID0gMDsKLSAgY2hhciAqZGVmYXVsdF9kaXJsaXN0ID0gTlVMTDsKLSAgY2hhciBzaG9ydG9wdHNbT1BUSU9OX0NPVU5UICogMyArIDJdOwotICBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW09QVElPTl9DT1VOVCArIDFdOwotICBpbnQgbGFzdF9vcHRpbmQ7Ci0KLSAgLyogU3RhcnRpbmcgdGhlIHNob3J0IG9wdGlvbiBzdHJpbmcgd2l0aCAnLScgaXMgZm9yIHByb2dyYW1zIHRoYXQKLSAgICAgZXhwZWN0IG9wdGlvbnMgYW5kIG90aGVyIEFSR1YtZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCB0aGF0IGNhcmUgYWJvdXQKLSAgICAgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28uICBXZSBkZXNjcmliZSBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50Ci0gICAgIGFzIGlmIGl0IHdlcmUgdGhlIGFyZ3VtZW50IG9mIGFuIG9wdGlvbiB3aXRoIGNoYXJhY3RlciBjb2RlIDEuICAqLwotICBzaG9ydG9wdHNbMF0gPSAnLSc7Ci0gIGlzID0gMTsKLSAgaWwgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgT1BUSU9OX0NPVU5UOyBpKyspCi0gICAgewotICAgICAgaWYgKGxkX29wdGlvbnNbaV0uc2hvcnRvcHQgIT0gJ1wwJykKLQl7Ci0JICBzaG9ydG9wdHNbaXNdID0gbGRfb3B0aW9uc1tpXS5zaG9ydG9wdDsKLQkgICsraXM7Ci0JICBpZiAobGRfb3B0aW9uc1tpXS5vcHQuaGFzX2FyZyA9PSByZXF1aXJlZF9hcmd1bWVudAotCSAgICAgIHx8IGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JICAgIHsKLQkgICAgICBzaG9ydG9wdHNbaXNdID0gJzonOwotCSAgICAgICsraXM7Ci0JICAgICAgaWYgKGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JCXsKLQkJICBzaG9ydG9wdHNbaXNdID0gJzonOwotCQkgICsraXM7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGlmIChsZF9vcHRpb25zW2ldLm9wdC5uYW1lICE9IE5VTEwpCi0JewotCSAgbG9uZ29wdHNbaWxdID0gbGRfb3B0aW9uc1tpXS5vcHQ7Ci0JICArK2lsOwotCX0KLSAgICB9Ci0gIHNob3J0b3B0c1tpc10gPSAnXDAnOwotICBsb25nb3B0c1tpbF0ubmFtZSA9IE5VTEw7Ci0KLSAgLyogVGhlIC1HIG9wdGlvbiBpcyBhbWJpZ3VvdXMgb24gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIFNvbWV0aW1lcyBpdAotICAgICBzcGVjaWZpZXMgdGhlIGxhcmdlc3QgZGF0YSBzaXplIHRvIHB1dCBpbnRvIHRoZSBzbWFsbCBkYXRhCi0gICAgIHNlY3Rpb24uICBTb21ldGltZXMgaXQgaXMgZXF1aXZhbGVudCB0byAtLXNoYXJlZC4gIFVuZm9ydHVuYXRlbHksCi0gICAgIHRoZSBmaXJzdCBmb3JtIHRha2VzIGFuIGFyZ3VtZW50LCB3aGlsZSB0aGUgc2Vjb25kIGRvZXMgbm90LgotCi0gICAgIFdlIG5lZWQgdG8gcGVybWl0IHRoZSAtLXNoYXJlZCBmb3JtIGJlY2F1c2Ugb24gc29tZSBwbGF0Zm9ybXMsCi0gICAgIHN1Y2ggYXMgU29sYXJpcywgZ2NjIC1zaGFyZWQgd2lsbCBwYXNzIC1HIHRvIHRoZSBsaW5rZXIuCi0KLSAgICAgVG8gcGVybWl0IGVpdGhlciB1c2FnZSwgd2UgbG9vayB0aHJvdWdoIHRoZSBhcmd1bWVudCBsaXN0LiAgSWYgd2UKLSAgICAgZmluZCAtRyBub3QgZm9sbG93ZWQgYnkgYSBudW1iZXIsIHdlIGNoYW5nZSBpdCBpbnRvIC0tc2hhcmVkLgotICAgICBUaGlzIHdpbGwgd29yayBmb3IgbW9zdCBub3JtYWwgY2FzZXMuICAqLwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItRyIpID09IDAKLQkmJiAoaSArIDEgPj0gYXJnYwotCSAgICB8fCAhIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBhcmd2W2kgKyAxXVswXSkpKQotICAgICAgYXJndltpXSA9IChjaGFyICopICItLXNoYXJlZCI7Ci0KLSAgLyogQmVjYXVzZSB3ZSBwZXJtaXQgbG9uZyBvcHRpb25zIHRvIHN0YXJ0IHdpdGggYSBzaW5nbGUgZGFzaCwgYW5kCi0gICAgIHdlIGhhdmUgYSAtLWxpYnJhcnkgb3B0aW9uLCBhbmQgdGhlIC1sIG9wdGlvbiBpcyBjb252ZW50aW9uYWxseQotICAgICB1c2VkIHdpdGggYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFyZ3VtZW50LCB3ZSBjYW4gaGF2ZSBiYWQKLSAgICAgcmVzdWx0cyBpZiBzb21lYm9keSB0cmllcyB0byB1c2UgLWwgd2l0aCBhIGxpYnJhcnkgd2hvc2UgbmFtZQotICAgICBoYXBwZW5zIHRvIHN0YXJ0IHdpdGggImlicmFyeSIsIGFzIGluIC1saS4gIFdlIGF2b2lkIHByb2JsZW1zIGJ5Ci0gICAgIHNpbXBseSB0dXJuaW5nIC1sIGludG8gLS1saWJyYXJ5LiAgVGhpcyBtZWFucyB0aGF0IHVzZXJzIHdpbGwKLSAgICAgaGF2ZSB0byB1c2UgdHdvIGRhc2hlcyBpbiBvcmRlciB0byB1c2UgLS1saWJyYXJ5LCB3aGljaCBpcyBPSwotICAgICBzaW5jZSB0aGF0J3MgaG93IGl0IGlzIGRvY3VtZW50ZWQuCi0KLSAgICAgRklYTUU6IEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHByb2JsZW0gY2FuIGFyaXNlIGZvciBvdGhlciBzaG9ydAotICAgICBvcHRpb25zIGFzIHdlbGwsIGFsdGhvdWdoIHRoZSB1c2VyIGRvZXMgYWx3YXlzIGhhdmUgdGhlIHJlY291cnNlCi0gICAgIG9mIGFkZGluZyBhIHNwYWNlIGJldHdlZW4gdGhlIG9wdGlvbiBhbmQgdGhlIGFyZ3VtZW50LiAgKi8KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXJndltpXVswXSA9PSAnLScKLQkgICYmIGFyZ3ZbaV1bMV0gPT0gJ2wnCi0JICAmJiBhcmd2W2ldWzJdICE9ICdcMCcpCi0JewotCSAgY2hhciAqbjsKLQotCSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoYXJndltpXSkgKyAyMCk7Ci0JICBzcHJpbnRmIChuLCAiLS1saWJyYXJ5PSVzIiwgYXJndltpXSArIDIpOwotCSAgYXJndltpXSA9IG47Ci0JfQotICAgIH0KLQotICBsYXN0X29wdGluZCA9IC0xOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgbG9uZ2luZDsKLSAgICAgIGludCBvcHRjOwotCi0gICAgICAvKiBVc2luZyBsYXN0X29wdGluZCBsZXRzIHVzIGF2b2lkIGNhbGxpbmcgbGRlbXVsX3BhcnNlX2FyZ3MKLQkgbXVsdGlwbGUgdGltZXMgb24gYSBzaW5nbGUgb3B0aW9uLCB3aGljaCB3b3VsZCBsZWFkIHRvCi0JIGNvbmZ1c2lvbiBpbiB0aGUgaW50ZXJuYWwgc3RhdGljIHZhcmlhYmxlcyBtYWludGFpbmVkIGJ5Ci0JIGdldG9wdC4gIFRoaXMgY291bGQgb3RoZXJ3aXNlIGhhcHBlbiBmb3IgYW4gYXJndW1lbnQgbGlrZQotCSAtbngsIGluIHdoaWNoIHRoZSAtbiBpcyBwYXJzZWQgYXMgYSBzaW5nbGUgb3B0aW9uLCBhbmQgd2UKLQkgbG9vcCBhcm91bmQgdG8gcGljayB1cCB0aGUgLXguICAqLwotICAgICAgaWYgKG9wdGluZCAhPSBsYXN0X29wdGluZCkKLQl7Ci0JICBpZiAobGRlbXVsX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpKQotCSAgICBjb250aW51ZTsKLQkgIGxhc3Rfb3B0aW5kID0gb3B0aW5kOwotCX0KLQotICAgICAgLyogZ2V0b3B0X2xvbmdfb25seSBpcyBsaWtlIGdldG9wdF9sb25nLCBidXQgJy0nIGFzIHdlbGwgYXMgJy0tJwotCSBjYW4gaW5kaWNhdGUgYSBsb25nIG9wdGlvbi4gICovCi0gICAgICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgc2hvcnRvcHRzLCBsb25nb3B0cywgJmxvbmdpbmQpOwotCi0gICAgICBpZiAob3B0YyA9PSAtMSkKLQlicmVhazsKLSAgICAgIHN3aXRjaCAob3B0YykKLQl7Ci0JZGVmYXVsdDoKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgXygiJXM6IHVzZSB0aGUgLS1oZWxwIG9wdGlvbiBmb3IgdXNhZ2UgaW5mb3JtYXRpb25cbiIpLAotCQkgICBwcm9ncmFtX25hbWUpOwotCSAgeGV4aXQgKDEpOwotCWNhc2UgMToJCQkvKiBGaWxlIG5hbWUuICAqLwotCSAgbGFuZ19hZGRfaW5wdXRfZmlsZSAob3B0YXJnLCBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtLAotCQkJICAgICAgIChjaGFyICopIE5VTEwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9JR05PUkU6Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIC8qIEZvciBIUC9VWCBjb21wYXRpYmlsaXR5LiAgQWN0dWFsbHkgLWEgc2hhcmVkIHNob3VsZCBtZWFuCi0gICAgICAgICAgICAgYGB1c2Ugb25seSBzaGFyZWQgbGlicmFyaWVzJycgYnV0LCB0aGVuLCB3ZSBkb24ndAotICAgICAgICAgICAgIGN1cnJlbnRseSBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gSFAvVVggYW55aG93LiAgKi8KLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgImFyY2hpdmUiKSA9PSAwKQotCSAgICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgInNoYXJlZCIpID09IDAKLQkJICAgfHwgc3RyY21wIChvcHRhcmcsICJkZWZhdWx0IikgPT0gMCkKLQkgICAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlUCVGOiB1bnJlY29nbml6ZWQgLWEgb3B0aW9uIGAlcydcbiIpLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQVNTRVJUOgotCSAgLyogRklYTUU6IFdlIGp1c3QgaWdub3JlIHRoZXNlLCBidXQgd2Ugc2hvdWxkIGhhbmRsZSB0aGVtLiAgKi8KLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgImRlZmluaXRpb25zIikgPT0gMCkKLQkgICAgOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJub2RlZmluaXRpb25zIikgPT0gMCkKLQkgICAgOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJub3N5bWJvbGljIikgPT0gMCkKLQkgICAgOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJwdXJlLXRleHQiKSA9PSAwKQotCSAgICA7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlUCVGOiB1bnJlY29nbml6ZWQgLWFzc2VydCBvcHRpb24gYCVzJ1xuIiksIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdBJzoKLQkgIGxkZmlsZV9hZGRfYXJjaCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgbGFuZ19hZGRfdGFyZ2V0IChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG9wdGFyZyk7Ci0JICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9tcmlfc2NyaXB0OwotCSAgeXlwYXJzZSAoKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NBTExfU0hBUkVEOgotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT05fU0hBUkVEOgotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ1JFRjoKLQkgIGNvbW1hbmRfbGluZS5jcmVmID0gdHJ1ZTsKLQkgIGxpbmtfaW5mby5ub3RpY2VfYWxsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgY29tbWFuZF9saW5lLmZvcmNlX2NvbW1vbl9kZWZpbml0aW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RFRlNZTToKLQkgIGxleF9zdHJpbmcgPSBvcHRhcmc7Ci0JICBsZXhfcmVkaXJlY3QgKG9wdGFyZyk7Ci0JICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9kZWZzeW07Ci0JICBwYXJzaW5nX2RlZnN5bSA9IDE7Ci0JICB5eXBhcnNlICgpOwotCSAgcGFyc2luZ19kZWZzeW0gPSAwOwotCSAgbGV4X3N0cmluZyA9IE5VTEw7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERU1BTkdMRToKLQkgIGRlbWFuZ2xpbmcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRFlOQU1JQ19MSU5LRVI6Ci0JICBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FQjoKLQkgIGNvbW1hbmRfbGluZS5lbmRpYW4gPSBFTkRJQU5fQklHOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRUw6Ci0JICBjb21tYW5kX2xpbmUuZW5kaWFuID0gRU5ESUFOX0xJVFRMRTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VNQkVEREVEX1JFTE9DUzoKLQkgIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRVhQT1JUX0RZTkFNSUM6Ci0JY2FzZSAnRSc6IC8qIEhQL1VYIGNvbXBhdGliaWxpdHkuICAqLwotCSAgY29tbWFuZF9saW5lLmV4cG9ydF9keW5hbWljID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgbGFuZ19hZGRfZW50cnkgKG9wdGFyZywgdHJ1ZSk7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGlmIChjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycyA9Ci0JCShjaGFyICoqKSB4bWFsbG9jICgyICogc2l6ZW9mIChjaGFyICopKTsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnNbMF0gPSBvcHRhcmc7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzWzFdID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGM7Ci0JICAgICAgY2hhciAqKnA7Ci0KLQkgICAgICBjID0gMDsKLQkgICAgICBmb3IgKHAgPSBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnM7ICpwICE9IE5VTEw7IHArKykKLQkJKytjOwotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycyA9Ci0JCShjaGFyICoqKSB4cmVhbGxvYyAoY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzLAotCQkJCSAgICAoYyArIDIpICogc2l6ZW9mIChjaGFyICopKTsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnNbY10gPSBvcHRhcmc7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzW2MgKyAxXSA9IE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgY29tbWFuZF9saW5lLmZpbHRlcl9zaGxpYiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVg6Ci0JICBjb21tYW5kX2xpbmUuZm9yY2VfZXhlX3N1ZmZpeCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdHJzoKLQkgIHsKLQkgICAgY2hhciAqZW5kOwotCSAgICBnX3N3aXRjaF92YWx1ZSA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0JICAgIGlmICgqZW5kKQotCSAgICAgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIG51bWJlciBgJXMnXG4iKSwgb3B0YXJnKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgLyogSWdub3JlLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0dDX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0hFTFA6Ci0JICBoZWxwICgpOwotCSAgeGV4aXQgKDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0JICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAob3B0YXJnLCB0cnVlKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgbGFuZ19hZGRfaW5wdXRfZmlsZSAob3B0YXJnLCBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotCQkJICAgICAgIChjaGFyICopIE5VTEwpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTSc6Ci0JICBjb25maWcubWFwX2ZpbGVuYW1lID0gIi0iOwotCSAgYnJlYWs7Ci0JY2FzZSAnbSc6Ci0JICAvKiBJZ25vcmUuICBXYXMgaGFuZGxlZCBpbiBhIHByZS1wYXJzZS4gICAqLwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTUFQOgotCSAgY29uZmlnLm1hcF9maWxlbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gZmFsc2U7Ci0JICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgPSBmYWxzZTsKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0RFTUFOR0xFOgotCSAgZGVtYW5nbGluZyA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fR0NfU0VDVElPTlM6Ci0JICBjb21tYW5kX2xpbmUuZ2Nfc2VjdGlvbnMgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0tFRVBfTUVNT1JZOgotCSAgbGlua19pbmZvLmtlZXBfbWVtb3J5ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19VTkRFRklORUQ6Ci0JICBsaW5rX2luZm8ubm9fdW5kZWZpbmVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX1dBUk5fTUlTTUFUQ0g6Ci0JICBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9JTkhJQklUX0VYRUM6Ci0JICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fV0hPTEVfQVJDSElWRToKLQkgIHdob2xlX2FyY2hpdmUgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCSAgLyogRklYTUUgIi1PPG5vbi1kaWdpdHM+IDx2YWx1ZT4iIHVzZWQgdG8gc2V0IHRoZSBhZGRyZXNzIG9mCi0JICAgICBzZWN0aW9uIDxub24tZGlnaXRzPi4gIFdhcyB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLQkgICAgIHNvbWV0aGluZywgb3IgY2FuIHdlIGNyZWF0ZSBhIG5ldyBvcHRpb24gdG8gZG8gdGhhdAotCSAgICAgKHdpdGggYSBzeW50YXggc2ltaWxhciB0byAtZGVmc3ltKT8KLQkgICAgIGdldG9wdCBjYW4ndCBoYW5kbGUgdHdvIGFyZ3MgdG8gYW4gb3B0aW9uIHdpdGhvdXQga2x1ZGdlcy4gICovCi0KLQkgIC8qIEVuYWJsZSBvcHRpbWl6YXRpb25zIG9mIG91dHB1dCBmaWxlcy4gICovCi0JICBsaW5rX2luZm8ub3B0aW1pemUgPSBzdHJ0b3VsIChvcHRhcmcsIE5VTEwsIDApID8gdHJ1ZSA6IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBsYW5nX2FkZF9vdXRwdXQgKG9wdGFyZywgMCk7IAotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fT0ZPUk1BVDoKLQkgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQgKG9wdGFyZywgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTCwgMCk7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQljYXNlICdyJzoKLQkgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSB0cnVlOwotCSAgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9IGZhbHNlOwotCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOwotCSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIC8qIFRoZSBHTlUgbGlua2VyIHRyYWRpdGlvbmFsbHkgdXNlcyAtUiB0byBtZWFuIHRvIGluY2x1ZGUKLQkgICAgIG9ubHkgdGhlIHN5bWJvbHMgZnJvbSBhIGZpbGUuICBUaGUgU29sYXJpcyBsaW5rZXIgdXNlcyAtUgotCSAgICAgdG8gc2V0IHRoZSBwYXRoIHVzZWQgYnkgdGhlIHJ1bnRpbWUgbGlua2VyIHRvIGZpbmQKLQkgICAgIGxpYnJhcmllcy4gIFRoaXMgaXMgdGhlIEdOVSBsaW5rZXIgLXJwYXRoIGFyZ3VtZW50LiAgV2UKLQkgICAgIHRyeSB0byBzdXBwb3J0IGJvdGggc2ltdWx0YW5lb3VzbHkgYnkgY2hlY2tpbmcgdGhlIGZpbGUKLQkgICAgIG5hbWVkLiAgSWYgaXQgaXMgYSBkaXJlY3RvcnksIHJhdGhlciB0aGFuIGEgcmVndWxhciBmaWxlLAotCSAgICAgd2UgYXNzdW1lIC1ycGF0aCB3YXMgbWVhbnQuICAqLwotCSAgewotCSAgICBzdHJ1Y3Qgc3RhdCBzOwotCi0JICAgIGlmIChzdGF0IChvcHRhcmcsICZzKSA+PSAwCi0JCSYmICEgU19JU0RJUiAocy5zdF9tb2RlKSkKLQkgICAgICB7Ci0JCWxhbmdfYWRkX2lucHV0X2ZpbGUgKG9wdGFyZywKLQkJCQkgICAgIGxhbmdfaW5wdXRfZmlsZV9pc19zeW1ib2xzX29ubHlfZW51bSwKLQkJCQkgICAgIChjaGFyICopIE5VTEwpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgT1BUSU9OX1JQQVRIOgotCSAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCSAgICBjb21tYW5kX2xpbmUucnBhdGggPSBidXlzdHJpbmcgKG9wdGFyZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzaXplX3QgcnBhdGhfbGVuID0gc3RybGVuIChjb21tYW5kX2xpbmUucnBhdGgpOwotCSAgICAgIHNpemVfdCBvcHRhcmdfbGVuID0gc3RybGVuIChvcHRhcmcpOwotCSAgICAgIGNoYXIgKmJ1ZjsKLQkgICAgICBjaGFyICpjcCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLQotCSAgICAgIC8qIEZpcnN0IHNlZSB3aGV0aGVyIE9QVEFSRyBpcyBhbHJlYWR5IGluIHRoZSBwYXRoLiAgKi8KLQkgICAgICBkbwotCQl7Ci0JCSAgc2l6ZV90IGlkeCA9IDA7Ci0JCSAgd2hpbGUgKG9wdGFyZ1tpZHhdICE9ICdcMCcgJiYgb3B0YXJnW2lkeF0gPT0gY3BbaWR4XSkKLQkJICAgICsraWR4OwotCQkgIGlmIChvcHRhcmdbaWR4XSA9PSAnXDAnCi0JCSAgICAgICYmIChjcFtpZHhdID09ICdcMCcgfHwgY3BbaWR4XSA9PSAnOicpKQotCQkgICAgLyogV2UgZm91bmQgaXQuICAqLwotCQkgICAgYnJlYWs7Ci0KLQkJICAvKiBOb3QgeWV0IGZvdW5kLiAgKi8KLQkJICBjcCA9IHN0cmNociAoY3AsICc6Jyk7Ci0JCSAgaWYgKGNwICE9IE5VTEwpCi0JCSAgICArK2NwOwotCQl9Ci0JICAgICAgd2hpbGUgKGNwICE9IE5VTEwpOwotCi0JICAgICAgaWYgKGNwID09IE5VTEwpCi0JCXsKLQkJICBidWYgPSB4bWFsbG9jIChycGF0aF9sZW4gKyBvcHRhcmdfbGVuICsgMik7Ci0JCSAgc3ByaW50ZiAoYnVmLCAiJXM6JXMiLCBjb21tYW5kX2xpbmUucnBhdGgsIG9wdGFyZyk7Ci0JCSAgZnJlZSAoY29tbWFuZF9saW5lLnJwYXRoKTsKLQkJICBjb21tYW5kX2xpbmUucnBhdGggPSBidWY7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fUlBBVEhfTElOSzoKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMKQotCSAgICBjb21tYW5kX2xpbmUucnBhdGhfbGluayA9IGJ1eXN0cmluZyAob3B0YXJnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmJ1ZjsKLQotCSAgICAgIGJ1ZiA9IHhtYWxsb2MgKHN0cmxlbiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmspCi0JCQkgICAgICsgc3RybGVuIChvcHRhcmcpCi0JCQkgICAgICsgMik7Ci0JICAgICAgc3ByaW50ZiAoYnVmLCAiJXM6JXMiLCBjb21tYW5kX2xpbmUucnBhdGhfbGluaywgb3B0YXJnKTsKLQkgICAgICBmcmVlIChjb21tYW5kX2xpbmUucnBhdGhfbGluayk7Ci0JICAgICAgY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPSBidWY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JFTEFYOgotCSAgY29tbWFuZF9saW5lLnJlbGF4ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEU6Ci0JICBhZGRfa2VlcHN5bXNfZmlsZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfZGVidWdnZXI7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX2FsbDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NIQVJFRDoKLQkgIGlmIChjb25maWcuaGFzX3NoYXJlZCkKLQkgICAgbGlua19pbmZvLnNoYXJlZCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlUCVGOiAtc2hhcmVkIG5vdCBzdXBwb3J0ZWRcbiIpKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgkJLyogVXNlZCBvbiBTb2xhcmlzLiAgKi8KLQljYXNlIE9QVElPTl9TT05BTUU6Ci0JICBjb21tYW5kX2xpbmUuc29uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU09SVF9DT01NT046Ci0JICBjb25maWcuc29ydF9jb21tb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RBVFM6Ci0JICBjb25maWcuc3RhdHMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1lNQk9MSUM6Ci0JICBsaW5rX2luZm8uc3ltYm9saWMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICB0cmFjZV9maWxlcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAob3B0YXJnKTsKLQkgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NjcmlwdDsKLQkgIHl5cGFyc2UgKCk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UQlNTOgotCSAgc2V0X3NlY3Rpb25fc3RhcnQgKCIuYnNzIiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1REQVRBOgotCSAgc2V0X3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UVEVYVDoKLQkgIHNldF9zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUOgotCSAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UQVNLX0xJTks6Ci0JICBsaW5rX2luZm8udGFza19saW5rID0gdHJ1ZTsKLQkgIC8qIEZhbGwgdGhyb3VnaCAtIGRvIGFuIGltcGxpZWQgLXIgb3B0aW9uLiAgKi8KLQljYXNlIE9QVElPTl9VUjoKLQkgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSB0cnVlOwotCSAgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9IHRydWU7Ci0JICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7Ci0JICBjb25maWcudGV4dF9yZWFkX29ubHkgPSBmYWxzZTsKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3UnOgotCSAgbGRsYW5nX2FkZF91bmRlZiAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1ZFUkJPU0U6Ci0JICBsZHZlcnNpb24gKDEpOwotCSAgdmVyc2lvbl9wcmludGVkID0gdHJ1ZTsKLQkgIHRyYWNlX2ZpbGVfdHJpZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICBsZHZlcnNpb24gKDApOwotCSAgdmVyc2lvbl9wcmludGVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgbGR2ZXJzaW9uICgxKTsKLQkgIHZlcnNpb25fcHJpbnRlZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OOgotCSAgLyogVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LiAgKi8KLQkgIHByaW50ZiAoIkdOVSBsZCAlc1xuIiwgbGRfcHJvZ3JhbV92ZXJzaW9uKTsKLQkgIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0JICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKLQkgIHsKLQkgICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKnB0ciA9IGxkX2VtdWxhdGlvbnM7Ci0gICAgCi0JICAgIHByaW50ZiAoXygiICBTdXBwb3J0ZWQgZW11bGF0aW9uczpcbiIpKTsKLQkgICAgd2hpbGUgKCpwdHIpIAotCSAgICAgIHsKLQkJcHJpbnRmICgiICAgJXNcbiIsICgqcHRyKS0+ZW11bGF0aW9uX25hbWUpOwotCQlwdHIrKzsKLQkgICAgICB9Ci0JICB9Ci0JICB4ZXhpdCAoMCk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OX1NDUklQVDoKLQkgIC8qIFRoaXMgb3B0aW9uIGluZGljYXRlcyBhIHNtYWxsIHNjcmlwdCB0aGF0IG9ubHkgc3BlY2lmaWVzCi0gICAgICAgICAgICAgdmVyc2lvbiBpbmZvcm1hdGlvbi4gIFJlYWQgaXQsIGJ1dCBkb24ndCBhc3N1bWUgdGhhdAotICAgICAgICAgICAgIHdlJ3ZlIHNlZW4gYSBsaW5rZXIgc2NyaXB0LiAgKi8KLQkgIHsKLQkgICAgYm9vbGVhbiBob2xkX2hhZF9zY3JpcHQ7Ci0KLQkgICAgaG9sZF9oYWRfc2NyaXB0ID0gaGFkX3NjcmlwdDsKLQkgICAgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChvcHRhcmcpOwotCSAgICBoYWRfc2NyaXB0ID0gaG9sZF9oYWRfc2NyaXB0OwotCSAgICBwYXJzZXJfaW5wdXQgPSBpbnB1dF92ZXJzaW9uX3NjcmlwdDsKLQkgICAgeXlwYXJzZSAoKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OOgotCSAgLyogVGhpcyBvcHRpb24gcmVjb3JkcyBhIHZlcnNpb24gc3ltYm9sIHRvIGJlIGFwcGxpZWQgdG8gdGhlCi0JICAgICBzeW1ib2xzIGxpc3RlZCBmb3IgZXhwb3J0IHRvIGJlIGZvdW5kIGluIHRoZSBvYmplY3QgZmlsZXMKLQkgICAgIC5leHBvcnRzIHNlY3Rpb25zLiAgKi8KLQkgIGNvbW1hbmRfbGluZS52ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fQ09NTU9OOgotCSAgY29uZmlnLndhcm5fY29tbW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTOgotCSAgY29uZmlnLndhcm5fY29uc3RydWN0b3JzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fTVVMVElQTEVfR1A6Ci0JICBjb25maWcud2Fybl9tdWx0aXBsZV9ncCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX09OQ0U6Ci0JICBjb25maWcud2Fybl9vbmNlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fU0VDVElPTl9BTElHTjoKLQkgIGNvbmZpZy53YXJuX3NlY3Rpb25fYWxpZ24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV0hPTEVfQVJDSElWRToKLQkgIHdob2xlX2FyY2hpdmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV1JBUDoKLQkgIGFkZF93cmFwIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICBsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfbDsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgbGlua19pbmZvLmRpc2NhcmQgPSBkaXNjYXJkX2FsbDsKLQkgIGJyZWFrOwotCWNhc2UgJ1knOgotCSAgaWYgKHN0cm5jbXAgKG9wdGFyZywgIlAsIiwgMikgPT0gMCkKLQkgICAgb3B0YXJnICs9IDI7Ci0JICBkZWZhdWx0X2Rpcmxpc3QgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAneSc6Ci0JICBhZGRfeXN5bSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3onOgotCSAgLyogV2UgYWNjZXB0IGFuZCBpZ25vcmUgdGhpcyBvcHRpb24gZm9yIFNvbGFyaXMKLSAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LiAgQWN0dWFsbHksIG9uIFNvbGFyaXMsIG9wdGFyZyBpcyBub3QKLSAgICAgICAgICAgICBpZ25vcmVkLiAgU29tZWRheSB3ZSBzaG91bGQgaGFuZGxlIGl0IGNvcnJlY3RseS4gIEZJWE1FLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NQTElUX0JZX1JFTE9DOgotCSAgY29uZmlnLnNwbGl0X2J5X3JlbG9jID0gc3RydG91bCAob3B0YXJnLCBOVUxMLCAwKTsKLQkgIGJyZWFrOyAKLQljYXNlIE9QVElPTl9TUExJVF9CWV9GSUxFOgotCSAgY29uZmlnLnNwbGl0X2J5X2ZpbGUgPSB0cnVlOwotCSAgYnJlYWs7IAotCWNhc2UgT1BUSU9OX0NIRUNLX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICcoJzoKLQkgIGlmIChpbmdyb3VwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IG1heSBub3QgbmVzdCBncm91cHMgKC0taGVscCBmb3IgdXNhZ2UpXG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgeGV4aXQgKDEpOwotCSAgICB9Ci0JICBsYW5nX2VudGVyX2dyb3VwICgpOwotCSAgaW5ncm91cCA9IDE7Ci0JICBicmVhazsKLQljYXNlICcpJzoKLQkgIGlmICghIGluZ3JvdXApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogZ3JvdXAgZW5kZWQgYmVmb3JlIGl0IGJlZ2FuICgtLWhlbHAgZm9yIHVzYWdlKVxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIHhleGl0ICgxKTsKLQkgICAgfQotCSAgbGFuZ19sZWF2ZV9ncm91cCAoKTsKLQkgIGluZ3JvdXAgPSAwOwotCSAgYnJlYWs7Ci0gICAgICBjYXNlIE9QVElPTl9NUEM4NjBDMDoKLSAgICAgICAgICBsaW5rX2luZm8ubXBjODYwYzAgPSAyMDsgICAgICAvKiBkZWZhdWx0IHZhbHVlIChpbiBieXRlcykgKi8KLSAgICAgICAgICBpZiAob3B0YXJnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCB3b3JkczsKLQotICAgICAgICAgICAgICB3b3JkcyA9IGlzX251bSAob3B0YXJnLCAxLCAxMCwgMCk7Ci0gICAgICAgICAgICAgIGlmICh3b3JkcyA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJCSAgIF8oIiVzOiBJbnZhbGlkIGFyZ3VtZW50IHRvIG9wdGlvbiBcIm1wYzg2MGMwXCJcbiIpLAotCQkJICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgICAgICAgICAgICAgIHhleGl0ICgxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGxpbmtfaW5mby5tcGM4NjBjMCA9IHdvcmRzICogNDsgICAvKiBjb252ZXJ0IHdvcmRzIHRvIGJ5dGVzICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZF9saW5lLnJlbGF4ID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0lOSVQ6Ci0JICBsaW5rX2luZm8uaW5pdF9mdW5jdGlvbiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBPUFRJT05fRklOSToKLQkgIGxpbmtfaW5mby5maW5pX2Z1bmN0aW9uID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaW5ncm91cCkKLSAgICBsYW5nX2xlYXZlX2dyb3VwICgpOwotCi0gIGlmIChkZWZhdWx0X2Rpcmxpc3QgIT0gTlVMTCkKLSAgICBzZXRfZGVmYXVsdF9kaXJsaXN0IChkZWZhdWx0X2Rpcmxpc3QpOwotCi19Ci0KLS8qIEFkZCB0aGUgKGNvbG9uLXNlcGFyYXRlZCkgZWxlbWVudHMgb2YgRElSTElTVF9QVFIgdG8gdGhlCi0gICBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9kZWZhdWx0X2Rpcmxpc3QgKGRpcmxpc3RfcHRyKQotICAgICBjaGFyICpkaXJsaXN0X3B0cjsKLXsKLSAgY2hhciAqcDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBwID0gc3RyY2hyIChkaXJsaXN0X3B0ciwgUEFUSF9TRVBBUkFUT1IpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLQkqcCA9ICdcMCc7Ci0gICAgICBpZiAoKmRpcmxpc3RfcHRyICE9ICdcMCcpCi0JbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGRpcmxpc3RfcHRyLCB0cnVlKTsKLSAgICAgIGlmIChwID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICBkaXJsaXN0X3B0ciA9IHAgKyAxOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNldF9zZWN0aW9uX3N0YXJ0IChzZWN0LCB2YWxzdHIpCi0gICAgIGNoYXIgKnNlY3QsICp2YWxzdHI7Ci17Ci0gIGNoYXIgKmVuZDsKLSAgdW5zaWduZWQgbG9uZyB2YWwgPSBzdHJ0b3VsICh2YWxzdHIsICZlbmQsIDE2KTsKLSAgaWYgKCplbmQpCi0gICAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBgJXMnXG4iKSwgdmFsc3RyKTsKLSAgbGFuZ19zZWN0aW9uX3N0YXJ0IChzZWN0LCBleHBfaW50b3AgKHZhbCkpOwotfQotDAotLyogUHJpbnQgaGVscCBtZXNzYWdlcyBmb3IgdGhlIG9wdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotaGVscCAoKQotewotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqKnRhcmdldHMsICoqcHA7Ci0KLSAgcHJpbnRmIChfKCJVc2FnZTogJXMgW29wdGlvbnNdIGZpbGUuLi5cbiIpLCBwcm9ncmFtX25hbWUpOwotCi0gIHByaW50ZiAoXygiT3B0aW9uczpcbiIpKTsKLSAgZm9yIChpID0gMDsgaSA8IE9QVElPTl9DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChsZF9vcHRpb25zW2ldLmRvYyAhPSBOVUxMKQotCXsKLQkgIGJvb2xlYW4gY29tbWE7Ci0JICBpbnQgbGVuOwotCSAgaW50IGo7Ci0KLQkgIHByaW50ZiAoIiAgIik7Ci0KLQkgIGNvbW1hID0gZmFsc2U7Ci0JICBsZW4gPSAyOwotCi0JICBqID0gaTsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBpZiAobGRfb3B0aW9uc1tqXS5zaG9ydG9wdCAhPSAnXDAnCi0JCSAgJiYgbGRfb3B0aW9uc1tqXS5jb250cm9sICE9IE5PX0hFTFApCi0JCXsKLQkJICBwcmludGYgKCIlcy0lYyIsIGNvbW1hID8gIiwgIiA6ICIiLCBsZF9vcHRpb25zW2pdLnNob3J0b3B0KTsKLQkJICBsZW4gKz0gKGNvbW1hID8gMiA6IDApICsgMjsKLQkJICBpZiAobGRfb3B0aW9uc1tqXS5hcmcgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGxkX29wdGlvbnNbal0ub3B0Lmhhc19hcmcgIT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JCQl7Ci0JCQkgIHByaW50ZiAoIiAiKTsKLQkJCSAgKytsZW47Ci0JCQl9Ci0JCSAgICAgIHByaW50ZiAoIiVzIiwgXyhsZF9vcHRpb25zW2pdLmFyZykpOwotCQkgICAgICBsZW4gKz0gc3RybGVuIChfKGxkX29wdGlvbnNbal0uYXJnKSk7Ci0JCSAgICB9Ci0JCSAgY29tbWEgPSB0cnVlOwotCQl9Ci0JICAgICAgKytqOwotCSAgICB9Ci0JICB3aGlsZSAoaiA8IE9QVElPTl9DT1VOVCAmJiBsZF9vcHRpb25zW2pdLmRvYyA9PSBOVUxMKTsKLQotCSAgaiA9IGk7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaWYgKGxkX29wdGlvbnNbal0ub3B0Lm5hbWUgIT0gTlVMTAotCQkgICYmIGxkX29wdGlvbnNbal0uY29udHJvbCAhPSBOT19IRUxQKQotCQl7Ci0JCSAgcHJpbnRmICgiJXMtJXMlcyIsCi0JCQkgIGNvbW1hID8gIiwgIiA6ICIiLAotCQkJICBsZF9vcHRpb25zW2pdLmNvbnRyb2wgPT0gVFdPX0RBU0hFUyA/ICItIiA6ICIiLAotCQkJICBsZF9vcHRpb25zW2pdLm9wdC5uYW1lKTsKLQkJICBsZW4gKz0gKChjb21tYSA/IDIgOiAwKQotCQkJICArIDEKLQkJCSAgKyAobGRfb3B0aW9uc1tqXS5jb250cm9sID09IFRXT19EQVNIRVMgPyAxIDogMCkKLQkJCSAgKyBzdHJsZW4gKGxkX29wdGlvbnNbal0ub3B0Lm5hbWUpKTsKLQkJICBpZiAobGRfb3B0aW9uc1tqXS5hcmcgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiICVzIiwgXyhsZF9vcHRpb25zW2pdLmFyZykpOwotCQkgICAgICBsZW4gKz0gMSArIHN0cmxlbiAoXyhsZF9vcHRpb25zW2pdLmFyZykpOwotCQkgICAgfQotCQkgIGNvbW1hID0gdHJ1ZTsKLQkJfQotCSAgICAgICsrajsKLQkgICAgfQotCSAgd2hpbGUgKGogPCBPUFRJT05fQ09VTlQgJiYgbGRfb3B0aW9uc1tqXS5kb2MgPT0gTlVMTCk7Ci0KLQkgIGlmIChsZW4gPj0gMzApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICAgIGxlbiA9IDA7Ci0JICAgIH0KLQotCSAgZm9yICg7IGxlbiA8IDMwOyBsZW4rKykKLQkgICAgcHV0Y2hhciAoJyAnKTsKLQotCSAgcHJpbnRmICgiJXNcbiIsIF8obGRfb3B0aW9uc1tpXS5kb2MpKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdGU6IFZhcmlvdXMgdG9vbHMgKHN1Y2ggYXMgbGlidG9vbCkgZGVwZW5kIHVwb24gdGhlCi0gICAgIGZvcm1hdCBvZiB0aGUgbGlzdGluZ3MgYmVsb3cgLSBkbyBub3QgY2hhbmdlIHRoZW0uICAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKF8oIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czoiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdGFyZ2V0cyA9IGJmZF90YXJnZXRfbGlzdCAoKTsKLSAgZm9yIChwcCA9IHRhcmdldHM7ICpwcCAhPSBOVUxMOyBwcCsrKQotICAgIHByaW50ZiAoIiAlcyIsICpwcCk7Ci0gIGZyZWUgKHRhcmdldHMpOwotICBwcmludGYgKCJcbiIpOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoXygiJXM6IHN1cHBvcnRlZCBlbXVsYXRpb25zOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgbGRlbXVsX2xpc3RfZW11bGF0aW9ucyAoc3Rkb3V0KTsKLSAgcHJpbnRmICgiXG4iKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKF8oIiVzOiBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9uczpcbiIpLCBwcm9ncmFtX25hbWUpOwotICBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucyAoc3Rkb3V0KTsKLSAgcHJpbnRmICgiXG4iKTsKLSAgCi0gIHByaW50ZiAoXygiXG5SZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLX0KZGlmZiAtLWdpdCBhL2xkL21hYy1sZC5yIGIvbGQvbWFjLWxkLnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTZmYzUuLjAwMDAwMDAKLS0tIGEvbGQvbWFjLWxkLnIKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBSZXNvdXJjZXMgZm9yIEdOVSBMRC4gKi8KLQotI2luY2x1ZGUgIlN5c1R5cGVzLnIiCi0KLS8qIFZlcnNpb24gcmVzb3VyY2VzLiAqLwotCi1yZXNvdXJjZSAndmVycycgKDEpICB7Ci0JMCwKLQkwLAotCTAsCi0JMCwKLQl2ZXJVcywKLQlWRVJTSU9OX1NUUklORywKLQlWRVJTSU9OX1NUUklORyAgIiAoQykgMTk4Ni05NSBGU0YsIEluYy4iCi19OwotCi1yZXNvdXJjZSAndmVycycgKDIsIHB1cmdlYWJsZSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCSJHTEQgIiBWRVJTSU9OX1NUUklORyAiIGZvciBNUFciCi19OwotCi0jaWZkZWYgV0FOVF9DRlJHCi0KLSNpbmNsdWRlICJDb2RlRnJhZ21lbnRUeXBlcy5yIgotCi1yZXNvdXJjZSAnY2ZyZycgKDApIHsKLQl7Ci0JCWtQb3dlclBDLAotCQlrRnVsbExpYiwKLQkJa05vVmVyc2lvbk51bSwga05vVmVyc2lvbk51bSwKLQkJMCwgMCwKLQkJa0lzQXBwLCBrT25EaXNrRmxhdCwga1plcm9PZmZzZXQsIGtXaG9sZUZvcmssCi0JCVBST0dfTkFNRQotCX0KLX07Ci0KLSNlbmRpZiAvKiBXQU5UX0NGUkcgKi8KZGlmZiAtLWdpdCBhL2xkL21wdy1jb25maWcuaW4gYi9sZC9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU0MmNjLi4wMDAwMDAwCi0tLSBhL2xkL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIExELgotCi1JZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KLQlTZXQgZW11bG5hbWUgbTY4a2NvZmYKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1lbTY4a2NvZmYuYyBlbTY4a2NvZmYuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZW02OGtjb2ZmLmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLwotCVNldCBlbXVsbmFtZSBwcGNtYWNvcwotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVwcGNtYWMuYyBlcHBjbWFjb3MuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZXBwY21hY29zLmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9pMzg2LVxPcHRpb24teC1nbzMyLwotCVNldCBlbXVsbmFtZSBpMzg2Z28zMgotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVpMzg2Z28zMi5jIGVpMzg2Z28zMi5jCi0JU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlaTM4NmdvMzIuYy5vCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL21pcHMtXE9wdGlvbi14LWVjb2ZmLwotCVNldCBlbXVsbmFtZSBtaXBzaWR0Ci0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctaWR0bWlwcy5jIGVtaXBzaWR0LmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVtaXBzaWR0LmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1cT3B0aW9uLXgvCi0JU2V0IGVtdWxuYW1lIGVsZjMyZWJtaXAKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1lbGZtaXBzLmMgZWVsZjMyZWJtaXAuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZWVsZjMyZWJtaXAuYy5vCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3NoLVxPcHRpb24teC1obXMvCi0JU2V0IGVtdWxuYW1lIHNoCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZXNoLmMgZXNoLmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVzaC5jLm8KLUVuZCBJZgotCi1FY2hvICcvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuICBETyBOT1QgRURJVCEgKi8nID4gIntvfSJsZGVtdWwtdG1wLmgKLUVjaG8gImV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkX3tlbXVsbmFtZX1fZW11bGF0aW9uOyIgPj4gIntvfSJsZGVtdWwtdG1wLmgKLUVjaG8gJyNkZWZpbmUgRU1VTEFUSU9OX0xJU1QgXCcJCQkJPj4gIntvfSJsZGVtdWwtdG1wLmgKLUVjaG8gIiAgJmxkX3tlbXVsbmFtZX1fZW11bGF0aW9uLCBcIgkJCT4+ICJ7b30ibGRlbXVsLXRtcC5oCi1FY2hvICcgIDAnCQkJCQkJPj4gIntvfSJsZGVtdWwtdG1wLmgKLQotTW92ZUlmQ2hhbmdlICJ7b30ibGRlbXVsLXRtcC5oICJ7b30ibGRlbXVsLWxpc3QuaAotCi1FY2hvICcjIEZyb20gbXB3LWNvbmZpZy5pbicJCQkJID4gIntvfSJtay50bXAKLUVjaG8gIkVNVUwgPSAiIHtlbXVsbmFtZX0JCQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkVNVUxBVElPTl9PRklMRVMgPSAiIHtlbXVsYXRpb25fb2ZpbGVzfQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ3ZlcnNpb24gPSAnIGBTZWFyY2ggJ2xkIHZlcnNpb24gJyB7c3JjZGlyfWxkdmVyLmMgfCBzZWQgLWUgJ3MvLipsZCB2ZXJzaW9uIFwoW14gXSpcKS4qL1wxLydgID4+ICJ7b30ibWsudG1wCi1FY2hvICJUREVGSU5FUyA9ICIJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQkJPj4gIntvfSJjb25maWcubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaApkaWZmIC0tZ2l0IGEvbGQvbXB3LWVsZm1pcHMuYyBiL2xkL21wdy1lbGZtaXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWIwNTYuLjAwMDAwMDAKLS0tIGEvbGQvbXB3LWVsZm1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MzkgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiAzMiBiaXQgRUxGIGVtdWxhdGlvbiBjb2RlIGZvciBlbGYzMmVibWlwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIEVMRiBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19lbGYzMmVibWlwCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0KLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZGVsZjMyZWJtaXBfb3Blbl9keW5hbWljX2FyY2hpdmUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWFyY2hfZGlyc190eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9zdGF0X25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkZWxmMzJlYm1pcF90cnlfbmVlZGVkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGRlbGYzMmVibWlwX3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfcGxhY2Vfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGRlbGYzMmVibWlwX2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9taXBzOwotICBjb25maWcuZHluYW1pY19saW5rID0gdHJ1ZTsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGFyY2hpdmUuICBUaGlzIGlzIHdoZXJlIHdlIGtub3cgdGhhdCBFTEYKLSAgIGR5bmFtaWMgbGlicmFyaWVzIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5zby4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGRlbGYzMmVibWlwX29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqc3RyaW5nOwotCi0gIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmaWxlbmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKLQotICBzdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGZpbGVuYW1lKQotCQkJICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCSAgICAgKyBzaXplb2YgIi9saWIuc28iKTsKLQotICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNvIiwgc2VhcmNoLT5uYW1lLCBmaWxlbmFtZSwgYXJjaCk7Ci0KLSAgaWYgKCEgbGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOwotCi0gIC8qIFdlIGhhdmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGluIHRoZSBsaW5rLiAgVGhlIEVMRgotICAgICBiYWNrZW5kIGxpbmtlciB3aWxsIGNyZWF0ZSBhIERUX05FRURFRCBlbnRyeSBpbiB0aGUgLmR5bmFtaWMKLSAgICAgc2VjdGlvbiBuYW1pbmcgdGhpcyBmaWxlLiAgSWYgdGhpcyBmaWxlIGluY2x1ZGVzIGEgRFRfU09OQU1FCi0gICAgIGVudHJ5LCBpdCB3aWxsIGJlIHVzZWQuICBPdGhlcndpc2UsIHRoZSBFTEYgbGlua2VyIHdpbGwganVzdCB1c2UKLSAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUuICBGb3IgYW4gYXJjaGl2ZSBmb3VuZCBieSBzZWFyY2hpbmcsIGxpa2UKLSAgICAgdGhpcyBvbmUsIHRoZSBEVF9ORUVERUQgZW50cnkgc2hvdWxkIGNvbnNpc3Qgb2YganVzdCB0aGUgbmFtZSBvZgotICAgICB0aGUgZmlsZSwgd2l0aG91dCB0aGUgcGF0aCBpbmZvcm1hdGlvbiB1c2VkIHRvIGZpbmQgaXQuICBOb3RlCi0gICAgIHRoYXQgd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaWYgd2UgaGF2ZSBhIGR5bmFtaWMgb2JqZWN0OyBhbgotICAgICBhcmNoaXZlIHdpbGwgbmV2ZXIgYmUgcmVmZXJlbmNlZCBieSBhIERUX05FRURFRCBlbnRyeS4KLQotICAgICBGSVhNRTogVGhpcyBhcHByb2FjaC0tdXNpbmcgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUtLWlzIG5vdAotICAgICB2ZXJ5IHByZXR0eS4gIEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gdGhpbmsgb2YgYW55dGhpbmcgdGhhdCBpcwotICAgICBwcmV0dHksIHRob3VnaC4gICovCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCwgYmZkX29iamVjdCkKLSAgICAgICYmIChlbnRyeS0+dGhlX2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgKm5lZWRlZF9uYW1lOwotCi0gICAgICBBU1NFUlQgKGVudHJ5LT5pc19hcmNoaXZlICYmIGVudHJ5LT5zZWFyY2hfZGlyc19mbGFnKTsKLSAgICAgIG5lZWRlZF9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkKLQkJCQkgICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCQkgICAgICArIHNpemVvZiAibGliLnNvIik7Ci0gICAgICBzcHJpbnRmIChuZWVkZWRfbmFtZSwgImxpYiVzJXMuc28iLCBmaWxlbmFtZSwgYXJjaCk7Ci0gICAgICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoZW50cnktPnRoZV9iZmQsIG5lZWRlZF9uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSByZXF1aXJlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoCi0gICBiZXR3ZWVuIGFmdGVyX29wZW4gYW5kIGNoZWNrX25lZWRlZCBhbmQgc3RhdF9uZWVkZWQuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpnbG9iYWxfbmVlZGVkOwotc3RhdGljIHN0cnVjdCBzdGF0IGdsb2JhbF9zdGF0Owotc3RhdGljIGJvb2xlYW4gZ2xvYmFsX2ZvdW5kOwotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9hZnRlcl9vcGVuICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqbDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gRFRfTkVFREVEIGVudHJpZXMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rIChvZnRlbiB0aGVyZSB3aWxsIGJlIG5vbmUpLgotICAgICBGb3IgZWFjaCBzdWNoIGZpbGUsIHdlIHdhbnQgdG8gdHJhY2sgZG93biB0aGUgY29ycmVzcG9uZGluZwotICAgICBsaWJyYXJ5LCBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlIGluIHRoZSBsaW5rLiAgVGhpcyBpcyB3aGF0Ci0gICAgIHRoZSBydW50aW1lIGR5bmFtaWMgbGlua2VyIHdpbGwgZG8uICBUcmFja2luZyB0aGUgZmlsZXMgZG93biBoZXJlCi0gICAgIHBlcm1pdHMgb25lIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgYW5vdGhlciB3aXRob3V0IHJlcXVpcmluZwotICAgICBzcGVjaWFsIGFjdGlvbiBieSB0aGUgcGVyc29uIGRvaW5nIHRoZSBsaW5rLiAgTm90ZSB0aGF0IHRoZQotICAgICBuZWVkZWQgbGlzdCBjYW4gYWN0dWFsbHkgZ3JvdyB3aGlsZSB3ZSBhcmUgc3RlcHBpbmcgdGhyb3VnaCB0aGlzCi0gICAgIGxvb3AuICAqLwotICBuZWVkZWQgPSBiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgY29uc3QgY2hhciAqbGliX3BhdGg7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gICAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBmaWxlLCBza2lwIGl0LiAgKi8KLSAgICAgIGZvciAobGwgPSBuZWVkZWQ7IGxsICE9IGw7IGxsID0gbGwtPm5leHQpCi0JaWYgKHN0cmNtcCAobGwtPm5hbWUsIGwtPm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChsbCAhPSBsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOwotICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZGVsZjMyZWJtaXBfY2hlY2tfbmVlZGVkKTsKLSAgICAgIGlmIChnbG9iYWxfZm91bmQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZmluZCB0aGlzIGZpbGUgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZS4gIFdlCi0JIHdhbnQgdG8gc2VhcmNoIGZvciB0aGUgZmlsZSBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgZHluYW1pYwotCSBsaW5rZXIgd2lsbCBzZWFyY2guICBUaGF0IG1lYW5zIHRoYXQgd2Ugd2FudCB0byB1c2UKLQkgcnBhdGhfbGluaywgcnBhdGgsIHRoZW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0JIExEX0xJQlJBUllfUEFUSCAobmF0aXZlIG9ubHkpLCB0aGVuIHRoZSBsaW5rZXIgc2NyaXB0Ci0JIExJQl9TRUFSQ0hfRElSUy4gIFdlIGRvIG5vdCBzZWFyY2ggdXNpbmcgdGhlIC1MIGFyZ3VtZW50cy4gICovCi0gICAgICBpZiAoZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGhfbGluaywKLQkJCQkJICAgICAgbC0+bmFtZSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGgsIGwtPm5hbWUpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rID09IE5VTEwKLQkgICYmIGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCXsKLQkgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLQkgIGlmIChnbGRlbGYzMmVibWlwX3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsLT5uYW1lKSkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgbGVuID0gc3RybGVuIChsLT5uYW1lKTsKLSAgICAgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JewotCSAgY2hhciAqZmlsZW5hbWU7Ci0KLQkgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JICAgIGNvbnRpbnVlOwotCSAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyBsZW4gKyAyKTsKLQkgIHNwcmludGYgKGZpbGVuYW1lLCAiJXMvJXMiLCBzZWFyY2gtPm5hbWUsIGwtPm5hbWUpOwotCSAgaWYgKGdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCAoZmlsZW5hbWUpKQotCSAgICBicmVhazsKLQkgIGZyZWUgKGZpbGVuYW1lKTsKLQl9Ci0gICAgICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kXG4iKSwKLQkgICAgIGwtPm5hbWUsIGwtPmJ5KTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBuZWVkZWQgZmlsZSBpbiBhIHBhdGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkIChwYXRoLCBuYW1lKQotICAgICBjb25zdCBjaGFyICpwYXRoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBjaGFyICpzOwotICBzaXplX3QgbGVuOwotCi0gIGlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gJ1wwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGVuYW1lLCAqc3NldDsKLQotICAgICAgcyA9IHN0cmNociAocGF0aCwgJzonKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcyA9IHBhdGggKyBzdHJsZW4gKHBhdGgpOwotCi0gICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHMgLSBwYXRoICsgbGVuICsgMik7Ci0gICAgICBpZiAocyA9PSBwYXRoKQotCXNzZXQgPSBmaWxlbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKGZpbGVuYW1lLCBwYXRoLCBzIC0gcGF0aCk7Ci0JICBmaWxlbmFtZVtzIC0gcGF0aF0gPSAnLyc7Ci0JICBzc2V0ID0gZmlsZW5hbWUgKyAocyAtIHBhdGgpICsgMTsKLQl9Ci0gICAgICBzdHJjcHkgKHNzZXQsIG5hbWUpOwotCi0gICAgICBpZiAoZ2xkZWxmMzJlYm1pcF90cnlfbmVlZGVkIChmaWxlbmFtZSkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLQotICAgICAgaWYgKCpzID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBwYXRoID0gcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJICAKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggcG9zc2libGUgbmFtZSBmb3IgYSBkeW5hbWljIG9iamVjdAotICAgbmFtZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkZWxmMzJlYm1pcF90cnlfbmVlZGVkIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBiZmQgKmFiZmQ7Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAobmFtZSwgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2UndmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCBtYXRjaGluZyB0aGUgRFRfTkVFREVEIGVudHJ5LiAgKi8KLQotICAvKiBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlIGlzIG5vIG90aGVyIGlucHV0IGZpbGUgb2YgdGhlCi0gICAgIHNhbWUgbmFtZS4gIFdlIG11c3Qgbm93IGNoZWNrIGFnYWluIHRoYXQgd2UgYXJlIG5vdCBpbmNsdWRpbmcgdGhlCi0gICAgIHNhbWUgZmlsZSB0d2ljZS4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9uIG1hbnkgc3lzdGVtcwotICAgICBsaWJjLnNvIGlzIGEgc3ltbGluayB0bywgZS5nLiwgbGliYy5zby4xLiAgVGhlIFNPTkFNRSBlbnRyeSB3aWxsCi0gICAgIHJlZmVyZW5jZSBsaWJjLnNvLjEuICBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgbGliYy5zbywgd2UKLSAgICAgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIGxpYmMuc28uMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBmaWxlLCBhbmQgd2UKLSAgICAgY2FuIG9ubHkgY2hlY2sgdGhhdCB1c2luZyBzdGF0LiAgKi8KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZnbG9iYWxfc3RhdCkgIT0gMCkKLSAgICBlaW5mbyAoXygiJUYlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiksIGFiZmQpOwotICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGRlbGYzMmVibWlwX3N0YXRfbmVlZGVkKTsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICB7Ci0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIGZvdW5kIHRoZSBmaWxlLCBldmVuIHRob3VnaAotICAgICAgICAgd2UgYXJlbid0IGdvaW5nIHRvIGRvIGFueXRoaW5nIHdpdGggaXQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRlbGwgdGhlIEVMRiBiYWNrZW5kIHRoYXQgZG9uJ3Qgd2FudCB0aGUgb3V0cHV0IGZpbGUgdG8gaGF2ZSBhCi0gICAgIERUX05FRURFRCBlbnRyeSBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGFiZmQsICIiKTsKLQotICAvKiBBZGQgdGhpcyBmaWxlIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoXygiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfY2hlY2tfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAocy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY21wIChzLT5maWxlbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLQotICAgICAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgICAgIGlmIChzb25hbWUgIT0gTlVMTAotCSAgJiYgc3RyY21wIChzb25hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCSAgCi0gIGlmIChzLT5zZWFyY2hfZGlyc19mbGFnCi0gICAgICAmJiBzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmOwotCi0gICAgICBmID0gc3RycmNociAocy0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAoZiAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKGYgKyAxLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBydW5uaW5nIHN0YXQgb24KLSAgIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfc3RhdF9uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjb25zdCBjaGFyICpzdWZmaXg7Ci0gIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgY29uc3QgY2hhciAqZjsKLQotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9zdGF0IChzLT50aGVfYmZkLCAmc3QpICE9IDApCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iKSwgcy0+dGhlX2JmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzdC5zdF9kZXYgPT0gZ2xvYmFsX3N0YXQuc3RfZGV2Ci0gICAgICAmJiBzdC5zdF9pbm8gPT0gZ2xvYmFsX3N0YXQuc3RfaW5vKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIGlzc3VlIGEgd2FybmluZyBpZiBpdCBsb29rcyBsaWtlIHdlIGFyZSBpbmNsdWRpbmcgdHdvCi0gICAgIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeS4gIEZvciBleGFtcGxlLAotICAgICB0aGVyZSBtYXkgYmUgYSBwcm9ibGVtIGlmIC1sYyBwaWNrcyB1cCBsaWJjLnNvLjYgYnV0IHNvbWUgb3RoZXIKLSAgICAgc2hhcmVkIGxpYnJhcnkgaGFzIGEgRFRfTkVFREVEIGVudHJ5IG9mIGxpYmMuc28uNS4gIFRoaXMgaXMgYQotICAgICBodWVyaXN0aWMgdGVzdCwgYW5kIGl0IHdpbGwgb25seSB3b3JrIGlmIHRoZSBuYW1lIGxvb2tzIGxpa2UKLSAgICAgTkFNRS5zby5WRVJTSU9OLiAgRklYTUU6IERlcGVuZGluZyBvbiBmaWxlIG5hbWVzIGlzIGVycm9yLXByb25lLgotICAgICBJZiB3ZSByZWFsbHkgd2FudCB0byBpc3N1ZSB3YXJuaW5ncyBhYm91dCBtaXhpbmcgdmVyc2lvbiBudW1iZXJzCi0gICAgIG9mIHNoYXJlZCBsaWJyYXJpZXMsIHdlIG5lZWQgdG8gZmluZCBhIGJldHRlciB3YXkuICAqLwotCi0gIGlmIChzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgIT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCA9IHN0cnN0ciAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgIi5zby4iKTsKLSAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBzLT5maWxlbmFtZTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgaWYgKHN0cm5jbXAgKGYsIGdsb2JhbF9uZWVkZWQtPm5hbWUsIHN1ZmZpeCAtIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBtYXkgY29uZmxpY3Qgd2l0aCAlc1xuIiksCi0JICAgZ2xvYmFsX25lZWRlZC0+bmFtZSwgZ2xvYmFsX25lZWRlZC0+YnksIGYpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgY29uc3QgY2hhciAqcnBhdGg7Ci0gIGFzZWN0aW9uICpzaW50ZXJwOwotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFueSB2YXJpYWJsZSBhc3NpZ25tZW50cywgd2UgbmVlZCB0byBsZXQKLSAgICAgdGhlIEVMRiBiYWNrZW5kIGtub3cgYWJvdXQgdGhlbSBpbiBjYXNlIHRoZSB2YXJpYWJsZXMgYXJlCi0gICAgIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGRlbGYzMmVibWlwX2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQpOwotCi0gIC8qIExldCB0aGUgRUxGIGJhY2tlbmQgd29yayBvdXQgdGhlIHNpemVzIG9mIGFueSBzZWN0aW9ucyByZXF1aXJlZAotICAgICBieSBkeW5hbWljIGxpbmtpbmcuICAqLwotICBycGF0aCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLSAgaWYgKHJwYXRoID09IE5VTEwpCi0gICAgcnBhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotICBpZiAoISBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLAotCQkJCQkJIGNvbW1hbmRfbGluZS5zb25hbWUsCi0JCQkJCQkgcnBhdGgsCi0JCQkJCQkgY29tbWFuZF9saW5lLmV4cG9ydF9keW5hbWljLAotCQkJCQkJICZsaW5rX2luZm8sCi0JCQkJCQkgJnNpbnRlcnApKQotICAgIGVpbmZvIChfKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpKTsKLQotICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIGR5bmFtaWMgbGlua2VyIHdlIGFyZSB1c2luZy4gICovCi0gIGlmIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgIT0gTlVMTAotICAgICAgJiYgc2ludGVycCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpbnRlcnAtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcjsKLSAgICAgIHNpbnRlcnAtPl9yYXdfc2l6ZSA9IHN0cmxlbiAoY29tbWFuZF9saW5lLmludGVycHJldGVyKSArIDE7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGFueSBzZWN0aW9ucyBuYW1lZCAuZ251Lndhcm5pbmcuICBBcyBhIEdOVSBleHRlbnNpb25zLAotICAgICB3ZSB0cmVhdCBzdWNoIHNlY3Rpb25zIGFzIGNvbnRhaW5pbmcgd2FybmluZyBtZXNzYWdlcy4gIFdlIHByaW50Ci0gICAgIG91dCB0aGUgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiB6ZXJvIG91dCB0aGUgc2VjdGlvbiBzaXplIHNvCi0gICAgIHRoYXQgaXQgZG9lcyBub3QgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlhc2VjdGlvbiAqczsKLQliZmRfc2l6ZV90eXBlIHN6OwotCWNoYXIgKm1zZzsKLQlib29sZWFuIHJldDsKLQotCWlmIChpcy0+anVzdF9zeW1zX2ZsYWcpCi0JICBjb250aW51ZTsKLQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZ251Lndhcm5pbmciKTsKLQlpZiAocyA9PSBOVUxMKQotCSAgY29udGludWU7Ci0KLQlzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzKTsKLQltc2cgPSB4bWFsbG9jICgoc2l6ZV90KSBzeiArIDEpOwotCWlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaXMtPnRoZV9iZmQsIHMsIG1zZywgKGZpbGVfcHRyKSAwLCBzeikpCi0JICBlaW5mbyAoXygiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5nbnUud2FybmluZzogJUVcbiIpLAotCQkgaXMtPnRoZV9iZmQpOwotCW1zZ1tzel0gPSAnXDAnOwotCXJldCA9IGxpbmtfaW5mby5jYWxsYmFja3MtPndhcm5pbmcgKCZsaW5rX2luZm8sIG1zZywKLQkJCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSAgICBpcy0+dGhlX2JmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSAgICAoYmZkX3ZtYSkgMCk7Ci0JQVNTRVJUIChyZXQpOwotCWZyZWUgKG1zZyk7Ci0KLQkvKiBDbG9iYmVyIHRoZSBzZWN0aW9uIHNpemUsIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgY29weWluZyB0aGUKLQkgICB3YXJuaW5nIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQlzLT5fcmF3X3NpemUgPSAwOwotICAgICAgfQotICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb2NhdGVzIGFueSBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGFuZAotICAgdGVsbHMgdGhlIEVMRiBiYWNrZW5kIGFib3V0IHRoZW0sIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KLSAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCi0gICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLQotICAgICAgLyogV2UgY2FsbCByZWNvcmRfbGlua19hc3NpZ25tZW50IGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLgotCSBUaGlzIGlzIGJlY2F1c2UgaWYgaXQgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCB3ZQotCSBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgZGVmaW5lZCBieSB0aGUgbGlua2VyIHNjcmlwdCwKLQkgbm90IHRoZSB2YWx1ZSBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCAoYmVjYXVzZSB3ZSBhcmUgc2V0dGluZwotCSBzeW1ib2xzIGxpa2UgZXRleHQpLiAgSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhcgotCSBvYmplY3QsIHRoZW4sIGFzIGl0IGhhcHBlbnMsIGNhbGxpbmcgcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCSB3aWxsIGRvIG5vIGhhcm0uICAqLwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgKGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JCSAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgZXhwLT5hc3NpZ24uZHN0LAotCQkgIGV4cC0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3Byb3ZpZGUgPyB0cnVlIDogZmFsc2UpKSkKLQkgICAgZWluZm8gKF8oIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIpLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCByYW5kb20gU0hGX0FMTE9DCi0gICBzZWN0aW9ucyBpbiB0aGUgcmlnaHQgc2VnbWVudC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqaG9sZF9zZWN0aW9uOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdXNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdGV4dDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JvZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZWw7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWdsZGVsZjMyZWJtaXBfcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcGxhY2U7Ci0gIGFzZWN0aW9uICpzbmV3LCAqKnBwczsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpvbGQ7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gIGV0cmVlX3R5cGUgKmFkZHJlc3M7Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWUsICpwczsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzY3JpcHQgdG8gc2VlIHdoZXJlIHRvIHBsYWNlIHRoaXMgc2VjdGlvbi4gICovCi0gIGhvbGRfc2VjdGlvbiA9IHM7Ci0gIGhvbGRfdXNlID0gTlVMTDsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZGVsZjMyZWJtaXBfcGxhY2Vfc2VjdGlvbik7Ci0KLSAgaWYgKGhvbGRfdXNlICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHBsYWNlZCBhIHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUuICAqLwotICAgICAgd2lsZF9kb2l0ICgmaG9sZF91c2UtPmNoaWxkcmVuLCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vd25lciwgcyk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIHRoZW4gYWx3YXlzIHB1dCAuZ251Lndhcm5pbmcuU1lNQk9MCi0gICAgIHNlY3Rpb25zIGludG8gdGhlIC50ZXh0IHNlY3Rpb24gdG8gZ2V0IHRoZW0gb3V0IG9mIHRoZSB3YXkuICAqLwotICBpZiAoISBsaW5rX2luZm8uc2hhcmVkCi0gICAgICAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN0cm5jbXAgKHNlY25hbWUsICIuZ251Lndhcm5pbmcuIiwgc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDEpID09IDAKLSAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdGV4dC0+Y2hpbGRyZW4sIHMsIGhvbGRfdGV4dCwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogRGVjaWRlIHdoaWNoIHNlZ21lbnQgdGhlIHNlY3Rpb24gc2hvdWxkIGdvIGluIGJhc2VkIG9uIHRoZQotICAgICBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICAqLwotICBwbGFjZSA9IE5VTEw7Ci0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0gICAgICAmJiBob2xkX2JzcyAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9ic3M7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICYmIGhvbGRfZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9kYXRhOwotICBlbHNlIGlmIChzdHJuY21wIChzZWNuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkgICAmJiBob2xkX3JlbCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yZWw7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgJiYgKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF9yb2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcm9kYXRhOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfdGV4dDsKLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCBwdXQgaXQgaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlLiAgVGhpcyBzaHVmZmxpbmcgaXMgdG8gbWFrZSB0aGUgb3V0cHV0IGZpbGUgbG9vayBuZWF0ZXIuICAqLwotICBzbmV3ID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0cHV0X2JmZCwgc2VjbmFtZSk7Ci0gIGlmIChzbmV3ID09IE5VTEwpCi0gICAgICBlaW5mbyAoXygiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iKSwKLQkgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIHNlY25hbWUpOwotICBpZiAocGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQk7Ci0gICAgICAqcHBzID0gc25ldy0+bmV4dDsKLSAgICAgIHNuZXctPm5leHQgPSBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQ7Ci0gICAgICBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQgPSBzbmV3OwotICAgIH0KLQotICAvKiBTdGFydCBidWlsZGluZyBhIGxpc3Qgb2Ygc3RhdGVtZW50cyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgb2xkID0gc3RhdF9wdHI7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICAvKiBJZiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpcyByZXByZXNlbnRhYmxlIGluIEMsIHRoZW4gY3JlYXRlCi0gICAgIHN5bWJvbHMgdG8gbWFyayB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICAqLwotICBmb3IgKHBzID0gc2VjbmFtZTsgKnBzICE9ICdcMCc7IHBzKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKnBzKSAmJiAqcHMgIT0gJ18nKQotICAgICAgYnJlYWs7Ci0gIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0KLSAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIHNlY25hbWUgKyBzaXplb2YgIl9fc3RhcnRfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdGFydF8lcyIsIHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkJCQlleHBfaW50b3AgKChiZmRfdm1hKSAxCi0JCQkJCQkJICAgPDwgcy0+YWxpZ25tZW50X3Bvd2VyKSkpKTsKLSAgICB9Ci0KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICBhZGRyZXNzID0gTlVMTDsKLSAgZWxzZQotICAgIGFkZHJlc3MgPSBleHBfaW50b3AgKChiZmRfdm1hKSAwKTsKLQotICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoc2VjbmFtZSwgYWRkcmVzcywgMCwKLQkJCQkgICAgICAgKGJmZF92bWEpIDAsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwpOwotCi0gIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChzZWNuYW1lKTsKLSAgd2lsZF9kb2l0ICgmb3MtPmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7Ci0KLSAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKChiZmRfdm1hKSAwLCAiKmRlZmF1bHQqIik7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLQotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBzZWNuYW1lICsgc2l6ZW9mICJfX3N0b3BfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdG9wXyVzIiwgc2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpKSk7Ci0gICAgfQotCi0gIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgKmFkZC50YWlsID0gcGxhY2UtPmhlYWRlci5uZXh0OwotICBwbGFjZS0+aGVhZGVyLm5leHQgPSBhZGQuaGVhZDsKLQotICBzdGF0X3B0ciA9IG9sZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfcGxhY2Vfc2VjdGlvbiAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKHMtPmhlYWRlci50eXBlICE9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW0pCi0gICAgcmV0dXJuOwotCi0gIG9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgaG9sZF9zZWN0aW9uLT5uYW1lKSA9PSAwKQotICAgIGhvbGRfdXNlID0gb3M7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIudGV4dCIpID09IDApCi0gICAgaG9sZF90ZXh0ID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIucm9kYXRhIikgPT0gMCkKLSAgICBob2xkX3JvZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgIGhvbGRfZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmJzcyIpID09IDApCi0gICAgaG9sZF9ic3MgPSBvczsKLSAgZWxzZSBpZiAoaG9sZF9yZWwgPT0gTlVMTAotCSAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0JICAgJiYgc3RybmNtcCAob3MtPm5hbWUsICIucmVsIiwgNCkgPT0gMCkKLSAgICBob2xkX3JlbCA9IG9zOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGRlbGYzMmVibWlwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXNcblwKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmdcblwKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGRcblwKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC5pbnRlcnAgICAwIDogeyAqKC5pbnRlcnApIAl9XG5cCi0gIC5yZWdpbmZvICAgICAwIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAwIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAwIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAwIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAwIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgMCA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAwIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAwIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgIDAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgIDAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAwIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgIDAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAwIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgIDAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgMCA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgMCA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAwIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAwIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgMCA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAwIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgMCA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAwIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgMCA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAwIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgMCA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgIDAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgMCA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgMCA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAwIDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICAuZmluaSAgICAwIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuZGF0YSAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5kYXRhMSAwIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgMCA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgMCA6IHsgKiguZHRvcnMpICAgfVxuXAotICAuZ290ICAgICAgICAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC5nb3QucGx0KSAqKC5nb3QpXG5cCi0gICB9XG5cCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzXG5cCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc29cblwKLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi9cblwKLSAgLnNkYXRhICAgMCA6IHsgKiguc2RhdGEpIH1cblwKLSAgLnNic3MgICAgMCA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfVxuXAotICAuYnNzICAgICAwIDpcblwKLSAge1xuXAotICAgKiguZHluYnNzKVxuXAotICAgKiguYnNzKVxuXAotICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuXG5cCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovXG5cCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH1cblwKLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfVxuXAotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy5cblwKLSAgICAgU3ltYm9scyBpbiB0aGUgLmRlYnVnIERXQVJGIHNlY3Rpb24gYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlXG5cCi0gICAgIHNlY3Rpb24gc28gd2UgYmVnaW4gLmRlYnVnIGF0IDAuICBJdCdzIG5vdCBjbGVhciB5ZXQgd2hhdCBuZWVkcyB0byBoYXBwZW5cblwKLSAgICAgZm9yIHRoZSBvdGhlcnMuICAgKi9cblwKLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9XG5cCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9XG5cCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9XG5cCi0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfVxuXAotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfVxuXAotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfVxuXAotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzXG5cCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nXG5cCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkXG5cCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuaW50ZXJwICAgMCA6IHsgKiguaW50ZXJwKSAJfVxuXAotICAucmVnaW5mbyAgICAgMCA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgMCA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgMCA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgMCA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgMCA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgIDAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgMCA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgMCA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAwIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAwIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgMCA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAwIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgMCA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAwIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgIDAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgIDAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgMCA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgMCA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgIDAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgMCA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgIDAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgMCA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgIDAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgMCA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgIDAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAwIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExIDAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgIDAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgLmZpbmkgICAgMCA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLmRhdGEgIDAgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgfVxuXAotICAuZGF0YTEgMCA6IHsgKiguZGF0YTEpIH1cblwKLSAgLmN0b3JzICAgICAgIDAgOiB7ICooLmN0b3JzKSAgIH1cblwKLSAgLmR0b3JzICAgICAgIDAgOiB7ICooLmR0b3JzKSAgIH1cblwKLSAgLmdvdCAgICAgICAgIDAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgIDAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5zYnNzICAgIDAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgMCA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAuICAqL1xuXAotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCi0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKLX1cblxuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1lbGYvbGliKTtcblwKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/XG5cCi0gICBfX0RZTkFNSUMgPSAwOyAgICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC4gPSAweDA0MDAwMDA7XG5cCi0gIC5pbnRlcnAgICAgIDogeyAqKC5pbnRlcnApIAl9XG5cCi0gIC5yZWdpbmZvICAgICAgIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgICAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAgIDpcblwKLSAge1xuXAotICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICBfZXRleHQgPSAuO1xuXAotICBQUk9WSURFIChldGV4dCA9IC4pO1xuXAotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgICAuID0gLjtcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuICs9IC4gLSAweDA0MDAwMDA7XG5cCi0gIC5kYXRhICAgIDpcblwKLSAge1xuXAotICAgIF9mZGF0YSA9IC4gO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAgIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDtcblwKLSAgLmdvdCAgICAgICAgICAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9XG5cCi0gIC5saXQ0IDogeyAqKC5saXQ0KSB9XG5cCi0gIF9lZGF0YSAgPSAgLjtcblwKLSAgUFJPVklERSAoZWRhdGEgPSAuKTtcblwKLSAgX19ic3Nfc3RhcnQgPSAuO1xuXAotICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgICA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIF9lbmQgPSAuIDtcblwKLSAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAiT1VUUFVUX0ZPUk1BVChcImVsZjMyLWJpZ21pcHNcIiwgXCJlbGYzMi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlbGYzMi1saXR0bGVtaXBzXCIpXG5cCi1PVVRQVVRfQVJDSChtaXBzKVxuXAotRU5UUlkoX3N0YXJ0KVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWVsZi9saWIpO1xuXAotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj9cblwKLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi9cblwKLSAgLiA9IDB4MDQwMDAwMDtcblwKLSAgLmludGVycCAgICAgOiB7ICooLmludGVycCkgCX1cblwKLSAgLnJlZ2luZm8gICAgICAgOiB7ICooLnJlZ2luZm8pIH1cblwKLSAgLmR5bmFtaWMgICAgICAgOiB7ICooLmR5bmFtaWMpIH1cblwKLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX1cblwKLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX1cblwKLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9XG5cCi0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX1cblwKLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX1cblwKLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfVxuXAotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfVxuXAotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX1cblwKLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfVxuXAotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX1cblwKLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfVxuXAotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9XG5cCi0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9XG5cCi0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX1cblwKLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX1cblwKLSAgLnJlbC5pbml0ICAgICAgOiB7ICooLnJlbC5pbml0KQl9XG5cCi0gIC5yZWxhLmluaXQgICAgIDogeyAqKC5yZWxhLmluaXQpCX1cblwKLSAgLnJlbC5maW5pICAgICAgOiB7ICooLnJlbC5maW5pKQl9XG5cCi0gIC5yZWxhLmZpbmkgICAgIDogeyAqKC5yZWxhLmZpbmkpCX1cblwKLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9XG5cCi0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX1cblwKLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9XG5cCi0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX1cblwKLSAgLnJvZGF0YSAgICA6IHsgKigucm9kYXRhKSAgfVxuXAotICAucm9kYXRhMSAgIDogeyAqKC5yb2RhdGExKSB9XG5cCi0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9ID0wXG5cCi0gIC50ZXh0ICAgICAgOlxuXAotICB7XG5cCi0gICAgX2Z0ZXh0ID0gLiA7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHViKVxuXAotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqL1xuXAotICAgICooLmdudS53YXJuaW5nKVxuXAotICB9ID0wXG5cCi0gIF9ldGV4dCA9IC47XG5cCi0gIFBST1ZJREUgKGV0ZXh0ID0gLik7XG5cCi0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTBcblwKLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG9cblwKLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkXG5cCi0gICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOlxuXAotICAgICAgIC4gPSAweDEwMDAwMDAwO1xuXAotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYVxuXAotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZVxuXAotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlXG5cCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGVcblwKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS5cblwKLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZ1xuXAotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZVxuXAotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGVcblwKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdFxuXAotICAgICBiZSByZWZlcmVuY2VkKS4gICovXG5cCi0gIC4gKz0gMHgxMDAwMDAwMCAtIDB4MDQwMDAwMDtcblwKLSAgLmRhdGEgICAgOlxuXAotICB7XG5cCi0gICAgX2ZkYXRhID0gLiA7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH1cblwKLSAgLmN0b3JzICAgICAgICAgOiB7ICooLmN0b3JzKSAgIH1cblwKLSAgLmR0b3JzICAgICAgICAgOiB7ICooLmR0b3JzKSAgIH1cblwKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwO1xuXAotICAuZ290ICAgICAgICAgICA6XG5cCi0gIHtcblwKLSAgICAqKC5nb3QucGx0KSAqKC5nb3QpXG5cCi0gICB9XG5cCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzXG5cCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc29cblwKLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi9cblwKLSAgLnNkYXRhICAgICA6IHsgKiguc2RhdGEpIH1cblwKLSAgLmxpdDggOiB7ICooLmxpdDgpIH1cblwKLSAgLmxpdDQgOiB7ICooLmxpdDQpIH1cblwKLSAgX2VkYXRhICA9ICAuO1xuXAotICBQUk9WSURFIChlZGF0YSA9IC4pO1xuXAotICBfX2Jzc19zdGFydCA9IC47XG5cCi0gIF9mYnNzID0gLjtcblwKLSAgLnNic3MgICAgICA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfVxuXAotICAuYnNzICAgICAgIDpcblwKLSAge1xuXAotICAgKiguZHluYnNzKVxuXAotICAgKiguYnNzKVxuXAotICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgX2VuZCA9IC4gO1xuXAotICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuXG5cCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovXG5cCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH1cblwKLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfVxuXAotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy5cblwKLSAgICAgU3ltYm9scyBpbiB0aGUgLmRlYnVnIERXQVJGIHNlY3Rpb24gYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlXG5cCi0gICAgIHNlY3Rpb24gc28gd2UgYmVnaW4gLmRlYnVnIGF0IDAuICBJdCdzIG5vdCBjbGVhciB5ZXQgd2hhdCBuZWVkcyB0byBoYXBwZW5cblwKLSAgICAgZm9yIHRoZSBvdGhlcnMuICAgKi9cblwKLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9XG5cCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9XG5cCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9XG5cCi0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfVxuXAotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfVxuXAotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfVxuXAotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICAuICAqL1xuXAotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCi0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKLX1cblxuIjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1lbGYvbGliKTtcblwKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/XG5cCi0gICBfX0RZTkFNSUMgPSAwOyAgICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC4gPSAweDVmZmUwMDAwICsgU0laRU9GX0hFQURFUlM7XG5cCi0gIC5yZWdpbmZvICAgICAgIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgICAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAgIDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgICAuID0gMHgxMDAwMDAwMDtcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuICs9IDB4MTAwMDA7XG5cCi0gIC5kYXRhICAgIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAgIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDtcblwKLSAgLmdvdCAgICAgICAgICAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9XG5cCi0gIC5saXQ0IDogeyAqKC5saXQ0KSB9XG5cCi0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgICA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci0gIGVsc2UKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1lbGYvbGliKTtcblwKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/XG5cCi0gICBfX0RZTkFNSUMgPSAwOyAgICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC4gPSAweDA0MDAwMDA7XG5cCi0gIC5pbnRlcnAgICAgIDogeyAqKC5pbnRlcnApIAl9XG5cCi0gIC5yZWdpbmZvICAgICAgIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgICAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAgIDpcblwKLSAge1xuXAotICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICBfZXRleHQgPSAuO1xuXAotICBQUk9WSURFIChldGV4dCA9IC4pO1xuXAotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgICAuID0gMHgxMDAwMDAwMDtcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuICs9IDB4MTAwMDAwMDAgLSAweDA0MDAwMDA7XG5cCi0gIC5kYXRhICAgIDpcblwKLSAge1xuXAotICAgIF9mZGF0YSA9IC4gO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAgIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDtcblwKLSAgLmdvdCAgICAgICAgICAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9XG5cCi0gIC5saXQ0IDogeyAqKC5saXQ0KSB9XG5cCi0gIF9lZGF0YSAgPSAgLjtcblwKLSAgUFJPVklERSAoZWRhdGEgPSAuKTtcblwKLSAgX19ic3Nfc3RhcnQgPSAuO1xuXAotICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgICA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIF9lbmQgPSAuIDtcblwKLSAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci19Ci0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfZWxmMzJlYm1pcF9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkZWxmMzJlYm1pcF9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkZWxmMzJlYm1pcF9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZGVsZjMyZWJtaXBfYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZGVsZjMyZWJtaXBfZ2V0X3NjcmlwdCwKLSAgImVsZjMyZWJtaXAiLAotICAiZWxmMzItYmlnbWlwcyIsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIGdsZGVsZjMyZWJtaXBfb3Blbl9keW5hbWljX2FyY2hpdmUsCi0gIGdsZGVsZjMyZWJtaXBfcGxhY2Vfb3JwaGFuCi19OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LWVwcGNtYWMuYyBiL2xkL21wdy1lcHBjbWFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDlhNDEuLjAwMDAwMDAKLS0tIGEvbGQvbXB3LWVwcGNtYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMjQgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBBSVggZW11bGF0aW9uIGNvZGUgZm9yIHBwY21hY29zCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIEFJWCBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19wcGNtYWNvcwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLQotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2xkcHBjbWFjb3NfcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfcmVhZF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfZnJlZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2ZpbmRfcmVsb2NzCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGRwcGNtYWNvc19nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLS8qIFRoZSBmaWxlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247Ci0KLS8qIFRoZSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrIGlzIHBlcm1pdHRlZCB0byBncm93LiAgVGhpcyBpcyBzdG9yZWQgaW4KLSAgIHRoZSBhLm91dCBoZWFkZXIuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4c3RhY2s7Ci0KLS8qIFRoZSBtYXhpbXVtIGRhdGEgc2l6ZS4gIFRoaXMgaXMgc3RvcmVkIGluIHRoZSBhLm91dCBoZWFkZXIuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4ZGF0YTsKLQotLyogV2hldGhlciB0byBwZXJmb3JtIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi1zdGF0aWMgaW50IGdjID0gMTsKLQotLyogVGhlIG1vZHVsZSB0eXBlIHRvIHVzZS4gICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbW9kdHlwZSA9ICgnMScgPDwgOCkgfCAnTCc7Ci0KLS8qIFdoZXRoZXIgdGhlIC50ZXh0IHNlY3Rpb24gbXVzdCBiZSByZWFkLW9ubHkgKGkuZS4sIG5vIHJlbG9jcwotICAgcGVybWl0dGVkKS4gICovCi1zdGF0aWMgaW50IHRleHRybzsKLQotLyogV2hldGhlciB0byBpbXBsZW1lbnQgVW5peCBsaWtlIGxpbmtlciBzZW1hbnRpY3MuICAqLwotc3RhdGljIGludCB1bml4X2xkOwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGltcG9ydCBmaWxlIGxpc3QuICAqLwotCi1zdHJ1Y3QgZmlsZWxpc3QKLXsKLSAgc3RydWN0IGZpbGVsaXN0ICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotLyogTGlzdCBvZiBpbXBvcnQgZmlsZXMuICAqLwotc3RhdGljIHN0cnVjdCBmaWxlbGlzdCAqaW1wb3J0X2ZpbGVzOwotCi0vKiBMaXN0IG9mIGV4cG9ydCBzeW1ib2xzIHJlYWQgZnJvbSB0aGUgZXhwb3J0IGZpbGVzLiAgKi8KLQotc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdAotewotICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICBib29sZWFuIHN5c2NhbGw7Ci19OwotCi1zdGF0aWMgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqZXhwb3J0X3N5bWJvbHM7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgZG9uZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19iZWZvcmVfcGFyc2UoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogSGFuZGxlIEFJWCBzcGVjaWZpYyBvcHRpb25zLiAgKi8KLQotc3RhdGljIGludAotZ2xkcHBjbWFjb3NfcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCBpbmR4OwotICBpbnQgbG9uZ2luZDsKLSAgaW50IG9wdGM7Ci0gIGxvbmcgdmFsOwotICBjaGFyICplbmQ7Ci0KLSNkZWZpbmUgT1BUSU9OX0lHTk9SRSAoMzAwKQotI2RlZmluZSBPUFRJT05fQVVUT0lNUCAoT1BUSU9OX0lHTk9SRSArIDEpCi0jZGVmaW5lIE9QVElPTl9FUk5PVE9LIChPUFRJT05fQVVUT0lNUCArIDEpCi0jZGVmaW5lIE9QVElPTl9FUk9LIChPUFRJT05fRVJOT1RPSyArIDEpCi0jZGVmaW5lIE9QVElPTl9FWFBPUlQgKE9QVElPTl9FUk9LICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNUE9SVCAoT1BUSU9OX0VYUE9SVCArIDEpCi0jZGVmaW5lIE9QVElPTl9MT0FETUFQIChPUFRJT05fSU1QT1JUICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BWERBVEEgKE9QVElPTl9MT0FETUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BWFNUQUNLIChPUFRJT05fTUFYREFUQSArIDEpCi0jZGVmaW5lIE9QVElPTl9NT0RUWVBFIChPUFRJT05fTUFYU1RBQ0sgKyAxKQotI2RlZmluZSBPUFRJT05fTk9BVVRPSU1QIChPUFRJT05fTU9EVFlQRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT1NUUkNNUENUIChPUFRJT05fTk9BVVRPSU1QICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BEIChPUFRJT05fTk9TVFJDTVBDVCArIDEpCi0jZGVmaW5lIE9QVElPTl9QVCAoT1BUSU9OX1BEICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUUkNNUENUIChPUFRJT05fUFQgKyAxKQotI2RlZmluZSBPUFRJT05fVU5JWCAoT1BUSU9OX1NUUkNNUENUICsgMSkKLQotICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0gewotICAgIHsiYmFzaXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiYXV0b2ltcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVVUT0lNUH0sCi0gICAgeyJiY29tcHJsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJjcmxkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmNyb3IzMSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhEQVRBfSwKLSAgICB7ImJFIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAotICAgIHsiYmVybm90b2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAotICAgIHsiYmVyb2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VST0t9LAotICAgIHsiYmVycm1zZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJleHBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVH0sCi0gICAgeyJiZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJOT1RPS30sCi0gICAgeyJiZ2MiLCBub19hcmd1bWVudCwgJmdjLCAxfSwKLSAgICB7ImJoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmhhbHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiSSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QT1JUfSwKLSAgICB7ImJpbXBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCi0gICAgeyJibCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCi0gICAgeyJibG9hZG1hcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCi0gICAgeyJibWF4ZGF0YSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCi0gICAgeyJibWF4c3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWFNUQUNLfSwKLSAgICB7ImJNIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKLSAgICB7ImJtb2R0eXBlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKLSAgICB7ImJub2F1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJibm9kZWxjc2VjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJub2VudHJ5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYm5vZ2MiLCBub19hcmd1bWVudCwgJmdjLCAwfSwKLSAgICB7ImJuc28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJibm9zdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9TVFJDTVBDVH0sCi0gICAgeyJibm90ZXh0cm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMH0sCi0gICAgeyJibnJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAotICAgIHsiYnBEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QRH0sCi0gICAgeyJicFQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BUfSwKLSAgICB7ImJybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKLSAgICB7ImJTIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCi0gICAgeyJic28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAotICAgIHsiYnN0cmNtcGN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVFJDTVBDVH0sCi0gICAgeyJidGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDF9LAotICAgIHsic3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsidW5peCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVU5JWH0sCi0gICAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotICB9OwotCi0gIC8qIE9wdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBBSVggbGlua2VyIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0OiAtZiwKLSAgICAgLVMsIC12LCAtWiwgLWJiaW5kY21kcywgLWJiaW5kZXIsIC1iYmluZG9wdHMsIC1iY2FsbHMsIC1iY2FwcywKLSAgICAgLWJjcm9yMTUsIC1iZGVidWdvcHQsIC1iZGJnLCAtYmRlbGNzZWN0LCAtYmV4PywgLWJmaWxlbGlzdCwgLWJmbCwKLSAgICAgLWJnY2J5cGFzcywgLWJnbGluaywgLWJpbnNlcnQsIC1iaSwgLWJsb2FkbWFwLCAtYmwsIC1ibWFwLCAtYm5sLAotICAgICAtYm5vYmluZCwgLWJub2NvbXBybGQsIC1ibm9jcmxkLCAtYm5vZXJybXNnLCAtYm5vZ2xpbmssCi0gICAgIC1ibm9sb2FkbWFwLCAtYm5sLCAtYm5vb2JqcmVvcmRlciwgLWJub3F1aWV0LCAtYm5vcmVvcmRlciwKLSAgICAgLWJub3R5cGNoaywgLWJub3gsIC1icXVpZXQsIC1iUiwgLWJyZW5hbWUsIC1icmVvcmRlciwgLWJ0eXBjaGssCi0gICAgIC1ieCwgLWJYLCAtYnhyZWYuICAqLwotCi0gIC8qIElmIHRoZSBjdXJyZW50IG9wdGlvbiBzdGFydHMgd2l0aCAtYiwgY2hhbmdlIHRoZSBmaXJzdCA6IHRvIGFuID0uCi0gICAgIFRoZSBBSVggbGlua2VyIHVzZXMgOiB0byBzZXBhcmF0ZSB0aGUgb3B0aW9uIGZyb20gdGhlIGFyZ3VtZW50OwotICAgICBjaGFuZ2luZyBpdCB0byA9IGxldHMgdXMgdHJlYXQgaXQgYXMgYSBnZXRvcHQgb3B0aW9uLiAgKi8KLSAgaW5keCA9IG9wdGluZDsKLSAgaWYgKGluZHggPT0gMCkKLSAgICBpbmR4ID0gMTsKLSAgaWYgKGluZHggPCBhcmdjICYmIHN0cm5jbXAgKGFyZ3ZbaW5keF0sICItYiIsIDIpID09IDApCi0gICAgewotICAgICAgY2hhciAqczsKLQotICAgICAgZm9yIChzID0gYXJndltpbmR4XTsgKnMgIT0gJ1wwJzsgcysrKQotCXsKLQkgIGlmICgqcyA9PSAnOicpCi0JICAgIHsKLQkgICAgICAqcyA9ICc9JzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgb3B0ZXJyID0gMDsKLSAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItRDpIOktUOnoiLCBsb25nb3B0cywgJmxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9wdGluZCA9IHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgMDoKLSAgICAgIC8qIExvbmcgb3B0aW9uIHdoaWNoIGp1c3Qgc2V0cyBhIGZsYWcuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdEJzoKLSAgICAgIHZhbCA9IHN0cnRvbCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1EIG51bWJlciAlc1xuIiksIG9wdGFyZyk7Ci0gICAgICBlbHNlIGlmICh2YWwgIT0gLTEpCi0JbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCBleHBfaW50b3AgKHZhbCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdIJzoKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnCi0JICB8fCAodmFsICYgKHZhbCAtIDEpKSAhPSAwKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtSCBudW1iZXIgJXNcbiIpLCBvcHRhcmcpOwotICAgICAgZWxzZQotCWZpbGVfYWxpZ24gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgIGNhc2UgJ3onOgotICAgICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIHVzZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgdGFyZ2V0IHN5c3RlbS4gICovCi0gICAgICBmaWxlX2FsaWduID0gNDA5NjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICAvKiBPbiBBSVggdGhpcyBpcyB0aGUgc2FtZSBhcyBHTlUgbGQgLVR0ZXh0LiAgV2hlbiB3ZSBzZWUgLVQKLSAgICAgICAgIG51bWJlciwgd2UgYXNzdW1lIHRoZSBBSVggb3B0aW9uIGlzIGludGVuZGVkLiAgT3RoZXJ3aXNlLCB3ZQotICAgICAgICAgYXNzdW1lIHRoZSB1c3VhbCBHTlUgbGQgLVQgb3B0aW9uIGlzIGludGVuZGVkLiAgV2UgY2FuJ3QganVzdAotICAgICAgICAgaWdub3JlIHRoZSBBSVggb3B0aW9uLCBiZWNhdXNlIGdjYyBwYXNzZXMgaXQgdG8gdGhlIGxpbmtlci4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQl7Ci0JICBvcHRpbmQgPSBwcmV2b3B0aW5kOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCBleHBfaW50b3AgKHZhbCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9JR05PUkU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0FVVE9JTVA6Ci0gICAgICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVJOT1RPSzoKLSAgICAgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FUk9LOgotICAgICAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVhQT1JUOgotICAgICAgZ2xkcHBjbWFjb3NfcmVhZF9maWxlIChvcHRhcmcsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fSU1QT1JUOgotICAgICAgewotCXN0cnVjdCBmaWxlbGlzdCAqbjsKLQlzdHJ1Y3QgZmlsZWxpc3QgKipmbHBwOwotCi0JbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKLQluLT5uZXh0ID0gTlVMTDsKLQluLT5uYW1lID0gb3B0YXJnOwotCWZscHAgPSAmaW1wb3J0X2ZpbGVzOwotCXdoaWxlICgqZmxwcCAhPSBOVUxMKQotCSAgZmxwcCA9ICYoKmZscHApLT5uZXh0OwotCSpmbHBwID0gbjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTE9BRE1BUDoKLSAgICAgIGNvbmZpZy5tYXBfZmlsZW5hbWUgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01BWERBVEE6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhkYXRhIG51bWJlciAlc1xuIiksCi0JICAgICAgIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbWF4ZGF0YSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUFYU1RBQ0s6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhzdGFjayBudW1iZXIgJXNcbiIpLAotCSAgICAgICBvcHRhcmcpOwotICAgICAgZWxzZQotCW1heHN0YWNrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NT0RUWVBFOgotICAgICAgaWYgKCpvcHRhcmcgPT0gJ1MnKQotCXsKLQkgIGxpbmtfaW5mby5zaGFyZWQgPSB0cnVlOwotCSAgKytvcHRhcmc7Ci0JfQotICAgICAgaWYgKCpvcHRhcmcgPT0gJ1wwJyB8fCBvcHRhcmdbMV0gPT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgbW9kdWxlIHR5cGUgJXNcbiIpLCBvcHRhcmcpOwotICAgICAgZWxzZQotCW1vZHR5cGUgPSAoKm9wdGFyZyA8PCA4KSB8IG9wdGFyZ1sxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9BVVRPSU1QOgotICAgICAgbGlua19pbmZvLnN0YXRpY19saW5rID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9TVFJDTVBDVDoKLSAgICAgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QRDoKLSAgICAgIC8qIFRoaXMgc2V0cyB0aGUgcGFnZSB0aGF0IHRoZSAuZGF0YSBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvCi0gICAgICAgICBzdGFydCBvbi4gIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIHNob3VsZCBzdGlsbCBiZSB0aGUKLSAgICAgICAgIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUsIHNvIHdlIG5lZWQgdG8gYnVpbGQgYW4gYXBwcm9wcmlhdGUKLSAgICAgICAgIGV4cHJlc3Npb24uICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wRCBudW1iZXIgJXNcbiIpLCBvcHRhcmcpOwotICAgICAgZWxzZQotCXsKLQkgIGV0cmVlX3R5cGUgKnQ7Ci0KLQkgIHQgPSBleHBfYmlub3AgKCcrJywKLQkJCSBleHBfaW50b3AgKHZhbCksCi0JCQkgZXhwX2Jpbm9wICgnJicsCi0JCQkJICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIiksCi0JCQkJICAgIGV4cF9pbnRvcCAoMHhmZmYpKSk7Ci0JICB0ID0gZXhwX2Jpbm9wICgnJicsCi0JCQkgZXhwX2Jpbm9wICgnKycsIHQsIGV4cF9pbnRvcCAoNykpLAotCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgNykpOwotCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCB0KTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BUOgotICAgICAgLyogVGhpcyBzZXQgdGhlIHBhZ2UgdGhhdCB0aGUgLnRleHQgc2VjdGlvbiBpcyBzdXBwb3NlZCB0byBzdGFydAotICAgICAgICAgb24uICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZSBzaG91bGQgc3RpbGwgYmUgdGhlIG9mZnNldAotICAgICAgICAgd2l0aGluIHRoZSBmaWxlLiAgKi8KLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtcFQgbnVtYmVyICVzXG4iKSwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBldHJlZV90eXBlICp0OwotCi0JICB0ID0gZXhwX2Jpbm9wICgnKycsCi0JCQkgZXhwX2ludG9wICh2YWwpLAotCQkJIGV4cF9uYW1lb3AgKFNJWkVPRl9IRUFERVJTLCBOVUxMKSk7Ci0JICB0ID0gZXhwX2Jpbm9wICgnJicsCi0JCQkgZXhwX2Jpbm9wICgnKycsIHQsIGV4cF9pbnRvcCAoNykpLAotCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgNykpOwotCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCB0KTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1NUUkNNUENUOgotICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9VTklYOgotICAgICAgdW5peF9sZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBjYW4gbm90IGJlIHJlY29nbml6ZWQgYXMgYSBCRkQKLSAgIG9iamVjdCBvciBhbiBhcmNoaXZlLiAgSWYgdGhlIGZpbGUgc3RhcnRzIHdpdGggIyEsIHdlIG11c3QgdHJlYXQgaXQKLSAgIGFzIGFuIGltcG9ydCBmaWxlLiAgVGhpcyBpcyBmb3IgQUlYIGNvbXBhdGliaWxpdHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkcHBjbWFjb3NfdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgRklMRSAqZTsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgZSA9IGZvcGVuIChlbnRyeS0+ZmlsZW5hbWUsIEZPUEVOX1JUKTsKLSAgaWYgKGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0ID0gZmFsc2U7Ci0KLSAgaWYgKGdldGMgKGUpID09ICcjJyAmJiBnZXRjIChlKSA9PSAnIScpCi0gICAgewotICAgICAgc3RydWN0IGZpbGVsaXN0ICpuOwotICAgICAgc3RydWN0IGZpbGVsaXN0ICoqZmxwcDsKLQotICAgICAgbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKLSAgICAgIG4tPm5leHQgPSBOVUxMOwotICAgICAgbi0+bmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKLSAgICAgIGZscHAgPSAmaW1wb3J0X2ZpbGVzOwotICAgICAgd2hpbGUgKCpmbHBwICE9IE5VTEwpCi0JZmxwcCA9ICYoKmZscHApLT5uZXh0OwotICAgICAgKmZscHAgPSBuOwotCi0gICAgICByZXQgPSB0cnVlOwotICAgICAgZW50cnktPmxvYWRlZCA9IHRydWU7Ci0gICAgfQotCi0gIGZjbG9zZSAoZSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfYWZ0ZXJfb3BlbiAoKQotewotICBib29sZWFuIHI7Ci0gIHN0cnVjdCBzZXRfaW5mbyAqcDsKLQotICAvKiBDYWxsIGxkY3Rvcl9idWlsZF9zZXRzLCBhZnRlciBwcmV0ZW5kaW5nIHRoYXQgdGhpcyBpcyBhCi0gICAgIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG8gdGhpcyBiZWNhdXNlIEFJWCByZXF1aXJlcyByZWxvY2F0aW9uCi0gICAgIGVudHJpZXMgZm9yIGFsbCByZWZlcmVuY2VzIHRvIHN5bWJvbHMsIGV2ZW4gaW4gYSBmaW5hbAotICAgICBleGVjdXRhYmxlLiAgT2YgY291cnNlLCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBpZiB3ZSBhcmUKLSAgICAgcHJvZHVjaW5nIGFuIFhDT0ZGIG91dHB1dCBmaWxlLiAgKi8KLSAgciA9IGxpbmtfaW5mby5yZWxvY2F0ZWFibGU7Ci0gIGlmIChzdHJzdHIgKGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwgInhjb2ZmIikgIT0gTlVMTCkKLSAgICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgbGRjdG9yX2J1aWxkX3NldHMgKCk7Ci0gIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSByOwotCi0gIC8qIEZvciBlYWNoIHNldCwgcmVjb3JkIHRoZSBzaXplLCBzbyB0aGF0IHRoZSBYQ09GRiBiYWNrZW5kIGNhbgotICAgICBvdXRwdXQgdGhlIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KLSAgZm9yIChwID0gc2V0czsgcCAhPSAoc3RydWN0IHNldF9pbmZvICopIE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgaGF2ZSBiZWVuIGludm9rZWQgZnJvbQotCSBjb2xsZWN0LCBhbmQgdGhlIHNldHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGJ1aWx0LCBzbyB3ZSBkbwotCSBub3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQljb250aW51ZTsKLQotICAgICAgaWYgKHAtPnJlbG9jICE9IEJGRF9SRUxPQ19DVE9SKQotCXsKLQkgIC8qIEhhbmRsZSB0aGlzIGlmIHdlIG5lZWQgdG8uICAqLwotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBzaXplID0gKHAtPmNvdW50ICsgMikgKiA0OwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcC0+aCwgc2l6ZSkpCi0JZWluZm8gKF8oIiVGJVA6IGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBzdHJ1Y3QgZmlsZWxpc3QgKmZsOwotICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICplbDsKLSAgY2hhciAqbGlicGF0aDsKLSAgYXNlY3Rpb24gKnNwZWNpYWxfc2VjdGlvbnNbNl07Ci0gIGludCBpOwotCi0gIC8qIEhhbmRsZSB0aGUgaW1wb3J0IGFuZCBleHBvcnQgZmlsZXMsIGlmIGFueS4gICovCi0gIGZvciAoZmwgPSBpbXBvcnRfZmlsZXM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCi0gICAgZ2xkcHBjbWFjb3NfcmVhZF9maWxlIChmbC0+bmFtZSwgdHJ1ZSk7Ci0gIGZvciAoZWwgPSBleHBvcnRfc3ltYm9sczsgZWwgIT0gTlVMTDsgZWwgPSBlbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZWwtPm5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQllaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgb2YgZXhwb3J0IHN5bWJvbCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgICBpZiAoISBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgaCwgZWwtPnN5c2NhbGwpKQotCWVpbmZvIChfKCIlUCVGOiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotCi0gIC8qIFRyYWNrIGRvd24gYWxsIHJlbG9jYXRpb25zIGNhbGxlZCBmb3IgYnkgdGhlIGxpbmtlciBzY3JpcHQgKHRoZXNlCi0gICAgIGFyZSB0eXBpY2FsbHkgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBlbnRyaWVzIGNyZWF0ZWQgYnkKLSAgICAgQ09OU1RSVUNUT1JTKSBhbmQgbGV0IHRoZSBiYWNrZW5kIGtub3cgaXQgd2lsbCBuZWVkIHRvIGNyZWF0ZQotICAgICAubG9hZGVyIHJlbG9jcyBmb3IgdGhlbS4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGRwcGNtYWNvc19maW5kX3JlbG9jcyk7Ci0KLSAgLyogV2UgbmVlZCB0byBidWlsZCBMSUJQQVRIIGZyb20gdGhlIC1MIGFyZ3VtZW50cy4gIElmIGFueSAtcnBhdGgKLSAgICAgYXJndW1lbnRzIHdlcmUgdXNlZCwgdGhvdWdoLCB3ZSB1c2UgLXJwYXRoIGluc3RlYWQsIGFzIGEgR05VCi0gICAgIGV4dGVuc2lvbi4gICovCi0gIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLSAgICBsaWJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOwotICBlbHNlIGlmIChzZWFyY2hfaGVhZCA9PSBOVUxMKQotICAgIGxpYnBhdGggPSAoY2hhciAqKSAiIjsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoc2VhcmNoX2hlYWQtPm5hbWUpOwotICAgICAgbGlicGF0aCA9IHhtYWxsb2MgKGxlbiArIDEpOwotICAgICAgc3RyY3B5IChsaWJwYXRoLCBzZWFyY2hfaGVhZC0+bmFtZSk7Ci0gICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkLT5uZXh0OyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCXsKLQkgIHNpemVfdCBubGVuOwotCi0JICBubGVuID0gc3RybGVuIChzZWFyY2gtPm5hbWUpOwotCSAgbGlicGF0aCA9IHhyZWFsbG9jIChsaWJwYXRoLCBsZW4gKyBubGVuICsgMik7Ci0JICBsaWJwYXRoW2xlbl0gPSAnOic7Ci0JICBzdHJjcHkgKGxpYnBhdGggKyBsZW4gKyAxLCBzZWFyY2gtPm5hbWUpOwotCSAgbGVuICs9IG5sZW4gKyAxOwotCX0KLSAgICB9Ci0KLSAgLyogTGV0IHRoZSBYQ09GRiBiYWNrZW5kIHNldCB1cCB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgbGlicGF0aCwKLQkJCQkJIGVudHJ5X3N5bWJvbCwgZmlsZV9hbGlnbiwKLQkJCQkJIG1heHN0YWNrLCBtYXhkYXRhLAotCQkJCQkgZ2MgJiYgISB1bml4X2xkID8gdHJ1ZSA6IGZhbHNlLAotCQkJCQkgbW9kdHlwZSwKLQkJCQkJIHRleHRybyA/IHRydWUgOiBmYWxzZSwKLQkJCQkJIHVuaXhfbGQsCi0JCQkJCSBzcGVjaWFsX3NlY3Rpb25zKSkKLSAgICBlaW5mbyAoXygiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKSk7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzcGVjaWFsIHNlY3Rpb25zLCBhbmQgcHV0IHRoZW0gaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlIGluIHRoZSBsaW5rIG9yZGVyaW5nLiAgVGhpcyBpcyBlc3BlY2lhbGx5IG1hZ2ljLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0gICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcGxzOwotICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmlzOwotICAgICAgY29uc3QgY2hhciAqb25hbWU7Ci0gICAgICBib29sZWFuIHN0YXJ0OwotCi0gICAgICBzZWMgPSBzcGVjaWFsX3NlY3Rpb25zW2ldOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBSZW1vdmUgdGhpcyBzZWN0aW9uIGZyb20gdGhlIGxpc3Qgb2YgdGhlIG91dHB1dCBzZWN0aW9uLgotICAgICAgICAgVGhpcyBhc3N1bWVzIHdlIGtub3cgd2hhdCB0aGUgc2NyaXB0IGxvb2tzIGxpa2UuICAqLwotICAgICAgaXMgPSBOVUxMOwotICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOwotICAgICAgaWYgKG9zID09IE5VTEwpCi0JZWluZm8gKF8oIiVQJUY6IGNhbid0IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXNcbiIpLAotCSAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGZvciAocGxzID0gJm9zLT5jaGlsZHJlbi5oZWFkOyAqcGxzICE9IE5VTEw7IHBscyA9ICYoKnBscyktPm5leHQpCi0JewotCSAgaWYgKCgqcGxzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KLQkgICAgICAmJiAoKnBscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCi0JICAgIHsKLQkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcGxzOwotCSAgICAgICpwbHMgPSAoKnBscyktPm5leHQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bSkKLQkgICAgewotCSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwd2xzOwotCi0JICAgICAgZm9yIChwd2xzID0gJigqcGxzKS0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZDsKLQkJICAgKnB3bHMgIT0gTlVMTDsKLQkJICAgcHdscyA9ICYoKnB3bHMpLT5uZXh0KQotCQl7Ci0JCSAgaWYgKCgqcHdscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCi0JCSAgICAgICYmICgqcHdscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCi0JCSAgICB7Ci0JCSAgICAgIGlzID0gKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICopICpwd2xzOwotCQkgICAgICAqcHdscyA9ICgqcHdscyktPm5leHQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgaWYgKGlzICE9IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0JfQkKLQotICAgICAgaWYgKGlzID09IE5VTEwpCi0JZWluZm8gKF8oIiVQJUY6IGNhbid0IGZpbmQgJXMgaW4gb3V0cHV0IHNlY3Rpb25cbiIpLAotCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc2VjLT5vd25lciwgc2VjKSk7Ci0KLSAgICAgIC8qIE5vdyBmaWd1cmUgb3V0IHdoZXJlIHRoZSBzZWN0aW9uIHNob3VsZCBnby4gICovCi0gICAgICBzd2l0Y2ggKGkpCi0JewotCWRlZmF1bHQ6IC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCi0JY2FzZSAwOgotCSAgLyogX3RleHQgKi8KLQkgIG9uYW1lID0gIi50ZXh0IjsKLQkgIHN0YXJ0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIC8qIF9ldGV4dCAqLwotCSAgb25hbWUgPSAiLnRleHQiOwotCSAgc3RhcnQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIC8qIF9kYXRhICovCi0JICBvbmFtZSA9ICIuZGF0YSI7Ci0JICBzdGFydCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDM6Ci0JICAvKiBfZWRhdGEgKi8KLQkgIG9uYW1lID0gIi5kYXRhIjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JY2FzZSA1OgotCSAgLyogX2VuZCBhbmQgZW5kICovCi0JICBvbmFtZSA9ICIuYnNzIjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChvbmFtZSk7Ci0KLSAgICAgIGlmIChzdGFydCkKLQl7Ci0JICBpcy0+aGVhZGVyLm5leHQgPSBvcy0+Y2hpbGRyZW4uaGVhZDsKLQkgIG9zLT5jaGlsZHJlbi5oZWFkID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgaXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlzLT5oZWFkZXIubmV4dCA9IE5VTEw7Ci0JICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZvcy0+Y2hpbGRyZW4sCi0JCQkJIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzLAotCQkJCSAmaXMtPmhlYWRlci5uZXh0KTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZWFkIGFuIGltcG9ydCBvciBleHBvcnQgZmlsZS4gIEZvciBhbiBpbXBvcnQgZmlsZSwgdGhpcyBpcyBjYWxsZWQKLSAgIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiBlbXVsYXRpb24gcm91dGluZS4gIEZvciBhbiBleHBvcnQgZmlsZSwKLSAgIHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBwYXJzZV9hcmdzIGVtdWxhdGlvbiByb3V0aW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX3JlYWRfZmlsZSAoZmlsZW5hbWUsIGltcG9ydCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJvb2xlYW4gaW1wb3J0OwotewotICBzdHJ1Y3Qgb2JzdGFjayAqbzsKLSAgRklMRSAqZjsKLSAgaW50IGxpbmVubzsKLSAgaW50IGM7Ci0gIGJvb2xlYW4ga2VlcDsKLSAgY29uc3QgY2hhciAqaW1wcGF0aDsKLSAgY29uc3QgY2hhciAqaW1wZmlsZTsKLSAgY29uc3QgY2hhciAqaW1wbWVtYmVyOwotCi0gIG8gPSAoc3RydWN0IG9ic3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb2JzdGFjaykpOwotICBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbiAobywgMCwgMCwgeG1hbGxvYywgZ2xkcHBjbWFjb3NfZnJlZSk7Ci0KLSAgZiA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUlQpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBlaW5mbyAoIiVGJXM6ICVFXG4iLCBmaWxlbmFtZSk7Ci0gICAgfQotCi0gIGtlZXAgPSBmYWxzZTsKLQotICBpbXBwYXRoID0gTlVMTDsKLSAgaW1wZmlsZSA9IE5VTEw7Ci0gIGltcG1lbWJlciA9IE5VTEw7Ci0KLSAgbGluZW5vID0gMDsKLSAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciAqc3ltbmFtZTsKLSAgICAgIGJvb2xlYW4gc3lzY2FsbDsKLSAgICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBpZiAoYyAhPSAnXG4nKQotCXsKLQkgIG9ic3RhY2tfMWdyb3cgKG8sIGMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBvYnN0YWNrXzFncm93IChvLCAnXDAnKTsKLSAgICAgICsrbGluZW5vOwotCi0gICAgICBzID0gKGNoYXIgKikgb2JzdGFja19iYXNlIChvKTsKLSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSsrczsKLSAgICAgIGlmICgqcyA9PSAnXDAnCi0JICB8fCAqcyA9PSAnKicKLQkgIHx8ICgqcyA9PSAnIycgJiYgc1sxXSA9PSAnICcpCi0JICB8fCAoISBpbXBvcnQgJiYgKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKSkKLQl7Ci0JICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKQotCXsKLQkgIHMgKz0gMjsKLQkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSAgICArK3M7Ci0JICBpZiAoKnMgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGltcHBhdGggPSBOVUxMOwotCSAgICAgIGltcGZpbGUgPSBOVUxMOwotCSAgICAgIGltcG1lbWJlciA9IE5VTEw7Ci0JICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnMgPT0gJygnKQotCSAgICBlaW5mbyAoXygiJUYlcyVkOiAjISAoW21lbWJlcl0pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gaW1wb3J0IGZpbGVzXG4iKSwKLQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyIGNzOwotCSAgICAgIGNoYXIgKmZpbGU7Ci0KLQkgICAgICAodm9pZCkgb2JzdGFja19maW5pc2ggKG8pOwotCSAgICAgIGtlZXAgPSB0cnVlOwotCSAgICAgIGltcHBhdGggPSBzOwotCSAgICAgIGZpbGUgPSBOVUxMOwotCSAgICAgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykgJiYgKnMgIT0gJygnICYmICpzICE9ICdcMCcpCi0JCXsKLQkJICBpZiAoKnMgPT0gJy8nKQotCQkgICAgZmlsZSA9IHMgKyAxOwotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChmaWxlICE9IE5VTEwpCi0JCXsKLQkJICBmaWxlWy0xXSA9ICdcMCc7Ci0JCSAgaW1wZmlsZSA9IGZpbGU7Ci0JCSAgaWYgKGltcHBhdGggPT0gZmlsZSAtIDEpCi0JCSAgICBpbXBwYXRoID0gIi8iOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW1wZmlsZSA9IGltcHBhdGg7Ci0JCSAgaW1wcGF0aCA9ICIiOwotCQl9Ci0JICAgICAgY3MgPSAqczsKLQkgICAgICAqcyA9ICdcMCc7Ci0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcykpCi0JCXsKLQkJICArK3M7Ci0JCSAgY3MgPSAqczsKLQkJfQotCSAgICAgIGlmIChjcyAhPSAnKCcpCi0JCXsKLQkJICBpbXBtZW1iZXIgPSAiIjsKLQkJICBpZiAoY3MgIT0gJ1wwJykKLQkJICAgIGVpbmZvIChfKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydCBmaWxlXG4iKSwKLQkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKytzOwotCQkgIGltcG1lbWJlciA9IHM7Ci0JCSAgd2hpbGUgKCpzICE9ICcpJyAmJiAqcyAhPSAnXDAnKQotCQkgICAgKytzOwotCQkgIGlmICgqcyA9PSAnKScpCi0JCSAgICAqcyA9ICdcMCc7Ci0JCSAgZWxzZQotCQkgICAgZWluZm8gKF8oIiVzOiVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0IGZpbGVcbiIpLAotCQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgdG8gYmUgaW1wb3J0ZWQgb3IgZXhwb3J0ZWQuICAqLwotICAgICAgc3ltbmFtZSA9IHM7Ci0gICAgICBzeXNjYWxsID0gZmFsc2U7Ci0gICAgICBhZGRyZXNzID0gKGJmZF92bWEpIC0xOwotCi0gICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICdcMCcpCi0JKytzOwotICAgICAgaWYgKCpzICE9ICdcMCcpCi0JewotCSAgY2hhciAqc2U7Ci0KLQkgICpzKysgPSAnXDAnOwotCi0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgICAgKytzOwotCi0JICBzZSA9IHM7Ci0JICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNlKSAmJiAqc2UgIT0gJ1wwJykKLQkgICAgKytzZTsKLQkgIGlmICgqc2UgIT0gJ1wwJykKLQkgICAgewotCSAgICAgICpzZSsrID0gJ1wwJzsKLQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkpCi0JCSsrc2U7Ci0JICAgICAgaWYgKCpzZSAhPSAnXDAnKQotCQllaW5mbyAoXygiJXMlZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiksCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgICAgfQotCi0JICBpZiAoc3RyY2FzZWNtcCAocywgInN2YyIpID09IDAKLQkgICAgICB8fCBzdHJjYXNlY21wIChzLCAic3lzY2FsbCIpID09IDApCi0JICAgIHN5c2NhbGwgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqZW5kOwotCi0JICAgICAgYWRkcmVzcyA9IHN0cnRvdWwgKHMsICZlbmQsIDApOwotCSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JCWVpbmZvIChfKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiksCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgaW1wb3J0KQotCXsKLQkgIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKm47Ci0KLQkgIGxkbGFuZ19hZGRfdW5kZWYgKHN5bW5hbWUpOwotCSAgbiA9ICgoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqKQotCSAgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QpKSk7Ci0JICBuLT5uZXh0ID0gZXhwb3J0X3N5bWJvbHM7Ci0JICBuLT5uYW1lID0gYnV5c3RyaW5nIChzeW1uYW1lKTsKLQkgIG4tPnN5c2NhbGwgPSBzeXNjYWxsOwotCSAgZXhwb3J0X3N5bWJvbHMgPSBuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBzeW1uYW1lLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgIHRydWUpOwotCSAgaWYgKGggPT0gTlVMTCB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIGp1c3QgaWdub3JlIGF0dGVtcHRzIHRvIGltcG9ydCBhbiB1bnJlZmVyZW5jZWQKLQkJIHN5bWJvbC4gICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBoLAotCQkJCQkgICAgIGFkZHJlc3MsIGltcHBhdGgsIGltcGZpbGUsCi0JCQkJCSAgICAgaW1wbWVtYmVyKSkKLQkJZWluZm8gKF8oIiVYJXM6JWQ6IGZhaWxlZCB0byBpbXBvcnQgc3ltYm9sICVzOiAlRVxuIiksCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vLCBzeW1uYW1lKTsKLQkgICAgfQotCX0KLQotICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLSAgICB9Ci0KLSAgaWYgKG9ic3RhY2tfb2JqZWN0X3NpemUgKG8pID4gMCkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJXM6JWQ6IHdhcm5pbmc6IGlnbm9yaW5nIHVudGVybWluYXRlZCBsYXN0IGxpbmVcbiIpLAotCSAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotICAgIH0KLQotICBpZiAoISBrZWVwKQotICAgIHsKLSAgICAgIG9ic3RhY2tfZnJlZSAobywgTlVMTCk7Ci0gICAgICBmcmVlIChvKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBzYXZlcyB1cyBmcm9tIHdvcnJ5aW5nIGFib3V0IGRlY2xhcmluZyBmcmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX2ZyZWUgKHApCi0gICAgIFBUUiBwOwotewotICBmcmVlIChwKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvb2tzIGZvciByZWxvY2F0aW9ucyBhbmQgYXNzaWdubWVudHMKLSAgIHRvIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfZmluZF9yZWxvY3MgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtKQotICAgIHsKLSAgICAgIGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnJzOwotCi0gICAgICBycyA9ICZzLT5yZWxvY19zdGF0ZW1lbnQ7Ci0gICAgICBpZiAocnMtPm5hbWUgPT0gTlVMTCkKLQllaW5mbyAoXygiJUYlUDogb25seSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgYXJlIHBlcm1pdHRlZFxuIikpOwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIHJzLT5uYW1lKSkKLQllaW5mbyAoXygiJUYlUDogYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLQotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgZXhwLT5hc3NpZ24uZHN0KSkKLQkgICAgZWluZm8gKF8oIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIpLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkcHBjbWFjb3NfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAotT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKLUVOVFJZKF9fc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAotICAudGV4dCAwIDoge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKigucHIpXG5cCi0gICAgKigucm8pXG5cCi0gICAgKiguZGIpXG5cCi0gICAgKiguZ2wpXG5cCi0gICAgKigueG8pXG5cCi0gICAgKigudGkpXG5cCi0gICAgKigudGIpXG5cCi0gIH1cblwKLSAgLmRhdGEgMCA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICooLnJ3KVxuXAotICAgICooLnN2KVxuXAotICAgICooLnVhKVxuXAotICAgIC4gPSBBTElHTig0KTtcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgICAqKC5kcylcblwKLSAgICAqKC50YzApXG5cCi0gICAgKigudGMpXG5cCi0gICAgKigudGQpXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKiguYnMpXG5cCi0gICAgKigudWMpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgLmxvYWRlciAwIDoge1xuXAotICAgICooLmxvYWRlcilcblwKLSAgfVxuXAotICAuZGVidWcgMCA6IHtcblwKLSAgICAqKC5kZWJ1ZylcblwKLSAgfVxuXAotfVxuXG4iCi0gIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi1FTlRSWShfX3N0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH1cblwKLSAgLnRleHQgMCA6IHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnByKVxuXAotICAgICooLnJvKVxuXAotICAgICooLmRiKVxuXAotICAgICooLmdsKVxuXAotICAgICooLnhvKVxuXAotICAgICooLnRpKVxuXAotICAgICooLnRiKVxuXAotICB9XG5cCi0gIC5kYXRhIDAgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC5sb2FkZXIgMCA6IHtcblwKLSAgICAqKC5sb2FkZXIpXG5cCi0gIH1cblwKLSAgLmRlYnVnIDAgOiB7XG5cCi0gICAgKiguZGVidWcpXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAotT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hcHBsZS1tYWNvcy9saWIpO1xuXAotRU5UUlkoX19zdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCi0gIC50ZXh0ICAgOiB7XG5cCi0gICAgUFJPVklERSAoX3RleHQgPSAuKTtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnByKVxuXAotICAgICooLnJvKVxuXAotICAgICooLmRiKVxuXAotICAgICooLmdsKVxuXAotICAgICooLnhvKVxuXAotICAgICooLnRpKVxuXAotICAgICooLnRiKVxuXAotICAgIFBST1ZJREUgKF9ldGV4dCA9IC4pO1xuXAotICB9XG5cCi0gIC5kYXRhIDAgOiB7XG5cCi0gICAgUFJPVklERSAoX2RhdGEgPSAuKTtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICooLnJ3KVxuXAotICAgICooLnN2KVxuXAotICAgICooLnVhKVxuXAotICAgIC4gPSBBTElHTig0KTtcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgICAqKC5kcylcblwKLSAgICAqKC50YzApXG5cCi0gICAgKigudGMpXG5cCi0gICAgKigudGQpXG5cCi0gICAgUFJPVklERSAoX2VkYXRhID0gLik7XG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKiguYnMpXG5cCi0gICAgKigudWMpXG5cCi0gICAgKihDT01NT04pXG5cCi0gICAgUFJPVklERSAoX2VuZCA9IC4pO1xuXAotICAgIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICB9XG5cCi0gIC5sb2FkZXIgMCA6IHtcblwKLSAgICAqKC5sb2FkZXIpXG5cCi0gIH1cblwKLSAgLmRlYnVnIDAgOiB7XG5cCi0gICAgKiguZGVidWcpXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYXBwbGUtbWFjb3MvbGliKTtcblwKLUVOVFJZKF9fc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAotICAudGV4dCAgIDoge1xuXAotICAgIFBST1ZJREUgKF90ZXh0ID0gLik7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5wcilcblwKLSAgICAqKC5ybylcblwKLSAgICAqKC5kYilcblwKLSAgICAqKC5nbClcblwKLSAgICAqKC54bylcblwKLSAgICAqKC50aSlcblwKLSAgICAqKC50YilcblwKLSAgICBQUk9WSURFIChfZXRleHQgPSAuKTtcblwKLSAgfVxuXAotICAuZGF0YSAwIDoge1xuXAotICAgIFBST1ZJREUgKF9kYXRhID0gLik7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICAgIFBST1ZJREUgKF9lZGF0YSA9IC4pO1xuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgIFBST1ZJREUgKF9lbmQgPSAuKTtcblwKLSAgICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgfVxuXAotICAubG9hZGVyIDAgOiB7XG5cCi0gICAgKigubG9hZGVyKVxuXAotICB9XG5cCi0gIC5kZWJ1ZyAwIDoge1xuXAotICAgICooLmRlYnVnKVxuXAotICB9XG5cCi19XG5cbiIKLSAgOyBlbHNlIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAotT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hcHBsZS1tYWNvcy9saWIpO1xuXAotRU5UUlkoX19zdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCi0gIC50ZXh0ICAgOiB7XG5cCi0gICAgUFJPVklERSAoX3RleHQgPSAuKTtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnByKVxuXAotICAgICooLnJvKVxuXAotICAgICooLmRiKVxuXAotICAgICooLmdsKVxuXAotICAgICooLnhvKVxuXAotICAgICooLnRpKVxuXAotICAgICooLnRiKVxuXAotICAgIFBST1ZJREUgKF9ldGV4dCA9IC4pO1xuXAotICB9XG5cCi0gIC5kYXRhIDAgOiB7XG5cCi0gICAgUFJPVklERSAoX2RhdGEgPSAuKTtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICooLnJ3KVxuXAotICAgICooLnN2KVxuXAotICAgICooLnVhKVxuXAotICAgIC4gPSBBTElHTig0KTtcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgICAqKC5kcylcblwKLSAgICAqKC50YzApXG5cCi0gICAgKigudGMpXG5cCi0gICAgKigudGQpXG5cCi0gICAgUFJPVklERSAoX2VkYXRhID0gLik7XG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKiguYnMpXG5cCi0gICAgKigudWMpXG5cCi0gICAgKihDT01NT04pXG5cCi0gICAgUFJPVklERSAoX2VuZCA9IC4pO1xuXAotICAgIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICB9XG5cCi0gIC5sb2FkZXIgMCA6IHtcblwKLSAgICAqKC5sb2FkZXIpXG5cCi0gIH1cblwKLSAgLmRlYnVnIDAgOiB7XG5cCi0gICAgKiguZGVidWcpXG5cCi0gIH1cblwKLX1cblxuIgotOyB9Ci0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfcHBjbWFjb3NfZW11bGF0aW9uID0gCi17Ci0gIGdsZHBwY21hY29zX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGRwcGNtYWNvc19hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZHBwY21hY29zX2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGRwcGNtYWNvc19nZXRfc2NyaXB0LAotICAicHBjbWFjb3MiLAotICAieGNvZmYtcG93ZXJtYWMiLAotICAwLAkvKiBmaW5pc2ggKi8KLSAgMCwJLyogY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKi8KLSAgMCwJLyogb3Blbl9keW5hbWljX2FyY2hpdmUgKi8KLSAgMCwJLyogcGxhY2Vfb3JwaGFuICovCi0gIDAsCS8qIHNldF9zeW1ib2xzICovCi0gIGdsZHBwY21hY29zX3BhcnNlX2FyZ3MsCi0gIGdsZHBwY21hY29zX3VucmVjb2duaXplZF9maWxlCi19OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LWVzaC5jIGIvbGQvbXB3LWVzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JjNWY1Li4wMDAwMDAwCi0tLSBhL2xkL21wdy1lc2guYworKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuIHNoCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfc2gKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLXN0YXRpYyB2b2lkIGdsZHNoX2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkc2hfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkc2hfYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9zaDsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGRzaF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1jb25jYXQoCi0iT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKLU9VVFBVVF9BUkNIKHNoKVxuXAotTUVNT1JZXG5cCi17XG5cCi0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCi19XG5cCi0gIiwiIFNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAudGV4dCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0cmluZ3MpXG5cCi0gIH0gXG5cCi0gIC50b3JzIDpcblwKLSAge1xuXAotICAgIF9fX2N0b3JzID0gLiA7XG5cCi0gICAgKiguY3RvcnMpXG5cCi0gICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCi0gICAgX19fZHRvcnMgPSAuIDtcblwKLSAgICAqKC5kdG9ycylcblwKLSAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKLSAgfSBcblwKLSAiLCIgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gIH0gXG5cCi0gIiwiIC5ic3MgOlxuXAotICB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9IFxuXAotICIsIiAuc3RhY2sgICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSBcblwKLSAiLCIgLnN0YWIgMCAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYilcblwKLSAgfVxuXAotICIsIiAuc3RhYnN0ciAwICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFic3RyKVxuXAotICB9XG5cCi19XG5cbiIsIE5VTEwpCi0gIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4KLWNvbmNhdCAoCi0iT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKLU9VVFBVVF9BUkNIKHNoKVxuXAotICIsIiBNRU1PUllcblwKLXtcblwKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKLX1cblwKLSAiLCIgU0VDVElPTlNcblwKLXtcblwKLSAiLCIgIC50ZXh0IDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3RyaW5ncylcblwKLSAgfSBcblwKLSAiLCIgICAudG9ycyA6XG5cCi0gIHtcblwKLSAgICBfX19jdG9ycyA9IC4gO1xuXAotICAgICooLmN0b3JzKVxuXAotICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAotICAgIF9fX2R0b3JzID0gLiA7XG5cCi0gICAgKiguZHRvcnMpXG5cCi0gICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCi0gIH0gXG5cCi0gIiwiICAgLmRhdGEgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgfSBcblwKLSAiLCIgICAuYnNzIDpcblwKLSAge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfSBcblwKLSAiLCIgICAuc3RhY2sgICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSBcblwKLSAiLCIgICAuc3RhYiAwICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFiKVxuXAotICB9XG5cCi0gIiwiICAgLnN0YWJzdHIgMCAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYnN0cilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAotT1VUUFVUX0FSQ0goc2gpXG5cCi1NRU1PUllcblwKLXtcblwKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKLX1cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAgLnRleHQgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHJpbmdzKVxuXAotICAgICBfZXRleHQgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnRvcnMgOlxuXAotICB7XG5cCi0gICAgX19fY3RvcnMgPSAuIDtcblwKLSAgICAqKC5jdG9ycylcblwKLSAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKLSAgICBfX19kdG9ycyA9IC4gO1xuXAotICAgICooLmR0b3JzKVxuXAotICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgIF9lZGF0YSA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuYnNzIDpcblwKLSAge1xuXAotICAgICBfYnNzX3N0YXJ0ID0gLiA7IFxuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICAgX2VuZCA9IC4gOyAgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWNrICAweDMwMDAwICAgOlxuXAotICB7XG5cCi0gICAgIF9zdGFjayA9IC4gOyBcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhYiAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWIpXG5cCi0gIH1cblwKLSAiLCIgICAuc3RhYnN0ciAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWJzdHIpXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLSAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCi1PVVRQVVRfQVJDSChzaClcblwKLU1FTU9SWVxuXAote1xuXAotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAotfVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAiLCIgICAudGV4dCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0cmluZ3MpXG5cCi0gICAgIF9ldGV4dCA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAudG9ycyA6XG5cCi0gIHtcblwKLSAgICBfX19jdG9ycyA9IC4gO1xuXAotICAgICooLmN0b3JzKVxuXAotICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAotICAgIF9fX2R0b3JzID0gLiA7XG5cCi0gICAgKiguZHRvcnMpXG5cCi0gICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLmRhdGEgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAgX2VkYXRhID0gLiA7IFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5ic3MgOlxuXAotICB7XG5cCi0gICAgIF9ic3Nfc3RhcnQgPSAuIDsgXG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgICBfZW5kID0gLiA7ICBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhY2sgIDB4MzAwMDAgICA6XG5cCi0gIHtcblwKLSAgICAgX3N0YWNrID0gLiA7IFxuXAotICAgICooLnN0YWNrKVxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5zdGFiIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYilcblwKLSAgfVxuXAotICIsIiAgIC5zdGFic3RyIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYnN0cilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCi1PVVRQVVRfQVJDSChzaClcblwKLU1FTU9SWVxuXAote1xuXAotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAotfVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAiLCIgICAudGV4dCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0cmluZ3MpXG5cCi0gICAgIF9ldGV4dCA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAudG9ycyA6XG5cCi0gIHtcblwKLSAgICBfX19jdG9ycyA9IC4gO1xuXAotICAgICooLmN0b3JzKVxuXAotICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAotICAgIF9fX2R0b3JzID0gLiA7XG5cCi0gICAgKiguZHRvcnMpXG5cCi0gICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLmRhdGEgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAgX2VkYXRhID0gLiA7IFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5ic3MgOlxuXAotICB7XG5cCi0gICAgIF9ic3Nfc3RhcnQgPSAuIDsgXG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgICBfZW5kID0gLiA7ICBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhY2sgIDB4MzAwMDAgICA6XG5cCi0gIHtcblwKLSAgICAgX3N0YWNrID0gLiA7IFxuXAotICAgICooLnN0YWNrKVxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5zdGFiIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYilcblwKLSAgfVxuXAotICIsIiAgIC5zdGFic3RyIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYnN0cilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotOyB9Ci0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfc2hfZW11bGF0aW9uID0gCi17Ci0gIGdsZHNoX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkc2hfZ2V0X3NjcmlwdCwKLSAgInNoIiwKLSAgImNvZmYtc2giCi19OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LWlkdG1pcHMuYyBiL2xkL21wdy1pZHRtaXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZGRjNzAuLjAwMDAwMDAKLS0tIGEvbGQvbXB3LWlkdG1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIEhhbmRsZSBlbWJlZGRlZCByZWxvY3MgZm9yIE1JUFMuCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+IGJhc2VkIG9uIGdlbmVyaWMuZW0uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX21pcHNpZHQKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLXN0YXRpYyB2b2lkIGdsZG1pcHNpZHRfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZG1pcHNpZHRfYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBnbGRtaXBzaWR0X2FmdGVyX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZG1pcHNpZHRfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkbWlwc2lkdF9iZWZvcmVfcGFyc2UoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX21pcHM7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBydW4gYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLgotICAgV2UgY3JlYXRlIGEgLnJlbC5zZGF0YSBzZWN0aW9uIGZvciBlYWNoIGlucHV0IGZpbGUgd2l0aCBhIG5vbiB6ZXJvCi0gICAuc2RhdGEgc2VjdGlvbi4gIFRoZSBCRkQgYmFja2VuZCB3aWxsIGZpbGwgaW4gdGhlc2Ugc2VjdGlvbnMgd2l0aAotICAgbWFnaWMgbnVtYmVycyB3aGljaCBjYW4gYmUgdXNlZCB0byByZWxvY2F0ZSB0aGUgZGF0YSBzZWN0aW9uIGF0IHJ1bgotICAgdGltZS4gIFRoaXMgd2lsbCBvbmx5IGRvIHRoZSByaWdodCB0aGluZyBpZiBhbGwgdGhlIGlucHV0IGZpbGVzCi0gICBoYXZlIGJlZW4gY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkbWlwc2lkdF9hZnRlcl9vcGVuICgpCi17Ci0gIGJmZCAqYWJmZDsKLQotICBpZiAoISBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzCi0gICAgICB8fCBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICBmb3IgKGFiZmQgPSBsaW5rX2luZm8uaW5wdXRfYmZkczsgYWJmZCAhPSBOVUxMOyBhYmZkID0gYWJmZC0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhc2VjOwotCi0gICAgICBkYXRhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2RhdGEiKTsKLQotICAgICAgLyogTm90ZSB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZSByZWxvY19jb3VudCBmaWVsZCBoYXMgYWxyZWFkeQotICAgICAgICAgYmVlbiBzZXQgdXAuICBXZSBjb3VsZCBjYWxsIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQsIGJ1dAotICAgICAgICAgdGhhdCByZXR1cm5zIHRoZSBzaXplIG9mIGEgbWVtb3J5IGJ1ZmZlciByYXRoZXIgdGhhbiBhIHJlbG9jCi0gICAgICAgICBjb3VudC4gIFdlIGRvIG5vdCB3YW50IHRvIGNhbGwgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKLSAgICAgICAgIGJlY2F1c2UgYWx0aG91Z2ggaXQgd291bGQgYWx3YXlzIHdvcmsgaXQgd291bGQgZm9yY2UgdXMgdG8KLSAgICAgICAgIHJlYWQgaW4gdGhlIHJlbG9jcyBpbnRvIEJGRCBjYW5vbmljYWwgZm9ybSwgd2hpY2ggd291bGQgd2FzdGUKLSAgICAgICAgIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUgYW5kIG1lbW9yeS4gICovCi0gICAgICBpZiAoZGF0YXNlYyAhPSBOVUxMICYmIGRhdGFzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICBhc2VjdGlvbiAqcmVsc2VjOwotCi0JICByZWxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbC5zZGF0YSIpOwotCSAgaWYgKHJlbHNlYyA9PSBOVUxMCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHJlbHNlYywKLQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWSkpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCByZWxzZWMsIDIpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsc2VjLAotCQkJCQkgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KSkKLQkgICAgZWluZm8gKF8oIiVGJUI6IGNhbiBub3QgY3JlYXRlIC5yZWwuc2RhdGEgc2VjdGlvbjogJUVcbiIpKTsKLQl9Ci0KLSAgICAgIC8qIERvdWJsZSBjaGVjayB0aGF0IGFsbCBvdGhlciBkYXRhIHNlY3Rpb25zIGFyZSBlbXB0eSwgYXMgaXMKLSAgICAgICAgIHJlcXVpcmVkIGZvciBlbWJlZGRlZCBQSUMgY29kZS4gICovCi0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGNoZWNrX3NlY3Rpb25zLCAoUFRSKSBkYXRhc2VjKTsKLSAgICB9Ci19Ci0KLS8qIENoZWNrIHRoYXQgb2YgdGhlIGRhdGEgc2VjdGlvbnMsIG9ubHkgdGhlIC5zZGF0YSBzZWN0aW9uIGhhcwotICAgcmVsb2NzLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGVja19zZWN0aW9ucyAoYWJmZCwgc2VjLCBzZGF0YXNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgc2RhdGFzZWM7Ci17Ci0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpID09IDAKLSAgICAgICYmIHNlYyAhPSAoYXNlY3Rpb24gKikgc2RhdGFzZWMKLSAgICAgICYmIHNlYy0+cmVsb2NfY291bnQgIT0gMCkKLSAgICBlaW5mbyAoXygiJUYlWDogc2VjdGlvbiAlcyBoYXMgcmVsb2NzOyBjYW4gbm90IHVzZSAtLWVtYmVkZGVkLXJlbG9jc1xuIiksCi0JICAgYWJmZCwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbiBzaXplcyBhbmQgb2Zmc2V0cyBoYXZlCi0gICBiZWVuIHNldC4gIElmIHdlIGFyZSBnZW5lcmF0aW5nIGVtYmVkZGVkIHJlbG9jcywgaXQgY2FsbHMgYSBzcGVjaWFsCi0gICBCRkQgYmFja2VuZCByb3V0aW5lIHRvIGRvIHRoZSB3b3JrLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZG1pcHNpZHRfYWZ0ZXJfYWxsb2NhdGlvbiAoKQotewotICBiZmQgKmFiZmQ7Ci0KLSAgaWYgKCEgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcwotICAgICAgfHwgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChhYmZkID0gbGlua19pbmZvLmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YXNlYywgKnJlbHNlYzsKLSAgICAgIGNoYXIgKmVycm1zZzsKLQotICAgICAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIGlmIChkYXRhc2VjID09IE5VTEwgfHwgZGF0YXNlYy0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsLnNkYXRhIik7Ci0gICAgICBBU1NFUlQgKHJlbHNlYyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyAoYWJmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgIGRhdGFzZWMsIHJlbHNlYywKLQkJCQkJCSAgICZlcnJtc2cpKQotCXsKLQkgIGlmIChlcnJtc2cgPT0gTlVMTCkKLQkgICAgZWluZm8gKF8oIiVCJVg6IGNhbiBub3QgY3JlYXRlIHJ1bnRpbWUgcmVsb2MgaW5mb3JtYXRpb246ICVFXG4iKSwKLQkJICAgYWJmZCk7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlWCVCOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlc1xuIiksCi0JCSAgIGFiZmQsIGVycm1zZyk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkbWlwc2lkdF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1jb25jYXQoCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC50ZXh0IDoge1xuXAotICAgIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICAqKC5maW5pKVxuXAotICAgIDtcblwKLSAgICA7XG5cCi0gIH1cblwKLSAiLCIgIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAgfVxuXAotICIsIiAgLnNkYXRhIDoge1xuXAotICAgICooLnNkYXRhKVxuXAotICB9XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC50ZXh0IDoge1xuXAotICAgIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICAqKC5maW5pKVxuXAotICAgIDtcblwKLSAgICA7XG5cCi0gIH1cblwKLSAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gIH1cblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybgotY29uY2F0KAotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAuID0gMHhhMDAxMjAwMDtcblwKLSAgLnRleHQgOiB7XG5cCi0gICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLmluaXQpXG5cCi0gICAgIGVwcm9sICA9ICAuO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7XG5cCi0gICAgKigucmVsLnNkYXRhKVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdG9wID0gLik7XG5cCi0gICAgKiguZmluaSlcblwKLSAgICAgZXRleHQgID0gIC47XG5cCi0gICAgIF9ldGV4dCAgPSAgLjtcblwKLSIsIiAgfVxuXAotICAuID0gLjtcblwKLSAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gICBfZmRhdGEgPSBBTElHTigxNik7XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtcblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotIiwiICAgZWRhdGEgID0gIC47XG5cCi0gICBfZWRhdGEgID0gIC47XG5cCi0gICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotICAgZW5kID0gLjtcblwKLSAgIF9lbmQgPSAuO1xuXAotfVxuXG4iCi0sIE5VTEwpCi0gIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKLUVOVFJZKHN0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLiA9IDB4YTAwMTIwMDA7XG5cCi0gIC50ZXh0IDoge1xuXAotICAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgICBlcHJvbCAgPSAgLjtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO1xuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO1xuXAotICAgICooLmZpbmkpXG5cCi0gICAgIGV0ZXh0ICA9ICAuO1xuXAotICAgICBfZXRleHQgID0gIC47XG5cCi0gIiwiICB9XG5cCi0gIC4gPSAuO1xuXAotICAucmRhdGEgOiB7XG5cCi0gICAgKigucmRhdGEpXG5cCi0gIH1cblwKLSAgIF9mZGF0YSA9IEFMSUdOKDE2KTtcblwKLSAgLmRhdGEgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO1xuXAotICAubGl0OCA6IHtcblwKLSAgICAqKC5saXQ4KVxuXAotICIsIiAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAgZWRhdGEgID0gIC47XG5cCi0gICBfZWRhdGEgID0gIC47XG5cCi0gICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAiLCIgIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgIGVuZCA9IC47XG5cCi0gICBfZW5kID0gLjtcblwKLX1cblxuIgotLCBOVUxMKQotICA7IGVsc2UgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAuID0gMHhhMDAxMjAwMDtcblwKLSAgLnRleHQgOiB7XG5cCi0gICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLmluaXQpXG5cCi0gICAgIGVwcm9sICA9ICAuO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7XG5cCi0gICAgKigucmVsLnNkYXRhKVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdG9wID0gLik7XG5cCi0gICAgKiguZmluaSlcblwKLSAgICAgZXRleHQgID0gIC47XG5cCi0gICAgIF9ldGV4dCAgPSAgLjtcblwKLSAiLCIgIH1cblwKLSAgLiA9IC47XG5cCi0gIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAgX2ZkYXRhID0gQUxJR04oMTYpO1xuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gICBfZ3AgPSBBTElHTigxNikgKyAweDgwMDA7XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAiLCIgIH1cblwKLSAgLnNkYXRhIDoge1xuXAotICAgICooLnNkYXRhKVxuXAotICB9XG5cCi0gICBlZGF0YSAgPSAgLjtcblwKLSAgIF9lZGF0YSAgPSAgLjtcblwKLSAgIF9mYnNzID0gLjtcblwKLSAgLnNic3MgOiB7XG5cCi0gICAgKiguc2JzcylcblwKLSAgICAqKC5zY29tbW9uKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gICBlbmQgPSAuO1xuXAotICAgX2VuZCA9IC47XG5cCi19XG5cbiIKLSwgTlVMTCkKLTsgfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX21pcHNpZHRfZW11bGF0aW9uID0gCi17Ci0gIGdsZG1pcHNpZHRfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZG1pcHNpZHRfYWZ0ZXJfb3BlbiwKLSAgZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uLAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGRtaXBzaWR0X2dldF9zY3JpcHQsCi0gICJtaXBzaWR0IiwKLSAgImVjb2ZmLWJpZ21pcHMiCi19OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LW1ha2Uuc2VkIGIvbGQvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTE5NzA4Li4wMDAwMDAwCi0tLSBhL2xkL21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgbGQgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgotCi0vSERFRklORVMvcy9ASERFRklORVNALy8KLQotL150YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQC9zL14vIy8KLQotL15FTVVMID0gQEVNVUxAL3MvXi8jLwotCi0vXkVNVUxBVElPTl9PRklMRVMgPSBARU1VTEFUSU9OX09GSUxFU0Avcy9eLyMvCi0KLSMgRml4YWRkIHRvIHRoZSBpbmNsdWRlIHBhdGhzLgotL15JTkNMVURFUyA9IC4qJC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotL0JGRERJUi9zLy1pIHtCRkRESVJ9IC8taSAie0JGRERJUn0iOiAvCi0vSU5DRElSL3MvLWkge0lOQ0RJUn0gLy1pICJ7SU5DRElSfSI6IC8KLQotIyBVc2UgYnlhY2MgaW5zdGVhZCBvZiBiaXNvbiAoZm9yIG5vdyBhbnl3YXkpLgotL0JJU09OL3MvXkJJU09OID0uKiQvQklTT04gPSBieWFjYy8KLSMvQklTT05GTEFHUy9zL15CSVNPTkZMQUdTID0uKiQvQklTT05GTEFHUyA9IC8KLQotIyBTdXBwcmVzcyB0aGUgc3VwcHJlc3Npb24gb2Ygc21hcnQgbWFrZXMuCi0vXlwueVwuYy9kCi0KLSMgSGFjayB1cCBsZG1haW4gY29tcGlsZS4KLS9eIntvfSJsZG1haW4uYy5vIFxcT3B0aW9uLWYgLiogY29uZmlnLnN0YXR1cyQvLC9eJC9jXAotIntvfSJsZG1haW4uYy5vIFxcT3B0aW9uLWYgICJ7c30ibGRtYWluLmNcCi0Je0NDfSBAREFTSF9DX0ZMQUdAIC1kIERFRkFVTFRfRU1VTEFUSU9OPXtkcX17RU1VTH17ZHF9IC1kIFNDUklQVERJUj17ZHF9e3NjcmlwdGRpcn17ZHF9IHtBTExfQ0ZMQUdTfSAie3N9ImxkbWFpbi5jIC1vICJ7b30ibGRtYWluLmMub1wKLQotCi0jIFJlbW92ZSBsZGVtdWwtbGlzdC5oIGJ1aWxkLCByZWx5IG9uIGNvbmZpZ3VyZSB0byBtYWtlIG9uZS4KLS9ebGRlbXVsLWxpc3QuaCAvLC9SZW5hbWUgLXkgIntzfSJsZGVtdWwtdG1wLmggL2QKLQotIyBGaXggcGF0aG5hbWVzIHRvIGdlbmVyYXRlZCBmaWxlcy4KLS9jb25maWcuaC9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZwotL2NvbmZpZy5oL3MvXmNvbmZpZ1wuaC8ie299ImNvbmZpZy5oLwotCi0veS50YWIuYy9zLyJ7c30ieVwudGFiXC5jLyJ7b30ieS50YWIuYy9nCi0veS50YWIuYy9zL155XC50YWJcLmMvIntvfSJ5LnRhYi5jLwotL3kudGFiLmgvcy8ie3N9InlcLnRhYlwuaC8ie299InkudGFiLmgvZwotL3kudGFiLmgvcy9eeVwudGFiXC5oLyJ7b30ieS50YWIuaC8KLQotL2xkZ3JhbS5jL3MvIntzfSJsZGdyYW1cLmMvIntvfSJsZGdyYW0uYy9nCi0vbGRncmFtLmMvcy9ebGRncmFtXC5jLyJ7b30ibGRncmFtLmMvCi0KLS9sZGdyYW0uaC9zLyJ7c30ibGRncmFtXC5oLyJ7b30ibGRncmFtLmgvZwotL2xkZ3JhbS5oL3MvXmxkZ3JhbVwuaC8ie299ImxkZ3JhbS5oLwotCi0vbGRsZXguYy9zLyJ7c30ibGRsZXhcLmMvIntvfSJsZGxleC5jL2cKLS9sZGxleC5jL3MvXmxkbGV4XC5jLyJ7b30ibGRsZXguYy8KLQotL2xkbGV4LmMubmV3L3MvIntzfSJsZGxleFwuY1wubmV3LyJ7b30ibGRsZXguYy5uZXcvZwotCi0vbGV4Lnl5LmMvcy8ie3N9ImxleFwueXlcLmMvIntvfSJsZXgueXkuYy9nCi0KLS9sZGVtdWwtbGlzdC5oL3MvIntzfSJsZGVtdWwtbGlzdFwuaC8ie299ImxkZW11bC1saXN0LmgvZwotL2xkZW11bC1saXN0Lmgvcy9ebGRlbXVsLWxpc3RcLmgvIntvfSJsZGVtdWwtbGlzdC5oLwotCi0jIEVkaXQgcGF0aG5hbWVzIHRvIGVtdWxhdGlvbiBmaWxlcy4KLS8ie3N9ImUuKlwuYy9zLyJ7c30iZVwoWy1fYS16MC05XSpcKVwuYy8ie299ImVcMS5jL2cKLS9eZS4qXC5jL3MvXmVcKFstX2EtejAtOV0qXClcLmMvIntvfSJlXDEuYy8KLQotIyBXZSBjYW4ndCBydW4gZ2Vuc2NyaXB0cywgc28gZG9uJ3QgdHJ5LgotL3tHRU5TQ1JJUFRTfS9zL3tHRU5TQ1JJUFRTfS9udWxsLWNvbW1hbmQvCi0KLSMgQ29tbWVudCBvdXQgdGhlIFRESVJTIGJpdHMuCi0vXlRESVJTQC9zL14vIy8KLQotIyBQb2ludCBhdCB0aGUgQkZEIGxpYnJhcnkgZGlyZWN0bHkuCi0vQEJGRExJQkAvcy9AQkZETElCQC86OmJmZDpsaWJiZmQuby8KLQotIyBEb24ndCBuZWVkIHRoaXMuCi0vQEhMREZMQUdTQC9zL0BITERGTEFHU0AvLwotCi0jL3NlZC4qZnJlZS8sLz4gIntvfSJsZGxleC5jLm5ldy9jXAotIwlcCUNhdGVuYXRlICJ7b30ibGV4Lnl5LmMgPiJ7b30ibGRsZXguYy5uZXcKLQotIyBUaGUgcmVzb3VyY2UgZmlsZSBpcyBjYWxsZWQgbWFjLWxkLnIuCi0ve0xEX1BST0d9LnIvcy97TERfUFJPR31cLnIvbWFjLWxkLnIvCi0KLS9eaW5zdGFsbCBcXE9wdGlvbi1mIC8sL14kL2NcCi1pbnN0YWxsIFxcT3B0aW9uLWYgIGFsbCBpbnN0YWxsLW9ubHlcCi1cCi1pbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKLQlEdXBsaWNhdGUgLXkgOmxkLm5ldyAie2JpbmRpcn0ibGRcCi0KLQotIyBSZW1vdmUgZGVwZW5kZW5jeSByZWJ1aWxkaW5nIGNydWQuCi0vXi5kZXAgLywvIyAuUEhPTlkgL2QKLQotIyBSZW1vdmUgdGhlIGxpbnRsb2cgYWN0aW9uLCBwaXBlIHN5bWJvbHMgaW4gY29sdW1uIDEgbG9zZS4KLS9ebGludGxvZyBcXE9wdGlvbi1mLywvXiQvZAotCi0vXk1ha2VmaWxlIFxcT3B0aW9uLWYvLC9eJC9kCi0vXiJ7b30iY29uZmlnLmggXFxPcHRpb24tZi8sL14kL2QKLS9eY29uZmlnLnN0YXR1cyBcXE9wdGlvbi1mLywvXiQvZApkaWZmIC0tZ2l0IGEvbGQvbXJpLmMgYi9sZC9tcmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5MTg2Yy4uMDAwMDAwMAotLS0gYS9sZC9tcmkuYworKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKiBtcmkuYyAtLSBoYW5kbGUgTVJJIHN0eWxlIGxpbmtlciBzY3JpcHRzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGJpdCBkb2VzIHRoZSB0cmVlIGRlY29yYXRpb24gd2hlbiBNUkkgc3R5bGUgbGluayBzY3JpcHRzIGFyZSBwYXJzZWQgKi8KLQotLyoKLSAgY29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgCQkgc2FjQGN5Z251cy5jb20KLQotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIiAKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibXJpLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0IHsKLSAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm5leHQ7Ci0gIENPTlNUIGNoYXIgKm5hbWU7Ci0gIENPTlNUIGNoYXIgKmFsaWFzOwotICBldHJlZV90eXBlICp2bWE7Ci0gIGV0cmVlX3R5cGUgKmFsaWduOwotICBldHJlZV90eXBlICpzdWJhbGlnbjsKLSAgaW50IG9rX3RvX2xvYWQ7Ci19IDsKLQotdW5zaWduZWQgaW50IHN5bWJvbF90cnVuY2F0ZSA9IDEwMDAwOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm9yZGVyOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm9ubHlfbG9hZDsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphZGRyZXNzOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFsaWFzOwotCi1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWxpZ25tZW50Owotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnN1YmFsaWdubWVudDsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbG9va3VwCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdCkpOwotc3RhdGljIHZvaWQgbXJpX2FkZF90b19saXN0IFBBUkFNUyAoKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKnZtYSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKnphbGlhcywgZXRyZWVfdHlwZSAqYWxpZ24sCi0JCQkJICAgICBldHJlZV90eXBlICpzdWJhbGlnbikpOwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKioKLWxvb2t1cCAobmFtZSwgbGlzdCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsaXN0OwotewotCi0gIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqcHRyID0gbGlzdDsKLSAgd2hpbGUgKCpwdHIpIAotICB7Ci0gICAgaWYgKHN0cmNtcChuYW1lLCAoKnB0ciktPm5hbWUpID09IDApIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSBtYXRjaCwgZGVsZXRlIGl0LCB3ZSBvbmx5IGtlZXAgdGhlIGxhc3QgaW5zdGFuY2UKLQkgb2YgYW55IG5hbWUgKi8KLSAgICAgICpwdHIgPSAoKnB0ciktPm5leHQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcHRyID0gJigoKnB0ciktPm5leHQpOwotICAgIH0KLSAgfQotCi0gICpwdHIgPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKil4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCkpOwotICByZXR1cm4gcHRyOwotfQotCi1zdGF0aWMgdm9pZAotbXJpX2FkZF90b19saXN0IChsaXN0LCBuYW1lLCB2bWEsIHphbGlhcywgYWxpZ24sIHN1YmFsaWduKQotICAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxpc3Q7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKnZtYTsKLSAgICAgQ09OU1QgY2hhciAqemFsaWFzOwotICAgICBldHJlZV90eXBlICphbGlnbjsKLSAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ247Ci17Ci0gIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqcHRyID0gbG9va3VwKG5hbWUsbGlzdCk7Ci0gICgqcHRyKS0+bmFtZSA9IG5hbWU7Ci0gICgqcHRyKS0+dm1hID0gdm1hOwotICAoKnB0ciktPm5leHQgPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMOwotICAoKnB0ciktPm9rX3RvX2xvYWQgPSAwOwotICAoKnB0ciktPmFsaWFzID0gemFsaWFzOwotICAoKnB0ciktPmFsaWduID0gYWxpZ247Ci0gICgqcHRyKS0+c3ViYWxpZ24gPSBzdWJhbGlnbjsKLX0KLQotCi12b2lkCi1tcmlfb3V0cHV0X3NlY3Rpb24gKG5hbWUsIHZtYSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqdm1hOwotewotICBtcmlfYWRkX3RvX2xpc3QoJmFkZHJlc3MsIG5hbWUsIHZtYSwgMCwwLDApOwotfQotCi0vKiBpZiBhbnkgQUJTT0xVVEUgPG5hbWU+IGFyZSBpbiB0aGUgc2NyaXB0LCBvbmx5IGxvYWQgdGhvc2UgZmlsZXMKLW1hcmtlZCB0aHVzICovCi0KLXZvaWQKLW1yaV9vbmx5X2xvYWQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmb25seV9sb2FkLCBuYW1lLCAwLCAwLDAsMCk7Ci19Ci0KLQotdm9pZAotbXJpX2Jhc2UgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBiYXNlID0gZXhwOwotfQotCi1zdGF0aWMgaW50IGRvbmVfdHJlZSA9IDA7Ci0KLXZvaWQKLW1yaV9kcmF3X3RyZWUgKCkKLXsKLSAgaWYgKGRvbmVfdHJlZSkgcmV0dXJuOwotCi0gIC8qIFdlIGRvbid0IGJvdGhlciB3aXRoIG1lbW9yeSByZWdpb25zLiAgKi8KLSNpZiAwCi0gIC8qIENyZWF0ZSB0aGUgcmVnaW9ucyAqLwotIHsKLSAgIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpyOwotICAgciA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAoImxvbmciKTsKLSAgIHItPmN1cnJlbnQgPSByLT5vcmlnaW4gPSBleHBfZ2V0X3ZtYShiYXNlLCAoYmZkX3ZtYSkwLCAib3JpZ2luIiwKLQkJCQkJbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLSAgIHItPmxlbmd0aCA9IChiZmRfc2l6ZV90eXBlKSBleHBfZ2V0X3ZtYSgwLCAoYmZkX3ZtYSkgfigoYmZkX3NpemVfdHlwZSkwKSwKLQkJCQkJICAgImxlbmd0aCIsIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0gfQotI2VuZGlmCi0gIAotICAvKiBOb3cgYnVpbGQgdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBsZGxhbmcgbWFjaGluZSAqLwotCi0KLSAgLyogQXR0YXRjaCB0aGUgYWRkcmVzc2VzIG9mIGFueSB3aGljaCBoYXZlIGFkZHJlc3NlcywgYW5kIGFkZCB0aGUKLSAgICAgb25lcyBub3QgbWVudGlvbmVkICovCi0gIGlmIChhZGRyZXNzICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIHsKLSAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWxpc3Q7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm9saXN0OwotICAgIGlmIChvcmRlciA9PSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMKSB7Ci0gICAgICBvcmRlciA9IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgZm9yIChhbGlzdCA9IGFkZHJlc3M7Ci0JIGFsaXN0ICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCopTlVMTDsKLQkgYWxpc3QgPSBhbGlzdC0+bmV4dCkgCi0gICAgewotICAgICAgaW50IGRvbmUgPSAwOwotICAgICAgZm9yIChvbGlzdCA9IG9yZGVyOwotCSAgIGRvbmUgPT0gMCAmJgotCSAgIG9saXN0ICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEw7Ci0JICAgb2xpc3QgPSBvbGlzdC0+bmV4dCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChhbGlzdC0+bmFtZSwgb2xpc3QtPm5hbWUpID09IDApIAotCXsKLQkgIG9saXN0LT52bWEgPSBhbGlzdC0+dm1hOwotCSAgZG9uZSA9IDE7Ci0JfQotICAgICAgfQotICAgICAgaWYgKCFkb25lKSB7Ci0JLyogYWRkIHRoaXMgb250byBlbmQgb2Ygb3JkZXIgbGlzdCAqLwotCW1yaV9hZGRfdG9fbGlzdCgmb3JkZXIsIGFsaXN0LT5uYW1lLCBhbGlzdC0+dm1hLCAwLDAsMCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgfQotCi0gIC8qIElmIHdlJ3JlIG9ubHkgc3VwcG9zZWQgdG8gbG9hZCBhIHN1YnNldCBvZiB0aGVtIGluLCB0aGVuIHBydW5lCi0gICAgIHRoZSBsaXN0LiAgKi8KLQotICBpZiAob25seV9sb2FkICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIAotICB7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnB0cjE7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnB0cjI7Ci0gICAgaWYgKG9yZGVyID09IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCopTlVMTCkKLSAgICAgb3JkZXIgPSBvbmx5X2xvYWQ7Ci0gICAgCi0gICAgLyogU2VlIGlmIHRoaXMgbmFtZSBpcyBpbiB0aGUgbGlzdCwgaWYgaXQgaXMgdGhlbiB3ZSBjYW4gbG9hZCBpdAotICAgICAqLwotICAgIGZvciAocHRyMSA9IG9ubHlfbG9hZDsgcHRyMTsgcHRyMSA9IHB0cjEtPm5leHQpIAotICAgIHsKLSAgICAgIGZvciAocHRyMj0gb3JkZXI7IHB0cjI7IHB0cjI9cHRyMi0+bmV4dCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChwdHIyLT5uYW1lLCBwdHIxLT5uYW1lKT09MCkgewotCSAgcHRyMi0+b2tfdG9fbG9hZCA9IDE7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIAotICB7Ci0gICAgLyogTm8gb25seSBsb2FkIGxpc3QsIHNvIGV2ZXJ5dGhpbmcgaXMgb2sgdG8gbG9hZCAqLwotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpwdHI7Ci0gICAgZm9yIChwdHIgPSBvcmRlcjsgcHRyOyBwdHI9cHRyLT5uZXh0KSB7Ci0gICAgICBwdHItPm9rX3RvX2xvYWQgPSAxOwotICAgIH0KLSAgfQotCi0KLQotICAvKiBDcmVhdGUgdGhlIG9yZGVyIG9mIHNlY3Rpb25zIHRvIGxvYWQgKi8KLSAgaWYgKG9yZGVyICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIAotICB7Ci0gICAgLyogQmVlbiB0b2xkIHRvIG91dHB1dCB0aGUgc2VjdGlvbnMgaW4gYSBjZXJ0YWluIG9yZGVyICovCi0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnAgPSBvcmRlcjsKLSAgICB3aGlsZSAocCkgCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFwdHI7Ci0gICAgICBldHJlZV90eXBlICphbGlnbiA9IDA7Ci0gICAgICBldHJlZV90eXBlICpzdWJhbGlnbiA9IDA7Ci0gICAgICAvKiBTZWUgaWYgYW4gYWxpZ25tZW50IGhhcyBiZWVuIHNwZWNpZmllZCAqLwotCi0gICAgICBmb3IgKGFwdHIgPSBhbGlnbm1lbnQ7IGFwdHI7IGFwdHI9IGFwdHItPm5leHQpCi0gICAgICB7Ci0JaWYgKHN0cmNtcChhcHRyLT5uYW1lLCBwLT5uYW1lKT09MCkgewotCSAgYWxpZ24gPSAgYXB0ci0+YWxpZ247Ci0JfQotICAgICAgfQotCi0gICAgICBmb3IgKGFwdHIgPSBzdWJhbGlnbm1lbnQ7IGFwdHI7IGFwdHI9IGFwdHItPm5leHQpCi0gICAgICB7Ci0JaWYgKHN0cmNtcChhcHRyLT5uYW1lLCBwLT5uYW1lKT09MCkgewotCSAgc3ViYWxpZ24gPSAgYXB0ci0+c3ViYWxpZ247Ci0JfQotICAgICAgfQotCi0gICAgICBpZiAoYmFzZSA9PSAwKSB7Ci0JYmFzZSA9IHAtPnZtYSA/IHAtPnZtYSA6ZXhwX25hbWVvcChOQU1FLCAiLiIpOwotICAgICAgfQotICAgICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKHAtPm5hbWUsIGJhc2UsCi0JCQkJCSAgIHAtPm9rX3RvX2xvYWQgPyAwIDogbm9sb2FkX3NlY3Rpb24sCi0JCQkJCSAgIDEsIGFsaWduLCBzdWJhbGlnbiwKLQkJCQkJICAgKGV0cmVlX3R5cGUgKikgTlVMTCk7Ci0gICAgICBiYXNlID0gMDsKLSAgICAgIGxhbmdfYWRkX3dpbGQgKHAtPm5hbWUsIGZhbHNlLCAoY2hhciAqKU5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCk7Ci0gICAgICAvKiBJZiB0aGVyZSBpcyBhbiBhbGlhcyBmb3IgdGhpcyBzZWN0aW9uLCBhZGQgaXQgdG9vICovCi0gICAgICBmb3IgKGFwdHIgPSBhbGlhczsgYXB0cjsgYXB0ciA9IGFwdHItPm5leHQpIHsKLQotCWlmIChzdHJjbXAoYXB0ci0+YWxpYXMsIHAtPm5hbWUpPT0gMCkgewotCSAgbGFuZ19hZGRfd2lsZCAoYXB0ci0+bmFtZSwgZmFsc2UsIChjaGFyICopTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKTsKLQl9Ci0gICAgICB9Ci0KLSAgICAgIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0JKDAsICIqZGVmYXVsdCoiLCAoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopIE5VTEwsIAotICAgICAgICAgIipkZWZhdWx0KiIpOwotCi0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0gIH0KLQotCi0gIGRvbmVfdHJlZSA9IDE7Ci0KLX0KLXZvaWQKLW1yaV9sb2FkIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBiYXNlID0gMDsKLSAgbGFuZ19hZGRfaW5wdXRfZmlsZShuYW1lLAotCQkgICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtLCAoY2hhciAqKU5VTEwpOwotICAvKiAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQoMCwiKmRlZmF1bHQqIik7Ki8KLX0KLQotCi12b2lkCi1tcmlfb3JkZXIgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmb3JkZXIsIG5hbWUsIDAsIDAsMCwwKTsKLX0KLQotdm9pZCAKLW1yaV9hbGlhcyAod2FudCwgaXMsIGlzbikKLSAgICAgQ09OU1QgY2hhciAqd2FudDsKLSAgICAgQ09OU1QgY2hhciAqaXM7Ci0gICAgIGludCBpc247Ci17Ci0gIGlmICghaXMpIHsKLSAgICAvKiBTb21lIHNlY3Rpb25zIGFyZSBkaWdpdHMgLSAqLwotICAgIGNoYXIgYnVmWzIwXTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgaXNuKTsKLSAgICBpcyA9IHhzdHJkdXAgKGJ1Zik7Ci0gICAgaWYgKGlzID09IE5VTEwpCi0gICAgICBhYm9ydCAoKTsKLSAgfQotICBtcmlfYWRkX3RvX2xpc3QoJmFsaWFzLCBpcywgMCwgd2FudCwwLDApOwotCi19Ci0KLQotdm9pZCAKLW1yaV9uYW1lIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBsYW5nX2FkZF9vdXRwdXQobmFtZSwgMSk7Ci0KLX0KLQotCi12b2lkCi1tcmlfZm9ybWF0IChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBpZiAoc3RyY21wKG5hbWUsICJTIikgPT0gMCkKLSAgewotICAgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQoInNyZWMiLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMLCAxKTsKLSAgfQotICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIklFRUUiKSA9PSAwKQotICB7Ci0gICAgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCgiaWVlZSIsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDEpOwotICB9Ci0gIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiQ09GRiIpID09IDApCi0gIHsKLSAgICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KCJjb2ZmLW02OGsiLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMLCAxKTsKLSAgfQotICBlbHNlIHsKLSAgICBlaW5mbyhfKCIlUCVGOiB1bmtub3duIGZvcm1hdCB0eXBlICVzXG4iKSwgbmFtZSk7Ci0gIH0KLX0KLQotCi12b2lkCi1tcmlfcHVibGljIChuYW1lLCBleHApCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgbGFuZ19hZGRfYXNzaWdubWVudChleHBfYXNzb3AoJz0nLCBuYW1lLCBleHApKTsKLX0KLQotdm9pZCAKLW1yaV9hbGlnbiAobmFtZSwgZXhwKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmYWxpZ25tZW50LCBuYW1lLDAsMCxleHAsMCk7Ci19Ci0KLXZvaWQgCi1tcmlfYWxpZ25tb2QgKG5hbWUsIGV4cCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBtcmlfYWRkX3RvX2xpc3QoJnN1YmFsaWdubWVudCwgbmFtZSwwLDAsMCxleHApOwotfQotCi0KLXZvaWQgCi1tcmlfdHJ1bmNhdGUgKGV4cCkKLSAgICAgdW5zaWduZWQgaW50IGV4cDsKLXsKLSAgc3ltYm9sX3RydW5jYXRlID0gZXhwOwotfQpkaWZmIC0tZ2l0IGEvbGQvbXJpLmggYi9sZC9tcmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzZjBmMy4uMDAwMDAwMAotLS0gYS9sZC9tcmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIG1yaS5oIC0tIGhlYWRlciBmaWxlIGZvciBNUkkgc2NyaXB0aW5nIGZ1bmN0aW9ucwotICAgQ29weXJpZ2h0IDE5OTMsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE1SSV9ICi0jZGVmaW5lIE1SSV9ICi0KLWV4dGVybiB1bnNpZ25lZCBpbnQgc3ltYm9sX3RydW5jYXRlOwotCi1leHRlcm4gdm9pZCBtcmlfb3V0cHV0X3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgZXRyZWVfdHlwZSAqdm1hKSk7Ci1leHRlcm4gdm9pZCBtcmlfb25seV9sb2FkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9iYXNlIFBBUkFNUyAoKGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2xvYWQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX29yZGVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9hbGlhcyBQQVJBTVMgKChjb25zdCBjaGFyICp3YW50LCBjb25zdCBjaGFyICppcywgaW50IGlzbikpOwotZXh0ZXJuIHZvaWQgbXJpX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX2Zvcm1hdCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBtcmlfcHVibGljIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2FsaWduIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2FsaWdubW9kIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX3RydW5jYXRlIFBBUkFNUyAoKHVuc2lnbmVkIGludCBleHApKTsKLWV4dGVybiB2b2lkIG1yaV9kcmF3X3RyZWUgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL3BlLWRsbC5jIGIvbGQvcGUtZGxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOGIxYWYuLjAwMDAwMDAKLS0tIGEvbGQvcGUtZGxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTI0ICswLDAgQEAKLS8qIFJvdXRpbmVzIHRvIGhlbHAgYnVpbGQgUEVJLWZvcm1hdCBETExzIChXaW4zMiBldGMpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IERKIERlbG9yaWUgPGRqQGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZHdyaXRlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotI2luY2x1ZGUgInBlLWRsbC5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBUaGlzIGZpbGUgdHVybnMgYSByZWd1bGFyIFdpbmRvd3MgUEUgaW1hZ2UgaW50byBhIERMTC4gIEJlY2F1c2Ugb2YKLSB0aGUgY29tcGxleGl0eSBvZiB0aGlzIG9wZXJhdGlvbiwgaXQgaGFzIGJlZW4gYnJva2VuIGRvd24gaW50byBhCi0gbnVtYmVyIG9mIHNlcGFyYXRlIG1vZHVsZXMgd2hpY2ggYXJlIGFsbCBjYWxsZWQgYnkgdGhlIG1haW4gZnVuY3Rpb24KLSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlLWVudHJhbnQgYW5kIGlzCi0gbm9ybWFsbHkgb25seSBjYWxsZWQgb25jZSwgc28gc3RhdGljIHZhcmlhYmxlcyBhcmUgdXNlZCB0byByZWR1Y2UKLSB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMgcmVxdWlyZWQuCi0KLSBTZWUgYWxzbzogbGQvZW11bHRlbXBsL3BlLmVtCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGZvciBlbXVsdGVtcGwvcGUuZW0gKi8KLQotZGVmX2ZpbGUgKnBlX2RlZl9maWxlID0gMDsKLWludCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcgPSAwOwotaW50IHBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzID0gMTsKLWludCBwZV9kbGxfa2lsbF9hdHMgPSAwOwotaW50IHBlX2RsbF9zdGRjYWxsX2FsaWFzZXMgPSAwOwotaW50IHBlX2RsbF93YXJuX2R1cF9leHBvcnRzID0gMDsKLWludCBwZV9kbGxfY29tcGF0X2ltcGxpYiA9IDA7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIHN0YXRpYyB2YXJpYWJsZXMgYW5kIHR5cGVzCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBiZmRfdm1hIGltYWdlX2Jhc2U7Ci0KLXN0YXRpYyBiZmQgKmZpbGxlcl9iZmQ7Ci1zdGF0aWMgc3RydWN0IHNlYyAqZWRhdGFfcywgKnJlbG9jX3M7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqZWRhdGFfZCwgKnJlbG9jX2Q7Ci1zdGF0aWMgc2l6ZV90IGVkYXRhX3N6LCByZWxvY19zejsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICp0YXJnZXRfbmFtZTsKLSAgY2hhciAqb2JqZWN0X3RhcmdldDsKLSAgdW5zaWduZWQgaW50IGltYWdlYmFzZV9yZWxvYzsKLSAgaW50IHBlX2FyY2g7Ci0gIGludCBiZmRfYXJjaDsKLSAgaW50IHVuZGVyc2NvcmVkOwotfSBwZV9kZXRhaWxzX3R5cGU7Ci0KLSNkZWZpbmUgUEVfQVJDSF9pMzg2CTEKLSNkZWZpbmUgUEVfQVJDSF9zaAkyCi0jZGVmaW5lIFBFX0FSQ0hfbWlwcwkzCi0jZGVmaW5lIFBFX0FSQ0hfYXJtCTQKLQotc3RhdGljIHBlX2RldGFpbHNfdHlwZSBwZV9kZXRhaWxfbGlzdFtdID0gewotICB7Ci0gICAgInBlaS1pMzg2IiwKLSAgICAicGUtaTM4NiIsCi0gICAgNyAvKiBSX0lNQUdFQkFTRSAqLywKLSAgICBQRV9BUkNIX2kzODYsCi0gICAgYmZkX2FyY2hfaTM4NiwKLSAgICAxCi0gIH0sCi0gIHsKLSAgICAicGVpLXNobCIsCi0gICAgInBlLXNobCIsCi0gICAgMTYgLyogUl9TSF9JTUFHRUJBU0UgKi8sCi0gICAgUEVfQVJDSF9zaCwKLSAgICBiZmRfYXJjaF9zaCwKLSAgICAxCi0gIH0sCi0gIHsKLSAgICAicGVpLW1pcHMiLAotICAgICJwZS1taXBzIiwKLSAgICAzNCAvKiBNSVBTX1JfUlZBICovLAotICAgIFBFX0FSQ0hfbWlwcywKLSAgICBiZmRfYXJjaF9taXBzLAotICAgIDAKLSAgfSwKLSAgewotICAgICJwZWktYXJtLWxpdHRsZSIsCi0gICAgInBlLWFybS1saXR0bGUiLAotICAgIDExIC8qIEFSTV9SVkEzMiAqLywKLSAgICBQRV9BUkNIX2FybSwKLSAgICBiZmRfYXJjaF9hcm0sCi0gICAgMAotICB9LAotICB7IE5VTEwsIE5VTEwsIDAsIDAsIDAsIDAgfQotfTsKLQotc3RhdGljIHBlX2RldGFpbHNfdHlwZSAqcGVfZGV0YWlsczsKLQotI2RlZmluZSBVKHN0cikgKHBlX2RldGFpbHMtPnVuZGVyc2NvcmVkID8gIl8iIHN0ciA6IHN0cikKLQotdm9pZAotcGVfZGxsX2lkX3RhcmdldCAodGFyZ2V0KQotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGludCBpOwotICBmb3IgKGk9MDsgcGVfZGV0YWlsX2xpc3RbaV0udGFyZ2V0X25hbWU7IGkrKykKLSAgICBpZiAoc3RyY21wIChwZV9kZXRhaWxfbGlzdFtpXS50YXJnZXRfbmFtZSwgdGFyZ2V0KSA9PSAwKQotICAgICAgewotCXBlX2RldGFpbHMgPSBwZV9kZXRhaWxfbGlzdCtpOwotCXJldHVybjsKLSAgICAgIH0KLSAgZWluZm8gKF8oIiVYVW5zdXBwb3J0ZWQgUEVJIGFyY2hpdGVjdHVyZTogJXNcbiIpLCB0YXJnZXQpOwotICBleGl0ICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gSGVscGVyIGZ1bmN0aW9ucyBmb3IgcXNvcnQuICBSZWxvY3MgbXVzdCBiZSBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4gd3JpdGUKLSB0aGVtIG91dCBieSBwYWdlcy4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBiZmRfdm1hIHZtYTsKLSAgY2hhciB0eXBlOwotICBzaG9ydCBleHRyYTsKLX0gcmVsb2NfZGF0YV90eXBlOwotCi1zdGF0aWMgaW50Ci1yZWxvY19zb3J0ICh2YSwgdmIpCi0gICAgIGNvbnN0IHZvaWQgKnZhLCAqdmI7Ci17Ci0gIGJmZF92bWEgYSA9ICgocmVsb2NfZGF0YV90eXBlICopIHZhKS0+dm1hOwotICBiZmRfdm1hIGIgPSAoKHJlbG9jX2RhdGFfdHlwZSAqKSB2YiktPnZtYTsKLSAgcmV0dXJuIChhID4gYikgPyAxIDogKChhIDwgYikgPyAtMSA6IDApOwotfQotCi1zdGF0aWMgaW50Ci1wZV9leHBvcnRfc29ydCAodmEsIHZiKQotICAgICBjb25zdCB2b2lkICp2YSwgKnZiOwotewotICBkZWZfZmlsZV9leHBvcnQgKmEgPSAoZGVmX2ZpbGVfZXhwb3J0ICopIHZhOwotICBkZWZfZmlsZV9leHBvcnQgKmIgPSAoZGVmX2ZpbGVfZXhwb3J0ICopIHZiOwotICByZXR1cm4gc3RyY21wIChhLT5uYW1lLCBiLT5uYW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gUmVhZCBhbmQgcHJvY2VzcyB0aGUgLkRFRiBmaWxlCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlIGVudHJpZXMgaW4gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbXS4gIEkgdXNlCi0gICBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0gdG8gdGFnIHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgd2FzCi0gICBkZWZpbmVkLCBzaW5jZSB3ZSBjYW4ndCBleHBvcnQgc3ltYm9scyB3ZSBkb24ndCBoYXZlLiAqLwotCi1zdGF0aWMgYmZkX3ZtYSAqZXhwb3J0ZWRfc3ltYm9sX29mZnNldHM7Ci1zdGF0aWMgc3RydWN0IHNlYyAqKmV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uczsKLQotc3RhdGljIGludCBleHBvcnRfdGFibGVfc2l6ZTsKLXN0YXRpYyBpbnQgY291bnRfZXhwb3J0ZWQ7Ci1zdGF0aWMgaW50IGNvdW50X2V4cG9ydGVkX2J5bmFtZTsKLXN0YXRpYyBpbnQgY291bnRfd2l0aF9vcmRpbmFsczsKLXN0YXRpYyBjb25zdCBjaGFyICpkbGxfbmFtZTsKLXN0YXRpYyBpbnQgbWluX29yZGluYWwsIG1heF9vcmRpbmFsOwotc3RhdGljIGludCAqZXhwb3J0ZWRfc3ltYm9sczsKLQotdHlwZWRlZiBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdAotICB7Ci0gICAgY2hhciAqc3RyaW5nOwotICAgIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpuZXh0OwotICB9Ci1leGNsdWRlX2xpc3Rfc3RydWN0Owotc3RhdGljIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpleGNsdWRlcyA9IDA7Ci0KLXZvaWQKLXBlX2RsbF9hZGRfZXhjbHVkZXMgKG5ld19leGNsdWRlcykKLSAgICAgY29uc3QgY2hhciAqbmV3X2V4Y2x1ZGVzOwotewotICBjaGFyICpsb2NhbF9jb3B5OwotICBjaGFyICpleGNsdWRlX3N0cmluZzsKLQotICBsb2NhbF9jb3B5ID0geHN0cmR1cCAobmV3X2V4Y2x1ZGVzKTsKLQotICBleGNsdWRlX3N0cmluZyA9IHN0cnRvayAobG9jYWxfY29weSwgIiw6Iik7Ci0gIGZvciAoOyBleGNsdWRlX3N0cmluZzsgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKE5VTEwsICIsOiIpKQotICAgIHsKLSAgICAgIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpuZXdfZXhjbHVkZTsKLQotICAgICAgbmV3X2V4Y2x1ZGUgPSAoKHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICopCi0JCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCkpKTsKLSAgICAgIG5ld19leGNsdWRlLT5zdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGV4Y2x1ZGVfc3RyaW5nKSArIDEpOwotICAgICAgc3RyY3B5IChuZXdfZXhjbHVkZS0+c3RyaW5nLCBleGNsdWRlX3N0cmluZyk7Ci0gICAgICBuZXdfZXhjbHVkZS0+bmV4dCA9IGV4Y2x1ZGVzOwotICAgICAgZXhjbHVkZXMgPSBuZXdfZXhjbHVkZTsKLSAgICB9Ci0KLSAgZnJlZSAobG9jYWxfY29weSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWF1dG9fZXhwb3J0IChkLCBuKQotICAgICBkZWZfZmlsZSAqZDsKLSAgICAgY29uc3QgY2hhciAqbjsKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpleDsKLSAgZm9yIChpID0gMDsgaSA8IGQtPm51bV9leHBvcnRzOyBpKyspCi0gICAgaWYgKHN0cmNtcCAoZC0+ZXhwb3J0c1tpXS5uYW1lLCBuKSA9PSAwKQotICAgICAgcmV0dXJuIDA7Ci0gIGlmIChwZV9kbGxfZG9fZGVmYXVsdF9leGNsdWRlcykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuLCAiRGxsTWFpbkAxMiIpID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBpZiAoc3RyY21wIChuLCAiRGxsRW50cnlQb2ludEAwIikgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGlmIChzdHJjbXAgKG4sICJpbXB1cmVfcHRyIikgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGZvciAoZXggPSBleGNsdWRlczsgZXg7IGV4ID0gZXgtPm5leHQpCi0gICAgaWYgKHN0cmNtcCAobiwgZXgtPnN0cmluZykgPT0gMCkKLSAgICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZGVmX2ZpbGUgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGksIGo7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpibGhlOwotICBiZmQgKmI7Ci0gIHN0cnVjdCBzZWMgKnM7Ci0gIGRlZl9maWxlX2V4cG9ydCAqZT0wOwotCi0gIGlmICghcGVfZGVmX2ZpbGUpCi0gICAgcGVfZGVmX2ZpbGUgPSBkZWZfZmlsZV9lbXB0eSAoKTsKLQotICAvKiBGaXJzdCwgcnVuIGFyb3VuZCB0byBhbGwgdGhlIG9iamVjdHMgbG9va2luZyBmb3IgdGhlIC5kcmVjdHZlCi0gICAgIHNlY3Rpb25zLCBhbmQgcHVzaCB0aG9zZSBpbnRvIHRoZSBkZWYgZmlsZSB0b28gKi8KLQotICBmb3IgKGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiID0gYi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYiwgIi5kcmVjdHZlIik7Ci0gICAgICBpZiAocykKLQl7Ci0JICBpbnQgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAocyk7Ci0JICBjaGFyICpidWYgPSB4bWFsbG9jIChzaXplKTsKLQkgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYiwgcywgYnVmLCAwLCBzaXplKTsKLQkgIGRlZl9maWxlX2FkZF9kaXJlY3RpdmUgKHBlX2RlZl9maWxlLCBidWYsIHNpemUpOwotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdywgbWF5YmUgZXhwb3J0IGV2ZXJ5dGhpbmcgZWxzZSB0aGUgZGVmYXVsdCB3YXkgKi8KLQotICBpZiAocGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nIHx8IHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cyA9PSAwKQotICAgIHsKLSAgICAgIGZvciAoYiA9IGluZm8tPmlucHV0X2JmZHM7IGI7IGIgPSBiLT5saW5rX25leHQpCi0JewotCSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0JICBpbnQgbnN5bXMsIHN5bXNpemU7Ci0KLQkgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYik7Ci0JICBzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgbnN5bXMgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYiwgc3ltYm9scyk7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBuc3ltczsgaisrKQotCSAgICB7Ci0JICAgICAgaWYgKChzeW1ib2xzW2pdLT5mbGFncyAmIChCU0ZfRlVOQ1RJT04gfCBCU0ZfR0xPQkFMKSkKLQkJICA9PSAoQlNGX0ZVTkNUSU9OIHwgQlNGX0dMT0JBTCkpCi0JCXsKLQkJICBjb25zdCBjaGFyICpzbiA9IHN5bWJvbHNbal0tPm5hbWU7Ci0JCSAgaWYgKCpzbiA9PSAnXycpCi0JCSAgICBzbisrOwotCQkgIGlmIChhdXRvX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHNuKSkKLQkJICAgIGRlZl9maWxlX2FkZF9leHBvcnQgKHBlX2RlZl9maWxlLCBzbiwgMCwgLTEpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jdW5kZWYgTkUKLSNkZWZpbmUgTkUgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzCi0KLSAgLyogQ2Fub25pY2FsaXplIHRoZSBleHBvcnQgbGlzdCAqLwotCi0gIGlmIChwZV9kbGxfa2lsbF9hdHMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCi0JewotCSAgaWYgKHN0cmNociAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSwgJ0AnKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgd2lsbCBwcmVzZXJ2ZSBpbnRlcm5hbF9uYW1lLCB3aGljaCBtYXkgaGF2ZSBiZWVuIHBvaW50aW5nCi0JICAgICAgICAgdG8gdGhlIHNhbWUgbWVtb3J5IGFzIG5hbWUsIG9yIG1pZ2h0IG5vdCBoYXZlICovCi0JICAgICAgY2hhciAqdG1wID0geHN0cmR1cCAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSk7Ci0JICAgICAgKihzdHJjaHIgKHRtcCwgJ0AnKSkgPSAwOwotCSAgICAgIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUgPSB0bXA7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChwZV9kbGxfc3RkY2FsbF9hbGlhc2VzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotCXsKLQkgIGlmIChzdHJjaHIgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUsICdAJykpCi0JICAgIHsKLQkgICAgICBjaGFyICp0bXAgPSB4c3RyZHVwIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lKTsKLQkgICAgICAqKHN0cmNociAodG1wLCAnQCcpKSA9IDA7Ci0JICAgICAgaWYgKGF1dG9fZXhwb3J0IChwZV9kZWZfZmlsZSwgdG1wKSkKLQkJZGVmX2ZpbGVfYWRkX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHRtcCwKLQkJCQkgICAgIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUsIC0xKTsKLQkgICAgICBlbHNlCi0JCWZyZWUgKHRtcCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGUgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0czsgLyogY29udmVuaWVuY2UsIGJ1dCB3YXRjaCBvdXQgZm9yIGl0IGNoYW5naW5nICovCi0KLSAgZXhwb3J0ZWRfc3ltYm9sX29mZnNldHMgPSAoYmZkX3ZtYSAqKSB4bWFsbG9jIChORSAqIHNpemVvZiAoYmZkX3ZtYSkpOwotICBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnMgPSAoc3RydWN0IHNlYyAqKikgeG1hbGxvYyAoTkUgKiBzaXplb2YgKHN0cnVjdCBzZWMgKikpOwotCi0gIG1lbXNldCAoZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zLCAwLCBORSAqIHNpemVvZiAoc3RydWN0IHNlYyAqKSk7Ci0gIG1heF9vcmRpbmFsID0gMDsKLSAgbWluX29yZGluYWwgPSA2NTUzNjsKLSAgY291bnRfZXhwb3J0ZWQgPSAwOwotICBjb3VudF9leHBvcnRlZF9ieW5hbWUgPSAwOwotICBjb3VudF93aXRoX29yZGluYWxzID0gMDsKLQotICBxc29ydCAocGVfZGVmX2ZpbGUtPmV4cG9ydHMsIE5FLCBzaXplb2YgKHBlX2RlZl9maWxlLT5leHBvcnRzWzBdKSwgcGVfZXhwb3J0X3NvcnQpOwotICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IE5FOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgPiAwICYmIHN0cmNtcCAoZVtpXS5uYW1lLCBlW2kgLSAxXS5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUuICAqLwotCSAgaWYgKGVbaiAtIDFdLm9yZGluYWwgIT0gLTEKLQkgICAgICAmJiBlW2ldLm9yZGluYWwgIT0gLTEKLQkgICAgICAmJiBlW2ogLSAxXS5vcmRpbmFsICE9IGVbaV0ub3JkaW5hbCkKLQkgICAgewotCSAgICAgIGlmIChwZV9kbGxfd2Fybl9kdXBfZXhwb3J0cykKLQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJZWluZm8gKF8oIiVYRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzICglZCB2cyAlZClcbiIpLAotCQkgICAgICAgZVtqIC0gMV0ubmFtZSwgZVtqIC0gMV0ub3JkaW5hbCwgZVtpXS5vcmRpbmFsKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHBlX2RsbF93YXJuX2R1cF9leHBvcnRzKQotCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQllaW5mbyAoXygiV2FybmluZywgZHVwbGljYXRlIEVYUE9SVDogJXNcbiIpLAotCQkgICAgICAgZVtqIC0gMV0ubmFtZSk7Ci0JICAgIH0KLQkgIGlmIChlW2ldLm9yZGluYWwpCi0JICAgIGVbaiAtIDFdLm9yZGluYWwgPSBlW2ldLm9yZGluYWw7Ci0JICBlW2ogLSAxXS5mbGFnX3ByaXZhdGUgfD0gZVtpXS5mbGFnX3ByaXZhdGU7Ci0JICBlW2ogLSAxXS5mbGFnX2NvbnN0YW50IHw9IGVbaV0uZmxhZ19jb25zdGFudDsKLQkgIGVbaiAtIDFdLmZsYWdfbm9uYW1lIHw9IGVbaV0uZmxhZ19ub25hbWU7Ci0JICBlW2ogLSAxXS5mbGFnX2RhdGEgfD0gZVtpXS5mbGFnX2RhdGE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChpICE9IGopCi0JICAgIGVbal0gPSBlW2ldOwotCSAgaisrOwotCX0KLSAgICB9Ci0gIHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cyA9IGo7CS8qID09IE5FICovCi0KLSAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSkgKyAyKTsKLSAgICAgIGlmIChwZV9kZXRhaWxzLT51bmRlcnNjb3JlZCkKLQl7Ci0JICAqbmFtZSA9ICdfJzsKLQkgIHN0cmNweSAobmFtZSArIDEsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQlzdHJjcHkgKG5hbWUsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCi0gICAgICBibGhlID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsCi0JCQkJICAgbmFtZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICBpZiAoYmxoZQotICAgICAgICAgICYmIChibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSkpCi0JewotCSAgY291bnRfZXhwb3J0ZWQrKzsKLQkgIGlmICghcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uZmxhZ19ub25hbWUpCi0JICAgIGNvdW50X2V4cG9ydGVkX2J5bmFtZSsrOwotCi0JICAvKiBPbmx5IGZpbGwgaW4gdGhlIHNlY3Rpb25zLiBUaGUgYWN0dWFsIG9mZnNldHMgYXJlIGNvbXB1dGVkCi0JICAgICBpbiBmaWxsX2V4cG9ydGVkX29mZnNldHMoKSBhZnRlciBjb21tb24gc3ltYm9scyBhcmUgbGFpZAotCSAgICAgb3V0LiAgKi8KLSAgICAgICAgICBpZiAoYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICAgIGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSA9IGJsaGUtPnUuZGVmLnNlY3Rpb247Ci0JICBlbHNlCi0JICAgIGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSA9IGJsaGUtPnUuYy5wLT5zZWN0aW9uOwotCSAgCi0JICBpZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCAhPSAtMSkKLQkgICAgewotCSAgICAgIGlmIChtYXhfb3JkaW5hbCA8IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwpCi0JCW1heF9vcmRpbmFsID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbDsKLQkgICAgICBpZiAobWluX29yZGluYWwgPiBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsKQotCQltaW5fb3JkaW5hbCA9IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWw7Ci0JICAgICAgY291bnRfd2l0aF9vcmRpbmFscysrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoYmxoZSAmJiBibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlaW5mbyAoXygiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGRlZmluZWRcbiIpLAotCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoYmxoZSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZWluZm8gKF8oIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIHdyb25nIHR5cGUgKCVkIHZzICVkKVxuIiksCi0JCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lLAotCQkgYmxoZS0+dHlwZSwgYmZkX2xpbmtfaGFzaF9kZWZpbmVkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGVpbmZvIChfKCIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZm91bmRcbiIpLAotCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JfQotICAgICAgZnJlZSAobmFtZSk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBCdWlsZCB0aGUgYmZkIHRoYXQgd2lsbCBjb250YWluIC5lZGF0YSBhbmQgLnJlbG9jIHNlY3Rpb25zCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9maWxsZXJfYmZkIChpbmNsdWRlX2VkYXRhKQotICAgICBpbnQgaW5jbHVkZV9lZGF0YTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsbGVyX2ZpbGU7Ci0gIGZpbGxlcl9maWxlID0gbGFuZ19hZGRfaW5wdXRfZmlsZSAoImRsbCBzdHVmZiIsCi0JCQkJICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAotCQkJCSAgICAgTlVMTCk7Ci0gIGZpbGxlcl9maWxlLT50aGVfYmZkID0gZmlsbGVyX2JmZCA9IGJmZF9jcmVhdGUgKCJkbGwgc3R1ZmYiLCBvdXRwdXRfYmZkKTsKLSAgaWYgKGZpbGxlcl9iZmQgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfYXJjaF9tYWNoIChmaWxsZXJfYmZkLAotCQkJICAgICBiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpLAotCQkJICAgICBiZmRfZ2V0X21hY2ggKG91dHB1dF9iZmQpKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIEJGRCAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmNsdWRlX2VkYXRhKQotICAgIHsKLSAgICAgIGVkYXRhX3MgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGZpbGxlcl9iZmQsICIuZWRhdGEiKTsKLSAgICAgIGlmIChlZGF0YV9zID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGZpbGxlcl9iZmQsIGVkYXRhX3MsCi0JCQkJICAgICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgIHwgU0VDX0FMTE9DCi0JCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgIHwgU0VDX0tFRVAKLQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkpKSkKLQl7Ci0JICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIC5lZGF0YSBzZWN0aW9uOiAlRVxuIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGZpbGxlcl9iZmQsIGVkYXRhX3MsIGVkYXRhX3N6KTsKLSAgICB9Ci0KLSAgcmVsb2NfcyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoZmlsbGVyX2JmZCwgIi5yZWxvYyIpOwotICBpZiAocmVsb2NfcyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChmaWxsZXJfYmZkLCByZWxvY19zLAotCQkJCSAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgfCBTRUNfQUxMT0MKLQkJCQkgIHwgU0VDX0xPQUQKLQkJCQkgIHwgU0VDX0tFRVAKLQkJCQkgIHwgU0VDX0lOX01FTU9SWSkpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgLnJlbG9jIHNlY3Rpb246ICVFXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCByZWxvY19zLCAwKTsKLQotICBsZGxhbmdfYWRkX2ZpbGUgKGZpbGxlcl9maWxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gR2F0aGVyIGFsbCB0aGUgZXhwb3J0ZWQgc3ltYm9scyBhbmQgYnVpbGQgdGhlIC5lZGF0YSBzZWN0aW9uCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9lZGF0YSAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgaSwgbmV4dF9vcmRpbmFsOwotICBpbnQgbmFtZV90YWJsZV9zaXplID0gMDsKLSAgY29uc3QgY2hhciAqZGxucDsKLQotICAvKiBGaXJzdCwgd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGV4cG9ydGVkIHN5bWJvbHMgdGhlcmUgYXJlLAotICAgICBhbmQgd2hhdCB0aGUgcmFuZ2Ugb2Ygb3JkaW5hbHMgaXMuICovCi0KLSAgaWYgKHBlX2RlZl9maWxlLT5uYW1lKQotICAgIHsKLSAgICAgIGRsbF9uYW1lID0gcGVfZGVmX2ZpbGUtPm5hbWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZGxsX25hbWUgPSBhYmZkLT5maWxlbmFtZTsKLSAgICAgIGZvciAoZGxucCA9IGRsbF9uYW1lOyAqZGxucDsgZGxucCsrKQotCXsKLQkgIGlmICgqZGxucCA9PSAnXFwnIHx8ICpkbG5wID09ICcvJyB8fCAqZGxucCA9PSAnOicpCi0JICAgIGRsbF9uYW1lID0gZGxucCArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoY291bnRfd2l0aF9vcmRpbmFscyAmJiBtYXhfb3JkaW5hbCA+IGNvdW50X2V4cG9ydGVkKQotICAgIHsKLSAgICAgIGlmIChtaW5fb3JkaW5hbCA+IG1heF9vcmRpbmFsIC0gY291bnRfZXhwb3J0ZWQgKyAxKQotCW1pbl9vcmRpbmFsID0gbWF4X29yZGluYWwgLSBjb3VudF9leHBvcnRlZCArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWluX29yZGluYWwgPSAxOwotICAgICAgbWF4X29yZGluYWwgPSBjb3VudF9leHBvcnRlZDsKLSAgICB9Ci0gIGV4cG9ydF90YWJsZV9zaXplID0gbWF4X29yZGluYWwgLSBtaW5fb3JkaW5hbCArIDE7Ci0KLSAgZXhwb3J0ZWRfc3ltYm9scyA9IChpbnQgKikgeG1hbGxvYyAoZXhwb3J0X3RhYmxlX3NpemUgKiBzaXplb2YgKGludCkpOwotICBmb3IgKGkgPSAwOyBpIDwgZXhwb3J0X3RhYmxlX3NpemU7IGkrKykKLSAgICBleHBvcnRlZF9zeW1ib2xzW2ldID0gLTE7Ci0KLSAgLyogTm93IHdlIG5lZWQgdG8gYXNzaWduIG9yZGluYWxzIHRvIHRob3NlIHRoYXQgZG9uJ3QgaGF2ZSB0aGVtICovCi0gIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0pCi0JewotCSAgaWYgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgIT0gLTEpCi0JICAgIHsKLQkgICAgICBpbnQgZWkgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsIC0gbWluX29yZGluYWw7Ci0JICAgICAgaW50IHBpID0gZXhwb3J0ZWRfc3ltYm9sc1tlaV07Ci0JICAgICAgaWYgKHBpICE9IC0xKQotCQl7Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBlaW5mbyAoXygiJVhFcnJvciwgb3JpZGluYWwgdXNlZCB0d2ljZTogJWQgKCVzIHZzICVzKVxuIiksCi0JCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCwKLQkJCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lLAotCQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW3BpXS5uYW1lKTsKLQkJfQotCSAgICAgIGV4cG9ydGVkX3N5bWJvbHNbZWldID0gaTsKLQkgICAgfQotCSAgbmFtZV90YWJsZV9zaXplICs9IHN0cmxlbiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSkgKyAxOwotCX0KLSAgICB9Ci0KLSAgbmV4dF9vcmRpbmFsID0gbWluX29yZGluYWw7Ci0gIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotICAgIGlmIChleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0pCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCA9PSAtMSkKLQl7Ci0JICB3aGlsZSAoZXhwb3J0ZWRfc3ltYm9sc1tuZXh0X29yZGluYWwgLSBtaW5fb3JkaW5hbF0gIT0gLTEpCi0JICAgIG5leHRfb3JkaW5hbCsrOwotCSAgZXhwb3J0ZWRfc3ltYm9sc1tuZXh0X29yZGluYWwgLSBtaW5fb3JkaW5hbF0gPSBpOwotCSAgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCA9IG5leHRfb3JkaW5hbDsKLQl9Ci0KLSAgLyogT0ssIG5vdyB3ZSBjYW4gYWxsb2NhdGUgc29tZSBtZW1vcnkgKi8KLQotICBlZGF0YV9zeiA9ICg0MAkJLyogZGlyZWN0b3J5ICovCi0JICAgICAgKyA0ICogZXhwb3J0X3RhYmxlX3NpemUJLyogYWRkcmVzc2VzICovCi0JICAgICAgKyA0ICogY291bnRfZXhwb3J0ZWRfYnluYW1lCS8qIG5hbWUgcHRycyAqLwotCSAgICAgICsgMiAqIGNvdW50X2V4cG9ydGVkX2J5bmFtZQkvKiBvcmRpbmFscyAqLwotCSAgICAgICsgbmFtZV90YWJsZV9zaXplICsgc3RybGVuIChkbGxfbmFtZSkgKyAxKTsKLX0KLQotLyogRmlsbCB0aGUgZXhwb3J0ZWQgc3ltYm9sIG9mZnNldHMuIFRoZSBwcmVsaW1pbmFyeSB3b3JrIGhhcyBhbHJlYWR5Ci0gICBiZWVuIGRvbmUgaW4gcHJvY2Vzc19kZWZfZmlsZSgpLiAgKi8KLQotc3RhdGljIHZvaWQKLWZpbGxfZXhwb3J0ZWRfb2Zmc2V0cyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpbnQgaTsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJsaGU7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzOyBpKyspCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSkgKyAyKTsKLSAgICAgIGlmIChwZV9kZXRhaWxzLT51bmRlcnNjb3JlZCkKLQl7Ci0JICAqbmFtZSA9ICdfJzsKLQkgIHN0cmNweSAobmFtZSArIDEsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQlzdHJjcHkgKG5hbWUsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCi0gICAgICBibGhlID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsCi0JCQkJICAgbmFtZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICBpZiAoYmxoZSAmJiAoYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpKQotCXsKLQkgIGV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzW2ldID0gYmxoZS0+dS5kZWYudmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIGZyZWUgKG5hbWUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWZpbGxfZWRhdGEgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGksIGhpbnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKmVkaXJlY3Rvcnk7Ci0gIHVuc2lnbmVkIGxvbmcgKmVhZGRyZXNzZXM7Ci0gIHVuc2lnbmVkIGxvbmcgKmVuYW1lcHRyczsKLSAgdW5zaWduZWQgc2hvcnQgKmVvcmRpbmFsczsKLSAgdW5zaWduZWQgY2hhciAqZW5hbWVzdHI7Ci0gIHRpbWVfdCBub3c7Ci0KLSAgdGltZSAoJm5vdyk7Ci0KLSAgZWRhdGFfZCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGVkYXRhX3N6KTsKLQotICAvKiBOb3RlIHVzZSBvZiBhcnJheSBwb2ludGVyIG1hdGggaGVyZSAqLwotICBlZGlyZWN0b3J5ID0gZWRhdGFfZDsKLSAgZWFkZHJlc3NlcyA9ICh1bnNpZ25lZCBsb25nICopIChlZGF0YV9kICsgNDApOwotICBlbmFtZXB0cnMgPSBlYWRkcmVzc2VzICsgZXhwb3J0X3RhYmxlX3NpemU7Ci0gIGVvcmRpbmFscyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoZW5hbWVwdHJzICsgY291bnRfZXhwb3J0ZWRfYnluYW1lKTsKLSAgZW5hbWVzdHIgPSAoY2hhciAqKSAoZW9yZGluYWxzICsgY291bnRfZXhwb3J0ZWRfYnluYW1lKTsKLQotI2RlZmluZSBFUlZBKHB0cikgKCgodW5zaWduZWQgY2hhciAqKShwdHIpIC0gZWRhdGFfZCkgKyBlZGF0YV9zLT5vdXRwdXRfc2VjdGlvbi0+dm1hIC0gaW1hZ2VfYmFzZSkKLQotICBtZW1zZXQgKGVkYXRhX2QsIDAsIDQwKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgbm93LCBlZGF0YV9kICsgNCk7Ci0gIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciwgZWRhdGFfZCArIDgpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3IsIGVkYXRhX2QgKyAxMCk7Ci0gICAgfQotICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlbmFtZXN0ciksIGVkYXRhX2QgKyAxMik7Ci0gIHN0cmNweSAoZW5hbWVzdHIsIGRsbF9uYW1lKTsKLSAgZW5hbWVzdHIgKz0gc3RybGVuIChlbmFtZXN0cikgKyAxOwotICBiZmRfcHV0XzMyIChhYmZkLCBtaW5fb3JkaW5hbCwgZWRhdGFfZCArIDE2KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgZXhwb3J0X3RhYmxlX3NpemUsIGVkYXRhX2QgKyAyMCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50X2V4cG9ydGVkX2J5bmFtZSwgZWRhdGFfZCArIDI0KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZWFkZHJlc3NlcyksIGVkYXRhX2QgKyAyOCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVuYW1lcHRycyksIGVkYXRhX2QgKyAzMik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVvcmRpbmFscyksIGVkYXRhX2QgKyAzNik7Ci0KLSAgZmlsbF9leHBvcnRlZF9vZmZzZXRzIChhYmZkLCBpbmZvKTsKLQotICAvKiBPaywgbm93IGZvciB0aGUgZmlsbGluZyBpbiBwYXJ0ICovCi0gIGhpbnQgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgZXhwb3J0X3RhYmxlX3NpemU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgcyA9IGV4cG9ydGVkX3N5bWJvbHNbaV07Ci0gICAgICBpZiAocyAhPSAtMSkKLQl7Ci0JICBzdHJ1Y3Qgc2VjICpzc2VjID0gZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW3NdOwotCSAgdW5zaWduZWQgbG9uZyBzcnZhID0gKGV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzW3NdCi0JCQkJKyBzc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgYmZkX3B1dF8zMiAoYWJmZCwgc3J2YSAtIGltYWdlX2Jhc2UsICh2b2lkICopIChlYWRkcmVzc2VzICsgaSkpOwotCSAgaWYgKCFwZV9kZWZfZmlsZS0+ZXhwb3J0c1tzXS5mbGFnX25vbmFtZSkKLQkgICAgewotCSAgICAgIGNoYXIgKmVuYW1lID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbc10ubmFtZTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlbmFtZXN0ciksICh2b2lkICopIGVuYW1lcHRycyk7Ci0JICAgICAgc3RyY3B5IChlbmFtZXN0ciwgZW5hbWUpOwotCSAgICAgIGVuYW1lc3RyICs9IHN0cmxlbiAoZW5hbWVzdHIpICsgMTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpLCAodm9pZCAqKSBlb3JkaW5hbHMpOwotCSAgICAgIGVuYW1lcHRycysrOwotCSAgICAgIHBlX2RlZl9maWxlLT5leHBvcnRzW3NdLmhpbnQgPSBoaW50Kys7Ci0JICAgIH0KLQkgIGVvcmRpbmFscysrOwotCX0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEdhdGhlciBhbGwgdGhlIHJlbG9jYXRpb25zIGFuZCBidWlsZCB0aGUgLnJlbG9jIHNlY3Rpb24KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX3JlbG9jIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotCi0gIC8qIGZvciAucmVsb2Mgc3R1ZmYgKi8KLSAgcmVsb2NfZGF0YV90eXBlICpyZWxvY19kYXRhOwotICBpbnQgdG90YWxfcmVsb2NzID0gMDsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIGxvbmcgc2VjX3BhZ2UgPSAodW5zaWduZWQgbG9uZykgKC0xKTsKLSAgdW5zaWduZWQgbG9uZyBwYWdlX3B0ciwgcGFnZV9jb3VudDsKLSAgaW50IGJpOwotICBiZmQgKmI7Ci0gIHN0cnVjdCBzZWMgKnM7Ci0KLSAgdG90YWxfcmVsb2NzID0gMDsKLSAgZm9yIChiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYiA9IGItPmxpbmtfbmV4dCkKLSAgICBmb3IgKHMgPSBiLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0gICAgICB0b3RhbF9yZWxvY3MgKz0gcy0+cmVsb2NfY291bnQ7Ci0KLSAgcmVsb2NfZGF0YSA9IChyZWxvY19kYXRhX3R5cGUgKikgeG1hbGxvYyAodG90YWxfcmVsb2NzICogc2l6ZW9mIChyZWxvY19kYXRhX3R5cGUpKTsKLQotICB0b3RhbF9yZWxvY3MgPSAwOwotICBiaSA9IDA7Ci0gIGZvciAoYmkgPSAwLCBiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYmkrKywgYiA9IGItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcmVsb2NzOwotICAgICAgaW50IHJlbHNpemUsIG5yZWxvY3MsIGk7Ci0KLSAgICAgIGZvciAocyA9IGItPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHNlY192bWEgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldDsKLQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCSAgaW50IG5zeW1zLCBzeW1zaXplOwotCi0JICAvKiBpZiBpdCdzIG5vdCBsb2FkZWQsIHdlIGRvbid0IG5lZWQgdG8gcmVsb2NhdGUgaXQgdGhpcyB3YXkgKi8KLQkgIGlmICghKHMtPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEkgZG9uJ3Qga25vdyB3aHkgdGhlcmUgd291bGQgYmUgYSByZWxvYyBmb3IgdGhlc2UsIGJ1dCBJJ3ZlCi0JICAgICBzZWVuIGl0IGhhcHBlbiAtIERKICovCi0JICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbikKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hID09IDApCi0JICAgIHsKLQkgICAgICAvKiBIdWg/ICBTaG91bGRuJ3QgaGFwcGVuLCBidXQgcHVudCBpZiBpdCBkb2VzICovCi0JICAgICAgZWluZm8gKCJESjogemVybyB2bWEgc2VjdGlvbiByZWxvYyBkZXRlY3RlZDogYCVzJyAjJWQgZj0lZFxuIiwKLQkJICAgICBzLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgcy0+b3V0cHV0X3NlY3Rpb24tPmluZGV4LAotCQkgICAgIHMtPm91dHB1dF9zZWN0aW9uLT5mbGFncyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChiKTsKLQkgIHN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JICBuc3ltcyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChiLCBzeW1ib2xzKTsKLQotCSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGIsIHMpOwotCSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKChzaXplX3QpIHJlbHNpemUpOwotCSAgbnJlbG9jcyA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGIsIHMsIHJlbG9jcywgc3ltYm9scyk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBucmVsb2NzOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoIXJlbG9jc1tpXS0+aG93dG8tPnBjX3JlbGF0aXZlCi0JCSAgJiYgcmVsb2NzW2ldLT5ob3d0by0+dHlwZSAhPSBwZV9kZXRhaWxzLT5pbWFnZWJhc2VfcmVsb2MpCi0JCXsKLQkJICBiZmRfdm1hIHN5bV92bWE7Ci0JCSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltID0gKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHI7Ci0JCSAgc3ltX3ZtYSA9IChyZWxvY3NbaV0tPmFkZGVuZAotCQkJICAgICArIHN5bS0+dmFsdWUKLQkJCSAgICAgKyBzeW0tPnNlY3Rpb24tPnZtYQotCQkJICAgICArIHN5bS0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICArIHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgcmVsb2NfZGF0YVt0b3RhbF9yZWxvY3NdLnZtYSA9IHNlY192bWEgKyByZWxvY3NbaV0tPmFkZHJlc3M7Ci0JCSAgCi0jZGVmaW5lIEJJVFNfQU5EX1NISUZUKGJpdHMsIHNoaWZ0KSAoYml0cyAqIDEwMDAgfCBzaGlmdCkKLQkJCQkgICAgCi0JCSAgc3dpdGNoIEJJVFNfQU5EX1NISUZUIChyZWxvY3NbaV0tPmhvd3RvLT5iaXRzaXplLAotCQkJCQkgcmVsb2NzW2ldLT5ob3d0by0+cmlnaHRzaGlmdCkKLQkJICAgIHsKLQkJICAgIGNhc2UgQklUU19BTkRfU0hJRlQgKDMyLCAwKToKLQkJICAgICAgcmVsb2NfZGF0YVt0b3RhbF9yZWxvY3NdLnR5cGUgPSAzOwotCQkgICAgICB0b3RhbF9yZWxvY3MrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEJJVFNfQU5EX1NISUZUICgxNiwgMCk6Ci0JCSAgICAgIHJlbG9jX2RhdGFbdG90YWxfcmVsb2NzXS50eXBlID0gMjsKLQkJICAgICAgdG90YWxfcmVsb2NzKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBCSVRTX0FORF9TSElGVCAoMTYsIDE2KToKLQkJICAgICAgcmVsb2NfZGF0YVt0b3RhbF9yZWxvY3NdLnR5cGUgPSA0OwotCQkgICAgICAvKiBGSVhNRTogd2UgY2FuJ3Qga25vdyB0aGUgc3ltYm9sJ3MgcmlnaHQgdmFsdWUgeWV0LAotCQkJIGJ1dCB3ZSBwcm9iYWJseSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IENFIHdpbGwgcmVsb2NhdGUKLQkJCSB1cyBpbiA2NGsgYmxvY2tzLCBzbyBsZWF2aW5nIGl0IHplcm8gaXMgc2FmZS4gICovCi0JCSAgICAgIHJlbG9jX2RhdGFbdG90YWxfcmVsb2NzXS5leHRyYSA9IDA7Ci0JCSAgICAgIHRvdGFsX3JlbG9jcysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgQklUU19BTkRfU0hJRlQgKDI2LCAyKToKLQkJICAgICAgcmVsb2NfZGF0YVt0b3RhbF9yZWxvY3NdLnR5cGUgPSA1OwotCQkgICAgICB0b3RhbF9yZWxvY3MrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgICAgICBlaW5mbyAoXygiJVhFcnJvcjogJWQtYml0IHJlbG9jIGluIGRsbFxuIiksCi0JCQkgICAgIHJlbG9jc1tpXS0+aG93dG8tPmJpdHNpemUpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBmcmVlIChyZWxvY3MpOwotCSAgLyogV2FybmluZzogdGhlIGFsbG9jYXRlZCBzeW1ib2xzIGFyZSByZW1lbWJlcmVkIGluIEJGRCBhbmQgcmV1c2VkCi0JICAgICBsYXRlciwgc28gZG9uJ3QgZnJlZSB0aGVtISAqLwotCSAgLyogZnJlZSAoc3ltYm9scyk7ICovCi0JfQotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHRvdGFsX3JlbG9jcyByZWxvY2F0aW9uIGFkZHJlc3NlcyBpbgotICAgICByZWxvY19hZGRyZXNzZXMsIHdoaWNoIGFyZSBhbGwgc3VpdGFibGUgZm9yIHRoZSAucmVsb2Mgc2VjdGlvbi4KLSAgICAgV2UgbXVzdCBub3cgY3JlYXRlIHRoZSBuZXcgc2VjdGlvbnMuICovCi0KLSAgcXNvcnQgKHJlbG9jX2RhdGEsIHRvdGFsX3JlbG9jcywgc2l6ZW9mICgqcmVsb2NfZGF0YSksIHJlbG9jX3NvcnQpOwotCi0gIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9yZWxvY3M7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRoaXNfcGFnZSA9IChyZWxvY19kYXRhW2ldLnZtYSA+PiAxMik7Ci0gICAgICAKLSAgICAgIGlmICh0aGlzX3BhZ2UgIT0gc2VjX3BhZ2UpCi0JewotCSAgcmVsb2Nfc3ogPSAocmVsb2Nfc3ogKyAzKSAmIH4zOwkvKiA0LWJ5dGUgYWxpZ24gKi8KLQkgIHJlbG9jX3N6ICs9IDg7Ci0JICBzZWNfcGFnZSA9IHRoaXNfcGFnZTsKLQl9Ci0gICAgICAKLSAgICAgIHJlbG9jX3N6ICs9IDI7Ci0gICAgICAKLSAgICAgIGlmIChyZWxvY19kYXRhW2ldLnR5cGUgPT0gNCkKLQlyZWxvY19zeiArPSAyOwotICAgIH0KLSAgcmVsb2Nfc3ogPSAocmVsb2Nfc3ogKyAzKSAmIH4zOwkvKiA0LWJ5dGUgYWxpZ24gKi8KLQotICByZWxvY19kID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAocmVsb2Nfc3opOwotCi0gIHNlY19wYWdlID0gKHVuc2lnbmVkIGxvbmcpICgtMSk7Ci0gIHJlbG9jX3N6ID0gMDsKLSAgcGFnZV9wdHIgPSAodW5zaWduZWQgbG9uZykgKC0xKTsKLSAgcGFnZV9jb3VudCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9yZWxvY3M7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJ2YSA9IHJlbG9jX2RhdGFbaV0udm1hIC0gaW1hZ2VfYmFzZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdGhpc19wYWdlID0gKHJ2YSAmIH4weGZmZik7Ci0gICAgICBpZiAodGhpc19wYWdlICE9IHNlY19wYWdlKQotCXsKLQkgIHdoaWxlIChyZWxvY19zeiAmIDMpCi0JICAgIHJlbG9jX2RbcmVsb2Nfc3orK10gPSAwOwotCSAgaWYgKHBhZ2VfcHRyICE9ICh1bnNpZ25lZCBsb25nKSAoLTEpKQotCSAgICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY19zeiAtIHBhZ2VfcHRyLCByZWxvY19kICsgcGFnZV9wdHIgKyA0KTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHRoaXNfcGFnZSwgcmVsb2NfZCArIHJlbG9jX3N6KTsKLQkgIHBhZ2VfcHRyID0gcmVsb2Nfc3o7Ci0JICByZWxvY19zeiArPSA4OwotCSAgc2VjX3BhZ2UgPSB0aGlzX3BhZ2U7Ci0JICBwYWdlX2NvdW50ID0gMDsKLQl9Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCAocnZhICYgMHhmZmYpICsgKHJlbG9jX2RhdGFbaV0udHlwZTw8MTIpLAotCQkgIHJlbG9jX2QgKyByZWxvY19zeik7Ci0gICAgICByZWxvY19zeiArPSAyOwotICAgICAgaWYgKHJlbG9jX2RhdGFbaV0udHlwZSA9PSA0KQotCXsKLQkgIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jX2RhdGFbaV0uZXh0cmEsIHJlbG9jX2QgKyByZWxvY19zeik7Ci0JICByZWxvY19zeiArPSAyOwotCX0KLSAgICAgIHBhZ2VfY291bnQrKzsKLSAgICB9Ci0gIHdoaWxlIChyZWxvY19zeiAmIDMpCi0gICAgcmVsb2NfZFtyZWxvY19zeisrXSA9IDA7Ci0gIGlmIChwYWdlX3B0ciAhPSAodW5zaWduZWQgbG9uZykgKC0xKSkKLSAgICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY19zeiAtIHBhZ2VfcHRyLCByZWxvY19kICsgcGFnZV9wdHIgKyA0KTsKLSAgd2hpbGUgKHJlbG9jX3N6IDwgcmVsb2Nfcy0+X3Jhd19zaXplKQotICAgIHJlbG9jX2RbcmVsb2Nfc3orK10gPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBHaXZlbiB0aGUgZXhpdGluZyBkZWZfZmlsZSBzdHJ1Y3R1cmUsIHByaW50IG91dCBhIC5ERUYgZmlsZSB0aGF0Ci0gY29ycmVzcG9uZHMgdG8gaXQuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1xdW90ZXB1dCAocywgZiwgbmVlZHNfcXVvdGVzKQotICAgICBjaGFyICpzOwotICAgICBGSUxFICogZjsKLSAgICAgaW50IG5lZWRzX3F1b3RlczsKLXsKLSAgY2hhciAqY3A7Ci0gIGZvciAoY3AgPSBzOyAqY3A7IGNwKyspCi0gICAgaWYgKCpjcCA9PSAnXCcnCi0JfHwgKmNwID09ICciJwotCXx8ICpjcCA9PSAnXFwnCi0JfHwgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpjcCkKLQl8fCAqY3AgPT0gJywnCi0JfHwgKmNwID09ICc7JykKLSAgICAgIG5lZWRzX3F1b3RlcyA9IDE7Ci0gIGlmIChuZWVkc19xdW90ZXMpCi0gICAgewotICAgICAgcHV0YyAoJyInLCBmKTsKLSAgICAgIHdoaWxlICgqcykKLQl7Ci0JICBpZiAoKnMgPT0gJyInIHx8ICpzID09ICdcXCcpCi0JICAgIHB1dGMgKCdcXCcsIGYpOwotCSAgcHV0YyAoKnMsIGYpOwotCSAgcysrOwotCX0KLSAgICAgIHB1dGMgKCciJywgZik7Ci0gICAgfQotICBlbHNlCi0gICAgZnB1dHMgKHMsIGYpOwotfQotCi12b2lkCi1wZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUgKHBlX291dF9kZWZfZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnBlX291dF9kZWZfZmlsZW5hbWU7Ci17Ci0gIGludCBpOwotICBGSUxFICpvdXQgPSBmb3BlbiAocGVfb3V0X2RlZl9maWxlbmFtZSwgInciKTsKLSAgaWYgKG91dCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBlaW5mbyAoXygiJXM6IENhbid0IG9wZW4gb3V0cHV0IGRlZiBmaWxlICVzXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgcGVfb3V0X2RlZl9maWxlbmFtZSk7Ci0gICAgfQotCi0gIGlmIChwZV9kZWZfZmlsZSkKLSAgICB7Ci0gICAgICBpZiAocGVfZGVmX2ZpbGUtPm5hbWUpCi0JewotCSAgaWYgKHBlX2RlZl9maWxlLT5pc19kbGwpCi0JICAgIGZwcmludGYgKG91dCwgIkxJQlJBUlkgIik7Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKG91dCwgIk5BTUUgIik7Ci0JICBxdW90ZXB1dCAocGVfZGVmX2ZpbGUtPm5hbWUsIG91dCwgMSk7Ci0JICBpZiAocGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpCi0JICAgIGZwcmludGYgKG91dCwgIiBCQVNFPTB4JWx4IiwKLQkJICAgICAodW5zaWduZWQgbG9uZykgcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpOwotCSAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQl9Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+ZGVzY3JpcHRpb24pCi0JewotCSAgZnByaW50ZiAob3V0LCAiREVTQ1JJUFRJT04gIik7Ci0JICBxdW90ZXB1dCAocGVfZGVmX2ZpbGUtPmRlc2NyaXB0aW9uLCBvdXQsIDEpOwotCSAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQl9Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9taW5vciAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJWRVJTSU9OICVkLiVkXG4iLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciwKLQkJIHBlX2RlZl9maWxlLT52ZXJzaW9uX21pbm9yKTsKLSAgICAgIGVsc2UgaWYgKHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yICE9IC0xKQotCWZwcmludGYgKG91dCwgIlZFUlNJT04gJWRcbiIsIHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yKTsKLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlICE9IC0xIHx8IHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiXG4iKTsKLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5zdGFja19jb21taXQgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiU1RBQ0tTSVpFIDB4JXgsMHgleFxuIiwKLQkJIHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlLCBwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0KTsKLSAgICAgIGVsc2UgaWYgKHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlICE9IC0xKQotCWZwcmludGYgKG91dCwgIlNUQUNLU0laRSAweCV4XG4iLCBwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSk7Ci0gICAgICBpZiAocGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0ICE9IC0xKQotCWZwcmludGYgKG91dCwgIkhFQVBTSVpFIDB4JXgsMHgleFxuIiwKLQkJIHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUsIHBlX2RlZl9maWxlLT5oZWFwX2NvbW1pdCk7Ci0gICAgICBlbHNlIGlmIChwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlICE9IC0xKQotCWZwcmludGYgKG91dCwgIkhFQVBTSVpFIDB4JXhcbiIsIHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUpOwotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPm51bV9zZWN0aW9uX2RlZnMgPiAwKQotCXsKLQkgIGZwcmludGYgKG91dCwgIlxuU0VDVElPTlNcblxuIik7Ci0JICBmb3IgKGkgPSAwOyBpIDwgcGVfZGVmX2ZpbGUtPm51bV9zZWN0aW9uX2RlZnM7IGkrKykKLQkgICAgewotCSAgICAgIGZwcmludGYgKG91dCwgIiAgICAiKTsKLQkgICAgICBxdW90ZXB1dCAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5uYW1lLCBvdXQsIDApOwotCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmNsYXNzKQotCQl7Ci0JCSAgZnByaW50ZiAob3V0LCAiIENMQVNTICIpOwotCQkgIHF1b3RlcHV0IChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmNsYXNzLCBvdXQsIDApOwotCQl9Ci0JICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19yZWFkKQotCQlmcHJpbnRmIChvdXQsICIgUkVBRCIpOwotCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfd3JpdGUpCi0JCWZwcmludGYgKG91dCwgIiBXUklURSIpOwotCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfZXhlY3V0ZSkKLQkJZnByaW50ZiAob3V0LCAiIEVYRUNVVEUiKTsKLQkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3NoYXJlZCkKLQkJZnByaW50ZiAob3V0LCAiIFNIQVJFRCIpOwotCSAgICAgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHMgPiAwKQotCXsKLQkgIGZwcmludGYgKG91dCwgIlxuRVhQT1JUU1xuXG4iKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHM7IGkrKykKLQkgICAgewotCSAgICAgIGRlZl9maWxlX2V4cG9ydCAqZSA9IHBlX2RlZl9maWxlLT5leHBvcnRzICsgaTsKLQkgICAgICBmcHJpbnRmIChvdXQsICIgICAgIik7Ci0JICAgICAgcXVvdGVwdXQgKGUtPm5hbWUsIG91dCwgMCk7Ci0JICAgICAgaWYgKGUtPmludGVybmFsX25hbWUgJiYgc3RyY21wIChlLT5pbnRlcm5hbF9uYW1lLCBlLT5uYW1lKSkKLQkJewotCQkgIGZwcmludGYgKG91dCwgIiA9ICIpOwotCQkgIHF1b3RlcHV0IChlLT5pbnRlcm5hbF9uYW1lLCBvdXQsIDApOwotCQl9Ci0JICAgICAgaWYgKGUtPm9yZGluYWwgIT0gLTEpCi0JCWZwcmludGYgKG91dCwgIiBAJWQiLCBlLT5vcmRpbmFsKTsKLQkgICAgICBpZiAoZS0+ZmxhZ19wcml2YXRlKQotCQlmcHJpbnRmIChvdXQsICIgUFJJVkFURSIpOwotCSAgICAgIGlmIChlLT5mbGFnX2NvbnN0YW50KQotCQlmcHJpbnRmIChvdXQsICIgQ09OU1RBTlQiKTsKLQkgICAgICBpZiAoZS0+ZmxhZ19ub25hbWUpCi0JCWZwcmludGYgKG91dCwgIiBOT05BTUUiKTsKLQkgICAgICBpZiAoZS0+ZmxhZ19kYXRhKQotCQlmcHJpbnRmIChvdXQsICIgREFUQSIpOwotCi0JICAgICAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5udW1faW1wb3J0cyA+IDApCi0JewotCSAgZnByaW50ZiAob3V0LCAiXG5JTVBPUlRTXG5cbiIpOwotCSAgZm9yIChpID0gMDsgaSA8IHBlX2RlZl9maWxlLT5udW1faW1wb3J0czsgaSsrKQotCSAgICB7Ci0JICAgICAgZGVmX2ZpbGVfaW1wb3J0ICppbSA9IHBlX2RlZl9maWxlLT5pbXBvcnRzICsgaTsKLQkgICAgICBmcHJpbnRmIChvdXQsICIgICAgIik7Ci0JICAgICAgaWYgKGltLT5pbnRlcm5hbF9uYW1lCi0JCSAgJiYgKCFpbS0+bmFtZSB8fCBzdHJjbXAgKGltLT5pbnRlcm5hbF9uYW1lLCBpbS0+bmFtZSkpKQotCQl7Ci0JCSAgcXVvdGVwdXQgKGltLT5pbnRlcm5hbF9uYW1lLCBvdXQsIDApOwotCQkgIGZwcmludGYgKG91dCwgIiA9ICIpOwotCQl9Ci0JICAgICAgcXVvdGVwdXQgKGltLT5tb2R1bGUtPm5hbWUsIG91dCwgMCk7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiLiIpOwotCSAgICAgIGlmIChpbS0+bmFtZSkKLQkJcXVvdGVwdXQgKGltLT5uYW1lLCBvdXQsIDApOwotCSAgICAgIGVsc2UKLQkJZnByaW50ZiAob3V0LCAiJWQiLCBpbS0+b3JkaW5hbCk7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChvdXQsIF8oIjsgbm8gY29udGVudHMgYXZhaWxhYmxlXG4iKSk7Ci0KLSAgaWYgKGZjbG9zZSAob3V0KSA9PSBFT0YpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGVpbmZvIChfKCIlUDogRXJyb3IgY2xvc2luZyBmaWxlIGAlcydcbiIpLCBwZV9vdXRfZGVmX2ZpbGVuYW1lKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEdlbmVyYXRlIHRoZSBpbXBvcnQgbGlicmFyeQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYXN5bWJvbCAqKnN5bXRhYjsKLXN0YXRpYyBpbnQgc3ltcHRyOwotc3RhdGljIGludCB0bXBfc2VxOwotc3RhdGljIGNvbnN0IGNoYXIgKmRsbF9maWxlbmFtZTsKLXN0YXRpYyBjaGFyICpkbGxfc3ltbmFtZTsKLQotI2RlZmluZSBVTkRTRUMgKGFzZWN0aW9uICopICZiZmRfdW5kX3NlY3Rpb24KLQotc3RhdGljIGFzZWN0aW9uICoKLXF1aWNrX3NlY3Rpb24oYWJmZCwgbmFtZSwgZmxhZ3MsIGFsaWduKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmbGFnczsKLSAgICAgaW50IGFsaWduOwotewotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICpzeW07Ci0KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBuYW1lKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzCi0JCQkJICB8IFNFQ19BTExPQwotCQkJCSAgfCBTRUNfTE9BRAotCQkJCSAgfCBTRUNfS0VFUAotCQkJICk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgYWxpZ24pOwotICAvKiByZW1lbWJlciB0byB1bmRvIHRoaXMgYmVmb3JlIHRyeWluZyB0byBsaW5rIGludGVybmFsbHkhICovCi0gIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0KLSAgc3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgc3ltdGFiW3N5bXB0cisrXSA9IHN5bTsKLSAgc3ltLT5uYW1lID0gc2VjLT5uYW1lOwotICBzeW0tPnNlY3Rpb24gPSBzZWM7Ci0gIHN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0gIHN5bS0+dmFsdWUgPSAwOwotCi0gIHJldHVybiBzZWM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1xdWlja19zeW1ib2wgKGFiZmQsIG4xLCBuMiwgbjMsIHNlYywgZmxhZ3MsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbjE7Ci0gICAgIGNoYXIgKm4yOwotICAgICBjaGFyICpuMzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgaW50IGZsYWdzOwotICAgICBpbnQgYWRkcjsKLXsKLSAgYXN5bWJvbCAqc3ltOwotICBjaGFyICpuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuMSkgKyBzdHJsZW4gKG4yKSArIHN0cmxlbiAobjMpICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgbjEpOwotICBzdHJjYXQgKG5hbWUsIG4yKTsKLSAgc3RyY2F0IChuYW1lLCBuMyk7Ci0gIHN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIHN5bS0+bmFtZSA9IG5hbWU7Ci0gIHN5bS0+c2VjdGlvbiA9IHNlYzsKLSAgc3ltLT5mbGFncyA9IGZsYWdzOwotICBzeW0tPnZhbHVlID0gYWRkcjsKLSAgc3ltdGFiW3N5bXB0cisrXSA9IHN5bTsKLX0KLQotc3RhdGljIGFyZWxlbnQgKnJlbHRhYiA9IDA7Ci1zdGF0aWMgaW50IHJlbGNvdW50ID0gMCwgcmVsc2l6ZSA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1xdWlja19yZWxvYyAoYWJmZCwgYWRkcmVzcywgd2hpY2hfaG93dG8sIHN5bWlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYWRkcmVzczsKLSAgICAgaW50IHdoaWNoX2hvd3RvOwotICAgICBpbnQgc3ltaWR4OwotewotICBpZiAocmVsY291bnQgPj0gKHJlbHNpemUtMSkpCi0gICAgewotICAgICAgcmVsc2l6ZSArPSAxMDsKLSAgICAgIGlmIChyZWx0YWIpCi0JcmVsdGFiID0gKGFyZWxlbnQgKikgeHJlYWxsb2MgKHJlbHRhYiwgcmVsc2l6ZSAqIHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgZWxzZQotCXJlbHRhYiA9IChhcmVsZW50ICopIHhtYWxsb2MgKHJlbHNpemUgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgICB9Ci0gIHJlbHRhYltyZWxjb3VudF0uYWRkcmVzcyA9IGFkZHJlc3M7Ci0gIHJlbHRhYltyZWxjb3VudF0uYWRkZW5kID0gMDsKLSAgcmVsdGFiW3JlbGNvdW50XS5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgd2hpY2hfaG93dG8pOwotICByZWx0YWJbcmVsY291bnRdLnN5bV9wdHJfcHRyID0gc3ltdGFiICsgc3ltaWR4OwotICByZWxjb3VudCsrOwotfQotCi1zdGF0aWMgdm9pZAotc2F2ZV9yZWxvY3MgKGFzZWN0aW9uICpzZWMpCi17Ci0gIGludCBpOwotICBzZWMtPnJlbG9jYXRpb24gPSByZWx0YWI7Ci0gIHNlYy0+cmVsb2NfY291bnQgPSByZWxjb3VudDsKLSAgc2VjLT5vcmVsb2NhdGlvbiA9IChhcmVsZW50ICoqKSB4bWFsbG9jICgocmVsY291bnQrMSkgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICBmb3IgKGk9MDsgaTxyZWxjb3VudDsgaSsrKQotICAgIHNlYy0+b3JlbG9jYXRpb25baV0gPSBzZWMtPnJlbG9jYXRpb24gKyBpOwotICBzZWMtPm9yZWxvY2F0aW9uW3JlbGNvdW50XSA9IDA7Ci0gIHNlYy0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotICByZWx0YWIgPSAwOwotICByZWxjb3VudCA9IHJlbHNpemUgPSAwOwotfQotCi0vKgotICoJLnNlY3Rpb24JLmlkYXRhJDIKLSAqCS5nbG9iYWwJCV9faGVhZF9teV9kbGwKLSAqIF9faGVhZF9teV9kbGw6Ci0gKgkucnZhCQlobmFtZQotICoJLmxvbmcJCTAKLSAqCS5sb25nCQkwCi0gKgkucnZhCQlfX215X2RsbF9pbmFtZQotICoJLnJ2YQkJZnRodW5rCi0gKgotICoJLnNlY3Rpb24JLmlkYXRhJDUKLSAqCS5sb25nCQkwCi0gKiBmdGh1bms6Ci0gKgotICoJLnNlY3Rpb24JLmlkYXRhJDQKLSAqCS5sb25nCQkwCi0gKiBobmFtZToKLSAqLwotCi1zdGF0aWMgYmZkICoKLW1ha2VfaGVhZCAocGFyZW50KQotICAgICBiZmQgKnBhcmVudDsKLXsKLSAgYXNlY3Rpb24gKmlkMiwgKmlkNSwgKmlkNDsKLSAgdW5zaWduZWQgY2hhciAqZDIsICpkNSwgKmQ0OwotICBjaGFyICpvbmFtZTsKLSAgYmZkICphYmZkOwotCi0gIG9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOwotICBzcHJpbnRmIChvbmFtZSwgImQlMDZkLm8iLCB0bXBfc2VxKTsKLSAgdG1wX3NlcSsrOwotCi0gIGFiZmQgPSBiZmRfY3JlYXRlIChvbmFtZSwgcGFyZW50KTsKLSAgYmZkX2ZpbmRfdGFyZ2V0IChwZV9kZXRhaWxzLT5vYmplY3RfdGFyZ2V0LCBhYmZkKTsKLSAgYmZkX21ha2Vfd3JpdGFibGUgKGFiZmQpOwotCi0gIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIHBlX2RldGFpbHMtPmJmZF9hcmNoLCAwKTsKLQotICBzeW1wdHIgPSAwOwotICBzeW10YWIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoNiAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIGlkMiA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkMiIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDUgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ0ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiX2hlYWRfIiksIGRsbF9zeW1uYW1lLCAiIiwgaWQyLCBCU0ZfR0xPQkFMLCAwKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCIiKSwgZGxsX3N5bW5hbWUsICJfaW5hbWUiLCBVTkRTRUMsIEJTRl9HTE9CQUwsIDApOwotCi0gIC8qIE9LLCBwYXkgYXR0ZW50aW9uIGhlcmUuICBJIGdvdCBjb25mdXNlZCBteXNlbGYgbG9va2luZyBiYWNrIGF0Ci0gICAgIGl0LiAgV2UgY3JlYXRlIGEgZm91ci1ieXRlIHNlY3Rpb24gdG8gbWFyayB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICBsaXN0LCBhbmQgd2UgaW5jbHVkZSBhbiBvZmZzZXQgb2YgNCBpbiB0aGUgc2VjdGlvbiwgc28gdGhhdCB0aGUKLSAgICAgcG9pbnRlciB0byB0aGUgbGlzdCBwb2ludHMgdG8gdGhlICplbmQqIG9mIHRoaXMgc2VjdGlvbiwgd2hpY2ggaXMKLSAgICAgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0IG9mIHNlY3Rpb25zIGZyb20gb3RoZXIgb2JqZWN0cy4gKi8KLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQyLCAyMCk7Ci0gIGQyID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoMjApOwotICBpZDItPmNvbnRlbnRzID0gZDI7Ci0gIG1lbXNldCAoZDIsIDAsIDIwKTsKLSAgZDJbMF0gPSBkMlsxNl0gPSA0OyAvKiByZWxvYyBhZGRlbmQgKi8KLSAgcXVpY2tfcmVsb2MgKGFiZmQsICAwLCBCRkRfUkVMT0NfUlZBLCAyKTsKLSAgcXVpY2tfcmVsb2MgKGFiZmQsIDEyLCBCRkRfUkVMT0NfUlZBLCA0KTsKLSAgcXVpY2tfcmVsb2MgKGFiZmQsIDE2LCBCRkRfUkVMT0NfUlZBLCAxKTsKLSAgc2F2ZV9yZWxvY3MgKGlkMik7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNSwgNCk7Ci0gIGQ1ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNS0+Y29udGVudHMgPSBkNTsKLSAgbWVtc2V0IChkNSwgMCwgNCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNCwgNCk7Ci0gIGQ0ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNC0+Y29udGVudHMgPSBkNDsKLSAgbWVtc2V0IChkNCwgMCwgNCk7Ci0KLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXRhYiwgc3ltcHRyKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkMiwgZDIsIDAsIDIwKTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDUsIGQ1LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDQsIGQ0LCAwLCA0KTsKLSAgCi0gIGJmZF9tYWtlX3JlYWRhYmxlIChhYmZkKTsKLSAgcmV0dXJuIGFiZmQ7Ci19Ci0KLS8qCi0gKgkuc2VjdGlvbgkuaWRhdGEkNAotICoJLmxvbmcJCTAKLSAqCS5zZWN0aW9uCS5pZGF0YSQ1Ci0gKgkubG9uZwkJMAotICoJLnNlY3Rpb24JaWRhdGEkNwotICoJLmdsb2JhbAkJX19teV9kbGxfaW5hbWUKLSAqX19teV9kbGxfaW5hbWU6Ci0gKgkuYXNjaXoJCSJteS5kbGwiCi0gKi8KLQotc3RhdGljIGJmZCAqCi1tYWtlX3RhaWwgKHBhcmVudCkKLSAgICAgYmZkICpwYXJlbnQ7Ci17Ci0gIGFzZWN0aW9uICppZDQsICppZDUsICppZDc7Ci0gIHVuc2lnbmVkIGNoYXIgKmQ0LCAqZDUsICpkNzsKLSAgaW50IGxlbjsKLSAgY2hhciAqb25hbWU7Ci0gIGJmZCAqYWJmZDsKLQotICBvbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgc3ByaW50ZiAob25hbWUsICJkJTA2ZC5vIiwgdG1wX3NlcSk7Ci0gIHRtcF9zZXErKzsKLQotICBhYmZkID0gYmZkX2NyZWF0ZSAob25hbWUsIHBhcmVudCk7Ci0gIGJmZF9maW5kX3RhcmdldCAocGVfZGV0YWlscy0+b2JqZWN0X3RhcmdldCwgYWJmZCk7Ci0gIGJmZF9tYWtlX3dyaXRhYmxlIChhYmZkKTsKLQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBwZV9kZXRhaWxzLT5iZmRfYXJjaCwgMCk7Ci0KLSAgc3ltcHRyID0gMDsKLSAgc3ltdGFiID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKDUgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZDQgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ1ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNyA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIiIpLCBkbGxfc3ltbmFtZSwgIl9pbmFtZSIsIGlkNywgQlNGX0dMT0JBTCwgMCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNCwgNCk7Ci0gIGQ0ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNC0+Y29udGVudHMgPSBkNDsKLSAgbWVtc2V0IChkNCwgMCwgNCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNSwgNCk7Ci0gIGQ1ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNS0+Y29udGVudHMgPSBkNTsKLSAgbWVtc2V0IChkNSwgMCwgNCk7Ci0KLSAgbGVuID0gc3RybGVuIChkbGxfZmlsZW5hbWUpKzE7Ci0gIGlmIChsZW4gJiAxKQotICAgIGxlbiArKzsKLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNywgbGVuKTsKLSAgZDcgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBpZDctPmNvbnRlbnRzID0gZDc7Ci0gIHN0cmNweSAoZDcsIGRsbF9maWxlbmFtZSk7Ci0KLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXRhYiwgc3ltcHRyKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNCwgZDQsIDAsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNSwgZDUsIDAsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNywgZDcsIDAsIGxlbik7Ci0KLSAgYmZkX21ha2VfcmVhZGFibGUgKGFiZmQpOwotICByZXR1cm4gYWJmZDsKLX0KLQotLyoKLSAqCS50ZXh0Ci0gKgkuZ2xvYmFsCQlfZnVuY3Rpb24KLSAqCS5nbG9iYWwJCV9fX2ltcF9mdW5jdGlvbgotICoJLmdsb2JhbAkJX19pbXBfX2Z1bmN0aW9uCi0gKl9mdW5jdGlvbjoKLSAqCWptcAkJKl9faW1wX19mdW5jdGlvbjoKLSAqCi0gKgkuc2VjdGlvbglpZGF0YSQ3Ci0gKgkubG9uZwkJX19oZWFkX215X2RsbAotICoKLSAqCS5zZWN0aW9uCS5pZGF0YSQ1Ci0gKl9fX2ltcF9mdW5jdGlvbjoKLSAqX19pbXBfX2Z1bmN0aW9uOgotICppYXQ/Ci0gKgkuc2VjdGlvbgkuaWRhdGEkNAotICppYXQ/Ci0gKgkuc2VjdGlvbgkuaWRhdGEkNgotICpJRDxvcmRpbmFsPjoKLSAqCS5zaG9ydAkJPGhpbnQ+Ci0gKgkuYXNjaXoJCSJmdW5jdGlvbiIgeGxhdGU/IChhZGQgdW5kZXJzY29yZSwga2lsbCBhdCkKLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBqbXBfaXg4Nl9ieXRlc1tdID0gewotICAweGZmLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDkwCi19OwotCi0vKgotICpfZnVuY3Rpb246Ci0gKgltb3YubAlpcCs4LHIwCi0gKgltb3YubAlAcjAscjAKLSAqCWptcAlAcjAKLSAqCW5vcAotICoJLmR3CV9faW1wX2Z1bmN0aW9uCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgam1wX3NoX2J5dGVzW10gPSB7Ci0gIDB4MDEsIDB4ZDAsIDB4MDIsIDB4NjAsIDB4MmIsIDB4NDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLS8qCi0gKl9mdW5jdGlvbjoKLSAqCWx1aQkkdDAsPGhpZ2g6X19pbXBfZnVuY3Rpb24+Ci0gKglsdwkkdDAsPGxvdzpfX2ltcF9mdW5jdGlvbj4KLSAqCWpyCSR0MAotICoJbm9wCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgam1wX21pcHNfYnl0ZXNbXSA9IHsKLSAgMHgwMCwgMHgwMCwgMHgwOCwgMHgzYywgIDB4MDAsIDB4MDAsIDB4MDgsIDB4OGQsCi0gIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDEsICAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1zdGF0aWMgYmZkICoKLW1ha2Vfb25lIChleHAsIHBhcmVudCkKLSAgICAgZGVmX2ZpbGVfZXhwb3J0ICpleHA7Ci0gICAgIGJmZCAqcGFyZW50OwotewotICBhc2VjdGlvbiAqdHgsICppZDcsICppZDUsICppZDQsICppZDY7Ci0gIHVuc2lnbmVkIGNoYXIgKnRkLCAqZDcsICpkNSwgKmQ0LCAqZDYgPSBOVUxMOwotICBpbnQgbGVuOwotICBjaGFyICpvbmFtZTsKLSAgYmZkICphYmZkOwotICB1bnNpZ25lZCBjaGFyICpqbXBfYnl0ZXMgPSBOVUxMOwotICBpbnQgam1wX2J5dGVfY291bnQgPSAwOwotCi0gIHN3aXRjaCAocGVfZGV0YWlscy0+cGVfYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBQRV9BUkNIX2kzODY6Ci0gICAgICBqbXBfYnl0ZXMgPSBqbXBfaXg4Nl9ieXRlczsKLSAgICAgIGptcF9ieXRlX2NvdW50ID0gc2l6ZW9mIChqbXBfaXg4Nl9ieXRlcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBFX0FSQ0hfc2g6Ci0gICAgICBqbXBfYnl0ZXMgPSBqbXBfc2hfYnl0ZXM7Ci0gICAgICBqbXBfYnl0ZV9jb3VudCA9IHNpemVvZiAoam1wX3NoX2J5dGVzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUEVfQVJDSF9taXBzOgotICAgICAgam1wX2J5dGVzID0gam1wX21pcHNfYnl0ZXM7Ci0gICAgICBqbXBfYnl0ZV9jb3VudCA9IHNpemVvZiAoam1wX21pcHNfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIG9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOwotICBzcHJpbnRmIChvbmFtZSwgImQlMDZkLm8iLCB0bXBfc2VxKTsKLSAgdG1wX3NlcSsrOwotCi0gIGFiZmQgPSBiZmRfY3JlYXRlIChvbmFtZSwgcGFyZW50KTsKLSAgYmZkX2ZpbmRfdGFyZ2V0IChwZV9kZXRhaWxzLT5vYmplY3RfdGFyZ2V0LCBhYmZkKTsKLSAgYmZkX21ha2Vfd3JpdGFibGUgKGFiZmQpOwotCi0gIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIHBlX2RldGFpbHMtPmJmZF9hcmNoLCAwKTsKLQotICBzeW1wdHIgPSAwOwotICBzeW10YWIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoMTAgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICB0eCAgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLnRleHQiLCAgICBTRUNfQ09ERXxTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ3ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ3IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNSA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDQgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ2ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlmICghIGV4cC0+ZmxhZ19kYXRhKQotICAgIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiIiksIGV4cC0+aW50ZXJuYWxfbmFtZSwgIiIsIHR4LCBCU0ZfR0xPQkFMLCAwKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCJfaGVhZF8iKSwgZGxsX3N5bW5hbWUsICIiLCBVTkRTRUMsIEJTRl9HTE9CQUwsIDApOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIl9faW1wXyIpLCBleHAtPmludGVybmFsX25hbWUsICIiLCBpZDUsIEJTRl9HTE9CQUwsIDApOwotICBpZiAocGVfZGxsX2NvbXBhdF9pbXBsaWIpCi0gICAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCJfX2ltcF8iKSwgZXhwLT5pbnRlcm5hbF9uYW1lLCAiIiwgCi0gICAgICAgICAgICAgICAgICBpZDUsIEJTRl9HTE9CQUwsIDApOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCB0eCwgam1wX2J5dGVfY291bnQpOwotICB0ZCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGptcF9ieXRlX2NvdW50KTsKLSAgdHgtPmNvbnRlbnRzID0gdGQ7Ci0gIG1lbWNweSAodGQsIGptcF9ieXRlcywgam1wX2J5dGVfY291bnQpOwotICBzd2l0Y2ggKHBlX2RldGFpbHMtPnBlX2FyY2gpCi0gICAgewotICAgIGNhc2UgUEVfQVJDSF9pMzg2OgotICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDIsIEJGRF9SRUxPQ18zMiwgMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBFX0FSQ0hfc2g6Ci0gICAgICBxdWlja19yZWxvYyAoYWJmZCwgOCwgQkZEX1JFTE9DXzMyLCAyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUEVfQVJDSF9taXBzOgotICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19ISTE2X1MsIDIpOwotICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19MTzE2LCAwKTsgLyogTUlQU19SX1BBSVIgKi8KLSAgICAgIHF1aWNrX3JlbG9jIChhYmZkLCA0LCBCRkRfUkVMT0NfTE8xNiwgMik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHNhdmVfcmVsb2NzICh0eCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNywgNCk7Ci0gIGQ3ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNy0+Y29udGVudHMgPSBkNzsKLSAgbWVtc2V0IChkNywgMCwgNCk7Ci0gIHF1aWNrX3JlbG9jIChhYmZkLCAwLCBCRkRfUkVMT0NfUlZBLCA2KTsKLSAgc2F2ZV9yZWxvY3MgKGlkNyk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNSwgNCk7Ci0gIGQ1ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNS0+Y29udGVudHMgPSBkNTsKLSAgbWVtc2V0IChkNSwgMCwgNCk7Ci0gIGlmIChleHAtPmZsYWdfbm9uYW1lKQotICAgIHsKLSAgICAgIGQ1WzBdID0gZXhwLT5vcmRpbmFsOwotICAgICAgZDVbMV0gPSBleHAtPm9yZGluYWwgPj4gODsKLSAgICAgIGQ1WzNdID0gMHg4MDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBxdWlja19yZWxvYyAoYWJmZCwgMCwgQkZEX1JFTE9DX1JWQSwgNCk7Ci0gICAgICBzYXZlX3JlbG9jcyAoaWQ1KTsKLSAgICB9Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNCwgNCk7Ci0gIGQ0ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNC0+Y29udGVudHMgPSBkNDsKLSAgbWVtc2V0IChkNCwgMCwgNCk7Ci0gIGlmIChleHAtPmZsYWdfbm9uYW1lKQotICAgIHsKLSAgICAgIGQ1WzBdID0gZXhwLT5vcmRpbmFsOwotICAgICAgZDVbMV0gPSBleHAtPm9yZGluYWwgPj4gODsKLSAgICAgIGQ1WzNdID0gMHg4MDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBxdWlja19yZWxvYyAoYWJmZCwgMCwgQkZEX1JFTE9DX1JWQSwgNCk7Ci0gICAgICBzYXZlX3JlbG9jcyAoaWQ0KTsKLSAgICB9Ci0KLSAgaWYgKGV4cC0+ZmxhZ19ub25hbWUpCi0gICAgewotICAgICAgbGVuID0gMDsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDYsIDApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxlbiA9IHN0cmxlbiAoZXhwLT5uYW1lKSArIDM7Ci0gICAgICBpZiAobGVuICYgMSkKLQlsZW4rKzsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDYsIGxlbik7Ci0gICAgICBkNiA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0gICAgICBpZDYtPmNvbnRlbnRzID0gZDY7Ci0gICAgICBtZW1zZXQgKGQ2LCAwLCBsZW4pOwotICAgICAgZDZbMF0gPSBleHAtPmhpbnQgJiAweGZmOwotICAgICAgZDZbMV0gPSBleHAtPmhpbnQgPj4gODsKLSAgICAgIHN0cmNweSAoZDYrMiwgZXhwLT5uYW1lKTsKLSAgICB9Ci0KLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXRhYiwgc3ltcHRyKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHR4LCB0ZCwgMCwgam1wX2J5dGVfY291bnQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNywgZDcsIDAsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNSwgZDUsIDAsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNCwgZDQsIDAsIDQpOwotICBpZiAoIWV4cC0+ZmxhZ19ub25hbWUpCi0gICAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDYsIGQ2LCAwLCBsZW4pOwotCi0gIGJmZF9tYWtlX3JlYWRhYmxlIChhYmZkKTsKLSAgcmV0dXJuIGFiZmQ7Ci19Ci0KLXZvaWQKLXBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIgKGRlZiwgaW1wZmlsZW5hbWUpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNvbnN0IGNoYXIgKmltcGZpbGVuYW1lOwotewotICBpbnQgaTsKLSAgYmZkICphcl9oZWFkOwotICBiZmQgKmFyX3RhaWw7Ci0gIGJmZCAqb3V0YXJjaDsKLSAgYmZkICpoZWFkID0gMDsKLQotICBkbGxfZmlsZW5hbWUgPSAoZGVmLT5uYW1lKSA/IGRlZi0+bmFtZSA6IGRsbF9uYW1lOwotICBkbGxfc3ltbmFtZSA9IHhzdHJkdXAgKGRsbF9maWxlbmFtZSk7Ci0gIGZvciAoaT0wOyBkbGxfc3ltbmFtZVtpXTsgaSsrKQotICAgIGlmICghaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIGRsbF9zeW1uYW1lW2ldKSkKLSAgICAgIGRsbF9zeW1uYW1lW2ldID0gJ18nOwotCi0gIHVubGluayAoaW1wZmlsZW5hbWUpOwotCi0gIG91dGFyY2ggPSBiZmRfb3BlbncgKGltcGZpbGVuYW1lLCAwKTsKLQotICBpZiAoIW91dGFyY2gpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGVpbmZvIChfKCIlWENhbid0IG9wZW4gLmxpYiBmaWxlOiAlc1xuIiksIGltcGZpbGVuYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZWluZm8gKF8oIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIpLCBpbXBmaWxlbmFtZSk7Ci0gIAotICBiZmRfc2V0X2Zvcm1hdCAob3V0YXJjaCwgYmZkX2FyY2hpdmUpOwotICBvdXRhcmNoLT5oYXNfYXJtYXAgPSAxOwotCi0gIC8qIFdvcmsgb3V0IGEgcmVhc29uYWJsZSBzaXplIG9mIHRoaW5ncyB0byBwdXQgb250byBvbmUgbGluZS4gKi8KLQotICBhcl9oZWFkID0gbWFrZV9oZWFkIChvdXRhcmNoKTsKLQotICBmb3IgKGkgPSAwOyBpPGRlZi0+bnVtX2V4cG9ydHM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBUaGUgaW1wb3J0IGxpYnJhcnkgZG9lc24ndCBrbm93IGFib3V0IHRoZSBpbnRlcm5hbCBuYW1lICovCi0gICAgICBjaGFyICppbnRlcm5hbCA9IGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lOwotICAgICAgYmZkICpuOwotICAgICAgZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUgPSBkZWYtPmV4cG9ydHNbaV0ubmFtZTsKLSAgICAgIG4gPSBtYWtlX29uZSAoZGVmLT5leHBvcnRzK2ksIG91dGFyY2gpOwotICAgICAgbi0+bmV4dCA9IGhlYWQ7Ci0gICAgICBoZWFkID0gbjsKLSAgICAgIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lID0gaW50ZXJuYWw7Ci0gICAgfQotCi0gIGFyX3RhaWwgPSBtYWtlX3RhaWwgKG91dGFyY2gpOwotCi0gIGlmIChhcl9oZWFkID09IE5VTEwgfHwgYXJfdGFpbCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBOb3cgc3RpY2sgdGhlbSBhbGwgaW50byB0aGUgYXJjaGl2ZSAqLwotCi0gIGFyX2hlYWQtPm5leHQgPSBoZWFkOwotICBhcl90YWlsLT5uZXh0ID0gYXJfaGVhZDsKLSAgaGVhZCA9IGFyX3RhaWw7Ci0KLSAgaWYgKCEgYmZkX3NldF9hcmNoaXZlX2hlYWQgKG91dGFyY2gsIGhlYWQpKQotICAgIGVpbmZvICgiJVhiZmRfc2V0X2FyY2hpdmVfaGVhZDogJXNcbiIsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgCi0gIGlmICghIGJmZF9jbG9zZSAob3V0YXJjaCkpCi0gICAgZWluZm8gKCIlWGJmZF9jbG9zZSAlczogJXNcbiIsIGltcGZpbGVuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0KLSAgd2hpbGUgKGhlYWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmQgKm4gPSBoZWFkLT5uZXh0OwotICAgICAgYmZkX2Nsb3NlIChoZWFkKTsKLSAgICAgIGhlYWQgPSBuOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWFkZF9iZmRfdG9fbGluayAoYWJmZCwgbmFtZSwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZha2VfZmlsZTsKLSAgZmFrZV9maWxlID0gbGFuZ19hZGRfaW5wdXRfZmlsZSAobmFtZSwKLQkJCQkgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAotCQkJCSAgIE5VTEwpOwotICBmYWtlX2ZpbGUtPnRoZV9iZmQgPSBhYmZkOwotICBsZGxhbmdfYWRkX2ZpbGUgKGZha2VfZmlsZSk7Ci0gIGlmICghYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlWGFkZHN5bSAlczogJXNcbiIsIG5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLX0KLQotdm9pZAotcGVfcHJvY2Vzc19pbXBvcnRfZGVmcyAob3V0cHV0X2JmZCwgbGlua19pbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGRlZl9maWxlX21vZHVsZSAqbW9kdWxlOwotICBwZV9kbGxfaWRfdGFyZ2V0KGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0KLSAgaWYgKCFwZV9kZWZfZmlsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChtb2R1bGUgPSBwZV9kZWZfZmlsZS0+bW9kdWxlczsgbW9kdWxlOyBtb2R1bGUgPSBtb2R1bGUtPm5leHQpCi0gICAgewotICAgICAgaW50IGksIGRvX3RoaXNfZGxsOwotCi0gICAgICBkbGxfZmlsZW5hbWUgPSBtb2R1bGUtPm5hbWU7Ci0gICAgICBkbGxfc3ltbmFtZSA9IHhzdHJkdXAgKG1vZHVsZS0+bmFtZSk7Ci0gICAgICBmb3IgKGk9MDsgZGxsX3N5bW5hbWVbaV07IGkrKykKLQlpZiAoIWlzYWxudW0gKGRsbF9zeW1uYW1lW2ldKSkKLQkgIGRsbF9zeW1uYW1lW2ldID0gJ18nOwotCi0gICAgICBkb190aGlzX2RsbCA9IDA7Ci0KLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1faW1wb3J0czsgaSsrKQotCWlmIChwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5tb2R1bGUgPT0gbW9kdWxlKQotCSAgewotCSAgICBkZWZfZmlsZV9leHBvcnQgZXhwOwotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmxoZTsKLQotCSAgICAvKiBzZWUgaWYgd2UgbmVlZCB0aGlzIGltcG9ydCAqLwotCSAgICBjaGFyICpuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lKSArIDIpOwotCSAgICBzcHJpbnRmIChuYW1lLCAiJXMlcyIsIFUoIiIpLCBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgICAgYmxoZSA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8tPmhhc2gsIG5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkgICAgZnJlZSAobmFtZSk7Ci0JICAgIGlmIChibGhlICYmIGJsaGUtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgICAgewotCQliZmQgKm9uZTsKLQkJLyogd2UgZG8gKi8KLQkJaWYgKCFkb190aGlzX2RsbCkKLQkJICB7Ci0JCSAgICBiZmQgKmFyX2hlYWQgPSBtYWtlX2hlYWQgKG91dHB1dF9iZmQpOwotCQkgICAgYWRkX2JmZF90b19saW5rIChhcl9oZWFkLCBhcl9oZWFkLT5maWxlbmFtZSwgbGlua19pbmZvKTsKLQkJICAgIGRvX3RoaXNfZGxsID0gMTsKLQkJICB9Ci0JCWV4cC5pbnRlcm5hbF9uYW1lID0gcGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZTsKLQkJZXhwLm5hbWUgPSBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5uYW1lOwotCQlleHAub3JkaW5hbCA9IHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLm9yZGluYWw7Ci0JCWV4cC5oaW50ID0gZXhwLm9yZGluYWwgPj0gMCA/IGV4cC5vcmRpbmFsIDogMDsKLQkJZXhwLmZsYWdfcHJpdmF0ZSA9IDA7Ci0JCWV4cC5mbGFnX2NvbnN0YW50ID0gMDsKLQkJZXhwLmZsYWdfZGF0YSA9IDA7Ci0JCWV4cC5mbGFnX25vbmFtZSA9IGV4cC5uYW1lID8gMCA6IDE7Ci0JCW9uZSA9IG1ha2Vfb25lICgmZXhwLCBvdXRwdXRfYmZkKTsKLQkJYWRkX2JmZF90b19saW5rIChvbmUsIG9uZS0+ZmlsZW5hbWUsIGxpbmtfaW5mbyk7Ci0JICAgICAgfQotCSAgfQotICAgICAgaWYgKGRvX3RoaXNfZGxsKQotCXsKLQkgIGJmZCAqYXJfdGFpbCA9IG1ha2VfdGFpbCAob3V0cHV0X2JmZCk7Ci0JICBhZGRfYmZkX3RvX2xpbmsgKGFyX3RhaWwsIGFyX3RhaWwtPmZpbGVuYW1lLCBsaW5rX2luZm8pOwotCX0KLQotICAgICAgZnJlZSAoZGxsX3N5bW5hbWUpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gV2Ugd2VyZSBoYW5kZWQgYSAqLkRMTCBmaWxlLiAgUGFyc2UgaXQgYW5kIHR1cm4gaXQgaW50byBhIHNldCBvZgotIElNUE9SVFMgZGlyZWN0aXZlcyBpbiB0aGUgZGVmIGZpbGUuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMKLSBoYW5kbGVkLCBmYWxzZSBpZiBub3QuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBlX2dldDE2IChhYmZkLCB3aGVyZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgd2hlcmU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYlsyXTsKLSAgYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBTRUVLX1NFVCk7Ci0gIGJmZF9yZWFkIChiLCAxLCAyLCBhYmZkKTsKLSAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBlX2dldDMyIChhYmZkLCB3aGVyZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgd2hlcmU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYls0XTsKLSAgYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBTRUVLX1NFVCk7Ci0gIGJmZF9yZWFkIChiLCAxLCA0LCBhYmZkKTsKLSAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKLX0KLQotI2lmIDAgLyogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wZV9hczE2IChwdHIpCi0gICAgIHZvaWQgKnB0cjsKLXsKLSAgdW5zaWduZWQgY2hhciAqYiA9IHB0cjsKLSAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wZV9hczMyIChwdHIpCi0gICAgIHZvaWQgKnB0cjsKLXsKLSAgdW5zaWduZWQgY2hhciAqYiA9IHB0cjsKLSAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKLX0KLQotYm9vbGVhbgotcGVfaW1wbGllZF9pbXBvcnRfZGxsIChmaWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGJmZCAqZGxsOwotICB1bnNpZ25lZCBsb25nIHBlX2hlYWRlcl9vZmZzZXQsIG9wdGhkcl9vZnMsIG51bV9lbnRyaWVzLCBpOwotICB1bnNpZ25lZCBsb25nIGV4cG9ydF9ydmEsIGV4cG9ydF9zaXplLCBuc2VjdGlvbnMsIHNlY3B0ciwgZXhwcHRyOwotICB1bnNpZ25lZCBjaGFyICpleHBkYXRhLCAqZXJ2YTsKLSAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YXMsIG9yZGluYWxzLCBuZXhwLCBvcmRiYXNlOwotICBjb25zdCBjaGFyICpkbGxfbmFtZTsKLQotICAvKiBObywgSSBjYW4ndCB1c2UgYmZkIGhlcmUuICBrZXJuZWwzMi5kbGwgcHV0cyBpdHMgZXhwb3J0IHRhYmxlIGluCi0gICAgIHRoZSBtaWRkbGUgb2YgdGhlIC5yZGF0YSBzZWN0aW9uLiAqLwotCi0gIGRsbCA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHBlX2RldGFpbHMtPnRhcmdldF9uYW1lKTsKLSAgaWYgKCFkbGwpCi0gICAgewotICAgICAgZWluZm8gKCIlWG9wZW4gJXM6ICVzXG4iLCBmaWxlbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLyogUEVJIGRsbHMgc2VlbSB0byBiZSBiZmRfb2JqZWN0cyAqLwotICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKGRsbCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVzOiB0aGlzIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgRExMXG4iLCBmaWxlbmFtZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGRsbF9uYW1lID0gZmlsZW5hbWU7Ci0gIGZvciAoaT0wOyBmaWxlbmFtZVtpXTsgaSsrKQotICAgIGlmIChmaWxlbmFtZVtpXSA9PSAnLycgfHwgZmlsZW5hbWVbaV0gPT0gJ1xcJyB8fCBmaWxlbmFtZVtpXSA9PSAnOicpCi0gICAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArIDE7Ci0KLSAgcGVfaGVhZGVyX29mZnNldCA9IHBlX2dldDMyIChkbGwsIDB4M2MpOwotICBvcHRoZHJfb2ZzID0gcGVfaGVhZGVyX29mZnNldCArIDQgKyAyMDsKLSAgbnVtX2VudHJpZXMgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTIpOwotICBpZiAobnVtX2VudHJpZXMgPCAxKSAvKiBubyBleHBvcnRzICovCi0gICAgcmV0dXJuIGZhbHNlOwotICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKLSAgZXhwb3J0X3NpemUgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgMTAwKTsKLSAgbnNlY3Rpb25zID0gcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAyKTsKLSAgc2VjcHRyID0gKHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMjAgKwotCSAgICBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDE2KSk7Ci0gIGV4cHB0ciA9IDA7Ci0gIGZvciAoaT0wOyBpPG5zZWN0aW9uczsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgc25hbWVbOF07Ci0gICAgICB1bnNpZ25lZCBsb25nIHNlY3B0cjEgPSBzZWNwdHIgKyA0MCAqIGk7Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhZGRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDEyKTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdnNpemUgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTYpOwotICAgICAgdW5zaWduZWQgbG9uZyBmcHRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDIwKTsKLSAgICAgIGJmZF9zZWVrKGRsbCwgc2VjcHRyMSwgU0VFS19TRVQpOwotICAgICAgYmZkX3JlYWQoc25hbWUsIDEsIDgsIGRsbCk7Ci0gICAgICBpZiAodmFkZHIgPD0gZXhwb3J0X3J2YSAmJiB2YWRkcit2c2l6ZSA+IGV4cG9ydF9ydmEpCi0JewotCSAgZXhwcHRyID0gZnB0ciArIChleHBvcnRfcnZhIC0gdmFkZHIpOwotCSAgaWYgKGV4cG9ydF9ydmEgKyBleHBvcnRfc2l6ZSA+IHZhZGRyICsgdnNpemUpCi0JICAgIGV4cG9ydF9zaXplID0gdnNpemUgLSAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgZXhwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGV4cG9ydF9zaXplKTsKLSAgYmZkX3NlZWsgKGRsbCwgZXhwcHRyLCBTRUVLX1NFVCk7Ci0gIGJmZF9yZWFkIChleHBkYXRhLCAxLCBleHBvcnRfc2l6ZSwgZGxsKTsKLSAgZXJ2YSA9IGV4cGRhdGEgLSBleHBvcnRfcnZhOwotCi0gIGlmIChwZV9kZWZfZmlsZSA9PSAwKQotICAgIHBlX2RlZl9maWxlID0gZGVmX2ZpbGVfZW1wdHkoKTsKLQotICBuZXhwID0gcGVfYXMzMiAoZXhwZGF0YSsyNCk7Ci0gIG5hbWVfcnZhcyA9IHBlX2FzMzIgKGV4cGRhdGErMzIpOwotICBvcmRpbmFscyA9IHBlX2FzMzIgKGV4cGRhdGErMzYpOwotICBvcmRiYXNlID0gcGVfYXMzMiAoZXhwZGF0YSsxNik7Ci0gIGZvciAoaT0wOyBpPG5leHA7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhID0gcGVfYXMzMiAoZXJ2YStuYW1lX3J2YXMraSo0KTsKLSAgICAgIGRlZl9maWxlX2ltcG9ydCAqaW1wOwotICAgICAgaW1wID0gZGVmX2ZpbGVfYWRkX2ltcG9ydCAocGVfZGVmX2ZpbGUsIGVydmErbmFtZV9ydmEsIGRsbF9uYW1lLAotCQkJCSBpLCAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIFRoZXNlIGFyZSB0aGUgbWFpbiBmdW5jdGlvbnMsIGNhbGxlZCBmcm9tIHRoZSBlbXVsYXRpb24uICBUaGUgZmlyc3QKLSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJmZHMgYXJlIHJlYWQsIHNvIHdlIGNhbiBndWVzcyBhdCBob3cgbXVjaCBzcGFjZQotIHdlIG5lZWQuICBUaGUgc2Vjb25kIGlzIGNhbGxlZCBhZnRlciBldmVyeXRoaW5nIGlzIHBsYWNlZCwgc28gd2UKLSBjYW4gcHV0IHRoZSByaWdodCB2YWx1ZXMgaW4gcGxhY2UuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLXBlX2RsbF9idWlsZF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcGVfZGxsX2lkX3RhcmdldCAoYmZkX2dldF90YXJnZXQgKGFiZmQpKTsKLSAgcHJvY2Vzc19kZWZfZmlsZSAoYWJmZCwgaW5mbyk7Ci0KLSAgZ2VuZXJhdGVfZWRhdGEgKGFiZmQsIGluZm8pOwotICBidWlsZF9maWxsZXJfYmZkICgxKTsKLX0KLQotdm9pZAotcGVfZXhlX2J1aWxkX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHBlX2RsbF9pZF90YXJnZXQgKGJmZF9nZXRfdGFyZ2V0IChhYmZkKSk7Ci0gIGJ1aWxkX2ZpbGxlcl9iZmQgKDApOwotfQotCi12b2lkCi1wZV9kbGxfZmlsbF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcGVfZGxsX2lkX3RhcmdldCAoYmZkX2dldF90YXJnZXQgKGFiZmQpKTsKLSAgaW1hZ2VfYmFzZSA9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCi0gIGdlbmVyYXRlX3JlbG9jIChhYmZkLCBpbmZvKTsKLSAgaWYgKHJlbG9jX3N6ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoZmlsbGVyX2JmZCwgcmVsb2NfcywgcmVsb2Nfc3opOwotCi0gICAgICAvKiBSZXNpemUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdF9wdHItPmhlYWQsIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJnN0YXRfcHRyLT5oZWFkLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotCi0gICAgICAvKiBSZWRvIHNwZWNpYWwgc3R1ZmYuICAqLwotICAgICAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0KLSAgICAgIC8qIERvIHRoZSBhc3NpZ25tZW50cyBhZ2Fpbi4gICovCi0gICAgICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0X3B0ci0+aGVhZCwKLQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLSAgICB9Ci0KLSAgZmlsbF9lZGF0YSAoYWJmZCwgaW5mbyk7Ci0KLSAgcGVfZGF0YSAoYWJmZCktPmRsbCA9IDE7Ci0KLSAgZWRhdGFfcy0+Y29udGVudHMgPSBlZGF0YV9kOwotICByZWxvY19zLT5jb250ZW50cyA9IHJlbG9jX2Q7Ci19Ci0KLXZvaWQKLXBlX2V4ZV9maWxsX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBwZV9kbGxfaWRfdGFyZ2V0IChiZmRfZ2V0X3RhcmdldCAoYWJmZCkpOwotICBpbWFnZV9iYXNlID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0KLSAgZ2VuZXJhdGVfcmVsb2MgKGFiZmQsIGluZm8pOwotICBpZiAocmVsb2Nfc3ogPiAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCByZWxvY19zLCByZWxvY19zeik7Ci0KLSAgICAgIC8qIFJlc2l6ZSB0aGUgc2VjdGlvbnMuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCwgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAmc3RhdF9wdHItPmhlYWQsIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0KLSAgICAgIC8qIFJlZG8gc3BlY2lhbCBzdHVmZi4gICovCi0gICAgICBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiAoKTsKLQotICAgICAgLyogRG8gdGhlIGFzc2lnbm1lbnRzIGFnYWluLiAgKi8KLSAgICAgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRfcHRyLT5oZWFkLAotCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotICAgIH0KLSAgcmVsb2Nfcy0+Y29udGVudHMgPSByZWxvY19kOwotfQpkaWZmIC0tZ2l0IGEvbGQvcGUtZGxsLmggYi9sZC9wZS1kbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5ZTg0YS4uMDAwMDAwMAotLS0gYS9sZC9wZS1kbGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIHBlLWRsbC5oOiBIZWFkZXIgZmlsZSBmb3Igcm91dGluZXMgdXNlZCB0byBidWlsZCBXaW5kb3dzIERMTHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgUEVfRExMX0gKLSNkZWZpbmUgUEVfRExMX0gKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJkZWZmaWxlLmgiCi0KLWV4dGVybiBkZWZfZmlsZSAqcGVfZGVmX2ZpbGU7Ci1leHRlcm4gaW50IHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZzsKLWV4dGVybiBpbnQgcGVfZGxsX2RvX2RlZmF1bHRfZXhjbHVkZXM7Ci1leHRlcm4gaW50IHBlX2RsbF9raWxsX2F0czsKLWV4dGVybiBpbnQgcGVfZGxsX3N0ZGNhbGxfYWxpYXNlczsKLWV4dGVybiBpbnQgcGVfZGxsX3dhcm5fZHVwX2V4cG9ydHM7Ci1leHRlcm4gaW50IHBlX2RsbF9jb21wYXRfaW1wbGliOwotCi1leHRlcm4gdm9pZCBwZV9kbGxfaWRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgcGVfZGxsX2FkZF9leGNsdWRlcyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIgUEFSQU1TICgoZGVmX2ZpbGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBwZV9wcm9jZXNzX2ltcG9ydF9kZWZzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBwZV9pbXBsaWVkX2ltcG9ydF9kbGwgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBwZV9kbGxfYnVpbGRfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIHBlX2V4ZV9idWlsZF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHZvaWQgcGVfZGxsX2ZpbGxfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIHBlX2V4ZV9maWxsX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNlbmRpZiAvKiBQRV9ETExfSCAqLwpkaWZmIC0tZ2l0IGEvbGQvcG8vTWFrZS1pbiBiL2xkL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTEwOTAuLjAwMDAwMDAKLS0tIGEvbGQvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLUMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9sZC9wby9QT1RGSUxFUy5pbiBiL2xkL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2E2MTRkLi4wMDAwMDAwCi0tLSBhL2xkL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotZGVmZmlsZS5oCi1lbXVsdGVtcGwvYXJtY29mZi5lbQotZW11bHRlbXBsL3BlLmVtCi1sZC5oCi1sZGNyZWYuYwotbGRjdG9yLmMKLWxkY3Rvci5oCi1sZGVtdWwuYwotbGRlbXVsLmgKLWxkZXhwLmMKLWxkZXhwLmgKLWxkZmlsZS5jCi1sZGZpbGUuaAotbGRsYW5nLmMKLWxkbGFuZy5oCi1sZGxleC5oCi1sZG1haW4uYwotbGRtYWluLmgKLWxkbWlzYy5jCi1sZG1pc2MuaAotbGR2ZXIuYwotbGR2ZXIuaAotbGR3cml0ZS5jCi1sZHdyaXRlLmgKLWxleHN1cC5jCi1tcmkuYwotbXJpLmgKLXBlLWRsbC5jCi1wZS1kbGwuaApkaWZmIC0tZ2l0IGEvbGQvcG8vbGQucG90IGIvbGQvcG8vbGQucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTY3MGUxLi4wMDAwMDAwCi0tLSBhL2xkL3BvL2xkLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDE1MDMgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDIwMDAtMDItMjUgMjI6MjAtMDUwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOjY5Ci1tc2dpZCAiICAtLXN1cHBvcnQtb2xkLWNvZGUgICBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCBjb2RlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL2FybWNvZmYuZW06NzAKLW1zZ2lkICIgIC0tdGh1bWItZW50cnk9PHN5bT4gIFNldCB0aGUgZW50cnkgcG9pbnQgdG8gYmUgVGh1bWIgc3ltYm9sIDxzeW0+XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL2FybWNvZmYuZW06MTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL2FybWNvZmYuZW06MjA1IGVtdWx0ZW1wbC9wZS5lbToxMDMwCi1tc2dpZCAiJVA6IHdhcm5pbmc6ICctLXRodW1iLWVudHJ5ICVzJyBpcyBvdmVycmlkaW5nICctZSAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvYXJtY29mZi5lbToyMTAgZW11bHRlbXBsL3BlLmVtOjEwMzUKLW1zZ2lkICIlUDogd2FybmluZzogY29ubm90IGZpbmQgdGh1bWIgc3RhcnQgc3ltYm9sICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI1NQotbXNnaWQgIiIKLSIgIC0tYmFzZV9maWxlIDxiYXNlZmlsZT4gICAgICAgICAgICAgR2VuZXJhdGUgYSBiYXNlIGZpbGUgZm9yIHJlbG9jYXRhYmxlICIKLSJETExzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI1NgotbXNnaWQgIiIKLSIgIC0tZGxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IGltYWdlIGJhc2UgdG8gdGhlIGRlZmF1bHQgZm9yIERMTHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjU3Ci1tc2dpZCAiICAtLWZpbGUtYWxpZ25tZW50IDxzaXplPiAgICAgICAgICAgIFNldCBmaWxlIGFsaWdubWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyNTgKLW1zZ2lkICIgIC0taGVhcCA8c2l6ZT4gICAgICAgICAgICAgICAgICAgICAgU2V0IGluaXRpYWwgc2l6ZSBvZiB0aGUgaGVhcFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyNTkKLW1zZ2lkICIiCi0iICAtLWltYWdlLWJhc2UgPGFkZHJlc3M+ICAgICAgICAgICAgIFNldCBzdGFydCBhZGRyZXNzIG9mIHRoZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI2MAotbXNnaWQgIiIKLSIgIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI2MQotbXNnaWQgIiAgLS1tYWpvci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI2MgotbXNnaWQgIiIKLSIgIC0tbWFqb3Itc3Vic3lzdGVtLXZlcnNpb24gPG51bWJlcj4gU2V0IG1pbmltdW0gcmVxdWlyZWQgT1Mgc3Vic3lzdGVtICIKLSJ2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI2MwotbXNnaWQgIiIKLSIgIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHJldmlzaW9uIG51bWJlciBvZiB0aGUgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyNjQKLW1zZ2lkICIgIC0tbWlub3Itb3MtdmVyc2lvbiA8bnVtYmVyPiAgICAgICAgU2V0IG1pbmltdW0gcmVxdWlyZWQgT1MgcmV2aXNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjY1Ci1tc2dpZCAiIgotIiAgLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gIgotInJldmlzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI2NgotbXNnaWQgIiAgLS1zZWN0aW9uLWFsaWdubWVudCA8c2l6ZT4gICAgICAgICBTZXQgc2VjdGlvbiBhbGlnbm1lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjY3Ci1tc2dpZCAiICAtLXN0YWNrIDxzaXplPiAgICAgICAgICAgICAgICAgICAgIFNldCBzaXplIG9mIHRoZSBpbml0aWFsIHN0YWNrXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI2OAotbXNnaWQgIiIKLSIgIC0tc3Vic3lzdGVtIDxuYW1lPls6PHZlcnNpb24+XSAgICAgU2V0IHJlcXVpcmVkIE9TIHN1YnN5c3RlbSBbJiB2ZXJzaW9uXVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyNjkKLW1zZ2lkICIiCi0iICAtLXN1cHBvcnQtb2xkLWNvZGUgICAgICAgICAgICAgICAgIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkIGNvZGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjcwCi1tc2dpZCAiIgotIiAgLS10aHVtYi1lbnRyeT08c3ltYm9sPiAgICAgICAgICAgICBTZXQgdGhlIGVudHJ5IHBvaW50IHRvIGJlIFRodW1iICIKLSI8c3ltYm9sPlxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyNzIKLW1zZ2lkICIiCi0iICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgICAgICAgICAgICAgIEV4cG9ydCBzeW1ib2xzIHdpdGggYW5kIHdpdGhvdXQgQG5uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI3MwotbXNnaWQgIiAgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgICAgICAgICAgICBEb24ndCBsaW5rIF9zeW0gdG8gX3N5bUBublxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyNzQKLW1zZ2lkICIiCi0iICAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgIExpbmsgX3N5bSB0byBfc3ltQG5uIHdpdGhvdXQgd2FybmluZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06Mjc1Ci1tc2dpZCAiIgotIiAgLS1leGNsdWRlLXN5bWJvbHMgc3ltLHN5bSwuLi4gICAgICBFeGNsdWRlIHN5bWJvbHMgZnJvbSBhdXRvbWF0aWMgZXhwb3J0XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI3NgotbXNnaWQgIiIKLSIgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgICAgICAgICAgICAgQXV0b21hdGljYWxseSBleHBvcnQgYWxsIGdsb2JhbHMgdG8gIgotIkRMTFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyNzcKLW1zZ2lkICIgIC0ta2lsbC1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIEBubiBmcm9tIGV4cG9ydGVkIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06Mjc4Ci1tc2dpZCAiICAtLW91dC1pbXBsaWIgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI3OQotbXNnaWQgIiIKLSIgIC0tb3V0cHV0LWRlZiA8ZmlsZT4gICAgICAgICAgICAgICAgR2VuZXJhdGUgYSAuREVGIGZpbGUgZm9yIHRoZSBidWlsdCBETExcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjgwCi1tc2dpZCAiICAtLXdhcm4tZHVwbGljYXRlLWV4cG9ydHMgICAgICAgICAgIFdhcm4gYWJvdXQgZHVwbGljYXRlIGV4cG9ydHMuXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI4MQotbXNnaWQgIiIKLSIgIC0tY29tcGF0LWltcGxpYiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIGJhY2t3YXJkIGNvbXBhdGlibGUgaW1wb3J0ICIKLSJsaWJzO1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyODIKLW1zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgX19pbXBfPFNZTUJPTD4gYXMgd2VsbC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MzUwCi1tc2dpZCAiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTozODYKLW1zZ2lkICIlUCVGOiBpbnZhbGlkIHN1YnN5c3RlbSB0eXBlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjQwMQotbXNnaWQgIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NDE5Ci1tc2dpZCAiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NDU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo2MDAKLW1zZ2lkICIlUDogd2FybmluZywgZmlsZSBhbGlnbm1lbnQgPiBzZWN0aW9uIGFsaWdubWVudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NjcwIGVtdWx0ZW1wbC9wZS5lbTo2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06Njc1IGVtdWx0ZW1wbC9wZS5lbTo3MDEKLW1zZ2lkICJVc2UgLS1lbmFibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIHdhcm5pbmdzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjY3NiBlbXVsdGVtcGwvcGUuZW06NzAyCi1tc2dpZCAiVXNlIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2UgZml4dXBzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjcxOAotbXNnaWQgIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjgzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjg1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIGZvciBpbnRlcndvcmtpbmciCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjkxMyBsZGxhbmcuYzoxOTYxIGxkbGFuZy5jOjQzMzMgbGRsYW5nLmM6NDM2NyBsZG1haW4uYzo5OTYKLW1zZ2lkICIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MTYyCi1tc2dpZCAiJVglUDogYmZkX2hhc2hfdGFibGVfaW5pdCBvZiBjcmVmIHRhYmxlIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoxNjgKLW1zZ2lkICIlWCVQOiBjcmVmX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyMzkKLW1zZ2lkICIiCi0iXG4iCi0iQ3Jvc3MgUmVmZXJlbmNlIFRhYmxlXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MjQwCi1tc2dpZCAiU3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjI0OAotbXNnaWQgIkZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyNTIKLW1zZ2lkICJObyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MzY5Ci1tc2dpZCAiJVA6IHN5bWJvbCBgJVQnIG1pc3NpbmcgZnJvbSBtYWluIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzo0NDEKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOyAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjQ0NSBsZG1haW4uYzoxMDY0IGxkbWFpbi5jOjEwNjgKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjUxNyBsZGNyZWYuYzo1MjQgbGRtYWluLmM6MTExNCBsZG1haW4uYzoxMTIxCi1tc2dpZCAiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIgotbXNnc3RyICIiCi0KLSMuIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wuICBUaGUgc3ltYm9sIGlzIGRlZmluZWQKLSMuIGluIE9VVFNFQ05BTUUuICBUaGlzIHJlbG9jIGlzIGZyb20gYSBzZWN0aW9uIHdoaWNoIGlzCi0jLiBtYXBwZWQgaW50byBhIHNlY3Rpb24gZnJvbSB3aGljaCByZWZlcmVuY2VzIHRvIE9VVFNFQ05BTUUKLSMuIGFyZSBwcm9oaWJpdGVkLiAgV2UgbXVzdCByZXBvcnQgYW4gZXJyb3IuCi0jOiBsZGNyZWYuYzo1NDIKLW1zZ2lkICIlWCVDOiBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tICVzIHRvIGAlVCcgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzo4OQotbXNnaWQgIiVQJVg6IERpZmZlcmVudCByZWxvY3MgdXNlZCBpbiBzZXQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzoxMDYKLW1zZ2lkICIlUCVYOiBEaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0cyBjb21wb3Npbmcgc2V0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjdG9yLmM6Mjg4IGxkY3Rvci5jOjMwMgotbXNnaWQgIiVQJVg6ICVzIGRvZXMgbm90IHN1cHBvcnQgcmVsb2MgJXMgZm9yIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjMyMwotbXNnaWQgIiVQJVg6IFVuc3VwcG9ydGVkIHNpemUgJWQgZm9yIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjM0NAotbXNnaWQgIiIKLSJcbiIKLSJTZXQgICAgICAgICAgICAgICAgIFN5bWJvbFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjIyNAotbXNnaWQgIiVTIFNZU0xJQiBpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6MjMyCi1tc2dpZCAiJVMgSExMIGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGVtdWwuYzoyNTMKLW1zZ2lkICIlUDogdW5yZWNvZ25pc2VkIGVtdWxhdGlvbiBtb2RlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjI1NAotbXNnaWQgIlN1cHBvcnRlZCBlbXVsYXRpb25zOiAiCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6Mjk4Ci1tc2dpZCAiICBubyBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9ucy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjE1NwotbXNnaWQgIiVGJVA6ICVzIHVzZXMgdW5kZWZpbmVkIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjE1OQotbXNnaWQgIiVGJVA6ICVzIGZvcndhcmQgcmVmZXJlbmNlIG9mIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjI3MQotbXNnaWQgIiVGJVMgJSUgYnkgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6Mjc4Ci1tc2dpZCAiJUYlUyAvIGJ5IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjQwMQotbXNnaWQgIiVYJVM6IHVucmVzb2x2YWJsZSBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjQyMAotbXNnaWQgIiVGJVM6IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYwMgotbXNnaWQgIiVGJVMgY2FuIG5vdCBQUk9WSURFIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjEyCi1tc2dpZCAiJUYlUyBpbnZhbGlkIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjE2Ci1tc2dpZCAiJUYlUyBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXIgaW52YWxpZCBvdXRzaWRlIG9mIFNFQ1RJT05cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYyNgotbXNnaWQgIiVGJVMgY2Fubm90IG1vdmUgbG9jYXRpb24gY291bnRlciBiYWNrd2FyZHMgKGZyb20gJVYgdG8gJVYpXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo2NTQKLW1zZ2lkICIlUCVGOiVzOiBoYXNoIGNyZWF0aW9uIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6OTUxCi1tc2dpZCAiJUYlUyBub25jb25zdGFudCBleHByZXNzaW9uIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6OTg0Ci1tc2dpZCAiJUYlUyBub24gY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoxMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byBvcGVuICVzIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjEwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJhdHRlbXB0IHRvIG9wZW4gJXMgc3VjY2VlZGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MTE0Ci1tc2dpZCAiJUYlUDogaW52YWxpZCBCRkQgdGFyZ2V0IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoxMzYKLW1zZ2lkICIlUDogc2tpcHBpbmcgaW5jb21wYXRpYmxlICVzIHdoZW4gc2VhcmNoaW5nIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyMjcKLW1zZ2lkICIlRiVQOiBjYW5ub3Qgb3BlbiAlcyBmb3IgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjMwCi1tc2dpZCAiJUYlUDogY2Fubm90IG9wZW4gJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjUwCi1tc2dpZCAiJUYlUDogY2Fubm90IGZpbmQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyNjggbGRmaWxlLmM6MjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIHNjcmlwdCBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjcwIGxkZmlsZS5jOjI4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVuZWQgc2NyaXB0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzozMjgKLW1zZ2lkICIlUCVGOiBjYW5ub3Qgb3BlbiBsaW5rZXIgc2NyaXB0IGZpbGUgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MzY5Ci1tc2dpZCAiJVAlRjogdW5rbm93biBhcmNoaXRlY3R1cmU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6Mzg2Ci1tc2dpZCAiJVAlRjogdGFyZ2V0IGFyY2hpdGVjdHVyZSByZXNwZWNpZmllZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjQzOQotbXNnaWQgIiVQJUY6IGNhbm5vdCByZXByZXNlbnQgbWFjaGluZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzM2Ci1tc2dpZCAiIgotIlxuIgotIk1lbW9yeSBDb25maWd1cmF0aW9uXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzM4Ci1tc2dpZCAiTmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3MzgKLW1zZ2lkICJPcmlnaW4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzM4Ci1tc2dpZCAiTGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjczOAotbXNnaWQgIkF0dHJpYnV0ZXMiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzgwCi1tc2dpZCAiIgotIlxuIgotIkxpbmtlciBzY3JpcHQgYW5kIG1lbW9yeSBtYXBcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3OTcKLW1zZ2lkICIlUCVGOiBJbGxlZ2FsIHVzZSBvZiBgJXMnIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6ODA3Ci1tc2dpZCAiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6OTcwCi1tc2dpZCAiJVA6ICVCOiB3YXJuaW5nOiBpZ25vcmluZyBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6OTczCi1tc2dpZCAiJVA6ICVCOiB3YXJuaW5nOiBpZ25vcmluZyBkdXBsaWNhdGUgYCVzJyBzZWN0aW9uIHN5bWJvbCBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6OTg3Ci1tc2dpZCAiJVA6ICVCOiB3YXJuaW5nOiBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnIGhhcyBkaWZmZXJlbnQgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEwMzkKLW1zZ2lkICIlUCVGOiBGYWlsZWQgdG8gY3JlYXRlIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDIyCi1tc2dpZCAiJUI6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTQyMwotbXNnaWQgIiVCOiBtYXRjaGluZyBmb3JtYXRzOiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDMwCi1tc2dpZCAiJUYlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDgzCi1tc2dpZCAiJUYlQjogb2JqZWN0ICVCIGluIGFyY2hpdmUgaXMgbm90IG9iamVjdFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0ODkgbGRsYW5nLmM6MTUwMQotbXNnaWQgIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTc0NwotbXNnaWQgIiIKLSIlUDogd2FybmluZzogY291bGQgbm90IGZpbmQgYW55IHRhcmdldHMgdGhhdCBtYXRjaCBlbmRpYW5uZXNzIHJlcXVpcmVtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTc1OQotbXNnaWQgIiVQJUY6IHRhcmdldCAlcyBub3QgZm91bmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNzYxCi1tc2dpZCAiJVAlRjogY2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTc2OQotbXNnaWQgIiVQJUY6JXM6IGNhbiBub3QgbWFrZSBvYmplY3QgZmlsZTogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNzczCi1tc2dpZCAiJVAlRjolczogY2FuIG5vdCBzZXQgYXJjaGl0ZWN0dXJlOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE3NzcKLW1zZ2lkICIlUCVGOiBjYW4gbm90IGNyZWF0ZSBsaW5rIGhhc2ggdGFibGU6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjA4NAotbXNnaWQgIiBsb2FkIGFkZHJlc3MgMHglViIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyMjE0Ci1tc2dpZCAiJVcgKHNpemUgYmVmb3JlIHJlbGF4aW5nKVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjIyOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWRkcmVzcyBvZiBzZWN0aW9uICVzIHNldCB0byAiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJGYWlsIHdpdGggJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNjg0Ci1tc2dpZCAiJVglUDogc2VjdGlvbiAlcyBbJVYgLT4gJVZdIG92ZXJsYXBzIHNlY3Rpb24gJXMgWyVWIC0+ICVWXVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI3MTgKLW1zZ2lkICIlWCVQOiBhZGRyZXNzIDB4JXYgb2YgJUIgc2VjdGlvbiAlcyBpcyBub3Qgd2l0aGluIHJlZ2lvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI3MjYKLW1zZ2lkICIlWCVQOiByZWdpb24gJXMgaXMgZnVsbCAoJUIgc2VjdGlvbiAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNzc1Ci1tc2dpZCAiJVAlWDogSW50ZXJuYWwgZXJyb3Igb24gQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjgxNgotbXNnaWQgIiVQOiB3YXJuaW5nOiBubyBtZW1vcnkgcmVnaW9uIHNwZWNpZmllZCBmb3Igc2VjdGlvbiBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjgyOQotbXNnaWQgIiVQOiB3YXJuaW5nOiBjaGFuZ2luZyBzdGFydCBvZiBzZWN0aW9uICVzIGJ5ICV1IGJ5dGVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mjg0MwotbXNnaWQgIiVGJVM6IG5vbiBjb25zdGFudCBhZGRyZXNzIGV4cHJlc3Npb24gZm9yIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyOTA3Ci1tc2dpZCAiJVglUDogdXNlIGFuIGFic29sdXRlIGxvYWQgYWRkcmVzcyBvciBhIGxvYWQgbWVtb3J5IHJlZ2lvbiwgbm90IGJvdGhcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMDIwCi1tc2dpZCAiJVAlRjogY2FuJ3QgcmVsYXggc2VjdGlvbjogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMTg1Ci1tc2dpZCAiJUYlUDogaW52YWxpZCBkYXRhIHN0YXRlbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjMyMjIKLW1zZ2lkICIlRiVQOiBpbnZhbGlkIHJlbG9jIHN0YXRlbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjMzNTgKLW1zZ2lkICIlUCVGOiVzOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjMzNzEgbGRsYW5nLmM6MzM4OAotbXNnaWQgIiVQJUY6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzM4MwotbXNnaWQgIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IGRlZmF1bHRpbmcgdG8gJVZcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMzkzCi1tc2dpZCAiJVA6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAlczsgbm90IHNldHRpbmcgc3RhcnQgYWRkcmVzc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjM0MzUKLW1zZ2lkICIiCi0iJVA6IHdhcm5pbmc6ICVzIGFyY2hpdGVjdHVyZSBvZiBpbnB1dCBmaWxlIGAlQicgaXMgaW5jb21wYXRpYmxlIHdpdGggJXMgIgotIm91dHB1dFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjM0NTMKLW1zZ2lkICIlRSVYOiBmYWlsZWQgdG8gbWVyZ2UgdGFyZ2V0IHNwZWNpZmljIGRhdGEgb2YgZmlsZSAlQlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjM1NDAKLW1zZ2lkICIiCi0iXG4iCi0iQWxsb2NhdGluZyBjb21tb24gc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjM1NDEKLW1zZ2lkICIiCi0iQ29tbW9uIHN5bWJvbCAgICAgICBzaXplICAgICAgICAgICAgICBmaWxlXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBtZXNzYWdlIGhhcHBlbnMgd2hlbiB1c2luZyB0aGUKLSMuIHN2cjMuaWZpbGUgbGlua2VyIHNjcmlwdCwgc28gSSBoYXZlCi0jLiBkaXNhYmxlZCBpdC4KLSM6IGxkbGFuZy5jOjM2MjYKLW1zZ2lkICIlUDogbm8gW0NPTU1PTl0gY29tbWFuZCwgZGVmYXVsdGluZyB0byAuYnNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzY4NgotbXNnaWQgIiVQJUY6IGludmFsaWQgc3ludGF4IGluIGZsYWdzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDI4MQotbXNnaWQgIiVQJUZtdWx0aXBsZSBTVEFSVFVQIGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDU1MwotbXNnaWQgIiVGJVA6IGJmZF9yZWNvcmRfcGhkciBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDU3MgotbXNnaWQgIiVYJVA6IHNlY3Rpb24gYCVzJyBhc3NpZ25lZCB0byBub24tZXhpc3RlbnQgcGhkciBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDg4MQotbXNnaWQgIiVYJVA6IHVua25vd24gbGFuZ3VhZ2UgYCVzJyBpbiB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDkzMAotbXNnaWQgIiVYJVA6IGR1cGxpY2F0ZSB2ZXJzaW9uIHRhZyBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDk0MyBsZGxhbmcuYzo0OTU2Ci1tc2dpZCAiJVglUDogZHVwbGljYXRlIGV4cHJlc3Npb24gYCVzJyBpbiB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDk5MwotbXNnaWQgIiVYJVA6IHVuYWJsZSB0byBmaW5kIHZlcnNpb24gZGVwZW5kZW5jeSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NTAxNQotbXNnaWQgIiVYJVA6IHVuYWJsZSB0byByZWFkIC5leHBvcnRzIHNlY3Rpb24gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTkyCi1tc2dpZCAiJVglUDogY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjI2MgotbXNnaWQgIiVQJUY6IC1yIGFuZCAtLW1wYzg2MGMwIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjI2NAotbXNnaWQgIiVQJUY6IC0tcmVsYXggYW5kIC1yIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjI2NgotbXNnaWQgIiVQJUY6IC1yIGFuZCAtc2hhcmVkIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjI5NQotbXNnaWQgInVzaW5nIGludGVybmFsIGxpbmtlciBzY3JpcHQ6XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MzE0Ci1tc2dpZCAiJVAlRjogbm8gaW5wdXQgZmlsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzozMTkKLW1zZ2lkICIlUDogbW9kZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjMzNwotbXNnaWQgIiVQJUY6IGNhbm5vdCBvcGVuIG1hcCBmaWxlICVzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjM4MwotbXNnaWQgIiVQOiBsaW5rIGVycm9ycyBmb3VuZCwgZGVsZXRpbmcgZXhlY3V0YWJsZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6Mzk0Ci1tc2dpZCAiJUYlQjogZmluYWwgY2xvc2UgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQxOAotbXNnaWQgIiVYJVA6IHVuYWJsZSB0byBvcGVuIGZvciBzb3VyY2Ugb2YgY29weSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDIwCi1tc2dpZCAiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIGRlc3RpbmF0aW9uIG9mIGNvcHkgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQyNgotbXNnaWQgIiVQOiBFcnJvciB3cml0aW5nIGZpbGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQzMiBwZS1kbGwuYzoxMDg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVQOiBFcnJvciBjbG9zaW5nIGZpbGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQ0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdG90YWwgdGltZSBpbiBsaW5rOiAlbGQuJTA2bGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGRhdGEgc2l6ZSAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0OTMKLW1zZ2lkICIlUCVGOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC1tXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NjA3IGxkbWFpbi5jOjYyOCBsZG1haW4uYzo2NTkKLW1zZ2lkICIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo2MTIgbGRtYWluLmM6NjMxCi1tc2dpZCAiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo2NDYKLW1zZ2lkICIlWCVQOiBlcnJvcjogZHVwbGljYXRlIHJldGFpbi1zeW1ib2xzLWZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo2OTAKLW1zZ2lkICIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZm9yIGluc2VydGlvbiBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6Njk1Ci1tc2dpZCAiJVA6IGAtcmV0YWluLXN5bWJvbHMtZmlsZScgb3ZlcnJpZGVzIGAtcycgYW5kIGAtUydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo3NzIKLW1zZ2lkICJBcmNoaXZlIG1lbWJlciBpbmNsdWRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo3NzMKLW1zZ2lkICJiZWNhdXNlIG9mIGZpbGUgKHN5bWJvbCkiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODQ1Ci1tc2dpZCAiJVglQzogbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiBgJVQnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODQ4Ci1tc2dpZCAiJUQ6IGZpcnN0IGRlZmluZWQgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg3NwotbXNnaWQgIiVCOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBjb21tb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4ODAKLW1zZ2lkICIlQjogd2FybmluZzogY29tbW9uIGlzIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4ODcKLW1zZ2lkICIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBkZWZpbml0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODkwCi1tc2dpZCAiJUI6IHdhcm5pbmc6IGRlZmluZWQgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg5NwotbXNnaWQgIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkZGVuIGJ5IGxhcmdlciBjb21tb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MDAKLW1zZ2lkICIlQjogd2FybmluZzogbGFyZ2VyIGNvbW1vbiBpcyBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTA0Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRpbmcgc21hbGxlciBjb21tb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MDcKLW1zZ2lkICIlQjogd2FybmluZzogc21hbGxlciBjb21tb24gaXMgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjkxMQotbXNnaWQgIiVCOiB3YXJuaW5nOiBtdWx0aXBsZSBjb21tb24gb2YgYCVUJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjkxMwotbXNnaWQgIiVCOiB3YXJuaW5nOiBwcmV2aW91cyBjb21tb24gaXMgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjkzNSBsZG1haW4uYzo5NzQKLW1zZ2lkICIlUDogd2FybmluZzogZ2xvYmFsIGNvbnN0cnVjdG9yICVzIHVzZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5ODQKLW1zZ2lkICIlUCVGOiBCRkQgYmFja2VuZCBlcnJvcjogQkZEX1JFTE9DX0NUT1IgdW5zdXBwb3J0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMTcwCi1tc2dpZCAiJUYlUDogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTE3NwotbXNnaWQgIiVGJVA6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTE5NgotbXNnaWQgIiVYJUM6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYCVUJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjExOTkKLW1zZ2lkICIlRDogbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byBgJVQnIGZvbGxvd1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjEyMDUKLW1zZ2lkICIlWCVCOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGAlVCdcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjA4Ci1tc2dpZCAiJUI6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjI5IGxkbWFpbi5jOjEyNTEgbGRtYWluLmM6MTI3MQotbXNnaWQgIiVQJVg6IGdlbmVyYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjMyCi1tc2dpZCAiIHJlbG9jYXRpb24gdHJ1bmNhdGVkIHRvIGZpdDogJXMgJVQiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTI1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJkYW5nZXJvdXMgcmVsb2NhdGlvbjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjc0Ci1tc2dpZCAiIHJlbG9jIHJlZmVycyB0byBzeW1ib2wgYCVUJyB3aGljaCBpcyBub3QgYmVpbmcgb3V0cHV0XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtaXNjLmM6MTc4Ci1tc2dpZCAibm8gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjI0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJidWlsdCBpbiBsaW5rZXIgc2NyaXB0OiV1IgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjI5MiBsZG1pc2MuYzoyOTYKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIy4gV2UgdXNlIGFiZmQtPmZpbGVuYW1lIGluIHRoaXMgaW5pdGlhbCBsaW5lLAotIy4gaW4gY2FzZSBmaWxlbmFtZSBpcyBhIC5oIGZpbGUgb3Igc29tZXRoaW5nCi0jLiBzaW1pbGFybHkgdW5oZWxwZnVsLgotIzogbGRtaXNjLmM6MzMyCi1tc2dpZCAiJUI6IEluIGZ1bmN0aW9uIGAlVCc6XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtaXNjLmM6NDY0Ci1tc2dpZCAiJUYlUDogaW50ZXJuYWwgZXJyb3IgJXMgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzo1NTAKLW1zZ2lkICIlUDogaW50ZXJuYWwgZXJyb3I6IGFib3J0aW5nIGF0ICVzIGxpbmUgJWQgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzo1NTMKLW1zZ2lkICIlUDogaW50ZXJuYWwgZXJyb3I6IGFib3J0aW5nIGF0ICVzIGxpbmUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzo1NTUKLW1zZ2lkICIlUCVGOiBwbGVhc2UgcmVwb3J0IHRoaXMgYnVnXG4iCi1tc2dzdHIgIiIKLQotIzogbGR2ZXIuYzozNQotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgbGQgdmVyc2lvbiAlcyAod2l0aCBCRkQgJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogbGR2ZXIuYzo0MiBsZXhzdXAuYzo4ODcKLW1zZ2lkICIgIFN1cHBvcnRlZCBlbXVsYXRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGxkd3JpdGUuYzo1OSBsZHdyaXRlLmM6MTk1Ci1tc2dpZCAiJVAlRjogYmZkX25ld19saW5rX29yZGVyIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkd3JpdGUuYzozNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTh4IHNvbWV0aGluZyBlbHNlXG4iCi1tc2dzdHIgIiIKLQotIzogbGR3cml0ZS5jOjUyNgotbXNnaWQgIiVGJVA6IGZpbmFsIGxpbmsgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1NSBsZXhzdXAuYzoyMzggbGV4c3VwLmM6MjQ0Ci1tc2dpZCAiS0VZV09SRCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTUKLW1zZ2lkICJTaGFyZWQgbGlicmFyeSBjb250cm9sIGZvciBIUC9VWCBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1OAotbXNnaWQgIkFSQ0giCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU4Ci1tc2dpZCAiU2V0IGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjAgbGV4c3VwLmM6MzA3Ci1tc2dpZCAiVEFSR0VUIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2MAotbXNnaWQgIlNwZWNpZnkgdGFyZ2V0IGZvciBmb2xsb3dpbmcgaW5wdXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTYyIGxleHN1cC5jOjIwMSBsZXhzdXAuYzoyMTEgbGV4c3VwLmM6MjIwIGxleHN1cC5jOjI5MQotIzogbGV4c3VwLmM6MzE0IGxleHN1cC5jOjM0OAotbXNnaWQgIkZJTEUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTYyCi1tc2dpZCAiUmVhZCBNUkkgZm9ybWF0IGxpbmtlciBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTY0Ci1tc2dpZCAiRm9yY2UgY29tbW9uIHN5bWJvbHMgdG8gYmUgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjggbGV4c3VwLmM6MzM4IGxleHN1cC5jOjM0MCBsZXhzdXAuYzozNDIKLW1zZ2lkICJBRERSRVNTIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2OAotbXNnaWQgIlNldCBzdGFydCBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3MAotbXNnaWQgIkV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3MgotbXNnaWQgIkxpbmsgYmlnLWVuZGlhbiBvYmplY3RzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3NAotbXNnaWQgIkxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3NiBsZXhzdXAuYzoxNzkKLW1zZ2lkICJTSExJQiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzYKLW1zZ2lkICJBdXhpbGlhcnkgZmlsdGVyIGZvciBzaGFyZWQgb2JqZWN0IHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzkKLW1zZ2lkICJGaWx0ZXIgZm9yIHNoYXJlZCBvYmplY3Qgc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4MQotbXNnaWQgIklnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTgzCi1tc2dpZCAiU0laRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODMKLW1zZ2lkICJTbWFsbCBkYXRhIHNpemUgKGlmIG5vIHNpemUsIHNhbWUgYXMgLS1zaGFyZWQpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4NgotbXNnaWQgIkZJTEVOQU1FIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4NgotbXNnaWQgIlNldCBpbnRlcm5hbCBuYW1lIG9mIHNoYXJlZCBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4OAotbXNnaWQgIkxJQk5BTUUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg4Ci1tc2dpZCAiU2VhcmNoIGZvciBsaWJyYXJ5IExJQk5BTUUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTkwCi1tc2dpZCAiRElSRUNUT1JZIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE5MAotbXNnaWQgIkFkZCBESVJFQ1RPUlkgdG8gbGlicmFyeSBzZWFyY2ggcGF0aCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTIKLW1zZ2lkICJFTVVMQVRJT04iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTkyCi1tc2dpZCAiU2V0IGVtdWxhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTQKLW1zZ2lkICJQcmludCBtYXAgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTk2Ci1tc2dpZCAiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTgKLW1zZ2lkICJEbyBub3QgcGFnZSBhbGlnbiBkYXRhLCBkbyBub3QgbWFrZSB0ZXh0IHJlYWRvbmx5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwMQotbXNnaWQgIlNldCBvdXRwdXQgZmlsZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwMwotbXNnaWQgIk9wdGltaXplIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwNQotbXNnaWQgIklnbm9yZWQgZm9yIFNWUjQgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMDcKLW1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0ZWFibGUgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIxMQotbXNnaWQgIkp1c3QgbGluayBzeW1ib2xzIChpZiBkaXJlY3RvcnksIHNhbWUgYXMgLS1ycGF0aCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE0Ci1tc2dpZCAiU3RyaXAgYWxsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE2Ci1tc2dpZCAiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE4Ci1tc2dpZCAiVHJhY2UgZmlsZSBvcGVucyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjAKLW1zZ2lkICJSZWFkIGxpbmtlciBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjIyIGxleHN1cC5jOjIzNCBsZXhzdXAuYzoyNzcgbGV4c3VwLmM6Mjg5IGxleHN1cC5jOjMzNAotIzogbGV4c3VwLmM6MzUxIGxleHN1cC5jOjM2OAotbXNnaWQgIlNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjIKLW1zZ2lkICJTdGFydCB3aXRoIHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyNAotbXNnaWQgIkJ1aWxkIGdsb2JhbCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRhYmxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjYKLW1zZ2lkICJQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyOAotbXNnaWQgIlByaW50IHZlcnNpb24gYW5kIGVtdWxhdGlvbiBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzAKLW1zZ2lkICJEaXNjYXJkIGFsbCBsb2NhbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzMgotbXNnaWQgIkRpc2NhcmQgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjM0Ci1tc2dpZCAiVHJhY2UgbWVudGlvbnMgb2YgU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzNiBsZXhzdXAuYzozMTYgbGV4c3VwLmM6MzE4Ci1tc2dpZCAiUEFUSCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzYKLW1zZ2lkICJEZWZhdWx0IHNlYXJjaCBwYXRoIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjM4Ci1tc2dpZCAiSWdub3JlZCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI0MAotbXNnaWQgIlN0YXJ0IGEgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjQyCi1tc2dpZCAiRW5kIGEgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjQ0Ci1tc2dpZCAiSWdub3JlZCBmb3IgU3VuT1MgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNDYKLW1zZ2lkICJMaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNTIKLW1zZ2lkICJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjYwCi1tc2dpZCAiQmluZCBnbG9iYWwgcmVmZXJlbmNlcyBsb2NhbGx5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2MgotbXNnaWQgIkNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyAoZGVmYXVsdCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjY0Ci1tc2dpZCAiRG8gbm90IGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjcKLW1zZ2lkICJPdXRwdXQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2OQotbXNnaWQgIlNZTUJPTD1FWFBSRVNTSU9OIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2OQotbXNnaWQgIkRlZmluZSBhIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzEKLW1zZ2lkICJEZW1hbmdsZSBzeW1ib2wgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjczCi1tc2dpZCAiUFJPR1JBTSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzMKLW1zZ2lkICJTZXQgdGhlIGR5bmFtaWMgbGlua2VyIHRvIHVzZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzUKLW1zZ2lkICJHZW5lcmF0ZSBlbWJlZGRlZCByZWxvY3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjc3Ci1tc2dpZCAiQ2FsbCBTWU1CT0wgYXQgdW5sb2FkLXRpbWUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjc5Ci1tc2dpZCAiRm9yY2UgZ2VuZXJhdGlvbiBvZiBmaWxlIHdpdGggLmV4ZSBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjgxCi1tc2dpZCAiUmVtb3ZlIHVudXNlZCBzZWN0aW9ucyAob24gc29tZSB0YXJnZXRzKSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODQKLW1zZ2lkICJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zIChkZWZhdWx0KSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODcKLW1zZ2lkICJQcmludCBvcHRpb24gaGVscCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODkKLW1zZ2lkICJDYWxsIFNZTUJPTCBhdCBsb2FkLXRpbWUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjkxCi1tc2dpZCAiV3JpdGUgYSBtYXAgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyOTMKLW1zZ2lkICJEbyBub3QgZGVtYW5nbGUgc3ltYm9sIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5NQotbXNnaWQgIlVzZSBsZXNzIG1lbW9yeSBhbmQgbW9yZSBkaXNrIEkvTyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyOTcKLW1zZ2lkICJBbGxvdyBubyB1bmRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyOTkKLW1zZ2lkICJEb24ndCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzAxCi1tc2dpZCAiVHVybiBvZmYgLS13aG9sZS1hcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwMwotbXNnaWQgIkNyZWF0ZSBhbiBvdXRwdXQgZmlsZSBldmVuIGlmIGVycm9ycyBvY2N1ciIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMDcKLW1zZ2lkICJTcGVjaWZ5IHRhcmdldCBvZiBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMDkKLW1zZ2lkICJJZ25vcmVkIGZvciBMaW51eCBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMxMQotbXNnaWQgIlJlbGF4IGJyYW5jaGVzIG9uIGNlcnRhaW4gdGFyZ2V0cyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMTQKLW1zZ2lkICJLZWVwIG9ubHkgc3ltYm9scyBsaXN0ZWQgaW4gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMTYKLW1zZ2lkICJTZXQgcnVudGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMTgKLW1zZ2lkICJTZXQgbGluayB0aW1lIHNoYXJlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyMAotbXNnaWQgIkNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyNAotbXNnaWQgIlNvcnQgY29tbW9uIHN5bWJvbHMgYnkgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMjgKLW1zZ2lkICJTcGxpdCBvdXRwdXQgc2VjdGlvbnMgZm9yIGVhY2ggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzAKLW1zZ2lkICJDT1VOVCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzAKLW1zZ2lkICJTcGxpdCBvdXRwdXQgc2VjdGlvbnMgZXZlcnkgQ09VTlQgcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMzMgotbXNnaWQgIlByaW50IG1lbW9yeSB1c2FnZSBzdGF0aXN0aWNzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMzNAotbXNnaWQgIkRvIHRhc2sgbGV2ZWwgbGlua2luZyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzYKLW1zZ2lkICJVc2Ugc2FtZSBmb3JtYXQgYXMgbmF0aXZlIGxpbmtlciIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzgKLW1zZ2lkICJTZXQgYWRkcmVzcyBvZiAuYnNzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzQwCi1tc2dpZCAiU2V0IGFkZHJlc3Mgb2YgLmRhdGEgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNDIKLW1zZ2lkICJTZXQgYWRkcmVzcyBvZiAudGV4dCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0NAotbXNnaWQgIk91dHB1dCBsb3RzIG9mIGluZm9ybWF0aW9uIGR1cmluZyBsaW5rIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0OAotbXNnaWQgIlJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzUxCi1tc2dpZCAiIgotIlRha2UgZXhwb3J0IHN5bWJvbHMgbGlzdCBmcm9tIC5leHBvcnRzLCB1c2luZ1xuIgotIlx0XHRcdFx0U1lNQk9MIGFzIHRoZSB2ZXJzaW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNTQKLW1zZ2lkICJXYXJuIGFib3V0IGR1cGxpY2F0ZSBjb21tb24gc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNTYKLW1zZ2lkICJXYXJuIGlmIGdsb2JhbCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgYXJlIHNlZW4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzU5Ci1tc2dpZCAiV2FybiBpZiB0aGUgbXVsdGlwbGUgR1AgdmFsdWVzIGFyZSB1c2VkIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM2MQotbXNnaWQgIldhcm4gb25seSBvbmNlIHBlciB1bmRlZmluZWQgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM2MwotbXNnaWQgIldhcm4gaWYgc3RhcnQgb2Ygc2VjdGlvbiBjaGFuZ2VzIGR1ZSB0byBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzY2Ci1tc2dpZCAiSW5jbHVkZSBhbGwgb2JqZWN0cyBmcm9tIGZvbGxvd2luZyBhcmNoaXZlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNjgKLW1zZ2lkICJVc2Ugd3JhcHBlciBmdW5jdGlvbnMgZm9yIFNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNzAKLW1zZ2lkICJbPVdPUkRTXSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNzAKLW1zZ2lkICIiCi0iTW9kaWZ5IHByb2JsZW1hdGljIGJyYW5jaGVzIGluIGxhc3QgV09SRFMgKDEtMTAsXG4iCi0iXHRcdFx0XHRkZWZhdWx0IDUpIHdvcmRzIG9mIGEgcGFnZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo1MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVzZSB0aGUgLS1oZWxwIG9wdGlvbiBmb3IgdXNhZ2UgaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo1NDAKLW1zZ2lkICIlUCVGOiB1bnJlY29nbml6ZWQgLWEgb3B0aW9uIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo1NTMKLW1zZ2lkICIlUCVGOiB1bnJlY29nbml6ZWQgLWFzc2VydCBvcHRpb24gYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjY0NAotbXNnaWQgIiVQJUY6IGludmFsaWQgbnVtYmVyIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo4MTYKLW1zZ2lkICIlUCVGOiAtc2hhcmVkIG5vdCBzdXBwb3J0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo4ODAKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo4ODEKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuIgotInRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo5NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG1heSBub3QgbmVzdCBncm91cHMgKC0taGVscCBmb3IgdXNhZ2UpXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6OTgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBncm91cCBlbmRlZCBiZWZvcmUgaXQgYmVnYW4gKC0taGVscCBmb3IgdXNhZ2UpXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTAwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSW52YWxpZCBhcmd1bWVudCB0byBvcHRpb24gXCJtcGM4NjBjMFwiXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTA1NgotbXNnaWQgIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTA2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgW29wdGlvbnNdIGZpbGUuLi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMDcwCi1tc2dpZCAiT3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jLiBOb3RlOiBWYXJpb3VzIHRvb2xzIChzdWNoIGFzIGxpYnRvb2wpIGRlcGVuZCB1cG9uIHRoZQotIy4gZm9ybWF0IG9mIHRoZSBsaXN0aW5ncyBiZWxvdyAtIGRvIG5vdCBjaGFuZ2UgdGhlbS4KLSM6IGxleHN1cC5jOjExNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN1cHBvcnRlZCB0YXJnZXRzOiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMTU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdXBwb3J0ZWQgZW11bGF0aW9uczogIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjExNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVtdWxhdGlvbiBzcGVjaWZpYyBvcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjExNjYKLW1zZ2lkICIiCi0iXG4iCi0iUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iCi1tc2dzdHIgIiIKLQotIzogbXJpLmM6MzQzCi1tc2dpZCAiJVAlRjogdW5rbm93biBmb3JtYXQgdHlwZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjE0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlWFVuc3VwcG9ydGVkIFBFSSBhcmNoaXRlY3R1cmU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6Mzc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzICglZCB2cyAlZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzozODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZywgZHVwbGljYXRlIEVYUE9SVDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo0NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo0NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgd3JvbmcgdHlwZSAoJWQgdnMgJWQpXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6NDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIG5vdCBmb3VuZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlWEVycm9yLCBvcmlkaW5hbCB1c2VkIHR3aWNlOiAlZCAoJXMgdnMgJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6ODM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYRXJyb3I6ICVkLWJpdCByZWxvYyBpbiBkbGxcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo5NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gb3V0cHV0IGRlZiBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6MTA4MAotbXNnaWQgIjsgbm8gY29udGVudHMgYXZhaWxhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6MTU2OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlWENhbid0IG9wZW4gLmxpYiBmaWxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjE1NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9SRUFETUUgYi9sZC9zY3JpcHR0ZW1wbC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YWQyZTkuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1UaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIGxpbmtlciBzY3JpcHQgdGVtcGxhdGVzLgotZ2Vuc2NyaXB0cy5zaCBzZXRzIHNvbWUgc2hlbGwgdmFyaWFibGVzLCB0aGVuIHNvdXJjZXMKLUVNVUxBVElPTi5zYywgdG8gZ2VuZXJhdGUgRU1VTEFUSU9OLnt4LHhyLHh1LHhuLHhibn0gLS0gdGhlIHNjcmlwdAotZmlsZXMgZm9yIGRlZmF1bHQsIC1yLCAtVXIsIC1uLCAtTi4KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2EyOWsuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hMjlrLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODI1YjFlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2EyOWsuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDogewotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2V0ZXh0ICA9ICAufTsKLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5saXQpCi0gICAgKiguc2hkYXRhKQotICB9Ci0gIC5zaGJzcyBTSVpFT0YoLnRleHQpICsgQUREUigudGV4dCkgOgl7Ci0gICAgKiguc2hic3MpCi0gIH0gCi0gIC5kYXRhICA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX19lZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAgIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKSA6Ci0gIHsgCQkJCQkKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgICAke1JFTE9DQVRJTkcrIF9fZW5kID0gQUxJR04oMHg4KX07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYWl4LnNjIGIvbGQvc2NyaXB0dGVtcGwvYWl4LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjRiNjE3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2FpeC5zYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMgQUlYIGxpbmtlciBzY3JpcHQuCi0jIEFJWCBhbHdheXMgdXNlcyBzaGFyZWQgbGlicmFyaWVzLiAgVGhlIHNlY3Rpb24gVk1BIGFwcGVhcnMgdG8gYmUKLSMgdW5pbXBvcnRhbnQuICBUaGUgbmF0aXZlIGxpbmtlciBhbGlnbnMgdGhlIHNlY3Rpb25zIG9uIGJvdW5kYXJpZXMKLSMgc3BlY2lmaWVkIGJ5IHRoZSAtSCBvcHRpb24uCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci1FTlRSWShfX3N0YXJ0KQotU0VDVElPTlMKLXsKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH0KLSAgLnRleHQgJHtSRUxPQ0FUSU5HLTB9IDogewotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfdGV4dCA9IC4pO30KLSAgICAqKC50ZXh0KQotICAgICooLnByKQotICAgICooLnJvKQotICAgICooLmRiKQotICAgICooLmdsKQotICAgICooLnhvKQotICAgICooLnRpKQotICAgICooLnRiKQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfZXRleHQgPSAuKTt9Ci0gIH0KLSAgLmRhdGEgMCA6IHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2RhdGEgPSAuKTt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5ydykKLSAgICAqKC5zdikKLSAgICAqKC51YSkKLSAgICAuID0gQUxJR04oNCk7Ci0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICooLmRzKQotICAgICooLnRjMCkKLSAgICAqKC50YykKLSAgICAqKC50ZCkKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2VkYXRhID0gLik7fQotICB9Ci0gIC5ic3MgOiB7Ci0gICAgKigudG9jYnNzKQotICAgICooLmJzcykKLSAgICAqKC5icykKLSAgICAqKC51YykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2VuZCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotICB9Ci0gIC5sb2FkZXIgMCA6IHsKLSAgICAqKC5sb2FkZXIpCi0gIH0KLSAgLmRlYnVnIDAgOiB7Ci0gICAgKiguZGVidWcpCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hbHBoYS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhMTBjNC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hbHBoYS5zYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgQWxwaGEgc3lzdGVtcy4KLSMgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotIyBUaGVzZSB2YXJpYWJsZXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGVtdWxhdGlvbiBmaWxlLiAgVGhlCi0jIGRlZmF1bHRzIGFyZSBhcHByb3ByaWF0ZSBmb3IgYW4gQWxwaGEgcnVubmluZyBPU0YvMS4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X19zdGFydAotdGVzdCAteiAiJFRFWFRfU1RBUlRfQUREUiIgJiYgVEVYVF9TVEFSVF9BRERSPSIweDEyMDAwMDAwMCArIFNJWkVPRl9IRUFERVJTIgotaWYgdGVzdCAieCRMRF9GTEFHIiA9ICJ4biIgLW8gIngkTERfRkxBRyIgPSAieE4iOyB0aGVuCi0gIERBVEFfQUREUj0uCi1lbHNlCi0gIHRlc3QgLXogIiREQVRBX0FERFIiICYmIERBVEFfQUREUj0weDE0MDAwMDAwMAotZmkKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZnRleHQgPSAuIH07Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX2lzdGFydCA9IC4gfTsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpIH0KLSAgICAke1JFTE9DQVRJTkcrIExPTkcgKDB4NmJmYTgwMDEpfQotICAgICR7UkVMT0NBVElORysgZXByb2wgID0gIC59OwotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2ZzdGFydCA9IC4gfTsKLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgICR7UkVMT0NBVElORysgTE9ORyAoMHg2YmZhODAwMSl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgID0gIC59OwotICB9Ci0gIC5yZGF0YSA6IHsKLSAgICAqKC5yZGF0YSkKLSAgfQotICAucmNvbnN0IDogewotICAgICooLnJjb25zdCkKLSAgfQotICAucGRhdGEgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZnBkYXRhID0gLjt9Ci0gICAgKigucGRhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn07fQotICAuZGF0YSA6IHsKLSAgICAke1JFTE9DQVRJTkcrIF9mZGF0YSA9IC47fQotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gIC54ZGF0YSA6IHsKLSAgICAqKC54ZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrIF9ncCA9IEFMSUdOICgxNikgKyAweDgwMDA7fQotICAubGl0OCA6IHsKLSAgICAqKC5saXQ4KQotICB9Ci0gIC5saXRhIDogewotICAgICooLmxpdGEpCi0gIH0KLSAgLnNkYXRhIDogewotICAgICooLnNkYXRhKQotICB9Ci0gICR7UkVMT0NBVElORysgX0VEQVRBICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfRkJTUyA9IC47fQotICAuc2JzcyA6IHsKLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gIH0KLSAgLmJzcyA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FvdXQuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hb3V0LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGRiYjM3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2FvdXQuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7QUxJR05NRU5UfSIgJiYgQUxJR05NRU5UPSI0IgotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtTVEFDS1pFUk8rJHtSRUxPQ0FUSU5HKyR7U1RBQ0taRVJPfX19Ci0ke1NITElCX1BBVEgrJHtSRUxPQ0FUSU5HKyR7U0hMSUJfUEFUSH19fQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORytQUk9WSURFIChfX3N0YWNrID0gMCk7fQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgIC8qIFRoZSBuZXh0IHNpeCBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gIFRoZSBvcmRlcgotICAgICAgIGlzIGltcG9ydGFudC4gICovCi0gICAgKiguZHlucmVsKQotICAgICooLmhhc2gpCi0gICAgKiguZHluc3ltKQotICAgICooLmR5bnN0cikKLSAgICAqKC5ydWxlcykKLSAgICAqKC5uZWVkKQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9IC47fQotICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAuZGF0YSA6Ci0gIHsKLSAgICAvKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICAqLwotICAgICooLmR5bmFtaWMpCi0gICAgKiguZ290KQotICAgICooLnBsdCkKLSAgICAqKC5kYXRhKQotICAgICooLmxpbnV4LWR5bmFtaWMpIC8qIEZvciBMaW51eCBkeW5hbWljIGxpbmtpbmcuICAqLwotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke0FMSUdOTUVOVH0pO30KLSAgICR7UkVMT0NBVElORytfZW5kID0gLiB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gLiB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTI3NmE4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotU0VDVElPTlMKLXsKLSAgLnRleHQgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAke1JFTE9DQVRJTkcrX19zdGV4dF8gPSAuO30KLSAgICAqKC50ZXh0KQotICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyR7REFUQV9BTElHTk1FTlR9fSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19zZGF0YV8gPSAuO30KLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSICguZGF0YSl9IDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrX2VuZCA9IEFMSUdOKDQpIH07Ci0gICAke1JFTE9DQVRJTkcrX19lbmQgPSBBTElHTig0KSB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjljZDdjLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIEFSTSBDT0ZGLgotIyBCYXNlZCBvbiBpMzg2Y29mZi5zYyBieSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotaWYgdGVzdCAteiAiJHtEQVRBX0FERFJ9IjsgdGhlbgotICBpZiB0ZXN0ICIkTERfRkxBRyIgPSAiTiIgfHwgdGVzdCAiJExEX0ZMQUciID0gIm4iOyB0aGVuCi0gICAgREFUQV9BRERSPS4KLSAgZmkKLWZpCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLCAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAvKiBXZSBzdGFydCBhdCAweDgwMDAgYmVjYXVzZSBnZGIgYXNzdW1lcyBpdCAoc2VlIEZSQU1FX0NIQUlOKS4KLSAgICAgVGhpcyBpcyBhbiBhcnRpZmFjdCBvZiB0aGUgQVJNIERlbW9uIG1vbml0b3IgdXNpbmcgdGhlIGJvdHRvbSAzMmsKLSAgICAgYXMgd29ya3NwYWNlIChzaGFyZWQgd2l0aCB0aGUgRlAgaW5zdHJ1Y3Rpb24gZW11bGF0b3IgaWYKLSAgICAgcHJlc2VudCk6ICovCi0gIC50ZXh0ICR7UkVMT0NBVElORysgMHg4MDAwfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgKigucmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORyske0RBVEFfQUREUi0weDQwMDAwICsgKC4gJiAweGZmZmMwZmZmKX19IDogewotICAgICR7UkVMT0NBVElORysgIF9fZGF0YV9zdGFydF9fID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2RhdGFfZW5kX18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gICR7UkVMT0NBVElORysgZW5kID0gLjt9Ci0gICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MgYi9sZC9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk2MzA1Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKF9zdGFydCkKLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgMHgyMDAwICsgU0laRU9GX0hFQURFUlN9IDoKLSAgICB7Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHQuc3RhcnQgPSAufTsKLSAgICAgICooLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAgICR7UkVMT0NBVElORysgX2V0ZXh0ICA9ICAuO30KLSAgICAgICR7UkVMT0NBVElORysgX18udGV4dC5lbmQgPSAufTsKLSAgICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47fQotICAgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47fQotICAgIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLnRleHQpICsgQUREUigudGV4dCkgKyAweDQwMDAwMH0gOgotICAgIHsKLSAgICAgICR7UkVMT0NBVElORysgX18uZGF0YS5zdGFydCA9IC59OwotICAgICAgKiguZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgID0gIC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5kYXRhLmVuZCA9IC59OwotICAgIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICAgIHsgCQkJCQkKLSAgICAgICR7UkVMT0NBVElORysgX18uYnNzLnN0YXJ0ID0gLn07Ci0gICAgICAqKC5ic3MpCi0gICAgICAqKENPTU1PTikKLSAgICAgICR7UkVMT0NBVElORysgX18uYnNzLmVuZCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSBBTElHTigweDgpfTsKLSAgICAgICR7UkVMT0NBVElORysgX2VuZCA9IEFMSUdOKDB4OCl9OwotICAgIH0KLSAgLmNvbW1lbnQgJHtSRUxPQ0FUSU5HKyAwfSA6Ci0gICAgewotICAgICAgKiguY29tbWVudCkKLSAgICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjIGIvbGQvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDUwZWUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotRU5UUlkoc3RhcnQpCi0KLVNFQ1RJT05TIHsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOiAKLSAgICB7Ci0JKigudGV4dCk7Ci0JJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OwotICAgIH0KLSAgZGF0YSAke1JFTE9DQVRJTkcrMHg4MDAwMjAwMH0gOgotICAgIHsKLQkqKC5kYXRhKTsKLQkqKC5tc3RhY2spOyAKLQkqKC5zaGJzcyk7Ci0JKigucnN0YWNrKTsKLQkqKC5tc3RhY2spOwotCSR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICB9Ci0gIC5ic3MgIC4gOgotICAgIHsgCi0JKihDT01NT04pIAkKLQkqKC5ic3MpOwotCSR7UkVMT0NBVElORytfZW5kID0gLn07Ci0gICAgfSAKLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZWxmLnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2M0YjkxLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0jCi0jIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgotIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQotIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0Ci0jCUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMgLSBhdCBzdGFydCBvZiB0ZXh0IHNlZ21lbnQKLSMJT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMgLSBvdGhlciB0aGFuIC50ZXh0IC5pbml0IC5yb2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKLSMJT1RIRVJfVEVYVF9TRUNUSU9OUyAtIHRoZXNlIGdldCBwdXQgaW4gLnRleHQgd2hlbiByZWxvY2F0aW5nCi0jCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLmRhdGEgLmJzcyAuY3RvcnMgLnNkYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQotIwlPVEhFUl9CU1NfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5ic3MgLnNic3MgLi4uCi0jCU9USEVSX1NFQ1RJT05TIC0gYXQgdGhlIGVuZAotIwlFWEVDVVRBQkxFX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGZvciBhbgotIwkJZXhlY3V0YWJsZSAoZS5nLiwgX0RZTkFNSUNfTElOSykKLSMJVEVYVF9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkudGV4dCBzZWN0aW9uLgotIwlEQVRBX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5kYXRhIHNlY3Rpb24uCi0jCU9USEVSX0dPVF9TWU1CT0xTIC0gc3ltYm9scyBkZWZpbmVkIGp1c3QgYmVmb3JlIC5nb3QuCi0jCU9USEVSX0dPVF9TRUNUSU9OUyAtIHNlY3Rpb25zIGp1c3QgYWZ0ZXIgLmdvdCBhbmQgLnNkYXRhLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCURBVEFfUExUIC0gLnBsdCBzaG91bGQgYmUgaW4gZGF0YSBzZWdtZW50LCBub3QgdGV4dCBzZWdtZW50LgotIwlURVhUX0RZTkFNSUMgLSAuZHluYW1pYyBpbiB0ZXh0IHNlZ21lbnQsIG5vdCBkYXRhIHNlZ21lbnQuCi0jCUVNQkVEREVEIC0gd2hldGhlciB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0uIAotIwlTSExJQl9URVhUX1NUQVJUX0FERFIgLSBpZiBzZXQsIGFkZCB0byBTSVpFT0ZfSEVBREVSUyB0byBzZXQKLSMJCXN0YXJ0IGFkZHJlc3Mgb2Ygc2hhcmVkIGxpYnJhcnkuCi0jCUlOUFVUX0ZJTEVTIC0gSU5QVVQgY29tbWFuZCBvZiBmaWxlcyB0byBhbHdheXMgaW5jbHVkZQotIwlXUklUQUJMRV9ST0RBVEEgLSBpZiBzZXQsIHRoZSAucm9kYXRhIHNlY3Rpb24gc2hvdWxkIGJlIHdyaXRhYmxlCi0jCUlOSVRfU1RBUlQsIElOSVRfRU5EIC0gIHN0YXRlbWVudHMganVzdCBiZWZvcmUgYW5kIGp1c3QgYWZ0ZXIKLSMgCWNvbWJpbmF0aW9uIG9mIC5pbml0IHNlY3Rpb25zLgotIwlGSU5JX1NUQVJULCBGSU5JX0VORCAtIHN0YXRlbWVudHMganVzdCBiZWZvcmUgYW5kIGp1c3QgYWZ0ZXIKLSMgCWNvbWJpbmF0aW9uIG9mIC5maW5pIHNlY3Rpb25zLgotIwotIyBXaGVuIGFkZGluZyBzZWN0aW9ucywgZG8gbm90ZSB0aGF0IHRoZSBuYW1lcyBvZiBzb21lIHNlY3Rpb25zIGFyZSB1c2VkCi0jIHdoZW4gc3BlY2lmeWluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV4dC4KLSMKLQotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotaWYgWyAteiAiJE1BQ0hJTkUiIF07IHRoZW4gT1VUUFVUX0FSQ0g9JHtBUkNIfTsgZWxzZSBPVVRQVVRfQVJDSD0ke0FSQ0h9OiR7TUFDSElORX07IGZpCi10ZXN0IC16ICIke0VMRlNJWkV9IiAmJiBFTEZTSVpFPTMyCi10ZXN0IC16ICIke0FMSUdOTUVOVH0iICYmIEFMSUdOTUVOVD0iJHtFTEZTSVpFfSAvIDgiCi10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLUlOVEVSUD0iLmludGVycCAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW50ZXJwKSAJfSIKLVBMVD0iLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkJfSIKLURZTkFNSUM9Ii5keW5hbWljICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0iCi1ST0RBVEE9Ii5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpICR7UkVMT0NBVElORysqKC5yb2RhdGEuKil9ICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuciopfSB9IgotQ1RPUj0iLmN0b3JzICR7Q09OU1RSVUNUSU5HLTB9IDogCi0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfU1RBUlR9fQotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKLSAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKLSAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQotICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCi0gICAgICAgaXMgaW4uICAqLwotCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCi0gICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgotICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQotICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLwotCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAkT1RIRVJfRVhDTFVERV9GSUxFUykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX0VORH19Ci0gIH0iCi0KLURUT1I9IiAuZHRvcnMgICAgICAgJHtDT05TVFJVQ1RJTkctMH0gOgotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX1NUQVJUfX0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gJE9USEVSX0VYQ0xVREVfRklMRVMpIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9FTkR9fQotICB9IgotCi0jIGlmIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbSwgZG9uJ3QgYWRkIFNJWkVPRl9IRUFERVJTLgotaWYgWyAteiAiJEVNQkVEREVEIiBdOyB0aGVuCi0gICB0ZXN0IC16ICIke1RFWFRfQkFTRV9BRERSRVNTfSIgJiYgVEVYVF9CQVNFX0FERFJFU1M9IiR7VEVYVF9TVEFSVF9BRERSfSArIFNJWkVPRl9IRUFERVJTIgotZWxzZQotICAgdGVzdCAteiAiJHtURVhUX0JBU0VfQUREUkVTU30iICYmIFRFWFRfQkFTRV9BRERSRVNTPSIke1RFWFRfU1RBUlRfQUREUn0iCi1maQotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke09VVFBVVF9BUkNIfSkKLUVOVFJZKCR7RU5UUll9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAke1NUQUNLWkVSTyske1NUQUNLWkVST319ICR7U0hMSUJfUEFUSCske1NITElCX1BBVEh9fSAgKi99Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotJHtSRUxPQ0FUSU5HKyR7SU5QVVRfRklMRVN9fQotJHtSRUxPQ0FUSU5HLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL30KLQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtURVhUX0JBU0VfQUREUkVTU307fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSAke1NITElCX1RFWFRfU1RBUlRfQUREUjotMH0gKyBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19Ci0gICR7SU5JVElBTF9SRUFET05MWV9TRUNUSU9OU30KLSAgJHtURVhUX0RZTkFNSUMrJHtEWU5BTUlDfX0KLSAgLmhhc2ggICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5nbnUudmVyc2lvbiAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKQl9Ci0gIC5nbnUudmVyc2lvbl9kICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fZCkJfQotICAuZ251LnZlcnNpb25fciAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpCX0KLQotICAucmVsLmluaXQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuaW5pdCkJfQotICAucmVsYS5pbml0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLnRleHQuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS50Kil9Ci0gICAgfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS50ZXh0LiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLnQqKX0KLSAgICB9Ci0gIC5yZWwuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5maW5pKQl9Ci0gIC5yZWxhLmZpbmkgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwucm9kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5yb2RhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnJvZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnJvZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAke09USEVSX1JFQURPTkxZX1JFTE9DX1NFQ1RJT05TfQotICAucmVsLmRhdGEgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwuZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZ251LmxpbmtvbmNlLmQqKX0KLSAgICB9Ci0gIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEuZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmRhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuZCopfQotICAgIH0KLSAgLnJlbC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5nb3QgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCQl9Ci0gICR7T1RIRVJfR09UX1JFTE9DX1NFQ1RJT05TfQotICAucmVsLnNkYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwuc2RhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLnNkYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5nbnUubGlua29uY2UucyopfQotICAgIH0KLSAgLnJlbGEuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEuc2RhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5zZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5zKil9Ci0gICAgfQotICAucmVsLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc2JzcykJCX0KLSAgLnJlbGEuc2JzcyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zYnNzKQl9Ci0gIC5yZWwuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgJHtPVEhFUl9QTFRfUkVMT0NfU0VDVElPTlN9Ci0KLSAgLmluaXQgICAgICAgICR7UkVMT0NBVElORy0wfSA6IAotICB7IAotICAgICR7SU5JVF9TVEFSVH0KLSAgICBLRUVQICgqKC5pbml0KSkKLSAgICAke0lOSVRfRU5EfQotICB9ID0ke05PUC0wfQotCi0gICR7REFUQV9QTFQtJHtQTFR9fQotICAudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysqKC50ZXh0LiopfQotICAgICooLnN0dWIpCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS50Kil9Ci0gICAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfVEVYVF9TRUNUSU9OU319Ci0gIH0gPSR7Tk9QLTB9Ci0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotICAuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtGSU5JX1NUQVJUfQotICAgIEtFRVAgKCooLmZpbmkpKQotICAgICR7RklOSV9FTkR9Ci0gIH0gPSR7Tk9QLTB9Ci0gICR7V1JJVEFCTEVfUk9EQVRBLSR7Uk9EQVRBfX0KLSAgLnJvZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KLQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bwotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoLiAmICgke01BWFBBR0VTSVpFfSAtIDEpKX07fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSAke1NITElCX0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoLiAmICgke01BWFBBR0VTSVpFfSAtIDEpKX07fX0KLQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YS4qKX0KLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLmQqKX0KLSAgICAke0NPTlNUUlVDVElORytTT1JUKENPTlNUUlVDVE9SUyl9Ci0gIH0KLSAgLmRhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKiguZGF0YTEpIH0KLSAgLmVoX2ZyYW1lIDogeyAqKC5laF9mcmFtZSkgfQotICAuZ2NjX2V4Y2VwdF90YWJsZSA6IHsgKiguZ2NjX2V4Y2VwdF90YWJsZSkgfQotICAke1dSSVRBQkxFX1JPREFUQSske1JPREFUQX19Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0gICR7UkVMT0NBVElORyske0NUT1J9fQotICAke1JFTE9DQVRJTkcrJHtEVE9SfX0KLSAgJHtEQVRBX1BMVCske1BMVH19Ci0gICR7UkVMT0NBVElORyske09USEVSX0dPVF9TWU1CT0xTfX0KLSAgLmdvdCAgICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gICR7VEVYVF9EWU5BTUlDLSR7RFlOQU1JQ319Ci0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtTREFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5zZGF0YSkgCi0gICAgJHtSRUxPQ0FUSU5HKyooLnNkYXRhLiopfQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2Uucy4qKX0KLSAgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9HT1RfU0VDVElPTlN9fQotICAke1JFTE9DQVRJTkcrX2VkYXRhID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICooLmR5bnNic3MpCi0gICAgKiguc2JzcykKLSAgICAke1JFTE9DQVRJTkcrKiguc2Jzcy4qKX0KLSAgICAqKC5zY29tbW9uKQotICB9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICR7UkVMT0NBVElORysqKC5ic3MuKil9Ci0gICAqKENPTU1PTikKLSAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bwotICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCi0gICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCi0gICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKCR7QUxJR05NRU5UfSk7fQotICB9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19TRUNUSU9OU319Ci0gICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9Ci0gICR7UkVMT0NBVElORytfZW5kID0gLjt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19FTkRfU1lNQk9MU319Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotCi0gIC5jb21tZW50IDAgOiB7ICooLmNvbW1lbnQpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TfX0KLQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLwotICAke09USEVSX1NFQ1RJT05TfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGYzMmF2ci5zYyBiL2xkL3NjcmlwdHRlbXBsL2VsZjMyYXZyLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI2NTEyLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZjMyYXZyLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsIiR7T1VUUFVUX0ZPUk1BVH0iLCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLU1FTU9SWQotewotICB0ZXh0ICAgKHJ4KSAgIDogT1JJR0lOID0gMCwgICAgTEVOR1RIID0gJFRFWFRfTEVOR1RICi0gIGRhdGEgICAocncheCkgOiBPUklHSU4gPSAweDgwMDA2MCwgTEVOR1RIID0gJERBVEFfTEVOR1RICi0gIGVlcHJvbSAocncheCkgOiBPUklHSU4gPSAwLCAgICBMRU5HVEggPSAkRUVQUk9NX0xFTkdUSAotfQotCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtURVhUX0RZTkFNSUMrJHtEWU5BTUlDfX0KLSAgLmhhc2ggICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5nbnUudmVyc2lvbiAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKQl9Ci0gIC5nbnUudmVyc2lvbl9kICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fZCkJfQotICAuZ251LnZlcnNpb25fciAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpCX0KLQotICAucmVsLmluaXQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuaW5pdCkJfQotICAucmVsYS5pbml0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLnRleHQuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS50Kil9Ci0gICAgfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS50ZXh0LiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLnQqKX0KLSAgICB9Ci0gIC5yZWwuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5maW5pKQl9Ci0gIC5yZWxhLmZpbmkgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwucm9kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5yb2RhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnJvZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnJvZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAucmVsLmRhdGEgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwuZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZ251LmxpbmtvbmNlLmQqKX0KLSAgICB9Ci0gIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEuZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmRhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuZCopfQotICAgIH0KLSAgLnJlbC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5nb3QgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJCX0KLQotICAvKiBJbnRlcm5hbCB0ZXh0IHNwYWNlIG9yIGV4dGVybmFsIG1lbW9yeSAqLwotICAudGV4dCA6Ci0gIHsKLSAgICAqKC5pbml0KQotICAgICooLnByb2dtZW0uZ2NjKikKLSAgICAqKC5wcm9nbWVtKikKLSAgICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKDIpO30KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysuID0gQUxJR04oMik7fQotICAgICooLnRleHQuKikKLSAgICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKDIpO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gdGV4dH0KLQotICAuZGF0YQkke1JFTE9DQVRJTkctMH0gOiAke1JFTE9DQVRJTkcrQVQgKEFERFIgKC50ZXh0KSArIFNJWkVPRiAoLnRleHQpKX0KLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZ251LmxpbmtvbmNlLmQqKQotICAgICR7UkVMT0NBVElORysuID0gQUxJR04oMik7fQotICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZGF0YX0KLQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gICAgICAgJHtSRUxPQ0FUSU5HK0FUIChBRERSICgudGV4dCkgKyBTSVpFT0YgKC50ZXh0KSArIFNJWkVPRiAoLmRhdGEpKX0KLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19ic3Nfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Jzc19lbmQgPSAuKSA7IH0KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZGF0YX0KLQotICAuZWVwcm9tICR7UkVMT0NBVElORy0wfToKLSAgewotICAgICooLmVlcHJvbSopCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2VlcHJvbV9lbmQgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiBlZXByb219Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Ci0gCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotfQotRU9GCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTYwNmMzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotaWYgWyAteiAiJE1BQ0hJTkUiIF07IHRoZW4gT1VUUFVUX0FSQ0g9JHtBUkNIfTsgZWxzZSBPVVRQVVRfQVJDSD0ke0FSQ0h9OiR7TUFDSElORX07IGZpCi10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLUlOVEVSUD0iLmludGVycCAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW50ZXJwKSAJfSIKLVBMVD0iLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkJfSIKLQotCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9TVEFSVH19Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgotICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcwotICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKLSAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCi0gICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KLSAgICAgICBpcyBpbi4gICovCi0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KLSAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCi0gICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCi0gICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCi0KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfRU5EfX0KLSAgfSIKLQotRFRPUj0iIC5kdG9ycyAgICAgICAke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfU1RBUlR9fQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX0VORH19Ci0gIH0iCi0KLVNUQUNLPSIgLnN0YWNrIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfSA+U1RBQ0sgIgotCi0jIGlmIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbSwgZG9uJ3QgYWRkIFNJWkVPRl9IRUFERVJTLgotaWYgWyAteiAiJEVNQkVEREVEIiBdOyB0aGVuCi0gICB0ZXN0IC16ICIke1JFQURPTkxZX0JBU0VfQUREUkVTU30iICYmIFJFQURPTkxZX0JBU0VfQUREUkVTUz0iJHtSRUFET05MWV9TVEFSVF9BRERSfSArIFNJWkVPRl9IRUFERVJTIgotZWxzZQotICAgdGVzdCAteiAiJHtSRUFET05MWV9CQVNFX0FERFJFU1N9IiAmJiBSRUFET05MWV9CQVNFX0FERFJFU1M9IiR7UkVBRE9OTFlfU1RBUlRfQUREUn0iCi1maQotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke09VVFBVVF9BUkNIfSkKLUVOVFJZKCR7RU5UUll9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAke1NUQUNLWkVSTyske1NUQUNLWkVST319ICR7U0hMSUJfUEFUSCske1NITElCX1BBVEh9fSAgKi99Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotCi1NRU1PUlkKLXsKLSAgVU5JRklFRCA6IG9yZyA9IDAsICAgICAgICAgbGVuID0gMHgxMDAwMDAwCi0gIElOU04gICAgOiBvcmcgPSAweDEwMDAwMDAsIGxlbiA9IDB4NDAwMDAKLSAgREFUQSAgICA6IG9yZyA9IDB4MjAwMDAwNCwgbGVuID0gMHg3RkZDCi0gIFNUQUNLICAgOiBvcmcgPSAweDIwMDdGRkUsIGxlbiA9IDQKLX0KLQotU0VDVElPTlMKLXsKLSAgLnRleHQgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9TWU1CT0xTfX0KLSAgICBLRUVQICgqKC5pbml0KSkKLSAgICBLRUVQICgqKC5maW5pKSkKLSAgICAqKC50ZXh0KQotICAgICooLnRleHQuKikKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLSAgfSAke1JFTE9DQVRJTkcrID5JTlNOfSA9JHtOT1AtMH0KLQotICAucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOiB7Ci0gICAgKigucm9kYXRhKSAqKC5nbnUubGlua29uY2UuciopCi0gIH0gJHtSRUxPQ0FUSU5HKyA+REFUQX0KLSAgLnJvZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGExKSB9ICR7UkVMT0NBVElORysgPkRBVEF9Ci0KLSAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YS4qKQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+REFUQX0KLSAgLmRhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKiguZGF0YTEpIH0gJHtSRUxPQ0FUSU5HKyA+REFUQX0KLSAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn0gPkRBVEF9Ci0gICR7UkVMT0NBVElORyske0RUT1J9ID5EQVRBfQotCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YSkgfSAke1JFTE9DQVRJTkcrID5EQVRBfQotICAke1JFTE9DQVRJTkcrX2VkYXRhID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfSAke1JFTE9DQVRJTkcrID5EQVRBfQotICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfSAke1JFTE9DQVRJTkcrID5EQVRBfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAke1JFTE9DQVRJTkcrJFNUQUNLfQotCi0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY5MjgzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjsgfQotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKLSAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKLSAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQotICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCi0gICAgICAgaXMgaW4uICAqLwotCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCi0gICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgotICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQotICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLwotCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19IgotCi1EVE9SPSIgIC5kdG9ycwkke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47IH0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fSIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLU1FTU9SWQotewotICB0ZXh0ICR7VEVYVF9ERUZfU0VDVElPTn0gOiBPUklHSU4gPSAke1RFWFRfU1RBUlRfQUREUn0sIExFTkdUSCA9ICR7VEVYVF9TSVpFfQotICBkYXRhICR7REFUQV9ERUZfU0VDVElPTn0gOiBPUklHSU4gPSAke0RBVEFfU1RBUlRfQUREUn0sIExFTkdUSCA9ICR7REFUQV9TSVpFfQotICBlbWVtICR7RU1FTV9ERUZfU0VDVElPTn0gOiBPUklHSU4gPSAke0VNRU1fU1RBUlRfQUREUn0sIExFTkdUSCA9ICR7RU1FTV9TSVpFfQotICBlaXQJCQkgICA6IE9SSUdJTiA9ICR7RUlUX1NUQVJUX0FERFJ9LCAgTEVOR1RIID0gJHtFSVRfU0laRX0KLX0KLQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7VEVYVF9EWU5BTUlDKyR7RFlOQU1JQ319Ci0gIC5oYXNoCQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKSB9Ci0gIC5keW5zeW0JCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKSB9Ci0gIC5keW5zdHIJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKSB9Ci0gIC5nbnUudmVyc2lvbgkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbikgfQotICAuZ251LnZlcnNpb25fZAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KLSAgLmdudS52ZXJzaW9uX3IJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9yKSB9Ci0KLSAgLnJlbGEudGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnRleHQpICooLnJlbGEuZ251LmxpbmtvbmNlLnQqKSB9Ci0gIC5yZWxhLmRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kYXRhKSAqKC5yZWxhLmdudS5saW5rb25jZS5kKikgfQotICAucmVsYS5yb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5yb2RhdGEpICooLnJlbGEuZ251LmxpbmtvbmNlLnIqKSB9Ci0gIC5yZWxhLnN0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc3Rlc3QpIH0KLSAgLnJlbGEuZXRleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ldGVzdCkgfQotICAucmVsYS5zZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhKSB9Ci0gIC5yZWxhLmVkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZWRhdGEpIH0KLSAgLnJlbGEuZWl0X3YJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5laXRfdikgfQotICAucmVsYS5zYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzcykgfQotICAucmVsYS5lYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZWJzcykgfQotICAucmVsYS5zcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc3JvZGF0YSkgfQotICAucmVsYS5lcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZXJvZGF0YSkgfQotICAucmVsYS5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpIH0KLSAgLnJlbGEuY3RvcnMJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5jdG9ycykgfQotICAucmVsYS5kdG9ycwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKSB9Ci0gIC5yZWxhLmluaXQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KSB9Ci0gIC5yZWxhLmZpbmkJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5maW5pKSB9Ci0gIC5yZWxhLmJzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykgfQotICAucmVsYS5wbHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpIH0KLQotICAucmVsLmRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmRhdGEpICooLnJlbC5nbnUubGlua29uY2UuZCopIH0KLSAgLnJlbC5yb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnJvZGF0YSkgKigucmVsLmdudS5saW5rb25jZS5yKikgfQotICAucmVsLnN0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zdGVzdCkgfQotICAucmVsLmV0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ldGVzdCkgfQotICAucmVsLnNkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zZGF0YSkgfQotICAucmVsLmVkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5lZGF0YSkgfQotICAucmVsLnNic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnNic3MpIH0KLSAgLnJlbC5lYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5lYnNzKSB9Ci0gIC5yZWwuZWl0X3YJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVpdF92KSB9Ci0gIC5yZWwuc3JvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc3JvZGF0YSkgfQotICAucmVsLmVyb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVyb2RhdGEpIH0KLSAgLnJlbC5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkgfQotICAucmVsLmN0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykgfQotICAucmVsLmR0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykgfQotICAucmVsLmluaXQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmluaXQpIH0KLSAgLnJlbC5maW5pCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5maW5pKSB9Ci0gIC5yZWwuYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpIH0KLSAgLnJlbC5wbHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnBsdCkgfQotCi0gIC5pbml0CQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbml0KSB9ID0ke05PUC0wfQotICAke0RBVEFfUExULSR7UExUfX0KLQotICAvKiBJbnRlcm5hbCB0ZXh0IHNwYWNlICovCi0gIC5zdGV4dAkke1JFTE9DQVRJTkctMH0gOiB7ICooLnN0ZXh0KSB9CQkke1JFTE9DQVRJTkcrID4gdGV4dH0KLQotICAvKiBJbnRlcm5hbCB0ZXh0IHNwYWNlIG9yIGV4dGVybmFsIG1lbW9yeSAqLwotICAudGV4dCA6Ci0gIHsKLSAgICAqKC50ZXh0KQotICAgICooLmdudS5saW5rb25jZS50KikKLSAgICAqKC5pbml0KQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiAke1RFWFRfTUVNT1JZfX0KLQotICAvKiBJbnRlcm5hbCBkYXRhIHNwYWNlICovCi0gIC5zcm9kYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguc3JvZGF0YSkgfQkke1JFTE9DQVRJTkcrID4gZGF0YX0KLSAgLnNkYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0JCSR7UkVMT0NBVElORysgPiBkYXRhfQotCi0gIC8qIEludGVybmFsIGRhdGEgc3BhY2Ugb3IgZXh0ZXJuYWwgbWVtb3J5ICovCi0gIC5yb2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpIH0JJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fQotCi0gIC8qIEMrKyBleGNlcHRpb24gc3VwcG9ydC4gICovCi0gIC5laF9mcmFtZQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmVoX2ZyYW1lKSB9CSR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KLSAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19Ci0KLSAgLmRhdGEJCSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAvKiBFeHRlcm5hbCBtZW1vcnkgKi8KLSAgLmV0ZXh0CSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZXRleHRfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5ldGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZXRleHRfZW5kID0gLikgOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IGVtZW19Ci0KLSAgLmVyb2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5lcm9kYXRhKSB9CSR7UkVMT0NBVElORysgPiBlbWVtfQotICAuZWRhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5lZGF0YSkgfQkJJHtSRUxPQ0FUSU5HKyA+IGVtZW19Ci0KLSAgLnNic3MJCSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fc2Jzc19zdGFydCA9IC4pIDsgfQotICAgICooLnNic3MpCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX3Nic3NfZW5kID0gLikgOyAgfQotICB9ICR7UkVMT0NBVElORysgPiBkYXRhfQotCi0gIC5lYnNzCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Vic3Nfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5lYnNzKQotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19lYnNzX2VuZCA9IC4pIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZGF0YX0KLQotICAuYnNzCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Jzc19zdGFydCA9IC4pIDsgfQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fYnNzX2VuZCA9IC4pIDsgfQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAuZWl0X3YJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19laXRfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5laXRfdikKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZWl0X2VuZCA9IC4pIDsgfQotICB9ICR7UkVMT0NBVElORysgPiBlaXR9Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIJCSAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyCSAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wJIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyCSAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXgJIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotCi0gIC5jb21tZW50CSAwIDogeyAqKC5jb21tZW50KSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnCSAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZQkJIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIFBST1ZJREUgKF9fc3RhY2sgPSAke1NUQUNLX1NUQVJUX0FERFJ9KTsKLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGZpMzcwLnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmaTM3MC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmMGU4OC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lbGZpMzcwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLSMKLSMgVGhpcyBpcyBqdXN0IGEgcmF3IGNvcHkgb2YgZWxmcHBjLnNjIGFuZCBoYXMgbm90IGJlZW4gb3RoZXJ3aXNlIG1vZGlmaWVkCi0jCi0jIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgotIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQotIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAucm9kYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCi0jCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLmRhdGEgLmJzcyAuY3RvcnMgLnNkYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQotIwlPVEhFUl9TRUNUSU9OUyAtIGF0IHRoZSBlbmQKLSMJRVhFQ1VUQUJMRV9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IG11c3QgYmUgZGVmaW5lZCBmb3IgYW4KLSMJCWV4ZWN1dGFibGUgKGUuZy4sIF9EWU5BTUlDX0xJTkspCi0jCVRFWFRfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLnRleHQgc2VjdGlvbi4KLSMJREFUQV9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuZGF0YSBzZWN0aW9uLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCi0jIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKLSMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgotIwotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1TQlNTMj0iLnNic3MyICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzczIpIH0iCi1TREFUQTI9Ii5zZGF0YTIgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YTIpIH0iCi1JTlRFUlA9Ii5pbnRlcnAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIH0iCi1QTFQ9Ii5wbHQgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpIH0iCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotRU5UUlkoJHtFTlRSWX0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1JFTE9DQVRJTkcrLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICR7U1RBQ0taRVJPKyR7U1RBQ0taRVJPfX0gJHtTSExJQl9QQVRIKyR7U0hMSUJfUEFUSH19ICAqL30KLSR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ci0ke1JFTE9DQVRJTkctIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcwotICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZwotICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAotICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovfQotCi0ke1JFTE9DQVRJTkcrUFJPVklERSAoX19zdGFjayA9IDApO30KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfSArIFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUItJHtJTlRFUlB9fQotICAuaGFzaAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKQkJfQotICAuZ251LnZlcnNpb24gJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbikgICAgICB9Ci0gIC5nbnUudmVyc2lvbl9kICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fZCkgIH0KLSAgLmdudS52ZXJzaW9uX3IgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9yKSAgfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7ICooLnJlbGEudGV4dCkgKigucmVsYS5nbnUubGlua29uY2UudCopIH0KLSAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgeyAqKC5yZWxhLmRhdGEpICooLnJlbGEuZ251LmxpbmtvbmNlLmQqKSB9Ci0gIC5yZWxhLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOgotICAgIHsgKigucmVsYS5yb2RhdGEpICooLnJlbGEuZ251LmxpbmtvbmNlLnIqKSB9Ci0gIC5yZWxhLmdvdAkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWxhLmdvdDEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdDEpCX0KLSAgLnJlbGEuZ290Mgkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290MikJfQotICAucmVsYS5jdG9ycwkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbGEuZHRvcnMJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWxhLmluaXQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbGEuZmluaQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsYS5ic3MJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsYS5wbHQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJfQotICAucmVsYS5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2RhdGEpCX0KLSAgLnJlbGEuc2Jzcwkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzcykJfQotICAucmVsYS5zZGF0YTIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhMikJfQotICAucmVsYS5zYnNzMgkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzczIpCX0KLSAgLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfU1lNQk9MU319Ci0gICAgKigudGV4dCkKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gIH0gPSR7Tk9QLTB9Ci0gIC5pbml0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmluaXQpCQl9ID0ke05PUC0wfQotICAuZmluaQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5maW5pKQkJfSA9JHtOT1AtMH0KLSAgLnJvZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YSkgKiguZ251LmxpbmtvbmNlLnIqKSB9Ci0gIC5yb2RhdGExCSR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLSAgJHtDUkVBVEVfU0hMSUItJHtTREFUQTJ9fQotICAke0NSRUFURV9TSExJQi0ke1NCU1MyfX0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczoKLSAgICAgICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLUFMSUdOKCR7TUFYUEFHRVNJWkV9KSArIChBTElHTig4KSAmICgke01BWFBBR0VTSVpFfSAtIDEpKX07fQotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYQotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZQotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGUKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS4KLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZwotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZQotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGUKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdAotICAgICBiZSByZWZlcmVuY2VkKS4gICovCi0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItIEFMSUdOKDgpICsgJHtNQVhQQUdFU0laRX19O30KLQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319Ci0gICAgKiguZGF0YSkKLSAgICAqKC5nbnUubGlua29uY2UuZCopCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gIC5kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLmRhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0KLSAgLmdvdDEJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290MSkgfQotICAuZHluYW1pYwkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0KLQotICAvKiBQdXQgLmN0b3JzIGFuZCAuZHRvcnMgbmV4dCB0byB0aGUgLmdvdDIgc2VjdGlvbiwgc28gdGhhdCB0aGUgcG9pbnRlcnMKLSAgICAgZ2V0IHJlbG9jYXRlZCB3aXRoIC1tcmVsb2NhdGFibGUuIEFsc28gcHV0IGluIHRoZSAuZml4dXAgcG9pbnRlcnMuCi0gICAgIFRoZSBjdXJyZW50IGNvbXBpbGVyIG5vIGxvbmdlciBuZWVkcyB0aGlzLCBidXQga2VlcCBpdCBhcm91bmQgZm9yIDIuNy4yICAqLwotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UMl9TVEFSVF8gPSAuKTt9Ci0gIC5nb3QyCQkke1JFTE9DQVRJTkctMH0gOiAgeyAqKC5nb3QyKSB9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fQ1RPUl9MSVNUX18gPSAuKTt9Ci0gIC5jdG9ycwkke1JFTE9DQVRJTkctMH0gOiB7ICooLmN0b3JzKSB9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0NUT1JfRU5EX18gPSAuKTt9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRFRPUl9MSVNUX18gPSAuKTt9Ci0gIC5kdG9ycwkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR0b3JzKSB9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0RUT1JfRU5EX18gPSAuKTt9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9GSVhVUF9TVEFSVF8gPSAuKTt9Ci0gIC5maXh1cAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmZpeHVwKSB9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfRklYVVBfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1QyX0VORF8gPSAuKTt9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1RfU1RBUlRfID0gLik7fQotICAuZ290CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdCkgfQotICAuZ290LnBsdAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdC5wbHQpIH0KLSAgJHtDUkVBVEVfU0hMSUIrJHtTREFUQTJ9fQotICAke0NSRUFURV9TSExJQiske1NCU1MyfX0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1RfRU5EXyA9IC4pO30KLQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19zYnNzX3N0YXJ0ID0gLik7fQotICAgICooLnNic3MpCi0gICAgKiguc2NvbW1vbikKLSAgICAqKC5keW5zYnNzKQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3Nic3NfZW5kID0gLik7fQotICB9Ci0gICR7UExUfQotICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfU1lNQk9MU319Ci0gICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ic3Nfc3RhcnQgPSAuKTt9Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4KLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KLSAgJHtPVEhFUl9TRUNUSU9OU30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZWxmcHBjLnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmcHBjLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGFiOGY4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZnBwYy5zYworKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0jCi0jIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgotIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQotIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAucm9kYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCi0jCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLmRhdGEgLmJzcyAuY3RvcnMgLnNkYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQotIwlPVEhFUl9TRUNUSU9OUyAtIGF0IHRoZSBlbmQKLSMJRVhFQ1VUQUJMRV9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IG11c3QgYmUgZGVmaW5lZCBmb3IgYW4KLSMJCWV4ZWN1dGFibGUgKGUuZy4sIF9EWU5BTUlDX0xJTkspCi0jCVRFWFRfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLnRleHQgc2VjdGlvbi4KLSMJREFUQV9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuZGF0YSBzZWN0aW9uLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCi0jIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKLSMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgotIwotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1TQlNTMj0iLnNic3MyICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzczIpIH0iCi1TREFUQTI9Ii5zZGF0YTIgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YTIpIH0iCi1JTlRFUlA9Ii5pbnRlcnAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIH0iCi1QTFQ9Ii5wbHQgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpIH0iCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9TVEFSVH19Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgotICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcwotICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKLSAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCi0gICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KLSAgICAgICBpcyBpbi4gICovCi0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KLSAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCi0gICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCi0gICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCi0KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfRU5EfX0KLSAgfSIKLQotRFRPUj0iIC5kdG9ycyAgICAgICAke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfU1RBUlR9fQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX0VORH19Ci0gIH0iCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi1FTlRSWSgke0VOVFJZfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci0KLSR7UkVMT0NBVElORytQUk9WSURFIChfX3N0YWNrID0gMCk7fQotJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX3N0YWNrID0gMCk7fQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9ICsgU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19Ci0gIC5oYXNoCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0JJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5nbnUudmVyc2lvbiAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKSAgICAgIH0KLSAgLmdudS52ZXJzaW9uX2QgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9kKSAgfQotICAuZ251LnZlcnNpb25fciAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpICB9Ci0gIC5yZWxhLnRleHQgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEudGV4dCkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnRleHQuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UudCopfQotICAgIH0KLSAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS5kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5kKil9Ci0gICAgfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnJvZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnJvZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAucmVsYS5nb3QJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsYS5nb3QxCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QxKQl9Ci0gIC5yZWxhLmdvdDIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdDIpCX0KLSAgLnJlbGEuY3RvcnMJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsYS5pbml0CSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KQl9Ci0gIC5yZWxhLmZpbmkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KLSAgLnJlbGEuYnNzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbGEucGx0CSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpCX0KLSAgLnJlbGEuc2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhKQl9Ci0gIC5yZWxhLnNic3MJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MpCX0KLSAgLnJlbGEuc2RhdGEyCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zZGF0YTIpCX0KLSAgLnJlbGEuc2JzczIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MyKQl9Ci0gIC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9Ci0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS50Kil9Ci0gIH0gPSR7Tk9QLTB9Ci0gIC5pbml0CQkke1JFTE9DQVRJTkctMH0gOiB7IEtFRVAgKCooLmluaXQpKQl9ID0ke05PUC0wfQotICAuZmluaQkJJHtSRUxPQ0FUSU5HLTB9IDogeyBLRUVQICgqKC5maW5pKSkJfSA9JHtOT1AtMH0KLSAgLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrKigucm9kYXRhLiopfQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuciopfQotICB9Ci0gIC5yb2RhdGExCSR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZXRleHQgPSAuKTt9Ci0gICR7Q1JFQVRFX1NITElCLSR7U0RBVEEyfX0KLSAgJHtDUkVBVEVfU0hMSUItJHtTQlNTMn19Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KLQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bwotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGQKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6Ci0gICAgICAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoQUxJR04oOCkgJiAoJHtNQVhQQUdFU0laRX0gLSAxKSl9O30KLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGEKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGUKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZQotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmcKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmUKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3QKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqLwotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLSBBTElHTig4KSArICR7TUFYUEFHRVNJWkV9fTt9Ci0KLSAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGEuKil9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5kKil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gIC5kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLmRhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0KLSAgLmdvdDEJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290MSkgfQotICAuZHluYW1pYwkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0KLQotICAvKiBQdXQgLmN0b3JzIGFuZCAuZHRvcnMgbmV4dCB0byB0aGUgLmdvdDIgc2VjdGlvbiwgc28gdGhhdCB0aGUgcG9pbnRlcnMKLSAgICAgZ2V0IHJlbG9jYXRlZCB3aXRoIC1tcmVsb2NhdGFibGUuIEFsc28gcHV0IGluIHRoZSAuZml4dXAgcG9pbnRlcnMuCi0gICAgIFRoZSBjdXJyZW50IGNvbXBpbGVyIG5vIGxvbmdlciBuZWVkcyB0aGlzLCBidXQga2VlcCBpdCBhcm91bmQgZm9yIDIuNy4yICAqLwotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UMl9TVEFSVF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVDJfU1RBUlRfID0gLik7fQotICAuZ290MgkJJHtSRUxPQ0FUSU5HLTB9IDogIHsgKiguZ290MikgfQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0NUT1JfTElTVF9fID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fQ1RPUl9MSVNUX18gPSAuKTt9Ci0gICAgICAgICAgICAgICAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0NUT1JfRU5EX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19DVE9SX0VORF9fID0gLik7fQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0RUT1JfTElTVF9fID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fRFRPUl9MSVNUX18gPSAuKTt9Ci0gICAgICAgICAgICAgICAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0RUT1JfRU5EX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19EVE9SX0VORF9fID0gLik7fQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfRklYVVBfU1RBUlRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19GSVhVUF9TVEFSVF8gPSAuKTt9Ci0gIC5maXh1cAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmZpeHVwKSB9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfRklYVVBfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRklYVVBfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1QyX0VORF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVDJfRU5EXyA9IC4pO30KLQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVF9TVEFSVF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVF9TVEFSVF8gPSAuKTt9Ci0gIC5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290KSB9Ci0gIC5nb3QucGx0CSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290LnBsdCkgfQotICAke0NSRUFURV9TSExJQiske1NEQVRBMn19Ci0gICR7Q1JFQVRFX1NITElCKyR7U0JTUzJ9fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVF9FTkRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19HT1RfRU5EXyA9IC4pO30KLQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChfX2VkYXRhID0gLik7fQotICAuc2JzcyAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc2Jzc19zdGFydCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc2Jzc19zdGFydCA9IC4pO30KLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gICAgKiguZHluc2JzcykKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19zYnNzX2VuZCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc2Jzc19lbmQgPSAuKTt9Ci0gIH0KLSAgJHtQTFR9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgICR7UkVMT0NBVElORytQUk9WSURFIChfX2Jzc19zdGFydCA9IC4pO30KLSAgICR7UkVMT0NBVElORytQUk9WSURFIChfX19ic3Nfc3RhcnQgPSAuKTt9Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZW5kID0gLik7fQotCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbgotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLwotICAke09USEVSX1NFQ1RJT05TfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lcG9jcGUuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lcG9jcGUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYTY2OTYuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZXBvY3BlLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgUEUuCi0KLWlmIHRlc3QgLXogIiR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9IjsgdGhlbgotICBSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1maQotCi0jIFdlIGNhbid0IGVhc2lseSBhbmQgcG9ydGFibHkgZ2V0IGFuIHVucXVvdGVkICQgaW4gYSBzaGVsbAotIyBzdWJzdGl0dXRpb24sIHNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KLSMgU29ydGluZyBvZiB0aGUgLmZvbyQqIHNlY3Rpb25zIGlzIHJlcXVpcmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mCi0jIGdyb3VwZWQgc2VjdGlvbnMgaW4gUEUuCi0jIFNvcnRpbmcgb2YgdGhlIGZpbGUgbmFtZXMgaW4gUl9JREFUQSBpcyByZXF1aXJlZCBieSB0aGUKLSMgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkbGx0b29sICh0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQgdG8KLSMgdXNlIGdyb3VwZWQgc2VjdGlvbnMgaW5zdGVhZCkuCi1pZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgotICBSX1RFWFQ9JyooU09SVCgudGV4dCQqKSknCi0gIFJfREFUQT0nKihTT1JUKC5kYXRhJCopKScKLSAgUl9SREFUQT0nKihTT1JUKC5yZGF0YSQqKSknCi0gIFJfSURBVEE9JwotICAgIFNPUlQoKikoLmlkYXRhJDIpCi0gICAgU09SVCgqKSguaWRhdGEkMykKLSAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCi0gICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOwotICAgIFNPUlQoKikoLmlkYXRhJDQpCi0gICAgU09SVCgqKSguaWRhdGEkNSkKLSAgICBTT1JUKCopKC5pZGF0YSQ2KQotICAgIFNPUlQoKikoLmlkYXRhJDcpJwotICBSX0NSVD0nKihTT1JUKC5DUlQkKikpJwotICBSX1JTUkM9JyooU09SVCgucnNyYyQqKSknCi1lbHNlCi0gIFJfVEVYVD0KLSAgUl9EQVRBPQotICBSX1JEQVRBPQotICBSX0lEQVRBPQotICBSX0NSVD0KLSAgUl9SU1JDPQotZmkKLQotY2F0IDw8RU9GCi0ke1JFTE9DQVRJTkcrT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KX0KLSR7UkVMT0NBVElORy1PVVRQVVRfRk9STUFUKCR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9KX0KLQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKF9tYWluQ1JUU3RhcnR1cCkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSX1RFWFR9Ci0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKLQotICAgIC8qIEZvciBFUE9DIHRoZSByZWFkIG9ubHkgZGF0YSBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIC50ZXh0Ci0gICAgc2VjdGlvbiAqLwotICAgICooLnJkYXRhKQotICAgICR7Ul9SREFUQX0KLSAgICAqKC5laF9mcmFtZSkKLSAgfQotCi0gIC8qIFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSBzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhCi0gICAgIG9uIGZvcmsuICBUaGlzIHVzZWQgdG8gYmUgbmFtZWQgIi5kYXRhJG5vY29weSIuICBUaGUgbGlua2VyIHVzZWQKLSAgICAgdG8gaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKLSAgICAgYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBJbnN0ZWFkLCB3ZSBuYW1lIHRoZSBzZWN0aW9uCi0gICAgICIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIgX19kYXRhX2VuZF9fLiAqLwotCi0gIC5kYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydF9fID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTIpCi0gICAgJHtSX0RBVEF9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9lbmRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YV9jeWd3aW5fbm9jb3B5KX0KLSAgfQotCi0gIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAuZWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLmVkYXRhKQotICB9Ci0KLSAgL0RJU0NBUkQvIDoKLSAgewotICAgICooLmRlYnVnXCRTKQotICAgICooLmRlYnVnXCRUKQotICAgICooLmRlYnVnXCRGKQotICAgICooLmRyZWN0dmUpCi0gIH0KLQotICAuaWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIFRoaXMgY2Fubm90IGN1cnJlbnRseSBiZSBoYW5kbGVkIHdpdGggZ3JvdXBlZCBzZWN0aW9ucy4KLQlTZWUgcGUuZW06c29ydF9zZWN0aW9ucy4gICovCi0gICAgJHtSX0lEQVRBfQotICB9Ci0gIAotICAuQ1JUICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JfQ1JUfQotICB9Ci0KLSAgLmVuZGp1bmsgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIGVuZCBpcyBkZXByZWNhdGVkLCBkb24ndCB1c2UgaXQgKi8KLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQotICB9Ci0KLSAgLnJlbG9jICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yZWxvYykKLSAgfQotCi0gIC5yc3JjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yc3JjKQotICAgICR7Ul9SU1JDfQotICB9Ci0KLSAgLnN0YWIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjg3NmUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDgzMDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKCJfc3RhcnQiKQotCi1NRU1PUlkKLXsKLQkvKiAweGM0IGlzIGEgbWFnaWMgZW50cnkuICBXZSBzaG91bGQgaGF2ZSB0aGUgbGlua2VyIGp1c3QKLQkgICBza2lwIG92ZXIgaXQgb25lIGRheS4uLiAqLwotCXZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAotCW1hZ2ljdmVjdG9ycyA6IG8gPSAweGM0LCBsID0gMHgzYwotCXJhbSAgICA6IG8gPSAweDAxMDAsIGwgPSAweGZkZmMKLQkvKiBUaGUgc3RhY2sgc3RhcnRzIGF0IHRoZSB0b3Agb2YgbWFpbiByYW0uICAqLwotCXRvcHJhbSA6IG8gPSAweGZlZmMsIGwgPSAweDQKLQkvKiBBdCB0aGUgdmVyeSB0byBvZiB0aGUgYWRkcmVzcyBzcGFjZSBpcyB0aGUgOC1iaXQgYXJlYS4gICovCi0JZWlnaHQgOiBvID0gMHhmZjAwLCBsID0gMHgxMDAKLX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnZlY3RvcnMgOiB7Ci0JLyogVXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gcGxhY2UgYSBzcGVjaWZpYyBmdW5jdGlvbidzIGFkZHJlc3MKLQkgICBpbnRvIHRoZSB2ZWN0b3IgdGFibGUuIAotCi0JU0hPUlQoQUJTT0xVVEUoX2Zvb2JhcikpICovCi0KLQkqKC52ZWN0b3JzKQotICAgICAgICB9ICR7UkVMT0NBVElORysgPiB2ZWN0b3JzfQotCi0udGV4dCA6CXsgCQkJCQkKLQkqKC5yb2RhdGEpIAkJCQkKLQkqKC50ZXh0KSAJCQkJCi0JKiguc3RyaW5ncykKLSAgIAkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLnRvcnMgOiB7Ci0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5kYXRhIDogewotCSooLmRhdGEpCi0JKigudGlueSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyA6IHsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDogewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0uZWlnaHQgOiB7Ci0JKiguZWlnaHQpCi0JfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Ci0uc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYiBdCi0JfQotLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWJzdHIgXQotCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBoLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDBoLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWNmZDg2Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwaC5zYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSChoODMwMGgpCi1FTlRSWSgiX3N0YXJ0IikKLQotLyogVGhlIG1lbW9yeSBzaXplIGlzIDI1NktCIHRvIGNvaW5jaWRlIHdpdGggdGhlIHNpbXVsYXRvci4KLSAgIERvbid0IGNoYW5nZSBlaXRoZXIgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgb3RoZXIuICAqLwotCi1NRU1PUlkKLXsKLSAgICAgICAgLyogMHhjNCBpcyBhIG1hZ2ljIGVudHJ5LiAgV2Ugc2hvdWxkIGhhdmUgdGhlIGxpbmtlciBqdXN0Ci0gICAgICAgICAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCi0gICAgICAgIHZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAotICAgICAgICBtYWdpY3ZlY3RvcnMgOiBvID0gMHhjNCwgbCA9IDB4M2MKLQkvKiBXZSBzdGlsbCBvbmx5IHVzZSAyNTZrIGFzIHRoZSBtYWluIHJhbSBzaXplLiAgKi8KLQlyYW0gICAgOiBvID0gMHgwMTAwLCBsID0gMHgzZmVmYwotCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCi0JdG9wcmFtIDogbyA9IDB4M2ZmZmMsIGwgPSAweDQKLQkvKiBUaGlzIGhvbGRzIHZhcmlhYmxlcyBpbiB0aGUgInRpbnkiIHNlY3Rpb25zLiAgKi8KLQl0aW55ICAgOiBvID0gMHhmZjgwMDAsIGwgPSAweDdmMDAKLQkvKiBBdCB0aGUgdmVyeSB0b3Agb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIDgtYml0IGFyZWEuICAqLwotCWVpZ2h0ICA6IG8gPSAweGZmZmYwMCwgbCA9IDB4MTAwCi19Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS52ZWN0b3JzIDogewotCS8qIFVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHBsYWNlIGEgc3BlY2lmaWMgZnVuY3Rpb24ncyBhZGRyZXNzCi0JICAgaW50byB0aGUgdmVjdG9yIHRhYmxlLgotCi0JTE9ORyhBQlNPTFVURShfZm9vYmFyKSkgKi8KLQotCSooLnZlY3RvcnMpCi0JfSAke1JFTE9DQVRJTkcrID4gdmVjdG9yc30KLS50ZXh0IDoJeyAJCQkJCQotCSooLnJvZGF0YSkgCQkJCQotCSooLnRleHQpIAkJCQkKLQkqKC5zdHJpbmdzKQotICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0udG9ycyA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmRhdGEgOiB7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyA6IHsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDogewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0udGlueSA6IHsKLQkqKC50aW55KQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRpbnl9Ci0uZWlnaHQgOiB7Ci0JKiguZWlnaHQpCi0JfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Ci0uc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYiBdCi0JfQotLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWJzdHIgXQotCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBzLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDBzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQ3NGZjLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSChoODMwMHMpCi1FTlRSWSgiX3N0YXJ0IikKLQotLyogVGhlIG1lbW9yeSBzaXplIGlzIDI1NktCIHRvIGNvaW5jaWRlIHdpdGggdGhlIHNpbXVsYXRvci4KLSAgIERvbid0IGNoYW5nZSBlaXRoZXIgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgb3RoZXIuICAqLwotCi1NRU1PUlkKLXsKLSAgICAgICAgLyogMHhjNCBpcyBhIG1hZ2ljIGVudHJ5LiAgV2Ugc2hvdWxkIGhhdmUgdGhlIGxpbmtlciBqdXN0Ci0gICAgICAgICAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCi0gICAgICAgIHZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAotICAgICAgICBtYWdpY3ZlY3RvcnMgOiBvID0gMHhjNCwgbCA9IDB4M2MKLQkvKiBXZSBzdGlsbCBvbmx5IHVzZSAyNTZrIGFzIHRoZSBtYWluIHJhbSBzaXplLiAgKi8KLQlyYW0gICAgOiBvID0gMHgwMTAwLCBsID0gMHgzZmVmYwotCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCi0JdG9wcmFtIDogbyA9IDB4M2ZmZmMsIGwgPSAweDQKLQkvKiBUaGlzIGhvbGRzIHZhcmlhYmxlcyBpbiB0aGUgInRpbnkiIHNlY3Rpb25zLiAgKi8KLQl0aW55ICAgOiBvID0gMHhmZjgwMDAsIGwgPSAweDdmMDAKLQkvKiBBdCB0aGUgdmVyeSB0b3Agb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIDgtYml0IGFyZWEuICAqLwotCWVpZ2h0ICA6IG8gPSAweGZmZmYwMCwgbCA9IDB4MTAwCi19Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS52ZWN0b3JzIDogewotCS8qIFVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHBsYWNlIGEgc3BlY2lmaWMgZnVuY3Rpb24ncyBhZGRyZXNzCi0JICAgaW50byB0aGUgdmVjdG9yIHRhYmxlLgotCi0JTE9ORyhBQlNPTFVURShfZm9vYmFyKSkgKi8KLQotCSooLnZlY3RvcnMpCi0JfSAke1JFTE9DQVRJTkcrID4gdmVjdG9yc30KLS50ZXh0IDoJeyAJCQkJCQotCSooLnJvZGF0YSkgCQkJCQotCSooLnRleHQpIAkJCQkKLQkqKC5zdHJpbmdzKQotICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0udG9ycyA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmRhdGEgOiB7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyA6IHsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDogewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19Ci0udGlueSA6IHsKLQkqKC50aW55KQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRpbnl9Ci0uZWlnaHQgOiB7Ci0JKiguZWlnaHQpCi0JfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Ci0uc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYiBdCi0JfQotLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogewotCVsgLnN0YWJzdHIgXQotCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhMzllZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb2RlIGFuZCBkYXRhIDY0ayB0b3RhbCAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke1JFTE9DQVRJTkcrIDB4MDAwMCB9IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0KLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0KLQotCi0uZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0ucmRhdGEgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkgICooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAKLQotLmJzcyAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfQotCi0uc3RhY2sgICR7UkVMT0NBVElORysgMHhmZmYwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9IAotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGIuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMGIuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNWZhMmMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBiLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvZGUgYW5kIGRhdGEsIGJvdGggbGFyZ2VyIHRoYW4gNjRrICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwMH0gOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQotICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfQotCi0KLS5kYXRhICAke1JFTE9DQVRJTkcrIDB4MjAwMDB9IDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAKLQotLnJkYXRhICAke1JFTE9DQVRJTkcrIDB4MzAwMDB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkgICooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAKLQotLmJzcyAgJHtSRUxPQ0FUSU5HKyAweDQwMDAwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9Ci0KLS5zdGFjayAgJHtSRUxPQ0FUSU5HKyAweDUwMDAwfSA6Ci0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9IAotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMGMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODgwZTMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBjLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvbXBhY3QgbW9kZWwgLSBjb2RlIDwgNjRrLCBkYXRhID4gNjRrICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0IDB4MTAwMDAgOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQkgICooLnN0cmluZ3MpCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0KLQotLmRhdGEgMHgyMDAwMCA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotLnJkYXRhIDB4MzAwMDAgIDogewotCSooLnJkYXRhKTsgCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAgJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotLmJzcyAgMHg0MDAwMCA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9ICR7UkVMT0NBVElORysgPnJhbX0KLS5zdGFjayAweDVmZmYwIDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBhNGE3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwbS5zYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb2RlIGFuZCBkYXRhLCBib3RoIGxhcmdlciB0aGFuIDY0ayAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDB9IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9Ci0KLQotLmRhdGEgICR7UkVMT0NBVElORysgMHgyMDAwMH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0ucmRhdGEgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkgICooLnN0cmluZ3MpCi0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotCX0gCi0KLS5ic3MgICR7UkVMT0NBVElORysgLiB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0KLQotLnN0YWNrICAke1JFTE9DQVRJTkcrIDB4MmZmZjB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwcy5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2MTVkOC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMHMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotLyogQ29kZSBhbmQgZGF0YSwgYm90aCA2NGsgKi8KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDAwIH0gOgotCXsgCQkJCQkKLQkqKC50ZXh0KSAJCQkJCi0gICAJJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0KLQotLnJkYXRhICAke1JFTE9DQVRJTkcrIDB4MjAwMDAgfSA6Ci0JewotCSooLnJkYXRhKTsgCi0JKiguc3RyaW5ncykKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfQotCi0uZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0uYnNzICAke1JFTE9DQVRJTkcrIC59IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0KLQotLnN0YWNrICAke1JFTE9DQVRJTkcrIDB4MmZmZjB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFjZTA4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1EQVRBX0FERFI9MHg0MDAwMDAwMAotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKCJcJFNUQVJUXCQiKQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDB4MTAwMCAke1JFTE9DQVRJTkcrKyR7VEVYVF9TVEFSVF9BRERSfX06Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX190ZXh0X3N0YXJ0ID0gLn07Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKiguUEFSSVNDLnN0dWJzKQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OwotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFJ9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAuID0gLiArIDB4MTAwMCB9OwotICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnQgPSAufTsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrZWRhdGEgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhID0gLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn0gKyBTSVpFT0YoLmRhdGEpO30KLSAgLmJzcyA6Ci0gIHsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK2VuZCA9IC4gfTsKLSAgICR7UkVMT0NBVElORytfZW5kID0gLiB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZmZkZTEuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBQRS4KLQotaWYgdGVzdCAteiAiJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0iOyB0aGVuCi0gIFJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWZpCi0KLSMgV2UgY2FuJ3QgZWFzaWx5IGFuZCBwb3J0YWJseSBnZXQgYW4gdW5xdW90ZWQgJCBpbiBhIHNoZWxsCi0jIHN1YnN0aXR1dGlvbiwgc28gd2UgZG8gdGhpcyBpbnN0ZWFkLgotaWYgdGVzdCAiJHtSRUxPQ0FUSU5HfSI7IHRoZW4KLSAgUl9URVhUPScqKC50ZXh0JCopJwotICBSX0RBVEE9JyooLmRhdGEkKiknCi0gIFJfUkRBVEE9JyooLnJkYXRhJCopJwotICBSX0lEQVRBPScKLSAgICAqKC5pZGF0YSQyKQotICAgICooLmlkYXRhJDMpCi0gICAgLyogVGhlc2UgemVyb2VzIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW1wb3J0IGxpc3QuICAqLwotICAgIExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsKLSAgICAqKC5pZGF0YSQ0KQotICAgICooLmlkYXRhJDUpCi0gICAgKiguaWRhdGEkNikKLSAgICAqKC5pZGF0YSQ3KScKLSAgUl9DUlQ9JyooLkNSVCQqKScKLSAgUl9SU1JDPScqKC5yc3JjJCopJwotICBSX0VYQz0nKiguZXhjJCopJwotZWxzZQotICBSX1RFWFQ9Ci0gIFJfREFUQT0KLSAgUl9SREFUQT0KLSAgUl9JREFUQT0KLSAgUl9DUlQ9Ci0gIFJfUlNSQz0KLSAgUl9FWEM9Ci1maQotCi1jYXQgPDxFT0YKLSR7UkVMT0NBVElORytPVVRQVVRfRk9STUFUKCR7T1VUUFVUX0ZPUk1BVH0pfQotJHtSRUxPQ0FUSU5HLU9VVFBVVF9GT1JNQVQoJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0pfQotCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoX19zdGFydCkKLSR7UkVMT0NBVElORytoZWFkZXIgPSAuO30KLSR7UkVMT0NBVElORytfX2ZsdHVzZWQgPSAuOyAvKiBzZXQgdXAgZmxvYXRpbmcgcHQgZm9yIE1TIC5vYmpcJ3MgKi99Ci0ke1JFTE9DQVRJTkcrX19sZHVzZWQgPSAuO30KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgX19pbWFnZV9iYXNlX18gKyBfX3NlY3Rpb25fYWxpZ25tZW50X18gfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX3RleHRfc3RhcnRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSX1RFWFR9Ci0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX3RleHRfZW5kX18gPSAuO30KLSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotICB9Ci0KLSAgLyogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIHNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEKLSAgICAgb24gZm9yay4gIFRoaXMgdXNlZCB0byBiZSBuYW1lZCAiLmRhdGEkbm9jb3B5Ii4gIFRoZSBsaW5rZXIgdXNlZAotICAgICB0byBpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotICAgICBicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIEluc3RlYWQsIHdlIG5hbWUgdGhlIHNlY3Rpb24KLSAgICAgIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlciBfX2RhdGFfZW5kX18uICovCi0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMikKLSAgICAke1JfREFUQX0KLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5kYXRhX2N5Z3dpbl9ub2NvcHkpfQotICB9Ci0KLSAgLmJzcyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgIC8qIGxpbmsuZXhlIGFwcGFyZW50bHkgcHVsbHMgaW4gLm9iaidzIGJlY2F1c2Ugb2YgVU5ERUYgY29tbW9uCi0Jc3ltYm9scywgd2hpY2ggaXMgbm90IHRoZSBjb2ZmIHdheSwgYnV0IHRoYXQncyBNUyBmb3IgeW91LiAqLwotICAgICooLkNSVFwkWENBKQotICAgICooLkNSVFwkWENaKQotICAgICooLkNSVFwkWElBKQotICAgICooLkNSVFwkWElaKQotICAgICR7UkVMT0NBVElORytfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gIC5yZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKigucmRhdGEpCi0gICAgJHtSX1JEQVRBfQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0KLSAgLmVkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5lZGF0YSkKLSAgfQotCi0gIC9ESVNDQVJELyA6Ci0gIHsKLSAgICAqKC5kZWJ1Z1wkUykKLSAgICAqKC5kZWJ1Z1wkVCkKLSAgICAqKC5kZWJ1Z1wkRikKLSAgICAqKC5kcmVjdHZlKQotICAgICooLmRlYnVnKikKLSAgfQotCi0gIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgotCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KLSAgICAke1JfSURBVEF9Ci0gIH0KLSAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgJHtSX0NSVH0KLSAgfQotCi0gIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLSAgfQotCi0gIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucmVsb2MpCi0gIH0KLQotICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucnNyYykKLSAgICAke1JfUlNSQ30KLSAgfQotCi0gIC5leGMgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLmV4YykKLSAgICAke1JfRVhDfQotICB9Ci0KLSAgLnN0YWIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjFiNzkuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIDM4NiBDT0ZGLiAgVGhpcyB3b3JrcyBvbiBTVlIzLjIgYW5kIFNDTyBVbml4IDMuMi4yLgotIyBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAotIyBjb25kaXRpb25hbCBleHBhbnNpb24uCi1JTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKLUZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JwotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KX0KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HLSAke0lOSVR9fQotICAke1JFTE9DQVRJTkctICR7RklOSX19Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0YWZmNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgaTM4NiBnbzMyIChESkdQUCkKLQotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1zdGFydAotRVhFPSR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORystZXhlfX0KLQotIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAotIyBjb25kaXRpb25hbCBleHBhbnNpb24uCi1DVE9SPScuY3RvciA6IHsgKiguY3RvcikgfScKLURUT1I9Jy5kdG9yIDogeyAqKC5kdG9yKSB9JwotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0ke0VYRX0iKQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAke1RBUkdFVF9QQUdFX1NJWkV9K1NJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UudCopfQotICAgICooLmNvbnN0KikKLSAgICAqKC5ybyopCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5yKil9Ci0gICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ICA9ICAuIDsgX2V0ZXh0ID0gLiA7fQotICAgICR7UkVMT0NBVElORysuID0gQUxJR04oJHtTRUdNRU5UX1NJWkV9KTt9Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAke0RBVEFfQUxJR05NRU5UfX0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK2RqZ3BwX2ZpcnN0X2N0b3IgPSAuIDsKLSAgICAqKC5jdG9yKQotICAgIGRqZ3BwX2xhc3RfY3RvciA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrZGpncHBfZmlyc3RfZHRvciA9IC4gOwotICAgICooLmR0b3IpCi0gICAgZGpncHBfbGFzdF9kdG9yID0gLiA7fQotICAgICooLmRhdGEpCi0KLSAgICAke1JFTE9DQVRJTkcrKiguZ2NjX2V4YyopfQotICAgICR7UkVMT0NBVElORytfX19FSF9GUkFNRV9CRUdJTl9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5laF9mcmFtKil9Ci0gICAgJHtSRUxPQ0FUSU5HK19fX0VIX0ZSQU1FX0VORF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORytMT05HKDApO30KLQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuZCopfQotICAgICR7UkVMT0NBVElORytlZGF0YSAgPSAgLiA7IF9lZGF0YSA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKCR7U0VHTUVOVF9TSVpFfSk7fQotICB9Ci0gICR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORy0kQ1RPUn19Ci0gICR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORy0kRFRPUn19Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC4gOyBfZW5kID0gLiA7fQotICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKCR7U0VHTUVOVF9TSVpFfSk7fQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZseW54LnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjcyYTQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzEyZTcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAuO30KLSAgfQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5yb2RhdGEpCi0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC59OwotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IEFMSUdOKDQpIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYyBiL2xkL3NjcmlwdHRlbXBsL2k5NjAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzM1NTUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLWNhdCA8PEVPRgotU0VDVElPTlMKLXsgCi0gICAgLnRleHQgOiAKLSAgICB7IAotCSR7R0xEX1NUWUxFKyBDUkVBVEVfT0JKRUNUX1NZTUJPTFN9Ci0JKigudGV4dCkgCi0JJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAufTsKLQkke0NPTlNUUlVDVElORyske0NPRkZfQ1RPUlN9fQotICAgIH0gIAotICAgIC5kYXRhIDoKLSAgICB7IAotIAkqKC5kYXRhKSAKLQkke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAufTsKLSAgICB9ICAKLSAgICAuYnNzIDoKLSAgICB7IAotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC59OwotCSooLmJzcykJIAotCSooQ09NTU9OKSAKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAufTsKLSAgICB9IAotfSAKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYyBiL2xkL3NjcmlwdHRlbXBsL202OGthdXguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDI4MGUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgQS9VWC4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1JTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKLUZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JwotQ1RPUlM9Jy5jdG9ycyA6IHsgKiguY3RvcnMpIH0nCi1EVE9SUz0nLmR0b3JzIDogeyAqKC5kdG9ycykgfScKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAkVEVYVF9TVEFSVF9BRERSfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTig0KTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLjt9Ci0gIH0gPTB4NEU3MTRFNzEKLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAkREFUQV9BTElHTk1FTlR9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLjt9Ci0gIH0KLSAgLmJzcyA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgfQotICAke1JFTE9DQVRJTkctICR7SU5JVH19Ci0gICR7UkVMT0NBVElORy0gJHtGSU5JfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0NUT1JTfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0RUT1JTfX0KLQotICAuY29tbWVudCAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLmNvbW1lbnQgXSBbIC5pZGVudCBdIH0KLSAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyBbIC5zdGFiIF0gfQotICAuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLnN0YWJzdHIgXSB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNjhjNmYuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci1QUk9WSURFIChfX3N0YWNrID0gMCk7IAotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDAwMDB9IDogewotICAgICooLnRleHQpCi0gICAgJHtDT05TVFJVQ1RJTkcrIC4gPSBBTElHTig0KTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9Ci0gIH0KLSAgLmRhdGEgOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzIDogeyAJCQkJCQotICAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgICR7UkVMT0NBVElORysgZW5kID0gQUxJR04oMHg4KX07Ci0gICAgICR7UkVMT0NBVElORysgX2VuZCA9IEFMSUdOKDB4OCl9OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTY4a2x5bnguc2MgYi9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkMjI0NS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKLSAgICAqKC5kYXRhIC5kYXRhMikKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL204OGtiY3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJiMTRkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL204OGtiY3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCi0jIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KLUlOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JwotRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKF9fc3RhcnQpCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0gIC50ZXh0ICR7UkVMT0NBVElORysgKDB4MjAwMDcgKyBTSVpFT0ZfSEVBREVSUykgJn4gN30gOgotICAgIHsKLSAgICAgICR7UkVMT0NBVElORysgX18udGV4dC5zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0LnN0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0LmVuZCA9IC59OwotICAgICAgKigudGV4dCkgCQkJCQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZGVzY19zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyAqKC50ZGVzYyl9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHRfZW5kID0gLn0JOwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0cC5zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0cC5lbmQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgX18uZmluaV9zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKSB9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmZpbmlfZW5kID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07Ci0gICAgfSAgCQkJCQkKLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyBORVhUICgweDQwMDAwMCkgKyAoKFNJWkVPRigudGV4dCkgKyBBRERSKC50ZXh0KSkgJSAweDIwMDApfSA6Ci0gICAgeyAJCQkJCQotICAgICAgKiguZGF0YSkKLSAgICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC59OwotICAgIH0gIAkJCQkJCi0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgICB7IAkJCi0gICAgICAqKC5ic3MpCQotICAgICAgKihDT01NT04pIAkKLSAgICAgICR7UkVMT0NBVElORysgX2VuZCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IC59OwotICAgIH0KLSAgJHtSRUxPQ0FUSU5HLSAke0lOSVR9fQotICAke1JFTE9DQVRJTkctICR7RklOSX19Ci0gIC5jb21tZW50ICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgICooLmNvbW1lbnQpCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbWNvcmVwZS5zYyBiL2xkL3NjcmlwdHRlbXBsL21jb3JlcGUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOTI4YWEuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbWNvcmVwZS5zYworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIE1Db3JlIFBFLgotCi1pZiB0ZXN0IC16ICIke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSI7IHRoZW4KLSAgUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotZmkKLQotIyBXZSBjYW4ndCBlYXNpbHkgYW5kIHBvcnRhYmx5IGdldCBhbiB1bnF1b3RlZCAkIGluIGEgc2hlbGwKLSMgc3Vic3RpdHV0aW9uLCBzbyB3ZSBkbyB0aGlzIGluc3RlYWQuCi0jIFNvcnRpbmcgb2YgdGhlIC5mb28kKiBzZWN0aW9ucyBpcyByZXF1aXJlZCBieSB0aGUgZGVmaW5pdGlvbiBvZgotIyBncm91cGVkIHNlY3Rpb25zIGluIFBFLgotIyBTb3J0aW5nIG9mIHRoZSBmaWxlIG5hbWVzIGluIFJfSURBVEEgaXMgcmVxdWlyZWQgYnkgdGhlCi0jIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGxsdG9vbCAodGhpcyBjb3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvCi0jIHVzZSBncm91cGVkIHNlY3Rpb25zIGluc3RlYWQpLgotaWYgdGVzdCAiJHtSRUxPQ0FUSU5HfSI7IHRoZW4KLSAgUl9URVhUPScqKFNPUlQoLnRleHQkKikpJwotICBSX0RBVEE9JyooU09SVCguZGF0YSQqKSknCi0gIFJfUkRBVEE9JyooU09SVCgucmRhdGEkKikpJwotICBSX0lEQVRBPScKLSAgICBTT1JUKCopKC5pZGF0YSQyKQotICAgIFNPUlQoKikoLmlkYXRhJDMpCi0gICAgLyogVGhlc2UgemVyb2VzIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW1wb3J0IGxpc3QuICAqLwotICAgIExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsKLSAgICBTT1JUKCopKC5pZGF0YSQ0KQotICAgIFNPUlQoKikoLmlkYXRhJDUpCi0gICAgU09SVCgqKSguaWRhdGEkNikKLSAgICBTT1JUKCopKC5pZGF0YSQ3KScKLSAgUl9DUlQ9JyooU09SVCguQ1JUJCopKScKLSAgUl9SU1JDPScqKFNPUlQoLnJzcmMkKikpJwotZWxzZQotICBSX1RFWFQ9Ci0gIFJfREFUQT0KLSAgUl9SREFUQT0KLSAgUl9JREFUQT0KLSAgUl9DUlQ9Ci0gIFJfUlNSQz0KLWZpCi0KLWlmIHRlc3QgIiRSRUxPQ0FUSU5HIjsgdGhlbgotICAjIENhbid0IHVzZSAke1JFTE9DQVRJTkcrYmxhaCAiYmxhaCIgYmxhaH0gZm9yIHRoaXMsCi0gICMgYmVjYXVzZSBiYXNoIDIueCB3aWxsIGxvc2UgdGhlIGRvdWJsZXF1b3Rlcy4KLSAgY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgIAkgICAgICAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1FT0YKLWZpCi0KLWNhdCA8PEVPRgotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKF9tYWluQ1JUU3RhcnR1cCkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSX1RFWFR9Ci0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKLSAgfQotCi0gIC8qIFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSBzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhCi0gICAgIG9uIGZvcmsuICBUaGlzIHVzZWQgdG8gYmUgbmFtZWQgIi5kYXRhJG5vY29weSIuICBUaGUgbGlua2VyIHVzZWQKLSAgICAgdG8gaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKLSAgICAgYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBJbnN0ZWFkLCB3ZSBuYW1lIHRoZSBzZWN0aW9uCi0gICAgICIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIgX19kYXRhX2VuZF9fLiAqLwotCi0gIC5kYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydF9fID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTIpCi0gICAgJHtSX0RBVEF9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9lbmRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YV9jeWd3aW5fbm9jb3B5KX0KLSAgfQotCi0gIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAucmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLnJkYXRhKQotICAgICR7Ul9SREFUQX0KLSAgICAqKC5laF9mcmFtZSkKLSAgfQotCi0gIC5lZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKiguZWRhdGEpCi0gIH0KLQotICAvRElTQ0FSRC8gOgotICB7Ci0gICAgKiguZGVidWdcJFMpCi0gICAgKiguZGVidWdcJFQpCi0gICAgKiguZGVidWdcJEYpCi0gICAgKiguZHJlY3R2ZSkKLSAgfQotCi0gIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgotCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KLSAgICAke1JfSURBVEF9Ci0gIH0KLSAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgJHtSX0NSVH0KLSAgfQotCi0gIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLSAgfQotCi0gIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucmVsb2MpCi0gIH0KLQotICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucnNyYykKLSAgICAke1JfUlNSQ30KLSAgfQotCi0gIC5zdGFiICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0KLSAgLnN0YWJzdHIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLQotICAuc3RhY2sgMHg4MDAwMCA6Ci0gIHsKLSAgICBfc3RhY2sgPSAuOwotICAgICooLnN0YWNrKQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL21pcHMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9taXBzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjBhZWVkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL21pcHMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIE1JUFMgc3lzdGVtcy4KLSMgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotIyBUaGVzZSB2YXJpYWJsZXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGVtdWxhdGlvbiBmaWxlLiAgVGhlCi0jIGRlZmF1bHRzIGFyZSBhcHByb3ByaWF0ZSBmb3IgYSBERUNzdGF0aW9uIHJ1bm5pbmcgVWx0cml4LgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fX3N0YXJ0Ci0KLWlmIFsgLXogIiRFTUJFRERFRCIgXTsgdGhlbgotICB0ZXN0IC16ICIkVEVYVF9TVEFSVF9BRERSIiAmJiBURVhUX1NUQVJUX0FERFI9IjB4NDAwMDAwICsgU0laRU9GX0hFQURFUlMiCi1lbHNlCi0gIHRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHg0MDAwMDAiCi1maQotaWYgdGVzdCAieCRMRF9GTEFHIiA9ICJ4biIgLW8gIngkTERfRkxBRyIgPSAieE4iOyB0aGVuCi0gIERBVEFfQUREUj0uCi1lbHNlCi0gIHRlc3QgLXogIiREQVRBX0FERFIiICYmIERBVEFfQUREUj0weDEwMDAwMDAwCi1maQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDogewotICAgICR7UkVMT0NBVElORysgX2Z0ZXh0ID0gLiB9OwotICAgICooLmluaXQpCi0gICAgJHtSRUxPQ0FUSU5HKyBlcHJvbCAgPSAgLn07Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7fQotICAgICooLnJlbC5zZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0b3AgPSAuKTt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCAgPSAgLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn07fQotICAucmRhdGEgOiB7Ci0gICAgKigucmRhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfZmRhdGEgPSBBTElHTigxNik7fQotICAuZGF0YSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAke1JFTE9DQVRJTkcrIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDt9Ci0gIC5saXQ4IDogewotICAgICooLmxpdDgpCi0gIH0KLSAgLmxpdDQgOiB7Ci0gICAgKigubGl0NCkKLSAgfQotICAuc2RhdGEgOiB7Ci0gICAgKiguc2RhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfZmJzcyA9IC47fQotICAuc2JzcyA6IHsKLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gIH0KLSAgLmJzcyA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MgYi9sZC9zY3JpcHR0ZW1wbC9taXBzYnNkLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjIyYjMzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytldGV4dCA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzIDoKLSAgewotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrZW5kID0gLiB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL253LnNjIGIvbGQvc2NyaXB0dGVtcGwvbncuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNTUyMmMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbncuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotIwotIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKLSMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKLSMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAotIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLmN0b3JzIC5yb2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKLSMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5zZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKLSMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCi0jCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCi0jCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQotIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS50ZXh0IHNlY3Rpb24uCi0jCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmRhdGEgc2VjdGlvbi4KLSMJT1RIRVJfQlNTX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5ic3Mgc2VjdGlvbiBiZXNpZGVzIF9fYnNzX3N0YXJ0LgotIwlEQVRBX1BMVCAtIC5wbHQgc2hvdWxkIGJlIGluIGRhdGEgc2VnbWVudCwgbm90IHRleHQgc2VnbWVudC4KLSMKLSMgV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGRvIG5vdGUgdGhhdCB0aGUgbmFtZXMgb2Ygc29tZSBzZWN0aW9ucyBhcmUgdXNlZAotIyB3aGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQuCi0jCi10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgIiRMRF9GTEFHIiA9ICJOIiAmJiBEQVRBX0FERFI9LgotSU5URVJQPSIuaW50ZXJwICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIAl9IgotUExUPSIucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucGx0KQl9IgotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9IFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCLSR7SU5URVJQfX0KLSAgLmhhc2ggICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbml0KQl9ID0ke05PUC0wfQotICAke0RBVEFfUExULSR7UExUfX0KLSAgLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfU1lNQk9MU319Ci0gICAgKigudGV4dCkKLSAgICAke0NPTlNUUlVDVElORysJX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysJKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysJX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysJKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0RUT1JfRU5EX18gPSAuO30KLSAgfQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLSAgLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5maW5pKSAgICB9ID0ke05PUC0wfQotICAuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kdG9ycykgICB9Ci0gIC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSAgfQotICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLSBBTElHTig4KSArICR7TUFYUEFHRVNJWkV9fTt9Ci0gIC5kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7REFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQotICAuZ290ICAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgLmR5bmFtaWMgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfQotICAke0RBVEFfUExUKyR7UExUfX0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gICR7UkVMT0NBVElORytfX2Jzc19zdGFydCA9IC47fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfU1lNQk9MU319Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQotICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4KLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KLSAgJHtPVEhFUl9TRUNUSU9OU30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcGUuc2MgYi9sZC9zY3JpcHR0ZW1wbC9wZS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxYTUwMi4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9wZS5zYworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFBFLgotCi1pZiB0ZXN0IC16ICIke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSI7IHRoZW4KLSAgUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotZmkKLQotIyBXZSBjYW4ndCBlYXNpbHkgYW5kIHBvcnRhYmx5IGdldCBhbiB1bnF1b3RlZCAkIGluIGEgc2hlbGwKLSMgc3Vic3RpdHV0aW9uLCBzbyB3ZSBkbyB0aGlzIGluc3RlYWQuCi0jIFNvcnRpbmcgb2YgdGhlIC5mb28kKiBzZWN0aW9ucyBpcyByZXF1aXJlZCBieSB0aGUgZGVmaW5pdGlvbiBvZgotIyBncm91cGVkIHNlY3Rpb25zIGluIFBFLgotIyBTb3J0aW5nIG9mIHRoZSBmaWxlIG5hbWVzIGluIFJfSURBVEEgaXMgcmVxdWlyZWQgYnkgdGhlCi0jIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGxsdG9vbCAodGhpcyBjb3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvCi0jIHVzZSBncm91cGVkIHNlY3Rpb25zIGluc3RlYWQpLgotaWYgdGVzdCAiJHtSRUxPQ0FUSU5HfSI7IHRoZW4KLSAgUl9URVhUPScqKFNPUlQoLnRleHQkKikpJwotICBSX0RBVEE9JyooU09SVCguZGF0YSQqKSknCi0gIFJfUkRBVEE9JyooU09SVCgucmRhdGEkKikpJwotICBSX0lEQVRBPScKLSAgICBTT1JUKCopKC5pZGF0YSQyKQotICAgIFNPUlQoKikoLmlkYXRhJDMpCi0gICAgLyogVGhlc2UgemVyb2VzIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW1wb3J0IGxpc3QuICAqLwotICAgIExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsKLSAgICBTT1JUKCopKC5pZGF0YSQ0KQotICAgIFNPUlQoKikoLmlkYXRhJDUpCi0gICAgU09SVCgqKSguaWRhdGEkNikKLSAgICBTT1JUKCopKC5pZGF0YSQ3KScKLSAgUl9DUlQ9JyooU09SVCguQ1JUJCopKScKLSAgUl9SU1JDPScqKFNPUlQoLnJzcmMkKikpJwotZWxzZQotICBSX1RFWFQ9Ci0gIFJfREFUQT0KLSAgUl9SREFUQT0KLSAgUl9JREFUQT0KLSAgUl9DUlQ9Ci0gIFJfUlNSQz0KLWZpCi0KLWNhdCA8PEVPRgotJHtSRUxPQ0FUSU5HK09VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSl9Ci0ke1JFTE9DQVRJTkctT1VUUFVUX0ZPUk1BVCgke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSl9Ci0ke09VVFBVVF9BUkNIK09VVFBVVF9BUkNIKCR7T1VUUFVUX0FSQ0h9KX0KLQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIF9faW1hZ2VfYmFzZV9fICsgX19zZWN0aW9uX2FsaWdubWVudF9fIH0gOiAKLSAgewotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgKigudGV4dCkKLSAgICAke1JfVEVYVH0KLSAgICAqKC5nbHVlXzd0KQotICAgICooLmdsdWVfNykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgLyogPz8/IFdoeSBpcyAuZ2NjX2V4YyBoZXJlPyAgKi8KLSAgICAke1JFTE9DQVRJTkcrICooLmdjY19leGMpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KLSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotICB9Ci0KLSAgLyogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIHNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEKLSAgICAgb24gZm9yay4gIFRoaXMgdXNlZCB0byBiZSBuYW1lZCAiLmRhdGEkbm9jb3B5Ii4gIFRoZSBsaW5rZXIgdXNlZAotICAgICB0byBpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotICAgICBicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIEluc3RlYWQsIHdlIG5hbWUgdGhlIHNlY3Rpb24KLSAgICAgIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlciBfX2RhdGFfZW5kX18uICovCi0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMikKLSAgICAke1JfREFUQX0KLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5kYXRhX2N5Z3dpbl9ub2NvcHkpfQotICB9Ci0KLSAgLnJkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5yZGF0YSkKLSAgICAke1JfUkRBVEF9Ci0gICAgKiguZWhfZnJhbWUpCi0gIH0KLQotICAucGRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLnBkYXRhKQotICB9Ci0KLSAgLmJzcyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORytfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gIC5lZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKiguZWRhdGEpCi0gIH0KLQotICAvRElTQ0FSRC8gOgotICB7Ci0gICAgKiguZGVidWdcJFMpCi0gICAgKiguZGVidWdcJFQpCi0gICAgKiguZGVidWdcJEYpCi0gICAgKiguZHJlY3R2ZSkKLSAgfQotCi0gIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgotCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KLSAgICAke1JfSURBVEF9Ci0gIH0KLSAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgJHtSX0NSVH0KLSAgfQotCi0gIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLSAgfQotCi0gIC5yc3JjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yc3JjKQotICAgICR7Ul9SU1JDfQotICB9Ci0KLSAgLnJlbG9jICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yZWxvYykKLSAgfQotCi0gIC5zdGFiICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0KLSAgLnN0YWJzdHIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9wai5zYyBiL2xkL3NjcmlwdHRlbXBsL3BqLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk4MWE1Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3BqLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotVE9SUz0iLnRvcnMgOgotICB7Ci0gICAgX19fY3RvcnMgPSAuIDsKLSAgICAqKC5jdG9ycykKLSAgICBfX19jdG9yc19lbmQgPSAuIDsKLSAgICBfX19kdG9ycyA9IC4gOwotICAgICooLmR0b3JzKQotICAgIF9fX2R0b3JzX2VuZCA9IC4gOwotICB9ID4gcmFtIgotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotTUVNT1JZCi17Ci0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJNCi19Ci0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDoKLSAgewotICAgICooLnRleHQpCi0gICAgKiguc3RyaW5ncykKLSAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgJHtDT05TVFJVQ1RJTkcrJHtUT1JTfX0KLSAgLmRhdGEgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLmJzcyA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDsgfQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuc3RhY2sgJHtSRUxPQ0FUSU5HKyAweDMwMDAwIH0gIDoKLSAgewotICAgICR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLSAgICAqKC5zdGFjaykKLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgKiguc3RhYikKLSAgfQotICAuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgKiguc3RhYnN0cikKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9wcGNwZS5zYyBiL2xkL3NjcmlwdHRlbXBsL3BwY3BlLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGZiZTMzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3BwY3BlLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLSMgQSBQRSBsaW5rZXIgc2NyaXB0IGZvciBQb3dlclBDLgotIyBMb29zZWx5IGJhc2VkIG9uIFN0ZXZlIENoYW1iZXJsYWluJ3MgcGUuc2MuCi0jIEFsbCBuZXcgbWlzdGFrZXMgc2hvdWxkIGJlIGNyZWRpdGVkIHRvIEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCi0jCi0jIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCi0jIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KLUlOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JwotRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSkKLSR7TElCX1NFQVJDSF9ESVJTfQotCi0vKiBNdWNoIG9mIHRoaXMgbGF5b3V0IHdhcyBkZXRlcm1pbmVkIGJ5IGRlbHZpbmcgaW50byAuZXhlIGZpbGVzIGZvcgotICAgdGhlIGJveCBnZW5lcmF0ZWQgYnkgb3RoZXIgY29tcGlsZXJzL2xpbmtlcnMvZXRjLiBUaGlzIG1lYW5zIHRoYXQKLSAgIGlmIGEgcGFydGljdWxhciBmZWF0dXJlIGRpZCBub3QgaGFwcGVuIHRvIGFwcGVhciBpbiBvbmUgb2YgdGhlIAotICAgc3ViamVjdCBmaWxlcywgdGhlbiBpdCBtYXkgbm90IGJlIHlldCBzdXBwb3J0ZWQuCi0qLwotCi0vKiBJdCdzICJtYWluQ1JUU3RhcnR1cCIsIG5vdCAiX21haW5DUlRTdGFydHVwIiwgYW5kIGl0J3MgbG9jYXRlZCBpbgotICAgb25lIG9mIHRoZSB0d28gLmxpYiBmaWxlcyAobGliYy5saWIgYW5kIGtlcm5lbDMyLmxpYikgdGhhdCBjdXJyZW50bHkKLSAgIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgbGluayBsaW5lLiBUaGlzIG1lYW5zIHRoYXQgeW91IG11c3QgdXNlIAotICAgIi11IG1haW5DUlRTdGFydHVwIiB0byBtYWtlIHN1cmUgaXQgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgbGluay4KLSovCi0KLUVOVFJZKG1haW5DUlRTdGFydHVwKQotCi1TRUNUSU9OUwotewotCi0gIC8qIHRleHQgLSB0aGUgdXN1YWwgbWVhbmluZyAqLwotICAudGV4dCAke1JFTE9DQVRJTkcrIF9faW1hZ2VfYmFzZV9fICsgX19zZWN0aW9uX2FsaWdubWVudF9fIH0gOiAKLQl7Ci0JICAgICR7UkVMT0NBVElORysgKiguaW5pdCk7fQotCSAgICAqKC50ZXh0KQotCSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotCSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkgICAgICAgIExPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAgICAgICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotCSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpO30KLQkgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0JfQotCi0gIC8qIHJkYXRhIC0gUmVhZCBPbmx5IFJ1bnRpbWUgRGF0YQotICAgICBDVFIgc2VjdGlvbnM6IEFsbCBvZiB0aGUgQ1JUIChyZWFkIG9ubHkgQyBydW50aW1lIGRhdGEpIHNlY3Rpb25zIAotCWFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlIC5yZGF0YSAocmVhZCBvbmx5IHJ1bnRpbWUgZGF0YSkgCi0Jc2VjdGlvbiwgaW4gdGhlIGZvbGxvd2luZyBvcmRlci4gRG9uJ3Qga25vdyBpZiBpdCBtYXR0ZXJzIG9yIG5vdC4KLQlOb3QgYWxsIHNlY3Rpb25zIGFyZSBhbHdheXMgcHJlc2VudCBlaXRoZXIuCi0gICAgIC5yZGF0YTogY29tcGlsZXIgZ2VuZXJhdGVkIHJlYWQgb25seSBkYXRhCi0gICAgIC54ZGF0YTogY29tcGlsZXIgZ2VuZXJhdGVkIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZS4gKE1vc3QgZG9jcwotCXNlZW0gdG8gc3VnZ2VzdCB0aGF0IHRoaXMgc2VjdGlvbiBpcyBub3cgZGVwcmVjYXRlZCBpbmZhdm9yCi0Jb2YgdGhlIHlkYXRhIHNlY3Rpb24pCi0gICAgIC5lZGF0YTogVGhlIGV4cG9ydGVkIG5hbWVzIHRhYmxlLgotICAqLwotICAucmRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JewotCSAgICAqKC5DUlRcJFhDQSk7Ci0JICAgICooLkNSVFwkWENDKTsKLQkgICAgKiguQ1JUXCRYQ1opOwotCSAgICAqKC5DUlRcJFhJQSk7Ci0JICAgICooLkNSVFwkWElDKTsKLQkgICAgKiguQ1JUXCRYSVopOwotCSAgICAqKC5DUlRcJFhMQSk7Ci0JICAgICooLkNSVFwkWExaKTsKLQkgICAgKiguQ1JUXCRYUEEpOwotCSAgICAqKC5DUlRcJFhQWCk7Ci0JICAgICooLkNSVFwkWFBaKTsKLQkgICAgKiguQ1JUXCRYVEEpOwotCSAgICAqKC5DUlRcJFhUWik7Ci0JICAgICooLnJkYXRhKTsKLQkgICAgKigueGRhdGEpOwotCX0KLQotICAuZWRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JewotICAgIAkgICAgKiguZWRhdGEpOwotCX0KLQotICAvKiBkYXRhIC0gaW5pdGlhbGl6ZWQgZGF0YQotICAgICAueWRhdGE6IGV4Y2VwdGlvbiBoYW5kbGluZyBpbmZvcm1hdGlvbi4KLSAgICAgLmRhdGE6IHRoZSB1c3VhbCBtZWFuaW5nLgotICAgICAuZGF0YTI6IG1vcmUgb2YgdGhlIHNhbWUuCi0gICAgIC5ic3M6IEZvciBzb21lIHJlYXNvbiwgYnNzIGFwcGVhcnMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGEKLQlzZWN0aW9uLCBhcyBvcHBvc2VkIHRvIGJlaW5nIGdpdmVuIGEgc2VjdGlvbiBvZiBpdCdzIG93bi4KLSAgICAgQ09NTU9OOgotICAqLwotICAuZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDogCi0JewotCSAgICBfX2RhdGFfc3RhcnRfXyA9IC4gOyAKLQkgICAgKigueWRhdGEpOwotCSAgICAqKC5kYXRhKTsKLQkgICAgKiguZGF0YTIpOwotCSAgICBfX2Jzc19zdGFydF9fID0gLiA7Ci0JICAgICooLmJzcykgOwotCSAgICAqKENPTU1PTik7Ci0JICAgIF9fYnNzX2VuZF9fID0gLiA7Ci0JICAgICR7UkVMT0NBVElORysgZW5kID0gIC59OwotIAkgICAgX19kYXRhX2VuZF9fID0gLiA7IAotCX0KLQotICAvKiBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlLiBBIHNlcXVlbmNlIG9mIDUgd29yZCBlbnRyaWVzLiBTZWN0aW9uCi0gICAgIGFkZHJlc3MgYW5kIGV4dGVudCBhcmUgcGxhY2VkIGluIHRoZSBEYXRhRGlyZWN0b3J5LgotICAqLwotICAucGRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICAqKC5wZGF0YSkKLSAJICAgIDsKLQl9Ci0KLSAgLyogVGhlIGlkYXRhIHNlY3Rpb24gaXMgY2hvY2sgZnVsbCBvZiBtYWdpYyBiaXRzLiAKLQkxLiBCb3VuZGFyaWVzIGFyb3VuZCB2YXJpb3VzIGlkYXRhIHBhcnRzIGFyZSB1c2VkIHRvIGluaXRpYWxpemUKLQkgICBzb21lIG9mIHRoZSBmaWVsZHMgb2YgdGhlIERhdGFEaXJlY3RvcnkuIEluIHBhcnRpY3VsYXIsIHRoZQotCSAgIG1hZ2ljIGZvciAyLCA0IGFuZCA1IGFyZSBrbm93biB0byBiZSB1c2VkLiBTb21lIGNvbXBpbGVycwotCSAgIGFwcGVhciB0byBnZW5lcmF0ZSBtYWdpYyBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoaXMgcHVycG9zZS4KLQkgICBXaGVyZSB3ZSBjYW4sIHdlIGNhdGNoIHN1Y2ggc3ltYm9scyBhbmQgdXNlIG91ciBvd24uIFRoaXMgb2YKLQkgICBjb3Vyc2UgaXMgc29tZXRoaW5nIGxlc3MgdGhhbiBhIHBlcmZlY3Qgc3RyYXRlZ3kuCi0JMi4gVGhlIHRhYmxlIG9mIGNvbnRlbnRzIGlzIHBsYWNlZCBpbW1lZGlhdGVseSBhZnRlciBpZGF0YTQuCi0JICAgVGhlICIucHJpdmF0ZS50b2MiIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIHBwYyBiZmQuIFRoZQotCSAgIC50b2MgdmFyaWFibGUgaXMgZ2VuZXJhdGVkIGJ5IGdhcywgYW5kIHJlc29sdmVkIGhlcmUuIEl0IGlzCi0JICAgdXNlZCB0byBpbml0aWFsaXplZCBmdW5jdGlvbiBkZXNjcmlwdG9ycyAoYW5kIGFueW9uZSBlbHNlIHdobwotCSAgIG5lZWRzIHRoZSBhZGRyZXNzIG9mIHRoZSBtb2R1bGUncyB0b2MpLiBUaGUgb25seSB0aGluZyAKLQkgICBpbnRlcmVzdGluZyBhYm91dCBpdCBhdCBhbGw/IE1vc3QgcHBjIGluc3RydWN0aW9ucyB1c2luZyBpdAotCSAgIGhhdmUgYSAxNmJpdCBkaXNwbGFjZW1lbnQgZmllbGQuIFRoZSBjb252ZW50aW9uIGZvciBhZGRyZXNzaW5nCi0JICAgaXMgdG8gaW5pdGlhbGl6ZSB0aGUgLnRvYyB2YWx1ZSB0byAzMksgcGFzdCB0aGUgc3RhcnQgb2YgdGhlCi0JICAgYWN0dWFsIHRvYywgYW5kIHN1YnRyYWN0IDMySyBmcm9tIGFsbCByZWZlcmVuY2VzLCB0aHVzIHVzaW5nCi0JICAgdGhlIGVudGlyZSA2NEsgcmFuZ2UuIE5hdHVyYWxseSwgdGhlIHJlbG9jIGNvZGUgbXVzdCBhZ3JlZQotCSAgIG9uIHRoaXMgbnVtYmVyIG9yIHlvdSBnZXQgcHJldHR5IHN0dXBpZCByZXN1bHRzLgotICAqLwotICAuaWRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICBfX2lkYXRhMl9tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDIpOwotCSAgICBfX2lkYXRhM19tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDMpOwotCSAgICBfX2lkYXRhNF9tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDQpOwotCSAgICAuID0gQUxJR04oNCk7Ci0JICAgIC50b2MgPSAuICsgMzI3Njg7Ci0JICAgICooLnByaXZhdGUudG9jKTsKLQkgICAgX19pZGF0YTVfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQ1KTsKLQkgICAgX19pZGF0YTZfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQ2KTsKLQkgICAgX19pZGF0YTdfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQ3KTsKLQkgICAgOwotCX0KLQotICAvKiByZWxkYXRhIC0tIGRhdGEgdGhhdCByZXF1aXJlcyByZWxvY2F0aW9uCi0gICovCi0gIC5yZWxkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgKigucmVsZGF0YSkKLSAJICAgIDsKLQl9Ci0KLQotICAvKiBSZXNvdXJjZXMgKi8KLSAgLnJzcmMgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICAqKC5yc3JjXCQwMSkKLQkgICAgKigucnNyY1wkMDIpCi0JICAgIDsKLQl9Ci0KLSAgLnN0YWIgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLQotICAvKiBUaGUgLnJlbG9jIHNlY3Rpb24gaXMgY3VycmVudGx5IGdlbmVyYXRlZCBieSB0aGUgZGxsdG9vbCBmcm9tIFN0ZXZlIAotICAgICBDaGFtYmVybGFpbiBpbiBhIHNlY29uZCBwYXNzIG9mIGxpbmtpbmcuIFNlY3Rpb24gYWRkcmVzcyBhbmQgZXh0ZW50Ci0gICAgIGFyZSBwbGFjZWQgaW4gdGhlIERhdGFEaXJlY3RvcnkuCi0gICovCi0gIC5yZWxvYyBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgICooLnJlbG9jKQotCSAgICA7Ci0JfQotCi0gIC8qIFdlIGRvbid0IGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoIGNvZGV2aWV3IGRlYnVnZ2VyIHN1cHBvcnQgb3IgdGhlCi0gICAgIGRpcmVjdGl2ZSBzZWN0aW9uICh5ZXQpLiBIb3BlZnVsbHksIHdlIGp1bmsgdGhlbSBjb3JyZWN0bHkuIAotICAqLwotICAvRElTQ0FSRC8gQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6IAotCXsKLSAgICAJICAgICooLmRlYnVnXCRTKQotICAgIAkgICAgKiguZGVidWdcJFQpCi0gICAgCSAgICAqKC5kZWJ1Z1wkRikKLSAgICAJICAgICooLmRyZWN0dmUpCi0gICAgCSAgICA7Ci0gICAJfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9wc29zLnNjIGIvbGQvc2NyaXB0dGVtcGwvcHNvcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4YzZjNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9wc29zLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCR7T1VUUFVUX0ZPUk1BVH0pCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HOi0wfSAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6IHsKLSAgICAke1JFTE9DQVRJTkcrIHN0YXJ0ID0gREVGSU5FRChfU1RBUlQpID8gX1NUQVJUIDogREVGSU5FRChfc3RhcnQpID8gX3N0YXJ0IDogLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fdGV4dCA9IC4pO30KLSAgICAqKC50ZXh0KTsKLSAgICAqKGNvZGUpOwotICAgICooY29uc3QpOwotICAgICooc3RyaW5ncyk7Ci0gICAgKihwU09TKTsKLSAgICAqKHBST0JFKTsKLSAgICAqKHBOQSk7Ci0gICAgKihwSElMRSk7Ci0gICAgKihwUkVQQyk7Ci0gICAgKihwUlBDKTsKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpO30KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19ldGV4dCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX2V0ZXh0ID0gLik7fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORzotMH0gOiAke1JFTE9DQVRJTkcrIEFUKEFERFIoLnRleHQpICsgU0laRU9GKC50ZXh0KSl9IHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19kYXRhID0gLik7fQotICAgICooLmRhdGEpOwotICAgICoodmFycyk7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZWRhdGEgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9lZGF0YSA9IC4pO30KLSAgfQotICAuYnNzICR7UkVMT0NBVElORzotMH0gOgotICB7IAkJCQkJCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fYnNzID0gLik7fQotICAgICooLmJzcyk7Ci0gICAgKih6ZXJvdmFycyk7Ci0gICAgKihDT01NT04pOwotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2Vic3MgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZW5kID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfZW5kID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfRnJlZU1lbVN0YXJ0ID0gLik7fQotICB9Ci0gIC5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgKiguc3RhYik7Ci0gIH0KLSAgLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgICooLnN0YWJzdHIpOwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3Jpc2NpeC5zYyBiL2xkL3NjcmlwdHRlbXBsL3Jpc2NpeC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwMWEwYy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9yaXNjaXguc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORytfX0RZTkFNSUMgID0gIDA7fQotJHtTVEFDS1pFUk8rJHtSRUxPQ0FUSU5HKyR7U1RBQ0taRVJPfX19Ci0ke1NITElCX1BBVEgrJHtSRUxPQ0FUSU5HKyR7U0hMSUJfUEFUSH19fQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX06Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gIH0KLSAgLmRhdGEgICR7UkVMT0NBVElORyske0RBVEFfQUxJR05NRU5UfX0gOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgPSAgLjt9Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmMjY3ZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLUVOVFJZKHN0YXJ0KQotCi1TRUNUSU9OUyB7Ci0gIC50ZXh0ICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19IDogCi0gICAgewotCSooLnRleHQpOwotCSooLnRleHQxKTsKLQkqKC50ZXh0Mik7Ci0JJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OwotICAgIH0KLSAgLmxpdCBBTElHTig0KSA6Ci0gICB7Ci0JKigubGl0KTsKLQkke1JFTE9DQVRJTkcrX2VsaXQgPSAufTsKLSAgIH0KLSAgLmRhdGEgQUxJR04oNCkgOgotICAgIHsKLQkqKC5kYXRhKTsKLQkqKC5kYXRhMSk7Ci0JKiguZGF0YTIpOwotCSR7UkVMT0NBVElORytfZWRhdGEgPSAufTsKLQkke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0JJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0JJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0JJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLQkke0NPTlNUUlVDVElORysgTE9ORygwKX0KLQkke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotCSR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotCSR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotCSR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0JJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0JJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICB9Ci0KLSAgLmJzcyAgQUxJR04oNCkgOgotICAgIHsgCi0JKihDT01NT04pIAkKLQkqKC5ic3MpCi0JJHtSRUxPQ0FUSU5HK19lbmQgPSAufTsKLSAgICB9IAotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zaC5zYyBiL2xkL3NjcmlwdHRlbXBsL3NoLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzZkZDIxLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3NoLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotVE9SUz0iLnRvcnMgOgotICB7Ci0gICAgX19fY3RvcnMgPSAuIDsKLSAgICAqKC5jdG9ycykKLSAgICBfX19jdG9yc19lbmQgPSAuIDsKLSAgICBfX19kdG9ycyA9IC4gOwotICAgICooLmR0b3JzKQotICAgIF9fX2R0b3JzX2VuZCA9IC4gOwotICB9ID4gcmFtIgotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotTUVNT1JZCi17Ci0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrCi19Ci0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDoKLSAgewotICAgICooLnRleHQpCi0gICAgKiguc3RyaW5ncykKLSAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgJHtDT05TVFJVQ1RJTkcrJHtUT1JTfX0KLSAgLmRhdGEgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLmJzcyA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDsgfQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuc3RhY2sgJHtSRUxPQ0FUSU5HKyAweDMwMDAwIH0gIDoKLSAgewotICAgICR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLSAgICAqKC5zdGFjaykKLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgKiguc3RhYikKLSAgfQotICAuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgKiguc3RhYnN0cikKLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiYjdhZC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFNwYXJjIENPRkYuCi0jIEJhc2VkIG9uIGkzODZjb2ZmLnNjIGJ5IElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjIGIvbGQvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmIxZTFkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgU3BhcmMgTHlueE9TLgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgU0laRU9GX0hFQURFUlN9IDogewotICAgICooLmluaXQpCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTEzMmEuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc3QyMDAwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQkgICooLnN0cmluZ3MpCi0gICAJICBfZXRleHQgPSAuOwotCSooLmRhdGEpCi0JX2VkYXRhID0gLjsKLQkqKC5ic3MpCi0JKihDT01NT04pCi0JIF9lbmQgPSAuOwotCi19Ci0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MgYi9sZC9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YmFlZDMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc3RhY2sgPSAwKTt9Ci1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDoKLSAgewotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gLjt9Ci0gICAgJHtQQURfVEVYVCske1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O319Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gIC5kYXRhIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgOgotICB7Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytfZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IEFMSUdOKDQpIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjJkNGY3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgiJHtPVVRQVVRfQVJDSH0iKQotCi1NRU1PUlkKLXsKLQlyb20gOiBPUklHSU4gPSAweDAwMDAwMzAwLCBMRU5HVEggPSAxNmsKLQlyYW0gOiBPUklHSU4gPSAweDAwMDAwMzAwICsgMTZrLCBMRU5HVEggPSAxNmsKLQlyYW1ibGswIDogT1JJR0lOID0gMHgwMjAyNjAwMCwgTEVOR1RIID0gMHgxMDAwCi0JcmFtYmxrMSA6IE9SSUdJTiA9IDB4MDIwMjcwMDAsIExFTkdUSCA9IDB4MTAwMAotfQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udmVjdG9ycyAweDAwMDAwMDAwIDoKLXsKLQkqKHZlY3RvcnMpCi19Ci0KLS50ZXh0IDogCi17Ci0JKigudGV4dCkKLX0gPiByb20KLQotLmNvbnN0IDoKLXsKLQkqKC5jb25zdCkKLQlfX2V0ZXh0ID0gLiA7Ci19ID4gcm9tCi0KLS5tZGF0YSA6IEFUKCBBRERSKC5jb25zdCkgKyBTSVpFT0YoLmNvbnN0KSApCi17Ci0JX19kYXRhID0gLiA7Ci0JKiguZGF0YSk7Ci0JX19lZGF0YSA9IC4gOwotfSA+IHJhbQotCi0uYnNzIDoKLXsKLQlfX2JzcyA9IC4gOwotCSooLmJzcyk7Ci0JKihDT01NT04pOwotCV9fZWJzcyA9IC4gOwotfSA+IHJhbQotCi0ucmFtMCA6Ci17Ci0JKihyYW0wKQotfSA+IHJhbWJsazAKLQotLnJhbTEgOgotewotCSoocmFtMSkKLX0gPiByYW1ibGsxCi0KLX0KLQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmY2NTMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBUSSBUTVMzMjBDODAgKHRpYzgwKSBDT0ZGLgotIwotIyBCZXNpZGVzIHRoZSBzaGVsbCB2YXJpYWJsZXMgc2V0IGJ5IHRoZSBlbXVscGFyYW1zIHNjcmlwdCwgYW5kIHRoZSBMRF9GTEFHCi0jIHZhcmlhYmxlLCB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQgd2lsbCBzZXQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZm9yIGVhY2gKLSMgdGltZSB0aGlzIHNjcmlwdCBpcyBydW4gdG8gZ2VuZXJhdGUgb25lIG9mIHRoZSBsaW5rZXIgc2NyaXB0cyBmb3IgbGRzY3JpcHRzOgotIwotIyBSRUxPQ0FUSU5HOiBTZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGxpbmtlciBpcyBnb2luZyB0byBiZSBkb2luZwotIyBhIGZpbmFsIHJlbG9jYXRpb24uCi0jCi0jIENPTlNUUlVDVElORzogU2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgZ29pbmcgdG8gYmUKLSMgYnVpbGRpbmcgZ2xvYmFsIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcy4KLSMKLSMgREFUQV9BTElHTk1FTlQ6IFNldCB0byBhbiBBTElHTiBleHByZXNzaW9uIHdoZW4gdGhlIG91dHB1dCBzaG91bGQgYmUgcGFnZQotIyBhbGlnbmVkLCBvciB0byAiLiIgd2hlbiBnZW5lcmF0aW5nIHRoZSAtTiBzY3JpcHQuCi0jCi0jIENSRUFURV9TSExJQjogU2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIGdlbmVyYXRpbmcgYSBzY3JpcHQgZm9yCi0jIHRoZSAtc2hhcmVkIGxpbmtlciBhcmcuCi0KLXRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHg4MDAwMCArIFNJWkVPRl9IRUFERVJTIgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fX3N0YXJ0Ci0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgJFRFWFRfU1RBUlRfQUREUn0gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC5maW5pKQotICAgICooLnRleHQpCi0gIH0KLSAgLmNvbnN0IEFMSUdOKDQpIDogewotICAgICooLmNvbnN0KQotICB9Ci0gIC5jdG9ycyBBTElHTig0KSA6IHsKLSAgICAke0NPTlNUUlVDVElORysgLiA9IEFMSUdOKDQpO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygtMSl9Ci0gICAgKiguY3RvcnMpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgfQotICAuZHRvcnMgQUxJR04oNCkgOiB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoLTEpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgfQotICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgLmRhdGEgOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIF9fZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgOiB7IAkJCQkJCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gQUxJR04oMHg4KX07Ci0gICAgICR7UkVMT0NBVElORysgX19lbmQgPSBBTElHTigweDgpfTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3Y4NTAuc2MgYi9sZC9zY3JpcHR0ZW1wbC92ODUwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTIwOTU0Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3Y4NTAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotY2F0IDw8IEVPRgotT1VUUFVUX0ZPUk1BVCgiZWxmMzItdjg1MCIsICJlbGYzMi12ODUwIiwKLQkgICAgICAiZWxmMzItdjg1MCIpCi1PVVRQVVRfQVJDSCh2ODUwKQotRU5UUlkoX3N0YXJ0KQotU0VBUkNIX0RJUiguKTsKLS8qL2NyaXR0ZXJzL3NsdWcvZ3Jvc3NtYW4vaW5zdGFsbC9zdW40L3Y4NTAtZWxmL2xpYiovCi1TRUNUSU9OUwotewotICAvKiBUaGlzIHNhdmVzIGEgbGl0dGxlIHNwYWNlIGluIHRoZSBFTEYgZmlsZSwgc2luY2UgdGhlIHpkYSBzdGFydHMKLSAgICAgYXQgYSBoaWdoZXIgbG9jYXRpb24gdGhhdCB0aGUgRUxGIGhlYWRlcnMgdGFrZSB1cC4gICovCi0KLSAgLnpkYXRhICR7WkRBVEFfU1RBUlRfQUREUn0gOiB7Ci0JKiguemRhdGEpCi0JKiguemJzcykKLQkqKHJlc3pkYXRhKQotCSooLnpjb21tb24pCi0gIH0KLQotICAvKiBUaGlzIGlzIHRoZSByZWFkIG9ubHkgcGFydCBvZiB0aGUgemVybyBkYXRhIGFyZWEuCi0gICAgIEhhdmluZyBpdCBhcyBhIHNlcGVyYXRlIHNlY3Rpb24gcHJldmVudHMgaXRzCi0gICAgIGF0dHJpYnV0ZXMgZnJvbSBiZWluZyBpbmhlcml0ZWQgYnkgdGhlIHpkYXRhCi0gICAgIHNlY3Rpb24uICBTcGVjaWZpY2FsbHkgaXQgcHJldmVudHMgdGhlIHpkYXRhCi0gICAgIHNlY3Rpb24gZnJvbSBiZWluZyBtYXJrZWQgUkVBRE9OTFkuICAqLwotCi0gIC5yb3pkYXRhICR7Uk9aREFUQV9TVEFSVF9BRERSfSA6IHsKLQkqKC5yb3pkYXRhKQotCSoocm9temRhdGEpCi0JKihyb216YnNzKQotICB9Ci0KLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSAke1RFWFRfU1RBUlRfQUREUn07Ci0gIC5pbnRlcnAJOiB7ICooLmludGVycCkgfQotICAuaGFzaAkJOiB7ICooLmhhc2gpIH0KLSAgLmR5bnN5bQk6IHsgKiguZHluc3ltKSB9Ci0gIC5keW5zdHIJOiB7ICooLmR5bnN0cikgfQotICAucmVsLnRleHQJOiB7ICooLnJlbC50ZXh0KSB9Ci0gIC5yZWxhLnRleHQJOiB7ICooLnJlbGEudGV4dCkgfQotICAucmVsLmRhdGEJOiB7ICooLnJlbC5kYXRhKSB9Ci0gIC5yZWxhLmRhdGEJOiB7ICooLnJlbGEuZGF0YSkgfQotICAucmVsLnJvZGF0YQk6IHsgKigucmVsLnJvZGF0YSkgfQotICAucmVsYS5yb2RhdGEJOiB7ICooLnJlbGEucm9kYXRhKSB9Ci0gIC5yZWwuZ290CTogeyAqKC5yZWwuZ290KSB9Ci0gIC5yZWxhLmdvdAk6IHsgKigucmVsYS5nb3QpIH0KLSAgLnJlbC5jdG9ycwk6IHsgKigucmVsLmN0b3JzKSB9Ci0gIC5yZWxhLmN0b3JzCTogeyAqKC5yZWxhLmN0b3JzKSB9Ci0gIC5yZWwuZHRvcnMJOiB7ICooLnJlbC5kdG9ycykgfQotICAucmVsYS5kdG9ycwk6IHsgKigucmVsYS5kdG9ycykgfQotICAucmVsLmluaXQJOiB7ICooLnJlbC5pbml0KSB9Ci0gIC5yZWxhLmluaXQJOiB7ICooLnJlbGEuaW5pdCkgfQotICAucmVsLmZpbmkJOiB7ICooLnJlbC5maW5pKSB9Ci0gIC5yZWxhLmZpbmkJOiB7ICooLnJlbGEuZmluaSkgfQotICAucmVsLmJzcwk6IHsgKigucmVsLmJzcykgfQotICAucmVsYS5ic3MJOiB7ICooLnJlbGEuYnNzKSB9Ci0gIC5yZWwucGx0CTogeyAqKC5yZWwucGx0KSB9Ci0gIC5yZWxhLnBsdAk6IHsgKigucmVsYS5wbHQpIH0KLSAgLmluaXQJCTogeyBLRUVQICgqKC5pbml0KSkgfSA9MAotICAucGx0CQk6IHsgKigucGx0KSB9Ci0KLSAgLnRleHQJCTogewotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9Ci0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgKiguZ251LmxpbmtvbmNlLnQqKQotICB9ID0wCi0KLSAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9Ci0KLSAgIC8qIFRoaXMgaXMgc3BlY2lhbCBjb2RlIGFyZWEgYXQgdGhlIGVuZCBvZiB0aGUgbm9ybWFsIHRleHQgc2VjdGlvbi4KLSAgICAgIEl0IGNvbnRhaW5zIGEgc21hbGwgbG9va3VwIHRhYmxlIGF0IHRoZSBzdGFydCBmb2xsb3dlZCBieSB0aGUKLSAgICAgIGNvZGUgcG9pbnRlZCB0byBieSBlbnRyaWVzIGluIHRoZSBsb29rdXAgdGFibGUuICAqLwotCi0gIC5jYWxsX3RhYmxlX2RhdGEgJHtDQUxMX1RBQkxFX1NUQVJUX0FERFJ9IDogewotICAgICR7UkVMT0NBVElORytQUk9WSURFKF9fY3RicCA9IC4pO30KLSAgICAqKC5jYWxsX3RhYmxlX2RhdGEpCi0gIH0gPSAweGZmICAgLyogZmlsbCBnYXBzIHdpdGggMHhmZiAqLwotICAuY2FsbF90YWJsZV90ZXh0IDogewotICAgICooLmNhbGxfdGFibGVfdGV4dCkKLSAgfQotCi0gIC5maW5pCQk6IHsgS0VFUCAoKiguZmluaSkpICAgIH0gPTAKLSAgLnJvZGF0YQk6IHsgKigucm9kYXRhKSAke1JFTE9DQVRJTkcrKigucm9kYXRhLiopfSAqKC5nbnUubGlua29uY2UuciopIH0KLSAgLnJvZGF0YTEJOiB7ICooLnJvZGF0YTEpIH0KLQotICAuZGF0YQkJOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YS4qKX0KLSAgICAqKC5nbnUubGlua29uY2UuZCopCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgLmRhdGExCTogeyAqKC5kYXRhMSkgfQotICAuY3RvcnMJOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fX2N0b3JzID0gLjt9Ci0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqY3J0ZW5kKC5jdG9ycykpCi0gICAgJHtSRUxPQ0FUSU5HK19fX2N0b3JzX2VuZCA9IC47fQotICB9Ci0KLSAgLmR0b3JzCTogewotICAgICR7UkVMT0NBVElORytfX19kdG9ycyA9IC47fQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKmNydGVuZC5vKC5kdG9ycykpCi0gICAgJHtSRUxPQ0FUSU5HK19fX2R0b3JzX2VuZCA9IC47fQotICB9Ci0KLSAgLmdvdAkJOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotICAuZHluYW1pYwk6IHsgKiguZHluYW1pYykgfQotCi0gIC50ZGF0YSAke1REQVRBX1NUQVJUX0FERFJ9IDogewotCSR7UkVMT0NBVElORytQUk9WSURFIChfX2VwID0gLik7fQotCSooLnRieXRlKQotCSooLnRjb21tb25fYnl0ZSkKLQkqKC50ZGF0YSkKLQkqKC50YnNzKQotCSooLnRjb21tb24pCi0gIH0KLQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YSAke1NEQVRBX1NUQVJUX0FERFJ9IDogewotCSR7UkVMT0NBVElORytQUk9WSURFIChfX2dwID0gLiArIDB4ODAwMCk7fQotCSooLnNkYXRhKQotICAgfQotCi0gIC8qIFNlZSBjb21tZW50IGFib3V0IC5yb3pkYXRhLiAqLwotICAucm9zZGF0YSAke1JPU0RBVEFfU1RBUlRfQUREUn0gOiB7Ci0JKigucm9zZGF0YSkKLSAgfQotCi0gIC8qIFdlIHBsYWNlIHRoZSAuc2JzcyBkYXRhIHNlY3Rpb24gQUZURVIgdGhlIC5yb3NkYXRhIHNlY3Rpb24sIHNvIHRoYXQKLSAgICAgaXQgY2FuIGRpcmVjdGx5IHByZWNlZWQgdGhlIC5ic3Mgc2VjdGlvbi4gIFRoaXMgYWxsb3dzIHJ1bnRpbWUgc3RhcnR1cAotICAgICBjb2RlIHRvIGluaXRpYWxpc2UgYWxsIHRoZSB6ZXJvLWRhdGEgc2VjdGlvbnMgYnkgc2ltcGx5IHRha2luZyB0aGUKLSAgICAgdmFsdWUgb2YgJ19lZGF0YScgYW5kIHplcm9pbmcgdW50aWwgaXQgcmVhY2hlcyAnX2VuZCcgICovCi0gIC5zYnNzIDogewotCSR7UkVMT0NBVElORytfX3Nic3Nfc3RhcnQgPSAuO30KLQkqKC5zYnNzKQotCSooLnNjb21tb24pCi0gIH0KLQotICAke1JFTE9DQVRJTkcrX2VkYXRhICA9IERFRklORUQgKF9fc2Jzc19zdGFydCkgPyBfX3Nic3Nfc3RhcnQgOiAuIDt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IF9lZGF0YSk7fQotCi0gIC5ic3MgICAgICAgOgotICB7Ci0JJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gREVGSU5FRCAoX19zYnNzX3N0YXJ0KSA/IF9fc2Jzc19zdGFydCA6IC4gO30KLQkke1JFTE9DQVRJTkcrX19yZWFsX2Jzc19zdGFydCA9IC4gO30KLQkqKC5keW5ic3MpCi0JKiguYnNzKQotCSooQ09NTU9OKQotICB9Ci0KLSAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIDt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMAkJOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMAkJOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAwCQk6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMAk6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAJCTogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAJOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLSAgLmNvbW1lbnQgMAkJOiB7ICooLmNvbW1lbnQpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMAk6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAJOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwCTogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwCTogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwCTogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwCTogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAJOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAJOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMAk6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMAk6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAJOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMAk6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwCTogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMAk6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMAk6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMAk6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMAk6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLQotICAvKiBVc2VyIHN0YWNrICovCi0gIC5zdGFjayAweDIwMDAwMAk6IHsKLQkke1JFTE9DQVRJTkcrX19zdGFjayA9IC47fQotCSooLnN0YWNrKQotICB9Ci0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MgYi9sZC9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzk4NDgwLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIE5vdGhpbmcgdG8gZG8uCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC93NjUuc2MgYi9sZC9zY3JpcHR0ZW1wbC93NjUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDQ0OTUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdzY1LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLU1FTU9SWSB7Ci0JcmFtICAgOiBvID0gMHgxMDAwLCBsID0gNTEyawotCX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQkgICooLnN0cmluZ3MpCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0KLQotLnRvcnMgICA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci19ICAke1JFTE9DQVRJTkcrID4gcmFtfQotCi0uZGF0YSAgOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uYnNzICA6Ci0JewotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrICR7UkVMT0NBVElORysgMHgzMDAwMCB9ICA6IAotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuc3RhYiAgLiAoTk9MT0FEKSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIC4gKE5PTE9BRCkgOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC96ODAwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL3o4MDAwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjg3OTMwLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3o4MDAwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCIke09VVFBVVF9BUkNIfSIpCi1FTlRSWShfc3RhcnQpCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7QklHKyAke1JFTE9DQVRJTkcrIDB4MDAwMDAwMH19IDogeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCSAgKiguc3RyaW5ncykKLQkgICooLnJkYXRhKQotCX0KLQotLmN0b3JzICR7QklHKyAke1JFTE9DQVRJTkcrIDB4MjAwMDAwMH19ICA6IAotCXsKLQkgICR7UkVMT0NBVElORysgX19fY3RvcnMgPSAuIDsgIH0KLQkgICooLmN0b3JzKTsKLQkgICR7UkVMT0NBVElORysgX19fY3RvcnNfZW5kID0gLiA7IH0KLQkgIF9fX2R0b3JzID0gLiA7Ci0JICAqKC5kdG9ycyk7Ci0JICAke1JFTE9DQVRJTkcrIF9fX2R0b3JzX2VuZCA9IC4gOyB9Ci0JfSAKLQotLmRhdGEgJHtCSUcrICR7UkVMT0NBVElORysgMHgzMDAwMDAwfX0gOiB7Ci0JKiguZGF0YSkKLQl9Ci0KLS5ic3MgJHtCSUcrICR7UkVMT0NBVElORysgMHg0MDAwMDAwfX0gOiAKLSAgewotICAgICR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotICAgICooLmJzcyk7Ci0gICAgKihDT01NT04pOwotICAgICR7UkVMT0NBVElORysgX19lbmRfYnNzID0gLiA7IH0KLSAgfQotCi0uaGVhcCAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDUwMDAwMDB9fSA6IHsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfaGVhcCA9IC4gOyB9Ci0JJHtSRUxPQ0FUSU5HKyAuID0gLiArIDIwayAgOyB9Ci0JJHtSRUxPQ0FUSU5HKyBfX2VuZF9oZWFwID0gLiA7IH0KLQl9IAotCi0uc3RhY2sgJHtSRUxPQ0FUSU5HKyAweGYwMDAgfSAgOiAKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCSR7UkVMT0NBVElORysgX19zdGFja190b3AgPSAuIDsgfQotCX0gCi0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zdGFtcC1oLmluIGIvbGQvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9sZC9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9sZC9zeXNkZXAuaCBiL2xkL3N5c2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NjMTIyLi4wMDAwMDAwCi0tLSBhL2xkL3N5c2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogc3lzZGVwLmggLS0gaGFuZGxlIGhvc3QgZGVwZW5kZW5jaWVzIGZvciB0aGUgR05VIGxpbmtlcgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRF9TWVNERVBfSAotI2RlZmluZSBMRF9TWVNERVBfSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbHNlCi1leHRlcm4gY2hhciAqc3RyY2hyICgpOwotZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9CSU5BUllfRk9QRU4KLSNpbmNsdWRlICJmb3Blbi1iaW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAiZm9wZW4tc2FtZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCi1leHRlcm4gY2hhciAqKmVudmlyb247Ci0jZW5kaWYKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTERfU1lTREVQX0gpICovCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvQ2hhbmdlTG9nIGIvbGQvdGVzdHN1aXRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwMjA1Zi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsODUyICswLDAgQEAKLTIwMDAtMDMtMTMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvcGhkcnMudDogRGlzY2FyZCBhbGwgdW5leHBlY3RlZCBzZWN0aW9ucy4KLQotMjAwMC0wMi0yNyBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGxpYi9sZC1saWIuZXhwIChkZWZhdWx0X2xkX2xpbmspOiBBZGRlZCAiJExJQlMiIHRvIGxpYnMuCi0KLTE5OTktMTEtMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiBGaXggdGVzdCB0byBkaXNhYmxlIHRoZXNlIGNoZWNrcyBmb3IKLQlQRSBiYXNlZCB0YXJnZXRzLgotCi0xOTk5LTEwLTI5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHA6ICBSZW1vdmUgdGVzdDYuCi0JKiBsZC1zZWxlY3RpdmUvNS5jYzogRGVsZXRlLgotCi0xOTk5LTEwLTI4ICBTY290dCBCYW1icm91Z2ggIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogU2V0dXAgZXhwZWN0ZWQgZmFpbHVyZXMgZm9yCi0Jc3JlYyB0ZXN0cyBvbiBBUk0gTGludXguCi0KLTE5OTktMDktMTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IHhmYWlsIGxpbnV4KmxpYmMxIHNoYXJlZCAobm9uIFBJQywgbG9hZAotCW9mZnNldCkgdGVzdC4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogQWRkIC0taW1hZ2UtYmFzZSAwIGZvciBQRSB0YXJnZXRzLgotCi0xOTk5LTA4LTE3ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QtZm9vLmNjIChGb286OmluaXRfZm9vKTogVXNlICIlbGQiIGZvciBzaXplb2YuCi0KLTE5OTktMDgtMDkgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogUnVuIHRlc3RzIG9uIHNwYXJjKi0qLWxpbnV4Ki4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBMaWtld2lzZS4KLQotMTk5OS0wNy0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLWxpYi5leHAgKHByb2MgYmlnX29yX2xpdHRsZV9lbmRpYW4pOiBOZXcgcHJvYy4KLQlEZXRlcm1pbmUgaWYgYSBiaWcgZW5kaWFuIG9yIGxpdHRsZSBlbmRpYW4gb3V0cHV0IGZvcm1hdCBoYXNzCi0JYmVlbiBzZWxlY3RlZCBieSBhbnkgb2YgdGhlIG11bHRpbGliIG9wdGlvbnMsIGFuZCBpZiBzbyByZXR1cm4KLQlhIHN1aXRhYmxlIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHRoZSBsaW5rZXIvYXNzZW1ibGVyLgotCShwcm9jIGRlZmF1bHRfbGRfbGluayk6IEluY2x1ZGUgdGhlIHJlc3VsdCBvZiBwcm9jCi0JYmlnX29yX2xpdHRsZV9lbmRpYW4gb24gdGhlIGNvbW1hbmQgbGluZSB0byB0aGUgbGlua2VyLgotCShwcm9jIGxkX3NpbXBsZV9saW5rKTogSW5jbHVkZSB0aGUgcmVzdWx0IG9mIHByb2MKLQliaWdfb3JfbGl0dGxlX2VuZGlhbiBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIHRoZSBsaW5rZXIuCi0JKHByb2MgZGVmYXVsdF9sZF9jb21waWxlKTogQXBwZW5kIG11bHRpbGliIGZsYWdzIHRvIGNvbXBpbGVyCi0Jc3dpdGNoZXMuCi0JKHByb2MgZGVmYXVsdF9sZF9hc3NlbWJsZSk6IEluY2x1ZGUgdGhlIHJlc3VsdCBvZiBwcm9jCi0JYmlnX29yX2xpdHRsZV9lbmRpYW4gb24gdGhlIGNvbW1hbmQgbGluZSB0byB0aGUgbGlua2VyLgotCi0xOTk5LTA3LTIxICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxkLWVsZnZlcnMvdmVyczEuYzogQWRkIG1pc3NpbmcgcHJvdG90eXBlcyBhbmQgaW5jbHVkZQotCTxzdGRpby5oPiBpZiBuZWNlc3NhcnkuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxNS5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczE5LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzMi5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczMuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM0LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNi5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczcuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM5LmM6IExpa2V3aXNlLgotCSogbGQtc2hhcmVkL21haW4uYzogTGlrZXdpc2UuCi0JKiBsZC1zcmVjL3NyMy5jYyAoRm9vOjpGb28pOiBSZW1vdmUgYXJnIG5hbWUuCi0KLVRodSBKdWwgMTUgMTg6MDA6MzAgMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IFhGQUlMIG9uIElSSVg2IGZvciB0aGUgdXN1YWwgYXMKLQl3aXRoIG90aGVyIERXQVJGMiB0YXJnZXRzLgotCi0xOTk5LTA3LTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogRG8gbm90IGV4cGVjdCBhcm0gdG9vbGNoYWlucyB0byBmYWlsCi0JdGhlIHVuZGVmaW5lZCBsaW5lIHRlc3QuCi0KLTE5OTktMDctMTAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBVc2UgLXJwYXRoIGluIG5ldyB2ZXJzMTkgdGVzdC4KLQotMTk5OS0wNy0wNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IEFkZCBuZXcgdGVzdHMgdmVyczE3IHRvIHZlcnMxOS4KLQkqIGxkL2VsZnZlcnMve3ZlcnMxNy4qLCB2ZXJzMTguKiwgdmVyczE5Lip9OiBOZXcgZmlsZXMuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZC1jaGVja3MvYXNtLnM6IFVzZSBhIHN5bWJvbCBuYW1lIGZvciAubGNvbW0uCi0JKiBsZC1jaGVja3MvY2hlY2tzLmV4cDogVXNlIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHR3byB0ZXN0cy4KLQlEb24ndCBhZGQgZXh0cmEgdGV4dCB3aGVuIGludm9raW5nIGZhaWwuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZC1zY3JpcHRzL3BoZHJzLmV4cDogQ2hhbmdlIHRhcmdldCBjaGVjayBmcm9tICIqLSotbGludXhhb3V0KiIKLQl0byAiKi0qLWxpbnV4KmFvdXQqIi4KLQkqIGxkLXNjcmlwdHMvd2Vhay5leHA6IExpa2V3aXNlLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLiAgU2ltcGxpZnkgY29uZGl0aW9uIGEgYml0LgotCi1XZWQgSnVuICA5IDEyOjAyOjMzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQtY2R0ZXN0L2NkdGVzdC1tYWluLmNjOiBBdm9pZCBgaW1wbGljaXQgaW50JyB3YXJuaW5nLgotCSogbGQtc2hhcmVkL3NoMS5jOiBGaXggdHlwby4KLQotMTk5OS0wNi0wNCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsaWIvbGQtbGliLmV4cCAoZGVmYXVsdF9sZF9ubSk6IENsZWFyIG5tX291dHB1dCBmaXJzdCBpZgotCW5lY2Vzc2FyeS4KLQotMTk5OS0wNS0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCB4ZmFpbCBmb3IgbWNvcmUtZWxmLgotCi0xOTk5LTA1LTExICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRG8gbm90IHJ1biB0ZXN0cyBmb3IgUEUgYmFzZWQgcG9ydHMuCi0KLTE5OTktMDMtMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiBEbyBub3QgcnVuIHRlc3RzIGZvciBDT0ZGIG9yIFBFCi0JYmFzZWQgcG9ydHMuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBBZGQgZXhwZWN0ZWQgZmFpbHVyZXMgZm9yIFN0cm9uZ0FSTQotCXRhcmdldHMuCi0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlcyBmb3IgU3Ryb25nQVJNIHRhcmdldHMuCi0KLQkqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiBBZGQgZXhwZWN0ZWQgZmFpbHVyZSBmb3IgQVJNLUNPRkYKLQl0YXJnZXRzLiAKLQotMTk5OS0wMi0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtY2hlY2tzL2FzbS5zOiBVc2UgLmxvbmcgaW5zdGVhZCBvZiAud29yZC4KLQlSZXBsYWNlIGN1c3RvbSBzZWN0aW9uIG5hbWVzIHdpdGggLnRleHQsIC5kYXRhIGFuZCAuYnNzLgotCSogbGQtY2hlY2tzL3NjcmlwdDogUmVwbGFjZSBjdXN0b20gc2VjdGlvbiBuYW1lcyB3aXRoIC50ZXh0LCAuZGF0YQotCWFuZCAuYnNzLiAKLQkqIGxkLWNoZWNrcy9jaGVja3MuZXhwOiBSZXBsYWNlIGN1c3RvbSBzZWN0aW9uIG5hbWVzIHdpdGggLnRleHQsCi0JLmRhdGEgYW5kIC5ic3MuIAotCi0xOTk5LTAyLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1jaGVja3M6IE5ldyBkaXJlY3Rvcnk6ICBUZXN0cyBmb3IgdGhlIGxpbmtlcidzCi0JLS1jaGVjay1zZWN0aW9ucyBvcHRpb24uCi0JKiBsZC1jaGVja3MvY2hlY2tzLmV4cDogTmV3IGZpbGUuCi0JKiBsZC1jaGVja3Mvc2NyaXB0OiBCb2d1cyBsaW5rZXIgc2NyaXB0LgotCSogbGQtY2hlY2tzL2FzbS5zOiBTaW1wbGUgdGVzdCBhc3NlbWJsZXIgZmlsZS4KLQotVHVlIEZlYiAgMiAxOToxNTowMiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiAgRGlzYWJsZSB0ZXN0IGZvciB1bnN1cHBvcnRlZAotICAgICAgICB0YXJnZXRzLiAgQ2hhbmdlIHRlc3RzIHRvIGNoZWNrIGZvciBhYnNlbmNlIG9mIHN5bWJvbHMgaW5zdGVhZAotICAgICAgICBvZiBhZGRyZXNzIHplcm8uCi0KLU1vbiBKYW4gMTggMDM6NDQ6NTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHAgKGdldF9saW5rX2ZpbGVzKTogUXVvdGUgdGFyZ2V0X3RyaXBsZXQgYW5kIENDCi0Jd2hlbiBpbnZva2luZyBzaGVsbC4KLQkoZ2V0X3RhcmdldF9lbXVsKTogTGlrZXdpc2UuCi0KLTE5OTktMDEtMDMgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHAgKGdldF9saW5rX2ZpbGVzLCBnZXRfdGFyZ2V0X2VtdWwpOiBOZXcgcHJvY3M7Ci0JcnVuIHNoZWxsIGNvbW1hbmRzIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBjb25maWd1cmUuaG9zdCBhbmQKLQljb25maWd1cmUudGd0IGluIHRoZSBzb3VyY2UgdHJlZS4KLQkodG9wIGxldmVsKTogVXNlIHRoZW0gdG8gZ2V0IGluZm9ybWF0aW9uIG5lZWRlZCB0byBydW4gdGVzdHMsIGlmCi0Jbm90IG90aGVyd2lzZSBwcm92aWRlZC4KLQotCSogbGQtc2hhcmVkL2VsZi1vZmZzZXQubGQ6IE5ldyBmaWxlLiAgQnVpbGRzIGEgc2hhcmVkIGxpYnJhcnksIGJ1dAotCWdpdmVzIG5vbi16ZXJvIGFkZHJlc3NlcyBmb3IgbWVtb3J5IHJlZ2lvbi4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGhlIG5vbi1QSUMgbm9uLUFJWCB0ZXN0IGFnYWluIHVzaW5nCi0JdGhlIG5ldyBsaW5rZXIgc2NyaXB0LgotCi1UdWUgRGVjICA4IDIyOjU2OjA1IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERlbGV0ZSB4ZmFpbHMgZm9yIFBQQyBMaW51eCB0YXJnZXRzLAotCW5ld2VyIGdsaWJjIGxldHMgbGluayBzdWNjZWVkLgotCi1TdW4gRGVjICA2IDEyOjU5OjM3IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogbGQtZWxmdmVycy92ZXJzMS5jOiBBZGQgbWlzc2luZyByZXR1cm4gdHlwZXMgYW5kIHZhbHVlcy4KLQkqIGxkLWVsZnZlcnMvdmVyczIuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMzLmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNC5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczUuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM2LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNy5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczkuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxNS5jOiBMaWtld2lzZS4KLQotRnJpIE9jdCAyMyAxNjoyODoyOSAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBsZC1zZWxlY3RpdmU6ICBOZXcgZGlyZWN0b3J5IHdpdGggbmV3IGZpbGVzIHRvIHRlc3QKLSAgICAgICBzZWxlY3RpdmUgbGlua2luZy4KLQotICAgICAgICogbGliL2xkLWxpYi5leHAgKGxkX25tKTogIFN0cmlwIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tICRuYW1lLgotICAgICAKLVN1biBPY3QgIDQgMjI6MTc6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxNi5kc3ltOiBXb3JrIGNvcnJlY3RseSBvbiBhIHN5c3RlbSB3aXRob3V0Ci0JdmVyc2lvbmVkIHN5c3RlbSBsaWJyYXJpZXMuCi0KLU1vbiBTZXAgMjggMjE6MzE6MTIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogUnVuIHRlc3RzIG9uIGFscGhhLWxpbnV4LgotCSogbGQtZWxmdmVycy8qLnN5bSwgbGQtZWxmdmVycy8qLmRzeW06IEFkanVzdCBwYXR0ZXJzIHRvIG1hdGNoCi0JQWxwaGEncyB1c2Ugb2Ygc3Rfb3RoZXIuCi0KLTE5OTgtMDktMjcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwICh2ZXJzMTYsIHZlcnMxNmEpOiBOZXcgdGVzdHMuCi0JKiBsZC1lbGZ2ZXJzL3t2ZXJzMTYuKiwgdmVyczE2YS4qfTogTmV3IGZpbGVzLgotCi1UaHUgU2VwIDE3IDE3OjE4OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBNYWtlIHVuZGVmaW5lZCBsaW5lIHRlc3QgYmUgYW4geGZhaWwKLQlmb3IgYXJtL3RodW5iIGVsZiB0b29sY2hhaW5zLgotCi1XZWQgU2VwICA5IDE0OjEwOjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBjaGFuZ2UgdGVzdCBmb3IgZWxmL2R3YXJmMiB0YXJnZXRzLgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBcm0tZWxmIG5vdyBwYXNzZXMgdGhpcyB0ZXN0LgotCi1XZWQgQXVnIDE5IDExOjU5OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBhcm0vdGh1bWItZWxmIGV4cGVjdGVkIGZhaWx1cmVzLgotCQotVGh1IEF1ZyAxMyAxMjo0MTo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBEb24ndCBydW4gdGhlIC0tc3RhdGljIGJvb3RzdHJhcAotCXRlc3QgaWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXRpYyBsaWJiZmQuYS4KLQotV2VkIEF1ZyAxMiAxNToxOTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCB4ZmFpbHMgZm9yIEFscGhhIEVMRiB0YXJnZXRzLgotCi1Nb24gQXVnIDEwIDE1OjQyOjIwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvd2Vhay50ICgudGV4dCwgLmRhdGEpOiBGb2N1cyBkYXRhIHRvIGJlIHVzZWQuCi0JKC9ESVNDQVJELyk6IEFsbCB0aGUgcmVzdC4KLQkqIGxkLXNjcmlwdHMvd2VhazEucywgbGQtc2NyaXB0cy93ZWFrMi5zOiBQdXQgc3R1ZmYgaW4gLmRhdGEuCi0KLUZyaSBKdWwgMjQgMTg6Mzc6MTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IENyZWF0ZSB0bXBkaXIvZ2FzIHN1YmRpcmVjdG9yeSwgYWRkIGEKLQlzeW1saW5rIHRvIGFzLW5ldywgYW5kIHNldCBnY2NfZ2FzX2ZsYWcgdmFyaWFibGUuCi0JKiBsaWIvbGQtbGliLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogSWYgdGhlIGNvbXBpbGVyIGFwcGVhcnMgdG8KLQliZSBnY2MsIHVzZSBnY2NfZ2FzX2ZsYWcgd2hlbiBjb21waWxpbmcuCi0KLVRodSBKdWwgMjMgMTI6MjM6MjkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBKdXN0IGNoZWNrIGZvciBpPzg2IHJhdGhlciB0aGFuIGNoZWNraW5nCi0JZm9yIGkzODYsIGk0ODYsIGFuZCBpNTg2LgotCShvYmpkdW1wX3ZlcnNpb25zdHVmZik6IElmIHdlIGNhbid0IGZpbmQgdGhlIGxpbmUsIGR1bXAgdGhlIGZpbGUuCi0KLUZyaSBKdWwgIDMgMDA6Mjc6NDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3BoZHJzLmV4cDogUnVuIHRlc3Qgb24gKi0qLWVhYmkqLgotCSogbGQtc2NyaXB0cy93ZWFrLmV4cDogTGlrZXdpc2UuCi0KLVdlZCBKdWwgIDEgMTA6NTE6NDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlsIGZvciB2ODUwLgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogYXJtIGFuZCB0aHVtYiBQRSB0b29sY2hhaW5zIG5vdyBwYXNzCi0JdGhlc2UgdGVzdHMuCi0KLUZyaSBKdW4gMTkgMTc6MTI6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3dlYWsuZXhwOiBOZXcgdGVzdC4KLQkqIGxkLXNjcmlwdHMvd2Vhay50OiBOZXcgZmlsZS4KLQkqIGxkLXNjcmlwdHMvd2VhazEuczogTmV3IGZpbGUuCi0JKiBsZC1zY3JpcHRzL3dlYWsyLnM6IE5ldyBmaWxlLgotCi1UdWUgSnVuIDE2IDEyOjQwOjM4IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IFJ1biB0ZXN0cyBvbiBwb3dlcnBjIEVMRiB0YXJnZXRzLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzMS5kc3ltOiBBbGxvdyBmb3IgLnNkYXRhLgotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgUG93ZXJQQyBMaW51eC4KLQotRnJpIE1heSAyOSAxNTowMjo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCB4ZmFpbHMgZm9yIHBvd2VycGMqLSotZWFiaS4KLSAJKHJ1bl9zcmVjX3Rlc3QpOiBPbiBtbjEwMjAwLCBkZWZpbmUgX190cnVuY3NpcHNpMl9kb19kMi4KLQkqIGxkLXNyZWMvc3IxLmMgKF9fbWFpbik6IENoYW5nZSByZXR1cm4gdHlwZSB0byB2b2lkLgotCSogbGQtc3JlYy9zcjMuY2MgKF9fbWFpbik6IExpa2V3aXNlLgotCShfX2J1aWx0aW5fZGVsZXRlLCBfX2J1aWx0aW5fbmV3KTogTGlrZXdpc2UuCi0JKF9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbik6IFJldHVybiAwLgotCShfX2dldF9laF9jb250ZXh0KTogTGlrZXdpc2UuCi0KLVRodSBNYXkgMjEgMTU6MjE6MzMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBzdXBwb3J0IGZvciB0aHVtYi1wZSB0YXJnZXQuCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc3VwcG9ydCBmb3IgYXJtLXBlIGFuZCB0aHVtYi1wZSB0YXJnZXRzLgotCi1Nb24gTWF5ICA0IDE3OjU0OjIwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUmVtb3ZlIHNldHVwX3hmYWlscyBmb3IgbTY4ay1saW51eC4KLQotTW9uIE1heSAgNCAxNzoxMjowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoYXJlZC9tYWluLmMgKHNobGliX292ZXJyaWRkZW5jYWxsMik6IE5ldyBmdW5jdGlvbi4KLQkobWFpbik6IENhbGwgc2hsaWJfc2hsaWJjYWxsMi4KLQkqIGxkLXNoYXJlZC9zaDEuYyAoc2hsaWJfc2hsaWJjYWxsMik6IE5ldyBmdW5jdGlvbi4KLQkoc2hsaWJfb3ZlcnJpZGRlbmNhbGwyKTogTmV3IGZ1bmN0aW9uLgotCSogbGQtc2hhcmVkL3NoYXJlZC5kYXQ6IEFkZCBvdXRwdXQgbGluZSBmb3IgbmV3IHRlc3QuCi0JKiBsZC1zaGFyZWQvc3VuNC5kYXQ6IExpa2V3aXNlLgotCi0JKiBsZC1zcmVjL3NyMy5jYyAoX19nZXRfZWhfY29udGV4dCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIEFwciAgNyAxMjo1MDoxNyAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QtZm9vLmggKGNsYXNzIEZvbyk6IERlY2xhcmUgbGVuIHRvIGJlIHN0YXRpYyB0bwotCWF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCi0JKiBsZC1zcmVjL3NyMy5jYyAoY2xhc3MgRm9vKTogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMTAgMTY6NDI6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyMy5jYyAoX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluKTogTmV3IGZ1bmN0aW9uLgotCi1Nb24gRmViICAyIDE0OjE3OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9waGRycy5leHA6IEFkanVzdCBwaGRyc19yZWdleHAgZm9yIGEgNjQgYml0IHRhcmdldC4KLQotVGh1IERlYyAxOCAxMToxMzoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEdXBsaWNhdGVkIEFybSBwYXRjaCBmb3IgVGh1bWIgdGFyZ2V0cy4KLQotVHVlIERlYyAgMiAwOTo1MDoxOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBcHBsaWVkIHBhdGNoIGZyb20gVG9ueS5UaG9tcHNvbkBhcm0uY29tIHdoaWNoCi0JZml4ZXMgQVJNIHRlc3RzLgotCi1Nb24gRGVjICAxIDE2OjEyOjA1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlcyBvZiB0ZXN0cyAxIGFuZCAyIGZvciBBUk0KLQljb2ZmIHRhcmdldHMuCi0KLVdlZCBOb3YgMTIgMTQ6MTg6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LWZvby5oIChjbGFzcyBGb28pOiBEZWNsYXJlIGxlbiB0byBiZSBpbnQgdG8KLQlhdm9pZCBjb21waWxlciB3YXJuaW5nLgotCSogbGQtc3JlYy9zcjMuY2MgKGNsYXNzIEZvbyk6IExpa2V3aXNlLgotCi1Nb24gTm92IDEwIDE0OjI1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLWxpYi5leHAgKGRlZmF1bHRfbGRfc2ltcGxlX2xpbmspOiBQZXJtaXQgdGhlIGxpbmtlciB0bwotCWhhdmUgYW55IG5hbWUgd2hlbiBsb29raW5nIGZvciBlbnRyeSBzeW1ib2wgd2FybmluZ3MuCi0KLQkqIGxkLXNyZWMvc3IzLmNjIChfX2VoX3BjKTogRGVmaW5lLgotCi1Nb24gT2N0IDIwIDE0OjM2OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcjMuY2M6IEFkZCBkZWZpbml0aW9ucyBmb3IgdGVybWluYXRlLCBfX3Rlcm1pbmF0ZSwgYW5kCi0gCV9fdGhyb3csIHNpbmNlIHRoZSBjdXJyZW50IGcrKyBleHBlY3RzIHRoZW0gdG8gYmUgZGVmaW5lZC4KLQotRnJpIE9jdCAgMyAxMjoyNDowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHAgKG9iamR1bXBfZW1wdHl2ZXJzdHVmZik6IEFjY2VwdCB0aGUgb3V0cHV0Ci0JZmlsZSBpZiB0aGUgc3RyaW5nIGxpYmMgYXBwZWFycyBpbiBpdC4KLQkob2JqZHVtcF92ZXJzaW9uc3R1ZmYpOiBBY2NlcHQgdW5leHBlY3RlZCBsaW5lcyBpbiB0aGUgb3V0cHV0Ci0JZmlsZS4gIENvbXBhcmUgbGluZXMgdXNpbmcgc3RyaW5nIG1hdGNoLgotCSogbGQtZWxmdmVycy92ZXJzNi52ZXI6IFBlcm1pdCBhbnkgdmFsdWUgaW4gdGhlIHZuYV9vdGhlciBmaWVsZC4KLQotVHVlIEF1ZyAxMiAxNjowMToyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBDb3JyZWN0IHN0cmluZyBxdW90aW5nLgotCi1TYXQgQXVnICA5IDAwOjU2OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBDaGFuZ2UgbGQsIGFzLCBubSBhbmQgc3RyaXAgZnJvbSAubmV3IHRvCi0JLW5ldy4gIExvYWQgbGQtbGliLmV4cCByYXRoZXIgdGhhbiBsZC5leHAuCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogVXNlIGxkLW5ldyByYXRoZXIgdGhhbiBsZC5uZXcuCi0JKiBsaWIvbGQtbGliLmV4cDogUmVuYW1lIGZyb20gbGliL2xkLmV4cCwgZm9yIHRoZSBiZW5lZml0IG9mCi0JRGVqYUdudSBjaGFuZ2VzLgotCi1UaHUgSnVuIDI2IDEyOjA3OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogVXNlIGVncmVwIHJhdGhlciB0aGFuIGdyZXAgd2hlbiBsb29raW5nIGZvcgotCWFuIGFsdGVybmF0aW9uLiAgRnJvbSBHcmVnIE1hcmdvIDxnbWFyZ29AZGwuY29tPi4KLQotV2VkIEp1biAyNSAxMjo0NzoyMiAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgbTY4ay1saW51eCBvbiB0ZXN0cwotCXdpdGggbm9uIFBJQyBzaGFyZWQgbGlicmFyaWVzLgotCi1GcmkgSnVuICA2IDE3OjM1OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzNi52ZXI6IFVwZGF0ZSBmb3IgcmVjZW50IGVsZmxpbmsuaCBwYXRjaCB0bwotCXZlcnNpb24gaGFuZGxpbmcuCi0KLVdlZCBKdW4gIDQgMTI6MDY6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEZWZpbmUgX19fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbiBhcyB3ZWxsLgotCi1GcmkgTWF5IDMwIDEyOjIxOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRGVmaW5lIF9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbiB3aGVuCi0JbGlua2luZy4KLQotTW9uIE1heSAxMiAxMToxNzo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogVXNlICRiYXNlX2RpciByYXRoZXIgdGhhbiAkb2JqZGlyIHdoZW4KLQlzZXR0aW5nIGxkLiAgRnJvbSBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+LgotCi1GcmkgQXByIDI1IDA5OjA3OjAwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRGVmaW5lIHZhcmlvdXMgb3V0IG9mIGxpbmUgcHJvbG9ndWUvZXBpbG9ndWUKLQlmdW5jdGlvbnMgZm9yIHRoZSBtbjEwMjAwIHRvIGF2b2lkIG5lZWRpbmcgbGliZ2NjLmEuCi0KLVdlZCBNYXIgMjYgMTM6NTY6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEb24ndCBleHBlY3QgZmFpbHVyZXMgb24gbWlwcyotKi1lbGYqLgotCi1Nb24gTWFyIDE3IDE5OjI3OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogRG9uJ3QgcnVuIG9uIFN1bk9TIG9yIEFJWC4KLQotV2VkIE1hciAxMiAyMTo0NDoxOSAxOTk3ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYW5kYW50ZS5qaWMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwLCAqOiBOZXcgdGVzdHMgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBTZXQgYXIgYW5kIHN0cmlwLgotCi1GcmkgRmViICA3IDE2OjQ3OjAyIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogVXNlIHBydW5lX3dhcm5pbmdzIGluc3RlYWQgb2YKLQlwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBEaXR0by4KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBEaXR0by4KLQkqIGxkLXNoL3NoLmV4cDogRGl0dG8uCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogRGl0dG8uCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEaXR0by4KLQkqIGxpYi9sZC5leHA6IERpdHRvLgotCi1XZWQgSmFuIDI5IDAwOjQ3OjI5IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LmV4cDogUHV0IGEgc2xhc2ggYmV0d2VlbiAkc3JjZGlyLyRzdWJkaXIuCi0JKiBsZC1zY3JpcHRzL3NjcmlwdC5leHA6IERpdHRvLgotCSogbGQtc2gvc2guZXhwOiBEaXR0by4KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBEaXR0by4KLQkqIGxkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cDogRGl0dG8uCi0JKiBsaWIvbGQuZXhwOiBEaXR0by4KLQotTW9uIERlYyAzMCAxNzowODowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBGaXggcXVvdGluZyBmb3IgLS1kZWZzeW0gJGdsb2JhbCQuCi0KLVR1ZSBPY3QgIDEgMTU6NTI6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3ZlcnNpb24pOiBGaXggZm9yIGN1cnJlbnQgdmVyc2lvbgotCXByaW50aW5nLgotCi1GcmkgU2VwIDEzIDE1OjUxOjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IERlZmluZSAkZ2xvYmFsJCBmb3IgaHBwYS1lbGYuCi0KLVRodSBBdWcgIDggMTQ6Mjk6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzMi50OiBNYXAgWENPRkYgc2VjdGlvbnMgdG8gLnRleHQgb3IgLmRhdGEuCi0KLQkqIGxpYi9sZC5leHA6IFVzZSB2ZXJib3NlIC1sb2cgaW5zdGVhZCBvZiBjYWxsaW5nIGJvdGggdmVyYm9zZSBhbmQKLQlzZW5kX2xvZy4KLQotV2VkIEF1ZyAgNyAxODowMDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvcGhkcnMuZXhwOiBOZXcgdGVzdC4KLQkqIGxkLXNjcmlwdHMvcGhkcnMucywgbGQtc2NyaXB0cy9waGRycy50OiBOZXcgZmlsZXMuCi0KLVN1biBBdWcgIDQgMjE6NTg6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogT24gYTI5ayB0YXJnZXRzLCB1c2UgLS1kZWZzeW0gdG8gZGVmaW5lCi0JVl9TUElMTCBhbmQgVl9GSUxMLgotCi1UaHUgQXVnICAxIDE0OjEwOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IE5ldyB0ZXN0LgotCSogbGQtc2NyaXB0cy97Y3Jvc3MxLmMsIGNyb3NzMi5jLCBjcm9zczMuY306IE5ldyBmaWxlcy4KLQkqIGxkLXNjcmlwdHMve2Nyb3NzMS50LCBjcm9zczIudH06IE5ldyBmaWxlcy4KLQotU2F0IEp1biAyOSAxMzo0MDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoL3NoLmV4cDogRml4IGRlYnVnZ2luZyBtZXNzYWdlcy4KLQkqIGxkLXNoL3NoMS5zOiBVc2UgLmFsaWduIDQuCi0KLVdlZCBNYXkgIDEgMTY6NDU6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaC9zaC5leHA6IFVzZSAtTyB3aGVuIGNvbXBpbGluZyB3aXRoIC1tcmVsYXguCi0KLU1vbiBBcHIgMjkgMTA6MzM6MTAgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGhlIHNoYXJlZCBsaWJyYXJ5IHRlc3RzIG9uCi0gCUxpbnV4L202OGsuCi0KLUZyaSBBcHIgIDUgMTY6MjA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRoZSBzaGFyZWQgbGlicmFyeSB0ZXN0cyBvbiBMaW51eC4KLQotTW9uIEZlYiAyNiAxMjo0NToyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBEb24ndCB1c2UgLWZwaWMgb24gTUlQUyB0YXJnZXRzLgotCi1XZWQgSmFuIDMxIDE1OjA5OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlscyBmb3IgaHBwYSotKi0qZWxmKi4KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBMaWtld2lzZS4KLQotRnJpIEphbiAyNiAxODo0MzowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBFTEYgdGFyZ2V0cyBzaG91bGQgbm93IHBhc3MgdGhlCi0JdW5kZWZpbmVkIGxpbmUgdGVzdC4KLQotVGh1IEphbiAyNSAxNTozNjoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVtcGljL2VtcGljLmV4cDogVXBkYXRlIGZvciBjaGFuZ2UgdG8gTUlQUyBkaXNhc3NlbWJsZXIuCi0KLU1vbiBKYW4gMTUgMTU6MDU6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogRXhwZWN0IGZhaWx1cmUgZm9yIG1pcHMqLSotaXJpeDUqCi0Jd2hlbiBkb2luZyB0aGUgLS1zdGF0aWMgdGVzdC4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGVzdHMgb24gbWlwcyotKi1pcml4NSouCi0KLUZyaSBEZWMgMjkgMTI6MzM6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogT24gQUlYLCBkb24ndCBwYXNzIHRoZSAtYkkgb3B0aW9uCi0Jd2hlbiBjcmVhdGluZyBsZC1wYXJ0aWFsLm8uCi0KLVR1ZSBEZWMgMjYgMTc6Mzc6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBJZiBwb3dlcnBjKi0qLWVhYmkqLCB1c2UgLS1kZWZzeW0gdG8gZGVmaW5lCi0JX19lYWJpLgotCi1UdWUgRGVjIDE5IDE4OjAxOjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgWENPRkYgdGFyZ2V0cy4KLQotRnJpIERlYyAxNSAxNjozNjoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IE9uIGEyOWsgdGFyZ2V0cywgdXNlIC0tZGVmc3ltIHRvIGRlZmluZQotCVZfU1BJTEwgYW5kIFZfRklMTC4KLQkqIGxkLXNyZWMvc3IxLmMgKFZfU1BJTEwsIFZfRklMTCk6IFJlbW92ZSBkZWZpbml0aW9ucy4KLQkqIGxkLXNyZWMvc3IzLmNjOiBMaWtld2lzZS4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogUmVtb3ZlIGk5NjAgQ09GRiBzZXR1cF94ZmFpbC4KLQotU2F0IERlYyAgMiAwMToyMDozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERvbid0IHVzZSBbXSBpbiBzZXR1cF94ZmFpbCBleHByZXNzaW9ucy4KLQotRnJpIERlYyAgMSAxMzoxODoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIE1JUFMgRUxGIHRhcmdldHMuCi0KLVdlZCBOb3YgMjkgMTM6MDE6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGk5NjAgQ09GRiB0YXJnZXRzLgotCi1Nb24gTm92IDI3IDE0OjM2OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlsIGNhbGxzIGZvciBpWzM0NV04Ni0qLWFvdXQqLgotCi0JKiBsZC1zcmVjL3NyMS5jIChWX1NQSUxMLCBWX0ZJTEwpOiBEZWZpbmUuCi0JKiBsZC1zcmVjL3NyMy5jYzogTGlrZXdpc2UuCi0KLVR1ZSBOb3YgMjEgMTY6MDU6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbXBpYy9lbXBpYy5leHA6IFVwZGF0ZSBmb3IgY2hhbmdlcyBpbiBvYmpkdW1wIG91dHB1dC4KLQotV2VkIE5vdiAxNSAxNzo0Mjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IE5ldyB0ZXN0cy4KLQkqIGxkLXNyZWMvc3IxLmMsIGxkLXNyZWMvc3IyLmMsIGxkLXNyZWMvc3IzLmNjOiBOZXcgZmlsZXMuCi0JKiBsaWIvbGQuZXhwIChsZF9zaW1wbGVfbGluayk6IERpc2NhcmQgd2FybmluZ3MgYWJvdXQgbm90IGJlaW5nCi0JYWJsZSB0byBmaW5kIHRoZSBlbnRyeSBzeW1ib2wuCi0KLVR1ZSBOb3YgMTQgMjA6MDM6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaC9zaDIuYyAoX19tYWluKTogRGVmaW5lLgotCi1Nb24gTm92ICA2IDE0OjM5OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZW1waWMvZW1waWMuZXhwOiBBY2NlcHQgYSAuIGluIHRoZSBhZGRyZXNzIHN5bWJvbC4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0ZXN0cyBvbiByczYwMDAqLSotYWl4KiBhbmQKLQlwb3dlcnBjKi0qLWFpeCouICBBZGQgY29kZSB0byBjcmVhdGUgYXBwcm9wcmlhdGUgZXhwb3J0cyBmaWxlcywKLQlhbmQgcGFzcyBhcHByb3ByaWF0ZSBjb21waWxhdGlvbiBmbGFncywgYW5kIHRlc3QgYWdhaW5zdAotCWFwcHJvcHJpYXRlIGV4cGVjdGVkIG91dHB1dC4KLQkqIGxkLXNoYXJlZC94Y29mZi5kYXQ6IE5ldyBmaWxlLgotCSogbGQtc2hhcmVkL21haW4uYzogUHV0ICNpZm5kZWYgWENPRkZfVEVTVCBhcm91bmQgdGVzdHMgdGhhdCBjYW4KLQlub3QgYmUgbGlua2VkIHVzaW5nIFhDT0ZGLiAgVXNlIHNobGliX3NobGlidmFyMSBhcyBhIHNhbXBsZQotCWZ1bmN0aW9uIHBvaW50ZXIsIHJhdGhlciB0aGFuIHNobGliX21haW52YXIuCi0JKiBsZC1zaGFyZWQvc2gxLmM6IExpa2V3aXNlLgotCSogbGQtc2hhcmVkL3NoYXJlZC5kYXQ6IFVwZGF0ZSBmb3IgY2hhbmdlIGZyb20gdXNpbmcgc2hsaWJfbWFpbnZhcgotCXRvIHVzaW5nIHNobGliX3NobGlidmFyMS4KLQkqIGxkLXNoYXJlZC9zdW40LmRhdDogTGlrZXdpc2UuCi0KLVNhdCBPY3QgMjggMDE6NTQ6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3NjcmlwdC50OiBQdXQgLnByIGluIC50ZXh0LCBhbmQgLnJ3IGluIC5kYXRhLCBmb3IKLQljb252ZW5pZW5jZSB3aGVuIHRlc3RpbmcgWENPRkYuCi0KLVRodSBPY3QgMjYgMjI6NTM6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogT24gQUlYLCBwYXNzIC1iSS9saWIvc3lzY2FsbHMuZXhwCi0JYWxvbmcgd2l0aCAtLXN0YXRpYy4KLQotCSogbGQtc2NyaXB0cy9zY3JpcHQuczogTWFrZSBzeW1ib2xzIGdsb2JhbC4KLQotRnJpIE9jdCAyMCAxMjoyMjoxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBhcm0qLSotcGUqLgotCi1GcmkgU2VwIDI5IDExOjA2OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IFVzZSAtZSB3aGVuIGludm9raW5nIHRoZSBsaW5rZXIsIHRvCi0JcHJldmVudCB0aGUgU3VuT1MgbGlua2VyIGZyb20gdHJ5aW5nIHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5LgotCi1UaHUgU2VwIDI4IDEyOjM3OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0aGUgdGVzdHMgb24gc3BhcmMqLSotc3Vub3M0Ki4gIEFkZAotCWFwcHJvcHJpYXRlIG1vZGlmaWNhdGlvbnMgYW5kIHNldHVwX3hmYWlscy4KLQkqIGxkLXNoYXJlZC9zdW40LmRhdDogTmV3IGZpbGUuCi0KLU1vbiBTZXAgMTggMTQ6MTI6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3ZlcnNpb24pOiBDYWxsIHBydW5lX3N5c3RlbV9jcnVkLgotCShkZWZhdWx0X2xkX3JlbG9jYXRlLCBkZWZhdWx0X2xkX2xpbmspOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9sZF9zaW1wbGVfbGluaywgZGVmYXVsdF9sZF9jb21waWxlKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfbGRfYXNzZW1ibGUsIGRlZmF1bHRfbGRfbm0pOiBMaWtld2lzZS4KLQotRnJpIFNlcCAgOCAxNzoxNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBJZiB0aGUgY29tcGlsZXIgZG9lcyBub3QgZXhpc3QsIG1hcmsgdGhlCi0JdGVzdHMgYXMgdW50ZXN0ZWQgcmF0aGVyIHRoYW4gdW5yZXNvbHZlZC4KLQotV2VkIEF1ZyAyMyAxMDo0NjozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkLXNoL3NoLmV4cDogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZCBvbiB0aGUgb3V0cHV0IG9mIGNtcC4KLQotVHVlIEF1ZyAxNSAxNzozNTozNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogU3BsaXQgc2NyaXB0IHZlcmlmaWNhdGlvbiBpbnRvIGEgcHJvYy4KLQlBZGQgc2ltcGxlIHRlc3Qgb2YgTVJJIHNjcmlwdC4KLQkqIGxkLXNjcmlwdHMvc2NyaXB0bS50OiBOZXcgZmlsZS4KLQotV2VkIEp1bCAyNiAxMTozODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoL3NoLmV4cDogTWFyayBgU0ggY29uZmlybSByZWxheGluZycgdGVzdCB1bnJlc29sdmVkIHdoZW4KLQlhcHByb3ByaWF0ZS4KLQotTW9uIEp1bCAyNCAxNTozNDozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogRGVmaW5lIG9iamNvcHkgaWYgaXQgaXMgbm90IGRlZmluZWQuCi0JKiBsZC1zaC8qOiBOZXcgdGVzdHMgZm9yIFNIIHJlbGF4aW5nLgotCi0JKiBsZC1lbXBpYy9lbXBpYy5leHA6IElmICRDQyBkb2VzIG5vdCBleGlzdCwgY2FsbCB1bnRlc3RlZCByYXRoZXIKLQl0aGFuIHVucmVzb2x2ZWQuCi0KLVRodSBKdWwgMjAgMTU6MDk6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogSWYgJENDIGRvZXMgbm90IGV4aXN0LCBtYXJrIHRoZQotCXRlc3RzIGFzIHVudGVzdGVkIHJhdGhlciB0aGFuIHVucmVzb2x2ZWQuICBDbGVhciBFTEYgeGZhaWxzIGZvcgotCW1pcHMqLCBub3QganVzdCBtaXBzLgotCi1UdWUgSnVsIDE4IDEyOjAwOjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2gtKi0qIGZvcgotCXVuZGVmaW5lZCBsaW5lIHRlc3QuCi0KLUZyaSBKdWwgMTQgMTM6MDc6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogTmV3IHRlc3QsIHRvIGNoZWNrIHJlcG9ydGluZyBvZgotCXVuZGVmaW5lZCBzeW1ib2xzLgotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jOiBOZXcgZmlsZS4KLQotTW9uIEp1bCAxMCAxMToxMzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cDogSWYgYSB0ZXN0IGZhaWxzLCByZXBvcnQgaXQgY29ycmVjdGx5OgotCWRvbid0IHRyeSB0byBydW4gdGhlIG5leHQgdGVzdCwgYW5kIGRvbid0IHJlcG9ydCBhIHBhc3MgYXMgd2VsbCBhcwotCWEgZmFpbC4KLQotTW9uIEp1bCAgMyAxNDoyNjozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZC90ZXN0c3VpdGUvdmVyc2Fkb3MvKHQxLHQyKS5sZDogRW5kIGluIG5ld2xpbmVzLgotCi1Nb24gTWF5IDIyIDIwOjE5OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfY29tcGlsZSk6IElmIGNjIGFyZ3VtZW50IGlzIG11bHRpcGxlCi0Jd29yZHMsIHVzZSBvbmx5IHRoZSBmaXJzdCB3aGVuIHRyeWluZyB0byB2ZXJpZnkgdGhlIGF2YWlsYWJpbGl0eQotCW9mIHRoZSBjb21waWxlci4KLQotTW9uIEZlYiAgNiAxMTo0Njo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvZGVmaW5lZC50OiBNZW50aW9uIC5kYXRhIGFuZCAuYnNzIGV4cGxpY2l0bHkuCi0KLVR1ZSBKYW4gMjQgMTQ6NTE6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogSWYgbm90IGluIHRoZSBsZCBidWlsZCBkaXJlY3RvcnksCi0JY2FsbCB1bnRlc3RlZCBmb3IgZWFjaCB0ZXN0LCByYXRoZXIgdGhhbiBpZ25vcmluZyBpdC4gIElmIG9uZSB0ZXN0Ci0JZmFpbHMsIGdvIG9uIHRvIHRoZSBuZXh0IG9uZSBpbnN0ZWFkIG9mIHJldHVybmluZy4KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBJZiBjb21waWxhdGlvbnMgZmFpbCwgbWFyayB0ZXN0cyBhcwotCXVucmVzb2x2ZWQuCi0JKiBsZC1lbXBpYy9lbXBpYy5leHA6IExpa2V3aXNlLiAgQWxzbywgYWx3YXlzIHBhc3MgdGhlIHNhbWUgdGVzdAotCW5hbWUgdG8gcGFzcyBvciBmYWlsLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLiAgQWxzbywgYWx3YXlzIHJ1biBhbGwgdGVzdHMuCi0JKiBsZC1zY3JpcHRzL2RlZmluZWQuZXhwOiBJZiBhcyBvciBubSBmYWlsLCBtYXJrIHRlc3QgYXMKLQl1bnJlc29sdmVkLiAgQWx3YXlzIHBhc3MgdGhlIHNhbWUgdGVzdCBuYW1lIHRvIHBhc3Mgb3IgZmFpbC4KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogTGlrZXdpc2UuCi0JKiBsZC1zY3JpcHRzL3NpemVvZi5leHA6IExpa2V3aXNlLgotCi1XZWQgSmFuIDExIDExOjQ4OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9zaXplb2YuZXhwOiBOZXcgdGVzdCwgYmFzZWQgb24gYnVnIHJlcG9ydCBmcm9tCi0JYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlLgotCSogbGQtc2NyaXB0cy9zaXplb2YuczogTmV3IGZpbGUuCi0JKiBsZC1zY3JpcHRzL3NpemVvZi50OiBOZXcgZmlsZS4KLQotV2VkIEphbiAgNCAxODo1NjoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHA6IFVzZSBbd2hpY2ggJGxkXSByYXRoZXIgdGhhbiBbZmlsZSBleGlzdHMgJGxkXSB0byBzZWUKLQlpZiB0aGUgbGlua2VyIGV4aXN0cy4KLQotV2VkIERlYyAxNCAxNjozOTowMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWIvbGQuZXhwIChwcnVuZV9zeXN0ZW1fY3J1ZCk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLAotCWluIGNhc2UgdGhlIHVzZXIgaXNuJ3QgdXNpbmcgdGhlIG5ld2VzdCBEZWphR251IHZlcnNpb24gdGhhdCB3ZQotCWhhdmVuJ3QgcmVsZWFzZWQgdG8gdGhlIG5ldCB5ZXQuCi0KLUZyaSBEZWMgIDIgMTQ6MTc6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBEZWZpbmUgb2JqZHVtcCBpZiBpdCBpcyBub3QgZGVmaW5lZC4KLQkqIGxkLWVtcGljLyo6IE5ldyB0ZXN0cyB0byB0ZXN0IC1tZW1iZWRkZWQtcGljIGNvZGUuCi0KLU1vbiBOb3YgMjggMTE6MjQ6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogUGFzcyBjbXAgb3V0cHV0IHRocm91Z2gKLQlwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBQYXNzIGRpZmYgb3V0cHV0IHRocm91Z2gKLQlwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBMaWtld2lzZS4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW1vdmUgdW51c2VkIGFuZCB1c2VsZXNzIHByb2MgbGRfbG9hZC4KLQotU3VuIE9jdCAzMCAxMzowMjozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfY29tcGlsZSk6IFJlbW92ZSB0aGUgb3V0cHV0IGZpbGUgYmVmb3JlCi0JY29tcGlsaW5nLgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTW92ZSBjb21tb24gdGVzdCBjb2RlIGludG8gYSBwcm9jZWR1cmUuCi0JQWRkIHRlc3RzIGZvciBjb21waWxpbmcgdGhlIG5vbiBzaGFyZWQgY29kZSBQSUMuCi0JKiBsZC1zaGFyZWQvbWFpbi5jIChtYWluKTogQ2FsbCBtYWluX2NhbGxlZCwgYW5kIHByaW50IHRoZSByZXN1bHQuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmRhdDogQWRqdXN0IGFjY29yZGluZ2x5LgotCi1UaHUgT2N0IDI3IDE3OjMwOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGQtc2hhcmVkOiBOZXcgZGlyZWN0b3J5LCB3aXRoIG5ldyBmaWxlcyB0byB0ZXN0IGdlbmVyYXRpbmcgRUxGCi0Jc2hhcmVkIGxpYnJhcmllcy4KLQotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogSWYgdGhlIGNvbXBpbGF0aW9uIHdvcmtlZCwgYnV0Ci0Jbm8gb2JqZWN0IGZpbGUgd2FzIGNyZWF0ZWQsIGNoZWNrIHRvIHNlZSBpZiB0aGUgY29tcGlsZXIgZm9vbGlzaGx5Ci0JaWdub3JlZCB0aGUgLW8gc3dpdGNoIHdoZW4gY29tcGlsaW5nLCBhbmQgbW92ZSB0aGUgcmVzdWx0aW5nCi0Jb2JqZWN0IGlmIGl0IGRpZC4KLQotVGh1IFNlcCAyOSAxMjozNjo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIFZNUyBkb2VzIG5vdCBwZXJtaXRzIGAuJyBpbiBkaXJlY3RvcnkgbmFtZXMuICBSZW5hbWVkCi0JbGQuYm9vdHN0cmFwIHRvIGxkLWJvb3RzdHJhcCwgbGQuY2R0ZXN0IHRvIGxkLWNkdGVzdCwgYW5kCi0JbGQuc2NyaXB0cyB0byBsZC1zY3JpcHRzLgotCi1XZWQgU2VwIDI4IDEyOjE4OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBTZXQgdmFyaWFibGVzIGFzIGFuZCBubS4gIENyZWF0ZSB0bXBkaXIgaWYKLQlpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotCSogbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IERvbid0IGNyZWF0ZSB0bXBkaXIgaGVyZS4KLQkqIGxkLmNkdGVzdC9jZHRlc3QuZXhwOiBMaWtld2lzZS4KLQkqIGxkLnNjcmlwdHMvZGVmaW5lZC5leHA6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3Qgc2V0IGFzIGFuZCBubQotCWhlcmUuICBDaGFuZ2UgcGVycm9yIGZvciBubyB2YXJpYWJsZXMgZm91bmQgdG8gZmFpbC4KLQkqIGxkLnNjcmlwdHMvc2NyaXB0LmV4cDogTmV3IHRlc3QuCi0JKiBsZC5zY3JpcHRzL3NjcmlwdC50LCBsZC5zY3JpcHRzL3NjcmlwdC5zOiBOZXcgZmlsZXMuCi0KLVR1ZSBTZXAgMjcgMTQ6NTk6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZC5zY3JpcHRzOiBOZXcgZGlyZWN0b3J5LgotCSogbGQuc2NyaXB0cy9kZWZpbmVkLmV4cCwgbGQuc2NyaXB0cy9kZWZpbmVkLnM6IE5ldyBmaWxlcy4KLQkqIGxkLnNjcmlwdHMvZGVmaW5lZC50OiBOZXcgZmlsZS4KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfc2ltcGxlX2xpbmspOiBOZXcgZnVuY3Rpb24uCi0JKGRlZmF1bHRfbGRfYXNzZW1ibGUsIGRlZmF1bHRfbGRfbm0pOiBOZXcgZnVuY3Rpb25zLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW5hbWUgZnJvbSB1bml4LWxkLmV4cC4KLQkobGRfc2ltcGxlX2xpbmssIGxkX2Fzc2VtYmxlLCBsZF9ubSk6IE5ldyBmdW5jdGlvbnMuCi0KLQkqIGNvbmZpZy91bml4LWxkLmV4cDogU2V0IGxkIHVzaW5nIGZpbmRmaWxlLgotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9yZWxvY2F0ZSk6IFJldHVybiBhIHZhbHVlLiAgQ2hhbmdlIGZvcm1hdAotCW9mIGxvZyBtZXNzYWdlcy4KLQkoZGVmYXVsdF9sZF9jb21waWxlKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfbGRfbGluayk6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3QgaW5jbHVkZSAkQkZETElCIGFuZAotCSRMSUJJQkVSVFkgaW4gbGluay4KLQkqIGxkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBSZXdyaXRlLgotCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IFJld3JpdGUuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LWZvby5jYzogVXBkYXRlIGZyb20gdG9wIGxldmVsIGxkIGRpcmVjdG9yeS4KLQkqIGxkLmNkdGVzdC9jZHRlc3QtZm9vLmg6IExpa2V3aXNlLgotCSogbGQuY2R0ZXN0L2NkdGVzdC1tYWluLmNjOiBMaWtld2lzZS4KLQotRnJpIE1heSAyNyAwOTozNTowNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IERvbid0IGxvb2sgZm9yICRyZXN1bHQgYmVmb3JlIGl0J3MKLQlkZWZpbmVkLgotCi1UdWUgTWF5IDE3IDE1OjA2OjQ5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAsIGxpYi9sZC5leHA6IFJlcGxhY2UgZXJyb3IgcHJvYwotCSAgY2FsbHMgd2l0aCBwZXJyb3IgY2FsbHMuCi0KLVdlZCBNYXkgMTEgMTY6NDc6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LWJhci5jYzogUmVuYW1lZCBmcm9tIGNkdGVzdC1mdW5jLmNjLgotCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IEFkanVzdGVkLgotCi1GcmkgSmFuIDI4IDEzOjI1OjQxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpYi9sZC5leHAgKHNpbXBsZV9kaWZmKTogSW5kaWNhdGUgZmFpbHVyZSBpZiBmaWxlcyBoYXZlCi0JZGlmZmVyZW50IG51bWJlcnMgb2YgbGluZXMuICBEb24ndCBtdWNrIHdpdGggJGRpZmZlcmVuY2VzIHRvIGF2b2lkCi0JaW5kaWNhdGluZyBhIHBhc3MsIGp1c3QgcmV0dXJuLgotCi0JKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L3tjZHRlc3QtZm9vLmgsY2R0ZXN0LWZvby5jYyxjZHRlc3QtbWFpbi5jY306Ci0JRml4IHRlc3QgY2FzZSB0byBiZSB2YWxpZCBBTlNJIEMrKy4gIERvbid0IHJlcXVpcmUgdXNlIG9mIGhlYWRlcgotCWZpbGVzLCBzbyAiLi4vZ2NjL3hnY2MgLUIuLi9nY2MvIiBjYW4gYmUgdXNlZCBmb3IgQ1hYLgotCSogdGVzdHN1aXRlL2xkLmNkdGVzdC9jZHRlc3QuZXhwOiBDb21iaW5lICJybSIgbGluZXMuICBBZGQgc29tZQotCWNvbW1lbnRhcnkgb24gdGhpbmdzIHRoYXQgYXJlIHN0aWxsIGJyb2tlbiB3aXRoIHRoaXMgdGVzdCBjYXNlLgotCi1GcmkgU2VwIDEwIDA5OjU4OjIzIDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIHRlc3RzdWl0ZS9sZC5jZHRlc3QvY2R0ZXN0LmV4cDogQWRkZWQgQ1hYRkxBR1MgdG8gY29tcGlsZSBzdGFnZS4KLQotVGh1IEF1ZyAxMiAxNjowNTozNyAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiB0ZXN0c3VpdGUvbGliL2xkLmV4cDogYWRkIGNvbXBpbGVyIGFuZCBsaW5rZXIgc3VwcG9ydAotCSogdGVzdHN1aXRlL2NvbmZpZy91bml4LWxkLmV4cDogYWRkIGNvbXBpbGVyIGFuZCBsaW5rZXIgc3VwcG9ydAotCSogdGVzdHN1aXRlL2xkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBmaXhlZCB0byBkbyBwYXJ0aWFsIGxpbmtzCi0JKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L2NkdGVzdC5leHA6IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgdGVzdHNjYXNlCi0KLVdlZCBBdWcgIDQgMjE6MDA6MTggMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogdGVzdHN1aXRlL2xpYi9sZC5leHA6IG5ldyBmaWxlCi0JKiB0ZXN0c3VpdGUvY29uZmlnL3VuaXgtbGQuZXhwOiBuZXcgZmlsZQotCSogdGVzdHN1aXRlL2xkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBuZXcgZmlsZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cCBiL2xkL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGZkZWEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0jIEJhc2ljIGV4cGVjdCBzY3JpcHQgZm9yIExEIFJlZ3Jlc3Npb24gVGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSmVmZnJleSBXaGVhdCAoY2Fzc2lkeUBjeWdudXMuY29tKQotIwotCi1pZiAhW2luZm8gZXhpc3RzIGxkXSB0aGVuIHsKLSAgICBzZXQgbGQgW2ZpbmRmaWxlICRiYXNlX2Rpci9sZC1uZXcgJGJhc2VfZGlyL2xkLW5ldyBbdHJhbnNmb3JtIGxkXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBhc10gdGhlbiB7Ci0gICAgc2V0IGFzIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vZ2FzL2FzLW5ldyAkYmFzZV9kaXIvLi4vZ2FzL2FzLW5ldyBbdHJhbnNmb3JtIGFzXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBubV0gdGhlbiB7Ci0gICAgc2V0IG5tIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvbm0tbmV3ICRiYXNlX2Rpci8uLi9iaW51dGlscy9ubS1uZXcgW3RyYW5zZm9ybSBubV1dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgb2JqZHVtcF0gdGhlbiB7Ci0gICAgc2V0IG9iamR1bXAgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9vYmpkdW1wXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIG9iamNvcHldIHRoZW4gewotICAgIHNldCBvYmpjb3B5IFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvb2JqY29weV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBhcl0gdGhlbiB7Ci0gICAgc2V0IGFyIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvYXJdCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgc3RyaXBdIHRoZW4gewotICAgIHNldCBzdHJpcCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL3N0cmlwLW5ldyAkYmFzZV9kaXIvLi4vYmludXRpbHMvc3RyaXAtbmV3IFt0cmFuc2Zvcm0gc3RyaXBdXQotfQotCi1pZiB7IVtmaWxlIGlzZGlyZWN0b3J5IHRtcGRpcl19IHRoZW4gewotICAgIGNhdGNoICJleGVjIG1rZGlyIHRtcGRpciIgc3RhdHVzCi19Ci0KLSMgTWFrZSBhIHN5bWxpbmsgZnJvbSB0bXBkaXIvYXMgdG8gdGhlIGFzc2VtYmxlciBpbiB0aGUgYnVpbGQgdHJlZSwgc28KLSMgdGhhdCB3ZSBjYW4gdXNlIGEgLUIgb3B0aW9uIHRvIGdjYyB0byBmb3JjZSBpdCB0byB1c2UgdGhlIG5ld2x5Ci0jIGJ1aWx0IGFzc2VtYmxlci4KLWlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgdG1wZGlyL2dhc119IHRoZW4gewotICAgIGNhdGNoICJleGVjIG1rZGlyIHRtcGRpci9nYXMiIHN0YXR1cwotICAgIGNhdGNoICJleGVjIGxuIC1zIC4uLy4uLy4uL2dhcy9hcy1uZXcgdG1wZGlyL2dhcy9hcyIgc3RhdHVzCi19Ci1zZXQgZ2NjX2dhc19mbGFnICItQltwd2RdL3RtcGRpci9nYXMvIgotCi0jIGxvYWQgdGhlIHV0aWxpdHkgcHJvY2VkdXJlcwotbG9hZF9saWIgbGQtbGliLmV4cAotCi1wcm9jIGdldF9saW5rX2ZpbGVzIHt2YXJuYW1lfSB7Ci0gICAgZ2xvYmFsICR2YXJuYW1lCi0gICAgZ2xvYmFsIHRhcmdldF90cmlwbGV0Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBDQwotICAgIGlmICFbaW5mbyBleGlzdHMgJHZhcm5hbWVdIHsKLQlzZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyBzaCAtYyBcImhvc3Q9JyR0YXJnZXRfdHJpcGxldCcgJiYgQ0M9JyRDQycgJiYgLiAkc3JjZGlyLy4uL2NvbmZpZ3VyZS5ob3N0ICYmIGV2YWwgZWNobyBcXCQkdmFybmFtZVwiIiByZXN1bHRdCi0JaWYgJHN0YXR1cyB7IGVycm9yICJFcnJvciBnZXR0aW5nIG5hdGl2ZSBsaW5rIGZpbGVzOiAkcmVzdWx0IiB9Ci0Jc2V0ICR2YXJuYW1lICRyZXN1bHQKLSAgICB9Ci19Ci0KLXByb2MgZ2V0X3RhcmdldF9lbXVsIHt9IHsKLSAgICBnbG9iYWwgdGFyZ2V0X3RyaXBsZXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgc2V0IHN0YXR1cyBbY2F0Y2ggImV4ZWMgc2ggLWMgXCJ0YXJnPSckdGFyZ2V0X3RyaXBsZXQnICYmIC4gJHNyY2Rpci8uLi9jb25maWd1cmUudGd0ICYmIGVjaG8gXFxcJHRhcmdfZW11bFwiIiByZXN1bHRdCi0gICAgaWYgJHN0YXR1cyB7IGVycm9yICJFcnJvciBnZXR0aW5nIGVtdWxhdGlvbiBuYW1lOiAkcmVzdWx0IiB9Ci0gICAgcmV0dXJuICRyZXN1bHQKLX0KLQotaWYgW2lzbmF0aXZlXSB7Ci0gICAgZm9yZWFjaCB4IHtIT1NUSU5HX0NSVDAgSE9TVElOR19MSUJTfSB7Ci0JZ2V0X2xpbmtfZmlsZXMgJHgKLSAgICB9Ci19IGVsc2UgewotICAgIGZvcmVhY2ggeCB7SE9TVElOR19DUlQwIEhPU1RJTkdfTElCU30geyBzZXQgJHggIiIgfQotfQotaWYgIVtpbmZvIGV4aXN0cyBIT1NUSU5HX0VNVV0geyBzZXQgSE9TVElOR19FTVUgIi1tIFtnZXRfdGFyZ2V0X2VtdWxdIiB9Ci0KLSMKLSMgbGRfdmVyc2lvbiAtLSBleHRyYWN0IGFuZCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbGQgY29tcGlsZXIgKEdDQykKLSMKLXByb2MgbGRfdmVyc2lvbiB7fSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZGVmYXVsdF9sZF92ZXJzaW9uICRsZAotfQotCi0jCi0jIGxkX2V4aXQgLS0ganVzdCBhIHN0dWIgZm9yIGxkCi0jCi1wcm9jIGxkX2V4aXQge30gewotfQotCi0jCi0jIGxkX3N0YXJ0IAotIwlyZWxpbmsgdGhlIGxpbmtlcgotIwotcHJvYyBsZF9zdGFydCB7IGxkIHRhcmdldCB9IHsKLQkjCi19Ci0KLSMKLSMgbGRfcmVsb2NhdGUgCi0jCWxpbmsgYW4gb2JqZWN0IHVzaW5nIHJlbG9jYXRpb24KLSMKLXByb2MgbGRfcmVsb2NhdGUgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLQlkZWZhdWx0X2xkX3JlbG9jYXRlICRsZCAkdGFyZ2V0ICRvYmplY3RzCi19Ci0KLSMKLSMgbGRfbGluayAKLSMJbGluayBhIHByb2dyYW0gdXNpbmcgbGQKLSMKLXByb2MgbGRfbGluayB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotCWRlZmF1bHRfbGRfbGluayAkbGQgJHRhcmdldCAkb2JqZWN0cwotfQotCi0jCi0jIGxkX3NpbXBsZV9saW5rIAotIwlsaW5rIGEgcHJvZ3JhbSB1c2luZyBsZCwgd2l0aG91dCBpbmNsdWRpbmcgYW55IGxpYnJhcmllcwotIwotcHJvYyBsZF9zaW1wbGVfbGluayB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotCWRlZmF1bHRfbGRfc2ltcGxlX2xpbmsgJGxkICR0YXJnZXQgJG9iamVjdHMKLX0KLQotIwotIyBsZF9jb21waWxlIAotIwljb21waWxlIGFuIG9iamVjdCB1c2luZyAkY2MKLSMKLXByb2MgbGRfY29tcGlsZSB7IGNjIHNvdXJjZSBvYmplY3QgfSB7Ci0JZGVmYXVsdF9sZF9jb21waWxlICRjYyAkc291cmNlICRvYmplY3QgCi19Ci0KLSMKLSMgbGRfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGxkX2Fzc2VtYmxlIHsgYXMgc291cmNlIG9iamVjdCB9IHsKLQlkZWZhdWx0X2xkX2Fzc2VtYmxlICRhcyAkc291cmNlICRvYmplY3QgCi19Ci0KLSMKLSMgbGRfbm0KLSMJcnVuIG5tIG9uIGEgZmlsZQotIwotcHJvYyBsZF9ubSB7IG5tIG9iamVjdCB9IHsKLQlkZWZhdWx0X2xkX25tICRubSAkb2JqZWN0Ci19Ci0KLSMKLSMgbGRfZXhlYwotIwlleGVjdXRlIGl0aGUgdGFyZ2V0Ci0jCi1wcm9jIGxkX2V4ZWMgeyB0YXJnZXQgb3V0cHV0IH0gewotCWRlZmF1bHRfbGRfZXhlYyAkdGFyZ2V0ICRvdXRwdXQKLX0KLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTRiODIwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIExEIEJvb3RzdHJhcCBUZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IEplZmZyZXkgV2hlYXQgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLSMgUmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGxkIGNhbiBib290c3RyYXAgaXRzZWxmLgotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgbGQgZ2VuZXJhdGVzIG5hdGl2ZSBleGVjdXRhYmxlcy4KLWlmICFbaXNuYXRpdmVdIHsKLSAgICByZXR1cm4KLX0KLQotIyBCb290c3RyYXAgbGQuICBGaXJzdCBsaW5rIHRoZSBvYmplY3QgZmlsZXMgdG9nZXRoZXIgdXNpbmcgLXIsIGluCi0jIG9yZGVyIHRvIHRlc3QgLXIuICBUaGVuIGxpbmsgdGhlIHJlc3VsdCBpbnRvIGFuIGV4ZWN1dGFibGUsIGxkMSwgdG8KLSMgcmVhbGx5IHRlc3QgLXIuICBVc2UgbGQxIHRvIGxpbmsgYSBmcmVzaCBsZCwgbGQyLiAgVXNlIGxkMiB0byBsaW5rIGEKLSMgbmV3IGxkLCBsZDMuICBsZDIgYW5kIGxkMyBzaG91bGQgYmUgaWRlbnRpY2FsLgotCi1mb3JlYWNoIGZsYWdzIHsiIiAiLS1zdGF0aWMiICItLXRyYWRpdGlvbmFsLWZvcm1hdCIgIi0tbm8ta2VlcC1tZW1vcnkifSB7Ci0gICAgaWYgeyIkZmxhZ3MiICE9ICIifSB7IAotCXNldCB0ZXN0bmFtZSAiYm9vdHN0cmFwIHdpdGggJGZsYWdzIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHRlc3RuYW1lICJib290c3RyYXAiCi0gICAgfQotCi0gICAgIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIHdlIGhhdmUgdGhlIGxkIGJ1aWxkIGRpcmVjdG9yeSwKLSAgICAjIHNpbmNlIHdlIG5lZWQgdGhlIG9iamVjdCBmaWxlcy4KLSAgICBpZiB7JGxkICE9ICIkb2JqZGlyL2xkLW5ldyJ9IHsKLQl1bnRlc3RlZCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgICMgSWYgd2Ugb25seSBoYXZlIGEgc2hhcmVkIGxpYmJmZCwgd2UgcHJvYmFibHkgY2FuJ3QgcnVuIHRoZQotICAgICMgLS1zdGF0aWMgdGVzdC4KLSAgICBpZiB7ICRmbGFncyA9PSAiLS1zdGF0aWMiICYmICEgW3N0cmluZyBtYXRjaCAiKmxpYmJmZC5hKiIgJEJGRExJQl0gfSB0aGVuIHsKLQl1bnRlc3RlZCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgIGlmICFbbGRfcmVsb2NhdGUgJGxkIHRtcGRpci9sZC1wYXJ0aWFsLm8gIiRmbGFncyAkT0ZJTEVTIl0gewotCWZhaWwgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICAjIE9uIEFJWCwgeW91IG5lZWQgdG8gc3BlY2lmeSBhbiBpbXBvcnQgbGlzdCB3aGVuIHVzaW5nIC0tc3RhdGljLgotICAgICMgWW91IG9ubHkgd2FudCB0aGUgaW1wb3J0IGxpc3Qgd2hlbiBjcmVhdGluZyB0aGUgZmluYWwKLSAgICAjIGV4ZWN1dGFibGUuCi0gICAgaWYgW2lzdGFyZ2V0ICIqLSotYWl4KiJdIHsKLQlpZiB7IiRmbGFncyIgPT0gIi0tc3RhdGljIn0gewotCSAgICBzZXQgZmxhZ3MgIi0tc3RhdGljIC1iSTovbGliL3N5c2NhbGxzLmV4cCIKLQl9Ci0gICAgfQotCi0gICAgIyBPbiBJcml4IDUsIGxpbmtpbmcgd2l0aCAtLXN0YXRpYyBvbmx5IHdvcmtzIGlmIGFsbCB0aGUgZmlsZXMgYXJlCi0gICAgIyBjb21waWxlZCB1c2luZyAtbm9uX3NoYXJlZC4KLSAgICBpZiB7IiRmbGFncyIgPT0gIi0tc3RhdGljIn0gewotCXNldHVwX3hmYWlsICJtaXBzKi0qLWlyaXg1KiIKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2xpbmsgJGxkIHRtcGRpci9sZDEgIiRmbGFncyB0bXBkaXIvbGQtcGFydGlhbC5vICRCRkRMSUIgJExJQklCRVJUWSJdIHsKLQlmYWlsICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgaWYgIVtsZF9saW5rIHRtcGRpci9sZDEgdG1wZGlyL2xkMiAiJGZsYWdzICRPRklMRVMgJEJGRExJQiAkTElCSUJFUlRZIl0gewotCWZhaWwgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2xpbmsgdG1wZGlyL2xkMiB0bXBkaXIvbGQzICIkZmxhZ3MgJE9GSUxFUyAkQkZETElCICRMSUJJQkVSVFkiXSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgIHNlbmRfbG9nICJjbXAgdG1wZGlyL2xkMiB0bXBkaXIvbGQzXG4iCi0gICAgdmVyYm9zZSAiY21wIHRtcGRpci9sZDIgdG1wZGlyL2xkMyIKLSAgICBjYXRjaCAiZXhlYyBjbXAgdG1wZGlyL2xkMiB0bXBkaXIvbGQzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCi0KLQlmYWlsICR0ZXN0bmFtZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWJhci5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWJhci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwMDBlMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1iYXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyB0ZXN0IHByb2dyYW0gZm9yIENsYXNzIEZvbwotCi0jaW5jbHVkZSAiY2R0ZXN0LWZvby5oIgotCi1zdGF0aWMgRm9vIHN0YXRpY19mb28oICJzdGF0aWNfZm9vIik7IAotCi1Gb28gZigpCi17Ci0gICAgRm9vIHg7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLXZvaWQgZygpCi17Ci0gICAgRm9vIG90aGVyX2ZvbzEgPSBGb28oICJvdGhlcl9mb28xIiksIG90aGVyX2ZvbzIgPSBGb28oICJvdGhlcl9mb28yIik7Ci0gICAgb3RoZXJfZm9vMiA9IG90aGVyX2ZvbzE7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDQxYTkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8gQ2xhc3MgRm9vCi0jcHJhZ21hIGltcGxlbWVudGF0aW9uCi0KLQotLy8gV2UgZG9uJ3QgdXNlIGhlYWRlciBmaWxlcywgc2luY2Ugd2Ugb25seSB3YW50IHRvIHNlZSwgd2hldGhlciB0aGUKLS8vIGNvbXBpbGVyIGlzIGluc3RhbGxlZCBwcm9wZXJseS4KLS8vCi0jaWYgKF9fR05VR19fID09IDIpCi10eXBlZGVmIF9fU0laRV9UWVBFX18gc2l6ZV90OwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKLSNlbmRpZgotCi1leHRlcm4gIkMiIHsKLSAgICBjaGFyICpzdHJuY3B5IChjaGFyKiBkZXN0LCBjb25zdCBjaGFyKiBkZXN0LCBzaXplX3QgbGVuKTsKLSAgICBpbnQgcHJpbnRmIChjb25zdCBjaGFyKiwgLi4uKTsKLX07Ci0KLSNpbmNsdWRlICJjZHRlc3QtZm9vLmgiCi0KLWludCBGb286OmZvb3MgPSAwOwotCi12b2lkIEZvbzo6aW5pdF9mb28gKCkKLXsKLSAgICBwcmludGYgKCJCUk9LRU5MWSBjYWxsaW5nIEZvbzo6aW5pdF9mb28gZnJvbSBfX2luaXRfc3RhcnQ7IHNpemVfb2YoRm9vKSA9ICVsZFxuIiwgKGxvbmcpIHNpemVvZihGb28pKTsKLSAgICBmb29zID0gRk9PTElTSF9OVU1CRVI7Ci19Ci0KLQotRm9vOjpGb28gKCkKLXsKLSAgICBpID0gKytmb29zOwotICAgIHN0cm5jcHkgKG1lc3NhZ2UsICJkZWZhdWx0LWZvbyIsIGxlbik7Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICgiQ29uc3RydWN0aW5nIEZvbyglZCkgXCJkZWZhdWx0LWZvb1wiIGF0ICUwOHhcbiIsIGksIHRoaXMpOwotI2Vsc2UKLSAgICBwcmludGYgKCJDb25zdHJ1Y3RpbmcgRm9vKCVkKSBcImRlZmF1bHQtZm9vXCJcbiIsIGkpOwotI2VuZGlmCi19Ci0KLUZvbzo6Rm9vIChjaGFyKiBtc2cpCi17Ci0gICAgaSA9ICsrZm9vczsKLSAgICBzdHJuY3B5KCBtZXNzYWdlLCBtc2csIGxlbik7Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiBhdCAlMDh4XG4iLCBpLCBtZXNzYWdlLCB0aGlzKTsKLSNlbHNlCi0gICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIlxuIiwgaSwgbWVzc2FnZSk7Ci0jZW5kaWYKLX0KLQotCi1Gb286OkZvbyAoY29uc3QgRm9vJiBmb28pCi17Ci0gICAgaSA9ICsrZm9vczsKLSNpZmRlZiBXSVRIX0FERFIKLSAgICBwcmludGYgKCJJbml0aWFsaXppbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB3aXRoIEZvbyglZCkgJTA4eFxuIiwgCi0JICAgIGksIGZvby5tZXNzYWdlLCB0aGlzLCBmb28uaSwgJmZvbyk7Ci0jZWxzZQotICAgcHJpbnRmICgiSW5pdGlhbGl6aW5nIEZvbyglZCkgXCIlc1wiIHdpdGggRm9vKCVkKVxuIixpLCBmb28ubWVzc2FnZSwgZm9vLmkpOwotI2VuZGlmCi0gICAgZm9yICggaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotfQotCi0KLUZvbyYgRm9vOjpvcGVyYXRvcj0gKGNvbnN0IEZvbyYgZm9vKQotewotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB0byBGb28oJWQpICUwOHhcbiIsIAotCSAgICBmb28uaSwgZm9vLm1lc3NhZ2UsICZmb28sIGksIHRoaXMpOwotI2Vsc2UKLSAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgdG8gRm9vKCVkKVxuIiwgZm9vLmksIGZvby5tZXNzYWdlLCBpKTsKLSNlbmRpZgotICAgIGZvciAoIGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspIG1lc3NhZ2Vba10gPSBmb28ubWVzc2FnZVtrXTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLQotRm9vOjp+Rm9vICgpCi17Ci0gICAgZm9vcy0tOwotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkRlc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiIGF0ICUwOHggKHJlbWFpbmluZyBmb29zOiAlZClcbiIsCi0JICAgIGksIG1lc3NhZ2UsIHRoaXMsIGZvb3MpOwotI2Vsc2UKLSAgICBwcmludGYgKCJEZXN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiAocmVtYWluaW5nIGZvb3M6ICVkKVxuIiwKLQkgICAgaSwgbWVzc2FnZSwgZm9vcyk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5oIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmU1MmEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLyBDbGFzcyBGb28KLQotI3ByYWdtYSBpbnRlcmZhY2UKLQotI2RlZmluZSBGT09MSVNIX05VTUJFUiAtNDcxMQotCi0jaWZuZGVmIEZPT19NU0dfTEVOCi0jZGVmaW5lIEZPT19NU0dfTEVOIDgwCi0jZW5kaWYKLSAKLWNsYXNzIEZvbyB7Ci0gICAgc3RhdGljIGludCBmb29zOwotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuID0gRk9PX01TR19MRU47Ci0gICAgY2hhciBtZXNzYWdlW2xlbl07Ci1wdWJsaWM6IAotICAgIHN0YXRpYyB2b2lkIGluaXRfZm9vICgpOwotICAgIHN0YXRpYyBpbnQgbmJfZm9vcygpIHsgcmV0dXJuIGZvb3M7IH0KLSAgICBGb28oKTsKLSAgICBGb28oIGNoYXIqIG1lc3NhZ2UpOwotICAgIEZvbyhjb25zdCBGb28mKTsKLSAgICBGb28gJiBvcGVyYXRvcj0gKGNvbnN0IEZvbyYpOwotICAgIH5Gb28gKCk7Ci19OyAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzg4MWRhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBtYWluIHByb2dyYW0gZm9yIENsYXNzIEZvbwotCi1leHRlcm4gIkMiIHsKLS8vIFNvbWUgPGFzc2VydC5oPiBpbXBsZW1lbnRhdGlvbnMgKGUuZy4gU1VOT1MgNC4xKSBhcmUgYnJva2VuLAotLy8gaW4gdGhhdCB0aGV5IHJlcXVpcmUgPHN0ZGlvLmg+LiAgQnV0LCBpZiBnY2MvZysrIGlzIGluc3RhbGxlZAotLy8gY29ycmVjdGx5LCB5b3Ugc2hvdWxkIGdldCBnY2MncyBhc3NlcnQuaC4KLS8vIElmIHRoZSBjb21waWxlIGZhaWxzLCBpdCBtZWFucyB0aGUgd3JvbmcgaW5jbHVkZSBmaWxlcyBhcmUgaW4gdXNlIQotI2luY2x1ZGUgPGFzc2VydC5oPgotfTsKLSNpbmNsdWRlICJjZHRlc3QtZm9vLmgiCi0KLWV4dGVybiAiQyIgdm9pZCBfX2luaXRfc3RhcnQoKTsKLQotZXh0ZXJuIEZvbyBmKHZvaWQpOwotZXh0ZXJuIHZvaWQgZyh2b2lkKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgKm5vdCogYmUgY2FsbGVkIGJ5IHRoZSBlbnZpcm9ubWVudC4gIFRoZXJlIGlzCi0gICBubyB3YXkgaW4gQysrIHRvIGBgcnVuIHNvbWV0aGluZyBhZnRlciB0aGUgaW5pdGlhbGl6ZXJzIGJ1dCBiZWZvcmUgbWFpbigpJycuCi0gICBUaGUgbGlicmFyeSB0aGF0IGRlcGVuZHMgb24gdGhpcyAoTklIQ0wpIGlzIGJyb2tlbi4gIC0tIEpvaG4gR2lsbW9yZSAKLSAgIFdlIGxlYXZlIHRoaXMgaGVyZSB0byB0ZXN0IHRoYXQgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIGNvbXBpbGVyCi0gICBkbyBub3QgcmUtaW50cm9kdWNlIHRoaXMgbG9zaW5nIGBgZmVhdHVyZScnLiAgKi8KLXZvaWQgCi1fX2luaXRfc3RhcnQoKQotewotICAgIEZvbzo6aW5pdF9mb28oKTsKLX0KLQotc3RhdGljIEZvbyBzdGF0aWNfZm9vKCAic3RhdGljX2ZvbyIpOyAKLQotaW50IG1haW4oKSAKLXsgCi0gICAgYXNzZXJ0IChGb286Om5iX2Zvb3MoKSA9PSAyKTsKLSAgICBGb28gYXV0b21hdGljX2ZvbyggImF1dG9tYXRpY19mb28iKTsKLSAgICBGb28gYmxhX2ZvbyA9IGYoKTsKLSAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOwotICAgIGcoKTsKLSAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOwotICAgIC8vIGBhdXRvbWF0aWNfZm9vJyBhbmQgYGJsYV9mb28nIGFyZSBkZXN0cnVjdGVkIGhlcmUgCi19IAotIApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWJlMGRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmRhdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUNvbnN0cnVjdGluZyBGb28oMSkgInN0YXRpY19mb28iCi1Db25zdHJ1Y3RpbmcgRm9vKDIpICJzdGF0aWNfZm9vIgotQ29uc3RydWN0aW5nIEZvbygzKSAiYXV0b21hdGljX2ZvbyIKLUNvbnN0cnVjdGluZyBGb28oNCkgImRlZmF1bHQtZm9vIgotSW5pdGlhbGl6aW5nIEZvbyg1KSAiZGVmYXVsdC1mb28iIHdpdGggRm9vKDQpCi1EZXN0cnVjdGluZyBGb28oNCkgImRlZmF1bHQtZm9vIiAocmVtYWluaW5nIGZvb3M6IDQpCi1Db25zdHJ1Y3RpbmcgRm9vKDUpICJvdGhlcl9mb28xIgotQ29uc3RydWN0aW5nIEZvbyg2KSAib3RoZXJfZm9vMiIKLUNvcHlpbmcgRm9vKDUpICJvdGhlcl9mb28xIiB0byBGb28oNikKLURlc3RydWN0aW5nIEZvbyg2KSAib3RoZXJfZm9vMSIgKHJlbWFpbmluZyBmb29zOiA1KQotRGVzdHJ1Y3RpbmcgRm9vKDUpICJvdGhlcl9mb28xIiAocmVtYWluaW5nIGZvb3M6IDQpCi1EZXN0cnVjdGluZyBGb28oNSkgImRlZmF1bHQtZm9vIiAocmVtYWluaW5nIGZvb3M6IDMpCi1EZXN0cnVjdGluZyBGb28oMykgImF1dG9tYXRpY19mb28iIChyZW1haW5pbmcgZm9vczogMikKLURlc3RydWN0aW5nIEZvbygyKSAic3RhdGljX2ZvbyIgKHJlbWFpbmluZyBmb29zOiAxKQotRGVzdHJ1Y3RpbmcgRm9vKDEpICJzdGF0aWNfZm9vIiAocmVtYWluaW5nIGZvb3M6IDApCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmUzNWUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgY2R0ZXN0IFRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTQsMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IEplZmZyZXkgV2hlYXQgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLSMgUmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGNvbnN0cnVjdG9ycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLXNldCB0ZXN0MSAiY2R0ZXN0Igotc2V0IHRlc3QyICJjZHRlc3Qgd2l0aCAtVXIiCi0KLSMgVGhpcyB0ZXN0IHJlcXVpcmVzIHJ1bm5pbmcgdGhlIGV4ZWN1dGFibGUgZ2VuZXJhdGVkIGJ5IGxkLgotaWYgIVtpc25hdGl2ZV0gewotICAgIHJldHVybgotfQotCi1pZiB7IFt3aGljaCAkQ1hYXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LWZvby5jYyB0bXBkaXIvY2R0ZXN0LWZvby5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDWFggJENYWEZMQUdTIC1mZ251LWxpbmtlciIgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC1iYXIuY2MgdG1wZGlyL2NkdGVzdC1iYXIub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ1hYICRDWFhGTEFHUyAtZmdudS1saW5rZXIiICRzcmNkaXIvJHN1YmRpci9jZHRlc3QtbWFpbi5jYyB0bXBkaXIvY2R0ZXN0LW1haW4ub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX2xpbmsgJGxkIHRtcGRpci9jZHRlc3Qge3RtcGRpci9jZHRlc3QtZm9vLm8gdG1wZGlyL2NkdGVzdC1iYXIubyB0bXBkaXIvY2R0ZXN0LW1haW4ub31dIHsKLSAgICBmYWlsICR0ZXN0MQotfSBlbHNlIHsKLSAgICBzZW5kX2xvZyAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXRcbiIKLSAgICB2ZXJib3NlICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIKLSAgICBjYXRjaCAiZXhlYyB0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQlmYWlsICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXRcbiIKLQl2ZXJib3NlICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IgotCWNhdGNoICJleGVjIGRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiIGV4ZWNfb3V0cHV0Ci0Jc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JICAgIHBhc3MgJHRlc3QxCi0JfSBlbHNlIHsKLQkgICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCSAgICB2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQkgICAgZmFpbCAkdGVzdDEKLQl9Ci0gICAgfQotfQotCi1pZiAhW2xkX3JlbG9jYXRlICRsZCB0bXBkaXIvY2R0ZXN0Lm8gey1VciB0bXBkaXIvY2R0ZXN0LWZvby5vIHRtcGRpci9jZHRlc3QtYmFyLm8gdG1wZGlyL2NkdGVzdC1tYWluLm99XSB7Ci0gICAgZmFpbCAkdGVzdDIKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9saW5rICRsZCB0bXBkaXIvY2R0ZXN0IHRtcGRpci9jZHRlc3Qub10gewotCWZhaWwgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXRcbiIKLQl2ZXJib3NlICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIKLQljYXRjaCAiZXhlYyB0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIgZXhlY19vdXRwdXQKLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCSAgICBmYWlsICR0ZXN0MgotCX0gZWxzZSB7Ci0JICAgIHNlbmRfbG9nICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0XG4iCi0JICAgIHZlcmJvc2UgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiCi0JICAgIGNhdGNoICJleGVjIGRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiIGV4ZWNfb3V0cHV0Ci0JICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0JICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQkJcGFzcyAkdGVzdDIKLQkgICAgfSBlbHNlIHsKLQkJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQkJZmFpbCAkdGVzdDIKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2FzbS5zIGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9hc20ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ZTE3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2FzbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLnRleHQKLQkuZ2xvYmFsIGZvbwotZm9vOgotCS5sb25nIDB4MTIzNDU2NzgKLQotLmRhdGEKLQkuZ2xvYmFsIGJhcgotYmFyOgotCS5sb25nIDB4ODc2NTQzMjEKLQotCS5sY29tbSBkdW1teSwgMHgxMgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZhZmUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvY2hlY2tzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgc2VjdGlvbiBjaGVja3MgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBOaWNrIENsaWZ0b24gKG5pY2tjQGN5Z251cy5jb20pCi0KLXByb2Mgc2VjdGlvbl9jaGVjayB7fSB7Ci0gICAgZ2xvYmFsIGxkX2ZsYWdzCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICAKLSAgICBzZXQgdGVzdCAiY2hlY2sgc2VjdGlvbnMgMSIKLSAgICAKLSAgICBzZXQgbGRmbGFncyAiLS1jaGVjay1zZWN0aW9ucyIKLQotICAgIGlmIHsgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL2FzbS5zIHRtcGRpci9hc20ub119IHsKLQl1bnJlc29sdmVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL2FzbS54ICIkbGRmbGFncyB0bXBkaXIvYXNtLm8iXSB7Ci0JZmFpbCAkdGVzdAotICAgIH0gZWxzZSB7Ci0JcGFzcyAkdGVzdAotICAgIH0KLQotICAgIHNldCB0ZXN0ICJjaGVjayBzZWN0aW9ucyAyIgotCi0gICAgIyBDaGFuZ2UgdGhlIGxpbmtlciBmbGFncyBzbyB0aGF0IG91ciAiYnVnZ3kiIGxpbmtlcgotICAgICMgc2NyaXB0IGlzIHVzZWQuCi0gICAgc2V0IGxkZmxhZ3MgIi0tY2hlY2stc2VjdGlvbnMgLVQgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdCAtZSBmb28iCi0KLSAgICAjIFBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgaW52b2tpbmcgbGRfc2ltcGxlX2xpbmsKLSAgICAjIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbWFzc2FnZSB0aGUgb3V0cHV0IGZ1dGhlci4KLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgLW8gdG1wZGlyL2FzbS54ICRsZGZsYWdzIHRtcGRpci9hc20ubyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgICMgTWFrZSBzdXJlIHRoYXQgd2UgZ290IHNvbWUgb3V0cHV0IGZyb20gdGhlIGxpbmtlcgotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlmYWlsICR0ZXN0Ci0gICAgfSAKLQotICAgICMgTm93IHJlbW92ZSBvdXIgZXhwZWN0ZWQgZXJyb3IgbWVzc2FnZQotICAgIHJlZ3N1YiAtYWxsICIuKjogc2VjdGlvbiAuZGF0YSAuKiBvdmVybGFwcyBzZWN0aW9uIC50ZXh0IC4qIiAkZXhlY19vdXRwdXQgIiIgZXhlY19vdXRwdXQKLQotICAgICMgQW5kIGNoZWNrIHRvIHNlZSBpZiBhbnl0aGluZyBlbHNlLCAodW5leHBlY3RlZCkgd2FzIGxlZnQKLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAkdGVzdAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICJVbmV4cGVjdGVkIGxpbmtlciBtZXNzYWdlKHMpOiAkZXhlY19vdXRwdXQiCi0JZmFpbCAkdGVzdAotICAgIH0KLX0KLQotc2VjdGlvbl9jaGVjawotCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3Mvc2NyaXB0IGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzZhMDguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNFQ1RJT05TIHsKLSAgICAgICAgLnRleHQgMHgxMDAgOiAgICAgICAgICAgICB7ICooLnRleHQpIH0KLQkuZGF0YSAweDEwMCA6IEFUICgweDEwMCkgIHsgKiguZGF0YSkgfQotCS5ic3MgIDB4MTAwIDogQVQgKDB4NDAwMCkgeyAqKC5ic3MpICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGRmZDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MTQgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC12ZXJzaW9uIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgRXJpYyBZb3VuZ2RhbGUgKGVyaWNAYW5kYW50ZS5qaWMuY29tKQotCi0jCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gdGhlbiB7cmV0dXJufQotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gb24gYSBjb3VwbGUgb2YgRUxGIHBsYXRmb3Jtcy4KLSMgU3F1YXJlIGJyYWNrZXQgZXhwcmVzc2lvbnMgc2VlbSB0byBjb25mdXNlIGlzdGFyZ2V0LgotIyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRlc3QgdGhhdCBpcyB1c2VkIGluIGxkLXNoYXJlZCwgQlRXLgotaWYgeyAhW2lzdGFyZ2V0IGk/ODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk/ODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtNjhrLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgbWlwcyotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotZWxmXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgYWxwaGEqLSotbGludXgqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgaT84Ni0qLWxpbnV4YW91dCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGk/ODYtKi1saW51eG9sZGxkKl0gXAotICAgICB8fCBbaXN0YXJnZXQgbTY4ay0qLWxpbnV4YW91dCpdIH0gewotICAgIHJldHVybgotfQotCi1pZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLXNldCBkaWZmIGRpZmYKLXNldCB0bXBkaXIgdG1wZGlyCi1zZXQgVk9CSkRVTVBfRkxBR1MgLS1wcml2YXRlLWhlYWRlcnMKLXNldCBET0JKRFVNUF9GTEFHUyAtLWR5bmFtaWMtc3ltcwotc2V0IFNPQkpEVU1QX0ZMQUdTIC0tc3ltcwotc2V0IHNoYXJlZCAtLXNoYXJlZAotc2V0IHNjcmlwdCAtLXZlcnNpb24tc2NyaXB0Ci0KLXByb2MgdGVzdF9hciB7IHRlc3QgbGliIG9iamVjdCBleHBlY3QgfSB7Ci0gICAgZ2xvYmFsIGFyCi0gICAgZ2xvYmFsIG5tCi0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGRpZmYKLQotICAgIHZlcmJvc2UgLWxvZyAiJGFyIC1jciAkdG1wZGlyLyRsaWIgJHRtcGRpci8kb2JqZWN0IgotICAgIGNhdGNoICJleGVjICRhciAtY3IgJHRtcGRpci8kbGliICR0bXBkaXIvJG9iamVjdCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbm0gLS1wcmludC1hcm1hcCAkdG1wZGlyLyRsaWIgfCBncmVwIFwiIGluIFwiIHwgZWdyZXAgXCJWRVJTXFx8YmFyXFx8Zm9vXCIgfCBzb3J0ID4gJHRtcGRpci9ubS5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkbm0gLS1wcmludC1hcm1hcCAkdG1wZGlyLyRsaWIgfCBncmVwIFxcXCBpblxcXCAgfCBlZ3JlcCBWRVJTXFxcfGJhclxcXHxmb28gfCBzb3J0ID4gJHRtcGRpci9ubS5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCWNhdGNoICJleGVjICRkaWZmIC1xICR0bXBkaXIvbm0ub3V0ICRzcmNkaXIvJHN1YmRpci8kZXhwZWN0IiBleGVjX291dHB1dAotCXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQkgICAgcGFzcyAkdGVzdAotCSAgICByZXR1cm4KLQl9IGVsc2UgewotCSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCWZhaWwgIiR0ZXN0IgotICAgIH0KLX0KLQotIwotIyBvYmpkdW1wX2VtcHR5c3ltc3R1ZmYKLSMJQ2hlY2sgbm9uLWR5bmFtaWMgc3ltYm9scyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBub25lIHdpdGggJ0AnLgotIwotcHJvYyBvYmpkdW1wX2VtcHR5c3ltc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgU09CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBTT0JKRFVNUF9GTEFHU10geyBzZXQgU09CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkU09CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvXEAvcCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9cQC9wIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSMgV2Ugc2hvdWxkbid0IGdldCBhbnl0aGluZyBoZXJlLgotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLSMgaXQgaXMgbm90IG5vcm1hbCB0byBjb21lIGhlcmUgLSB3ZSBoYXZlIG5vIG91dHB1dCB0byBjb21wYXJlLgotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXZlcmJvc2UgLWxvZyAib2JqZHVtcF9lbXB0eXN5bXN0dWZmOiBkaWQgbm90IGV4cGVjdCBhbnkgb3V0cHV0IGZyb20gb2JqZHVtcCIKLQlyZXR1cm4gMAotICAgIH0KLQotfQotCi0jCi0jIG9iamR1bXBfZW1wdHlkeW5zeW1zdHVmZgotIwlDaGVjayBkeW5hbWljIHN5bWJvbHMgYW5kIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSB3aXRoICdAJy4KLSMKLXByb2Mgb2JqZHVtcF9lbXB0eWR5bnN5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIERPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLQotICAgIGlmICFbaW5mbyBleGlzdHMgVk9CSkRVTVBfRkxBR1NdIHsgc2V0IFZPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSMgV2Ugc2hvdWxkbid0IGdldCBhbnl0aGluZyBoZXJlLgotCXJldHVybiAxCi0gICAgfSBlbHNlIHsgaWYgW3N0cmluZyBtYXRjaCAiKm9iamR1bXA6ICo6IG5vdCBhIGR5bmFtaWMgb2JqZWN0IiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLSMgaXQgaXMgbm90IG5vcm1hbCB0byBjb21lIGhlcmUgLSB3ZSBoYXZlIG5vIG91dHB1dCB0byBjb21wYXJlLgotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXZlcmJvc2UgLWxvZyAib2JqZHVtcF9lbXB0eWR5bnN5bXN0dWZmOiBkaWQgbm90IGV4cGVjdCBhbnkgb3V0cHV0IGZyb20gb2JqZHVtcCIKLQlyZXR1cm4gMAotICAgIH0gfQotfQotCi0jCi0jIG9iamR1bXBfZW1wdHl2ZXJzdHVmZgotIwlNYWtlIHN1cmUgdGhlcmUgaXMgbm8gdmVyc2lvbiBpbmZvcm1hdGlvbgotIwotcHJvYyBvYmpkdW1wX2VtcHR5dmVyc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgVk9CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmIHtbd2hpY2ggJG9iamR1bXBdID09IDB9IHRoZW4gewotCXBlcnJvciAiJG9iamR1bXAgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFZPQkpEVU1QX0ZMQUdTXSB7IHNldCBWT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRWT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WZXJzaW9uLyxcXFwkcCA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotIyBpdCBpcyBub3JtYWwgdG8gZmFpbCBoZXJlIC0gd2UgaGF2ZSBubyBvdXRwdXQgdG8gY29tcGFyZS4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7IGlmIHsgW3N0cmluZyBtYXRjaCAiKmxpYmMqIiAkZXhlY19vdXRwdXRdIH0gdGhlbiB7Ci0jIHRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGVyZSBpcyB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGxpYmMsIHNvIHdlCi0jIGNhbid0IHJlYWxseSBwZXJmb3JtIHRoaXMgdGVzdC4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JdmVyYm9zZSAtbG9nICJvYmpkdW1wX2VtcHR5dmVyc3R1ZmY6IGRpZCBub3QgZXhwZWN0IGFueSBvdXRwdXQgZnJvbSBvYmpkdW1wIgotCXJldHVybiAwCi0gICAgfSB9Ci0KLX0KLQotIwotIyBvYmpkdW1wX3N5bXN0dWZmCi0jCUR1bXAgbm9uLWR5bmFtaWMgc3ltYm9sIHN0dWZmIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBzYW5lLgotIwotcHJvYyBvYmpkdW1wX3N5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgZXhwZWN0ZmlsZSB9IHsKLSAgICBnbG9iYWwgU09CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmICFbaW5mbyBleGlzdHMgU09CSkRVTVBfRkxBR1NdIHsgc2V0IFNPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBncmVwIFxAIHwgc29ydCAgPiAkdG1wZGlyL29iamR1bXAub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBncmVwIFxAIHwgc29ydCAgPiAkdG1wZGlyL29iamR1bXAub3V0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQotIyBOb3cgZG8gYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiB0byBlZmZlY3RpdmVseSBkaWZmIHRoZSBkYXJuZWQgdGhpbmdzCi0jIFRoZSBzdHVmZiBjb21pbmcgZnJvbSB0aGUgZXhwZWN0ZmlsZSBpcyBhY3R1YWxseSBhIHJlZ2V4LCBzbyB3ZSBjYW4KLSMgc2tpcCBvdmVyIHRoZSBhY3R1YWwgYWRkcmVzc2VzIGFuZCBzbyBmb3J0aC4gIFRoaXMgaXMgY3VycmVudGx5IHZlcnkKLSMgc2ltcGxlbWluZGVkIC0gaXQgZXhwZWN0cyBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgaW4gdGVybXMgb2YgbGluZQotIyBudW1iZXJzLgotCi0JaWYgW2ZpbGUgZXhpc3RzICRleHBlY3RmaWxlXSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYSBbb3BlbiAkZXhwZWN0ZmlsZSByXQotCX0gZWxzZSB7Ci0JICAgIHBlcnJvciAiJGV4cGVjdGZpbGUgZG9lc24ndCBleGlzdCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0JCi0JaWYgW2ZpbGUgZXhpc3RzICR0bXBkaXIvb2JqZHVtcC5vdXRdIHRoZW4gewotCSAgICBzZXQgZmlsZV9iIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KLQl9IGVsc2UgewotCSAgICBwZXJyb3IgIiR0bXBkaXIvb2JqZHVtcC5vdXQgZG9lc24ndCBleGlzdCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0KLQl2ZXJib3NlICIjIERpZmYnaW5nOiAkZXhwZWN0ZmlsZSAkdG1wZGlyL29iamR1bXAub3V0IiAyCi0KLQlzZXQgZW9mIC0xCi0Jc2V0IGRpZmZlcmVuY2VzIDAKLQotCXdoaWxlIHsgW2dldHMgJGZpbGVfYSBsaW5lXSAhPSAkZW9mIH0gewotCSAgICBpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCQljb250aW51ZQotCSAgICB9IGVsc2UgewotCQlsYXBwZW5kIGxpc3RfYSAkbGluZQotCSAgICB9Ci0JfQotCWNsb3NlICRmaWxlX2EKLQotCXdoaWxlIHsgW2dldHMgJGZpbGVfYiBsaW5lXSAhPSAkZW9mIH0gewotCSAgICBpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCQljb250aW51ZQotCSAgICB9IGVsc2UgewotCQlsYXBwZW5kIGxpc3RfYiAkbGluZQotCSAgICB9Ci0JfQotCWNsb3NlICRmaWxlX2IKLQkKLQlmb3IgeyBzZXQgaSAwIH0geyAkaSA8IFtsbGVuZ3RoICRsaXN0X2FdIH0geyBpbmNyIGkgfSB7Ci0JICAgIHNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRpXQotCSAgICBzZXQgbGluZV9iIFtsaW5kZXggJGxpc3RfYiAkaV0KLQkgICAgCi0KLQkgICAgdmVyYm9zZSAiXHQkZXhwZWN0ZmlsZTogJGk6ICRsaW5lX2EiIDMKLQkgICAgdmVyYm9zZSAiXHQvdG1wL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIgMwotCSAgICBpZiBbcmVnZXhwICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCXZlcmJvc2UgLWxvZyAiXHQkZXhwZWN0ZmlsZTogJGk6ICRsaW5lX2EiCi0JCXZlcmJvc2UgLWxvZyAiXHQkdG1wZGlyL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIKLQkJCi0JCXJldHVybiAwCi0JICAgIH0KLQl9Ci0JCi0JaWYgeyBbbGxlbmd0aCAkbGlzdF9hXSAhPSBbbGxlbmd0aCAkbGlzdF9iXSB9IHsKLQkgICAgdmVyYm9zZSAtbG9nICJMaW5lIGNvdW50IgotCSAgICByZXR1cm4gMAotCX0KLQkKLQlpZiAkZGlmZmVyZW5jZXM8MSB0aGVuIHsKLQkgICAgcmV0dXJuIDEKLQl9Ci0JCi0JcmV0dXJuIDAKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotCi19Ci0KLSMKLSMgb2JqZHVtcF9keW1zeW1zdHVmZgotIwlEdW1wIGR5bmFtaWMgc3ltYm9sIHN0dWZmIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBzYW5lLgotIwotcHJvYyBvYmpkdW1wX2R5bnN5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgZXhwZWN0ZmlsZSB9IHsKLSAgICBnbG9iYWwgRE9CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmICFbaW5mbyBleGlzdHMgRE9CSkRVTVBfRkxBR1NdIHsgc2V0IERPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIHwgc29ydCB8IHVuaXEgID4gJHRtcGRpci9vYmpkdW1wLm91dCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCB8IHNvcnQgfCB1bmlxICA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCi0jIE5vdyBkbyBhIGxpbmUtYnktbGluZSBjb21wYXJpc29uIHRvIGVmZmVjdGl2ZWx5IGRpZmYgdGhlIGRhcm5lZCB0aGluZ3MKLSMgVGhlIHN0dWZmIGNvbWluZyBmcm9tIHRoZSBleHBlY3RmaWxlIGlzIGFjdHVhbGx5IGEgcmVnZXgsIHNvIHdlIGNhbgotIyBza2lwIG92ZXIgdGhlIGFjdHVhbCBhZGRyZXNzZXMgYW5kIHNvIGZvcnRoLiAgVGhpcyBpcyBjdXJyZW50bHkgdmVyeQotIyBzaW1wbGVtaW5kZWQgLSBpdCBleHBlY3RzIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSBpbiB0ZXJtcyBvZiBsaW5lCi0jIG51bWJlcnMuCi0KLQlpZiBbZmlsZSBleGlzdHMgJGV4cGVjdGZpbGVdIHRoZW4gewotCSAgICBzZXQgZmlsZV9hIFtvcGVuICRleHBlY3RmaWxlIHJdCi0JfSBlbHNlIHsKLQkgICAgd2FybmluZyAiJGV4cGVjdGZpbGUgZG9lc24ndCBleGlzdCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0JCi0JaWYgW2ZpbGUgZXhpc3RzICR0bXBkaXIvb2JqZHVtcC5vdXRdIHRoZW4gewotCSAgICBzZXQgZmlsZV9iIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KLQl9IGVsc2UgewotCSAgICBmYWlsICIkdG1wZGlyL29iamR1bXAub3V0IGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCi0JdmVyYm9zZSAiIyBEaWZmJ2luZzogJGV4cGVjdGZpbGUgJHRtcGRpci9vYmpkdW1wLm91dCIgMgotCi0Jc2V0IGVvZiAtMQotCXNldCBkaWZmZXJlbmNlcyAwCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2EgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9hCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2IgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2IgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9iCi0JCi0JZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9iXSB9IHsgaW5jciBpIH0gewotCSAgICBzZXQgbGluZV9iIFtsaW5kZXggJGxpc3RfYiAkaV0KLQkgICAgCi0jIFRoZSB0ZXN0cyBhcmUgcmlnZ2VkIHNvIHRoYXQgd2Ugc2hvdWxkIG5ldmVyIGV4cG9ydCBhIHN5bWJvbCB3aXRoIHRoZQotIyB3b3JkICdoaWRlJyBpbiBpdC4gIFRodXMgd2UganVzdCBzZWFyY2ggZm9yIGl0LCBhbmQgYmFpbCBpZiB3ZSBmaW5kIGl0LgotCSAgICBpZiBbcmVnZXhwICJoaWRlIiAkbGluZV9iXSB0aGVuIHsKLQkJdmVyYm9zZSAtbG9nICJcdCR0bXBkaXIvb2JqZHVtcC5vdXQ6ICRpOiAkbGluZV9iIgotCQkKLQkJcmV0dXJuIDAKLQkgICAgfQotCi0JICAgIHZlcmJvc2UgIlx0JGV4cGVjdGZpbGU6ICRpOiAkbGluZV9iIiAzCi0KLQkgICAgIyBXZSBjYW4ndCBhc3N1bWUgdGhhdCB0aGUgc29ydCBpcyBjb25zaXN0ZW50IGFjcm9zcwotCSAgICAjIHN5c3RlbXMsIHNvIHdlIG11c3QgY2hlY2sgZWFjaCByZWdleHAuICBXaGVuIHdlIGZpbmQgYQotCSAgICAjIHJlZ2V4cCwgd2UgbnVsbCBpdCBvdXQsIHNvIHdlIGRvbid0IG1hdGNoIGl0IHR3aWNlLgotCSAgICBmb3IgeyBzZXQgaiAwIH0geyAkaiA8IFtsbGVuZ3RoICRsaXN0X2FdIH0geyBpbmNyIGogfSB7Ci0JCXNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRqXQotCi0JCWlmIFtyZWdleHAgJGxpbmVfYSAkbGluZV9iXSB0aGVuIHsKLQkJICAgIGxyZXBsYWNlICRsaXN0X2EgJGogJGogIkNBTiBOT1QgTUFUQ0giCi0JCSAgICBicmVhawotCQl9Ci0JICAgIH0KLQotCSAgICBpZiB7ICRqID49IFtsbGVuZ3RoICRsaXN0X2FdIH0gewotCQl2ZXJib3NlIC1sb2cgIlx0JHRtcGRpci9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiCi0JCQotCQlyZXR1cm4gMAotCSAgICB9Ci0JfQotCQotCWlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiTGluZSBjb3VudCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0JCi0JaWYgJGRpZmZlcmVuY2VzPDEgdGhlbiB7Ci0JICAgIHJldHVybiAxCi0JfQotCQotCXJldHVybiAwCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLQotfQotCi0jCi0jIG9iamR1bXBfdmVyc2lvbnN0dWZmCi0jCUR1bXAgdmVyc2lvbiBkZWZpbml0aW9ucy9yZWZlcmVuY2VzIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBzYW5lLgotIwotcHJvYyBvYmpkdW1wX3ZlcnNpb25zdHVmZiB7IG9iamR1bXAgb2JqZWN0IGV4cGVjdGZpbGUgfSB7Ci0gICAgZ2xvYmFsIFZPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRvYmpkdW1wIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBWT0JKRFVNUF9GTEFHU10geyBzZXQgVk9CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAgPiAkdG1wZGlyL29iamR1bXAub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwID4gJHRtcGRpci9vYmpkdW1wLm91dCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0KLQkjIEl0J3MgT0sgaWYgdGhlcmUgYXJlIGV4dHJhIGxpbmVzIGluIHRoZSBhY3R1YWwgb3V0cHV0OyB0aGV5Ci0JIyBtYXkgY29tZSBmcm9tIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gbGliYy4gIFdlIHJlcXVpcmUgdGhhdAotCSMgZXZlcnkgbGluZSBpbiBFWFBFQ1RGSUxFIGFwcGVhciBpbiB0aGUgb3V0cHV0IGluIG9yZGVyLgotCi0Jc2V0IGYxIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KLQlzZXQgZjIgW29wZW4gJGV4cGVjdGZpbGUgcl0KLQlnZXRzICRmMiBsMgotCXdoaWxlIHsgW2dldHMgJGYxIGwxXSAhPSAtMSB9IHsKLQkgICAgaWYgeyBbc3RyaW5nIG1hdGNoICRsMiAkbDFdIH0gdGhlbiB7Ci0JCWlmIHsgW2dldHMgJGYyIGwyXSA9PSAtMSB9IHRoZW4gewotCQkgICAgY2xvc2UgJGYxCi0JCSAgICBjbG9zZSAkZjIKLQkJICAgIHJldHVybiAxCi0JCX0KLQkgICAgfQotCX0KLQotCSMgV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgd2l0aG91dCBzZWVpbmcgdGhlIGxpbmUgd2UKLQkjIGV4cGVjdGVkLiAgVGhpcyBpcyBhIHRlc3QgZmFpbHVyZS4KLQotCWNsb3NlICRmMQotCWNsb3NlICRmMgotCi0JdmVyYm9zZSAtbG9nICJEaWQgbm90IGZpbmQgXCIkbDJcIiIKLQlzZXQgZjEgW29wZW4gJHRtcGRpci9vYmpkdW1wLm91dCByXQotCXdoaWxlIHsgW2dldHMgJGYxIGwxXSAhPSAtMSB9IHsKLQkgICAgdmVyYm9zZSAtbG9nICRsMQotCX0KLQotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotcHJvYyBidWlsZF92ZXJzX2xpYiB7IHRlc3Qgc291cmNlIGxpYm5hbWUgb3RoZXIgbWFwZmlsZSB2ZXJleHAgdmVyc3ltZXhwIHN5bWV4cCB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0gICAgZ2xvYmFsIHNoYXJlZAotICAgIGdsb2JhbCBzY3JpcHQKLQotICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGxpYm5hbWUuc10gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiAhW2xkX2Fzc2VtYmxlICRhcyAkdG1wZGlyLyRsaWJuYW1lLnMgJHRtcGRpci8kbGlibmFtZS5vIF0gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRvdGhlcl0gdGhlbiB7Ci0Jc2V0IG90aGVyX2xpYiAiIgotICAgIH0gZWxzZSB7Ci0Jc2V0IG90aGVyX2xpYiAkdG1wZGlyLyRvdGhlcgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJG1hcGZpbGVdIHRoZW4gewotCXNldCBzY3JpcHRfYXJnICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgc2NyaXB0X2FyZyAiJHNjcmlwdCAkc3JjZGlyLyRzdWJkaXIvJG1hcGZpbGUiCi0gICAgfQotCi0gICAgaWYgeyFbbGRfc2ltcGxlX2xpbmsgJGxkICR0bXBkaXIvJGxpYm5hbWUuc28gIiRzaGFyZWQgJHRtcGRpci8kbGlibmFtZS5vICRvdGhlcl9saWIgJHNjcmlwdF9hcmciXX0gICAgIHsKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiB7IVtvYmpkdW1wX3ZlcnNpb25zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyZXhwIF19ICAgICB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyFbb2JqZHVtcF9keW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyc3ltZXhwIF19ICAgICB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkc3ltZXhwXSB0aGVuIHsKLQlpZiB7IVtvYmpkdW1wX2VtcHR5c3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5vIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiB7IVtvYmpkdW1wX3N5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUubyAkc3JjZGlyLyRzdWJkaXIvJHN5bWV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIHBhc3MgJHRlc3QKLSAgICAKLX0KLQotcHJvYyB0ZXN0X2xkZmFpbCB7IHRlc3QgZmxhZyBzb3VyY2UgZXhlY25hbWUgb3RoZXIgbWFwZmlsZSB3aHlmYWlsIH0gewotICAgIGdsb2JhbCBsZAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgYXMKLSAgICBnbG9iYWwgb2JqZHVtcAotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBDRkxBR1MKLSAgICBnbG9iYWwgc2NyaXB0Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRvdGhlcl0gdGhlbiB7Ci0Jc2V0IG90aGVyX2xpYiAiIgotICAgIH0gZWxzZSB7Ci0Jc2V0IG90aGVyX2xpYiAkdG1wZGlyLyRvdGhlcgotICAgIH0KLQotICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRmbGFnICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGV4ZWNuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHRtcGRpci8kZXhlY25hbWUucyAkdG1wZGlyLyRleGVjbmFtZS5vIF0gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIlRoaXMgbGluayBzaG91bGQgZmFpbCBiZWNhdXNlIG9mICR3aHlmYWlsIgotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkbWFwZmlsZV0gdGhlbiB7Ci0Jc2V0IHNjcmlwdF9hcmcgIiIKLSAgICB9IGVsc2UgewotCXNldCBzY3JpcHRfYXJnICIkc2NyaXB0ICRzcmNkaXIvJHN1YmRpci8kbWFwZmlsZSIKLSAgICB9Ci0KLSAgICBpZiB7IVtsZF9saW5rICRsZCAkdG1wZGlyLyRleGVjbmFtZSAiJHRtcGRpci8kZXhlY25hbWUubyAkb3RoZXJfbGliICRzY3JpcHRfYXJnIl19ICAgICB7Ci0JcGFzcyAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIGZhaWwgIiR0ZXN0IgotfQotCi1wcm9jIHRlc3RfYXNmYWlsIHsgdGVzdCBmbGFnIHNvdXJjZSBleGVjbmFtZSB3aHlmYWlsIH0gewotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBhcwotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBDRkxBR1MKLQotICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRmbGFnICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGV4ZWNuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICJUaGlzIGFzc2VtYmxlIHNob3VsZCBmYWlsIGJlY2F1c2Ugb2YgJHdoeWZhaWwiCi0gICAgY2F0Y2ggImV4ZWMgJGFzIC1vICR0bXBkaXIvJGV4ZWNuYW1lLm8gJHRtcGRpci8kZXhlY25hbWUucyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotICAgIHBhc3MgIiR0ZXN0IgotfQotCi1wcm9jIHRlc3Rfc3RyaXBfdmVyc19saWIgeyB0ZXN0IHNyY2xpYiBsaWJuYW1lIHZlcmV4cCB2ZXJzeW1leHAgfSB7Ci0gICAgZ2xvYmFsIHN0cmlwCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBvYmpkdW1wCi0KLSAgICB2ZXJib3NlIC1sb2cgImNwICR0bXBkaXIvJHNyY2xpYiAkdG1wZGlyLyRsaWJuYW1lLnNvIgotICAgIGV4ZWMgY3AgJHRtcGRpci8kc3JjbGliICR0bXBkaXIvJGxpYm5hbWUuc28KLQotICAgIHZlcmJvc2UgLWxvZyAiJHN0cmlwICR0bXBkaXIvJGxpYm5hbWUuc28iCi0gICAgY2F0Y2ggImV4ZWMgJHN0cmlwICR0bXBkaXIvJGxpYm5hbWUuc28iIGV4ZWNfb3V0cHV0Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCi0jIElmIHN0cmlwIHdlbnQgT0ssIHRoZW4gcnVuIHRoZSB1c3VhbCB0ZXN0cyBvbiB0aGUgdGhpbmcgdG8gbWFrZSBzdXJlIHRoYXQKLSMgaXQgaXMgc2FuZS4KLQlpZiB7IVtvYmpkdW1wX3ZlcnNpb25zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0JCi0JaWYgeyFbb2JqZHVtcF9keW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyc3ltZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0JCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgcGFzcyAkdGVzdAotfQotCi0KLXByb2MgYnVpbGRfZXhlYyB7IHRlc3Qgc291cmNlIGV4ZWNuYW1lIGZsYWdzIHNvbGlibmFtZSB2ZXJleHAgdmVyc3ltZXhwIHN5bWV4cCB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0KLSAgICBzZXQgc2hhcmVkIC0tc2hhcmVkCi0gICAgc2V0IHNjcmlwdCAtLXZlcnNpb24tc2NyaXB0Ci0gICAgaWYgIVtsZF9jb21waWxlICIkQ0MgLVMgJENGTEFHUyIgJHNyY2Rpci8kc3ViZGlyLyRzb3VyY2UgJHRtcGRpci8kZXhlY25hbWUuc10gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiAhW2xkX2Fzc2VtYmxlICRhcyAkdG1wZGlyLyRleGVjbmFtZS5zICR0bXBkaXIvJGV4ZWNuYW1lLm8gXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHNvbGlibmFtZV0gdGhlbiB7Ci0Jc2V0IHNvbGlibmFtZV9saWIgIiIKLSAgICB9IGVsc2UgewotCXNldCBzb2xpYm5hbWVfbGliICR0bXBkaXIvJHNvbGlibmFtZQotICAgIH0KLQotICAgIGlmIHshW2xkX2xpbmsgJGxkICR0bXBkaXIvJGV4ZWNuYW1lICIkZmxhZ3MgJHRtcGRpci8kZXhlY25hbWUubyAkc29saWJuYW1lX2xpYiJdfSAgICAgewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHZlcmV4cF0gdGhlbiB7Ci0jCi0jIE1ha2Ugc3VyZSB3ZSBnZXQgbm90aGluZyBiYWNrLgotIwotCWlmIHshW29iamR1bXBfZW1wdHl2ZXJzdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbb2JqZHVtcF92ZXJzaW9uc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgJHNyY2Rpci8kc3ViZGlyLyR2ZXJleHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICR2ZXJzeW1leHBdIHRoZW4gewotCWlmIHshW29iamR1bXBfZW1wdHlkeW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbb2JqZHVtcF9keW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSAkc3JjZGlyLyRzdWJkaXIvJHZlcnN5bWV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHN5bWV4cF0gdGhlbiB7Ci0JaWYgeyFbb2JqZHVtcF9lbXB0eXN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lLm8gXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCWlmIHshW29iamR1bXBfc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUubyAkc3JjZGlyLyRzdWJkaXIvJHN5bWV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIHBhc3MgJHRlc3QKLX0KLQotCi0jCi0jIEJhc2ljIHRlc3QgLSBidWlsZCBhIGxpYnJhcnkgd2l0aCB2ZXJzaW9uZWQgc3ltYm9scy4KLSMKLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzMSIgdmVyczEuYyB2ZXJzMSAiIiB2ZXJzMS5tYXAgdmVyczEudmVyIHZlcnMxLmRzeW0gdmVyczEuc3ltCi0KLQotIwotIyBUZXN0ICMyIC0gYnVpbGQgYSBsaWJyYXJ5LCBhbmQgbGluayBpdCBhZ2FpbnN0IHRoZSBsaWJyYXJ5IHdlIGJ1aWx0IGluIHN0ZXAKLSMgMS4KLSMKLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzMiIgdmVyczIuYyB2ZXJzMiB2ZXJzMS5zbyB2ZXJzMi5tYXAgdmVyczIudmVyIHZlcnMyLmRzeW0gIiIKLQotIwotIyBUZXN0ICMzIC0gYnVpbGQgYW4gZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgYWdhaW5zdCB2ZXJzMS5zby4KLSMKLWJ1aWxkX2V4ZWMgInZlcnMzIiB2ZXJzMy5jIHZlcnMzICIiIHZlcnMxLnNvIHZlcnMzLnZlciB2ZXJzMy5kc3ltICIiCi0KLSMKLSMgVGVzdCAjNCAtIE1ha2Ugc3VyZSBhIHZlcnNpb24gaW1wbGljaXRseSBkZWZpbmVkIGluIGFuIGV4ZWN1dGFibGUKLSMgY2F1c2VzIGEgdmVyc2lvbiBub2RlIHRvIGJlIGNyZWF0ZWQuICBWZXJpZnkgdGhpcyBib3RoIHdpdGggYW5kIHdpdGhvdXQKLSMgLS1leHBvcnQtZHluYW1pYy4KLSMKLQotIyBUaGlzIHRlc3QgZmFpbHMgb24gTUlQUy4gIE9uIHRoZSBNSVBTIHdlIG11c3QgcHV0IGZvbyBpbiB0aGUgZHluYW1pYwotIyBzeW1ib2wgdGFibGUsIHdoaWNoIHRoZSB0ZXN0IGRvZXMgbm90IGV4cGVjdC4KLXNldHVwX3hmYWlsICJtaXBzKi0qLSoiCi1idWlsZF9leGVjICJ2ZXJzNCIgdmVyczQuYyB2ZXJzNCAiIiAiIiAiIiAiIiB2ZXJzNC5zeW0KLQotYnVpbGRfZXhlYyAidmVyczRhIiB2ZXJzNC5jIHZlcnM0YSAiLWV4cG9ydC1keW5hbWljIiAiIiB2ZXJzNGEudmVyIHZlcnM0YS5kc3ltIHZlcnM0YS5zeW0KLQotCi0jCi0jIFRyeSBtdWx0aXBsZSBkZWZpbml0aW9ucyBmb29AQkFSIGFuZCBmb29AQEJBUiBhbmQgbWFrZSBzdXJlIHRoZSBsaW5rZXIKLSMgY29tcGxhaW5zLgotIwotdGVzdF9sZGZhaWwgInZlcnM1IiAiIiB2ZXJzNS5jIHZlcnM1ICIiICIiICJtdWx0aXBsZSBkZWZpbml0aW9uIG9mIGZvb0BWRVJTXzEuMiIKLQotIwotIwotIyBOb3cgYnVpbGQgYSB0ZXN0IHRoYXQgc2hvdWxkIHJlZmVyZW5jZSBhIGJ1bmNoIG9mIHZlcnNpb25lZCBzeW1ib2xzLgotIyBBbGwgb2YgdGhlbSBzaG91bGQgYmUgY29ycmVjdGx5IHJlZmVyZW5jZWQuCi0jCi1idWlsZF9leGVjICJ2ZXJzNiIgdmVyczYuYyB2ZXJzNiAiIiB2ZXJzMS5zbyB2ZXJzNi52ZXIgdmVyczYuZHN5bSB2ZXJzNi5zeW0KLQotIwotIyBBbm90aGVyIHRlc3QgdG8gdmVyaWZ5IHRoYXQgc29tZXRoaW5nIG1hZGUgbG9jYWwgdmlhICdsb2NhbCcgaXMgdHJ1bHkgbm90Ci0jIGFjY2Vzc2libGUuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczdhIiB2ZXJzN2EuYyB2ZXJzN2EgIiIgdmVyczcubWFwIHZlcnM3YS52ZXIgdmVyczdhLmRzeW0gdmVyczdhLnN5bQotCi10ZXN0X2xkZmFpbCAidmVyczciICIiIHZlcnM3LmMgdmVyczcgdmVyczdhLnNvICIiICJ1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGhpZGVfYSIKLQotCi0jCi0jIFRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byB2ZXJpZnkgdGhhdCB3ZSBjYW4gcGFzcyBhIGxpbmtlciBzY3JpcHQgb24gdGhlCi0jIGNvbW1hbmQgbGluZSBhcyBpZiBpdCB3ZXJlIGEgbm9ybWFsIC5vIGZpbGUuCi0jCi1jYXRjaCAiZXhlYyBjcCAkc3JjZGlyLyRzdWJkaXIvdmVyczgubWFwICR0bXBkaXIvIiBpZ25vcmVfb3V0cHV0Ci1idWlsZF92ZXJzX2xpYiAidmVyczgiIHZlcnMxLmMgdmVyczggdmVyczgubWFwICIiIHZlcnM4LnZlciB2ZXJzMS5kc3ltIHZlcnMxLnN5bQotCi0jCi0jIFRoaXMgdGVzdCB0cmllcyB0byBtYWtlIHN1cmUgdGhhdCB2ZXJzaW9uIHJlZmVyZW5jZXMgdG8gdmVyc2lvbmVkIHN5bWJvbHMKLSMgZG9uJ3QgY29sbGlkZSB3aXRoIGRlZmF1bHQgZGVmaW5pdGlvbnMgd2l0aCB0aGUgc2FtZSBzeW1ib2wuCi0jCi1idWlsZF9leGVjICJ2ZXJzOSIgdmVyczkuYyB2ZXJzOSAiLWV4cG9ydC1keW5hbWljIiAiIiB2ZXJzOS52ZXIgdmVyczkuZHN5bSB2ZXJzOS5zeW0KLQotCi0jCi0jIFRyeSBhbmQgdXNlIGEgbm9uLWV4aXN0YW50IHZlcnNpb24gbm9kZS4gIFRoZSBsaW5rZXIgc2hvdWxkIGZhaWwgd2l0aAotIyBhbiBlcnJvciBtZXNzYWdlLgotIwotdGVzdF9sZGZhaWwgInZlcnMxMCIgIi1ERE9fVEVTVDEwIiB2ZXJzMS5jIHZlcnMxMCAiIiAidmVyczEubWFwIC0tc2hhcmVkIiAiaW52YWxpZCB2ZXJzaW9uIgotCi0jCi0jIFRyeSBhbmQgc29tZSB0aGluZ3MgdGhlIGFzc2VtYmxlciBzaG91bGQgY29tcGxhaW4gYWJvdXQuCi0jCi10ZXN0X2FzZmFpbCAidmVyczExIiAiLURET19URVNUMTEiIHZlcnMxLmMgdmVyczExICJubyBAIGluIHN5bXZlciIKLQotdGVzdF9hc2ZhaWwgInZlcnMxMiIgIi1ERE9fVEVTVDEyIiB2ZXJzMS5jIHZlcnMxMiAiZXh0ZXJuIHZlcnNpb24gZGVmaW5pdGlvbiIKLQotIwotIyBQdXQgYSBzaGFyZWQgbGlicmFyeSBpbiBhbiBhcmNoaXZlIGxpYnJhcnksIGFuZCBtYWtlIHN1cmUgdGhlIGdsb2JhbAotIyBhcmNoaXZlIHN5bWJvbCB0YWJsZSBpcyBzYW5lLgotIwotdGVzdF9hciAiYXIgd2l0aCB2ZXJzaW9uZWQgc29saWIiIHZlcnMxMy5hIHZlcnMxLnNvIHZlcnMxMy5hc3ltCi0KLSMKLSMgU3RyaXAgYSBzaGFyZWQgbGlicmFyeSwgYW5kIG1ha2Ugc3VyZSB3ZSBkaWRuJ3Qgc2NyZXcgc29tZXRoaW5nIHVwIGluIHRoZXJlLgotIwotdGVzdF9zdHJpcF92ZXJzX2xpYiAidmVyczE0IiB2ZXJzMS5zbyB2ZXJzMTQgdmVyczEudmVyIHZlcnMxLmRzeW0gCi0KLQotIwotIyBCdWlsZCBhbm90aGVyIHRlc3Qgd2l0aCBzb21lIHZlcnNpb25lZCBzeW1ib2xzLiAgSGVyZSB3ZSBhcmUgZ29pbmcgdG8gCi0jIHRyeSBhbmQgb3ZlcnJpZGUgc29tZXRoaW5nIGZyb20gdGhlIGxpYnJhcnksIGFuZCB3ZSBzaG91bGRuJ3QgZ2V0Ci0jIGFueSBlcnJvcnMuCi0jCi1idWlsZF9leGVjICJ2ZXJzMTUiIHZlcnMxNS5jIHZlcnMxNSAiIiB2ZXJzMS5zbyB2ZXJzMTUudmVyIHZlcnMxNS5kc3ltIHZlcnMxNS5zeW0KLQotIwotIyBUZXN0IHRoYXQgd2hlbiB3ZSBvdmVycmlkZSBhIHZlcnNpb25lZCBzeW1ib2wgZnJvbSB0aGUgbGlicmFyeSB0aGlzCi0jIHN5bWJvbCBhcHBlYXJzIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBvZiB0aGUgZXhlY3V0YWJsZS4KLSMKLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzMTZhIiB2ZXJzMTZhLmMgdmVyczE2YSAiIiB2ZXJzMTYubWFwIHZlcnMxNmEudmVyIHZlcnMxNmEuZHN5bSAiIgotYnVpbGRfZXhlYyAidmVyczE2IiB2ZXJzMTYuYyB2ZXJzMTYgIiIgdmVyczE2YS5zbyAiIiB2ZXJzMTYuZHN5bSAiIgotCi0jIFRlc3QgYSB3ZWFrIHZlcnNpb25lZCBzeW1ib2wuCi1idWlsZF92ZXJzX2xpYiAidmVyczE3IiB2ZXJzMTcuYyB2ZXJzMTcgIiIgdmVyczE3Lm1hcCB2ZXJzMTcudmVyIHZlcnMxNy5kc3ltICIiCi1idWlsZF92ZXJzX2xpYiAidmVyczE4IiB2ZXJzMTguYyB2ZXJzMTggdmVyczE3LnNvIHZlcnMxOC5tYXAgdmVyczE4LnZlciB2ZXJzMTguZHN5bSB2ZXJzMTguc3ltCi1idWlsZF9leGVjICJ2ZXJzMTkiIHZlcnMxOS5jIHZlcnMxOSAiLXJwYXRoIC4iIHZlcnMxOC5zbyB2ZXJzMTkudmVyIHZlcnMxOS5kc3ltICIiCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3YmMzYi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBCYXNpYyB0ZXN0IG9mIHZlcnNpb25pbmcuICBUaGUgaWRlYSB3aXRoIHRoaXMgaXMgdGhhdCB3ZSBkZWZpbmUKLSAqIGEgYnVuY2ggb2YgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgc3ltYm9sLCBhbmQgd2UgY2FuIHRoZW9yZXRpY2FsbHkKLSAqIHRoZW4gbGluayBhcHBsaWNhdGlvbnMgYWdhaW5zdCB2YXJ5aW5nIHNldHMgb2YgdGhlc2UuCi0gKi8KLWNvbnN0IGNoYXIgKiBzaG93X2JhcjEgPSAiYXNkZiI7Ci1jb25zdCBjaGFyICogc2hvd19iYXIyID0gImFzZGYiOwotCi1leHRlcm4gaW50IG5ldzJfZm9vKCk7Ci1leHRlcm4gaW50IGJhcjMzKCk7Ci0KLWludAotYmFyKCkKLXsKLQlyZXR1cm4gMzsKLX0KLQotLyoKLSAqIFRoZSAnaGlkZScgcHJlZml4IGlzIHNvbWV0aGluZyBzbyB0aGF0IHdlIGNhbiBhdXRvbWF0aWNhbGx5IHNlYXJjaCB0aGUKLSAqIHN5bWJvbCB0YWJsZSBhbmQgdmVyaWZ5IHRoYXQgbm9uZSBvZiB0aGVzZSBzeW1ib2xzIHdlcmUgYWN0dWFsbHkgZXhwb3J0ZWQuCi0gKi8KLWludAotaGlkZV9vcmlnaW5hbF9mb28oKQotewotCXJldHVybiAxK2JhcigpOwotCi19Ci0KLWludAotaGlkZV9vbGRfZm9vKCkKLXsKLQlyZXR1cm4gMTArYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX29sZF9mb28xKCkKLXsKLQlyZXR1cm4gMTAwK2JhcigpOwotCi19Ci0KLWludAotaGlkZV9uZXdfZm9vKCkKLXsKLQlyZXR1cm4gMTAwMCtiYXIoKTsKLQotfQotCi1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb3JpZ2luYWxfZm9vLHNob3dfZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28sc2hvd19mb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vbGRfZm9vMSxzaG93X2Zvb0BWRVJTXzEuMiIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX25ld19mb28sc2hvd19mb29AQFZFUlNfMi4wIik7Ci0KLQotCi0jaWZkZWYgRE9fVEVTVDEwCi0vKiBJbiB0ZXN0IDEwLCB3ZSB0cnkgYW5kIGRlZmluZSBhIG5vbi1leGlzdGFudCB2ZXJzaW9uIG5vZGUuICBUaGUgbGlua2VyCi0gKiBzaG91bGQgY2F0Y2ggdGhpcyBhbmQgY29tcGxhaW4uICovCi1pbnQKLWhpZGVfbmV3X2JvZ3VzX2ZvbygpCi17Ci0JcmV0dXJuIDEwMDArYmFyKCk7Ci0KLX0KLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9uZXdfYm9ndXNfZm9vLHNob3dfZm9vQFZFUlNfMi4yIik7Ci0jZW5kaWYKLQotCi0KLQotI2lmZGVmIERPX1RFU1QxMQotLyoKLSAqIFRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byBjYXRjaCBhIGNvdXBsZSBvZiBzeW50YWN0aWMgZXJyb3JzLiAgVGhlIGFzc2VtYmxlcgotICogc2hvdWxkIGNvbXBsYWluIGFib3V0IGJvdGggb2YgdGhlIGRpcmVjdGl2ZXMgYmVsb3cuCi0gKi8KLXZvaWQKLXh5enp6KCkKLXsKLSAgbmV3Ml9mb28oKTsKLSAgYmFyMzMoKTsKLX0KLQotX19hc21fXygiLnN5bXZlciBuZXcyX2Zvbyxmb29WRVJTXzIuMCIpOwotX19hc21fXygiLnN5bXZlciBiYXIzMyxiYXJAQFZFUlNfMi4wIik7Ci0jZW5kaWYKLQotI2lmZGVmIERPX1RFU1QxMgotLyoKLSAqIFRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byBjYXRjaCBhIGNvdXBsZSBvZiBzeW50YWN0aWMgZXJyb3JzLiAgVGhlIGFzc2VtYmxlcgotICogc2hvdWxkIGNvbXBsYWluIGFib3V0IGJvdGggb2YgdGhlIGRpcmVjdGl2ZXMgYmVsb3cuCi0gKi8KLXZvaWQKLXh5enp6KCkKLXsKLSAgbmV3Ml9mb28oKTsKLSAgYmFyMzMoKTsKLX0KLQotX19hc21fXygiLnN5bXZlciBiYXIzMyxiYXJAQFZFUlNfMi4wIik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQ0MzRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18yLjAgICAgVkVSU18yLjAKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChCYXNlXCkgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4yXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgRE8gKC5zP2RhdGF8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICBzaG93X2JhcjEKLVswLTlhLWZdKiBnICAgIERPICgucz9kYXRhfFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgc2hvd19iYXIyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzM3YmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotVkVSU18xLjEgewotCSBnbG9iYWw6Ci0JCSBmb28xOwotCSBsb2NhbDoKLQkJIGhpZGVfb2xkKjsgCi0JCSBoaWRlX29yaWdpbmFsKjsgCi0JCSBoaWRlX25ldyo7IAotfTsKLQotVkVSU18xLjIgewotCQkgZm9vMjsKLX0gVkVSU18xLjE7Ci0KLVZFUlNfMi4wIHsKLQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOwotfSBWRVJTXzEuMjsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmZjg1NS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTczMTJiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBhMjY4ODFmIHRtcGRpci92ZXJzMS5zbwotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKLTMgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0JVkVSU18xLjEgCi00IDB4MDAgMHgwYTc5MjJiMCBWRVJTXzIuMAotCVZFUlNfMS4yIAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTMuYXN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ2MTQ0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotVkVSU18xLjEgaW4gdmVyczEuc28KLVZFUlNfMS4yIGluIHZlcnMxLnNvCi1WRVJTXzIuMCBpbiB2ZXJzMS5zbwotYmFyIGluIHZlcnMxLnNvCi1zaG93X2JhcjEgaW4gdmVyczEuc28KLXNob3dfYmFyMiBpbiB2ZXJzMS5zbwotc2hvd19mb29AIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BAVkVSU18yLjAgaW4gdmVyczEuc28KLXNob3dfZm9vQFZFUlNfMS4xIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BWRVJTXzEuMiBpbiB2ZXJzMS5zbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyMmNhYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byBtYWtlIHN1cmUgdGhhdCBpZiB3ZSBleHRlcm5hbGx5IHJlZmVyZW5jZSBhIHZlcnNpb25lZCBzeW1ib2wKLSAqIHRoYXQgd2UgYWx3YXlzIGdldCB0aGUgcmlnaHQgb25lLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1mb29fMSgpCi17Ci0gIHJldHVybiAxMDM0OwotfQotCi1pbnQKLWZvb18yKCkKLXsKLSAgcmV0dXJuIDEzNDM7Ci19Ci0KLWludAotZm9vXzMoKQotewotICByZXR1cm4gMTMzNDsKLX0KLQotaW50Ci1tYWluKCkKLXsKLSAgcHJpbnRmKCJFeHBlY3QgNCwgICAgZ2V0ICVkXG4iLCBmb29fMSgpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTMsICAgZ2V0ICVkXG4iLCBmb29fMigpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTAzLCAgZ2V0ICVkXG4iLCBmb29fMygpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgZm9vXzEsc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18yLHNob3dfZm9vQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18zLHNob3dfZm9vQEBWRVJTXzEuMiIpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ZTE1Yy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjEgICAgVkVSU18xLjEKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4yICAgIFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoQmFzZVwpICAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4xXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMS4yICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmFiNjIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0AKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AVkVSU18xLjEKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AQFZFUlNfMS4yCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyZWM1OC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUudmVyCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGQ4YTI2MDUgdG1wZGlyL3ZlcnMxNQotMiAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLTMgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjhiYzYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1pbnQgc2hvd19iYXIgKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci1leHRlcm4gaW50IHNob3dfZm9vICgpOwotCi1pbnQgbWFpbiAoKQotewotICByZXR1cm4gc2hvd19mb28gKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQyNGMzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMC05YS1mXSogZyAgICBERiAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiggIEJhc2UgICAgICAgKT8gKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfYmFyCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiggICAgICAgICAgICAgKT8gKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2MzMyZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1WRVJTXzEuMSB7Ci0gIGdsb2JhbDogc2hvd19iYXI7Ci19OwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTNiMWZkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotaW50IHNob3dfYmFyICgpCi17Ci0gIHJldHVybiAxOwotfQotaW50IHNob3dfZm9vICgpCi17Ci0gIHJldHVybiBzaG93X2JhciAoKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4ZGY0Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVswLTlhLWZdKiBnICAgIERPIChcLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzFcLjEgICAgVkVSU18xXC4xCi1bMC05YS1mXSogZyAgICBERiAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xXC4xICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2JhcgotWzAtOWEtZl0qIGcgICAgREYgKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIEJhc2UgICAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjZjFkZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDA2MDFjZmJmIHRtcGRpci92ZXJzMTZhLnNvCi0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjZDY0Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcuYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW50Ci1zaG93X2ZvbyAoKQotewotICByZXR1cm4gOTk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGVjYzBhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3Lm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjOWNmNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1WRVJTXzIuMCB7Ci0JIGdsb2JhbDoKLQkJIHNob3dfZm9vOwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhkNTljLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwMjYwNWQzZiB0bXBkaXIvdmVyczE3LnNvCi0yIDB4MDAgMHgwYTc5MjJiMCBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkY2MyNS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLWludAotYmFyICgpCi17Ci0gIHJldHVybiAzOwotfQotCi0jcHJhZ21hIHdlYWsgaGlkZV9vcmlnaW5hbF9mb28KLQotaW50Ci1oaWRlX29yaWdpbmFsX2ZvbyAoKQotewotICByZXR1cm4gMSArIGJhciAoKTsKLX0KLQotI3ByYWdtYSB3ZWFrIGhpZGVfb2xkX2ZvbwotCi1pbnQKLWhpZGVfb2xkX2ZvbyAoKQotewotICByZXR1cm4gMTAgKyBiYXIoKTsKLX0KLQotI3ByYWdtYSB3ZWFrIGhpZGVfb2xkX2ZvbzEKLQotaW50Ci1oaWRlX29sZF9mb28xICgpCi17Ci0gIHJldHVybiAxMDAgKyBiYXIgKCk7Ci19Ci0KLSNwcmFnbWEgd2VhayBoaWRlX25ld19mb28KLQotaW50Ci1oaWRlX25ld19mb28gKCkKLXsKLSAgcmV0dXJuIDEwMDAgKyBiYXIgKCk7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vcmlnaW5hbF9mb28sc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb2xkX2ZvbyxzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28xLHNob3dfZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfbmV3X2ZvbyxzaG93X2Zvb0BAVkVSU18yLjAiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjM2FkN2IuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVswLTlhLWZdKiAgdyAgIERGIChcKlVORFwqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjEgICAgVkVSU18xLjEKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4yICAgIFZFUlNfMS4yCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAotWzAtOWEtZl0qICB3ICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKEJhc2VcKSAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiAgdyAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChWRVJTXzEuMVwpICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogIHcgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjJcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4Lm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzJiMGUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLVZFUlNfMS4xIHsKLQkgZ2xvYmFsOgotCQkgZm9vMTsKLQkgbG9jYWw6Ci0JCSBoaWRlX29sZCo7IAotCQkgaGlkZV9vcmlnaW5hbCo7IAotCQkgaGlkZV9uZXcqOyAKLX07Ci0KLVZFUlNfMS4yIHsKLQkJIGZvbzI7Ci19IFZFUlNfMS4xOwotCi1WRVJTXzIuMCB7Ci19IFZFUlNfMS4yOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Y2VmZGYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzAtOWEtZl0qICB3ICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0AKLVswLTlhLWZdKiAgdyAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AVkVSU18xLjEKLVswLTlhLWZdKiAgdyAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AVkVSU18xLjIKLVswLTlhLWZdKiAgdyAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTgudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1Mjk5Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTgudmVyCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDAyNjA4ZDNmIHRtcGRpci92ZXJzMTguc28KLTIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCi0zIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgotCVZFUlNfMS4xIAotNCAweDAyIDB4MGE3OTIyYjAgVkVSU18yLjAKLQlWRVJTXzEuMiAKLQotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMTcuc286Ci0gICAgMHgwYTc5MjJiMCAweDAwIDA1IFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYmYyN2EuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotZXh0ZXJuIGludCBzaG93X2ZvbyAoKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIHByaW50ZiAoIiVkXG4iLCBzaG93X2ZvbyAoKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljMjY0Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2JkYzg4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVZlcnNpb24gUmVmZXJlbmNlczoKLSAgcmVxdWlyZWQgZnJvbSAqdG1wZGlyL3ZlcnMxNy5zbzoKLSAgICAweDBhNzkyMmIwIDB4MDAgMDIgVkVSU18yLjAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGE1NGNiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogVGVzdCBmdW5jdGlvbi4gIFRoaXMgaXMgYnVpbHQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgcmVmZXJlbmNlcyBhCi0gKiB2ZXJzaW9uZWQgc3ltYm9sIGZvbyB0aGF0IGlzIGluIHRlc3Quc28uCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gaW50IHNob3dfZm9vICgpOwotCi12b2lkCi1zaG93X3h5enp5KCkKLXsKLSAgcHJpbnRmKCIlZCIsIHNob3dfZm9vKCkpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTg1YzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU19YWFhfMS4xIFZFUlNfWFhYXzEuMQotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU19YWFhfMS4xICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X3h5enp5CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTdkN2UuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLVZFUlNfWFhYXzEuMSB7Ci0JCSBzaG93X3h5enp5OwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyNjM0My4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwYTI2MTgxZiB0bXBkaXIvdmVyczIuc28KLTIgMHgwMCAweDA4Nzg1YjUxIFZFUlNfWFhYXzEuMQotCi1WZXJzaW9uIFJlZmVyZW5jZXM6Ci0gIHJlcXVpcmVkIGZyb20gdG1wZGlyL3ZlcnMxLnNvOgotICAgIDB4MGE3OTIyYjAgMHgwMCAwMyBWRVJTXzIuMAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiNGRhZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyoKLSAqIE1haW4gcHJvZ3JhbSBmb3IgdGVzdDEsIHRlc3QyLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotZXh0ZXJuIGludCBzaG93X2ZvbyAoKTsKLQotaW50Ci1tYWluKCkKLXsKLSAgcHJpbnRmKCIlZFxuIiwgc2hvd19mb28oKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YzI2NDIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyMzBlZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVZlcnNpb24gUmVmZXJlbmNlczoKLSAgcmVxdWlyZWQgZnJvbSB0bXBkaXIvdmVyczEuc286Ci0gICAgMHgwYTc5MjJiMCAweDAwIDAyIFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTNmMmViLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gbWFrZSBzdXJlIHRoYXQgYSB2ZXJzaW9uZWQgc3ltYm9sIGRlZmluaXRpb24gaW4gYW4KLSAqIGFwcGxpY2F0aW9uIGNvcnJlY3RseSBkZWZpbmVzIHRoZSB2ZXJzaW9uIG5vZGUsIGlmIGFuZCBvbmx5IGlmCi0gKiB0aGUgYWN0dWFsIHN5bWJvbCBpcyBleHBvcnRlZC4gIFRoaXMgaXMgYnVpbHQgYm90aCB3aXRoIGFuZCB3aXRob3V0Ci0gKiAtZXhwb3J0LWR5bmFtaWMuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gaW50IGZvbyAoKTsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQFZFUlNfMi4wIik7Ci0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiJWRcbiIsIGZvbygpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDk0NDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y5ZmRhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDk0NDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NmNlZGMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBkOGEyNmUxIHRtcGRpci92ZXJzNGEKLTIgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzZlYTQwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gdmVyaWZ5IHRoYXQgZm9vQEJBUiBhbmQgZm9vQEBCQVIgYXJlIGNvcnJlY3RseSBkZXRlY3RlZAotICogYXMgYSBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbC4KLSAqLwotY29uc3QgY2hhciAqIGJhcjEgPSAiYXNkZiI7Ci1jb25zdCBjaGFyICogYmFyMiA9ICJhc2RmIjsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi1pbnQKLW9yaWdpbmFsX2ZvbygpCi17Ci0JcmV0dXJuIDErYmFyKCk7Ci0KLX0KLQotaW50Ci1vbGRfZm9vKCkKLXsKLQlyZXR1cm4gMTArYmFyKCk7Ci0KLX0KLQotaW50Ci1vbGRfZm9vMSgpCi17Ci0JcmV0dXJuIDEwMCtiYXIoKTsKLQotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2ZvbzEsZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG5ld19mb28sZm9vQEBWRVJTXzEuMiIpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0OGRmOS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIFRlc3RjYXNlIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIHdlIGV4dGVybmFsbHkgcmVmZXJlbmNlIGEgdmVyc2lvbmVkIHN5bWJvbAotICogdGhhdCB3ZSBhbHdheXMgZ2V0IHRoZSByaWdodCBvbmUuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gaW50IGZvb18xKCk7Ci1leHRlcm4gaW50IGZvb18yKCk7Ci1leHRlcm4gaW50IGZvb18zKCk7Ci1leHRlcm4gaW50IGZvb180KCk7Ci0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiRXhwZWN0IDQsICAgIGdldCAlZFxuIiwgZm9vXzEoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEzLCAgIGdldCAlZFxuIiwgZm9vXzIoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEwMywgIGdldCAlZFxuIiwgZm9vXzMoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEwMDMsIGdldCAlZFxuIiwgZm9vXzQoKSk7Ci0gIHJldHVybiAwOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIGZvb18xLHNob3dfZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBmb29fMixzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBmb29fMyxzaG93X2Zvb0BWRVJTXzEuMiIpOwotX19hc21fXygiLnN5bXZlciBmb29fNCxzaG93X2Zvb0BWRVJTXzIuMCIpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODUxZDQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogICAgICAgICAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMS4yICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMS4xICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I1Y2M3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0AKLVswXSogKkY/ICpcKlVORFwqCVswXSogc2hvd19mb29AVkVSU18xLjEKLVswXSogKkY/ICpcKlVORFwqCVswXSogc2hvd19mb29AVkVSU18xLjIKLVswXSogKkY/ICpcKlVORFwqCVswXSogc2hvd19mb29AVkVSU18yLjAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMmI0Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVZlcnNpb24gUmVmZXJlbmNlczoKLSAgcmVxdWlyZWQgZnJvbSB0bXBkaXIvdmVyczEuc286Ci0gICAgMHgwYTc5MjdiMSAweDAwID8/IFZFUlNfMS4xCi0gICAgMHgwYTc5MjdiMiAweDAwID8/IFZFUlNfMS4yCi0gICAgMHgwYTc5MjJiMCAweDAwID8/IFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDMxNmM5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogVGVzdCBwcm9ncmFtIHRoYXQgZ29lcyB3aXRoIHRlc3Q3LnNvCi0gKi8KLQotZXh0ZXJuIGludCBoaWRlX2EoKTsKLWV4dGVybiBpbnQgc2hvd19iKCk7Ci0KLWludAotbWFpbigpCi17Ci0gIHJldHVybiBoaWRlX2EoMSkgKyBzaG93X2IoMSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZkNTAxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVkVSU18xIHsKLQlnbG9iYWw6Ci0JCXNob3dfYiA7Ci0JbG9jYWw6Ci0JCWhpZGVfYTsKLX07CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmVlOGM3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIFRlc3Qgc3VwcGxpZWQgYnkgVWxyaWNoLiAgVmVyaWZ5IHRoYXQgd2UgY2FuIGNvcnJlY3RseSBmb3JjZSAnYScKLSAqIHRvIGxvY2FsIHNjb3BlLgotICovCi1pbnQKLV9fYV9pbnRlcm5hbCAoaW50IGUpCi17Ci0gIHJldHVybiBlICsgMTA7Ci19Ci0KLWludAotX19iX2ludGVybmFsIChpbnQgZSkKLXsKLSAgcmV0dXJuIGUgKyA0MjsKLX0KLQotYXNtICgiLnN5bXZlciBfX2FfaW50ZXJuYWwsaGlkZV9hQEBWRVJTXzEiKTsKLWFzbSAoIi5zeW12ZXIgX19iX2ludGVybmFsLHNob3dfYkBAVkVSU18xIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY5NmM3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEgICAgICBWRVJTXzEKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMSAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2IKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2Euc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliZDYxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/aGlkZV9hQEBWRVJTXzEKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iQEBWRVJTXzEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2VmOGE4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwMjY5ZmQzZiB0bXBkaXIvdmVyczdhLnNvCi0yIDB4MDAgMHgwNWFhNzkyMSBWRVJTXzEKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDU4NmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW50Ci1tYWluKCkKLXsKLSAgcmV0dXJuIGEoMSkgKyBiKDEpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjM1OTU1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLVZFUlNJT04gewotCVZFUlNfMS4xIHsKLQkJIGdsb2JhbDoKLQkJCSBmb28xOwotCQkgbG9jYWw6Ci0JCQkgaGlkZV9vbGQqOyAKLQkJCSBoaWRlX29yaWdpbmFsKjsgCi0JCQkgaGlkZV9uZXcqOyAKLQl9OwotCQotCVZFUlNfMS4yIHsKLQkJCSBmb28yOwotCX0gVkVSU18xLjE7Ci0JCi0JVkVSU18yLjAgewotCQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOwotCX0gVkVSU18xLjI7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTkwMjMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgudmVyCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGEyNmY4MWYgdG1wZGlyL3ZlcnM4LnNvCi0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotMyAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLQlWRVJTXzEuMSAKLTQgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCi0JVkVSU18xLjIgCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWYxNDAyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gdmVyaWZ5IHRoYXQgcmVmZXJlbmNlIHRvIGZvb0BCQVIgYW5kIGEgZGVmaW5pdGlvbiBvZiBmb29AQEJBUgotICogYXJlIG5vdCB0cmVhdGVkIGFzIGEgbXVsdGlwbGUgZGVmLgotICovCi1jb25zdCBjaGFyICogYmFyMSA9ICJhc2RmIjsKLWNvbnN0IGNoYXIgKiBiYXIyID0gImFzZGYiOwotCi1leHRlcm4gaW50IG9sZF9mb28xKCk7Ci0KLWludAotYmFyKCkKLXsKLQlyZXR1cm4gMzsKLX0KLQotaW50Ci1vcmlnaW5hbF9mb28oKQotewotCXJldHVybiAxK2JhcigpOwotCi19Ci0KLWludAotb2xkX2ZvbygpCi17Ci0JcmV0dXJuIDEwK2JhcigpOwotCi19Ci0KLWludAotbmV3X2ZvbygpCi17Ci0JcmV0dXJuIDEwMDArYmFyKCk7Ci0KLX0KLQotaW50Ci1tYWluKCkKLXsKLSAgb2xkX2ZvbzEoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2ZvbzEsZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG5ld19mb28sZm9vQEBWRVJTXzEuMiIpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTMwMDIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjEgICAgVkVSU18xLjEKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4yICAgIFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMS4yICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzMTUxNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswXSogKkY/ICpcKlVORFwqCVswXSogZm9vQFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0AKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0BAVkVSU18xLjIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczYmE3Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwNGQ4YTI2OSB0bXBkaXIvdmVyczkKLTIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCi0zIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvZW1waWMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL2VtcGljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1MjhiZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvZW1waWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgbGQtZW1waWMgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIFRlc3QgdGhlIGhhbmRsaW5nIG9mIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUuICBUaGlzIHRlc3QgZXNzZW50aWFsbHkKLSMgdGVzdHMgdGhlIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgYXMgd2VsbCBhcyB0aGUgbGlua2VyLCBzaW5jZSBNSVBTCi0jIGVtYmVkZGVkIFBJQyBpcyBhIEdOVSBlbmhhbmNlbWVudCB0byBzdGFuZGFyZCBNSVBTIHRvb2xzLgotCi0jIEVtYmVkZGVkIFBJQyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgTUlQUyBFQ09GRiB0YXJnZXRzLgotaWYgIVtpc3RhcmdldCBtaXBzKi0qLWVjb2ZmKl0gewotICAgIHJldHVybgotfQotCi1zZXQgdGVzdG5hbWUgcmVsYXgKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi0jIFRlc3QgdGhhdCByZWxheGF0aW9uIHdvcmtzIGNvcnJlY3RseS4gIFRoaXMgdGVzdHN1aXRlIHdhcyBjb21wb3NlZAotIyAoYnkgZXhwZXJpbWVudGF0aW9uKSB0byBmb3JjZSB0aGUgbGlua2VyIHRvIHJlbGF4IHR3aWNlLS10aGF0IGlzLAotIyB0aGUgZmlyc3QgcmVsYXhhdGlvbiBwYXNzIHdpbGwgZm9yY2UgYW5vdGhlciBjYWxsIHRvIGJlIG91dCBvZgotIyByYW5nZSwgcmVxdWlyaW5nIGEgc2Vjb25kIHJlbGF4YXRpb24gcGFzcy4KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4MS5jIHRtcGRpci9yZWxheDEub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4Mi5jIHRtcGRpci9yZWxheDIub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4My5jIHRtcGRpci9yZWxheDMub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3JlbGF4NC5jIHRtcGRpci9yZWxheDQub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3JlbGF4ICItLXJlbGF4IC1UICRzcmNkaXIvJHN1YmRpci9yZWxheC50IHRtcGRpci9yZWxheDEubyB0bXBkaXIvcmVsYXgyLm8gdG1wZGlyL3JlbGF4My5vIHRtcGRpci9yZWxheDQubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICAjIENoZWNrIHRoYXQgdGhlIHJlbGF4YXRpb24gcHJvZHVjZWQgdGhlIGNvcnJlY3QgcmVzdWx0LiAgQ2hlY2sKLSAgICAjIGVhY2ggYmFsIGluc3RydWN0aW9uLiAgU29tZSB3aWxsIGdvIGRpcmVjdGx5IHRvIHRoZSBzdGFydCBvZiBhCi0gICAgIyBmdW5jdGlvbiwgd2hpY2ggaXMgT0suICBTb21lIHdpbGwgZm9ybSBwYXJ0IG9mIHRoZSBmaXZlCi0gICAgIyBpbnN0cnVjdGlvbiBleHBhbmRlZCBjYWxsIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIHdlIGNvbXB1dGUgdGhlCi0gICAgIyByZWFsIGRlc3RpbmF0aW9uIGFuZCBtYWtlIHN1cmUgaXQgaXMgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uCi0gICAgIyBTb21lIGJhbCBpbnN0cnVjdGlvbnMgYXJlIHVzZWQgdG8gbG9jYXRlIHRoZSBzdGFydCBvZiB0aGUKLSAgICAjIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGRvIHBvc2l0aW9uIGluZGVwZW5kZW50IGFkZHJlc3NpbmcgaW50byB0aGUKLSAgICAjIHRleHQgc2VjdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBqdXN0IGNoZWNrIHRoYXQgaXQgY29ycmVjdGx5Ci0gICAgIyBjb21wdXRlcyB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLgotCi0gICAgIyBHZXQgdGhlIHN5bWJvbCB0YWJsZS4KLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvcmVsYXhdIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgICMgR2V0IGEgZGlzYXNzZW1ibHkuCi0gICAgc2VuZF9sb2cgIiRvYmpkdW1wIC1kIHRtcGRpci9yZWxheCA+dG1wZGlyL3JlbGF4LmRpc1xuIgotICAgIHZlcmJvc2UgIiRvYmpkdW1wIC1kIHRtcGRpci9yZWxheCA+dG1wZGlyL3JlbGF4LmRpcyIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtZCB0bXBkaXIvcmVsYXggPnRtcGRpci9yZWxheC5kaXMiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgYmFsY250IDAKLSAgICBzZXQgZmlsZSBbb3BlbiB0bXBkaXIvcmVsYXguZGlzIHJdCi0gICAgd2hpbGUgeyBbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMSB9IHsKLQl2ZXJib3NlICIkbGluZSIgMgotCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIipiYWwqIiAkbGluZV0gewotCSAgICBjb250aW51ZQotCX0KLQotCXZlcmJvc2UgIiRsaW5lIgotCi0JaW5jciBiYWxjbnQKLQotCWlmICFbcmVnZXhwICJeKFxbMC05YS1mQS1GXF0rKSAoPFxbYS16KzAtOUEtWi5cXSs+KT8gYmFsIChcWzAtOWEtZkEtRlxdKykiICRsaW5lIHdob2xlIGFkZHIgbGFiZWwgZGVzdF0gewotCSAgICBwZXJyb3IgInVucmVjb2duaXplZCBmb3JtYXQgZm9yICRsaW5lIgotCSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotCSAgICByZXR1cm4KLQl9Ci0KLQlpZiAiMHgkYWRkciArIDggIT0gMHgkZGVzdCIgewotCSAgICAjIFRoaXMgaXMgYSBzdHJhaWdodCBmdW5jdGlvbiBjYWxsLiAgQWxsIGZ1bmN0aW9uIGNhbGxzIGluCi0JICAgICMgdGhpcyBleGFtcGxlIGFyZSB0byBlaXRoZXIgZm9vIG9yIGJhci4KLQkgICAgaWYgIjB4JGRlc3QgIT0gJG5tX291dHB1dChmb28pICYmIDB4JGRlc3QgIT0gJG5tX291dHB1dChiYXIpIiB7Ci0JCXNlbmRfbG9nICJmYWlsIDFcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgIyBQaWNrIHVwIHRoZSBuZXh0IGxpbmUuICBJZiBpdCBpcyBzbGwsIHRoaXMgaXMgYSBzd2l0Y2gKLQkgICAgIyBwcm9sb2d1ZSwgYW5kIHRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkbyB0byB0ZXN0IGl0LgotCSAgICAjIE90aGVyd2lzZSwgaXQgc2hvdWxkIGJlIGx1aSwgYW5kIHRoZSBuZXh0IGluc3RydWN0aW9uCi0JICAgICMgc2hvdWxkIGJlIGFuIGFkZGl1LCBmb2xsb3dlZCBieSBhbiBhZGR1IHRvICQzMS4KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKLQkJc2VuZF9sb2cgImZhaWwgMlxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQkgICAgdmVyYm9zZSAkbAotCi0JICAgIGlmIFtzdHJpbmcgbWF0Y2ggIipzbGwqIiAkbF0gewotCQljb250aW51ZQotCSAgICB9Ci0JICAgIGlmICFbcmVnZXhwICJsdWkgKFxbXCRhLXowLTlcXSspLChcWzAtOWEtZkEtRnhcXSspIiAkbCB3aG9sZSByZWcgdXBwZXJdIHsKLQkJc2VuZF9sb2cgImZhaWwgM1xuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJc2VuZF9sb2cgIiRsXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKLQkJc2VuZF9sb2cgImZhaWwgNFxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQkgICAgdmVyYm9zZSAiJGwiCi0JICAgIGlmICFbcmVnZXhwICJhZGRpdSBcXCRyZWcsXFwkcmVnLChcWy0wLTlcXSspIiAkbCB3aG9sZSBsb3dlcl0gewotCQlzZW5kX2xvZyAiZmFpbCA1XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlzZW5kX2xvZyAiJGxcbiIKLQkJc2VuZF9sb2cgImFkZGl1IFxcJHJlZyxcXCRyZWcsKFxbLTAtOVxdKylcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQotCSAgICBpZiB7IFtnZXRzICRmaWxlIGxdID09IC0xIH0gewotCQlzZW5kX2xvZyAiZmFpbCA2XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCSAgICB2ZXJib3NlICIkbCIKLQkgICAgaWYgIVtyZWdleHAgImFkZHUgXFwkcmVnLFxcJHJlZyxcXFwkcmEiICRsXSB7Ci0JCXNlbmRfbG9nICJmYWlsIDdcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCXNlbmRfbG9nICIkbFxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCi0JICAgICMgVGhlIG5leHQgbGluZSB3aWxsIGJlIGphbHIgaW4gdGhlIGNhc2Ugb2YgYW4gZXhwYW5kZWQKLQkgICAgIyBjYWxsLiAgT3RoZXJ3aXNlLCB0aGUgY29kZSBpcyBnZXR0aW5nIHRoZSBzdGFydCBvZiB0aGUKLQkgICAgIyBmdW5jdGlvbiwgYW5kIHRoZSBuZXh0IGxpbmUgY2FuIGJlIGFueXRoaW5nLgotCi0JICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7Ci0JCXNlbmRfbG9nICJmYWlsIDhcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JICAgIHZlcmJvc2UgIiRsIgkKLQkgICAgaWYgW3N0cmluZyBtYXRjaCAiKmphbHIqIiAkbF0gewotCQlzZXQgZGVzdCBbZXhwciAweCRhZGRyICsgOCArICgkdXBwZXIgPDwgMTYpICsgJGxvd2VyXQotCQlpZiB7ICRkZXN0ICE9ICRubV9vdXRwdXQoZm9vKSAmJiAkZGVzdCAhPSAkbm1fb3V0cHV0KGJhcikgfSB7Ci0JCSAgICBzZW5kX2xvZyAiZmFpbCA5XG4iCi0JCSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCSAgICByZXR1cm4KLQkJfQotCSAgICB9IGVsc2UgewotCQlzZXQgZGVzdCBbZXhwciAoJHVwcGVyIDw8IDE2KSArICRsb3dlcl0KLQkJaWYgIVtyZWdleHAgIjwoXFsuYS16XF0rKVxcKyhcWzAtOWEtZkEtRlxdKyk+IiAkbGFiZWwgd2hvbGUgYmFzZSBvZmZzZXRdIHsKLQkJICAgIHNlbmRfbG9nICJmYWlsIDEwXG4iCi0JCSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCSAgICByZXR1cm4KLQkJfQotCQlzZXQgb2Zmc2V0IDB4JG9mZnNldAotCQlpZiB7ICRiYXNlID09ICIuZm9vIiB9IHsKLQkJICAgIHNldCBvZmZzZXQgW2V4cHIgJG9mZnNldCAtICgkbm1fb3V0cHV0KGZvbykgLSAweDMwKV0KLQkJfQotCQlpZiB7ICRvZmZzZXQgKyA4ICE9IC0gJGRlc3QgfSB7Ci0JCSAgICBzZW5kX2xvZyAiZmFpbCAxMVxuIgotCQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0JCSAgICBmYWlsICR0ZXN0bmFtZQotCQkgICAgcmV0dXJuCi0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBjbG9zZSAkZmlsZQotCi0gICAgaWYgeyRiYWxjbnQgPCAxMH0gewotCXNlbmRfbG9nICJmYWlsIDEyXG4iCi0JZmFpbCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgIiRiYWxjbnQgYmFsIGluc3RydWN0aW9ucyIKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0KLX0KLQotIyBXZSBub3cgdGVzdCBhY3R1YWxseSBydW5uaW5nIGVtYmVkZGVkIE1JUFMgUElDIGNvZGUuICBUaGlzIGNhbiBvbmx5Ci0jIGJlIGRvbmUgb24gYSBNSVBTIGhvc3Qgd2l0aCB0aGUgc2FtZSBlbmRpYW5uZXNzIGFzIG91ciB0YXJnZXQuCi1pZiBbaXN0YXJnZXQgbWlwc2VsLSotKl0gewotICAgIGlmICFbaXNob3N0IG1pcHMqLSotdWx0cml4Kl0gewotCXJldHVybgotICAgIH0KLX0gZWxzZSB7Ci0gICAgaWYgIVtpc2hvc3QgbWlwcyotKi1pcml4Kl0gewotCXJldHVybgotICAgIH0KLX0KLQotc2V0IHRlc3RuYW1lICJydW4gZW1iZWRkZWQgUElDIGNvZGUiCi0KLSMgQ29tcGlsZSB0aGUgcHJvZ3JhbSB3aGljaCB3aWxsIHJ1biB0aGUgdGVzdC4gIFRoaXMgY29kZSBtdXN0IGJlCi0jIGNvbXBpbGVkIGZvciB0aGUgaG9zdCwgbm90IHRoZSB0YXJnZXQuCi1zZW5kX2xvZyAiJENDX0ZPUl9IT1NUICRDRkxBR1NfRk9SX0hPU1QgLW8gdG1wZGlyL3J1biAkc3JjZGlyLyRzdWJkaXIvcnVuLmNcbiIKLXZlcmJvc2UgIiRDQ19GT1JfSE9TVCAkQ0ZMQUdTX0ZPUl9IT1NUIC1vIHRtcGRpci9ydW4gJHNyY2Rpci8kc3ViZGlyL3J1bi5jIgotY2F0Y2ggImV4ZWMgJENDX0ZPUl9IT1NUICRDRkxBR1NfRk9SX0hPU1QgLW8gdG1wZGlyL3J1biAkc3JjZGlyLyRzdWJkaXIvcnVuLmMiIGV4ZWNfb3V0cHV0Ci1pZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0gICAgdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLSMgQ29tcGlsZSBhbmQgbGluayB0aGUgdGVzdC4KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3J1bnRlc3RpLnMgdG1wZGlyL3J1bnRlc3RpLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9ydW50ZXN0MS5jIHRtcGRpci9ydW50ZXN0MS5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcnVudGVzdDIuYyB0bXBkaXIvcnVudGVzdDIub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9ydW50ZXN0ICItLWVtYmVkZGVkLXJlbG9jcyB0bXBkaXIvcnVudGVzdGkubyB0bXBkaXIvcnVudGVzdDEubyB0bXBkaXIvcnVudGVzdDIubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICAjIE5vdyBydW4gdGhlIHRlc3QuCi0gICAgc2VuZF9sb2cgInRtcGRpci9ydW4gdG1wZGlyL3J1bnRlc3RcbiIKLSAgICB2ZXJib3NlICJ0bXBkaXIvcnVuIHRtcGRpci9ydW50ZXN0IgotICAgIGNhdGNoICJleGVjIHRtcGRpci9ydW4gdG1wZGlyL3J1bnRlc3QiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiKnJhbiBhbmQgcmV0dXJuZWQgMCoiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JZmFpbCAkdGVzdG5hbWUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgudCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheC50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzE4YjY5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheC50CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotT1VUUFVUX0ZPUk1BVCgiZWNvZmYtYmlnbWlwcyIpCi1TRUNUSU9OUwotewotICAuZm9vIDB4MzAgOiB7Ci0gICAgdG1wZGlyL3JlbGF4My5vKC50ZXh0KQotICAgIHRtcGRpci9yZWxheDEubygudGV4dCkKLSAgfQotICAudGV4dCAgMHgyMDAwMCA6IHsKLSAgICAgX2Z0ZXh0ID0gLiA7Ci0gICAgKiguaW5pdCkKLSAgICAgZXByb2wgID0gIC47Ci0gICAgdG1wZGlyL3JlbGF4NC5vKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZmluaSkKLSAgICAgZXRleHQgID0gIC47Ci0gICAgIF9ldGV4dCAgPSAgLjsKLSAgfQotICAucmRhdGEgIC4gOiB7Ci0gICAgKigucmRhdGEpCi0gIH0KLSAgIF9mZGF0YSA9IC47Ci0gIC5kYXRhICAuIDogewotICAgICooLmRhdGEpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgIF9ncCA9IC4gKyAweDgwMDA7Ci0gIC5saXQ4ICAuIDogewotICAgICooLmxpdDgpCi0gIH0KLSAgLmxpdDQgIC4gOiB7Ci0gICAgKigubGl0NCkKLSAgfQotICAuc2RhdGEgIC4gOiB7Ci0gICAgKiguc2RhdGEpCi0gIH0KLSAgIGVkYXRhICA9ICAuOwotICAgX2VkYXRhICA9ICAuOwotICAgX2Zic3MgPSAuOwotICAuc2JzcyAgLiA6IHsKLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gIH0KLSAgLmJzcyAgLiA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gIH0KLSAgIGVuZCA9IC47Ci0gICBfZW5kID0gLjsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlYzM5ZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBGaXJzdCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1leHRlcm4gaW50IGJhciAoKTsKLXN0YXRpYyBpbnQgZm9vMiAoKTsKLQotaW50IGZvbyAoaW50IGkpCi17Ci0gIHN3aXRjaCAoaSkKLSAgICB7Ci0gICAgY2FzZSAwOiBiYXIgKDApOyBicmVhazsKLSAgICBjYXNlIDE6IGJhciAoMSk7IGJyZWFrOwotICAgIGNhc2UgMjogYmFyICgyKTsgYnJlYWs7Ci0gICAgY2FzZSAzOiBiYXIgKDMpOyBicmVhazsKLSAgICBjYXNlIDQ6IGJhciAoZm9vMik7IGJyZWFrOwotICAgIGNhc2UgNTogYmFyIChiYXIpOyBicmVhazsKLSAgICB9Ci0gIHdoaWxlICgxKQotICAgIGlmIChpKQotICAgICAgcmV0dXJuIGJhciAoKTsKLX0KLQotc3RhdGljIGludCBmb28yICgpIHsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4Mi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODg1NGEwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDIuYworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qIFNlY29uZCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1pbnQgYmFyMiAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCi0gICAgZm9vICgpOwotICByZXR1cm4gZm9vICgpICsgZm9vICgpICsgZm9vICgpICsgZm9vICgpOwotfQotCi1pbnQgYmFyIChpbnQgaSkKLXsKLSAgd2hpbGUgKDEpCi0gICAgaWYgKGkpCi0gICAgICByZXR1cm4gZm9vICgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmb28gKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWE1MzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4My5jCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0vKiBUaGlyZCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1pbnQgcXV1eCAoKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXg0LmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2ZiMDUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0vKiBGb3VydGggc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KLQotaW50IHh5enp5ICgpIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW4uYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwMzc3ZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyogTG9hZCBhbmQgcnVuIGEgTUlQUyBwb3NpdGlvbiBpbmRlcGVuZGVudCBFQ09GRiBmaWxlLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLSAgIFB1YmxpYyBkb21haW4uICAqLwotCi0vKiBUaGlzIHByb2dyYW0gd2lsbCBsb2FkIGFuIEVDT0ZGIGZpbGUgaW50byBtZW1vcnkgYW5kIGV4ZWN1dGUgaXQuCi0gICBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiBjb21waWxlZCB1c2luZyB0aGUgR05VIC1tZW1iZWRkZWQtcGljCi0gICBzd2l0Y2ggdG8gcHJvZHVjZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgVGhpcyB3aWxsIG9ubHkgd29yawotICAgaWYgdGhpcyBwcm9ncmFtIGlzIHJ1biBvbiBhIE1JUFMgc3lzdGVtIHdpdGggdGhlIHNhbWUgZW5kaWFubmVzcyBhcwotICAgdGhlIEVDT0ZGIGZpbGUuICBUaGUgRUNPRkYgZmlsZSBtdXN0IGJlIGNvbXBsZXRlLiAgU3lzdGVtIGNhbGxzIG1heQotICAgbm90IHdvcmsgY29ycmVjdGx5LgotCi0gICBUaGVyZSBhcmUgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIGZpbGUgKHRoZXkgY291bGQgYmUgcmVtb3ZlZAotICAgYnkgZG9pbmcgc29tZSBhZGRpdGlvbmFsIHByb2dyYW1taW5nKS4gIFRoZSBmaWxlIG11c3QgYmUgYWxpZ25lZAotICAgc3VjaCB0aGF0IGl0IGRvZXMgbm90IHJlcXVpcmUgYW55IGdhcHMgaW50cm9kdWNlZCBpbiB0aGUgZGF0YQotICAgc2VnbWVudDsgdGhlIEdOVSBsaW5rZXIgcHJvZHVjZXMgc3VjaCBmaWxlcyBieSBkZWZhdWx0LiAgSG93ZXZlciwKLSAgIHRoZSBmaWxlIG11c3Qgbm90IGFzc3VtZSB0aGF0IHRoZSB0ZXh0IG9yIGRhdGEgc2VnbWVudCBpcyBhbGlnbmVkCi0gICBvbiBhIHBhZ2UgYm91bmRhcnkuICBUaGUgc3RhcnQgYWRkcmVzcyBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUKLSAgIHRleHQgc2VnbWVudC4KLQotICAgVGhlIEVDT0ZGIGZpbGUgaXMgcnVuIGJ5IGNhbGxpbmcgaXQgYXMgdGhvdWdoIGl0IHdlcmUgYSBmdW5jdGlvbi4KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQgaXMgcGFzc2VkIGFzIHRoZSBvbmx5IGFyZ3VtZW50LgotICAgVGhlIGZpbGUgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGFuIGludGVnZXIgdmFsdWUsIHdoaWNoIHdpbGwgYmUKLSAgIHByaW50ZWQuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0vKiBTdHJ1Y3R1cmVzIHVzZWQgaW4gRUNPRkYgZmlsZXMuICBXZSBhc3N1bWUgdGhhdCBhIHNob3J0IGlzIHR3bwotICAgYnl0ZXMgYW5kIGFuIGludCBpcyBmb3VyIGJ5dGVzLiAgVGhpcyBpcyBub3QgbXVjaCBvZiBhbiBhc3N1bXB0aW9uLAotICAgc2luY2Ugd2UgYWxyZWFkeSBhc3N1bWUgdGhhdCB3ZSBhcmUgcnVubmluZyBvbiBhIE1JUFMgaG9zdCB3aXRoIHRoZQotICAgc2FtZSBlbmRpYW5uZXNzIGFzIHRoZSBmaWxlIHdlIGFyZSBleGFtaW5pbmcuICAqLwotCi1zdHJ1Y3QgZWNvZmZfZmlsZWhkciB7Ci0gIHVuc2lnbmVkIHNob3J0IGZfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciAgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsJLyogbnVtYmVyIG9mIHNlY3Rpb25zICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZl90aW1kYXQ7CS8qIHRpbWUgJiBkYXRlIHN0YW1wICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGZfc3ltcHRyOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiICAgICAgICovCi0gIHVuc2lnbmVkIGludCBmX25zeW1zOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzICAgICAqLwotICB1bnNpZ25lZCBzaG9ydCBmX29wdGhkcjsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikgICAgICAgICAqLwotICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwkvKiBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICovCi19OwotCi1zdHJ1Y3QgZWNvZmZfYW91dGhkcgotewotICB1bnNpZ25lZCBzaG9ydCBtYWdpYzsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICB1bnNpZ25lZCBzaG9ydCB2c3RhbXA7CS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICB1bnNpZ25lZCBpbnQgdHNpemU7CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgdW5zaWduZWQgaW50IGRzaXplOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICB1bnNpZ25lZCBpbnQgYnNpemU7CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIHVuc2lnbmVkIGludCBlbnRyeTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICB1bnNpZ25lZCBpbnQgdGV4dF9zdGFydDsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgZGF0YV9zdGFydDsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgYnNzX3N0YXJ0OwkvKiBiYXNlIG9mIGJzcyB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGdwcm1hc2s7CQkvKiA/PyAqLwotICB1bnNpZ25lZCBpbnQgY3BybWFza1s0XTsJLyogPz8gKi8KLSAgdW5zaWduZWQgaW50IGdwX3ZhbHVlOwkvKiB2YWx1ZSBmb3IgZ3AgcmVnaXN0ZXIgKi8KLX07Ci0KLSNkZWZpbmUgRUNPRkZfU0NOSERSX1NJWkUgKDQwKQotCi1zdGF0aWMgdm9pZAotZGllIChzKQotICAgICBjaGFyICpzOwotewotICBwZXJyb3IgKHMpOwotICBleGl0ICgxKTsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIEZJTEUgKmY7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGNoYXIgKno7Ci0gIHN0cnVjdCBlY29mZl9maWxlaGRyICpmaDsKLSAgc3RydWN0IGVjb2ZmX2FvdXRoZHIgKmFoOwotICB1bnNpZ25lZCBpbnQgdG9mZjsKLSAgY2hhciAqdCwgKmQ7Ci0gIGludCAoKnBmbikgKCk7Ci0gIGludCByZXQ7Ci0KLSAgaWYgKGFyZ2MgIT0gMikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgZmlsZVxuIiwgYXJndlswXSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZiA9IGZvcGVuIChhcmd2WzFdLCAiciIpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIGRpZSAoYXJndlsxXSk7Ci0KLSAgaWYgKHN0YXQgKGFyZ3ZbMV0sICZzKSA8IDApCi0gICAgZGllICgic3RhdCIpOwotCi0gIHogPSAoY2hhciAqKSBtYWxsb2MgKHMuc3Rfc2l6ZSk7Ci0gIGlmICh6ID09IE5VTEwpCi0gICAgZGllICgibWFsbG9jIik7Ci0KLSAgaWYgKGZyZWFkICh6LCAxLCBzLnN0X3NpemUsIGYpICE9IHMuc3Rfc2l6ZSkKLSAgICBkaWUgKCJmcmVhZCIpOwotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgd2hpY2ggaXMgdGhlCi0gICAgIGxvY2F0aW9uIHdlIGFyZSBnb2luZyB0byBjYWxsLCBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsCi0gICAgIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwYXNzIGFzIGFuIGFyZ3VtZW50LiAgV2UgYWxzbyBuZWVkIHRoZSBzaXplCi0gICAgIGFuZCBzdGFydCBhZGRyZXNzIG9mIHRoZSBic3Mgc2VnbWVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxsIGluCi0gICAgIHRoZSBFQ09GRiBhLm91dCBoZWFkZXIuICAqLwotCi0gIGZoID0gKHN0cnVjdCBlY29mZl9maWxlaGRyICopIHo7Ci0gIGlmIChmaC0+Zl9vcHRoZHIgIT0gc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfYW91dGhkcikpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHVuZXhwZWN0ZWQgb3B0aGRyIHNpemU6IGlzICV1LCB3YW50ICV1XG4iLAotCSAgICAgICBhcmd2WzFdLCAodW5zaWduZWQgaW50KSBmaC0+Zl9vcHRoZHIsCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIHNpemVvZiAoc3RydWN0IGVjb2ZmX2FvdXRoZHIpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBhaCA9IChzdHJ1Y3QgZWNvZmZfYW91dGhkciAqKSAoeiArIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZpbGVoZHIpKTsKLSAgaWYgKGFoLT5tYWdpYyAhPSAwNDEzKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBiYWQgYW91dGhkciBtYWdpYyBudW1iZXIgMCVvICh3YW50IDA0MTMpXG4iLAotCSAgICAgICBhcmd2WzFdLCAodW5zaWduZWQgaW50KSBhaC0+bWFnaWMpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIFdlIHNob3VsZCBjbGVhciB0aGUgYnNzIHNlZ21lbnQgYXQgdGhpcyBwb2ludC4gIFRoaXMgaXMgdGhlCi0gICAgIGFoLT5ic2l6ZSBieXRlcyBzdGFydGluZyBhdCBhaC0+YnNzX3N0YXJ0LCBUbyBkbyB0aGlzIGNvcnJlY3RseSwKLSAgICAgd2Ugd291bGQgaGF2ZSB0byBtYWtlIHN1cmUgb3VyIG1lbW9yeSBibG9jayBpcyBsYXJnZSBlbm91Z2guICBJdAotICAgICBzbyBoYXBwZW5zIHRoYXQgb3VyIHRlc3QgY2FzZSBkb2VzIG5vdCBoYXZlIGFueSBhZGRpdGlvbmFsIHBhZ2VzCi0gICAgIGZvciB0aGUgYnNzIHNlZ21lbnQtLWl0IGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGRhdGEgc2VnbWVudC4KLSAgICAgU28sIHdlIGRvbid0IGJvdGhlci4gICovCi0gIGlmIChhaC0+YnNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICIlczogYnNzIHNlZ21lbnQgaXMgJXUgYnl0ZXM7IG5vbi16ZXJvIHNpemVzIG5vdCBzdXBwb3J0ZWRcbiIsCi0JICAgICAgIGFyZ3ZbMV0sIGFoLT5ic2l6ZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogVGhlIHRleHQgc2VjdGlvbiBzdGFydHMganVzdCBhZnRlciBhbGwgdGhlIGhlYWRlcnMsIHJvdW5kZWQgdG8gYQotICAgICAxNiBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgdG9mZiA9IChzaXplb2YgKHN0cnVjdCBlY29mZl9maWxlaGRyKSArIHNpemVvZiAoc3RydWN0IGVjb2ZmX2FvdXRoZHIpCi0JICArIGZoLT5mX25zY25zICogRUNPRkZfU0NOSERSX1NJWkUpOwotICB0b2ZmICs9IDE1OwotICB0b2ZmICY9fiAxNTsKLSAgdCA9IHogKyB0b2ZmOwotCi0gIC8qIFRoZSB0c2l6ZSBmaWVsZCBnaXZlcyB1cyB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudC4gICovCi0gIGQgPSB6ICsgYWgtPnRzaXplOwotCi0gIC8qIENhbGwgdGhlIGNvZGUgYXMgYSBmdW5jdGlvbi4gICovCi0gIHBmbiA9IChpbnQgKCopICgpKSB0OwotICByZXQgPSAoKnBmbikgKGQpOwotCi0gIHByaW50ZiAoIiVzIHJhbiBhbmQgcmV0dXJuZWQgJWRcbiIsIGFyZ3ZbMV0sIHJldCk7Ci0KLSAgZXhpdCAoMCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWFiNmViLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0MS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qIEZpcnN0IEMgc291cmNlIGZpbGUgZm9yIGFjdHVhbCBleGVjdXRpb24gdGVzdC4gICovCi0KLS8qIFRoZSBtYWluIHBvaW50IG9mIHRoaXMgdGVzdCBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBhbmQgZGF0YQotICAgYXJlIHRydWx5IHBvc2l0aW9uIGluZGVwZW5kZW50LiAgV2Ugc3RhdGljYWxseSBpbml0aWFsaXplIHNldmVyYWwKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHkgYWRqdXN0ZWQgYXQKLSAgIHJ1bnRpbWUuICAqLwotCi1pbnQgaSA9IDE7Ci1pbnQgaiA9IDA7Ci1leHRlcm4gaW50IGs7Ci1pbnQgbDsKLWNoYXIgc21hbGxfYnVmW10gPSAiYWFhYSI7Ci1jaGFyICpzbWFsbF9wb2ludGVyID0gc21hbGxfYnVmOwotY2hhciBiaWdfYnVmW10gPSAiYWFhYWFhYWFhYWFhYWFhYSI7Ci1jaGFyICpiaWdfcG9pbnRlciA9IGJpZ19idWY7Ci0KLWV4dGVybiBpbnQgYmFyICgpOwotaW50ICgqcGJhcikgKCkgPSBiYXI7Ci0KLXN0YXRpYyBpbnQKLWZvbzIgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgbCA9IGFyZzsKLSAgcmV0dXJuIGkgKyBqOwotfQotCi1pbnQgKCpwZm9vMikgKCkgPSBmb28yOwotCi1pbnQKLWNoa3N0ciAoeiwgYykKLSAgICAgY2hhciAqejsKLSAgICAgaW50IGM7Ci17Ci0gIC8qIFN3aXRjaCBzdGF0ZW1lbnRzIG5lZWQgZXh0cmEgZWZmb3J0IHRvIGJlIHBvc2l0aW9uIGluZGVwZW5kZW50LAotICAgICBzbyB3ZSBydW4gb25lIGhlcmUsIGV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlIGNhc2VzIHdpbGwgbmV2ZXIgYmUKLSAgICAgdGFrZW4uICAqLwotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIGkgLSAxOwotICAgIGNhc2UgNDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgIGNhc2UgODoKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gaSAqIGo7Ci0gICAgY2FzZSAxMDoKLSAgICBjYXNlIDExOgotICAgIGNhc2UgMTI6Ci0gICAgY2FzZSAxMzoKLSAgICBjYXNlIDE0OgotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gajsKLSAgICBjYXNlIDE2OgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICB3aGlsZSAoYy0tICE9IDApCi0gICAgaWYgKCp6KysgIT0gJ2EnKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuICp6ID09ICdcMCc7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgc3RhcnR1cCByb3V0aW5lLiAgSXQgdHJpZXMKLSAgIHRvIHRlc3QgdGhhdCBldmVyeXRoaW5nIHdhcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuICBJdCByZXR1cm5zIDAgb24KLSAgIHN1Y2Nlc3MsIHNvbWV0aGluZyBlbHNlIG9uIGZhaWx1cmUuICAqLwotCi1pbnQKLWZvbyAoKQotewotICBpZiAoaSAhPSAxKQotICAgIHJldHVybiAxOwotICBpZiAoaiAhPSAwKQotICAgIHJldHVybiAyOwotICBpZiAoISBjaGtzdHIgKHNtYWxsX2J1ZiwgNCkpCi0gICAgcmV0dXJuIDM7Ci0gIGlmICghIGNoa3N0ciAoc21hbGxfcG9pbnRlciwgNCkpCi0gICAgcmV0dXJuIDQ7Ci0gIGlmICghIGNoa3N0ciAoYmlnX2J1ZiwgMTYpKQotICAgIHJldHVybiA1OwotICBpZiAoISBjaGtzdHIgKGJpZ19wb2ludGVyLCAxNikpCi0gICAgcmV0dXJuIDY7Ci0KLSAgaWYgKGwgIT0gMCkKLSAgICByZXR1cm4gNzsKLSAgaWYgKGZvbzIgKDEpICE9IDEpCi0gICAgcmV0dXJuIDg7Ci0gIGlmIChsICE9IDEpCi0gICAgcmV0dXJuIDk7Ci0gIGlmICgoKnBmb28yKSAoMikgIT0gMSkKLSAgICByZXR1cm4gMTA7Ci0gIGlmIChsICE9IDIpCi0gICAgcmV0dXJuIDExOwotCi0gIGlmIChiYXIgKDEpICE9IDApCi0gICAgcmV0dXJuIDEyOwotICBpZiAoYmFyICgtMSkgIT0gMSkKLSAgICByZXR1cm4gMTM7Ci0gIGlmICgoKnBiYXIpICgweGE1YTVhNWE1KSAhPSAtMSkKLSAgICByZXR1cm4gMTQ7Ci0gIGlmIChrICE9IDB4YTVhNWE1YTUpCi0gICAgcmV0dXJuIDE1OwotICBpZiAoKCpwYmFyKSAoMCkgIT0gMHhhNWE1YTVhNSkKLSAgICByZXR1cm4gMTY7Ci0gIGlmIChrICE9IDApCi0gICAgcmV0dXJuIDE3OwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwNTI1Zi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIFNlY29uZCBDIHNvdXJjZSBmaWxlIGZvciBhY3R1YWwgZXhlY3V0aW9uIHRlc3QuICAqLwotCi1pbnQgazsKLWV4dGVybiBpbnQgaTsKLWV4dGVybiBpbnQgajsKLWV4dGVybiBjaGFyIHNtYWxsX2J1ZltdOwotZXh0ZXJuIGNoYXIgKnNtYWxsX3BvaW50ZXI7Ci0KLWV4dGVybiBpbnQgY2hrc3RyICgpOwotCi1pbnQKLWJhciAobikKLSAgICAgaW50IG47Ci17Ci0gIGludCByOwotCi0gIGlmIChpICE9IDEKLSAgICAgIHx8IGogIT0gMAotICAgICAgfHwgISBjaGtzdHIgKHNtYWxsX2J1ZiwgNCkKLSAgICAgIHx8ICEgY2hrc3RyIChzbWFsbF9wb2ludGVyLCA0KSkKLSAgICByZXR1cm4gayArIDE7Ci0KLSAgciA9IGs7Ci0gIGsgPSBuOwotICByZXR1cm4gcjsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0aS5zIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3RpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTE5NTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3RpLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIEFzc2VtYmxlciBpbml0aWFsaXphdGlvbiBjb2RlIGZvciBhY3R1YWwgZXhlY3V0aW9uIHRlc3QuCi0JCi0jIFRoaXMgY29kZSBiZWNvbWVzIHRoZSBzdGFydCBvZiB0aGUgZXhlY3V0aW9uIHRlc3QgcHJvZ3JhbS4gIEl0IGlzCi0jIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgdGhlIHN0YXRpYyBkYXRhLCBpbnZva2luZyB0aGUgQyBjb2RlLAotIyBhbmQgcmV0dXJuaW5nIHRoZSByZXN1bHQuICBJdCBpcyBjYWxsZWQgYXMgdGhvdWdoIGl0IHdlcmUgYSBDCi0jIGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudC4KLQotIyBXZSBuZWVkIHRvIGtub3cgdGhlIHZhbHVlIG9mIF9mdGV4dCBhbmQgX2ZkYXRhIGF0IGxpbmsgdGltZSwgYnV0IHdlCi0jIGhhdmUgbm8gd2F5IHRvIGFjdHVhbGx5IGdldCB0aGF0IGF0IHJ1bnRpbWUuICBUaGlzIGlzIGJlY2F1c2Ugd2hlbgotIyB0aGlzIGNvZGUgaXMgY29tcGlsZWQgd2l0aCAtbWVtYmVkZGVkLXBpYywgdGhlIGxhIGluc3RydWN0aW9uIHdpbGwKLSMgYmUgdHVybmVkIGludG8gYW4gYWRkaXUgJGdwIGluc3RydWN0aW9uLiAgV2Ugd29yayBhcm91bmQgdGhpcyBieQotIyBzdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB3b3JkcyBpbiB0aGUgLmRhdGEgc2VjdGlvbi4gIFdlIHRoZW4gbG9hZAotIyB0aGUgdmFsdWVzIG9mIHRoZXNlIHdvcmRzICpiZWZvcmUqIGRvaW5nIHRoZSBydW50aW1lIHJlbG9jYXRpb24uCi0JLnNkYXRhCi10ZXh0X3N0YXJ0OgotCS53b3JkCV9mdGV4dAotZGF0YV9zdGFydDoKLQkud29yZAlfZmRhdGEKLQotCS5nbG9ibAlzdGFydAotCS50ZXh0Ci1zdGFydDoKLQkjIEdyYWIgc29tZSBzcGFjZSBvbiB0aGUgc3RhY2ssIGp1c3QgYXMgdGhvdWdoIHdlIHdlcmUgYSByZWFsCi0JIyBmdW5jdGlvbi4KLQlhZGRpdQkkc3AsJHNwLC04Ci0Jc3cJJDMxLDAoJHNwKQotCi0JIyBTYXZlIHRoZSAkZ3AgcmVnaXN0ZXIsIGFuZCBzZXQgaXQgdXAgZm9yIG91ciBkYXRhIHNlY3Rpb24uCi0Jc3cJJGdwLDQoJHNwKQotCi0JYWRkdQkkZ3AsJDQsMHg4MDAwCQkjIG1hY3JvCi0KLQkjIFRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50IGlzIGluICQ0LgotCi0JIyBHZXQgdGhlIGFkZHJlc3Mgb2Ygc3RhcnQgaW50byAkNSBpbiBhIHBvc2l0aW9uIGluZGVwZW5kZW50Ci0JIyBmYXNoaW9uLgotCS5zZXQJbm9yZW9yZGVyCi0JJExGMSA9IC4gKyA4Ci0JYmFsCSRMRjEKLQlsYQkkNSxzdGFydC0kTEYxCQkjIG1hY3JvCi0JLnNldAlyZW9yZGVyCi0JYWRkdQkkNSwkNSwkMzEKLQotCSMgTm93IGdldCB0aGUgYWRkcmVzcyBvZiBfZnRleHQgaW50byAkNi4KLQlsYQkkNixfZnRleHQtc3RhcnQJCSMgbWFjcm8KLQlhZGR1CSQ2LCQ2LCQ1Ci0KLQkjIEdldCB0aGUgdmFsdWUgb2YgX2Z0ZXh0IHVzZWQgdG8gbGluayBpbnRvICQ3LgotCWx3CSQ3LHRleHRfc3RhcnQJCSMgbWFjcm8KLQotCSMgR2V0IHRoZSB2YWx1ZSBvZiBfZmRhdGEgdXNlZCB0byBsaW5rIGludG8gJDguCi0JbHcJJDgsZGF0YV9zdGFydAkJIyBtYWNybwotCi0JIyBHZXQgdGhlIGFkZHJlc3Mgb2YgX19ydW50aW1lX3JlbG9jX3N0YXJ0IGludG8gJDkuCi0JbGEJJDksX19ydW50aW1lX3JlbG9jX3N0YXJ0LXN0YXJ0CSMgbWFjcm8KLQlhZGR1CSQ5LCQ5LCQ1Ci0KLQkjIEdldCB0aGUgYWRkcmVzcyBvZiBfX3J1bnRpbWVfcmVsb2Nfc3RvcCBpbnRvICQxMC4KLQlsYQkkMTAsX19ydW50aW1lX3JlbG9jX3N0b3Atc3RhcnQJIyBtYWNybwotCWFkZHUJJDEwLCQxMCwkNQotCi0JIyBUaGUgd29yZHMgYmV0d2VlbiAkOSBhbmQgJDEwIGFyZSB0aGUgcnVudGltZSBpbml0aWFsaXphdGlvbgotCSMgaW5zdHJ1Y3Rpb25zLiAgU3RlcCB0aHJvdWdoIGFuZCByZWxvY2F0ZSB0aGVtLiAgRmlyc3Qgc2V0Ci0JIyAkMTEgYW5kICQxMiB0byB0aGUgdmFsdWVzIHRvIGFkZCB0byB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zLAotCSMgcmVzcGVjdGl2ZWx5LgotCXN1YnUJJDExLCQ2LCQ3Ci0Jc3VidQkkMTIsJDQsJDgKLQotMToJCi0JYmdlCSQ5LCQxMCwzZgkJIyBtYWNybwotCWx3CSQxMywwKCQ5KQotCWFuZAkkMTQsJDEzLDB4ZmZmZmZmZmUJIyBtYWNybwotCW1vdmUJJDE1LCQxMQotCWJlcQkkMTMsJDE0LDJmCi0JbW92ZQkkMTUsJDEyCi0yOgkKLQlhZGR1CSQxNCwkMTQsJDQKLQlsdwkkMjQsMCgkMTQpCi0JYWRkdQkkMjQsJDI0LCQxNQotCXN3CSQyNCwwKCQxNCkKLQlhZGRpdQkkOSwkOSw0Ci0JYgkxYgotMzoJCi0KLQkjIE5vdyB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBkYXRhIGhhcyBiZWVuIHJlbG9jYXRlZAotCSMgY29ycmVjdGx5LCBhbmQgd2UgY2FuIGNhbGwgdGhlIEMgY29kZSB3aGljaCBkb2VzIHRoZSBhY3R1YWwKLQkjIHRlc3RpbmcuCi0JYmFsCWZvbwotCi0JIyBXZSByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBDIGNvZGUuCi0JbHcJJDMxLDAoJHNwKQotCWx3CSRncCw0KCRzcCkKLQlhZGR1CSRzcCwkc3AsOAotCWoJJDMxCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc4OTQ1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1leHRlcm4gaW50IGZvbyAoKTsKLWludAotZnVuYyAoKQotewotICByZXR1cm4gZm9vICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5NDhjOS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEudAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotTk9DUk9TU1JFRlMgKCAudGV4dCAuZGF0YSApCi1TRUNUSU9OUwotewotICAudGV4dCA6IHsgdG1wZGlyL2Nyb3NzMS5vIH0KLSAgLmRhdGEgOiB7IHRtcGRpci9jcm9zczIubyB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQzMTc3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1pbnQKLWZvbyAoKQotewotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDQ2ZjYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLnQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU5PQ1JPU1NSRUZTICggLnRleHQgLmRhdGEgKQotU0VDVElPTlMKLXsKLSAgLnRleHQgOiB7ICooLnRleHQpICooLnByKSB9Ci0gIC5kYXRhIDogeyAqKC5kYXRhKSAqKC5zZGF0YSkgKigucncpICooLnRjMCkgKigudGMpIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMy5jIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDhjMzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWludCBpID0gNDsKLQotaW50Ci1mb28gKCkKLXsKLSAgcmV0dXJuIGk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zc3JlZi5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zc3JlZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTk3NTkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotIyBUZXN0IE5PQ1JPU1NSRUZTIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLXNldCB0ZXN0MSAiTk9DUk9TU1JFRlMgMSIKLXNldCB0ZXN0MiAiTk9DUk9TU1JFRlMgMiIKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAkQ0MgIiRzcmNkaXIvJHN1YmRpci9jcm9zczEuYyIgdG1wZGlyL2Nyb3NzMS5vXSBcCi0gICAgIHx8ICFbbGRfY29tcGlsZSAkQ0MgIiRzcmNkaXIvJHN1YmRpci9jcm9zczIuYyIgdG1wZGlyL2Nyb3NzMi5vXSB9IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MQotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLXNldCBmbGFncyAiIgotCi0jIFRoZSBhMjlrIGNvbXBpbGVkIGNvZGUgY2FsbHMgVl9TUElMTCBhbmQgVl9GSUxMLiAgU2luY2Ugd2UgZG9uJ3QKLSMgbmVlZCB0byBydW4gdGhpcyBjb2RlLCBidXQgd2UgZG9uJ3QgaGF2ZSBkZWZpbml0aW9ucyBmb3IgdGhvc2UKLSMgZnVuY3Rpb25zLCB3ZSBqdXN0IGRlZmluZSB0aGVtIG91dC4KLWlmIFtpc3RhcmdldCBhMjlrKi0qLSpdIHsKLSAgICBzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBWX1NQSUxMPTAgLS1kZWZzeW0gVl9GSUxMPTAiCi19Ci0KLSMgaHBwYS1lbGYgbmVlZHMgYSBkZWZpbml0aW9uIGZvciAkZ2xvYmFsJC4KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHsKLSAgICBzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSAnXCRnbG9iYWxcJCc9MCIKLX0KLQotdmVyYm9zZSAtbG9nICIkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczEgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMS50IHRtcGRpci9jcm9zczEubyB0bXBkaXIvY3Jvc3MyLm8iCi0KLWNhdGNoICJleGVjICRsZCAkZmxhZ3MgLW8gdG1wZGlyL2Nyb3NzMSAtVCAkc3JjZGlyLyRzdWJkaXIvY3Jvc3MxLnQgdG1wZGlyL2Nyb3NzMS5vIHRtcGRpci9jcm9zczIubyIgZXhlY19vdXRwdXQKLQotc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLXJlZ3N1YiAtYWxsICIoXnxcbikoJGxkOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2xcW15cblxdKlxuPykiICRleGVjX291dHB1dCAiXFwxIiBleGVjX291dHB1dAotCi1pZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0gICAgZmFpbCAkdGVzdDEKLX0gZWxzZSB7Ci0gICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0gICAgaWYgW3JlZ2V4cCAicHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UgZnJvbSAuKiB0byBgZm9vJyBpbiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdDEKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3QxCi0gICAgfQotfQotCi0jIENoZWNrIGNyb3NzIHJlZmVyZW5jZXMgd2l0aGluIGEgc2luZ2xlIG9iamVjdC4KLQotaWYgeyAhW2xkX2NvbXBpbGUgJENDICIkc3JjZGlyLyRzdWJkaXIvY3Jvc3MzLmMiIHRtcGRpci9jcm9zczMub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotdmVyYm9zZSAtbG9nICIkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczIgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMi50IHRtcGRpci9jcm9zczMubyIKLQotY2F0Y2ggImV4ZWMgJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MyIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczIudCB0bXBkaXIvY3Jvc3MzLm8iIGV4ZWNfb3V0cHV0Ci0KLXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi1yZWdzdWIgLWFsbCAiKF58XG4pKCRsZDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKLQotaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotICAgIGZhaWwgJHRlc3QyCi19IGVsc2UgewotICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotICAgIGlmIFtyZWdleHAgInByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gLiogdG8gYC4qJyBpbiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdDIKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3QyCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhMjZiYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMgVGVzdCBERUZJTkVEIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLXNldCB0ZXN0bmFtZSAiREVGSU5FRCIKLXNldCBwcm1zX2lkIDU2OTkKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL2RlZmluZWQucyB0bXBkaXIvZGVmLm9dIHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvZGVmICItVCAkc3JjZGlyLyRzdWJkaXIvZGVmaW5lZC50IHRtcGRpci9kZWYubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvZGVmXSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh2YWx1ZTEpXSBcCi0JICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh2YWx1ZTIpXX0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dCh2YWx1ZTEpICE9IDF9IHsKLQkJc2VuZF9sb2cgInZhbHVlMSA9PSAkbm1fb3V0cHV0KHZhbHVlMSlcbiIKLQkJdmVyYm9zZSAidmFsdWUxID09ICRubV9vdXRwdXQodmFsdWUxKSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsKLQkJaWYgeyRubV9vdXRwdXQodmFsdWUyKSAhPSAyfSB7Ci0JCSAgICBzZW5kX2xvZyAidmFsdWUyID09ICRubV9vdXRwdXQodmFsdWUyKVxuIgotCQkgICAgdmVyYm9zZSAidmFsdWUyID09ICRubV9vdXRwdXQodmFsdWUyKSIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICR0ZXN0bmFtZQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzY0YmJiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS5nbG9ibAlkZWZpbmVkCi0JZGVmaW5lZAk9CTEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlZjFiNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNFQ1RJT05TIHsKLQkudGV4dCA6IHsgKigudGV4dCkgfQotCS5kYXRhIDogeyAqKC5kYXRhKSB9Ci0JLmJzcyA6IHsgKiguYnNzKSAqKENPTU1PTikgfQotfQotdmFsdWUxID0gREVGSU5FRCAoZGVmaW5lZCkgPyAxIDogMjsKLXZhbHVlMiA9IERFRklORUQgKHVuZGVmaW5lZCkgPyAxIDogMjsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzN2ZhMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFRlc3QgUEhEUlMgaW4gYSBsaW5rZXIgc2NyaXB0LgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotIyBQSERSUyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIEVMRi4KLWlmIHsgIVtpc3RhcmdldCAqLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXVuaXh3YXJlKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWVhYmkqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXNvbGFyaXMyKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLSMgVGhpcyBpcyBhIHZlcnkgc2ltcGxpc3RpYyB0ZXN0LgotCi1zZXQgdGVzdG5hbWUgIlBIRFJTIgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvcGhkcnMucyB0bXBkaXIvcGhkcnMub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLXNldCBwaGRyc19yZWdleHAgXAotIi4qUHJvZ3JhbSBIZWFkZXI6LipQSERSICpvZmYgKjB4MDAqMzQgKnZhZGRyICoweDAwKjgwMDM0ICpwYWRkciAqMHgwMCo4MDAzNC4qZmlsZXN6ICoweDBcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qIGZsYWdzIHItLS4qTE9BRCAqb2ZmICoweDAwKiAqdmFkZHIgKjB4MDAqODAwMDAgKnBhZGRyICoweDAwKjgwMDAwLipmaWxlc3ogKjB4MDAqXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3Mgci14LipMT0FEICpvZmYgKjB4MFxbMC05YS1mXF0qICp2YWRkciAqMHgwMCo4MCpcWzAtOWEtZlxdKiAqcGFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSouKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3MgKnJ3LS4qIgotCi0jIE9uIGEgNjQgYml0IEVMRiBmb3JtYXQsIHdlIG5lZWQgZGlmZmVyZW50IG51bWJlcnMuCi1pZiB7IFtpc3RhcmdldCBhbHBoYSotKi0qXSB9IHRoZW4gewotICBzZXQgcGhkcnNfcmVnZXhwIFwKLSIuKlByb2dyYW0gSGVhZGVyOi4qUEhEUiAqb2ZmICoweDAwKjQwICp2YWRkciAqMHgwMCo4MDA0MCAqcGFkZHIgKjB4MDAqODAwNDAuKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiBmbGFncyByLS0uKkxPQUQgKm9mZiAqMHgwMCogKnZhZGRyICoweDAwKjgwMDAwICpwYWRkciAqMHgwMCo4MDAwMC4qZmlsZXN6ICoweDAwKlxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzIHIteC4qTE9BRCAqb2ZmICoweDBcWzAtOWEtZlxdKiAqdmFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSogKnBhZGRyICoweDAwKjgwKlxbMC05YS1mXF0qLipmaWxlc3ogKjB4MFxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzICpydy0uKiIKLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3BoZHJzICItVCAkc3JjZGlyLyRzdWJkaXIvcGhkcnMudCB0bXBkaXIvcGhkcnMubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wIC0tcHJpdmF0ZSB0bXBkaXIvcGhkcnMiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLS1wcml2YXRlIHRtcGRpci9waGRycyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICB2ZXJib3NlIC1sb2cgJGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiBbcmVnZXhwICRwaGRyc19yZWdleHAgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMWYwZDEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0KLQkubG9uZwkxCi0KLQkuZGF0YQotCi0JLmxvbmcJMgotCQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0M2RmYjEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMudAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLVBIRFJTCi17Ci0gIGhlYWRlciBQVF9QSERSIFBIRFJTIDsKLSAgdGV4dCBQVF9MT0FEIEZJTEVIRFIgUEhEUlMgOwotICBkYXRhIFBUX0xPQUQgOwotfQotCi1TRUNUSU9OUwotewotICAuID0gMHg4MDAwMCArIFNJWkVPRl9IRUFERVJTOwotICAudGV4dCA6IHsgKigudGV4dCkgfSA6dGV4dAotICAuZGF0YSA6IHsgKiguZGF0YSkgfSA6ZGF0YQotICAvRElTQ0FSRC8gOiB7ICooLiopIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjY2MTc0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jIFRlc3QgYmFzaWMgbGlua2VyIHNjcmlwdCBmdW5jdGlvbmFsaXR5Ci0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLXNldCB0ZXN0bmFtZSAic2NyaXB0IgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvc2NyaXB0LnMgdG1wZGlyL3NjcmlwdC5vXSB7IAotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLXByb2MgY2hlY2tfc2NyaXB0IHsgfSB7Ci0gICAgZ2xvYmFsIG5tCi0gICAgZ2xvYmFsIHRlc3RuYW1lCi0gICAgZ2xvYmFsIG5tX291dHB1dAotCi0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3NjcmlwdF0gewotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlpZiB7IVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodGV4dF9zdGFydCldIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHRleHRfZW5kKV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9zdGFydCldIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRhdGFfZW5kKV19IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQodGV4dF9zdGFydCkgIT0gMHgxMDB9IHsKLQkJc2VuZF9sb2cgInRleHRfc3RhcnQgPT0gJG5tX291dHB1dCh0ZXh0X3N0YXJ0KVxuIgotCQl2ZXJib3NlICJ0ZXh0X3N0YXJ0ID09ICRubV9vdXRwdXQodGV4dF9zdGFydCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7IGlmIHskbm1fb3V0cHV0KHRleHRfZW5kKSA8IDB4MTA0IFwKLQkJCSAgfHwgJG5tX291dHB1dCh0ZXh0X2VuZCkgPiAweDExMH0gewotCQlzZW5kX2xvZyAidGV4dF9lbmQgPT0gJG5tX291dHB1dCh0ZXh0X2VuZClcbiIKLQkJdmVyYm9zZSAidGV4dF9lbmQgPT0gJG5tX291dHB1dCh0ZXh0X2VuZCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7IGlmIHskbm1fb3V0cHV0KGRhdGFfc3RhcnQpICE9IDB4MTAwMH0gewotCQlzZW5kX2xvZyAiZGF0YV9zdGFydCA9PSAkbm1fb3V0cHV0KGRhdGFfc3RhcnQpXG4iCi0JCXZlcmJvc2UgImRhdGFfc3RhcnQgPT0gJG5tX291dHB1dChkYXRhX3N0YXJ0KSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsgaWYgeyRubV9vdXRwdXQoZGF0YV9lbmQpIDwgMHgxMDA0IFwKLQkJCSB8fCAkbm1fb3V0cHV0KGRhdGFfZW5kKSA+IDB4MTAxMH0gewotCQlzZW5kX2xvZyAiZGF0YV9lbmQgPT0gJG5tX291dHB1dChkYXRhX2VuZClcbiIKLQkJdmVyYm9zZSAiZGF0YV9lbmQgPT0gJG5tX291dHB1dChkYXRhX2VuZCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgJHRlc3RuYW1lCi0JICAgIH0gfSB9IH0KLQl9Ci0gICAgfQotfQotCi0jIFBFIHRhcmdldHMgbmVlZCB0byBzZXQgdGhlIGltYWdlIGJhc2UgdG8gMCB0byBhdm9pZCBjb21wbGljYXRpb25zIGZyb20gbm0uCi1zZXQgZmxhZ3MgIiIKLWlmIHtbaXN0YXJnZXQgIiotKi1wZSoiXSBcCi0gICAgfHwgW2lzdGFyZ2V0ICIqLSotY3lnd2luKiJdIFwKLSAgICB8fCBbaXN0YXJnZXQgIiotKi1taW5ndzMyKiJdIFwKLSAgICB8fCBbaXN0YXJnZXQgIiotKi13aW5udCoiXSBcCi0gICAgfHwgW2lzdGFyZ2V0ICIqLSotbnQqIl0gXAotICAgIHx8IFtpc3RhcmdldCAiKi0qLWludGVyaXgqIl0gfSB0aGVuIHsKLSAgc2V0IGZsYWdzICItLWltYWdlLWJhc2UgMCIKLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NjcmlwdCAiJGZsYWdzIC1UICRzcmNkaXIvJHN1YmRpci9zY3JpcHQudCB0bXBkaXIvc2NyaXB0Lm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgY2hlY2tfc2NyaXB0Ci19Ci0KLXNldCB0ZXN0bmFtZSAiTVJJIHNjcmlwdCIKLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NjcmlwdCAiJGZsYWdzIC1jICRzcmNkaXIvJHN1YmRpci9zY3JpcHRtLnQiXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgY2hlY2tfc2NyaXB0Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I2NWIwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmwgdGV4dF9zeW1ib2wKLXRleHRfc3ltYm9sOgkKLQkubG9uZwkxCi0JLmRhdGEKLQkuZ2xvYmwgZGF0YV9zeW1ib2wKLWRhdGFfc3ltYm9sOgkKLQkubG9uZwkyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTdhNDhhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC50CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotU0VDVElPTlMKLXsKLSAgLnRleHQgMHgxMDAgOiB7IAotICAgIHRleHRfc3RhcnQgPSAuOwotICAgICooLnRleHQpCi0gICAgKigucHIpCi0gICAgdGV4dF9lbmQgPSAuOwotICB9Ci0gIC4gPSAweDEwMDA7Ci0gIC5kYXRhIDogewotICAgIGRhdGFfc3RhcnQgPSAuOwotICAgICooLmRhdGEpCi0gICAgKigucncpCi0gICAgZGF0YV9lbmQgPSAuOwotICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHRtLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHRtLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Y2NhZTEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0bS50CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotKiBNUkkgc2NyaXB0Ci1zZWN0IC50ZXh0ID0gJDEwMAk7IC50ZXh0IHN0YXJ0IGFkZHJlc3MKLXNlY3QgLmRhdGEgPSAxMDAwaAk7IC5kYXRhIHN0YXJ0IGFkZHJlc3MKLXB1YmxpYyB0ZXh0X3N0YXJ0ID0gJDEwMAotcHVibGljIHRleHRfZW5kID0gIyBjb250aW51YXRpb24gbGluZQotICB0ZXh0X3N0YXJ0ICsgNAotcHVibGljIGRhdGFfc3RhcnQgPSAxMDAwaAotcHVibGljIGRhdGFfZW5kID0gZGF0YV9zdGFydCArIDQKLQotbG9hZCB0bXBkaXIvc2NyaXB0Lm8KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmRlZmQ0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIFRlc3QgU0laRU9GIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLSMgQmFzZWQgb24gYSBidWcgcmVwb3J0IGZyb20gYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlLgotCi1zZXQgdGVzdG5hbWUgIlNJWkVPRiIKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3NpemVvZi5zIHRtcGRpci9zaXplb2Yub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaXplb2YgIi1UICRzcmNkaXIvJHN1YmRpci9zaXplb2YudCB0bXBkaXIvc2l6ZW9mLm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3NpemVvZl0gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X3N0YXJ0KV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X2VuZCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9zdGFydCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9lbmQpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHNpemVvZl90ZXh0KV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChzaXplb2ZfZGF0YSldfSB7Ci0gICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7JG5tX291dHB1dCh0ZXh0X2VuZCkgLSAkbm1fb3V0cHV0KHRleHRfc3RhcnQpICE9ICRubV9vdXRwdXQoc2l6ZW9mX3RleHQpfSB7Ci0gICAgc2VuZF9sb2cgInRleHRfZW5kIC0gdGV4dF9zdGFydCAhPSBzaXplb2ZfdGV4dFxuIgotICAgIHZlcmJvc2UgInRleHRfZW5kIC0gdGV4dF9zdGFydCAhPSBzaXplb2ZfdGV4dCIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7JG5tX291dHB1dChkYXRhX2VuZCkgLSAkbm1fb3V0cHV0KGRhdGFfc3RhcnQpICE9ICRubV9vdXRwdXQoc2l6ZW9mX2RhdGEpfSB7Ci0gICAgc2VuZF9sb2cgImRhdGFfZW5kIC0gZGF0YV9zdGFydCAhPSBzaXplb2ZfZGF0YVxuIgotICAgIHZlcmJvc2UgImRhdGFfZW5kIC0gZGF0YV9zdGFydCAhPSBzaXplb2ZfZGF0YSIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7JG5tX291dHB1dChzaXplb2ZfdGV4dCkgIT0gJG5tX291dHB1dChzaXplb2ZfZGF0YSl9IHsKLSAgICBzZW5kX2xvZyAic2l6ZW9mX3RleHQgIT0gc2l6ZW9mX2RhdGFcbiIKLSAgICB2ZXJib3NlICJzaXplb2ZfdGV4dCAhPSBzaXplb2ZfZGF0YSIKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1wYXNzICR0ZXN0bmFtZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyMWNhMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQkuc3BhY2UJMTYKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDRhMzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1TRUNUSU9OUyB7Ci0JLnRleHQgOgotCSAgewotCSAgICB0ZXh0X3N0YXJ0ID0gLjsKLQkgICAgdG1wZGlyL3NpemVvZi5vIAotCSAgICB0ZXh0X2VuZCA9IC47Ci0JICB9Ci0JLmRhdGEgOiAKLQkgIHsgCi0JICAgIGRhdGFfc3RhcnQgPSAuOwotCSAgICAuID0gLiArIFNJWkVPRigudGV4dCk7Ci0JICAgIGRhdGFfZW5kID0gLjsKLQkgIH0KLX0JCi0KLXNpemVvZl90ZXh0ID0gU0laRU9GKC50ZXh0KTsKLXNpemVvZl9kYXRhID0gU0laRU9GKC5kYXRhKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjU5NjcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFRlc3Qgd2VhayBzeW1ib2xzLgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU29sdXRpb25zLgotCi1zZXQgdGVzdG5hbWUgIndlYWsgc3ltYm9scyIKLQotIyBUaGlzIHRlc3Qgb25seSB3b3JrcyBmb3IgRUxGIHRhcmdldHMuICBJdCBvdWdodCB0byB3b3JrIGZvciBzb21lCi0jIGEub3V0IHRhcmdldHMsIGJ1dCBpdCBkb2Vzbid0LgotCi1pZiB7ICFbaXN0YXJnZXQgKi0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi11bml4d2FyZSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lYWJpKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDUqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWlyaXg2Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1zb2xhcmlzMipdIH0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHshIFtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3dlYWsxLnMgdG1wZGlyL3dlYWsxLm9dCi0gICAgfHwgISBbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci93ZWFrMi5zIHRtcGRpci93ZWFrMi5vXX0gdGhlbiB7Ci0gICAgIyBJdCdzIE9LIGlmIC53ZWFrIGRvZXNuJ3Qgd29yayBvbiB0aGlzIHRhcmdldC4KLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1zZXQgd2Vha19yZWdleHBfYmlnIFwKLSIuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6LioxMDAwIDAwMDAxMDA4IDAwMDAyMDBjIDEyMTIxMjEyIDM0MzQzNDM0LipDb250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOi4qMjAwMCAwMDAwMTAwOCAwMDAwMjAwYyA1NjU2NTY1NiA3ODc4Nzg3OC4qIgotCi1zZXQgd2Vha19yZWdleHBfbGl0dGxlIFwKLSIuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6LioxMDAwIDA4MTAwMDAwIDBjMjAwMDAwIDEyMTIxMjEyIDM0MzQzNDM0LipDb250ZW50cyBvZiBzZWN0aW9uIC5kYXRhOi4qMjAwMCAwODEwMDAwMCAwYzIwMDAwMCA1NjU2NTY1NiA3ODc4Nzg3OC4qIgotCi1pZiB7ISBbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci93ZWFrICItVCAkc3JjZGlyLyRzdWJkaXIvd2Vhay50IHRtcGRpci93ZWFrMS5vIHRtcGRpci93ZWFrMi5vIl0gfSB0aGVuIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgLXMgdG1wZGlyL3dlYWsiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLXMgdG1wZGlyL3dlYWsiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAotCi0gICAgaWYge1tyZWdleHAgJHdlYWtfcmVnZXhwX2JpZyAkZXhlY19vdXRwdXRdIFwKLQl8fCBbcmVnZXhwICR3ZWFrX3JlZ2V4cF9saXR0bGUgJGV4ZWNfb3V0cHV0XSB9IHRoZW4gewotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMDEzZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1TRUNUSU9OUwotewotICAudGV4dCAweDEwMDAgOiB7Ci0gICAgdG1wZGlyL3dlYWsxLm8oLmRhdGEpCi0gIH0KLSAgLmRhdGEgMHgyMDAwIDogewotICAgIHRtcGRpci93ZWFrMi5vKC5kYXRhKQotICB9Ci0gIC9ESVNDQVJELyA6IHsKLSAgICAqKCopCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDZmYmUxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0uZGF0YQotCS5nbG9iYWwJZm9vMQotCS5nbG9iYWwJc3ltMQotCS53ZWFrCXN5bTIKLWZvbzE6Ci0JLmxvbmcJc3ltMQotCS5sb25nCXN5bTIKLXN5bTE6Ci0JLmxvbmcJMHgxMjEyMTIxMgotc3ltMjoKLQkubG9uZwkweDM0MzQzNDM0CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2VhazIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlZGZmNS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLmRhdGEKLQkuZ2xvYmFsCWZvbzIKLQkud2VhawlzeW0xCi0JLmdsb2JhbAlzeW0yCi1mb28yOgotCS5sb25nCXN5bTEKLQkubG9uZwlzeW0yCi1zeW0xOgotCS5sb25nCTB4NTY1NjU2NTYKLXN5bTI6Ci0JLmxvbmcJMHg3ODc4Nzg3OApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8xLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwMjM2Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIF9zdGFydCBzaG91bGQgYmUgdGhlIG9ubHkgdGhpbmcgbGVmdCBhZnRlciBHQy4gICovCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7Ci12b2lkIF9zdGFydCgpCi17Ci19Ci0KLXZvaWQgZHJvcG1lMSgpCi17Ci19Ci0KLWludCBkcm9wbWUyWzEwMl0gPSB7IDAgfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTU4ODcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBOb3JtYWxseSB3ZSBzaG91bGQgbG9vc2UgZm9vIGFuZCBrZWVwIF9zdGFydCBhbmQgX2luaXQuIAotICAgV2l0aCAtdSBmb28sIHdlIHNob3VsZCBrZWVwIHRoYXQgYXMgd2VsbC4gICovCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7Ci12b2lkIF9zdGFydCgpCi17Ci19Ci0KLXZvaWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmluaXQiKSkpCi1faW5pdCgpCi17Ci19Ci0KLWludCBmb28oKSBfX2FzbV9fKCJmb28iKTsKLWludCBmb28oKQotewotICBzdGF0aWMgaW50IHggPSAxOwotICByZXR1cm4geCsrOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8zLmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTJiYzVkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMy5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXN0cnVjdCBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLSAgdmlydHVhbCB2b2lkIGJhcigpOwotfTsKLQotdm9pZCBBOjpmb28oKSB7IH0JCQkvLyBrZWVwCi12b2lkIEE6OmJhcigpIHsgfQkJCS8vIGxvb3NlCi0KLXN0cnVjdCBCIDogcHVibGljIEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotfTsKLQotdm9pZCBCOjpmb28oKSB7IH0JCQkvLyBrZWVwCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKLQotQSBhOwkJCQkJLy8ga2VlcAotQiBiOwotQSAqZ2V0bWUoKSB7IHJldHVybiAmYTsgfQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpCi17Ci0gIGdldG1lKCktPmZvbygpOwotfQotCi0vLyBJbiBhZGRpdGlvbiwga2VlcCBBJ3MgdmlydHVhbCB0YWJsZS4KLQotLy8gV2UnbGwgd2luZCB1cCBrZWVwaW5nIGBiJyBhbmQgdGh1cyBCJ3MgdmlydHVhbCB0YWJsZSBiZWNhdXNlCi0vLyBgYScgYW5kIGBiJyBhcmUgYm90aCByZWZlcmVuY2VkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgotCi1leHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjI2YWMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS80LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotc3RydWN0IEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotICB2aXJ0dWFsIHZvaWQgYmFyKCk7Ci19OwotCi12b2lkIEE6OmZvbygpIHsgfQkJCS8vIGxvb3NlCi12b2lkIEE6OmJhcigpIHsgfQkJCS8vIGtlZXAKLQotc3RydWN0IEIgOiBwdWJsaWMgQQotewotICB2aXJ0dWFsIHZvaWQgZm9vKCk7Ci19OwotCi12b2lkIEI6OmZvbygpIHsgfQkJCS8vIGxvb3NlCi0KLXZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKLQotQSBhOwkJCQkJLy8ga2VlcAotQiBiOwotQSAqZ2V0bWUoKSB7IHJldHVybiAmYTsgfQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpCi17Ci0gIGdldG1lKCktPmJhcigpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYjU4NzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgc2VsZWN0aXZlIGxpbmtpbmcgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBDYXRoZXJpbmUgTW9vcmUgKGNsbUBjeWdudXMuY29tKQotIyBNYWtlIHN1cmUgdGhhdCBjb25zdHJ1Y3RvcnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgotCi0KLSMgQ09GRiBiYXNlZCBwb3J0cyBkbyBub3Qgc3VwcG9ydCBzZWxlY3RpdmUgbGlua2luZwotaWYge1tpc3RhcmdldCAiKi0qLWNvZmYiXX0gewotICByZXR1cm4KLX0KLWlmIHtbaXN0YXJnZXQgIiotKi1wZSJdfSB7Ci0gIHJldHVybgotfQotCi1zZXQgdGVzdDEgInNlbGVjdGl2ZTEiCi1zZXQgdGVzdDIgInNlbGVjdGl2ZTIiCi1zZXQgdGVzdDMgInNlbGVjdGl2ZTMiCi1zZXQgdGVzdDQgInNlbGVjdGl2ZTQiCi1zZXQgdGVzdDUgInNlbGVjdGl2ZTUiCi0KLXNldCBjZmxhZ3MgIi13IC1PMiAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucyIgCi1zZXQgY3h4ZmxhZ3MgIi1mdnRhYmxlLWdjIC1mbm8tZXhjZXB0aW9ucyAtZm5vLXJ0dGkiCi1zZXQgbGRmbGFncyAiLS1nYy1zZWN0aW9ucyAtQnN0YXRpYyIKLQotaWYgeyBbd2hpY2ggJENYWF0gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdDEKLSAgICB1bnRlc3RlZCAkdGVzdDIKLSAgICB1bnRlc3RlZCAkdGVzdDMKLSAgICB1bnRlc3RlZCAkdGVzdDQKLSAgICB1bnRlc3RlZCAkdGVzdDUKLSAgICByZXR1cm4KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvMS5jIHRtcGRpci8xLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzEueCAiJGxkZmxhZ3MgdG1wZGlyLzEubyJdIHsKLSAgICBmYWlsICR0ZXN0MQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMS54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB9IGVsc2UgewotCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRyb3BtZTEpXX0gewotCQlzZW5kX2xvZyAiZHJvcG1lMSA9PSAkbm1fb3V0cHV0KGRyb3BtZTEpXG4iCi0JCXZlcmJvc2UgImRyb3BtZTEgPT0gJG5tX291dHB1dChkcm9wbWUxKSIKLQkJZmFpbCAkdGVzdDEKLQkgICAgfSBlbHNlIHsKLQkJaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZHJvcG1lMildfSB7Ci0JCSAgICBzZW5kX2xvZyAiZHJvcG1lMiA9PSAkbm1fb3V0cHV0KGRyb3BtZTIpXG4iCi0JCSAgICB2ZXJib3NlICJkcm9wbWUyID09ICRubV9vdXRwdXQoZHJvcG1lMikiCi0JCSAgICBmYWlsICR0ZXN0MQotCQl9IGVsc2UgewotCQkgICAgcGFzcyAkdGVzdDEKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvMi5jIHRtcGRpci8yLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzIueCAiJGxkZmxhZ3MgdG1wZGlyLzIubyJdIHsKLSAgICBmYWlsICR0ZXN0MgotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMi54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDIKLSAgICB9IGVsc2UgewotCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImZvbyA9PSAkbm1fb3V0cHV0KGZvbylcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImZvbz09ICRubV9vdXRwdXQoZm9vKSIKLSAgICAgICAgICAgIGZhaWwgJHRlc3QyCi0JfSBlbHNlIHsKLSAgICAgICAgICAgIHBhc3MgJHRlc3QyCi0JICAgIH0gCi0JIH0KLSAgICAgfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8yLmMgdG1wZGlyLzIub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MwotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMi54ICIkbGRmbGFncyAtdSBmb28gdG1wZGlyLzIubyJdIHsKLSAgICBmYWlsICR0ZXN0MwotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMi54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDMKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dChmb28pXSB9IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3QzCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQoZm9vKSA9PSAwfSB7Ci0JCXNlbmRfbG9nICJmb28gPT0gJG5tX291dHB1dChmb28pXG4iCi0JCXZlcmJvc2UgImZvbz09ICRubV9vdXRwdXQoZm9vKSIKLQkJZmFpbCAkdGVzdDMKLQkgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXNzICR0ZXN0MwotCQl9Ci0JIH0KLSAgICAgfQotfQotCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi0KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyAkY3h4ZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8zLmNjIHRtcGRpci8zLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDQKLSAgICByZXR1cm4KLX0KLQotc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMy54ICIkbGRmbGFncyB0bXBkaXIvMy5vIl0gewotICAgZmFpbCAkdGVzdDQKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyLzMueF0gewotICAgICAgIHVucmVzb2x2ZWQgJHRlc3Q0Ci0gICAgfSBlbHNlIHsKLSAgICAgICBpZiB7W2luZm8gZXhpc3RzIG5tX291dHB1dChmb29fXzFCKV19IHsKLSAgICAgICAgICBzZW5kX2xvZyAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpXG4iCi0gICAgICAgICAgdmVyYm9zZSAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpIgotICAgICAgICAgIGZhaWwgJHRlc3Q0Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgaWYge1sgaW5mbyBleGlzdHMgbm1fb3V0cHV0KGJhcl9fMUEpXX0gewotICAgICAgICAgICAgICBzZW5kX2xvZyAiYmFyX18xQT09ICRubV9vdXRwdXQoX2Jhcl9fMUEpXG4iCi0gICAgICAgICAgICAgIHZlcmJvc2UgImJhcl9fMUEgPT0gJG5tX291dHB1dChfYmFyX18xQSkiCi0gICAgICAgICAgICAgIGZhaWwgJHRlc3Q0Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBwYXNzICR0ZXN0NAotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci19Ci0KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyAkY3h4ZmxhZ3MiICRzcmNkaXIvJHN1YmRpci80LmNjIHRtcGRpci80Lm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzQueCAiJGxkZmxhZ3MgdG1wZGlyLzQubyJdIHsKLSAgICBmYWlsICR0ZXN0NQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvNC54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDUKLSAgICB9IGVsc2UgewotCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUIpXX0geyAKLSAgICAgICAgICAgIHNlbmRfbG9nICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQilcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImZvb19fMUIgPT0gJG5tX291dHB1dChmb29fXzFCKSIKLQkgICAgZmFpbCAkdGVzdDUKLQl9IGVsc2UgewotICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUEpXX0gewotCSAgICAgICAgc2VuZF9sb2cgImZvb19fMUE9PSAkbm1fb3V0cHV0KGZvb19fMUEpXG4iCi0JCXZlcmJvc2UgImZvb19fMUEgPT0gJG5tX291dHB1dChmb29fXzFBKSIKLQkJZmFpbCAkdGVzdDUKLSAgICAgICAgICB9IGVsc2UgewotCSAgICAgIHBhc3MgJHRlc3Q1Ci0gICAgICAgICAgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2guZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3NoLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0NmQyNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2guZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgbGQtc2ggdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKLSMKLQotIyBUZXN0IFNIIHJlbGF4aW5nLiAgVGhpcyB0ZXN0cyB0aGUgY29tcGlsZXIgYW5kIGFzc2VtYmxlciBhcyB3ZWxsIGFzCi0jIHRoZSBsaW5rZXIuCi0KLWlmICFbaXN0YXJnZXQgc2gqLSotKl0gewotICAgIHJldHVybgotfQotCi1zZXQgdGVzdHNpbXBsZSAiU0ggc2ltcGxlIHJlbGF4aW5nIgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAiLXJlbGF4ICRzcmNkaXIvJHN1YmRpci9zaDEucyIgdG1wZGlyL3NoMS5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdHNpbXBsZQotfSBlbHNlIHsgaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NoMSAiLXJlbGF4IHRtcGRpci9zaDEubyJdIHsKLSAgICBmYWlsICR0ZXN0c2ltcGxlCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci9zaDFdIHsKLQl1bnJlc29sdmVkICR0ZXN0c2ltcGxlCi0gICAgfSBlbHNlIHsKLQlpZiB7IVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoYmFyKV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vKV19IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3RzaW1wbGUKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dChiYXIpICE9ICRubV9vdXRwdXQoZm9vKSArIDR9IHsKLQkJc2VuZF9sb2cgImZvbyA9PSAkbm1fb3V0cHV0KGZvbylcbiIKLQkJdmVyYm9zZSAiZm9vID09ICRubV9vdXRwdXQoZm9vKSIKLQkJc2VuZF9sb2cgImJhciA9PSAkbm1fb3V0cHV0KGJhcilcbiIKLQkJdmVyYm9zZSAiYmFyID09ICRubV9vdXRwdXQoYmFyKSIKLQkJZmFpbCAkdGVzdHNpbXBsZQotCSAgICB9IGVsc2UgewotCQlwYXNzICR0ZXN0c2ltcGxlCi0JICAgIH0KLQl9Ci0gICAgfQotfSB9Ci0KLXNldCB0ZXN0c3JlYyAiU0ggcmVsYXhpbmcgdG8gUy1yZWNvcmRzIgotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2gxLnMxICItcmVsYXggLW9mb3JtYXQgc3JlYyB0bXBkaXIvc2gxLm8iXSB7Ci0gICAgZmFpbCAkdGVzdHNyZWMKLX0gZWxzZSB7Ci0gICAgIyBUaGUgZmlsZSBuYW1lIGlzIGVtYmVkZGVkIGluIHRoZSBTLXJlY29yZHMsIHNvIGNyZWF0ZSBib3RoCi0gICAgIyBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgY2F0Y2ggImV4ZWMgcm0gLWYgdG1wZGlyL3NoMS5zMiIgZXhlY19vdXRwdXQKLSAgICBzZW5kX2xvZyAibXYgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyXG4iCi0gICAgdmVyYm9zZSAibXYgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIgotICAgIGNhdGNoICJleGVjIG12IHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMiIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCXVucmVzb2x2ZWQgJHRlc3RzcmVjCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc2gxIHRtcGRpci9zaDEuczEiCi0JdmVyYm9zZSAiJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc2gxIHRtcGRpci9zaDEuczEiCi0JY2F0Y2ggImV4ZWMgJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc2gxIHRtcGRpci9zaDEuczEiIGV4ZWNfb3V0cHV0Ci0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQkgICAgdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCSAgICB1bnJlc29sdmVkICR0ZXN0c3JlYwotCX0gZWxzZSB7Ci0JICAgIHNlbmRfbG9nICJjbXAgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyXG4iCi0JICAgIHZlcmJvc2UgImNtcCB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczIiCi0JICAgIGNhdGNoICJleGVjIGNtcCB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczIiIGV4ZWNfb3V0cHV0Ci0JICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQkJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JCWZhaWwgJHRlc3RzcmVjCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgJHRlc3RzcmVjCi0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zZXQgdGVzdGxpbmsgIlNIIHJlbGF4aW5nIgotc2V0IHRlc3Rqc3IgIlNIIGNvbmZpcm0gcmVsYXhpbmciCi1zZXQgdGVzdHJ1biAiU0ggcmVsYXhpbmcgZXhlY3V0aW9uIgotCi1pZiB7IFt3aGljaCAkQ0NdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3RsaW5rCi0gICAgdW50ZXN0ZWQgJHRlc3Rqc3IKLSAgICB1bnRlc3RlZCAkdGVzdHJ1bgotICAgIHJldHVybgotfQotCi1pZiB7IVtsZF9hc3NlbWJsZSAkYXMgIi1yZWxheCAkc3JjZGlyLyRzdWJkaXIvc3RhcnQucyIgdG1wZGlyL3N0YXJ0Lm9dIFwKLSAgICAgfHwgIVtsZF9jb21waWxlICRDQyAiLU8gLW1yZWxheCAkc3JjZGlyLyRzdWJkaXIvc2gyLmMiIHRtcGRpci9zaDIub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bGluawotICAgIHVucmVzb2x2ZWQgJHRlc3Rqc3IKLSAgICB1bnJlc29sdmVkICR0ZXN0cnVuCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaDIgIi1yZWxheCB0bXBkaXIvc3RhcnQubyB0bXBkaXIvc2gyLm8iXSB7Ci0gICAgZmFpbCAkdGVzdGxpbmsKLSAgICB1bnJlc29sdmVkICR0ZXN0anNyCi0gICAgdW5yZXNvbHZlZCAkdGVzdHJ1bgotICAgIHJldHVybgotfQotCi1wYXNzICR0ZXN0bGluawotCi1zZW5kX2xvZyAiJG9iamR1bXAgLWQgdG1wZGlyL3NoMlxuIgotdmVyYm9zZSAiJG9iamR1bXAgLWQgdG1wZGlyL3NoMiIKLWNhdGNoICJleGVjICRvYmpkdW1wIC1kIHRtcGRpci9zaDIiIGV4ZWNfb3V0cHV0Ci1pZiBbc3RyaW5nIG1hdGNoICIqanNyKiIgJGV4ZWNfb3V0cHV0XSB7Ci0gICAgZmFpbCAkdGVzdGpzcgotfSBlbHNlIHsKLSAgICBwYXNzICR0ZXN0anNyCi19Ci0KLWlmIHsgIVtpbmZvIGV4aXN0cyBTSU1dIHx8IFt3aGljaCAkU0lNXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0cnVuCi0gICAgcmV0dXJuCi19Ci0KLXNldCBzdGF0dXMgW2NhdGNoICJleGVjICRTSU0gdG1wZGlyL3NoMiIgZXhlY19vdXRwdXRdCi1pZiB7ICRzdGF0dXMgPT0gMCB9IHsKLSAgICBwYXNzICR0ZXN0cnVuCi19IGVsc2UgewotICAgIGZhaWwgJHRlc3RydW4KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDEucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4ZTQzOS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2gxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLWZvbzoKLUwxOgkKLQltb3YubAlMMixyMAotCS51c2VzCUwxCi0JanNyCUByMAotCXJ0cwotCS5hbGlnbgkyCi1MMjoKLQkubG9uZwliYXIKLWJhcjoKLQlydHMKLQkuYWxpZ24JNApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdmZTg4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi1pbnQgZ2xvYmFsOwotCi1leHRlcm4gdm9pZCB0cmFwIChpbnQsIGludCk7Ci1zdGF0aWMgdm9pZCBxdWl0IChpbnQpOwotc3RhdGljIGludCBmb28gKGludCk7Ci0KLWludAotbWFpbiAoKQotewotICBpZiAoZm9vICgwKSAhPSAwIHx8IGdsb2JhbCAhPSAwKQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICgxKSAhPSAxIHx8IGdsb2JhbCAhPSAxKQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICgyKSAhPSAyIHx8IGdsb2JhbCAhPSAyKQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICgzKSAhPSAzIHx8IGdsb2JhbCAhPSAzKQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg0KSAhPSA0IHx8IGdsb2JhbCAhPSA0KQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg1KSAhPSA1IHx8IGdsb2JhbCAhPSA1KQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg2KSAhPSA2IHx8IGdsb2JhbCAhPSA2KQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg3KSAhPSA3IHx8IGdsb2JhbCAhPSA3KQotICAgIHF1aXQgKDEpOwotICBpZiAoZm9vICg4KSAhPSA4IHx8IGdsb2JhbCAhPSA4KQotICAgIHF1aXQgKDEpOwotICBxdWl0ICgwKTsKLX0KLQotdm9pZAotX19tYWluICgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1xdWl0IChpbnQgc3RhdHVzKQotewotICB0cmFwICgxLCBzdGF0dXMpOwotfQotCi1pbnQKLWJhciAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IGk7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjAgKGludCBpKQotewotICBnbG9iYWwgPSAwOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXIxIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gMTsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyMiAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDI7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjMgKGludCBpKQotewotICBnbG9iYWwgPSAzOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXI0IChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gNDsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyNSAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDU7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjYgKGludCBpKQotewotICBnbG9iYWwgPSA2OwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXI3IChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gNzsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotZm9vIChpbnQgaSkKLXsKLSAgc3dpdGNoIChpKQotICAgIHsKLSAgICBjYXNlIDA6IGJhcjAgKDApOyByZXR1cm4gMDsKLSAgICBjYXNlIDE6IGJhcjEgKDEpOyByZXR1cm4gMTsKLSAgICBjYXNlIDI6IGJhcjIgKDIpOyByZXR1cm4gMjsKLSAgICBjYXNlIDM6IGJhcjMgKDMpOyByZXR1cm4gMzsKLSAgICBjYXNlIDQ6IGJhcjQgKDQpOyByZXR1cm4gNDsKLSAgICBjYXNlIDU6IGJhcjUgKDUpOyByZXR1cm4gNTsKLSAgICBjYXNlIDY6IGJhcjYgKDYpOyByZXR1cm4gNjsKLSAgICBjYXNlIDc6IGJhcjcgKDcpOyByZXR1cm4gNzsKLSAgICBkZWZhdWx0OiByZXR1cm4gYmFyIChpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2gvc3RhcnQucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zdGFydC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWY0Yzc5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zdGFydC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCS5zZWN0aW9uIC50ZXh0Ci0JLmdsb2JhbAlzdGFydAotc3RhcnQ6Ci0KLQltb3YubAlzdGFja19rLHIxNQotCi0JISBjYWxsIHRoZSBtYWlubGluZQkKLUwxOgkKLQltb3YubAltYWluX2sscjAKLQkudXNlcwlMMQotCWpzcglAcjAKLQlub3AKLQotCS5hbGlnbiAyCi1zdGFja19rOgotCS5sb25nCV9zdGFjawkKLW1haW5fazoKLQkubG9uZwlfbWFpbgotCi0JLmdsb2JhbCBfdHJhcAotX3RyYXA6CQotCXRyYXBhICMzCi0JcnRzCi0Jbm9wCi0KLQkuc2VjdGlvbiAuc3RhY2sKLV9zdGFjazoJLmxvbmcJMHhkZWFkZGVhZApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9lbGYtb2Zmc2V0LmxkIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9lbGYtb2Zmc2V0LmxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmU0MjkzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvZWxmLW9mZnNldC5sZAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9IDB4MTAwMDAwOwotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLmdudS52ZXJzaW9uICAgOiB7ICooLmdudS52ZXJzaW9uKQl9Ci0gIC5nbnUudmVyc2lvbl9kICAgOiB7ICooLmdudS52ZXJzaW9uX2QpCX0KLSAgLmdudS52ZXJzaW9uX3IgICA6IHsgKiguZ251LnZlcnNpb25fcikJfQotICAucmVsLnRleHQgICAgICA6Ci0gICAgewotICAgICAgKigucmVsLnRleHQpCi0gICAgICAqKC5yZWwudGV4dC4qKQotICAgICAgKigucmVsLmdudS5saW5rb25jZS50KikKLSAgICB9Ci0gIC5yZWxhLnRleHQgICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnRleHQpCi0gICAgICAqKC5yZWxhLnRleHQuKikKLSAgICAgICooLnJlbGEuZ251LmxpbmtvbmNlLnQqKQotICAgIH0KLSAgLnJlbC5kYXRhICAgICAgOgotICAgIHsKLSAgICAgICooLnJlbC5kYXRhKQotICAgICAgKigucmVsLmRhdGEuKikKLSAgICAgICooLnJlbC5nbnUubGlua29uY2UuZCopCi0gICAgfQotICAucmVsYS5kYXRhICAgICA6Ci0gICAgewotICAgICAgKigucmVsYS5kYXRhKQotICAgICAgKigucmVsYS5kYXRhLiopCi0gICAgICAqKC5yZWxhLmdudS5saW5rb25jZS5kKikKLSAgICB9Ci0gIC5yZWwucm9kYXRhICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWwucm9kYXRhKQotICAgICAgKigucmVsLnJvZGF0YS4qKQotICAgICAgKigucmVsLmdudS5saW5rb25jZS5yKikKLSAgICB9Ci0gIC5yZWxhLnJvZGF0YSAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnJvZGF0YSkKLSAgICAgICooLnJlbGEucm9kYXRhLiopCi0gICAgICAqKC5yZWxhLmdudS5saW5rb25jZS5yKikKLSAgICB9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX0KLSAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfQotICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX0KLSAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgS0VFUCAoKiguaW5pdCkpCX0KLSAgLnBsdCAgICAgIDogeyAqKC5wbHQpCX0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICAqKC50ZXh0KQotICAgICooLnRleHQuKikKLSAgICAqKC5zdHViKQotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwotICAgICooLmdudS53YXJuaW5nKQotICAgICooLmdudS5saW5rb25jZS50KikKLSAgfQotICBfZXRleHQgPSAuOwotICBQUk9WSURFIChldGV4dCA9IC4pOwotICAuZmluaSAgICAgIDogeyBLRUVQICgqKC5maW5pKSkJCX0gPTB4OTA5MAotICAucm9kYXRhICAgIDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGEuKikKLSAgICAqKC5nbnUubGlua29uY2UuciopCi0gIH0KLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfQotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bwotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KLSAgLiA9IEFMSUdOKDB4MTAwMCkgKyAoLiAmICgweDEwMDAgLSAxKSk7Ci0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YS4qKQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICBTT1JUKENPTlNUUlVDVE9SUykKLSAgfQotICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH0KLSAgLmN0b3JzICAgICAgICAgOgotICB7Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZiB0aGUgY29uc3RydWN0b3JzLCBzbwotICAgICAgIHdlIG1ha2Ugc3VyZSBpdCBpcyBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90IGFjdHVhbGx5IGxpbmsgYWdhaW5zdAotICAgICAgIGNydGJlZ2luLm87IHRoZSBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKLSAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2gKLSAgICAgICBkaXJlY3RvcnkgY3J0YmVnaW4ubyBpcyBpbi4gICovCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gIH0KLSAgLmR0b3JzICAgICAgICAgOgotICB7Ci0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gIH0KLSAgLmdvdCAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSAqKC5zZGF0YS4qKSB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bwotICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCi0gICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCi0gICAuID0gQUxJR04oMzIgLyA4KTsKLSAgfQotICAuID0gQUxJR04oMzIgLyA4KTsKLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Ci0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTVjNzhhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogVGhpcyBpcyB0aGUgbWFpbiBwcm9ncmFtIGZvciB0aGUgc2hhcmVkIGxpYnJhcnkgdGVzdC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgbWFpbnZhciA9IDE7Ci1pbnQgb3ZlcnJpZGRlbnZhciA9IDI7Ci1leHRlcm4gaW50IHNobGlidmFyMTsKLQotZXh0ZXJuIGludCBzaGxpYl9tYWludmFyICgpOwotZXh0ZXJuIGludCBzaGxpYl9vdmVycmlkZGVudmFyICgpOwotZXh0ZXJuIGludCBzaGxpYl9zaGxpYnZhcjEgKCk7Ci1leHRlcm4gaW50IHNobGliX3NobGlidmFyMiAoKTsKLWV4dGVybiBpbnQgc2hsaWJfc2hsaWJjYWxsICgpOwotZXh0ZXJuIGludCBzaGxpYl9tYWluY2FsbCAoKTsKLWV4dGVybiBpbnQgc2hsaWJfY2hlY2tmdW5wdHIxICgpOwotZXh0ZXJuIGludCBzaGxpYl9jaGVja2Z1bnB0cjIgKCk7Ci1leHRlcm4gaW50ICgqc2hsaWJfZ2V0ZnVucHRyMSAoKSkgKCk7Ci1leHRlcm4gaW50ICgqc2hsaWJfZ2V0ZnVucHRyMiAoKSkgKCk7Ci1leHRlcm4gaW50IHNobGliX2NoZWNrICgpOwotZXh0ZXJuIGludCBzaGxpYl9zaGxpYmNhbGwyICgpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi1pbnQKLW1haW5fY2FsbGVkICgpCi17Ci0gIHJldHVybiA2OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyBhIGZ1bmN0aW9uIGluIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLWludAotc2hsaWJfb3ZlcnJpZGRlbmNhbGwyICgpCi17Ci0gIHJldHVybiA4OwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50ICgqcCkgKCk7Ci0KLSAgcHJpbnRmICgibWFpbnZhciA9PSAlZFxuIiwgbWFpbnZhcik7Ci0gIHByaW50ZiAoIm92ZXJyaWRkZW52YXIgPT0gJWRcbiIsIG92ZXJyaWRkZW52YXIpOwotICBwcmludGYgKCJzaGxpYnZhcjEgPT0gJWRcbiIsIHNobGlidmFyMSk7Ci0jaWZuZGVmIFhDT0ZGX1RFU1QKLSAgcHJpbnRmICgic2hsaWJfbWFpbnZhciAoKSA9PSAlZFxuIiwgc2hsaWJfbWFpbnZhciAoKSk7Ci0gIHByaW50ZiAoInNobGliX292ZXJyaWRkZW52YXIgKCkgPT0gJWRcbiIsIHNobGliX292ZXJyaWRkZW52YXIgKCkpOwotI2VuZGlmCi0gIHByaW50ZiAoInNobGliX3NobGlidmFyMSAoKSA9PSAlZFxuIiwgc2hsaWJfc2hsaWJ2YXIxICgpKTsKLSAgcHJpbnRmICgic2hsaWJfc2hsaWJ2YXIyICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYnZhcjIgKCkpOwotICBwcmludGYgKCJzaGxpYl9zaGxpYmNhbGwgKCkgPT0gJWRcbiIsIHNobGliX3NobGliY2FsbCAoKSk7Ci0jaWZuZGVmIFhDT0ZGX1RFU1QKLSAgcHJpbnRmICgic2hsaWJfc2hsaWJjYWxsMiAoKSA9PSAlZFxuIiwgc2hsaWJfc2hsaWJjYWxsMiAoKSk7Ci0gIHByaW50ZiAoInNobGliX21haW5jYWxsICgpID09ICVkXG4iLCBzaGxpYl9tYWluY2FsbCAoKSk7Ci0jZW5kaWYKLSAgcHJpbnRmICgibWFpbl9jYWxsZWQgKCkgPT0gJWRcbiIsIG1haW5fY2FsbGVkICgpKTsKLSAgcHJpbnRmICgic2hsaWJfY2hlY2tmdW5wdHIxIChzaGxpYl9zaGxpYnZhcjEpID09ICVkXG4iLAotCSAgc2hsaWJfY2hlY2tmdW5wdHIxIChzaGxpYl9zaGxpYnZhcjEpKTsKLSNpZm5kZWYgWENPRkZfVEVTVAotICBwcmludGYgKCJzaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSA9PSAlZFxuIiwKLQkgIHNobGliX2NoZWNrZnVucHRyMiAobWFpbl9jYWxsZWQpKTsKLSNlbmRpZgotICBwID0gc2hsaWJfZ2V0ZnVucHRyMSAoKTsKLSAgcHJpbnRmICgic2hsaWJfZ2V0ZnVucHRyMSAoKSAiKTsKLSAgaWYgKHAgPT0gc2hsaWJfc2hsaWJ2YXIxKQotICAgIHByaW50ZiAoIj09Iik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIhPSIpOwotICBwcmludGYgKCIgc2hsaWJfc2hsaWJ2YXIxXG4iKTsKLSNpZm5kZWYgWENPRkZfVEVTVAotICBwID0gc2hsaWJfZ2V0ZnVucHRyMiAoKTsKLSAgcHJpbnRmICgic2hsaWJfZ2V0ZnVucHRyMiAoKSAiKTsKLSAgaWYgKHAgPT0gbWFpbl9jYWxsZWQpCi0gICAgcHJpbnRmICgiPT0iKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiE9Iik7Ci0gIHByaW50ZiAoIiBtYWluX2NhbGxlZFxuIik7Ci0jZW5kaWYKLSAgcHJpbnRmICgic2hsaWJfY2hlY2sgKCkgPT0gJWRcbiIsIHNobGliX2NoZWNrICgpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMS5jIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmMTgzYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qIFRoaXMgaXMgcGFydCBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgbGQgdGVzdC4gIFRoaXMgZmlsZSBiZWNvbWVzIHBhcnQKLSAgIG9mIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHN1cHBsaWVkIGJ5IHRoZSBtYWluIHByb2dyYW0uICAqLwotI2lmbmRlZiBYQ09GRl9URVNUCi1leHRlcm4gaW50IG1haW52YXI7Ci0jZW5kaWYKLQotLyogVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIHRoZSBzaGFyZWQgbGlicmFyeSwgYW5kIG92ZXJyaWRkZW4gYnkKLSAgIHRoZSBtYWluIHByb2dyYW0uICAqLwotI2lmbmRlZiBYQ09GRl9URVNUCi1pbnQgb3ZlcnJpZGRlbnZhciA9IC0xOwotI2VuZGlmCi0KLS8qIFRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotaW50IHNobGlidmFyMSA9IDM7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCBieSBhbm90aGVyIG9iamVjdCBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotZXh0ZXJuIGludCBzaGxpYnZhcjI7Ci0KLS8qIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHZhbHVlcyBvZiB0aGUgYWJvdmUgdmFyaWFibGVzIGFzIHNlZW4gaW4KLSAgIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50Ci1zaGxpYl9tYWludmFyICgpCi17Ci0gIHJldHVybiBtYWludmFyOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50Ci1zaGxpYl9vdmVycmlkZGVudmFyICgpCi17Ci0gIHJldHVybiBvdmVycmlkZGVudmFyOwotfQotI2VuZGlmCi0KLWludAotc2hsaWJfc2hsaWJ2YXIxICgpCi17Ci0gIHJldHVybiBzaGxpYnZhcjE7Ci19Ci0KLWludAotc2hsaWJfc2hsaWJ2YXIyICgpCi17Ci0gIHJldHVybiBzaGxpYnZhcjI7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGFub3RoZXIgb2JqZWN0IGluIHRoZQotICAgc2hhcmVkIGxpYnJhcnkuICAqLwotCi1leHRlcm4gaW50IHNobGliX3NobGliY2FsbGVkICgpOwotCi1pbnQKLXNobGliX3NobGliY2FsbCAoKQotewotICByZXR1cm4gc2hsaWJfc2hsaWJjYWxsZWQgKCk7Ci19Ci0KLSNpZm5kZWYgWENPRkZfVEVTVAotLyogVGhpcyBmdW5jdGlvbiBjYWxscyBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhpcyBvYmplY3QgaW4gdGhlIHNoYXJlZAotICAgbGlicmFyeS4gIFRoZSBtYWluIHByb2dyYW0gd2lsbCBvdmVycmlkZSB0aGUgY2FsbGVkIGZ1bmN0aW9uLiAgKi8KLQotZXh0ZXJuIGludCBzaGxpYl9vdmVycmlkZGVuY2FsbDIgKCk7Ci0KLWludAotc2hsaWJfc2hsaWJjYWxsMiAoKQotewotICByZXR1cm4gc2hsaWJfb3ZlcnJpZGRlbmNhbGwyICgpOwotfQotCi1pbnQKLXNobGliX292ZXJyaWRkZW5jYWxsMiAoKQotewotICByZXR1cm4gNzsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KLQotI2lmbmRlZiBYQ09GRl9URVNUCi1leHRlcm4gaW50IG1haW5fY2FsbGVkICgpOwotCi1pbnQKLXNobGliX21haW5jYWxsICgpCi17Ci0gIHJldHVybiBtYWluX2NhbGxlZCAoKTsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gc2hsaWJfbWFpbnZhci4gIEl0Ci0gICBjb25maXJtcyB0aGF0IHRoZSBwb2ludGVyIGNvbXBhcmVzIGVxdWFsbHkuICAqLwotCi1pbnQgCi1zaGxpYl9jaGVja2Z1bnB0cjEgKHApCi0gICAgIGludCAoKnApICgpOwotewotICByZXR1cm4gcCA9PSBzaGxpYl9zaGxpYnZhcjE7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIGEgZnVuY3Rpb24gcG9pbnRlciB0byBtYWluX2NhbGxlZC4gIEl0Ci0gICBjb25maXJtcyB0aGF0IHRoZSBwb2ludGVyIGNvbXBhcmVzIGVxdWFsbHkuICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotc2hsaWJfY2hlY2tmdW5wdHIyIChwKQotICAgICBpbnQgKCpwKSAoKTsKLXsKLSAgcmV0dXJuIHAgPT0gbWFpbl9jYWxsZWQ7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBzaGxpYl9tYWludmFyLiAgKi8KLQotaW50Ci0oKnNobGliX2dldGZ1bnB0cjEgKCkpICgpCi17Ci0gIHJldHVybiBzaGxpYl9zaGxpYnZhcjE7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gbWFpbl9jYWxsZWQuICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludAotKCpzaGxpYl9nZXRmdW5wdHIyICgpKSAoKQotewotICByZXR1cm4gbWFpbl9jYWxsZWQ7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgY29uc3RhbnQgZGF0YSBhbmQgbG9jYWwgZnVuY3Rpb25zCi0gICB3b3JrLiAgKi8KLQotI2lmbmRlZiBfX1NURENfXwotI2RlZmluZSBjb25zdAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaSA9IDY7Ci1zdGF0aWMgY29uc3QgY2hhciAqc3RyID0gIkhlbGxvLCB3b3JsZFxuIjsKLQotaW50Ci1zaGxpYl9jaGVjayAoKQotewotICBjb25zdCBjaGFyICpzMSwgKnMyOwotCi0gIGlmIChpICE9IDYpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogVG8gaXNvbGF0ZSB0aGUgdGVzdCwgZG9uJ3QgcmVseSBvbiBhbnkgZXh0ZXJuYWwgZnVuY3Rpb25zLCBzdWNoCi0gICAgIGFzIHN0cmNtcC4gICovCi0gIHMxID0gIkhlbGxvLCB3b3JsZFxuIjsKLSAgczIgPSBzdHI7Ci0gIHdoaWxlICgqczEgIT0gJ1wwJykKLSAgICBpZiAoKnMxKysgIT0gKnMyKyspCi0gICAgICByZXR1cm4gMDsKLSAgaWYgKCpzMiAhPSAnXDAnKQotICAgIHJldHVybiAwOwotCi0gIGlmIChzaGxpYl9zaGxpYnZhcjEgKCkgIT0gMykKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gyLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTNhNGUwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKiBUaGlzIGlzIHBhcnQgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGxkIHRlc3QuICBUaGlzIGZpbGUgYmVjb21lcyBwYXJ0Ci0gICBvZiBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGhlcmUsIGFuZCByZWZlcmVuY2VkIGJ5IGFub3RoZXIgZmlsZSBpbgotICAgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLWludCBzaGxpYnZhcjIgPSA0OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhbm90aGVyIGZpbGUgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotaW50Ci1zaGxpYl9zaGxpYmNhbGxlZCAoKQotewotICByZXR1cm4gNTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmRhdCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlZTM3Zi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1tYWludmFyID09IDEKLW92ZXJyaWRkZW52YXIgPT0gMgotc2hsaWJ2YXIxID09IDMKLXNobGliX21haW52YXIgKCkgPT0gMQotc2hsaWJfb3ZlcnJpZGRlbnZhciAoKSA9PSAyCi1zaGxpYl9zaGxpYnZhcjEgKCkgPT0gMwotc2hsaWJfc2hsaWJ2YXIyICgpID09IDQKLXNobGliX3NobGliY2FsbCAoKSA9PSA1Ci1zaGxpYl9zaGxpYmNhbGwyICgpID09IDgKLXNobGliX21haW5jYWxsICgpID09IDYKLW1haW5fY2FsbGVkICgpID09IDYKLXNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAxCi1zaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSA9PSAxCi1zaGxpYl9nZXRmdW5wdHIxICgpID09IHNobGliX3NobGlidmFyMQotc2hsaWJfZ2V0ZnVucHRyMiAoKSA9PSBtYWluX2NhbGxlZAotc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWIwYThjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXNoYXJlZCB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGxkIGNhbiBnZW5lcmF0ZSBFTEYgc2hhcmVkIGxpYnJhcmllcy4KLSMgTm90ZSB0aGF0IGxpbmtpbmcgYWdhaW5zdCBFTEYgc2hhcmVkIGxpYnJhcmllcyBpcyB0ZXN0ZWQgYnkgdGhlCi0jIGJvb3RzdHJhcCB0ZXN0LgotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgbGQgZ2VuZXJhdGVzIG5hdGl2ZSBleGVjdXRhYmxlcy4KLWlmICFbaXNuYXRpdmVdIHRoZW4ge3JldHVybn0KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIG9uIGEgY291cGxlIG9mIEVMRiBwbGF0Zm9ybXMuCi0jIFNxdWFyZSBicmFja2V0IGV4cHJlc3Npb25zIHNlZW0gdG8gY29uZnVzZSBpc3RhcmdldC4KLWlmIHsgIVtpc3RhcmdldCBpMzg2LSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNDg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNTg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk0ODYtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTU4Ni0qLWVsZipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtNjhrLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgbWlwcyotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotZWxmXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc3Vub3M0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHNwYXJjKi0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgKi0qLWxpbnV4KmFvdXQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCAqLSotbGludXgqb2xkbGQqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotc2V0IHRtcGRpciB0bXBkaXIKLXNldCBTSENGTEFHICIiCi0KLWlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQotICAgICMgQUlYIHNoYXJlZCBsaWJyYXJpZXMgZG8gbm90IHNlZW0gdG8gc3VwcG9ydCB1c2VmdWwgZmVhdHVyZXMsCi0gICAgIyBsaWtlIG92ZXJyaWRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5IGZ1bmN0aW9uIG9yIGxldHRpbmcgdGhlCi0gICAgIyBzaGFyZWQgbGlicmFyeSByZWZlciB0byBvYmplY3RzIGRlZmluZWQgaW4gdGhlIG1haW4gcHJvZ3JhbS4gIFdlCi0gICAgIyBhdm9pZCB0ZXN0aW5nIHRob3NlIGZlYXR1cmVzLgotICAgIHNldCBTSENGTEFHICItRFhDT0ZGX1RFU1QiCi0KLSAgICAjIFRoZSBBSVggMy4yLjUgbG9hZGVyIGFwcGVhcnMgdG8gcmFuZG9tbHkgZmFpbCB3aGVuIGxvYWRpbmcKLSAgICAjIHNoYXJlZCBsaWJyYXJpZXMgZnJvbSBOU0YgbW91bnRlZCBwYXJ0aXRpb25zLCBzbyB3ZSBhdm9pZCBhbnkKLSAgICAjIHBvdGVudGlhbCBwcm9ibGVtcyBieSB1c2luZyBhIGxvY2FsIGRpcmVjdG9yeS4KLSAgICBjYXRjaCB7ZXhlYyAvYmluL3NoIC1jICJlY2hvICQkIn0gcGlkCi0gICAgc2V0IHRtcGRpciAvdXNyL3RtcC9sZC4kcGlkCi0gICAgY2F0Y2ggImV4ZWMgbWtkaXIgJHRtcGRpciIgZXhlY19zdGF0dXMKLQotICAgICMgT24gQUlYLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgZXhwb3J0IHRoZSBzeW1ib2xzIHRoZSBzaGFyZWQKLSAgICAjIGxpYnJhcnkgaXMgZ29pbmcgdG8gcHJvdmlkZSwgYW5kIG5lZWQuCi0gICAgc2V0IGZpbGUgW29wZW4gJHRtcGRpci94Y29mZi5leHAgd10KLSAgICBwdXRzICRmaWxlIHNobGlidmFyMQotICAgIHB1dHMgJGZpbGUgc2hsaWJ2YXIyCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9zaGxpYnZhcjEKLSAgICBwdXRzICRmaWxlIHNobGliX3NobGlidmFyMgotICAgIHB1dHMgJGZpbGUgc2hsaWJfc2hsaWJjYWxsCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9zaGxpYmNhbGxlZAotICAgIHB1dHMgJGZpbGUgc2hsaWJfY2hlY2tmdW5wdHIxCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9nZXRmdW5wdHIxCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9jaGVjawotICAgIGNsb3NlICRmaWxlCi19Ci0KLSMgVGhlIHRlc3QgcHJvY2VkdXJlLgotcHJvYyBzaGFyZWRfdGVzdCB7IHByb2duYW1lIHRlc3RuYW1lIG1haW4gc2gxIHNoMiBkYXQgYXJncyB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiBbbGxlbmd0aCAkYXJnc10geyBzZXQgc2hsZGZsYWdzIFtsaW5kZXggJGFyZ3MgMF0gfSBlbHNlIHsgc2V0IHNobGRmbGFncyAiIiB9Ci0KLSAgICAjIEJ1aWxkIHRoZSBzaGFyZWQgbGlicmFyeS4KLSAgICAjIE9uIEFJWCwgd2UgbmVlZCB0byB1c2UgYW4gZXhwb3J0IGZpbGUuCi0gICAgc2V0IHNoYXJlZCAtc2hhcmVkCi0gICAgaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotCXNldCBzaGFyZWQgIi1iTTpTUkUgLWJFOiR0bXBkaXIveGNvZmYuZXhwIgotICAgIH0KLSAgICBpZiB7IVtsZF9zaW1wbGVfbGluayAkbGQgJHRtcGRpci8kcHJvZ25hbWUuc28gIiRzaGFyZWQgJHNobGRmbGFncyAkdG1wZGlyLyRzaDEgJHRtcGRpci8kc2gyIl19IHsKLSAgICAgICAgZmFpbCAiJHRlc3RuYW1lIgotICAgIAlyZXR1cm4KLSAgICB9Ci0KLSAgICAjIExpbmsgYWdhaW5zdCB0aGUgc2hhcmVkIGxpYnJhcnkuICBVc2UgLXJwYXRoIHNvIHRoYXQgdGhlCi0gICAgIyBkeW5hbWljIGxpbmtlciBjYW4gbG9jYXRlIHRoZSBzaGFyZWQgbGlicmFyeSBhdCBydW50aW1lLgotICAgICMgT24gQUlYLCB3ZSBtdXN0IGluY2x1ZGUgL2xpYiBpbiAtcnBhdGgsIGFzIG90aGVyd2lzZSB0aGUgbG9hZGVyCi0gICAgIyBjYW4gbm90IGZpbmQgLWxjLgotICAgIHNldCBycGF0aCAkdG1wZGlyCi0gICAgaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotCXNldCBycGF0aCAvbGliOiR0bXBkaXIKLSAgICB9Ci0gICAgaWYgIVtsZF9saW5rICRsZCAkdG1wZGlyLyRwcm9nbmFtZSAiLXJwYXRoICRycGF0aCAkdG1wZGlyLyRtYWluICR0bXBkaXIvJHByb2duYW1lLnNvIl0gewotICAgIAlmYWlsICIkdGVzdG5hbWUiCi0gICAgCXJldHVybgotICAgIH0KLQotICAgICMgUnVuIHRoZSByZXN1bHRpbmcgcHJvZ3JhbQotICAgIHNlbmRfbG9nICIkdG1wZGlyLyRwcm9nbmFtZSA+JHRtcGRpci8kcHJvZ25hbWUub3V0XG4iCi0gICAgdmVyYm9zZSAiJHRtcGRpci8kcHJvZ25hbWUgPiR0bXBkaXIvJHByb2duYW1lLm91dCIKLSAgICBjYXRjaCAiZXhlYyAkdG1wZGlyLyRwcm9nbmFtZSA+JHRtcGRpci8kcHJvZ25hbWUub3V0IiBleGVjX291dHB1dAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdG5hbWUiCi0gICAgCXJldHVybgotICAgIH0KLQotICAgIHNlbmRfbG9nICJkaWZmICR0bXBkaXIvJHByb2duYW1lLm91dCAkc3JjZGlyLyRzdWJkaXIvJGRhdC5kYXRcbiIKLSAgICB2ZXJib3NlICJkaWZmICR0bXBkaXIvJHByb2duYW1lLm91dCAkc3JjZGlyLyRzdWJkaXIvJGRhdC5kYXQiCi0gICAgY2F0Y2ggImV4ZWMgZGlmZiAkdG1wZGlyLyRwcm9nbmFtZS5vdXQgJHNyY2Rpci8kc3ViZGlyLyRkYXQuZGF0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JZmFpbCAiJHRlc3RuYW1lIgotICAgICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICIkdGVzdG5hbWUiCi19Ci0KLWlmIFtpc3RhcmdldCBtaXBzKi0qLSpdIHsKLSAgICBzZXQgcGljZmxhZyAiIgotfSBlbHNlIHsKLSAgICAjIFVuZm9ydHVuYXRlbHksIHRoZSBnY2MgYXJndW1lbnQgaXMgLWZwaWMgYW5kIHRoZSBjYyBhcmd1bWVudCBpcwotICAgICMgLUtQSUMuICBXZSBoYXZlIHRvIHRyeSBib3RoLgotICAgIHNldCBwaWNmbGFnICItZnBpYyIKLSAgICBzZW5kX2xvZyAiJENDICRwaWNmbGFnXG4iCi0gICAgdmVyYm9zZSAiJENDICRwaWNmbGFnIgotICAgIGNhdGNoICJleGVjICRDQyAkcGljZmxhZyIgZXhlY19vdXRwdXQKLSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0gICAgdmVyYm9zZSAiLS0iICIkZXhlY19vdXRwdXQiCi0gICAgaWYgeyBbc3RyaW5nIG1hdGNoICIqaWxsZWdhbCBvcHRpb24qIiAkZXhlY19vdXRwdXRdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKm9wdGlvbiBpZ25vcmVkKiIgJGV4ZWNfb3V0cHV0XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIip1bnJlY29nbml6ZWQgb3B0aW9uKiIgJGV4ZWNfb3V0cHV0XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIipwYXNzZWQgdG8gbGQqIiAkZXhlY19vdXRwdXRdIH0gewotCWlmIFtpc3RhcmdldCAqLSotc3Vub3M0Kl0gewotCSAgICBzZXQgcGljZmxhZyAiLXBpYyIKLQl9IGVsc2UgewotCSAgICBzZXQgcGljZmxhZyAiLUtQSUMiCi0JfQotICAgIH0KLX0KLXZlcmJvc2UgIlVzaW5nICRwaWNmbGFnIHRvIGNvbXBpbGUgUElDIGNvZGUiCi0KLSMgQ29tcGlsZSB0aGUgbWFpbiBwcm9ncmFtLgotaWYgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL21haW4uYyAkdG1wZGlyL21haW5ucC5vXSB7Ci0gICAgdW5yZXNvbHZlZCAic2hhcmVkIChub24gUElDKSIKLSAgICB1bnJlc29sdmVkICJzaGFyZWQiCi19IGVsc2UgewotICAgICMgVGhlIHNoYXJlZCBsaWJyYXJ5IGlzIGNvbXBvc2VkIG9mIHR3byBmaWxlcy4gIEZpcnN0IGNvbXBpbGUgdGhlbQotICAgICMgd2l0aG91dCB1c2luZyAtZnBpYy4gIFRoYXQgc2hvdWxkIHdvcmsgb24gYW4gRUxGIHN5c3RlbSwKLSAgICAjIGFsdGhvdWdoIGl0IHdpbGwgYmUgbGVzcyBlZmZpY2llbnQgYmVjYXVzZSB0aGUgZHluYW1pYyBsaW5rZXIKLSAgICAjIHdpbGwgbmVlZCB0byBkbyBtb3JlIHJlbG9jYXRpb24gd29yay4gIEhvd2V2ZXIsIG5vdGUgdGhhdCBub3QKLSAgICAjIHVzaW5nIC1mcGljIHdpbGwgY2F1c2Ugc29tZSBvZiB0aGUgdGVzdHMgdG8gcmV0dXJuIGRpZmZlcmVudAotICAgICMgcmVzdWx0cy4KLSAgICBpZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUciICRzcmNkaXIvJHN1YmRpci9zaDEuYyAkdG1wZGlyL3NoMW5wLm9dCi0JIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUciICRzcmNkaXIvJHN1YmRpci9zaDIuYyAkdG1wZGlyL3NoMm5wLm9dIH0gewotCXVucmVzb2x2ZWQgInNoYXJlZCAobm9uIFBJQykiCi0gICAgfSBlbHNlIHsgaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotCXNoYXJlZF90ZXN0IHNobnAgInNoYXJlZCAobm9uUElDKSIgbWFpbm5wLm8gc2gxbnAubyBzaDJucC5vIHhjb2ZmCi0gICAgfSBlbHNlIHsKLQkjIFN1bk9TIG5vbiBQSUMgc2hhcmVkIGxpYnJhcmllcyBkb24ndCBwZXJtaXQgc29tZSBjYXNlcyBvZgotCSMgb3ZlcnJpZGluZy4KLQlzZXR1cF94ZmFpbCAiKi0qLXN1bm9zNCoiCi0Jc2hhcmVkX3Rlc3Qgc2hucCAic2hhcmVkIChub24gUElDKSIgbWFpbm5wLm8gc2gxbnAubyBzaDJucC5vIHNoYXJlZAotCi0JIyBUZXN0IEVMRiBzaGFyZWQgbGlicmFyeSByZWxvY2F0aW9ucyB3aXRoIGEgbm9uLXplcm8gbG9hZAotCSMgYWRkcmVzcyBmb3IgdGhlIGxpYnJhcnkuICBOZWFyIGFzIEkgY2FuIHRlbGwsIHRoZSBSXypfUkVMQVRJVkUKLQkjIHJlbG9jYXRpb25zIGZvciB2YXJpb3VzIHRhcmdldHMgYXJlIGJyb2tlbiBpbiB0aGUgY2FzZSB3aGVyZQotCSMgdGhlIGxvYWQgYWRkcmVzcyBpcyBub3QgemVybyAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLgotCXNldHVwX3hmYWlsICIqLSotc3Vub3M0KiIKLQlzZXR1cF94ZmFpbCAiKi0qLWxpbnV4KmxpYmMxIgotCXNoYXJlZF90ZXN0IHNobnAgInNoYXJlZCAobm9uIFBJQywgbG9hZCBvZmZzZXQpIiBcCi0JCW1haW5ucC5vIHNoMW5wLm8gc2gybnAubyBzaGFyZWQgXAotCQkiLVQgJHNyY2Rpci8kc3ViZGlyL2VsZi1vZmZzZXQubGQiCi0gICAgfSB9Ci0KLSAgICAjIE5vdyBjb21waWxlIHRoZSBjb2RlIHVzaW5nIC1mcGljLgotCi0gICAgaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gxLmMgJHRtcGRpci9zaDFwLm9dIAotCSB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gyLmMgJHRtcGRpci9zaDJwLm9dIH0gewotCXVucmVzb2x2ZWQgInNoYXJlZCIKLSAgICB9IGVsc2UgewotCSMgU3VuT1MgY2FuIG5vdCBjb21wYXJlIGZ1bmN0aW9uIHBvaW50ZXJzIGNvcnJlY3RseQotCWlmIFtpc3RhcmdldCAiKi0qLXN1bm9zNCoiXSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHN1bjQKLQl9IGVsc2UgeyBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2hwICJzaGFyZWQiIG1haW5ucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCi0JfSB9Ci0gICAgfQotfQotCi0jIE5vdyBkbyB0aGUgc2FtZSB0ZXN0cyBhZ2FpbiwgYnV0IHRoaXMgdGltZSBjb21waWxlIG1haW4uYyBQSUMuCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvbWFpbi5jICR0bXBkaXIvbWFpbnAub10gewotICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgotICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4pIgotfSBlbHNlIHsKLSAgICBpZiB7IFtmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMW5wLm8gXSAmJiBbIGZpbGUgZXhpc3RzICR0bXBkaXIvc2gybnAubyBdIH0gewotICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgIyBTdW5PUyBub24gUElDIHNoYXJlZCBsaWJyYXJpZXMgZG9uJ3QgcGVybWl0IHNvbWUgY2FzZXMgb2YKLQkgICAgIyBvdmVycmlkaW5nLgotCSAgICBzZXR1cF94ZmFpbCAiKi0qLXN1bm9zNCoiCi0JICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHNoYXJlZAotCX0KLSAgICB9IGVsc2UgewotCXVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgotICAgIH0KLQotICAgIGlmIHsgW2ZpbGUgZXhpc3RzICR0bXBkaXIvc2gxcC5vIF0gJiYgWyBmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMnAubyBdIH0gewotICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNobXBwICJzaGFyZWQgKFBJQyBtYWluKSIgbWFpbnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcHAgInNoYXJlZCAoUElDIG1haW4pIiBtYWlucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCi0JfQotICAgIH0gZWxzZSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbikiCi0gICAgfQotfQotCi1pZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0gICAgIyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0gICAgY2F0Y2ggImV4ZWMgcm0gLXJmICR0bXBkaXIiIGV4ZWNfc3RhdHVzCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zdW40LmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwZDg3ZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotbWFpbnZhciA9PSAxCi1vdmVycmlkZGVudmFyID09IDIKLXNobGlidmFyMSA9PSAzCi1zaGxpYl9tYWludmFyICgpID09IDEKLXNobGliX292ZXJyaWRkZW52YXIgKCkgPT0gMgotc2hsaWJfc2hsaWJ2YXIxICgpID09IDMKLXNobGliX3NobGlidmFyMiAoKSA9PSA0Ci1zaGxpYl9zaGxpYmNhbGwgKCkgPT0gNQotc2hsaWJfc2hsaWJjYWxsMiAoKSA9PSA4Ci1zaGxpYl9tYWluY2FsbCAoKSA9PSA2Ci1tYWluX2NhbGxlZCAoKSA9PSA2Ci1zaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gMAotc2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkgPT0gMQotc2hsaWJfZ2V0ZnVucHRyMSAoKSAhPSBzaGxpYl9zaGxpYnZhcjEKLXNobGliX2dldGZ1bnB0cjIgKCkgPT0gbWFpbl9jYWxsZWQKLXNobGliX2NoZWNrICgpID09IDEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQveGNvZmYuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDlkOTYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1tYWludmFyID09IDEKLW92ZXJyaWRkZW52YXIgPT0gMgotc2hsaWJ2YXIxID09IDMKLXNobGliX3NobGlidmFyMSAoKSA9PSAzCi1zaGxpYl9zaGxpYnZhcjIgKCkgPT0gNAotc2hsaWJfc2hsaWJjYWxsICgpID09IDUKLW1haW5fY2FsbGVkICgpID09IDYKLXNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAxCi1zaGxpYl9nZXRmdW5wdHIxICgpID09IHNobGliX3NobGlidmFyMQotc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkZTk3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkIGludG8gdGhlIFMtcmVjb3JkIGZvcm1hdC4gICovCi0KLWV4dGVybiBpbnQgZTE7Ci1leHRlcm4gaW50IGUyOwotaW50IGk7Ci1pbnQgaiA9IDE7Ci1zdGF0aWMgaW50IGs7Ci1zdGF0aWMgaW50IGwgPSAxOwotc3RhdGljIGNoYXIgYWJbXSA9ICJUaGlzIGlzIGEgc3RyaW5nIGNvbnN0YW50IjsKLQotZXh0ZXJuIGludCBmbjEgKCk7Ci1leHRlcm4gaW50IGZuMiAoKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIGZuMSAoYWIpOwotICBmbjIgKCJzdGF0aWMgc3RyaW5nIGNvbnN0YW50Iik7Ci0gIHJldHVybiBlMSArIGUyICsgaSArIGogKyBrICsgbDsKLX0KLQotdm9pZAotX19tYWluICgpCi17Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM2Y2ZhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LiAgKi8KLQotaW50IGUxOwotaW50IGUyID0gMTsKLQotaW50Ci1mbjEgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHJldHVybiBzW2UxXTsKLX0KLQotaW50Ci1mbjIgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHJldHVybiBzW2UyXTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkZTJkYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8gVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LgotCi0jZGVmaW5lIEZPT19NU0dfTEVOIDgwCi0KLWNsYXNzIEZvbyB7Ci0gICAgc3RhdGljIGludCBmb29zOwotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuID0gRk9PX01TR19MRU47Ci0gICAgY2hhciBtZXNzYWdlW2xlbl07Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5pdF9mb28gKCk7Ci0gICAgc3RhdGljIGludCBuYl9mb29zKCkgeyByZXR1cm4gZm9vczsgfQotICAgIEZvbygpOwotICAgIEZvbyggY2hhciogbWVzc2FnZSk7Ci0gICAgRm9vKGNvbnN0IEZvbyYpOwotICAgIEZvbyAmIG9wZXJhdG9yPSAoY29uc3QgRm9vJik7Ci0gICAgfkZvbyAoKTsKLX07Ci0KLXN0YXRpYyBGb28gc3RhdGljX2ZvbyggInN0YXRpY19mb28iKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIEZvbyBhdXRvbWF0aWNfZm9vKCAiYXV0b21hdGljX2ZvbyIpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotdGVybWluYXRlKHZvaWQpCi17Ci0gIC8qIFRoaXMgcmVjdXJzaXZlIGNhbGwgcHJldmVudHMgYSBjb21waWxlciB3YXJuaW5nIHRoYXQgdGhlIG5vcmV0dXJuCi0gICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZSBhY3R1YWxseSBkb2VzIHJldHVybi4gICovCi0gIHRlcm1pbmF0ZSAoKTsKLX0KLQotZXh0ZXJuICJDIiB7Ci12b2lkCi1fX21haW4gKCkKLXsKLX0KLQotdm9pZAotX19idWlsdGluX2RlbGV0ZSAoKQotewotfQotCi12b2lkCi1fX2J1aWx0aW5fbmV3ICgpCi17Ci19Ci0KLXZvaWQKLV9fdGhyb3cgKCkKLXsKLX0KLQotdm9pZAotX19yZXRocm93ICgpCi17Ci19Ci0KLXZvaWQKLV9fdGVybWluYXRlICgpCi17Ci19Ci0KLXZvaWQgKl9fZWhfcGM7Ci0KLXZvaWQgKioqCi1fX2dldF9keW5hbWljX2hhbmRsZXJfY2hhaW4gKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgKgotX19nZXRfZWhfY29udGV4dCAoKQotewotICByZXR1cm4gMDsKLX0KLQotfQotCi1pbnQgRm9vOjpmb29zID0gMDsKLQotdm9pZCBGb286OmluaXRfZm9vICgpCi17Ci0gIGZvb3MgPSA4MDsKLX0KLQotRm9vOjpGb28gKCkKLXsKLSAgaSA9ICsrZm9vczsKLX0KLQotRm9vOjpGb28gKGNoYXIqKQotewotICBpID0gKytmb29zOwotfQotCi1Gb286OkZvbyAoY29uc3QgRm9vJiBmb28pCi17Ci0gIGkgPSArK2Zvb3M7Ci0gIGZvciAoaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykKLSAgICBtZXNzYWdlW2tdID0gZm9vLm1lc3NhZ2Vba107Ci19Ci0KLUZvbyYgRm9vOjpvcGVyYXRvcj0gKGNvbnN0IEZvbyYgZm9vKQotewotICBmb3IgKGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspCi0gICAgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUZvbzo6fkZvbyAoKQotewotICBmb29zLS07Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcmVjLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyZWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTM4YTAwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyZWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLSMgVGVzdCBsaW5raW5nIGRpcmVjdGx5IHRvIFMtcmVjb3Jkcy4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0jIFB1YmxpYyBkb21haW4uCi0KLSMgR2V0IHRoZSBvZmZzZXQgZnJvbSBhbiBTLXJlY29yZCBsaW5lIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YS4KLQotcHJvYyBzcmVjX29mZiB7IGwgfSB7Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiUzEqIiAkbF0gewotCXJldHVybiA4Ci0gICAgfSBlbHNlIHsgaWYgW3N0cmluZyBtYXRjaCAiUzIqIiAkbF0gewotCXJldHVybiAxMAotICAgIH0gZWxzZSB7IGlmIFtzdHJpbmcgbWF0Y2ggIlMzKiIgJGxdIHsKLQlyZXR1cm4gMTIKLSAgICB9IGVsc2UgewotCXJldHVybiAtMQotICAgIH0gfSB9Ci19Ci0KLSMgU2VlIGlmIGFuIFMtcmVjb3JkIGxpbmUgY29udGFpbnMgb25seSB6ZXJvIGRhdGEuCi0KLXByb2Mgc3JlY196ZXJvIHsgbCB9IHsKLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFswNzg5XF0qIiAkbF0gewotCXJldHVybiAxCi0gICAgfQotCi0gICAgIyBTdHJpcCB0aGUgYWRkcmVzcyBhbmQgY2hlY2tzdW0uCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiU1xbMTIzXF0qIiAkbF0gewotCXNldCBsIFtzdHJpbmcgcmFuZ2UgJGwgW3NyZWNfb2ZmICRsXSBbZXhwciBbc3RyaW5nIGxlbmd0aCAkbF0gLSAzXV0KLSAgICB9IGVsc2UgewotCXJldHVybiAwCi0gICAgfQotCi0gICAgIyBUaGUgcmVzdCBtdXN0IGJlIHplcm8uCi0gICAgcmV0dXJuIFtzdHJpbmcgbWF0Y2ggIiIgW3N0cmluZyB0cmltICRsICIwIl1dCi19Ci0KLSMgR2V0IHRoZSBhZGRyZXNzIG9mIGFuIFMtcmVjb3JkIGxpbmUuCi0KLXByb2Mgc3JlY19hZGRyIHsgbCB9IHsKLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7Ci0Jc2V0IGFkZHIgW3N0cmluZyByYW5nZSAkbCA0IFtleHByIFtzcmVjX29mZiAkbF0gLSAxXV0KLSAgICB9IGVsc2UgewotCXJldHVybiAtMQotICAgIH0KLQotICAgIHJldHVybiAiMHgkYWRkciIKLX0KLQotIyBHZXQgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIGFuIFMtcmVjb3JkIGxpbmUuCi0KLXByb2Mgc3JlY19sZW4geyBsIH0gewotICAgIGlmICFbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7Ci0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICByZXR1cm4gW2V4cHIgIjB4W3N0cmluZyByYW5nZSAkbCAyIDNdIiAtIChbc3JlY19vZmYgJGxdIC0gNCkgLyAyIC0gMV0KLX0KLQotIyBFeHRyYWN0IGJ5dGVzIGZyb20gYW4gUy1yZWNvcmQgbGluZS4KLQotcHJvYyBzcmVjX2V4dHJhY3QgeyBsIHN0YXJ0IGxlbiB9IHsKLSAgICBzZXQgb2ZmIFtzcmVjX29mZiAkbF0KLSAgICBzZXQgcmxlbiBbc3JlY19sZW4gJGxdCi0gICAgc2V0IHN0b3AgW2V4cHIgJHN0YXJ0ICsgJGxlbl0KLSAgICBpZiB7ICRzdG9wID4gJHJsZW4gfSB7Ci0Jc2V0IHN0b3AgW2V4cHIgJHJsZW5dCi0gICAgfQotICAgIHNldCBzdGFydCBbZXhwciAkc3RhcnQgKiAyICsgJG9mZl0KLSAgICBzZXQgc3RvcCBbZXhwciAkc3RvcCAqIDIgKyAkb2ZmIC0gMV0KLSAgICByZXR1cm4gW3N0cmluZyByYW5nZSAkbCAkc3RhcnQgJHN0b3BdCi19Ci0KLSMgU2VlIGlmIGEgcmFuZ2Ugb2YgYnl0ZXMgaW4gYW4gUy1yZWNvcmQgbGluZSBpcyBhbGwgemVyb2VzLgotCi1wcm9jIHNyZWNfemVyb19yYW5nZSB7IGwgc3RhcnQgbGVuIH0gewotICAgIHJldHVybiBbc3RyaW5nIG1hdGNoICIiIFtzdHJpbmcgdHJpbSBbc3JlY19leHRyYWN0ICRsICRzdGFydCAkbGVuXSAiMCJdXQotfQotCi0jIFRyaW0gYW4gUy1yZWNvcmQgbGluZSBzdWNoIHRoYXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgcmVtYWluCi0jIGF0IHRoZSBlbmQuCi0KLXByb2Mgc3JlY190cmltIHsgbCBsZWF2ZSB9IHsKLSAgICBzZXQgb2ZmIFtzcmVjX29mZiAkbF0KLSAgICBzZXQgYWRkciBbc3JlY19hZGRyICRsXQotICAgIHNldCBsZW4gW3NyZWNfbGVuICRsXQotCi0gICAgaWYgeyAkbGVhdmUgPj0gJGxlbiB9IHsKLQlyZXR1cm4gJGwKLSAgICB9Ci0KLSAgICBzZXQgczEgW3N0cmluZyByYW5nZSAkbCAwIDFdCi0gICAgc2V0IHMyIFtmb3JtYXQgIiUwMngiIFtleHByICgkb2ZmIC0gNCkgLyAyICsgJGxlYXZlICsgMV1dCi0gICAgc2V0IHMzIFtmb3JtYXQgIiUwW2V4cHIgJG9mZiAtIDRdeCIgW2V4cHIgJGFkZHIgKyAkbGVuIC0gJGxlYXZlXV0KLSAgICBzZXQgczQgW3N0cmluZyByYW5nZSAkbCBbZXhwciBbc3RyaW5nIGxlbmd0aCAkbF0gLSAoJGxlYXZlICogMikgLSAyXSBlbmRdCi0gICAgc2V0IHMgIiR7czF9JHtzMn0ke3MzfSR7czR9IgotCi0gICAgdmVyYm9zZSAic3JlY190cmltIHsgJyRsJyAkbGVhdmUgfSByZXR1cm5pbmcgJyRzJyIgMgotCi0gICAgcmV0dXJuICRzCi19Ci0KLSMgUmVwb3J0IGZhaWx1cmUgd2hlbiBjb21wYXJpbmcgUy1yZWNvcmQgbGluZXMKLQotcHJvYyBzcmVjX2NvbXBhcmVfZmFpbCB7IHdoaWNoIGwxIGwyIH0gewotICAgIHNlbmRfbG9nICJjb21wYXJpc29uIGZhaWx1cmUgJHdoaWNoOlxuJGwxXG4kbDJcbiIKLSAgICB2ZXJib3NlICJjb21wYXJpc29uIGZhaWx1cmUgJHdoaWNoOlxuJGwxXG4kbDIiCi19Ci0KLSMgQ29tcGFyZSBTLXJlY29yZCBmaWxlcy4gIFdlIGRvbid0IHdhbnQgdG8gZnVzcyBhYm91dCB0aGluZ3MgbGlrZQotIyBleHRyYSB6ZXJvZXMuICBOb3RlIHRoYXQgQkZEIGFsd2F5cyBzb3J0cyBTLXJlY29yZHMgYnkgYWRkcmVzcy4KLQotcHJvYyBzcmVjX2NvbXBhcmUgeyBmMSBmMiB9IHsKLSAgICBzZXQgZTEgW2dldHMgJGYxIGwxXQotICAgIHNldCBlMiBbZ2V0cyAkZjIgbDJdCi0KLSAgICB3aGlsZSB7ICRlMSAhPSAtMSB9IHsKLQlzZXQgbDEgW3N0cmluZyB0cmltcmlnaHQgJGwxICJcclxuIl0KLQlzZXQgbDIgW3N0cmluZyB0cmltcmlnaHQgJGwyICJcclxuIl0KLQlpZiB7ICRlMiA9PSAtMSB9IHsKLQkgICAgIyBJZiBsMSBjb250YWlucyBkYXRhLCBpdCBtdXN0IGJlIHplcm8uCi0JICAgIGlmICFbc3JlY196ZXJvICRsMV0gewotCQlzZW5kX2xvZyAiZGF0YSBhZnRlciBFT0Y6ICRsMVxuIgotCQl2ZXJib3NlICJkYXRhIGFmdGVyIEVPRjogJGwxIgotCQlyZXR1cm4gMAotCSAgICB9Ci0JfSBlbHNlIHsgaWYgeyBbc3RyaW5nIGNvbXBhcmUgJGwxICRsMl0gPT0gMCB9IHsKLQkgICAgc2V0IGUxIFtnZXRzICRmMSBsMV0KLQkgICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KLQl9IGVsc2UgeyBpZiB7IFtzcmVjX3plcm8gJGwxXSB9IHsKLQkgICAgc2V0IGUxIFtnZXRzICRmMSBsMV0KLQl9IGVsc2UgeyBpZiB7IFtzcmVjX3plcm8gJGwyXSB9IHsKLQkgICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KLQl9IGVsc2UgewotCSAgICAjIFRoZSBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUsIGFuZCBuZWl0aGVyIGlzIGFsbCB6ZXJvZXMuCi0JICAgIHNldCBhMSBbc3JlY19hZGRyICRsMV0KLQkgICAgc2V0IG4xIFtzcmVjX2xlbiAkbDFdCi0JICAgIHNldCBhMiBbc3JlY19hZGRyICRsMl0KLQkgICAgc2V0IG4yIFtzcmVjX2xlbiAkbDJdCi0KLQkgICAgaWYgeyAkYTEgPCAkYTIgJiYgIVtzcmVjX3plcm9fcmFuZ2UgJGwxIDAgW2V4cHIgJGEyIC0gJGExXV0gfSB7Ci0JCXZlcmJvc2UgIiRhMSAkYTIgW3NyZWNfZXh0cmFjdCAkbDEgMCBbZXhwciAkYTIgLSAkYTFdXSIgMgotCQlzcmVjX2NvbXBhcmVfZmFpbCAxICRsMSAkbDIKLQkJcmV0dXJuIDAKLQkgICAgfQotCSAgICBpZiB7ICRhMiA8ICRhMSAmJiAhW3NyZWNfemVyb19yYW5nZSAkbDIgMCBbZXhwciAkYTEgLSAkYTJdXSB9IHsKLQkJc3JlY19jb21wYXJlX2ZhaWwgMiAkbDEgJGwyCi0JCXJldHVybiAwCi0JICAgIH0KLQotCSAgICAjIEhlcmUgd2Uga25vdyB0aGF0IGFueSBpbml0aWFsIGRhdGEgaW4gYm90aCBsaW5lcyBpcwotCSAgICAjIHplcm8uICBOb3cgbWFrZSBzdXJlIHRoYXQgYW55IG92ZXJsYXBwaW5nIGRhdGEgbWF0Y2hlcy4KLQkgICAgaWYgeyAkYTEgPCAkYTIgfSB7Ci0JCXNldCBvczEgW2V4cHIgJGEyIC0gJGExXQotCQlzZXQgb3MyIDAKLQkgICAgfSBlbHNlIHsKLQkJc2V0IG9zMSAwCi0JCXNldCBvczIgW2V4cHIgJGExIC0gJGEyXQotCSAgICB9Ci0JICAgIGlmIHsgJGExICsgJG4xIDwgJGEyICsgJG4yIH0gewotCQlzZXQgb2wgW2V4cHIgJG4xIC0gJG9zMV0KLQkgICAgfSBlbHNlIHsKLQkJc2V0IG9sIFtleHByICRuMiAtICRvczJdCi0JICAgIH0KLQotCSAgICBzZXQgeDEgW3NyZWNfZXh0cmFjdCAkbDEgJG9zMSAkb2xdCi0JICAgIHNldCB4MiBbc3JlY19leHRyYWN0ICRsMiAkb3MyICRvbF0KLQkgICAgaWYgeyBbc3RyaW5nIGNvbXBhcmUgJHgxICR4Ml0gIT0gMCB9IHsKLQkJdmVyYm9zZSAiJG9zMSAkb2wgJHgxIiAyCi0JCXZlcmJvc2UgIiRvczIgJG9sICR4MiIgMgotCQlzcmVjX2NvbXBhcmVfZmFpbCAzICRsMSAkbDIKLQkJcmV0dXJuIDAKLQkgICAgfQotCi0JICAgICMgVGhlc2Ugc3RyaW5ncyBtYXRjaC4gIFRyaW0gdGhlIGRhdGEgZnJvbSB0aGUgbGFyZ2VyCi0JICAgICMgc3RyaW5nLCByZWFkIGEgbmV3IGNvcHkgb2YgdGhlIHNtYWxsZXIgc3RyaW5nLCBhbmQKLQkgICAgIyBjb250aW51ZS4KLQkgICAgaWYgeyAkYTEgKyAkbjEgPCAkYTIgKyAkbjIgfSB7Ci0JCXNldCBsMiBbc3JlY190cmltICRsMiBbZXhwciAoJGEyICsgJG4yKSAtICgkYTEgKyAkbjEpXV0KLQkJc2V0IGUxIFtnZXRzICRmMSBsMV0KLQkgICAgfSBlbHNlIHsgaWYgeyAkYTEgKyAkbjEgPiAkYTIgKyAkbjIgfSB7Ci0JCXNldCBsMSBbc3JlY190cmltICRsMSBbZXhwciAoJGExICsgJG4xKSAtICgkYTIgKyAkbjIpXV0KLQkJc2V0IGUyIFtnZXRzICRmMiBsMl0KLQkgICAgfSBlbHNlIHsKLQkJc2V0IGUxIFtnZXRzICRmMSBsMV0KLQkJc2V0IGUyIFtnZXRzICRmMiBsMl0KLQkgICAgfSB9Ci0JfSB9IH0gfQotICAgIH0KLQotICAgICMgV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBmaWxlLiAgVGhlIHJlbWFpbmRlciBvZiB0aGUKLSAgICAjIHNlY29uZCBmaWxlIG11c3QgY29udGFpbiBvbmx5IHplcm9lcy4KLSAgICB3aGlsZSB7ICRlMiAhPSAtMSB9IHsKLQlzZXQgbDIgW3N0cmluZyB0cmltcmlnaHQgJGwyICJcclxuIl0KLQlpZiAhW3NyZWNfemVybyAkbDJdIHsKLQkgICAgc2VuZF9sb2cgImRhdGEgYWZ0ZXIgRU9GOiAkbDJcbiIKLQkgICAgdmVyYm9zZSAiZGF0YSBhZnRlciBFT0Y6ICRsMiIKLQkgICAgcmV0dXJuIDAKLQl9Ci0Jc2V0IGUyIFtnZXRzICRmMiBsMl0KLSAgICB9Ci0KLSAgICByZXR1cm4gMQotfQotCi0jIExpbmsgdHdpY2UsIG9iamNvcHksIGFuZCBjb21wYXJlCi0KLXByb2MgcnVuX3NyZWNfdGVzdCB7IHRlc3Qgb2JqcyB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgb2JqY29weQotICAgIGdsb2JhbCBzaXplb2ZfaGVhZGVycwotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNldCBmbGFncyAiIgotCi0gICAgIyBJZiB0aGUgbGlua2VyIHNjcmlwdCB1c2VzIFNJWkVPRl9IRUFERVJTLCB1c2UgYSAtVHRleHQgYXJndW1lbnQKLSAgICAjIHRvIGZvcmNlIGJvdGggdGhlIG5vcm1hbCBsaW5rIGFuZCB0aGUgUy1yZWNvcmQgbGluayB0byBiZSBwdXQgaW4KLSAgICAjIHRoZSBzYW1lIHBsYWNlLiAgV2UgZG9uJ3QgYWx3YXlzIHVzZSAtVHRleHQgYmVjYXVzZSBpdCBpbnRlcmFjdHMKLSAgICAjIHBvb3JseSB3aXRoIGEub3V0LgotCi0gICAgaWYgeyAkc2l6ZW9mX2hlYWRlcnMgfSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLVR0ZXh0IDB4MTAwMCIKLSAgICB9Ci0KLSAgICAjIFRoZSBhMjlrIGNvbXBpbGVkIGNvZGUgY2FsbHMgVl9TUElMTCBhbmQgVl9GSUxMLiAgU2luY2Ugd2UgZG9uJ3QKLSAgICAjIG5lZWQgdG8gcnVuIHRoaXMgY29kZSwgYnV0IHdlIGRvbid0IGhhdmUgZGVmaW5pdGlvbnMgZm9yIHRob3NlCi0gICAgIyBmdW5jdGlvbnMsIHdlIGp1c3QgZGVmaW5lIHRoZW0gb3V0LgotICAgIGlmIFtpc3RhcmdldCBhMjlrKi0qLSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBWX1NQSUxMPTAgLS1kZWZzeW0gVl9GSUxMPTAiCi0gICAgfQotCi0gICAgIyBBUk0gdGFyZ2V0cyBjYWxsIF9fZ2NjbWFpbgotICAgIGlmIFtpc3RhcmdldCBhcm0qLSotKl0gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fX2djY21haW49MCIKLSAgICB9Ci0gICAgCi0gICAgaWYgW2lzdGFyZ2V0IHN0cm9uZ2FybSotKi0qXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19nY2NtYWluPTAiCi0gICAgfQotICAgIAotICAgICMgVGh1bWIgdGFyZ2V0cyBjYWxsIF9fZ2NjbWFpbgotICAgIGlmIFtpc3RhcmdldCB0aHVtYi0qLSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBfX19nY2NtYWluPTAiCi0gICAgfQotCi0gICAgIyBQb3dlclBDIEVBQkkgY29kZSBjYWxscyBfX2VhYmkuCi0gICAgaWYgW2lzdGFyZ2V0IHBvd2VycGMqLSotZWFiaSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBfX2VhYmk9MCIKLSAgICB9Ci0KLSAgICAjIG1uMTAyMDAgY29kZSBjYWxscyBfX3RydW5jc2lwc2kyX2QwX2QyLgotICAgIGlmIHtbaXN0YXJnZXQgbW4xMDIwMCotKi0qXX0gdGhlbiB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX190cnVuY3NpcHNpMl9kMF9kMj0wIgotICAgIH0KLQotICAgICMgVjg1MCB0YXJnZXRzIG5lZWQgbGliZ2NjLmEKLSAgICBpZiBbaXN0YXJnZXQgdjg1MCotKi1lbGZdIHsKLQlzZXQgb2JqcyAiJG9ianMgLUwgLi4vZ2NjIC1sZ2NjIgotICAgIH0KLSAgICAKLSAgICBpZiB7ICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zcjEgIiRmbGFncyAkb2JqcyJdIFwKLQkgfHwgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NyMi5zciAiJGZsYWdzIC1vZm9ybWF0IHNyZWMgJG9ianMiXSB9IHsKLQlzZXR1cF94ZmFpbCAiaHBwYSotKi0qZWxmKiIKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgc2VuZF9sb2cgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyXG4iCi0gICAgdmVyYm9zZSAiJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc3IxIHRtcGRpci9zcjEuc3IiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamNvcHkgLU8gc3JlYyB0bXBkaXIvc3IxIHRtcGRpci9zcjEuc3IiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQl1bnJlc29sdmVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGYxIFtvcGVuIHRtcGRpci9zcjEuc3Igcl0KLSAgICBzZXQgZjIgW29wZW4gdG1wZGlyL3NyMi5zciByXQotICAgIGlmIFtzcmVjX2NvbXBhcmUgJGYxICRmMl0gewotCXBhc3MgJHRlc3QKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3QKLSAgICB9Ci0gICAgY2xvc2UgJGYxCi0gICAgY2xvc2UgJGYyCi19Ci0KLXNldCB0ZXN0MSAiUy1yZWNvcmRzIgotc2V0IHRlc3QyICJTLXJlY29yZHMgd2l0aCBjb25zdHJ1Y3RvcnMiCi0KLSMgU2VlIHdoZXRoZXIgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdCB1c2VzIFNJWkVPRl9IRUFERVJTLgotY2F0Y2ggImV4ZWMgJGxkIC0tdmVyYm9zZSIgZXhlY19vdXRwdXQKLXNldCBzaXplb2ZfaGVhZGVycyBbc3RyaW5nIG1hdGNoICIqU0laRU9GX0hFQURFUlMqIiAkZXhlY19vdXRwdXRdCi0KLSMgRmlyc3QgdGVzdCBsaW5raW5nIGEgQyBwcm9ncmFtLiAgV2UgZG9uJ3QgcmVxdWlyZSBhbnkgbGlicmFyaWVzLiAgV2UKLSMgbGluayBpdCBub3JtYWxseSwgYW5kIG9iamNvcHkgdG8gdGhlIFMtcmVjb3JkIGZvcm1hdCwgYW5kIHRoZW4gbGluawotIyBkaXJlY3RseSB0byB0aGUgUy1yZWNvcmQgZm9ybWF0LCBhbmQgcmVxdWlyZSB0aGF0IHRoZSB0d28gZmlsZXMKLSMgY29udGFpbiB0aGUgc2FtZSBkYXRhLgotCi1pZiB7IFt3aGljaCAkQ0NdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3QxCi0gICAgdW50ZXN0ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLWlmIHsgIVtsZF9jb21waWxlICRDQyAkc3JjZGlyLyRzdWJkaXIvc3IxLmMgdG1wZGlyL3NyMS5vXSBcCi0gICAgIHx8ICFbbGRfY29tcGlsZSAkQ0MgJHNyY2Rpci8kc3ViZGlyL3NyMi5jIHRtcGRpci9zcjIub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi0jIFRoZSBpMzg2LWFvdXQgdGFyZ2V0IGlzIGNvbmZ1c2VkOiB0aGUgbGlua2VyIGRvZXMgbm90IHB1dCB0aGUKLSMgc2VjdGlvbnMgd2hlcmUgb2JqZHVtcCBmaW5kcyB0aGVtLiAgSSBkb24ndCBrbm93IHdoaWNoIGlzIHdyb25nLgotc2V0dXBfeGZhaWwgImkqODYtKi1hb3V0KiIKLQotIyBUaGVzZSB0ZXN0cyBmYWlsIG9uIHRoZSBuYXRpdmUgTUlQUyBFTEYgdGFyZ2V0cyBiZWNhdXNlIHRoZSBHUCB2YWx1ZQotIyBpbiB0aGUgLnJlZ2luZm8gc2VjdGlvbiBpcyBub3QgdXBkYXRlZCB3aGVuIHRoZSBTLXJlY29yZCB2ZXJzaW9uIGlzCi0jIHdyaXR0ZW4gb3V0LiAgVGhlIG1pcHMtZWxmIHRhcmdldCBpdHNlbGYgZG9lcyBub3QgdXNlIGEgLnJlZ2luZm8gc2VjdGlvbi4KLXNldHVwX3hmYWlsICJtaXBzKi0qLWlyaXg1KiIgIm1pcHMqLSotaXJpeDYqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBkbyB0aGUgbWFnaWMgVE9DIGhhbmRsaW5nIHRoYXQgWENPRkYKLSMgbGlua2VycyBkby4KLXNldHVwX3hmYWlsICIqLSotYWl4KiIgIiotKi14Y29mZioiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IGJ1aWxkIEFSTS9UaHVtYiBzdHVicy4KLXNldHVwX3hmYWlsICJhcm0tKi1jb2ZmIgotc2V0dXBfeGZhaWwgInN0cm9uZ2FybSotKi0qIgotc2V0dXBfeGZhaWwgImFybS0qLXBlKiIKLSMgc2V0dXBfeGZhaWwgImFybS0qZWxmKiIKLXNldHVwX3hmYWlsICJ0aHVtYi0qLWNvZmYqIgotc2V0dXBfeGZhaWwgInRodW1iLSotcGUqIgotc2V0dXBfeGZhaWwgInRodW1iLSotZWxmKiIKLXNldHVwX3hmYWlsICJhcm0qLSotbGludXgqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBidWlsZCBzcGVjaWFsIEVBQkkgc2VjdGlvbnMuCi1zZXR1cF94ZmFpbCAicG93ZXJwYyotKi1lYWJpKiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgaW5jbHVkZSB0aGUgLnt6ZGF9IHNlY3Rpb25zLgotc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBoYW5kbGUgQWxwaGEgRWxmIHJlbGF4YXRpb24uCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotZWxmKiIgImFscGhhKi0qLWxpbnV4LWdudSoiICJhbHBoYSotKi1nbnUqIgotc2V0dXBfeGZhaWwgImFscGhhKi0qLW5ldGJzZCoiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IHN1cHBvcnQgdGhlIHNwZWNpYWwgUEUgaGVhZGVycyAtIHRoZSBQRQotIyBlbXVsYXRpb24gdHJpZXMgdG8gd3JpdGUgcGUtc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gdGhlIFBFIGhlYWRlcnMKLSMgaW4gdGhlIG91dHB1dCBiZmQsIGJ1dCBpdCdzIG5vdCBhIFBFIGJmZCAoaXQncyBhbiBzcmVjIGJmZCkKLXNldHVwX3hmYWlsICIqLSotY3lnd2luKiIgIiotKi1taW5ndyoiICIqLSotcGUqIiAiKi0qLXdpbm50KiIKLQotcnVuX3NyZWNfdGVzdCAkdGVzdDEgInRtcGRpci9zcjEubyB0bXBkaXIvc3IyLm8iCi0KLSMgTm93IHRyeSBsaW5raW5nIGEgQysrIHByb2dyYW0gd2l0aCBnbG9iYWwgY29uc3RydWN0b3JzIGFuZAotIyBkZXN0cnVjdG9ycy4gIE5vdGUgdGhhdCBzaW5jZSB3ZSBhcmUgbm90IGxpbmtpbmcgYWdhaW5zdCBhbnkKLSMgbGlicmFyaWVzLCB0aGlzIHByb2dyYW0gd29uJ3QgYWN0dWFsbHkgd29yayBvciBhbnl0aGluZy4KLQotaWYgeyBbd2hpY2ggJENYWF0gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9jb21waWxlICIkQ1hYICRDWFhGTEFHUyAtZmdudS1saW5rZXIiICRzcmNkaXIvJHN1YmRpci9zcjMuY2MgdG1wZGlyL3NyMy5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotIyBTZWUgYWJvdmUuCi1zZXR1cF94ZmFpbCAiaSo4Ni0qLWFvdXQqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotaXJpeDUqIiAibWlwcyotKi1pcml4NioiCi1zZXR1cF94ZmFpbCAiKi0qLWFpeCoiICIqLSoteGNvZmYqIgotc2V0dXBfeGZhaWwgImFybSotKi0qIgotc2V0dXBfeGZhaWwgInN0cm9uZ2FybSotKi0qIgotc2V0dXBfeGZhaWwgInRodW1iLSotKiIKLXNldHVwX3hmYWlsICJwb3dlcnBjKi0qLWVhYmkqIgotc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgotc2V0dXBfeGZhaWwgImFscGhhKi0qLWVsZioiICJhbHBoYSotKi1saW51eC1nbnUqIiAiYWxwaGEqLSotZ251KiIKLXNldHVwX3hmYWlsICJhbHBoYSotKi1uZXRic2QqIgotc2V0dXBfeGZhaWwgIiotKi1jeWd3aW4qIiAiKi0qLW1pbmd3KiIgIiotKi1wZSoiICIqLSotd2lubnQqIgotCi1ydW5fc3JlY190ZXN0ICR0ZXN0MiAidG1wZGlyL3NyMy5vIgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuYyBiL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFlYzYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHRlc3QgdGhlIGxpbmtlcidzIHJlcG9ydGluZyBvZiB1bmRlZmluZWQKLSAgIHN5bWJvbHMuICAqLwotCi1leHRlcm4gaW50IHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQgKCk7Ci0KLWludAotZnVuY3Rpb24gKCkKLXsKLSAgcmV0dXJuIHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQgKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTUxOTIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMgVGVzdCB0aGF0IHRoZSBsaW5rZXIgcmVwb3J0cyB1bmRlZmluZWQgc3ltYm9sIGVycm9ycyBjb3JyZWN0bHkuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0jCi0jICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLXNldCB0ZXN0dW5kICJ1bmRlZmluZWQiCi1zZXQgdGVzdGZuICJ1bmRlZmluZWQgZnVuY3Rpb24iCi1zZXQgdGVzdGxpbmUgInVuZGVmaW5lZCBsaW5lIgotCi1pZiB7IFt3aGljaCAkQ0NdID09IDAgfSB7Ci0gICAgdmVyYm9zZSAiQ291bGQgbm90IGZpbmQgQyBjb21waWxlciEiIDEKLSAgICB1bnRlc3RlZCAkdGVzdHVuZAotICAgIHVudGVzdGVkICR0ZXN0Zm4KLSAgICB1bnRlc3RlZCAkdGVzdGxpbmUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9jb21waWxlICIkQ0MgLWciICRzcmNkaXIvJHN1YmRpci91bmRlZmluZWQuYyB0bXBkaXIvdW5kZWZpbmVkLm9dIHsKLSAgICB2ZXJib3NlICJVbmFibGUgdG8gY29tcGlsZSB0ZXN0IGZpbGUhIiAxCi0gICAgdW5yZXNvbHZlZCAkdGVzdHVuZAotICAgIHVucmVzb2x2ZWQgJHRlc3RmbgotICAgIHVucmVzb2x2ZWQgJHRlc3RsaW5lCi0gICAgcmV0dXJuCi19Ci0KLWNhdGNoICJleGVjIHJtIC1mIHRtcGRpci91bmRlZmluZWQiIGV4ZWNfb3V0cHV0Ci0KLSMgVXNpbmcgLWUgc3RhcnQgcHJldmVudHMgdGhlIFN1bk9TIGxpbmtlciBmcm9tIHRyeWluZyB0byBidWlsZCBhCi0jIHNoYXJlZCBsaWJyYXJ5Lgotc2VuZF9sb2cgIiRsZCAtZSBzdGFydCAtbyB0bXBkaXIvdW5kZWZpbmVkIHRtcGRpci91bmRlZmluZWQub1xuIgotdmVyYm9zZSAiJGxkIC1lIHN0YXJ0IC1vIHRtcGRpci91bmRlZmluZWQgdG1wZGlyL3VuZGVmaW5lZC5vIgotCi1jYXRjaCAiZXhlYyAkbGQgLWUgc3RhcnQgLW8gdG1wZGlyL3VuZGVmaW5lZCB0bXBkaXIvdW5kZWZpbmVkLm8iIGV4ZWNfb3V0cHV0Ci1zZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi12ZXJib3NlICIkZXhlY19vdXRwdXQiCi0KLXByb2MgY2hlY2t1bmQgeyBzdHJpbmcgdGVzdG5hbWUgfSB7Ci0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIqJHN0cmluZyoiICRleGVjX291dHB1dF0gewotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0KLX0KLQotc2V0IG11ICJ1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkJyIKLWNoZWNrdW5kICRtdSAkdGVzdHVuZAotCi0jIEFSTSBQRSBkZWZhdWx0cyB0byB1c2luZyBzdGFicyBkZWJ1Z2dpbmcsIHdoaWNoIHdlIGNhbid0IGhhbmRsZSBmb3IKLSMgYSBDT0ZGIGZpbGUuCi0jc2V0dXBfeGZhaWwgImFybSotKi1wZSoiCi0jc2V0dXBfeGZhaWwgInRodW1iKi0qLXBlKiIKLQotIyBKdXN0IGRvZXNuJ3Qgd29yayBmb3IgUEEgRUxGLiAgTm8gY2x1ZSB3aHkuCi1zZXR1cF94ZmFpbCAiaHBwYSotKi0qZWxmKiIKLQotc2V0IG1mICJ0bXBkaXIvdW5kZWZpbmVkLm86IEluIGZ1bmN0aW9uIGBmdW5jdGlvbic6IgotY2hlY2t1bmQgJG1mICR0ZXN0Zm4KLQotIyBDT0ZGIFNIIGdldHMgdGhpcyB0ZXN0IHdyb25nLS1pdCByZXBvcnRzIGxpbmUgMTAsIGJlY2F1c2UgYWx0aG91Z2gKLSMgdGhlIGp1bXAgaXMgYXQgbGluZSA5LCB0aGUgZnVuY3Rpb24gYWRkcmVzcywgYW5kIHRoZSByZWxvYywgaXMKLSMgc3RvcmVkIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgotc2V0dXBfeGZhaWwgInNoLSotKiIKLQotIyBBUk0gUEUgZGVmYXVsdHMgdG8gdXNpbmcgc3RhYnMgZGVidWdnaW5nLCB3aGljaCB3ZSBjYW4ndCBoYW5kbGUgZm9yCi0jIGEgQ09GRiBmaWxlLgotI3NldHVwX3hmYWlsICJhcm0qLSotcGUqIgotI3NldHVwX3hmYWlsICJ0aHVtYiotKi1wZSoiCi0KLSMgSnVzdCBkb2Vzbid0IHdvcmsgZm9yIFBBIEVMRi4gIE5vIGNsdWUgd2h5Lgotc2V0dXBfeGZhaWwgImhwcGEqLSotKmVsZioiCi0KLXNldCBtbCAidW5kZWZpbmVkLmM6OTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCciCi0jIFdpdGggdGFyZ2V0cyB0aGF0IHVzZSBlbGYvZHdhcmYyLCBzdWNoIGFzIHRoZSBhcm0tZWxmIGFuZCB0aHVtYi1lbGYKLSMgdG9vbGNoYWlucywgdGhlIGNvZGUgaW4gYmZkL2VsZi5jOl9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKCkgaXMgY2FsbGVkCi0jIGluIG9yZGVyIHRvIGxvY2F0ZSB0aGUgZmlsZSBuYW1lL2xpbmUgbnVtYmVyIHdoZXJlIHRoZSB1bmRlZmluZWQKLSMgcmVmZXJlbmNlIG9jY3Vycy4gIFVuZm9ydHVuYXRlbHkgdGhpcyB0cmllcyB0byB1c2UgdGhlIGR3YXJmMiBkZWJ1ZwotIyBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGEgc2VyaWVzCi0jIG9mIGNvbXBfdW5pdCBzdHJ1Y3R1cmVzLCBlYWNoIG9mIHdoaWNoIGhhcyBhIGxvdy9oaWdoIGFkZHJlc3MgcmFuZ2UKLSMgcmVwcmVzZW50aW5nIHRoZSBzcGFuIG9mIG1lbW9yeSBsb2NhdGlvbnMgY292ZXJlZCBieSB0aGF0IHN0cnVjdHVyZS4gIFRoZQotIyBzdHJ1Y3R1cmVzIGFsc28gaW5kZXggaW50byBvdGhlciBzdHJ1Y3R1cmVzIGhlbGQgaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24KLSMgYW5kIHRvZ2V0aGVyIHRoZXkgY2FuIHRyYW5zbGF0ZSBtZW1vcnkgbG9jYXRpb25zIGJhY2sgaW50byBmaWxlL2Z1bmN0aW9uL2xpbmUKLSMgbnVtYmVyIGFkZHJlc3NlcyBpbiB0aGUgc291cmNlIGNvZGUuICBTaW5jZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lbW9yeQotIyByZWdpb24gY292ZXJlZCBieSBhIGNvbXBfdW5pdCBpcyBvbmx5IGRldGVybWluZWQgYXQgbGluayB0aW1lLCB0aGUgbG93L2hpZ2gKLSMgYWRkcmVzc2VzIGluIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIGFuZCB0aGUgbGluZSBhZGRyZXNzZXMgaW4gdGhlIC5kZWJ1Z19saW5lCi0jIHNlY3Rpb24gYXJlIGNvbXB1dGVkIGJ5IGdlbmVyYXRpbmcgcmVsb2NzIGFnYWluc3Qga25vd24gc3ltYm9scyBpbiB0aGUgb2JqZWN0Ci0jIGNvZGUuCi0jCi0jIFdoZW4gdGhlIHVuZGVmaW5lZCByZWZlcmVuY2UgaXMgZGV0ZWN0ZWQsIHRoZSByZWxvY3MgaW4gdGhlIGR3YXJmMgotIyBkZWJ1ZyBzZWN0aW9ucyBoYXZlIG5vdCB5ZXQgYmVlbiByZXNvbHZlZCwgc28gdGhlIGxvdy9oaWdoIGFkZHJlc3NlcyBhbmQgdGhlCi0jIGxpbmUgbnVtYmVyIGFkZHJlc3MgYXJlIGFsbCBzZXQgYXQgemVyby4gIFRodXMgd2hlbiBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSgpCi0jIGNhbGxzIF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKCkgbm8gY29tcF91bml0IGNhbiBiZSBmb3VuZCB3aGljaAotIyBhY3R1YWxseSBjb3ZlcnMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHJlZmVyZW5jZSBvY2N1cmVkLCBhbmQgc28KLSMgX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUoKSBmYWlscy4KLSMKLSMgVGhlIHVwc2hvdCBvZiBhbGwgb2YgdGhpcywgaXMgdGhhdCB0aGUgZXJyb3IgbWVzc2FnZSByZXBvcnRlZCBieSB0aGUKLSMgbGlua2VyLCBpbnN0ZWFkIG9mIGhhdmluZyBhIHNvdXJjZSBmaWxlIG5hbWUgJiBsaW5lIG51bWJlciBhcyBpbjoKLSMKLSMgICB1bmRlZmluZWQuYzo5OiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkJwotIwotIyBoYXMgYW4gb2JqZWN0IGZpbGUgJiBzZWN0aW9uIGFkZHJlc3MgaW5zdGVhZDoKLSMKLSMgICB1bmRlZmluZWQuMCgudGV4dCsweGMpOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkJwotIwotIyBoZW5jZSB0aGUgeGZhaWxzIGJlbG93LgotCi0jc2V0dXBfeGZhaWwgYXJtLSotZWxmCi0jc2V0dXBfeGZhaWwgc3Ryb25nYXJtLSotZWxmCi0jc2V0dXBfeGZhaWwgdGh1bWItKi1lbGYKLXNldHVwX3hmYWlsIG1jb3JlLSotZWxmCi1zZXR1cF94ZmFpbCBtaXBzLXNnaS1pcml4NioKLQotY2hlY2t1bmQgJG1sICR0ZXN0bGluZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTEucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMS5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3MGQ4MC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMS5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0yLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTIucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNGRjNTkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTIucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEubGQgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEubGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNWM0ZTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLmxkCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLU9VVFBVVF9GT1JNQVQoInNyZWMiKQotU0VDVElPTlMKLXsKLQotCi0udGV4dCAwIDogeyAqKCI5IikgKigiMTAiKSAqKCIxMSIpICooIjEyIikgKigiMTMiKSAqKCIxNCIpICooIjE1IikKLQkJKigiNyIpICooIjgiKSAqKCIwIikgKigiMSIpICooIjIiKSAqKCIzIikgKigiNCIpIH0KLS5ic3MgKE5PTE9BRCkgIDogeyAgKigiNSIpICooIjYiKSB9Ci0KLS5QQUZJICAgID0weDAwMDAwMDUwIDsKLS5QQ0hJTyAgID0weDAwMDAwMEQwIDsKLS5QQ0xPICAgID0weDAwMDAwMDU0IDsKLS5QQ1ZCU1YgID0weDAwMDAwMDBFIDsKLS5QQ1ZUU1UgID0weDAwMDAwMDEyIDsKLS5QQ1ZUU1YgID0weDAwMDAwMDE2IDsKLS5QQ1ZUU1ZMID0weDAwMDAwMDFBIDsKLS5QQ1ZUVVMgID0weDAwMDAwMDFFIDsKLS5QRElTICAgID0weDAwMDAwMDIyIDsKLS5QRElTTCAgID0weDAwMDAwMDI2IDsKLS5QRFZKICAgID0weDAwMDAwMDJBIDsKLS5QRUlPICAgID0weDAwMDAwMENDIDsKLS5QRU9GICAgID0weDAwMDAwMDU4IDsKLS5QRU9MICAgID0weDAwMDAwMDVDIDsKLS5QRVFVUyAgID0weDAwMDAwMDJFIDsKLS5QRVFVViAgID0weDAwMDAwMDMyIDsKLS5QRVFVVkwgID0weDAwMDAwMDM2IDsKLS5QRVFVVyAgID0weDAwMDAwMERFIDsKLS5QR0NNICAgID0weDAwMDAwMDY0IDsKLS5QR0VRUyAgID0weDAwMDAwMDNBIDsKLS5QR0VRViAgID0weDAwMDAwMDNFIDsKLS5QR0VRVkwgID0weDAwMDAwMDQyIDsKLS5QR0VUICAgID0weDAwMDAwMDYwIDsKLS5QR1JUUyAgID0weDAwMDAwMDQ2IDsKLS5QR1JUViAgID0weDAwMDAwMDRBIDsKLS5QR1JUVkwgID0weDAwMDAwMDRFIDsKLS5QSUFDVCAgID0weDAwMDAwMDZDIDsKLS5QSUZEICAgID0weDAwMDAwMDY4IDsKLS5QSU5EUyAgID0weDAwMDAwMDUyIDsKLS5QSU5EViAgID0weDAwMDAwMDU2IDsKLS5QSU5EVkwgID0weDAwMDAwMDVBIDsKLS5QSU5EVyAgID0weDAwMDAwMEQ2IDsKLS5QTERDUyAgID0weDAwMDAwMDVFIDsKLS5QTERDViAgID0weDAwMDAwMDYyIDsKLS5QTEVRUyAgID0weDAwMDAwMDY2IDsKLS5QTEVRViAgID0weDAwMDAwMDZBIDsKLS5QTEVRVkwgID0weDAwMDAwMDZFIDsKLS5QTEVTUyAgID0weDAwMDAwMDcyIDsKLS5QTEVTViAgID0weDAwMDAwMDc2IDsKLS5QTEVTVkwgID0weDAwMDAwMDdBIDsKLS5QTE9EUyAgID0weDAwMDAwMDdFIDsKLS5QTE9EViAgID0weDAwMDAwMDgyIDsKLS5QTE9EVkwgID0weDAwMDAwMDg2IDsKLS5QTU9ESiAgID0weDAwMDAwMDhBIDsKLS5QTU9WICAgID0weDAwMDAwMEUyIDsKLS5QTVBKICAgID0weDAwMDAwMDhFIDsKLS5QTkVRUyAgID0weDAwMDAwMDkyIDsKLS5QTkVRViAgID0weDAwMDAwMDk2IDsKLS5QTkVRVkwgID0weDAwMDAwMDlBIDsKLS5QTkVRVyAgID0weDAwMDAwMERBIDsKLS5QUEFHRSAgID0weDAwMDAwMEQ0IDsKLS5QUEVFICAgID0weDAwMDAwMDcwIDsKLS5QUFVUICAgID0weDAwMDAwMDc0IDsKLS5QUkRCICAgID0weDAwMDAwMDc4IDsKLS5QUkRDICAgID0weDAwMDAwMDdDIDsKLS5QUkRIICAgID0weDAwMDAwMDgwIDsKLS5QUkRJICAgID0weDAwMDAwMDg0IDsKLS5QUkRKICAgID0weDAwMDAwMDg4IDsKLS5QUkRSUyAgID0weDAwMDAwMEM4IDsKLS5QUkRTICAgID0weDAwMDAwMDhDIDsKLS5QUkRWICAgID0weDAwMDAwMDkwIDsKLS5QUkxOICAgID0weDAwMDAwMDk0IDsKLS5QUlJBTiAgID0weDAwMDAwMDk4IDsKLS5QUlNUICAgID0weDAwMDAwMDlDIDsKLS5QUldUICAgID0weDAwMDAwMEEwIDsKLS5QU0NPTiAgID0weDAwMDAwMDlFIDsKLS5QU0NPUCAgID0weDAwMDAwMEEyIDsKLS5QU0RFTCAgID0weDAwMDAwMEE2IDsKLS5QU0lOUyAgID0weDAwMDAwMEFBIDsKLS5QU0xFTiAgID0weDAwMDAwMEFFIDsKLS5QU1BPUyAgID0weDAwMDAwMEIyIDsKLS5QU1RDViAgID0weDAwMDAwMEI2IDsKLS5QU1RDVkwgID0weDAwMDAwMEJBIDsKLS5QU1RPUyAgID0weDAwMDAwMEJFIDsKLS5QU1RPViAgID0weDAwMDAwMEMyIDsKLS5QU1RPVkwgID0weDAwMDAwMEM2IDsKLS5QU1RSUyAgID0weDAwMDAwMENBIDsKLS5QU1RSViAgID0weDAwMDAwMENFIDsKLS5QU1RSVkwgID0weDAwMDAwMEQyIDsKLS5QV0xOICAgID0weDAwMDAwMEE0IDsKLS5QV1JBTiAgID0weDAwMDAwMEE4IDsKLS5QV1JCICAgID0weDAwMDAwMEFDIDsKLS5QV1JDICAgID0weDAwMDAwMEIwIDsKLS5QV1JIICAgID0weDAwMDAwMEI0IDsKLS5QV1JJICAgID0weDAwMDAwMEI4IDsKLS5QV1JKICAgID0weDAwMDAwMEJDIDsKLS5QV1JTICAgID0weDAwMDAwMEMwIDsKLS5QV1JWICAgID0weDAwMDAwMEM0IDsKLQotLyoKLS5QQUZJPTB4ICAgPSAweDAwOwotLlBDSElPICAgPTB4IDB4MDAwMDAwOwotLlBDTE8gICAgPTB4IDY0IDsKLS5QQzsKLS5QQ1ZUU1UgID0weCAweDAwMDAwMDsKLS5QQ1ZUU1YgID0weCAweDAwMDAwMDsKLS5QQ1ZUU1ZMID0weCAweDAwMDAwMDsKLS5QQ1ZUVVMgID0weCAxNTggOwotLlA7Ci0uUERJU0wgICA9MHggMHgwMDAwMDA7Ci0uUERWSiAgICA9MHggMHgwMDAwMDA7Ci0uUEVJTyAgICA9MHggMHgwMDAwMDA7Ci0uUEVPRiAgICA9MHggMHgwMDAwMDA7Ci0uUEVPTCAgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVMgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVYgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVZMICA9MHggMHgwMDAwMDA7Ci0uUEVRVVcgICA9MHggMHgwMDAwMDA7Ci0uUEdDTSAgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVMgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVYgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVZMICA9MHggMHgwMDAwMDA7Ci0uUEdFVCAgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFMgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFYgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFZMICA9MHggMHgwMDAwMDA7Ci0uUElBQ1QgICA9MHggMHgwMDAwMDA7Ci0uUElGRCAgICA9MHggMTI2IDsKLS5QOwotLlBJTkRWICAgPTB4IDB4MDAwMDAwOwotLlBJTkRWTCAgPTB4IDB4MDAwMDAwOwotLlBJTkRXICAgPTB4IDB4MDAwMDAwOwotLlBMRENTICAgPTB4IDB4MDAwMDAwOwotLlBMRENWICAgPTB4IDB4MDAwMDAwOwotLlBMRVFTICAgPTB4IDB4MDAwMDAwOwotLlBMRVFWICAgPTB4IDB4MDAwMDAwOwotLlBMRVFWTCAgPTB4IDB4MDAwMDAwOwotLlBMRVNTICAgPTB4IDB4MDAwMDAwOwotLlBMRVNWICAgPTB4IDB4MDAwMDAwOwotLlBMRVNWTCAgPTB4IDB4MDAwMDAwOwotLlBMT0RTICAgPTB4IDB4MDAwMDAwOwotLlBMT0RWICAgPTB4IDB4MDAwMDAwOwotLlBMT0RWTCAgPTB4IDB4MDAwMDAwOwotLlBNT0RKICAgPTB4IDB4MDAwMDAwOwotLlBNT1YgICAgPTB4IDB4MDAwMDAwOwotLlBNUEogICAgPTB4IDB4MDAwMDAwOwotLlBORVFTICAgPTB4IDB4MDAwMDAwOwotLlBORVFWICAgPTB4IDB4MDAwMDAwOwotLlBORVFWTCAgPTB4IDB4MDAwMDAwOwotLlBORVFXICAgPTB4IDB4MDAwMDAwOwotLlBQQUdFICAgPTB4IDB4MDAwMDAwOwotLlBQRUUgICAgPTB4IDB4MDAwMDAwOwotLlBQVVQgICAgPTB4IDB4MDAwMDAwOwotLlBSREIgICAgPTB4IDB4MDAwMDAwOwotLlBSREMgICAgPTB4IDB4MDAwMDAwOwotLlBSREggICAgPTB4IDB4MDAwMDAwOwotLlBSREkgICAgPTB4IDB4MDAwMDAwOwotLlBSREogICAgPTB4IDB4MDAwMDAwOwotLlBSRFJTICAgPTB4IDB4MDAwMDAwOwotLlBSRFMgICAgPTB4IDB4MDAwMDAwOwotLlBSRFYgICAgPTB4IDB4MDAwMDAwOwotLlBSTE4gICAgPTB4IDB4MDAwMDAwOwotLlBSUkFOICAgPTB4IDB4MDAwMDAwOwotLlBSU1QgICAgPTB4IDB4MDAwMDAwOwotLlBSV1QgICAgPTB4IDB4MDAwMDAwOwotLlBTQ09OICAgPTB4IDB4MDAwMDAwOwotLlBTQ09QICAgPTB4IDB4MDAwMDAwOwotLlBTREVMICAgPTB4IDB4MDAwMDAwOwotLlBTSU5TICAgPTB4IDB4MDAwMDAwOwotLlBTTEVOICAgPTB4IDB4MDAwMDAwOwotLlBTUE9TICAgPTB4IDB4MDAwMDAwOwotLlBTVENWICAgPTB4IDB4MDAwMDAwOwotLlBTVENWTCAgPTB4IDB4MDAwMDAwOwotLlBTVE9TICAgPTB4IDB4MDAwMDAwOwotLlBTVE9WICAgPTB4IDB4MDAwMDAwOwotLlBTVE9WTCAgPTB4IDB4MDAwMDAwOwotLlBTVFJTICAgPTB4IDB4MDAwMDAwOwotLlBTVFJWICAgPTB4IDB4MDAwMDAwOwotLlBTVFJWTCAgPTB4IDB4MDAwMDAwOwotLlBXTE4gICAgPTB4IDB4MDAwMDAwOwotLlBXUkFOICAgPTB4IDB4MDAwMDAwOwotLlBXUkIgICAgPTB4IDB4MDAwMDAwOwotLlBXUkMgICAgPTB4IDB4MDAwMDAwOwotLlBXUkggICAgPTB4IDB4MDAwMDAwOwotLlBXUkkgICAgPTB4IDB4MDAwMDAwOwotLlBXUkogICAgPTB4IDB4MDAwMDAwOwotLlBXUlMgICAgPTB4IDB4MDAwMDAwOwotLlBXUlYgICAgPTB4IDB4MDAwMDAwOwotCi0qLwotLyoKLS5QPTB4ICAgICAgPSAwOwotLlBDSElPICAgPTB4IDB4ZmVlZGZhOwotLlBDTE8gICAgPTB4IDB4ZmVlZGZhOwotLlBDVkJTViAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTVSAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTViAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTVkwgPTB4IDB4ZmVlZGZhOwotLlBDVlRVUyAgPTB4IDB4ZmVlZGZhOwotLlBESVMgICAgPTB4IDB4ZmVlZGZhOwotLlBESVNMICAgPTB4IDB4ZmVlZGZhOwotLlBEVkogICAgPTB4IDB4ZmVlZGZhOwotLlBFSU8gICAgPTB4IDB4ZmVlZGZhOwotLlBFT0YgICAgPTB4IDB4ZmVlZGZhOwotLlBFT0wgICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVTICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVWICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVWTCAgPTB4IDB4ZmVlZGZhOwotLlBFUVVXICAgPTB4IDB4ZmVlZGZhOwotLlBHQ00gICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFTICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFWICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFWTCAgPTB4IDB4ZmVlZGZhOwotLlBHRVQgICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRTICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRWICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRWTCAgPTB4IDB4ZmVlZGZhOwotLlBJQUNUICAgPTB4IDB4ZmVlZGZhOwotLlBJRkQgICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRTICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRWICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRWTCAgPTB4IDB4ZmVlZGZhOwotLlBJTkRXICAgPTB4IDB4ZmVlZGZhOwotLlBMRENTICAgPTB4IDB4ZmVlZGZhOwotLlBMRENWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFTICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFWTCAgPTB4IDB4ZmVlZGZhOwotLlBMRVNTICAgPTB4IDB4ZmVlZGZhOwotLlBMRVNWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVNWTCAgPTB4IDB4ZmVlZGZhOwotLlBMT0RTICAgPTB4IDB4ZmVlZGZhOwotLlBMT0RWICAgPTB4IDB4ZmVlZGZhOwotLlBMT0RWTCAgPTB4IDB4ZmVlZGZhOwotLlBNT0RKICAgPTB4IDB4ZmVlZGZhOwotLlBNT1YgICAgPTB4IDB4ZmVlZGZhOwotLlBNUEogICAgPTB4IDB4ZmVlZGZhOwotLlBORVFTICAgPTB4IDB4ZmVlZGZhOwotLlBORVFWICAgPTB4IDB4ZmVlZGZhOwotLlBORVFWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUE5FUVcgICAgID0gMHhmZWVkZmFjZTsKLS5QUEFHRSAgICAgPSAweGZlZWRmYWNlOwotLlBQRUUgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBVVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRCICAgICAgPSAweGZlZWRmYWNlOwotLlBSREMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRJICAgICAgPSAweGZlZWRmYWNlOwotLlBSREogICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEUlMgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRTICAgICAgPSAweGZlZWRmYWNlOwotLlBSRFYgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJMTiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUlJBTiAgICAgPSAweGZlZWRmYWNlOwotLlBSU1QgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJXVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QU0NPTiAgICAgPSAweGZlZWRmYWNlOwotLlBTQ09QICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNERUwgICAgID0gMHhmZWVkZmFjZTsKLS5QU0lOUyAgICAgPSAweGZlZWRmYWNlOwotLlBTTEVOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNQT1MgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RDViAgICAgPSAweGZlZWRmYWNlOwotLlBTVENWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1MgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPViAgICAgPSAweGZlZWRmYWNlOwotLlBTVE9WTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlMgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSViAgICAgPSAweGZlZWRmYWNlOwotLlBTVFJWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdMTiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JBTiAgICAgPSAweGZlZWRmYWNlOwotLlBXUkIgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQyAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JIICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkkgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JTICAgICAgPSAweGZlZWRmYWNlOwotLlBXUlYgICAgICA9IDB4ZmVlZGZhY2U7Ci0qLwotCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEub29rIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLm9vawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4NGI5NC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEub29rCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLVMwMEMwMDAwNzQzMTJFNkY3NTc0MkU2RjZCQzANCi1TMTE4MDAwMDAwMDAwQTIwNTM0MTQ2NDU1MzU0NEY1MjQ1MjA0MTIwMjAyMDIwMjA1MkJFDQotUzExODAwMTUzMTMzMkUzMzIwMjAyMDIwMjAyMDIwNTIzMTMzMkUzMjIwMjAyMDIwMjA3Nw0KLVMxMTgwMDJBMjAyMDAwQjVFODY2MDBCNUU5QjExREExNUI5OTAwMDAxRjAwMDAwMDBBNTANCi1TMTE4MDAzRjY0MDAwMDAwM0UwMDAwMDA1QzAwQTgwMEJBMDBGMDAwMDQwMDAxMDAwMjUxDQotUzExODAwNTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwMDQwMzFDRjUyNTQ0QzQ5NDJEMA0KLVMxMTgwMDY5NDM0RjRFMDAwNEU1RUM1MjU0NEM0OTQyNDM0RjRFMDAwNEU1RUQ1MjU0RjANCi1TMTE4MDA3RTRDNDk0MjQzNEY0RTAwNDAzMUQyNTI1NDRDNDk0MjQzNEY0RTAwMDAwQTA4DQotUzExODAwOTM3RDUyNTQ0QzQ5NDI1MzU0NTIwMDEwQTRBODUyNTQ0QzQ5NDI0NjQ5NENBRA0KLVMxMTgwMEE4MDAwMjAwQjVFODZEMDAwMDAxNjAwMEI1RTg3MzAwMDAwMjU0MDAwMjAwNkENCi1TMTE4MDBCREI1RTkzNzUzNDE0NjQ1NTA1MjQ5NEU1NDIwMDAwMDA2MDAwMjAwMDgwMDc5DQotUzExODAwRDIwMDAwMDM0MjAwQjVFODZFNDk0RTQ5NTQ1MzQxNDY0NTUzNTQwMDAwMDJDOQ0KLVMxMTgwMEU3MTgwMDAwMEUwMDAwMDAwOTAyMDAzMDAwMDAwMDAwNEU1NkZGRDhCQThGREINCi1TMTE4MDBGQzYzMDYyRTRFNjEwMDAwMTY0MUZBMDAzMjQzRUVGRkQ4NzAyNjEyRDg1MTQ5DQotUzExODAxMTFDOEZGRkM0RTVFNEU3NTJCNTdGRkYyMkYzQzAwMDAwMDBBNjAwMDAwMDI1OQ0KLVMxMTgwMTI2M0I2RjAwMDJGRkY2MkYyRDAwMzgyRjJEMDAzNDRFNEM0RTRBNDM0RjUwRTcNCi1TMTE4MDEzQjU5NTI0OTQ3NDg1NDIwNTQ2NTZDNjU2NjZGNkUyMDQxNDIyMDRDMjA0RDZCDQotUzExODAxNTAyMDQ1NzI2OTYzNzM3MzZGNkUyQzIwMzEzOTM5MzMwMDRFNTZGRkZDQkFCNQ0KLVMxMTgwMTY1OEY2MzA0MkU0RTYxQUMyMDJFMDAwQzA2ODAwMDAwMDAwQzRFNzY1NjgwN0MNCi1TMTE4MDE3QTRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDAwMEIwMkQ0MEZGRkMyMDBCDQotUzExODAxOEY2QzAwM0EyMjA4MjQyQzAwMzY5NDgxNEU3NjA0ODIwMDAwMDAwQzRFNzZEMg0KLVMxMTgwMUE0NEFENTY2MDQ2MTAwMDA4RUIwODI2RTBDMENBRTAwMDAwMDAxMDAwQzZDRUINCi1TMTE4MDFCOTAwMDAwQzIwN0MwMDAwMDAwMDYxMDAwMDYwMjA2QzAwM0EyMDA4NjYwNDZDDQotUzExODAxQ0U2MTAwMDA3NjIyMDhEMkFFRkZGQzY4MDQ2MTAwMDA1QzIwODEyMTZFMDA0Mw0KLVMxMTgwMUUzMTAwMDA0MjE2RTAwMEMwMDA4MjIwODA2ODEwMDAwMDAwQzY4MDQ2MTAwQzINCi1TMTE4MDFGODAwNDAyRDQxMDAxNDI5NTAwMDNBMjA2QzAwM0EyNDA4NjYwNDYxMDAwMEJDDQotUzExODAyMEQzQTQyOTA0MkE4MDAwNDQyQTgwMDA4NEU1RTIyNUYyODVGNTA4RjRFRTkyMg0KLVMxMTgwMjIyMDAwMjJCNUZGRkYyNEU1RUQxREYyODVGMkYwODJCNDhGRkYyRDBEMDRFREENCi1TMTE4MDIzN0QwMkI1N0ZGRjIyRjNDMDAwMDAwMEU2MDAwRkVFMjJCNTdGRkYyMkYzQ0Q0DQotUzExODAyNEMwMDAwMDAxMDYwMDBGRUQ0NEU1NkZGRkNCQThGNjMwNjJFNEU2MTAwRkUyQg0KLVMxMTgwMjYxQjgyRDZDMDAzMkZGRkM2MDAwMDAxMjJCNUZGRkYyNEZFRUZGRkM0MkFFRjENCi1TMTE4MDI3NkZGRkM2MDAwMDA4MjRBQUVGRkZDNjcwMDAwN0EyMDZFRkZGQzIwMDg2NkE3DQotUzExODAyOEIwMDAwMDQ2MUI2MjIyODAwMDRCMkFFMDAxMDY3MDAwMDYyMjIwODAyODEwQg0KLVMxMTgwMkEwMDAwMDAwMDM0QTgxNjY0MDIyMDgyMjZDMDAzQTI0MDlCMjgyNkUzNDI2QjYNCi1TMTE4MDJCNTEwMjgwODA2ODQwMDAwMDAwQzY4MDQ2MTAwRkY3NkI2ODQ2RDIwMjYxMDFCDQotUzExODAyQ0EyODA4OTY4NDRFNzYwNDgzMDAwMDAwMEM0RTc2NEFENTY2MDQ2MTAwRkZDRA0KLVMxMTgwMkRGNUFCNkE4MDAwODZDMDAwMDA0NjE4MjIwNkVGRkZDMjAwODY2MDQ2MTAwNzcNCi1TMTE4MDJGNEZGNTIyRDUwRkZGQzYwODA0QUFFRkZGQzY3MDAwMDJDMjA2RUZGRkMyMDE5DQotUzExODAzMDkwODY2MDQ2MTAwRkYzODIyNkUwMDBDMjJBODAwMDgyMjA4MDY4MTAwMDBCMg0KLVMxMTgwMzFFMDAwQzY4MDQ2MTAwRkYxNDJENDEwMDE0NjAwMDAwMEMyMDZFMDAwQzQyMTANCi1TMTE4MDMzMzkwNDJBRTAwMTQ0RTVFMjA1RjI4NUY1MDhGNEVEMDRGRURGRjAwNzA3RjQ0DQotUzExODAzNDgyMDRGNDI1ODUxQzhGRkZDNDg2REZGMDgxRjNDMDAwNDNGM0MwMDAxOUY0OQ0KLVMxMTgwMzVERkMwMDAwMDAwQzIyNEY0NUZBMDRGRTIyREEyMkRBMjJEQTI2NkMwMDI4MUYNCi1TMTE4MDM3MjJGMEMyODZDMDAyQzRFQUIwMDY4NDg2REZGQjg0ODZERkZCNDJGMEMyMEU3DQotUzExODAzODc2QzAwMDAyODZDMDAwNDRFOTA5RkZDMDAwMDAwNTIyRjJERkZDNjJGMEMzMg0KLVMxMTgwMzlDMjA2QzAwMDgyODZDMDAwQzRFOTA3MDUyMjY2QzAwMjA0RUFCMDAxRTQxNkENCi1TMTE4MDNCMUZBMDRCRTI2NkMwMDIwNEVBQjAwN0UyNjZDMDAyMDRFQUIwMDlFNDFFREQ3DQotUzExODAzQzZGRkJBMjY2QzAwMjA0RUFCMDA3RTI2NkMwMDIwNEVBQjAwOUUxRjNDMDA5OA0KLVMxMTgwM0RCMjgzRjNDMDAwMTI2NkMwMDIwNEVBQjAwOUU5RkZDMDAwMDAwNTIzMDJERDINCi1TMTE4MDNGMEZGQ0E0OEMwMkYwMDJGMEMyMDZDMDAwODI4NkMwMDBDNEU5MDcwNTIyNkJGDQotUzExODA0MDU2QzAwMjA0RUFCMDAxRTI2NkMwMDIwNEVBQjAwOUU0MUZBMDQ1RTI2NkNDMw0KLVMxMTgwNDFBMDAyMDRFQUIwMDdFMjY2QzAwMjA0RUFCMDA5RTQxRURGRjlFNzAxNjI2NzINCi1TMTE4MDQyRjZDMDAyMDRFQUIwMENBNjAwMDAwMTYyQjVGRkZGMjRGRURGRjAwMkI3QzkyDQotUzExODA0NDQwMDAwMDAwMUZGQjQ2MDAwMDNFNDQ4NkRGRjA4OUZGQzAwMDAwMDUyMjBEQg0KLVMxMTgwNDU5NEY0M0VERkY5RTMwMTk3MjUwOTI0MDZGMDI0MjQxRDA0MTMwQzA2RjBBMjMNCi1TMTE4MDQ2RTUzNDBFMjQwMzBEOTUxQzhGRkZDOUZGQzAwMDAwMDUyMjI0RjQ1RkEwMzAzDQotUzExODA0ODNGNjMyREEyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDUwRkZBQTQ4NkQwMg0KLVMxMTgwNDk4RkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQTBGRjk2NDJBREZGNzMNCi1TMTE4MDRBRDAwMkI2QzAwMzJGRjA0NDg3QTAzQzQzRjNDRkZGRjQ4NkRGRjA4MjY2QzFBDQotUzExODA0QzIwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQzBGRjcwNDg2REZGMDgyNjZDMDA4OA0KLVMxMTgwNEQ3MjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZGNUM2MDAwMDA3ODJCNUZGRkYyOUUNCi1TMTE4MDRFQzRGRURGRjAwNDg3QTAzQkEzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjFGDQotUzExODA1MDEwQzI4NkMwMDJDNEVBQjAwQzBGRjM0OUZGQzAwMDAwMDUyMjA2REZGMDRBQw0KLVMxMTgwNTE2MjAwODJGMDAyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTAyRjBGM0YzQ0ZGNjANCi1TMTE4MDUyQkZGNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEMwRkYwMDhGDQotUzExODA1NDBERkZDMDAwMDAwNTI0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVCNg0KLVMxMTgwNTU1QUIwMEE0RkVFNjYwMDAwMUYwMjA2REZGMDQyMDA4NjYwMjYxODA0QTkwMkUNCi1TMTE4MDU2QTY3MDAwMTZBMjIxMDAyODEwMDAwMDAwMzRBODE2NjRBMjIxMDI0MkMwMEYxDQotUzExODA1N0YzNjA0ODIwMDAwMDAwQzY4MDQ2MTAwRkNBRUIyODI2RTM0MjIxMDI0MDhGMA0KLVMxMTgwNTk0MDY4MjAwMDAwMDBDNjgwNDYxMDBGQzlBQjI4MjZEMjAyMjEwMjQwODkyQTYNCi1TMTE4MDVBOTgyNEU3NjA0ODEwMDAwMDAwQzRFNzY0QUQ1NjYwNDYxMDBGQzdFQjJBOEUwDQotUzExODA1QkUwMDA4NkMwMDAwMDY2MTAwRkYyMjIwNkRGRjA0MjAwODY2MDQ2MTAwRkZBNg0KLVMxMTgwNUQzMTYyMjI4MDAwOEQyQURGRjAwNjgwNDYxMDBGQzU4MkI0MUZGMDA5RkZDMDINCi1TMTE4MDVFODAwMDAwMDUyMjQwODJGMDIyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTAyRkJGDQotUzExODA1RkQwRjNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUJFNQ0KLVMxMTgwNjEyMDBDMEZFMkFERkZDMDAwMDAwNTIyMDZERkYwNDIwMDg2NjA0NjEwMEZFMzkNCi1TMTE4MDYyN0MyMkYyODAwMDQzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2Q0QxDQotUzExODA2M0MwMDJDNEVBQjAwQkNGREZDMjA2REZGMDQyMDA4NjYwNDYxMDBGRTlBMkY4MQ0KLVMxMTgwNjUxMjgwMDA4M0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNjgNCi1TMTE4MDY2NjRFQUIwMEJDRkRENDlGRkMwMDAwMDA1MjIwNkRGRjA0MjAwODY2MDQ2MTg1DQotUzExODA2N0IwMEZFNkMyMjEwMkYwMTJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDJGMEZGRg0KLVMxMTgwNjkwM0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNjANCi1TMTE4MDZBNUMwRkQ5OERGRkMwMDAwMDA1MjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2Qzc1DQotUzExODA2QkEwMDJDNEVBQjAwQTRGRDdFMjA2REZGMDQyMDA4NjYwNDYxMDBGRTFDMkIxQg0KLVMxMTgwNkNGNTBGRjA0NjAwMEZFOEEyMDZDMDAzQUIxRURGRjA0NjcwMDAwNkM0ODdBREINCi1TMTE4MDZFNDAxRTgzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RURDDQotUzExODA2RjlBQjAwQzBGRDQyOUZGQzAwMDAwMDUyMjA2REZGMDQyMDA4MkYwMDJGMEMyRg0KLVMxMTgwNzBFMjA2QzAwMTAyODZDMDAxNDRFOTAyRjBGM0YzQ0ZGRkY0ODZERkYwODI2MTcNCi1TMTE4MDcyMzZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEMwRkQwRURGRkMwMDAwMDA1MjNEDQotUzExODA3Mzg0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQTRGQ0Y0NDg2Mg0KLVMxMTgwNzREN0EwMTk4M0YzQ0ZGRkY0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDOTYNCi1TMTE4MDc2MjRFQUIwMEMwRkNEODQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RTMyDQotUzExODA3NzdBQjAwQTRGQ0M0NDg3QTAxNkEzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgzRQ0KLVMxMTgwNzhDMkYwQzI4NkMwMDJDNEVBQjAwQzBGQ0E4NDg2REZGMDgyNjZDMDAyODJGNTcNCi1TMTE4MDdBMTBDMjg2QzAwMkM0RUFCMDBBNEZDOTQyMDZERkYwNDIwMDgwNjgwMDAwMDA4DQotUzExODA3QjYwMDE4NEU3NjIyMkMwMDM2OTI4MDRFNzYwMjgxRkZGRkZGRkM0QUQ1NjZGMw0KLVMxMTgwN0NCMDQ2MTAwRkE2QTJGMDEzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDRTQNCi1TMTE4MDdFMDI4NkMwMDJDNEVBQjAwQkNGQzU2MkYyREZGMDAzRjNDMDAwQzQ4NkRGRkEzDQotUzExODA3RjUwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQkNGQzNBNDg2REZGMDg4Nw0KLVMxMTgwODBBMjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZDMjY0ODZERkYwODFGODYNCi1TMTE4MDgxRjNDMDAwMTI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNTQ0ODZERkZCODE1DQotUzExODA4MzQ0ODZERkZCNDJGMEMyMDZDMDAxODI4NkMwMDFDNEU5MDQ4NkRGRjA4NDJEOA0KLVMxMTgwODQ5MjcyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDU0NDJBNzJGMkQwMDM4RjANCi1TMTE4MDg1RTJGMkQwMDM0NEU0QTAwMEE0NjMxMjAyMDIwMjAyMDIwMjAyMDAwMDIzQTlDDQotUzExODA4NzMzQTAwMDIyOTNBMDAwMDAwMzAyMDIwMjAyMDIwNDE2NDY0NzI2NTczNzMzNw0KLVMxMTgwODg4MjAyMDIwMjA0OTY0NjU2RTc0Njk3NDc5MjAyMDIwMjAyMDIwMjAyMDUzM0ENCi1TMTE4MDg5RDY5N0E2NTIwMjAyMDIwMjAyMDIwMjA0RTY1Nzg3NDAwMUQ0OTZFNzY2MUIwDQotUzExODA4QjI2QzY5NjQyMDczNjU2NzZENjU2RTc0MjA3Mzc0NjE3Mjc0Njk2RTY3MjAzNQ0KLVMxMTgwOEM3NjE3NDNBMjAyMDAwMTg1MzY1Njc2RDY1NkU3NDIwNkM2OTczNzQyMDYzN0YNCi1TMTE4MDhEQzZGNzI3Mjc1NzA3NDY1NjQzQTIwMDAwMDAwMTgyMDIwMjA0MTc2NjE2OTNCDQotUzExODA4RjE2QzYxNjI2QzY1MjAyMDIwMjAyMDIwMjAyMDU1NzM2NTY0NEZFREZGRjIzMA0KLVMxMTgwOTA2OUZGQzAwMDAwMDBBNjEwMDAxNTY0MUVDMDAzMDIwREYyMERGMzBERjIwRjENCi1TMTE4MDkxQjJDMDAzMjU2ODA0RTc2MDI4MEZGRkZGRkZDNEFENTY2MDQ2MTAwRjkwQTYzDQotUzExODA5MzAyOTQwMDAzMjI5NDAwMDNBNjAwMDAwM0UyQjVGRkZGMjRGRURGRkYyMjAwQQ0KLVMxMTgwOTQ1MkMwMDMyNTY4MDRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDBGOEUwNjQNCi1TMTE4MDk1QTI5NDAwMDNBMjA2QzAwM0EyMjA4NjYwNDYxMDBGOERFNDI5MDQyQTgwMDk0DQotUzExODA5NkYwNDQyQTgwMDA4NjAwMDAwOUU0QTJDMDAzMDY3MDAwMDFBMjA2QzAwM0E4RQ0KLVMxMTgwOTg0MjAwODY2MDI2MUIyNDI5MDQyQTgwMDA0NDJBODAwMDg2MDAwMDA3RTIwMDcNCi1TMTE4MDk5OTZDMDAzQTIwMDg2NjAyNjE5QTRBOTA2NzAwMDA2RTIyMTAwMjgxMDAwMEIwDQotUzExODA5QUUwMDAzNEE4MTY2NEEyMjEwMjQyQzAwMzYwNDgyMDAwMDAwMEM2ODA0NjE5Qg0KLVMxMTgwOUMzMDBGODc0QjI4MjZFMzQyMjEwMjQwODA2ODIwMDAwMDAwQzY4MDQ2MTAwMUENCi1TMTE4MDlEOEY4NjBCMjgyNkQyMDIyMTAyNDA4OTI4MjRFNzYwNDgxMDAwMDAwMEM0RUQ4DQotUzExODA5RUQ3NjRBRDU2NjA0NjEwMEY4NDRCMkE4MDAwODZDMDAwMDA2NjEwMEZGM0NFNQ0KLVMxMTgwQTAyMjA2QzAwM0EyMDA4NjYwNDYxMDBGRjMwMjk1MDAwM0E2MDg0NDJBNzJGNDQNCi1TMTE4MEExNzJEMDAzODJGMkQwMDM0NEU0QTRFNTYwMDAwNTE4RjQyQTcxRjNDMDAwRTYzDQotUzExODBBMkM0MjY3NDg3QTAwMTI0MjY3NDIyNzJGM0MwMEI1RTg2RTRFNDkwMDBFNTBCNw0KLVMxMTgwQTQxOEY0RTVFMjA1RjI4NUY0RUU4MDAwMjIwN0MwMDAwMDAwMDYwMDQyQjVGOTkNCi1TMTE4MEE1NkZGRjI0RTVFRDFERjI4NUYyRjA4RDBEMDRFRDA0M0ZBMDAwNEQzRkMwMEFFDQotUzExODBBNkIwMjcwNEUyRjQ5MDAwQTQzRkEwMDA0RDNGQzAwMDAwMDQwMkY0OTAwMDY2Mg0KLVMxMTgwQTgwNDFGQTAwMDREMUZDRkZGRkY1N0EyMDI4MDA1NjY2MDAwMDIyMjIwOTkyMDENCi1TMTE4MEE5NTg4MjE0MTAwNTY0MjgxMjQ0OEQyNUFCNUM5NkRGQTQ0NDFEMzY4MDA1QUFFDQotUzExMTBBQUExRjdDMDAwMTAwMDQ0RTc1NDIyRjAwMDQ0RTc1OUYNCi1TOTAzMDAwMEZDDQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTEucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMS5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzYTdjYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMS5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0yLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNGE3OWQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMy5ybyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0zLnJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTU5MzQyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0zLnJvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTFlNDEzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5sZAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi1PVVRQVVRfRk9STUFUKCJzcmVjIikKLVNFQ1RJT05TCi17Ci0KLQotLnRleHQgMCA6IHsgKigiOSIpICooIjEwIikgKigiMTEiKSAqKCIxMiIpICooIjEzIikgKigiMTQiKSAqKCIxNSIpCi0JCSooIjciKSAqKCI4IikgKigiMCIpICooIjEiKSAqKCIyIikgKigiMyIpICooIjQiKSB9Ci0uYnNzICAgOiB7ICAqKCI1IikgKigiNiIpIH0KLQotLlBBRkkgICAgPTB4MDAwMDAwNTAgOwotLlBDSElPICAgPTB4MDAwMDAwRDAgOwotLlBDTE8gICAgPTB4MDAwMDAwNTQgOwotLlBDVkJTViAgPTB4MDAwMDAwMEUgOwotLlBDVlRTVSAgPTB4MDAwMDAwMTIgOwotLlBDVlRTViAgPTB4MDAwMDAwMTYgOwotLlBDVlRTVkwgPTB4MDAwMDAwMUEgOwotLlBDVlRVUyAgPTB4MDAwMDAwMUUgOwotLlBESVMgICAgPTB4MDAwMDAwMjIgOwotLlBESVNMICAgPTB4MDAwMDAwMjYgOwotLlBEVkogICAgPTB4MDAwMDAwMkEgOwotLlBFSU8gICAgPTB4MDAwMDAwQ0MgOwotLlBFT0YgICAgPTB4MDAwMDAwNTggOwotLlBFT0wgICAgPTB4MDAwMDAwNUMgOwotLlBFUVVTICAgPTB4MDAwMDAwMkUgOwotLlBFUVVWICAgPTB4MDAwMDAwMzIgOwotLlBFUVVWTCAgPTB4MDAwMDAwMzYgOwotLlBFUVVXICAgPTB4MDAwMDAwREUgOwotLlBHQ00gICAgPTB4MDAwMDAwNjQgOwotLlBHRVFTICAgPTB4MDAwMDAwM0EgOwotLlBHRVFWICAgPTB4MDAwMDAwM0UgOwotLlBHRVFWTCAgPTB4MDAwMDAwNDIgOwotLlBHRVQgICAgPTB4MDAwMDAwNjAgOwotLlBHUlRTICAgPTB4MDAwMDAwNDYgOwotLlBHUlRWICAgPTB4MDAwMDAwNEEgOwotLlBHUlRWTCAgPTB4MDAwMDAwNEUgOwotLlBJQUNUICAgPTB4MDAwMDAwNkMgOwotLlBJRkQgICAgPTB4MDAwMDAwNjggOwotLlBJTkRTICAgPTB4MDAwMDAwNTIgOwotLlBJTkRWICAgPTB4MDAwMDAwNTYgOwotLlBJTkRWTCAgPTB4MDAwMDAwNUEgOwotLlBJTkRXICAgPTB4MDAwMDAwRDYgOwotLlBMRENTICAgPTB4MDAwMDAwNUUgOwotLlBMRENWICAgPTB4MDAwMDAwNjIgOwotLlBMRVFTICAgPTB4MDAwMDAwNjYgOwotLlBMRVFWICAgPTB4MDAwMDAwNkEgOwotLlBMRVFWTCAgPTB4MDAwMDAwNkUgOwotLlBMRVNTICAgPTB4MDAwMDAwNzIgOwotLlBMRVNWICAgPTB4MDAwMDAwNzYgOwotLlBMRVNWTCAgPTB4MDAwMDAwN0EgOwotLlBMT0RTICAgPTB4MDAwMDAwN0UgOwotLlBMT0RWICAgPTB4MDAwMDAwODIgOwotLlBMT0RWTCAgPTB4MDAwMDAwODYgOwotLlBNT0RKICAgPTB4MDAwMDAwOEEgOwotLlBNT1YgICAgPTB4MDAwMDAwRTIgOwotLlBNUEogICAgPTB4MDAwMDAwOEUgOwotLlBORVFTICAgPTB4MDAwMDAwOTIgOwotLlBORVFWICAgPTB4MDAwMDAwOTYgOwotLlBORVFWTCAgPTB4MDAwMDAwOUEgOwotLlBORVFXICAgPTB4MDAwMDAwREEgOwotLlBQQUdFICAgPTB4MDAwMDAwRDQgOwotLlBQRUUgICAgPTB4MDAwMDAwNzAgOwotLlBQVVQgICAgPTB4MDAwMDAwNzQgOwotLlBSREIgICAgPTB4MDAwMDAwNzggOwotLlBSREMgICAgPTB4MDAwMDAwN0MgOwotLlBSREggICAgPTB4MDAwMDAwODAgOwotLlBSREkgICAgPTB4MDAwMDAwODQgOwotLlBSREogICAgPTB4MDAwMDAwODggOwotLlBSRFJTICAgPTB4MDAwMDAwQzggOwotLlBSRFMgICAgPTB4MDAwMDAwOEMgOwotLlBSRFYgICAgPTB4MDAwMDAwOTAgOwotLlBSTE4gICAgPTB4MDAwMDAwOTQgOwotLlBSUkFOICAgPTB4MDAwMDAwOTggOwotLlBSU1QgICAgPTB4MDAwMDAwOUMgOwotLlBSV1QgICAgPTB4MDAwMDAwQTAgOwotLlBTQ09OICAgPTB4MDAwMDAwOUUgOwotLlBTQ09QICAgPTB4MDAwMDAwQTIgOwotLlBTREVMICAgPTB4MDAwMDAwQTYgOwotLlBTSU5TICAgPTB4MDAwMDAwQUEgOwotLlBTTEVOICAgPTB4MDAwMDAwQUUgOwotLlBTUE9TICAgPTB4MDAwMDAwQjIgOwotLlBTVENWICAgPTB4MDAwMDAwQjYgOwotLlBTVENWTCAgPTB4MDAwMDAwQkEgOwotLlBTVE9TICAgPTB4MDAwMDAwQkUgOwotLlBTVE9WICAgPTB4MDAwMDAwQzIgOwotLlBTVE9WTCAgPTB4MDAwMDAwQzYgOwotLlBTVFJTICAgPTB4MDAwMDAwQ0EgOwotLlBTVFJWICAgPTB4MDAwMDAwQ0UgOwotLlBTVFJWTCAgPTB4MDAwMDAwRDIgOwotLlBXTE4gICAgPTB4MDAwMDAwQTQgOwotLlBXUkFOICAgPTB4MDAwMDAwQTggOwotLlBXUkIgICAgPTB4MDAwMDAwQUMgOwotLlBXUkMgICAgPTB4MDAwMDAwQjAgOwotLlBXUkggICAgPTB4MDAwMDAwQjQgOwotLlBXUkkgICAgPTB4MDAwMDAwQjggOwotLlBXUkogICAgPTB4MDAwMDAwQkMgOwotLlBXUlMgICAgPTB4MDAwMDAwQzAgOwotLlBXUlYgICAgPTB4MDAwMDAwQzQgOwotCi0vKgotLlBBRkk9MHggICA9IDB4MDA7Ci0uUENISU8gICA9MHggMHgwMDAwMDA7Ci0uUENMTyAgICA9MHggNjQgOwotLlBDOwotLlBDVlRTVSAgPTB4IDB4MDAwMDAwOwotLlBDVlRTViAgPTB4IDB4MDAwMDAwOwotLlBDVlRTVkwgPTB4IDB4MDAwMDAwOwotLlBDVlRVUyAgPTB4IDE1OCA7Ci0uUDsKLS5QRElTTCAgID0weCAweDAwMDAwMDsKLS5QRFZKICAgID0weCAweDAwMDAwMDsKLS5QRUlPICAgID0weCAweDAwMDAwMDsKLS5QRU9GICAgID0weCAweDAwMDAwMDsKLS5QRU9MICAgID0weCAweDAwMDAwMDsKLS5QRVFVUyAgID0weCAweDAwMDAwMDsKLS5QRVFVViAgID0weCAweDAwMDAwMDsKLS5QRVFVVkwgID0weCAweDAwMDAwMDsKLS5QRVFVVyAgID0weCAweDAwMDAwMDsKLS5QR0NNICAgID0weCAweDAwMDAwMDsKLS5QR0VRUyAgID0weCAweDAwMDAwMDsKLS5QR0VRViAgID0weCAweDAwMDAwMDsKLS5QR0VRVkwgID0weCAweDAwMDAwMDsKLS5QR0VUICAgID0weCAweDAwMDAwMDsKLS5QR1JUUyAgID0weCAweDAwMDAwMDsKLS5QR1JUViAgID0weCAweDAwMDAwMDsKLS5QR1JUVkwgID0weCAweDAwMDAwMDsKLS5QSUFDVCAgID0weCAweDAwMDAwMDsKLS5QSUZEICAgID0weCAxMjYgOwotLlA7Ci0uUElORFYgICA9MHggMHgwMDAwMDA7Ci0uUElORFZMICA9MHggMHgwMDAwMDA7Ci0uUElORFcgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1MgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1YgICA9MHggMHgwMDAwMDA7Ci0uUExFUVMgICA9MHggMHgwMDAwMDA7Ci0uUExFUVYgICA9MHggMHgwMDAwMDA7Ci0uUExFUVZMICA9MHggMHgwMDAwMDA7Ci0uUExFU1MgICA9MHggMHgwMDAwMDA7Ci0uUExFU1YgICA9MHggMHgwMDAwMDA7Ci0uUExFU1ZMICA9MHggMHgwMDAwMDA7Ci0uUExPRFMgICA9MHggMHgwMDAwMDA7Ci0uUExPRFYgICA9MHggMHgwMDAwMDA7Ci0uUExPRFZMICA9MHggMHgwMDAwMDA7Ci0uUE1PREogICA9MHggMHgwMDAwMDA7Ci0uUE1PViAgICA9MHggMHgwMDAwMDA7Ci0uUE1QSiAgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVMgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVYgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVZMICA9MHggMHgwMDAwMDA7Ci0uUE5FUVcgICA9MHggMHgwMDAwMDA7Ci0uUFBBR0UgICA9MHggMHgwMDAwMDA7Ci0uUFBFRSAgICA9MHggMHgwMDAwMDA7Ci0uUFBVVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQyAgICA9MHggMHgwMDAwMDA7Ci0uUFJESCAgICA9MHggMHgwMDAwMDA7Ci0uUFJESSAgICA9MHggMHgwMDAwMDA7Ci0uUFJESiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEUlMgICA9MHggMHgwMDAwMDA7Ci0uUFJEUyAgICA9MHggMHgwMDAwMDA7Ci0uUFJEViAgICA9MHggMHgwMDAwMDA7Ci0uUFJMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFJSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFJTVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJXVCAgICA9MHggMHgwMDAwMDA7Ci0uUFNDT04gICA9MHggMHgwMDAwMDA7Ci0uUFNDT1AgICA9MHggMHgwMDAwMDA7Ci0uUFNERUwgICA9MHggMHgwMDAwMDA7Ci0uUFNJTlMgICA9MHggMHgwMDAwMDA7Ci0uUFNMRU4gICA9MHggMHgwMDAwMDA7Ci0uUFNQT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUUlMgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlYgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlZMICA9MHggMHgwMDAwMDA7Ci0uUFdMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFdSQiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSCAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSSAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSUyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSViAgICA9MHggMHgwMDAwMDA7Ci0KLSovCi0vKgotLlA9MHggICAgICA9IDA7Ci0uUENISU8gICA9MHggMHhmZWVkZmE7Ci0uUENMTyAgICA9MHggMHhmZWVkZmE7Ci0uUENWQlNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNVICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWTCA9MHggMHhmZWVkZmE7Ci0uUENWVFVTICA9MHggMHhmZWVkZmE7Ci0uUERJUyAgICA9MHggMHhmZWVkZmE7Ci0uUERJU0wgICA9MHggMHhmZWVkZmE7Ci0uUERWSiAgICA9MHggMHhmZWVkZmE7Ci0uUEVJTyAgICA9MHggMHhmZWVkZmE7Ci0uUEVPRiAgICA9MHggMHhmZWVkZmE7Ci0uUEVPTCAgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVMgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVYgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVZMICA9MHggMHhmZWVkZmE7Ci0uUEVRVVcgICA9MHggMHhmZWVkZmE7Ci0uUEdDTSAgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVMgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVYgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVZMICA9MHggMHhmZWVkZmE7Ci0uUEdFVCAgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFMgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFYgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFZMICA9MHggMHhmZWVkZmE7Ci0uUElBQ1QgICA9MHggMHhmZWVkZmE7Ci0uUElGRCAgICA9MHggMHhmZWVkZmE7Ci0uUElORFMgICA9MHggMHhmZWVkZmE7Ci0uUElORFYgICA9MHggMHhmZWVkZmE7Ci0uUElORFZMICA9MHggMHhmZWVkZmE7Ci0uUElORFcgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1MgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1YgICA9MHggMHhmZWVkZmE7Ci0uUExFUVMgICA9MHggMHhmZWVkZmE7Ci0uUExFUVYgICA9MHggMHhmZWVkZmE7Ci0uUExFUVZMICA9MHggMHhmZWVkZmE7Ci0uUExFU1MgICA9MHggMHhmZWVkZmE7Ci0uUExFU1YgICA9MHggMHhmZWVkZmE7Ci0uUExFU1ZMICA9MHggMHhmZWVkZmE7Ci0uUExPRFMgICA9MHggMHhmZWVkZmE7Ci0uUExPRFYgICA9MHggMHhmZWVkZmE7Ci0uUExPRFZMICA9MHggMHhmZWVkZmE7Ci0uUE1PREogICA9MHggMHhmZWVkZmE7Ci0uUE1PViAgICA9MHggMHhmZWVkZmE7Ci0uUE1QSiAgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVMgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVYgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVZMICAgID0gMHhmZWVkZmFjZTsKLS5QTkVRVyAgICAgPSAweGZlZWRmYWNlOwotLlBQQUdFICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBFRSAgICAgID0gMHhmZWVkZmFjZTsKLS5QUFVUICAgICAgPSAweGZlZWRmYWNlOwotLlBSREIgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEQyAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRIICAgICAgPSAweGZlZWRmYWNlOwotLlBSREkgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRSUyAgICAgPSAweGZlZWRmYWNlOwotLlBSRFMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEViAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkxOICAgICAgPSAweGZlZWRmYWNlOwotLlBSUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJTVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUldUICAgICAgPSAweGZlZWRmYWNlOwotLlBTQ09OICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNDT1AgICAgID0gMHhmZWVkZmFjZTsKLS5QU0RFTCAgICAgPSAweGZlZWRmYWNlOwotLlBTSU5TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNMRU4gICAgID0gMHhmZWVkZmFjZTsKLS5QU1BPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVENWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUQ1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVE9WICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVFJWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlZMICAgID0gMHhmZWVkZmFjZTsKLS5QV0xOICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JDICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkggICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSSAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JKICAgICAgPSAweGZlZWRmYWNlOwotLlBXUlMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSViAgICAgID0gMHhmZWVkZmFjZTsKLSovCi0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIub29rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2YyNGE1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi1TMDEyMDAwMDY5NkU2OTc0NzQ2NTczNzQ1RjY1NzA2MzJFNzM3MkNGDQotUzExODAwMDAwMDAwMDAwMDQ5NEU0OTU0NTQ0NTUzNTQyMDIwNTA0MTMwMzUyMDIwNTJBQg0KLVMxMTgwMDE1MzEzMzJFMzMyMDIwMjAyMDIwMjAyMDUyMzEzMzJFMzIyMDIwMjAyMDIwNzcNCi1TMTE4MDAyQTIwMjAwMDkzNEI1QjAwQjVFNkMxMUIwODlERDYwMDAwNTQwMDAwMDAwNUY5DQotUzExODAwM0Y1QTAwMDAwMDQ4MDA1QzAwQTYwMDAwMDEwQTAxMjYwMDA0MDAwMTAwMDJDQg0KLVMxMTgwMDU0MDA5MDAwMDAwMDAwMDAwMDAwMDAwMDAyMDA0MDIwMjAwMDAwNDk0RjVGOEENCi1TMTE4MDA2OTUyNDU1MzQ1NTI1NjQxNTI1NDRDNDk0MjQzNEY0RTAwNDA0ODQ1MDEwMDNCDQotUzExODAwN0U1MDVGNDE0QzRDMjAyMDIwMjAyMDUyNTQ0QzQ5NDI0MzRGNEUwMTAwMDBFMw0KLVMxMTgwMDkzMDAwMDlDMDEwMDAwMDAwMDAwMDAwODUzNDU1MDQxNTI0MTU0NDUwMDA4NTINCi1TMTE4MDBBODAwMDgwMDQwMzFDRjUyNTQ0QzQ5NDI0MzRGNEUwMDA0RTVFQzUyNTQ0Q0QzDQotUzExODAwQkQ0OTQyNDM0RjRFMDBCNUU4NkQ1MzQxNDY0NTUzNTQ0RjUyMDAwMDRGMjhENw0KLVMxMTgwMEQyNTM1OTUzNTQ0NTRENDk0RDAwQjVFODczNTM0MTQ2NDU1MzU0NEY1MjAwMjMNCi1TMTE4MDBFNzQwMzFEMjUyNTQ0QzQ5NDI0MzRGNEUwMDAwMEE3RDUyNTQ0QzQ5NDI1MzA5DQotUzExODAwRkM1NDUyMDAxMEE0QTg1MjU0NEM0OTQyNDY0OTRDMDAwMTAwQjVFNkMwNDlFQw0KLVMxMTgwMTExNEU0OTU0NTQ0NTUzNTQyMDIwMDAwMDA2MTYwMjAwMDgwMDAwMDAwMjMyMTANCi1TMTE4MDEyNjAwNDgwMDAwMDAwMDRFNTZGRkYwQkE4RjYzMDYyRTRFNjEwMDAwQkM0MTU5DQotUzExODAxM0JGQTAwRjQ0M0VFRkZGMDMyRDgyRDdDMDAwMDAwMDFGRkZDMjA2RTAwMDg1OA0KLVMxMTgwMTUwMjAwODY2MDQ2MTAwMDBCQTIyMkVGRkZDNTM4MTRBODE2QzA0NjEwMDAwMkUNCi1TMTE4MDE2NTlFMjI0OEQzRTlGRkZDNDFGMDE4MDBCM0M4NjNFRTRBMTA2NjAwMDAwNkU3DQotUzExODAxN0E2MDAwMDA2MjQxRUVGRkYwMjY2QzAwMzg0RUFCMDA3RTIwNkUwMDA4MjA5NQ0KLVMxMTgwMThGMDg2NjA0NjEwMDAwN0MyMjJFRkZGQzUzODE0QTgxNkMwNDYxMDAwMDYwRUQNCi1TMTE4MDFBNDIyNDhEM0U5RkZGQzQxRjAxODAwQjNDODYzRUUxRjEwM0YzQzAwMDEyNjNCDQotUzExODAxQjk2QzAwMzg0RUFCMDA5RTQxRUVGRkYwNzAwQzI2NkMwMDM4NEVBQjAwQ0FDQg0KLVMxMTgwMUNFNTJBRUZGRkMwQ0FFMDAwMDAwMEFGRkZDNkYwMEZGNzA0MUVFRkZGMDQzMUYNCi1TMTE4MDFFM0VFMDAwQzIyRDgyMkQ4MjJEODRFNUUyMDVGNTg4RjRFRDAyQjU3RkZGMjc4DQotUzExODAxRjgyRjNDMDAwMDAwMEE2MDAwMDAxRTJCNTdGRkYyMkYzQzAwMDAwMDBGNjBBRQ0KLVMxMTgwMjBEMDAwMDEwMkI1N0ZGRjIyRjNDMDAwMDAwMTA2MDAwMDAwMjNCNkYwMDAyQ0MNCi1TMTE4MDIyMkZGRjYyRjJEMDAzODJGMkQwMDM0NEU0QzRFNEEwMDAwNEZFREZFRUEyMDM0DQotUzExODAyMzczQzAwMDAwMDhBMjA0RjQyNTg1MUM4RkZGQzQ4NkRGRUVBMUYzQzAwMDRDRg0KLVMxMTgwMjRDM0YzQzAwMDE5RkZDMDAwMDAwMEMyMjRGNDVGQTAyRDQyMkRBMjJEQTIyRDYNCi1TMTE4MDI2MURBMjY2QzAwNDAyRjBDMjg2QzAwNDQ0RUFCMDA2ODQ4NkRGRkI4NDg2RDQzDQotUzExODAyNzZGRkI0MkYwQzIwNkMwMDA4Mjg2QzAwMEM0RTkwOUZGQzAwMDAwMDUyMkY1Mw0KLVMxMTgwMjhCMkRGRkM2MkYwQzIwNkMwMDEwMjg2QzAwMTQ0RTkwNzA1MjI2NkMwMDM4N0YNCi1TMTE4MDJBMDRFQUIwMDFFNDFGQTAyOTQyNjZDMDAzODRFQUIwMDdFMjY2QzAwMzg0RTA0DQotUzExODAyQjVBQjAwOUU0MUVERkZCQTI2NkMwMDM4NEVBQjAwN0UyNjZDMDAzODRFQUJGQw0KLVMxMTgwMkNBMDA5RTFGM0MwMDI4M0YzQzAwMDEyNjZDMDAzODRFQUIwMDlFOUZGQzAwODINCi1TMTE4MDJERjAwMDA1MjMwMkRGRkNBNDhDMDJGMDAyRjBDMjA2QzAwMTAyODZDMDAxNEQ4DQotUzExODAyRjQ0RTkwNzA1MjI2NkMwMDM4NEVBQjAwMUUyNjZDMDAzODRFQUIwMDlFNDFDRQ0KLVMxMTgwMzA5RkEwMjM0MjY2QzAwMzg0RUFCMDA3RTI2NkMwMDM4NEVBQjAwOUU0MUVEREINCi1TMTE4MDMxRUZGODA3MDE2MjY2QzAwMzg0RUFCMDBDQTlGRkMwMDAwMDAwRTYxMDAwMjI4DQotUzExODAzMzMyODQxRURGRjlFMjBERjIwREYyMERGMzBERjRBMkRGRjlFNjcwMDAwM0FGRA0KLVMxMTgwMzQ4NTk4RjJGMkRGRkEwMkYyREZGQTgyRjBDMjA2QzAwMTgyODZDMDAxQzRFRDkNCi1TMTE4MDM1RDkwMDFCODJCNUZGRjlBMkYyREZGOUEyRjJERkZBNDJGMkRGRkE4MkYwQ0U5DQotUzExODAzNzIyMDZDMDAyMDI4NkMwMDI0NEU5MDYwMDAwMDM0NTk4RjJGMkRGRkEwNDg3MQ0KLVMxMTgwMzg3NkRGRkE4MkYwQzIwNkMwMDI4Mjg2QzAwMkM0RTkwMkI1RkZGOTYyRjJENDENCi1TMTE4MDM5Q0ZGQTQyRjJERkY5NjJGMkRGRkE4MkYwQzIwNkMwMDIwMjg2QzAwMjQ0RUM0DQotUzExODAzQjE5MDQ4NkRGRUVBOUZGQzAwMDAwMDUyMjA0RjQzRURGRjgwMzAxOTcyNTBGMA0KLVMxMTgwM0M2OTI0MDZGMDI0MjQxRDA0MTMwQzA2RjBBNTM0MEUyNDAzMEQ5NTFDOEZGMDgNCi1TMTE4MDNEQkZDOUZGQzAwMDAwMDUyMjI0RjQ1RkEwMTVDMzJEQTI2NkMwMDQwMkYwQ0ZBDQotUzExODAzRjAyODZDMDA0NDRFQUIwMDUwMDEyQzQ4NkRGRUVBMjY2QzAwNDAyRjBDMjhENA0KLVMxMTgwNDA1NkMwMDQ0NEVBQjAwQTAwMTE4NDg3QTAxMzQzRjNDRkZGRjQ4NkRGRUVBNkYNCi1TMTE4MDQxQTI2NkMwMDQwMkYwQzI4NkMwMDQ0NEVBQjAwQzAwMEZDNDg2REZFRUEyNjZDDQotUzExODA0MkY2QzAwNDAyRjBDMjg2QzAwNDQ0RUFCMDBBNDAwRTg0MkFERkZCMDJCN0MyQg0KLVMxMTgwNDQ0MDAwMDAwMDFGRkFDNTk4RjJGMkRGRkFDNjEwMDAxN0UyQjVGRkZCMDJCQzANCi1TMTE4MDQ1OTQwRkZCMDJGMkRGRkFDM0YzQzAwMEE0ODZERkVFQTI2NkMwMDQwMkYwQzY1DQotUzExODA0NkUyODZDMDA0NDRFQUIwMEJDMDBBRTlGRkMwMDAwMDAwQzJGMkRGRkIwNjEyNw0KLVMxMTgwNDgzMDBGQ0E4MkYwRjNGM0MwMDBBNDg2REZFRUEyNjZDMDA0MDJGMEMyODZDQkINCi1TMTE4MDQ5ODAwNDQ0RUFCMDBDMDAwODZERkZDMDAwMDAwMEM0ODZERkVFQTI2NkMwMEIyDQotUzExODA0QUQ0MDJGMEMyODZDMDA0NDRFQUIwMEE0MDA2QzUyQURGRkFDMENBRDAwMDA3Nw0KLVMxMTgwNEMyMDAwQUZGQUM2RjgyNDg2REZFRUExRjNDMDAwMTI2NkMwMDQwMkYwQzI4NEQNCi1TMTE4MDRENzZDMDA0NDRFQUIwMDU0NDg2REZGQjg0ODZERkZCNDJGMEMyMDZDMDAzMDQ0DQotUzExODA0RUMyODZDMDAzNDRFOTA0ODZERkVFQTQyMjcyNjZDMDA0MDJGMEMyODZDMDBBQQ0KLVMxMTgwNTAxNDQ0RUFCMDA1NDQyQTcyRjJEMDAzODJGMkQwMDM0NEU0QTJCNTdGRkYyMzgNCi1TMTE4MDUxNjJGM0MwMDAwMDAwQzYwMDBGRDAwMkI1N0ZGRjIyRjNDMDAwMDAwNjQ2MDU2DQotUzExODA1MkIwMEZDRjIwMDBBNDYzMTIwMjAyMDIwMjAyMDIwMjAwMDAyM0EzQTAwMDJEMA0KLVMxMTgwNTQwMjkzQTAwMDAwMDE0MjAyMDIwMjAyMDIwNDM2MTczNjUyMDIwMjAyMDUyMUQNCi1TMTE4MDU1NTY1NzM3NTZDNzQ0MUZBMDAwNEQxRkNGRkZGRkFBMDIwMjgwMDNDNDNGQUZCDQotUzExODA1NkEwMDA0RDNGQzAwMDAwMUQ2NDVGQTAwMDRENUZDMDAwMDAyNUUyNjBBNThEMg0KLVMxMTgwNTdGOEFEMDg4NTU4MDIyMjgwMDU2NjYwMDAwMkUyNDA4MjY1QUQ1QjBCODAwOEYNCi1TMTE4MDU5NEI1QzA2REY2MjIwOTkyODgyMTQxMDA1NjQyODEyNjQ4RDI1QkI3Qzk2RDJFDQotUzExODA1QTlGQTQ0NDFEMzY4MDA1QTEyM0MwMDAxNjAwMDAwMDQ0MjQxMUY0MTAwMDQ4Qg0KLVMxMTgwNUJFMkY2ODAwMzQwMDA2MkY0OTAwMEE5Njg5MkY0MzAwMEU0RTc1NEU1NkZGQ0MNCi1TMTE4MDVEM0YwMjAyRTAwMDg0N0ZBMDAwNEQ3RkMwMDAwMDFBNjIyMEI0MUZBMDAwNDlFDQotUzExODA1RThEMUZDMDAwMDAxQjYyRDU4RkZGMDJENThGRkY0MkQ1OEZGRjgyRDUwRkY5Mg0KLVMxMTgwNUZERkM1MzgwNzQwOEI0ODA2NTAwMDEyQzQxRkEwMDA0RDFGQzAwMDAwMDBFQkENCi1TMTE4MDYxMkQwODAzMDMwMDgwMDRFRkIwMDAyMDAxMjAwMjIwMDMyMDA0MjAwNDgwMERDDQotUzExODA2Mjc1ODAwNkMwMEEwMDBEQzQxRkEwMDA0RDFGQzAwMDAwMTE4MjAxMDYwMDBDNQ0KLVMxMTgwNjNDMDEwMjQ3RkEwMDA0RDdGQzAwMDAwMTBDMjAwQjYwMDAwMEYyNDFGQTAwQzUNCi1TMTE4MDY1MTA0RDFGQzAwMDAwMTEwMjAxMDYwMDAwMEUyMjAwMTYwMDAwMERDNDdGQTlFDQotUzExODA2NjYwMDA0RDdGQzAwMDAwMTIwMjAwQjYwMDAwMENDNDNGQTAwMDREM0ZDMDAxQw0KLVMxMTgwNjdCMDAwMEZBNDFFOTAwMEMyMDEwNjAwMDAwQjgyNDJFRkZGNDQ3RkEwMDA0NjQNCi1TMTE4MDY5MEQ3RkMwMDAwMDBGRUI0OEI2NjAwMDAxMjQ3RkEwMDA0RDdGQzAwMDAwMUIwDQotUzExODA2QTUxNDIwMEI2MDAwMDA5NDQ3RkEwMDA0RDdGQzAwMDAwMTBBMjAwQjYwMDA1Qg0KLVMxMTgwNkJBMDA4NDQxRkEwMDA0RDFGQzAwMDAwMDhBMjA1MDQ3RkEwMDA0RDdGQzAwODUNCi1TMTE4MDZDRjAwMDA4MkIxQ0I2NjAwMDAxMjQ3RkEwMDA0RDdGQzAwMDAwMEUwMjAwQjc5DQotUzExODA2RTQ2MDAwMDA1ODQ3RkEwMDA0RDdGQzAwMDAwMEQyMjAwQjYwMDAwMDQ4NDE0Nw0KLVMxMTgwNkY5RkEwMDA0RDFGQzAwMDAwMDRFNDNGQTAwMDREM0ZDMDAwMDAwM0VCM0QwRkUNCi1TMTE4MDcwRTY2MDAwMDEyNDdGQTAwMDREN0ZDMDAwMDAwQUUyMDBCNjAwMDAwMUU0N0E0DQotUzExODA3MjNGQTAwMDREN0ZDMDAwMDAwQTYyMDBCNjAwMDAwMEU0N0ZBMDAwNEQ3RkM5NQ0KLVMxMTgwNzM4MDAwMDAwOTgyMDBCNEU1RTRFNzQwMDA0MDAwMDUzNzU2RTY1MDAwMDAwRDgNCi1TMTE4MDc0RDAwMDc0NjRGNzQ3NDZGMDAwMDAwMDAwMDBBMDAwMDAwMEM1MDY1NkM2Q0ZEDQotUzExODA3NjI2NTAwMDAwMDA3NUU1Mzc0Njk2RTYxMDA0QjYxNzI2OTZFMDAwMDAwMDBDMA0KLVMxMTgwNzc3MDUwMDAwMDc2ODAwMDAwMDAzMDAwMDA3NkU1MDc1NzQ3NDY1MDA0QjYxQkYNCi1TMTE4MDc4QzZDNkM2NTAwNTM3NDY5NkU2MTMxMDAwMDRCNjE3MjY5NkUzMTAwMDAwMEMxDQotUzExODA3QTEwMDAwMzMwMDAwMDc5MDAwMDAwMDFGMDAwMDA3OTg3ODc5N0E3QTAwMDBEMg0KLVMxMTgwN0I2NEY2QzZDNjUwMDAwMzcwMDM4MDA1MDY1NzQ2NTcyMDA1Mzc2NzU2QzZDMTkNCi1TMTE4MDdDQjZGMDAwMDM5MDA1MzZDNzU3NDAwMDAwMDAwMDAwMDAwMDAwNzRDMDAwMDcyDQotUzExNTA3RTAwNzY0MDAwMDA3NzgwMDAwMDc4MDAwMDAwN0E0MDAwMDA3QUMzNA0KLVM5MDMwMDAwRkMNCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyYzA2Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC12ZXJzYWRvcyB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLSMKLQotIyBNYWtlIHN1cmUgdGhhdCBsZCBjYW4gcmVhZCB2ZXJzYWRvcyBpbWFnZXMgYW5kCi0jIGdlbmVyYXRlIGJpbmFyaWVzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gdGhlIGN1c3RvbWVyJ3MKLSMgb2xkIG1ldGhvZC4KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIGxkIGdlbmVyYXRlcyBuYXRpdmUgZXhlY3V0YWJsZXMuCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiA2OGsgY29mZiB0YXJnZXRzCi0jIFNxdWFyZSBicmFja2V0IGV4cHJlc3Npb25zIHNlZW0gdG8gY29uZnVzZSBpc3RhcmdldC4KLWlmIHsgIVtpc3RhcmdldCBtNjhrLSotY29mZipdIH0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLXNldCB0ZXN0bmFtZSAiTEQgVkVSU0FET1MiCi0KLQotcHJvYyBpbnNwZWN0IHsgd2hpY2hvbmUgfSB7Ci0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCB0ZXN0bmFtZQotCi0gICAgc2VuZF9sb2cgIiRvYmpkdW1wIC1zIHRtcGRpci8kd2hpY2hvbmUub3V0ID50bXBkaXIvJHdoaWNob25lLmR1bXBcbiIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtcyB0bXBkaXIvJHdoaWNob25lLm91dCB8IGdyZXAgLXYgc3JlYyA+dG1wZGlyLyR3aGljaG9uZS5kdW1wIiBleGVjX291dHB1dAotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIHNlbmRfbG9nICIkb2JqZHVtcCAtcyAkc3JjZGlyLyRzdWJkaXIvJHdoaWNob25lLm9vayA+dG1wZGlyLyR3aGljaG9uZS5kb2tcbiIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtcyAkc3JjZGlyLyRzdWJkaXIvJHdoaWNob25lLm9vayB8IGdyZXAgLXYgc3JlYyA+dG1wZGlyLyR3aGljaG9uZS5kb2siIGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAkZXhlY19vdXRwdXQKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybiAwCi0gICAgfQotCi0gICAgIyBjb21wYXJlIGl0IHdpdGggdGhlIGNvcnJlY3Qgb3V0cHV0Ci0gICAgY2F0Y2ggImV4ZWMgZGlmZiB0bXBkaXIvJHdoaWNob25lLmR1bXAgdG1wZGlyLyR3aGljaG9uZS5kb2siIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIHJldHVybiAxCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci90MS5vdXQgXAotCSIgLVQgJHNyY2Rpci8kc3ViZGlyL3QxLmxkICRzcmNkaXIvJHN1YmRpci90MS0xLnJvICAkc3JjZGlyLyRzdWJkaXIvdDEtMi5ybyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfSBlbHNlIHsKLSAgICAjIEdldCBhIGR1bXAgb2Ygd2hhdCB3ZSd2ZSBnb3QsIGFuZCB3aGF0IHdlIHNob3VsZCBoYXZlCi0gICAgaWYgIVtpbnNwZWN0IHQxXSB7Ci0JcmV0dXJuCi0gICAgfQotfQotCi0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkICB0bXBkaXIvdDIub3V0IFwKLQkiIC1UICRzcmNkaXIvJHN1YmRpci90Mi5sZCAkc3JjZGlyLyRzdWJkaXIvdDItMi5ybyBcCi0JJHNyY2Rpci8kc3ViZGlyL3QyLTEucm8gICRzcmNkaXIvJHN1YmRpci90Mi0zLnJvIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19IGVsc2UgewotICAgICMgR2V0IGEgZHVtcCBvZiB3aGF0IHdlJ3ZlIGdvdCwgYW5kIHdoYXQgd2Ugc2hvdWxkIGhhdmUKLSAgICBpZiAhW2luc3BlY3QgdDJdIHsKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLXBhc3MgJHRlc3RuYW1lCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAgYi9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTEyNTcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xpYi9sZC1saWIuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLSMKLSMgZGVmYXVsdF9sZF92ZXJzaW9uIAotIwlleHRyYWN0IGFuZCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbGQKLSMKLXByb2MgZGVmYXVsdF9sZF92ZXJzaW9uIHsgbGQgfSB7Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JZXhpdCAxCi0gICAgfQotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAtLXZlcnNpb24iIHRtcAotICAgIHNldCB0bXAgW3BydW5lX3dhcm5pbmdzICR0bXBdCi0gICAgcmVnZXhwICJcW15cblxdKiAoY3lnbnVzLXwpKFxbLTAtOS5hLXpBLVotXF0rKVxbXHJcblxdLioiICR0bXAgdmVyc2lvbiBjeWcgbnVtYmVyCi0gICAgaWYgW2luZm8gZXhpc3RzIG51bWJlcl0gdGhlbiB7Ci0JY2xvbmVfb3V0cHV0ICIkbGQgJG51bWJlclxuIgotICAgIH0KLX0KLQotIwotIyBkZWZhdWx0X2xkX3JlbG9jYXRlIAotIwlsaW5rIGFuIG9iamVjdCB1c2luZyByZWxvY2F0aW9uCi0jCi1wcm9jIGRlZmF1bHRfbGRfcmVsb2NhdGUgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLSAgICBnbG9iYWwgSE9TVElOR19FTVUKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgJEhPU1RJTkdfRU1VIC1vICR0YXJnZXQgLXIgJG9iamVjdHMiCi0gICAgCi0gICAgY2F0Y2ggImV4ZWMgJGxkICRIT1NUSU5HX0VNVSAtbyAkdGFyZ2V0IC1yICRvYmplY3RzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMgTG9vayBmb3IgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIHN3aXRjaGVzIGluIHRoZSBtdWx0bGliCi0jIG9wdGlvbnMgYW5kIHRyYW5zbGF0ZSB0aGVzZSBpbnRvIGEgLUVCIG9yIC1FTCBzd2l0Y2guICBOb3RlCi0jIHdlIGNhbm5vdCByZWx5IHVwb24gcHJvYyBwcm9jZXNzX211bHRpbGliX29wdGlvbnMgdG8gZG8gdGhpcwotIyBmb3IgdXMgYmVjYXVzZSBmb3Igc29tZSB0YXJnZXRzIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0Ci0jIC1FQi8tRUwgYnV0IGl0IGRvZXMgc3VwcG9ydCAtbWJpZy1lbmRpYW4vLW1saXR0bGUtZW5kaWFuLCBhbmQKLSMgdGhlIHNpdGUuZXhwIGZpbGUgd2lsbCBpbmNsdWRlIHRoZSBzd2l0Y2ggIi1tYmlnLWVuZGlhbiIKLSMgKHJhdGhlciB0aGFuICJiaWctZW5kaWFuIikgd2hpY2ggaXMgbm90IGRldGVjdGVkIGJ5IHByb2MKLSMgcHJvY2Vzc19tdWx0aWxpYl9vcHRpb25zLgotCi1wcm9jIGJpZ19vcl9saXR0bGVfZW5kaWFuIHt9IHsKLSAgICAKLSAgICBpZiBbYm9hcmRfaW5mbyBbdGFyZ2V0X2luZm8gbmFtZV0gZXhpc3RzIG11bHRpbGliX2ZsYWdzXSB7Ci0Jc2V0IHRtcF9mbGFncyAiIFtib2FyZF9pbmZvIFt0YXJnZXRfaW5mbyBuYW1lXSBtdWx0aWxpYl9mbGFnc10iOwotCi0JZm9yZWFjaCB4ICR0bXBfZmxhZ3MgewotCSAgICBjYXNlICR4IGluIHsKLQkJeypiaWcqZW5kaWFuIGViIEVCfSB7Ci0JCSAgICBzZXQgZmxhZ3MgIiAtRUIiCi0JCSAgICByZXR1cm4gJGZsYWdzCi0JCX0KLQkJeypsaXR0bGUqZW5kaWFuIGVsIEVMfSB7Ci0JCSAgICBzZXQgZmxhZ3MgIiAtRUwiCi0JCSAgICByZXR1cm4gJGZsYWdzCi0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBzZXQgZmxhZ3MgIiIKLSAgICByZXR1cm4gJGZsYWdzCi19Ci0KLSMKLSMgZGVmYXVsdF9sZF9saW5rIAotIwlsaW5rIGEgcHJvZ3JhbSB1c2luZyBsZAotIwotcHJvYyBkZWZhdWx0X2xkX2xpbmsgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLSAgICBnbG9iYWwgSE9TVElOR19FTVUKLSAgICBnbG9iYWwgSE9TVElOR19DUlQwCi0gICAgZ2xvYmFsIEhPU1RJTkdfTElCUwotICAgIGdsb2JhbCBMSUJTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIHNldCBvYmpzICIkSE9TVElOR19DUlQwICRvYmplY3RzIgotICAgIHNldCBsaWJzICIkTElCUyAkSE9TVElOR19MSUJTIgotICAgIAotICAgIGlmIHsgW3doaWNoICRsZF0gPT0gMCB9IHRoZW4gewotCXBlcnJvciAiJGxkIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotICAgIAotICAgIHNldCBmbGFncyBbYmlnX29yX2xpdHRsZV9lbmRpYW5dCi0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgJEhPU1RJTkdfRU1VICRmbGFncyAtbyAkdGFyZ2V0ICRvYmpzICRsaWJzIgotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAkSE9TVElOR19FTVUgJGZsYWdzIC1vICR0YXJnZXQgJG9ianMgJGxpYnMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotIwotIyBkZWZhdWx0X2xkX3NpbXBsZV9saW5rIAotIwlsaW5rIGEgcHJvZ3JhbSB1c2luZyBsZCwgd2l0aG91dCBpbmNsdWRpbmcgYW55IGxpYnJhcmllcwotIwotcHJvYyBkZWZhdWx0X2xkX3NpbXBsZV9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIGlmIHsgW3doaWNoICRsZF0gPT0gMCB9IHRoZW4gewotCXBlcnJvciAiJGxkIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotICAgIAotICAgIHNldCBmbGFncyBbYmlnX29yX2xpdHRsZV9lbmRpYW5dCi0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgJGZsYWdzIC1vICR0YXJnZXQgJG9iamVjdHMiCi0gICAgCi0gICAgY2F0Y2ggImV4ZWMgJGxkICRmbGFncyAtbyAkdGFyZ2V0ICRvYmplY3RzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgIyBXZSBkb24ndCBjYXJlIGlmIHdlIGdldCBhIHdhcm5pbmcgYWJvdXQgYSBub24tZXhpc3RlbnQgc3RhcnQKLSAgICAjIHN5bWJvbCwgc2luY2UgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdCBtaWdodCB1c2UgRU5UUlkuCi0gICAgcmVnc3ViIC1hbGwgIihefFxuKShcW15cblxdKjogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9jb21waWxlIAotIwljb21waWxlIGFuIG9iamVjdCB1c2luZyBjYwotIwotcHJvYyBkZWZhdWx0X2xkX2NvbXBpbGUgeyBjYyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGdsb2JhbCBDRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgZ2NjX2dhc19mbGFnCi0KLSAgICBzZXQgY2NfcHJvZyAkY2MKLSAgICBpZiB7W2xsZW5ndGggJGNjX3Byb2ddID4gMX0gdGhlbiB7Ci0Jc2V0IGNjX3Byb2cgW2xpbmRleCAkY2NfcHJvZyAwXQotICAgIH0KLSAgICBpZiB7W3doaWNoICRjY19wcm9nXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRjY19wcm9nIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgY2F0Y2ggImV4ZWMgcm0gLWYgJG9iamVjdCIgZXhlY19vdXRwdXQKLQotICAgIHNldCBmbGFncyAiLUkkc3JjZGlyLyRzdWJkaXIgJENGTEFHUyIKLQotICAgICMgSWYgd2UgYXJlIGNvbXBpbGluZyB3aXRoIGdjYywgd2Ugd2FudCB0byBhZGQgZ2NjX2dhc19mbGFnIHRvCi0gICAgIyBmbGFncy4gIFJhdGhlciB0aGFuIGRldGVybWluZSB0aGlzIGluIHNvbWUgY29tcGxleCB3YXksIHdlIGd1ZXNzCi0gICAgIyBiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIuCi0gICAgaWYge1tzdHJpbmcgbWF0Y2ggIipnY2MqIiAkY2NdIHx8IFtzdHJpbmcgbWF0Y2ggIiorKyoiICRjY119IHRoZW4gewotCXNldCBmbGFncyAiJGdjY19nYXNfZmxhZyAkZmxhZ3MiCi0gICAgfQotCi0gICAgaWYgW2JvYXJkX2luZm8gW3RhcmdldF9pbmZvIG5hbWVdIGV4aXN0cyBtdWx0aWxpYl9mbGFnc10gewotCWFwcGVuZCBmbGFncyAiIFtib2FyZF9pbmZvIFt0YXJnZXRfaW5mbyBuYW1lXSBtdWx0aWxpYl9mbGFnc10iOwotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJGNjICRmbGFncyAtYyAkc291cmNlIC1vICRvYmplY3QiCi0KLSAgICBjYXRjaCAiZXhlYyAkY2MgJGZsYWdzIC1jICRzb3VyY2UgLW8gJG9iamVjdCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JaWYgeyFbZmlsZSBleGlzdHMgJG9iamVjdF19IHRoZW4gewotCSAgICByZWdleHAgIi4qLyhcW14vXF0qKSQiICRzb3VyY2UgYWxsIGRvYmoKLQkgICAgcmVnc3ViICJcXC5jIiAkZG9iaiAiLm8iIHJlYWxvYmoKLQkgICAgdmVyYm9zZSAibG9va2luZyBmb3IgJHJlYWxvYmoiCi0JICAgIGlmIHtbZmlsZSBleGlzdHMgJHJlYWxvYmpdfSB0aGVuIHsKLQkJdmVyYm9zZSAtbG9nICJtdiAkcmVhbG9iaiAkb2JqZWN0IgotCQljYXRjaCAiZXhlYyBtdiAkcmVhbG9iaiAkb2JqZWN0IiBleGVjX291dHB1dAotCQlzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQkJaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4gewotCQkgICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JCSAgICBwZXJyb3IgImNvdWxkIG5vdCBtb3ZlICRyZWFsb2JqIHRvICRvYmplY3QiCi0JCSAgICByZXR1cm4gMAotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCXBlcnJvciAiJG9iamVjdCBub3QgZm91bmQgYWZ0ZXIgY29tcGlsYXRpb24iCi0JCXJldHVybiAwCi0JICAgIH0KLQl9Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXBlcnJvciAiJHNvdXJjZTogY29tcGlsYXRpb24gZmFpbGVkIgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGRlZmF1bHRfbGRfYXNzZW1ibGUgeyBhcyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGdsb2JhbCBBU0ZMQUdTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIGlmIHtbd2hpY2ggJGFzXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRhcyBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmICFbaW5mbyBleGlzdHMgQVNGTEFHU10geyBzZXQgQVNGTEFHUyAiIiB9Ci0KLSAgICBzZXQgZmxhZ3MgW2JpZ19vcl9saXR0bGVfZW5kaWFuXQotCi0gICAgdmVyYm9zZSAtbG9nICIkYXMgJGZsYWdzICRBU0ZMQUdTIC1vICRvYmplY3QgJHNvdXJjZSIKLQotICAgIGNhdGNoICJleGVjICRhcyAkZmxhZ3MgJEFTRkxBR1MgLW8gJG9iamVjdCAkc291cmNlIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkc291cmNlOiBhc3NlbWJseSBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9ubQotIwlydW4gbm0gb24gYSBmaWxlLCBwdXR0aW5nIHRoZSByZXN1bHQgaW4gdGhlIGFycmF5IG5tX291dHB1dAotIwotcHJvYyBkZWZhdWx0X2xkX25tIHsgbm0gb2JqZWN0IH0gewotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIG5tX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIGlmIHtbd2hpY2ggJG5tXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRubSBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0XX0gewotICAgICAgdW5zZXQgbm1fb3V0cHV0Ci0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBOTUZMQUdTXSB7IHNldCBOTUZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG5tICROTUZMQUdTICRvYmplY3QgPnRtcGRpci9ubS5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkbm0gJE5NRkxBR1MgJG9iamVjdCA+dG1wZGlyL25tLm91dCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0Jc2V0IGZpbGUgW29wZW4gdG1wZGlyL25tLm91dCByXQotCXdoaWxlIHsgW2dldHMgJGZpbGUgbGluZV0gIT0gLTEgfSB7Ci0JICAgIHZlcmJvc2UgIiRsaW5lIiAyCi0JICAgIGlmIFtyZWdleHAgIl4oXFswLTlhLWZBLUZcXSspIFxbYS16QS1aMC05XF0gKC4rKSQiICRsaW5lIHdob2xlIHZhbHVlIG5hbWVdIHsKLSAgICAgICAgICAgICAgICBzZXQgbmFtZSBbc3RyaW5nIHRyaW1sZWZ0ICRuYW1lICJfIl0KLQkJdmVyYm9zZSAiU2V0dGluZyBubV9vdXRwdXQoJG5hbWUpIHRvIDB4JHZhbHVlIiAyCi0JCXNldCBubV9vdXRwdXQoJG5hbWUpIDB4JHZhbHVlCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGUKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkb2JqZWN0OiBubSBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgc2ltcGxlX2RpZmYKLSMJY29tcGFyZXMgdHdvIGZpbGVzIGxpbmUtYnktbGluZQotIwlyZXR1cm5zIGRpZmZlcmVuY2VzIGlmIGV4aXN0Ci0jCXJldHVybnMgbnVsbCBpZiBmaWxlKHMpIGNhbm5vdCBiZSBvcGVuZWQKLSMKLXByb2Mgc2ltcGxlX2RpZmYgeyBmaWxlXzEgZmlsZV8yIH0gewotICAgIGdsb2JhbCB0YXJnZXQKLQkKLSAgICBzZXQgZW9mIC0xCi0gICAgc2V0IGRpZmZlcmVuY2VzIDAKLSAgICAKLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMV0gdGhlbiB7Ci0Jc2V0IGZpbGVfYSBbb3BlbiAkZmlsZV8xIHJdCi0gICAgfSBlbHNlIHsKLQl3YXJuaW5nICIkZmlsZV8xIGRvZXNuJ3QgZXhpc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIAotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8yXSB0aGVuIHsKLQlzZXQgZmlsZV9iIFtvcGVuICRmaWxlXzIgcl0KLSAgICB9IGVsc2UgewotCWZhaWwgIiRmaWxlXzIgZG9lc24ndCBleGlzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAiIyBEaWZmJ2luZzogJGZpbGVfMSAkZmlsZV8yXG4iIDIKLSAgICAKLSAgICB3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKLQlpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCSAgICBjb250aW51ZQotCX0gZWxzZSB7Ci0JICAgIGxhcHBlbmQgbGlzdF9hICRsaW5lCi0JfQotICAgIH0KLSAgICBjbG9zZSAkZmlsZV9hCi0gICAgCi0gICAgd2hpbGUgeyBbZ2V0cyAkZmlsZV9iIGxpbmVdICE9ICRlb2YgfSB7Ci0JaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkgICAgY29udGludWUKLQl9IGVsc2UgewotCSAgICBsYXBwZW5kIGxpc3RfYiAkbGluZQotCX0KLSAgICB9Ci0gICAgY2xvc2UgJGZpbGVfYgotCi0gICAgZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBpIH0gewotCXNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRpXQotCXNldCBsaW5lX2IgW2xpbmRleCAkbGlzdF9iICRpXQotCi0JdmVyYm9zZSAiXHQkZmlsZV8xOiAkaTogJGxpbmVfYVxuIiAzCi0JdmVyYm9zZSAiXHQkZmlsZV8yOiAkaTogJGxpbmVfYlxuIiAzCi0JaWYgW3N0cmluZyBjb21wYXJlICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiXHQkZmlsZV8xOiAkaTogJGxpbmVfYVxuIgotCSAgICB2ZXJib3NlIC1sb2cgIlx0JGZpbGVfMjogJGk6ICRsaW5lX2JcbiIKLQotCSAgICBmYWlsICJUZXN0OiAkdGFyZ2V0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIAotICAgIGlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7Ci0JZmFpbCAiVGVzdDogJHRhcmdldCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiAkZGlmZmVyZW5jZXM8MSB0aGVuIHsKLQlwYXNzICJUZXN0OiAkdGFyZ2V0IgotICAgIH0KLX0KLQotIyBUaGlzIGRlZmluaXRpb24gaXMgdGFrZW4gZnJvbSBhbiB1bnJlbGVhc2VkIHZlcnNpb24gb2YgRGVqYUdudS4gIE9uY2UKLSMgdGhhdCB2ZXJzaW9uIGdldHMgcmVsZWFzZWQsIGFuZCBoYXMgYmVlbiBvdXQgaW4gdGhlIHdvcmxkIGZvciBhIGZldwotIyBtb250aHMgYXQgbGVhc3QsIGl0IG1heSBiZSBzYWZlIHRvIGRlbGV0ZSB0aGlzIGNvcHkuCi1pZiAhW3N0cmluZyBsZW5ndGggW2luZm8gcHJvYyBwcnVuZV93YXJuaW5nc11dIHsKLSAgICAjCi0gICAgIyBwcnVuZV93YXJuaW5ncyAtLSBkZWxldGUgdmFyaW91cyBzeXN0ZW0gdmVyYm9zaXRpZXMgZnJvbSBURVhUCi0gICAgIwotICAgICMgQW4gZXhhbXBsZSBpczoKLSAgICAjIGxkLnNvOiB3YXJuaW5nOiAvdXNyL2xpYi9saWJjLnNvLjEuOC4xIGhhcyBvbGRlciByZXZpc2lvbiB0aGFuIGV4cGVjdGVkIDkKLSAgICAjCi0gICAgIyBTaXRlcyB3aXRoIHBhcnRpY3VsYXIgdmVyYm9zZSBvcydzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgaW4gc2l0ZS5leHAuCi0gICAgIwotICAgIHByb2MgcHJ1bmVfd2FybmluZ3MgeyB0ZXh0IH0gewotCSMgVGhpcyBpcyBmcm9tIHN1bjQncy4gIERvIGl0IGZvciBhbGwgbWFjaGluZXMgZm9yIG5vdy4KLQkjIFRoZSAiXFwxIiBpcyB0byB0cnkgdG8gcHJlc2VydmUgYSAiXG4iIGJ1dCBvbmx5IGlmIG5lY2Vzc2FyeS4KLQlyZWdzdWIgLWFsbCAiKF58XG4pKGxkLnNvOiB3YXJuaW5nOlxbXlxuXF0qXG4/KSsiICR0ZXh0ICJcXDEiIHRleHQKLQotCSMgSXQgbWlnaHQgYmUgdGVtcHRpbmcgdG8gZ2V0IGNhcnJpZWQgYXdheSBhbmQgZGVsZXRlIGJsYW5rIGxpbmVzLCBldGMuCi0JIyBKdXN0IGRlbGV0ZSAqZXhhY3RseSogd2hhdCB3ZSdyZSBhc2sgdG8sIGFuZCB0aGF0J3MgaXQuCi0JcmV0dXJuICR0ZXh0Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L0NPUFlJTkcuTElCIGIvbGliaWJlcnR5L0NPUFlJTkcuTElCCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFhM2QxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9DT1BZSU5HLkxJQgorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0JCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVtUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IEdQTC4gIEl0IGlzCi0gbnVtYmVyZWQgMiBiZWNhdXNlIGl0IGdvZXMgd2l0aCB2ZXJzaW9uIDIgb2YgdGhlIG9yZGluYXJ5IEdQTC5dCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCi1mcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCi0KLSAgVGhpcyBsaWNlbnNlLCB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKLXNwZWNpYWxseSBkZXNpZ25hdGVkIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSwgYW5kIHRvIGFueQotb3RoZXIgbGlicmFyaWVzIHdob3NlIGF1dGhvcnMgZGVjaWRlIHRvIHVzZSBpdC4gIFlvdSBjYW4gdXNlIGl0IGZvcgoteW91ciBsaWJyYXJpZXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZgoteW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCi1vciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCi15b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCi1jb2RlLiAgSWYgeW91IGxpbmsgYSBwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKLWNvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cyBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCi13aXRoIHRoZSBsaWJyYXJ5LCBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKLWl0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgotCi0gIE91ciBtZXRob2Qgb2YgcHJvdGVjdGluZyB5b3VyIHJpZ2h0cyBoYXMgdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0Ci10aGUgbGlicmFyeSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAotcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCi0KLSAgQWxzbywgZm9yIGVhY2ggZGlzdHJpYnV0b3IncyBwcm90ZWN0aW9uLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLWxpYnJhcnkuICBJZiB0aGUgbGlicmFyeSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwKLXZlcnNpb24sIHNvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24KLXRoZSBvcmlnaW5hbCBhdXRob3JzJyByZXB1dGF0aW9ucy4KLQwKLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCBjb21wYW5pZXMgZGlzdHJpYnV0aW5nIGZyZWUKLXNvZnR3YXJlIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIHRodXMgaW4gZWZmZWN0Ci10cmFuc2Zvcm1pbmcgdGhlIHByb2dyYW0gaW50byBwcm9wcmlldGFyeSBzb2Z0d2FyZS4gIFRvIHByZXZlbnQgdGhpcywKLXdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncwotZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIHdhcyBkZXNpZ25lZCBmb3IgdXRpbGl0eSBwcm9ncmFtcy4gIFRoaXMKLWxpY2Vuc2UsIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4KLWRlc2lnbmF0ZWQgbGlicmFyaWVzLiAgVGhpcyBsaWNlbnNlIGlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeQotb25lOyBiZSBzdXJlIHRvIHJlYWQgaXQgaW4gZnVsbCwgYW5kIGRvbid0IGFzc3VtZSB0aGF0IGFueXRoaW5nIGluIGl0IGlzCi10aGUgc2FtZSBhcyBpbiB0aGUgb3JkaW5hcnkgbGljZW5zZS4KLQotICBUaGUgcmVhc29uIHdlIGhhdmUgYSBzZXBhcmF0ZSBwdWJsaWMgbGljZW5zZSBmb3Igc29tZSBsaWJyYXJpZXMgaXMgdGhhdAotdGhleSBibHVyIHRoZSBkaXN0aW5jdGlvbiB3ZSB1c3VhbGx5IG1ha2UgYmV0d2VlbiBtb2RpZnlpbmcgb3IgYWRkaW5nIHRvIGEKLXByb2dyYW0gYW5kIHNpbXBseSB1c2luZyBpdC4gIExpbmtpbmcgYSBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5LCB3aXRob3V0Ci1jaGFuZ2luZyB0aGUgbGlicmFyeSwgaXMgaW4gc29tZSBzZW5zZSBzaW1wbHkgdXNpbmcgdGhlIGxpYnJhcnksIGFuZCBpcwotYW5hbG9nb3VzIHRvIHJ1bm5pbmcgYSB1dGlsaXR5IHByb2dyYW0gb3IgYXBwbGljYXRpb24gcHJvZ3JhbS4gIEhvd2V2ZXIsIGluCi1hIHRleHR1YWwgYW5kIGxlZ2FsIHNlbnNlLCB0aGUgbGlua2VkIGV4ZWN1dGFibGUgaXMgYSBjb21iaW5lZCB3b3JrLCBhCi1kZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LCBhbmQgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXRyZWF0cyBpdCBhcyBzdWNoLgotCi0gIEJlY2F1c2Ugb2YgdGhpcyBibHVycmVkIGRpc3RpbmN0aW9uLCB1c2luZyB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgZm9yIGxpYnJhcmllcyBkaWQgbm90IGVmZmVjdGl2ZWx5IHByb21vdGUgc29mdHdhcmUKLXNoYXJpbmcsIGJlY2F1c2UgbW9zdCBkZXZlbG9wZXJzIGRpZCBub3QgdXNlIHRoZSBsaWJyYXJpZXMuICBXZQotY29uY2x1ZGVkIHRoYXQgd2Vha2VyIGNvbmRpdGlvbnMgbWlnaHQgcHJvbW90ZSBzaGFyaW5nIGJldHRlci4KLQotICBIb3dldmVyLCB1bnJlc3RyaWN0ZWQgbGlua2luZyBvZiBub24tZnJlZSBwcm9ncmFtcyB3b3VsZCBkZXByaXZlIHRoZQotdXNlcnMgb2YgdGhvc2UgcHJvZ3JhbXMgb2YgYWxsIGJlbmVmaXQgZnJvbSB0aGUgZnJlZSBzdGF0dXMgb2YgdGhlCi1saWJyYXJpZXMgdGhlbXNlbHZlcy4gIFRoaXMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCi1wZXJtaXQgZGV2ZWxvcGVycyBvZiBub24tZnJlZSBwcm9ncmFtcyB0byB1c2UgZnJlZSBsaWJyYXJpZXMsIHdoaWxlCi1wcmVzZXJ2aW5nIHlvdXIgZnJlZWRvbSBhcyBhIHVzZXIgb2Ygc3VjaCBwcm9ncmFtcyB0byBjaGFuZ2UgdGhlIGZyZWUKLWxpYnJhcmllcyB0aGF0IGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlbS4gIChXZSBoYXZlIG5vdCBzZWVuIGhvdyB0byBhY2hpZXZlCi10aGlzIGFzIHJlZ2FyZHMgY2hhbmdlcyBpbiBoZWFkZXIgZmlsZXMsIGJ1dCB3ZSBoYXZlIGFjaGlldmVkIGl0IGFzIHJlZ2FyZHMKLWNoYW5nZXMgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbnMgb2YgdGhlIExpYnJhcnkuKSAgVGhlIGhvcGUgaXMgdGhhdCB0aGlzCi13aWxsIGxlYWQgdG8gZmFzdGVyIGRldmVsb3BtZW50IG9mIGZyZWUgbGlicmFyaWVzLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKLSJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCi1mb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoaWxlIHRoZSBsYXR0ZXIgb25seQotd29ya3MgdG9nZXRoZXIgd2l0aCB0aGUgbGlicmFyeS4KLQotICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgbGlicmFyeSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByYXRoZXIgdGhhbiBieSB0aGlzIHNwZWNpYWwgb25lLgotDAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSB3aGljaAotY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yIG90aGVyIGF1dGhvcml6ZWQKLXBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGlicmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLiAgRWFjaCBsaWNlbnNlZSBpcwotYWRkcmVzc2VkIGFzICJ5b3UiLgotCi0gIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKLXByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcwotKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KLQotICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawotd2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKLWNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCi1wb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCi1zdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCi1pbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQotCi0gICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCi1hbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAotaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCi1hbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCi1zdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCi13cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCi1hbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KLSAgCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwotY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKLXlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCi1hcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAotYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKLXdhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCi1MaWJyYXJ5LgotCi0gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCi1hbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCi1mZWUuCi0MCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KLSAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQotICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKLSAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5Ci0gICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCi0gICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCi0gICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKLSAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCi0KLSAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwotICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKLSAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQotICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0Ci0gICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKLSAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCi1pdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQotd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwotdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwotdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQotdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgotdGhlc2Ugbm90aWNlcy4KLQwKLSAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgotdGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKLXN1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCi0KLSAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCi10aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCi0KLSAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKLWRlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCi11bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKLWl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKLW11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgotCi0gIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci1mcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQotc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCi1kaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCi1MaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCi1saW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQotd29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAotdGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5Ci1jcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKLWNvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCi1saWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KLVNlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgotCi0gIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCi10aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKLWRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgotV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKLWxpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCi10aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgotCi0gIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCi1zdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKLWZ1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKLWZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKLXdvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCi1MaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQotCi0gIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5Ci1kaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KLUFueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAotd2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgotDAotICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tcGlsZSBvcgotbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKLXdvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi11bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Ci1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgotCi0gIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQotTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCi1kdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQotZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQotb2YgdGhlc2UgdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKLSAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKLSAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgotICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCi0gICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0Ci0gICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKLSAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAotICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCi0gICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCi0gICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKLQotICAgIGIpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGMpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZCkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5Ci1kaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKLWNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KLXdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKLXRoZSBleGVjdXRhYmxlLgotCi0gIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCi1yZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5Ci1hY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Ci11c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91Ci1kaXN0cmlidXRlLgotDAotICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAotbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCi10aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKLXBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawotICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKLSAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICBTZWN0aW9ucyBhYm92ZS4KLQotICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0Ci0gICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKLSAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKLXRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55Ci1hdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgotcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAotb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwotdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5Ci1zdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotDAotICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKLXBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKLWFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAotYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCi1zbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKLWV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCi13cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKLXZlcnNpb25zIG9mIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCi1TdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCi1idXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAotImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQotbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0MCi0gIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKLXdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCi1jb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgotZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cwotb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKLWFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTwotV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KLUVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCi1PVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQotTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKLVRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgotV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKLUFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCi1GT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQotTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORwotUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKLVNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLSAgICAgQXBwZW5kaXg6IEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKLWV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZwotcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi1vcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KLQotICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCi1zYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCi0iY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCi0gICAgTUEgMDIxMTEtMTMwNywgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L0NoYW5nZUxvZyBiL2xpYmliZXJ0eS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NTg0MDkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDM2MTUgKzAsMCBAQAotVGh1IE1hciAxNiAwMTozMzo1OCAyMDAwICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChwYXJ0aXRpb24ubyk6IERlcGVuZCBvbiBjb25maWcuaAotCi0yMDAwLTAzLTE0ICBCZXJuZCBTY2htaWR0ICA8YmVybmRzQGN5Z251cy5jby51az4KLQotCSogaGFzaHRhYi5jIChmaW5kX2VtcHR5X3Nsb3RfZm9yX2V4cGFuZCk6IE5ldyBmdW5jdGlvbi4KLQkoaHRhYl9leHBhbmQpOiBVc2UgaXQgaW5zdGVhZCBvZiBodGFiX2ZpbmRfc2xvdC4KLQkoaHRhYl9maW5kX3dpdGhfaGFzaCk6IFJlbmFtZWQgZnJvbSBodGFiX2ZpbmQ7IG5vdyBhY2NlcHRzIGV4dHJhCi0JYXJndW1lbnQgSEFTSC4KLQkoaHRhYl9maW5kX3Nsb3Rfd2l0aF9oYXNoKTogTGlrZXdpc2UgZm9yIGh0YWJfZmluZF9zbG90LgotCShodGFiX2ZpbmQpOiBOZXcgd3JhcHBlciBmdW5jdGlvbi4KLQkoaHRhYl9maW5kX3Nsb3QpOiBMaWtld2lzZS4KLQkoaHRhYl90cmF2ZXJzZSk6IFBhc3Mgc2xvdCwgbm90IGVudHJ5LCB0byBjYWxsZWQgZnVuY3Rpb24uCi0KLTIwMDAtMDMtMDkgIEFsZXggU2FtdWVsICA8c2FtdWVsQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgcGFydGl0aW9uLmMuCi0JKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBwYXJ0aXRpb24uby4KLQkocGFydGl0aW9uLm8pOiBOZXcgcnVsZS4KLQkqIHBhcnRpdGlvbi5jOiBOZXcgZmlsZS4KLQkKLTIwMDAtMDMtMDkgIFphY2sgV2VpbmJlcmcgIDx6YWNrQHdvbGVyeS5jdW1iLm9yZz4KLQotCSogaGFzaHRhYi5jIChodGFiX2NyZWF0ZSk6IFNldCBkZWxfZi4KLQkoaHRhYl9kZWxldGUsIGh0YWJfZW1wdHksIGh0YWJfcmVtb3ZlX2VsdCwgaHRhYl9jbGVhcl9zbG90KToKLQlVc2UgaXQuCi0KLTIwMDAtMDMtMDggIFphY2sgV2VpbmJlcmcgIDx6YWNrQHdvbGVyeS5jdW1iLm9yZz4KLQotCSogaGFzaHRhYi5jOiBSZW1vdmUgZGVidWdnaW5nIHZhcmlhYmxlcyAoYWxsX3NlYXJjaGVzLAotCWFsbF9jb2xsaXNpb25zLCBhbGxfZXhwYW5zaW9ucykuIERlbGV0ZQotCWFsbF9oYXNoX3RhYmxlX2NvbGxpc2lvbnMuCi0JKGNyZWF0ZV9oYXNoX3RhYmxlLCBkZWxldGVfaGFzaF90YWJsZSwgZW1wdHlfaGFzaF90YWJsZSwKLQlmaW5kX2hhc2hfdGFibGVfZW50cnksIHJlbW92ZV9lbGVtZW50X2Zyb21faGFzaF90YWJsZV9lbnRyeSwKLQljbGVhcl9oYXNoX3RhYmxlX3Nsb3QsIHRyYXZlcnNlX2hhc2hfdGFibGUsIGhhc2hfdGFibGVfc2l6ZSwKLQloYXNoX3RhYmxlX2VsZW1lbnRzX251bWJlciwgaGFzaF90YWJsZV9jb2xsaXNpb25zKTogUmVuYW1lIHRvOgotCWh0YWJfY3JlYXRlLCBodGFiX2RlbGV0ZSwgaHRhYl9lbXB0eSwgaHRhYl9maW5kX3Nsb3QsCi0JaHRhYl9yZW1vdmVfZWx0LCBodGFiX2NsZWFyX3Nsb3QsIGh0YWJfdHJhdmVyc2UsIGh0YWJfc2l6ZSwKLQlodGFiX2VsZW1lbnRzLCBodGFiX2NvbGxpc2lvbnMuCi0JKGh0YWJfZmluZCk6IE5ldyBmdW5jdGlvbiwgaGFuZGxlcyBjb21tb24gY2FzZSB3aGVyZSB5b3UgZG9uJ3QKLQlwbGFuIHRvIGFkZCBvciBkZWxldGUgYW4gZW50cnkuCi0JKGh0YWJfZXhwYW5kKTogRG9uJ3QgY3JlYXRlIGEgd2hvbGUgbmV3IHRhYmxlLCBqdXN0IGEgbmV3Ci0JZW50cnkgdmVjdG9yLgotCShodGFiX2ZpbmRfc2xvdCk6IFNpbXBsaWZ5IGxvZ2ljLgotCi0xOTk5LTA4LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZmxvYXRmb3JtYXQuYzogQWRkIGNhc3RzIHRvIGF2b2lkIHNpZ25lZC91bnNpZ25lZCB3YXJuaW5ncy4KLQkqIHBleGVjdXRlLmM6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIGFzIG5lZWRlZCBvbiBVbml4LgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbF90b19saWJkaXIpOiBDaGFuZ2UgJChUQVJHRVRMSUIpLm4gdG8KLQkkKFRBUkdFVExJQiluIHNvIGl0IHdvcmtzIG9uIE1TRE9TLgotCShpbnN0YWxsX3RvX3Rvb2xkaXIpOiBMaWtld2lzZS4KLQotMTk5OS0wNy0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIE1hcmsgRWxicmVjaHQ6Ci0JKiBtYWtlZmlsZS5kb3M6IFJlbW92ZTsgb2Jzb2xldGUuCi0JKiBjb25maWd1cmUuYmF0OiBSZW1vdmU7IG9ic29sZXRlLgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3BsYXktdHJlZS5jIChzcGxheV90cmVlX2luc2VydCk6IEFkZCBpbml0aWFsaXphdGlvbiB0byBhdm9pZAotCXdhcm5pbmcuCi0KLTIwMDAtMDEtMDQgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBwZXhlY3V0ZS5jOiBDb25kaXRpb25hbGx5IGluY2x1ZGUgc3RyaW5nLmguCi0JKGZpeF9hcmd2KTogSGFuZGxlIGVtYmVkZGVkIHdoaXRlc3BhY2UgaW4gYXJncyBmb3IgTWluZ3czMi4KLQotMjAwMC0wMS0wNCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKGFjX2xpYmliZXJ0eV93YXJuX2NmbGFncyk6IFR1cm4gb24gd2FybmluZ3MgaWYKLQl3ZSdyZSB1c2luZyBnY2MuCi0KLQkqIE1ha2VmaWxlLmluIChDT01QSUxFLmMpOiBBZGQgQGFjX2xpYmliZXJ0eV93YXJuX2NmbGFnc0AKLQotMTk5OS0xMi0yNyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiB2YXNwcmludGYuYyAoaW50X3Zhc3ByaW50Zik6IERvbid0IHJlLXJlYWQgdGhlIGZvcm1hdCBjaGFyYWN0ZXIKLQlhcyB0aGlzIG1pc2hhbmRsZXMgc3RyaW5ncyBsaWtlICclJXMnLgotCi0xOTk5LTEyLTA1ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfbmV3KTogVXNlIHN0cnVjdCBzcGxheV90cmVlX25vZGVfcwotCXJhdGhlciB0aGFuIHN0cnVjdCBzcGxheV90cmVlX25vZGUuCi0JKHNwbGF5X3RyZWVfaW5zZXJ0KTogVXNlIHN0cnVjdCBzcGxheV90cmVlX3MgcmF0aGVyIHRoYW4gc3RydWN0Ci0Jc3BsYXlfdHJlZS4KLQotU3VuIE5vdiAyOCAwMDo1OTozOSAxOTk5ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogaGFzaHRhYi5jIChzeXMvdHlwZXMuaCk6IEZpbGUgaW5jbHVkZWQuCi0KLTE5OTktMTEtMjIgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBjYXNleS5jeWdudXMuY29tPgotCi0JKiBzdHJ0b3VsLmMsIHN0cnRvbC5jLCByYW5kb20uYzogUmVtb3ZlIGFkdmVydGlzaW5nIGNsYXVzZSBmcm9tCi0JQlNEIGxpY2Vuc2UsIHB1cnN1YW50IHdpdGgKLQotCSAgZnRwOi8vZnRwLmNzLmJlcmtlbGV5LmVkdS9wdWIvNGJzZC9SRUFETUUuSW1wdC5MaWNlbnNlLkNoYW5nZQotCi1XZWQgTm92IDEwIDA5OjQyOjM5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaGFzaHRhYi5jOiBJbmNsdWRlIHN0ZGlvLmguCi0KLU1vbiBOb3YgIDggMDk6MjM6NDEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoYXNodGFiLmMgKHRyYXZlcnNlX2hhc2hfdGFibGUpOiBQcm90ZWN0IHByb3RvdHlwZSB3aXRoIFBBUkFNUy4KLQotVHVlIE5vdiAgMiAwMzoyMzoxMyAxOTk5ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogeHN0cmR1cCAoc3lzL3R5cGVzLmgpOiBJbmNsdWRlIHRoaXMgZmlsZS4KLQotMTk5OS0xMC0yOCAgTmF0aGFuIFNpZHdlbGwgIDxuYXRoYW5AYWNtLm9yZz4KLQotCSogTWFrZWZpbGUuaW4gKFNVQkRJUlMpOiBOZXcgbWFjcm8uCi0JKG1vc3RseWNsZWFuLCBjbGVhbiwgZGlzdGNsZWFuLCBtYWludGFpbmVyLWNsZWFuKTogQWRqdXN0IHRvCi0JYXZvaWQgbXVsdGlwbGUgc3ViZGlyZWN0b3J5IGNsZWFuaW5nLgotCSgqLXN1YmRpcik6IFVzZSBTVUJESVJTLgotCi0xOTk5LTEwLTI1ICBKaW0gS2luZ2RvbiAgPGh0dHA6Ly9kZXZlbG9wZXIucmVkaGF0LmNvbS8+Ci0KLQkqIGNwbHVzLWRlbS5jOiBNb3ZlIGRlY2xhcmF0aW9ucyBvZiBzdGFuZGFyZF9zeW1ib2xfY2hhcmFjdGVycyBhbmQKLQlocF9zeW1ib2xfY2hhcmFjdGVycyBpbnNpZGUgI2lmZGVmIE1BSU4gdG8gYXZvaWQgY29tcGlsZXIKLQl3YXJuaW5ncy4KLQotMTk5OS0xMC0yMyAwODo1MSAtMDcwMCAgWmFjayBXZWluYmVyZyAgPHphY2tAYml0bW92ZXIuY29tPgotCi0JKiBoYXNodGFiLmMgKGZpbmRfaGFzaF90YWJsZV9lbnRyeSk6IFdoZW4gcmV0dXJuaW5nIGEKLQlERUxFVEVEX0VOVFJZIHNsb3QsIGNoYW5nZSBpdCB0byBFTVBUWV9FTlRSWSBmaXJzdC4KLQkoY2xlYXJfaGFzaF90YWJsZV9zbG90KTogTmV3IGZ1bmN0aW9uIHdoaWNoIGRlbGV0ZXMgYW4gZW50cnkKLQlieSBpdHMgcG9zaXRpb24gaW4gdGhlIHRhYmxlLCBub3QgaXRzIHZhbHVlLgotCSh0cmF2ZXJzZV9oYXNoX3RhYmxlKTogTmV3IGZ1bmN0aW9uIHdoaWNoIGNhbGxzIGEgaG9vawotCWZ1bmN0aW9uIGZvciBldmVyeSBsaXZlIGVudHJ5IGluIHRoZSB0YWJsZS4KLQotMTk5OS0xMC0xOSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKElOVEJVRl9TSVpFKTogTmV3IG1hY3JvLgotCShzdHJpbmdfYXBwZW5kX3RlbXBsYXRlX2lkeCk6IE5ldyBmdW5jdGlvbi4KLQkoZGVtYW5nbGVfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCShkZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSk6IFVzZSBpdC4KLQkoZGVtYW5nbGVfcmVhbF92YWx1ZSk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IGZyb20gLi4uCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiAuLi4gaGVyZS4gIFVzZQotCXN0cmluZ19hcHBlbmRfdGVtcGxhdGVfaWR4LiAgVXNlIGRlbWFuZ2xlX3JlYWxfdmFsdWUuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlKTogVXNlIHN0cmluZ19hcHBlbmRfdGVtcGxhdGVfaWR4LgotCShkZW1hbmdsZV9xdWFsaWZpZWQpOiBVc2UgY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzLgotCShnZXRfY291bnQpOiBUd2VhayBmb3JtYXR0aW5nLgotCShkb190eXBlKTogVXNlIHN0cmluZ19hcHBlbmRfdGVtcGxhdGVfaWR4LgotCi0xOTk5LTEwLTE4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNhbGxvYy5jOiBBZGQgYSBwdWJsaWMgZG9tYWluIG5vdGljZS4KLQotTW9uIE9jdCAxOCAwMjozMDo0NyAxOTk5ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogc2V0ZW52LmMgKHN5cy90eXBlcy5oLCBzdGRpby5oKTogSW5jbHVkZSB0aG9zZSBmaWxlcyB1bmNvbmRpdGlvbmFseS4KLQotRnJpIE9jdCAxNSAwMTo0Nzo1MSAxOTk5ICBWbGFkaW1pciBNYWthcm92ICA8dm1ha2Fyb3ZAbG9vbnkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBoYXNodGFiLmMKLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIGhhc2h0YWIubwotCShoYXNodGFiLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogaGFzaHRhYi5jOiBOZXcgZmlsZQotCi1XZWQgT2N0IDEzIDAxOjE2OjQ3IDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBiYXNlbmFtZS5jIChESVJfU0VQQVJBVE9SKTogTmV3IG1hY3JvLgotCShESVJfU0VQQVJBVE9SXzIpOiBMaWtld2lzZS4KLQkoSEFWRV9ET1NfQkFTRURfRklMRVNZU1RFTSk6IExpa2V3aXNlLgotCShJU19ESVJfU0VQQVJBVE9SKTogTGlrZXdpc2UuCi0JKG1haW4pOiBIYW5kbGUgTVNET1Mgc3R5bGUgcGF0aG5hbWUuCi0KLTE5OTktMTAtMTEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogSGFuZGxlIHBvaW50ZXIgdG8gbWVtYmVyIHR5cGVzIHdob3NlCi0JZW5jbG9zaW5nIGNsYXNzZXMgaGF2ZSBuYW1lc3BhY2Ugc2NvcGUuCi0KLVN1biBPY3QgMTAgMDE6MjM6NTAgMTk5OSAgTWFyYyBFc3BpZSA8ZXNwaWVAY3ZzLm9wZW5ic2Qub3JnPgotCi0JKiBjb25maWcudGFibGU6ICBQcm92aWRlIGEgYmFja3VwIHNoZWxsIGZvciBleGVjdXRpbmcgbW92ZS1pZi1jaGFuZ2UuCi0KLTE5OTktMTAtMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHhtYWxsb2MuYyAoeG1hbGxvYyk6IEZpeCBzcGVsbGluZyBlcnJvci4KLQkoeGNhbGxvYywgeHJlYWxsb2MpOiBMaWtld2lzZS4KLQotMTk5OS0xMC0wMiAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAoZmFuY3lfYWJvcnQsIGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlLAotCWRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSwgcmVjdXJzaXZlbHlfZGVtYW5nbGUsCi0Jc3RhbmRhcmRfc3ltYm9sX2NoYXJhY3RlcnMsIGhwX3N5bWJvbF9jaGFyYWN0ZXJzLCBtYWluKTogQWRkIHByb3RvdHlwZS4KLQkocHJvZ3JhbV9uYW1lLCBwcm9ncmFtX3ZlcnNpb24sIGZhdGFsKTogQ29uc3RpZnkgYSBjaGFyKi4KLQkodXNhZ2UsIGZhdGFsKTogTWFyayB3aXRoIEFUVFJJQlVURV9OT1JFVFVSTi4KLQkobWFpbik6IENhbGwgcmV0dXJuLCBub3QgZXhpdC4KLQotMTk5OS0wOS0yNSAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjaG9vc2UtdGVtcC5jOiBSZW1vdmUgb2Jzb2xldGUgY29tbWVudCBhYm91dCBnY2MuCi0JKG1ha2VfdGVtcF9maWxlKTogQ29uc3RpZnkgYSBjaGFyKi4KLQotV2VkIFNlcCAgOCAyMDowMzoyOCAxOTk5ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIHhtZW1kdXAuYzogSW5jbHVkZSBzeXMvdHlwZXMuaC4KLQotMTk5OS0wOS0wNyAgSmVmZiBHYXJ6aWsgIDxqZ2FyemlrQHBvYm94LmNvbT4KLQotCSogeG1lbWR1cC5jOiBOZXcgeG1lbWR1cCBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluLCBtYWtlZmlsZS52bXMsIHZtc2J1aWxkLmNvbTogIFVzZSB4bWVtZHVwLltjb10uCi0KLVR1ZSBTZXAgIDcgMjM6MzI6MTggMTk5OSAgTGluYXMgVmVwc3RhcyAgPGxpbmFzQGxpbmFzLm9yZz4KLQotCSogY29uZmlnLnRhYmxlOiBBZGQgb3BlbmVkaXRpb24gdGFyZ2V0LgotCSogY29uZmlnL21oLW9wZW5lZGl0aW9uOiBOZXcgZmlsZS4KLQotVGh1IFNlcCAgMiAwMTozNjoxMiAxOTk5ICBNYXJjIEVzcGllIDxlc3BpZUBjdnMub3BlbmJzZC5vcmc+Ci0KLQkqIHBleGVjdXRlLmMgKHBleGVjdXRlKTogIEZpbGwgaW4gdGVtcF9iYXNlIHdoZW4gbmVlZGVkLgotCi0xOTk5LTA4LTMxICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnZXRwd2QuYzogQ2hlY2sgSEFWRV9HRVRDV0QgYmVmb3JlIGRlZmluaW5nIGl0IGF3YXkuCi0KLTE5OTktMDgtMzAgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBjYWxsb2MuYyBhbmQgZ2V0cHdkLmMuCi0JKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBnZXRwd2Quby4KLQkoZ2V0cHdkLm8pOiBBZGQgdGFyZ2V0LgotCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IEJ1bXAgdG8gMi4xMy4KLQkoQUNfQ0hFQ0tfSEVBREVSUyk6IEFkZCBjaGVjayBmb3IgPHN5cy9zdGF0Lmg+LgotCi0JKiBnZXRwd2QuYzogTmV3IGZpbGUsIG1vdmVkIGhlcmUgZnJvbSBnY2MuCi0KLTE5OTktMDgtMjUgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogQ2FzdCBhIGBzaXplX3QnIHRvIGBsb25nJyB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3QgYSBzaWduZWQgcXVhbnRpdHkuCi0JKGFybV9zcGVjaWFsKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IExpa2V3aXNlLgotCShkb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSk6IE1hcmsgcGFyYW1ldGVyIGB3b3JrJyB3aXRoCi0JQVRUUklCVVRFX1VOVVNFRC4KLQkobWFpbik6IENvbnN0aWZ5IHZhcmlhYmxlIGB2YWxpZF9zeW1ib2xzJy4KLQotVHVlIEF1ZyAyNCAwMjo1MDo0NSAxOTk5ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogc3RydG91bC5jIChzdHJ0b3VsKTogQWRkIHBhcmVudGhlc2VzIGFyb3VuZCAmJiB3aXRoaW4gfHwuCi0KLUZyaSBBdWcgIDYgMjM6MzI6MjkgMTk5OSAgRGFuaWVsIEphY29ib3dpdHogPGRyb3dAZHJvdy50aGVtLm9yZz4KLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBJbmNsdWRlIHByZWZpeCwgZXhlY19wcmVmaXgsCi0JbGliZGlyLCBsaWJzdWJkaXIgYW5kIHRvb2xkaXIuCi0KLTE5OTktMDgtMDEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuYyAoc3BsYXlfdHJlZV9pbnNlcnQpOiBSZXR1cm4gdGhlIG5ldyBub2RlLgotCi0xOTk5LTA3LTE0ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcmd2LmM6IEluY2x1ZGUgc3RkbGliLmggYW5kIHN0cmluZy5oIGluc3RlYWQgb2YKLQlwcm90b3R5cGluZyBkaXJlY3RseS4KLQkqIGNob29zZS10ZW1wLmM6IENvbmRpdGlvbmFsbHkgaW5jbHVkZSBzdHJpbmcuaC4KLQotMTk5OS0wNy0xMiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTkVFREVEKTogQWRkIGJjbXAsIGJjb3B5LCBiemVyby4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuYyAoc3BsYXlfdHJlZV9pbnNlcnQpOiBBZGQgaW5pdGlhbGl6YXRpb24gdG8gYXZvaWQKLQl3YXJuaW5nLgotCi0xOTk5LTA3LTA3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChuZWVkZWQtbGlzdCk6IE9ubHkgaW5jbHVkZSBzdHVmZiB3ZSBhY3R1YWxseSBuZWVkCi0JZm9yIGxpYnN0ZGMrKy4KLQotMTk5OS0wNi0yMSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaW4gKGNoZWNrZnVuY3MpOiBBZGQgZ2V0dGltZW9mZGF5LgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gSnVuIDIxIDA1OjU2OjAxIDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKCotKi11d2luKik6IFVXSU4gaGFzIHN5c197ZXJybGlzdCxuZXJyfSBldmVuIGlmCi0JdGhlIHRlc3QgZmFpbHMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDYtMTAgIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNldGVudi5vKTogQWRkIGNvbmZpZy5oIGRlcCBmb3Igc2V0ZW52Lm8gdG8gZml4Ci0JcGFyYWxsZWwgYnVpbGRzLgotCi0xOTk5LTA1LTI4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIHB1dGVudi5jOiBJbmNsdWRlIGFuc2lkZWNsLmggdG8gZGVmaW5lIGBjb25zdCcuCi0JKiBzZXRlbnYuYzogTGlrZXdpc2UuCi0KLVdlZCBNYXkgMjYgMDM6NTg6MjAgMTk5OSAgIk1lbGlzc2EgTydOZWlsbCIgPG9uZWlsbEBjcy5zZnUuY2E+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgcHV0ZW52LmMgYW5kIHNldGVudi5jLgotCSogY29uZmlndXJlLmluIChmdW5jcyk6IEFkZCBwdXRlbnYgYW5kIHNldGVudi4KLQkoQUNfQ0hFQ0tfRlVOQ1MpOiBDaGVjayBmb3IgcHV0ZW52IGFuZCBzZXRlbnYuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JKiBwdXRlbnYuYyBzZXRlbnYuYzogTmV3IGZpbGVzLgotCi0JKiBnZXRjd2QuYyAoZ2V0Y3dkKTogSWYgcGF0aG5hbWUgaXMgTlVMTCwgdGhlbiBvYnRhaW4gU0laRQotCWJ5dGVzIG9mIHNwYWNlIHVzaW5nIG1hbGxvYy4KLQotTW9uIE1heSAxNyAwMTo0MjozNCAxOTk5ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiYWJ5bG9uLTUuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSAobmVhciAnSScgY2FzZSkpOiBEb24ndCBhZHZhbmNlCi0JdGhlICptYW5nbGVkIHBvaW50ZXIgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gIENsZWFuIHVwIGNvZGUgdG8KLQltYXRjaCBwcmV2YWlsaW5nIGNvZGluZyBzdHlsZS4KLQotMTk5OS0wNS0xMyAgTWljaGFlbCBIYXllcyAgPG0uaGF5ZXNAZWxlYy5jYW50ZXJidXJ5LmFjLm56PgotCi0JKiB0bXBuYW0uYyAoTF90bXBuYW0pOiBGaXggdHlwby4KLQotVGh1IE1heSAxMyAwMToxNDo0NiAxOTk5IE1hcmMgRXNwaWUgPGVzcGllQGN2cy5vcGVuYnNkLm9yZz4KLQotCSogY3BsdXMtZGVtLmMgKHN0YW5kYXJkX3N5bWJvbF9jaGFyYWN0ZXJzKTogUmVuYW1lZCBmcm9tCi0Jc3RhbmRhcmRfc3ltYm9sX2FscGhhYmV0LiAgTm8gbG9uZ2VyIG1vZGlmeSBUQUJMRS4KLQkoaHBfc3ltYm9sX2NoYXJhY3RlcnMpOiBSZW5hbWVkIGZyb20gaHBfc3ltYm9sX2FscGhhYmV0LiAgTm8gbG9uZ2VyCi0JbW9kaWZ5IFRBQkxFLgotCShtYWluKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLiAgVXNlIHN0cmNociB0byBkZXRlcm1pbmUgaWYgYQotCWNoYXJhY3RlciBpcyB2YWxpZC4KLQotMTk5OS0wNS0xMSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAobWFpbik6IFVzZSB0YWJsZSBsb29rdXAgdG8gZGlzdGluZ3Vpc2ggaWRlbnRpZmllcgotCWNoYXJhY3RlcnMgZnJvbSBub24taWRlbnRpZmllciBjaGFyYWN0ZXJzLgotCShzdGFuZGFyZF9zeW1ib2xfYWxwaGFiZXQsIGhwX3N5bWJvbF9hbHBoYWJldCk6IE5ldyBmdW5jdGlvbnMuCi0KLVRodSBNYXkgIDYgMjA6MzQ6NDIgMTk5OSAgRnJlZCBGaXNoICA8Zm5mQGJlLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzeXMvcmVzb3VyY2UuaCk6IEFkZCB0byBBQ19DSEVDS19IRUFERVJTIGxpc3QuCi0JKiBnZXRydW50aW1lLmM6IE9ubHkgYXR0ZW1wdCB0byBpbmNsdWRlIHN5cy9yZXNvdXJjZS5oIGFuZAotCXVzZSBnZXRydXNhZ2UgaWYgYm90aCBIQVZFX0dFVFJVU0FHRSBhbmQgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCWFyZSBkZWZpbmVkLgotCi1Nb24gQXByIDI2IDAxOjM2OjA2IDE5OTkgIERvbm4gVGVycnkgKGRvbm5AaW50ZXJpeC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxsb2NhIGRldGVjdGlvbik6IEhhbmRsZSBhbGxvY2EgZGlyZWN0bHkgZm9yIGludGVyaXguCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVN1biBBcHIgMjUgMDE6MTg6MjEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNob29zZS10ZW1wLmMgKERJUl9TRVBBUkFUT1IpOiBVc2UgJ1xcJyBvbmx5IGZvciBuYXRpdmUgd2luZG93czMyLgotCi0xOTk5LTA0LTIwICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQlGaXggZnJvbSBEYWxlIEhhd2tpbnM6Ci0JKiBjcGx1cy1kZW0uYyAobW9wX3VwKTogU2V0IHR5cGV2ZWNfc2l6ZSB0byB6ZXJvLCBzbyBpdCdsbCBiZQotCXJlYWxsb2NhdGVkIHByb3Blcmx5IGlmIHdlIHVzZSBpdCBhZ2Fpbi4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IENoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bi4gIEJlCi0Jc3RyaWN0ZXIgYWJvdXQgc3ludGF4LiAgQWx3YXlzIG51bGwtdGVybWluYXRlIHN0cmluZy4KLQotVGh1IEFwciAxNSAyMzowMDo1NSAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlndXJlLmluIChjaGVja2Z1bmNzKTogQ2hlY2sgZm9yIHNicmsuCi0JKiBjb25maWcuaW46IFJlYnVpbHQuCi0JKiBjb25maWd1cmU6IExpa2V3aXNlLgotCSogeG1hbGxvYy5jOiBVc2UgSEFWRV9TQlJLIGluc3RlYWQgb2YgdGhlIGhvc3Qgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCi0KLTE5OTktMDQtMTIgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCUZpeCBmcm9tIE1hcmN1cyBEYW5pZWxzOgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IERvbid0IHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUKLQlpZGVudGlmaWVyIGxvb2tpbmcgZm9yIGFub3RoZXIgdW5kZXJzY29yZS4KLQotU3VuIEFwciAxMSAyMzoyMDo1OSAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogcGV4ZWN1dGUuYzogQ2hhbmdlIGFsbCByZWZlcmVuY2VzIHRvIF9fVVdJTl9fIHRvIF9VV0lOLgotCSogeG1hbGxvYy5jOiBMaWtld2lzZS4KLQkoeGNhbGxvYyk6IFVXSU4gaGFzIHNicmsuCi0JKHhyZWFsbG9jKTogRml4IGd1YXJkIG1hY3JvLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbGxvY2EtY29uZi5oIChhbGxvY2EpIFtDX0FMTE9DQV06IERvbid0IHVzZSBHY2MgYnVpbHRpbgotCW9yIDxhbGxvY2EuaD4uCi0JKiBjbG9jay5jIChHTlVfSFopOiBOZXcgZGVmaW5pdGlvbi4KLQkoY2xvY2spOiBVc2UgaXQuCi0JKiBnZXRydW50aW1lLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcudGFibGU6IFVzZSBtaC1iZW9zLgotCSogY29uZmlnL21oLWJlb3M6IE5ldyBmaWxlLgotCi0xOTk5LTA0LTExICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IEhhbmRsZQotCXBvaW50ZXJzLXRvLW1lbWJlcnMuCi0JKGRvX3R5cGUpOiBIYW5kbGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcyBxdWFsaWZpZXJzLgotCi0xOTk5LTA0LTAxICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBBdHRlbXB0IHRvIGhhbmRsZSBvdmVyZmxvd3MgaW4gY291bnRzIHdpdGggc29tZQotCXNlbWJsYW5jZSBvZiBncmFjZS4KLQkoY29uc3VtZV9jb3VudCk6IERldGVjdCBvdmVyZmxvd3MuICBSZXR1cm4gLTEgdG8gaW5kaWNhdGUgZXJyb3JzLAotCWluc3RlYWQgb2YgemVyby4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSwgZGVtYW5nbGVfdGVtcGxhdGUpOiBIYW5kbGUgY2hhbmdlCi0JdG8gY29uc3VtZV9jb3VudCdzIHJldHVybiBjb252ZW50aW9uLgotCi0xOTk5LTA0LTA1ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHRlc3RzdWl0ZS9yZWdyZXNzLWRlbWFuZ2xlOiBOZXcgZmlsZS4KLQkqIHRlc3RzdWl0ZS9kZW1hbmdsZS1leHBlY3RlZDogTmV3IGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluIChhbGwsIGNoZWNrLCBpbnN0YWxsY2hlY2ssIGluZm8sIGluc3RhbGwtaW5mbywKLQljbGVhbi1pbmZvLCBkdmksIGluc3RhbGwsIGV0YWdzLCB0YWdzLCBtb3N0bHljbGVhbiwgY2xlYW4sCi0JZGlzdGNsZWFuLCBtYWludGFpbmVyLWNsZWFuLCByZWFsY2xlYW4pOiBEZXBlbmQgb24gY29ycmVzcG9uZGluZwotCWAtc3ViZGlyJyB0YXJnZXQuCi0JKGFsbC1zdWJkaXIgY2hlY2stc3ViZGlyIGluc3RhbGxjaGVjay1zdWJkaXIgaW5mby1zdWJkaXIKLQlpbnN0YWxsLWluZm8tc3ViZGlyIGNsZWFuLWluZm8tc3ViZGlyIGR2aS1zdWJkaXIKLQlpbnN0YWxsLWluZm8tc3ViZGlyIGV0YWdzLXN1YmRpciBtb3N0bHljbGVhbi1zdWJkaXIgY2xlYW4tc3ViZGlyCi0JZGlzdGNsZWFuLXN1YmRpciBtYWludGFpbmVyLWNsZWFuLXN1YmRpcik6IE5ldyB0YXJnZXQuCi0JKiB0ZXN0c3VpdGUvTWFrZWZpbGUuaW46IE5ldyBmaWxlLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCSogY29uZmlndXJlLmluOiBDcmVhdGUgdGVzdHN1aXRlL01ha2VmaWxlLgotCi0xOTk5LTA0LTAyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmggKHNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyk6IERlZmluZS4KLQotMTk5OS0wMy0zMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogc3BsYXktdHJlZS5jIChzcGxheV90cmVlX2NvbXBhcmVfaW50cyk6IERlZmluZS4KLQotMTk5OS0wMy0zMCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoY29uc3VtZV9jb3VudCk6IElmIGBjb3VudCcgd3JhcHMsIHJldHVybiAwIGFuZAotCWRvbid0IGFkdmFuY2UgaW5wdXQgcG9pbnRlci4KLQkoZGVtYW5nbGVfY2xhc3NfbmFtZSk6IElmIGNvbnN1bWVfY291bnQgZGlkbid0IGZpbmQgYSBjb3VudCwgZG8KLQlub3RoaW5nLiAgRG9uJ3QgYm90aGVyIHdpdGggYHN0cmxlbicgc2FuaXR5IGNoZWNrOyBjb25zdW1lX2NvdW50Ci0JZG9lcyBpdCBmb3IgdXMuCi0KLTE5OTktMDMtMTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCUZyb20gQXJ0IEhhYXMgIDxhaGFhc0BuZW9zb2Z0LmNvbT46Ci0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogRG9uJ3QgZ3JhYiBhbGwgdGhlICdfXycgc3RyaW5ncwotCXdoZW4gZG9pbmcgYXJtIG9yIGhwIHN0eWxlLgotCShkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IERlY3IgZm9yZ2V0dGluZ190eXBlcyBmaWVsZCB3aGVuIGRvbmUuCi0KLVRodSBNYXIgMTEgMDE6MjI6NTggMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIHBleGVjdXRlLmMgKF9fQ1lHV0lOMzJfXyk6IFJlbmFtZSB0bwotCShfX0NZR1dJTl9fKTogdGhpcy4KLQkqIHhtYWxsb2MuYzogTGlrZXdpc2UuCi0KLQlDaGFuZ2VzIHRvIHN1cHBvcnQgaTM4Ni1wYy11d2luLgotCSogY29uZmlndXJlLmluICgqLSotdXdpbiopOiBXb3JrYXJvdW5kIGZvciB2Zm9yayBidWcuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBwZXhlY3V0ZS5jIChwZXhlY3V0ZSk6IEJlIGxpa2Ugc3RhbmRhcmQgVW5peC4KLQkocHdhaXQpOiBMaWtld2lzZS4KLQkqIHhtYWxsb2MuYyAoZmlyc3RfYnJlYWspOiBEZWZpbmUuCi0JKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IFVzZS4KLQkoeG1hbGxvYyk6IFVzZS4KLQotVGh1IE1hciAxMSAwMTowNzo1NSAxOTk5ICBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBDbGVhbnVwIGFuZCBhZGQgbWgtKnBpYyBoYW5kbGluZyBmb3IgYWxwaGEsIGFybSwgcG93ZXJwYwotCi1TdW4gRmViIDI4IDIyOjMwOjQ0IDE5OTkgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogQ2hlY2sgY3lnd2luKiwgbm90IGN5Z3dpbjMyKi4KLQotVHVlIEZlYiAgOSAxNjozOTowMSAxOTk5ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgbWtzdGVtcCAtPiBta3N0ZW1wcy4KLQotVHVlIEZlYiAgOSAwMToxMjoyNyAxOTk5ICBNYXJjIEVzcGllIDxNYXJjLkVzcGllQGxpYWZhLmp1c3NpZXUuZnI+Ci0KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiByZW1vdmUgbWtzdGVtcC5vCi0JKiBjb25maWd1cmUuaW4gKGZ1bmNzKTogQ2hlY2sgZm9yIGFuZCBjb25kaXRpb25hbGx5IGFkZCBta3N0ZW1wcyB0bwotCXRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBsaWJpYmVydHkgd2lsbCBwcm92aWRlLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1XZWQgRmViICAzIDAwOjAxOjE1IDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjbG9jay5jIChIWik6IERlZmluZSBpbiB0ZXJtcyBvZiAoSVNPIEMpIENMT0NLU19QRVJfU0VDIG9uCi0JcGxhdGZvcm1zIHRoYXQgZG9uJ3QgaGF2ZSBIWi4KLQkqIGdldHJ1bnRpbWUuYyAoSFopOiBMaWtld2lzZS4KLQotU2F0IEphbiAzMCAxMzoyODowNCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoeHN0cmR1cC5vKTogRGVwZW5kIG9uIGNvbmZpZy5oLgotCi1XZWQgSmFuIDEzIDA3OjI2OjQ0IDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogY3BsdXMtZGVtLmMgKG1vcF91cCk6IFNldCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCB0byBOVUxMIGFmdGVyCi0JZnJlZWluZyBpdC4KLQotV2VkIEphbiAxMyAxNDoxNjozNiAxOTk5ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIHhzdHJkdXAuYyAoeHN0cmR1cCk6IFN3aXRjaCBmcm9tIHN0cmNweSB0byBtZW1jcHkgZm9yIHNwZWVkLgotCi1UdWUgSmFuICA1IDE1OjU4OjI5IDE5OTkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IGZpeCB0eXBvLCBzcGxheS10cmVlLmMgaW5zdGVhZCBvZgotCXNwbGF5LXRyZWUuby4KLQotMTk5OS0wMS0wNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMi4xIG9yIGhpZ2hlci4KLQotMTk5OC0xMi0zMCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHJhbmRvbS5jIChOVUxMKTogRG9uJ3QgcmVkZWZpbmUgTlVMTCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLVR1ZSBEZWMgMjIgMDk6NDM6MzUgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBhcmd2LmMgKGJ1aWxkYXJndik6IENhc3QgdGhlIHJlc3VsdCBvZiBhbGxvY2EgaW4gYXNzaWdubWVudC4KLQotCSogY2hvb3NlLXRlbXAuYzogSW5jbHVkZSBzdGRsaWIuaC4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IFJlbW92ZSB1bnVzZWQgcHJvdG90eXBlLgotICAJKHNuYXJmX251bWVyaWNfbGl0ZXJhbCk6IENvbnN0aWZ5IGZpcnN0IHBhcmFtZXRlci4KLSAgCShjb2RlX2Zvcl9xdWFsaWZpZXIpOiBBdm9pZCBhIGdjYyBleHRlbnNpb24sIG1ha2UgdGhlIHBhcmFtZXRlciBhbgotIAlpbnQsIG5vdCBhIGNoYXIuCi0JKGRlbWFuZ2xlX3F1YWxpZmllcik6IExpa2V3aXNlLgotCShkZW1hbmdsZV9zaWduYXR1cmUpOiBDYXN0IHRoZSBhcmd1bWVudCBvZiBhIGN0eXBlIGZ1bmN0aW9uIHRvCi0JdW5zaWduZWQgY2hhci4KLQkoYXJtX3B0KTogQWRkIHBhcmVucyBhcm91bmQgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlLgotCShkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUpOiBDb25zdGlmeSB2YXJpYWJsZSBgYXJncycuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlKTogQ2FzdCB0aGUgYXJndW1lbnQgb2YgYSBjdHlwZQotCWZ1bmN0aW9uIHRvIHVuc2lnbmVkIGNoYXIuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBpJy4KLQkoc25hcmZfbnVtZXJpY19saXRlcmFsKTogQ29uc3RpZnkgcGFyYW1ldGVyIGBhcmdzJy4KLQlDYXN0IHRoZSBhcmd1bWVudCBvZiBhIGN0eXBlIGZ1bmN0aW9uIHRvIHVuc2lnbmVkIGNoYXIuCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSk6IEFkZCBleHBsaWNpdCBicmFjZXMgdG8KLSAJYXZvaWQgYW1iaWd1b3VzIGBlbHNlJy4KLQotCSogZm5tYXRjaC5jIChmbm1hdGNoKTogQ2hhbmdlIHR5cGUgb2YgdmFyaWFibGVzIGBjJywgYGMxJywKLSAJYGNzdGFydCcgYW5kIGBjZW5kJyB0byB1bnNpZ25lZCBjaGFyLiAgQ2FzdCB0aGUgYXJndW1lbnQgb2YgbWFjcm8KLSAJYEZPTEQnLCB3aGljaCB1c2VzIGN0eXBlIGZ1bmN0aW9ucywgdG8gdW5zaWduZWQgY2hhci4KLQotCSogb2JqYWxsb2MuYyAoZnJlZSk6IEFkZCBwcm90b3R5cGUuCi0KLVN1biBEZWMgMjAgMTY6MDM6NDYgMTk5OCAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYXhpcy5zZT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEZpeCB0eXBvOiBzcGxheS10cmVlLmMsIG5vdCBzcGxheS10cmVlLm8KLQotRnJpIERlYyAxOCAxNzo1MDoxOCAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IHJlbW92ZSBkZWNsYXJhdGlvbiAtLSBmdW5jdGlvbgotIAlkb2Vzbid0IGV4aXN0LgotCShkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsKTogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgaScuCi0KLUZyaSBEZWMgMTggMTY6MTE6NDMgRVNUIDE5OTggIEFuZHJldyBNYWNMZW9kICA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IFByb2Nlc3MgQ1YgYW5kIHUgY29kZXMgYmVmb3JlCi0JYnVtcGluZyB0aGUgcG9pbnRlciB3ZSByZWFkIGZyb20uIEFsc28gcHJlcGVuZCB0aGVzZSBjb2RlcywKLQlhcyB3ZSBkbyBpbiBvdGhlciBwbGFjZXMuCi0KLTE5OTgtMTItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUpOiBNYWtlIHZhcmlhYmxlICdhcmdzJyBiZQotCSdjb25zdCBjaGFyIConIGluIG9yZGVyIHRvIG1hdGNoIGl0cyB1c2FnZSB3aGVuIGNhbGxpbmcgc2libGluZ3MuCi0JKHNuYXJmX251bWVyaWNfbGl0ZXJhbCk6IE1ha2UgZmlyc3QgYXJnICdjb25zdCBjaGFyICoqJyBpbiBvcmRlcgotCXRvIG1hdGNoIHVzYWdlLgotCi1Nb24gRGVjIDE0IDA5OjU1OjUwIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY2hvb3NlLXRlbXAuYzogRG9uJ3QgY2hlY2sgSU5fR0NDIGFueW1vcmUuCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlKTogVXNlIGBjb25zdCcsIG5vdCBgQ09OU1QnLgotCSogbWVtY2hyLmMgKG1lbWNocik6IExpa2V3aXNlLgotCSogbWVtY3B5LmMgKG1lbWNweSk6IExpa2V3aXNlLgotCSogbWVtbW92ZS5jIChtZW1tb3ZlKTogTGlrZXdpc2UuCi0KLQkqIG1rc3RlbXAuYzogRG9uJ3QgY2hlY2sgSU5fR0NDIGFueW1vcmUuCi0JKiBwZXhlY3V0ZS5jOiBMaWtld2lzZS4KLQkqIHNwbGF5LXRyZWUuYzogTGlrZXdpc2UuCi0KLQkqIHN0cmNoci5jIChzdHJjaHIpOiBVc2UgYGNvbnN0Jywgbm90IGBDT05TVCcuCi0JKiBzdHJyY2hyLmMgKHN0cnJjaHIpOiBMaWtld2lzZS4KLQkqIHN0cnRvbC5jIChzdHJ0b2wpOiBMaWtld2lzZS4KLQkqIHN0cnRvdWwuYyAoc3RydG91bCk6IExpa2V3aXNlLgotCi1GcmkgRGVjICA0IDEzOjUxOjA0IDE5OTggIERhdmlkIFRheWxvciAgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQkJCSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGN5Z251cy5jb20+Ci0JCQkgIFN0YW4gU2hlYnMgICAgIDxzaGVic0BjeWdudXMuY29tPgotCQkJICBFZGl0aCBFcHN0ZWluICA8ZWVwc3RlaW5AY3lnbnVzLmNvbT4KLQkJCSAgQW5kcmVzIE1hY0xlb2QgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0JCQkgIFNhdGlzaCBQYWkJIDxwYWlAYXBvbGxvLmhwLmNvbT4KLQotCSogSFAgYUNDIGRlbWFuZ2xpbmcgc3VwcG9ydC4KLQkqIGNwbHVzLWRlbS5jCi0JKG1haW4pOiBSZW1vdmUgZGVmYXVsdCB0byBIUCBzdHlsZSBkZW1hbmdsaW5nLCBzZXQgdG8gRURHCi0gCWRlbWFuZ2xpbmcgY29ycmVjdGx5IHdoZW4gLWVkZyBzcGVjaWZpZWQ7IHNldCB0aGUgZGVtYW5nbGluZyBzdHlsZQotIAl3aGVuIHVzZXIgc3BlY2lmaWVzICdlZGcnLiBTZXQgc3RyaXBfdW5kZXJzY29yZSB0bwotIAlwcmVwZW5kc191bmRlcnNjb3JlLCBpZiBub3QgSFBVWEhQUEEuICBTZXQKLSAJY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlIHRvIGhwX2RlbWFuZ2xpbmcgaWYgSFBVWEhQUEEuICBTZXQKLSAJY3VycmVudCBkZW1hbmdsaW5nIHN0eWxlIGNvcnJlY3RseSBpZiB0aGUgc3dpdGNoIGlzIGhwLiAgUmVhZAotIAlsYWJlbCBjb3JyZWN0bHkgYWxzbyBpbiB0aGUgSFAgc3R5bGUgY2FzZS4KLQkod29ya19zdHVmZik6IGFkZCB0ZW1wX3N0YXJ0IGZpZWxkOyBhZGQgZmllbGQgZm9yIHZvbGF0aWxlIG1lbWJlcgotIAlmdW5jdGlvbi4KLQkoYXJtX3B0KTogaGFuZGxlIEFSTV9ERU1BTkdMSU5HIGFuZCBFREdfREVNQU5HTElORyBzdHlsZXM7IEhQCi0gCXN0eWxlIGZvciB0aGlzIGNhc2UgaXMgdGhlIHNhbWUgYXMgQVJNLgotCShkZW1hbmdsZV9hcmdzKTogaGFuZGxlIEVER19ERU1BTkdMSU5HIHN0eWxlOyBzdXBwb3J0IEhQIHN0eWxlLgotCShkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUpOiBuZXcgZnVuY3Rpb24uIChJdCB3YXMKLSAJZGVtYW5nbGVfYXJtX3B0Lik7IGNoZWNrIGFuZCBzZXQgdmFsdWUgb2YgdGVtcF9zdGFydCBmaWVsZCBpbgotIAltdWx0aXBsZSBwbGFjZXMuIEFsc28sIHdoZW4gY2VjaGluZyBmb3IgZW5kIG9mIHRlbXBsYXRlIGFyZ3MsCi0gCWNoZWNrIHRvIHNlZSBpZiBhdCBlbmQgb2Ygc3RhdGljIG1lbWJlciBvZiB0ZW1wbGF0ZSBjbGFzcy4KLQkoZGVtYW5nbGVfY2xhc3MpOiBuZXcgbG9jYWwgdmFyaWFibGUgOiBzYXZlX2NsYXNzX25hbWVfZW5kIERvbid0Ci0gCWluY2x1ZGUgdGVtcGxhdGUgYXJncyBpbiBzdHJpbmcgZGVmaW5pbmcgY2xhc3MuCi0JKGRlbWFuZ2xlX2NsYXNzX25hbWUpOiB1c2UgZGVtYW5nZWxfYXJtX2hwX3RlbXBsYXRlLgotCShkZW1hbmdsZV9mdW5jdGlvbl9uYW1lKTogaGFuZGxlIGNhc2Ugd2hlcmUgZGVtYW5nbGluZyBzdHlsZSBpcwotIAlIUF9ERU1BTkdMSU5HIGFuZCBjdXJyZW50bHkgcG9pbnQgYXQgYW4gJ1gnIGluIHRoZSBtYW5nbGVkIG5hbWUuCi0gIAlIYW5kbGUgRURHX0RFTUFOR0xJTkcgc3R5bGUuICBIYW5kbGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IKLSAJb3BzIGZvciBIUCBzdHlsZS4KLQkoZGVtYW5nbGVfcHJlZml4KTogaGFuZGxlIEVER19ERU1BTkdMSU5HIGFuZCBBUk1fREVNQU5HTElORwotIAlzdHlsZXMuICBnbG9iYWwgZGVzdHJ1Y3RvciBhbmQgY29uc3RydWN0b3IgZm9yIEhQIHN0eWxlIGFyZSBzYW1lCi0gCWFzIGZvciBBUk0gc3R5bGUuIFNhbWUgZm9yIGxvY2FsIHZhcmlhYmxlcy4KLQkoZGVtYW5nbGVfcXVhbGlmaWVkKTogaGFuZGxlIEVER19ERU1BTkdMSU5HIHN0eWxlLgotCShkZW1hbmdsZV9zaWduYXR1cmUpOiBhZGQgY2FzZSBmb3Igdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uLiAgRm9yCi0gCWNhc2VzICcxJyAtICc5JyA6IGluaXRpYWxpemUgdGhlIHRlbXBfc3RhcnQgZmllbGQgdG8gLTEgYW5kIGhhbmRsZQotIAl0aGUgRURHX0RFTUFOR0xJTkcgc3R5bGUuICBmb3IgY2FzZSAnRicgOiBoYW5kbGUgRURHX0RFTUFOR0xJTkcKLSAJYW5kIEFVVE9fREVNQU5HTElORyBzdHlsZXMuICBJZiBleHBlY3RpbmcgYSBmdW5jdGlvbiBhbmQgbWFuYWdlZAotIAl0byBkZW1hbmdsZSB0aGUgZnVuY3QgYXJncywgdGhlbiBoYW5kbGUgdGhlIExVQ0lEX0RFTUFOR0xJTkcsCi0gCUFSTV9ERU1BTkdMSU5HLCBhbmQgRURHX0RFTUFOR0xJTkcgc3R5bGVzLiAgQWRkIGNhc2UgZm9yIGxvY2FsCi0gCWNsYXNzIG5hbWUgYWZ0ZXIgIkxubm5fIGluIEhQIHN0eWxlIGNhc2UuIEhQIHN0eWxlIHRvbyBuZWVkcyB0bwotIAlmb3JnZXQgdHlwZXMuICBfbm5uIGlzIE9LIGZvciBIUCBzdHlsZSwgc28gZG9uJ3QgcmVwb3J0IGZhaWx1cmUuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlKTogbmV3IGZ1bmN0aW9uLiBIYW5kbGUgdGVtcGxhdGUncwotIAl2YWx1ZSBwYXJhbSBmb3IgSFAvYUNDLgotCShkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsKTogbmV3IGZ1bmN0aW9uLiAgSGFuZGxlIGEgdGVtcGxhdGUncwotIAlsaXRlcmFsIHBhcmFtZXRlciBmb3IgSFAgYUNDLgotCShyZWN1cnNpdmVseV9kZW1hbmdsZSk6IG5ldyBmdW5jdGlvbgotCShzbmFyZl9udW1lcmljX2xpdGVyYWwpOiBuZXcgZnVuY3Rpb24uCi0JKHVzYWdlKTogYWRkICdlZGcnIHRvIHRoZSBsaXN0IG9mIGRlbWFuZ2xpbmcgc3R5bGVzOyBhZGQgaHAgc3dpdGNoCi0gCXRvIG1lc3NhZ2UuCi0KLVNhdCBOb3YgMjggMTc6MjU6MjIgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogUmVtb3ZlIG9ic29sZXRlIGlmZGVmZWQgY3lnd2luIGNvZGUuCi0KLUZyaSBOb3YgMjcgMTM6MjY6MDYgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjaG9vc2UtdGVtcC5jOiBBbHdheXMgaW5jbHVkZSBsaWJpYmVydHkuaC4gIEF2b2lkIHJlZHVuZGFuY2llcy4KLQkqIGNwbHVzLWRlbS5jOiBMaWtld2lzZS4gIENvbmZvcm0gdG8gbGliaWJlcnR5LmguCi0JKiBwZXhlY3V0ZS5jOiBMaWtld2lzZS4KLQkqIHNwbGF5LXRyZWUuYzogTGlrZXdpc2UuCi0KLTE5OTgtMTEtMjUgIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNwbGF5LXRyZWUubyk6IEFkZCBjb25maWcuaCBkZXBlbmRlbmN5LgotCi1Nb24gTm92IDIzIDE2OjU5OjQ5IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogIGNvbmZpZ3VyZS5pbjogVXNlIEFDX1BSRVJFUSgyLjEyLjEpLgotCi0xOTk4LTExLTE2ICBCZW5qYW1pbiBLb3NuaWsgIDxia296QGhhaWdodC5jb25zdGFudC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBBZGQgZGVtYW5nbGluZyBmb3IgQzl4IHR5cGVzLgotCi1UaHUgTm92IDE5IDIyOjE1OjUwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbXB3LmMgKG1wd19hY2Nlc3MpOiBBZGQgbWlzc2luZyBwYXJlbnMuCi0KLVRodSBOb3YgMTkgMTI6NTk6MjEgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfSEVBREVSX1NZU19XQUlULgotCi0JKiBwZXhlY3V0ZS5jOiBJbmNsdWRlIHN5cy93YWl0Lmggd2hlbiAhSU5fR0NDLgotCi1UaHUgTm92IDE5IDE0OjM4OjIwIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IHJldmVydCBiYWNrIHRvIGNoZWNraW5nIG9sZCBDeWd3aW4KLQlwcmVwcm9jZXNzb3Igc3ltYm9sIHVudGlsIHNvbWUgdGltZSBoYXMgcGFzc2VkLgotCi1XZWQgTm92IDE4IDA4OjUyOjI2IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IFJlb3JnYW5pemUgV0lOMzIgY2FzZSB0byBhY2NvbW9kYXRlIEN5Z3dpbgotCXNpbmNlIGl0IHdpbGwgbm93IHN1cHBvcnQgc2ltaWxhciBjb25zdHJ1Y3RzLgotCi1GcmkgTm92IDEzIDE5OjE4OjA1IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgY2FsbG9jLgotCi0JKiBjYWxsb2MuYzogTmV3CWZpbGUuCi0KLQkqIHhtYWxsb2MuYyAoeGNhbGxvYyk6IE5ldyBmdW5jdGlvbi4KLQotRnJpIE5vdiAxMyAwODo1MTo0NiBFU1QgMTk5OCAgQW5kcmV3IE1hY0xlb2QgIDxhbWFjbGVvZEBjeWdudXMuY29tPgotCi0JKmNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBVc2UgdGhlIGxhc3QgIl9fIgotCWluIHRoZSBtYW5nbGVkIG5hbWUgd2hlbiBsb29raW5nIGZvciB0aGUgc2lnbmF0dXJlLiBUaGlzIGFsbG93cwotCXRlbXBsYXRlIG5hbWVzIHRvIGJlZ2luIHdpdGggIl9fIi4KLQotMTk5OC0xMS0wOCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHR5cGVfa2luZF90KTogQWRkIHRrX3JlZmVyZW5jZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IEhhbmRsZSBpdC4KLQkoZG9fdHlwZSk6IFVzZSBpdCBmb3IgcmVmZXJlbmNlcywgaW5zdGVhZCBvZiB0a19wb2ludGVyLgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IFVzZSBjcGx1c19kZW1hbmdsZSwKLQlub3QgaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUuCi0KLVNhdCBOb3YgIDcgMTY6MDI6MTAgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjaG9vc2UtdGVtcC5jOiBEb24ndCBpbmNsdWRlIGdhbnNpZGVjbC5oLgotCSogbWtzdGVtcC5jOiBMaWtld2lzZS4KLQkqIHBleGVjdXRlLmM6IExpa2V3aXNlLgotCi1Nb24gTm92ICAyIDE1OjA1OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1Nb24gTm92ICAyIDEwOjIyOjAxIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogcGV4ZWN1dGUuYzogQ2hlY2sgSEFWRV9DT05GSUdfSCwgbm90IElOX0dDQywgd2hlbiBkZXRlcm1pbmluZwotIAl3aGV0aGVyIHRvIGluY2x1ZGUgY29uZmlnLmguICBQb3NzaWJseSBpbmNsdWRlIHVuaXN0ZC5oIGluIHRoZQotIAkhSU5fR0NDIGNhc2UuICBEZWZpbmUgVkZPUktfU1RSSU5HIGFzIGEgcHJpbnRhYmxlIGZ1bmN0aW9uIGNhbGwKLSAJZm9yIGVycm9yIG1lc3NhZ2VzIChlaXRoZXIgInZmb3JrIiBvciAiZm9yayIuKSAgSWYgSEFWRV9WRk9SS19IIGlzCi0gCWRlZmluZWQsIGluY2x1ZGUgdmZvcmsuaC4gIElmIFZNUyBpcyBkZWZpbmVkLCBkZWZpbmUgdmZvcmsoKQotIAlhcHByb3ByaWF0ZWx5LiAgUmVtb3ZlIHZmb3JrIGNoZWNrIG9uIFVTRywgd2UncmUgdXNpbmcgYXV0b2NvbmYuCi0gIAkocGV4ZWN1dGUpOiBTZXQgYGVycm1zZ19mbXQnIHRvIFZGT1JLX1NUUklORyBpbnN0ZWFkIG9mIGNoZWNraW5nCi0gCWxvY2FsbHkgd2hhdCBzdHJpbmcgdG8gdXNlLgotCi0xOTk4LTEwLTI2ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBzcGxheS10cmVlLmM6IFR3ZWFrIGluY2x1ZGUgZGlyZWN0aXZlcyB0byBtYWtlIHN1cmUgZGVjbGFyYXRpb25zIG9mCi0JeG1hbGxvYyBhbmQgZnJlZSBhcmUgYXZhaWxhYmxlLgotCi0xOTk4LTEwLTI1ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBGaXggaGFuZGxpbmcgb2YgdmlydHVhbCB0YWJsZXMgaW4KLQlhbm9ueW1vdXMgbmFtZXNwYWNlcy4KLQotMTk5OC0xMC0yMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHdvcmtfc3R1ZmYpOiBSZXBsYWNlIGNvbnN0X3R5cGUgYW5kIHZvbGF0aWxlX3R5cGUKLQl3aXRoIHR5cGVfcXVhbHMuCi0JKFRZUEVfVU5RVUFMSUZJRUQpOiBOZXcgbWFjcm8uCi0JKFRZUEVfUVVBTF9DT05TVCk6IExpa2V3aXNlLgotCShUWVBFX1FVQUxfVk9MQVRJTEUpOiBMaWtld2lzZS4KLQkoVFlQRV9RVUFMX1JFU1RSSUNUKTogTGlrZXdpc2UuCi0JKGNvZGVfZm9yX3F1YWxpZmllcik6IE5ldyBmdW5jdGlvbi4KLQkocXVhbGlmaWVyX3N0cmluZyk6IExpa2V3aXNlLgotCShkZW1hbmdsZV9xdWFsaWZpZXIpOiBMaWtld2lzZS4KLQkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUpOiBVc2UgdGhlbS4KLQkoZGVtYW5nbGVfc2lnbmF0dXJlKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBMaWtld2lzZS4KLQkoZG9fdHlwZSk6IExpa2V3aXNlLgotCShkZW1hbmdsZV9mdW5kX3R5cGUpKTogTGlrZXdpc2UuCi0KLVRodSBPY3QgMjIgMTk6NTg6NDMgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIpOiBNYWtlIGRlZmluaXRpb24gc3RhdGljCi0JdG8gbWF0Y2ggcHJvdG90eXBlLgotCi0xOTk4LTEwLTIxICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBzcGxheS10cmVlLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBpdC4KLQkoUkVRVUlSRURfT0ZJTEVTKTogTGlrZXdpc2UuCi0JKHNwbGF5LXRyZWUubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBPY3QgMjAgMTI6Mjk6MDIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkKTogRml4IG9mZi1ieS1vbmUgd2hlbiBjaGVja2luZwotCXJhbmdlIG9mICdLJyBpbmRleC4KLQotVGh1IE9jdCAxNSAxODo1MToxMiAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNob29zZS10ZW1wLmM6IFByb3RvdHlwZSBta3N0ZW1wcygpIHdoZW4gSU5fR0NDLgotCi0JKiBjcGx1cy1kZW0uYyAoY29uc3VtZV9jb3VudCk6IENhc3QgYXJndW1lbnQgb2YgY3R5cGUgbWFjcm8gdG8KLQlgdW5zaWduZWQgY2hhcicuCi0JKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgb25lLgotCShjcGx1c19tYW5nbGVfb3BuYW1lKTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlKTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0bwotCWB1bnNpZ25lZCBjaGFyJy4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IExpa2V3aXNlLgotCShkZW1hbmdsZV90ZW1wbGF0ZSk6IEluaXRpYWxpemUgdmFyaWFibGUgYGJpbmRleCcuICBDYXN0IHRoZQotCXJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG9uZS4gIFJlbW92ZQotCXVudXNlZCB2YXJpYWJsZSBgc3RhcnRfb2ZfdmFsdWVfcGFybScuCi0JKGRlbWFuZ2xlX2NsYXNzX25hbWUpOiBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQkoZGVtYW5nbGVfcHJlZml4KTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0byBgdW5zaWduZWQgY2hhcicuCi0JKGdudV9zcGVjaWFsKTogTGlrZXdpc2UuICBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkKLQl3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQkoZGVtYW5nbGVfcXVhbGlmaWVkKTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0byBgdW5zaWduZWQgY2hhcicuCi0JKGdldF9jb3VudCk6IExpa2V3aXNlLgotCShkb190eXBlKTogTGlrZXdpc2UuICBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0byBgdW5zaWduZWQgY2hhcicuCi0JKGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUpOiBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkKLQl3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQotCSogbWtzdGVtcC5jIChta3N0ZW1wcyk6IENhc3QgdmFyaWFibGUgYGxlbicgdG8gKGludCkgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQotVHVlIE9jdCAxMyAyMzo1MTo1MSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1rc3RlbXAuYzogQ2hlY2sgSEFWRV9TWVNfVElNRV9IIGJlZm9yZSBpbmNsdWRpbmcgc3lzL3RpbWUuaAotCSogY29uZmlndXJlLmluIChBQ19DSEVDS19IRUFERVJTKTogQ2hlY2sgZm9yIHN5cy90aW1lLmggdG9vLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbHQuCi0KLQkqIGdldG9wdC5jOiBDaGVjayBIQVZFX1NUUklOR1NfSCBiZWZvcmUgaW5jbHVkaW5nIHN0cmluZ3MuaC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfSEVBREVSUyk6IENoZWNrIGZvciBzdHJpbmdzLmggdG9vLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBPY3QgMTIgMTk6MTU6NTkgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBpbiBjb21tZW50LCBjYWxsIEFDX0VYRUVYVCBpbnN0ZWFkIG9mIEFNX0VYRUVYVAotCi1TdW4gT2N0IDExIDE3OjM2OjA2IDE5OTggIE1pY2hhZWwgVGllbWFubiAgPHRpZW1hbm5AaG9sb2RlY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNwbHVzLWRlbS5vLCBvYnN0YWNrLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQotVGh1IE9jdCAgOCAyMzo0MjowOCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1lcmdlIGVnY3MgJiBkZXZvIGxpYmliZXJ0eS4KLQotMTk5OC0wOS0wOCAgTWFydGluIHZvbiBM9ndpcyAgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IERlbWFuZ2xlIGFub255bW91cyBuYW1lc3BhY2VzLgotCi1Nb24gU2VwICA3IDIzOjI5OjAxIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogbWtzdGVtcC5jOiBJbmNsdWRlIGNvbmZpZy5oIGV2ZW4gd2hlbiBub3QgSU5fR0NDLiAgV3JhcCBoZWFkZXIKLSAJaW5jbHVzaW9ucyBpbnNpZGUgSEFWRV8qX0ggbWFjcm9zLiAgSW5jbHVkZSBhbnNpZGVjbC5oIHdoZW4gbm90Ci0gCUlOX0dDQy4KLQotCSogdmFzcHJpbnRmLmM6IEluY2x1ZGUgc3RkYXJnLmgvdmFyYXJncy5oIGZpcnN0LgotCi0JKiB2cHJpbnRmLmM6IExpa2V3aXNlLgotCi1TYXQgU2VwICA1IDAzOjI0OjQ5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcGV4ZWN1dGUuYzogVXBkYXRlcyBmcm9tIGdjYy4gIENvcHkgaW4gZ2NjIGhhcyBiZWVuIHJlbW92ZWQuICBUaGlzCi0JaXMgdGhlIGNhbm9uaWNhbCBjb3B5LiAgRGVmaW5lIElTU1BBQ0UgaWYgIUlOX0dDQy4KLQkqIGFsbG9jYS5jLCB2ZnByaW50Zi5jLCBjaG9vc2UtdGVtcC5jLCBta3N0ZW1wLmMsIGdldG9wdC5jOiBTaW1pbGFybHkuCi0JKiBnZXRvcHQxLmMsIG9ic3RhY2suYzogU2ltaWxhcmx5LgotCSogTWFrZWZpbGUuaW46IEJ1aWxkIG1rc3RlbXAubwotCi1UdWUgU2VwICAxIDIzOjEyOjQ3IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBhc3ByaW50ZiBpbiBsaXN0IG9mIGZ1bmN0aW9ucyBrbm93biBub3QKLQl0byBiZSBpbiBuZXdsaWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBdWcgMTkgMTQ6MDU6MDEgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jICh3b3JrX3N0dWZmKTogQWRkIGRsbGltcG9ydGVkLgotCShkZW1hbmdsZWRfcHJlZml4KTogTWFyayBzeW1ib2xzIGltcG9ydGVkIGZyb20gUEUgRExMLgotCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZWQpOiBIYW5kbGUuCi0KLTE5OTgtMDgtMTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBGaXggc2ltcGxlIGFycmF5IGhhbmRsaW5nLiAgSWYgd2UgZmFpbCwKLQlzdGF5IGZhaWxlZC4KLQotTW9uIEF1ZyAxNyAxMDo0MDozNCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jOiBJbmNsdWRlIGNvbmZpZy5oIGlmIGl0IGV4aXN0cy4gIEFsc28sIG9ubHkKLQlwcm90b3R5cGUgbWFsbG9jL3JlYWxsb2MgaWYgd2UgY2FuJ3QgZ2V0IHN0ZGxpYi5oLgotCi1TYXQgQXVnIDE1IDE2OjE1OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTd2l0Y2ggYmFjayB0byBjaGVja2luZyAtLXdpdGgtdGFyZ2V0LXN1YmRpciB3aGVuCi0JZGVjaWRpbmcgd2hldGhlciB0byBjaGVjayBmb3IgbmV3bGliLCB1bmRvaW5nIHBhcnQgb2YgSnVseSAxNQotCWNoYW5nZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEF1ZyAxMyAxNjo0NzozOCAxOTk4ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAodHlwZV9raW5kX3QpOiBOZXcgdHlwZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IEFkZCB0eXBlX2tpbmRfdCBwYXJhbWV0ZXIuICBSZWx5Ci0Jb24gdGhpcyBwYXJhbXRlciwgcmF0aGVyIHRoYW4gZGVtYW5nbGluZyB0aGUgdHlwZSBhZ2Fpbi4KLQkoZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUpOiBQYXNzIHRrX2ludGVncmFsLgotCShkZW1hbmdsZV90ZW1wbGF0ZV86IFBhc3MgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gZG9fdHlwZS4KLQkoZG9fdHlwZSk6IFJldHVybiBhIHR5cGVfa2luZF90LiAgUGFzcyB0a19pbnRlZ3JhbCB0bwotCWRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gZm9yIGFycmF5IGJvdW5kcy4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKTogTGlrZXdpc2UuCi0KLQlBbHNvIGluY29ycG9yYXRlIGZyb20gR0NDIHZlcnNpb246Ci0KLQlUdWUgSnVsIDIxIDEzOjI4OjE5IDE5OTggIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBVc2UgZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBmb3IgYXJyYXlzLgotCi1UaHUgQXVnIDEzIDE2OjQ3OjM4IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogTWFrZSBmdW5jdGlvbiBkZWZpbml0aW9uCi0Jc3RhdGljIHRvIG1hdGNoIHRoZSBwcm90b3R5cGUuCi0KLVR1ZSBKdWwgMjggMTE6MzM6MDkgMTk5OCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHR5cGVfa2luZF90KTogTmV3IHR5cGUuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBBZGQgdHlwZV9raW5kX3QgcGFyYW1ldGVyLiAgUmVseQotCW9uIHRoaXMgcGFyYW10ZXIsIHJhdGhlciB0aGFuIGRlbWFuZ2xpbmcgdGhlIHR5cGUgYWdhaW4uCi0JKGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlKTogUGFzcyB0a19pbnRlZ3JhbC4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfOiBQYXNzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGRvX3R5cGUuCi0JKGRvX3R5cGUpOiBSZXR1cm4gYSB0eXBlX2tpbmRfdC4gIFBhc3MgdGtfaW50ZWdyYWwgdG8KLQlkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIGZvciBhcnJheSBib3VuZHMuCi0JKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IExpa2V3aXNlLgotCi0JQWxzbyBpbmNvcnBvcmF0ZSBmcm9tIEdDQyB2ZXJzaW9uOgotCi0JVHVlIEp1bCAyMSAxMzoyODoxOSAxOTk4ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogVXNlIGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gZm9yIGFycmF5cy4KLQotTW9uIEp1bCAyNyAxMjoxNjowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExPQ0EpOiBOZXcgdmFyaWFibGUuCi0JKCQoVEFSR0VUTElCKSk6IEFkZCAkKEFMTE9DQSkgdG8gbGlicmFyeS4KLQkobmVlZGVkLWxpc3QpOiBBZGQgJChBTExPQ0EpLgotCSgkKEFMTE9DQSkpOiBEZXBlbmQgdXBvbiBzdGFtcC1waWNkaXIuCi0KLVN1biBKdWwgMTkgMDg6MjM6MTcgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfbmVzdGVkX2FyZ3MpOiBNYWtlIGZ1bmN0aW9uIGRlZmluaXRpb24KLQlzdGF0aWMgdG8gbWF0Y2ggdGhlIHByb3RvdHlwZS4KLQotV2VkIEp1bCAxNSAwMDoxMjo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgLS13aXRoLWNyb3NzLWhvc3QgcmF0aGVyIHRoYW4KLQktLXdpdGgtdGFyZ2V0LXN1YmRpciB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgYnVpbGQgdXNlcyBhIGNyb3NzCi0JY29tcGlsZXIsIGFuZCB3aGVuIGRlY2lkaW5nIHdoZXJlIHRvIGluc3RhbGwgdGhlIGxpYnJhcnkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVN1biBKdWwgMTIgMDE6Mjc6MDUgMTk5OCAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfbmVzdGVkX2FyZ3MpOiBSZXR1cm4gYSB2YWx1ZS4KLQotU2F0IEp1bCAxMSAxNjoxOTo0OCAxOTk4ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoc3RyaW5nKTogTW92ZSBkZWZpbml0aW9uIGJlZm9yZSB3b3JrX3N0dWZmLgotCSh3b3JrX3N0dWZmKTogQWRkIHZvbGF0aWxlX3R5cGUsIGZvcmdldHRpbmdfdHlwZXMsCi0JcHJldmlvdXNfYXJndW1lbnQsIGFuZCBucmVwZWF0cyBmaWVsZHMuCi0JKFNDT1BFX1NUUklORyk6IE5ldyBtYWNyby4KLQkoZGVtYW5nbGVfdGVtcGxhdGUpOiBBZGQgYHJlbWVtYmVyJyBwYXJhbWV0ZXIuICBBZGQgY29tbWVudC4KLQlSZWdpc3RlciB0aGUgYEInIGNvZGUgdHlwZSBoZXJlLCBpZiByZW1lbWJlcmluZy4gIFRpZHkuICBGaXggY3Jhc2gKLQlvbiBOVUxMIHRtcGxfYXJndmVjLiAgQmUgY29uc2lzdGVudCB3aXRoIHVzZSBvZiB0bmFtZS90cmF3bmFtZS4KLQkoZGVtYW5nbGVfbmVzdGVkX2FyZ3MpOiBOZXcgZnVuY3Rpb24uCi0JKGludGVybmFsX2NwbHVzX2RlbWFuZ2xlKTogSGFuZGxlIHZvbGF0aWxlLXF1YWxpZmllZCBtZW1iZXIKLQlmdW5jdGlvbnMuCi0JKG1vcF91cCk6IERlbGV0ZSB0aGUgcHJldmlvdXNfYXJndW1lbnQgc3RyaW5nIGlmIHByZXNlbnQuCi0JKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IFRpZHkuICBIYW5kbGUgdm9sYXRpbGUtcXVhbGlmaWVkIG1lbWJlcgotCWZ1bmN0aW9ucy4gIEhhbmRsZSBiYWNrLXJlZmVyZW5jZXMgdXNpbmcgdGhlIGBCJyBjb2RlLiAgVXNlIGV4dHJhCi0JcGFyYW1ldGVyIHRvIGRlbWFuZ2xlX3RlbXBsYXRlIGFuZCBTQ09QRV9TVFJJTkcgd2hlcmUgYXBwcm9wcmlhdGUuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBGaXggdGhpbmtvOyAnQicgaXMgbm90IGFuIGludGVncmFsCi0JY29kZS4KLQkoZGVtYW5nbGVfY2xhc3MpOiBVc2UgU0NPUEVfU1RSSU5HLgotCShnbnVfc3BlY2lhbCk6IFBhc3MgYWRkaXRpb25hbCBhcmd1bWVudCB0byBkZW1hbmdsZV90ZW1wbGF0ZS4KLQlVc2UgU0NPUEVfU1RSSU5HLgotCShkZW1hbmdsZV9xdWFsaWZpZWQpOiBTYXZlIHF1YWxpZmllZCB0eXBlcyBmb3IgbGF0ZXIKLQliYWNrLXJlZmVyZW5jZXMuICBIYW5kbGUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IgdGVtcGxhdGUKLQl0eXBlcyBjb3JyZWN0bHkuCi0JKGRvX3R5cGUpOiBUaWR5LiAgVXNlIFNDT1BFX1NUUklORy4gIFBhc3MgZXh0cmEgYXJndW1lbnQgdG8KLQlkZW1hbmdsZV90ZW1wbGF0ZS4gIFVzZSBkZW1hbmdsZWRfbmVzdGVkX2FyZ3MuICBEb24ndCByZW1lbWJlcgotCXF1YWxpZmllZCB0eXBlcyBoZXJlOyB0aGF0J3Mgbm93IGRvbmUgaW4gZGVtYW5nbGVfcXVhbGlmaWVkLgotCVNpbWlsYXJseSBmb3IgdGVtcGxhdGVzLgotCShkb19hcmcpOiBJbXByb3ZlIGNvbW1tZW50LiAgSGFuZGxlICduJyByZXBlYXQgY29kZS4KLQkocmVtZW1iZXJfdHlwZSk6IENoZWNrIGZvcmdldHRpbmdfdHlwZXMuCi0JKGRlbWFuZ2xlX2FyZ3MpOiBEZWFsIHdpdGggJ24nIHJlcGVhdCBjb2Rlcy4gIFRpZHkuCi0KLVRodSBKdWwgIDIgMTY6MjY6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IE9ubHkgdXNlIG1oLWZic2QyMSBvbiAqLSotZnJlZWJzZDIuMi5bMDEyXSwgbm90IG9uCi0JKi0qLWZyZWVic2QyLjIuKi4gIEZyb20gRG1pdHJpaiBUZWpibHVtIDx0ZWpibHVtQGFyYy5ocS5jdGkucnU+LgotCi1Nb24gSnVuIDE1IDE2OjI5OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzZXRvYmpzKTogQ29ycmVjdCBxdW90aW5nIGVycm9yIGluIGN5Z3dpbjMyIGNhc2UuCi0JRnJvbSBDaHJpcyBGYXlsb3IgPGNnZkBjeWdudXMuY29tPi4KLQotTW9uIEp1biAgMSAxMzo0Nzo1NSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jOiBVcGRhdGUgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCi1Nb24gSnVuICAxIDE0OjE3OjM2IDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBhIGRlcGVuZGVuY3kgb24gc3RhbXAtcGljZGlyIGZvciB0aGUKLQlvYmplY3RzLCBzbyB0aGF0IHdlIGNhbiBkbyBhIHBhcmFsbGVsIGJ1aWxkLgotCi1TYXQgTWF5IDMwIDIyOjE3OjEzIDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKGNoZWNrZnVuY3MpOiBBZGQgbWlzc2luZyAiJyIuCi0KLUZyaSBNYXkgMjkgMTI6NDA6NDEgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfbWVtb3J5X3VzZWQpOiAgRWxpZGUgdGhpcyBmdW5jdGlvbiBpZiB3ZSdyZQotCW9uIGEgc3lzdGVtIHdpdGggR05VIGxpYmMuCi0KLVR1ZSBNYXkgMjYgMTg6Mjg6NDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0KLVR1ZSBNYXkgMjYgMTU6MDE6NTIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgYWxsb2NhLWNvbmYuaC4KLQotRnJpIE1heSAyMiAwMTozODowNyAxOTk4ICBIYW5zLVBldGVyIE5pbHNzb24gIDxocEBheGlzLnNlPgotCi0JKiBjcGx1cy1kZW0uYyAoTUJVRl9TSVpFKTogQnVtcGVkIGZyb20gNTEyIHRvIDMyNzY3LgotCi0xOTk4LTA1LTIxICBNYXJrIE1pdGNoZWxsICA8bW1pdGNoZWxsQHVzYS5uZXQ+Ci0KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogSGFuZGxlIHZvbGF0aWxlIHF1YWxpZmljYXRpb24uCi0KLTE5OTgtMDUtMjEgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgdW5pc3RkLmggYXMgd2VsbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGdldHBhZ2VzaXplLmMgKEdOVV9PVVJfUEFHRVNJWkUpOiBVc2Ugc3lzY29uZiBvbmx5IGlmIF9TQ19QQUdFU0laRQotCWlzIGRlZmluZWQgaW4gdW5pc3RkLmguIFJlZm9ybWF0IGNvbmRpdGlvbmFsIGJsb2NrIGZvciBlYXNpZXIgcmVhZGluZy4KLQotCSogY29uZmlnLnRhYmxlIChzaGFyZWQpOiBEZWZhdWx0IHRvIG5vIGlmICR7ZW5hYmxlX3NoYXJlZH0KLQlpcyB1bnNldCBvciBlbXB0eTsgdGhpcyBsb2dpYyBpcyB1c2VkIGJ5IHRoZSB0b3BsZXZlbAotCWNvbmZpZ3VyZSBzY3JpcHRzLCB0b28uCi0KLVNhdCBNYXkgMTYgMTQ6MDE6MjYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IEFkZCBsaW5lIHRvIHNldCBlbmFibGVfc2hhcmVkIGluIHRoZSBNYWtlZmlsZQotCWFzIG5lZWRlZC4KLQotV2VkIE1heSAxMyAxNDoyNDozOCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jIChzcXVhbmdsZV9tb3BfdXApOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gdm9pZC4KLQkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUpOiBSZW1vdmUgdW51c2VkIHBhcmFtZXRlciBgb3B0aW9ucycuCi0JQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogUmVtb3ZlIGZ1bmN0aW9uIHdpZGUgdmFyaWFibGUgYGludCBpJyBhbmQKLQlyZXBsYWNlIHdpdGggYHNpemVfdCBpJyBhdCBlYWNoIGxvY2F0aW9uIHdoZXJlIGl0IGlzIHVzZWQuCi0JKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBjaGFuZ2UgdHlwZSBvZiBgaScgZnJvbSBpbnQgdG8gc2l6ZV90LgotCi1XZWQgTWF5IDEzIDEzOjM5OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLWNvbmYuaDogSW5jbHVkZSBjb25maWcuaC4gIENoZWNrIEhBVkVfQUxMT0NBX0ggcmF0aGVyCi0JdGhhbiBzcGFyYyBvciBzdW4uCi0JKiBNYWtlZmlsZS5pbiAoYXJndi5vKTogRGVwZW5kIHVwb24gY29uZmlnLmggYW5kIGFsbG9jYS1jb25mLmguCi0KLUZyaSBNYXkgIDggMDA6MjM6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBsaWJpYmVydHlfdG9wZGlyIGNvcnJlY3RseSB3aGVuIHNyY2RpciBpcwotCSIuIiBhbmQgd2l0aF90YXJnZXRfc3ViZGlyIGlzIG5vdCBzZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBNYXkgIDcgMTM6MDE6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCAqLSotbWluZ3czMiogY2FzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIE1heSAgNiAxMTozMzo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogTmV2ZXIgdXNlIGEgUElDIGZpbGUgZm9yICotKi1jeWd3aW4zMiouCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gY29uZmlnLnRhYmxlLgotCi0JKiBjb25maWd1cmUuaW46IE9uIGEgY3lnd2luMzIgaG9zdCwgYWx3YXlzIGNvbXBpbGUgcmFuZG9tLCBhbmQKLQlkb24ndCB0ZXN0IGZvciBzeXNfc2lnbGlzdCwgc3Ryc2lnbmFsLCBvciBwc2lnbmFsLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjbG9jay5jOiBDaGVjayBIQVZFX1NZU19QQVJBTV9IIHJhdGhlciB0aGFuIE5PX1NZU19QQVJBTV9ILgotCSogZ2V0Y3dkLmM6IExpa2V3aXNlLgotCSogZ2V0cGFnZXNpemUuYzogTGlrZXdpc2UuCi0JKiBnZXRydW50aW1lLmM6IExpa2V3aXNlLgotCi1UdWUgTWF5ICA1IDE4OjA4OjMyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVVzZSBhdXRvY29uZiB0ZXN0cyByYXRoZXIgdGhhbiB0aGUgb2xkIGR1bW15LmMgdGVzdDoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19XSVRIIGNhbGxzIGZvciAtLXdpdGgtdGFyZ2V0LXN1YmRpciBhbmQKLQktLXdpdGgtbmV3bGliLiAgQWRkIEFDX0NPTkZJR19IRUFERVIuICBVc2UgQUNfUkVQTEFDRV9GVU5DUyBmb3IKLQltb3N0IGZ1bmN0aW9ucy4gIEFkZCBzcGVjaWFsIGNhc2VzIHRvIGhhbmRsZSBuZXdsaWIgYW5kIFZ4V29ya3MuCi0JUmVtb3ZlIHRhcmdldF9tYWtlZmlsZV9mcmFnLiAgQ3JlYXRlIHN0YW1wLWggaW4gQUNfT1VUUFVUIGlmCi0JQ09ORklHX0hFQURFUlMgaXMgc2V0LiAgT25seSBjYWxsIGNvbmZpZy1tbC5pbiBpbiBBQ19PVVRQVVQgaWYKLQlDT05GSUdfRklMRVMgaXMgc2V0OyBzZXQgYWNfZmlsZSBiZWZvcmUgY2FsbGluZyBpdC4KLQkqIGNvbmZpZy50YWJsZSAoYXJtLSotcmlzY2l4KiwgKi0qLWN5Z3dpbjMyKTogUmVtb3ZlLgotCSgqLSotaHB1eCosICotKi1oaXV4KiwgKi0qLWlyaXg0KiwgKi0qLXNvbGFyaXMyKik6IFJlbW92ZS4KLQkoKi0qLXN5c3Y0KiwgKi0qLWdvMzIsICotKi12eHdvcmtzNSosICotKi12eHdvcmtzKTogUmVtb3ZlCi0JKGlbMzQ1Nl0tKi1taW5ndzMyKik6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluIChFUlJPUlNfQ0MsIENPTkZJR19ILCBORUVERURfTElTVCk6IFJlbW92ZS4KLQkoTElCT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkoSE9TVF9PRklMRVMsIERPX0FMU08sIFNUQUdFU1RVRkYpOiBSZW1vdmUuCi0JKGFsbCk6IERlcGVuZCB1cG9uIG5lZWRlZC1saXN0LiAgRG9uJ3QgY2hlY2sgUlVMRTEuCi0JKEB0YXJnZXRfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKENPTVBJTEUuYyk6IEluY2x1ZGUgQERFRlNALgotCShIRklMRVMpOiBBZGQgYWxsb2NhLWNvbmYuaC4KLQkoUkVRVUlSRURfT0ZJTEVTKTogUmVtb3ZlIGJhc2VuYW1lLm8uCi0JKCQoVEFSR0VUTElCKSk6IE5ldyB0YXJnZXQuCi0JKHN0YW1wLW5lZWRlZCwgbG5lZWRlZC1saXN0LCBuZWVkZWQuYXdrLCBzdGFtcC1jb25maWcpOiBSZW1vdmUuCi0JKGxjb25maWcuaCwgbmVlZGVkMi5hd2ssIGR1bW15Lm8sIGVycm9ycyk6IFJlbW92ZS4KLQkobmVlZGVkLWxpc3QsIGNvbmZpZy5oKTogUmV3cml0ZS4KLQkoUlVMRTEsICQoUlVMRTEpLCBSVUxFMiwgJChSVUxFMikpOiBSZW1vdmUuCi0JKC5hbHdheXMuKTogUmVtb3ZlLgotCShNYWtlZmlsZSk6IFNldCBDT05GSUdfRklMRVMgYW5kIENPTkZJR19IRUFERVJTLgotCShzdGFtcC1oKTogTmV3IHRhcmdldC4KLQkoYXRleGl0Lm8sIGNsb2NrLm8sIGdldGN3ZC5vLCBnZXRwYWdlc2l6ZS5vKTogTmV3IHRhcmdldHMuCi0JKGJhc2VuYW1lLm8pOiBEb24ndCBkZXBlbmQgdXBvbiBjb25maWcuaC4KLQkoZ2V0cnVudGltZS5vKTogRGVwZW5kIHVwb24gY29uZmlnLmguCi0JKiBhdGV4aXQuYzogSW5jbHVkZSBjb25maWcuaC4gIENoZWNrIEhBVkVfT05fRVhJVCByYXRoZXIgdGhhbgotCU5FRURfb25fZXhpdC4KLQkqIGJhc2VuYW1lLmM6IERvbid0IGluY2x1ZGUgY29uZmlnLmguICBEb24ndCBjaGVjayBORUVEX2Jhc2VuYW1lLgotCSogY2xvY2suYzogSW5jbHVkZSBjb25maWcuaC4KLQkqIGdldGN3ZC5jOiBMaWtld2lzZS4KLQkqIGdldHBhZ2VzaXplLmM6IExpa2V3aXNlLgotCSogZ2V0cnVudGltZS5jOiBMaWtld2lzZS4gIEZpeCBjaGVja3Mgd2hpY2ggc2V0IEhBVkVfR0VUUlVTQUdFIGFuZAotCUhBVkVfVElNRVMuCi0JKiBzdHJlcnJvci5jOiBDaGFuZ2UgdXNlcyBvZiBORUVEX3N5c19lcnJsaXN0IHRvCi0JSEFWRV9TWVNfRVJSTElTVC4gIExpa2V3aXNlIGZvciBORUVEX3N0cmVycm9yIGFuZCBIQVZFX1NUUkVSUk9SLgotCSogc3Ryc2lnbmFsLmM6IExpa2V3aXNlIGZvciBORUVEX3N5c19zaWdsaXN0IGFuZCBIQVZFX1NZU19TSUdMSVNULAotCWFuZCBmb3IgTkVFRF9zdHJzaWduYWwgYW5kIEhBVkVfU1RSU0lHTkFMIGFuZCBmb3IgTkVFRF9wc2lnbmFsIGFuZAotCUhBVkVfUFNJR05BTC4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogZHVtbXkuYzogUmVtb3ZlLgotCSogZnVuY3Rpb25zLmRlZjogUmVtb3ZlLgotCSogY29uZmlnL21oLWN4dXg3IChIREVGSU5FUyk6IFJlbW92ZSAtREhBVkVfU1lTQ09ORi4KLQkqIGNvbmZpZy9taC13aW5kb3dzIChIREVGSU5FUyk6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1jeWd3aW4zMjogUmVtb3ZlLgotCSogY29uZmlnL21oLWdvMzI6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1pcml4NDogUmVtb3ZlLgotCSogY29uZmlnL21oLXJpc2NpeDogUmVtb3ZlLgotCSogY29uZmlnL21oLXN5c3Y0OiBSZW1vdmUuCi0JKiBjb25maWcvbXQtbWluZ3czMjogUmVtb3ZlLgotCSogY29uZmlnL210LXZ4d29ya3M1OiBSZW1vdmUuCi0JKiBjb25maWcuaW46IE5ldyBmaWxlLCBnZW5lcmF0ZWQgdXNpbmcgYXV0b2hlYWRlci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIE1heSAgNCAxMzowMDoyOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSB0byB1c2UgYXV0b2NvbmYuCi0JKiBjb25maWd1cmU6IEdlbmVyYXRlIHVzaW5nIGF1dG9jb25mLgotCSogY29uZmlnL21oLWE2OGJzZDogUmVtb3ZlLgotCSogY29uZmlnL21oLWFwb2xsbzY4OiBSZW1vdmUuCi0JKiBjb25maWcvbWgtaHBic2Q6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtc3lzdjogUmVtb3ZlLgotCSogY29uZmlnL21oLWFpeCAoUkFOTElCLCBJTlNUQUxMKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL21oLWN4dXg3IChSQU5MSUIsIElOU1RBTEwpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbWgtaXJpeDQgKENDLCBSQU5MSUIsIElOU1RBTEwpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbWgtc3lzdjQgKFJBTkxJQiwgSU5TVEFMTCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy50YWJsZTogQ2hhbmdlIGNvbmZpZ19zaGVsbCB0byBDT05GSUdfU0hFTEwsIGFuZCB1c2UKLQlsaWJpYmVydHlfdG9wZGlyIHRvIGZpbmQgbW92ZS1pZi1jaGFuZ2UuCi0gCShtNjhrLWFwb2xsby1ic2QqLCBtNjhrLWFwb2xsby1zeXN2Kik6IFJlbW92ZS4KLQkoaVszNDU2XTg2LW5jci1zeXN2NCosICotKi1kZ3V4KiwgaHBwYSotaHAtYnNkKik6IFJlbW92ZS4KLQkoKi0qLWlyaXgqLCAqLSotbTg4a2JjcyosICotKi1zeXN2Kik6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluIChzcmNkaXIpOiBTZXQgdG8gQHNyY2RpckAuCi0JKFZQQVRIKTogTGlrZXdpc2UuCi0JKHByZWZpeCwgZXhlY19wcmVmaXgsIGJpbmRpciwgbGliZGlyKTogU2V0IHRvIGF1dG9jb25mIHZhcmlhYmxlcy4KLQkoU0hFTEwsIElOU1RBTEwsIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogTGlrZXdpc2UuCi0JKENDLCBDRkxBR1MsIFJBTkxJQikpOiBMaWtld2lzZS4KLQkoZGF0YWRpciwgbWFuKmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwgTUFLRUlORk8pOiBSZW1vdmUuCi0JKHRhcmdldF9tYWtlZmlsZV9mcmFnLCBob3N0X21ha2VmaWxlX2ZyYWcpOiBBZGQgc3Vic3RpdHV0aW9ucy4KLQkoSU5TVEFMTF9ERVNUKTogU2V0IHRvIEBJTlNUQUxMX0RFU1RALgotCShNYWtlZmlsZSk6IERlcGVuZCB1cG9uIGNvbmZpZy5zdGF0dXMuICBEb24ndCBkZXBlbmQgdXBvbgotCSQoaG9zdF9tYWtlZmlsZV9mcmFnKSBvciAkKHRhcmdldF9tYWtlZmlsZV9mcmFnKS4KLQkoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCi0KLVN1biBNYXkgIDMgMTc6NTg6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtc3Vub3M0OiBSZW1vdmUuICBTaG91bGQgYmUgaGFuZGxlZCBieSAtLXdpdGgtaGVhZGVycwotCWFuZCAtLXdpdGgtbGlicmFyaWVzIG9wdGlvbnMgYXQgdG9wIGxldmVsLgotCSogY29uZmlnLnRhYmxlOiBOZXZlciB1c2UgbXQtc3Vub3M0LgotCi0JKiBhbGxvY2EtY29uZi5oOiBOZXcgZmlsZSwgY29tYmluaW5nIGFsbG9jYS1ub3JtLmggYW5kCi0JYWxsb2NhLWJvdGNoLmguCi0JKiBhbGxvY2Etbm9ybS5oOiBSZW1vdmUuCi0JKiBhbGxvY2EtYm90Y2guaDogUmVtb3ZlLgotCSogY29uZmlndXJlLmluOiBTZXQgc2hlbGwgdmFyaWFibGVzIGZpbGVzIGFuZCBsaW5rcyB0byBlbXB0eS4KLQkqIGNvbmZpZy50YWJsZTogRG9uJ3Qgc2V0IHNoZWxsIHZhcmlhYmxlIGZpbGVzLgotCSogY29uZmlndXJlLmJhdDogRG9uJ3QgY3JlYXRlIGFsbG9jYS1jb25mLmguCi0JKiBtYWtlZmlsZS52bXM6IExpa2V3aXNlLgotCSogbXB3LWNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiB2bXNidWlsZC5jb206IExpa2V3aXNlLgotCi1GcmkgTWF5ICAxIDExOjQxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoSE9TVF9PRklMRVMpICQoUkVRVUlSRURfT0ZJTEVTKSk6IFJlbW92ZSBvbGQKLQl0YXJnZXQgZGVwZW5kaW5nIHVwb24gY29uZmlnLmguCi0JKGFsbG9jYS5vKTogQWRkIHRhcmdldCBkZXBlbmRpbmcgdXBvbiBjb25maWcuaAotCShiYXNlbmFtZS5vLCBjaG9vc2UtdGVtcC5vLCBmbm1hdGNoLm8pOiBMaWtld2lzZS4KLQkoZ2V0b3B0Lm8sIGdldG9wdDEubywgcGV4ZWN1dGUubywgc3RyZXJyb3Iubyk6IExpa2V3aXNlLgotCShzdHJzaWduYWwubywgeHN0cmVycm9yLm8pOiBMaWtld2lzZS4KLQotRnJpIE1heSAgMSAwNDoyNjoyNSAxOTk4ICBQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6ICBJbml0aWFsaXplIHdvcmsuCi0KLU1vbiBBcHIgMjcgMTU6NTM6MzAgRURUIDE5OTggQW5kcmV3IE1hY0xlb2QgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQpOiBSZXBsYWNlIG1pc3NpbmcgZWxzZS4KLQotU3VuIEFwciAyNiAxNTozODo1MCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogRml4IG9mZi1ieS1vbmUgYnVnIHdoZW4gY2hlY2tpbmcgdGhlCi0JbGVuZ3RoIGluIHRoZSBuYW1lIG9mIGEgdmlydHVhbCB0YWJsZS4KLQotV2VkIEFwciAyMiAxMDo1Mzo0OSBFRFQgMTk5OCBBbmRyZXcgTWFjTGVvZCAgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChzdHJ1Y3Qgd29yayBzdHVmZik6IEFkZCBmaWVsZCBmb3IgQiBhbmQgSyBtYW5nbGUgY29kZXMuCi0JKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IENhbGwgbW9wX3VwX3NxdWFuZ2xlLgotCShjcGx1c19kZW1hbmdsZSk6IEluaXRpYWxpemUgc3F1YW5nbGUgaW5mbywgdGhlbiBjYWxsCi0JaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUuIChNb3N0IGNvZGUgbW92ZWQgdGhlcmUgYXMgd2VsbCkKLQkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUpOiBOZXcgZnVuY3Rpb24sIHBlcmZvcm1zIG1vc3Qgb2Ygd2hhdCB1c2UKLQl0byBiZSBkb25lIGluIGNwbHVzX2RlbWFuZ2xlLCBidXQgaXMgb25seSBjYWxsZWQgd2l0aCB0aGlzIGZpbGUuCi0JKHNxdWFuZ2xlX21vcF91cCk6IE5ldyBmdW5jdGlvbiB0byBjbGVhbiB1cCBCIGFuZCBLIGNvZGUgZGF0YS4KLQkobW9wX3VwKTogc2V0IHBvaW50ZXJzIHRvIE5VTEwgYWZ0ZXIgZnJlZWluZy4KLQkoZGVtYW5nbGVfc2lnbmF0dXJlLCBkZW1hbmdsZV90ZW1wbGF0ZSwgZGVtYW5nbGVfY2xhc3MpOiBBZGQKLQlzd2l0Y2ggZWxlbWVudHMgdG8gaGFuZGxlIEsgYW5kIEIgY29kZXMuCi0JKGRlbWFuZ2xlX3ByZWZpeCwgZ251X3NwZWNpYWwsIGRlbWFuZ2xlX3F1YWxpZmllZCk6IEFkZAotCWNvZGUgdG8gaGFuZGxlIEsgYW5kIEIgY29kZXMuCi0JKGRvX3R5cGUsIGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IEhhbmRsZSBCIGFuZCBLIGNvZGVzLgotCShyZW1lbWJlcl9LdHlwZSk6IE5ldyBmdW5jdGlvbiB0byBzdG9yZSBLIGluZm8uCi0JKHJlZ2lzdGVyX0J0eXBlLCByZW1lbWJlcl9CdHlwZSk6IE5ldyBmdW5jdGlvbnMgZm9yIEIgY29kZXMuCi0JKGZvcmdldF9CX2FuZF9LX3R5cGVzKTogTmV3IGZ1bmN0aW9uIHRvIGRlc3Ryb3kgQiBhbmQgSyBpbmZvLgotCi1GcmkgQXByIDEwIDAxOjQ5OjEwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogQ09QWUlORy5MSUIsIGNob29zZS10ZW1wLmMsIGNwbHVzLWRlbS5jOiBTeW5jIHdpdGggZWdjcyAmIGdjYy4KLQotVGh1IE1hciAgNSAwOToyMzoyOCAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZy50YWJsZTogTWFrZSBsb2NhdGluZyBmcmFnIGZpbGVzIGZhaWxzYWZlIGV2ZW4gZm9yIHRoZQotCXNwZWNpYWwgY2FzZSBpZiBjb25maWd1cmluZyBhbmQgYnVpbGRpbmcgaW4gc3JjZGlyLgotCi1Nb24gRmViIDIzIDE0OjMzOjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2hvb3NlLXRlbXAuYzogRml4IGhhbmRsaW5nIG9mIHN5cy9maWxlLmggdG8gd29yayBpbiBsaWJpYmVydHkuCi0KLVN1biBGZWIgMjIgMTg6MDM6MjMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjaG9vc2UtdGVtcC5jOiBTeW5jIHdpdGggY29weSBpbiBnY2MuCi0KLVRodSBGZWIgMTIgMTY6Mjk6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZXRvcHQuYzogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQkqIGdldG9wdDEuYzogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMTAgMTY6NTg6MzMgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgLjxkaWdpdHM+Ci0Jc3RyaW5ncyB0aGF0IGFyZSBub3QgYWN0dWFsbHkgbGVuZ3Rocy4KLQotRnJpIEZlYiAgNiAwMTozNToxNyAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogRG9uJ3QgcGFzcyBQSUNGTEFHLgotCSguYy5vKTogQ2hlY2sgdmFsdWUgb2YgZW5hYmxlX3NoYXJlZCwgbm90IFBJQ0ZMQUcuCi0JKHN0YW1wLXBpY2Rpcik6IERpdG8uCi0KLVRodSBGZWIgIDUgMTg6NDg6NTYgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL21oLWN5Z3dpbjMyOiByZW1vdmUgdmFzcHJpbnRmLm8gZnJvbSBFWFRSQV9PRklMRVMKLQlzaW5jZSBpdCBnZXRzIGJ1aWx0IGF1dG9tYXRpY2FsbHkKLQotU3VuIEZlYiAgMSAwMjo1MjozMiAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZSAodnh3b3JrcyBjb25maWdzKTogRGVmYXVsdCB0byBWeFdvcmtzIDUueCwgYXMgdGhhdCBpcwotCXRoZSBjdXJyZW50bHkgc2hpcHBpbmcgT1MuCi0KLVR1ZSBKYW4gMjcgMTY6MDg6MjAgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIHZtc2J1aWxkLmNvbSBbUkVRVUlSRV9PRklMRVNdOiBTeW5jaHJvbml6ZWQgd2l0aCBNYWtlZmlsZS5pbjoKLQlBZGQgZm5tYXRjaC5vIGFuZCBvYmphbGxvYy5vOyByZW1vdmUgdmFzcHJpbnRmLm8uCi0JW2NvbmZpZy5oXTogRGVmaW5lIE5FRURfc3Ryc2lnbmFsLgotCi1Nb24gSmFuIDE5IDEyOjIwOjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZnVuY3Rpb25zLmRlZjogQ29ycmVjdCBhcmd1bWVudCB0eXBlcyBmb3Igc3RyZXJyb3IgYW5kCi0Jc3Ryc2lnbmFsLiAgUmVwb3J0ZWQgYnkgQWxleCBHdXRtYW4gPGFndXRtYW5AZW1jLmNvbT4uCi0KLVN1biBKYW4gMTggMTU6NTc6MjggMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KLQotCSogdmFzcHJpbnRmLmMgKGludF92YXNwcmludGYpOiBJbmNyZWFzZSBidWZmZXIgc2l6ZSBmb3IgZmxvYXQvZG91YmxlCi0JdmFsdWVzLgotCi1TYXQgSmFuIDE3IDIyOjI4OjM4IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCQkJICBKLkouIFZhbmRlckhlaWpkZW4gPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCUFkZCBtaW5ndzMyIHN1cHBvcnQuCi0JKiBwZXhlY3V0ZS5jIChwZXhlY3V0ZSk6IE5ldyBmdW5jdGlvbiBmb3IgbWluZ3czMi4gU3VwcG9ydHMgcGlwZXMuCi0JKHB3YWl0KTogTmV3IGZ1bmN0aW9uIGZvciBtaW5ndzMyLgotCi0JKiBjb25maWcudGFibGUgKGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKTogU3VwcG9ydCBmb3IgaTM4Ni1taW5ndzMyLgotCSogY29uZmlnL210LW1pbmd3MzI6IE5ldyBmaWxlLgotCSogeG1hbGxvYy5jIChmaXJzdF9icmVhayk6IE5vdCB1c2VkIGZvciBtaW5ndzMyLgotCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBEb24ndCB1c2Ugc2JyayBvbiBtaW5ndzMyLgotCSh4bWFsbG9jKTogTGlrZXdpc2UuCi0JKHhyZWFsbG9jKTogTGlrZXdpc2UuCi0KLVNhdCBKYW4gMTcgMjI6Mjg6MDUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjaG9vc2UtdGVtcC5jOiBTeW5jIHdpdGggZ2NjIHZlcnNpb24uCi0KLVR1ZSBKYW4gMTMgMTg6MzQ6MzkgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbF90b19saWJkaXIsIGluc3RhbGxfdG9fdG9vbGRpcik6IEFkZCBNVUxUSVNVQkRJUgotCXRvIGFsbCBmaWxlbmFtZXMgaW4gbGliZGlyIGFuZCB0b29sZGlyLgotCShkaXN0Y2xlYW4pOiBEbyBNVUxUSUNMRUFOIGJlZm9yZSBkZWxldGluZyBNYWtlZmlsZS4KLQkoc3RhbXAtbmVlZGVkLCBzdGFtcC1jb25maWcpOiBBZGQgTVVMVElTUkNUT1AgdG8KLQlwYXRobmFtZSBmb3IgbW92ZS1pZi1jaGFuZ2UuCi0KLVRodSBEZWMgIDQgMTc6MjU6MTkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYyAoc3lzX25zaWcpOiBUcnkgTlNJRyBhbmQgX05TSUcuCi0KLVdlZCBOb3YgMTkgMTM6Mzc6MDYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS1ub3JtLmggKGFsbG9jYSwgR0NDIGNhc2UpOiBEb24ndCByZWRlZmluZSBhbGxvY2EgaWYgaXQKLQl3YXMgYWxyZWFkeSBkZWZpbmVkIHByZXZpb3VzbHkuCi0KLU1vbiBOb3YgMTAgMTI6NDg6MDMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlIC4uL2luc3RhbGwtc2gsIG5vdCBpbnN0YWxsLgotCi1UdWUgT2N0IDI4IDIzOjQxOjE1IDE5OTcgIEp1ZHkgR29sZGJlcmcgIDxqb2R5Z0BpZHQubmV0PgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIHBleGVjdXRlLmMuCi0KLVdlZCBPY3QgMTUgMTk6MTM6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhc3ByaW50Zi5jOiBDb25zaXN0ZW50bHkgdXNlIGVpdGhlciBzdGRhcmcgb3IgdmFyYXJncy4KLQotVHVlIE9jdCAxNCAxMjowMTowMCAxOTk3ICBNYXJrIE1pdGNoZWxsICA8bW1pdGNoZWxsQHVzYS5uZXQ+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiBEb24ndCBsb29rIGZvciByZXR1cm4gdHlwZXMgb24KLQljb25zdHJ1Y3RvcnMuICBIYW5kbGUgbWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9ycy4KLQotRnJpIE9jdCAgMyAxNzo1MzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFJFQURNRTogRml4IGNvbmZpZ3VyYXRpb24gaW5zdHJ1Y3Rpb25zLgotCi1Nb24gU2VwIDI5IDEyOjI4OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogVXBkYXRlIHRvIGN1cnJlbnQgdmVyc2lvbiBmcm9tIC9nZC9nbnUvbGliOgotCi0JTW9uIFNlcCAyOSAxMjoyNzo1OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IFVzZSBzcGF3biBpZiBfX0NZR1dJTjMyX18uCi0KLQkxOTk3LTA4LTA4ICBQYXVsIEVnZ2VydCAgPGVnZ2VydEB0d2luc3VuLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogSW5jbHVkZSAiY29uZmlnLmgiIGZpcnN0LCBhcyBwZXIgYXV0b2NvbmYgbWFudWFsLgotCi0JRnJpIEp1biAyNyAxNToyMDoyOSAxOTk3ICBTY290dCBDaHJpc3RsZXkgPHNjb3R0Y0BuZXQtY29tbXVuaXR5LmNvbT4KLQotCSogcGV4ZWN1dGUuYyAoZml4X2FyZ3YpOiBOZXcgZnVuY3Rpb24uCi0JKHBleGVjdXRlKTogV2luMzIgYnV0IG5vdCBDeWd3aW4zMiBuZWVkcyBpdHMgYXJndW1lbnRzIGZpeGVkLgotCUFkZCB1bmRlcnNjb3JlIHRvIGN3YWl0IGZ1bmN0aW9uIGNhbGwuCi0KLVN1biBTZXAgMjggMTI6MDA6NTIgMTk5NyAgTWFyayBNaXRjaGVsbCAgPG1taXRjaGVsbEB1c2EubmV0PgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBBZGQgbmV3IHBhcmFtZXRlci4gIEhhbmRsZSBuZXcKLQl0ZW1wbGF0ZS1mdW5jdGlvbiBtYW5nbGluZy4KLQkoY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzKTogTmV3IGZ1bmN0aW9uLgotCShkZW1hbmdsZV9zaWduYXR1cmUpOiBIYW5kbGUgbmV3IG5hbWUtbWFuZ2xpbmcgc2NoZW1lLgotCi1XZWQgU2VwIDI0IDAwOjMxOjU5IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAeWluLmN5Z251cy5jb20+Ci0KLQkqIGFzcHJpbnRmLmM6IHN0ZGFyZy5oIHdoZW4gQUxNT1NUX1NUREMKLQkqIGNvbmZpZy9taC13aW5kb3dzIChFWFRSQV9PRklMRVMpOiBhZGQgYXNwcmludGYubyBhbmQKLSAJc3RybmNhc2VjbXAuby4KLQotVGh1IEF1ZyAyOCAxNDoyNzoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHZhc3ByaW50Zi5jICh2YXNwcmludGYpOiBBbGxvdyBmb3IgX0JTRF9WQV9MSVNUXy4KLQotCSogY29uZmlnLnRhYmxlOiBBZGQgY2FzZSBmb3IgRnJlZUJTRCAyLjEgYW5kIDIuMiwgbmVlZHMgbWgtZmJzZDIxLgotCi0JKiBjb25maWcvbWgtZmJzZDIxIChFWFRSQV9PRklMRVMpOiBGb3JjZSB2YXNwcmludGYubwotCi1XZWQgU2VwIDEwIDEyOjQzOjEwIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IENoYW5nZSAiY29tcGxleCIgdG8gIl9fY29tcGxleCIuCi0KLUZyaSBTZXAgIDUgMTY6MzQ6NDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhc3ByaW50Zi5jIChhc3ByaW50Zik6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBhc3ByaW50Zi5jCi0JKiBmdW5jdGlvbnMuZGVmOiBEaXR0by4KLQotVGh1IEF1ZyAyOCAxODo1MzozNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyZ3YuYyAoZHVwYXJndik6IE5ldyBmdW5jdGlvbiwgZHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4KLQotVHVlIEF1ZyAxOSAyMDoyODo0NSAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtY3lnd2luMzI6IGFsc28gYnVpbGQgcmFuZG9tLm8KLQotVHVlIEF1ZyAxOSAxNzoxMDo1NiAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBBZGQgJ2V4dGVybicgdG8gcHJlcGVuZHNfdW5kZXJzY29yZS4KLQotV2VkIEp1bCAzMCAxMTo0MjoxOSAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IFZhcmlvdXMgY2hhbmdlcyB0byBwcm9kdWNlIEphdmEgb3V0cHV0IHdoZW4gcGFzc2VkCi0JRE1HTF9KQVZBLiAgVGh1cyAiOjoiIGJlY29tZXMgIi4iIGFuZCAiSkFycmF5PEZvbz4iIGJlY29tZXMgIkZvb1tdIi4KLQkobWFpbik6IFN1cHBvcnQgLS1qYXZhIGFuZCAtaiBmbGFncyB0byBzZXQgRE1HTF9KQVZBLgotCi1UdWUgSnVsIDIyIDE5OjA1OjIzIDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogY29uZmlnL21oLWdvMzIgKENDLCBBUiwgUkFOTElCKTogRG9uJ3QgZGVmaW5lLgotCi1UdWUgSnVsIDIyIDE3OjQ5OjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBwZXhlY3V0ZS5vLgotCShwZXhlY3V0ZS5vKTogTmV3IHRhcmdldC4KLQotCSogTWFrZWZpbGUuaW4gKHN0YW1wLW5lZWRlZCk6IE5ldyB0YXJnZXQsIHJlcGxhY2luZyBuZWVkZWQtbGlzdC4KLQkobmVlZGVkLWxpc3QpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLW5lZWRlZC4KLQkoc3RhbXAtY29uZmlnKTogTmV3IHRhcmdldCwgcmVwbGFjaW5nIGNvbmZpZy5oLgotCShjb25maWcuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RhbXAtY29uZmlnLgotCShtb3N0bHljbGVhbik6IFJlbW92ZSBzdGFtcC0qLgotCi1UaHUgSnVuIDEyIDExOjAwOjE4IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IHBhc3MgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNIGFuZAotCUlOU1RBTExfREFUQSBmb3IgbXVsdGlsaWJiZWQgaW5zdGFsbHMKLQotVHVlIEp1biAgMyAxMzoyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JVHVlIERlYyAxMCAwOTo0NDo1NyAxOTk2ICBQYXVsIEVnZ2VydCAgPGVnZ2VydEB0d2luc3VuLmNvbT4KLQotCSogY2hvb3NlLXRlbXAuYyAoY2hvb3NlX3RlbXBfYmFzZSk6IERvbid0IGR1bXAgY29yZSBpZiBUTVBESVIgaXMgZW1wdHkuCi0KLQkqIGNob29zZS10ZW1wLmMgKHRyeSk6IEluc2lzdCB0aGF0IHRlbXAgZGlyIGJlIHNlYXJjaGFibGUuCi0KLQlXZWQgT2N0IDIzIDE3OjM2OjM5IDE5OTYgIERvdWcgUnVwcCAgKHJ1cHBAZ25hdC5jb20pCi0KLQkqIGNob29zZS10ZW1wLmMgKGNob29zZV90ZW1wX2Jhc2UpOiBPbiBWTVMsIHVzZSBwcm9wZXIgc3ludGF4Ci0JZm9yIGN1cnJlbnQgZGlyZWN0b3J5LgotCi0JU2F0IEZlYiAxNSAxOTowMzo0OCAxOTk3ICBHZW9mZnJleSBOb2VyICAobm9lckBjeWdudXMuY29tKQotCi0JKiBwZXhlY3V0ZS5jOiBSZW1vdmUgc3BlY2lhbCBjYXNlcyBmb3IgY3lnd2luMzIuCi0JKHB3YWl0KTogUmVtb3ZlIGxvY2FsIGRlZmluaXRpb24gb2YgYHBpZCcuCi0KLQlUdWUgTm92IDEyIDE4OjI2OjE1IDE5OTYgIERvdWcgUnVwcCAgKHJ1cHBAZ25hdC5jb20pCi0KLQkqIHBleGVjdXRlLmMgKHZmb3JrKTogU3VwcGx5IG5ldyBkZWZpbml0aW9uIGZvciBWTVMuCi0JKHB3YWl0KTogVXNlIHdhaXRwaWQgaW5zdGVhZCBvZiB3YWl0IGZvciBWTVMuCi0KLVR1ZSBNYXkgMjAgMTQ6MDI6MjAgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEhhbmRsZSBgSicuCi0JKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IFByaW50ICJjb21wbGV4IiBmb3IgaXQuCi0KLVdlZCBBcHIgMzAgMTI6MTU6NDUgMTk5NyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHR1cm4gb24gbXVsdGlsaWIgaGVyZS4KLQotTW9uIEFwciAyOCAxOTowNDozMSAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBvYnN0YWNrLmM6IG1vdmUgX29ic3RhY2tfbWVtb3J5X3VzZWQgb3V0c2lkZSBvZiBpZmRlZi4gIENhbm5vdCBiZQotCWVsaWRlZDsgbmVlZGVkIGJ5IGdkYiBhbmQgbm90IHByZXNlbnQgaW4gbGliYy4KLQotVGh1IEFwciAyNCAxOTozMzo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSB0bXBtdWx0aS5vdXQuCi0KLVR1ZSBBcHIgMjIgMTA6MjU6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZCk6Ci0JQWRkIG5ldyBmbG9hdGZvcm1hdCwgbWFpbmx5IGZvciBBUk0gZG91Ymxlcy4KLQotTW9uIEFwciAxNCAxMjoxMToxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogVXNlICR7Y29uZmlnX3NoZWxsfSB3aXRoICR7bW92ZWlmY2hhbmdlfS4gIEZyb20KLQlUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+LgotCi1GcmkgQXByICA0IDAzOjA5OjI0IDE5OTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEVuYWJsZSBtdWx0aWxpYmluZyBieSBkZWZhdWx0LgotCVVwZGF0ZSBtdWx0aWxpYiB0ZW1wbGF0ZSB0byByZWFkIGNvbmZpZy1tbC5pbi4KLQotVHVlIEFwciAgMSAxNjoyNjozOSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBBZGQgb2JqYWxsb2MuCi0KLU1vbiBNYXIgMzEgMjM6NTc6NTEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2l0KTogQWRkIHByb3RvdHlwZSBkZWNsYXJhdGlvbi4KLQkodXNhZ2UsIGZhdGFsKTogTGlrZXdpc2UuCi0KLQkqIHhleGl0LmMgKF94ZXhpdF9jbGVhbnVwKTogQWRkIHByb3RvdHlwZS4KLQotCSogc3RyZXJyb3IuYyAoaW5pdF9lcnJvcl90YWJsZXMpOiBEZWNsYXJlLgotCi1GcmkgTWFyIDI4IDExOjQzOjIwIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBmdW5jdGlvbnMuZGVmOiBBZGQgREVGIG9mIHZhc3ByaW50ZiwgYW5kIERFRkZVTkMgb2Ygc3Ryc2lnbmFsLgotCSogc3Ryc2lnbmFsLmM6IE9ubHkgZGVmaW5lIHN0cnNpZ25hbCBpZiBORUVEX3N0cnNpZ25hbC4KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiBSZW1vdmUgdmFzcHJpbnRmLm8uCi0JKiBjb25maWd1cmUuaW46IEFkZCBORUVEX3N0cnNpZ25hbCB0byB4Y29uZmlnLmguICBBZGQgdmFzcHJpbnRmLm8KLQl0byB4bmVlZGVkLWxpc3QuCi0JKiBjb25maWcvbWgtY3lnd2luMzIgKEhERUZJTkVTKTogQWRkIC1ETkVFRF9zdHJzaWduYWwuCi0JKEVYVFJBX09GSUxFUyk6IERlZmluZSB0byB2YXNwcmludGYuby4KLQkqIGNvbmZpZy9taC13aW5kb3dzIChIREVGSU5FUyk6IEFkZCAtRE5FRURfc3Ryc2lnbmFsLgotCShFWFRSQV9PRklMRVMpOiBBZGQgdmFzcHJpbnRmLm8uCi0JKiBjb25maWcvbXQtdnh3b3JrczUgKHZ4Y29uZmlnLmgpOiBEZWZpbmUgTkVFRF9zdHJzaWduYWwuCi0JKHZ4bmVlZGVkLWxpc3QpOiBBZGQgdmFzcHJpbnRmLm8uCi0KLVRodSBNYXIgMjAgMTc6MDI6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmphbGxvYy5jOiBJbmNsdWRlIDxzdGRpby5oPi4KLQotTW9uIE1hciAxNyAxOToyMzoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamFsbG9jLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBvYmphbGxvYy5jCi0JKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBvYmphbGxvYy5vLgotCShvYmphbGxvYy5vKTogTmV3IHRhcmdldC4KLQotU2F0IE1hciAxNSAxODo0OTo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suYzogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb24uCi0KLUZyaSBNYXIgMTQgMTQ6MTg6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogQWRkIHByb3RvdHlwZXMgZm9yIGFsbCBzdGF0aWMgZnVuY3Rpb25zLgotCShteXN0cnN0cik6IE1ha2Ugc3RhdGljLiAgTWFrZSBhcmd1bWVudHMgYW5kIHJlc3VsdCBjb25zdC4KLQkoY3BsdXNfbWF0Y2gpOiBSZW1vdmU7IG5vdCB1c2VkLgotCi1UdWUgTWFyIDExIDE0OjIwOjMxIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogQ2FsbCBkZW1hbmdsZWRfZnVuZF90eXBlIGZvciBvdGhlcgotCV9fdCogc3ltYm9scy4KLQotVHVlIE1hciAxMSAxNTo0MToyMSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogc3BhY2VzLmM6IERlY2xhcmUgbWFsbG9jIGFuZCBmcmVlIHByb3Blcmx5LgotCSogc3Ryc2lnbmFsLmMgKGluaXRfc2lnbmFsX3RhYmxlcyk6IEFkZCBwcm90b3R5cGUuCi0JKiB4YXRleGl0LmMgKF94ZXhpdF9jbGVhbnVwKTogQWRkIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCi0KLVdlZCBGZWIgMTkgMTU6NDM6MjQgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogSWYgYWxsb2NhLm8gaXMgbmVlZGVkLCB4ZXhpdC5vIGlzCi0JYWxzbyByZXF1aXJlZCBiZWNhdXNlIG9mIHhtYWxsb2Muby4KLQotRnJpIEZlYiAxNCAxMzo0MzozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cnNpZ25hbC5jOiBVbmNvbmRpdGlvbmFsbHkgcmVkZWZpbmUgc3lzX3NpZ2xpc3QgYXJvdW5kIHRoZQotCWluY2x1c2lvbiBvZiB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcy4KLQotVGh1IEZlYiAxMyAyMjowMTowNCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBSZW1vdmUgOCBiaXQgY2hhcmFjdGVycy4gIFVwZGF0ZSB0byBsYXRlc3QKLQlnY2MgcmVsZWFzZS4KLQotVHVlIEZlYiAgNCAxMTo1MjoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cnNpZ25hbC5jOiBVc2UgTkVFRF9zeXNfc2lnbGlzdCBpbnN0ZWFkIG9mCi0JTE9TSU5HX1NZU19TSUdMSVNULgotCSogY29uZmlnLnRhYmxlOiBEb24ndCB1c2UgbWgtbHlueG9zLgotCSogY29uZmlnL21oLWx5bnhvczogUmVtb3ZlLgotCi1UaHUgSmFuIDE2IDE0OjUxOjAzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogRml4IGluZGVudGluZzsgbWFrZSBpZGVudGljYWwgdG8gdGhlIGNvcHkKLQlpbiBHQ0MuCi0JKGRvX3R5cGUsIGNhc2UgJ00nKTogQ2hlY2sgZm9yIGEgdGVtcGxhdGUgYXMgd2VsbCBhcyBhIGNsYXNzLgotCi1UaHUgRGVjIDE5IDEzOjUxOjMzIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXZ4d29ya3M1ICh2eG5lZWRlZC1saXN0KTogUmVtb3ZlIHNpZ3NldG1hc2subywgc2luY2UKLQl2eHdvcmtzIDUuWzAtM10gYWxsIGhhdmUgc2lnc2V0bWFzayBpbiB0aGVtOyB0aGUgb25lIHByb3ZpZGVkIGJ5Ci0JbGliaWJlcnR5IGlzIGluY29ycmVjdCwgYXMgd2VsbC4KLQotTW9uIERlYyAgMiAxNTowMzo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS5jIChhbGxvY2EpOiBXaGVuIGNvbXBpbGVkIHdpdGggYW4gQU5TSS9JU08gY29tcGlsZXIsCi0JYWxsb2NhIHRha2VzIGEgc2l6ZV90IGFyZ3VtZW50LCBub3QganVzdCB1bnNpZ25lZC4KLQotTW9uIE5vdiAxOCAxNTo0MjowOCAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBOb3RlIHRoYXQgdGhpcyBmaWxlIGFsc28gbGl2ZXMgaW4gR0NDLgotCi1Nb24gTm92IDE4IDE1OjE5OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLmM6IFJlbW92ZSBpbmNsdWRlIG9mIGxpYmliZXJ0eS5oIGZvciBocHV4LgotCSogYXJndi5jOiAgUmVwbGFjZSBkZWZzIGZyb20gbGliaWJlcnR5LmguCi0JKiBzcGFjZXMuYzogUHV0IGJhY2sgZXh0ZXJucyBmcm9tIHJlbW92ZWQgZnJvbSBsaWJpYmVydHkuaC4KLQkqIHZhc3ByaW50Zi5jOiBSZW1vdmUgaW5jbHVkZSBvZiBsaWJpYmVydHkuaCBmb3IgaHB1eC4KLQotTW9uIE5vdiAxOCAxNDowODowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBDaGVja2luZyBpbiBhZ2FpbjsgbGFzdCBjaGVja2luIGZpbGVkIGR1ZSB0byBzdGlja3kgdGFnLgotCi1XZWQgTm92IDEzIDA4OjIyOjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IFJldmVydCBsYXN0IHR3byBjb21taXRzIGR1ZSB0byBjb25mbGljdHMgd2l0aAotCWhwdXggc3lzdGVtIGhlYWRlcnMuCi0KLVdlZCBOb3YgMTMgMDg6MjI6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBhbGxvY2EuYywgYXJndi5jLCBzcGFjZXMuYywgc3RyY2FzZWNtcC5jLCB2YXNwcmludGYuYywgdnByaW50Zi5jOgotCVJldmVydCBsYXN0IGNvbW1pdCBkdWUgdG8gY29uZmxpY3RzIHdpdGggaHB1eCBzeXN0ZW0gaGVhZGVycy4KLQotV2VkIE5vdiAxMyAxMDozNjo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jICh4e20scmV9YWxsb2MpOiBNYWtlIGRlY2xhcmF0aW9ucyBjb21wYXRpYmlsZSB3aXRoCi0JbGliaWJlcnR5Lmggd2hlbiBjb21waWxlZCB3aXRoIGEgc3RhbmRhcmQgY29tcGlsZXIuCi0KLVR1ZSBOb3YgMTIgMTY6MzE6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBhbGxvY2EuYzogSW5jbHVkZSBsaWJpYmVydHkuaCBmb3IgZGVmaW5pdGlvbiBvZiB4bWFsbG9jLgotCURvbid0IHJlZGVmaW5lIE5VTEwuCi0JKiBhcmd2LmM6IE1vdmUgcHJvdG90eXBlcyB0byBsaWJpYmVydHkuaC4KLQkqIGNwbHVzLWRlbS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oIGZvciBkZWZpbml0aW9uIG9mIHhtYWxsb2MuCi0JRG9uJ3QgcmVkZWZpbmUgTlVMTC4KLQlVc2UgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCSogc3BhY2VzLmM6IFJlbW92ZSBwcm90b3R5cGVzIGZvciBtYWxsb2MgYW5kIGZyZWUgd2hpY2ggYXJlCi0JYWxyZWFkeSBpbiBsaWJpYnJ0eS5oLgotCSogc3RyY2FzZWNtcC5jOiBVc2UgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCSogdmFzcHJpbnRmLmM6IEluY2x1ZGUgbGliaWJlcnR5LmggZm9yIGRlZmluaXRpb24gb2YgbWFsbG9jLgotCURvbid0IHJlZGVmaW5lIE5VTEwuCi0JKiB2cHJpbnRmLmM6IEluY2x1ZGUgc3RkYXJnLmggaWYgX19TVERDX18uCi0KLUZyaSBPY3QgMTEgMTU6NDI6MTIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXdpbmRvd3M6ICBBZGQgc3RyY2FzZWNtcC5vIHRvIEVYVFJBX09GSUxFUy4KLQotRnJpIE9jdCAxMSAxMToxNjozMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5jIChtcHdpZnlfZmlsZW5hbWUpOiBSZXdyaXRlIHRvIHNpbXBsaWZ5LCBhbmQgdG8gaGFuZGxlCi0JdXB3YXJkIGNvbXBvbmVudHMgY29ycmVjdGx5LgotCi1UdWUgT2N0ICA4IDA4OjU1OjM0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZSwgY29uZmlnL21oLXdpbmRvd3M6ICBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgdW5kZXIKLQlNU1ZDICh0aGUgTWljcm9zb2Z0IGJ1aWxkIGVudmlyb25tZW50KS4KLQotTW9uIE9jdCAgNyAxMDo1MDoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZubWF0Y2guYzogVW5kZWYgY29uc3QgaWYgbm90IF9fU1REQ19fLgotCi1UaHUgT2N0ICAzIDEzOjQ2OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgZm5tYXRjaC5jLgotCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgZm5tYXRjaC5vLgotCShmbm1hdGNoLm8pOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDE4IDE0OjQ5OjEzIDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRml4IGhhbmRsaW5nIG9mIGFkZHJlc3MgYXJncy4KLQkoZ251X3NwZWNpYWwpOiBIYW5kbGUgdHlwZV9pbmZvIHN0dWZmLgotCi1GcmkgU2VwIDEzIDE3OjUyOjU1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKERlYnVnUEkpOiBNYWtlIHNldHRhYmxlIGZyb20gdGhlIGVudiB2YXIgREVCVUdfUEFUSE5BTUVTLgotCShtcHdpZnlfZmlsZW5hbWUpOiBIYW5kbGUgIjo6LyIgY2FzZS4KLQotVGh1IFNlcCAxMiAxMzozMDo0MCAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtY3lnd2luMzI6IG5ldyBmaWxlIChuZWVkIC1ETkVFRF9iYXNlbmFtZSBhbmQKLQkJLURORUVEX3N5c19zaWdsaXN0IGZvciBuYXRpdmUgTlQgcmVidWlsZGluZykKLQkqIGNvbmZpZy50YWJsZSAoKi0qLWN5Z3dpbjMyKTogbmV3IGVudHJ5Ci0JKiBjaG9vc2UtdGVtcC5jOiBicmluZyBpbiBzeW5jIHdpdGggZ2NjIChyZXZlcnQgQXVnIDE3IGNoYW5nZSkKLQotVGh1IEF1ZyAyOSAxNjo0ODo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZSAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCi1UdWUgQXVnIDI3IDEzOjQ3OjU4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYyAocGV4ZWN1dGUpIFtNUFddOiBSZW1vdmUgb2xkIGJvZ3VzIGNvZGUgdGhhdAotCW1lc3NlZCB3aXRoIGFyZ3VtZW50cyB0aGF0IGluY2x1ZGVkIGEgJy8nLCBhZGQgZXNjYXBlIGNoYXJzCi0JdG8gZG91YmxlIHF1b3RlcywgcmVtb3ZlIGNvbnN0IGRlY2wgZnJvbSBhcmcgdGhhdCBNYWMKLQljb21waWxlcnMgZG9uJ3Qgc2VlbSB0byBsaWtlLgotCi1TYXQgQXVnIDE3IDA0OjQ0OjI3IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IFVwZGF0ZSB0ZXN0IGZvciB3aW4zMiAoJiYgISBjeWd3aW4zMikuCi0JKiBjaG9vc2UtdGVtcC5jOiBmaXggV0lOMzIgcHJlcHJvY2Vzc29yIGRlZmluZXMKLQotVGh1IEF1ZyAxNSAxMjoyNjo0OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIEBEQVNIX0NfRkxBR0AgYW5kIEBTRUdNRU5UX0ZMQUcoe0RlZmF1bHR9KUAKLQl0byBlZGl0aW5nIG9mIGRlZmF1bHQgbWFrZWZpbGUgcnVsZS4KLQotU3VuIEF1ZyAxMSAyMTowMzoyNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhbGxvY2Etbm9ybS5oOiAgSW5jbHVkZSA8bWFsbG9jLmg+IGlmIF9XSU4zMi4KLQkqIGFyZ3YuYzogIEluY2x1ZGUgbm9uLXByb3RvdHlwZWQgZGVjbHMgZm9yIG1hbGxvYyBhbmQgc3RyaW5nCi0JZnVuY3Rpb25zIGlmICEgX1dJTjMyIG9yIGlmIF9fR05VQ19fLgotCi1UaHUgQXVnICA4IDEyOjQyOjQwIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWcuaC12bXM6IE5ldyBmaWxlLgotCSogbWFrZWZpbGUudm1zOiBVc2UgaXQuCi0KLVdlZCBBdWcgIDcgMTc6MTY6MTIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmMgKF9nZXRvcHRfaW50ZXJuYWwpOiAgSWYgYXJnYyBpcyAwLCBqdXN0IHJldHVybiAoYmVmb3JlCi0Jd2UgcmVmZXJlbmNlICphcmd2IGFuZCBzZWdmYXVsdCkuCi0KLU1vbiBBdWcgIDUgMDE6Mjk6MDggMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogQWRkIG11bHRpbGliLm91dC4KLQotVGh1IEp1bCAxOCAxNzo0MDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS1ub3JtLmg6IENoYW5nZSAjaWZkZWYgc3BhcmMgdG8gI2lmIGRlZmluZWQgKHNwYXJjKSAmJgotCWRlZmluZWQgKHN1bikuICBGcm9tIEFuZHJldyBHaWVydGggPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPi4KLQotTW9uIEp1bCAgMSAxMzo0MDo0NCAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVR1ZSBNYXkgMjggMTU6Mjk6MDMgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIHZtc2J1aWxkLmNvbSAoUkVRVUlSRF9PRklMRVMpOiBBZGQgY2hvb3NlLXRlbXAubyBhbmQgeHN0cmR1cC5vLgotCi0JVGh1IEphbiAyNSAxODoyMDowNCAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogdm1zYnVpbGQuY29tOiBDaGFuZ2VzIHRvIGhhbmRsZSBERUZGVU5DKG9uX2V4aXQpLgotCShkb19vZmlsZXMpOiBBbGxvdyBub25leGlzdGVudCBzb3VyY2UgZmlsZSBpbiBwYXNzIDMuCi0JKGNoa19kZWZmdW5jKTogTmV3IHJvdXRpbmUuCi0KLVR1ZSBKdW4gMjUgMTk6MjQ6NDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYyAoUEVYRUNVVEVfVkVSQk9TRSk6IERlZmluZS4KLQkoTVBXIHBleGVjdXRlKTogQ2hlY2sgZmxhZ3MgJiBQRVhFQ1VURV9WRVJCT1NFIGluc3RlYWQgb2YgdmVyYm9zZV9mbGFnLgotCi1UdWUgSnVuIDI1IDIzOjExOjQ4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkb2NkaXIpOiBSZW1vdmVkLgotCi1UdWUgSnVuIDI1IDIzOjAxOjA3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChvbGRpbmNsdWRlZGlyKTogUmVtb3ZlZC4KLQotVHVlIEp1biAyNSAyMjo1MDowNyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoZGF0YWRpcik6IFNldCB0byAkKHByZWZpeCkvc2hhcmUuCi0KLVRodSBKdW4gMjAgMjE6MTc6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogUmVpbmRlbnQuICBBdm9pZCBlbmRsZXNzIGxvb3AgYnkKLQljaGVja2luZyBmb3IgZXJyb3JzIGZyb20gZG9fdHlwZS4KLQotVHVlIEp1biAxOCAxNDozNjoxOSAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBOZXcgZmlsZS4KLQkqIHhtYWxsb2MuYzogSWYgVk1TLCBpbmNsdWRlIDxzdGRsaWIuaD4gYW5kIDx1bml4bGliLmg+IHJhdGhlcgotCXRoYW4gZGVjbGFyaW5nIG1hbGxvYywgcmVhbGxvYywgYW5kIHNicmsuCi0KLU1vbiBKdW4gMTAgMTM6MTc6MTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogTmV3IGZpbGUuCi0KLVdlZCBKdW4gIDUgMTY6NTc6NDUgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHhtYWxsb2MuYzogRGVjbGFyZSBzYnJrLgotCi1TYXQgTWF5ICA0IDA1OjA4OjQ1IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxsb2NhLW5vcm0uaDogIEFkZCBTUEFSQ3dvcmtzIGNjIGNvbXBhdGlibGUgX19idWlsdGluX2FsbG9jYQotCWRlY2xhcmF0aW9uLgotCi1Nb24gQXByIDIyIDE4OjQxOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeHN0cmVycm9yLmM6IEluY2x1ZGUgPHN0ZGlvLmg+LgotCi1TdW4gQXByIDIxIDExOjU1OjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgYXRleGl0LmMuCi0KLVN1biBBcHIgMjEgMDk6NTA6MDkgMTk5NiAgU3RlcGhlbiBMIE1vc2hpZXIgIChtb3NoaWVyQHdvcmxkLnN0ZC5jb20pCi0KLQkqIGNob29zZS10ZW1wLmM6IEluY2x1ZGUgc3lzL3R5cGVzLmggYmVmb3JlIHN5cy9maWxlLmggZm9yIHNjbzMuMnY1LgotCi1XZWQgQXByIDE3IDExOjE3OjU1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNob29zZS10ZW1wLmM6IERvbid0ICNpbmNsdWRlIHN5cy9maWxlLmggaWZkZWYgTk9fU1lTX0ZJTEVfSC4KLQkjaW5jbHVkZSA8c3RkaW8uaD4KLQkqIGNvbmZpZy9tdC12eHdvcmtzNSAoSERFRklORVMpOiBEZWZpbmUgTk9fU1lTX0ZJTEVfSC4KLQotVHVlIEFwciAxNiAxMToyNzoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBJZiBhbGxvY2EubyBpcyBuZWVkZWQsIHNvIGlzIHhtYWxsb2Muby4KLQlSZXZlcnRzIEZlYiA4LCAxOTk1IGNoYW5nZS4KLQotTW9uIEFwciAxNSAxMjo1MzoyNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjaG9vc2UtdGVtcC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgY2hvb3NlLXRlbXAuYy4KLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIGNob29zZS10ZW1wLm8uCi0KLVNhdCBBcHIgMTMgMTQ6MTk6MzAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfdG9fZG91YmxlKTogIERvbid0IGJpYXMgZXhwb25lbnQgd2hlbgotCWhhbmRsaW5nIHplcm8ncywgZGVub3JtcyBvciBOYU5zLgotCi1UaHUgQXByIDExIDEzOjM2OjU2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSk6ICBGaXggYnVncyB3aXRoIGhhbmRsaW5nCi0JbnVtYmVycyB3aXRoIGZyYWN0aW9ucyA8IDMyIGJpdHMuCi0KLU1vbiBBcHIgIDggMTQ6NDg6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQotVHVlIE1hciAxOSAyMjowMjowNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IEZpeCBmb3Igbm9uLW1hbmdsZWQgcG9pbnRlcgotCWFyZ3VtZW50cy4KLQotRnJpIE1hciAgOCAxNzoyNDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgc3JjZGlyIGlzIGAuJyBhbmQgd2l0aF90YXJnZXRfc3ViZGlyIGlzIG5vdAotCWAuJywgdGhlbiBzZXQgTVVMVElTUkNUT1AgYmVmb3JlIGNhbGxpbmcgY29uZmlnLW1sLmluLgotCi1UaHUgTWFyICA3IDEzOjM3OjEwIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKG1wd19vcGVuKTogQWRkIGRlYnVnZ2luZyBvdXRwdXQgb3B0aW9uLgotCi1XZWQgTWFyICA2IDE3OjM2OjAzIDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRml4IGZvciBhZGRyZXNzLW9mLWV4dGVybiBhcmd1bWVudHMuCi0KLVR1ZSBGZWIgMjcgMTI6MDA6NTAgMTk5NiAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKG1wd2lmeV9maWxlbmFtZSk6IENoYW5nZSA2IHRvIDUgaW4KLQlzdHJuY21wICh1bml4bmFtZSwgIi90bXAvIiwgNSkuCi0KLVR1ZSBGZWIgMjAgMTA6NTU6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBJbml0aWFsaXplIGlzX2Jvb2wuICBDb3JyZWN0bHkKLQloYW5kbGUgMCBhcyBhIHBvaW50ZXIgdmFsdWUgcGFyYW1ldGVyLgotCi1Nb24gRmViICA1IDE2OjQxOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlcGVuZCB1cG9uIHJlcXVpcmVkLWxpc3QuCi0JKHJlcXVpcmVkLWxpc3QpOiBOZXcgdGFyZ2V0LgotCShjbGVhbik6IFJlbW92ZSByZXF1aXJlZC1saXN0LgotCi1XZWQgSmFuIDMxIDEwOjE5OjQxIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHdpbjMyLmM6IERlbGV0ZWQuCi0JKiBjb25maWcudGFibGUgKGkzODYtKi13aW4zMik6IERlbGV0ZWQuCi0JKiBjb25maWcvbWgtaTM4NndpbjMyOiBEZWxldGVkLgotCi1UaHUgSmFuIDE4IDExOjM0OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IENoYW5nZSBvcG5hbWUgcGFyYW1ldGVyIHRvCi0JY29uc3QgY2hhciAqLgotCShjcGx1c19tYW5nbGVfb3BuYW1lKTogQ2hhbmdlIHJldHVybiB0eXBlIGFuZCBvcG5hbWUgcGFyYW1ldGVyIHRvCi0JY29uc3QgY2hhciAqLiAgRG9uJ3QgY2FzdCByZXR1cm4gdmFsdWUuCi0KLVR1ZSBKYW4gMTYgMTI6MTM6MTEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuYzogSW5jbHVkZSBUaW1lci5oLCBpbiBvcmRlciB0byBnZXQgbTY4ayBNaWNyb3NlY29uZHMgdHJhcAotCWRlZmluaXRpb24uCi0KLVdlZCBKYW4gIDMgMTM6MTU6MDQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suYzogVXBkYXRlIGNvcHlyaWdodCB0byAxOTk2LgotCShfb2JzdGFja19tZW1vcnlfdXNlZCk6IERlZmluZSBuZXcgZnVuY3Rpb24uICBDYWxsZWQgdmlhCi0Jb2JzdGFja19tZW1vcnlfdXNlZCBtYWNyby4KLQotVGh1IERlYyAyOCAxMTozOTo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhzdHJkdXAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIHhzdHJkdXAuYy4KLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIHhzdHJkdXAuby4KLQkoeHN0cmR1cC5vKTogTmV3IHRhcmdldC4KLQotTW9uIERlYyAxMSAxODoxODo1MiAxOTk1ICBNaWtlIFN0dW1wICA8bXJzQGN5Z251cy5jb20+Ci0KLQkqIGF0ZXhpdC5jOiBOZXcgc3R1YiB0byBwcm92aWRlIGF0ZXhpdCBvbiBzeXN0ZW1zIHRoYXQgaGF2ZQotCW9uX2V4aXQsIGxpa2UgU3VuT1MgNC4xLnggc3lzdGVtcy4KLQkqIGZ1bmN0aW9ucy5kZWYgKG9uX2V4aXQsIGF0ZXhpdCk6IERpdHRvLgotCi1Nb24gRGVjIDExIDE1OjQyOjE0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKG1wd19hYm9ydCk6IFJlbW92ZSBkZWNsLgotCShtcHdfYWNjZXNzKTogTW92ZSBkZWJ1Z2dpbmcgcHJpbnRmLgotCi1TYXQgRGVjICAyIDAxOjI1OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBDb25zaXN0ZW50bHkgdXNlICR7aG9zdH0gcmF0aGVyIHRoYW4gJHt4aG9zdH0gb3IKLQkke3RhcmdldH0uCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJvdGhlciB0byBzZXQgJHt4aG9zdH0gYmVmb3JlIGNhbGxpbmcKLQljb25maWcudGFibGUuCi0KLVR1ZSBOb3YgMjggMTQ6MTY6NTcgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmMubyk6IFVzZSB0ZXN0IGluc3RlYWQgb2YgdGhlIGxlZnQgYnJhY2tldCwgdG8KLQlhdm9pZCBwcm9ibGVtcyB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgbWFrZS4KLQotVHVlIE5vdiAyOCAxMTo0NToxNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRml4IElOQ0RJUiBlZGl0IHRvIHdvcmsgd2l0aCBOb3YgMTQgY2hhbmdlLgotCi1UdWUgTm92IDIxIDExOjI2OjM0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL21oLWhwdXg6IFJlbW92ZS4gIEl0IHdhcyBvbmx5IHVzZWQgdG8gZGVmaW5lIEVYVFJBX09GSUxFUywKLQl3aGljaCB3YXMgc2V0IHRvIGp1c3QgYWxsb2NhLm8sIHdoaWNoIGlzIG5vdyBhdXRvbWF0aWNhbGx5IG1hcmtlZAotCWFzIG5lZWRlZCBieSB0aGUgYXV0b2NvbmZpZ3VyYXRpb24gcHJvY2Vzcy4KLQotVHVlIE5vdiAyMSAxNDoxNTowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogQ2hlY2sgJHt3aXRoX2Nyb3NzX2hvc3R9IHJhdGhlciB0aGFuIGNvbXBhcmluZwotCSR7aG9zdH0gYW5kICR7dGFyZ2V0fS4KLQotVGh1IE5vdiAxNiAxNDozNDo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgd2l0aF90YXJnZXRfc3ViZGlyIGlzIGVtcHR5LCBzZXQgeGhvc3QgdG8KLQkke2hvc3R9IHJhdGhlciB0aGFuICR7dGFyZ2V0fSBiZWZvcmUgY2FsbGluZyBjb25maWcudGFibGUuCi0KLVR1ZSBOb3YgMTQgMDE6Mzg6MzAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1VTFRJVE9QKTogRGVsZXRlZC4KLQkoTVVMVElTUkNUT1AsIE1VTFRJQlVJTERUT1ApOiBOZXcuCi0JKEZMQUdTX1RPX1BBU1MpOiBEZWxldGUgSU5DRElSLgotCShJTkNESVIpOiBBZGQgJChNVUxUSVNSQ1RPUCkuCi0JKGluc3RhbGxfdG9fbGliZGlyKTogQWRkICQoTVVMVElTVUJESVIpLiAgQ2FsbCAkKE1VTFRJRE8pLgotCSogY29uZmlndXJlLmluOiBEZWxldGUgY2FsbCB0byBjZmctbWwtY29tLmluLiAgQ2FsbCBjb25maWctbWwuaW4KLQlpbnN0ZWFkIG9mIGNmZy1tbC1wb3MuaW4uCi0JKGNyb3NzLWNvbXBpbGUgY2hlY2spOiBDaGFuZ2UgdG8gdGVzdCBmb3Igd2l0aF90YXJnZXRfc3ViZGlyLgotCShFWFRSQV9MSU5LUyk6IERlbGV0ZS4KLQotU3VuIE5vdiAxMiAxMjoxMzowNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIGdldHBhZ2VzaXplLmMubyB0byBuZWVkZWQtbGlzdC4KLQkqIG1wdy5jIFtVU0VfTVdfSEVBREVSU106IENvbmRpdGlvbmFsaXplIGNvbXBpbGluZyBvZgotCWZ1bmN0aW9ucyB0aGF0IGFyZSBzdXBwbGllZCBieSBNZXRyb3dlcmtzIGxpYnJhcmllcy4KLQkoZnN0YXQpOiBDbGVhbiB1cCBkZXNjcmlwdG9yLT5wb2ludGVyIGNvbnZlcnNpb24gY29kZS4KLQkoSW5zdGFsbENvbnNvbGUsIGV0Yyk6IEVtcHR5IGRlZmluaXRpb25zLCBmb3Igd2hlbiBsaW5raW5nCi0Jd2l0aCBTSU9VWC4KLQotU3VuIE5vdiAgNSAxOToyNToyNyAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiAgQWxzbyBwYXNzIFBJQ0ZMQUdTLgotCSguYy5vKTogIFN0eWxpc3RpYyBjaGFuZ2UuCi0KLVRodSBOb3YgIDIgMTI6MDY6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJ0b2wuYywgc3RydG91bC5jOiBEb24ndCBpbmNsdWRlIDxzdGRsaWIuaD4uICBGcm9tCi0JcGhkbUBpbmZvLnVjbC5hYy5iZSAoUGhpbGlwcGUgRGUgTXV5dGVyKS4KLQotV2VkIE5vdiAgMSAxMTo1OTozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29ycmVjdCBzZWQgY2FsbC4KLQotTW9uIE9jdCAzMCAxMzowMzo0NSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiAgQ2xlYW4gdXAgLyBzaW1wbGlmeSBmb3IgbmF0aXZlLgotCi0JKiBjb25maWd1cmUuaW46ICBNZXJnZSBpbiBzdHVmZiBmcm9tIC4uL3hpYmVydHkvY29uZmlndXJlLmluLgotCSogTWFrZWZpbGUuaW4gKENDKTogIEFkZCBkZWZpbml0aW9uIChzbyBpdCBjYW4gYmUgb3ZlcnJyaWRkZW4KLQlieSAuLi9jb25maWd1cmUpLgotCi1UdWUgT2N0IDI0IDE3OjU3OjI3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBMZWF2ZSBzdHJlcnJvci5jLm8gaW4gc3RhbmRhcmQgbGlzdCBvZiBmdW5jdGlvbnMuCi0JKiBtcHcuYyAoUl9PSywgRU5PRU5ULCBFQUNDRVNTLCBFTk9TWVMpOiBSZW1vdmUuCi0JKGxpbmspOiBSZW1vdmUgdXNlbGVzcyBkZWZpbml0aW9uIHdpdGggZXJyb3IgcmV0dXJuLgotCShsYXN0X21pY3Jvc2Vjb25kcywgd2Fybl9pZl9zcGluX2RlbGF5LCByZWNvcmRfZm9yX3NwaW5fZGVsYXkpOgotCVVzZSBVbnNpZ25lZFdpZGUgdHlwZSBmb3IgbWljcm9zZWNvbmQgY291bnRzLgotCi1UaHUgT2N0IDE5IDEwOjUyOjA3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIG1lbWNtcC5jIChtZW1jbXApOiBBcmd1bWVudCB0eXBlcyBhcmUgY29uc3Qgdm9pZCAqLCBub3Qgdm9pZAotCSpjb25zdC4KLQotCSogc3RybmNhc2VjbXAuYyAoc3RybmNhc2VjbXApOiBJbmNsdWRlIGFuc2lkZWNsLmgvc3RkYXJnLmgsIG5vdAotCXN5cy90eXBlcy5oLgotCSogc3RyY2FzZWNtcC5jIChzdHJjYXNlY21wKTogRGl0dG8uCi0KLVR1ZSBPY3QgMTAgMTE6MDM6MjQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6ICBSZW1vdmUgbWFjcm8uCi0KLVR1ZSBTZXAgMjYgMTU6MDY6NDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogQWRkIGRlZmF1bHQgZW1wdHkgZGVmaW5pdGlvbi4KLQkqIG1wdy1jb25maWcuaW4gKGNvbmZpZy5oKTogT25seSB1cGRhdGUgaWYgY2hhbmdlZC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBlZGl0cyBNYWtlZmlsZS5pbiBpbnRvIE1QVyBtYWtlZmlsZS4KLQkqIG1wdy5jOiBSZW1vdmUgc2VtaS1jbG9uZSBvZiBzdHJlcnJvciBjb2RlLgotCShzeXNfbmVyciwgc3lzX2Vycmxpc3QpOiBEZWZpbmUgaGVyZS4KLQkoTWljcm9zZWNvbmRzKTogT25seSBkZWZpbmUgYXMgQS1saW5lIHRyYXAgaWYgbTY4ayBNYWMuCi0KLVdlZCBTZXAgMjAgMTI6NTM6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciBkaXN0Y2xlYW4uCi0KLU1vbiBBdWcgMjggMTk6NDc6NTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogIEZvciBob3N0LCBnZW5lcmFsaXplIHJzNjAwMC1pYm0tYWl4KgotCXRvICotaWJtLWFpeCogc28gd2UgYWxzbyBpbmNsdWRlIHBvd2VycGMuCi0KLVR1ZSBBdWcgMjIgMDM6MTg6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JRnJpIEp1biAxNiAxODozNTo0MCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogeHN0cmVycm9yLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4sIHZtc2J1aWxkLmNvbTogQ29tcGlsZSBpdC4KLQotTW9uIEp1bCAzMSAxMjoxNjozMiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGUgKGkzODYtKi13aW4zMik6IE5ldy4KLQotRnJpIEp1bCAyMSAxMTozNTo1MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTVVMVElUT1ApOiBOZXcgdmFyaWFibGUuCi0JKE1VTFRJRElSUywgTVVMVElTVUJESVIsIE1VTFRJRE8sIE1VTFRJQ0xFQU4pOiBMaWtld2lzZS4KLQkoYWxsKTogQWRkIG11bHRpbGliIHN1cHBvcnQuCi0JKGluc3RhbGxfdG9fdG9vbGRpciwgKmNsZWFuKTogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMTAgMTE6NDc6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1ha2VmaWxlLmRvcyAoT0JKUyk6IEFkZCBoZXguby4gIEZyb20gREogRGVsb3JpZS4KLQotRnJpIEp1biAzMCAxNzoyODo1OSAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogdm1zYnVpbGQuY29tOiAgY3JlYXRlICJuZXctbGliLm9sYiIsIGJ1aWxkIGxpYmliZXJ0eSB1bmRlciB0aGF0Ci0JbmFtZSwgYW5kIHRoZW4gbWFrZSBpdCBiZWNvbWUgImxpYmVydHkub2xiIiB3aGVuIGRvbmUsIHNvIHRoYXQgYW4KLQlpbmNvbXBsZXRlIGJ1aWxkIGF0dGVtcHQgbmV2ZXIgbGVhdmVzIGJlaGluZCBzb21ldGhpbmcgd2hpY2ggbG9va3MKLQlsaWtlIGEgY29tcGxldGUgbGlicmFyeS4KLQotVGh1IEp1biAyOSAwMDoyMjowMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtaTM4NnBlOiBOZXcgZmlsZSBmb3IgUEUgaG9zdHMuCi0JKiBjb25maWcudGFibGU6IFVuZGVyc3RhbmQgUEUgaG9zdHMuCi0KLVdlZCBKdW4gMjggMTk6MTM6MjMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBVcGRhdGUgZnJvbSBnY2MuCi0KLQkqIGFyZ3YuYywgZHVtbXkuYzogSWYgX19TVERDX18sICNpbmNsdWRlICJhbGxvY2EtY29uZi5oIiBhZnRlcgotCTxzdGRkZWYuaD4uCi0JKiBhbGxvY2Etbm9ybS5oOiBJZiBfX1NURENfXywgZGVjbGFyZSBhbGxvY2Egd2l0aCBpdHMgcGFyYW1ldGVyLgotCi1UaHUgSnVuIDIyIDE4OjU3OjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2UuaW4gKEFMTF9DRkxBR1MpOiBEZWZpbmUgTkVFRF9iYXNlbmFtZS4KLQkqIG1wdy5jOiBPbmx5IHRlc3QgRGVidWdQSSBvbmNlIHdoZW5ldmVyIHByaW50aW5nIGRlYnVnIGluZm8uCi0JKG1wd2lmeV9maWxlbmFtZSk6IElmIGZpbGVuYW1lIGlzIC90bXAvZm9vLCBjaGFuZ2UgaXQgaW50byA6X2ZvbywKLQlhbHNvIGZpeCB0byBub3Qgd3JpdGUgb24gaW5wdXQgZmlsZW5hbWUgYnVmZmVyLgotCShtcHdfYWNjZXNzKTogVXNlIHN0YXQoKSBpbnN0ZWFkIG9mIG9wZW4oKSwgd29ya3MgZm9yIGRpcmVjdG9yaWVzCi0JYXMgd2VsbCBhcyBmaWxlcy4KLQotTW9uIEp1biAxOSAwMDozMzoyMiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IE1hc3NhZ2UgYnJva2VuIHNoZWxscyB0aGF0IHJlcXVpcmUgJ2Vsc2UgdHJ1ZScuCi0KLVNhdCBKdW4gMTcgMjM6MjE6NTggMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS1ub3JtLmg6IERlY2xhcmUgYWxsb2NhIGFzIHR5cGUgIlBUUiIgdG8gbWF0Y2ggZnVuY3Rpb25zLmRlZi4KLQlEZWNsYXJlIF9fYnVpbHRpbl9hbGxvY2EgaW4gdGhlIHNwYXJjIGNhc2UsIGFzIGFyZ3YuYyBkaWQuCi0JKiBhcmd2LmM6IFJlcGxhY2UgaW5saW5lIHZlcnNpb24gb2YgYWxsb2NhLW5vcm0uaCBhdCBzdGFydCBvZiBmaWxlIHdpdGgKLQlhICNpbmNsdWRlIG9mIGFsbG9jYS1jb25mLmguICBQcmVjZWRlIGl0IHdpdGggYW4gaW5jbHVkZSBvZiBhbnNpZGVjbC5oCi0JYmVjYXVzZSBhbGxvY2Etbm9ybS5oIG5lZWRzIHRvIGRlY2xhcmUgYWxsb2NhIGFzICJQVFIiLgotCi1Nb24gSnVuIDEyIDE0OjI0OjI2IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHdpbjMyLmM6IE5ldyBmaWxlLgotCi1GcmkgSnVuICA5IDE1OjE2OjE0IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBkdW1teS5jOiAjaW5jbHVkZSAiYWxsb2NhLWNvbmYuaCIuCi0KLVdlZCBKdW4gIDcgMTE6NDY6MjMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSBzdGFtcC1waWNkaXIuCi0JKGNsZWFuKTogRG9uJ3QuCi0KLU1vbiBKdW4gIDUgMTg6NDY6MDYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZSAoZnJhZ3MpOiBVc2UgdG9wbGV2ZWwgcGljIGZyYWdzLgotCi0JKiBNYWtlZmlsZS5pbiAoUElDRkxBRyk6IE5ldyBtYWNyby4KLQkoYWxsKTogRGVwZW5kIG9uIHN0YW1wLXBpY2Rpci4KLQkobmVlZGVkLWxpc3QpOiBEaXR0by4KLQkoLmMubyk6IEFsc28gYnVpbGQgcGljIG9iamVjdC4KLQkoc3RhbXAtcGljZGlyKTogTmV3IHJ1bGUuCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIHBpYy4KLQkoY2xlYW4pOiBSZW1vdmUgc3RhbXAtcGljZGlyLgotCi1GcmkgTWFyIDI0IDE2OjU1OjQ4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiB2bXNidWlsZC5jb20gKGNvbmZpZy5oKTogQWRkIGAjZGVmaW5lIE5FRURfYmFzZW5hbWUnLgotCi1UdWUgTWF5IDIzIDEwOjEyOjQ2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBjbG9jay5jLCBnZXRvcHQuYywgc3RydG9kLmMsIHZzcHJpbnRmLmM6ICBDaGFuZ2UgZnJvbSB1c2luZyBMR1BMCi0JdG8gbGliaW8tc3R5bGUgY29weXJpZ2h0LgotCSogZ2V0cGFnZXNpemUuYzogIFJlbW92ZSBGU0YgY29weXJpZ2h0LgotCi1TYXQgTWF5IDIwIDEyOjMwOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCUFkZGVkIGltcHJvdmVkIFZNUyBzdXBwb3J0IGZyb20gUGF0IFJhbmtpbjoKLQotCUZyaSBNYXIgMTcgMTg6NDA6MzYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHZtc2J1aWxkLmNvbTogIG5ldyBmaWxlLgotCi0JKiBnZXRwYWdlc2l6ZS5jIChnZXRwYWdlc2l6ZSk6ICBpbXBsZW1lbnQgZm9yIFZNUzsKLQkqIHN0cmVycm9yLmMgKHN0cmVycm9yLCBzdHJlcnJubywgc3RydG9lcnJubyk6ICBhZGQgcnVkaW1lbnRhcnkKLQlzdXBwb3J0IGZvciBFVk1TRVJSLgotCi1UaHUgTWF5IDE4IDE3OjAxOjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2FybV9leHQpOiBEZWZpbmUuCi0KLVR1ZSBNYXkgMTYgMTM6MzA6NTkgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGJhc2VuYW1lLmMsIGJjbXAuYywgZ2V0Y3dkLmMsIGluc3F1ZS5jLCByZW5hbWUuYywgc2lnc2V0bWFzay5jLAotCXN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgUmVtb3ZlIEZTRiBjb3B5cmlnaHQuCi0JKiBzaWdzZXRtYXNrLmM6ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLSBzZWVtcyB0byBiZSBuZWVkZWQgYnkgSVNDLgotCi1Nb24gTWF5IDE1IDE5OjUzOjE3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBiY29weS5jLCBiemVyby5jLCBtZW1jbXAuYywgbWVtY3B5LmMsIG1lbXNldC5jLCBzdHJjaHIuYywKLQlzdHJyY2hyLmMsIHN0cnN0ci5jLCB2Zm9yay5jOiAgUmVtb3ZlIEZTRiBDb3B5cmlnaHQsIGJlY2F1c2UgdGhpcwotCW1pZ2h0IGNvbnRhbWluYXRlIGxpYnN0ZGMrKyB3aXRoIHRoZSBMR1BMLiAgKE9LJ2QgYnkgUk1TIDExIE9jdCA5NC4pCi0JKiBzdHJjaHIuYywgc3RycmNoci5jOiAgQWRkIGNhc3QgdG8gc3VwcHJlc3MgY29uc3Qgd2FybmluZy4KLQotVGh1IE1heSAgNCAxNDozNjo0MiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IFVzZSBjb25zdCBpbnN0ZWFkIG9mIENPTlNULiAgRG9uJ3QgaW5jbHVkZQotCWFuc2lkZWNsLmggZGlyZWN0bHkuCi0KLVdlZCBBcHIgMTkgMDE6MzA6MjcgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBEb24ndCBpbmNsdWRlIGxpYmliZXJ0eS5oLiAgRG8gZGVjbGFyZSB4bWFsbG9jIGFuZAotCXhyZWFsbG9jLgotCSgtRE1BSU4pOiBEb24ndCByZWx5IG9uIGFuIGV4dGVybmFsbHktZGVmaW5lZCB2ZXJzaW9uIG51bWJlcjsKLQlpbnN0ZWFkLCByZXF1aXJlIHRoZSB2ZXJzaW9uIG51bWJlciB0byBiZSBkZWZpbmVkIGFzIGEKLQlwcmVwcm9jZXNzb3IgbWFjcm8uICBIYW5kbGUgdGhlIFJTLzYwMDAgbGVhZGluZyBkb3QuICBEZWZpbmUKLQl4bWFsbG9jLCB4cmVhbGxvYyBhbmQgZmF0YWwuICBEb24ndCBzdHJpcCBhIGxlYWRpbmcgdW5kZXJzY29yZQotCWlmIHdlIGNvdWxkbid0IGRlbWFuZ2xlIHRoZSB3b3JkLgotCi1UdWUgQXByICA0IDEzOjAzOjUxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCShPbGQgbXB3LmMgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0JKiBtcHcuYyAod2FybmluZ190aHJlc2hvbGQpOiBEZWZhdWx0IHRvIC40IHNlYy4KLQkob3ZlcmZsb3dfY291bnQsIGN1cnJlbnRfcHJvZ3Jlc3MpOiBOZXcgZ2xvYmFscy4KLQkod2Fybl9pZl9zcGluX2RlbGF5KTogSW5jbHVkZSBjdXJyZW50IHByb2dyZXNzIHR5cGUsCi0Jc3VjaCBhcyBwcm9ncmFtIG5hbWUsIGluIG1lc3NhZ2UuCi0JKG1wd19zdGFydF9wcm9ncmVzcyk6IFNldCBjdXJyZW50X3Byb2dyZXNzIHZhcmlhYmxlIGZyb20gYXJnLgotCShtcHdfZW5kX3Byb2dyZXNzKTogUmVwb3J0IHNwaW4gZGVsYXlzIGJ5IHBvd2VyLW9mLXR3by1zaXplCi0JYnVja2V0cyBpbnN0ZWFkIG9mIGNvbnN0YW50LXNpemUgYnVja2V0cy4KLQotCSogbXB3LmM6IENsZWFuIHVwIGZvcm1hdHRpbmcsIHR5cGVzLCByZXR1cm5zLCBldGMuCi0JKEVOT1NZUyk6IERlZmluZS4KLQkobXB3X2ZyZWFkLCBtcHdfZndyaXRlKTogRGVmaW5lLgotCShzbGVlcCk6IERlZmluZSBjb3JyZWN0bHkuCi0KLQkqIG1wdy5jOiBOZXcgY29kZSB0byBpbXBsZW1lbnQgY3Vyc29yIHNwaW5uaW5nIHN1cHBvcnQuCi0JKHVtYXNrKTogTmV3IGZ1bmN0aW9uLgotCShtcHdfZm9wZW4sIG1wd19mc2Vlaywgc3RhdCwgZnN0YXQpOiBDYWxsIFBST0dSRVNTLgotCi0JKiBtcHcuYyAobXB3X2Jhc2VuYW1lLCBtcHdfbWl4ZWRfYmFzZW5hbWUpOiBOZXcgZnVuY3Rpb25zLCBmaW5kCi0JYmFzZW5hbWVzIGZvciBNUFcgYW5kIE1QVy9Vbml4IGZpbGVuYW1lcy4KLQkobXB3X3NwZWNpYWxfaW5pdCk6IE5ldyBmdW5jdGlvbiwgY2FsbHMgTWFjc2J1ZyBpZiBkZXNpcmVkLgotCi0JKiBtcHcuYzogQWRkIEdQTCBub3RpY2UuCi0JKG1wd2lmeV9maWxlbmFtZSk6IEFkZCBtb3JlIHRyYW5zZm9ybWF0aW9ucy4KLQkobXB3X2ZvcGVuKTogQ2FsbCBtcHdpZnlfZmlsZW5hbWUgb24gZmlsZSBuYW1lcy4KLQkocmVuYW1lKTogUmVtb3ZlLgotCShjaGRpciwgZ2V0Y3dkKTogQWRkIHNpbXBsZSBkZWZpbml0aW9ucy4KLQotCSogbXB3LmM6IFJhbmRvbSBjbGVhbnVwcywgcmVtb3ZlIHVudXNlZCBjb2RlIGJpdHMuCi0JQWRkZWQgY29weSBvZiBzdHJlcnJvci5jIGZvciBnY2MncyB1c2UuCi0JKHN0YXQsIGZzdGF0LCBfc3RhdCk6IE5ldyB2ZXJzaW9ucyBiYXNlZCBvbiBHdWlkbyB2YW4gUm9zc3VtIGNvZGUuCi0KLQkqIG1wdy5jIChtcHdfZnNlZWspOiBNYWtlIGl0IHdvcmsgY29ycmVjdGx5IHdoZW4gZG9pbmcgU0VFS19DVVIuCi0KLQkqIG1wdy5jIChzdGF0KTogUmVtb3ZlIGhhY2sgZGVmaW5pdGlvbiwgZ2V0IGZyb20gc3lzL3N0YXQuaC4KLQkoZm9yaywgdmZvcmssIGV0Yyk6IFByaW50IGVycm9yIG1lc3NhZ2VzIGlmIGNhbGxlZC4KLQkoZ2V0cnVzYWdlLCBzYnJrLCBlbnZpcm9uLCBpc2F0dHksIGxpbmssIHV0aW1lLCBta2Rpciwgcm1kaXIsCi0JcmVuYW1lLCBjaG93bik6IERlZmluZS4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0JKiBtcHcuYzogTmV3IGZpbGUsIE1QVyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzLgotCi1GcmkgTWFyIDI0IDE0OjEwOjMwIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBiYXNlbmFtZS5jOiBJbmNsdWRlIGNvbmZpZy5oIGJlZm9yZSBjaGVja2luZyBmb3IgTkVFRF9iYXNlbmFtZS4KLQotVGh1IE1hciAyMyAxOTowOTo1NCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogZnVuY3Rpb25zLmRlZjogQWRkIERFRkZVTkMgZm9yIGJhc2VuYW1lLgotCi0JKiBiYXNlbmFtZS5jOiBPbmx5IGRlZmluZSBiYXNlbmFtZSBpZiBORUVEX2Jhc2VuYW1lLgotCi1UaHUgTWFyIDE2IDEzOjM2OjA1IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IEZpeCAtLWVuYWJsZS1zaGFyZWQgbG9naWMgZm9yIG5hdGl2ZSBidWlsZHMuCi0KLU1vbiBNYXIgMTMgMTE6MDU6MTEgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IERlbWFuZ2xlIGJvb2wgbGl0ZXJhbHMgcHJvcGVybHkuCi0KLU1vbiBNYXIgIDYgMjM6NTc6MjggMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogc3RydG9sLmMgc3RydG91bC5jOiAgUmVwbGFjZSB0aGVzZSB3aXRoIGxlc3MgYnVnZ3kgdmVyc2lvbnMgZnJvbQotCU5ldEJTRC4gIChzdHJ0b3VsIGluIHBhcnRpY3VsYXIgY291bGRuJ3QgaGFuZGxlIGJhc2UgMTYuKQotCi1XZWQgTWFyICAxIDE1OjU5OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXZ4d29ya3M1IChIREVGSU5FUyk6IERlZmluZSBOT19TWVNfUEFSQU1fSC4KLQotCSogY2xvY2suYzogSWYgTk9fU1lTX1BBUkFNX0ggaXMgZGVmaW5lZCwgZG9uJ3QgaW5jbHVkZQotCTxzeXMvcGFyYW0uaD4uCi0JKiBnZXRjd2QuYywgZ2V0cGFnZXNpemUuYywgZ2V0cnVudGltZS5jOiBMaWtld2lzZS4KLQotRnJpIEZlYiAxNyAxNTo0MDo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdldHJ1bnRpbWUuYyAoZ2V0X3J1bl90aW1lKTogRG9uJ3QgYXNzdW1lIHRoYXQgQ0xPQ0tTX1BFUl9TRUMgaXMKLQlhIG51bWJlcjsgQU5TSSBhcHBlYXJzIHRvIHBlcm1pdCBhbnkgZXhwcmVzc2lvbiwgaW5jbHVkaW5nIGEKLQlmdW5jdGlvbiBjYWxsLgotCi0JKiBjb25maWcudGFibGUgKCotKi12eHdvcmtzNSopOiBVc2UgbXQtdnh3b3JrczUgd2hlbiBjb25maWd1cmluZwotCXhpYmVydHkuCi0JKiBjb25maWcvbXQtdnh3b3JrczU6IE5ldyBmaWxlLgotCi1UaHUgRmViICA5IDE0OjE5OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmFzZW5hbWUuYyAoYmFzZW5hbWUpOiBDaGFuZ2UgYXJndW1lbnQgdG8gYmUgY29uc3QuCi0KLVdlZCBGZWIgIDggMTg6MDY6NTIgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBEb24ndCB3b3JyeSBhYm91dCB4bWFsbG9jLgotCi1TdW4gSmFuIDE1IDAwOjQwOjM2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRGVsZXRlIHhob3N0LW1rZnJhZy4KLQotVGh1IEphbiAxMiAxNjo1NDoxOCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IElmIGFsbG9jYS5vIGlzIG5lZWRlZCwgc28gaXMgeG1hbGxvYy5vLgotCi1XZWQgSmFuIDExIDIyOjM5OjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGhleC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMsIENGSUxFUyk6IExpc3QgaXQuCi0JKGhleC5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IEZvciBHTlUgc3R5bGUgY29uc3RydWN0b3IgYW5kCi0JZGVzdHJ1Y3RvciBuYW1lcywgdHJ5IGRlbWFuZ2xpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3RyaW5nLgotCi1XZWQgRGVjIDI4IDAwOjQ5OjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogdmFzcHJpbnRmLmMgKGludF92YXNwcmludGYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh2YXNwcmludGYpOiBVc2UgaW50X3Zhc3ByaW50Zi4gIFJlbW92ZXMgYXNzdW1wdGlvbiB0aGF0IHZhX2xpc3QKLQlpcyBhc3NpZ25tZW50IGNvbXBhdGlibGUuCi0KLVNhdCBOb3YgIDUgMTk6Mjk6MTIgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChMSUJDRkxBR1MpOiBOZXcgdmFyaWFibGUuCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGl0LgotCSguYy5vKTogVXNlIGl0LgotCi1UaHUgTm92ICAzIDE5OjA5OjQ3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdldG9wdC5jLCBnZXRvcHQxLmM6IERvIGNvbXBpbGUgdGhlc2UgZnVuY3Rpb25zIHVuZGVyIExpbnV4LAotCXNpbmNlIG1hbnkgbmF0aXZlIHZlcnNpb25zIGFyZSBiYXNlZCBvbiBnbGliYyBidXQgYXJlIGJ1Z2d5LgotCi1Nb24gT2N0IDI0IDE1OjE2OjQ2IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiB2YXNwcmludGYuYzogIE1ha2UgJ2Zvcm1hdCcgYXJnIGJlIGNvbnN0LCB0byBhdm9pZCBhIG1pc21hdGNoCi0Jd2l0aCBwcm90b3R5cGUgaW4gR05VIGxpYmMuICBTdXBwb3J0IHN0ZGFyZy5oIGFzIHdlbGwgYXMgdmFyYXJncy5oLgotCi1UdWUgT2N0IDExIDE3OjQ4OjI3IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUkVRVUlSRURfT0ZJTEVTKTogQWRkIHZhc3ByaW50Zi5vLgotCSogZnVuY3Rpb25zLmRlZjogUmVtb3ZlIHZhc3ByaW50Zi4KLQotV2VkIFNlcCAxNCAxNzowNDo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYyAoZmlyc3RfYnJlYWspOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBSZWNvcmQgc2JyayAoMCkgaW4gZmlyc3RfYnJlYWsuCi0JKHhtYWxsb2MpOiBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywgdHJ5IHRvIHJlcG9ydCBob3cgbXVjaAotCW1lbW9yeSB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBwcm9ncmFtIHVwIHRvIHRoaXMgcG9pbnQuCi0JKHhyZWFsbG9jKTogTGlrZXdpc2UuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogTWFrZWZpbGUuaW4gKEVSUk9SU19DQyk6IE5ldyB2YXJpYWJsZSwgZGVmYXVsdGVkIHRvICQoQ0MpLiAgVXNlIGl0Ci0Jd2hlbiBsaW5raW5nIGR1bW15LgotCSogY29uZmlnLnRhYmxlOiBBZGQgaG9zdCBSSVNDaVggTWFrZWZpbGUgZnJhZy4KLQkqIGNvbmZpZy9taC1yaXNjaXg6IE5ldyBmaWxlLgotCi1UaHUgQXVnIDI1IDE3OjI5OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBEZWZpbmUuCi0JKCQoUlVMRTEpKTogVXNlICQoRkxBR1NfVE9fUEFTUykuCi0KLVdlZCBBdWcgMjQgMTc6MDg6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB2YXNwcmludGYuYzogSW5jbHVkZSA8c3RyaW5nLmg+LgotCSh2YXNwcmludGYpOiBBZGQgY2FzdHMgdG8gdm9pZCBmb3IgdmFfYXJnIHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KLQkqIHhhdGV4aXQuYzogRGVjbGFyZSBtYWxsb2MuCi0KLUZyaSBBdWcgMTkgMTU6Mjk6MTIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FyZ3MpOiBGaXggYSBidWcgaW4gcHJldmlvdXMgcGF0Y2ggKHRoZQotCW9uZSBiZWxvdykuCi0KLVRodSBBdWcgMTggMTQ6Mzc6MTQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlIGFyZ3MpOiBIYW5kbGUgQVJNIHJlcGVhdCBlbmNvZGluZyB3aGVyZQotCXRoZSB0eXBlIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiA5LgotCi1XZWQgQXVnIDE3IDE2OjEzOjQ5IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQpOiBhY2NlcHQgb3B0aW9uYWwgJ18nIGJldHdlZW4KLQlxdWFsaWZpZWQgbmFtZS4gVGhpcyBpcyBiYWVjYXVzZSB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgZW5kIHdpdGgKLQludW1lcmljIGFuZCBjYW4gbWl4ZWQgdXAgd2l0aCB0aGUgbGVuZ3RoIG9mIG5leHQgcXVhbGlmaWVkIG5hbWUuCi0KLVdlZCBBdWcgIDMgMDU6NTI6MTQgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtc3Vub3M0OiBVc2Ugb3VyIHN0YW5kYXJkIGxvY2F0aW9uIGZvciBjcm9zcy1pbmNsdWRlcwotCWFuZCBjcm9zcy1saWJzIHdoZW4gdGhlIHRhcmdldCBpcyBhbHNvIGEgImhvc3QiIGVudmlyb25tZW50IChpZSBubwotCW5ld2xpYjsgaW5jbHVkZXMgYW5kIHN1Y2ggZG9uJ3QgYmVsb25nIHRvIHVzKS4gIFRoaXMgaXMgc3BlY2lmaWMKLQl0byB0aGUgQ3lnbnVzIFN1cHBvcnQgZW52aXJvbm1lbnQuCi0KLVR1ZSBBdWcgIDIgMTU6MjU6MTIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogZGVtYW5nbGUgYXMgeHh4PCdRJz4gbm90Ci0JeHh4PGNoPTgxPi4KLQotTW9uIEF1ZyAgMSAxNzowMjo0OCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAobWFpbik6IGZsdXNoIHN0ZG91dCB0byBtYWtlIHBpcGUgd29yay4KLQotU2F0IEp1bCAxNiAxMjo1NjozMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZSAoKi0qLWN4dXg3Kik6ICBSZWNvZ25pemUuCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF9tODgxMTBfZXh0KSBbSEFSUklTX0ZMT0FUX0ZPUk1BVF06Ci0JSGFycmlzLXNwZWNpZmljIGZsb2F0IGZvcm1hdC4KLQkqIGNvbmZpZy9taC1jeHV4NzogTmV3IGZpbGUuCi0KLVdlZCBKdW4gMjkgMDA6MjY6MTcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiAgTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdCBvZgotCWNvbnN1bWVfY291bnQgZG9lc24ndCBpbmRleCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotCi1Nb24gSnVuIDIwIDIzOjU0OjM3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogIEhhbmRsZSB2dGFibGUgbWFuZ2xpbmcgb2YgZ2NjLTIuNC41IGFuZAotCWVhcmxpZXIuIEltcHJvdmUgdGVzdCBmb3IgbmV3IHZ0YWJsZSBtYW5nbGluZy4gQ2hhbmdlIG91dHB1dCBiYWNrCi0JdG8gYHZpcnR1YWwgdGFibGUnLgotCi1Nb24gSnVuIDIwIDExOjM3OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jOiBBbHdheXMgY29tcGlsZSB0aGlzIGNvZGUsIGV2ZW4gaWYgdXNpbmcgdGhlIEdOVQotCWxpYnJhcnkuICBBdm9pZHMgcHJvYmxlbXMgd2l0aCByZWxhdGl2ZWx5IHJlY2VudCBiaW5hcnkKLQlpbmNvbXBhdGliaWxpdHkuCi0KLVRodSBKdW4gMTYgMTc6NTQ6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoeG1hbGxvYywgeHJlYWxsb2MsIGZyZWUpOiBEb24ndCBkZWNsYXJlLgotCShzdHJzdHIpOiBEb24ndCBkZWNsYXJlIHBhcmFtZXRlcnMuCi0JKHhtYWxsb2MsIHhyZWFsbG9jKTogRG9uJ3QgZGVmaW5lLgotCShsb25nX29wdGlvbnMpOiBBZGQgbm8tc3RyaXAtdW5kZXJzY29yZXMuCi0JKG1haW4pOiBDYWxsIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZS4gIFBhc3MgbiBpbiBzaG9ydCBvcHRpb25zIHRvCi0JZ2V0b3B0X2xvbmcuICBIYW5kbGUgb3B0aW9uICduJyB0byBub3Qgc3RyaXAgdW5kZXJzY29yZXMuCi0JKHVzYWdlKTogTWVudGlvbiAtbiBhbmQgLS1uby1zdHJpcC11bmRlcnNjb3Jlcy4KLQotU3VuIEp1biAxMiAwMTozNzowOSAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogU2VwYXJhdGUgY29uc2VjdXRpdmUgPidzIHdpdGggYQotCXNwYWNlLgotCShnbnVfc3BlY2lhbCk6IERlbWFuZ2xlIHRlbXBsYXRlIGFuZCBxdWFsaWZpZWQgbmFtZXMgaW4gYSB2dGFibGUgbmFtZS4KLQotRnJpIE1heSAyNyAxMjoyNzo1MiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JRnJvbSBnYXMtMi4zIGFuZCBiaW51dGlscy0yLjQgbmV0IHJlbGVhc2VzOgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIG1ha2VmaWxlLmRvczogW25ld10gTWFrZWZpbGUgZm9yIGRvcy9nbzMyCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgZm9yIGxhdGVzdCBmaWxlcwotCSogbXNkb3MuYzogcmVtb3ZlIHNvbWUgZnVuY3Rpb25zIG5vdyBpbiBsaWJjLmEKLQotRnJpIE1heSAyMCAxODo1MzozMiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogIFJlY29nbml6ZSB0aHVua3MsIGFzIHdlbGwgYXMKLQl0aGUgbmV3IG5hbWluZyBzdHlsZSBmb3IgdnRhYmxlcyAod2hlbiAtZnZ0YWJsZS10aHVua3MpLgotCi1XZWQgTWF5IDE4IDEzOjM0OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFhUUkFGTEFHUyk6IERvbid0IGRlZmluZS4KLQkoLmMubywgZHVtbXkubyk6IERvbid0IHVzZSBYVFJBRkxBR1MuCi0JKCQoUlVMRTEpKTogRG9uJ3QgcGFzcyBYVFJBRkxBR1MgZG93biBpbiByZWN1cnNpdmUgY2FsbC4KLQotRnJpIE1heSAxMyAxNjowMjoxMiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdmFzcHJpbnRmLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWY6IEFkZCBpdC4KLQotRnJpIE1heSAxMyAxNjoyMDoyOCAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IEdyb2sgYm9vbC4KLQotRnJpIE1heSAgNiAxNDo0NDoyMSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IEFkZCBnbzMyCi0JKiBjb25maWcvbWgtZ28zMjogTmV3IHRlbXBsYXRlLgotCi1GcmkgTWF5ICA2IDExOjAxOjU5IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZSwgY29uZmlnL210LXN1bm9zNDogY29uZmlnIGZvciB3aGVuIHN1bjQgaXMgY3Jvc3MgdGFyZ2V0LgotCi1Nb24gQXByIDExIDAwOjU0OjMzIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIChybXNAbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotCSogZ2V0b3B0LmMgW25vdCBfX0dOVV9MSUJSQVJZX19dIFtfX0dDQ19fXSBbbm90IF9fU1REQ19fXToKLQlEZWNsYXJlIHN0cmxlbiB0byByZXR1cm4gaW50LiAgRG9uJ3QgaW5jbHVkZSBzdGRkZWYuaC4KLQotRnJpIEFwciAgMSAwMDozODoxNyAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGdldG9wdC5jOiBEZWxldGUgdXNlIG9mIElOX0dDQyB0byBjb250cm9sIHdoZXRoZXIKLQlzdGRkZWYuaCBvciBnc3RkZGVmLmggaXMgaW5jbHVkZWQuCi0KLVRodSBBcHIgMTQgMTQ6MDA6NTYgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IEZpeCBhIGJ1ZyBpbiB0ZW1wbGF0ZSBmdW5jdGlvbgotCXR5cGUgbnVtYmVyaW5nLgotCi1XZWQgQXByIDEzIDE3OjIzOjAzIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiBGaXggdGVtcGxhdGUgZnVuY3Rpb24gd2l0aCBhcm0KLQlzdHlsZSBhcmd1bWVudCB0eXBlIG51bWJlciwgVG4uCi0KLVdlZCBBcHIgMTMgMTc6MTE6MTUgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChvcHRhYmxlKTogQWRkIG5ld1tdIGFuZCBkZWxldGVbXS4KLQotRnJpIEFwciAgOCAxMToyMTo0MiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYXJndi5jIChidWlsZGFyZ3YpOiBEb24ndCBwcm9kdWNlIGVtcHR5IGFyZ3VtZW50IGp1c3QgYmVjYXVzZQotCXRoZXJlIGlzIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi0KLVdlZCBBcHIgIDYgMTE6NDI6MTQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogZml4ICdRJyBxdWFsaWZpZWQgbmFtZSBidWcuCi0JSGFuZGxlICdwJyBzYW1lIGFzICdQJy4KLQkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogSGFuZGxlICdwJyBzYW1lIGFzICdQJy4KLQotU2F0IE1hciAyNiAxMjowMDoxMyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGdldF9maWVsZCwgcHV0X2ZpZWxkKTogIEZpeCBvZmYgYnkgb25lIGVycm9yIGluCi0JbGl0dGxlIGVuZGlhbiBjYXNlLgotCi1UaHUgTWFyIDI0IDEwOjQwOjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSk6IFBhc3MgdW5zaWduZWQgY2hhciAqLAotCW5vdCBjaGFyICosIHRvIHB1dF9maWVsZC4KLQotRnJpIE1hciAxOCAxMjozNDozMyAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogbWVtbW92ZS5jOiAgUmUtd3JvdGU7ICBwbGFjZWQgaW4gcHVibGljIGRvbWFpbi4KLQotV2VkIE1hciAxNiAxMDozMzowNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IElmIEFSTSBkZW1hbmdsaW5nLCBkb24ndCB0cmVhdAotCV9fUSogYXMgYSBjb25zdHJ1Y3Rvci4KLQotTW9uIE1hciAxNCAxMjoyNjowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGllZWUtZmxvYXQuYzogUmVtb3ZlZDsgbm8gbG9uZ2VyIHVzZWQuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQotTW9uIE1hciAgNyAxMjoyODoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGdldF9maWVsZCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0JKHB1dF9maWVsZCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0KLVN1biBGZWIgMjcgMjE6NTA6MTEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0LmM6IE5ldyBmaWxlLCBpbnRlbmRlZCB0byByZXBsYWNlIGllZWUtZmxvYXQuYy4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0KLVRodSBGZWIgMjQgMTE6NTE6MTIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogUmVtb3ZlICNpZmRlZiBHRVRPUFRfQ09NUEFUIGFuZCAjaWYgMCBjb2RlLgotCSAoX2dldG9wdF9pbml0aWFsaXplKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIF9nZXRvcHRfaW50ZXJuYWwuCi0JIChfZ2V0b3B0X2ludGVybmFsKToKLQkgSWYgbG9uZ19vbmx5IGFuZCB0aGUgQVJHVi1lbGVtZW50IGhhcyB0aGUgZm9ybSAiLWYiLCB3aGVyZSBmIGlzCi0JIGEgdmFsaWQgc2hvcnQgb3B0aW9uLCBkb24ndCBjb25zaWRlciBpdCBhbiBhYmJyZXZpYXRlZCBmb3JtIG9mCi0JIGEgbG9uZyBvcHRpb24gdGhhdCBzdGFydHMgd2l0aCBmLiAgT3RoZXJ3aXNlIHRoZXJlIHdvdWxkIGJlIG5vCi0JIHdheSB0byBnaXZlIHRoZSAtZiBzaG9ydCBvcHRpb24uCi0KLVRodSBGZWIgMTAgMTQ6NDQ6MTYgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQotCi0JKiBnZXRvcHQuYyBbbm90IF9fR05VX0xJQlJBUllfX10gW19fR05VQ19fXSBbbm90IElOX0dDQ106Ci0JVGVzdCBqdXN0IF9fU1REQ19fLCBub3QgZW1hY3MuCi0KLVdlZCBGZWIgIDkgMDA6MTQ6MDAgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQotCi0JKiBnZXRvcHQuYyBbbm90IF9fR05VX0xJQlJBUllfX10gW19fR05VQ19fXSBbbm90IElOX0dDQ10KLQlbZW1hY3NdIFtub3QgX19TVERDX19dOiBEb24ndCBpbmNsdWRlIHN0ZGRlZi5oLiAgRG9uJ3QgZGVjbGFyZSBzdHJsZW4uCi0KLUZyaSBEZWMgMjQgMTk6NDM6MDAgMTk5MyAgTm9haCBGcmllZG1hbiAgKGZyaWVkbWFuQG51dHJpbWF0LmdudS5haS5taXQuZWR1KQotCi0JKiBnZXRvcHQuYyAoX05PX1BST1RPKTogRGVmaW5lIGJlZm9yZSBjb25maWcuaCBpcyBpbmNsdWRlZC4KLQotTW9uIFNlcCAyMCAxNTo1OTowMyAxOTkzICBSb2xhbmQgTWNHcmF0aCAgKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQotCi0JKiBnZXRvcHQuYywgZ2V0b3B0MS5jIFtlbWFjcyB8fCBDT05GSUdfQlJPS0VUU106IEluY2x1ZGUKLQk8Y29uZmlnLmg+IG9ubHkgdW5kZXIgdGhlc2UsIGVsc2UgImNvbmZpZy5oIi4KLQotVGh1IEF1ZyAxMiAxODoxNjo0OSAxOTkzICBSb2xhbmQgTWNHcmF0aCAgKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQotCi0JKiBnZXRvcHQuYywgZ2V0b3B0MS5jIFtIQVZFX0NPTkZJR19IXTogSW5jbHVkZQotCTxjb25maWcuaD4gaW5zdGVhZCBvZiAiY29uZmlnLmgiLgotCi1TdW4gRmViIDIwIDE3OjE3OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25jYXQuYzogQ2hlY2sgQU5TSV9QUk9UT1RZUEVTIHJhdGhlciB0aGFuIF9fU1REQ19fIHRvIGRlY2lkZQotCXdoZXRoZXIgdG8gdXNlIHByb3RvdHlwZXMgb3Igbm90LgotCSogc3RyZXJyb3IuYyAoY29uc3QpOiBOZXZlciB1bmRlZmluZTsgbGV0IGFuc2lkZWNsLmggaGFuZGxlIGl0LgotCSogc3Ryc2lnbmFsLmMgKGNvbnN0KTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTcgMTM6Mjc6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB4YXRleGl0LmMgKF94ZXhpdF9jbGVhbnVwKTogRGVjbGFyZSBhcyBleHRlcm47IGRvbid0IGluaXRpYWxpemUuCi0JTWVyZ2luZyBjb21tb24gYW5kIGluaXRpYWxpemVkIHZhcmlhYmxlcyBuZWVkIG5vdCBiZSBzdXBwb3J0ZWQgYnkKLQlBTlNJIEMgY29tcGlsZXJzLgotCSh4YXRleGl0KTogSW5pdGlhbGl6ZSBfeGV4aXRfY2xlYW51cCBpZiBub3QgYWxyZWFkeSBzZXQuCi0JKiB4ZXhpdC5jOiBDb21tZW50IGZpeC4KLQotV2VkIEZlYiAxNiAwMToxNTozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYzogRG9uJ3QgZGVjbGFyZSB4ZXhpdDsgaXQncyBkZWNsYXJlZCBpbiBsaWJpYmVydHkuaC4KLQkoeHJlYWxsb2MpOiBJZiBvbGRtZW0gaXMgTlVMTCwgYWxsb2NhdGUgd2l0aCBtYWxsb2MsIHJhdGhlciB0aGFuCi0JYXNzdW1pbmcgdGhhdCByZWFsbG9jIHdvcmtzIGNvcnJlY3RseS4KLQotVHVlIEZlYiAxNSAwOToyNjoxNiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmNhdC5jLCBpZWVlLWZsb2F0LmM6ICBSZXBsYWNlIGluY2x1c2lvbiBvZiA8c3RyaW5nLmg+Ci0Jd2l0aCBleHBsaWNpdCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGFzIHJlY29tbWVuZGVkIGJ5IElhbiBUYXlsb3IuCi0KLVNhdCBGZWIgMTIgMTA6MzE6MTEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogVXNlIFBUUiBhbmQgc2l6ZV90IHRocm91Z2hvdXQuCi0JKG1hbGxvYywgcmVhbGxvYyk6IERlY2xhcmUuCi0KLVRodSBGZWIgMTAgMTc6MDg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcmd2LmMsIGJhc2VuYW1lLmM6IEluY2x1ZGUgYW5zaWRlY2wuaCBhbmQgbGliaWJlcnR5LmguCi0JKiBjb25jYXQuYywgZmRtYXRjaC5jLCBnZXRydW50aW1lLmMsIHNwYWNlcy5jOiBMaWtld2lzZS4KLQkqIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jLCB4YXRleGl0LmMsIHhleGl0LmM6IExpa2V3aXNlLgotCSogeG1hbGxvYy5jOiBMaWtld2lzZS4KLQkqIGNvbmNhdC5jOiBEb24ndCBkZWNsYXJlIHhtYWxsb2MuICBJZiBfX1NURENfXywgdXNlIDxzdGRhcmcuaD4KLQltYWNyb3MsIG5vdCA8dmFyYXJncy5oPiBtYWNyb3MuCi0JKiBzcGFjZXMuYyAoc3BhY2VzKTogTWFrZSByZXR1cm4gdHlwZSBjb25zdC4gIERvbid0IGNyYXNoIGlmCi0JbWFsbG9jIHJldHVybnMgTlVMTC4KLQkqIHN0cmVycm9yLmMgKHN0cnVjdCBlcnJvcl9pbmZvKTogTWFrZSBuYW1lIGFuZCBtc2cgZmllbGRzIGNvbnN0LgotCShlcnJvcl9uYW1lcyk6IE1ha2UgY29uc3QuCi0JKHN0cmVycm5vKTogTWFrZSBjb25zdC4KLQkoc3RydG9lcnJubyk6IE1ha2UgYXJndW1lbnQgY29uc3QuCi0JKiBzdHJzaWduYWwuYyAoc3RydWN0IHNpZ25hbF9pbmZvKTogTWFrZSBuYW1lIGFuZCBtc2cgZmllbGRzCi0JY29uc3QuCi0JKHNpZ25hbF9uYW1lcywgc3lzX3NpZ2xpc3QpOiBNYWtlIGNvbnN0LgotCShzdHJzaWduYWwsIHN0cnNpZ25vKTogTWFrZSBjb25zdC4KLQkoc3RydG9zaWdubyk6IE1ha2UgYXJndW1lbnQgY29uc3QuCi0JKiB4YXRleGl0LmM6IERlY2xhcmUgcGFyYW1ldGVyIHR5cGVzLgotCSogeG1hbGxvYy5jIChuYW1lKTogTWFrZSBjb25zdC4KLQkoeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lKTogTWFrZSBhcmd1bWVudCBjb25zdC4KLQkqIE1ha2VmaWxlLmluIChJTkNESVIpOiBEZWZpbmUuCi0JKC5jLm8pOiBVc2UgJChJTkNESVIpLgotCShkdW1teS5vKTogTGlrZXdpc2UuCi0JKGFyZ3YubywgYmFzZW5hbWUubyk6IE5ldyB0YXJnZXRzOyBkZXBlbmQgb24gbGliaWJlcnR5LmguCi0JKGNvbmNhdC5vLCBmZG1hdGNoLm8sIGdldHJ1bnRpbWUubywgc3BhY2VzLm8pOiBMaWtld2lzZS4KLQkoc3RyZXJyb3Iubywgc3Ryc2lnbmFsLm8sIHhhdGV4aXQubywgeGV4aXQubyk6IExpa2V3aXNlLgotCSh4bWFsbG9jLm8pOiBMaWtld2lzZS4KLQkoY3BsdXMtZGVtLm8pOiBOZXcgdGFyZ2V0OyBkZXBlbmQgb24gZGVtYW5nbGUuaC4KLQkoZ2V0b3B0Lm8sIGdldG9wdDEubyk6IE5ldyB0YXJnZXRzOyBkZXBlbmQgb24gZ2V0b3B0LmguCi0JKGllZWUtZmxvYXQubyk6IE5ldyB0YXJnZXQ7IGRlcGVuZCBvbiBpZWVlLWZsb2F0LmguCi0JKG9ic3RhY2subyk6IE5ldyB0YXJnZXQ7IGRlcGVuZCBvbiBvYnN0YWNrLmguCi0KLVR1ZSBGZWIgIDggMDU6Mjk6MDggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JSGFuZGxlIG9ic3RhY2tfY2h1bmtfYWxsb2MgcmV0dXJuaW5nIE5VTEwuICBUaGlzIGFsbG93cwotCW9ic3RhY2tzIHRvIGJlIHVzZWQgYnkgbGlicmFyaWVzLCB3aXRob3V0IGZvcmNpbmcgdGhlbQotCXRvIGNhbGwgZXhpdCBvciBsb25nam1wLgotCSogb2JzdGFjay5jIChfb2JzdGFja19iZWdpbiwgX29ic3RhY2tfYmVnaW5fMSwgX29ic3RhY2tfbmV3Y2h1bmspOgotCUlmIENBTExfQ0hVTktGVU4gcmV0dXJucyBOVUxMLCBzZXQgYWxsb2NfZmFpbGVkLCBlbHNlIGNsZWFyIGl0LgotCShfb2JzdGFja19iZWdpbiwgX29ic3RhY2tfYmVnaW5fMSk6IFJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgbm90LgotCi1UdWUgRmViICA4IDAwOjMyOjI4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uY2F0LmMsIGllZWUtZmxvYXQuYzogIEluY2x1ZGUgPHN0cmluZy5oPi4KLQotU3VuIEZlYiAgNiAyMToyODo0NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYyAoeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IEluY2x1ZGUgdGhlIG5hbWUgaW4gdGhlIGVycm9yIG1lc3NhZ2UsIGlmIHNldC4KLQotCSogUmVwbGFjZSBhdGV4aXQuYyB3aXRoIHhhdGV4aXQuYy4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpLCBmdW5jdGlvbnMuZGVmOiBDaGFuZ2UgcmVmZXJlbmNlcy4KLQotU2F0IEZlYiAgNSAxNDowMjozMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGdldHJ1bnRpbWUuYyAoZ2V0X3J1bl90aW1lKTogVXNlIGdldHJ1c2FnZSBvciB0aW1lcyBpZgotCUhBVkVfR0VUUlVTQUdFIG9yIEhBVkVfVElNRVMgYXJlIGRlZmluZWQuCi0KLUZyaSBGZWIgIDQgMTU6NDk6MzggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhdGV4aXQuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKSwgZnVuY3Rpb25zLmRlZjogQWRkIGl0LgotCSogeGV4aXQuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTLCBSRVFVSVJFRF9PRklMRVMpOiBBZGQgaXQuCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogQ2FsbCB4ZXhpdCBpbnN0ZWFkIG9mIGV4aXQuCi0JQ2hhbmdlIHJlcXVlc3QgZm9yIDAgYnl0ZXMgaW50byByZXF1ZXN0IGZvciAxIGJ5dGUuCi0KLVdlZCBGZWIgIDIgMTE6MzY6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogUHJpbnQgc2l6ZSB1c2luZyAlbHUsIGFuZCBjYXN0IHRvCi0JdW5zaWduZWQgbG9uZywgdG8gYXZvaWQgd2FybmluZ3MuCi0KLUZyaSBKYW4gMjggMTc6NDk6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZHVtbXkuYzogRG9uJ3QgaW5jbHVkZSB0aW1lLmggZXZlcjsgYWx3YXlzIGRlZmluZSBjbG9ja190IGFzCi0JInVuc2lnbmVkIGxvbmciLiAgVW50aWwgZ2NjL2ZpeGluY2x1ZGVzIGVuc3VyZXMgdGhhdCBjbG9ja190Ci0JZXhpc3RzLCBfX1NURENfXyBpc24ndCBhIHN1ZmZpY2llbnQgdGVzdC4gIEFuZCBpZiBjbG9jaygpIGRvZXNuJ3QKLQlleGlzdCwgY2xvY2tfdCBwcm9iYWJseSBkb2Vzbid0IGVpdGhlci4KLQotTW9uIEphbiAyNCAxMTo1MjozMSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNsb2NrLmMsIGdldHJ1bnRpbWUuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IEFkZCB0byBmaWxlIGxpc3RzLgotCSogZnVuY3Rpb25zLmRlZiAoY2xvY2spOiBBZGQgdG8gbGlzdC4KLQkqIGR1bW15LmMgKHRpbWUuaCk6IEFkZCBpZiBfX1NURENfXy4KLQkoY2xvY2tfdCk6ICNkZWZpbmUgYXMgInVuc2lnbmVkIGxvbmciIGlmIG5vdCBfX1NURENfXy4KLQotVHVlIEphbiAxMSAxMToyNzo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN0cnRvZC5jOiBEZWNsYXJlIGF0b2YuICBGcm9tIGVkbGVyQGphbi51bHRyYS5ueXUuZWR1IChKYW4KLQlFZGxlcikuCi0KLVR1ZSBEZWMgMjggMTQ6MTc6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZXJyb3JzKTogVXNlIENGTEFHUyBhcyB3ZWxsIGFzIExERkxBR1Mgd2hlbgotCWxpbmtpbmcuCi0KLUZyaSBEZWMgMTcgMTI6MjY6MDcgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogTmV3IGZ1bmN0aW9uLiAgQ29tbW9uIGNvZGUKLQlmb3IgQVJNIHRlbXBsYXRlIGRlbWFuZ2xpbmcuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfY2xhc3NfbmFtZSk6IFVzZSBkZW1hbmdsZV9hcm1fcHQuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogTGlrZXdpc2UuCi0KLVR1ZSBOb3YgMzAgMTU6NDc6NDggMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBBZGQgQ09OU1QgdG8gcGxlYXNlIGdjYy4KLQotU2F0IE5vdiAyNyAxMTowNTo1MCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCU1lcmdlIGNoYW5nZXMgZnJvbSB0b21AYmFzaWwuaWNjZS5ydWcubmwgKFRvbSBSLkhhZ2VtYW4pCi0JKiBzdHJlcnJvci5jLCBzdHJzaWduYWwuYzogIEFzIGEgc21hbGwgc3BhY2Ugb3B0aW1pemF0aW9uLCBkb24ndAotCWluY2x1ZGUgbWVzc2FnZXMgd2hlbiB0aGV5IGFyZW4ndCBhY3R1YWxseSB1c2VkLgotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIHRha2VmaXZlLmNvLmF0IWpvZSAoSm9zZWYgTGVoZXJiYXVlcikKLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgsIGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUsCi0JY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogIEZpeGVzIGZvciBzeXN0ZW1zIHdoZXJlIGNwbHVzX21hcmtlcgotCWlzIHNvbWV0aGluZyBvdGhlciB0aGFuICckJy4KLQotRnJpIE5vdiAyNiAxMzo1MToxMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogd2FpdHBpZC5jOiAgU2ltcGxlLW1pbmRlZCBhcHByb2NpbWF0aW9uIHRvIHdhaXRwaWQKLQl1c2luZyB2YW5pbGxhIHdhaXQuCi0JKiBmdW5jdGlvbnMuZGVmLCBNYWtlZmlsZS5pbjogIFVwZGF0ZSBhY2NvcmRpbmdseSwKLQotVGh1IE5vdiAxOCAxODowMToxNSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jKGRlbWFuZ2xlX3RlbXBsYXRlKTogZml4IGJ1ZyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0Jd2l0aCB2YWx1ZSBvZiB1c2VyIGRlZmluZWQgdHlwZS4KLQotV2VkIE5vdiAxNyAxODozMDoyMSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IGFkZCB0aGUgc3ViamVjdCBuZXcgZnVuY3Rpb24KLQl0byBzdXBwb3J0IHVuaWZpZWQgc2VhcmNoIG9mIG9wZXJhdG9yIGluIGNsYXNzLgotCi1XZWQgTm92IDEwIDA5OjQ3OjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JZ2NjIC1XYWxsIGxpbnQ6Ci0JKiBzdHJ0b3VsLmMgKHN0cnRvdWwpOiB1c2UgIihkaWdpdCA9ICpzKSAhPSAnXDAnIiBub3QganVzdAotCSJkaWdpdCA9ICpzIiBhcyBjb25kaXRpb24gaW4gd2hpbGUgbG9vcC4KLQotVHVlIE5vdiAgOSAxNTo1MjoyMiAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBTSEVMTCB0byByZWN1cnNpdmUgbWFrZQotCi1UaHUgTm92ICA0IDEyOjA5OjI2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiB2ZnByaW50Zi5jLCB2cHJpbnRmLmMsIHZzcHJpbnRmLmM6ICBNYWtlIGZvcm1hdCBhcmcKLQliZSAoY29uc3QgY2hhciopLCBmb3IgQU5TSSAoYW5kIGdjYyB3L2ZpeHByb3RvKSBjb25zaXN0ZW5jeS4KLQotVGh1IE5vdiAgNCAwODoyOTowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiBNYWtlICotKi1oaXV4KiB1c2UgbWgtaHB1eC4KLQotRnJpIE9jdCAyMiAwNzo1MzoxNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgotCi1UdWUgT2N0IDE5IDE3OjEyOjAxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IGVuc3VyZSB0aGF0IG9iamVjdCBmaWxlIG5hbWVzIGFyZQotCSAgbm90IGR1cGxpY2F0ZWQsIGFzIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBvYmplY3QgZmlsZSBpbgotCSAgYSBsaWJyYXJ5IGNhdXNlcyBwcm9ibGVtcyBvbiBzb21lIG1hY2hpbmVzCi0KLU1vbiBPY3QgMTggMjE6NTk6MjggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0cmNhc2VjbXAuYywgc3RybmNhc2VjbXAuYzogQ2hhbmdlIHVfY2hhciB0byB1bnNpZ25lZCBjaGFyLgotCi1GcmkgT2N0IDE1IDIyOjE3OjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogc3RybmNhc2VjbXAuYzogbmV3IGZpbGUsIGltcGxlbWVudHMgc3RybmNhc2VjbXAKLQkqIHN0cmNhc2VjbXAuYzogbmV3IGZpbGUsIGltcGxlbWVudCBzdHJjYXNlY21wCi0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBsaXN0IHRoZXNlIHR3byBuZXcgc291cmNlIGZpbGVzCi0KLQkqIGZ1bmN0aW9ucy5kZWY6IGFkZCBzdHJjYXNlY21wIGFuZCBzdHJuY2FzZWNtcCBlbnRyaWVzCi0KLUZyaSBPY3QgMTUgMTQ6NTM6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdHJ0b3VsLmMgKHN0cnRvdWwpLCBzdHJ0b2wuYyAoc3RydG9sKTogSGFuZGxlIG92ZXJmbG93Ci0JYWNjb3JkaW5nIHRvIEFOU0kgQy4KLQotVGh1IE9jdCAxNCAxNjozNDoxOSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBhZGQgc3VwcG9ydCBvZiBBUk0gZ2xvYmFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IsCi0JYW5kICdHJyBmb3IgcGFzc2luZyByZWNvcmQgb3IgdW5pb24gaW4gcGFyYW1ldGVyLgotCi1XZWQgT2N0IDEzIDEzOjM2OjE5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRml4IGNvbW1lbnQgdG8gY2xhcmlmeSB0aGF0IHN0dWZmIGluIFJFUVVJUkVEX09GSUxFUwotCXNob3VsZCBub3QgYmUgaW4gZnVuY3Rpb25zLmRlZi4KLQotV2VkIE9jdCAxMyAxMzoxMzozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGZ1bmN0aW9ucy5kZWY6IFJlbW92ZWQgeG1hbGxvYy4gIFN0dWZmIGluIFJFUVVJUkVEX09GSUxFUyBzaG91bGQKLQlub3QgYmUgaW4gZnVuY3Rpb25zLmRlZi4KLQotTW9uIE9jdCAgNCAxODoyNjozOSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBjaGFuZ2UgZ2xvYmwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0byBwcm9wZXIgbmFtZQotCi1UdWUgU2VwIDI4IDE4OjExOjA3IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IGZpeCBidWcgaW4gY29uc3RydWN0b3IvZGVzdHJ1Y3RvcgotCi1UdWUgU2VwIDI4IDE2OjIwOjQ5IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IHN1cHBvcnQgYm90aCBvbGQgYW5kIG5ldyBfdnQkLi4uIHZ0YmwgbWFuZ2xlZCBuYW1lcwotCi1GcmkgU2VwIDI0IDE5OjA3OjE2IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogRml4IGRlbWFuZ2xlX3RlbXBsYXRlIHByb3RvdHlwZQotCi1GcmkgU2VwIDI0IDE3OjMyOjU1IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IGZpeCB0ZW1wbGF0ZSBkZW1hbmdsaW5nCi0JKiBjcGx1cy1kZW0uYzogZml4IGNvbnN0IHR5cGUgZGVtYW5nbGluZwotCSogY3BsdXMtZGVtLmM6IGZpeCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yLCB2aXJ0dWFsIHRhYmxlLAotCXF1YWxpZmllciwgZ2xvYmFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZGVtYW5nbGluZwotCi1XZWQgU2VwICAxIDIzOjEzOjExIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYywgc3RyZXJyb3IuYzogVXNlIGZ1bGx5LWJyYWNrZXRlZCBpbml0aWFsaXplciB0bwotCWtlZXAgZ2NjIC1XYWxsIGhhcHB5LgotCi1GcmkgQXVnIDI3IDEwOjMwOjA5IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEFkZCBDT05TVFMgdG8gbWFrZSBnY2MgaGFwcHkgd2l0aCBsYXN0Ci0JcGF0Y2guCi0KLUZyaSBBdWcgMjcgMTE6MjQ6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQlQYXRjaCBmcm9tIFBhdWwgRmxpbmRlcnM6Ci0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IERlYWwgd2l0aCBhcnJheXMuCi0KLVR1ZSBBdWcgMjQgMTQ6MjM6NTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQ6IERlYWwgd2l0aCBHTlUgZm9ybWF0IGZvciBtb3JlCi0JdGhhbiA5IGNsYXNzZXMuCi0KLVdlZCBBdWcgMTggMTk6NTA6MjkgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkdW1teS5vKTogUmVkaXJlY3QgdG8gL2Rldi9udWxsIHRvIGF2b2lkICJ2YXJpYWJsZQotCW5vdCBpbml0aWFsaXplZCIgd2FybmluZ3MgdW5kZXIgSFAvVVgKLQotU3VuIEF1ZyAxNSAyMDo0Mjo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3RyZXJyb3IuYzogTW92ZSBpbmNsdWRlIG9mIHN0ZGlvLmggYWZ0ZXIgc3lzX2Vycmxpc3QgI2RlZmluZS4KLQlBbHNvIHJlbW92ZSBOVUxMIGRlZmluaXRpb24gKHN0ZGlvLmggYWx3YXlzIGRlZmluZXMgTlVMTCwgc28gaXQKLQluZXZlciBkaWQgYW55dGhpbmcgYnV0IGNsdXR0ZXIgdXAgdGhlIGNvZGUpLgotCi1TYXQgQXVnIDE0IDE0OjIxOjQ5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWY6IGhhbmRsZSB4bWFsbG9jLmMKLQotCSogeG1hbGxvYy5jOiBwcm92aWRlIHhtYWxsb2MgYW5kIHhyZWFsbG9jIGZ1bmN0aW9ucwotCi1UaHUgQXVnIDEyIDE3OjM4OjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IEZpeCBhIGNvbW1lbnQuCi0KLVNhdCBBdWcgIDcgMTM6NTY6MzUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQxLmM6IERlY2xhcmUgY29uc3QgdGhlIHdheSBnZXRvcHQuYyBkb2VzLgotCi1GcmkgQXVnICA2IDE3OjAzOjEzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jLCBhbGxvY2EuYzogVXBkYXRlIGZyb20gRlNGLgotCSogZ2V0b3B0LmMsIGdldG9wdDEuYzogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb24sIHdoaWNoCi0JZG9lc24ndCB1c2UgYWxsb2NhLgotCi1UdWUgSnVsIDI3IDE0OjAzOjU3IDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRlbWFuZ2xlKTogQWRkIHRoZSB0YXJnZXQgd2l0aCBhIG1lc3NhZ2Ugc2F5aW5nCi0Jd2hlcmUgZGVtYW5nbGUgd2VudC4KLQotTW9uIEp1bCAyNiAxNTo0OTo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBvYnNvbGV0ZSBgZGVtYW5nbGUnIHRhcmdldC4KLQotVGh1IEp1bCAyMiAwODozMTowMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGFybV9zcGVjaWFsKTogIEFwcGx5IHBhdGNoIGZyb20gYXJnQGx1Y2lkLmNvbSB0bwotCWF2b2lkIGluZmluaXRlIGxvb3Agb24gdnRibCBzeW1ib2xzIHdpdGggZGlzYW1iaWd1YXRpbmcgImp1bmsiCi0JdGFja2VkIG9uIHRoZSBlbmQuCi0KLU1vbiBKdWwgMTkgMTQ6MTA6MzcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYzogd29yayBhcm91bmQgc29tZSBzeXN0ZW1zIGxvc2luZyBkZWZpbml0aW9ucyBvZgotCXN5c19zaWdsaXN0Ci0KLQkqIGNvbmZpZy9taC1seW54b3M6IHRoaXMgc3lzdGVtIGhhcyBhIGxvc2luZyBkZWZpbml0aW9uIG9mCi0Jc3lzX3NpZ2xpc3QKLQotCSogY29uZmlnLnRhYmxlOiB1c2UgbWgtbHlueG9zIGZvciAqLSotbHlueG9zCi0KLU1vbiBKdWwgMTkgMTc6MDg6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IEFkZCBzdXBwb3J0IGZvciBIUFBBIEJTRCBob3N0cy4KLQotCSogY29uZmlnL21oLWhwYnNkOiBOZXcgZmlsZS4KLQotTW9uIEp1bCAxMiAxODowMDo0MCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBtYWtlIHdvcmsgd2hlbiBzcmNkaXIgIT0gb2JqZGlyLgotCi1TdW4gSnVuIDI3IDE1OjM1OjMxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKG1haW4pOiBBZGQgbG9uZyBvcHRpb25zLCBpbmNsdWRpbmcgLS1oZWxwIGFuZAotCS0tdmVyc2lvbi4KLQkodXNhZ2UpOiBOZXcgZnVuY3Rpb24gZnJvbSBjb2RlIGluIG1haW4uCi0KLVR1ZSBKdW4gMjIgMTE6Mzc6MzggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogIE5ldyBzaGVsbCBzY2lwdCwgc291cmNlZCBieSBib3RoIC4vY29uZmlndXJlLGluCi0JYW5kIC4uL3hpYmVydHkvY29uZmlndXJlLmluLCB0byBhdm9pZCBtYWludGFpbmFuY2UgbG9zc2FnZXMuCi0JKiBjb25maWd1cmUuaW4gYW5kIC4uL3hpYmVydHkvY29uZmlndXJlLmluOiAgVXNlIGNvbmZpZy50YWJsZS4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCB1c2UgbWgtYWl4IGZvciBBSVggMy4yLCBvbmx5IGZvciAzLjEuCi0JKiBjb25maWd1cmUuaW46IE1hcCAqLSotaXJpeCogKGV4Y2VwdCBpcml4NCkgdG8gbWgtc3lzdi4KLQkqIC4uL3hpYmVydHkvY29uZmlndXJlLmluOiAgVXBkYXRlIGZyb20gLi9jb25maWd1cmUuaW4uCi0KLVR1ZSBKdW4gMTUgMTc6MDU6MzEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0Ci0KLVdlZCBNYXkgMjYgMTI6NTk6MDkgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjcGx1cy1kZW0uYyAoeHJlYWxsb2MpOiAgTWF0Y2ggZGVmaW5pdGlvbiB3aXRoIHByb3RvdHlwZS4KLQotVHVlIE1heSAyNSAxNDoyNzo1MSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiAgRGVtYW5nbGUgY2Zyb250Ci0JbG9jYWwgdmFyaWFibGVzIGFzIGFuIGV4dGVuc2lvbiB0byBBUk0gZGVtYW5nbGluZy4KLQotRnJpIE1heSAyMSAwOTo1Mzo1NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5jOiBEb24ndCByZXF1aXJlIHBvaW50ZXJzIHRvIGRvdWJsZSB0byBiZSBhbGlnbmVkLgotCi1UdWUgTWF5IDE4IDE3OjEyOjEwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKG1lcmdlIGNoYW5nZXMgZnJvbSBkbG9uZ0Bjc2UudWNzYy5lZHUpCi0JKiBjcGx1cy1kZW0uYyAoY29uc3VtZV9jb3VudCk6ICBTaW1wbGlmeS4KLQkqIGNwbHVzLWRlbS5jIChhcm1fcHQsIGRlbWFuZ2xlX2NsYXNzX25hbWUpOiAgTmV3IGZ1bmN0aW9ucy4KLQkqIGNwbHVzLWRlbS5jICh2YXJpb3VzKTogIENhbGxzIHRvIGFybV9wdCwgZGVtYW5nbGVfY2xhc3NfbmFtZS4KLQotCSogY3BsdXMtZGVtLmMgKHhtYWxsb2MsIHhyZWFsbG9jLCBzdHJzdHIpOiAgTWFrZSBleHRlcm4gZGVjbHMgaW50bwotCWZ1bGwgcHJvdG90eXBlcy4KLQkqIGNwbHVzLWRlbS5jIChmcmVlKTogIEFkZCBwcm90b3R5cGUuCi0JKiBjcGx1cy1kZW0uYyAob3B0YWJsZSk6ICBGdWxseSBicmFja2V0aXplIGluaXRpYWxpemVyLgotCi1GcmkgTWF5IDE0IDE3OjEzOjA1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogIFdoZXRoZXIgaW5pdGlhbCB1bmRlcnNjb3JlcyBhcmUgc3RyaXBwZWQKLQlkZXBlbmRzIG9uIHRoZSBleHRlcm5hbCB2YXJpYWJsZSBwcmVwZW5kc191bmRlcnNjb3JlCi0JKHdoaWNoIGlzIGdlbmVyYXRlZCBieSB0aGUgYmludXRpbHMgTWFrZWZpbGUpLgotCi1GcmkgTWF5IDE0IDA3OjMyOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAobW9wX3VwLCBhcm1fc3BlY2lhbCk6IFJlbW92ZSBzb21lIHVudXNlZCB2YXJpYWJsZXMuCi0KLVR1ZSBNYXkgIDQgMjA6MzE6NTkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogIFJldHVybiB6ZXJvIGlmIGFyZyBkb2VzIG5vdAotCXN0YXJ0IHdpdGggZGlnaXQsIGFuZCBkb24ndCBjb25zdW1lIGFueSBpbnB1dC4KLQotVHVlIE1heSAgNCAwODoxMDoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRlbWFuZ2xlKTogVXNlICR7c3JjZGlyfSBub3QgJF4uCi0KLQkqIHN0cnRvZC5jOiBOZXcgZmlsZSwgbmVlZGVkIGF0IGxlYXN0IGZvciBCU0QgNC4zLgotCi1TdW4gTWF5ICAyIDExOjMwOjQyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYyAoc3lzX3NpZ2xpc3QpOiAgRm9yIEFOU0kgY29tcGlsYXRpb25zLCB0eXBlIGlzCi0JImNvbnN0IGNoYXIgKmNvbnN0Ii4gIEFsc28gcmVtb3ZlIGNvbmRpdGlvbmFsaXphdGlvbiBvbiBfX1NURENfXwotCXNpbmNlIGNvbnN0IGlzIGRlZmluZWQgYXdheSBmb3Igbm9uLUFOU0kuCi0KLVdlZCBBcHIgMjggMTk6Mjk6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplICotKi1ocHV4LgotCSogY29uZmlnL21oLWhwdXg6IE5ldyBmaWxlLgotCi1UdWUgQXByIDI3IDE1OjIyOjE5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiB0bXBuYW0uYzogIEFkZGVkIEFOU0kgdG1wbmFtKCkgZnVuY3Rpb24uCi0JKiBmdW5jdGlvbnMuZGVmLCBNYWtlZmlsZS5pbjogIFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotVHVlIEFwciAyNyAxMzozODozOCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5jdGlvbl9uYW1lKTogR2V0IHRoZSBkZW1hbmdsaW5nIG9mCi0Jc3RvcF9fMUEgcmlnaHQuCi0KLUZyaSBBcHIgMTYgMjM6NDg6MjQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGNhbHZpbikKLQotCSogY3BsdXMtZGVtLmM6IERlY2xhcmUgc3Ryc3RyIHJldHVybiB0eXBlLgotCi1GcmkgTWFyIDI2IDEyOjAxOjI2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYzogQWRkIHNvbWUgQUlYIHNpZ25hbHMuCi0KLVRodSBNYXIgMjUgMTU6MTc6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRU9WRVJSSURFUyk6IERlZmluZSB0byBiZSBlbXB0eS4KLQotV2VkIE1hciAyNCAwMTo1OToyNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgJiBkdmkgdGFyZ2V0cwotCi1UaHUgTWFyIDE4IDE0OjA1OjQ0IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5jOiAgTmV3IGZpbGUsIG1vdmVkIGZyb20gLi4vZ2RiIChzaW5jZSBpdCBpcwotCW5lZWRlZCBieSAuLi9vcGNvZGUvbTY4ay1kaXMuYykuCi0KLVR1ZSBNYXIgIDIgMTc6NDc6MzEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgUmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byBjZnJvbnQgd2l0aCBBUk0uCi0KLUZyaSBGZWIgMjYgMDA6MTc6MDcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogIEZpeCBtYWluIHByb2dyYW0gKHdoZW4gY29tcGlsZWQgd2l0aCAtRE1BSU4pCi0JdG8gYmUgbW9yZSB1c2VmdWwgYXMgYSBmaWx0ZXIuCi0KLVNhdCBGZWIgMjAgMjE6NDE6MzkgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbF90b19saWJkaXIsIGluc3RhbGxfdG9fdG9vbGRpcik6IEdvIGludG8gdGhlCi0JZGVzdGluYXRpb24gZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nICQoUkFOTElCKSwgaW4gY2FzZSB0aGF0Ci0JcHJvZ3JhbSB0cmllcyB0byBjcmVhdGUgYSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyBwYXJ0IG9mCi0JaXRzIHdvcmsuCi0KLVRodSBGZWIgMTggMjM6MDA6MTkgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jIChzeXNfc2lnbGlzdCk6ICBSZW1vdmUgeWV0IGFub3RoZXIgKiVeJiUmJCMgImNvbnN0IgotCWJlY2F1c2UgQlNEIDQuNCBsYWNrcyBvbmUuICBJc24ndCB0aGlzIGZ1bj8KLQotVGh1IEZlYiAxOCAxMToyNDoyNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6ICBTZXQgZnVuY19kb25lIGFmdGVyCi0JZGVtYW5nbGluZyBhIHRlbXBsYXRlLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogIEZpeCBzZXZlcmFsIHNtYWxsIGJ1Z3MKLQlpbiBkZW1hbmdsaW5nIEdOVSBzdHlsZSB0ZW1wbGF0ZXMuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogIEZpeCBmb3IgdGVtcGxhdGVzIGluIEdOVQotCXN0eWxlIGNvbnN0cnVjdG9ycy4KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6ICBGaXggZm9yIHRlbXBsYXRlcyBpbiBHTlUgc3R5bGUKLQlzdGF0aWMgZGF0YSBtZW1iZXJzLgotCi1UdWUgRmViIDE2IDE3OjI4OjM1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogIE1vZGlmeSB0byBpbmNsdWRlIHR5cGUKLQltb2RpZmllcnMgbGlrZSBzdGF0aWMgYW5kIGNvbnN0IGluIHJlbWVtYmVyZWQgdHlwZXMuCi0KLVRodSBGZWIgMTEgMjI6MjA6NDcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZWRfcXVhbGlmaWVkKTogIEFkZCBuZXcgcGFyYW1ldGVyIHRoYXQgdGVsbHMKLQl3aGV0aGVyIHRvIHByZXBlbmQgb3IgYXBwZW5kIHRoZSBxdWFsaWZpZXJzLgotCSogY3BsdXMtZGVtLmMgKHN0cmluZ19wcmVwZW5kcyk6ICBVc2VkIG5vdywgcmVtb3ZlICNpZiAwLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6ICBDYWxsIGRlbWFuZ2xlX3F1YWxpZmllZAotCXdpdGggcHJlcGVuZGluZy4KLQkqIGNwbHVzX2RlbS5jIChnbnVfc3BlY2lhbCk6ICBSZWNvZ25pemUgc3RhdGljIGRhdGEgbWVtYmVycyB0aGF0Ci0JdXNlIHF1YWxpZmllZCBuYW1lcy4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQpOiAgQWNjdW11bGF0ZSBxdWFsaWZpZXJzIGluIGEKLQl0ZW1wb3JhcnkgYnVmZmVyIGFuZCB0aGUgcHJlcGVuZCBvciBhcHBlbmQgdGhlbSB0byB0aGUgcmVzdWx0LAotCWFzIHNwZWNpZmllZCBieSB0aGUgbmV3ICJhcHBlbmQiIGZsYWcuCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6ICBDYWxsIGRlbWFuZ2xlZF9xdWFsaWZpZWQgd2l0aAotCWFwcGVuZGluZy4KLQotTW9uIERlYyAyOCAxMDo0NzoxOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmMgKHNpZ25hbF90YWJsZSk6IE5vdyBjb25zdC4KLQkoaW5pdF9zaWduYWxfdGFibGVzKTogVmFyaWFibGUgZWlwIG5vdyBwb2ludHMgdG8gY29uc3QuCi0KLQkqIHN0cmVycm9yLmMgKGVycm9yX3RhYmxlKTogTm93IGNvbnN0LgotCShpbml0X2Vycm9yX3RhYmxlcyk6IFZhcmlhYmxlIGVpcCBub3cgcG9pbnRzIHRvIGNvbnN0LgotCi1UdWUgRGVjIDE1IDE1OjM2OjUwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBtZW1jaHIuYyAobWVtY2hyKTogIE5ldyAoQU5TSSBzdGFuZGFyZCkgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogIEFkZGVkIG1lbWNoci4KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6IFVzZSByYyBpbnN0YWQgb2Ygbm9uLXN0YW5kYXJkIGNxLgotCi1XZWQgRGVjICAyIDIyOjQ5OjEwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6IHJlbW92ZSB1c2Ugb2YgVVNHIGFyb3VuZCA8YWxsb2NhLmg+LCB3aGljaCBuZXZlciBtZWFudAotCWFueXRoaW5nIGFueXdheQotCi0JKiBjb25maWcvbWgte2FpeCxhcG9sbG82OCxuY3IzMDAwLHN5c3Ysc3lzdjR9OiByZW1vdmVkIGRlZmluaXRpb25zCi0Jb2YgVVNHIGFuZCBVU0dyNAotCi1UaHUgTm92IDE5IDAzOjA5OjMzIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IFJlY29nbml6ZSBgdycsIGEgd2lkZSBjaGFyYWN0ZXI7Ci0JaXQncyBub3cgYSB0eXBlIGFjY29yZGluZyB0byB0aGUgQU5TSSBYM0oxNiB3b3JraW5nIHBhcGVyOyBvdXRwdXQKLQkid2NoYXJfdCIgZm9yIGl0LgotCShkZW1hbmdsZV90ZW1wbGF0ZSk6IEFjY2VwdCBgdycgYXMgYW4gaW50ZWdyYWwgdHlwZS4KLQkoeG1hbGxvYywgeHJlYWxsb2MpOiBVc2UgYGNoYXIgKicsIG5vdCBgUFRSJy4gIENhc3QgY2FsbHMgdG8gdGhlaXIKLQljb3VudGVycGFydHMgbWFsbG9jIGFuZCByZWFsbG9jIHRvIGBjaGFyIConLgotCShtYWluKTogRXhpdCB3aXRoIGEgMCBzdGF0dXMuCi0JKiBNYWtlZmlsZS5pbiAoZGVtYW5nbGUpOiBEb24ndCBleHBlY3QgdGhlIHVzZXIgdG8gZGVmaW5lCi0JREVNQU5HTEUsIGluc3RlYWQgZm9yY2UgdG8gYmUgY3BsdXMtZGVtLmMuICBMb29rIGluICQoc3JjZGlyKS8uLi9pbmNsdWRlCi0JZm9yIGRlbWFuZ2xlLmguICBQYXNzIGl0IGFueSBIREVGSU5FUyBvciBYVFJBRkxBR1MuCi0KLVdlZCBOb3YgMTggMTg6NTY6MjAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBBdm9pZCB2ZXJib3NpdHkuCi0JKiBjb25maWcvbWgtc3lzdjQ6ICBSZW1vdmUgQVJfRkxBR1Mgb3ZlcnJpZGUsIHVzZSBJTlNUQUxMPWNwLAotCXJlcGxhY2UgVVNHcjQgd2l0aCBIQVZFX1NZU0NPTkYuCi0JKiBjb25maWcvbWgtc29sYXJpczogIFJlbW92ZTsgbWgtc3lzdjQgd29ya3Mgbm93LgotCSogZ2V0cGFnZXNpemUuYzogIFJlcGxhY2UgVVNHcjQgd2l0aCBIQVZFX1NZU0NPTkYuCi0JKiBjb25maWd1cmUuaW46ICBTaW1wbGlmeSBob3N0IG1hdGNoaW5nIHRhYmxlLCByZW1vdmUgc2VwYXJhdGUKLQlzb2xhcmlzIGNvbmZpZyBmaWxlLgotCi1TdW4gTm92IDE1IDA5OjM1OjE2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zb2xhcmlzMiopOiAgQWRkLCB1c2UgbWgtc3lzdjQuCi0KLVR1ZSBOb3YgIDMgMjE6Mjc6MDMgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogQWRkIGRlY2xzLgotCShyZW1lbWJlcl90eXBlKTogRG9uJ3QgY2FzdCB4bWFsbG9jLgotCShzdHJpbmdfbmVlZCk6IExpa2V3aXNlOyBkb24ndCBjYXN0IHhyZWFsbG9jIGVpdGhlci4KLQotRnJpIE9jdCAyMyAwODo1MjowMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmcywgcmVuYW1lLmM6IGFkZGVkIHNpbXBsZQotCWltcGxlbWVudGF0aW9uIG9mIHJlbmFtZSwgc2luY2Ugc29tZSBiaW51dGlscyBwcm9ncmFtcyB1c2UgaXQuCi0KLVRodSBPY3QgMTUgMTU6MTg6MjIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jOiAgQWRkIGFwcHJvcHJpYXRlICdjb25zdCcgdG8gc3lzX3NpZ2xpc3QKLQlleHRlcm4gZGVjbGFyYXRpb24gKGlmIF9fU1REQ19fKS4gIChOZWVkZWQgZm9yIExpbnV4LikKLQkqIHN0cnNpZ25hbC5jIChzdHJzaWduYWwpOiBBZGQgY2FzdCB0byByZW1vdmUgY29uc3QtbmVzcy4KLQotRnJpIE9jdCAgOSAwMzoyMjo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG5lZWRlZC5hd2ssIG5lZWRlZDIuYXdrKTogIFJlbW92ZSBlcnJvbmVvdXMgXCdzCi0JYmVmb3JlICIncywgZGlhZ25vc2VkIGJ5IEJTRCA0LjQgYXdrLgotCi1UaHUgT2N0ICA4IDE1OjI1OjEyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNyZWF0ZSBjb25maWcuaCBhbmQgbmVlZGVkLWxpc3QgdGhyb3VnaCAkKENPTkZJR19IKQotCWFuZCAkKE5FRURFRF9MSVNUKSwgdG8gZ2l2ZSBzb21lIGhvb2tzIGZvciB4aWJlcnR5LgotCi1UaHUgT2N0ICAxIDIzOjMxOjQyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci10cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKLQotV2VkIFNlcCAzMCAxMToyNjo1OSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhcmd2LmMsIGJhc2VuYW1lLmMsIGJjbXAuYywgYmNvcHkuYywgYnplcm8uYywKLQljb25jYXQuYywgY3BsdXMtZGVtLmMsIGZkbWF0Y2guYywgZ2V0Y3dkLmMsIGdldG9wdC5jLCBnZXRvcHQxLmMsCi0JZ2V0cGFnZXNpemUuYywgaW5zcXVlLmMsIG1lbWNtcC5jLCBtZW1jcHkuYywgbWVtbW92ZS5jLCBtZW1zZXQuYywKLQlvYnN0YWNrLmMsIHNpZ3NldG1hc2suYywgc3BhY2VzLmMsIHN0cmNoci5jLCBzdHJlcnJvci5jLAotCXN0cnJjaHIuYywgc3Ryc2lnbmFsLmMsIHN0cnN0ci5jLCB2Zm9yay5jLCB2c3ByaW50Zi5jOgotCUNvbnZlcnQgZnJvbSB1c2luZyBHUEwgdG8gTEdQTC4KLQotU2F0IFNlcCAyNiAwNDowMTozMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVycm9ycyk6ICBMZWF2ZSBkdW1teS5vIGFuZCBkdW1teSBhcm91bmQgc28gdGhhdAotCXdlIGNhbiBzZWUgaG93IHRoZSBuZWVkZWQgbGlzdCB3YXMgZ2VuZXJhdGVkIChpdCdzIHNvbWV0aW1lcyB3cm9uZykuCi0JKG1vc3RseWNsZWFuKTogIFJlbW92ZSB0aGVtLgotCi1Nb24gU2VwIDIxIDE0OjUwOjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZ2V0Y3dkLmM6IHN1cHBseSBhIGRlZmF1bHQgaWYgTUFYUEFUSExFTiBpcyBub3QgZGVmaW5lZC4KLQotCSogY29uZmlnL21oLWlyaXg0OiBzZXQgRVhUUkFfT0ZJTEVTIHRvIGFsbG9jYS5vLCBmcm9tIFdSUy4KLQotV2VkIFNlcCAgOSAxMjo0MTo0OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVc2UgWFRSQUZMQUdTIHdoZW4gY29tcGlsaW5nLCBzbyB0aGF0IHhpYmVydHkgd29ya3MKLQl3aGVuIGNyb3NzLWNvbXBpbGluZy4KLQotVGh1IFNlcCAgMyAxMzoyOTozOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAoZGVtYW5nbGVfcHJlZml4KTogcmVkdWN0aW9uIGluIHN0cmVuZ3RoIG9mIHN0cnN0cgotCSAgYXMgYSB0aW1lIG9wdGltaXphdGlvbi4KLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlKTogcmVtb3ZlIHN0cnBicmsgdGVzdC4gIEFwcGVhcnMgdG8KLQkgIGJlIG1vcmUgZXhwZW5zaXZlIHRoYW4gc2ltcGx5IGRlbWFuZ2xpbmcuCi0KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19tYXRjaCk6IG5ldyBmdW5jdGlvbi4KLQotVHVlIFNlcCAgMSAxNToyNDowNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgI2luY2x1ZGUgPHN0ZGlvLmg+LCB0byBkZWZpbmUgTlVMTC4KLQlEZWZpbmUgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlLgotCi1TdW4gQXVnIDMwIDE3OjU4OjE5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICBOZXcgZmlsZSwgbW92ZWQgZnJvbSAuLi9nZGIuCi0JKiBjcGx1cy1kZW0uYyAoc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyk6ICBOZXcgZXhwb3J0ZWQKLQlmdW5jdGlvbiwgdG8gYXZvaWQgY29tcGlsaW5nIGluIHRhcmdldC1kZXBlbmRlbmN5IGZvciBDUExVU19NQVJLRVIuCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGUpOiAgQWxsb3cgZGVtYW5nbGluZyBzdHlsZSBvcHRpb24KLQl0byBiZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIsIGJ1dCB1c2luZyB0aGUgZ2xvYmFsIHZhcmlhYmxlCi0JY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlIGFzIGEgZGVmYXVsdC4KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIGZvciBjcGx1cy1kZW0uYwotCi1TYXQgQXVnIDI5IDEwOjQ0OjA5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6ICBNZXJnZSBpbiBjb21tZW50IGNoYW5nZXMgZnJvbSBGU0YgdmVyc2lvbi4gIE5vdwotCW1hdGNoZXMgdGhlIEZTRiB2ZXJzaW9uIGV4YWN0bHkuCi0KLUZyaSBBdWcgMjggMTg6Mzk6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoQ0FMTF9GUkVFRlVOKTogIENhbid0IHVzZSA/OiB3aXRoIHZvaWQgdmFsdWVzIChhdAotCWxlYXN0IG9uIGxvc2luZyBERUNzdGF0aW9ucyEpOyB1c2UgaWYtdGhlbi1lbHNlIGluc3RlYWQuCi0KLVdlZCBBdWcgMTkgMTQ6NDA6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLU1vbiBBdWcgMTAgMTc6MzM6NDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0gICAgICAgKiBNYWtlZmlsZS5pbjogY2xlYW4gdXAgZGVmaW5pdGlvbiBvZiBDRklMRVMsIG1vcmUgY29tbWVudHMKLQotU2F0IEF1ZyAgOCAyMzoxMDo1OSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmMgKG15X2luZGV4KTogIE1ha2UgZmlyc3QgYXJnIGNvbnN0IHRvIG1hdGNoIHN0cmNociwKLQl3aGljaCBpdCBzb21ldGltZXMgaXMgcmVtYXBwZWQgdG8uCi0KLVNhdCBBdWcgIDEgMTM6NDg6NTAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suYyAoREVGQVVMVF9BTElHTk1FTlQpOiAgVXBkYXRlIHRvIG1hdGNoIEZTRiB2ZXJzaW9uLgotCSogb2JzdGFjay5jIChfb2JzdGFja19iZWdpbik6ICBJbml0aWFsaXplIHVzZV9leHRyYV9hcmcuCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luXzEpOiAgTmV3LCBmcm9tIEZTRiB2ZXJzaW9uLgotCi1Nb24gSnVsIDIwIDIxOjA3OjU4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmMgKENBTExfQ0hFQ0tGVU4sIENBTExfRlJFRUZVTik6ICBVc2UgdXNlX2V4dHJhX2FyZyBhbmQKLQlleHRyYV9hcmcuCi0JKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luKTogIFJlbW92ZSBhcmVhX2lkIGFuZCBmbGFncyBhcmd1bWVudHMKLQkocHJldmlvdXNseSBhZGRlZCBmb3IgbW1hbGxvYyBzdXBwb3J0LCBpbnRlcmZhY2UgaGFzIGNoYW5nZWQpLgotCUFsc28gY29udmVydCBmbGFncyB1c2FnZSB0byB1c2UgdXNlX2V4dHJhX2FyZyBhbmQgbWF5YmVfZW1wdHlfb2JqZWN0LgotCi1GcmkgSnVsIDEwIDAwOjQxOjUzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhcmd2LmM6ICBNb3ZlIGV4cGFuZGFyZ3YgaW5saW5lIGFuZCBlbGltaW5hdGUgc3RhdGljIHZhcmlhYmxlcy4KLQlSZXdyaXRlIHRvIGFsd2F5cyBhbGxvY2F0ZSBpbiBwb3dlcnMgb2YgdHdvLiAgRml4IHRvIHJldHVybiBhbgotCWFyZ3Ygd2l0aCBhIHNpbmdsZSBudWxsIHN0cmluZyBhcmcgaWYgcGFzc2VkIGEgbnVsbCBzdHJpbmcuCi0KLUZyaSBKdWwgIDMgMjA6Mjc6MjkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHJhbmRvbS5jLCBzaWdzZXRtYXNrLmMsIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgUmVtb3ZlCi0JIih2b2lkKSIgY2FzdHMgZnJvbSBmdW5jdGlvbiBjYWxscyB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzCi0JaWdub3JlZCwgaW4gYWNjb3JkYW5jZSB3aXRoIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1Nb24gSnVuIDI5IDEwOjU0OjE5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBiY29weS5jLCBzdHJlcnJvci5jLCBzdHJzaWduYWwuYzogIExpbnQuCi0KLVRodSBKdW4gMjUgMDk6MTg6NDEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogbWVyZ2UgY2hhbmdlcyBmcm9tIG1ha2UuCi0KLVRodSBKdW4gMjUgMDQ6NDM6MjIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFsbG9jYS5jOiAgSW5jb3Jwb3JhdGUgZml4ZXMgZnJvbSBnZGIvYWxsb2NhLmMuCi0JRklYTUU6ICBFdmVudHVhbGx5IG1vdmUgZ2RiJ3MgYWxsb2NhIGNvbmZpZ3VyYXRpb24gZmlsZXMgaGVyZSwKLQlhbmQgcmVtb3ZlIGdkYi9hbGxvY2EuYyBhbmQgaXRzIE1ha2VmaWxlLmluIHN1cHBvcnQuCi0KLVR1ZSBKdW4gMjMgMjE6NTY6MzAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGR1bW15LmM6ICBEZWZpbmUgTk9USElORyB0byAvKm5vdGhpbmcqLywgY2hhbmdlIHJldHVybiB0eXBlCi0Jb2YgbWFpbiB0byBpbnQgYW5kIHJldHVybiB6ZXJvLgotCSogZnVuY3Rpb25zLmRlZjogIFN1cHBseSBOT1RISU5HIGFzIHRoZSBmb3VydGggYXJnIHRvIG1hY3JvcwotCXRoYXQgZG9uJ3QgaGF2ZSBhbiBleHBsaWNpdCBhcmcsIHRvIHNhdGlzZnkgcGlja3kgcHJlcHJvY2Vzc29ycy4KLQotV2VkIEp1biAxNyAxODoxMzo1OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2xlYW4gdXAgKmNsZWFuIHJ1bGVzLCBhcyBwZXIgc3RhbmRhcmRzLnRleGkuCi0KLVR1ZSBKdW4gMTYgMTY6MTE6NTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYywgZ2V0b3B0MS5jOiBtZXJnZWQgbGFyZ2VseSBncmF0dWl0b3VzLCBtb3N0bHkKLQkgIHdoaXRlc3BhY2UgZGlmZnMgZnJvbSBvdGhlciBwcmVwIGRpc3RyaWJ1dGlvbnMuCi0KLU1vbiBKdW4gMTUgMTI6MjU6NDYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1uY3IzMDAwIChJTlNUQUxMKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAotCWl0IGlzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLgotCi1Nb24gSnVuIDE1IDAxOjAzOjI2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzaWdzZXRtYXNrLmM6ICBSZXdyaXRlLiAgT2xkIG9uZSB3YXMgdmVyeSBjb25mdXNlZCBhYm91dCBpdHMKLQlhcmd1bWVudHMgYW5kIHJlc3VsdC4gIE5ldyBvbmUgY2FuJ3QgZG8gbXVjaCwgYnV0IGF0IGxlYXN0IGtub3dzCi0Jd2hhdCBpdCBjYW4ndCBkbywgYW5kIGl0J3MgZ29vZCBlbm91Z2ggZm9yIEdEQidzIHVzZS4KLQotU3VuIEp1biAxNCAxNToxNzo0MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBmdW5jdGlvbnMuZGVmOiAgVXNlIHByb3BlciBwcm90b3R5cGUgZm9yIHN0cnRvdWwuCi0KLUZyaSBKdW4gMTIgMTk6MjI6NDAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIHJhbmRvbS5jLgotCSogY29uZmlnL21oLSo6ICBVc2UgInRydWUiIHJhdGhlciB0aGFuICJlY2hvID4vZGV2L251bGwiIGZvciByYW5saWIuCi0JKiBjb25maWd1cmUuaW46ICB1cGRhdGUgc29sYXJpczIgY29uZmlnLgotCi1XZWQgSnVuIDEwIDE2OjMxOjI5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiByYW5kb20uYzogIEFkZCBmb3IgcmFuZG9tKCkgYW5kIHNyYW5kb20oKS4KLQkqIGZ1bmN0aW9ucy5kZWY6ICBBZGQgcmFuZG9tCi0KLVR1ZSBKdW4gIDkgMTc6Mjc6MTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97bWgtbmNyMzAwMCwgbWgtc3lzdjR9OiAgQWRkIGRlZmluaXRpb24gZm9yIElOU1RBTEwKLQl1c2luZyAvdXNyL3VjYi9pbnN0YWxsLgotCi1Nb24gSnVuICAxIDEzOjIwOjE3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RyZXJyb3IuYzogIEtsdWRnZSB0byBndWFyZCBhZ2FpbnN0IGEgY29uZmxpY3Qgd2l0aAotCXBvc3NpYmxlIGRlY2xhcmF0aW9uIG9mIHN5c19lcnJsaXN0IGluIGVycm5vLmguCi0KLVN1biBNYXkgMzEgMTU6MDc6NDcgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtc29sYXJpczogYWRkIHNvbGFyaXMyIGNvbmZpZyBzdXBwb3J0LgotCi1GcmkgTWF5IDI5IDE3OjIzOjIzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogc2lnc2V0bWFzay5jOiAgI2lmZGVmIG91dCBzaWdzZXRtYXNrIGlmIFNJR19TRVRNQVNLCi0JaXMgbm90IGRlZmluZWQgKHNob3VsZCBiZSBkZWZpbmVkIGluIHNpZ25hbC5oLCBzYXlzIFBvc2l4LikuCi0KLU1vbiBNYXkgMTggMTc6MzU6MDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiBtZXJnZWQgY2hhbmdlcyBmcm9tIG1ha2UtMy42Mi4xMS4KLQotRnJpIE1heSAgOCAxNDo1MzowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6IG1lcmdlZCBjaGFuZ2VzIGZyb20gYmlzb24tMS4xOC4KLQotVHVlIE1heSAgNSAxMTo1MTo0MCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgRG9uJ3QgaGF2ZSAkKEVYVFJBX09GSUxFUykgZGVwZW5kIG9uIGNvbmZpZy5oLAotCXNpbmNlIHRoYXQgaW50cm9kdWNlcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi0JKCQoRVhUUkFfT0ZJTEVTKSBhcmUgdXNlZCB0byBidWlsZCBjb25maWcuaC4pCi0KLQkqIHN0cnRvdWwuYzogIEZpeGVzIHRvIGhhbmRsZSBub24tZGVjaW1hbCBiYXNlcyBiZXR0ZXIuCi0KLVdlZCBBcHIgMjIgMDk6Mjc6NTEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiAgUmVwbGFjZSBNSU5VU19HIHdpdGggQ0ZMQUdTLgotCSogTWFrZWZpbGUuZG9zOiAgRmluaXNoIE1JTlVTX0cgZXJhZGljYXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogIEFkZCBzdHJzaWduYWwuYy4KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiAgQWRkIHN0cmVycm9yLm8gc3Ryc2lnbmFsLm8KLQkqIE1ha2VmaWxlLmluIChuZWVkZWQtbGlzdCk6ICBTcGxpdCBjcmVhdGlvbiBvZiBlcnJvcnMgZmlsZSB0bwotCXNlcGFyYXRlIG1ha2UgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5oLCBuZWVkZWQyLmF3aywgZXJyb3JzKTogIE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogIFNwbGl0IHRvIG11bHRpcGxlIGxpbmVzLCBhZGQgbmVlZGVkMi5hd2sKLQlhbmQgY29uZmlnLmguCi0JKiBkdW1teS5jIChERUZGVU5DLCBERUZWQVIpOiAgQWRkIGRlZmluZXMgYW5kIHVuZGVmcy4KLQkqIGZ1bmN0aW9ucy5kZWYgKHN0cmVycm9yKTogIFJlbW92ZSBmcm9tIG9wdGlvbmFsIGxpc3QuCi0JKiBmdW5jdGlvbnMuZGVmIChzeXNfbmVyciwgc3lzX2Vycmxpc3QsIHN5c19zaWdsaXN0KTogIERFRlZBUidzCi0JKiBmdW5jdGlvbnMuZGVmIChzdHJlcnJvciwgcHNpZ25hbCk6ICBERUZGVU5DJ3MKLQkqIHN0cmVycm9yLmM6ICBSZXdyaXRlIGZyb20gc2NyYXRjaCB0byB1c2Ugc3lzX2Vycmxpc3Qgb25seSBpZgotCWF2YWlsYWJsZSwgYWRkIGVycm5vX21heCgpLCBhZGQgc3RyZXJybm8oKSwgYWRkIHN0cnRvZXJybm8oKSwKLQlhZGQgdGVzdCBkcml2ZXIuCi0JKiBzdHJzaWduYWwuYzogIE5ldyBmaWxlLCBzaWduYWwgZXF1aXZhbGVudCB0byBzdHJlcnJvci5jLgotCVVzZXMgc3lzX3NpZ2xpc3QgaWYgYXZhaWxhYmxlLCBkZWZpbmVzIHNpZ25vX21heCgpLCBzdHJzaWduYWwoKSwKLQlzdHJzaWdubygpLCBzdHJ0b3NpZ25vKCksIHBzaWduYWwoKSwgYW5kIHRlc3QgZHJpdmVyLgotCi1Nb24gQXByIDIwIDIwOjQ5OjMyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZG8gbm90IHByaW50IHJlY3Vyc2lvbiBsaW5lLgotCi0JKiBNYWtlZmlsZS5pbjogYWxsb3cgQ0ZMQUdTIHRvIGJlIHBhc3NlZCBpbiBmcm9tIGNvbW1hbmQgbGluZS4KLQkgIFJlbW92ZWQgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1Nb24gQXByIDIwIDEyOjU3OjQ2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFpeDogIE5ldy4gIEVYVFJBX09GSUxFUyBsaXN0cyBjb3B5c2lnbi5vLAotCXNvIGxpYmcrKyB1c2VycyBkb24ndCBoYXZlIHRvIGJlIGluY29udmVuaWVuY2VkIGJ5IGEKLQlsaWJjLmEgYnVnIChsaWJjLmEgbmVlZHMgY29weXNpZ24sIGJ1dCBkb2Vzbid0IGRlZmluZSBpdCEpLgotCSogY29uZmlndXJlLmluOiAgVXNlIGNvbmZpZy9taC1haXguCi0JKiBzdHJ0b3VsLmM6ICBIYW5kbGUgJy0nIGFzIHJlcXVpcmVkIGJ5IEFOU0kuCi0JQ2xlYW4gdXAgcmFkaXggaGFuZGxpbmcuCi0JKiBzdHJzdHIuYzogIEZpeCBidWdneSBhbGdvcml0aG0uCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZSBzbyB0aGF0ICR7RVhUUkFfT0ZJTEVTfSBpcwotCWFwcGVuZGVkIHRvIG5lZWRlZC1saXN0ICh3aGljaCBpcyB1c2VkIGJ5IGxpYmcrKykuCi0KLUZyaSBBcHIgMTAgMjI6NTE6NDEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuZXcgbmNyMzAwMCBjb25maWcuCi0JKiBjb25maWcvbWgtbmNyMzAwMDogIE5ldyBjb25maWcgZmlsZS4KLQotV2VkIEFwciAgMSAyMzozMTo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJndi5jLCBkdW1teS5jOiAgTGludC4KLQotVHVlIE1hciAzMSAxODo0Njo0NCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN5c3Y0OiAgTmV3IGNvbmZpZyBmaWxlLgotCSogY29uZmlndXJlLmluIChob3N0X21ha2VmaWxlX2ZyYWcpOiAgU2V0IHRvIGNvbmZpZy9taC1zeXN2NCBmb3IKLQlob3N0X29zID09IHN5c3Y0LgotCSogZ2V0cGFnZXNpemUuYzogIEZvciBTVlI0LCB1c2Ugc3lzY29uZihfU0NfUEFHRVNJWkUpIHRvIGdldAotCXBhZ2VzaXplLgotCi1TdW4gTWFyIDI5IDEyOjI2OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogIExpbnQuCi0KLUZyaSBNYXIgMjcgMDg6MzI6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGZ1bmN0aW9ucy5kZWYgKGFsbG9jYSk6ICBGaXggcmV0dXJuIHR5cGUgYW5kIGFyZ3MgdG8gYXZvaWQKLQl0eXBlIGNsYXNoIHdpdGggZ2NjJ3MgYnVpbHRpbiBhbGxvY2EuCi0KLVR1ZSBNYXIgMjQgMjM6MzM6NDIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21oLWlyaXg0OiBpcml4NCBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZiwgYWxsb2NhLmM6IGFkZGVkIGFsbG9jYS4KLQotVHVlIE1hciAyNCAxNzozNDo0NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmMgKENBTExfRlJFRUZVTik6ICBNYWtlIGl0IGNvbXBpbGUgb24gREVDc3RhdGlvbnMuCi0KLVRodSBNYXIgMTkgMTM6NTc6NDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogIEZpeCB2YXJpb3VzIGV4dGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIGJlCi0JY29ycmVjdCBpbiBhbiBBTlNJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50LgotCi1TYXQgTWFyIDE0IDE3OjI4OjE3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6ICBDaGFuZ2VzIHRvIHN1cHBvcnQgY2FsbGluZyBtbWFsbG9jIGZ1bmN0aW9ucywKLQl3aGljaCB0YWtlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgb3ZlciBtYWxsb2MgZnVuY3Rpb25zLgotCi1GcmkgTWFyICA2IDIyOjAxOjEwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVRodSBGZWIgMjcgMjI6MTk6MzkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogICNpbmNsdWRlIGFsbG9jYS1jb25mLmggKG5lZWRlZCBieSBBSVgpLgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotU2F0IEZlYiAyMiAwMTowOToyMSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBhcmd2LmM6ICBDaGVjayBpbiBGcmVkJ3MgdmVyc2lvbiB3aGljaCBmaXhlcyBwcm9ibGVtcyB3aXRoCi0JYWxsb2NhKCkuCi0KLUZyaSBGZWIgIDcgMjE6NDY6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbWFrZWZpbGUuZG9zOiAgUmVtb3ZlIE5VTCB0byBrZWVwIHBhdGNoIGZyb20gZmFpbGluZy4KLQotVGh1IEphbiAzMCAyMjo0ODo0MSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYyAoX2dldG9wdF9pbnRlcm5hbCk6ICBGaXggdXNhZ2Ugb2YgZW51bSBoYXNfYXJnLgotCi1Nb24gSmFuIDIwIDE4OjUzOjIzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLSAJKiBnZXRvcHQuYywgZ2V0b3B0MS5jLCAuLi9pbmNsdWRlL2dldG9wdC5oOiAgR2V0IGxhdGVzdCB2ZXJzaW9ucy4KLQotU2F0IEphbiAxOCAxNjo1MzowMSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgTmV3IGZpbGUgdG8gYnVpbGQgYW5kIGRlc3Ryb3kgc3RhbmRhcmQgYXJndW1lbnQKLQl2ZWN0b3JzIGZyb20gYSBjb21tYW5kIHN0cmluZy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgYXJndi5jIGFuZCBhcmd2Lm8gdG8gYXBwcm9wcmlhdGUgbWFjcm9zLgotCi1GcmkgRGVjIDIwIDEyOjEyOjU3IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBDaGFuZ2Ugc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LgotCi0JKiByaW5kZXguYzogIERlY2xhcmUgcmV0dXJuIHR5cGUgb2YgZXh0ZXJuYWxseSB1c2VkIGZ1bmN0aW9uCi0Jc3RycmNocigpLgotCi1UaHUgRGVjIDE5IDE4OjM1OjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZSAiKioqIiBpbiBub3JtYWwgb3V0cHV0LCBzaW5jZSBNYWtlIHByb2R1Y2VzCi0JdGhpcyBvbiBlcnJvcnMsIGFuZCBpdCdzIGNvbnZlbmllbnQgdG8gc2VhcmNoIGZvci4KLQotVHVlIERlYyAxNyAyMzoyMTozMCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbWVtY21wLmMsIG1lbWNweS5jLCBtZW1tb3ZlLmMsIG1lbXNldC5jLCBzdHJjaHIuYywgc3RycmNoci5jOgotCU5ldyBBTlNJIGZ1bmN0aW9ucy4gIFRoZSBvbGQgbm9uLUFOU0kgZnVuY3Rpb25zIChzdWNoIGFzIGJjb3B5KQotCXNob3VsZCBiZSBhdm9pZGVkLgotCSogYmNvcHkuYzogIEZpeCB0byBjb3JyZWN0bHkgaGFuZGxlIG92ZXJsYXBwaW5nIHJlZ2lvbnMuCi0JKiBpbmRleC5jLCByaW5kZXguYzogIFJlLXdyaXRlIGluIHRlcm1zIG9mIHN0cmNocigpIGFuZCBzdHJyY2hyKCkuCi0JKiBmdW5jdGlvbnMuZGVmOiAgQWRkIHRoZSBuZXcgZnVuY3Rpb25zLgotCSogZnVuY3Rpb25zLmRlZjogIEFkZCA0dGggcGFyYW1ldGVyIHRvIERFRiBtYWNybywKLQlhbiBhbnNpZGVjbC5oLXN0eWxlIHByb3RvdHlwZS4KLQkqIGR1bW15LmM6ICBVc2UgZXhwYW5kZWQgREVGIG1hY3JvIHRvIGNyZWF0ZSBhIGR1bW15IGZ1bmN0aW9uCi0JY2FsbCwgd2l0aCBjb3JyZWN0IHBhcmFtZXRlciB0eXBlcy4gIChUaGlzIGF2b2lkcyBzb21lCi0JY29tcGxhaW50cyBmcm9tIGdjYyBhYm91dCBwcmVkZWZpbmVkIGJ1aWx0aW5zLikKLQotCU1vdmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29uZmlnL21oLWRlZmF1bHQgaW50byBNYWtlZmlsZS5pbi4KLQlUaGlzIGF2b2lkIGR1cGxpY2F0aW9uLCBhbmQgc2ltcGxpZmllcyB0aGluZ3Mgc2xpZ2h0bHkuCi0JKiBNYWtlZmlsZS5pbjogIFR3ZWFrIHNvIHdlIGRvbid0IG5lZWQgY29uZmlnL21oLWRlZmF1bHQuCi0JKiBSRUFETUU6ICBVcGRhdGUuCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCBjb25maWcvbWgtZGVmYXVsdC4KLQkqIGNvbmZpZy9taC1kZWZhdWx0OiAgRGVsZXRlZC4KLQkqIGNvbmZpZy9taC1zeXN2OiAgUmVtb3ZlIGxpbmVzIGNvcGllZCBmcm9tIG9sZCBtaC1kZWZhdWx0LgotCi1UdWUgRGVjIDE3IDA1OjQ2OjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBmZG1hdGNoLmMgKGZkbWF0Y2gpOiAgRG9uJ3QgY29tcGFyZSBzdF9yZGV2LCB3aGljaCBpcyBmb3IKLQknbWtub2QnIGRldmljZSBudW1iZXJzLgotCi1Nb24gRGVjIDE2IDEyOjI1OjM0IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBmZG1hdGNoLmMsIE1ha2VmaWxlLmluOiAgQWRkIG5ldyBmdW5jdGlvbiB0aGF0IHRha2VzIHR3bwotCW9wZW4gZmlsZSBkZXNjcmlwdG9ycyBhbmQgcmV0dXJucyBub256ZXJvIGlmIHRoZXkgcmVmZXIgdG8KLQl0aGUgc2FtZSBmaWxlLCB6ZXJvIG90aGVyd2lzZS4gICh1c2VkIGluIGdkYikKLQotV2VkIERlYyAxMSAxNzo0MDozOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQlGcm9tIERKOgotCSogbXNkb3MuYzogc3R1YiBmdW5jdGlvbnMgZm9yIGRvcy4KLQkqIG1ha2VmaWxlLmRvcywgY29uZmlnZGouYmF0OiBuZXcuCi0JKiBnZXRvcHQuYzogRG9uJ3QgaW5jbHVkZSBhbGxvY2EtY29uZi5oIGluIGEgR08zMiB3b3JsZC4KLQotCi1UdWUgRGVjIDEwIDA0OjE0OjQ5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1GcmkgRGVjICA2IDIzOjI2OjQ1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBzcGFjZXMgZm9sbG93aW5nIGh5cGhlbnMgYmVjYXVzZSBic2QgbWFrZQotCSAgY2FuJ3QgY29wZS4gIGFkZGVkIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQuICBpbnN0YWxsIHVzaW5nCi0JICBJTlNUQUxMX0RBVEEuCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIGNvbW1vbnRhcmdldHMgYXMgaXQgaXMgbm8gbG9uZ2VyIGEKLQkgIHJlY29nbml6ZWQgaG9vay4KLQotVGh1IERlYyAgNSAyMjo0Njo0NiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLUZyaSBOb3YgMjIgMTk6MTU6MjkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgZmluZC1uZWVkZWQuYXdrIGRvZXMgbm90IGZpdCBpbiAxNCBjaGFycy4KLQotCSogTWFrZWZpbGUuaW46ICBTdXBwcmVzcyBlcnJvciBjaGVja2luZyB3aGVuIGNvbXBpbGluZyB0aGUgdGVzdAotCXByb2dyYW0sIGJlY2F1c2UgVWx0cml4IG1ha2Uvc2ggYWJvcnRzIHRoZXJlIGR1ZSB0byBhIGJ1Zy4KLQotRnJpIE5vdiAyMiAxMjoyMzoxNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZS1kaWQgaG93IEVYVFJBX09GSUxFUyBpcyB1c2VkIHRvIGJlIG1vcmUgdXNlZnVsLgotCSogUkVBRE1FOiAgRXhwbGFpbmVkIGhvdyB0aGUgYXV0by1jb25maWd1cmF0aW9uIHdvcmtzLAotCWFuZCBob3cgdG8gYWRkIG5ldyBmaWxlcyBhbmQvb3IgY29uZmlndXJhdGlvbnMuCi0KLUZyaSBOb3YgMjIgMDk6NDU6MjMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0cnRvdWwuYzogIEF2b2lkIGRlZmluaW5nIFVMT05HX01BWCBpZiBhbHJlYWR5IGRlZmluZWQ7Ci0JY2FzdCBhIGNvbnN0IGNoYXIgKiB0byBjaGFyICogZm9yIHBlZGFudHMuCi0KLQkqIGdldG9wdC5jOiAgT25seSBkZWZpbmUgImNvbnN0IiBhZnRlciBsb2NhbCBpbmNsdWRlIGZpbGVzIGdldCB0bywKLQlhbmQgb25seSBpZiB0aGV5IGhhdmVuJ3QgZGVmaW5lZCBpdC4KLQotVGh1IE5vdiAyMSAxNjo1ODo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZ2V0Y3dkLmMgKHJlbW92ZSBnZXR3ZC5jKTogR05VIGNvZGUgc2hvdWxkIGNhbGwgZ2V0Y3dkKCkuICBXZQotCWVtdWxhdGUgaXQgd2l0aCBnZXR3ZCgpIGlmIGF2YWlsYWJsZS4gIFRoaXMgYXZvaWRzIGNhbGxlcnMgaGF2aW5nCi0JdG8gZmluZCBhIE1BWFBBVEhMRU4gb3IgUEFUSF9NQVggdmFsdWUgZnJvbSBzb21ld2hlcmUuCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogIGdldHdkLT5nZXRjd2QuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgZ2VuZXJpYyBjYXNlIGZvciBldmVyeSBzeXN0ZW0uCi0JKiBjb25maWcvbWgte2RlbHRhODgsbWFjaCxyczYwMDAsc3ZyNH06ICBSZW1vdmUuCi0JKiBjb25maWcvbWgtc3lzdjogIFVzZSBkZWZhdWx0IGhhbmRsaW5nLCBqdXN0IGFkZCAtRFVTRy4KLQotVGh1IE5vdiAxNCAxMDo1ODowNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy9taC1kZWZhdWx0OiBSZS1kbyBtYWtlIG1hZ2ljCi0Jc28gdGhhdCBmb3IgdGhlIGRlZmF1bHQgKCJhdXRvbWF0aWMiKSBtb2RlIHdlIG9ubHkKLQljb21waWxlIHRoZSBmaWxlcyB3ZSBhY3R1YWxseSBuZWVkLiAgRG8gdGhpcyB1c2luZwotCWEgcmVjdXJzaXZlIG1ha2U6ICBUaGUgdG9wLWxldmVsIGdlbmVyYXRlcyB0aGUgbGlzdAotCW9mIG5lZWRlZCBmaWxlcyAobG9vc2VseSwgdGhlIG9uZXMgbWlzc2luZyBpbiBsaWJjKSwKLQlhbmQgdGhlbiBwYXNzZXMgdGhhdCBsaXN0IHRvIHRoZSByZWN1cnNpdmUgbWFrZS4KLQkqIGNvbmZpZy9taC1tYWNoOiAgUmVtb3ZlIG9ic29sZXRlIFNUUkVSUk9SLXtDLE99IG1hY3Jvcy4KLQotVHVlIE5vdiAxMiAxOToxMDo1NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJTLzYwMDAgaG9zdCBzdXBwb3J0IChncnVtYmxlKS4KLQotCSogY29uZmlndXJlLmluOiAgQnVpbGQgYWxsb2NhLWNvbmYuaCBmaWxlIGZyb20gYWxsb2NhLW5vcm0uaAotCShldmVyeXRoaW5nIGVsc2UpIG9yIGFsbG9jYS1ib3RjaC5oIChycy82MDAwKS4KLQkqIE1ha2VmaWxlLmluOiAgSW5jbHVkZSAuIG9uIHRoZSBpbmNsdWRlIHBhdGguCi0JKiBnZXRvcHQuYzogIFVzZSBhbGxvY2EtY29uZi5oLgotCSogYWxsb2NhLW5vcm0uaDogIEhvdyB0byBkZWNsYXJlIGFsbG9jYSBvbiByZWFzb25hYmxlIG1hY2hpbmVzLgotCSogYWxsb2NhLWJvdGNoLmg6IEhvdyB0byBkZWNsYXJlIGFsbG9jYSBvbiBicmFpbmRlYWQgbWFjaGluZXMuCi0KLVR1ZSBOb3YgMTIgMDk6MjE6NDggMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmNhdC5jIDogIE5ldyBmaWxlLCBsaWtlIGNvbmNhdCgpIGluIGdkYiBidXQgY2FuIHRha2UgYQotCXZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgcmF0aGVyIHRoYW4gZml4ZWQgYXQgMyBhcmdzLiAgRm9yCi0Jbm93LCBjbGllbnQgYXBwbGljYXRpb25zIG11c3Qgc3VwcGx5IGFuIHhtYWxsb2MoKSwgd2hpY2ggaXMgYQotCWZyb250IGVuZCBmdW5jdGlvbiB0byBtYWxsb2MoKSB0aGF0IGRlYWxzIHdpdGggb3V0LW9mLW1lbW9yeQotCWNvbmRpdGlvbnMuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGNvbmNhdC5jIGFuZCBjb25jYXQubyB0byBhcHByb3ByaWF0ZSBtYWNyb3MuCi0KLVNhdCBOb3YgIDkgMTM6Mjk6NTkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zdnI0OiAgQWRkIHNpZ3NldG1hc2sgdG8gbGlzdCBvZiByZXF1aXJlZCBmdW5jdGlvbnMuCi0KLVN1biBOb3YgIDMgMTE6NTc6NTYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHZzcHJpbnRmLmM6ICBOZXcgZmlsZS4KLQkqIGZ1bmN0aW9ucy5kZWYsIE1ha2VmaWxlLmluOiAgQWRkIHZzcHJpbnRmLgotCi1TdW4gT2N0IDI3IDE2OjMxOjIyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1yczYwMDA6ICBBZGQgcnMvNjAwMCBob3N0IHN1cHBvcnQuCi0JKiBNYWtlZmlsZS5pbjogIENvbXBpbGUgd2l0aCBkZWJ1ZyBpbmZvLgotCi1GcmkgT2N0IDI1IDE3OjAxOjEyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBhbmQgbmV3IGZpbGVzOiBkdW1teS5jLCBmdW5jdGlvbnMuZGVmLAotCWNvbmZpZy9tZi1kZWZhdWx0OiAgQWRkZWQgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbW9kZSwKLQl3aGljaCBpbmNsdWRlcyBpbnRvIGxpYmliZXJ0eS5hIGZ1bmN0aW9ucyB0aGF0IGFyZSAibWlzc2luZyIgaW4gbGliYy4KLQkqIHN0cmR1cC5jLCB2cHJpbnRmLmMsIHZmcHJpbnRmLmM6IE5ldyBmaWxlcy4KLQotVGh1IE9jdCAyNCAwMjoyOToyNiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2htYWtlLXN2cjQ6IE5ldyBmaWxlLgotCi0JKiBjb25maWcvaG1ha2Utc3lzdjogQWRkIEhPU1RfQ0ZJTEVTIGFuZCBIT1NUX09GSUxFUy4KLQotCSogYmFzZW5hbWUuYywgYmNtcC5jLCBiY29weS5jLCBiemVyby5jLCBnZXRwYWdlc2l6ZS5jIGdldHdkLmMsCi0JaW5kZXguYywgaW5zcXVlLmMsIHJpbmRleC5jLCBzcGFjZXMuYywgc3Ryc3RyLmMsIHZmb3JrLmM6IE5ldwotCWZpbGVzIGNvbnRhaW5pbmcgZWl0aGVyIHBvcnRhYmxlIEMgdmVyc2lvbnMgb3IgZW11bGF0aW9ucyB1c2luZwotCW5hdGl2ZSBsaWJyYXJ5IGNhbGxzLgotCi0JKiBzdHJlcnJvci5jOiAgQWRkIGNvcHlyaWdodCwgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiwgZXRjLgotCi0JKiBzdHJ0b2wuYzogIFJlcGxhY2UgaGFyZHdpcmVkIGhleCBjb25zdGFudHMgd2l0aCBzb21lIG1vcmUKLQlwb3J0YWJsZSBtYWNyb3MuICBSZW1vdmUgaWxsZWdhbCAoYWNjb3JkaW5nIHRvIGdjYykgY2FzdC4KLQotCSogc3RydG91bC5jOiBSZXBsYWNlIGhhcmR3aXJlZCBoZXggY29uc3RhbnQgd2l0aCBtb3JlIHBvcnRhYmxlCi0JbWFjcm8uCi0KLQkqIE1ha2VmaWxlLmluOiBNb3ZlIFRBUkdFVExJQiBhbmQgQ0ZMQUdTIHdoZXJlIG1ha2VmaWxlIGZyYWdtZW50cwotCWNhbiBvdmVycmlkZSB0aGVtLiAgQWRkIG5ldyBzb3VyY2UgYW5kIG9iamVjdCBmaWxlIG5hbWVzIHRvIENGSUxFUwotCWFuZCBPRklMRVMgcmVzcGVjdGl2ZWx5LgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBTVlI0IG1ha2VmaWxlIGZyYWdtZW50cy4KLQotVHVlIE9jdCAyMiAxOTowMDoyMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBNb3ZlIFJBTkxJQiwgQVIgYW5kIEFSX0ZMQUdTIHRvIHdoZXJlIHRoZXkgY2FuIGJlCi0Jb3Zlci1yaWRkZW4gYnkgY29uZmlnL2htYWtlLSoKLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgbTg4a2N2cyB0byBzeXN2IGxpc3QKLQotRnJpIE9jdCAgNCAwMToyOTowOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBNb3N0IGhvc3RzIG5lZWQgc3RyZXJyb3IsIGJ1dCBvbmUgb3IgdHdvIGRvbid0LAotCWFuZCB0aGV5IG92ZXJyaWRlIHRoZXNlIGRlZmluaXRpb25zIGluIHRoZSBob3N0LWRlcGVuZGVudCBtYWtlZmlsZQotCWZyYWdtZW50LgotCSogY29uZmlnL2htYWtlLW1hY2g6ICBUaGUgb2RkIG1hbiBvdXQgb24gc3RyZXJyb3IgLS0gaXQncyBzdXBwbGllZC4KLQkqIHN0cmVycm9yLmM6ICBOZXcgZmlsZS4KLQotCSogc3RydG9sLmMsIHN0cnRvdWwuYzogIEFkZCBzdHJ0b2wgdG8gbGliaWJlcnR5LCBzaW5jZSBNYWNoIGxhY2tzCi0JaXQgYW5kIGJmZCB1c2VzIGl0LgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgY29uZmlnL2htYWtlLW1hY2g6ICBPbmx5IGNvbmZpZ3VyZQotCXN0cnRvbCAmIHN0cm90b3VsIGluIG9uIE1hY2guCi0KLVR1ZSBTZXAgIDMgMDY6MzY6MjMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6ICBNZXJnZSB3aXRoIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L01ha2VmaWxlLmluIGIvbGliaWJlcnR5L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWE1N2YwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0jCi0jIE1ha2VmaWxlCi0jICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSAtIDk5LCAyMDAwCi0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLSMgTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSMgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBMaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSMgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkgPHJpY2hAY3lnbnVzLmNvbT4uCi0KLSMKLSMgTWFrZWZpbGUgZm9yIGxpYmliZXJ0eSBkaXJlY3RvcnkKLSMKLQotc3JjZGlyID0gQHNyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLQotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1iaW5kaXIgPSBAYmluZGlyQAotbGliZGlyID0gQGxpYmRpckAKLQotU0hFTEwgPSBAU0hFTExACi0KLSMgTXVsdGlsaWIgc3VwcG9ydCB2YXJpYWJsZXMuCi1NVUxUSVNSQ1RPUCA9Ci1NVUxUSUJVSUxEVE9QID0KLU1VTFRJRElSUyA9Ci1NVUxUSVNVQkRJUiA9Ci1NVUxUSURPID0gdHJ1ZQotTVVMVElDTEVBTiA9IHRydWUKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi0KLUFSID0gQEFSQAotQVJfRkxBR1MgPSByYwotCi1DQyA9IEBDQ0AKLUNGTEFHUyA9IEBDRkxBR1NACi1MSUJDRkxBR1MgPSAkKENGTEFHUykKLVJBTkxJQiA9IEBSQU5MSUJACi0KLVBJQ0ZMQUcgPQotCi1NQUtFT1ZFUlJJREVTID0KLQotVEFSR0VUTElCID0gbGliaWJlcnR5LmEKLQotTElCT0JKUyA9IEBMSUJPQkpTQAotQUxMT0NBID0gQEFMTE9DQUAKLQotIyBBIGNvbmZpZ3VyYXRpb24gY2FuIHNwZWNpZnkgZXh0cmEgLm8gZmlsZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQsCi0jIGV2ZW4gaWYgdGhleSBhcmUgaW4gbGliYy4gKFBlcmhhcHMgdGhlIGxpYmMgdmVyc2lvbiBpcyBidWdneS4pCi1FWFRSQV9PRklMRVMgPSAKLQotIyBGbGFncyB0byBwYXNzIHRvIGEgcmVjdXJzaXZlIG1ha2UuCi1GTEFHU19UT19QQVNTID0gXAotCSJBUj0kKEFSKSIgXAotCSJBUl9GTEFHUz0kKEFSX0ZMQUdTKSIgXAotCSJDQz0kKENDKSIgXAotCSJDRkxBR1M9JChDRkxBR1MpIiBcCi0JIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKLQkiRVhUUkFfT0ZJTEVTPSQoRVhUUkFfT0ZJTEVTKSIgXAotCSJIREVGSU5FUz0kKEhERUZJTkVTKSIgXAotCSJJTlNUQUxMPSQoSU5TVEFMTCkiIFwKLQkiSU5TVEFMTF9EQVRBPSQoSU5TVEFMTF9EQVRBKSIgXAotCSJJTlNUQUxMX1BST0dSQU09JChJTlNUQUxMX1BST0dSQU0pIiBcCi0JIkxERkxBR1M9JChMREZMQUdTKSIgXAotCSJMT0FETElCRVM9JChMT0FETElCRVMpIiBcCi0JIlJBTkxJQj0kKFJBTkxJQikiIFwKLQkiU0hFTEw9JChTSEVMTCkiIFwKLQkicHJlZml4PSQocHJlZml4KSIgXAotCSJleGVjX3ByZWZpeD0kKGV4ZWNfcHJlZml4KSIgXAotCSJsaWJkaXI9JChsaWJkaXIpIiBcCi0JImxpYnN1YmRpcj0kKGxpYnN1YmRpcikiIFwKLQkidG9vbGRpcj0kKHRvb2xkaXIpIgotCi0jIFN1YmRpcmVjdG9yaWVzIHRvIHJlY3Vyc2UgaW50by4gV2UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGR1cmluZyBjbGVhbmluZwotU1VCRElSUyA9IHRlc3RzdWl0ZQotCi1hbGw6IHN0YW1wLXBpY2RpciAkKFRBUkdFVExJQikgbmVlZGVkLWxpc3QgcmVxdWlyZWQtbGlzdCBhbGwtc3ViZGlyCi0JQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1hbGwKLQotLlBIT05ZOiBjaGVjayBpbnN0YWxsY2hlY2sKLWNoZWNrOiBjaGVjay1zdWJkaXIKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXN1YmRpcgotCi1AaG9zdF9tYWtlZmlsZV9mcmFnQAotCi1JTkNESVI9JChzcmNkaXIpLyQoTVVMVElTUkNUT1ApLi4vaW5jbHVkZQotCi1DT01QSUxFLmMgPSAkKENDKSAtYyBAREVGU0AgJChMSUJDRkxBR1MpIC1JLiAtSSQoSU5DRElSKSAkKEhERUZJTkVTKSBAYWNfbGliaWJlcnR5X3dhcm5fY2ZsYWdzQAotLmMubzoKLQl0ZXN0IHgiJChlbmFibGVfc2hhcmVkKSIgIT0geHllcyB8fCBcCi0JICAkKENPTVBJTEUuYykgJChQSUNGTEFHKSAkPCAtbyBwaWMvJEAKLQkkKENPTVBJTEUuYykgJDwKLQotaW5mbzogaW5mby1zdWJkaXIKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXN1YmRpcgotY2xlYW4taW5mbzogY2xlYW4taW5mby1zdWJkaXIKLWR2aTogZHZpLXN1YmRpcgotCi0jIEluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgaW4gdGhpcyBkaXJlY3RvcnkuCi1IRklMRVMgPSBhbGxvY2EtY29uZi5oCi0KLSMgTk9URTogSWYgeW91IGFkZCBuZXcgZmlsZXMgdG8gdGhlIGxpYnJhcnksIGFkZCB0aGVtIHRvIHRoaXMgbGlzdAotIyAoYWxwaGFiZXRpY2FsKSwgYW5kIGFkZCB0aGVtIHRvIFJFUVVJUkVEX09GSUxFUyBvciBmdW5jcyBpbgotIyBjb25maWd1cmUuaW4uCi1DRklMRVMgPSBhc3ByaW50Zi5jIGFsbG9jYS5jIGFyZ3YuYyBhdGV4aXQuYyBiYXNlbmFtZS5jIGJjbXAuYyBiY29weS5jCSAgICAgIFwKLQliemVyby5jIGNhbGxvYy5jIGNob29zZS10ZW1wLmMgY2xvY2suYyBjb25jYXQuYyBjcGx1cy1kZW0uYyBmZG1hdGNoLmMgXAotCWZubWF0Y2guYyBnZXRjd2QuYyBnZXRwd2QuYyBnZXRvcHQuYyBnZXRvcHQxLmMgZ2V0cGFnZXNpemUuYwkgICAgICBcCi0JZ2V0cnVudGltZS5jIGZsb2F0Zm9ybWF0LmMgaGFzaHRhYi5jIGhleC5jIGluZGV4LmMgaW5zcXVlLmMgbWVtY2hyLmMgIFwKLQltZW1jbXAuYyBtZW1jcHkuYyBtZW1tb3ZlLmMgbWVtc2V0LmMgbWtzdGVtcHMuYyBvYmphbGxvYy5jIG9ic3RhY2suYyAgXAotCXBhcnRpdGlvbi5jIHBleGVjdXRlLmMgcHV0ZW52LmMgcmFuZG9tLmMgcmVuYW1lLmMgcmluZGV4LmMJICAgICAgXAotCXNldGVudi5jIHNpZ3NldG1hc2suYyBzcGFjZXMuYyBzcGxheS10cmVlLmMgc3RyY2FzZWNtcC5jCSAgICAgIFwKLQlzdHJuY2FzZWNtcC5jIHN0cmNoci5jIHN0cmR1cC5jIHN0cmVycm9yLmMgc3RycmNoci5jCQkgICAgICBcCi0Jc3Ryc2lnbmFsLmMgc3Ryc3RyLmMgc3RydG9kLmMgc3RydG9sLmMgc3RydG91bC5jIHRtcG5hbS5jCSAgICAgIFwKLQl2YXNwcmludGYuYyB2Zm9yay5jIHZmcHJpbnRmLmMgdnByaW50Zi5jIHZzcHJpbnRmLmMgd2FpdHBpZC5jCSAgICAgIFwKLQl4YXRleGl0LmMgeGV4aXQuYyB4bWFsbG9jLmMgeG1lbWR1cC5jIHhzdHJkdXAuYyB4c3RyZXJyb3IuYwotCi0jIFRoZXNlIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkuCi1SRVFVSVJFRF9PRklMRVMgPSBhcmd2Lm8gY2hvb3NlLXRlbXAubyBjb25jYXQubyBjcGx1cy1kZW0ubyBcCi0gIGZkbWF0Y2gubyBmbm1hdGNoLm8gZ2V0b3B0Lm8gZ2V0b3B0MS5vIGdldHB3ZC5vIGdldHJ1bnRpbWUubyBoYXNodGFiLm8gXAotICBoZXgubyBmbG9hdGZvcm1hdC5vIG9iamFsbG9jLm8gb2JzdGFjay5vIHBhcnRpdGlvbi5vIHBleGVjdXRlLm8gc3BhY2VzLm8gXAotICBzcGxheS10cmVlLm8gc3RyZXJyb3IubyBzdHJzaWduYWwubyB4YXRleGl0Lm8geGV4aXQubyB4bWFsbG9jLm8gXAotICB4bWVtZHVwLm8geHN0cmR1cC5vIHhzdHJlcnJvci5vCi0KLSQoVEFSR0VUTElCKTogJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKQotCXJtIC1mICQoVEFSR0VUTElCKQotCSQoQVIpICQoQVJfRkxBR1MpICQoVEFSR0VUTElCKSBcCi0JICAkKFJFUVVJUkVEX09GSUxFUykgJChFWFRSQV9PRklMRVMpICQoTElCT0JKUykgJChBTExPQ0EpCi0JJChSQU5MSUIpICQoVEFSR0VUTElCKQotCi1JTlNUQUxMX0RFU1QgPSBASU5TVEFMTF9ERVNUQAotaW5zdGFsbDogaW5zdGFsbF90b18kKElOU1RBTExfREVTVCkgaW5zdGFsbC1zdWJkaXIKLQotaW5zdGFsbF90b19saWJkaXI6IGFsbAotCSQoSU5TVEFMTF9EQVRBKSAkKFRBUkdFVExJQikgJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpbgotCSggY2QgJChsaWJkaXIpJChNVUxUSVNVQkRJUikgOyAkKFJBTkxJQikgJChUQVJHRVRMSUIpbiApCi0JbXYgLWYgJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpbiAkKGxpYmRpcikkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikKLQlAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIG11bHRpLWRvIERPPWluc3RhbGwKLQotaW5zdGFsbF90b190b29sZGlyOiBhbGwKLQkkKElOU1RBTExfREFUQSkgJChUQVJHRVRMSUIpICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpbgotCSggY2QgJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKSA7ICQoUkFOTElCKSAkKFRBUkdFVExJQiluICkKLQltdiAtZiAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKW4gJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikKLQlAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIG11bHRpLWRvIERPPWluc3RhbGwKLQotIyBuZWVkZWQtbGlzdCBpcyB1c2VkIGJ5IGxpYnN0ZGMrKy4gIE5FRURFRCBpcyB0aGUgbGlzdCBvZiBmdW5jdGlvbnMKLSMgdG8gaW5jbHVkZSB0aGVyZS4gIERvIG5vdCBhZGQgYW55dGhpbmcgTEdQTCB0byB0aGlzIGxpc3Q7IGxpYnN0ZGMrKwotIyBjYW4ndCB1c2UgYW55dGhpbmcgZW5jdW1iZXJpbmcuCi1ORUVERUQgPSBhdGV4aXQgY2FsbG9jIG1lbWNociBtZW1jbXAgbWVtY3B5IG1lbW1vdmUgbWVtc2V0IHJlbmFtZSBzdHJjaHIgXAotCSBzdHJlcnJvciBzdHJyY2hyIHN0cnN0ciBzdHJ0b2wgc3RydG91bCB0bXBuYW0gdmZwcmludGYgdnByaW50ZiBcCi0JIHZmb3JrIHdhaXRwaWQgYmNtcCBiY29weSBiemVybwotbmVlZGVkLWxpc3Q6IE1ha2VmaWxlCi0Jcm0gLWYgbmVlZGVkLWxpc3Q7IHRvdWNoIG5lZWRlZC1saXN0OyBcCi0JZm9yIGYgaW4gJChORUVERUQpOyBkbyBcCi0JICBmb3IgZyBpbiAkKExJQk9CSlMpICQoRVhUUkFfT0ZJTEVTKTsgZG8gXAotCSAgICBjYXNlICIkJGciIGluIFwKLQkgICAgICAqJCRmKikgZWNobyAkJGcgPj4gbmVlZGVkLWxpc3QgOzsgXAotCSAgICBlc2FjOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi0jIHJlcXVpcmVkLWxpc3Qgd2FzIHVzZWQgd2hlbiBidWlsZGluZyBhIHNoYXJlZCBiZmQvb3Bjb2Rlcy9saWJpYmVydHkKLSMgbGlicmFyeS4gIEkgZG9uJ3Qga25vdyBpZiBpdCB1c2VkIGJ5IGFueXRoaW5nIGN1cnJlbnRseS4KLXJlcXVpcmVkLWxpc3Q6IE1ha2VmaWxlCi0JZWNobyAkKFJFUVVJUkVEX09GSUxFUykgPiByZXF1aXJlZC1saXN0Ci0KLXN0YW1wLXBpY2RpcjoKLQlpZiBbIHgiJChlbmFibGVfc2hhcmVkKSIgPSB4eWVzIF0gJiYgWyAhIC1kIHBpYyBdOyB0aGVuIFwKLQkgIG1rZGlyIHBpYzsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1waWNkaXIKLQotLlBIT05ZOiBhbGwgZXRhZ3MgdGFncyBscyBjbGVhbiBzdGFnZTEgc3RhZ2UyCi0KLWV0YWdzIHRhZ3M6IFRBR1MgZXRhZ3Mtc3ViZGlyCi0KLVRBR1M6ICQoQ0ZJTEVTKSAkKEhGSUxFUykKLQlldGFncyBgZm9yIGkgaW4gJChIRklMRVMpICQoQ0ZJTEVTKTsgZG8gZWNobyAkKHNyY2RpcikvJCRpIDsgZG9uZWAKLQotIyBUaGUgc3RhbmRhbG9uZSBkZW1hbmdsZXIgKGMrK2ZpbHQpIGhhcyBiZWVuIG1vdmVkIHRvIGJpbnV0aWxzLgotZGVtYW5nbGU6Ci0JQGVjaG8gIlRoZSBzdGFuZGFsb25lIGRlbWFuZ2xlciwgbm93IG5hbWVkIGMrK2ZpbHQsIGlzIG5vdyIKLQlAZWNobyAiYSBwYXJ0IG9mIGJpbnV0aWxzLiIKLQlAZmFsc2UKLQotbHM6Ci0JQGVjaG8gTWFrZWZpbGUgJChIRklMRVMpICQoQ0ZJTEVTKQotCi0jIE5lZWQgdG8gZGVhbCB3aXRoIHByb2ZpbGVkIGxpYnJhcmllcywgdG9vLgotCi0jIENsZWFuaW5nIGhhcyB0byBiZSBkb25lIGNhcmVmdWxseSB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjbGVhbiBvdXIgU1VCRElSUwotIyBtdWx0aXBsZSB0aW1lcywgaGVuY2Ugb3VyIGV4cGxpY2l0IHJlY3Vyc2lvbiB3aXRoIGFuIGVtcHR5IFNVQkRJUlMuCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tc3ViZGlyCi0Jcm0gLXJmICoubyBwaWMgY29yZSBlcnJzIFwjKiAqLkUgYS5vdXQKLQlybSAtZiBuZWVkZWQuYXdrIG5lZWRlZDIuYXdrIGVycm9ycyBkdW1teSBuZWVkZWQtbGlzdCBjb25maWcuaCBzdGFtcC0qCi0Jcm0gLWYgJChDT05GSUdfSCkgJChORUVERURfTElTVCkgc3RhbXAtcGljZGlyCi0JQCQoTVVMVElDTEVBTikgbXVsdGktY2xlYW4gRE89bW9zdGx5Y2xlYW4KLWNsZWFuOiBjbGVhbi1zdWJkaXIKLQkkKE1BS0UpIFNVQkRJUlM9IiIgbW9zdGx5Y2xlYW4KLQlybSAtZiAqLmEgcmVxdWlyZWQtbGlzdCB0bXBtdWx0aS5vdXQKLQlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1jbGVhbgotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tc3ViZGlyCi0JJChNQUtFKSBTVUJESVJTPSIiIGNsZWFuCi0JQCQoTVVMVElDTEVBTikgbXVsdGktY2xlYW4gRE89ZGlzdGNsZWFuCi0Jcm0gLWYgKn4gTWFrZWZpbGUgY29uZmlnLnN0YXR1cyB4aG9zdC1ta2ZyYWcgVEFHUyBtdWx0aWxpYi5vdXQKLQlybSAtZiBjb25maWcubG9nCi1tYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogbWFpbnRhaW5lci1jbGVhbi1zdWJkaXIKLQkkKE1BS0UpIFNVQkRJUlM9IiIgZGlzdGNsZWFuCi0KLWZvcmNlOgotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKLQlDT05GSUdfRklMRVM9TWFrZWZpbGUgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1jb25maWcuaDogc3RhbXAtaCA7IEB0cnVlCi1zdGFtcC1oOiBjb25maWcuaW4gY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWcudGFibGUKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLQotYWxsLXN1YmRpciBjaGVjay1zdWJkaXIgaW5zdGFsbGNoZWNrLXN1YmRpciBpbmZvLXN1YmRpcglcCi1pbnN0YWxsLWluZm8tc3ViZGlyIGNsZWFuLWluZm8tc3ViZGlyIGR2aS1zdWJkaXIgaW5zdGFsbC1zdWJkaXIJXAotZXRhZ3Mtc3ViZGlyIG1vc3RseWNsZWFuLXN1YmRpciBjbGVhbi1zdWJkaXIgZGlzdGNsZWFuLXN1YmRpciBcCi1tYWludGFpbmVyLWNsZWFuLXN1YmRpcjoKLQlAdGFyZ2V0PWBlY2hvICRAIHwgc2VkIC1lICdzLy1zdWJkaXIvLydgOyBcCi0JZm9yIGRpciBpbiAuICQoU1VCRElSUykgOyBkbyBcCi0JICB0ZXN0ICQkZGlyID0gLiB8fCAoY2QgJCRkaXIgJiYgJChNQUtFKSAkJHRhcmdldCkgfHwgZXhpdCAxOyBcCi0JZG9uZQotCi0kKFJFUVVJUkVEX09GSUxFUykgJChFWFRSQV9PRklMRVMpICQoTElCT0JKUykgJChBTExPQ0EpOiBzdGFtcC1waWNkaXIKLQotYWxsb2NhLm86IGNvbmZpZy5oCi1hdGV4aXQubzogY29uZmlnLmgKLWFyZ3YubzogY29uZmlnLmggYWxsb2NhLWNvbmYuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJhc2VuYW1lLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotY2hvb3NlLXRlbXAubzogY29uZmlnLmgKLWNsb2NrLm86IGNvbmZpZy5oCi1jb25jYXQubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1jcGx1cy1kZW0ubzogY29uZmlnLmggJChJTkNESVIpL2RlbWFuZ2xlLmgKLWZkbWF0Y2gubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1mbm1hdGNoLm86IGNvbmZpZy5oICQoSU5DRElSKS9mbm1hdGNoLmgKLWdldGN3ZC5vOiBjb25maWcuaAotZ2V0b3B0Lm86IGNvbmZpZy5oICQoSU5DRElSKS9nZXRvcHQuaAotZ2V0b3B0MS5vOiBjb25maWcuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLWdldHBhZ2VzaXplLm86IGNvbmZpZy5oCi1nZXRwd2QubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1nZXRydW50aW1lLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotaGV4Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotZmxvYXRmb3JtYXQubzogJChJTkNESVIpL2Zsb2F0Zm9ybWF0LmgKLW1rc3RlbXBzLm86IGNvbmZpZy5oCi1vYmphbGxvYy5vOiAkKElOQ0RJUikvb2JqYWxsb2MuaAotb2JzdGFjay5vOiBjb25maWcuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1wYXJ0aXRpb24ubzogY29uZmlnLmggJChJTkNESVIpL3BhcnRpdGlvbi5oCi1wZXhlY3V0ZS5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXNldGVudi5vOiBjb25maWcuaAotc3BhY2VzLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotc3BsYXktdHJlZS5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL3NwbGF5LXRyZWUuaCAkKElOQ0RJUikvYW5zaWRlY2wuaAotc3RyZXJyb3IubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zdHJzaWduYWwubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi14YXRleGl0Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAoteGV4aXQubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi14bWFsbG9jLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAoteG1lbWR1cC5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhzdHJkdXAubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi14c3RyZXJyb3IubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1oYXNodGFiLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvaGFzaHRhYi5oICQoSU5DRElSKS9hbnNpZGVjbC5oCmRpZmYgLS1naXQgYS9saWJpYmVydHkvUkVBRE1FIGIvbGliaWJlcnR5L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MjI2YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIC1saWJlcnR5IGxpYnJhcnkgb2YgZnJlZSBzb2Z0d2FyZS4KLUl0IGlzIGEgY29sbGVjdGlvbiBvZiBzdWJyb3V0aW5lcyB1c2VkIGJ5IHZhcmlvdXMgR05VIHByb2dyYW1zLgotQ3VycmVudCBtZW1iZXJzIGluY2x1ZGU6Ci0KLQlnZXRvcHQgLS0gZ2V0IG9wdGlvbnMgZnJvbSBjb21tYW5kIGxpbmUKLQlvYnN0YWNrIC0tIHN0YWNrcyBvZiBhcmJpdHJhcmlseS1zaXplZCBvYmplY3RzCi0Jc3RyZXJyb3IgLS0gZXJyb3IgbWVzc2FnZSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gZXJybm8KLQlzdHJ0b2wgLS0gc3RyaW5nLXRvLWxvbmcgY29udmVyc2lvbgotCXN0cnRvdWwgLS0gc3RyaW5nLXRvLXVuc2lnbmVkLWxvbmcgY29udmVyc2lvbgotCi1XZSBleHBlY3QgbWFueSBvZiB0aGUgR05VIHN1YnJvdXRpbmVzIHRoYXQgYXJlIGZsb2F0aW5nIGFyb3VuZCB0bwotZXZlbnR1YWxseSBhcnJpdmUgaGVyZS4KLQotVGhlIGxpYnJhcnkgbXVzdCBiZSBjb25maWd1cmVkIGZyb20gdGhlIHRvcCBzb3VyY2UgZGlyZWN0b3J5LiAgRG9uJ3QKLXRyeSB0byBydW4gY29uZmlndXJlIGluIHRoaXMgZGlyZWN0b3J5LiAgRm9sbG93IHRoZSBjb25maWd1cmF0aW9uCi1pbnN0cnVjdGlvbnMgaW4gLi4vUkVBRE1FLgotCi1QbGVhc2UgcmVwb3J0IGJ1Z3MgYW5kIGZpeGVzIHRvICJidWctZ251LXV0aWxzQHByZXAuYWkubWl0LmVkdSIuICBUaGFuayB5b3UuCi0KLUFERElORyBBIE5FVyBGSUxFCi09PT09PT09PT09PT09PT09PQotCi1UaGVyZSBhcmUgdHdvIHNldHMgb2YgZmlsZXM6ICBUaG9zZSB0aGF0IGFyZSAicmVxdWlyZWQiIHdpbGwgYmUKLWluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5IGZvciBhbGwgY29uZmlndXJhdGlvbnMsIHdoaWxlIHRob3NlCi10aGF0IGFyZSAib3B0aW9uYWwiIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkgb25seSBpZiAibmVlZGVkLiIKLQotVG8gYWRkIGEgbmV3IHJlcXVpcmVkIGZpbGUsIGVkaXQgTWFrZWZpbGUgdG8gYWRkIHRoZSBzb3VyY2UgZmlsZQotbmFtZSB0byBDRklMRVMgYW5kIHRoZSBvYmplY3QgZmlsZSB0byBSRVFVSVJFRF9PRklMRVMuCi0KLVRvIGFkZCBhIG5ldyBvcHRpb25hbCBmaWxlLCBpdCBtdXN0IHByb3ZpZGUgYSBzaW5nbGUgZnVuY3Rpb24sIGFuZCB0aGUKLW5hbWUgb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0KLSAgICAqIEFkZCB0aGUgc291cmNlIGZpbGUgbmFtZSB0byBDRklMRVMuCi0KLSAgICAqIEFkZCB0aGUgZnVuY3Rpb24gdG8gbmFtZSB0byB0aGUgZnVuY3Mgc2hlbGwgdmFyaWFibGUgaW4KLSAgICAgIGNvbmZpZ3VyZS5pbi4KLQotICAgICogQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgQUNfQ0hFQ0tfRlVOQ1MgbGlzdHMganVzdCBhZnRlciB0aGUKLSAgICAgIHNldHRpbmcgb2YgdGhlIGZ1bmNzIHNoZWxsIHZhcmlhYmxlLiAgVGhlc2UgQUNfQ0hFQ0tfRlVOQ1MgY2FsbHMKLSAgICAgIGFyZSBuZXZlciBleGVjdXRlZDsgdGhleSBhcmUgdGhlcmUgdG8gbWFrZSBhdXRvaGVhZGVyIHdvcmsKLSAgICAgIGJldHRlci4KLQotICAgICogQ29uc2lkZXIgdGhlIHNwZWNpYWwgY2FzZXMgb2YgYnVpbGRpbmcgbGliaWJlcnR5OyBhcyBvZiB0aGlzCi0gICAgICB3cml0aW5nLCB0aGUgc3BlY2lhbCBjYXNlcyBhcmUgbmV3bGliIGFuZCBWeFdvcmtzLiAgSWYgYQotICAgICAgcGFydGljdWxhciBzcGVjaWFsIGNhc2UgcHJvdmlkZXMgdGhlIGZ1bmN0aW9uLCB5b3UgZG8gbm90IG5lZWQKLSAgICAgIHRvIGRvIGFueXRoaW5nLiAgSWYgaXQgZG9lcyBub3QgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIGFkZCB0aGUKLSAgICAgIG9iamVjdCBmaWxlIHRvIExJQk9CSlMsIGFuZCBhZGQgdGhlIGZ1bmN0aW9uIG5hbWUgdG8gdGhlIGNhc2UKLSAgICAgIGNvbnRyb2xsaW5nIHdoZXRoZXIgdG8gZGVmaW5lIEhBVkVfZnVuYy4KLQotVGhlIG9wdGlvbmFsIGZpbGUgeW91J3ZlIGFkZGVkIChlLmcuIGdldGN3ZC5jKSBzaG91bGQgY29tcGlsZSBhbmQgd29yawotb24gYWxsIGhvc3RzIHdoZXJlIGl0IGlzIG5lZWRlZC4gIEl0IGRvZXMgbm90IGhhdmUgdG8gd29yayBvciBldmVuCi1jb21waWxlIG9uIGhvc3RzIHdoZXJlIGl0IGlzIG5vdCBuZWVkZWQuCi0KLUFERElORyBBIE5FVyBDT05GSUdVUkFUSU9OCi09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1PbiBtb3N0IGhvc3RzIHlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhlIHNjaGVtZSBmb3IgYXV0b21hdGljYWxseQotZmlndXJpbmcgb3V0IHdoaWNoIGZpbGVzIGFyZSBuZWVkZWQuICBJbiB0aGF0IGNhc2UsIHlvdSBwcm9iYWJseQotZG9uJ3QgbmVlZCBhIHNwZWNpYWwgTWFrZWZpbGUgc3R1YiBmb3IgdGhhdCBjb25maWd1cmF0aW9uLgotCi1JZiB0aGUgZnVsbHkgYXV0b21hdGljIHNjaGVtZSBkb2Vzbid0IHdvcmssIHlvdSBtYXkgYmUgYWJsZSB0byBnZXQKLWJ5IHdpdGggZGVmaW5pbmcgRVhUUkFfT0ZJTEVTIGluIHlvdXIgTWFrZWZpbGUgc3R1Yi4gIFRoaXMgaXMKLWEgbGlzdCBvZiBvYmplY3QgZmlsZSBuYW1lcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIHJlcXVpcmVkCi1mb3IgdGhpcyBjb25maWd1cmF0aW9uIC0gdGhleSB3aWxsIGJlIGluY2x1ZGVkIGluIGxpYmliZXJ0eS5hLAotcmVnYXJkbGVzcyBvZiB3aGF0ZXZlciBtaWdodCBiZSBpbiB0aGUgQyBsaWJyYXJ5LgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FjY29uZmlnLmggYi9saWJpYmVydHkvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNTk5ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX2Vycmxpc3QgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfbmVyciB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkVSUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19zaWdsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hbGxvY2EtY29uZi5oIGIvbGliaWJlcnR5L2FsbG9jYS1jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljM2VlYTMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FsbG9jYS1jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgaWZuZGVmIGFsbG9jYQotIyAgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGVuZGlmCi0jZWxzZSAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICBpZiBkZWZpbmVkKEhBVkVfQUxMT0NBX0gpICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZSAvKiAhIGRlZmluZWQgKEhBVkVfQUxMT0NBX0gpICovCi0jICAgaWZkZWYgX19TVERDX18KLWV4dGVybiBQVFIgYWxsb2NhIChzaXplX3QpOwotIyAgIGVsc2UgLyogISBkZWZpbmVkIChfX1NURENfXykgKi8KLWV4dGVybiBQVFIgYWxsb2NhICgpOwotIyAgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19TVERDX18pICovCi0jICBlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfQUxMT0NBX0gpICovCi0jICBpZmRlZiBfV0lOMzIKLSMgICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGVuZGlmCi0jIGVuZGlmIC8qICEgZGVmaW5lZCAoX0FJWCkgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FsbG9jYS5jIGIvbGliaWJlcnR5L2FsbG9jYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjhhMjE1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hbGxvY2EuYworKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKiBhbGxvY2EuYyAtLSBhbGxvY2F0ZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCBtZW1vcnkKLSAgIChNb3N0bHkpIHBvcnRhYmxlIHB1YmxpYy1kb21haW4gaW1wbGVtZW50YXRpb24gLS0gRCBBIEd3eW4KLQotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUFdCIGxpYnJhcnkgYWxsb2NhIGZ1bmN0aW9uLAotICAgd2hpY2ggaXMgdXNlZCB0byBhbGxvY2F0ZSBzcGFjZSBvZmYgdGhlIHJ1bi10aW1lIHN0YWNrIHNvCi0gICB0aGF0IGl0IGlzIGF1dG9tYXRpY2FsbHkgcmVjbGFpbWVkIHVwb24gcHJvY2VkdXJlIGV4aXQsCi0gICB3YXMgaW5zcGlyZWQgYnkgZGlzY3Vzc2lvbnMgd2l0aCBKLiBRLiBKb2huc29uIG9mIENvcm5lbGwuCi0gICBKLk90dG8gVGVubmFudCA8am90QGNyYXkuY29tPiBjb250cmlidXRlZCB0aGUgQ3JheSBzdXBwb3J0LgotCi0gICBUaGVyZSBhcmUgc29tZSBwcmVwcm9jZXNzb3IgY29uc3RhbnRzIHRoYXQgY2FuCi0gICBiZSBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIGZvciB5b3VyIHNwZWNpZmljIHN5c3RlbSwgZm9yCi0gICBpbXByb3ZlZCBlZmZpY2llbmN5OyBob3dldmVyLCB0aGUgZGVmYXVsdHMgc2hvdWxkIGJlIG9rYXkuCi0KLSAgIFRoZSBnZW5lcmFsIGNvbmNlcHQgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBrZWVwCi0gICB0cmFjayBvZiBhbGwgYWxsb2NhLWFsbG9jYXRlZCBibG9ja3MsIGFuZCByZWNsYWltIGFueQotICAgdGhhdCBhcmUgZm91bmQgdG8gYmUgZGVlcGVyIGluIHRoZSBzdGFjayB0aGFuIHRoZSBjdXJyZW50Ci0gICBpbnZvY2F0aW9uLiAgVGhpcyBoZXVyaXN0aWMgZG9lcyBub3QgcmVjbGFpbSBzdG9yYWdlIGFzCi0gICBzb29uIGFzIGl0IGJlY29tZXMgaW52YWxpZCwgYnV0IGl0IHdpbGwgZG8gc28gZXZlbnR1YWxseS4KLQotICAgQXMgYSBzcGVjaWFsIGNhc2UsIGFsbG9jYSgwKSByZWNsYWltcyBzdG9yYWdlIHdpdGhvdXQKLSAgIGFsbG9jYXRpbmcgYW55LiAgSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlIGFsbG9jYSgwKSBpbgotICAgeW91ciBtYWluIGNvbnRyb2wgbG9vcCwgZXRjLiB0byBmb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIGVtYWNzCi0jaW5jbHVkZSAiYmxvY2tpbnB1dC5oIgotI2VuZGlmCi0KLS8qIElmIGNvbXBpbGluZyB3aXRoIEdDQyAyLCB0aGlzIGZpbGUncyBub3QgbmVlZGVkLiAgRXhjZXB0IG9mIGNvdXJzZSBpZgotICAgdGhlIEMgYWxsb2NhIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgKi8KLSNpZiBkZWZpbmVkIChVU0VfQ19BTExPQ0EpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykgfHwgX19HTlVDX18gPCAyCi0KLS8qIElmIHNvbWVvbmUgaGFzIGRlZmluZWQgYWxsb2NhIGFzIGEgbWFjcm8sCi0gICB0aGVyZSBtdXN0IGJlIHNvbWUgb3RoZXIgd2F5IGFsbG9jYSBpcyBzdXBwb3NlZCB0byB3b3JrLiAgKi8KLSNpZm5kZWYgYWxsb2NhCi0KLSNpZmRlZiBlbWFjcwotI2lmZGVmIHN0YXRpYwotLyogYWN0dWFsbHksIG9ubHkgd2FudCB0aGlzIGlmIHN0YXRpYyBpcyBkZWZpbmVkIGFzICIiCi0gICAtLSB0aGlzIGlzIGZvciB1c2csIGluIHdoaWNoIGVtYWNzIG11c3QgdW5kZWZpbmUgc3RhdGljCi0gICBpbiBvcmRlciB0byBtYWtlIHVuZXhlYyB3b3JrYWJsZQotICAgKi8KLSNpZm5kZWYgU1RBQ0tfRElSRUNUSU9OCi15b3UKLWxvc2UKLS0tIG11c3Qga25vdyBTVEFDS19ESVJFQ1RJT04gYXQgY29tcGlsZS10aW1lCi0jZW5kaWYgLyogU1RBQ0tfRElSRUNUSU9OIHVuZGVmaW5lZCAqLwotI2VuZGlmIC8qIHN0YXRpYyAqLwotI2VuZGlmIC8qIGVtYWNzICovCi0KLS8qIElmIHlvdXIgc3RhY2sgaXMgYSBsaW5rZWQgbGlzdCBvZiBmcmFtZXMsIHlvdSBoYXZlIHRvCi0gICBwcm92aWRlIGFuICJhZGRyZXNzIG1ldHJpYyIgQUREUkVTU19GVU5DVElPTiBtYWNyby4gICovCi0KLSNpZiBkZWZpbmVkIChDUkFZKSAmJiBkZWZpbmVkIChDUkFZX1NUQUNLU0VHX0VORCkKLWxvbmcgaTAwYWZ1bmMgKCk7Ci0jZGVmaW5lIEFERFJFU1NfRlVOQ1RJT04oYXJnKSAoY2hhciAqKSBpMDBhZnVuYyAoJihhcmcpKQotI2Vsc2UKLSNkZWZpbmUgQUREUkVTU19GVU5DVElPTihhcmcpICYoYXJnKQotI2VuZGlmCi0KLSNpZiBfX1NURENfXwotdHlwZWRlZiB2b2lkICpwb2ludGVyOwotI2Vsc2UKLXR5cGVkZWYgY2hhciAqcG9pbnRlcjsKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUJTlVMTAkwCi0jZW5kaWYKLQotLyogRGlmZmVyZW50IHBvcnRpb25zIG9mIEVtYWNzIG5lZWQgdG8gY2FsbCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKLSAgIG1hbGxvYy4gIFRoZSBFbWFjcyBleGVjdXRhYmxlIG5lZWRzIGFsbG9jYSB0byBjYWxsIHhtYWxsb2MsIGJlY2F1c2UKLSAgIG9yZGluYXJ5IG1hbGxvYyBpc24ndCBwcm90ZWN0ZWQgZnJvbSBpbnB1dCBzaWduYWxzLiAgT24gdGhlIG90aGVyCi0gICBoYW5kLCB0aGUgdXRpbGl0aWVzIGluIGxpYi1zcmMgbmVlZCBhbGxvY2EgdG8gY2FsbCBtYWxsb2M7IHNvbWUgb2YKLSAgIHRoZW0gYXJlIHZlcnkgc2ltcGxlLCBhbmQgZG9uJ3QgaGF2ZSBhbiB4bWFsbG9jIHJvdXRpbmUuCi0KLSAgIE5vbi1FbWFjcyBwcm9ncmFtcyBleHBlY3QgdGhpcyB0byBjYWxsIHVzZSB4bWFsbG9jLgotCi0gICBDYWxsZXJzIGJlbG93IHNob3VsZCB1c2UgbWFsbG9jLiAgKi8KLQotI2lmbmRlZiBlbWFjcwotI2RlZmluZSBtYWxsb2MgeG1hbGxvYwotI2VuZGlmCi1leHRlcm4gcG9pbnRlciBtYWxsb2MgKCk7Ci0KLS8qIERlZmluZSBTVEFDS19ESVJFQ1RJT04gaWYgeW91IGtub3cgdGhlIGRpcmVjdGlvbiBvZiBzdGFjawotICAgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseQotICAgZGVkdWNlZCBhdCBydW4tdGltZS4KLQotICAgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotICAgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gICBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93biAgKi8KLQotI2lmbmRlZiBTVEFDS19ESVJFQ1RJT04KLSNkZWZpbmUJU1RBQ0tfRElSRUNUSU9OCTAJLyogRGlyZWN0aW9uIHVua25vd24uICAqLwotI2VuZGlmCi0KLSNpZiBTVEFDS19ESVJFQ1RJT04gIT0gMAotCi0jZGVmaW5lCVNUQUNLX0RJUglTVEFDS19ESVJFQ1RJT04JLyogS25vd24gYXQgY29tcGlsZS10aW1lLiAgKi8KLQotI2Vsc2UgLyogU1RBQ0tfRElSRUNUSU9OID09IDA7IG5lZWQgcnVuLXRpbWUgY29kZS4gICovCi0KLXN0YXRpYyBpbnQgc3RhY2tfZGlyOwkJLyogMSBvciAtMSBvbmNlIGtub3duLiAgKi8KLSNkZWZpbmUJU1RBQ0tfRElSCXN0YWNrX2RpcgotCi1zdGF0aWMgdm9pZAotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSBOVUxMOwkvKiBBZGRyZXNzIG9mIGZpcnN0IGBkdW1teScsIG9uY2Uga25vd24uICAqLwotICBhdXRvIGNoYXIgZHVtbXk7CQkvKiBUbyBnZXQgc3RhY2sgYWRkcmVzcy4gICovCi0KLSAgaWYgKGFkZHIgPT0gTlVMTCkKLSAgICB7CQkJCS8qIEluaXRpYWwgZW50cnkuICAqLwotICAgICAgYWRkciA9IEFERFJFU1NfRlVOQ1RJT04gKGR1bW15KTsKLQotICAgICAgZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CS8qIFJlY3Vyc2Ugb25jZS4gICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogU2Vjb25kIGVudHJ5LiAgKi8KLSAgICAgIGlmIChBRERSRVNTX0ZVTkNUSU9OIChkdW1teSkgPiBhZGRyKQotCXN0YWNrX2RpciA9IDE7CQkvKiBTdGFjayBncmV3IHVwd2FyZC4gICovCi0gICAgICBlbHNlCi0Jc3RhY2tfZGlyID0gLTE7CQkvKiBTdGFjayBncmV3IGRvd253YXJkLiAgKi8KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBTVEFDS19ESVJFQ1RJT04gPT0gMCAqLwotCi0vKiBBbiAiYWxsb2NhIGhlYWRlciIgaXMgdXNlZCB0bzoKLSAgIChhKSBjaGFpbiB0b2dldGhlciBhbGwgYWxsb2NhJ2VkIGJsb2NrczsKLSAgIChiKSBrZWVwIHRyYWNrIG9mIHN0YWNrIGRlcHRoLgotCi0gICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHNpemVvZihoZWFkZXIpIGFncmVlIHdpdGggbWFsbG9jCi0gICBhbGlnbm1lbnQgY2h1bmsgc2l6ZS4gIFRoZSBmb2xsb3dpbmcgZGVmYXVsdCBzaG91bGQgd29yayBva2F5LiAgKi8KLQotI2lmbmRlZglBTElHTl9TSVpFCi0jZGVmaW5lCUFMSUdOX1NJWkUJc2l6ZW9mKGRvdWJsZSkKLSNlbmRpZgotCi10eXBlZGVmIHVuaW9uIGhkcgotewotICBjaGFyIGFsaWduW0FMSUdOX1NJWkVdOwkvKiBUbyBmb3JjZSBzaXplb2YoaGVhZGVyKS4gICovCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuaW9uIGhkciAqbmV4dDsJCS8qIEZvciBjaGFpbmluZyBoZWFkZXJzLiAgKi8KLSAgICAgIGNoYXIgKmRlZXA7CQkvKiBGb3Igc3RhY2sgZGVwdGggbWVhc3VyZS4gICovCi0gICAgfSBoOwotfSBoZWFkZXI7Ci0KLXN0YXRpYyBoZWFkZXIgKmxhc3RfYWxsb2NhX2hlYWRlciA9IE5VTEw7CS8qIC0+IGxhc3QgYWxsb2NhIGhlYWRlci4gICovCi0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gYXQgbGVhc3QgU0laRSBieXRlcyBvZiBzdG9yYWdlLAotICAgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCB1cG9uIGV4aXQgZnJvbQotICAgdGhlIHByb2NlZHVyZSB0aGF0IGNhbGxlZCBhbGxvY2EuICBPcmlnaW5hbGx5LCB0aGlzIHNwYWNlCi0gICB3YXMgc3VwcG9zZWQgdG8gYmUgdGFrZW4gZnJvbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZSBvZiB0aGUKLSAgIGNhbGxlciwgYnV0IHRoYXQgbWV0aG9kIGNhbm5vdCBiZSBtYWRlIHRvIHdvcmsgZm9yIHNvbWUKLSAgIGltcGxlbWVudGF0aW9ucyBvZiBDLCBmb3IgZXhhbXBsZSB1bmRlciBHb3VsZCdzIFVUWC8zMi4gICovCi0KLXBvaW50ZXIKLWFsbG9jYSAoc2l6ZSkKLSAgICAgdW5zaWduZWQgc2l6ZTsKLXsKLSAgYXV0byBjaGFyIHByb2JlOwkJLyogUHJvYmVzIHN0YWNrIGRlcHRoOiAqLwotICByZWdpc3RlciBjaGFyICpkZXB0aCA9IEFERFJFU1NfRlVOQ1RJT04gKHByb2JlKTsKLQotI2lmIFNUQUNLX0RJUkVDVElPTiA9PSAwCi0gIGlmIChTVEFDS19ESVIgPT0gMCkJCS8qIFVua25vd24gZ3Jvd3RoIGRpcmVjdGlvbi4gICovCi0gICAgZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0jZW5kaWYKLQotICAvKiBSZWNsYWltIGdhcmJhZ2UsIGRlZmluZWQgYXMgYWxsIGFsbG9jYSdkIHN0b3JhZ2UgdGhhdAotICAgICB3YXMgYWxsb2NhdGVkIGZyb20gZGVlcGVyIGluIHRoZSBzdGFjayB0aGFuIGN1cnJlbnRseS4gICovCi0KLSAgewotICAgIHJlZ2lzdGVyIGhlYWRlciAqaHA7CS8qIFRyYXZlcnNlcyBsaW5rZWQgbGlzdC4gICovCi0KLSNpZmRlZiBlbWFjcwotICAgIEJMT0NLX0lOUFVUOwotI2VuZGlmCi0KLSAgICBmb3IgKGhwID0gbGFzdF9hbGxvY2FfaGVhZGVyOyBocCAhPSBOVUxMOykKLSAgICAgIGlmICgoU1RBQ0tfRElSID4gMCAmJiBocC0+aC5kZWVwID4gZGVwdGgpCi0JICB8fCAoU1RBQ0tfRElSIDwgMCAmJiBocC0+aC5kZWVwIDwgZGVwdGgpKQotCXsKLQkgIHJlZ2lzdGVyIGhlYWRlciAqbnAgPSBocC0+aC5uZXh0OwotCi0JICBmcmVlICgocG9pbnRlcikgaHApOwkvKiBDb2xsZWN0IGdhcmJhZ2UuICAqLwotCi0JICBocCA9IG5wOwkJLyogLT4gbmV4dCBoZWFkZXIuICAqLwotCX0KLSAgICAgIGVsc2UKLQlicmVhazsJCQkvKiBSZXN0IGFyZSBub3QgZGVlcGVyLiAgKi8KLQotICAgIGxhc3RfYWxsb2NhX2hlYWRlciA9IGhwOwkvKiAtPiBsYXN0IHZhbGlkIHN0b3JhZ2UuICAqLwotCi0jaWZkZWYgZW1hY3MKLSAgICBVTkJMT0NLX0lOUFVUOwotI2VuZGlmCi0gIH0KLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHJldHVybiBOVUxMOwkJLyogTm8gYWxsb2NhdGlvbiByZXF1aXJlZC4gICovCi0KLSAgLyogQWxsb2NhdGUgY29tYmluZWQgaGVhZGVyICsgdXNlciBkYXRhIHN0b3JhZ2UuICAqLwotCi0gIHsKLSAgICByZWdpc3RlciBwb2ludGVyIG5ldyA9IG1hbGxvYyAoc2l6ZW9mIChoZWFkZXIpICsgc2l6ZSk7Ci0gICAgLyogQWRkcmVzcyBvZiBoZWFkZXIuICAqLwotCi0gICAgaWYgKG5ldyA9PSAwKQotICAgICAgYWJvcnQoKTsKLQotICAgICgoaGVhZGVyICopIG5ldyktPmgubmV4dCA9IGxhc3RfYWxsb2NhX2hlYWRlcjsKLSAgICAoKGhlYWRlciAqKSBuZXcpLT5oLmRlZXAgPSBkZXB0aDsKLQotICAgIGxhc3RfYWxsb2NhX2hlYWRlciA9IChoZWFkZXIgKikgbmV3OwotCi0gICAgLyogVXNlciBzdG9yYWdlIGJlZ2lucyBqdXN0IGFmdGVyIGhlYWRlci4gICovCi0KLSAgICByZXR1cm4gKHBvaW50ZXIpICgoY2hhciAqKSBuZXcgKyBzaXplb2YgKGhlYWRlcikpOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkIChDUkFZKSAmJiBkZWZpbmVkIChDUkFZX1NUQUNLU0VHX0VORCkKLQotI2lmZGVmIERFQlVHX0kwMEFGVU5DCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jaWZuZGVmIENSQVlfU1RBQ0sKLSNkZWZpbmUgQ1JBWV9TVEFDSwotI2lmbmRlZiBDUkFZMgotLyogU3RhY2sgc3RydWN0dXJlcyBmb3IgQ1JBWS0xLCBDUkFZIFgtTVAsIGFuZCBDUkFZIFktTVAgKi8KLXN0cnVjdCBzdGFja19jb250cm9sX2hlYWRlcgotICB7Ci0gICAgbG9uZyBzaGdyb3c6MzI7CQkvKiBOdW1iZXIgb2YgdGltZXMgc3RhY2sgaGFzIGdyb3duLiAgKi8KLSAgICBsb25nIHNoYXNlZzozMjsJCS8qIFNpemUgb2YgaW5jcmVtZW50cyB0byBzdGFjay4gICovCi0gICAgbG9uZyBzaGh3bTozMjsJCS8qIEhpZ2ggd2F0ZXIgbWFyayBvZiBzdGFjay4gICovCi0gICAgbG9uZyBzaHNpemU6MzI7CQkvKiBDdXJyZW50IHNpemUgb2Ygc3RhY2sgKGFsbCBzZWdtZW50cykuICAqLwotICB9OwotCi0vKiBUaGUgc3RhY2sgc2VnbWVudCBsaW5rYWdlIGNvbnRyb2wgaW5mb3JtYXRpb24gb2NjdXJzIGF0Ci0gICB0aGUgaGlnaC1hZGRyZXNzIGVuZCBvZiBhIHN0YWNrIHNlZ21lbnQuICAoVGhlIHN0YWNrCi0gICBncm93cyBmcm9tIGxvdyBhZGRyZXNzZXMgdG8gaGlnaCBhZGRyZXNzZXMuKSAgVGhlIGluaXRpYWwKLSAgIHBhcnQgb2YgdGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sIGluZm9ybWF0aW9uIGlzCi0gICAwMjAwIChvY3RhbCkgd29yZHMuICBUaGlzIHByb3ZpZGVzIGZvciByZWdpc3RlciBzdG9yYWdlCi0gICBmb3IgdGhlIHJvdXRpbmUgd2hpY2ggb3ZlcmZsb3dzIHRoZSBzdGFjay4gICovCi0KLXN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UKLSAgewotICAgIGxvbmcgc3NbMDIwMF07CQkvKiAwMjAwIG92ZXJmbG93IHdvcmRzLiAgKi8KLSAgICBsb25nIHNzc2l6ZTozMjsJCS8qIE51bWJlciBvZiB3b3JkcyBpbiB0aGlzIHNlZ21lbnQuICAqLwotICAgIGxvbmcgc3NiYXNlOjMyOwkJLyogT2Zmc2V0IHRvIHN0YWNrIGJhc2UuICAqLwotICAgIGxvbmc6MzI7Ci0gICAgbG9uZyBzc3BzZWc6MzI7CQkvKiBPZmZzZXQgdG8gbGlua2FnZSBjb250cm9sIG9mIHByZXZpb3VzCi0JCQkJICAgc2VnbWVudCBvZiBzdGFjay4gICovCi0gICAgbG9uZzozMjsKLSAgICBsb25nIHNzdGNwdDozMjsJCS8qIFBvaW50ZXIgdG8gdGFzayBjb21tb24gYWRkcmVzcyBibG9jay4gICovCi0gICAgbG9uZyBzc2Nzbm07CQkvKiBQcml2YXRlIGNvbnRyb2wgc3RydWN0dXJlIG51bWJlciBmb3IKLQkJCQkgICBtaWNyb3Rhc2tpbmcuICAqLwotICAgIGxvbmcgc3N1c3IxOwkJLyogUmVzZXJ2ZWQgZm9yIHVzZXIuICAqLwotICAgIGxvbmcgc3N1c3IyOwkJLyogUmVzZXJ2ZWQgZm9yIHVzZXIuICAqLwotICAgIGxvbmcgc3N0cGlkOwkJLyogUHJvY2VzcyBJRCBmb3IgcGlkIGJhc2VkIG11bHRpLXRhc2tpbmcuICAqLwotICAgIGxvbmcgc3NndnVwOwkJLyogUG9pbnRlciB0byBtdWx0aXRhc2tpbmcgdGhyZWFkIGdpdmV1cC4gICovCi0gICAgbG9uZyBzc2NyYXlbN107CQkvKiBSZXNlcnZlZCBmb3IgQ3JheSBSZXNlYXJjaC4gICovCi0gICAgbG9uZyBzc2EwOwotICAgIGxvbmcgc3NhMTsKLSAgICBsb25nIHNzYTI7Ci0gICAgbG9uZyBzc2EzOwotICAgIGxvbmcgc3NhNDsKLSAgICBsb25nIHNzYTU7Ci0gICAgbG9uZyBzc2E2OwotICAgIGxvbmcgc3NhNzsKLSAgICBsb25nIHNzczA7Ci0gICAgbG9uZyBzc3MxOwotICAgIGxvbmcgc3NzMjsKLSAgICBsb25nIHNzczM7Ci0gICAgbG9uZyBzc3M0OwotICAgIGxvbmcgc3NzNTsKLSAgICBsb25nIHNzczY7Ci0gICAgbG9uZyBzc3M3OwotICB9OwotCi0jZWxzZSAvKiBDUkFZMiAqLwotLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgdmVjdG9yIG9mIHdvcmRzCi0gICByZXR1cm5lZCBieSB0aGUgU1RLU1RBVCBsaWJyYXJ5IHJvdXRpbmUuICAqLwotc3RydWN0IHN0a19zdGF0Ci0gIHsKLSAgICBsb25nIG5vdzsJCQkvKiBDdXJyZW50IHRvdGFsIHN0YWNrIHNpemUuICAqLwotICAgIGxvbmcgbWF4YzsJCQkvKiBBbW91bnQgb2YgY29udGlndW91cyBzcGFjZSB3aGljaCB3b3VsZAotCQkJCSAgIGJlIHJlcXVpcmVkIHRvIHNhdGlzZnkgdGhlIG1heGltdW0KLQkJCQkgICBzdGFjayBkZW1hbmQgdG8gZGF0ZS4gICovCi0gICAgbG9uZyBoaWdoX3dhdGVyOwkJLyogU3RhY2sgaGlnaC13YXRlciBtYXJrLiAgKi8KLSAgICBsb25nIG92ZXJmbG93czsJCS8qIE51bWJlciBvZiBzdGFjayBvdmVyZmxvdyAoJFNUS09GRU4pIGNhbGxzLiAgKi8KLSAgICBsb25nIGhpdHM7CQkJLyogTnVtYmVyIG9mIGludGVybmFsIGJ1ZmZlciBoaXRzLiAgKi8KLSAgICBsb25nIGV4dGVuZHM7CQkvKiBOdW1iZXIgb2YgYmxvY2sgZXh0ZW5zaW9ucy4gICovCi0gICAgbG9uZyBzdGtvX21hbGxvY3M7CQkvKiBCbG9jayBhbGxvY2F0aW9ucyBieSAkU1RLT0ZFTi4gICovCi0gICAgbG9uZyB1bmRlcmZsb3dzOwkJLyogTnVtYmVyIG9mIHN0YWNrIHVuZGVyZmxvdyBjYWxscyAoJFNUS1JFVE4pLiAgKi8KLSAgICBsb25nIHN0a29fZnJlZTsJCS8qIE51bWJlciBvZiBkZWFsbG9jYXRpb25zIGJ5ICRTVEtSRVROLiAgKi8KLSAgICBsb25nIHN0a21fZnJlZTsJCS8qIE51bWJlciBvZiBkZWFsbG9jYXRpb25zIGJ5ICRTVEtNUkVULiAgKi8KLSAgICBsb25nIHNlZ21lbnRzOwkJLyogQ3VycmVudCBudW1iZXIgb2Ygc3RhY2sgc2VnbWVudHMuICAqLwotICAgIGxvbmcgbWF4czsJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBzdGFjayBzZWdtZW50cyBzbyBmYXIuICAqLwotICAgIGxvbmcgcGFkX3NpemU7CQkvKiBTdGFjayBwYWQgc2l6ZS4gICovCi0gICAgbG9uZyBjdXJyZW50X2FkZHJlc3M7CS8qIEN1cnJlbnQgc3RhY2sgc2VnbWVudCBhZGRyZXNzLiAgKi8KLSAgICBsb25nIGN1cnJlbnRfc2l6ZTsJCS8qIEN1cnJlbnQgc3RhY2sgc2VnbWVudCBzaXplLiAgVGhpcwotCQkJCSAgIG51bWJlciBpcyBhY3R1YWxseSBjb3JydXB0ZWQgYnkgU1RLU1RBVCB0bwotCQkJCSAgIGluY2x1ZGUgdGhlIGZpZnRlZW4gd29yZCB0cmFpbGVyIGFyZWEuICAqLwotICAgIGxvbmcgaW5pdGlhbF9hZGRyZXNzOwkvKiBBZGRyZXNzIG9mIGluaXRpYWwgc2VnbWVudC4gICovCi0gICAgbG9uZyBpbml0aWFsX3NpemU7CQkvKiBTaXplIG9mIGluaXRpYWwgc2VnbWVudC4gICovCi0gIH07Ci0KLS8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggdHJhaWxzCi0gICBhbnkgc3RhY2sgc2VnbWVudC4gIEkgdGhpbmsgdGhhdCB0aGUgZGVzY3JpcHRpb24gaW4gJ2FzZGVmJyBpcwotICAgb3V0IG9mIGRhdGUuICBJIG9ubHkgZGVzY3JpYmUgdGhlIHBhcnRzIHRoYXQgSSBhbSBzdXJlIGFib3V0LiAgKi8KLQotc3RydWN0IHN0a190cmFpbGVyCi0gIHsKLSAgICBsb25nIHRoaXNfYWRkcmVzczsJCS8qIEFkZHJlc3Mgb2YgdGhpcyBibG9jay4gICovCi0gICAgbG9uZyB0aGlzX3NpemU7CQkvKiBTaXplIG9mIHRoaXMgYmxvY2sgKGRvZXMgbm90IGluY2x1ZGUKLQkJCQkgICB0aGlzIHRyYWlsZXIpLiAgKi8KLSAgICBsb25nIHVua25vd24yOwotICAgIGxvbmcgdW5rbm93bjM7Ci0gICAgbG9uZyBsaW5rOwkJCS8qIEFkZHJlc3Mgb2YgdHJhaWxlciBibG9jayBvZiBwcmV2aW91cwotCQkJCSAgIHNlZ21lbnQuICAqLwotICAgIGxvbmcgdW5rbm93bjU7Ci0gICAgbG9uZyB1bmtub3duNjsKLSAgICBsb25nIHVua25vd243OwotICAgIGxvbmcgdW5rbm93bjg7Ci0gICAgbG9uZyB1bmtub3duOTsKLSAgICBsb25nIHVua25vd24xMDsKLSAgICBsb25nIHVua25vd24xMTsKLSAgICBsb25nIHVua25vd24xMjsKLSAgICBsb25nIHVua25vd24xMzsKLSAgICBsb25nIHVua25vd24xNDsKLSAgfTsKLQotI2VuZGlmIC8qIENSQVkyICovCi0jZW5kaWYgLyogbm90IENSQVlfU1RBQ0sgKi8KLQotI2lmZGVmIENSQVkyCi0vKiBEZXRlcm1pbmUgYSAic3RhY2sgbWVhc3VyZSIgZm9yIGFuIGFyYml0cmFyeSBBRERSRVNTLgotICAgSSBkb3VidCB0aGF0ICJsaW50IiB3aWxsIGxpa2UgdGhpcyBtdWNoLiAgKi8KLQotc3RhdGljIGxvbmcKLWkwMGFmdW5jIChsb25nICphZGRyZXNzKQotewotICBzdHJ1Y3Qgc3RrX3N0YXQgc3RhdHVzOwotICBzdHJ1Y3Qgc3RrX3RyYWlsZXIgKnRyYWlsZXI7Ci0gIGxvbmcgKmJsb2NrLCBzaXplOwotICBsb25nIHJlc3VsdCA9IDA7Ci0KLSAgLyogV2Ugd2FudCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBzZWdtZW50cy4gIFRoZSBmaXJzdAotICAgICBzdGVwIGlzIHRvIGdldCB0aGUgc3RhY2sgc3RhdHVzIHN0cnVjdHVyZS4gIFdlIGNvdWxkIGRvIHRoaXMKLSAgICAgbW9yZSBxdWlja2x5IGFuZCBtb3JlIGRpcmVjdGx5LCBwZXJoYXBzLCBieSByZWZlcmVuY2luZyB0aGUKLSAgICAgJExNMDAgY29tbW9uIGJsb2NrLCBidXQgSSBrbm93IHRoYXQgdGhpcyB3b3Jrcy4gICovCi0KLSAgU1RLU1RBVCAoJnN0YXR1cyk7Ci0KLSAgLyogU2V0IHVwIHRoZSBpdGVyYXRpb24uICAqLwotCi0gIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIChzdGF0dXMuY3VycmVudF9hZGRyZXNzCi0JCQkJICAgICsgc3RhdHVzLmN1cnJlbnRfc2l6ZQotCQkJCSAgICAtIDE1KTsKLQotICAvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBzdGFjayBzZWdtZW50LiAgVGhlcmVmb3JlIGl0IGlzCi0gICAgIGEgZmF0YWwgZXJyb3IgaWYgInRyYWlsZXIiIGlzIG51bGwuICAqLwotCi0gIGlmICh0cmFpbGVyID09IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRGlzY2FyZCBzZWdtZW50cyB0aGF0IGRvIG5vdCBjb250YWluIG91ciBhcmd1bWVudCBhZGRyZXNzLiAgKi8KLQotICB3aGlsZSAodHJhaWxlciAhPSAwKQotICAgIHsKLSAgICAgIGJsb2NrID0gKGxvbmcgKikgdHJhaWxlci0+dGhpc19hZGRyZXNzOwotICAgICAgc2l6ZSA9IHRyYWlsZXItPnRoaXNfc2l6ZTsKLSAgICAgIGlmIChibG9jayA9PSAwIHx8IHNpemUgPT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIHRyYWlsZXItPmxpbms7Ci0gICAgICBpZiAoKGJsb2NrIDw9IGFkZHJlc3MpICYmIChhZGRyZXNzIDwgKGJsb2NrICsgc2l6ZSkpKQotCWJyZWFrOwotICAgIH0KLQotICAvKiBTZXQgdGhlIHJlc3VsdCB0byB0aGUgb2Zmc2V0IGluIHRoaXMgc2VnbWVudCBhbmQgYWRkIHRoZSBzaXplcwotICAgICBvZiBhbGwgcHJlZGVjZXNzb3Igc2VnbWVudHMuICAqLwotCi0gIHJlc3VsdCA9IGFkZHJlc3MgLSBibG9jazsKLQotICBpZiAodHJhaWxlciA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gIGRvCi0gICAgewotICAgICAgaWYgKHRyYWlsZXItPnRoaXNfc2l6ZSA8PSAwKQotCWFib3J0ICgpOwotICAgICAgcmVzdWx0ICs9IHRyYWlsZXItPnRoaXNfc2l6ZTsKLSAgICAgIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIHRyYWlsZXItPmxpbms7Ci0gICAgfQotICB3aGlsZSAodHJhaWxlciAhPSAwKTsKLQotICAvKiBXZSBhcmUgZG9uZS4gIE5vdGUgdGhhdCBpZiB5b3UgcHJlc2VudCBhIGJvZ3VzIGFkZHJlc3MgKG9uZQotICAgICBub3QgaW4gYW55IHNlZ21lbnQpLCB5b3Ugd2lsbCBnZXQgYSBkaWZmZXJlbnQgbnVtYmVyIGJhY2ssIGZvcm1lZAotICAgICBmcm9tIHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBibG9jay4gIFRoaXMgaXMgcHJvYmFibHkKLSAgICAgbm90IHdoYXQgeW91IHdhbnQuICAqLwotCi0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotI2Vsc2UgLyogbm90IENSQVkyICovCi0vKiBTdGFjayBhZGRyZXNzIGZ1bmN0aW9uIGZvciBhIENSQVktMSwgQ1JBWSBYLU1QLCBvciBDUkFZIFktTVAuCi0gICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aGUgY2VsbCB3aXRoaW4gdGhlIHN0YWNrLAotICAgZ2l2ZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNlbGwuICBUaGUgcHVycG9zZSBvZiB0aGlzCi0gICByb3V0aW5lIGlzIHRvIGxpbmVhcml6ZSwgaW4gc29tZSBzZW5zZSwgc3RhY2sgYWRkcmVzc2VzCi0gICBmb3IgYWxsb2NhLiAgKi8KLQotc3RhdGljIGxvbmcKLWkwMGFmdW5jIChsb25nIGFkZHJlc3MpCi17Ci0gIGxvbmcgc3RrbCA9IDA7Ci0KLSAgbG9uZyBzaXplLCBwc2VnLCB0aGlzX3NlZ21lbnQsIHN0YWNrOwotICBsb25nIHJlc3VsdCA9IDA7Ci0KLSAgc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqc3NwdHI7Ci0KLSAgLyogUmVnaXN0ZXIgQjY3IGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlCi0gICAgIGN1cnJlbnQgc3RhY2sgc2VnbWVudC4gIElmIHlvdSAoYXMgYSBzdWJwcm9ncmFtKSBzdG9yZQotICAgICB5b3VyIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2sgYW5kIGZpbmQgdGhhdCB5b3UgYXJlIHBhc3QKLSAgICAgdGhlIGNvbnRlbnRzIG9mIEI2NywgeW91IGhhdmUgb3ZlcmZsb3dlZCB0aGUgc2VnbWVudC4KLQotICAgICBCNjcgYWxzbyBwb2ludHMgdG8gdGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sCi0gICAgIGFyZWEsIHdoaWNoIGlzIHdoYXQgd2UgYXJlIHJlYWxseSBpbnRlcmVzdGVkIGluLiAgKi8KLQotICBzdGtsID0gQ1JBWV9TVEFDS1NFR19FTkQgKCk7Ci0gIHNzcHRyID0gKHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKikgc3RrbDsKLQotICAvKiBJZiBvbmUgc3VidHJhY3RzICdzaXplJyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNlZ21lbnQsCi0gICAgIG9uZSBoYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNlZ21lbnQuCi0KLSAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHNlZ21lbnQsICdwc2VnJyB3aWxsIGJlCi0gICAgIG5vbnplcm8uICAqLwotCi0gIHBzZWcgPSBzc3B0ci0+c3Nwc2VnOwotICBzaXplID0gc3NwdHItPnNzc2l6ZTsKLQotICB0aGlzX3NlZ21lbnQgPSBzdGtsIC0gc2l6ZTsKLQotICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGNhbGxpbmcgdGhpcyByb3V0aW5lIGl0c2VsZiBjYXVzZWQKLSAgICAgYSBzdGFjayBvdmVyZmxvdy4gIERpc2NhcmQgc3RhY2sgc2VnbWVudHMgd2hpY2ggZG8gbm90Ci0gICAgIGNvbnRhaW4gdGhlIHRhcmdldCBhZGRyZXNzLiAgKi8KLQotICB3aGlsZSAoISh0aGlzX3NlZ21lbnQgPD0gYWRkcmVzcyAmJiBhZGRyZXNzIDw9IHN0a2wpKQotICAgIHsKLSNpZmRlZiBERUJVR19JMDBBRlVOQwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJTAxMW8gJTAxMW8gJTAxMW9cbiIsIHRoaXNfc2VnbWVudCwgYWRkcmVzcywgc3RrbCk7Ci0jZW5kaWYKLSAgICAgIGlmIChwc2VnID09IDApCi0JYnJlYWs7Ci0gICAgICBzdGtsID0gc3RrbCAtIHBzZWc7Ci0gICAgICBzc3B0ciA9IChzdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlICopIHN0a2w7Ci0gICAgICBzaXplID0gc3NwdHItPnNzc2l6ZTsKLSAgICAgIHBzZWcgPSBzc3B0ci0+c3Nwc2VnOwotICAgICAgdGhpc19zZWdtZW50ID0gc3RrbCAtIHNpemU7Ci0gICAgfQotCi0gIHJlc3VsdCA9IGFkZHJlc3MgLSB0aGlzX3NlZ21lbnQ7Ci0KLSAgLyogSWYgeW91IHN1YnRyYWN0IHBzZWcgZnJvbSB0aGUgY3VycmVudCBlbmQgb2YgdGhlIHN0YWNrLAotICAgICB5b3UgZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBwcmV2aW91cyBzdGFjayBzZWdtZW50J3MgZW5kLgotICAgICBUaGlzIHNlZW1zIGEgbGl0dGxlIGNvbnZvbHV0ZWQgdG8gbWUsIGJ1dCBJJ2xsIGJldCB5b3Ugc2F2ZQotICAgICBhIGN5Y2xlIHNvbWV3aGVyZS4gICovCi0KLSAgd2hpbGUgKHBzZWcgIT0gMCkKLSAgICB7Ci0jaWZkZWYgREVCVUdfSTAwQUZVTkMKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMTFvICUwMTFvXG4iLCBwc2VnLCBzaXplKTsKLSNlbmRpZgotICAgICAgc3RrbCA9IHN0a2wgLSBwc2VnOwotICAgICAgc3NwdHIgPSAoc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqKSBzdGtsOwotICAgICAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7Ci0gICAgICBwc2VnID0gc3NwdHItPnNzcHNlZzsKLSAgICAgIHJlc3VsdCArPSBzaXplOwotICAgIH0KLSAgcmV0dXJuIChyZXN1bHQpOwotfQotCi0jZW5kaWYgLyogbm90IENSQVkyICovCi0jZW5kaWYgLyogQ1JBWSAqLwotCi0jZW5kaWYgLyogbm8gYWxsb2NhICovCi0jZW5kaWYgLyogbm90IEdDQyB2ZXJzaW9uIDIgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hcmd2LmMgYi9saWJpYmVydHkvYXJndi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk2ZmZkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hcmd2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyogQ3JlYXRlIGFuZCBkZXN0cm95IGFyZ3VtZW50IHZlY3RvcnMgKGFyZ3YncykKLSAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogIENyZWF0ZSBhbmQgZGVzdHJveSBhcmd1bWVudCB2ZWN0b3JzLiAgQW4gYXJndW1lbnQgdmVjdG9yIGlzIHNpbXBseSBhbgotICAgIGFycmF5IG9mIHN0cmluZyBwb2ludGVycywgdGVybWluYXRlZCBieSBhIE5VTEwgcG9pbnRlci4gKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZmRlZiBpc3NwYWNlCi0jdW5kZWYgaXNzcGFjZQotI2VuZGlmCi0jZGVmaW5lIGlzc3BhY2UoY2gpICgoY2gpID09ICcgJyB8fCAoY2gpID09ICdcdCcpCi0KLS8qICBSb3V0aW5lcyBpbXBvcnRlZCBmcm9tIHN0YW5kYXJkIEMgcnVudGltZSBsaWJyYXJpZXMuICovCi0KLSNpZmRlZiBfX1NURENfXwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNlbHNlCS8qICFfX1NURENfXyAqLwotCi0jaWYgIWRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19HTlVDX18KLWV4dGVybiBjaGFyICptZW1jcHkgKCk7CQkvKiBDb3B5IG1lbW9yeSByZWdpb24gKi8KLWV4dGVybiBpbnQgc3RybGVuICgpOwkJLyogQ291bnQgbGVuZ3RoIG9mIHN0cmluZyAqLwotZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsJCS8qIFN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0ZXIgKi8KLWV4dGVybiBjaGFyICpyZWFsbG9jICgpOwkvKiBTdGFuZGFyZCBtZW1vcnkgcmVhbGxvY2F0b3IgKi8KLWV4dGVybiB2b2lkIGZyZWUgKCk7CQkvKiBGcmVlIG1hbGxvYydkIG1lbW9yeSAqLwotZXh0ZXJuIGNoYXIgKnN0cmR1cCAoKTsJCS8qIER1cGxpY2F0ZSBhIHN0cmluZyAqLwotI2VuZGlmCi0KLSNlbmRpZgkvKiBfX1NURENfXyAqLwotCi0jaW5jbHVkZSAiYWxsb2NhLWNvbmYuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLSNpZm5kZWYgRU9TCi0jZGVmaW5lIEVPUyAnXDAnCi0jZW5kaWYKLQotI2RlZmluZSBJTklUSUFMX01BWEFSR0MgOAkvKiBOdW1iZXIgb2YgYXJncyArIE5VTEwgaW4gaW5pdGlhbCBhcmd2ICovCi0KLQotLyoKLQotTkFNRQotCi0JZHVwYXJndiAtLSBkdXBsaWNhdGUgYW4gYXJndW1lbnQgdmVjdG9yCi0KLVNZTk9QU0lTCi0KLQljaGFyICoqZHVwYXJndiAodmVjdG9yKQotCWNoYXIgKip2ZWN0b3I7Ci0KLURFU0NSSVBUSU9OCi0KLQlEdXBsaWNhdGUgYW4gYXJndW1lbnQgdmVjdG9yLiAgU2ltcGx5IHNjYW5zIHRocm91Z2ggdGhlCi0JdmVjdG9yLCBkdXBsaWNhdGluZyBlYWNoIGFyZ3VtZW50IHVudGlsIHRoZQotCXRlcm1pbmF0aW5nIE5VTEwgaXMgZm91bmQuCi0KLVJFVFVSTlMKLQotCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCB2ZWN0b3IgaWYKLQlzdWNjZXNzZnVsLiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0bwotCWNvbXBsZXRlIGJ1aWxkaW5nIHRoZSBhcmd1bWVudCB2ZWN0b3IuCi0KLSovCi0KLWNoYXIgKioKLWR1cGFyZ3YgKGFyZ3YpCi0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYXJnYzsKLSAgY2hhciAqKmNvcHk7Ci0gIAotICBpZiAoYXJndiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgLyogdGhlIHZlY3RvciAqLwotICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKyk7Ci0gIGNvcHkgPSAoY2hhciAqKikgbWFsbG9jICgoYXJnYyArIDEpICogc2l6ZW9mIChjaGFyICopKTsKLSAgaWYgKGNvcHkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIHRoZSBzdHJpbmdzICovCi0gIGZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY10gIT0gTlVMTDsgYXJnYysrKQotICAgIHsKLSAgICAgIGludCBsZW4gPSBzdHJsZW4gKGFyZ3ZbYXJnY10pOwotICAgICAgY29weVthcmdjXSA9IG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogKGxlbiArIDEpKTsKLSAgICAgIGlmIChjb3B5W2FyZ2NdID09IE5VTEwpCi0JewotCSAgZnJlZWFyZ3YgKGNvcHkpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgc3RyY3B5IChjb3B5W2FyZ2NdLCBhcmd2W2FyZ2NdKTsKLSAgICB9Ci0gIGNvcHlbYXJnY10gPSBOVUxMOwotICByZXR1cm4gY29weTsKLX0KLQotLyoKLQotTkFNRQotCi0JZnJlZWFyZ3YgLS0gZnJlZSBhbiBhcmd1bWVudCB2ZWN0b3IKLQotU1lOT1BTSVMKLQotCXZvaWQgZnJlZWFyZ3YgKHZlY3RvcikKLQljaGFyICoqdmVjdG9yOwotCi1ERVNDUklQVElPTgotCi0JRnJlZSBhbiBhcmd1bWVudCB2ZWN0b3IgdGhhdCB3YXMgYnVpbHQgdXNpbmcgYnVpbGRhcmd2LiAgU2ltcGx5IHNjYW5zCi0JdGhyb3VnaCB0aGUgdmVjdG9yLCBmcmVlaW5nIHRoZSBtZW1vcnkgZm9yIGVhY2ggYXJndW1lbnQgdW50aWwgdGhlCi0JdGVybWluYXRpbmcgTlVMTCBpcyBmb3VuZCwgYW5kIHRoZW4gZnJlZXMgdGhlIHZlY3RvciBpdHNlbGYuCi0KLVJFVFVSTlMKLQotCU5vIHZhbHVlLgotCi0qLwotCi12b2lkIGZyZWVhcmd2ICh2ZWN0b3IpCi1jaGFyICoqdmVjdG9yOwotewotICByZWdpc3RlciBjaGFyICoqc2NhbjsKLQotICBpZiAodmVjdG9yICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChzY2FuID0gdmVjdG9yOyAqc2NhbiAhPSBOVUxMOyBzY2FuKyspCi0JewotCSAgZnJlZSAoKnNjYW4pOwotCX0KLSAgICAgIGZyZWUgKHZlY3Rvcik7Ci0gICAgfQotfQotCi0vKgotCi1OQU1FCi0KLQlidWlsZGFyZ3YgLS0gYnVpbGQgYW4gYXJndW1lbnQgdmVjdG9yIGZyb20gYSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNoYXIgKipidWlsZGFyZ3YgKHNwKQotCWNoYXIgKnNwOwotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gYSBwb2ludGVyIHRvIGEgc3RyaW5nLCBwYXJzZSB0aGUgc3RyaW5nIGV4dHJhY3RpbmcgZmllbGRzCi0Jc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgYW5kIG9wdGlvbmFsbHkgZW5jbG9zZWQgd2l0aGluIGVpdGhlciBzaW5nbGUKLQlvciBkb3VibGUgcXVvdGVzICh3aGljaCBhcmUgc3RyaXBwZWQgb2ZmKSwgYW5kIGJ1aWxkIGEgdmVjdG9yIG9mCi0JcG9pbnRlcnMgdG8gY29waWVzIG9mIHRoZSBzdHJpbmcgZm9yIGVhY2ggZmllbGQuICBUaGUgaW5wdXQgc3RyaW5nCi0JcmVtYWlucyB1bmNoYW5nZWQuCi0KLQlBbGwgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHBvaW50ZXIgYXJyYXkgYW5kIGNvcGllcyBvZiB0aGUgc3RyaW5nCi0JaXMgb2J0YWluZWQgZnJvbSBtYWxsb2MuICBBbGwgb2YgdGhlIG1lbW9yeSBjYW4gYmUgcmV0dXJuZWQgdG8gdGhlCi0Jc3lzdGVtIHdpdGggdGhlIHNpbmdsZSBmdW5jdGlvbiBjYWxsIGZyZWVhcmd2LCB3aGljaCB0YWtlcyB0aGUKLQlyZXR1cm5lZCByZXN1bHQgb2YgYnVpbGRhcmd2LCBhcyBpdCdzIGFyZ3VtZW50LgotCi0JVGhlIG1lbW9yeSBmb3IgdGhlIGFyZ3YgYXJyYXkgaXMgZHluYW1pY2FsbHkgZXhwYW5kZWQgYXMgbmVjZXNzYXJ5LgotCi1SRVRVUk5TCi0KLQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnQgdmVjdG9yIGlmIHN1Y2Nlc3NmdWwuIFJldHVybnMgTlVMTAotCWlmIHRoZSBpbnB1dCBzdHJpbmcgcG9pbnRlciBpcyBOVUxMIG9yIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudAotCW1lbW9yeSB0byBjb21wbGV0ZSBidWlsZGluZyB0aGUgYXJndW1lbnQgdmVjdG9yLgotCi1OT1RFUwotCi0JSW4gb3JkZXIgdG8gcHJvdmlkZSBhIHdvcmtpbmcgYnVmZmVyIGZvciBleHRyYWN0aW5nIGFyZ3VtZW50cyBpbnRvLAotCXdpdGggYXBwcm9wcmlhdGUgc3RyaXBwaW5nIG9mIHF1b3RlcyBhbmQgdHJhbnNsYXRpb24gb2YgYmFja3NsYXNoCi0Jc2VxdWVuY2VzLCB3ZSBhbGxvY2F0ZSBhIHdvcmtpbmcgYnVmZmVyIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIGlucHV0Ci0Jc3RyaW5nLiAgVGhpcyBlbnN1cmVzIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIHNwYWNlIGluIHdoaWNoIHRvCi0Jd29yaywgc2luY2UgdGhlIGV4dHJhY3RlZCBhcmcgaXMgbmV2ZXIgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IHN0cmluZy4KLQotCUlmIHRoZSBpbnB1dCBpcyBhIG51bGwgc3RyaW5nIChhcyBvcHBvc2VkIHRvIGEgTlVMTCBwb2ludGVyKSwgdGhlbgotCWJ1aWxkYXJnIHJldHVybnMgYW4gYXJndiB0aGF0IGhhcyBvbmUgYXJnLCBhIG51bGwgc3RyaW5nLgotCi0JQXJndiBpcyBhbHdheXMga2VwdCB0ZXJtaW5hdGVkIHdpdGggYSBOVUxMIGFyZyBwb2ludGVyLCBzbyBpdCBjYW4KLQliZSBwYXNzZWQgdG8gZnJlZWFyZ3YgYXQgYW55IHRpbWUsIG9yIHJldHVybmVkLCBhcyBhcHByb3ByaWF0ZS4KLSovCi0KLWNoYXIgKipidWlsZGFyZ3YgKGlucHV0KQotY2hhciAqaW5wdXQ7Ci17Ci0gIGNoYXIgKmFyZzsKLSAgY2hhciAqY29weWJ1ZjsKLSAgaW50IHNxdW90ZSA9IDA7Ci0gIGludCBkcXVvdGUgPSAwOwotICBpbnQgYnNxdW90ZSA9IDA7Ci0gIGludCBhcmdjID0gMDsKLSAgaW50IG1heGFyZ2MgPSAwOwotICBjaGFyICoqYXJndiA9IE5VTEw7Ci0gIGNoYXIgKipuYXJndjsKLQotICBpZiAoaW5wdXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb3B5YnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGlucHV0KSArIDEpOwotICAgICAgLyogSXMgYSBkb3t9d2hpbGUgdG8gYWx3YXlzIGV4ZWN1dGUgdGhlIGxvb3Agb25jZS4gIEFsd2F5cyByZXR1cm4gYW4KLQkgYXJndiwgZXZlbiBmb3IgbnVsbCBzdHJpbmdzLiAgU2VlIE5PVEVTIGFib3ZlLCB0ZXN0IGNhc2UgYmVsb3cuICovCi0gICAgICBkbwotCXsKLQkgIC8qIFBpY2sgb2ZmIGFyZ3ZbYXJnY10gKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqaW5wdXQpKQotCSAgICB7Ci0JICAgICAgaW5wdXQrKzsKLQkgICAgfQotCSAgaWYgKChtYXhhcmdjID09IDApIHx8IChhcmdjID49IChtYXhhcmdjIC0gMSkpKQotCSAgICB7Ci0JICAgICAgLyogYXJndiBuZWVkcyBpbml0aWFsaXphdGlvbiwgb3IgZXhwYW5zaW9uICovCi0JICAgICAgaWYgKGFyZ3YgPT0gTlVMTCkKLQkJewotCQkgIG1heGFyZ2MgPSBJTklUSUFMX01BWEFSR0M7Ci0JCSAgbmFyZ3YgPSAoY2hhciAqKikgbWFsbG9jIChtYXhhcmdjICogc2l6ZW9mIChjaGFyICopKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG1heGFyZ2MgKj0gMjsKLQkJICBuYXJndiA9IChjaGFyICoqKSByZWFsbG9jIChhcmd2LCBtYXhhcmdjICogc2l6ZW9mIChjaGFyICopKTsKLQkJfQotCSAgICAgIGlmIChuYXJndiA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGFyZ3YgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZnJlZWFyZ3YgKGFyZ3YpOwotCQkgICAgICBhcmd2ID0gTlVMTDsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGFyZ3YgPSBuYXJndjsKLQkgICAgICBhcmd2W2FyZ2NdID0gTlVMTDsKLQkgICAgfQotCSAgLyogQmVnaW4gc2Nhbm5pbmcgYXJnICovCi0JICBhcmcgPSBjb3B5YnVmOwotCSAgd2hpbGUgKCppbnB1dCAhPSBFT1MpCi0JICAgIHsKLQkgICAgICBpZiAoaXNzcGFjZSAoKmlucHV0KSAmJiAhc3F1b3RlICYmICFkcXVvdGUgJiYgIWJzcXVvdGUpCi0JCXsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChic3F1b3RlKQotCQkgICAgewotCQkgICAgICBic3F1b3RlID0gMDsKLQkJICAgICAgKmFyZysrID0gKmlucHV0OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCppbnB1dCA9PSAnXFwnKQotCQkgICAgewotCQkgICAgICBic3F1b3RlID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzcXVvdGUpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgqaW5wdXQgPT0gJ1wnJykKLQkJCXsKLQkJCSAgc3F1b3RlID0gMDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAqYXJnKysgPSAqaW5wdXQ7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZHF1b3RlKQotCQkgICAgewotCQkgICAgICBpZiAoKmlucHV0ID09ICciJykKLQkJCXsKLQkJCSAgZHF1b3RlID0gMDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAqYXJnKysgPSAqaW5wdXQ7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoKmlucHV0ID09ICdcJycpCi0JCQl7Ci0JCQkgIHNxdW90ZSA9IDE7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKCppbnB1dCA9PSAnIicpCi0JCQl7Ci0JCQkgIGRxdW90ZSA9IDE7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKmFyZysrID0gKmlucHV0OwotCQkJfQotCQkgICAgfQotCQkgIGlucHV0Kys7Ci0JCX0KLQkgICAgfQotCSAgKmFyZyA9IEVPUzsKLQkgIGFyZ3ZbYXJnY10gPSBzdHJkdXAgKGNvcHlidWYpOwotCSAgaWYgKGFyZ3ZbYXJnY10gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLQkgICAgICBhcmd2ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYXJnYysrOwotCSAgYXJndlthcmdjXSA9IE5VTEw7Ci0KLQkgIHdoaWxlIChpc3NwYWNlICgqaW5wdXQpKQotCSAgICB7Ci0JICAgICAgaW5wdXQrKzsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlICgqaW5wdXQgIT0gRU9TKTsKLSAgICB9Ci0gIHJldHVybiAoYXJndik7Ci19Ci0KLSNpZmRlZiBNQUlOCi0KLS8qIFNpbXBsZSBsaXR0bGUgdGVzdCBkcml2ZXIuICovCi0KLXN0YXRpYyBjaGFyICp0ZXN0c1tdID0KLXsKLSAgImEgc2ltcGxlIGNvbW1hbmQgbGluZSIsCi0gICJhcmcgJ2ZvbycgaXMgc2luZ2xlIHF1b3RlZCIsCi0gICJhcmcgXCJiYXJcIiBpcyBkb3VibGUgcXVvdGVkIiwKLSAgImFyZyBcImZvbyBiYXJcIiBoYXMgZW1iZWRkZWQgd2hpdGVzcGFjZSIsCi0gICJhcmcgJ0phY2sgc2FpZCBcXCdoaVxcJycgaGFzIHNpbmdsZSBxdW90ZXMiLAotICAiYXJnICdKYWNrIHNhaWQgXFxcImhpXFxcIicgaGFzIGRvdWJsZSBxdW90ZXMiLAotICAiYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6IDEgMiAzIDQgNSA2IDcgOCA5IiwKLSAgCi0gIC8qIFRoaXMgc2hvdWxkIGJlIGV4cGFuZGVkIGludG8gb25seSBvbmUgYXJndW1lbnQuICAqLwotICAidHJhaWxpbmctd2hpdGVzcGFjZSAiLAotCi0gICIiLAotICBOVUxMCi19OwotCi1tYWluICgpCi17Ci0gIGNoYXIgKiphcmd2OwotICBjaGFyICoqdGVzdDsKLSAgY2hhciAqKnRhcmdzOwotCi0gIGZvciAodGVzdCA9IHRlc3RzOyAqdGVzdCAhPSBOVUxMOyB0ZXN0KyspCi0gICAgewotICAgICAgcHJpbnRmICgiYnVpbGRhcmd2KFwiJXNcIilcbiIsICp0ZXN0KTsKLSAgICAgIGlmICgoYXJndiA9IGJ1aWxkYXJndiAoKnRlc3QpKSA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImZhaWxlZCFcblxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvciAodGFyZ3MgPSBhcmd2OyAqdGFyZ3MgIT0gTlVMTDsgdGFyZ3MrKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlx0XCIlc1wiXG4iLCAqdGFyZ3MpOwotCSAgICB9Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLSAgICB9Ci0KLX0KLQotI2VuZGlmCS8qIE1BSU4gKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hc3ByaW50Zi5jIGIvbGliaWJlcnR5L2FzcHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYWYzMjAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FzcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBMaWtlIHNwcmludGYgYnV0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9yYWdlLCB3aGljaCBtdXN0Ci0gICBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWYgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSB8fCBkZWZpbmVkIChBTE1PU1RfU1REQykKLSNkZWZpbmUgVVNFX1NUREFSRwotI2VuZGlmCi0KLSNpZmRlZiBVU0VfU1REQVJHCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0vKiBWQVJBUkdTICovCi0jaWZkZWYgVVNFX1NUREFSRwotaW50Ci1hc3ByaW50ZiAoY2hhciAqKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotaW50Ci1hc3ByaW50ZiAoYnVmLCBmbXQsIHZhX2FsaXN0KQotICAgICBjaGFyICoqYnVmOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIGludCBzdGF0dXM7Ci0gIHZhX2xpc3QgYXA7Ci0jaWZkZWYgVVNFX1NUREFSRwotICB2YV9zdGFydCAoYXAsIGZtdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXApOwotI2VuZGlmCi0gIHN0YXR1cyA9IHZhc3ByaW50ZiAoYnVmLCBmbXQsIGFwKTsKLSAgdmFfZW5kIChhcCk7Ci0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXRleGl0LmMgYi9saWJpYmVydHkvYXRleGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzN2Q5ODUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2F0ZXhpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogV3JhcHBlciB0byBpbXBsZW1lbnQgQU5TSSBDJ3MgYXRleGl0IHVzaW5nIFN1bk9TJ3Mgb25fZXhpdC4gKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLU1pa2UgU3R1bXAuICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfT05fRVhJVAotCi1pbnQKLWF0ZXhpdChmKQotICAgICB2b2lkICgqZikoKTsKLXsKLSAgLyogSWYgdGhlIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBhdGV4aXQsIHVzZSBvbl9leGl0Ci0gICAgIGlmIHRoZSBzeXN0ZW0gcHJvdmlkZXMgdGhhdC4gICovCi0gIG9uX2V4aXQgKGYsIDApOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmFzZW5hbWUuYyBiL2xpYmliZXJ0eS9iYXNlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njk4ZjA2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iYXNlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogUmV0dXJuIHRoZSBiYXNlbmFtZSBvZiBhIHBhdGhuYW1lLgotICAgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi0vKgotTkFNRQotCWJhc2VuYW1lIC0tIHJldHVybiBwb2ludGVyIHRvIGxhc3QgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUKLQotU1lOT1BTSVMKLQljaGFyICpiYXNlbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKLQotREVTQ1JJUFRJT04KLQlHaXZlbiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIHR5cGljYWwgcGF0aG5hbWUKLQkoL3Vzci9zcmMvY21kL2xzL2xzLmMgZm9yIGV4YW1wbGUpLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKLQlsYXN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aG5hbWUgKCJscy5jIiBpbiB0aGlzIGNhc2UpLgotCi1CVUdTCi0JUHJlc3VtZXMgYSBVTklYIG9yIERPUy9XaW5kb3dzIHN0eWxlIHBhdGggd2l0aCBVTklYIG9yIERPUy9XaW5kb3dzIAotCXN0eWxlIHNlcGFyYXRvcnMuCi0qLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9fREpHUFBfXykgfHwgXAotICBkZWZpbmVkIChfX09TMl9fKQotI2RlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQotI2lmbmRlZiBESVJfU0VQQVJBVE9SXzIgCi0jZGVmaW5lIERJUl9TRVBBUkFUT1JfMiAnXFwnCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBEZWZpbmUgSVNfRElSX1NFUEFSQVRPUi4gICovCi0jaWZuZGVmIERJUl9TRVBBUkFUT1JfMgotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gRElSX1NFUEFSQVRPUikKLSNlbHNlIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgXAotCSgoKGNoKSA9PSBESVJfU0VQQVJBVE9SKSB8fCAoKGNoKSA9PSBESVJfU0VQQVJBVE9SXzIpKQotI2VuZGlmIC8qIERJUl9TRVBBUkFUT1JfMiAqLwotCi1jaGFyICoKLWJhc2VuYW1lIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBjaGFyICpiYXNlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCi0gIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KLSAgaWYgKGlzYWxwaGEgKG5hbWVbMF0pICYmIG5hbWVbMV0gPT0gJzonKSAKLSAgICBuYW1lICs9IDI7Ci0jZW5kaWYKLQotICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQotICAgIHsKLSAgICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCi0JewotCSAgYmFzZSA9IG5hbWUgKyAxOwotCX0KLSAgICB9Ci0gIHJldHVybiAoY2hhciAqKSBiYXNlOwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmNtcC5jIGIvbGliaWJlcnR5L2JjbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlNDQxNy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYmNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogYmNtcAotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi0KLU5BTUUKLQotCWJjbXAgLS0gY29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMKLQotU1lOT1BTSVMKLQotCWludCBiY21wIChjaGFyICpmcm9tLCBjaGFyICp0bywgaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCi0JQ29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMgYW5kIHJldHVybiB6ZXJvIGlmIHRoZXkgYXJlIGlkZW50aWNhbCwKLQlub24temVybyBvdGhlcndpc2UuICBJZiBjb3VudCBpcyB6ZXJvLCByZXR1cm4gemVyby4KLQotTk9URVMKLQotCU5vIGd1YXJhbnRlZSBpcyBtYWRlIGFib3V0IHRoZSBub24temVybyByZXR1cm5lZCB2YWx1ZS4gIEluCi0JcGFydGljdWxhciwgdGhlIHJlc3VsdHMgbWF5IGJlIHNpZ25maWNhbnRseSBkaWZmZXJlbnQgdGhhbgotCXN0cmNtcCgpLCB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGVzcyB0aGFuLAotCWVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybywgYWNjb3JkaW5nIHRvIGxleGljb2dyYXBoaWNhbAotCXNvcnRpbmcgb2YgdGhlIGNvbXBhcmVkIHJlZ2lvbnMuCi0KLUJVR1MKLQotKi8KLQotCi1pbnQKLWJjbXAgKGZyb20sIHRvLCBjb3VudCkKLSAgY2hhciAqZnJvbSwgKnRvOwotICBpbnQgY291bnQ7Ci17Ci0gIGludCBydG52YWwgPSAwOwotCi0gIHdoaWxlIChjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKmZyb20rKyAhPSAqdG8rKykKLQl7Ci0JICBydG52YWwgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChydG52YWwpOwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmNvcHkuYyBiL2xpYmliZXJ0eS9iY29weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjU1MzYzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iY29weS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogYmNvcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdGFyeSBsZW5ndGgKLQotTkFNRQotCWJjb3B5IC0tIGNvcHkgbWVtb3J5IHJlZ2lvbnMgb2YgYXJiaXRyYXJ5IGxlbmd0aAotCi1TWU5PUFNJUwotCXZvaWQgYmNvcHkgKGNoYXIgKmluLCBjaGFyICpvdXQsIGludCBsZW5ndGgpCi0KLURFU0NSSVBUSU9OCi0JQ29weSBMRU5HVEggYnl0ZXMgZnJvbSBtZW1vcnkgcmVnaW9uIHBvaW50ZWQgdG8gYnkgSU4gdG8gbWVtb3J5Ci0JcmVnaW9uIHBvaW50ZWQgdG8gYnkgT1VULgotCi1CVUdTCi0JU2lnbmlmaWNhbnQgc3BlZWQgaW1wcm92ZW1lbnRzIGNhbiBiZSBtYWRlIGluIHNvbWUgY2FzZXMgYnkKLQlpbXBsZW1lbnRpbmcgY29waWVzIG9mIG11bHRpcGxlIGJ5dGVzIHNpbXVsdGFuZW91c2x5LCBvciB1bnJvbGxpbmcKLQl0aGUgY29weSBsb29wLgotCi0qLwotCi12b2lkCi1iY29weSAoc3JjLCBkZXN0LCBsZW4pCi0gIHJlZ2lzdGVyIGNoYXIgKnNyYywgKmRlc3Q7Ci0gIGludCBsZW47Ci17Ci0gIGlmIChkZXN0IDwgc3JjKQotICAgIHdoaWxlIChsZW4tLSkKLSAgICAgICpkZXN0KysgPSAqc3JjKys7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpsYXN0cyA9IHNyYyArIChsZW4tMSk7Ci0gICAgICBjaGFyICpsYXN0ZCA9IGRlc3QgKyAobGVuLTEpOwotICAgICAgd2hpbGUgKGxlbi0tKQotICAgICAgICAqKGNoYXIgKilsYXN0ZC0tID0gKihjaGFyICopbGFzdHMtLTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYnplcm8uYyBiL2xpYmliZXJ0eS9iemVyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDE2NDRiLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iemVyby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogUG9ydGFibGUgdmVyc2lvbiBvZiBiemVybyBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JYnplcm8gLS0gemVybyB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpZWQgbWVtb3J5IHJlZ2lvbgotCi1TWU5PUFNJUwotCXZvaWQgYnplcm8gKGNoYXIgKnRvLCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0JWmVybyBDT1VOVCBieXRlcyBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBUTy4KLQotQlVHUwotCVNpZ25pZmljYW50IHNwZWVkIGVuaGFuY2VtZW50cyBtYXkgYmUgbWFkZSBpbiBzb21lIGVudmlyb25tZW50cwotCWJ5IHplcm9pbmcgbW9yZSB0aGFuIGEgc2luZ2xlIGJ5dGUgYXQgYSB0aW1lLCBvciBieSB1bnJvbGxpbmcgdGhlCi0JbG9vcC4KLQotKi8KLQotCi12b2lkCi1iemVybyAodG8sIGNvdW50KQotICBjaGFyICp0bzsKLSAgaW50IGNvdW50OwotewotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgewotICAgICAgKnRvKysgPSAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jYWxsb2MuYyBiL2xpYmliZXJ0eS9jYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0YjE4ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY2FsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBjYWxsb2MgLS0gYWxsb2NhdGUgbWVtb3J5IHdoaWNoIGhhcyBiZWVuIGluaXRpYWxpemVkIHRvIHplcm8uCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotIAotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0gCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhpcyBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLVBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLVBUUgotY2FsbG9jIChuZWxlbSwgZWxzaXplKQotICBzaXplX3QgbmVsZW0sIGVsc2l6ZTsKLXsKLSAgcmVnaXN0ZXIgUFRSIHB0cjsgIAotCi0gIGlmIChuZWxlbSA9PSAwIHx8IGVsc2l6ZSA9PSAwKQotICAgIG5lbGVtID0gZWxzaXplID0gMTsKLSAgCi0gIHB0ciA9IG1hbGxvYyAobmVsZW0gKiBlbHNpemUpOwotICBpZiAocHRyKSBiemVybyAocHRyLCBuZWxlbSAqIGVsc2l6ZSk7Ci0gIAotICByZXR1cm4gcHRyOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Nob29zZS10ZW1wLmMgYi9saWJpYmVydHkvY2hvb3NlLXRlbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2ZDgxOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY2hvb3NlLXRlbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKiBVdGlsaXR5IHRvIHBpY2sgYSB0ZW1wb3JhcnkgZmlsZW5hbWUgcHJlZml4LgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLXdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGV4cG9ydHMgdHdvIGZ1bmN0aW9uczogY2hvb3NlX3RlbXBfYmFzZSBhbmQgbWFrZV90ZW1wX2ZpbGUuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgkvKiBNYXkgZ2V0IFBfdG1wZGlyLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19GSUxFX0gKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPiAgIC8qIE1heSBnZXQgUl9PSywgZXRjLiBvbiBzb21lIHN5c3RlbXMuICAqLwotI2VuZGlmCi0KLSNpZm5kZWYgUl9PSwotI2RlZmluZSBSX09LIDQKLSNkZWZpbmUgV19PSyAyCi0jZGVmaW5lIFhfT0sgMQotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLWV4dGVybiBpbnQgbWtzdGVtcHMgKCk7Ci0KLSNpZm5kZWYgSU5fR0NDCi0jaWYgZGVmaW5lZCAoX19NU0RPU19fKSB8fCAoZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOX18pICYmICEgZGVmaW5lZCAoX1VXSU4pKQotI2RlZmluZSBESVJfU0VQQVJBVE9SICdcXCcKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUgotI2RlZmluZSBESVJfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0KLS8qIE9uIE1TRE9TLCB3cml0ZSB0ZW1wIGZpbGVzIGluIGN1cnJlbnQgZGlyCi0gICBiZWNhdXNlIHRoZXJlJ3Mgbm8gcGxhY2UgZWxzZSB3ZSBjYW4gZXhwZWN0IHRvIHVzZS4gICovCi0vKiA/Pz8gQWx0aG91Z2ggdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHRyaWVkIGFzIGEgbGFzdCByZXNvcnQsCi0gICB0aGlzIGlzIGxlZnQgaW4gc28gdGhhdCBvbiBNU0RPUyBpdCBpcyBwcmVmZXJyZWQgdG8gL3RtcCBvbiB0aGUKLSAgIG9mZiBjaGFuY2UgdGhhdCBzb21lb25lIHJlcXVpcmVzIHRoaXMsIHNpbmNlIHRoYXQgd2FzIHRoZSBwcmV2aW91cwotICAgYmVoYXZpb3VyLiAgKi8KLSNpZmRlZiBfX01TRE9TX18KLSNpZm5kZWYgUF90bXBkaXIKLSNkZWZpbmUgUF90bXBkaXIgIi4iCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBOYW1lIG9mIHRlbXBvcmFyeSBmaWxlLgotICAgbWt0ZW1wIHJlcXVpcmVzIDYgdHJhaWxpbmcgWCdzLiAgKi8KLSNkZWZpbmUgVEVNUF9GSUxFICJjY1hYWFhYWCIKLQotLyogU3Vicm91dGluZSBvZiBjaG9vc2VfdGVtcF9iYXNlLgotICAgSWYgQkFTRSBpcyBub24tTlVMTCwgcmV0dXJuIGl0LgotICAgT3RoZXJ3aXNlIGl0IGNoZWNrcyBpZiBESVIgaXMgYSB1c2FibGUgZGlyZWN0b3J5LgotICAgSWYgc3VjY2VzcywgRElSIGlzIHJldHVybmVkLgotICAgT3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuICAqLwotCi1zdGF0aWMgY2hhciAqCi10cnkgKGRpciwgYmFzZSkKLSAgICAgY2hhciAqZGlyLCAqYmFzZTsKLXsKLSAgaWYgKGJhc2UgIT0gMCkKLSAgICByZXR1cm4gYmFzZTsKLSAgaWYgKGRpciAhPSAwCi0gICAgICAmJiBhY2Nlc3MgKGRpciwgUl9PSyB8IFdfT0sgfCBYX09LKSA9PSAwKQotICAgIHJldHVybiBkaXI7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gYSBwcmVmaXggZm9yIHRlbXBvcmFyeSBmaWxlIG5hbWVzIG9yIE5VTEwgaWYgdW5hYmxlIHRvIGZpbmQgb25lLgotICAgVGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGNob3NlbiBpZiBhbGwgZWxzZSBmYWlscyBzbyB0aGUgcHJvZ3JhbSBpcwotICAgZXhpdGVkIGlmIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBjYW4ndCBiZSBmb3VuZCAobWt0ZW1wIGZhaWxzKS4KLSAgIFRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQgaXMgb2J0YWluZWQgd2l0aCB4bWFsbG9jLiAKLQotICAgVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgb25seS4gIEl0IHVzZQotICAgaXMgbm90IHJlY29tbWVuZGVkLiAgKi8KLQotY2hhciAqCi1jaG9vc2VfdGVtcF9iYXNlICgpCi17Ci0gIGNoYXIgKmJhc2UgPSAwOwotICBjaGFyICp0ZW1wX2ZpbGVuYW1lOwotICBpbnQgbGVuOwotICBzdGF0aWMgY2hhciB0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotICBzdGF0aWMgY2hhciB1c3J0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3UnLCAncycsICdyJywgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotCi0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUERJUiIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QIiksIGJhc2UpOwotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJURU1QIiksIGJhc2UpOwotCi0jaWZkZWYgUF90bXBkaXIKLSAgYmFzZSA9IHRyeSAoUF90bXBkaXIsIGJhc2UpOwotI2VuZGlmCi0KLSAgLyogVHJ5IC91c3IvdG1wLCB0aGVuIC90bXAuICAqLwotICBiYXNlID0gdHJ5ICh1c3J0bXAsIGJhc2UpOwotICBiYXNlID0gdHJ5ICh0bXAsIGJhc2UpOwotIAotICAvKiBJZiBhbGwgZWxzZSBmYWlscywgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSEgICovCi0gIGlmIChiYXNlID09IDApCi0gICAgYmFzZSA9ICIuIjsKLQotICBsZW4gPSBzdHJsZW4gKGJhc2UpOwotICB0ZW1wX2ZpbGVuYW1lID0geG1hbGxvYyAobGVuICsgMSAvKkRJUl9TRVBBUkFUT1IqLwotCQkJICAgKyBzdHJsZW4gKFRFTVBfRklMRSkgKyAxKTsKLSAgc3RyY3B5ICh0ZW1wX2ZpbGVuYW1lLCBiYXNlKTsKLQotICBpZiAobGVuICE9IDAKLSAgICAgICYmIHRlbXBfZmlsZW5hbWVbbGVuLTFdICE9ICcvJwotICAgICAgJiYgdGVtcF9maWxlbmFtZVtsZW4tMV0gIT0gRElSX1NFUEFSQVRPUikKLSAgICB0ZW1wX2ZpbGVuYW1lW2xlbisrXSA9IERJUl9TRVBBUkFUT1I7Ci0gIHN0cmNweSAodGVtcF9maWxlbmFtZSArIGxlbiwgVEVNUF9GSUxFKTsKLQotICBta3RlbXAgKHRlbXBfZmlsZW5hbWUpOwotICBpZiAoc3RybGVuICh0ZW1wX2ZpbGVuYW1lKSA9PSAwKQotICAgIGFib3J0ICgpOwotICByZXR1cm4gdGVtcF9maWxlbmFtZTsKLX0KLS8qIFJldHVybiBhIHRlbXBvcmFyeSBmaWxlIG5hbWUgKGFzIGEgc3RyaW5nKSBvciBOVUxMIGlmIHVuYWJsZSB0byBjcmVhdGUKLSAgIG9uZS4gICovCi0KLWNoYXIgKgotbWFrZV90ZW1wX2ZpbGUgKHN1ZmZpeCkKLSAgICAgY29uc3QgY2hhciAqc3VmZml4OwotewotICBjaGFyICpiYXNlID0gMDsKLSAgY2hhciAqdGVtcF9maWxlbmFtZTsKLSAgaW50IGJhc2VfbGVuLCBzdWZmaXhfbGVuOwotICBpbnQgZmQ7Ci0gIHN0YXRpYyBjaGFyIHRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07Ci0gIHN0YXRpYyBjaGFyIHVzcnRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndScsICdzJywgJ3InLCBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07Ci0KLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QRElSIiksIGJhc2UpOwotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVAiKSwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRFTVAiKSwgYmFzZSk7Ci0KLSNpZmRlZiBQX3RtcGRpcgotICBiYXNlID0gdHJ5IChQX3RtcGRpciwgYmFzZSk7Ci0jZW5kaWYKLQotICAvKiBUcnkgL3Vzci90bXAsIHRoZW4gL3RtcC4gICovCi0gIGJhc2UgPSB0cnkgKHVzcnRtcCwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKHRtcCwgYmFzZSk7Ci0gCi0gIC8qIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5ISAgKi8KLSAgaWYgKGJhc2UgPT0gMCkKLSAgICBiYXNlID0gIi4iOwotCi0gIGJhc2VfbGVuID0gc3RybGVuIChiYXNlKTsKLQotICBpZiAoc3VmZml4KQotICAgIHN1ZmZpeF9sZW4gPSBzdHJsZW4gKHN1ZmZpeCk7Ci0gIGVsc2UKLSAgICBzdWZmaXhfbGVuID0gMDsKLQotICB0ZW1wX2ZpbGVuYW1lID0geG1hbGxvYyAoYmFzZV9sZW4gKyAxIC8qRElSX1NFUEFSQVRPUiovCi0JCQkgICArIHN0cmxlbiAoVEVNUF9GSUxFKQotCQkJICAgKyBzdWZmaXhfbGVuICsgMSk7Ci0gIHN0cmNweSAodGVtcF9maWxlbmFtZSwgYmFzZSk7Ci0KLSAgaWYgKGJhc2VfbGVuICE9IDAKLSAgICAgICYmIHRlbXBfZmlsZW5hbWVbYmFzZV9sZW4tMV0gIT0gJy8nCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2Jhc2VfbGVuLTFdICE9IERJUl9TRVBBUkFUT1IpCi0gICAgdGVtcF9maWxlbmFtZVtiYXNlX2xlbisrXSA9IERJUl9TRVBBUkFUT1I7Ci0gIHN0cmNweSAodGVtcF9maWxlbmFtZSArIGJhc2VfbGVuLCBURU1QX0ZJTEUpOwotCi0gIGlmIChzdWZmaXgpCi0gICAgc3RyY2F0ICh0ZW1wX2ZpbGVuYW1lLCBzdWZmaXgpOwotCi0gIGZkID0gbWtzdGVtcHMgKHRlbXBfZmlsZW5hbWUsIHN1ZmZpeF9sZW4pOwotICAvKiBJZiBta3N0ZW1wcyBmYWlsZWQsIHRoZW4gc29tZXRoaW5nIGJhZCBpcyBoYXBwZW5pbmcuICBNYXliZSB3ZSBzaG91bGQKLSAgICAgaXNzdWUgYSBtZXNzYWdlIGFib3V0IGEgcG9zc2libGUgc2VjdXJpdHkgYXR0YWNrIGluIHByb2dyZXNzPyAgKi8KLSAgaWYgKGZkID09IC0xKQotICAgIGFib3J0ICgpOwotICAvKiBTaW1pbGFybHkgaWYgd2UgY2FuIG5vdCBjbG9zZSB0aGUgZmlsZS4gICovCi0gIGlmIChjbG9zZSAoZmQpKQotICAgIGFib3J0ICgpOwotICByZXR1cm4gdGVtcF9maWxlbmFtZTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jbG9jay5jIGIvbGliaWJlcnR5L2Nsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjUwOWMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Nsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiBBTlNJLWNvbXBhdGlibGUgY2xvY2sgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCi1zb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggZmlsZXMKLWNvbXBpbGVkIHdpdGggYSBHTlUgY29tcGlsZXIgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGRvZXMgbm90IGNhdXNlCi10aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi1UaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5Ci10aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBIQVZFX0dFVFJVU0FHRQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVElNRVMKLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBfU0NfQ0xLX1RDSwotI2RlZmluZSBHTlVfSFogIHN5c2NvbmYoX1NDX0NMS19UQ0spCi0jZWxzZQotI2lmZGVmIEhaCi0jZGVmaW5lIEdOVV9IWiAgSFoKLSNlbHNlCi0jaWZkZWYgQ0xPQ0tTX1BFUl9TRUMKLSNkZWZpbmUgR05VX0haICBDTE9DS1NfUEVSX1NFQwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBGSVhNRTogc2hvdWxkIGJlIGFibGUgdG8gZGVjbGFyZSBhcyBjbG9ja190LiAqLwotCi1sb25nCi1jbG9jayAoKQotewotI2lmZGVmIEhBVkVfR0VUUlVTQUdFCi0gIHN0cnVjdCBydXNhZ2UgcnVzYWdlOwotCi0gIGdldHJ1c2FnZSAoMCwgJnJ1c2FnZSk7Ci0gIHJldHVybiAocnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyAqIDEwMDAwMDAgKyBydXNhZ2UucnVfdXRpbWUudHZfdXNlYwotCSAgKyBydXNhZ2UucnVfc3RpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV9zdGltZS50dl91c2VjKTsKLSNlbHNlCi0jaWZkZWYgSEFWRV9USU1FUwotICBzdHJ1Y3QgdG1zIHRtczsKLQotICB0aW1lcyAoJnRtcyk7Ci0gIHJldHVybiAodG1zLnRtc191dGltZSArIHRtcy50bXNfc3RpbWUpICogKDEwMDAwMDAgLyBHTlVfSFopOwotI2Vsc2UKLSNpZmRlZiBWTVMKLSAgc3RydWN0Ci0gICAgewotICAgICAgaW50IHByb2NfdXNlcl90aW1lOwotICAgICAgaW50IHByb2Nfc3lzdGVtX3RpbWU7Ci0gICAgICBpbnQgY2hpbGRfdXNlcl90aW1lOwotICAgICAgaW50IGNoaWxkX3N5c3RlbV90aW1lOwotICAgIH0gdm1zX3RpbWVzOwotCi0gIHRpbWVzICgmdm1zX3RpbWVzKTsKLSAgcmV0dXJuICh2bXNfdGltZXMucHJvY191c2VyX3RpbWUgKyB2bXNfdGltZXMucHJvY19zeXN0ZW1fdGltZSkgKiAxMDAwMDsKLSNlbHNlCi0gIC8qIEEgZmFsbGJhY2ssIGlmIG5vdGhpbmcgZWxzZSBhdmFpbGFibGUuICovCi0gIHJldHVybiAwOwotI2VuZGlmIC8qIFZNUyAqLwotI2VuZGlmIC8qIEhBVkVfVElNRVMgKi8KLSNlbmRpZiAvKiBIQVZFX0dFVFJVU0FHRSAqLwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uY2F0LmMgYi9saWJpYmVydHkvY29uY2F0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTMyYzguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmNhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qIENvbmNhdGVuYXRlIHZhcmlhYmxlIG51bWJlciBvZiBzdHJpbmdzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKgotCi1OQU1FCi0KLQljb25jYXQgLS0gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyaW5ncwotCi1TWU5PUFNJUwotCi0JI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLQotCWNoYXIgKmNvbmNhdCAoczEsIHMyLCBzMywgLi4uLCBOVUxMKQotCi1ERVNDUklQVElPTgotCi0JQ29uY2F0ZW5hdGUgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyaW5ncyBhbmQgcmV0dXJuIHRoZSByZXN1bHQKLQlpbiBmcmVzaGx5IG1hbGxvYydkIG1lbW9yeS4KLQotCVJldHVybnMgTlVMTCBpZiBpbnN1ZmZpY2llbnQgbWVtb3J5IGlzIGF2YWlsYWJsZS4gIFRoZSBhcmd1bWVudAotCWxpc3QgaXMgdGVybWluYXRlZCBieSB0aGUgZmlyc3QgTlVMTCBwb2ludGVyIGVuY291bnRlcmVkLiAgUG9pbnRlcnMKLQl0byBlbXB0eSBzdHJpbmdzIGFyZSBpZ25vcmVkLgotCi1OT1RFUwotCi0JVGhpcyBmdW5jdGlvbiB1c2VzIHhtYWxsb2MoKSB3aGljaCBpcyBleHBlY3RlZCB0byBiZSBhIGZyb250IGVuZAotCWZ1bmN0aW9uIHRvIG1hbGxvYygpIHRoYXQgZGVhbHMgd2l0aCBsb3cgbWVtb3J5IHNpdHVhdGlvbnMuICBJbgotCXR5cGljYWwgdXNlLCBpZiBtYWxsb2MoKSByZXR1cm5zIE5VTEwgdGhlbiB4bWFsbG9jKCkgZGl2ZXJ0cyB0byBhbgotCWVycm9yIGhhbmRsZXIgcm91dGluZSB3aGljaCBuZXZlciByZXR1cm5zLCBhbmQgdGh1cyB4bWFsbG9jIHdpbGwKLQluZXZlciByZXR1cm4gYSBOVUxMIHBvaW50ZXIuICBJZiB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHdpc2hlcyB0bwotCWRlYWwgd2l0aCBsb3cgbWVtb3J5IHNpdHVhdGlvbnMgaXRzZWxmLCBpdCBzaG91bGQgc3VwcGx5IGFuIHhtYWxsb2MKLQl0aGF0IGp1c3QgZGlyZWN0bHkgaW52b2tlcyBtYWxsb2MgYW5kIGJsaW5kbHkgcmV0dXJucyB3aGF0ZXZlcgotCW1hbGxvYyByZXR1cm5zLgotKi8KLQotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gc2l6ZV90IHN0cmxlbiAoY29uc3QgY2hhciAqcyk7Ci0jZWxzZQotZXh0ZXJuIGludCBzdHJsZW4gKCk7Ci0jZW5kaWYKLQotI2RlZmluZSBOVUxMUCAoY2hhciAqKTAKLQotLyogVkFSQVJHUyAqLwotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotY2hhciAqCi1jb25jYXQgKGNvbnN0IGNoYXIgKmZpcnN0LCAuLi4pCi0jZWxzZQotY2hhciAqCi1jb25jYXQgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICByZWdpc3RlciBpbnQgbGVuZ3RoOwotICByZWdpc3RlciBjaGFyICpuZXdzdHI7Ci0gIHJlZ2lzdGVyIGNoYXIgKmVuZDsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqYXJnOwotICB2YV9saXN0IGFyZ3M7Ci0jaWZuZGVmIEFOU0lfUFJPVE9UWVBFUwotICBjb25zdCBjaGFyICpmaXJzdDsKLSNlbmRpZgotCi0gIC8qIEZpcnN0IGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHJlc3VsdCBhbmQgZ2V0IHN1ZmZpY2llbnQgbWVtb3J5LiAqLwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0gIHZhX3N0YXJ0IChhcmdzLCBmaXJzdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0gIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLSAgaWYgKGZpcnN0ID09IE5VTExQKQotICAgIGxlbmd0aCA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsZW5ndGggPSBzdHJsZW4gKGZpcnN0KTsKLSAgICAgIHdoaWxlICgoYXJnID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopKSAhPSBOVUxMUCkKLQl7Ci0JICBsZW5ndGggKz0gc3RybGVuIChhcmcpOwotCX0KLSAgICB9Ci0gIG5ld3N0ciA9IChjaGFyICopIHhtYWxsb2MgKGxlbmd0aCArIDEpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIC8qIE5vdyBjb3B5IHRoZSBpbmRpdmlkdWFsIHBpZWNlcyB0byB0aGUgcmVzdWx0IHN0cmluZy4gKi8KLQotICBpZiAobmV3c3RyICE9IE5VTExQKQotICAgIHsKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgICAgIHZhX3N0YXJ0IChhcmdzLCBmaXJzdCk7Ci0jZWxzZQotICAgICAgdmFfc3RhcnQgKGFyZ3MpOwotICAgICAgZmlyc3QgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLSAgICAgIGVuZCA9IG5ld3N0cjsKLSAgICAgIGlmIChmaXJzdCAhPSBOVUxMUCkKLQl7Ci0JICBhcmcgPSBmaXJzdDsKLQkgIHdoaWxlICgqYXJnKQotCSAgICB7Ci0JICAgICAgKmVuZCsrID0gKmFyZysrOwotCSAgICB9Ci0JICB3aGlsZSAoKGFyZyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKSkgIT0gTlVMTFApCi0JICAgIHsKLQkgICAgICB3aGlsZSAoKmFyZykKLQkJewotCQkgICplbmQrKyA9ICphcmcrKzsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgKmVuZCA9ICdcMDAwJzsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgfQotCi0gIHJldHVybiAobmV3c3RyKTsKLX0KLQotI2lmZGVmIE1BSU4KLQotLyogU2ltcGxlIGxpdHRsZSB0ZXN0IGRyaXZlci4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBwcmludGYgKCJcIlwiID0gXCIlc1wiXG4iLCBjb25jYXQgKE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYVwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYlwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhIiwgImIiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY1wiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhIiwgImIiLCAiYyIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJjZFwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhYiIsICJjZCIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJjZGVcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYWIiLCAiYyIsICJkZSIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJjZGVmXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoIiIsICJhIiwgIiIsICJiY2QiLCAiZWYiLCBOVUxMUCkpOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnLmgtdm1zIGIvbGliaWJlcnR5L2NvbmZpZy5oLXZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhYzZhMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnLmgtdm1zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBORUVEX3N0cmVycm9yCi0jZGVmaW5lIE5FRURfc3RyZXJyb3IKLSNlbmRpZgotI2lmbmRlZiBORUVEX2Jhc2VuYW1lCi0jZGVmaW5lIE5FRURfYmFzZW5hbWUKLSNlbmRpZgotI2lmbmRlZiBORUVEX3BzaWduYWwKLSNkZWZpbmUgTkVFRF9wc2lnbmFsCi0jZW5kaWYKLSNpZm5kZWYgTkVFRF9vbl9leGl0Ci0jZGVmaW5lIE5FRURfb25fZXhpdAotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcuaW4gYi9saWJpYmVydHkvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTY0MjA4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1dBSVRfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPHZmb3JrLmg+LiAgKi8KLSN1bmRlZiBIQVZFX1ZGT1JLX0gKLQotLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHBpZF90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdmZvcmsgYXMgZm9yayBpZiB2Zm9yayBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiB2Zm9yawotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19lcnJsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX25lcnIgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05FUlIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfc2lnbGlzdCB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkVSUk9SCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYXNwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQVNQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBhdGV4aXQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQVRFWElUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmFzZW5hbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQkFTRU5BTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0JDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiY29weSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CQ09QWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJ6ZXJvIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0JaRVJPCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2FsbG9jIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0NBTExPQwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNsb2NrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0NMT0NLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cnVzYWdlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFJVU0FHRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHRpbWVvZmRheSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpbmRleCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9JTkRFWAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGluc3F1ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9JTlNRVUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1jaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1DUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1tb3ZlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTU1PVkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1zZXQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNU0VUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWtzdGVtcHMgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUtTVEVNUFMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBvbl9leGl0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX09OX0VYSVQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwc2lnbmFsIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BTSUdOQUwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmFuZG9tIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1JBTkRPTQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbmFtZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SRU5BTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByaW5kZXggZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUklOREVYCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ3NldG1hc2sgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0lHU0VUTUFTSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJkdXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSRFVQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJuY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJOQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnNpZ25hbCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJTSUdOQUwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJzdHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSU1RSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RydG9kIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlRPRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvbCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJUT0wKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJ0b3VsIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlRPVUwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNjb25mIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NZU0NPTkYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lcyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9USU1FUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRtcG5hbSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9UTVBOQU0KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2YXNwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVkFTUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdmZwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVkZQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2cHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2c3ByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9WU1BSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHdhaXRwaWQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfV0FJVFBJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19GSUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19USU1FX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnLnRhYmxlIGIvbGliaWJlcnR5L2NvbmZpZy50YWJsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMzc0Ni4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnLnRhYmxlCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotY2FzZSAiJHtob3N0fSIgaW4KLSAgcnM2MDAwLWlibS1haXgzLjEgfCByczYwMDAtaWJtLWFpeCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYWc9bWgtYWl4IDs7Ci0gICotKi1jeHV4NyopCQlmcmFnPW1oLWN4dXg3IDs7Ci0gICotKi1mcmVlYnNkMi4xLiopCWZyYWc9bWgtZmJzZDIxIDs7Ci0gICotKi1mcmVlYnNkMi4yLlswMTJdKQlmcmFnPW1oLWZic2QyMSA7OwotICBpMzcwLSotb3BlbmVkKikgICAgICAgZnJhZz1taC1vcGVuZWRpdGlvbiA7OwotICBpWzM0NV04Ni0qLXdpbmRvd3MqKQlmcmFnPW1oLXdpbmRvd3MgOzsKLSAgKi0qLWJlb3MqKQkJZnJhZz1taC1iZW9zIDs7Ci1lc2FjCi0KLWZyYWdzPSRmcmFnCi0KLSMgSWYgdGhleSBkaWRuJ3Qgc3BlY2lmeSAtLWVuYWJsZS1zaGFyZWQsIGRvbid0IGdlbmVyYXRlIHNoYXJlZCBsaWJzLgotY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLSAgeWVzKSBzaGFyZWQ9eWVzIDs7Ci0gIG5vKSBzaGFyZWQ9bm8gOzsKLSAgIiIpIHNoYXJlZD1ubyA7OwotICAqKSBzaGFyZWQ9eWVzIDs7Ci1lc2FjCi1pZiBbICIke3NoYXJlZH0iID0gInllcyIgXTsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotICAgICotKi1jeWd3aW4qKQk7OwotICAgIGFscGhhKi0qLWxpbnV4KikJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1lbGZhbHBoYXBpYyIgOzsKLSAgICBhcm0qLSotKikJCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtYXJtcGljIiA7OwotICAgIGhwcGEqLSotKikJCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtcGFwaWMiIDs7Ci0gICAgaVszNDU2XTg2LSotKikJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC14ODZwaWMiIDs7Ci0gICAgcG93ZXJwYyotKi1haXgqKQk7OwotICAgIHBvd2VycGMqLSotKikJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1wcGNwaWMiIDs7Ci0gICAgKi0qLSopCQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLSR7aG9zdF9jcHV9cGljIiA7OwotICBlc2FjCi1maQotCi1lY2hvICIjIFdhcm5pbmc6IHRoaXMgZnJhZ21lbnQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQiID4gdGVtcC1mcmFnCi0KLWZvciBmcmFnIGluICR7ZnJhZ3N9OyBkbwotICBjYXNlICR7ZnJhZ30gaW4KLSAgICAuLi8qICkKLSAgICAgIGlmIFsgJHtzcmNkaXJ9ID0gLiBdOyB0aGVuCi0JWyAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiBdICYmIGZyYWc9Li4vJHtmcmFnfQotCVsgLW4gIiR7d2l0aF9tdWx0aXNyY3RvcH0iIF0gJiYgZnJhZz0ke3dpdGhfbXVsdGlzcmN0b3B9JHtmcmFnfQotICAgICAgZmkKLSAgICAgIDs7Ci0gIGVzYWMKLSAgZnJhZz0ke3NyY2Rpcn0vJHt4c3JjZGlyfWNvbmZpZy8kZnJhZwotICBpZiBbIC1mICR7ZnJhZ30gXTsgdGhlbgotICAgIGVjaG8gIkFwcGVuZGluZyAke2ZyYWd9IHRvIHhob3N0LW1rZnJhZyIKLSAgICBlY2hvICIjIEZvbGxvd2luZyBmcmFnbWVudCBjb3BpZWQgZnJvbSAke2ZyYWd9IiA+PiB0ZW1wLWZyYWcKLSAgICBjYXQgJHtmcmFnfSA+PiB0ZW1wLWZyYWcKLSAgZmkKLWRvbmUKLQotIyByZWNvcmQgaWYgd2Ugd2FudCB0byBidWlsZCBzaGFyZWQgbGlicy4KLWlmIFsgIiR7c2hhcmVkfSIgPSAieWVzIiBdOyB0aGVuCi0gIGVjaG8gZW5hYmxlX3NoYXJlZCA9IHllcyA+PiB0ZW1wLWZyYWcKLWVsc2UKLSAgZWNobyBlbmFibGVfc2hhcmVkID0gbm8gPj4gdGVtcC1mcmFnCi1maQotCi1mcmFnPXhob3N0LW1rZnJhZwotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJHtsaWJpYmVydHlfdG9wZGlyfS9tb3ZlLWlmLWNoYW5nZSB0ZW1wLWZyYWcgeGhvc3QtbWtmcmFnCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWFpeCBiL2xpYmliZXJ0eS9jb25maWcvbWgtYWl4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY0NTA1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtYWl4CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIFRoaXMgZmlsZSBpcyBvbmx5IG5lZWRlZCBieSBBSVggMy4xLgotSERFRklORVMgPSAtRF9fSUVFRV9CSUdfRU5ESUFOCi0KLSMgTW9zdCByZWxlYXNlcyBvZiBBSVggMy4xIGluY2x1ZGUgYW4gaW5jb3JyZWN0IGludGVybmFsIHZlcnNpb24gb2YgY29weXNpZ24KLSMgaW4gbGliYy5hIGZvciB1c2UgYnkgc29tZSBsaWJjIHB1YmxpYyBmdW5jdGlvbnMgaW5jbHVkaW5nIG1vZGYuICBUaGUgcHVibGljCi0jIHZlcnNpb24gb2YgY29weXNpZ24gaW4gbGlibS5hIGlzIHVzYWJsZS4gIEZvciB0aGUgc2FrZSBvZiBsaWJnKysgKHdoaWNoCi0jIHVzZXMgbW9kZiksIHdlIGFkZCBjb3B5c2lnbiBoZXJlLiAgU3VwcG9zZWRseSwgdGhpcyBwcm9ibGVtIGlzIGZpeGVkIGluIEFJWAotIyAzLjEuOCBhbmQgYWJvdmUsIGluY2x1ZGluZyBhbGwgcmVsZWFzZXMgb2YgQUlYIDMuMi4KLUVYVFJBX09GSUxFUyA9IGNvcHlzaWduLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtYmVvcyBiL2xpYmliZXJ0eS9jb25maWcvbWgtYmVvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3NWU3ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWJlb3MKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgSG9zdCBtYWtlZmlsZSBmcmFnbWVudCBmb3IgQmVPUwotCi0jIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayB1bnRpbCB0aGUgd2ltcHkgZGVmYXVsdCA2NGsgc3RhY2sKLSMgbGltaXQgaW4gQmVPUyBpcyBlaXRoZXIgaW5jcmVhc2VkIG9yIG1hZGUgdXNlciBzZXR0YWJsZSBzb21laG93LgotIyBUaGlzIHByb2JhYmx5IHdvbid0IGhhcHBlbiB1bnRpbCBhZnRlciB0aGUgRFI5IHJlbGVhc2UuCi0KLUVYVFJBX09GSUxFUyA9IGFsbG9jYS5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWN4dXg3IGIvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyNGIwOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWN4dXg3CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSERFRklORVMgPSAtREhBUlJJU19GTE9BVF9GT1JNQVQKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxIGIvbGliaWJlcnR5L2NvbmZpZy9taC1mYnNkMjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzVhNzguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1mYnNkMjEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFRSQV9PRklMRVM9dmFzcHJpbnRmLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtb3BlbmVkaXRpb24gYi9saWJpYmVydHkvY29uZmlnL21oLW9wZW5lZGl0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZThlMzU0Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtb3BlbmVkaXRpb24KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUhERUZJTkVTID0gLURfQUxMX1NPVVJDRQotQ0M9Yzg5Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtd2luZG93cyBiL2xpYmliZXJ0eS9jb25maWcvbWgtd2luZG93cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmNWY3OS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFRSQV9PRklMRVM9YXNwcmludGYubyBzdHJjYXNlY21wLm8gc3RybmNhc2VjbXAubyB2YXNwcmludGYubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZ3VyZSBiL2xpYmliZXJ0eS9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyYzgyNmQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDI5NTMgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUiAgICAgIENvbmZpZ3VyaW5nIGluIGEgc3ViZGlyZWN0b3J5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWNyb3NzLWhvc3Q9SE9TVCAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLW5ld2xpYiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBuZXdsaWIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPXBleGVjdXRlLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGFyZ2V0LXN1YmRpciBvciAtLXdpdGhvdXQtdGFyZ2V0LXN1YmRpciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcitzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF90YXJnZXRfc3ViZGlyIgotICA6Ci1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyb3NzLWhvc3Qgb3IgLS13aXRob3V0LWNyb3NzLWhvc3Qgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2Nyb3NzX2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfY3Jvc3NfaG9zdCIKLSAgOgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1uZXdsaWIgb3IgLS13aXRob3V0LW5ld2xpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbmV3bGliK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX25ld2xpYiIKLSAgOgotZmkKLQotCi1pZiB0ZXN0ICIke3NyY2Rpcn0iID0gIi4iOyB0aGVuCi0gIGlmIHRlc3QgLXogIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIjsgdGhlbgotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLiIKLSAgICBlbHNlCi0gICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKLWZpCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkbGliaWJlcnR5X3RvcGRpciAkc3JjZGlyLyRsaWJpYmVydHlfdG9wZGlyOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJGxpYmliZXJ0eV90b3BkaXIgJHNyY2Rpci8kbGliaWJlcnR5X3RvcGRpciIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTE6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE0OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiIgJiYgYWNfY3ZfcHJvZ19BUj0iYXIiCi1maQotZmkKLUFSPSIkYWNfY3ZfcHJvZ19BUiIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcwNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBGSVhNRTogV2UgdGVtcG9yYXJpbHkgZGVmaW5lIG91ciBvd24gdmVyc2lvbiBvZiBBQ19QUk9HX0NDLiAgVGhpcyBpcwotIyBjb3BpZWQgZnJvbSBhdXRvY29uZiAyLjEyLCBidXQgZG9lcyBub3QgY2FsbCBBQ19QUk9HX0NDX1dPUktTLiAgV2UKLSMgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIsIHdoaWNoIHdpbGwgbm90IGJlIGFibGUgdG8gZnVsbHkKLSMgbGluayBhbiBleGVjdXRhYmxlLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGluIGF1dG9jb25mCi0jIGl0c2VsZi4KLQotCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc1MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzgwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODI5OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4Mzg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLSAgYWNfbGliaWJlcnR5X3dhcm5fY2ZsYWdzPSctVyAtV2FsbCAtV3RyYWRpdGlvbmFsJwotICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NTQ6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdDQz0KLSAgYWNfbGliaWJlcnR5X3dhcm5fY2ZsYWdzPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODg0OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLQotCi0KLQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTIyOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLS4gJHtzcmNkaXJ9L2NvbmZpZy50YWJsZQotaG9zdF9tYWtlZmlsZV9mcmFnPSR7ZnJhZ30KLQotCi0jIEl0J3MgT0sgdG8gY2hlY2sgZm9yIGhlYWRlciBmaWxlcy4gIEFsdGhvdWdoIHRoZSBjb21waWxlciBtYXkgbm90IGJlCi0jIGFibGUgdG8gbGluayBhbnl0aGluZywgaXQgaGFkIGJldHRlciBiZSBhYmxlIHRvIGF0IGxlYXN0IGNvbXBpbGUKLSMgc29tZXRoaW5nLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4MzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwMDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwMjE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjEwMzg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZm9yIGFjX2hkciBpbiBzeXMvZmlsZS5oIHN5cy9wYXJhbS5oIHN0ZGxpYi5oIHN0cmluZy5oIHVuaXN0ZC5oIHN0cmluZ3MuaCBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oIHN5cy9zdGF0LmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTA3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTAzOiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N5c193YWl0X2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTA4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyhzdGF0X3ZhbCkgKCh1bnNpZ25lZCkoc3RhdF92YWwpID4+IDgpCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWludCBzOwotd2FpdCAoJnMpOwotcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotRU9GCi0KLWZpCi0KLQotIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBsaWJpYmVydHkgd2lsbCBwcm92aWRlIGlmIHRoZXkKLSMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlIGhvc3QuCi0KLWZ1bmNzPSJhc3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgYXRleGl0IgotZnVuY3M9IiRmdW5jcyBiYXNlbmFtZSIKLWZ1bmNzPSIkZnVuY3MgYmNtcCIKLWZ1bmNzPSIkZnVuY3MgYmNvcHkiCi1mdW5jcz0iJGZ1bmNzIGJ6ZXJvIgotZnVuY3M9IiRmdW5jcyBjYWxsb2MiCi1mdW5jcz0iJGZ1bmNzIGNsb2NrIgotZnVuY3M9IiRmdW5jcyBnZXRjd2QiCi1mdW5jcz0iJGZ1bmNzIGdldHBhZ2VzaXplIgotZnVuY3M9IiRmdW5jcyBpbmRleCIKLWZ1bmNzPSIkZnVuY3MgaW5zcXVlIgotZnVuY3M9IiRmdW5jcyBtZW1jaHIiCi1mdW5jcz0iJGZ1bmNzIG1lbWNtcCIKLWZ1bmNzPSIkZnVuY3MgbWVtY3B5IgotZnVuY3M9IiRmdW5jcyBtZW1tb3ZlIgotZnVuY3M9IiRmdW5jcyBtZW1zZXQiCi1mdW5jcz0iJGZ1bmNzIG1rc3RlbXBzIgotZnVuY3M9IiRmdW5jcyBwdXRlbnYiCi1mdW5jcz0iJGZ1bmNzIHJhbmRvbSIKLWZ1bmNzPSIkZnVuY3MgcmVuYW1lIgotZnVuY3M9IiRmdW5jcyByaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIHNldGVudiIKLWZ1bmNzPSIkZnVuY3Mgc2lnc2V0bWFzayIKLWZ1bmNzPSIkZnVuY3Mgc3RyY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RyY2hyIgotZnVuY3M9IiRmdW5jcyBzdHJkdXAiCi1mdW5jcz0iJGZ1bmNzIHN0cm5jYXNlY21wIgotZnVuY3M9IiRmdW5jcyBzdHJyY2hyIgotZnVuY3M9IiRmdW5jcyBzdHJzdHIiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvZCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG9sIgotZnVuY3M9IiRmdW5jcyBzdHJ0b3VsIgotZnVuY3M9IiRmdW5jcyB0bXBuYW0iCi1mdW5jcz0iJGZ1bmNzIHZhc3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdmZwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB3YWl0cGlkIgotCi0jIEFsc28gaW4gdGhlIG9sZCBmdW5jdGlvbi5kZWYgZmlsZTogYWxsb2NhLCB2Zm9yaywgZ2V0b3B0LgotCi12YXJzPSJzeXNfZXJybGlzdCBzeXNfbmVyciBzeXNfc2lnbGlzdCIKLQotY2hlY2tmdW5jcz0iZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcyBzYnJrIGdldHRpbWVvZmRheSIKLQotIyBUaGVzZSBhcmUgbmVpdGhlciBleGVjdXRlZCBub3IgcmVxdWlyZWQsIGJ1dCB0aGV5IGhlbHAga2VlcAotIyBhdXRvaGVhZGVyIGhhcHB5IHdpdGhvdXQgYWRkaW5nIGEgYnVuY2ggb2YgdGV4dCB0byBhY2NvbmZpZy5oLgotaWYgdGVzdCAieCIgPSAieSI7IHRoZW4KLSAgZm9yIGFjX2Z1bmMgaW4gYXNwcmludGYgYXRleGl0IGJhc2VuYW1lIGJjbXAgYmNvcHkgYnplcm8gY2FsbG9jIGNsb2NrIGdldGN3ZAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIwMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjI4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplIGluZGV4IGluc3F1ZSBta3N0ZW1wcyBtZW1jaHIgbWVtY21wIG1lbWNweSBtZW1tb3ZlCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjU1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjYwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyODM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gbWVtc2V0IHB1dGVudiByYW5kb20gcmVuYW1lIHJpbmRleCBzaWdzZXRtYXNrIHN0cmNhc2VjbXAKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMTA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMzODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBzZXRlbnYgc3RyY2hyIHN0cmR1cCBzdHJuY2FzZWNtcCBzdHJyY2hyIHN0cnN0ciBzdHJ0b2Qgc3RydG9sCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzY1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzOTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gc3RydG91bCB0bXBuYW0gdmFzcHJpbnRmIHZmcHJpbnRmIHZwcmludGYgdnNwcmludGYgd2FpdHBpZAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQyMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQyNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19FUlJMSVNUIDEKLUVPRgotCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19ORVJSIDEKLUVPRgotCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19TSUdMSVNUIDEKLUVPRgotCi0gIGZvciBhY19mdW5jIGluIGdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0ODc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0OTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBzYnJrIGdldHRpbWVvZmRheQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU0MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1maQotCi0jIEZvciBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucywgaWYgdGhlIGhvc3QgZG9lcyBub3QgcHJvdmlkZSB0aGUKLSMgZnVuY3Rpb24gd2Ugd2FudCB0byBwdXQgRk4ubyBpbiBMSUJPQkpTLCBhbmQgaWYgdGhlIGhvc3QgZG9lcwotIyBwcm92aWRlIHRoZSBmdW5jdGlvbiwgd2Ugd2FudCB0byBkZWZpbmUgSEFWRV9GTiBpbiBjb25maWcuaC4gIEFsc28sCi0jIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgYWxsb2NhLCB3ZSBzZXQgQUxMT0NBIHRvIGFsbG9jYS5vCi0KLXNldG9ianM9Ci1DSEVDSz0KLWlmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLQotICAjIFdlIGFyZSBiZWluZyBjb25maWd1cmVkIGFzIGEgdGFyZ2V0IGxpYnJhcnkuICBBQ19SRVBMQUNFX0ZVTkNTCi0gICMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSwgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZSBhYmxlIHRvCi0gICMgbGluayBleGVjdXRhYmxlcy4gIE5vdGUgdGhhdCB3ZSBtYXkgc3RpbGwgYmUgYmVpbmcgY29uZmlndXJlZAotICAjIG5hdGl2ZS4KLQotICAjIElmIHdlIGFyZSBiZWluZyBjb25maWd1cmVkIGZvciBuZXdsaWIsIHdlIGtub3cgd2hpY2ggZnVuY3Rpb25zCi0gICMgbmV3bGliIHByb3ZpZGUgYW5kIHdoaWNoIG9uZXMgd2Ugd2lsbCBiZSBleHBlY3RlZCB0byBwcm92aWRlLgotCi0gIGlmIHRlc3QgIngke3dpdGhfbmV3bGlifSIgPSAieHllcyI7IHRoZW4KLSAgICBBTExPQ0E9ImFsbG9jYS5vIgotICAgIExJQk9CSlM9ImFzcHJpbnRmLm8gYmFzZW5hbWUubyBpbnNxdWUubyByYW5kb20ubyBzdHJkdXAubyB2YXNwcmludGYubyIKLQotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWFzcHJpbnRmIHwgYmFzZW5hbWUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJkdXAgfCB2YXNwcmludGYpCi0JICA7OwotCSopCi0JICBuPUhBVkVfYGVjaG8gJGYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0JICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkbiAxCi1FT0YKLQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIG5ld2xpYiBkb2VzbnQgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbnQgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCi0KLSAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIG5ld2xpYiBvbmx5IGhhcyBzdHJlcnJvci4KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCi1FT0YKLQotCi0gICAgc2V0b2Jqcz15ZXMKLQotICBmaQotCi1lbHNlCi0KLSAgICMgTm90IGEgdGFyZ2V0IGxpYnJhcnksIHNvIHdlIHNldCB0aGluZ3MgdXAgdG8gcnVuIHRoZSB0ZXN0IHN1aXRlLgotICAgQ0hFQ0s9Y2hlY2stY3BsdXMtZGVtCi0KLWZpCi0KLQotCi1pZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi12eHdvcmtzKikKLSAgICAjIEhhbmRsZSBWeFdvcmtzIGNvbmZpZ3VyYXRpb24gc3BlY2lhbGx5LCBzaW5jZSBvbiBWeFdvcmtzIHRoZQotICAgICMgbGlicmFyaWVzIGFyZSBhY3R1YWxseSBvbiB0aGUgdGFyZ2V0IGJvYXJkLCBub3QgaW4gdGhlIGZpbGUKLSAgICAjIHN5c3RlbS4KLSAgICBMSUJPQkpTPSJiYXNlbmFtZS5vIGdldHBhZ2VzaXplLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyY2FzZWNtcC5vIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHN0cm5jYXNlY21wLm8gc3RyZHVwLm8gdmZvcmsubyB3YWl0cGlkLm8gdmFzcHJpbnRmLm8iCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYmFzZW5hbWUgfCBnZXRwYWdlc2l6ZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmNhc2VjbXApCi0JICA7OwotCXN0cm5jYXNlY21wIHwgc3RyZHVwIHwgdmZvcmsgfCB3YWl0cGlkIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJG4gMQotRU9GCi0KLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBWeFdvcmtzIGRvZXNuJ3QgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBWeFdvcmtzIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUkVSUk9SIDEKLUVPRgotCi0KLSAgICBzZXRvYmpzPXllcwotICAgIDs7Ci0KLSAgZXNhYwotZmkKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLQotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi1jeWd3aW4qKQotICAgICMgVGhlIEN5Z3dpbiBsaWJyYXJ5IGFjdHVhbGx5IHVzZXMgYSBjb3VwbGUgb2YgZmlsZXMgZnJvbQotICAgICMgbGliaWJlcnR5IHdoZW4gaXQgaXMgYnVpbHQuICBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBuYXRpdmUKLSAgICAjIEN5Z3dpbiwgYW5kIHdlIHJ1biB0aGUgdGVzdHMsIHdlIHdpbGwgYXBwZWFyIHRvIGhhdmUgdGhlc2UKLSAgICAjIGZpbGVzLiAgSG93ZXZlciwgd2hlbiB3ZSBnbyBvbiB0byBidWlsZCB3aW5zdXAsIHdlIHdpbGwgd2luZCB1cAotICAgICMgd2l0aCBhIGxpYnJhcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgZmlsZXMsIHNpbmNlIHRoZXkgc2hvdWxkCi0gICAgIyBoYXZlIGNvbWUgZnJvbSBsaWJpYmVydHkuCi0KLSAgICAjIFdlIGhhbmRsZSB0aGlzIGJ5IHJlbW92aW5nIHRoZSBmdW5jdGlvbnMgdGhlIHdpbnN1cCBsaWJyYXJ5Ci0gICAgIyBwcm92aWRlcyBmcm9tIG91ciBzaGVsbCB2YXJpYWJsZXMsIHNvIHRoYXQgdGhleSBhcHBlYXIgdG8gYmUKLSAgICAjIG1pc3NpbmcuCi0KLSAgICBmdW5jcz0iYGVjaG8gJGZ1bmNzIHwgc2VkIC1lICdzL3JhbmRvbS8vJ2AiCi0gICAgTElCT0JKUz0iJExJQk9CSlMgcmFuZG9tLm8iCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX3NpZ2xpc3QvLydgIgotICAgIGNoZWNrZnVuY3M9ImBlY2hvICRjaGVja2Z1bmNzIHwgc2VkIC1lICdzL3N0cnNpZ25hbC8vJyAtZSAncy9wc2lnbmFsLy8nYCIKLSAgICA7OwotCi0gICotKi1taW5ndzMyKikKLSAgICAjIFVuZGVyIG1pbmd3MzIsIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCBleGlzdCwgYnV0IHRoZXkgYXJlCi0gICAgIyBtYWNyb3MsIHNvIHRoZSB0ZXN0IGJlbG93IHdvbid0IGZpbmQgdGhlbS4KLSAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfbmVyci8vJyAtZSAncy9zeXNfZXJybGlzdC8vJ2AiCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX05FUlIgMQotRU9GCi0KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfRVJSTElTVCAxCi1FT0YKLQotICAgIDs7Ci0KLSAgKi0qLXV3aW4qKQotICAgICMgVW5kZXIgc29tZSB2ZXJzaW9ucyBvZiB1d2luLCB2Zm9yayBpcyBub3RvcmlvdXNseSBidWdneSBhbmQgdGhlIHRlc3QgCi0gICAgIyBjYW4gaGFuZyBjb25maWd1cmU7IG9uIG90aGVyIHZlcnNpb25zLCB2Zm9yayBleGlzdHMganVzdCBhcyBhIHN0dWIuCi0gICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHZmb3JrIGluIHV3aW4ncyBydW50aW1lIGlzIGZpeGVkLgotICAgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLSAgICAjIFVuZGVyIHV3aW4gMi4wKywgc3lzX25lcnIgYW5kIHN5c19lcnJsaXN0IGV4aXN0LCBidXQgdGhleSBhcmUKLSAgICAjIG1hY3JvcyAoYWN0dWFsbHksIHRoZXNlIGFyZSBpbXBvcnRlZCBmcm9tIGEgRExMLCBidXQgdGhlIGVuZCBlZmZlY3QgCi0gICAgIyBpcyB0aGUgc2FtZSksIHNvIHRoZSB0ZXN0IGJlbG93IHdvbid0IGZpbmQgdGhlbS4KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfTkVSUiAxCi1FT0YKLQotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19FUlJMSVNUIDEKLUVPRgotCi0gICAgOzsKLQotICBlc2FjCi0KLSAgIyBXZSBoYXZlbid0IHNldCB0aGUgbGlzdCBvZiBvYmplY3RzIHlldC4gIFVzZSB0aGUgc3RhbmRhcmQgYXV0b2NvbmYKLSAgIyB0ZXN0cy4gIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGNvbXBpbGVyIHdvcmtzLgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NTI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE3NjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3OTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLSAgZm9yIGFjX2Z1bmMgaW4gJGZ1bmNzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODAxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4Mjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLUxJQk9CSlM9IiRMSUJPQkpTICR7YWNfZnVuY30uJHthY19vYmpleHR9IgotZmkKLWRvbmUKLQotCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgKi0qLWludGVyaXgpCi0gICAgIyBPbiBJbnRlcml4LCBpdCB3cm9uZ2x5IGNvbmNsdWRlcyB0aGF0IHRoZSBNU1ZDIGNvbXBpbGVyIHN1cHBvcnRzIGFsbG9jYS4KLSAgICAjIChNU1ZDIGRvZXMgb24gV2luMzIsIG5vdCBvbiBJbnRlcml4LikKLSAgICAjIFRoaXMgc2hvdWxkIGJlIHRlbXBvcmFyeS4KLQotICAgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotICAgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi0gICAgQUxMT0NBPWFsbG9jYS5vCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAtMQotRU9GCi0gICAgOzsKLSAgKikKLSAgICAjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODc2OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkwOTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTE0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTc0OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMDQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDU5OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA2NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotICAgIDs7Ci0gIGVzYWMKLQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjExMTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjExNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEyNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxNTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBpZF90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjE1OiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfcGlkX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjIwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXBpZF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9waWRfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3BpZF90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfcGlkX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfcGlkX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgcGlkX3QgaW50Ci1FT0YKLQotZmkKLQotYWNfc2FmZT1gZWNobyAidmZvcmsuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdmZvcmsuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI0OTogY2hlY2tpbmcgZm9yIHZmb3JrLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHZmb3JrLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9WRk9SS19IIDEKLUVPRgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyODQ6IGNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3Zmb3JrX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZmb3JrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjkwOiBjaGVja2luZyBmb3IgdmZvcmsiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdmZvcmsnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjk1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHZmb3JrKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgdmZvcmsoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl92Zm9yaykgfHwgZGVmaW5lZCAoX19zdHViX19fdmZvcmspCi1jaG9rZSBtZQotI2Vsc2UKLXZmb3JrKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfdmZvcms9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3Zmb3JrPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ndmZvcmtgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgOgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1bmNfdmZvcmsKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBUaGFua3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVkZPUktfSAotI2luY2x1ZGUgPHZmb3JrLmg+Ci0jZW5kaWYKLS8qIE9uIHNvbWUgc3BhcmMgc3lzdGVtcywgY2hhbmdlcyBieSB0aGUgY2hpbGQgdG8gbG9jYWwgYW5kIGluY29taW5nCi0gICBhcmd1bWVudCByZWdpc3RlcnMgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50LgotICAgVGhlIGNvbXBpbGVyIGlzIHRvbGQgYWJvdXQgdGhpcyB3aXRoICNpbmNsdWRlIDx2Zm9yay5oPiwKLSAgIGJ1dCBzb21lIGNvbXBpbGVycyAoZS5nLiBnY2MgLU8pIGRvbid0IGdyb2sgPHZmb3JrLmg+LgotICAgVGVzdCBmb3IgdGhpcyBieSB1c2luZyBhIHN0YXRpYyB2YXJpYWJsZSB3aG9zZSBhZGRyZXNzCi0gICBpcyBwdXQgaW50byBhIHJlZ2lzdGVyIHRoYXQgaXMgY2xvYmJlcmVkIGJ5IHRoZSB2Zm9yay4gICovCi1zdGF0aWMKLSNpZmRlZiBfX2NwbHVzcGx1cwotc3BhcmNfYWRkcmVzc190ZXN0IChpbnQgYXJnKQotI2Vsc2UKLXNwYXJjX2FkZHJlc3NfdGVzdCAoYXJnKSBpbnQgYXJnOwotI2VuZGlmCi17Ci0gIHN0YXRpYyBwaWRfdCBjaGlsZDsKLSAgaWYgKCFjaGlsZCkgewotICAgIGNoaWxkID0gdmZvcmsgKCk7Ci0gICAgaWYgKGNoaWxkIDwgMCkgewotICAgICAgcGVycm9yICgidmZvcmsiKTsKLSAgICAgIF9leGl0KDIpOwotICAgIH0KLSAgICBpZiAoIWNoaWxkKSB7Ci0gICAgICBhcmcgPSBnZXRwaWQoKTsKLSAgICAgIHdyaXRlKC0xLCAiIiwgMCk7Ci0gICAgICBfZXhpdCAoYXJnKTsKLSAgICB9Ci0gIH0KLX0KLW1haW4oKSB7Ci0gIHBpZF90IHBhcmVudCA9IGdldHBpZCAoKTsKLSAgcGlkX3QgY2hpbGQ7Ci0KLSAgc3BhcmNfYWRkcmVzc190ZXN0ICgpOwotCi0gIGNoaWxkID0gdmZvcmsgKCk7Ci0KLSAgaWYgKGNoaWxkID09IDApIHsKLSAgICAvKiBIZXJlIGlzIGFub3RoZXIgdGVzdCBmb3Igc3BhcmMgdmZvcmsgcmVnaXN0ZXIgcHJvYmxlbXMuCi0gICAgICAgVGhpcyB0ZXN0IHVzZXMgbG90cyBvZiBsb2NhbCB2YXJpYWJsZXMsIGF0IGxlYXN0Ci0gICAgICAgYXMgbWFueSBsb2NhbCB2YXJpYWJsZXMgYXMgbWFpbiBoYXMgYWxsb2NhdGVkIHNvIGZhcgotICAgICAgIGluY2x1ZGluZyBjb21waWxlciB0ZW1wb3Jhcmllcy4gIDQgbG9jYWxzIGFyZSBlbm91Z2ggZm9yCi0gICAgICAgZ2NjIDEuNDAuMyBvbiBhIFNvbGFyaXMgNC4xLjMgc3BhcmMsIGJ1dCB3ZSB1c2UgOCB0byBiZSBzYWZlLgotICAgICAgIEEgYnVnZ3kgY29tcGlsZXIgc2hvdWxkIHJldXNlIHRoZSByZWdpc3RlciBvZiBwYXJlbnQKLSAgICAgICBmb3Igb25lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMsIHNpbmNlIGl0IHdpbGwgdGhpbmsgdGhhdAotICAgICAgIHBhcmVudCBjYW4ndCBwb3NzaWJseSBiZSB1c2VkIGFueSBtb3JlIGluIHRoaXMgcm91dGluZS4KLSAgICAgICBBc3NpZ25pbmcgdG8gdGhlIGxvY2FsIHZhcmlhYmxlIHdpbGwgdGh1cyBtdW5nZSBwYXJlbnQKLSAgICAgICBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICAqLwotICAgIHBpZF90Ci0gICAgICBwID0gZ2V0cGlkKCksIHAxID0gZ2V0cGlkKCksIHAyID0gZ2V0cGlkKCksIHAzID0gZ2V0cGlkKCksCi0gICAgICBwNCA9IGdldHBpZCgpLCBwNSA9IGdldHBpZCgpLCBwNiA9IGdldHBpZCgpLCBwNyA9IGdldHBpZCgpOwotICAgIC8qIENvbnZpbmNlIHRoZSBjb21waWxlciB0aGF0IHAuLnA3IGFyZSBsaXZlOyBvdGhlcndpc2UsIGl0IG1pZ2h0Ci0gICAgICAgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIHJlZ2lzdGVyIGZvciBhbGwgOCBsb2NhbCB2YXJpYWJsZXMuICAqLwotICAgIGlmIChwICE9IHAxIHx8IHAgIT0gcDIgfHwgcCAhPSBwMyB8fCBwICE9IHA0Ci0JfHwgcCAhPSBwNSB8fCBwICE9IHA2IHx8IHAgIT0gcDcpCi0gICAgICBfZXhpdCgxKTsKLQotICAgIC8qIE9uIHNvbWUgc3lzdGVtcyAoZS5nLiBJUklYIDMuMyksCi0gICAgICAgdmZvcmsgZG9lc24ndCBzZXBhcmF0ZSBwYXJlbnQgZnJvbSBjaGlsZCBmaWxlIGRlc2NyaXB0b3JzLgotICAgICAgIElmIHRoZSBjaGlsZCBjbG9zZXMgYSBkZXNjcmlwdG9yIGJlZm9yZSBpdCBleGVjcyBvciBleGl0cywKLSAgICAgICB0aGlzIG11bmdlcyB0aGUgcGFyZW50J3MgZGVzY3JpcHRvciBhcyB3ZWxsLgotICAgICAgIFRlc3QgZm9yIHRoaXMgYnkgY2xvc2luZyBzdGRvdXQgaW4gdGhlIGNoaWxkLiAgKi8KLSAgICBfZXhpdChjbG9zZShmaWxlbm8oc3Rkb3V0KSkgIT0gMCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50IHN0YXR1czsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICAgIHdoaWxlICh3YWl0KCZzdGF0dXMpICE9IGNoaWxkKQotICAgICAgOwotICAgIGV4aXQoCi0JIC8qIFdhcyB0aGVyZSBzb21lIHByb2JsZW0gd2l0aCB2Zm9ya2luZz8gICovCi0JIGNoaWxkIDwgMAotCi0JIC8qIERpZCB0aGUgY2hpbGQgZmFpbD8gIChUaGlzIHNob3VsZG4ndCBoYXBwZW4uKSAgKi8KLQkgfHwgc3RhdHVzCi0KLQkgLyogRGlkIHRoZSB2Zm9yay9jb21waWxlciBidWcgb2NjdXI/ICAqLwotCSB8fCBwYXJlbnQgIT0gZ2V0cGlkKCkKLQotCSAvKiBEaWQgdGhlIGZpbGUgZGVzY3JpcHRvciBidWcgb2NjdXI/ICAqLwotCSB8fCBmc3RhdChmaWxlbm8oc3Rkb3V0KSwgJnN0KSAhPSAwCi0JICk7Ci0gIH0KLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgdmZvcmsgZm9yawotRU9GCi0KLWZpCi0KLSAgaWYgdGVzdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyA9IG5vOyB0aGVuCi0gICAgTElCT0JKUz0iJExJQk9CSlMgdmZvcmsubyIKLSAgZmkKLSAgZm9yIHYgaW4gJHZhcnM7IGRvCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICR2IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDYyOiBjaGVja2luZyBmb3IgJHYiID4mNQotICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsaWJpYmVydHlfY3ZfdmFyXyR2JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ2NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1pbnQgKnA7Ci1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgJHY7IHAgPSAmJHY7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ3NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckbGliaWJlcnR5X2N2X3Zhcl8nJHZgXCIgPSB5ZXMiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgICBuPUhBVkVfYGVjaG8gJHYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkbiAxCi1FT0YKLQotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190IiJubyIgMT4mNgotICAgIGZpCi0gIGRvbmUKLSAgZm9yIGFjX2Z1bmMgaW4gJGNoZWNrZnVuY3MKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZmkKLQotIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gJCh0b29sZGlyKSByYXRoZXIKLSMgdGhhbiAkKGxpYmRpcikuCi1pZiB0ZXN0IC16ICIke3dpdGhfY3Jvc3NfaG9zdH0iOyB0aGVuCi0gIElOU1RBTExfREVTVD1saWJkaXIKLWVsc2UKLSAgSU5TVEFMTF9ERVNUPXRvb2xkaXIKLWZpCi0KLQotIyBXZSBuZWVkIG11bHRpbGliIHN1cHBvcnQsIGJ1dCBvbmx5IGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgdGFyZ2V0LgotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHRlc3RzdWl0ZS9NYWtlZmlsZSBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQGFjX2xpYmliZXJ0eV93YXJuX2NmbGFnc0AlJGFjX2xpYmliZXJ0eV93YXJuX2NmbGFncyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi0vQGhvc3RfbWFrZWZpbGVfZnJhZ0AvciAkaG9zdF9tYWtlZmlsZV9mcmFnCi1zJUBob3N0X21ha2VmaWxlX2ZyYWdAJSVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQ0hFQ0tAJSRDSEVDSyVnCi1zJUBMSUJPQkpTQCUkTElCT0JKUyVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVASU5TVEFMTF9ERVNUQCUkSU5TVEFMTF9ERVNUJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHRlc3RzdWl0ZS9NYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLXNyY2Rpcj0ke3NyY2Rpcn0KLWhvc3Q9JHtob3N0fQotdGFyZ2V0PSR7dGFyZ2V0fQotd2l0aF90YXJnZXRfc3ViZGlyPSR7d2l0aF90YXJnZXRfc3ViZGlyfQotd2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9Ci1hY19jb25maWd1cmVfYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHthY19jb25maWd1cmVfYXJnc30iCi1DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLWxpYmliZXJ0eV90b3BkaXI9JHtsaWJpYmVydHlfdG9wZGlyfQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotICBpZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgIyBGSVhNRTogV2Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IGFjX2ZpbGUKLSAgICBhY19maWxlPU1ha2VmaWxlCi0gICAgLiAke2xpYmliZXJ0eV90b3BkaXJ9L2NvbmZpZy1tbC5pbgotICBmaQotZmkKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlndXJlLmluIGIvbGliaWJlcnR5L2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxYjJjMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Ci0KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChwZXhlY3V0ZS5jKQotCi1kbmwgV2UgdXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZ1bmN0aW9ucyB0byBpbmNsdWRlLgotQUNfQVJHX1dJVEgodGFyZ2V0LXN1YmRpciwKLVsgIC0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUiAgICAgIENvbmZpZ3VyaW5nIGluIGEgc3ViZGlyZWN0b3J5XSkKLUFDX0FSR19XSVRIKGNyb3NzLWhvc3QsCi1bICAtLXdpdGgtY3Jvc3MtaG9zdD1IT1NUICAgICAgICAgICBDb25maWd1cmluZyB3aXRoIGEgY3Jvc3MgY29tcGlsZXJdKQotQUNfQVJHX1dJVEgobmV3bGliLAotWyAgLS13aXRoLW5ld2xpYiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBuZXdsaWJdKQotCi1pZiB0ZXN0ICIke3NyY2Rpcn0iID0gIi4iOyB0aGVuCi0gIGlmIHRlc3QgLXogIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIjsgdGhlbgotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLiIKLSAgICBlbHNlCi0gICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKLWZpCi1BQ19DT05GSUdfQVVYX0RJUigkbGliaWJlcnR5X3RvcGRpcikKLQotQUNfQ0FOT05JQ0FMX0hPU1QKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShsaWJpYmVydHksIDEuMCkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLSMgRklYTUU6IFdlIHRlbXBvcmFyaWx5IGRlZmluZSBvdXIgb3duIHZlcnNpb24gb2YgQUNfUFJPR19DQy4gIFRoaXMgaXMKLSMgY29waWVkIGZyb20gYXV0b2NvbmYgMi4xMiwgYnV0IGRvZXMgbm90IGNhbGwgQUNfUFJPR19DQ19XT1JLUy4gIFdlCi0jIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLCB3aGljaCB3aWxsIG5vdCBiZSBhYmxlIHRvIGZ1bGx5Ci0jIGxpbmsgYW4gZXhlY3V0YWJsZS4gIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBpbiBhdXRvY29uZgotIyBpdHNlbGYuCi0KLUFDX0RFRlVOKExJQl9BQ19QUk9HX0NDLAotW0FDX0JFRk9SRShbJDBdLCBbQUNfUFJPR19DUFBdKWRubAotQUNfUFJPVklERShbQUNfUFJPR19DQ10pCi1BQ19DSEVDS19QUk9HKENDLCBnY2MsIGdjYykKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgQUNfQ0hFQ0tfUFJPRyhDQywgY2MsIGNjLCAsICwgL3Vzci91Y2IvY2MpCi0gIHRlc3QgLXogIiRDQyIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSF0pCi1maQotCi1BQ19QUk9HX0NDX0dOVQotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi0gIGFjX2xpYmliZXJ0eV93YXJuX2NmbGFncz0nLVcgLVdhbGwgLVd0cmFkaXRpb25hbCcKLWRubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENGTEFHUyBpcyBzZXQsIGluIGNhc2UgdGhlIHBhY2thZ2UKLWRubCBwbGF5cyBhcm91bmQgd2l0aCBDRkxBR1MgKHN1Y2ggYXMgdG8gYnVpbGQgYm90aCBkZWJ1Z2dpbmcgYW5kCi1kbmwgbm9ybWFsIHZlcnNpb25zIG9mIGEgbGlicmFyeSksIHRhc3RlbGVzcyBhcyB0aGF0IGlkZWEgaXMuCi0gIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPQotICBBQ19QUk9HX0NDX0cKLSAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdDQz0KLSAgYWNfbGliaWJlcnR5X3dhcm5fY2ZsYWdzPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgotZmkKLV0pCi1BQ19TVUJTVChhY19saWJpYmVydHlfd2Fybl9jZmxhZ3MpCi0KLUxJQl9BQ19QUk9HX0NDCi0KLUFDX0lTQ19QT1NJWAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBsaWJ0b29sOgotZG5sIERlZmF1bHQgdG8gYSBub24gc2hhcmVkIGxpYnJhcnkuICBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZQotZG5sIGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtc2hhcmVkLgotZG5sIEFNX0RJU0FCTEVfU0hBUkVECi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGxpYnRvb2w6Ci1kbmwgQU1fUFJPR19MSUJUT09MCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotQUNfQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX01BSU5UQUlORVJfTU9ERQotZG5sIEFDX0VYRUVYVAotCi1kbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKLWRubCBBTV9QUk9HX0lOU1RBTEwKLUFDX1BST0dfSU5TVEFMTAotCi0uICR7c3JjZGlyfS9jb25maWcudGFibGUKLWhvc3RfbWFrZWZpbGVfZnJhZz0ke2ZyYWd9Ci1BQ19TVUJTVF9GSUxFKGhvc3RfbWFrZWZpbGVfZnJhZykKLQotIyBJdCdzIE9LIHRvIGNoZWNrIGZvciBoZWFkZXIgZmlsZXMuICBBbHRob3VnaCB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZQotIyBhYmxlIHRvIGxpbmsgYW55dGhpbmcsIGl0IGhhZCBiZXR0ZXIgYmUgYWJsZSB0byBhdCBsZWFzdCBjb21waWxlCi0jIHNvbWV0aGluZy4KLUFDX0NIRUNLX0hFQURFUlMoc3lzL2ZpbGUuaCBzeXMvcGFyYW0uaCBzdGRsaWIuaCBzdHJpbmcuaCB1bmlzdGQuaCBzdHJpbmdzLmggc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaCBzeXMvc3RhdC5oKQotQUNfSEVBREVSX1NZU19XQUlUCi0KLSMgVGhpcyBpcyB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgd2hpY2ggbGliaWJlcnR5IHdpbGwgcHJvdmlkZSBpZiB0aGV5Ci0jIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoZSBob3N0LgotCi1mdW5jcz0iYXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIGF0ZXhpdCIKLWZ1bmNzPSIkZnVuY3MgYmFzZW5hbWUiCi1mdW5jcz0iJGZ1bmNzIGJjbXAiCi1mdW5jcz0iJGZ1bmNzIGJjb3B5IgotZnVuY3M9IiRmdW5jcyBiemVybyIKLWZ1bmNzPSIkZnVuY3MgY2FsbG9jIgotZnVuY3M9IiRmdW5jcyBjbG9jayIKLWZ1bmNzPSIkZnVuY3MgZ2V0Y3dkIgotZnVuY3M9IiRmdW5jcyBnZXRwYWdlc2l6ZSIKLWZ1bmNzPSIkZnVuY3MgaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIGluc3F1ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtY2hyIgotZnVuY3M9IiRmdW5jcyBtZW1jbXAiCi1mdW5jcz0iJGZ1bmNzIG1lbWNweSIKLWZ1bmNzPSIkZnVuY3MgbWVtbW92ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtc2V0IgotZnVuY3M9IiRmdW5jcyBta3N0ZW1wcyIKLWZ1bmNzPSIkZnVuY3MgcHV0ZW52IgotZnVuY3M9IiRmdW5jcyByYW5kb20iCi1mdW5jcz0iJGZ1bmNzIHJlbmFtZSIKLWZ1bmNzPSIkZnVuY3MgcmluZGV4IgotZnVuY3M9IiRmdW5jcyBzZXRlbnYiCi1mdW5jcz0iJGZ1bmNzIHNpZ3NldG1hc2siCi1mdW5jcz0iJGZ1bmNzIHN0cmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cmNociIKLWZ1bmNzPSIkZnVuY3Mgc3RyZHVwIgotZnVuY3M9IiRmdW5jcyBzdHJuY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RycmNociIKLWZ1bmNzPSIkZnVuY3Mgc3Ryc3RyIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2QiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvbCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG91bCIKLWZ1bmNzPSIkZnVuY3MgdG1wbmFtIgotZnVuY3M9IiRmdW5jcyB2YXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZmcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2cHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2c3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3Mgd2FpdHBpZCIKLQotIyBBbHNvIGluIHRoZSBvbGQgZnVuY3Rpb24uZGVmIGZpbGU6IGFsbG9jYSwgdmZvcmssIGdldG9wdC4KLQotdmFycz0ic3lzX2Vycmxpc3Qgc3lzX25lcnIgc3lzX3NpZ2xpc3QiCi0KLWNoZWNrZnVuY3M9ImdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMgc2JyayBnZXR0aW1lb2ZkYXkiCi0KLSMgVGhlc2UgYXJlIG5laXRoZXIgZXhlY3V0ZWQgbm9yIHJlcXVpcmVkLCBidXQgdGhleSBoZWxwIGtlZXAKLSMgYXV0b2hlYWRlciBoYXBweSB3aXRob3V0IGFkZGluZyBhIGJ1bmNoIG9mIHRleHQgdG8gYWNjb25maWcuaC4KLWlmIHRlc3QgIngiID0gInkiOyB0aGVuCi0gIEFDX0NIRUNLX0ZVTkNTKGFzcHJpbnRmIGF0ZXhpdCBiYXNlbmFtZSBiY21wIGJjb3B5IGJ6ZXJvIGNhbGxvYyBjbG9jayBnZXRjd2QpCi0gIEFDX0NIRUNLX0ZVTkNTKGdldHBhZ2VzaXplIGluZGV4IGluc3F1ZSBta3N0ZW1wcyBtZW1jaHIgbWVtY21wIG1lbWNweSBtZW1tb3ZlKQotICBBQ19DSEVDS19GVU5DUyhtZW1zZXQgcHV0ZW52IHJhbmRvbSByZW5hbWUgcmluZGV4IHNpZ3NldG1hc2sgc3RyY2FzZWNtcCkKLSAgQUNfQ0hFQ0tfRlVOQ1Moc2V0ZW52IHN0cmNociBzdHJkdXAgc3RybmNhc2VjbXAgc3RycmNociBzdHJzdHIgc3RydG9kIHN0cnRvbCkKLSAgQUNfQ0hFQ0tfRlVOQ1Moc3RydG91bCB0bXBuYW0gdmFzcHJpbnRmIHZmcHJpbnRmIHZwcmludGYgdnNwcmludGYgd2FpdHBpZCkKLSAgQUNfREVGSU5FKEhBVkVfU1lTX0VSUkxJU1QpCi0gIEFDX0RFRklORShIQVZFX1NZU19ORVJSKQotICBBQ19ERUZJTkUoSEFWRV9TWVNfU0lHTElTVCkKLSAgQUNfQ0hFQ0tfRlVOQ1MoZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcykKLSAgQUNfQ0hFQ0tfRlVOQ1Moc2JyayBnZXR0aW1lb2ZkYXkpCi1maQotCi0jIEZvciBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucywgaWYgdGhlIGhvc3QgZG9lcyBub3QgcHJvdmlkZSB0aGUKLSMgZnVuY3Rpb24gd2Ugd2FudCB0byBwdXQgRk4ubyBpbiBMSUJPQkpTLCBhbmQgaWYgdGhlIGhvc3QgZG9lcwotIyBwcm92aWRlIHRoZSBmdW5jdGlvbiwgd2Ugd2FudCB0byBkZWZpbmUgSEFWRV9GTiBpbiBjb25maWcuaC4gIEFsc28sCi0jIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgYWxsb2NhLCB3ZSBzZXQgQUxMT0NBIHRvIGFsbG9jYS5vCi0KLXNldG9ianM9Ci1DSEVDSz0KLWlmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLQotICAjIFdlIGFyZSBiZWluZyBjb25maWd1cmVkIGFzIGEgdGFyZ2V0IGxpYnJhcnkuICBBQ19SRVBMQUNFX0ZVTkNTCi0gICMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSwgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZSBhYmxlIHRvCi0gICMgbGluayBleGVjdXRhYmxlcy4gIE5vdGUgdGhhdCB3ZSBtYXkgc3RpbGwgYmUgYmVpbmcgY29uZmlndXJlZAotICAjIG5hdGl2ZS4KLQotICAjIElmIHdlIGFyZSBiZWluZyBjb25maWd1cmVkIGZvciBuZXdsaWIsIHdlIGtub3cgd2hpY2ggZnVuY3Rpb25zCi0gICMgbmV3bGliIHByb3ZpZGUgYW5kIHdoaWNoIG9uZXMgd2Ugd2lsbCBiZSBleHBlY3RlZCB0byBwcm92aWRlLgotCi0gIGlmIHRlc3QgIngke3dpdGhfbmV3bGlifSIgPSAieHllcyI7IHRoZW4KLSAgICBBTExPQ0E9ImFsbG9jYS5vIgotICAgIExJQk9CSlM9ImFzcHJpbnRmLm8gYmFzZW5hbWUubyBpbnNxdWUubyByYW5kb20ubyBzdHJkdXAubyB2YXNwcmludGYubyIKLQotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWFzcHJpbnRmIHwgYmFzZW5hbWUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJkdXAgfCB2YXNwcmludGYpCi0JICA7OwotCSopCi0JICBuPUhBVkVfYGVjaG8gJGYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0JICBBQ19ERUZJTkVfVU5RVU9URUQoJG4pCi0JICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgbmV3bGliIGRvZXNudCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9udCBoYXZlIHRvIGNoZWNrIHRoZW0gaGVyZS4KLQotICAgICMgT2YgdGhlIGZ1bmN0aW9ucyBpbiAkY2hlY2tmdW5jcywgbmV3bGliIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIEFDX0RFRklORShIQVZFX1NUUkVSUk9SKQotCi0gICAgc2V0b2Jqcz15ZXMKLQotICBmaQotCi1lbHNlCi0KLSAgICMgTm90IGEgdGFyZ2V0IGxpYnJhcnksIHNvIHdlIHNldCB0aGluZ3MgdXAgdG8gcnVuIHRoZSB0ZXN0IHN1aXRlLgotICAgQ0hFQ0s9Y2hlY2stY3BsdXMtZGVtCi0KLWZpCi0KLUFDX1NVQlNUKENIRUNLKQotCi1pZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi12eHdvcmtzKikKLSAgICAjIEhhbmRsZSBWeFdvcmtzIGNvbmZpZ3VyYXRpb24gc3BlY2lhbGx5LCBzaW5jZSBvbiBWeFdvcmtzIHRoZQotICAgICMgbGlicmFyaWVzIGFyZSBhY3R1YWxseSBvbiB0aGUgdGFyZ2V0IGJvYXJkLCBub3QgaW4gdGhlIGZpbGUKLSAgICAjIHN5c3RlbS4KLSAgICBMSUJPQkpTPSJiYXNlbmFtZS5vIGdldHBhZ2VzaXplLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyY2FzZWNtcC5vIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHN0cm5jYXNlY21wLm8gc3RyZHVwLm8gdmZvcmsubyB3YWl0cGlkLm8gdmFzcHJpbnRmLm8iCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYmFzZW5hbWUgfCBnZXRwYWdlc2l6ZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmNhc2VjbXApCi0JICA7OwotCXN0cm5jYXNlY21wIHwgc3RyZHVwIHwgdmZvcmsgfCB3YWl0cGlkIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgQUNfREVGSU5FX1VOUVVPVEVEKCRuKQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFZ4V29ya3MgZG9lc24ndCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCi0KLSAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIFZ4V29ya3Mgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1IpCi0KLSAgICBzZXRvYmpzPXllcwotICAgIDs7Ci0KLSAgZXNhYwotZmkKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLQotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi1jeWd3aW4qKQotICAgICMgVGhlIEN5Z3dpbiBsaWJyYXJ5IGFjdHVhbGx5IHVzZXMgYSBjb3VwbGUgb2YgZmlsZXMgZnJvbQotICAgICMgbGliaWJlcnR5IHdoZW4gaXQgaXMgYnVpbHQuICBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBuYXRpdmUKLSAgICAjIEN5Z3dpbiwgYW5kIHdlIHJ1biB0aGUgdGVzdHMsIHdlIHdpbGwgYXBwZWFyIHRvIGhhdmUgdGhlc2UKLSAgICAjIGZpbGVzLiAgSG93ZXZlciwgd2hlbiB3ZSBnbyBvbiB0byBidWlsZCB3aW5zdXAsIHdlIHdpbGwgd2luZCB1cAotICAgICMgd2l0aCBhIGxpYnJhcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgZmlsZXMsIHNpbmNlIHRoZXkgc2hvdWxkCi0gICAgIyBoYXZlIGNvbWUgZnJvbSBsaWJpYmVydHkuCi0KLSAgICAjIFdlIGhhbmRsZSB0aGlzIGJ5IHJlbW92aW5nIHRoZSBmdW5jdGlvbnMgdGhlIHdpbnN1cCBsaWJyYXJ5Ci0gICAgIyBwcm92aWRlcyBmcm9tIG91ciBzaGVsbCB2YXJpYWJsZXMsIHNvIHRoYXQgdGhleSBhcHBlYXIgdG8gYmUKLSAgICAjIG1pc3NpbmcuCi0KLSAgICBmdW5jcz0iYGVjaG8gJGZ1bmNzIHwgc2VkIC1lICdzL3JhbmRvbS8vJ2AiCi0gICAgTElCT0JKUz0iJExJQk9CSlMgcmFuZG9tLm8iCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX3NpZ2xpc3QvLydgIgotICAgIGNoZWNrZnVuY3M9ImBlY2hvICRjaGVja2Z1bmNzIHwgc2VkIC1lICdzL3N0cnNpZ25hbC8vJyAtZSAncy9wc2lnbmFsLy8nYCIKLSAgICA7OwotCi0gICotKi1taW5ndzMyKikKLSAgICAjIFVuZGVyIG1pbmd3MzIsIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCBleGlzdCwgYnV0IHRoZXkgYXJlCi0gICAgIyBtYWNyb3MsIHNvIHRoZSB0ZXN0IGJlbG93IHdvbid0IGZpbmQgdGhlbS4KLSAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfbmVyci8vJyAtZSAncy9zeXNfZXJybGlzdC8vJ2AiCi0gICAgQUNfREVGSU5FKEhBVkVfU1lTX05FUlIpCi0gICAgQUNfREVGSU5FKEhBVkVfU1lTX0VSUkxJU1QpCi0gICAgOzsKLQotICAqLSotdXdpbiopCi0gICAgIyBVbmRlciBzb21lIHZlcnNpb25zIG9mIHV3aW4sIHZmb3JrIGlzIG5vdG9yaW91c2x5IGJ1Z2d5IGFuZCB0aGUgdGVzdCAKLSAgICAjIGNhbiBoYW5nIGNvbmZpZ3VyZTsgb24gb3RoZXIgdmVyc2lvbnMsIHZmb3JrIGV4aXN0cyBqdXN0IGFzIGEgc3R1Yi4KLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdmZvcmsgaW4gdXdpbidzIHJ1bnRpbWUgaXMgZml4ZWQuCi0gICAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubwotICAgICMgVW5kZXIgdXdpbiAyLjArLCBzeXNfbmVyciBhbmQgc3lzX2Vycmxpc3QgZXhpc3QsIGJ1dCB0aGV5IGFyZQotICAgICMgbWFjcm9zIChhY3R1YWxseSwgdGhlc2UgYXJlIGltcG9ydGVkIGZyb20gYSBETEwsIGJ1dCB0aGUgZW5kIGVmZmVjdCAKLSAgICAjIGlzIHRoZSBzYW1lKSwgc28gdGhlIHRlc3QgYmVsb3cgd29uJ3QgZmluZCB0aGVtLgotICAgIEFDX0RFRklORShIQVZFX1NZU19ORVJSKQotICAgIEFDX0RFRklORShIQVZFX1NZU19FUlJMSVNUKQotICAgIDs7Ci0KLSAgZXNhYwotCi0gICMgV2UgaGF2ZW4ndCBzZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB5ZXQuICBVc2UgdGhlIHN0YW5kYXJkIGF1dG9jb25mCi0gICMgdGVzdHMuICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBjb21waWxlciB3b3Jrcy4KLSAgQUNfUFJPR19DQ19XT1JLUwotICBBQ19SRVBMQUNFX0ZVTkNTKCRmdW5jcykKLQotICBjYXNlICIke2hvc3R9IiBpbgotICAqLSotaW50ZXJpeCkKLSAgICAjIE9uIEludGVyaXgsIGl0IHdyb25nbHkgY29uY2x1ZGVzIHRoYXQgdGhlIE1TVkMgY29tcGlsZXIgc3VwcG9ydHMgYWxsb2NhLgotICAgICMgKE1TVkMgZG9lcyBvbiBXaW4zMiwgbm90IG9uIEludGVyaXguKQotICAgICMgVGhpcyBzaG91bGQgYmUgdGVtcG9yYXJ5LgotCi0gICAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi0gICAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLSAgICBBTExPQ0E9YWxsb2NhLm8KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OIC0xCi1FT0YKLSAgICA7OwotICAqKQotICAgIEFDX0ZVTkNfQUxMT0NBCi0gICAgOzsKLSAgZXNhYwotCi0gIEFDX0ZVTkNfVkZPUksKLSAgaWYgdGVzdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyA9IG5vOyB0aGVuCi0gICAgTElCT0JKUz0iJExJQk9CSlMgdmZvcmsubyIKLSAgZmkKLSAgZm9yIHYgaW4gJHZhcnM7IGRvCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgJHZdKQotICAgIEFDX0NBQ0hFX1ZBTChsaWJpYmVydHlfY3ZfdmFyXyR2LAotICAgICAgW0FDX1RSWV9MSU5LKFtpbnQgKnA7XSwgW2V4dGVybiBpbnQgJHY7IHAgPSAmJHY7XSwKLQkJICAgW2V2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9eWVzIl0sCi0JCSAgIFtldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PW5vIl0pXSkKLSAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRsaWJpYmVydHlfY3ZfdmFyXyckdmBcIiA9IHllcyI7IHRoZW4KLSAgICAgIEFDX01TR19SRVNVTFQoeWVzKQotICAgICAgbj1IQVZFX2BlY2hvICR2IHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKCRuKQotICAgIGVsc2UKLSAgICAgIEFDX01TR19SRVNVTFQobm8pCi0gICAgZmkKLSAgZG9uZQotICBBQ19DSEVDS19GVU5DUygkY2hlY2tmdW5jcykKLWZpCi0KLSMgSW5zdGFsbCBhIGxpYnJhcnkgYnVpbHQgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIGluICQodG9vbGRpcikgcmF0aGVyCi0jIHRoYW4gJChsaWJkaXIpLgotaWYgdGVzdCAteiAiJHt3aXRoX2Nyb3NzX2hvc3R9IjsgdGhlbgotICBJTlNUQUxMX0RFU1Q9bGliZGlyCi1lbHNlCi0gIElOU1RBTExfREVTVD10b29sZGlyCi1maQotQUNfU1VCU1QoSU5TVEFMTF9ERVNUKQotCi0jIFdlIG5lZWQgbXVsdGlsaWIgc3VwcG9ydCwgYnV0IG9ubHkgaWYgY29uZmlndXJpbmcgZm9yIHRoZSB0YXJnZXQuCi1BQ19PVVRQVVQoTWFrZWZpbGUgdGVzdHN1aXRlL01ha2VmaWxlLAotW3Rlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotICBpZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0gICAgIyBGSVhNRTogV2Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IGFjX2ZpbGUKLSAgICBhY19maWxlPU1ha2VmaWxlCi0gICAgLiAke2xpYmliZXJ0eV90b3BkaXJ9L2NvbmZpZy1tbC5pbgotICBmaQotZmldLAotc3JjZGlyPSR7c3JjZGlyfQotaG9zdD0ke2hvc3R9Ci10YXJnZXQ9JHt0YXJnZXR9Ci13aXRoX3RhcmdldF9zdWJkaXI9JHt3aXRoX3RhcmdldF9zdWJkaXJ9Ci13aXRoX211bHRpc3ViZGlyPSR7d2l0aF9tdWx0aXN1YmRpcn0KLWFjX2NvbmZpZ3VyZV9hcmdzPSItLWVuYWJsZS1tdWx0aWxpYiAke2FjX2NvbmZpZ3VyZV9hcmdzfSIKLUNPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotbGliaWJlcnR5X3RvcGRpcj0ke2xpYmliZXJ0eV90b3BkaXJ9Ci0pCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29weXNpZ24uYyBiL2xpYmliZXJ0eS9jb3B5c2lnbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjVmOGMzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb3B5c2lnbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0jaWZkZWYgX19JRUVFX0JJR19FTkRJQU4KLQotdHlwZWRlZiB1bmlvbiAKLXsKLSAgZG91YmxlIHZhbHVlOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiAxMTsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOjQ7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24yOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjM6MTY7Ci0gICAgCi0gIH0gbnVtYmVyOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiAxMTsKLSAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjM7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24yOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjM6MTY7Ci0gIH0gbmFuOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nIG1zdzsKLSAgICB1bnNpZ25lZCBsb25nIGxzdzsKLSAgfSBwYXJ0czsKLSAgICBsb25nIGFzbG9uZ1syXTsKLX0gX19pZWVlX2RvdWJsZV9zaGFwZV90eXBlOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fSUVFRV9MSVRUTEVfRU5ESUFOCi0KLXR5cGVkZWYgdW5pb24gCi17Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0jaWZkZWYgX19TTUFMTF9CSVRGSUVMRFMKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24zOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjI6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOiA0OwotI2Vsc2UKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOjMyOwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6MjA7Ci0jZW5kaWYKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQgOjExOwotICAgIHVuc2lnbmVkIGludCBzaWduICAgICA6IDE7Ci0gIH0gbnVtYmVyOwotICBzdHJ1Y3QgCi0gIHsKLSNpZmRlZiBfX1NNQUxMX0JJVEZJRUxEUwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjM6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6MzsKLSNlbHNlCi0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMTozMjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjE5OwotI2VuZGlmCi0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiAxMTsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gIH0gbmFuOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nIGxzdzsKLSAgICB1bnNpZ25lZCBsb25nIG1zdzsKLSAgfSBwYXJ0czsKLQotICBsb25nIGFzbG9uZ1syXTsKLQotfSBfX2llZWVfZG91YmxlX3NoYXBlX3R5cGU7Ci0KLSNlbmRpZgotCi0jaWZkZWYgX19JRUVFX0JJR19FTkRJQU4KLXR5cGVkZWYgdW5pb24KLXsKLSAgZmxvYXQgdmFsdWU7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDg7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDogNzsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOiAxNjsKLSAgfSBudW1iZXI7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBzaWduOjE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7Ci0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDo2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7Ci0gIH0gbmFuOwotICBsb25nIHAxOwotICAKLX0gX19pZWVlX2Zsb2F0X3NoYXBlX3R5cGU7Ci0jZW5kaWYKLQotI2lmZGVmIF9fSUVFRV9MSVRUTEVfRU5ESUFOCi10eXBlZGVmIHVuaW9uCi17Ci0gIGZsb2F0IHZhbHVlOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOiA3OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6IDE2OwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogODsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gIH0gbnVtYmVyOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6NjsKLSAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6ODsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbjoxOwotICB9IG5hbjsKLSAgbG9uZyBwMTsKLSAgCi19IF9faWVlZV9mbG9hdF9zaGFwZV90eXBlOwotI2VuZGlmCi0KLQotZG91YmxlIERFRlVOKGNvcHlzaWduLCAoeCwgeSksIGRvdWJsZSB4IEFORCBkb3VibGUgeSkKLXsKLSAgX19pZWVlX2RvdWJsZV9zaGFwZV90eXBlIGEsYjsKLSAgYi52YWx1ZSA9IHk7ICAKLSAgYS52YWx1ZSA9IHg7Ci0gIGEubnVtYmVyLnNpZ24gPWIubnVtYmVyLnNpZ247Ci0gIHJldHVybiBhLnZhbHVlOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NwbHVzLWRlbS5jIGIvbGliaWJlcnR5L2NwbHVzLWRlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjI0OWQyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jcGx1cy1kZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ODkgKzAsMCBAQAotLyogRGVtYW5nbGVyIGZvciBHTlUgQysrCi0gICBDb3B5cmlnaHQgMTk4OSwgOTEsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSmFtZXMgQ2xhcmsgKGpqY0BqY2xhcmsudXVjcCkKLSAgIFJld3JpdHRlbiBieSBGcmVkIEZpc2ggKGZuZkBjeWdudXMuY29tKSBmb3IgQVJNIGFuZCBMdWNpZCBkZW1hbmdsaW5nCi0gICBNb2RpZmllZCBieSBTYXRpc2ggUGFpIChwYWlAYXBvbGxvLmhwLmNvbSkgZm9yIEhQIGRlbWFuZ2xpbmcKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM7IGNwbHVzX21hbmdsZV9vcG5hbWUgYW5kIGNwbHVzX2RlbWFuZ2xlLgotCi0gICBUaGlzIGZpbGUgaW1wb3J0cyB4bWFsbG9jIGFuZCB4cmVhbGxvYywgd2hpY2ggYXJlIGxpa2UgbWFsbG9jIGFuZAotICAgcmVhbGxvYyBleGNlcHQgdGhhdCB0aGV5IGdlbmVyYXRlIGEgZmF0YWwgZXJyb3IgaWYgdGhlcmUgaXMgbm8KLSAgIGF2YWlsYWJsZSBtZW1vcnkuICAqLwotCi0vKiBUaGlzIGZpbGUgbGl2ZXMgaW4gYm90aCBHQ0MgYW5kIGxpYmliZXJ0eS4gIFdoZW4gbWFraW5nIGNoYW5nZXMsIHBsZWFzZQotICAgdHJ5IG5vdCB0byBicmVhayBlaXRoZXIuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotY2hhciAqIG1hbGxvYyAoKTsKLWNoYXIgKiByZWFsbG9jICgpOwotI2VuZGlmCi0KLSNpbmNsdWRlIDxkZW1hbmdsZS5oPgotI3VuZGVmIENVUlJFTlRfREVNQU5HTElOR19TVFlMRQotI2RlZmluZSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUgd29yay0+b3B0aW9ucwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNkZWZpbmUgbWluKFgsWSkgKCgoWCkgPCAoWSkpID8gKFgpIDogKFkpKQotCi0vKiBBIHZhbHVlIGF0IGxlYXN0IG9uZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMKLSAgIHRoYXQgd2lsbCBiZSBvdXRwdXQgd2hlbiB1c2luZyB0aGUgYCVkJyBmb3JtYXQgd2l0aCBgcHJpbnRmJy4gICovCi0jZGVmaW5lIElOVEJVRl9TSVpFIDMyCi0KLWV4dGVybiB2b2lkIGZhbmN5X2Fib3J0IFBBUkFNUyAoKHZvaWQpKSBBVFRSSUJVVEVfTk9SRVRVUk47Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpteXN0cnN0ciBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1teXN0cnN0ciAoczEsIHMyKQotICAgICBjb25zdCBjaGFyICpzMSwgKnMyOwotewotICByZWdpc3RlciBjb25zdCBjaGFyICpwID0gczE7Ci0gIHJlZ2lzdGVyIGludCBsZW4gPSBzdHJsZW4gKHMyKTsKLQotICBmb3IgKDsgKHAgPSBzdHJjaHIgKHAsICpzMikpICE9IDA7IHArKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAocCwgczIsIGxlbikgPT0gMCkKLQl7Ci0JICByZXR1cm4gKHApOwotCX0KLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIEluIG9yZGVyIHRvIGFsbG93IGEgc2luZ2xlIGRlbWFuZ2xlciBleGVjdXRhYmxlIHRvIGRlbWFuZ2xlIHN0cmluZ3MKLSAgIHVzaW5nIHZhcmlvdXMgY29tbW9uIHZhbHVlcyBvZiBDUExVU19NQVJLRVIsIGFzIHdlbGwgYXMgYW55IHNwZWNpZmljCi0gICBvbmUgc2V0IGF0IGNvbXBpbGUgdGltZSwgd2UgbWFpbnRhaW4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlCi0gICBjb21tb25seSB1c2VkIG9uZXMsIGFuZCBjaGVjayB0byBzZWUgaWYgdGhlIG1hcmtlciB3ZSBhcmUgbG9va2luZyBmb3IKLSAgIGlzIGluIHRoYXQgc3RyaW5nLiAgQ1BMVVNfTUFSS0VSIGlzIHVzdWFsbHkgJyQnIG9uIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBhc3NlbWJsZXIgY2FuIGRlYWwgd2l0aCB0aGF0LiAgV2hlcmUgdGhlIGFzc2VtYmxlciBjYW4ndCwgaXQncyB1c3VhbGx5Ci0gICAnLicgKGJ1dCBvbiBtYW55IHN5c3RlbXMgJy4nIGlzIHVzZWQgZm9yIG90aGVyIHRoaW5ncykuICBXZSBwdXQgdGhlCi0gICBjdXJyZW50IGRlZmluZWQgQ1BMVVNfTUFSS0VSIGZpcnN0ICh3aGljaCBkZWZhdWx0cyB0byAnJCcpLCBmb2xsb3dlZAotICAgYnkgdGhlIG5leHQgbW9zdCBjb21tb24gdmFsdWUsIGZvbGxvd2VkIGJ5IGFuIGV4cGxpY2l0ICckJyBpbiBjYXNlCi0gICB0aGUgdmFsdWUgb2YgQ1BMVVNfTUFSS0VSIGlzIG5vdCAnJCcuCi0KLSAgIFdlIGNvdWxkIGF2b2lkIHRoaXMgaWYgd2UgY291bGQganVzdCBnZXQgZysrIHRvIHRlbGwgdXMgd2hhdCB0aGUgYWN0dWFsCi0gICBjcGx1cyBtYXJrZXIgY2hhcmFjdGVyIGlzIGFzIHBhcnQgb2YgdGhlIGRlYnVnIGluZm9ybWF0aW9uLCBwZXJoYXBzIGJ5Ci0gICBlbnN1cmluZyB0aGF0IGl0IGlzIHRoZSBjaGFyYWN0ZXIgdGhhdCB0ZXJtaW5hdGVzIHRoZSBnY2M8bj5fY29tcGlsZWQKLSAgIG1hcmtlciBzeW1ib2wgKEZJWE1FKS4gICovCi0KLSNpZiAhZGVmaW5lZCAoQ1BMVVNfTUFSS0VSKQotI2RlZmluZSBDUExVU19NQVJLRVIgJyQnCi0jZW5kaWYKLQotZW51bSBkZW1hbmdsaW5nX3N0eWxlcyBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBnbnVfZGVtYW5nbGluZzsKLQotc3RhdGljIGNoYXIgY3BsdXNfbWFya2Vyc1tdID0geyBDUExVU19NQVJLRVIsICcuJywgJyQnLCAnXDAnIH07Ci0KLXN0YXRpYyBjaGFyIGNoYXJfc3RyWzJdID0geyAnXDAwMCcsICdcMDAwJyB9OwotCi12b2lkCi1zZXRfY3BsdXNfbWFya2VyX2Zvcl9kZW1hbmdsaW5nIChjaCkKLSAgICAgaW50IGNoOwotewotICBjcGx1c19tYXJrZXJzWzBdID0gY2g7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHN0cmluZwkJLyogQmV3YXJlOiB0aGVzZSBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgKi8KLXsJCQkJLyogICdcMCcgdGVybWluYXRlZC4gICovCi0gIGNoYXIgKmI7CQkJLyogcG9pbnRlciB0byBzdGFydCBvZiBzdHJpbmcgKi8KLSAgY2hhciAqcDsJCQkvKiBwb2ludGVyIGFmdGVyIGxhc3QgY2hhcmFjdGVyICovCi0gIGNoYXIgKmU7CQkJLyogcG9pbnRlciBhZnRlciBlbmQgb2YgYWxsb2NhdGVkIHNwYWNlICovCi19IHN0cmluZzsKLQotLyogU3R1ZmYgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBzdWItcm91dGluZXMuCi0gICBVc2luZyBhIHNoYXJlZCBzdHJ1Y3R1cmUgYWxsb3dzIGNwbHVzX2RlbWFuZ2xlIHRvIGJlIHJlZW50cmFudC4gICovCi0KLXN0cnVjdCB3b3JrX3N0dWZmCi17Ci0gIGludCBvcHRpb25zOwotICBjaGFyICoqdHlwZXZlYzsKLSAgY2hhciAqKmt0eXBldmVjOwotICBjaGFyICoqYnR5cGV2ZWM7Ci0gIGludCBudW1rOwotICBpbnQgbnVtYjsKLSAgaW50IGtzaXplOwotICBpbnQgYnNpemU7Ci0gIGludCBudHlwZXM7Ci0gIGludCB0eXBldmVjX3NpemU7Ci0gIGludCBjb25zdHJ1Y3RvcjsKLSAgaW50IGRlc3RydWN0b3I7Ci0gIGludCBzdGF0aWNfdHlwZTsJLyogQSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uICovCi0gIGludCB0ZW1wX3N0YXJ0OyAgICAgICAvKiBpbmRleCBpbiBkZW1hbmdsZWQgdG8gc3RhcnQgb2YgdGVtcGxhdGUgYXJncyAqLwotICBpbnQgdHlwZV9xdWFsczsgICAgICAgLyogVGhlIHR5cGUgcXVhbGlmaWVycy4gICovCi0gIGludCBkbGxpbXBvcnRlZDsJLyogU3ltYm9sIGltcG9ydGVkIGZyb20gYSBQRSBETEwgKi8KLSAgY2hhciAqKnRtcGxfYXJndmVjOyAgIC8qIFRlbXBsYXRlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gKi8KLSAgaW50IG50bXBsX2FyZ3M7ICAgICAgIC8qIFRoZSBudW1iZXIgb2YgdGVtcGxhdGUgZnVuY3Rpb24gYXJndW1lbnRzLiAqLwotICBpbnQgZm9yZ2V0dGluZ190eXBlczsgLyogTm9uemVybyBpZiB3ZSBhcmUgbm90IHJlbWVtYmVyaW5nIHRoZSB0eXBlcwotCQkJICAgd2Ugc2VlLiAgKi8KLSAgc3RyaW5nKiBwcmV2aW91c19hcmd1bWVudDsgLyogVGhlIGxhc3QgZnVuY3Rpb24gYXJndW1lbnQgZGVtYW5nbGVkLiAgKi8KLSAgaW50IG5yZXBlYXRzOyAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBwcmV2aW91cwotCQkJICAgYXJndW1lbnQuICAqLwotfTsKLQotI2RlZmluZSBQUklOVF9BTlNJX1FVQUxJRklFUlMgKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfQU5TSSkKLSNkZWZpbmUgUFJJTlRfQVJHX1RZUEVTICAgICAgICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX1BBUkFNUykKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRhYmxlCi17Ci0gIGNvbnN0IGNoYXIgKmluOwotICBjb25zdCBjaGFyICpvdXQ7Ci0gIGludCBmbGFnczsKLX0gb3B0YWJsZVtdID0gewotICB7Im53IiwJICAiIG5ldyIsCURNR0xfQU5TSX0sCS8qIG5ldyAoMS45MiwJIGFuc2kpICovCi0gIHsiZGwiLAkgICIgZGVsZXRlIiwJRE1HTF9BTlNJfSwJLyogbmV3ICgxLjkyLAkgYW5zaSkgKi8KLSAgeyJuZXciLAkgICIgbmV3IiwJMH0sCQkvKiBvbGQgKDEuOTEsCSBhbmQgMS54KSAqLwotICB7ImRlbGV0ZSIsCSAgIiBkZWxldGUiLAkwfSwJCS8qIG9sZCAoMS45MSwJIGFuZCAxLngpICovCi0gIHsidm4iLAkgICIgbmV3IFtdIiwJRE1HTF9BTlNJfSwJLyogR05VLCBwZW5kaW5nIGFuc2kgKi8KLSAgeyJ2ZCIsCSAgIiBkZWxldGUgW10iLAlETUdMX0FOU0l9LAkvKiBHTlUsIHBlbmRpbmcgYW5zaSAqLwotICB7ImFzIiwJICAiPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsibmUiLAkgICIhPSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsIGFuc2kgKi8KLSAgeyJlcSIsCSAgIj09IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7ImdlIiwJICAiPj0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsiZ3QiLAkgICI+IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7ImxlIiwJICAiPD0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsibHQiLAkgICI8IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7InBsdXMiLAkgICIrIiwJCTB9LAkJLyogb2xkICovCi0gIHsicGwiLAkgICIrIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhcGwiLAkgICIrPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsibWludXMiLAkgICItIiwJCTB9LAkJLyogb2xkICovCi0gIHsibWkiLAkgICItIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbWkiLAkgICItPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsibXVsdCIsCSAgIioiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtbCIsCSAgIioiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFtdSIsCSAgIio9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKEFSTS9MdWNpZCkgKi8KLSAgeyJhbWwiLAkgICIqPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpIChHTlUvZysrKSAqLwotICB7ImNvbnZlcnQiLAkgICIrIiwJCTB9LAkJLyogb2xkICh1bmFyeSArKSAqLwotICB7Im5lZ2F0ZSIsCSAgIi0iLAkJMH0sCQkvKiBvbGQgKHVuYXJ5IC0pICovCi0gIHsidHJ1bmNfbW9kIiwJICAiJSIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1kIiwJICAiJSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW1kIiwJICAiJT0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InRydW5jX2RpdiIsCSAgIi8iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJkdiIsCSAgIi8iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFkdiIsCSAgIi89IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnV0aF9hbmRpZiIsICImJiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImFhIiwJICAiJiYiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InRydXRoX29yaWYiLCAgInx8IiwJCTB9LAkJLyogb2xkICovCi0gIHsib28iLAkgICJ8fCIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsidHJ1dGhfbm90IiwJICAiISIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im50IiwJICAiISIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsicG9zdGluY3JlbWVudCIsIisrIiwJMH0sCQkvKiBvbGQgKi8KLSAgeyJwcCIsCSAgIisrIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJwb3N0ZGVjcmVtZW50IiwiLS0iLAkwfSwJCS8qIG9sZCAqLwotICB7Im1tIiwJICAiLS0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImJpdF9pb3IiLAkgICJ8IiwJCTB9LAkJLyogb2xkICovCi0gIHsib3IiLAkgICJ8IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhb3IiLAkgICJ8PSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYml0X3hvciIsCSAgIl4iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJlciIsCSAgIl4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFlciIsCSAgIl49IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfYW5kIiwJICAiJiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImFkIiwJICAiJiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWFkIiwJICAiJj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImJpdF9ub3QiLAkgICJ+IiwJCTB9LAkJLyogb2xkICovCi0gIHsiY28iLAkgICJ+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJjYWxsIiwJICAiKCkiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJjbCIsCSAgIigpIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbHNoaWZ0IiwJICAiPDwiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJscyIsCSAgIjw8IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbHMiLAkgICI8PD0iLAlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYXJzaGlmdCIsCSAgIj4+IiwJCTB9LAkJLyogb2xkICovCi0gIHsicnMiLAkgICI+PiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYXJzIiwJICAiPj49IiwJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImNvbXBvbmVudCIsCSAgIi0+IiwJCTB9LAkJLyogb2xkICovCi0gIHsicHQiLAkgICItPiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpOyBMdWNpZCBDKysgZm9ybSAqLwotICB7InJmIiwJICAiLT4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaTsgQVJNL0dOVSBmb3JtICovCi0gIHsiaW5kaXJlY3QiLAkgICIqIiwJCTB9LAkJLyogb2xkICovCi0gIHsibWV0aG9kX2NhbGwiLCAgIi0+KCkiLAkwfSwJCS8qIG9sZCAqLwotICB7ImFkZHIiLAkgICImIiwJCTB9LAkJLyogb2xkICh1bmFyeSAmKSAqLwotICB7ImFycmF5IiwJICAiW10iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJ2YyIsCSAgIltdIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJjb21wb3VuZCIsCSAgIiwgIiwJCTB9LAkJLyogb2xkICovCi0gIHsiY20iLAkgICIsICIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY29uZCIsCSAgIj86IiwJCTB9LAkJLyogb2xkICovCi0gIHsiY24iLAkgICI/OiIsCQlETUdMX0FOU0l9LAkvKiBwc2V1ZG8tYW5zaSAqLwotICB7Im1heCIsCSAgIj4/IiwJCTB9LAkJLyogb2xkICovCi0gIHsibXgiLAkgICI+PyIsCQlETUdMX0FOU0l9LAkvKiBwc2V1ZG8tYW5zaSAqLwotICB7Im1pbiIsCSAgIjw/IiwJCTB9LAkJLyogb2xkICovCi0gIHsibW4iLAkgICI8PyIsCQlETUdMX0FOU0l9LAkvKiBwc2V1ZG8tYW5zaSAqLwotICB7Im5vcCIsCSAgIiIsCQkwfSwJCS8qIG9sZCAoZm9yIG9wZXJhdG9yPSkgKi8KLSAgeyJybSIsCSAgIi0+KiIsCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJzeiIsICAgICAgICAgICJzaXplb2YgIiwgICAgRE1HTF9BTlNJfSAgICAgIC8qIHBzZXVkby1hbnNpICovCi19OwotCi0vKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHZhcmlvdXMgdHlwZSB2YXJpZXRpZXMuCi0gICBUaGV5IGFyZSBhbGwgbm9uLXplcm8gc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFzIGBzdWNjZXNzJwotICAgdmFsdWVzLiAgKi8KLXR5cGVkZWYgZW51bSB0eXBlX2tpbmRfdAotewotICB0a19ub25lLAotICB0a19wb2ludGVyLAotICB0a19yZWZlcmVuY2UsCi0gIHRrX2ludGVncmFsLAotICB0a19ib29sLAotICB0a19jaGFyLAotICB0a19yZWFsCi19IHR5cGVfa2luZF90OwotCi0jZGVmaW5lIFNUUklOR19FTVBUWShzdHIpCSgoc3RyKSAtPiBiID09IChzdHIpIC0+IHApCi0jZGVmaW5lIFBSRVBFTkRfQkxBTksoc3RyKQl7aWYgKCFTVFJJTkdfRU1QVFkoc3RyKSkgXAotICAgIHN0cmluZ19wcmVwZW5kKHN0ciwgIiAiKTt9Ci0jZGVmaW5lIEFQUEVORF9CTEFOSyhzdHIpCXtpZiAoIVNUUklOR19FTVBUWShzdHIpKSBcCi0gICAgc3RyaW5nX2FwcGVuZChzdHIsICIgIik7fQotI2RlZmluZSBMRU5fU1RSSU5HKHN0cikgICAgICAgICAoIChTVFJJTkdfRU1QVFkoc3RyKSk/MDooKHN0ciktPnAgLSAoc3RyKS0+YikpCi0KLS8qIFRoZSBzY29wZSBzZXBhcmF0b3IgYXBwcm9wcmlhdGUgZm9yIHRoZSBsYW5ndWFnZSBiZWluZyBkZW1hbmdsZWQuICAqLwotCi0jZGVmaW5lIFNDT1BFX1NUUklORyh3b3JrKSAoKHdvcmstPm9wdGlvbnMgJiBETUdMX0pBVkEpID8gIi4iIDogIjo6IikKLQotI2RlZmluZSBBUk1fVlRBQkxFX1NUUklORyAiX192dGJsX18iCS8qIEx1Y2lkL0FSTSB2aXJ0dWFsIHRhYmxlIHByZWZpeCAqLwotI2RlZmluZSBBUk1fVlRBQkxFX1NUUkxFTiA4CQkvKiBzdHJsZW4gKEFSTV9WVEFCTEVfU1RSSU5HKSAqLwotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGNoYXIgKgotbW9wX3VwIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIHN0cmluZyAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXNxdWFuZ2xlX21vcF91cCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7Ci0KLSNpZiAwCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9tZXRob2RfYXJncyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICoKLWludGVybmFsX2NwbHVzX2RlbWFuZ2xlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLAotCQkJCQkgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqLAotCQkJICAgc3RyaW5nICosIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWFybV9wdCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKiwKLQkJY29uc3QgY2hhciAqKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9jbGFzc19uYW1lIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3F1YWxpZmllZCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwKLQkJCSAgICBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9jbGFzcyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9mdW5kX3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfc2lnbmF0dXJlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3ByZWZpeCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1nbnVfc3BlY2lhbCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1hcm1fc3BlY2lhbCBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX25lZWQgUEFSQU1TICgoc3RyaW5nICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2RlbGV0ZSBQQVJBTVMgKChzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2luaXQgUEFSQU1TICgoc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19jbGVhciBQQVJBTVMgKChzdHJpbmcgKikpOwotCi0jaWYgMAotc3RhdGljIGludAotc3RyaW5nX2VtcHR5IFBBUkFNUyAoKHN0cmluZyAqKSk7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmQgUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZHMgUEFSQU1TICgoc3RyaW5nICosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kbiBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kbiBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRfdGVtcGxhdGVfaWR4IFBBUkFNUyAoKHN0cmluZyAqLCBpbnQpKTsKLQotc3RhdGljIGludAotZ2V0X2NvdW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIGludCAqKSk7Ci0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnQgUEFSQU1TICgoY29uc3QgY2hhciAqKikpOwotCi1zdGF0aWMgaW50Ci1jb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgUEFSQU1TICgoY29uc3QgY2hhcioqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2FyZ3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfbmVzdGVkX2FyZ3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYqLCBjb25zdCBjaGFyKiosIHN0cmluZyopKTsKLQotc3RhdGljIGludAotZG9fdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kb19hcmcgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLWRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICosCi0JCQkJY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl90eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9CdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLXJlZ2lzdGVyX0J0eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0t0eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1mb3JnZXRfdHlwZXMgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOwotCi1zdGF0aWMgdm9pZAotZm9yZ2V0X0JfYW5kX0tfdHlwZXMgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmRzIFBBUkFNUyAoKHN0cmluZyAqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmKiwgY29uc3QgY2hhcioqLAotCQkJCSAgICAgIHN0cmluZyosIHR5cGVfa2luZF90KSk7Ci0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotc25hcmZfbnVtZXJpY19saXRlcmFsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLS8qIFRoZXJlIGlzIGEgVFlQRV9RVUFMIHZhbHVlIGZvciBlYWNoIHR5cGUgcXVhbGlmaWVyLiAgVGhleSBjYW4gYmUKLSAgIGNvbWJpbmVkIGJ5IGJpdHdpc2Utb3IgdG8gZm9ybSB0aGUgY29tcGxldGUgc2V0IG9mIHF1YWxpZmllcnMgZm9yIGEKLSAgIHR5cGUuICAqLwotCi0jZGVmaW5lIFRZUEVfVU5RVUFMSUZJRUQgICAweDAKLSNkZWZpbmUgVFlQRV9RVUFMX0NPTlNUICAgIDB4MQotI2RlZmluZSBUWVBFX1FVQUxfVk9MQVRJTEUgMHgyCi0jZGVmaW5lIFRZUEVfUVVBTF9SRVNUUklDVCAweDQKLQotc3RhdGljIGludAotY29kZV9mb3JfcXVhbGlmaWVyIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgY29uc3QgY2hhcioKLXF1YWxpZmllcl9zdHJpbmcgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotZGVtYW5nbGVfcXVhbGlmaWVyIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9leHByZXNzaW9uIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqLCAKLQkJCSAgICAgdHlwZV9raW5kX3QpKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwKLQkJCQkgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfcmVhbF92YWx1ZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIGludCwKLQkJCQkgIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWN1cnNpdmVseV9kZW1hbmdsZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwKLQkJCSAgICAgIGludCkpOwotCi0vKiBUcmFuc2xhdGUgY291bnQgdG8gaW50ZWdlciwgY29uc3VtaW5nIHRva2VucyBpbiB0aGUgcHJvY2Vzcy4KLSAgIENvbnZlcnNpb24gdGVybWluYXRlcyBvbiB0aGUgZmlyc3Qgbm9uLWRpZ2l0IGNoYXJhY3Rlci4KLQotICAgVHJ5aW5nIHRvIGNvbnN1bWUgc29tZXRoaW5nIHRoYXQgaXNuJ3QgYSBjb3VudCByZXN1bHRzIGluIG5vCi0gICBjb25zdW1wdGlvbiBvZiBpbnB1dCBhbmQgYSByZXR1cm4gb2YgLTEuCi0KLSAgIE92ZXJmbG93IGNvbnN1bWVzIHRoZSByZXN0IG9mIHRoZSBkaWdpdHMsIGFuZCByZXR1cm5zIC0xLiAgKi8KLQotc3RhdGljIGludAotY29uc3VtZV9jb3VudCAodHlwZSkKLSAgICAgY29uc3QgY2hhciAqKnR5cGU7Ci17Ci0gIGludCBjb3VudCA9IDA7Ci0KLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0gICAgewotICAgICAgY291bnQgKj0gMTA7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdy4KLQkgV2UgYXNzdW1lIHRoYXQgY291bnQgaXMgcmVwcmVzZW50ZWQgdXNpbmcgdHdvJ3MtY29tcGxlbWVudDsKLQkgbm8gcG93ZXIgb2YgdHdvIGlzIGRpdmlzaWJsZSBieSB0ZW4sIHNvIGlmIGFuIG92ZXJmbG93IG9jY3VycwotCSB3aGVuIG11bHRpcGx5aW5nIGJ5IHRlbiwgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBhIG11bHRpcGxlIG9mCi0JIHRlbi4gICovCi0gICAgICBpZiAoKGNvdW50ICUgMTApICE9IDApCi0JewotCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnR5cGUpKQotCSAgICAoKnR5cGUpKys7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBjb3VudCArPSAqKnR5cGUgLSAnMCc7Ci0gICAgICAoKnR5cGUpKys7Ci0gICAgfQotCi0gIHJldHVybiAoY291bnQpOwotfQotCi0KLS8qIExpa2UgY29uc3VtZV9jb3VudCwgYnV0IGZvciBjb3VudHMgdGhhdCBhcmUgcHJlY2VkZWQgYW5kIGZvbGxvd2VkCi0gICBieSAnXycgaWYgdGhleSBhcmUgZ3JlYXRlciB0aGFuIDEwLiAgQWxzbywgLTEgaXMgcmV0dXJuZWQgZm9yCi0gICBmYWlsdXJlLCBzaW5jZSAwIGNhbiBiZSBhIHZhbGlkIHZhbHVlLiAgKi8KLQotc3RhdGljIGludAotY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKQotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLXsKLSAgaW50IGlkeDsKLQotICBpZiAoKiptYW5nbGVkID09ICdfJykKLSAgICB7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JcmV0dXJuIC0xOwotCi0gICAgICBpZHggPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCS8qIFRoZSB0cmFpbGluZyB1bmRlcnNjb3JlIHdhcyBtaXNzaW5nLiAqLwotCXJldHVybiAtMTsKLQotICAgICAgKCptYW5nbGVkKSsrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgqKm1hbmdsZWQgPCAnMCcgfHwgKiptYW5nbGVkID4gJzknKQotCXJldHVybiAtMTsKLQotICAgICAgaWR4ID0gKiptYW5nbGVkIC0gJzAnOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBDIGlzIHRoZSBjb2RlIGZvciBhIHR5cGUtcXVhbGlmaWVyLiAgUmV0dXJuIHRoZSBUWVBFX1FVQUwKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBxdWFsaWZpZXIuICAqLwotCi1zdGF0aWMgaW50Ci1jb2RlX2Zvcl9xdWFsaWZpZXIgKGMpCi0gIGludCBjOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ0MnOgotICAgICAgcmV0dXJuIFRZUEVfUVVBTF9DT05TVDsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgcmV0dXJuIFRZUEVfUVVBTF9WT0xBVElMRTsKLQotICAgIGNhc2UgJ3UnOgotICAgICAgcmV0dXJuIFRZUEVfUVVBTF9SRVNUUklDVDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogQyB3YXMgYW4gaW52YWxpZCBxdWFsaWZpZXIuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogUmV0dXJuIHRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgcXVhbGlmaWVycyBnaXZlbiBieQotICAgVFlQRV9RVUFMUy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyKgotcXVhbGlmaWVyX3N0cmluZyAodHlwZV9xdWFscykKLSAgICAgaW50IHR5cGVfcXVhbHM7Ci17Ci0gIHN3aXRjaCAodHlwZV9xdWFscykKLSAgICB7Ci0gICAgY2FzZSBUWVBFX1VOUVVBTElGSUVEOgotICAgICAgcmV0dXJuICIiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfQ09OU1Q6Ci0gICAgICByZXR1cm4gImNvbnN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX1ZPTEFUSUxFOgotICAgICAgcmV0dXJuICJ2b2xhdGlsZSI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9SRVNUUklDVDoKLSAgICAgIHJldHVybiAiX19yZXN0cmljdCI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9DT05TVCB8IFRZUEVfUVVBTF9WT0xBVElMRToKLSAgICAgIHJldHVybiAiY29uc3Qgdm9sYXRpbGUiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfQ09OU1QgfCBUWVBFX1FVQUxfUkVTVFJJQ1Q6Ci0gICAgICByZXR1cm4gImNvbnN0IF9fcmVzdHJpY3QiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfVk9MQVRJTEUgfCBUWVBFX1FVQUxfUkVTVFJJQ1Q6Ci0gICAgICByZXR1cm4gInZvbGF0aWxlIF9fcmVzdHJpY3QiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfQ09OU1QgfCBUWVBFX1FVQUxfVk9MQVRJTEUgfCBUWVBFX1FVQUxfUkVTVFJJQ1Q6Ci0gICAgICByZXR1cm4gImNvbnN0IHZvbGF0aWxlIF9fcmVzdHJpY3QiOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBUWVBFX1FVQUxTIHdhcyBhbiBpbnZhbGlkIHF1YWxpZmllciBzZXQuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogQyBpcyB0aGUgY29kZSBmb3IgYSB0eXBlLXF1YWxpZmllci4gIFJldHVybiB0aGUgc3RyaW5nCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcXVhbGlmaWVyLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZQotICAgY2FsbGVkIHdpdGggYSB2YWxpZCBxdWFsaWZpZXIgY29kZS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyKgotZGVtYW5nbGVfcXVhbGlmaWVyIChjKQotICBpbnQgYzsKLXsKLSAgcmV0dXJuIHF1YWxpZmllcl9zdHJpbmcgKGNvZGVfZm9yX3F1YWxpZmllciAoYykpOwotfQotCi1pbnQKLWNwbHVzX2RlbWFuZ2xlX29wbmFtZSAob3BuYW1lLCByZXN1bHQsIG9wdGlvbnMpCi0gICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLSAgICAgY2hhciAqcmVzdWx0OwotICAgICBpbnQgb3B0aW9uczsKLXsKLSAgaW50IGxlbiwgbGVuMSwgcmV0OwotICBzdHJpbmcgdHlwZTsKLSAgc3RydWN0IHdvcmtfc3R1ZmYgd29ya1sxXTsKLSAgY29uc3QgY2hhciAqdGVtOwotCi0gIGxlbiA9IHN0cmxlbihvcG5hbWUpOwotICByZXN1bHRbMF0gPSAnXDAnOwotICByZXQgPSAwOwotICBtZW1zZXQgKChjaGFyICopIHdvcmssIDAsIHNpemVvZiAod29yaykpOwotICB3b3JrLT5vcHRpb25zID0gb3B0aW9uczsKLQotICBpZiAob3BuYW1lWzBdID09ICdfJyAmJiBvcG5hbWVbMV0gPT0gJ18nCi0gICAgICAmJiBvcG5hbWVbMl0gPT0gJ28nICYmIG9wbmFtZVszXSA9PSAncCcpCi0gICAgewotICAgICAgLyogQU5TSS4gICovCi0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLwotICAgICAgdGVtID0gb3BuYW1lICsgNDsKLSAgICAgIGlmIChkb190eXBlICh3b3JrLCAmdGVtLCAmdHlwZSkpCi0JewotCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciAiKTsKLQkgIHN0cm5jYXQgKHJlc3VsdCwgdHlwZS5iLCB0eXBlLnAgLSB0eXBlLmIpOwotCSAgc3RyaW5nX2RlbGV0ZSAoJnR5cGUpOwotCSAgcmV0ID0gMTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChvcG5hbWVbMF0gPT0gJ18nICYmIG9wbmFtZVsxXSA9PSAnXycKLQkgICAmJiBvcG5hbWVbMl0gPj0gJ2EnICYmIG9wbmFtZVsyXSA8PSAneicKLQkgICAmJiBvcG5hbWVbM10gPj0gJ2EnICYmIG9wbmFtZVszXSA8PSAneicpCi0gICAgewotICAgICAgaWYgKG9wbmFtZVs0XSA9PSAnXDAnKQotCXsKLQkgIC8qIE9wZXJhdG9yLiAgKi8KLQkgIHNpemVfdCBpOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAyCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAyLCAyKSA9PSAwKQotCQl7Ci0JCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciIpOwotCQkgIHN0cmNhdCAocmVzdWx0LCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgcmV0ID0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChvcG5hbWVbMl0gPT0gJ2EnICYmIG9wbmFtZVs1XSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogQXNzaWdubWVudC4gICovCi0JICAgICAgc2l6ZV90IGk7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JCXsKLQkJICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAzCi0JCSAgICAgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMiwgMykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciIpOwotCQkgICAgICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgICAgICByZXQgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobGVuID49IDMKLQkgICAmJiBvcG5hbWVbMF0gPT0gJ28nCi0JICAgJiYgb3BuYW1lWzFdID09ICdwJwotCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2Vycywgb3BuYW1lWzJdKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHNlZSBpZiBpdCdzIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiAqLwotICAgICAgaWYgKGxlbiA+PSAxMCAvKiBvcCRhc3NpZ25fICovCi0JICAmJiBtZW1jbXAgKG9wbmFtZSArIDMsICJhc3NpZ25fIiwgNykgPT0gMCkKLQl7Ci0JICBzaXplX3QgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgbGVuMSA9IGxlbiAtIDEwOwotCSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IGxlbjEKLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDEwLCBsZW4xKSA9PSAwKQotCQl7Ci0JCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciIpOwotCQkgIHN0cmNhdCAocmVzdWx0LCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgc3RyY2F0IChyZXN1bHQsICI9Iik7Ci0JCSAgcmV0ID0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNpemVfdCBpOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBsZW4xID0gbGVuIC0gMzsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4xCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAzLCBsZW4xKSA9PSAwKQotCQl7Ci0JCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciIpOwotCQkgIHN0cmNhdCAocmVzdWx0LCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgcmV0ID0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobGVuID49IDUgJiYgbWVtY21wIChvcG5hbWUsICJ0eXBlIiwgNCkgPT0gMAotCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2Vycywgb3BuYW1lWzRdKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciAqLwotICAgICAgdGVtID0gb3BuYW1lICsgNTsKLSAgICAgIGlmIChkb190eXBlICh3b3JrLCAmdGVtLCAmdHlwZSkpCi0JewotCSAgc3RyY2F0IChyZXN1bHQsICJvcGVyYXRvciAiKTsKLQkgIHN0cm5jYXQgKHJlc3VsdCwgdHlwZS5iLCB0eXBlLnAgLSB0eXBlLmIpOwotCSAgc3RyaW5nX2RlbGV0ZSAoJnR5cGUpOwotCSAgcmV0ID0gMTsKLQl9Ci0gICAgfQotICBzcXVhbmdsZV9tb3BfdXAgKHdvcmspOwotICByZXR1cm4gcmV0OwotCi19Ci0vKiBUYWtlcyBvcGVyYXRvciBuYW1lIGFzIGUuZy4gIisrIiBhbmQgcmV0dXJucyBtYW5nbGVkCi0gICBvcGVyYXRvciBuYW1lIChlLmcuICJwb3N0aW5jcmVtZW50X2V4cHIiKSwgb3IgTlVMTCBpZiBub3QgZm91bmQuCi0KLSAgIElmIE9QVElPTlMgJiBETUdMX0FOU0kgPT0gMSwgcmV0dXJuIHRoZSBBTlNJIG5hbWU7Ci0gICBpZiBPUFRJT05TICYgRE1HTF9BTlNJID09IDAsIHJldHVybiB0aGUgb2xkIEdOVSBuYW1lLiAgKi8KLQotY29uc3QgY2hhciAqCi1jcGx1c19tYW5nbGVfb3BuYW1lIChvcG5hbWUsIG9wdGlvbnMpCi0gICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLSAgICAgaW50IG9wdGlvbnM7Ci17Ci0gIHNpemVfdCBpOwotICBpbnQgbGVuOwotCi0gIGxlbiA9IHN0cmxlbiAob3BuYW1lKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0gICAgewotICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5vdXQpID09IGxlbgotCSAgJiYgKG9wdGlvbnMgJiBETUdMX0FOU0kpID09IChvcHRhYmxlW2ldLmZsYWdzICYgRE1HTF9BTlNJKQotCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLm91dCwgb3BuYW1lLCBsZW4pID09IDApCi0JcmV0dXJuIG9wdGFibGVbaV0uaW47Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0vKiBjaGFyICpjcGx1c19kZW1hbmdsZSAoY29uc3QgY2hhciAqbWFuZ2xlZCwgaW50IG9wdGlvbnMpCi0KLSAgIElmIE1BTkdMRUQgaXMgYSBtYW5nbGVkIGZ1bmN0aW9uIG5hbWUgcHJvZHVjZWQgYnkgR05VIEMrKywgdGhlbgotICAgYSBwb2ludGVyIHRvIGEgbWFsbG9jZWQgc3RyaW5nIGdpdmluZyBhIEMrKyByZXByZXNlbnRhdGlvbgotICAgb2YgdGhlIG5hbWUgd2lsbCBiZSByZXR1cm5lZDsgb3RoZXJ3aXNlIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KLSAgIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSBzdHJpbmcgd2hpY2gKLSAgIGlzIHJldHVybmVkLgotCi0gICBUaGUgT1BUSU9OUyBhcmcgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBiaXRzOgotCi0gICAJRE1HTF9BTlNJCUFOU0kgcXVhbGlmaWVycyBzdWNoIGFzIGBjb25zdCcgYW5kIGB2b2lkJyBhcmUKLQkJCWluY2x1ZGVkLgotCURNR0xfUEFSQU1TCUZ1bmN0aW9uIHBhcmFtZXRlcnMgYXJlIGluY2x1ZGVkLgotCi0gICBGb3IgZXhhbXBsZSwKLQotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBaSIsIERNR0xfUEFSQU1TKQkJPT4gIkE6OmZvbyhpbnQpIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBaSIsIERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJKQk9PiAiQTo6Zm9vKGludCkiCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFpIiwgMCkJCQk9PiAiQTo6Zm9vIgotCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFmZSIsIERNR0xfUEFSQU1TKQkJPT4gIkE6OmZvbyhmbG9hdCwuLi4pIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBZmUiLCBETUdMX1BBUkFNUyB8IERNR0xfQU5TSSk9PiAiQTo6Zm9vKGZsb2F0LC4uLikiCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFmZSIsIDApCQkJPT4gIkE6OmZvbyIKLQotICAgTm90ZSB0aGF0IGFueSBsZWFkaW5nIHVuZGVyc2NvcmVzLCBvciBvdGhlciBzdWNoIGNoYXJhY3RlcnMgcHJlcGVuZGVkIGJ5Ci0gICB0aGUgY29tcGlsYXRpb24gc3lzdGVtLCBhcmUgcHJlc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc3RyaXBwZWQgZnJvbQotICAgTUFOR0xFRC4gICovCi0KLWNoYXIgKgotY3BsdXNfZGVtYW5nbGUgKG1hbmdsZWQsIG9wdGlvbnMpCi0gICAgIGNvbnN0IGNoYXIgKm1hbmdsZWQ7Ci0gICAgIGludCBvcHRpb25zOwotewotICBjaGFyICpyZXQ7Ci0gIHN0cnVjdCB3b3JrX3N0dWZmIHdvcmtbMV07Ci0gIG1lbXNldCAoKGNoYXIgKikgd29yaywgMCwgc2l6ZW9mICh3b3JrKSk7Ci0gIHdvcmsgLT4gb3B0aW9ucyA9IG9wdGlvbnM7Ci0gIGlmICgod29yayAtPiBvcHRpb25zICYgRE1HTF9TVFlMRV9NQVNLKSA9PSAwKQotICAgIHdvcmsgLT4gb3B0aW9ucyB8PSAoaW50KSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgJiBETUdMX1NUWUxFX01BU0s7Ci0KLSAgcmV0ID0gaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgKHdvcmssIG1hbmdsZWQpOwotICBzcXVhbmdsZV9tb3BfdXAgKHdvcmspOwotICByZXR1cm4gKHJldCk7Ci19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBtb3N0IG9mIHdoYXQgY3BsdXNfZGVtYW5nbGUgdXNlIHRvIGRvLCBidXQKLSAgIHRvIGJlIGFibGUgdG8gZGVtYW5nbGUgYSBuYW1lIHdpdGggYSBCLCBLIG9yIG4gY29kZSwgd2UgbmVlZCB0bwotICAgaGF2ZSBhIGxvbmdlciB0ZXJtIG1lbW9yeSBvZiB3aGF0IHR5cGVzIGhhdmUgYmVlbiBzZWVuLiBUaGUgb3JpZ2luYWwKLSAgIG5vdyBpbnRpYWxpemVzIGFuZCBjbGVhbnMgdXAgdGhlIHNxdWFuZ2xlIGNvZGUgaW5mbywgd2hpbGUgaW50ZXJuYWwKLSAgIGNhbGxzIGdvIGRpcmVjdGx5IHRvIHRoaXMgcm91dGluZSB0byBhdm9pZCByZXNldHRpbmcgdGhhdCBpbmZvLiAqLwotCi1zdGF0aWMgY2hhciAqCi1pbnRlcm5hbF9jcGx1c19kZW1hbmdsZSAod29yaywgbWFuZ2xlZCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKm1hbmdsZWQ7Ci17Ci0KLSAgc3RyaW5nIGRlY2w7Ci0gIGludCBzdWNjZXNzID0gMDsKLSAgY2hhciAqZGVtYW5nbGVkID0gTlVMTDsKLSAgaW50IHMxLHMyLHMzLHM0OwotICBzMSA9IHdvcmstPmNvbnN0cnVjdG9yOwotICBzMiA9IHdvcmstPmRlc3RydWN0b3I7Ci0gIHMzID0gd29yay0+c3RhdGljX3R5cGU7Ci0gIHM0ID0gd29yay0+dHlwZV9xdWFsczsKLSAgd29yay0+Y29uc3RydWN0b3IgPSB3b3JrLT5kZXN0cnVjdG9yID0gMDsKLSAgd29yay0+dHlwZV9xdWFscyA9IFRZUEVfVU5RVUFMSUZJRUQ7Ci0gIHdvcmstPmRsbGltcG9ydGVkID0gMDsKLQotICBpZiAoKG1hbmdsZWQgIT0gTlVMTCkgJiYgKCptYW5nbGVkICE9ICdcMCcpKQotICAgIHsKLSAgICAgIHN0cmluZ19pbml0ICgmZGVjbCk7Ci0KLSAgICAgIC8qIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBnbnUgc3R5bGUgZGVtYW5nbGluZyBpcyBhY3RpdmUgYW5kIGlmIHRoZQotCSBzdHJpbmcgdG8gYmUgZGVtYW5nbGVkIGNvbnRhaW5zIGEgQ1BMVVNfTUFSS0VSLiAgSWYgc28sIGF0dGVtcHQgdG8KLQkgcmVjb2duaXplIG9uZSBvZiB0aGUgZ251IHNwZWNpYWwgZm9ybXMgcmF0aGVyIHRoYW4gbG9va2luZyBmb3IgYQotCSBzdGFuZGFyZCBwcmVmaXguICBJbiBwYXJ0aWN1bGFyLCBkb24ndCB3b3JyeSBhYm91dCB3aGV0aGVyIHRoZXJlCi0JIGlzIGEgIl9fIiBzdHJpbmcgaW4gdGhlIG1hbmdsZWQgc3RyaW5nLiAgQ29uc2lkZXIgIl8kXzVfX2ZvbyIgZm9yCi0JIGV4YW1wbGUuICAqLwotCi0gICAgICBpZiAoKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykpCi0JewotCSAgc3VjY2VzcyA9IGdudV9zcGVjaWFsICh3b3JrLCAmbWFuZ2xlZCwgJmRlY2wpOwotCX0KLSAgICAgIGlmICghc3VjY2VzcykKLQl7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfcHJlZml4ICh3b3JrLCAmbWFuZ2xlZCwgJmRlY2wpOwotCX0KLSAgICAgIGlmIChzdWNjZXNzICYmICgqbWFuZ2xlZCAhPSAnXDAnKSkKLQl7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfc2lnbmF0dXJlICh3b3JrLCAmbWFuZ2xlZCwgJmRlY2wpOwotCX0KLSAgICAgIGlmICh3b3JrLT5jb25zdHJ1Y3RvciA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiZ2xvYmFsIGNvbnN0cnVjdG9ycyBrZXllZCB0byAiKTsKLSAgICAgICAgICB3b3JrLT5jb25zdHJ1Y3RvciA9IDA7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHdvcmstPmRlc3RydWN0b3IgPT0gMikKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgImdsb2JhbCBkZXN0cnVjdG9ycyBrZXllZCB0byAiKTsKLSAgICAgICAgICB3b3JrLT5kZXN0cnVjdG9yID0gMDsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAod29yay0+ZGxsaW1wb3J0ZWQgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgImltcG9ydCBzdHViIGZvciAiKTsKLSAgICAgICAgICB3b3JrLT5kbGxpbXBvcnRlZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgIGRlbWFuZ2xlZCA9IG1vcF91cCAod29yaywgJmRlY2wsIHN1Y2Nlc3MpOwotICAgIH0KLSAgd29yay0+Y29uc3RydWN0b3IgPSBzMTsKLSAgd29yay0+ZGVzdHJ1Y3RvciA9IHMyOwotICB3b3JrLT5zdGF0aWNfdHlwZSA9IHMzOwotICB3b3JrLT50eXBlX3F1YWxzID0gczQ7Ci0gIHJldHVybiAoZGVtYW5nbGVkKTsKLX0KLQotCi0vKiBDbGVhciBvdXQgYW5kIHNxdWFuZ2xpbmcgcmVsYXRlZCBzdG9yYWdlICovCi1zdGF0aWMgdm9pZAotc3F1YW5nbGVfbW9wX3VwICh3b3JrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLXsKLSAgLyogY2xlYW4gdXAgdGhlIEIgYW5kIEsgdHlwZSBtYW5nbGluZyB0eXBlcy4gKi8KLSAgZm9yZ2V0X0JfYW5kX0tfdHlwZXMgKHdvcmspOwotICBpZiAod29yayAtPiBidHlwZXZlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKChjaGFyICopIHdvcmsgLT4gYnR5cGV2ZWMpOwotICAgIH0KLSAgaWYgKHdvcmsgLT4ga3R5cGV2ZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICgoY2hhciAqKSB3b3JrIC0+IGt0eXBldmVjKTsKLSAgICB9Ci19Ci0KLS8qIENsZWFyIG91dCBhbnkgbWFuZ2xlZCBzdG9yYWdlICovCi0KLXN0YXRpYyBjaGFyICoKLW1vcF91cCAod29yaywgZGVjbHAsIHN1Y2Nlc3MpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBzdHJpbmcgKmRlY2xwOwotICAgICBpbnQgc3VjY2VzczsKLXsKLSAgY2hhciAqZGVtYW5nbGVkID0gTlVMTDsKLQotICAvKiBEaXNjYXJkIHRoZSByZW1lbWJlcmVkIHR5cGVzLCBpZiBhbnkuICAqLwotCi0gIGZvcmdldF90eXBlcyAod29yayk7Ci0gIGlmICh3b3JrIC0+IHR5cGV2ZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICgoY2hhciAqKSB3b3JrIC0+IHR5cGV2ZWMpOwotICAgICAgd29yayAtPiB0eXBldmVjID0gTlVMTDsKLSAgICAgIHdvcmsgLT4gdHlwZXZlY19zaXplID0gMDsKLSAgICB9Ci0gIGlmICh3b3JrLT50bXBsX2FyZ3ZlYykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IHdvcmstPm50bXBsX2FyZ3M7IGkrKykKLQlpZiAod29yay0+dG1wbF9hcmd2ZWNbaV0pCi0JICBmcmVlICgoY2hhciopIHdvcmstPnRtcGxfYXJndmVjW2ldKTsKLQotICAgICAgZnJlZSAoKGNoYXIqKSB3b3JrLT50bXBsX2FyZ3ZlYyk7Ci0gICAgICB3b3JrLT50bXBsX2FyZ3ZlYyA9IE5VTEw7Ci0gICAgfQotICBpZiAod29yay0+cHJldmlvdXNfYXJndW1lbnQpCi0gICAgewotICAgICAgc3RyaW5nX2RlbGV0ZSAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgICAgZnJlZSAoKGNoYXIqKSB3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgICB3b3JrLT5wcmV2aW91c19hcmd1bWVudCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIGRlbWFuZ2xpbmcgd2FzIHN1Y2Nlc3NmdWwsIGVuc3VyZSB0aGF0IHRoZSBkZW1hbmdsZWQgc3RyaW5nIGlzIG51bGwKLSAgICAgdGVybWluYXRlZCBhbmQgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCBmcmVlIHRoZSBkZW1hbmdsaW5nIGRlY2wuICAqLwotCi0gIGlmICghc3VjY2VzcykKLSAgICB7Ci0gICAgICBzdHJpbmdfZGVsZXRlIChkZWNscCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAiIiwgMSk7Ci0gICAgICBkZW1hbmdsZWQgPSBkZWNscCAtPiBiOwotICAgIH0KLSAgcmV0dXJuIChkZW1hbmdsZWQpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZGVtYW5nbGVfc2lnbmF0dXJlIC0tIGRlbWFuZ2xlIHRoZSBzaWduYXR1cmUgcGFydCBvZiBhIG1hbmdsZWQgbmFtZQotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWRlbWFuZ2xlX3NpZ25hdHVyZSAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkJICAgIHN0cmluZyAqZGVjbHApOwotCi1ERVNDUklQVElPTgotCi0JQ29uc3VtZSBhbmQgZGVtYW5nbGUgdGhlIHNpZ25hdHVyZSBwb3J0aW9uIG9mIHRoZSBtYW5nbGVkIG5hbWUuCi0KLQlERUNMUCBpcyB0aGUgc3RyaW5nIHdoZXJlIGRlbWFuZ2xlZCBvdXRwdXQgaXMgYmVpbmcgYnVpbHQuICBBdAotCWVudHJ5IGl0IGNvbnRhaW5zIHRoZSBkZW1hbmdsZWQgcm9vdCBuYW1lIGZyb20gdGhlIG1hbmdsZWQgbmFtZQotCXByZWZpeC4gIEkuRS4gZWl0aGVyIGEgZGVtYW5nbGVkIG9wZXJhdG9yIG5hbWUgb3IgdGhlIHJvb3QgZnVuY3Rpb24KLQluYW1lLiAgSW4gc29tZSBzcGVjaWFsIGNhc2VzLCBpdCBtYXkgY29udGFpbiBub3RoaW5nLgotCi0JKk1BTkdMRUQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHVuY29uc3VtZWQgbG9jYXRpb24gaW4gdGhlIG1hbmdsZWQKLQluYW1lLiAgQXMgdG9rZW5zIGFyZSBjb25zdW1lZCBhbmQgZGVtYW5nbGluZyBpcyBwZXJmb3JtZWQsIHRoZQotCXBvaW50ZXIgaXMgdXBkYXRlZCB0byBjb250aW51b3VzbHkgcG9pbnQgYXQgdGhlIG5leHQgdG9rZW4gdG8KLQliZSBjb25zdW1lZC4KLQotCURlbWFuZ2xpbmcgR05VIHN0eWxlIG1hbmdsZWQgbmFtZXMgaXMgbmFzdHkgYmVjYXVzZSB0aGVyZSBpcyBubwotCWV4cGxpY2l0IHRva2VuIHRoYXQgbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBvdXRlcm1vc3QgZnVuY3Rpb24KLQlhcmd1bWVudCBsaXN0LiAgKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfc2lnbmF0dXJlICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGludCBmdW5jX2RvbmUgPSAwOwotICBpbnQgZXhwZWN0X2Z1bmMgPSAwOwotICBpbnQgZXhwZWN0X3JldHVybl90eXBlID0gMDsKLSAgY29uc3QgY2hhciAqb2xkbWFuZ2xlZCA9IE5VTEw7Ci0gIHN0cmluZyB0cmF3bmFtZTsKLSAgc3RyaW5nIHRuYW1lOwotCi0gIHdoaWxlIChzdWNjZXNzICYmICgqKm1hbmdsZWQgIT0gJ1wwJykpCi0gICAgewotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCWNhc2UgJ1EnOgotCSAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDEsIDApOwotCSAgaWYgKHN1Y2Nlc3MpCi0JICAgIHJlbWVtYmVyX3R5cGUgKHdvcmssIG9sZG1hbmdsZWQsICptYW5nbGVkIC0gb2xkbWFuZ2xlZCk7Ci0JICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCSAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ0snOgotCSAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDEsIDApOwotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIGV4cGVjdF9mdW5jID0gMTsKLQkgICAgfQotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgJ1MnOgotCSAgLyogU3RhdGljIG1lbWJlciBmdW5jdGlvbiAqLwotCSAgaWYgKG9sZG1hbmdsZWQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgICAgfQotCSAgKCptYW5nbGVkKSsrOwotCSAgd29yayAtPiBzdGF0aWNfdHlwZSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCWNhc2UgJ1YnOgotCWNhc2UgJ3UnOgotCSAgd29yay0+dHlwZV9xdWFscyB8PSBjb2RlX2Zvcl9xdWFsaWZpZXIgKCoqbWFuZ2xlZCk7Ci0KLQkgIC8qIGEgcXVhbGlmaWVkIG1lbWJlciBmdW5jdGlvbiAqLwotCSAgaWYgKG9sZG1hbmdsZWQgPT0gTlVMTCkKLQkgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0KLQljYXNlICdMJzoKLQkgIC8qIExvY2FsIGNsYXNzIG5hbWUgZm9sbG93cyBhZnRlciAiTG5ubl8iICovCi0JICBpZiAoSFBfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIHdoaWxlICgqKm1hbmdsZWQgJiYgKCoqbWFuZ2xlZCAhPSAnXycpKQotCQkoKm1hbmdsZWQpKys7Ci0JICAgICAgaWYgKCEqKm1hbmdsZWQpCi0JCXN1Y2Nlc3MgPSAwOwotCSAgICAgIGVsc2UKLQkJKCptYW5nbGVkKSsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN1Y2Nlc3MgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0JY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCSAgaWYgKG9sZG1hbmdsZWQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgICAgfQotICAgICAgICAgIHdvcmstPnRlbXBfc3RhcnQgPSAtMTsgLyogdXBwZXJtb3N0IGNhbGwgdG8gZGVtYW5nbGVfY2xhc3MgKi8KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9jbGFzcyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgaWYgKHN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICByZW1lbWJlcl90eXBlICh3b3JrLCBvbGRtYW5nbGVkLCAqbWFuZ2xlZCAtIG9sZG1hbmdsZWQpOwotCSAgICB9Ci0JICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgICB7Ci0gICAgICAgICAgICAgIC8qIEVERyBhbmQgb3RoZXJzIHdpbGwgaGF2ZSB0aGUgIkYiLCBzbyB3ZSBsZXQgdGhlIGxvb3AgY3ljbGUKLSAgICAgICAgICAgICAgICAgaWYgd2UgYXJlIGxvb2tpbmcgYXQgb25lLiAqLwotICAgICAgICAgICAgICBpZiAoKiptYW5nbGVkICE9ICdGJykKLSAgICAgICAgICAgICAgICAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgICB9Ci0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQic6Ci0JICB7Ci0JICAgIHN0cmluZyBzOwotCSAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnMpOwotCSAgICBpZiAoc3VjY2VzcykKLQkgICAgICB7Ci0JCXN0cmluZ19hcHBlbmQgKCZzLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkJc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJnMpOwotCSAgICAgIH0KLQkgICAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICAgIGV4cGVjdF9mdW5jID0gMTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnRic6Ci0JICAvKiBGdW5jdGlvbiAqLwotCSAgLyogQVJNL0hQIHN0eWxlIGRlbWFuZ2xpbmcgaW5jbHVkZXMgYSBzcGVjaWZpYyAnRicgY2hhcmFjdGVyIGFmdGVyCi0JICAgICB0aGUgY2xhc3MgbmFtZS4gIEZvciBHTlUgc3R5bGUsIGl0IGlzIGp1c3QgaW1wbGllZC4gIFNvIHdlIGNhbgotCSAgICAgc2FmZWx5IGp1c3QgY29uc3VtZSBhbnkgJ0YnIGF0IHRoaXMgcG9pbnQgYW5kIGJlIGNvbXBhdGlibGUKLQkgICAgIHdpdGggZWl0aGVyIHN0eWxlLiAgKi8KLQotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBmdW5jX2RvbmUgPSAxOwotCSAgKCptYW5nbGVkKSsrOwotCi0JICAvKiBGb3IgbHVjaWQvQVJNL0hQIHN0eWxlIHdlIGhhdmUgdG8gZm9yZ2V0IGFueSB0eXBlcyB3ZSBtaWdodAotCSAgICAgaGF2ZSByZW1lbWJlcmVkIHVwIHRvIHRoaXMgcG9pbnQsIHNpbmNlIHRoZXkgd2VyZSBub3QgYXJndW1lbnQKLQkgICAgIHR5cGVzLiAgR05VIHN0eWxlIGNvbnNpZGVycyBhbGwgdHlwZXMgc2VlbiBhcyBhdmFpbGFibGUgZm9yCi0JICAgICBiYWNrIHJlZmVyZW5jZXMuICBTZWUgY29tbWVudCBpbiBkZW1hbmdsZV9hcmdzKCkgKi8KLQotCSAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIGZvcmdldF90eXBlcyAod29yayk7Ci0JICAgIH0KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICAvKiBBZnRlciBwaWNraW5nIG9mZiB0aGUgZnVuY3Rpb24gYXJncywgd2UgZXhwZWN0IHRvIGVpdGhlcgotCSAgICAgZmluZCB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgKHByZWNlZGVkIGJ5IGFuICdfJykgb3IgdGhlCi0JICAgICBlbmQgb2YgdGhlIHN0cmluZy4gKi8KLQkgIGlmIChzdWNjZXNzICYmIChBVVRPX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpICYmICoqbWFuZ2xlZCA9PSAnXycpCi0JICAgIHsKLQkgICAgICArKygqbWFuZ2xlZCk7Ci0gICAgICAgICAgICAgIC8qIEF0IHRoaXMgbGV2ZWwsIHdlIGRvIG5vdCBjYXJlIGFib3V0IHRoZSByZXR1cm4gdHlwZS4gKi8KLSAgICAgICAgICAgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0bmFtZSk7Ci0gICAgICAgICAgICAgIHN0cmluZ19kZWxldGUgKCZ0bmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSAndCc6Ci0JICAvKiBHKysgVGVtcGxhdGUgKi8KLQkgIHN0cmluZ19pbml0KCZ0cmF3bmFtZSk7Ci0JICBzdHJpbmdfaW5pdCgmdG5hbWUpOwotCSAgaWYgKG9sZG1hbmdsZWQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgICAgfQotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAmdG5hbWUsCi0JCQkJICAgICAgICZ0cmF3bmFtZSwgMSwgMSk7Ci0JICBpZiAoc3VjY2VzcykKLQkgICAgewotCSAgICAgIHJlbWVtYmVyX3R5cGUgKHdvcmssIG9sZG1hbmdsZWQsICptYW5nbGVkIC0gb2xkbWFuZ2xlZCk7Ci0JICAgIH0KLQkgIHN0cmluZ19hcHBlbmQgKCZ0bmFtZSwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0KLQkgIHN0cmluZ19wcmVwZW5kcyhkZWNscCwgJnRuYW1lKTsKLQkgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKCZ0cmF3bmFtZSwgIn4iKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0cmF3bmFtZSk7Ci0JICAgICAgd29yay0+ZGVzdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JICBpZiAoKHdvcmstPmNvbnN0cnVjdG9yICYgMSkgfHwgKHdvcmstPmRlc3RydWN0b3IgJiAxKSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJnRyYXduYW1lKTsKLQkgICAgICB3b3JrLT5jb25zdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JICBzdHJpbmdfZGVsZXRlKCZ0cmF3bmFtZSk7Ci0JICBzdHJpbmdfZGVsZXRlKCZ0bmFtZSk7Ci0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGV4cGVjdF9mdW5jID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXyc6Ci0JICBpZiAoR05VX0RFTUFOR0xJTkcgJiYgZXhwZWN0X3JldHVybl90eXBlKQotCSAgICB7Ci0JICAgICAgLyogUmVhZCB0aGUgcmV0dXJuIHR5cGUuICovCi0JICAgICAgc3RyaW5nIHJldHVybl90eXBlOwotCSAgICAgIHN0cmluZ19pbml0ICgmcmV0dXJuX3R5cGUpOwotCi0JICAgICAgKCptYW5nbGVkKSsrOwotCSAgICAgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmcmV0dXJuX3R5cGUpOwotCSAgICAgIEFQUEVORF9CTEFOSyAoJnJldHVybl90eXBlKTsKLQotCSAgICAgIHN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZyZXR1cm5fdHlwZSk7Ci0JICAgICAgc3RyaW5nX2RlbGV0ZSAoJnJldHVybl90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICAvKiBBdCB0aGUgb3V0ZXJtb3N0IGxldmVsLCB3ZSBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlIHNwZWNpZmllZCwKLQkgICAgICAgc28gaWYgd2UgcnVuIGludG8gYW5vdGhlciAnXycgYXQgdGhpcyBwb2ludCB3ZSBhcmUgZGVhbGluZyB3aXRoCi0JICAgICAgIGEgbWFuZ2xlZCBuYW1lIHRoYXQgaXMgZWl0aGVyIGJvZ3VzLCBvciBoYXMgYmVlbiBtYW5nbGVkIGJ5Ci0JICAgICAgIHNvbWUgYWxnb3JpdGhtIHdlIGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aC4gIFNvIGp1c3QKLQkgICAgICAgcmVqZWN0IHRoZSBlbnRpcmUgZGVtYW5nbGluZy4gICovCi0gICAgICAgICAgICAvKiBIb3dldmVyLCAiX25ubiIgaXMgYW4gZXhwZWN0ZWQgc3VmZml4IGZvciBhbHRlcm5hdGUgZW50cnkgcG9pbnQKLSAgICAgICAgICAgICAgIG51bWJlcmVkIG5ubiBmb3IgYSBmdW5jdGlvbiwgd2l0aCBIUCBhQ0MsIHNvIHNraXAgb3ZlciB0aGF0Ci0gICAgICAgICAgICAgICB3aXRob3V0IHJlcG9ydGluZyBmYWlsdXJlLiBwYWkvMTk5Ny0wOS0wNCAqLwotICAgICAgICAgICAgaWYgKEhQX0RFTUFOR0xJTkcpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotICAgICAgICAgICAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgJ0gnOgotCSAgaWYgKEdOVV9ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgLyogQSBHKysgdGVtcGxhdGUgZnVuY3Rpb24uICBSZWFkIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMuICovCi0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMCwKLQkJCQkJICAgMCk7Ci0JICAgICAgaWYgKCEod29yay0+Y29uc3RydWN0b3IgJiAxKSkKLQkJZXhwZWN0X3JldHVybl90eXBlID0gMTsKLQkgICAgICAoKm1hbmdsZWQpKys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgLyogZmFsbCB0aHJvdWdoICovCi0JICAgIHs7fQotCi0JZGVmYXVsdDoKLQkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICAvKiBBc3N1bWUgd2UgaGF2ZSBzdHVtYmxlZCBvbnRvIHRoZSBmaXJzdCBvdXRlcm1vc3QgZnVuY3Rpb24KLQkJIGFyZ3VtZW50IHRva2VuLCBhbmQgc3RhcnQgcHJvY2Vzc2luZyBhcmdzLiAgKi8KLQkgICAgICBmdW5jX2RvbmUgPSAxOwotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE5vbi1HTlUgZGVtYW5nbGVycyB1c2UgYSBzcGVjaWZpYyB0b2tlbiB0byBtYXJrIHRoZSBzdGFydAotCQkgb2YgdGhlIG91dGVybW9zdCBmdW5jdGlvbiBhcmd1bWVudCB0b2tlbnMuICBUeXBpY2FsbHkgJ0YnLAotCQkgZm9yIEFSTS9IUC1kZW1hbmdsaW5nLCBmb3IgZXhhbXBsZS4gIFNvIGlmIHdlIGZpbmQgc29tZXRoaW5nCi0JCSB3ZSBhcmUgbm90IHByZXBhcmVkIGZvciwgaXQgbXVzdCBiZSBhbiBlcnJvci4gICovCi0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qCi0JaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQkqLwotICAgICAgewotCWlmIChzdWNjZXNzICYmIGV4cGVjdF9mdW5jKQotCSAgewotCSAgICBmdW5jX2RvbmUgPSAxOwotICAgICAgICAgICAgICBpZiAoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmb3JnZXRfdHlwZXMgKHdvcmspOwotICAgICAgICAgICAgICAgIH0KLQkgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgICAgLyogU2luY2UgdGVtcGxhdGUgaW5jbHVkZSB0aGUgbWFuZ2xpbmcgb2YgdGhlaXIgcmV0dXJuIHR5cGVzLAotCSAgICAgICB3ZSBtdXN0IHNldCBleHBlY3RfZnVuYyB0byAwIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IGRvCi0JICAgICAgIGRlbWFuZ2xlIG1vcmUgYXJndW1lbnRzIHRoZSBuZXh0IHRpbWUgd2UgZ2V0IGhlcmUuICAqLwotCSAgICBleHBlY3RfZnVuYyA9IDA7Ci0JICB9Ci0gICAgICB9Ci0gICAgfQotICBpZiAoc3VjY2VzcyAmJiAhZnVuY19kb25lKQotICAgIHsKLSAgICAgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JewotCSAgLyogV2l0aCBHTlUgc3R5bGUgZGVtYW5nbGluZywgYmFyX18zZm9vIGlzICdmb286OmJhcih2b2lkKScsIGFuZAotCSAgICAgYmFyX18zZm9vaSBpcyAnZm9vOjpiYXIoaW50KScuICBXZSBnZXQgaGVyZSB3aGVuIHdlIGZpbmQgdGhlCi0JICAgICBmaXJzdCBjYXNlLCBhbmQgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgJyh2b2lkKScgZ2V0cyBhZGRlZCB0bwotCSAgICAgdGhlIGN1cnJlbnQgZGVjbHAuICBOb3RlIHRoYXQgd2l0aCBBUk0vSFAsIHRoZSBmaXJzdCBjYXNlCi0JICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGEgc3RhdGljIGRhdGEgbWVtYmVyICdmb286OmJhcicsCi0JICAgICB3aGljaCBpcyBpbiB0aGUgY3VycmVudCBkZWNscCwgc28gd2UgbGVhdmUgaXQgYWxvbmUuICAqLwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQl9Ci0gICAgfQotICBpZiAoc3VjY2VzcyAmJiBQUklOVF9BUkdfVFlQRVMpCi0gICAgewotICAgICAgaWYgKHdvcmstPnN0YXRpY190eXBlKQotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCAiIHN0YXRpYyIpOwotICAgICAgaWYgKHdvcmstPnR5cGVfcXVhbHMgIT0gVFlQRV9VTlFVQUxJRklFRCkKLQl7Ci0JICBBUFBFTkRfQkxBTksgKGRlY2xwKTsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBxdWFsaWZpZXJfc3RyaW5nICh3b3JrLT50eXBlX3F1YWxzKSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0jaWYgMAotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9tZXRob2RfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotCi0gIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAqbWFuZ2xlZCArIDEpOwotICAgICAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlX3RlbXBsYXRlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHRuYW1lKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqdG5hbWU7Ci17Ci0gIGludCBpOwotICBpbnQgcjsKLSAgaW50IG5lZWRfY29tbWEgPSAwOwotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIHN0cmluZyB0ZW1wOwotCi0gIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAidGVtcGxhdGUgPCIpOwotICAvKiBnZXQgc2l6ZSBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCAqLwotICBpZiAoZ2V0X2NvdW50IChtYW5nbGVkLCAmcikpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLQl7Ci0JICBpZiAobmVlZF9jb21tYSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiLCAiKTsKLQkgICAgfQotCi0JICAgIC8qIFogZm9yIHR5cGUgcGFyYW1ldGVycyAqLwotCSAgICBpZiAoKiptYW5nbGVkID09ICdaJykKLQkgICAgICB7Ci0JCSgqbWFuZ2xlZCkrKzsKLQkJc3RyaW5nX2FwcGVuZCAodG5hbWUsICJjbGFzcyIpOwotCSAgICAgIH0KLQkgICAgICAvKiB6IGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovCi0JICAgIGVsc2UgaWYgKCoqbWFuZ2xlZCA9PSAneicpCi0JICAgICAgewotCQkoKm1hbmdsZWQpKys7Ci0JCXN1Y2Nlc3MgPQotCQkgIGRlbWFuZ2xlX3RlbXBsYXRlX3RlbXBsYXRlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHRuYW1lKTsKLQkJaWYgKCFzdWNjZXNzKQotCQkgIHsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIHRlbXAgaXMgaW5pdGlhbGl6ZWQgaW4gZG9fdHlwZSAqLwotCQlzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnRlbXApOwotCQlpZiAoc3VjY2VzcykKLQkJICB7Ci0JCSAgICBzdHJpbmdfYXBwZW5kcyAodG5hbWUsICZ0ZW1wKTsKLQkJICB9Ci0JCXN0cmluZ19kZWxldGUoJnRlbXApOwotCQlpZiAoIXN1Y2Nlc3MpCi0JCSAgewotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIG5lZWRfY29tbWEgPSAxOwotCX0KLQotICAgIH0KLSAgaWYgKHRuYW1lLT5wWy0xXSA9PSAnPicpCi0gICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICIgIik7Ci0gIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPiBjbGFzcyIpOwotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9leHByZXNzaW9uICh3b3JrLCBtYW5nbGVkLCBzLCB0aykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIqKiBtYW5nbGVkOwotICAgICBzdHJpbmcqIHM7Ci0gICAgIHR5cGVfa2luZF90IHRrOwotewotICBpbnQgbmVlZF9vcGVyYXRvciA9IDA7Ci0gIGludCBzdWNjZXNzOwotCi0gIHN1Y2Nlc3MgPSAxOwotICBzdHJpbmdfYXBwZW5kbiAocywgIigiLCAxKTsKLSAgKCptYW5nbGVkKSsrOwotICB3aGlsZSAoc3VjY2VzcyAmJiAqKm1hbmdsZWQgIT0gJ1cnICYmICoqbWFuZ2xlZCAhPSAnXDAnKQotICAgIHsKLSAgICAgIGlmIChuZWVkX29wZXJhdG9yKQotCXsKLQkgIHNpemVfdCBpOwotCSAgc2l6ZV90IGxlbjsKLQotCSAgc3VjY2VzcyA9IDA7Ci0KLQkgIGxlbiA9IHN0cmxlbiAoKm1hbmdsZWQpOwotCi0JICBmb3IgKGkgPSAwOwotCSAgICAgICBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZSBbMF0pOwotCSAgICAgICArK2kpCi0JICAgIHsKLQkgICAgICBzaXplX3QgbCA9IHN0cmxlbiAob3B0YWJsZVtpXS5pbik7Ci0KLQkgICAgICBpZiAobCA8PSBsZW4KLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sICptYW5nbGVkLCBsKSA9PSAwKQotCQl7Ci0JCSAgc3RyaW5nX2FwcGVuZG4gKHMsICIgIiwgMSk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAocywgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHN0cmluZ19hcHBlbmRuIChzLCAiICIsIDEpOwotCQkgIHN1Y2Nlc3MgPSAxOwotCQkgICgqbWFuZ2xlZCkgKz0gbDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghc3VjY2VzcykKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgZWxzZQotCW5lZWRfb3BlcmF0b3IgPSAxOwotCi0gICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgcywgdGspOwotICAgIH0KLQotICBpZiAoKiptYW5nbGVkICE9ICdXJykKLSAgICBzdWNjZXNzID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiKSIsIDEpOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgIH0KLQotICByZXR1cm4gc3VjY2VzczsKLX0KLQotc3RhdGljIGludAotZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUgKHdvcmssIG1hbmdsZWQsIHMpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyKiogbWFuZ2xlZDsKLSAgICAgc3RyaW5nKiBzOwotewotICBpbnQgc3VjY2VzczsKLQotICBpZiAoKiptYW5nbGVkID09ICdFJykKLSAgICBzdWNjZXNzID0gZGVtYW5nbGVfZXhwcmVzc2lvbiAod29yaywgbWFuZ2xlZCwgcywgdGtfaW50ZWdyYWwpOwotICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ1EnIHx8ICoqbWFuZ2xlZCA9PSAnSycpCi0gICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgcywgMCwgMSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgdmFsdWU7Ci0KLSAgICAgIHN1Y2Nlc3MgPSAwOwotCi0gICAgICAvKiBOZWdhdGl2ZSBudW1iZXJzIGFyZSBpbmRpY2F0ZWQgd2l0aCBhIGxlYWRpbmcgYG0nLiAgKi8KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLQotICAgICAgLyogUmVhZCB0aGUgcmVzdCBvZiB0aGUgbnVtYmVyLiAgKi8KLSAgICAgIHZhbHVlID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLSAgICAgIGlmICh2YWx1ZSAhPSAtMSkKLQl7Ci0JICBjaGFyIGJ1ZltJTlRCVUZfU0laRV07Ci0JICBzcHJpbnRmIChidWYsICIlZCIsIHZhbHVlKTsKLQkgIHN0cmluZ19hcHBlbmQgKHMsIGJ1Zik7Ci0KLQkgIC8qIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhbiB1bmRlcnNjb3JlLCBza2lwIGl0LiAgKi8KLQkgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotCSAgICAoKm1hbmdsZWQpKys7Ci0KLQkgIC8qIEFsbCBpcyB3ZWxsLiAgKi8KLQkgIHN1Y2Nlc3MgPSAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSByZWFsIHZhbHVlIGluIE1BTkdMRUQuICAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9yZWFsX3ZhbHVlICh3b3JrLCBtYW5nbGVkLCBzKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyogczsKLXsKLSAgaWYgKCoqbWFuZ2xlZCA9PSAnRScpCi0gICAgcmV0dXJuIGRlbWFuZ2xlX2V4cHJlc3Npb24gKHdvcmssIG1hbmdsZWQsIHMsIHRrX3JlYWwpOwotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ20nKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgIH0KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0gIGlmICgqKm1hbmdsZWQgPT0gJy4nKSAvKiBmcmFjdGlvbiAqLwotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiLiIsIDEpOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgfQotICBpZiAoKiptYW5nbGVkID09ICdlJykgLyogZXhwb25lbnQgKi8KLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocywgImUiLCAxKTsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgcywgdGspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nKiBzOwotICAgICB0eXBlX2tpbmRfdCB0azsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ1knKQotICAgIHsKLSAgICAgIC8qIFRoZSBuZXh0IGFyZ3VtZW50IGlzIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiAqLwotICAgICAgaW50IGlkeDsKLQotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLSAgICAgIGlmIChpZHggPT0gLTEKLQkgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKLQkgIHx8IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCkgPT0gLTEpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHdvcmstPnRtcGxfYXJndmVjKQotCXN0cmluZ19hcHBlbmQgKHMsIHdvcmstPnRtcGxfYXJndmVjW2lkeF0pOwotICAgICAgZWxzZQotCXN0cmluZ19hcHBlbmRfdGVtcGxhdGVfaWR4IChzLCBpZHgpOwotICAgIH0KLSAgZWxzZSBpZiAodGsgPT0gdGtfaW50ZWdyYWwpCi0gICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlICh3b3JrLCBtYW5nbGVkLCBzKTsKLSAgZWxzZSBpZiAodGsgPT0gdGtfY2hhcikKLSAgICB7Ci0gICAgICBjaGFyIHRtcFsyXTsKLSAgICAgIGludCB2YWw7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdtJykKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIi0iLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocywgIiciLCAxKTsKLSAgICAgIHZhbCA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCk7Ci0gICAgICBpZiAodmFsIDw9IDApCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgdG1wWzBdID0gKGNoYXIpdmFsOwotCSAgdG1wWzFdID0gJ1wwJzsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAmdG1wWzBdLCAxKTsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiJyIsIDEpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHRrID09IHRrX2Jvb2wpCi0gICAgewotICAgICAgaW50IHZhbCA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgaWYgKHZhbCA9PSAwKQotCXN0cmluZ19hcHBlbmRuIChzLCAiZmFsc2UiLCA1KTsKLSAgICAgIGVsc2UgaWYgKHZhbCA9PSAxKQotCXN0cmluZ19hcHBlbmRuIChzLCAidHJ1ZSIsIDQpOwotICAgICAgZWxzZQotCXN1Y2Nlc3MgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAodGsgPT0gdGtfcmVhbCkKLSAgICBzdWNjZXNzID0gZGVtYW5nbGVfcmVhbF92YWx1ZSAod29yaywgbWFuZ2xlZCwgcyk7Ci0gIGVsc2UgaWYgKHRrID09IHRrX3BvaW50ZXIgfHwgdGsgPT0gdGtfcmVmZXJlbmNlKQotICAgIHsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ1EnKQotCXN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHMsCi0JCQkJICAgICAgLyppc2Z1bmNuYW1lPSovMCwgCi0JCQkJICAgICAgLyphcHBlbmQ9Ki8xKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgc3ltYm9sX2xlbiAgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLQkgIGlmIChzeW1ib2xfbGVuID09IC0xKQotCSAgICByZXR1cm4gLTE7Ci0JICBpZiAoc3ltYm9sX2xlbiA9PSAwKQotCSAgICBzdHJpbmdfYXBwZW5kbiAocywgIjAiLCAxKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKnAgPSB4bWFsbG9jIChzeW1ib2xfbGVuICsgMSksICpxOwotCSAgICAgIHN0cm5jcHkgKHAsICptYW5nbGVkLCBzeW1ib2xfbGVuKTsKLQkgICAgICBwIFtzeW1ib2xfbGVuXSA9ICdcMCc7Ci0JICAgICAgLyogV2UgdXNlIGNwbHVzX2RlbWFuZ2xlIGhlcmUsIHJhdGhlciB0aGFuCi0JCSBpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSwgYmVjYXVzZSB0aGUgbmFtZSBvZiB0aGUgZW50aXR5Ci0JCSBtYW5nbGVkIGhlcmUgZG9lcyBub3QgbWFrZSB1c2Ugb2YgYW55IG9mIHRoZSBzcXVhbmdsaW5nCi0JCSBvciB0eXBlLWNvZGUgaW5mb3JtYXRpb24gd2UgaGF2ZSBidWlsdCB1cCB0aHVzIGZhcjsgaXQgaXMKLQkJIG1hbmdsZWQgaW5kZXBlbmRlbnRseS4gICovCi0JICAgICAgcSA9IGNwbHVzX2RlbWFuZ2xlIChwLCB3b3JrLT5vcHRpb25zKTsKLQkgICAgICBpZiAodGsgPT0gdGtfcG9pbnRlcikKLQkJc3RyaW5nX2FwcGVuZG4gKHMsICImIiwgMSk7Ci0JICAgICAgLyogRklYTUU6IFBvaW50ZXItdG8tbWVtYmVyIGNvbnN0YW50cyBzaG91bGQgZ2V0IGEKLQkJIHF1YWxpZnlpbmcgY2xhc3MgbmFtZSBoZXJlLiAgKi8KLQkgICAgICBpZiAocSkKLQkJewotCQkgIHN0cmluZ19hcHBlbmQgKHMsIHEpOwotCQkgIGZyZWUgKHEpOwotCQl9Ci0JICAgICAgZWxzZQotCQlzdHJpbmdfYXBwZW5kIChzLCBwKTsKLQkgICAgICBmcmVlIChwKTsKLQkgICAgfQotCSAgKm1hbmdsZWQgKz0gc3ltYm9sX2xlbjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBzdWNjZXNzOwotfQotCi0vKiBEZW1hbmdsZSB0aGUgdGVtcGxhdGUgbmFtZSBpbiBNQU5HTEVELiAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUKLSAgIHRlbXBsYXRlIChlLmcuLCBTPGludD4pIGlzIHBsYWNlZCBpbiBUTkFNRS4gIFRoZSBuYW1lIHdpdGhvdXQgdGhlCi0gICB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChlLmcuIFMpIGlzIHBsYWNlZCBpbiBUUkFXTkFNRSBpZiBUUkFXTkFNRSBpcwotICAgbm9uLU5VTEwuICBJZiBJU19UWVBFIGlzIG5vbnplcm8sIHRoaXMgdGVtcGxhdGUgaXMgYSB0eXBlIHRlbXBsYXRlLAotICAgbm90IGEgZnVuY3Rpb24gdGVtcGxhdGUuICBJZiBib3RoIElTX1RZUEUgYW5kIFJFTUVNQkVSIGFyZSBub256ZXJvLAotICAgdGhlIHRtZXBsYXRlIGlzIHJlbWVtYmVyZWQgaW4gdGhlIGxpc3Qgb2YgYmFjay1yZWZlcmVuY2VhYmxlCi0gICB0eXBlcy4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCB0bmFtZSwgdHJhd25hbWUsIGlzX3R5cGUsIHJlbWVtYmVyKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqdG5hbWU7Ci0gICAgIHN0cmluZyAqdHJhd25hbWU7Ci0gICAgIGludCBpc190eXBlOwotICAgICBpbnQgcmVtZW1iZXI7Ci17Ci0gIGludCBpOwotICBpbnQgcjsKLSAgaW50IG5lZWRfY29tbWEgPSAwOwotICBpbnQgc3VjY2VzcyA9IDA7Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBpbnQgaXNfamF2YV9hcnJheSA9IDA7Ci0gIHN0cmluZyB0ZW1wOwotICBpbnQgYmluZGV4ID0gMDsKLQotICAoKm1hbmdsZWQpKys7Ci0gIGlmIChpc190eXBlKQotICAgIHsKLSAgICAgIGlmIChyZW1lbWJlcikKLQliaW5kZXggPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0gICAgICBzdGFydCA9ICptYW5nbGVkOwotICAgICAgLyogZ2V0IHRlbXBsYXRlIG5hbWUgKi8KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ3onKQotCXsKLQkgIGludCBpZHg7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICAoKm1hbmdsZWQpKys7Ci0KLQkgIGlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0JICBpZiAoaWR4ID09IC0xCi0JICAgICAgfHwgKHdvcmstPnRtcGxfYXJndmVjICYmIGlkeCA+PSB3b3JrLT5udG1wbF9hcmdzKQotCSAgICAgIHx8IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCkgPT0gLTEpCi0JICAgIHJldHVybiAoMCk7Ci0KLQkgIGlmICh3b3JrLT50bXBsX2FyZ3ZlYykKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLQkgICAgICBpZiAodHJhd25hbWUpCi0JCXN0cmluZ19hcHBlbmQgKHRyYXduYW1lLCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZF90ZW1wbGF0ZV9pZHggKHRuYW1lLCBpZHgpOwotCSAgICAgIGlmICh0cmF3bmFtZSkKLQkJc3RyaW5nX2FwcGVuZF90ZW1wbGF0ZV9pZHggKHRyYXduYW1lLCBpZHgpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgociA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpKSA8PSAwCi0JICAgICAgfHwgKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPCByKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCSAgaXNfamF2YV9hcnJheSA9ICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX0pBVkEpCi0JICAgICYmIHN0cm5jbXAgKCptYW5nbGVkLCAiSkFycmF5MVoiLCA4KSA9PSAwOwotCSAgaWYgKCEgaXNfamF2YV9hcnJheSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRuICh0bmFtZSwgKm1hbmdsZWQsIHIpOwotCSAgICB9Ci0JICBpZiAodHJhd25hbWUpCi0JICAgIHN0cmluZ19hcHBlbmRuICh0cmF3bmFtZSwgKm1hbmdsZWQsIHIpOwotCSAgKm1hbmdsZWQgKz0gcjsKLQl9Ci0gICAgfQotICBpZiAoIWlzX2phdmFfYXJyYXkpCi0gICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICI8Iik7Ci0gIC8qIGdldCBzaXplIG9mIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0ICovCi0gIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmcikpCi0gICAgewotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gIGlmICghaXNfdHlwZSkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYW4gYXJyYXkgZm9yIHNhdmluZyB0aGUgdGVtcGxhdGUgYXJndW1lbnQgdmFsdWVzLiAqLwotICAgICAgd29yay0+dG1wbF9hcmd2ZWMgPSAoY2hhcioqKSB4bWFsbG9jIChyICogc2l6ZW9mIChjaGFyICopKTsKLSAgICAgIHdvcmstPm50bXBsX2FyZ3MgPSByOwotICAgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLQl3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IDA7Ci0gICAgfQotICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChuZWVkX2NvbW1hKQotCXsKLQkgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiLCAiKTsKLQl9Ci0gICAgICAvKiBaIGZvciB0eXBlIHBhcmFtZXRlcnMgKi8KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ1onKQotCXsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIC8qIHRlbXAgaXMgaW5pdGlhbGl6ZWQgaW4gZG9fdHlwZSAqLwotCSAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZHMgKHRuYW1lLCAmdGVtcCk7Ci0KLQkgICAgICBpZiAoIWlzX3R5cGUpCi0JCXsKLQkJICAvKiBTYXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudC4gKi8KLQkJICBpbnQgbGVuID0gdGVtcC5wIC0gdGVtcC5iOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldID0geG1hbGxvYyAobGVuICsgMSk7Ci0JCSAgbWVtY3B5ICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSwgdGVtcC5iLCBsZW4pOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldW2xlbl0gPSAnXDAnOwotCQl9Ci0JICAgIH0KLQkgIHN0cmluZ19kZWxldGUoJnRlbXApOwotCSAgaWYgKCFzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiB6IGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovCi0gICAgICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ3onKQotCXsKLQkgIGludCByMjsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCB0bmFtZSk7Ci0KLQkgIGlmIChzdWNjZXNzCi0JICAgICAgJiYgKHIyID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCkpID4gMAotCSAgICAgICYmIChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpID49IHIyKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICIgIik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZG4gKHRuYW1lLCAqbWFuZ2xlZCwgcjIpOwotCSAgICAgIGlmICghaXNfdHlwZSkKLQkJewotCQkgIC8qIFNhdmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LiAqLwotCQkgIGludCBsZW4gPSByMjsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IHhtYWxsb2MgKGxlbiArIDEpOwotCQkgIG1lbWNweSAod29yay0+dG1wbF9hcmd2ZWNbaV0sICptYW5nbGVkLCBsZW4pOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldW2xlbl0gPSAnXDAnOwotCQl9Ci0JICAgICAgKm1hbmdsZWQgKz0gcjI7Ci0JICAgIH0KLQkgIGlmICghc3VjY2VzcykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cmluZyAgcGFyYW07Ci0JICBzdHJpbmcqIHM7Ci0KLQkgIC8qIG90aGVyd2lzZSwgdmFsdWUgcGFyYW1ldGVyICovCi0KLQkgIC8qIHRlbXAgaXMgaW5pdGlhbGl6ZWQgaW4gZG9fdHlwZSAqLwotCSAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkgIHN0cmluZ19kZWxldGUoJnRlbXApOwotCSAgaWYgKCFzdWNjZXNzKQotCSAgICBicmVhazsKLQotCSAgaWYgKCFpc190eXBlKQotCSAgICB7Ci0JICAgICAgcyA9ICZwYXJhbTsKLQkgICAgICBzdHJpbmdfaW5pdCAocyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcyA9IHRuYW1lOwotCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgcywKLQkJCQkJCSAgKHR5cGVfa2luZF90KSBzdWNjZXNzKTsKLQotCSAgaWYgKCFzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgaWYgKCFpc190eXBlKQotCQlzdHJpbmdfZGVsZXRlIChzKTsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoIWlzX3R5cGUpCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gcy0+cCAtIHMtPmI7Ci0JICAgICAgd29yay0+dG1wbF9hcmd2ZWNbaV0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgICAgICBtZW1jcHkgKHdvcmstPnRtcGxfYXJndmVjW2ldLCBzLT5iLCBsZW4pOwotCSAgICAgIHdvcmstPnRtcGxfYXJndmVjW2ldW2xlbl0gPSAnXDAnOwotCi0JICAgICAgc3RyaW5nX2FwcGVuZHMgKHRuYW1lLCBzKTsKLQkgICAgICBzdHJpbmdfZGVsZXRlIChzKTsKLQkgICAgfQotCX0KLSAgICAgIG5lZWRfY29tbWEgPSAxOwotICAgIH0KLSAgaWYgKGlzX2phdmFfYXJyYXkpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICJbXSIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh0bmFtZS0+cFstMV0gPT0gJz4nKQotCXN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOwotICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICI+Iik7Ci0gICAgfQotCi0gIGlmIChpc190eXBlICYmIHJlbWVtYmVyKQotICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCB0bmFtZS0+YiwgTEVOX1NUUklORyAodG5hbWUpLCBiaW5kZXgpOwotCi0gIC8qCi0gICAgaWYgKHdvcmsgLT4gc3RhdGljX3R5cGUpCi0gICAgewotICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAqbWFuZ2xlZCArIDEpOwotICAgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0gICAgfQotICAgIH0KLSAgICAqLwotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgaW50Ci1hcm1fcHQgKHdvcmssIG1hbmdsZWQsIG4sIGFuY2hvciwgYXJncykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKm1hbmdsZWQ7Ci0gICAgIGludCBuOwotICAgICBjb25zdCBjaGFyICoqYW5jaG9yLCAqKmFyZ3M7Ci17Ci0gIC8qIENoZWNrIGlmIEFSTSB0ZW1wbGF0ZSB3aXRoICJfX3B0X18iIGluIGl0ICgicGFyYW1ldGVyaXplZCB0eXBlIikgKi8KLSAgLyogQWxsb3cgSFAgYWxzbyBoZXJlLCBiZWNhdXNlIEhQJ3MgY2Zyb250IGNvbXBpbGVyIGZvbGxvd3MgQVJNIHRvIHNvbWUgZXh0ZW50ICovCi0gIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORykgJiYgKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fcHRfXyIpKSkKLSAgICB7Ci0gICAgICBpbnQgbGVuOwotICAgICAgKmFyZ3MgPSAqYW5jaG9yICsgNjsKLSAgICAgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOwotICAgICAgaWYgKGxlbiA9PSAtMSkKLQlyZXR1cm4gMDsKLSAgICAgIGlmICgqYXJncyArIGxlbiA9PSBtYW5nbGVkICsgbiAmJiAqKmFyZ3MgPT0gJ18nKQotCXsKLQkgICsrKmFyZ3M7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotICAgIHsKLSAgICAgIGlmICgoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX190bV9fIikpCi0gICAgICAgICAgfHwgKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fcHNfXyIpKQotICAgICAgICAgIHx8ICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3B0X18iKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbGVuOwotICAgICAgICAgICphcmdzID0gKmFuY2hvciArIDY7Ci0gICAgICAgICAgbGVuID0gY29uc3VtZV9jb3VudCAoYXJncyk7Ci0JICBpZiAobGVuID09IC0xKQotCSAgICByZXR1cm4gMDsKLSAgICAgICAgICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKysqYXJnczsKLSAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX1MiKSkpCi0gICAgICAgIHsKLSAJICBpbnQgbGVuOwotIAkgICphcmdzID0gKmFuY2hvciArIDM7Ci0gCSAgbGVuID0gY29uc3VtZV9jb3VudCAoYXJncyk7Ci0JICBpZiAobGVuID09IC0xKQotCSAgICByZXR1cm4gMDsKLSAJICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKysqYXJnczsKLSAJICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIG4sIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIGludCBuOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBjb25zdCBjaGFyICpwOwotICBjb25zdCBjaGFyICphcmdzOwotICBjb25zdCBjaGFyICplID0gKm1hbmdsZWQgKyBuOwotICBzdHJpbmcgYXJnOwotCi0gIC8qIENoZWNrIGZvciBIUCBhQ0MgdGVtcGxhdGUgc3BlYzogY2xhc3NYdDF0MiB3aGVyZSB0MSwgdDIgYXJlCi0gICAgIHRlbXBsYXRlIGFyZ3MgKi8KLSAgaWYgKEhQX0RFTUFOR0xJTkcgJiYgKCgqbWFuZ2xlZClbbl0gPT0gJ1gnKSkKLSAgICB7Ci0gICAgICBjaGFyICpzdGFydF9zcGVjX2FyZ3MgPSBOVUxMOwotCi0gICAgICAvKiBGaXJzdCBjaGVjayBmb3IgYW5kIG9taXQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gcHNldWRvLWFyZ3VtZW50cywKLSAgICAgICAgIHN1Y2ggYXMgaW4gIlNwZWM8IzEsIzEuKj4iICovCi0gICAgICBzdGFydF9zcGVjX2FyZ3MgPSBzdHJjaHIgKCptYW5nbGVkLCAnPCcpOwotICAgICAgaWYgKHN0YXJ0X3NwZWNfYXJncyAmJiAoc3RhcnRfc3BlY19hcmdzIC0gKm1hbmdsZWQgPCBuKSkKLSAgICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgc3RhcnRfc3BlY19hcmdzIC0gKm1hbmdsZWQpOwotICAgICAgZWxzZQotICAgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLSAgICAgICgqbWFuZ2xlZCkgKz0gbiArIDE7Ci0gICAgICBzdHJpbmdfaW5pdCAoJmFyZyk7Ci0gICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgLyogbm9uLXJlY3Vyc2l2ZSBjYWxsICovCi0gICAgICAgIHdvcmstPnRlbXBfc3RhcnQgPSBkZWNscC0+cCAtIGRlY2xwLT5iOwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI8Iik7Ci0gICAgICB3aGlsZSAoMSkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19jbGVhciAoJmFyZyk7Ci0gICAgICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgJ1QnOgotICAgICAgICAgICAgICAgIC8qICdUJyBzaWduYWxzIGEgdHlwZSBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLSAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ1UnOgotICAgICAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICAvKiAnVScgb3IgJ1MnIHNpZ25hbHMgYW4gaW50ZWdyYWwgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLSAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgICAgICAgIC8qICdBJyBzaWduYWxzIGEgbmFtZWQgY29uc3RhbnQgZXhwcmVzc2lvbiAobGl0ZXJhbCkgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwgKHdvcmssIG1hbmdsZWQsICZhcmcpKQotICAgICAgICAgICAgICAgICAgZ290byBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBUb2RheSwgMTk5Ny0wOS0wMywgd2UgaGF2ZSBvbmx5IHRoZSBhYm92ZSB0eXBlcwotICAgICAgICAgICAgICAgICAgIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAvKiBGSVhNRTogbWF5YmUgdGhpcyBzaG91bGQgZmFpbCBhbmQgcmV0dXJuIG51bGwgKi8KLSAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZhcmcpOwotICAgICAgICAgLyogQ2hlY2sgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0ZW1wbGF0ZSBhcmdzLgotICAgICAgICAgICAgIDAgaWYgYXQgZW5kIG9mIHN0YXRpYyBtZW1iZXIgb2YgdGVtcGxhdGUgY2xhc3MsCi0gICAgICAgICAgICAgXyBpZiBkb25lIHdpdGggdGVtcGxhdGUgYXJncyBmb3IgYSBmdW5jdGlvbiAqLwotICAgICAgICAgIGlmICgoKiptYW5nbGVkID09ICdcMDAwJykgfHwgKCoqbWFuZ2xlZCA9PSAnXycpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsIik7Ci0gICAgICAgIH0KLSAgICBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU6Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIj4iKTsKLSAgICAgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0gICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qIEFSTSB0ZW1wbGF0ZT8gKEFsc28gaGFuZGxlcyBIUCBjZnJvbnQgZXh0ZW5zaW9ucykgKi8KLSAgZWxzZSBpZiAoYXJtX3B0ICh3b3JrLCAqbWFuZ2xlZCwgbiwgJnAsICZhcmdzKSkKLSAgICB7Ci0gICAgICBzdHJpbmcgdHlwZV9zdHI7Ci0KLSAgICAgIHN0cmluZ19pbml0ICgmYXJnKTsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIHAgLSAqbWFuZ2xlZCk7Ci0gICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgIC8qIG5vbi1yZWN1cnNpdmUgY2FsbCAqLwotCXdvcmstPnRlbXBfc3RhcnQgPSBkZWNscC0+cCAtIGRlY2xwLT5iOwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI8Iik7Ci0gICAgICAvKiBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcgaGVyZSAqLwotICAgICAgd2hpbGUgKGFyZ3MgPCBlKSB7Ci0Jc3RyaW5nX2NsZWFyICgmYXJnKTsKLQotCS8qIENoZWNrIGZvciB0eXBlIG9yIGxpdGVyYWwgaGVyZSAqLwotCXN3aXRjaCAoKmFyZ3MpCi0JICB7Ci0JICAgIC8qIEhQIGNmcm9udCBleHRlbnNpb25zIHRvIEFSTSBmb3IgdGVtcGxhdGUgYXJncyAqLwotCSAgICAvKiBzcGVjOiBYdDFMdjEgd2hlcmUgdDEgaXMgYSB0eXBlLCB2MSBpcyBhIGxpdGVyYWwgdmFsdWUgKi8KLQkgICAgLyogRklYTUU6IFdlIGhhbmRsZSBvbmx5IG51bWVyaWMgbGl0ZXJhbHMgZm9yIEhQIGNmcm9udCAqLwotICAgICAgICAgIGNhc2UgJ1gnOgotICAgICAgICAgICAgLyogQSB0eXBlZCBjb25zdGFudCB2YWx1ZSBmb2xsb3dzICovCi0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICBpZiAoIWRvX3R5cGUgKHdvcmssICZhcmdzLCAmdHlwZV9zdHIpKQotCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKCZhcmcsICIoIik7Ci0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAoJmFyZywgJnR5cGVfc3RyKTsKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKCZhcmcsICIpIik7Ci0gICAgICAgICAgICBpZiAoKmFyZ3MgIT0gJ0wnKQotICAgICAgICAgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICAvKiBOb3cgc25hcmYgYSBsaXRlcmFsIHZhbHVlIGZvbGxvd2luZyAnTCcgKi8KLSAgICAgICAgICAgIGlmICghc25hcmZfbnVtZXJpY19saXRlcmFsICgmYXJncywgJmFyZykpCi0JICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdMJzoKLSAgICAgICAgICAgIC8qIFNuYXJmIGEgbGl0ZXJhbCBmb2xsb3dpbmcgJ0wnICovCi0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICBpZiAoIXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoJmFyZ3MsICZhcmcpKQotCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBOb3QgaGFuZGxpbmcgb3RoZXIgSFAgY2Zyb250IHN0dWZmICovCi0gICAgICAgICAgICBpZiAoIWRvX3R5cGUgKHdvcmssICZhcmdzLCAmYXJnKSkKLSAgICAgICAgICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotCSAgfQotCXN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0Jc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsIik7Ci0gICAgICB9Ci0gICAgY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZToKLSAgICAgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotICAgICAgaWYgKGFyZ3MgPj0gZSkKLQktLWRlY2xwLT5wOyAvKiByZW1vdmUgZXh0cmEgY29tbWEgKi8KLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPiIpOwotICAgIH0KLSAgZWxzZSBpZiAobj4xMCAmJiBzdHJuY21wICgqbWFuZ2xlZCwgIl9HTE9CQUxfIiwgOCkgPT0gMAotCSAgICYmICgqbWFuZ2xlZClbOV0gPT0gJ04nCi0JICAgJiYgKCptYW5nbGVkKVs4XSA9PSAoKm1hbmdsZWQpWzEwXQotCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVs4XSkpCi0gICAgewotICAgICAgLyogQSBtZW1iZXIgb2YgdGhlIGFub255bW91cyBuYW1lc3BhY2UuICAqLwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJ7YW5vbnltb3VzfSIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh3b3JrLT50ZW1wX3N0YXJ0ID09IC0xKSAvKiBub24tcmVjdXJzaXZlIGNhbGwgb25seSAqLwotCXdvcmstPnRlbXBfc3RhcnQgPSAwOyAgICAgLyogZGlzYWJsZSBpbiByZWN1cnNpdmUgY2FsbHMgKi8KLSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotICAgIH0KLSAgKm1hbmdsZWQgKz0gbjsKLX0KLQotLyogRXh0cmFjdCBhIGNsYXNzIG5hbWUsIHBvc3NpYmx5IGEgdGVtcGxhdGUgd2l0aCBhcmd1bWVudHMsIGZyb20gdGhlCi0gICBtYW5nbGVkIHN0cmluZzsgcXVhbGlmaWVycywgbG9jYWwgY2xhc3MgaW5kaWNhdG9ycywgZXRjLiBoYXZlCi0gICBhbHJlYWR5IGJlZW4gZGVhbHQgd2l0aCAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9jbGFzc19uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgbjsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotCi0gIG4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgaWYgKG4gPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICgoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA+PSBuKQotICAgIHsKLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgbiwgZGVjbHApOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotCi0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9jbGFzcyAtLSBkZW1hbmdsZSBhIG1hbmdsZWQgY2xhc3Mgc2VxdWVuY2UKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9jbGFzcyAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkJc3RyaW50ICpkZWNscCkKLQotREVTQ1JJUFRJT04KLQotCURFQ0xQIHBvaW50cyB0byB0aGUgYnVmZmVyIGludG8gd2hpY2ggZGVtYW5nbGluZyBpcyBiZWluZyBkb25lLgotCi0JKk1BTkdMRUQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHRva2VuIHRvIGJlIGRlbWFuZ2xlZC4gIE9uIGlucHV0LAotCWl0IHBvaW50cyB0byBhIG1hbmdsZWQgY2xhc3MgKEkuRS4gIjNmb28iLCAiMTN2ZXJ5bG9uZ2NsYXNzIiwgZXRjLikKLQlPbiBleGl0LCBpdCBwb2ludHMgdG8gdGhlIG5leHQgdG9rZW4gYWZ0ZXIgdGhlIG1hbmdsZWQgY2xhc3Mgb24KLQlzdWNjZXNzLCBvciB0aGUgZmlyc3QgdW5jb25zdW1lZCB0b2tlbiBvbiBmYWlsdXJlLgotCi0JSWYgdGhlIENPTlNUUlVDVE9SIG9yIERFU1RSVUNUT1IgZmxhZ3MgYXJlIHNldCBpbiBXT1JLLCB0aGVuCi0Jd2UgYXJlIGRlbWFuZ2xpbmcgYSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLiAgSW4gdGhpcyBjYXNlCi0Jd2UgcHJlcGVuZCAiY2xhc3M6OmNsYXNzIiBvciAiY2xhc3M6On5jbGFzcyIgdG8gREVDTFAuCi0KLQlPdGhlcndpc2UsIHdlIHByZXBlbmQgImNsYXNzOjoiIHRvIHRoZSBjdXJyZW50IERFQ0xQLgotCi0JUmVzZXQgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZmxhZ3Mgb25jZSB0aGV5IGhhdmUgYmVlbgotCSJjb25zdW1lZCIuICBUaGlzIGFsbG93cyBkZW1hbmdsZV9jbGFzcyB0byBiZSBjYWxsZWQgbGF0ZXIgZHVyaW5nCi0JdGhlIHNhbWUgZGVtYW5nbGluZywgdG8gZG8gbm9ybWFsIGNsYXNzIGRlbWFuZ2xpbmcuCi0KLQlSZXR1cm5zIDEgaWYgZGVtYW5nbGluZyBpcyBzdWNjZXNzZnVsLCAwIG90aGVyd2lzZS4KLQotKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBzdWNjZXNzID0gMDsKLSAgaW50IGJ0eXBlOwotICBzdHJpbmcgY2xhc3NfbmFtZTsKLSAgY2hhciAqc2F2ZV9jbGFzc19uYW1lX2VuZCA9IDA7Ci0KLSAgc3RyaW5nX2luaXQgKCZjbGFzc19uYW1lKTsKLSAgYnR5cGUgPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0gIGlmIChkZW1hbmdsZV9jbGFzc19uYW1lICh3b3JrLCBtYW5nbGVkLCAmY2xhc3NfbmFtZSkpCi0gICAgewotICAgICAgc2F2ZV9jbGFzc19uYW1lX2VuZCA9IGNsYXNzX25hbWUucDsKLSAgICAgIGlmICgod29yay0+Y29uc3RydWN0b3IgJiAxKSB8fCAod29yay0+ZGVzdHJ1Y3RvciAmIDEpKQotCXsKLSAgICAgICAgICAvKiBhZGp1c3Qgc28gd2UgZG9uJ3QgaW5jbHVkZSB0ZW1wbGF0ZSBhcmdzICovCi0gICAgICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgJiYgKHdvcmstPnRlbXBfc3RhcnQgIT0gLTEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjbGFzc19uYW1lLnAgPSBjbGFzc19uYW1lLmIgKyB3b3JrLT50ZW1wX3N0YXJ0OwotICAgICAgICAgICAgfQotCSAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJmNsYXNzX25hbWUpOwotCSAgaWYgKHdvcmsgLT4gZGVzdHJ1Y3RvciAmIDEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsICJ+Iik7Ci0gICAgICAgICAgICAgIHdvcmsgLT4gZGVzdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3b3JrIC0+IGNvbnN0cnVjdG9yIC09IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBjbGFzc19uYW1lLnAgPSBzYXZlX2NsYXNzX25hbWVfZW5kOwotICAgICAgcmVtZW1iZXJfS3R5cGUgKHdvcmssIGNsYXNzX25hbWUuYiwgTEVOX1NUUklORygmY2xhc3NfbmFtZSkpOwotICAgICAgcmVtZW1iZXJfQnR5cGUgKHdvcmssIGNsYXNzX25hbWUuYiwgTEVOX1NUUklORygmY2xhc3NfbmFtZSksIGJ0eXBlKTsKLSAgICAgIHN0cmluZ19wcmVwZW5kIChkZWNscCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgICBzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmY2xhc3NfbmFtZSk7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gIHN0cmluZ19kZWxldGUgKCZjbGFzc19uYW1lKTsKLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX3ByZWZpeCAtLSBjb25zdW1lIHRoZSBtYW5nbGVkIG5hbWUgcHJlZml4IGFuZCBmaW5kIHNpZ25hdHVyZQotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWRlbWFuZ2xlX3ByZWZpeCAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkJIHN0cmluZyAqZGVjbHApOwotCi1ERVNDUklQVElPTgotCi0JQ29uc3VtZSBhbmQgZGVtYW5nbGUgdGhlIHByZWZpeCBvZiB0aGUgbWFuZ2xlZCBuYW1lLgotCi0JREVDTFAgcG9pbnRzIHRvIHRoZSBzdHJpbmcgYnVmZmVyIGludG8gd2hpY2ggZGVtYW5nbGVkIG91dHB1dCBpcwotCXBsYWNlZC4gIE9uIGVudHJ5LCB0aGUgYnVmZmVyIGlzIGVtcHR5LiAgT24gZXhpdCBpdCBjb250YWlucwotCXRoZSByb290IGZ1bmN0aW9uIG5hbWUsIHRoZSBkZW1hbmdsZWQgb3BlcmF0b3IgbmFtZSwgb3IgaW4gc29tZQotCXNwZWNpYWwgY2FzZXMgZWl0aGVyIG5vdGhpbmcgb3IgdGhlIGNvbXBsZXRlbHkgZGVtYW5nbGVkIHJlc3VsdC4KLQotCU1BTkdMRUQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHBvaW50ZXIgaW50byB0aGUgbWFuZ2xlZCBuYW1lLiAgQXMgZWFjaAotCXRva2VuIG9mIHRoZSBtYW5nbGVkIG5hbWUgaXMgY29uc3VtZWQsIGl0IGlzIHVwZGF0ZWQuICBVcG9uIGVudHJ5Ci0JdGhlIGN1cnJlbnQgbWFuZ2xlZCBuYW1lIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKLQl0aGUgbWFuZ2xlZCBuYW1lLiAgVXBvbiBleGl0LCBpdCBzaG91bGQgcG9pbnQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgotCW9mIHRoZSBzaWduYXR1cmUgaWYgZGVtYW5nbGluZyB3YXMgc3VjY2Vzc2Z1bCwgb3IgdG8gdGhlIGZpcnN0Ci0JdW5jb25zdW1lZCBjaGFyYWN0ZXIgaWYgZGVtYW5nbGluZyBvZiB0aGUgcHJlZml4IHdhcyB1bnN1Y2Nlc3NmdWwuCi0KLQlSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvdGhlcndpc2UuCi0gKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfcHJlZml4ICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNvbnN0IGNoYXIgKnNjYW47Ci0gIGludCBpOwotCi0gIGlmIChzdHJsZW4oKm1hbmdsZWQpID4gNgotICAgICAgJiYgKHN0cm5jbXAoKm1hbmdsZWQsICJfaW1wX18iLCA2KSA9PSAwCi0gICAgICAgICAgfHwgc3RybmNtcCgqbWFuZ2xlZCwgIl9faW1wXyIsIDYpID09IDApKQotICAgIHsKLSAgICAgIC8qIGl0J3MgYSBzeW1ib2wgaW1wb3J0ZWQgZnJvbSBhIFBFIGR5bmFtaWMgbGlicmFyeS4gQ2hlY2sgZm9yIGJvdGgKLSAgICAgICAgIG5ldyBzdHlsZSBwcmVmaXggX2ltcF9fIGFuZCBsZWdhY3kgX19pbXBfIHVzZWQgYnkgb2xkZXIgdmVyc2lvbnMKLQkgb2YgZGxsdG9vbC4gKi8KLSAgICAgICgqbWFuZ2xlZCkgKz0gNjsKLSAgICAgIHdvcmstPmRsbGltcG9ydGVkID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmxlbigqbWFuZ2xlZCkgPj0gMTEgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9HTE9CQUxfIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICptYXJrZXIgPSBzdHJjaHIgKGNwbHVzX21hcmtlcnMsICgqbWFuZ2xlZClbOF0pOwotICAgICAgaWYgKG1hcmtlciAhPSBOVUxMICYmICptYXJrZXIgPT0gKCptYW5nbGVkKVsxMF0pCi0JewotCSAgaWYgKCgqbWFuZ2xlZClbOV0gPT0gJ0QnKQotCSAgICB7Ci0JICAgICAgLyogaXQncyBhIEdOVSBnbG9iYWwgZGVzdHJ1Y3RvciB0byBiZSBleGVjdXRlZCBhdCBwcm9ncmFtIGV4aXQgKi8KLQkgICAgICAoKm1hbmdsZWQpICs9IDExOwotCSAgICAgIHdvcmstPmRlc3RydWN0b3IgPSAyOwotCSAgICAgIGlmIChnbnVfc3BlY2lhbCAod29yaywgbWFuZ2xlZCwgZGVjbHApKQotCQlyZXR1cm4gc3VjY2VzczsKLQkgICAgfQotCSAgZWxzZSBpZiAoKCptYW5nbGVkKVs5XSA9PSAnSScpCi0JICAgIHsKLQkgICAgICAvKiBpdCdzIGEgR05VIGdsb2JhbCBjb25zdHJ1Y3RvciB0byBiZSBleGVjdXRlZCBhdCBwcm9ncmFtIGluaXQgKi8KLQkgICAgICAoKm1hbmdsZWQpICs9IDExOwotCSAgICAgIHdvcmstPmNvbnN0cnVjdG9yID0gMjsKLQkgICAgICBpZiAoZ251X3NwZWNpYWwgKHdvcmssIG1hbmdsZWQsIGRlY2xwKSkKLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9fc3RkX18iLCA3KSA9PSAwKQotICAgIHsKLSAgICAgIC8qIGl0J3MgYSBBUk0gZ2xvYmFsIGRlc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBleGl0ICovCi0gICAgICAoKm1hbmdsZWQpICs9IDc7Ci0gICAgICB3b3JrLT5kZXN0cnVjdG9yID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKChBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiBzdHJuY21wKCptYW5nbGVkLCAiX19zdGlfXyIsIDcpID09IDApCi0gICAgewotICAgICAgLyogaXQncyBhIEFSTSBnbG9iYWwgY29uc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBpbml0aWFsICovCi0gICAgICAoKm1hbmdsZWQpICs9IDc7Ci0gICAgICB3b3JrLT5jb25zdHJ1Y3RvciA9IDI7Ci0gICAgfQotCi0gIC8qICBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgYSByZWR1Y3Rpb24gaW4gc3RyZW5ndGggdGltZSBvcHRpbWl6YXRpb24KLSAgICAgIG9mOgotICAgICAgc2NhbiA9IG15c3Ryc3RyICgqbWFuZ2xlZCwgIl9fIik7ICovCi0KLSAgewotICAgIHNjYW4gPSAqbWFuZ2xlZDsKLQotICAgIGRvIHsKLSAgICAgIHNjYW4gPSBzdHJjaHIgKHNjYW4sICdfJyk7Ci0gICAgfSB3aGlsZSAoc2NhbiAhPSBOVUxMICYmICorK3NjYW4gIT0gJ18nKTsKLQotICAgIGlmIChzY2FuICE9IE5VTEwpIC0tc2NhbjsKLSAgfQotCi0gIGlmIChzY2FuICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgZm91bmQgYSBzZXF1ZW5jZSBvZiB0d28gb3IgbW9yZSAnXycsIGVuc3VyZSB0aGF0IHdlIHN0YXJ0IGF0Ci0JIHRoZSBsYXN0IHBhaXIgaW4gdGhlIHNlcXVlbmNlLiAgKi8KLSAgICAgIGkgPSBzdHJzcG4gKHNjYW4sICJfIik7Ci0gICAgICBpZiAoaSA+IDIpCi0JewotCSAgc2NhbiArPSAoaSAtIDIpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNjYW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHdvcmsgLT4gc3RhdGljX3R5cGUpCi0gICAgewotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzBdKSAmJiAoc2NhblswXSAhPSAndCcpKQotCXsKLQkgIHN1Y2Nlc3MgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKChzY2FuID09ICptYW5nbGVkKQotCSAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzJdKSB8fCAoc2NhblsyXSA9PSAnUScpCi0JICAgICAgIHx8IChzY2FuWzJdID09ICd0JykgfHwgKHNjYW5bMl0gPT0gJ0snKSB8fCAoc2NhblsyXSA9PSAnSCcpKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgQVJNIHNheXMgbm90aGluZyBhYm91dCB0aGUgbWFuZ2xpbmcgb2YgbG9jYWwgdmFyaWFibGVzLgotCSBCdXQgY2Zyb250IG1hbmdsZXMgbG9jYWwgdmFyaWFibGVzIGJ5IHByZXBlbmRpbmcgX188bmVzdGluZ19sZXZlbD4KLQkgdG8gdGhlbS4gQXMgYW4gZXh0ZW5zaW9uIHRvIEFSTSBkZW1hbmdsaW5nIHdlIGhhbmRsZSB0aGlzIGNhc2UuICAqLwotICAgICAgaWYgKChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcpCi0JICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzJdKSkKLQl7Ci0JICAqbWFuZ2xlZCA9IHNjYW4gKyAyOwotCSAgY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQpOwotCSAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7Ci0JICBzdWNjZXNzID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBHTlUgc3R5bGUgY29uc3RydWN0b3Igc3RhcnRzIHdpdGggX19bMC05UXRdLiAgQnV0IGNmcm9udCB1c2VzCi0JICAgICBuYW1lcyBsaWtlIF9fUTJfM2ZvbzNiYXIgZm9yIG5lc3RlZCB0eXBlIG5hbWVzLiAgU28gZG9uJ3QgYWNjZXB0Ci0JICAgICB0aGlzIHN0eWxlIG9mIGNvbnN0cnVjdG9yIGZvciBjZnJvbnQgZGVtYW5nbGluZy4gIEEgR05VCi0JICAgICBzdHlsZSBtZW1iZXItdGVtcGxhdGUgY29uc3RydWN0b3Igc3RhcnRzIHdpdGggJ0gnLiAqLwotCSAgaWYgKCEoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSkKLQkgICAgd29yayAtPiBjb25zdHJ1Y3RvciArPSAxOwotCSAgKm1hbmdsZWQgPSBzY2FuICsgMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChBUk1fREVNQU5HTElORyAmJiBzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICd0JykKLSAgICB7Ci0gICAgICAvKiBDZnJvbnQtc3R5bGUgcGFyYW1ldGVyaXplZCB0eXBlLiAgSGFuZGxlZCBsYXRlciBhcyBhIHNpZ25hdHVyZS4gKi8KLSAgICAgIHN1Y2Nlc3MgPSAxOwotCi0gICAgICAvKiBBUk0gdGVtcGxhdGU/ICovCi0gICAgICBkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIHN0cmxlbiAoKm1hbmdsZWQpLCBkZWNscCk7Ci0gICAgfQotICBlbHNlIGlmIChFREdfREVNQU5HTElORyAmJiAoKHNjYW5bMl0gPT0gJ3QnICYmIHNjYW5bM10gPT0gJ20nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNjYW5bMl0gPT0gJ3AnICYmIHNjYW5bM10gPT0gJ3MnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNjYW5bMl0gPT0gJ3AnICYmIHNjYW5bM10gPT0gJ3QnKSkpCi0gICAgewotICAgICAgLyogRURHLXN0eWxlIHBhcmFtZXRlcml6ZWQgdHlwZS4gIEhhbmRsZWQgbGF0ZXIgYXMgYSBzaWduYXR1cmUuICovCi0gICAgICBzdWNjZXNzID0gMTsKLQotICAgICAgLyogRURHIHRlbXBsYXRlPyAqLwotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBzdHJsZW4gKCptYW5nbGVkKSwgZGVjbHApOwotICAgIH0KLSAgZWxzZSBpZiAoKHNjYW4gPT0gKm1hbmdsZWQpICYmICFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzJdKQotCSAgICYmIChzY2FuWzJdICE9ICd0JykpCi0gICAgewotICAgICAgLyogTWFuZ2xlZCBuYW1lIHN0YXJ0cyB3aXRoICJfXyIuICBTa2lwIG92ZXIgYW55IGxlYWRpbmcgJ18nIGNoYXJhY3RlcnMsCi0JIHRoZW4gZmluZCB0aGUgbmV4dCAiX18iIHRoYXQgc2VwYXJhdGVzIHRoZSBwcmVmaXggZnJvbSB0aGUgc2lnbmF0dXJlLgotCSAqLwotICAgICAgaWYgKCEoQVJNX0RFTUFOR0xJTkcgfHwgTFVDSURfREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgfHwgKGFybV9zcGVjaWFsIChtYW5nbGVkLCBkZWNscCkgPT0gMCkpCi0JewotCSAgd2hpbGUgKCpzY2FuID09ICdfJykKLQkgICAgewotCSAgICAgIHNjYW4rKzsKLQkgICAgfQotCSAgaWYgKChzY2FuID0gbXlzdHJzdHIgKHNjYW4sICJfXyIpKSA9PSBOVUxMIHx8ICgqKHNjYW4gKyAyKSA9PSAnXDAnKSkKLQkgICAgewotCSAgICAgIC8qIE5vIHNlcGFyYXRvciAoSS5FLiAiX19ub3RfbWFuZ2xlZCIpLCBvciBlbXB0eSBzaWduYXR1cmUKLQkJIChJLkUuICJfX25vdF9tYW5nbGVkX2VpdGhlcl9fIikgKi8KLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqdG1wOwotCi0gICAgICAgICAgICAgIC8qIExvb2sgZm9yIHRoZSBMQVNUIG9jY3VycmVuY2Ugb2YgX18sIGFsbG93aW5nIG5hbWVzIHRvCi0gICAgICAgICAgICAgICAgIGhhdmUgdGhlICdfXycgc2VxdWVuY2UgZW1iZWRkZWQgaW4gdGhlbS4gKi8KLQkgICAgICBpZiAoIShBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HKSkKLQkJewotCQkgIHdoaWxlICgodG1wID0gbXlzdHJzdHIgKHNjYW4gKyAyLCAiX18iKSkgIT0gTlVMTCkKLQkJICAgIHNjYW4gPSB0bXA7Ci0JCX0KLQkgICAgICBpZiAoKihzY2FuICsgMikgPT0gJ1wwJykKLQkJc3VjY2VzcyA9IDA7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2Nhbik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmICgqKHNjYW4gKyAyKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIC8qIE1hbmdsZWQgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICJfXyIgYnV0IGRvZXMgaGF2ZSBvbmUgc29tZXdoZXJlCi0JIGluIHRoZXJlIHdpdGggbm9uIGVtcHR5IHN0dWZmIGFmdGVyIGl0LiAgTG9va3MgbGlrZSBhIGdsb2JhbAotCSBmdW5jdGlvbiBuYW1lLiAgKi8KLSAgICAgIGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCBzY2FuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBEb2Vzbid0IGxvb2sgbGlrZSBhIG1hbmdsZWQgbmFtZSAqLwotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotCi0gIGlmICghc3VjY2VzcyAmJiAod29yay0+Y29uc3RydWN0b3IgPT0gMiB8fCB3b3JrLT5kZXN0cnVjdG9yID09IDIpKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAqbWFuZ2xlZCk7Ci0gICAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWdudV9zcGVjaWFsIC0tIHNwZWNpYWwgaGFuZGxpbmcgb2YgZ251IG1hbmdsZWQgc3RyaW5ncwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWdudV9zcGVjaWFsIChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCSAgICAgc3RyaW5nICpkZWNscCk7Ci0KLQotREVTQ1JJUFRJT04KLQotCVByb2Nlc3Mgc29tZSBzcGVjaWFsIEdOVSBzdHlsZSBtYW5nbGluZyBmb3JtcyB0aGF0IGRvbid0IGZpdAotCXRoZSBub3JtYWwgcGF0dGVybi4gIEZvciBleGFtcGxlOgotCi0JCV8kXzNmb28JCShkZXN0cnVjdG9yIGZvciBjbGFzcyBmb28pCi0JCV92dCRmb28JCShmb28gdmlydHVhbCB0YWJsZSkKLQkJX3Z0JGZvbyRiYXIJKGZvbzo6YmFyIHZpcnR1YWwgdGFibGUpCi0JCV9fdnRfZm9vCShmb28gdmlydHVhbCB0YWJsZSwgbmV3IHN0eWxlIHdpdGggdGh1bmtzKQotCQlfM2ZvbyR2YXJuYW1lCShzdGF0aWMgZGF0YSBtZW1iZXIpCi0JCV9RMjJyczJ0dSR2dwkoc3RhdGljIGRhdGEgbWVtYmVyKQotCQlfX3Q2dmVjdG9yMVppaQkoY29uc3RydWN0b3Igd2l0aCB0ZW1wbGF0ZSkKLQkJX190aHVua180X18kXzdvc3RyZWFtICh2aXJ0dWFsIGZ1bmN0aW9uIHRodW5rKQotICovCi0KLXN0YXRpYyBpbnQKLWdudV9zcGVjaWFsICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgbjsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpwOwotCi0gIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJwotICAgICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzFdKSAhPSBOVUxMCi0gICAgICAmJiAoKm1hbmdsZWQpWzJdID09ICdfJykKLSAgICB7Ci0gICAgICAvKiBGb3VuZCBhIEdOVSBzdHlsZSBkZXN0cnVjdG9yLCBnZXQgcGFzdCAiXzxDUExVU19NQVJLRVI+XyIgKi8KLSAgICAgICgqbWFuZ2xlZCkgKz0gMzsKLSAgICAgIHdvcmsgLT4gZGVzdHJ1Y3RvciArPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycKLQkgICAmJiAoKCgqbWFuZ2xlZClbMV0gPT0gJ18nCi0JCSYmICgqbWFuZ2xlZClbMl0gPT0gJ3YnCi0JCSYmICgqbWFuZ2xlZClbM10gPT0gJ3QnCi0JCSYmICgqbWFuZ2xlZClbNF0gPT0gJ18nKQotCSAgICAgICB8fCAoKCptYW5nbGVkKVsxXSA9PSAndicKLQkJICAgJiYgKCptYW5nbGVkKVsyXSA9PSAndCcKLQkJICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzNdKSAhPSBOVUxMKSkpCi0gICAgewotICAgICAgLyogRm91bmQgYSBHTlUgc3R5bGUgdmlydHVhbCB0YWJsZSwgZ2V0IHBhc3QgIl92dDxDUExVU19NQVJLRVI+IgotICAgICAgICAgYW5kIGNyZWF0ZSB0aGUgZGVjbC4gIE5vdGUgdGhhdCB3ZSBjb25zdW1lIHRoZSBlbnRpcmUgbWFuZ2xlZAotCSBpbnB1dCBzdHJpbmcsIHdoaWNoIG1lYW5zIHRoYXQgZGVtYW5nbGVfc2lnbmF0dXJlIGhhcyBubyB3b3JrCi0JIHRvIGRvLiAgKi8KLSAgICAgIGlmICgoKm1hbmdsZWQpWzJdID09ICd2JykKLQkoKm1hbmdsZWQpICs9IDU7IC8qIE5ldyBzdHlsZSwgd2l0aCB0aHVua3M6ICJfX3Z0XyIgKi8KLSAgICAgIGVsc2UKLQkoKm1hbmdsZWQpICs9IDQ7IC8qIE9sZCBzdHlsZSwgbm8gdGh1bmtzOiAiX3Z0PENQTFVTX01BUktFUj4iICovCi0gICAgICB3aGlsZSAoKiptYW5nbGVkICE9ICdcMCcpCi0JewotCSAgc3dpdGNoICgqKm1hbmdsZWQpCi0JICAgIHsKLQkgICAgY2FzZSAnUSc6Ci0JICAgIGNhc2UgJ0snOgotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAndCc6Ci0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwKLQkJCQkJICAgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKm1hbmdsZWRbMF0pKQotCQl7Ci0JCSAgbiA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCk7Ci0JCSAgLyogV2UgbWF5IGJlIHNlZWluZyBhIHRvby1sYXJnZSBzaXplLCBvciBlbHNlIGEKLQkJICAgICAiLjxkaWdpdHM+IiBpbmRpY2F0aW5nIGEgc3RhdGljIGxvY2FsIHN5bWJvbC4gIEluCi0JCSAgICAgYW55IGNhc2UsIGRlY2xhcmUgdmljdG9yeSBhbmQgbW92ZSBvbjsgKmRvbid0KiB0cnkKLQkJICAgICB0byB1c2UgbiB0byBhbGxvY2F0ZS4gICovCi0JCSAgaWYgKG4gPiAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSkKLQkJICAgIHsKLQkJICAgICAgc3VjY2VzcyA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbiA9IHN0cmNzcG4gKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKTsKLQkJfQotCSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgICAgICgqbWFuZ2xlZCkgKz0gbjsKLQkgICAgfQotCi0JICBwID0gc3RycGJyayAoKm1hbmdsZWQsIGNwbHVzX21hcmtlcnMpOwotCSAgaWYgKHN1Y2Nlc3MgJiYgKChwID09IE5VTEwpIHx8IChwID09ICptYW5nbGVkKSkpCi0JICAgIHsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQl7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIFNDT1BFX1NUUklORyAod29yaykpOwotCQkgICgqbWFuZ2xlZCkrKzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzdWNjZXNzKQotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCAiIHZpcnR1YWwgdGFibGUiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nCi0JICAgJiYgKHN0cmNocigiMDEyMzQ1Njc4OVF0IiwgKCptYW5nbGVkKVsxXSkgIT0gTlVMTCkKLQkgICAmJiAocCA9IHN0cnBicmsgKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBzdGF0aWMgZGF0YSBtZW1iZXIsICJfM2ZvbyR2YXJuYW1lIiBmb3IgZXhhbXBsZSAqLwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCWNhc2UgJ1EnOgotCWNhc2UgJ0snOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxLCAxKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICBpZiAobiA8IDAgfHwgbiA+IChsb25nKSBzdHJsZW4gKCptYW5nbGVkKSkKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICgqbWFuZ2xlZCkgKz0gbjsKLQl9Ci0gICAgICBpZiAoc3VjY2VzcyAmJiAocCA9PSAqbWFuZ2xlZCkpCi0JewotCSAgLyogQ29uc3VtZWQgZXZlcnl0aGluZyB1cCB0byB0aGUgY3BsdXNfbWFya2VyLCBhcHBlbmQgdGhlCi0JICAgICB2YXJpYWJsZSBuYW1lLiAgKi8KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkgIG4gPSBzdHJsZW4gKCptYW5nbGVkKTsKLQkgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgKCptYW5nbGVkKSArPSBuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdWNjZXNzID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgIl9fdGh1bmtfIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZGVsdGE7Ci0KLSAgICAgICgqbWFuZ2xlZCkgKz0gODsKLSAgICAgIGRlbHRhID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICBpZiAoZGVsdGEgPT0gLTEpCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqbWV0aG9kID0gaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgKHdvcmssICsrKm1hbmdsZWQpOwotCi0JICBpZiAobWV0aG9kKQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbNTBdOwotCSAgICAgIHNwcmludGYgKGJ1ZiwgInZpcnR1YWwgZnVuY3Rpb24gdGh1bmsgKGRlbHRhOiVkKSBmb3IgIiwgLWRlbHRhKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgYnVmKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgbWV0aG9kKTsKLQkgICAgICBmcmVlIChtZXRob2QpOwotCSAgICAgIG4gPSBzdHJsZW4gKCptYW5nbGVkKTsKLQkgICAgICAoKm1hbmdsZWQpICs9IG47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoKm1hbmdsZWQsICJfX3QiLCAzKSA9PSAwCi0JICAgJiYgKCgqbWFuZ2xlZClbM10gPT0gJ2knIHx8ICgqbWFuZ2xlZClbM10gPT0gJ2YnKSkKLSAgICB7Ci0gICAgICBwID0gKCptYW5nbGVkKVszXSA9PSAnaScgPyAiIHR5cGVfaW5mbyBub2RlIiA6ICIgdHlwZV9pbmZvIGZ1bmN0aW9uIjsKLSAgICAgICgqbWFuZ2xlZCkgKz0gNDsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdRJzoKLQljYXNlICdLJzoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwgMSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHN1Y2Nlc3MgJiYgKiptYW5nbGVkICE9ICdcMCcpCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBpZiAoc3VjY2VzcykKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgdm9pZAotcmVjdXJzaXZlbHlfZGVtYW5nbGUod29yaywgbWFuZ2xlZCwgcmVzdWx0LCBuYW1lbGVuZ3RoKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotICAgICBpbnQgbmFtZWxlbmd0aDsKLXsKLSAgY2hhciAqIHJlY3Vyc2UgPSAoY2hhciAqKU5VTEw7Ci0gIGNoYXIgKiByZWN1cnNlX2RlbSA9IChjaGFyICopTlVMTDsKLQotICByZWN1cnNlID0gKGNoYXIgKikgeG1hbGxvYyAobmFtZWxlbmd0aCArIDEpOwotICBtZW1jcHkgKHJlY3Vyc2UsICptYW5nbGVkLCBuYW1lbGVuZ3RoKTsKLSAgcmVjdXJzZVtuYW1lbGVuZ3RoXSA9ICdcMDAwJzsKLQotICByZWN1cnNlX2RlbSA9IGNwbHVzX2RlbWFuZ2xlIChyZWN1cnNlLCB3b3JrLT5vcHRpb25zKTsKLQotICBpZiAocmVjdXJzZV9kZW0pCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCByZWN1cnNlX2RlbSk7Ci0gICAgICBmcmVlIChyZWN1cnNlX2RlbSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKHJlc3VsdCwgKm1hbmdsZWQsIG5hbWVsZW5ndGgpOwotICAgIH0KLSAgZnJlZSAocmVjdXJzZSk7Ci0gICptYW5nbGVkICs9IG5hbWVsZW5ndGg7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlhcm1fc3BlY2lhbCAtLSBzcGVjaWFsIGhhbmRsaW5nIG9mIEFSTS9sdWNpZCBtYW5nbGVkIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlhcm1fc3BlY2lhbCAoY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCSAgICAgc3RyaW5nICpkZWNscCk7Ci0KLQotREVTQ1JJUFRJT04KLQotCVByb2Nlc3Mgc29tZSBzcGVjaWFsIEFSTSBzdHlsZSBtYW5nbGluZyBmb3JtcyB0aGF0IGRvbid0IGZpdAotCXRoZSBub3JtYWwgcGF0dGVybi4gIEZvciBleGFtcGxlOgotCi0JCV9fdnRibF9fM2ZvbwkJKGZvbyB2aXJ0dWFsIHRhYmxlKQotCQlfX3Z0YmxfXzNmb29fXzNiYXIJKGJhcjo6Zm9vIHZpcnR1YWwgdGFibGUpCi0KLSAqLwotCi1zdGF0aWMgaW50Ci1hcm1fc3BlY2lhbCAobWFuZ2xlZCwgZGVjbHApCi0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgbjsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpzY2FuOwotCi0gIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgQVJNX1ZUQUJMRV9TVFJJTkcsIEFSTV9WVEFCTEVfU1RSTEVOKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEZvdW5kIGEgQVJNIHN0eWxlIHZpcnR1YWwgdGFibGUsIGdldCBwYXN0IEFSTV9WVEFCTEVfU1RSSU5HCi0gICAgICAgICBhbmQgY3JlYXRlIHRoZSBkZWNsLiAgTm90ZSB0aGF0IHdlIGNvbnN1bWUgdGhlIGVudGlyZSBtYW5nbGVkCi0JIGlucHV0IHN0cmluZywgd2hpY2ggbWVhbnMgdGhhdCBkZW1hbmdsZV9zaWduYXR1cmUgaGFzIG5vIHdvcmsKLQkgdG8gZG8uICAqLwotICAgICAgc2NhbiA9ICptYW5nbGVkICsgQVJNX1ZUQUJMRV9TVFJMRU47Ci0gICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgICAgICAgIC8qIGZpcnN0IGNoZWNrIGl0IGNhbiBiZSBkZW1hbmdsZWQgKi8KLSAgICAgICAgewotICAgICAgICAgIG4gPSBjb25zdW1lX2NvdW50ICgmc2Nhbik7Ci0gICAgICAgICAgaWYgKG4gPT0gLTEpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKDApOyAgICAgICAgICAgLyogbm8gZ29vZCAqLwotCSAgICB9Ci0gICAgICAgICAgc2NhbiArPSBuOwotICAgICAgICAgIGlmIChzY2FuWzBdID09ICdfJyAmJiBzY2FuWzFdID09ICdfJykKLQkgICAgewotCSAgICAgIHNjYW4gKz0gMjsKLQkgICAgfQotICAgICAgICB9Ci0gICAgICAoKm1hbmdsZWQpICs9IEFSTV9WVEFCTEVfU1RSTEVOOwotICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAhPSAnXDAnKQotCXsKLQkgIG4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgICAgICBpZiAobiA9PSAtMQotCSAgICAgIHx8IG4gPiAobG9uZykgc3RybGVuICgqbWFuZ2xlZCkpCi0JICAgIHJldHVybiAwOwotCSAgc3RyaW5nX3ByZXBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgKCptYW5nbGVkKSArPSBuOwotCSAgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nICYmICgqbWFuZ2xlZClbMV0gPT0gJ18nKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKGRlY2xwLCAiOjoiKTsKLQkgICAgICAoKm1hbmdsZWQpICs9IDI7Ci0JICAgIH0KLQl9Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIiB2aXJ0dWFsIHRhYmxlIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZGVtYW5nbGVfcXVhbGlmaWVkIC0tIGRlbWFuZ2xlICdRJyBxdWFsaWZpZWQgbmFtZSBzdHJpbmdzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZGVtYW5nbGVfcXVhbGlmaWVkIChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICptYW5nbGVkLAotCQkJICAgIHN0cmluZyAqcmVzdWx0LCBpbnQgaXNmdW5jbmFtZSwgaW50IGFwcGVuZCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlEZW1hbmdsZSBhIHF1YWxpZmllZCBuYW1lLCBzdWNoIGFzICJRMjVPdXRlcjVJbm5lciIgd2hpY2ggaXMKLQl0aGUgbWFuZ2xlZCBmb3JtIG9mICJPdXRlcjo6SW5uZXIiLiAgVGhlIGRlbWFuZ2xlZCBvdXRwdXQgaXMKLQlwcmVwZW5kZWQgb3IgYXBwZW5kZWQgdG8gdGhlIHJlc3VsdCBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZQotCXN0YXRlIG9mIHRoZSBhcHBlbmQgZmxhZy4KLQotCUlmIGlzZnVuY25hbWUgaXMgbm9uemVybywgdGhlbiB0aGUgcXVhbGlmaWVkIG5hbWUgd2UgYXJlIGJ1aWxkaW5nCi0JaXMgZ29pbmcgdG8gYmUgdXNlZCBhcyBhIG1lbWJlciBmdW5jdGlvbiBuYW1lLCBzbyBpZiBpdCBpcyBhCi0JY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBmdW5jdGlvbiwgYXBwZW5kIGFuIGFwcHJvcHJpYXRlCi0JY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lLiAgSS5FLiBmb3IgdGhlIGFib3ZlIGV4YW1wbGUsCi0JdGhlIHJlc3VsdCBmb3IgdXNlIGFzIGEgY29uc3RydWN0b3IgaXMgIk91dGVyOjpJbm5lcjo6SW5uZXIiCi0JYW5kIHRoZSByZXN1bHQgZm9yIHVzZSBhcyBhIGRlc3RydWN0b3IgaXMgIk91dGVyOjpJbm5lcjo6fklubmVyIi4KLQotQlVHUwotCi0JTnVtZXJpYyBjb252ZXJzaW9uIGlzIEFTQ0lJIGRlcGVuZGVudCAoRklYTUUpLgotCi0gKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCByZXN1bHQsIGlzZnVuY25hbWUsIGFwcGVuZCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLSAgICAgaW50IGlzZnVuY25hbWU7Ci0gICAgIGludCBhcHBlbmQ7Ci17Ci0gIGludCBxdWFsaWZpZXJzID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjaGFyIG51bVsyXTsKLSAgc3RyaW5nIHRlbXA7Ci0gIHN0cmluZyBsYXN0X25hbWU7Ci0gIGludCBiaW5kZXggPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0KLSAgLyogV2Ugb25seSBtYWtlIHVzZSBvZiBJU0ZVTkNOQU1FIGlmIHRoZSBlbnRpdHkgaXMgYSBjb25zdHJ1Y3RvciBvcgotICAgICBkZXN0cnVjdG9yLiAgKi8KLSAgaXNmdW5jbmFtZSA9IChpc2Z1bmNuYW1lCi0JCSYmICgod29yay0+Y29uc3RydWN0b3IgJiAxKSB8fCAod29yay0+ZGVzdHJ1Y3RvciAmIDEpKSk7Ci0KLSAgc3RyaW5nX2luaXQgKCZ0ZW1wKTsKLSAgc3RyaW5nX2luaXQgKCZsYXN0X25hbWUpOwotCi0gIGlmICgoKm1hbmdsZWQpWzBdID09ICdLJykKLSAgICB7Ci0gICAgLyogU3F1YW5nbGluZyBxdWFsaWZpZWQgbmFtZSByZXVzZSAqLwotICAgICAgaW50IGlkeDsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0gICAgICBpZiAoaWR4ID09IC0xIHx8IGlkeCA+PSB3b3JrIC0+IG51bWspCi0gICAgICAgIHN1Y2Nlc3MgPSAwOwotICAgICAgZWxzZQotICAgICAgICBzdHJpbmdfYXBwZW5kICgmdGVtcCwgd29yayAtPiBrdHlwZXZlY1tpZHhdKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzd2l0Y2ggKCgqbWFuZ2xlZClbMV0pCi0gICAgewotICAgIGNhc2UgJ18nOgotICAgICAgLyogR05VIG1hbmdsZWQgbmFtZSB3aXRoIG1vcmUgdGhhbiA5IGNsYXNzZXMuICBUaGUgY291bnQgaXMgcHJlY2VkZWQKLQkgYnkgYW4gdW5kZXJzY29yZSAodG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSB0aGUgPD0gOSBjYXNlKSBhbmQgZm9sbG93ZWQKLQkgYnkgYW4gdW5kZXJzY29yZS4gICovCi0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBxdWFsaWZpZXJzID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLSAgICAgIGlmIChxdWFsaWZpZXJzID09IC0xKQotCXN1Y2Nlc3MgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIC8qIFRoZSBjb3VudCBpcyBpbiBhIHNpbmdsZSBkaWdpdC4gICovCi0gICAgICBudW1bMF0gPSAoKm1hbmdsZWQpWzFdOwotICAgICAgbnVtWzFdID0gJ1wwJzsKLSAgICAgIHF1YWxpZmllcnMgPSBhdG9pIChudW0pOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBhbiB1bmRlcnNjb3JlIGFmdGVyIHRoZSBkaWdpdCwgc2tpcCBpdC4gIFRoaXMgaXMKLQkgc2FpZCB0byBiZSBmb3IgQVJNLXF1YWxpZmllZCBuYW1lcywgYnV0IHRoZSBBUk0gbWFrZXMgbm8KLQkgbWVudGlvbiBvZiBzdWNoIGFuIHVuZGVyc2NvcmUuICBQZXJoYXBzIGNmcm9udCB1c2VzIG9uZS4gICovCi0gICAgICBpZiAoKCptYW5nbGVkKVsyXSA9PSAnXycpCi0JewotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgICgqbWFuZ2xlZCkgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLQotICBpZiAoIXN1Y2Nlc3MpCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci0KLSAgLyogUGljayBvZmYgdGhlIG5hbWVzIGFuZCBjb2xsZWN0IHRoZW0gaW4gdGhlIHRlbXAgYnVmZmVyIGluIHRoZSBvcmRlcgotICAgICBpbiB3aGljaCB0aGV5IGFyZSBmb3VuZCwgc2VwYXJhdGVkIGJ5ICc6OicuICAqLwotCi0gIHdoaWxlIChxdWFsaWZpZXJzLS0gPiAwKQotICAgIHsKLSAgICAgIGludCByZW1lbWJlcl9LID0gMTsKLSAgICAgIHN0cmluZ19jbGVhciAoJmxhc3RfbmFtZSk7Ci0KLSAgICAgIGlmICgqbWFuZ2xlZFswXSA9PSAnXycpCi0JKCptYW5nbGVkKSsrOwotCi0gICAgICBpZiAoKm1hbmdsZWRbMF0gPT0gJ3QnKQotCXsKLQkgIC8qIEhlcmUgd2UgYWx3YXlzIGFwcGVuZCB0byBURU1QIHNpbmNlIHdlIHdpbGwgd2FudCB0byB1c2UKLQkgICAgIHRoZSB0ZW1wbGF0ZSBuYW1lIHdpdGhvdXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXMgYQotCSAgICAgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lLiAgVGhlIGFwcHJvcHJpYXRlCi0JICAgICAocGFyYW1ldGVyLWxlc3MpIHZhbHVlIGlzIHJldHVybmVkIGJ5IGRlbWFuZ2xlX3RlbXBsYXRlCi0JICAgICBpbiBMQVNUX05BTUUuICBXZSBkbyBub3QgcmVtZW1iZXIgdGhlIHRlbXBsYXRlIHR5cGUgaGVyZSwKLQkgICAgIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBHKysgbWFuZ2xpbmcgYWxnb3JpdGhtLiAgKi8KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSh3b3JrLCBtYW5nbGVkLCAmdGVtcCwKLQkJCQkgICAgICAmbGFzdF9uYW1lLCAxLCAwKTsKLQkgIGlmICghc3VjY2VzcykKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgZWxzZSBpZiAoKm1hbmdsZWRbMF0gPT0gJ0snKQotCXsKLSAgICAgICAgICBpbnQgaWR4OwotICAgICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotICAgICAgICAgIGlmIChpZHggPT0gLTEgfHwgaWR4ID49IHdvcmstPm51bWspCi0gICAgICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmdGVtcCwgd29yay0+a3R5cGV2ZWNbaWR4XSk7Ci0gICAgICAgICAgcmVtZW1iZXJfSyA9IDA7Ci0KLQkgIGlmICghc3VjY2VzcykgYnJlYWs7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChFREdfREVNQU5HTElORykKLSAgICAgICAgICAgIHsKLQkgICAgICBpbnQgbmFtZWxlbmd0aDsKLSAJICAgICAgLyogTm93IHJlY3Vyc2l2ZWx5IGRlbWFuZ2xlIHRoZSBxdWFsaWZpZXIKLSAJICAgICAgICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZGVhbCB3aXRoIHRlbXBsYXRlcyBpbgotIAkgICAgICAgKiBtYW5nbGluZyBzdHlsZXMgbGlrZSBFREcgKi8KLQkgICAgICBuYW1lbGVuZ3RoID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICAgICAgaWYgKG5hbWVsZW5ndGggPT0gLTEpCi0JCXsKLQkJICBzdWNjZXNzID0gMDsKLQkJICBicmVhazsKLQkJfQotIAkgICAgICByZWN1cnNpdmVseV9kZW1hbmdsZSh3b3JrLCBtYW5nbGVkLCAmdGVtcCwgbmFtZWxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJmxhc3RfbmFtZSk7Ci0gICAgICAgICAgICAgIGlmICghc3VjY2VzcykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKCZ0ZW1wLCAmbGFzdF9uYW1lKTsKLSAgICAgICAgICAgIH0KLQl9Ci0KLSAgICAgIGlmIChyZW1lbWJlcl9LKQotCXJlbWVtYmVyX0t0eXBlICh3b3JrLCB0ZW1wLmIsIExFTl9TVFJJTkcgKCZ0ZW1wKSk7Ci0KLSAgICAgIGlmIChxdWFsaWZpZXJzID4gMCkKLQlzdHJpbmdfYXBwZW5kICgmdGVtcCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgfQotCi0gIHJlbWVtYmVyX0J0eXBlICh3b3JrLCB0ZW1wLmIsIExFTl9TVFJJTkcgKCZ0ZW1wKSwgYmluZGV4KTsKLQotICAvKiBJZiB3ZSBhcmUgdXNpbmcgdGhlIHJlc3VsdCBhcyBhIGZ1bmN0aW9uIG5hbWUsIHdlIG5lZWQgdG8gYXBwZW5kCi0gICAgIHRoZSBhcHByb3ByaWF0ZSAnOjonIHNlcGFyYXRlZCBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUuCi0gICAgIFdlIGRvIHRoaXMgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIG1vc3QgY29udmVuaWVudCBwbGFjZSwgd2hlcmUKLSAgICAgd2UgYWxyZWFkeSBoYXZlIGEgcG9pbnRlciB0byB0aGUgbmFtZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZS4gICovCi0KLSAgaWYgKGlzZnVuY25hbWUpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgICAgaWYgKHdvcmsgLT4gZGVzdHJ1Y3RvciAmIDEpCi0Jc3RyaW5nX2FwcGVuZCAoJnRlbXAsICJ+Iik7Ci0gICAgICBzdHJpbmdfYXBwZW5kcyAoJnRlbXAsICZsYXN0X25hbWUpOwotICAgIH0KLQotICAvKiBOb3cgZWl0aGVyIHByZXBlbmQgdGhlIHRlbXAgYnVmZmVyIHRvIHRoZSByZXN1bHQsIG9yIGFwcGVuZCBpdCwKLSAgICAgZGVwZW5kaW5nIHVwb24gdGhlIHN0YXRlIG9mIHRoZSBhcHBlbmQgZmxhZy4gICovCi0KLSAgaWYgKGFwcGVuZCkKLSAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmdGVtcCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIVNUUklOR19FTVBUWSAocmVzdWx0KSkKLQlzdHJpbmdfYXBwZW5kICgmdGVtcCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgICBzdHJpbmdfcHJlcGVuZHMgKHJlc3VsdCwgJnRlbXApOwotICAgIH0KLQotICBzdHJpbmdfZGVsZXRlICgmbGFzdF9uYW1lKTsKLSAgc3RyaW5nX2RlbGV0ZSAoJnRlbXApOwotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZ2V0X2NvdW50IC0tIGNvbnZlcnQgYW4gYXNjaWkgY291bnQgdG8gaW50ZWdlciwgY29uc3VtaW5nIHRva2VucwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWdldF9jb3VudCAoY29uc3QgY2hhciAqKnR5cGUsIGludCAqY291bnQpCi0KLURFU0NSSVBUSU9OCi0KLQlBc3N1bWUgdGhhdCAqdHlwZSBwb2ludHMgYXQgYSBjb3VudCBpbiBhIG1hbmdsZWQgbmFtZTsgc2V0Ci0JKmNvdW50IHRvIGl0cyB2YWx1ZSwgYW5kIHNldCAqdHlwZSB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgYWZ0ZXIKLQl0aGUgY291bnQuICBUaGVyZSBhcmUgc29tZSB3ZWlyZCBydWxlcyBpbiBlZmZlY3QgaGVyZS4KLQotCUlmICp0eXBlIGRvZXMgbm90IHBvaW50IGF0IGEgc3RyaW5nIG9mIGRpZ2l0cywgcmV0dXJuIHplcm8uCi0KLQlJZiAqdHlwZSBwb2ludHMgYXQgYSBzdHJpbmcgb2YgZGlnaXRzIGZvbGxvd2VkIGJ5IGFuCi0JdW5kZXJzY29yZSwgc2V0ICpjb3VudCB0byB0aGVpciB2YWx1ZSBhcyBhbiBpbnRlZ2VyLCBhZHZhbmNlCi0JKnR5cGUgdG8gcG9pbnQgKmFmdGVyIHRoZSB1bmRlcnNjb3JlLCBhbmQgcmV0dXJuIDEuCi0KLQlJZiAqdHlwZSBwb2ludHMgYXQgYSBzdHJpbmcgb2YgZGlnaXRzIG5vdCBmb2xsb3dlZCBieSBhbgotCXVuZGVyc2NvcmUsIGNvbnN1bWUgb25seSB0aGUgZmlyc3QgZGlnaXQuICBTZXQgKmNvdW50IHRvIGl0cwotCXZhbHVlIGFzIGFuIGludGVnZXIsIGxlYXZlICp0eXBlIHBvaW50aW5nIGFmdGVyIHRoYXQgZGlnaXQsCi0JYW5kIHJldHVybiAxLgotCi0gICAgICAgIFRoZSBleGN1c2UgZm9yIHRoaXMgb2RkIGJlaGF2aW9yOiBpbiB0aGUgQVJNIGFuZCBIUCBkZW1hbmdsaW5nCi0gICAgICAgIHN0eWxlcywgYSB0eXBlIGNhbiBiZSBmb2xsb3dlZCBieSBhIHJlcGVhdCBjb3VudCBvZiB0aGUgZm9ybQotICAgICAgICBgTnh5Jywgd2hlcmU6Ci0KLSAgICAgICAgYHgnIGlzIGEgc2luZ2xlIGRpZ2l0IHNwZWNpZnlpbmcgaG93IG1hbnkgYWRkaXRpb25hbCBjb3BpZXMKLSAgICAgICAgICAgIG9mIHRoZSB0eXBlIHRvIGFwcGVuZCB0byB0aGUgYXJndW1lbnQgbGlzdCwgYW5kCi0KLSAgICAgICAgYHknIGlzIG9uZSBvciBtb3JlIGRpZ2l0cywgc3BlY2lmeWluZyB0aGUgemVyby1iYXNlZCBpbmRleCBvZgotICAgICAgICAgICAgdGhlIGZpcnN0IHJlcGVhdGVkIGFyZ3VtZW50IGluIHRoZSBsaXN0LiAgWWVzLCBhcyB5b3UncmUKLSAgICAgICAgICAgIHVubWFuZ2xpbmcgdGhlIG5hbWUgeW91IGNhbiBmaWd1cmUgdGhpcyBvdXQgeW91cnNlbGYsIGJ1dAotICAgICAgICAgICAgaXQncyB0aGVyZSBhbnl3YXkuCi0KLSAgICAgICAgU28sIGZvciBleGFtcGxlLCBpbiBgYmFyX18zZm9vRlBpTjUxJywgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEKLSAgICAgICAgcG9pbnRlciB0byBhbiBpbnRlZ2VyIChgUGknKSwgYW5kIHRoZW4gdGhlIG5leHQgZml2ZSBhcmd1bWVudHMKLSAgICAgICAgYXJlIHRoZSBzYW1lIChgTjUnKSwgYW5kIHRoZSBmaXJzdCByZXBlYXQgaXMgdGhlIGZ1bmN0aW9uJ3MKLSAgICAgICAgc2Vjb25kIGFyZ3VtZW50IChgMScpLgotKi8KLQotc3RhdGljIGludAotZ2V0X2NvdW50ICh0eXBlLCBjb3VudCkKLSAgICAgY29uc3QgY2hhciAqKnR5cGU7Ci0gICAgIGludCAqY291bnQ7Ci17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGludCBuOwotCi0gIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKLSAgICByZXR1cm4gKDApOwotICBlbHNlCi0gICAgewotICAgICAgKmNvdW50ID0gKip0eXBlIC0gJzAnOwotICAgICAgKCp0eXBlKSsrOwotICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0JewotCSAgcCA9ICp0eXBlOwotCSAgbiA9ICpjb3VudDsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBuICo9IDEwOwotCSAgICAgIG4gKz0gKnAgLSAnMCc7Ci0JICAgICAgcCsrOwotCSAgICB9Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKnApKTsKLQkgIGlmICgqcCA9PSAnXycpCi0JICAgIHsKLQkgICAgICAqdHlwZSA9IHAgKyAxOwotCSAgICAgICpjb3VudCA9IG47Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKDEpOwotfQotCi0vKiBSRVNVTFQgd2lsbCBiZSBpbml0aWFsaXNlZCBoZXJlOyBpdCB3aWxsIGJlIGZyZWVkIG9uIGZhaWx1cmUuICBUaGUKLSAgIHZhbHVlIHJldHVybmVkIGlzIHJlYWxseSBhIHR5cGVfa2luZF90LiAgKi8KLQotc3RhdGljIGludAotZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICBpbnQgbjsKLSAgaW50IGRvbmU7Ci0gIGludCBzdWNjZXNzOwotICBzdHJpbmcgZGVjbDsKLSAgY29uc3QgY2hhciAqcmVtZW1iZXJlZF90eXBlOwotICBpbnQgdHlwZV9xdWFsczsKLSAgc3RyaW5nIGJ0eXBlOwotICB0eXBlX2tpbmRfdCB0ayA9IHRrX25vbmU7Ci0KLSAgc3RyaW5nX2luaXQgKCZidHlwZSk7Ci0gIHN0cmluZ19pbml0ICgmZGVjbCk7Ci0gIHN0cmluZ19pbml0IChyZXN1bHQpOwotCi0gIGRvbmUgPSAwOwotICBzdWNjZXNzID0gMTsKLSAgd2hpbGUgKHN1Y2Nlc3MgJiYgIWRvbmUpCi0gICAgewotICAgICAgaW50IG1lbWJlcjsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQotCSAgLyogQSBwb2ludGVyIHR5cGUgKi8KLQljYXNlICdQJzoKLQljYXNlICdwJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGlmICghICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX0pBVkEpKQotCSAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIqIik7Ci0JICBpZiAodGsgPT0gdGtfbm9uZSkKLQkgICAgdGsgPSB0a19wb2ludGVyOwotCSAgYnJlYWs7Ci0KLQkgIC8qIEEgcmVmZXJlbmNlIHR5cGUgKi8KLQljYXNlICdSJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIiYiKTsKLQkgIGlmICh0ayA9PSB0a19ub25lKQotCSAgICB0ayA9IHRrX3JlZmVyZW5jZTsKLQkgIGJyZWFrOwotCi0JICAvKiBBbiBhcnJheSAqLwotCWNhc2UgJ0EnOgotCSAgewotCSAgICArKygqbWFuZ2xlZCk7Ci0JICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkKLQkJJiYgKGRlY2wuYlswXSA9PSAnKicgfHwgZGVjbC5iWzBdID09ICcmJykpCi0JICAgICAgewotCQlzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIoIik7Ci0JCXN0cmluZ19hcHBlbmQgKCZkZWNsLCAiKSIpOwotCSAgICAgIH0KLQkgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICJbIik7Ci0JICAgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCAmZGVjbCwKLQkJCQkJCSAgICAgIHRrX2ludGVncmFsKTsKLQkgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0JICAgICAgKysoKm1hbmdsZWQpOwotCSAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIl0iKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBBIGJhY2sgcmVmZXJlbmNlIHRvIGEgcHJldmlvdXNseSBzZWVuIHR5cGUgKi8KLQljYXNlICdUJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmbikgfHwgbiA+PSB3b3JrIC0+IG50eXBlcykKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZW1lbWJlcmVkX3R5cGUgPSB3b3JrIC0+IHR5cGV2ZWNbbl07Ci0JICAgICAgbWFuZ2xlZCA9ICZyZW1lbWJlcmVkX3R5cGU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JICAvKiBBIGZ1bmN0aW9uICovCi0JY2FzZSAnRic6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkKLQkJJiYgKGRlY2wuYlswXSA9PSAnKicgfHwgZGVjbC5iWzBdID09ICcmJykpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIoIik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICIpIik7Ci0JICAgIH0KLQkgIC8qIEFmdGVyIHBpY2tpbmcgb2ZmIHRoZSBmdW5jdGlvbiBhcmdzLCB3ZSBleHBlY3QgdG8gZWl0aGVyIGZpbmQgdGhlCi0JICAgICBmdW5jdGlvbiByZXR1cm4gdHlwZSAocHJlY2VkZWQgYnkgYW4gJ18nKSBvciB0aGUgZW5kIG9mIHRoZQotCSAgICAgc3RyaW5nLiAgKi8KLQkgIGlmICghZGVtYW5nbGVfbmVzdGVkX2FyZ3MgKHdvcmssIG1hbmdsZWQsICZkZWNsKQotCSAgICAgIHx8ICgqKm1hbmdsZWQgIT0gJ18nICYmICoqbWFuZ2xlZCAhPSAnXDAnKSkKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoc3VjY2VzcyAmJiAoKiptYW5nbGVkID09ICdfJykpCi0JICAgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTSc6Ci0JY2FzZSAnTyc6Ci0JICB7Ci0JICAgIHR5cGVfcXVhbHMgPSBUWVBFX1VOUVVBTElGSUVEOwotCi0JICAgIG1lbWJlciA9ICoqbWFuZ2xlZCA9PSAnTSc7Ci0JICAgICgqbWFuZ2xlZCkrKzsKLQotCSAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIikiKTsKLQotCSAgICAvKiBXZSBkb24ndCBuZWVkIHRvIHByZXBlbmQgYDo6JyBmb3IgYSBxdWFsaWZpZWQgbmFtZTsKLQkgICAgICAgZGVtYW5nbGVfcXVhbGlmaWVkIHdpbGwgZG8gdGhhdCBmb3IgdXMuICAqLwotCSAgICBpZiAoKiptYW5nbGVkICE9ICdRJykKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsIFNDT1BFX1NUUklORyAod29yaykpOwotCi0JICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCSAgICAgIHsKLQkJbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCQlpZiAobiA9PSAtMQotCQkgICAgfHwgKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPCBuKQotCQkgIHsKLQkJICAgIHN1Y2Nlc3MgPSAwOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQlzdHJpbmdfcHJlcGVuZG4gKCZkZWNsLCAqbWFuZ2xlZCwgbik7Ci0JCSptYW5nbGVkICs9IG47Ci0JICAgICAgfQotCSAgICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ1gnIHx8ICoqbWFuZ2xlZCA9PSAnWScpCi0JICAgICAgewotCQlzdHJpbmcgdGVtcDsKLQkJZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnRlbXApOwotCQlzdHJpbmdfcHJlcGVuZHMgKCZkZWNsLCAmdGVtcCk7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ3QnKQotCSAgICAgIHsKLQkJc3RyaW5nIHRlbXA7Ci0JCXN0cmluZ19pbml0ICgmdGVtcCk7Ci0JCXN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgJnRlbXAsCi0JCQkJCSAgICAgTlVMTCwgMSwgMSk7Ci0JCWlmIChzdWNjZXNzKQotCQkgIHsKLQkJICAgIHN0cmluZ19wcmVwZW5kbiAoJmRlY2wsIHRlbXAuYiwgdGVtcC5wIC0gdGVtcC5iKTsKLQkJICAgIHN0cmluZ19jbGVhciAoJnRlbXApOwotCQkgIH0KLQkJZWxzZQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICdRJykKLQkgICAgICB7Ci0JCXN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsICZkZWNsLAotCQkJCQkgICAgICAvKmlzZnVuY25hbT0qLzAsIAotCQkJCQkgICAgICAvKmFwcGVuZD0qLzApOwotCQlpZiAoIXN1Y2Nlc3MpCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzdWNjZXNzID0gMDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIigiKTsKLQkgICAgaWYgKG1lbWJlcikKLQkgICAgICB7Ci0JCXN3aXRjaCAoKiptYW5nbGVkKQotCQkgIHsKLQkJICBjYXNlICdDJzoKLQkJICBjYXNlICdWJzoKLQkJICBjYXNlICd1JzoKLQkJICAgIHR5cGVfcXVhbHMgfD0gY29kZV9mb3JfcXVhbGlmaWVyICgqKm1hbmdsZWQpOwotCQkgICAgKCptYW5nbGVkKSsrOwotCQkgICAgYnJlYWs7Ci0KLQkJICBkZWZhdWx0OgotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWlmICgqKCptYW5nbGVkKSsrICE9ICdGJykKLQkJICB7Ci0JCSAgICBzdWNjZXNzID0gMDsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGlmICgobWVtYmVyICYmICFkZW1hbmdsZV9uZXN0ZWRfYXJncyAod29yaywgbWFuZ2xlZCwgJmRlY2wpKQotCQl8fCAqKm1hbmdsZWQgIT0gJ18nKQotCSAgICAgIHsKLQkJc3VjY2VzcyA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgKCptYW5nbGVkKSsrOwotCSAgICBpZiAoISBQUklOVF9BTlNJX1FVQUxJRklFUlMpCi0JICAgICAgewotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGlmICh0eXBlX3F1YWxzICE9IFRZUEVfVU5RVUFMSUZJRUQpCi0JICAgICAgewotCQlBUFBFTkRfQkxBTksgKCZkZWNsKTsKLQkJc3RyaW5nX2FwcGVuZCAoJmRlY2wsIHF1YWxpZmllcl9zdHJpbmcgKHR5cGVfcXVhbHMpKTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgICBjYXNlICdHJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQyc6Ci0JY2FzZSAnVic6Ci0JY2FzZSAndSc6Ci0JICBpZiAoUFJJTlRfQU5TSV9RVUFMSUZJRVJTKQotCSAgICB7Ci0JICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKSkKLQkJc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiICIpOwotCi0JICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCBkZW1hbmdsZV9xdWFsaWZpZXIgKCoqbWFuZ2xlZCkpOwotCSAgICB9Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQkgIC8qCi0JICAgIH0KLQkgICAgKi8KLQotCSAgLyogZmFsbCB0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkgIGRvbmUgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoc3VjY2Vzcykgc3dpdGNoICgqKm1hbmdsZWQpCi0gICAgewotICAgICAgLyogQSBxdWFsaWZpZWQgbmFtZSwgc3VjaCBhcyAiT3V0ZXI6OklubmVyIi4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgY2FzZSAnSyc6Ci0gICAgICB7Ci0gICAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCwgMCwgMSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgLyogQSBiYWNrIHJlZmVyZW5jZSB0byBhIHByZXZpb3VzbHkgc2VlbiBzcXVhbmdsZWQgdHlwZSAqLwotICAgIGNhc2UgJ0InOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZuKSB8fCBuID49IHdvcmsgLT4gbnVtYikKLQlzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLQlzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHdvcmstPmJ0eXBldmVjW25dKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWCc6Ci0gICAgY2FzZSAnWSc6Ci0gICAgICAvKiBBIHRlbXBsYXRlIHBhcm0uICBXZSBzdWJzdGl0dXRlIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LiAqLwotICAgICAgewotCWludCBpZHg7Ci0KLQkoKm1hbmdsZWQpKys7Ci0JaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLQotCWlmIChpZHggPT0gLTEKLQkgICAgfHwgKHdvcmstPnRtcGxfYXJndmVjICYmIGlkeCA+PSB3b3JrLT5udG1wbF9hcmdzKQotCSAgICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQotCSAgewotCSAgICBzdWNjZXNzID0gMDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHdvcmstPnRtcGxfYXJndmVjW2lkeF0pOwotCWVsc2UKLQkgIHN0cmluZ19hcHBlbmRfdGVtcGxhdGVfaWR4IChyZXN1bHQsIGlkeCk7Ci0KLQlzdWNjZXNzID0gMTsKLSAgICAgIH0KLSAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzdWNjZXNzID0gZGVtYW5nbGVfZnVuZF90eXBlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpOwotICAgICAgaWYgKHRrID09IHRrX25vbmUpCi0JdGsgPSAodHlwZV9raW5kX3QpIHN1Y2Nlc3M7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHN1Y2Nlc3MpCi0gICAgewotICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKSkKLQl7Ci0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICIgIik7Ci0JICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmZGVjbCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHN0cmluZ19kZWxldGUgKHJlc3VsdCk7Ci0gIHN0cmluZ19kZWxldGUgKCZkZWNsKTsKLQotICBpZiAoc3VjY2VzcykKLSAgICAvKiBBc3N1bWUgYW4gaW50ZWdyYWwgdHlwZSwgaWYgd2UncmUgbm90IHN1cmUuICAqLwotICAgIHJldHVybiAoaW50KSAoKHRrID09IHRrX25vbmUpID8gdGtfaW50ZWdyYWwgOiB0ayk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogR2l2ZW4gYSBwb2ludGVyIHRvIGEgdHlwZSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGEgZnVuZGFtZW50YWwgdHlwZQotICAgYXJndW1lbnQgKGludCwgbG9uZywgdW5zaWduZWQgaW50LCBldGMpIGluIFRZUEUsIGEgcG9pbnRlciB0byB0aGUKLSAgIHN0cmluZyBpbiB3aGljaCB0aGUgZGVtYW5nbGVkIG91dHB1dCBpcyBiZWluZyBidWlsdCBpbiBSRVNVTFQsIGFuZAotICAgdGhlIFdPUksgc3RydWN0dXJlLCBkZWNvZGUgdGhlIHR5cGVzIGFuZCBhZGQgdGhlbSB0byB0aGUgcmVzdWx0LgotCi0gICBGb3IgZXhhbXBsZToKLQotICAgCSJDaSIJPT4JImNvbnN0IGludCIKLQkiU2wiCT0+CSJzaWduZWQgbG9uZyIKLQkiQ1VzIgk9PgkiY29uc3QgdW5zaWduZWQgc2hvcnQiCi0KLSAgIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyByZWFsbHkgYSB0eXBlX2tpbmRfdC4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICBpbnQgZG9uZSA9IDA7Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY2hhciBidWZbMTBdOwotICBpbnQgZGVjID0gMDsKLSAgc3RyaW5nIGJ0eXBlOwotICB0eXBlX2tpbmRfdCB0ayA9IHRrX2ludGVncmFsOwotCi0gIHN0cmluZ19pbml0ICgmYnR5cGUpOwotCi0gIC8qIEZpcnN0IHBpY2sgb2ZmIGFueSB0eXBlIHF1YWxpZmllcnMuICBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZS4gICovCi0KLSAgd2hpbGUgKCFkb25lKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdDJzoKLQljYXNlICdWJzoKLQljYXNlICd1JzoKLQkgIGlmIChQUklOVF9BTlNJX1FVQUxJRklFUlMpCi0JICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKHJlc3VsdCwgIiAiKTsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAocmVzdWx0LCBkZW1hbmdsZV9xdWFsaWZpZXIgKCoqbWFuZ2xlZCkpOwotCSAgICB9Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQljYXNlICdVJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInVuc2lnbmVkIik7Ci0JICBicmVhazsKLQljYXNlICdTJzogLyogc2lnbmVkIGNoYXIgb25seSAqLwotCSAgKCptYW5nbGVkKSsrOwotCSAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAic2lnbmVkIik7Ci0JICBicmVhazsKLQljYXNlICdKJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIl9fY29tcGxleCIpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGRvbmUgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgcGljayBvZmYgdGhlIGZ1bmRhbWVudGFsIHR5cGUuICBUaGVyZSBjYW4gYmUgb25seSBvbmUuICAqLwotCi0gIHN3aXRjaCAoKiptYW5nbGVkKQotICAgIHsKLSAgICBjYXNlICdcMCc6Ci0gICAgY2FzZSAnXyc6Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd2JzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInZvaWQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3gnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAibG9uZyBsb25nIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdsJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiaW50Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdzJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInNob3J0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImJvb2wiKTsKLSAgICAgIHRrID0gdGtfYm9vbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2MnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiY2hhciIpOwotICAgICAgdGsgPSB0a19jaGFyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJ3Y2hhcl90Iik7Ci0gICAgICB0ayA9IHRrX2NoYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdyJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmcgZG91YmxlIik7Ci0gICAgICB0ayA9IHRrX3JlYWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImRvdWJsZSIpOwotICAgICAgdGsgPSB0a19yZWFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJmbG9hdCIpOwotICAgICAgdGsgPSB0a19yZWFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JewotCSAgc3VjY2VzcyA9IDA7Ci0JICBicmVhazsKLQl9Ci0gICAgY2FzZSAnSSc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdfJykKLQl7Ci0JICBpbnQgaTsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGZvciAoaSA9IDA7Ci0JICAgICAgIGkgPCAobG9uZykgc2l6ZW9mIChidWYpIC0gMSAmJiAqKm1hbmdsZWQgJiYgKiptYW5nbGVkICE9ICdfJzsKLQkgICAgICAgKCptYW5nbGVkKSsrLCBpKyspCi0JICAgIGJ1ZltpXSA9ICoqbWFuZ2xlZDsKLQkgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJ1ZltpXSA9ICdcMCc7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cm5jcHkgKGJ1ZiwgKm1hbmdsZWQsIDIpOwotCSAgYnVmWzJdID0gJ1wwJzsKLQkgICptYW5nbGVkICs9IG1pbiAoc3RybGVuICgqbWFuZ2xlZCksIDIpOwotCX0KLSAgICAgIHNzY2FuZiAoYnVmLCAiJXgiLCAmZGVjKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgImludCVpX3QiLCBkZWMpOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCBidWYpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgLyogQW4gZXhwbGljaXQgdHlwZSwgc3VjaCBhcyAiNm15dHlwZSIgb3IgIjdpbnRlZ2VyIiAqLwotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgewotICAgICAgICBpbnQgYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotICAgICAgICBzdHJpbmcgYnR5cGU7Ci0gICAgICAgIHN0cmluZ19pbml0ICgmYnR5cGUpOwotICAgICAgICBpZiAoZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgJmJ0eXBlKSkgewotICAgICAgICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCBidHlwZS5iLCBMRU5fU1RSSU5HICgmYnR5cGUpLCBiaW5kZXgpOwotICAgICAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmYnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgICAgc3RyaW5nX2RlbGV0ZSAoJmJ0eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSAndCc6Ci0gICAgICB7Ci0gICAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgJmJ0eXBlLCAwLCAxLCAxKTsKLSAgICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJmJ0eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBzdWNjZXNzID8gKChpbnQpIHRrKSA6IDA7Ci19Ci0KLQotLyogSGFuZGxlIGEgdGVtcGxhdGUncyB2YWx1ZSBwYXJhbWV0ZXIgZm9yIEhQIGFDQyAoZXh0ZW5zaW9uIGZyb20gQVJNKQotICAgKiptYW5nbGVkIHBvaW50cyB0byAnUycgb3IgJ1UnICovCi0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IHVuc2lnbmVkX2NvbnN0OwotCi0gIGlmICgqKm1hbmdsZWQgIT0gJ1UnICYmICoqbWFuZ2xlZCAhPSAnUycpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdW5zaWduZWRfY29uc3QgPSAoKiptYW5nbGVkID09ICdVJyk7Ci0KLSAgKCptYW5nbGVkKSsrOwotCi0gIHN3aXRjaCAoKiptYW5nbGVkKQotICAgIHsKLSAgICAgIGNhc2UgJ04nOgotICAgICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICItIik7Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAnUCc6Ci0gICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdNJzoKLSAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciAtMl4zMSAqLwotICAgICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICItMjE0NzQ4MzY0OCIpOwotICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gYmUgbG9va2luZyBhdCBhbiBpbnRlZ2VyIG5vdyAqLwotICBpZiAoIShpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBvbmx5IGRlYWwgd2l0aCBpbnRlZ3JhbCB2YWx1ZXMgZm9yIHRlbXBsYXRlCi0gICAgIHBhcmFtZXRlcnMgLS0gc28gaXQncyBPSyB0byBsb29rIG9ubHkgZm9yIGRpZ2l0cyAqLwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLSAgICB7Ci0gICAgICBjaGFyX3N0clswXSA9ICoqbWFuZ2xlZDsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgY2hhcl9zdHIpOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgIH0KLQotICBpZiAodW5zaWduZWRfY29uc3QpCi0gICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiVSIpOwotCi0gIC8qIEZJWE1FPyBTb21lIGRheSB3ZSBtYXkgaGF2ZSA2NC1iaXQgKG9yIGxhcmdlciA6LSkgKSBjb25zdGFudHMKLSAgICAgd2l0aCBMIG9yIExMIHN1ZmZpeGVzLiBwYWkvMTk5Ny0wOS0wMyAqLwotCi0gIHJldHVybiAxOyAvKiBzdWNjZXNzICovCi19Ci0KLS8qIEhhbmRsZSBhIHRlbXBsYXRlJ3MgbGl0ZXJhbCBwYXJhbWV0ZXIgZm9yIEhQIGFDQyAoZXh0ZW5zaW9uIGZyb20gQVJNKQotICAgKiptYW5nbGVkIGlzIHBvaW50aW5nIHRvIHRoZSAnQScgKi8KLQotc3RhdGljIGludAotZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICBpbnQgbGl0ZXJhbF9sZW4gPSAwOwotICBjaGFyICogcmVjdXJzZTsKLSAgY2hhciAqIHJlY3Vyc2VfZGVtOwotCi0gIGlmICgqKm1hbmdsZWQgIT0gJ0EnKQotICAgIHJldHVybiAwOwotCi0gICgqbWFuZ2xlZCkrKzsKLQotICBsaXRlcmFsX2xlbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCi0gIGlmIChsaXRlcmFsX2xlbiA8PSAwKQotICAgIHJldHVybiAwOwotCi0gIC8qIExpdGVyYWwgcGFyYW1ldGVycyBhcmUgbmFtZXMgb2YgYXJyYXlzLCBmdW5jdGlvbnMsIGV0Yy4gIGFuZCB0aGUKLSAgICAgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVzZXMgdGhlIGFkZHJlc3Mgb3BlcmF0b3IgKi8KLSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiJiIpOwotCi0gIC8qIE5vdyByZWN1cnNpdmVseSBkZW1hbmdsZSB0aGUgbGl0ZXJhbCBuYW1lICovCi0gIHJlY3Vyc2UgPSAoY2hhciAqKSB4bWFsbG9jIChsaXRlcmFsX2xlbiArIDEpOwotICBtZW1jcHkgKHJlY3Vyc2UsICptYW5nbGVkLCBsaXRlcmFsX2xlbik7Ci0gIHJlY3Vyc2VbbGl0ZXJhbF9sZW5dID0gJ1wwMDAnOwotCi0gIHJlY3Vyc2VfZGVtID0gY3BsdXNfZGVtYW5nbGUgKHJlY3Vyc2UsIHdvcmstPm9wdGlvbnMpOwotCi0gIGlmIChyZWN1cnNlX2RlbSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHJlY3Vyc2VfZGVtKTsKLSAgICAgIGZyZWUgKHJlY3Vyc2VfZGVtKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocmVzdWx0LCAqbWFuZ2xlZCwgbGl0ZXJhbF9sZW4pOwotICAgIH0KLSAgKCptYW5nbGVkKSArPSBsaXRlcmFsX2xlbjsKLSAgZnJlZSAocmVjdXJzZSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoYXJncywgYXJnKQotICAgICBjb25zdCBjaGFyICoqIGFyZ3M7Ci0gICAgIHN0cmluZyAqIGFyZzsKLXsKLSAgaWYgKCoqYXJncyA9PSAnLScpCi0gICAgewotICAgICAgY2hhcl9zdHJbMF0gPSAnLSc7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChhcmcsIGNoYXJfc3RyKTsKLSAgICAgICgqYXJncykrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCoqYXJncyA9PSAnKycpCi0gICAgKCphcmdzKSsrOwotCi0gIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiphcmdzKSkKLSAgICByZXR1cm4gMDsKLQotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiphcmdzKSkKLSAgICB7Ci0gICAgICBjaGFyX3N0clswXSA9ICoqYXJnczsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGFyZywgY2hhcl9zdHIpOwotICAgICAgKCphcmdzKSsrOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVtYW5nbGUgdGhlIG5leHQgYXJndW1lbnQsIGdpdmVuIGJ5IE1BTkdMRUQgaW50byBSRVNVTFQsIHdoaWNoCi0gICAqc2hvdWxkIGJlIGFuIHVuaW5pdGlhbGl6ZWQqIHN0cmluZy4gIEl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaGVyZSwKLSAgIGFuZCBmcmVlJ2Qgc2hvdWxkIGFueXRoaW5nIGdvIHdyb25nLiAgKi8KLQotc3RhdGljIGludAotZG9fYXJnICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIC8qIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQgc28gdGhhdCB3ZSBjYW4gcmVjb3JkIHRoZSB0eXBlLCBmb3IKLSAgICAgbm9uLXNxdWFuZ2xpbmcgdHlwZSByZW1lbWJlcmluZy4gICovCi0gIGNvbnN0IGNoYXIgKnN0YXJ0ID0gKm1hbmdsZWQ7Ci0KLSAgc3RyaW5nX2luaXQgKHJlc3VsdCk7Ci0KLSAgaWYgKHdvcmstPm5yZXBlYXRzID4gMCkKLSAgICB7Ci0gICAgICAtLXdvcmstPm5yZXBlYXRzOwotCi0gICAgICBpZiAod29yay0+cHJldmlvdXNfYXJndW1lbnQgPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgLyogV2Ugd2FudCB0byByZWlzc3VlIHRoZSBwcmV2aW91cyB0eXBlIGluIHRoaXMgYXJndW1lbnQgbGlzdC4gICovCi0gICAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnbicpCi0gICAgewotICAgICAgLyogQSBzcXVhbmdsaW5nLXN0eWxlIHJlcGVhdC4gICovCi0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICB3b3JrLT5ucmVwZWF0cyA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCk7Ci0KLSAgICAgIGlmICh3b3JrLT5ucmVwZWF0cyA8PSAwKQotCS8qIFRoaXMgd2FzIG5vdCBhIHJlcGVhdCBjb3VudCBhZnRlciBhbGwuICAqLwotCXJldHVybiAwOwotCi0gICAgICBpZiAod29yay0+bnJlcGVhdHMgPiA5KQotCXsKLQkgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCSAgICAvKiBUaGUgcmVwZWF0IGNvdW50IHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbiAnXycgaW4gdGhpcwotCSAgICAgICBjYXNlLiAgKi8KLQkgICAgcmV0dXJuIDA7Ci0JICBlbHNlCi0JICAgICgqbWFuZ2xlZCkrKzsKLQl9Ci0KLSAgICAgIC8qIE5vdywgdGhlIHJlcGVhdCBpcyBhbGwgc2V0IHVwLiAgKi8KLSAgICAgIHJldHVybiBkb19hcmcgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCk7Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIHJlc3VsdCBpbiBXT1JLLT5wcmV2aW91c19hcmd1bWVudCBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0Ci0gICAgIGlmIGl0J3MgcmVwZWF0ZWQuICBOb3RlIHRoYXQgc2F2aW5nIFNUQVJUIGlzIG5vdCBnb29kIGVub3VnaDogd2UKLSAgICAgZG8gbm90IHdhbnQgdG8gYWRkIGFkZGl0aW9uYWwgdHlwZXMgdG8gdGhlIGJhY2stcmVmZXJlbmNlYWJsZQotICAgICB0eXBlIHZlY3RvciB3aGVuIHByb2Nlc3NpbmcgYSByZXBlYXRlZCB0eXBlLiAgKi8KLSAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KQotICAgIHN0cmluZ19jbGVhciAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICBlbHNlCi0gICAgewotICAgICAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSAoc3RyaW5nKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJpbmcpKTsKLSAgICAgIHN0cmluZ19pbml0ICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgfQotCi0gIGlmICghZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgd29yay0+cHJldmlvdXNfYXJndW1lbnQpKQotICAgIHJldHVybiAwOwotCi0gIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLQotICByZW1lbWJlcl90eXBlICh3b3JrLCBzdGFydCwgKm1hbmdsZWQgLSBzdGFydCk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfdHlwZSAod29yaywgc3RhcnQsIGxlbikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0OwotICAgICBpbnQgbGVuOwotewotICBjaGFyICp0ZW07Ci0KLSAgaWYgKHdvcmstPmZvcmdldHRpbmdfdHlwZXMpCi0gICAgcmV0dXJuOwotCi0gIGlmICh3b3JrIC0+IG50eXBlcyA+PSB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yayAtPiB0eXBldmVjX3NpemUgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSA9IDM7Ci0JICB3b3JrIC0+IHR5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogd29yayAtPiB0eXBldmVjX3NpemUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSAqPSAyOwotCSAgd29yayAtPiB0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKXdvcmsgLT4gdHlwZXZlYywKLQkJCQkgIHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gdHlwZXZlY19zaXplKTsKLQl9Ci0gICAgfQotICB0ZW0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5ICh0ZW0sIHN0YXJ0LCBsZW4pOwotICB0ZW1bbGVuXSA9ICdcMCc7Ci0gIHdvcmsgLT4gdHlwZXZlY1t3b3JrIC0+IG50eXBlcysrXSA9IHRlbTsKLX0KLQotCi0vKiBSZW1lbWJlciBhIEsgdHlwZSBjbGFzcyBxdWFsaWZpZXIuICovCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfS3R5cGUgKHdvcmssIHN0YXJ0LCBsZW4pCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbjsKLXsKLSAgY2hhciAqdGVtOwotCi0gIGlmICh3b3JrIC0+IG51bWsgPj0gd29yayAtPiBrc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yayAtPiBrc2l6ZSA9PSAwKQotCXsKLQkgIHdvcmsgLT4ga3NpemUgPSA1OwotCSAgd29yayAtPiBrdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGtzaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yayAtPiBrc2l6ZSAqPSAyOwotCSAgd29yayAtPiBrdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IGt0eXBldmVjLAotCQkJCSAgc2l6ZW9mIChjaGFyICopICogd29yayAtPiBrc2l6ZSk7Ci0JfQotICAgIH0KLSAgdGVtID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAodGVtLCBzdGFydCwgbGVuKTsKLSAgdGVtW2xlbl0gPSAnXDAnOwotICB3b3JrIC0+IGt0eXBldmVjW3dvcmsgLT4gbnVtaysrXSA9IHRlbTsKLX0KLQotLyogUmVnaXN0ZXIgYSBCIGNvZGUsIGFuZCBnZXQgYW4gaW5kZXggZm9yIGl0LiBCIGNvZGVzIGFyZSByZWdpc3RlcmVkCi0gICBhcyB0aGV5IGFyZSBzZWVuLCByYXRoZXIgdGhhbiBhcyB0aGV5IGFyZSBjb21wbGV0ZWQsIHNvIG1hcDx0ZW1wPGNoYXI+ID4KLSAgIHJlZ2lzdGVycyBtYXA8dGVtcDxjaGFyPiA+IGFzIEIwLCBhbmQgdGVtcDxjaGFyPiBhcyBCMSAqLwotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9CdHlwZSAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIGludCByZXQ7Ci0KLSAgaWYgKHdvcmsgLT4gbnVtYiA+PSB3b3JrIC0+IGJzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JrIC0+IGJzaXplID09IDApCi0JewotCSAgd29yayAtPiBic2l6ZSA9IDU7Ci0JICB3b3JrIC0+IGJ0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gYnNpemUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3JrIC0+IGJzaXplICo9IDI7Ci0JICB3b3JrIC0+IGJ0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKXdvcmsgLT4gYnR5cGV2ZWMsCi0JCQkJICBzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGJzaXplKTsKLQl9Ci0gICAgfQotICByZXQgPSB3b3JrIC0+IG51bWIrKzsKLSAgd29yayAtPiBidHlwZXZlY1tyZXRdID0gTlVMTDsKLSAgcmV0dXJuKHJldCk7Ci19Ci0KLS8qIFN0b3JlIGEgdmFsdWUgaW50byBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBCIGNvZGUgdHlwZS4gKi8KLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0J0eXBlICh3b3JrLCBzdGFydCwgbGVuLCBpbmRleCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0OwotICAgICBpbnQgbGVuLCBpbmRleDsKLXsKLSAgY2hhciAqdGVtOwotCi0gIHRlbSA9IHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHRlbSwgc3RhcnQsIGxlbik7Ci0gIHRlbVtsZW5dID0gJ1wwJzsKLSAgd29yayAtPiBidHlwZXZlY1tpbmRleF0gPSB0ZW07Ci19Ci0KLS8qIExvc2UgYWxsIHRoZSBpbmZvIHJlbGF0ZWQgdG8gQiBhbmQgSyB0eXBlIGNvZGVzLiAqLwotc3RhdGljIHZvaWQKLWZvcmdldF9CX2FuZF9LX3R5cGVzICh3b3JrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLXsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKHdvcmsgLT4gbnVtayA+IDApCi0gICAgewotICAgICAgaSA9IC0tKHdvcmsgLT4gbnVtayk7Ci0gICAgICBpZiAod29yayAtPiBrdHlwZXZlY1tpXSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHdvcmsgLT4ga3R5cGV2ZWNbaV0pOwotCSAgd29yayAtPiBrdHlwZXZlY1tpXSA9IE5VTEw7Ci0JfQotICAgIH0KLQotICB3aGlsZSAod29yayAtPiBudW1iID4gMCkKLSAgICB7Ci0gICAgICBpID0gLS0od29yayAtPiBudW1iKTsKLSAgICAgIGlmICh3b3JrIC0+IGJ0eXBldmVjW2ldICE9IE5VTEwpCi0JewotCSAgZnJlZSAod29yayAtPiBidHlwZXZlY1tpXSk7Ci0JICB3b3JrIC0+IGJ0eXBldmVjW2ldID0gTlVMTDsKLQl9Ci0gICAgfQotfQotLyogRm9yZ2V0IHRoZSByZW1lbWJlcmVkIHR5cGVzLCBidXQgbm90IHRoZSB0eXBlIHZlY3RvciBpdHNlbGYuICAqLwotCi1zdGF0aWMgdm9pZAotZm9yZ2V0X3R5cGVzICh3b3JrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLXsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKHdvcmsgLT4gbnR5cGVzID4gMCkKLSAgICB7Ci0gICAgICBpID0gLS0od29yayAtPiBudHlwZXMpOwotICAgICAgaWYgKHdvcmsgLT4gdHlwZXZlY1tpXSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHdvcmsgLT4gdHlwZXZlY1tpXSk7Ci0JICB3b3JrIC0+IHR5cGV2ZWNbaV0gPSBOVUxMOwotCX0KLSAgICB9Ci19Ci0KLS8qIFByb2Nlc3MgdGhlIGFyZ3VtZW50IGxpc3QgcGFydCBvZiB0aGUgc2lnbmF0dXJlLCBhZnRlciBhbnkgY2xhc3Mgc3BlYwotICAgaGFzIGJlZW4gY29uc3VtZWQsIGFzIHdlbGwgYXMgdGhlIGZpcnN0ICdGJyBjaGFyYWN0ZXIgKGlmIGFueSkuICBGb3IKLSAgIGV4YW1wbGU6Ci0KLSAgICJfX2Fsc19fM2Zvb1JUMCIJCT0+CXByb2Nlc3MgIlJUMCIKLSAgICJjb21wbGV4ZnVuYzVfX0ZQRlBjX1BGbF9pIgk9Pglwcm9jZXNzICJQRlBjX1BGbF9pIgotCi0gICBERUNMUCBtdXN0IGJlIGFscmVhZHkgaW5pdGlhbGlzZWQsIHVzdWFsbHkgbm9uLWVtcHR5LiAgSXQgd29uJ3QgYmUgZnJlZWQKLSAgIG9uIGZhaWx1cmUuCi0KLSAgIE5vdGUgdGhhdCBnKysgZGlmZmVycyBzaWduaWZpY2FudGx5IGZyb20gQVJNIGFuZCBsdWNpZCBzdHlsZSBtYW5nbGluZwotICAgd2l0aCByZWdhcmRzIHRvIHJlZmVyZW5jZXMgdG8gcHJldmlvdXNseSBzZWVuIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGdpdmVuCi0gICB0aGUgc291cmNlIGZyYWdtZW50OgotCi0gICAgIGNsYXNzIGZvbyB7Ci0gICAgICAgcHVibGljOgotICAgICAgIGZvbzo6Zm9vIChpbnQsIGZvbyAmaWEsIGludCwgZm9vICZpYiwgaW50LCBmb28gJmljKTsKLSAgICAgfTsKLQotICAgICBmb286OmZvbyAoaW50LCBmb28gJmlhLCBpbnQsIGZvbyAmaWIsIGludCwgZm9vICZpYykgeyBpYSA9IGliID0gaWM7IH0KLSAgICAgdm9pZCBmb28gKGludCwgZm9vICZpYSwgaW50LCBmb28gJmliLCBpbnQsIGZvbyAmaWMpIHsgaWEgPSBpYiA9IGljOyB9Ci0KLSAgIGcrKyBwcm9kdWNlcyB0aGUgbmFtZXM6Ci0KLSAgICAgX18zZm9vaVJUMGlUMmlUMgotICAgICBmb29fX0ZpUjNmb29pVDFpVDEKLQotICAgd2hpbGUgbGNjIChhbmQgcHJlc3VtYWJseSBvdGhlciBBUk0gc3R5bGUgY29tcGlsZXJzIGFzIHdlbGwpIHByb2R1Y2VzOgotCi0gICAgIGZvb19fRmlSM2Zvb1QxVDJUMVQyCi0gICAgIF9fY3RfXzNmb29GaVIzZm9vVDFUMlQxVDIKLQotICAgTm90ZSB0aGF0IGcrKyBiYXNlcyBpdHMgdHlwZSBudW1iZXJzIHN0YXJ0aW5nIGF0IHplcm8gYW5kIGNvdW50cyBhbGwKLSAgIHByZXZpb3VzbHkgc2VlbiB0eXBlcywgd2hpbGUgbHVjaWQvQVJNIGJhc2VzIGl0cyB0eXBlIG51bWJlcnMgc3RhcnRpbmcKLSAgIGF0IG9uZSBhbmQgb25seSBjb25zaWRlcnMgdHlwZXMgYWZ0ZXIgaXQgaGFzIHNlZW4gdGhlICdGJyBjaGFyYWN0ZXIKLSAgIGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBhcmdzLiAgRm9yIGx1Y2lkL0FSTSBzdHlsZSwgd2UKLSAgIGFjY291bnQgZm9yIHRoaXMgZGlmZmVyZW5jZSBieSBkaXNjYXJkaW5nIGFueSBwcmV2aW91c2x5IHNlZW4gdHlwZXMgd2hlbgotICAgd2Ugc2VlIHRoZSAnRicgY2hhcmFjdGVyLCBhbmQgc3VidHJhY3Rpbmcgb25lIGZyb20gdGhlIHR5cGUgbnVtYmVyCi0gICByZWZlcmVuY2UuCi0KLSAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBzdHJpbmcgYXJnOwotICBpbnQgbmVlZF9jb21tYSA9IDA7Ci0gIGludCByOwotICBpbnQgdDsKLSAgY29uc3QgY2hhciAqdGVtOwotICBjaGFyIHRlbXB0eXBlOwotCi0gIGlmIChQUklOVF9BUkdfVFlQRVMpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIoIik7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdcMCcpCi0JewotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJ2b2lkIik7Ci0JfQotICAgIH0KLQotICB3aGlsZSAoKCoqbWFuZ2xlZCAhPSAnXycgJiYgKiptYW5nbGVkICE9ICdcMCcgJiYgKiptYW5nbGVkICE9ICdlJykKLQkgfHwgd29yay0+bnJlcGVhdHMgPiAwKQotICAgIHsKLSAgICAgIGlmICgoKiptYW5nbGVkID09ICdOJykgfHwgKCoqbWFuZ2xlZCA9PSAnVCcpKQotCXsKLQkgIHRlbXB0eXBlID0gKigqbWFuZ2xlZCkrKzsKLQotCSAgaWYgKHRlbXB0eXBlID09ICdOJykKLQkgICAgewotCSAgICAgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmcikpCi0JCXsKLQkJICByZXR1cm4gKDApOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHIgPSAxOwotCSAgICB9Ci0gICAgICAgICAgaWYgKChIUF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiB3b3JrIC0+IG50eXBlcyA+PSAxMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSAxMCBvciBtb3JlIHR5cGVzIHdlIG1pZ2h0IGhhdmUgbW9yZSB0aGFuIGEgMSBkaWdpdAotICAgICAgICAgICAgICAgICBpbmRleCBzbyB3ZSdsbCBoYXZlIHRvIGNvbnN1bWUgdGhlIHdob2xlIGNvdW50IGhlcmUuIFRoaXMKLSAgICAgICAgICAgICAgICAgd2lsbCBsb3NlIGlmIHRoZSBuZXh0IHRoaW5nIGlzIGEgdHlwZSBuYW1lIHByZWNlZGVkIGJ5IGEKLSAgICAgICAgICAgICAgICAgY291bnQgYnV0IGl0J3MgaW1wb3NzaWJsZSB0byBkZW1hbmdsZSB0aGF0IGNhc2UgcHJvcGVybHkKLSAgICAgICAgICAgICAgICAgYW55d2F5LiBFZyBpZiB3ZSBhbHJlYWR5IGhhdmUgMTIgdHlwZXMgaXMgVDEyUGMgIiguLi4sIHR5cGUxLAotICAgICAgICAgICAgICAgICBQYywgLi4uKSIgIG9yICIoLi4uLCB0eXBlMTIsIGNoYXIgKiwgLi4uKSIgKi8KLSAgICAgICAgICAgICAgaWYgKCh0ID0gY29uc3VtZV9jb3VudChtYW5nbGVkKSkgPD0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnQpKQotCSAgICAJewotCSAgICAgICAgICByZXR1cm4gKDApOwotCSAgICAJfQotCSAgICB9Ci0JICBpZiAoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgdC0tOwotCSAgICB9Ci0JICAvKiBWYWxpZGF0ZSB0aGUgdHlwZSBpbmRleC4gIFByb3RlY3QgYWdhaW5zdCBpbGxlZ2FsIGluZGljZXMgZnJvbQotCSAgICAgbWFsZm9ybWVkIHR5cGUgc3RyaW5ncy4gICovCi0JICBpZiAoKHQgPCAwKSB8fCAodCA+PSB3b3JrIC0+IG50eXBlcykpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKDApOwotCSAgICB9Ci0JICB3aGlsZSAod29yay0+bnJlcGVhdHMgPiAwIHx8IC0tciA+PSAwKQotCSAgICB7Ci0JICAgICAgdGVtID0gd29yayAtPiB0eXBldmVjW3RdOwotCSAgICAgIGlmIChuZWVkX2NvbW1hICYmIFBSSU5UX0FSR19UWVBFUykKLQkJewotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCAiKTsKLQkJfQotCSAgICAgIGlmICghZG9fYXJnICh3b3JrLCAmdGVtLCAmYXJnKSkKLQkJewotCQkgIHJldHVybiAoMCk7Ci0JCX0KLQkgICAgICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotCQl7Ci0JCSAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLQkJfQotCSAgICAgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotCSAgICAgIG5lZWRfY29tbWEgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChuZWVkX2NvbW1hICYmIFBSSU5UX0FSR19UWVBFUykKLQkgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsICIpOwotCSAgaWYgKCFkb19hcmcgKHdvcmssIG1hbmdsZWQsICZhcmcpKQotCSAgICByZXR1cm4gKDApOwotCSAgaWYgKFBSSU5UX0FSR19UWVBFUykKLQkgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLQkgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotCSAgbmVlZF9jb21tYSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAoKiptYW5nbGVkID09ICdlJykKLSAgICB7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotCXsKLQkgIGlmIChuZWVkX2NvbW1hKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsIik7Ci0JICAgIH0KLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLi4uIik7Ci0JfQotICAgIH0KLQotICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiKSIpOwotICAgIH0KLSAgcmV0dXJuICgxKTsKLX0KLQotLyogTGlrZSBkZW1hbmdsZV9hcmdzLCBidXQgZm9yIGRlbWFuZ2xpbmcgdGhlIGFyZ3VtZW50IGxpc3RzIG9mIGZ1bmN0aW9uCi0gICBhbmQgbWV0aG9kIHBvaW50ZXJzIG9yIHJlZmVyZW5jZXMsIG5vdCB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zLiAgKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfbmVzdGVkX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIHN0cmluZyogc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQ7Ci0gIGludCByZXN1bHQ7Ci0gIGludCBzYXZlZF9ucmVwZWF0czsKLQotICAvKiBUaGUgRysrIG5hbWUtbWFuZ2xpbmcgYWxnb3JpdGhtIGRvZXMgbm90IHJlbWVtYmVyIHR5cGVzIG9uIG5lc3RlZAotICAgICBhcmd1bWVudCBsaXN0cywgdW5sZXNzIC1mc3F1YW5nbGluZyBpcyB1c2VkLCBhbmQgaW4gdGhhdCBjYXNlIHRoZQotICAgICB0eXBlIHZlY3RvciB1cGRhdGVkIGJ5IHJlbWVtYmVyX3R5cGUgaXMgbm90IHVzZWQuICBTbywgd2UgdHVybgotICAgICBvZmYgcmVtZW1iZXJpbmcgb2YgdHlwZXMgaGVyZS4gICovCi0gICsrd29yay0+Zm9yZ2V0dGluZ190eXBlczsKLQotICAvKiBGb3IgdGhlIHJlcGVhdCBjb2RlcyB1c2VkIHdpdGggLWZzcXVhbmdsaW5nLCB3ZSBtdXN0IGtlZXAgdHJhY2sgb2YKLSAgICAgdGhlIGxhc3QgYXJndW1lbnQuICAqLwotICBzYXZlZF9wcmV2aW91c19hcmd1bWVudCA9IHdvcmstPnByZXZpb3VzX2FyZ3VtZW50OwotICBzYXZlZF9ucmVwZWF0cyA9IHdvcmstPm5yZXBlYXRzOwotICB3b3JrLT5wcmV2aW91c19hcmd1bWVudCA9IDA7Ci0gIHdvcmstPm5yZXBlYXRzID0gMDsKLQotICAvKiBBY3R1YWxseSBkZW1hbmdsZSB0aGUgYXJndW1lbnRzLiAgKi8KLSAgcmVzdWx0ID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCi0gIC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzX2FyZ3VtZW50IGZpZWxkLiAgKi8KLSAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KQotICAgIHN0cmluZ19kZWxldGUgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSBzYXZlZF9wcmV2aW91c19hcmd1bWVudDsKLSAgLS13b3JrLT5mb3JnZXR0aW5nX3R5cGVzOwotICB3b3JrLT5ucmVwZWF0cyA9IHNhdmVkX25yZXBlYXRzOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2NhbikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotICAgICBjb25zdCBjaGFyICpzY2FuOwotewotICBzaXplX3QgaTsKLSAgc3RyaW5nIHR5cGU7Ci0gIGNvbnN0IGNoYXIgKnRlbTsKLQotICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICgqbWFuZ2xlZCksIHNjYW4gLSAoKm1hbmdsZWQpKTsKLSAgc3RyaW5nX25lZWQgKGRlY2xwLCAxKTsKLSAgKihkZWNscCAtPiBwKSA9ICdcMCc7Ci0KLSAgLyogQ29uc3VtZSB0aGUgZnVuY3Rpb24gbmFtZSwgaW5jbHVkaW5nIHRoZSAiX18iIHNlcGFyYXRpbmcgdGhlIG5hbWUKLSAgICAgZnJvbSB0aGUgc2lnbmF0dXJlLiAgV2UgYXJlIGd1YXJhbnRlZWQgdGhhdCBTQ0FOIHBvaW50cyB0byB0aGUKLSAgICAgc2VwYXJhdG9yLiAgKi8KLQotICAoKm1hbmdsZWQpID0gc2NhbiArIDI7Ci0gIC8qIFdlIG1heSBiZSBsb29raW5nIGF0IGFuIGluc3RhbnRpYXRpb24gb2YgYSB0ZW1wbGF0ZSBmdW5jdGlvbjoKLSAgICAgZm9vX19YdDF0Ml9GdDN0NCwgd2hlcmUgdDEsIHQyLCAuLi4gYXJlIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgYQotICAgICBmb2xsb3dpbmcgX0YgbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuICBIYW5kbGUKLSAgICAgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBmaXJzdC4gKi8KLQotICBpZiAoSFBfREVNQU5HTElORyAmJiAoKiptYW5nbGVkID09ICdYJykpCi0gICAgewotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAwLCBkZWNscCk7Ci0gICAgICAvKiBUaGlzIGxlYXZlcyBNQU5HTEVEIHBvaW50aW5nIHRvIHRoZSAnRicgbWFya2luZyBmdW5jIGFyZ3MgKi8KLSAgICB9Ci0KLSAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLSAgICB7Ci0KLSAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGFuIEFSTSBzdHlsZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG9wZXJhdG9yLgotCSBJZiBzbywgdGhlbiBqdXN0IHJlY29yZCBpdCwgY2xlYXIgdGhlIGRlY2wsIGFuZCByZXR1cm4uCi0JIFdlIGNhbid0IGJ1aWxkIHRoZSBhY3R1YWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBkZWNsIHVudGlsIGxhdGVyLAotCSB3aGVuIHdlIHJlY292ZXIgdGhlIGNsYXNzIG5hbWUgZnJvbSB0aGUgc2lnbmF0dXJlLiAgKi8KLQotICAgICAgaWYgKHN0cmNtcCAoZGVjbHAgLT4gYiwgIl9fY3QiKSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gY29uc3RydWN0b3IgKz0gMTsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVjbHAgLT4gYiwgIl9fZHQiKSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gZGVzdHJ1Y3RvciArPSAxOwotCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZGVjbHAtPnAgLSBkZWNscC0+YiA+PSAzCi0gICAgICAmJiBkZWNscC0+YlswXSA9PSAnbycKLSAgICAgICYmIGRlY2xwLT5iWzFdID09ICdwJwotICAgICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBkZWNscC0+YlsyXSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBzZWUgaWYgaXQncyBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gKi8KLSAgICAgIGlmIChkZWNscC0+cCAtIGRlY2xwLT5iID49IDEwIC8qIG9wJGFzc2lnbl8gKi8KLQkgICYmIG1lbWNtcCAoZGVjbHAtPmIgKyAzLCAiYXNzaWduXyIsIDcpID09IDApCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gZGVjbHAtPnAgLSBkZWNscC0+YiAtIDEwOwotCSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IGxlbgotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgZGVjbHAtPmIgKyAxMCwgbGVuKSA9PSAwKQotCQl7Ci0JCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI9Iik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGludCBsZW4gPSBkZWNscC0+cCAtIGRlY2xwLT5iIC0gMzsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4KLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMywgbGVuKSA9PSAwKQotCQl7Ci0JCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGRlY2xwLT5wIC0gZGVjbHAtPmIgPj0gNSAmJiBtZW1jbXAgKGRlY2xwLT5iLCAidHlwZSIsIDQpID09IDAKLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIGRlY2xwLT5iWzRdKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciAqLwotICAgICAgdGVtID0gZGVjbHAtPmIgKyA1OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IgIik7Ci0JICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0eXBlKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkZWNscC0+YlswXSA9PSAnXycgJiYgZGVjbHAtPmJbMV0gPT0gJ18nCi0JICAgJiYgZGVjbHAtPmJbMl0gPT0gJ28nICYmIGRlY2xwLT5iWzNdID09ICdwJykKLSAgICB7Ci0gICAgICAvKiBBTlNJLiAgKi8KLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBkZWNscC0+YiArIDQ7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciAiKTsKLQkgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJnR5cGUpOwotCSAgc3RyaW5nX2RlbGV0ZSAoJnR5cGUpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGRlY2xwLT5iWzBdID09ICdfJyAmJiBkZWNscC0+YlsxXSA9PSAnXycKLQkgICAmJiBkZWNscC0+YlsyXSA+PSAnYScgJiYgZGVjbHAtPmJbMl0gPD0gJ3onCi0JICAgJiYgZGVjbHAtPmJbM10gPj0gJ2EnICYmIGRlY2xwLT5iWzNdIDw9ICd6JykKLSAgICB7Ci0gICAgICBpZiAoZGVjbHAtPmJbNF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBPcGVyYXRvci4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDIKLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMiwgMikgPT0gMCkKLQkJewotCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGRlY2xwLT5iWzJdID09ICdhJyAmJiBkZWNscC0+Yls1XSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogQXNzaWdubWVudC4gICovCi0JICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JCXsKLQkJICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAzCi0JCSAgICAgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgZGVjbHAtPmIgKyAyLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkJICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogYSBtaW5pIHN0cmluZy1oYW5kbGluZyBwYWNrYWdlICovCi0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfbmVlZCAocywgbikKLSAgICAgc3RyaW5nICpzOwotICAgICBpbnQgbjsKLXsKLSAgaW50IHRlbTsKLQotICBpZiAocy0+YiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChuIDwgMzIpCi0JewotCSAgbiA9IDMyOwotCX0KLSAgICAgIHMtPnAgPSBzLT5iID0geG1hbGxvYyAobik7Ci0gICAgICBzLT5lID0gcy0+YiArIG47Ci0gICAgfQotICBlbHNlIGlmIChzLT5lIC0gcy0+cCA8IG4pCi0gICAgewotICAgICAgdGVtID0gcy0+cCAtIHMtPmI7Ci0gICAgICBuICs9IHRlbTsKLSAgICAgIG4gKj0gMjsKLSAgICAgIHMtPmIgPSB4cmVhbGxvYyAocy0+Yiwgbik7Ci0gICAgICBzLT5wID0gcy0+YiArIHRlbTsKLSAgICAgIHMtPmUgPSBzLT5iICsgbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfZGVsZXRlIChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIGlmIChzLT5iICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocy0+Yik7Ci0gICAgICBzLT5iID0gcy0+ZSA9IHMtPnAgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19pbml0IChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIHMtPmIgPSBzLT5wID0gcy0+ZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfY2xlYXIgKHMpCi0gICAgIHN0cmluZyAqczsKLXsKLSAgcy0+cCA9IHMtPmI7Ci19Ci0KLSNpZiAwCi0KLXN0YXRpYyBpbnQKLXN0cmluZ19lbXB0eSAocykKLSAgICAgc3RyaW5nICpzOwotewotICByZXR1cm4gKHMtPmIgPT0gcy0+cCk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZCAocCwgcykKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpbnQgbjsKLSAgaWYgKHMgPT0gTlVMTCB8fCAqcyA9PSAnXDAnKQotICAgIHJldHVybjsKLSAgbiA9IHN0cmxlbiAocyk7Ci0gIHN0cmluZ19uZWVkIChwLCBuKTsKLSAgbWVtY3B5IChwLT5wLCBzLCBuKTsKLSAgcC0+cCArPSBuOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZHMgKHAsIHMpCi0gICAgIHN0cmluZyAqcCwgKnM7Ci17Ci0gIGludCBuOwotCi0gIGlmIChzLT5iICE9IHMtPnApCi0gICAgewotICAgICAgbiA9IHMtPnAgLSBzLT5iOwotICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOwotICAgICAgbWVtY3B5IChwLT5wLCBzLT5iLCBuKTsKLSAgICAgIHAtPnAgKz0gbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kbiAocCwgcywgbikKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKG4gIT0gMCkKLSAgICB7Ci0gICAgICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gICAgICBtZW1jcHkgKHAtPnAsIHMsIG4pOwotICAgICAgcC0+cCArPSBuOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kIChwLCBzKQotICAgICBzdHJpbmcgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGlmIChzICE9IE5VTEwgJiYgKnMgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBzdHJpbmdfcHJlcGVuZG4gKHAsIHMsIHN0cmxlbiAocykpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kcyAocCwgcykKLSAgICAgc3RyaW5nICpwLCAqczsKLXsKLSAgaWYgKHMtPmIgIT0gcy0+cCkKLSAgICB7Ci0gICAgICBzdHJpbmdfcHJlcGVuZG4gKHAsIHMtPmIsIHMtPnAgLSBzLT5iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZG4gKHAsIHMsIG4pCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IG47Ci17Ci0gIGNoYXIgKnE7Ci0KLSAgaWYgKG4gIT0gMCkKLSAgICB7Ci0gICAgICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gICAgICBmb3IgKHEgPSBwLT5wIC0gMTsgcSA+PSBwLT5iOyBxLS0pCi0JewotCSAgcVtuXSA9IHFbMF07Ci0JfQotICAgICAgbWVtY3B5IChwLT5iLCBzLCBuKTsKLSAgICAgIHAtPnAgKz0gbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kX3RlbXBsYXRlX2lkeCAocywgaWR4KQotICAgICBzdHJpbmcgKnM7Ci0gICAgIGludCBpZHg7Ci17Ci0gIGNoYXIgYnVmW0lOVEJVRl9TSVpFICsgMSAvKiAnVCcgKi9dOwotICBzcHJpbnRmKGJ1ZiwgIlQlZCIsIGlkeCk7Ci0gIHN0cmluZ19hcHBlbmQgKHMsIGJ1Zik7Ci19Ci0KLS8qIFRvIGdlbmVyYXRlIGEgc3RhbmRhbG9uZSBkZW1hbmdsZXIgcHJvZ3JhbSBmb3IgdGVzdGluZyBwdXJwb3NlcywKLSAgIGp1c3QgY29tcGlsZSBhbmQgbGluayB0aGlzIGZpbGUgd2l0aCAtRE1BSU4gYW5kIGxpYmliZXJ0eS5hLiAgV2hlbgotICAgcnVuLCBpdCBkZW1hbmdsZXMgZWFjaCBjb21tYW5kIGxpbmUgYXJnLCBvciBlYWNoIHN0ZGluIHN0cmluZywgYW5kCi0gICBwcmludHMgdGhlIHJlc3VsdCBvbiBzdGRvdXQuICAqLwotCi0jaWZkZWYgTUFJTgotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpwcm9ncmFtX25hbWU7Ci1zdGF0aWMgY29uc3QgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gVkVSU0lPTjsKLXN0YXRpYyBpbnQgZmxhZ3MgPSBETUdMX1BBUkFNUyB8IERNR0xfQU5TSTsKLQotc3RhdGljIHZvaWQgZGVtYW5nbGVfaXQgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpIEFUVFJJQlVURV9OT1JFVFVSTjsKLXN0YXRpYyB2b2lkIGZhdGFsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpIEFUVFJJQlVURV9OT1JFVFVSTjsKLQotc3RhdGljIHZvaWQKLWRlbWFuZ2xlX2l0IChtYW5nbGVkX25hbWUpCi0gICAgIGNoYXIgKm1hbmdsZWRfbmFtZTsKLXsKLSAgY2hhciAqcmVzdWx0OwotCi0gIHJlc3VsdCA9IGNwbHVzX2RlbWFuZ2xlIChtYW5nbGVkX25hbWUsIGZsYWdzKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVzXG4iLCBtYW5nbGVkX25hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVzXG4iLCByZXN1bHQpOwotICAgICAgZnJlZSAocmVzdWx0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCAiXAotVXNhZ2U6ICVzIFstX10gWy1uXSBbLXMge2dudSxsdWNpZCxhcm0saHAsZWRnfV0gWy0tc3RyaXAtdW5kZXJzY29yZXNdXG5cCi0gICAgICAgWy0tbm8tc3RyaXAtdW5kZXJzY29yZXNdIFstLWZvcm1hdD17Z251LGx1Y2lkLGFybSxocCxlZGd9XVxuXAotICAgICAgWy0taGVscF0gWy0tdmVyc2lvbl0gW2FyZy4uLl1cbiIsCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotI2RlZmluZSBNQlVGX1NJWkUgMzI3NjcKLWNoYXIgbWJ1ZmZlcltNQlVGX1NJWkVdOwotCi0vKiBEZWZpbmVkIGluIHRoZSBhdXRvbWF0aWNhbGx5LWdlbmVyYXRlZCB1bmRlcnNjb3JlLmMuICAqLwotZXh0ZXJuIGludCBwcmVwZW5kc191bmRlcnNjb3JlOwotCi1pbnQgc3RyaXBfdW5kZXJzY29yZSA9IDA7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0gewotICB7InN0cmlwLXVuZGVyc2NvcmVzIiwgbm9fYXJndW1lbnQsIDAsICdfJ30sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdzJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImphdmEiLCBub19hcmd1bWVudCwgMCwgJ2onfSwKLSAgeyJuby1zdHJpcC11bmRlcnNjb3JlcyIsIG5vX2FyZ3VtZW50LCAwLCAnbid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotLyogTW9yZSAnZnJpZW5kbHknIGFib3J0IHRoYXQgcHJpbnRzIHRoZSBsaW5lIGFuZCBmaWxlLgotICAgY29uZmlnLmggY2FuICNkZWZpbmUgYWJvcnQgZmFuY3lfYWJvcnQgaWYgeW91IGxpa2UgdGhhdCBzb3J0IG9mIHRoaW5nLiAgKi8KLQotdm9pZAotZmFuY3lfYWJvcnQgKCkKLXsKLSAgZmF0YWwgKCJJbnRlcm5hbCBnY2MgYWJvcnQuIik7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotc3RhbmRhcmRfc3ltYm9sX2NoYXJhY3RlcnMgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ocF9zeW1ib2xfY2hhcmFjdGVycyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFJldHVybiB0aGUgc3RyaW5nIG9mIG5vbi1hbG51bSBjaGFyYWN0ZXJzIHRoYXQgbWF5IG9jY3VyIAotICAgYXMgYSB2YWxpZCBzeW1ib2wgY29tcG9uZW50LCBpbiB0aGUgc3RhbmRhcmQgYXNzZW1ibGVyIHN5bWJvbAotICAgc3ludGF4LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotc3RhbmRhcmRfc3ltYm9sX2NoYXJhY3RlcnMgKCkKLXsKLSAgcmV0dXJuICJfJC4iOwotfQotCi0KLS8qIFJldHVybiB0aGUgc3RyaW5nIG9mIG5vbi1hbG51bSBjaGFyYWN0ZXJzIHRoYXQgbWF5IG9jY3VyCi0gICBhcyBhIHZhbGlkIHN5bWJvbCBuYW1lIGNvbXBvbmVudCBpbiBhbiBIUCBvYmplY3QgZmlsZS4KLQotICAgTm90ZSB0aGF0LCBzaW5jZSBIUCdzIGNvbXBpbGVyIGdlbmVyYXRlcyBvYmplY3QgY29kZSBzdHJhaWdodCBmcm9tCi0gICBDKysgc291cmNlLCB3aXRob3V0IGdvaW5nIHRocm91Z2ggYW4gYXNzZW1ibGVyLCBpdHMgbWFuZ2xlZAotICAgaWRlbnRpZmllcnMgY2FuIHVzZSBhbGwgc29ydHMgb2YgY2hhcmFjdGVycyB0aGF0IG5vIGFzc2VtYmxlciB3b3VsZAotICAgdG9sZXJhdGUsIHNvIHRoZSBhbHBoYWJldCB0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgaXMgYSBsaXR0bGUgb2RkLgotICAgSGVyZSBhcmUgc29tZSBzYW1wbGUgbWFuZ2xlZCBpZGVudGlmaWVycyBvZmZlcmVkIGJ5IEhQOgotCi0JdHlwZWlkKl9fWFQyNEFkZHJlc3NJbmRFeHBDbGFzc01lbWJlcl8KLQlbVmZ0cHRyXWtleTpfX2R0X18zMk9yZGluYXJ5Q29tcGFyZUluZEV4cENsYXNzTWVtYmVyRnYKLQlfX2N0X19RMl85RWxmNjRfRHluMTh7dW5uYW1lZC51bmlvbi4jMX1GdgotCi0gICBUaGlzIHN0aWxsIHNlZW1zIHJlYWxseSB3ZWlyZCB0byBtZSwgc2luY2Ugbm93aGVyZSBlbHNlIGluIHRoaXMKLSAgIGZpbGUgaXMgdGhlcmUgYW55dGhpbmcgdG8gcmVjb2duaXplIGN1cmx5IGJyYWNrZXRzLCBwYXJlbnMsIGV0Yy4KLSAgIEkndmUgdGFsa2VkIHdpdGggU3Jpa2FudGggPHNyaWthbnRoQGN1cC5ocC5jb20+LCBhbmQgaGUgYXNzdXJlcyBtZQotICAgdGhpcyBpcyByaWdodCwgYnV0IEkgc3RpbGwgc3Ryb25nbHkgc3VzcGVjdCB0aGF0IHRoZXJlJ3MgYQotICAgbWlzdW5kZXJzdGFuZGluZyBoZXJlLgotCi0gICBJZiB3ZSBkZWNpZGUgaXQncyBiZXR0ZXIgZm9yIGMrK2ZpbHQgdG8gdXNlIEhQJ3MgYXNzZW1ibGVyIHN5bnRheAotICAgdG8gc2NyYXBlIGlkZW50aWZpZXJzIG91dCBvZiBpdHMgaW5wdXQsIGhlcmUncyB0aGUgZGVmaW5pdGlvbiBvZgotICAgdGhlIHN5bWJvbCBuYW1lIHN5bnRheCBmcm9tIHRoZSBIUCBhc3NlbWJsZXIgbWFudWFsOgotCi0gICAgICAgU3ltYm9scyBhcmUgY29tcG9zZWQgb2YgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgZGVjaW1hbAotICAgICAgIGRpZ2l0cywgZG9sbGFyIHN5bWJvbCwgcGVyaW9kICguKSwgYW1wZXJzYW5kICgmKSwgcG91bmQgc2lnbigjKSBhbmQKLSAgICAgICB1bmRlcnNjb3JlIChfKS4gQSBzeW1ib2wgY2FuIGJlZ2luIHdpdGggYSBsZXR0ZXIsIGRpZ2l0IHVuZGVyc2NvcmUgb3IKLSAgICAgICBkb2xsYXIgc2lnbi4gSWYgYSBzeW1ib2wgYmVnaW5zIHdpdGggYSBkaWdpdCwgaXQgbXVzdCBjb250YWluIGEKLSAgICAgICBub24tZGlnaXQgY2hhcmFjdGVyLgotCi0gICBTbyBoYXZlIGZ1bi4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ocF9zeW1ib2xfY2hhcmFjdGVycyAoKQotewotICByZXR1cm4gIl8kLjw+IywqJltdOigpe30iOwotfQotCi0KLWV4dGVybiBpbnQgbWFpbiBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKnJlc3VsdDsKLSAgaW50IGM7Ci0gIGNvbnN0IGNoYXIgKnZhbGlkX3N5bWJvbHM7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLQotICBzdHJpcF91bmRlcnNjb3JlID0gcHJlcGVuZHNfdW5kZXJzY29yZTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIl9uczpqIiwgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICc/JzoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQljYXNlICduJzoKLQkgIHN0cmlwX3VuZGVyc2NvcmUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICBwcmludGYgKCJHTlUgJXMgKEMrKyBkZW1hbmdsZXIpLCB2ZXJzaW9uICVzXG4iLCBwcm9ncmFtX25hbWUsIHByb2dyYW1fdmVyc2lvbik7Ci0JICByZXR1cm4gKDApOwotCWNhc2UgJ18nOgotCSAgc3RyaXBfdW5kZXJzY29yZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdqJzoKLQkgIGZsYWdzIHw9IERNR0xfSkFWQTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgaWYgKHN0cmNtcCAob3B0YXJnLCAiZ251IikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGdudV9kZW1hbmdsaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImx1Y2lkIikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGx1Y2lkX2RlbWFuZ2xpbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiYXJtIikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGFybV9kZW1hbmdsaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImhwIikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGhwX2RlbWFuZ2xpbmc7Ci0JICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImVkZyIpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGVkZ19kZW1hbmdsaW5nOwotICAgICAgICAgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHVua25vd24gZGVtYW5nbGluZyBzdHlsZSBgJXMnXG4iLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgICAgIHJldHVybiAoMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgZm9yICggOyBvcHRpbmQgPCBhcmdjOyBvcHRpbmQrKykKLQl7Ci0JICBkZW1hbmdsZV9pdCAoYXJndltvcHRpbmRdKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUpCi0JewotCWNhc2UgZ251X2RlbWFuZ2xpbmc6Ci0JY2FzZSBsdWNpZF9kZW1hbmdsaW5nOgotCWNhc2UgYXJtX2RlbWFuZ2xpbmc6Ci0JY2FzZSBlZGdfZGVtYW5nbGluZzoKLQkgIHZhbGlkX3N5bWJvbHMgPSBzdGFuZGFyZF9zeW1ib2xfY2hhcmFjdGVycyAoKTsKLQkgIGJyZWFrOwotCWNhc2UgaHBfZGVtYW5nbGluZzoKLQkgIHZhbGlkX3N5bWJvbHMgPSBocF9zeW1ib2xfY2hhcmFjdGVycyAoKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAvKiBGb2xrcyBzaG91bGQgZXhwbGljaXRseSBpbmRpY2F0ZSB0aGUgYXBwcm9wcmlhdGUgYWxwaGFiZXQgZm9yCi0JICAgICBlYWNoIGRlbWFuZ2xpbmcuICBQcm92aWRpbmcgYSBkZWZhdWx0IHdvdWxkIGFsbG93IHRoZQotCSAgICAgcXVlc3Rpb24gdG8gZ28gdW5jb25zaWRlcmVkLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgZm9yICg7OykKLQl7Ci0JICBpbnQgaSA9IDA7Ci0JICBjID0gZ2V0Y2hhciAoKTsKLQkgIC8qIFRyeSB0byByZWFkIGEgbGFiZWwuICAqLwotCSAgd2hpbGUgKGMgIT0gRU9GICYmIChpc2FsbnVtIChjKSB8fCBzdHJjaHIgKHZhbGlkX3N5bWJvbHMsIGMpKSkKLQkgICAgewotCSAgICAgIGlmIChpID49IE1CVUZfU0laRS0xKQotCQlicmVhazsKLQkgICAgICBtYnVmZmVyW2krK10gPSBjOwotCSAgICAgIGMgPSBnZXRjaGFyICgpOwotCSAgICB9Ci0JICBpZiAoaSA+IDApCi0JICAgIHsKLQkgICAgICBpbnQgc2tpcF9maXJzdCA9IDA7Ci0KLQkgICAgICBpZiAobWJ1ZmZlclswXSA9PSAnLicpCi0JCSsrc2tpcF9maXJzdDsKLQkgICAgICBpZiAoc3RyaXBfdW5kZXJzY29yZSAmJiBtYnVmZmVyW3NraXBfZmlyc3RdID09ICdfJykKLQkJKytza2lwX2ZpcnN0OwotCi0JICAgICAgaWYgKHNraXBfZmlyc3QgPiBpKQotCQlza2lwX2ZpcnN0ID0gaTsKLQotCSAgICAgIG1idWZmZXJbaV0gPSAwOwotCi0JICAgICAgcmVzdWx0ID0gY3BsdXNfZGVtYW5nbGUgKG1idWZmZXIgKyBza2lwX2ZpcnN0LCBmbGFncyk7Ci0JICAgICAgaWYgKHJlc3VsdCkKLQkJewotCQkgIGlmIChtYnVmZmVyWzBdID09ICcuJykKLQkJICAgIHB1dGMgKCcuJywgc3Rkb3V0KTsKLQkJICBmcHV0cyAocmVzdWx0LCBzdGRvdXQpOwotCQkgIGZyZWUgKHJlc3VsdCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWZwdXRzIChtYnVmZmVyLCBzdGRvdXQpOwotCi0JICAgICAgZmZsdXNoIChzdGRvdXQpOwotCSAgICB9Ci0JICBpZiAoYyA9PSBFT0YpCi0JICAgIGJyZWFrOwotCSAgcHV0Y2hhciAoYyk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAotZmF0YWwgKHN0cikKLSAgICAgY29uc3QgY2hhciAqc3RyOwotewotICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIHByb2dyYW1fbmFtZSwgc3RyKTsKLSAgZXhpdCAoMSk7Ci19Ci0KLVBUUgoteG1hbGxvYyAoc2l6ZSkKLSAgc2l6ZV90IHNpemU7Ci17Ci0gIHJlZ2lzdGVyIFBUUiB2YWx1ZSA9IChQVFIpIG1hbGxvYyAoc2l6ZSk7Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotUFRSCi14cmVhbGxvYyAocHRyLCBzaXplKQotICBQVFIgcHRyOwotICBzaXplX3Qgc2l6ZTsKLXsKLSAgcmVnaXN0ZXIgUFRSIHZhbHVlID0gKFBUUikgcmVhbGxvYyAocHRyLCBzaXplKTsKLSAgaWYgKHZhbHVlID09IDApCi0gICAgZmF0YWwgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotI2VuZGlmCS8qIG1haW4gKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9mZG1hdGNoLmMgYi9saWJpYmVydHkvZmRtYXRjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWYwMzlmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9mZG1hdGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBDb21wYXJlIHR3byBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgdG8gc2VlIGlmIHRoZXkgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyoKLQotTkFNRQotCi0JZmRtYXRjaCAtLSBzZWUgaWYgdHdvIGZpbGUgZGVzY3JpcHRvcnMgcmVmZXIgdG8gc2FtZSBmaWxlCi0KLVNZTk9QU0lTCi0KLQlpbnQgZmRtYXRjaCAoaW50IGZkMSwgaW50IGZkMikKLQotREVTQ1JJUFRJT04KLQotCUNoZWNrIHRvIHNlZSBpZiB0d28gb3BlbiBmaWxlIGRlc2NyaXB0b3JzIHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuCi0JVGhpcyBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIHdlIGhhdmUgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IKLQlmb3IgYW4gdW5uYW1lZCBmaWxlLCBhbmQgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgd2UgYmVsaWV2ZSB0byAKLQljb3JyZXNwb25kIHRvIHRoYXQgZmQuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhcmUgZXhlYydkIHdpdGgKLQlhbiBhbHJlYWR5IG9wZW4gZmlsZSAoc3Rkb3V0IGZvciBleGFtcGxlKSBvciBmcm9tIHRoZSBTVlI0IC9wcm9jCi0JY2FsbHMgdGhhdCByZXR1cm4gb3BlbiBmaWxlIGRlc2NyaXB0b3JzIGZvciBtYXBwZWQgYWRkcmVzcyBzcGFjZXMuCi0JQWxsIHdlIGhhdmUgdG8gZG8gaXMgb3BlbiB0aGUgZmlsZSBieSBuYW1lIGFuZCBjaGVjayB0aGUgdHdvIGZpbGUKLQlkZXNjcmlwdG9ycyBmb3IgYSBtYXRjaCwgd2hpY2ggaXMgZG9uZSBieSBjb21wYXJpbmcgbWFqb3ImbWlub3IKLQlkZXZpY2UgbnVtYmVycyBhbmQgaW5vZGUgbnVtYmVycy4KLQotQlVHUwotCi0JKEZJWE1FOiBkb2VzIHRoaXMgd29yayBmb3IgbmV0d29ya3M/KQotCUl0IHdvcmtzIGZvciBORlMsIHdoaWNoIGFzc2lnbnMgYSBkZXZpY2UgbnVtYmVyIHRvIGVhY2ggbW91bnQuCi0KLSovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLWludCBmZG1hdGNoIChmZDEsIGZkMikKLQlpbnQgZmQxOwotCWludCBmZDI7Ci17Ci0gIHN0cnVjdCBzdGF0IHNidWYxOwotICBzdHJ1Y3Qgc3RhdCBzYnVmMjsKLQotICBpZiAoKGZzdGF0IChmZDEsICZzYnVmMSkgPT0gMCkgJiYKLSAgICAgIChmc3RhdCAoZmQyLCAmc2J1ZjIpID09IDApICYmCi0gICAgICAoc2J1ZjEuc3RfZGV2ID09IHNidWYyLnN0X2RldikgJiYKLSAgICAgIChzYnVmMS5zdF9pbm8gPT0gc2J1ZjIuc3RfaW5vKSkKLSAgICB7Ci0gICAgICByZXR1cm4gKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMgYi9saWJpYmVydHkvZmxvYXRmb3JtYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4ZjE2ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZmxvYXRmb3JtYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKiBJRUVFIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgcm91dGluZXMsIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTQsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCi0jaW5jbHVkZSA8bWF0aC5oPgkJLyogbGRleHAgKi8KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotZXh0ZXJuIHZvaWQgKm1lbWNweSAodm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7Ci1leHRlcm4gdm9pZCAqbWVtc2V0ICh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOwotI2Vsc2UKLWV4dGVybiBjaGFyICptZW1jcHkgKCk7Ci1leHRlcm4gY2hhciAqbWVtc2V0ICgpOwotI2VuZGlmCi0KLS8qIFRoZSBvZGRzIHRoYXQgQ0hBUl9CSVQgd2lsbCBiZSBhbnl0aGluZyBidXQgOCBhcmUgbG93IGVub3VnaCB0aGF0IEknbSBub3QKLSAgIGdvaW5nIHRvIGJvdGhlciB3aXRoIHRyeWluZyB0byBtdWNrIGFyb3VuZCB3aXRoIHdoZXRoZXIgaXQgaXMgZGVmaW5lZCBpbgotICAgYSBzeXN0ZW0gaGVhZGVyLCB3aGF0IHdlIGRvIGlmIG5vdCwgZXRjLiAgKi8KLSNkZWZpbmUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQgOAotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIElFRUUgc2luZ2xlIGFuZCBkb3VibGUsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbi4gICovCi1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnID0KLXsKLSAgZmxvYXRmb3JtYXRfYmlnLCAzMiwgMCwgMSwgOCwgMTI3LCAyNTUsIDksIDIzLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfbGl0dGxlID0KLXsKLSAgZmxvYXRmb3JtYXRfbGl0dGxlLCAzMiwgMCwgMSwgOCwgMTI3LCAyNTUsIDksIDIzLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnID0KLXsKLSAgZmxvYXRmb3JtYXRfYmlnLCA2NCwgMCwgMSwgMTEsIDEwMjMsIDIwNDcsIDEyLCA1MiwgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZSA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgNjQsIDAsIDEsIDExLCAxMDIzLCAyMDQ3LCAxMiwgNTIsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLQotLyogZmxvYXRmb3JtYXQgZm9yIElFRUUgZG91YmxlLCBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIsIHdpdGggYmlnIGVuZGlhbiB3b3JkCi0gICBvcmRlcmluZywgYXMgb24gdGhlIEFSTS4gICovCi0KLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9saXR0bGVieXRlX2JpZ3dvcmQgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGVieXRlX2JpZ3dvcmQsIDY0LCAwLCAxLCAxMSwgMTAyMywgMjA0NywgMTIsIDUyLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci0KLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pMzg3X2V4dCA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgODAsIDAsIDEsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMTYsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X202ODg4MV9leHQgPQotewotICAvKiBOb3RlIHRoYXQgdGhlIGJpdHMgZnJvbSAxNiB0byAzMSBhcmUgdW51c2VkLiAgKi8KLSAgZmxvYXRmb3JtYXRfYmlnLCA5NiwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAzMiwgNjQsIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTk2MF9leHQgPQotewotICAvKiBOb3RlIHRoYXQgdGhlIGJpdHMgZnJvbSAwIHRvIDE1IGFyZSB1bnVzZWQuICAqLwotICBmbG9hdGZvcm1hdF9saXR0bGUsIDk2LCAxNiwgMTcsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMzIsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X204ODExMF9leHQgPQotewotI2lmZGVmIEhBUlJJU19GTE9BVF9GT1JNQVQKLSAgLyogSGFycmlzIHVzZXMgcmF3IGZvcm1hdCAxMjggYnl0ZXMgbG9uZywgYnV0IHRoZSBudW1iZXIgaXMganVzdCBhbiBpZWVlCi0gICAgIGRvdWJsZSwgYW5kIHRoZSBsYXN0IDY0IGJpdHMgYXJlIHdhc3RlZC4gKi8KLSAgZmxvYXRmb3JtYXRfYmlnLDEyOCwgMCwgMSwgMTEsICAweDNmZiwgIDB4N2ZmLCAxMiwgNTIsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotI2Vsc2UKLSAgZmxvYXRmb3JtYXRfYmlnLCA4MCwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAxNiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLSNlbmRpZiAvKiBIQVJSSVNfRkxPQVRfRk9STUFUICovCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2FybV9leHQgPQotewotICAvKiBCaXRzIDEgdG8gMTYgYXJlIHVudXNlZC4gICovCi0gIGZsb2F0Zm9ybWF0X2JpZywgOTYsIDAsIDE3LCAxNSwgMHgzZmZmLCAweDdmZmYsIDMyLCA2NCwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotfTsKLQwKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9maWVsZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosCi0JCQkJCWVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycywKLQkJCQkJdW5zaWduZWQgaW50LAotCQkJCQl1bnNpZ25lZCBpbnQsCi0JCQkJCXVuc2lnbmVkIGludCkpOwotCi0vKiBFeHRyYWN0IGEgZmllbGQgd2hpY2ggc3RhcnRzIGF0IFNUQVJUIGFuZCBpcyBMRU4gYnl0ZXMgbG9uZy4gIERBVEEgYW5kCi0gICBUT1RBTF9MRU4gYXJlIHRoZSB0aGluZyB3ZSBhcmUgZXh0cmFjdGluZyBpdCBmcm9tLCBpbiBieXRlb3JkZXIgT1JERVIuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldF9maWVsZCAoZGF0YSwgb3JkZXIsIHRvdGFsX2xlbiwgc3RhcnQsIGxlbikKLSAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIG9yZGVyOwotICAgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuOwotICAgICB1bnNpZ25lZCBpbnQgc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGludCBsZW47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmVzdWx0OwotICB1bnNpZ25lZCBpbnQgY3VyX2J5dGU7Ci0gIGludCBjdXJfYml0c2hpZnQ7Ci0KLSAgLyogU3RhcnQgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgY3VyX2J5dGUgPSAoc3RhcnQgKyBsZW4pIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgY3VyX2J5dGUgPSAodG90YWxfbGVuIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gY3VyX2J5dGUgLSAxOwotICBjdXJfYml0c2hpZnQgPQotICAgICgoc3RhcnQgKyBsZW4pICUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIHJlc3VsdCA9ICooZGF0YSArIGN1cl9ieXRlKSA+PiAoLWN1cl9iaXRzaGlmdCk7Ci0gIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLSAgICArK2N1cl9ieXRlOwotICBlbHNlCi0gICAgLS1jdXJfYnl0ZTsKLQotICAvKiBNb3ZlIHRvd2FyZHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLwotICB3aGlsZSAoKHVuc2lnbmVkIGludCkgY3VyX2JpdHNoaWZ0IDwgbGVuKQotICAgIHsKLSAgICAgIGlmIChsZW4gLSBjdXJfYml0c2hpZnQgPCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkKLQkvKiBUaGlzIGlzIHRoZSBsYXN0IGJ5dGU7IHplcm8gb3V0IHRoZSBiaXRzIHdoaWNoIGFyZSBub3QgcGFydCBvZgotCSAgIHRoaXMgZmllbGQuICAqLwotCXJlc3VsdCB8PQotCSAgKCooZGF0YSArIGN1cl9ieXRlKSAmICgoMSA8PCAobGVuIC0gY3VyX2JpdHNoaWZ0KSkgLSAxKSkKLQkgICAgPDwgY3VyX2JpdHNoaWZ0OwotICAgICAgZWxzZQotCXJlc3VsdCB8PSAqKGRhdGEgKyBjdXJfYnl0ZSkgPDwgY3VyX2JpdHNoaWZ0OwotICAgICAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOwotICAgICAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLQkrK2N1cl9ieXRlOwotICAgICAgZWxzZQotCS0tY3VyX2J5dGU7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotICAKLSNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLS8qIENvbnZlcnQgZnJvbSBGTVQgdG8gYSBkb3VibGUuCi0gICBGUk9NIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbmRlZCBmbG9hdC4KLSAgIFN0b3JlIHRoZSBkb3VibGUgaW4gKlRPLiAgKi8KLQotdm9pZAotZmxvYXRmb3JtYXRfdG9fZG91YmxlIChmbXQsIGZyb20sIHRvKQotICAgICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKmZtdDsKLSAgICAgY2hhciAqZnJvbTsKLSAgICAgZG91YmxlICp0bzsKLXsKLSAgdW5zaWduZWQgY2hhciAqdWZyb20gPSAodW5zaWduZWQgY2hhciAqKWZyb207Ci0gIGRvdWJsZSBkdG87Ci0gIGxvbmcgZXhwb25lbnQ7Ci0gIHVuc2lnbmVkIGxvbmcgbWFudDsKLSAgdW5zaWduZWQgaW50IG1hbnRfYml0cywgbWFudF9vZmY7Ci0gIGludCBtYW50X2JpdHNfbGVmdDsKLSAgaW50IHNwZWNpYWxfZXhwb25lbnQ7CQkvKiBJdCdzIGEgTmFOLCBkZW5vcm0gb3IgemVybyAqLwotCi0gIGV4cG9uZW50ID0gZ2V0X2ZpZWxkICh1ZnJvbSwgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLAotCQkJZm10LT5leHBfc3RhcnQsIGZtdC0+ZXhwX2xlbik7Ci0gIC8qIE5vdGUgdGhhdCBpZiBleHBvbmVudCBpbmRpY2F0ZXMgYSBOYU4sIHdlIGNhbid0IHJlYWxseSBkbyBhbnl0aGluZyB1c2VmdWwKLSAgICAgKG5vdCBrbm93aW5nIGlmIHRoZSBob3N0IGhhcyBOYU4ncywgb3IgaG93IHRvIGJ1aWxkIG9uZSkuICBTbyBpdCB3aWxsCi0gICAgIGVuZCB1cCBhcyBhbiBpbmZpbml0eSBvciBzb21ldGhpbmcgY2xvc2U7IHRoYXQgaXMgT0suICAqLwotCi0gIG1hbnRfYml0c19sZWZ0ID0gZm10LT5tYW5fbGVuOwotICBtYW50X29mZiA9IGZtdC0+bWFuX3N0YXJ0OwotICBkdG8gPSAwLjA7Ci0KLSAgc3BlY2lhbF9leHBvbmVudCA9IGV4cG9uZW50ID09IDAgfHwgKHVuc2lnbmVkIGxvbmcpIGV4cG9uZW50ID09IGZtdC0+ZXhwX25hbjsKLQotICAvKiBEb24ndCBiaWFzIHplcm8ncywgZGVub3JtcyBvciBOYU5zLiAgKi8KLSAgaWYgKCFzcGVjaWFsX2V4cG9uZW50KQotICAgIGV4cG9uZW50IC09IGZtdC0+ZXhwX2JpYXM7Ci0KLSAgLyogQnVpbGQgdGhlIHJlc3VsdCBhbGdlYnJhaWNhbGx5LiAgTWlnaHQgZ28gaW5maW5pdGUsIHVuZGVyZmxvdywgZXRjOwotICAgICB3aG8gY2FyZXMuICovCi0KLSAgLyogSWYgdGhpcyBmb3JtYXQgdXNlcyBhIGhpZGRlbiBiaXQsIGV4cGxpY2l0bHkgYWRkIGl0IGluIG5vdy4gIE90aGVyd2lzZSwKLSAgICAgaW5jcmVtZW50IHRoZSBleHBvbmVudCBieSBvbmUgdG8gYWNjb3VudCBmb3IgdGhlIGludGVnZXIgYml0LiAgKi8KLQotICBpZiAoIXNwZWNpYWxfZXhwb25lbnQpCi0gICAgewotICAgICAgaWYgKGZtdC0+aW50Yml0ID09IGZsb2F0Zm9ybWF0X2ludGJpdF9ubykKLQlkdG8gPSBsZGV4cCAoMS4wLCBleHBvbmVudCk7Ci0gICAgICBlbHNlCi0JZXhwb25lbnQrKzsKLSAgICB9Ci0KLSAgd2hpbGUgKG1hbnRfYml0c19sZWZ0ID4gMCkKLSAgICB7Ci0gICAgICBtYW50X2JpdHMgPSBtaW4gKG1hbnRfYml0c19sZWZ0LCAzMik7Ci0KLSAgICAgIG1hbnQgPSBnZXRfZmllbGQgKHVmcm9tLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsCi0JCQkgbWFudF9vZmYsIG1hbnRfYml0cyk7Ci0KLSAgICAgIGR0byArPSBsZGV4cCAoKGRvdWJsZSltYW50LCBleHBvbmVudCAtIG1hbnRfYml0cyk7Ci0gICAgICBleHBvbmVudCAtPSBtYW50X2JpdHM7Ci0gICAgICBtYW50X29mZiArPSBtYW50X2JpdHM7Ci0gICAgICBtYW50X2JpdHNfbGVmdCAtPSBtYW50X2JpdHM7Ci0gICAgfQotCi0gIC8qIE5lZ2F0ZSBpdCBpZiBuZWdhdGl2ZS4gICovCi0gIGlmIChnZXRfZmllbGQgKHVmcm9tLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+c2lnbl9zdGFydCwgMSkpCi0gICAgZHRvID0gLWR0bzsKLSAgKnRvID0gZHRvOwotfQotDAotc3RhdGljIHZvaWQgcHV0X2ZpZWxkIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLQotLyogU2V0IGEgZmllbGQgd2hpY2ggc3RhcnRzIGF0IFNUQVJUIGFuZCBpcyBMRU4gYnl0ZXMgbG9uZy4gIERBVEEgYW5kCi0gICBUT1RBTF9MRU4gYXJlIHRoZSB0aGluZyB3ZSBhcmUgZXh0cmFjdGluZyBpdCBmcm9tLCBpbiBieXRlb3JkZXIgT1JERVIuICAqLwotc3RhdGljIHZvaWQKLXB1dF9maWVsZCAoZGF0YSwgb3JkZXIsIHRvdGFsX2xlbiwgc3RhcnQsIGxlbiwgc3R1ZmZfdG9fcHV0KQotICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICBlbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMgb3JkZXI7Ci0gICAgIHVuc2lnbmVkIGludCB0b3RhbF9sZW47Ci0gICAgIHVuc2lnbmVkIGludCBzdGFydDsKLSAgICAgdW5zaWduZWQgaW50IGxlbjsKLSAgICAgdW5zaWduZWQgbG9uZyBzdHVmZl90b19wdXQ7Ci17Ci0gIHVuc2lnbmVkIGludCBjdXJfYnl0ZTsKLSAgaW50IGN1cl9iaXRzaGlmdDsKLQotICAvKiBTdGFydCBhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLwotICBjdXJfYnl0ZSA9IChzdGFydCArIGxlbikgLyBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLSAgICBjdXJfYnl0ZSA9ICh0b3RhbF9sZW4gLyBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBjdXJfYnl0ZSAtIDE7Ci0gIGN1cl9iaXRzaGlmdCA9Ci0gICAgKChzdGFydCArIGxlbikgJSBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgKihkYXRhICsgY3VyX2J5dGUpICY9Ci0gICAgfigoKDEgPDwgKChzdGFydCArIGxlbikgJSBGTE9BVEZPUk1BVF9DSEFSX0JJVCkpIC0gMSkgPDwgKC1jdXJfYml0c2hpZnQpKTsKLSAgKihkYXRhICsgY3VyX2J5dGUpIHw9Ci0gICAgKHN0dWZmX3RvX3B1dCAmICgoMSA8PCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSAxKSkgPDwgKC1jdXJfYml0c2hpZnQpOwotICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgKytjdXJfYnl0ZTsKLSAgZWxzZQotICAgIC0tY3VyX2J5dGU7Ci0KLSAgLyogTW92ZSB0b3dhcmRzIHRoZSBtb3N0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgd2hpbGUgKCh1bnNpZ25lZCBpbnQpIGN1cl9iaXRzaGlmdCA8IGxlbikKLSAgICB7Ci0gICAgICBpZiAobGVuIC0gY3VyX2JpdHNoaWZ0IDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpCi0JewotCSAgLyogVGhpcyBpcyB0aGUgbGFzdCBieXRlLiAgKi8KLQkgICooZGF0YSArIGN1cl9ieXRlKSAmPQotCSAgICB+KCgxIDw8IChsZW4gLSBjdXJfYml0c2hpZnQpKSAtIDEpOwotCSAgKihkYXRhICsgY3VyX2J5dGUpIHw9IChzdHVmZl90b19wdXQgPj4gY3VyX2JpdHNoaWZ0KTsKLQl9Ci0gICAgICBlbHNlCi0JKihkYXRhICsgY3VyX2J5dGUpID0gKChzdHVmZl90b19wdXQgPj4gY3VyX2JpdHNoaWZ0KQotCQkJICAgICAgJiAoKDEgPDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gMSkpOwotICAgICAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOwotICAgICAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLQkrK2N1cl9ieXRlOwotICAgICAgZWxzZQotCS0tY3VyX2J5dGU7Ci0gICAgfQotfQotCi0vKiBUaGUgY29udmVyc2U6IGNvbnZlcnQgdGhlIGRvdWJsZSAqRlJPTSB0byBhbiBleHRlbmRlZCBmbG9hdAotICAgYW5kIHN0b3JlIHdoZXJlIFRPIHBvaW50cy4gIE5laXRoZXIgRlJPTSBub3IgVE8gaGF2ZSBhbnkgYWxpZ25tZW50Ci0gICByZXN0cmljdGlvbnMuICAqLwotCi12b2lkCi1mbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSAoZm10LCBmcm9tLCB0bykKLSAgICAgY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICpmbXQ7Ci0gICAgIGRvdWJsZSAqZnJvbTsKLSAgICAgY2hhciAqdG87Ci17Ci0gIGRvdWJsZSBkZnJvbTsKLSAgaW50IGV4cG9uZW50OwotICBkb3VibGUgbWFudDsKLSAgdW5zaWduZWQgaW50IG1hbnRfYml0cywgbWFudF9vZmY7Ci0gIGludCBtYW50X2JpdHNfbGVmdDsKLSAgdW5zaWduZWQgY2hhciAqdXRvID0gKHVuc2lnbmVkIGNoYXIgKil0bzsKLQotICBtZW1jcHkgKCZkZnJvbSwgZnJvbSwgc2l6ZW9mIChkZnJvbSkpOwotICBtZW1zZXQgKHV0bywgMCwgZm10LT50b3RhbHNpemUgLyBGTE9BVEZPUk1BVF9DSEFSX0JJVCk7Ci0gIGlmIChkZnJvbSA9PSAwKQotICAgIHJldHVybjsJCQkvKiBSZXN1bHQgaXMgemVybyAqLwotICBpZiAoZGZyb20gIT0gZGZyb20pCi0gICAgewotICAgICAgLyogRnJvbSBpcyBOYU4gKi8KLSAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+ZXhwX3N0YXJ0LAotCQkgZm10LT5leHBfbGVuLCBmbXQtPmV4cF9uYW4pOwotICAgICAgLyogQmUgc3VyZSBpdCdzIG5vdCBpbmZpbml0eSwgYnV0IE5hTiB2YWx1ZSBpcyBpcnJlbCAqLwotICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5tYW5fc3RhcnQsCi0JCSAzMiwgMSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIG5lZ2F0aXZlLCBzZXQgdGhlIHNpZ24gYml0LiAgKi8KLSAgaWYgKGRmcm9tIDwgMCkKLSAgICB7Ci0gICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPnNpZ25fc3RhcnQsIDEsIDEpOwotICAgICAgZGZyb20gPSAtZGZyb207Ci0gICAgfQotCi0gIC8qIEhvdyB0byB0ZWxsIGFuIGluZmluaXR5IGZyb20gYW4gb3JkaW5hcnkgbnVtYmVyPyAgRklYTUUtc29tZWRheSAqLwotCi0gIG1hbnQgPSBmcmV4cCAoZGZyb20sICZleHBvbmVudCk7Ci0gIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+ZXhwX3N0YXJ0LCBmbXQtPmV4cF9sZW4sCi0JICAgICBleHBvbmVudCArIGZtdC0+ZXhwX2JpYXMgLSAxKTsKLQotICBtYW50X2JpdHNfbGVmdCA9IGZtdC0+bWFuX2xlbjsKLSAgbWFudF9vZmYgPSBmbXQtPm1hbl9zdGFydDsKLSAgd2hpbGUgKG1hbnRfYml0c19sZWZ0ID4gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1hbnRfbG9uZzsKLSAgICAgIG1hbnRfYml0cyA9IG1hbnRfYml0c19sZWZ0IDwgMzIgPyBtYW50X2JpdHNfbGVmdCA6IDMyOwotCi0gICAgICBtYW50ICo9IDQyOTQ5NjcyOTYuMDsKLSAgICAgIG1hbnRfbG9uZyA9ICh1bnNpZ25lZCBsb25nKW1hbnQ7Ci0gICAgICBtYW50IC09IG1hbnRfbG9uZzsKLQotICAgICAgLyogSWYgdGhlIGludGVnZXIgYml0IGlzIGltcGxpY2l0LCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBpdC4KLQkgSWYgd2UgYXJlIGRpc2NhcmRpbmcgYSB6ZXJvLCB3ZSBzaG91bGQgYmUgKGJ1dCBhcmUgbm90KSBjcmVhdGluZwotCSBhIGRlbm9ybWFsaXplZAludW1iZXIgd2hpY2ggbWVhbnMgYWRqdXN0aW5nIHRoZSBleHBvbmVudAotCSAoSSB0aGluaykuICAqLwotICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIG1hbnRfYml0c19sZWZ0ID09IGZtdC0+bWFuX2xlbgotCSAgJiYgZm10LT5pbnRiaXQgPT0gZmxvYXRmb3JtYXRfaW50Yml0X25vKQotCXsKLQkgIG1hbnRfbG9uZyAmPSAweDdmZmZmZmZmOwotCSAgbWFudF9iaXRzIC09IDE7Ci0JfQotICAgICAgZWxzZSBpZiAobWFudF9iaXRzIDwgMzIpCi0JewotCSAgLyogVGhlIGJpdHMgd2Ugd2FudCBhcmUgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgTUFOVF9CSVRTIGJpdHMgb2YKLQkgICAgIG1hbnRfbG9uZy4gIE1vdmUgdGhlbSB0byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQuICAqLwotCSAgbWFudF9sb25nID4+PSAzMiAtIG1hbnRfYml0czsKLQl9Ci0KLSAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsCi0JCSBtYW50X29mZiwgbWFudF9iaXRzLCBtYW50X2xvbmcpOwotICAgICAgbWFudF9vZmYgKz0gbWFudF9iaXRzOwotICAgICAgbWFudF9iaXRzX2xlZnQgLT0gbWFudF9iaXRzOwotICAgIH0KLX0KLQotCi0jaWZkZWYgSUVFRV9ERUJVRwotCi0vKiBUaGlzIGlzIHRvIGJlIHJ1biBvbiBhIGhvc3Qgd2hpY2ggdXNlcyBJRUVFIGZsb2F0aW5nIHBvaW50LiAgKi8KLQotdm9pZAotaWVlZV90ZXN0IChuKQotICAgICBkb3VibGUgbjsKLXsKLSAgZG91YmxlIHJlc3VsdDsKLSAgY2hhciBleHRlblsxNl07Ci0KLSAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnLCAmbiwgJnJlc3VsdCk7Ci0gIGlmIChuICE9IHJlc3VsdCkKLSAgICBwcmludGYgKCJEaWZmZXIodG8pOiAlLjIwZyAtPiAlLjIwZ1xuIiwgbiwgcmVzdWx0KTsKLSAgZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgKCZmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWcsICZuLCAmcmVzdWx0KTsKLSAgaWYgKG4gIT0gcmVzdWx0KQotICAgIHByaW50ZiAoIkRpZmZlcihmcm9tKTogJS4yMGcgLT4gJS4yMGdcbiIsIG4sIHJlc3VsdCk7Ci0KLSAgZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgKCZmbG9hdGZvcm1hdF9tNjg4ODFfZXh0LCAmbiwgZXh0ZW4pOwotICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9tNjg4ODFfZXh0LCBleHRlbiwgJnJlc3VsdCk7Ci0gIGlmIChuICE9IHJlc3VsdCkKLSAgICBwcmludGYgKCJEaWZmZXIodG8rZnJvbSk6ICUuMjBnIC0+ICUuMjBnXG4iLCBuLCByZXN1bHQpOwotCi0jaWYgSUVFRV9ERUJVRyA+IDEKLSAgLyogVGhpcyBpcyB0byBiZSBydW4gb24gYSBob3N0IHdoaWNoIHVzZXMgNjg4ODEgZm9ybWF0LiAgKi8KLSAgewotICAgIGxvbmcgZG91YmxlIGV4ID0gKihsb25nIGRvdWJsZSAqKWV4dGVuOwotICAgIGlmIChleCAhPSBuKQotICAgICAgcHJpbnRmICgiRGlmZmVyKGZyb20gdnMuIGV4dGVuZGVkKTogJS4yMGdcbiIsIG4pOwotICB9Ci0jZW5kaWYKLX0KLQotaW50Ci1tYWluICgpCi17Ci0gIGllZWVfdGVzdCAoMC41KTsKLSAgaWVlZV90ZXN0ICgyNTYuMCk7Ci0gIGllZWVfdGVzdCAoMC4xMjM0NSk7Ci0gIGllZWVfdGVzdCAoMjM0MjM1Ljc4OTA3MjM0KTsKLSAgaWVlZV90ZXN0ICgtNTEyLjApOwotICBpZWVlX3Rlc3QgKC0wLjAwNDMyMSk7Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZm5tYXRjaC5jIGIvbGliaWJlcnR5L2ZubWF0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5YmZlNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZm5tYXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLUJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BwcmVwLmFpLm1pdC5lZHUuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2lmIGRlZmluZWQgKENPTkZJR19CUk9LRVRTKQotLyogV2UgdXNlIDxjb25maWcuaD4gaW5zdGVhZCBvZiAiY29uZmlnLmgiIHNvIHRoYXQgYSBjb21waWxhdGlvbgotICAgdXNpbmcgLUkuIC1JJHNyY2RpciB3aWxsIHVzZSAuL2NvbmZpZy5oIHJhdGhlciB0aGFuICRzcmNkaXIvY29uZmlnLmgKLSAgICh3aGljaCBpdCB3b3VsZCBkbyBiZWNhdXNlIGl0IGZvdW5kIHRoaXMgZmlsZSBpbiAkc3JjZGlyKS4gICovCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZWxzZQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWZuZGVmIF9HTlVfU09VUkNFCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jZW5kaWYKLQotLyogVGhpcyBjb2RlIHRvIHVuZGVmIGNvbnN0IGFkZGVkIGluIGxpYmliZXJ0eS4gICovCi0jaWZuZGVmIF9fU1REQ19fCi0vKiBUaGlzIGlzIGEgc2VwYXJhdGUgY29uZGl0aW9uYWwgc2luY2Ugc29tZSBzdGRjIHN5c3RlbXMKLSAgIHJlamVjdCBgZGVmaW5lZCAoY29uc3QpJy4gICovCi0jaWZuZGVmIGNvbnN0Ci0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmbm1hdGNoLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotCi0vKiBDb21tZW50IG91dCBhbGwgdGhpcyBjb2RlIGlmIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSwgYW5kIGFyZSBub3QKLSAgIGFjdHVhbGx5IGNvbXBpbGluZyB0aGUgbGlicmFyeSBpdHNlbGYuICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VIEMKLSAgIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKLSAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKLSAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQotICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0IGZpbGVzLAotICAgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLwotCi0jaWYgZGVmaW5lZCAoX0xJQkMpIHx8ICFkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pCi0KLQotI2lmICFkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgJiYgIWRlZmluZWQoU1REQ19IRUFERVJTKQotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotCi0vKiBNYXRjaCBTVFJJTkcgYWdhaW5zdCB0aGUgZmlsZW5hbWUgcGF0dGVybiBQQVRURVJOLCByZXR1cm5pbmcgemVybyBpZgotICAgaXQgbWF0Y2hlcywgbm9uemVybyBpZiBub3QuICAqLwotaW50Ci1mbm1hdGNoIChwYXR0ZXJuLCBzdHJpbmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwYXR0ZXJuOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IHBhdHRlcm4sICpuID0gc3RyaW5nOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGM7Ci0KLS8qIE5vdGUgdGhhdCB0aGlzIGV2YWx1dGVzIEMgbWFueSB0aW1lcy4gICovCi0jZGVmaW5lIEZPTEQoYykJKChmbGFncyAmIEZOTV9DQVNFRk9MRCkgJiYgaXN1cHBlciAoYykgPyB0b2xvd2VyIChjKSA6IChjKSkKLQotICB3aGlsZSAoKGMgPSAqcCsrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGMgPSBGT0xEIChjKTsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICc/JzoKLQkgIGlmICgqbiA9PSAnXDAnKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICBlbHNlIGlmICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiAqbiA9PSAnLycpCi0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkgIGVsc2UgaWYgKChmbGFncyAmIEZOTV9QRVJJT0QpICYmICpuID09ICcuJyAmJgotCQkgICAobiA9PSBzdHJpbmcgfHwgKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmIG5bLTFdID09ICcvJykpKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICBicmVhazsKLQotCWNhc2UgJ1xcJzoKLQkgIGlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSkKLQkgICAgewotCSAgICAgIGMgPSAqcCsrOwotCSAgICAgIGMgPSBGT0xEIChjKTsKLQkgICAgfQotCSAgaWYgKEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSAhPSBjKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICBicmVhazsKLQotCWNhc2UgJyonOgotCSAgaWYgKChmbGFncyAmIEZOTV9QRVJJT0QpICYmICpuID09ICcuJyAmJgotCSAgICAgIChuID09IHN0cmluZyB8fCAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgblstMV0gPT0gJy8nKSkpCi0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCSAgZm9yIChjID0gKnArKzsgYyA9PSAnPycgfHwgYyA9PSAnKic7IGMgPSAqcCsrLCArK24pCi0JICAgIGlmICgoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgKm4gPT0gJy8nKSB8fAotCQkoYyA9PSAnPycgJiYgKm4gPT0gJ1wwJykpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JICBpZiAoYyA9PSAnXDAnKQotCSAgICByZXR1cm4gMDsKLQotCSAgewotCSAgICB1bnNpZ25lZCBjaGFyIGMxID0gKCEoZmxhZ3MgJiBGTk1fTk9FU0NBUEUpICYmIGMgPT0gJ1xcJykgPyAqcCA6IGM7Ci0JICAgIGMxID0gRk9MRCAoYzEpOwotCSAgICBmb3IgKC0tcDsgKm4gIT0gJ1wwJzsgKytuKQotCSAgICAgIGlmICgoYyA9PSAnWycgfHwgRk9MRCAoKHVuc2lnbmVkIGNoYXIpKm4pID09IGMxKSAmJgotCQkgIGZubWF0Y2ggKHAsIG4sIGZsYWdzICYgfkZOTV9QRVJJT0QpID09IDApCi0JCXJldHVybiAwOwotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICB9Ci0KLQljYXNlICdbJzoKLQkgIHsKLQkgICAgLyogTm9uemVybyBpZiB0aGUgc2Vuc2Ugb2YgdGhlIGNoYXJhY3RlciBjbGFzcyBpcyBpbnZlcnRlZC4gICovCi0JICAgIHJlZ2lzdGVyIGludCBub3Q7Ci0KLQkgICAgaWYgKCpuID09ICdcMCcpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JICAgIGlmICgoZmxhZ3MgJiBGTk1fUEVSSU9EKSAmJiAqbiA9PSAnLicgJiYKLQkJKG4gPT0gc3RyaW5nIHx8ICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiBuWy0xXSA9PSAnLycpKSkKLQkgICAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkgICAgbm90ID0gKCpwID09ICchJyB8fCAqcCA9PSAnXicpOwotCSAgICBpZiAobm90KQotCSAgICAgICsrcDsKLQotCSAgICBjID0gKnArKzsKLQkgICAgZm9yICg7OykKLQkgICAgICB7Ci0JCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY3N0YXJ0ID0gYywgY2VuZCA9IGM7Ci0KLQkJaWYgKCEoZmxhZ3MgJiBGTk1fTk9FU0NBUEUpICYmIGMgPT0gJ1xcJykKLQkJICBjc3RhcnQgPSBjZW5kID0gKnArKzsKLQotCQljc3RhcnQgPSBjZW5kID0gRk9MRCAoY3N0YXJ0KTsKLQotCQlpZiAoYyA9PSAnXDAnKQotCQkgIC8qIFsgKHVudGVybWluYXRlZCkgbG9zZXMuICAqLwotCQkgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCQljID0gKnArKzsKLQkJYyA9IEZPTEQgKGMpOwotCi0JCWlmICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiBjID09ICcvJykKLQkJICAvKiBbL10gY2FuIG5ldmVyIG1hdGNoLiAgKi8KLQkJICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkJaWYgKGMgPT0gJy0nICYmICpwICE9ICddJykKLQkJICB7Ci0JCSAgICBjZW5kID0gKnArKzsKLQkJICAgIGlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjZW5kID09ICdcXCcpCi0JCSAgICAgIGNlbmQgPSAqcCsrOwotCQkgICAgaWYgKGNlbmQgPT0gJ1wwJykKLQkJICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCQkgICAgY2VuZCA9IEZPTEQgKGNlbmQpOwotCi0JCSAgICBjID0gKnArKzsKLQkJICB9Ci0KLQkJaWYgKEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSA+PSBjc3RhcnQKLQkJICAgICYmIEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSA8PSBjZW5kKQotCQkgIGdvdG8gbWF0Y2hlZDsKLQotCQlpZiAoYyA9PSAnXScpCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoIW5vdCkKLQkgICAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICAgIGJyZWFrOwotCi0JICBtYXRjaGVkOjsKLQkgICAgLyogU2tpcCB0aGUgcmVzdCBvZiB0aGUgWy4uLl0gdGhhdCBhbHJlYWR5IG1hdGNoZWQuICAqLwotCSAgICB3aGlsZSAoYyAhPSAnXScpCi0JICAgICAgewotCQlpZiAoYyA9PSAnXDAnKQotCQkgIC8qIFsuLi4gKHVudGVybWluYXRlZCkgbG9zZXMuICAqLwotCQkgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCQljID0gKnArKzsKLQkJaWYgKCEoZmxhZ3MgJiBGTk1fTk9FU0NBUEUpICYmIGMgPT0gJ1xcJykKLQkJICAvKiBYWFggMTAwMy4yZDExIGlzIHVuY2xlYXIgaWYgdGhpcyBpcyByaWdodC4gICovCi0JCSAgKytwOwotCSAgICAgIH0KLQkgICAgaWYgKG5vdCkKLQkgICAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBpZiAoYyAhPSBGT0xEICgodW5zaWduZWQgY2hhcikqbikpCi0JICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQl9Ci0KLSAgICAgICsrbjsKLSAgICB9Ci0KLSAgaWYgKCpuID09ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKChmbGFncyAmIEZOTV9MRUFESU5HX0RJUikgJiYgKm4gPT0gJy8nKQotICAgIC8qIFRoZSBGTk1fTEVBRElOR19ESVIgZmxhZyBzYXlzIHRoYXQgImZvbyoiIG1hdGNoZXMgImZvb2Jhci9mcm9ib3p6Ii4gICovCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIEZOTV9OT01BVENIOwotfQotCi0jZW5kaWYJLyogX0xJQkMgb3Igbm90IF9fR05VX0xJQlJBUllfXy4gICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZ2V0Y3dkLmMgYi9saWJpYmVydHkvZ2V0Y3dkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjFjMWUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldGN3ZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyogRW11bGF0ZSBnZXRjd2QgdXNpbmcgZ2V0d2QuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi0vKgotTkFNRQotCWdldGN3ZCAtLSBnZXQgYWJzb2x1dGUgcGF0aG5hbWUgZm9yIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKLQotU1lOT1BTSVMKLQljaGFyICpnZXRjd2QgKGNoYXIgcGF0aG5hbWVbbGVuXSwgbGVuKQotCi1ERVNDUklQVElPTgotCUNvcHkgdGhlIGFic29sdXRlIHBhdGhuYW1lIGZvciB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpbnRvCi0JdGhlIHN1cHBsaWVkIGJ1ZmZlciBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLiAgSWYgdGhlIAotCWN1cnJlbnQgZGlyZWN0b3J5J3MgcGF0aCBkb2Vzbid0IGZpdCBpbiBMRU4gY2hhcmFjdGVycywgdGhlIHJlc3VsdAotCWlzIE5VTEwgYW5kIGVycm5vIGlzIHNldC4KLQotCUlmIHBhdGhuYW1lIGlzIGEgbnVsbCBwb2ludGVyLCBnZXRjd2QoKSB3aWxsIG9idGFpbiBzaXplIGJ5dGVzIG9mCi0Jc3BhY2UgdXNpbmcgbWFsbG9jLgotCi1CVUdTCi0JRW11bGF0ZWQgdmlhIHRoZSBnZXR3ZCgpIGNhbGwsIHdoaWNoIGlzIHJlYXNvbmFibGUgZm9yIG1vc3QKLQlzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgZ2V0Y3dkKCkuCi0KLSovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLWV4dGVybiBjaGFyICpnZXR3ZCAoKTsKLWV4dGVybiBpbnQgZXJybm87Ci0KLSNpZm5kZWYgTUFYUEFUSExFTgotI2RlZmluZSBNQVhQQVRITEVOIDEwMjQKLSNlbmRpZgotCi1jaGFyICoKLWdldGN3ZCAoYnVmLCBsZW4pCi0gIGNoYXIgKmJ1ZjsKLSAgaW50IGxlbjsKLXsKLSAgY2hhciBvdXJidWZbTUFYUEFUSExFTl07Ci0gIGNoYXIgKnJlc3VsdDsKLQotICByZXN1bHQgPSBnZXR3ZCAob3VyYnVmKTsKLSAgaWYgKHJlc3VsdCkgewotICAgIGlmIChzdHJsZW4gKG91cmJ1ZikgPj0gbGVuKSB7Ci0gICAgICBlcnJubyA9IEVSQU5HRTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoIWJ1ZikgewotICAgICAgIGJ1ZiA9IChjaGFyKiltYWxsb2MobGVuKTsKLSAgICAgICBpZiAoIWJ1ZikgewotICAgICAgICAgICBlcnJubyA9IEVOT01FTTsKLQkgICByZXR1cm4gMDsKLSAgICAgICB9Ci0gICAgfQotICAgIHN0cmNweSAoYnVmLCBvdXJidWYpOwotICB9Ci0gIHJldHVybiBidWY7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvZ2V0b3B0LmMgYi9saWJpYmVydHkvZ2V0b3B0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTUzMWUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldG9wdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NiArMCwwIEBACi0vKiBHZXRvcHQgZm9yIEdOVS4KLSAgIE5PVEU6IGdldG9wdCBpcyBub3cgcGFydCBvZiB0aGUgQyBsaWJyYXJ5LCBzbyBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0Ci0gICAiS2VlcCB0aGlzIGZpbGUgbmFtZS1zcGFjZSBjbGVhbiIgbWVhbnMsIHRhbGsgdG8gZHJlcHBlckBnbnUub3JnCi0gICBiZWZvcmUgY2hhbmdpbmcgaXQhCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4Ci0gICAJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0MCi0vKiBUaGlzIHRlbGxzIEFscGhhIE9TRi8xIG5vdCB0byBkZWZpbmUgYSBnZXRvcHQgcHJvdG90eXBlIGluIDxzdGRpby5oPi4KLSAgIERpdHRvIGZvciBBSVggMy4yIGFuZCA8c3RkbGliLmg+LiAgKi8KLSNpZm5kZWYgX05PX1BST1RPCi0jIGRlZmluZSBfTk9fUFJPVE8KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgX19TVERDX18gfHwgIV9fU1REQ19fCi0vKiBUaGlzIGlzIGEgc2VwYXJhdGUgY29uZGl0aW9uYWwgc2luY2Ugc29tZSBzdGRjIHN5c3RlbXMKLSAgIHJlamVjdCBgZGVmaW5lZCAoY29uc3QpJy4gICovCi0jIGlmbmRlZiBjb25zdAotIyAgZGVmaW5lIGNvbnN0Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAotICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZi4gIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQwotICAgTGlicmFyeSwgYnV0IGFsc28gaW5jbHVkZWQgaW4gbWFueSBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucy4gIENvbXBpbGluZwotICAgYW5kIGxpbmtpbmcgaW4gdGhpcyBjb2RlIGlzIGEgd2FzdGUgd2hlbiB1c2luZyB0aGUgR05VIEMgbGlicmFyeQotICAgKGVzcGVjaWFsbHkgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSkuICBSYXRoZXIgdGhhbiBoYXZpbmcgZXZlcnkgR05VCi0gICBwcm9ncmFtIHVuZGVyc3RhbmQgYGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxpYmMnIGFuZCBvbWl0IHRoZSBvYmplY3QgZmlsZXMsCi0gICBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZG8gdGhpcyBpbiB0aGUgc291cmNlIGZvciBlYWNoIHN1Y2ggZmlsZS4gICovCi0KLSNkZWZpbmUgR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OIDIKLSNpZiAhZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBfX0dMSUJDX18gPj0gMgotIyBpbmNsdWRlIDxnbnUtdmVyc2lvbnMuaD4KLSMgaWYgX0dOVV9HRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04gPT0gR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OCi0jICBkZWZpbmUgRUxJREVfQ09ERQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRUxJREVfQ09ERQotCi0KLS8qIFRoaXMgbmVlZHMgdG8gY29tZSBhZnRlciBzb21lIGxpYnJhcnkgI2luY2x1ZGUKLSAgIHRvIGdldCBfX0dOVV9MSUJSQVJZX18gZGVmaW5lZC4gICovCi0jaWZkZWYJX19HTlVfTElCUkFSWV9fCi0vKiBEb24ndCBpbmNsdWRlIHN0ZGxpYi5oIGZvciBub24tR05VIEMgbGlicmFyaWVzIGJlY2F1c2Ugc29tZSBvZiB0aGVtCi0gICBjb250YWluIGNvbmZsaWN0aW5nIHByb3RvdHlwZXMgZm9yIGdldG9wdC4gICovCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgkvKiBHTlUgQyBsaWJyYXJ5LiAgKi8KLQotI2lmZGVmIFZNUwotIyBpbmNsdWRlIDx1bml4bGliLmg+Ci0jIGlmIEhBVkVfU1RSSU5HX0ggLSAwCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIF8KLS8qIFRoaXMgaXMgZm9yIG90aGVyIEdOVSBkaXN0cmlidXRpb25zIHdpdGggaW50ZXJuYXRpb25hbGl6ZWQgbWVzc2FnZXMuCi0gICBXaGVuIGNvbXBpbGluZyBsaWJjLCB0aGUgXyBtYWNybyBpcyBwcmVkZWZpbmVkLiAgKi8KLSMgaWZkZWYgSEFWRV9MSUJJTlRMX0gKLSMgIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgIGRlZmluZSBfKG1zZ2lkKQlnZXR0ZXh0IChtc2dpZCkKLSMgZWxzZQotIyAgZGVmaW5lIF8obXNnaWQpCShtc2dpZCkKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGlzIHZlcnNpb24gb2YgYGdldG9wdCcgYXBwZWFycyB0byB0aGUgY2FsbGVyIGxpa2Ugc3RhbmRhcmQgVW5peCBgZ2V0b3B0JwotICAgYnV0IGl0IGJlaGF2ZXMgZGlmZmVyZW50bHkgZm9yIHRoZSB1c2VyLCBzaW5jZSBpdCBhbGxvd3MgdGhlIHVzZXIKLSAgIHRvIGludGVyc3BlcnNlIHRoZSBvcHRpb25zIHdpdGggdGhlIG90aGVyIGFyZ3VtZW50cy4KLQotICAgQXMgYGdldG9wdCcgd29ya3MsIGl0IHBlcm11dGVzIHRoZSBlbGVtZW50cyBvZiBBUkdWIHNvIHRoYXQsCi0gICB3aGVuIGl0IGlzIGRvbmUsIGFsbCB0aGUgb3B0aW9ucyBwcmVjZWRlIGV2ZXJ5dGhpbmcgZWxzZS4gIFRodXMKLSAgIGFsbCBhcHBsaWNhdGlvbiBwcm9ncmFtcyBhcmUgZXh0ZW5kZWQgdG8gaGFuZGxlIGZsZXhpYmxlIGFyZ3VtZW50IG9yZGVyLgotCi0gICBTZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQT1NJWExZX0NPUlJFQ1QgZGlzYWJsZXMgcGVybXV0YXRpb24uCi0gICBUaGVuIHRoZSBiZWhhdmlvciBpcyBjb21wbGV0ZWx5IHN0YW5kYXJkLgotCi0gICBHTlUgYXBwbGljYXRpb24gcHJvZ3JhbXMgY2FuIHVzZSBhIHRoaXJkIGFsdGVybmF0aXZlIG1vZGUgaW4gd2hpY2gKLSAgIHRoZXkgY2FuIGRpc3Rpbmd1aXNoIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBvcHRpb25zIGFuZCBvdGhlciBhcmd1bWVudHMuICAqLwotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLS8qIEZvciBjb21tdW5pY2F0aW9uIGZyb20gYGdldG9wdCcgdG8gdGhlIGNhbGxlci4KLSAgIFdoZW4gYGdldG9wdCcgZmluZHMgYW4gb3B0aW9uIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQsCi0gICB0aGUgYXJndW1lbnQgdmFsdWUgaXMgcmV0dXJuZWQgaGVyZS4KLSAgIEFsc28sIHdoZW4gYG9yZGVyaW5nJyBpcyBSRVRVUk5fSU5fT1JERVIsCi0gICBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50IGlzIHJldHVybmVkIGhlcmUuICAqLwotCi1jaGFyICpvcHRhcmcgPSBOVUxMOwotCi0vKiBJbmRleCBpbiBBUkdWIG9mIHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgc2Nhbm5lZC4KLSAgIFRoaXMgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB0byBhbmQgZnJvbSB0aGUgY2FsbGVyCi0gICBhbmQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBzdWNjZXNzaXZlIGNhbGxzIHRvIGBnZXRvcHQnLgotCi0gICBPbiBlbnRyeSB0byBgZ2V0b3B0JywgemVybyBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsOyBpbml0aWFsaXplLgotCi0gICBXaGVuIGBnZXRvcHQnIHJldHVybnMgLTEsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvZiB0aGUKLSAgIG5vbi1vcHRpb24gZWxlbWVudHMgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBpdHNlbGYgc2Nhbi4KLQotICAgT3RoZXJ3aXNlLCBgb3B0aW5kJyBjb21tdW5pY2F0ZXMgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dAotICAgaG93IG11Y2ggb2YgQVJHViBoYXMgYmVlbiBzY2FubmVkIHNvIGZhci4gICovCi0KLS8qIDEwMDMuMiBzYXlzIHRoaXMgbXVzdCBiZSAxIGJlZm9yZSBhbnkgY2FsbC4gICovCi1pbnQgb3B0aW5kID0gMTsKLQotLyogRm9ybWVybHksIGluaXRpYWxpemF0aW9uIG9mIGdldG9wdCBkZXBlbmRlZCBvbiBvcHRpbmQ9PTAsIHdoaWNoCi0gICBjYXVzZXMgcHJvYmxlbXMgd2l0aCByZS1jYWxsaW5nIGdldG9wdCBhcyBwcm9ncmFtcyBnZW5lcmFsbHkgZG9uJ3QKLSAgIGtub3cgdGhhdC4gKi8KLQotaW50IF9fZ2V0b3B0X2luaXRpYWxpemVkID0gMDsKLQotLyogVGhlIG5leHQgY2hhciB0byBiZSBzY2FubmVkIGluIHRoZSBvcHRpb24tZWxlbWVudAotICAgaW4gd2hpY2ggdGhlIGxhc3Qgb3B0aW9uIGNoYXJhY3RlciB3ZSByZXR1cm5lZCB3YXMgZm91bmQuCi0gICBUaGlzIGFsbG93cyB1cyB0byBwaWNrIHVwIHRoZSBzY2FuIHdoZXJlIHdlIGxlZnQgb2ZmLgotCi0gICBJZiB0aGlzIGlzIHplcm8sIG9yIGEgbnVsbCBzdHJpbmcsIGl0IG1lYW5zIHJlc3VtZSB0aGUgc2NhbgotICAgYnkgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IEFSR1YtZWxlbWVudC4gICovCi0KLXN0YXRpYyBjaGFyICpuZXh0Y2hhcjsKLQotLyogQ2FsbGVycyBzdG9yZSB6ZXJvIGhlcmUgdG8gaW5oaWJpdCB0aGUgZXJyb3IgbWVzc2FnZQotICAgZm9yIHVucmVjb2duaXplZCBvcHRpb25zLiAgKi8KLQotaW50IG9wdGVyciA9IDE7Ci0KLS8qIFNldCB0byBhbiBvcHRpb24gY2hhcmFjdGVyIHdoaWNoIHdhcyB1bnJlY29nbml6ZWQuCi0gICBUaGlzIG11c3QgYmUgaW5pdGlhbGl6ZWQgb24gc29tZSBzeXN0ZW1zIHRvIGF2b2lkIGxpbmtpbmcgaW4gdGhlCi0gICBzeXN0ZW0ncyBvd24gZ2V0b3B0IGltcGxlbWVudGF0aW9uLiAgKi8KLQotaW50IG9wdG9wdCA9ICc/JzsKLQotLyogRGVzY3JpYmUgaG93IHRvIGRlYWwgd2l0aCBvcHRpb25zIHRoYXQgZm9sbG93IG5vbi1vcHRpb24gQVJHVi1lbGVtZW50cy4KLQotICAgSWYgdGhlIGNhbGxlciBkaWQgbm90IHNwZWNpZnkgYW55dGhpbmcsCi0gICB0aGUgZGVmYXVsdCBpcyBSRVFVSVJFX09SREVSIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgUE9TSVhMWV9DT1JSRUNUIGlzIGRlZmluZWQsIFBFUk1VVEUgb3RoZXJ3aXNlLgotCi0gICBSRVFVSVJFX09SREVSIG1lYW5zIGRvbid0IHJlY29nbml6ZSB0aGVtIGFzIG9wdGlvbnM7Ci0gICBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nIHdoZW4gdGhlIGZpcnN0IG5vbi1vcHRpb24gaXMgc2Vlbi4KLSAgIFRoaXMgaXMgd2hhdCBVbml4IGRvZXMuCi0gICBUaGlzIG1vZGUgb2Ygb3BlcmF0aW9uIGlzIHNlbGVjdGVkIGJ5IGVpdGhlciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAotICAgdmFyaWFibGUgUE9TSVhMWV9DT1JSRUNULCBvciB1c2luZyBgKycgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgb2YgdGhlIGxpc3Qgb2Ygb3B0aW9uIGNoYXJhY3RlcnMuCi0KLSAgIFBFUk1VVEUgaXMgdGhlIGRlZmF1bHQuICBXZSBwZXJtdXRlIHRoZSBjb250ZW50cyBvZiBBUkdWIGFzIHdlIHNjYW4sCi0gICBzbyB0aGF0IGV2ZW50dWFsbHkgYWxsIHRoZSBub24tb3B0aW9ucyBhcmUgYXQgdGhlIGVuZC4gIFRoaXMgYWxsb3dzIG9wdGlvbnMKLSAgIHRvIGJlIGdpdmVuIGluIGFueSBvcmRlciwgZXZlbiB3aXRoIHByb2dyYW1zIHRoYXQgd2VyZSBub3Qgd3JpdHRlbiB0bwotICAgZXhwZWN0IHRoaXMuCi0KLSAgIFJFVFVSTl9JTl9PUkRFUiBpcyBhbiBvcHRpb24gYXZhaWxhYmxlIHRvIHByb2dyYW1zIHRoYXQgd2VyZSB3cml0dGVuCi0gICB0byBleHBlY3Qgb3B0aW9ucyBhbmQgb3RoZXIgQVJHVi1lbGVtZW50cyBpbiBhbnkgb3JkZXIgYW5kIHRoYXQgY2FyZSBhYm91dAotICAgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28uICBXZSBkZXNjcmliZSBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50Ci0gICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLgotICAgVXNpbmcgYC0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGxpc3Qgb2Ygb3B0aW9uIGNoYXJhY3RlcnMKLSAgIHNlbGVjdHMgdGhpcyBtb2RlIG9mIG9wZXJhdGlvbi4KLQotICAgVGhlIHNwZWNpYWwgYXJndW1lbnQgYC0tJyBmb3JjZXMgYW4gZW5kIG9mIG9wdGlvbi1zY2FubmluZyByZWdhcmRsZXNzCi0gICBvZiB0aGUgdmFsdWUgb2YgYG9yZGVyaW5nJy4gIEluIHRoZSBjYXNlIG9mIFJFVFVSTl9JTl9PUkRFUiwgb25seQotICAgYC0tJyBjYW4gY2F1c2UgYGdldG9wdCcgdG8gcmV0dXJuIC0xIHdpdGggYG9wdGluZCcgIT0gQVJHQy4gICovCi0KLXN0YXRpYyBlbnVtCi17Ci0gIFJFUVVJUkVfT1JERVIsIFBFUk1VVEUsIFJFVFVSTl9JTl9PUkRFUgotfSBvcmRlcmluZzsKLQotLyogVmFsdWUgb2YgUE9TSVhMWV9DT1JSRUNUIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KLXN0YXRpYyBjaGFyICpwb3NpeGx5X2NvcnJlY3Q7Ci0MCi0jaWZkZWYJX19HTlVfTElCUkFSWV9fCi0vKiBXZSB3YW50IHRvIGF2b2lkIGluY2x1c2lvbiBvZiBzdHJpbmcuaCB3aXRoIG5vbi1HTlUgbGlicmFyaWVzCi0gICBiZWNhdXNlIHRoZXJlIGFyZSBtYW55IHdheXMgaXQgY2FuIGNhdXNlIHRyb3VibGUuCi0gICBPbiBzb21lIHN5c3RlbXMsIGl0IGNvbnRhaW5zIHNwZWNpYWwgbWFnaWMgbWFjcm9zIHRoYXQgZG9uJ3Qgd29yawotICAgaW4gR0NDLiAgKi8KLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jIGRlZmluZSBteV9pbmRleAlzdHJjaHIKLSNlbHNlCi0KLSMgaWYgSEFWRV9TVFJJTkdfSAotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jIGVsc2UKLSMgIGlmIEhBVkVfU1RSSU5HU19ICi0jICAgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyAgZW5kaWYKLSMgZW5kaWYKLQotLyogQXZvaWQgZGVwZW5kaW5nIG9uIGxpYnJhcnkgZnVuY3Rpb25zIG9yIGZpbGVzCi0gICB3aG9zZSBuYW1lcyBhcmUgaW5jb25zaXN0ZW50LiAgKi8KLQotI2lmbmRlZiBnZXRlbnYKLWV4dGVybiBjaGFyICpnZXRlbnYgKCk7Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgKgotbXlfaW5kZXggKHN0ciwgY2hyKQotICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgIGludCBjaHI7Ci17Ci0gIHdoaWxlICgqc3RyKQotICAgIHsKLSAgICAgIGlmICgqc3RyID09IGNocikKLQlyZXR1cm4gKGNoYXIgKikgc3RyOwotICAgICAgc3RyKys7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogSWYgdXNpbmcgR0NDLCB3ZSBjYW4gc2FmZWx5IGRlY2xhcmUgc3RybGVuIHRoaXMgd2F5LgotICAgSWYgbm90IHVzaW5nIEdDQywgaXQgaXMgb2sgbm90IHRvIGRlY2xhcmUgaXQuICAqLwotI2lmZGVmIF9fR05VQ19fCi0vKiBOb3RlIHRoYXQgTW90b3JvbGEgRGVsdGEgNjhrIFIzVjcgY29tZXMgd2l0aCBHQ0MgYnV0IG5vdCBzdGRkZWYuaC4KLSAgIFRoYXQgd2FzIHJlbGV2YW50IHRvIGNvZGUgdGhhdCB3YXMgaGVyZSBiZWZvcmUuICAqLwotIyBpZiAoIWRlZmluZWQgX19TVERDX18gfHwgIV9fU1REQ19fKSAmJiAhZGVmaW5lZCBzdHJsZW4KLS8qIGdjYyB3aXRoIC10cmFkaXRpb25hbCBkZWNsYXJlcyB0aGUgYnVpbHQtaW4gc3RybGVuIHRvIHJldHVybiBpbnQsCi0gICBhbmQgaGFzIGRvbmUgc28gYXQgbGVhc3Qgc2luY2UgdmVyc2lvbiAyLjQuNS4gLS0gcm1zLiAgKi8KLWV4dGVybiBpbnQgc3RybGVuIChjb25zdCBjaGFyICopOwotIyBlbmRpZiAvKiBub3QgX19TVERDX18gKi8KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotCi0jZW5kaWYgLyogbm90IF9fR05VX0xJQlJBUllfXyAqLwotDAotLyogSGFuZGxlIHBlcm11dGF0aW9uIG9mIGFyZ3VtZW50cy4gICovCi0KLS8qIERlc2NyaWJlIHRoZSBwYXJ0IG9mIEFSR1YgdGhhdCBjb250YWlucyBub24tb3B0aW9ucyB0aGF0IGhhdmUKLSAgIGJlZW4gc2tpcHBlZC4gIGBmaXJzdF9ub25vcHQnIGlzIHRoZSBpbmRleCBpbiBBUkdWIG9mIHRoZSBmaXJzdCBvZiB0aGVtOwotICAgYGxhc3Rfbm9ub3B0JyBpcyB0aGUgaW5kZXggYWZ0ZXIgdGhlIGxhc3Qgb2YgdGhlbS4gICovCi0KLXN0YXRpYyBpbnQgZmlyc3Rfbm9ub3B0Owotc3RhdGljIGludCBsYXN0X25vbm9wdDsKLQotI2lmZGVmIF9MSUJDCi0vKiBCYXNoIDIuMCBnaXZlcyB1cyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb250YWluaW5nIGZsYWdzCi0gICBpbmRpY2F0aW5nIEFSR1YgZWxlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgYXJndW1lbnRzLiAgKi8KLQotLyogRGVmaW5lZCBpbiBnZXRvcHRfaW5pdC5jICAqLwotZXh0ZXJuIGNoYXIgKl9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnczsKLQotc3RhdGljIGludCBub25vcHRpb25fZmxhZ3NfbWF4X2xlbjsKLXN0YXRpYyBpbnQgbm9ub3B0aW9uX2ZsYWdzX2xlbjsKLQotc3RhdGljIGludCBvcmlnaW5hbF9hcmdjOwotc3RhdGljIGNoYXIgKmNvbnN0ICpvcmlnaW5hbF9hcmd2OwotCi0vKiBNYWtlIHN1cmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGJhc2ggMi4wIHB1dHMgaW4gdGhlIGVudmlyb25tZW50Ci0gICBpcyB2YWxpZCBmb3IgdGhlIGdldG9wdCBjYWxsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIEFSR1YgcGFzc2VkCi0gICB0byBnZXRvcHQgaXMgdGhhdCBvbmUgcGFzc2VkIHRvIHRoZSBwcm9jZXNzLiAgKi8KLXN0YXRpYyB2b2lkCi1fX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLXN0b3JlX2FyZ3NfYW5kX2VudiAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2KQotewotICAvKiBYWFggVGhpcyBpcyBubyBnb29kIHNvbHV0aW9uLiAgV2Ugc2hvdWxkIHJhdGhlciBjb3B5IHRoZSBhcmdzIHNvCi0gICAgIHRoYXQgd2UgY2FuIGNvbXBhcmUgdGhlbSBsYXRlci4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UgbWFsbG9jKDMpLiAgKi8KLSAgb3JpZ2luYWxfYXJnYyA9IGFyZ2M7Ci0gIG9yaWdpbmFsX2FyZ3YgPSBhcmd2OwotfQotIyBpZmRlZiB0ZXh0X3NldF9lbGVtZW50Ci10ZXh0X3NldF9lbGVtZW50IChfX2xpYmNfc3ViaW5pdCwgc3RvcmVfYXJnc19hbmRfZW52KTsKLSMgZW5kaWYgLyogdGV4dF9zZXRfZWxlbWVudCAqLwotCi0jIGRlZmluZSBTV0FQX0ZMQUdTKGNoMSwgY2gyKSBcCi0gIGlmIChub25vcHRpb25fZmxhZ3NfbGVuID4gMCkJCQkJCQkgICAgICBcCi0gICAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAgIGNoYXIgX190bXAgPSBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbY2gxXTsJCQkgICAgICBcCi0gICAgICBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbY2gxXSA9IF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tjaDJdOwkgICAgICBcCi0gICAgICBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbY2gyXSA9IF9fdG1wOwkJCQkgICAgICBcCi0gICAgfQotI2Vsc2UJLyogIV9MSUJDICovCi0jIGRlZmluZSBTV0FQX0ZMQUdTKGNoMSwgY2gyKQotI2VuZGlmCS8qIF9MSUJDICovCi0KLS8qIEV4Y2hhbmdlIHR3byBhZGphY2VudCBzdWJzZXF1ZW5jZXMgb2YgQVJHVi4KLSAgIE9uZSBzdWJzZXF1ZW5jZSBpcyBlbGVtZW50cyBbZmlyc3Rfbm9ub3B0LGxhc3Rfbm9ub3B0KQotICAgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBub24tb3B0aW9ucyB0aGF0IGhhdmUgYmVlbiBza2lwcGVkIHNvIGZhci4KLSAgIFRoZSBvdGhlciBpcyBlbGVtZW50cyBbbGFzdF9ub25vcHQsb3B0aW5kKSwgd2hpY2ggY29udGFpbnMgYWxsCi0gICB0aGUgb3B0aW9ucyBwcm9jZXNzZWQgc2luY2UgdGhvc2Ugbm9uLW9wdGlvbnMgd2VyZSBza2lwcGVkLgotCi0gICBgZmlyc3Rfbm9ub3B0JyBhbmQgYGxhc3Rfbm9ub3B0JyBhcmUgcmVsb2NhdGVkIHNvIHRoYXQgdGhleSBkZXNjcmliZQotICAgdGhlIG5ldyBpbmRpY2VzIG9mIHRoZSBub24tb3B0aW9ucyBpbiBBUkdWIGFmdGVyIHRoZXkgYXJlIG1vdmVkLiAgKi8KLQotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLXN0YXRpYyB2b2lkIGV4Y2hhbmdlIChjaGFyICoqKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotZXhjaGFuZ2UgKGFyZ3YpCi0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYm90dG9tID0gZmlyc3Rfbm9ub3B0OwotICBpbnQgbWlkZGxlID0gbGFzdF9ub25vcHQ7Ci0gIGludCB0b3AgPSBvcHRpbmQ7Ci0gIGNoYXIgKnRlbTsKLQotICAvKiBFeGNoYW5nZSB0aGUgc2hvcnRlciBzZWdtZW50IHdpdGggdGhlIGZhciBlbmQgb2YgdGhlIGxvbmdlciBzZWdtZW50LgotICAgICBUaGF0IHB1dHMgdGhlIHNob3J0ZXIgc2VnbWVudCBpbnRvIHRoZSByaWdodCBwbGFjZS4KLSAgICAgSXQgbGVhdmVzIHRoZSBsb25nZXIgc2VnbWVudCBpbiB0aGUgcmlnaHQgcGxhY2Ugb3ZlcmFsbCwKLSAgICAgYnV0IGl0IGNvbnNpc3RzIG9mIHR3byBwYXJ0cyB0aGF0IG5lZWQgdG8gYmUgc3dhcHBlZCBuZXh0LiAgKi8KLQotI2lmZGVmIF9MSUJDCi0gIC8qIEZpcnN0IG1ha2Ugc3VyZSB0aGUgaGFuZGxpbmcgb2YgdGhlIGBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MnCi0gICAgIHN0cmluZyBjYW4gd29yayBub3JtYWxseS4gIE91ciB0b3AgYXJndW1lbnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UKLSAgICAgb2YgdGhlIHN0cmluZy4gICovCi0gIGlmIChub25vcHRpb25fZmxhZ3NfbGVuID4gMCAmJiB0b3AgPj0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4pCi0gICAgewotICAgICAgLyogV2UgbXVzdCBleHRlbmQgdGhlIGFycmF5LiAgVGhlIHVzZXIgcGxheXMgZ2FtZXMgd2l0aCB1cyBhbmQKLQkgcHJlc2VudHMgbmV3IGFyZ3VtZW50cy4gICovCi0gICAgICBjaGFyICpuZXdfc3RyID0gbWFsbG9jICh0b3AgKyAxKTsKLSAgICAgIGlmIChuZXdfc3RyID09IE5VTEwpCi0Jbm9ub3B0aW9uX2ZsYWdzX2xlbiA9IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1zZXQgKF9fbWVtcGNweSAobmV3X3N0ciwgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzLAotCQkJICAgICBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiksCi0JCSAgJ1wwJywgdG9wICsgMSAtIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuKTsKLQkgIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gdG9wICsgMTsKLQkgIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9IG5ld19zdHI7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIHdoaWxlICh0b3AgPiBtaWRkbGUgJiYgbWlkZGxlID4gYm90dG9tKQotICAgIHsKLSAgICAgIGlmICh0b3AgLSBtaWRkbGUgPiBtaWRkbGUgLSBib3R0b20pCi0JewotCSAgLyogQm90dG9tIHNlZ21lbnQgaXMgdGhlIHNob3J0IG9uZS4gICovCi0JICBpbnQgbGVuID0gbWlkZGxlIC0gYm90dG9tOwotCSAgcmVnaXN0ZXIgaW50IGk7Ci0KLQkgIC8qIFN3YXAgaXQgd2l0aCB0aGUgdG9wIHBhcnQgb2YgdGhlIHRvcCBzZWdtZW50LiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkgICAgewotCSAgICAgIHRlbSA9IGFyZ3ZbYm90dG9tICsgaV07Ci0JICAgICAgYXJndltib3R0b20gKyBpXSA9IGFyZ3ZbdG9wIC0gKG1pZGRsZSAtIGJvdHRvbSkgKyBpXTsKLQkgICAgICBhcmd2W3RvcCAtIChtaWRkbGUgLSBib3R0b20pICsgaV0gPSB0ZW07Ci0JICAgICAgU1dBUF9GTEFHUyAoYm90dG9tICsgaSwgdG9wIC0gKG1pZGRsZSAtIGJvdHRvbSkgKyBpKTsKLQkgICAgfQotCSAgLyogRXhjbHVkZSB0aGUgbW92ZWQgYm90dG9tIHNlZ21lbnQgZnJvbSBmdXJ0aGVyIHN3YXBwaW5nLiAgKi8KLQkgIHRvcCAtPSBsZW47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRvcCBzZWdtZW50IGlzIHRoZSBzaG9ydCBvbmUuICAqLwotCSAgaW50IGxlbiA9IHRvcCAtIG1pZGRsZTsKLQkgIHJlZ2lzdGVyIGludCBpOwotCi0JICAvKiBTd2FwIGl0IHdpdGggdGhlIGJvdHRvbSBwYXJ0IG9mIHRoZSBib3R0b20gc2VnbWVudC4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JICAgIHsKLQkgICAgICB0ZW0gPSBhcmd2W2JvdHRvbSArIGldOwotCSAgICAgIGFyZ3ZbYm90dG9tICsgaV0gPSBhcmd2W21pZGRsZSArIGldOwotCSAgICAgIGFyZ3ZbbWlkZGxlICsgaV0gPSB0ZW07Ci0JICAgICAgU1dBUF9GTEFHUyAoYm90dG9tICsgaSwgbWlkZGxlICsgaSk7Ci0JICAgIH0KLQkgIC8qIEV4Y2x1ZGUgdGhlIG1vdmVkIHRvcCBzZWdtZW50IGZyb20gZnVydGhlciBzd2FwcGluZy4gICovCi0JICBib3R0b20gKz0gbGVuOwotCX0KLSAgICB9Ci0KLSAgLyogVXBkYXRlIHJlY29yZHMgZm9yIHRoZSBzbG90cyB0aGUgbm9uLW9wdGlvbnMgbm93IG9jY3VweS4gICovCi0KLSAgZmlyc3Rfbm9ub3B0ICs9IChvcHRpbmQgLSBsYXN0X25vbm9wdCk7Ci0gIGxhc3Rfbm9ub3B0ID0gb3B0aW5kOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBpbnRlcm5hbCBkYXRhIHdoZW4gdGhlIGZpcnN0IGNhbGwgaXMgbWFkZS4gICovCi0KLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi1zdGF0aWMgY29uc3QgY2hhciAqX2dldG9wdF9pbml0aWFsaXplIChpbnQsIGNoYXIgKmNvbnN0ICosIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLXN0YXRpYyBjb25zdCBjaGFyICoKLV9nZXRvcHRfaW5pdGlhbGl6ZSAoYXJnYywgYXJndiwgb3B0c3RyaW5nKQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZzsKLXsKLSAgLyogU3RhcnQgcHJvY2Vzc2luZyBvcHRpb25zIHdpdGggQVJHVi1lbGVtZW50IDEgKHNpbmNlIEFSR1YtZWxlbWVudCAwCi0gICAgIGlzIHRoZSBwcm9ncmFtIG5hbWUpOyB0aGUgc2VxdWVuY2Ugb2YgcHJldmlvdXNseSBza2lwcGVkCi0gICAgIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50cyBpcyBlbXB0eS4gICovCi0KLSAgZmlyc3Rfbm9ub3B0ID0gbGFzdF9ub25vcHQgPSBvcHRpbmQ7Ci0KLSAgbmV4dGNoYXIgPSBOVUxMOwotCi0gIHBvc2l4bHlfY29ycmVjdCA9IGdldGVudiAoIlBPU0lYTFlfQ09SUkVDVCIpOwotCi0gIC8qIERldGVybWluZSBob3cgdG8gaGFuZGxlIHRoZSBvcmRlcmluZyBvZiBvcHRpb25zIGFuZCBub25vcHRpb25zLiAgKi8KLQotICBpZiAob3B0c3RyaW5nWzBdID09ICctJykKLSAgICB7Ci0gICAgICBvcmRlcmluZyA9IFJFVFVSTl9JTl9PUkRFUjsKLSAgICAgICsrb3B0c3RyaW5nOwotICAgIH0KLSAgZWxzZSBpZiAob3B0c3RyaW5nWzBdID09ICcrJykKLSAgICB7Ci0gICAgICBvcmRlcmluZyA9IFJFUVVJUkVfT1JERVI7Ci0gICAgICArK29wdHN0cmluZzsKLSAgICB9Ci0gIGVsc2UgaWYgKHBvc2l4bHlfY29ycmVjdCAhPSBOVUxMKQotICAgIG9yZGVyaW5nID0gUkVRVUlSRV9PUkRFUjsKLSAgZWxzZQotICAgIG9yZGVyaW5nID0gUEVSTVVURTsKLQotI2lmZGVmIF9MSUJDCi0gIGlmIChwb3NpeGx5X2NvcnJlY3QgPT0gTlVMTAotICAgICAgJiYgYXJnYyA9PSBvcmlnaW5hbF9hcmdjICYmIGFyZ3YgPT0gb3JpZ2luYWxfYXJndikKLSAgICB7Ci0gICAgICBpZiAobm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPT0gMCkKLQl7Ci0JICBpZiAoX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzID09IE5VTEwKLQkgICAgICB8fCBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbMF0gPT0gJ1wwJykKLQkgICAgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSAtMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm9yaWdfc3RyID0gX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzOwotCSAgICAgIGludCBsZW4gPSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IHN0cmxlbiAob3JpZ19zdHIpOwotCSAgICAgIGlmIChub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA8IGFyZ2MpCi0JCW5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gYXJnYzsKLQkgICAgICBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MgPQotCQkoY2hhciAqKSBtYWxsb2MgKG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuKTsKLQkgICAgICBpZiAoX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzID09IE5VTEwpCi0JCW5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gLTE7Ci0JICAgICAgZWxzZQotCQltZW1zZXQgKF9fbWVtcGNweSAoX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzLCBvcmlnX3N0ciwgbGVuKSwKLQkJCSdcMCcsIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuIC0gbGVuKTsKLQkgICAgfQotCX0KLSAgICAgIG5vbm9wdGlvbl9mbGFnc19sZW4gPSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbjsKLSAgICB9Ci0gIGVsc2UKLSAgICBub25vcHRpb25fZmxhZ3NfbGVuID0gMDsKLSNlbmRpZgotCi0gIHJldHVybiBvcHRzdHJpbmc7Ci19Ci0MCi0vKiBTY2FuIGVsZW1lbnRzIG9mIEFSR1YgKHdob3NlIGxlbmd0aCBpcyBBUkdDKSBmb3Igb3B0aW9uIGNoYXJhY3RlcnMKLSAgIGdpdmVuIGluIE9QVFNUUklORy4KLQotICAgSWYgYW4gZWxlbWVudCBvZiBBUkdWIHN0YXJ0cyB3aXRoICctJywgYW5kIGlzIG5vdCBleGFjdGx5ICItIiBvciAiLS0iLAotICAgdGhlbiBpdCBpcyBhbiBvcHRpb24gZWxlbWVudC4gIFRoZSBjaGFyYWN0ZXJzIG9mIHRoaXMgZWxlbWVudAotICAgKGFzaWRlIGZyb20gdGhlIGluaXRpYWwgJy0nKSBhcmUgb3B0aW9uIGNoYXJhY3RlcnMuICBJZiBgZ2V0b3B0JwotICAgaXMgY2FsbGVkIHJlcGVhdGVkbHksIGl0IHJldHVybnMgc3VjY2Vzc2l2ZWx5IGVhY2ggb2YgdGhlIG9wdGlvbiBjaGFyYWN0ZXJzCi0gICBmcm9tIGVhY2ggb2YgdGhlIG9wdGlvbiBlbGVtZW50cy4KLQotICAgSWYgYGdldG9wdCcgZmluZHMgYW5vdGhlciBvcHRpb24gY2hhcmFjdGVyLCBpdCByZXR1cm5zIHRoYXQgY2hhcmFjdGVyLAotICAgdXBkYXRpbmcgYG9wdGluZCcgYW5kIGBuZXh0Y2hhcicgc28gdGhhdCB0aGUgbmV4dCBjYWxsIHRvIGBnZXRvcHQnIGNhbgotICAgcmVzdW1lIHRoZSBzY2FuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb24gY2hhcmFjdGVyIG9yIEFSR1YtZWxlbWVudC4KLQotICAgSWYgdGhlcmUgYXJlIG5vIG1vcmUgb3B0aW9uIGNoYXJhY3RlcnMsIGBnZXRvcHQnIHJldHVybnMgLTEuCi0gICBUaGVuIGBvcHRpbmQnIGlzIHRoZSBpbmRleCBpbiBBUkdWIG9mIHRoZSBmaXJzdCBBUkdWLWVsZW1lbnQKLSAgIHRoYXQgaXMgbm90IGFuIG9wdGlvbi4gIChUaGUgQVJHVi1lbGVtZW50cyBoYXZlIGJlZW4gcGVybXV0ZWQKLSAgIHNvIHRoYXQgdGhvc2UgdGhhdCBhcmUgbm90IG9wdGlvbnMgbm93IGNvbWUgbGFzdC4pCi0KLSAgIE9QVFNUUklORyBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBsZWdpdGltYXRlIG9wdGlvbiBjaGFyYWN0ZXJzLgotICAgSWYgYW4gb3B0aW9uIGNoYXJhY3RlciBpcyBzZWVuIHRoYXQgaXMgbm90IGxpc3RlZCBpbiBPUFRTVFJJTkcsCi0gICByZXR1cm4gJz8nIGFmdGVyIHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2UuICBJZiB5b3Ugc2V0IGBvcHRlcnInIHRvCi0gICB6ZXJvLCB0aGUgZXJyb3IgbWVzc2FnZSBpcyBzdXBwcmVzc2VkIGJ1dCB3ZSBzdGlsbCByZXR1cm4gJz8nLgotCi0gICBJZiBhIGNoYXIgaW4gT1BUU1RSSU5HIGlzIGZvbGxvd2VkIGJ5IGEgY29sb24sIHRoYXQgbWVhbnMgaXQgd2FudHMgYW4gYXJnLAotICAgc28gdGhlIGZvbGxvd2luZyB0ZXh0IGluIHRoZSBzYW1lIEFSR1YtZWxlbWVudCwgb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZwotICAgQVJHVi1lbGVtZW50LCBpcyByZXR1cm5lZCBpbiBgb3B0YXJnJy4gIFR3byBjb2xvbnMgbWVhbiBhbiBvcHRpb24gdGhhdAotICAgd2FudHMgYW4gb3B0aW9uYWwgYXJnOyBpZiB0aGVyZSBpcyB0ZXh0IGluIHRoZSBjdXJyZW50IEFSR1YtZWxlbWVudCwKLSAgIGl0IGlzIHJldHVybmVkIGluIGBvcHRhcmcnLCBvdGhlcndpc2UgYG9wdGFyZycgaXMgc2V0IHRvIHplcm8uCi0KLSAgIElmIE9QVFNUUklORyBzdGFydHMgd2l0aCBgLScgb3IgYCsnLCBpdCByZXF1ZXN0cyBkaWZmZXJlbnQgbWV0aG9kcyBvZgotICAgaGFuZGxpbmcgdGhlIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50cy4KLSAgIFNlZSB0aGUgY29tbWVudHMgYWJvdXQgUkVUVVJOX0lOX09SREVSIGFuZCBSRVFVSVJFX09SREVSLCBhYm92ZS4KLQotICAgTG9uZy1uYW1lZCBvcHRpb25zIGJlZ2luIHdpdGggYC0tJyBpbnN0ZWFkIG9mIGAtJy4KLSAgIFRoZWlyIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCBhcyBsb25nIGFzIHRoZSBhYmJyZXZpYXRpb24gaXMgdW5pcXVlCi0gICBvciBpcyBhbiBleGFjdCBtYXRjaCBmb3Igc29tZSBkZWZpbmVkIG9wdGlvbi4gIElmIHRoZXkgaGF2ZSBhbgotICAgYXJndW1lbnQsIGl0IGZvbGxvd3MgdGhlIG9wdGlvbiBuYW1lIGluIHRoZSBzYW1lIEFSR1YtZWxlbWVudCwgc2VwYXJhdGVkCi0gICBmcm9tIHRoZSBvcHRpb24gbmFtZSBieSBhIGA9Jywgb3IgZWxzZSB0aGUgaW4gbmV4dCBBUkdWLWVsZW1lbnQuCi0gICBXaGVuIGBnZXRvcHQnIGZpbmRzIGEgbG9uZy1uYW1lZCBvcHRpb24sIGl0IHJldHVybnMgMCBpZiB0aGF0IG9wdGlvbidzCi0gICBgZmxhZycgZmllbGQgaXMgbm9uemVybywgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24ncyBgdmFsJyBmaWVsZAotICAgaWYgdGhlIGBmbGFnJyBmaWVsZCBpcyB6ZXJvLgotCi0gICBUaGUgZWxlbWVudHMgb2YgQVJHViBhcmVuJ3QgcmVhbGx5IGNvbnN0LCBiZWNhdXNlIHdlIHBlcm11dGUgdGhlbS4KLSAgIEJ1dCB3ZSBwcmV0ZW5kIHRoZXkncmUgY29uc3QgaW4gdGhlIHByb3RvdHlwZSB0byBiZSBjb21wYXRpYmxlCi0gICB3aXRoIG90aGVyIHN5c3RlbXMuCi0KLSAgIExPTkdPUFRTIGlzIGEgdmVjdG9yIG9mIGBzdHJ1Y3Qgb3B0aW9uJyB0ZXJtaW5hdGVkIGJ5IGFuCi0gICBlbGVtZW50IGNvbnRhaW5pbmcgYSBuYW1lIHdoaWNoIGlzIHplcm8uCi0KLSAgIExPTkdJTkQgcmV0dXJucyB0aGUgaW5kZXggaW4gTE9OR09QVCBvZiB0aGUgbG9uZy1uYW1lZCBvcHRpb24gZm91bmQuCi0gICBJdCBpcyBvbmx5IHZhbGlkIHdoZW4gYSBsb25nLW5hbWVkIG9wdGlvbiBoYXMgYmVlbiBmb3VuZCBieSB0aGUgbW9zdAotICAgcmVjZW50IGNhbGwuCi0KLSAgIElmIExPTkdfT05MWSBpcyBub256ZXJvLCAnLScgYXMgd2VsbCBhcyAnLS0nIGNhbiBpbnRyb2R1Y2UKLSAgIGxvbmctbmFtZWQgb3B0aW9ucy4gICovCi0KLWludAotX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0c3RyaW5nLCBsb25nb3B0cywgbG9uZ2luZCwgbG9uZ19vbmx5KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZzsKLSAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHM7Ci0gICAgIGludCAqbG9uZ2luZDsKLSAgICAgaW50IGxvbmdfb25seTsKLXsKLSAgb3B0YXJnID0gTlVMTDsKLQotICBpZiAob3B0aW5kID09IDAgfHwgIV9fZ2V0b3B0X2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGlmIChvcHRpbmQgPT0gMCkKLQlvcHRpbmQgPSAxOwkvKiBEb24ndCBzY2FuIEFSR1ZbMF0sIHRoZSBwcm9ncmFtIG5hbWUuICAqLwotICAgICAgb3B0c3RyaW5nID0gX2dldG9wdF9pbml0aWFsaXplIChhcmdjLCBhcmd2LCBvcHRzdHJpbmcpOwotICAgICAgX19nZXRvcHRfaW5pdGlhbGl6ZWQgPSAxOwotICAgIH0KLQotICAvKiBUZXN0IHdoZXRoZXIgQVJHVltvcHRpbmRdIHBvaW50cyB0byBhIG5vbi1vcHRpb24gYXJndW1lbnQuCi0gICAgIEVpdGhlciBpdCBkb2VzIG5vdCBoYXZlIG9wdGlvbiBzeW50YXgsIG9yIHRoZXJlIGlzIGFuIGVudmlyb25tZW50IGZsYWcKLSAgICAgZnJvbSB0aGUgc2hlbGwgaW5kaWNhdGluZyBpdCBpcyBub3QgYW4gb3B0aW9uLiAgVGhlIGxhdGVyIGluZm9ybWF0aW9uCi0gICAgIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSB1c2VkIGluIHRoZSBHTlUgbGliYy4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIE5PTk9QVElPTl9QIChhcmd2W29wdGluZF1bMF0gIT0gJy0nIHx8IGFyZ3Zbb3B0aW5kXVsxXSA9PSAnXDAnCSAgICAgIFwKLQkJICAgICAgfHwgKG9wdGluZCA8IG5vbm9wdGlvbl9mbGFnc19sZW4JCQkgICAgICBcCi0JCQkgICYmIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tvcHRpbmRdID09ICcxJykpCi0jZWxzZQotIyBkZWZpbmUgTk9OT1BUSU9OX1AgKGFyZ3Zbb3B0aW5kXVswXSAhPSAnLScgfHwgYXJndltvcHRpbmRdWzFdID09ICdcMCcpCi0jZW5kaWYKLQotICBpZiAobmV4dGNoYXIgPT0gTlVMTCB8fCAqbmV4dGNoYXIgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBBZHZhbmNlIHRvIHRoZSBuZXh0IEFSR1YtZWxlbWVudC4gICovCi0KLSAgICAgIC8qIEdpdmUgRklSU1RfTk9OT1BUICYgTEFTVF9OT05PUFQgcmF0aW9uYWwgdmFsdWVzIGlmIE9QVElORCBoYXMgYmVlbgotCSBtb3ZlZCBiYWNrIGJ5IHRoZSB1c2VyICh3aG8gbWF5IGFsc28gaGF2ZSBjaGFuZ2VkIHRoZSBhcmd1bWVudHMpLiAgKi8KLSAgICAgIGlmIChsYXN0X25vbm9wdCA+IG9wdGluZCkKLQlsYXN0X25vbm9wdCA9IG9wdGluZDsKLSAgICAgIGlmIChmaXJzdF9ub25vcHQgPiBvcHRpbmQpCi0JZmlyc3Rfbm9ub3B0ID0gb3B0aW5kOwotCi0gICAgICBpZiAob3JkZXJpbmcgPT0gUEVSTVVURSkKLQl7Ci0JICAvKiBJZiB3ZSBoYXZlIGp1c3QgcHJvY2Vzc2VkIHNvbWUgb3B0aW9ucyBmb2xsb3dpbmcgc29tZSBub24tb3B0aW9ucywKLQkgICAgIGV4Y2hhbmdlIHRoZW0gc28gdGhhdCB0aGUgb3B0aW9ucyBjb21lIGZpcnN0LiAgKi8KLQotCSAgaWYgKGZpcnN0X25vbm9wdCAhPSBsYXN0X25vbm9wdCAmJiBsYXN0X25vbm9wdCAhPSBvcHRpbmQpCi0JICAgIGV4Y2hhbmdlICgoY2hhciAqKikgYXJndik7Ci0JICBlbHNlIGlmIChsYXN0X25vbm9wdCAhPSBvcHRpbmQpCi0JICAgIGZpcnN0X25vbm9wdCA9IG9wdGluZDsKLQotCSAgLyogU2tpcCBhbnkgYWRkaXRpb25hbCBub24tb3B0aW9ucwotCSAgICAgYW5kIGV4dGVuZCB0aGUgcmFuZ2Ugb2Ygbm9uLW9wdGlvbnMgcHJldmlvdXNseSBza2lwcGVkLiAgKi8KLQotCSAgd2hpbGUgKG9wdGluZCA8IGFyZ2MgJiYgTk9OT1BUSU9OX1ApCi0JICAgIG9wdGluZCsrOwotCSAgbGFzdF9ub25vcHQgPSBvcHRpbmQ7Ci0JfQotCi0gICAgICAvKiBUaGUgc3BlY2lhbCBBUkdWLWVsZW1lbnQgYC0tJyBtZWFucyBwcmVtYXR1cmUgZW5kIG9mIG9wdGlvbnMuCi0JIFNraXAgaXQgbGlrZSBhIG51bGwgb3B0aW9uLAotCSB0aGVuIGV4Y2hhbmdlIHdpdGggcHJldmlvdXMgbm9uLW9wdGlvbnMgYXMgaWYgaXQgd2VyZSBhbiBvcHRpb24sCi0JIHRoZW4gc2tpcCBldmVyeXRoaW5nIGVsc2UgbGlrZSBhIG5vbi1vcHRpb24uICAqLwotCi0gICAgICBpZiAob3B0aW5kICE9IGFyZ2MgJiYgIXN0cmNtcCAoYXJndltvcHRpbmRdLCAiLS0iKSkKLQl7Ci0JICBvcHRpbmQrKzsKLQotCSAgaWYgKGZpcnN0X25vbm9wdCAhPSBsYXN0X25vbm9wdCAmJiBsYXN0X25vbm9wdCAhPSBvcHRpbmQpCi0JICAgIGV4Y2hhbmdlICgoY2hhciAqKikgYXJndik7Ci0JICBlbHNlIGlmIChmaXJzdF9ub25vcHQgPT0gbGFzdF9ub25vcHQpCi0JICAgIGZpcnN0X25vbm9wdCA9IG9wdGluZDsKLQkgIGxhc3Rfbm9ub3B0ID0gYXJnYzsKLQotCSAgb3B0aW5kID0gYXJnYzsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGhhdmUgZG9uZSBhbGwgdGhlIEFSR1YtZWxlbWVudHMsIHN0b3AgdGhlIHNjYW4KLQkgYW5kIGJhY2sgb3ZlciBhbnkgbm9uLW9wdGlvbnMgdGhhdCB3ZSBza2lwcGVkIGFuZCBwZXJtdXRlZC4gICovCi0KLSAgICAgIGlmIChvcHRpbmQgPT0gYXJnYykKLQl7Ci0JICAvKiBTZXQgdGhlIG5leHQtYXJnLWluZGV4IHRvIHBvaW50IGF0IHRoZSBub24tb3B0aW9ucwotCSAgICAgdGhhdCB3ZSBwcmV2aW91c2x5IHNraXBwZWQsIHNvIHRoZSBjYWxsZXIgd2lsbCBkaWdlc3QgdGhlbS4gICovCi0JICBpZiAoZmlyc3Rfbm9ub3B0ICE9IGxhc3Rfbm9ub3B0KQotCSAgICBvcHRpbmQgPSBmaXJzdF9ub25vcHQ7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGNvbWUgdG8gYSBub24tb3B0aW9uIGFuZCBkaWQgbm90IHBlcm11dGUgaXQsCi0JIGVpdGhlciBzdG9wIHRoZSBzY2FuIG9yIGRlc2NyaWJlIGl0IHRvIHRoZSBjYWxsZXIgYW5kIHBhc3MgaXQgYnkuICAqLwotCi0gICAgICBpZiAoTk9OT1BUSU9OX1ApCi0JewotCSAgaWYgKG9yZGVyaW5nID09IFJFUVVJUkVfT1JERVIpCi0JICAgIHJldHVybiAtMTsKLQkgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGZvdW5kIGFub3RoZXIgb3B0aW9uLUFSR1YtZWxlbWVudC4KLQkgU2tpcCB0aGUgaW5pdGlhbCBwdW5jdHVhdGlvbi4gICovCi0KLSAgICAgIG5leHRjaGFyID0gKGFyZ3Zbb3B0aW5kXSArIDEKLQkJICArIChsb25nb3B0cyAhPSBOVUxMICYmIGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScpKTsKLSAgICB9Ci0KLSAgLyogRGVjb2RlIHRoZSBjdXJyZW50IG9wdGlvbi1BUkdWLWVsZW1lbnQuICAqLwotCi0gIC8qIENoZWNrIHdoZXRoZXIgdGhlIEFSR1YtZWxlbWVudCBpcyBhIGxvbmcgb3B0aW9uLgotCi0gICAgIElmIGxvbmdfb25seSBhbmQgdGhlIEFSR1YtZWxlbWVudCBoYXMgdGhlIGZvcm0gIi1mIiwgd2hlcmUgZiBpcwotICAgICBhIHZhbGlkIHNob3J0IG9wdGlvbiwgZG9uJ3QgY29uc2lkZXIgaXQgYW4gYWJicmV2aWF0ZWQgZm9ybSBvZgotICAgICBhIGxvbmcgb3B0aW9uIHRoYXQgc3RhcnRzIHdpdGggZi4gIE90aGVyd2lzZSB0aGVyZSB3b3VsZCBiZSBubwotICAgICB3YXkgdG8gZ2l2ZSB0aGUgLWYgc2hvcnQgb3B0aW9uLgotCi0gICAgIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGVyZSdzIGEgbG9uZyBvcHRpb24gImZ1YmFyIiBhbmQKLSAgICAgdGhlIEFSR1YtZWxlbWVudCBpcyAiLWZ1IiwgZG8gY29uc2lkZXIgdGhhdCBhbiBhYmJyZXZpYXRpb24gb2YKLSAgICAgdGhlIGxvbmcgb3B0aW9uLCBqdXN0IGxpa2UgIi0tZnUiLCBhbmQgbm90ICItZiIgd2l0aCBhcmcgInUiLgotCi0gICAgIFRoaXMgZGlzdGluY3Rpb24gc2VlbXMgdG8gYmUgdGhlIG1vc3QgdXNlZnVsIGFwcHJvYWNoLiAgKi8KLQotICBpZiAobG9uZ29wdHMgIT0gTlVMTAotICAgICAgJiYgKGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScKLQkgIHx8IChsb25nX29ubHkgJiYgKGFyZ3Zbb3B0aW5kXVsyXSB8fCAhbXlfaW5kZXggKG9wdHN0cmluZywgYXJndltvcHRpbmRdWzFdKSkpKSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lZW5kOwotICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqcDsKLSAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKnBmb3VuZCA9IE5VTEw7Ci0gICAgICBpbnQgZXhhY3QgPSAwOwotICAgICAgaW50IGFtYmlnID0gMDsKLSAgICAgIGludCBpbmRmb3VuZCA9IC0xOwotICAgICAgaW50IG9wdGlvbl9pbmRleDsKLQotICAgICAgZm9yIChuYW1lZW5kID0gbmV4dGNoYXI7ICpuYW1lZW5kICYmICpuYW1lZW5kICE9ICc9JzsgbmFtZWVuZCsrKQotCS8qIERvIG5vdGhpbmcuICAqLyA7Ci0KLSAgICAgIC8qIFRlc3QgYWxsIGxvbmcgb3B0aW9ucyBmb3IgZWl0aGVyIGV4YWN0IG1hdGNoCi0JIG9yIGFiYnJldmlhdGVkIG1hdGNoZXMuICAqLwotICAgICAgZm9yIChwID0gbG9uZ29wdHMsIG9wdGlvbl9pbmRleCA9IDA7IHAtPm5hbWU7IHArKywgb3B0aW9uX2luZGV4KyspCi0JaWYgKCFzdHJuY21wIChwLT5uYW1lLCBuZXh0Y2hhciwgbmFtZWVuZCAtIG5leHRjaGFyKSkKLQkgIHsKLQkgICAgaWYgKCh1bnNpZ25lZCBpbnQpIChuYW1lZW5kIC0gbmV4dGNoYXIpCi0JCT09ICh1bnNpZ25lZCBpbnQpIHN0cmxlbiAocC0+bmFtZSkpCi0JICAgICAgewotCQkvKiBFeGFjdCBtYXRjaCBmb3VuZC4gICovCi0JCXBmb3VuZCA9IHA7Ci0JCWluZGZvdW5kID0gb3B0aW9uX2luZGV4OwotCQlleGFjdCA9IDE7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAocGZvdW5kID09IE5VTEwpCi0JICAgICAgewotCQkvKiBGaXJzdCBub25leGFjdCBtYXRjaCBmb3VuZC4gICovCi0JCXBmb3VuZCA9IHA7Ci0JCWluZGZvdW5kID0gb3B0aW9uX2luZGV4OwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIC8qIFNlY29uZCBvciBsYXRlciBub25leGFjdCBtYXRjaCBmb3VuZC4gICovCi0JICAgICAgYW1iaWcgPSAxOwotCSAgfQotCi0gICAgICBpZiAoYW1iaWcgJiYgIWV4YWN0KQotCXsKLQkgIGlmIChvcHRlcnIpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG9wdGlvbiBgJXMnIGlzIGFtYmlndW91c1xuIiksCi0JCSAgICAgYXJndlswXSwgYXJndltvcHRpbmRdKTsKLQkgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCSAgb3B0aW5kKys7Ci0JICBvcHRvcHQgPSAwOwotCSAgcmV0dXJuICc/JzsKLQl9Ci0KLSAgICAgIGlmIChwZm91bmQgIT0gTlVMTCkKLQl7Ci0JICBvcHRpb25faW5kZXggPSBpbmRmb3VuZDsKLQkgIG9wdGluZCsrOwotCSAgaWYgKCpuYW1lZW5kKQotCSAgICB7Ci0JICAgICAgLyogRG9uJ3QgdGVzdCBoYXNfYXJnIHdpdGggPiwgYmVjYXVzZSBzb21lIEMgY29tcGlsZXJzIGRvbid0Ci0JCSBhbGxvdyBpdCB0byBiZSB1c2VkIG9uIGVudW1zLiAgKi8KLQkgICAgICBpZiAocGZvdW5kLT5oYXNfYXJnKQotCQlvcHRhcmcgPSBuYW1lZW5kICsgMTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAob3B0ZXJyKQotCQkgICAgewotCQkgICAgICBpZiAoYXJndltvcHRpbmQgLSAxXVsxXSA9PSAnLScpCi0JCQkvKiAtLW9wdGlvbiAqLwotCQkJZnByaW50ZiAoc3RkZXJyLAotCQkJCSBfKCIlczogb3B0aW9uIGAtLSVzJyBkb2Vzbid0IGFsbG93IGFuIGFyZ3VtZW50XG4iKSwKLQkJCQkgYXJndlswXSwgcGZvdW5kLT5uYW1lKTsKLQkJICAgICAgZWxzZQotCQkJLyogK29wdGlvbiBvciAtb3B0aW9uICovCi0JCQlmcHJpbnRmIChzdGRlcnIsCi0JCQkJIF8oIiVzOiBvcHRpb24gYCVjJXMnIGRvZXNuJ3QgYWxsb3cgYW4gYXJndW1lbnRcbiIpLAotCQkJCSBhcmd2WzBdLCBhcmd2W29wdGluZCAtIDFdWzBdLCBwZm91bmQtPm5hbWUpOwotCi0JCSAgICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCi0JCSAgICAgIG9wdG9wdCA9IHBmb3VuZC0+dmFsOwotCQkgICAgICByZXR1cm4gJz8nOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHBmb3VuZC0+aGFzX2FyZyA9PSAxKQotCSAgICB7Ci0JICAgICAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JCW9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChvcHRlcnIpCi0JCSAgICBmcHJpbnRmIChzdGRlcnIsCi0JCQkgICBfKCIlczogb3B0aW9uIGAlcycgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpLAotCQkJICAgYXJndlswXSwgYXJndltvcHRpbmQgLSAxXSk7Ci0JCSAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JCSAgb3B0b3B0ID0gcGZvdW5kLT52YWw7Ci0JCSAgcmV0dXJuIG9wdHN0cmluZ1swXSA9PSAnOicgPyAnOicgOiAnPyc7Ci0JCX0KLQkgICAgfQotCSAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JICBpZiAobG9uZ2luZCAhPSBOVUxMKQotCSAgICAqbG9uZ2luZCA9IG9wdGlvbl9pbmRleDsKLQkgIGlmIChwZm91bmQtPmZsYWcpCi0JICAgIHsKLQkgICAgICAqKHBmb3VuZC0+ZmxhZykgPSBwZm91bmQtPnZhbDsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgcmV0dXJuIHBmb3VuZC0+dmFsOwotCX0KLQotICAgICAgLyogQ2FuJ3QgZmluZCBpdCBhcyBhIGxvbmcgb3B0aW9uLiAgSWYgdGhpcyBpcyBub3QgZ2V0b3B0X2xvbmdfb25seSwKLQkgb3IgdGhlIG9wdGlvbiBzdGFydHMgd2l0aCAnLS0nIG9yIGlzIG5vdCBhIHZhbGlkIHNob3J0Ci0JIG9wdGlvbiwgdGhlbiBpdCdzIGFuIGVycm9yLgotCSBPdGhlcndpc2UgaW50ZXJwcmV0IGl0IGFzIGEgc2hvcnQgb3B0aW9uLiAgKi8KLSAgICAgIGlmICghbG9uZ19vbmx5IHx8IGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScKLQkgIHx8IG15X2luZGV4IChvcHRzdHJpbmcsICpuZXh0Y2hhcikgPT0gTlVMTCkKLQl7Ci0JICBpZiAob3B0ZXJyKQotCSAgICB7Ci0JICAgICAgaWYgKGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScpCi0JCS8qIC0tb3B0aW9uICovCi0JCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCBvcHRpb24gYC0tJXMnXG4iKSwKLQkJCSBhcmd2WzBdLCBuZXh0Y2hhcik7Ci0JICAgICAgZWxzZQotCQkvKiArb3B0aW9uIG9yIC1vcHRpb24gKi8KLQkJZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pemVkIG9wdGlvbiBgJWMlcydcbiIpLAotCQkJIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kXVswXSwgbmV4dGNoYXIpOwotCSAgICB9Ci0JICBuZXh0Y2hhciA9IChjaGFyICopICIiOwotCSAgb3B0aW5kKys7Ci0JICBvcHRvcHQgPSAwOwotCSAgcmV0dXJuICc/JzsKLQl9Ci0gICAgfQotCi0gIC8qIExvb2sgYXQgYW5kIGhhbmRsZSB0aGUgbmV4dCBzaG9ydCBvcHRpb24tY2hhcmFjdGVyLiAgKi8KLQotICB7Ci0gICAgY2hhciBjID0gKm5leHRjaGFyKys7Ci0gICAgY2hhciAqdGVtcCA9IG15X2luZGV4IChvcHRzdHJpbmcsIGMpOwotCi0gICAgLyogSW5jcmVtZW50IGBvcHRpbmQnIHdoZW4gd2Ugc3RhcnQgdG8gcHJvY2VzcyBpdHMgbGFzdCBjaGFyYWN0ZXIuICAqLwotICAgIGlmICgqbmV4dGNoYXIgPT0gJ1wwJykKLSAgICAgICsrb3B0aW5kOwotCi0gICAgaWYgKHRlbXAgPT0gTlVMTCB8fCBjID09ICc6JykKLSAgICAgIHsKLQlpZiAob3B0ZXJyKQotCSAgewotCSAgICBpZiAocG9zaXhseV9jb3JyZWN0KQotCSAgICAgIC8qIDEwMDMuMiBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuICAqLwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGlsbGVnYWwgb3B0aW9uIC0tICVjXG4iKSwKLQkJICAgICAgIGFyZ3ZbMF0sIGMpOwotCSAgICBlbHNlCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW52YWxpZCBvcHRpb24gLS0gJWNcbiIpLAotCQkgICAgICAgYXJndlswXSwgYyk7Ci0JICB9Ci0Jb3B0b3B0ID0gYzsKLQlyZXR1cm4gJz8nOwotICAgICAgfQotICAgIC8qIENvbnZlbmllbmNlLiBUcmVhdCBQT1NJWCAtVyBmb28gc2FtZSBhcyBsb25nIG9wdGlvbiAtLWZvbyAqLwotICAgIGlmICh0ZW1wWzBdID09ICdXJyAmJiB0ZW1wWzFdID09ICc7JykKLSAgICAgIHsKLQljaGFyICpuYW1lZW5kOwotCWNvbnN0IHN0cnVjdCBvcHRpb24gKnA7Ci0JY29uc3Qgc3RydWN0IG9wdGlvbiAqcGZvdW5kID0gTlVMTDsKLQlpbnQgZXhhY3QgPSAwOwotCWludCBhbWJpZyA9IDA7Ci0JaW50IGluZGZvdW5kID0gMDsKLQlpbnQgb3B0aW9uX2luZGV4OwotCi0JLyogVGhpcyBpcyBhbiBvcHRpb24gdGhhdCByZXF1aXJlcyBhbiBhcmd1bWVudC4gICovCi0JaWYgKCpuZXh0Y2hhciAhPSAnXDAnKQotCSAgewotCSAgICBvcHRhcmcgPSBuZXh0Y2hhcjsKLQkgICAgLyogSWYgd2UgZW5kIHRoaXMgQVJHVi1lbGVtZW50IGJ5IHRha2luZyB0aGUgcmVzdCBhcyBhbiBhcmcsCi0JICAgICAgIHdlIG11c3QgYWR2YW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IG5vdy4gICovCi0JICAgIG9wdGluZCsrOwotCSAgfQotCWVsc2UgaWYgKG9wdGluZCA9PSBhcmdjKQotCSAgewotCSAgICBpZiAob3B0ZXJyKQotCSAgICAgIHsKLQkJLyogMTAwMy4yIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZS4gICovCi0JCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAlY1xuIiksCi0JCQkgYXJndlswXSwgYyk7Ci0JICAgICAgfQotCSAgICBvcHRvcHQgPSBjOwotCSAgICBpZiAob3B0c3RyaW5nWzBdID09ICc6JykKLQkgICAgICBjID0gJzonOwotCSAgICBlbHNlCi0JICAgICAgYyA9ICc/JzsKLQkgICAgcmV0dXJuIGM7Ci0JICB9Ci0JZWxzZQotCSAgLyogV2UgYWxyZWFkeSBpbmNyZW1lbnRlZCBgb3B0aW5kJyBvbmNlOwotCSAgICAgaW5jcmVtZW50IGl0IGFnYWluIHdoZW4gdGFraW5nIG5leHQgQVJHVi1lbHQgYXMgYXJndW1lbnQuICAqLwotCSAgb3B0YXJnID0gYXJndltvcHRpbmQrK107Ci0KLQkvKiBvcHRhcmcgaXMgbm93IHRoZSBhcmd1bWVudCwgc2VlIGlmIGl0J3MgaW4gdGhlCi0JICAgdGFibGUgb2YgbG9uZ29wdHMuICAqLwotCi0JZm9yIChuZXh0Y2hhciA9IG5hbWVlbmQgPSBvcHRhcmc7ICpuYW1lZW5kICYmICpuYW1lZW5kICE9ICc9JzsgbmFtZWVuZCsrKQotCSAgLyogRG8gbm90aGluZy4gICovIDsKLQotCS8qIFRlc3QgYWxsIGxvbmcgb3B0aW9ucyBmb3IgZWl0aGVyIGV4YWN0IG1hdGNoCi0JICAgb3IgYWJicmV2aWF0ZWQgbWF0Y2hlcy4gICovCi0JZm9yIChwID0gbG9uZ29wdHMsIG9wdGlvbl9pbmRleCA9IDA7IHAtPm5hbWU7IHArKywgb3B0aW9uX2luZGV4KyspCi0JICBpZiAoIXN0cm5jbXAgKHAtPm5hbWUsIG5leHRjaGFyLCBuYW1lZW5kIC0gbmV4dGNoYXIpKQotCSAgICB7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIChuYW1lZW5kIC0gbmV4dGNoYXIpID09IHN0cmxlbiAocC0+bmFtZSkpCi0JCXsKLQkJICAvKiBFeGFjdCBtYXRjaCBmb3VuZC4gICovCi0JCSAgcGZvdW5kID0gcDsKLQkJICBpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKLQkJICBleGFjdCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChwZm91bmQgPT0gTlVMTCkKLQkJewotCQkgIC8qIEZpcnN0IG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KLQkJICBwZm91bmQgPSBwOwotCQkgIGluZGZvdW5kID0gb3B0aW9uX2luZGV4OwotCQl9Ci0JICAgICAgZWxzZQotCQkvKiBTZWNvbmQgb3IgbGF0ZXIgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCQlhbWJpZyA9IDE7Ci0JICAgIH0KLQlpZiAoYW1iaWcgJiYgIWV4YWN0KQotCSAgewotCSAgICBpZiAob3B0ZXJyKQotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG9wdGlvbiBgLVcgJXMnIGlzIGFtYmlndW91c1xuIiksCi0JCSAgICAgICBhcmd2WzBdLCBhcmd2W29wdGluZF0pOwotCSAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkgICAgb3B0aW5kKys7Ci0JICAgIHJldHVybiAnPyc7Ci0JICB9Ci0JaWYgKHBmb3VuZCAhPSBOVUxMKQotCSAgewotCSAgICBvcHRpb25faW5kZXggPSBpbmRmb3VuZDsKLQkgICAgaWYgKCpuYW1lZW5kKQotCSAgICAgIHsKLQkJLyogRG9uJ3QgdGVzdCBoYXNfYXJnIHdpdGggPiwgYmVjYXVzZSBzb21lIEMgY29tcGlsZXJzIGRvbid0Ci0JCSAgIGFsbG93IGl0IHRvIGJlIHVzZWQgb24gZW51bXMuICAqLwotCQlpZiAocGZvdW5kLT5oYXNfYXJnKQotCQkgIG9wdGFyZyA9IG5hbWVlbmQgKyAxOwotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKG9wdGVycikKLQkJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJcCi0lczogb3B0aW9uIGAtVyAlcycgZG9lc24ndCBhbGxvdyBhbiBhcmd1bWVudFxuIiksCi0JCQkgICAgICAgYXJndlswXSwgcGZvdW5kLT5uYW1lKTsKLQotCQkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JCSAgICByZXR1cm4gJz8nOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHBmb3VuZC0+aGFzX2FyZyA9PSAxKQotCSAgICAgIHsKLQkJaWYgKG9wdGluZCA8IGFyZ2MpCi0JCSAgb3B0YXJnID0gYXJndltvcHRpbmQrK107Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAob3B0ZXJyKQotCQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCQkgICAgICAgXygiJXM6IG9wdGlvbiBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKSwKLQkJCSAgICAgICBhcmd2WzBdLCBhcmd2W29wdGluZCAtIDFdKTsKLQkJICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCQkgICAgcmV0dXJuIG9wdHN0cmluZ1swXSA9PSAnOicgPyAnOicgOiAnPyc7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JICAgIGlmIChsb25naW5kICE9IE5VTEwpCi0JICAgICAgKmxvbmdpbmQgPSBvcHRpb25faW5kZXg7Ci0JICAgIGlmIChwZm91bmQtPmZsYWcpCi0JICAgICAgewotCQkqKHBmb3VuZC0+ZmxhZykgPSBwZm91bmQtPnZhbDsKLQkJcmV0dXJuIDA7Ci0JICAgICAgfQotCSAgICByZXR1cm4gcGZvdW5kLT52YWw7Ci0JICB9Ci0JICBuZXh0Y2hhciA9IE5VTEw7Ci0JICByZXR1cm4gJ1cnOwkvKiBMZXQgdGhlIGFwcGxpY2F0aW9uIGhhbmRsZSBpdC4gICAqLwotICAgICAgfQotICAgIGlmICh0ZW1wWzFdID09ICc6JykKLSAgICAgIHsKLQlpZiAodGVtcFsyXSA9PSAnOicpCi0JICB7Ci0JICAgIC8qIFRoaXMgaXMgYW4gb3B0aW9uIHRoYXQgYWNjZXB0cyBhbiBhcmd1bWVudCBvcHRpb25hbGx5LiAgKi8KLQkgICAgaWYgKCpuZXh0Y2hhciAhPSAnXDAnKQotCSAgICAgIHsKLQkJb3B0YXJnID0gbmV4dGNoYXI7Ci0JCW9wdGluZCsrOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIG9wdGFyZyA9IE5VTEw7Ci0JICAgIG5leHRjaGFyID0gTlVMTDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIFRoaXMgaXMgYW4gb3B0aW9uIHRoYXQgcmVxdWlyZXMgYW4gYXJndW1lbnQuICAqLwotCSAgICBpZiAoKm5leHRjaGFyICE9ICdcMCcpCi0JICAgICAgewotCQlvcHRhcmcgPSBuZXh0Y2hhcjsKLQkJLyogSWYgd2UgZW5kIHRoaXMgQVJHVi1lbGVtZW50IGJ5IHRha2luZyB0aGUgcmVzdCBhcyBhbiBhcmcsCi0JCSAgIHdlIG11c3QgYWR2YW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IG5vdy4gICovCi0JCW9wdGluZCsrOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAob3B0aW5kID09IGFyZ2MpCi0JICAgICAgewotCQlpZiAob3B0ZXJyKQotCQkgIHsKLQkJICAgIC8qIDEwMDMuMiBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuICAqLwotCQkgICAgZnByaW50ZiAoc3RkZXJyLAotCQkJICAgXygiJXM6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAlY1xuIiksCi0JCQkgICBhcmd2WzBdLCBjKTsKLQkJICB9Ci0JCW9wdG9wdCA9IGM7Ci0JCWlmIChvcHRzdHJpbmdbMF0gPT0gJzonKQotCQkgIGMgPSAnOic7Ci0JCWVsc2UKLQkJICBjID0gJz8nOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIC8qIFdlIGFscmVhZHkgaW5jcmVtZW50ZWQgYG9wdGluZCcgb25jZTsKLQkJIGluY3JlbWVudCBpdCBhZ2FpbiB3aGVuIHRha2luZyBuZXh0IEFSR1YtZWx0IGFzIGFyZ3VtZW50LiAgKi8KLQkgICAgICBvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKLQkgICAgbmV4dGNoYXIgPSBOVUxMOwotCSAgfQotICAgICAgfQotICAgIHJldHVybiBjOwotICB9Ci19Ci0KLWludAotZ2V0b3B0IChhcmdjLCBhcmd2LCBvcHRzdHJpbmcpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICpjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqb3B0c3RyaW5nOwotewotICByZXR1cm4gX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0c3RyaW5nLAotCQkJICAgKGNvbnN0IHN0cnVjdCBvcHRpb24gKikgMCwKLQkJCSAgIChpbnQgKikgMCwKLQkJCSAgIDApOwotfQotCi0jZW5kaWYJLyogTm90IEVMSURFX0NPREUuICAqLwotDAotI2lmZGVmIFRFU1QKLQotLyogQ29tcGlsZSB3aXRoIC1EVEVTVCB0byBtYWtlIGFuIGV4ZWN1dGFibGUgZm9yIHVzZSBpbiB0ZXN0aW5nCi0gICB0aGUgYWJvdmUgZGVmaW5pdGlvbiBvZiBgZ2V0b3B0Jy4gICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYzsKLSAgaW50IGRpZ2l0X29wdGluZCA9IDA7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IHRoaXNfb3B0aW9uX29wdGluZCA9IG9wdGluZCA/IG9wdGluZCA6IDE7Ci0KLSAgICAgIGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJhYmM6ZDowMTIzNDU2Nzg5Iik7Ci0gICAgICBpZiAoYyA9PSAtMSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICcwJzoKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQljYXNlICc3JzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQkgIGlmIChkaWdpdF9vcHRpbmQgIT0gMCAmJiBkaWdpdF9vcHRpbmQgIT0gdGhpc19vcHRpb25fb3B0aW5kKQotCSAgICBwcmludGYgKCJkaWdpdHMgb2NjdXIgaW4gdHdvIGRpZmZlcmVudCBhcmd2LWVsZW1lbnRzLlxuIik7Ci0JICBkaWdpdF9vcHRpbmQgPSB0aGlzX29wdGlvbl9vcHRpbmQ7Ci0JICBwcmludGYgKCJvcHRpb24gJWNcbiIsIGMpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBhXG4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYic6Ci0JICBwcmludGYgKCJvcHRpb24gYlxuIik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2MnOgotCSAgcHJpbnRmICgib3B0aW9uIGMgd2l0aCB2YWx1ZSBgJXMnXG4iLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICc/JzoKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIj8/IGdldG9wdCByZXR1cm5lZCBjaGFyYWN0ZXIgY29kZSAwJW8gPz9cbiIsIGMpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgcHJpbnRmICgibm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzOiAiKTsKLSAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotCXByaW50ZiAoIiVzICIsIGFyZ3Zbb3B0aW5kKytdKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotCi0gIGV4aXQgKDApOwotfQotCi0jZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldG9wdDEuYyBiL2xpYmliZXJ0eS9nZXRvcHQxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjU3MzcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldG9wdDEuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKiBnZXRvcHRfbG9uZyBhbmQgZ2V0b3B0X2xvbmdfb25seSBlbnRyeSBwb2ludHMgZm9yIEdOVSBnZXRvcHQuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcsOTgKLSAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0MCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2lmICFkZWZpbmVkIF9fU1REQ19fIHx8ICFfX1NURENfXwotLyogVGhpcyBpcyBhIHNlcGFyYXRlIGNvbmRpdGlvbmFsIHNpbmNlIHNvbWUgc3RkYyBzeXN0ZW1zCi0gICByZWplY3QgYGRlZmluZWQgKGNvbnN0KScuICAqLwotI2lmbmRlZiBjb25zdAotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAotICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZi4gIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQwotICAgTGlicmFyeSwgYnV0IGFsc28gaW5jbHVkZWQgaW4gbWFueSBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucy4gIENvbXBpbGluZwotICAgYW5kIGxpbmtpbmcgaW4gdGhpcyBjb2RlIGlzIGEgd2FzdGUgd2hlbiB1c2luZyB0aGUgR05VIEMgbGlicmFyeQotICAgKGVzcGVjaWFsbHkgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSkuICBSYXRoZXIgdGhhbiBoYXZpbmcgZXZlcnkgR05VCi0gICBwcm9ncmFtIHVuZGVyc3RhbmQgYGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxpYmMnIGFuZCBvbWl0IHRoZSBvYmplY3QgZmlsZXMsCi0gICBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZG8gdGhpcyBpbiB0aGUgc291cmNlIGZvciBlYWNoIHN1Y2ggZmlsZS4gICovCi0KLSNkZWZpbmUgR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OIDIKLSNpZiAhZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBfX0dMSUJDX18gPj0gMgotI2luY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgotI2lmIF9HTlVfR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OID09IEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTgotI2RlZmluZSBFTElERV9DT0RFCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVMSURFX0NPREUKLQotCi0vKiBUaGlzIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgc29tZSBsaWJyYXJ5ICNpbmNsdWRlCi0gICB0byBnZXQgX19HTlVfTElCUkFSWV9fIGRlZmluZWQuICAqLwotI2lmZGVmIF9fR05VX0xJQlJBUllfXwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZm5kZWYJTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi1pbnQKLWdldG9wdF9sb25nIChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCkKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICpvcHRpb25zOwotICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnM7Ci0gICAgIGludCAqb3B0X2luZGV4OwotewotICByZXR1cm4gX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0aW9ucywgbG9uZ19vcHRpb25zLCBvcHRfaW5kZXgsIDApOwotfQotCi0vKiBMaWtlIGdldG9wdF9sb25nLCBidXQgJy0nIGFzIHdlbGwgYXMgJy0tJyBjYW4gaW5kaWNhdGUgYSBsb25nIG9wdGlvbi4KLSAgIElmIGFuIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoICctJyAobm90ICctLScpIGRvZXNuJ3QgbWF0Y2ggYSBsb25nIG9wdGlvbiwKLSAgIGJ1dCBkb2VzIG1hdGNoIGEgc2hvcnQgb3B0aW9uLCBpdCBpcyBwYXJzZWQgYXMgYSBzaG9ydCBvcHRpb24KLSAgIGluc3RlYWQuICAqLwotCi1pbnQKLWdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKm9wdGlvbnM7Ci0gICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdfb3B0aW9uczsKLSAgICAgaW50ICpvcHRfaW5kZXg7Ci17Ci0gIHJldHVybiBfZ2V0b3B0X2ludGVybmFsIChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCwgMSk7Ci19Ci0KLQotI2VuZGlmCS8qIE5vdCBFTElERV9DT0RFLiAgKi8KLQwKLSNpZmRlZiBURVNUCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGludCBkaWdpdF9vcHRpbmQgPSAwOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCB0aGlzX29wdGlvbl9vcHRpbmQgPSBvcHRpbmQgPyBvcHRpbmQgOiAxOwotICAgICAgaW50IG9wdGlvbl9pbmRleCA9IDA7Ci0gICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci0gICAgICB7Ci0JeyJhZGQiLCAxLCAwLCAwfSwKLQl7ImFwcGVuZCIsIDAsIDAsIDB9LAotCXsiZGVsZXRlIiwgMSwgMCwgMH0sCi0JeyJ2ZXJib3NlIiwgMCwgMCwgMH0sCi0JeyJjcmVhdGUiLCAwLCAwLCAwfSwKLQl7ImZpbGUiLCAxLCAwLCAwfSwKLQl7MCwgMCwgMCwgMH0KLSAgICAgIH07Ci0KLSAgICAgIGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFiYzpkOjAxMjM0NTY3ODkiLAotCQkgICAgICAgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKLSAgICAgIGlmIChjID09IC0xKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIHByaW50ZiAoIm9wdGlvbiAlcyIsIGxvbmdfb3B0aW9uc1tvcHRpb25faW5kZXhdLm5hbWUpOwotCSAgaWYgKG9wdGFyZykKLQkgICAgcHJpbnRmICgiIHdpdGggYXJnICVzIiwgb3B0YXJnKTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOgotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCWNhc2UgJzcnOgotCWNhc2UgJzgnOgotCWNhc2UgJzknOgotCSAgaWYgKGRpZ2l0X29wdGluZCAhPSAwICYmIGRpZ2l0X29wdGluZCAhPSB0aGlzX29wdGlvbl9vcHRpbmQpCi0JICAgIHByaW50ZiAoImRpZ2l0cyBvY2N1ciBpbiB0d28gZGlmZmVyZW50IGFyZ3YtZWxlbWVudHMuXG4iKTsKLQkgIGRpZ2l0X29wdGluZCA9IHRoaXNfb3B0aW9uX29wdGluZDsKLQkgIHByaW50ZiAoIm9wdGlvbiAlY1xuIiwgYyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2EnOgotCSAgcHJpbnRmICgib3B0aW9uIGFcbiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdiJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBiXG4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYyc6Ci0JICBwcmludGYgKCJvcHRpb24gYyB3aXRoIHZhbHVlIGAlcydcbiIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2QnOgotCSAgcHJpbnRmICgib3B0aW9uIGQgd2l0aCB2YWx1ZSBgJXMnXG4iLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICc/JzoKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIj8/IGdldG9wdCByZXR1cm5lZCBjaGFyYWN0ZXIgY29kZSAwJW8gPz9cbiIsIGMpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgcHJpbnRmICgibm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzOiAiKTsKLSAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotCXByaW50ZiAoIiVzICIsIGFyZ3Zbb3B0aW5kKytdKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotCi0gIGV4aXQgKDApOwotfQotCi0jZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldHBhZ2VzaXplLmMgYi9saWJpYmVydHkvZ2V0cGFnZXNpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0ZDZjMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZ2V0cGFnZXNpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qIEVtdWxhdGlvbiBvZiBnZXRwYWdlc2l6ZSgpIGZvciBzeXN0ZW1zIHRoYXQgbmVlZCBpdC4gKi8KLQotLyoKLQotTkFNRQotCi0JZ2V0cGFnZXNpemUgLS0gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gcGFnZSBvZiBtZW1vcnkKLQotU1lOT1BTSVMKLQotCWludCBnZXRwYWdlc2l6ZSAodm9pZCkKLQotREVTQ1JJUFRJT04KLQotCVJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHBhZ2Ugb2YgbWVtb3J5LiAgVGhpcyBpcyB0aGUKLQlncmFudWxhcml0eSBvZiBtYW55IG9mIHRoZSBzeXN0ZW0gbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMuCi0JTm8gZ3VhcmFudGVlIGlzIG1hZGUgYXMgdG8gd2hldGhlciBvciBub3QgaXQgaXMgdGhlIHNhbWUgYXMgdGhlCi0JYmFzaWMgbWVtb3J5IG1hbmFnZW1lbnQgaGFyZHdhcmUgcGFnZSBzaXplLgotCi1CVUdTCi0KLQlJcyBpbnRlbmRlZCBhcyBhIHJlYXNvbmFibGUgcmVwbGFjZW1lbnQgZm9yIHN5c3RlbXMgd2hlcmUgdGhpcwotCWlzIG5vdCBwcm92aWRlZCBhcyBhIHN5c3RlbSBjYWxsLiAgVGhlIHZhbHVlIG9mIDQwOTYgbWF5IG9yIG1heQotCW5vdCBiZSBjb3JyZWN0IGZvciB0aGUgc3lzdGVtcyB3aGVyZSBpdCBpcyByZXR1cm5lZCBhcyB0aGUgZGVmYXVsdAotCXZhbHVlLgotCi0qLwotCi0jaWZuZGVmIFZNUwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLQotI3VuZGVmIEdOVV9PVVJfUEFHRVNJWkUKLSNpZiBkZWZpbmVkIChIQVZFX1NZU0NPTkYpICYmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaWZkZWYgX1NDX1BBR0VTSVpFCi0jZGVmaW5lIEdOVV9PVVJfUEFHRVNJWkUgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEdOVV9PVVJfUEFHRVNJWkUKLSMgaWZkZWYJUEFHRVNJWkUKLSMgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIFBBR0VTSVpFCi0jIGVsc2UJLyogbm8gUEFHRVNJWkUgKi8KLSMgIGlmZGVmCUVYRUNfUEFHRVNJWkUKLSMgICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSBFWEVDX1BBR0VTSVpFCi0jICBlbHNlCS8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICBpZmRlZglOQlBHCi0jICAgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIChOQlBHICogQ0xTSVpFKQotIyAgICBpZm5kZWYJQ0xTSVpFCi0jICAgICBkZWZpbmUJQ0xTSVpFIDEKLSMgICAgZW5kaWYJLyogQ0xTSVpFICovCi0jICAgZWxzZQkvKiBubyBOQlBHICovCi0jICAgIGlmZGVmCU5CUEMKLSMgICAgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIE5CUEMKLSMgICAgZWxzZQkvKiBubyBOQlBDICovCi0jICAgICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSA0MDk2CS8qIEp1c3QgcHVudCBhbmQgdXNlIHJlYXNvbmFibGUgdmFsdWUgKi8KLSMgICAgZW5kaWYgLyogTkJQQyAqLwotIyAgIGVuZGlmIC8qIE5CUEcgKi8KLSMgIGVuZGlmIC8qIEVYRUNfUEFHRVNJWkUgKi8KLSMgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSNlbmRpZiAvKiBHTlVfT1VSX1BBR0VTSVpFICovCi0KLWludAotZ2V0cGFnZXNpemUgKCkKLXsKLSAgcmV0dXJuIChHTlVfT1VSX1BBR0VTSVpFKTsKLX0KLQotI2Vsc2UgLyogVk1TICovCi0KLSNpZiAwCS8qIG9sZGVyIGRpc3RyaWJ1dGlvbnMgb2YgZ2NjLXZtcyBhcmUgbWlzc2luZyA8c3lpZGVmLmg+ICovCi0jaW5jbHVkZSA8c3lpZGVmLmg+Ci0jZW5kaWYKLSNpZm5kZWYgU1lJJF9QQUdFX1NJWkUJLyogVk1TIFY1LjQgYW5kIGVhcmxpZXIgZGlkbid0IGhhdmUgdGhpcyB5ZXQgKi8KLSNkZWZpbmUgU1lJJF9QQUdFX1NJWkUgNDQ1MgotI2VuZGlmCi1leHRlcm4gdW5zaWduZWQgbG9uZyBsaWIkZ2V0c3lpKGNvbnN0IHVuc2lnbmVkIHNob3J0ICosLi4uKTsKLQotaW50IGdldHBhZ2VzaXplICgpCi17Ci0gIGxvbmcgcGFnc2l6ID0gMEw7Ci0gIHVuc2lnbmVkIHNob3J0IGl0bWNvZCA9IFNZSSRfUEFHRV9TSVpFOwotCi0gICh2b2lkKSBsaWIkZ2V0c3lpICgmaXRtY29kLCAodm9pZCAqKSAmcGFnc2l6KTsKLSAgaWYgKHBhZ3NpeiA9PSAwTCkKLSAgICBwYWdzaXogPSA1MTJMOwkvKiBWQVggZGVmYXVsdCAqLwotICByZXR1cm4gKGludCkgcGFnc2l6OwotfQotCi0jZW5kaWYgLyogVk1TICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZ2V0cHdkLmMgYi9saWJpYmVydHkvZ2V0cHdkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmUwMzkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldHB3ZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qIGdldHB3ZC5jIC0gZ2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLSNpZiBIQVZFX1NZU19TVEFUX0gKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0KLS8qIFByb3RvdHlwZSB0aGVzZSBpbiBjYXNlIHRoZSBzeXN0ZW0gaGVhZGVycyBkb24ndCBwcm92aWRlIHRoZW0uICovCi1leHRlcm4gY2hhciAqZ2V0cHdkICgpOwotZXh0ZXJuIGNoYXIgKmdldHdkICgpOwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLS8qIFZpcnR1YWxseSBldmVyeSBVTipYIHN5c3RlbSBub3cgaW4gY29tbW9uIHVzZSAoZXhjZXB0IGZvciBwcmUtNC4zLXRhaG9lCi0gICBCU0Qgc3lzdGVtcykgbm93IHByb3ZpZGVzIGdldGN3ZCBhcyBjYWxsZWQgZm9yIGJ5IFBPU0lYLiAgQWxsb3cgZm9yCi0gICB0aGUgZmV3IGV4Y2VwdGlvbnMgdG8gdGhlIGdlbmVyYWwgcnVsZSBoZXJlLiAgKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfR0VUQ1dEKSAmJiBkZWZpbmVkKEhBVkVfR0VUV0QpCi0jZGVmaW5lIGdldGN3ZChidWYsbGVuKSBnZXR3ZChidWYpCi0jZW5kaWYKLQotI2lmZGVmIE1BWFBBVEhMRU4KLSNkZWZpbmUgR1VFU1NQQVRITEVOIChNQVhQQVRITEVOICsgMSkKLSNlbHNlCi0jZGVmaW5lIEdVRVNTUEFUSExFTiAxMDAKLSNlbmRpZgotCi0jaWYgIShkZWZpbmVkIChWTVMpIHx8IChkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykpKQotCi0vKiBHZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiAgVXNlIHRoZSBQV0QgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQncwotICAgc2V0IGNvcnJlY3RseSwgc2luY2UgdGhpcyBpcyBmYXN0ZXIgYW5kIGdpdmVzIG1vcmUgdW5pZm9ybSBhbnN3ZXJzCi0gICB0byB0aGUgdXNlci4gIFlpZWxkIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpZiBzdWNjZXNzZnVsOyBvdGhlcndpc2UsCi0gICB5aWVsZCAwIGFuZCBzZXQgZXJybm8uICAqLwotCi1jaGFyICoKLWdldHB3ZCAoKQotewotICBzdGF0aWMgY2hhciAqcHdkOwotICBzdGF0aWMgaW50IGZhaWx1cmVfZXJybm87Ci0KLSAgY2hhciAqcCA9IHB3ZDsKLSAgc2l6ZV90IHM7Ci0gIHN0cnVjdCBzdGF0IGRvdHN0YXQsIHB3ZHN0YXQ7Ci0KLSAgaWYgKCFwICYmICEoZXJybm8gPSBmYWlsdXJlX2Vycm5vKSkKLSAgICB7Ci0gICAgICBpZiAoISAoKHAgPSBnZXRlbnYgKCJQV0QiKSkgIT0gMAotCSAgICAgJiYgKnAgPT0gJy8nCi0JICAgICAmJiBzdGF0IChwLCAmcHdkc3RhdCkgPT0gMAotCSAgICAgJiYgc3RhdCAoIi4iLCAmZG90c3RhdCkgPT0gMAotCSAgICAgJiYgZG90c3RhdC5zdF9pbm8gPT0gcHdkc3RhdC5zdF9pbm8KLQkgICAgICYmIGRvdHN0YXQuc3RfZGV2ID09IHB3ZHN0YXQuc3RfZGV2KSkKLQotCS8qIFRoZSBzaG9ydGN1dCBkaWRuJ3Qgd29yay4gIFRyeSB0aGUgc2xvdywgYGBzdXJlJycgd2F5LiAgKi8KLQlmb3IgKHMgPSBHVUVTU1BBVEhMRU47ICAhIGdldGN3ZCAocCA9IHhtYWxsb2MgKHMpLCBzKTsgIHMgKj0gMikKLQkgIHsKLQkgICAgaW50IGUgPSBlcnJubzsKLQkgICAgZnJlZSAocCk7Ci0jaWZkZWYgRVJBTkdFCi0JICAgIGlmIChlICE9IEVSQU5HRSkKLSNlbmRpZgotCSAgICAgIHsKLQkJZXJybm8gPSBmYWlsdXJlX2Vycm5vID0gZTsKLQkJcCA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQotICAgICAgLyogQ2FjaGUgdGhlIHJlc3VsdC4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBwcm9ncmFtIGRvZXMKLQkgbm90IGludm9rZSBjaGRpciBiZXR3ZWVuIGNhbGxzIHRvIGdldHB3ZC4gICovCi0gICAgICBwd2QgPSBwOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLSNlbHNlCS8qIFZNUyB8fCBfV0lOMzIgJiYgIV9fQ1lHV0lOX18gKi8KLQotI2lmbmRlZiBNQVhQQVRITEVOCi0jZGVmaW5lIE1BWFBBVEhMRU4gMjU1Ci0jZW5kaWYKLQotY2hhciAqCi1nZXRwd2QgKCkKLXsKLSAgc3RhdGljIGNoYXIgKnB3ZCA9IDA7Ci0KLSAgaWYgKCFwd2QpCi0gICAgcHdkID0gZ2V0Y3dkICh4bWFsbG9jIChNQVhQQVRITEVOICsgMSksIE1BWFBBVEhMRU4gKyAxCi0jaWZkZWYgVk1TCi0JCSAgLCAwCi0jZW5kaWYKLQkJICApOwotICByZXR1cm4gcHdkOwotfQotCi0jZW5kaWYJLyogVk1TIHx8IF9XSU4zMiAmJiAhX19DWUdXSU5fXyAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldHJ1bnRpbWUuYyBiL2xpYmliZXJ0eS9nZXRydW50aW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NTVlYTYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldHJ1bnRpbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qIFJldHVybiB0aW1lIHVzZWQgc28gZmFyLCBpbiBtaWNyb3NlY29uZHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0vKiBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGdldCBlbGFwc2VkIGV4ZWN1dGlvbiB0aW1lOyB1bmZvcnR1bmF0ZWx5IG5vCi0gICBzaW5nbGUgd2F5IGlzIGF2YWlsYWJsZSBmb3IgYWxsIGhvc3Qgc3lzdGVtcywgbm9yIGFyZSB0aGVyZSByZWxpYWJsZQotICAgd2F5cyB0byBmaW5kIG91dCB3aGljaCB3YXkgaXMgY29ycmVjdCBmb3IgYSBnaXZlbiBob3N0LiAqLwotCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaWYgZGVmaW5lZCAoSEFWRV9HRVRSVVNBR0UpICYmIGRlZmluZWQgKEhBVkVfU1lTX1JFU09VUkNFX0gpCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9USU1FUwotI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotLyogVGhpcyBpcyBhIGZhbGxiYWNrOyBpZiB3cm9uZywgaXQgd2lsbCBsaWtlbHkgbWFrZSBvYnZpb3VzbHkgd3JvbmcKLSAgIHJlc3VsdHMuICovCi0KLSNpZm5kZWYgQ0xPQ0tTX1BFUl9TRUMKLSNkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMgMQotI2VuZGlmCi0KLSNpZmRlZiBfU0NfQ0xLX1RDSwotI2RlZmluZSBHTlVfSFogIHN5c2NvbmYoX1NDX0NMS19UQ0spCi0jZWxzZQotI2lmZGVmIEhaCi0jZGVmaW5lIEdOVV9IWiAgSFoKLSNlbHNlCi0jaWZkZWYgQ0xPQ0tTX1BFUl9TRUMKLSNkZWZpbmUgR05VX0haICBDTE9DS1NfUEVSX1NFQwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi1sb25nCi1nZXRfcnVuX3RpbWUgKCkKLXsKLSNpZiBkZWZpbmVkIChIQVZFX0dFVFJVU0FHRSkgJiYgZGVmaW5lZCAoSEFWRV9TWVNfUkVTT1VSQ0VfSCkKLSAgc3RydWN0IHJ1c2FnZSBydXNhZ2U7Ci0KLSAgZ2V0cnVzYWdlICgwLCAmcnVzYWdlKTsKLSAgcmV0dXJuIChydXNhZ2UucnVfdXRpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV91dGltZS50dl91c2VjCi0JICArIHJ1c2FnZS5ydV9zdGltZS50dl9zZWMgKiAxMDAwMDAwICsgcnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMpOwotI2Vsc2UgLyogISBIQVZFX0dFVFJVU0FHRSAqLwotI2lmZGVmIEhBVkVfVElNRVMKLSAgc3RydWN0IHRtcyB0bXM7Ci0KLSAgdGltZXMgKCZ0bXMpOwotICByZXR1cm4gKHRtcy50bXNfdXRpbWUgKyB0bXMudG1zX3N0aW1lKSAqICgxMDAwMDAwIC8gR05VX0haKTsKLSNlbHNlIC8qICEgSEFWRV9USU1FUyAqLwotICAvKiBGYWxsIGJhY2sgb24gY2xvY2sgYW5kIGhvcGUgaXQncyBjb3JyZWN0bHkgaW1wbGVtZW50ZWQuICovCi0gIGNvbnN0IGxvbmcgY2xvY2tzX3Blcl9zZWMgPSBDTE9DS1NfUEVSX1NFQzsKLSAgaWYgKGNsb2Nrc19wZXJfc2VjIDw9IDEwMDAwMDApCi0gICAgcmV0dXJuIGNsb2NrICgpICogKDEwMDAwMDAgLyBjbG9ja3NfcGVyX3NlYyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gY2xvY2sgKCkgLyBjbG9ja3NfcGVyX3NlYzsKLSNlbmRpZiAgLyogSEFWRV9USU1FUyAqLwotI2VuZGlmICAvKiBIQVZFX0dFVFJVU0FHRSAqLwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2hhc2h0YWIuYyBiL2xpYmliZXJ0eS9oYXNodGFiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YzVkM2UuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2hhc2h0YWIuYworKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKiBBbiBleHBhbmRhYmxlIGhhc2ggdGFibGVzIGRhdGF0eXBlLiAgCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBWbGFkaW1pciBNYWthcm92ICh2bWFrYXJvdkBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgcGFja2FnZSBpbXBsZW1lbnRzIGJhc2ljIGhhc2ggdGFibGUgZnVuY3Rpb25hbGl0eS4gIEl0IGlzIHBvc3NpYmxlCi0gICB0byBzZWFyY2ggZm9yIGFuIGVudHJ5LCBjcmVhdGUgYW4gZW50cnkgYW5kIGRlc3Ryb3kgYW4gZW50cnkuCi0KLSAgIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgZ2VuZXJpYyBwb2ludGVycy4KLQotICAgVGhlIHNpemUgb2YgdGhlIHRhYmxlIGlzIG5vdCBmaXhlZDsgaWYgdGhlIG9jY3VwYW5jeSBvZiB0aGUgdGFibGUKLSAgIGdyb3dzIHRvbyBoaWdoIHRoZSBoYXNoIHRhYmxlIHdpbGwgYmUgZXhwYW5kZWQuCi0KLSAgIFRoZSBhYnN0cmFjdCBkYXRhIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGdlbmVyYWxpemVkIEFsZ29yaXRobSBECi0gICBmcm9tIEtudXRoJ3MgYm9vayAiVGhlIGFydCBvZiBjb21wdXRlciBwcm9ncmFtbWluZyIuICBIYXNoIHRhYmxlIGlzCi0gICBleHBhbmRlZCBieSBjcmVhdGlvbiBvZiBuZXcgaGFzaCB0YWJsZSBhbmQgdHJhbnNmZXJyaW5nIGVsZW1lbnRzIGZyb20KLSAgIHRoZSBvbGQgdGFibGUgdG8gdGhlIG5ldyB0YWJsZS4gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJoYXNodGFiLmgiCi0KLS8qIFRoaXMgbWFjcm8gZGVmaW5lcyByZXNlcnZlZCB2YWx1ZSBmb3IgZW1wdHkgdGFibGUgZW50cnkuICovCi0KLSNkZWZpbmUgRU1QVFlfRU5UUlkgICAgKCh2b2lkICopIDApCi0KLS8qIFRoaXMgbWFjcm8gZGVmaW5lcyByZXNlcnZlZCB2YWx1ZSBmb3IgdGFibGUgZW50cnkgd2hpY2ggY29udGFpbmVkCi0gICBhIGRlbGV0ZWQgZWxlbWVudC4gKi8KLQotI2RlZmluZSBERUxFVEVEX0VOVFJZICAoKHZvaWQgKikgMSkKLQotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZWFyZXN0IHByaW1lIG51bWJlciB3aGljaCBpcwotICAgZ3JlYXRlciB0aGFuIGdpdmVuIHNvdXJjZSBudW1iZXIuICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1oaWdoZXJfcHJpbWVfbnVtYmVyIChuKQotICAgICB1bnNpZ25lZCBsb25nIG47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLQotICBuIHw9IDB4MDE7ICAvKiBGb3JjZSBOIHRvIGJlIG9kZC4gICovCi0gIGlmIChuIDwgOSkKLSAgICByZXR1cm4gbjsgLyogQWxsIG9kZCBudW1iZXJzIDwgOSBhcmUgcHJpbWUuICAqLwotCi0gbmV4dDoKLSAgbiArPSAyOwotICBpID0gMzsKLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobiAlIGkgPT0gMCkKLQlnb3RvIG5leHQ7Ci0gICAgICBpICs9IDI7Ci0gICAgfQotICB3aGlsZSAoKGkgKiBpKSA8PSBuKTsKLQotICByZXR1cm4gbjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRhYmxlIHdpdGggbGVuZ3RoIHNsaWdodGx5IGxvbmdlciB0aGFuIGdpdmVuCi0gICBzb3VyY2UgbGVuZ3RoLiAgQ3JlYXRlZCBoYXNoIHRhYmxlIGlzIGluaXRpYXRlZCBhcyBlbXB0eSAoYWxsIHRoZQotICAgaGFzaCB0YWJsZSBlbnRyaWVzIGFyZSBFTVBUWV9FTlRSWSkuICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUKLSAgIGNyZWF0ZWQgaGFzaCB0YWJsZS4gKi8KLQotaHRhYl90Ci1odGFiX2NyZWF0ZSAoc2l6ZSwgaGFzaF9mLCBlcV9mLCBkZWxfZikKLSAgICAgc2l6ZV90IHNpemU7Ci0gICAgIGh0YWJfaGFzaCBoYXNoX2Y7Ci0gICAgIGh0YWJfZXEgZXFfZjsKLSAgICAgaHRhYl9kZWwgZGVsX2Y7Ci17Ci0gIGh0YWJfdCByZXN1bHQ7Ci0KLSAgc2l6ZSA9IGhpZ2hlcl9wcmltZV9udW1iZXIgKHNpemUpOwotICByZXN1bHQgPSAoaHRhYl90KSB4Y2FsbG9jICgxLCBzaXplb2YgKHN0cnVjdCBodGFiKSk7Ci0gIHJlc3VsdC0+ZW50cmllcyA9ICh2b2lkICoqKSB4Y2FsbG9jIChzaXplLCBzaXplb2YgKHZvaWQgKikpOwotICByZXN1bHQtPnNpemUgPSBzaXplOwotICByZXN1bHQtPmhhc2hfZiA9IGhhc2hfZjsKLSAgcmVzdWx0LT5lcV9mID0gZXFfZjsKLSAgcmVzdWx0LT5kZWxfZiA9IGRlbF9mOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGZvciBnaXZlbiBoYXNoIHRhYmxlLgotICAgTmF0dXJhbGx5IHRoZSBoYXNoIHRhYmxlIG11c3QgYWxyZWFkeSBleGlzdC4gKi8KLQotdm9pZAotaHRhYl9kZWxldGUgKGh0YWIpCi0gICAgIGh0YWJfdCBodGFiOwotewotICBpbnQgaTsKLSAgaWYgKGh0YWItPmRlbF9mKQotICAgIGZvciAoaSA9IGh0YWItPnNpemUgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLQlpZiAoaHRhYi0+ZW50cmllc1tpXSAhPSBFTVBUWV9FTlRSWQotCSAgICAmJiBodGFiLT5lbnRyaWVzW2ldICE9IERFTEVURURfRU5UUlkpCi0JICAoKmh0YWItPmRlbF9mKSAoaHRhYi0+ZW50cmllc1tpXSk7Ci0gICAgICB9Ci0KLSAgZnJlZSAoaHRhYi0+ZW50cmllcyk7Ci0gIGZyZWUgKGh0YWIpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyBhbGwgZW50cmllcyBpbiB0aGUgZ2l2ZW4gaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWh0YWJfZW1wdHkgKGh0YWIpCi0gICAgIGh0YWJfdCBodGFiOwotewotICBpbnQgaTsKLSAgaWYgKGh0YWItPmRlbF9mKQotICAgIGZvciAoaSA9IGh0YWItPnNpemUgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLQlpZiAoaHRhYi0+ZW50cmllc1tpXSAhPSBFTVBUWV9FTlRSWQotCSAgICAmJiBodGFiLT5lbnRyaWVzW2ldICE9IERFTEVURURfRU5UUlkpCi0JICAoKmh0YWItPmRlbF9mKSAoaHRhYi0+ZW50cmllc1tpXSk7Ci0gICAgICB9Ci0KLSAgbWVtc2V0IChodGFiLT5lbnRyaWVzLCAwLCBodGFiLT5zaXplICogc2l6ZW9mICh2b2lkICopKTsKLX0KLQotLyogU2ltaWxhciB0byBodGFiX2ZpbmRfc2xvdCwgYnV0IHdpdGhvdXQgc2V2ZXJhbCB1bndhbnRlZCBzaWRlIGVmZmVjdHM6Ci0gICAgLSBEb2VzIG5vdCBjYWxsIGh0YWItPmVxX2Ygd2hlbiBpdCBmaW5kcyBhbiBleGlzdGluZyBlbnRyeS4KLSAgICAtIERvZXMgbm90IGNoYW5nZSB0aGUgY291bnQgb2YgZWxlbWVudHMvc2VhcmNoZXMvY29sbGlzaW9ucyBpbiB0aGUKLSAgICAgIGhhc2ggdGFibGUuCi0gICBUaGlzIGZ1bmN0aW9uIGFsc28gYXNzdW1lcyB0aGVyZSBhcmUgbm8gZGVsZXRlZCBlbnRyaWVzIGluIHRoZSB0YWJsZS4KLSAgIEhBU0ggaXMgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBlbGVtZW50IHRvIGJlIGluc2VydGVkLiAgKi8KLXN0YXRpYyB2b2lkICoqCi1maW5kX2VtcHR5X3Nsb3RfZm9yX2V4cGFuZCAoaHRhYiwgaGFzaCkKLSAgICAgaHRhYl90IGh0YWI7Ci0gICAgIHVuc2lnbmVkIGludCBoYXNoOwotewotICBzaXplX3Qgc2l6ZSA9IGh0YWItPnNpemU7Ci0gIHVuc2lnbmVkIGludCBoYXNoMiA9IDEgKyBoYXNoICUgKHNpemUgLSAyKTsKLSAgdW5zaWduZWQgaW50IGluZGV4ID0gaGFzaCAlIHNpemU7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICB2b2lkICoqc2xvdCA9IGh0YWItPmVudHJpZXMgKyBpbmRleDsKLSAgICAgIGlmICgqc2xvdCA9PSBFTVBUWV9FTlRSWSkKLQlyZXR1cm4gc2xvdDsKLQotICAgICAgaWYgKCpzbG90ID09IERFTEVURURfRU5UUlkpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGluZGV4ICs9IGhhc2gyOwotICAgICAgaWYgKGluZGV4ID49IHNpemUpCi0JaW5kZXggLT0gc2l6ZTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gY2hhbmdlcyBzaXplIG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZQotICAgZW50cmllcyBhbmQgcmVwZWF0ZWRseSBpbnNlcnRzIHRoZSB0YWJsZSBlbGVtZW50cy4gIFRoZSBvY2N1cGFuY3kKLSAgIG9mIHRoZSB0YWJsZSBhZnRlciB0aGUgY2FsbCB3aWxsIGJlIGFib3V0IDUwJS4gIE5hdHVyYWxseSB0aGUgaGFzaAotICAgdGFibGUgbXVzdCBhbHJlYWR5IGV4aXN0LiAgUmVtZW1iZXIgYWxzbyB0aGF0IHRoZSBwbGFjZSBvZiB0aGUKLSAgIHRhYmxlIGVudHJpZXMgaXMgY2hhbmdlZC4gKi8KLQotc3RhdGljIHZvaWQKLWh0YWJfZXhwYW5kIChodGFiKQotICAgICBodGFiX3QgaHRhYjsKLXsKLSAgdm9pZCAqKm9lbnRyaWVzOwotICB2b2lkICoqb2xpbWl0OwotICB2b2lkICoqcDsKLQotICBvZW50cmllcyA9IGh0YWItPmVudHJpZXM7Ci0gIG9saW1pdCA9IG9lbnRyaWVzICsgaHRhYi0+c2l6ZTsKLQotICBodGFiLT5zaXplID0gaGlnaGVyX3ByaW1lX251bWJlciAoaHRhYi0+c2l6ZSAqIDIpOwotICBodGFiLT5lbnRyaWVzID0geGNhbGxvYyAoaHRhYi0+c2l6ZSwgc2l6ZW9mICh2b2lkICoqKSk7Ci0KLSAgaHRhYi0+bl9lbGVtZW50cyAtPSBodGFiLT5uX2RlbGV0ZWQ7Ci0gIGh0YWItPm5fZGVsZXRlZCA9IDA7Ci0KLSAgcCA9IG9lbnRyaWVzOwotICBkbwotICAgIHsKLSAgICAgIHZvaWQgKnggPSAqcDsKLSAgICAgIGlmICh4ICE9IEVNUFRZX0VOVFJZICYmIHggIT0gREVMRVRFRF9FTlRSWSkKLQl7Ci0JICB2b2lkICoqcSA9IGZpbmRfZW1wdHlfc2xvdF9mb3JfZXhwYW5kIChodGFiLCAoKmh0YWItPmhhc2hfZikgKHgpKTsKLQkgICpxID0geDsKLQl9Ci0gICAgICBwKys7Ci0gICAgfQotICB3aGlsZSAocCA8IG9saW1pdCk7Ci0gIGZyZWUgKG9lbnRyaWVzKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYSBoYXNoIHRhYmxlIGVudHJ5IGVxdWFsIHRvIHRoZSBnaXZlbgotICAgZWxlbWVudC4gIEl0IGNhbm5vdCBiZSB1c2VkIHRvIGluc2VydCBvciBkZWxldGUgYW4gZWxlbWVudC4gICovCi0KLXZvaWQgKgotaHRhYl9maW5kX3dpdGhfaGFzaCAoaHRhYiwgZWxlbWVudCwgaGFzaCkKLSAgICAgaHRhYl90IGh0YWI7Ci0gICAgIGNvbnN0IHZvaWQgKmVsZW1lbnQ7Ci0gICAgIHVuc2lnbmVkIGludCBoYXNoOwotewotICB1bnNpZ25lZCBpbnQgaW5kZXgsIGhhc2gyOwotICBzaXplX3Qgc2l6ZTsKLQotICBodGFiLT5zZWFyY2hlcysrOwotICBzaXplID0gaHRhYi0+c2l6ZTsKLSAgaGFzaDIgPSAxICsgaGFzaCAlIChzaXplIC0gMik7Ci0gIGluZGV4ID0gaGFzaCAlIHNpemU7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICB2b2lkICplbnRyeSA9IGh0YWItPmVudHJpZXNbaW5kZXhdOwotICAgICAgaWYgKGVudHJ5ID09IEVNUFRZX0VOVFJZKQotCXJldHVybiBOVUxMOwotICAgICAgZWxzZSBpZiAoZW50cnkgIT0gREVMRVRFRF9FTlRSWSAmJiAoKmh0YWItPmVxX2YpIChlbnRyeSwgZWxlbWVudCkpCi0JcmV0dXJuIGVudHJ5OwotCi0gICAgICBodGFiLT5jb2xsaXNpb25zKys7Ci0gICAgICBpbmRleCArPSBoYXNoMjsKLSAgICAgIGlmIChpbmRleCA+PSBzaXplKQotCWluZGV4IC09IHNpemU7Ci0gICAgfQotfQotCi0vKiBMaWtlIGh0YWJfZmluZF9zbG90X3dpdGhfaGFzaCwgYnV0IGNvbXB1dGUgdGhlIGhhc2ggdmFsdWUgZnJvbSB0aGUKLSAgIGVsZW1lbnQuICAqLwotdm9pZCAqCi1odGFiX2ZpbmQgKGh0YWIsIGVsZW1lbnQpCi0gICAgIGh0YWJfdCBodGFiOwotICAgICBjb25zdCB2b2lkICplbGVtZW50OwotewotICByZXR1cm4gaHRhYl9maW5kX3dpdGhfaGFzaCAoaHRhYiwgZWxlbWVudCwgKCpodGFiLT5oYXNoX2YpIChlbGVtZW50KSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGEgaGFzaCB0YWJsZSBzbG90IGNvbnRhaW5pbmcgYW4gZW50cnkKLSAgIGVxdWFsIHRvIHRoZSBnaXZlbiBlbGVtZW50LiAgVG8gZGVsZXRlIGFuIGVudHJ5LCBjYWxsIHRoaXMgd2l0aAotICAgSU5TRVJUID0gMCwgdGhlbiBjYWxsIGh0YWJfY2xlYXJfc2xvdCBvbiB0aGUgc2xvdCByZXR1cm5lZCAocG9zc2libHkKLSAgIGFmdGVyIGRvaW5nIHNvbWUgY2hlY2tzKS4gIFRvIGluc2VydCBhbiBlbnRyeSwgY2FsbCB0aGlzIHdpdGgKLSAgIElOU0VSVCA9IDEsIHRoZW4gd3JpdGUgdGhlIHZhbHVlIHlvdSB3YW50IGludG8gdGhlIHJldHVybmVkIHNsb3QuICAqLwotCi12b2lkICoqCi1odGFiX2ZpbmRfc2xvdF93aXRoX2hhc2ggKGh0YWIsIGVsZW1lbnQsIGhhc2gsIGluc2VydCkKLSAgICAgaHRhYl90IGh0YWI7Ci0gICAgIGNvbnN0IHZvaWQgKmVsZW1lbnQ7Ci0gICAgIHVuc2lnbmVkIGludCBoYXNoOwotICAgICBpbnQgaW5zZXJ0OwotewotICB2b2lkICoqZmlyc3RfZGVsZXRlZF9zbG90OwotICB1bnNpZ25lZCBpbnQgaW5kZXgsIGhhc2gyOwotICBzaXplX3Qgc2l6ZTsKLQotICBpZiAoaW5zZXJ0ICYmIGh0YWItPnNpemUgKiAzIDw9IGh0YWItPm5fZWxlbWVudHMgKiA0KQotICAgIGh0YWJfZXhwYW5kIChodGFiKTsKLQotICBzaXplID0gaHRhYi0+c2l6ZTsKLSAgaGFzaDIgPSAxICsgaGFzaCAlIChzaXplIC0gMik7Ci0gIGluZGV4ID0gaGFzaCAlIHNpemU7Ci0KLSAgaHRhYi0+c2VhcmNoZXMrKzsKLSAgZmlyc3RfZGVsZXRlZF9zbG90ID0gTlVMTDsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHZvaWQgKmVudHJ5ID0gaHRhYi0+ZW50cmllc1tpbmRleF07Ci0gICAgICBpZiAoZW50cnkgPT0gRU1QVFlfRU5UUlkpCi0JewotCSAgaWYgKCFpbnNlcnQpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICBodGFiLT5uX2VsZW1lbnRzKys7Ci0KLQkgIGlmIChmaXJzdF9kZWxldGVkX3Nsb3QpCi0JICAgIHsKLQkgICAgICAqZmlyc3RfZGVsZXRlZF9zbG90ID0gRU1QVFlfRU5UUlk7Ci0JICAgICAgcmV0dXJuIGZpcnN0X2RlbGV0ZWRfc2xvdDsKLQkgICAgfQotCi0JICByZXR1cm4gJmh0YWItPmVudHJpZXNbaW5kZXhdOwotCX0KLQotICAgICAgaWYgKGVudHJ5ID09IERFTEVURURfRU5UUlkpCi0JewotCSAgaWYgKCFmaXJzdF9kZWxldGVkX3Nsb3QpCi0JICAgIGZpcnN0X2RlbGV0ZWRfc2xvdCA9ICZodGFiLT5lbnRyaWVzW2luZGV4XTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCgqaHRhYi0+ZXFfZikgKGVudHJ5LCBlbGVtZW50KSkKLQkgICAgcmV0dXJuICZodGFiLT5lbnRyaWVzW2luZGV4XTsKLQl9Ci0gICAgICAKLSAgICAgIGh0YWItPmNvbGxpc2lvbnMrKzsKLSAgICAgIGluZGV4ICs9IGhhc2gyOwotICAgICAgaWYgKGluZGV4ID49IHNpemUpCi0JaW5kZXggLT0gc2l6ZTsKLSAgICB9Ci19Ci0KLS8qIExpa2UgaHRhYl9maW5kX3Nsb3Rfd2l0aF9oYXNoLCBidXQgY29tcHV0ZSB0aGUgaGFzaCB2YWx1ZSBmcm9tIHRoZQotICAgZWxlbWVudC4gICovCi12b2lkICoqCi1odGFiX2ZpbmRfc2xvdCAoaHRhYiwgZWxlbWVudCwgaW5zZXJ0KQotICAgICBodGFiX3QgaHRhYjsKLSAgICAgY29uc3Qgdm9pZCAqZWxlbWVudDsKLSAgICAgaW50IGluc2VydDsKLXsKLSAgcmV0dXJuIGh0YWJfZmluZF9zbG90X3dpdGhfaGFzaCAoaHRhYiwgZWxlbWVudCwgKCpodGFiLT5oYXNoX2YpIChlbGVtZW50KSwKLQkJCQkgICBpbnNlcnQpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSBmcm9tIGhhc2gKLSAgIHRhYmxlLiAgSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgaGFzaCB0YWJsZSwgdGhpcwotICAgZnVuY3Rpb24gZG9lcyBub3RoaW5nLiAgKi8KLQotdm9pZAotaHRhYl9yZW1vdmVfZWx0IChodGFiLCBlbGVtZW50KQotICAgICBodGFiX3QgaHRhYjsKLSAgICAgdm9pZCAqZWxlbWVudDsKLXsKLSAgdm9pZCAqKnNsb3Q7Ci0KLSAgc2xvdCA9IGh0YWJfZmluZF9zbG90IChodGFiLCBlbGVtZW50LCAwKTsKLSAgaWYgKCpzbG90ID09IEVNUFRZX0VOVFJZKQotICAgIHJldHVybjsKLQotICBpZiAoaHRhYi0+ZGVsX2YpCi0gICAgKCpodGFiLT5kZWxfZikgKCpzbG90KTsKLQotICAqc2xvdCA9IERFTEVURURfRU5UUlk7Ci0gIGh0YWItPm5fZGVsZXRlZCsrOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyBhIHNwZWNpZmllZCBzbG90IGluIGEgaGFzaCB0YWJsZS4gIEl0IGlzCi0gICB1c2VmdWwgd2hlbiB5b3UndmUgYWxyZWFkeSBkb25lIHRoZSBsb29rdXAgYW5kIGRvbid0IHdhbnQgdG8gZG8gaXQKLSAgIGFnYWluLiAgKi8KLQotdm9pZAotaHRhYl9jbGVhcl9zbG90IChodGFiLCBzbG90KQotICAgICBodGFiX3QgaHRhYjsKLSAgICAgdm9pZCAqKnNsb3Q7Ci17Ci0gIGlmIChzbG90IDwgaHRhYi0+ZW50cmllcyB8fCBzbG90ID49IGh0YWItPmVudHJpZXMgKyBodGFiLT5zaXplCi0gICAgICB8fCAqc2xvdCA9PSBFTVBUWV9FTlRSWSB8fCAqc2xvdCA9PSBERUxFVEVEX0VOVFJZKQotICAgIGFib3J0ICgpOwotICBpZiAoaHRhYi0+ZGVsX2YpCi0gICAgKCpodGFiLT5kZWxfZikgKCpzbG90KTsKLSAgKnNsb3QgPSBERUxFVEVEX0VOVFJZOwotICBodGFiLT5uX2RlbGV0ZWQrKzsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBzY2FucyBvdmVyIHRoZSBlbnRpcmUgaGFzaCB0YWJsZSBjYWxsaW5nCi0gICBDQUxMQkFDSyBmb3IgZWFjaCBsaXZlIGVudHJ5LiAgSWYgQ0FMTEJBQ0sgcmV0dXJucyBmYWxzZSwKLSAgIHRoZSBpdGVyYXRpb24gc3RvcHMuICBJTkZPIGlzIHBhc3NlZCBhcyBDQUxMQkFDSydzIHNlY29uZAotICAgYXJndW1lbnQuICAqLwotCi12b2lkCi1odGFiX3RyYXZlcnNlIChodGFiLCBjYWxsYmFjaywgaW5mbykKLSAgICAgaHRhYl90IGh0YWI7Ci0gICAgIGh0YWJfdHJhdiBjYWxsYmFjazsKLSAgICAgdm9pZCAqaW5mbzsKLXsKLSAgdm9pZCAqKnNsb3QsICoqbGltaXQ7Ci0gIHNsb3QgPSBodGFiLT5lbnRyaWVzOwotICBsaW1pdCA9IHNsb3QgKyBodGFiLT5zaXplOwotICBkbwotICAgIHsKLSAgICAgIHZvaWQgKnggPSAqc2xvdDsKLSAgICAgIGlmICh4ICE9IEVNUFRZX0VOVFJZICYmIHggIT0gREVMRVRFRF9FTlRSWSkKLQlpZiAoISgqY2FsbGJhY2spIChzbG90LCBpbmZvKSkKLQkgIGJyZWFrOwotICAgIH0KLSAgd2hpbGUgKCsrc2xvdCA8IGxpbWl0KTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZXR1cm5zIGN1cnJlbnQgc2l6ZSBvZiBnaXZlbiBoYXNoIHRhYmxlLiAqLwotCi1zaXplX3QKLWh0YWJfc2l6ZSAoaHRhYikKLSAgICAgaHRhYl90IGh0YWI7Ci17Ci0gIHJldHVybiBodGFiLT5zaXplOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHJldHVybnMgY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gZ2l2ZW4KLSAgIGhhc2ggdGFibGUuICovCi0KLXNpemVfdAotaHRhYl9lbGVtZW50cyAoaHRhYikKLSAgICAgaHRhYl90IGh0YWI7Ci17Ci0gIHJldHVybiBodGFiLT5uX2VsZW1lbnRzIC0gaHRhYi0+bl9kZWxldGVkOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHJldHVybnMgbnVtYmVyIG9mIHBlcmNlbnRzIG9mIGZpeGVkCi0gICBjb2xsaXNpb25zIGR1cmluZyBhbGwgd29yayB3aXRoIGdpdmVuIGhhc2ggdGFibGUuICovCi0KLWRvdWJsZQotaHRhYl9jb2xsaXNpb25zIChodGFiKQotICAgICBodGFiX3QgaHRhYjsKLXsKLSAgaW50IHNlYXJjaGVzOwotCi0gIHNlYXJjaGVzID0gaHRhYi0+c2VhcmNoZXM7Ci0gIGlmIChzZWFyY2hlcyA9PSAwKQotICAgIHJldHVybiAwLjA7Ci0gIHJldHVybiAoZG91YmxlKWh0YWItPmNvbGxpc2lvbnMgLyAoZG91YmxlKXNlYXJjaGVzOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2hleC5jIGIvbGliaWJlcnR5L2hleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTJlZWYwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9oZXguYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEhleCBjaGFyYWN0ZXIgbWFuaXB1bGF0aW9uIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLWNoYXIgX2hleF92YWx1ZVtfaGV4X2FycmF5X3NpemVdOwotCi12b2lkIGhleF9pbml0ICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgX2hleF9hcnJheV9zaXplOyBpKyspCi0gICAgX2hleF92YWx1ZVtpXSA9IF9oZXhfYmFkOwotICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLSAgICBfaGV4X3ZhbHVlWycwJyArIGldID0gaTsKLSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICBfaGV4X3ZhbHVlWydhJyArIGldID0gX2hleF92YWx1ZVsnQScgKyBpXSA9IDEwICsgaTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9pbmRleC5jIGIvbGliaWJlcnR5L2luZGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTAwZjUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2luZGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiBTdHViIGltcGxlbWVudGF0aW9uIG9mIChvYnNvbGV0ZSkgaW5kZXgoKS4gKi8KLQotZXh0ZXJuIGNoYXIgKiBzdHJjaHIoKTsKLQotY2hhciAqCi1pbmRleCAocywgYykKLSAgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIHJldHVybiBzdHJjaHIgKHMsIGMpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2luc3F1ZS5jIGIvbGliaWJlcnR5L2luc3F1ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzUwMTlmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9pbnNxdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIGluc3F1ZSgzQykgcm91dGluZXMKLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JaW5zcXVlLCByZW1xdWUgLS0gaW5zZXJ0LCByZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgcXVldWUKLQotU1lOT1BTSVMKLQlzdHJ1Y3QgcWVsZW0gewotCSAgc3RydWN0IHFlbGVtICpxX2Zvcnc7Ci0JICBzdHJ1Y3QgcWVsZW0gKnFfYmFjazsKLQkgIGNoYXIgcV9kYXRhW107Ci0JfTsKLQotCXZvaWQgaW5zcXVlIChzdHJ1Y3QgcWVsZW0gKmVsZW0sIHN0cnVjdCBxZWxlbSAqcHJlZCkKLQotCXZvaWQgcmVtcXVlIChzdHJ1Y3QgcWVsZW0gKmVsZW0pCi0KLURFU0NSSVBUSU9OCi0JUm91dGluZXMgdG8gbWFuaXB1bGF0ZSBxdWV1ZXMgYnVpbHQgZnJvbSBkb3VibHkgbGlua2VkIGxpc3RzLgotCVRoZSBpbnNxdWUgcm91dGluZSBpbnNlcnRzIEVMRU0gaW4gdGhlIHF1ZXVlIGltbWVkaWF0ZWx5IGFmdGVyCi0JUFJFRC4gIFRoZSByZW1xdWUgcm91dGluZSByZW1vdmVzIEVMRU0gZnJvbSBpdHMgY29udGFpbmluZyBxdWV1ZS4KLSovCi0KLQotc3RydWN0IHFlbGVtIHsKLSAgc3RydWN0IHFlbGVtICpxX2Zvcnc7Ci0gIHN0cnVjdCBxZWxlbSAqcV9iYWNrOwotfTsKLQotCi12b2lkCi1pbnNxdWUgKGVsZW0sIHByZWQpCi0gIHN0cnVjdCBxZWxlbSAqZWxlbTsKLSAgc3RydWN0IHFlbGVtICpwcmVkOwotewotICBlbGVtIC0+IHFfZm9ydyA9IHByZWQgLT4gcV9mb3J3OwotICBwcmVkIC0+IHFfZm9ydyAtPiBxX2JhY2sgPSBlbGVtOwotICBlbGVtIC0+IHFfYmFjayA9IHByZWQ7Ci0gIHByZWQgLT4gcV9mb3J3ID0gZWxlbTsKLX0KLQotCi12b2lkCi1yZW1xdWUgKGVsZW0pCi0gIHN0cnVjdCBxZWxlbSAqZWxlbTsKLXsKLSAgZWxlbSAtPiBxX2ZvcncgLT4gcV9iYWNrID0gZWxlbSAtPiBxX2JhY2s7Ci0gIGVsZW0gLT4gcV9iYWNrIC0+IHFfZm9ydyA9IGVsZW0gLT4gcV9mb3J3OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21ha2VmaWxlLnZtcyBiL2xpYmliZXJ0eS9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhN2RkNDUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGxpYmliZXJ0eSB1bmRlciBvcGVuVk1TL0FscGhhCi0jCi0jIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHByb2dpcy5kZQotIwotIwotCi1PQkpTPWJjb3B5Lm9iaixiY21wLm9iaixnZXRvcHQub2JqLG9ic3RhY2sub2JqLHhleGl0Lm9iaix4bWFsbG9jLm9iaixoZXgub2JqLFwKLSAgIGdldG9wdDEub2JqLGNwbHVzLWRlbS5vYmosc3RybmNhc2VjbXAub2JqLHN0cmNhc2VjbXAub2JqLHN0cmR1cC5vYmosXAotICAgY29uY2F0Lm9iaixnZXRydW50aW1lLm9iaixnZXRwYWdlc2l6ZS5vYmosYWxsb2NhLm9iaix4c3RyZXJyb3Iub2JqLFwKLSAgIHhtZW1kdXAub2JqLHhzdHJkdXAub2JqLHhhdGV4aXQub2JqLGNob29zZS10ZW1wLm9iaixmbm1hdGNoLm9iaixvYmphbGxvYy5vYmoKLQotaWZlcSAoJChDQyksZ2NjKQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkKLWVsc2UKLSMgYXNzdW1lIGRlYyBjCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKS9kZWZpbmU9KCJjb25zdD0iKS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYykKLWVuZGlmCi0KLWxpYmliZXJ0eS5vbGI6IGNvbmZpZy5oIGFsbG9jYS1jb25mLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJpYmVydHkgKi5vYmoKLQotY29uZmlnLmg6IGNvbmZpZy5oLXZtcwotCSQoQ1ApICQ8ICRACi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgY29uZmlnLmg7Ci0JJChSTSkgKi5vYmo7Ci0JJChSTSkgbGliaWJlcnR5Lm9sYjsKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jaHIuYyBiL2xpYmliZXJ0eS9tZW1jaHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlMzAwMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtY2hyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotRlVOQ1RJT04KLQk8PG1lbWNocj4+LS0tZmluZCBjaGFyYWN0ZXIgaW4gbWVtb3J5Ci0KLUlOREVYCi0JbWVtY2hyCi0KLUFOU0lfU1lOT1BTSVMKLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0Jdm9pZCAqbWVtY2hyKGNvbnN0IHZvaWQgKjxbc3JjXT4sIGludCA8W2NdPiwgc2l6ZV90IDxbbGVuZ3RoXT4pOwotCi1UUkFEX1NZTk9QU0lTCi0JI2luY2x1ZGUgPHN0cmluZy5oPgotCXZvaWQgKm1lbWNocig8W3NyY10+LCA8W2NdPiwgPFtsZW5ndGhdPikKLQl2b2lkICo8W3NyY10+OwotCXZvaWQgKjxbY10+OwotCXNpemVfdCA8W2xlbmd0aF0+OwotCi1ERVNDUklQVElPTgotCVRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgbWVtb3J5IHN0YXJ0aW5nIGF0IDw8Kjxbc3JjXT4+PiBmb3IgdGhlCi0JY2hhcmFjdGVyIDxbY10+LiAgVGhlIHNlYXJjaCBvbmx5IGVuZHMgd2l0aCB0aGUgZmlyc3QKLQlvY2N1cnJlbmNlIG9mIDxbY10+LCBvciBhZnRlciA8W2xlbmd0aF0+IGNoYXJhY3RlcnM7IGluCi0JcGFydGljdWxhciwgPDxOVUxMPj4gZG9lcyBub3QgdGVybWluYXRlIHRoZSBzZWFyY2guCi0KLVJFVFVSTlMKLQlJZiB0aGUgY2hhcmFjdGVyIDxbY10+IGlzIGZvdW5kIHdpdGhpbiA8W2xlbmd0aF0+IGNoYXJhY3RlcnMKLQlvZiA8PCo8W3NyY10+Pj4sIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGlzIHJldHVybmVkLiBJZgotCTxbY10+IGlzIG5vdCBmb3VuZCwgdGhlbiA8PE5VTEw+PiBpcyByZXR1cm5lZC4gCQotCi1QT1JUQUJJTElUWQotPDxtZW1jaHI+PiAgcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KLQotUVVJQ0tSRUYKLQltZW1jaHIgYW5zaSBwdXJlCi0KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLVBUUgotbWVtY2hyIChzcmNfdm9pZCwgYywgbGVuZ3RoKQotICAgICByZWdpc3RlciBjb25zdCBQVFIgc3JjX3ZvaWQ7Ci0gICAgIGludCBjOwotICAgICBzaXplX3QgbGVuZ3RoOwotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyY192b2lkOwotICAKLSAgd2hpbGUgKC0tbGVuZ3RoID49IDApCi0gIHsKLSAgICBpZiAoKnNyYyA9PSBjKQotICAgICByZXR1cm4gKFBUUilzcmM7Ci0gICAgc3JjKys7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtY21wLmMgYi9saWJpYmVydHkvbWVtY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2FlMGMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21lbWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogbWVtY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JbWVtY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zCi0KLVNZTk9QU0lTCi0JaW50IG1lbWNtcCAoY29uc3Qgdm9pZCAqZnJvbSwgY29uc3Qgdm9pZCAqdG8sIHNpemVfdCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQlDb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucyBhbmQgcmV0dXJuIGxlc3MgdGhhbiwKLQllcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8sIGFjY29yZGluZyB0byBsZXhpY29ncmFwaGljYWwKLQlvcmRlcmluZyBvZiB0aGUgY29tcGFyZWQgcmVnaW9ucy4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLWludAotREVGVU4obWVtY21wLCAoc3RyMSwgc3RyMiwgY291bnQpLAotICAgICAgY29uc3QgUFRSIHN0cjEgQU5EIGNvbnN0IFBUUiBzdHIyIEFORCBzaXplX3QgY291bnQpCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnMxID0gKHVuc2lnbmVkIGNoYXIqKXN0cjE7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnMyID0gKHVuc2lnbmVkIGNoYXIqKXN0cjI7Ci0KLSAgd2hpbGUgKGNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgIGlmICgqczErKyAhPSAqczIrKykKLQkgIHJldHVybiBzMVstMV0gPCBzMlstMV0gPyAtMSA6IDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbWNweS5jIGIvbGliaWJlcnR5L21lbWNweS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDdhOWY1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1jcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIG1lbWNweSAodGhlIHN0YW5kYXJkIEMgZnVuY3Rpb24pCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQltZW1jcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdGFyeSBsZW5ndGgKLQotU1lOT1BTSVMKLQl2b2lkKiBtZW1jcHkgKHZvaWQgKm91dCwgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBuKTsKLQotREVTQ1JJUFRJT04KLQlDb3B5IExFTkdUSCBieXRlcyBmcm9tIG1lbW9yeSByZWdpb24gcG9pbnRlZCB0byBieSBJTiB0byBtZW1vcnkKLQlyZWdpb24gcG9pbnRlZCB0byBieSBPVVQuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLURFRlVOKG1lbWNweSwgKG91dCwgaW4sIGxlbmd0aCksIFBUUiBvdXQgQU5EIGNvbnN0IFBUUiBpbiBBTkQgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBiY29weShpbiwgb3V0LCBsZW5ndGgpOwotICAgIHJldHVybiBvdXQ7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtbW92ZS5jIGIvbGliaWJlcnR5L21lbW1vdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YzMyNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtbW92ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogV3JhcHBlciB0byBpbXBsZW1lbnQgQU5TSSBDJ3MgbWVtbW92ZSB1c2luZyBCU0QncyBiY29weS4gKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLVBlciBCb3RobmVyLiAqLwotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotUFRSCi1tZW1tb3ZlIChzMSwgczIsIG4pCi0gICAgIFBUUiBzMTsKLSAgICAgY29uc3QgUFRSIHMyOwotICAgICBzaXplX3QgbjsKLXsKLSAgYmNvcHkgKHMyLCBzMSwgbik7Ci0gIHJldHVybiBzMTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1zZXQuYyBiL2xpYmliZXJ0eS9tZW1zZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1NDgzMS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBtZW1zZXQKLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLURFRlVOKG1lbXNldCwgKGRlc3QsIHZhbCwgbGVuKSwKLSAgICAgIFBUUiBkZXN0IEFORCByZWdpc3RlciBpbnQgdmFsIEFORCByZWdpc3RlciBzaXplX3QgbGVuKQotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciopZGVzdDsKLSAgd2hpbGUgKGxlbi0tID4gMCkKLSAgICAqcHRyKysgPSB2YWw7Ci0gIHJldHVybiBkZXN0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21rc3RlbXBzLmMgYi9saWJpYmVydHkvbWtzdGVtcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjMTZhMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWtzdGVtcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIG1rc3RlbXAuYyBmcm9tIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFdlIG5lZWQgdG8gcHJvdmlkZSBhIHR5cGUgZm9yIGdjY191aW50NjRfdC4gICovCi0jaWZkZWYgX19HTlVDX18KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGdjY191aW50NjRfdDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZ2NjX3VpbnQ2NF90OwotI2VuZGlmCi0KLSNpZm5kZWYgVE1QX01BWAotI2RlZmluZSBUTVBfTUFYIDE2Mzg0Ci0jZW5kaWYKLQotLyogR2VuZXJhdGUgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmcm9tIFRFTVBMQVRFLgotCi0gICBURU1QTEFURSBoYXMgdGhlIGZvcm06Ci0KLSAgIDxwYXRoPi9jY1hYWFhYWDxzdWZmaXg+Ci0KLSAgIFNVRkZJWF9MRU4gdGVsbHMgdXMgaG93IGxvbmcgPHN1ZmZpeD4gaXMgKGl0IGNhbiBiZSB6ZXJvIGxlbmd0aCkuCi0KLSAgIFRoZSBsYXN0IHNpeCBjaGFyYWN0ZXJzIG9mIFRFTVBMQVRFIGJlZm9yZSA8c3VmZml4PiBtdXN0IGJlICJYWFhYWFgiOwotICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBmaWxlbmFtZSB1bmlxdWUuCi0KLSAgIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igb3BlbiBvbiB0aGUgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gICovCi1pbnQKLW1rc3RlbXBzICh0ZW1wbGF0ZSwgc3VmZml4X2xlbikKLSAgICAgY2hhciAqdGVtcGxhdGU7Ci0gICAgIGludCBzdWZmaXhfbGVuOwotewotICBzdGF0aWMgY29uc3QgY2hhciBsZXR0ZXJzW10KLSAgICA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSI7Ci0gIHN0YXRpYyBnY2NfdWludDY0X3QgdmFsdWU7Ci0jaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLSAgc3RydWN0IHRpbWV2YWwgdHY7Ci0jZW5kaWYKLSAgY2hhciAqWFhYWFhYOwotICBzaXplX3QgbGVuOwotICBpbnQgY291bnQ7Ci0KLSAgbGVuID0gc3RybGVuICh0ZW1wbGF0ZSk7Ci0KLSAgaWYgKChpbnQpIGxlbiA8IDYgKyBzdWZmaXhfbGVuCi0gICAgICB8fCBzdHJuY21wICgmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dLCAiWFhYWFhYIiwgNikpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBYWFhYWFggPSAmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dOwotCi0jaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLSAgLyogR2V0IHNvbWUgbW9yZSBvciBsZXNzIHJhbmRvbSBkYXRhLiAgKi8KLSAgZ2V0dGltZW9mZGF5ICgmdHYsIE5VTEwpOwotICB2YWx1ZSArPSAoKGdjY191aW50NjRfdCkgdHYudHZfdXNlYyA8PCAxNikgXiB0di50dl9zZWMgXiBnZXRwaWQgKCk7Ci0jZWxzZQotICB2YWx1ZSArPSBnZXRwaWQgKCk7Ci0jZW5kaWYKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBUTVBfTUFYOyArK2NvdW50KQotICAgIHsKLSAgICAgIGdjY191aW50NjRfdCB2ID0gdmFsdWU7Ci0gICAgICBpbnQgZmQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIHJhbmRvbSBiaXRzLiAgKi8KLSAgICAgIFhYWFhYWFswXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbMV0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzJdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFszXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbNF0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzVdID0gbGV0dGVyc1t2ICUgNjJdOwotCi0gICAgICBmZCA9IG9wZW4gKHRlbXBsYXRlLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wsIDA2MDApOwotICAgICAgaWYgKGZkID49IDApCi0JLyogVGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuICAqLwotCXJldHVybiBmZDsKLQotICAgICAgLyogVGhpcyBpcyBhIHJhbmRvbSB2YWx1ZS4gIEl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdGhlIG5leHQKLQkgVE1QX01BWCB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGFkZGluZyA3Nzc3IHRvIFZBTFVFIGFyZSBkaWZmZXJlbnQKLQkgd2l0aCAobW9kdWxlIDJeMzIpLiAgKi8KLSAgICAgIHZhbHVlICs9IDc3Nzc7Ci0gICAgfQotCi0gIC8qIFdlIHJldHVybiB0aGUgbnVsbCBzdHJpbmcgaWYgd2UgY2FuJ3QgZmluZCBhIHVuaXF1ZSBmaWxlIG5hbWUuICAqLwotICB0ZW1wbGF0ZVswXSA9ICdcMCc7Ci0gIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tcHctY29uZmlnLmluIGIvbGliaWJlcnR5L21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjE4MDIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTVBXIGNvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIGxpYmliZXJ0eS4KLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCi0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21wdy1tYWtlLnNlZCBiL2xpYmliZXJ0eS9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMmE1ZTcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyBsaWJpYmVydHkncyBVbml4IG1ha2VmaWxlIHRvIE1QVyBzeW50YXguCi0KLSMgQ29tbWVudCBvdXQgYSB1c2VsZXNzIHRoaW5nLgotL15cLmFsd2F5c1wuL3MvXi8jLwotCi0jIFJlcGxhY2UgdGhlIGF1dG8tZ2VuZXJhdGVkIGxpc3Qgd2l0aCB0aGUgbGlzdCBvZiB3aGF0IHdlIGtub3cgd2UgbmVlZC4KLXMvYGNhdCBuZWVkZWQtbGlzdGAvIntvfSJhbGxvY2EuYy5vICJ7b30iYmNvcHkuYy5vICJ7b30iZ2V0cGFnZXNpemUuYy5vICJ7b30iaW5zcXVlLmMubyAie299Im1wdy5jLm8gIntvfSJzdHJjYXNlY21wLmMubyAie299InN0cmR1cC5jLm8gIntvfSJzdHJuY2FzZWNtcC5jLm8vCi0KLSMgUGFzdGUgaW4gc29tZSBkZXNpcmFibGUgZGVmaW5pdGlvbnMuCi0jIFRoZSBkZWZhdWx0IHJ1bGUgaGVyZSBjb21wbGV0ZWx5IHJlcGxhY2VzIHRoZSB0cmlja3kgc3R1ZmYgaW4gdGhlIFVuaXgKLSMgTWFrZWZpbGUuaW4uCi0vXiMjIyQvYVwKLVwKLUhERUZJTkVTID0gLWQgTkVFRF9zeXNfc2lnbGlzdCAtZCBORUVEX3N5c19lcnJsaXN0IC1kIE5FRURfYmFzZW5hbWUgLWQgTkVFRF9zdHJjYXNlY21wIC1kIE5FRURfc3RybmNhc2VjbXBcCi1JTkNMVURFUyA9IC1pIDogLWkge0lOQ0RJUn06IC1pIHtJTkNESVJ9Om1wdzogLWkgOjpleHRyYS1pbmNsdWRlOiAtaSAie3N9IlwKLVwKLS5jLm8gXFxPcHRpb24tZiAuY1wKLQl7Q0N9IEBEQVNIX0NfRkxBR0Age0RlcERpcn17RGVmYXVsdH0uYyB7TElCQ0ZMQUdTfSB7SU5DTFVERVN9IHtIREVGSU5FU30gQFNFR01FTlRfRkxBRyh7RGVmYXVsdH0pQCAtbyB7VGFyZ0Rpcn17RGVmYXVsdH0uYy5vXAotCi0jIFJlbW92ZSBkZXBlbmRlbmN5IG9uIG5lZWRlZC1saXN0LCB3aGljaCB3ZSBkb24ndCB1c2UuCi0vRE9fQUxTTyA9L3MvbmVlZGVkLWxpc3QvLwotCi0vSU5DRElSPS9zLyJ7c3JjZGlyfSJ7TVVMVElTUkNUT1B9OjovInt0b3BzcmNkaXJ9Ii8KLQotIyBXaGFjayBvdXQgdGhlIENPTVBJTEUuYyB0cmlja2luZXNzLgotL15DT01QSUxFLmMgLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgbXVsdGlkbyB0cmlja2luZXNzIGZyb20gdGhlICJhbGwiIHRhcmdldC4KLS9eYWxsIFxcT3B0aW9uLWYvLC9eJC9jXAotYWxsIFxcT3B0aW9uLWYge1RBUkdFVExJQn1cCi0KLQotIyBSZW1vdmUgdGhlIFJVTEUxL1JVTEUyIGNydWQuCi0vaWYgXFsvLC9maS9kCi0vXlJVTEUxID0vLC9SVUxFMiA9L2QKLS9SVUxFMi9zL1JVTEUyL1RBUkdFVExJQi8KLQotIyBEb24ndCB3YW50IGZkbWF0Y2ggZXZlci4KLXMvICJ7b30iZmRtYXRjaC5jLm8vLwotCi0jIEZpeCBwYXRocyB0byBnZW5lcmF0ZWQgZmlsZXMuCi0vY29uZmlnLmgvcy8ie3N9ImNvbmZpZy5oLyJ7b30iY29uZmlnLmgvCi0KLSMgV2hhY2sgb3V0IGNvbmZpZyByZWJ1aWxkIHJ1bGVzLgotL14ie299ImNvbmZpZy5oIFxcT3B0aW9uLWYvLC9eJC9kCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXB3LmMgYi9saWJpYmVydHkvbXB3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhM2FlNDEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi0vKiBNUFctVW5peCBjb21wYXRpYmlsaXR5IGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgdW5kZXIgTVBXLiAqLwotCi0jaW5jbHVkZSAibXB3LmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPFR5cGVzLmg+Ci0jaW5jbHVkZSA8RmlsZXMuaD4KLQotI2luY2x1ZGUgPFRpbWVyLmg+Ci0KLS8qIEluaXRpYWxpemUgdG8gMCBhdCBmaXJzdCwgdGhlbiBzZXQgdG8gZXJybm9fbWF4KCkgbGF0ZXIuICAqLwotCi1pbnQgc3lzX25lcnIgPSAwOwotCi0vKiBEZWJ1ZyBmbGFnIGZvciBwYXRobmFtZSBoYWNraW5nLiAgU2V0IHRoaXMgdG8gb25lIGFuZCByZWJ1aWxkLiAqLwotCi1pbnQgRGVidWdQSSA9IC0xOwotCi12b2lkCi1tcHdpZnlfZmlsZW5hbWUoY2hhciAqdW5peG5hbWUsIGNoYXIgKm1hY25hbWUpCi17Ci0gIGludCBpLCBqOwotCi0gIC8qIChzaG91bGQgdHJ1bmNhdGUgMjU1IGNoYXJzIGZyb20gZW5kIG9mIG5hbWUsIG5vdCBiZWdpbm5pbmcpICovCi0gIGlmIChzdHJsZW4gKHVuaXhuYW1lKSA+IDI1NSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJQYXRobmFtZSBcIiVzXCIgaXMgdG9vIGxvbmcgZm9yIE1hY3MsIHRydW5jYXRpbmdcbiIsCi0JICAgICAgIHVuaXhuYW1lKTsKLSAgICB9Ci0gIGogPSAwOwotICAvKiBJZiB5b3UncmUgZ29pbmcgdG8gZW5kIHVwIHdpdGggb25lIG9yIG1vcmUgY29sb25zIGluIHRoZSBtaWRkbGUgb2YgYQotICAgICBwYXRoIGFmdGVyIGFuIGFsbC1Vbml4IHJlbGF0aXZlIHBhdGggaXMgdHJhbnNsYXRlZCwgeW91IG11c3QgYWRkIGEKLSAgICAgY29sb24gb24gdGhlIGZyb250LCBzbyB0aGF0IHRoZSBmaXJzdCBjb21wb25lbnQgaXMgbm90IHRob3VnaHQgdG8gYmUKLSAgICAgYSBkaXNrIG5hbWUuICAqLwotICBpZiAodW5peG5hbWVbMF0gIT0gJy8nICYmICEgc3RyY2hyICh1bml4bmFtZSwgJzonKSAmJiBzdHJjaHIgKHVuaXhuYW1lLCAnLycpKQotICAgIHsKLSAgICAgIG1hY25hbWVbaisrXSA9ICc6JzsKLSAgICB9Ci0gIGZvciAoaSA9IDA7IHVuaXhuYW1lW2ldICE9ICdcMCcgJiYgaSA8IDI1NTsgKytpKQotICAgIHsKLSAgICAgIGlmIChpID09IDAgJiYgdW5peG5hbWVbaV0gPT0gJy8nKQotCXsKLQkgIGlmIChzdHJuY21wICh1bml4bmFtZSwgIi90bXAvIiwgNSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEEgdGVtcG9yYXJ5IG5hbWUsIG1ha2UgYSBtb3JlIE1hYy1mbGF2b3JlZCB0bXBuYW1lLiAqLwotCSAgICAgIC8qIEEgYmV0dGVyIGNob2ljZSB3b3VsZCBiZSB7Qm9vdH1UcmFzaDpmb28sIGJ1dAotCQkgdGhhdCB3b3VsZCByZXF1aXJlIGJlaW5nIGFibGUgdG8gaWRlbnRpZnkgdGhlCi0JCSBib290IGRpc2sncyBhbmQgdHJhc2hjYW4ncyBuYW1lLiAgQW5vdGhlciBvcHRpb24KLQkJIHdvdWxkIGJlIHRvIGhhdmUgYW4gZW52IHZhciwgc28gdXNlciBjYW4gcG9pbnQgaXQKLQkJIGF0IGEgcmFtZGlzay4gKi8KLQkgICAgICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ3QnOwotCSAgICAgIG1hY25hbWVbaisrXSA9ICdtJzsKLQkgICAgICBtYWNuYW1lW2orK10gPSAncCc7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ18nOwotCSAgICAgIGkgKz0gNDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRG9uJ3QgY29weSB0aGUgbGVhZGluZyBzbGFzaC4gKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICc6JyAmJiB1bml4bmFtZVtpKzFdID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICBpICs9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJy4nICYmIHVuaXhuYW1lW2krMV0gPT0gJy8nKQotCXsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgIGkgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICh1bml4bmFtZVtpXSA9PSAnLicgJiYgdW5peG5hbWVbaSsxXSA9PSAnLicgJiYgdW5peG5hbWVbaSsyXSA9PSAnLycpCi0JewotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgaSArPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1hY25hbWVbaisrXSA9IHVuaXhuYW1lW2ldOwotCX0KLSAgICB9Ci0gIG1hY25hbWVbal0gPSAnXDAnOwotICAvKiBBbGxvdyBmb3IgZ2V0dGluZyB0aGUgZGVidWcgZmxhZyBmcm9tIGFuIGVudiB2YXI7IHF1aXRlIHVzZWZ1bC4gKi8KLSAgaWYgKERlYnVnUEkgPCAwKQotICAgIERlYnVnUEkgPSAoKihnZXRlbnYgKCJERUJVR19QQVRITkFNRVMiKSkgPT0gJzEnID8gMSA6IDApOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIE1hZGUgXCIlc1wiXG4iLCB1bml4bmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIGludG8gXCIlc1wiXG4iLCBtYWNuYW1lKTsKLSAgICB9Ci19Ci0KLS8qIE1QVy1mbGF2b3JlZCBiYXNlbmFtZSBmaW5kZXIuICovCi0KLWNoYXIgKgotbXB3X2Jhc2VuYW1lIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICBjaGFyICpiYXNlID0gbmFtZTsKLQotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lKysgPT0gJzonKQotCXsKLQkgIGJhc2UgPSBuYW1lOwotCX0KLSAgICB9Ci0gIHJldHVybiBiYXNlOwotfQotCi0vKiBNaXhlZCBNUFcvVW5peCBiYXNlbmFtZSBmaW5kZXIuICBUaGlzIGNhbiBiZSBsZWQgYXN0cmF5IGJ5Ci0gICBmaWxlbmFtZXMgd2l0aCBzbGFzaGVzIGluIHRoZW0gYW5kIGNvbWUgdXAgd2l0aCBhIGJhc2VuYW1lIHRoYXQKLSAgIGVpdGhlciBjb3JyZXNwb25kcyB0byBubyBmaWxlIG9yICh3b3JzZSkgdG8gc29tZSBvdGhlciBmaWxlLCBzbwotICAgc2hvdWxkIG9ubHkgYmUgdHJpZWQgaWYgb3RoZXIgbWV0aG9kcyBvZiBmaW5kaW5nIGEgZmlsZSB2aWEgYQotICAgYmFzZW5hbWUgaGF2ZSBmYWlsZWQuICAqLwotCi1jaGFyICoKLW1wd19taXhlZF9iYXNlbmFtZSAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqYmFzZSA9IG5hbWU7Ci0KLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSA9PSAnLycgfHwgKm5hbWUgPT0gJzonKQotCXsKLQkgIGJhc2UgPSBuYW1lICsgMTsKLQl9Ci0gICAgICArK25hbWU7Ci0gICAgfQotICByZXR1cm4gYmFzZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBmb3BlbigpIG1vZGlmaWVkIHRvIGNyZWF0ZSBmaWxlcyB0aGF0IGFyZSB0eXBlIFRFWFQKLSAgIG9yICdCSU4gJywgYW5kIGFsd2F5cyBvZiB0eXBlICdNUFMgJy4gICovCi0KLUZJTEUgKgotbXB3X2ZvcGVuIChjaGFyICpuYW1lLCBjaGFyICptb2RlKQotewotI3VuZGVmIGZvcGVuCi0gIGludCBlcnJudW07Ci0gIEZJTEUgKmZwOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKG5hbWUsIHRtcG5hbWUpOwotICBQUk9HUkVTUyAoMSk7Ci0gIGZwID0gZm9wZW4gKHRtcG5hbWUsIG1vZGUpOwotICBlcnJudW0gPSBlcnJubzsKLQotICAvKiBJZiB3cml0aW5nLCBuZWVkIHRvIHNldCB0eXBlIGFuZCBjcmVhdG9yIHVzZWZ1bGx5LiAqLwotICBpZiAoc3RyY2hyIChtb2RlLCAndycpKQotICAgIHsKLSAgICAgIGNoYXIgKnBuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKHRtcG5hbWUpICsgMik7Ci0gICAgICBPU0VyciBlOwotICAgICAgc3RydWN0IEZJbmZvIGZpOwotCi0gICAgICBwbmFtZVswXSA9IHN0cmxlbiAodG1wbmFtZSk7Ci0gICAgICBzdHJjcHkgKHBuYW1lKzEsIHRtcG5hbWUpOwotCQotICAgICAgZSA9IEdldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7Ci0gICAgICAvKiBzaG91bGQgZG8gc3BpZmZpZXIgZXJyb3IgaGFuZGxpbmcgKi8KLSAgICAgIGlmIChlICE9IDApCi0JZnByaW50ZihzdGRlcnIsICJHZXRGSW5mbyByZXR1cm5zICVkXG4iLCBlKTsKLSAgICAgIGlmIChzdHJjaHIgKG1vZGUsICdiJykpCi0JewotCSAgZmkuZmRUeXBlID0gKE9TVHlwZSkgJ0JJTiAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaS5mZFR5cGUgPSAoT1NUeXBlKSAnVEVYVCc7Ci0JfQotICAgICAgZmkuZmRDcmVhdG9yID0gKE9TVHlwZSkgJ01QUyAnOwotICAgICAgZSA9IFNldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7Ci0gICAgICBpZiAoZSAhPSAwKQotCWZwcmludGYoc3RkZXJyLCAiU2V0RkluZm8gcmV0dXJucyAlZFxuIiwgZSk7Ci0gICAgICBmcmVlIChwbmFtZSk7Ci0gICAgfQotICBpZiAoZnAgPT0gTlVMTCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIGZwOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBmc2VlaygpIG1vZGlmaWVkIHRvIGZpbGwgdGhlIGZpbGUgd2l0aCB6ZXJvcwotICAgaWYgc2Vla2luZyBwYXN0IHRoZSBlbmQgb2YgaXQuICAqLwotCi0jZGVmaW5lIFpFUk9CTEtTSVpFIDQwOTYKLQotY2hhciB6ZXJvc1taRVJPQkxLU0laRV07Ci0KLWludAotbXB3X2ZzZWVrIChGSUxFICpmcCwgaW50IG9mZnNldCwgaW50IHdoZW5jZSkKLXsKLSN1bmRlZiBmc2VlawotICBpbnQgY3Vyc2l6ZSwgbnVtbGVmdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIGlmICh3aGVuY2UgPT0gU0VFS19TRVQpCi0gICAgewotICAgICAgZnNlZWsgKGZwLCAwLCBTRUVLX0VORCk7Ci0gICAgICBjdXJzaXplID0gZnRlbGwgKGZwKTsKLSAgICAgIGlmIChvZmZzZXQgPiBjdXJzaXplKQotCXsKLQkgIG51bWxlZnQgPSBvZmZzZXQgLSBjdXJzaXplOwotCSAgd2hpbGUgKG51bWxlZnQgPiBaRVJPQkxLU0laRSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbWlnaHQgZmFpbCwgc2hvdWxkIGNoZWNrIGZvciB0aGF0LiAqLwotCSAgICAgIFBST0dSRVNTICgxKTsKLQkgICAgICBmd3JpdGUgKHplcm9zLCAxLCBaRVJPQkxLU0laRSwgZnApOwotCSAgICAgIG51bWxlZnQgLT0gWkVST0JMS1NJWkU7Ci0JICAgIH0KLQkgIFBST0dSRVNTICgxKTsKLQkgIGZ3cml0ZSAoemVyb3MsIDEsIG51bWxlZnQsIGZwKTsKLQkgIGZmbHVzaCAoZnApOwotCX0KLSAgICB9Ci0gIHJldHVybiBmc2VlayAoZnAsIG9mZnNldCwgd2hlbmNlKTsKLX0KLQotaW50Ci1tcHdfZnJlYWQgKGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBuaXRlbXMsIEZJTEUgKnN0cmVhbSkKLXsKLSN1bmRlZiBmcmVhZAotICBpbnQgcnNsdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBmcmVhZCAocHRyLCBzaXplLCBuaXRlbXMsIHN0cmVhbSk7Ci0gIFBST0dSRVNTICgxKTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLWludAotbXB3X2Z3cml0ZSAoY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG5pdGVtcywgRklMRSAqc3RyZWFtKQotewotI3VuZGVmIGZ3cml0ZQotICBpbnQgcnNsdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBmd3JpdGUgKHB0ciwgc2l6ZSwgbml0ZW1zLCBzdHJlYW0pOwotICBQUk9HUkVTUyAoMSk7Ci0gIHJldHVybiByc2x0OwotfQotCi1pbnQKLWxpbmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAibGluayBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLX0KLQotaW50Ci1mb3JrICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci19Ci0KLWludAotdmZvcmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAidmZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi1pbnQKLXBpcGUgKGludCAqZmQpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgInBpcGUgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLWV4ZWN2cCAoY2hhciAqZmlsZSwgY2hhciAqKmFyZ3YpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4ZWN2cCBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWludAotZXhlY3YgKGNoYXIgKnBhdGgsIGNoYXIgKiphcmd2KQotewotICBmcHJpbnRmIChzdGRlcnIsICJleGVjdiBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0jZW5kaWYKLQotaW50Ci1raWxsIChpbnQgcGlkLCBpbnQgc2lnKQotewotICBmcHJpbnRmIChzdGRlcnIsICJraWxsIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLQotaW50Ci13YWl0IChpbnQgKnN0YXR1cykKLXsKLSAgKnN0YXR1cyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLXNsZWVwIChpbnQgc2Vjb25kcykKLXsKLSAgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lLCBub3c7Ci0KLSAgdGltZSAoJnN0YXJ0X3RpbWUpOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgIHRpbWUgKCZub3cpOwotICAgICAgaWYgKG5vdyA+IHN0YXJ0X3RpbWUgKyBzZWNvbmRzKQotCXJldHVybiAwOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkCi1wdXRlbnYgKGNoYXIgKnN0cikKLXsKLSAgLyogVGhlIEdDQyBkcml2ZXIgY2FsbHMgdGhpcyB0byBkbyB0aGluZ3MgZm9yIGNvbGxlY3QyLCBidXQgd2UKLSAgICAgZG9uJ3QgY2FyZSBhYm91dCBjb2xsZWN0Mi4gKi8KLX0KLQotaW50Ci1jaG1vZCAoY2hhciAqcGF0aCwgaW50IG1vZGUpCi17Ci0gIC8qIFByZXRlbmQgaXQgd2FzIGFsbCBPSy4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotZ2V0dWlkICgpCi17Ci0gIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotZ2V0Z2lkICgpCi17Ci0gIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogSW5zdGVhZCBvZiBjb3JlZHVtcGluZywgd2hpY2ggaXMgbm90IGEgbm9ybWFsIE1hYyBmYWNpbGl0eSwgd2UKLSAgIGRyb3AgaW50byBNYWNzYnVnLiAgSWYgd2UgdGhlbiAiZyIgZnJvbSBNYWNzYnVnLCB0aGUgcHJvZ3JhbSB3aWxsCi0gICBleGl0IGNsZWFubHkuICovCi0KLXZvaWQKLW1wd19hYm9ydCAoKQotewotICAvKiBNYWtlIHN1cmUgbm8gb3V0cHV0IHN0aWxsIGJ1ZmZlcmVkIHVwLCB0aGVuIHphcCBpbnRvIE1hY3NCdWcuICovCi0gIGZmbHVzaChzdGRvdXQpOwotICBmZmx1c2goc3RkZXJyKTsKLSAgcHJpbnRmKCIjIyBBYm9ydCEgIyNcbiIpOwotI2lmZGVmIE1QV19TQURFCi0gIFN5c0Vycm9yKDgwMDUpOwotI2Vsc2UgCi0gIERlYnVnZ2VyKCk7Ci0jZW5kaWYKLSAgLyogImciIGluIE1hY3NCdWcgd2lsbCB0aGVuIGNhdXNlIGEgcmVndWxhciBlcnJvciBleGl0LiAqLwotICBleGl0ICgxKTsKLX0KLQotLyogSW1pdGF0aW9uIGdldHJ1c2FnZSBiYXNlZCBvbiB0aGUgQU5TSSBjbG9jaygpIGZ1bmN0aW9uLiAqLwotCi1pbnQKLWdldHJ1c2FnZSAoaW50IHdobywgc3RydWN0IHJ1c2FnZSAqcnVzYWdlKQotewotICBpbnQgY2xrID0gY2xvY2sgKCk7Ci0KLSNpZiAwCi0gIHJ1c2FnZS0+cnVfdXRpbWUudHZfc2VjID0gY2xrIC8gQ0xPQ0tTX1BFUl9TRUM7Ci0gIHJ1c2FnZS0+cnVfdXRpbWUudHZfdXNlYyA9ICgoY2xrICogMTAwMCkgLyBDTE9DS1NfUEVSX1NFQykgKiAxMDAwOwotICBydXNhZ2UtPnJ1X3N0aW1lLnR2X3NlYyA9IDA7Ci0gIHJ1c2FnZS0+cnVfc3RpbWUudHZfdXNlYyA9IDA7Ci0jZW5kaWYKLX0KLQotaW50Ci1zYnJrICgpCi17Ci0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLWlzYXR0eSAoaW50IGZkKQotewotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSBUaW1vdGh5IE11cnJheSdzIFBvc2l4IGxpYnJhcnkuICovCi0KLSNpbmNsdWRlICJ1dGltZS5oIgotCi1pbnQKLXV0aW1lIChjaGFyICpmaWxlbmFtZSwgc3RydWN0IHV0aW1idWYgKnRpbWVzKQotewotICBDSW5mb1BCUmVjIGNpcGJyOwotICBIRmlsZUluZm8gKmZwYiA9IChIRmlsZUluZm8gKikgJmNpcGJyOwotICBEaXJJbmZvICpkcGIgPSAoRGlySW5mbyAqKSAmY2lwYnI7Ci0gIHVuc2lnbmVkIGNoYXIgcG5hbWVbMjU2XTsKLSAgc2hvcnQgZXJyOwotICAKLSAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgZmlsZW5hbWUpOwotICBjMnBzdHIgKHBuYW1lKTsKLQotICBkcGItPmlvRHJEaXJJRCA9IDBMOwotICBmcGItPmlvTmFtZVB0ciA9IHBuYW1lOwotICBmcGItPmlvVlJlZk51bSA9IDA7Ci0gIGZwYi0+aW9GRGlySW5kZXggPSAwOwotICBmcGItPmlvRlZlcnNOdW0gPSAwOwotICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBlcnJubyA9IEVOT0VOVDsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgZHBiLT5pb0RyRGlySUQgPSAwTDsKLSAgZnBiLT5pb0ZsTWREYXQgPSB0aW1lcy0+bW9kdGltZTsKLSAgZnBiLT5pb0ZsQ3JEYXQgPSB0aW1lcy0+YWN0aW1lOwotICBlcnIgPSBQQlNldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBlcnJubyA9IEVBQ0NFUzsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotbWtkaXIgKGNoYXIgKnBhdGgsIGludCBtb2RlKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuIC0xOwotfQotCi1pbnQKLXJtZGlyICgpCi17Ci0gIGVycm5vID0gRU5PU1lTOwotICByZXR1cm4gLTE7Ci19Ci0jZW5kaWYKLQotY2hvd24gKCkKLXsKLSAgZXJybm8gPSBFTk9TWVM7Ci0gIHJldHVybiAtMTsKLX0KLQotY2hhciAqbXllbnZpcm9uW10gPSB7TlVMTH07Ci0KLWNoYXIgKiplbnZpcm9uID0gbXllbnZpcm9uOwotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi0KLS8qIE1pbmltYWwgJ3N0YXQnIGVtdWxhdGlvbjogdGVsbHMgZGlyZWN0b3JpZXMgZnJvbSBmaWxlcyBhbmQKLSAgIGdpdmVzIGxlbmd0aCBhbmQgbXRpbWUuCi0KLSAgIERlcml2ZWQgZnJvbSBjb2RlIHdyaXR0ZW4gYnkgR3VpZG8gdmFuIFJvc3N1bSwgQ1dJLCBBbXN0ZXJkYW0KLSAgIGFuZCBwbGFjZWQgYnkgaGltIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotZXh0ZXJuIGludCBfX3VpZCwgX19naWQ7Ci0KLWludCBfX3VpZCA9IDA7Ci1pbnQgX19naWQgPSAwOwotCi0vKiBCaXRzIGluIGlvRmxBdHRyaWI6ICovCi0jZGVmaW5lIExPQ0tCSVQJKDE8PDApCQkvKiBGaWxlIGxvY2tlZCAqLwotI2RlZmluZSBESVJCSVQJKDE8PDQpCQkvKiBJdCdzIGEgZGlyZWN0b3J5ICovCi0KLS8qIE1hY2lmaWVkICJzdGF0IiBpbiB3aGljaCBmaWxlbmFtZSBpcyBnaXZlbiByZWxhdGl2ZSB0byBhIGRpcmVjdG9yeSwKLSAgIHNwZWNpZmllZCBieSBsb25nIERpcklELiAgKi8KLQotc3RhdGljIGludAotX3N0YXQgKGNoYXIgKm5hbWUsIGxvbmcgZGlyaWQsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIENJbmZvUEJSZWMgY2lwYnI7Ci0gIEhGaWxlSW5mbyAqZnBiID0gKEhGaWxlSW5mbyopICZjaXBicjsKLSAgRGlySW5mbyAqZHBiID0gKERpckluZm8qKSAmY2lwYnI7Ci0gIFN0cjI1NSBwbmFtZTsKLSAgc2hvcnQgZXJyOwotCi0gIC8qIE1ha2UgYSB0ZW1wIGNvcHkgb2YgdGhlIG5hbWUgYW5kIHBhc2NhbGl6ZS4gKi8KLSAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgbmFtZSk7Ci0gIGMycHN0ciAocG5hbWUpOwotICAKLSAgY2lwYnIuZGlySW5mby5pb0RyRGlySUQgPSBkaXJpZDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvTmFtZVB0ciA9IHBuYW1lOwotICBjaXBici5oRmlsZUluZm8uaW9WUmVmTnVtID0gMDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvRkRpckluZGV4ID0gMDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvRlZlcnNOdW0gPSAwOwotICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpCi0gICAgewotICAgICAgZXJybm8gPSBFTk9FTlQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAvKiBNYWMgZmlsZXMgYXJlIHJlYWRhYmxlIGlmIHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGF0IGFsbC4gKi8KLSAgYnVmLT5zdF9tb2RlID0gMDQ0NDsKLSAgLyogTWFyayB1bmxvY2tlZCBmaWxlcyBhcyB3cml0ZWFibGUuICovCi0gIGlmICghKGZwYi0+aW9GbEF0dHJpYiAmIExPQ0tCSVQpKQotICAgIGJ1Zi0+c3RfbW9kZSB8PSAwMjIyOwotICBpZiAoZnBiLT5pb0ZsQXR0cmliICYgRElSQklUKQotICAgIHsKLSAgICAgIC8qIE1hcmsgZGlyZWN0b3JpZXMgYXMgImV4ZWN1dGFibGUiLiAqLwotICAgICAgYnVmLT5zdF9tb2RlIHw9IDAxMTEgfCBTX0lGRElSOwotICAgICAgYnVmLT5zdF9zaXplID0gZHBiLT5pb0RyTm1GbHM7Ci0gICAgICBidWYtPnN0X3JzaXplID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYtPnN0X21vZGUgfD0gU19JRlJFRzsKLSAgICAgIC8qIE1hcmsgYXBwcyBhcyAiZXhlY3V0YWJsZSIuICovCi0gICAgICBpZiAoZnBiLT5pb0ZsRm5kckluZm8uZmRUeXBlID09ICdBUFBMJykKLQlidWYtPnN0X21vZGUgfD0gMDExMTsKLSAgICAgIC8qIEZpbGwgaW4gdGhlIHNpemVzIG9mIGRhdGEgYW5kIHJlc291cmNlIGZvcmtzLiAqLwotICAgICAgYnVmLT5zdF9zaXplID0gZnBiLT5pb0ZsTGdMZW47Ci0gICAgICBidWYtPnN0X3JzaXplID0gZnBiLT5pb0ZsUkxnTGVuOwotICAgIH0KLSAgLyogRmlsbCBpbiB2YXJpb3VzIHRpbWVzLiAqLwotICBidWYtPnN0X2F0aW1lID0gZnBiLT5pb0ZsQ3JEYXQ7Ci0gIGJ1Zi0+c3RfbXRpbWUgPSBmcGItPmlvRmxNZERhdDsKLSAgYnVmLT5zdF9jdGltZSA9IGZwYi0+aW9GbENyRGF0OwotICAvKiBTZXQgdXAgYW4gaW1pdGF0aW9uIGlub2RlIG51bWJlci4gKi8KLSAgYnVmLT5zdF9pbm8gPSAodW5zaWduZWQgc2hvcnQpIGZwYi0+aW9EaXJJRDsKLSAgLyogU2V0IHVwIGFuIGltaXRhdGlvbiBkZXZpY2UuICovCi0gIEdldFZSZWZOdW0gKGJ1Zi0+c3RfaW5vLCAmYnVmLT5zdF9kZXYpOwotICBidWYtPnN0X3VpZCA9IF9fdWlkOwotICBidWYtPnN0X2dpZCA9IF9fZ2lkOwotLyogIGJ1Zi0+c3RfRmxGbmRySW5mbyA9IGZwYi0+aW9GbEZuZHJJbmZvOyAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHN0YXQoKSBzZXRzIHVwIGFuIGVtcHR5IGRpcmlkLiAqLwotCi1pbnQKLXN0YXQgKGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIGxvbmcgcnNsdCwgZXJybnVtOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKHBhdGgsIHRtcG5hbWUpOwotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIjIHN0YXQgKCVzLCAleCkiLCB0bXBuYW1lLCBidWYpOwotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBfc3RhdCAodG1wbmFtZSwgMEwsIGJ1Zik7Ci0gIGVycm51bSA9IGVycm5vOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi1pbnQKLWZzdGF0IChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIEZDQlBCUmVjIGZjYjsKLSAgRklMRSAqZnA7Ci0gIFN0cjI1NSBwYXRobmFtZTsKLSAgbG9uZyBkaXJpZCA9IDBMLCB0ZW1wOwotICBsb25nIHJzbHQsIGVycm51bTsKLSAgc2hvcnQgZXJyOwotCi0gIGlmIChEZWJ1Z1BJIDwgMCkKLSAgICBEZWJ1Z1BJID0gKCooZ2V0ZW52ICgiREVCVUdfUEFUSE5BTUVTIikpID09ICcxJyA/IDEgOiAwKTsKLSAgaWYgKERlYnVnUEkpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIyBmc3RhdCAoJWQsICV4KSIsIGZkLCBidWYpOwotICBQUk9HUkVTUyAoMSk7Ci0gIHBhdGhuYW1lWzBdID0gMDsKLSNpZmRlZiBGSU9GTkFNRQotICAvKiBVc2UgYW4gTVBXLXNwZWNpZmljIGlvY3RsIHRvIGdldCB0aGUgcGF0aG5hbWUgYXNzb2NpYXRlZCB3aXRoCi0gICAgIHRoZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotICBpb2N0bCAoZmQsIEZJT0ZOQU1FLCAobG9uZyAqKSBwYXRobmFtZSk7IAotI2Vsc2UKLSAgeW91IGxvc2UKLSNlbmRpZgotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgKG5hbWUgaXMgJXMpIiwgcGF0aG5hbWUpOwotICBkaXJpZCA9IDBMIC8qIGZjYi5pb0ZDQlBhcklEICovIDsKLSAgcnNsdCA9IF9zdGF0ICgoY2hhciAqKSBwYXRobmFtZSwgZGlyaWQsIGJ1Zik7Ci0gIGVycm51bSA9IGVycm5vOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi0jZW5kaWYgLyogbiBVU0VfTVdfSEVBREVSUyAqLwotCi1jaGRpciAoKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWNoYXIgKgotZ2V0Y3dkIChjaGFyICpidWYsIGludCBzaXplKQotewotICBpZiAoYnVmID09IE5VTEwpCi0gICAgYnVmID0gKGNoYXIgKikgbWFsbG9jIChzaXplKTsKLSAgc3RyY3B5KGJ1ZiwgIjoiKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgbW9yZSBlbGFib3JhdGUgZm9yIE1QVy4gKi8KLQotY2hhciAqCi1nZXRwd2QgKCkKLXsKLSAgcmV0dXJuICI6IjsKLX0KLQotaW50Ci1tcHdfb3BlbiAoY2hhciAqZmlsZW5hbWUsIGludCBhcmcyLCBpbnQgYXJnMykKLXsKLSN1bmRlZiBvcGVuCi0gIGludCBmZCwgZXJybnVtID0gMDsKLSAgY2hhciB0bXBuYW1lWzI1Nl07Ci0KLSAgbXB3aWZ5X2ZpbGVuYW1lIChmaWxlbmFtZSwgdG1wbmFtZSk7Ci0gIGZkID0gb3BlbiAodG1wbmFtZSwgYXJnMik7Ci0gIGVycm51bSA9IGVycm5vOwotCi0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgb3BlbiAoJXMsICVkLCAlZCkiLCB0bXBuYW1lLCBhcmcyLCBhcmczKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIGZkKTsKLSAgICAgIGlmIChmZCA9PSAtMSkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSAgaWYgKGZkID09IC0xKQotICAgIGVycm5vID0gZXJybnVtOwotICByZXR1cm4gZmQ7Ci19Ci0KLWludAotbXB3X2FjY2VzcyAoY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGludCBjbWQpCi17Ci0jdW5kZWYgYWNjZXNzCi0KLSAgaW50IHJzbHQsIGVycm51bSA9IDA7Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKGZpbGVuYW1lLCB0bXBuYW1lKTsKLSAgaWYgKGNtZCAmIFJfT0sgfHwgY21kICYgWF9PSykKLSAgICB7Ci0gICAgICByc2x0ID0gc3RhdCAodG1wbmFtZSwgJnN0KTsKLSAgICAgIGVycm51bSA9IGVycm5vOwotICAgICAgaWYgKHJzbHQgPj0gMCkKLQl7Ci0JICBpZiAoKCgoc3Quc3RfbW9kZSAmIDAwNCkgPT0gMCkgJiYgKGNtZCAmIFJfT0spKQotCSAgICAgIHx8ICgoKHN0LnN0X21vZGUgJiAwMDIpID09IDApICYmIChjbWQgJiBXX09LKSkKLQkgICAgICB8fCAoKChzdC5zdF9tb2RlICYgMDAxKSA9PSAwKSAmJiAoY21kICYgWF9PSykpKQotCSAgICB7Ci0JICAgICAgcnNsdCA9IC0xOwotCSAgICAgIGVycm51bSA9IEVBQ0NFUzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgbXB3X2FjY2VzcyAoJXMsICVkKSIsIHRtcG5hbWUsIGNtZCk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi0vKiBUaGUgTVBXIGxpYnJhcnkgY3JlYXQoKSBoYXMgbm8gbW9kZSBhcmd1bWVudC4gKi8KLQotaW50Ci1tcHdfY3JlYXQgKGNoYXIgKnBhdGgsIC8qIG1vZGVfdCAqLyBpbnQgbW9kZSkKLXsKLSN1bmRlZiBjcmVhdAotCi0jaWZkZWYgVVNFX01XX0hFQURFUlMKLSAgcmV0dXJuIGNyZWF0IChwYXRoLCBtb2RlKTsKLSNlbHNlCi0gIHJldHVybiBjcmVhdCAocGF0aCk7Ci0jZW5kaWYKLX0KLQotLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGNvbnRyb2wgaW4gYW4gTVBXIHRvb2wgYmVmb3JlIGl0IGNyYXNoZXMgdGhlCi0gICBtYWNoaW5lLiAgKi8KLQotbXB3X3NwZWNpYWxfaW5pdCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKHN0cnN0ciAobmFtZSwgIkRFQlVHIikpCi0gICAgRGVidWdTdHIoIlxwYXQgYmVnaW5uaW5nIG9mIHByb2dyYW0iKTsKLX0KLQotc3RhdGljIGludCBjdXJyZW50X3VtYXNrOwotCi1pbnQKLXVtYXNrKGludCBtYXNrKQotewotICBpbnQgb2xkbWFzayA9IGN1cnJlbnRfdW1hc2s7Ci0KLSAgY3VycmVudF91bWFzayA9IG1hc2s7Ci0gIHJldHVybiBvbGRtYXNrOwotfQotCi0vKiBDdXJzb3Itc3Bpbm5pbmcgc3R1ZmYgdGhhdCBpbmNsdWRlcyBtZXRlcmluZyBvZiBzcGluIHJhdGUgYW5kIGRlbGF5cy4gICovCi0KLS8qIE5vbnplcm8gd2hlbiBjdXJzb3Igc3Bpbm5pbmcgaGFzIGJlZW4gc2V0IHVwIHByb3Blcmx5LiAgKi8KLQotaW50IGN1cnNvcl9pbml0ZWQ7Ci0KLS8qIE5vbnplcm8gaWYgc3BpbiBzaG91bGQgYmUgbWVhc3VyZWQgYW5kIGV4Y2Vzc2l2ZSBkZWxheXMgcmVwb3J0ZWQuICAqLwotCi1pbnQgbWVhc3VyZV9zcGluOwotCi0vKiBOb256ZXJvIGlmIHNwaW4gaGlzdG9ncmFtIGFuZCByYXRlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0LiAgKi8KLQotaW50IGR1bXBfc3Bpbl9kYXRhOwotCi1sb25nIHdhcm5pbmdfdGhyZXNob2xkID0gNDAwMDAwOwotCi1sb25nIGJ1Y2tldF9zaXplID0gMTAyNDsKLQotbG9uZyBidWNrZXRfcG93ZXIgPSAxMDsKLQotbG9uZyBudW1idWNrZXRzID0gMzAwOwotCi1pbnQgKmRlbGF5X2NvdW50czsKLQotaW50IG92ZXJmbG93X2NvdW50OwotCi1jaGFyICpjdXJyZW50X3Byb2dyZXNzOwotCi1zdGF0aWMgVW5zaWduZWRXaWRlIGxhc3RfbWljcm9zZWNvbmRzOwotCi1zdGF0aWMgY2hhciAqbGFzdF9zcGluX2ZpbGUgPSAiIjsKLQotc3RhdGljIGludCBsYXN0X3NwaW5fbGluZTsKLQotdm9pZAotd2Fybl9pZl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgbG9uZyBkaWZmLCBpeDsKLSAgVW5zaWduZWRXaWRlIG5vdzsKLQotICBNaWNyb3NlY29uZHMoJm5vdyk7Ci0KLSAgZGlmZiA9IG5vdy5sbyAtIGxhc3RfbWljcm9zZWNvbmRzLmxvOwotCi0gIGlmIChkaWZmID4gd2FybmluZ190aHJlc2hvbGQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIyAlczogJWxkLiUwNmxkIHNlYyBkZWxheSBnZXR0aW5nIGZyb20gJXM6JWQgdG8gJXM6JWRcbiIsCi0JICAgICAoY3VycmVudF9wcm9ncmVzcyA/IGN1cnJlbnRfcHJvZ3Jlc3MgOiAiIiksCi0JICAgICBkaWZmIC8gMTAwMDAwMCwgZGlmZiAlIDEwMDAwMDAsCi0JICAgICBsYXN0X3NwaW5fZmlsZSwgbGFzdF9zcGluX2xpbmUsIGZpbGUsIGxpbmUpOwotICBpZiAoZHVtcF9zcGluX2RhdGEpCi0gICAgewotICAgICAgaWYgKGRpZmYgPj0gMCkKLQl7Ci0JICBpeCA9IGRpZmYgPj4gYnVja2V0X3Bvd2VyOwotCSAgaWYgKGl4ID49IDAgJiYgaXggPCBudW1idWNrZXRzICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQotCSAgICArK2RlbGF5X2NvdW50c1tpeF07Ci0JICBlbHNlCi0JICAgICsrb3ZlcmZsb3dfY291bnQ7Ci0JfQotICAgICAgZWxzZQotCWZwcmludGYgKHN0ZGVyciwgInJhdyBkaWZmIGlzICVsZCAoPylcbiIsIGRpZmYpOwotICAgIH0KLX0KLQotdm9pZAotcmVjb3JkX2Zvcl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgTWljcm9zZWNvbmRzICgmbGFzdF9taWNyb3NlY29uZHMpOwotICBsYXN0X3NwaW5fZmlsZSA9IGZpbGU7Ci0gIGxhc3Rfc3Bpbl9saW5lID0gbGluZTsKLX0KLQotdm9pZAotbXB3X3N0YXJ0X3Byb2dyZXNzIChjaGFyICpzdHIsIGludCBuLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKm1lYXN1cmUsICp0aHJlc2hvbGQ7Ci0KLSAgaWYgKCFjdXJzb3JfaW5pdGVkKQotICAgIHsKLSAgICAgIEluaXRDdXJzb3JDdGwgKG5pbCk7Ci0gICAgICBjdXJzb3JfaW5pdGVkID0gMTsKLSAgICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci0gICAgICBtZWFzdXJlID0gZ2V0ZW52ICgiTUVBU1VSRV9TUElOIik7Ci0gICAgICBpZiAobWVhc3VyZSAhPSBOVUxMICYmIG1lYXN1cmVbMF0gIT0gJ1wwJykKLQl7Ci0JICBtZWFzdXJlX3NwaW4gPSAxOwotCSAgaWYgKHN0cmNtcCAobWVhc3VyZSwgImFsbCIpID09IDApCi0JICAgIGR1bXBfc3Bpbl9kYXRhID0gMTsKLQl9Ci0gICAgICB0aHJlc2hvbGQgPSBnZXRlbnYgKCJTUElOX1dBUk5fVEhSRVNIT0xEIik7Ci0gICAgICBpZiAodGhyZXNob2xkICE9IE5VTEwgJiYgdGhyZXNob2xkWzBdICE9ICdcMCcpCi0Jd2FybmluZ190aHJlc2hvbGQgPSBhdG9sICh0aHJlc2hvbGQpOwotICAgICAgaWYgKGR1bXBfc3Bpbl9kYXRhKQotCXsKLQkgIGlmIChkZWxheV9jb3VudHMgPT0gTlVMTCkKLQkgICAgZGVsYXlfY291bnRzID0gKGludCAqKSBtYWxsb2MgKG51bWJ1Y2tldHMgKiBzaXplb2YgKGludCkpOwotCSAgZm9yIChpID0gMDsgaSA8IG51bWJ1Y2tldHM7ICsraSkKLQkgICAgZGVsYXlfY291bnRzW2ldID0gMDsKLQkgIG92ZXJmbG93X2NvdW50ID0gMDsKLQl9Ci0gICAgfQotICBjdXJyZW50X3Byb2dyZXNzID0gc3RyOwotCi0gIHN5c19uZXJyID0gZXJybm9fbWF4ICgpOwotCi0gIG1wd19zcGVjaWFsX2luaXQgKHN0cik7Ci19Ci0KLXZvaWQKLW1wd19wcm9ncmVzcyAoaW50IG4pCi17Ci0gIFNwaW5DdXJzb3IgKDMyKTsKLX0KLQotdm9pZAotbXB3X3Byb2dyZXNzX21lYXN1cmVkIChpbnQgbiwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLSAgU3BpbkN1cnNvciAoMzIpOwotICBpZiAobWVhc3VyZV9zcGluKQotICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci19Ci0KLXZvaWQKLW1wd19lbmRfcHJvZ3Jlc3MgKGNoYXIgKnN0ciwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGxvbmcgaSwgZGVsYXksIGNvdW50ID0gMCwgc3VtID0gMCwgYXZnZGVsYXksIHNwaW5yYXRlOwotICBsb25nIGN1cnBvd2VyID0gMCwgY3VyZ3JvdXAgPSAwOwotCi0gIC8qIFdhcm4gaWYgaXQncyBiZWVuIGEgd2hpbGUgc2luY2UgdGhlIGxhc3Qgc3Bpbi4gICovCi0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLQotICAvKiBEdW1wIGFsbCB0aGUgbm9uemVybyBkZWxheSBjb3VudHMgYW5kIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGRlbGF5LiAgKi8KLSAgaWYgKGR1bXBfc3Bpbl9kYXRhICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1idWNrZXRzOyArK2kpCi0JewotCSAgZGVsYXkgPSAoaSArIDEpICogYnVja2V0X3NpemU7Ci0JICBzdW0gKz0gZGVsYXlfY291bnRzW2ldICogKGkgKyAxKTsKLQkgIGNvdW50ICs9IGRlbGF5X2NvdW50c1tpXTsKLQkgIGlmIChkZWxheSA8PSAoMSA8PCBjdXJwb3dlcikpCi0JICAgIHsKLQkgICAgICBjdXJncm91cCArPSBkZWxheV9jb3VudHNbaV07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChjdXJncm91cCA+IDApCi0JCWZwcmludGYgKHN0ZGVyciwKLQkJCSAiIyAlczogJWQgZGVsYXlzIGJldHdlZW4gJWxkLiUwNmxkIGFuZCAlbGQuJTA2bGQgc2VjXG4iLAotCQkJIChzdHIgPyBzdHIgOiAiIiksCi0JCQkgY3VyZ3JvdXAsCi0JCQkgKDEgPDwgY3VycG93ZXIpIC8gMTAwMDAwMCwKLQkJCSAoMSA8PCBjdXJwb3dlcikgJSAxMDAwMDAwLAotCQkJICgxIDw8IChjdXJwb3dlciArIDEpKSAvIDEwMDAwMDAsCi0JCQkgKDEgPDwgKGN1cnBvd2VyICsgMSkpICUgMTAwMDAwMCk7Ci0JICAgICAgKytjdXJwb3dlcjsKLQkgICAgICBjdXJncm91cCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY291bnQgPiAwKQotCXsKLQkgIGF2Z2RlbGF5ID0gKHN1bSAqIGJ1Y2tldF9zaXplKSAvIGNvdW50OwotCSAgc3BpbnJhdGUgPSAxMDAwMDAwIC8gYXZnZGVsYXk7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIjICVzOiBBdmVyYWdlIHNwaW4gcmF0ZSBpcyAlZCB0aW1lcy9zZWNcbiIsCi0JCSAgIChzdHIgPyBzdHIgOiAiIiksIHNwaW5yYXRlKTsKLQl9Ci0gICAgfQotfQotCi0jaWZkZWYgUFJPR1JFU1NfVEVTVAotCi0vKiBUZXN0IHByb2dyYW0uICAqLwotCi1tYWluICgpCi17Ci0gIGludCBpLCBqOwotICBkb3VibGUgeCA9IDEuMCwgeSA9IDIuNDsKLSAgbG9uZyBzdGFydCA9IE1pY3Jvc2Vjb25kcyAoKSwgdG07ICBGSVhNRQotCi0gIFNUQVJUX1BST0dSRVNTICgiaGkiLCAwKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IChpICogMTAwKTsgKytqKQotCXsKLQkgIHggKz0gKHggKiB5KSAvIGo7Ci0JfQotICAgIH0KLSAgCi0gIEVORF9QUk9HUkVTUyAoImhpIik7Ci0gIAotICB0bSA9IE1pY3Jvc2Vjb25kcyAoKSAtIHN0YXJ0OwotCi0gIHByaW50ZiAoIlRvdGFsIHRpbWUgaXMgJWQuJWQgc2Vjc1xuIiwgdG0gLyAxMDAwMDAwLCB0bSAlIDEwMDAwMDApOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9NV19IRUFERVJTCi0vKiBFbXB0eSBkZWZpbml0aW9ucyBmb3IgTWV0cm93ZXJrcycgU0lPVVggY29uc29sZSBsaWJyYXJ5LiAqLwotCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jaW5jbHVkZSA8Y29uc29sZS5oPgotI2VuZGlmCi0KLXNob3J0Ci1JbnN0YWxsQ29uc29sZShzaG9ydCBmZCkKLXsKLSNwcmFnbWEgdW51c2VkIChmZCkKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotUmVtb3ZlQ29uc29sZSh2b2lkKQotewotfQotCi1sb25nCi1Xcml0ZUNoYXJzVG9Db25zb2xlKGNoYXIgKmJ1ZiwgbG9uZyBuKQotewotI3ByYWdtYSB1bnVzZWQgKGJ1ZiwgbikKLQlyZXR1cm4gMDsKLX0KLQotbG9uZyBSZWFkQ2hhcnNGcm9tQ29uc29sZShjaGFyICpidWYsIGxvbmcgbikKLXsKLSNwcmFnbWEgdW51c2VkIChidWYsIG4pCi0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBjaGFyICoKLV9fdHR5bmFtZShsb25nIGZkKQotewotCXN0YXRpYyBjaGFyICpfX2RldmljZW5hbWUgPSAibnVsbCBkZXZpY2UiOwotCi0JaWYgKGZkID49IDAgJiYgZmQgPD0gMikKLQkgIHJldHVybiAoX19kZXZpY2VuYW1lKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXNkb3MuYyBiL2xpYmliZXJ0eS9tc2Rvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlNjRkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tc2Rvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotY2hhciBtc2dbXSA9ICJObyB2Zm9yayBhdmFpbGFibGUgLSBhYm9ydGluZ1xuIjsKLXZmb3JrKCkKLXsKLSAgd3JpdGUoMSwgbXNnLCBzaXplb2YobXNnKSk7Ci19Ci0KLXNpZ3NldG1hc2soKQotewotICAvKiBubyBzaWduYWxzIHN1cHBvcnQgaW4gZ28zMiAoeWV0KSAqLwotfQotCi13YWl0cGlkKCkKLXsKLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L29iamFsbG9jLmMgYi9saWJpYmVydHkvb2JqYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTRhOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvb2JqYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKiBvYmphbGxvYy5jIC0tIHJvdXRpbmVzIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb2JqZWN0cwotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvYmphbGxvYy5oIgotCi0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciBOVUxMLiAgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgVk1TCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2Vsc2UKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotLyogR2V0IGEgZGVmaW5pdGlvbiBmb3Igc2l6ZV90LiAgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoaXMgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1leHRlcm4gUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiB2b2lkIGZyZWUgUEFSQU1TICgoUFRSKSk7Ci0jZW5kaWYKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgc3BhY2UgZm9yIGFuIG9iamVjdC4gIEZyZWVpbmcgYWxsb2NhdGVkCi0gICBzcGFjZSBtYXkgb3IgbWF5IG5vdCBmcmVlIGFsbCBtb3JlIHJlY2VudGx5IGFsbG9jYXRlZCBzcGFjZS4KLQotICAgV2UgaGFuZGxlIGxhcmdlIGFuZCBzbWFsbCBhbGxvY2F0aW9uIHJlcXVlc3RzIGRpZmZlcmVudGx5LiAgSWYgd2UKLSAgIGRvbid0IGhhdmUgZW5vdWdoIHNwYWNlIGluIHRoZSBjdXJyZW50IGJsb2NrLCBhbmQgdGhlIGFsbG9jYXRpb24KLSAgIHJlcXVlc3QgaXMgZm9yIG1vcmUgdGhhbiA1MTIgYnl0ZXMsIHdlIHNpbXBseSBwYXNzIGl0IHRocm91Z2ggdG8KLSAgIG1hbGxvYy4gICovCi0KLS8qIFRoZSBvYmphbGxvYyBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBvYmphbGxvYy5oLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuay4gICovCi0KLXN0cnVjdCBvYmphbGxvY19jaHVuawotewotICAvKiBOZXh0IGNodW5rLiAgKi8KLSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotICAvKiBJZiB0aGlzIGNodW5rIGNvbnRhaW5zIGxhcmdlIG9iamVjdHMsIHRoaXMgaXMgdGhlIHZhbHVlIG9mCi0gICAgIGN1cnJlbnRfcHRyIHdoZW4gdGhpcyBjaHVuayB3YXMgYWxsb2NhdGVkLiAgSWYgdGhpcyBjaHVuawotICAgICBjb250YWlucyBzbWFsbCBvYmplY3RzLCB0aGlzIGlzIE5VTEwuICAqLwotICBjaGFyICpjdXJyZW50X3B0cjsKLX07Ci0KLS8qIFRoZSBhbGlnbmVkIHNpemUgb2Ygb2JqYWxsb2NfY2h1bmsuICAqLwotCi0jZGVmaW5lIENIVU5LX0hFQURFUl9TSVpFCQkJCQlcCi0gICgoc2l6ZW9mIChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmspICsgT0JKQUxMT0NfQUxJR04gLSAxKQlcCi0gICAmfiAoT0JKQUxMT0NfQUxJR04gLSAxKSkKLQotLyogV2UgYXNrIGZvciB0aGlzIG11Y2ggbWVtb3J5IGVhY2ggdGltZSB3ZSBjcmVhdGUgYSBjaHVuayB3aGljaCBpcyB0bwotICAgaG9sZCBzbWFsbCBvYmplY3RzLiAgKi8KLQotI2RlZmluZSBDSFVOS19TSVpFICg0MDk2IC0gMzIpCi0KLS8qIEEgcmVxdWVzdCBmb3IgdGhpcyBhbW91bnQgb3IgbW9yZSBpcyBqdXN0IHBhc3NlZCB0aHJvdWdoIHRvIG1hbGxvYy4gICovCi0KLSNkZWZpbmUgQklHX1JFUVVFU1QgKDUxMikKLQotLyogQ3JlYXRlIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBvYmphbGxvYyAqCi1vYmphbGxvY19jcmVhdGUgKCkKLXsKLSAgc3RydWN0IG9iamFsbG9jICpyZXQ7Ci0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqY2h1bms7Ci0KLSAgcmV0ID0gKHN0cnVjdCBvYmphbGxvYyAqKSBtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldC0+Y2h1bmtzID0gKFBUUikgbWFsbG9jIChDSFVOS19TSVpFKTsKLSAgaWYgKHJldC0+Y2h1bmtzID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjaHVuayA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgcmV0LT5jaHVua3M7Ci0gIGNodW5rLT5uZXh0ID0gTlVMTDsKLSAgY2h1bmstPmN1cnJlbnRfcHRyID0gTlVMTDsKLQotICByZXQtPmN1cnJlbnRfcHRyID0gKGNoYXIgKikgY2h1bmsgKyBDSFVOS19IRUFERVJfU0laRTsKLSAgcmV0LT5jdXJyZW50X3NwYWNlID0gQ0hVTktfU0laRSAtIENIVU5LX0hFQURFUl9TSVpFOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZyb20gYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotUFRSCi1fb2JqYWxsb2NfYWxsb2MgKG8sIGxlbikKLSAgICAgc3RydWN0IG9iamFsbG9jICpvOwotICAgICB1bnNpZ25lZCBsb25nIGxlbjsKLXsKLSAgLyogV2UgYXZvaWQgY29uZnVzaW9uIGZyb20gemVybyBzaXplZCBvYmplY3RzIGJ5IGFsd2F5cyBhbGxvY2F0aW5nCi0gICAgIGF0IGxlYXN0IDEgYnl0ZS4gICovCi0gIGlmIChsZW4gPT0gMCkKLSAgICBsZW4gPSAxOwotCi0gIGxlbiA9IChsZW4gKyBPQkpBTExPQ19BTElHTiAtIDEpICZ+IChPQkpBTExPQ19BTElHTiAtIDEpOwotCi0gIGlmIChsZW4gPD0gby0+Y3VycmVudF9zcGFjZSkKLSAgICB7Ci0gICAgICBvLT5jdXJyZW50X3B0ciArPSBsZW47Ci0gICAgICBvLT5jdXJyZW50X3NwYWNlIC09IGxlbjsKLSAgICAgIHJldHVybiAoUFRSKSAoby0+Y3VycmVudF9wdHIgLSBsZW4pOwotICAgIH0KLQotICBpZiAobGVuID49IEJJR19SRVFVRVNUKQotICAgIHsKLSAgICAgIGNoYXIgKnJldDsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqY2h1bms7Ci0KLSAgICAgIHJldCA9IChjaGFyICopIG1hbGxvYyAoQ0hVTktfSEVBREVSX1NJWkUgKyBsZW4pOwotICAgICAgaWYgKHJldCA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBjaHVuayA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgcmV0OwotICAgICAgY2h1bmstPm5leHQgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIGNodW5rLT5jdXJyZW50X3B0ciA9IG8tPmN1cnJlbnRfcHRyOwotCi0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBjaHVuazsKLQotICAgICAgcmV0dXJuIChQVFIpIChyZXQgKyBDSFVOS19IRUFERVJfU0laRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpjaHVuazsKLQotICAgICAgY2h1bmsgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG1hbGxvYyAoQ0hVTktfU0laRSk7Ci0gICAgICBpZiAoY2h1bmsgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGNodW5rLT5uZXh0ID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7Ci0gICAgICBjaHVuay0+Y3VycmVudF9wdHIgPSBOVUxMOwotCi0gICAgICBvLT5jdXJyZW50X3B0ciA9IChjaGFyICopIGNodW5rICsgQ0hVTktfSEVBREVSX1NJWkU7Ci0gICAgICBvLT5jdXJyZW50X3NwYWNlID0gQ0hVTktfU0laRSAtIENIVU5LX0hFQURFUl9TSVpFOwotCi0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBjaHVuazsKLQotICAgICAgcmV0dXJuIG9iamFsbG9jX2FsbG9jIChvLCBsZW4pOwotICAgIH0KLX0KLQotLyogRnJlZSBhbiBlbnRpcmUgb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotb2JqYWxsb2NfZnJlZSAobykKLSAgICAgc3RydWN0IG9iamFsbG9jICpvOwotewotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmw7Ci0KLSAgbCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICB3aGlsZSAobCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbmV4dDsKLQotICAgICAgbmV4dCA9IGwtPm5leHQ7Ci0gICAgICBmcmVlIChsKTsKLSAgICAgIGwgPSBuZXh0OwotICAgIH0KLQotICBmcmVlIChvKTsKLX0KLQotLyogRnJlZSBhIGJsb2NrIGZyb20gYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgVGhpcyBhbHNvIGZyZWVzIGFsbCBtb3JlCi0gICByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2tzLiAgKi8KLQotdm9pZAotb2JqYWxsb2NfZnJlZV9ibG9jayAobywgYmxvY2spCi0gICAgIHN0cnVjdCBvYmphbGxvYyAqbzsKLSAgICAgUFRSIGJsb2NrOwotewotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKnAsICpzbWFsbDsKLSAgY2hhciAqYiA9IChjaGFyICopIGJsb2NrOwotCi0gIC8qIEZpcnN0IHNldCBQIHRvIHRoZSBjaHVuayB3aGljaCBjb250YWlucyB0aGUgYmxvY2sgd2UgYXJlIGZyZWVpbmcsCi0gICAgIGFuZCBzZXQgUSB0byB0aGUgbGFzdCBzbWFsbCBvYmplY3QgY2h1bmsgd2Ugc2VlIGJlZm9yZSBQLiAgKi8KLSAgc21hbGwgPSBOVUxMOwotICBmb3IgKHAgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAocC0+Y3VycmVudF9wdHIgPT0gTlVMTCkKLQl7Ci0JICBpZiAoYiA+IChjaGFyICopIHAgJiYgYiA8IChjaGFyICopIHAgKyBDSFVOS19TSVpFKQotCSAgICBicmVhazsKLQkgIHNtYWxsID0gcDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGIgPT0gKGNoYXIgKikgcCArIENIVU5LX0hFQURFUl9TSVpFKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGNhbid0IGZpbmQgdGhlIGNodW5rLCB0aGUgY2FsbGVyIGhhcyBtYWRlIGEgbWlzdGFrZS4gICovCi0gIGlmIChwID09IE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHAtPmN1cnJlbnRfcHRyID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpxOwotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpmaXJzdDsKLQotICAgICAgLyogVGhlIGJsb2NrIGlzIGluIGEgY2h1bmsgY29udGFpbmluZyBzbWFsbCBvYmplY3RzLiAgV2UgY2FuCi0JIGZyZWUgZXZlcnkgY2h1bmsgdGhyb3VnaCBTTUFMTCwgYmVjYXVzZSB0aGV5IGhhdmUgY2VydGFpbmx5Ci0JIGJlZW4gYWxsb2NhdGVkIG1vcmUgcmVjZW50bHkuICBBZnRlciBTTUFMTCwgd2Ugd2lsbCBub3Qgc2VlCi0JIGFueSBjaHVua3MgY29udGFpbmluZyBzbWFsbCBvYmplY3RzOyB3ZSBjYW4gZnJlZSBhbnkgYmlnCi0JIGNodW5rIGlmIHRoZSBjdXJyZW50X3B0ciBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQi4gIFdlCi0JIGNhbiB0aGVuIHJlc2V0IHRoZSBuZXcgY3VycmVudF9wdHIgdG8gQi4gICovCi0KLSAgICAgIGZpcnN0ID0gTlVMTDsKLSAgICAgIHEgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIHdoaWxlIChxICE9IHApCi0JewotCSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotCi0JICBuZXh0ID0gcS0+bmV4dDsKLQkgIGlmIChzbWFsbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHNtYWxsID09IHEpCi0JCXNtYWxsID0gTlVMTDsKLQkgICAgICBmcmVlIChxKTsKLQkgICAgfQotCSAgZWxzZSBpZiAocS0+Y3VycmVudF9wdHIgPiBiKQotCSAgICBmcmVlIChxKTsKLQkgIGVsc2UgaWYgKGZpcnN0ID09IE5VTEwpCi0JICAgIGZpcnN0ID0gcTsKLQotCSAgcSA9IG5leHQ7Ci0JfQotCi0gICAgICBpZiAoZmlyc3QgPT0gTlVMTCkKLQlmaXJzdCA9IHA7Ci0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBmaXJzdDsKLQotICAgICAgLyogTm93IHN0YXJ0IGFsbG9jYXRpbmcgZnJvbSB0aGlzIHNtYWxsIGJsb2NrIGFnYWluLiAgKi8KLSAgICAgIG8tPmN1cnJlbnRfcHRyID0gYjsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgPSAoKGNoYXIgKikgcCArIENIVU5LX1NJWkUpIC0gYjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKnE7Ci0gICAgICBjaGFyICpjdXJyZW50X3B0cjsKLQotICAgICAgLyogVGhpcyBibG9jayBpcyBpbiBhIGxhcmdlIGNodW5rIGJ5IGl0c2VsZi4gIFdlIGNhbiBmcmVlCi0gICAgICAgICBldmVyeXRoaW5nIG9uIHRoZSBsaXN0IHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBibG9jay4gIFdlCi0gICAgICAgICB0aGVuIHN0YXJ0IGFsbG9jYXRpbmcgZnJvbSB0aGUgbmV4dCBjaHVuayBjb250YWluaW5nIHNtYWxsCi0gICAgICAgICBvYmplY3RzLCBzZXR0aW5nIGN1cnJlbnRfcHRyIGZyb20gdGhlIHZhbHVlIHN0b3JlZCB3aXRoIHRoZQotICAgICAgICAgbGFyZ2UgY2h1bmsgd2UgYXJlIGZyZWVpbmcuICAqLwotCi0gICAgICBjdXJyZW50X3B0ciA9IHAtPmN1cnJlbnRfcHRyOwotICAgICAgcCA9IHAtPm5leHQ7Ci0KLSAgICAgIHEgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIHdoaWxlIChxICE9IHApCi0JewotCSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotCi0JICBuZXh0ID0gcS0+bmV4dDsKLQkgIGZyZWUgKHEpOwotCSAgcSA9IG5leHQ7Ci0JfQotCi0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBwOwotCi0gICAgICB3aGlsZSAocC0+Y3VycmVudF9wdHIgIT0gTlVMTCkKLQlwID0gcC0+bmV4dDsKLQotICAgICAgby0+Y3VycmVudF9wdHIgPSBjdXJyZW50X3B0cjsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgPSAoKGNoYXIgKikgcCArIENIVU5LX1NJWkUpIC0gY3VycmVudF9wdHI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L29ic3RhY2suYyBiL2xpYmliZXJ0eS9vYnN0YWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzE4YjMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L29ic3RhY2suYworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKiBvYnN0YWNrLmMgLSBzdWJyb3V0aW5lcyB1c2VkIGltcGxpY2l0bHkgYnkgb2JqZWN0IHN0YWNrIG1hY3JvcwotICAgQ29weXJpZ2h0IChDKSAxOTg4LDg5LDkwLDkxLDkyLDkzLDk0LDk2LDk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogTk9URSBCRUZPUkUgTU9ESUZZSU5HIFRISVMgRklMRTogVGhpcyB2ZXJzaW9uIG51bWJlciBtdXN0IGJlCi0gICBpbmNyZW1lbnRlZCB3aGVuZXZlciBjYWxsZXJzIGNvbXBpbGVkIHVzaW5nIGFuIG9sZCBvYnN0YWNrLmggY2FuIG5vCi0gICBsb25nZXIgcHJvcGVybHkgY2FsbCB0aGUgZnVuY3Rpb25zIGluIHRoaXMgb2JzdGFjay5jLiAgKi8KLSNkZWZpbmUgT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTiAxCi0KLS8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAotICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgYW5kIHRoZSBpbnN0YWxsZWQgbGlicmFyeQotICAgc3VwcG9ydHMgdGhlIHNhbWUgbGlicmFyeSBpbnRlcmZhY2Ugd2UgZG8uICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VCi0gICBDIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKLSAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKLSAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQotICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0Ci0gICBmaWxlcywgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4JCS8qIFJhbmRvbSB0aGluZyB0byBnZXQgX19HTlVfTElCUkFSWV9fLiAgKi8KLSNpZiAhZGVmaW5lZCAoX0xJQkMpICYmIGRlZmluZWQgKF9fR05VX0xJQlJBUllfXykgJiYgX19HTlVfTElCUkFSWV9fID4gMQotI2luY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgotI2lmIF9HTlVfT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTiA9PSBPQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OCi0jZGVmaW5lIEVMSURFX0NPREUKLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmbmRlZiBFTElERV9DT0RFCi0KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2RlZmluZSBQT0lOVEVSIHZvaWQgKgotI2Vsc2UKLSNkZWZpbmUgUE9JTlRFUiBjaGFyICoKLSNlbmRpZgotCi0vKiBEZXRlcm1pbmUgZGVmYXVsdCBhbGlnbm1lbnQuICAqLwotc3RydWN0IGZvb2FsaWduIHtjaGFyIHg7IGRvdWJsZSBkO307Ci0jZGVmaW5lIERFRkFVTFRfQUxJR05NRU5UICBcCi0gICgoUFRSX0lOVF9UWVBFKSAoKGNoYXIgKikgJigoc3RydWN0IGZvb2FsaWduICopIDApLT5kIC0gKGNoYXIgKikgMCkpCi0vKiBJZiBtYWxsb2Mgd2VyZSByZWFsbHkgc21hcnQsIGl0IHdvdWxkIHJvdW5kIGFkZHJlc3NlcyB0byBERUZBVUxUX0FMSUdOTUVOVC4KLSAgIEJ1dCBpbiBmYWN0IGl0IG1pZ2h0IGJlIGxlc3Mgc21hcnQgYW5kIHJvdW5kIGFkZHJlc3NlcyB0byBhcyBtdWNoIGFzCi0gICBERUZBVUxUX1JPVU5ESU5HLiAgU28gd2UgcHJlcGFyZSBmb3IgaXQgdG8gZG8gdGhhdC4gICovCi11bmlvbiBmb29yb3VuZCB7bG9uZyB4OyBkb3VibGUgZDt9OwotI2RlZmluZSBERUZBVUxUX1JPVU5ESU5HIChzaXplb2YgKHVuaW9uIGZvb3JvdW5kKSkKLQotLyogV2hlbiB3ZSBjb3B5IGEgbG9uZyBibG9jayBvZiBkYXRhLCB0aGlzIGlzIHRoZSB1bml0IHRvIGRvIGl0IHdpdGguCi0gICBPbiBzb21lIG1hY2hpbmVzLCBjb3B5aW5nIHN1Y2Nlc3NpdmUgaW50cyBkb2VzIG5vdCB3b3JrOwotICAgaW4gc3VjaCBhIGNhc2UsIHJlZGVmaW5lIENPUFlJTkdfVU5JVCB0byBgbG9uZycgKGlmIHRoYXQgd29ya3MpCi0gICBvciBgY2hhcicgYXMgYSBsYXN0IHJlc29ydC4gICovCi0jaWZuZGVmIENPUFlJTkdfVU5JVAotI2RlZmluZSBDT1BZSU5HX1VOSVQgaW50Ci0jZW5kaWYKLQotCi0vKiBUaGUgZnVuY3Rpb25zIGFsbG9jYXRpbmcgbW9yZSByb29tIGJ5IGNhbGxpbmcgYG9ic3RhY2tfY2h1bmtfYWxsb2MnCi0gICBqdW1wIHRvIHRoZSBoYW5kbGVyIHBvaW50ZWQgdG8gYnkgYG9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXInLgotICAgVGhpcyB2YXJpYWJsZSBieSBkZWZhdWx0IHBvaW50cyB0byB0aGUgaW50ZXJuYWwgZnVuY3Rpb24KLSAgIGBwcmludF9hbmRfYWJvcnQnLiAgKi8KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLXN0YXRpYyB2b2lkIHByaW50X2FuZF9hYm9ydCAodm9pZCk7Ci12b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKHZvaWQpID0gcHJpbnRfYW5kX2Fib3J0OwotI2Vsc2UKLXN0YXRpYyB2b2lkIHByaW50X2FuZF9hYm9ydCAoKTsKLXZvaWQgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKSA9IHByaW50X2FuZF9hYm9ydDsKLSNlbmRpZgotCi0vKiBFeGl0IHZhbHVlIHVzZWQgd2hlbiBgcHJpbnRfYW5kX2Fib3J0JyBpcyB1c2VkLiAgKi8KLSNpZiBkZWZpbmVkIF9fR05VX0xJQlJBUllfXyB8fCBkZWZpbmVkIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmbmRlZiBFWElUX0ZBSUxVUkUKLSNkZWZpbmUgRVhJVF9GQUlMVVJFIDEKLSNlbmRpZgotaW50IG9ic3RhY2tfZXhpdF9mYWlsdXJlID0gRVhJVF9GQUlMVVJFOwotCi0vKiBUaGUgbm9uLUdOVS1DIG1hY3JvcyBjb3B5IHRoZSBvYnN0YWNrIGludG8gdGhpcyBnbG9iYWwgdmFyaWFibGUKLSAgIHRvIGF2b2lkIG11bHRpcGxlIGV2YWx1YXRpb24uICAqLwotCi1zdHJ1Y3Qgb2JzdGFjayAqX29ic3RhY2s7Ci0KLS8qIERlZmluZSBhIG1hY3JvIHRoYXQgZWl0aGVyIGNhbGxzIGZ1bmN0aW9ucyB3aXRoIHRoZSB0cmFkaXRpb25hbCBtYWxsb2MvZnJlZQotICAgY2FsbGluZyBpbnRlcmZhY2UsIG9yIGNhbGxzIGZ1bmN0aW9ucyB3aXRoIHRoZSBtbWFsbG9jL21mcmVlIGludGVyZmFjZQotICAgKHRoYXQgYWRkcyBhbiBleHRyYSBmaXJzdCBhcmd1bWVudCksIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB1c2VfZXh0cmFfYXJnLgotICAgRm9yIGZyZWUsIGRvIG5vdCB1c2UgPzosIHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIHRoZSBNSVBTIGNvbXBpbGVycywKLSAgIGRvIG5vdCBhbGxvdyAoZXhwcikgPyB2b2lkIDogdm9pZC4gICovCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSNkZWZpbmUgQ0FMTF9DSFVOS0ZVTihoLCBzaXplKSBcCi0gICgoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgID8gKCooaCktPmNodW5rZnVuKSAoKGgpLT5leHRyYV9hcmcsIChzaXplKSkgXAotICAgOiAoKihzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSAobG9uZykpIChoKS0+Y2h1bmtmdW4pICgoc2l6ZSkpKQotCi0jZGVmaW5lIENBTExfRlJFRUZVTihoLCBvbGRfY2h1bmspIFwKLSAgZG8geyBcCi0gICAgaWYgKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICAgICAoKihoKS0+ZnJlZWZ1bikgKChoKS0+ZXh0cmFfYXJnLCAob2xkX2NodW5rKSk7IFwKLSAgICBlbHNlIFwKLSAgICAgICgqKHZvaWQgKCopICh2b2lkICopKSAoaCktPmZyZWVmdW4pICgob2xkX2NodW5rKSk7IFwKLSAgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIENBTExfQ0hVTktGVU4oaCwgc2l6ZSkgXAotICAoKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICA/ICgqKGgpLT5jaHVua2Z1bikgKChoKS0+ZXh0cmFfYXJnLCAoc2l6ZSkpIFwKLSAgIDogKCooc3RydWN0IF9vYnN0YWNrX2NodW5rICooKikgKCkpIChoKS0+Y2h1bmtmdW4pICgoc2l6ZSkpKQotCi0jZGVmaW5lIENBTExfRlJFRUZVTihoLCBvbGRfY2h1bmspIFwKLSAgZG8geyBcCi0gICAgaWYgKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICAgICAoKihoKS0+ZnJlZWZ1bikgKChoKS0+ZXh0cmFfYXJnLCAob2xkX2NodW5rKSk7IFwKLSAgICBlbHNlIFwKLSAgICAgICgqKHZvaWQgKCopICgpKSAoaCktPmZyZWVmdW4pICgob2xkX2NodW5rKSk7IFwKLSAgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0MCi0vKiBJbml0aWFsaXplIGFuIG9ic3RhY2sgSCBmb3IgdXNlLiAgU3BlY2lmeSBjaHVuayBzaXplIFNJWkUgKDAgbWVhbnMgZGVmYXVsdCkuCi0gICBPYmplY3RzIHN0YXJ0IG9uIG11bHRpcGxlcyBvZiBBTElHTk1FTlQgKDAgbWVhbnMgdXNlIGRlZmF1bHQpLgotICAgQ0hVTktGVU4gaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBhbGxvY2F0ZSBjaHVua3MsCi0gICBhbmQgRlJFRUZVTiB0aGUgZnVuY3Rpb24gdG8gZnJlZSB0aGVtLgotCi0gICBSZXR1cm4gbm9uemVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIG91dCBvZiBtZW1vcnkuCi0gICBUbyByZWNvdmVyIGZyb20gYW4gb3V0IG9mIG1lbW9yeSBlcnJvciwKLSAgIGZyZWUgdXAgc29tZSBtZW1vcnksIHRoZW4gY2FsbCB0aGlzIGFnYWluLiAgKi8KLQotaW50Ci1fb2JzdGFja19iZWdpbiAoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1bikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgYWxpZ25tZW50OwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pIChsb25nKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pICh2b2lkICopOwotI2Vsc2UKLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pICgpOwotI2VuZGlmCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7IC8qIHBvaW50cyB0byBuZXcgY2h1bmsgKi8KLQotICBpZiAoYWxpZ25tZW50ID09IDApCi0gICAgYWxpZ25tZW50ID0gKGludCkgREVGQVVMVF9BTElHTk1FTlQ7Ci0gIGlmIChzaXplID09IDApCi0gICAgLyogRGVmYXVsdCBzaXplIGlzIHdoYXQgR05VIG1hbGxvYyBjYW4gZml0IGluIGEgNDA5Ni1ieXRlIGJsb2NrLiAgKi8KLSAgICB7Ci0gICAgICAvKiAxMiBpcyBzaXplb2YgKG1oZWFkKSBhbmQgNCBpcyBFWFRSQSBmcm9tIEdOVSBtYWxsb2MuCi0JIFVzZSB0aGUgdmFsdWVzIGZvciByYW5nZSBjaGVja2luZywgYmVjYXVzZSBpZiByYW5nZSBjaGVja2luZyBpcyBvZmYsCi0JIHRoZSBleHRyYSBieXRlcyB3b24ndCBiZSBtaXNzZWQgdGVycmlibHksIGJ1dCBpZiByYW5nZSBjaGVja2luZyBpcyBvbgotCSBhbmQgd2UgdXNlZCBhIGxhcmdlciByZXF1ZXN0LCBhIHdob2xlIGV4dHJhIDQwOTYgYnl0ZXMgd291bGQgYmUKLQkgYWxsb2NhdGVkLgotCi0JIFRoZXNlIG51bWJlciBhcmUgaXJyZWxldmFudCB0byB0aGUgbmV3IEdOVSBtYWxsb2MuICBJIHN1c3BlY3QgaXQgaXMKLQkgbGVzcyBzZW5zaXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QuICAqLwotICAgICAgaW50IGV4dHJhID0gKCgoKDEyICsgREVGQVVMVF9ST1VORElORyAtIDEpICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpCi0JCSAgICArIDQgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkKLQkJICAgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSk7Ci0gICAgICBzaXplID0gNDA5NiAtIGV4dHJhOwotICAgIH0KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikodm9pZCAqLCBsb25nKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSAodm9pZCAoKikgKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopKSBmcmVlZnVuOwotI2Vsc2UKLSAgaC0+Y2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICogKCopKCkpIGNodW5rZnVuOwotICBoLT5mcmVlZnVuID0gZnJlZWZ1bjsKLSNlbmRpZgotICBoLT5jaHVua19zaXplID0gc2l6ZTsKLSAgaC0+YWxpZ25tZW50X21hc2sgPSBhbGlnbm1lbnQgLSAxOwotICBoLT51c2VfZXh0cmFfYXJnID0gMDsKLQotICBjaHVuayA9IGgtPmNodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgaCAtPiBjaHVua19zaXplKTsKLSAgaWYgKCFjaHVuaykKLSAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSA9IGNodW5rLT5jb250ZW50czsKLSAgaC0+Y2h1bmtfbGltaXQgPSBjaHVuay0+bGltaXQKLSAgICA9IChjaGFyICopIGNodW5rICsgaC0+Y2h1bmtfc2l6ZTsKLSAgY2h1bmstPnByZXYgPSAwOwotICAvKiBUaGUgaW5pdGlhbCBjaHVuayBub3cgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0LiAgKi8KLSAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKLSAgaC0+YWxsb2NfZmFpbGVkID0gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotX29ic3RhY2tfYmVnaW5fMSAoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gICAgIFBPSU5URVIgKCpjaHVua2Z1bikgKFBPSU5URVIsIGxvbmcpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKFBPSU5URVIsIFBPSU5URVIpOwotI2Vsc2UKLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pICgpOwotI2VuZGlmCi0gICAgIFBPSU5URVIgYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOyAvKiBwb2ludHMgdG8gbmV3IGNodW5rICovCi0KLSAgaWYgKGFsaWdubWVudCA9PSAwKQotICAgIGFsaWdubWVudCA9IChpbnQpIERFRkFVTFRfQUxJR05NRU5UOwotICBpZiAoc2l6ZSA9PSAwKQotICAgIC8qIERlZmF1bHQgc2l6ZSBpcyB3aGF0IEdOVSBtYWxsb2MgY2FuIGZpdCBpbiBhIDQwOTYtYnl0ZSBibG9jay4gICovCi0gICAgewotICAgICAgLyogMTIgaXMgc2l6ZW9mIChtaGVhZCkgYW5kIDQgaXMgRVhUUkEgZnJvbSBHTlUgbWFsbG9jLgotCSBVc2UgdGhlIHZhbHVlcyBmb3IgcmFuZ2UgY2hlY2tpbmcsIGJlY2F1c2UgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb2ZmLAotCSB0aGUgZXh0cmEgYnl0ZXMgd29uJ3QgYmUgbWlzc2VkIHRlcnJpYmx5LCBidXQgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb24KLQkgYW5kIHdlIHVzZWQgYSBsYXJnZXIgcmVxdWVzdCwgYSB3aG9sZSBleHRyYSA0MDk2IGJ5dGVzIHdvdWxkIGJlCi0JIGFsbG9jYXRlZC4KLQotCSBUaGVzZSBudW1iZXIgYXJlIGlycmVsZXZhbnQgdG8gdGhlIG5ldyBHTlUgbWFsbG9jLiAgSSBzdXNwZWN0IGl0IGlzCi0JIGxlc3Mgc2Vuc2l0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0LiAgKi8KLSAgICAgIGludCBleHRyYSA9ICgoKCgxMiArIERFRkFVTFRfUk9VTkRJTkcgLSAxKSAmIH4oREVGQVVMVF9ST1VORElORyAtIDEpKQotCQkgICAgKyA0ICsgREVGQVVMVF9ST1VORElORyAtIDEpCi0JCSAgICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpOwotICAgICAgc2l6ZSA9IDQwOTYgLSBleHRyYTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSAmJiBfX1NURENfXwotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikodm9pZCAqLGxvbmcpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9ICh2b2lkICgqKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIGZyZWVmdW47Ci0jZWxzZQotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikoKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSBmcmVlZnVuOwotI2VuZGlmCi0gIGgtPmNodW5rX3NpemUgPSBzaXplOwotICBoLT5hbGlnbm1lbnRfbWFzayA9IGFsaWdubWVudCAtIDE7Ci0gIGgtPmV4dHJhX2FyZyA9IGFyZzsKLSAgaC0+dXNlX2V4dHJhX2FyZyA9IDE7Ci0KLSAgY2h1bmsgPSBoLT5jaHVuayA9IENBTExfQ0hVTktGVU4gKGgsIGggLT4gY2h1bmtfc2l6ZSk7Ci0gIGlmICghY2h1bmspCi0gICAgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKTsKLSAgaC0+bmV4dF9mcmVlID0gaC0+b2JqZWN0X2Jhc2UgPSBjaHVuay0+Y29udGVudHM7Ci0gIGgtPmNodW5rX2xpbWl0ID0gY2h1bmstPmxpbWl0Ci0gICAgPSAoY2hhciAqKSBjaHVuayArIGgtPmNodW5rX3NpemU7Ci0gIGNodW5rLT5wcmV2ID0gMDsKLSAgLyogVGhlIGluaXRpYWwgY2h1bmsgbm93IGNvbnRhaW5zIG5vIGVtcHR5IG9iamVjdC4gICovCi0gIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDA7Ci0gIGgtPmFsbG9jX2ZhaWxlZCA9IDA7Ci0gIHJldHVybiAxOwotfQotCi0vKiBBbGxvY2F0ZSBhIG5ldyBjdXJyZW50IGNodW5rIGZvciB0aGUgb2JzdGFjayAqSAotICAgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBMRU5HVEggYnl0ZXMgbmVlZCB0byBiZSBhZGRlZAotICAgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LCBvciBhIG5ldyBvYmplY3Qgb2YgbGVuZ3RoIExFTkdUSCBhbGxvY2F0ZWQuCi0gICBDb3BpZXMgYW55IHBhcnRpYWwgb2JqZWN0IGZyb20gdGhlIGVuZCBvZiB0aGUgb2xkIGNodW5rCi0gICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgb25lLiAgKi8KLQotdm9pZAotX29ic3RhY2tfbmV3Y2h1bmsgKGgsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqb2xkX2NodW5rID0gaC0+Y2h1bms7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbmV3X2NodW5rOwotICByZWdpc3RlciBsb25nCW5ld19zaXplOwotICByZWdpc3RlciBsb25nIG9ial9zaXplID0gaC0+bmV4dF9mcmVlIC0gaC0+b2JqZWN0X2Jhc2U7Ci0gIHJlZ2lzdGVyIGxvbmcgaTsKLSAgbG9uZyBhbHJlYWR5OwotCi0gIC8qIENvbXB1dGUgc2l6ZSBmb3IgbmV3IGNodW5rLiAgKi8KLSAgbmV3X3NpemUgPSAob2JqX3NpemUgKyBsZW5ndGgpICsgKG9ial9zaXplID4+IDMpICsgMTAwOwotICBpZiAobmV3X3NpemUgPCBoLT5jaHVua19zaXplKQotICAgIG5ld19zaXplID0gaC0+Y2h1bmtfc2l6ZTsKLQotICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbmV3IGNodW5rLiAgKi8KLSAgbmV3X2NodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgbmV3X3NpemUpOwotICBpZiAoIW5ld19jaHVuaykKLSAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotICBoLT5jaHVuayA9IG5ld19jaHVuazsKLSAgbmV3X2NodW5rLT5wcmV2ID0gb2xkX2NodW5rOwotICBuZXdfY2h1bmstPmxpbWl0ID0gaC0+Y2h1bmtfbGltaXQgPSAoY2hhciAqKSBuZXdfY2h1bmsgKyBuZXdfc2l6ZTsKLQotICAvKiBNb3ZlIHRoZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIG5ldyBjaHVuay4KLSAgICAgV29yZCBhdCBhIHRpbWUgaXMgZmFzdCBhbmQgaXMgc2FmZSBpZiB0aGUgb2JqZWN0Ci0gICAgIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLiAgKi8KLSAgaWYgKGgtPmFsaWdubWVudF9tYXNrICsgMSA+PSBERUZBVUxUX0FMSUdOTUVOVCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBvYmpfc2l6ZSAvIHNpemVvZiAoQ09QWUlOR19VTklUKSAtIDE7Ci0JICAgaSA+PSAwOyBpLS0pCi0JKChDT1BZSU5HX1VOSVQgKiluZXdfY2h1bmstPmNvbnRlbnRzKVtpXQotCSAgPSAoKENPUFlJTkdfVU5JVCAqKWgtPm9iamVjdF9iYXNlKVtpXTsKLSAgICAgIC8qIFdlIHVzZWQgdG8gY29weSB0aGUgb2RkIGZldyByZW1haW5pbmcgYnl0ZXMgYXMgb25lIGV4dHJhIENPUFlJTkdfVU5JVCwKLQkgYnV0IHRoYXQgY2FuIGNyb3NzIGEgcGFnZSBib3VuZGFyeSBvbiBhIG1hY2hpbmUKLQkgd2hpY2ggZG9lcyBub3QgZG8gc3RyaWN0IGFsaWdubWVudCBmb3IgQ09QWUlOR19VTklUUy4gICovCi0gICAgICBhbHJlYWR5ID0gb2JqX3NpemUgLyBzaXplb2YgKENPUFlJTkdfVU5JVCkgKiBzaXplb2YgKENPUFlJTkdfVU5JVCk7Ci0gICAgfQotICBlbHNlCi0gICAgYWxyZWFkeSA9IDA7Ci0gIC8qIENvcHkgcmVtYWluaW5nIGJ5dGVzIG9uZSBieSBvbmUuICAqLwotICBmb3IgKGkgPSBhbHJlYWR5OyBpIDwgb2JqX3NpemU7IGkrKykKLSAgICBuZXdfY2h1bmstPmNvbnRlbnRzW2ldID0gaC0+b2JqZWN0X2Jhc2VbaV07Ci0KLSAgLyogSWYgdGhlIG9iamVjdCBqdXN0IGNvcGllZCB3YXMgdGhlIG9ubHkgZGF0YSBpbiBPTERfQ0hVTkssCi0gICAgIGZyZWUgdGhhdCBjaHVuayBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGNoYWluLgotICAgICBCdXQgbm90IGlmIHRoYXQgY2h1bmsgbWlnaHQgY29udGFpbiBhbiBlbXB0eSBvYmplY3QuICAqLwotICBpZiAoaC0+b2JqZWN0X2Jhc2UgPT0gb2xkX2NodW5rLT5jb250ZW50cyAmJiAhIGgtPm1heWJlX2VtcHR5X29iamVjdCkKLSAgICB7Ci0gICAgICBuZXdfY2h1bmstPnByZXYgPSBvbGRfY2h1bmstPnByZXY7Ci0gICAgICBDQUxMX0ZSRUVGVU4gKGgsIG9sZF9jaHVuayk7Ci0gICAgfQotCi0gIGgtPm9iamVjdF9iYXNlID0gbmV3X2NodW5rLT5jb250ZW50czsKLSAgaC0+bmV4dF9mcmVlID0gaC0+b2JqZWN0X2Jhc2UgKyBvYmpfc2l6ZTsKLSAgLyogVGhlIG5ldyBjaHVuayBjZXJ0YWlubHkgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0IHlldC4gICovCi0gIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDA7Ci19Ci0KLS8qIFJldHVybiBub256ZXJvIGlmIG9iamVjdCBPQkogaGFzIGJlZW4gYWxsb2NhdGVkIGZyb20gb2JzdGFjayBILgotICAgVGhpcyBpcyBoZXJlIGZvciBkZWJ1Z2dpbmcuCi0gICBJZiB5b3UgdXNlIGl0IGluIGEgcHJvZ3JhbSwgeW91IGFyZSBwcm9iYWJseSBsb3NpbmcuICAqLwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0vKiBTdXBwcmVzcyAtV21pc3NpbmctcHJvdG90eXBlcyB3YXJuaW5nLiAgV2UgZG9uJ3Qgd2FudCB0byBkZWNsYXJlIHRoaXMgaW4KLSAgIG9ic3RhY2suaCBiZWNhdXNlIGl0IGlzIGp1c3QgZm9yIGRlYnVnZ2luZy4gICovCi1pbnQgX29ic3RhY2tfYWxsb2NhdGVkX3AgKHN0cnVjdCBvYnN0YWNrICpoLCBQT0lOVEVSIG9iaik7Ci0jZW5kaWYKLQotaW50Ci1fb2JzdGFja19hbGxvY2F0ZWRfcCAoaCwgb2JqKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgUE9JTlRFUiBvYmo7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbHA7CS8qIGJlbG93IGFkZHIgb2YgYW55IG9iamVjdHMgaW4gdGhpcyBjaHVuayAqLwotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnBscDsJLyogcG9pbnQgdG8gcHJldmlvdXMgY2h1bmsgaWYgYW55ICovCi0KLSAgbHAgPSAoaCktPmNodW5rOwotICAvKiBXZSB1c2UgPj0gcmF0aGVyIHRoYW4gPiBzaW5jZSB0aGUgb2JqZWN0IGNhbm5vdCBiZSBleGFjdGx5IGF0Ci0gICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNodW5rIGJ1dCBtaWdodCBiZSBhbiBlbXB0eSBvYmplY3QgZXhhY3RseQotICAgICBhdCB0aGUgZW5kIG9mIGFuIGFkamFjZW50IGNodW5rLiAgKi8KLSAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKLSAgICB7Ci0gICAgICBwbHAgPSBscC0+cHJldjsKLSAgICAgIGxwID0gcGxwOwotICAgIH0KLSAgcmV0dXJuIGxwICE9IDA7Ci19Ci0MCi0vKiBGcmVlIG9iamVjdHMgaW4gb2JzdGFjayBILCBpbmNsdWRpbmcgT0JKIGFuZCBldmVyeXRoaW5nIGFsbG9jYXRlCi0gICBtb3JlIHJlY2VudGx5IHRoYW4gT0JKLiAgSWYgT0JKIGlzIHplcm8sIGZyZWUgZXZlcnl0aGluZyBpbiBILiAgKi8KLQotI3VuZGVmIG9ic3RhY2tfZnJlZQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhcyB0d28gbmFtZXMgd2l0aCBpZGVudGljYWwgZGVmaW5pdGlvbnMuCi0gICBUaGlzIGlzIHRoZSBmaXJzdCBvbmUsIGNhbGxlZCBmcm9tIG5vbi1BTlNJIGNvZGUuICAqLwotCi12b2lkCi1fb2JzdGFja19mcmVlIChoLCBvYmopCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBQT0lOVEVSIG9iajsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpscDsJLyogYmVsb3cgYWRkciBvZiBhbnkgb2JqZWN0cyBpbiB0aGlzIGNodW5rICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcGxwOwkvKiBwb2ludCB0byBwcmV2aW91cyBjaHVuayBpZiBhbnkgKi8KLQotICBscCA9IGgtPmNodW5rOwotICAvKiBXZSB1c2UgPj0gYmVjYXVzZSB0aGVyZSBjYW5ub3QgYmUgYW4gb2JqZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjaHVuay4KLSAgICAgQnV0IHRoZXJlIGNhbiBiZSBhbiBlbXB0eSBvYmplY3QgYXQgdGhhdCBhZGRyZXNzCi0gICAgIGF0IHRoZSBlbmQgb2YgYW5vdGhlciBjaHVuay4gICovCi0gIHdoaWxlIChscCAhPSAwICYmICgoUE9JTlRFUikgbHAgPj0gb2JqIHx8IChQT0lOVEVSKSAobHApLT5saW1pdCA8IG9iaikpCi0gICAgewotICAgICAgcGxwID0gbHAtPnByZXY7Ci0gICAgICBDQUxMX0ZSRUVGVU4gKGgsIGxwKTsKLSAgICAgIGxwID0gcGxwOwotICAgICAgLyogSWYgd2Ugc3dpdGNoIGNodW5rcywgd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHRoZSBuZXcgY3VycmVudAotCSBjaHVuayBjb250YWlucyBhbiBlbXB0eSBvYmplY3QsIHNvIGFzc3VtZSB0aGF0IGl0IG1heS4gICovCi0gICAgICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxOwotICAgIH0KLSAgaWYgKGxwKQotICAgIHsKLSAgICAgIGgtPm9iamVjdF9iYXNlID0gaC0+bmV4dF9mcmVlID0gKGNoYXIgKikgKG9iaik7Ci0gICAgICBoLT5jaHVua19saW1pdCA9IGxwLT5saW1pdDsKLSAgICAgIGgtPmNodW5rID0gbHA7Ci0gICAgfQotICBlbHNlIGlmIChvYmogIT0gMCkKLSAgICAvKiBvYmogaXMgbm90IGluIGFueSBvZiB0aGUgY2h1bmtzISAqLwotICAgIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZnJvbSBBTlNJIGNvZGUuICAqLwotCi12b2lkCi1vYnN0YWNrX2ZyZWUgKGgsIG9iaikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIFBPSU5URVIgb2JqOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmxwOwkvKiBiZWxvdyBhZGRyIG9mIGFueSBvYmplY3RzIGluIHRoaXMgY2h1bmsgKi8KLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpwbHA7CS8qIHBvaW50IHRvIHByZXZpb3VzIGNodW5rIGlmIGFueSAqLwotCi0gIGxwID0gaC0+Y2h1bms7Ci0gIC8qIFdlIHVzZSA+PSBiZWNhdXNlIHRoZXJlIGNhbm5vdCBiZSBhbiBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNodW5rLgotICAgICBCdXQgdGhlcmUgY2FuIGJlIGFuIGVtcHR5IG9iamVjdCBhdCB0aGF0IGFkZHJlc3MKLSAgICAgYXQgdGhlIGVuZCBvZiBhbm90aGVyIGNodW5rLiAgKi8KLSAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKLSAgICB7Ci0gICAgICBwbHAgPSBscC0+cHJldjsKLSAgICAgIENBTExfRlJFRUZVTiAoaCwgbHApOwotICAgICAgbHAgPSBwbHA7Ci0gICAgICAvKiBJZiB3ZSBzd2l0Y2ggY2h1bmtzLCB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhlIG5ldyBjdXJyZW50Ci0JIGNodW5rIGNvbnRhaW5zIGFuIGVtcHR5IG9iamVjdCwgc28gYXNzdW1lIHRoYXQgaXQgbWF5LiAgKi8KLSAgICAgIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7Ci0gICAgfQotICBpZiAobHApCi0gICAgewotICAgICAgaC0+b2JqZWN0X2Jhc2UgPSBoLT5uZXh0X2ZyZWUgPSAoY2hhciAqKSAob2JqKTsKLSAgICAgIGgtPmNodW5rX2xpbWl0ID0gbHAtPmxpbWl0OwotICAgICAgaC0+Y2h1bmsgPSBscDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9iaiAhPSAwKQotICAgIC8qIG9iaiBpcyBub3QgaW4gYW55IG9mIHRoZSBjaHVua3MhICovCi0gICAgYWJvcnQgKCk7Ci19Ci0MCi1pbnQKLV9vYnN0YWNrX21lbW9yeV91c2VkIChoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rKiBscDsKLSAgcmVnaXN0ZXIgaW50IG5ieXRlcyA9IDA7Ci0KLSAgZm9yIChscCA9IGgtPmNodW5rOyBscCAhPSAwOyBscCA9IGxwLT5wcmV2KQotICAgIHsKLSAgICAgIG5ieXRlcyArPSBscC0+bGltaXQgLSAoY2hhciAqKSBscDsKLSAgICB9Ci0gIHJldHVybiBuYnl0ZXM7Ci19Ci0MCi0vKiBEZWZpbmUgdGhlIGVycm9yIGhhbmRsZXIuICAqLwotI2lmbmRlZiBfCi0jIGlmZGVmIEhBVkVfTElCSU5UTF9ICi0jICBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jICBpZm5kZWYgXwotIyAgIGRlZmluZSBfKFN0cikgZ2V0dGV4dCAoU3RyKQotIyAgZW5kaWYKLSMgZWxzZQotIyAgZGVmaW5lIF8oU3RyKSAoU3RyKQotIyBlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hbmRfYWJvcnQgKCkKLXsKLSAgZnB1dHMgKF8oIm1lbW9yeSBleGhhdXN0ZWRcbiIpLCBzdGRlcnIpOwotICBleGl0IChvYnN0YWNrX2V4aXRfZmFpbHVyZSk7Ci19Ci0MCi0jaWYgMAotLyogVGhlc2UgYXJlIG5vdyB0dXJuZWQgb2ZmIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlIGl0Ci0gICBhbmQgaXQgdXNlcyBiY29weSB2aWEgb2JzdGFja19ncm93LCB3aGljaCBjYXVzZXMgdHJvdWJsZSBvbiBzeXNWLiAgKi8KLQotLyogTm93IGRlZmluZSB0aGUgZnVuY3Rpb25hbCB2ZXJzaW9ucyBvZiB0aGUgb2JzdGFjayBtYWNyb3MuCi0gICBEZWZpbmUgdGhlbSB0byBzaW1wbHkgdXNlIHRoZSBjb3JyZXNwb25kaW5nIG1hY3JvcyB0byBkbyB0aGUgam9iLiAgKi8KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotLyogVGhlc2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMgZG8gbm90IHdvcmsgd2l0aCBub24tQU5TSSBwcmVwcm9jZXNzb3JzOwotICAgdGhleSB3b24ndCBwYXNzIHRocm91Z2ggdGhlIG1hY3JvIG5hbWVzIGluIHBhcmVudGhlc2VzLiAgKi8KLQotLyogVGhlIGZ1bmN0aW9uIG5hbWVzIGFwcGVhciBpbiBwYXJlbnRoZXNlcyBpbiBvcmRlciB0byBwcmV2ZW50Ci0gICB0aGUgbWFjcm8tZGVmaW5pdGlvbnMgb2YgdGhlIG5hbWVzIGZyb20gYmVpbmcgZXhwYW5kZWQgdGhlcmUuICAqLwotCi1QT0lOVEVSIChvYnN0YWNrX2Jhc2UpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfYmFzZSAob2JzdGFjayk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfbmV4dF9mcmVlKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX25leHRfZnJlZSAob2JzdGFjayk7Ci19Ci0KLWludCAob2JzdGFja19vYmplY3Rfc2l6ZSkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19vYmplY3Rfc2l6ZSAob2JzdGFjayk7Ci19Ci0KLWludCAob2JzdGFja19yb29tKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX3Jvb20gKG9ic3RhY2spOwotfQotCi1pbnQgKG9ic3RhY2tfbWFrZV9yb29tKSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfbWFrZV9yb29tIChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrX2dyb3cpIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfZ3JvdyAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotdm9pZCAob2JzdGFja19ncm93MCkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ncm93MCAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotdm9pZCAob2JzdGFja18xZ3JvdykgKG9ic3RhY2ssIGNoYXJhY3RlcikKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBjaGFyYWN0ZXI7Ci17Ci0gIG9ic3RhY2tfMWdyb3cgKG9ic3RhY2ssIGNoYXJhY3Rlcik7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfYmxhbmspIChvYnN0YWNrLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgbGVuZ3RoOwotewotICBvYnN0YWNrX2JsYW5rIChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrXzFncm93X2Zhc3QpIChvYnN0YWNrLCBjaGFyYWN0ZXIpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgY2hhcmFjdGVyOwotewotICBvYnN0YWNrXzFncm93X2Zhc3QgKG9ic3RhY2ssIGNoYXJhY3Rlcik7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfYmxhbmtfZmFzdCkgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfYmxhbmtfZmFzdCAob2JzdGFjaywgbGVuZ3RoKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19maW5pc2gpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfZmluaXNoIChvYnN0YWNrKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19hbGxvYykgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2FsbG9jIChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2NvcHkpIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2NvcHkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfY29weTApIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2NvcHkwIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi0jZW5kaWYgLyogX19TVERDX18gKi8KLQotI2VuZGlmIC8qIDAgKi8KLQotI2VuZGlmCS8qICFFTElERV9DT0RFICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcGFydGl0aW9uLmMgYi9saWJpYmVydHkvcGFydGl0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZDU4NDcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3BhcnRpdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qIExpc3QgaW1wbGVudGF0aW9uIG9mIGEgcGFydGl0aW9uIG9mIGNvbnNlY3V0aXZlIGludGVnZXJzLgotICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ29kZVNvdXJjZXJ5LCBMTEMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLQotICAgR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJwYXJ0aXRpb24uaCIKLQotLyogQ3JlYXRlcyBhIHBhcnRpdGlvbiBvZiBOVU1fRUxFTUVOVFMgZWxlbWVudHMuICBJbml0aWFsbHkgZWFjaAotICAgZWxlbWVudCBpcyBpbiBhIGNsYXNzIGJ5IGl0c2VsZi4gICovCi0KLXBhcnRpdGlvbgotcGFydGl0aW9uX25ldyAobnVtX2VsZW1lbnRzKQotICAgICBpbnQgbnVtX2VsZW1lbnRzOwotewotICBpbnQgZTsKLSAgCi0gIHBhcnRpdGlvbiBwYXJ0ID0gKHBhcnRpdGlvbikgCi0gICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcGFydGl0aW9uX2RlZikgKyAKLQkgICAgIChudW1fZWxlbWVudHMgLSAxKSAqIHNpemVvZiAoc3RydWN0IHBhcnRpdGlvbl9lbGVtKSk7Ci0gIHBhcnQtPm51bV9lbGVtZW50cyA9IG51bV9lbGVtZW50czsKLSAgZm9yIChlID0gMDsgZSA8IG51bV9lbGVtZW50czsgKytlKSAKLSAgICB7Ci0gICAgICBwYXJ0LT5lbGVtZW50c1tlXS5jbGFzc19lbGVtZW50ID0gZTsKLSAgICAgIHBhcnQtPmVsZW1lbnRzW2VdLm5leHQgPSAmKHBhcnQtPmVsZW1lbnRzW2VdKTsKLSAgICAgIHBhcnQtPmVsZW1lbnRzW2VdLmNsYXNzX2NvdW50ID0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHBhcnQ7Ci19Ci0KLS8qIEZyZWVkcyBhIHBhcnRpdGlvbi4gICovCi0KLXZvaWQKLXBhcnRpdGlvbl9kZWxldGUgKHBhcnQpCi0gICAgICBwYXJ0aXRpb24gcGFydDsKLXsKLSAgZnJlZSAocGFydCk7Ci19Ci0KLS8qIFVuaXRlcyB0aGUgY2xhc3NlcyBjb250YWluaW5nIEVMRU0xIGFuZCBFTEVNMiBpbnRvIGEgc2luZ2xlIGNsYXNzCi0gICBvZiBwYXJ0aXRpb24gUEFSVC4gIElmIEVMRU0xIGFuZCBFTEVNMiBhcmUgYWxyZWFkeSBpbiB0aGUgc2FtZQotICAgY2xhc3MsIGRvZXMgbm90aGluZy4gIFJldHVybnMgdGhlIGNhbm9uaWNhbCBlbGVtZW50IG9mIHRoZQotICAgcmVzdWx0aW5nIHVuaW9uIGNsYXNzLiAgKi8KLQotaW50Ci1wYXJ0aXRpb25fdW5pb24gKHBhcnQsIGVsZW0xLCBlbGVtMikKLSAgICAgcGFydGl0aW9uIHBhcnQ7Ci0gICAgIGludCBlbGVtMTsKLSAgICAgaW50IGVsZW0yOwotewotICBzdHJ1Y3QgcGFydGl0aW9uX2VsZW0gKmVsZW1lbnRzID0gcGFydC0+ZWxlbWVudHM7Ci0gIHN0cnVjdCBwYXJ0aXRpb25fZWxlbSAqZTE7Ci0gIHN0cnVjdCBwYXJ0aXRpb25fZWxlbSAqZTI7Ci0gIHN0cnVjdCBwYXJ0aXRpb25fZWxlbSAqcDsKLSAgc3RydWN0IHBhcnRpdGlvbl9lbGVtICpvbGRfbmV4dDsKLSAgLyogVGhlIGNhbm9uaWNhbCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgdW5pb24gY2xhc3MuICAqLwotICBpbnQgY2xhc3NfZWxlbWVudCA9IGVsZW1lbnRzW2VsZW0xXS5jbGFzc19lbGVtZW50OwotCi0gIC8qIElmIHRoZXkncmUgYWxyZWFkeSBpbiB0aGUgc2FtZSBjbGFzcywgZG8gbm90aGluZy4gICovCi0gIGlmIChjbGFzc19lbGVtZW50ID09IGVsZW1lbnRzW2VsZW0yXS5jbGFzc19lbGVtZW50KQotICAgIHJldHVybiBjbGFzc19lbGVtZW50OwotCi0gIC8qIE1ha2Ugc3VyZSBFTEVNMSBpcyBpbiB0aGUgbGFyZ2VyIGNsYXNzIG9mIHRoZSB0d28uICBJZiBub3QsIHN3YXAKLSAgICAgdGhlbS4gIFRoaXMgd2F5IHdlIGFsd2F5cyBzY2FuIHRoZSBzaG9ydGVyIGxpc3QuICAqLwotICBpZiAoZWxlbWVudHNbZWxlbTFdLmNsYXNzX2NvdW50IDwgZWxlbWVudHNbZWxlbTJdLmNsYXNzX2NvdW50KSAKLSAgICB7Ci0gICAgICBpbnQgdGVtcCA9IGVsZW0xOwotICAgICAgZWxlbTEgPSBlbGVtMjsKLSAgICAgIGVsZW0yID0gdGVtcDsKLSAgICAgIGNsYXNzX2VsZW1lbnQgPSBlbGVtZW50c1tlbGVtMV0uY2xhc3NfZWxlbWVudDsKLSAgICB9Ci0KLSAgZTEgPSAmKGVsZW1lbnRzW2VsZW0xXSk7Ci0gIGUyID0gJihlbGVtZW50c1tlbGVtMl0pOwotCi0gIC8qIEtlZXAgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LiAgKi8KLSAgZWxlbWVudHNbY2xhc3NfZWxlbWVudF0uY2xhc3NfY291bnQgCi0gICAgKz0gZWxlbWVudHNbZTItPmNsYXNzX2VsZW1lbnRdLmNsYXNzX2NvdW50OwotCi0gIC8qIFVwZGF0ZSB0aGUgY2xhc3MgZmllbGRzIGluIGVsZW0yJ3MgY2xhc3MgbGlzdC4gICovCi0gIGUyLT5jbGFzc19lbGVtZW50ID0gY2xhc3NfZWxlbWVudDsKLSAgZm9yIChwID0gZTItPm5leHQ7IHAgIT0gZTI7IHAgPSBwLT5uZXh0KQotICAgIHAtPmNsYXNzX2VsZW1lbnQgPSBjbGFzc19lbGVtZW50OwotICAKLSAgLyogU3BsaWNlIEVMRU0yJ3MgY2xhc3MgbGlzdCBpbnRvIEVMRU0xJ3MuICBUaGVzZSBhcmUgY2lyY3VsYXIKLSAgICAgbGlzdHMuICAqLwotICBvbGRfbmV4dCA9IGUxLT5uZXh0OwotICBlMS0+bmV4dCA9IGUyLT5uZXh0OwotICBlMi0+bmV4dCA9IG9sZF9uZXh0OwotCi0gIHJldHVybiBjbGFzc19lbGVtZW50OwotfQotCi0vKiBDb21wYXJlIGVsZW1lbnRzIEVMRU0xIGFuZCBFTEVNMiBmcm9tIGFycmF5IG9mIGludGVnZXJzLCBnaXZlbiBhCi0gICBwb2ludGVyIHRvIGVhY2guICBVc2VkIHRvIHFzb3J0IHN1Y2ggYW4gYXJyYXkuICAqLwotCi1zdGF0aWMgaW50IAotZWxlbV9jb21wYXJlIChlbGVtMSwgZWxlbTIpCi0gICAgIGNvbnN0IHZvaWQgKmVsZW0xOwotICAgICBjb25zdCB2b2lkICplbGVtMjsKLXsKLSAgaW50IGUxID0gKiAoaW50ICopIGVsZW0xOwotICBpbnQgZTIgPSAqIChpbnQgKikgZWxlbTI7Ci0gIGlmIChlMSA8IGUyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoZTEgPiBlMikKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQcmludHMgUEFSVCB0byB0aGUgZmlsZSBwb2ludGVyIEZQLiAgVGhlIGVsZW1lbnRzIG9mIGVhY2gKLSAgIGNsYXNzIGFyZSBzb3J0ZWQuICAqLwotCi12b2lkCi1wYXJ0aXRpb25fcHJpbnQgKHBhcnQsIGZwKQotICAgICBwYXJ0aXRpb24gcGFydDsKLSAgICAgRklMRSAqZnA7Ci17Ci0gIGNoYXIgKmRvbmU7Ci0gIGludCBudW1fZWxlbWVudHMgPSBwYXJ0LT5udW1fZWxlbWVudHM7Ci0gIHN0cnVjdCBwYXJ0aXRpb25fZWxlbSAqZWxlbWVudHMgPSBwYXJ0LT5lbGVtZW50czsKLSAgaW50ICpjbGFzc19lbGVtZW50czsKLSAgaW50IGU7Ci0KLSAgLyogRmxhZyB0aGUgZWxlbWVudHMgd2UndmUgYWxyZWFkeSBwcmludGVkLiAgKi8KLSAgZG9uZSA9IChjaGFyICopIHhtYWxsb2MgKG51bV9lbGVtZW50cyk7Ci0gIG1lbXNldCAoZG9uZSwgMCwgbnVtX2VsZW1lbnRzKTsKLQotICAvKiBBIGJ1ZmZlciB1c2VkIHRvIHNvcnQgZWxlbWVudHMgaW4gYSBjbGFzcy4gICovCi0gIGNsYXNzX2VsZW1lbnRzID0gKGludCAqKSB4bWFsbG9jIChudW1fZWxlbWVudHMgKiBzaXplb2YgKGludCkpOwotCi0gIGZwdXRjICgnWycsIGZwKTsKLSAgZm9yIChlID0gMDsgZSA8IG51bV9lbGVtZW50czsgKytlKQotICAgIC8qIElmIHdlIGhhdmVuJ3QgcHJpbnRlZCB0aGlzIGVsZW1lbnQsIHByaW50IGl0cyBlbnRpcmUgY2xhc3MuICAqLwotICAgIGlmICghIGRvbmVbZV0pIAotICAgICAgewotCWludCBjID0gZTsKLQlpbnQgY291bnQgPSBlbGVtZW50c1tlbGVtZW50c1tlXS5jbGFzc19lbGVtZW50XS5jbGFzc19jb3VudDsKLQlpbnQgaTsKLQotICAgICAgLyogQ29sbGVjdCB0aGUgZWxlbWVudHMgaW4gdGhpcyBjbGFzcy4gICovCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkgIGNsYXNzX2VsZW1lbnRzW2ldID0gYzsKLQkgIGRvbmVbY10gPSAxOwotCSAgYyA9IGVsZW1lbnRzW2NdLm5leHQgLSBlbGVtZW50czsKLQl9Ci0JLyogU29ydCB0aGVtLiAgKi8KLQlxc29ydCAoKHZvaWQgKikgY2xhc3NfZWxlbWVudHMsIGNvdW50LCBzaXplb2YgKGludCksICZlbGVtX2NvbXBhcmUpOwotCS8qIFByaW50IHRoZW0uICAqLwotCWZwdXRjICgnKCcsIGZwKTsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgCi0JICBmcHJpbnRmIChmcCwgaSA9PSAwID8gIiVkIiA6ICIgJWQiLCBjbGFzc19lbGVtZW50c1tpXSk7Ci0JZnB1dGMgKCcpJywgZnApOwotICAgICAgfQotICBmcHV0YyAoJ10nLCBmcCk7Ci0KLSAgZnJlZSAoZG9uZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9wZXhlY3V0ZS5jIGIvbGliaWJlcnR5L3BleGVjdXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZGRlYzcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3BleGVjdXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzggKzAsMCBAQAotLyogVXRpbGl0aWVzIHRvIGV4ZWN1dGUgYSBwcm9ncmFtIGluIGEgc3VicHJvY2VzcyAocG9zc2libHkgbGlua2VkIGJ5IHBpcGVzCi0gICB3aXRoIG90aGVyIHN1YnByb2Nlc3NlcyksIGFuZCB3YWl0IGZvciBpdC4KLSAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLXdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGV4cG9ydHMgdHdvIGZ1bmN0aW9uczogcGV4ZWN1dGUgYW5kIHB3YWl0LiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGxpYmliZXJ0eSBhbmQgZ2NjLgotICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNkZWZpbmUgSVNTUEFDRSAoeCkgaXNzcGFjZSh4KQotI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIHZmb3JrIC8qIEF1dG9jb25mIG1heSBkZWZpbmUgdGhpcyB0byBmb3JrIGZvciB1cy4gKi8KLSMgZGVmaW5lIFZGT1JLX1NUUklORyAiZm9yayIKLSNlbHNlCi0jIGRlZmluZSBWRk9SS19TVFJJTkcgInZmb3JrIgotI2VuZGlmCi0jaWZkZWYgSEFWRV9WRk9SS19ICi0jaW5jbHVkZSA8dmZvcmsuaD4KLSNlbmRpZgotI2lmZGVmIFZNUwotI2RlZmluZSB2Zm9yaygpIChkZWNjJCRhbGxvY192Zm9ya19ibG9ja3MoKSA+PSAwID8gXAotICAgICAgICAgICAgICAgbGliJGdldF9jdXJyZW50X2ludm9fY29udGV4dChkZWNjJCRnZXRfdmZvcmtfam1wYnVmKCkpIDogLTEpCi0jZW5kaWYgLyogVk1TICovCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotLyogc3RkaW4gZmlsZSBudW1iZXIuICAqLwotI2RlZmluZSBTVERJTl9GSUxFX05PIDAKLQotLyogc3Rkb3V0IGZpbGUgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU1RET1VUX0ZJTEVfTk8gMQotCi0vKiB2YWx1ZSBvZiBgcGlwZSc6IHBvcnQgaW5kZXggZm9yIHJlYWRpbmcuICAqLwotI2RlZmluZSBSRUFEX1BPUlQgMAotCi0vKiB2YWx1ZSBvZiBgcGlwZSc6IHBvcnQgaW5kZXggZm9yIHdyaXRpbmcuICAqLwotI2RlZmluZSBXUklURV9QT1JUIDEKLQotc3RhdGljIGNoYXIgKmluc3RhbGxfZXJyb3JfbXNnID0gImluc3RhbGxhdGlvbiBwcm9ibGVtLCBjYW5ub3QgZXhlYyBgJXMnIjsKLQotLyogcGV4ZWN1dGU6IGV4ZWN1dGUgYSBwcm9ncmFtLgotCi0gICBQUk9HUkFNIGFuZCBBUkdWIGFyZSB0aGUgYXJndW1lbnRzIHRvIGV4ZWN2L2V4ZWN2cC4KLQotICAgVEhJU19QTkFNRSBpcyBuYW1lIG9mIHRoZSBjYWxsaW5nIHByb2dyYW0gKGkuZS4gYXJndlswXSkuCi0KLSAgIFRFTVBfQkFTRSBpcyB0aGUgcGF0aCBuYW1lLCBzYW5zIHN1ZmZpeCwgb2YgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLSAgIGlmIG5lZWRlZC4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBNU0RPUyBwb3J0cyB0aGF0IGRvbid0IHVzZQotICAgR08zMiAoZG8gYW55IHN0aWxsIGV4aXN0PykuICBQb3J0cyB0aGF0IGRvbid0IG5lZWQgaXQgY2FuIHBhc3MgTlVMTC4KLQotICAgKEZMQUdTICYgUEVYRUNVVEVfU0VBUkNIKSBpcyBub24temVybyBpZiAkUEFUSCBzaG91bGQgYmUgc2VhcmNoZWQKLSAgICg/Pz8gSXQncyBub3QgY2xlYXIgdGhhdCBHQ0MgcGFzc2VzIHRoaXMgZmxhZyBjb3JyZWN0bHkpLgotICAgKEZMQUdTICYgUEVYRUNVVEVfRklSU1QpIGlzIG5vbnplcm8gZm9yIHRoZSBmaXJzdCBwcm9jZXNzIGluIGNoYWluLgotICAgKEZMQUdTICYgUEVYRUNVVEVfRklSU1QpIGlzIG5vbnplcm8gZm9yIHRoZSBsYXN0IHByb2Nlc3MgaW4gY2hhaW4uCi0gICBGSVJTVF9MQVNUIGNvdWxkIGJlIHNpbXBsaWZpZWQgdG8gb25seSBtYXJrIHRoZSBsYXN0IG9mIGEgY2hhaW4gb2YgcHJvY2Vzc2VzCi0gICBidXQgdGhhdCByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIGFsd2F5cyBtYXJrIHRoZSBsYXN0IG9uZSAoYW5kIG5vdCBnaXZlIHVwCi0gICBlYXJseSBpZiBzb21lIGVycm9yIG9jY3VycykuICBJdCdzIG1vcmUgcm9idXN0IHRvIHJlcXVpcmUgdGhlIGNhbGxlciB0bwotICAgbWFyayBib3RoIGVuZHMgb2YgdGhlIGNoYWluLgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBwaWQgb24gc3lzdGVtcyBsaWtlIFVuaXggd2hlcmUgd2UgZm9yay9leGVjIGFuZCBvbiBzeXN0ZW1zCi0gICBsaWtlIFdJTjMyIGFuZCBPUzIgd2hlcmUgd2UgdXNlIHNwYXduLiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byB3YWl0IGZvcgotICAgdGhlIGNoaWxkLgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBXRVhJVFNUQVRVUyBvbiBzeXN0ZW1zIGxpa2UgTVNET1Mgd2hlcmUgd2Ugc3Bhd24gYW5kIHdhaXQKLSAgIGZvciB0aGUgY2hpbGQgaGVyZS4KLQotICAgVXBvbiBmYWlsdXJlLCBFUlJNU0dfRk1UIGFuZCBFUlJNU0dfQVJHIGFyZSBzZXQgdG8gdGhlIHRleHQgb2YgdGhlIGVycm9yCi0gICBtZXNzYWdlIHdpdGggYW4gb3B0aW9uYWwgYXJndW1lbnQgKGlmIG5vdCBuZWVkZWQsIEVSUk1TR19BUkcgaXMgc2V0IHRvCi0gICBOVUxMKSwgYW5kIC0xIGlzIHJldHVybmVkLiAgYGVycm5vJyBpcyBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byB1c2UuCi0KLSAgIHB3YWl0OiBjb3ZlciBmdW5jdGlvbiBmb3Igd2FpdC4KLQotICAgUElEIGlzIHRoZSBwcm9jZXNzIGlkIG9mIHRoZSB0YXNrIHRvIHdhaXQgZm9yLgotICAgU1RBVFVTIGlzIHRoZSBgc3RhdHVzJyBhcmd1bWVudCB0byB3YWl0LgotICAgRkxBR1MgaXMgY3VycmVudGx5IHVudXNlZCAoYWxsb3dzIGZ1dHVyZSBlbmhhbmNlbWVudCB3aXRob3V0IGJyZWFraW5nCi0gICB1cHdhcmQgY29tcGF0aWJpbGl0eSkuICBQYXNzIDAgZm9yIG5vdy4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgcGlkIG9mIHRoZSBjaGlsZCByZWFwZWQsCi0gICBvciAtMSBmb3IgZmFpbHVyZSAoZXJybm8gc2F5cyB3aHkpLgotCi0gICBPbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB3YWl0aW5nIGZvciBhIHBhcnRpY3VsYXIgY2hpbGQsIFBJRCBpcwotICAgaWdub3JlZC4gIE9uIHN5c3RlbXMgbGlrZSBNU0RPUyB0aGF0IGRvbid0IHJlYWxseSBtdWx0aXRhc2sgcHdhaXQKLSAgIGlzIGp1c3QgYSBtZWNoYW5pc20gdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIGZvciB0aGUgY2FsbGVyLgotCi0gICBwZmluaXNoOiBmaW5pc2ggZ2VuZXJhdGlvbiBvZiBzY3JpcHQKLQotICAgcGZpbmlzaCBpcyBuZWNlc3NhcnkgZm9yIHN5c3RlbXMgbGlrZSBNUFcgd2hlcmUgYSBzY3JpcHQgaXMgZ2VuZXJhdGVkIHRoYXQKLSAgIHJ1bnMgdGhlIHJlcXVlc3RlZCBwcm9ncmFtcy4KLSovCi0KLSNpZmRlZiBfX01TRE9TX18KLQotLyogTVNET1MgZG9lc24ndCBtdWx0aXRhc2ssIGJ1dCBmb3IgdGhlIHNha2Ugb2YgYSBjb25zaXN0ZW50IGludGVyZmFjZQotICAgdGhlIGNvZGUgYmVoYXZlcyBsaWtlIGl0IGRvZXMuICBwZXhlY3V0ZSBydW5zIHRoZSBwcm9ncmFtLCB0dWNrcyB0aGUKLSAgIGV4aXQgY29kZSBhd2F5LCBhbmQgcmV0dXJucyBhICJwaWQiLiAgcHdhaXQgbXVzdCBiZSBjYWxsZWQgdG8gZmV0Y2ggdGhlCi0gICBleGl0IGNvZGUuICAqLwotCi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotCi0vKiBGb3IgY29tbXVuaWNhdGluZyBpbmZvcm1hdGlvbiBmcm9tIHBleGVjdXRlIHRvIHB3YWl0LiAgKi8KLXN0YXRpYyBpbnQgbGFzdF9waWQgPSAwOwotc3RhdGljIGludCBsYXN0X3N0YXR1cyA9IDA7Ci1zdGF0aWMgaW50IGxhc3RfcmVhcGVkID0gMDsKLQotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgaW50IHJjOwotCi0gIGxhc3RfcGlkKys7Ci0gIGlmIChsYXN0X3BpZCA8IDApCi0gICAgbGFzdF9waWQgPSAxOwotCi0gIGlmICgoZmxhZ3MgJiBQRVhFQ1VURV9PTkUpICE9IFBFWEVDVVRFX09ORSkKLSAgICBhYm9ydCAoKTsKLQotI2lmZGVmIF9fR08zMl9fCi0gIC8qID8/PyBXaGF0IGFyZSB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmcm9tIHNwYXdudj8gICovCi0gIHJjID0gKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gc3Bhd252cCA6IHNwYXdudikgKDEsIHByb2dyYW0sIGFyZ3YpOwotI2Vsc2UKLSAgY2hhciAqc2NtZCwgKnJmOwotICBGSUxFICphcmdmaWxlOwotICBpbnQgaSwgZWwgPSBmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IDQgOiAwOwotCi0gIGlmICh0ZW1wX2Jhc2UgPT0gMCkKLSAgICB0ZW1wX2Jhc2UgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICBzY21kID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChwcm9ncmFtKSArIHN0cmxlbiAodGVtcF9iYXNlKSArIDYgKyBlbCk7Ci0gIHJmID0gc2NtZCArIHN0cmxlbihwcm9ncmFtKSArIDIgKyBlbDsKLSAgc3ByaW50ZiAoc2NtZCwgIiVzJXMgQCVzLmdwIiwgcHJvZ3JhbSwKLQkgICAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyAiLmV4ZSIgOiAiIiksIHRlbXBfYmFzZSk7Ci0gIGFyZ2ZpbGUgPSBmb3BlbiAocmYsICJ3Iik7Ci0gIGlmIChhcmdmaWxlID09IDApCi0gICAgewotICAgICAgaW50IGVycm5vX3NhdmUgPSBlcnJubzsKLSAgICAgIGZyZWUgKHNjbWQpOwotICAgICAgZXJybm8gPSBlcnJub19zYXZlOwotICAgICAgKmVycm1zZ19mbXQgPSAiY2Fubm90IG9wZW4gYCVzLmdwJyI7Ci0gICAgICAqZXJybXNnX2FyZyA9IHRlbXBfYmFzZTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgZm9yIChpPTE7IGFyZ3ZbaV07IGkrKykKLSAgICB7Ci0gICAgICBjaGFyICpjcDsKLSAgICAgIGZvciAoY3AgPSBhcmd2W2ldOyAqY3A7IGNwKyspCi0JewotCSAgaWYgKCpjcCA9PSAnIicgfHwgKmNwID09ICdcJycgfHwgKmNwID09ICdcXCcgfHwgSVNTUEFDRSAoKmNwKSkKLQkgICAgZnB1dGMgKCdcXCcsIGFyZ2ZpbGUpOwotCSAgZnB1dGMgKCpjcCwgYXJnZmlsZSk7Ci0JfQotICAgICAgZnB1dGMgKCdcbicsIGFyZ2ZpbGUpOwotICAgIH0KLSAgZmNsb3NlIChhcmdmaWxlKTsKLQotICByYyA9IHN5c3RlbSAoc2NtZCk7Ci0KLSAgewotICAgIGludCBlcnJub19zYXZlID0gZXJybm87Ci0gICAgcmVtb3ZlIChyZik7Ci0gICAgZnJlZSAoc2NtZCk7Ci0gICAgZXJybm8gPSBlcnJub19zYXZlOwotICB9Ci0jZW5kaWYKLQotICBpZiAocmMgPT0gLTEpCi0gICAgewotICAgICAgKmVycm1zZ19mbXQgPSBpbnN0YWxsX2Vycm9yX21zZzsKLSAgICAgICplcnJtc2dfYXJnID0gcHJvZ3JhbTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogVHVjayB0aGUgc3RhdHVzIGF3YXkgZm9yIHB3YWl0LCBhbmQgcmV0dXJuIGEgInBpZCIuICAqLwotICBsYXN0X3N0YXR1cyA9IHJjIDw8IDg7Ci0gIHJldHVybiBsYXN0X3BpZDsKLX0KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotICAvKiBPbiBNU0RPUyBlYWNoIHBleGVjdXRlIG11c3QgYmUgZm9sbG93ZWQgYnkgaXQncyBhc3NvY2lhdGVkIHB3YWl0LiAgKi8KLSAgaWYgKHBpZCAhPSBsYXN0X3BpZAotICAgICAgLyogQ2FsbGVkIHR3aWNlIGZvciB0aGUgc2FtZSBjaGlsZD8gICovCi0gICAgICB8fCBwaWQgPT0gbGFzdF9yZWFwZWQpCi0gICAgewotICAgICAgLyogPz8/IEVDSElMRCB3b3VsZCBiZSBhIGJldHRlciBjaG9pY2UuICBDYW4gd2UgdXNlIGl0IGhlcmU/ICAqLwotICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLSAgKnN0YXR1cyA9IGxhc3Rfc3RhdHVzOwotICBsYXN0X3JlYXBlZCA9IGxhc3RfcGlkOwotICByZXR1cm4gbGFzdF9waWQ7Ci19Ci0KLSNlbmRpZiAvKiBNU0RPUyAqLwotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9VV0lOKQotCi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotCi0jaWZkZWYgX19DWUdXSU5fXwotCi0jZGVmaW5lIGZpeF9hcmd2KGFyZ3ZlYykgKGFyZ3ZlYykKLQotZXh0ZXJuIGludCBfc3Bhd252ICgpOwotZXh0ZXJuIGludCBfc3Bhd252cCAoKTsKLQotI2Vsc2UgLyogISBfX0NZR1dJTl9fICovCi0KLS8qIFRoaXMgaXMgYSBrbHVkZ2UgdG8gZ2V0IGFyb3VuZCB0aGUgTWljcm9zb2Z0IEMgc3Bhd24gZnVuY3Rpb25zJyBwcm9wZW5zaXR5Ci0gICB0byByZW1vdmUgdGhlIG91dGVybW9zdCBzZXQgb2YgZG91YmxlIHF1b3RlcyBmcm9tIGFsbCBhcmd1bWVudHMuICAqLwotCi1jb25zdCBjaGFyICogY29uc3QgKgotZml4X2FyZ3YgKGFyZ3ZlYykKLSAgICAgY2hhciAqKmFyZ3ZlYzsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMTsgYXJndmVjW2ldICE9IDA7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgbGVuLCBqOwotICAgICAgY2hhciAqdGVtcCwgKm5ld3RlbXA7Ci0KLSAgICAgIHRlbXAgPSBhcmd2ZWNbaV07Ci0gICAgICBsZW4gPSBzdHJsZW4gKHRlbXApOwotICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHRlbXBbal0gPT0gJyInKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXd0ZW1wID0geG1hbGxvYyAobGVuICsgMik7Ci0gICAgICAgICAgICAgIHN0cm5jcHkgKG5ld3RlbXAsIHRlbXAsIGopOwotICAgICAgICAgICAgICBuZXd0ZW1wIFtqXSA9ICdcXCc7Ci0gICAgICAgICAgICAgIHN0cm5jcHkgKCZuZXd0ZW1wIFtqKzFdLCAmdGVtcCBbal0sIGxlbi1qKTsKLSAgICAgICAgICAgICAgbmV3dGVtcCBbbGVuKzFdID0gMDsKLSAgICAgICAgICAgICAgdGVtcCA9IG5ld3RlbXA7Ci0gICAgICAgICAgICAgIGxlbisrOwotICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhcmd2ZWNbaV0gPSB0ZW1wOwotICAgICAgfQotCi0gIGZvciAoaSA9IDA7IGFyZ3ZlY1tpXSAhPSAwOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cnBicmsgKGFyZ3ZlY1tpXSwgIiBcdCIpKQotICAgICAgICB7Ci0JICBpbnQgbGVuLCB0cmFpbGluZ19iYWNrc2xhc2g7Ci0JICBjaGFyICp0ZW1wOwotCi0JICBsZW4gPSBzdHJsZW4gKGFyZ3ZlY1tpXSk7Ci0JICB0cmFpbGluZ19iYWNrc2xhc2ggPSAwOwotCi0JICAvKiBUaGVyZSBpcyBhbiBhZGRlZCBjb21wbGljYXRpb24gd2hlbiBhbiBhcmcgd2l0aCBlbWJlZGRlZCB3aGl0ZQotCSAgICAgc3BhY2UgZW5kcyBpbiBhIGJhY2tzbGFzaCAoc3VjaCBhcyBpbiB0aGUgY2FzZSBvZiAtaXByZWZpeCBhcmcKLQkgICAgIHBhc3NlZCB0byBjcHApLiBUaGUgcmVzdWx0aW5nIHF1b3RlZCBzdHJpbmdzIGdldHMgbWlzaW50ZXJwcmV0ZWQKLQkgICAgIGJ5IHRoZSBjb21tYW5kIGludGVycHJldGVyIC0tIGl0IHRoaW5rcyB0aGF0IHRoZSBlbmRpbmcgcXVvdGUKLQkgICAgIGlzIGVzY2FwZWQgYnkgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaCBhbmQgdGhpbmdzIGdldCBjb25mdXNlZC4gCi0JICAgICBXZSBoYW5kbGUgdGhpcyBjYXNlIGJ5IGVzY2FwaW5nIHRoZSB0cmFpbGluZyBiYWNrc2xhc2gsIHByb3ZpZGVkCi0JICAgICBpdCB3YXMgbm90IGVzY2FwZWQgaW4gdGhlIGZpcnN0IHBsYWNlLiAgKi8KLQkgIGlmIChsZW4gPiAxIAotCSAgICAgICYmIGFyZ3ZlY1tpXVtsZW4tMV0gPT0gJ1xcJyAKLQkgICAgICAmJiBhcmd2ZWNbaV1bbGVuLTJdICE9ICdcXCcpCi0JICAgIHsKLQkgICAgICB0cmFpbGluZ19iYWNrc2xhc2ggPSAxOwotCSAgICAgICsrbGVuOwkJCS8qIHRvIGVzY2FwZSB0aGUgZmluYWwgYmFja3NsYXNoLiAqLwotCSAgICB9Ci0KLQkgIGxlbiArPSAyOwkJCS8qIGFuZCBmb3IgdGhlIGVuY2xvc2luZyBxdW90ZXMuICovCi0KLQkgIHRlbXAgPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgIHRlbXBbMF0gPSAnIic7Ci0JICBzdHJjcHkgKHRlbXAgKyAxLCBhcmd2ZWNbaV0pOwotCSAgaWYgKHRyYWlsaW5nX2JhY2tzbGFzaCkKLQkgICAgdGVtcFtsZW4tMl0gPSAnXFwnOwotCSAgdGVtcFtsZW4tMV0gPSAnIic7Ci0JICB0ZW1wW2xlbl0gPSAnXDAnOwotCi0JICBhcmd2ZWNbaV0gPSB0ZW1wOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChjb25zdCBjaGFyICogY29uc3QgKikgYXJndmVjOwotfQotI2VuZGlmIC8qIF9fQ1lHV0lOX18gKi8KLQotI2luY2x1ZGUgPGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogbWluZ3czMiBoZWFkZXJzIG1heSBub3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcuICAqLwotCi0jaWZuZGVmIF9QX1dBSVQKLSMgIGRlZmluZSBfUF9XQUlUCTAKLSMgIGRlZmluZSBfUF9OT1dBSVQJMQotIyAgZGVmaW5lIF9QX09WRVJMQVkJMgotIyAgZGVmaW5lIF9QX05PV0FJVE8JMwotIyAgZGVmaW5lIF9QX0RFVEFDSAk0Ci0KLSMgIGRlZmluZSBXQUlUX0NISUxECTAKLSMgIGRlZmluZSBXQUlUX0dSQU5EQ0hJTEQJMQotI2VuZGlmCi0KLS8qIFdpbjMyIHN1cHBvcnRzIHBpcGVzICovCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgcGlkOwotICBpbnQgcGRlc1syXSwgb3JnX3N0ZGluLCBvcmdfc3Rkb3V0OwotICBpbnQgaW5wdXRfZGVzYywgb3V0cHV0X2Rlc2M7Ci0gIGludCByZXRyaWVzLCBzbGVlcF9pbnRlcnZhbDsKLQotICAvKiBQaXBlIHdhaXRpbmcgZnJvbSBsYXN0IHByb2Nlc3MsIHRvIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRoZSBuZXh0IG9uZS4KLSAgICAgVmFsdWUgaXMgU1RESU5fRklMRV9OTyBpZiBubyBwaXBlIGlzIHdhaXRpbmcKLSAgICAgKGkuZS4gdGhlIG5leHQgY29tbWFuZCBpcyB0aGUgZmlyc3Qgb2YgYSBncm91cCkuICAqLwotICBzdGF0aWMgaW50IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwcm9jZXNzLCBpbml0aWFsaXplLiAgKi8KLSAgaWYgKGZsYWdzICYgUEVYRUNVVEVfRklSU1QpCi0gICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKLQotICBpbnB1dF9kZXNjID0gbGFzdF9waXBlX2lucHV0OwotCi0gIC8qIElmIHRoaXMgaXNuJ3QgdGhlIGxhc3QgcHJvY2VzcywgbWFrZSBhIHBpcGUgZm9yIGl0cyBvdXRwdXQsCi0gICAgIGFuZCByZWNvcmQgaXQgYXMgd2FpdGluZyB0byBiZSB0aGUgaW5wdXQgdG8gdGhlIG5leHQgcHJvY2Vzcy4gICovCi0gIGlmICghIChmbGFncyAmIFBFWEVDVVRFX0xBU1QpKQotICAgIHsKLSAgICAgIGlmIChfcGlwZSAocGRlcywgMjU2LCBPX0JJTkFSWSkgPCAwKQotCXsKLQkgICplcnJtc2dfZm10ID0gInBpcGUiOwotCSAgKmVycm1zZ19hcmcgPSBOVUxMOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIG91dHB1dF9kZXNjID0gcGRlc1tXUklURV9QT1JUXTsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IHBkZXNbUkVBRF9QT1JUXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBMYXN0IHByb2Nlc3MuICAqLwotICAgICAgb3V0cHV0X2Rlc2MgPSBTVERPVVRfRklMRV9OTzsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0gICAgfQotCi0gIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0gICAgewotICAgICAgb3JnX3N0ZGluID0gZHVwIChTVERJTl9GSUxFX05PKTsKLSAgICAgIGR1cDIgKGlucHV0X2Rlc2MsIFNURElOX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKGlucHV0X2Rlc2MpOyAKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9kZXNjICE9IFNURE9VVF9GSUxFX05PKQotICAgIHsKLSAgICAgIG9yZ19zdGRvdXQgPSBkdXAgKFNURE9VVF9GSUxFX05PKTsKLSAgICAgIGR1cDIgKG91dHB1dF9kZXNjLCBTVERPVVRfRklMRV9OTyk7Ci0gICAgICBjbG9zZSAob3V0cHV0X2Rlc2MpOwotICAgIH0KLQotICBwaWQgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBfc3Bhd252cCA6IF9zcGF3bnYpCi0gICAgKF9QX05PV0FJVCwgcHJvZ3JhbSwgZml4X2FyZ3YoYXJndikpOwotCi0gIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0gICAgewotICAgICAgZHVwMiAob3JnX3N0ZGluLCBTVERJTl9GSUxFX05PKTsKLSAgICAgIGNsb3NlIChvcmdfc3RkaW4pOwotICAgIH0KLQotICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0gICAgewotICAgICAgZHVwMiAob3JnX3N0ZG91dCwgU1RET1VUX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKG9yZ19zdGRvdXQpOwotICAgIH0KLQotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgICplcnJtc2dfZm10ID0gaW5zdGFsbF9lcnJvcl9tc2c7Ci0gICAgICAqZXJybXNnX2FyZyA9IHByb2dyYW07Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBwaWQ7Ci19Ci0KLS8qIE1TIENSVERMTCBkb2Vzbid0IHJldHVybiBlbm91Z2ggaW5mb3JtYXRpb24gaW4gc3RhdHVzIHRvIGRlY2lkZSBpZiB0aGUKLSAgIGNoaWxkIGV4aXRlZCBkdWUgdG8gYSBzaWduYWwgb3Igbm90LCByYXRoZXIgaXQgc2ltcGx5IHJldHVybnMgYW4KLSAgIGludGVnZXIgd2l0aCB0aGUgZXhpdCBjb2RlIG9mIHRoZSBjaGlsZDsgZWcuLCBpZiB0aGUgY2hpbGQgZXhpdGVkIHdpdGggCi0gICBhbiBhYm9ydCgpIGNhbGwgYW5kIGRpZG4ndCBoYXZlIGEgaGFuZGxlciBmb3IgU0lHQUJSVCwgaXQgc2ltcGx5IHJldHVybnMKLSAgIHdpdGggc3RhdHVzID0gMy4gV2UgZml4IHRoZSBzdGF0dXMgY29kZSB0byBjb25mb3JtIHRvIHRoZSB1c3VhbCBXSUYqCi0gICBtYWNyb3MuIE5vdGUgdGhhdCBXSUZTSUdOQUxFRCB3aWxsIG5ldmVyIGJlIHRydWUgdW5kZXIgQ1JURExMLiAqLwotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0jaWZkZWYgX19DWUdXSU5fXwotICByZXR1cm4gd2FpdCAoc3RhdHVzKTsKLSNlbHNlCi0gIGludCB0ZXJtc3RhdDsKLQotICBwaWQgPSBfY3dhaXQgKCZ0ZXJtc3RhdCwgcGlkLCBXQUlUX0NISUxEKTsKLQotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLQotICAvKiBjd2FpdCByZXR1cm5zIHRoZSBjaGlsZCBwcm9jZXNzIGV4aXQgY29kZSBpbiB0ZXJtc3RhdC4KLSAgICAgQSB2YWx1ZSBvZiAzIGluZGljYXRlcyB0aGF0IHRoZSBjaGlsZCBjYXVnaHQgYSBzaWduYWwsIGJ1dCBub3QKLSAgICAgd2hpY2ggb25lLiAgU2luY2Ugb25seSBTSUdBQlJULCBTSUdGUEUgYW5kIFNJR0lOVCBkbyBhbnl0aGluZywgd2UKLSAgICAgcmVwb3J0IFNJR0FCUlQuICAqLwotICBpZiAodGVybXN0YXQgPT0gMykKLSAgICAqc3RhdHVzID0gU0lHQUJSVDsKLSAgZWxzZQotICAgICpzdGF0dXMgPSAoKCh0ZXJtc3RhdCkgJiAweGZmKSA8PCA4KTsKLQotICByZXR1cm4gcGlkOwotI2VuZGlmIC8qIF9fQ1lHV0lOX18gKi8KLX0KLQotI2VuZGlmIC8qIF9XSU4zMiAmJiAhIF9VV0lOICovCi0KLSNpZmRlZiBPUzIKLQotLyogPz8/IERvZXMgT1MyIGhhdmUgcHJvY2Vzcy5oPyAgKi8KLWV4dGVybiBpbnQgc3Bhd252ICgpOwotZXh0ZXJuIGludCBzcGF3bnZwICgpOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgcGlkOwotCi0gIGlmICgoZmxhZ3MgJiBQRVhFQ1VURV9PTkUpICE9IFBFWEVDVVRFX09ORSkKLSAgICBhYm9ydCAoKTsKLSAgLyogPz8/IFByZXN1bWFibHkgMSA9PSBfUF9OT1dBSVQuICAqLwotICBwaWQgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBzcGF3bnZwIDogc3Bhd252KSAoMSwgcHJvZ3JhbSwgYXJndik7Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgKmVycm1zZ19mbXQgPSBpbnN0YWxsX2Vycm9yX21zZzsKLSAgICAgICplcnJtc2dfYXJnID0gcHJvZ3JhbTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiBwaWQ7Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0gIGludCBwaWQgPSB3YWl0IChzdGF0dXMpOwotICByZXR1cm4gcGlkOwotfQotCi0jZW5kaWYgLyogT1MyICovCi0KLSNpZmRlZiBNUFcKLQotLyogTVBXIHBleGVjdXRlIGRvZXNuJ3QgYWN0dWFsbHkgcnVuIGFueXRoaW5nOyBpbnN0ZWFkLCBpdCB3cml0ZXMgb3V0Ci0gICBzY3JpcHQgY29tbWFuZHMgdGhhdCwgd2hlbiBydW4sIHdpbGwgZG8gdGhlIGFjdHVhbCBleGVjdXRpbmcuCi0KLSAgIEZvciBleGFtcGxlLCBpbiBHQ0MncyBjYXNlLCBHQ0Mgd2lsbCB3cml0ZSBvdXQgc2V2ZXJhbCBzY3JpcHQgY29tbWFuZHM6Ci0KLSAgIGNwcCAuLi4KLSAgIGNjMSAuLi4KLSAgIGFzIC4uLgotICAgbGQgLi4uCi0KLSAgIGFuZCB0aGVuIGV4aXQuICBOb25lIG9mIHRoZSBhYm92ZSBwcm9ncmFtcyB3aWxsIGhhdmUgcnVuIHlldC4gIFRoZSB0YXNrCi0gICB0aGF0IGNhbGxlZCBHQ0Mgd2lsbCB0aGVuIGV4ZWN1dGUgdGhlIHNjcmlwdCBhbmQgY2F1c2UgY3BwLGV0Yy4gdG8gcnVuLgotICAgVGhlIGNhbGxlciBtdXN0IGludm9rZSBwZmluaXNoIGJlZm9yZSBjYWxsaW5nIGV4aXQuICBUaGlzIGFkZHMKLSAgIHRoZSBmaW5pc2hpbmcgdG91Y2hlcyB0byB0aGUgZ2VuZXJhdGVkIHNjcmlwdC4gICovCi0KLXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7Ci0KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGNoYXIgdG1wcHJvZ3JhbVsyNTVdOwotICBjaGFyICpjcCwgKnRtcG5hbWU7Ci0gIGludCBpOwotCi0gIG1wd2lmeV9maWxlbmFtZSAocHJvZ3JhbSwgdG1wcHJvZ3JhbSk7Ci0gIGlmIChmaXJzdF90aW1lKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlNldCBGYWlsZWQgMFxuIik7Ci0gICAgICBmaXJzdF90aW1lID0gMDsKLSAgICB9Ci0KLSAgZnB1dHMgKCJJZiB7RmFpbGVkfSA9PSAwXG4iLCBzdGRvdXQpOwotICAvKiBJZiBiZWluZyB2ZXJib3NlLCBvdXRwdXQgYSBjb3B5IG9mIHRoZSBjb21tYW5kLiAgSXQgc2hvdWxkIGJlCi0gICAgIGFjY3VyYXRlIGVub3VnaCBhbmQgZXNjYXBlZCBlbm91Z2ggdG8gYmUgImNsaWNrYWJsZSIuICAqLwotICBpZiAoZmxhZ3MgJiBQRVhFQ1VURV9WRVJCT1NFKQotICAgIHsKLSAgICAgIGZwdXRzICgiXHRFY2hvICIsIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLSAgICAgIGZwdXRzICh0bXBwcm9ncmFtLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotICAgICAgZm9yIChpPTE7IGFyZ3ZbaV07IGkrKykKLQl7Ci0JICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLQkgIC8qIFNlZSBpZiB3ZSBoYXZlIGFuIGFyZ3VtZW50IHRoYXQgbmVlZHMgZml4aW5nLiAgKi8KLQkgIGlmIChzdHJjaHIoYXJndltpXSwgJy8nKSkKLQkgICAgewotCSAgICAgIHRtcG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyNTYpOwotCSAgICAgIG1wd2lmeV9maWxlbmFtZSAoYXJndltpXSwgdG1wbmFtZSk7Ci0JICAgICAgYXJndltpXSA9IHRtcG5hbWU7Ci0JICAgIH0KLQkgIGZvciAoY3AgPSBhcmd2W2ldOyAqY3A7IGNwKyspCi0JICAgIHsKLQkgICAgICAvKiBXcml0ZSBhbiBPcHRpb24tZCBlc2NhcGUgY2hhciBpbiBmcm9udCBvZiBzcGVjaWFsIGNoYXJzLiAgKi8KLQkgICAgICBpZiAoc3RyY2hyKCInKyIsICpjcCkpCi0JCWZwdXRjICgnXDI2NicsIHN0ZG91dCk7Ci0JICAgICAgZnB1dGMgKCpjcCwgc3Rkb3V0KTsKLQkgICAgfQotCSAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0JICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotCX0KLSAgICAgIGZwdXRzICgiXG4iLCBzdGRvdXQpOwotICAgIH0KLSAgZnB1dHMgKCJcdCIsIHN0ZG91dCk7Ci0gIGZwdXRzICh0bXBwcm9ncmFtLCBzdGRvdXQpOwotICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotCi0gIGZvciAoaT0xOyBhcmd2W2ldOyBpKyspCi0gICAgewotICAgICAgLyogU2VlIGlmIHdlIGhhdmUgYW4gYXJndW1lbnQgdGhhdCBuZWVkcyBmaXhpbmcuICAqLwotICAgICAgaWYgKHN0cmNocihhcmd2W2ldLCAnLycpKQotCXsKLQkgIHRtcG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyNTYpOwotCSAgbXB3aWZ5X2ZpbGVuYW1lIChhcmd2W2ldLCB0bXBuYW1lKTsKLQkgIGFyZ3ZbaV0gPSB0bXBuYW1lOwotCX0KLSAgICAgIGlmIChzdHJjaHIgKGFyZ3ZbaV0sICcgJykpCi0JZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmb3IgKGNwID0gYXJndltpXTsgKmNwOyBjcCsrKQotCXsKLQkgIC8qIFdyaXRlIGFuIE9wdGlvbi1kIGVzY2FwZSBjaGFyIGluIGZyb250IG9mIHNwZWNpYWwgY2hhcnMuICAqLwotCSAgaWYgKHN0cmNocigiJysiLCAqY3ApKQotCSAgICBmcHV0YyAoJ1wyNjYnLCBzdGRvdXQpOwotCSAgZnB1dGMgKCpjcCwgc3Rkb3V0KTsKLQl9Ci0gICAgICBpZiAoc3RyY2hyIChhcmd2W2ldLCAnICcpKQotCWZwdXRjICgnXCcnLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCcgJywgc3Rkb3V0KTsKLSAgICB9Ci0KLSAgZnB1dHMgKCJcbiIsIHN0ZG91dCk7Ci0KLSAgLyogT3V0cHV0IGNvbW1hbmRzIHRoYXQgYXJyYW5nZSB0byBjbGVhbiB1cCBhbmQgZXhpdCBpZiBhIGZhaWx1cmUgb2NjdXJzLgotICAgICBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gY29sbGVjdCB0aGUgc3RhdHVzIGZyb20gdGhlIHByb2dyYW0gdGhhdCB3YXMKLSAgICAgcnVuLCByYXRoZXIgdGhhbiBzb21lIG90aGVyIHNjcmlwdCBjb21tYW5kLiAgQWxzbywgd2UgZG9uJ3QgZXhpdAotICAgICBpbW1lZGlhdGVseSwgc2luY2UgbmVjZXNzYXJ5IGNsZWFudXBzIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzY3JpcHQuICAqLwotICBmcHV0cyAoIlx0U2V0IFRtcFN0YXR1cyB7U3RhdHVzfVxuIiwgc3Rkb3V0KTsKLSAgZnB1dHMgKCJcdElmIHtUbXBTdGF0dXN9ICE9IDBcbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiXHRcdFNldCBGYWlsZWQge1RtcFN0YXR1c31cbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiXHRFbmRcbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiRW5kXG4iLCBzdGRvdXQpOwotCi0gIC8qIFdlJ3JlIGp1c3QgY29tcG9zaW5nIGEgc2NyaXB0LCBjYW4ndCBmYWlsIGhlcmUuICAqLwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotICAqc3RhdHVzID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdyaXRlIG91dCBjb21tYW5kcyB0aGF0IHdpbGwgZXhpdCB3aXRoIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUKLSAgIGlmIHNvbWV0aGluZyBpbiB0aGUgc2NyaXB0IGZhaWxlZC4gICovCi0KLXZvaWQKLXBmaW5pc2ggKCkKLXsKLSAgcHJpbnRmICgiXHRFeGl0IFwie0ZhaWxlZH1cIlxuIik7Ci19Ci0KLSNlbmRpZiAvKiBNUFcgKi8KLQotLyogaW5jbHVkZSBmb3IgVW5peC1saWtlIGVudmlyb25tZW50cyBidXQgbm90IGZvciBEb3MtbGlrZSBlbnZpcm9ubWVudHMgKi8KLSNpZiAhIGRlZmluZWQgKF9fTVNET1NfXykgJiYgISBkZWZpbmVkIChPUzIpICYmICEgZGVmaW5lZCAoTVBXKSBcCi0gICAgJiYgISAoZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9VV0lOKSkKLQotZXh0ZXJuIGludCBleGVjdiAoKTsKLWV4dGVybiBpbnQgZXhlY3ZwICgpOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGludCAoKmZ1bmMpKCkgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBleGVjdnAgOiBleGVjdik7Ci0gIGludCBwaWQ7Ci0gIGludCBwZGVzWzJdOwotICBpbnQgaW5wdXRfZGVzYywgb3V0cHV0X2Rlc2M7Ci0gIGludCByZXRyaWVzLCBzbGVlcF9pbnRlcnZhbDsKLSAgLyogUGlwZSB3YWl0aW5nIGZyb20gbGFzdCBwcm9jZXNzLCB0byBiZSB1c2VkIGFzIGlucHV0IGZvciB0aGUgbmV4dCBvbmUuCi0gICAgIFZhbHVlIGlzIFNURElOX0ZJTEVfTk8gaWYgbm8gcGlwZSBpcyB3YWl0aW5nCi0gICAgIChpLmUuIHRoZSBuZXh0IGNvbW1hbmQgaXMgdGhlIGZpcnN0IG9mIGEgZ3JvdXApLiAgKi8KLSAgc3RhdGljIGludCBsYXN0X3BpcGVfaW5wdXQ7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgcHJvY2VzcywgaW5pdGlhbGl6ZS4gICovCi0gIGlmIChmbGFncyAmIFBFWEVDVVRFX0ZJUlNUKQotICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0KLSAgaW5wdXRfZGVzYyA9IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzbid0IHRoZSBsYXN0IHByb2Nlc3MsIG1ha2UgYSBwaXBlIGZvciBpdHMgb3V0cHV0LAotICAgICBhbmQgcmVjb3JkIGl0IGFzIHdhaXRpbmcgdG8gYmUgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHByb2Nlc3MuICAqLwotICBpZiAoISAoZmxhZ3MgJiBQRVhFQ1VURV9MQVNUKSkKLSAgICB7Ci0gICAgICBpZiAocGlwZSAocGRlcykgPCAwKQotCXsKLQkgICplcnJtc2dfZm10ID0gInBpcGUiOwotCSAgKmVycm1zZ19hcmcgPSBOVUxMOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIG91dHB1dF9kZXNjID0gcGRlc1tXUklURV9QT1JUXTsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IHBkZXNbUkVBRF9QT1JUXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBMYXN0IHByb2Nlc3MuICAqLwotICAgICAgb3V0cHV0X2Rlc2MgPSBTVERPVVRfRklMRV9OTzsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0gICAgfQotCi0gIC8qIEZvcmsgYSBzdWJwcm9jZXNzOyB3YWl0IGFuZCByZXRyeSBpZiBpdCBmYWlscy4gICovCi0gIHNsZWVwX2ludGVydmFsID0gMTsKLSAgZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDQ7IHJldHJpZXMrKykKLSAgICB7Ci0gICAgICBwaWQgPSB2Zm9yayAoKTsKLSAgICAgIGlmIChwaWQgPj0gMCkKLQlicmVhazsKLSAgICAgIHNsZWVwIChzbGVlcF9pbnRlcnZhbCk7Ci0gICAgICBzbGVlcF9pbnRlcnZhbCAqPSAyOwotICAgIH0KLQotICBzd2l0Y2ggKHBpZCkKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHsKLQkqZXJybXNnX2ZtdCA9IFZGT1JLX1NUUklORzsKLQkqZXJybXNnX2FyZyA9IE5VTEw7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotCi0gICAgY2FzZSAwOiAvKiBjaGlsZCAqLwotICAgICAgLyogTW92ZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBwaXBlcyBpbnRvIHBsYWNlLCBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLQl7Ci0JICBjbG9zZSAoU1RESU5fRklMRV9OTyk7Ci0JICBkdXAgKGlucHV0X2Rlc2MpOwotCSAgY2xvc2UgKGlucHV0X2Rlc2MpOwotCX0KLSAgICAgIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKLQl7Ci0JICBjbG9zZSAoU1RET1VUX0ZJTEVfTk8pOwotCSAgZHVwIChvdXRwdXRfZGVzYyk7Ci0JICBjbG9zZSAob3V0cHV0X2Rlc2MpOwotCX0KLQotICAgICAgLyogQ2xvc2UgdGhlIHBhcmVudCdzIGRlc2NzIHRoYXQgYXJlbid0IHdhbnRlZCBoZXJlLiAgKi8KLSAgICAgIGlmIChsYXN0X3BpcGVfaW5wdXQgIT0gU1RESU5fRklMRV9OTykKLQljbG9zZSAobGFzdF9waXBlX2lucHV0KTsKLQotICAgICAgLyogRXhlYyB0aGUgcHJvZ3JhbS4gICovCi0gICAgICAoKmZ1bmMpIChwcm9ncmFtLCBhcmd2KTsKLQotICAgICAgLyogTm90ZTogQ2FsbGluZyBmcHJpbnRmIGFuZCBleGl0IGhlcmUgZG9lc24ndCBzZWVtIHJpZ2h0IGZvciB2Zm9yay4gICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgdGhpc19wbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIGluc3RhbGxfZXJyb3JfbXNnLCBwcm9ncmFtKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogJXNcbiIsIHhzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIEluIHRoZSBwYXJlbnQsIGFmdGVyIGZvcmtpbmcuCi0JIENsb3NlIHRoZSBkZXNjcmlwdG9ycyB0aGF0IHdlIG1hZGUgZm9yIHRoaXMgY2hpbGQuICAqLwotICAgICAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLQljbG9zZSAoaW5wdXRfZGVzYyk7Ci0gICAgICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0JY2xvc2UgKG91dHB1dF9kZXNjKTsKLQotICAgICAgLyogUmV0dXJuIGNoaWxkJ3MgcHJvY2VzcyBudW1iZXIuICAqLwotICAgICAgcmV0dXJuIHBpZDsKLSAgICB9Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFncyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLSNpZmRlZiBWTVMKLSAgcGlkID0gd2FpdHBpZCAoLTEsIHN0YXR1cywgMCk7Ci0jZWxzZQotICBwaWQgPSB3YWl0IChzdGF0dXMpOwotI2VuZGlmCi0gIHJldHVybiBwaWQ7Ci19Ci0KLSNlbmRpZiAvKiAhIF9fTVNET1NfXyAmJiAhIE9TMiAmJiAhIE1QVyAmJiAhIChfV0lOMzIgJiYgISBfVVdJTikgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9wdXRlbnYuYyBiL2xpYmliZXJ0eS9wdXRlbnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1NjkyMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcHV0ZW52LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgYmFzZWQgb24gcHV0ZW52LmMgaW4gdGhlIEdOVSBDIExpYnJhcnkuCi0KLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi0gICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgZGVmaW5lZCAoX0FJWCkgJiYgIWRlZmluZWQgKF9fR05VQ19fKQotICNwcmFnbWEgYWxsb2NhCi0jZW5kaWYKLQotI2lmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpZiBIQVZFX1NURExJQl9ICi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWYgSEFWRV9TVFJJTkdfSAotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9BTExPQ0FfSAotIyBpbmNsdWRlIDxhbGxvY2EuaD4KLSNlbHNlCi0jIGlmbmRlZiBhbGxvY2EKLSMgIGlmZGVmIF9fR05VQ19fCi0jICAgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jICBlbHNlCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgZW5kaWYgLyogX19HTlVDX18gKi8KLSMgZW5kaWYgLyogYWxsb2NhICovCi0jZW5kaWYgLyogSEFWRV9BTExPQ0FfSCAqLwotCi0vKiBCZWxvdyB0aGlzIHBvaW50LCBpdCdzIHZlcmJhdGltIGNvZGUgZnJvbSB0aGUgZ2xpYmMtMi4wIGltcGxlbWVudGF0aW9uICovCi0KLQotLyogUHV0IFNUUklORywgd2hpY2ggaXMgb2YgdGhlIGZvcm0gIk5BTUU9VkFMVUUiLCBpbiB0aGUgZW52aXJvbm1lbnQuICAqLwotaW50Ci1wdXRlbnYgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBjaGFyICpjb25zdCBuYW1lX2VuZCA9IHN0cmNociAoc3RyaW5nLCAnPScpOwotCi0gIGlmIChuYW1lX2VuZCkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lID0gKGNoYXIgKikgYWxsb2NhIChuYW1lX2VuZCAtIHN0cmluZyArIDEpOwotICAgICAgbWVtY3B5IChuYW1lLCBzdHJpbmcsIG5hbWVfZW5kIC0gc3RyaW5nKTsKLSAgICAgIG5hbWVbbmFtZV9lbmQgLSBzdHJpbmddID0gJ1wwJzsKLSAgICAgIHJldHVybiBzZXRlbnYgKG5hbWUsIG5hbWVfZW5kICsgMSwgMSk7Ci0gICAgfQotCi0gIHVuc2V0ZW52IChzdHJpbmcpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9yYW5kb20uYyBiL2xpYmliZXJ0eS9yYW5kb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMGRhMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcmFuZG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gW3Jlc2NpbmRlZCAyMiBKdWx5IDE5OTldCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiBUaGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgQmVya2VsZXkgc291cmNlOgotICoJQCgjKXJhbmRvbS5jCTUuNSAoQmVya2VsZXkpIDcvNi84OAotICogSXQgd2FzIHJld29ya2VkIGZvciB0aGUgR05VIEMgTGlicmFyeSBieSBSb2xhbmQgTWNHcmF0aC4KLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2lmIDAKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNlbHNlCi0KLSNkZWZpbmUJVUxPTkdfTUFYICAoKHVuc2lnbmVkIGxvbmcpKH4wTCkpICAgICAvKiAweEZGRkZGRkZGIGZvciAzMi1iaXRzICovCi0jZGVmaW5lCUxPTkdfTUFYICAgKChsb25nKShVTE9OR19NQVggPj4gMSkpICAgLyogMHg3RkZGRkZGRiBmb3IgMzItYml0cyovCi0KLSNpZmRlZiBfX1NURENfXwotIyAgZGVmaW5lIFBUUiB2b2lkICoKLSMgIGlmbmRlZiBOVUxMCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVuZGlmCi0jZWxzZQotIyAgZGVmaW5lIFBUUiBjaGFyICoKLSMgIGlmbmRlZiBOVUxMCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2VuZGlmCi0KLWxvbmcgaW50IHJhbmRvbSAoKTsKLQotLyogQW4gaW1wcm92ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIHBhY2thZ2UuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQKLSAgIHJhbmQoKS9zcmFuZCgpIGxpa2UgaW50ZXJmYWNlLCB0aGlzIHBhY2thZ2UgYWxzbyBoYXMgYSBzcGVjaWFsIHN0YXRlIGluZm8KLSAgIGludGVyZmFjZS4gIFRoZSBpbml0c3RhdGUoKSByb3V0aW5lIGlzIGNhbGxlZCB3aXRoIGEgc2VlZCwgYW4gYXJyYXkgb2YKLSAgIGJ5dGVzLCBhbmQgYSBjb3VudCBvZiBob3cgbWFueSBieXRlcyBhcmUgYmVpbmcgcGFzc2VkIGluOyB0aGlzIGFycmF5IGlzCi0gICB0aGVuIGluaXRpYWxpemVkIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiB3aXRoCi0gICB0aGF0IG11Y2ggc3RhdGUgaW5mb3JtYXRpb24uICBHb29kIHNpemVzIGZvciB0aGUgYW1vdW50IG9mIHN0YXRlCi0gICBpbmZvcm1hdGlvbiBhcmUgMzIsIDY0LCAxMjgsIGFuZCAyNTYgYnl0ZXMuICBUaGUgc3RhdGUgY2FuIGJlIHN3aXRjaGVkIGJ5Ci0gICBjYWxsaW5nIHRoZSBzZXRzdGF0ZSgpIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgYXJyYXkgYXMgd2FzIGluaXRpYWxsaXplZAotICAgd2l0aCBpbml0c3RhdGUoKS4gIEJ5IGRlZmF1bHQsIHRoZSBwYWNrYWdlIHJ1bnMgd2l0aCAxMjggYnl0ZXMgb2Ygc3RhdGUKLSAgIGluZm9ybWF0aW9uIGFuZCBnZW5lcmF0ZXMgZmFyIGJldHRlciByYW5kb20gbnVtYmVycyB0aGFuIGEgbGluZWFyCi0gICBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yLiAgSWYgdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBsZXNzIHRoYW4KLSAgIDMyIGJ5dGVzLCBhIHNpbXBsZSBsaW5lYXIgY29uZ3J1ZW50aWFsIFIuTi5HLiBpcyB1c2VkLiAgSW50ZXJuYWxseSwgdGhlCi0gICBzdGF0ZSBpbmZvcm1hdGlvbiBpcyB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIGxvbmdzOyB0aGUgemVyb2V0aCBlbGVtZW50IG9mCi0gICB0aGUgYXJyYXkgaXMgdGhlIHR5cGUgb2YgUi5OLkcuIGJlaW5nIHVzZWQgKHNtYWxsIGludGVnZXIpOyB0aGUgcmVtYWluZGVyCi0gICBvZiB0aGUgYXJyYXkgaXMgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgUi5OLkcuICBUaHVzLCAzMiBieXRlcyBvZgotICAgc3RhdGUgaW5mb3JtYXRpb24gd2lsbCBnaXZlIDcgbG9uZ3Mgd29ydGggb2Ygc3RhdGUgaW5mb3JtYXRpb24sIHdoaWNoIHdpbGwKLSAgIGFsbG93IGEgZGVncmVlIHNldmVuIHBvbHlub21pYWwuICAoTm90ZTogVGhlIHplcm9ldGggd29yZCBvZiBzdGF0ZQotICAgaW5mb3JtYXRpb24gYWxzbyBoYXMgc29tZSBvdGhlciBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gaXQ7IHNlZSBzZXRzdGF0ZQotICAgZm9yIGRldGFpbHMpLiAgVGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiB0ZWNobmlxdWUgaXMgYSBsaW5lYXIgZmVlZGJhY2sKLSAgIHNoaWZ0IHJlZ2lzdGVyIGFwcHJvYWNoLCBlbXBsb3lpbmcgdHJpbm9taWFscyAoc2luY2UgdGhlcmUgYXJlIGZld2VyIHRlcm1zCi0gICB0byBzdW0gdXAgdGhhdCB3YXkpLiAgSW4gdGhpcyBhcHByb2FjaCwgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiBhbGwKLSAgIHRoZSBudW1iZXJzIGluIHRoZSBzdGF0ZSB0YWJsZSB3aWxsIGFjdCBhcyBhIGxpbmVhciBmZWVkYmFjayBzaGlmdCByZWdpc3RlciwKLSAgIGFuZCB3aWxsIGhhdmUgcGVyaW9kIDJeZGVnIC0gMSAod2hlcmUgZGVnIGlzIHRoZSBkZWdyZWUgb2YgdGhlIHBvbHlub21pYWwKLSAgIGJlaW5nIHVzZWQsIGFzc3VtaW5nIHRoYXQgdGhlIHBvbHlub21pYWwgaXMgaXJyZWR1Y2libGUgYW5kIHByaW1pdGl2ZSkuCi0gICBUaGUgaGlnaGVyIG9yZGVyIGJpdHMgd2lsbCBoYXZlIGxvbmdlciBwZXJpb2RzLCBzaW5jZSB0aGVpciB2YWx1ZXMgYXJlCi0gICBhbHNvIGluZmx1ZW5jZWQgYnkgcHNldWRvLXJhbmRvbSBjYXJyaWVzIG91dCBvZiB0aGUgbG93ZXIgYml0cy4gIFRoZQotICAgdG90YWwgcGVyaW9kIG9mIHRoZSBnZW5lcmF0b3IgaXMgYXBwcm94aW1hdGVseSBkZWcqKDIqKmRlZyAtIDEpOyB0aHVzCi0gICBkb3VibGluZyB0aGUgYW1vdW50IG9mIHN0YXRlIGluZm9ybWF0aW9uIGhhcyBhIHZhc3QgaW5mbHVlbmNlIG9uIHRoZQotICAgcGVyaW9kIG9mIHRoZSBnZW5lcmF0b3IuICBOb3RlOiBUaGUgZGVnKigyKipkZWcgLSAxKSBpcyBhbiBhcHByb3hpbWF0aW9uCi0gICBvbmx5IGdvb2QgZm9yIGxhcmdlIGRlZywgd2hlbiB0aGUgcGVyaW9kIG9mIHRoZSBzaGlmdCByZWdpc3RlciBpcyB0aGUKLSAgIGRvbWluYW50IGZhY3Rvci4gIFdpdGggZGVnIGVxdWFsIHRvIHNldmVuLCB0aGUgcGVyaW9kIGlzIGFjdHVhbGx5IG11Y2gKLSAgIGxvbmdlciB0aGFuIHRoZSA3KigyKio3IC0gMSkgcHJlZGljdGVkIGJ5IHRoaXMgZm9ybXVsYS4gICovCi0KLQotCi0vKiBGb3IgZWFjaCBvZiB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMsIHdlIGhhdmUgYQotICAgYnJlYWsgdmFsdWUgb24gdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiAoeW91IG5lZWQgYXQgbGVhc3QgdGhpCi0gICBieXRlcyBvZiBzdGF0ZSBpbmZvIHRvIHN1cHBvcnQgdGhpcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciksIGEgZGVncmVlIGZvcgotICAgdGhlIHBvbHlub21pYWwgKGFjdHVhbGx5IGEgdHJpbm9taWFsKSB0aGF0IHRoZSBSLk4uRy4gaXMgYmFzZWQgb24sIGFuZAotICAgc2VwYXJhdGlvbiBiZXR3ZWVuIHRoZSB0d28gbG93ZXIgb3JkZXIgY29lZmZpY2llbnRzIG9mIHRoZSB0cmlub21pYWwuICAqLwotCi0vKiBMaW5lYXIgY29uZ3J1ZW50aWFsLiAgKi8KLSNkZWZpbmUJVFlQRV8wCQkwCi0jZGVmaW5lCUJSRUFLXzAJCTgKLSNkZWZpbmUJREVHXzAJCTAKLSNkZWZpbmUJU0VQXzAJCTAKLQotLyogeCoqNyArIHgqKjMgKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV8xCQkxCi0jZGVmaW5lCUJSRUFLXzEJCTMyCi0jZGVmaW5lCURFR18xCQk3Ci0jZGVmaW5lCVNFUF8xCQkzCi0KLS8qIHgqKjE1ICsgeCArIDEuICAqLwotI2RlZmluZQlUWVBFXzIJCTIKLSNkZWZpbmUJQlJFQUtfMgkJNjQKLSNkZWZpbmUJREVHXzIJCTE1Ci0jZGVmaW5lCVNFUF8yCQkxCi0KLS8qIHgqKjMxICsgeCoqMyArIDEuICAqLwotI2RlZmluZQlUWVBFXzMJCTMKLSNkZWZpbmUJQlJFQUtfMwkJMTI4Ci0jZGVmaW5lCURFR18zCQkzMQotI2RlZmluZQlTRVBfMwkJMwotCi0vKiB4Kio2MyArIHggKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV80CQk0Ci0jZGVmaW5lCUJSRUFLXzQJCTI1NgotI2RlZmluZQlERUdfNAkJNjMKLSNkZWZpbmUJU0VQXzQJCTEKLQotCi0vKiBBcnJheSB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgaW5mb3JtYXRpb24gdG8gbWFrZSBjb2RlIHJ1biBmYXN0ZXIuCi0gICBSZWxpZXMgb24gZmFjdCB0aGF0IFRZUEVfaSA9PSBpLiAgKi8KLQotI2RlZmluZQlNQVhfVFlQRVMJNQkvKiBNYXggbnVtYmVyIG9mIHR5cGVzIGFib3ZlLiAgKi8KLQotc3RhdGljIGludCBkZWdyZWVzW01BWF9UWVBFU10gPSB7IERFR18wLCBERUdfMSwgREVHXzIsIERFR18zLCBERUdfNCB9Owotc3RhdGljIGludCBzZXBzW01BWF9UWVBFU10gPSB7IFNFUF8wLCBTRVBfMSwgU0VQXzIsIFNFUF8zLCBTRVBfNCB9OwotCi0KLQotLyogSW5pdGlhbGx5LCBldmVyeXRoaW5nIGlzIHNldCB1cCBhcyBpZiBmcm9tOgotCWluaXRzdGF0ZSgxLCByYW5kdGJsLCAxMjgpOwotICAgTm90ZSB0aGF0IHRoaXMgaW5pdGlhbGl6YXRpb24gdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgc3JhbmRvbQotICAgYWR2YW5jZXMgdGhlIGZyb250IGFuZCByZWFyIHBvaW50ZXJzIDEwKnJhbmRfZGVnIHRpbWVzLCBhbmQgaGVuY2UgdGhlCi0gICByZWFyIHBvaW50ZXIgd2hpY2ggc3RhcnRzIGF0IDAgd2lsbCBhbHNvIGVuZCB1cCBhdCB6ZXJvOyB0aHVzIHRoZSB6ZXJvZXRoCi0gICBlbGVtZW50IG9mIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiwgd2hpY2ggY29udGFpbnMgaW5mbyBhYm91dCB0aGUgY3VycmVudAotICAgcG9zaXRpb24gb2YgdGhlIHJlYXIgcG9pbnRlciBpcyBqdXN0Ci0JKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIFRZUEVfMyA9PSBUWVBFXzMuICAqLwotCi1zdGF0aWMgbG9uZyBpbnQgcmFuZHRibFtERUdfMyArIDFdID0KLSAgeyBUWVBFXzMsCi0gICAgICAweDlhMzE5MDM5LCAweDMyZDljMDI0LCAweDliNjYzMTgyLCAweDVkYTFmMzQyLCAKLSAgICAgIDB4ZGUzYjgxZTAsIDB4ZGYwYTZmYjUsIDB4ZjEwM2JjMDIsIDB4NDhmMzQwZmIsIAotICAgICAgMHg3NDQ5ZTU2YiwgMHhiZWIxZGJiMCwgMHhhYjVjNTkxOCwgMHg5NDY1NTRmZCwgCi0gICAgICAweDhjMmU2ODBmLCAweGViM2Q3OTlmLCAweGIxMWVlMGI3LCAweDJkNDM2Yjg2LCAKLSAgICAgIDB4ZGE2NzJlMmEsIDB4MTU4OGNhODgsIDB4ZTM2OTczNWQsIDB4OTA0ZjM1ZjcsIAotICAgICAgMHhkNzE1OGZkNiwgMHg2ZmE2ZjA1MSwgMHg2MTZlNmI5NiwgMHhhYzk0ZWZkYywgCi0gICAgICAweDM2NDEzZjkzLCAweGM2MjJjMjk4LCAweGY1YTQyYWI4LCAweDhhODhkNzdiLCAKLSAgICAgIDB4ZjVhZDlkMGUsIDB4ODk5OTIyMGIsIDB4MjdmYjQ3YjkKLSAgICB9OwotCi0vKiBGUFRSIGFuZCBSUFRSIGFyZSB0d28gcG9pbnRlcnMgaW50byB0aGUgc3RhdGUgaW5mbywgYSBmcm9udCBhbmQgYSByZWFyCi0gICBwb2ludGVyLiAgVGhlc2UgdHdvIHBvaW50ZXJzIGFyZSBhbHdheXMgcmFuZF9zZXAgcGxhY2VzIGFwYXJ0cywgYXMgdGhleQotICAgY3ljbGUgdGhyb3VnaCB0aGUgc3RhdGUgaW5mb3JtYXRpb24uICAoWWVzLCB0aGlzIGRvZXMgbWVhbiB3ZSBjb3VsZCBnZXQKLSAgIGF3YXkgd2l0aCBqdXN0IG9uZSBwb2ludGVyLCBidXQgdGhlIGNvZGUgZm9yIHJhbmRvbSBpcyBtb3JlIGVmZmljaWVudAotICAgdGhpcyB3YXkpLiAgVGhlIHBvaW50ZXJzIGFyZSBsZWZ0IHBvc2l0aW9uZWQgYXMgdGhleSB3b3VsZCBiZSBmcm9tIHRoZSBjYWxsOgotCWluaXRzdGF0ZSgxLCByYW5kdGJsLCAxMjgpOwotICAgKFRoZSBwb3NpdGlvbiBvZiB0aGUgcmVhciBwb2ludGVyLCBycHRyLCBpcyByZWFsbHkgMCAoYXMgZXhwbGFpbmVkIGFib3ZlCi0gICBpbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgcmFuZHRibCkgYmVjYXVzZSB0aGUgc3RhdGUgdGFibGUgcG9pbnRlciBpcyBzZXQKLSAgIHRvIHBvaW50IHRvIHJhbmR0YmxbMV0gKGFzIGV4cGxhaW5lZCBiZWxvdykuKSAgKi8KLQotc3RhdGljIGxvbmcgaW50ICpmcHRyID0gJnJhbmR0YmxbU0VQXzMgKyAxXTsKLXN0YXRpYyBsb25nIGludCAqcnB0ciA9ICZyYW5kdGJsWzFdOwotCi0KLQotLyogVGhlIGZvbGxvd2luZyB0aGluZ3MgYXJlIHRoZSBwb2ludGVyIHRvIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiB0YWJsZSwKLSAgIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGdlbmVyYXRvciwgdGhlIGRlZ3JlZSBvZiB0aGUgY3VycmVudCBwb2x5bm9taWFsCi0gICBiZWluZyB1c2VkLCBhbmQgdGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzLgotICAgTm90ZSB0aGF0IGZvciBlZmZpY2llbmN5IG9mIHJhbmRvbSwgd2UgcmVtZW1iZXIgdGhlIGZpcnN0IGxvY2F0aW9uIG9mCi0gICB0aGUgc3RhdGUgaW5mb3JtYXRpb24sIG5vdCB0aGUgemVyb2V0aC4gIEhlbmNlIGl0IGlzIHZhbGlkIHRvIGFjY2VzcwotICAgc3RhdGVbLTFdLCB3aGljaCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0eXBlIG9mIHRoZSBSLk4uRy4KLSAgIEFsc28sIHdlIHJlbWVtYmVyIHRoZSBsYXN0IGxvY2F0aW9uLCBzaW5jZSB0aGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KLSAgIGluZGV4aW5nIGV2ZXJ5IHRpbWUgdG8gZmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBlbGVtZW50IHRvIHNlZSBpZgotICAgdGhlIGZyb250IGFuZCByZWFyIHBvaW50ZXJzIGhhdmUgd3JhcHBlZC4gICovCi0KLXN0YXRpYyBsb25nIGludCAqc3RhdGUgPSAmcmFuZHRibFsxXTsKLQotc3RhdGljIGludCByYW5kX3R5cGUgPSBUWVBFXzM7Ci1zdGF0aWMgaW50IHJhbmRfZGVnID0gREVHXzM7Ci1zdGF0aWMgaW50IHJhbmRfc2VwID0gU0VQXzM7Ci0KLXN0YXRpYyBsb25nIGludCAqZW5kX3B0ciA9ICZyYW5kdGJsW3NpemVvZihyYW5kdGJsKSAvIHNpemVvZihyYW5kdGJsWzBdKV07Ci0MCi0vKiBJbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2VlZC4gIElmIHRoZQotICAgdHlwZSBpcyB0aGUgdHJpdmlhbCBuby1zdGF0ZS1pbmZvcm1hdGlvbiB0eXBlLCBqdXN0IHJlbWVtYmVyIHRoZSBzZWVkLgotICAgT3RoZXJ3aXNlLCBpbml0aWFsaXplcyBzdGF0ZVtdIGJhc2VkIG9uIHRoZSBnaXZlbiAic2VlZCIgdmlhIGEgbGluZWFyCi0gICBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yLiAgVGhlbiwgdGhlIHBvaW50ZXJzIGFyZSBzZXQgdG8ga25vd24gbG9jYXRpb25zCi0gICB0aGF0IGFyZSBleGFjdGx5IHJhbmRfc2VwIHBsYWNlcyBhcGFydC4gIExhc3RseSwgaXQgY3ljbGVzIHRoZSBzdGF0ZQotICAgaW5mb3JtYXRpb24gYSBnaXZlbiBudW1iZXIgb2YgdGltZXMgdG8gZ2V0IHJpZCBvZiBhbnkgaW5pdGlhbCBkZXBlbmRlbmNpZXMKLSAgIGludHJvZHVjZWQgYnkgdGhlIEwuQy5SLk4uRy4gIE5vdGUgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgcmFuZHRibFtdCi0gICBmb3IgZGVmYXVsdCB1c2FnZSByZWxpZXMgb24gdmFsdWVzIHByb2R1Y2VkIGJ5IHRoaXMgcm91dGluZS4gICovCi12b2lkCi1zcmFuZG9tICh4KQotICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgc3RhdGVbMF0gPSB4OwotICBpZiAocmFuZF90eXBlICE9IFRZUEVfMCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBsb25nIGludCBpOwotICAgICAgZm9yIChpID0gMTsgaSA8IHJhbmRfZGVnOyArK2kpCi0Jc3RhdGVbaV0gPSAoMTEwMzUxNTE0NSAqIHN0YXRlW2kgLSAxXSkgKyAxMjM0NTsKLSAgICAgIGZwdHIgPSAmc3RhdGVbcmFuZF9zZXBdOwotICAgICAgcnB0ciA9ICZzdGF0ZVswXTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxMCAqIHJhbmRfZGVnOyArK2kpCi0JcmFuZG9tKCk7Ci0gICAgfQotfQotDAotLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGUgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuIGFycmF5IG9mIE4gYnl0ZXMgZm9yCi0gICBmdXR1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uLiAgQmFzZWQgb24gdGhlIG51bWJlciBvZiBieXRlcyB3ZQotICAgYXJlIGdpdmVuLCBhbmQgdGhlIGJyZWFrIHZhbHVlcyBmb3IgdGhlIGRpZmZlcmVudCBSLk4uRy4ncywgd2UgY2hvb3NlCi0gICB0aGUgYmVzdCAobGFyZ2VzdCkgb25lIHdlIGNhbiBhbmQgc2V0IHRoaW5ncyB1cCBmb3IgaXQuICBzcmFuZG9tIGlzCi0gICB0aGVuIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCBvbiByZXR1cm4KLSAgIGZyb20gc3JhbmRvbSwgd2Ugc2V0IHN0YXRlWy0xXSB0byBiZSB0aGUgdHlwZSBtdWx0aXBsZXhlZCB3aXRoIHRoZSBjdXJyZW50Ci0gICB2YWx1ZSBvZiB0aGUgcmVhciBwb2ludGVyOyB0aGlzIGlzIHNvIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gaW5pdHN0YXRlIHdvbid0Ci0gICBsb3NlIHRoaXMgaW5mb3JtYXRpb24gYW5kIHdpbGwgYmUgYWJsZSB0byByZXN0YXJ0IHdpdGggc2V0c3RhdGUuCi0gICBOb3RlOiBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaXMgc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSwgaWYgYW55LCBqdXN0IGxpa2UKLSAgIHNldHN0YXRlIHNvIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgd2hlbiBpbml0c3RhdGUgaXMgY2FsbGVkLgotICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9sZCBzdGF0ZS4gICovCi1QVFIKLWluaXRzdGF0ZSAoc2VlZCwgYXJnX3N0YXRlLCBuKQotICB1bnNpZ25lZCBpbnQgc2VlZDsKLSAgUFRSIGFyZ19zdGF0ZTsKLSAgdW5zaWduZWQgbG9uZyBuOwotewotICBQVFIgb3N0YXRlID0gKFBUUikgJnN0YXRlWy0xXTsKLQotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7Ci0gIGVsc2UKLSAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOwotICBpZiAobiA8IEJSRUFLXzEpCi0gICAgewotICAgICAgaWYgKG4gPCBCUkVBS18wKQotCXsKLQkgIGVycm5vID0gRUlOVkFMOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgcmFuZF90eXBlID0gVFlQRV8wOwotICAgICAgcmFuZF9kZWcgPSBERUdfMDsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzA7Ci0gICAgfQotICBlbHNlIGlmIChuIDwgQlJFQUtfMikKLSAgICB7Ci0gICAgICByYW5kX3R5cGUgPSBUWVBFXzE7Ci0gICAgICByYW5kX2RlZyA9IERFR18xOwotICAgICAgcmFuZF9zZXAgPSBTRVBfMTsKLSAgICB9Ci0gIGVsc2UgaWYgKG4gPCBCUkVBS18zKQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMjsKLSAgICAgIHJhbmRfZGVnID0gREVHXzI7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8yOwotICAgIH0KLSAgZWxzZSBpZiAobiA8IEJSRUFLXzQpCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV8zOwotICAgICAgcmFuZF9kZWcgPSBERUdfMzsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV80OwotICAgICAgcmFuZF9kZWcgPSBERUdfNDsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzQ7Ci0gICAgfQotCi0gIHN0YXRlID0gJigobG9uZyBpbnQgKikgYXJnX3N0YXRlKVsxXTsJLyogRmlyc3QgbG9jYXRpb24uICAqLwotICAvKiBNdXN0IHNldCBFTkRfUFRSIGJlZm9yZSBzcmFuZG9tLiAgKi8KLSAgZW5kX3B0ciA9ICZzdGF0ZVtyYW5kX2RlZ107Ci0gIHNyYW5kb20oc2VlZCk7Ci0gIGlmIChyYW5kX3R5cGUgPT0gVFlQRV8wKQotICAgIHN0YXRlWy0xXSA9IHJhbmRfdHlwZTsKLSAgZWxzZQotICAgIHN0YXRlWy0xXSA9IChNQVhfVFlQRVMgKiAocnB0ciAtIHN0YXRlKSkgKyByYW5kX3R5cGU7Ci0KLSAgcmV0dXJuIG9zdGF0ZTsKLX0KLQwKLS8qIFJlc3RvcmUgdGhlIHN0YXRlIGZyb20gdGhlIGdpdmVuIHN0YXRlIGFycmF5LgotICAgTm90ZTogSXQgaXMgaW1wb3J0YW50IHRoYXQgd2UgYWxzbyByZW1lbWJlciB0aGUgbG9jYXRpb25zIG9mIHRoZSBwb2ludGVycwotICAgaW4gdGhlIGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24sIGFuZCByZXN0b3JlIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHBvaW50ZXJzCi0gICBmcm9tIHRoZSBvbGQgc3RhdGUgaW5mb3JtYXRpb24uICBUaGlzIGlzIGRvbmUgYnkgbXVsdGlwbGV4aW5nIHRoZSBwb2ludGVyCi0gICBsb2NhdGlvbiBpbnRvIHRoZSB6ZXJvZXRoIHdvcmQgb2YgdGhlIHN0YXRlIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgZHVlCi0gICB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpbmdzIGFyZSBkb25lLCBpdCBpcyBPSyB0byBjYWxsIHNldHN0YXRlIHdpdGggdGhlCi0gICBzYW1lIHN0YXRlIGFzIHRoZSBjdXJyZW50IHN0YXRlCi0gICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgb2xkIHN0YXRlIGluZm9ybWF0aW9uLiAgKi8KLQotUFRSCi1zZXRzdGF0ZSAoYXJnX3N0YXRlKQotICBQVFIgYXJnX3N0YXRlOwotewotICByZWdpc3RlciBsb25nIGludCAqbmV3X3N0YXRlID0gKGxvbmcgaW50ICopIGFyZ19zdGF0ZTsKLSAgcmVnaXN0ZXIgaW50IHR5cGUgPSBuZXdfc3RhdGVbMF0gJSBNQVhfVFlQRVM7Ci0gIHJlZ2lzdGVyIGludCByZWFyID0gbmV3X3N0YXRlWzBdIC8gTUFYX1RZUEVTOwotICBQVFIgb3N0YXRlID0gKFBUUikgJnN0YXRlWy0xXTsKLQotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7Ci0gIGVsc2UKLSAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBUWVBFXzA6Ci0gICAgY2FzZSBUWVBFXzE6Ci0gICAgY2FzZSBUWVBFXzI6Ci0gICAgY2FzZSBUWVBFXzM6Ci0gICAgY2FzZSBUWVBFXzQ6Ci0gICAgICByYW5kX3R5cGUgPSB0eXBlOwotICAgICAgcmFuZF9kZWcgPSBkZWdyZWVzW3R5cGVdOwotICAgICAgcmFuZF9zZXAgPSBzZXBzW3R5cGVdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFN0YXRlIGluZm8gbXVuZ2VkLiAgKi8KLSAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN0YXRlID0gJm5ld19zdGF0ZVsxXTsKLSAgaWYgKHJhbmRfdHlwZSAhPSBUWVBFXzApCi0gICAgewotICAgICAgcnB0ciA9ICZzdGF0ZVtyZWFyXTsKLSAgICAgIGZwdHIgPSAmc3RhdGVbKHJlYXIgKyByYW5kX3NlcCkgJSByYW5kX2RlZ107Ci0gICAgfQotICAvKiBTZXQgZW5kX3B0ciB0b28uICAqLwotICBlbmRfcHRyID0gJnN0YXRlW3JhbmRfZGVnXTsKLQotICByZXR1cm4gb3N0YXRlOwotfQotDAotLyogSWYgd2UgYXJlIHVzaW5nIHRoZSB0cml2aWFsIFRZUEVfMCBSLk4uRy4sIGp1c3QgZG8gdGhlIG9sZCBsaW5lYXIKLSAgIGNvbmdydWVudGlhbCBiaXQuICBPdGhlcndpc2UsIHdlIGRvIG91ciBmYW5jeSB0cmlub21pYWwgc3R1ZmYsIHdoaWNoIGlzIHRoZQotICAgc2FtZSBpbiBhbGwgdGhlciBvdGhlciBjYXNlcyBkdWUgdG8gYWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuCi0gICBzZXQgdXAuICBUaGUgYmFzaWMgb3BlcmF0aW9uIGlzIHRvIGFkZCB0aGUgbnVtYmVyIGF0IHRoZSByZWFyIHBvaW50ZXIgaW50bwotICAgdGhlIG9uZSBhdCB0aGUgZnJvbnQgcG9pbnRlci4gIFRoZW4gYm90aCBwb2ludGVycyBhcmUgYWR2YW5jZWQgdG8gdGhlIG5leHQKLSAgIGxvY2F0aW9uIGN5Y2xpY2FsbHkgaW4gdGhlIHRhYmxlLiAgVGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSBzdW0gZ2VuZXJhdGVkLAotICAgcmVkdWNlZCB0byAzMSBiaXRzIGJ5IHRocm93aW5nIGF3YXkgdGhlICJsZWFzdCByYW5kb20iIGxvdyBiaXQuCi0gICBOb3RlOiBUaGUgY29kZSB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBib3RoIHRoZSBmcm9udCBhbmQKLSAgIHJlYXIgcG9pbnRlcnMgY2FuJ3Qgd3JhcCBvbiB0aGUgc2FtZSBjYWxsIGJ5IG5vdCB0ZXN0aW5nIHRoZSByZWFyCi0gICBwb2ludGVyIGlmIHRoZSBmcm9udCBvbmUgaGFzIHdyYXBwZWQuICBSZXR1cm5zIGEgMzEtYml0IHJhbmRvbSBudW1iZXIuICAqLwotCi1sb25nIGludAotcmFuZG9tICgpCi17Ci0gIGlmIChyYW5kX3R5cGUgPT0gVFlQRV8wKQotICAgIHsKLSAgICAgIHN0YXRlWzBdID0gKChzdGF0ZVswXSAqIDExMDM1MTUyNDUpICsgMTIzNDUpICYgTE9OR19NQVg7Ci0gICAgICByZXR1cm4gc3RhdGVbMF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbnQgaTsKLSAgICAgICpmcHRyICs9ICpycHRyOwotICAgICAgLyogQ2h1Y2tpbmcgbGVhc3QgcmFuZG9tIGJpdC4gICovCi0gICAgICBpID0gKCpmcHRyID4+IDEpICYgTE9OR19NQVg7Ci0gICAgICArK2ZwdHI7Ci0gICAgICBpZiAoZnB0ciA+PSBlbmRfcHRyKQotCXsKLQkgIGZwdHIgPSBzdGF0ZTsKLQkgICsrcnB0cjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKytycHRyOwotCSAgaWYgKHJwdHIgPj0gZW5kX3B0cikKLQkgICAgcnB0ciA9IHN0YXRlOwotCX0KLSAgICAgIHJldHVybiBpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9yZW5hbWUuYyBiL2xpYmliZXJ0eS9yZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyNmUyZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcmVuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiByZW5hbWUgLS0gcmVuYW1lIGEgZmlsZQotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyogUmVuYW1lIGEgZmlsZS4gICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi1pbnQKLXJlbmFtZSAoemZyb20sIHp0bykKLSAgICAgY2hhciAqemZyb207Ci0gICAgIGNoYXIgKnp0bzsKLXsKLSAgaWYgKGxpbmsgKHpmcm9tLCB6dG8pIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQotCXJldHVybiAtMTsKLSAgICAgIGlmICh1bmxpbmsgKHp0bykgPCAwCi0JICB8fCBsaW5rICh6ZnJvbSwgenRvKSA8IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIHVubGluayAoemZyb20pOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3JpbmRleC5jIGIvbGliaWJlcnR5L3JpbmRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFkMTI2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9yaW5kZXguYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIFN0dWIgaW1wbGVtZW50YXRpb24gb2YgKG9ic29sZXRlKSByaW5kZXgoKS4gKi8KLQotZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7Ci0KLWNoYXIgKgotcmluZGV4IChzLCBjKQotICBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgcmV0dXJuIHN0cnJjaHIgKHMsIGMpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NldGVudi5jIGIvbGliaWJlcnR5L3NldGVudi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWMxMzAwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zZXRlbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgYmFzZWQgb24gc2V0ZW52LmMgaW4gdGhlIEdOVSBDIExpYnJhcnkuCi0KLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi0gICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogRm9yIGBzaXplX3QnICovCi0jaW5jbHVkZSA8c3RkaW8uaD4gICAgIC8qIEZvciBgTlVMTCcgKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgIWRlZmluZWQoZXJybm8pICYmICFkZWZpbmVkKEhBVkVfRVJSTk9fREVDTCkKLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLSNkZWZpbmUgX19zZXRfZXJybm8oZXYpICgoZXJybm8pID0gKGV2KSkKLQotI2lmIEhBVkVfU1RETElCX0gKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZiBIQVZFX1NUUklOR19ICi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaWYgSEFWRV9VTklTVERfSAotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jZGVmaW5lIF9fZW52aXJvbgllbnZpcm9uCi0jaWZuZGVmIEhBVkVfRU5WSVJPTl9ERUNMCi1leHRlcm4gY2hhciAqKmVudmlyb247Ci0jZW5kaWYKLQotLyogTE9DSyBhbmQgVU5MT0NLIGFyZSBkZWZpbmVkIGFzIG5vLW9wcy4gIFRoaXMgbWFrZXMgdGhlIGxpYmliZXJ0eQotICogaW1wbGVtZW50YXRpb24gTVQtVW5zYWZlLiAqLwotI2RlZmluZSBMT0NLCi0jZGVmaW5lIFVOTE9DSwotCi0vKiBCZWxvdyB0aGlzIHBvaW50LCBpdCdzIHZlcmJhdGltIGNvZGUgZnJvbSB0aGUgZ2xpYmMtMi4wIGltcGxlbWVudGF0aW9uICovCi0KLS8qIElmIHRoaXMgdmFyaWFibGUgaXMgbm90IGEgbnVsbCBwb2ludGVyIHdlIGFsbG9jYXRlZCB0aGUgY3VycmVudAotICAgZW52aXJvbm1lbnQuICAqLwotc3RhdGljIGNoYXIgKipsYXN0X2Vudmlyb247Ci0KLQotaW50Ci1zZXRlbnYgKG5hbWUsIHZhbHVlLCByZXBsYWNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICp2YWx1ZTsKLSAgICAgaW50IHJlcGxhY2U7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKiplcDsKLSAgcmVnaXN0ZXIgc2l6ZV90IHNpemU7Ci0gIGNvbnN0IHNpemVfdCBuYW1lbGVuID0gc3RybGVuIChuYW1lKTsKLSAgY29uc3Qgc2l6ZV90IHZhbGxlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKLQotICBMT0NLOwotCi0gIHNpemUgPSAwOwotICBpZiAoX19lbnZpcm9uICE9IE5VTEwpCi0gICAgZm9yIChlcCA9IF9fZW52aXJvbjsgKmVwICE9IE5VTEw7ICsrZXApCi0gICAgICBpZiAoIXN0cm5jbXAgKCplcCwgbmFtZSwgbmFtZWxlbikgJiYgKCplcClbbmFtZWxlbl0gPT0gJz0nKQotCWJyZWFrOwotICAgICAgZWxzZQotCSsrc2l6ZTsKLQotICBpZiAoX19lbnZpcm9uID09IE5VTEwgfHwgKmVwID09IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqKm5ld19lbnZpcm9uOwotICAgICAgaWYgKF9fZW52aXJvbiA9PSBsYXN0X2Vudmlyb24gJiYgX19lbnZpcm9uICE9IE5VTEwpCi0JLyogV2UgYWxsb2NhdGVkIHRoaXMgc3BhY2U7IHdlIGNhbiBleHRlbmQgaXQuICAqLwotCW5ld19lbnZpcm9uID0gKGNoYXIgKiopIHJlYWxsb2MgKGxhc3RfZW52aXJvbiwKLQkJCQkJIChzaXplICsgMikgKiBzaXplb2YgKGNoYXIgKikpOwotICAgICAgZWxzZQotCW5ld19lbnZpcm9uID0gKGNoYXIgKiopIG1hbGxvYyAoKHNpemUgKyAyKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0KLSAgICAgIGlmIChuZXdfZW52aXJvbiA9PSBOVUxMKQotCXsKLQkgIFVOTE9DSzsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIG5ld19lbnZpcm9uW3NpemVdID0gbWFsbG9jIChuYW1lbGVuICsgMSArIHZhbGxlbik7Ci0gICAgICBpZiAobmV3X2Vudmlyb25bc2l6ZV0gPT0gTlVMTCkKLQl7Ci0JICBmcmVlICgoY2hhciAqKSBuZXdfZW52aXJvbik7Ci0JICBfX3NldF9lcnJubyAoRU5PTUVNKTsKLQkgIFVOTE9DSzsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGlmIChfX2Vudmlyb24gIT0gbGFzdF9lbnZpcm9uKQotCW1lbWNweSAoKGNoYXIgKikgbmV3X2Vudmlyb24sIChjaGFyICopIF9fZW52aXJvbiwKLQkJc2l6ZSAqIHNpemVvZiAoY2hhciAqKSk7Ci0KLSAgICAgIG1lbWNweSAobmV3X2Vudmlyb25bc2l6ZV0sIG5hbWUsIG5hbWVsZW4pOwotICAgICAgbmV3X2Vudmlyb25bc2l6ZV1bbmFtZWxlbl0gPSAnPSc7Ci0gICAgICBtZW1jcHkgKCZuZXdfZW52aXJvbltzaXplXVtuYW1lbGVuICsgMV0sIHZhbHVlLCB2YWxsZW4pOwotCi0gICAgICBuZXdfZW52aXJvbltzaXplICsgMV0gPSBOVUxMOwotCi0gICAgICBsYXN0X2Vudmlyb24gPSBfX2Vudmlyb24gPSBuZXdfZW52aXJvbjsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlcGxhY2UpCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoKmVwKTsKLSAgICAgIGlmIChsZW4gKyAxIDwgbmFtZWxlbiArIDEgKyB2YWxsZW4pCi0JewotCSAgLyogVGhlIGV4aXN0aW5nIHN0cmluZyBpcyB0b28gc2hvcnQ7IG1hbGxvYyBhIG5ldyBvbmUuICAqLwotCSAgY2hhciAqbmV3ID0gbWFsbG9jIChuYW1lbGVuICsgMSArIHZhbGxlbik7Ci0JICBpZiAobmV3ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBVTkxPQ0s7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICAqZXAgPSBuZXc7Ci0JfQotICAgICAgbWVtY3B5ICgqZXAsIG5hbWUsIG5hbWVsZW4pOwotICAgICAgKCplcClbbmFtZWxlbl0gPSAnPSc7Ci0gICAgICBtZW1jcHkgKCYoKmVwKVtuYW1lbGVuICsgMV0sIHZhbHVlLCB2YWxsZW4pOwotICAgIH0KLQotICBVTkxPQ0s7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXVuc2V0ZW52IChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuIChuYW1lKTsKLSAgY2hhciAqKmVwOwotCi0gIExPQ0s7Ci0KLSAgZm9yIChlcCA9IF9fZW52aXJvbjsgKmVwOyArK2VwKQotICAgIGlmICghc3RybmNtcCAoKmVwLCBuYW1lLCBsZW4pICYmICgqZXApW2xlbl0gPT0gJz0nKQotICAgICAgewotCS8qIEZvdW5kIGl0LiAgUmVtb3ZlIHRoaXMgcG9pbnRlciBieSBtb3ZpbmcgbGF0ZXIgb25lcyBiYWNrLiAgKi8KLQljaGFyICoqZHAgPSBlcDsKLQlkbwotCSAgZHBbMF0gPSBkcFsxXTsKLQl3aGlsZSAoKmRwKyspOwotCS8qIENvbnRpbnVlIHRoZSBsb29wIGluIGNhc2UgTkFNRSBhcHBlYXJzIGFnYWluLiAgKi8KLSAgICAgIH0KLQotICBVTkxPQ0s7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc2lnc2V0bWFzay5jIGIvbGliaWJlcnR5L3NpZ3NldG1hc2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwOWU2YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc2lnc2V0bWFzay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogVmVyc2lvbiBvZiBzaWdzZXRtYXNrLmMKLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKS4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9hbWluLiAqLwotCi0vKiBTZXQgdGhlIGN1cnJlbnQgc2lnbmFsIG1hc2sgdG8gdGhlIHNldCBwcm92aWRlZCwgYW5kIHJldHVybiB0aGUgCi0gICBwcmV2aW91cyB2YWx1ZSAqLwotCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UKLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotLyogSW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gc2VlbXMgdG8gYmUgbmVlZGVkIGJ5IElTQy4gKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2lmZGVmIFNJR19TRVRNQVNLCi1pbnQKLURFRlVOKHNpZ3NldG1hc2ssKHNldCksCi0gICAgICBpbnQgc2V0KQotewotICAgIHNpZ3NldF90IG5ldzsKLSAgICBzaWdzZXRfdCBvbGQ7Ci0gICAgCi0gICAgc2lnZW1wdHlzZXQgKCZuZXcpOwotICAgIGlmIChzZXQgIT0gMCkgewotICAgICAgYWJvcnQoKTsJLyogRklYTUUsIHdlIGRvbid0IGtub3cgaG93IHRvIHRyYW5zbGF0ZSBvbGQgbWFzayB0byBuZXcgKi8KLSAgICB9Ci0gICAgc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZuZXcsICZvbGQpOwotICAgIHJldHVybiAxOwkvKiBGSVhNRSwgd2UgYWx3YXlzIHJldHVybiAxIGFzIG9sZCB2YWx1ZS4gICovCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zcGFjZXMuYyBiL2xpYmliZXJ0eS9zcGFjZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5MjU3MS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3BhY2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBBbGxvY2F0ZSBtZW1vcnkgcmVnaW9uIGZpbGxlZCB3aXRoIHNwYWNlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0KLU5BTUUKLQotCXNwYWNlcyAtLSByZXR1cm4gYSBwb2ludGVyIHRvIGEgYnVmZmVyIGZ1bGwgb2Ygc3BhY2VzCi0KLVNZTk9QU0lTCi0KLQljaGFyICpzcGFjZXMgKGludCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQotCVJldHVybnMgYSBwb2ludGVyIHRvIGEgbWVtb3J5IHJlZ2lvbiBmaWxsZWQgd2l0aCB0aGUgc3BlY2lmaWVkCi0JbnVtYmVyIG9mIHNwYWNlcyBhbmQgbnVsbCB0ZXJtaW5hdGVkLiAgVGhlIHJldHVybmVkIHBvaW50ZXIgaXMKLQl2YWxpZCB1bnRpbCBhdCBsZWFzdCB0aGUgbmV4dCBjYWxsLgotCQotQlVHUwotCi0qLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmIFZNUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXhsaWIuaD4KLSNlbHNlCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoZXNlIG11c3QgYmUgZGVjbGFyZWQuICAqLwotZXh0ZXJuIFBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBmcmVlIFBBUkFNUyAoKFBUUikpOwotI2VuZGlmCi0KLWNvbnN0IGNoYXIgKgotc3BhY2VzIChjb3VudCkKLSAgaW50IGNvdW50OwotewotICByZWdpc3RlciBjaGFyICp0OwotICBzdGF0aWMgY2hhciAqYnVmOwotICBzdGF0aWMgaW50IG1heHNpemU7Ci0KLSAgaWYgKGNvdW50ID4gbWF4c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYnVmKQotCXsKLQkgIGZyZWUgKGJ1Zik7Ci0JfQotICAgICAgYnVmID0gbWFsbG9jIChjb3VudCArIDEpOwotICAgICAgaWYgKGJ1ZiA9PSAoY2hhciAqKSAwKQotCXJldHVybiAwOwotICAgICAgZm9yICh0ID0gYnVmICsgY291bnQgOyB0ICE9IGJ1ZiA7ICkKLQl7Ci0JICAqLS10ID0gJyAnOwotCX0KLSAgICAgIG1heHNpemUgPSBjb3VudDsKLSAgICAgIGJ1Zltjb3VudF0gPSAnXDAnOwotICAgIH0KLSAgcmV0dXJuIChjb25zdCBjaGFyICopIChidWYgKyBtYXhzaXplIC0gY291bnQpOwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3BsYXktdHJlZS5jIGIvbGliaWJlcnR5L3NwbGF5LXRyZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlYTA3ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3BsYXktdHJlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qIEEgc3BsYXktdHJlZSBkYXRhdHlwZS4gIAotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFyayBNaXRjaGVsbCAobWFya0BtYXJrbWl0Y2hlbGwuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgotICAgCi1HTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgYW4gZWFzaWx5IHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHNwbGF5LXRyZWVzLCBzZWU6Ci0KLSAgICAgTGV3aXMsIEhhcnJ5IFIuIGFuZCBEZW5lbmJlcmcsIExhcnJ5LiAgRGF0YSBTdHJ1Y3R1cmVzIGFuZCBUaGVpcgotICAgICBBbGdvcml0aG1zLiAgSGFycGVyLUNvbGxpbnMsIEluYy4gIDE5OTEuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNwbGF5LXRyZWUuaCIKLQotc3RhdGljIHZvaWQgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyICAgIFBBUkFNUygoc3BsYXlfdHJlZSwgCi0JCQkJCQlzcGxheV90cmVlX25vZGUpKTsKLXN0YXRpYyB2b2lkIHNwbGF5X3RyZWVfc3BsYXkgICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCQlzcGxheV90cmVlX2tleSkpOwotc3RhdGljIHNwbGF5X3RyZWVfbm9kZSBzcGxheV90cmVlX3NwbGF5X2hlbHBlciAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkJc3BsYXlfdHJlZV9rZXksCi0JCQkJCQlzcGxheV90cmVlX25vZGUqLAotCQkJCQkJc3BsYXlfdHJlZV9ub2RlKiwKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSopKTsKLXN0YXRpYyBpbnQgc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9ub2RlLAotCQkJCQkJc3BsYXlfdHJlZV9mb3JlYWNoX2ZuLAotCQkJCQkJdm9pZCopKTsKLQotLyogRGVhbGxvY2F0ZSBOT0RFIChhIG1lbWJlciBvZiBTUCksIGFuZCBhbGwgaXRzIHN1Yi10cmVlcy4gICovCi0KLXN0YXRpYyB2b2lkIAotc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgbm9kZSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9ub2RlIG5vZGU7Ci17Ci0gIGlmICghbm9kZSkKLSAgICByZXR1cm47Ci0KLSAgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgbm9kZS0+bGVmdCk7Ci0gIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIG5vZGUtPnJpZ2h0KTsKLQotICBpZiAoc3AtPmRlbGV0ZV9rZXkpCi0gICAgKCpzcC0+ZGVsZXRlX2tleSkobm9kZS0+a2V5KTsKLSAgaWYgKHNwLT5kZWxldGVfdmFsdWUpCi0gICAgKCpzcC0+ZGVsZXRlX3ZhbHVlKShub2RlLT52YWx1ZSk7Ci0KLSAgZnJlZSAoKGNoYXIqKSBub2RlKTsKLX0KLQotLyogSGVscCBzcGxheSBTUCBhcm91bmQgS0VZLiAgUEFSRU5UIGFuZCBHUkFORFBBUkVOVCBhcmUgdGhlIHBhcmVudAotICAgYW5kIGdyYW5kcGFyZW50LCByZXNwZWN0aXZlbHksIG9mIE5PREUuICAqLwotCi1zdGF0aWMgc3BsYXlfdHJlZV9ub2RlCi1zcGxheV90cmVlX3NwbGF5X2hlbHBlciAoc3AsIGtleSwgbm9kZSwgcGFyZW50LCBncmFuZHBhcmVudCkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9rZXkga2V5OwotICAgICBzcGxheV90cmVlX25vZGUgKm5vZGU7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSAqcGFyZW50OwotICAgICBzcGxheV90cmVlX25vZGUgKmdyYW5kcGFyZW50OwotewotICBzcGxheV90cmVlX25vZGUgKm5leHQ7Ci0gIHNwbGF5X3RyZWVfbm9kZSBuOwotICBpbnQgY29tcGFyaXNvbjsKLSAgCi0gIG4gPSAqbm9kZTsKLQotICBpZiAoIW4pCi0gICAgcmV0dXJuICpwYXJlbnQ7Ci0KLSAgY29tcGFyaXNvbiA9ICgqc3AtPmNvbXApIChrZXksIG4tPmtleSk7Ci0KLSAgaWYgKGNvbXBhcmlzb24gPT0gMCkKLSAgICAvKiBXZSd2ZSBmb3VuZCB0aGUgdGFyZ2V0LiAgKi8KLSAgICBuZXh0ID0gMDsKLSAgZWxzZSBpZiAoY29tcGFyaXNvbiA8IDApCi0gICAgLyogVGhlIHRhcmdldCBpcyB0byB0aGUgbGVmdC4gICovCi0gICAgbmV4dCA9ICZuLT5sZWZ0OwotICBlbHNlIAotICAgIC8qIFRoZSB0YXJnZXQgaXMgdG8gdGhlIHJpZ2h0LiAgKi8KLSAgICBuZXh0ID0gJm4tPnJpZ2h0OwotCi0gIGlmIChuZXh0KQotICAgIHsKLSAgICAgIC8qIENvbnRpbnVlIGRvd24gdGhlIHRyZWUuICAqLwotICAgICAgbiA9IHNwbGF5X3RyZWVfc3BsYXlfaGVscGVyIChzcCwga2V5LCBuZXh0LCBub2RlLCBwYXJlbnQpOwotCi0gICAgICAvKiBUaGUgcmVjdXJzaXZlIGNhbGwgd2lsbCBjaGFuZ2UgdGhlIHBsYWNlIHRvIHdoaWNoIE5PREUKLQkgcG9pbnRzLiAgKi8KLSAgICAgIGlmICgqbm9kZSAhPSBuKQotCXJldHVybiBuOwotICAgIH0KLQotICBpZiAoIXBhcmVudCkKLSAgICAvKiBOT0RFIGlzIHRoZSByb290LiAgV2UgYXJlIGRvbmUuICAqLwotICAgIHJldHVybiBuOwotCi0gIC8qIEZpcnN0LCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8gZ3JhbmRwYXJlbnQgKGkuZS4sCi0gICAgICpQQVJFTlQgaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuKSAgKi8KLSAgaWYgKCFncmFuZHBhcmVudCkgCi0gICAgewotICAgICAgaWYgKG4gPT0gKCpwYXJlbnQpLT5sZWZ0KQotCXsKLQkgICpub2RlID0gbi0+cmlnaHQ7Ci0JICBuLT5yaWdodCA9ICpwYXJlbnQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpub2RlID0gbi0+bGVmdDsKLQkgIG4tPmxlZnQgPSAqcGFyZW50OwotCX0KLSAgICAgICpwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47Ci0gICAgfQotCi0gIC8qIE5leHQgaGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBib3RoIE4gYW5kICpQQVJFTlQgYXJlIGxlZnQgY2hpbGRyZW4sCi0gICAgIG9yIHdoZXJlIGJvdGggYXJlIHJpZ2h0IGNoaWxkcmVuLiAgKi8KLSAgaWYgKG4gPT0gKCpwYXJlbnQpLT5sZWZ0ICYmICpwYXJlbnQgPT0gKCpncmFuZHBhcmVudCktPmxlZnQpCi0gICAgewotICAgICAgc3BsYXlfdHJlZV9ub2RlIHAgPSAqcGFyZW50OwotCi0gICAgICAoKmdyYW5kcGFyZW50KS0+bGVmdCA9IHAtPnJpZ2h0OwotICAgICAgcC0+cmlnaHQgPSAqZ3JhbmRwYXJlbnQ7Ci0gICAgICBwLT5sZWZ0ID0gbi0+cmlnaHQ7Ci0gICAgICBuLT5yaWdodCA9IHA7Ci0gICAgICAqZ3JhbmRwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47IAotICAgIH0KLSAgZWxzZSBpZiAgKG4gPT0gKCpwYXJlbnQpLT5yaWdodCAmJiAqcGFyZW50ID09ICgqZ3JhbmRwYXJlbnQpLT5yaWdodCkKLSAgICB7Ci0gICAgICBzcGxheV90cmVlX25vZGUgcCA9ICpwYXJlbnQ7Ci0KLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5yaWdodCA9IHAtPmxlZnQ7Ci0gICAgICBwLT5sZWZ0ID0gKmdyYW5kcGFyZW50OwotICAgICAgcC0+cmlnaHQgPSBuLT5sZWZ0OwotICAgICAgbi0+bGVmdCA9IHA7Ci0gICAgICAqZ3JhbmRwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47Ci0gICAgfQotCi0gIC8qIEZpbmFsbHksIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBOIGlzIGEgbGVmdCBjaGlsZCwgYnV0ICpQQVJFTlQKLSAgICAgaXMgYSByaWdodCBjaGlsZCwgb3IgdmljZSB2ZXJzYS4gICovCi0gIGlmIChuID09ICgqcGFyZW50KS0+bGVmdCkgCi0gICAgewotICAgICAgKCpwYXJlbnQpLT5sZWZ0ID0gbi0+cmlnaHQ7Ci0gICAgICBuLT5yaWdodCA9ICpwYXJlbnQ7Ci0gICAgICAoKmdyYW5kcGFyZW50KS0+cmlnaHQgPSBuLT5sZWZ0OwotICAgICAgbi0+bGVmdCA9ICpncmFuZHBhcmVudDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9IAotICBlbHNlCi0gICAgewotICAgICAgKCpwYXJlbnQpLT5yaWdodCA9IG4tPmxlZnQ7Ci0gICAgICBuLT5sZWZ0ID0gKnBhcmVudDsKLSAgICAgICgqZ3JhbmRwYXJlbnQpLT5sZWZ0ID0gbi0+cmlnaHQ7Ci0gICAgICBuLT5yaWdodCA9ICpncmFuZHBhcmVudDsKLSAgICAgICpncmFuZHBhcmVudCA9IG47Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci19Ci0KLS8qIFNwbGF5IFNQIGFyb3VuZCBLRVkuICAqLwotCi1zdGF0aWMgdm9pZAotc3BsYXlfdHJlZV9zcGxheSAoc3AsIGtleSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9rZXkga2V5OwotewotICBpZiAoc3AtPnJvb3QgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgKHNwLCBrZXksICZzcC0+cm9vdCwgCi0JCQkgICAvKmdyYW5kcGFyZW50PSovMCwgLypwYXJlbnQ9Ki8wKTsgCi19Ci0KLS8qIENhbGwgRk4sIHBhc3NpbmcgaXQgdGhlIERBVEEsIGZvciBldmVyeSBub2RlIGJlbG93IE5PREUsIGFsbCBvZgotICAgd2hpY2ggYXJlIGZyb20gU1AsIGZvbGxvd2luZyBhbiBpbi1vcmRlciB0cmF2ZXJzYWwuICBJZiBGTiBldmVyeQotICAgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgaXRlcmF0aW9uIGNlYXNlcyBpbW1lZGlhdGVseSwgYW5kIHRoZQotICAgdmFsdWUgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLiAgKi8KLQotc3RhdGljIGludAotc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIG5vZGUsIGZuLCBkYXRhKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX25vZGUgbm9kZTsKLSAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuIGZuOwotICAgICB2b2lkKiBkYXRhOwotewotICBpbnQgdmFsOwotCi0gIGlmICghbm9kZSkKLSAgICByZXR1cm4gMDsKLQotICB2YWwgPSBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgbm9kZS0+bGVmdCwgZm4sIGRhdGEpOwotICBpZiAodmFsKQotICAgIHJldHVybiB2YWw7Ci0KLSAgdmFsID0gKCpmbikobm9kZSwgZGF0YSk7Ci0gIGlmICh2YWwpCi0gICAgcmV0dXJuIHZhbDsKLQotICByZXR1cm4gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIG5vZGUtPnJpZ2h0LCBmbiwgZGF0YSk7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IHNwbGF5IHRyZWUsIHVzaW5nIENPTVBBUkVfRk4gdG8gY29tcGFyZSBub2RlcywKLSAgIERFTEVURV9LRVlfRk4gdG8gZGVhbGxvY2F0ZSBrZXlzLCBhbmQgREVMRVRFX1ZBTFVFX0ZOIHRvIGRlYWxsb2NhdGUKLSAgIHZhbHVlcy4gICovCi0KLXNwbGF5X3RyZWUgCi1zcGxheV90cmVlX25ldyAoY29tcGFyZV9mbiwgZGVsZXRlX2tleV9mbiwgZGVsZXRlX3ZhbHVlX2ZuKQotICAgICBzcGxheV90cmVlX2NvbXBhcmVfZm4gY29tcGFyZV9mbjsKLSAgICAgc3BsYXlfdHJlZV9kZWxldGVfa2V5X2ZuIGRlbGV0ZV9rZXlfZm47Ci0gICAgIHNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuIGRlbGV0ZV92YWx1ZV9mbjsKLXsKLSAgc3BsYXlfdHJlZSBzcCA9IChzcGxheV90cmVlKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzcGxheV90cmVlX3MpKTsKLSAgc3AtPnJvb3QgPSAwOwotICBzcC0+Y29tcCA9IGNvbXBhcmVfZm47Ci0gIHNwLT5kZWxldGVfa2V5ID0gZGVsZXRlX2tleV9mbjsKLSAgc3AtPmRlbGV0ZV92YWx1ZSA9IGRlbGV0ZV92YWx1ZV9mbjsKLQotICByZXR1cm4gc3A7Ci19Ci0KLS8qIERlYWxsb2NhdGUgU1AuICAqLwotCi12b2lkIAotc3BsYXlfdHJlZV9kZWxldGUgKHNwKQotICAgICBzcGxheV90cmVlIHNwOwotewotICBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBzcC0+cm9vdCk7Ci0gIGZyZWUgKChjaGFyKikgc3ApOwotfQotCi0vKiBJbnNlcnQgYSBuZXcgbm9kZSAoYXNzb2NpYXRpbmcgS0VZIHdpdGggREFUQSkgaW50byBTUC4gIElmIGEKLSAgIHByZXZpb3VzIG5vZGUgd2l0aCB0aGUgaW5kaWNhdGVkIEtFWSBleGlzdHMsIGl0cyBkYXRhIGlzIHJlcGxhY2VkCi0gICB3aXRoIHRoZSBuZXcgdmFsdWUuICBSZXR1cm5zIHRoZSBuZXcgbm9kZS4gICovCi0KLXNwbGF5X3RyZWVfbm9kZQotc3BsYXlfdHJlZV9pbnNlcnQgKHNwLCBrZXksIHZhbHVlKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci0gICAgIHNwbGF5X3RyZWVfdmFsdWUgdmFsdWU7Ci17Ci0gIGludCBjb21wYXJpc29uID0gMDsKLQotICBzcGxheV90cmVlX3NwbGF5IChzcCwga2V5KTsKLQotICBpZiAoc3AtPnJvb3QpCi0gICAgY29tcGFyaXNvbiA9ICgqc3AtPmNvbXApKHNwLT5yb290LT5rZXksIGtleSk7Ci0KLSAgaWYgKHNwLT5yb290ICYmIGNvbXBhcmlzb24gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgcm9vdCBvZiB0aGUgdHJlZSBhbHJlYWR5IGhhcyB0aGUgaW5kaWNhdGVkIEtFWSwganVzdAotCSByZXBsYWNlIHRoZSB2YWx1ZSB3aXRoIFZBTFVFLiAgKi8KLSAgICAgIGlmIChzcC0+ZGVsZXRlX3ZhbHVlKQotCSgqc3AtPmRlbGV0ZV92YWx1ZSkoc3AtPnJvb3QtPnZhbHVlKTsKLSAgICAgIHNwLT5yb290LT52YWx1ZSA9IHZhbHVlOwotICAgIH0gCi0gIGVsc2UgCi0gICAgewotICAgICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUsIGFuZCBpbnNlcnQgaXQgYXQgdGhlIHJvb3QuICAqLwotICAgICAgc3BsYXlfdHJlZV9ub2RlIG5vZGU7Ci0gICAgICAKLSAgICAgIG5vZGUgPSAoc3BsYXlfdHJlZV9ub2RlKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzcGxheV90cmVlX25vZGVfcykpOwotICAgICAgbm9kZS0+a2V5ID0ga2V5OwotICAgICAgbm9kZS0+dmFsdWUgPSB2YWx1ZTsKLSAgICAgIAotICAgICAgaWYgKCFzcC0+cm9vdCkKLQlub2RlLT5sZWZ0ID0gbm9kZS0+cmlnaHQgPSAwOwotICAgICAgZWxzZSBpZiAoY29tcGFyaXNvbiA8IDApCi0JewotCSAgbm9kZS0+bGVmdCA9IHNwLT5yb290OwotCSAgbm9kZS0+cmlnaHQgPSBub2RlLT5sZWZ0LT5yaWdodDsKLQkgIG5vZGUtPmxlZnQtPnJpZ2h0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbm9kZS0+cmlnaHQgPSBzcC0+cm9vdDsKLQkgIG5vZGUtPmxlZnQgPSBub2RlLT5yaWdodC0+bGVmdDsKLQkgIG5vZGUtPnJpZ2h0LT5sZWZ0ID0gMDsKLQl9Ci0KLSAgICBzcC0+cm9vdCA9IG5vZGU7Ci0gIH0KLQotICByZXR1cm4gc3AtPnJvb3Q7Ci19Ci0KLS8qIExvb2t1cCBLRVkgaW4gU1AsIHJldHVybmluZyBWQUxVRSBpZiBwcmVzZW50LCBhbmQgTlVMTCAKLSAgIG90aGVyd2lzZS4gICovCi0KLXNwbGF5X3RyZWVfbm9kZQotc3BsYXlfdHJlZV9sb29rdXAgKHNwLCBrZXkpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLXsKLSAgc3BsYXlfdHJlZV9zcGxheSAoc3AsIGtleSk7Ci0KLSAgaWYgKHNwLT5yb290ICYmICgqc3AtPmNvbXApKHNwLT5yb290LT5rZXksIGtleSkgPT0gMCkKLSAgICByZXR1cm4gc3AtPnJvb3Q7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ2FsbCBGTiwgcGFzc2luZyBpdCB0aGUgREFUQSwgZm9yIGV2ZXJ5IG5vZGUgaW4gU1AsIGZvbGxvd2luZyBhbgotICAgaW4tb3JkZXIgdHJhdmVyc2FsLiAgSWYgRk4gZXZlcnkgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGUKLSAgIGl0ZXJhdGlvbiBjZWFzZXMgaW1tZWRpYXRlbHksIGFuZCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLiAgKi8KLQotaW50Ci1zcGxheV90cmVlX2ZvcmVhY2ggKHNwLCBmbiwgZGF0YSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuIGZuOwotICAgICB2b2lkICpkYXRhOwotewotICByZXR1cm4gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIHNwLT5yb290LCBmbiwgZGF0YSk7Ci19Ci0KLS8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgaW50cy4gICovCi0KLWludAotc3BsYXlfdHJlZV9jb21wYXJlX2ludHMgKGsxLCBrMikKLSAgICAgc3BsYXlfdHJlZV9rZXkgazE7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGsyOwotewotICBpZiAoKGludCkgazEgPCAoaW50KSBrMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKChpbnQpIGsxID4gKGludCkgazIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgcG9pbnRlcnMuICAqLwotCi1pbnQKLXNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyAoazEsIGsyKQotICAgICBzcGxheV90cmVlX2tleSBrMTsKLSAgICAgc3BsYXlfdHJlZV9rZXkgazI7Ci17Ci0gIGlmICgoY2hhciopIGsxIDwgKGNoYXIqKSBrMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKChjaGFyKikgazEgPiAoY2hhciopIGsyKQotICAgIHJldHVybiAxOwotICBlbHNlIAotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmNhc2VjbXAuYyBiL2xpYmliZXJ0eS9zdHJjYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTkzMGIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cmNhc2VjbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODcgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkIGFuZCB0aGF0IGR1ZSBjcmVkaXQgaXMgZ2l2ZW4KLSAqIHRvIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkuIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5Ci0gKiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGhpcyBzb2Z0d2FyZQotICogaXMgcHJvdmlkZWQgYGBhcyBpcycnIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICovCi0KLSNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKLXN0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylzdHJjYXNlY21wLmMJNS41IChCZXJrZWxleSkgMTEvMjQvODciOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyoKLSAqIFRoaXMgYXJyYXkgaXMgZGVzaWduZWQgZm9yIG1hcHBpbmcgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVyCi0gKiB0b2dldGhlciBmb3IgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24uICBUaGUgbWFwcGluZ3MgYXJlCi0gKiBiYXNlZCB1cG9uIGFzY2lpIGNoYXJhY3RlciBzZXF1ZW5jZXMuCi0gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1YzsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJtYXBbXSA9IHsKLQkodWMpJ1wwMDAnLCh1YyknXDAwMScsKHVjKSdcMDAyJywodWMpJ1wwMDMnLCh1YyknXDAwNCcsKHVjKSdcMDA1JywodWMpJ1wwMDYnLCh1YyknXDAwNycsCi0JKHVjKSdcMDEwJywodWMpJ1wwMTEnLCh1YyknXDAxMicsKHVjKSdcMDEzJywodWMpJ1wwMTQnLCh1YyknXDAxNScsKHVjKSdcMDE2JywodWMpJ1wwMTcnLAotCSh1YyknXDAyMCcsKHVjKSdcMDIxJywodWMpJ1wwMjInLCh1YyknXDAyMycsKHVjKSdcMDI0JywodWMpJ1wwMjUnLCh1YyknXDAyNicsKHVjKSdcMDI3JywKLQkodWMpJ1wwMzAnLCh1YyknXDAzMScsKHVjKSdcMDMyJywodWMpJ1wwMzMnLCh1YyknXDAzNCcsKHVjKSdcMDM1JywodWMpJ1wwMzYnLCh1YyknXDAzNycsCi0JKHVjKSdcMDQwJywodWMpJ1wwNDEnLCh1YyknXDA0MicsKHVjKSdcMDQzJywodWMpJ1wwNDQnLCh1YyknXDA0NScsKHVjKSdcMDQ2JywodWMpJ1wwNDcnLAotCSh1YyknXDA1MCcsKHVjKSdcMDUxJywodWMpJ1wwNTInLCh1YyknXDA1MycsKHVjKSdcMDU0JywodWMpJ1wwNTUnLCh1YyknXDA1NicsKHVjKSdcMDU3JywKLQkodWMpJ1wwNjAnLCh1YyknXDA2MScsKHVjKSdcMDYyJywodWMpJ1wwNjMnLCh1YyknXDA2NCcsKHVjKSdcMDY1JywodWMpJ1wwNjYnLCh1YyknXDA2NycsCi0JKHVjKSdcMDcwJywodWMpJ1wwNzEnLCh1YyknXDA3MicsKHVjKSdcMDczJywodWMpJ1wwNzQnLCh1YyknXDA3NScsKHVjKSdcMDc2JywodWMpJ1wwNzcnLAotCSh1YyknXDEwMCcsKHVjKSdcMTQxJywodWMpJ1wxNDInLCh1YyknXDE0MycsKHVjKSdcMTQ0JywodWMpJ1wxNDUnLCh1YyknXDE0NicsKHVjKSdcMTQ3JywKLQkodWMpJ1wxNTAnLCh1YyknXDE1MScsKHVjKSdcMTUyJywodWMpJ1wxNTMnLCh1YyknXDE1NCcsKHVjKSdcMTU1JywodWMpJ1wxNTYnLCh1YyknXDE1NycsCi0JKHVjKSdcMTYwJywodWMpJ1wxNjEnLCh1YyknXDE2MicsKHVjKSdcMTYzJywodWMpJ1wxNjQnLCh1YyknXDE2NScsKHVjKSdcMTY2JywodWMpJ1wxNjcnLAotCSh1YyknXDE3MCcsKHVjKSdcMTcxJywodWMpJ1wxNzInLCh1YyknXDEzMycsKHVjKSdcMTM0JywodWMpJ1wxMzUnLCh1YyknXDEzNicsKHVjKSdcMTM3JywKLQkodWMpJ1wxNDAnLCh1YyknXDE0MScsKHVjKSdcMTQyJywodWMpJ1wxNDMnLCh1YyknXDE0NCcsKHVjKSdcMTQ1JywodWMpJ1wxNDYnLCh1YyknXDE0NycsCi0JKHVjKSdcMTUwJywodWMpJ1wxNTEnLCh1YyknXDE1MicsKHVjKSdcMTUzJywodWMpJ1wxNTQnLCh1YyknXDE1NScsKHVjKSdcMTU2JywodWMpJ1wxNTcnLAotCSh1YyknXDE2MCcsKHVjKSdcMTYxJywodWMpJ1wxNjInLCh1YyknXDE2MycsKHVjKSdcMTY0JywodWMpJ1wxNjUnLCh1YyknXDE2NicsKHVjKSdcMTY3JywKLQkodWMpJ1wxNzAnLCh1YyknXDE3MScsKHVjKSdcMTcyJywodWMpJ1wxNzMnLCh1YyknXDE3NCcsKHVjKSdcMTc1JywodWMpJ1wxNzYnLCh1YyknXDE3NycsCi0JKHVjKSdcMjAwJywodWMpJ1wyMDEnLCh1YyknXDIwMicsKHVjKSdcMjAzJywodWMpJ1wyMDQnLCh1YyknXDIwNScsKHVjKSdcMjA2JywodWMpJ1wyMDcnLAotCSh1YyknXDIxMCcsKHVjKSdcMjExJywodWMpJ1wyMTInLCh1YyknXDIxMycsKHVjKSdcMjE0JywodWMpJ1wyMTUnLCh1YyknXDIxNicsKHVjKSdcMjE3JywKLQkodWMpJ1wyMjAnLCh1YyknXDIyMScsKHVjKSdcMjIyJywodWMpJ1wyMjMnLCh1YyknXDIyNCcsKHVjKSdcMjI1JywodWMpJ1wyMjYnLCh1YyknXDIyNycsCi0JKHVjKSdcMjMwJywodWMpJ1wyMzEnLCh1YyknXDIzMicsKHVjKSdcMjMzJywodWMpJ1wyMzQnLCh1YyknXDIzNScsKHVjKSdcMjM2JywodWMpJ1wyMzcnLAotCSh1YyknXDI0MCcsKHVjKSdcMjQxJywodWMpJ1wyNDInLCh1YyknXDI0MycsKHVjKSdcMjQ0JywodWMpJ1wyNDUnLCh1YyknXDI0NicsKHVjKSdcMjQ3JywKLQkodWMpJ1wyNTAnLCh1YyknXDI1MScsKHVjKSdcMjUyJywodWMpJ1wyNTMnLCh1YyknXDI1NCcsKHVjKSdcMjU1JywodWMpJ1wyNTYnLCh1YyknXDI1NycsCi0JKHVjKSdcMjYwJywodWMpJ1wyNjEnLCh1YyknXDI2MicsKHVjKSdcMjYzJywodWMpJ1wyNjQnLCh1YyknXDI2NScsKHVjKSdcMjY2JywodWMpJ1wyNjcnLAotCSh1YyknXDI3MCcsKHVjKSdcMjcxJywodWMpJ1wyNzInLCh1YyknXDI3MycsKHVjKSdcMjc0JywodWMpJ1wyNzUnLCh1YyknXDI3NicsKHVjKSdcMjc3JywKLQkodWMpJ1wzMDAnLCh1YyknXDM0MScsKHVjKSdcMzQyJywodWMpJ1wzNDMnLCh1YyknXDM0NCcsKHVjKSdcMzQ1JywodWMpJ1wzNDYnLCh1YyknXDM0NycsCi0JKHVjKSdcMzUwJywodWMpJ1wzNTEnLCh1YyknXDM1MicsKHVjKSdcMzUzJywodWMpJ1wzNTQnLCh1YyknXDM1NScsKHVjKSdcMzU2JywodWMpJ1wzNTcnLAotCSh1YyknXDM2MCcsKHVjKSdcMzYxJywodWMpJ1wzNjInLCh1YyknXDM2MycsKHVjKSdcMzY0JywodWMpJ1wzNjUnLCh1YyknXDM2NicsKHVjKSdcMzY3JywKLQkodWMpJ1wzNzAnLCh1YyknXDM3MScsKHVjKSdcMzcyJywodWMpJ1wzMzMnLCh1YyknXDMzNCcsKHVjKSdcMzM1JywodWMpJ1wzMzYnLCh1YyknXDMzNycsCi0JKHVjKSdcMzQwJywodWMpJ1wzNDEnLCh1YyknXDM0MicsKHVjKSdcMzQzJywodWMpJ1wzNDQnLCh1YyknXDM0NScsKHVjKSdcMzQ2JywodWMpJ1wzNDcnLAotCSh1YyknXDM1MCcsKHVjKSdcMzUxJywodWMpJ1wzNTInLCh1YyknXDM1MycsKHVjKSdcMzU0JywodWMpJ1wzNTUnLCh1YyknXDM1NicsKHVjKSdcMzU3JywKLQkodWMpJ1wzNjAnLCh1YyknXDM2MScsKHVjKSdcMzYyJywodWMpJ1wzNjMnLCh1YyknXDM2NCcsKHVjKSdcMzY1JywodWMpJ1wzNjYnLCh1YyknXDM2NycsCi0JKHVjKSdcMzcwJywodWMpJ1wzNzEnLCh1YyknXDM3MicsKHVjKSdcMzczJywodWMpJ1wzNzQnLCh1YyknXDM3NScsKHVjKSdcMzc2JywodWMpJ1wzNzcnLAotfTsKLQotaW50Ci1zdHJjYXNlY21wKHMxLCBzMikKLSAgICBjb25zdCBjaGFyICpzMSwgKnMyOwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdTEsIHUyOwotCi0gICAgZm9yICg7OykgewotCXUxID0gKHVuc2lnbmVkIGNoYXIpICpzMSsrOwotCXUyID0gKHVuc2lnbmVkIGNoYXIpICpzMisrOwotCWlmIChjaGFybWFwW3UxXSAhPSBjaGFybWFwW3UyXSkgewotCSAgICByZXR1cm4gY2hhcm1hcFt1MV0gLSBjaGFybWFwW3UyXTsKLQl9Ci0JaWYgKHUxID09ICdcMCcpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmNoci5jIGIvbGliaWJlcnR5L3N0cmNoci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTA0ODBmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJjaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RyY2hyKCkKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCXN0cmNociAtLSByZXR1cm4gcG9pbnRlciB0byBmaXJzdCBvY2N1cmFuY2Ugb2YgYSBjaGFyYWN0ZXIKLQotU1lOT1BTSVMKLQljaGFyICpzdHJjaHIgKGNvbnN0IGNoYXIgKnMsIGludCBjKQotCi1ERVNDUklQVElPTgotCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgY2hhcmFjdGVyIEMgaW4KLQlzdHJpbmcgUywgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm8gb2NjdXJhbmNlIGlzIGZvdW5kLgotCQotQlVHUwotCUJlaGF2aW9yIHdoZW4gY2hhcmFjdGVyIGlzIHRoZSBudWxsIGNoYXJhY3RlciBpcyBpbXBsZW1lbnRhdGlvbgotCWRlcGVuZGVudC4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi1jaGFyICoKLXN0cmNociAocywgYykKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIGRvIHsKLSAgICBpZiAoKnMgPT0gYykKLSAgICAgIHsKLQlyZXR1cm4gKGNoYXIqKXM7Ci0gICAgICB9Ci0gIH0gd2hpbGUgKCpzKyspOwotICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmR1cC5jIGIvbGliaWJlcnR5L3N0cmR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzg1YjM0Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJkdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWNoYXIgKgotc3RyZHVwKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gICAgY2hhciAqcmVzdWx0ID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4ocykgKyAxKTsKLSAgICBpZiAocmVzdWx0ID09IChjaGFyKikwKQotCXJldHVybiAoY2hhciopMDsKLSAgICBzdHJjcHkocmVzdWx0LCBzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmVycm9yLmMgYi9saWJpYmVydHkvc3RyZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0Y2M3NS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RyZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDgzMSArMCwwIEBACi0vKiBFeHRlbmRlZCBzdXBwb3J0IGZvciB1c2luZyBlcnJubyB2YWx1ZXMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaC4gIGZuZkBjeWdudXMuY29tCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLVBlciBCb3RobmVyLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfU1lTX0VSUkxJU1QKLS8qIE5vdGUgdGhhdCBlcnJuby5oIChub3Qgc3VyZSB3aGF0IE9TKSBvciBzdGRpby5oIChCU0QgNC40LCBhdCBsZWFzdCkKLSAgIG1pZ2h0IGRlY2xhcmUgc3lzX2Vycmxpc3QgaW4gYSB3YXkgdGhhdCB0aGUgY29tcGlsZXIgbWlnaHQgY29uc2lkZXIKLSAgIGluY29tcGF0aWJsZSB3aXRoIG91ciBsYXRlciBkZWNsYXJhdGlvbiwgcGVyaGFwcyBieSB1c2luZyBjb25zdAotICAgYXR0cmlidXRlcy4gIFNvIHdlIGhpZGUgdGhlIGRlY2xhcmF0aW9uIGluIGVycm5vLmggKGlmIGFueSkgdXNpbmcgYQotICAgbWFjcm8uICovCi0jZGVmaW5lIHN5c19lcnJsaXN0IHN5c19lcnJsaXN0X18KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgSEFWRV9TWVNfRVJSTElTVAotI3VuZGVmIHN5c19lcnJsaXN0Ci0jZW5kaWYKLQotLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gdm9pZCAqbWFsbG9jIChzaXplX3Qgc2l6ZSk7CQkJCS8qIDQuMTAuMy4zICovCi1leHRlcm4gdm9pZCAqbWVtc2V0ICh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOwkJCS8qIDQuMTEuNi4xICovCi0jZWxzZQkvKiAhX19TVERDX18gKi8KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCi1leHRlcm4gY2hhciAqbWVtc2V0ICgpOwotI2VuZGlmCS8qIF9fU1REQ19fICovCi0KLSNpZm5kZWYgTUFYCi0jICBkZWZpbmUgTUFYKGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBpbml0X2Vycm9yX3RhYmxlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGZvciBlcnJubyB2YWx1ZXMuICBTZWUgaW50cm8oMikgaW4gbW9zdCBVTklYIHN5c3RlbXMKLSAgIFByb2dyYW1tZXJzIFJlZmVyZW5jZSBNYW51YWxzLgotCi0gICBOb3RlIHRoYXQgdGhpcyB0YWJsZSBpcyBnZW5lcmFsbHkgb25seSBhY2Nlc3NlZCB3aGVuIGl0IGlzIHVzZWQgYXQgcnVudGltZQotICAgdG8gaW5pdGlhbGl6ZSBlcnJubyBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcyB0aGF0IGFyZSBpbmRleGVkIGJ5IGVycm5vCi0gICB2YWx1ZS4KLQotICAgTm90IGFsbCBvZiB0aGVzZSBlcnJub3Mgd2lsbCBleGlzdCBvbiBhbGwgc3lzdGVtcy4gIFRoaXMgdGFibGUgaXMgdGhlIG9ubHkKLSAgIHRoaW5nIHRoYXQgc2hvdWxkIGhhdmUgdG8gYmUgdXBkYXRlZCBhcyBuZXcgZXJyb3IgbnVtYmVycyBhcmUgaW50cm9kdWNlZC4KLSAgIEl0J3Mgc29ydCBvZiB1Z2x5LCBidXQgYXQgbGVhc3QgaXRzIHBvcnRhYmxlLiAqLwotCi1zdHJ1Y3QgZXJyb3JfaW5mbwotewotICBpbnQgdmFsdWU7CQkvKiBUaGUgbnVtZXJpYyB2YWx1ZSBmcm9tIDxlcnJuby5oPiAqLwotICBjb25zdCBjaGFyICpuYW1lOwkvKiBUaGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZSAqLwotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0gIGNvbnN0IGNoYXIgKm1zZzsJLyogU2hvcnQgbWVzc2FnZSBhYm91dCB0aGlzIHZhbHVlICovCi0jZW5kaWYKLX07Ci0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotIyAgIGRlZmluZSBFTlRSWSh2YWx1ZSwgbmFtZSwgbXNnKQl7dmFsdWUsIG5hbWUsIG1zZ30KLSNlbHNlCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVycm9yX2luZm8gZXJyb3JfdGFibGVbXSA9Ci17Ci0jaWYgZGVmaW5lZCAoRVBFUk0pCi0gIEVOVFJZKEVQRVJNLCAiRVBFUk0iLCAiTm90IG93bmVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9FTlQpCi0gIEVOVFJZKEVOT0VOVCwgIkVOT0VOVCIsICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1JDSCkKLSAgRU5UUlkoRVNSQ0gsICJFU1JDSCIsICJObyBzdWNoIHByb2Nlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTlRSKQotICBFTlRSWShFSU5UUiwgIkVJTlRSIiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSU8pCi0gIEVOVFJZKEVJTywgIkVJTyIsICJJL08gZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOWElPKQotICBFTlRSWShFTlhJTywgIkVOWElPIiwgIk5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEUyQklHKQotICBFTlRSWShFMkJJRywgIkUyQklHIiwgIkFyZyBsaXN0IHRvbyBsb25nIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9FWEVDKQotICBFTlRSWShFTk9FWEVDLCAiRU5PRVhFQyIsICJFeGVjIGZvcm1hdCBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBREYpCi0gIEVOVFJZKEVCQURGLCAiRUJBREYiLCAiQmFkIGZpbGUgbnVtYmVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ0hJTEQpCi0gIEVOVFJZKEVDSElMRCwgIkVDSElMRCIsICJObyBjaGlsZCBwcm9jZXNzZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVXT1VMREJMT0NLKQkvKiBQdXQgYmVmb3JlIEVBR0FJTiwgc29tZXRpbWVzIGFsaWFzZWQgKi8KLSAgRU5UUlkoRVdPVUxEQkxPQ0ssICJFV09VTERCTE9DSyIsICJPcGVyYXRpb24gd291bGQgYmxvY2siKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBR0FJTikKLSAgRU5UUlkoRUFHQUlOLCAiRUFHQUlOIiwgIk5vIG1vcmUgcHJvY2Vzc2VzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9NRU0pCi0gIEVOVFJZKEVOT01FTSwgIkVOT01FTSIsICJOb3QgZW5vdWdoIHNwYWNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUNDRVMpCi0gIEVOVFJZKEVBQ0NFUywgIkVBQ0NFUyIsICJQZXJtaXNzaW9uIGRlbmllZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUZBVUxUKQotICBFTlRSWShFRkFVTFQsICJFRkFVTFQiLCAiQmFkIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RCTEspCi0gIEVOVFJZKEVOT1RCTEssICJFTk9UQkxLIiwgIkJsb2NrIGRldmljZSByZXF1aXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJVU1kpCi0gIEVOVFJZKEVCVVNZLCAiRUJVU1kiLCAiRGV2aWNlIGJ1c3kiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVFWElTVCkKLSAgRU5UUlkoRUVYSVNULCAiRUVYSVNUIiwgIkZpbGUgZXhpc3RzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFWERFVikKLSAgRU5UUlkoRVhERVYsICJFWERFViIsICJDcm9zcy1kZXZpY2UgbGluayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PREVWKQotICBFTlRSWShFTk9ERVYsICJFTk9ERVYiLCAiTm8gc3VjaCBkZXZpY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RESVIpCi0gIEVOVFJZKEVOT1RESVIsICJFTk9URElSIiwgIk5vdCBhIGRpcmVjdG9yeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlTRElSKQotICBFTlRSWShFSVNESVIsICJFSVNESVIiLCAiSXMgYSBkaXJlY3RvcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTlZBTCkKLSAgRU5UUlkoRUlOVkFMLCAiRUlOVkFMIiwgIkludmFsaWQgYXJndW1lbnQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORklMRSkKLSAgRU5UUlkoRU5GSUxFLCAiRU5GSUxFIiwgIkZpbGUgdGFibGUgb3ZlcmZsb3ciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNRklMRSkKLSAgRU5UUlkoRU1GSUxFLCAiRU1GSUxFIiwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RUWSkKLSAgRU5UUlkoRU5PVFRZLCAiRU5PVFRZIiwgIk5vdCBhIHR5cGV3cml0ZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVUWFRCU1kpCi0gIEVOVFJZKEVUWFRCU1ksICJFVFhUQlNZIiwgIlRleHQgZmlsZSBidXN5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFRkJJRykKLSAgRU5UUlkoRUZCSUcsICJFRkJJRyIsICJGaWxlIHRvbyBsYXJnZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PU1BDKQotICBFTlRSWShFTk9TUEMsICJFTk9TUEMiLCAiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTUElQRSkKLSAgRU5UUlkoRVNQSVBFLCAiRVNQSVBFIiwgIklsbGVnYWwgc2VlayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJPRlMpCi0gIEVOVFJZKEVST0ZTLCAiRVJPRlMiLCAiUmVhZC1vbmx5IGZpbGUgc3lzdGVtIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTUxJTkspCi0gIEVOVFJZKEVNTElOSywgIkVNTElOSyIsICJUb28gbWFueSBsaW5rcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBJUEUpCi0gIEVOVFJZKEVQSVBFLCAiRVBJUEUiLCAiQnJva2VuIHBpcGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVET00pCi0gIEVOVFJZKEVET00sICJFRE9NIiwgIk1hdGggYXJndW1lbnQgb3V0IG9mIGRvbWFpbiBvZiBmdW5jIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkFOR0UpCi0gIEVOVFJZKEVSQU5HRSwgIkVSQU5HRSIsICJNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTVNHKQotICBFTlRSWShFTk9NU0csICJFTk9NU0ciLCAiTm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJRFJNKQotICBFTlRSWShFSURSTSwgIkVJRFJNIiwgIklkZW50aWZpZXIgcmVtb3ZlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNIUk5HKQotICBFTlRSWShFQ0hSTkcsICJFQ0hSTkciLCAiQ2hhbm5lbCBudW1iZXIgb3V0IG9mIHJhbmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDJOU1lOQykKLSAgRU5UUlkoRUwyTlNZTkMsICJFTDJOU1lOQyIsICJMZXZlbCAyIG5vdCBzeW5jaHJvbml6ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMM0hMVCkKLSAgRU5UUlkoRUwzSExULCAiRUwzSExUIiwgIkxldmVsIDMgaGFsdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDNSU1QpCi0gIEVOVFJZKEVMM1JTVCwgIkVMM1JTVCIsICJMZXZlbCAzIHJlc2V0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTE5STkcpCi0gIEVOVFJZKEVMTlJORywgIkVMTlJORyIsICJMaW5rIG51bWJlciBvdXQgb2YgcmFuZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVTkFUQ0gpCi0gIEVOVFJZKEVVTkFUQ0gsICJFVU5BVENIIiwgIlByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0NTSSkKLSAgRU5UUlkoRU5PQ1NJLCAiRU5PQ1NJIiwgIk5vIENTSSBzdHJ1Y3R1cmUgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDJITFQpCi0gIEVOVFJZKEVMMkhMVCwgIkVMMkhMVCIsICJMZXZlbCAyIGhhbHRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURFQURMSykKLSAgRU5UUlkoRURFQURMSywgIkVERUFETEsiLCAiRGVhZGxvY2sgY29uZGl0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9MQ0spCi0gIEVOVFJZKEVOT0xDSywgIkVOT0xDSyIsICJObyByZWNvcmQgbG9ja3MgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERSkKLSAgRU5UUlkoRUJBREUsICJFQkFERSIsICJJbnZhbGlkIGV4Y2hhbmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFEUikKLSAgRU5UUlkoRUJBRFIsICJFQkFEUiIsICJJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVhGVUxMKQotICBFTlRSWShFWEZVTEwsICJFWEZVTEwiLCAiRXhjaGFuZ2UgZnVsbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PQU5PKQotICBFTlRSWShFTk9BTk8sICJFTk9BTk8iLCAiTm8gYW5vZGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURSUUMpCi0gIEVOVFJZKEVCQURSUUMsICJFQkFEUlFDIiwgIkludmFsaWQgcmVxdWVzdCBjb2RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFEU0xUKQotICBFTlRSWShFQkFEU0xULCAiRUJBRFNMVCIsICJJbnZhbGlkIHNsb3QiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVERUFETE9DSykKLSAgRU5UUlkoRURFQURMT0NLLCAiRURFQURMT0NLIiwgIkZpbGUgbG9ja2luZyBkZWFkbG9jayBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJGT05UKQotICBFTlRSWShFQkZPTlQsICJFQkZPTlQiLCAiQmFkIGZvbnQgZmlsZSBmb3JtYXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1NUUikKLSAgRU5UUlkoRU5PU1RSLCAiRU5PU1RSIiwgIkRldmljZSBub3QgYSBzdHJlYW0iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0RBVEEpCi0gIEVOVFJZKEVOT0RBVEEsICJFTk9EQVRBIiwgIk5vIGRhdGEgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVElNRSkKLSAgRU5UUlkoRVRJTUUsICJFVElNRSIsICJUaW1lciBleHBpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TUikKLSAgRU5UUlkoRU5PU1IsICJFTk9TUiIsICJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT05FVCkKLSAgRU5UUlkoRU5PTkVULCAiRU5PTkVUIiwgIk1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9QS0cpCi0gIEVOVFJZKEVOT1BLRywgIkVOT1BLRyIsICJQYWNrYWdlIG5vdCBpbnN0YWxsZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRU1PVEUpCi0gIEVOVFJZKEVSRU1PVEUsICJFUkVNT1RFIiwgIk9iamVjdCBpcyByZW1vdGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0xJTkspCi0gIEVOVFJZKEVOT0xJTkssICJFTk9MSU5LIiwgIkxpbmsgaGFzIGJlZW4gc2V2ZXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFEVikKLSAgRU5UUlkoRUFEViwgIkVBRFYiLCAiQWR2ZXJ0aXNlIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1JNTlQpCi0gIEVOVFJZKEVTUk1OVCwgIkVTUk1OVCIsICJTcm1vdW50IGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09NTSkKLSAgRU5UUlkoRUNPTU0sICJFQ09NTSIsICJDb21tdW5pY2F0aW9uIGVycm9yIG9uIHNlbmQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQUk9UTykKLSAgRU5UUlkoRVBST1RPLCAiRVBST1RPIiwgIlByb3RvY29sIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTVVMVElIT1ApCi0gIEVOVFJZKEVNVUxUSUhPUCwgIkVNVUxUSUhPUCIsICJNdWx0aWhvcCBhdHRlbXB0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVET1RET1QpCi0gIEVOVFJZKEVET1RET1QsICJFRE9URE9UIiwgIlJGUyBzcGVjaWZpYyBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBRE1TRykKLSAgRU5UUlkoRUJBRE1TRywgIkVCQURNU0ciLCAiTm90IGEgZGF0YSBtZXNzYWdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkFNRVRPT0xPTkcpCi0gIEVOVFJZKEVOQU1FVE9PTE9ORywgIkVOQU1FVE9PTE9ORyIsICJGaWxlIG5hbWUgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVPVkVSRkxPVykKLSAgRU5UUlkoRU9WRVJGTE9XLCAiRU9WRVJGTE9XIiwgIlZhbHVlIHRvbyBsYXJnZSBmb3IgZGVmaW5lZCBkYXRhIHR5cGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RVTklRKQotICBFTlRSWShFTk9UVU5JUSwgIkVOT1RVTklRIiwgIk5hbWUgbm90IHVuaXF1ZSBvbiBuZXR3b3JrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERkQpCi0gIEVOVFJZKEVCQURGRCwgIkVCQURGRCIsICJGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVNQ0hHKQotICBFTlRSWShFUkVNQ0hHLCAiRVJFTUNIRyIsICJSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCQUNDKQotICBFTlRSWShFTElCQUNDLCAiRUxJQkFDQyIsICJDYW4gbm90IGFjY2VzcyBhIG5lZWRlZCBzaGFyZWQgbGlicmFyeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQkJBRCkKLSAgRU5UUlkoRUxJQkJBRCwgIkVMSUJCQUQiLCAiQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCU0NOKQotICBFTlRSWShFTElCU0NOLCAiRUxJQlNDTiIsICIubGliIHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCTUFYKQotICBFTlRSWShFTElCTUFYLCAiRUxJQk1BWCIsICJBdHRlbXB0aW5nIHRvIGxpbmsgaW4gdG9vIG1hbnkgc2hhcmVkIGxpYnJhcmllcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQkVYRUMpCi0gIEVOVFJZKEVMSUJFWEVDLCAiRUxJQkVYRUMiLCAiQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlMU0VRKQotICBFTlRSWShFSUxTRVEsICJFSUxTRVEiLCAiSWxsZWdhbCBieXRlIHNlcXVlbmNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TWVMpCi0gIEVOVFJZKEVOT1NZUywgIkVOT1NZUyIsICJPcGVyYXRpb24gbm90IGFwcGxpY2FibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMT09QKQotICBFTlRSWShFTE9PUCwgIkVMT09QIiwgIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVTVEFSVCkKLSAgRU5UUlkoRVJFU1RBUlQsICJFUkVTVEFSVCIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBzaG91bGQgYmUgcmVzdGFydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1RSUElQRSkKLSAgRU5UUlkoRVNUUlBJUEUsICJFU1RSUElQRSIsICJTdHJlYW1zIHBpcGUgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RFTVBUWSkKLSAgRU5UUlkoRU5PVEVNUFRZLCAiRU5PVEVNUFRZIiwgIkRpcmVjdG9yeSBub3QgZW1wdHkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVU0VSUykKLSAgRU5UUlkoRVVTRVJTLCAiRVVTRVJTIiwgIlRvbyBtYW55IHVzZXJzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UU09DSykKLSAgRU5UUlkoRU5PVFNPQ0ssICJFTk9UU09DSyIsICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVERVNUQUREUlJFUSkKLSAgRU5UUlkoRURFU1RBRERSUkVRLCAiRURFU1RBRERSUkVRIiwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNU0dTSVpFKQotICBFTlRSWShFTVNHU0laRSwgIkVNU0dTSVpFIiwgIk1lc3NhZ2UgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQUk9UT1RZUEUpCi0gIEVOVFJZKEVQUk9UT1RZUEUsICJFUFJPVE9UWVBFIiwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PUFJPVE9PUFQpCi0gIEVOVFJZKEVOT1BST1RPT1BULCAiRU5PUFJPVE9PUFQiLCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBST1RPTk9TVVBQT1JUKQotICBFTlRSWShFUFJPVE9OT1NVUFBPUlQsICJFUFJPVE9OT1NVUFBPUlQiLCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNPQ0tUTk9TVVBQT1JUKQotICBFTlRSWShFU09DS1ROT1NVUFBPUlQsICJFU09DS1ROT1NVUFBPUlQiLCAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU9QTk9UU1VQUCkKLSAgRU5UUlkoRU9QTk9UU1VQUCwgIkVPUE5PVFNVUFAiLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUEZOT1NVUFBPUlQpCi0gIEVOVFJZKEVQRk5PU1VQUE9SVCwgIkVQRk5PU1VQUE9SVCIsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFGTk9TVVBQT1JUKQotICBFTlRSWShFQUZOT1NVUFBPUlQsICJFQUZOT1NVUFBPUlQiLCAiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFERFJJTlVTRSkKLSAgRU5UUlkoRUFERFJJTlVTRSwgIkVBRERSSU5VU0UiLCAiQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFERFJOT1RBVkFJTCkKLSAgRU5UUlkoRUFERFJOT1RBVkFJTCwgIkVBRERSTk9UQVZBSUwiLCJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkVURE9XTikKLSAgRU5UUlkoRU5FVERPV04sICJFTkVURE9XTiIsICJOZXR3b3JrIGlzIGRvd24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRVTlJFQUNIKQotICBFTlRSWShFTkVUVU5SRUFDSCwgIkVORVRVTlJFQUNIIiwgIk5ldHdvcmsgaXMgdW5yZWFjaGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRSRVNFVCkKLSAgRU5UUlkoRU5FVFJFU0VULCAiRU5FVFJFU0VUIiwgIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgcmVzZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OQUJPUlRFRCkKLSAgRU5UUlkoRUNPTk5BQk9SVEVELCAiRUNPTk5BQk9SVEVEIiwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09OTlJFU0VUKQotICBFTlRSWShFQ09OTlJFU0VULCAiRUNPTk5SRVNFVCIsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0JVRlMpCi0gIEVOVFJZKEVOT0JVRlMsICJFTk9CVUZTIiwgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJU0NPTk4pCi0gIEVOVFJZKEVJU0NPTk4sICJFSVNDT05OIiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVENPTk4pCi0gIEVOVFJZKEVOT1RDT05OLCAiRU5PVENPTk4iLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTSFVURE9XTikKLSAgRU5UUlkoRVNIVVRET1dOLCAiRVNIVVRET1dOIiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRPT01BTllSRUZTKQotICBFTlRSWShFVE9PTUFOWVJFRlMsICJFVE9PTUFOWVJFRlMiLCAiVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRJTUVET1VUKQotICBFTlRSWShFVElNRURPVVQsICJFVElNRURPVVQiLCAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OUkVGVVNFRCkKLSAgRU5UUlkoRUNPTk5SRUZVU0VELCAiRUNPTk5SRUZVU0VEIiwgIkNvbm5lY3Rpb24gcmVmdXNlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUhPU1RET1dOKQotICBFTlRSWShFSE9TVERPV04sICJFSE9TVERPV04iLCAiSG9zdCBpcyBkb3duIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSE9TVFVOUkVBQ0gpCi0gIEVOVFJZKEVIT1NUVU5SRUFDSCwgIkVIT1NUVU5SRUFDSCIsICJObyByb3V0ZSB0byBob3N0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUxSRUFEWSkKLSAgRU5UUlkoRUFMUkVBRFksICJFQUxSRUFEWSIsICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlOUFJPR1JFU1MpCi0gIEVOVFJZKEVJTlBST0dSRVNTLCAiRUlOUFJPR1JFU1MiLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNUQUxFKQotICBFTlRSWShFU1RBTEUsICJFU1RBTEUiLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVUNMRUFOKQotICBFTlRSWShFVUNMRUFOLCAiRVVDTEVBTiIsICJTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1ROQU0pCi0gIEVOVFJZKEVOT1ROQU0sICJFTk9UTkFNIiwgIk5vdCBhIFhFTklYIG5hbWVkIHR5cGUgZmlsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5BVkFJTCkKLSAgRU5UUlkoRU5BVkFJTCwgIkVOQVZBSUwiLCAiTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJU05BTSkKLSAgRU5UUlkoRUlTTkFNLCAiRUlTTkFNIiwgIklzIGEgbmFtZWQgdHlwZSBmaWxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVNT1RFSU8pCi0gIEVOVFJZKEVSRU1PVEVJTywgIkVSRU1PVEVJTyIsICJSZW1vdGUgSS9PIGVycm9yIiksCi0jZW5kaWYKLSAgRU5UUlkoMCwgTlVMTCwgTlVMTCkKLX07Ci0KLSNpZmRlZiBFVk1TRVJSCi0vKiBUaGlzIGlzIG5vdCBpbiB0aGUgdGFibGUsIGJlY2F1c2UgdGhlIG51bWVyaWMgdmFsdWUgb2YgRVZNU0VSUiAoMzI3NjcpCi0gICBsaWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHN5c19lcnJsaXN0W10uICAqLwotc3RhdGljIHN0cnVjdCB7IGludCB2YWx1ZTsgY29uc3QgY2hhciAqbmFtZSwgKm1zZzsgfQotICBldm1zZXJyID0geyBFVk1TRVJSLCAiRVZNU0VSUiIsICJWTVMtc3BlY2lmaWMgZXJyb3IiIH07Ci0jZW5kaWYKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLiAgSW5kZXhlZCBieSB0aGUKLSAgIGVycm5vIHZhbHVlIHRvIGZpbmQgdGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoqZXJyb3JfbmFtZXM7Ci1zdGF0aWMgaW50IG51bV9lcnJvcl9uYW1lcyA9IDA7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgcnVudGltZSwgaWYgaXQgZG9lcyBub3QKLSAgIGFscmVhZHkgZXhpc3QgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuICBJbmRleGVkIGJ5IHRoZSBlcnJubyB2YWx1ZSB0byBmaW5kCi0gICB0aGUgZGVzY3JpcHRpdmUgc3RyaW5nLgotCi0gICBXZSBkb24ndCBleHBvcnQgaXQgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaGFzIHRoZQotICAgc2FtZSBuYW1lLCBpdCBkaWZmZXJzIGZyb20gb3RoZXIgaW1wbGVtZW50YXRpb25zIGluIHRoYXQgaXQgaXMgZHluYW1pY2FsbHkKLSAgIGluaXRpYWxpemVkIHJhdGhlciB0aGFuIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQuICovCi0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi1zdGF0aWMgaW50IHN5c19uZXJyOwotc3RhdGljIGNvbnN0IGNoYXIgKipzeXNfZXJybGlzdDsKLQotI2Vsc2UKLQotZXh0ZXJuIGludCBzeXNfbmVycjsKLWV4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOwotCi0jZW5kaWYKLQotCi0vKgotCi1OQU1FCi0KLQlpbml0X2Vycm9yX3RhYmxlcyAtLSBpbml0aWFsaXplIHRoZSBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIHZvaWQgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlVc2luZyB0aGUgZXJyb3JfdGFibGUsIHdoaWNoIGlzIGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZSwgZ2VuZXJhdGUKLQl0aGUgZXJyb3JfbmFtZXMgYW5kIHRoZSBzeXNfZXJybGlzdCAoaWYgbmVlZGVkKSB0YWJsZXMsIHdoaWNoIGFyZQotCWluZGV4ZWQgYXQgcnVudGltZSBieSBhIHNwZWNpZmljIGVycm5vIHZhbHVlLgotCi1CVUdTCi0KLQlUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlcyBtYXkgZmFpbCB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMsCi0JaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgdXNlZnVsLCBidXQgd2UgZG9uJ3QKLQlib21iIGVpdGhlci4gIFdobyBrbm93cywgaXQgbWlnaHQgc3VjY2VlZCBhdCBhIGxhdGVyIHBvaW50IGlmIHdlIGZyZWUKLQlzb21lIG1lbW9yeSBpbiB0aGUgbWVhbnRpbWUuICBJbiBhbnkgY2FzZSwgdGhlIG90aGVyIHJvdXRpbmVzIGtub3cKLQlob3cgdG8gZGVhbCB3aXRoIGxhY2sgb2YgYSB0YWJsZSBhZnRlciB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBpdC4gIFRoaXMKLQltYXkgb3IgbWF5IG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYnVnLCB0aGF0IHdlIGRvbid0IHNwZWNpZmljYWxseQotCXdhcm4gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIGZhaWx1cmUgbW9kZS4KLQotKi8KLQotc3RhdGljIHZvaWQKLWluaXRfZXJyb3JfdGFibGVzICgpCi17Ci0gIGNvbnN0IHN0cnVjdCBlcnJvcl9pbmZvICplaXA7Ci0gIGludCBuYnl0ZXM7Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHNjYW5uZWQgdGhlIGVycm9yX3RhYmxlIG9uY2UgdG8gZmluZCB0aGUgbWF4aW11bQotICAgICBlcnJubyB2YWx1ZSwgdGhlbiBnbyBmaW5kIGl0IG5vdy4gKi8KLQotICBpZiAobnVtX2Vycm9yX25hbWVzID09IDApCi0gICAgewotICAgICAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JewotCSAgaWYgKGVpcCAtPiB2YWx1ZSA+PSBudW1fZXJyb3JfbmFtZXMpCi0JICAgIHsKLQkgICAgICBudW1fZXJyb3JfbmFtZXMgPSBlaXAgLT4gdmFsdWUgKyAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYXR0ZW1wdCB0byBhbGxvY2F0ZSB0aGUgZXJyb3JfbmFtZXMgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZXJyb3JfdGFibGUuICovCi0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX2Vycm9yX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChlcnJvcl9uYW1lcyA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChlcnJvcl9uYW1lcywgMCwgbmJ5dGVzKTsKLQkgIGZvciAoZWlwID0gZXJyb3JfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgZXJyb3JfbmFtZXNbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBuYW1lOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLSAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHN5c19lcnJsaXN0IHRhYmxlLCB6ZXJvIGl0IG91dCwgYW5kIHRoZW4KLSAgICAgaW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGVycm9yX3RhYmxlLiAqLwotCi0gIGlmIChzeXNfZXJybGlzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5ieXRlcyA9IG51bV9lcnJvcl9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoc3lzX2Vycmxpc3QgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc3lzX2Vycmxpc3QsIDAsIG5ieXRlcyk7Ci0JICBzeXNfbmVyciA9IG51bV9lcnJvcl9uYW1lczsKLQkgIGZvciAoZWlwID0gZXJyb3JfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgc3lzX2Vycmxpc3RbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBtc2c7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jZW5kaWYKLQotfQotCi0vKgotCi1OQU1FCi0KLQllcnJub19tYXggLS0gcmV0dXJuIHRoZSBtYXggZXJybm8gdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBlcnJub19tYXggKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIHRoZSBtYXhpbXVtIGVycm5vIHZhbHVlIGZvciB3aGljaCBhIGNvcnJlc3BvbmRpbmcgc3ltYm9saWMKLQluYW1lIG9yIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLiAgTm90ZSB0aGF0IGluIHRoZSBjYXNlIHdoZXJlCi0Jd2UgdXNlIHRoZSBzeXNfZXJybGlzdCBzdXBwbGllZCBieSB0aGUgc3lzdGVtLCBpdCBpcyBwb3NzaWJsZSBmb3IKLQl0aGVyZSB0byBiZSBtb3JlIHN5bWJvbGljIG5hbWVzIHRoYW4gbWVzc2FnZXMsIG9yIHZpY2UgdmVyc2EuCi0JSW4gZmFjdCwgdGhlIG1hbnVhbCBwYWdlIGZvciBwZXJyb3IoM0MpIGV4cGxpY2l0bHkgd2FybnMgdGhhdCBvbmUKLQlzaG91bGQgY2hlY2sgdGhlIHNpemUgb2YgdGhlIHRhYmxlIChzeXNfbmVycikgYmVmb3JlIGluZGV4aW5nIGl0LAotCXNpbmNlIG5ldyBlcnJvciBjb2RlcyBtYXkgYmUgYWRkZWQgdG8gdGhlIHN5c3RlbSBiZWZvcmUgdGhleSBhcmUKLQlhZGRlZCB0byB0aGUgdGFibGUuICBUaHVzIHN5c19uZXJyIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB2YWx1ZQotCWltcGxpZWQgYnkgdGhlIGxhcmdlc3QgZXJybm8gdmFsdWUgZGVmaW5lZCBpbiA8ZXJybm8uaD4uCi0KLQlXZSByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYSBtZWFuaW5nZnVsCi0Jc3ltYm9saWMgbmFtZSBvciBtZXNzYWdlLgotCi0qLwotCi1pbnQKLWVycm5vX21heCAoKQotewotICBpbnQgbWF4c2l6ZTsKLQotICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLSAgICB9Ci0gIG1heHNpemUgPSBNQVggKHN5c19uZXJyLCBudW1fZXJyb3JfbmFtZXMpOwotICByZXR1cm4gKG1heHNpemUgLSAxKTsKLX0KLQotI2lmbmRlZiBIQVZFX1NUUkVSUk9SCi0KLS8qCi0KLU5BTUUKLQotCXN0cmVycm9yIC0tIG1hcCBhbiBlcnJvciBudW1iZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNoYXIgKnN0cmVycm9yIChpbnQgZXJybm92YWwpCi0KLURFU0NSSVBUSU9OCi0KLQlNYXBzIGFuIGVycm5vIG51bWJlciB0byBhbiBlcnJvciBtZXNzYWdlIHN0cmluZywgdGhlIGNvbnRlbnRzIG9mCi0Jd2hpY2ggYXJlIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICBPbiBzeXN0ZW1zIHdoaWNoIGhhdmUgdGhlIGV4dGVybmFsCi0JdmFyaWFibGVzIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCwgdGhlc2Ugc3RyaW5ncyB3aWxsIGJlIHRoZSBzYW1lCi0JYXMgdGhlIG9uZXMgdXNlZCBieSBwZXJyb3IoKS4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHRoZSBzeXNfZXJybGlzdCwgYnV0IG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgotCWVycm9yIG51bWJlciwgdGhlbiByZXR1cm5zIHRoZSBzdHJpbmcgIkVycm9yIE5VTSIsIHdoZXJlIE5VTSBpcyB0aGUKLQllcnJvciBudW1iZXIuCi0KLQlJZiB0aGUgc3VwcGxpZWQgZXJyb3IgbnVtYmVyIGlzIG5vdCBhIHZhbGlkIGluZGV4IGludG8gc3lzX2Vycmxpc3QsCi0JcmV0dXJucyBOVUxMLgotCi0JVGhlIHJldHVybmVkIHN0cmluZyBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgb25seSB1bnRpbCB0aGUKLQluZXh0IGNhbGwgdG8gc3RyZXJyb3IuCi0KLSovCi0KLWNoYXIgKgotc3RyZXJyb3IgKGVycm5vdmFsKQotICBpbnQgZXJybm92YWw7Ci17Ci0gIGNoYXIgKm1zZzsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0gICAgfQotCi0jZW5kaWYKLQotICBpZiAoKGVycm5vdmFsIDwgMCkgfHwgKGVycm5vdmFsID49IHN5c19uZXJyKSkKLSAgICB7Ci0jaWZkZWYgRVZNU0VSUgotICAgICAgaWYgKGVycm5vdmFsID09IGV2bXNlcnIudmFsdWUpCi0JbXNnID0gZXZtc2Vyci5tc2c7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbXNnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeXNfZXJybGlzdCA9PSBOVUxMKSB8fCAoc3lzX2Vycmxpc3RbZXJybm92YWxdID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gc3lzX2Vycmxpc3Qgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIkVycm9yICVkIiwgZXJybm92YWwpOwotICAgICAgbXNnID0gYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBhbmQgYSB2YWxpZCBtZXNzYWdlLiAgSnVzdCByZXR1cm4gdGhlIG1lc3NhZ2UuICovCi0gICAgICBtc2cgPSAoY2hhciAqKSBzeXNfZXJybGlzdFtlcnJub3ZhbF07Ci0gICAgfQotICAKLSAgcmV0dXJuIChtc2cpOwotfQotCi0jZW5kaWYJLyogISBIQVZFX1NUUkVSUk9SICovCi0KLQotLyoKLQotTkFNRQotCi0Jc3RyZXJybm8gLS0gbWFwIGFuIGVycm9yIG51bWJlciB0byBhIHN5bWJvbGljIG5hbWUgc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJlcnJubyAoaW50IGVycm5vdmFsKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gYW4gZXJyb3IgbnVtYmVyIHJldHVybmVkIGZyb20gYSBzeXN0ZW0gY2FsbCAodHlwaWNhbGx5Ci0JcmV0dXJuZWQgaW4gZXJybm8pLCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZQotCXN5bWJvbGljIG5hbWUgb2YgdGhhdCBlcnJvciBudW1iZXIsIGFzIGZvdW5kIGluIDxlcnJuby5oPi4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHN5bWJvbGljIG5hbWVzLCBidXQgbm8gbmFtZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwYXJ0aWN1bGFyCi0JZXJyb3IgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiRXJyb3IgTlVNIiwgd2hlcmUgTlVNIGlzCi0JdGhlIGVycm9yIG51bWJlci4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdmFsaWQKLQlpbmRpY2VzLCB0aGVuIHJldHVybnMgTlVMTC4KLQotQlVHUwotCi0JVGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUKLQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHN0cmVycm5vLgotCi0qLwotCi1jb25zdCBjaGFyICoKLXN0cmVycm5vIChlcnJub3ZhbCkKLSAgaW50IGVycm5vdmFsOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0gIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfZXJyb3JfdGFibGVzICgpOwotICAgIH0KLQotICBpZiAoKGVycm5vdmFsIDwgMCkgfHwgKGVycm5vdmFsID49IG51bV9lcnJvcl9uYW1lcykpCi0gICAgewotI2lmZGVmIEVWTVNFUlIKLSAgICAgIGlmIChlcnJub3ZhbCA9PSBldm1zZXJyLnZhbHVlKQotCW5hbWUgPSBldm1zZXJyLm5hbWU7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICgoZXJyb3JfbmFtZXMgPT0gTlVMTCkgfHwgKGVycm9yX25hbWVzW2Vycm5vdmFsXSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYnV0IG5vIGVycm9yX25hbWVzIG9yIG5vIGVudHJ5IGF0IHRoaXMgaW5kZXguICovCi0gICAgICBzcHJpbnRmIChidWYsICJFcnJvciAlZCIsIGVycm5vdmFsKTsKLSAgICAgIG5hbWUgPSAoY29uc3QgY2hhciAqKSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG5hbWUuICBKdXN0IHJldHVybiB0aGUgbmFtZS4gKi8KLSAgICAgIG5hbWUgPSBlcnJvcl9uYW1lc1tlcnJub3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiAobmFtZSk7Ci19Ci0KLS8qCi0KLU5BTUUKLQotCXN0cnRvZXJybm8gLS0gbWFwIGEgc3ltYm9saWMgZXJybm8gbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBzdHJ0b2Vycm5vIChjaGFyICpuYW1lKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gdGhlIHN5bWJvbGljIG5hbWUgb2YgYSBlcnJvciBudW1iZXIsIG1hcCBpdCB0byBhbiBlcnJubyB2YWx1ZS4KLQlJZiBubyB0cmFuc2xhdGlvbiBpcyBmb3VuZCwgcmV0dXJucyAwLgotCi0qLwotCi1pbnQKLXN0cnRvZXJybm8gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBlcnJub3ZhbCA9IDA7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLQl9Ci0gICAgICBmb3IgKGVycm5vdmFsID0gMDsgZXJybm92YWwgPCBudW1fZXJyb3JfbmFtZXM7IGVycm5vdmFsKyspCi0JewotCSAgaWYgKChlcnJvcl9uYW1lc1tlcnJub3ZhbF0gIT0gTlVMTCkgJiYKLQkgICAgICAoc3RyY21wIChuYW1lLCBlcnJvcl9uYW1lc1tlcnJub3ZhbF0pID09IDApKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZXJybm92YWwgPT0gbnVtX2Vycm9yX25hbWVzKQotCXsKLSNpZmRlZiBFVk1TRVJSCi0JICBpZiAoc3RyY21wIChuYW1lLCBldm1zZXJyLm5hbWUpID09IDApCi0JICAgIGVycm5vdmFsID0gZXZtc2Vyci52YWx1ZTsKLQkgIGVsc2UKLSNlbmRpZgotCSAgZXJybm92YWwgPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAoZXJybm92YWwpOwotfQotCi0KLS8qIEEgc2ltcGxlIGxpdHRsZSBtYWluIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCBwcmludCBhbGwgdGhlIGVycm5vIHRyYW5zbGF0aW9ucwotICAgaWYgTUFJTiBpcyBkZWZpbmVkIGFuZCB0aGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZC4gKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgZXJybjsKLSAgaW50IGVycm5tYXg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoYXIgKm1zZzsKLSAgY2hhciAqc3RyZXJyb3IgKCk7Ci0KLSAgZXJybm1heCA9IGVycm5vX21heCAoKTsKLSAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBuYW1lcyB0YWJsZS5cbiIsIG51bV9lcnJvcl9uYW1lcyk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbWVzc2FnZXMgdGFibGUuXG4iLCBzeXNfbmVycik7Ci0gIHByaW50ZiAoIiVkIGlzIG1heCB1c2VmdWwgaW5kZXguXG4iLCBlcnJubWF4KTsKLQotICAvKiBLZWVwIHByaW50aW5nIHZhbHVlcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIGVuZCBvZiAqYm90aCogdGFibGVzLCBub3QKLSAgICAgKmVpdGhlciogdGFibGUuICBOb3RlIHRoYXQga25vd2luZyB0aGUgbWF4aW11bSB1c2VmdWwgaW5kZXggZG9lcyAqbm90KgotICAgICByZWxpZXZlIHVzIG9mIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0ZXN0aW5nIHRoZSByZXR1cm4gcG9pbnRlciBmb3IKLSAgICAgTlVMTC4gKi8KLQotICBmb3IgKGVycm4gPSAwOyBlcnJuIDw9IGVycm5tYXg7IGVycm4rKykKLSAgICB7Ci0gICAgICBuYW1lID0gc3RyZXJybm8gKGVycm4pOwotICAgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxOVUxMPiIgOiBuYW1lOwotICAgICAgbXNnID0gc3RyZXJyb3IgKGVycm4pOwotICAgICAgbXNnID0gKG1zZyA9PSBOVUxMKSA/ICI8TlVMTD4iIDogbXNnOwotICAgICAgcHJpbnRmICgiJS00ZCUtMThzJXNcbiIsIGVycm4sIG5hbWUsIG1zZyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJuY2FzZWNtcC5jIGIvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODVjYWMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg3IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZCBhbmQgdGhhdCBkdWUgY3JlZGl0IGlzIGdpdmVuCi0gKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5LiBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQotICogbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRoaXMgc29mdHdhcmUKLSAqIGlzIHByb3ZpZGVkIGBgYXMgaXMnJyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqLwotCi0jaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCi1zdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpc3RyY2FzZWNtcC5jCTUuNSAoQmVya2VsZXkpIDExLzI0Lzg3IjsKLSNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGFycmF5IGlzIGRlc2lnbmVkIGZvciBtYXBwaW5nIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcgotICogdG9nZXRoZXIgZm9yIGEgY2FzZSBpbmRlcGVuZGVudCBjb21wYXJpc29uLiAgVGhlIG1hcHBpbmdzIGFyZQotICogYmFzZWQgdXBvbiBhc2NpaSBjaGFyYWN0ZXIgc2VxdWVuY2VzLgotICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBjaGFybWFwW10gPSB7Ci0JJ1wwMDAnLCAnXDAwMScsICdcMDAyJywgJ1wwMDMnLCAnXDAwNCcsICdcMDA1JywgJ1wwMDYnLCAnXDAwNycsCi0JJ1wwMTAnLCAnXDAxMScsICdcMDEyJywgJ1wwMTMnLCAnXDAxNCcsICdcMDE1JywgJ1wwMTYnLCAnXDAxNycsCi0JJ1wwMjAnLCAnXDAyMScsICdcMDIyJywgJ1wwMjMnLCAnXDAyNCcsICdcMDI1JywgJ1wwMjYnLCAnXDAyNycsCi0JJ1wwMzAnLCAnXDAzMScsICdcMDMyJywgJ1wwMzMnLCAnXDAzNCcsICdcMDM1JywgJ1wwMzYnLCAnXDAzNycsCi0JJ1wwNDAnLCAnXDA0MScsICdcMDQyJywgJ1wwNDMnLCAnXDA0NCcsICdcMDQ1JywgJ1wwNDYnLCAnXDA0NycsCi0JJ1wwNTAnLCAnXDA1MScsICdcMDUyJywgJ1wwNTMnLCAnXDA1NCcsICdcMDU1JywgJ1wwNTYnLCAnXDA1NycsCi0JJ1wwNjAnLCAnXDA2MScsICdcMDYyJywgJ1wwNjMnLCAnXDA2NCcsICdcMDY1JywgJ1wwNjYnLCAnXDA2NycsCi0JJ1wwNzAnLCAnXDA3MScsICdcMDcyJywgJ1wwNzMnLCAnXDA3NCcsICdcMDc1JywgJ1wwNzYnLCAnXDA3NycsCi0JJ1wxMDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxMzMnLCAnXDEzNCcsICdcMTM1JywgJ1wxMzYnLCAnXDEzNycsCi0JJ1wxNDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxNzMnLCAnXDE3NCcsICdcMTc1JywgJ1wxNzYnLCAnXDE3NycsCi0JJ1wyMDAnLCAnXDIwMScsICdcMjAyJywgJ1wyMDMnLCAnXDIwNCcsICdcMjA1JywgJ1wyMDYnLCAnXDIwNycsCi0JJ1wyMTAnLCAnXDIxMScsICdcMjEyJywgJ1wyMTMnLCAnXDIxNCcsICdcMjE1JywgJ1wyMTYnLCAnXDIxNycsCi0JJ1wyMjAnLCAnXDIyMScsICdcMjIyJywgJ1wyMjMnLCAnXDIyNCcsICdcMjI1JywgJ1wyMjYnLCAnXDIyNycsCi0JJ1wyMzAnLCAnXDIzMScsICdcMjMyJywgJ1wyMzMnLCAnXDIzNCcsICdcMjM1JywgJ1wyMzYnLCAnXDIzNycsCi0JJ1wyNDAnLCAnXDI0MScsICdcMjQyJywgJ1wyNDMnLCAnXDI0NCcsICdcMjQ1JywgJ1wyNDYnLCAnXDI0NycsCi0JJ1wyNTAnLCAnXDI1MScsICdcMjUyJywgJ1wyNTMnLCAnXDI1NCcsICdcMjU1JywgJ1wyNTYnLCAnXDI1NycsCi0JJ1wyNjAnLCAnXDI2MScsICdcMjYyJywgJ1wyNjMnLCAnXDI2NCcsICdcMjY1JywgJ1wyNjYnLCAnXDI2NycsCi0JJ1wyNzAnLCAnXDI3MScsICdcMjcyJywgJ1wyNzMnLCAnXDI3NCcsICdcMjc1JywgJ1wyNzYnLCAnXDI3NycsCi0JJ1wzMDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzMzMnLCAnXDMzNCcsICdcMzM1JywgJ1wzMzYnLCAnXDMzNycsCi0JJ1wzNDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzNzMnLCAnXDM3NCcsICdcMzc1JywgJ1wzNzYnLCAnXDM3NycsCi19OwotCi1pbnQKLXN0cm5jYXNlY21wKHMxLCBzMiwgbikKLQljb25zdCBjaGFyICpzMSwgKnMyOwotCXJlZ2lzdGVyIHNpemVfdCBuOwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdTEsIHUyOwotCi0gICAgZm9yICg7IG4gIT0gMDsgLS1uKSB7Ci0JdTEgPSAodW5zaWduZWQgY2hhcikgKnMxKys7Ci0JdTIgPSAodW5zaWduZWQgY2hhcikgKnMyKys7Ci0JaWYgKGNoYXJtYXBbdTFdICE9IGNoYXJtYXBbdTJdKSB7Ci0JICAgIHJldHVybiBjaGFybWFwW3UxXSAtIGNoYXJtYXBbdTJdOwotCX0KLQlpZiAodTEgPT0gJ1wwJykgewotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnJjaHIuYyBiL2xpYmliZXJ0eS9zdHJyY2hyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDViY2IuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnJjaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RycmNocigpLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyoKLU5BTUUKLQlzdHJyY2hyIC0tIHJldHVybiBwb2ludGVyIHRvIGxhc3Qgb2NjdXJhbmNlIG9mIGEgY2hhcmFjdGVyCi0KLVNZTk9QU0lTCi0JY2hhciAqc3RycmNociAoY29uc3QgY2hhciAqcywgaW50IGMpCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIGNoYXJhY3RlciBDIGluCi0Jc3RyaW5nIFMsIG9yIGEgTlVMTCBwb2ludGVyIGlmIG5vIG9jY3VyYW5jZSBpcyBmb3VuZC4KLQkKLUJVR1MKLQlCZWhhdmlvciB3aGVuIGNoYXJhY3RlciBpcyB0aGUgbnVsbCBjaGFyYWN0ZXIgaXMgaW1wbGVtZW50YXRpb24KLQlkZXBlbmRlbnQuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotY2hhciAqCi1zdHJyY2hyIChzLCBjKQotICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgY2hhciAqcnRudmFsID0gMDsKLQotICBkbyB7Ci0gICAgaWYgKCpzID09IGMpCi0gICAgICBydG52YWwgPSAoY2hhciopIHM7Ci0gIH0gd2hpbGUgKCpzKyspOwotICByZXR1cm4gKHJ0bnZhbCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3Ryc2lnbmFsLmMgYi9saWJpYmVydHkvc3Ryc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmIxMGMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnNpZ25hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qIEV4dGVuZGVkIHN1cHBvcnQgZm9yIHVzaW5nIHNpZ25hbCB2YWx1ZXMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaC4gIGZuZkBjeWdudXMuY29tCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0vKiBXZSBuZWVkIHRvIGRlY2xhcmUgc3lzX3NpZ2xpc3QsIGJlY2F1c2UgZXZlbiBpZiB0aGUgc3lzdGVtIHByb3ZpZGVzCi0gICBpdCB3ZSBjYW4ndCBhc3N1bWUgdGhhdCBpdCBpcyBkZWNsYXJlZCBpbiA8c2lnbmFsLmg+IChmb3IgZXhhbXBsZSwKLSAgIFN1bk9TIHByb3ZpZGVzIHN5c19zaWdsaXN0LCBidXQgaXQgZG9lcyBub3QgZGVjbGFyZSBpdCBpbiBhbnkKLSAgIGhlYWRlciBmaWxlKS4gIGZIb3dldmVyLCB3ZSBjYW4ndCBkZWNsYXJlIHN5c19zaWdsaXN0IHBvcnRhYmx5LAotICAgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgaXQgaXMgZGVjbGFyZWQgd2l0aCBjb25zdCBhbmQgb24gc29tZQotICAgc3lzdGVtcyBpdCBpcyBkZWNsYXJlZCB3aXRob3V0IGNvbnN0LiAgSWYgd2Ugd2VyZSB1c2luZyBhdXRvY29uZiwKLSAgIHdlIGNvdWxkIHdvcmsgb3V0IHRoZSByaWdodCBkZWNsYXJhdGlvbi4gIFVudGlsLCB0aGVuIHdlIGp1c3QKLSAgIGlnbm9yZSBhbnkgZGVjbGFyYXRpb24gaW4gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMsIGFuZCBhbHdheXMKLSAgIGRlY2xhcmUgaXQgb3Vyc2VsdmVzLiAgV2l0aCBsdWNrLCB0aGlzIHdpbGwgYWx3YXlzIHdvcmsuICAqLwotI2RlZmluZSBzeXNfc2lnbGlzdCBub19zdWNoX3N5bWJvbAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gdm9pZCAqbWFsbG9jIChzaXplX3Qgc2l6ZSk7CQkJCS8qIDQuMTAuMy4zICovCi1leHRlcm4gdm9pZCAqbWVtc2V0ICh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOwkJCS8qIDQuMTEuNi4xICovCi0jZWxzZQkvKiAhX19TVERDX18gKi8KLWV4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCi1leHRlcm4gY2hhciAqbWVtc2V0ICgpOwotI2VuZGlmCS8qIF9fU1REQ19fICovCi0KLS8qIFVuZGVmaW5lIHRoZSBtYWNybyB3ZSB1c2VkIHRvIGhpZGUgdGhlIGRlZmluaXRpb24gb2Ygc3lzX3NpZ2xpc3QKLSAgIGZvdW5kIGluIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBzeXNfc2lnbGlzdAotCi0jaWZuZGVmIE5VTEwKLSMgIGlmZGVmIF9fU1REQ19fCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE5VTEwgMAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotIyAgZGVmaW5lIE1BWChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgaW5pdF9zaWduYWxfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgZm9yIHNpZ25hbCB2YWx1ZXMuCi0KLSAgIE5vdGUgdGhhdCB0aGlzIHRhYmxlIGlzIGdlbmVyYWxseSBvbmx5IGFjY2Vzc2VkIHdoZW4gaXQgaXMgdXNlZCBhdCBydW50aW1lCi0gICB0byBpbml0aWFsaXplIHNpZ25hbCBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcyB0aGF0IGFyZSBpbmRleGVkIGJ5IHNpZ25hbAotICAgdmFsdWUuCi0KLSAgIE5vdCBhbGwgb2YgdGhlc2Ugc2lnbmFscyB3aWxsIGV4aXN0IG9uIGFsbCBzeXN0ZW1zLiAgVGhpcyB0YWJsZSBpcyB0aGUgb25seQotICAgdGhpbmcgdGhhdCBzaG91bGQgaGF2ZSB0byBiZSB1cGRhdGVkIGFzIG5ldyBzaWduYWwgbnVtYmVycyBhcmUgaW50cm9kdWNlZC4KLSAgIEl0J3Mgc29ydCBvZiB1Z2x5LCBidXQgYXQgbGVhc3QgaXRzIHBvcnRhYmxlLiAqLwotCi1zdHJ1Y3Qgc2lnbmFsX2luZm8KLXsKLSAgaW50IHZhbHVlOwkJLyogVGhlIG51bWVyaWMgdmFsdWUgZnJvbSA8c2lnbmFsLmg+ICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7CS8qIFRoZSBlcXVpdmFsZW50IHN5bWJvbGljIHZhbHVlICovCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLSAgY29uc3QgY2hhciAqbXNnOwkvKiBTaG9ydCBtZXNzYWdlIGFib3V0IHRoaXMgdmFsdWUgKi8KLSNlbmRpZgotfTsKLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZSwgbXNnfQotI2Vsc2UKLSMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lnbmFsX2luZm8gc2lnbmFsX3RhYmxlW10gPQotewotI2lmIGRlZmluZWQgKFNJR0hVUCkKLSAgRU5UUlkoU0lHSFVQLCAiU0lHSFVQIiwgIkhhbmd1cCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHSU5UKQotICBFTlRSWShTSUdJTlQsICJTSUdJTlQiLCAiSW50ZXJydXB0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdRVUlUKQotICBFTlRSWShTSUdRVUlULCAiU0lHUVVJVCIsICJRdWl0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdJTEwpCi0gIEVOVFJZKFNJR0lMTCwgIlNJR0lMTCIsICJJbGxlZ2FsIGluc3RydWN0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUUkFQKQotICBFTlRSWShTSUdUUkFQLCAiU0lHVFJBUCIsICJUcmFjZS9icmVha3BvaW50IHRyYXAiKSwKLSNlbmRpZgotLyogUHV0IFNJR0lPVCBiZWZvcmUgU0lHQUJSVCwgc28gdGhhdCBpZiBTSUdJT1Q9PVNJR0FCUlQgdGhlbiBTSUdBQlJUCi0gICBvdmVycmlkZXMgU0lHSU9ULiAgU0lHQUJSVCBpcyBpbiBBTlNJIGFuZCBQT1NJWC4xLCBhbmQgU0lHSU9UIGlzbid0LiAqLwotI2lmIGRlZmluZWQgKFNJR0lPVCkKLSAgRU5UUlkoU0lHSU9ULCAiU0lHSU9UIiwgIklPVCB0cmFwIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdBQlJUKQotICBFTlRSWShTSUdBQlJULCAiU0lHQUJSVCIsICJBYm9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdFTVQpCi0gIEVOVFJZKFNJR0VNVCwgIlNJR0VNVCIsICJFbXVsYXRpb24gdHJhcCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHRlBFKQotICBFTlRSWShTSUdGUEUsICJTSUdGUEUiLCAiQXJpdGhtZXRpYyBleGNlcHRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0tJTEwpCi0gIEVOVFJZKFNJR0tJTEwsICJTSUdLSUxMIiwgIktpbGxlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQlVTKQotICBFTlRSWShTSUdCVVMsICJTSUdCVVMiLCAiQnVzIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTRUdWKQotICBFTlRSWShTSUdTRUdWLCAiU0lHU0VHViIsICJTZWdtZW50YXRpb24gZmF1bHQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NZUykKLSAgRU5UUlkoU0lHU1lTLCAiU0lHU1lTIiwgIkJhZCBzeXN0ZW0gY2FsbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUElQRSkKLSAgRU5UUlkoU0lHUElQRSwgIlNJR1BJUEUiLCAiQnJva2VuIHBpcGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0FMUk0pCi0gIEVOVFJZKFNJR0FMUk0sICJTSUdBTFJNIiwgIkFsYXJtIGNsb2NrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdURVJNKQotICBFTlRSWShTSUdURVJNLCAiU0lHVEVSTSIsICJUZXJtaW5hdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdVU1IxKQotICBFTlRSWShTSUdVU1IxLCAiU0lHVVNSMSIsICJVc2VyIGRlZmluZWQgc2lnbmFsIDEiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1VTUjIpCi0gIEVOVFJZKFNJR1VTUjIsICJTSUdVU1IyIiwgIlVzZXIgZGVmaW5lZCBzaWduYWwgMiIpLAotI2VuZGlmCi0vKiBQdXQgU0lHQ0xEIGJlZm9yZSBTSUdDSExELCBzbyB0aGF0IGlmIFNJR0NMRD09U0lHQ0hMRCB0aGVuIFNJR0NITEQKLSAgIG92ZXJyaWRlcyBTSUdDTEQuICBTSUdDSExEIGlzIGluIFBPWElYLjEgKi8KLSNpZiBkZWZpbmVkIChTSUdDTEQpCi0gIEVOVFJZKFNJR0NMRCwgIlNJR0NMRCIsICJDaGlsZCBzdGF0dXMgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQ0hMRCkKLSAgRU5UUlkoU0lHQ0hMRCwgIlNJR0NITEQiLCAiQ2hpbGQgc3RhdHVzIGNoYW5nZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BXUikKLSAgRU5UUlkoU0lHUFdSLCAiU0lHUFdSIiwgIlBvd2VyIGZhaWwvcmVzdGFydCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHV0lOQ0gpCi0gIEVOVFJZKFNJR1dJTkNILCAiU0lHV0lOQ0giLCAiV2luZG93IHNpemUgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVVJHKQotICBFTlRSWShTSUdVUkcsICJTSUdVUkciLCAiVXJnZW50IEkvTyBjb25kaXRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0lPKQotICAvKiAiSS9PIHBlbmRpbmciIGhhcyBhbHNvIGJlZW4gc3VnZ2VzdGVkLCBidXQgaXMgbWlzbGVhZGluZyBzaW5jZSB0aGUKLSAgICAgc2lnbmFsIG9ubHkgaGFwcGVucyB3aGVuIHRoZSBwcm9jZXNzIGhhcyBhc2tlZCBmb3IgaXQsIG5vdCBldmVyeXRpbWUKLSAgICAgSS9PIGlzIHBlbmRpbmcuICovCi0gIEVOVFJZKFNJR0lPLCAiU0lHSU8iLCAiSS9PIHBvc3NpYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQT0xMKQotICBFTlRSWShTSUdQT0xMLCAiU0lHUE9MTCIsICJQb2xsYWJsZSBldmVudCBvY2N1cnJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU1RPUCkKLSAgRU5UUlkoU0lHU1RPUCwgIlNJR1NUT1AiLCAiU3RvcHBlZCAoc2lnbmFsKSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFNUUCkKLSAgRU5UUlkoU0lHVFNUUCwgIlNJR1RTVFAiLCAiU3RvcHBlZCAodXNlcikiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0NPTlQpCi0gIEVOVFJZKFNJR0NPTlQsICJTSUdDT05UIiwgIkNvbnRpbnVlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFRJTikKLSAgRU5UUlkoU0lHVFRJTiwgIlNJR1RUSU4iLCAiU3RvcHBlZCAodHR5IGlucHV0KSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFRPVSkKLSAgRU5UUlkoU0lHVFRPVSwgIlNJR1RUT1UiLCAiU3RvcHBlZCAodHR5IG91dHB1dCkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1ZUQUxSTSkKLSAgRU5UUlkoU0lHVlRBTFJNLCAiU0lHVlRBTFJNIiwgIlZpcnR1YWwgdGltZXIgZXhwaXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUFJPRikKLSAgRU5UUlkoU0lHUFJPRiwgIlNJR1BST0YiLCAiUHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1hDUFUpCi0gIEVOVFJZKFNJR1hDUFUsICJTSUdYQ1BVIiwgIkNQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdYRlNaKQotICBFTlRSWShTSUdYRlNaLCAiU0lHWEZTWiIsICJGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1dJTkQpCi0gIEVOVFJZKFNJR1dJTkQsICJTSUdXSU5EIiwgIlNJR1dJTkQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BIT05FKQotICBFTlRSWShTSUdQSE9ORSwgIlNJR1BIT05FIiwgIlNJR1BIT05FIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdMT1NUKQotICBFTlRSWShTSUdMT1NULCAiU0lHTE9TVCIsICJSZXNvdXJjZSBsb3N0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdXQUlUSU5HKQotICBFTlRSWShTSUdXQUlUSU5HLCAiU0lHV0FJVElORyIsICJQcm9jZXNzJ3MgTFdQcyBhcmUgYmxvY2tlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHTFdQKQotICBFTlRSWShTSUdMV1AsICJTSUdMV1AiLCAiU2lnbmFsIExXUCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHREFOR0VSKQotICBFTlRSWShTSUdEQU5HRVIsICJTSUdEQU5HRVIiLCAiU3dhcCBzcGFjZSBkYW5nZXJvdXNseSBsb3ciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0dSQU5UKQotICBFTlRSWShTSUdHUkFOVCwgIlNJR0dSQU5UIiwgIk1vbml0b3IgbW9kZSBncmFudGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdSRVRSQUNUKQotICBFTlRSWShTSUdSRVRSQUNULCAiU0lHUkVUUkFDVCIsICJOZWVkIHRvIHJlbGluZ3Vpc2ggbW9uaXRvciBtb2RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdNU0cpCi0gIEVOVFJZKFNJR01TRywgIlNJR01TRyIsICJNb25pdG9yIG1vZGUgZGF0YSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NPVU5EKQotICBFTlRSWShTSUdTT1VORCwgIlNJR1NPVU5EIiwgIlNvdW5kIGNvbXBsZXRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU0FLKQotICBFTlRSWShTSUdTQUssICJTSUdTQUsiLCAiU2VjdXJlIGF0dGVudGlvbiIpLAotI2VuZGlmCi0gIEVOVFJZKDAsIE5VTEwsIE5VTEwpCi19OwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUuICBJbmRleGVkIGJ5IHRoZQotICAgc2lnbmFsIHZhbHVlIHRvIGZpbmQgdGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoqc2lnbmFsX25hbWVzOwotc3RhdGljIGludCBudW1fc2lnbmFsX25hbWVzID0gMDsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLCBpZiBpdCBkb2VzIG5vdAotICAgYWxyZWFkeSBleGlzdCBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudC4gIEluZGV4ZWQgYnkgdGhlIHNpZ25hbCB2YWx1ZSB0byBmaW5kCi0gICB0aGUgZGVzY3JpcHRpdmUgc3RyaW5nLgotCi0gICBXZSBkb24ndCBleHBvcnQgaXQgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaGFzIHRoZQotICAgc2FtZSBuYW1lLCBpdCBkaWZmZXJzIGZyb20gb3RoZXIgaW1wbGVtZW50YXRpb25zIGluIHRoYXQgaXQgaXMgZHluYW1pY2FsbHkKLSAgIGluaXRpYWxpemVkIHJhdGhlciB0aGFuIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQuICovCi0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi1zdGF0aWMgaW50IHN5c19uc2lnOwotc3RhdGljIGNvbnN0IGNoYXIgKipzeXNfc2lnbGlzdDsKLQotI2Vsc2UKLQotI2lmZGVmIE5TSUcKLXN0YXRpYyBpbnQgc3lzX25zaWcgPSBOU0lHOwotI2Vsc2UKLSNpZmRlZiBfTlNJRwotc3RhdGljIGludCBzeXNfbnNpZyA9IF9OU0lHOwotI2VuZGlmCi0jZW5kaWYKLWV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgc3lzX3NpZ2xpc3RbXTsKLQotI2VuZGlmCi0KLQotLyoKLQotTkFNRQotCi0JaW5pdF9zaWduYWxfdGFibGVzIC0tIGluaXRpYWxpemUgdGhlIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgdm9pZCBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlVc2luZyB0aGUgc2lnbmFsX3RhYmxlLCB3aGljaCBpcyBpbml0aWFsaXplZCBhdCBjb21waWxlIHRpbWUsIGdlbmVyYXRlCi0JdGhlIHNpZ25hbF9uYW1lcyBhbmQgdGhlIHN5c19zaWdsaXN0IChpZiBuZWVkZWQpIHRhYmxlcywgd2hpY2ggYXJlCi0JaW5kZXhlZCBhdCBydW50aW1lIGJ5IGEgc3BlY2lmaWMgc2lnbmFsIHZhbHVlLgotCi1CVUdTCi0KLQlUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlcyBtYXkgZmFpbCB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMsCi0JaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgdXNlZnVsLCBidXQgd2UgZG9uJ3QKLQlib21iIGVpdGhlci4gIFdobyBrbm93cywgaXQgbWlnaHQgc3VjY2VlZCBhdCBhIGxhdGVyIHBvaW50IGlmIHdlIGZyZWUKLQlzb21lIG1lbW9yeSBpbiB0aGUgbWVhbnRpbWUuICBJbiBhbnkgY2FzZSwgdGhlIG90aGVyIHJvdXRpbmVzIGtub3cKLQlob3cgdG8gZGVhbCB3aXRoIGxhY2sgb2YgYSB0YWJsZSBhZnRlciB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBpdC4gIFRoaXMKLQltYXkgb3IgbWF5IG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYnVnLCB0aGF0IHdlIGRvbid0IHNwZWNpZmljYWxseQotCXdhcm4gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIGZhaWx1cmUgbW9kZS4KLQotKi8KLQotc3RhdGljIHZvaWQKLWluaXRfc2lnbmFsX3RhYmxlcyAoKQotewotICBjb25zdCBzdHJ1Y3Qgc2lnbmFsX2luZm8gKmVpcDsKLSAgaW50IG5ieXRlczsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgc2Nhbm5lZCB0aGUgc2lnbmFsX3RhYmxlIG9uY2UgdG8gZmluZCB0aGUgbWF4aW11bQotICAgICBzaWduYWwgdmFsdWUsIHRoZW4gZ28gZmluZCBpdCBub3cuICovCi0KLSAgaWYgKG51bV9zaWduYWxfbmFtZXMgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JewotCSAgaWYgKGVpcCAtPiB2YWx1ZSA+PSBudW1fc2lnbmFsX25hbWVzKQotCSAgICB7Ci0JICAgICAgbnVtX3NpZ25hbF9uYW1lcyA9IGVpcCAtPiB2YWx1ZSArIDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzaWduYWxfbmFtZXMgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgc2lnbmFsX3RhYmxlLiAqLwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBuYnl0ZXMgPSBudW1fc2lnbmFsX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChzaWduYWxfbmFtZXMgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc2lnbmFsX25hbWVzLCAwLCBuYnl0ZXMpOwotCSAgZm9yIChlaXAgPSBzaWduYWxfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgc2lnbmFsX25hbWVzW2VpcCAtPiB2YWx1ZV0gPSBlaXAgLT4gbmFtZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzeXNfc2lnbGlzdCB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCi0gICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBzaWduYWxfdGFibGUuICovCi0KLSAgaWYgKHN5c19zaWdsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX3NpZ25hbF9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoc3lzX3NpZ2xpc3QgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoc3lzX3NpZ2xpc3QsIDAsIG5ieXRlcyk7Ci0JICBzeXNfbnNpZyA9IG51bV9zaWduYWxfbmFtZXM7Ci0JICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBzeXNfc2lnbGlzdFtlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG1zZzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNlbmRpZgotCi19Ci0KLQotLyoKLQotTkFNRQotCi0Jc2lnbm9fbWF4IC0tIHJldHVybiB0aGUgbWF4IHNpZ25vIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgc2lnbm9fbWF4ICgpOwotCi1ERVNDUklQVElPTgotCi0JUmV0dXJucyB0aGUgbWF4aW11bSBzaWdubyB2YWx1ZSBmb3Igd2hpY2ggYSBjb3JyZXNwb25kaW5nIHN5bWJvbGljCi0JbmFtZSBvciBtZXNzYWdlIGlzIGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSB3aGVyZQotCXdlIHVzZSB0aGUgc3lzX3NpZ2xpc3Qgc3VwcGxpZWQgYnkgdGhlIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgZm9yCi0JdGhlcmUgdG8gYmUgbW9yZSBzeW1ib2xpYyBuYW1lcyB0aGFuIG1lc3NhZ2VzLCBvciB2aWNlIHZlcnNhLgotCUluIGZhY3QsIHRoZSBtYW51YWwgcGFnZSBmb3IgcHNpZ25hbCgzYikgZXhwbGljaXRseSB3YXJucyB0aGF0IG9uZQotCXNob3VsZCBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgKE5TSUcpIGJlZm9yZSBpbmRleGluZyBpdCwKLQlzaW5jZSBuZXcgc2lnbmFsIGNvZGVzIG1heSBiZSBhZGRlZCB0byB0aGUgc3lzdGVtIGJlZm9yZSB0aGV5IGFyZQotCWFkZGVkIHRvIHRoZSB0YWJsZS4gIFRodXMgTlNJRyBtaWdodCBiZSBzbWFsbGVyIHRoYW4gdmFsdWUKLQlpbXBsaWVkIGJ5IHRoZSBsYXJnZXN0IHNpZ25vIHZhbHVlIGRlZmluZWQgaW4gPHNpZ25hbC5oPi4KLQotCVdlIHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhIG1lYW5pbmdmdWwKLQlzeW1ib2xpYyBuYW1lIG9yIG1lc3NhZ2UuCi0KLSovCi0KLWludAotc2lnbm9fbWF4ICgpCi17Ci0gIGludCBtYXhzaXplOwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotICBtYXhzaXplID0gTUFYIChzeXNfbnNpZywgbnVtX3NpZ25hbF9uYW1lcyk7Ci0gIHJldHVybiAobWF4c2l6ZSAtIDEpOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXN0cnNpZ25hbCAtLSBtYXAgYSBzaWduYWwgbnVtYmVyIHRvIGEgc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJzaWduYWwgKGludCBzaWdubykKLQotREVTQ1JJUFRJT04KLQotCU1hcHMgYW4gc2lnbmFsIG51bWJlciB0byBhbiBzaWduYWwgbWVzc2FnZSBzdHJpbmcsIHRoZSBjb250ZW50cyBvZgotCXdoaWNoIGFyZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgT24gc3lzdGVtcyB3aGljaCBoYXZlIHRoZSBleHRlcm5hbAotCXZhcmlhYmxlIHN5c19zaWdsaXN0LCB0aGVzZSBzdHJpbmdzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIG9uZXMgdXNlZAotCWJ5IHBzaWduYWwoKS4KLQotCUlmIHRoZSBzdXBwbGllZCBzaWduYWwgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcwotCWZvciB0aGUgc3lzX3NpZ2xpc3QsIGJ1dCBubyBtZXNzYWdlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQlzaWduYWwgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiU2lnbmFsIE5VTSIsIHdoZXJlIE5VTSBpcyB0aGUKLQlzaWduYWwgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgbm90IGEgdmFsaWQgaW5kZXggaW50byBzeXNfc2lnbGlzdCwKLQlyZXR1cm5zIE5VTEwuCi0KLQlUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBvbmx5IHVudGlsIHRoZQotCW5leHQgY2FsbCB0byBzdHJzaWduYWwuCi0KLSovCi0KLSNpZm5kZWYgSEFWRV9TVFJTSUdOQUwKLQotY29uc3QgY2hhciAqCi1zdHJzaWduYWwgKHNpZ25vKQotICBpbnQgc2lnbm87Ci17Ci0gIGNvbnN0IGNoYXIgKm1zZzsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gIGlmICgoc2lnbm8gPCAwKSB8fCAoc2lnbm8gPj0gc3lzX25zaWcpKQotICAgIHsKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbXNnID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeXNfc2lnbGlzdCA9PSBOVUxMKSB8fCAoc3lzX3NpZ2xpc3Rbc2lnbm9dID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gc3lzX3NpZ2xpc3Qgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlNpZ25hbCAlZCIsIHNpZ25vKTsKLSAgICAgIG1zZyA9IChjb25zdCBjaGFyICopIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbWVzc2FnZS4gIEp1c3QgcmV0dXJuIHRoZSBtZXNzYWdlLiAqLwotICAgICAgbXNnID0gKGNvbnN0IGNoYXIgKikgc3lzX3NpZ2xpc3Rbc2lnbm9dOwotICAgIH0KLSAgCi0gIHJldHVybiAobXNnKTsKLX0KLQotI2VuZGlmIC8qICEgSEFWRV9TVFJTSUdOQUwgKi8KLQotLyoKLQotTkFNRQotCi0Jc3Ryc2lnbm8gLS0gbWFwIGFuIHNpZ25hbCBudW1iZXIgdG8gYSBzeW1ib2xpYyBuYW1lIHN0cmluZwotCi1TWU5PUFNJUwotCi0JY29uc3QgY2hhciAqc3Ryc2lnbm8gKGludCBzaWdubykKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIGFuIHNpZ25hbCBudW1iZXIsIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcKLQl0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGF0IHNpZ25hbCBudW1iZXIsIGFzIGZvdW5kIGluIDxzaWduYWwuaD4uCi0KLQlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKLQlmb3Igc3ltYm9saWMgbmFtZXMsIGJ1dCBubyBuYW1lIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQlzaWduYWwgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiU2lnbmFsIE5VTSIsIHdoZXJlIE5VTSBpcwotCXRoZSBzaWduYWwgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdmFsaWQKLQlpbmRpY2VzLCB0aGVuIHJldHVybnMgTlVMTC4KLQotQlVHUwotCi0JVGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUKLQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHN0cnNpZ25vLgotCi0qLwotCi1jb25zdCBjaGFyICoKLXN0cnNpZ25vIChzaWdubykKLSAgaW50IHNpZ25vOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotCi0gIGlmICgoc2lnbm8gPCAwKSB8fCAoc2lnbm8gPj0gbnVtX3NpZ25hbF9uYW1lcykpCi0gICAgewotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBuYW1lID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzaWduYWxfbmFtZXMgPT0gTlVMTCkgfHwgKHNpZ25hbF9uYW1lc1tzaWdub10gPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzaWduYWxfbmFtZXMgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIlNpZ25hbCAlZCIsIHNpZ25vKTsKLSAgICAgIG5hbWUgPSAoY29uc3QgY2hhciAqKSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG5hbWUuICBKdXN0IHJldHVybiB0aGUgbmFtZS4gKi8KLSAgICAgIG5hbWUgPSBzaWduYWxfbmFtZXNbc2lnbm9dOwotICAgIH0KLQotICByZXR1cm4gKG5hbWUpOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXN0cnRvc2lnbm8gLS0gbWFwIGEgc3ltYm9saWMgc2lnbmFsIG5hbWUgdG8gYSBudW1lcmljIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgc3RydG9zaWdubyAoY2hhciAqbmFtZSkKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIHRoZSBzeW1ib2xpYyBuYW1lIG9mIGEgc2lnbmFsLCBtYXAgaXQgdG8gYSBzaWduYWwgbnVtYmVyLgotCUlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLCByZXR1cm5zIDAuCi0KLSovCi0KLWludAotc3RydG9zaWdubyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IHNpZ25vID0gMDsKLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0JfQotICAgICAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDwgbnVtX3NpZ25hbF9uYW1lczsgc2lnbm8rKykKLQl7Ci0JICBpZiAoKHNpZ25hbF9uYW1lc1tzaWdub10gIT0gTlVMTCkgJiYKLQkgICAgICAoc3RyY21wIChuYW1lLCBzaWduYWxfbmFtZXNbc2lnbm9dKSA9PSAwKSkKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNpZ25vID09IG51bV9zaWduYWxfbmFtZXMpCi0JewotCSAgc2lnbm8gPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiAoc2lnbm8pOwotfQotCi0KLS8qCi0KLU5BTUUKLQotCXBzaWduYWwgLS0gcHJpbnQgbWVzc2FnZSBhYm91dCBzaWduYWwgdG8gc3RkZXJyCi0KLVNZTk9QU0lTCi0KLQl2b2lkIHBzaWduYWwgKHVuc2lnbmVkIHNpZ25vLCBjaGFyICptZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQotCVByaW50IHRvIHRoZSBzdGFuZGFyZCBlcnJvciB0aGUgbWVzc2FnZSwgZm9sbG93ZWQgYnkgYSBjb2xvbiwKLQlmb2xsb3dlZCBieSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNpZ25hbCBzcGVjaWZpZWQgYnkgc2lnbm8sCi0JZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgotKi8KLQotI2lmbmRlZiBIQVZFX1BTSUdOQUwKLQotdm9pZAotcHNpZ25hbCAoc2lnbm8sIG1lc3NhZ2UpCi0gIHVuc2lnbmVkIHNpZ25vOwotICBjaGFyICptZXNzYWdlOwotewotICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9zaWduYWxfdGFibGVzICgpOwotICAgIH0KLSAgaWYgKChzaWdubyA8PSAwKSB8fCAoc2lnbm8gPj0gc3lzX25zaWcpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmtub3duIHNpZ25hbFxuIiwgbWVzc2FnZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBtZXNzYWdlLCBzeXNfc2lnbGlzdFtzaWdub10pOwotICAgIH0KLX0KLQotI2VuZGlmCS8qICEgSEFWRV9QU0lHTkFMICovCi0KLQotLyogQSBzaW1wbGUgbGl0dGxlIG1haW4gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHByaW50IGFsbCB0aGUgc2lnbmFsIHRyYW5zbGF0aW9ucwotICAgaWYgTUFJTiBpcyBkZWZpbmVkIGFuZCB0aGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZC4gKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgc2lnbm87Ci0gIGludCBtYXhzaWdubzsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqbXNnOwotCi0gIG1heHNpZ25vID0gc2lnbm9fbWF4ICgpOwotICBwcmludGYgKCIlZCBlbnRyaWVzIGluIG5hbWVzIHRhYmxlLlxuIiwgbnVtX3NpZ25hbF9uYW1lcyk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbWVzc2FnZXMgdGFibGUuXG4iLCBzeXNfbnNpZyk7Ci0gIHByaW50ZiAoIiVkIGlzIG1heCB1c2VmdWwgaW5kZXguXG4iLCBtYXhzaWdubyk7Ci0KLSAgLyogS2VlcCBwcmludGluZyB2YWx1ZXMgdW50aWwgd2UgZ2V0IHRvIHRoZSBlbmQgb2YgKmJvdGgqIHRhYmxlcywgbm90Ci0gICAgICplaXRoZXIqIHRhYmxlLiAgTm90ZSB0aGF0IGtub3dpbmcgdGhlIG1heGltdW0gdXNlZnVsIGluZGV4IGRvZXMgKm5vdCoKLSAgICAgcmVsaWV2ZSB1cyBvZiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGVzdGluZyB0aGUgcmV0dXJuIHBvaW50ZXIgZm9yCi0gICAgIE5VTEwuICovCi0KLSAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDw9IG1heHNpZ25vOyBzaWdubysrKQotICAgIHsKLSAgICAgIG5hbWUgPSBzdHJzaWdubyAoc2lnbm8pOwotICAgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxOVUxMPiIgOiBuYW1lOwotICAgICAgbXNnID0gc3Ryc2lnbmFsIChzaWdubyk7Ci0gICAgICBtc2cgPSAobXNnID09IE5VTEwpID8gIjxOVUxMPiIgOiBtc2c7Ci0gICAgICBwcmludGYgKCIlLTRkJS0xOHMlc1xuIiwgc2lnbm8sIG5hbWUsIG1zZyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJzdHIuYyBiL2xpYmliZXJ0eS9zdHJzdHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiMzZlMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3Ryc3RyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2Ygc3Ryc3RyIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLQotTkFNRQotCi0Jc3Ryc3RyIC0tIGxvY2F0ZSBmaXJzdCBvY2N1cmFuY2Ugb2YgYSBzdWJzdHJpbmcKLQotU1lOT1BTSVMKLQotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCWNoYXIgKnN0cnN0ciAoY2hhciAqczEsIGNoYXIgKnMyKQotCi1ERVNDUklQVElPTgotCi0JTG9jYXRlcyB0aGUgZmlyc3Qgb2NjdXJhbmNlIGluIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTMSBvZgotCXRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTMi4gIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdWJzdHJpbmcKLQlmb3VuZCwgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm90IGZvdW5kLiAgSWYgUzIgcG9pbnRzIHRvIGEgc3RyaW5nCi0Jd2l0aCB6ZXJvIGxlbmd0aCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgUzEuCi0JCi1CVUdTCi0KLSovCi0KLQotLyogRklYTUU6ICBUaGUgYWJvdmUgZGVzY3JpcHRpb24gaXMgQU5TSSBjb21waWxpYW50LiAgVGhpcyByb3V0aW5lIGhhcyBub3QKLSAgIGJlZW4gdmFsaWRhdGVkIHRvIGNvbXBseSB3aXRoIGl0LiAgLWZuZiAqLwotCi1jaGFyICoKLXN0cnN0ciAoczEsIHMyKQotICBjaGFyICpzMSwgKnMyOwotewotICByZWdpc3RlciBjaGFyICpwID0gczE7Ci0gIGV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci0gIGV4dGVybiBpbnQgc3RybmNtcCAoKTsKLSNpZiBfX0dOVUNfXz09MgotICBleHRlcm4gX19TSVpFX1RZUEVfXyBzdHJsZW4gKCk7Ci0jZW5kaWYKLSAgcmVnaXN0ZXIgaW50IGxlbiA9IHN0cmxlbiAoczIpOwotCi0gIGZvciAoOyAocCA9IHN0cmNociAocCwgKnMyKSkgIT0gMDsgcCsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChwLCBzMiwgbGVuKSA9PSAwKQotCXsKLQkgIHJldHVybiAocCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJ0b2QuYyBiL2xpYmliZXJ0eS9zdHJ0b2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2YzczZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RydG9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2Ygc3RydG9kIGZvciBzeXN0ZW1zIHdpdGggYXRvZi4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLXNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwotY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKLXRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLVRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLXRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1leHRlcm4gZG91YmxlIGF0b2YgKCk7Ci0KLS8qIERpc2NsYWltZXI6IHRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNlZCBieSBDSElMTCBpbiBHREIgYW5kIHRoZXJlZm9yZQotICAgaGFzIG5vdCBiZWVuIHRlc3RlZCB3ZWxsLiAgSXQgbWF5IGhhdmUgYmVlbiB0ZXN0ZWQgZm9yIG5vdGhpbmcgZXhjZXB0Ci0gICB0aGF0IGl0IGNvbXBpbGVzLiAgKi8KLQotZG91YmxlCi1zdHJ0b2QgKHN0ciwgcHRyKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGNoYXIgKipwdHI7Ci17Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKHB0ciA9PSAoY2hhciAqKikwKQotICAgIHJldHVybiBhdG9mIChzdHIpOwotICAKLSAgcCA9IHN0cjsKLSAgCi0gIHdoaWxlIChpc3NwYWNlICgqcCkpCi0gICAgKytwOwotICAKLSAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCi0gICAgKytwOwotCi0gIC8qIElORiBvciBJTkZJTklUWS4gICovCi0gIGlmICgocFswXSA9PSAnaScgfHwgcFswXSA9PSAnSScpCi0gICAgICAmJiAocFsxXSA9PSAnbicgfHwgcFsxXSA9PSAnTicpCi0gICAgICAmJiAocFsyXSA9PSAnZicgfHwgcFsyXSA9PSAnRicpKQotICAgIHsKLSAgICAgIGlmICgocFszXSA9PSAnaScgfHwgcFszXSA9PSAnSScpCi0JICAmJiAocFs0XSA9PSAnbicgfHwgcFs0XSA9PSAnTicpCi0JICAmJiAocFs1XSA9PSAnaScgfHwgcFs1XSA9PSAnSScpCi0JICAmJiAocFs2XSA9PSAndCcgfHwgcFs2XSA9PSAnVCcpCi0JICAmJiAocFs3XSA9PSAneScgfHwgcFs3XSA9PSAnWScpKQotCXsKLQkgICpwdHIgPSBwICsgNzsKLQkgIHJldHVybiBhdG9mIChzdHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqcHRyID0gcCArIDM7Ci0JICByZXR1cm4gYXRvZiAoc3RyKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5BTiBvciBOQU4oZm9vKS4gICovCi0gIGlmICgocFswXSA9PSAnbicgfHwgcFswXSA9PSAnTicpCi0gICAgICAmJiAocFsxXSA9PSAnYScgfHwgcFsxXSA9PSAnQScpCi0gICAgICAmJiAocFsyXSA9PSAnbicgfHwgcFsyXSA9PSAnTicpKQotICAgIHsKLSAgICAgIHAgKz0gMzsKLSAgICAgIGlmICgqcCA9PSAnKCcpCi0JewotCSAgKytwOwotCSAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJyknKQotCSAgICArK3A7Ci0JICBpZiAoKnAgPT0gJyknKQotCSAgICArK3A7Ci0JfQotICAgICAgKnB0ciA9IHA7Ci0gICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLSAgICB9Ci0KLSAgLyogZGlnaXRzLCB3aXRoIDAgb3IgMSBwZXJpb2RzIGluIGl0LiAgKi8KLSAgaWYgKGlzZGlnaXQgKCpwKSB8fCAqcCA9PSAnLicpCi0gICAgewotICAgICAgaW50IGdvdF9kb3QgPSAwOwotICAgICAgd2hpbGUgKGlzZGlnaXQgKCpwKSB8fCAoIWdvdF9kb3QgJiYgKnAgPT0gJy4nKSkKLQl7Ci0JICBpZiAoKnAgPT0gJy4nKQotCSAgICBnb3RfZG90ID0gMTsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIC8qIEV4cG9uZW50LiAgKi8KLSAgICAgIGlmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKQotCXsKLQkgIGludCBpOwotCSAgaSA9IDE7Ci0JICBpZiAocFtpXSA9PSAnKycgfHwgcFtpXSA9PSAnLScpCi0JICAgICsraTsKLQkgIGlmIChpc2RpZ2l0IChwW2ldKSkKLQkgICAgewotCSAgICAgIHdoaWxlIChpc2RpZ2l0IChwW2ldKSkKLQkJKytpOwotCSAgICAgICpwdHIgPSBwICsgaTsKLQkgICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLQkgICAgfQotCX0KLSAgICAgICpwdHIgPSBwOwotICAgICAgcmV0dXJuIGF0b2YgKHN0cik7Ci0gICAgfQotICAvKiBEaWRuJ3QgZmluZCBhbnkgZGlnaXRzLiAgRG9lc24ndCBsb29rIGxpa2UgYSBudW1iZXIuICAqLwotICAqcHRyID0gc3RyOwotICByZXR1cm4gMC4wOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvbC5jIGIvbGliaWJlcnR5L3N0cnRvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDY3Y2MzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJ0b2wuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIFtyZXNjaW5kZWQgMjIgSnVseSAxOTk5XQotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmIDAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEZJWE1FOiBJdCdkIGJlIG5pY2UgdG8gY29uZmlndXJlIGFyb3VuZCB0aGVzZSwgYnV0IHRoZSBpbmNsdWRlIGZpbGVzIGFyZSB0b28KLSAgIHBhaW5mdWwuICBUaGVzZSBtYWNyb3Mgc2hvdWxkIGF0IGxlYXN0IGJlIG1vcmUgcG9ydGFibGUgdGhhbiBoYXJkd2lyZWQgaGV4Ci0gICBjb25zdGFudHMuICovCi0KLSNpZm5kZWYgVUxPTkdfTUFYCi0jZGVmaW5lCVVMT05HX01BWAkoKHVuc2lnbmVkIGxvbmcpKH4wTCkpCQkvKiAweEZGRkZGRkZGICovCi0jZW5kaWYKLQotI2lmbmRlZiBMT05HX01BWAotI2RlZmluZQlMT05HX01BWAkoKGxvbmcpKFVMT05HX01BWCA+PiAxKSkJLyogMHg3RkZGRkZGRiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgTE9OR19NSU4KLSNkZWZpbmUJTE9OR19NSU4JKChsb25nKSh+TE9OR19NQVgpKQkJLyogMHg4MDAwMDAwMCAqLwotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgbG9uZyBpbnRlZ2VyLgotICoKLSAqIElnbm9yZXMgYGxvY2FsZScgc3R1ZmYuICBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCi0gKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgotICovCi1sb25nCi1zdHJ0b2wobnB0ciwgZW5kcHRyLCBiYXNlKQotCWNvbnN0IGNoYXIgKm5wdHI7Ci0JY2hhciAqKmVuZHB0cjsKLQlyZWdpc3RlciBpbnQgYmFzZTsKLXsKLQlyZWdpc3RlciBjb25zdCBjaGFyICpzID0gbnB0cjsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGFjYzsKLQlyZWdpc3RlciBpbnQgYzsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGN1dG9mZjsKLQlyZWdpc3RlciBpbnQgbmVnID0gMCwgYW55LCBjdXRsaW07Ci0KLQkvKgotCSAqIFNraXAgd2hpdGUgc3BhY2UgYW5kIHBpY2sgdXAgbGVhZGluZyArLy0gc2lnbiBpZiBhbnkuCi0JICogSWYgYmFzZSBpcyAwLCBhbGxvdyAweCBmb3IgaGV4IGFuZCAwIGZvciBvY3RhbCwgZWxzZQotCSAqIGFzc3VtZSBkZWNpbWFsOyBpZiBiYXNlIGlzIGFscmVhZHkgMTYsIGFsbG93IDB4LgotCSAqLwotCWRvIHsKLQkJYyA9ICpzKys7Ci0JfSB3aGlsZSAoaXNzcGFjZShjKSk7Ci0JaWYgKGMgPT0gJy0nKSB7Ci0JCW5lZyA9IDE7Ci0JCWMgPSAqcysrOwotCX0gZWxzZSBpZiAoYyA9PSAnKycpCi0JCWMgPSAqcysrOwotCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCi0JICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSkgewotCQljID0gc1sxXTsKLQkJcyArPSAyOwotCQliYXNlID0gMTY7Ci0JfQotCWlmIChiYXNlID09IDApCi0JCWJhc2UgPSBjID09ICcwJyA/IDggOiAxMDsKLQotCS8qCi0JICogQ29tcHV0ZSB0aGUgY3V0b2ZmIHZhbHVlIGJldHdlZW4gbGVnYWwgbnVtYmVycyBhbmQgaWxsZWdhbAotCSAqIG51bWJlcnMuICBUaGF0IGlzIHRoZSBsYXJnZXN0IGxlZ2FsIHZhbHVlLCBkaXZpZGVkIGJ5IHRoZQotCSAqIGJhc2UuICBBbiBpbnB1dCBudW1iZXIgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZSwgaWYKLQkgKiBmb2xsb3dlZCBieSBhIGxlZ2FsIGlucHV0IGNoYXJhY3RlciwgaXMgdG9vIGJpZy4gIE9uZSB0aGF0Ci0JICogaXMgZXF1YWwgdG8gdGhpcyB2YWx1ZSBtYXkgYmUgdmFsaWQgb3Igbm90OyB0aGUgbGltaXQKLQkgKiBiZXR3ZWVuIHZhbGlkIGFuZCBpbnZhbGlkIG51bWJlcnMgaXMgdGhlbiBiYXNlZCBvbiB0aGUgbGFzdAotCSAqIGRpZ2l0LiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgcmFuZ2UgZm9yIGxvbmdzIGlzCi0JICogWy0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3XSBhbmQgdGhlIGlucHV0IGJhc2UgaXMgMTAsCi0JICogY3V0b2ZmIHdpbGwgYmUgc2V0IHRvIDIxNDc0ODM2NCBhbmQgY3V0bGltIHRvIGVpdGhlcgotCSAqIDcgKG5lZz09MCkgb3IgOCAobmVnPT0xKSwgbWVhbmluZyB0aGF0IGlmIHdlIGhhdmUgYWNjdW11bGF0ZWQKLQkgKiBhIHZhbHVlID4gMjE0NzQ4MzY0LCBvciBlcXVhbCBidXQgdGhlIG5leHQgZGlnaXQgaXMgPiA3IChvciA4KSwKLQkgKiB0aGUgbnVtYmVyIGlzIHRvbyBiaWcsIGFuZCB3ZSB3aWxsIHJldHVybiBhIHJhbmdlIGVycm9yLgotCSAqCi0JICogU2V0IGFueSBpZiBhbnkgYGRpZ2l0cycgY29uc3VtZWQ7IG1ha2UgaXQgbmVnYXRpdmUgdG8gaW5kaWNhdGUKLQkgKiBvdmVyZmxvdy4KLQkgKi8KLQljdXRvZmYgPSBuZWcgPyAtKHVuc2lnbmVkIGxvbmcpTE9OR19NSU4gOiBMT05HX01BWDsKLQljdXRsaW0gPSBjdXRvZmYgJSAodW5zaWduZWQgbG9uZyliYXNlOwotCWN1dG9mZiAvPSAodW5zaWduZWQgbG9uZyliYXNlOwotCWZvciAoYWNjID0gMCwgYW55ID0gMDs7IGMgPSAqcysrKSB7Ci0JCWlmIChpc2RpZ2l0KGMpKQotCQkJYyAtPSAnMCc7Ci0JCWVsc2UgaWYgKGlzYWxwaGEoYykpCi0JCQljIC09IGlzdXBwZXIoYykgPyAnQScgLSAxMCA6ICdhJyAtIDEwOwotCQllbHNlCi0JCQlicmVhazsKLQkJaWYgKGMgPj0gYmFzZSkKLQkJCWJyZWFrOwotCQlpZiAoYW55IDwgMCB8fCBhY2MgPiBjdXRvZmYgfHwgYWNjID09IGN1dG9mZiAmJiBjID4gY3V0bGltKQotCQkJYW55ID0gLTE7Ci0JCWVsc2UgewotCQkJYW55ID0gMTsKLQkJCWFjYyAqPSBiYXNlOwotCQkJYWNjICs9IGM7Ci0JCX0KLQl9Ci0JaWYgKGFueSA8IDApIHsKLQkJYWNjID0gbmVnID8gTE9OR19NSU4gOiBMT05HX01BWDsKLQkJZXJybm8gPSBFUkFOR0U7Ci0JfSBlbHNlIGlmIChuZWcpCi0JCWFjYyA9IC1hY2M7Ci0JaWYgKGVuZHB0ciAhPSAwKQotCQkqZW5kcHRyID0gKGNoYXIgKikgKGFueSA/IHMgLSAxIDogbnB0cik7Ci0JcmV0dXJuIChhY2MpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvdWwuYyBiL2xpYmliZXJ0eS9zdHJ0b3VsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYzMyMDQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnRvdWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBbcmVzY2luZGVkIDIyIEp1bHkgMTk5OV0KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAwCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jaWZuZGVmIFVMT05HX01BWAotI2RlZmluZQlVTE9OR19NQVgJKCh1bnNpZ25lZCBsb25nKSh+MEwpKQkJLyogMHhGRkZGRkZGRiAqLwotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgaW50ZWdlci4KLSAqCi0gKiBJZ25vcmVzIGBsb2NhbGUnIHN0dWZmLiAgQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQotICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KLSAqLwotdW5zaWduZWQgbG9uZwotc3RydG91bChucHRyLCBlbmRwdHIsIGJhc2UpCi0JY29uc3QgY2hhciAqbnB0cjsKLQljaGFyICoqZW5kcHRyOwotCXJlZ2lzdGVyIGludCBiYXNlOwotewotCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBucHRyOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYWNjOwotCXJlZ2lzdGVyIGludCBjOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgY3V0b2ZmOwotCXJlZ2lzdGVyIGludCBuZWcgPSAwLCBhbnksIGN1dGxpbTsKLQotCS8qCi0JICogU2VlIHN0cnRvbCBmb3IgY29tbWVudHMgYXMgdG8gdGhlIGxvZ2ljIHVzZWQuCi0JICovCi0JZG8gewotCQljID0gKnMrKzsKLQl9IHdoaWxlIChpc3NwYWNlKGMpKTsKLQlpZiAoYyA9PSAnLScpIHsKLQkJbmVnID0gMTsKLQkJYyA9ICpzKys7Ci0JfSBlbHNlIGlmIChjID09ICcrJykKLQkJYyA9ICpzKys7Ci0JaWYgKChiYXNlID09IDAgfHwgYmFzZSA9PSAxNikgJiYKLQkgICAgYyA9PSAnMCcgJiYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpKSB7Ci0JCWMgPSBzWzFdOwotCQlzICs9IDI7Ci0JCWJhc2UgPSAxNjsKLQl9Ci0JaWYgKGJhc2UgPT0gMCkKLQkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOwotCWN1dG9mZiA9ICh1bnNpZ25lZCBsb25nKVVMT05HX01BWCAvICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JY3V0bGltID0gKHVuc2lnbmVkIGxvbmcpVUxPTkdfTUFYICUgKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQlmb3IgKGFjYyA9IDAsIGFueSA9IDA7OyBjID0gKnMrKykgewotCQlpZiAoaXNkaWdpdChjKSkKLQkJCWMgLT0gJzAnOwotCQllbHNlIGlmIChpc2FscGhhKGMpKQotCQkJYyAtPSBpc3VwcGVyKGMpID8gJ0EnIC0gMTAgOiAnYScgLSAxMDsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JCWlmIChjID49IGJhc2UpCi0JCQlicmVhazsKLQkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IChhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pKQotCQkJYW55ID0gLTE7Ci0JCWVsc2UgewotCQkJYW55ID0gMTsKLQkJCWFjYyAqPSBiYXNlOwotCQkJYWNjICs9IGM7Ci0JCX0KLQl9Ci0JaWYgKGFueSA8IDApIHsKLQkJYWNjID0gVUxPTkdfTUFYOwotCQllcnJubyA9IEVSQU5HRTsKLQl9IGVsc2UgaWYgKG5lZykKLQkJYWNjID0gLWFjYzsKLQlpZiAoZW5kcHRyICE9IDApCi0JCSplbmRwdHIgPSAoY2hhciAqKSAoYW55ID8gcyAtIDEgOiBucHRyKTsKLQlyZXR1cm4gKGFjYyk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdGVzdHN1aXRlL01ha2VmaWxlLmluIGIvbGliaWJlcnR5L3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0ZGRkMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdGVzdHN1aXRlL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIwotIyBNYWtlZmlsZQotIyAgIENvcHlyaWdodCAoQykgMTk5OQotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi0jIExpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0jIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi0jIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KLQotIwotIyBNYWtlZmlsZSBmb3IgbGliaWJlcnR5L3Rlc3RzdWl0ZSBkaXJlY3RvcnkKLSMKLQotc3JjZGlyID0gQHNyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotU0hFTEwgPSBAU0hFTExACi0KLUNDID0gQENDQAotQ0ZMQUdTID0gQENGTEFHU0AKLUxJQkNGTEFHUyA9ICQoQ0ZMQUdTKQotCi0jIE11bHRpbGliIHN1cHBvcnQgdmFyaWFibGVzLgotTVVMVElTUkNUT1AgPQotCi1JTkNESVI9JChzcmNkaXIpLy4uLyQoTVVMVElTUkNUT1ApLi4vaW5jbHVkZQotCi1hbGw6Ci0KLWNoZWNrOiBAQ0hFQ0tACi0KLSMgUnVuIHNvbWUgdGVzdHMgb2YgdGhlIGRlbWFuZ2xlci4KLWNoZWNrLWNwbHVzLWRlbTogdGVzdC1maWx0ZXIgJChzcmNkaXIpL2RlbWFuZ2xlLWV4cGVjdGVkCi0JJChTSEVMTCkgJChzcmNkaXIpL3JlZ3Jlc3MtZGVtYW5nbGUgJChzcmNkaXIpL2RlbWFuZ2xlLWV4cGVjdGVkCi0KLSMgTm90ZSB0aGF0IHdlIGp1c3QgaGFyZC1jb2RlIHByZXBlbmRzX3VuZGVyc2NvcmUgdG8gMC4gIFRoaXMgZG9lc24ndAotIyBtYXR0ZXIgc2luY2UgYW55IHBhcnRpY3VsYXIgdGVzdCBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaWYgbmVlZAotIyBiZS4KLVRFU1RfQ09NUElMRSA9ICQoQ0MpIEBERUZTQCAkKExJQkNGTEFHUykgLUkuLiAtSSQoSU5DRElSKSAkKEhERUZJTkVTKQotdGVzdC1maWx0ZXI6ICQoc3JjZGlyKS8uLi9jcGx1cy1kZW0uYwotCWVjaG8gJ2ludCBwcmVwZW5kc191bmRlcnNjb3JlID0gMDsnID4gdGVzdC11cy5jCi0JJChURVNUX0NPTVBJTEUpIC1vIHRlc3QtZmlsdGVyIC1ETUFJTiAtRFZFUlNJT049JyJub25lIicgQERFRlNAIFwKLQkJJChzcmNkaXIpLy4uL2NwbHVzLWRlbS5jIHRlc3QtdXMuYyAtTC4uIC1saWJlcnR5Ci0KLQotIyBTdGFuZGFyZCAoZWl0aGVyIEdOVSBvciBDeWdudXMpIHJ1bGVzIHdlIGRvbid0IHVzZS4KLWluZm8gaW5zdGFsbC1pbmZvIGNsZWFuLWluZm8gZHZpIGluc3RhbGwgZXRhZ3MgdGFncyBpbnN0YWxsY2hlY2s6Ci0KLSMgVGhlIHN0YW5kYXJkIGNsZWFuIHJ1bGVzLgotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgdGVzdC11cy5jIHRlc3QtZmlsdGVyCi1jbGVhbjogbW9zdGx5Y2xlYW4KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGRpc3RjbGVhbgotCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gLi4vY29uZmlnLnN0YXR1cwotCUNPTkZJR19GSUxFUz10ZXN0c3VpdGUvTWFrZWZpbGUgQ09ORklHX0hFQURFUlM9IFwKLQkgIGNkIC4uICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Rlc3RzdWl0ZS9kZW1hbmdsZS1leHBlY3RlZCBiL2xpYmliZXJ0eS90ZXN0c3VpdGUvZGVtYW5nbGUtZXhwZWN0ZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYTFmZTQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Rlc3RzdWl0ZS9kZW1hbmdsZS1leHBlY3RlZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ODggKzAsMCBAQAotIyBUaGlzIGZpbGUgaG9sZHMgdGVzdCBjYXNlcyBmb3IgdGhlIGRlbWFuZ2xlci4KLSMgRWFjaCB0ZXN0IGNvbnNpc3RzIG9mIHRocmVlIGxpbmVzIGluIHN1Y2Nlc3Npb24uCi0jIFRoZSBmaXJzdCBsaW5lIGlzIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0ZXN0IGZpbHRlciBwcm9ncmFtLgotIyBUaGUgc2Vjb25kIGxpbmUgaXMgdGhlIG1hbmdsZWQgc3RyaW5nLgotIyBUaGUgdGhpcmQgbGluZSBpcyB0aGUgZXhwZWN0ZWQgb3V0cHV0LgotIyBBIGxpbmUgc3RhcnRpbmcgd2l0aCBgIycgaXMgaWdub3JlLgotIyBIb3dldmVyIGJsYW5rIGxpbmVzIGluIHRoaXMgZmlsZSBhcmUgTk9UIGlnbm9yZWQuCi0jCi0tLWZvcm1hdD1nbnUKLUFkZEFsaWdubWVudF9fOWl2VFNvbHZlclVpUDEyaXZJbnRlcmFjdG9yUDdpdlRHbHVlCi1pdlRTb2x2ZXI6OkFkZEFsaWdubWVudCh1bnNpZ25lZCBpbnQsIGl2SW50ZXJhY3RvciAqLCBpdlRHbHVlICopCi0jCi0tLWZvcm1hdD1nbnUKLUFycm93aGVhZEludGVyc2VjdHNfXzlBcnJvd0xpbmVQOUFycm93aGVhZFI2Qm94T2JqUDdHcmFwaGljCi1BcnJvd0xpbmU6OkFycm93aGVhZEludGVyc2VjdHMoQXJyb3doZWFkICosIEJveE9iaiAmLCBHcmFwaGljICopCi0jCi0tLWZvcm1hdD1nbnUKLUF0RW5kX18xM2l2UnViYmVyR3JvdXAKLWl2UnViYmVyR3JvdXA6OkF0RW5kKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLUJnRmlsdGVyX185aXZUU29sdmVyUDEyaXZJbnRlcmFjdG9yCi1pdlRTb2x2ZXI6OkJnRmlsdGVyKGl2SW50ZXJhY3RvciAqKQotIwotLS1mb3JtYXQ9Z251Ci1DaGVja19fNlVBcnJheWkKLVVBcnJheTo6Q2hlY2soaW50KQotIwotLS1mb3JtYXQ9Z251Ci1Db3JlQ29uc3REZWNsc19fOFRleHRDb2RlUjdvc3RyZWFtCi1UZXh0Q29kZTo6Q29yZUNvbnN0RGVjbHMob3N0cmVhbSAmKQotIwotLS1mb3JtYXQ9Z251Ci1EZXRhY2hfXzhTdGF0ZVZhclAxMlN0YXRlVmFyVmlldwotU3RhdGVWYXI6OkRldGFjaChTdGF0ZVZhclZpZXcgKikKLSMKLS0tZm9ybWF0PWdudQotRG9uZV9fOUNvbXBvbmVudEc4SXRlcmF0b3IKLUNvbXBvbmVudDo6RG9uZShJdGVyYXRvcikKLSMKLS0tZm9ybWF0PWdudQotRWZmZWN0X18xMVJlbGF0ZU1hbmlwUjdpdkV2ZW50Ci1SZWxhdGVNYW5pcDo6RWZmZWN0KGl2RXZlbnQgJikKLSMKLS0tZm9ybWF0PWdudQotRmluZEZpeGVkX19GUlA0Q05ldFA0Q05ldAotRmluZEZpeGVkKENOZXQgKiYsIENOZXQgKikKLSMKLS0tZm9ybWF0PWdudQotRml4NDhfYWJvcnRfX0ZSOHR3b2xvbmdzCi1GaXg0OF9hYm9ydCh0d29sb25ncyAmKQotIwotLS1mb3JtYXQ9Z251Ci1HZXRCYXJJbmZvX18xNWl2Ml82X1ZTY3JvbGxlclAxM2l2UGVyc3BlY3RpdmVSaVQyCi1pdjJfNl9WU2Nyb2xsZXI6OkdldEJhckluZm8oaXZQZXJzcGVjdGl2ZSAqLCBpbnQgJiwgaW50ICYpCi0jCi0tLWZvcm1hdD1nbnUKLUdldEJnQ29sb3JfX0M5aXZQYWludGVyCi1pdlBhaW50ZXI6OkdldEJnQ29sb3Iodm9pZCkgY29uc3QKLSMKLS0tZm9ybWF0PWdudQotSW5zZXJ0Qm9keV9fMTVIX1B1bGxyaWdodE1lbnVpaQotSF9QdWxscmlnaHRNZW51OjpJbnNlcnRCb2R5KGludCwgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1JbnNlcnRDaGFyYWN0ZXJfXzlUZXh0TWFuaXBjCi1UZXh0TWFuaXA6Okluc2VydENoYXJhY3RlcihjaGFyKQotIwotLS1mb3JtYXQ9Z251Ci1JbnNlcnRUb3BsZXZlbF9fN2l2V29ybGRQMTJpdkludGVyYWN0b3JUMQotaXZXb3JsZDo6SW5zZXJ0VG9wbGV2ZWwoaXZJbnRlcmFjdG9yICosIGl2SW50ZXJhY3RvciAqKQotIwotLS1mb3JtYXQ9Z251Ci1JbnNlcnRUb3BsZXZlbF9fN2l2V29ybGRQMTJpdkludGVyYWN0b3JUMWlpVWkKLWl2V29ybGQ6Okluc2VydFRvcGxldmVsKGl2SW50ZXJhY3RvciAqLCBpdkludGVyYWN0b3IgKiwgaW50LCBpbnQsIHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWdudQotSXNBR3JvdXBfX0ZQMTFHcmFwaGljVmlld1AxMUdyYXBoaWNDb21wCi1Jc0FHcm91cChHcmFwaGljVmlldyAqLCBHcmFwaGljQ29tcCAqKQotIwotLS1mb3JtYXQ9Z251Ci1Jc0FfXzEwQnV0dG9uQ29kZVVsCi1CdXR0b25Db2RlOjpJc0EodW5zaWduZWQgbG9uZykKLSMKLS0tZm9ybWF0PWdudQotUmVhZE5hbWVfX0ZSN2lzdHJlYW1QYwotUmVhZE5hbWUoaXN0cmVhbSAmLCBjaGFyICopCi0jCi0tLWZvcm1hdD1nbnUKLVJlZHJhd19fMTNTdHJpbmdCcm93c2VyaWlpaQotU3RyaW5nQnJvd3Nlcjo6UmVkcmF3KGludCwgaW50LCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWdudQotUm90YXRlX18xM2l2VHJhbnNmb3JtZXJmCi1pdlRyYW5zZm9ybWVyOjpSb3RhdGUoZmxvYXQpCi0jCi0tLWZvcm1hdD1nbnUKLVJvdGF0ZWRfX0MxM2l2VHJhbnNmb3JtZXJmCi1pdlRyYW5zZm9ybWVyOjpSb3RhdGVkKGZsb2F0KSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1Sb3VuZF9fRmYKLVJvdW5kKGZsb2F0KQotIwotLS1mb3JtYXQ9Z251Ci1TZXRFeHBvcnRfXzE2TWVtYmVyU2hhcmVkTmFtZVVpCi1NZW1iZXJTaGFyZWROYW1lOjpTZXRFeHBvcnQodW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1TZXRfXzE0aXZDb250cm9sU3RhdGUxM0NvbnRyb2xTdGF0dXNVaQotaXZDb250cm9sU3RhdGU6OlNldChDb250cm9sU3RhdHVzLCB1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLVNldF9fNURGYWNlUGNpaQotREZhY2U6OlNldChjaGFyICosIGludCwgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1WQ29udmVydF9fOWl2VFNvbHZlclAxMml2SW50ZXJhY3RvclJQOFRFbGVtZW50VDIKLWl2VFNvbHZlcjo6VkNvbnZlcnQoaXZJbnRlcmFjdG9yICosIFRFbGVtZW50IComLCBURWxlbWVudCAqJikKLSMKLS0tZm9ybWF0PWdudQotVkNvbnZlcnRfXzlpdlRTb2x2ZXJQN2l2VEdsdWVSUDhURWxlbWVudAotaXZUU29sdmVyOjpWQ29udmVydChpdlRHbHVlICosIFRFbGVtZW50IComKQotIwotLS1mb3JtYXQ9Z251Ci1WT3JkZXJfXzlpdlRTb2x2ZXJVaVJQMTJpdkludGVyYWN0b3JUMgotaXZUU29sdmVyOjpWT3JkZXIodW5zaWduZWQgaW50LCBpdkludGVyYWN0b3IgKiYsIGl2SW50ZXJhY3RvciAqJikKLSMKLS0tZm9ybWF0PWdudQotXzEwUGFnZUJ1dHRvblwkX19ib3RoCi1QYWdlQnV0dG9uOjpfX2JvdGgKLSMKLS0tZm9ybWF0PWdudQotXzNSTkdcJHNpbmdsZU1hbnRpc3NhCi1STkc6OnNpbmdsZU1hbnRpc3NhCi0jCi0tLWZvcm1hdD1nbnUKLV81SUNvbXBcJF9yZWxlYXNlCi1JQ29tcDo6X3JlbGVhc2UKLSMKLS0tZm9ybWF0PWdudQotX1wkXzEwQml0bWFwQ29tcAotQml0bWFwQ29tcDo6fkJpdG1hcENvbXAodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX1wkXzlfX2lvX2RlZnMKLV9faW9fZGVmczo6fl9faW9fZGVmcyh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fXCRfUTIzZm9vM2JhcgotZm9vOjpiYXI6On5iYXIodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX1wkX1EzM2ZvbzNiYXI0YmVsbAotZm9vOjpiYXI6OmJlbGw6On5iZWxsKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fMTBpdlRlbGx0YWxlaVA3aXZHbHlwaAotaXZUZWxsdGFsZTo6aXZUZWxsdGFsZShpbnQsIGl2R2x5cGggKikKLSMKLS0tZm9ybWF0PWdudQotX18xMGl2Vmlld3BvcnRpUDEyaXZJbnRlcmFjdG9yVWkKLWl2Vmlld3BvcnQ6Oml2Vmlld3BvcnQoaW50LCBpdkludGVyYWN0b3IgKiwgdW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fXzEwb3N0cnN0cmVhbQotb3N0cnN0cmVhbTo6b3N0cnN0cmVhbSh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fXzEwb3N0cnN0cmVhbVBjaWkKLW9zdHJzdHJlYW06Om9zdHJzdHJlYW0oY2hhciAqLCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWdudQotX18xMUJpdG1hcFRhYmxlaQotQml0bWFwVGFibGU6OkJpdG1hcFRhYmxlKGludCkKLSMKLS0tZm9ybWF0PWdudQotX18xMlZpZXdwb3J0Q29kZVAxMlZpZXdwb3J0Q29tcAotVmlld3BvcnRDb2RlOjpWaWV3cG9ydENvZGUoVmlld3BvcnRDb21wICopCi0jCi0tLWZvcm1hdD1nbnUKLV9fMTJpdjJfNl9Cb3JkZXJpaQotaXYyXzZfQm9yZGVyOjppdjJfNl9Cb3JkZXIoaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fMTJpdkJyZWFrX0xpc3RsCi1pdkJyZWFrX0xpc3Q6Oml2QnJlYWtfTGlzdChsb25nKQotIwotLS1mb3JtYXQ9Z251Ci1fXzE0aXYyXzZfTWVudUl0ZW1pUDEyaXZJbnRlcmFjdG9yCi1pdjJfNl9NZW51SXRlbTo6aXYyXzZfTWVudUl0ZW0oaW50LCBpdkludGVyYWN0b3IgKikKLSMKLS0tZm9ybWF0PWdudQotX18yMERpc3BsYXlMaXN0X0l0ZXJhdG9yUjExRGlzcGxheUxpc3QKLURpc3BsYXlMaXN0X0l0ZXJhdG9yOjpEaXNwbGF5TGlzdF9JdGVyYXRvcihEaXNwbGF5TGlzdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fXzNmb29SVDAKLWZvbzo6Zm9vKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fXzNmb29pTjMxCi1mb286OmZvbyhpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fM2Zvb2lSVDBpVDJpVDIKLWZvbzo6Zm9vKGludCwgZm9vICYsIGludCwgZm9vICYsIGludCwgZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fNktleU1hcFBUMAotS2V5TWFwOjpLZXlNYXAoS2V5TWFwICopCi0jCi0tLWZvcm1hdD1nbnUKLV9fOEFycm93Q21kUDZFZGl0b3JVaVVpCi1BcnJvd0NtZDo6QXJyb3dDbWQoRWRpdG9yICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fXzlGX0VsbGlwc2VpaWlpUDdHcmFwaGljCi1GX0VsbGlwc2U6OkZfRWxsaXBzZShpbnQsIGludCwgaW50LCBpbnQsIEdyYXBoaWMgKikKLSMKLS0tZm9ybWF0PWdudQotX185RnJhbWVEYXRhUDlGcmFtZUNvbXBpCi1GcmFtZURhdGE6OkZyYW1lRGF0YShGcmFtZUNvbXAgKiwgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fXzlIVkdyYXBoaWNQOUNhbnZhc1ZhclA3R3JhcGhpYwotSFZHcmFwaGljOjpIVkdyYXBoaWMoQ2FudmFzVmFyICosIEdyYXBoaWMgKikKLSMKLS0tZm9ybWF0PWdudQotX19RMjNmb28zYmFyCi1mb286OmJhcjo6YmFyKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fUTMzZm9vM2JhcjRiZWxsCi1mb286OmJhcjo6YmVsbDo6YmVsbCh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX2FhX18zZm9vUlQwCi1mb286Om9wZXJhdG9yJiYoZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fYWFkX18zZm9vUlQwCi1mb286Om9wZXJhdG9yJj0oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fYWRfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3ImKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2Fkdl9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvci89KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2Flcl9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcl49KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2Fsc19fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcjw8PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hbWRfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3IlPShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hbWlfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3ItPShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hbWxfXzNGaXhSVDAKLUZpeDo6b3BlcmF0b3IqPShGaXggJikKLSMKLS0tZm9ybWF0PWdudQotX19hbWxfXzVGaXgxNmkKLUZpeDE2OjpvcGVyYXRvcio9KGludCkKLSMKLS0tZm9ybWF0PWdudQotX19hbWxfXzVGaXgzMlJUMAotRml4MzI6Om9wZXJhdG9yKj0oRml4MzIgJikKLSMKLS0tZm9ybWF0PWdudQotX19hb3JfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3J8PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hcGxfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3IrPShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19hcnNfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I+Pj0oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fYXNfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I9KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2NsX18zZm9vUlQwCi1mb286Om9wZXJhdG9yKCkoZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fY2xfXzZOb3JtYWwKLU5vcm1hbDo6b3BlcmF0b3IoKSh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX2NsX182U3RyaW5naWkKLVN0cmluZzo6b3BlcmF0b3IoKShpbnQsIGludCkKLSMKLS0tZm9ybWF0PWdudQotX19jbV9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvciwgKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2NvX18zZm9vCi1mb286Om9wZXJhdG9yfih2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX2RsX18zZm9vUHYKLWZvbzo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikKLSMKLS0tZm9ybWF0PWdudQotX19kdl9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvci8oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fZXFfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I9PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19lcl9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcl4oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fZ2VfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I+PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19ndF9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcj4oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fbGVfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I8PShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19sc19fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcjw8KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2xzX19GUjdvc3RyZWFtUEZSM2lvc19SM2lvcwotb3BlcmF0b3I8PChvc3RyZWFtICYsIGlvcyAmKCopKGlvcyAmKSkKLSMKLS0tZm9ybWF0PWdudQotX19sc19fRlI3b3N0cmVhbVIzRml4Ci1vcGVyYXRvcjw8KG9zdHJlYW0gJiwgRml4ICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fbHRfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3I8KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX21kX18zZm9vUlQwCi1mb286Om9wZXJhdG9yJShmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19taV9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvci0oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fbWxfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3IqKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX21tX18zZm9vaQotZm9vOjpvcGVyYXRvci0tKGludCkKLSMKLS0tZm9ybWF0PWdudQotX19uZV9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvciE9KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX250X18zZm9vCi1mb286Om9wZXJhdG9yISh2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX253X18zZm9vaQotZm9vOjpvcGVyYXRvciBuZXcoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX29vX18zZm9vUlQwCi1mb286Om9wZXJhdG9yfHwoZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fb3BQY19fM2ZvbwotZm9vOjpvcGVyYXRvciBjaGFyICoodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX19vcGlfXzNmb28KLWZvbzo6b3BlcmF0b3IgaW50KHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fb3JfXzNmb29SVDAKLWZvbzo6b3BlcmF0b3J8KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX3BsX18zZm9vUlQwCi1mb286Om9wZXJhdG9yKyhmb28gJikKLSMKLS0tZm9ybWF0PWdudQotX19wcF9fM2Zvb2kKLWZvbzo6b3BlcmF0b3IrKyhpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fcmZfXzNmb28KLWZvbzo6b3BlcmF0b3ItPih2b2lkKQotIwotLS1mb3JtYXQ9Z251Ci1fX3JtX18zZm9vUlQwCi1mb286Om9wZXJhdG9yLT4qKGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX3JzX18zZm9vUlQwCi1mb286Om9wZXJhdG9yPj4oZm9vICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9uZXdfRml4X19GVXMKLV9uZXdfRml4KHVuc2lnbmVkIHNob3J0KQotIwotLS1mb3JtYXQ9Z251Ci1fdnQuZm9vCi1mb28gdmlydHVhbCB0YWJsZQotIwotLS1mb3JtYXQ9Z251Ci1fdnQuZm9vLmJhcgotZm9vOjpiYXIgdmlydHVhbCB0YWJsZQotIwotLS1mb3JtYXQ9Z251Ci1fdnRcJGZvbwotZm9vIHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWdudQotX3Z0XCRmb29cJGJhcgotZm9vOjpiYXIgdmlydHVhbCB0YWJsZQotIwotLS1mb3JtYXQ9Z251Ci1hcHBlbmRfXzdpdkdseXBoUFQwCi1pdkdseXBoOjphcHBlbmQoaXZHbHlwaCAqKQotIwotLS1mb3JtYXQ9Z251Ci1jbGVhcm9rX19GUDdfd2luX3N0aQotY2xlYXJvayhfd2luX3N0ICosIGludCkKLSMKLS0tZm9ybWF0PWdudQotY29tcGxleGZ1bmMyX19GUEZQY19pCi1jb21wbGV4ZnVuYzIoaW50ICgqKShjaGFyICopKQotIwotLS1mb3JtYXQ9Z251Ci1jb21wbGV4ZnVuYzNfX0ZQRlBGUGxfc19pCi1jb21wbGV4ZnVuYzMoaW50ICgqKShzaG9ydCAoKikobG9uZyAqKSkpCi0jCi0tLWZvcm1hdD1nbnUKLWNvbXBsZXhmdW5jNF9fRlBGUEZQY19zX2kKLWNvbXBsZXhmdW5jNChpbnQgKCopKHNob3J0ICgqKShjaGFyICopKSkKLSMKLS0tZm9ybWF0PWdudQotY29tcGxleGZ1bmM1X19GUEZQY19QRmxfaQotY29tcGxleGZ1bmM1KGludCAoKigqKShjaGFyICopKShsb25nKSkKLSMKLS0tZm9ybWF0PWdudQotY29tcGxleGZ1bmM2X19GUEZQaV9QRmxfaQotY29tcGxleGZ1bmM2KGludCAoKigqKShpbnQgKikpKGxvbmcpKQotIwotLS1mb3JtYXQ9Z251Ci1jb21wbGV4ZnVuYzdfX0ZQRlBGUGNfaV9QRmxfaQotY29tcGxleGZ1bmM3KGludCAoKigqKShpbnQgKCopKGNoYXIgKikpKShsb25nKSkKLSMKLS0tZm9ybWF0PWdudQotZm9vX19GaU4zMAotZm9vKGludCwgaW50LCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWdudQotZm9vX19GaVIzZm9vaVQxaVQxCi1mb28oaW50LCBmb28gJiwgaW50LCBmb28gJiwgaW50LCBmb28gJikKLSMKLS0tZm9ybWF0PWdudQotZm9vX19fM2JhcmwKLWJhcjo6Zm9vXyhsb25nKQotIwotLS1mb3JtYXQ9Z251Ci1pbnNlcnRfXzE1aXZDbGlwcGluZ1N0YWNrbFJQOF9YUmVnaW9uCi1pdkNsaXBwaW5nU3RhY2s6Omluc2VydChsb25nLCBfWFJlZ2lvbiAqJikKLSMKLS0tZm9ybWF0PWdudQotaW5zZXJ0X18xNkNob29zZXJJbmZvX0xpc3RsUjExQ2hvb3NlckluZm8KLUNob29zZXJJbmZvX0xpc3Q6Omluc2VydChsb25nLCBDaG9vc2VySW5mbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1pbnNlcnRfXzE3Rm9udEZhbWlseVJlcExpc3RsUlAxNWl2Rm9udEZhbWlseVJlcAotRm9udEZhbWlseVJlcExpc3Q6Omluc2VydChsb25nLCBpdkZvbnRGYW1pbHlSZXAgKiYpCi0jCi0tLWZvcm1hdD1nbnUKLWxlYXZlb2tfX0ZQN193aW5fc3RjCi1sZWF2ZW9rKF93aW5fc3QgKiwgY2hhcikKLSMKLS0tZm9ybWF0PWdudQotbGVmdF9tb3Zlcl9fQzdpdk1GS2l0UDEyaXZBZGp1c3RhYmxlUDdpdlN0eWxlCi1pdk1GS2l0OjpsZWZ0X21vdmVyKGl2QWRqdXN0YWJsZSAqLCBpdlN0eWxlICopIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRlNjCi1vdmVybG9hZDFhcmcoc2lnbmVkIGNoYXIpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRlVjCi1vdmVybG9hZDFhcmcodW5zaWduZWQgY2hhcikKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GVWkKLW92ZXJsb2FkMWFyZyh1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRlVsCi1vdmVybG9hZDFhcmcodW5zaWduZWQgbG9uZykKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GVXMKLW92ZXJsb2FkMWFyZyh1bnNpZ25lZCBzaG9ydCkKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GYwotb3ZlcmxvYWQxYXJnKGNoYXIpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRmQKLW92ZXJsb2FkMWFyZyhkb3VibGUpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRmYKLW92ZXJsb2FkMWFyZyhmbG9hdCkKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GaQotb3ZlcmxvYWQxYXJnKGludCkKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19GbAotb3ZlcmxvYWQxYXJnKGxvbmcpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkMWFyZ19fRnMKLW92ZXJsb2FkMWFyZyhzaG9ydCkKLSMKLS0tZm9ybWF0PWdudQotb3ZlcmxvYWQxYXJnX19Gdgotb3ZlcmxvYWQxYXJnKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmkKLW92ZXJsb2FkYXJncyhpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpCi1vdmVybG9hZGFyZ3MoaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWkKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpCi1vdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWkKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWlpCi1vdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWlpaQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWlpaWkKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLW92ZXJsb2FkYXJnc19fRmlpaWlpaWlpaWlpCi1vdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLXBva2VfXzhpdlJhc3RlclVsVWxmZmZmCi1pdlJhc3Rlcjo6cG9rZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkKLSMKLS0tZm9ybWF0PWdudQotcG9sYXJfX0ZkZAotcG9sYXIoZG91YmxlLCBkb3VibGUpCi0jCi0tLWZvcm1hdD1nbnUKLXNjYWxlX18xM2l2VHJhbnNmb3JtZXJmZgotaXZUcmFuc2Zvcm1lcjo6c2NhbGUoZmxvYXQsIGZsb2F0KQotIwotLS1mb3JtYXQ9Z251Ci1zZ2V0bl9fN2ZpbGVidWZQY2kKLWZpbGVidWY6OnNnZXRuKGNoYXIgKiwgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1zaGlmdF9fRlA1X0ZyZXBpVDAKLXNoaWZ0KF9GcmVwICosIGludCwgX0ZyZXAgKikKLSMKLS0tZm9ybWF0PWdudQotdGVzdF9fQzZCaXRTZXRpCi1CaXRTZXQ6OnRlc3QoaW50KSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci10ZXN0X19DNkJpdFNldGlpCi1CaXRTZXQ6OnRlc3QoaW50LCBpbnQpIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLXRleHRfc291cmNlX184RG9jdW1lbnRsCi1Eb2N1bWVudDo6dGV4dF9zb3VyY2UobG9uZykKLSMKLS0tZm9ybWF0PWdudQotdmFyaWFuY2VfXzZFcmxhbmdkCi1Fcmxhbmc6OnZhcmlhbmNlKGRvdWJsZSkKLSMKLS0tZm9ybWF0PWdudQotdmlld19fMTREb2N1bWVudFZpZXdlclA4SXRlbVZpZXdQMTFUYWJ1bGFySXRlbQotRG9jdW1lbnRWaWV3ZXI6OnZpZXcoSXRlbVZpZXcgKiwgVGFidWxhckl0ZW0gKikKLSMKLS0tZm9ybWF0PWdudQoteHlfZXh0ZW50c19fMTFpdkV4dGVuc2lvbmZmZmYKLWl2RXh0ZW5zaW9uOjp4eV9leHRlbnRzKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KQotIwotLS1mb3JtYXQ9Z251Ci16ZXJvX184b3NNZW1vcnlQdlVpCi1vc01lbW9yeTo6emVybyh2b2lkICosIHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWdudQotXzJUNFwkTgotVDQ6Ok4KLSMKLS0tZm9ybWF0PWdudQotX1EyMlQ0MnQxXCROCi1UNDo6dDE6Ok4KLSMKLS0tZm9ybWF0PWdudQotZ2V0X18yVDEKLVQxOjpnZXQodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotZ2V0X19RMjJUMTFhCi1UMTo6YTo6Z2V0KHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLWdldF9fUTMyVDExYTFiCi1UMTo6YTo6Yjo6Z2V0KHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLWdldF9fUTQyVDExYTFiMWMKLVQxOjphOjpiOjpjOjpnZXQodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotZ2V0X19RNTJUMTFhMWIxYzFkCi1UMTo6YTo6Yjo6Yzo6ZDo6Z2V0KHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLXB1dF9fMlQxaQotVDE6OnB1dChpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLXB1dF9fUTIyVDExYWkKLVQxOjphOjpwdXQoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1wdXRfX1EzMlQxMWExYmkKLVQxOjphOjpiOjpwdXQoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1wdXRfX1E0MlQxMWExYjFjaQotVDE6OmE6OmI6OmM6OnB1dChpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLXB1dF9fUTUyVDExYTFiMWMxZGkKLVQxOjphOjpiOjpjOjpkOjpwdXQoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1iYXJfXzNmb29QdgotZm9vOjpiYXIodm9pZCAqKQotIwotLS1mb3JtYXQ9Z251Ci1iYXJfX0MzZm9vUHYKLWZvbzo6YmFyKHZvaWQgKikgY29uc3QKLSMKLS0tZm9ybWF0PWdudQotX19lcV9fM2Zvb1JUMAotZm9vOjpvcGVyYXRvcj09KGZvbyAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2VxX19DM2Zvb1IzZm9vCi1mb286Om9wZXJhdG9yPT0oZm9vICYpIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLWVsZW1fX3Q2dmVjdG9yMVpkaQotdmVjdG9yPGRvdWJsZT46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9Z251Ci1lbGVtX190NnZlY3RvcjFaaWkKLXZlY3RvcjxpbnQ+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWdudQotX190NnZlY3RvcjFaZGkKLXZlY3Rvcjxkb3VibGU+Ojp2ZWN0b3IoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX3Q2dmVjdG9yMVppaQotdmVjdG9yPGludD46OnZlY3RvcihpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9cJF90NnZlY3RvcjFaZGkKLXZlY3Rvcjxkb3VibGU+Ojp+dmVjdG9yKGludCkKLSMKLS0tZm9ybWF0PWdudQotX1wkX3Q2dmVjdG9yMVppaQotdmVjdG9yPGludD46On52ZWN0b3IoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX253X190MlQxMVpjVWkKLVQxPGNoYXI+OjpvcGVyYXRvciBuZXcodW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX253X190MlQxMVoxdFVpCi1UMTx0Pjo6b3BlcmF0b3IgbmV3KHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWdudQotX19kbF9fdDJUMTFaY1B2Ci1UMTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikKLSMKLS0tZm9ybWF0PWdudQotX19kbF9fdDJUMTFaMXRQdgotVDE8dD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDJUMTFaY2kKLVQxPGNoYXI+OjpUMShpbnQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDJUMTFaYwotVDE8Y2hhcj46OlQxKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDJUMTFaMXRpCi1UMTx0Pjo6VDEoaW50KQotIwotLS1mb3JtYXQ9Z251Ci1fX3QyVDExWjF0Ci1UMTx0Pjo6VDEodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX19RMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeAotTGlzdDxWSERMRW50aXR5Pjo6UGl4OjpQaXgodm9pZCkKLSMKLS0tZm9ybWF0PWdudQotX19RMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeFBRMnQ0TGlzdDFaMTBWSERMRW50aXR5N2VsZW1lbnQKLUxpc3Q8VkhETEVudGl0eT46OlBpeDo6UGl4KExpc3Q8VkhETEVudGl0eT46OmVsZW1lbnQgKikKLSMKLS0tZm9ybWF0PWdudQotX19RMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeFJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgKLUxpc3Q8VkhETEVudGl0eT46OlBpeDo6UGl4KExpc3Q8VkhETEVudGl0eT46OlBpeCBjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX1EydDRMaXN0MVoxMFZIRExFbnRpdHk3ZWxlbWVudFJDMTBWSERMRW50aXR5UFQwCi1MaXN0PFZIRExFbnRpdHk+OjplbGVtZW50OjplbGVtZW50KFZIRExFbnRpdHkgY29uc3QgJiwgTGlzdDxWSERMRW50aXR5Pjo6ZWxlbWVudCAqKQotIwotLS1mb3JtYXQ9Z251Ci1fX1EydDRMaXN0MVoxMFZIRExFbnRpdHk3ZWxlbWVudFJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTdlbGVtZW50Ci1MaXN0PFZIRExFbnRpdHk+OjplbGVtZW50OjplbGVtZW50KExpc3Q8VkhETEVudGl0eT46OmVsZW1lbnQgY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotX19jbF9fQzExVkhETExpYnJhcnlHdDRQaXhYM1oxMVZIRExMaWJyYXJ5WjE0VkhETExpYnJhcnlSZXBadDRMaXN0MVoxMFZIRExFbnRpdHkKLVZIRExMaWJyYXJ5OjpvcGVyYXRvcigpKFBpeFg8VkhETExpYnJhcnksIFZIRExMaWJyYXJ5UmVwLCBMaXN0PFZIRExFbnRpdHk+ID4pIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLV9fY2xfX0N0NExpc3QxWjEwVkhETEVudGl0eVJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgKLUxpc3Q8VkhETEVudGl0eT46Om9wZXJhdG9yKCkoTGlzdDxWSERMRW50aXR5Pjo6UGl4IGNvbnN0ICYpIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLV9fbmVfX0ZQdlJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgKLW9wZXJhdG9yIT0odm9pZCAqLCBMaXN0PFZIRExFbnRpdHk+OjpQaXggY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotX19uZV9fRlB2UkN0NFBpeFgzWjExVkhETExpYnJhcnlaMTRWSERMTGlicmFyeVJlcFp0NExpc3QxWjEwVkhETEVudGl0eQotb3BlcmF0b3IhPSh2b2lkICosIFBpeFg8VkhETExpYnJhcnksIFZIRExMaWJyYXJ5UmVwLCBMaXN0PFZIRExFbnRpdHk+ID4gY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotX190NExpc3QxWjEwVkhETEVudGl0eVJDdDRMaXN0MVoxMFZIRExFbnRpdHkKLUxpc3Q8VkhETEVudGl0eT46Okxpc3QoTGlzdDxWSERMRW50aXR5PiBjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX3Q0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5Ci1QaXhYPFZIRExMaWJyYXJ5LCBWSERMTGlicmFyeVJlcCwgTGlzdDxWSERMRW50aXR5PiA+OjpQaXhYKHZvaWQpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDRQaXhYM1oxMVZIRExMaWJyYXJ5WjE0VkhETExpYnJhcnlSZXBadDRMaXN0MVoxMFZIRExFbnRpdHlQMTRWSERMTGlicmFyeVJlcEdRMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeAotUGl4WDxWSERMTGlicmFyeSwgVkhETExpYnJhcnlSZXAsIExpc3Q8VkhETEVudGl0eT4gPjo6UGl4WChWSERMTGlicmFyeVJlcCAqLCBMaXN0PFZIRExFbnRpdHk+OjpQaXgpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDRQaXhYM1oxMVZIRExMaWJyYXJ5WjE0VkhETExpYnJhcnlSZXBadDRMaXN0MVoxMFZIRExFbnRpdHlSQ3Q0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5Ci1QaXhYPFZIRExMaWJyYXJ5LCBWSERMTGlicmFyeVJlcCwgTGlzdDxWSERMRW50aXR5PiA+OjpQaXhYKFBpeFg8VkhETExpYnJhcnksIFZIRExMaWJyYXJ5UmVwLCBMaXN0PFZIRExFbnRpdHk+ID4gY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotbmV4dEVfX0MxMVZIRExMaWJyYXJ5UnQ0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5Ci1WSERMTGlicmFyeTo6bmV4dEUoUGl4WDxWSERMTGlicmFyeSwgVkhETExpYnJhcnlSZXAsIExpc3Q8VkhETEVudGl0eT4gPiAmKSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1uZXh0X19DdDRMaXN0MVoxMFZIRExFbnRpdHlSUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgKLUxpc3Q8VkhETEVudGl0eT46Om5leHQoTGlzdDxWSERMRW50aXR5Pjo6UGl4ICYpIGNvbnN0Ci0jCi0tLWZvcm1hdD1nbnUKLV9HTE9CQUxfXCREXCRzZXQKLWdsb2JhbCBkZXN0cnVjdG9ycyBrZXllZCB0byBzZXQKLSMKLS0tZm9ybWF0PWdudQotX0dMT0JBTF9cJElcJHNldAotZ2xvYmFsIGNvbnN0cnVjdG9ycyBrZXllZCB0byBzZXQKLSMKLS0tZm9ybWF0PWdudQotX19hc19fdDVMaXN0UzFaVWlSQ3Q1TGlzdFMxWlVpCi1MaXN0Uzx1bnNpZ25lZCBpbnQ+OjpvcGVyYXRvcj0oTGlzdFM8dW5zaWduZWQgaW50PiBjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fX2NsX19DdDVMaXN0UzFaVWlSQ1EydDVMaXN0UzFaVWkzVml4Ci1MaXN0Uzx1bnNpZ25lZCBpbnQ+OjpvcGVyYXRvcigpKExpc3RTPHVuc2lnbmVkIGludD46OlZpeCBjb25zdCAmKSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1fX2NsX19DdDVTZXRMUzFaVWlSQ1EydDVTZXRMUzFaVWkzVml4Ci1TZXRMUzx1bnNpZ25lZCBpbnQ+OjpvcGVyYXRvcigpKFNldExTPHVuc2lnbmVkIGludD46OlZpeCBjb25zdCAmKSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1fX3QxMExpc3RTX2xpbmsxWlVpUkNVaVBUMAotTGlzdFNfbGluazx1bnNpZ25lZCBpbnQ+OjpMaXN0U19saW5rKHVuc2lnbmVkIGludCBjb25zdCAmLCBMaXN0U19saW5rPHVuc2lnbmVkIGludD4gKikKLSMKLS0tZm9ybWF0PWdudQotX190MTBMaXN0U19saW5rMVpVaVJDdDEwTGlzdFNfbGluazFaVWkKLUxpc3RTX2xpbms8dW5zaWduZWQgaW50Pjo6TGlzdFNfbGluayhMaXN0U19saW5rPHVuc2lnbmVkIGludD4gY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotX190NUxpc3RTMVpVaVJDdDVMaXN0UzFaVWkKLUxpc3RTPHVuc2lnbmVkIGludD46Okxpc3RTKExpc3RTPHVuc2lnbmVkIGludD4gY29uc3QgJikKLSMKLS0tZm9ybWF0PWdudQotbmV4dF9fQ3Q1TGlzdFMxWlVpUlEydDVMaXN0UzFaVWkzVml4Ci1MaXN0Uzx1bnNpZ25lZCBpbnQ+OjpuZXh0KExpc3RTPHVuc2lnbmVkIGludD46OlZpeCAmKSBjb25zdAotIwotLS1mb3JtYXQ9Z251Ci1fX25lX19GUHZSQ1EydDVTZXRMUzFaVWkzVml4Ci1vcGVyYXRvciE9KHZvaWQgKiwgU2V0TFM8dW5zaWduZWQgaW50Pjo6Vml4IGNvbnN0ICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDhMaXN0RWxlbTFaNUxhYmVsUnQ0TGlzdDFaNUxhYmVsCi1MaXN0RWxlbTxMYWJlbD46Okxpc3RFbGVtKExpc3Q8TGFiZWw+ICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fdDhCRERIb29rVjFaUGNSQ1BjCi1CRERIb29rVjxjaGFyICo+OjpCRERIb29rVihjaGFyICpjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1fdnRcJHQ4QkRESG9va1YxWlBjCi1CRERIb29rVjxjaGFyICo+IHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWdudQotX19uZV9fRlB2UkNRMjExQkRERnVuY3Rpb240Vml4Qgotb3BlcmF0b3IhPSh2b2lkICosIEJEREZ1bmN0aW9uOjpWaXhCIGNvbnN0ICYpCi0jCi0tLWZvcm1hdD1nbnUKLV9fZXFfX0ZQdlJDUTIxMUJEREZ1bmN0aW9uNFZpeEIKLW9wZXJhdG9yPT0odm9pZCAqLCBCRERGdW5jdGlvbjo6Vml4QiBjb25zdCAmKQotIwotLS1mb3JtYXQ9Z251Ci1yZWxhdGl2ZUlkX19DUTM2VF9waGkyMTBUX3ByZXNlcnZlOEZQQ19uZXh0UkNRMjZUX3BoaTIxMFRfcHJlc2VydmVSQzEwUGFyYW1ldGVycwotVF9waGkyOjpUX3ByZXNlcnZlOjpGUENfbmV4dDo6cmVsYXRpdmVJZChUX3BoaTI6OlRfcHJlc2VydmUgY29uc3QgJiwgUGFyYW1ldGVycyBjb25zdCAmKSBjb25zdAotIwotLS1mb3JtYXQ9bHVjaWQKLVdTX19GUjdpc3RyZWFtCi1XUyhpc3RyZWFtICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hYV9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvciYmKGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYWFkX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yJj0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hZF9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvciYoZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hZHZfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3IvPShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2Fkdl9fN2NvbXBsZXhGN2NvbXBsZXgKLWNvbXBsZXg6Om9wZXJhdG9yLz0oY29tcGxleCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2Flcl9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcl49KGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYWxzX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPDw9KGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYW1kX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yJT0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hbWlfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3ItPShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2FtdV9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcio9KGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYW11X183Y29tcGxleEY3Y29tcGxleAotY29tcGxleDo6b3BlcmF0b3IqPShjb21wbGV4KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fYW9yX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yfD0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hcGxfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3IrPShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2Fyc19fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcj4+PShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2FzX18xOGlzdHJlYW1fd2l0aGFzc2lnbkZQOXN0cmVhbWJ1ZgotaXN0cmVhbV93aXRoYXNzaWduOjpvcGVyYXRvcj0oc3RyZWFtYnVmICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hc19fMThpc3RyZWFtX3dpdGhhc3NpZ25GUjdpc3RyZWFtCi1pc3RyZWFtX3dpdGhhc3NpZ246Om9wZXJhdG9yPShpc3RyZWFtICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hc19fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcj0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19hc19fM2lvc0ZSM2lvcwotaW9zOjpvcGVyYXRvcj0oaW9zICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jbF9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcigpKGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY21fXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3IsIChmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2NvX18zZm9vRnYKLWZvbzo6b3BlcmF0b3J+KHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fMTBpc3Ryc3RyZWFtRlBjCi1pc3Ryc3RyZWFtOjppc3Ryc3RyZWFtKGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMGlzdHJzdHJlYW1GUGNpCi1pc3Ryc3RyZWFtOjppc3Ryc3RyZWFtKGNoYXIgKiwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzEwb3N0cnN0cmVhbUZQY2lUMgotb3N0cnN0cmVhbTo6b3N0cnN0cmVhbShjaGFyICosIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzEwb3N0cnN0cmVhbUZ2Ci1vc3Ryc3RyZWFtOjpvc3Ryc3RyZWFtKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fMTBzbWFuaXBfaW50RlBGUjNpb3NpX1IzaW9zaQotc21hbmlwX2ludDo6c21hbmlwX2ludChpb3MgJigqKShpb3MgJiwgaW50KSwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzExZnN0cmVhbWJhc2VGaQotZnN0cmVhbWJhc2U6OmZzdHJlYW1iYXNlKGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMWZzdHJlYW1iYXNlRmlQY1QxCi1mc3RyZWFtYmFzZTo6ZnN0cmVhbWJhc2UoaW50LCBjaGFyICosIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMWZzdHJlYW1iYXNlRnYKLWZzdHJlYW1iYXNlOjpmc3RyZWFtYmFzZSh2b2lkKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzExc21hbmlwX2xvbmdGUEZSM2lvc2xfUjNpb3NsCi1zbWFuaXBfbG9uZzo6c21hbmlwX2xvbmcoaW9zICYoKikoaW9zICYsIGxvbmcpLCBsb25nKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzExc3RkaW9zdHJlYW1GUDRGSUxFCi1zdGRpb3N0cmVhbTo6c3RkaW9zdHJlYW0oRklMRSAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzEyc3Ryc3RyZWFtYnVmRlBGbF9QdlBGUHZfdgotc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYodm9pZCAqKCopKGxvbmcpLCB2b2lkICgqKSh2b2lkICopKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzEyc3Ryc3RyZWFtYnVmRlBVY2lUMQotc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYodW5zaWduZWQgY2hhciAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMnN0cnN0cmVhbWJ1ZkZQY2lUMQotc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYoY2hhciAqLCBpbnQsIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xMnN0cnN0cmVhbWJ1ZkZpCi1zdHJzdHJlYW1idWY6OnN0cnN0cmVhbWJ1ZihpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fMTJzdHJzdHJlYW1idWZGdgotc3Ryc3RyZWFtYnVmOjpzdHJzdHJlYW1idWYodm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18xM3N0cnN0cmVhbWJhc2VGUGNpVDEKLXN0cnN0cmVhbWJhc2U6OnN0cnN0cmVhbWJhc2UoY2hhciAqLCBpbnQsIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18zZm9vRlIzZm9vCi1mb286OmZvbyhmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18zZm9vRmkKLWZvbzo6Zm9vKGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18zZm9vRmlOMzEKLWZvbzo6Zm9vKGludCwgaW50LCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X18zZm9vRmlSM2Zvb1QxVDJUMVQyCi1mb286OmZvbyhpbnQsIGZvbyAmLCBpbnQsIGZvbyAmLCBpbnQsIGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzNpb3NGUDlzdHJlYW1idWYKLWlvczo6aW9zKHN0cmVhbWJ1ZiAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzdmaWxlYnVmRmlQY1QxCi1maWxlYnVmOjpmaWxlYnVmKGludCwgY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fN2ZzdHJlYW1GaVBjVDEKLWZzdHJlYW06OmZzdHJlYW0oaW50LCBjaGFyICosIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X183aXN0cmVhbUZQOXN0cmVhbWJ1ZgotaXN0cmVhbTo6aXN0cmVhbShzdHJlYW1idWYgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2N0X183aXN0cmVhbUZQOXN0cmVhbWJ1ZmlQN29zdHJlYW0KLWlzdHJlYW06OmlzdHJlYW0oc3RyZWFtYnVmICosIGludCwgb3N0cmVhbSAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzdpc3RyZWFtRmlQY1QxCi1pc3RyZWFtOjppc3RyZWFtKGludCwgY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fN2lzdHJlYW1GaVQxUDdvc3RyZWFtCi1pc3RyZWFtOjppc3RyZWFtKGludCwgaW50LCBvc3RyZWFtICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fN29zdHJlYW1GUDlzdHJlYW1idWYKLW9zdHJlYW06Om9zdHJlYW0oc3RyZWFtYnVmICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fN29zdHJlYW1GaVBjCi1vc3RyZWFtOjpvc3RyZWFtKGludCwgY2hhciAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fY3RfXzhpZnN0cmVhbUZpUGNUMQotaWZzdHJlYW06Omlmc3RyZWFtKGludCwgY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fUTIzZm9vM2JhckZ2Ci1mb286OmJhcjo6YmFyKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19jdF9fUTMzZm9vM2JhcjRiZWxsRnYKLWZvbzo6YmFyOjpiZWxsOjpiZWxsKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19kbF9fM2Zvb1NGUHYKLWZvbzo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1sdWNpZAotX19kbF9fRlB2Ci1vcGVyYXRvciBkZWxldGUodm9pZCAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fZHRfXzEwaXN0cnN0cmVhbUZ2Ci1pc3Ryc3RyZWFtOjp+aXN0cnN0cmVhbSh2b2lkKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fZHRfX1EyM2ZvbzNiYXJGdgotZm9vOjpiYXI6On5iYXIodm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2R0X19RMzNmb28zYmFyNGJlbGxGdgotZm9vOjpiYXI6OmJlbGw6On5iZWxsKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19kdl9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvci8oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19kdl9fRjdjb21wbGV4VDEKLW9wZXJhdG9yLyhjb21wbGV4LCBjb21wbGV4KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fZXFfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3I9PShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2VyX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yXihmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2dlX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPj0oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19ndF9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcj4oZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sZV9fM2Zvb0ZSM2ZvbwotZm9vOjpvcGVyYXRvcjw9KGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fbHNfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3I8PChmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZQOXN0cmVhbWJ1Zgotb3N0cmVhbTo6b3BlcmF0b3I8PChzdHJlYW1idWYgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZQRlIzaW9zX1IzaW9zCi1vc3RyZWFtOjpvcGVyYXRvcjw8KGlvcyAmKCopKGlvcyAmKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZQdgotb3N0cmVhbTo6b3BlcmF0b3I8PCh2b2lkICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sc19fN29zdHJlYW1GVWkKLW9zdHJlYW06Om9wZXJhdG9yPDwodW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fbHNfXzdvc3RyZWFtRlVsCi1vc3RyZWFtOjpvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sc19fN29zdHJlYW1GZAotb3N0cmVhbTo6b3BlcmF0b3I8PChkb3VibGUpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sc19fN29zdHJlYW1GZgotb3N0cmVhbTo6b3BlcmF0b3I8PChmbG9hdCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZpCi1vc3RyZWFtOjpvcGVyYXRvcjw8KGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2xzX183b3N0cmVhbUZsCi1vc3RyZWFtOjpvcGVyYXRvcjw8KGxvbmcpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19sc19fRlI3b3N0cmVhbTdjb21wbGV4Ci1vcGVyYXRvcjw8KG9zdHJlYW0gJiwgY29tcGxleCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX2x0X18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPChmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX21kX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yJShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX21pX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yLShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX21sX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yKihmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX21sX19GN2NvbXBsZXhUMQotb3BlcmF0b3IqKGNvbXBsZXgsIGNvbXBsZXgpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19tbV9fM2Zvb0ZpCi1mb286Om9wZXJhdG9yLS0oaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fbmVfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3IhPShmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX250X18zZm9vRnYKLWZvbzo6b3BlcmF0b3IhKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19ud19fM2Zvb1NGaQotZm9vOjpvcGVyYXRvciBuZXcoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX253X19GVWkKLW9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19ud19fRlVpUHYKLW9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQsIHZvaWQgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX29vX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yfHwoZm9vICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19vcFBjX18zZm9vRnYKLWZvbzo6b3BlcmF0b3IgY2hhciAqKHZvaWQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19vcGlfXzNmb29GdgotZm9vOjpvcGVyYXRvciBpbnQodm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX29yX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yfChmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3BsX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yKyhmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3BwX18zZm9vRmkKLWZvbzo6b3BlcmF0b3IrKyhpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19wdF9fM2Zvb0Z2Ci1mb286Om9wZXJhdG9yLT4odm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JtX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yLT4qKGZvbyAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fcnNfXzNmb29GUjNmb28KLWZvbzo6b3BlcmF0b3I+Pihmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZQOXN0cmVhbWJ1ZgotaXN0cmVhbTo6b3BlcmF0b3I+PihzdHJlYW1idWYgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZQRlIzaW9zX1IzaW9zCi1pc3RyZWFtOjpvcGVyYXRvcj4+KGlvcyAmKCopKGlvcyAmKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZQRlI3aXN0cmVhbV9SN2lzdHJlYW0KLWlzdHJlYW06Om9wZXJhdG9yPj4oaXN0cmVhbSAmKCopKGlzdHJlYW0gJikpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUFVjCi1pc3RyZWFtOjpvcGVyYXRvcj4+KHVuc2lnbmVkIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZQYwotaXN0cmVhbTo6b3BlcmF0b3I+PihjaGFyICopCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUlVpCi1pc3RyZWFtOjpvcGVyYXRvcj4+KHVuc2lnbmVkIGludCAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fcnNfXzdpc3RyZWFtRlJVbAotaXN0cmVhbTo6b3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUlVzCi1pc3RyZWFtOjpvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0ICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUmQKLWlzdHJlYW06Om9wZXJhdG9yPj4oZG91YmxlICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUmYKLWlzdHJlYW06Om9wZXJhdG9yPj4oZmxvYXQgJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZSaQotaXN0cmVhbTo6b3BlcmF0b3I+PihpbnQgJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX183aXN0cmVhbUZSbAotaXN0cmVhbTo6b3BlcmF0b3I+Pihsb25nICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotX19yc19fN2lzdHJlYW1GUnMKLWlzdHJlYW06Om9wZXJhdG9yPj4oc2hvcnQgJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3JzX19GUjdpc3RyZWFtUjdjb21wbGV4Ci1vcGVyYXRvcj4+KGlzdHJlYW0gJiwgY29tcGxleCAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fdnRibF9fMTBpc3Ryc3RyZWFtCi1pc3Ryc3RyZWFtIHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3Z0YmxfXzE3b3N0cmVhbV9faW9zdHJlYW1fXzE5aW9zdHJlYW1fd2l0aGFzc2lnbgotaW9zdHJlYW1fd2l0aGFzc2lnbjo6b3N0cmVhbV9faW9zdHJlYW0gdmlydHVhbCB0YWJsZQotIwotLS1mb3JtYXQ9bHVjaWQKLV9fdnRibF9fM2lvcwotaW9zIHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWx1Y2lkCi1fX3Z0YmxfXzNpb3NfXzEzc3Ryc3RyZWFtYmFzZQotc3Ryc3RyZWFtYmFzZTo6aW9zIHZpcnR1YWwgdGFibGUKLSMKLS0tZm9ybWF0PWx1Y2lkCi1hYnNfX0Y3Y29tcGxleAotYWJzKGNvbXBsZXgpCi0jCi0tLWZvcm1hdD1sdWNpZAotYWxsb2NhdGVfXzlzdHJlYW1idWZGdgotc3RyZWFtYnVmOjphbGxvY2F0ZSh2b2lkKQotIwotLS1mb3JtYXQ9bHVjaWQKLWF0dGFjaF9fMTFmc3RyZWFtYmFzZUZpCi1mc3RyZWFtYmFzZTo6YXR0YWNoKGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1iaXRhbGxvY19fM2lvc1NGdgotaW9zOjpiaXRhbGxvYyh2b2lkKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jaHJfX0ZpVDEKLWNocihpbnQsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGV4X2Vycm9yX19GUjExY19leGNlcHRpb24KLWNvbXBsZXhfZXJyb3IoY19leGNlcHRpb24gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGV4ZnVuYzJfX0ZQRlBjX2kKLWNvbXBsZXhmdW5jMihpbnQgKCopKGNoYXIgKikpCi0jCi0tLWZvcm1hdD1sdWNpZAotY29tcGxleGZ1bmMzX19GUEZQRlBsX3NfaQotY29tcGxleGZ1bmMzKGludCAoKikoc2hvcnQgKCopKGxvbmcgKikpKQotIwotLS1mb3JtYXQ9bHVjaWQKLWNvbXBsZXhmdW5jNF9fRlBGUEZQY19zX2kKLWNvbXBsZXhmdW5jNChpbnQgKCopKHNob3J0ICgqKShjaGFyICopKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGV4ZnVuYzVfX0ZQRlBjX1BGbF9pCi1jb21wbGV4ZnVuYzUoaW50ICgqKCopKGNoYXIgKikpKGxvbmcpKQotIwotLS1mb3JtYXQ9bHVjaWQKLWNvbXBsZXhmdW5jNl9fRlBGUGlfUEZsX2kKLWNvbXBsZXhmdW5jNihpbnQgKCooKikoaW50ICopKShsb25nKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGV4ZnVuYzdfX0ZQRlBGUGNfaV9QRmxfaQotY29tcGxleGZ1bmM3KGludCAoKigqKShpbnQgKCopKGNoYXIgKikpKShsb25nKSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb21wbGljYXRlZF9wdXRfXzdvc3RyZWFtRmMKLW9zdHJlYW06OmNvbXBsaWNhdGVkX3B1dChjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLWNvbnYxMF9fRmxQYwotY29udjEwKGxvbmcsIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1jb252MTZfX0ZVbFBjCi1jb252MTYodW5zaWduZWQgbG9uZywgY2hhciAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLWRlY19fRlIzaW9zCi1kZWMoaW9zICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotZGVjX19GbGkKLWRlYyhsb25nLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotZG9maWVsZF9fRlA3b3N0cmVhbVBjaVQyVDMKLWRvZmllbGQob3N0cmVhbSAqLCBjaGFyICosIGludCwgY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotZmxhZ3NfXzNpb3NGbAotaW9zOjpmbGFncyhsb25nKQotIwotLS1mb3JtYXQ9bHVjaWQKLWZsYWdzX18zaW9zRnYKLWlvczo6ZmxhZ3Modm9pZCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1mb29fX0ZpTjMxCi1mb28oaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLWZvb19fRmlSM2Zvb1QxVDJUMVQyCi1mb28oaW50LCBmb28gJiwgaW50LCBmb28gJiwgaW50LCBmb28gJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1mb29fX18zYmFyRmwKLWJhcjo6Zm9vXyhsb25nKQotIwotLS1mb3JtYXQ9bHVjaWQKLWdldF9fN2lzdHJlYW1GUGNpYwotaXN0cmVhbTo6Z2V0KGNoYXIgKiwgaW50LCBjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLWdldF9fN2lzdHJlYW1GUjlzdHJlYW1idWZjCi1pc3RyZWFtOjpnZXQoc3RyZWFtYnVmICYsIGNoYXIpCi0jCi0tLWZvcm1hdD1sdWNpZAotZ2V0X2NvbXBsaWNhdGVkX183aXN0cmVhbUZSVWMKLWlzdHJlYW06OmdldF9jb21wbGljYXRlZCh1bnNpZ25lZCBjaGFyICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotZ2V0X2NvbXBsaWNhdGVkX183aXN0cmVhbUZSYwotaXN0cmVhbTo6Z2V0X2NvbXBsaWNhdGVkKGNoYXIgJikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1nZXRsaW5lX183aXN0cmVhbUZQVWNpYwotaXN0cmVhbTo6Z2V0bGluZSh1bnNpZ25lZCBjaGFyICosIGludCwgY2hhcikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1nZXRsaW5lX183aXN0cmVhbUZQY2ljCi1pc3RyZWFtOjpnZXRsaW5lKGNoYXIgKiwgaW50LCBjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLWlnbm9yZV9fN2lzdHJlYW1GaVQxCi1pc3RyZWFtOjppZ25vcmUoaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotaW5pdF9fMTJzdHJzdHJlYW1idWZGUGNpVDEKLXN0cnN0cmVhbWJ1Zjo6aW5pdChjaGFyICosIGludCwgY2hhciAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLWluaXRfXzNpb3NGUDlzdHJlYW1idWYKLWlvczo6aW5pdChzdHJlYW1idWYgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1pbml0Y291bnRfXzEzSW9zdHJlYW1faW5pdAotSW9zdHJlYW1faW5pdDo6aW5pdGNvdW50Ci0jCi0tLWZvcm1hdD1sdWNpZAotaXBmeF9fN2lzdHJlYW1GaQotaXN0cmVhbTo6aXBmeChpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotbHNfY29tcGxpY2F0ZWRfXzdvc3RyZWFtRlVjCi1vc3RyZWFtOjpsc19jb21wbGljYXRlZCh1bnNpZ25lZCBjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLWxzX2NvbXBsaWNhdGVkX183b3N0cmVhbUZjCi1vc3RyZWFtOjpsc19jb21wbGljYXRlZChjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRlNjCi1vdmVybG9hZDFhcmcoc2lnbmVkIGNoYXIpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWQxYXJnX19GVWMKLW92ZXJsb2FkMWFyZyh1bnNpZ25lZCBjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRlVpCi1vdmVybG9hZDFhcmcodW5zaWduZWQgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRlVsCi1vdmVybG9hZDFhcmcodW5zaWduZWQgbG9uZykKLSMKLS0tZm9ybWF0PWx1Y2lkCi1vdmVybG9hZDFhcmdfX0ZVcwotb3ZlcmxvYWQxYXJnKHVuc2lnbmVkIHNob3J0KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRmMKLW92ZXJsb2FkMWFyZyhjaGFyKQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRmQKLW92ZXJsb2FkMWFyZyhkb3VibGUpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWQxYXJnX19GZgotb3ZlcmxvYWQxYXJnKGZsb2F0KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRmkKLW92ZXJsb2FkMWFyZyhpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWQxYXJnX19GbAotb3ZlcmxvYWQxYXJnKGxvbmcpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWQxYXJnX19Gcwotb3ZlcmxvYWQxYXJnKHNob3J0KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkMWFyZ19fRnYKLW92ZXJsb2FkMWFyZyh2b2lkKQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlOMjEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlOMzEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWRhcmdzX19GaU40MQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlONTEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlONjEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWRhcmdzX19GaU43MQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlOODEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlOOTEKLW92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotb3ZlcmxvYWRhcmdzX19GaU45MU4xMQotb3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLW92ZXJsb2FkYXJnc19fRmlUMQotb3ZlcmxvYWRhcmdzKGludCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLXBvbGFyX19GZFQxCi1wb2xhcihkb3VibGUsIGRvdWJsZSkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1wb3dfX0Y3Y29tcGxleFQxCi1wb3coY29tcGxleCwgY29tcGxleCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1wb3dfX0Y3Y29tcGxleGQKLXBvdyhjb21wbGV4LCBkb3VibGUpCi0jCi0tLWZvcm1hdD1sdWNpZAotcG93X19GN2NvbXBsZXhpCi1wb3coY29tcGxleCwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLXBvd19fRmQ3Y29tcGxleAotcG93KGRvdWJsZSwgY29tcGxleCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1wc3RhcnRfX0ZQY2lUMgotcHN0YXJ0KGNoYXIgKiwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotcHV0X183b3N0cmVhbUZjCi1vc3RyZWFtOjpwdXQoY2hhcikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1yZWFkX183aXN0cmVhbUZQY2kKLWlzdHJlYW06OnJlYWQoY2hhciAqLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotcmVzZXRpb3NmbGFnc19fRlIzaW9zbAotcmVzZXRpb3NmbGFncyhpb3MgJiwgbG9uZykKLSMKLS0tZm9ybWF0PWx1Y2lkCi1yZXN0b3JlX2Vycm5vX19GUmkKLXJlc3RvcmVfZXJybm8oaW50ICYpCi0jCi0tLWZvcm1hdD1sdWNpZAotcnNfY29tcGxpY2F0ZWRfXzdpc3RyZWFtRlJVYwotaXN0cmVhbTo6cnNfY29tcGxpY2F0ZWQodW5zaWduZWQgY2hhciAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLXJzX2NvbXBsaWNhdGVkX183aXN0cmVhbUZSYwotaXN0cmVhbTo6cnNfY29tcGxpY2F0ZWQoY2hhciAmKQotIwotLS1mb3JtYXQ9bHVjaWQKLXNlZWtnX183aXN0cmVhbUZsOHNlZWtfZGlyCi1pc3RyZWFtOjpzZWVrZyhsb25nLCBzZWVrX2RpcikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZWVrb2ZmX18xMnN0cnN0cmVhbWJ1ZkZsOHNlZWtfZGlyaQotc3Ryc3RyZWFtYnVmOjpzZWVrb2ZmKGxvbmcsIHNlZWtfZGlyLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotc2Vla29mZl9fOXN0cmVhbWJ1ZkZsUTJfM2lvczEyaW9zX3NlZWtfZGlyaQotc3RyZWFtYnVmOjpzZWVrb2ZmKGxvbmcsIGlvczo6aW9zX3NlZWtfZGlyLCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotc2Vla3Bvc19fOXN0cmVhbWJ1ZkZsaQotc3RyZWFtYnVmOjpzZWVrcG9zKGxvbmcsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRfbmV3X2hhbmRsZXJfX0ZQRnZfdgotc2V0X25ld19oYW5kbGVyKHZvaWQgKCopKHZvaWQpKQotIwotLS1mb3JtYXQ9bHVjaWQKLXNldGJfXzlzdHJlYW1idWZGUGNUMWkKLXN0cmVhbWJ1Zjo6c2V0YihjaGFyICosIGNoYXIgKiwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLXNldGJfX0ZSM2lvc2kKLXNldGIoaW9zICYsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRidWZfXzExZnN0cmVhbWJhc2VGUGNpCi1mc3RyZWFtYmFzZTo6c2V0YnVmKGNoYXIgKiwgaW50KQotIwotLS1mb3JtYXQ9bHVjaWQKLXNldGJ1Zl9fOXN0cmVhbWJ1ZkZQVWNpCi1zdHJlYW1idWY6OnNldGJ1Zih1bnNpZ25lZCBjaGFyICosIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRidWZfXzlzdHJlYW1idWZGUGNpVDIKLXN0cmVhbWJ1Zjo6c2V0YnVmKGNoYXIgKiwgaW50LCBpbnQpCi0jCi0tLWZvcm1hdD1sdWNpZAotc2V0Zl9fM2lvc0ZsVDEKLWlvczo6c2V0Zihsb25nLCBsb25nKQotIwotLS1mb3JtYXQ9bHVjaWQKLXNldGZpbGxfX0ZSM2lvc2kKLXNldGZpbGwoaW9zICYsIGludCkKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRnX185c3RyZWFtYnVmRlBjTjIxCi1zdHJlYW1idWY6OnNldGcoY2hhciAqLCBjaGFyICosIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi1zZXRwX185c3RyZWFtYnVmRlBjVDEKLXN0cmVhbWJ1Zjo6c2V0cChjaGFyICosIGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi10aWVfXzNpb3NGUDdvc3RyZWFtCi1pb3M6OnRpZShvc3RyZWFtICopCi0jCi0tLWZvcm1hdD1sdWNpZAotdWNvbnYxMF9fRlVsUGMKLXVjb252MTAodW5zaWduZWQgbG9uZywgY2hhciAqKQotIwotLS1mb3JtYXQ9bHVjaWQKLXhnZXRfXzdpc3RyZWFtRlBjCi1pc3RyZWFtOjp4Z2V0KGNoYXIgKikKLSMKLS0tZm9ybWF0PWx1Y2lkCi14c2dldG5fXzlzdHJlYW1idWZGUGNpCi1zdHJlYW1idWY6OnhzZ2V0bihjaGFyICosIGludCkKLSMKLS0tZm9ybWF0PWFybQotX19kdF9fMjFUNV9fcHRfXzExX1BGaVBQZFB2X2lGdgotVDU8aW50ICgqKShpbnQsIGRvdWJsZSAqKiwgdm9pZCAqKT46On5UNSh2b2lkKQotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xY0ZpCi1jOjpjKGludCkKLSMKLS0tZm9ybWF0PWFybQotX19kdF9fMTFUNV9fcHRfXzJfaUZ2Ci1UNTxpbnQ+Ojp+VDUodm9pZCkKLSMKLS0tZm9ybWF0PWFybQotX19kdF9fMTFUNV9fcHRfXzJfY0Z2Ci1UNTxjaGFyPjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzJUMkZpCi1UMjo6VDIoaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2R0X18yVDFGdgotVDE6On5UMSh2b2lkKQotIwotLS1mb3JtYXQ9YXJtCi1fX2R0X18xMlQ1X19wdF9fM18xeEZ2Ci1UNTx4Pjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fZHRfXzE3VDVfX3B0X184X1BGY1B2X2lGdgotVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzIxVDVfX3B0X18xMV9QRmlQUGRQdl9pRmkKLVQ1PGludCAoKikoaW50LCBkb3VibGUgKiosIHZvaWQgKik+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fYW1kX19GUjJUMmkKLW9wZXJhdG9yJT0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2Fkdl9fRlIyVDJpCi1vcGVyYXRvci89KFQyICYsIGludCkKLSMKLS0tZm9ybWF0PWFybQotX19hbXVfX0ZSMlQyaQotb3BlcmF0b3IqPShUMiAmLCBpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fYW1pX19GUjJUMmkKLW9wZXJhdG9yLT0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2FwbF9fRlIyVDJpCi1vcGVyYXRvcis9KFQyICYsIGludCkKLSMKLS0tZm9ybWF0PWFybQotX19ud19fMlQxU0ZVaQotVDE6Om9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1fX2RsX18yVDFTRlB2Ci1UMTo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLXB1dF9fMlQ3U0ZpCi1UNzo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLV9fZGxfXzEyVDVfX3B0X18zXzF4U0ZQdgotVDU8eD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1oX19GVWMKLWgodW5zaWduZWQgY2hhcikKLSMKLS0tZm9ybWF0PWFybQotZl9fRmljCi1mKGludCwgY2hhcikKLSMKLS0tZm9ybWF0PWFybQotaF9fRlVpCi1oKHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWFybQotaF9fRmNpCi1oKGNoYXIsIGludCkKLSMKLS0tZm9ybWF0PWFybQotaF9fRlVsCi1oKHVuc2lnbmVkIGxvbmcpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZjbAotaChjaGFyLCBsb25nKQotIwotLS1mb3JtYXQ9YXJtCi1oX19GVXMKLWgodW5zaWduZWQgc2hvcnQpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZjcwotaChjaGFyLCBzaG9ydCkKLSMKLS0tZm9ybWF0PWFybQotWF9fMTJUNV9fcHRfXzNfMXgKLVQ1PHg+OjpYCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzExVDVfX3B0X18yX2lGaQotVDU8aW50Pjo6VDUoaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xMVQ1X19wdF9fMl9jRmkKLVQ1PGNoYXI+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZjVDEKLWgoY2hhciwgY2hhcikKLSMKLS0tZm9ybWF0PWFybQotZl9fRmljZAotZihpbnQsIGNoYXIsIGRvdWJsZSkKLSMKLS0tZm9ybWF0PWFybQotX19kbF9fMTdUNV9fcHRfXzhfUEZjUHZfaVNGUHYKLVQ1PGludCAoKikoY2hhciwgdm9pZCAqKT46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1YX18xN1Q1X19wdF9fOF9QRmNQdl9pCi1UNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+OjpYCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzEyVDVfX3B0X18zXzF4RmkKLVQ1PHg+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fZGxfXzIxVDVfX3B0X18xMV9QRmlQUGRQdl9pU0ZQdgotVDU8aW50ICgqKShpbnQsIGRvdWJsZSAqKiwgdm9pZCAqKT46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1fX3N0ZF9fZm9vCi1nbG9iYWwgZGVzdHJ1Y3RvcnMga2V5ZWQgdG8gZm9vCi0jCi0tLWZvcm1hdD1hcm0KLV9fc3RpX19iYXIKLWdsb2JhbCBjb25zdHJ1Y3RvcnMga2V5ZWQgdG8gYmFyCi0jCi0tLWZvcm1hdD1hcm0KLWZfX0ZpY2RQY1BGY2lfdgotZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShjaGFyLCBpbnQpKQotIwotLS1mb3JtYXQ9YXJtCi1mX19GaWNkUGNQRmljX3YKLWYoaW50LCBjaGFyLCBkb3VibGUsIGNoYXIgKiwgdm9pZCAoKikoaW50LCBjaGFyKSkKLSMKLS0tZm9ybWF0PWFybQotZ2V0X18yVDdTRnYKLVQ3OjpnZXQodm9pZCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLVhfXzIxVDVfX3B0X18xMV9QRmlQUGRQdl9pCi1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6WAotIwotLS1mb3JtYXQ9YXJtCi1fX2RsX18xMVQ1X19wdF9fMl9pU0ZQdgotVDU8aW50Pjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLV9fZGxfXzExVDVfX3B0X18yX2NTRlB2Ci1UNTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZjCi1oKGNoYXIpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZkCi1oKGRvdWJsZSkKLSMKLS0tZm9ybWF0PWFybQotaF9fRmYKLWgoZmxvYXQpCi0jCi0tLWZvcm1hdD1hcm0KLWhfX0ZpCi1oKGludCkKLSMKLS0tZm9ybWF0PWFybQotZl9fRmkKLWYoaW50KQotIwotLS1mb3JtYXQ9YXJtCi1oX19GbAotaChsb25nKQotIwotLS1mb3JtYXQ9YXJtCi1oX19GcwotaChzaG9ydCkKLSMKLS0tZm9ybWF0PWFybQotWF9fMTFUNV9fcHRfXzJfYwotVDU8Y2hhcj46OlgKLSMKLS0tZm9ybWF0PWFybQotWF9fMTFUNV9fcHRfXzJfaQotVDU8aW50Pjo6WAotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xN1Q1X19wdF9fOF9QRmNQdl9pRmkKLVQ1PGludCAoKikoY2hhciwgdm9pZCAqKT46OlQ1KGludCkKLSMKLS0tZm9ybWF0PWFybQotZl9fRmljZFBjCi1mKGludCwgY2hhciwgZG91YmxlLCBjaGFyICopCi0jCi0tLWZvcm1hdD1hcm0KLV9fbndfX0ZVaQotb3BlcmF0b3IgbmV3KHVuc2lnbmVkIGludCkKLSMKLS0tZm9ybWF0PWFybQotX19jdF9fUTNfMlQxMWExYlNGaQotVDE6OmE6OmI6OmIoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWFybQotX19kdF9fUTNfMlQxMWExYlNGaQotVDE6OmE6OmI6On5iKGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLXB1dF9fUTNfMlQxMWExYlNGaQotVDE6OmE6OmI6OnB1dChpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1nZXRfX1EyXzJUMTFhU0Z2Ci1UMTo6YTo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1wdXRfXzJUMVNGaQotVDE6OnB1dChpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1wdXRfX1E1XzJUMTFhMWIxYzFkU0ZpCi1UMTo6YTo6Yjo6Yzo6ZDo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLWdldF9fUTRfMlQxMWExYjFjU0Z2Ci1UMTo6YTo6Yjo6Yzo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1wdXRfX1EyXzJUMTFhU0ZpCi1UMTo6YTo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLXB1dF9fUTRfMlQxMWExYjFjU0ZpCi1UMTo6YTo6Yjo6Yzo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLWdldF9fUTNfMlQxMWExYlNGdgotVDE6OmE6OmI6OmdldCh2b2lkKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWFybQotZ2V0X18yVDFTRnYKLVQxOjpnZXQodm9pZCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLWdldF9fUTVfMlQxMWExYjFjMWRTRnYKLVQxOjphOjpiOjpjOjpkOjpnZXQodm9pZCkgc3RhdGljCi0jCi0tLWZvcm1hdD1hcm0KLV9fZHRfXzExVDFfX3B0X18yX2NGdgotVDE8Y2hhcj46On5UMSh2b2lkKQotIwotLS1mb3JtYXQ9YXJtCi1fX2R0X18xMlQxX19wdF9fM18xdEZ2Ci1UMTx0Pjo6flQxKHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fZGxfXzEyVDFfX3B0X18zXzF0U0ZQdgotVDE8dD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xMVQxX19wdF9fMl9jRmkKLVQxPGNoYXI+OjpUMShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzExVDFfX3B0X18yX2NGdgotVDE8Y2hhcj46OlQxKHZvaWQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzEyVDFfX3B0X18zXzF0RmkKLVQxPHQ+OjpUMShpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzEyVDFfX3B0X18zXzF0RnYKLVQxPHQ+OjpUMSh2b2lkKQotIwotLS1mb3JtYXQ9YXJtCi1fX2RsX18xMVQxX19wdF9fMl9jU0ZQdgotVDE8Y2hhcj46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYwotIwotLS1mb3JtYXQ9YXJtCi1iYXJfXzNmb29GUHYKLWZvbzo6YmFyKHZvaWQgKikKLSMKLS0tZm9ybWF0PWFybQotYmFyX18zZm9vQ0ZQdgotZm9vOjpiYXIodm9pZCAqKSBjb25zdAotIwotLS1mb3JtYXQ9YXJtCi1fX2VxX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPT0oZm9vICYpCi0jCi0tLWZvcm1hdD1hcm0KLV9fZXFfXzNmb29DRlIzZm9vCi1mb286Om9wZXJhdG9yPT0oZm9vICYpIGNvbnN0Ci0jCi0tLWZvcm1hdD1hcm0KLWVsZW1fXzE1dmVjdG9yX19wdF9fMl9kRmkKLXZlY3Rvcjxkb3VibGU+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWFybQotZWxlbV9fMTV2ZWN0b3JfX3B0X18yX2lGaQotdmVjdG9yPGludD46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9YXJtCi1fX2N0X18xNXZlY3Rvcl9fcHRfXzJfZEZpCi12ZWN0b3I8ZG91YmxlPjo6dmVjdG9yKGludCkKLSMKLS0tZm9ybWF0PWFybQotX19jdF9fMTV2ZWN0b3JfX3B0X18yX2lGaQotdmVjdG9yPGludD46OnZlY3RvcihpbnQpCi0jCi0tLWZvcm1hdD1hcm0KLV9fY3RfXzI1RExpc3ROb2RlX19wdF9fOV9SNlJMYWJlbEZSNlJMYWJlbFAyNURMaXN0Tm9kZV9fcHRfXzlfUjZSTGFiZWxUMgotRExpc3ROb2RlPFJMYWJlbCAmPjo6RExpc3ROb2RlKFJMYWJlbCAmLCBETGlzdE5vZGU8UkxhYmVsICY+ICosIERMaXN0Tm9kZTxSTGFiZWwgJj4gKikKLSMKLS0tZm9ybWF0PWFybQotYmFyX18zZm9vRmlUMTZGb29CYXIKLWZvbzo6YmFyKGludCwgaW50LCBGb29CYXIpCi0jCi0tLWZvcm1hdD1hcm0KLWJhcl9fM2Zvb0ZQaU41MVBkTjM3UGNOMjExVDFpTjIxNQotZm9vOjpiYXIoaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQsIGludCwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYW1kX19GUjJUMmkKLW9wZXJhdG9yJT0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYWR2X19GUjJUMmkKLW9wZXJhdG9yLz0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYW11X19GUjJUMmkKLW9wZXJhdG9yKj0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYW1pX19GUjJUMmkKLW9wZXJhdG9yLT0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fYXBsX19GUjJUMmkKLW9wZXJhdG9yKz0oVDIgJiwgaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fbndfXzJUMVNGVWkKLVQxOjpvcGVyYXRvciBuZXcodW5zaWduZWQgaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1fX2RsX18yVDFTRlB2Ci1UMTo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotcHV0X18yVDdTRmkKLVQ3OjpwdXQoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1oX19GVWMKLWgodW5zaWduZWQgY2hhcikKLSMKLS0tZm9ybWF0PWhwCi1mX19GaWMKLWYoaW50LCBjaGFyKQotIwotLS1mb3JtYXQ9aHAKLWhfX0ZVaQotaCh1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1ocAotaF9fRmNpCi1oKGNoYXIsIGludCkKLSMKLS0tZm9ybWF0PWhwCi1oX19GVWwKLWgodW5zaWduZWQgbG9uZykKLSMKLS0tZm9ybWF0PWhwCi1oX19GY2wKLWgoY2hhciwgbG9uZykKLSMKLS0tZm9ybWF0PWhwCi1oX19GVXMKLWgodW5zaWduZWQgc2hvcnQpCi0jCi0tLWZvcm1hdD1ocAotaF9fRmNzCi1oKGNoYXIsIHNob3J0KQotIwotLS1mb3JtYXQ9aHAKLWhfX0ZjVDEKLWgoY2hhciwgY2hhcikKLSMKLS0tZm9ybWF0PWhwCi1mX19GaWNkCi1mKGludCwgY2hhciwgZG91YmxlKQotIwotLS1mb3JtYXQ9aHAKLWZfX0ZpY2RQY1BGY2lfdgotZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShjaGFyLCBpbnQpKQotIwotLS1mb3JtYXQ9aHAKLWZfX0ZpY2RQY1BGaWNfdgotZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShpbnQsIGNoYXIpKQotIwotLS1mb3JtYXQ9aHAKLWdldF9fMlQ3U0Z2Ci1UNzo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLWhfX0ZjCi1oKGNoYXIpCi0jCi0tLWZvcm1hdD1ocAotaF9fRmQKLWgoZG91YmxlKQotIwotLS1mb3JtYXQ9aHAKLWhfX0ZmCi1oKGZsb2F0KQotIwotLS1mb3JtYXQ9aHAKLWhfX0ZpCi1oKGludCkKLSMKLS0tZm9ybWF0PWhwCi1mX19GaQotZihpbnQpCi0jCi0tLWZvcm1hdD1ocAotaF9fRmwKLWgobG9uZykKLSMKLS0tZm9ybWF0PWhwCi1oX19GcwotaChzaG9ydCkKLSMKLS0tZm9ybWF0PWhwCi1mX19GaWNkUGMKLWYoaW50LCBjaGFyLCBkb3VibGUsIGNoYXIgKikKLSMKLS0tZm9ybWF0PWhwCi1fX253X19GVWkKLW9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fUTNfMlQxMWExYlNGaQotVDE6OmE6OmI6OmIoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1fX2R0X19RM18yVDExYTFiU0ZpCi1UMTo6YTo6Yjo6fmIoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1wdXRfX1EzXzJUMTFhMWJTRmkKLVQxOjphOjpiOjpwdXQoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1nZXRfX1EyXzJUMTFhU0Z2Ci1UMTo6YTo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLXB1dF9fMlQxU0ZpCi1UMTo6cHV0KGludCkgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotcHV0X19RNV8yVDExYTFiMWMxZFNGaQotVDE6OmE6OmI6OmM6OmQ6OnB1dChpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLWdldF9fUTRfMlQxMWExYjFjU0Z2Ci1UMTo6YTo6Yjo6Yzo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLXB1dF9fUTJfMlQxMWFTRmkKLVQxOjphOjpwdXQoaW50KSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1wdXRfX1E0XzJUMTFhMWIxY1NGaQotVDE6OmE6OmI6OmM6OnB1dChpbnQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLWdldF9fUTNfMlQxMWExYlNGdgotVDE6OmE6OmI6OmdldCh2b2lkKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1nZXRfXzJUMVNGdgotVDE6OmdldCh2b2lkKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1nZXRfX1E1XzJUMTFhMWIxYzFkU0Z2Ci1UMTo6YTo6Yjo6Yzo6ZDo6Z2V0KHZvaWQpIHN0YXRpYwotIwotLS1mb3JtYXQ9aHAKLWJhcl9fM2Zvb0ZQdgotZm9vOjpiYXIodm9pZCAqKQotIwotLS1mb3JtYXQ9aHAKLWJhcl9fM2Zvb0NGUHYKLWZvbzo6YmFyKHZvaWQgKikgY29uc3QKLSMKLS0tZm9ybWF0PWhwCi1fX2VxX18zZm9vRlIzZm9vCi1mb286Om9wZXJhdG9yPT0oZm9vICYpCi0jCi0tLWZvcm1hdD1ocAotX19lcV9fM2Zvb0NGUjNmb28KLWZvbzo6b3BlcmF0b3I9PShmb28gJikgY29uc3QKLSMKLS0tZm9ybWF0PWhwCi1iYXJfXzNmb29GaVQxNkZvb0JhcgotZm9vOjpiYXIoaW50LCBpbnQsIEZvb0JhcikKLSMKLS0tZm9ybWF0PWhwCi1iYXJfXzNmb29GUGlONTFQZE4zN1BjTjIxMVQxaU4yMTUKLWZvbzo6YmFyKGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsIGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2R0X18yVDVYVFBGaVBQZFB2X2lfX0Z2Ci1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMWNGaQotYzo6YyhpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19kdF9fMlQ1WFRpX19GdgotVDU8aW50Pjo6flQ1KHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19kdF9fMlQ1WFRjX19GdgotVDU8Y2hhcj46On5UNSh2b2lkKQotIwotLS1mb3JtYXQ9aHAKLV9fY3RfXzJUMkZpCi1UMjo6VDIoaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fZHRfXzJUMUZ2Ci1UMTo6flQxKHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19kdF9fMlQ1WFQxeF9fRnYKLVQ1PHg+Ojp+VDUodm9pZCkKLSMKLS0tZm9ybWF0PWhwCi1fX2R0X18yVDVYVFBGY1B2X2lfX0Z2Ci1UNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+Ojp+VDUodm9pZCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDVYVFBGaVBQZFB2X2lfX0ZpCi1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6VDUoaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fZGxfXzJUNVhUMXhfX1NGUHYKLVQ1PHg+OjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMKLSMKLS0tZm9ybWF0PWhwCi1YX18yVDVYVDF4Ci1UNTx4Pjo6WAotIwotLS1mb3JtYXQ9aHAKLV9fY3RfXzJUNVhUaV9fRmkKLVQ1PGludD46OlQ1KGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDVYVGNfX0ZpCi1UNTxjaGFyPjo6VDUoaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fZGxfXzJUNVhUUEZjUHZfaV9fU0ZQdgotVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotWF9fMlQ1WFRQRmNQdl9pCi1UNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+OjpYCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMlQ1WFQxeF9fRmkKLVQ1PHg+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19kbF9fMlQ1WFRQRmlQUGRQdl9pX19TRlB2Ci1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotWF9fMlQ1WFRQRmlQUGRQdl9pCi1UNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6WAotIwotLS1mb3JtYXQ9aHAKLV9fZGxfXzJUNVhUaV9fU0ZQdgotVDU8aW50Pjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotX19kbF9fMlQ1WFRjX19TRlB2Ci1UNTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotWF9fMlQ1WFRjCi1UNTxjaGFyPjo6WAotIwotLS1mb3JtYXQ9aHAKLVhfXzJUNVhUaQotVDU8aW50Pjo6WAotIwotLS1mb3JtYXQ9aHAKLV9fY3RfXzJUNVhUUEZjUHZfaV9fRmkKLVQ1PGludCAoKikoY2hhciwgdm9pZCAqKT46OlQ1KGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2R0X18yVDFYVGNfX0Z2Ci1UMTxjaGFyPjo6flQxKHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19kdF9fMlQxWFQxdF9fRnYKLVQxPHQ+Ojp+VDEodm9pZCkKLSMKLS0tZm9ybWF0PWhwCi1fX2RsX18yVDFYVDF0X19TRlB2Ci1UMTx0Pjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMlQxWFRjX19GaQotVDE8Y2hhcj46OlQxKGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDFYVGNfX0Z2Ci1UMTxjaGFyPjo6VDEodm9pZCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDFYVDF0X19GaQotVDE8dD46OlQxKGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X18yVDFYVDF0X19GdgotVDE8dD46OlQxKHZvaWQpCi0jCi0tLWZvcm1hdD1ocAotX19kbF9fMlQxWFRjX19TRlB2Ci1UMTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljCi0jCi0tLWZvcm1hdD1ocAotZWxlbV9fNnZlY3RvclhUZF9fRmkKLXZlY3Rvcjxkb3VibGU+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpX19GaQotdmVjdG9yPGludD46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9aHAKLV9fY3RfXzZ2ZWN0b3JYVGRfX0ZpCi12ZWN0b3I8ZG91YmxlPjo6dmVjdG9yKGludCkKLSMKLS0tZm9ybWF0PWhwCi1fX2N0X182dmVjdG9yWFRpX19GaQotdmVjdG9yPGludD46OnZlY3RvcihpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fOURMaXN0Tm9kZVhUUjZSTGFiZWxfX0ZSNlJMYWJlbFA5RExpc3ROb2RlWFRSNlJMYWJlbF9UMgotRExpc3ROb2RlPFJMYWJlbCAmPjo6RExpc3ROb2RlKFJMYWJlbCAmLCBETGlzdE5vZGU8UkxhYmVsICY+ICosIERMaXN0Tm9kZTxSTGFiZWwgJj4gKikKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpVVAzNF9fRmkKLXZlY3RvcjxpbnQsMzRVPjo6ZWxlbShpbnQpCi0jCi0tLWZvcm1hdD1ocAotZWxlbV9fNnZlY3RvclhVUDI3MDFUZF9fRmkKLXZlY3RvcjwyNzAxVSxkb3VibGU+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpU1AzMzRfX0ZpCi12ZWN0b3I8aW50LDMzND46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9aHAKLWVsZW1fXzZ2ZWN0b3JYVGlTTjY3X19GaQotdmVjdG9yPGludCwtNjc+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpU01fX1NDRlBQZAotdmVjdG9yPGludCwtMjE0NzQ4MzY0OD46OmVsZW0oZG91YmxlICoqKSBzdGF0aWMgY29uc3QKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpU042N1VQNDAwMFRSc19fRmkKLXZlY3RvcjxpbnQsLTY3LDQwMDBVLHNob3J0ICY+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpU042N1RSZFRGUHZfaV9fRmkKLXZlY3RvcjxpbnQsLTY3LGRvdWJsZSAmLGludCAodm9pZCAqKT46OmVsZW0oaW50KQotIwotLS1mb3JtYXQ9aHAKLVhfXzZ2ZWN0b3JYVGlTTjY3VGRUUHZVUDVUUnMKLXZlY3RvcjxpbnQsLTY3LGRvdWJsZSx2b2lkICosNVUsc2hvcnQgJj46OlgKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpQTNmb29fX0ZpCi12ZWN0b3I8aW50LCZmb28+OjplbGVtKGludCkKLSMKLS0tZm9ybWF0PWhwCi1lbGVtX182dmVjdG9yWFRpQTNmb29UUHZBNUxhYmVsX19GaVBQdlQyCi12ZWN0b3I8aW50LCZmb28sdm9pZCAqLCZMYWJlbD46OmVsZW0oaW50LCB2b2lkICoqLCB2b2lkICoqKQotIwotLS1mb3JtYXQ9aHAKLWVsZW1fXzZ2ZWN0b3JYVGlTTjQyQTNmb29fX0ZpCi12ZWN0b3I8aW50LC00MiwmZm9vPjo6ZWxlbShpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMlQ1WFRQRmNQdl9pX19GaV8yCi1UNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+OjpUNShpbnQpCi0jCi0tLWZvcm1hdD1ocAotX19jdF9fMlQ1WFRQRmNQdl9pX19GaV8xOQotVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6VDUoaW50KQotIwotLS1mb3JtYXQ9aHAKLWZfX0ZpY2RQY1BGY2lfdl8zNAotZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShjaGFyLCBpbnQpKQotIwotLS1mb3JtYXQ9aHAKLXNwZWNfXzEzU3BlYzwjMSwjMS4qPlhUaVRQaV9GUGkKLVNwZWM8aW50LGludCAqPjo6c3BlYyhpbnQgKikKLSMKLS0tZm9ybWF0PWhwCi1zcGVjX18xNlNwZWM8IzEsIzEuJiwjMT5YVGlUUmlUaV9GUGkKLVNwZWM8aW50LGludCAmLGludD46OnNwZWMoaW50ICopCi0jCi0tLWZvcm1hdD1ocAotYWRkX19YVGNfRmNUMQotYWRkPGNoYXI+KGNoYXIsIGNoYXIpCi0jCi0tLWZvcm1hdD1ocAotYWRkX19YVGNTUDlBNWxhYmVsX0ZjUFBsVDEKLWFkZDxjaGFyLDksJmxhYmVsPihjaGFyLCBsb25nICoqLCBjaGFyKQotIwotLS1mb3JtYXQ9aHAKLWFkZF9fWFRQZlRGUGRfZl9GY1QxCi1hZGQ8ZmxvYXQgKixmbG9hdCAoZG91YmxlICopPihjaGFyLCBjaGFyKQotIwotLS1mb3JtYXQ9aHAKLXVuTGlua19fMTJiYXNpY19zdHJpbmdYVGNUMThzdHJpbmdfY2hhcl90cmFpdHNYVGNfVDlhbGxvY2F0b3JfRnYKLWJhc2ljX3N0cmluZzxjaGFyLHN0cmluZ19jaGFyX3RyYWl0czxjaGFyPixhbGxvY2F0b3I+Ojp1bkxpbmsodm9pZCkKLSMKLSMgQSByZWdyZXNzaW9uIHRlc3Qgd2l0aCBubyBhcmdzLiAgVGhpcyB1c2VkIHRvIGNhdXNlIGEgc2Vndi4KLQotX1V0ZjM5MF8xX18xXzkyMjMzNzIwMzY4NTQ3NzU4MDdfXzkyMjMzNzIwMzY4NTQ3NzUKLV9VdGYzOTBfMV9fMV85MjIzMzcyMDM2ODU0Nzc1ODA3X185MjIzMzcyMDM2ODU0Nzc1Ci0jCi0tLWZvcm1hdD1nbnUKLWNhbGxfX0gxWjRUZXN0X1JYMDFfdDFDMlpYMDFQTVgwMUZQWDAxaV92UTJYMDE2b3V0cHV0Ci1DPFRlc3QsIFRlc3Q6Om91dHB1dD4gY2FsbDxUZXN0PihUZXN0ICYpCi0jCi0tLWZvcm1hdD1nbnUKLWZuX19GUFEyMW4xY1BNUTIxbjFjRlBRMjFuMWNfaQotZm4objo6YyAqLCBpbnQgKG46OmM6OiopKG46OmMgKikpCi0jCi0tLWZvcm1hdD1nbnUKLWZfX0ZHdDNCYXIxaTIxaQotZihCYXI8Mj4sIGkpCi0jCi0tLWZvcm1hdD1nbnUKLWZfX0ZHdDNCYXIxaV8yMV9pCi1mKEJhcjwyMT4sIGludCkKLSMKLS0tZm9ybWF0PWdudQotZl9fRkd0M0JhcjFpMjRYWV90Ci1mKEJhcjwyPiwgWFlfdCkKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS90ZXN0c3VpdGUvcmVncmVzcy1kZW1hbmdsZSBiL2xpYmliZXJ0eS90ZXN0c3VpdGUvcmVncmVzcy1kZW1hbmdsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQ0OGNlOS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdGVzdHN1aXRlL3JlZ3Jlc3MtZGVtYW5nbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgUnVuIGEgcmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgZGVtYW5nbGVyLgotIyBVc2FnZTogcmVncmVzcy1kZW1hbmdsZSBURVNULUZJTEUKLQotZmFpbHVyZXM9MAotY291bnQ9MAotc2VkIC1lICcvXiMvIGQnICIkMSIgfCAoCi0gIHdoaWxlIHJlYWQgdHlwZTsgZG8KLSAgICAgcmVhZCBtYW5nbGVkCi0gICAgIHJlYWQgZGVtYW5nbGVkCi0KLSAgICAgeD0iYGVjaG8gJG1hbmdsZWQgfCAuL3Rlc3QtZmlsdGVyICR0eXBlYCIKLSAgICAgY291bnQ9YGV4cHIgJGNvdW50ICsgMWAKLSAgICAgaWYgdGVzdCAieCR4IiAhPSAieCRkZW1hbmdsZWQiOyB0aGVuCi0JZmFpbHVyZXM9YGV4cHIgJGZhaWx1cmVzICsgMWAKLQllY2hvICJGQUlMOiAkdHlwZSAkbWFuZ2xlZCIKLSAgICAgZmkKLSAgZG9uZQotCi0gIGlmIHRlc3QgJGZhaWx1cmVzIC1lcSAwOyB0aGVuCi0gICAgIGVjaG8gIkFsbCAkY291bnQgdGVzdHMgcGFzc2VkIgotICBlbHNlCi0gICAgIGVjaG8gIiRmYWlsdXJlcyBvZiAkY291bnQgdGVzdHMgZmFpbGVkIgotICBmaQotCi0gIHRlc3QgJGZhaWx1cmVzIC1lcSAwCi0pCmRpZmYgLS1naXQgYS9saWJpYmVydHkvdG1wbmFtLmMgYi9saWJpYmVydHkvdG1wbmFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjc3ZTIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3RtcG5hbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZm5kZWYgTF90bXBuYW0KLSNkZWZpbmUgTF90bXBuYW0gMTAwCi0jZW5kaWYKLSNpZm5kZWYgUF90bXBkaXIKLSNkZWZpbmUgUF90bXBkaXIgIi91c3IvdG1wIgotI2VuZGlmCi0KLXN0YXRpYyBjaGFyIHRtcG5hbV9idWZmZXJbTF90bXBuYW1dOwotc3RhdGljIGludCB0bXBuYW1fY291bnRlcjsKLQotZXh0ZXJuIGludCBnZXRwaWQgKCk7Ci0KLWNoYXIgKgotdG1wbmFtIChzKQotICAgICBjaGFyICpzOwotewotICBpbnQgcGlkID0gZ2V0cGlkICgpOwotCi0gIGlmIChzID09IE5VTEwpCi0gICAgcyA9IHRtcG5hbV9idWZmZXI7Ci0KLSAgLyogIEdlbmVyYXRlIHRoZSBmaWxlbmFtZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXNuJ3Qgb25lIGNhbGxlZAotICAgICAgaXQgYWxyZWFkeS4gICovCi0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgRklMRSAqZjsKLSAgICAgIHNwcmludGYgKHMsICIlcy8lcyV4LiV4IiwgUF90bXBkaXIsICJ0IiwgcGlkLCB0bXBuYW1fY291bnRlcik7Ci0gICAgICBmID0gZm9wZW4gKHMsICJyIik7Ci0gICAgICBpZiAoZiA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgdG1wbmFtX2NvdW50ZXIrKzsKLSAgICAgIGZjbG9zZSAoZik7Ci0gICAgfQotCi0gIHJldHVybiBzOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Zhc3ByaW50Zi5jIGIvbGliaWJlcnR5L3Zhc3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU5ZjVmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92YXNwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKiBMaWtlIHZzcHJpbnRmIGJ1dCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gbWFsbG9jJ2Qgc3RvcmFnZSwgd2hpY2ggbXVzdAotICAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLSNpZmRlZiBURVNUCi1pbnQgZ2xvYmFsX3RvdGFsX3dpZHRoOwotI2VuZGlmCi0KLXVuc2lnbmVkIGxvbmcgc3RydG91bCAoKTsKLWNoYXIgKm1hbGxvYyAoKTsKLQotc3RhdGljIGludAotaW50X3Zhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsIGFyZ3MpCi0gICAgIGNoYXIgKipyZXN1bHQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfbGlzdCAqYXJnczsKLXsKLSAgY29uc3QgY2hhciAqcCA9IGZvcm1hdDsKLSAgLyogQWRkIG9uZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBuZXZlciB6ZXJvLCB3aGljaCBtaWdodCBjYXVzZSBtYWxsb2MKLSAgICAgdG8gcmV0dXJuIE5VTEwuICAqLwotICBpbnQgdG90YWxfd2lkdGggPSBzdHJsZW4gKGZvcm1hdCkgKyAxOwotICB2YV9saXN0IGFwOwotCi0gIG1lbWNweSAoKFBUUikgJmFwLCAoUFRSKSBhcmdzLCBzaXplb2YgKHZhX2xpc3QpKTsKLQotICB3aGlsZSAoKnAgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoKnArKyA9PSAnJScpCi0JewotCSAgd2hpbGUgKHN0cmNociAoIi0rICMwIiwgKnApKQotCSAgICArK3A7Ci0JICBpZiAoKnAgPT0gJyonKQotCSAgICB7Ci0JICAgICAgKytwOwotCSAgICAgIHRvdGFsX3dpZHRoICs9IGFicyAodmFfYXJnIChhcCwgaW50KSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgdG90YWxfd2lkdGggKz0gc3RydG91bCAocCwgJnAsIDEwKTsKLQkgIGlmICgqcCA9PSAnLicpCi0JICAgIHsKLQkgICAgICArK3A7Ci0JICAgICAgaWYgKCpwID09ICcqJykKLQkJewotCQkgICsrcDsKLQkJICB0b3RhbF93aWR0aCArPSBhYnMgKHZhX2FyZyAoYXAsIGludCkpOwotCQl9Ci0JICAgICAgZWxzZQotCSAgICAgIHRvdGFsX3dpZHRoICs9IHN0cnRvdWwgKHAsICZwLCAxMCk7Ci0JICAgIH0KLQkgIHdoaWxlIChzdHJjaHIgKCJobEwiLCAqcCkpCi0JICAgICsrcDsKLQkgIC8qIFNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciBhbnkgZm9ybWF0IHNwZWNpZmllciBleGNlcHQgJXMgYW5kIGZsb2F0cy4gICovCi0JICB0b3RhbF93aWR0aCArPSAzMDsKLQkgIHN3aXRjaCAoKnApCi0JICAgIHsKLQkgICAgY2FzZSAnZCc6Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdvJzoKLQkgICAgY2FzZSAndSc6Ci0JICAgIGNhc2UgJ3gnOgotCSAgICBjYXNlICdYJzoKLQkgICAgY2FzZSAnYyc6Ci0JICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGludCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICdlJzoKLQkgICAgY2FzZSAnRSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdHJzoKLQkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgZG91YmxlKTsKLQkgICAgICAvKiBTaW5jZSBhbiBpZWVlIGRvdWJsZSBjYW4gaGF2ZSBhbiBleHBvbmVudCBvZiAzMDcsIHdlJ2xsCi0JCSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gY292ZXIgdGhlIGdyb3NzIGNhc2UuICovCi0JICAgICAgdG90YWxfd2lkdGggKz0gMzA3OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdzJzoKLQkgICAgICB0b3RhbF93aWR0aCArPSBzdHJsZW4gKHZhX2FyZyAoYXAsIGNoYXIgKikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdwJzoKLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGNoYXIgKik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHArKzsKLQl9Ci0gICAgfQotI2lmZGVmIFRFU1QKLSAgZ2xvYmFsX3RvdGFsX3dpZHRoID0gdG90YWxfd2lkdGg7Ci0jZW5kaWYKLSAgKnJlc3VsdCA9IG1hbGxvYyAodG90YWxfd2lkdGgpOwotICBpZiAoKnJlc3VsdCAhPSBOVUxMKQotICAgIHJldHVybiB2c3ByaW50ZiAoKnJlc3VsdCwgZm9ybWF0LCAqYXJncyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci12YXNwcmludGYgKHJlc3VsdCwgZm9ybWF0LCBhcmdzKQotICAgICBjaGFyICoqcmVzdWx0OwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0jaWYgZGVmaW5lZCAoX0JTRF9WQV9MSVNUXykgJiYgZGVmaW5lZCAoX19GcmVlQlNEX18pCi0gICAgIF9CU0RfVkFfTElTVF8gYXJnczsKLSNlbHNlCi0gICAgIHZhX2xpc3QgYXJnczsKLSNlbmRpZgotewotICByZXR1cm4gaW50X3Zhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsICZhcmdzKTsKLX0KLQotI2lmZGVmIFRFU1QKLXZvaWQKLWNoZWNraXQKLSNpZmRlZiBfX1NURENfXwotICAgICAoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pCi0jZWxzZQotICAgICAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciAqcmVzdWx0OwotCi0jaWZkZWYgX19TVERDX18KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0jZWxzZQotICBjaGFyICpmb3JtYXQ7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotI2VuZGlmCi0gIHZhc3ByaW50ZiAoJnJlc3VsdCwgZm9ybWF0LCBhcmdzKTsKLSAgaWYgKHN0cmxlbiAocmVzdWx0KSA8IGdsb2JhbF90b3RhbF93aWR0aCkKLSAgICBwcmludGYgKCJQQVNTOiAiKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIkZBSUw6ICIpOwotICBwcmludGYgKCIlZCAlc1xuIiwgZ2xvYmFsX3RvdGFsX3dpZHRoLCByZXN1bHQpOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgY2hlY2tpdCAoIiVkIiwgMHgxMjM0NTY3OCk7Ci0gIGNoZWNraXQgKCIlMjAwZCIsIDUpOwotICBjaGVja2l0ICgiJS4zMDBkIiwgNik7Ci0gIGNoZWNraXQgKCIlMTAwLjE1MGQiLCA3KTsKLSAgY2hlY2tpdCAoIiVzIiwgImpqampqampqamlpaWlpaWlpaWlpaWlpaW9vb29vb29vb29vb29vb29vcHBwcHBwcHBwcHBwYWFcblwKLTc3Nzc3Nzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzM2NjY2NjY2NjY2NjYyMjIyMjIyMjIyMjc3Nzc3Nzc3Nzc3NzczMzMzMyIpOwotICBjaGVja2l0ICgiJWYlcyVkJXMiLCAxLjAsICJmb28iLCA3NywgImFzZGpmZmZmZmZmZmZmZmZmZmlpaWlpaWlpaWlpeHh4eHgiKTsKLX0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmZvcmsuYyBiL2xpYmliZXJ0eS92Zm9yay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmM0NTkxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92Zm9yay5jCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBFbXVsYXRlIHZmb3JrIHVzaW5nIGp1c3QgcGxhaW4gZm9yaywgZm9yIHN5c3RlbXMgd2l0aG91dCBhIHJlYWwgdmZvcmsuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi1pbnQKLXZmb3JrICgpCi17Ci0gIHJldHVybiAoZm9yayAoKSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmZwcmludGYuYyBiL2xpYmliZXJ0eS92ZnByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdiMmZmLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92ZnByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogUHJvdmlkZSBhIHZlcnNpb24gdmZwcmludGYgaW4gdGVybXMgb2YgX2RvcHJudC4KLSAgIEJ5IEthdmVoIEdoYXppICAoZ2hhemlAY2FpcC5ydXRnZXJzLmVkdSkgIDMvMjkvOTgKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAqLwotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSN1bmRlZiB2ZnByaW50ZgotCi1pbnQKLXZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXApCi0gIEZJTEUgKiBzdHJlYW07Ci0gIGNvbnN0IGNoYXIgKiBmb3JtYXQ7Ci0gIHZhX2xpc3QgYXA7Ci17Ci0gIHJldHVybiBfZG9wcm50IChmb3JtYXQsIGFwLCBzdHJlYW0pOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbSBiL2xpYmliZXJ0eS92bXNidWlsZC5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5N2VhODkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0kISBsaWJpYmVydHkvdm1zYnVpbGQuY29tIC0tIGJ1aWxkIGxpYmVydHkub2xiIGZvciBWTVMgaG9zdCwgVk1TIHRhcmdldAotJCEKLSQgQ0MJPSAiZ2NjIC9ub1ZlcmJvc2UvRGVidWcvSW5jbD0oW10sWy0uaW5jbHVkZV0pIgotJCBMSUJSCT0gImxpYnJhcnkgL09iaiIKLSQgTElOSwk9ICJsaW5rIgotJCBERUxFVEU9ICJkZWxldGUgL25vQ29uZmlybSIKLSQgU0VBUkNIPSAic2VhcmNoIC9FeGFjdCIKLSQgRUNITwk9ICJ3cml0ZSBzeXMkb3V0cHV0IgotJCBBQk9SVAk9ICJleGl0ICV4MDAyQyIKLSQhCi0kIExJQl9OQU1FID0gImxpYmVydHkub2xiIgkhdGhpcyBpcyB3aGF0IHdlJ3JlIGdvaW5nIHRvIGNvbnN0cnVjdAotJCBXT1JLX0xJQiA9ICJuZXctbGliLm9sYiIJIXVzZWQgdG8gZ3VhcmQgYWdhaW5zdCBhbiBpbmNvbXBsZXRlIGJ1aWxkCi0kCi0kISBtYW51YWxseSBjb3BpZWQgZnJvbSBNYWtlZmlsZS5pbgotJCBSRVFVSVJFRF9PRklMRVMgPSAiYXJndi5vIGJhc2VuYW1lLm8gY2hvb3NlLXRlbXAubyBjb25jYXQubyBjcGx1cy1kZW0ubyAiLQotCSsgImZkbWF0Y2gubyBmbm1hdGNoLm8gZ2V0b3B0Lm8gZ2V0b3B0MS5vIGdldHJ1bnRpbWUubyBoZXgubyAiLQotCSsgImZsb2F0Zm9ybWF0Lm8gb2JqYWxsb2MubyBvYnN0YWNrLm8gc3BhY2VzLm8gc3RyZXJyb3IubyBzdHJzaWduYWwubyAiLQotCSsgInhhdGV4aXQubyB4ZXhpdC5vIHhtYWxsb2MubyB4bWVtZHVwLm8geHN0cmR1cC5vIHhzdHJlcnJvci5vIgotJCEgYW55dGhpbmcgbm90IGNhdWdodCBieSBsaW5rK3NlYXJjaCBvZiBkdW1teS4qIHNob3VsZCBiZSBhZGRlZCBoZXJlCi0kIEVYVFJBX09GSUxFUyA9ICIiCi0kIQotJCEgbW92ZSB0byB0aGUgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoaXMgY29tbWFuZCBwcm9jZWR1cmUKLSQgb2xkX2RpciA9IGYkZW52aXJvbigiREVGQVVMVCIpCi0kIG5ld19kaXIgPSBmJHBhcnNlKCJfLl87IixmJGVudmlyb24oIlBST0NFRFVSRSIpKSAtICJfLl87IgotJCBzZXQgZGVmYXVsdCAnbmV3X2RpcicKLSQKLSQgRUNITyAiU3RhcnRpbmcgbGliaWJlcnR5IGJ1aWxkLi4uIgotJCBjcmVhdGUgY29uZmlnLmgKLS8qIGxpYmliZXJ0eSBjb25maWcuaCBmb3IgVk1TICovCi0jZGVmaW5lIE5FRURfc3lzX3NpZ2xpc3QKLSNkZWZpbmUgTkVFRF9zdHJzaWduYWwKLSNkZWZpbmUgTkVFRF9wc2lnbmFsCi0jZGVmaW5lIE5FRURfYmFzZW5hbWUKLSQgTElCUiAnV09SS19MSUInIC9DcmVhdGUKLSQKLSQhIGZpcnN0IHBhc3M6IGNvbXBpbGUgInJlcXVpcmVkIiBtb2R1bGVzCi0kIG9maWxlcyA9IFJFUVVJUkVEX09GSUxFUyArICIgIiArIEVYVFJBX09GSUxFUwotJCBwYXNzID0gMQotJCBnb3N1YiBkb19vZmlsZXMKLSQKLSQhIHNlY29uZCBwYXNzOiBwcm9jZXNzIGR1bW15LmMsIHVzaW5nIHRoZSBmaXJzdCBwYXNzJyByZXN1bHRzCi0kIEVDSE8gIiBub3cgY2hlY2tpbmcgcnVuLXRpbWUgbGlicmFyeSBmb3IgbWlzc2luZyBmdW5jdGlvbmFsaXR5IgotJCBpZiBmJHNlYXJjaCgiZHVtbXkub2JqIikubmVzLiIiIHRoZW4gIERFTEVURSBkdW1teS5vYmo7KgotJCBkZWZpbmUvbm9Mb2cgc3lzJGVycm9yIF9OTDoJIWNhbid0IHVzZSAvVXNlcl9Nb2RlIGhlcmUgZHVlIHRvIGdjYwotJCBkZWZpbmUvbm9Mb2cgc3lzJG91dHB1dCBfTkw6CSEgZHJpdmVyJ3MgdXNlIG9mIG11bHRpcGxlIGltYWdlIGFjdGl2YXRpb24KLSQgb24gZXJyb3IgdGhlbiBjb250aW51ZQotJCAnQ0MnIGR1bW15LmMKLSQgZGVhc3NpZ24gc3lzJGVycm9yICAgIXJlc3RvcmUsIG1vcmUgb3IgbGVzcwotJCBkZWFzc2lnbiBzeXMkb3V0cHV0Ci0kIGlmIGYkc2VhcmNoKCJkdW1teS5vYmoiKS5lcXMuIiIgdGhlbiAgZ290byBwYXNzMl9mYWlsdXJlMQotJCEgbGluayBkdW1teS5vYmosIGNhcHR1cmluZyBmdWxsIGxpbmtlciBmZWVkYmFjayBpbiBkdW1teS5tYXAKLSQgb2xkbXNnID0gZiRlbnZpcm9uKCJNRVNTQUdFIikKLSQgc2V0IG1lc3NhZ2UgL0ZhY2lsaXR5L1NldmVyaXR5L0lkZW50aWZpY2F0aW9uL1RleHQKLSQgZGVmaW5lL1VzZXIgc3lzJG91dHB1dCBfTkw6Ci0kIGRlZmluZS9Vc2VyIHN5cyRlcnJvciBfTkw6Ci0kIExJTksvTWFwPWR1bW15Lm1hcC9ub0V4ZSBkdW1teS5vYmosJ1dPUktfTElCJy9MaWJyLC0KLQlnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL0xpYnIsc3lzJGxpYnJhcnk6dmF4Y3J0bC5vbGIvTGlicgotJCBzZXQgbWVzc2FnZSAnb2xkbXNnJwotJCBpZiBmJHNlYXJjaCgiZHVtbXkubWFwIikuZXFzLiIiIHRoZW4gIGdvdG8gcGFzczJfZmFpbHVyZTIKLSQgREVMRVRFIGR1bW15Lm9iajsqCi0kIFNFQVJDSCBkdW1teS5tYXAgIiVMSU5LLUktVURGU1lNIiAvT3V0cHV0PWR1bW15Lmxpc3QKLSQgREVMRVRFIGR1bW15Lm1hcDsqCi0kIEVDSE8gIiBjaGVjayBjb21wbGV0ZWQiCi0kISB3ZSBub3cgaGF2ZSBhIGZpbGUgd2l0aCBvbmUgZW50cnkgcGVyIGxpbmUgb2YgdW5yZXNvbHZhYmxlIHN5bWJvbHMKLSQgb2ZpbGVzID0gIiIKLSQgaWYgZiR0cm5sbm0oIklGSUxFJCIpLm5lcy4iIiB0aGVuICBjbG9zZS9ub0xvZyBpZmlsZSQKLSQJb3Blbi9SZWFkIGlmaWxlJCBkdW1teS5saXN0Ci0kaWxvb3A6IHJlYWQvRW5kPWlkb25lIGlmaWxlJCBpbGluZQotJAlpbGluZSA9IGYkZWRpdChpbGluZSwiQ09NUFJFU1MsVFJJTSxMT1dFUkNBU0UiKQotJAlvZmlsZXMgPSBvZmlsZXMgKyAiICIgKyBmJGVsZW1lbnQoMSwiICIsaWxpbmUpICsgIi5vIgotJAlnb3RvIGlsb29wCi0kaWRvbmU6IGNsb3NlIGlmaWxlJAotJCBERUxFVEUgZHVtbXkubGlzdDsqCi0kIG9uIGVycm9yIHRoZW4gQUJPUlQKLSQKLSQhIHRoaXJkIHBhc3M6IGNvbXBpbGUgIm1pc3NpbmciIG1vZHVsZXMgY29sbGVjdGVkIGluIHBhc3MgMgotJCBwYXNzID0gMwotJCBnb3N1YiBkb19vZmlsZXMKLSQKLSQhIGZpbmlzaCB1cAotJCBMSUJSICdXT1JLX0xJQicgL0NvbXByZXNzIC9PdXRwdXQ9J0xJQl9OQU1FJwkhbmV3LWxpYi5vbGIgLT4gbGliZXJ0eS5vbGIKLSQgREVMRVRFICdXT1JLX0xJQic7KgotJAotJCEgYWxsIGRvbmUKLSQgRUNITyAiQ29tcGxldGVkIGxpYmliZXJ0eSBidWlsZC4iCi0kIHR5cGUgc3lzJGlucHV0OgotCi0gIFlvdSBtYW55IHdpc2ggdG8gZG8KLSAgJCBDT1BZIExJQkVSVFkuT0xCIEdOVV9DQzpbMDAwMDAwXQotICBzbyB0aGF0IHRoaXMgcnVuLXRpbWUgbGlicmFyeSByZXNpZGVzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGdjYydzCi0gIHN1cHBvcnQgbGlicmFyeS4gIFdoZW4gYnVpbGRpbmcgZ2FzLCBiZSBzdXJlIHRvIGxlYXZlIHRoZSBvcmlnaW5hbAotICBjb3B5IG9mIGxpYmVydHkub2xiIGhlcmUgc28gdGhhdCBnYXMncyBidWlsZCBwcm9jZWR1cmUgY2FuIGZpbmQgaXQuCi0KLSQgc2V0IGRlZmF1bHQgJ29sZF9kaXInCi0kIGV4aXQKLSQKLSQhCi0kISBjb21waWxlIGVhY2ggZWxlbWVudCBvZiB0aGUgc3BhY2UtZGVsaW1pdGVkIGxpc3QgJ29maWxlcycKLSQhCi0kZG9fb2ZpbGVzOgotJCBvZmlsZXMgPSBmJGVkaXQob2ZpbGVzLCJDT01QUkVTUyxUUklNIikKLSQgaSA9IDAKLSRvbG9vcDoKLSQgZiA9IGYkZWxlbWVudChpLCIgIixvZmlsZXMpCi0kIGlmIGYuZXFzLiIgIiB0aGVuICBnb3RvIG9kb25lCi0kIGYgPSBmIC0gIi5vIgkhc3RyaXAgZHVtbXkgc3VmZml4Ci0kIEVDSE8gIiAgJydmJyIKLSQgc2tpcF9mID0gMAotJCBpZiBwYXNzLmVxLjMgLmFuZC4gZiRzZWFyY2goIicnZicuYyIpLmVxcy4iIiB0aGVuICBnb3N1YiBjaGtfZGVmZnVuYwotJCBpZiAubm90LnNraXBfZgotJCB0aGVuCi0kICAgJ0NDJyAnZicuYwotJCAgIExJQlIgJ1dPUktfTElCJyAnZicub2JqIC9JbnNlcnQKLSQgICBERUxFVEUgJ2YnLm9iajsqCi0kIGVuZGlmCi0kIGkgPSBpICsgMQotJCBnb3RvIG9sb29wCi0kb2RvbmU6Ci0kIHJldHVybgotJAotJCEKLSQhIGNoZWNrIGZ1bmN0aW9ucy5kZWYgZm9yIGEgREVGRlVOQygpIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gbWlzc2luZyBmaWxlICdmJy5jCi0kIQotJGNoa19kZWZmdW5jOgotJCBkZWZpbmUvVXNlciBzeXMkb3V0cHV0IF9OTDoKLSQgZGVmaW5lL1VzZXIgc3lzJGVycm9yIF9OTDoKLSQgU0VBUkNIIGZ1bmN0aW9ucy5kZWYgIkRFRkZVTkMiLCInJ2YnIiAvTWF0Y2g9QU5ECi0kIGlmICgoJHN0YXR1cy5hbmQuJXg3RkZGRkZGRikgLmVxLiAxKQotJCB0aGVuCi0kICAgc2tpcF9mID0gMQotJCAgIG9wZW4vQXBwZW5kIGNvbmZpZ19oIGNvbmZpZy5oCi0kICAgd3JpdGUgY29uZmlnX2ggIiNkZWZpbmUgTkVFRF8nJ2YnIgotJCAgIGNsb3NlIGNvbmZpZ19oCi0kIGVuZGlmCi0kIHJldHVybgotJAotJCEKLSRwYXNzMl9mYWlsdXJlMToKLSQhIGlmIHdlIHJlYWNoIGhlcmUsIGR1bW15LmMgZmFpbGVkIHRvIGNvbXBpbGUgYW5kIHdlJ3JlIHJlYWxseSBzdHVjawotJCB0eXBlIHN5cyRpbnB1dDoKLQotICBDYW5ub3QgY29tcGlsZSB0aGUgbGlicmFyeSBjb250ZW50cyBjaGVja2VyIChkdW1teS5jICsgZnVuY3Rpb25zLmRlZiksCi0gIHNvIGNhbm5vdCBjb250aW51ZSEKLQotJCEgYXR0ZW1wdCB0aGUgY29tcGlsZSBhZ2Fpbiwgd2l0aG91dCBzdXBwcmVzc2luZyBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoaXMgdGltZQotJCBvbiBlcnJvciB0aGVuIEFCT1JUICswKmYkdmVyaWZ5KHYpCi0kIHYgPSBmJHZlcmlmeSgxKQotJCAnQ0MnIGR1bW15LmMKLSQgQUJPUlQgKzAqZiR2ZXJpZnkodikJISdmJHZlcmlmeSgwKScKLSQhCi0kcGFzczJfZmFpbHVyZTI6Ci0kISBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZS4uCi0kIHR5cGUgc3lzJGlucHV0OgotCi0gIENhbm5vdCBsaW5rIHRoZSBsaWJyYXJ5IGNvbnRlbnRzIGNoZWNrZXIgKGR1bW15Lm9iaiksIHNvIGNhbm5vdCBjb250aW51ZSEKLQotJCEgYXR0ZW1wdCB0aGUgbGluayBhZ2Fpbiwgd2l0aG91dCBzdXBwcmVzc2luZyBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoaXMgdGltZQotJCBvbiBlcnJvciB0aGVuIEFCT1JUICswKmYkdmVyaWZ5KHYpCi0kIHYgPSBmJHZlcmlmeSgxKQotJCBMSU5LL01hcD1kdW1teS5tYXAvbm9FeGUgZHVtbXkub2JqLCdXT1JLX0xJQicvTGliciwtCi0JZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9MaWJyLHN5cyRsaWJyYXJ5OnZheGNydGwub2xiL0xpYnIKLSQgQUJPUlQgKzAqZiR2ZXJpZnkodikJISdmJHZlcmlmeSgwKScKLSQKLSQhIG5vdCByZWFjaGVkCi0kIGV4aXQKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92cHJpbnRmLmMgYi9saWJpYmVydHkvdnByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWI0MjVhLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92cHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI3VuZGVmIHZwcmludGYKLWludAotdnByaW50ZiAoZm9ybWF0LCBhcCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9saXN0IGFwOwotewotICByZXR1cm4gdmZwcmludGYgKHN0ZG91dCwgZm9ybWF0LCBhcCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdnNwcmludGYuYyBiL2xpYmliZXJ0eS92c3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA3NjBjLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92c3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHZzcHJpbnRmIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQuCi0gICBIaWdobHkgc3lzdGVtLWRlcGVuZGVudCwgYnV0IHNob3VsZCB3b3JrIG9uIG1vc3QgInRyYWRpdGlvbmFsIgotICAgaW1wbGVtZW50YXRpb25zIG9mIHN0ZGlvOyBuZXdlciBvbmVzIHNob3VsZCBhbHJlYWR5IGhhdmUgdnNwcmludGYuCi0gICBXcml0dGVuIGJ5IFBlciBCb3RobmVyIG9mIEN5Z251cyBTdXBwb3J0LgotICAgQmFzZWQgb24gbGliZysrJ3MgImZvcm0iICh3cml0dGVuIGJ5IERvdWcgTGVhOyBkbEByb2NreS5vc3dlZ28uZWR1KS4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLXNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwotY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKLXRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLVRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLXRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCi0KLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI3VuZGVmIHZzcHJpbnRmCi0KLWludAotdnNwcmludGYgKGJ1ZiwgZm9ybWF0LCBhcCkKLSAgICAgY2hhciAqYnVmOwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2xpc3QgYXA7Ci17Ci0gIEZJTEUgYjsKLSAgaW50IHJldDsKLSNpZmRlZiBWTVMKLSAgYi0+X2ZsYWcgPSBfSU9XUlR8X0lPU1RSRzsKLSAgYi0+X3B0ciA9IGJ1ZjsKLSAgYi0+X2NudCA9IDEyMDAwOwotI2Vsc2UKLSAgYi5fZmxhZyA9IF9JT1dSVHxfSU9TVFJHOwotICBiLl9wdHIgPSBidWY7Ci0gIGIuX2NudCA9IDEyMDAwOwotI2VuZGlmCi0gIHJldCA9IF9kb3BybnQoZm9ybWF0LCBhcCwgJmIpOwotICBwdXRjKCdcMCcsICZiKTsKLSAgcmV0dXJuIHJldDsKLQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3dhaXRwaWQuYyBiL2xpYmliZXJ0eS93YWl0cGlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZGIwYjkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3dhaXRwaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWludAotd2FpdHBpZCAocGlkLCBzdGF0X2xvYywgb3B0aW9ucykKLQlpbnQgcGlkLCAqc3RhdF9sb2MsIG9wdGlvbnM7Ci17Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgaW50IHdwaWQgPSB3YWl0KHN0YXRfbG9jKTsKLSAgICAgIGlmICh3cGlkID09IHBpZCB8fCB3cGlkID09IC0xKQotCXJldHVybiB3cGlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94YXRleGl0LmMgYi9saWJpYmVydHkveGF0ZXhpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ3NmMyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94YXRleGl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogJXNjY3MuaW5jbHVkZS5yZWRpc3QuYyUKLSAqLwotCi0vKiBBZGFwdGVkIGZyb20gbmV3bGliL2xpYmMvc3RkbGliL3ssYXR9ZXhpdC5bY2hdLgotICAgSWYgeW91IHVzZSB4YXRleGl0LCB5b3UgbXVzdCBjYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhpcyBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLVBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLXN0YXRpYyB2b2lkIHhhdGV4aXRfY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gcnVuIGJ5IHhleGl0LiAgKi8KLWV4dGVybiB2b2lkICgqX3hleGl0X2NsZWFudXApIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZQlYQVRFWElUX1NJWkUgMzIKLQotc3RydWN0IHhhdGV4aXQgewotCXN0cnVjdAl4YXRleGl0ICpuZXh0OwkJLyogbmV4dCBpbiBsaXN0ICovCi0JaW50CWluZDsJCQkvKiBuZXh0IGluZGV4IGluIHRoaXMgdGFibGUgKi8KLQl2b2lkCSgqZm5zW1hBVEVYSVRfU0laRV0pIFBBUkFNUyAoKHZvaWQpKTsJLyogdGhlIHRhYmxlIGl0c2VsZiAqLwotfTsKLQotLyogQWxsb2NhdGUgb25lIHN0cnVjdCBzdGF0aWNhbGx5IHRvIGd1YXJhbnRlZSB0aGF0IHdlIGNhbiByZWdpc3RlcgotICAgYXQgbGVhc3QgYSBmZXcgaGFuZGxlcnMuICAqLwotc3RhdGljIHN0cnVjdCB4YXRleGl0IHhhdGV4aXRfZmlyc3Q7Ci0KLS8qIFBvaW50cyB0byBoZWFkIG9mIExJRk8gc3RhY2suICAqLwotc3RhdGljIHN0cnVjdCB4YXRleGl0ICp4YXRleGl0X2hlYWQgPSAmeGF0ZXhpdF9maXJzdDsKLQotLyogUmVnaXN0ZXIgZnVuY3Rpb24gRk4gdG8gYmUgcnVuIGJ5IHhleGl0LgotICAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90LiAgKi8KLQotaW50Ci14YXRleGl0IChmbikKLSAgICAgdm9pZCAoKmZuKSBQQVJBTVMgKCh2b2lkKSk7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB4YXRleGl0ICpwOwotCi0gIC8qIFRlbGwgeGV4aXQgdG8gY2FsbCB4YXRleGl0X2NsZWFudXAuICAqLwotICBpZiAoIV94ZXhpdF9jbGVhbnVwKQotICAgIF94ZXhpdF9jbGVhbnVwID0geGF0ZXhpdF9jbGVhbnVwOwotCi0gIHAgPSB4YXRleGl0X2hlYWQ7Ci0gIGlmIChwLT5pbmQgPj0gWEFURVhJVF9TSVpFKQotICAgIHsKLSAgICAgIGlmICgocCA9IChzdHJ1Y3QgeGF0ZXhpdCAqKSBtYWxsb2MgKHNpemVvZiAqcCkpID09IE5VTEwpCi0JcmV0dXJuIC0xOwotICAgICAgcC0+aW5kID0gMDsKLSAgICAgIHAtPm5leHQgPSB4YXRleGl0X2hlYWQ7Ci0gICAgICB4YXRleGl0X2hlYWQgPSBwOwotICAgIH0KLSAgcC0+Zm5zW3AtPmluZCsrXSA9IGZuOwotICByZXR1cm4gMDsKLX0KLQotLyogQ2FsbCBhbnkgY2xlYW51cCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAoteGF0ZXhpdF9jbGVhbnVwICgpCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB4YXRleGl0ICpwOwotICByZWdpc3RlciBpbnQgbjsKLQotICBmb3IgKHAgPSB4YXRleGl0X2hlYWQ7IHA7IHAgPSBwLT5uZXh0KQotICAgIGZvciAobiA9IHAtPmluZDsgLS1uID49IDA7KQotICAgICAgKCpwLT5mbnNbbl0pICgpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hleGl0LmMgYi9saWJpYmVydHkveGV4aXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxYmJlMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveGV4aXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIHhleGl0LmMgLS0gUnVuIGFueSBleGl0IGhhbmRsZXJzLCB0aGVuIGV4aXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUKLXRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHNldCBieSB4YXRleGl0IGlmIGl0IGlzIGNhbGxlZC4gIFRoaXMgd2F5LCB4bWFsbG9jCi0gICBkb2Vzbid0IGRyYWcgeGF0ZXhpdCBpbnRvIHRoZSBsaW5rLiAgKi8KLXZvaWQgKCpfeGV4aXRfY2xlYW51cCkgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi14ZXhpdCAoY29kZSkKLSAgICAgaW50IGNvZGU7Ci17Ci0gIGlmIChfeGV4aXRfY2xlYW51cCAhPSBOVUxMKQotICAgICgqX3hleGl0X2NsZWFudXApICgpOwotICBleGl0IChjb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94bWFsbG9jLmMgYi9saWJpYmVydHkveG1hbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjFjNmQyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94bWFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyogbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgd2l0aCBlcnJvciBjaGVja2luZy4KLSAgIENvcHlyaWdodCAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNkZWZpbmUgcHRyZGlmZl90IGxvbmcKLSNlbmRpZgotCi0jaWYgVk1TCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2Vsc2UKLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhlc2UgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1QVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotUFRSIHJlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLVBUUiBjYWxsb2MgUEFSQU1TICgoc2l6ZV90LCBzaXplX3QpKTsKLVBUUiBzYnJrIFBBUkFNUyAoKHB0cmRpZmZfdCkpOwotI2VuZGlmCi0KLS8qIFRoZSBwcm9ncmFtIG5hbWUgaWYgc2V0LiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gIiI7Ci0KLSNpZmRlZiBIQVZFX1NCUksKLS8qIFRoZSBpbml0aWFsIHNicmssIHNldCB3aGVuIHRoZSBwcm9ncmFtIG5hbWUgaXMgc2V0LiBOb3QgdXNlZCBmb3Igd2luMzIKLSAgIHBvcnRzIG90aGVyIHRoYW4gY3lnd2luMzIuICAqLwotc3RhdGljIGNoYXIgKmZpcnN0X2JyZWFrID0gTlVMTDsKLSNlbmRpZiAvKiBIQVZFX1NCUksgKi8KLQotdm9pZAoteG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBuYW1lID0gczsKLSNpZmRlZiBIQVZFX1NCUksKLSAgLyogV2luMzIgcG9ydHMgb3RoZXIgdGhhbiBjeWd3aW4zMiBkb24ndCBoYXZlIGJyaygpICovCi0gIGlmIChmaXJzdF9icmVhayA9PSBOVUxMKQotICAgIGZpcnN0X2JyZWFrID0gKGNoYXIgKikgc2JyayAoMCk7Ci0jZW5kaWYgLyogSEFWRV9TQlJLICovCi19Ci0KLVBUUgoteG1hbGxvYyAoc2l6ZSkKLSAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIG5ld21lbTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHNpemUgPSAxOwotICBuZXdtZW0gPSBtYWxsb2MgKHNpemUpOwotICBpZiAoIW5ld21lbSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBleHRlcm4gY2hhciAqKmVudmlyb247Ci0gICAgICBzaXplX3QgYWxsb2NhdGVkOwotCi0gICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOwotICAgICAgZWxzZQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcbiVzJXNDYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUsICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UgLyogSEFWRV9TQlJLICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUpOwotI2VuZGlmIC8qIEhBVkVfU0JSSyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQotCi1QVFIKLXhjYWxsb2MgKG5lbGVtLCBlbHNpemUpCi0gIHNpemVfdCBuZWxlbSwgZWxzaXplOwotewotICBQVFIgbmV3bWVtOwotCi0gIGlmIChuZWxlbSA9PSAwIHx8IGVsc2l6ZSA9PSAwKQotICAgIG5lbGVtID0gZWxzaXplID0gMTsKLQotICBuZXdtZW0gPSBjYWxsb2MgKG5lbGVtLCBlbHNpemUpOwotICBpZiAoIW5ld21lbSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBleHRlcm4gY2hhciAqKmVudmlyb247Ci0gICAgICBzaXplX3QgYWxsb2NhdGVkOwotCi0gICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOwotICAgICAgZWxzZQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcbiVzJXNDYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChuZWxlbSAqIGVsc2l6ZSksICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UgLyogSEFWRV9TQlJLICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIChuZWxlbSAqIGVsc2l6ZSkpOwotI2VuZGlmIC8qIEhBVkVfU0JSSyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQotCi1QVFIKLXhyZWFsbG9jIChvbGRtZW0sIHNpemUpCi0gICAgUFRSIG9sZG1lbTsKLSAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIG5ld21lbTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHNpemUgPSAxOwotICBpZiAoIW9sZG1lbSkKLSAgICBuZXdtZW0gPSBtYWxsb2MgKHNpemUpOwotICBlbHNlCi0gICAgbmV3bWVtID0gcmVhbGxvYyAob2xkbWVtLCBzaXplKTsKLSAgaWYgKCFuZXdtZW0pCi0gICAgewotI2lmZGVmIEhBVkVfU0JSSwotICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKLQotICAgICAgaWYgKGZpcnN0X2JyZWFrICE9IE5VTEwpCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSBmaXJzdF9icmVhazsKLSAgICAgIGVsc2UKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIChjaGFyICopICZlbnZpcm9uOwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXG4lcyVzQ2Fubm90IHJlYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUsICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UgLyogSEFWRV9TQlJLICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW5ub3QgcmVhbGxvY2F0ZSAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc2l6ZSk7Ci0jZW5kaWYgLyogSEFWRV9TQlJLICovCi0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gKG5ld21lbSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveG1lbWR1cC5jIGIvbGliaWJlcnR5L3htZW1kdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4MDA0MS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveG1lbWR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogeG1lbWR1cC5jIC0tIER1cGxpY2F0ZSBhIG1lbW9yeSBidWZmZXIsIHVzaW5nIHhjYWxsb2MuCi0gICBUaGlzIHRyaXZpYWwgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCi0gICBKZWZmIEdhcnppaywgU2VwdGVtYmVyIDE5OTkuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBGb3Igc2l6ZV90LiAqLwotCi1QVFIKLXhtZW1kdXAgKGlucHV0LCBjb3B5X3NpemUsIGFsbG9jX3NpemUpCi0gIGNvbnN0IFBUUiBpbnB1dDsKLSAgc2l6ZV90IGNvcHlfc2l6ZTsKLSAgc2l6ZV90IGFsbG9jX3NpemU7Ci17Ci0gIFBUUiBvdXRwdXQgPSB4Y2FsbG9jICgxLCBhbGxvY19zaXplKTsKLSAgbWVtY3B5IChvdXRwdXQsIGlucHV0LCBjb3B5X3NpemUpOwotICByZXR1cm4gb3V0cHV0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hzdHJkdXAuYyBiL2xpYmliZXJ0eS94c3RyZHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODQ2Y2YuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3hzdHJkdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIHhzdHJkdXAuYyAtLSBEdXBsaWNhdGUgYSBzdHJpbmcgaW4gbWVtb3J5LCB1c2luZyB4bWFsbG9jLgotICAgVGhpcyB0cml2aWFsIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgotICAgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIERlY2VtYmVyIDE5OTUuICAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotY2hhciAqCi14c3RyZHVwIChzKQotICBjb25zdCBjaGFyICpzOwotewotICByZWdpc3RlciBzaXplX3QgbGVuID0gc3RybGVuIChzKSArIDE7Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldCA9IHhtYWxsb2MgKGxlbik7Ci0gIG1lbWNweSAocmV0LCBzLCBsZW4pOwotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hzdHJlcnJvci5jIGIvbGliaWJlcnR5L3hzdHJlcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzBiNjUzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94c3RyZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIHhzdHJlcnJvci5jIC0tIGphY2tldCByb3V0aW5lIGZvciBtb3JlIHJvYnVzdCBzdHJlcnJvcigpIHVzYWdlLgotICAgRnJpIEp1biAxNiAxODozMDowMCAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLSAgIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBWTVMKLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pICYmICFkZWZpbmVkIChfX0hJREVfRk9SQklEREVOX05BTUVTKQotZXh0ZXJuIGNoYXIgKnN0cmVycm9yIFBBUkFNUyAoKGludCwuLi4pKTsKLSNkZWZpbmUgRE9OVF9ERUNMQVJFX1NUUkVSUk9SCi0jZW5kaWYKLSNlbmRpZgkvKiBWTVMgKi8KLQotI2lmbmRlZiBET05UX0RFQ0xBUkVfU1RSRVJST1IKLWV4dGVybiBjaGFyICpzdHJlcnJvciBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi0vKiBJZiBzdHJlcnJvciByZXR1cm5zIE5VTEwsIHdlJ2xsIGZvcm1hdCB0aGUgbnVtYmVyIGludG8gYSBzdGF0aWMgYnVmZmVyLiAgKi8KLQotI2RlZmluZSBFUlJTVFJfRk1UICJ1bmRvY3VtZW50ZWQgZXJyb3IgIyVkIgotc3RhdGljIGNoYXIgeHN0cmVycm9yX2J1ZltzaXplb2YgRVJSU1RSX0ZNVCArIDIwXTsKLQotLyogTGlrZSBzdHJlcnJvciwgYnV0IHJlc3VsdCBpcyBuZXZlciBhIG51bGwgcG9pbnRlci4gICovCi0KLWNoYXIgKgoteHN0cmVycm9yIChlcnJudW0pCi0gICAgIGludCBlcnJudW07Ci17Ci0gIGNoYXIgKmVycnN0cjsKLSNpZmRlZiBWTVMKLSAgY2hhciAqKCp2bXNsaWJfc3RyZXJyb3IpIFBBUkFNUyAoKGludCwuLi4pKTsKLQotICAvKiBPdmVycmlkZSBhbnkgcG9zc2libHktY29uZmxpY3RpbmcgZGVjbGFyYXRpb24gZnJvbSBzeXN0ZW0gaGVhZGVyLiAgKi8KLSAgdm1zbGliX3N0cmVycm9yID0gKGNoYXIgKigqKSBQQVJBTVMgKChpbnQsLi4uKSkpIHN0cmVycm9yOwotICAvKiBTZWNvbmQgYXJndW1lbnQgbWF0dGVycyBpZmYgZmlyc3QgaXMgRVZNU0VSUiwgYnV0IGl0J3Mgc2ltcGxlciB0bwotICAgICBwYXNzIGl0IHVuY29uZGl0aW9uYWxseS4gIGB2YXhjJGVycm5vJyBpcyBkZWNsYXJlZCBpbiA8ZXJybm8uaD4KLSAgICAgYW5kIG1haW50YWluZWQgYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnkgaW4gcGFyYWxsZWwgdG8gYGVycm5vJy4KLSAgICAgV2UgYXNzdW1lIHRoYXQgYGVycm51bScgY29ycmVzcG9uZHMgdG8gdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQgdG8KLSAgICAgZXJybm8gYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnksIGhlbmNlIHZheGMkZXJybm8gd2lsbCBiZSByZWxldmFudC4gICovCi0gIGVycnN0ciA9ICgqdm1zbGliX3N0cmVycm9yKSAoZXJybnVtLCB2YXhjJGVycm5vKTsKLSNlbHNlCi0gIGVycnN0ciA9IHN0cmVycm9yIChlcnJudW0pOwotI2VuZGlmCi0KLSAgLyogSWYgYGVycm51bScgaXMgb3V0IG9mIHJhbmdlLCByZXN1bHQgbWlnaHQgYmUgTlVMTC4gIFdlJ2xsIGZpeCB0aGF0LiAgKi8KLSAgaWYgKCFlcnJzdHIpCi0gICAgewotICAgICAgc3ByaW50ZiAoeHN0cmVycm9yX2J1ZiwgRVJSU1RSX0ZNVCwgZXJybnVtKTsKLSAgICAgIGVycnN0ciA9IHhzdHJlcnJvcl9idWY7Ci0gICAgfQotICByZXR1cm4gZXJyc3RyOwotfQpkaWZmIC0tZ2l0IGEvbHRjb25maWcgYi9sdGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTAxMzM0Zi4uMDAwMDAwMAotLS0gYS9sdGNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDMwNzggKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIGx0Y29uZmlnIC0gQ3JlYXRlIGEgc3lzdGVtLXNwZWNpZmljIGxpYnRvb2wuCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQSBsb3Qgb2YgdGhpcyBzY3JpcHQgaXMgdGFrZW4gZnJvbSBhdXRvY29uZi0yLjEwLgotCi0jIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotZWNobz1lY2hvCi1pZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCi0gIDoKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi0gIGV4ZWMgIiRTSEVMTCIgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLWlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0IDAKLWZpCi0KLSMgRmluZCB0aGUgY29ycmVjdCBQQVRIIHNlcGFyYXRvci4gIFVzdWFsbHkgdGhpcyBpcyBgOicsIGJ1dAotIyBESkdQUCB1c2VzIGA7JyBsaWtlIERPUy4KLWlmIHRlc3QgIlgke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgVU5BTUU9JHtVTkFNRS1gdW5hbWUgMj4vZGV2L251bGxgfQotICBjYXNlIFgkVU5BTUUgaW4KLSAgICAqLURPUykgUEFUSF9TRVBBUkFUT1I9JzsnIDs7Ci0gICAgKikgICAgIFBBVEhfU0VQQVJBVE9SPSc6JyA7OwotICBlc2FjCi1maQotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCAiWCR7Q0RQQVRIK3NldH0iID0gWHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKLQotaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gICMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICBmb3IgY21kIGluICdzZWQgNTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMnEgIiQwIicgJ2VjaG8gdGVzdCc7IGRvCi0gICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KLSAgICBpZiAoZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbCAmJgotICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIiAmJgotICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgIT0gJ1hcdCcgfHwKLSAgIHRlc3QgIlhgKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgIT0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKLSAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgZWNobz0iJGRpci9lY2hvIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgotICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgotICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIHRlc3QgIlhgKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KLSAgICAgIGVjaG89J3ByaW50IC1yJwotICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCi0JIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KLSAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGx0Y29uZmlnIGFnYWluIHdpdGggaXQuCi0gICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9IiR7Q09ORklHX1NIRUxMLS9iaW4vc2h9IgotICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAotICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCi0gICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0gICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotICAgIGVsc2UKLSAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KLSAgICAgIGVjaG89J3ByaW50ZiAiJXNcbiInCi0gICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgdGVzdCAiWGAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JIyBDb29sLCBwcmludGYgd29ya3MKLQk6Ci0gICAgICBlbGlmIHRlc3QgIlhgKCIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgICB0ZXN0ICJYYCgiJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JQ09ORklHX1NIRUxMPSIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIgotCWV4cG9ydCBDT05GSUdfU0hFTEwKLQlTSEVMTD0iJENPTkZJR19TSEVMTCIKLQlleHBvcnQgU0hFTEwKLQllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsaWYgdGVzdCAiWGAoIiRDT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSAgIHRlc3QgIlhgKCIkQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKLSAgICAgIGVsc2UKLQkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgotCXByZXY9OgotCi0JZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgNTBxICIkMCInOyBkbwotCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGw7IHRoZW4KLQkgICAgYnJlYWsKLQkgIGZpCi0JICBwcmV2PSIkY21kIgotCWRvbmUKLQotCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiJDAiJzsgdGhlbgotCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKLQkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCi0JICBleGVjICIke09SSUdJTkFMX0NPTkZJR19TSEVMTH0iICIkMCIgJHsxKyIkQCJ9Ci0JZWxzZQotCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KLQkgIGVjaG89ZWNobwotCWZpCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1maQotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIHMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQotIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgotZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKLQotIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0uCi1wcm9nbmFtZT1gJGVjaG8gIlgkMCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0jIENvbnN0YW50czoKLVBST0dSQU09bHRjb25maWcKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0xLjMuNAotVElNRVNUQU1QPSIgKDEuMzg1LjIuMTk2IDE5OTkvMTIvMDcgMjE6NDc6NTcpIgotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1Jwotcm09InJtIC1mIgotCi1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLWRlZmF1bHRfb2ZpbGU9bGlidG9vbAotY2FuX2J1aWxkX3NoYXJlZD15ZXMKLWVuYWJsZV9zaGFyZWQ9eWVzCi0jIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTSRWQywKLSMgd2hpY2ggbmVlZHMgJy5saWInKS4KLWVuYWJsZV9zdGF0aWM9eWVzCi1lbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZW5hYmxlX2Rsb3Blbj11bmtub3duCi1lbmFibGVfd2luMzJfZGxsPW5vCi1sdG1haW49Ci1zaWxlbnQ9Ci1zcmNkaXI9Ci1hY19jb25maWdfZ3Vlc3M9Ci1hY19jb25maWdfc3ViPQotaG9zdD0KLW5vbm9wdD0KLW9maWxlPSIkZGVmYXVsdF9vZmlsZSIKLXZlcmlmeV9ob3N0PXllcwotd2l0aF9nY2M9bm8KLXdpdGhfZ251X2xkPW5vCi1uZWVkX2xvY2tzPXllcwotYWNfZXh0PWMKLW9iamV4dD1vCi1saWJleHQ9YQotZXhlZXh0PQotY2FjaGVfZmlsZT0KLQotb2xkX0FSPSIkQVIiCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi1vbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLW9sZF9MREZMQUdTPSIkTERGTEFHUyIKLW9sZF9MRD0iJExEIgotb2xkX0xOX1M9IiRMTl9TIgotb2xkX0xJQlM9IiRMSUJTIgotb2xkX05NPSIkTk0iCi1vbGRfUkFOTElCPSIkUkFOTElCIgotb2xkX0RMTFRPT0w9IiRETExUT09MIgotb2xkX09CSkRVTVA9IiRPQkpEVU1QIgotb2xkX0FTPSIkQVMiCi0KLSMgUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotYXJncz0KLXByZXY9Ci1mb3Igb3B0aW9uCi1kbwotICBjYXNlICIkb3B0aW9uIiBpbgotICAtKj0qKSBvcHRhcmc9YGVjaG8gIiRvcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGV2YWwgIiRwcmV2PVwkb3B0aW9uIgotICAgIHByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkb3B0aW9uIiBpbgotICAtLWhlbHApIGNhdCA8PEVPTQotVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiBbSE9TVCBbTFRNQUlOXV0KLQotR2VuZXJhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbCBzY3JpcHQuCi0KLSAgICAtLWRlYnVnICAgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLSAgICAtLWRpc2FibGUtc2hhcmVkICAgICAgIGRvIG5vdCBidWlsZCBzaGFyZWQgbGlicmFyaWVzCi0gICAgLS1kaXNhYmxlLXN0YXRpYyAgICAgICBkbyBub3QgYnVpbGQgc3RhdGljIGxpYnJhcmllcwotICAgIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgZG8gbm90IG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbgotICAgIC0tZW5hYmxlLWRsb3BlbiAgICAgICAgZW5hYmxlIGRsb3BlbiBzdXBwb3J0Ci0gICAgLS1lbmFibGUtd2luMzItZGxsICAgICBlbmFibGUgYnVpbGRpbmcgZGxscyBvbiB3aW4zMiBob3N0cwotICAgIC0taGVscCAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgICAtLW5vLXZlcmlmeSAgICAgICAgICAgIGRvIG5vdCB2ZXJpZnkgdGhhdCBIT1NUIGlzIGEgdmFsaWQgaG9zdCB0eXBlCi0tbywgLS1vdXRwdXQ9RklMRSAgICAgICAgICBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBbZGVmYXVsdD0kZGVmYXVsdF9vZmlsZV0KLSAgICAtLXF1aWV0ICAgICAgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKLSAgICAtLXNpbGVudCAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gICAgLS1zcmNkaXI9RElSICAgICAgICAgICBmaW5kIFxgY29uZmlnLmd1ZXNzJyBpbiBESVIKLSAgICAtLXZlcnNpb24gICAgICAgICAgICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gICAgLS13aXRoLWdjYyAgICAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgR05VIEMgY29tcGlsZXIgd2lsbCBiZSB1c2VkCi0gICAgLS13aXRoLWdudS1sZCAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgQyBjb21waWxlciB1c2VzIHRoZSBHTlUgbGlua2VyCi0gICAgLS1kaXNhYmxlLWxvY2sgICAgICAgICBkaXNhYmxlIGZpbGUgbG9ja2luZwotICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgY29uZmlndXJlIGNhY2hlIGZpbGUKLQotTFRNQUlOIGlzIHRoZSBcYGx0bWFpbi5zaCcgc2hlbGwgc2NyaXB0IGZyYWdtZW50IG9yIFxgbHRtYWluLmMnIHByb2dyYW0KLXRoYXQgcHJvdmlkZXMgYmFzaWMgbGlidG9vbCBmdW5jdGlvbmFsaXR5LgotCi1IT1NUIGlzIHRoZSBjYW5vbmljYWwgaG9zdCBzeXN0ZW0gbmFtZSBbZGVmYXVsdD1ndWVzc2VkXS4KLUVPTQotICBleGl0IDAKLSAgOzsKLQotICAtLWRlYnVnKQotICAgIGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKLSAgICBzZXQgLXgKLSAgICA7OwotCi0gIC0tZGlzYWJsZS1zaGFyZWQpIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLQotICAtLWRpc2FibGUtc3RhdGljKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0KLSAgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCkgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotCi0gIC0tZW5hYmxlLWRsb3BlbikgZW5hYmxlX2Rsb3Blbj15ZXMgOzsKLQotICAtLWVuYWJsZS13aW4zMi1kbGwpIGVuYWJsZV93aW4zMl9kbGw9eWVzIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KSBzaWxlbnQ9eWVzIDs7Ci0KLSAgLS1zcmNkaXIpIHByZXY9c3JjZGlyIDs7Ci0gIC0tc3JjZGlyPSopIHNyY2Rpcj0iJG9wdGFyZyIgOzsKLQotICAtLW5vLXZlcmlmeSkgdmVyaWZ5X2hvc3Q9bm8gOzsKLQotICAtLW91dHB1dCB8IC1vKSBwcmV2PW9maWxlIDs7Ci0gIC0tb3V0cHV0PSopIG9maWxlPSIkb3B0YXJnIiA7OwotCi0gIC0tdmVyc2lvbikgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIjsgZXhpdCAwIDs7Ci0KLSAgLS13aXRoLWdjYykgd2l0aF9nY2M9eWVzIDs7Ci0gIC0td2l0aC1nbnUtbGQpIHdpdGhfZ251X2xkPXllcyA7OwotCi0gIC0tZGlzYWJsZS1sb2NrKSBuZWVkX2xvY2tzPW5vIDs7Ci0KLSAgLS1jYWNoZS1maWxlPSopIGNhY2hlX2ZpbGU9IiRvcHRhcmciIDs7Ci0KLSAgLSopCi0gICAgZWNobyAiJHByb2duYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdGlvbiciIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgotICAgICAgbHRtYWluPSIkb3B0aW9uIgotICAgIGVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0jIFRoaXMgZ2VuZXJhdGVzIGFuIHVubmVjZXNzYXJ5IHdhcm5pbmcgZm9yIHNwYXJjLXN1bi1zb2xhcmlzNC4xLjNfVTEKLSMgICAgICBpZiB0ZXN0IC1uICJgZWNobyAkb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotIyAgICAgICAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nIFxgJG9wdGlvbicgaXMgbm90IGEgdmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0jICAgICAgZmkKLSAgICAgIGhvc3Q9IiRvcHRpb24iCi0gICAgZWxzZQotICAgICAgZWNobyAiJHByb2duYW1lOiB0b28gbWFueSBhcmd1bWVudHMiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLXogIiRsdG1haW4iOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIExUTUFJTiBmaWxlIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAhIC1mICIkbHRtYWluIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IFxgJGx0bWFpbicgZG9lcyBub3QgZXhpc3QiIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi0jIFF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1sdGNvbmZpZ19hcmdzPQotZm9yIGFyZwotZG8KLSAgY2FzZSAiJGFyZyIgaW4KLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJyRhcmcnIiA7OwotICAqKSBsdGNvbmZpZ19hcmdzPSIkbHRjb25maWdfYXJncyAkYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgQSByZWxldmFudCBzdWJzZXQgb2YgQUNfSU5JVC4KLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi1pZiB0ZXN0ICJYJHtMQ19BTEwrc2V0fSIgPSBYc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiWCR7TEFORytzZXR9IiAgID0gWHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLQotaWYgdGVzdCAtbiAiJGNhY2hlX2ZpbGUiICYmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIHdpdGhpbiBsdGNvbmZpZyIKLSAgLiAkY2FjaGVfZmlsZQotZmkKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgIyBBc3N1bWUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdGhlIHNhbWUgb25lIGFzIHRoZSBwYXRoIHRvIExUTUFJTi4KLSAgc3JjZGlyPWAkZWNobyAiWCRsdG1haW4iIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgdGVzdCAiJHNyY2RpciIgPSAiJGx0bWFpbiIgJiYgc3JjZGlyPS4KLWZpCi0KLXRyYXAgIiRybSBjb25mdGVzdCo7IGV4aXQgMSIgMSAyIDE1Ci1pZiB0ZXN0ICIkdmVyaWZ5X2hvc3QiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgZm9yIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1Yi4KLSAgYWNfYXV4X2Rpcj0KLSAgZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvY29uZmlnLmd1ZXNzOyB0aGVuCi0gICAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBmaW5kIGNvbmZpZy5ndWVzcyBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0gIGFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLSAgYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi0KLSAgIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkU0hFTEwgJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLQotICBlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLQotICBob3N0X2FsaWFzPSRob3N0Ci0gIGNhc2UgIiRob3N0X2FsaWFzIiBpbgotICAiIikKLSAgICBpZiBob3N0X2FsaWFzPWAkU0hFTEwgJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi0gIGhvc3Q9YCRTSEVMTCAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLSAgZWNobyAiJGFjX3QkaG9zdCIgMT4mNgotCi0gICMgTWFrZSBzdXJlIHRoZSBob3N0IHZlcmlmaWVkLgotICB0ZXN0IC16ICIkaG9zdCIgJiYgZXhpdCAxCi0KLWVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGhvc3QgdHlwZSBpZiB5b3UgdXNlIFxgLS1uby12ZXJpZnknIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZWxzZQotICBob3N0X2FsaWFzPSRob3N0Ci1maQotCi0jIFRyYW5zZm9ybSBsaW51eCogdG8gKi0qLWxpbnV4LWdudSosIHRvIHN1cHBvcnQgb2xkIGNvbmZpZ3VyZSBzY3JpcHRzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1saW51eC1nbnUqKSA7OwotbGludXgqKSBob3N0PWBlY2hvICRob3N0IHwgc2VkICdzL15cKC4qLS4qLWxpbnV4XClcKC4qXCkkL1wxLWdudVwyLydgCi1lc2FjCi0KLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0gICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLSAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gICAgQ09MTEVDVF9OQU1FUz0KLSAgICBleHBvcnQgQ09MTEVDVF9OQU1FUwotICBmaQotICA7OwotZXNhYwotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiBjcnUgJG9sZGxpYiRvbGRvYmpzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotIyBTZXQgYSBzYW5lIGRlZmF1bHQgZm9yIGBBUicuCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi0KLSMgU2V0IGEgc2FuZSBkZWZhdWx0IGZvciBgT0JKRFVNUCcuCi10ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi0KLSMgSWYgUkFOTElCIGlzIG5vdCBzZXQsIHRoZW4gcnVuIHRoZSB0ZXN0LgotaWYgdGVzdCAiJHtSQU5MSUIrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgcmVzdWx0PW5vCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJhbmxpYi4uLiAkYWNfYyIgMT4mNgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci9yYW5saWIgfHwgdGVzdCAtZiAkZGlyL3JhbmxpYiRhY19leGVleHQ7IHRoZW4KLSAgICAgIFJBTkxJQj0icmFubGliIgotICAgICAgcmVzdWx0PSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgZWNobyAiJGFjX3QkcmVzdWx0IiAxPiY2Ci1maQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLSAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIFwkb2xkbGlifiRvbGRfcG9zdGluc3RhbGxfY21kcyIKLWZpCi0KLSMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIGBETExUT09MJywgYE9CSkRVTVAnLCBhbmQgYEFTJywgdXNlZCBvbiBjeWd3aW4uCi10ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCi10ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCi10ZXN0IC16ICIkQVMiICYmIEFTPWFzCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB1c2luZyBHQ0MuCi1pZiB0ZXN0ICIkd2l0aF9nY2MiICE9IHllcyB8fCB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgSWYgQ0MgaXMgbm90IHNldCwgdGhlbiB0cnkgdG8gZmluZCBHQ0Mgb3IgYSB1c2FibGUgQ0MuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2NjLi4uICRhY19jIiAxPiY2Ci0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjIHx8IHRlc3QgLWYgJGRpci9nY2MkYWNfZXhlZXh0OyB0aGVuCi0JQ0M9ImdjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICBmaQotICBmaQotCi0gICMgTm90ICJnY2MiLCBzbyB0cnkgImNjIiwgcmVqZWN0aW5nICIvdXNyL3VjYi9jYyIuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2MuLi4gJGFjX2MiIDE+JjYKLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBjY19yZWplY3RlZD1ubwotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2NjIHx8IHRlc3QgLWYgJGRpci9jYyRhY19leGVleHQ7IHRoZW4KLQlpZiB0ZXN0ICIkZGlyL2NjIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLQkgIGNjX3JlamVjdGVkPXllcwotCSAgY29udGludWUKLQlmaQotCUNDPSJjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgaWYgdGVzdCAkY2NfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgICAgIHNldCBkdW1teSAkQ0MKLSAgICAgIHNoaWZ0Ci0gICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0JIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0JIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0JIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLQlzaGlmdAotCXNldCBkdW1teSAiJGRpci9jYyIgIiRAIgotCXNoaWZ0Ci0JQ0M9IiRAIgotICAgICAgZmkKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotICBmaQotCi0gICMgTm93IHNlZSBpZiB0aGUgY29tcGlsZXIgaXMgcmVhbGx5IEdDQy4KLSAgd2l0aF9nY2M9bm8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMuLi4gJGFjX2MiIDE+JjYKLSAgZWNobyAiJHByb2duYW1lOjU4MTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotCi0gICRybSBjb25mdGVzdC5jCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotICBpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NTg5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICB3aXRoX2djYz15ZXMKLSAgZmkKLSAgJHJtIGNvbmZ0ZXN0LmMKLSAgZWNobyAiJGFjX3Qkd2l0aF9nY2MiIDE+JjYKLWZpCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1zZXQgZHVtbXkgJENDCi1jb21waWxlcj0iJDIiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4Li4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICdpbnQgaSA9IDE7JyA+IGNvbmZ0ZXN0LmMKLWVjaG8gIiRwcm9nbmFtZTo2MDM6IGNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4IiA+JiA1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjYwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH07IHRoZW4KLSAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLQotICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLmMpIDs7Ci0gICAgKikgb2JqZXh0PWBlY2hvICRhY19maWxlIHwgc2VkIC1lIHMvY29uZnRlc3QuLy9gIDs7Ci0gICAgZXNhYwotICBkb25lCi1lbHNlCi0gIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi0kcm0gY29uZnRlc3QqCi1lY2hvICIkYWNfdCRvYmpleHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4Li4uICRhY19jIiAxPiY2Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfZXhlZXh0PSJubyIKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICdtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuYwotICBlY2hvICIkcHJvZ25hbWU6NjI5OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mIDUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo2MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXJyOyB9OyB0aGVuCi0gICAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotCi0gICAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAgICouYyB8ICouZXJyIHwgKi4kb2JqZXh0ICkgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD0uYGVjaG8gJGFjX2ZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC4vL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICAkcm0gY29uZnRlc3QqCi1maQotaWYgdGVzdCAiWCRhY19jdl9leGVleHQiID0gWG5vOyB0aGVuCi0gIGV4ZWV4dD0iIgotZWxzZQotICBleGVleHQ9IiRhY19jdl9leGVleHQiCi1maQotZWNobyAiJGFjX3QkYWNfY3ZfZXhlZXh0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRhY19jIiAxPiY2Ci1waWNfZmxhZz0KLXNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0KLXdsPQotbGlua19zdGF0aWNfZmxhZz0KLW5vX2J1aWx0aW5fZmxhZz0KLQotaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICB3bD0nLVdsLCcKLSAgbGlua19zdGF0aWNfZmxhZz0nLXN0YXRpYycKLQotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgOzsKLSAgYWl4KikKLSAgICAjIEJlbG93IHRoZXJlIGlzIGEgZGlydHkgaGFjayB0byBmb3JjZSBub3JtYWwgc3RhdGljIGxpbmtpbmcgd2l0aCAtbGRsCi0gICAgIyBUaGUgcHJvYmxlbSBpcyBiZWNhdXNlIGxpYmRsIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIGJvdGggbGliYyBhbmQKLSAgICAjIGxpYkMgKEFJWCBDKysgbGlicmFyeSksIHdoaWNoIG9idmlvdXNseSBkb2Vzbid0IGluY2x1ZGVkIGluIGxpYnJhcmllcwotICAgICMgbGlzdCBieSBnY2MuIFRoaXMgY2F1c2UgdW5kZWZpbmVkIHN5bWJvbHMgd2l0aCAtc3RhdGljIGZsYWdzLgotICAgICMgVGhpcyBoYWNrIGFsbG93cyBDIHByb2dyYW1zIHRvIGJlIGxpbmtlZCB3aXRoICItc3RhdGljIC1sZGwiLCBidXQKLSAgICAjIHdlIG5vdCBzdXJlIGFib3V0IEMrKyBwcm9ncmFtcy4KLSAgICBsaW5rX3N0YXRpY19mbGFnPSIkbGlua19zdGF0aWNfZmxhZyAke3dsfS1sQyIKLSAgICA7OwotICBjeWd3aW4qIHwgbWluZ3cqIHwgb3MyKikKLSAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KLSAgICA7OwotICBhbWlnYW9zKikKLSAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICBwaWNfZmxhZz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgIDs7Ci0gIHN5c3Y0Kk1QKikKLSAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0gICAgICAgcGljX2ZsYWc9LUtjb25mb3JtX3BpYwotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBwaWNfZmxhZz0nLWZQSUMnCi0gICAgOzsKLSAgZXNhYwotZWxzZQotICAjIFBPUlRNRSBDaGVjayBmb3IgUElDIGZsYWdzIGZvciB0aGUgc3lzdGVtIGNvbXBpbGVyLgotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyogfCBhaXg0KikKLSAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgIDs7Ci0KLSAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgIyBJcyB0aGVyZSBhIGJldHRlciBsaW5rX3N0YXRpY19mbGFnIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSIke3dsfS1hICR7d2x9YXJjaGl2ZSIKLSAgICBwaWNfZmxhZz0nK1onCi0gICAgOzsKLQotICBpcml4NSogfCBpcml4NiopCi0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCi0gICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KiB8IG9zMiopCi0gICAgIyBXZSBjYW4gYnVpbGQgRExMcyBmcm9tIG5vbi1QSUMuCi0gICAgOzsKLQotICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCi0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgcGljX2ZsYWc9Jy1LcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1kbicKLSAgICBzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Jy1iZWxmJwotICAgIDs7Ci0KLSAgc29sYXJpcyopCi0gICAgcGljX2ZsYWc9Jy1LUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctV2wsJwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBwaWNfZmxhZz0nLVBJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVFvcHRpb24gbGQgJwotICAgIDs7Ci0KLSAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotICAgIHBpY19mbGFnPSctS1BJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVdsLCcKLSAgICA7OwotCi0gIHV0czQqKQotICAgIHBpY19mbGFnPSctcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIDs7Ci0gIHN5c3Y0Kk1QKikKLSAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCi0gICAgICBwaWNfZmxhZz0nLUtjb25mb3JtX3BpYycKLSAgICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLQotaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotICBlY2hvICIkYWNfdCRwaWNfZmxhZyIgMT4mNgotCi0gICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwaWNfZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTICRwaWNfZmxhZyAtRFBJQyIKLSAgZWNobyAiJHByb2duYW1lOjc3NjogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3JrcyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6Nzc3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRvYmpleHQ7IHRoZW4KLSAgICAjIEFwcGVuZCBhbnkgd2FybmluZ3MgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgCi0gICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICAjIE9uIEhQLVVYLCBib3RoIENDIGFuZCBHQ0Mgb25seSB3YXJuIHRoYXQgUElDIGlzIHN1cHBvcnRlZC4uLiB0aGVuIHRoZXkKLSAgICAgICMgY3JlYXRlIG5vbi1QSUMgb2JqZWN0cy4gIFNvLCBpZiB0aGVyZSB3ZXJlIGFueSB3YXJuaW5ncywgd2UgYXNzdW1lIHRoYXQKLSAgICAgICMgUElDIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotCWVjaG8gIiRhY190Im5vIDE+JjYKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0JcGljX2ZsYWc9Ci0gICAgICBlbHNlCi0JZWNobyAiJGFjX3QieWVzIDE+JjYKLQlwaWNfZmxhZz0iICRwaWNfZmxhZyIKLSAgICAgIGZpCi0gICAgICA7OwotICAgICopCi0gICAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICAgICAgcGljX2ZsYWc9IiAkcGljX2ZsYWciCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIHBpY19mbGFnPQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gICRybSBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiJGFjX3Qibm9uZSAxPiY2Ci1maQotCi0jIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1vIGFuZCAtYyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCi1lY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5vLi4uICRhY19jIiAxPiY2Ci0kcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLW1rZGlyIGNvbmZ0ZXN0Ci1jZCBjb25mdGVzdAotJHJtIGNvbmZ0ZXN0KgotZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCi1ta2RpciBvdXQKLSMgQWNjb3JkaW5nIHRvIFRvbSBUcm9tZXksIElhbiBMYW5jZSBUYXlsb3IgcmVwb3J0ZWQgdGhlcmUgYXJlIEMgY29tcGlsZXJzCi0jIHRoYXQgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSByZWdhcmRsZXNzIG9mCi0jIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAgVGh1cywgbWFraW5nIENXRCByZWFkLW9ubHkgd2lsbCBjYXVzZSB0aGlzIHRlc3QKLSMgdG8gZmFpbCwgZW5hYmxpbmcgbG9ja2luZyBvciBhdCBsZWFzdCB3YXJuaW5nIHRoZSB1c2VyIG5vdCB0byBkbyBwYXJhbGxlbAotIyBidWlsZHMuCi1jaG1vZCAtdyAuCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0iJENGTEFHUyAtbyBvdXQvY29uZnRlc3QyLm8iCi1lY2hvICIkcHJvZ25hbWU6ODI5OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5vIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6ODMwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPm91dC9jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLm87IHRoZW4KLQotICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICBpZiB0ZXN0IC1zIG91dC9jb25mdGVzdC5lcnI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICAgIGNvbXBpbGVyX2Nfbz1ubwotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190InllcyAxPiY2Ci0gICAgICBjb21waWxlcl9jX289eWVzCi0gICAgZmkKLWVsc2UKLSAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgY2F0IG91dC9jb25mdGVzdC5lcnIgMT4mNQotICBjb21waWxlcl9jX289bm8KLSAgZWNobyAiJGFjX3Qibm8gMT4mNgotZmkKLUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotY2htb2QgdSt3IC4KLSRybSBjb25mdGVzdCogb3V0LyoKLXJtZGlyIG91dAotY2QgLi4KLXJtZGlyIGNvbmZ0ZXN0Ci0kcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKLQotaWYgdGVzdCB4IiRjb21waWxlcl9jX28iID0geCJ5ZXMiOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB3cml0ZSB0byBhIC5sbwotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sby4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0LmxvIgotICBlY2hvICIkcHJvZ25hbWU6ODYyOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sbyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjg2MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5sbzsgdGhlbgotCi0gICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0JZWNobyAiJGFjX3Qibm8gMT4mNgotCWNvbXBpbGVyX29fbG89bm8KLSAgICAgIGVsc2UKLQllY2hvICIkYWNfdCJ5ZXMgMT4mNgotCWNvbXBpbGVyX29fbG89eWVzCi0gICAgICBmaQotICBlbHNlCi0gICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBjb21waWxlcl9vX2xvPW5vCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotZWxzZQotICBjb21waWxlcl9vX2xvPW5vCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICRhY19jIiAxPiY2Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIGVjaG8gIiRhY190JGhhcmRfbGlua3MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIGVjaG8gIioqKiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjIKLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQotaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBjb21waWxlcgotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyAuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIC1jIGNvbmZ0ZXN0LmMiCi0gIGVjaG8gIiRwcm9nbmFtZTo5MTQ6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo5MTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgotCi0gICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0JZWNobyAiJGFjX3Qibm8gMT4mNgotCWNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubwotICAgICAgZWxzZQotCWVjaG8gIiRhY190InllcyAxPiY2Ci0JY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgICAgZmkKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotCi0gIGlmIHRlc3QgIiRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0gInllcyI7IHRoZW4KLSAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4gLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucycKLSAgZWxzZQotICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKLSAgZmkKLSAgCi1maQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBzaGFyZWQgbGlicmFyeSBjb21waWxhdGlvbiBmbGFncy4KLWlmIHRlc3QgLW4gIiRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZzogXGAkQ0MnIHJlcXVpcmVzIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotICBpZiBlY2hvICIkb2xkX0NDICRvbGRfQ0ZMQUdTICIgfCBlZ3JlcCAtZSAiWyAJXSRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3NbIAldIiA+L2Rldi9udWxsOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogYWRkIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gdGhlIENDIG9yIENGTEFHUyBlbnYgdmFyaWFibGUgYW5kIHJlY29uZmlndXJlIiAxPiYyCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICdtYWluKCl7cmV0dXJuKDApO30nID4gY29uZnRlc3QuYwotc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLUxERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotZWNobyAiJHByb2duYW1lOjk1ODogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6OTU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgZWNobyAiJGFjX3QkbGlua19zdGF0aWNfZmxhZyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCJub25lIDE+JjYKLSAgbGlua19zdGF0aWNfZmxhZz0KLWZpCi1MREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotJHJtIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0IC16ICIkTE5fUyI7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHVzZSBsbiAtcywgb3Igd2UgbmVlZCBoYXJkIGxpbmtzLgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdC5kYXQKLSAgaWYgbG4gLXMgWCBjb25mdGVzdC5kYXQgMj4vZGV2L251bGw7IHRoZW4KLSAgICAkcm0gY29uZnRlc3QuZGF0Ci0gICAgTE5fUz0ibG4gLXMiCi0gIGVsc2UKLSAgICBMTl9TPWxuCi0gIGZpCi0gIGlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICBlbHNlCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotZmkKLQotIyBNYWtlIHN1cmUgTEQgaXMgYW4gYWJzb2x1dGUgcGF0aC4KLWlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgYWNfcHJvZz1sZAotICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjk5MTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gICAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICAgIiIpCi0gICAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlIG5vdCB1c2luZyBHQ0MuCi0gICAgICBhY19wcm9nPWxkCi0gICAgICA7OwotICAgICopCi0gICAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgotICAgIGVjaG8gIiRwcm9nbmFtZToxMDE1OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSAgZWxzZQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6MTAxODogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotCUxEPSIkYWNfZGlyLyRhY19wcm9nIgotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLQkjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0JIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0JaWYgIiRMRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQkgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQllbHNlCi0JICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCWZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgZmkKLQotICBpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gICAgZWNobyAiJGFjX3QkTEQiIDE+JjYKLSAgZWxzZQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gICAgZWNobyAiJHByb2duYW1lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIGl0IHJlYWxseSBpcyBvciBpcyBub3QgR05VIGxkLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gJGFjX2MiIDE+JjYKLSMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLWVjaG8gIiRhY190JHdpdGhfZ251X2xkIiAxPiY2Ci0KLSMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRhY19jIiAxPiY2Ci0KLWFsbG93X3VuZGVmaW5lZF9mbGFnPQotbm9fdW5kZWZpbmVkX2ZsYWc9Ci1uZWVkX2xpYl9wcmVmaXg9dW5rbm93bgotbmVlZF92ZXJzaW9uPXVua25vd24KLSMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgotIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCi1hcmNoaXZlX2NtZHM9Ci1hcmNoaXZlX2V4cHN5bV9jbWRzPQotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPQotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci1oYXJkY29kZV9kaXJlY3Q9bm8KLWhhcmRjb2RlX21pbnVzX0w9bm8KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLXJ1bnBhdGhfdmFyPQotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCi1leHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKLSMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci1pbmNsdWRlX2V4cHN5bXM9Ci0jIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZWdyZXAgcmVndWxhciBleHByZXNzaW9uIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQotIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCi1leGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAotIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCi0jIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgotIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KLQotY2FzZSAiJGhvc3Rfb3MiIGluCi1jeWd3aW4qIHwgbWluZ3cqKQotICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gIGlmIHRlc3QgIiR3aXRoX2djYyIgIT0geWVzOyB0aGVuCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgZmkKLSAgOzsKLQotZXNhYwotCi1sZF9zaGxpYnM9eWVzCi1pZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gIHdsYXJjPScke3dsfScKLQotICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqIHwgYWl4NCopCi0gICAgIyBPbiBBSVgsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSIGNydSAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG9iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotCi0gICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKLSAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAotICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAotICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuIHVzZQotICAgICMgdGhlbS4KLSAgICBsZF9zaGxpYnM9bm8KLSAgICA7OwotCi0gIGJlb3MqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0gICAgICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0KLSAgICAjIEV4dHJhY3QgdGhlIHN5bWJvbCBleHBvcnQgbGlzdCBmcm9tIGFuIGAtLWV4cG9ydC1hbGwnIGRlZiBmaWxlLAotICAgICMgdGhlbiByZWdlbmVyYXRlIHRoZSBkZWYgZmlsZSBmcm9tIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QsIHNvIHRoYXQKLSAgICAjIHRoZSBjb21waWxlZCBkbGwgb25seSBleHBvcnRzIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QuCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcz0ndGVzdCAtZiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuYyB8fCBzZWQgLWUgIi9eIyBcL1wqIGx0ZGxsXC5jIHN0YXJ0cyBoZXJlIFwqXC8vLC9eIyBcL1wqIGx0ZGxsLmMgZW5kcyBoZXJlIFwqXC8vIHsgcy9eIyAvLzsgcDsgfSIgLWUgZCA8ICQwID4gJG9iamRpci8kc29uYW1lLWx0ZGxsLmN+Ci0gICAgICB0ZXN0IC1mICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0IHx8IChjZCAkb2JqZGlyICYmICRDQyAtYyAkc29uYW1lLWx0ZGxsLmMpfgotICAgICAgJERMTFRPT0wgLS1leHBvcnQtYWxsIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tb3V0cHV0LWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmICAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkY29udmVuaWVuY2V+Ci0gICAgICBzZWQgLWUgIjEsL0VYUE9SVFMvZCIgLWUgInMvIEAgWzAtOV0qIDsgKi8vIiA8ICRvYmpkaXIvJHNvbmFtZS1kZWYgPiAkZXhwb3J0X3N5bWJvbHMnCi0KLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvIEVYUE9SVFMgPiAkb2JqZGlyLyRzb25hbWUtZGVmfgotICAgICAgX2x0X2hpbnQ9MTsKLSAgICAgIGZvciBzeW1ib2wgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbwotCWVjaG8gIglcJHN5bWJvbCBAIFwkX2x0X2hpbnQgOyAiID4+ICRvYmpkaXIvJHNvbmFtZS1kZWY7Ci0JX2x0X2hpbnQ9YGV4cHIgMSArIFwkX2x0X2hpbnRgOwotICAgICAgZG9uZX4KLSAgICAgIHRlc3QgLWYgJG9iamRpci8kc29uYW1lLWx0ZGxsLmMgfHwgc2VkIC1lICIvXiMgXC9cKiBsdGRsbFwuYyBzdGFydHMgaGVyZSBcKlwvLywvXiMgXC9cKiBsdGRsbC5jIGVuZHMgaGVyZSBcKlwvLyB7IHMvXiMgLy87IHA7IH0iIC1lIGQgPCAkMCA+ICRvYmpkaXIvJHNvbmFtZS1sdGRsbC5jfgotICAgICAgdGVzdCAtZiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCB8fCAoY2QgJG9iamRpciAmJiAkQ0MgLWMgJHNvbmFtZS1sdGRsbC5jKX4KLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG9iamRpci8kc29uYW1lLWJhc2UgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG9iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvYmpkaXIvJHNvbmFtZS1leHB+Ci0gICAgICAkQ0MgLVdsLC0tYmFzZS1maWxlLCRvYmpkaXIvJHNvbmFtZS1iYXNlICRvYmpkaXIvJHNvbmFtZS1leHAgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG9iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvYmpkaXIvJHNvbmFtZS1leHB+Ci0gICAgICAkQ0MgJG9iamRpci8kc29uYW1lLWV4cCAtV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyAtV2wsLWUsX19jeWd3aW5fZGxsX2VudHJ5QDEyIC1vICRsaWIgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotCi0gICAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSckRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tb3V0cHV0LWxpYiAkb2JqZGlyLyRsaWJuYW1lLmEnIAotICAgIDs7Ci0KLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1vICRsaWInCi0gICAgICAjIGNhbiB3ZSBzdXBwb3J0IHNvbmFtZSBhbmQvb3IgZXhwc3ltcyB3aXRoIGEub3V0PyAtb2xpdmEKLSAgICBmaQotICAgIDs7Ci0KLSAgc29sYXJpcyogfCBzeXN2NSopCi0gICAgaWYgJExEIC12IDI+JjEgfCBlZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICAgIGNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7ICAgICAgCi0KLSAgc3Vub3M0KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICB3bGFyYz0KLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgKikKLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgZmkKLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSB5ZXM7IHRoZW4KLSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgICAjIGRsbHRvb2wgZG9lc24ndCB1bmRlcnN0YW5kIC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgIGVsc2UKLSAgICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgICBmaQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi1lbHNlCi0gICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgY3J1ICRsaWIgJG9iamRpci8kc29uYW1lJwotICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLSAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQotICAgICAgIyBicm9rZW4gY29sbGVjdDIuCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKLSAgICBmaQotICAgIDs7Ci0KLSAgYWl4NCopCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYiAke3dsfW5vbGlicGF0aCAke3dsfS1iICR7d2x9bGlicGF0aDokbGliZGlyOi91c3IvbGliOi9saWInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0gICAgICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCi0JIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLSAgICAgIHRoZW4KLQkjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLQloYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBlbHNlCi0JIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotCSMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLQkjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAotCSMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotCWhhcmRjb2RlX21pbnVzX0w9eWVzCi0JaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci0gICAgICBmaQotICAgICAgc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0gICAgZWxzZQotICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLSAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBmaQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVyb2snCi0gICAgYXJjaGl2ZV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tYmV4cGFsbCAke3dsfS1ibm9lbnRyeSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9JwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMgJHt3bH0tYm5vZW50cnkke2FsbG93X3VuZGVmaW5lZF9mbGFnfScKLSAgICBjYXNlICIkaG9zdF9vcyIgaW4gYWl4NC5bMDFdfGFpeDQuWzAxXS4qKQotICAgICAgIyBBY2NvcmRpbmcgdG8gR3JlZyBXb29sZWRnZSwgLWJleHBhbGwgaXMgb25seSBzdXBwb3J0ZWQgZnJvbSBBSVggNC4yIG9uCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzIDs7Ci0gICAgZXNhYwotICAgOzsKLQotICBhbWlnYW9zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgY3J1ICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgotICAgIGxkX3NobGlicz1ubwotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgbGliZXh0PWxpYgotICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRsaW5rb3B0cyBgZWNobyAiJGRlcGxpYnMiIHwgc2VkIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSd0cnVlJwotICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCi0gICAgb2xkX2FyY2hpdmVfY21kcz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJwotICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICRzcmNmaWxlYCcKLSAgICA7OwotCi0gIGZyZWVic2QxKikKLSAgICBsZF9zaGxpYnM9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgotICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICMgZXh0cmEgc3BhY2UpLgotICBmcmVlYnNkMi4yKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAvdXNyL2xpYi9jKytydDAubycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgZnJlZWJzZDIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgZnJlZWJzZCopCi0gICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgIGNhc2UgIiRob3N0X29zIiBpbgotICAgIGhwdXg5KikgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c350ZXN0ICRvYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG9iamRpci8kc29uYW1lICRsaWInIDs7Ci0gICAgKikgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnIDs7Ci0gICAgZXNhYwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICA7OwotCi0gIG5ldGJzZCopCi0gICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnICAjIGEub3V0Ci0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycgICAgICAjIEVMRgotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIG9wZW5ic2QqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgb3MyKikKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJG9iamRpci8kbGlibmFtZS5kZWYnCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvYmpkaXIvJGxpYm5hbWUuYSAkb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICA7OwotCi0gIG9zZjMqKQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICA7OwotCi0gIG9zZjQqIHwgb3NmNSopICAjIEFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSAtbXN5bSBmbGFnCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLSAgICA7OwotCi0gIHNvbGFyaXMqKQotICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKLSAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKLSAgICAjIG9iamVjdCBmaWxlcyBhbmQgYSBzdGF0aWMgbGlic3RkYysrLCBiZXR0ZXIgYXZvaWQgaXQgYnkgbm93Ci0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+JHJtICRsaWIuZXhwJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OwotICAgICopICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCi0gICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBzeXN2NCkKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUgCi0gICAgOzsgIAotCi0gIHN5c3Y0LjMqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCi0gICAgOzsKLQotICBzeXN2NSopCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JwotICAgICMgJENDIC1zaGFyZWQgd2l0aG91dCBHTlUgbGQgd2lsbCBub3QgY3JlYXRlIGEgbGlicmFyeSBmcm9tIEMrKwotICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34kcm0gJGxpYi5leHAnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgIDs7Ci0KLSAgdXRzNCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgZGd1eCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgc3lzdjQqTVAqKQotICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0gICAgICBsZF9zaGxpYnM9eWVzCi0gICAgZmkKLSAgICA7OwotCi0gIHN5c3Y0LjJ1dzIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIGhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcwotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgOzsKLQotICB1bml4d2FyZTcqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICopCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLWVjaG8gIiRhY190JGxkX3NobGlicyIgMT4mNgotdGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLWlmIHRlc3QgLXogIiROTSI7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRhY19jIiAxPiY2Ci0gIGNhc2UgIiROTSIgaW4KLSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OyAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgKikKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvdWNiIC91c3IvY2NzL2JpbiAvYmluOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubSB8fCB0ZXN0IC1mICRhY19kaXIvbm0kYWNfZXhlZXh0OyB0aGVuCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0JIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLQkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0JaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JICBOTT0iJGFjX2Rpci9ubSAtQiIKLQkgIGJyZWFrCi0JZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQkgIE5NPSIkYWNfZGlyL25tIC1wIgotCSAgYnJlYWsKLQllbHNlCi0JICBOTT0ke05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotCWZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgICB0ZXN0IC16ICIkTk0iICYmIE5NPW5tCi0gICAgOzsKLSAgZXNhYwotICBlY2hvICIkYWNfdCROTSIgMT4mNgotZmkKLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dC4uLiAkYWNfYyIgMT4mNgotCi0jIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCi0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLXN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBzeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBzeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKSAjIEl0cyBsaW5rZXIgZGlzdGluZ3Vpc2hlcyBkYXRhIGZyb20gY29kZSBzeW1ib2xzCi0gIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1zeXN2NCkKLSAgc3ltY29kZT0nW0RGTlNUVV0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIHN5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCi0gIGdsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRzeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkc3ltcGF0JC8kc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgcGlwZV93b3Jrcz1ubwotICAkcm0gY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1tYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9Ci1FT0YKLQotICBlY2hvICIkcHJvZ25hbWU6MTYzNTogY2hlY2tpbmcgaWYgZ2xvYmFsX3N5bWJvbF9waXBlIHdvcmtzIiA+JjUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToxNjM2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJG9iamV4dDsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCi0gICAgaWYgeyBlY2hvICIkcHJvZ25hbWU6MTYzOTogZXZhbCBcIiROTSBjb25mdGVzdC4kb2JqZXh0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdFwiIiA+JjU7IGV2YWwgIiROTSBjb25mdGVzdC4kb2JqZXh0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdCAyPiY1IjsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgotCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCSAgc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jCi0JICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kb2JqZXh0IGNvbmZ0c3RtLiRvYmpleHQKLQkgIHNhdmVfTElCUz0iJExJQlMiCi0JICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0c3RtLiRvYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToxNjkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJHNhdmVfTElCUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGdsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gICRybSBjb25mdGVzdCogY29uZnRzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBnbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1pZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAiJHthY190fW9rIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiR7YWNfdH1mYWlsZWQiIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9Ci1maQotCi0jIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJGFjX2MiIDE+JjYKLWhhcmRjb2RlX2FjdGlvbj0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgIT0gbm8gJiYKLSAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCi1maQotZWNobyAiJGFjX3QkaGFyZGNvZGVfYWN0aW9uIiAxPiY2Ci0KLQotcmVsb2FkX2ZsYWc9Ci1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICRhY19jIiAxPiY2Ci0jIFBPUlRNRSBTb21lIGxpbmtlcnMgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCi1yZWxvYWRfZmxhZz0nLXInCi1lY2hvICIkYWNfdCRyZWxvYWRfZmxhZyIgMT4mNgotdGVzdCAtbiAiJHJlbG9hZF9mbGFnIiAmJiByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIKLQotIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcwotbGlicmFyeV9uYW1lc19zcGVjPQotbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKLXNvbmFtZV9zcGVjPQotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpbGVfbWFnaWNfY21kPQotZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW3JlZ2V4XScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCi0jIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGVncmVwIHJlZ2V4LgotIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCi0jIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICRhY19jIiAxPiY2Ci1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICA7OwotCi1haXg0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKLSAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aG91Z2ggQUlYNC4yCi0gICMgYW5kIGxhdGVyIGxpbmtlciBzdXBwb3J0cyAuc28KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgIihjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSI7IChjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSB8fCBleGl0IDE7IGRvbmUnCi0gIDs7Ci0KLWJlb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uc28nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKLSAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gIGx0X2N2X2Rsb3Blbl9zZWxmPXllcwotICA7OwotCi1ic2RpNCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0tcmR5bmFtaWMKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBuZWVkX3ZlcnNpb249bm8KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fS5kbGwgJGxpYm5hbWUuYScKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCAkbGlibmFtZS5saWInCi0gIGZpCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JwotICBmaWxlX21hZ2ljX2NtZD0nJHtPQkpEVU1QfSAtZicKLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgotICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgOzsKLQotZnJlZWJzZDEqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotICAKLWZyZWVic2QqKQotICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCi0gIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKLSAgY2FzZSAiJHZlcnNpb25fdHlwZSIgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBzaGFyZWQgb2JqZWN0JwotICAgICAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLnNvJHZlcnN1ZmZpeCcKLSAgICAgIG5lZWRfdmVyc2lvbj15ZXMKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGZyZWVic2QyKiB8IGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIDs7Ci0gICopICMgZnJvbSAzLjIgb24KLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICA7OwotICBlc2FjCi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHttYWpvcn0gJHtsaWJuYW1lfS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJG1ham9yICRsaWJuYW1lLnNsJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3InCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaXJpeDUqIHwgaXJpeDYqKQotICB2ZXJzaW9uX3R5cGU9aXJpeAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBpcml4NSopCi0gICAgbGlic3VmZj0gc2hsaWJzdWZmPQotICAgICMgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gd2l0aCBwYXNzX2FsbCwgYnV0IGxldCB1cyBrZWVwIGl0IGp1c3QgaW4gY2FzZQotICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiAzMi1iaXQgTVNCIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiCi0gICAgOzsKLSAgKikKLSAgICBjYXNlICIkTEQiIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKLSAgICAqLTMyfCoiLTMyICIpIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgICAqLW4zMnwqIi1uMzIgIikgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICAgKi02NHwqIi02NCAiKSBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OwotICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYiR7bGlic3VmZn0vbGliYy5zbypgCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdwYXNzX2FsbCcKLSAgOzsKLQotIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgotbGludXgtZ251b2xkbGQqIHwgbGludXgtZ251YW91dCogfCBsaW51eC1nbnVjb2ZmKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLQotIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgotbGludXgtZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYi9saWJjLnNvKiAvbGliL2xpYmMtKi5zb2AKLQotICBpZiB0ZXN0IC1mIC9saWIvbGQuc28uMTsgdGhlbgotICAgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIGVsc2UKLSAgICAjIE9ubHkgdGhlIEdOVSBsZC5zbyBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIG9uIE1rTGludXguCi0gICAgY2FzZSAiJGhvc3RfY3B1IiBpbgotICAgIHBvd2VycGMqKSBkeW5hbWljX2xpbmtlcj1ubyA7OwotICAgICopIGR5bmFtaWNfbGlua2VyPSdMaW51eCBsZC5zbycgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAke2xpYm5hbWV9LnNvJwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKLSAgZmkKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotb3BlbmJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgbmVlZF92ZXJzaW9uPW5vCi0gIGZpCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwgJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgQ09GRiBmb3JtYXQgYWxwaGEgc2hhcmVkIGxpYnJhcnknCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KLSAgZGVwbGlic19jaGVja19tZXRob2Q9J3Bhc3NfYWxsJwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc2NvMy4ydjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldLWJpdCBbTE1dU0IgZHluYW1pYyBsaWIiCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGZpCi0gIG5lZWRfdmVyc2lvbj15ZXMKLSAgOzsKLQotc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgY2FzZSAiJGhvc3RfdmVuZG9yIiBpbgotICAgIG5jcikKLSAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdwYXNzX2FsbCcKLSAgICAgIDs7Ci0gICAgbW90b3JvbGEpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJwotICAgICAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bMC05XVswLTldKiBWZXJzaW9uIFswLTldJwotICAgICAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZGd1eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXN5c3Y0Kk1QKikKLSAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgIHZlcnNpb25fdHlwZT1saW51eAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCi0gICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lLnNvLiRtYWpvcicKLSAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBmaQotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwotZWNobyAiJGFjX3QkZHluYW1pY19saW5rZXIiIDE+JjYKLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMgUmVwb3J0IHRoZSBmaW5hbCBjb25zZXF1ZW5jZXMuCi1lY2hvICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGNhbl9idWlsZF9zaGFyZWQiIDE+JjYKLQotIyBPbmx5IHRyeSB0byBidWlsZCB3aW4zMiBkbGxzIGlmIEFDX0xJQlRPT0xfV0lOMzJfRExMIHdhcyB1c2VkIGluCi0jIGNvbmZpZ3VyZS5pbiwgb3RoZXJ3aXNlIGJ1aWxkIHN0YXRpYyBvbmx5IGxpYnJhcmllcy4KLWNhc2UgIiRob3N0X29zIiBpbgotY3lnd2luKiB8IG1pbmd3KiB8IG9zMiopCi0gIGlmIHRlc3QgeCRjYW5fYnVpbGRfc2hhcmVkID0geHllczsgdGhlbgotICAgIHRlc3QgeCRlbmFibGVfd2luMzJfZGxsID0geG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICBlY2hvICJjaGVja2luZyBpZiBwYWNrYWdlIHN1cHBvcnRzIGRsbHMuLi4gJGNhbl9idWlsZF9zaGFyZWQiIDE+JjYKLSAgZmkKLTs7Ci1lc2FjCi0KLWlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSIgJiYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfY21kIjsgdGhlbgotICBjYXNlICIkZGVwbGlic19jaGVja19tZXRob2QiIGluCi0gICJmaWxlX21hZ2ljICIqKQotICAgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcImZpbGVfbWFnaWMgXCguKlwpXCJgIgotICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLSAgICAgICBlZ3JlcCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKLSoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KLSoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcwotKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0Ci0qKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKLSoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKLSoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KLSoqKiBidWctbGlidG9vbEBnbnUub3JnCi0KLUVPRgotICAgIGZpIDs7Ci0gIGVzYWMKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgotdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCi0KLSMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICBmaQotICA7OwotCi1haXg0KikKLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgOzsKLWVzYWMKLQotZWNobyAiJGFjX3QkZW5hYmxlX3NoYXJlZCIgMT4mNgotCi0jIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwotCi1lY2hvICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuLi4gJGVuYWJsZV9zdGF0aWMiIDE+JjYKLQotaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLWVsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKLSAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KLSAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5Ci0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gJGFjX2MiIDE+JjYKLXJtIC1mIC5saWJzIDI+L2Rldi9udWxsCi1ta2RpciAubGlicyAyPi9kZXYvbnVsbAotaWYgdGVzdCAtZCAubGliczsgdGhlbgotICBvYmpkaXI9LmxpYnMKLWVsc2UKLSAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KLSAgb2JqZGlyPV9saWJzCi1maQotcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKLWVjaG8gIiRhY190JG9iamRpciIgMT4mNgotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KLSAgZW5hYmxlX2Rsb3Blbj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCi0gIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgotZWxzZQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2Rsb3Blbicrc2V0fSdgXCIgIT0gc2V0IjsgdGhlbgotICBsdF9jdl9kbG9wZW49bm8gbHRfY3ZfZGxvcGVuX2xpYnM9Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIyMTI6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRsJ18nZGxvcGVuIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjAgImx0Y29uZmlnIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxvcGVuKCk7Ci0KLWludCBtYWluKCkgewotZGxvcGVuKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMjMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjI1MjogY2hlY2tpbmcgZm9yIGRsb3BlbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19kbG9wZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjU3ICJsdGNvbmZpZyIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGRsb3BlbigpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBkbG9wZW4oKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9kbG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2Rsb3BlbikKLWNob2tlIG1lCi0jZWxzZQotZGxvcGVuKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIyODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfZGxvcGVuPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19kbG9wZW49bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nZGxvcGVuYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjI5OTogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGxkJ18nZGxkX2xpbmsgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sZGxkICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMDcgImx0Y29uZmlnIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxkX2xpbmsoKTsKLQotaW50IG1haW4oKSB7Ci1kbGRfbGluaygpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjMyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjMzOTogY2hlY2tpbmcgZm9yIHNobF9sb2FkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NobF9sb2FkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM0NCAibHRjb25maWciCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaGxfbG9hZCgpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzaGxfbG9hZCgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViX3NobF9sb2FkKSB8fCBkZWZpbmVkIChfX3N0dWJfX19zaGxfbG9hZCkKLWNob2tlIG1lCi0jZWxzZQotc2hsX2xvYWQoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjM2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19zaGxfbG9hZD15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfc2hsX2xvYWQ9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydzaGxfbG9hZGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjM4NzogY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGxkJ18nc2hsX2xvYWQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sZGxkICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzOTUgImx0Y29uZmlnIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzaGxfbG9hZCgpOwotCi1pbnQgbWFpbigpIHsKLXNobF9sb2FkKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyNDA5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1maQotCi0gICAgCi1maQotCi0gIAotZmkKLQotCi1maQotCi1maQotCi0gIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KLSAgICBlbmFibGVfZGxvcGVuPXllcwotICBmaQotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW4iIGluCi0gIGRsb3BlbikKLWZvciBhY19oZHIgaW4gZGxmY24uaDsgZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjI0NTI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDU3ICJsdGNvbmZpZyIKLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IGZub3JkID0gMDsKLUVPRgotYWNfdHJ5PSIkYWNfY29tcGlsZSA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvICRwcm9nbmFtZToyNDYyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICAgaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzOyB0aGVuCi0gICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgotICAgIGZpCi0gICAgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKLQotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjQ5MDogY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotaWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzCi0gIGVsc2UKLSAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jbGluZSAyNDk4ICJsdGNvbmZpZyIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyBkZWZpbmUgTFRETF9HTE9CQUwJUlRMRF9HTE9CQUwKLSNlbHNlCi0jIGlmZGVmIERMX0dMT0JBTAotIyAgZGVmaW5lIExURExfR0xPQkFMCURMX0dMT0JBTAotIyBlbHNlCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVERMX0xBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRETF9MQVpZX09SX05PVwotIyBpZmRlZiBSVExEX0xBWlkKLSMgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTEFaWQotIyBlbHNlCi0jICBpZmRlZiBETF9MQVpZCi0jICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTEFaWQotIyAgZWxzZQotIyAgIGlmZGVmIFJUTERfTk9XCi0jICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgZWxzZQotIyAgICBpZmRlZiBETF9OT1cKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX05PVwotIyAgICBlbHNlCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwkwCi0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotZm5vcmQoKSB7IGludCBpPTQyO30KLW1haW4oKSB7IHZvaWQgKnNlbGYsICpwdHIxLCAqcHRyMjsgc2VsZj1kbG9wZW4oMCxMVERMX0dMT0JBTHxMVERMX0xBWllfT1JfTk9XKTsKLSAgICBpZihzZWxmKSB7IHB0cjE9ZGxzeW0oc2VsZiwiZm5vcmQiKTsgcHRyMj1kbHN5bShzZWxmLCJfZm5vcmQiKTsKLQkgICAgICAgaWYocHRyMSB8fCBwdHIyKSB7IGRsY2xvc2Uoc2VsZik7IGV4aXQoMCk7IH0gfSBleGl0KDEpOyB9IAotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjU0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2Rsb3Blbl9zZWxmIiAxPiY2Ci0KLSAgaWYgdGVzdCAiJGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHllczsgdGhlbgotICAgIExERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjU2MzogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotaWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKLSAgZWxzZQotICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNsaW5lIDI1NzEgImx0Y29uZmlnIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jIGRlZmluZSBMVERMX0dMT0JBTAlSVExEX0dMT0JBTAotI2Vsc2UKLSMgaWZkZWYgRExfR0xPQkFMCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJRExfR0xPQkFMCi0jIGVsc2UKLSMgIGRlZmluZSBMVERMX0dMT0JBTAkwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExURExfTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVERMX0xBWllfT1JfTk9XCi0jIGlmZGVmIFJUTERfTEFaWQotIyAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9MQVpZCi0jIGVsc2UKLSMgIGlmZGVmIERMX0xBWlkKLSMgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9MQVpZCi0jICBlbHNlCi0jICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICBlbHNlCi0jICAgIGlmZGVmIERMX05PVwotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgIGVsc2UKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCTAKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1mbm9yZCgpIHsgaW50IGk9NDI7fQotbWFpbigpIHsgdm9pZCAqc2VsZiwgKnB0cjEsICpwdHIyOyBzZWxmPWRsb3BlbigwLExURExfR0xPQkFMfExURExfTEFaWV9PUl9OT1cpOwotICAgIGlmKHNlbGYpIHsgcHRyMT1kbHN5bShzZWxmLCJmbm9yZCIpOyBwdHIyPWRsc3ltKHNlbGYsIl9mbm9yZCIpOwotICAgIGlmKHB0cjEgfHwgcHRyMikgeyBkbGNsb3NlKHNlbGYpOyBleGl0KDApOyB9IH0gZXhpdCgxKTsgfSAKLQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjI2MTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcwotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgMT4mNgotZmkKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGx0X2N2X2Rsb3Blbl9zZWxmIiBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OwotICBlc2FjCi1maQotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsLCBiZWNhdXNlIGl0IGlzCi0jIHVzZWQgbGF0ZXIuCi1sdGVjaG89IiRlY2hvIgotaWYgdGVzdCAiWCRsdGVjaG8iID0gIlgkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLSAgIGx0ZWNobz0iJENPTkZJR19TSEVMTCBcJDAgLS1mYWxsYmFjay1lY2hvIgotZmkKLUxUU0hFTEw9IiRTSEVMTCIKLQotTFRDT05GSUdfVkVSU0lPTj0iJFZFUlNJT04iCi0KLSMgT25seSBxdW90ZSB2YXJpYWJsZXMgaWYgd2UncmUgdXNpbmcgbHRtYWluLnNoLgotY2FzZSAiJGx0bWFpbiIgaW4KLSouc2gpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMuCi0gIGZvciB2YXIgaW4gbHRlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBcCi0gICAgb2xkX0xEIG9sZF9MREZMQUdTIG9sZF9MSUJTIFwKLSAgICBvbGRfTk0gb2xkX1JBTkxJQiBvbGRfTE5fUyBvbGRfRExMVE9PTCBvbGRfT0JKRFVNUCBvbGRfQVMgXAotICAgIEFSIENDIExEIExOX1MgTk0gTFRTSEVMTCBMVENPTkZJR19WRVJTSU9OIFwKLSAgICByZWxvYWRfZmxhZyByZWxvYWRfY21kcyB3bCBcCi0gICAgcGljX2ZsYWcgbGlua19zdGF0aWNfZmxhZyBub19idWlsdGluX2ZsYWcgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgbGlibmFtZV9zcGVjIFwKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgXAotICAgIFJBTkxJQiBvbGRfYXJjaGl2ZV9jbWRzIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAotICAgIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgYXJjaGl2ZV9jbWRzIGFyY2hpdmVfZXhwc3ltX2NtZHMgcG9zdGluc3RhbGxfY21kcyBwb3N0dW5pbnN0YWxsX2NtZHMgXAotICAgIGZpbGVfbWFnaWNfY21kIGV4cG9ydF9zeW1ib2xzX2NtZHMgZGVwbGlic19jaGVja19tZXRob2QgYWxsb3dfdW5kZWZpbmVkX2ZsYWcgbm9fdW5kZWZpbmVkX2ZsYWcgXAotICAgIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIGdsb2JhbF9zeW1ib2xfcGlwZSBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgIFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAotICAgIGNvbXBpbGVyX2NfbyBjb21waWxlcl9vX2xvIG5lZWRfbG9ja3MgZXhjbHVkZV9leHBzeW1zIGluY2x1ZGVfZXhwc3ltczsgZG8KLQotICAgIGNhc2UgIiR2YXIiIGluCi0gICAgcmVsb2FkX2NtZHMgfCBvbGRfYXJjaGl2ZV9jbWRzIHwgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcyB8IGFyY2hpdmVfY21kcyB8IGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCi0gICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBmaW5pc2hfY21kcyB8IHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAiJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAiJGx0ZWNobyIgaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRlY2hvPWAkZWNobyAiWCRsdGVjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKLSAgICA7OwotICBlc2FjCi0KLSAgdHJhcCAiJHJtIFwiJG9maWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gIGVjaG8gImNyZWF0aW5nICRvZmlsZSIKLSAgJHJtICIkb2ZpbGUiCi0gIGNhdCA8PEVPRiA+ICIkb2ZpbGUiCi0jISAkU0hFTEwKLQotIyBgJGVjaG8gIiRvZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCi0jIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0Y29uZmlnIG9yIGx0bWFpbi5zaC4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KLVhzZWQ9InNlZCAtZSBzL15YLy8iCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0ICJYXCR7Q0RQQVRIK3NldH0iID0gWHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKLQotIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCi1FT0YKLSAgY2ZnZmlsZT0iJG9maWxlIgotICA7OwotCi0qKQotICAjIERvdWJsZS1xdW90ZSB0aGUgdmFyaWFibGVzIHRoYXQgbmVlZCBpdCAoZm9yIGFlc3RoZXRpY3MpLgotICBmb3IgdmFyIGluIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBcCi0gICAgb2xkX0xEIG9sZF9MREZMQUdTIG9sZF9MSUJTIFwKLSAgICBvbGRfTk0gb2xkX1JBTkxJQiBvbGRfTE5fUyBvbGRfRExMVE9PTCBvbGRfT0JKRFVNUCBvbGRfQVM7IGRvCi0gICAgZXZhbCAiJHZhcj1cXFwiXCR2YXJcXFwiIgotICBkb25lCi0KLSAgIyBKdXN0IGNyZWF0ZSBhIGNvbmZpZyBmaWxlLgotICBjZmdmaWxlPSIkb2ZpbGUuY2ZnIgotICB0cmFwICIkcm0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQotICBlY2hvICJjcmVhdGluZyAkY2ZnZmlsZSIKLSAgJHJtICIkY2ZnZmlsZSIKLSAgY2F0IDw8RU9GID4gIiRjZmdmaWxlIgotIyBgJGVjaG8gIiRjZmdmaWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIExpYnRvb2wgY29uZmlndXJhdGlvbiBmaWxlLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKLUVPRgotICA7OwotZXNhYwotCi1jYXQgPDxFT0YgPj4gIiRjZmdmaWxlIgotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyBDQz0kb2xkX0NDIENGTEFHUz0kb2xkX0NGTEFHUyBDUFBGTEFHUz0kb2xkX0NQUEZMQUdTIFxcCi0jIExEPSRvbGRfTEQgTERGTEFHUz0kb2xkX0xERkxBR1MgTElCUz0kb2xkX0xJQlMgXFwKLSMgTk09JG9sZF9OTSBSQU5MSUI9JG9sZF9SQU5MSUIgTE5fUz0kb2xkX0xOX1MgXFwKLSMgRExMVE9PTD0kb2xkX0RMTFRPT0wgT0JKRFVNUD0kb2xkX09CSkRVTVAgQVM9JG9sZF9BUyBcXAotIyAgICQwJGx0Y29uZmlnX2FyZ3MKLSMKLSMgQ29tcGlsZXIgYW5kIG90aGVyIHRlc3Qgb3V0cHV0IHByb2R1Y2VkIGJ5ICRwcm9nbmFtZSwgdXNlZnVsIGZvcgotIyBkZWJ1Z2dpbmcgJHByb2duYW1lLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi0jIFRoZSB2ZXJzaW9uIG9mICRwcm9nbmFtZSB0aGF0IGdlbmVyYXRlZCB0aGlzIHNjcmlwdC4KLUxUQ09ORklHX1ZFUlNJT049JExUQ09ORklHX1ZFUlNJT04KLQotIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgotU0hFTEw9JExUU0hFTEwKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgotYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KLWJ1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCi0KLSMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgotZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCi0KLSMgVGhlIGhvc3Qgc3lzdGVtLgotaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwotaG9zdD0kaG9zdAotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89JGx0ZWNobwotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSRBUgotCi0jIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCi1DQz0kQ0MKLQotIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgotTEQ9JExECi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9JExOX1MKLQotIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCi1OTT0kTk0KLQotIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCi1ETExUT09MPSIkRExMVE9PTCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KLU9CSkRVTVA9IiRPQkpEVU1QIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRyZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JHJlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSR3bAotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJG9iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgotZXhlZXh0PSIkZXhlZXh0IgotCi0jIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KLXBpY19mbGFnPSRwaWNfZmxhZwotCi0jIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KLWNvbXBpbGVyX2Nfbz0kY29tcGlsZXJfY19vCi0KLSMgQ2FuIHdlIHdyaXRlIGRpcmVjdGx5IHRvIGEgLmxvID8KLWNvbXBpbGVyX29fbG89JGNvbXBpbGVyX29fbG8KLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbiA/Ci1uZWVkX2xvY2tzPSRuZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuPSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsaW5rX3N0YXRpY19mbGFnCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbm9fYnVpbHRpbl9mbGFnCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSR0aHJlYWRfc2FmZV9mbGFnX3NwZWMKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGxpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGxpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JHNvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kYXJjaGl2ZV9jbWRzCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi1wb3N0aW5zdGFsbF9jbWRzPSRwb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JHBvc3R1bmluc3RhbGxfY21kcwotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgotZmlsZV9tYWdpY19jbWQ9JGZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JG5vX3VuZGVmaW5lZF9mbGFnCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRmaW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGdsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGgiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KLWFsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCi0KLSMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgotZXhjbHVkZV9leHBzeW1zPSRleGNsdWRlX2V4cHN5bXMKLQotIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCi1pbmNsdWRlX2V4cHN5bXM9JGluY2x1ZGVfZXhwc3ltcwotCi1FT0YKLQotY2FzZSAiJGx0bWFpbiIgaW4KLSouc2gpCi0gIGVjaG8gJyMjIyBFTkQgTElCVE9PTCBDT05GSUcnID4+ICIkb2ZpbGUiCi0gIGVjaG8gPj4gIiRvZmlsZSIKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqKQotICAgIGNhdCA8PFxFT0YgPj4gIiRvZmlsZSIKLQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLUVPRgotICAgIDs7Ci0gIGVzYWMKLQotICAjIEFwcGVuZCB0aGUgbHRtYWluLnNoIHNjcmlwdC4KLSAgc2VkICckcScgIiRsdG1haW4iID4+ICIkb2ZpbGUiIHx8IChybSAtZiAiJG9maWxlIjsgZXhpdCAxKQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotCi0gIGNobW9kICt4ICIkb2ZpbGUiCi0gIDs7Ci0KLSopCi0gICMgQ29tcGlsZSB0aGUgbGlidG9vbCBwcm9ncmFtLgotICBlY2hvICJGSVhNRTogd291bGQgY29tcGlsZSAkbHRtYWluIgotICA7OwotZXNhYwotCi10ZXN0IC1uICIkY2FjaGVfZmlsZSIgfHwgZXhpdCAwCi0KLSMgQUNfQ0FDSEVfU0FWRQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9sdG1haW4uc2ggYi9sdG1haW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjkzOWUuLjAwMDAwMDAKLS0tIGEvbHRtYWluLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDAzMiArMCwwIEBACi0jIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBsdGNvbmZpZy4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkZWNobyB3aWxsIHdvcmsuCi0gIGV4ZWMgJFNIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci1maQotCi1pZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAwCi1maQotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KLXByb2duYW1lPWAkZWNobyAiJDAiIHwgc2VkICdzJV4uKi8lJSdgCi1tb2RlbmFtZT0iJHByb2duYW1lIgotCi0jIENvbnN0YW50cy4KLVBST0dSQU09bHRtYWluLnNoCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS4zLjQKLVRJTUVTVEFNUD0iICgxLjM4NS4yLjE5NiAxOTk5LzEyLzA3IDIxOjQ3OjU3KSIKLQotZGVmYXVsdF9tb2RlPQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgotbWtkaXI9Im1rZGlyIgotbXY9Im12IC1mIgotcm09InJtIC1mIgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJwotU1AyTkw9J3RyIFwwNDAgXDAxMicKLU5MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQ19BTEw9IiRMQ19BTEwiOyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTAotZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xBTkc9IiRMQU5HIjsgTEFORz1DOyBleHBvcnQgTEFORwotZmkKLQotaWYgdGVzdCAiJExUQ09ORklHX1ZFUlNJT04iICE9ICIkVkVSU0lPTiI7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBsdGNvbmZpZyB2ZXJzaW9uIFxgJExUQ09ORklHX1ZFUlNJT04nIGRvZXMgbm90IG1hdGNoICRQUk9HUkFNIHZlcnNpb24gXGAkVkVSU0lPTiciIDE+JjIKLSAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCi0gIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBHbG9iYWwgdmFyaWFibGVzLgotbW9kZT0kZGVmYXVsdF9tb2RlCi1ub25vcHQ9Ci1wcmV2PQotcHJldm9wdD0KLXJ1bj0KLXNob3c9IiRlY2hvIgotc2hvd19oZWxwPQotZXhlY3V0ZV9kbGZpbGVzPQotbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgotbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgotCi0jIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgotd2hpbGUgdGVzdCAkIyAtZ3QgMAotZG8KLSAgYXJnPSIkMSIKLSAgc2hpZnQKLQotICBjYXNlICIkYXJnIiBpbgotICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBjYXNlICIkcHJldiIgaW4KLSAgICBleGVjdXRlX2RsZmlsZXMpCi0gICAgICBldmFsICIkcHJldj1cIlwkJHByZXYgXCRhcmdcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBwcmV2PQotICAgIHByZXZvcHQ9Ci0gICAgY29udGludWUKLSAgZmkKLQotICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/Ci0gIGNhc2UgIiRhcmciIGluCi0gIC0taGVscCkKLSAgICBzaG93X2hlbHA9eWVzCi0gICAgOzsKLQotICAtLXZlcnNpb24pCi0gICAgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIgotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1jb25maWcpCi0gICAgc2VkIC1lICcxLC9eIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHL2QnIC1lICcvXiMjIyBFTkQgTElCVE9PTCBDT05GSUcvLCRkJyAkMAotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1kZWJ1ZykKLSAgICBlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0gICAgc2V0IC14Ci0gICAgOzsKLQotICAtLWRyeS1ydW4gfCAtbikKLSAgICBydW49OgotICAgIDs7Ci0KLSAgLS1mZWF0dXJlcykKLSAgICBlY2hvICJob3N0OiAkaG9zdCIKLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGZpCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGZpCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAtLWZpbmlzaCkgbW9kZT0iZmluaXNoIiA7OwotCi0gIC0tbW9kZSkgcHJldm9wdD0iLS1tb2RlIiBwcmV2PW1vZGUgOzsKLSAgLS1tb2RlPSopIG1vZGU9IiRvcHRhcmciIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KQotICAgIHNob3c9OgotICAgIDs7Ci0KLSAgLWRsb3BlbikKLSAgICBwcmV2b3B0PSItZGxvcGVuIgotICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCi0gICAgOzsKLQotICAtKikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgbm9ub3B0PSIkYXJnIgotICAgIGJyZWFrCi0gICAgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkcHJldm9wdCI7IHRoZW4KLSAgJGVjaG8gIiRtb2RlbmFtZTogb3B0aW9uIFxgJHByZXZvcHQnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCi0KLSAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCi0gIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotICAgIGNhc2UgIiRub25vcHQiIGluCi0gICAgKmNjIHwgKisrIHwgZ2NjKiB8ICotZ2NjKikKLSAgICAgIG1vZGU9bGluawotICAgICAgZm9yIGFyZwotICAgICAgZG8KLQljYXNlICIkYXJnIiBpbgotCS1jKQotCSAgIG1vZGU9Y29tcGlsZQotCSAgIGJyZWFrCi0JICAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQotICAgICAgbW9kZT1leGVjdXRlCi0gICAgICA7OwotICAgICppbnN0YWxsKnxjcHxtdikKLSAgICAgIG1vZGU9aW5zdGFsbAotICAgICAgOzsKLSAgICAqcm0pCi0gICAgICBtb2RlPXVuaW5zdGFsbAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KLSAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQotCi0gICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgotICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgotICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0gICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgotICBjYXNlICIkbW9kZSIgaW4KLSAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQotICBjb21waWxlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCi0gICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KLSAgICBiYXNlX2NvbXBpbGU9Ci0gICAgbGFzdGFyZz0KLSAgICBzcmNmaWxlPSIkbm9ub3B0IgotICAgIHN1cHByZXNzX291dHB1dD0KLQotICAgIHVzZXJfdGFyZ2V0PW5vCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICAjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLW8pCi0JaWYgdGVzdCAiJHVzZXJfdGFyZ2V0IiAhPSAibm8iOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgXGAtbycgbW9yZSB0aGFuIG9uY2UiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JdXNlcl90YXJnZXQ9bmV4dAotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICIkdXNlcl90YXJnZXQiIGluCi0gICAgICBuZXh0KQotCSMgVGhlIG5leHQgb25lIGlzIHRoZSAtbyB0YXJnZXQgbmFtZQotCXVzZXJfdGFyZ2V0PXllcwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIHllcykKLQkjIFdlIGdvdCB0aGUgb3V0cHV0IGZpbGUKLQl1c2VyX3RhcmdldD1zZXQKLQlsaWJvYmo9IiRhcmciCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCi0gICAgICBsYXN0YXJnPSIkc3JjZmlsZSIKLSAgICAgIHNyY2ZpbGU9IiRhcmciCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCi0KLSAgICAgICMgQmFja3NsYXNoaWZ5IGFueSBiYWNrc2xhc2hlcywgZG91YmxlIHF1b3RlcywgYW5kIGRvbGxhciBzaWducy4KLSAgICAgICMgVGhlc2UgYXJlIHRoZSBvbmx5IGNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgc3BlY2lhbGx5Ci0gICAgICAjIGludGVycHJldGVkIGluc2lkZSBvZiBkb3VibGUtcXVvdGVkIHNjcmluZ3MuCi0gICAgICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQotICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkgaW4gc2NhbgotICAgICAgIyBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0gICAgICBjYXNlICIkbGFzdGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgotICAgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLQliYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgotICAgICAgZWxzZQotCWJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgY2FzZSAiJHVzZXJfdGFyZ2V0IiBpbgotICAgIHNldCkKLSAgICAgIDs7Ci0gICAgbm8pCi0gICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCi0gICAgICBsaWJvYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCi0gICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KLSAgICB4Zm9ybT0nW2NDRlNmbXNvXScKLSAgICBjYXNlICIkbGlib2JqIiBpbgotICAgICouYWRhKSB4Zm9ybT1hZGEgOzsKLSAgICAqLmFkYikgeGZvcm09YWRiIDs7Ci0gICAgKi5hZHMpIHhmb3JtPWFkcyA7OwotICAgICouYXNtKSB4Zm9ybT1hc20gOzsKLSAgICAqLmMrKykgeGZvcm09YysrIDs7Ci0gICAgKi5jYykgeGZvcm09Y2MgOzsKLSAgICAqLmNwcCkgeGZvcm09Y3BwIDs7Ci0gICAgKi5jeHgpIHhmb3JtPWN4eCA7OwotICAgICouZjkwKSB4Zm9ybT1mOTAgOzsKLSAgICAqLmZvcikgeGZvcm09Zm9yIDs7Ci0gICAgZXNhYwotCi0gICAgbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgInMvXC4keGZvcm0kLy5sby8iYAotCi0gICAgY2FzZSAiJGxpYm9iaiIgaW4KLSAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYCA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxpYm9iaiIKLSAgICBlbHNlCi0gICAgICByZW1vdmVsaXN0PSIkbGlib2JqIgotICAgIGZpCi0KLSAgICAkcnVuICRybSAkcmVtb3ZlbGlzdAotICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0IDEiIDEgMiAxNQotCi0gICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKLSAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKLSAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC4uKiQlJSdgLiR7b2JqZXh0fQotICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCi0gICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkb3V0cHV0X29iaiAkbG9ja2ZpbGUiCi0gICAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAxIiAxIDIgMTUKLSAgICBlbHNlCi0gICAgICBuZWVkX2xvY2tzPW5vCi0gICAgICBsb2NrZmlsZT0KLSAgICBmaQotCi0gICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKLSAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCi0gICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCi0gICAgICB1bnRpbCBsbiAiJDAiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbwotCSRzaG93ICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKLQlzbGVlcCAyCi0gICAgICBkb25lCi0gICAgZWxpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1mICIkbG9ja2ZpbGUiOyB0aGVuCi0JZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgICBlY2hvICRzcmNmaWxlID4gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCi0gICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCi0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgotICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCi0KLSAgICAgICMgQWxsIHBsYXRmb3JtcyB1c2UgLURQSUMsIHRvIG5vdGlmeSBwcmVwcm9jZXNzZWQgYXNzZW1ibGVyIGNvZGUuCi0gICAgICAjIEhvd2V2ZXIsIG1ha2Ugc3VyZSB3ZSBvbmx5IHNldCBpdCBmb3Igbm9uLUphdmEgY29kZS4KLSAgICAgIGNhc2UgIiRzcmNmaWxlIiBpbgotCSouamF2YXwqLmNsYXNzKQotCSAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcGljX2ZsYWcgJHNyY2ZpbGUiOzsKLQkqKQotCSAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSAkcGljX2ZsYWcgLURQSUMiOzsKLSAgICAgIGVzYWMKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQlsb19saWJvYmo9IiRsaWJvYmoiCi0JZGlyPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQlpZiB0ZXN0ICJYJGRpciIgPSAiWCRsaWJvYmoiOyB0aGVuCi0JICBkaXI9IiRvYmpkaXIiCi0JZWxzZQotCSAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JZmkKLQlsaWJvYmo9IiRkaXIvImAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotCWlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCi0JICAkc2hvdyAiJHJtICRsaWJvYmoiCi0JICAkcnVuICRybSAkbGlib2JqCi0JZWxzZQotCSAgJHNob3cgIiRta2RpciAkZGlyIgotCSAgJHJ1biAkbWtkaXIgJGRpcgotCSAgc3RhdHVzPSQ/Ci0JICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRkaXI7IHRoZW4KLQkgICAgZXhpdCAkc3RhdHVzCi0JICBmaQotCWZpCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX29fbG8iID0geWVzOyB0aGVuCi0Jb3V0cHV0X29iaj0iJGxpYm9iaiIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb3V0cHV0X29iaiIKLSAgICAgIGVsaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KLQlvdXRwdXRfb2JqPSIkb2JqIgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvdXRwdXRfb2JqIgotICAgICAgZmkKLQotICAgICAgJHJ1biAkcm0gIiRvdXRwdXRfb2JqIgotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCXRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0IHgiYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSB4IiRzcmNmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKLSAgICAgIGlmIHRlc3QgeCIkb3V0cHV0X29iaiIgIT0geCIkbGlib2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJGxpYm9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkbGlib2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiBjb3B5IHRoZSBvYmplY3QgaW50byBwbGFjZSBhbmQgZmluaXNoLgotICAgICAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBSZW5hbWUgdGhlIC5sbyBmcm9tIHdpdGhpbiBvYmpkaXIgdG8gb2JqCi0JaWYgdGVzdCAtZiAkb2JqOyB0aGVuCi0JICAkc2hvdyAkcm0gJG9iagotCSAgJHJ1biAkcm0gJG9iagotCWZpCi0KLQkkc2hvdyAiJG12ICRsaWJvYmogJG9iaiIKLQlpZiAkcnVuICRtdiAkbGlib2JqICRvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotCi0JeGRpcj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9iaiI7IHRoZW4KLQkgIHhkaXI9Ii4iCi0JZWxzZQotCSAgeGRpcj0iJHhkaXIiCi0JZmkKLQliYXNlb2JqPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgInMlLiovJSUiYAotCWxpYm9iaj1gJGVjaG8gIlgkYmFzZW9iaiIgfCAkWHNlZCAtZSAiJG8ybG8iYAotCSMgTm93IGFycmFuZ2UgdGhhdCBvYmogYW5kIGxvX2xpYm9iaiBiZWNvbWUgdGhlIHNhbWUgZmlsZQotCSRzaG93ICIoY2QgJHhkaXIgJiYgJExOX1MgJGJhc2VvYmogJGxpYm9iaikiCi0JaWYgJHJ1biBldmFsICcoY2QgJHhkaXIgJiYgJExOX1MgJGJhc2VvYmogJGxpYm9iaiknOyB0aGVuCi0JICBleGl0IDAKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KLSAgICAgIHN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKLSAgICBmaQotCi0gICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHNyY2ZpbGUiCi0gICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvYmoiCi0Jb3V0cHV0X29iaj0iJG9iaiIKLSAgICAgIGZpCi0KLSAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgotICAgICAgY29tbWFuZD0iJGNvbW1hbmQkc3VwcHJlc3Nfb3V0cHV0IgotICAgICAgJHJ1biAkcm0gIiRvdXRwdXRfb2JqIgotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCi0JIHRlc3QgeCJgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9IHgiJHNyY2ZpbGUiOyB0aGVuCi0JZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotYnV0IGl0IHNob3VsZCBjb250YWluOgotJHNyY2ZpbGUKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZAotICAgICAgaWYgdGVzdCB4IiRvdXRwdXRfb2JqIiAhPSB4IiRvYmoiOyB0aGVuCi0JJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkb2JqIgotCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG8gbm90Ci0gICAgICAjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLQkkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gXCRsaWJvYmoiIHx8IGV4aXQgJD8KLSAgICAgIGVsc2UKLQkjIE1vdmUgdGhlIC5sbyBmcm9tIHdpdGhpbiBvYmpkaXIKLQkkc2hvdyAiJG12ICRsaWJvYmogJGxvX2xpYm9iaiIKLQlpZiAkcnVuICRtdiAkbGlib2JqICRsb19saWJvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAgICAgJHJtICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGxpbmsgbW9kZQotICBsaW5rKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCi0gICAgQ19jb21waWxlcj0iJENDIiAjIHNhdmUgaXQsIHRvIGNvbXBpbGUgZ2VuZXJhdGVkIEMgc291cmNlcwotICAgICMgQWx3YXlzIHJlc3BlY3QgdGhlIENDIGNvbmZpZ3VyZWQgaW4gYnkgbHRjb25maWcuCi0gICAgQ0M9IiRub25vcHQiCi0gICAgIyBDWUdOVVMgTE9DQUw6IHRyb21leS9qYXZhCi0gICAgIyBBZGQgLUIgb3B0aW9ucyB0byBsaW5rIGxpbmUuCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICAgY2FzZSAiJGFyZyIgaW4KLQktQiopCi0JICAgQ0M9IiRDQyAkYXJnIgotCSAgIDs7Ci0gICAgICAgZXNhYwotICAgIGRvbmUKLSAgICAjIEVORCBDWUdOVVMgTE9DQUwKLSAgICBjYXNlICIkaG9zdCIgaW4KLSAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKikKLSAgICAgICMgSXQgaXMgaW1wb3NzaWJsZSB0byBsaW5rIGEgZGxsIHdpdGhvdXQgdGhpcyBzZXR0aW5nLCBhbmQKLSAgICAgICMgd2Ugc2hvdWxkbid0IGZvcmNlIHRoZSBtYWtlZmlsZSBtYWludGFpbmVyIHRvIGZpZ3VyZSBvdXQKLSAgICAgICMgd2hpY2ggc3lzdGVtIHdlIGFyZSBjb21waWxpbmcgZm9yIGluIG9yZGVyIHRvIHBhc3MgYW4gZXh0cmEKLSAgICAgICMgZmxhZyBmb3IgZXZlcnkgbGlidG9vbCBpbnZva2F0aW9uLgotICAgICAgIyBhbGxvd191bmRlZmluZWQ9bm8KLQotICAgICAgIyBGSVhNRTogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIGFib3ZlIHdoZW4gdHJ5aW5nCi0gICAgICAjIHRvIG1ha2UgYSBkbGwgd2hpY2ggaGFzIHVuZGVmaW5lZCBzeW1ib2xzLCBpbiB3aGljaCBjYXNlIG5vdAotICAgICAgIyBldmVuIGEgc3RhdGljIGxpYnJhcnkgaXMgYnVpbHQuICBGb3Igbm93LCB3ZSBuZWVkIHRvIHNwZWNpZnkKLSAgICAgICMgLW5vLXVuZGVmaW5lZCBvbiB0aGUgbGlidG9vbCBsaW5rIGxpbmUgd2hlbiB3ZSBjYW4gYmUgY2VydGFpbgotICAgICAgIyB0aGF0IGFsbCBzeW1ib2xzIGFyZSBzYXRpc2ZpZWQsIG90aGVyd2lzZSB3ZSBnZXQgYSBzdGF0aWMgbGlicmFyeS4KLSAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKLQotICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBkbGxzIG9uIFdpbmRvd3MKLSAgICAgICMgRG9uJ3QgcmVtb3ZlIG5vciBtb2RpZnkgdGhlIHN0YXJ0aW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzCi0jIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KLSMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICNpbmNsdWRlIDxzdGRpby5oPgotIwotIyAjaWZuZGVmIF9fQ1lHV0lOX18KLSMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCi0jICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jICMgIGVuZGlmCi0jICNlbmRpZgotIwotIyAjaWZkZWYgX19jcGx1c3BsdXMKLSMgZXh0ZXJuICJDIiB7Ci0jICNlbmRpZgotIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOwotIyAjaWZkZWYgX19jcGx1c3BsdXMKLSMgfQotIyAjZW5kaWYKLSMKLSMgI2lmZGVmIF9fQ1lHV0lOX18KLSMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+Ci0jIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOwotIyAjZW5kaWYKLSMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7Ci0jCi0jIEJPT0wgQVBJRU5UUlkKLSMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKLSMgewotIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKLSMgICByZXR1cm4gVFJVRTsKLSMgfQotIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLwotICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBpbXBvcnQgbGlicmFyaWVzCi0gICAgICAjIG9uIFdpbmRvd3MgZm9yIGRsbHMgd2hpY2ggbGFjayB0aGVtLiBEb24ndCByZW1vdmUgbm9yIG1vZGlmeSB0aGUKLSAgICAgICMgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKLSMgLyogaW1wZ2VuLmMgc3RhcnRzIGhlcmUgKi8KLSMgLyogICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIAotIyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIGxpYnRvb2wuCi0jIAotIyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMgICovCi0jIAotIyAgI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgcHJpbnRmKCkgKi8KLSMgICNpbmNsdWRlIDx1bmlzdGQuaD4JCS8qIGZvciBvcGVuKCksIGxzZWVrKCksIHJlYWQoKSAqLwotIyAgI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fQklOQVJZICovCi0jICAjaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBmb3Igc3RyZHVwKCkgKi8KLSMgCi0jICBzdGF0aWMgdW5zaWduZWQgaW50Ci0jICBwZV9nZXQxNiAoZmQsIG9mZnNldCkKLSMgICAgICAgaW50IGZkOwotIyAgICAgICBpbnQgb2Zmc2V0OwotIyAgewotIyAgICB1bnNpZ25lZCBjaGFyIGJbMl07Ci0jICAgIGxzZWVrIChmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0jICAgIHJlYWQgKGZkLCBiLCAyKTsKLSMgICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Ci0jICB9Ci0jIAotIyAgc3RhdGljIHVuc2lnbmVkIGludAotIyAgcGVfZ2V0MzIgKGZkLCBvZmZzZXQpCi0jICAgICAgaW50IGZkOwotIyAgICAgIGludCBvZmZzZXQ7Ci0jICB7Ci0jICAgIHVuc2lnbmVkIGNoYXIgYls0XTsKLSMgICAgbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSMgICAgcmVhZCAoZmQsIGIsIDQpOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotIyAgfQotIyAKLSMgIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSMgIHBlX2FzMzIgKHB0cikKLSMgICAgICAgdm9pZCAqcHRyOwotIyAgewotIyAgICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotIyAgfQotIyAKLSMgIGludAotIyAgbWFpbiAoYXJnYywgYXJndikKLSMgICAgICBpbnQgYXJnYzsKLSMgICAgICBjaGFyICphcmd2W107Ci0jICB7Ci0jICAgICAgaW50IGRsbDsKLSMgICAgICB1bnNpZ25lZCBsb25nIHBlX2hlYWRlcl9vZmZzZXQsIG9wdGhkcl9vZnMsIG51bV9lbnRyaWVzLCBpOwotIyAgICAgIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7Ci0jICAgICAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YXMsIG5leHA7Ci0jICAgICAgdW5zaWduZWQgY2hhciAqZXhwZGF0YSwgKmVydmE7Ci0jICAgICAgY2hhciAqZmlsZW5hbWUsICpkbGxfbmFtZTsKLSMgCi0jICAgICAgZmlsZW5hbWUgPSBhcmd2WzFdOwotIyAKLSMgICAgICBkbGwgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWXxPX0JJTkFSWSk7Ci0jICAgICAgaWYgKCFkbGwpCi0jICAJcmV0dXJuIDE7Ci0jIAotIyAgICAgIGRsbF9uYW1lID0gZmlsZW5hbWU7Ci0jICAgIAotIyAgICAgIGZvciAoaT0wOyBmaWxlbmFtZVtpXTsgaSsrKQotIyAgCWlmIChmaWxlbmFtZVtpXSA9PSAnLycgfHwgZmlsZW5hbWVbaV0gPT0gJ1xcJyAgfHwgZmlsZW5hbWVbaV0gPT0gJzonKQotIyAgCSAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArMTsKLSMgCi0jICAgICAgcGVfaGVhZGVyX29mZnNldCA9IHBlX2dldDMyIChkbGwsIDB4M2MpOwotIyAgICAgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOwotIyAgICAgIG51bV9lbnRyaWVzID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDkyKTsKLSMgCi0jICAgICAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLwotIyAgCXJldHVybiAxOwotIyAKLSMgICAgICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKLSMgICAgICBleHBvcnRfc2l6ZSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyAxMDApOwotIyAgICAgIG5zZWN0aW9ucyA9IHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsyKTsKLSMgICAgICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCi0jICAJICAgICAgcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAxNikpOwotIyAKLSMgICAgICBleHBwdHIgPSAwOwotIyAgICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdGlvbnM7IGkrKykKLSMgICAgICB7Ci0jICAJY2hhciBzbmFtZVs4XTsKLSMgIAl1bnNpZ25lZCBsb25nIHNlY3B0cjEgPSBzZWNwdHIgKyA0MCAqIGk7Ci0jICAJdW5zaWduZWQgbG9uZyB2YWRkciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxMik7Ci0jICAJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7Ci0jICAJdW5zaWduZWQgbG9uZyBmcHRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDIwKTsKLSMgIAlsc2VlayhkbGwsIHNlY3B0cjEsIFNFRUtfU0VUKTsKLSMgIAlyZWFkKGRsbCwgc25hbWUsIDgpOwotIyAgCWlmICh2YWRkciA8PSBleHBvcnRfcnZhICYmIHZhZGRyK3ZzaXplID4gZXhwb3J0X3J2YSkKLSMgIAl7Ci0jICAJICAgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLSMgIAkgICAgaWYgKGV4cG9ydF9ydmEgKyBleHBvcnRfc2l6ZSA+IHZhZGRyICsgdnNpemUpCi0jICAJCWV4cG9ydF9zaXplID0gdnNpemUgLSAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLSMgIAkgICAgYnJlYWs7Ci0jICAJfQotIyAgICAgIH0KLSMgCi0jICAgICAgZXhwZGF0YSA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MoZXhwb3J0X3NpemUpOwotIyAgICAgIGxzZWVrIChkbGwsIGV4cHB0ciwgU0VFS19TRVQpOwotIyAgICAgIHJlYWQgKGRsbCwgZXhwZGF0YSwgZXhwb3J0X3NpemUpOwotIyAgICAgIGVydmEgPSBleHBkYXRhIC0gZXhwb3J0X3J2YTsKLSMgCi0jICAgICAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOwotIyAgICAgIG5hbWVfcnZhcyA9IHBlX2FzMzIgKGV4cGRhdGErMzIpOwotIyAKLSMgICAgICBwcmludGYgKCJFWFBPUlRTXG4iKTsKLSMgICAgICBmb3IgKGkgPSAwOyBpPG5leHA7IGkrKykKLSMgICAgICB7Ci0jICAJdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7Ci0jICAJcHJpbnRmICgiXHQlcyBAICVsZCA7XG4iLCBlcnZhK25hbWVfcnZhLCAxKyBpKTsKLSMgICAgICB9Ci0jIAotIyAgICAgIHJldHVybiAwOwotIyAgfQotIyAvKiBpbXBnZW4uYyBlbmRzIGhlcmUgKi8KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGNvbXBpbGVfY29tbWFuZD0iJG5vbm9wdCIKLSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkbm9ub3B0IgotCi0gICAgY29tcGlsZV9ycGF0aD0KLSAgICBmaW5hbGl6ZV9ycGF0aD0KLSAgICBjb21waWxlX3NobGlicGF0aD0KLSAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9Ci0gICAgY29udmVuaWVuY2U9Ci0gICAgb2xkX2NvbnZlbmllbmNlPQotICAgIGRlcGxpYnM9Ci0gICAgbGlua29wdHM9Ci0KLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKLSAgICAgIGV2YWwgbGliX3NlYXJjaF9wYXRoPVxgXCRlY2hvIFwiWCBcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAotICAgIGVsc2UKLSAgICAgIGxpYl9zZWFyY2hfcGF0aD0KLSAgICBmaQotICAgICMgbm93IHByZXBlbmQgdGhlIHN5c3RlbS1zcGVjaWZpYyBvbmVzCi0gICAgZXZhbCBsaWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCRsaWJfc2VhcmNoX3BhdGhcIgotICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKLSAgICAKLSAgICBhdm9pZF92ZXJzaW9uPW5vCi0gICAgZGxmaWxlcz0KLSAgICBkbHByZWZpbGVzPQotICAgIGRsc2VsZj1ubwotICAgIGV4cG9ydF9keW5hbWljPW5vCi0gICAgZXhwb3J0X3N5bWJvbHM9Ci0gICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9Ci0gICAgZ2VuZXJhdGVkPQotICAgIGxpYm9ianM9Ci0gICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KLSAgICBsdGxpYnM9Ci0gICAgbW9kdWxlPW5vCi0gICAgb2Jqcz0KLSAgICBwcmVmZXJfc3RhdGljX2xpYnM9bm8KLSAgICBwcmVsb2FkPW5vCi0gICAgcHJldj0KLSAgICBwcmV2YXJnPQotICAgIHJlbGVhc2U9Ci0gICAgcnBhdGg9Ci0gICAgeHJwYXRoPQotICAgIHBlcm1fcnBhdGg9Ci0gICAgdGVtcF9ycGF0aD0KLSAgICB0aHJlYWRfc2FmZT1ubwotICAgIHZpbmZvPQotCi0gICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIjsgdGhlbgotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQkgIGZpCi0JZWxzZQotCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQlmaQotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCXByZWZlcl9zdGF0aWNfbGlicz15ZXMKLQlicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgotICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKLQotICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgotICAgIHdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLQotICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQljYXNlICIkcHJldiIgaW4KLQlvdXRwdXQpCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJHByZXYiIGluCi0JZGxmaWxlc3xkbHByZWZpbGVzKQotCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KLQkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBwcmVsb2FkPXllcwotCSAgZmkKLQkgIGNhc2UgIiRhcmciIGluCi0JICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgotCSAgZm9yY2UpCi0JICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KLQkgICAgICBkbHNlbGY9bmVlZGxlc3MKLQkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIHNlbGYpCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxzZQotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICAgIGVsc2UKLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlleHBzeW1zKQotCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCi0JICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCi0JICAgIGV4aXQgMQotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlleHBzeW1zX3JlZ2V4KQotCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcmVsZWFzZSkKLQkgIHJlbGVhc2U9Ii0kYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJwYXRoIHwgeHJwYXRoKQotCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JICBjYXNlICIkYXJnIiBpbgotCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogb25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiIDE+JjIKLQkgICAgZXhpdCAxCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgotCSAgICBjYXNlICIkcnBhdGggIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSBycGF0aD0iJHJwYXRoICRhcmciIDs7Ci0JICAgIGVzYWMKLQkgIGVsc2UKLQkgICAgY2FzZSAiJHhycGF0aCAiIGluCi0JICAgICoiICRhcmcgIiopIDs7Ci0JICAgICopIHhycGF0aD0iJHhycGF0aCAkYXJnIiA7OwotCSAgICBlc2FjCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCSopCi0JICBldmFsICIkcHJldj1cIlwkYXJnXCIiCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgcHJldmFyZz0iJGFyZyIKLQotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtYXZvaWQtdmVyc2lvbikKLQlhdm9pZF92ZXJzaW9uPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRsb3BlbikKLQlwcmV2PWRsZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbHByZW9wZW4pCi0JcHJldj1kbHByZWZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LWR5bmFtaWMpCi0JZXhwb3J0X2R5bmFtaWM9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LXN5bWJvbHMgfCAtZXhwb3J0LXN5bWJvbHMtcmVnZXgpCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBub3QgbW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBhbGxvd2VkIgotCSAgZXhpdCAxCi0JZmkKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KLQkgIHByZXY9ZXhwc3ltcwotCWVsc2UKLQkgIHByZXY9ZXhwc3ltc19yZWdleAotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtTCopCi0JZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAotCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCWNhc2UgIiRkaXIiIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSopCi0JICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogcGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIgMT4mMgotCSAgICBhYnNkaXI9IiRkaXIiCi0JICBmaQotCSAgZGlyPSIkYWJzZGlyIgotCSAgOzsKLQllc2FjCi0JY2FzZSAiICRkZXBsaWJzICIgaW4KLQkqIiAkYXJnICIqKSA7OwotCSopIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciOzsKLQllc2FjCi0JY2FzZSAiICRsaWJfc2VhcmNoX3BhdGggIiBpbgotCSoiICRkaXIgIiopIDs7Ci0JKikgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiOzsKLQllc2FjCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0JICBkbGxzZWFyY2hkaXI9YGNkICIkZGlyIiAmJiBwd2QgfHwgZWNobyAiJGRpciJgCi0JICBjYXNlICI6JGRsbHNlYXJjaHBhdGg6IiBpbgotCSAgOjopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hkaXIiOzsKLQkgICoiOiRkbGxzZWFyY2hkaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokZGxsc2VhcmNoZGlyIjs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLQk7OwotCi0gICAgICAtbCopCi0JaWYgdGVzdCAiJGFyZyIgPSAiLWxjIjsgdGhlbgotCSAgY2FzZSAiJGhvc3QiIGluCi0JICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKiB8ICotKi1iZW9zKikKLQkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYyBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCWVsaWYgdGVzdCAiJGFyZyIgPSAiLWxtIjsgdGhlbgotCSAgY2FzZSAiJGhvc3QiIGluCi0JICAqLSotY3lnd2luKiB8ICotKi1iZW9zKikKLQkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCWZpCi0JZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKLQk7OwotCi0gICAgICAtbW9kdWxlKQotCW1vZHVsZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0JcHJldj1ycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIpCi0JcHJldj14cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKikKLQlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAiJGRpciIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCWNhc2UgIiR4cnBhdGggIiBpbgotCSoiICRkaXIgIiopIDs7Ci0JKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXN0YXRpYykKLQkjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gdGhpcyBpcyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYy4KLQlpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC10aHJlYWQtc2FmZSkKLQl0aHJlYWRfc2FmZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC12ZXJzaW9uLWluZm8pCi0JcHJldj12aW5mbwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCi0gICAgICAtKiB8ICsqKQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgIiRhcmciIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JOzsKLQotICAgICAgKi5vIHwgKi5vYmogfCAqLmEgfCAqLmxpYikKLQkjIEEgc3RhbmRhcmQgb2JqZWN0LgotCW9ianM9IiRvYmpzICRhcmciCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEEgbGlicmFyeSBvYmplY3QuCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW4iID0geWVzOyB0aGVuCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICBlbHNlCi0JICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgIHByZXY9ZGxwcmVmaWxlcwotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIHByZXY9Ci0JZmkKLQlsaWJvYmpzPSIkbGlib2JqcyAkYXJnIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgotCi0JZGxuYW1lPQotCWxpYmRpcj0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoc2VkIC1lICcycScgJGFyZyB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAotCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGUgaW5zdGFsbGVkLgotCWluc3RhbGxlZD15ZXMKLQotCSMgUmVhZCB0aGUgLmxhIGZpbGUKLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkYXJnIiBpbgotCSovKiB8ICpcXCopIC4gJGFyZyA7OwotCSopIC4gLi8kYXJnIDs7Ci0JZXNhYwotCi0JIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgotCWxpbmtsaWI9Ci0JZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgbGlua2xpYj0iJGwiCi0JZG9uZQotCi0JaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgotCW5hbWU9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0KLQlpZiB0ZXN0ICJYJGluc3RhbGxlZCIgPSBYeWVzOyB0aGVuCi0JICBkaXI9IiRsaWJkaXIiCi0JZWxzZQotCSAgZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQkgIGlmIHRlc3QgIlgkZGlyIiA9ICJYJGFyZyI7IHRoZW4KLQkgICAgZGlyPSIkb2JqZGlyIgotCSAgZWxzZQotCSAgICBkaXI9IiRkaXIvJG9iamRpciIKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiOyB0aGVuCi0JICAjIEV4dHJhY3QgLVIgYW5kIC1MIGZyb20gZGVwZW5kZW5jeV9saWJzCi0JICB0ZW1wX2RlcGxpYnM9Ci0JICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgIGNhc2UgIiRkZXBsaWIiIGluCi0JICAgIC1SKikgdGVtcF94cnBhdGg9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JCSBjYXNlICIgJHJwYXRoICR4cnBhdGggIiBpbgotCQkgKiIgJHRlbXBfeHJwYXRoICIqKSA7OwotCQkgKikgeHJwYXRoPSIkeHJwYXRoICR0ZW1wX3hycGF0aCI7OwotCQkgZXNhYzs7Ci0JICAgIC1MKikgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAkdGVtcF9kZXBsaWJzICIgaW4KLQkJICoiICRkZXBsaWIgIiopIDs7Ci0JCSAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGRlcGxpYiI7OwotCQkgZXNhYwotCQkgdGVtcF9kaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCi0JCSBjYXNlICIgJGxpYl9zZWFyY2hfcGF0aCAiIGluCi0JCSAqIiAkdGVtcF9kaXIgIiopIDs7Ci0JCSAqKSBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJHRlbXBfZGlyIjs7Ci0JCSBlc2FjCi0JCSA7OwotCSAgICAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGRlcGxpYiI7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX2RlcGxpYnMiCi0JZmkKLQotCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCi0JICBjb252ZW5pZW5jZT0iJGNvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgb2xkX2NvbnZlbmllbmNlPSIkb2xkX2NvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgZGVwbGlicz0iJGRlcGxpYnMkZGVwZW5kZW5jeV9saWJzIgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgotCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fCB0ZXN0ICIkZGxvcGVuIiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAotCSAgICAjIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgcHJldj1kbHByZWZpbGVzCi0JICBlbHNlCi0JICAgICMgV2Ugc2hvdWxkIG5vdCBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoaXMgbGlicmFyeSwgYnV0IHdlCi0JICAgICMgbWF5IG5lZWQgYW55IGxpYnJhcmllcyBpdCByZXF1aXJlcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgZmkKLQlmaQotCi0JIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKLQkgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgotCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQkgIGVsc2UKLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKLQkgIGZpCi0JICBwcmV2PQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKLQkgICB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgotCSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0iJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMgJGFyZyIKLQkgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSAgICAjIE1ha2Ugc3VyZSB0aGUgcnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KLQkgICAgKiIgJGRpciAiKikgOzsKLQkgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQotCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JICBjYXNlICIkZGlyIiBpbgotCSAgW1xcL10gfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKLQkgICopCi0JICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkgICAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBwYXNzaW5nIGl0IGxpdGVyYWxseSB0byB0aGUgbGlua2VyLCBhbHRob3VnaCBpdCBtaWdodCBmYWlsIiAxPiYyCi0JICAgICAgYWJzZGlyPSIkZGlyIgotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCSAgCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0JICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCi0JICAjIHNlYXJjaCBwYXRoLCB1bmxlc3MgdGhleSBoYXZlIGJlZW4gcmVxdWVzdGVkIHdpdGggLVIuCi0JICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAqIiAkYWJzZGlyICIqKSA7OwotCSAgKikKLQkgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIiAKLQkgICAgZXNhYwotCSAgICA7OwotCSAgZXNhYwotCi0JICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikKLQkgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgotCSAgICBlc2FjCi0JICAgIDs7Ci0JICBlc2FjCi0KLQkgIGxpYl9saW5rZWQ9eWVzCi0JICBjYXNlICIkaGFyZGNvZGVfYWN0aW9uIiBpbgotCSAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAkZGlyLyRsaW5rbGliIgotCSAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotCQlkbGxzZWFyY2hkaXI9YGNkICIkZGlyIiAmJiBwd2QgfHwgZWNobyAiJGRpciJgCi0JCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgotCQkgIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkbGxzZWFyY2hkaXIiCi0JCWVsc2UKLQkJICBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNoZGlyIgotCQlmaQotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgotCSAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgICAgICotKi1zdW5vcyopCi0JCWNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgICBlc2FjCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLUwkZGlyIC1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KLQkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KLQkgICAgICAqIjokZGlyOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgbGliX2xpbmtlZD1ubwotCSAgICBmaQotCSAgICA7OwotCi0JICByZWxpbmspCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhYnNkaXIvJGxpbmtsaWIiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgJGFic2Rpci8kbGlua2xpYiIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgICAqIiAtTCRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGFic2RpciI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtTCRhYnNkaXIgLWwkbmFtZSIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KLQkgICAgICAqIjokYWJzZGlyOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWJzZGlyOiI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgbGliX2xpbmtlZD1ubwotCSAgICBmaQotCSAgICA7OwotCi0JICAqKQotCSAgICBsaWJfbGlua2VkPW5vCi0JICAgIDs7Ci0JICBlc2FjCi0KLQkgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKLQkgICAgZXhpdCAxCi0JICBmaQotCi0JICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpYmRpci8kbGlua2xpYiIKLQkgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkbGliZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkgICAgY2FzZSAiOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IiBpbgotCSAgICAqIjokbGliZGlyOiIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBlbHNlCi0JICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZmkKLQllbHNlCi0JICAjIFRyYW5zZm9ybSBkaXJlY3RseSB0byBvbGQgYXJjaGl2ZXMgaWYgd2UgZG9uJ3QgYnVpbGQgbmV3IGxpYnJhcmllcy4KLQkgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgJiYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBzdGF0aWMgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgotCSAgICBleGl0IDEKLQkgIGZpCi0KLQkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAotCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgZWxzZQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIjs7Ci0JICAgIGVzYWMKLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZmkKLQlmaQotCi0JIyBBZGQgaW4gYW55IGxpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzICYmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0gICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgIGZpCi0KLSAgICBvbGRsaWJzPQotICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKLSAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgotCi0gICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAiIikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotCi0gICAgKi5hIHwgKi5saWIpCi0gICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGxpbmsgbGlidG9vbCBsaWJyYXJpZXMgaW50byBhcmNoaXZlcyIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCi0gICAgICA7OwotCi0gICAgKi5sYSkKLSAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KLSAgICAgIGNhc2UgIiRvdXRwdXRuYW1lIiBpbgotICAgICAgbGliKikKLQluYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0JZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSBubzsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCi0JICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCi0JICBuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAotCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JZWxzZQotCSAgbGlibmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIG91dHB1dF9vYmpkaXI9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiWCRvdXRwdXRfb2JqZGlyIiA9ICJYJG91dHB1dCI7IHRoZW4KLQlvdXRwdXRfb2JqZGlyPSIkb2JqZGlyIgotICAgICAgZWxzZQotCW91dHB1dF9vYmpkaXI9IiRvdXRwdXRfb2JqZGlyLyRvYmpkaXIiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzOiRvYmpzIiAyPiYxCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIEhvdyB0aGUgaGVjayBhcmUgd2Ugc3VwcG9zZWQgdG8gd3JpdGUgYSB3cmFwcGVyIGZvciBhIHNoYXJlZCBsaWJyYXJ5PwotICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBzaGFyZWQgbGlicmFyaWVzIGludG8gbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLQkgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIHNldCBkdW1teSAkcnBhdGgKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgotICAgICAgZmkKLSAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKLQotICAgICAgb2xkbGlicz0KLSAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KLQkgIGxpYmV4dD1hbAotCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQotCSAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JZmkKLQlkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWJzIgotCi0JaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotCi0JaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotICAgICAgZWxzZQotCi0JIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KLQlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JwotCXNldCBkdW1teSAkdmluZm8gMCAwIDAKLQlJRlM9IiRzYXZlX2lmcyIKLQotCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQljdXJyZW50PSIkMiIKLQlyZXZpc2lvbj0iJDMiCi0JYWdlPSIkNCIKLQotCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCi0JY2FzZSAiJGN1cnJlbnQiIGluCi0JMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJHJldmlzaW9uIiBpbgotCTAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJGFnZSIgaW4KLQkwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAkYWdlIC1ndCAkY3VycmVudDsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KLQltYWpvcj0KLQl2ZXJzdWZmaXg9Ci0JdmVyc3RyaW5nPQotCWNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCi0Jbm9uZSkgOzsKLQotCWlyaXgpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAotCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgotCSAgdmVyc3RyaW5nPSJzZ2kkbWFqb3IuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kcmV2aXNpb24KLQkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJHJldmlzaW9uIC0gJGxvb3BgCi0JICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotCSAgICB2ZXJzdHJpbmc9InNnaSRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKLQkgIGRvbmUKLQkgIDs7Ci0KLQlsaW51eCkKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlvc2YpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRhZ2UKLQkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgotCSAgZG9uZQotCi0JICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgotCSAgOzsKLQotCXN1bm9zKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlmcmVlYnNkLWFvdXQpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKLQkgIDs7Ci0KLQlmcmVlYnNkLWVsZikKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudCI7Ci0JICA7OwotCi0Jd2luZG93cykKLQkgICMgTGlrZSBMaW51eCwgYnV0IHdpdGggJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seQotCSAgIyB3YW50IG9uZSBleHRlbnNpb24gb24gV2luZG93cyA5NS4KLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iLSRtYWpvci0kYWdlLSRyZXZpc2lvbiIKLQkgIDs7Ci0KLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCi0JICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCi0JaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3RyaW5nPSIwLjAiCi0JICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICAgIHZlcnN1ZmZpeD0KLQkgIGVsc2UKLQkgICAgdmVyc3VmZml4PSIuMC4wIgotCSAgZmkKLQlmaQotCi0JIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCi0JaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3VmZml4PQotCSAgdmVyc3RyaW5nPSIiCi0JZmkKLQkKLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCi0JaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgIGZpCi0JZWxzZQotCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCi0JZmkKLQotCWRlcGVuZGVuY3lfbGlicz0iJGRlcGxpYnMiCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiogfCAqLSotYmVvcyopCi0JICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCi0JICA7OwotCSopCi0JICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMuCi0JICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBvciByZW1vdmUgb3VyIG91dHB1dHMgaWYgd2UgbmVlZCB0by4KLSAgICAgIGlmIHRlc3QgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KLQkkc2hvdyAiJHtybX1yICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKiIKLQkkcnVuICR7cm19ciAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioKLSAgICAgIGVsc2UKLQkkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgotCSRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KLQlvbGRsaWJzPSIkb2xkbGlicyAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCi0JIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgotCW9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KLQluYW1lX3NhdmU9JG5hbWUKLQlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKLQlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKLQl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4Ci0JbWFqb3Jfc2F2ZT0kbWFqb3IKLQkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluawotCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bwotCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PwotCXJlbGVhc2U9IiIKLQl2ZXJzdWZmaXg9IiIKLQltYWpvcj0iIgotCW5ld2RlcGxpYnM9Ci0JZHJvcHBlZGRlcHM9bm8KLQljYXNlICIkZGVwbGlic19jaGVja19tZXRob2QiIGluCi0JcGFzc19hbGwpCi0JICAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KLQkgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKLQkgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KLQkgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAotCSAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3VyLgotCSAgbmV3ZGVwbGlicz0kZGVwbGlicwotCSAgOzsKLQl0ZXN0X2NvbXBpbGUpCi0JICAjIFRoaXMgY29kZSBzdHJlc3NlcyB0aGUgImxpYnJhcmllcyBhcmUgcHJvZ3JhbXMiIHBhcmFkaWdtIHRvIGl0cwotCSAgIyBsaW1pdHMuIE1heWJlIGV2ZW4gYnJlYWtzIGl0LiAgV2UgY29tcGlsZSBhIHByb2dyYW0sIGxpbmtpbmcgaXQKLQkgICMgYWdhaW5zdCB0aGUgZGVwbGlicyBhcyBhIHByb3h5IGZvciB0aGUgbGlicmFyeS4gIFRoZW4gd2UgY2FuIGNoZWNrCi0JICAjIHdoZXRoZXIgdGhleSBsaW5rZWQgaW4gc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIGxkZC4KLQkgICRybSBjb25mdGVzdC5jCi0JICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0JICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLUVPRgotCSAgJHJtIGNvbmZ0ZXN0Ci0JICAkQ0MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGlicwotCSAgaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KLQkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPSJgZXhwciAkaSA6ICctbFwoLipcKSdgIgotCSAgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQlkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAotCQlzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCWRlcGxpYl9tYXRjaD0kMgotCQlpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCWVsc2UKLQkJICBkcm9wcGVkZGVwcz15ZXMKLQkJICBlY2hvCi0JCSAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGkuIgotCQkgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICAjIEVycm9yIG9jY3VyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZSB0aGUgc2l0dWF0aW9uOgotCSAgICAjIENvbXBpbGUgYSBzZXBlcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIG5hbWU9ImBleHByICRpIDogJy1sXCguKlwpJ2AiCi0JICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLQkgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JCSRybSBjb25mdGVzdAotCQkkQ0MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQotCQkjIERpZCBpdCB3b3JrPwotCQlpZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgotCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkJICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCi0JCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCSAgZGVwbGliX21hdGNoPSQyCi0JCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgZWxzZQotCQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgICBlY2hvCi0JCSAgICBlY2hvICIqKiogV2FybmluZzogVGhpcyBsaWJyYXJ5IG5lZWRzIHNvbWUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSAkaS4iCi0JCSAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCi0JCSAgZmkKLQkJZWxzZQotCQkgIGRyb3BwZWRkZXBzPXllcwotCQkgIGVjaG8KLQkJICBlY2hvICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCi0JCSAgZWNobyAiKioqICBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKLQkJICBlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgotCQkgIGVjaG8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCi0JCWZpCi0JICAgICAgZWxzZQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBmaQotCSAgOzsKLQlmaWxlX21hZ2ljKikKLQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKLQkgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcIiQyIFwoLipcKVwiYCIKLQkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgICAgbmFtZT0iYGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AiCi0JICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JICAgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCSAgICAgIGZvciBpIGluICRsaWJfc2VhcmNoX3BhdGg7IGRvCi0JCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJICAgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KLQkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGVudF9saWIiIDI+L2Rldi9udWxsIFwKLQkJCSB8IGdyZXAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KLQkJCWNvbnRpbnVlIAotCQkgICAgICBmaQotCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KLQkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgotCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCi0JCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKLQkJICAgICAgIyBidXQgc28gd2hhdD8KLQkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKLQkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCi0JCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8IHNlZCAncy8uKiAtPiAvLydgCi0JCQljYXNlICIkcG90bGlibGluayIgaW4KLQkJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcG90bGliPSIkcG90bGlibGluayI7OwotCQkJKikgcG90bGliPWAkZWNobyAiWCRwb3RsaWIiIHwgJFhzZWQgLWUgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OwotCQkJZXNhYwotCQkgICAgICBkb25lCi0JCSAgICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCRwb3RsaWJcIiAyPi9kZXYvbnVsbCBcCi0JCQkgfCBzZWQgMTBxIFwKLQkJCSB8IGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJCWFfZGVwbGliPSIiCi0JCQlicmVhayAyCi0JCSAgICAgIGZpCi0JCSAgICBkb25lCi0JICAgICAgZG9uZQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWRyb3BwZWRkZXBzPXllcwotCQllY2hvCi0JCWVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRhX2RlcGxpYi4iCi0JCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCi0JICAgICAgZmkKLQkgICAgZWxzZQotCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCi0JICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCSAgICBmaQotCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KLQkgIDs7Ci0Jbm9uZSB8IHVua25vd24gfCAqKQotCSAgbmV3ZGVwbGlicz0iIgotCSAgaWYgJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAotCSAgICAgICAtZSAncy8gLVtMUl1bXiBdKi8vZycgLWUgJ3MvWyAJXS8vZycgfAotCSAgICAgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KLQkgICAgZWNobwotCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCi0JICAgIGVsc2UKLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgotCSAgICBmaQotCSAgICBlY2hvICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKLQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JICBmaQotCSAgOzsKLQllc2FjCi0JdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQotCW1ham9yPSRtYWpvcl9zYXZlCi0JcmVsZWFzZT0kcmVsZWFzZV9zYXZlCi0JbGlibmFtZT0kbGlibmFtZV9zYXZlCi0JbmFtZT0kbmFtZV9zYXZlCi0KLQlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICBlY2hvCi0JICAgIGVjaG8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgotCSAgICBlY2hvICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKLQkgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCi0JICAgIGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKLQkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgICAgICBlY2hvCi0JICAgICAgZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JICAgICAgZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkgICAgICBlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCi0JICAgICAgZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgICBlbHNlCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCi0JICAgIGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCi0JICAgIGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKLQkgIGZpCi0JZmkKLQkjIERvbmUgY2hlY2tpbmcgZGVwbGlicyEKLQlkZXBsaWJzPSRuZXdkZXBsaWJzCi0gICAgICBmaQotCi0gICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCi0gICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICBkbG5hbWU9Ci0gICAgICAKLSAgICAgICMgVGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCi0JZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JcmVhbG5hbWU9IiQyIgotCXNoaWZ0OyBzaGlmdAotCi0JaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgotCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCWVsc2UKLQkgIHNvbmFtZT0iJHJlYWxuYW1lIgotCWZpCi0KLQlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKLQlmb3IgbGluawotCWRvCi0JICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCi0JZG9uZQotCi0JIyBFbnN1cmUgdGhhdCB3ZSBoYXZlIC5vIG9iamVjdHMgZm9yIGxpbmtlcnMgd2hpY2ggZGlzbGlrZSAubG8KLQkjIChlLmcuIGFpeCkgaW4gY2FzZSB3ZSBhcmUgcnVubmluZyAtLWRpc2FibGUtc3RhdGljCi0JZm9yIG9iaiBpbiAkbGlib2JqczsgZG8KLQkgIHhkaXI9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9iaiI7IHRoZW4KLQkgICAgeGRpcj0iLiIKLQkgIGVsc2UKLQkgICAgeGRpcj0iJHhkaXIiCi0JICBmaQotCSAgYmFzZW9iaj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBvbGRvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIGlmIHRlc3QgISAtZiAkeGRpci8kb2xkb2JqOyB0aGVuCi0JICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJHtMTl9TfSAkYmFzZW9iaiAkb2xkb2JqKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJHhkaXIgJiYgJHtMTl9TfSAkYmFzZW9iaiAkb2xkb2JqKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYwotCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCi0JIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKLQlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKLQkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKLQkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGV2YWwgY21kcz1cIiRleHBvcnRfc3ltYm9sc19jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAgICRzaG93ICJlZ3JlcCAtZSBcIiRleHBvcnRfc3ltYm9sc19yZWdleFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIgPiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIgotCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKLQkgICAgICAkc2hvdyAiJG12IFwiJHtleHBvcnRfc3ltYm9sc31UXCIgXCIkZXhwb3J0X3N5bWJvbHNcIiIKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICRydW4gZXZhbCAnJGVjaG8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJGV4cG9ydF9zeW1ib2xzIicKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgIGVsc2UKLQkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgICAkcnVuICR7cm19ciAiJGdlbnRvcCIKLQkgICAgJHNob3cgIm1rZGlyICRnZW50b3AiCi0JICAgICRydW4gbWtkaXIgIiRnZW50b3AiCi0JICAgIHN0YXR1cz0kPwotCSAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgotCSAgICAgIGV4aXQgJHN0YXR1cwotCSAgICBmaQotCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSAgICBmb3IgeGxpYiBpbiAkY29udmVuaWVuY2U7IGRvCi0JICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgotCSAgICAgIGNhc2UgIiR4bGliIiBpbgotCSAgICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgeGFicz0iJHhsaWIiIDs7Ci0JICAgICAgKikgeGFicz1gcHdkYCIvJHhsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIHhsaWI9YCRlY2hvICJYJHhsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgICB4ZGlyPSIkZ2VudG9wLyR4bGliIgotCi0JICAgICAgJHNob3cgIiR7cm19ciAkeGRpciIKLQkgICAgICAkcnVuICR7cm19ciAiJHhkaXIiCi0JICAgICAgJHNob3cgIm1rZGlyICR4ZGlyIgotCSAgICAgICRydW4gbWtkaXIgIiR4ZGlyIgotCSAgICAgIHN0YXR1cz0kPwotCSAgICAgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR4ZGlyIjsgdGhlbgotCQlleGl0ICRzdGF0dXMKLQkgICAgICBmaQotCSAgICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggJHhhYnMpIgotCSAgICAgICRydW4gZXZhbCAiKGNkIFwkeGRpciAmJiAkQVIgeCBcJHhhYnMpIiB8fCBleGl0ICQ/Ci0KLQkgICAgICBsaWJvYmpzPSIkbGlib2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotCSAgICBkb25lCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKLQkgIGxpbmtvcHRzPSIkbGlua29wdHMgJGZsYWciCi0JZmkKLQotCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgotCWVsc2UKLQkgIGV2YWwgY21kcz1cIiRhcmNoaXZlX2NtZHNcIgotCWZpCi0JSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICAkc2hvdyAiJGNtZCIKLQkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQotCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCi0JZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCi0JICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCi0JICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KLQkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgotCSAgZGxuYW1lPSIkc29uYW1lIgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgICoubG8gfCAqLm8gfCAqLm9iaikKLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBsaWJ0b29sIGxpYnJhcmllcyBpbnRvIG9iamVjdHMiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICAgKi5sbykKLQlpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQlsaWJvYmo9IiRvdXRwdXQiCi0Jb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQk7OwotICAgICAgKikKLQlsaWJvYmo9Ci0Jb2JqPSIkb3V0cHV0IgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotCi0gICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKLSAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCi0gICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQotICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KLSAgICAgIHJlbG9hZF9jb252X29ianM9Ci0gICAgICBnZW50b3A9Ci0gICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgotICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotICAgICAgd2w9IAotCi0gICAgICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCByZWxvYWRfY29udl9vYmpzPVwiXCRyZWxvYWRfb2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCWVsc2UKLQkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKLQkgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICRydW4gJHtybX1yICIkZ2VudG9wIgotCSAgJHNob3cgIm1rZGlyICRnZW50b3AiCi0JICAkcnVuIG1rZGlyICIkZ2VudG9wIgotCSAgc3RhdHVzPSQ/Ci0JICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgotCSAgICBleGl0ICRzdGF0dXMKLQkgIGZpCi0JICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSAgZm9yIHhsaWIgaW4gJGNvbnZlbmllbmNlOyBkbwotCSAgICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0JICAgIGNhc2UgIiR4bGliIiBpbgotCSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHhhYnM9IiR4bGliIiA7OwotCSAgICAqKSB4YWJzPWBwd2RgIi8keGxpYiIgOzsKLQkgICAgZXNhYwotCSAgICB4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgIHhkaXI9IiRnZW50b3AvJHhsaWIiCi0KLQkgICAgJHNob3cgIiR7cm19ciAkeGRpciIKLQkgICAgJHJ1biAke3JtfXIgIiR4ZGlyIgotCSAgICAkc2hvdyAibWtkaXIgJHhkaXIiCi0JICAgICRydW4gbWtkaXIgIiR4ZGlyIgotCSAgICBzdGF0dXM9JD8KLQkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JICAgICAgZXhpdCAkc3RhdHVzCi0JICAgIGZpCi0JICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggJHhhYnMpIgotCSAgICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggXCR4YWJzKSIgfHwgZXhpdCAkPwotCi0JICAgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotCSAgZG9uZQotCWZpCi0gICAgICBmaQotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiCi0KLSAgICAgIG91dHB1dD0iJG9iaiIKLSAgICAgIGV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KLSAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KLQkgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkgICRydW4gJHtybX1yICRnZW50b3AKLQlmaQotCi0JZXhpdCAwCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgotCSAgJHJ1biAke3JtfXIgJGdlbnRvcAotCWZpCi0KLQkjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkb24ndAotCSMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0JJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLQkkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPwotCWV4aXQgMAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCi0JcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgotCW91dHB1dD0iJGxpYm9iaiIKLQlldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotCUlGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0gICAgICBlbHNlCi0JIyBKdXN0IGNyZWF0ZSBhIHN5bWxpbmsuCi0JJHNob3cgJHJtICRsaWJvYmoKLQkkcnVuICRybSAkbGlib2JqCi0JeGRpcj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGxpYm9iaiI7IHRoZW4KLQkgIHhkaXI9Ii4iCi0JZWxzZQotCSAgeGRpcj0iJHhkaXIiCi0JZmkKLQliYXNlb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQlvbGRvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkkc2hvdyAiKGNkICR4ZGlyICYmICRMTl9TICRvbGRvYmogJGJhc2VvYmopIgotCSRydW4gZXZhbCAnKGNkICR4ZGlyICYmICRMTl9TICRvbGRvYmogJGJhc2VvYmopJyB8fCBleGl0ICQ/Ci0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSRzaG93ICIke3JtfXIgJGdlbnRvcCIKLQkkcnVuICR7cm19ciAkZ2VudG9wCi0gICAgICBmaQotCi0gICAgICBleGl0IDAKLSAgICAgIDs7Ci0KLSAgICAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KLSAgICAqKQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkZGxvcGVuIiA9IHVua25vd24gJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gJiYKLQkgICB0ZXN0ICIkZGxvcGVuX3NlbGZfc3RhdGljIiA9IHVua25vd247IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgQUNfTElCVE9PTF9ETE9QRU4nIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCi0JZmkgCi0gICAgICBmaQotICAgIAotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KLQkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KLQkgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRmaW5hbGl6ZV9wZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9wZXJtX3JwYXRoPSIkZmluYWxpemVfcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0gICAgICBmaQotICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgotCW91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCi0gICAgICBlbHNlCi0Jb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBiaW5hcnkgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnksIHRoZW4gd3JhcCBpdC4KLSAgICAgIGlmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCi0JJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvdXRwdXRfb2JqZGlyOyB0aGVuCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBkbHN5bXM9Ci0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCWlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgIGRsc3ltcz0iJHtvdXRwdXRuYW1lfVMuYyIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KLQljYXNlICIkZGxzeW1zIiBpbgotCSIiKSA7OwotCSouYykKLQkgICMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCi0JICBubGlzdD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfS5ubSIKLQotCSAgJHNob3cgIiRybSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKLQkgICRydW4gJHJtICIkbmxpc3QiICIke25saXN0fVMiICIke25saXN0fVQiCi0KLQkgICMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCi0JICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQotCSAgdGVzdCAteiAiJHJ1biIgJiYgJGVjaG8gPiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLS8qICRkbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkb3V0cHV0bmFtZScgZGxzeW0gZW11bGF0aW9uLiAqLwotLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiBcIkNcIiB7Ci0jZW5kaWYKLQotLyogUHJldmVudCB0aGUgb25seSBraW5kIG9mIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3ZSBjYW4gbWFrZS4gKi8KLSNkZWZpbmUgbHRfcHJlbG9hZGVkX3N5bWJvbHMgc29tZV9vdGhlcl9zeW1ib2wKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKLSIKLQotCSAgaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCi0KLQkgICAgdGVzdCAteiAiJHJ1biIgJiYgJGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgotCi0JICAgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KLQkgICAgcHJvZ2ZpbGVzPWAkZWNobyAiWCRvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JICAgIGZvciBhcmcgaW4gJHByb2dmaWxlczsgZG8KLQkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKLQkgICAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgICAgZG9uZQotCi0JICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICdlZ3JlcCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgICAgCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQotCSAgICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCSAgICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXQuZXhwIgotCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICAgICRydW4gZXZhbCAic2VkIC1uIC1lICcvXjogQFBST0dSQU1AJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZWxzZQotCSAgICAgICRydW4gZXZhbCAic2VkIC1lICdzL1woW11bLipeJF1cKS9cXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0LmV4cCInCi0JICAgICAgJHJ1biBldmFsICdncmVwIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0LmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICBuYW1lPWBlY2hvICIkYXJnIiB8IHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAkcnVuIGV2YWwgJ2VjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKLQkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KLQkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgIGVncmVwIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKLQkgICAgICAkbXYgIiRubGlzdCJUICIkbmxpc3QiCi0JICAgIGZpCi0KLQkgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgICAgaWYgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiIHwgc29ydCArMiB8IHVuaXEgPiAiJG5saXN0IlM7IHRoZW4KLQkgICAgICA6Ci0JICAgIGVsc2UKLQkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJwotCSAgICBlbHNlCi0JICAgICAgZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0KLSN1bmRlZiBsdF9wcmVsb2FkZWRfc3ltYm9scwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17XAotIgotCi0JICAgIHNlZCAtbiAtZSAncy9eOiBcKFteIF0qXCkgJC8gIHtcIlwxXCIsIChsdF9wdHJfdCkgMH0sL3AnIFwKLQkJLWUgJ3MvXi4gXChbXiBdKlwpIFwoW14gXSpcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvcCcgXAotCQkgIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0vKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KLSNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKLXN0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7Ci0gIHJldHVybiBsdF9wcmVsb2FkZWRfc3ltYm9sczsKLX0KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZlwKLSIKLQkgIGZpCi0KLQkgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0KLQkgIGNhc2UgIiRob3N0IiBpbgotCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCi0JICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKLQkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKLQkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgotCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KLQkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikNCi0JICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtc3RhdGljICIqKSA7OwotCSAgICAqKSBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURQSUMgLURGUkVFQlNEX1dPUktBUk9VTkQiOzsKLQkgICAgZXNhYzs7Ci0JICAqLSotaHB1eCopCi0JICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtc3RhdGljICIqKSA7OwotCSAgICAqKSBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURQSUMiOzsKLQkgICAgZXNhYwotCSAgZXNhYwotCi0JICAjIE5vdyBjb21waWxlIHRoZSBkeW5hbWljIHN5bWJvbCBmaWxlLgotCSAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkQ0MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCi0JICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkQ0MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/Ci0KLQkgICMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQkgICRzaG93ICIkcm0gJG91dHB1dF9vYmpkaXIvJGRsc3ltcyAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKLQkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgotCi0JICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgotCSAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAotCSAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCi0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLSAgICAgIGVsc2UKLQkjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bwotCSMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKLQkjIHJlYWxseSB3YXMgcmVxdWlyZWQuCi0KLQkjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQotCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgotCSRzaG93ICIkbGlua19jb21tYW5kIgotCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIKLQlzdGF0dXM9JD8KLQkKLQkjIERlbGV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLgotCWlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0JICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSIKLQkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCi0JZmkKLQotCWV4aXQgJHN0YXR1cwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCi0JcnBhdGg9Ci0JZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KLQkgIGNhc2UgIiRkaXIiIGluCi0JICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopCi0JICAgICMgQWJzb2x1dGUgcGF0aC4KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgICA7OwotCSAgKikKLQkgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgotCSAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQl0ZW1wX3JwYXRoPSIkcnBhdGgiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICBmaQotCi0gICAgICBjb21waWxlX3Zhcj0KLSAgICAgIGZpbmFsaXplX3Zhcj0KLSAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLQkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iIDE+JjIKLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgotCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCVcJHByb2dkaXIvXCRmaWxlJWcnYAotCSAgZWxzZQotCSAgICAjIGZhc3RfaW5zdGFsbCBpcyBzZXQgdG8gbmVlZGxlc3MKLQkgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICBmaQotCWVsc2UKLQkgIGxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCSAgcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotICAgICAgbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAotICAgICAgCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlcy4KLSAgICAgICRydW4gJHJtICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKLQotICAgICAgJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0gICAgICAkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KLQotICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGZpCi0KLSAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgotICAgICAgaWYgdGVzdCAiWCRlY2hvIiA9ICJYJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLQljYXNlICIkMCIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHFlY2hvPSIkU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjs7Ci0JKikgcWVjaG89IiRTSEVMTCBgcHdkYC8kMCAtLWZhbGxiYWNrLWVjaG8iOzsKLQllc2FjCi0JcWVjaG89YCRlY2hvICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGVsc2UKLQlxZWNobz1gJGVjaG8gIlgkZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG91ciBydW4gY29tbWFuZCBpcyBub24tbnVsbC4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JIyB3aW4zMiB3aWxsIHRoaW5rIHRoZSBzY3JpcHQgaXMgYSBiaW5hcnkgaWYgaXQgaGFzCi0JIyBhIC5leGUgc3VmZml4LCBzbyB3ZSBzdHJpcCBpdCBvZmYgaGVyZS4KLQljYXNlICRvdXRwdXQgaW4KLQkgICouZXhlKSBvdXRwdXQ9YGVjaG8gJG91dHB1dHxzZWQgJ3MsLmV4ZSQsLCdgIDs7Ci0JZXNhYwotCSRybSAkb3V0cHV0Ci0JdHJhcCAiJHJtICRvdXRwdXQ7IGV4aXQgMSIgMSAyIDE1Ci0KLQkkZWNobyA+ICRvdXRwdXQgIlwKLSMhICRTSEVMTAotCi0jICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotIwotIyBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKLSMgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgotIwotIyBUaGlzIHdyYXBwZXIgc2NyaXB0IHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLSMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0IFwiXCR7Q0RQQVRIK3NldH1cIiA9IHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKLQotcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgotCi0jIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCi1pZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKLSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0nJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMnCi1lbHNlCi0gICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KLSAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgIGVjaG89XCIkcWVjaG9cIgotICAgIGZpbGU9XCJcJDBcIgotICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCi0gICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gICAgICBzaGlmdAotICAgIGVsaWYgdGVzdCBcIlhcYChcJGVjaG8gJ1x0JykgMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KLSAgICAgICMgWWlwcGVlLCBcJGVjaG8gd29ya3MhCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJGVjaG8gd2lsbCB3b3JrLgotICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9Ci0gICAgZmkKLSAgZmlcCi0iCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCi0gIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCi0gIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KLQotICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KLSAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCi0gIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKLQotICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KLSAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCi0gICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KLSAgICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7Ci0gICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLQotICAgIGZpbGU9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCi0gICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAotICBkb25lCi0KLSAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KLSAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAotICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgotIgotCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgIGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZScKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSAgCi0gIGlmIHRlc3QgISAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiB8fCBcXAotICAgICB7IGZpbGU9XGBscyAtMWR0IFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwiXCRwcm9nZGlyLy4uL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHwgc2VkIDFxXGA7IFxcCi0gICAgICAgdGVzdCBcIlhcJGZpbGVcIiAhPSBcIlhcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH07IHRoZW4KLQotICAgIGZpbGU9XCJcJFwkLVwkcHJvZ3JhbVwiCi0KLSAgICBpZiB0ZXN0ICEgLWQgXCJcJHByb2dkaXJcIjsgdGhlbgotICAgICAgJG1rZGlyIFwiXCRwcm9nZGlyXCIKLSAgICBlbHNlCi0gICAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgICBmaSIKLQotCSAgZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQotICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KLSAgICAgIGlmIChjZCBcIlwkdGhpc2RpclwiICYmIGV2YWwgXCRyZWxpbmtfY29tbWFuZCk7IHRoZW4gOgotICAgICAgZWxzZQotCSRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotCWV4aXQgMQotICAgICAgZmkKLSAgICBmaQotCi0gICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8Ci0gICAgeyAkcm0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7Ci0gICAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KLSAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgZmkiCi0JZWxzZQotCSAgZWNobyA+PiAkb3V0cHV0ICJcCi0gIHByb2dyYW09JyRvdXRwdXRuYW1lJwotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotIgotCWZpCi0KLQllY2hvID4+ICRvdXRwdXQgIlwKLQotICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgotCi0JIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCi0JaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgotCi0gICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCi0gICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKLSAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAotCi0gICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCi0iCi0JZmkKLQotCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCi0JaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKLSAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAotIgotCWZpCi0KLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KLSIKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cgfCAqLSotb3MyKikKLQkgICMgd2luMzIgc3lzdGVtcyBuZWVkIHRvIHVzZSB0aGUgcHJvZyBwYXRoIGZvciBkbGwKLQkgICMgbG9va3VwIHRvIHdvcmsKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIGV4ZWMgXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCSopCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICAjIEV4cG9ydCB0aGUgcGF0aCB0byB0aGUgcHJvZ3JhbS4KLSAgICAgIFBBVEg9XCJcJHByb2dkaXI6XCRQQVRIXCIKLSAgICAgIGV4cG9ydCBQQVRICi0KLSAgICAgIGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0JZXNhYwotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZWxzZQotICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KLSAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcJHByb2dkaXIvXCRwcm9ncmFtIGRvZXMgbm90IGV4aXN0XCIgMT4mMgotICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgotICAgIGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmlcCi0iCi0JY2htb2QgK3ggJG91dHB1dAotICAgICAgZmkKLSAgICAgIGV4aXQgMAotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiB3ZSBuZWVkIHRvIGJ1aWxkIGFuIG9sZC1mYXNoaW9uZWQgYXJjaGl2ZS4KLSAgICBmb3Igb2xkbGliIGluICRvbGRsaWJzOyBkbwotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IGNvbnZlbmllbmNlOyB0aGVuCi0Jb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQlhZGRsaWJzPSIkY29udmVuaWVuY2UiCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBtb2R1bGU7IHRoZW4KLQkgIG9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQllbHNlCi0JICBvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianNfc2F2ZSIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JZmkKLQlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCi0JZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKLQkkc2hvdyAiJHtybX1yICRnZW50b3AiCi0JJHJ1biAke3JtfXIgIiRnZW50b3AiCi0JJHNob3cgIm1rZGlyICRnZW50b3AiCi0JJHJ1biBta2RpciAiJGdlbnRvcCIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLQlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQkgIAotCSMgQWRkIGluIG1lbWJlcnMgZnJvbSBjb252ZW5pZW5jZSBhcmNoaXZlcy4KLQlmb3IgeGxpYiBpbiAkYWRkbGliczsgZG8KLQkgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLQkgIGNhc2UgIiR4bGliIiBpbgotCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSB4YWJzPSIkeGxpYiIgOzsKLQkgICopIHhhYnM9YHB3ZGAiLyR4bGliIiA7OwotCSAgZXNhYwotCSAgeGxpYj1gJGVjaG8gIlgkeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgeGRpcj0iJGdlbnRvcC8keGxpYiIKLQotCSAgJHNob3cgIiR7cm19ciAkeGRpciIKLQkgICRydW4gJHtybX1yICIkeGRpciIKLQkgICRzaG93ICJta2RpciAkeGRpciIKLQkgICRydW4gbWtkaXIgIiR4ZGlyIgotCSAgc3RhdHVzPSQ/Ci0JICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkeGRpciI7IHRoZW4KLQkgICAgZXhpdCAkc3RhdHVzCi0JICBmaQotCSAgJHNob3cgIihjZCAkeGRpciAmJiAkQVIgeCAkeGFicykiCi0JICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggXCR4YWJzKSIgfHwgZXhpdCAkPwotCi0JICBvbGRvYmpzPSIkb2xkb2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCouJHtvYmpleHR9IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc1wiCi0gICAgICBlbHNlCi0JIyBFbnN1cmUgdGhhdCB3ZSBoYXZlIC5vIG9iamVjdHMgaW4gcGxhY2UgaW4gY2FzZSB3ZSBkZWNpZGVkCi0JIyBub3QgdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeSwgYW5kIGhhdmUgZmFsbGVuIGJhY2sgdG8gYnVpbGRpbmcKLQkjIHN0YXRpYyBsaWJzIGV2ZW4gdGhvdWdoIC0tZGlzYWJsZS1zdGF0aWMgd2FzIHBhc3NlZCEKLQlmb3Igb2xkb2JqIGluICRvbGRvYmpzOyBkbwotCSAgaWYgdGVzdCAhIC1mICRvbGRvYmo7IHRoZW4KLQkgICAgeGRpcj1gJGVjaG8gIlgkb2xkb2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JICAgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRvbGRvYmoiOyB0aGVuCi0JICAgICAgeGRpcj0iLiIKLQkgICAgZWxzZQotCSAgICAgIHhkaXI9IiR4ZGlyIgotCSAgICBmaQotCSAgICBiYXNlb2JqPWAkZWNobyAiWCRvbGRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgICAgb2JqPWAkZWNobyAiWCRiYXNlb2JqIiB8ICRYc2VkIC1lICIkbzJsbyJgCi0JICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJHtMTl9TfSAkb2JqICRiYXNlb2JqKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJHhkaXIgJiYgJHtMTl9TfSAkb2JqICRiYXNlb2JqKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0gICAgICBmaQotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZ2VuZXJhdGVkIjsgdGhlbgotICAgICAgJHNob3cgIiR7cm19ciRnZW5lcmF0ZWQiCi0gICAgICAkcnVuICR7cm19ciRnZW5lcmF0ZWQKLSAgICBmaQotCi0gICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAqLmxhKQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS4kbGliZXh0IgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JdGVtcF94cnBhdGg9Ci0JZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbwotCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCi0JZG9uZQotCWRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCi0gICAgICBmaQotCi0gICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JZm9yIGluc3RhbGxlZCBpbiBubyB5ZXM7IGRvCi0JICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IHllczsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9saWJkaXIiOyB0aGVuCi0JICAgICAgYnJlYWsKLQkgICAgZmkKLQkgICAgb3V0cHV0PSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSJpCi0JICBmaQotCSAgJHJtICRvdXRwdXQKLQkgICRlY2hvID4gJG91dHB1dCAiXAotIyAkb3V0cHV0bmFtZSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAotIwotIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCi0jIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KLQotIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCi1kbG5hbWU9JyRkbG5hbWUnCi0KLSMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgotbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgotb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKLQotIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi1kZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCi0KLSMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCi1jdXJyZW50PSRjdXJyZW50Ci1hZ2U9JGFnZQotcmV2aXNpb249JHJldmlzaW9uCi0KLSMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PwotaW5zdGFsbGVkPSRpbnN0YWxsZWQKLQotIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgotbGliZGlyPSckaW5zdGFsbF9saWJkaXInXAotIgotCWRvbmUKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gYSBzeW1ib2xpYyBsaW5rIHNvIHRoYXQgdGhlIGxpYnRvb2wgYXJjaGl2ZSBjYW4gYmUgZm91bmQgaW4KLSAgICAgICMgTERfTElCUkFSWV9QQVRIIGJlZm9yZSB0aGUgcHJvZ3JhbSBpcyBpbnN0YWxsZWQuCi0gICAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSkiCi0gICAgICAkcnVuIGV2YWwgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIiB8fCBleGl0ICQ/Ci0gICAgICA7OwotICAgIGVzYWMKLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBpbnN0YWxsIG1vZGUKLSAgaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBpbnN0YWxsIgotCi0gICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgc2goMSkgYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgotICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCIgfHwgdGVzdCAiJG5vbm9wdCIgPSAvYmluL3NoOyB0aGVuCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgIGVsc2UKLSAgICAgIGluc3RhbGxfcHJvZz0KLSAgICAgIGFyZz0iJG5vbm9wdCIKLSAgICBmaQotCi0gICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgotICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAiJGFyZyIgaW4KLSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLSAgICAgIGFyZz0iXCIkYXJnXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2ckYXJnIgotCi0gICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgotICAgIGRlc3Q9Ci0gICAgZmlsZXM9Ci0gICAgb3B0cz0KLSAgICBwcmV2PQotICAgIGluc3RhbGxfdHlwZT0KLSAgICBpc2Rpcj1ubwotICAgIHN0cmlwbWU9Ci0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KLQlmaWxlcz0iJGZpbGVzICRkZXN0IgotCWRlc3Q9IiRhcmciCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtZCkgaXNkaXI9eWVzIDs7Ci0gICAgICAtZikgcHJldj0iLWYiIDs7Ci0gICAgICAtZykgcHJldj0iLWciIDs7Ci0gICAgICAtbSkgcHJldj0iLW0iIDs7Ci0gICAgICAtbykgcHJldj0iLW8iIDs7Ci0gICAgICAtcykKLQlzdHJpcG1lPSIgLXMiCi0JY29udGludWUKLQk7OwotICAgICAgLSopIDs7Ci0KLSAgICAgICopCi0JIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgotCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotCSAgcHJldj0KLQllbHNlCi0JICBkZXN0PSIkYXJnIgotCSAgY29udGludWUKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IG5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIiAxPiYyCi0gICAgICBlbHNlCi0JJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIiAxPiYyCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCi0gICAgZGVzdD1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvJCUlJ2AKLQotICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgotICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKLSAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCi0gICAgICBkZXN0ZGlyPSIkZGVzdCIKLSAgICAgIGRlc3RuYW1lPQotICAgIGVsc2UKLSAgICAgIGRlc3RkaXI9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRkZXN0IiAmJiBkZXN0ZGlyPS4KLSAgICAgIGRlc3RuYW1lPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KLSAgICAgIHNldCBkdW1teSAkZmlsZXMKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgZmkKLSAgICBjYXNlICIkZGVzdGRpciIgaW4KLSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7Ci0gICAgKikKLSAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQljYXNlICIkZmlsZSIgaW4KLQkqLmxvKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgc3RhdGljbGlicz0KLSAgICBmdXR1cmVfbGliZGlycz0KLSAgICBjdXJyZW50X2xpYmRpcnM9Ci0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCi0gICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAqLmEgfCAqLmxpYikKLQkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgotCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JbGlicmFyeV9uYW1lcz0KLQlvbGRfbGlicmFyeT0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkZmlsZSIgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgotCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCi0JICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQllbHNlCi0JICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCi0JICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCi0JZGlyPSJgJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8iCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZS8iICYmIGRpcj0KLQlkaXI9IiRkaXIkb2JqZGlyIgotCi0JIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KLQkgIHJlYWxuYW1lPSIkMiIKLQkgIHNoaWZ0Ci0JICBzaGlmdAotCi0JICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kcmVhbG5hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/Ci0KLQkgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLQkgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcywgYW5kIGNyZWF0ZSBuZXcgb25lcy4KLQkgICAgZm9yIGxpbmtuYW1lCi0JICAgIGRvCi0JICAgICAgaWYgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIjsgdGhlbgotCQkkc2hvdyAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0JCSRydW4gZXZhbCAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZmkKLQotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCi0JICBldmFsIGNtZHM9XCIkcG9zdGluc3RhbGxfY21kc1wiCi0JICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICRzaG93ICIkY21kIgotCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCWZpCi0KLQkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KLQluYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQotCSRzaG93ICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIKLQkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiB8fCBleGl0ICQ/Ci0KLQkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCi0JdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgotCi0JIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0JZWxzZQotCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JY2FzZSAiJGRlc3RmaWxlIiBpbgotCSoubG8pCi0JICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgOzsKLQkqLm8gfCAqLm9iaikKLQkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKLQkgIGRlc3RmaWxlPQotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgotCWlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQkgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPwotCWZpCi0JZXhpdCAwCi0JOzsKLQotICAgICAgKikKLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLQlmaQotCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KLQkgIHJlbGlua19jb21tYW5kPQotCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgIiRmaWxlIiBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KLQkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgotCSAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCRmaWxlJyIgMT4mMgotCSAgICBleGl0IDEKLQkgIGZpCi0KLQkgIGZpbmFsaXplPXllcwotCSAgZm9yIGxpYiBpbiAkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGliczsgZG8KLQkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgotCSAgICBsaWJkaXI9Ci0JICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICAgICAgY2FzZSAiJGxpYiIgaW4KLQkgICAgICAqLyogfCAqXFwqKSAuICRsaWIgOzsKLQkgICAgICAqKSAuIC4vJGxpYiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgbGliZmlsZT0iJGxpYmRpci9gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCIKLQkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgotCSAgICAgIGZpbmFsaXplPW5vCi0JICAgIGZpCi0JICBkb25lCi0KLQkgIG91dHB1dG5hbWU9Ci0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllcyAmJiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgICAgIHRtcGRpcj0iL3RtcCIKLQkgICAgICB0ZXN0IC1uICIkVE1QRElSIiAmJiB0bXBkaXI9IiRUTVBESVIiCi0JICAgICAgdG1wZGlyPSIkdG1wZGlyL2xpYnRvb2wtJCQiCi0JICAgICAgaWYgJG1rZGlyIC1wICIkdG1wZGlyIiAmJiBjaG1vZCA3MDAgIiR0bXBkaXIiOyB0aGVuIDoKLQkgICAgICBlbHNlCi0JCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgXGAkdG1wZGlyJyIgMT4mMgotCQljb250aW51ZQotCSAgICAgIGZpCi0JICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKLQkgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKLQotCSAgICAgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCi0JICAgICAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKLQkgICAgICBlbHNlCi0JCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgotCQkke3JtfXIgIiR0bXBkaXIiCi0JCWNvbnRpbnVlCi0JICAgICAgZmkKLQkgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZSciIDE+JjIKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgotCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAotCSAgZmkKLQlmaQotCi0JJHNob3cgIiRpbnN0YWxsX3Byb2ckc3RyaXBtZSAkZmlsZSAkZGVzdGZpbGUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JdGVzdCAtbiAiJG91dHB1dG5hbWUiICYmICR7cm19ciAiJHRtcGRpciIKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbwotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCi0gICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgotCi0gICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkb2xkbGliIgotICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgfHwgZXhpdCAkPwotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3RpbnN0YWxsX2NtZHNcIgotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIiAxPiYyCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCi0gICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgotICAgICAgdGVzdCAtbiAiJHJ1biIgJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgotICAgICAgZXhlYyAkU0hFTEwgJDAgLS1maW5pc2gkY3VycmVudF9saWJkaXJzCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZmluaXNoIG1vZGUKLSAgZmluaXNoKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGZpbmlzaCIKLSAgICBsaWJkaXJzPSIkbm9ub3B0IgotICAgIGFkbWluY21kcz0KLQotICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCi0gICAgICBmb3IgZGlyCi0gICAgICBkbwotCWxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCi0gICAgICBkb25lCi0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KLQkgIGV2YWwgY21kcz1cIiRmaW5pc2hfY21kc1wiCi0JICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICRzaG93ICIkY21kIgotCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcwotICAgICAgICRjbWQiCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KLQkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KLQkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCi0JICAkcnVuIGV2YWwgIiRjbWRzIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSAgICAgICAkY21kcyIKLQlmaQotICAgICAgZG9uZQotICAgIGZpCi0KLSAgICAjIEV4aXQgaGVyZSBpZiB0aGV5IHdhbnRlZCBzaWxlbnQgbW9kZS4KLSAgICB0ZXN0ICIkc2hvdyIgPSA6ICYmIGV4aXQgMAotCi0gICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICBlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCi0gICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLSAgICAgIGVjaG8gIiAgICRsaWJkaXIiCi0gICAgZG9uZQotICAgIGVjaG8KLSAgICBlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKLSAgICBlY2hvICJpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCB5b3UgbXVzdCBlaXRoZXIgdXNlIGxpYnRvb2wsIGFuZCIKLSAgICBlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgXGAtTExJQkRJUiciCi0gICAgZWNobyAiZmxhZyBkdXJpbmcgbGlua2luZyBhbmQgZG8gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6IgotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkcnVucGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgbGliZGlyPUxJQkRJUgotICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0gICAgICBlY2hvICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgcnVuIHRoZXNlIGNvbW1hbmRzOiRhZG1pbmNtZHMiCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgotICAgICAgZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCi0gICAgZmkKLSAgICBlY2hvCi0gICAgZWNobyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCi0gICAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCi0gICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBleGVjdXRlIG1vZGUKLSAgZXhlY3V0ZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBleGVjdXRlIgotCi0gICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KLSAgICBjbWQ9IiRub25vcHQiCi0gICAgaWYgdGVzdCAteiAiJGNtZCI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KLSAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbwotICAgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSBmaWxlIiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBkaXI9Ci0gICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KLQlkbG5hbWU9Ci0JbGlicmFyeV9uYW1lcz0KLQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgIiRmaWxlIiBpbgotCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkqKSAuIC4vJGZpbGUgOzsKLQllc2FjCi0KLQkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KLQlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgotCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgotCSAgY29udGludWUKLQlmaQotCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLQotCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgotCSAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotCTs7Ci0KLSAgICAgICopCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZyBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIgMT4mMgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBHZXQgdGhlIGFic29sdXRlIHBhdGhuYW1lLgotICAgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAotICAgICAgdGVzdCAtbiAiJGFic2RpciIgJiYgZGlyPSIkYWJzZGlyIgotCi0gICAgICAjIE5vdyBhZGQgdGhlIGRpcmVjdG9yeSB0byBzaGxpYnBhdGhfdmFyLgotICAgICAgaWYgZXZhbCAidGVzdCAteiBcIlwkJHNobGlicGF0aF92YXJcIiI7IHRoZW4KLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyXCIiCi0gICAgICBlbHNlCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpcjpcJCRzaGxpYnBhdGhfdmFyXCIiCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgc2hsaWJwYXRoX3ZhcgotICAgICMgcmF0aGVyIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KLSAgICBsaWJ0b29sX2V4ZWN1dGVfbWFnaWM9IiRtYWdpYyIKLQotICAgICMgQ2hlY2sgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgYSB3cmFwcGVyIHNjcmlwdC4KLSAgICBhcmdzPQotICAgIGZvciBmaWxlCi0gICAgZG8KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgLSopIDs7Ci0gICAgICAqKQotCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLQlpZiAoc2VkIC1lICc0cScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAiJGZpbGUiIGluCi0JICAqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JICAqKSAuIC4vJGZpbGUgOzsKLQkgIGVzYWMKLQotCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KLQkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgotCWZpCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCi0gICAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGFyZ3M9IiRhcmdzIFwiJGZpbGVcIiIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAgICMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgotICAgICAgICBldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICBmaQotCi0gICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbWVudCB2YXJpYWJsZXMKLSAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLQlMQ19BTEw9IiRzYXZlX0xDX0FMTCI7IGV4cG9ydCBMQ19BTEwKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIke3NhdmVfTEFORytzZXR9IiA9IHNldDsgdGhlbgotCUxBTkc9IiRzYXZlX0xBTkciOyBleHBvcnQgTEFORwotICAgICAgZmkKLQotICAgICAgIyBOb3cgYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KLSAgICAgIGV2YWwgImV4ZWMgXCRjbWQkYXJncyIKLQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGV4ZWMgXCRjbWQkYXJncyIKLSAgICAgIGV4aXQgMQotICAgIGVsc2UKLSAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICAgZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgICAgJGVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLSAgICAgIGZpCi0gICAgICAkZWNobyAiJGNtZCRhcmdzIgotICAgICAgZXhpdCAwCi0gICAgZmkKLSAgICA7OwotCi0gICMgbGlidG9vbCB1bmluc3RhbGwgbW9kZQotICB1bmluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogdW5pbnN0YWxsIgotICAgIHJtPSIkbm9ub3B0IgotICAgIGZpbGVzPQotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKLSAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLSAgICAgIGRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgcm1maWxlcz0iJGZpbGUiCi0KLSAgICAgIGNhc2UgIiRuYW1lIiBpbgotICAgICAgKi5sYSkKLQkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCi0JaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAuICRkaXIvJG5hbWUKLQotCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KLQkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRuIgotCSAgZG9uZQotCSAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQotCSAgJHNob3cgIiRybSAkcm1maWxlcyIKLQkgICRydW4gJHJtICRybWZpbGVzCi0KLQkgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotCSAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgZXZhbCBjbWRzPVwiJHBvc3R1bmluc3RhbGxfY21kc1wiCi0JICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIgotCSAgICBkb25lCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgZmkKLQotCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICBmaQotCi0JICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgb2xkb2JqPWAkZWNobyAiWCRuYW1lIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRvYmoiCi0JZmkKLQkkc2hvdyAiJHJtICRybWZpbGVzIgotCSRydW4gJHJtICRybWZpbGVzCi0JOzsKLQotICAgICAgKikKLQkkc2hvdyAiJHJtICRybWZpbGVzIgotCSRydW4gJHJtICRybWZpbGVzCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAiIikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERSIgMT4mMgotICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLSAgZXNhYwotCi0gICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKLSAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKLSAgZXhpdCAxCi1maSAjIHRlc3QgLXogIiRzaG93X2hlbHAiCi0KLSMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgotY2FzZSAiJG1vZGUiIGluCi0iIikgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gW01PREUtQVJHXS4uLgotCi1Qcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLQotICAgIC0tY29uZmlnICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCi0gICAgLS1kZWJ1ZyAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZwotLW4sIC0tZHJ5LXJ1biAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCi0gICAgLS1mZWF0dXJlcyAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gICAgLS1maW5pc2ggICAgICAgICAgc2FtZSBhcyBcYC0tbW9kZT1maW5pc2gnCi0gICAgLS1oZWxwICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAgIC0tbW9kZT1NT0RFICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFIFtkZWZhdWx0PWluZmVycmVkIGZyb20gTU9ERS1BUkdTXQotICAgIC0tcXVpZXQgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKLSAgICAtLXNpbGVudCAgICAgICAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCi0gICAgLS12ZXJzaW9uICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgotCi1NT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0gICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KLSAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKLSAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQotCi1NT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKLWEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLiIKLSAgZXhpdCAwCi0gIDs7Ci0KLWNvbXBpbGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCi0KLUNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCi0gIC1zdGF0aWMgICAgICAgICAgIGFsd2F5cyBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCi0KLUNPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCi1mcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgotCi1UaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KLVNPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQotbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgotICA7OwotCi1leGVjdXRlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgotCi1BdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KLQotVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6Ci0KLSAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKLQotVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJwotZmxhZ3MuCi0KLUlmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKLWludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQotZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCi0KLVRoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgotICA7OwotCi1maW5pc2gpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KLQotQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KLQotRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KLQotVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCi10aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKLSAgOzsKLQotaW5zdGFsbCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCi0KLUluc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgotCi1JTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKLWVpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgotCi1UaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQotQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCi0gIDs7Ci0KLWxpbmspCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgotCi1MaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCi1jcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgotCi1MSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKLWEgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgotCi1UaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKLQotICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKLSAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCi0gIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQotICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scwotICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQotICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQotCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCi0gIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAotCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCi0gIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKLSAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKLSAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCi0gIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scwotICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLSAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KLSAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgotICAtUlsgXUxJQkRJUiAgICAgICBhZGQgTElCRElSIHRvIHRoZSBydW50aW1lIHBhdGggb2YgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcwotICAtc3RhdGljICAgICAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAtdmVyc2lvbi1pbmZvIENVUlJFTlRbOlJFVklTSU9OWzpBR0VdXQotCQkgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQotCi1BbGwgb3RoZXIgb3B0aW9ucyAoYXJndW1lbnRzIGJlZ2lubmluZyB3aXRoIFxgLScpIGFyZSBpZ25vcmVkLgotCi1FdmVyeSBvdGhlciBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWUuICBGaWxlcyBlbmRpbmcgaW4gXGAubGEnIGFyZQotdHJlYXRlZCBhcyB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcywgb3RoZXIgZmlsZXMgYXJlIHN0YW5kYXJkIG9yIGxpYnJhcnkKLW9iamVjdCBmaWxlcy4KLQotSWYgdGhlIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubGEnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5IGlzIGNyZWF0ZWQsCi1vbmx5IGxpYnJhcnkgb2JqZWN0cyAoXGAubG8nIGZpbGVzKSBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgXGAtcnBhdGgnIGlzCi1yZXF1aXJlZCwgZXhjZXB0IHdoZW4gY3JlYXRpbmcgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCi1JZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmEnIG9yIFxgLmxpYicsIHRoZW4gYSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGNyZWF0ZWQKLXVzaW5nIFxgYXInIGFuZCBcYHJhbmxpYicsIG9yIG9uIFdpbmRvd3MgdXNpbmcgXGBsaWInLgotCi1JZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxvJyBvciBcYC4ke29iamV4dH0nLCB0aGVuIGEgcmVsb2FkYWJsZSBvYmplY3QgZmlsZQotaXMgY3JlYXRlZCwgb3RoZXJ3aXNlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBjcmVhdGVkLiIKLSAgOzsKLQotdW5pbnN0YWxsKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0KLVJNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQotKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAotdG8gUk0uCi0KLUlmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgotT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICA7OwotCi0qKQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLSAgOzsKLWVzYWMKLQotZWNobwotJGVjaG8gIlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKLQotZXhpdCAwCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKZGlmZiAtLWdpdCBhL21ha2VmaWxlLnZtcyBiL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllMzYzNC4uMDAwMDAwMAotLS0gYS9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jCi0jIG1ha2VmaWxlIGZvciBiZmQsIGJpbnV0aWxzIGFuZCBnYXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotIwotIyBZb3UgbXVzdCB1c2UgVmVyc2lvbiAzLjc2IG9mIEdOVSBNYWtlCi0jCi0jCi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1DQyA9IGdjYwotR0FTQ0MgPSAkKENDKQotZWxzZQotQ0MgPSBjYwotR0FTQ0MgPSBnY2MKLWVuZGlmCi0KLWlmZXEgKCQoQ0MpLGNjKQotICBDSEVDSy1DT01QSUxFUiA9IGNoZWNrX2NvbXBpbGVyCi1lbHNlCi0gIENIRUNLLUNPTVBJTEVSID0KLWVuZGlmCi0KLWFsbDoJY2hlY2tfY2MgJChDSEVDSy1DT01QSUxFUikgWy5iaW51dGlsc11tYWtlZmlsZS52bXMKLQkkKENEKSBbLmJmZF0KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLm9wY29kZXNdCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5saWJpYmVydHldCi0JQGdtYWtlICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmdhc10KLQlAZ21ha2UgIkNDPSQoR0FTQ0MpIgotCSQoQ0QpIFstXQotCi1jaGVja19jYzoKLWlmZXEgKCRDQywpCi0JQCQoRUNITykgIlBsZWFzZSBlZGl0IE1BS0VGSUxFLlZNUyBhbmQgc2VsZWN0IGEgQyBDb21waWxlci4iCi0Jc3RvcAotZW5kaWYKLQotY2hlY2tfY29tcGlsZXI6Ci0JQCQoRUNITykgIlBlcmZvcm0gYSAnJCQgQHNldHVwJyBiZWZvcmUgc3RhcnRpbmcgbWFrZSIKLQotWy5iaW51dGlsc11tYWtlZmlsZS52bXM6Ci0JJChDRCkgWy5iaW51dGlsc10KLQkkJCBAY29uZmlndXJlCi0JJChDRCkgWy1dCi0KLWluc3RhbGw6IGFsbAotCSQoQ0QpIFsuYmludXRpbHNdCi0JQGdtYWtlICJDQz0kKENDKSIgaW5zdGFsbAotCSQoQ0QpIFstXQotCSQoQ0QpIFsuZ2FzXQotCUBnbWFrZSAiQ0M9JChHQVNDQykiIGluc3RhbGwKLQkkKENEKSBbLV0KLQotY2xlYW46Ci0JJChDRCkgWy5iZmRdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0ub3Bjb2Rlc10KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLS5saWJpYmVydHldCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0uYmludXRpbHNdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy0uZ2FzXQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstXQotCmRpZmYgLS1naXQgYS9taXNzaW5nIGIvbWlzc2luZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc4OTY1Mi4uMDAwMDAwMAotLS0gYS9taXNzaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRnJhbmMsb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSMgMDIxMTEtMTMwNywgVVNBLgotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgZXhpdCAxCi1maQotCi1jYXNlICIkMSIgaW4KLQotICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCi0gICAgZWNobyAiXAotJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCi0KLUhhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KLWVycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KLQotT3B0aW9uczoKLSAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotCi1TdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6Ci0gIGFjbG9jYWwgICAgICB0b3VjaCBmaWxlIFxgYWNsb2NhbC5tNCcKLSAgYXV0b2NvbmYgICAgIHRvdWNoIGZpbGUgXGBjb25maWd1cmUnCi0gIGF1dG9oZWFkZXIgICB0b3VjaCBmaWxlIFxgY29uZmlnLmguaW4nCi0gIGF1dG9tYWtlICAgICB0b3VjaCBhbGwgXGBNYWtlZmlsZS5pbicgZmlsZXMKLSAgYmlzb24gICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQotICBmbGV4ICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYwotICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCi0gIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0iCi0gICAgOzsKLQotICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcnN8LS12ZXJzaXwtLXZlcnNpb3wtLXZlcnNpb24pCi0gICAgZWNobyAibWlzc2luZyAtIEdOVSBsaWJpdCAwLjAiCi0gICAgOzsKLQotICAtKikKLSAgICBlY2hvIDE+JjIgIiQwOiBVbmtub3duIFxgJDEnIG9wdGlvbiIKLSAgICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICBhY2xvY2FsKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2luY2x1ZGUubTQnIG9yIFxgY29uZmlndXJlLmluJy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tCi0gICAgICAgICBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggYWNsb2NhbC5tNAotICAgIDs7Ci0KLSAgYXV0b2NvbmYpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGNvbmZpZ3VyZS5pbicuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQotICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggY29uZmlndXJlCi0gICAgOzsKLQotICBhdXRvaGVhZGVyKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYGNvbmZpZ3VyZS5pbicuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQotICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnIGNvbmZpZ3VyZS5pbmAKLSAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKLSAgICB0b3VjaF9maWxlcz0KLSAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLSAgICAgICo6KikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAiYGVjaG8gIiRmIiB8Ci0JCQkJICAgICAgIHNlZCAtZSAncy9eW146XSo6Ly8nIC1lICdzLzouKi8vJ2A7OwotICAgICAgKikgdG91Y2hfZmlsZXM9IiR0b3VjaF9maWxlcyAkZi5pbiI7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgICB0b3VjaCAkdG91Y2hfZmlsZXMKLSAgICA7OwotCi0gIGF1dG9tYWtlKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYGNvbmZpZ3VyZS5pbicuCi0gICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KLSAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAotCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8Ci0JICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCi0gICAgOzsKLQotICBiaXNvbnx5YWNjKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKLSAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCi0JKi55KQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYwotCSAgICBmaQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCi0JZWNobyA+eS50YWIuaAotICAgIGZpCi0gICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgotCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYwotICAgIGZpCi0gICAgOzsKLQotICBsZXh8ZmxleCkKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCi0gICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0Ci0gICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIGxleC55eS5jCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgotCWNhc2UgIiRMQVNUQVJHIiBpbgotCSoubCkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYwotICAgIGZpCi0gICAgOzsKLQotICBtYWtlaW5mbykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKLSAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cwotICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKLSAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgotICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKLSAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KLSAgICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKLSAgICAgIGZpbGU9YHNlZCAtbiAnL15Ac2V0ZmlsZW5hbWUvIHsgcy8uKiBcKFteIF0qXCkgKiQvXDEvOyBwOyBxOyB9JyAkZmlsZWAKLSAgICBmaQotICAgIHRvdWNoICRmaWxlCi0gICAgOzsKLQotICAqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBhbmQgeW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgaXQgaGFuZHkgb24geW91cgotICAgICAgICAgc3lzdGVtLiAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKLSAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAotICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlyZW1lbnRzIGZvciBpbnN0YWxsaW5nCi0gICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQotICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvbWtkZXAgYi9ta2RlcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2M1YjUwOC4uMDAwMDAwMAotLS0gYS9ta2RlcAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMhL2Jpbi9zaCAtCi0jCi0jIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotIyBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKLSMgZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKLSMgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAotIyBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCi0jIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCi0jIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0jIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotIwotIwlAKCMpbWtkZXAuc2gJNS4xMiAoQmVya2VsZXkpIDYvMzAvODgKLSMKLQotTUFLRT1NYWtlZmlsZQkJCSMgZGVmYXVsdCBtYWtlZmlsZSBuYW1lIGlzICJNYWtlZmlsZSIKLQotd2hpbGUgOgotCWRvIGNhc2UgIiQxIiBpbgotCQkjIC1mIGFsbG93cyB5b3UgdG8gc2VsZWN0IGEgbWFrZWZpbGUgbmFtZQotCQktZikKLQkJCU1BS0U9JDIKLQkJCXNoaWZ0OyBzaGlmdCA7OwotCi0JCSMgdGhlIC1wIGZsYWcgcHJvZHVjZXMgInByb2dyYW06IHByb2dyYW0uYyIgc3R5bGUgZGVwZW5kZW5jaWVzCi0JCSMgc28gLm8ncyBkb24ndCBnZXQgcHJvZHVjZWQKLQkJLXApCi0JCQlTRUQ9J3M7XC5vOzsnCi0JCQlzaGlmdCA7OwotCQkqKQotCQkJYnJlYWsgOzsKLQllc2FjCi1kb25lCi0KLWlmIFsgJCMgPSAwIF0gOyB0aGVuCi0JZWNobyAndXNhZ2U6IG1rZGVwIFstcF0gWy1mIG1ha2VmaWxlXSBbZmxhZ3NdIGZpbGUgLi4uJwotCWV4aXQgMQotZmkKLQotaWYgWyAhIC13ICRNQUtFIF07IHRoZW4KLQllY2hvICJta2RlcDogbm8gd3JpdGVhYmxlIGZpbGUgXCIkTUFLRVwiIgotCWV4aXQgMQotZmkKLQotVE1QPS90bXAvbWtkZXAkJAotCi10cmFwICdybSAtZiAkVE1QIDsgZXhpdCAxJyAxIDIgMyAxMyAxNQotCi1jcCAkTUFLRSAke01BS0V9LmJhawotCi1zZWQgLWUgJy9ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJGQnIDwgJE1BS0UgPiAkVE1QCi0KLWNhdCA8PCBfRU9GXyA+PiAkVE1QCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLV9FT0ZfCi0KLSMgSWYgeW91ciBjb21waWxlciBkb2Vzbid0IGhhdmUgLU0sIGFkZCBpdC4gIElmIHlvdSBjYW4ndCwgdGhlIG5leHQgdHdvCi0jIGxpbmVzIHdpbGwgdHJ5IGFuZCByZXBsYWNlIHRoZSAiY2MgLU0iLiAgVGhlIHJlYWwgcHJvYmxlbSBpcyB0aGF0IHRoaXMKLSMgaGFjayBjYW4ndCBkZWFsIHdpdGggYW55dGhpbmcgdGhhdCByZXF1aXJlcyBhIHNlYXJjaCBwYXRoLCBhbmQgZG9lc24ndAotIyBldmVuIHRyeSBmb3IgYW55dGhpbmcgdXNpbmcgYnJhY2tldCAoPD4pIHN5bnRheC4KLSMKLSMgZWdyZXAgJ14jaW5jbHVkZVsgCV0qIi4qIicgL2Rldi9udWxsICQqIHwKLSMgc2VkIC1lICdzLzpbXiJdKiJcKFteIl0qXCkiLiovOiBcMS8nIC1lICdzL1wuYy8uby8nIHwKLQotZ2NjIC1NTSAkKiB8Ci1zZWQgIgotCXM7IFwuLzsgO2cKLQkkU0VEIiA+PiAkVE1QCi0KLWNhdCA8PCBfRU9GXyA+PiAkVE1QCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotX0VPRl8KLQotIyBjb3B5IHRvIHByZXNlcnZlIHBlcm1pc3Npb25zCi1jcCAkVE1QICRNQUtFCi1ybSAtZiAke01BS0V9LmJhayAkVE1QCi1leGl0IDAKLQotCmRpZmYgLS1naXQgYS9ta2luc3RhbGxkaXJzIGIvbWtpbnN0YWxsZGlycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4NzgzZS4uMDAwMDAwMAotLS0gYS9ta2luc3RhbGxkaXJzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKLSMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+Ci0jIENyZWF0ZWQ6IDE5OTMtMDUtMTYKLSMgTGFzdCBtb2RpZmllZDogMTk5NC0wMy0yNQotIyBQdWJsaWMgZG9tYWluCi0KLWVycnN0YXR1cz0wCi0KLWZvciBmaWxlIGluICR7MSsiJEAifSA7IGRvIAotICAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKLSAgIHNoaWZ0Ci0KLSAgIHBhdGhjb21wPQotICAgZm9yIGQgaW4gJHsxKyIkQCJ9IDsgZG8KLSAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgotICAgICBjYXNlICIkcGF0aGNvbXAiIGluCi0gICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OwotICAgICBlc2FjCi0KLSAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCi0gICAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIgMT4mMgotICAgICAgICBta2RpciAiJHBhdGhjb21wIiA+IC9kZXYvbnVsbCAyPiYxIHx8IGxhc3RlcnI9JD8KLSAgICAgZmkKLQotICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KLQllcnJzdGF0dXM9JGxhc3RlcnIKLSAgICAgZmkKLQotICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKLSAgIGRvbmUKLWRvbmUKLQotZXhpdCAkZXJyc3RhdHVzCi0KLSMgbWtpbnN0YWxsZGlycyBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL21vdmUtaWYtY2hhbmdlIGIvbW92ZS1pZi1jaGFuZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlMWIzNDguLjAwMDAwMDAKLS0tIGEvbW92ZS1pZi1jaGFuZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLWlmCi10ZXN0IC1yICQyCi10aGVuCi1pZgotY21wICQxICQyID4gL2Rldi9udWxsCi10aGVuCi1lY2hvICQyIGlzIHVuY2hhbmdlZAotcm0gLWYgJDEKLWVsc2UKLW12IC1mICQxICQyCi1maQotZWxzZQotbXYgLWYgJDEgJDIKLWZpCmRpZmYgLS1naXQgYS9tcHctUkVBRE1FIGIvbXB3LVJFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3MTQwYi4uMDAwMDAwMAotLS0gYS9tcHctUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLVRoaXMgaXMgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1hY2ludG9zaCh0bSkgTVBXKHRtKSBwb3J0IG9mIHRoZQotR05VIHRvb2xzLiAgVGhlIGluZm9ybWF0aW9uIGJlbG93IGFwcGxpZXMgdG8gYm90aCBuYXRpdmUgYW5kIGNyb3NzCi1jb21waWxlcnMuCi0KLShQbGVhc2Ugbm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhpcyBmaWxlOyAibXB3LVJFQURNRSIKLWlzIHRoZSBzb3VyY2UgZm9ybSwgYW5kICJSZWFkIE1lIGZvciBNUFciIGlzIHRoZSBkaXN0cmlidXRpb24gZm9ybS4KLSJSZWFkIE1lIGZvciBNUFciIGhhcyA4LWJpdCBjaGFycyBzdWNoIGFzIFxPcHRpb24tZCBlbWJlZGRlZCBpbiBpdC4pCi0KLUlOU1RBTExJTkcgR05VIFRPT0xTCi0KLSogU3lzdGVtIFJlcXVpcmVtZW50cwotCi1UbyB1c2UgdGhlc2UgdG9vbHMsIHlvdSB3aWxsIG5lZWQgYSBNYWMgd2l0aCBhIDY4MDIwIG9yIGJldHRlciBvciBlbHNlCi1hbnkgUG93ZXJNYWMsIFN5c3RlbSA3LjEgb3IgbGF0ZXIsIGFuZCBNUFcgMy4zIG9yIDMuNC4gIFlvdSB3aWxsICpub3QqCi1uZWVkIGFueSBvdGhlciBNUFcgY29tcGlsZXIgdW5sZXNzIHlvdSB3YW50IHRvIHJlYnVpbGQgZnJvbSBzb3VyY2VzLAotbm9yIGV2ZW4gYW55IGluY2x1ZGUgZmlsZXMsIHVubGVzcyB5b3UgYXJlIGJ1aWxkaW5nIGFjdHVhbCBNYWMKLWFwcGxpY2F0aW9ucy4gIEZvciBQb3dlck1hYyBuYXRpdmUgeW91IHdpbGwgbmVlZCBQUENMaW5rLCBob3dldmVyOwotYWxzbyB0aGUgZXhlY3V0YWJsZXMgYXJlIFBvd2VyUEMtb25seS4KLQotKiBBdXRvbWF0ZWQgSW5zdGFsbGF0aW9uCi0KLVRoZSBzaW1wbGVzdCB3YXkgdG8gaW5zdGFsbCBHTlUgdG9vbHMgaXMgdG8gcnVuIHRoZSBJbnN0YWxsIHNjcmlwdC4KLVRoZSBzY3JpcHQgd2lsbCBjb3B5IHRoaW5ncyB0byB3aGVyZSB5b3Ugd2FudCB0byBrZWVwIHRoZW0sIHdpbGwgYnVpbGQKLWEgVXNlclN0YXJ0dXAgZmlsZSB3aXRoIHNldHRpbmdzIGNvcnJlc3BvbmRpbmcgdG8gd2hlcmUgdGhpbmdzIHdlcmUKLWNvcGllZCwgYW5kIG9mZmVyIHRvIHB1dCB0aGF0IFVzZXJTdGFydHVwIGZpbGUgaW4geW91ciBNUFcgZm9sZGVyLgotCi1UaGUgSW5zdGFsbCBzY3JpcHQgZG9lcyBub3QgYWx0ZXIgYW55dGhpbmcgaW4gdGhlIFN5c3RlbSBGb2xkZXIsIGFuZAotaXQgZG9lcyBub3QgdGFrZSBhbnkgYWN0aW9uIHdpdGhvdXQgY29uZmlybWF0aW9uLgotCi1UaGUgSW5zdGFsbCBzY3JpcHQgd2lsbCBiZSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBiaW5hcnkKLWRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgb2JqZWN0IGRpcmVjdG9yeSBpZgotcmVidWlsZGluZyBmcm9tIHNvdXJjZS4gIChUaGUgc291cmNlcyBpbmNsdWRlIGEgZmlsZSBjYWxsZWQKLSJtcHctaW5zdGFsbCIgYXQgdGhlIHRvcCBsZXZlbCwgYnV0IGl0IGlzIHRoZSBzb3VyY2UgdG8gdGhlIEluc3RhbGwKLXNjcmlwdCBhbmQgY2Fubm90IGJlIHJ1biBkaXJlY3RseS4pCi0KLSogTWFudWFsIEluc3RhbGxhdGlvbgotCi1JZiB5b3UgZG9uJ3Qgd2FudCB0byBydW4gdGhlIEluc3RhbGwgc2NyaXB0LCB5b3UgY2FuIGRvIGluc3RhbGxhdGlvbgotbWFudWFsbHk7IHRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHN0ZXBzIGludm9sdmVkLgotCi1UaGUgR05VIHRvb2xzIGNhbiBnbyBpbiBhbnkgZGlyZWN0b3J5IHRoYXQgaXMgaW4geW91ciB7Q29tbWFuZHN9IGxpc3QuCi1XZSBnZW5lcmFsbHkgcHV0IGFsbCB0aGUgdG9vbHMgc29tZXdoZXJlIGxpa2Uge0Jvb3R9Q3lnbnVzOmxhdGVzdDpiaW4sCi1hbmQgdGhlbiBhZGQgdG8gYSBVc2VyU3RhcnR1cCBmaWxlOgotCi0Jc2V0IENvbW1hbmRzICJ7Qm9vdH1DeWdudXM6bGF0ZXN0OmJpbjose0NvbW1hbmRzfSIKLQotSG93ZXZlciwgdGhlIGNwcCBhbmQgY2MxIHByb2dyYW1zIG9mIEdDQyBhcmUgbm90IG5vcm1hbGx5IHN0b3JlZCBoZXJlLgotSW5zdGVhZCwgdGhleSB3aWxsIGJlIGluIGEgImxpYiIgZGlyZWN0b3J5IHRoYXQgaXMgYWxvbmdzaWRlICJiaW4iLAotYW5kIG9yZ2FuaXplZCBieSB0YXJnZXQgYW5kIHZlcnNpb24gdW5kZXJuZWF0aCwgd2l0aCBuYW1lcyBsaWtlCi0KLQk6bGliOmdjYy1saWI6PHRhcmdldD46Y3lnbnVzLTx2ZXJzaW9uPjoKLQotSWYgeW91IGJ1aWxkIGFuZCBpbnN0YWxsIGV2ZXJ5dGhpbmcgeW91cnNlbGYgYWNjb3JkaW5nIHRvIHRoZSBidWlsZAotaW5zdHJ1Y3Rpb25zIGJlbG93LCB0aGVuIHlvdSB3aWxsIG5vdCBoYXZlIGFueSBwcm9ibGVtcy4gIEhvd2V2ZXIsIHlvdQotbWF5IGRpc2NvdmVyIHRoYXQgR0NDIHNlZW1zIHVuYWJsZSB0byBmaW5kIHRoZSByaWdodCBjcHAgYW5kIGNjMTsKLXVzdWFsbHkgdGhpcyB3aWxsIGJlIGJlY2F1c2UgZGlyZWN0b3J5IG5hbWVzIGhhdmUgY2hhbmdlZC4gIChFdmVuCi1yZW5hbWluZyB5b3VyIGhhcmQgZGlzayB3aWxsIG1ha2UgdGhpcyBoYXBwZW4uKSAgSW4gc3VjaCBjYXNlcywgeW91Ci1oYXZlIHNldmVyYWwgY2hvaWNlcy4gIE9uZSBpcyBqdXN0IHRvIGFkZCB0aGlzIGRpcmVjdG9yeSB0bwote0NvbW1hbmRzfSwgYnV0IHRoZW4geW91IHdpbGwgbm90IGJlIGFibGUgdG8gZ2V0IGFueSBvdGhlciBjcHAgb3IgY2MxLAotc3VjaCBhcyB0aG9zZSB1c2VkIGJ5IGEgZGlmZmVyZW50IHRhcmdldCBvciB2ZXJzaW9uLiAgQW5vdGhlciB3YXkgaXMKLXRvIHJlbmFtZSB5b3VyIGRpc2sgYW5kIGRpcmVjdG9yaWVzIHRvIG1hdGNoIHRoZSBwcmVmaXggdXNlZCB3aGVuIHRoZQotdG9vbHMgd2VyZSBjb21waWxlZC4gIEZpbmFsbHksIHlvdSBjYW4gc2V0IHRoZSB2YXJpYWJsZQotR0NDX0VYRUNfUFJFRklYIHRvIHBvaW50IHRvIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeToKLQotCXNldCBHQ0NfRVhFQ19QUkVGSVggTXlEaXNrOlN0dWZmOmxpYjpnY2MtbGliOgotCWV4cG9ydCBHQ0NfRVhFQ19QUkVGSVgKLQotWW91IG1heSBhbHNvIHdhbnQgdG8gZWRpdCBNUFcncyBIRVhBIDEyOCByZXNvdXJjZS4gIFdoZW4gR0NDIGlzIGJ1aWx0Ci11c2luZyBhIG5hdGl2ZSBHQ0MsIGl0IGlzIGNvbXBpbGVkIHRvIHVzZSBhIHNwZWNpYWwgc3RhY2sgYWxsb2NhdG9yCi1mdW5jdGlvbiBhbGxvY2EoKS4gIFdoaWxlIHRoaXMgaXMgdmVyeSBlZmZpY2llbnQsIGl0IG1lYW5zIHRoYXQgR0NDCi13aWxsIG5lZWQgY29uc2lkZXJhYmxlIHN0YWNrIHNwYWNlIHRvIHJ1biwgZXNwZWNpYWxseSB3aGVuIGNvbXBpbGluZwotbGFyZ2UgcHJvZ3JhbXMgd2l0aCBvcHRpbWl6YXRpb24gdHVybmVkIG9uLiAgWW91IGdpdmUgTVBXIG1vcmUgc3RhY2sKLWJ5IGVkaXRpbmcgdGhlIEhFWEEgMTI4IHJlc291cmNlIG9mIHRoZSBNUFcgU2hlbGwuICBBIHZhbHVlIG9mICIwMDA4Ci0wMDAwIiBnaXZlcyA1MTJLIG9mIHN0YWNrIHNpemUsIHdoaWNoIGlzIHVzdWFsbHkgc3VmZmljaWVudC4KLQotVVNJTkcgR05VIFRPT0xTCi0KLSogVXNpbmcgTmF0aXZlIFBvd2VyTWFjIEdDQwotCi1Vc2luZyBhIG5hdGl2ZSBQb3dlck1hYyBHQ0MgdG8gcHJvZHVjZSBNUFcgdG9vbHMgb3IgTWFjT1MgYXBwbGljYXRpb25zCi1pcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4ganVzdCAiZ0MgZm9vLmMiLCBhbHRob3VnaCBubyBtb3JlIGNvbXBsaWNhdGVkCi10aGFuIHdpdGggb3RoZXIgTWFjIGNvbXBpbGVycy4KLQotVG8gYnVpbGQgYSBuYXRpdmUgUG93ZXJNYWMgTVBXIHRvb2wsIHVzZSB0aGlzIHNlcXVlbmNlLCB3aGVyZSBoZWxsby5jCi1pcyB0aGUgdXN1YWwgImhlbGxvIHdvcmxkIiBwcm9ncmFtLCBhbmQgZ2VuZXJpY2NmcmcuciBpcyB0aGUgUmV6IGZpbGUKLXdpdGggdGhlIGNvZGUgZnJhZ21lbnQgcmVzb3VyY2U6Ci0KLWdDIC1Je0NJbmNsdWRlc30gLWZuby1idWlsdGluIC1EcGFzY2FsPSAtYyAtZyBoZWxsby5jCi1QUENMaW5rIGhlbGxvLm8gLW8gaGVsbG8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlN0ZENSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IkludGVyZmFjZUxpYiBcT3B0aW9uLWQKLQkie1NoYXJlZExpYnJhcmllc30iU3RkQ0xpYiBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDVG9vbExpYnMubyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie0dDQ1BQQ0xpYnJhcmllc30ibGliZ2NjLnhjb2ZmCi1yZXogLWQgQVBQTkFNRT0nIidoZWxsbyciJyBHZW5lcmljQ0ZSRy5yIC1vIGhlbGxvCi1zZXRmaWxlIC10ICdNUFNUJyAtYyAnTVBTICcgaGVsbG8KLQotVGhlIHNhbWUgc2VxdWVuY2Ugd29ya3MgdG8gYnVpbGQgYSBNYWNPUyBhcHBsaWNhdGlvbiwgYnV0IHlvdSBzZXQgdGhlIGZpbGUKLXR5cGUgdG8gJ0FQUEwnIGFuZCBkb24ndCBsaW5rIGluIFBQQ1Rvb2xMaWJzLm8uICBGb3IgZnVydGhlciBkZXRhaWxzIG9uCi11c2luZyBNUFcgdG8gYnVpbGQgTWFjIGFwcGxpY2F0aW9ucywgc2VlIHRoZSBnZW5lcmFsIE1QVyBkb2N1bWVudGF0aW9uLgotCi1SZWNlbnQgdmVyc2lvbnMgb2YgUFBDTGluayBoYXZlIGFuIG9wdGlvbiB0byBnZW5lcmF0ZSB0aGUgY29kZQotZnJhZ21lbnQgcmVzb3VyY2UgYW5kIGF1dG9tYXRpY2FsbHkgc2V0IGNyZWF0b3IgYW5kIGZpbGUgdHlwZTsKLWhlcmUgaXMgd2hhdCBHZW5lcmljQ0ZSRy5yIHNob3VsZCBsb29rIGxpa2UgaWYgeW91IGhhdmUgYW4gb2xkZXIKLVBQQ0xpbmsgb3IgYXJlIHVzaW5nIEdOVSBsZDoKLQotI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCi0KLXJlc291cmNlICdjZnJnJyAoMCkgewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAga1Bvd2VyUEMsCi0gICAgICAgICAgICAgICAga0Z1bGxMaWIsCi0gICAgICAgICAgICAgICAga05vVmVyc2lvbk51bSxrTm9WZXJzaW9uTnVtLAotICAgICAgICAgICAgICAgIDAsMCwKLSAgICAgICAgICAgICAgICBrSXNBcHAsa09uRGlza0ZsYXQsa1plcm9PZmZzZXQsa1dob2xlRm9yaywKLSAgICAgICAgICAgICAgICBBUFBOQU1FIC8vIG11c3QgYmUgZGVmaW5lZCBvbiBSZXogY29tbWFuZCBsaW5lIHdpdGggLWQgb3B0aW9uCi0gICAgICAgIH0KLX07Ci0KLUluIGdlbmVyYWwgdGhpcyBwb3J0IG9mIEdDQyBzdXBwb3J0cyB0aGUgc2FtZSBvcHRpb24gc3ludGF4IGFuZAotYmVoYXZpb3IgYXMgaXRzIFVuaXggY291bnRlcnBhcnQuICBJdCBhbHNvIGhhcyBzaW1pbGFyIGNvbXBpbGF0aW9uCi1ydWxlcywgc28gaXQgd2lsbCBydW4gdGhlIGFzc2VtYmxlciBvbiAucyBmaWxlcyBhbmQgc28gZm9ydGguCi0KLVRoZSBHQ0MgbWFudWFsIGluY2x1ZGVzIGZ1bGwgaW5mb3JtYXRpb24gb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zLgotT25lIG9wdGlvbiB0aGF0IG1heSBiZSBlc3BlY2lhbGx5IHVzZWZ1bCBpcyAiLXYiLCB3aGljaCBzaG93cyB5b3Ugd2hhdAotdG9vbHMgYW5kIG9wdGlvbnMgYXJlIGJlaW5nIHVzZWQ7IHVubGlrZSBtb3N0IE1hYyBDIGNvbXBpbGVycywgR0NDCi1kaXJlY3RzIGFzc2VtYmx5IGFuZCBsaW5raW5nIGluIGFkZGl0aW9uIHRvIGNvbXBpbGF0aW9uLgotCi1NUFcgR0NDIGRvZXMgZmVhdHVyZSB0d28gZXh0ZW5zaW9ucyB0byB0aGUgb3B0aW9uIHN5bnRheDsgJy1kIG1hY3JvPW5hbWUnCi13b3JrcyBqdXN0IGFzICctRG1hY3JvPW5hbWUnIGRvZXMgaW4gVW5peCwgYW5kICctaSBkaXJlY3RvcnknIHdvcmtzIHRoZQotc2FtZSBhcyAnLUlkaXJlY3RvcnknLgotCi1NUFcgR0NDIHN1cHBvcnRzIHRoZSB1c3VhbCBQYXNjYWwtc3R5bGUgc3RyaW5ncyBhbmQgYWxpZ25tZW50IHByYWdtYXMuCi0KLVRvIGZpbmQgc3RhbmRhcmQgaW5jbHVkZSBmaWxlcyB5b3UgY2FuIHNldCB0aGUgdmFyaWFibGUgR0NDSW5jbHVkZXM6Ci0KLQlzZXQgR0NDSW5jbHVkZXMgTXlEaXNrOk15SW5jbHVkZXM6Ci0JZXhwb3J0IEdDQ0luY2x1ZGVzCi0KLUdDQ0luY2x1ZGVzIGlzIHNpbWlsYXIgdG8gTVBXJ3MgQ0luY2x1ZGVzIG9yIENXJ3MgTVdDSW5jbHVkZXMuICBJbgotb3JkZXIgdG8gdXNlIE1QVydzIHVzdWFsIGluY2x1ZGUgZmlsZXMsIGp1c3Qgc2F5OgotCi0Jc2V0IEdDQ0luY2x1ZGVzICJ7Q0luY2x1ZGVzfSIKLQlleHBvcnQgR0NDSW5jbHVkZXMKLQotKiBVc2luZyBHQ0MgYXMgYSBDcm9zcy1Db21waWxlcgotCi1JZiB5b3UgaGF2ZSBhIGNyb3NzLWNvbXBpbGVyLCBhbmQgeW91IGhhdmUgYWxsIG9mIHRoZSBjb3JyZWN0Ci10YXJnZXQtc2lkZSBjcnQwIGFuZCBsaWJyYXJpZXMgYXZhaWxhYmxlLCB0aGVuIHRvIGNvbXBpbGUgYW5kIGxpbmsgYQotZmlsZSAiZm9vLmMiLCB5b3UgY2FuIHNheSBqdXN0Ci0KLQlnQyBmb28uYwotCi1UaGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBhbiBNUFcgYmluYXJ5IGZpbGUgbmFtZWQgImEub3V0IjsgdGhlIGZvcm1hdAotb2YgdGhlIGNvbnRlbnRzIHdpbGwgZGVwZW5kIG9uIHdoaWNoIHRhcmdldCBpcyBpbiB1c2UsIHNvIGZvciBpbnN0YW5jZQotYSBNSVBTLXRhcmdldGluZyBHQ0Mgd2lsbCBwcm9kdWNlIEVDT0ZGIG9yIEVMRiBleGVjdXRhYmxlcy4KLQotTm90ZSB0aGF0IHVzaW5nIE1QVyBpbmNsdWRlIGZpbGVzIHdpdGggYSBjcm9zcy1jb21waWxlciBpcyBzb21ld2hhdAotZGFuZ2Vyb3VzLgotCi0qIFVzaW5nIHRoZSBBc3NlbWJsZXIgYW5kIEZyaWVuZHMKLQotVGhlIGFzc2VtYmxlciAoImFzIikgYW5kIGxpbmtlciAoImxkIikgYXJlIGZhaXRoZnVsIHBvcnRzIG9mIHRoZWlyCi1Vbml4IGNvdW50ZXJwYXJ0cy4gIFNpbWlsYXJseSwgdGhlIGJpbnV0aWxzICJhciIsICJjcGx1c2ZpbHQiLCAibm0iLAotIm9iamNvcHkiLCAib2JqZHVtcCIsICJyYW5saWIiLCAic2l6ZSIsICJzdHJpbmdzIiwgYW5kICJzdHJpcCIgYXJlIGFsbAotbGlrZSB0aGV5IGFyZSB1bmRlciBVbml4LiAgKE5vdGUgdGhhdCAiY3BsdXNmaWx0IiBpcyB1c3VhbGx5IGNhbGxlZAotImMrK2ZpbHQiIHVuZGVyIFVuaXguKQotCi0qIFVzaW5nIEdEQgotCi1UaGVyZSBhcmUgdHdvIGZsYXZvcnMgb2YgR0RCLiAgImdkYiIgaXMgYW4gTVBXIHRvb2wgdGhhdCB3b3JrcyB2ZXJ5Ci1tdWNoIGxpa2UgaXQgZG9lcyBpbiBVbml4OyBwdXQgYSBjb21tYW5kIGludG8gdGhlIE1QVyB3b3Jrc2hlZXQgYW5kCi10eXBlIHRoZSA8ZW50ZXI+IGtleSB0byBzZW5kIGl0IHRvIEdEQi4gIFdoaWxlICJnZGIiIGlzIHJ1bm5pbmcsIHlvdQotY2Fubm90IGRvIGFueXRoaW5nIGVsc2UgaW4gTVBXLCBhbHRob3VnaCB5b3UgY2FuIHN3aXRjaCB0byBvdGhlcgotTWFjIGFwcGxpY2F0aW9ucyBhbmQgdXNlIHRoZW0uCi0KLSJTaW93R0RCIiBpcyBhbHNvIGEgTWFjIGFwcGxpY2F0aW9uLCBidXQgaXQgaXMgR0RCIHVzaW5nIHRoZSBTSU9XCi1wYWNrYWdlIHRvIHByb3ZpZGUgY29uc29sZSBlbXVsYXRpb24uICBDb21tYW5kcyBhcmUgZXhhY3RseSBhcyBmb3IgdGhlCi1NUFcgdG9vbCwgYnV0IHNpbmNlIHRoaXMgaXMgaXRzIG93biBhcHBsaWNhdGlvbiwgeW91IGNhbiBzd2l0Y2gKLWJldHdlZW4gaXQgYW5kIE1QVy4KLQotQlVJTERJTkcgR05VIFRPT0xTCi0KLVRoaXMgcG9ydCBvZiB0aGUgR05VIHRvb2xzIHVzZXMgYSBjb25maWd1cmUgc2NyaXB0IHNpbWlsYXIgdG8KLXRoYXQgdXNlZCBmb3IgR05VIHRvb2xzIHVuZGVyIFVuaXgsIGJ1dCByZXdyaXR0ZW4gZm9yIE1QVy4gIEFzIHdpdGgKLVVuaXggY29uZmlndXJhdGlvbiwgdGhlcmUgaXMgYW4gIm9iamVjdCIgZGlyZWN0b3J5IHRoYXQgbWF5IGJlCi1kaWZmZXJlbnQgZnJvbSB0aGUgInNvdXJjZSIgZGlyZWN0b3J5LiAgSW4gdGhlIGV4YW1wbGUgY29tbWFuZHMgYmVsb3csCi13ZSB3aWxsIGFzc3VtZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnksIGFuZCB0aGF0Ci10aGUgc291cmNlIGRpcmVjdG9yeSBpcyAie0Jvb3R9Q3lnbnVzOnNyYzoiLgotCi0qIFJlcXVpcmVtZW50cyBmb3IgQnVpbGRpbmcKLQotSW4gYWRkaXRpb24gdG8gdGhlIHNvdXJjZXMsIHlvdSB3aWxsIG5lZWQgYSBzZXQgb2YgdG9vbHMgdGhhdCB0aGUKLWNvbmZpZ3VyZSBhbmQgYnVpbGQgc2NyaXB0cyBhc3N1bWUgdG8gYmUgYXZhaWxhYmxlLiAgVGhlc2UgdG9vbHMKLShhbmQgdGhlaXIgdmVyc2lvbnMsIGlmIHJlbGV2YW50KSBhcmUgYXMgZm9sbG93czoKLQotCWJ5YWNjIHRvb2wKLQlmbGV4ICgyLjMuNykgdG9vbCAoYW5kIEZsZXguc2tlbCBmaWxlKQotCWZvcndhcmQtaW5jbHVkZSBzY3JpcHQKLQlNb3ZlSWZDaGFuZ2Ugc2NyaXB0Ci0JbXB3LXRvdWNoIHNjcmlwdAotCW1wdy10cnVlIHNjcmlwdAotCU5ld0ZvbGRlclJlY3Vyc2l2ZSBzY3JpcHQKLQludWxsLWNvbW1hbmQgc2NyaXB0Ci0Jb3Blbi1icmFjZSBzY3JpcHQKLQlzZWQgKDEuMTMpIHRvb2wKLQl0ci03dG84IHNjcmlwdAotCXRydWUgc2NyaXB0Ci0KLVRoZSBzY3JpcHRzIGFyZSBpbiB0aGUgc291cmNlcywgdW5kZXIgdXRpbHM6bXB3Oi4gWW91IG11c3QgYXJyYW5nZSB0bwotZ2V0IHRoZSBvdGhlciB0b29scyB5b3Vyc2VsZiAodGhleSBhcmUgcmVhZGlseSBhdmFpbGFibGUgZnJvbSB0aGUKLSJ1c3VhbCIgbmV0IHNpdGVzLCBhbmQgYXJlIGFsc28gb24gbWFueSBDRFJPTVMpLiAgSW4gYWRkaXRpb24sIHRoZXJlCi13aWxsIHVzdWFsbHkgYmUgYSBzZXQgb2YgdGhlc2UgYXZhaWxhYmxlIGF0IGZ0cC5jeWdudXMuY29tLCBpbiBwdWIvbWFjLgotCi1Zb3UgbWF5IHB1dCB0aGUgYnVpbGQgdG9vbHMgaW4geW91ciB1c3VhbCBUb29scyBvciBTY3JpcHRzCi1kaXJlY3Rvcmllcywgb3Iga2VlcCB0aGVtIGluIGEgc2VwYXJhdGUgZGlyZWN0b3JpZXMuICBXZSBwcmVmZXIgdG8KLW1ha2UgYSBkaXJlY3RvcnkgY2FsbGVkICJidWlsZHRvb2xzIiBhbmQgd2UgcHV0IHRoaXMgaW4gb25lIG9mIG91cgotVXNlclN0YXJ0dXAgZmlsZXM6Ci0KLQlzZXQgQ29tbWFuZHMgIntCb290fUN5Z251czpidWlsZHRvb2xzOix7Q29tbWFuZHN9IgotCi1GbGV4IHVzZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgRkxFWF9TS0VMRVRPTiB0byBsb2NhdGUgaXRzIHNrZWxldG9uCi1maWxlLCBzbyB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzLCBwcmVmZXJhYmx5IGluIGEgVXNlclN0YXJ0dXA6Ci0KLQlTZXQgRkxFWF9TS0VMRVRPTiAie0Jvb3R9IkN5Z251czpidWlsZHRvb2xzOkZsZXguc2tlbAotCUV4cG9ydCBGTEVYX1NLRUxFVE9OCi0KLSogQ29uZmlndXJpbmcKLQotQmVmb3JlIHlvdSBjYW4gYnVpbGQgYW55dGhpbmcsIHlvdSBtdXN0IGNvbmZpZ3VyZS4gIFlvdSBkbyB0aGlzIGJ5Ci1jcmVhdGluZyBhbiBkaXJlY3Rvcnkgd2hlcmUgb2JqZWN0IGZpbGVzIHdpbGwgYmUgc3RvcmVkLCBzZXRkaXJlY3RvcnkKLXRvIHRoYXQgZGlyZWN0b3J5IGFuZCBkbyBhIGNvbmZpZ3VyZSBjb21tYW5kOgotCi0Je0Jvb3R9Q3lnbnVzOnNyYzptcHctY29uZmlndXJlIC0tdGFyZ2V0IDxuYW1lPiAtLWNjIDxjb21waWxlcj4gLS1zcmNkaXIge0Jvb3R9Q3lnbnVzOnNyYzogLS1wcmVmaXggPHdoYXRldmVyPgotCi1JZiB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyBub3QgaW4geW91ciB7Q29tbWFuZHN9IGxpc3QsIHRoZW4geW91IG11c3QKLXN1cHBseSBhIGZ1bGwgcGF0aG5hbWUgdG8gbXB3LWNvbmZpZ3VyZSwgc2luY2UgbXB3LWNvbmZpZ3VyZSBpbnZva2VzCi1pdHNlbGYgYWZ0ZXIgc3dpdGNoaW5nIGludG8gZWFjaCBzdWJkaXJlY3RvcnkuICBVc2luZyBhIHJlbGF0aXZlCi1wYXRobmFtZSwgZXZlbiBzb21ldGhpbmcgbGlrZSAnOm1wdy1jb25maWd1cmUnLCB3aWxsIHRoZXJlZm9yZSBub3Qgd29yay4KLQotPG5hbWU+IG11c3QgYmUgYSBrbm93biB0YXJnZXQuICBWYWxpZCBvbmVzIGluY2x1ZGUgIm02OGstYXBwbGUtbWFjb3MiLAotInBvd2VycGMtYXBwbGUtbWFjb3MiLCAiaTM4Ni11bmtub3duLWdvMzIiLCAibWlwcy1pZHQtZWNvZmYiLCBhbmQKLSJzaC1oaXRhY2hpLWhtcyIuICBOb3QgYWxsIHRhcmdldCB0eXBlcyBhcmUgYWNjZXB0ZWQgZm9yIGFsbCBvZiB0aGUKLXRvb2xzIHlldC4KLQotPGNvbXBpbGVyPiBtdXN0IGJlIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byB1c2UuICBJdCBkZWZhdWx0cyB0byAibXB3YyIuCi0KLQkobTY4aykKLQltcHdjCU1QVyBDCi0Jc2M2OGsJU3ltYW50ZWMgQwotCW13YzY4awlNZXRyb3dlcmtzIEMgKENvZGV3YXJyaW9yKQotCWdjYzY4awlHQ0MKLQotCShwb3dlcnBjKQotCXBwY2MJUFBDQwotCW1yYwlNYWNpbnRvc2ggb24gUmlzQyAoTWlzdGVyIEMsIGFrYSg/KSBGcmFua2Vuc3RlaW4pCi0Jc2NwcGMJU3ltYW50ZWMgQwotCW13Y3BwYwlNZXRyb3dlcmtzIEMgKENvZGV3YXJyaW9yKQotCWdjY3BwYwlHQ0MKLQotTm90IGFsbCBjb21waWxlcnMgd2lsbCBjb21waWxlIGFsbCB0b29scyBlcXVhbGx5IHdlbGwhICBGb3IgbTY4ayBNYWNzLAotTVBXIEMgaGFzIHRoZSBiZXN0IHJlY29yZCBzbyBmYXIgKGl0IGhhcyBwcm9ibGVtcywgYnV0IHRoZXkgY2FuIGJlCi13b3JrZWQgYXJvdW5kKSwgd2hpbGUgZm9yIFBvd2VyTWFjcywgQ29kZVdhcnJpb3IgaXMgdGhlIG9ubHkgY29tcGlsZXIKLXRoYXQgaGFzIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBldmVyeXRoaW5nIGludG8gcnVubmluZyBjb2RlLgotCi08cHJlZml4PiBpcyB0aGUgcGF0aCB0aGF0ICJnY2MiIHdpbGwgcHJlcGVuZCB3aGVuIGxvb2tpbmcgZm9yIHRvb2xzCi10byBleGVjdXRlLiAgR0NDX0VYRUNfUFJFRklYIG92ZXJyaWRlcyB0aGlzIHZhbHVlLCBzbyB5b3UgbmVlZCBub3QKLWluY2x1ZGUgaXQgaWYgeW91IHBsYW4gdG8gdXNlIEdDQ19FWEVDX1BSRUZJWC4KLQotQXMgYW4gZXhhbXBsZSwgaGVyZSBpcyB0aGUgY29uZmlndXJlIGxpbmUgdGhhdCB5b3UgY291bGQgdXNlIHRvIGJ1aWxkCi1uYXRpdmUgUG93ZXJNYWMgR0NDOgotCi0ie0Jvb3R9IkN5Z251czpzcmM6bXB3LWNvbmZpZ3VyZSAtLWNjIG13Y3BwYyAtLXRhcmdldCBwb3dlcnBjLWFwcGxlLW1hY29zIC0tc3JjZGlyICJ7Qm9vdH0iQ3lnbnVzOnNyYzogLS1wcmVmaXggIntCb290fSJHTlVUb29sczoKLQotKiBCdWlsZGluZwotCi1JZiB5b3UgdXNlIENvZGVXYXJyaW9yLCB5b3UgKm11c3QqIGZpcnN0IHNldCBNV0NJbmNsdWRlcyB0bwote0NJbmNsdWRlc30uICBUaGlzIGlzIGJlY2F1c2UgeW91IHdpbGwgYmUgYnVpbGRpbmcgTVBXIHRvb2xzLCBhbmQKLXRoZWlyIHN0YW5kYXJkIEkvTyB3b3JrcyBieSBtYWtpbmcgcmVmZXJlbmNlcyB0byBkYXRhIHRoYXQgaXMgcGFydCBvZgotdGhlIE1QVyBTaGVsbCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBtdXN0IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQKLXdpdGggbWFjcm9zIHRoYXQgcmVmZXIgdG8gdGhhdCBkYXRhLCBhbmQgdGhvc2UgbWFjcm9zIGFyZSBpbgote0NJbmNsdWRlc30sIG5vdCB0aGUgZGVmYXVsdCB7TVdDSW5jbHVkZXN9LiAgV2l0aG91dCB0aGlzIGNoYW5nZSwgeW91Ci13aWxsIGVuY291bnRlciBwcm9ibGVtcyBjb21waWxpbmcgbGliaWJlcnR5L21wdy5jLCBidXQgdHdlYWtpbmcgdGhhdAotZmlsZSBvbmx5IG1hc2tzIHRoZSByZWFsIHByb2JsZW0sIGFuZCBkb2VzIG5vdCBmaXggaXQuCi0KLVRoZSBjb21tYW5kCi0KLQltcHctYnVpbGQKLQotd2lsbCBidWlsZCBldmVyeXRoaW5nLiBCdWlsZGluZyB3aWxsIHRha2Ugb3ZlciBhbiBob3VyIG9uIGEgUXVhZHJhIDgwMAotb3IgUG93ZXJNYWMgODEwMC8xMTAsIGxvbmdlciBpZiB0aGUgc291cmNlcyBhcmUgb24gYSBzaGFyZWQgdm9sdW1lLgotCi1Zb3UgbWF5IHNlZSBzb21lIHdhcm5pbmdzOyB0aGVzZSBhcmUgbW9zdGx5IGxpa2VseSBiZW5pZ24sIHR5cGljYWxseQotZGlzYWdyZWVtZW50cyBhYm91dCBkZWNsYXJhdGlvbnMgb2YgbGlicmFyeSBhbmQgc3lzdGVtIGZ1bmN0aW9ucy4KLQotKiBJbnN0YWxsaW5nCi0KLVRvIGluc3RhbGwgdGhlIGp1c3QtYnVpbHQgdG9vbHMsIHVzZSB0aGUgY29tbWFuZAotCi0JbXB3LWJ1aWxkIGluc3RhbGwKLQotVGhpcyBwYXJ0IG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIGp1c3QgY29waWVzIGZpbGVzIHRvIHRoZQotbG9jYXRpb24gc3BlY2lmaWVkIGF0IGNvbmZpZ3VyZSB0aW1lIGJ5IDxwcmVmaXg+LCBhbmQsIGluIHNvbWUgY2FzZXMsCi1yZW5hbWVzIHRoZW0gZnJvbSB0ZW1wb3JhcnkgaW50ZXJuYWwgbmFtZXMgdG8gdGhlaXIgdXN1YWwgbmFtZXMuIFRoaXMKLWluc3RhbGwgcHJvY2VzcyBpcyAqbm90KiB0aGUgc2FtZSBhcyB3aGF0IHRoZSBJbnN0YWxsIHNjcmlwdCBkb2VzOwotSW5zdGFsbCBjYW4gY29weSB0b29scyBmcm9tIHRoZSBpbnN0YWxsYXRpb24gbG9jYXRpb24gY2hvc2VuIGF0Ci1jb25maWd1cmF0aW9uIHRpbWUgdG8gYSB1c2VyLWNob3NlbiBwbGFjZSwgYW5kIHNldHMgdXAgYSBVc2VyU3RhcnR1cAotZmlsZS4gIE5vdGUgdGhhdCB3aGlsZSB0aGUgSW5zdGFsbCBzY3JpcHQgaXMgb3B0aW9uYWwsIHRoZSBpbnN0YWxsCi1idWlsZCBhY3Rpb24gcGVyZm9ybXMgc29tZSB0YXNrcyB3b3VsZCBiZSB2ZXJ5IGhhcmQgdG8gcmVwbGljYXRlCi1tYW51YWxseSwgc28geW91IHNob3VsZCBhbHdheXMgZG8gaXQgYmVmb3JlIHVzaW5nIHRoZSB0b29scy4KLQotKiBLbm93biBQcm9ibGVtcyBXaXRoIFVzaW5nIFZhcmlvdXMgQ29tcGlsZXJzIHRvIEJ1aWxkCi0KLU1vc3QgdmVyc2lvbnMgb2YgTVBXIEMgaGF2ZSBwcm9ibGVtcyB3aXRoIGNvbXBpbGluZyBHTlUgc29mdHdhcmUuCi0KLU1QVyBDIDMuMi54IGhhcyBwcmVwcm9jZXNzaW5nIGJ1Z3MgdGhhdCByZW5kZXIgaXQgaW5jYXBhYmxlIG9mCi1jb21waWxpbmcgdGhlIEJGRCBsaWJyYXJ5LCBzbyBpdCBjYW4ndCBiZSB1c2VkIGF0IGFsbCBmb3IgYnVpbGRpbmcgQkZELgotCi1NUFcgQyAzLjMsIDMuMy4xLCBhbmQgMy4zLjIgd2lsbCBzcG9udGFuZW91c2x5IGNsYWltIHRvIGhhdmUgZm91bmQKLWVycm9ycyBpbiB0aGUgc291cmNlIGNvZGUsIGJ1dCBpbiBmYWN0IHRoZSBjb2RlIGlzIHBlcmZlY3RseSBmaW5lLiAgSWYKLXRoaXMgaGFwcGVucywganVzdCBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJhY2sgdG8gdGhlIHRvcC1sZXZlbAotb2JqZGlyICh3aGVyZSB0aGUgY29uZmlndXJlIGNvbW1hbmQgYWJvdmUgd2FzIHBlcmZvcm1lZCksIGFuZCB0eXBlCi0ibXB3LWJ1aWxkIGFsbCIgYWdhaW4uICBJZiBpdCBnb2VzIG9uIHRocm91Z2ggdGhlIHN1cHBvc2VkIGVycm9yLCB0aGVuCi15b3UgZ290IG9uZSBvZiB0aGUgc3B1cmlvdXMgZXJyb3JzLiAgQSBmdWxsIGJ1aWxkIG1heSByZXF1aXJlIGEgbnVtYmVyCi1vZiB0aGVzZSByZXN0YXJ0cy4KLQotTVBXIEMgMy4zLjMgc2VlbXMgdG8gd29yayBPSywgYXQgbGVhc3Qgd2l0aCB0aGUgYWlkIG9mIGEgbnVtYmVyIG9mCi13b3JrYXJvdW5kcyB0aGF0IGFyZSBpbiB0aGUgc291cmNlcyAobG9vayBmb3IgI2lmZGVmIE1QV19DKS4KLQotVmVyc2lvbnMgb2YgTVBXIE1ha2UgZWFybGllciB0aGFuIDQuMGQyIGhhdmUgZXhoaWJpdGVkIGJpemFycmUgYmVoYXZpb3IsCi1mYWlsdXJlIHRvIHN1YnN0aXR1dGUgdmFyaWFibGVzIGFuZCB0aGUgbGlrZS4KLQotTWV0cm93ZXJrcyBDVzYgUFBDIGxpbmtlciAoTVdMaW5rUFBDKSBzZWVtcyB0byBkbyBiYWQgdGhpbmdzIHdpdGggbWVtb3J5Ci1pZiB0aGUgIk1vZGVybiBNZW1vcnkgTWFuYWdlciIgaXMgdHVybmVkIG9uIChpbiB0aGUgTWVtb3J5IGNvbnRyb2wgcGFuZWwpLAotYnV0IHdvcmtzIE9LIGlmIGl0IGlzIHR1cm5lZCBvZmYuCi0KLU1ldHJvd2Vya3MgQ1c2IGxvc2VzIGJpZ3RpbWUgY29tcGlsaW5nIG9wY29kZXM6cHBjLW9wYy5jLCB3aGljaCBoYXMKLXNvbWUgZGVlcGx5IG5lc3RlZCBtYWNyb3MuICAoQ1c3IGlzIE9LLikgIFRoZXJlIGlzIGEgd2F5IHRvIHBhdGNoIHRoZQotZmlsZSwgYnkgc3Vic3RpdHV0aW5nIGNvbnN0YW50IHZhbHVlcy4gIElmIHlvdSBuZWVkIHRvIGRvIHRoaXMsCi1jb250YWN0IHNoZWJzQGN5Z251cy5jb20gZm9yIGRldGFpbHMuCi0KLTxHZXN0YWx0Lmg+IGlzIG1pc3NpbmcgZnJvbSB7Q0luY2x1ZGVzfSBpbiB0aGUgTVBXIHZlcnNpb24gdGhhdCBjb21lcwotd2l0aCBDVzcuICBZb3UgY2FuIGp1c3QgY29weSB0aGUgb25lIGluIENXNydzIHtNV0NJbmNsdWRlc30uCi0KLUNXOCBhbmQgbGF0ZXIgaGF2ZSBjaGFuZ2VzIHRvIGhlYWRlcnMgYW5kIHN1Y2ggdGhhdCB3aWxsIHJlcXVpcmUgY2hhbmdlcwotdG8gdGhlIHNvdXJjZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIHRvIHJlYnVpbGQuCi0KLUtOT1dOIEJVR1MKLQotVGhlIGRlY2xhcmF0aW9ucyBmb3IgbWVtY3B5IGFuZCBtZW1jbXAgaW4gc29tZSB2ZXJzaW9ucyBvZiBoZWFkZXIgZmlsZXMKLW1heSBjb25mbGljdCB3aXRoIEdDQydzIGJ1aWx0aW4gZGVmaW5pdGlvbi4gIEVpdGhlciB1c2UgLWZuby1idWlsdGluCi1vciBpZ25vcmUgdGhlIHdhcm5pbmdzLgotCi1UaGlzIGlzIG5vdCBhIGJ1ZywgYnV0IC0gd2F0Y2ggb3V0IGZvciBjci9ubCB0cmFuc2xhdGlvbiEgIEZvciBpbnN0YW5jZSwKLWlmIGNvbmZpZy9tcHctbWgtbXB3IGlzIG5vdCBwcm9wZXJseSB0cmFuc2xhdGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4KLWNvcGllZCBvciB1cGRhdGVkIHNlcGFyYXRlbHksIHRoZW4gZXZlcnl0aGluZyB3aWxsIGFsbW9zdCBidWlsZCwgYnV0Ci15b3Ugd2lsbCBnZXQgcHV6emxpbmcgZXJyb3IgbWVzc2FnZXMgZnJvbSBtYWtlIG9yIHRoZSBjb21waWxlci4KLQotJy8nIG9yICcgJyBlbWJlZGRlZCBpbiBhbnkgZGV2aWNlLCBkaXJlY3RvcnksIG9yIGZpbGUgbmFtZSBtYXkgb3IgbWF5Ci1ub3Qgd29yay4KLQotb2JqY29weSAtTyBzcmVjIGZvby5vIG1ha2VzIHJhbmRvbSBvdXRwdXQgZmlsZW5hbWVzLgotCi1NYWMteC1taXBzIHJlcXVpcmVzIC1tZ2FzIGJ1dCBVbml4IGhvc3RzIGRvbid0LgotCi1HREIgd2lsbCBmcmVxdWVudGx5IHJlcXVpcmUgYSAnLycgb24gdGhlIGZyb250IG9mIGEgZGV2aWNlIG5hbWUgaW4gb3JkZXIKLXRvIHJlY29nbml6ZSBpdCBhcyBhbiBhYnNvbHV0ZSByYXRoZXIgdGhhbiBhIHJlbGF0aXZlIHBhdGhuYW1lLgotCi1HREIgZG9lc24ndCBzZWVtIHRvIHVzZSB0aGUgcHJpbnRlciBwb3J0IGNvcnJlY3RseSwgYWx0aG91Z2ggaXQgdHJpZXMuCi0KLVRoZSBjdXJzb3IgZG9lc24ndCBhbHdheXMgc3BpbiBhcyBtdWNoIGFzIGl0IHNob3VsZC4gIFRvIGdldCBlbGFib3JhdGUKLXN0YXRpc3RpY3MgYW5kIHdhcm5pbmdzIGFib3V0IHNwaW4gcmF0ZXMsIGFkZCB0aGlzIHRvIFVzZXJTdGFydHVwOgotCi0Jc2V0IE1FQVNVUkVfU1BJTiBhbGwKLQlleHBvcnQgTUVBU1VSRV9TUElOCmRpZmYgLS1naXQgYS9tcHctYnVpbGQuaW4gYi9tcHctYnVpbGQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZDk1MzAuLjAwMDAwMDAKLS0tIGEvbXB3LWJ1aWxkLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLSMgVG9wLWxldmVsIHNjcmlwdCBmcmFnbWVudCB0byBidWlsZCBldmVyeXRoaW5nIGZvciBNUFcuCi0KLVNldCBzYXZlZGlyICJgRGlyZWN0b3J5YCIKLQotI1NldCBFY2hvIDEKLQotU2V0IFRoaXNTY3JpcHQgInswfSIKLQotU2V0IG9iamRpciAiOiIKLQotU2V0IHZlcmlmeSAwCi0KLVNldCBCdWlsZFRhcmdldCAibm9uZSIKLQotIyBQYXJzZSBhcmd1bWVudHMuCi0KLUxvb3AKLQlCcmVhayBJZiB7I30gPT0gMAotCQlJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL25vbmUvCi0JCQlTZXQgQnVpbGRUYXJnZXQgInsxfSIKLQkJRWxzZQotCQkJRWNobyBPbmx5IG9uZSBidWlsZCB0YXJnZXQgYWxsb3dlZCwgaWdub3JpbmcgInsxfSIKLQkJRW5kIElmCi0JU2hpZnQgMQotRW5kIExvb3AKLQotSWYgIntCdWlsZFRhcmdldH0iID1+IC9ub25lLwotCVNldCBCdWlsZFRhcmdldCAiYWxsIgotRW5kIElmCi0KLUlmIHt2ZXJpZnl9ID09IDEKLQlFY2hvICIjIiBEb2luZyAie1RoaXNTY3JpcHR9IiAie0J1aWxkVGFyZ2V0fSIgaW4gImBEaXJlY3RvcnlgIiAuLi4gCi1FbmQgSWYKLQotU2V0IHJhbm1ha2UgMAotCi1JZiAiYEV4aXN0cyBNYWtlZmlsZWAiICE9ICIiCi0JRWNobyAiU2V0IEVjaG8gMSIgPntCdWlsZFRhcmdldH0ubWFrZW91dAotCU1ha2UgLWYgTWFrZWZpbGUge0J1aWxkVGFyZ2V0fSA+PntCdWlsZFRhcmdldH0ubWFrZW91dAotCXtCdWlsZFRhcmdldH0ubWFrZW91dAotCURlbGV0ZSB7QnVpbGRUYXJnZXR9Lm1ha2VvdXQKLQlTZXQgcmFubWFrZSAxCi1FbmQgSWYKLQotSWYgImBFeGlzdHMgTWFrZWZpbGUuUFBDYCIgIT0gIiIKLQlFY2hvICJTZXQgRWNobyAxIiA+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCU1ha2UgLWYgTWFrZWZpbGUuUFBDIHtCdWlsZFRhcmdldH0gPj57QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0Je0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCURlbGV0ZSB7QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0JU2V0IHJhbm1ha2UgMQotRW5kIElmCi0KLUlmIHtyYW5tYWtlfSA9PSAxCi0JRXhpdAotRW5kIElmCi0KLSMgRGlzcGF0Y2ggb24gdmFyaW91cyBwc2V1ZG8tdGFyZ2V0cy4KLQotSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwvCi0JRWNobyBTdGFydGVkIGBEYXRlYAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1nY2MKLQkie1RoaXNTY3JpcHR9IiBhbGwtZ2RiCi0JRWNobyBGaW5pc2hlZCBgRGF0ZWAKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtbGliaWJlcnR5LwotCSJ7VGhpc1NjcmlwdH0iIGRvLWxpYmliZXJ0eQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1iZmQvCi0JIntUaGlzU2NyaXB0fSIgZG8tYmZkCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLW9wY29kZXMvCi0JIntUaGlzU2NyaXB0fSIgZG8tb3Bjb2RlcwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1ieWFjYy8KLQkie1RoaXNTY3JpcHR9IiBkby1ieWFjYwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1mbGV4LwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBkby1mbGV4Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWJpbnV0aWxzLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1iaW51dGlscwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1nYXMvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWdhcwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1nY2MvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1nYXMKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmludXRpbHMKLQkie1RoaXNTY3JpcHR9IiBhbGwtbGQKLQkie1RoaXNTY3JpcHR9IiBkby1nY2MKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ2RiLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1nZGIKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ3Jlei8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGRvLWdyZXoKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtbGQvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWxkCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tYnlhY2MvCi0JU2V0RGlyZWN0b3J5IDpieWFjYzoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1mbGV4LwotCVNldERpcmVjdG9yeSA6ZmxleDoKLQk6Om1wdy1idWlsZCBfYm9vdHN0cmFwCi0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tYmZkLwotCVNldERpcmVjdG9yeSA6YmZkOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWxpYmliZXJ0eS8KLQlTZXREaXJlY3RvcnkgOmxpYmliZXJ0eToKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1vcGNvZGVzLwotCVNldERpcmVjdG9yeSA6b3Bjb2RlczoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1iaW51dGlscy8KLQlTZXREaXJlY3RvcnkgOmJpbnV0aWxzOgotCTo6bXB3LWJ1aWxkIHN0YW1wcwotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdhcy8KLQlTZXREaXJlY3RvcnkgOmdhczoKLQk6Om1wdy1idWlsZCBzdGFtcHMKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1nY2MvCi0JU2V0RGlyZWN0b3J5IDpnY2M6Ci0JOm1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1nZGIvCi0JU2V0RGlyZWN0b3J5IDpnZGI6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ3Jlei8KLQlTZXREaXJlY3RvcnkgOmdyZXo6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tbGQvCi0JU2V0RGlyZWN0b3J5IDpsZDoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1uZXdsaWIvCi0JU2V0RGlyZWN0b3J5IDpuZXdsaWI6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC8KLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktdG9wCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1iaW51dGlscwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtZ2FzCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1nY2MKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWxkCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1nZGIKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWJpbnV0aWxzLwotCVNldERpcmVjdG9yeSA6YmludXRpbHM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ2FzLwotCVNldERpcmVjdG9yeSA6Z2FzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdjYy8KLQlTZXREaXJlY3RvcnkgOmdjYzoKLQk6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdkYi8KLQlTZXREaXJlY3RvcnkgOmdkYjoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1ncmV6LwotCVNldERpcmVjdG9yeSA6Z3JlejoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1sZC8KLQlTZXREaXJlY3RvcnkgOmxkOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHkvCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LXRvcAotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1iaW51dGlscwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1nYXMKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktZ2NjCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWdkYgotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1sZAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1iaW51dGlscy8KLQlTZXREaXJlY3RvcnkgOmJpbnV0aWxzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1nYXMvCi0JU2V0RGlyZWN0b3J5IDpnYXM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdjYy8KLQlTZXREaXJlY3RvcnkgOmdjYzoKLQk6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1nZGIvCi0JU2V0RGlyZWN0b3J5IDpnZGI6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdyZXovCi0JU2V0RGlyZWN0b3J5IDpncmV6OgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1sZC8KLQlTZXREaXJlY3RvcnkgOmxkOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS10b3AvCi0JTmV3Rm9sZGVyUmVjdXJzaXZlICJ7cHJlZml4fSIKLQlJZiAie3ByZWZpeH0iICE9ICJgRGlyZWN0b3J5YCIKLQkJRHVwbGljYXRlIC15ICdSZWFkIE1lIGZvciBNUFcnICJ7cHJlZml4fSInUmVhZCBNZSBmb3IgTVBXJwotCQlEdXBsaWNhdGUgLXkgSW5zdGFsbCAie3ByZWZpeH0iSW5zdGFsbAotCUVuZCBJZgotRWxzZQotCUVjaG8ge0J1aWxkVGFyZ2V0fSBub3QgdW5kZXJzdG9vZCwgaWdub3JpbmcKLUVuZCBJZgotCi1TZXREaXJlY3RvcnkgIntzYXZlZGlyfSIKZGlmZiAtLWdpdCBhL21wdy1jb25maWcuaW4gYi9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI4NzM3Li4wMDAwMDAwCi0tLSBhL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBDeWdudXMgc291cmNlIHRyZWUuCi0KLSMgQ2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhbGwgdGhlIHNwZWNpYWwgdG9vbHMgdGhhdCB3ZSB3aWxsIG5lZWQuCi0jIFRoZSB0ZXN0IGZvciBzZWQgaXMgc2VtaS1wb2ludGxlc3MsIGJlY2F1c2UgaXQncyBhbHJlYWR5IGJlZW4gaW52b2tlZAotIyBieSB0aGUgY2FsY3VsYXRpb24gb2YgdGFyZ2V0X2NwdSBpbiB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0LCBidXQKLSMgdGhlIHRlc3Qgd2lsbCBhbHNvIHNob3cgd2hpY2ggb25lIGlzIGJlaW5nIHVzZWQuCi0KLVNldCBFeGl0IDAKLUVjaG8gYnlhY2MgaXMgYFdoaWNoIGJ5YWNjYAotRWNobyBmbGV4IGlzIGBXaGljaCBmbGV4YAotRWNobyBmb3J3YXJkLWluY2x1ZGUgaXMgYFdoaWNoIGZvcndhcmQtaW5jbHVkZWAKLUVjaG8gTW92ZUlmQ2hhbmdlIGlzIGBXaGljaCBNb3ZlSWZDaGFuZ2VgCi1FY2hvIG1wdy10b3VjaCBpcyBgV2hpY2ggbXB3LXRvdWNoYAotRWNobyBtcHctdHJ1ZSBpcyBgV2hpY2ggbXB3LXRydWVgCi1FY2hvIE5ld0ZvbGRlclJlY3Vyc2l2ZSBpcyBgV2hpY2ggTmV3Rm9sZGVyUmVjdXJzaXZlYAotRWNobyBudWxsLWNvbW1hbmQgaXMgYFdoaWNoIG51bGwtY29tbWFuZGAKLUVjaG8gb3Blbi1icmFjZSBpcyBgV2hpY2ggb3Blbi1icmFjZWAKLUVjaG8gc2VkIGlzIGBXaGljaCBzZWRgCi1FY2hvICd0ci03dG84JyBpcyBgV2hpY2ggdHItN3RvOGAKLUVjaG8gdHJ1ZSBpcyBgV2hpY2ggdHJ1ZWAKLVNldCBFeGl0IDEKLQotU2V0IGhvc3RfbGlicyAibW1hbGxvYyBsaWJpYmVydHkgb3Bjb2RlcyBiZmQgcmVhZGxpbmUgZ2FzaCB0Y2wgdGsgdGNsWCIKLQotU2V0IGhvc3RfdG9vbHMgInRleGluZm8gYnlhY2MgZmxleCBiaXNvbiBiaW51dGlscyBsZCBnYXMgZ2NjIGdkYiBtYWtlIHBhdGNoIFxPcHRpb24tZAotCSAgICBwcm1zIHNlbmQtcHIgZ3Byb2YgZ2RidGVzdCB0Z2FzIGV0YyBleHBlY3QgZGVqYWdudSBzaW0gYmFzaCBcT3B0aW9uLWQKLQkgICAgbTQgYXV0b2NvbmYgaXNwZWxsIGdyZXAgZGlmZiByY3MgY3ZzIGZpbGV1dGlscyBzaGVsbHV0aWxzIHRpbWUgXE9wdGlvbi1kCi0JICAgIHRleHR1dGlscyB3ZGlmZiBmaW5kIGVtYWNzIGVtYWNzMTkgdXVkZWNvZGUgaGVsbG8gdGFyIGd6aXAgaW5kZW50IFxPcHRpb24tZAotCSAgICByZWNvZGUgcmVsZWFzZSBzZWQgdXRpbHMgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBnYXdrIgotCi1TZXQgdGFyZ2V0X2xpYnMgIm5ld2xpYiIKLQotU2V0IHRhcmdldF90b29scyAiZXhhbXBsZXMiCi0KLSMgQ29uZmlndXJlIHRoZSByZXNvdXJjZSBjb21waWxlciBpZiB0YXJnZXRpbmcgTWFjcy4KLUlmIHt0YXJnZXRfb3N9ID1+IC9tYWNvcy8gfHwge3RhcmdldF9vc30gPX4gL21wdy8KLQlTZXQgaG9zdF90b29scyAie2hvc3RfdG9vbHN9IGdyZXoiCi1FbmQgSWYKLQkKLVNldCBjb25maWdkaXJzICJ7aG9zdF9saWJzfSB7aG9zdF90b29sc30ge3RhcmdldF9saWJzfSB7dGFyZ2V0X3Rvb2xzfSIKLUV4cG9ydCBjb25maWdkaXJzCi0KLSMgTWFrZSB1cCBhIHNwZWNpYWwgaW5jbHVkZSBkaXJlY3RvcnkgdGhhdCB0b29scyB3aWxsIHNoYXJlLgotCi1JZiAiYEV4aXN0cyAie29iamRpcn0iZXh0cmEtaW5jbHVkZWAiID09ICIiCi0JTmV3Rm9sZGVyICJ7b2JqZGlyfSJleHRyYS1pbmNsdWRlCi1FbmQgSWYKLQotU2V0IGVkaXIgIntvYmpkaXJ9ZXh0cmEtaW5jbHVkZToiCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOmZpbGUuaCAie2VkaXJ9IidzeXMvZmlsZS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6aW9jdGwuaCAie2VkaXJ9IidzeXMvaW9jdGwuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnBhcmFtLmggIntlZGlyfSInc3lzL3BhcmFtLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpyZXNvdXJjZS5oICJ7ZWRpcn0iJ3N5cy9yZXNvdXJjZS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6c3RhdC5oICJ7ZWRpcn0iJ3N5cy9zdGF0LmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czp0aW1lLmggIntlZGlyfSInc3lzL3RpbWUuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnR5cGVzLmggIntlZGlyfSInc3lzL3R5cGVzLmgnCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDphb3V0NjQuaCAie2VkaXJ9Iidhb3V0L2FvdXQ2NC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OmFyLmggIntlZGlyfSInYW91dC9hci5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnJhbmxpYi5oICJ7ZWRpcn0iJ2FvdXQvcmFubGliLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6cmVsb2MuaCAie2VkaXJ9Iidhb3V0L3JlbG9jLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6c3RhYi5kZWYgIntlZGlyfSInYW91dC9zdGFiLmRlZicKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpzdGFiX2dudS5oICJ7ZWRpcn0iJ2FvdXQvc3RhYl9nbnUuaCcKLQotSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInYW91dC8nInt0YXJnZXRfY3B1fSInLmgnCi1FbmQgSWYKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOmVjb2ZmLmggIntlZGlyfSInY29mZi9lY29mZi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOmludGVybmFsLmggIntlZGlyfSInY29mZi9pbnRlcm5hbC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOnN5bS5oICJ7ZWRpcn0iJ2NvZmYvc3ltLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6c3ltY29uc3QuaCAie2VkaXJ9Iidjb2ZmL3N5bWNvbnN0LmgnCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjoie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ2NvZmYvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi1JZiAie3RhcmdldF9jcHV9IiA9fiAvcG93ZXJwYy8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6cnM2MDAwLmggIntlZGlyfSInY29mZi9yczYwMDAuaCcKLUVuZCBJZgotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpjb21tb24uaCAie2VkaXJ9IidlbGYvY29tbW9uLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpkd2FyZi5oICJ7ZWRpcn0iJ2VsZi9kd2FyZi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6ZHdhcmYyLmggIntlZGlyfSInZWxmL2R3YXJmMi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6ZXh0ZXJuYWwuaCAie2VkaXJ9IidlbGYvZXh0ZXJuYWwuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmludGVybmFsLmggIntlZGlyfSInZWxmL2ludGVybmFsLmgnCi0KLSMgQmVsaWV2ZSBpdCBvciBub3QsIEdEQiBuZWVkcyB0aGlzIGZvciBhbGwgdGFyZ2V0cy4KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOm1pcHMuaCAie2VkaXJ9IidlbGYvbWlwcy5oJwotCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInZWxmLycie3RhcmdldF9jcHV9IicuaCcKLUVuZCBJZgotSWYgInt0YXJnZXRfY3B1fSIgPX4gL3Bvd2VycGMvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6cHBjLmggIntlZGlyfSInZWxmL3BwYy5oJwotRW5kIElmCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTpvcGNvZGU6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpvcGNvZGU6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9IidvcGNvZGUvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi1JZiAie3RhcmdldF9jcHV9IiA9fiAvcG93ZXJwYy8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOm9wY29kZTpwcGMuaCAie2VkaXJ9IidvcGNvZGUvcHBjLmgnCi1FbmQgSWYKLQotIyBBZGQgc29tZSBiZmQgaW5jbHVkZXMgdGhhdCBnZXQgbWVudGlvbmVkIG91dHNpZGUgdGhlIGJmZCBkaXIuCi0JCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJiZmQ6bGliY29mZi5oICJ7ZWRpcn0iJ2JmZC9saWJjb2ZmLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJiZmQ6bGliZWNvZmYuaCAie2VkaXJ9IidiZmQvbGliZWNvZmYuaCcKLQotIyBUcmFuc2xhdGUgcmFuZG9tIGZpbGVzIGludG8gTVBXLW9ubHkgY2hhcmFjdGVyIHNldC4KLQotdHItN3RvOCAie3NyY2Rpcn0ibXB3LVJFQURNRSA+ICJ7b2JqZGlyfVJlYWQgTWUgZm9yIE1QVyIKLXRyLTd0bzggIntzcmNkaXJ9Im1wdy1pbnN0YWxsID4gIntvYmpkaXJ9Ikluc3RhbGwKZGlmZiAtLWdpdCBhL21wdy1jb25maWd1cmUgYi9tcHctY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ1MTQ4Li4wMDAwMDAwCi0tLSBhL21wdy1jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIHNjcmlwdAotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIyMgV0FSTklORwotIyMjIFRoaXMgc2NyaXB0IG11c3QgTk9UIHVzZSBhbnkgOC1iaXQgY2hhcnMhCi0jIyMgV0FSTklORwotCi0jIFRoaXMgaXMgYW4gTVBXIFNoZWxsIHNjcmlwdCB0aGF0IHNldHMgZXZlcnl0aGluZyB1cCBmb3IgY29tcGlsYXRpb24sCi0jIG1haW5seSBjcmVhdGluZyBkaXJlY3RvcmllcywgYW5kIGVkaXRpbmcgY29waWVzIG9mIGZpbGVzLgotCi1TZXQgc2F2ZWRpciAiYERpcmVjdG9yeWAiCi0KLSNTZXQgRWNobyAxCi0KLVNldCBUaGlzU2NyaXB0ICJ7MH0iCi0KLVNldCBzcmNyb290ICItLS0tLS0tLSIKLQotU2V0IHNyY2RpciAiOiIKLQotU2V0IG9iamRpciAiOiIKLQotU2V0IHByZWZpeCAie01QV30iOkdOVVRvb2xzOgotCi1TZXQgZXhlY19wcmVmaXggIiIKLQotU2V0IGJpbmRpciAiIgotCi1TZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0KLVNldCB0YXJnZXRfYWxpYXMge2hvc3RfYWxpYXN9Ci0KLVNldCBob3N0X2NjICJtcHdjIgotCi1TZXQgd2l0aF9nbnVfbGQgMAotCi1TZXQgaGVscG91dHB1dCAwCi0KLVNldCByZWN1cnNlIDEKLQotU2V0IHZlcmlmeSAwCi1TZXQgdmVyaWZ5c3RyICIiCi0KLVNldCBlbmFibGVfb3B0aW9ucyAiIgotU2V0IGRpc2FibGVfb3B0aW9ucyAiIgotCi0jIFBhcnNlIGFyZ3VtZW50cy4KLQotTG9vcAotCUJyZWFrIElmIHsjfSA9PSAwCi0JSWYgInsxfSIgPX4gLy0tY2MvCi0JCVNldCBob3N0X2NjICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLWJpbmRpci8KLQkJU2V0IGJpbmRpciAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1kaXNhYmxlLT8rLwotCQlTZXQgYEVjaG8gezF9IHwgc2VkIC1lICdzLy0tZGlzYWJsZS0vZW5hYmxlXy8nYCBubwotCQlTZXQgZGlzYWJsZV9vcHRpb25zICJ7ZGlzYWJsZV9vcHRpb25zfSAnezF9JyIKLQlFbHNlIElmICJ7MX0iID1+IC8tLWVuYWJsZS0/Ky8KLQkJU2V0IGBFY2hvIHsxfSB8IHNlZCAtZSAncy8tLWVuYWJsZS0vZW5hYmxlXy8nYCB5ZXMKLQkJU2V0IGVuYWJsZV9vcHRpb25zICJ7ZW5hYmxlX29wdGlvbnN9ICd7MX0nIgotCUVsc2UgSWYgInsxfSIgPX4gLy0tZXhlYy1wcmVmaXgvCi0JCVNldCBleGVjX3ByZWZpeCAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1oZWxwLwotCQlTZXQgaGVscG91dHB1dCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1ob3N0LwotCQlTZXQgaG9zdF9hbGlhcyAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1ub3JlY3Vyc2lvbi8KLQkJU2V0IHJlY3Vyc2UgMAotCUVsc2UgSWYgInsxfSIgPX4gLy0tcHJlZml4LwotCQlTZXQgcHJlZml4ICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLXNyY2Rpci8KLQkJU2V0IHNyY2RpciAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1zcmNyb290LwotCQlTZXQgc3Jjcm9vdCAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS10YXJnZXQvCi0JCVNldCB0YXJnZXRfYWxpYXMgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy12LwotCQlTZXQgdmVyaWZ5IDEKLQkJU2V0IHZlcmlmeXN0ciAiLXYiCi0JRWxzZSBJZiAiezF9IiA9fiAvLS13aXRoLWdudS1sZC8KLQkJU2V0IHdpdGhfZ251X2xkIDEKLQlFbHNlCi0JCUVjaG8gLW4gJ21wdy1jb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246ICInCi0JCUVjaG8gLW4gInsxfSIKLQkJRWNobyAnIjsgdXNlIC0taGVscCBmb3IgdXNhZ2UuJwotCQlFeGl0IDEKLQlFbmQgSWYKLQlTaGlmdCAxCi1FbmQgTG9vcAotCi1JZiB7aGVscG91dHB1dH0gPT0gMQotCUVjaG8gIlVzYWdlOiBtcHctY29uZmlndXJlIFtPUFRJT05TXSIKLQlFY2hvICIiCi0JRWNobyAiT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzXSIKLQlFY2hvICItLWJpbmRpciBESVIgICAgICBkaXJlY3RvcnkgZm9yIGJpbmFyaWVzIFtdIgotCUVjaG8gIi0tY2MgQ0MgICAgICAgICAgIHVzZSBDIGNvbXBpbGVyIENDIFttcHdjXSIKLQlFY2hvICItLWRpc2FibGUtRk9PICAgICBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTyIKLQlFY2hvICItLWVuYWJsZS1GT08gICAgICBpbmNsdWRlIGZlYXR1cmUgRk9PIgotCUVjaG8gIi0tZXhlYy1wcmVmaXggRElSIGluc3RhbGwgaG9zdC1kZXBlbmRlbnQgZmlsZXMgaW50byBESVIgW10iCi0JRWNobyAiLS1oZWxwICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIgotCUVjaG8gIi0taG9zdCBIT1NUICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbbTY4ay1hcHBsZS1tcHddIgotCUVjaG8gIi0tbm9yZWN1cnNpb24gICAgIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXSIKLQlFY2hvICItLXByZWZpeCBESVIgICAgICBpbnN0YWxsIGludG8gRElSIFt7TVBXfTpHTlVUb29sczpdIgotCUVjaG8gIi0tc3JjZGlyIERJUiAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFs6XSIKLQlFY2hvICItLXNyY3Jvb3QgRElSICAgICBmaW5kIHRoZSB0b3BsZXZlbCBzb3VyY2VzIGluIERJUiBbOl0iCi0JRWNobyAiLS10YXJnZXQgVEFSR0VUICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXSIKLQlFY2hvICItdiAgICAgICAgICAgICAgICB2ZXJib3NlIgotCUVjaG8gIi0td2l0aC1nbnUtbGQgICAgIGxpbmsgdXNpbmcgR05VIGxkIFtub10iCi0JRXhpdCAwCi1FbmQgSWYKLQotU2V0IEV4aXQgMAotCi0jIERlZmF1bHQgZXhlY19wcmVmaXggZnJvbSBwcmVmaXguCi0KLUlmICJ7ZXhlY19wcmVmaXh9IiA9PSAiIgotCVNldCBleGVjX3ByZWZpeCAie3ByZWZpeH0iCi1FbmQgSWYKLQotSWYgIntiaW5kaXJ9IiA9PSAiIgotCVNldCBiaW5kaXIgIntwcmVmaXh9ImJpbjoKLUVuZCBJZgotCi0jIFBvaW50IHRvIHRoZSBjb3JyZWN0IHNldCBvZiB0b29scyB0byB1c2Ugd2l0aCB0aGUgY2hvc2VuIGNvbXBpbGVyLgotCi1JZiAie2hvc3RfY2N9IiA9fiAvbXB3Yy8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NUFdfQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfTElCfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9MSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX0N9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl82OEt9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvc2M2OGsvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfU0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSX0xJQn0nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19DfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL213YzY4ay8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NV0M2OEt9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSX01XTElOSzY4S30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTVdMSU5LNjhLfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX01XQzY4S30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9nY2M2OGsvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfNjhLX0dDQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfNjhLX0FSfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfUkFOTElCfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDXzY4S19HQ0N9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9wcGNjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX1BQQ0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9tcmMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVJDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvc2NwcGMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfU0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9td2NwcGMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVdDUFBDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9NV0xJTktQUEN9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX01XTElOS1BQQ30nCi0JIyBNaXNsZWFkaW5nLCBidXQgd2UgZG9uJ3QgbmVlZCBhIFBFRiBzdGVwLgotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfTVdDUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djY3BwYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19QUENfR0NDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlJZiB7d2l0aF9nbnVfbGR9ID09IDEKLQkJU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX1JBTkxJQn0nCi0JCVNldCBjY19sZF9uYW1lICd7Q0NfTERfR0xEfScKLQlFbHNlCi0JCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQkJU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlFbmQgSWYKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZQotCUVjaG8gIntob3N0X2NjfSIgaXMgbm90IGEga25vd24gTVBXIGNvbXBpbGVyIHR5cGUKLUVuZCBJZgotCi1TZXQgZGFzaF9jX2ZsYWcgJycKLUlmICJ7aG9zdF9jY30iID1+IC9nY2M2OGsvCi0JU2V0IGRhc2hfY19mbGFnICctYycKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djY3BwYy8KLQlTZXQgZGFzaF9jX2ZsYWcgJy1jJwotRW5kIElmCi0KLSMgKHNob3VsZCBpbnRlcnByZXQgYWxpYXNlcyBpZiBub3QgaW4gY2Fub25pY2FsIGZvcm0pCi0KLVNldCBob3N0X2Nhbm9uaWNhbCAie2hvc3RfYWxpYXN9IgotCi1TZXQgdGFyZ2V0X2Nhbm9uaWNhbCAie3RhcmdldF9hbGlhc30iCi0KLVNldCBjb25maWdkaXJzICIiCi0KLUlmICJ7c3Jjcm9vdH0iID1+IC8tLS0tLS0tLS8KLQlTZXQgc3Jjcm9vdCAie3NyY2Rpcn0iCi1FbmQgSWYKLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJgIiA9PSAiIgotCUVjaG8gU291cmNlIGRpcmVjdG9yeSB7c3JjZGlyfSBkb2VzIG5vdCBleGlzdCEKLQlFeGl0IDEKLUVuZCBJZgotSWYgImBFeGlzdHMgIntzcmNyb290fSJgIiA9PSAiIgotCUVjaG8gVG9wLWxldmVsIHNvdXJjZSBkaXJlY3Rvcnkge3NyY3Jvb3R9IGRvZXMgbm90IGV4aXN0IQotCUV4aXQgMQotRW5kIElmCi0KLVNldCB0YXJnZXRfY3B1ICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMS8nYCIKLVNldCB0YXJnZXRfdmVuZG9yICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMi8nYCIKLVNldCB0YXJnZXRfb3MgImBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wzLydgIgotCi0jIENyZWF0ZSBhIGZpbGUgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9sZGVyIHRoYW4gYW55IG90aGVyIGhlcmUuCi0KLUlmICJgRXhpc3RzICJ7b2JqZGlyfSJfb2xkZXN0YCIgPT0gIiIKLQltcHctdG91Y2ggX29sZGVzdAotRW5kIElmCi0KLSMgUmVjb3JkIHRoaXMgYmVmb3JlIGNyZWF0aW5nIGFueSBmaWxlcywgbWFrZWZpbGVzIHNvbWV0aW1lcyBtZW50aW9uCi0jIGRlcGVuZGVuY2llcyBvbiBjb25maWcuc3RhdHVzLgotCi1FY2hvICIjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6IiA+Y29uZmlnLm5ldwotRWNobyAie1RoaXNTY3JpcHR9IC0taG9zdCB7aG9zdF9hbGlhc30gLS10YXJnZXQge3RhcmdldF9hbGlhc30gLS1zcmNkaXIge3NyY2Rpcn0gIC0tc3Jjcm9vdCB7c3Jjcm9vdH0gIC0tcHJlZml4IHtwcmVmaXh9IC0tY2Mge2hvc3RfY2N9IHt2ZXJpZnlzdHJ9IHtlbmFibGVfb3B0aW9uc30ge2Rpc2FibGVfb3B0aW9uc30gLS1ub3JlY3Vyc2lvbiIgPj5jb25maWcubmV3Ci1Nb3ZlSWZDaGFuZ2UgY29uZmlnLm5ldyBjb25maWcuc3RhdHVzCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctY29uZmlnLmluYCIgIT0gIiIKLQl0ci03dG84ICJ7c3JjZGlyfSJtcHctY29uZmlnLmluID4ie29iamRpcn0ibXB3LWNvbmZpZy5pbgotCUV4ZWN1dGUgIntvYmpkaXJ9Im1wdy1jb25maWcuaW4KLUVuZCBJZgotCi0jIFN0YXJ0IE1ha2VmaWxlIGNvbnN0cnVjdGlvbiBieSBkZWZpbmluZyBhbGwgdGhlIHZhcmlhYmxlcyBjaG9zZW4gYnkKLSMgY29uZmlndXJhdGlvbi4KLQotRWNobyAiIyBUaGlzIE1ha2VmaWxlIHByb2R1Y2VkIGJ5IG1wdy1jb25maWd1cmUuICBDaGFuZ2VzIG1heSBnZXQgbG9zdCEiID4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAic3Jjcm9vdCA9ICIge3NyY3Jvb3R9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidG9wc3JjZGlyID0gIiB7c3Jjcm9vdH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJzcmNkaXIgPSAiIHtzcmNkaXJ9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAibXB3X3ByZWZpeCA9ICIge3ByZWZpeH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJtcHdfZXhlY19wcmVmaXggPSAiIHtleGVjX3ByZWZpeH0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIm1wd19iaW5kaXIgPSAiIHtiaW5kaXJ9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiaG9zdF9hbGlhcyA9ICIge2hvc3RfYWxpYXN9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfYWxpYXMgPSAiIHt0YXJnZXRfYWxpYXN9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfY3B1ID0gIiB7dGFyZ2V0X2NwdX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF92ZW5kb3IgPSAiIHt0YXJnZXRfdmVuZG9yfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X29zID0gIiB7dGFyZ2V0X29zfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9jYW5vbmljYWwgPSAiIHt0YXJnZXRfY2Fub25pY2FsfQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJob3N0X21ha2VmaWxlX2ZyYWcgPSAiCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAiCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiQ0MgPSAiIHtjY19uYW1lfQkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJBUiA9ICIge2FyX25hbWV9CQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIlJBTkxJQiA9ICIge3JhbmxpYl9uYW1lfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIkNDX0xEID0gIiB7Y2NfbGRfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJQUk9HX0VYVCA9ICIge3Byb2dfZXh0X25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJFWFRSQUxJQlMgPSAiIHtleHRyYWxpYnNfbmFtZX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIk1BS0VQRUYgPSAiIHttYWtlcGVmX25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJSRVogPSAiIHtyZXpfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0KLUlmIHtob3N0X2NjfSA9fiAvZ2NjcHBjLwotCUVjaG8gLW4gImRxID1cT3B0aW9uLWRcT3B0aW9uLWRcT3B0aW9uLWQiID4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAKLQlFY2hvICciJyAJCQkJID4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0wCi0JdHItN3RvOCAgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAJPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbHNlCi0JRWNobyAtbiAiZHEgPSciIAkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlFY2hvIC1uICciJyAJCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVjaG8gICAgIiciIAkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbmQgSWYKLQotIyBBcHBlbmQgdGhlIG1hc3RlciBzZXQgb2YgZGVmaW5pdGlvbnMgZm9yIHRoZSB2YXJpb3VzIGNvbXBpbGVycy4KLQotSWYgImBFeGlzdHMgIntzcmNkaXJ9ImNvbmZpZzptcHctbWgtbXB3YCIgIT0gIiIKLQl0ci03dG84ICJ7c3JjZGlyfSJjb25maWc6bXB3LW1oLW1wdyA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVsc2UgSWYgImBFeGlzdHMgIntzcmNyb290fSJjb25maWc6bXB3LW1oLW1wd2AiICE9ICIiCi0JdHItN3RvOCAie3NyY3Jvb3R9ImNvbmZpZzptcHctbWgtbXB3ID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWxzZQotCUVjaG8gImNhbid0IGZpbmQgYSBob3N0IGNvbmZpZyBmaWxlISIKLQlFeGl0IDAKLUVuZCBJZgotCi0jIEFwcGVuZCBhbnl0aGluZyBwcm9kdWNlZCBieSB0aGUgZGlyZWN0b3J5J3MgbXB3LWNvbmZpZy5pbi4KLQotSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnRtcGAiICE9ICIiCi0JQ2F0ZW5hdGUgIntvYmpkaXJ9Im1rLnRtcCA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQkjIEFuIG1wdy1jb25maWcuaW4gbWlnaHQgY2hhbmdlIHNvIGFzIG5vdCB0byBjcmVhdGUgdGhpcwotCSMgYW55bW9yZSwgc28gZ2V0IHJpZCBvZiBpdCBub3cgdG8gYmUgc2FmZS4KLQlEZWxldGUgLWkgLXkgIntvYmpkaXJ9Im1rLnRtcAotRW5kIElmCi0KLSMgSWYgdGhlcmUgYXJlIHNlZCBzY3JpcHRzIHRvIGVkaXQgdGhlIFVuaXggTWFrZWZpbGUuaW4sIHVzZSB0aGVtOyBvdGhlcndpc2UKLSMgdXNlIGFuIG1wdy1tYWtlLmluIGlmIHByZXNlbnQuCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctbWFrZS5zZWRgIiAhPSAiIgotCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJoYWNrZWRfTWFrZWZpbGUuaW5gIiAhPSAiIgotCQlTZXQgTWFrZWZpbGVJbiAie29iamRpcn0iaGFja2VkX01ha2VmaWxlLmluCi0JRWxzZQotCQlTZXQgTWFrZWZpbGVJbiAie3NyY2Rpcn0iTWFrZWZpbGUuaW4KLQlFbmQgSWYKLQkjIEZpbmQgdGhlIGdlbmVyaWMgbWFrZWZpbGUgZWRpdGluZyBzY3JpcHQuCi0JSWYgImBFeGlzdHMgIntzcmNyb290fSJjb25maWc6bXB3OmctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7c3Jjcm9vdH0iY29uZmlnOm1wdzpnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbHNlIElmICJgRXhpc3RzICJ7c3Jjcm9vdH0idXRpbHM6bXB3OmctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7c3Jjcm9vdH0idXRpbHM6bXB3OmctbXB3LW1ha2Uuc2VkICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVsc2UgSWYgImBFeGlzdHMgIntzcmNkaXJ9ImctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7c3JjZGlyfSJnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbHNlCi0JCUVjaG8gV2FybmluZzogZy1tcHctbWFrZS5zZWQgbm90IGZvdW5kLCBjb3B5aW5nICJ7TWFrZWZpbGVJbn0iIHZlcmJhdGltLi4uCi0JCUNhdGVuYXRlICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVuZCBJZgotCXNlZCAtZiAie3NyY2Rpcn0ibXB3LW1ha2Uuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCXNlZCAtZSAncy9ecHJlZml4ID0gLiokL3ByZWZpeCA9IHttcHdfcHJlZml4fS9nJyAtZSAncy9eZXhlY19wcmVmaXggPSAuKiQvZXhlY19wcmVmaXggPSB7bXB3X2V4ZWNfcHJlZml4fS9nJyAtZSAncy9eYmluZGlyID0gQGJpbmRpckAvYmluZGlyID0ge21wd19iaW5kaXJ9L2cnICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yID4ie29iamRpcn0iTWFrZWZpbGUudGVtMwotCXNlZCAtZSAicy9AREFTSF9DX0ZMQUdAL3tkYXNoX2NfZmxhZ30vIiAtZSAicy9AU0VHTUVOVF9GTEFHKFwoW14pXSpcKSlAL3tzZWdtZW50X2ZsYWd9XDEvIiAie29iamRpcn0iTWFrZWZpbGUudGVtMyA+IntvYmpkaXJ9Im1wdy1tYWtlLmluCi0JdHItN3RvOCAie29iamRpcn0ibXB3LW1ha2UuaW4gPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi0JSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie29iamRpcn0ibWsuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCi0JCVJlbmFtZSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtMiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0JRW5kIElmCi0JTW92ZUlmQ2hhbmdlICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gIntvYmpkaXJ9Ik1ha2VmaWxlCi0JRGVsZXRlIC1pIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW1bMTJdCi0JSWYge3ZlcmlmeX0gPT0gMQotCQlFY2hvIENyZWF0ZWQgTWFrZWZpbGUgaW4gImBEaXJlY3RvcnlgIgotCUVuZCBJZgotRWxzZSBJZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LW1ha2UuaW5gIiAhPSAiIgotCXNlZCAtZSAncy9ecHJlZml4ID0gLiokL3ByZWZpeCA9IHttcHdfcHJlZml4fS9nJyAie3NyY2Rpcn0ibXB3LW1ha2UuaW4gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0Jc2VkIC1lICJzL0BEQVNIX0NfRkxBR0Ave2Rhc2hfY19mbGFnfS8iIC1lICJzL0BTRUdNRU5UX0ZMQUcoXChbXildKlwpKUAve3NlZ21lbnRfZmxhZ319XDEvIiAie29iamRpcn0iTWFrZWZpbGUudGVtMSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKLQl0ci03dG84ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJtay5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntvYmpkaXJ9Im1rLnNlZCAie29iamRpcn0iTWFrZWZpbGUudGVtID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCQlSZW5hbWUgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVuZCBJZgotCU1vdmVJZkNoYW5nZSAie29iamRpcn0iTWFrZWZpbGUudGVtICJ7b2JqZGlyfSJNYWtlZmlsZQotCURlbGV0ZSAtaSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtWzEyXQotCUlmIHt2ZXJpZnl9ID09IDEKLQkJRWNobyBDcmVhdGVkIE1ha2VmaWxlIGluICJgRGlyZWN0b3J5YCIKLQlFbmQgSWYKLUVuZCBJZgotCi0jIFByb2R1Y2UgYSBidWlsZCBzY3JpcHQgaWYgdGhlIHNvdXJjZSBpcyBkZWZpbmVkLgotCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LWJ1aWxkLmluYCIgIT0gIiIKLQlFY2hvICJTZXQgc3Jjcm9vdCAiIHtzcmNyb290fSA+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JRWNobyAiU2V0IHNyY2RpciAiIHtzcmNkaXJ9ID4+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JRWNobyAiU2V0IHRhcmdldF9jYW5vbmljYWwgIiB7dGFyZ2V0X2Nhbm9uaWNhbH0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQlFY2hvICJTZXQgcHJlZml4ICIge3ByZWZpeH0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQl0ci03dG84ICJ7c3JjZGlyfSJtcHctYnVpbGQuaW4gPj4ie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCU1vdmVJZkNoYW5nZSAie29iamRpcn0ibXB3LWJ1aWxkLnRlbSAie29iamRpcn0ibXB3LWJ1aWxkCi0JSWYge3ZlcmlmeX0gPT0gMQotCQlFY2hvIENyZWF0ZWQgbXB3LWJ1aWxkIGluICJgRGlyZWN0b3J5YCIKLQlFbmQgSWYKLUVuZCBJZgotCi0jIEFwcGx5IG91cnNlbHZlcyByZWN1cnNpdmVseSB0byB0aGUgbGlzdCBvZiBzdWJkaXJlY3RvcmllcyB0byBjb25maWd1cmUuCi0KLUlmIHtyZWN1cnNlfSA9PSAxCi0JRm9yIHN1YmRpciBJbiB7Y29uZmlnZGlyc30KLQkJU2V0IHNhdmVkaXIgImBEaXJlY3RvcnlgIgotCQlJZiAiYEV4aXN0cyAie3NyY2Rpcn17c3ViZGlyfToiYCIgPT0gIiIKLQkJCUlmIHt2ZXJpZnl9ID09IDEKLQkJCQlFY2hvIE5vICJ7c3JjZGlyfXtzdWJkaXJ9OiIgZm91bmQsIHNraXBwaW5nCi0JCQlFbmQgSWYKLQkJCUNvbnRpbnVlCi0JCUVuZCBJZgotCQlJZiB7dmVyaWZ5fSA9PSAxCi0JCQlFY2hvIENvbmZpZ3VyaW5nIHtzdWJkaXJ9Li4uCi0JCUVuZCBJZgotCQlJZiAiYEV4aXN0cyAie29iamRpcn17c3ViZGlyfToiYCIgPT0gIiIKLQkJCU5ld0ZvbGRlciAie29iamRpcn17c3ViZGlyfSIKLQkJRW5kIElmCi0JCVNldERpcmVjdG9yeSAie29iamRpcn17c3ViZGlyfToiCi0JCSJ7VGhpc1NjcmlwdH0iIC0tdGFyZ2V0ICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iIC0tc3JjZGlyICJ7c3JjZGlyfXtzdWJkaXJ9OiIgLS1zcmNyb290ICJ7c3Jjcm9vdH0iIC0tcHJlZml4ICJ7cHJlZml4fSIgLS1jYyAie2hvc3RfY2N9IiB7dmVyaWZ5c3RyfSB7ZW5hYmxlX29wdGlvbnN9IHtkaXNhYmxlX29wdGlvbnN9Ci0JCVNldERpcmVjdG9yeSAie3NhdmVkaXJ9IgotCUVuZCBGb3IKLUVuZCBJZgotCi1TZXREaXJlY3RvcnkgIntzYXZlZGlyfSIKZGlmZiAtLWdpdCBhL21wdy1pbnN0YWxsIGIvbXB3LWluc3RhbGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzVhYWMuLjAwMDAwMDAKLS0tIGEvbXB3LWluc3RhbGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotIyBHTlUgSW5zdGFsbCBzY3JpcHQgZm9yIE1QVy4KLQotU2V0IE9sZEV4aXQgIntFeGl0fSIKLVNldCBFeGl0IDAKLQotU2V0IFRlbXBVc2VyU3RhcnR1cCAie1RlbXBGb2xkZXJ9Il9fdGVtcF9fVXNlclN0YXJ0dXAKLQotRWNobyAnIyBVc2VyU3RhcnR1cCBnZW5lcmF0ZWQgYnkgR05VIEluc3RhbGwgc2NyaXB0JyA+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgKHNob3VsZCkgQ2hlY2sgdGhhdCBkaXNrIHNwYWNlIGlzIHN1ZmZpY2llbnQgZm9yIGluc3RhbGxhdGlvbi4KLQotIyBBc3N1bWUgdGhhdCB0aGUgaW5zdGFsbCBzY3JpcHQgaXMgd2hlcmUgZXZlcnl0aGluZyBlbHNlIGlzLgotCi1TZXQgdGhpc2RpciAiYERpcmVjdG9yeWAiCi0KLSMgQ29weSB0aGUgYmluYXJpZXMgdG8gdGhlIGRlc2lyZWQgcGxhY2UuCi0KLUNvbmZpcm0gLXQgIkNvcHkgdGhlIGJpbmFyaWVzIHRvIHNvbWV3aGVyZSBlbHNlPyIKLVNldCBUbXBTdGF0dXMge1N0YXR1c30KLUlmIHtUbXBTdGF0dXN9ID09IDAKLQlTZXQgYmluZGVzdCAiYEdldEZpbGVOYW1lIC1kIC1tICJXaGVyZSB0byBpbnN0YWxsIHRoZSBiaW5hcmllcz8iYCIKLQlJZiB7U3RhdHVzfSA9PSAwCi0JCUlmICJgRXhpc3RzICJ7dGhpc2Rpcn1iaW4iYCIgIT0gIiIKLQkJCUZvciBhZmlsZSBJbiAie3RoaXNkaXJ9ImJpbjpcT3B0aW9uLXgKLQkJCQlEdXBsaWNhdGUgLXkgInthZmlsZX0iICJ7YmluZGVzdH0iCi0JCQlFbmQgRm9yCi0JCUVsc2UKLQkJCUVjaG8gImJpbiBkaXJlY3Rvcnkgbm90IGZvdW5kLCBleGl0aW5nIgotCQkJRXhpdCAxCi0JCUVuZCBJZgotCUVsc2UKLQkJRWNobyAiTm8gZGVzdGluYXRpb24gc3VwcGxpZWQsIGV4aXRpbmciCi0JCUV4aXQgMQotCUVuZCBJZgotRWxzZSBJZiB7VG1wU3RhdHVzfSA9PSA0Ci0JIyBVc2UgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeS4KLQlTZXQgYmluZGVzdCAie3RoaXNkaXJ9YmluOiIKLUVsc2UKLQkjIENhbmNlbGxlZCBmcm9tIGNvbmZpcm1hdGlvbiwgZXNjYXBlIGFsdG9nZXRoZXIuCi0JRXhpdCAxCi1FbmQgSWYKLQotIyBDb3B5IHRoZSBsaWJyYXJpZXMgdG8gdGhlIGRlc2lyZWQgcGxhY2UuCi0KLUNvbmZpcm0gLXQgIkNvcHkgdGhlIGxpYnJhcmllcyB0byBzb21ld2hlcmUgZWxzZT8iCi1TZXQgVG1wU3RhdHVzIHtTdGF0dXN9Ci1JZiB7VG1wU3RhdHVzfSA9PSAwCi0JU2V0IGxpYmRlc3QgImBHZXRGaWxlTmFtZSAtZCAtbSAiV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFyaWVzPyJgIgotCUlmIHtTdGF0dXN9ID09IDAKLQkJSWYgImBFeGlzdHMgInt0aGlzZGlyfWxpYjoiYCIgIT0gIiIKLQkJCUZvciBhZmlsZSBJbiAie3RoaXNkaXJ9ImxpYjpcT3B0aW9uLXgKLQkJCQlEdXBsaWNhdGUgLXkgInthZmlsZX0iICJ7bGliZGVzdH0iCi0JCQlFbmQgRm9yCi0JCUVsc2UKLQkJCUVjaG8gImxpYiBkaXJlY3Rvcnkgbm90IGZvdW5kLCBleGl0aW5nIgotCQkJRXhpdCAxCi0JCUVuZCBJZgotCUVsc2UKLQkJRWNobyAiTm8gZGVzdGluYXRpb24gc3VwcGxpZWQsIGV4aXRpbmciCi0JCUV4aXQgMQotCUVuZCBJZgotRWxzZSBJZiB7VG1wU3RhdHVzfSA9PSA0Ci0JIyBVc2UgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeS4KLQlTZXQgbGliZGVzdCAie3RoaXNkaXJ9bGliOiIKLUVsc2UKLQkjIENhbmNlbGxlZCBmcm9tIGNvbmZpcm1hdGlvbiwgZXNjYXBlIGFsdG9nZXRoZXIuCi0JRXhpdCAxCi1FbmQgSWYKLQotCi0jIEFkZCB0aGUgbG9jYXRpb24gb2YgdGhlIGJpbmFyaWVzIHRvIHRoZSBjb21tYW5kIHBhdGguCi0KLUVjaG8gLW4gJ1NldCBDb21tYW5kcyAiJwkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gLW4gIntiaW5kZXN0fSIJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAgICAnLHtDb21tYW5kc30iJwkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotCi0jIFNldCB1cCBHQ0MgZXhlYyBwcmVmaXguCi0KLVNldCBnY2NsaWJkaXIgIntsaWJkZXN0fSJnY2MtbGliOgotCi1FY2hvIC1uICdTZXQgR0NDX0VYRUNfUFJFRklYICInCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAtbiAie2djY2xpYmRpcn0iCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gICAgJyInCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICJFeHBvcnQgR0NDX0VYRUNfUFJFRklYIgkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgU2V0IHVwIHBhdGggdG8gbGliZ2NjLnhjb2ZmIGV0Yy4KLQotRWNobyAtbiAnU2V0IEdDQ1BQQ0xpYnJhcmllcyAiJwkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gLW4gIntsaWJkZXN0fSIJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAgICAnIicJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gIkV4cG9ydCBHQ0NQUENMaWJyYXJpZXMiCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotIyBEaXNwbGF5IGNvbnRlbnRzIG9mIFVzZXJTdGFydHVwLCBjb25maXJtIGluc3RhbGxhdGlvbi4KLQotU2V0IFVzZXJTdGFydHVwTmFtZSAiVXNlclN0YXJ0dXBcT3B0aW9uLThHTlUiCi0KLUVjaG8gIkNvbnRlbnRzIG9mIiB7VXNlclN0YXJ0dXBOYW1lfSAid2lsbCBiZToiCi1DYXRlbmF0ZSAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLUNvbmZpcm0gIkluc3RhbGwge1VzZXJTdGFydHVwTmFtZX0gaW50byB0aGUgTVBXIGZvbGRlciB7TVBXfSA/IgotSWYge1N0YXR1c30gPT0gMAotCUR1cGxpY2F0ZSAie1RlbXBVc2VyU3RhcnR1cH0iICJ7TVBXfXtVc2VyU3RhcnR1cE5hbWV9IgotCURlbGV0ZSAteSAie1RlbXBVc2VyU3RhcnR1cH0iCi1FbHNlCi0JRWNobyAie1VzZXJTdGFydHVwTmFtZX0gZmlsZSBub3QgaW5zdGFsbGVkIgotRW5kIElmCi0KLSMgKHNob3VsZCkgQ2hlY2sgSEVYQSByZXNvdXJjZSwgd2FybiBpZiBsb3cuCi0KLSMgKHNob3VsZCkgQ2hlY2sgZm9yIHNwYWNlcyBpbiBwYXRobmFtZXMsIHdhcm4gaWYgZm91bmQuCi0KLUVjaG8gIkluc3RhbGxhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4iCi1FY2hvICIiCi1FY2hvICJCZSBzdXJlIHRvIHJldmlldyB0aGUgdXNhZ2Ugbm90ZXMgaW4gJ1JlYWQgTWUgZm9yIE1QVycgYmVmb3JlIHByb2NlZWRpbmchIgotCi0jIFJlc3RvcmUgcHJldmlvdXMgc2V0dGluZ3MuCi0KLVNldCBFeGl0ICJ7T2xkRXhpdH0iCmRpZmYgLS1naXQgYS9vcGNvZGVzL0NoYW5nZUxvZyBiL29wY29kZXMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQxZmVhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTY3OCArMCwwIEBACi0yMDAwLTA0LTAxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyX3VzYWdlKTogRG9uJ3QgdXNlIGEgcHJvdG90eXBlLiAgTWFyawotCXRoZSBwYXJhbWV0ZXIgQVRUUklCVVRFX1VOVVNFRC4KLQkqIHBwYy1vcGMuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgYXMgbmVlZGVkLgotCi0yMDAwLTA0LTAxICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAY3lnbnVzLmNvbT4KLQotCSogbTEwMzAwLW9wYy5jOiBTUC1iYXNlZCBvZmZzZXRzIGFyZSBhbHdheXMgdW5zaWduZWQuCi0KLTIwMDAtMDMtMjkgIFRob21hcyBkZSBMZWxsaXMgIDx0ZGVsQHdpbmRyaXZlci5jb20+Ci0KLQkqIGFybS1vcGMuaCAodGh1bWJfb3Bjb2Rlcyk6IERpc2Fzc2VtYmxlIDB4ZGUuLiB0byAiYmFsIgotCVticmFuY2ggYWx3YXlzXSBpbnN0ZWFkIG9mICJ1bmRlZmluZWQiLgotCi0yMDAwLTAzLTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X2Zvcm1hdF90YWJsZSk6IE1vdmUgU0hPUlRfQVIgdG8gZW5kIG9mIGxpc3Qgb2YKLQlzaG9ydCBpbnN0cnVjdGlvbnMsIGZyb20gZW5kIG9mIGxpc3Qgb2YgbG9uZyBpbnN0cnVjdGlvbnMuCi0KLTIwMDAtMDMtMjcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0ZJTEVTKTogQWRkIGF2ci1kaXMuYy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGF2ci1kaXMubG8uCi0KLTIwMDAtMDMtMjcgIEFsYW4gTW9kcmEgIDxhbGFuQGxpbnV4Y2FyZS5jb20+Ci0KLQkqIGF2ci1kaXMuYyAoYWRkMGZmZiwgYWRkMDNmOCk6IERvbid0IHVzZSBzdHJ1Y3R1cmUgYml0ZmllbGRzIHRvCi0JdHJ1bmNhdGUgaW50ZWdlcnMuCi0JKHByaW50X2luc25fYXZyKTogQ2FsbCBmdW5jdGlvbiB2aWEgcG9pbnRlciBpbiBLJlIgY29tcGF0aWJsZSB3YXkuCi0JKGRpc3BMREQsIHJlZ1BQLCByZWc1MCwgcmVnMTA0LCByZWc0MCwgcmVnMjB3LCBsaXQ0MDQsIGxpdDIwNCwKLQlhZGQwZmZmLCBhZGQwM2Y4KTogQ29udmVydCB0byBvbGQgc3R5bGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gYW5kCi0JYWRkIHByb3RvdHlwZS4KLQkoYXZyZGlzX29wY29kZSk6IEFkZCBwcm90b3R5cGUuCi0KLTIwMDAtMDMtMjcgIERlbmlzIENoZXJ0eWtvdiAgPGRlbmlzY0BvdmVydGEucnU+Ci0KLQkqIGF2ci1kaXMuYzogTmV3IGZpbGUuICBBVlIgZGlzYXNzZW1ibGVyLgotCSogY29uZmlndXJlLmluIChiZmRfYXZyX2FyY2gpOiBOZXcgYXJjaGl0ZWN0dXJlIHN1cHBvcnQuCi0JKiBkaXNhc3NlbWJsZS5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotTW9uIE1hciAgNiAxOTo1MjowNSAyMDAwICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHNoLW9wYy5oIChzaF90YWJsZSk6IGxkcmUgYW5kIGxkcnMgaGF2ZSBhICpzaWduZWQqIGRpc3BsYWNlbWVudC4KLQotMjAwMC0wMy0wMiAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0gICAgICAgICogZDMwdi1kaXMuYyAocHJpbnRfaW5zbik6IFJlbW92ZSBkKmkgaGFja3MuICBVc2UgcGVyLW9wZXJhbmQKLSAgICAgICAgZmxhZyB0byBkZXRlcm1pbmUgaWYgb3BlcmFuZCBpcyBwYy1yZWxhdGl2ZS4KLSAgICAgICAgKiBkMzB2LW9wYy5jOgotICAgICAgICAoZDMwdl9mb3JtYXRfdGFibGUpOgotICAgICAgICAoUkVMNlMzKTogUmVuYW1lZCBmcm9tIElNTTZTMy4KLSAgICAgICAgQWRkZWQgZmxhZyBPUEVSQU5EX1BDUkVMLgotICAgICAgICAoUkVMMTJTMywgUkVMMThTMywgUkVMMzIpOiBTcGxpdCBmcm9tIElNTTEyUzMsIElNTTE4UzMsIFJFTDMyLCB3aXRoCi0gICAgICAgIGFkZGVkIGZsYWcgT1BFUkFORF9QQ1JFTC4KLSAgICAgICAgKElNTTEyUzNVKTogUmVwbGFjZWQgd2l0aCBSRUwxMlMzLgotICAgICAgICAoU0hPUlRfRDIsIExPTkdfRCk6IERlbGF5IHRhcmdldCBpcyBwYy1yZWxhdGl2ZS4KLSAgICAgICAgKFNIT1JUX0IyciwgU0hPUlRfQjNyLCBTSE9SVF9CM2JyLCBTSE9SVF9EMnIsIExPTkdfVXIsIExPTkdfMnIpOgotICAgICAgICBTcGxpdCBmcm9tIFNIT1JUX0IyLCBTSE9SVF9EMiwgU0hPUlRfQjNiLCBTSE9SVF9EMiwgTE9OR19VLCBMT05HXzJyLAotICAgICAgICB1c2luZyB0aGUgUkVMKiBvcGVyYW5kcy4KLSAgICAgICAgKExPTkdfMmJyLCBMT05HX0RyKTogTGlrZXdpc2UsIGZyb20gTE9OR18yYiwgTE9OR19ELgotICAgICAgICAoU0hPUlRfRDFyLCBTSE9SVF9EMkJyLCBMT05HX0Ricik6IFJlbmFtZWQgZnJvbSBTSE9SVF9EMSwgU0hPUlRfRDJCLAotICAgICAgICBMT05HX0RiLCB1c2luZyBSRUwqIG9wZXJhbmRzLgotICAgICAgICAoU0hPUlRfVSwgU0hPUlRfQTVTKTogUmVtb3ZlZCBzdHJheSBhbHRlcm5hdGl2ZXMuCi0gICAgICAgIChkMzB2X29wY29kZV90YWJsZSk6IFVzZSBuZXcgKnIgZm9ybWF0cy4KLQotMjAwMC0wMi0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbTMyci1kZXNjLmMgKG0zMnJfY2dlbl9jcHVfb3Blbik6IFJlcGxhY2UgJ2ZsYWdzJyB3aXRoCi0JJ3NpZ25lZF9vdmVyZmxvd19va19wJy4KLQotMjAwMC0wMi0yNyAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogTWFrZWZpbGUuYW0gKHN0YW1wLWxpYik6IFVzZSAkKExJQlRPT0wpIC0tY29uZmlnIHRvIGdldCB0aGUKLQluYW1lIG9mIHRoZSBsaWJ0b29sIGRpcmVjdG9yeS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0yMDAwLTAyLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9zaWduZWRfb3ZlcmZsb3dfb2spOiBOZXcgZnVuY3Rpb24uCi0JKGNnZW5fY2xlYXJfc2lnbmVkX292ZXJmbG93X29rKTogTmV3IGZ1bmN0aW9uLgotCShjZ2VuX3NpZ25lZF9vdmVyZmxvd19va19wKTogTmV3IGZ1bmN0aW9uLgotCi0yMDAwLTAyLTIzICBBbmRyZXcgSGFsZXkgIDxhcGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIG0zMnItYXNtLmMsIG0zMnItZGVzYy5jLCBtMzJyLWRlc2MuaCwgbTMyci1kaXMuYywKLQltMzJyLWlibGQuYyxtMzJyLW9wYy5oOiBSZWJ1aWxkLgotCi0yMDAwLTAyLTIzICBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+Ci0KLQkqIGkzNzAtZGlzLmMsIGkzNzAtb3BjLmM6IE5ldy4KLQotCSogZGlzYXNzZW1ibGUuYyAoQVJDSF9pMzcwKTogRGVmaW5lLgotCShkaXNhc3NlbWJsZXIpOiBIYW5kbGUgaXQuCi0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTGludXgvSUJNIDM3MC4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlOiBMaWtld2lzZS4KLQotMjAwMC0wMi0yMiAgQ2hhbmRyYSBDaGF2dmEgICA8Y2NoYXZ2YUBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWIpIDogQWRkZWQgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAgdG8KLQlTVDJILCBTVEIsIFNUSCwgU1RISCwgU1RXIGFuZCBTVDJIIG9wY29kZXMgdG8gcHJvaGliaXQgcGFyYWxsZWwKLQlwcm9jZWR1cmUuCi0KLTE5OTktMTItMzAgIEFuZHJldyBIYWxleSAgPGFwaEBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogTmV3IGFyZyBmb3IgT1BDT0RFX0lTX01FTUJFUjoKLQlmb3JjZSBncDMyIHRvIHplcm8uCi0JKiBtaXBzLW9wYy5jIChHNik6IE5ldyBkZWZpbmUuCi0JKG1pcHNfYnVpbHRpbl9vcCk6IEFkZCAibW92ZSIgZGVmaW5pdGlvbiBmb3IgLWdwMzIuCi0KLTIwMDAtMDItMjIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBHcmFudCBFcmlja3NvbiA8Z2VyaWNrc29AQnJvY2FkZS5DT00+OgotCSogcHBjLW9wYy5jOiBDb3JyZWN0IGRjcmVhZC0taXQgdGFrZXMgMyBhcmd1bWVudHMsIG5vdCAyLgotCi0yMDAwLTAyLTIxICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRpcy1idWYuYyAoYnVmZmVyX3JlYWRfbWVtb3J5KTogQ2hhbmdlIGBsZW5ndGgnIHBhcmFtIGFuZCBhbGwgaW50Ci0JdmFycyB0byB1bnNpZ25lZC4KLQotVGh1IEZlYiAxNyAwMDoxODoxMiAyMDAwICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9tb3Z4eSwgcHJpbnRfaW5zbl9kZHQsIHByaW50X2RzcF9yZWcpOiBOZXcgZnVuY3Rpb25zLgotCShwcmludF9pbnNuX3BwaSk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX3NoeCk6IFVzZSBpbmZvLT5tYWNoIHRvIHNlbGVjdCBhcHByb3ByaWF0ZSBpbnNuIHNldC4KLQlBZGQgc3VwcG9ydCBmb3Igc2gtZHNwLiAgUmVtb3ZlIEZEX1JFR19OIHN1cHBvcnQuCi0JKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUpOiBBZGQgbmV3IHZhbHVlcyBmb3Igc2gtZHNwIHN1cHBvcnQuCi0JKHNoX2FyZ190eXBlKTogTGlrZXdpc2UuICBSZW1vdmUgRkRfUkVHX04uCi0JKHNoX2RzcF9yZWdfbnVtcyk6IE5ldyBlbnVtLgotCShhcmNoX3NoMSwgYXJjaF9zaDIsIGFyY2hfc2gzLCBhcmNoX3NoM2UsIGFyY2hfc2g0KTogTmV3IG1hY3Jvcy4KLQkoYXJjaF9zaF9kc3AsIGFyY2hfc2gzX2RzcCwgYXJjaF9zaDFfdXAsIGFyY2hfc2gyX3VwKTogTGlrZXdpc2UuCi0JKGFyY2hfc2gzX3VwLCBhcmNoX3NoM2VfdXAsIGFyY2hfc2g0X3VwLCBhcmNoX3NoX2RzcF91cCk6IExpa2V3aXNlLgotCShhcmNoX3NoM19kc3BfdXApOiBMaWtld2lzZS4KLQkoc2hfb3Bjb2RlX2luZm8pOiBOZXcgZmllbGQ6IGFyY2guCi0JKHNoX3RhYmxlKTogU3BsaXQgdXAgaW5zbiB3aXRoIEZEX1JFR19OIGludG8gb25lcyB3aXRoIEZfUkVHX04gYW5kCi0JRF9SRUdfTi4gIEZpbGwgaW4gYXJjaCBmaWVsZC4gIEFkZCBzaC1kc3AgaW5zbnMuCi0KLTIwMDAtMDItMTQgIEZlcm5hbmRvIE5hc3NlciAgPGZuYXNzZXJAdG90ZW0udG8uY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jOiBDaGFuZ2UgZmxhdm9yIG5hbWUgZnJvbSBhdHBjcy1zcGVjaWFsIHRvCi0Jc3BlY2lhbC1hdHBjcyB0byBwcmV2ZW50IG5hbWUgY29uZmxpY3QgaW4gZ2RiLgotCShnZXRfYXJtX3JlZ25hbWVfbnVtX29wdGlvbnMsIHNldF9hcm1fcmVnbmFtZV9vcHRpb24sCi0JZ2V0X2FybV9yZWduYW1lcyk6IE5ldyBmdW5jdGlvbnMuICBBUEkgdG8gYWNjZXNzIHRoZSBzZXZlcmFsCi0JZmxhdm9yIG9mIHJlZ2lzdGVyIG5hbWVzLiAgTm90ZTogVXNlZCBieSBnZGIuCi0JKHByaW50X2luc25fdGh1bWIpOiBVc2UgdGhlIHJlZ2lzdGVyIG5hbWUgZW50cnkgZnJvbSB0aGUgY3VycmVudGx5Ci0Jc2VsZWN0ZWQgZmxhdm9yIGZvciBMUiBhbmQgUEMuCi0KLTIwMDAtMDItMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLW9wYy5oIChlbnVtIG1jb3JlX29wY2xhc3MpOiBBZGQgTVVMU0ggYW5kIE9QU1IKLQljbGFzc2VzLgotCShtY29yZV90YWJsZSk6IEFkZCAiaWRseTQiLCAicHNyY2xyIiwgInBzcnNldCIsICJtdWxzaCIgYW5kCi0JIm11bHNoLmgiIGluc3RydWN0aW9ucy4KLQkqIG1jb3JlLWRpcy5jIChpbXNrIGFycmF5KTogQWRkIG1hc2tzIGZvciBNVUxTSCBhbmQgT1BTUgotCWNsYXNzZXMuCi0JKHByaW50X2luc25fbWNvcmUpOiBBZGQgc3VwcG9ydCBmb3IgbGl0dGxlIGVuZGlhbiB0YXJnZXRzLgotCUFkZCBzdXBwb3J0IGZvciBNVUxTSCBhbmQgT1BTUiBjbGFzc2VzLgotCi0yMDAwLTAyLTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHBhcnNlX2FybV9kaWFzc2VtYmxlcl9vcHRpb24pOiBSZW5hbWUgYWdhaW4uCi0JUHJldmlvdXMgZGVsYXQgZGlkIG5vdCB0YWtlLgotCi0yMDAwLTAyLTAzICBUaW1vdGh5IFdhbGwgIDx0d2FsbEByZWRoYXQuY29tPgkKLQkKLQkqIGRpcy1idWYuYyAoYnVmZmVyX3JlYWRfbWVtb3J5KTogIFVzZSBvY3RldHNfcGVyX2J5dGUgZmllbGQKLQl0byBhZGp1c3QgdGFyZ2V0IGFkZHJlc3MgYm91bmRzIGNoZWNraW5nIGFuZCBjYWxjdWxhdGUgdGhlCi0JYXBwcm9wcmlhdGUgb2N0ZXQgb2Zmc2V0IGludG8gZGF0YS4KLQkKLTIwMDAtMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQHJlZGhhdC5jb20+Ci0KLQkqIGFybS1kaXMuYzogKHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb24pOiBSZW5hbWUgdG8KLQlwYXJzZV9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbiBhbmQgYWxsb3cgdG8gYmUgZXhwb3J0ZWQuCi0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcl91c2FnZSk6IE5ldyBmdW5jdGlvbjogUHJpbnQgb3V0IGFueQotCXRhcmdldCBzcGVjaWZpYyBkaXNhc3NlbWJsZXIgb3B0aW9ucy4KLQlDYWxsIGFybV9kaXNhc3NlbWJsZXJfb3B0aW9ucygpIGlmIHRoZSBBUk0gYXJjaGl0ZWN0dXJlIGlzIGJlaW5nCi0Jc3VwcG9ydGVkLiAgCi0KLQkqIGFybS1kaXMuYyAoTlVNX0VMRU0pOiBEZWZpbmUgdGhpcyBtYWNybyBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKGFybV9yZWduYW1lKTogTmV3IHN0cnVjdCB0eXBlIGZvciBBUk0gcmVnaXN0ZXIgbmFtZXMuCi0JKGFybV90b2dnbGVfcmVnbmFtZXMpOiBEZWxldGUuCi0JKHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb24pOiBVc2UgcmVnaXN0ZXIgbmFtZSBzdHJ1Y3R1cmUuCi0JKHByaW50X2luc24pOiBOZXcgZnVuY3Rpb246IENvbWJpbmVzIGR1cGxpY2F0ZSBjb2RlIGZvdW5kIGluCi0JcHJpbnRfaW5zbl9iaWdfYXJtIGFuZCBwcmludF9pbnNuX2xpdHRsZV9hcm0uCi0JKHByaW50X2luc25fYmlnX2FybSk6IENhbGwgcHJpbnRfaW5zbi4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogQ2FsbCBwcmludF9pbnNuLgotCShwcmludF9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbnMpOiBEaXNwbGF5IGxpc3Qgb2Ygc3VwcG9ydGVkLAotCUFSTSBzcGVjaWZpYyBkaXNhc3NlbWJsZXIgb3B0aW9ucy4KLQkgIAotMjAwMC0wMS0yNyAgVGhvbWFzIGRlIExlbGxpcyAgPHRkZWxAd2luZHJpdmVyLmNvbT4KLQotICAgICAgICAqIGFybS1kaXMuYyAocHJpbnRmX2luc25fYmlnX2FybSk6IFRyZWF0IEVMRiBzeW1ib2xzIHdpdGggdGhlCi0JQVJNX1NUVF8xNkJJVCBmbGFnIGFzIFRodW1iIGNvZGUgc3ltYm9scy4KLSAgICAgICAgCi0gICAgICAgICogYXJtLWRpcy5jIChwcmludGZfaW5zbl9saXR0bGVfYXJtKTogRGl0dG8uCi0KLTIwMDAtMDEtMjUgIFRob21hcyBkZSBMZWxsaXMgIDx0ZGVsQHdpbmRyaXZlci5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRmX2luc25fdGh1bWIpOiBQcmV2ZW50IGRvdWJsZSBkdW1waW5nCi0gICAgICAgIG9mIHJhdyB0aHVtYiBpbnN0cnVjdGlvbnMuCi0KLTIwMDAtMDEtMjAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLW9wYy5oIChtY29yZV90YWJsZSk6IEFkZCAiYWRkIiBhcyBhbiBhbGlhcyBmb3IgImFkZHUiLgotCi0yMDAwLTAxLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHN0cmVxKTogTmV3IG1hY3JvLgotCShzdHJuZXEpOiBOZXcgbWFjcm8uCi0JKGZvcmNlX3RodW1iKTogZXcgbG9jYWwgdmFyaWFibGUuCi0JKHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb24pOiBOZXcgZnVuY3Rpb246IFBhcnNlIGEgc2luZ2xlLCBBUk0KLQlzcGVjaWZpYyBkaXNhc3NlbWJsZXIgY29tbWFuZCBsaW5lIHN3aXRjaC4KLQkocGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbik6IENhbGwgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbiB0bwotCXBhcnNlIGluZGl2aWR1YWwgY29tbWFuZCBsaW5lIHN3aXRjaGVzLgotCShwcmludF9pbnNuX2JpZ19hcm0pOiBDaGVjayBmb3JjZV90aHVtYi4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogQ2hlY2sgZm9yY2VfdGh1bWIuCi0KLTE5OTktMTItMjcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoZ3Jwc1tdKTogQ29ycmVjdCBHUlA1IEZGLzMgZnJvbSAiY2FsbCIgdG8gImxjYWxsIi4KLQotV2VkIERlYyAgMSAwMzozNDo1MyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYywgbTEwMzAwLWRpcy5jOiBBZGQgYW0zMyBzdXBwb3J0LgotCi1XZWQgTm92IDI0IDIwOjI5OjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAodW5pdF9jb25kX25hbWVzKTogQWRkIFBBMi4wIHVuaXQgY29uZGl0aW9uIG5hbWVzLgotCShwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ0InIG9wZXJhbmQuCi0KLTE5OTktMTEtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmM6IEZpeCBwYXR0ZXJuIGZvciAiY3BmZyxmezB8MX0sYyIgaW5zdHJ1Y3Rpb24uCi0KLTE5OTktMTEtMTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChJNSk6IE5ldy4KLQkoYWJzLnBzLGFkZC5wcyxhbG52LnBzLGMuQ09ORC5wcyxjdnQucy5wbCxjdnQucy5wdSxjdnQucHMucwotCW1hZGQucHMsbW92Zi5wcyxtb3Z0LnBzLG11bC5wcyxuZXQucHMsbm1hZGQucHMsbm1zdWIucHMsCi0JcGxsLnBzLHBsdS5wcyxwdWwucHMscHV1LnBzLHN1Yi5wcyxzdXhjMSxsdXhjMSk6IE5ldy4KLQotTW9uIE5vdiAxNSAxOTozNDo1OCAxOTk5ICBEb25hbGQgTGluZHNheSAgPGRsaW5kc2F5QGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBBZGRlZCBnZW5lcmFsIHB1cnBvc2UgJ1gnIGZvcm1hdC4KLQkqIGFybS1vcGMuaCAocHJpbnRfaW5zbl9hcm0pOiBBZGRlZCBjb21tZW50IGRvY3VtZW50aW5nCi0JdGhlICdYJyBmb3JtYXQganVzdCBhZGRlZCB0byBhcm0tZGlzLmMuCi0KLTE5OTktMTEtMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChsYSk6IENyZWF0ZSBhIHZlcnNpb24gdGhhdCBqdXN0IHVzZXMgYWRkaXUgZGlyZWN0bHkuCi0JKGRsYSk6IEV4cGFuZCB0byBkYWRkaXUgaWYgcG9zc2libGUuCi0KLTE5OTktMTEtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBzc25vcCBwYXR0ZXJuLgotCi0xOTk5LTExLTAxICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFVzZSBPUENPREVfSVNfTUVNQkVSLgotCi0xOTk5LTEwLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChtdnRhY2MpOiBVc2UgZm9ybWF0IFNIT1JUX0FSIG5vdCBTSE9SVF9BQQotCShkMzB2X2Zvcm1hdF90YWIpOiBEZWZpbmUgdGhlIFNIT1JUX0FSIGZvcm1hdC4KLQotMTk5OS0xMC0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUtZGlzLmM6IFJlbW92ZSBzcHVyaW91cyBjb2RlIGludHJvZHVjZWQgaW4gcHJldmlvdXMgZGVsdGEuIAotCi0xOTk5LTEwLTI3ICBTY290dCBCYW1icm91Z2ggIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLQotCSogYXJtLWRpcy5jOiBJbmNsdWRlIHN5c2RlcC5oIHRvIHByZXZlbnQgY29tcGlsZSB0aW1lIHdhcm5pbmdzLgotCi0xOTk5LTEwLTE4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGFscGhhX29wZXJhbmRzKTogRmlsbCBpbiBtaXNzaW5nIGluaXRpYWxpemVyLgotCShhbHBoYV9udW1fb3BlcmFuZHMpOiBDb252ZXJ0IHRvIHVuc2lnbmVkLgotCShhbHBoYV9udW1fb3Bjb2Rlcyk6IERpdHRvLgotCShpbnNlcnRfcmJhKTogRGVjbGFyZSB1bnVzZWQgYXJndW1lbnRzIEFUVFJJQlVURV9VTlVTRUQuCi0JKGluc2VydF9yY2EpOiBEaXR0by4KLQkoaW5zZXJ0X3phKTogRGl0dG8uCi0JKGluc2VydF96Yik6IERpdHRvLgotCShpbnNlcnRfemMpOiBEaXR0by4KLQkoZXh0cmFjdF9iZGlzcCk6IERpdHRvLgotCShleHRyYWN0X2poaW50KTogRGl0dG8uCi0JKGV4dHJhY3RfZXY2aHdqaGludCk6IERpdHRvLgotCi1TdW4gT2N0IDEwIDAxOjQ4OjAxIDE5OTkgIEplcnJ5IFF1aW5uIDxqZXJyeS5xdWlubi5hZHY5MUBhbHVtLmRhcnRtb3V0aC5vcmc+Ci0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6ICBBZGQgbmV3IGNvZGVzICdjYycsICdjZCcsICdjQycsCi0JJ2NvJywgJ0AnLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBSZW1vdmVkIHVudXNlZCBhcmdzLiAgRml4ICc/VycuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6ICBJbXBsZW1lbnQgY29kZXMgIj9OIiwgIj9RIi4KLQotVGh1IE9jdCAgNyAwMDoxMjo0MyBNRFQgMTk5OQlEaWVnbyBOb3ZpbGxvIDxkbm92aWxsb0BjeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wZXJhbmRzKTogQWRkIFJFU1RSSUNURURfTlVNMyBmbGFnIGZvcgotCXJhYy9yYWNoaSBpbnN0cnVjdGlvbnMuCi0JKGQxMHZfb3Bjb2Rlcyk6IEFkZGVkIHNldmVuIG5ldyBpbnN0cnVjdGlvbnMgbGQsIGxkMncsIHNhYywgc2FjaGksCi0Jc2xhZSwgc3QgYW5kIHN0MncuCi0KLTE5OTktMTAtMDQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRlc2MuaDogUmVidWlsZC4KLQkqIG0zMnItYXNtLmMsbTMyci1kZXNjLmMsbTMyci1kZXNjLmg6IFJlYnVpbGQuICBBZGQgbTMycnggc3VwcG9ydC4KLQkqIG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oLG0zMnItb3BpbnN0LmM6IERpdHRvLgotCi0xOTk5LTA5LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaDogRml4IGJpdCBwYXR0ZXJucyBmb3Igc2V2ZXJhbCBsb2FkIGFuZCBzdG9yZQotCWluc3RydWN0aW9ucy4gIAotCi1UaHUgU2VwIDIzIDA4OjI3OjIwIDE5OTkgIEplcnJ5IFF1aW5uIDxqZXJyeS5xdWlubi5hZHY5MUBhbHVtLmRhcnRtb3V0aC5vcmcKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogUmVwbGFjZSAnQicsICdNJywgJ2cnIGFuZCAnbCcgd2l0aAotCWNsZWFuZXIgY29kZSB1c2luZyBjb21wbGV0ZXIgcHJlZml4ZXMuICBBZGQgJ1knLgotCi1TdW4gU2VwIDE5IDEwOjQxOjI3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogKHByaW50X2luc25faHBwYSk6IENvcnJlY3QgJ2NKJywgJ2NjJy4KLQotCSogaHBwYS1kaXMuYyAoZXh0cmFjdF8yMik6IE5ldyBmdW5jdGlvbi4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdKJywgJ0snLCBhbmQgJ2NjJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdmZScgYW5kICdjSicuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnIycsICdkJywgYW5kICdjcScuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnbScsICdoJywgJz0nLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ1gnIG9wZXJhbmQuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnQicgb3BlcmFuZC4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdNJyBhbmQgJ0wnIG9wZXJhbmRzLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ2wnIG9wZXJhbmQuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnZycgb3BlcmFuZC4KLQotU2F0IFNlcCAxOCAxMTozNjoxMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IE91dHB1dCBhIHNwYWNlIGFmdGVyICdYJyBjb21wbGV0ZXIuCi0KLQkqIGhwcGEtZGlzLmM6IChwcmludF9pbnNuX2hwcGEpOiBEbyBvdXRwdXQgYSBzcGFjZSBiZWZvcmUgYSAndicKLQlvcGVyYW5kLgotCi0JKiBocHBhLWRpcy5jOiAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdmWCcuCi0KLQkqIGhwcGEtZGlzLmM6IChwcmludF9pbnNuX2hwcGEpOiBBZGQgbWlzc2luZyBicmVhayBhZnRlcgotCUZQIHJlZ2lzdGVyIGNhc2UuCi0KLQkqIGhwcGEtZGlzLmM6IEZpbmlzaCBjb25zdGlmeWluZyB2YXJpb3VzIGNvbXBsZXRlcnMsIHJlZ2lzdGVyCi0JbmFtZXMsIGV0YyBldGMuCi0KLTE5OTktMDktMTQgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKENhbm9uaWNhbGl6YXRpb24gb2YgdGFyZ2V0IG5hbWVzKTogUmVtb3ZlIGFkZGluZwotCSR7Q09ORklHX1NIRUxMfSBpbiBmcm9udCBvZiAkYWNfY29uZmlnX3N1Yiwgc2luY2UgYXV0b2NvbmZpZyAyLjE0Ci0JZ2VuZXJhdGVzICRhY19jb25maWdfc3ViIHdpdGggYSAke0NPTkZJR19TSEVMTH0gYWxyZWFkeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVHVlIFNlcCAgNyAxMzo1MDozMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEVzY2FwZSAnJScgaW4gb3V0cHV0IHN0cmluZ3MuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnWicgYXJndW1lbnQuCi0KLTE5OTktMDktMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oOiBBZGQgbXVsdS53IGFuZCBtdWxzLncgcGF0dGVybnMuICBUaGVzZSBhcmUgdGhlIGNvcnJlY3QKLQluYW1lcyBmb3IgdGhlIG11bHUgYW5kIG11bHMgcGF0dGVybnMuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogcGotb3BjLmM6IE5ldyBmaWxlLgotCSogcGotZGlzLmM6IE5ldyBmaWxlLgotCSogZGlzYXNzZW1ibGUuYwkoZGlzYXNzZW1ibGVyKTogSGFuZGxlIGJmZF9hcmNoX3BqLgotCSogY29uZmlndXJlLmluOiBIYW5kbGUgYmZkX3BqX2FyY2guCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCBwai1kaXMuYyBhbmQgcGotb3BjLmMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBwai1kaXMubG8gYW5kIHBqLW9wYy5sby4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDktMDQgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pMzg2KTogU2V0IGJ5dGVzX3Blcl9saW5lIHRvIDcuCi0KLU1vbiBBdWcgMzAgMTg6NTY6MTQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGZldGNoLCBmZXRjaF9tLCBlY2IsIHdoNjQpOiBSQSBtdXN0IGJlIFIzMS4KLQotMTk5OS0wOC0wNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmMsZnIzMC1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItYXNtLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1vcGluc3QuYzogUmVidWlsZC4KLQotU2F0IEF1ZyAyOCAwMDoyNzoyNCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotICAgICAgICAqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFJlcGxhY2UgJ2YnIGJ5ICd2Jy4gIFByZWZpeCBmbG9hdAotCXJlZ2lzdGVyIGFyZ3MgYnkgJ2YnLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBBZGQgYXJncyBxLCAlLCAhLCBhbmQgfC4KLQotCSogaHBwYS1kaXMuYyAoTUFTS18xMCwgcmVhZF93cml0ZV9uYW1lcywgYWRkX2NvbXBsX25hbWVzLAotCWV4dHJhY3RfMTBVX3N0b3JlKTogIE5ldy4KLQkocHJpbnRfaW5zbl9ocHBhKTogIEFkZCBuZXcgY29tcGxldGVycy4KLQotCSogaHBwYS1kaXMuYyAoc2lnbmVkX3Vuc2lnbmVkX25hbWVzLG1peF9oYWxmX25hbWVzLAotCXNhdHVyYXRpb25fbmFtZXMpOiAgTmV3LgotCShwcmludF9pbnNuX2hwcGEpOiBBZGQgY29tcGxldGVyIGNvZGVzICdhJywgJ2NoJywgJ2NIJywgJ2NTJywgYW5kICdjKicuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFBsYWNlIGNvbXBsZXRlcnMgYmVoaW5kIHByZWZpeCAnYycuIAotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBBZGQgY2FzZXMgZm9yICcuJywgJ34nLiAnJCcuIGFuZCAnIScKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogIExvb2sgYXQgbmV4dCBhcmcgaW5zdGVhZCBvZiBiaXRzCi0JdG8gZGVjaWRlIHRvIHByaW50IGEgc3BhY2UuCi0KLTE5OTktMDgtMjEgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYzogQWRkIEFNRCBhdGhsb24gaW5zdHJ1Y3Rpb24gc3VwcG9ydC4KLQotMTk5OS0wOC0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIFdhbGx5IElpbXVyYSA8aWltdXJhQG1pY3JvdW5pdHkuY29tPjoKLQkqIGRpcy1idWYuYyAoYnVmZmVyX3JlYWRfbWVtb3J5KTogUmV3cml0ZSBleHByZXNzaW9uIHRvIGF2b2lkCi0Jb3ZlcmZsb3cgYXQgZW5kIG9mIGFkZHJlc3Mgc3BhY2UuCi0JKGdlbmVyaWNfcHJpbnRfYWRkcmVzcyk6IFVzZSBzcHJpbnRmX3ZtYS4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZW5hbWUgLmRlcCogZmlsZXMgdG8gREVQKi4gIENoYW5nZSBERVAgdmFyaWFibGUgdG8KLQlNS0RFUC4gIFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDYgMDk6NDY6MzUgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEtZGlzLmMgKGNvbXBhcmVfY29uZF82NF9uYW1lcywgY21waWJfY29uZF82NF9uYW1lcywKLQlhZGRfY29uZF82NF9uYW1lcywgd2lkZV9hZGRfY29uZF9uYW1lcywgbG9naWNhbF9jb25kXzY0X25hbWVzLAotCXVuaXRfY29uZF82NF9uYW1lcywgc2hpZnRfY29uZF82NF9uYW1lcywgYmJfY29uZF82NF9uYW1lcyk6IE5ldy4KLQkocHJpbnRfaW5zbl9ocHBhKTogQWRkIDY0IGJpdCBjb25kaXRpb24gY29tcGxldGVycy4KLQotVGh1IEF1ZyAgNSAxNjo1OTo1OCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogQ2hhbmdlIGNvbmRpdGlvbiBhcmdzIHRvIHVzZQotCSc/JyBwcmVmaXguCi0KLVdlZCBKdWwgMjggMDQ6MzM6NTggMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZXN0IGluICdFJwotCWNvZGUuCi0KLTE5OTktMDctMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBNYXJrIEVsYnJlY2h0OgotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGRpcy1idWYuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgYXMgYXBwcm9wcmlhdGUuCi0JKGdlbmVyaWNfc3RyY2F0X2FkZHJlc3MpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSogaTM4Ni1kaXMuYzogSW5pdGlhbGl6ZSBhbGwgc3RydWN0dXJlIGZpZWxkcyB0byBhdm9pZCB3YXJuaW5ncy4KLQlBZGQgQVRUUklCVVRFX1VOVVNFRCBhcyBhcHByb3ByaWF0ZS4KLQotMTk5OS0wNy0wOCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IERpZmZlcmVudGlhdGUgYmV0d2VlbgotCWFkZGl0aW9uIGFuZCBvcmluZyB3aGVuIGd1ZXNzaW5nIHN5bWJvbCBmb3IgY29tbWVudC4KLQotMTk5OS0wNy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IERpc3BsYXkgaGV4IGVxdWl2YWxlbnQgb2Ygcm90YXRlZAotCWNvbnN0YW50LiAKLQotMTk5OS0wNi0yMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jOiBNZW50aW9uIGludGVsIG1vZGUgc3BlY2lhbHMgaW4gbWFjcm8gY2hhciBjb21tZW50LgotCi0xOTk5LTA2LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYWxwaGEtZGlzLmM6IERvbid0IGluY2x1ZGUgPHN0ZGxpYi5oPi4KLQkqIGFybS1kaXMuYzogSW5jbHVkZSAic3lzZGVwLmgiLgotCSogdGljMzAtZGlzLmM6IERvbid0IGluY2x1ZGUgPHN0ZGxpYi5oPiBvciA8c3RyaW5nLmg+LiAgSW5jbHVkZQotCSJzeXNkZXAuaCIuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IEFkZCBkZXRlY3Rpb24gb2YgSU1CIGFuZCBJTUJSYW5nZQotCVNXSXMuIAotCi0xOTk5LTA2LTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPiAmIERyZXcgTW9zbGV5IDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKGFybV9yZWduYW1lcyk6IFR1cm4gaW50byBhIHBvaW50ZXIgdG8gYSByZWdpc3RlcgotCW5hbWUgc2V0LgotCShhcm1fcmVnbmFtZXNfc3RhbmRhcmQpOiBOZXcgdmFyaWFibGU6IEFycmF5IG9mIEFSTSByZWdpc3RlcgotCW5hbWVzIGFjY29yZGluZyB0byBBUk0gaW5zdHJ1Y3Rpb24gc2V0IG5vbWVuY2xhdHVyZS4gCi0JKGFybV9yZWduYW1lc19hcGNzKTogTmV3IHZhcmlhYmxlOiBBcnJheSBvZiBBUk0gcmVnaXN0ZXIgbmFtZXMKLQlhY2NvcmRpbmcgdG8gQVJNIFByb2NlZHVyZSBDYWxsIFN0YW5kYXJkLgotCShhcm1fcmVnbmFtZXNfcmF3KTogTmV3IHZhcmlhYmxlOiBBcnJheSBvZiBBUk0gcmVnaXN0ZXIgbmFtZXMKLQl1c2luZyBqdXN0ICdyJyBhbmQgdGhlIHJlZ2lzdGVyIG51bWJlci4KLQkoYXJtX3RvZ2dsZV9yZWduYW1lcyk6IE5ldyBmdW5jdGlvbjogVG9nZ2xlIHRoZSBjaG9zZW4gcmVnaXN0ZXIgc2V0Ci0JbmFtaW5nIHNjaGVtZS4KLQkocGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMpOiBOZXcgZnVuY3Rpb246IFBhcnNlIGFueSB0YXJnZXQKLQlkaXNhc3NlbWJsZXIgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0JKHByaW50X2luc25fYmlnX2FybSk6IENhbGwgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgaWYgYW55Ci0JYXJlIGRlZmluZWQuCi0JKHByaW50X2luc25fbGl0dGxlX2FybSk6IENhbGwgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgaWYgYW55Ci0JYXJlIGRlZmluZWQuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBpMzg2LWRpcy5jIChGV0FJVF9PUENPREUpOiBEZWZpbmUuCi0JKHVzZWRfcHJlZml4ZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmZXRjaF9kYXRhKTogRG9uJ3QgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBoYXZlIGFscmVhZHkKLQlmZXRjaGVkIHNvbWUgYnl0ZXMgc3VjY2Vzc2Z1bGx5LgotCShja3ByZWZpeCk6IENsZWFyIHVzZWRfcHJlZml4ZXMuICBVc2UgRldBSVRfT1BDT0RFLCBub3QgMHg5Yi4KLQkocHJlZml4X25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9pbnNuX2kzODYpOiBJZiBzZXRqbXAgZmFpbHMsIGluZGljYXRpbmcgYSBkYXRhIGVycm9yLCBidXQKLQl3ZSBoYXZlIG1hbmFnZWQgdG8gZmV0Y2ggc29tZSBieXRlcywgcHJpbnQgdGhlIGZpcnN0IG9uZSBhcyBhCi0JcHJlZml4IG9yIGEgLmJ5dGUgcHNldWRvLW9wLiAgSWYgZndhaXQgaXMgZm9sbG93ZWQgYnkgYSBub24KLQlmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbiwgcHJpbnQgdGhlIGZpcnN0IHByZWZpeC4gIFNldAotCXVzZWRfcHJlZml4ZXMgd2hlbiBwcmVmaXhlcyBhcmUgdXNlZC4gIElmIGFueSBwcmVmaXhlcyB3ZXJlIG5vdAotCXVzZWQgYWZ0ZXIgZGlzYXNzZW1ibGluZyB0aGUgaW5zdHJ1Y3Rpb24sIHByaW50IHRoZSBmaXJzdCBwcmVmaXgKLQlpbnN0ZWFkIG9mIHByaW50aW5nIHRoZSBpbnN0cnVjdGlvbi4KLQkocHV0b3ApOiBTZXQgdXNlZF9wcmVmaXhlcyB3aGVuIHByZWZpeGVzIGFyZSB1c2VkLgotCShhcHBlbmRfc2VnLCBPUF9FLCBPUF9HLCBPUF9SRUcsIE9QX0ksIE9QX3NJLCBPUF9KKTogTGlrZXdpc2UuCi0JKE9QX0RJUiwgT1BfU0lNRF9TdWZmaXgpOiBMaWtld2lzZS4KLQotMTk5OS0wNi0wNyAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy1vcGMuYzogRml4IHVwIHNldCwgc2V0c3csIHNldHV3IG9wZXJhbmQga2luZHMuCi0JU3VwcG9ydCBzaWdueCAlcmVnLCBjbHJ1dyAlcmVnLgotCi0xOTk5LTA2LTA3ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIHNwYXJjLW9wYy5jOiBBZGQgYWxpYXNlcyBTb2xhcmlzIGFzIHN1cHBvcnRzLgotCi1Nb24gSnVuICA3IDEyOjA0OjUyIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKENGSUxFUyk6IEFkZCBhcmMte2RpcyxvcGN9LmMgYW5kIHY4NTAte2RpcyxvcGN9LmMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDYtMDMgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBNYWtlIExEUkgvTERSQiBjb25zaXN0ZW50IHdpdGggTERSCi0Jd2hlbiB0YXJnZXQgaXMgUEMtcmVsYXRpdmUuCi0KLTE5OTktMDUtMjggIExpbnVzIE5vcmRiZXJnICA8bGludXMubm9yZGJlcmdAY2FuaXQuc2U+Ci0KLQkqIG02OGstb3BjLmM6IFJlbmFtZSBNQUNML01TQUNMIHRvIE1BQy9NU0FDLiAgQWRkIE1BQ00vTVNBQ00uICBBZGQKLQlNT1ZFIE1BQ1NSLENDUi4KLQotCSogbTY4ay1kaXMuYyAoZmV0Y2hfYXJnKTogQWRkIHBsYWNlcyBgbicsIGBvJy4KLQotCSogbTY4ay1vcGMuYzogQWRkIE1TQUMsIE1BQ0wsIE1PVkUgdG8vZnJvbSBBQ0MsIE1BQ1NSLCBNQVNLLgotCUFkZCBtY2Y1MjA2ZSB0byBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbnMuCi0JQWRkIGFsaWFzIGZvciBNQUMsIE1TQUMuCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogQWRkIGZvcm1hdHMgYEUnLCBgRycsIGBIJyBhbmQgcGxhY2UKLQlgTicuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZCBkaXZzdywgZGl2c2wsIGRpdnV3LCBkaXZ1bCwgbWFjbCwKLQltYWN3LCByZW1zbCwgcmVtdWwgZm9yIG1jZjUzMDcuICBDaGFuZ2UgbWNmNTIwMCAtLT4gbWNmLgotCi0JKiBtNjhrLWRpcy5jOiBBZGQgZm9ybWF0IGB1JyBhbmQgcGxhY2VzIGBoJywgYG0nLCBgTScuCi0KLTE5OTktMDUtMTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoRWQpOiBEZWZpbmUuCi0JKGRpczM4Nl90d29ieXRlX2F0dCwgZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBVc2UgRWQgZm9yIG1vdmQuCi0JKFJ3KTogUmVtb3ZlLgotCShPUF9ybSk6IFJlbmFtZSB0byBPUF9SZC4KLQkoT05FKTogUmVtb3ZlLgotCShPUF9PTkUpOiBSZW1vdmUuCi0JKHB1dG9wKTogQWRkIGNvbnN0IHRvIHRlbXBsYXRlIGFuZCBwLgotCShwcmludF9pbnNuX3g4Nik6IERlbGV0ZS4KLQkocHJpbnRfaW5zbl9pMzg2KTogTWVyZ2Ugb2xkIGZ1bmN0aW9uIHByaW50X2luc25feDg2LiAgQWRkIGNvbnN0Ci0JdG8gZHAuCi0JKHN0cnVjdCBkaXMzODYpOiBBZGQgY29uc3QgdG8gbmFtZS4KLQkoZGlzMzg2X2F0dCwgZGlzMzg2X2ludGVsKTogQWRkIGNvbnN0LgotCShkaXMzODZfdHdvYnl0ZV9hdHQsIGRpczM4Nl90d29ieXRlX2ludGVsKTogQWRkIGNvbnN0LgotCShuYW1lczMyLCBuYW1lczE2LCBuYW1lczgsIG5hbWVzX3NlZywgaW5kZXgxNik6IEFkZCBjb25zdC4KLQkoZ3JwcywgcHJlZml4X3VzZXJfdGFibGUsIGZsb2F0X3JlZyk6IEFkZCBjb25zdC4KLQkoZmxvYXRfbWVtX2F0dCwgZmxvYXRfbWVtX2ludGVsKTogQWRkIGNvbnN0LgotCShvYXBwZW5kKTogQWRkIGNvbnN0IHRvIHMuCi0JKE9QX1JFRyk6IEFkZCBjb25zdCB0byBzLgotCShwdHJfcmVnKTogQWRkIGNvbnN0IHRvIHMuCi0JKGRvZmxvYXQpOiBBZGQgY29uc3QgdG8gZHAuCi0JKE9QX0MpOiBEb24ndCBza2lwIG1vZHJtLCBpdCdzIG5vdyBkb25lIGluIE9QX1JkLgotCShPUF9EKTogRGl0dG8uCi0JKE9QX1QpOiBEaXR0by4KLQkoT1BfUmQpOiBDaGVjayBmb3IgdmFsaWQgbW9kLiAgQ2FsbCBPcF9FIHRvIHByaW50LgotCShPUF9FKTogSGFuZGxlIGRfbW9kZSBhcmcuICBDaGVjayBmb3IgYmFkIHNmZW5jZSxsZWEsbGRzIGV0Yy4KLQkoT1BfTVMpOiBDaGVjayBmb3IgdmFsaWQgbW9kLiAgQ2FsbCBPcF9FTSB0byBwcmludC4KLQkoT1BfM0ROb3dTdWZmaXgpOiBTZXQgb2J1ZnAgYW5kIHVzZSBvYXBwZW5kIHJhdGhlciB0aGFuCi0Jc3RyY2F0LiAgQ2FsbCBCYWRPcCgpIGZvciBlcnJvcnMuCi0JKE9QX1NJTURfU3VmZml4KTogTGlrZXdpc2UuCi0JKEJhZE9wKTogTmV3IGZ1bmN0aW9uLgotCi0xOTk5LTA1LTEyICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nl9pbnRlbCk6IFJlbW92ZSBtYWNybyBjaGFycywgZXhjZXB0IGZvcgotCWpFY3h6LiAgQ2hhbmdlIGNXdFIgYW5kIGNSdGQgdG8gY1cgYW5kIGNSLgotCShkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IFJlbW92ZSBtYWNybyBjaGFycyBoZXJlIHRvby4KLQkocHV0b3ApOiBIYW5kbGUgUiBhbmQgVyBtYWNyb3MgZm9yIGludGVsIG1vZGUuCi0KLQkqIGkzODYtZGlzLmMgKFNJTURfRml4dXApOiBOZXcgZnVuY3Rpb24uCi0JKGRpczM4Nl90d29ieXRlX2F0dCk6IFVzZSBpdCBvbiBtb3ZscHMgYW5kIG1vdmhwcywgYW5kIGNoYW5nZQotCUV2IHRvIEVYIG9uIHRoZXNlIGluc25zLiAgQ2hhbmdlIG1vdm1za3BzIEV2LCBYTSB0byBHdiwgRVguCi0JKGRpczM4Nl90d29ieXRlX2ludGVsKTogU2FtZSBoZXJlLgotCi0JKiBpMzg2LWRpcy5jIChBdik6IFJlbW92ZS4KLQkoQXApOiByZW1vdmUgbHB0ci4KLQkobHB0cik6IFJlbW92ZS4KLQkoT1BTSU1EKTogRGVmaW5lLgotCShPUF9TSU1EX1N1ZmZpeCk6IE5ldyBmdW5jdGlvbi4KLQkoT1BfRElSKTogUmVtb3ZlIGRlYWQgY29kZS4KLQkoZUFYX3JlZy4uZURJX3JlZyk6IFJlbnVtYmVyLgotCShvbmVieXRlX2hhc19tb2RybSk6IFRhYmxlIG51bWJlcmluZyBjb21tZW50cy4KLQkoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTogTW92ZSB0byBiZWZvcmUgcHJpbnRfaW5zbl94ODYuCi0JKHByaW50X2luc25feDg2KTogTW92ZSBhbGwgcHJlZml4IG9hcHBlbmRzIHRvIGFmdGVyIHVzZXNfZjNfcHJlZml4Ci0JY2hlY2tzLiAgUHJpbnQgZXJyb3Igb24gaW52YWxpZCBkcC0+Ynl0ZW1vZGUyLiAgUmVtb3ZlIHNpbWRfY21wLAotCWFuZCBoYW5kbGUgU0lNRCBjbXAgaW5zbnMgaW4gT1BfU0lNRF9TdWZmaXguCi0JKGluZm8tPmJ5dGVzX3Blcl9saW5lKTogQnVtcCBmcm9tIDUgdG8gNi4KLQkoT1BfTm9uZSk6IFJlbW92ZS4KLQkoT1BfRSk6IFVzZSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IuICBIYW5kbGUgc2ZlbmNlLgotCShPUF8zRE5vd1N1ZmZpeCk6IEVuc3VyZSBtbmVtb25pYyBpbmRleCB1bnNpZ25lZC4KLQotCVBJSUkgU0lNRCBzdXBwb3J0IGZyb20gRG91ZyBMZWRmb3JkIDxkbGVkZm9yZEByZWRoYXQuY29tPgotCSogaTM4Ni1kaXMuYyAoWE0sIEVYLCBOb25lKTogRGVmaW5lLgotCShPUF9YTU0sIE9QX0VYLCBPUF9Ob25lKTogTmV3IGZ1bmN0aW9ucy4KLQkoVVNFX0dST1VQUywgVVNFX1BSRUZJWF9VU0VSX1RBQkxFKTogRGVmaW5lLgotCShHUlAxNCk6IFJlbmFtZSB0byBHUlBBTUQuCi0JKEdSUCopOiBBZGQgVVNFX0dST1VQUyBmbGFnLgotCShQUkVHUlAqKTogRGVmaW5lLgotCShkaXMzODZfdHdvYnl0ZV9hdHQsIGRpczM4Nl90d29ieXRlX2ludGVsKTogQWRkIFNJTUQgaW5zbnMuCi0JKHR3b2J5dGVfaGFzX21vZHJtKTogQWRkIFNJTUQgZW50cmllcy4KLQkodHdvYnl0ZV91c2VzX2YzX3ByZWZpeCwgc2ltZF9jbXBfb3AsIHByZWZpeF91c2VyX3RhYmxlKTogTmV3LgotCShncnBzKTogQWRkIFNJTUQgaW5zbnMuCi0JKHByaW50X2luc25feDg2KTogTmV3IHZhcnMgdXNlc19mM19wcmVmaXggYW5kIHNpbWRfY21wLiAgRG9uJ3QKLQlvYXBwZW5kIHJlcHogaWYgdXNlc19mM19wcmVmaXguICBBZGQgY29kZSB0byBoYW5kbGUgbmV3IGdyb3VwcyBmb3IKLQlTSU1EIGluc25zLgotCi0JRnJvbSBNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4KLQkqIGkzODYtZGlzLmMgKGRpczM4Nl9hdHQsIGRpczM4Nl9pbnRlbCk6IENoYW5nZSAweEU4IGNhbGwgaW5zbgotCW9wZXJhbmQgZnJvbSBBdiB0byBKdi4KLQotMTk5OS0wNS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUtZGlzLmMgKHByaW50X2luc25fbWNvcmUpOiBVc2UgLnNob3J0IHRvIGRpc3BsYXkKLQl1bmlkZW50aWZpZWQgaW5zdHJ1Y3Rpb25zLCBub3QgLndvcmQuCi0KLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmMsZnIzMC1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYzogUmVidWlsZC4KLQotTW9uIEFwciAxMiAyMzo0NjoxNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZSAnMycpOiBOZXcgY2FzZSBmb3IgUEEyLjAKLQlpbnN0cnVjdGlvbnMuCi0KLTE5OTktMDQtMTAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1pYmxkLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLW9waW5zdC5jOiBSZWJ1aWxkLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogb3BpbnRsLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoaW50ZWxfc3ludGF4LCBvcGVuX2NoYXIsIGNsb3NlX2NoYXIpOiBNYWtlIHN0YXRpYy4KLQkoc2VwYXJhdG9yX2NoYXIsIHNjYWxlX2NoYXIpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl94ODYpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9pMzg2KTogTGlrZXdpc2UuICBBZGQgZGVjbGFyYXRpb24uCi0KLTE5OTktMDMtMjYgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1kaXMuYzogUmVidWlsZC4KLQkqIG0zMnItZGlzLmM6IFJlYnVpbGQuCi0KLTE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBDaGFuZ2UgY29tcGFyZSBpbnN0cnVjdGlvbnMgdG8gdXNlICJAcyIgcmF0aGVyIHRoYW4KLQkiO3MiIHdoZW4gdXNlZCB3aXRoIGFuIGltbWVkaWF0ZSBvcGVyYW5kLgotCi0xOTk5LTAzLTIyICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5fc2V0X2NwdSk6IERlbGV0ZS4KLQkoY2dlbl9sb29rdXBfaW5zbik6IG1heF9pbnNuX3NpemUgcmVuYW1lZCB0byBtYXhfaW5zbl9iaXRzaXplLgotCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6Ci0JUmVidWlsZC4KLQkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOgotCVJlYnVpbGQuCi0JKiBwby9vcGNvZGVzLnBvdDogUmVidWlsZC4KLQotMTk5OS0wMy0xNiAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKG12dHN5cyk6IFJlbW92ZSBGTEFHX0xLUi4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBOZXcgYXJnIGBpc2EnLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQkoY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9uYW1lLGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtKTogTmV3IGZucy4KLQkoY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyk6IFJld3JpdGUgdGVzdCBmb3IgaGFyZGNvZGVkL29wZXJhbmQgaW5kZXguCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmM6IFJlYnVpbGQuCi0JKiBtMzJyLW9waW5zdC5jOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTI1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5faHdfbG9va3VwX2J5X25hbWUpOiBSZXdyaXRlLgotCShjZ2VuX2h3X2xvb2t1cF9ieV9udW0pOiBSZXdyaXRlLgotCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYyxmcjMwLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1vcGluc3QuYzogUmVidWlsZC4KLQotU2F0IEZlYiAxMyAxNDowNjoxOSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYzogQWRkIHNxcnQrZmxhZ3MgcGF0dGVybnMuICBBZGQgRVY2IFBBTGNvZGUgaW5zbnMuCi0JKGluc2VydF9qaGludCk6IEZpeCBpbnNlcnRpb24gbWFzay4KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogRGlzYXNzZW1ibGUgRVY2IFBBTGNvZGUgaW5zbnMuCi0KLTE5OTktMDItMTAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDItMDkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogaTk2MGMtYXNtLmMsaTk2MGMtZGlzLmMsaTk2MGMtb3BjLmMsaTk2MGMtb3BjLmg6IERlbGV0ZS4KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IFJlbmFtZSBmcm9tIHByaW50X2luc25faTk2MF9vcmlnLgotCSogTWFrZWZpbGUuYW06IFJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZW0uCi0JKEhGSUxFUyk6IEFkZCBmcjMwLWRlc2MuaCxtMzJyLWRlc2MuaC4KLQkoQ0ZJTEVTKTogQWRkIGZyMzAtZGVzYy5jLGZyMzAtaWJsZC5jLG0zMnItZGVzYy5jLG0zMnItaWJsZC5jLAotCW0zMnItb3BpbnN0LmMuCi0JKEFMTF9NQUNISU5FUyk6IFVwZGF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVkbyBoYW5kbGluZyBvZiBjZ2VuX2ZpbGVzLgotCShiZmRfaTk2MF9hcmNoKTogRGVsZXRlIGk5NjBjLSoubG8gZmlsZXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBjZ2VuLWFzbS5jICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKGhhc2hfaW5zbl9hcnJheSk6IFJld3JpdGUuCi0JKiBjZ2VuLWRpcy5jICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKGhhc2hfaW5zbl9hcnJheSk6IFJld3JpdGUuCi0JKiBjZ2VuLW9wYy5jICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKGNnZW5fbG9va3VwX2luc24sY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyk6IERlZmluZSBoZXJlLgotCShjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyk6IERpdHRvLgotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZS4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVidWlsZC4KLQkqIHBvL29wY29kZXMucG90OiBSZWJ1aWxkLgotCi1GcmkgRmViICA1IDAwOjA0OjI0IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShIRklMRVMpOiBBZGQgZnIzMC1vcGMuaC4KLQkoQ0ZJTEVTKTogQWRkIGZyMzAtYXNtLmMsIGZyMzAtZGlzLmMsIGZyMzAtb3BjLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgQUNfUFJFUkVRIHRvIDIuMTMuICBSZW1vdmUgQU1fQ1lHV0lOMzIuCi0JQ2hhbmdlIEFNX0VYRUVYVCB0byBBQ19FWEVFWFQgYW5kIEFNX1BST0dfSU5TVEFMTCB0bwotCUFDX1BST0dfSU5TVEFMTC4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIGNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLVRodSBGZWIgIDQgMTM6NDg6NTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBDb3JyZWN0IG1vdmUgKG5vdCBtb3ZldykgdG8gc3RhdHVzIHdvcmQgb24gNTIwMC4KLQotTW9uIEZlYiAgMSAyMDo1NDozNiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6ICBIYW5kbGUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheC4KLSAgICAgICAgKiBpMzg2LWRpcy5jICh4X21vZGUpOiAgRGVmaW5lLgotICAgICAgICAoZGlzMzg2KTogIFJlbW92ZS4KLSAgICAgICAgKGRpczM4Nl9hdHQpOiAgTmV3LgotICAgICAgICAoZGlzMzg2X2ludGVsKTogIE5ldy4KLSAgICAgICAgKGRpczM4Nl90d29ieXRlKTogIFJlbW92ZS4KLSAgICAgICAgKGRpczM4Nl90d29ieXRlX2F0dCk6ICBOZXcuCi0gICAgICAgIChkaXMzODZfdHdvYnl0ZV9pbnRlbCk6ICBOZXcuCi0gICAgICAgIChwcmludF9pbnNuX3g4Nik6ICBVc2UgbmV3IGFycmF5cy4KLSAgICAgICAgKGZsb2F0X21lbSk6ICBSZW1vdmUuCi0gICAgICAgIChmbG9hdF9tZW1faW50ZWwpOiAgTmV3LgotICAgICAgICAoZmxvYXRfbWVtX2F0dCk6ICBOZXcuCi0gICAgICAgIChkb2Zsb2F0KTogIFVzZSBuZXcgZmxvYXRfbWVtIGFycmF5cy4KLSAgICAgICAgKHByaW50X2luc25faTM4Nl9hdHQpOiAgTmV3LgotICAgICAgICAocHJpbnRfaW5zbl9pMzg2X2ludGVsKTogIE5ldy4KLSAgICAgICAgKHByaW50X2luc25faTM4Nik6ICBIYW5kbGUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheC4KLSAgICAgICAgKHB1dG9wKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9pbmRpckUpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX0UpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX0kpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX3NJKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9PRkYpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLQotCi0KLTE5OTktMDEtMjcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuaCxmcjMwLW9wYy5jOiBSZWJ1aWxkLgotCSogaTk2MGMtb3BjLmgsaTk2MGMtb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCi1UdWUgSmFuIDE5IDE4OjAxOjU0IDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBocHBhLWRpcy5jOiByZXZlcnQgSFAgbWVyZ2UgY2hhbmdlcyB1bnRpbCBIUCBnaXZlcyB1cwotCWFuIHVwZGF0ZWQgZmlsZS4KLQkKLTE5OTktMDEtMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBEaXNwbGF5IEFSTSBzeW50YXggZm9yIFBDIHJlbGF0aXZlCi0Jb2Zmc2V0cyBhcyB3ZWxsIGFzIHN5bWJsb2ljIGFkZHJlc3MuCi0KLVR1ZSBKYW4gMTkgMTA6NTE6MDEgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGhwcGEtZGlzLmM6IGZpeCBjb21tZW50cyBhbmQgc29tZSBpbmRlbnRhdGlvbi4KLQotMTk5OS0wMS0xMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jLGk5NjBjLW9wYy5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMDYgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuaCxmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCSogaTk2MGMtYXNtLmMsaTk2MGMtZGlzLmMsaTk2MGMtb3BjLmgsaTk2MGMtb3BjLmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgotCi0xOTk4LTEyLTMwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwczE2LW9wYy5jOiBNYXJrIGJyYW5jaCBpbnNucyB3aXRoIE1JUFMxNl9JTlNOX0JSQU5DSC4KLQotV2VkIERlYyAxNiAxNjoxNzo0OSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoc2V0X21pcHNfaXNhX3R5cGUpOiBIYW5kbGUgYmZkX21hY2hfbWlwczQxMTEuCi0KLTE5OTgtMTItMTUgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMi0xNCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRGVjIDEwIDE4OjM5OjQ2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IERlYyAxMCAxMjo0OToyNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1UdWUgRGVjICA4IDEzOjU2OjE4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBkaXMtYnVmLmMgKGdlbmVyaWNfc3RyY2F0X2FkZHJlc3MpOiByZWZvcm1hdCB0byBHTlUgY29kaW5nCi0JY29udmVudGlvbnMuICBjaGFuZ2Ugc3ByaW50ZiBjYWxsIHRvIGFuIHNwcmludGZfdm1hIGNhbGwuCi0KLVR1ZSBEZWMgIDggMTM6MTI6NDQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVHVlIERlYyAgOCAxMDo1MDo0NiAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkKLQlFbGVuYSBaYW5ub25pIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4sCi0JRGF2aWQgVGF5bG9yIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4sIGFuZAotCUVkaXRoIEVwc3RlaW4gPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0bwotCW1lcmdlIGluIGNoYW5nZXMgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgotCi0JKiBkaXMtYnVmLmMgKGdlbmVyaWNfc3RyY2F0X2FkZHJlc3MpOiBuZXcgZnVuY3Rpb24uCi0KLQkqIGhwcGEtZGlzLmM6IENoYW5nZXMgdG8gaW1wcm92ZSBocHBhIGRpc2Fzc2VtYmx5LgotCSAgQ2hhbmdlZCBmb3JtYXR0aW5nIGluIDogcmVnX25hbWVzLCBmcF9yZWdfbmFtZXMsY29udHJvbF9yZWcsIAotCSAgTmV3IHZhcmlhYmxlcyA6IHNpZ25fZXh0ZW5zaW9uX25hbWVzLCBkZXBvc2l0X25hbWVzLCBjb252ZXJzaW9uX25hbWVzCi0JICAgIGZsb2F0X3Rlc3RfbmFtZXMsIGNvbXBhcmVfY29uZF9uYW1lc19kb3VibGUsIGFkZF9jb25kX25hbWVzX2RvdWJsZSwKLQkgICAgbG9naWNhbF9jb25kX25hbWVzX2RvdWJsZSwgdW5pdF9jb25kX25hbWVzX2RvdWJsZSwgCi0JICAgIGJyYW5jaF9wdXNoX3BvcF9uYW1lcywgc2F0dXJhdGlvbl9uYW1lcywgc2hpZnRfbmFtZXMsIG1peF9uYW1lcywKLQkgIE5ldyBNYWNyb3MgOiAgIEdFVF9DT01QTF9PLCBHRVRfUFVTSF9QT1AsTUVSR0VEX1JFRyAKLQkgIE1vdmUgc29tZSBkZWZpbml0aW9ucyB0byBsaWJocHBhLmg6IEdFVF9GSUVMRCwgR0VUX0JJVAotCSAgKGZwdXRfY29uc3QpOiByZW5hbWVkIGFzIGZwdXRfaGV4X2NvbnN0Ci0JICAocHJpbnRfaW5zbl9ocHBhKToKLQkgICAtIHVzZSB0aGUgbWFjcm9zIGZwdXRzX2ZpbHRlcmVkIGFuZAotCSAgICAgZnB1dF9kZWNpbWFsX2NvbnN0IHdoZW5ldmVyIHBvc3NpYmxlOyBjYWxscyB0byBzaWduX2V4dGVuZCByZXF1aXJlCi0JICAgICAyIHBhcmFtcyAtLSBhZGQgYSBtaXNzaW5nIHNlY29uZCBwYXJhbSBvZiAwLgotCSAgIC0gU29tZSBuZXcgY29kZSBpZmRlZmVkIGZvciBMT0NBTF9PTkxZLCBhbGwgcmVsYXRlZCB0byBmaWd1cmluZyBvdXQKLQkgICAgIGFyY2hpdGVjdHVyZSB2ZXJzaW9uIG51bWJlciBvZiBjdXJyZW50IG1hY2hpbmUuIEhQIGZvbGtzIGFyZQotCSAgICAgdHJ5aW5nIHRvIGhhbmRsZSBzaXR1YXRpb24gd2hlcmUgdGhlIHRhcmdldCBwcm9ncmFtIHdhcyBjb21waWxlZAotCSAgICAgZm9yIFBBIDEueCAoMzItYml0KSwgYnV0IGlzIHJ1bm5pbmcgb24gYSBQQSAyLjAgbWFjaGluZSBhbmQgCi0JICAgICB2aXNhIHZlcnNhLgotCSAgIC0gYWRkZWQgbmV3IGNhc2VzIDogJ2cnLCAnQicsICdtJwotCSAgIC0gYWRkZWQgY2FzZXMgc3BlY2lmaWNhbGx5IGZvciBQQSAyLjAKLQkgICAtIGNoYW5nZWQgdGhlIGZvbGxvd2luZyBjYXNlcyA6ICciJywgJ24nLCAnTicsICdwJywgJ1onLCAKLQkgICAtIGNhbGxzIHRvIGZwdXRfY29uc3QgYmVjb21lIGNhbGxzIHRvIGZwdXRfaGV4X2NvbnN0Ci0KLTE5OTgtMTItMDcgIEphbWVzIEUgV2lsc29uICA8d2lsc29uQHdpbHNvbi1wYy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0ZJTEVTKTogQWRkIGk5NjBjLWFzbSwgaTk2MGMtZGlzLmMsIGk5NjBjLW9wYy5jLgotCShBTExfTUFDSElORVMpOiBBZGQgaTk2MGMtYXNtLmxvLCBpOTYwYy1kaXMubG8sIGk5NjAtb3BjLmxvLgotCShpOTYwLWFzbS5sbywgaTk2MGMtZGlzLmxvLCBpOTYwYy1vcGMubG8pOiBOZXcgTWFrZWZpbGUgcnVsZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2k5NjBfYXJjaCk6IEFkZCBpOTYwYy1vcGMubG8sIGk5NjAtYXNtLm8sCi0JaTk2MC1kaXMuYyB0byB0YS4KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IFJlbmFtZSB0byBwcmludF9pbnNuX2k5NjBfb3JpZy4KLQkqIGk5NjBjLWFzbS5jLCBpOTYwYy1kaXMuYywgaTk2MGMtb3BjLmMsIGk5NjBjLW9wYy5oOiBOZXcgZmlsZXMuCi0JCi1Nb24gRGVjICA3IDE0OjMzOjQ0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVN1biBEZWMgIDYgMTQ6MDY6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IEFkZCBkbWZjMiBhbmQgZG10YzIuCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogQWRkIFBvd2VyUEM0MDMgR0NbWF0gaW5zdHJ1Y3Rpb25zLgotCUZyb20gU2FpdG9oIE1hc2Fub2J1IDxtc2FpdG9oQHNwYS5pcy51ZWMuYWMuanA+LgotCi1GcmkgRGVjICA0IDE3OjQ1OjUxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBEZWMgIDQgMTc6MDg6MDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IERlYyAgMyAxNDoyNjoyMCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRGVjICAzIDAwOjA5OjE3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLTE5OTgtMTEtMzAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1kaXMuYyAoaGFzaF9pbnNuX2FycmF5KTogQ0dFTl9JTlNOX1ZBTFVFIC0+Ci0JQ0dFTl9JTlNOX0JBU0VfVkFMVUUuCi0JKiBtMzJyLW9wYy5jLG0zMnItb3BjLmgsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oLGZyMzAtYXNtLmMsZnIzMC1kaXMuYzogUmVnZW5lcmF0ZS4KLQotVGh1IE5vdiAyNiAxMToyNjozMiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAyNCAxMToyMDo1NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCi0KLU1vbiBOb3YgMjMgMTg6Mjg6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMS0yMCAgRG91ZyBFdmFucyAgPGRldmFuc0B0b2Jvci50by5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQotVGh1IE5vdiAxOSAxNjowMjo0NiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWRpcy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtYXNtLmM6IFJlZ2VuZXJhdGVkLgotCi1UaHUgTm92IDE5IDA3OjU0OjE1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChzeW5jLnAsc3luYy5sKTogU3dhcCBpbnNuIHZhbHVlcy4KLQotMTk5OC0xMS0xOSAgRG91ZyBFdmFucyAgPGRldmFuc0B0b2Jvci50by5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1XZWQgTm92IDE4IDIxOjM2OjM3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYzogUmVidWlsZC4KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jOiBSZWJ1aWxkLgotCi1XZWQgTm92IDE4IDExOjMwOjA0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0KLU1vbiBOb3YgMTYgMTk6MjE6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1hc20uYzogUmVnZW5lcmF0ZWQuCi0KLVRodSBOb3YgMTIgMTk6MjQ6MTggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9vcGNvZGVzLnBvdDogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWFzbS5jOiBSZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAxMCAxNToyNjoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBBZGQgc3VwcG9ydCBmb3IgRlIzMCB0YXJnZXQuCi0JCi1UdWUgTm92IDEwIDExOjAwOjA0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWJ1aWxkLgotCSogZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlYnVpbGQuCi0KLU1vbiBOb3YgIDkgMTg6MjI6NTUgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9vcGNvZGVzLnBvdDogUmVnZW5lcmF0ZS4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWdlbmVyYXRlLgotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLUZyaSBOb3YgIDYgMTc6MjE6MzggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYzogUmVnZW5lcmF0ZS4KLQotV2VkIE5vdiAgNCAxODo0Njo0NyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgY2FzZSBmb3IgYmZkX2ZyMzBfYXJjaC4KLQkqIE1ha2VmaWxlLmFtIChDRklMRVMpOiBBZGRlZCBmcjMwLWFzbS5jLCBmcjMwLWRpcy5jLCBmcjMwLW9wYy5jLgotCShBTExfTUFDSElORVMpOiBBZGRlZCBmcjMwLWFzbS5sbywgZnIzMC1kaXMubG8sIGZyMzAtb3BjLmxvLgotCShDTEVBTkZJTEVTKTogQWRkZWQgc3RhbXAtZnIzMC4KLQkoRlIzMF9ERVBTKTogQWRkZWQuCi0JKiBmcjMwLWFzbS5jOiBOZXcgZmlsZS4KLQkqIGZyMzAtZGlzLmM6IE5ldyBmaWxlLgotCSogZnIzMC1vcGMuYzogTmV3IGZpbGUuCi0JKiBmcjMwLW9wYy5oOiBOZXcgZmlsZS4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWdlbmVyYXRlZAotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlZ2VuZXJhdGVkCi0KLU1vbiBOb3YgIDIgMTU6MDU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLSAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVHVlIE9jdCAyNyAwODo1ODozNyAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoSVNfTSk6IEFkZGVkLgotCi1Nb24gT2N0IDE5IDEzOjAzOjE5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jLG0zMnItb3BjLmgsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgT2N0ICA5IDE0OjAxOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVN1biBPY3QgIDQgMjE6MDE6NDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChPUF8zRE5vd1N1ZmZpeCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKE9QU1VGKTogRGVmaW5lLgotCShHUlAxNCk6IERlZmluZS4KLQkoZGlzMzg2X3R3b2J5dGUpOiBBZGQgR1JQMTQsIGZlbW1zLCBhbmQgM0ROb3cgZW50cmllcy4KLQkodHdvYnl0ZV9oYXNfbW9kcm0pOiBTZXQgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIEdSUDE0LCAzRE5vdy4KLQkoaW5zbl9jb2RlcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHByaW50X2luc25feDg2KTogSW5pdCBpbnNuX2NvZGVwIGFmdGVyIHByZWZpeGVzLgotCShncnBzKTogQWRkIEdSUDE0IGVudHJpZXMgZm9yIHByZWZldGNoLCBwcmVmZXRjaHcuCi0JKE9QX1JFRyk6IFJlZm9ybWF0LgotCi0JRnJvbSBKZWZmIEIgRXBsZXIgPGplcGxlckB1c2dzLmdvdj4KLQkqIGkzODYtZGlzLmMgKFN1ZmZpeDNETm93KTogTmV3IHRhYmxlLgotCi1XZWQgU2VwIDMwIDEwOjE3OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmM6IFRyZWF0IFRSQVAgYXMgaWYgaXQgd2VyZSBhIGJyYW5jaCB0eXBlIGluc3RydWN0aW9uLgotCi1Nb24gU2VwIDI4IDE0OjM1OjQzIDE5OTggIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogSWYgbnVtIGlzIG5vbnplcm8sIHRoZW4KLQlhZGQgT1BFUkFORF9BQ0MxLCBub3QgT1BFUkFORF9BQ0MwLgotCi1UaHUgU2VwIDI0IDA5OjIwOjAzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IEFkZCBGTEFHX0pTUiBhdHRyaWJ1dGUgdG8gREJULCBSRUlULCBSVEQsIGFuZCBUUkFQCi0JaW5zbnMuIAotCi1UdWUgU2VwIDIyIDE3OjU1OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IEFkZCB1c2Ugb2YgRUlUSEVSX0JVVF9QUkVGRVJfTVUgZXhlY3V0aW9uIHVuaXQKLQljbGFzcy4gCi0KLVR1ZSBTZXAgMTUgMTU6MTQ6NDUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBBZGQgYmJwYyxiYnBzdyBzdXBwb3J0LgotCi0xOTk4LTA5LTA5ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQyA3NTAgbW92ZQotCXRvL2Zyb20gU1BScy4KLQotRnJpIFNlcCAgNCAxOTo0Mjo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6IERldGVjdCBUaHVtYiBzeW1ib2xzIGluIGVsZgotCW9iamVjdCBmaWxlcy4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogRGV0ZWN0IFRodW1iIHN5bWJvbHMgaW4gZWxmIG9iamVjdAotCWZpbGVzLiAKLQotU2F0IEF1ZyAyOSAyMjoyNDowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFVzZSB0aGUgbWFjaGluZSB0eXBlIHRvCi0JZGVjaWRlIHdoaWNoIFBBTGNvZGUgc2V0IHRvIGluY2x1ZGUuCi0KLVN1biBBdWcgMjMgMDI6MTY6MTggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKEZCUlgpOiBGaXggdHlwbyBpbiAiLGEscG4gJWZjYzMiIGNhc2UuCi0KLUZyaSBBdWcgMjEgMTY6MDc6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBBZGQgRkxBR19NVUwzMiB0byBNQUMsIE1BQ1MsCi0JTVNVQiBhbmQgTVNVQlMgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgQXVnIDEzIDE2OjIzOjA0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogT21pdCBwYXJlbnMgYXJvdW5kIGFkZGl0aW9ucyBpbgotCW9wZXJhbmQgbmFtZSBtYWNyb3MuCi0KLVdlZCBBdWcgMTIgMTQ6MDA6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBQZXRlciBKZXJlbXkgPHBldGVyLmplcmVteUBhdXNzMi5hbGNhdGVsLmNvbS5hdT46Ci0JKiBtNjhrLW9wYy5jOiBDb3JyZWN0IG11bHNsIGFuZCBtdWx1bCB0byB1c2UgcSByYXRoZXIgdGhhbiBELCBhLAotCSssIC0sIGFuZCBkIGZvciBDb2xkRmlyZS4KLQotCUZyb20gUGV0ZXIgVGhpZW1hbm4gPHRoaWVtYW5uQGluZm9ybWF0aWsudW5pLXR1ZWJpbmdlbi5kZT46Ci0JKiBwcGMtb3BjLmMgKGluc2VydF9tYmUpOiBIYW5kbGUgd3JhcHBpbmcgYml0bWFza3MuCi0JKGV4dHJhY3RfbWJlKTogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMTIgMTE6MTE6MzQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtb3BjLmM6IEZpeCB0eXBvIGluIHVkZjIwIC4uIHVkZjI1IGluc3RydWN0aW9uIG9wY29kZXMuCi0KLQkqIG0xMDMwMC1vcGMuYzogRmlyc3QgY3V0IGF0IFVERiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBBdWcgMTAgMTQ6MDg6MjIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZSAocmVtb3ZlIHNlbWFudGljIGRlc2NyaXB0aW9ucykuCi0KLU1vbiBBdWcgMTAgMTI6NTE6MTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6ICBGaXggaW5kZW50YXRpb24uCi0gICAgICAgIChwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBMaWtld2lzZS4KLQotU3VuIEF1ZyAgOSAyMDoxNzoyOCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtKTogIENoZWNrIGZvciB0aHVtYiBzeW1ib2wKLSAgICAgICAgYXR0cmlidXRlcy4KLSAgICAgICAgKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgotCi1Nb24gQXVnICAzIDEyOjQzOjE2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JTW92ZSBhbGwgZ2xvYmFsIHN0YXRlIGRhdGEgaW50byBvcGNvZGUgdGFibGUgc3RydWN0LCBhbmQgdHJlYXQKLQlvcGNvZGUgdGFibGUgYXMgc29tZXRoaW5nIHRoYXQgaXMgIm9wZW5lZC9jbG9zZWQiLgotCSogY2dlbi1hc20uYyAoYWxsIGZucyk6IE5ldyBmaXJzdCBhcmcgb2Ygb3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IuCi0JKGNnZW5fYXNtX2luaXQpOiBEZWxldGUuCi0JKGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4pOiBOZXcgZnVuY3Rpb24uCi0JKiBjZ2VuLWRpcy5jIChhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KLQkoY2dlbl9kaXNfaW5pdCk6IERlbGV0ZS4KLQkqIGNnZW4tb3BjLmMgKGFsbCBmbnMpOiBOZXcgZmlyc3QgYXJnIG9mIG9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLgotCShjZ2VuX2N1cnJlbnRfe29wY29kZV90YWJsZV9tYWNoLGVuZGlhbn0pOiBEZWxldGUuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1UaHUgSnVsIDMwIDIxOjQxOjEwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogQWRkIG5ldyAiTEtSIiBmbGFnIHRvIHNvbWUKLQlpbnN0cnVjdGlvbnMuCi0KLVR1ZSBKdWwgMjggMTE6MDA6MDkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtb3BjLmM6IEFkZCBlbnRyaWVzIGZvciAibm9fbWF0Y2hfb3BlcmFuZHMiIGZpZWxkIGluCi0JdGhlIG9wY29kZSB0YWJsZS4KLQotRnJpIEp1bCAyNCAxMTo0MTozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUgKC1XYWxsIGNsZWFudXBzKS4KLQotVHVlIEp1bCAyMSAxMzo0MTowNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotTW9uIEp1bCAxMyAxNDo1Mzo1OSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKGNrcHJlZml4KTogSGFuZGxlIGZ3YWl0IHNwZWNpYWxseSBvbmx5IHdoZW4gaXQgaXNuJ3QKLQl0aGUgZmlyc3QgcHJlZml4LgotCShkb2Zsb2F0KTogQ29ycmVjdCB0ZXN0IGZvciBmbnN0c3cuICBQcmludCBgZm5zdHN3ICVheCcgcmF0aGVyCi0JdGhhbiBgZm5zdHN3ICVlYXgnLgotCShPUF9KKTogUmVtb3ZlIHVubmVjZXNzYXJ5IHN1YnRyYWN0aW9uIHdoZW4gMTYtYml0IGRpc3BsYWNlbWVudAotCXdpbGwgYmUgbWFza2VkIGxhdGVyLgotCi1UaHUgSnVsICAyIDE3OjExOjI3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oIChDR0VOX01JTl9JTlNOX1NJWkUpOiBOZXcgI2RlZmluZS4KLQotV2VkIEp1bCAgMSAxNjoxMToxNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQotRnJpIEp1biAyNiAxMTowODo1NSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1kaXMuYzogT25seSByZWNvZ25pemUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGN1cnJlbnRseQotCXNlbGVjdGVkIG1hY2hpbmUuCi0JKiBtMTAzMDAtb3BjLmM6IEFkZCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBwYXJ0aWN1bGFyIHZhcmlhbnQgb2YKLQl0aGUgbW4xMDMwMCBlYWNoIGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSBvbi4KLQotRnJpIEp1biAyNiAxMjowNDoyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIGJmZF92YXhfYXJjaCwgYnVpbGQgdmF4LWRpcy5sby4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKENGSUxFUyk6IEFkZCB2YXgtZGlzLmMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCB2YXgtZGlzLmxvLgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGN1cnJlbnQgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBKdW4gMjYgMTI6MDM6MjAgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIHZheC1kaXMuYzogTmV3IGZpbGUsIGZyb20gd29yayBieSBQYXVsaW5lIE1pZGRlbGluawotCTxtaWRkZWxpbkBwb2x5d2FyZS5pYWYubmw+LgotCSogZGlzYXNzZW1ibGUuYyAoQVJDSF92YXgpOiBEZWZpbmUgaWYgQVJDSF9hbGwuCi0JKGRpc2Fzc2VtYmxlcik6IEFkZCBjYXNlIGZvciBBUkNIX3ZheC4KLQkqIG1ha2VmaWxlLnZtczogU3VwcG9ydCBjb21waWxhdGlvbiBvbiB2bXMvdmF4LgotCi1UdWUgSnVuIDIzIDE5OjQyOjE4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBGaXggdmFyaW91cyBub24tcG9ydGFiaWxpdGllcwotCXJlbGF0ZWQgdG8gc2lnbiBleHRlbnNpb24gYW5kIHRoZSBzaXplIG9mIGludHMuCi0KLVR1ZSBKdW4gMjMgMTA6NTk6MjYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtb3BjLmM6IFN1cHBvcnQgb25lIG9wZXJhbmQgImFzciIsICJsc3IiIGFuZCAiYXNsIgotCWluc3RydWN0aW9ucy4gIFN1cHBvcnQgKHNwKSBhZGRyZXNzaW5nIG1vZGUgYnkgZXhwYW5kaW5nIGl0IGludG8KLQkoMCxzcCkuCi0KLVNhdCBKdW4gMjAgMTQ6NDY6MjAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IEZpeCBhcmd1bWVudCBpbnRlcmNoYW5nZSB0eXBvLgotCi1GcmkgSnVuIDE5IDA5OjE2OjQyIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBSZWNvZ25pemUgJ2JyZWFrJyBwc2V1ZG8tb3AuCi0KLTE5OTgtMDYtMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jOiBBZGQgc3VwcG9ydCBmb3IgZnhzYXZlLCBmeHJzdG9yLCBzeXNlbnRlciBhbmQKLQlzeXNleGl0LgotCi1UaHUgSnVuIDE4IDEwOjIyOjI0IDE5OTggIEpvaG4gTWV0emxlciAgPGptZXR6bGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbGl0dGxlX21pcHMpOiBQcmV2aW91c2x5LCBpbnN0cnVjdGlvbgotIAlwcmludGluZyByZWZlcmVuY2VzIHRoZSBzeW1ib2wgdGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCi0gCWluc3RydWN0aW9uIHJlc2lkZXMgaW4gYSBibG9jayByZWd1bGFyIGluc3RydWN0aW9ucyBvciBtaXBzMTYKLSAJaW5zdHJ1Y3Rpb25zLiBIb3dldmVyLCB3aGVuIHRoZSBkaXNhc3NlbWJsZXIgZ2V0cyB1c2VkIGluIG90aGVyCi0gCWVudmlyb25tZW50cyB3aGVyZSB0aGUgc3ltYm9sIHRhYmxlIGlzIG5vdCBwcmVzZW50LCB3ZSBubyBsb25nZXIKLSAJcmVseSBpbiB0aGUgc3ltYm9sIHRhYmxlLCByYXRoZXIsIHVzZSB0aGUgbG93IGJpdCBvZiB0aGUKLSAJaW5zdHJ1Y3Rpb25zIGFkZHJlc3MgdG8gZ3Vlc3MuIFRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2UgZm9yIHVzYWdlCi0gCW9mIHRoZSBkaXNhc3NlbWJsZXIgaW4gaG9zdCBiYXNlZCBwcm9ncmFtcywgZ2RiLCBvYmpkdW1wLgotCShwcmludF9pbnNuX2JpZ19taXBzKTogZGl0dG8uCi0JKHByaW50X2luc25fbWlwcyk6IGRpdHRvCi0KLVdlZCBKdW4gMTcgMjE6MTk6MDEgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IERvbid0IGJvbWIgb24gdW5rbm93biBvcGNvZGVzLgotCi1XZWQgSnVuIDE3IDE3OjQ5OjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBDaGFuZ2Ugb3Bjb2RlIGZvciAic3lzY2FsbCIuCi0KLVR1ZSBKdW4gMTYgMTM6MTA6NTEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChpbmRleDE2KTogQWRkICclJyB0byByZWdpc3RlciBuYW1lcy4gIFVzZSAnLCcKLQlpbnN0ZWFkIG9mICcrJy4KLQotU2F0IEp1biAxMyAxMTozMzo1NSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmM6IERvbid0IHByaW50IG9wY29kZSBzdWZmaXggd2hlbiB3ZSBjYW4gZmlndXJlIG91dCB0aGUKLQlzaXplIChhbmQgZ2FzIGNhbiEpIGJ5IHJlZ2lzdGVyIG9wZXJhbmRzLCBvciBmcm9tIHRoZSBkZWZhdWx0Ci0Jc2l6ZS4KLQkocHV0b3ApOiBIYW5kbGUgJ0EnLCAnQicsICdMJywgJ1AnLCAnUScsICdSJyBtYWNyb3MuICBSZW5hbWUgJ0MnCi0JbWFjcm8gdG8gJ0UnLgotCShkaXMzODYsIGRpczM4Nl90d29ieXRlLCBncnBzKTogVXNlIG5ldyBzdWZmaXggbWFjcm9zLgotCShkaXMzODYpOiBDb3JyZWN0IGltdWwgSWIgdG8gaW11bCBzSWIuICBDaGFuZ2Ugam5sIHRvIGpnZSB0byBiZQotCWNvbnNpc3RlbnQuICBBZGQgc3VmZml4IGZvciBjYWxsLCBqbXAsIGxjYWxsLCBsam1wLCBpcmV0LiAgUmV2ZXJzZQotCW9yZGVyIG9mIGNtcHMgb3BlcmFuZHMgdG8gYWdyZWUgd2l0aCBJbnRlbCBkb2NzLiAgQ29ycmVjdCBvcGVyYW5kCi0Jb2YgYWFkIGFuZCBhYW0gKEliIC0+IHNJYikuICBDaGFuZ2UgdWQyYiBmcm9tIDBmYjggdG8gMGZiOSB0bwotCWFncmVlIHdpdGggSW50ZWwgZG9jcy4KLQkocHJpbnRfaW5zbl94ODYpOiBQcmludCBvcnBoYW4gZndhaXQgYmVmb3JlIG90aGVyIHByZWZpeGVzLgotCVJldHVybiBjb3JyZWN0IGJ5dGUgY291bnQgZm9yIG9ycGhhbiBmd2FpdCB3aXRoIHByZWZpeGVzLiAgRG9uJ3QKLQlwcmludCBgYm91bmQnIG9wZXJhbmRzIGluIHJldmVyc2Ugb3JkZXIuCi0JKGNrcHJlZml4KTogU3RvcCBhY2N1bXVsYXRpbmcgcHJlZml4ZXMgaWYgd2UgZ2V0IGZ3YWl0LgotCShPUF9ESVIpOiBQcmludCBgJCcgYmVmb3JlIEFwIG9wZXJhbmRzIG9mIGxqbXAsIGxjYWxsLgotCi1GcmkgSnVuIDEyIDEzOjQwOjM4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IElmIG1haW50YWluZXIgbW9kZSwgZGVwZW5kIG9uIC5wb3QgZmlsZS4KLQkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgotCi1GcmkgSnVuIDEyIDExOjA0OjA2IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JRml4IHByb2JsZW1zIHdoZW4gYmZkX3ZtYSBpcyB3aWRlciB0aGFuIGxvbmcuCi0JKiBpMzg2LWRpcy5jOiBNYWtlIG9wX2FkZHJlc3MgYW5kIHN0YXJ0X3BjIHVuc2lnbmVkLgotCShzZXRfb3ApOiBNYWtlIHBhcmFtZXRlciB1bnNpZ25lZC4KLQkocHJpbnRfaW5zbl94ODYpOiBDYXN0IHRvIGJmZF92bWEgd2hlbiBwYXNzaW5nIGEgdmFsdWUgdG8KLQlwcmludF9hZGRyZXNzX2Z1bmMuCi0JKiBuczMyay1kaXMuYyAoQ09SRV9BRERSKTogRG9uJ3QgZGVmaW5lLgotIAkocHJpbnRfaW5zbl9uczMyayk6IENoYW5nZSB0eXBlIG9mIGFkZHIgdG8gYmZkX3ZtYS4gIFVzZQotCWJmZF9zY2FuX3ZtYSB0byByZWFkIGJhY2sgYWRkcmVzcy4KLQkocHJpbnRfaW5zbl9hcmcpOiBDaGFuZ2UgdHlwZSBvZiBhZGRyIHRvIGJmZF92bWEuICBVc2Ugc3ByaW50Zl92bWEKLQl0byBmb3JtYXQgaXQuCi0JKiBtNjhrLWRpcy5jIChDT0VSQ0UzMik6IENhc3QgdG8gYmZkX3NpZ25lZF92bWEgdG8gYXZvaWQgb3ZlcmZsb3cuCi0JKE5FWFRVTE9ORyk6IE5ldyBkZWZpbml0aW9uLgotCShwcmludF9pbnNuX202OGspOiBBdm9pZCBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyB0aGlyZCBhcmd1bWVudCBvZgotCXByaW50X2luc25fYXJnLgotCShwcmludF9pbnNuX2FyZyk6IFVzZSBORVhUVUxPTkcgdG8gZmV0Y2ggMzIgYml0IGFkZHJlc3MgdmFsdWVzLgotCVVzZSBkaXNwIGluc3RlYWQgb2YgdmFsIHRvIHN0b3JlIG9mZnNldCB2YWx1ZXMuCi0JKHByaW50X2luZGV4ZWQpOiBVc2UgYmFzZV9kaXNwIGluc3RlYWQgb2Ygd29yZCB0byBzdG9yZSBiYXNlCi0JZGlzcGxhY2VtZW50LCB0byBhdm9pZCBvdmVyZmxvdy4KLQkqIG0xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBDYXN0IHZhbHVlIHRvIGxvbmcgd2hlbiBjb21wdXRpbmcKLQlwYy1yZWxhdGl2ZSBhZGRyZXNzLCB0byBnZXQgY29ycmVjdCBzaWduIGV4dGVuc2lvbi4KLQotV2VkIEp1biAxMCAxNTo1ODozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1UdWUgSnVuICA5IDE0OjI3OjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1vcGMuaCAodGh1bWJfb3Bjb2Rlcyk6IERpc3BsYXkgJ2FkZCByeCwgclksICMwJyBpbnNucyBhcwotCSdtb3YgclgsIHJZJy4gIFBhdGNoIGNvdXJ0ZXN5IG9mIFRvbnkgVGhvbXBzb24gPFRvbnkuVGhvbXBzb25AYXJtLmNvbT4KLQotTW9uIEp1biAgOCAxODoxNzoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBSZW1vdmUgRkFMR19NVUwzMiBhdHRyaWJ5dGUgZnJvbSBNVUxYMkggaW5zbi4KLQotRnJpIEp1biAgNSAyMzo0Nzo1NSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmM6ICBDb21iaW5lIGFmbGFnIGFuZCBkZmxhZyBpbnRvIHNpemVmbGFnLiAgQ2hhbmdlIE9QXyoKLQlmdW5jdGlvbnMgdG8gdm9pZC4KLQkoT1BfRFNyZWcpOiBSZW5hbWUgZnJvbSBPUF9EU1NJLgotCShPUF9FU3JlZyk6IFJlbmFtZSBmcm9tIE9QX0VTREkuCi0JKFhiLCBYdiwgWWIsIFl2KTogVXNlIGluZGV4IHJlZyBjb2RlLCBub3QgYl9tb2RlIG9yIHZfbW9kZS4KLQkoRFNCWCk6IERlZmluZS4KLQkoYXBwZW5kX3NlZyk6IFJlbmFtZSBmcm9tIGFwcGVuZF9wcmVmaXguCi0JKHB0cl9yZWcpOiBOZXcgZnVuY3Rpb24uCi0JKGRpczM4Nik6IEFkZCBTIHN1ZmZpeCB0byBwdXNoZiwgcG9wZiwgcmV0LCBscmV0LCBlbnRlciwgbGVhdmUuCi0JQWRkIERTQlggZm9yIHhsYXQuCi0JKFBSRUZJWF9BRERSKTogUmVuYW1lIGZyb20gUFJFRklYX0FEUi4KLQkoZmxvYXRfcmVnKTogQWRkIG5vbi1icm9rZW4gb3Bjb2RlcyBmb3IgcGVvcGxlIHdobyBkb24ndCB3YW50Ci0JVU5JWFdBUkVfQ09NUEFULgotCi1GcmkgSnVuICA1IDE5OjE1OjA0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jICh0c3RiLCB0c3R3LCB0c3RsKTogRG9uJ3QgYWxsb3cgcGNyZWwgb24KLQk2ODAwMC82ODAwOC82ODAxMC4KLQotV2VkIEp1biAgMyAxODo1NjoyMiAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nik6IENoYW5nZSAweDYwIHRvICJwdXNoYVMiLCAweDYxIHRvICJwb3BhUyIuCi0KLVR1ZSBKdW4gIDIgMTU6MDY6NDYgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX21hY3Jvcyk6IFN1cHBvcnQgc2hpZnRzIGFuZCByb3RhdGVzIG9mIHNpemUKLQkwOyBwcm9kdWNlIGVycm9yIG1lc3NhZ2UgZm9yIHNoaWZ0cyBvZiBzaXplIDMyIChvciA2NCBmb3IgNjQtYml0Ci0Jc2hpZnRzKSwgYmVjYXVzZSB0aGUgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IHRoZW0uCi0KLVdlZCBNYXkgMjcgMTU6Mjk6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogQWRkIG5ldyBvcGVyYW5kOiBSYTMuICBDaGFuZ2UgU0hPUlRfQjMsIFNIT1JUX0IzYiwKLQlMT05HXzIsIExPTkdfMmIgZm9ybWF0cyB0byB1c2UgdGhpcyBuZXcgb3BlcmFuZC4KLQotVHVlIE1heSAyNiAyMDo0Nzo0OCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKGNvbXB1dGVfYXJjaF9tYXNrKTogQWRkZWQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgotCi1UdWUgTWF5IDI2IDIwOjQ1OjMzIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBiaWcgZW5kaWFuIGluc3RydWN0aW9uIC8gbGl0dGxlCi0JZW5kaWFuIGRhdGEgc3VwcG9ydC4KLQotVHVlIE1heSAyNiAxNjoxNDozOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X2Zvcm1hdF90YWJsZSk6IENoYW5nZSBkZWZpbml0aW9uIG9mIFNIT1JUX0IzCi0JYW5kIFNIT1JUX0IzYiBmb3JtYXRzIHRvIHVzZSBSYiBpbnN0ZWFkIG9mIFJhLgotCi0JQWRkIEZMQUdfTVVMMTYgdG8gTVVMMlhIIG9wY29kZS4KLQotCUFkZCBGTEFHX0FERFNVQnBwcCB0byBTUkMgYW5kIFNBVEhwIG9wY29kZXMgdG8gaW1wbGVtZW50IGV4dGVuc2lvbgotCXRvIGV4aXN0aW5nIDEuMS4xIHBhcmFsbGVsaXNhdGlvbiBwcm9oaWJpdGlvbiBwcm9jZWR1cmUuCi0KLUZyaSBNYXkgMjIgMTY6MDA6MDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1UdWUgTWF5IDE5IDE3OjM2OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogSGFuZGxlIHR5cGUgJ10nIGNvcnJlY3RseQotCXdpdGggYSBzaGlmdCBjb3VudCBvZiAwLgotCi1GcmkgTWF5IDE1IDE0OjU4OjMxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2h3X2xvb2t1cF9ieV9uYW1lKTogUmVuYW1lZCBmcm9tIGNnZW5faHdfbG9va3VwLgotCShjZ2VuX2h3X2xvb2t1cF9ieV9udW0pOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBNYXkgMTMgMTc6MDM6NTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYzogUmVnZW5lcmF0ZSAoaGFuZGxlIHVwcGVyY2FzZSBISUdIL1NISUdIL0xPVy9TREEpLgotCi1XZWQgTWF5IDEzIDE0OjM0OjMxIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBBbHdheXMgZmV0Y2ggaW5zdHJ1Y3Rpb25zCi0JYXMgYmlnLWVuZGlhbiBvbiBTUEFSQ2xpdGUuCi0KLVR1ZSBNYXkgMTIgMTE6NDY6MzEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXIpOiBSZW1vdmUgYWxpYXMgZm9yIHIwLgotCi1TdW4gTWF5IDEwIDIyOjM3OjIyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotVGh1IE1heSAgNyAxNzoxNTo1OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoV0lOMzJMSUJBREQpOiBBZGQgLWxpbnRsIG9uIGN5Z3dpbjMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTWF5ICA3IDEyOjQ5OjQ2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKHRlcSx0Z2UsdGdldSx0bHQsdGx0dSx0bmUpOiBBZGRlZCB0aHJlZS1vcGVyYW5kCi0gCXZhcmlldHkgb2YgSVNBMiBpbnN0cnVjdGlvbnMgdG8gc2V0IGJvdHRvbSB0ZW4gYml0cyBvZiB0cmFwIGNvZGUuCi0KLVRodSBNYXkgIDcgMTE6NTQ6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY29uZmlnLnN0YXR1cyk6IEFkZCBleHBsaWNpdCB0YXJnZXQgc28gdGhhdAotCWNvbmZpZy5zdGF0dXMgZGVwZW5kcyB1cG9uIGJmZC9jb25maWd1cmUuaW4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IE1heSAgNyAwOTozMzowMiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChicmVhaywgc2RiYnApOiBBZGRlZCB0d28tb3BlcmFuZCB2YXJpZXR5IG9mIElTQTEKLQlpbnN0cnVjdGlvbnMgdG8gc2V0IGJvdHRvbSB0ZW4gYml0cyBvZiBicmVhayBjb2RlLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBJbXBsZW1lbnQgJ3EnIG9wZXJhbmQgZm9ybWF0IHVzZWQKLQlmb3IgYWJvdmUgb3B0aW9uYWwgYXJndW1lbnQuCi0KLVdlZCBNYXkgIDYgMTU6MzA6MDYgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogUnVuIGRlYyBjIHdpdGggL25vZGVidWcuCi0KLU1vbiBNYXkgIDQgMTA6MTk6NTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmFtOiBSZWdlbmVyYXRlZCBkZXBlbmRlbmNpZXMgd2l0aCBta2RlcC4KLQotCSogb3BpbnRsLmggKF8pOiBEZWZpbmUgYXMgZGdldHRleHQuCi0KLVR1ZSBBcHIgMjggMTQ6MTI6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMzJyLWFzbS5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0zMnItZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTMyci1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0KLQkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIE1ha2VmaWxlLmFtIChQT1RGSUxFUyk6IFJlbW92ZSBpbmNsdXNpb24gb2YgQkZEX0guCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWJ1aWx0IHVzaW5nIHJ1bGUgaW4gTWFrZWZpbGUuaW4uCi0JKiBwby9vcGNvZGVzLnBvdDogUmVidWlsdCBhZnRlciBjaGFuZ2luZyBQT1RGSUxFUy5pbi4KLQotVHVlIEFwciAyOCAxMzoxMzoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19JU0NfUE9TSVggbmVhciBzdGFydC4gIE1vdmUgQ1lfR05VX0dFVFRFWFQKLQlhZnRlciBBQ19QUk9HX0NDLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggY3VycmVudCB0b29scy4KLQotTW9uIEFwciAyNyAxNDozMTowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvcGludGwuaDogTmV3IGZpbGUgLSBjb250YWlucyBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MgdXNlZAotCWJ5IHNvdXJjZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeS4KLQkqIHBvLzogTmV3IHN1YmRpcmVjdG9yeSAtIGNvbnRhaW5zIGludGVybmF0aW9uYWxpc2F0aW9uIGZpbGVzLgotCSogcG8vTWFrZS1pbjogTmV3IGZpbGUgLSBNYWtlZmlsZSBjb25zdHJ1Y3Rvci4KLQkqIHBvL1BPVEZJTEVTLmluOiBOZXcgZmlsZSAtIGxpc3Qgb2YgZmlsZXMgaW4gb3Bjb2RlcyBkaXJlY3RvcnkKLQl0aGF0IHNob3VsZCBiZSBzY2FuIGZvciBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MuCi0JKiBwby9vcGNvZGVzLnBvdDogTmV3IGZpbGUgLSBsaXN0IG9mIGludGVybmF0aW9uaXNhdGlvbiBzdHJpbmdzCi0JZm91bmQgaW4gZmlsZXMgbWVudGlvbmVkIGluIHBvL1BPVEZJTEVTLmluLgotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlIHRvIGJ1aWxkIHBvL1BPVEZJTEVTLmluLiAgQWRkIFNVQkRJUlMKLQllbnRyeS4gIEFkZCBpbnRsIGRpcmVjdG9yeSB0byBpbmNsdWRlIHBhdGhzLgotCSogYWNjb25maWcuaDogQWRkIEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRFWFQsCi0JSEFWRV9TVFJDUFksIEhBVkVfTENfTUVTU0FHRVMKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHJ1bGUgdG8gYnVpbGQgTWFrZWZpbGUgaW4gcG8gc3ViZGlyZWN0b3J5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWx0LgotCSogY29uZmlnLmluOiBSZWJ1aWx0LgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCSogYWxwaGEtb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogYXJjLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGFyYy1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBhcm0tZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogY2dlbi1hc20uYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBkMzB2LWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGRpcy1idWYuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBoODMwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBoODUwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBpMzg2LWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0xMDIwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMTAzMDAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTY4ay1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtODhrLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG1pcHMtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbnMzMmstZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogb3BpbnRsLmg6IEludGVybmF0aW9uYWxpc2VkLgotCSogcHBjLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIHNwYXJjLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIHY4NTAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogdjg1MC1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0KLU1vbiBBcHIgMjcgMTA6MzM6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fY3VycmVudF9vcGNvZGVfdGFibGUpOiBSZW5hbWVkIGZyb20gLi4uX2RhdGEuCi0JKGFzbV9oYXNoX3RhYmxlX2VudHJpZXMpOiBOZXcgdmFyaWFibGUuCi0JKGNnZW5fYXNtX2luaXQpOiBGcmVlIGFzbV9oYXNoX3RhYmxlX2VudHJpZXMuCi0JKGhhc2hfaW5zbl9hcnJheSxoYXNoX2luc25fbGlzdCk6IE5ldyBmdW5jdGlvbnMuCi0JKGJ1aWxkX2FzbV9oYXNoX3RhYmxlKTogVXNlIHRoZW0uICBIYXNoIG1hY3JvIGluc25zIGFzIHdlbGwuCi0JKGNnZW5fYXNtX2xvb2t1cF9pbnNuKTogVXBkYXRlLgotCSogY2dlbl9kaXMuYyAoY2dlbl9jdXJyZW50X29wY29kZV90YWJsZSk6IFJlbmFtZWQgZnJvbSAuLi5fZGF0YS4KLQkoZGlzX2hhc2hfdGFibGVfZW50cmllcyk6IE5ldyB2YXJpYWJsZS4KLQkoY2dlbl9kaXNfaW5pdCk6IEZyZWUgZGlzX2hhc2hfdGFibGVfZW50cmllcy4KLQkoaGFzaF9pbnNuX2FycmF5LGhhc2hfaW5zbl9saXN0KTogTmV3IGZ1bmN0aW9ucy4KLQkoYnVpbGRfZGlzX2hhc2hfdGFibGUpOiBVc2UgdGhlbS4gIEhhc2ggbWFjcm8gaW5zbnMgYXMgd2VsbC4KLQkoY2dlbl9kaXNfbG9va3VwX2luc24pOiBVcGRhdGUuCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2N1cnJlbnRfb3Bjb2RlX3RhYmxlKTogUmVuYW1lZCBmcm9tIC4uLl9kYXRhLgotCShjZ2VuX3NldF9jcHUsY2dlbl9od19sb29rdXAsY2dlbl9pbnNuX2NvdW50KTogVXBkYXRlLgotCShjZ2VuX21hY3JvX2luc25fY291bnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmMsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgQXByIDI0IDE2OjA3OjU3IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoT1BfRFNTSSk6IFByaW50IHNlZ21lbnQgb3ZlcnJpZGUuCi0KLU1vbiBBcHIgMTMgMTY6NTk6MzkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IEFkZCAiX2FsbCIgZXh0ZW5zaW9uIHRvICdDJwotCW9wZXJhdG9yLgotCi1Nb24gQXByIDEzIDE2OjUwOjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYm9wY29kZXNfbGFfTElCQUREKTogQWRkIEBXSU4zMkxJQkFEREAuCi0JKGxpYm9wY29kZXNfbGFfTERGTEFHUyk6IEFkZCBAV0lOMzJMREZMQUdTQC4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGFuZCBzdWJzdGl0dXRlIFdJTjMyTERGTEFHUyBhbmQKLQlXSU4zMkxJQkFERC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBcHIgMTAgMTg6MTQ6MzEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotU3VuIEFwciAgNSAxNjowNDozOSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChzdGFtcC1saWIpOiBDaGVjayB0aGF0IC5saWJzL2xpYm9wY29kZXMuYSBleGlzdHMKLQliZWZvcmUgdHJ5aW5nIHRvIGNvcHkgaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEFwciAgMiAxNzoyNTo0OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBVc2Ugc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgZm9yIENNUFVJIGluc3RydWN0aW9uLgotCi1XZWQgQXByICAxIDE2OjIwOjI3IDE5OTggIElhbiBEYWxsICA8SWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdT4KLQotICAgICAgICAqIG5zMzJrLWRpcy5jIChiaXRfZXh0cmFjdF9zaW1wbGUpOiBOZXcgZnVuY3Rpb24gdG8gZXh0cmFjdCBiaXRzCi0gICAgICAgIGZyb20gYW4gYXJiaXRyYXJ5IHZhbGlkIGJ1ZmZlciBpbnN0ZWFkIG9mIGZldGNoaW5nIHRoZW0gb24gZGVtYW5kCi0gICAgICAgIHVzaW5nIGZldGNoX2RhdGEoKS4KLSAgICAgICAgKGludmFsaWRfZmxvYXQpOiB1c2UgYml0X2V4dHJhY3Rfc2ltcGxlKCkgaW5zdGVhZCBvZiBiaXRfZXh0cmFjdCgpLgotCi1UdWUgTWFyIDMxIDExOjA5OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogaTM4Ni1kaXMuYyAoZGlzMzg2KTogQ2hhbmdlIDB4OGMgYW5kIDB4OGUgdG8gbW92UywgYW5kIGNoYW5nZSBFdwotCXRvIEV2IGZvciBib3RoLgotCi1Nb24gTWFyIDMwIDE3OjMyOjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi1Nb24gTWFyIDMwIDE1OjE4OjAwIDE5OTggIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuX2QzMHYpOiBEb24ndCB1c2UgdW5pbml0aWFsaXplZCAibnVtIiB3aGVuCi0JZGlzYXNzZW1ibGluZyBsYXN0IDQgYnl0ZXMgb2YgYSBzZWN0aW9uLgotCi1GcmkgTWFyIDI3IDE4OjA4OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIGFyYy1kaXMuYyAocHJpbnRfaW5zbik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGNnZW4tb3BjLmMgKGNnZW5fa2V5d29yZF9sb29rdXBfbmFtZSk6IExpa2V3aXNlLgotCSogZDEwdi1kaXMuYyAoZGlzX2xvbmcsIGRpc18yX3Nob3J0KTogTGlrZXdpc2UuCi0JKiBtMTAyMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0JKiBtMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0JKiBuczMyay1kaXMuYyAocHJpbnRfaW5zbl9uczMyayk6IExpa2V3aXNlLgotCSogcHBjLW9wYy5jIChpbnNlcnRfcmFsLCBpbnNlcnRfcmFtKTogTGlrZXdpc2UuCi0JKiBjZ2VuLWRpcy5jIChidWlsZF9kaXNfaGFzaF90YWJsZSk6IFJlbW92ZSB1c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQkqIGNnZW4tb3BjLmMgKGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dCk6IExpa2V3aXNlLgotCSogZDEwdi1kaXMuYyAoZGlzX2xvbmcsIGRpc18yX3Nob3J0KTogTGlrZXdpc2UuCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuX2QzMHYsIGxvb2t1cF9vcGNvZGUpOiBMaWtld2lzZS4KLQkqIG5zMzJrLWRpcy5jIChiaXRfZXh0cmFjdCwgcHJpbnRfaW5zbl9uczMyayk6IExpa2V3aXNlLgotCSogdGljODAtZGlzLmMgKHByaW50X29uZV9pbnN0cnVjdGlvbik6IExpa2V3aXNlLgotCSogdzY1LWRpcy5jIChwcmludF9vcGVyYW5kKTogTGlrZXdpc2UuCi0JKiB6OGstZGlzLmMgKGZldGNoX2RhdGEpOiBMaWtld2lzZS4KLQkqIGEyOWstZGlzLmM6IEFkZCByZXR1cm4gdHlwZSBmb3IgZmluZF9ieXRlX2Z1bmNfdHlwZS4KLQkqIGFyYy1vcGMuYzogSW5jbHVkZSA8c3RkaW8uaD4uICBSZW1vdmUgZGVjbGFyYXRpb25zIG9mCi0JaW5zZXJ0X211bHRzaGlmdCBhbmQgZXh0cmFjdF9tdWx0c2hpZnQuCi0JKiBkMzB2LWRpcy5jIChsb29rdXBfb3Bjb2RlKTogUGFyZW50aGVzaXplIGFzc2lnbm1lbnRzIGluCi0JY29uZGl0aW9uYWxzLgotCShleHRyYWN0X3ZhbHVlKTogRnVsbHkgcGFyZW50aGVzaXplIGV4cHJlc3Npb24uCi0JKiBoODUwMC1kaXMuYyAocHJpbnRfaW5zbl9oODUwMCk6IEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgotCSogaDg1MDAtb3BjLmggKGg4NTAwX3RhYmxlKTogRnVsbHkgYnJhY2tldCBpbml0aWFsaXplci4KLQkqIHc2NS1vcGMuaCAob3B0YWJsZSk6IExpa2V3aXNlLgotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl94ODYpOiBEZWNsYXJlIGFmbGFnIGFuZCBmbGFnIHBhcmFtZXRlcnMuCi0JKiBpMzg2LWRpcy5jIChPUF9FKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMuCi0JKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IExpa2V3aXNlLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBMaWtld2lzZS4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IExpa2V3aXNlLgotCSogdjg1MC1kaXMuYyAocHJpbnRfaW5zbl92ODUwKTogTGlrZXdpc2UuCi0JKiBuczMyay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBEZWNsYXJlLgotCShnZXRfZGlzcGxhY2VtZW50LCBpbnZhbGlkX2Zsb2F0KTogRGVjbGFyZS4KLQkobGlzdF9zZWFyY2gsIHNpZ25fZXh0ZW5kLCBmbGlwX2J5dGVzKTogRGVjbGFyZSByZXR1cm4gdHlwZS4KLQkoZ2V0X2Rpc3BsYWNlbWVudCk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX2FyZyk6IExpa2V3aXNlLiAgTWFrZSBkIGludC4gIEZpeCBzcHJpbnRmIGZvcm1hdAotCXN0cmluZy4KLQkocHJpbnRfaW5zbl9uczMyayk6IE1ha2UgaSB1bnNpZ25lZC4KLQkoaW52YWxpZF9mbG9hdCk6IE1ha2Ugc3RhdGljLiAgRGVjbGFyZSB0eXBlIG9mIHZhbC4KLQkqIHRpYzMwLWRpcy5jIChwcmludF9wYXJfaW5zbik6IE1ha2UgaSBzaXplX3QuICBEb24ndCBjaGVjayBzdHJsZW4KLQlvbiBlYWNoIGZvciBpdGVyYXRpb24uCi0JKiB0aWMzMC1kaXMuYyAoZ2V0X2luZGlyZWN0X29wZXJhbmQpOiBMaWtld2lzZS4KLQkqIHo4ay1kaXMuYyAocHJpbnRfaW5zbl96ODAwMSk6IERlY2xhcmUgcmV0dXJuIHR5cGUuCi0JKHByaW50X2luc25fejgwMDIpOiBMaWtld2lzZS4KLQkodW5wYXJzZV9pbnN0cik6IEZpeCBzcHJpbnRmIGZvcm1hdCBzdHJpbmdzLgotCi1GcmkgTWFyIDI3IDAwOjA1OjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQWRkICJzeW5jLmwiIGFuZCAic3luYy5wIi4KLQotV2VkIE1hciAyNSAxNDozMjo0OCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogVXNlIGluZm8tPm1hY2ggdG8gc2VsZWN0IHRoZQotCWRlZmF1bHQgbTY4ayB2YXJpYW50IHRvIHJlY29nbml6ZS4KLQotCSogaTk2MC1kaXMuYyAocGluc24pOiBDaGFuZ2UgdHlwZSBvZiBmaXJzdCBhcmd1bWVudCB0byBiZmRfdm1hLgotCShjdHJsLCBjb2JyLCBtZW0sIGVhKTogTGlrZXdpc2UuCi0JKHByaW50X2FkZHIpOiBMaWtld2lzZS4gIFJlbW92ZSBjYXN0LgotCShlYSk6IENhc3QgYXJndW1lbnQgb2YgcHJpbnRfYWRkciB0byBiZmRfdm1hLgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyKTogRml4IHR5cGUgb2YgbG9jYWwKLQl2YXJpYWJsZSB2YWx1ZS4KLQkoY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyKTogTGlrZXdpc2UuCi0JKGNnZW5fcGFyc2VfYWRkcmVzcyk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDI1IDE0OjMxOjMxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC1kaXMuYyAoY3RybCk6IEFkZCBmdWxsIGJyYWNlcyB0byBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uCi0JKGNvYnIsIG1lbSwgcmVnKTogTGlrZXdpc2UuCi0JKGVhKTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIGluIGV4cHJlc3Npb24uCi0KLQkqIGNnZW4tYXNtLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShidWlsZF9hc21faGFzaF90YWJsZSk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQkoY2dlbl9wYXJzZV9rZXl3b3JkKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6IE9ubHkgY2FsbCBjb2Zmc3ltYm9sIGZvciBhIENPRkYKLQlzeW1ib2wuICBGaXggaW5kZW50YXRpb24uCi0JKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDIwIDE4OjU1OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQU1fRElTQUJMRV9TSEFSRUQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotVGh1IE1hciAxOSAxNTo0Njo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JVGhlc2UgcGF0Y2hlcyBhcmUgY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uIGFuZCBUb255IFRob21wc29uCi0JKGF0aG9tcHNvQGNhbWJyaWRnZS5hcm0uY29tKS4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX3RodW1iKTogSWdub3JlIGJvdHRvbSB0d28gYml0cyBvZiBQQwotCXJlbGF0aXZlIGFkZHJlc3Nlcy4KLQotCSogYXJtLW9wYy5oICh0aHVtYl9vcGNvZGVzKTogQW5ub3RhdGUgUEMgcmVsYXRpdmUgYWRkcmVzc2VzIHdpdGgKLQlib3RoIHRoZSBvZmZzZXQgYW5kIHRoZSBsYWJlbCBjbG9zZXN0IHRvIHRoZSBkZXN0aW5hdGlvbi4KLQotU2F0IE1hciAxNCAyMzo0NzoxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQotV2VkIE1hciAgNCAxMjowODoxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmMsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1TYXQgRmViIDI4IDE2OjAyOjM0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtLCBwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBEbyBub3QKLQlhc3N1bWUgdGhhdCBpbmZvLT5zeW1ib2xzIGlzIG5vbi1lbXB0eS4KLQotU2F0IEZlYiAyOCAxMjoxOTowNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYyAoY3Z0cXMpIFRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcuCi0JKGN2dHRxKTogTWlzc2luZyBtb3N0IG9mIHRoZSAvKmQgdmFyaWFudHMuCi0KLVRodSBGZWIgMjYgMTU6NTM6MDkgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogSW5kaWNhdGUgd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZQotCWRlbGF5ZWQgYnJhbmNoZXMgb3IganVtcHMuCi0KLVR1ZSBGZWIgMjQgMTA6NDY6NDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX3tiaWcsbGl0dGxlfV9hcm0pOiBpbmZvLT5zeW1ib2wgY2hhbmdlZAotCXRvICppbmZvLT5zeW1ib2xzLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl97YmlnLGxpdHRsZX1fbWlwcyk6IExpa2V3aXNlLgotCSogdGljMzAtZGlzLmMgKHByaW50X2JyYW5jaCk6IExpa2V3aXNlLgotCi1UdWUgRmViIDI0IDExOjA2OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtLCBwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBSZW1vdmUKLQlzYXZlZF9zeW1ib2wgY29kZSBhcyBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgotCi1Nb24gRmViIDIzIDEzOjE2OjE3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jOiBJbmNsdWRlIHN5bWNhdC5oLgotCSogY2dlbi1kaXMuYyxjZ2VuLW9wYy5jOiBEaXR0by4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5oLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLU1vbiBGZWIgMjMgMTA6MzQ6NTggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IERvIG5vdCBwcmVmaXggJ1AnIGFyZ3VtZW50cyB3aXRoICckJy4KLQotVGh1IEZlYiAxOSAxNjo1MToxMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5bY2hdOiBSZWdlbmVyYXRlLgotCi1UdWUgRmViIDE3IDE3OjE0OjUwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX3tzaWduZWQsdW5zaWduZWR9X2ludGVnZXIpOiBEZWxldGUgbWluLG1heAotCWFyZ3VtZW50cy4gIERvbid0IHBlcmZvcm0gdmFsaWRhdGlvbiBoZXJlLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBGZWIgMTMgMTQ6MjY6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIEZlYiAxMyAxNDo1MzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0KLUZyaSBGZWIgMTMgMTA6MjE6MDkgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBtMTAzMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDMwMCk6IFJlY29nbml6ZSBicmVhayBpbnN0cnVjdGlvbi4KLQotRnJpIEZlYiAxMyAxMzoxMjoxNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIEJGRC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKGxpYm9wY29kZXNfbGFfTERGTEFHUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgRmViIDEzIDA5OjUwOjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1UaHUgRmViIDEyIDExOjAxOjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgMTIgMDM6NDE6MDAgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCUZpeCByYWMgdG8gYWNjZXB0IG9ubHkgYTA6Ci0JKiBkMTB2LW9wYy5jIChkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzLCBkMTB2X29wZXJhbmRzLCBkMTB2X29wY29kZXMpOgotCVNwbGl0IE9QRVJBTkRfQUNDIGludG8gT1BFUkFORF9BQ0MwIGFuZCBPUEVSQU5EX0FDQzEuCi0JSW50cm9kdWNlIE9QRVJBTkRfR1BSLgotCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1XZWQgRmViIDExIDE4OjU4OjM0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBEZWxldGUgaW5pdCBvZiBodyBsaXN0IGBuZXh0JyBjaGFpbi4KLQkoY2dlbl9od19sb29rdXApOiBNYWtlIHJlc3VsdCBjb25zdC4KLQkqIG0zMnItb3BjLmgsIG0zMnItb3BjLmMsIG0zMnItYXNtLmMsIG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLVNhdCBGZWIgIDcgMTU6MzA6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVGh1IEZlYiAgNSAxNzo1NjoxMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAocmVwZWF0eyxpfSBpbnN0cnVjdGlvbnMpOiBSZXBlYXQvcmVwZWF0aQotCWluc3RydWN0aW9ucyB1c2UgYSBQQyByZWxhdGl2ZSBicmFuY2gsIG5vdCBhYnNvbHV0ZS4KLQotV2VkIEZlYiAgNCAxOToxNzozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGxpYnRvb2xfZW5hYmxlX3NoYXJlZCByYXRoZXIgdGhhbgotCWxpYnRvb2xfc2hhcmVkLiAgUmVtb3ZlIGRpdmVyc2lvbiBoYWNrLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UdWUgRmViICAzIDE3OjE5OjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBJbml0aWFsaXplIGhhcmR3YXJlIHRhYmxlLgotCSogbTMyci1vcGMuaCwgbTMyci1vcGMuYywgbTMyci1hc20uYywgbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotTW9uIEZlYiAgMiAxOToyMjoxNSAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JKiB0aWMzMC1kaXMuYzogTmV3IGZpbGUuCi0JKiBkaXNhc3NlbWJsZS5jCShkaXNhc3NlbWJsZXIpOiBBZGQgYmZkX2FyY2hfdGljMzAgY2FzZS4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGJmZF90aWMzMF9hcmNoLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgdGljMzAtZGlzLmMKLQkoQUxMX01BQ0hJTkVTKTogQWRkIHRpYzMwLWRpcy5sby4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKYW4gMjkgMTM6MDI6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCAoSEFWRV9DUFVfTTMyUik6IERlZmluZS4KLQotV2VkIEphbiAyOCAwOTo1NTowMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRpb24gcm91dGluZXMpOiBJZiBib3RoIGFsaWdubWVudCBhbmQgc2l6ZSBpcwotCXdyb25nIHRoZW4gcmVwb3J0IHRoaXMuCi0KLVR1ZSBKYW4gMjcgMjE6NTI6NTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogU2V0IHRhcmdldF9wcm9jZXNzb3IgYXMgYXBwcm9wcmlhdGUuCi0JT25seSByZWNvZ25pemUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY3VycmVudCB0YXJnZXRfcHJvY2Vzc29yLgotCi1UaHUgSmFuIDIyIDE2OjIwOjE3IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jIChQQ19NQVNLKTogQ29ycmVjdCB2YWx1ZS4KLQkocHJpbnRfb3BlcmFuZCk6IElmIHRoZXJlJ3MgYSByZWxvYywgZG9uJ3QgY2FsY3VsYXRlIHRoZQotIAlhZGRyZXNzIGJlY2F1c2UgdGhleSBjb3VsZCBiZSBpbiBkaWZmZXJlbnQgc2VjdGlvbnMuCi0KLUZyaSBKYW4gMTYgMTU6Mjk6MTEgMTk5OCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IE1vdmUgNDAxMCdzICJhZGRjaXUiCi0gCWluc3RydWN0aW9uIGFmdGVyIHRoZSA0NjUwJ3MgIm11bCIgaW5zdHJ1Y3Rpb247IG5vYm9keSdzIHVzaW5nIHRoZQotIAk0MDEwIHRoZXNlIGRheXMuICBJZiBvYmplY3QgZmlsZXMgc29tZWRheSBpbmRpY2F0ZSB3aGljaCBwcm9jZXNzb3IKLQl2YXJpYW50IHRoZXkncmUgaW50ZW5kZWQgZm9yLCB3ZSBjYW4gZG8gYSBiZXR0ZXIgam9iIGF0IHRoaXMuCi0KLU1vbiBKYW4gMTIgMTQ6NDM6NTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGJ1aWxkX2FzbV9oYXNoX3RhYmxlKTogVHJhdmVyc2UgY29tcGlsZWQgaW4gdGFibGUgdXNpbmcKLQl0YWJsZSBwcm92aWRlZCBlbnRyeSBzaXplLiAgVXNlIENHRU5fSU5TTl9NTkVNT05JQy4KLQkoY2dlbl9wYXJzZV9rZXl3b3JkKTogUmV3cml0ZS4KLQkqIGNnZW4tZGlzLmMgKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogVHJhdmVyc2UgY29tcGlsZWQgaW4gdGFibGUgdXNpbmcKLQl0YWJsZSBwcm92aWRlZCBlbnRyeSBzaXplLiAgVXNlIENHRU5fSU5TTl9NQVNLX0JJVFNJWkUuCi0JKiBjZ2VuLW9wYy5jOiBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgotCShjZ2VuX2tleXdvcmRfbG9va3VwX3ZhbHVlKTogSGFuZGxlICIiIGVudHJ5LgotCShjZ2VuX2tleXdvcmRfYWRkKTogTGlrZXdpc2UuCi0KLU1vbiBEZWMgMjIgMTI6Mzc6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgRlBfRCB0byBzLmQgaW5zdHJ1Y3Rpb24gZmxhZ3MuCi0KLVdlZCBEZWMgMTcgMTE6Mzg6MjkgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKGhhbHQsIHB1bHNlKTogRW5hYmxlIHRoZW0gb24gdGhlIDY4MDYwLgotCi1UdWUgRGVjIDE2IDE1OjIyOjUzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3Bjb2Rlcyk6IFJldmVydCBjaGFuZ2UgdGhhdCBwdXQgdGhlIDMyIGJpdAotCVBDIHJlbGF0aXZlIG9mZnNldCBmb3JtcyBiZWZvcmUgdGhlIDE1IGJpdCBmb3Jtcy4gIEFuIGFzc2VtYmxlciBjb21tYW5kCi0JbGluZSBvcHRpb24gbm93IGNob29zZXMgdGhlIGRlZmF1bHQuCi0KLVR1ZSBEZWMgMTYgMTU6MjI6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogU2V0IG5ldyBmbGFncyBiaXRzCi0JRkxBR197MldPUkQsTVVMezE2LDMyfSxBRERTVUJwcHB9LCBpbiBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbnMuCi0KLTE5OTctMTItMTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBPbmx5IGJ1aWxkIGxpYm9wY29kZXMgc2hhcmVkIGlmIC0tZW5hYmxlLXNoYXJlZCdzIHZhbHVlCi0Jd2FzIGB5ZXMnLCBvciB3YXMgc2V0IHRvIGAqb3Bjb2RlcyonLgotCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCi0JKiBOT1RFOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBmaXhlZCBpbiBsaWJ0b29sL2xpYnRvb2wubTQsIHRoZQotCW9yaWdpbmFsIHNvdXJjZSBvZiB0aGlzIGJpdCBvZiBjb2RlLiAgSXQncyBub3QgY2xlYXIgd2hhdCB0aGUgYmVzdCBmaXgKLQl3b3VsZCBiZSwgdGhvdWdoLgotCi1GcmkgRGVjIDEyIDExOjU3OjA0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAoT0ZGX1NMX1BDLCBPRkZfU0xfQlIpOiBNaW5vciBmb3JtYXR0aW5nIGNoYW5nZS4KLQkodGljODBfb3Bjb2Rlcyk6IFJlb3JkZXIgdGFibGUgZW50cmllcyB0byBwdXQgdGhlIDMyIGJpdCBQQyByZWxhdGl2ZQotIAlvZmZzZXQgZm9ybXMgYmVmb3JlIHRoZSAxNSBiaXQgZm9ybXMsIHRvIGRlZmF1bHQgdG8gdGhlIGxvbmcgZm9ybXMuCi0KLUZyaSBEZWMgMTIgMDE6MzI6MzAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGN2dHRxLyp1Kik6IFJlbW92ZSwgYXMgdGhhdCBzdWZmaXggaXMgaW52YWxpZC4KLQotV2VkIERlYyAxMCAxNzo0MjozNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fbGl0dGxlX2FybSk6IFByZXZlbnQgZXhhbWluYXRpb24gb2Ygc3RvcmVkCi0Jc3ltYm9sIGlmIG5vbmUgaXMgcHJlc2VudC4KLQkocHJpbnRfaW5zbl9iaWdfYXJtKTogIFByZXZlbnQgZXhhbWluYXRpb24gb2Ygc3RvcmVkIHN5bWJvbCBpZgotCW5vbmUgaXMgcHJlc2VudC4KLQotVGh1IE9jdCAyMyAyMToxMzozNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQ29ycmVjdCBlbnRyeSBmb3IgUlRFLgotCi1Nb24gRGVjICA4IDExOjIxOjA3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpc2Fzc2VtYmxlLmM6IFJlbW92ZSBkaXNhc21fc3ltYWRkcigpIGZ1bmN0aW9uLgotCi0JKiBhcm0tZGlzLmM6IFVzZSBpbmZvLT5zeW1ib2wgaW5zdGVhZCBvZiBpbmZvLT5mbGFncyB0byBkZXRlcm1pbmUKLQlpZiBkaXNhc3NtYmx5IHNob3VsZCBiZSBpbiBUaHVtYiBvciBBcm0gbW9kZS4KLQotVHVlIERlYyAgMiAwOTo1NDoyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmM6IEFkZCBzdXBwb3J0IGZvciBkaXNhc3NlbWJsaW5nIFRodW1iIG9wY29kZXMuCi0JKHByaW50X2luc25fdGh1bWIpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2FzbV9zeW1hZGRyKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBhcm0tb3BjLmg6IERpc3BsYXkgbm9wIHBzZXVkbyBvcHMgYWxvbmdzaWRlIGVxdWl2YWxlbnQgZGlzYXNzZW1ibHkuCi0JKHRodW1iX29wY29kZXMpOiBUYWJsZSBvZiBUaHVtYiBvcGNvZGVzLgotCi1Nb24gRGVjICAxIDEyOjI1OjU3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChidHN0KTogQ2hhbmdlIERkQHMgdG8gRGQ7Yi4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBSZWNvZ25pemUgJ20nLCAnbicsICdvJywgJ3AnLCAncScsCi0JYW5kICd2JyBhcyBvcGVyYW5kIHR5cGVzLgotCi1Nb24gRGVjICAxIDExOjU2OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQWRkIGFyZ3VtZW50IGZvciBscHN0b3AuICBGcm9tIE9saXZpZXIgQ2FybW9uYQotCTxvbGl2aWVyLmNhcm1vbmFAZGkuZXBmbC5jaD4uCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBIYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGxwc3RvcCwKLQl3aGljaCBoYXMgYSB0d28gd29yZCBvcGNvZGUgd2l0aCBhIG9uZSB3b3JkIGFyZ3VtZW50LgotCi1TdW4gTm92IDIzIDIyOjI1OjIxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSwgY2FzZSBjbXB1KTogSW1tZWRpYXRlIGZpZWxkIGlzCi0JdW5zaWduZWQsIG5vdCBzaWduZWQuCi0JKGQzMHZfZm9ybWF0X3RhYmxlKTogQWRkIFNIT1JUX0NNUFUgY2FzZXMgZm9yIGNtcHUuCi0KLVR1ZSBOb3YgMTggMjM6MTA6MDMgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6Ci0JU3BsaXQgT1BFUkFORF9GTEFHIGludG8gT1BFUkFORF9GRkxBRyBhbmQgT1BFUkFORF9DRkxBRy4KLQotVHVlIE5vdiAxOCAxODo0NToxNCAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBkMTB2LW9wYy5jIChPUEVSQU5EX0ZMQUcpOiBTcGxpdCBpbnRvOgotCShPUEVSQU5EX0ZGTEFHLCBPUEVSQU5EX0NGTEFHKSAuCi0JKEZTUkMpOiBTcGxpdCBpbnRvOgotCShGRlNSQywgQ0ZTUkMpLgotCi1UaHUgTm92IDEzIDExOjA1OjMzIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBNb3ZlIHRoZSBJTlNOX01BQ1JPIElTQSB2YWx1ZSB0byB0aGUgbWVtYmVyc2hpcAotCWZpZWxkIGZvciBhbGwgSU5TTl9NQUNSTydzLgotCSogbWlwczE2LW9wYy5jOiBzYW1lCi0KLVdlZCBOb3YgMTIgMTA6MTY6NTcgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKHN5bmMsY2FjaGUpOiBUaGVzZSBhcmUgMzkwMCBpbnNucy4KLQotVHVlIE5vdiAxMSAyMzo1Mzo0MSAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQlzaC1vcGMuaCAoc2hfdGFibGUpOiBSZW1vdmUgZnRzdC9uYW4uCi0KLVR1ZSBPY3QgMjggMTc6NTk6MzIgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKGZmYywgZmZzKTogRml4IG1hc2suCi0KLVR1ZSBPY3QgMjggMTY6MzQ6NTQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCBlaXRfdmIsIGludF9zLCBhbmQgaW50X20KLQljb250cm9sIHJlZ2lzdGVycy4KLQotTW9uIE9jdCAyNyAyMjozNDowMyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogRml4IGJ1ZyBpbiBtYXNrIGZvciAibm90IiBwc2V1ZG8taW5zdHJ1Y3Rpb24uCi0JKFdSX0hJTE8sIFJEX0hJTE8sIE1PRF9ISUxPKTogTmV3IG1hY3Jvcy4KLQotTW9uIE9jdCAyNyAyMjozNDowMyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogRml4IGJ1ZyBpbiBtYXNrIGZvciAibm90IiBwc2V1ZG8taW5zdHJ1Y3Rpb24uCi0JKFdSX0hJTE8sIFJEX0hJTE8sIE1PRF9ISUxPKTogTmV3IG1hY3Jvcy4KLQotVGh1IE9jdCAyMyAxNDo1Nzo1OCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFJlcGxhY2UgLy8gd2l0aCAvKiAuLi4gKi8KLQotV2VkIE9jdCAyMiAxNzozMzoyMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogQWRkIHdyICYgcmQgZm9yIHY5YSBhc3Incy4KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogUmVjb2duaXplICdfJyBhbmQgJy8nIGZvciB2OWEgYXNyJ3MuCi0JKHY5YV9hc3JfcmVnX25hbWVzKTogTmV3IHZhcmlhYmxlLgotCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1Pi4KLQotV2VkIE9jdCAyMiAxNzoxODowMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAodjlub3R2OWEpOiBOZXcgaW5zbiB0eXBlLgotCShJTVBERVApOiBNb3ZlIHRvIHRoZSBlbmQgdG8gbm90IGNvbmZsaWN0IHdpdGggZWRnZTggZXQgYWwuCi0JUGF0Y2ggZnJvbSBEYXZpZCBNaWxsZXIgPGRhdmVtQHZnZXIucnV0Z2Vycy5lZHU+LgotCi1GcmkgT2N0IDE3IDEzOjE4OjUzIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChibmV6bCxiZXF6bCk6IE1hcmsgdGhlc2UgYXMgYWxzbyB0eDM5LgotCi1UaHUgT2N0IDE2IDExOjU1OjIwIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBOb3RlIHRoYXQgJ2phbHgnIGlzIChwcm9iYWJseSBpbmNvcnJlY3RseSkgbWFya2VkIEkxLgotCi1UdWUgT2N0IDE0IDE2OjEwOjMxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogVXNlIG5ldyBzeW1ib2xfYXRfYWRkcmVzc19mdW5jKCkgZmllbGQKLQlvZiBkaXNhc3NlbWJsZV9pbmZvIHN0cnVjdHVyZSB0byBkZXRlcm1pbmUgaWYgYW4gb3ZlcmxheSBhZGRyZXNzCi0JaGFzIGEgbWF0Y2hpbmcgc3ltYm9sIGluIGxvdyBtZW1vcnkuCi0KLQkqIGRpcy1idWYuYyAoZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcyk6IE5ldyAoZHVtbXkpIGZ1bmN0aW9uIGZvcgotCW5ldyBzeW1ib2xfYXRfYWRkcmVzc19mdW5jIGZpZWxkIGluIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0dXJlLgotCi1GcmkgT2N0IDEwIDE2OjQ0OjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKGV4dHJhY3RfZDIyKTogVXNlIHNpZ25lZCBhcml0aG1hdGljLgotCi1UdWUgT2N0ICA3IDIzOjQwOjQzIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBUaHJlZSBvcCBtdWx0IGlzIG5vdCBhbiBJU0EgaW5zbi4KLQotVHVlIE9jdCAgNyAyMzozNzoyMSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogRml4IGZvcm1hdHRpbmcuCi0KLUZyaSBPY3QgIDMgMTc6MjY6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChPUF9FKTogRXhwbGljaXRseSBzaWduIGV4dGVuZCA4IGJpdCB2YWx1ZXMsIHJhdGhlcgotIAl0aGFuIGFzc3VtaW5nIHRoYXQgY2hhciBpcyBzaWduZWQuICBFeHBsaWNpdGx5IHNpZ24gZXh0ZW5kIDE2IGJpdAotCXZhbHVlcywgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhhdCBzaG9ydCBpcyAxNiBiaXRzLgotCShPUF9zSSwgT1BfSiwgT1BfRElSKTogTGlrZXdpc2UuCi0KLVRodSBPY3QgIDIgMTM6MzY6NDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAodjg1MF9zcmVnX25hbWVzKTogVXNlIHN5bWJvbGljIG5hbWVzIGZvciBoaWdoZXIKLQlzeXN0ZW0gcmVnaXN0ZXJzLgotCi1XZWQgT2N0ICAxIDE2OjU4OjU0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQWRkIHRlc3Qgb2YgcHJvY2Vzc29yIHR5cGUgd2hlbgotCWRldGVybWluaW5nIG9wY29kZXMuCi0KLVdlZCBPY3QgIDEgMTQ6MTA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBhIGRpdmVyc2lvbiB0byBzZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgdGhlCi0JYXJndW1lbnRzIGFyZSBwYXJzZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBTZXAgMjUgMTM6MDQ6NTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChUQkwxKTogVXNlICEgcmF0aGVyIHRoYW4gYC4KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUmVtb3ZlIGAgb3BlcmFuZCBzcGVjaWZpZXIuCi0KLVdlZCBTZXAgMjQgMTE6Mjk6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBDb3JyZWN0IGJjaGcsIGJjbHIsIGJzZXQsIGFuZCBidHN0IG9uIENvbGRGaXJlLgotCi0JKiBtNjhrLW9wYy5jOiBBY2NlcHQgdHN0e2IsdyxsfSB3aXRoIGltbWVkaWF0ZSBvcGVyYW5kcyBvbiBjcHUzMi4KLQotCSogbTY4ay1vcGMuYzogQ29ycmVjdCBtb3ZldyBvZiBhbiBpbW1lZGlhdGUgb3BlcmFuZCB0byAlc3Igb3IgJWNjcgotCWZvciBtY2Y1MjAwLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfVE9PTCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgU2VwIDE5IDExOjQ1OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoImNtb3YiKTogT3JkZXIgcmVnIHBhcmFtIHIxLCByMiBub3QgcjIsIHIyLgotCi1UaHUgU2VwIDE4IDExOjIxOjQzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY2xldF9jcHJlZ190YWJsZSk6IEFkZCAlY2NzcjIsICVjY2NyciwgJWNjcnN0ci4KLQotVHVlIFNlcCAxNiAxNToxODoyMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGdXJ0aGVyIHJlYXJyYW5nZW1lbnRzLgotCi1UdWUgU2VwIDE2IDE2OjEyOjExIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChyb3QyaCwgc3JhMmgsIHNybDJoIGluc25zKTogUmV2ZXJ0IGxhc3QgY2hhbmdlLgotCi1UdWUgU2VwIDE2IDA5OjQ4OjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpZWxkcyByZW9yZGVyZWQgdG8gYWxsb3cgYXNzZW1ibGVyCi0JcGFyc2VyIHRvIHdvcmsuCi0KLVR1ZSBTZXAgMTYgMTA6MDE6MDAgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZGVkIHR4MzkgaW5zbnMgc2RiYnAsIHJmZSwgYW5kIGRlcmV0LgotCi1Nb24gU2VwIDE1IDE4OjMxOjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmM6IEluaXRpYWxpc2UgcHJvY2Vzc29ycyBmaWVsZCBvZiB2ODUwX29wY29kZSBzdHJ1Y3R1cmUuCi0KLVdlZCBBdWcgMjcgMjE6NDI6MzkgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGQzMHYtb3BjLmM6IENoYW5nZSBtdmZhY2MgdG8gYWNjZXB0IDYtYml0IHVuc2lnbmVkIHZhbHVlcy4KLQotCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkIGNvbnRyb2wgcmVnaXN0ZXJzIGZyb20gMC02My4KLQkoZDMwdl9vcGNvZGVfdGFiZWwpOiBBZGQgZGJ0LCBydGQsIHNyYWgsIGFuZCBzcmxoIGluc3RydWN0aW9ucy4gRml4Ci0Jcm90MmgsIHNyYTJoLCBhbmQgc3JsMmggdG8gdXNlIG5ldyBTSE9SVF9BNVMgZm9ybWF0LgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuKTogRml4IGRpc2Fzc2VtYmx5IG9mIFNIT1JUX0QyIG9wY29kZXMuCi0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc24pOiBGaXJzdCBvcGVyYW5kIG9mIGQqaSAoZGVsYXllZAotCWJyYW5jaCkgaW5zdHJ1Y3Rpb25zIGlzIHJlbGF0aXZlLgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IENoYW5nZSBmb3JtIGZvciByZXBlYXRpLgotCShkMzB2X29wZXJhbmRfdGFibGUpOiBBZGQgSU1NNlMzIHR5cGUuCi0JKGQzMHZfZm9ybWF0X3RhYmxlKTogQ2hhbmdlIFNIT1JUX0QyLiBBZGQgTE9OR19EYi4KLQotCSogZDMwdi1kaXMuYzogRml4IGJ1ZyB3aXRoICIucyIgYW5kICIubCIgZXh0ZW5zaW9ucwotCWFuZCBjbXAgaW5zdHJ1Y3Rpb25zLgotCi0JKiBkMzB2LW9wYy5jOiBDb3JyZWN0IGVudHJpZXMgZm9yIHJlcGVhdCosIGFuZCBzYXQqLgotCU1ha2UgSU1NNSB1bnNpZ25lZC4gQ3JlYXRlIElNTTZVIGFuZCBJTU0xMlMzVSBvcGVyYW5kCi0JdHlwZXMuIENvcnJlY3Qgc2V2ZXJhbCBmb3JtYXRzLgotCi0JKiBkMzB2LW9wYy5jOiAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkIGRwc3cgYW5kIGRwYy4KLQotCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQ2hhbmdlIGNvbnRyb2wgcmVnaXN0ZXJzLgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X2Zvcm1hdF90YWJsZSk6IENvcnJlY3QgU0hPUlRfQzEgYW5kCi0JU0hPUlRfQzIuICBNYW51YWwgd2FzIGluY29ycmVjdC4KLQotCSogZDMwdi1kaXMuYyAobG9va3VwX29wY29kZSk6ICBSZXR1cm4gdmFsdWUgbm93IGluZGljYXRlcwotCWlmIGFuIG9wY29kZSBoYXMgYSBzaG9ydCBhbmQgYSBsb25nIGZvcm0uICBVc2VkIGZvciBkZWNpZGluZwotCXRvIGFwcGVuZCBhICIucyIgb3IgIi5sIi4KLQkocHJpbnRfaW5zbik6IEFwcGVuZCBhICIucyIgdG8gYW4gaW5zdHJ1Y3Rpb24gaWYgaXQgaXMKLSAJdGhlIHNob3J0IGZvcm0gYW5kICIubCIgaWYgaXQgaXMgYSBsb25nIGZvcm0uIERvIG5vdCBhcHBlbmQKLQlhbnl0aGluZyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG9ubHkgb25lIHBvc3NpYmxlIHNpemUuCi0KLQkqIGQzMHYtb3BjLmM6IENoYW5nZSBtdWx4MmggdG8gcmVxdWlyZSBhbiBldmVuIHJlZ2lzdGVyLgotCU5ldyBmb3JtOiBTSE9SVF9BMjsgYSBTSE9SVF9BIGZvcm0gdGhhdCBuZWVkcyBhbiBldmVuCi0JcmVnaXN0ZXIgYXMgdGhlIGZpcnN0IG9wZXJhbmQuCi0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc25fZDMwdik6IEZpeCBwcm9ibGVtIHdoZXJlIHRoZSBsYXN0Ci0JaW5zdHJ1Y3Rpb24gd2FzIG5vdCBiZWluZyBkaXNhc3NlbWJsZWQgaWYgdGhlcmUgd2VyZSBhbiBvZGQKLQludW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLgotCi0JKiBkMzB2LW9wYy5jIChTSE9SVF9NMiwgTE9OR19NMik6ICBUd28gbmV3IGZvcm1zLgotCi1GcmkgU2VwIDEyIDExOjQzOjU0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogSW1wcm92ZWQgZGlzcGxheSBvZiByZWdpc3RlciBsaXN0cy4KLQotVGh1IFNlcCAxMSAxNzozNToxMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCBhc3NlbWJsZXIgYXJncyB0bwotCWZ6ZXJvcywgZm9uZXMsIGZzcmMxLCBmc3JjMXMsIGZzcmMycywgZm5vdDEsIGZub3QxcywgZm5vdDJzLAotCWZvcnMsIGZub3JzLCBmYW5kcywgZm5hbmRzLCBmeG9ycywgZnhub3JzLCBmb3Jub3QxcywgZm9ybm90MnMsCi0JZmFuZG5vdDFzLCBmYW5kbm90MnMuCi0KLVR1ZSBTZXAgIDkgMTA6MDM6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggb3AzIGZpZWxkIGZvciBmY21wcS9mY21wZXEuCi0KLU1vbiBTZXAgIDggMTQ6MDY6NTkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9wYXJzZV9hZGRyZXNzKTogTmV3IGFyZ3VtZW50IHJlc3VsdHAuCi0JQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQkqIG0zMnItYXNtLmMgKHBhcnNlX2hfaGkxNik6IFJpZ2h0IHNoaWZ0IG51bWJlcnMgYnkgMTYuCi0KLVR1ZSBTZXAgIDIgMTg6Mzk6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogbW4xMDIwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgYXJlCi0gICAgICAgIHJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBTZXAgIDIgMTU6NDE6NTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBPbmx5IHNpZ25lZCBleHRlbmQgdmFsdWVzIHRoYXQgYXJlIG5vdAotCXJldHVybmVkIGJ5IGV4dHJhY3QgZnVuY3Rpb25zLgotCVJlbW92ZSB1c2Ugb2YgVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkgZmxhZy4KLQotVHVlIFNlcCAgMiAxNTozOTo0MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jOiBVcGRhdGUgY29tbWVudHMuICBSZW1vdmUgdXNlIG9mCi0JVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkuICBGaXggc2V2ZXJhbCBvcGVyYW5kIHBhdHRlcm5zLgotCi1UdWUgQXVnIDI2IDA5OjQyOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKE1PVkhJKTogSW1tZWRpYXRlIHBhcmFtZXRlciBpcyB1bnNpZ25lZC4KLQotTW9uIEF1ZyAyNSAxNTo1ODowNyAxOTk3ICBDaHJpc3RvcGhlciBQcm92ZW56YW5vICA8cHJvdmVuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsdCB3aXRoIGxhdGVzdCBkZXZvIGF1dG9jb25mIGZvciBOVCBzdXBwb3J0LgotCi1GcmkgQXVnIDIyIDEwOjM1OjE1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogVXNlIGN1cmx5IGJyYWNlIHN5bnRheCBmb3IgcmVnaXN0ZXIKLQlsaXN0cy4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBBZGQgTk9UX1IwIGZsYWcgdG8gZGVjZWN0IGNhc2VzCi0Jd2hlcmUgcjAgaXMgYmVpbmcgdXNlZCBhcyBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLgotCi1UaHUgQXVnIDIxIDExOjA5OjA5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogTW92ZSBkaXZoIG9wY29kZXMgbmV4dCB0byBlYWNoIG90aGVyLgotCi1UdWUgQXVnIDE5IDEwOjU5OjU5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jIChhbHBoYV9vcGNvZGVzKTogRml4IGh3X3JlaV9zdGFsbCBtdW5nYWdlLgotCi1Nb24gQXVnIDE4IDExOjEwOjAzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogUmVtb3ZlIHVzZSBvZiBmbGFnIGZpZWxkLgotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBBZGQgc3VwcG9ydCBmb3IgcmV2ZXJzZWQgc2hvcnQgbG9hZAotCW9wY29kZXMuLgotCi1Nb24gQXVnIDE4IDExOjA4OjI1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAoY2dlbl9maWxlcyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGNnZW5fZmlsZXMpOiAgQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMTowODoyNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUgKGNnZW5fZmlsZXMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoY2dlbl9maWxlcyk6ICBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotRnJpIEF1ZyAxNSAwNToxNzo0OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGJmZF9hcmNfYXJjaCk6IEFkZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmFtIChBTExfTUFDSElORVMpOiBBZGQgYXJjLWRpcy5sbywgYXJjLW9wYy5sby4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogYXJjLWRpcy5jLCBhcmMtb3BjLmM6IE5ldyBmaWxlcy4KLQkqIGRpc2Fzc2VtYmxlLmMgKEFSQ0hfYWxsKTogRGVmaW5lIEFSQ0hfYXJjLgotCShkaXNhc3NlbWJsZXIpOiBBZGQgQVJDIHN1cHBvcnQuCi0KLVdlZCBBdWcgMTMgMTg6NTI6MTEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MEVBIGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2k1ZGl2LCBleHRyYWN0X2k1ZGl2KTogTmV3IEZ1bmN0aW9ucy4KLQkodjg1MF9vcGNvZGVzKTogQWRkIHY4NTBFQSBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBFIGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q1XzQsIGV4dHJhY3RfZDVfNCwgaW5zZXJ0X2QxNl8xNiwKLQlleHRyYWN0X2QxNl8xNiwgaW5zZXJ0X2k5LCBleHRyYWN0X2k5LCBpbnNlcnRfdTksIGV4dHJhY3RfdTksCi0JaW5zZXJ0X3NwZSwgZXh0cmFjdF9zcGUpOiBOZXcgRnVuY3Rpb25zLgotCSh2ODUwX29wY29kZXMpOiBBZGQgdjg1MEUgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLW9wYy5jOiBSZW9yZ2FuaXNlZCBhbmQgcmUtbGF5ZWQgb3V0IHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKLQlhbmQgcG9ydGFiaWxpdHkuCi0KLVR1ZSBBdWcgIDUgMjM6MDk6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLjEuCi0KLU1vbiBBdWcgIDQgMTI6MDI6MTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBuZXcgYXV0b21ha2UgcGF0Y2hlcy4KLQotRnJpIEF1ZyAgMSAxMzowMjowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KLQkqIGFjaW5jbHVkZS5tNDogSnVzdCBpbmNsdWRlIGFjaW5jbHVkZS5tNCBmcm9tIEJGRC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEp1bCAzMSAyMTo0NDo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLgotCVJlbW92ZWQgc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCi0JQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwKLQlBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIFJlcGxhY2UgQUNfUFJPR19JTlNUQUxMIHdpdGgKLQlBTV9QUk9HX0lOU1RBTEwuICBDaGFuZ2UgYWxsIC5vIGZpbGVzIHRvIC5sby4gIFJlbW92ZSBzdGFtcC1oCi0JaGFuZGxpbmcgaW4gQUNfT1VUUFVULgotCSogZGVwLWluLnNlZDogQ2hhbmdlIC5vIHRvIC5sby4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEp1bCAyOCAyMTo1MjoyNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEZpeCB0eXBvL3RoaW5rbyBpbiAiZXJldCIgaW5zdHJ1Y3Rpb24uCi0KLVRodSBKdWwgMjQgMTM6MDM6MjYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggc3BlbGxpbmcgb24gZnBhZGRYLCBmcHN1YlggaW5zbnMuCi0JTWFrZSBhcnJheSBjb25zdC4KLQkqIHNwYXJjLWRpcy5jIChzb3J0ZWRfb3Bjb2Rlcyk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHN0cnVjdCBvcGNvZGVfaGFzaCk6IGBvcGNvZGUnIGlzIHBvaW50ZXIgdG8gY29uc3QgZWxlbWVudC4KLQkoYnVpbGRfaGFzaCk6IEZpcnN0IGFyZyBpcyBub3cgdGFibGUgb2Ygc29ydGVkIHBvaW50ZXJzLgotCShwcmludF9pbnNuX3NwYXJjKTogU29ydCBvcGNvZGVzIGJ5IHNvcnRpbmcgdGFibGUgb2YgcG9pbnRlcnMuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IFVwZGF0ZS4KLQotVHVlIEp1bCAxNSAxMjowNToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jOiAjaW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGhhc2hfa2V5d29yZF9uYW1lKTogTmV3IGFyZyBgY2FzZV9zZW5zaXRpdmVfcCcuICBDYWxsZXJzIHVwZGF0ZWQuCi0JSGFuZGxlIGNhc2UgaW5zZW5zaXRpdmUgaGFzaGluZy4KLQkoaGFzaF9rZXl3b3JkX3ZhbHVlKTogQ2hhbmdlIHR5cGUgb2YgYHZhbHVlJyB0byB1bnNpZ25lZCBpbnQuCi0KLVRodSBKdWwgMTAgMTI6NTY6MTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IElmIGFuIGluc24gdXNlcyBzaW5nbGUKLQlwcmVjaXNpb24gRlAsIG1hcmsgaXQgYXMgc3VjaC4gIExpa2V3aXNlIGZvciBkb3VibGUgcHJlY2lzaW9uCi0JRlAuICBNYXJrIElTQTEgaW5zbnMuICBDb25zb2xpZGF0ZSBkdXBsaWNhdGUgb3Bjb2RlcyB3aGVyZQotCXBvc3NpYmxlLgotCi1XZWQgSnVuIDI1IDE1OjI1OjU3IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY2lyZGFuLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoZXh0cmFjdF9uc2kpOiBtYWtlIHVuc2lnbmVkIGV4cHJlc3Npb24gc2lnbmVkIGJlZm9yZQotIAluZWdhdGluZyBpdC4KLQkoVU5VU0VEKTogcmVtb3ZlIG9uZSBsZXZlbCBvZiBwYXJlbnMsIHNvIE1TVkMgZG9lc24ndCBjaG9rZSBvbgotIAluZXN0aW5nIGRlcHRoIHdoZW4gYWxsIHRoZSBtYWNyb3MgYXJlIGV4cGFuZGVkLgotCi1UdWUgSnVuIDE3IDE3OjAyOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IFRoZSBmY21wIHY5YSBpbnN0cnVjdGlvbnMgdGFrZSBhbiBpbnRlZ2VyIHJlZ2lzdGVyCi0JYXMgYSBkZXN0aW5hdGlvbiwgbm90IGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICBGcm9tIENocmlzdGlhbgotCUt1ZWhua2UgPENocmlzdGlhbi5LdWVobmtlQGFyYmkuSW5mb3JtYXRpay5VbmktT2xkZW5idXJnLkRFPi4KLQotTW9uIEp1biAxNiAxNDoxMzoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUHJpbnQgY2FzZSA3LjIgdXNpbmcgJXBjQCgpCi0Jc3ludGF4LiAgRnJvbSBSb21hbiBIb2RlawotCTxybmhvZGVrQGZhdWkyMmMuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+LgotCi0JKiBpMzg2LWRpcy5jICh0d29ieXRlX2hhc19tb2RybSk6IEZpeCBwYW5kLgotCi1Nb24gSnVuIDE2IDE0OjA4OjM4IDE5OTcgIE1pY2hhZWwgVGF5bG9yICA8bWJ0QG1pdC5lZHU+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nl90d29ieXRlKTogRml4IHBhbmQgYW5kIHBhbmRuLgotCi1UdWUgSnVuIDEwIDExOjI2OjQ3IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGFybS1kaXMuYzogQWRkIHByb3RvdHlwZXMgZm9yIGFybV9kZWNvZGVfc2hpZnQgYW5kCi0JcHJpbnRfaW5zbl9hcm0uCi0KLU1vbiBKdW4gIDIgMTE6Mzk6MDQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCByMzkwMCBpbnNucy4KLQotVHVlIE1heSAyNyAxNTo1NTo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IENoYW5nZSByZWxtYXNrIHRvIGJmZF92bWEuICBEb24ndAotCXByaW50IGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBzYW1lIGxpbmUuICBXaGVuIHVzaW5nIGEgUEMKLQlyZWxhdGl2ZSBsb2FkLCBhZGQgYSBjb21tZW50IHdpdGggdGhlIHZhbHVlIGJlaW5nIGxvYWRlZCBpZiBpdCBjYW4KLQliZSBvYnRhaW5lZC4KLQotVHVlIE1heSAyNyAxMTowMjowOCAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4NltdLCBkaXMzODZfdHdvYnl0ZVtdKTogY2hhbmdlIHB1c2hsL3BvcGwKLQl0byBwdXNoUy9wb3BTIGZvciBzZWdtZW50IHJlZ3MgYW5kIGJ5dGUgY29uc3RhbnQgc28gdGhhdAotCXB1c2h3L3BvcHcgcHJpbnRlZCB3aGVuIGluIDE2IGJpdCBkYXRhIG1vZGUuCi0KLQkqIGkzODYtZGlzLmMgKGRpczM4NltdKTogY2hhbmdlIGN3dGwsIGNsdGQgdG8gY1d0UywgY1N0ZCB0bwotCXByaW50IGNidHcsIGN3dGQgaW4gMTYgYml0IGRhdGEgbW9kZS4KLQkqIGkzODYtZGlzLmMgKHB1dG9wKTogZXh0cmEgY2FzZSBXIHRvIHN1cHBvcnQgYWJvdmUuCi0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25feDg2KTogcHJpbnQgYWRkcjMyIHByZWZpeCB3aGVuIGdpdmVuCi0JYWRkcmVzcyBzaXplIHByZWZpeCBpbiAxNiBiaXQgYWRkcmVzcyBtb2RlLgotCi1GcmkgTWF5IDIzIDE2OjQ3OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmM6IFJlaW5kZW50LiAgUmVuYW1lIGxvY2FsIHZhcmlhYmxlIGZwcmludGYgdG8KLQlmcHJpbnRmX2ZuLgotCi1UaHUgTWF5IDIyIDE0OjA2OjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmMgKG0zMnJfY2dlbl9pbnNuX3RhYmxlLCBjbXB1aSk6IFVuZG8gcGF0Y2ggb2YgTWF5IDIuCi0KLVR1ZSBNYXkgMjAgMTE6MjY6MjcgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfYnVpbHRpbl9vcGNvZGVzKTogTW92ZWQgSU5TTl9JU0EgZmllbGQgaW50byBuZXcKLQkgIGZpZWxkIG1lbWJlcnNoaXAuCi0JKiBtaXBzMTYtb3BjLmMgKG1pcDE2X29wY29kZXMpOiBzYW1lLgotCi1Nb24gTWF5IDEyIDE1OjEwOjUzIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobW92ZWIpOiBDaGFuZ2UgJGQgdG8gJWQuCi0KLU1vbiBNYXkgIDUgMTQ6Mjg6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jOiAoZGlzMzg2X3R3b2J5dGUpOiBBZGQgTU1YIGluc3RydWN0aW9ucy4KLQkodHdvYnl0ZV9oYXNfbW9kcm0pOiBMaWtld2lzZS4KLQkoZ3Jwcyk6IExpa2V3aXNlLgotCShPUF9NTVgsIE9QX0VNLCBPUF9NUyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCi0JKiBpMzg2LWRpcy5jOiBSZXZlcnQgcGF0Y2ggb2YgQXByaWwgNC4gIFRoZSBvdXRwdXQgbm93IG1hdGNoZXMKLQl3aGF0IGdjYyBnZW5lcmF0ZXMuCi0KLUZyaSBNYXkgIDIgMTI6NDg6MzcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYyAobTMycl9jZ2VuX2luc25fdGFibGUsIGNtcHVpKTogVXNlICR1aW1tMTYgaW5zdGVhZAotCW9mICRzaW1tMTYuCi0KLVRodSBNYXkgIDEgMTU6MzQ6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCAoQ0dFTl9BUkNIKTogUmVuYW1lZCBmcm9tIENHRU5fQ1BVLgotCi1UdWUgQXByIDE1IDEyOjQwOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCi1Nb24gQXByIDE0IDEyOjEzOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVN1biBBcHIgMTMgMTc6NTA6NDEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi0qLmMsIG0zMnItKi5jOiAjaW5jbHVkZSBzeXNkZXAuaCBpbnN0ZWFkIG9mIGNvbmZpZy5oLgotCURlbGV0ZSBzdHJpbmd7LHN9Lmggc3VwcG9ydC4KLQotVGh1IEFwciAxMCAxNDo0NDo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX29wZXJhbmRfZm4pOiBOZXcgZ2xvYmFsLgotCShjZ2VuX3BhcnNlX3t7LHVufXNpZ25lZF9pbnRlZ2VyLGFkZHJlc3N9KTogVXBkYXRlIGNhbGwgdG8KLQljZ2VuX3BhcnNlX29wZXJhbmRfZm4uCi0JKGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kKTogTmV3IGZ1bmN0aW9uLgotCSogbTMyci1hc20uYyAocGFyc2VfaW5zbl9ub3JtYWwpOiBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCByZW5hbWVkCi0JZnJvbSBjZ2VuX2FzbV9pbml0X3BhcnNlLgotCShtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbik6IE5ldyBvcGVyYW5kIGBlcnJtc2cnLgotCURlbGV0ZSBjYWxsIHRvIGFzX2JhZCwgcmV0dXJuIGVycm9yIG1lc3NhZ2UgdG8gY2FsbGVyLgotCShtMzJyX2NnZW5fYXNtX2hhc2hfa2V5d29yZHMpOiAjaWYgMCBvdXQuCi0KLVdlZCBBcHIgIDkgMTI6MDU6MjUgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKSBbY2FzZSAnZCddOiBQcmludCBhcyBhZGRyZXNzIHJlZ2lzdGVyLAotCW5vdCBkYXRhIHJlZ2lzdGVyLgotCVtjYXNlICdKJ106IEZpeCB0eXBvIGluIHJlZ2lzdGVyIG5hbWUuCi0KLU1vbiBBcHIgIDcgMTY6NDg6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgU0hMSUJfTElCUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChTSExJQl9MSUJTKTogTmV3IHZhcmlhYmxlLgotCSgkKFNITElCKSk6IFVzZSAkKFNITElCX0xJQlMpLgotCi1Nb24gQXByICA3IDExOjQ1OjQ0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tZGlzLmMgKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogRml4IHhtYWxsb2Mgc2l6ZSBjb21wdXRhdGlvbi4KLQotCSogY2dlbi1vcGMuYyAoaGFzaF9rZXl3b3JkX25hbWUpOiBJbXByb3ZlIGFsZ29yaXRobS4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogSGFuZGxlIG0zMnIuCi0KLUZyaSBBcHIgIDQgMTI6Mjk6MzggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYywgbTMyci1kaXMuYywgbTMyci1vcGMuYywgbTMyci1vcGMuaDogTmV3IGZpbGVzLgotCSogY2dlbi1hc20uYywgY2dlbi1kaXMuYywgY2dlbi1vcGMuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCB0aGVtLgotCShBTExfTUFDSElORVMpOiBBZGQgdGhlbS4KLQkoZGVwZW5kZW5jaWVzKTogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbiAoY2dlbl9maWxlcyk6IE5ldyB2YXJpYWJsZS4KLQkoYmZkX20zMnJfYXJjaCk6IEFkZCBlbnRyeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotRnJpIEFwciAgNCAxNDowNDoxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29ycmVjdCBmaWxlIG5hbWVzIGZvciBiZmRfbW4xMFsyM10wMF9hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGQxMHYtZGlzLmM6IEluY2x1ZGUgImFuc2lkZWNsLmgiIGJlZm9yZSAib3Bjb2RlL2QxMHYuaCIuCi0KLQkqIGkzODYtZGlzLmMgKGZsb2F0X3JlZyk6IFN3YXAgZnN1YnJwIGFuZCBmc3VicC4gIFN3YXAgZmRpdnJwIGFuZAotCWZkaXZwLgotCi1UaHUgQXByICAzIDEzOjIyOjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1XZWQgQXByICAyIDEyOjIzOjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTEwMjAwLWRpcy5jOiBSZW5hbWUgZnJvbSBtbjEwMjAwLWRpcy5jLgotCSogbTEwMjAwLW9wYy5jOiBSZW5hbWUgZnJvbSBtbjEwMjAwLW9wYy5jLgotCSogbTEwMzAwLWRpcy5jOiBSZW5hbWUgZnJvbSBtbjEwMzAwLWRpcy5jCi0JKiBtMTAzMDAtb3BjLmM6IFJlbmFtZSBmcm9tIG1uMTAzMDAtb3BjLmMuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGFjY29yZGluZ2x5LgotCi0JKiBtaXBzMTYtb3BjLmM6IEFkZCBtdWwgYW5kIGRtdWwgbWFjcm9zLgotCi1UdWUgQXByICAxIDE2OjI3OjQ1IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBDRkxBR1MsIGFkZCBjbGVhbiB0YXJnZXQuCi0KLUZyaSBNYXIgMjggMTI6MTA6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgIndhaXQiLiAgRnJvbSBSYWxmIEJhZWNobGUKLQk8cmFsZkBnbnUuYWkubWl0LmVkdT4uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN0ZGxpYi5oIHRvIEFDX0NIRUNLX0hFQURFUlMgbGlzdC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogc3lzZGVwLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuCi0JKiBzcGFyYy1kaXMuYzogSW5jbHVkZSA8c3RkaW8uaD4gYW5kICJzeXNkZXAuaCIuICBEb24ndCBpbmNsdWRlCi0JPHN0cmluZy5oPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotVGh1IE1hciAyNyAxNDoyNDo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYzogQWRkIFBQQyA0MDMgaW5zdHJ1Y3Rpb25zIGFuZCBleHRlbmRlZCBvcGNvZGVzLiAgRnJvbQotCUFuZHJldyBCcmF5IDxhbmR5QG1hZGhvdXNlLmRlbW9uLmNvLnVrPi4KLQotCSogbWlwcy1vcGMuYzogQWRkIGNhc3Qgd2hlbiBzZXR0aW5nIG1pcHNfb3Bjb2Rlcy4KLQotVHVlIE1hciAyNSAyMzowNDowMCAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6ICBGaXggc2lnbiBleHRlbnNpb24gcHJvYmxlbS4KLQkqIHY4NTAtb3BjLmMgKGV4dHJhY3RfZCopOiAgRml4IHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zIHRvIG1ha2UKLQlkaXNhc3NlbWJseSBjYWxjdWxhdGUgYnJhbmNoIG9mZnNldHMgY29ycmVjdGx5LgotCi1Nb24gTWFyIDI0IDEzOjIyOjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmg6IEFkZCBiZi9zIGFuZCBidC9zIGFzIHN5bm9ueW1zIGZvciBiZi5zIGFuZCBidC5zLgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgZGN0ciBhbmQgZGN0dy4KLQotU3VuIE1hciAyMyAxODowODoxMCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbik6IENoYW5nZSB0aGUgd2F5IHNpZ25lZCBjb25zdGFudHMKLQlhcmUgZGlzcGxheWVkLgotCi1GcmkgTWFyIDIxIDE0OjM3OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9IKTogTmV3IHZhcmlhYmxlLgotCShIRklMRVMpOiBOZXcgdmFyaWFibGUuCi0JKENGSUxFUyk6IEFkZCBhbGwgQyBmaWxlcy4KLQkoLmRlcCwgLmRlcDEsIGRlcC5zZWQsIGRlcCwgZGVwLWluKTogTmV3IHRhcmdldHMuCi0JRGVsZXRlIG9sZCBkZXBlbmRlbmNpZXMsIGFuZCBidWlsZCBuZXcgb25lcy4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi1UaHUgTWFyIDIwIDE5OjAzOjMwIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGRlZCBibG8gYW5kIGJsb3tzLGIsdyxsfS4KLQotVHVlIE1hciAxOCAxNDoxNzowMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmM6IENoYW5nZSAidHJhcCIgdG8gInN5c2NhbGwiLgotCSogbW4xMDMwMC1vcGMuYzogQWRkIG5ldyAic3lzY2FsbCIgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBNYXIgMTcgMDg6NDg6MDMgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBQcm92aWRlIGNvcnJlY3QgZW50cmllcyBmb3IgbXVsc2wgYW5kCi0gCW11bHVsIGluc25zIG9uIHRoZSBjb2xkZmlyZS4KLQotU2F0IE1hciAxNSAxNzoxMzowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBEb24ndCBwcmludCBpbnN0cnVjdGlvbiBieXRlcy4KLQkocHJpbnRfaW5zbl9iaWdfYXJtKTogU2V0IGJ5dGVzX3Blcl9jaHVuayBhbmQgZGlzcGxheV9lbmRpYW4uCi0JKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDE0IDE1OjA4OjU5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBILkouIEx1IDxoamxAbHVjb24ub3JnPjoKLQkqIGkzODYtZGlzLmMgKGZldGNoX2RhdGEpOiBBZGQgcHJvdG90eXBlLgotCSogbTY4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6IEFkZCBwcm90b3R5cGUuCi0JKGR1bW15X3ByaW50X2FkZHJlc3MpOiBBZGQgcHJvdG90eXBlLiAgTWFrZSBzdGF0aWMuCi0JKiBwcGMtb3BjLmMgKHZhbGlkX2JvKTogQWRkIHByb3RvdHlwZS4KLQkqIHNwYXJjLWRpcy5jIChidWlsZF9oYXNoX3RhYmxlKTogQWRkIHByb3RvdHlwZS4KLQkoaXNfZGVsYXllZF9icmFuY2gsIGNvbXB1dGVfYXJjaF9tYXNrKTogQWRkIHByb3RvdHlwZXMuCi0JKHByaW50X2luc25fc3BhcmMpOiBNYWtlIHNldmVyYWwgbG9jYWwgdmFyaWFibGVzIGNvbnN0LgotCShjb21wYXJlX29wY29kZXMpOiBDaGFuZ2UgYXJndW1lbnRzIHRvIGNvbnN0IFBUUi4gIEFkZCBwcm90b3R5cGUuCi0JKiBzcGFyYy1vcGMuYyAoYXJnKTogQ2hhbmdlIG5hbWUgZmllbGQgdG8gYmUgY29uc3QuCi0JKGxvb2t1cF9uYW1lLCBsb29rdXBfdmFsdWUpOiBBZGQgcHJvdG90eXBlcy4gIENoYW5nZSB0YWJsZSBhbmQKLQluYW1lIHBhcmFtZXRlcnMgdG8gYmUgY29uc3QuCi0JKHNwYXJjX2VuY29kZV9hc2kpOiBDaGFuZ2UgbmFtZSBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCi0JKHNwYXJjX2VuY29kZV9tZW1iYXIsIHNwYXJjX2VuY29kZV9wcmVmZXRjaCk6IExpa2V3aXNlLgotCShzcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcpOiBMaWtld2lzZS4KLQkoc3BhcmNfZGVjb2RlX2FzaSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBiZSBjb25zdC4KLQkoc3BhcmNfZGVjb2RlX21lbWJhciwgc3BhcmNfZGVjb2RlX3ByZWZldGNoKTogTGlrZXdpc2UuCi0JKHNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyk6IExpa2V3aXNlLgotCi1GcmkgTWFyICA3IDEwOjUxOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoU0hMSU5LKSk6IEp1c3QgdXNlIGxuIC1zLCBub3QgbG4gLXNmLCBzaW5jZQotCVNvbGFyaXMgZG9lc24ndCBsaWtlIHRoZSBjb21iaW5lZCBvcHRpb25zLCBhbmQgdGhlIC1mIGlzCi0JdW5uZWNlc3NhcnkuCi0JKHN0YW1wLXRzaGxpbmssIGluc3RhbGwpOiBMaWtld2lzZS4KLQotVGh1IE1hciAgNiAxNjo1MToxMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKElNTTE2X1BDUkVMLCBTRDhOX1BDUkVMLCBEMTZfU0hJRlQpOiBNYXJrIHRoZXNlCi0JYXMgcmVsYXhhYmxlLgotCi1UdWUgTWFyICA0IDA2OjEwOjM2IDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBGaXggbGFzdCBjaGFuZ2UgZm9yIHRoZSBtYzY4MDEwLgotCi1Nb24gTWFyICAzIDA3OjQ1OjIwIDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGRlZCBlbnRyaWVzIGZvciB0aGUgdHN0IGluc25zIG9uCi0gCXRoZSBtYzY4MDAwLgotCi1UaHUgRmViIDI3IDE0OjA0OjMyIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZGVkIHN3YmVnbCBwc2V1ZG8taW5zdHJ1Y3Rpb24uCi0KLVRodSBGZWIgMjcgMTE6MzY6NDEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogU2V0IGluZm8tPmJ5dGVzX3Blcl9saW5lIHRvIDguCi0KLVdlZCBGZWIgMjYgMTU6MzQ6NDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBEZWZpbmUgcjI1IHByb3Blcmx5LgotCi1XZWQgRmViIDI2IDEzOjM4OjMwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChORVhUU0lOR0xFLCBORVhURE9VQkxFLCBORVhURVhURU5EKTogVXNlCi0JZmxvYXRmb3JtYXRfdG9fZG91YmxlIHRvIG1ha2UgcG9ydGFibGUuCi0JKHByaW50X2luc25fYXJnKTogVXNlIE5FWFRFWFRFTkQgbWFjcm8gd2hlbiBleHRyYWN0aW5nIGV4dGVuZGVkCi0JcHJlY2lzaW9uIGZsb2F0LgotCi1Nb24gRmViIDI0IDE5OjI2OjEyIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogSW5pdGlhbGl6ZSBtaXBzX29wY29kZXMgdG8gbWlwc19idWlsdGluX29wY29kZXMsCi0JYW5kIGJmZF9taXBzX251bV9vcGNvZGVzIHRvIGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXMuCi0KLU1vbiBGZWIgMjQgMTU6MTk6MDEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMsIGQxMHYtb3BjLmM6IENoYW5nZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMgdG8KLQlkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIGFuZCByZWdfbmFtZV9jbnQgdG8gZDEwdl9yZWdfbmFtZV9jbnQuCi0KLU1vbiBGZWIgMjQgMTQ6MzM6MjYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jIChMU0lfU0NBTEVEKTogUmVuYW1lZCBmcm9tIHRoaXMgLi4uCi0JKE9GRl9TTF9CUl9TQ0FMRUQpOiAuLi4gdG8gdGhpcywgYW5kIGFkZGVkIHRoZSBmbGFnCi0JVElDODBfT1BFUkFORF9CQVNFUkVMIHRvIHRoZSBmbGFncyB3b3JkLgotCSh0aWM4MF9vcGNvZGVzKTogUmVwbGFjZSBhbGwgb2NjdXJhbmNlcyBvZiBMU0lfU0NBTEVEIHdpdGgKLQlPRkZfU0xfQlJfU0NBTEVELgotCi1TYXQgRmViIDIyIDIxOjI1OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIG1hY3JvcyBmb3IgY29wMCwgY29wMSBjb3AyIGFuZCBjb3AzLgotCUNoYW5nZSBtaXBzX29wY29kZXMgZnJvbSBjb25zdCBhcnJheSB0byBhIHBvaW50ZXIsCi0JYW5kIGNoYW5nZSBiZmRfbWlwc19udW1fb3Bjb2RlcyBmcm9tIGNvbnN0IGludCB0byBpbnQsCi0Jc28gdGhhdCB3ZSBjYW4gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG1pcHMgb3Bjb2RlcyB0YWJsZQotCWR5bmFtaWNhbGx5LgotCi1TYXQgRmViIDIyIDIxOjAzOjQ3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogUmV2ZXJ0IGNoYW5nZSB0bwotCXN0b3JlIEJJVE5VTSB2YWx1ZXMgaW4gdGhlIHRhYmxlIGluIG9uZSdzIGNvbXBsZW1lbnQgZm9ybQotCXRvIG1hdGNoIGJlaGF2aW9yIHdoZW4gYXNzZW1ibGVyIGlzIGdpdmVuIGEgcmF3IG51bWVyaWMKLQl2YWx1ZSBmb3IgYSBCSVROVU0gb3BlcmFuZC4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9vcGVyYW5kX2JpdG51bSk6IERpdHRvLgotCi1GcmkgRmViIDIxIDE2OjMxOjE4IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gRkxBR19YLgotCi1XZWQgRmViIDE5IDE0OjUxOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlbmNpZXMgb24gLi4vYmZkL2JmZC5oIGFzIHJlcXVpcmVkLgotCi1UdWUgRmViIDE4IDE3OjQzOjQzIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgZDMwdiBvYmplY3QgZmlsZXMuCi0JKiBjb25maWd1cmU6IChiZmRfZDMwdl9hcmNoKSBSZWJ1aWx0LgotCSogY29uZmlndXJlLmluOiAoYmZkX2QzMHZfYXJjaCkgQWRkZWQgbmV3IGNhc2UuCi0JKiBkMzB2LWRpcy5jOiBOZXcgZmlsZS4KLQkqIGQzMHYtb3BjLmM6IE5ldyBmaWxlLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKSBBZGQgZW50cnkgZm9yIGQzMHYuCi0KLVR1ZSBGZWIgMTggMTY6MzI6MDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBBZGQgc3ltYm9saWMKLQlyZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBmbG9hdGluZyBwb2ludCBCSVROVU0gdmFsdWVzLgotCi1GcmkgRmViIDE0IDEyOjE0OjA1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogU3RvcmUgQklUTlVNIHZhbHVlcwotCWluIHRoZSB0YWJsZSBpbiBvbmUncyBjb21wbGVtZW50IGZvcm0sIGFzIHRoZXkgYXBwZWFyIGluIHRoZQotCWFjdHVhbCBpbnN0cnVjdGlvbi4KLQkodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogVXNlIG1hY3JvcyB0byBhY2Nlc3MgcHJlZGVmaW5lZAotCXN5bWJvbCBmaWVsZHMuCi0JKHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCk6IERpdHRvLgotCSh0aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogdGljODAtZGlzLmMgKHByaW50X29wZXJhbmRfYml0bnVtKTogUmVtb3ZlIGNvZGUgdGhhdCBkaWQKLQlvbmUncyBjb21wbGVtZW50IGZvciBCSVROVU0gdmFsdWVzLgotCi1UaHUgRmViIDEzIDIxOjU2OjUxIDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJlbW92ZSA4IGJpdCBjaGFyYWN0ZXJzLiAgVXBkYXRlIHRvIGxhdGVzdAotCWdjYyByZWxlYXNlLgotCi1UaHUgRmViIDEzIDIwOjQxOjIyIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZCBzd2JlZyBwc2V1ZG8taW5zdHJ1Y3Rpb24uCi0KLVRodSBGZWIgMTMgMTY6MzA6MDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jIChJTU0xNl9QQ1JFTCk6IFRoaXMgaXMgYSBzaWduZWQgb3BlcmFuZC4KLQkoSU1NMjRfUENSRUwpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxMyAxMzoyODo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IFVzZSBtZW1hZGRyIC0gMiBhcyB0aGUgYmFzZQotCWFkZHJlc3MgZm9yIGFuIGV4dGVuZGVkIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIHRoYXQgaXMgbm90IGEKLQlicmFuY2guCi0KLVdlZCBGZWIgMTIgMTI6Mjc6NDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IFNldCBieXRlc19wZXJfY2h1bmsgYW5kCi0JYnl0ZXNfcGVyX2xpbmUuCi0KLVR1ZSBGZWIgMTEgMTY6MzY6MzEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEZpeCB0eXBvICcrJyAtPiAnfCcuCi0JKHRpYzgwX29wY29kZXMpOiBTb3J0IGVudHJpZXMgc28gdGhhdCBsb25nIGltbWVkaWF0ZSBmb3JtcwotCWNvbWUgYWZ0ZXIgc2hvcnQgaW1tZWRpYXRlIGZvcm1zLCBtYWtpbmcgaXQgZWFzaWVyIGZvcgotCWFzc2VtYmxlciB0byBzZWxlY3QgdGhlIHJpZ2h0IG9uZSBmb3IgYSBnaXZlbiBvcGVyYW5kLgotCi1UdWUgRmViIDExIDE1OjI2OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFNldCBieXRlc19wZXJfY2h1bmsgYW5kCi0JZGlzcGxheV9lbmRpYW4uCi0JKHByaW50X2luc25fbWlwczE2KTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMTAgMTA6MTI6NDEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBDaGFuZ2VkIHRvIGFjY2VwdAotCWEgc3ltYm9sIGNsYXNzIHRoYXQgcmVzdHJpY3RzIHRyYW5zbGF0aW9uIHRvIGp1c3QgdGhhdAotCWNsYXNzIChnZW5lcmFsIHJlZ2lzdGVyLCBjb25kaXRpb24gY29kZSwgZXRjKS4KLQotVGh1IEZlYiAgNiAxNzozNDowOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogQWRkIFJFR18wX0UsIFJFR18yMl9FLAotCWFuZCBSRUdfREVTVF9FIGZvciByZWdpc3RlciBvcGVyYW5kcyB0aGF0IGhhdmUgdG8gYmUKLQlhbiBldmVuIG51bWJlcmVkIHJlZ2lzdGVyLiAgQWRkIFJFR19GUEEgZm9yIG9wZXJhbmRzIHRoYXQKLQlhcmUgb25lIG9mIHRoZSBmbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciByZWdpc3RlcnMuCi0JQWRkIFRJQzgwX09QRVJBTkRfTUFTSyB0byBmbGFncyBmb3IgRU5ETUFTSyBvcGVyYW5kLgotCSh0aWM4MF9vcGNvZGVzKTogQ2hhbmdlIGVudHJpZXMgdGhhdCBuZWVkIGV2ZW4gbnVtYmVyZWQKLQlyZWdpc3RlciBvcGVyYW5kcyB0byB1c2UgdGhlIG5ldyBvcGVyYW5kIHRhYmxlIGVudHJpZXMuCi0JQWRkICJvciIgZW50cmllcyB0aGF0IGFyZSBpZGVudGljYWwgdG8gIm9yLnR0IiBlbnRyaWVzLgotCi1XZWQgRmViICA1IDExOjEyOjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwczE2LW9wYy5jOiBBZGQgbmV3IGNhc2VzIG9mIGV4aXQgaW5zdHJ1Y3Rpb24gZm9yCi0JZGlzYXNzZW1ibGVyLgotCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogRGlzcGxheSBmbG9hdGluZyBwb2ludAotCXJlZ2lzdGVycyBpbiBvcGVyYW5kcyBvZiBleGl0IGluc3RydWN0aW9uLiAgUHJpbnQgYCQnIGJlZm9yZQotCXJlZ2lzdGVyIG5hbWVzIGluIG9wZXJhbmRzIG9mIGVudHJ5IGFuZCBleGl0IGluc3RydWN0aW9ucy4KLQotVGh1IEphbiAzMCAxNDowOTowMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IFRhYmxlIG9mIG5hbWUvdmFsdWUKLQlwYWlycyBmb3IgYWxsIHByZWRlZmluZWQgc3ltYm9scyByZWNvZ25pemVkIGJ5IHRoZSBhc3NlbWJsZXIuCi0JQWxzbyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsaW5nIHJvdXRpbmVzLgotCSh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIsCi0gCXByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUsIHByaW50X29wZXJhbmRfYml0bnVtKToKLQlSZW1vdmUgcHJpdmF0ZSB0YWJsZXMgYW5kIHVzZSB0aWM4MF92YWx1ZV90b19zeW1ib2wgZnVuY3Rpb24uCi0KLVRodSBKYW4gMzAgMTE6MzA6NDUgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOiBDaGFuZ2UgYWRkcmVzcyBwcmludGluZwotCXRvIGNvcnJlY3RseSBoYW5kbGUgUEMgd3JhcHBpbmcuICBGaXhlcyBQUjExNDkwLgotCi1XZWQgSmFuIDI5IDA5OjM5OjE3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGVyYW5kcyk6IE1ha2UgOCBhbmQgMTYgYml0IHBjLXJlbGF0aXZlCi0JYnJhbmNoZXMgcmVsYXhhYmxlLgotCi1UdWUgSmFuIDI4IDE1OjU3OjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBTZXQgaW5zbl9pbmZvIGluZm9ybWF0aW9uLgotCShwcmludF9taXBzMTZfaW5zbl9hcmcpOiBMaWtld2lzZS4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBCZXR0ZXIgaGFuZGxpbmcgb2YgYW4gZXh0ZW5kCi0gCW9wY29kZSBmb2xsb3dlZCBieSBhbiBpbnN0cnVjdGlvbiB3aGljaCBjYW4gbm90IGJlIGV4dGVuZGVkLgotCi1GcmkgSmFuIDI0IDEyOjA4OjIxIDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBDaGFuZ2VkIG9wZXJhbmQgc3BlY2lmaWVyIGZvciB0aGUKLSAJY29sZGZpcmUgbW92ZWIgaW5zdHJ1Y3Rpb24gdG8gbm90IGFsbG93IGFuIGFkZHJlc3MgcmVnaXN0ZXIgYXMKLSAJZGVzdGluYXRpb24uICBBbHRob3VnaCB0aGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0Ci0JdGhpcyBpcyBpbnZhbGlkLCBleHBlcmltZW50cyB1bmNvdmVyZWQgdW5leHBlY3RlZCBiZWhhdmlvci4KLQlBZGRlZCBhIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgc2l0dWF0aW9uLiAgVGhhbmtzIHRvIEFuZHJlYXMKLQlTY2h3YWIgZm9yIHBvaW50aW5nIHRoaXMgb3V0IHRvIG1lLgotCi1XZWQgSmFuIDIyIDIwOjEzOjUxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3Bjb2Rlcyk6IEV4cGFuZCBjb21tZW50IHRvIG5vdGUgdGhhdCB0aGUKLSAJZW50cmllcyBhcmUgcHJlc29ydGVkIHNvIHRoYXQgZW50cmllcyB3aXRoIHRoZSBzYW1lIG1uZW1vbmljIGFyZQotCWFkamFjZW50IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHRhYmxlLiAgU29ydCB0aGUgZW50cmllcyBmb3IgZWFjaAotCWluc3RydWN0aW9uIHNvIHRoYXQgdGhpcyBpcyB0cnVlLgotCi1Nb24gSmFuIDIwIDEyOjQ4OjU3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jOiBJbmNsdWRlIDxsaWJpYmVydHkuaD4uCi0JKHByaW50X2luc25fbTY4ayk6IFNvcnQgdGhlIG9wY29kZSB0YWJsZSBvbiB0aGUgbW9zdCBzaWduaWZpY2FudAotCW5pYmJsZSBvZiB0aGUgb3Bjb2RlLgotCi1TYXQgSmFuIDE4IDE1OjE1OjA1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAodGljODBfb3Bjb2Rlcyk6IEFkZCAid3JjciIsICJ2bXB5IiwgInZybmQiLAotCSJ2c3ViIiwgInZzdCIsICJ4bm9yIiwgYW5kICJ4b3IiIGluc3RydWN0aW9ucy4KLQkoVl9hMSk6IFJlbmFtZWQgZnJvbSBWX2EsIG1zYiBvZiBhY2N1bXVsYXRvciByZWcgbnVtYmVyLgotCShWX2EwKTogQWRkIG1hY3JvLCBsc2Igb2YgYWNjdW11bGF0b3IgcmVnIG51bWJlci4KLQotRnJpIEphbiAxNyAxODoyNDozMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBCcm9rZSBleGNlc3NpdmVseSBsb25nCi0JZnVuY3Rpb24gdXAgaW50byBzZXZlcmFsIHNtYWxsZXIgb25lcyBhbmQgYXJyYW5nZWQgZm9yCi0JdGhlIGluc3RydWN0aW9uIHByaW50aW5nIGZ1bmN0aW9uIHRvIGJlIGNhbGxhYmxlIHJlY3Vyc2l2ZWx5Ci0JdG8gcHJpbnQgdmVjdG9yIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgYm90aCBhIGxvYWQgYW5kIGEKLQltYXRoIGluc3RydWN0aW9uIHBhY2tlZCBpbnRvIGEgc2luZ2xlIG9wY29kZS4KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGNvZGVzKTogRXhwYW5kIGNvbW1lbnQgZm9yIHZsZCBvcGNvZGUKLQl0byBleHBsYWluIHdoeSBpdCBjb21lcyBhZnRlciB0aGUgb3RoZXIgdmVjdG9yIG9wY29kZXMuCi0KLUZyaSBKYW4gMTcgMTY6MTk6MTUgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBhZGQgYiwgdywgb3IgbCBzcGVjaWZpZXIgdG8gY29sZGZpcmUKLQltb3ZlIGluc25zIHRvIGhhbmRsZSBpbW1lZGlhdGUgb3BlcmFuZHMuCi0KLVRodSBKYW4gMTcgMTY6MTk6MDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IERlbGV0ZSBkdXBsaWNhdGUgZW50cnkgZm9yICJjbXBpbCIuCi0JZml4IG9wZXJhbmQgbWFzayBpbiB0aGUgIm1vdmVtbCIgZW50cmllcyBmb3IgdGhlIGNvbGRmaXJlLgotCi1UaHUgSmFuIDE2IDIwOjU0OjQwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAoVl9hLCBWX20sIFZfUywgVl9aLCBWX3AsIE9QX1YsIE1BU0tfVik6Ci0JTmV3IG1hY3JvcyBmb3IgYnVpbGRpbmcgdmVjdG9yIGluc3RydWN0aW9uIG9wY29kZXMuCi0JKHRpYzgwX29wY29kZXMpOiBSZW1vdmUgYWxsIHVzZXMgb2YgRk1UX1NJLCBGTVRfUkVHLCBhbmQKLQlGTVRfTEksIHdoaWNoIHdlcmUgdW51c2VkLiAgVGhlIGZpZWxkIGlzIG5vdyBhIGZsYWdzIGZpZWxkLgotCVJlbW92ZSBzb21lIG9wY29kZXMgdGhhdCBhcmUgcG9zc2libGUsIGJ1dCBpbGxlZ2FsLCBzdWNoCi0JYXMgbG9uZyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zIHdpdGggZG91YmxlcyBmb3IgaW1tZWRpYXRlCi0JdmFsdWVzLiAgQWRkICJ2YWRkIiBhbmQgInZsZCIgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgSmFuIDE1IDE4OjU5OjUxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBSZW9yZGVyIHNvbWUgdGFibGUgZW50cmllcyB0byBtYWtlCi0JdGhlIG9yZGVyIG1vcmUgbG9naWNhbC4gIE1vdmUgdGhlIHNoaWZ0IGFsaWFzIGluc3RydWN0aW9ucyAoInJvdGwiLAotCSJzaGwiLCAiaW5zIiwgInJvdHIiLCAiZXh0dSIsICJleHRzIiwgInNybCIsIGFuZCAic3JhIiB0byBiZQotIAlpbnRlcnNwZXJzZWQgd2l0aCB0aGUgcmVndWxhciBzci54IGFuZCBzbC54IGluc3RydWN0aW9ucy4gIEFkZAotCWFuZCB0ZXN0IG5ldyBpbnN0cnVjdGlvbiBvcGNvZGVzIGZvciAic2wiLCAic2xpIiwgInNyIiwgInNyaSIsICJzdCIsCi0gCSJzdWIiLCAic3VidSIsICJzd2NyIiwgYW5kICJ0cmFwIi4KLQotVHVlIEphbiAxNCAxOTo0Mjo1MCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKE9GRl9TU19QQyk6IFJlbmFtZWQgZnJvbSBPRkZfU1MuCi0JKE9GRl9TTF9QQyk6IFJlbmFtZWQgZnJvbSBPRkZfU0wuCi0JKE9GRl9TU19CUik6IE5ldyBvcGVyYW5kIHR5cGUgZm9yIGJhc2UgcmVsYXRpdmUgb3BlcmFuZC4KLQkoT0ZGX1NMX0JSKTogTmV3IG9wZXJhbmQgdHlwZSBmb3IgYmFzZSByZWxhdGl2ZSBvcGVyYW5kLgotCShSRUdfQkFTRSk6IE5ldyBvcGVyYW5kIHR5cGUgZm9yIGJhc2UgcmVnaXN0ZXIgb3BlcmFuZC4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBhbmQgdGVzdCAiZm1weSIsICJmcm5kbSIsICJmcm5kbiIsICJmcm5kcCIsCi0JImZybmR6IiwgImZzcXJ0IiwgImZzdWIiLCAiaWxsb3AwIiwgImlsbG9wRiIsICJpbnMiLCAianNyIiwKLQkibGQiLCAibGQudSIsICJsbW8iLCAib3IiLCAicmRjciIsICJybW8iLCAicm90bCIsIGFuZCAicm90ciIKLQlpbnN0cnVjdGlvbnMuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFByaW50IG9wY29kZSBuYW1lIHdpdGggZml4ZWQgd2lkdGgKLSAJMTAgY2hhciBmaWVsZCwgcGFkZGVkIHdpdGggc3BhY2VzIG9uIHJocywgcmF0aGVyIHRoYW4gYSBzdHJpbmcKLSAJZm9sbG93ZWQgYnkgYSB0YWIuICBVc2UgcmVuYW1lZCBUSUM4MF9PUEVSQU5EX1BDUkVMIGZsYWcgYml0IHJhdGhlcgotIAl0aGFuIG9sZCBUSUM4MF9PUEVSQU5EX1JFTEFUSVZFLiAgQWRkIHN1cHBvcnQgZm9yIG5ldwotCVRJQzgwX09QRVJBTkRfQkFTRVJFTCBmbGFnIGJpdC4KLQotTW9uIEphbiAxMyAxNTo1ODo1NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBQcmludCBmbG9hdGluZyBwb2ludCBvcGVyYW5kcwotCWFzIGZsb2F0cy4KLQkqIHRpYzgwLW9wYy5jIChTUEZJKTogQWRkIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQKLQlpbW1lZGlhdGUgb3BlcmFuZCB0eXBlLgotCShST1RBVEUpOiBBZGQgcm90YXRlIG9wZXJhbmQgdHlwZSBmb3Igc2hpZnRzLgotCShFTkRNQVNLKTogQWRkIGZvciBzaGlmdHMuCi0JKG4pOiBNYWNybyBmb3IgdGhlICduJyBiaXQuCi0JKGkpOiBNYWNybyBmb3IgdGhlICdpJyBiaXQuCi0JKFBEKTogTWFjcm8gZm9yIHRoZSAnUEQnIGZpZWxkLgotCShQMik6IE1hY3JvIGZvciB0aGUgJ1AyJyBmaWVsZC4KLQkoUDEpOiBNYWNybyBmb3IgdGhlICdQMScgZmllbGQuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgZW50cmllcyBmb3IgImV4dHMiLCAiZXh0dSIsICJmYWRkIiwKLQkiZmNtcCIsIGFuZCAiZmRpdiIuCi0KLU1vbiBKYW4gIDYgMTU6MDY6NTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IE1hc2sgb2ZmIHVud2FudGVkIGJpdHMgYWZ0ZXIKLQlhZGRpbmcgaW4gY3VycmVudCBhZGRyZXNzIGZvciBwYy1yZWxhdGl2ZSBvcGVyYW5kcy4KLQotTW9uIEphbiAgNiAxMDo1NjoyNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKFJfU0NBTEVEKTogQWRkIG1hY3JvIHRvIHRlc3QgZm9yICI6cyIgbW9kaWZpZXIgYml0LgotCShwcmludF9pbnNuX3RpYzgwKTogSWYgUl9TQ0FMRUQgdGhlbiBwcmludCAiOnMiIG1vZGlmaWVyIGZvciBvcGVyYW5kLgotCSogdGljODAtb3BjLmMgKFJFRzAsIFJFRzIyLCBSRUcyNywgU1NPRkYsIExTT0ZGKTogTmFtZXMKLQljaGFuZ2VkIHRvIFJFR18wLCBSRUdfMjIsIFJFR19ERVNULCBPRkZfU1MsIE9GRl9TTCByZXNwZWN0aXZlbHkuCi0JKFNJQ1IsIExJQ1IsIFJFR01fU0ksIFJFR01fTEkpOiBOYW1lcyBjaGFuZ2VkIHRvIENSX1NJLCBDUl9MSSwKLQlSRUdfQkFTRV9NX1NJLCBSRUdfQkFTRV9NX0xJIHJlc3BlY3RpdmVseS4KLQkoUkVHX1NDQUxFRCwgTFNJX1NDQUxFRCk6IE5ldyBvcGVyYW5kIHR5cGVzLgotCShFKTogTmV3IG1hY3JvIGZvciAnRScgYml0IGF0IGJpdCAyNy4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBhbmQgdGVzdCBkbGQsIGRsZC51LCBkc3QsIGVzdG9wLCBhbmQgZXRyYXAKLQlvcGNvZGVzLCBpbmNsdWRpbmcgdGhlIHZhcmlvdXMgc2l6ZSBmbGF2b3JzIChiLGgsdyxkKSBmb3IKLQl0aGUgZGlyZWN0IGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucy4KLQotU3VuIEphbiAgNSAxMjoxODoxNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKE1fU0ksIE1fTEkpOiBBZGQgbWFjcm9zIHRvIHRlc3QgZm9yICI6bSIgbW9kaWZpZXIgYml0Ci0gCWluIGFuIGluc3RydWN0aW9uLgotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBDaGFuZ2UgY29tbWEgYW5kIHBhcmVuIGhhbmRsaW5nLgotICAJVXNlIE1fU0kgYW5kIE1fTEkgbWFjcm9zIHRvIGNoZWNrIGZvciAiOm0iIG1vZGlmaWVyIGZvciBHUFIgb3BlcmFuZHMuCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBBZGQgUkVHTV9TSSBhbmQgUkVHTV9MSSBvcGVyYW5kcy4KLQkoRiwgTV9SRUcsIE1fTEksIE1fU0ksIFNaX1JFRywgU1pfTEksIFNaX1NJLCBELCBTKTogTmV3CWJpdC10d2lkZGxlcnMuCi0JKE1BU0tfTElfTSwgTUFTS19TSV9NLCBNQVNLX1JFR19NKTogUmVtb3ZlIGFuZCByZXBsYWNlIGluIG9wY29kZQotCW1hc2tzIHdpdGggIk1BU0tfKiAmIH5NXyoiIHRvIGdldCB0aGUgTSBiaXQgcmVzZXQuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgYnNyLCBic3IuYSwgY21uZCwgY21wLCBkY2FjaGVjLCBhbmQgZGNhY2hlZi4KLQotU2F0IEphbiAgNCAxOTowNTowNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBQcmludCBUSUM4MF9PUEVSQU5EX1JFTEFUSVZFCi0JY29ycmVjdGx5LiAgQWRkIHN1cHBvcnQgZm9yIHByaW50aW5nIFRJQzgwX09QRVJBTkRfQklUTlVNIGFuZAotCVRJQzgwX09QRVJBTkRfQ0MsIGFuZCBUSUM4MF9PUEVSQU5EX0NSIG9wZXJhbmRzIGluIHN5bWJvbGljCi0JZm9ybS4KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEFkZCBTU09GRiwgTFNPRkYsIEJJVE5VTSwKLQlDQywgU0lDUiwgYW5kIExJQ1IgdGFibGUgZW50cmllcy4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBhbmQgdGVzdCAibm9wIiwgImJyIiwgImJibyIsICJiYnoiLAotCSJiY25kIiwgYW5kICJicmNyIiBvcGNvZGVzLgotCi1GcmkgSmFuICAzIDE4OjMyOjExIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBNYWtlIGNvbW1lbnQgbWF0Y2ggdGhlCi0JYWN0dWFsIGZpZWxkcyAobm8gc2hpZnQgZmllbGQpLgotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBEb2N1bWVudCB3aHkgdGhpcyBjYW5ub3QgYmUgImNvbnN0Ii4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogUmVwbGFjZSBhYm9ydCBzdHViIHdpdGggYQotCXBhcnRpYWwgaW1wbGVtZW50YXRpb24sIHdvcmsgaW4gcHJvZ3Jlc3MuCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBCZWdpbiBjb25zdHJ1Y3Rpb24gb3BlcmFuZHMgdGFibGUuCi0JKHRpYzgwX29wY29kZXMpOiBDb250aW51ZSBwb3B1bGF0aW5nIG9wY29kZXMgdGFibGUgYW5kIHN0YXJ0Ci0JZmlsbGluZyBpbiB0aGUgb3BlcmFuZCBpbmRpY2VzLgotCSh0aWM4MF9udW1fb3Bjb2Rlcyk6IEFkZCB0aGlzLgotCi1GcmkgSmFuICAzIDEyOjEzOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQWRkICNCIGNhc2UgZm9yIG1vdmVxLgotCi1UaHUgSmFuICAyIDEyOjE0OjI5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBNYWtlIHN1cmUgYWxsIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQKLQliZWZvcmUgdGhleSBhcmUgdXNlZC4KLQotVHVlIERlYyAzMSAxMjoyMDozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IFB1dCBjdXJseS1icmFjZXMgYXJvdW5kIG9wZXJhbmRzCi0JZm9yICJicmVha3BvaW50IiBpbnN0cnVjdGlvbi4KLQotVHVlIERlYyAzMSAxNTozODoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0JKGRlcCk6IFVzZSBBTExfQ0ZMQUdTIHJhdGhlciB0aGFuIENGTEFHUy4KLQotVHVlIERlYyAzMSAxNTowOToxNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKEQ4X3s2LDd9KTogU2V0IFY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZCi0JZmxhZy4KLQotTW9uIERlYyAzMCAxNzowMjoxMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG02OGstb3BjLm8sIGFscGhhLW9wYy5vKTogUmVtb3ZlIGRpcy1hc20uaCBkZXBlbmRlbmN5LgotCSh0aWM4MC1kaXMubywgdGljODAtb3BjLm8pOiBBZGQgcnVsZXMgcGVyIGNvbW1lbnQgaW4gTWFrZWZpbGUuaW4uCi0KLU1vbiBEZWMgMzAgMTE6Mzg6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzMTYtb3BjLmM6IEFkZCAiYWJzIi4KLQotU3VuIERlYyAyOSAxMDo1ODoyMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCB0aWM4MC1kaXMubyBhbmQgdGljODAtb3BjLm8uCi0JKiBkaXNhc3NlbWJsZS5jIChBUkNIX3RpYzgwKTogRGVmaW5lIGlmIEFSQ0hfYWxsIGlzIGRlZmluZWQuCi0JKGRpc2Fzc2VtYmxlcik6IEFkZCBiZmRfYXJjaF90aWM4MCBzdXBwb3J0IHRvIHNldCBkaXNhc3NlbWJsZQotIAl0byBwcmludF9pbnNuX3RpYzgwLgotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBBZGQgc3R1Yi4KLQotRnJpIERlYyAyNyAyMjozMDo1NyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhcmNoIGluICRzZWxhcmNocyk6IEFkZCBiZmRfdGljODBfYXJjaCBlbnRyeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCSogdGljODAtZGlzLmM6IEFkZCBmaWxlLgotCSogdGljODAtb3BjLmM6IEFkZCBmaWxlLgotCi1GcmkgRGVjIDIwIDE0OjMwOjE5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiAgQWRkIGNyWzAtMTVdLCBkcGMsIGRwc3csIGxpbmsuCi0KLU1vbiBEZWMgMTYgMTM6MDA6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wZXJhbmRzKTogQWRkIFNJTU0xNk4uCi0JKG1uMTAyMDBfb3Bjb2Rlcyk6IFVzZSBpdCBmb3Igc29tZSBsb2dpY2FscyBhbmQgYnRzdCBpbnNucy4KLQlBZGQgImJyZWFrIiBhbmQgInRyYXAiIGluc3RydWN0aW9ucy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQWRkICJicmVhayIgaW5zdHJ1Y3Rpb24uCi0KLQkqIG1uMTAyMDAtb3BjLmM6IEFkZCBwc2V1ZG8tb3BzIGZvciAibW92IChhbiksYW0iIGFuZCAibW92IGFuLChhbSkiLgotCi1TYXQgRGVjIDE0IDIyOjM2OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogVGhlIGJhc2UgYWRkcmVzcyBvZiBhIFBDCi0JcmVsYXRpdmUgbG9hZCBvciBhZGQgbm93IGRlcGVuZHMgdXBvbiB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBpcwotCWluIGEgZGVsYXkgc2xvdC4KLQotV2VkIERlYyAxMSAwOToyMzo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtZGlzLmM6IEZpbmlzaCB3cml0aW5nIGRpc2Fzc2VtYmxlci4KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3Bjb2Rlcyk6IEZpeCBtYXNrIGZvciAibW92IGltbTgsZG4iLgotCUZpeCBtYXNrIGZvciAiam1wIChhbikiLgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSwgcHJpbnRfaW5zbl9tbjEwMzAwKTogQ29ycmVudGx5Ci0JaGFuZGxlIGVuZGlhbm5lc3MgaXNzdWVzIGZvciBtbjEwMzAwLgotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wY29kZXMpOiBGaXggb3BlcmFuZHMgZm9yICJtb3ZiIGRtLChhbikiLgotCi1UdWUgRGVjIDEwIDEyOjA4OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGNvZGVzKTogIm1vdiBpbW04LGQwIiBpcyBhIGZvcm1hdCAyCi0JaW5zdHJ1Y3Rpb24uICBGaXggb3Bjb2RlIGZpZWxkIGZvciAibW92YiAoaW1tMjQpLGRuIi4KLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGVyYW5kcyk6IEZpeCBpbnNlcnRpb24gcG9zaXRpb24KLQlmb3IgREkgb3BlcmFuZC4KLQotTW9uIERlYyAgOSAxNjo0Mjo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmM6IENyZWF0ZSBtbjEwMjAwIG9wY29kZSB0YWJsZS4KLQkqIG1uMTAyMDAtZGlzLmM6IEZsZXNoIG91dCBtbjEwMjAwIGRpc2Fzc2VtYmxlci4gIE5vdCByZWFkeSwKLQlidXQgbW92aW5nIGFsb25nIG5pY2VseS4KLQotU3VuIERlYyAgOCAwNDoyODozMSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiAgQWRkIG1pcHMxNi1vcGMuby4KLQotRnJpIERlYyAgNiAxNjo0Nzo0MCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcmhpbm8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogUmV2ZXJ0IGNoYW5nZSB0byB1c2UgPCBhbmQgPgotCXNwZWNpZmllcnMgZm9yIGZtb3ZlbSogaW5zdHJ1Y3Rpb25zLgotCi1GcmkgRGVjICA2IDE0OjQ4OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBSZW1vdmUgJyQnIHJlZ2lzdGVyIHByZWZpeGluZy4KLQotRnJpIERlYyAgNiAxNzozNDozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMxNi1vcGMuYzogQ2hhbmdlIG9wY29kZSBmb3IgZW50cnkvZXhpdCB0byBhdm9pZCBjb25mbGljdGluZwotCXdpdGggZHNybC4KLQotRnJpIERlYyAgNiAxNDo0ODowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmM6IEFkZCBzb21lIGNvbW1lbnRzIGV4cGxhaW5pbmcgdGhlIHZhcmlvdXMKLSAJb3BlcmFuZHMgYW5kIHN1Y2guCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogRml4IG1pbm9yIGdjYyAtV2FsbCB3YXJuaW5ncy4KLQotVGh1IERlYyAgNSAxMjowOTo0OCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyA8IGFuZCA+IG9wZXJhbmQKLQlzcGVjaWZpZXJzLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBTaW1wbGlmeSB0YWJsZSBieSB1c2luZyA8IGFuZCA+Ci0Jb3BlcmFuZCBzcGVjaWZpZXJzIGluIGZtb3ZtKiBpbnN0cnVjdGlvbnMuCi0KLVdlZCBEZWMgIDQgMTQ6NTI6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKGluc2VydF9saSk6IEdpdmUgYW4gZXJyb3IgaWYgdGhlIG9mZnNldCBoYXMgdGhlIHR3bwotCWxlYXN0IHNpZ25pZmljYW50IGJpdHMgc2V0LgotCi1XZWQgTm92IDI3IDEzOjA5OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBTZXBhcmF0ZSB0aGUgaW5zdHJ1Y3Rpb24gZnJvbQotCXRoZSBhcmd1bWVudHMgd2l0aCBhIHRhYiwgbm90IGEgc3BhY2UuCi0KLVR1ZSBOb3YgMjYgMTM6MjQ6MTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc2VtYmxlKTogRmluaXNoIGNvbnZlcnNpb24gdG8gJyQnIGFzCi0JcmVnaXN0ZXIgcHJlZml4LgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggbWFzayBmaWVsZCBmb3IKLQltb3YgYW0sKGltbTMyLHNwKS4KLQotVHVlIE5vdiAyNiAxMDo1MzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLQlBZGQgc3VwcG9ydCBmb3IgbWlwczE2ICgxNiBiaXQgTUlQUyBpbXBsZW1lbnRhdGlvbik6Ci0JKiBtaXBzMTYtb3BjLmM6IE5ldyBmaWxlLgotCSogbWlwcy1kaXMuYzogSW5jbHVkZSAiZWxmLWJmZC5oIiBhbmQgImVsZi9taXBzLmgiLgotCShtaXBzMTZfcmVnX25hbWVzKTogTmV3IHN0YXRpYyBhcnJheS4KLQkocHJpbnRfaW5zbl9iaWdfbWlwcyk6IFVzZSBwcmludF9pbnNuX21pcHMxNiBpbiAxNiBiaXQgbW9kZSBvcgotCWFmdGVyIHNlZWluZyBhIDE2IGJpdCBzeW1ib2wuCi0JKHByaW50X2luc25fbGl0dGxlX21pcHMpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9taXBzMTYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9taXBzMTZfaW5zbl9hcmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogbWlwcy1vcGMuYzogQWRkIGphbHggaW5zdHJ1Y3Rpb24uCi0JKiBNYWtlZmlsZS5pbiAobWlwczE2LW9wYy5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG1pcHMxNi1vcGMubyBmb3IgYmZkX21pcHNfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIE5vdiAyNSAxNjoxNToxNyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogU2ltcGxpZnkgdGFibGUgYnkgdXNpbmcgPCBhbmQgPgotIAlvcGVyYW5kIHNwZWNpZmllcnMgaW4gKnNhdmUsICpyZXN0b3JlIGFuZCBtb3ZlbSogaW5zdHJ1Y3Rpb25zLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBGaXggbW92ZSBhbmQgbW92ZW0gaW5zdHJ1Y3Rpb25zIGZvcgotIAl0aGUgY29sZGZpcmUuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFRoZSBjb2xkZmlyZSAobWNmNTIwMCkgY2FuIG9ubHkgdXNlCi0gCXJlZ2lzdGVyIG9wZXJhbmRzIGZvciBpbW1lZGlhdGUgYXJpdGhtZXRpYywgbm90LCBuZWcsIG5lZ3gsIGFuZAotCXNldCBhY2NvcmRpbmcgdG8gY29uZGl0aW9uIGluc3RydWN0aW9ucy4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQ29uc2lzdGFudGx5IFVzZSAicyIgYXMgdGhlIHN0b3JhZ2UKLSAJc3BlY2lmaWVyIG9mIHRoZSBlZmZlY3RpdmUtYWRkcmVzcyBvcGVyYW5kIGluIGltbWVkaWF0ZSBmb3JtcyBvZgotIAlhcml0aG1ldGljIGluc3RydWN0aW9ucy4gIFRoZSBzcGVjaWZpZXIgZm9yIHRoZSBpbW1lZGlhdGUgb3BlcmFuZAotIAlub3RlcyBob3cgYW5kIHdoZXJlIHRoZSBjb25zdGFudCB3aWxsIGJlIHN0b3JlZC4KLQotTW9uIE5vdiAyNSAxMToxNzowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IFJlbW92ZSByZWR1bmRhbnQgImxjYyIKLQlvcGNvZGUuCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogVXNlICckJyBpbnN0ZWFkIG9mICclJyBmb3IKLQlyZWdpc3RlciBwcmVmaXguCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUHJlZml4IHJlZ2lzdGVycyB3aXRoICclJy4KLQotV2VkIE5vdiAyMCAxMDozNzoxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogSGFuZGxlIHJlZ2lzdGVyIGxpc3RzLgotCi0JKiBtbjEwMzAwLW9wYy5jOiBGaXggaGFuZGxpbmcgb2YgcmVnaXN0ZXIgbGlzdCBvcGVyYW5kIGZvcgotCSJjYWxsIiwgInJldCIsIGFuZCAicmV0cyIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFByaW50IFBDLXJlbGF0aXZlIGFuZCBtZW1vcnkKLQlhZGRyZXNzZXMgc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLgotCSogbW4xMDMwMC1vcGMuYzogRGlzdGluZ3Vpc2ggYmV0d2VlbiBhYnNvbHV0ZSBtZW1vcnkgYWRkcmVzc2VzLAotCXBjLXJlbGF0aXZlIG9mZnNldHMgJiByYW5kb20gaW1tZWRpYXRlcy4KLQotCSogbW4xMDMwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMzAwKTogRml4IGZldGNoIG9mIGxhc3QgYnl0ZQotCWluIDcgYnl0ZSBpbnNucy4KLQkoZGlzYXNzZW1ibGUpOiBIYW5kbGUgU1BMSVQgYW5kIEVYVEVOREVEIG9wZXJhbmRzLgotCi1UdWUgTm92IDE5IDEzOjMzOjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYzogUm91Z2ggY3V0IGF0IHByaW50aW5nIHNvbWUgb3BlcmFuZHMuCi0KLQkqIG1uMTAzMDAtZGlzLmM6IFN0YXJ0IHdvcmtpbmcgb24gZGlzYXNzZW1ibGVyIHN1cHBvcnQuCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggbWFza3Mgb24gc2V2ZXJhbCBpbnNucy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEFkZCAiUkVHUyIgZm9yIGEgcmVnaXN0ZXIKLQlsaXN0LgotCShtbjEwMzAwX29wY29kZXMpOiBVc2UgUkVHUyBmb3IgcmVnaXN0ZXIgbGlzdCBpbiAibW92bSIgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gTm92IDE4IDE1OjIwOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQWRkMyBzZXRzIHRoZSBjYXJyeS4KLQotRnJpIE5vdiAxNSAxMzo0MzoxOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IERlbWFuZCBwYXJlbnMgYXJvdW5kCi0JcmVnaXN0ZXIgYXJndW1lbnQgaXMgY2FsbHMgYW5kIGptcCBpbnN0cnVjdGlvbnMuCi0KLVRodSBOb3YgIDcgMDA6MjY6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBVc2UgRE4wMSBmb3IgcHV0eCBhbmQKLQlnZXR4IG9wZXJhbmQuICBGaXggb3Bjb2RlIGZvciBtdWxxdSBpbW0sZG4uCi0KLVdlZCBOb3YgIDYgMTM6NDI6MzIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogSGlqYWNrICJiaXRzIiBmaWVsZAotCWluIE1OMTAzMDBfT1BFUkFORF9TUExJVCBvcGVyYW5kcyBmb3IgaG93IG1hbnkgYml0cwotCWFwcGVhciBpbiB0aGUgYmFzaWMgaW5zbiB3b3JkLiAgQWRkIElNTTMyX0hJR0gyNCwKLQlJTU0zMl9ISUdIMjRfTE9XU0hJRlQ4LCBJTU04RV9TSElGVDguCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBuZXcgb3BlcmFuZHMgYXMgbmVlZGVkLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkIElNTTMyX0xPV1NISUZUOAotCWZvciBic2V0LCBiY2xyLCBidHN0IGluc3RydWN0aW9ucy4KLQkobW4xMDMwMF9vcGNvZGVzKTogVXNlIG5ldyBJTU0zMl9MT1dTSElGVDggYXMgbmVlZGVkLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogUmVtb3ZlIG1hbnkgcmVkdW5kYW50Ci0Jb3BlcmFuZHMuICBVcGRhdGUgb3Bjb2RlIHRhYmxlIGFzIGFwcHJvcHJpYXRlLgotCShJTU0zMik6IEFkZCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgZmxhZy4KLQkobW4xMDMwMF9vcGNvZGVzKTogRml4IHNpbmdsZSBiaXQgZXJyb3IgaW4gbW92IGltbTMyLGRuIGluc24uCi0KLVR1ZSBOb3YgIDUgMTM6MjY6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkIEROMiwgRE0yLCBBTjIsIEFNMgotCW9wZXJhbmRzIChmb3IgaW5kZXhlZCBsb2FkL3N0b3JlcykuICBGaXggYml0cG9zIGZvciBESQotCW9wZXJhbmQuICBBZGQgU044Tl9TSElGVDgsIElNTThfU0hJRlQ4LCBhbmQgRDE2X1NISUZUIGZvciB0aGUKLQlmZXcgaW5zdHJ1Y3Rpb25zIHRoYXQgaW5zZXJ0IGltbWVkaWF0ZXMvZGlzcGxhY2VtZW50cyBpbiB0aGUKLQltaWRkbGUgb2YgdGhlIGluc3RydWN0aW9uLiAgQWRkIElNTThFIGZvciA4IGJpdCBpbW1lZGlhdGUgaW4KLQl0aGUgZXh0ZW5kZWQgcGFydCBvZiBhbiBpbnN0cnVjdGlvbi4KLQkobW4xMDMwMF9vcGVyYW5kcyk6IFVzZSBuZXcgb3Bjb2RlcyBhcyBhcHByb3ByaWF0ZS4KLQotVHVlIE5vdiAgNSAxMDozMDo1MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogRGVjbGFyZSB0aGUgdHJhcCBpbnN0cnVjdGlvbgotIAlzZXF1ZW50aWFsIHNvIHRoZSBhc3NlbWJsZXIgbmV2ZXIgcGFyYWxsZWxpemVzIGl0IHdpdGgKLQlvdGhlciBpbnN0cnVjdGlvbnMuCi0KLU1vbiBOb3YgIDQgMTI6NTA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkIEROMDEgYW5kIEFOMDEgZm9yCi0JYSBkYXRhL2FkZHJlc3MgcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHJlZ2lzdGVyIGZpZWxkIDAKLQlhbmQgcmVnaXN0ZXIgZmllbGQgMS4KLQkobW4xMDMwMF9vcGNvZGVzKTogVXNlIEROMDEgYW5kIEFOMDEgZm9yIG1vdi9jbXAgaW1tOCxETi9BTgotCi1GcmkgTm92ICAxIDEwOjI5OjExIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFVzZSBuZXcgTk9QQUwgbWFzayBmb3IKLQlzdGFuZGFyZCBkaXNhc3NlbWJseS4KLQotCSogYWxwaGEtb3BjLmMgKGFscGhhX29wZXJhbmRzKTogUmVhcnJhbmdlIGZsYWdzIHNsb3QuCi0JKGFscGhhX29wY29kZXMpOiBBZGQgbmV3IEJXWCwgQ0lYLCBhbmQgTUFYIGluc3RydWN0aW9ucy4KLQlSZWNhdGVnb3JpemUgUEFMY29kZSBpbnN0cnVjdGlvbnMuCi0KLVdlZCBPY3QgMzAgMTY6NDY6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgcmVsYXhpbmcgImpiciIuCi0KLVR1ZSBPY3QgMjkgMTY6MzA6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogRG9uJ3QgcHJpbnQgYSB0cmFpbGluZyB0YWIgaWYKLQl0aGVyZSBhcmUgbm8gb3BlcmFuZCB0eXBlcy4KLQotVHVlIE9jdCAyOSAxMjoyMjoyMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKEQ5X1JFTEFYKTogUmVuYW1lZCBmcm9tIEQ5LCBhbGwgcmVmZXJlbmNlcwotCWNoYW5nZWQuCi0JKHY4NTBfb3BlcmFuZHMpOiBNYWtlIHN1cmUgRDIyIGltbWVkaWF0ZWx5IGZvbGxvd3MgRDlfUkVMQVguCi0KLUZyaSBPY3QgMjUgMTI6MTI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX3g4Nik6IFNldCBpbmZvLT5ieXRlc19wZXJfbGluZSB0byA1LgotCi1UaHUgT2N0IDI0IDE3OjUzOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q4XzYpOiBGaXggb3BlcmFuZCBpbnNlcnRpb24gZm9yIHNsZC53Ci0JYW5kIHNzdC53IGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQWRkICJqQ0MiIGluc3RydWN0aW9ucyAoYWxpYXNlcyBmb3IKLQkiYkNDImluc3RydWN0aW9ucykuCi0KLVRodSBPY3QgMjQgMTc6MjE6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogVXNlIGEgdGFiIGJldHdlZW4gdGhlIGluc3RydWN0aW9uCi0JYW5kIHRoZSBhcmd1bWVudHMuCi0KLVR1ZSBPY3QgMjIgMjM6MzI6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKFBQQ1BXUjIpOiBEZWZpbmUuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IFVzZSBQUENQV1IyIGZvciBmc3FydCwgcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcKLQlpdC4KLQotRnJpIE9jdCAxMSAxNjowMzo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCB0eXBvIGluIG9wY29kZQotCWZpZWxkIGZvciBtb3ZodSBpbnN0cnVjdGlvbi4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBGb3IgVjg1MF9PUEVSQU5EX1NJR05FRCBvcGVyYW5kcywKLQljYXN0IHZhbHVlIHRvICJsb25nIiBub3QgInNpZ25lZCBsb25nIiB0byBrZWVwIGhwdXgxMAotCWNvbXBpbGVyIHF1aWV0LgotCi1UaHUgT2N0IDEwIDEwOjI1OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IHR5cG8gaW4gb3Bjb2RlIGZpZWxkCi0JZm9yIG1vdiAoYWJzMTYpLEROLgotCi0JKiBtbjEwMzAwLW9wYy5jIChGTVQqKTogUmVtb3ZlIGRlZmluaXRpb25zLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggZGVzdGluYXRpb24gcmVnaXN0ZXIKLQlmb3Igc2hpZnQtYnktcmVnaXN0ZXIgb3Bjb2Rlcy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEJyZWFrIEROLCBETSwgQU4sIEFNCi0JaW50byBbQURdW01OXVswMV0gZm9yIGVuY29kaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmVnaXN0ZXIKLQlpbiB0aGUgb3Bjb2RlLgotCi1XZWQgT2N0ICA5IDExOjE5OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQWRkICJleHRlbmRlZCIgaW5zdHJ1Y3Rpb25zLAotCSJwdXR4IiwgImdldHgiLCAibXVscSIsICJtdWxxdSIsICJzYXQxNiIsICJzYXQyNCIsICJic2NoIi4KLQotVHVlIE9jdCAgOCAxMTo1NTozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBSZW1vdmUgIlJFR1MiIG9wZXJhbmQuCi0JRml4IHZhcmlvdXMgdHlwb3MuICBBZGQgIlBBUkVOIiBvcGVyYW5kLgotCShNRU0sIE1FTTIpOiBEZWZpbmUuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFN1cnJvdW5kIGFsbCBtZW1vcnkgYWRkcmVzc2VzIHdpdGggIlBBUkVOIgotCW9wZXJhbmRzLiAgRml4IHNldmVyYWwgdHlwb3MuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCB0eXBvcyBpbiB5ZXN0ZXJkYXkncwotCWNoYW5nZXMuCi0KLU1vbiBPY3QgIDcgMTY6NDg6NDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChGTVRfWFgpOiBSZW51bWJlciBzdGFydGluZyBhdCBvbmUuCi0JKG1uMTAzMDBfb3BlcmFuZHMpOiBSb3VnaCBjdXQuICBFbm91Z2ggdG8gcGFyc2UgIm1vdiIgaW5zdHJ1Y3Rpb25zCi0JYXQgdGhpcyB0aW1lLgotCShtbjEwMzAwX29wY29kZXMpOiBCcmVhayBvcGNvZGUgZm9ybWF0IG91dCBpbnRvIGl0cyBvd24gZmllbGQuCi0JVXBkYXRlIG1hbnkgb3BlcmFuZCBmaWVsZHMgdG8gZGVhbCB3aXRoIHNpZ25lZCB2cyB1bnNpZ25lZAotCWlzc3Vlcy4gIEZpeCBvbmUgb3IgdHdvIHR5cG9zIGluIHRoZSAibW92IiBpbnN0cnVjdGlvbgotCW9wY29kZSwgbWFzayBhbmQvb3Igb3BlcmFuZCBmaWVsZHMuCi0KLU1vbiBPY3QgIDcgMTE6Mzk6NDkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKHBsdXNoYSk6IFByZWZlciBlbmNvZGluZyBmb3IgbTY4MDQwdXAsIGluIGNhc2UKLQltNjg4NTEgd2Fzbid0IHJlc2V0LgotCi1UaHUgT2N0ICAzIDE3OjE3OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQWRkIG9wY29kZSAmIG1hc2tzIGZvcgotCWFsbCBvcGNvZGVzLiAgVmVyeSByb3VnaCBjdXQgYXQgb3BlcmFuZHMgZm9yIGFsbCBvcGNvZGVzLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBTdGFydCBmbGVzaGluZyBvdXQgdGhlCi0Jb3Bjb2RlIHRhYmxlLgotCi1UaHUgT2N0ICAzIDEwOjA2OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYywgbW4xMDMwMC1vcGMuYzogTmV3IGZpbGVzLgotCSogbW4xMDIwMC1kaXMuYywgbW4xMDMwMC1kaXMuYzogTmV3IGZpbGVzLgotCSogbW4xMHgwMC1vcGMuYywgbW4xMHgwMC1kaXMuYzogRGVsZXRlZC4KLQkqIGRpc2Fzc2VtYmxlLmM6IEJyZWFrIG1uMTB4MDAgc3VwcG9ydCBpbnRvIDEwMjAwIGFuZCAxMDMwMAotCXN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1UaHUgT2N0ICAzIDE1OjU5OjEyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChNT1NUTFlDTEVBTik6IE1vdmUgY29uZmlnLmxvZyB0byBkaXN0Y2xlYW4uCi0KLVdlZCBPY3QgIDIgMjM6Mjg6NDIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEweDAwLW9wYy5jLCBtbjEweDAwLWRpcy5jOiBOZXcgZmlsZXMgZm9yIE1hdHN1c2hpdGEKLQlNTjEweDAwIHByb2Nlc3NvcnMuCi0JKiBkaXNhc3NlbWJsZSAoQVJDSF9tbjEweDAwKTogRGVmaW5lLgotCShkaXNhc3NlbWJsZXIpOiBIYW5kbGUgYmZkX2FyY2hfbW4xMHgwMC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGJmZF9tbjEweDAwX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVR1ZSBPY3QgIDEgMTA6NDk6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChvcF9ydG4pOiBDaGFuZ2UgdG8gYmUgYSBwb2ludGVyLiAgQWRqdXN0IHVzZXMKLQlhY2NvcmRpbmdseS4gIERvbid0IGRlY2xhcmUgZnVuY3Rpb25zIHVzaW5nIG9wX3J0bi4KLQotRnJpIFNlcCAyNyAxODoyODo1OSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6ICBBZGQgbWVtYWRkciBhcmd1bWVudC4gIFJlLWFycmFuZ2UKLQlwYXJhbXMgdG8gYmUgbW9yZSBzdGFuZGFyZC4KLQkqIChkaXNhc3NlbWJsZSk6ICBQcmludCBhYnNvbHV0ZSBhZGRyZXNzZXMgYW5kIHN5bWJvbGljIG5hbWVzIGZvcgotCWJyYW5jaCBhbmQganVtcCB0YXJnZXRzLgotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kKTogIEFkZCBkaXNwbGFjZW1lbnQgZmxhZyB0byA5IGFuZCAyMgotCWJpdCBvcGVyYW5kcy4KLQkqICh2ODUwX29wY29kZXMpOiAgQWRkIGJyZWFrcG9pbnQgaW5zbi4KLQotTW9uIFNlcCAyMyAxMjozMjoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IE1vdmUgdGhlIGZtb3ZlbXggZGF0YSByZWdpc3RlciBjYXNlcyBiZWZvcmUgdGhlCi0gCW90aGVyIGNhc2VzLCBzbyB0aGF0IHRoZXkgZ2V0IHJlY29nbml6ZWQgYmVmb3JlIHRoZSBkYXRhIHJlZ2lzdGVyCi0gCWRvZXMgZ2V0cyB0cmVhdGVkIGFzIGEgZGVnZW5lcmF0ZSByZWdpc3RlciBsaXN0LgotCi1UdWUgU2VwIDE3IDEyOjA2OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIGEgY2FzZSBmb3IgImRpdiIgYW5kICJkaXZ1IiB3aXRoIHR3byByZWdpc3RlcnMKLQlhbmQgYSBkZXN0aW5hdGlvbiBvZiAkMC4KLQotVHVlIFNlcCAxMCAxNjoxMjozOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogQWRkIHByb3RvdHlwZS4KLQkoX3ByaW50X2luc25fbWlwcyk6IERpdHRvLgotCi1Nb24gU2VwICA5IDE0OjI2OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBQcmludCBjb25kaXRpb24gY29kZSByZWdpc3RlcnMgYXMKLSAJJGZjY04uCi0KLVR1ZSBTZXAgIDMgMTI6MDk6NDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBBZGQgc2V0dXcsIHNldHN3LCBzZXR4LgotCi1UdWUgU2VwICAzIDEyOjA1OjI1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBNYWtlIHN0YXRpYy4gIFByb3ZpZGUgcHJvdG90eXBlLgotCi1TdW4gU2VwICAxIDIyOjMwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q5LCBpbnNlcnRfZDIyKTogRml4IGJvdW5kYXJ5IGNhc2UKLQlpbiByYW5nZSBjaGVja3MuCi0KLVNhdCBBdWcgMzEgMDE6Mjc6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEhhbmRsZSBpbnNlcnRpb24gb2YgJywnLCAnWycgYW5kCi0JJ10nIGNoYXJhY3RlcnMgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2RlczogUmVtb3ZlIHNpemUgZmllbGQgZnJvbSBhbGwgb3Bjb2Rlcy4KLQlBZGQgIm1lbW9wIiBmaWVsZCB0byBhbGwgb3Bjb2RlcyAoZm9yIHRoZSBkaXNhc3NlbWJsZXIpLgotCVJlb3JkZXIgb3Bjb2RlcyBzbyB0aGF0ICJub3AiIGNvbWVzIGJlZm9yZSAibW92IiBhbmQgImpyIgotCWNvbWVzIGJlZm9yZSAiamFybCIuCi0KLQkqIHY4NTAtZGlzLmMgKHByaW50X2luc25fdjg1MCk6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgotCi0JKiB2ODUwLWRpcy5jIChwcmludF9pbnNuX3Y4NTApOiBQcm9wZXJseSBoYW5kbGUgZGlzYXNzZW1ibGluZwotCWEgdHdvIGJ5dGUgaW5zbiBhdCB0aGUgZW5kIG9mIGEgbWVtb3J5IHJlZ2lvbiB3aGVuIHRoZSBtZW1vcnkKLQlyZWdpb24ncyBzaXplIGlzIG9ubHkgdHdvIGJ5dGUgYWxpZ25lZC4KLQotCSogdjg1MC1kaXMuYyAodjg1MF9jY19uYW1lcyk6IEZpeCBzdHVwaWQgdGhpbmtvcy4KLQotCSogdjg1MC1kaXMuYyAodjg1MF9yZWdfbmFtZXMpOiBEZWZpbmUuCi0JKHY4NTBfc3JlZ19uYW1lcywgdjg1MF9jY19uYW1lcyk6IExpa2V3aXNlLgotCShkaXNhc3NlbWJsZSk6IFZlcnkgcm91Z2ggY3V0IGF0IHByaW50aW5nIG9wZXJhbmRzICh1bmZvcm1hdHRlZCkuCi0KLQkqIHY4NTAtb3BjLmMgKEJPUF9NQVNLKTogRml4LgotCSh2ODUwX29wY29kZXMpOiBGaXggbWFzayBmb3IgamFybCBhbmQganIuCi0KLQkqIHY4NTAtZGlzLmM6IE5ldyBmaWxlLiAgU2tlbGV0b24gZm9yIGRpc2Fzc2VtYmxlciBzdXBwb3J0LgotCSogTWFrZWZpbGUuaW4gUmVtb3ZlIHY4NTAgcmVmZXJlbmNlcywgdGhleSdyZSBub3QgbmVlZGVkIGhlcmUuCi0JKiBjb25maWd1cmUuaW46IEFkZCB2ODUwLWRpcy5vIHdoZW4gYnVpbGRpbmcgdjg1MCB0b29sY2hhaW5zLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogQ2FsbCB2ODUwIGRpc2Fzc2VtYmxlci4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q4XzcsIGV4dHJhY3RfZDhfNyk6IE5ldyBmdW5jdGlvbnMuCi0JKGluc2VydF9kOF82LCBleHRyYWN0X2Q4XzYpOiBOZXcgZnVuY3Rpb25zLgotCSh2ODUwX29wZXJhbmRzKTogUmVuYW1lIEQ3UyB0byBENzsgb3BlcmFuZCBmb3IgRDcgaXMgdW5zaWduZWQuCi0JUmVuYW1lIEQ4IHRvIEQ4XzcsIHVzZSB7aW5zZXJ0LGV4dHJhY3R9X2Q4Xzcgcm91dGluZXMuCi0JQWRkIEQ4XzYuCi0JKElGNEEsIElGNEIpOiBVc2UgIkQ3IiBpbnN0ZWFkIG9mICJEN1MiLgotCShJRjRDLCBJRjREKTogVXNlICJEOF83IiBpbnN0ZWFkIG9mICJEOCIuCi0JKElGNEUsIElGNEYpOiBOZXcuICBVc2UgIkQ4XzYiLgotCSh2ODUwX29wY29kZXMpOiBVc2UgSUY0QS9JRjRCIGZvciBzbGQuYi9zc3QuYi4gIFVzZSBJRjRDL0lGNEQgZm9yCi0Jc2xkLmgvc3N0LmguICBVc2UgSUY0RS9JRjRGIGZvciBzbGQudy9zc3Qudy4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2QxNl8xNSwgZXh0cmFjdF9kMTZfMTUpOiBOZXcgZnVuY3Rpb25zLgotCSh2ODUwX29wZXJhbmRzKTogQ2hhbmdlIEQxNiB0byBEMTZfMTUsIHVzZSBzcGVjaWFsIGluc2VydC9leHRyYWN0Ci0Jcm91dGluZXMuICBOZXcgbmV3IEQxNiB0aGF0IHVzZXMgdGhlIGdlbmVyaWMgaW5zZXJ0L2V4dHJhY3QgY29kZS4KLQkoSUY3QSwgSUY3Qik6IFVzZSBEMTZfMTUuCi0JKElGN0MsIElGN0QpOiBOZXcuICBVc2UgRDE2LgotCSh2ODUwX29wY29kZXMpOiBVc2UgSUY3QyBhbmQgSUY3RCBmb3IgbGQuYiBhbmQgc3QuYi4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q5LCBpbnNlcnRfZDIyKTogU2xpZ2h0bHkgaW1wcm92ZSBlcnJvcgotCW1lc3NhZ2UuICBJc3N1ZSBhbiBlcnJvciBpZiB0aGUgYnJhbmNoIG9mZnNldCBpcyBvZGQuCi0KLQkqIHY4NTAtb3BjLmM6IEFkZCBub3RlcyBhYm91dCBuZWVkaW5nIHNwZWNpYWwgaW5zZXJ0L2V4dHJhY3QKLQlmb3IgYWxsIHRoZSBsb2FkL3N0b3JlIGluc25zLCBleGNlcHQgImxkLmIiIGFuZCAic3QuYiIuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kMjIsIGV4dHJhY3RfZDIyKTogTmV3IGZ1bmN0aW9ucy4KLQkodjg1MF9vcGVyYW5kcyk6IFVzZSBpbnNlcnRfZDIyIGFuZCBleHRyYWN0X2QyMiBmb3IKLQlEMjIgb3BlcmFuZHMuCi0JKGluc2VydF9kOSk6IEZpeCByYW5nZSBjaGVjay4KLQotRnJpIEF1ZyAzMCAxODowMTowMiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZCBWODUwX09QRVJBTkRfU0lHTkVEIGZsYWcKLQlhbmQgc2V0IGJpdHMgZmllbGQgdG8gRDkgYW5kIEQyMiBvcGVyYW5kcy4KLQotVGh1IEF1ZyAyOSAxMToxMDo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBEZWZpbmUgU1IyIG9wZXJhbmQuCi0JKHY4NTBfb3Bjb2Rlcyk6ICJsZHNyIiB1c2VzIFIxLFNSMi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IG9wY29kZSBzcGVjcyBmb3IKLQlzbGQudywgc3N0LmIsIHNzdC5oLCBzc3QudywgYW5kIG5vcC4KLQotV2VkIEF1ZyAyOCAxNTo1NTo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEFkZCBudWxsIG9wY29kZSB0byBtYXJrIHRoZQotCWVuZCBvZiB0aGUgb3Bjb2RlIHRhYmxlLgotCi1Nb24gQXVnIDI2IDEzOjM1OjUzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGRlZCByZWdpc3RlciBwYWlycywKLQkicjAtcjEiLCAicjItcjMiLCBldGMuCi0KLUZyaSBBdWcgMjMgMDA6Mjc6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogTWFrZSBJMTYgYmUgYSBzaWduZWQgb3BlcmFuZC4KLQlDcmVhdGUgSTE2VSBmb3IgYW4gdW5zaWduZWQgMTZiaXQgbW1lZGlhdGUgb3BlcmFuZC4KLQkodjg1MF9vcGNvZGVzKTogVXNlIEkxNlUgZm9yICJvcmkiLCAiYW5kaSIgYW5kICJ4b3JpIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IERlZmluZSBFUCBvcGVyYW5kLgotCShJRjRBLCBJRjRCLCBJRjRDLCBJRjREKTogVXNlIEVQLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaXggb3Bjb2RlIG51bWJlcnMgZm9yICJtb3YiCi0Jd2l0aCBpbW1lZGlhdGUgb3BlcmFuZCwgIm1vdmhpIi4gIFR3ZWFrICJsZHNyIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogR2V0IGxkLltiaHddIGFuZCBzdC5bYmh3XQotCWNvcnJlY3QuICBHZXQgc2xkLltiaHddIGFuZCBzc3QuW2Jod10gY2xvc2VyLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogIm5vdCIgaXMgYSB0d28gYnl0ZSBpbnNuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IENvcnJlY3QgYml0IHBhdHRlcm4gZm9yIHNldGYuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBEMTYgaW5zZXJ0cyBhdCBvZmZzZXQgMTYhCi0KLQkqIHY4NTAtb3BjLmMgKHR3byk6IEdldCBvcmRlciBvZiB3b3JkcyBjb3JyZWN0LgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogSTE2IGluc2VydHMgYXQgb2Zmc2V0IDE2IQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkICJTUjEiIGFuZCAiU1IyIiBmb3Igc3lzdGVtCi0JcmVnaXN0ZXIgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvcGVyYW5kcy4KLQkodjg1MF9vcGNvZGVzKTogVXNlIFNSMSBhbmQgU1IyIGZvciAibGRzciIgYW5kICJzdHNyIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IHRoaW5rbyBpbiAiam1wIiBvcGNvZGUuICBGaXgKLQlzYW1lIHRoaW5rbyBpbiAidHJhcCIgb3Bjb2RlLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgaW5pdGlhbGl6ZXIgZm9yIHNpemUgZmllbGQKLQlvbiBhbGwgb3Bjb2Rlcy4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEQ2IC0+IERTNy4gIFJlZmVyZW5jZXMgY2hhbmdlZC4KLQlBZGQgRDggZm9yIDgtYml0IHVuc2lnbmVkIGZpZWxkIGluIHNob3J0IGxvYWQvc3RvcmUgaW5zbnMuCi0JKElGNEEsIElGNEQpOiBUaGVzZSBib3RoIG5lZWQgdHdvIHJlZ2lzdGVycy4KLQkoSUY0QywgSUY0RCk6IERlZmluZS4gIFVzZSA4LWJpdCB1bnNpZ25lZCBmaWVsZC4KLQkodjg1MF9vcGNvZGVzKTogRm9yICJzbGQuaCIsICJzbGQudyIsICJzc3QuaCIsICJzc3QudyIsIHVzZQotCUlGNEMgJiBJRjRELiAgRm9yICJ0cmFwIiB1c2UgSTVVLCBub3QgSTUuICBBZGQgSUYxIG9wZXJhbmQKLQlmb3IgImxkc3IiIGFuZCAic3RzciIuCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogMy1iaXQgaW1tZWRpYXRlIGZvciBiaXQgaW5zbnMKLQlpcyB1bnNpZ25lZC4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQ29ycmVjdCBzaG9ydCBzdG9yZSBoYWxmIChzc3QuaCkgYW5kCi0Jc2hvcnQgc3RvcmUgd29yZCAoc3N0LncpLgotCi1UaHUgQXVnIDIyIDE2OjU3OjI3IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZGVkIGluc2VydCBhbmQgZXh0cmFjdCBmaWVsZHMsCi0gCXBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB1bnVzdWFsIG9wZXJhbmQgZW5jb2RpbmdzLgotCi1UaHUgQXVnIDIyIDAxOjA1OjI0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRW5hYmxlICJ0cmFwIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IG9yZGVyIG9mIGRpc3BsYWNlbWVudAotCWFuZCByZWdpc3RlciBmb3IgInNldDEiLCAiY2xyMSIsICJub3QxIiwgYW5kICJ0c3QxIi4KLQotV2VkIEF1ZyAyMSAxODo0NjoyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgIkIzIiBzdXBwb3J0LgotCSh2ODUwX29wY29kZXMpOiBGaXggYW5kIGVuYWJsZSAic2V0MSIsICJjbHIxIiwgIm5vdDEiCi0JYW5kICJ0c3QxIi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogImptcCIgaGFzIG9ubHkgYW4gUjEgb3BlcmFuZC4KLQotCSogdjg1MC1vcGMuYzogQ2xvc2UgdW50ZXJtaW5hdGVkIGNvbW1lbnQuCi0KLVdlZCBBdWcgMjEgMTc6MzE6MjYgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgZmxhZ3MgZmllbGQuCi0gCSh2ODUwX29wY29kZXMpOiBhZGQgbW92ZSBvcGNvZGVzLgotCi1UdWUgQXVnIDIwIDE0OjQxOjAzIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIHY4NTAtb3BjLm8uCi0JKiBjb25maWd1cmU6IChiZmRfdjg1MHZfYXJjaCkgQWRkIG5ldyBjYXNlLgotCSogY29uZmlndXJlLmluOiAoYmZkX3Y4NTBfYXJjaCkgQWRkIG5ldyBjYXNlLgotCSogdjg1MC1vcGMuYzogTmV3IGZpbGUuCi0KLU1vbiBBdWcgMTkgMTU6MjE6MzggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgbGl0dGxlIGVuZGlhbiBzcGFyY3MuCi0KLVRodSBBdWcgMTUgMTM6MTQ6NDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmM6IEFkZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBvcGNvZGUKLQl0YWJsZSB0byBoZWxwIGRldGVybWluaW5lIHdoaWNoIGluc3RydWN0aW9ucyBjYW4gYmUgZG9uZQotCWluIHBhcmFsbGVsLgotCi1UaHUgQXVnIDE1IDEzOjExOjEzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVcGRhdGUgZWRpdGluZyBvZiBpbmNsdWRlIHBhdGhuYW1lcyB0byBiZQotCW1vcmUgZ2VuZXJhbC4KLQotVGh1IEF1ZyAxNSAxNjoyODo0MSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGFybS1vcGMuaDogQWRkZWQgImJ4IiBpbnN0cnVjdGlvbiBkZWZpbml0aW9uLgotCi1XZWQgQXVnIDE0IDE3OjAwOjA0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS1vcGMuYyAoRVY0RVhUSFdJTkRFWCk6IEZpZWxkIHdpZHRoIHNob3VsZCBiZSA4IG5vdCA1LgotCi1Nb24gQXVnIDEyIDE0OjMwOjM3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBNaW5vciBmaXhlcyB0byBhZGRpIGFuZCBibC5sLgotCi1GcmkgQXVnICA5IDEzOjIxOjU5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBDb3JyZWN0ICdtdicgdW5pdCBlbnRyeSB0byBFSVRIRVIuCi0KLVRodSBBdWcgIDggMTI6NDM6NTIgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIGZvciBhbHBoYS1vcGMgY2hhbmdlcy4KLQotV2VkIEF1ZyAgNyAxMTo1NToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTM4Nik6IEFjdHVhbGx5IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZS4KLSAJKE9ORSwgT1BfT05FKTogI2lmZGVmIG91dDsgbm90IHVzZWQuCi0KLUZyaSBBdWcgIDIgMTc6NDc6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IEFkZGVkIDIgYWNjdW11bGF0b3Igc3ViIGluc3RydWN0aW9ucy4KLQlDaGFuZ2VkIHN1Ymkgb3BlcmFuZCB0eXBlIHRvIHRyZWF0IDAgYXMgMTYuCi0KLVdlZCBKdWwgMzEgMTY6MjE6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBBZGQgY3B1c2hsIGZvciB0aGUgbWNmNTIwMC4gIEZyb20gS2VuIFJvc2UKLQk8cm9zZUBuZXRjb20uY29tPi4KLQotV2VkIEp1bCAzMSAxNDozOToyNyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGFybS1vcGMuaDogKGFybV9vcGNvZGVzKTogQWRkZWQgaGFsZndvcmQgYW5kIHNpZ24tZXh0ZW5zaW9uCi0gCW1lbW9yeSB0cmFuc2ZlciBpbnN0cnVjdGlvbnMuIEFkZCBuZXcgZm9ybWF0IHN0cmluZyBlbnRyaWVzICVoIGFuZCAlcy4KLQkqIGFybS1kaXMuYzogKHByaW50X2luc25fYXJtKTogUHJvdmlkZSBkZWNvZGluZyBvZiB0aGUgbmV3Ci0JZm9ybWF0cyAlaCBhbmQgJXMuCi0KLUZyaSBKdWwgMjYgMTE6NDU6MDQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3BlcmFuZHMpOiBBZGRlZCBVTlVNNFM7IGEgNC1iaXQgYWNjdW11bGF0b3Igc2hpZnQuCi0gCShkMTB2X29wY29kZXMpOiBNb2RpZmllZCBhY2N1bXVsYXRvciBzaGlmdCBpbnN0cnVjdGlvbnMgdG8gdXNlIFVOVU00Uy4KLQotRnJpIEp1bCAyNiAxNDowMTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhX29zZik6IFJlbW92ZS4KLQkocHJpbnRfaW5zbl9hbHBoYV92bXMpOiBSZW1vdmUuCi0JKHByaW50X2luc25fYWxwaGEpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBDaG9zZSB0aGUgcmVnaXN0ZXIKLQluYW1lcyBiYXNlZCBvbiBpbmZvLT5mbGF2b3VyLgotCSogZGlzYXNzZW1ibGUuYzogQWx3YXlzIHJldHVybiBwcmludF9pbnNuX2FscGhhIGZvciB0aGUgYWxwaGEuCi0KLVRodSBKdWwgMjUgMTU6MjQ6MTcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMgKGRpc19sb25nKTogSGFuZGxlIHVua25vd24gb3Bjb2Rlcy4KLQotVGh1IEp1bCAyNSAxMjowODowOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYzogQ2hhbmdlcyB0byBzdXBwb3J0IHNpZ25lZCBhbmQgdW5zaWduZWQgbnVtYmVycy4KLQlBbGwgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB0aGF0IGhhdmUgbG9uZyBhbmQgc2hvcnQgZm9ybXMKLQlub3cgZW5kIGluICIubCIgb3IgIi5zIi4gIERpdnMgYWRkZWQuCi0JKiBkMTB2LWRpcy5jOiBDaGFuZ2VzIHRvIHN1cHBvcnQgc2lnbmVkIGFuZCB1bnNpZ25lZCBudW1iZXJzLgotCi1UdWUgSnVsIDIzIDExOjAyOjUzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jOiBDaGFuZ2UgYWxsIGZ1bmN0aW9ucyB0byB1c2UgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jLgotCi1Nb24gSnVsIDIyIDE1OjM4OjUzIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBNYWtlIG9wY29kZSBtYXNrcyBmb3IgdGhlIENvbGRGaXJlCi0gCW1vdmUgY2NyL3NyIGluc25zIG1vcmUgc3RyaWN0IHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciBvbmx5Ci0gCXNlbGVjdHMgdGhlbSB3aGVuIHRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgZGF0YSByZWdpc3Rlci4KLQotTW9uIEp1bCAyMiAxMToyNToyNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLSAgICAgICAgKiBkMTB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiAgRGVjbGFyZS4KLSAgICAgICAgKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogTm93IHVzZXMgcHJlX2RlZmluZWRfcmVnaXN0ZXJzCi0gICAgICAgIHRvIHBpY2sgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIHJlZ2lzdGVycy4KLQotTW9uIEp1bCAyMiAxMzo0NzoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBGaXggb3Bjb2RlIHZhbHVlcyBmb3IgZnBhY2sxNiwgYW5kIGZwYWNrZml4LiAgRml4Ci0Jb3BlcmFuZHMgZm9yIGZleHBhbmQgYW5kIGZwbWVyZ2UuICBGcm9tIENocmlzdGlhbiBLdWVobmtlCi0JPENocmlzdGlhbi5LdWVobmtlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlPi4KLQotTW9uIEp1bCAyMiAxMzoxNzowNiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBObyBsb25nZXIgdGhlIHVzZXItdmlzaWJsZQotCXByaW50IHJvdXRpbmUuICBUYWtlIG5ldyByZWduYW1lcyBhbmQgY3B1bWFzayBhcmd1bWVudHMuCi0JS2lsbCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbm9uc2Vuc2UuCi0JKHByaW50X2luc25fYWxwaGFfb3NmKTogTmV3IGZ1bmN0aW9uLiAgRG8gT1NGLzEgc3R5bGUgcmVnbmFtZXMuCi0JKHByaW50X2luc25fYWxwaGFfdm1zKTogTmV3IGZ1bmN0aW9uLiAgRG8gVk1TIHN0eWxlIHJlZ25hbWVzLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogVGVzdCBiZmQgZmxhdm91ciB0byBwaWNrCi0JYmV0d2VlbiBPU0YgYW5kIFZNUyByb3V0aW5lcy4gIERlZmF1bHQgdG8gT1NGLgotCi1UaHUgSnVsIDE4IDE3OjE5OjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1NVQlNUIChJTlNUQUxMX1NITElCKS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogVXNlIEBJTlNUQUxMX1NITElCQC4KLQotV2VkIEp1bCAxNyAxNDozOTowNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiAoYmZkX2QxMHZfYXJjaCkgQWRkIG5ldyBjYXNlLgotCSogY29uZmlndXJlLmluOiAoYmZkX2QxMHZfYXJjaCkgQWRkIG5ldyBjYXNlLgotCSogZDEwdi1kaXMuYzogTmV3IGZpbGUuCi0JKiBkMTB2LW9wYy5jOiBOZXcgZmlsZS4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcikgQWRkIGVudHJ5IGZvciBkMTB2LgotCi1XZWQgSnVsIDE3IDEwOjEyOjA1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogRml4IGJ1Z3MgaW4gY29sZGZpcmUgaW5zbnMgcmVsYXRpbmcKLSAJdG8gYmNjLCB0cmFwZmwsIHN1YnhsLCBhbmQgd2RkYXRhIGRpc2NvdmVyZWQgYnkgQW5kcmVhcyBTY2h3YWIuCi0KLU1vbiBKdWwgMTUgMTY6NTk6NTUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni1kaXMuYzogIEdldCByaWQgb2YgcHJpbnRfaW5zbl9pODA4Ni4gIFVzZSBpbmZvLm1hY2ggdG8KLQlkaXN0aW5ndWlzaCBiZXR3ZWVuIHZhcmlhbnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQuCi0JKiBzcGFyYy1kaXMuYzogIEdldCByaWQgb2YgcHJpbnRfaW5zbl9zcGFyY2xpdGUuICBVc2UgaW5mby5tYWNoIHRvCi0JZGlzdGluZ3Vpc2ggYmV0d2VlbiB2YXJpYW50cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0LgotCi1GcmkgSnVsIDEyIDEwOjEyOjAxIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTgwODYpOiAgTmV3IHJvdXRpbmUgdG8gZGlzYXNzZW1ibGUgdXNpbmcKLQl0aGUgODA4NiBpbnN0cnVjdGlvbiBzZXQuCi0JKiBpMzg2LWRpcy5jOiAgR2VuZXJhbCBjbGVhbnVwcy4gIE1ha2UgbW9zdCB0aGluZ3Mgc3RhdGljLiAgQWRkCi0JcHJvdG90eXBlcy4gIEdldCByaWQgb2Ygc3RhdGljIHZhcmlhYmxlcyBhZmxhZ3MgYW5kIGRmbGFncy4gIFBhc3MKLQl0aGVtIGFzIGFyZ3MgKHRvIGFsbW9zdCBldmVyeXRoaW5nKS4KLQotVGh1IEp1bCAxMSAxMTo1ODo0NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBIYW5kbGUgbWFjcmVncyBpbiBsZG1hYyBpbnNucy4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEhhbmRsZSAibGRtLmwiIGFuZCAic3RtLmwiLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogImFicyIgaXMgaW1wbGljaXRseSB0d28KLQlpZiB0aGUgbmV4dCBhcmcgaXMgbWFya2VkIHdpdGggU1JDX0lOX0RTVC4gIEdyb3NzLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogUHJpbnQgImV4ciIgd2hlbgotCXdlJ3JlIGxvb2tpbmcgZm9yIGFuZCBmaW5kIEVYUi4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFdlIGRvbid0IGhhdmUgYSBtYXRjaAotCWlmIHdlJ3JlIGxvb2tpbmcgZm9yIEtCSVQgYW5kIHdlIGRvbid0IGZpbmQgaXQuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBNYXNrIG9mZiB1bndhbnRlZCBiaXRzCi0JZm9yIExfMyBhbmQgTF8yLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogRG9uJ3Qgc2V0IHBsZW4gZm9yCi0JM2JpdCBpbW1lZGlhdGUgb3BlcmFuZHMuCi0KLVR1ZSBKdWwgIDkgMTA6NTU6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLQkqIGFscGhhLW9wYy5jOiBBZGQgbmV3IGNhc2Ugb2YgIm1vdiIuICBGcm9tIEtsYXVzIEthZW1wZgotCTxra2FlbXBmQHByb2dpcy5hYy1uZXQuZGU+LgotCi1UaHUgSnVsICA0IDExOjQyOjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmM6IENvcnJlY3Qgc2Vjb25kIGNhc2Ugb2YgIm1vdiIgdG8gdXNlIE9QUkwuCi0KLVdlZCBKdWwgIDMgMTY6MDM6NDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmNsaXRlKTogIE5ldyByb3V0aW5lIHRvIHByaW50Ci0Jc3BhcmNsaXRlIGluc3RydWN0aW9ucy4KLQotV2VkIEp1bCAgMyAxNDoyMToxOCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZCBjb2xkZmlyZSBzdXBwb3J0LgotCi1GcmkgSnVuIDI4IDE1OjUzOjUxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChhc2lfdGFibGUpOiBBZGQgI0FTSV9OLCAjQVNJX05fTCwgI0FTSV9OVUNMRVVTLAotCSNBU0lfTlVDTEVVU19MSVRUTEUuICBSZW5hbWUgI0FTSV9BU19JRl9VU0VSX3tQUklNQVJZLFNFQ09OREFSWX1fTAotCXRvICNBU0lfQVNfSUZfVVNFUl97UFJJTUFSWSxTRUNPTkRBUll9X0xJVFRMRS4KLQotVHVlIEp1biAyNSAyMjo1ODozMSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpcik6Ci0JVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0JKGRvY2Rpciwgb2xkaW5jbHVkZWRpcik6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0KLUZyaSBKdW4gMjEgMTM6NTM6MzYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLW9wYy5jOiBOZXcgZmlsZS4KLQkqIGFscGhhLW9wYy5oOiBSZW1vdmUuCi0JKiBhbHBoYS1kaXMuYzogQ29tcGxldGUgcmV3cml0ZSB0byB1c2UgbmV3IG9wY29kZSB0YWJsZS4KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIGJmZF9hbHBoYV9hcmNoLCB1c2UgYWxwaGEtb3BjLm8uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBhbHBoYS1vcGMuby4KLQkoYWxwaGEtZGlzLm8pOiBEZXBlbmQgdXBvbiAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmgsIG5vdAotCWFscGhhLW9wYy5oLgotCShhbHBoYS1vcGMubyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBKdW4gMTkgMTU6NTU6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KLQlTZXQgaW1tX2FkZGVkX3RvX3JzMSBldmVuIGlmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCi0JYXJlIG5vdCB0aGUgc2FtZS4KLQotCSogc3BhcmMtb3BjLmM6IEFkZCBzb21lIHR3byBvcGVyYW5kIGZvcm1zIG9mIHRoZSB3ciBpbnN0cnVjdGlvbi4KLQotVHVlIEp1biAxOCAxNTo1ODoyNyAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFJlbmFtZSAiaG1vZGUiIGFyZ3VtZW50Ci0JdG8ganVzdCAibW9kZSIuCi0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBIOC9TLgotCSogaDgzMDAtZGlzLmMgKHByaW50X2luc25faDgzMDBzKTogTmV3IGZ1bmN0aW9uIGZvciBIOC9TLgotCi1UdWUgSnVuIDE4IDE4OjA2OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IEFkZCBiZXEvdGVxIGFzIGFsaWFzZXMgZm9yIGJlL3RlLgotCi0JKiBwcGMtb3BjLmM6IEZpeCBmY21wbyBvcGNvZGUuICBGcm9tIFNlcmdlaSBTdGVzaGVua28KLQk8c2VyZ2VpQG1zaWwuc3BzLm1vdC5jb20+LgotCi1UdWUgSnVuIDE4IDE1OjA4OjU0IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFByaW50IGxkYSByYSxsaXQocnopIGFzIG1vdi4KLQotTW9uIEp1biAxMCAxODo1MDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBBbHdheXMgcHJpbnQgQUJTOE1FTSB3aXRoIDo4LAotCXJlZ2FyZGxlc3Mgb2YgcGxlbi4KLQotVHVlIEp1biAgNCAwOToxNTo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChPUF9PRkYpOiBDYWxsIGFwcGVuZF9wcmVmaXguCi0KLVRodSBNYXkgMjMgMTU6MTg6MjMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKGluc3RydWN0aW9uIGVuY29kaW5nIG1hY3Jvcyk6IEFkZCBleHBsaWNpdCBjYXN0cyB0bwotCXVuc2lnbmVkIGxvbmcgdG8gc2lsZW5jZSBhIHdhcm5pbmcgZnJvbSB0aGUgU29sYXJpcyBQb3dlclBDCi0JY29tcGlsZXIuCi0KLVRodSBBcHIgMjUgMTk6MzM6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBBZGQgdWx0cmFzcGFyYyB2aXMgZXh0ZW5zaW9ucy4KLQotTW9uIEFwciAyMiAxNzoxMjozNSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChYX0lNTSxYX1NJTU0pOiBOZXcgbWFjcm9zLgotCShYX0lNTTEzKTogRGVsZXRlLgotCShwcmludF9pbnNuX3NwYXJjKTogTWVyZ2UgY2FzZXMgaSxJLGogdG9nZXRoZXIuICBOZXcgY2FzZXMgWCxZLgotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBVc2UgWCBmb3IgNSBiaXQgc2hpZnQgY29uc3RhbnRzLAotCVkgZm9yIDYgYml0IHNoaWZ0IGNvbnN0YW50cy4gIFJld3JpdGUgZW50cmllcyBmb3IgY3JkY3h0LCBjd3JjeHQsCi0JY3B1c2gsIGNwdXNoYSwgY3B1bGwgc3BhcmNsZXQgaW5zbnMuCi0KLVdlZCBBcHIgMTcgMTQ6MjA6MjIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKGNvbXB1dGVfYXJjaF9tYXNrKTogUmVwbGFjZSBBTlNJIHN0eWxlIGRlZiB3aXRoIEsmUi4KLQotVGh1IEFwciAxMSAxNzozMDowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBTZXQgRl9GQlIgb24gZmxvYXRpbmcgcG9pbnQgYnJhbmNoIGluc3RydWN0aW9ucy4KLQlTZXQgRl9GTE9BVCBvbiBvdGhlciBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuCi0KLU1vbiBBcHIgIDggMTc6MDI6NDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKFBQQzg2MCk6IE1hY3JvIGZvciA4NjAvODIxIHNwZWNpZmljIGluc3RydWN0aW9ucyBhbmQKLQlyZWdpc3RlcnMuCi0gCShwb3dlcnBjX29wY29kZXMpOiBBZGQgODYwLzgyMSBzcGVjaWZpYyBTUFJzLgotCi1Nb24gQXByICA4IDE0OjAwOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuICBTZXQgYW5kIHN1YnN0aXR1dGUgQkZEX1BJQ0xJU1QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX1BJQ0xJU1QpOiBSZW5hbWUgZnJvbSBCRkRfTElTVC4gIENoYW5nZSBhbGwKLQl1c2VzLiAgU2V0IHRvIEBCRkRfUElDTElTVEAuCi0KLUZyaSBBcHIgIDUgMTc6MTI6MjcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogVXNlICJiaXQiIGZvciBMXzMgaW1tZWRpYXRlcywKLQlub3QgImFicyIsIHdoaWNoIG1heSBiZSBuZWVkZWQgZm9yIHRoZSBhYnNvbHV0ZSBpbiBzb21ldGhpbmcKLQlsaWtlIGJ0c3QgIzAsQDEwOjguICBQcmludCBMXzMgaW1tZWRpYXRlcyBzZXBhcmF0ZWx5IGZyb20gb3RoZXIKLQlpbW1lZGlhdGVzLiAgQ2hhbmdlIEFCU01PViByZWZlcmVuY2UgdG8gQUJTOE1FTS4KLQotV2VkIEFwciAgMyAxMDo0MDo0NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAob3Bjb2Rlc19pbml0aWFsaXplZCk6IE1vdmUgaW5zaWRlIHByaW50X2luc25fc3BhcmMuCi0JKGN1cnJlbnRfYXJjaF9tYXNrKTogTmV3IHN0YXRpYyBnbG9iYWwuCi0JKGNvbXB1dGVfYXJjaF9tYXNrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IERlbGV0ZSBzcGFyY192OV9wLiAgTmV3IHN0YXRpYyBsb2NhbAotCWN1cnJlbnRfbWFjaC4gIFJlc29ydCBvcGNvZGUgdGFibGUgaWYgY3VycmVudF9tYWNoIGNoYW5nZXMuCi0JR2VuZXJhbGl6ZSAiaW5zbiBub3Qgc3VwcG9ydGVkIiB0ZXN0LgotCShjb21wYXJlX29wY29kZXMpOiBQcmVmZXIgc3VwcG9ydGVkIG9wY29kZXMgdG8gbm9uc3VwcG9ydGVkIG9uZXMuCi0JRGVsZXRlIHRlc3QgZm9yIHY5LyF2OS4KLQkqIHNwYXJjLW9wYy5jIChNQVNLXyopOiBVc2UgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSy4KLQkodjZub3RsZXQpOiBEZWZpbmUuCi0JKGJyZmMpOiBTcGxpdCBpbnRvIENCUiBhbmQgRkJSIGZvciBjb3Byb2Nlc3Nvci9mcCBicmFuY2hlcy4KLQkoYnJmY3gpOiBSZW5hbWVkIHRvIEZCUlguCi0JKGNvbmRmYyk6IFJlbmFtZWQgdG8gQ09OREZDLiAgUGFzcyB2Nm5vdGxldCB0byBDQlIgKHN0YW5kYXJkCi0JY29wcm9jZXNzb3IgbW5lbW9uaWNzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGFyY2xldCkuCi0JKGNvbmRmKTogUmVuYW1lZCB0byBDT05ERi4KLQkoU0xDQkNDMik6IERlbGV0ZSBGX0FMSUFTIGZsYWcuCi0KLVNhdCBNYXIgMzAgMjE6NDU6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiByZCBtdXN0IGJlIDAgZm9yCi0JbW92IGZvbyx7JXksJXBzciwld2ltLCV0YnJ9LiAgU3VwcG9ydCBtb3YgZm9vLCVhc3JYLgotCi1GcmkgTWFyIDI5IDEzOjAyOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBCRkQgVkVSU0lPTiBmaWxlLCBzbwotCXRoYXQgdGhlIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyIGlzIHNldCBjb3JyZWN0bHkuCi0KLVR1ZSBNYXIgMjYgMTU6NDc6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBBQ19DSEVDS19UT09MIHRvIGZpbmQgYXIgYW5kIHJhbmxpYi4gIEZyb20KLQlNaWxlcyBCYWRlciA8bWlsZXNAZ251LmFpLm1pdC5lZHU+LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgTWFyIDE2IDEzOjA0OjA3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB6OGtnZW4uYyAoaW50ZXJuYWwsIGdhcyk6IENhbGwgeG1hbGxvYyByYXRoZXIgdGhhbiB1bmNoZWNrZWQKLQltYWxsb2MuCi0KLVR1ZSBNYXIgMTIgMTI6MTQ6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLVRodSBNYXIgIDcgMTU6MTE6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlICdPJyBvcGVyYW5kIGNoYXIgbGlrZSAncicuCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IFVzZSAnTycgb3BlcmFuZCBjaGFyIGZvciBgbmVnIHJlZycuCi0KLVR1ZSBNYXIgIDUgMTU6NTE6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBTSExJQiBvciBTSExJTksgdG8gYW4gZW1wdHkgc3RyaW5nLAotCXNpbmNlIHRoZXkgYXBwZWFyIGFzIHRhcmdldHMgaW4gTWFrZWZpbGUuaW4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMjYgMTM6MDM6NDAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgYml0cy4KLQotVHVlIEZlYiAyMCAyMDo0ODoyOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHY4LHY2bm90djkpOiBBZGQgTUFTS19TUEFSQ0xFVC4KLQkoc3BhcmNfb3Bjb2RlX2FyY2hzKTogQWRkIE1BU0tfVjggdG8gc3BhcmNsZXQgZW50cnkuCi0JKHNwYXJjX29wY29kZXMpOiBBZGQgc3BhcmNsZXQgaW5zbnMuCi0JKHNwYXJjbGV0X2NwcmVnX3RhYmxlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3NwYXJjbGV0X2NwcmVnKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlIHNwYXJjbGV0IGNwcmVncy4KLQotVHVlIEZlYiAyMCAxMTowMjo0NCAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBtdWxsZXQuTGV2ZWxzLlVuaVNBLkVkdS5BdT4KLQotCSogaTM4Ni1kaXMuYyAoaW5kZXgxNik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHB1dG9wKTogUHJpbnQgamVjeHogZm9yIDMyIGJpdCBjYXNlLCBqY3h6IGZvciAxNiBiaXQsIG5vdCB0aGUKLQlvdGhlciB3YXkgYXJvdW5kLgotCShPUF9pbmRpckUpOiBSZXR1cm4gcmVzdWx0IG9mIE9QX0UuCi0JKE9QX0UpOiBDaGVjayBmb3IgMTYgYml0IGFkZHJlc3NpbmcgbW9kZSwgYW5kIGRpc2Fzc2VtYmxlCi0JY29ycmVjdGx5LiAgT3B0aW1pc2VkIDMyIGJpdCBjYXNlIGEgbGl0dGxlLiAgRG9uJ3QgcHJpbnQKLQkiKGJhc2UsaW5kZXgsc2NhbGUpIiB3aGVuIHNpYiBzcGVjaWZpZXMgb25seSBhbiBvZmZzZXQuCi0KLU1vbiBGZWIgMTkgMTI6MzI6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBhbmQgc3Vic3RpdHV0ZSBTSExJQl9ERVAuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoU0hMSUJfREVQKTogTmV3IHZhcmlhYmxlLgotCShMSUJJQkVSVFlfTElTVFMsIEJGRF9MSVNUKTogTmV3IHZhcmlhYmxlcy4KLQkoc3RhbXAtcGljbGlzdCk6IERlcGVuZCB1cG9uIExJQklCRVJUWV9MSVNUUyBhbmQgQkZEX0xJU1QuICBJZgotCUNPTU1PTl9TSExJQiwgYWRkIHRoZW0gdG8gcGljbGlzdCB3aXRoIGFwcHJvcHJpYXRlIG1vZGlmaWNhdGlvbnMuCi0JKCQoU0hMSUIpKTogRGVwZW5kIHVwb24gJChTSExJQl9ERVApLiAgRG9uJ3QgY2hlY2sgQ09NTU9OX1NITElCCi0JaGVyZToganVzdCB1c2UgcGljbGlzdC4KLQotTW9uIEZlYiAxOSAwMjowMzo1MCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKE1BU0tfVjksVjlfT05MWV9QLFY5X1ApOiBEZWZpbmUuCi0JKHByaW50X2luc25fc3BhcmMpOiBSZXdyaXRlIHY5L25vdC12OSB0ZXN0cy4KLQkoY29tcGFyZV9vcGNvZGVzKTogTGlrZXdpc2UuCi0JKiBzcGFyYy1vcGMuYyAoTUFTS188QVJDSD4pOiBEZWZpbmUuCi0JKHY2LHY3LHY4LHNwYXJjbGl0ZSx2OSx2OWEpOiBSZWRlZmluZS4KLQkoc3BhcmNsZXQsdjZub3R2OSk6IERlZmluZS4KLQkoc3BhcmNfb3Bjb2RlX2FyY2hzKTogRGVsZXRlIG1lbWJlciBgY29uZmxpY3RzJy4gIEFkZCBgc3VwcG9ydGVkJy4KLQkoc3BhcmNfb3Bjb2Rlcyk6IERlbGV0ZSBGX05PVFY5LCB1c2UgdjZub3R2OSBpbnN0ZWFkLgotCi1UaHUgRmViIDE1IDE0OjQ1OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlIGNvbmZpZ3VyZS5ob3N0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5pbiAoU09OQU1FKTogUmVtb3ZlIGxlYWRpbmcgLi4vYmZkLyBmcm9tICQoU0hMSUIpLgotCi1XZWQgRmViIDE0IDE5OjAxOjI3IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAob25lYnl0ZV9oYXNfbW9kcm0pOiBOZXcgc3RhdGljIGFycmF5LgotCSh0d29ieXRlX2hhc19tb2RybSk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKHByaW50X2luc25faTM4Nik6IE9ubHkgZmV0Y2ggdGhlIG1vZC9yZWcvcm0gYnl0ZSBpZiBpdCBpcyBuZWVkZWQuCi0KLVR1ZSBGZWIgMTMgMTU6MTU6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogQ2hlY2sgdHMgYWdhaW5zdCAkKFNITElCKSwgbm90Ci0JJChTSExJTkspLgotCi1Nb24gRmViIDEyIDE2OjI2OjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChQUEMpOiBVbmRlZiwgc28gZGVmYXVsdCBkZWZpbmF0aW9uIG9uIFdpbmRvd3MgTlQKLQlkb2Vzbid0IGNvbmZsaWN0LgotCi1XZWQgRmViICA3IDEzOjU5OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogVGhlIGJrcHQgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIG9uCi0JbTY4MDEwdXAsIG5vdCBqdXN0IG02ODAyMHVwIHwgY3B1MzIuCi0KLQkqIE1ha2VmaWxlLmluIChTT05BTUUpOiBOZXcgdmFyaWFibGUuCi0JKCQoU0hMSU5LKSk6IE1ha2UgYSBsaW5rIHRvIHRoZSB0cmFuc2Zvcm1lZCBuYW1lLCBhcyB3ZWxsLgotCShzdGFtcC10c2hsaW5rKTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IFNraXAgc3RhbXAtdHNobGluayBkdXJpbmcgaW5zdGFsbC4KLQotVHVlIEZlYiAgNiAxMjoyODo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19BUkdfUFJPR1JBTS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKTogTmV3IHZhcmlhYmxlLgotCShpbnN0YWxsKTogVHJhbnNmb3JtIGxpYnJhcnkgbmFtZSBiZWZvcmUgaW5zdGFsbGluZyBpdC4KLQotTW9uIEZlYiAgNSAxNjoxNDo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAtZGlzLmMgKG1lbSk6IEFkZCBIWCBkY2ludmEgaW5zdHJ1Y3Rpb24uCi0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBiYXNlZCBvbiBwYXRjaGVzIGZyb20KLQlBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfRU5BQkxFIGZvciBzaGFyZWQgYW5kIGNvbW1vbmJmZGxpYi4KLQlOZXcgc3Vic3RpdHV0aW9uczogQUxMTElCUywgUElDRkxBRywgU0hMSUIsIFNITElCX0NDLAotCVNITElCX0NGTEFHUywgQ09NTU9OX1NITElCLCBTSExJTksuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMTElCUyk6IE5ldyB2YXJpYWJsZS4KLQkoUElDRkxBRywgU0hMSUIsIFNITElCX0NDLCBTSExJQl9DRkxBR1MpOiBOZXcgdmFyaWFibGVzLgotCShDT01NT05fU0hMSUIsIFNITElOSyk6IE5ldyB2YXJpYWJsZXMuCi0JKC5jLm8pOiBJZiBQSUNGTEFHIGlzIHNldCwgY29tcGlsZSB0d2ljZSwgb25jZSBQSUMsIG9uY2Ugbm9ybWFsLgotCShTVEFHRVNUVUZGKTogUmVtb3ZlIHZhcmlhYmxlLgotCShhbGwpOiBEZXBlbmQgdXBvbiAkKEFMTExJQlMpIHJhdGhlciB0aGFuICQoVEFSR0VUTElCKS4KLQkoc3RhbXAtcGljbGlzdCwgcGljbGlzdCk6IE5ldyB0YXJnZXRzLgotCSgkKFNITElCKSwgJChTSExJTkspKTogTmV3IHRhcmdldHMuCi0JKCQoT0ZJTEVTKSk6IERlcGVuZCB1cG9uIHN0YW1wLXBpY2Rpci4KLQkoZGlzYXNzZW1ibGUubyk6IEJ1aWxkIHR3aWNlIGlmIFBJQ0ZMQUcgaXMgc2V0LgotCShNT1NUTFlDTEVBTik6IEFkZCBwaWMvKi5vLgotCShjbGVhbik6IFJlbW92ZSAkKFNITElCKSwgJChTSExJTkspLCBwaWNsaXN0LCBhbmQgc3RhbXAtcGljbGlzdC4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIHBpYyBhbmQgc3RhbXAtcGljZGlyLgotCShpbnN0YWxsKTogSW5zdGFsbCBzaGFyZWQgbGlicmFyaWVzLgotCShzdGFtcC1waWNkaXIpOiBOZXcgdGFyZ2V0LgotCi1GcmkgRmViICAyIDE3OjE1OjI1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IERlbGV0ZSBESVNBU01fUkFXX0lOU04gc3VwcG9ydC4KLQlQcmludCB1bmtub3duIGluc3RydWN0aW9uIGFzICJ1bmtub3duIiwgcmF0aGVyIHRoYW4gaW4gaGV4LgotCi1UdWUgSmFuIDMwIDE0OjA2OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWJ1Zi5jOiBJbmNsdWRlICJzeXNkZXAuaCIgYmVmb3JlICJkaXMtYXNtLmgiLgotCi1UaHUgSmFuIDI1IDIwOjI0OjA3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2RlX2FyY2hzKTogTWFyayB2OC9zcGFyY2xpdGUgYXMgY29uZmxpY3RpbmcuCi0KLVRodSBKYW4gMjUgMTE6NTY6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2kzODYpOiBPbmx5IGZldGNoIHRoZSBtb2QvcmVnL3JtIGJ5dGUKLQl3aGVuIG5lY2Vzc2FyeS4gIEZyb20gVWxyaWNoIERyZXBwZXIKLQk8ZHJlcHBlckBteXdhcmUucnoudW5pLWthcmxzcnVoZS5kZT4uCi0KLVRodSBKYW4gMjUgMDM6Mzk6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogTlVNT1BDT0RFUyByZXBsYWNlZCB3aXRoCi0Jc3BhcmNfbnVtX29wY29kZXMuICBVcGRhdGUgYXJjaGl0ZWN0dXJlIGVudW0gdmFsdWVzLgotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZV9hcmNocyk6IFJlcGxhY2VzIGFyY2hpdGVjdHVyZV9wbmFtZS4KLQkoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19udW1fb3Bjb2Rlcyk6IFJlbmFtZWQgZnJvbSBiZmRfc3BhcmNfbnVtX29wY29kZXMuCi0JKHNwYXJjX29wY29kZXMpOiBBZGQgdjlhIHNodXRkb3duIGluc24uCi0KLU1vbiBKYW4gMjIgMDg6Mjk6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogUmVuYW1lZCBmcm9tIHByaW50X2luc24uCi0JSWYgRElTQVNNX1JBV19JTlNOLCBwcmludCBpbnNuIGluIGhleC4gIEhhbmRsZSB2OWEgYXMgb3Bjb2RlCi0JYXJjaGl0ZWN0dXJlLgotCShwcmludF9pbnNuX3NwYXJjNjQpOiBEZWxldGVkLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyLCBjYXNlIGJmZF9hcmNoX3NwYXJjKTogQWx3YXlzIHVzZQotCXByaW50X2luc25fc3BhcmMuCi0KLQkqIHNwYXJjLW9wYy5jIChhcmNoaXRlY3R1cmVfcG5hbWUpOiBBZGQgdjlhLgotCi1GcmkgSmFuIDEyIDE0OjM1OjU4IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQEFaU3Rhck5ldC5jb20+Ci0KLQkqIGFscGhhLW9wYy5oIChhbHBoYV9pbnNuX3NldCk6IFZBWCBmbG9hdGluZyBwb2ludCBvcGNvZGUgd2FzCi0gCWluY29ycmVjdGx5IGRlZmluZWQgYXMgMHgxNiB3aGVuIGl0IHNob3VsZCBiZSAweDE1LgotCShGTE9BVF9GT1JNQVRfTUFTSyk6IGZ1bmN0aW9uIGNvZGUgaXMgMTEgYml0cywgbm90IGp1c3QgNyBiaXRzIQotCShhbHBoYV9pbnNuX3NldCk6IGFkZGVkIGN2dHN0IGFuZCBjdnR0cSBmbG9hdCBvcHMuICBBbHNvIGFkZGVkCi0gCWV4Y2IgKGV4Y2VwdGlvbiBiYXJyaWVyKSB3aGljaCBpcyBkZWZpbmVkIGluIHRoZSBBbHBoYQotIAlBcmNoaXRlY3R1cmUgSGFuZGJvb2sgdmVyc2lvbiAyLgotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBGaXhlZCBzcGVjaWFsLWNhc2UgZGVjb2RpbmcgZm9yCi0gCU9QRVJBVEVfRk9STUFUX0NPREUgdHlwZSBpbnN0cnVjdGlvbnMuICBUaGUgYnVnIGNhdXNlZCBtdWxxIHRvIGJlCi0gCWRpc2Fzc2VtYmxlZCBhcyBvciwgZm9yIGV4YW1wbGUuCi0KLVdlZCBKYW4gMTAgMTI6Mzc6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFByaW50IGNhc2VzICdpJyBhbmQgJ3UnIGluIGhleC4KLQkoX3ByaW50X2luc25fbWlwcyk6IENoYW5nZSBpIGZyb20gaW50IHRvIHVuc2lnbmVkIGludC4KLQotVGh1IEphbiAgNCAxNzoyMToxMCAxOTk2ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiB0bGJpIFBPV0VSIG9wY29kZSBmb3JtIGRpZmZlcmVudAotCWZyb20gdGxiaWUgUG93ZXJQQyBvcGNvZGUuICBBZGQgUFBDNjAzIHRsYmxkIGFuZCB0bGJsaS4KLQotVGh1IERlYyAyOCAxMzoyOToxOSAxOTk1ICBKb2huIEhhc3NleSAgPGhhc3NleUBydHAuZGcuY29tPgotCi0JKiBpMzg2LWRpcy5jOiBBZGRlZCBQZW50aXVtIFBybyBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBEZWMgMTkgMjI6NTY6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKGZzcXJ0eywufSk6IER1cGxpY2F0ZSBmb3IgUG93ZXJQQyBpbiBhZGRpdGlvbiB0bwotCWJlaW5nIGZvciBQb3dlcjIuCi0KLUZyaSBEZWMgMTUgMTQ6MTQ6MTUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUpOiBBZGRlZCBSRUdfQi4KLQkoc2hfYXJnX3R5cGUpOiBBZGRlZCBBX1JFR19CLgotCShzaF90YWJsZSk6IEFkZGVkIHByZWYgYW5kIGJhbmsgcmVnIHZlcnNpb25zIG9mIGxkYywgbGRjLmwsIHN0YwotIAlhbmQgc3RjLmwgb3Bjb2Rlcy4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IEFkZGVkIGNhc2VzIGZvciBSRUdfQiBhbmQgQV9SRUdfQi4KLQotRnJpIERlYyAxNSAxNjo0NDozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCi0KLVR1ZSBEZWMgMTIgMTI6MjI6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIHN0YW1wLWguICBGcm9tIFJvbmFsZAotCUYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotVHVlIERlYyAgNSAxMzo0Mjo0NCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlGcm9tIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+OgotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBmaXhlZCBkZWNvZGluZyBvZiBjcHlzCi0gCWluc3RydWN0aW9uLgotCi1Nb24gRGVjICA0IDEyOjI5OjA1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX2FyZ190eXBlKTogQWRkZWQgQV9TU1IgYW5kIEFfU1BDLgotCShzaF90YWJsZSk6IEFkZGVkIG1hbnkgU0gzIG9wY29kZXMuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBBZGRlZCBjYXNlcyBmb3IgQV9TU1IgYW5kIEFfU1BDLgotCi1GcmkgRGVjICAxIDA3OjQyOjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChzdWJmYy4sIHN1YmZjbyk6IE1hcmsgdGhpcyBQUENDT00sIG5vdCBQUEMuCi0JKHN1YmNvLHN1YmNvLik6IE1hcmsgdGhpcyBQUEMsIG5vdCBQUENDT00uCi0KLU1vbiBOb3YgMjcgMTM6MDk6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjcuCi0KLVR1ZSBOb3YgMjEgMTg6Mjg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCi0KLVdlZCBOb3YgMTUgMTk6MDI6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU29ydCBsaXN0IG9mIGFyY2hpdGVjdHVyZXMuICBBY2NlcHQgYnV0IGRvIG5vdGhpbmcKLQlmb3IgYWxsaWFudCwgY29udmV4LCBweXJhbWlkLCByb21wLCBhbmQgdGFob2UuCi0KLVdlZCBOb3YgIDggMjA6MTg6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhMjlrLWRpcy5jIChwcmludF9zcGVjaWFsKTogQ2hhbmdlIG51bSB0byB1bnNpZ25lZCBpbnQuCi0KLVdlZCBOb3YgIDggMjA6MTA6MzUgMTk5NSAgRXJpYyBGcmV1ZGVudGhhbCA8ZnJldWRlbnRoYWxAbnl1LmVkdT4KLQotCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IENhc3QgaW5zbjI0IHRvIHVuc2lnbmVkIGxvbmcgd2hlbgotCXNoaWZ0aW5nIGl0LgotCi1UdWUgTm92ICA3IDE1OjIxOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1BST0cgdG8gZmluZCBhbmQgY2FjaGUgQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBOb3YgIDYgMTc6Mzk6NDcgMTk5NSAgSGFycnkgRG9sYW4gIDxkb2xhbkBzc2QuaW50ZWwuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjYXNlIGZvciBiZmRfaTg2MF9hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTm92ICAzIDEyOjQ1OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQ29ycmVjdCBmbW92ZW1sIG9wZXJhbmRzLgotCSogbTY4ay1kaXMuYyAoTkVYVFNJTkdMRSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkoTkVYVERPVUJMRSk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX202OGspOiBEb24ndCBtYXRjaCBmbW92ZW1sIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKLQlyZWdpc3RlciBpbiB0aGUgbGlzdC4KLQkocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgYSBwbGFjZSBvZiAnOCcgZm9yIGEgdHlwZSBvZiAnTCcuCi0KLVRodSBOb3YgIDIgMjM6MDY6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBVc2UgI1cgcmF0aGVyIHRoYW4gI3cuCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBuZXcgJ1cnIHBsYWNlLgotCi1XZWQgTm92ICAxIDEzOjMwOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBkYmZ3IGFzIGFuIGFsaWFzIGZvciBkYmYsCi0JYW5kIGxpa2V3aXNlIGZvciBhbGwgdGhlIGRieHggb3Bjb2Rlcy4KLQotTW9uIE9jdCAzMCAyMDo1MDo0MCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogYXJjLWRpcy5jOiBJbmNsdWRlIGVsZi1iZmQuaCByYXRoZXIgdGhhbiBsaWJlbGYuaC4KLQotTW9uIE9jdCAyMyAxMToxMTozNCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogbWlwcy1vcGMuYzogQWRkZWQgc2hvcnRoYW5kIChWMSkgZm9yIElOU05fNDEwMCBtYW5pZmVzdC4gQWRkZWQKLSAJdGhlIFZSNDEwMCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gdGhlIG1pcHNfb3Bjb2RlcyBzdHJ1Y3R1cmUuCi0KLVRodSBPY3QgMTkgMTE6MDU6MjMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluLCBtcHctbWFrZS5zZWQ6IFJlbW92ZSB1Z2x5IHdvcmthcm91bmQgZm9yCi0JdWdseSBNZXRyb3dlcmtzIGJ1ZyBpbiBDVzYsIGlzIGZpeGVkIGluIENXNy4KLQotTW9uIE9jdCAxNiAxMjo1OTowMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAod2hvbGUgZmlsZSk6IEFkZCBmbGFncyBmb3IgY29tbW9uL2FueSBzdXBwb3J0LgotCi1UdWUgT2N0IDEwIDExOjA2OjA3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCi0JKEZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgQklTT04uCi0KLUZyaSBPY3QgIDYgMTY6MjY6NDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBSZWNvZ25pemUgYWxsIHR3by13b3JkCi0JaW5zdHJ1Y3Rpb25zIHRoYXQgdGFrZSBubyBhcmdzIGJ5IGxvb2tpbmcgYXQgdGhlIG1hdGNoIG1hc2suCi0gIAkocHJpbnRfaW5zbl9hcmcpOiBBbHdheXMgcHJpbnQgIiUiIGJlZm9yZSByZWdpc3RlciBuYW1lcy4KLQlbY2FzZSAnYyddOiBVc2UgIm5jIiBmb3IgdGhlIG5vLWNhY2hlIGNhc2UsIGFzIHJlY29nbml6ZWQgYnkgZ2FzLgotCVtjYXNlICdfJ106IERvbid0IHByaW50ICJAIyIgYmVmb3JlIGFkZHJlc3MuCi0JW2Nhc2UgJ0onXTogVXNlICIlcyIgYXMgZm9ybWF0IHN0cmluZywgbm90IHJlZ2lzdGVyIG5hbWUuCi0JW2Nhc2UgJ0InXTogVHJlYXQgcGxhY2UgPT0gJ0MnIGxpa2UgJ2wnIGFuZCAnTCcuCi0KLVRodSBPY3QgIDUgMjI6MTY6MjAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IERlc2NyaWJlIGNtcHhjaGc4YiBvcGVyYW5kLCBhbmQgc3BlbGwgdGhlIG9wY29kZQotCW5hbWUgY29ycmVjdGx5LgotCi1UdWUgT2N0ICAzIDA4OjMwOjIwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlGcm9tIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGFscGhhLW9wYy5oIChNRU1PUllfRlVOQ1RJT05fRk9STUFUX01BU0spOiBhZGRlZC4KLSAgCShhbHBoYV9pbnNuX3NldCk6IGFkZGVkIGRlZmluaXRpb25zIGZvciBWQVggZmxvYXRpbmcgcG9pbnQKLSAJaW5zdHJ1Y3Rpb25zIChVbml4IGNvbXBpbGVycyBkb24ndCBnZW5lcmF0ZSB0aGVzZSwgYnV0IGhhbmRjb2RlZAotIAlhc3NlbWJseSBtaWdodCBzdGlsbCB1c2UgdGhlbSkuCi0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogYWRkZWQgc3VwcG9ydCBmb3IgZGlzYXNzZW1ibGluZwotIAl0aGUgbWlzY2VsbGFuZW91cyBpbnN0cnVjdGlvbnMgaW4gdGhlIEFscGhhIGluc3RydWN0aW9uIHNldC4KLQotVHVlIFNlcCAyNiAxODo0NzoyMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBtNjhrLW9wYy5jLm8gdG8gQkZEX01BQ0hJTkVTIGZvciBtNjhrLAotCW5vIGxvbmdlciBjcmVhdGUgc3lzZGVwLmgsIHNlZCBwcGMtb3BjLmMgdG8gd29yayBhcm91bmQgYQotCXNlcmlvdXMgTWV0cm93ZXJrcyBDIGJ1Zy4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCB1c2VkIGJ5IG1wdy1jb25maWd1cmUgdG8gZWRpdAotCU1ha2VmaWxlLmluIGludG8gYW4gTVBXIG1ha2VmaWxlLgotCi1XZWQgU2VwIDIwIDEyOjU1OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgc3lub255bSBmb3IgcmVhbGNsZWFuLgotCi1UdWUgU2VwIDE5IDE1OjI4OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogU3BsaXQgcG1vdmUgcGF0dGVybnMgd2hpY2ggdXNlICdQJyBpbnRvIHBhdHRlcm5zCi0Jd2hpY2ggdXNlICcwJywgJzEnLCBhbmQgJzInIGluc3RlYWQuICBTcGVjaWZ5IHRoZSBwcm9wZXIgc2l6ZSBmb3IKLQlhIHBtb3ZlIGltbWVkaWF0ZSBvcGVyYW5kLiAgQ29ycmVjdCB0aGUgcG1vdmVmZCBwYXR0ZXJucyB0byBiZQotCW1vdmVzIHRvIGEgcmVnaXN0ZXIsIG5vdCBmcm9tIGEgcmVnaXN0ZXIuCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFJlcGxhY2UgJ1AnIHdpdGggJzAnLCAnMScsICcyJy4KLQotVGh1IFNlcCAxNCAxMTo1ODoyMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IE1hcmsgYWxsIGluc25zIHRoYXQgcmVmZXJlbmNlCi0JJXBzciwgJXdpbSwgJXRiciBhcyBGX05PVFY5LgotCi1GcmkgU2VwICA4IDAxOjA3OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogSnVzdCByZWJ1aWxkIE1ha2VmaWxlIHdoZW4gcnVubmluZwotCWNvbmZpZy5zdGF0dXMuCi0JKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiBhbmQgQUNfQ0FOT05JQ0FMX1NZU1RFTQotCWVhcmxpZXIuICBEb24ndCBib3RoZXIgdG8gY2FsbCBBQ19BUkdfUFJPR1JBTS4gIFRvdWNoIHN0YW1wLWggd2hlbgotCXJlYnVpbGRpbmcgY29uZmlnLmguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIG1pcHMtb3BjLmM6IENoYW5nZSB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcyB3aXRoICJ0LEEiCi0Jb3BlcmFuZHMgdG8gdXNlICJ0LEEoYikiLgotCi1UaHUgU2VwICA3IDE5OjAyOjQ2IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQWRkIEZfRlIwIHN1cHBvcnQuCi0KLVRodSBTZXAgIDcgMTk6MDI6NDYgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBDaGFuZ2UgbG9vcCBvdmVyIG9wLT5hcmdbbl0gdG8gaXRlcmF0ZQotCXVudGlsIDMgaW5zdGVhZCBvZiB1bnRpbCAyLgotCi1XZWQgU2VwICA2IDIxOjIxOjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBEZWZpbmUuCi0JKC5jLm8sIGRpc2Fzc2VtYmxlLm8pOiBVc2UgJChBTExfQ0ZMQUdTKS4KLQkoTU9TVExZQ0xFQU4pOiBBZGQgY29uZmlnLmxvZy4KLQkoZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGNvbmZpZy5sb2cuCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgSERFRklORVMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgIDYgMTU6MDg6MDkgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfYXJnX3R5cGUpOiBBZGQgRl9GUjAuCi0JKHNoX3RhYmxlLCBjYXNlIGZtYWMpOiBBZGQgRl9GUjAgYXMgZmlyc3QgYXJndW1lbnQuCi0KLVdlZCBTZXAgIDYgMTU6MDg6MDkgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfb3Bjb2RlX2luZm8pOiBJbmNyZWFzZSBhcmcgYXJyYXkgc2l6ZSB0byA0LgotCi1UdWUgU2VwICA1IDE4OjI4OjEwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jOiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gTk9fVjkuCi0KLVR1ZSBTZXAgIDUgMjA6MDM6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBKdXN0IGluY2x1ZGUgLi4vYmZkL2FjbG9jYWwubTQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgIDUgMTY6MDk6NTkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKFhfRElTUDE5KTogRGVmaW5lLgotCShwcmludF9pbnNuLCBjYXNlICdHJyk6IFVzZSBpdC4KLQkocHJpbnRfaW5zbiwgY2FzZSAnTCcpOiBTaWduIGV4dGVuZCBkaXNwbGFjZW1lbnQuCi0KLU1vbiBTZXAgIDQgMTQ6Mjg6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJ1biAuLi9iZmQvY29uZmlndXJlLmhvc3QgYmVmb3JlIEFDX1BST0dfQ0MuCi0JU3Vic2l0dXRlIENGTEFHUyBhbmQgQVIuICBDYWxsIEFDX1BST0dfSU5TVEFMTC4gIERvbid0IHN1YnN0aXR1dGUKLQlob3N0X21ha2VmaWxlX2ZyYWcgb3IgZnJhZ3MuCi0JKiBhY2xvY2FsLm00OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9QUk9HUkFNKTogU2V0IHRvIEBJTlNUQUxMX1BST0dSQU1ALgotCShJTlNUQUxMX0RBVEEpOiBTZXQgdG8gQElOU1RBTExfREFUQUAuCi0JKEFSKTogU2V0IHRvIEBBUkAuCi0JKEFSX0ZMQUdTKTogU2V0IHRvIHJjIHJhdGhlciB0aGFuIHFjLgotCShDQyk6IERlZmluZSBhcyBAQ0NALgotCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCi0JKEBob3N0X21ha2VmaWxlX2ZyYWdAKTogUmVtb3ZlLgotCShjb25maWcuc3RhdHVzKTogUmVtb3ZlIGRlcGVuZGVuY3kgdXBvbiBAZnJhZ3NALgotCi0JKiBjb25maWd1cmUuaW46IC4uL2JmZC9jb25maWcuYmZkIG5vdyBqdXN0IHNldHMgc2hlbGwgdmFyaWFibGVzLgotCVVzZSB0aGVtIHJhdGhlciB0aGFuIGxvb2tpbmcgdGhyb3VnaCB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXVnIDMxIDEyOjM1OjMyIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKGZ0cmMpOiBDaGFuZ2UgRlBVTF9OIHRvIEZQVUxfTS4KLQotV2VkIEF1ZyAzMCAxMzo1MjoyOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IERlbGV0ZSBkdXBsaWNhdGUgd3IgJXkgaW5zbi4KLQlBZGQgY2xyeCwgaXByZWZldGNoLCBzaWdueCwgY2xydXcsIGNhcywgY2FzbCwgY2FzeCwgY2FzeGwgc3ludGhldGljCi0Jc3BhcmM2NCBpbnNucy4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggcHJlZmV0Y2hhIGluc24uCi0JKGxvb2t1cF97bmFtZSx2YWx1ZX0pOiBOZXcgZnVuY3Rpb25zLgotCShwcmVmZXRjaF90YWJsZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9wcmVmZXRjaCk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbik6IEhhbmRsZSAnKicgYXJnIChwcmVmZXRjaCBmdW5jdGlvbikuCi0KLVdlZCBBdWcgMzAgMTE6MTE6NTggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaDogQWRkIGJsYW5rIGxpbmVzIHRvIGltcHJvdmUgcmVhZGFiaWxpbHR5IG9mIHNoM2UKLQlpbnN0cnVjdGlvbnMuCi0KLVdlZCBBdWcgMzAgMTE6MDk6MzggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYzogQ29ycmVjdCBjb21tZW50IG9uIGZpcnN0IGxpbmUgb2YgZmlsZS4KLQotVHVlIEF1ZyAyOSAxNTozNzoxOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBIYW5kbGUgYmZkX21hY2hfc3BhcmM2NC4KLQotCSogc3BhcmMtb3BjLmMgKGFzaSwgbWVtYmFyKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV97YXNpLG1lbWJhcn0pOiBOZXcgZnVuY3Rpb25zLgotCShzcGFyY19vcGNvZGVzLCBtZW1iYXIgaW5zbik6IEZpeC4KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuKTogQ2FsbCBzcGFyY19kZWNvZGVfYXNpLgotCVN1cHBvcnQgZGVjb2Rpbmcgb2YgbWVtYmFyIG1hc2tzLgotCShYX01FTUJBUik6IERlZmluZS4KLQotU2F0IEF1ZyAyNiAyMToyMjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgYnIsIGJycywgYnJiLCBicncsIGJybC4KLQotTW9uIEF1ZyAyMSAxNzozMzozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgYmhpYiBhcyBhbiBhbGlhcyBmb3IgYmhpcywKLQlhbmQgbGlrZXdpc2UgZm9yIHRoZSBvdGhlciBicmFuY2hlcy4gIEFkZCBiaHMgYXMgYW4gYWxpYXMgZm9yIGJjYywKLQlhbmQgbGlrZXdpc2UgZm9yIHRoZSBzaXplIHZhcmlhbnRzLiAgQWRkIGRiaHMgYXMgYW4gYWxpYXMgZm9yCi0JZGJjYy4KLQotRnJpIEF1ZyAxMSAxMzo0MDoyNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc2gtb3BjLmggKEZQIHN0cyBpbnN0cnVjdGlvbnMpOiBVcGRhdGUgdG8gbWF0Y2ggcmVhbGl0eS4KLQotTW9uIEF1ZyAgNyAxNjoxMjo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmM6IChmcGNyX25hbWVzKTogQWRkICUgYmVmb3JlIGFsbCByZWdpc3RlciBuYW1lcy4KLQkocmVnX25hbWVzKTogTGlrZXdpc2UuCi0JKHByaW50X2luc25fYXJnKTogRG9uJ3QgZXhwbGljaXRseSBwcmludCAlIGJlZm9yZSByZWdpc3RlciBuYW1lcy4KLQlBZGQgJSBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMgaW4gc3RhdGljIGFycmF5IG5hbWVzLiAgSW4gY2FzZSAncicsCi0JcHJpbnQgZGF0YSByZWdpc3RlcnMgYXMgYEAoRG4pJywgbm90IGBEbkAnLiAgV2hlbiBwcmludGluZyBhCi0JbWVtb3J5IGFkZHJlc3MsIGRvbid0IHByaW50IEAjIGJlZm9yZSBpdC4KLQkocHJpbnRfaW5kZXhlZCk6IENoYW5nZSBiYXNlX2Rpc3AgYW5kIG91dGVyX2Rpc3AgZnJvbSBpbnQgdG8KLQliZmRfdm1hLiAgUHJpbnQgdXNpbmcgTUlUIHN5bnRheCwgbm90IG11dGFudCBpbnZhbGlkIE1vdG9yb2xhCi0Jc3ludGF4LiAgU2lnbiBleHRlbmQgOCBieXRlIGRpc3BsYWNlbWVudCBjb3JyZWN0bHkuCi0JKHByaW50X2Jhc2UpOiBQcmludCB1c2luZyBNSVQgc3ludGF4LiAgUHJpbnQgenBjIHdoZW4gYXBwcm9wcmlhdGUuCi0JQ2hhbmdlIHBhcmFtZXRlciBkaXNwIGZyb20gaW50IHRvIGJmZF92bWEuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQganNybCBhbmQganNycyBhcyBhbGlhc2VzCi0JZm9yIGpzci4KLQotTW9uIEF1ZyAgNyAwMjoyMTo0MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGVzIEZfUkVHX04sCi0JRl9SRUdfTSwgRlBTQ1JfTSwgRlBTQ1JfTiwgRlBVTF9NIGFuZCBGUFVMX04uCi0JKiBzaC1vcGMuaCAoc2hfYXJnX3R5cGUpOiBBZGQgbmV3IG9wZXJhbmQgdHlwZXMuCi0JKHNoX3RhYmxlKTogQWRkIG5ldyBvcGNvZGVzIGZyb20gU0gzRSBGbG9hdGluZyBQb2ludCBJU0EuCi0KLVNhdCBBdWcgIDUgMTY6NTA6MTQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGZpbGUgY29uZmlnLmguCi0KLVNhdCBBdWcgIDUgMTY6NTA6MTQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGZpbGUgY29uZmlnLmguCi0KLVdlZCBBdWcgIDIgMTg6MzM6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBOZXcgZmlsZSwgaG9sZGluZyB0YWJsZXMgZnJvbSBpbmNsdWRlL29wY29kZS9tNjhrLmguCi0JQ2xlYW4gdXAgdGFibGVzLgotCSogbTY4ay1kaXMuYzogUmVtb3ZlIEJSRUFLX1VQX0JJR19ERUNMIHN0dWZmLgotCShvcGNvZGUpOiBSZW1vdmUuCi0JKHByaW50X2luc25fbTY4ayk6IENoYW5nZSBkIHRvIGJlIGNvbnN0LiAgVXNlIG02OGtfbnVtb3Bjb2RlcwotCXJhdGhlciB0aGFuIG51bW9wY29kZXMuICBVc2UgbTY4a19vcGNvZGVzIHJhdGhlciB0aGFuIHJlbW92ZWQKLQlvcGNvZGUgZnVuY3Rpb24uICBEb24ndCBjaGVjayBGX0FMSUFTLgotCShwcmludF9pbnNuX2FyZyk6IENoYW5nZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QgY2hhciAqLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBtNjhrLW9wYy5vLgotCShtNjhrLW9wYy5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbTY4ay1vcGMubyBmb3IgYmZkX202OGtfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEF1ZyAgMiAwODoyMzozOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoSEFTSF9TSVpFLCBIQVNIX0lOU04pOiBEZWZpbmUuCi0JKG9wY29kZV9iaXRzLCBvcGNvZGVfaGFzaF90YWJsZSk6IE5ldyB2YXJpYWJsZXMuCi0JKG9wY29kZXNfaW5pdGlhbGl6ZWQpOiBSZW5hbWVkIGZyb20gb3Bjb2Rlc19zb3J0ZWQuCi0JKGJ1aWxkX2hhc2hfdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKGlzX2RlbGF5ZWRfYnJhbmNoKTogVXNlIGhhc2ggdGFibGUuCi0JKHByaW50X2luc24pOiBSZW5hbWVkIGZyb20gcHJpbnRfaW5zbl9zcGFyYywgbWFkZSBzdGF0aWMuCi0JQnVpbGQgYW5kIHVzZSBoYXNoIHRhYmxlLiAgSWYgIXNwYXJjNjQsIGlnbm9yZSBzcGFyYzY0IGluc25zLAotCWFuZCB2aWNlLXZlcnNhIGlmIHNwYXJjNjQuCi0JKHByaW50X2luc25fc3BhcmMsIHByaW50X2luc25fc3BhcmM2NCk6IE5ldyBmdW5jdGlvbnMuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IE1vdmUgc3BhcmM2NCBvcGNvZGVzIHRvIGVuZC4KLQlQcmludCBjb21tdXRhdGl2ZSBpbnNucyB3aXRoIGNvbnN0YW50IHNlY29uZC4KLQkqIHNwYXJjLW9wYy5jIChhbGwgbm9uLXY5IGluc25zKTogVXNlIGZsYWcgRl9OT1RWOSBpbnN0ZWFkIG9mIEZfQUxJQVMuCi0KLVR1ZSBBdWcgIDEgMDA6MTI6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGRzbG90LiAgVXNlCi0JcHJpbnRfYWRkcmVzc19mdW5jIGZvciBBX0JESVNQMTIgYW5kIEFfQkRJU1A4LiAgQ29ycmVjdCB0ZXN0IHdoaWNoCi0JYXZvaWRzIHByaW50aW5nIGEgZGVsYXkgc2xvdCBpbiBhIGRlbGF5IHNsb3QuCi0JKiBzaC1vcGMuaCAoc2hfdGFibGUpOiBGdWxseSBicmFja2V0IGxhc3QgZW50cnkuCi0KLU1vbiBKdWwgMzEgMTI6MDQ6NDcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNsbHgsIHNyYXgsIHNybHgpOiBGaXggZGlzYXNzZW1ibHkuCi0KLVdlZCBKdWwgMTIgMDA6NTk6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogR2V0IGhvc3RfbWFrZWZpbGVfZnJhZyBmcm9tICR7c3JjZGlyfS4KLQotCSogY29uZmlndXJlLmluOiBBdXRvY29uZmlzY2F0ZWQuICBDaGVjayBmb3Igc3RyaW5nW3NdLmguICBDcmVhdGUKLQljb25maWcuaCBmcm9tIGNvbmZpZy5pbi4gIERvbid0IHNldCB1cCBzeXNkZXAuaCBsaW5rLgotCSogc3lzZGVwLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IE5ldyBmaWxlcywgZ2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgdG8gYmUgcHJvY2Vzc2VkIGF1dG9jb25mLXN0eWxlLgotCShkaXN0Y2xlYW4pOiBLZWVwIHN5c2RlcC5oLiAgUmVtb3ZlIGNvbmZpZy5sb2cgYW5kIGNvbmZpZy5jYWNoZS4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgb24gY29uZmlnLnN0YXR1cy4KLQkoY29uZmlnLnN0YXR1cyk6IE5ldyBydWxlLgotCSogY29uZmlndXJlLmJhdDogVXBkYXRlIE1ha2VmaWxlIHN1YnN0aXR1dGlvbnMuCi0KLVR1ZSBKdWwgMTEgMTQ6MjM6MzcgMTk5NSAgSmVmZiBTcGllZ2VsICA8amVmZnNAbHNpbC5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKEwxKTogRGVmaW5lLgotCShtaXBzX29wY29kZXMpOiBBZGQgUjQwMTAgaW5zdHJ1Y3Rpb25zOiBmbHVzaGksIGZsdXNoZCwgZmx1c2hpZCwKLQlhZGRjaXUsIG1hZGQsIG1hZGR1LCBmZmMsIGZmcywgbXN1YiwgbXN1YnUsIHNlbHNpLCBzZWxzciwgd2FpdGksCi0JYW5kIHdiLgotCi1UdWUgSnVsIDExIDExOjQ5OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogRm9yIHRoZSBtb3ZlIHBzZXVkby1vcCwgcHJlZmVyIGRhZGR1Ci0JaWYgSVNBIDMgYW5kIGFkZHUgb3RoZXJ3aXNlLCByZXBsYWNpbmcgb3IsIHNpbmNlIHNvbWUgTUlQUyBjaGlwcwotCWhhdmUgbXVsdGlwbGUgYWRkIHVuaXRzIGJ1dCBvbmx5IGEgc2luZ2xlIGxvZ2ljYWwgdW5pdC4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogQ2hhbmdlIENSIHRvIHVzZSBhIGJpdHNpemUgb2YgMywKLQlzaGlmdGVkIGJ5IDE4LCB3aXRob3V0IGFueSBpbnNlcnRpb24gb3IgZXh0cmFjdGlvbiBmdW5jdGlvbi4KLQkoaW5zZXJ0X2NyLCBleHRyYWN0X2NyKTogUmVtb3ZlLgotCi1XZWQgSnVuIDIxIDIwOjA1OjM5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnLCBwcmludF9pbmRleGVkKTogUHJpbnQgIiUiIGJlZm9yZQotCXJlZ2lzdGVyIG5hbWVzLgotCi1UaHUgSnVuIDE1IDE3OjIzOjMxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIHNoIGFuZCBpMzg2IGNvbmZpZ3MsIHJlbW92ZSBzcGFyYyBjb25maWcuCi0JKiBzaC1vcGMuaDogQWRkIGNvcHlyaWdodC4KLQotTW9uIEp1biAgNSAwMzozMDo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjcnVuY2gtbTY4ayk6IERlbGV0ZSBleHRyYSB0YXJnZXQgYWNjaWRlbnRhbGx5Ci0JY2hlY2tlZCBpbiBhIHdoaWxlIGFnby4KLQotV2VkIE1heSAyNCAxNjoyMjoxMyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF90YWJsZSk6IEFkZCBTSDMgc3VwcG9ydC4KLQotV2VkIE1heSAyNCAxNDoxNjowOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaDogQWRkZWQgYnNyZiBhbmQgYnJhZi4KLQotV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogYXJtLW9wYy5oIChhcm1fb3Bjb2Rlcyk6IEFkZCA2NC1iaXQgbXVsdGlwbHkgcGF0dGVybnMuICBEZWxldGUKLQlib2d1cyBbbHNdZm17ZWEsZmR9IHBhdHRlcm5zLgotCi0JKiBhcm0tb3BjLmggKGFybV9vcGNvZGVzKTogQ29ycmVjdCB0eXBvcyBpbiBzdG0sIGxkbSwgc3RkLCBhbmQgbGRjLgotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IE1ha2UgR0lWRU4gYSBwYXJhbWV0ZXIsIGRvbid0IHRyeSBhbmQKLQlpbml0aWFsaXplIGl0IGZyb20gbWVtb3J5LiAgTWFrZSBmdW5jdGlvbiBzdGF0aWMuCi0JKHByaW50X2luc25fe2JpZyxsaXR0bGV9X2FybSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIsIGNhc2UgYmZkX2FyY2hfYXJtKTogRGlzYXNzZW1ibGUgZm9yCi0JdGhlIGNvcnJlY3QgZW5kaWFubmVzcy4KLQotTW9uIEFwciAyNCAxNDoxODowNSAxOTk1ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9uaWJibGVfdHlwZSwgc2hfYXJnX3R5cGUpOiByZW1vdmUgdHJhaWxpbmcgLCBmcm9tCi0JZW51bSBsaXN0LgotCi1XZWQgQXByIDE5IDE0OjA3OjAzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAob3Bjb2RlKTogRmluaXNoIGNoYW5nZSBtYWRlIGJ5IEt1bmcgSHN1IG9uIEFwcmlsCi0JMTd0aCwgc28gdGhhdCBpdCBidWlsZHMgYWdhaW4gdXNpbmcgR0NDIGFzIHRoZSBjb21waWxlci4KLQotVHVlIEFwciAxOCAxMjoxNDo1MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2xpdHRsZV9taXBzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbQotCWJmZF9nZXRsMzIgZnJvbSBiZmRfdm1hIHRvIHVuc2lnbmVkIGxvbmcsIGJlY2F1c2UgX3ByaW50X2luc25fbWlwcwotCWV4cGVjdHMgYW4gdW5zaWduZWQgbG9uZywgYW5kIHRoYXQgbWlnaHQgYmUgZmV3ZXIgd29yZHMgb2YKLQlhcmd1bWVudCBzdG9yYWdlIChlLmcuLCBpZiBiZmRfdm1hIGlzIGxvbmcgbG9uZyBvbiBhIDMyLWJpdAotCW1hY2hpbmUpLgotCShwcmludF9pbnNuX2JpZ19taXBzKTogTGlrZXdpc2Ugd2l0aCBiZmRfZ2V0YjMyIHZhbHVlLgotCShfcHJpbnRfaW5zbl9taXBzKTogTm93IHN0YXRpYy4KLQotTW9uIEFwciAxNyAxMjoyMzoyOCAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmM6IFRha2Ugb3V0ICNkZWZpbmUgQlJFQUtfVVBfQklHX0RFQ0wga2x1ZGdlLCBiZWNhdXNlCi0JZ2NjIG1lbW9yeSBob2cgcHJvYmxlbSB3aXRoIGluaXRpYWxpemVyIGlzIGZpeGVkLgotCi1Nb24gQXByIDEwIDE1OjU1OjAxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCU1lcmdlIGluIHN1cHBvcnQgZm9yIE1hYyBNUFcgYXMgYSBob3N0LgotCShPbGQgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0KLQkqIG1wdy1jb25maWcuaW4gKGFyY2huYW1lKTogQ29tcHV0ZSBmcm9tIHRoZSBjb25maWcuCi0JKEJGRF9NQUNISU5FUywgQVJDSERFRlMpOiBQdXQgaW50byBtay50bXAuCi0KLQkqIG1wdy1jb25maWcuaW4gKHRhcmdldF9hcmNoKTogQ29tcHV0ZSBmcm9tIGNhbm9uaWNhbCB0YXJnZXQuCi0JKG02OGssIG1pcHMsIHBvd2VycGMsIHNwYXJjKTogQWRkIGFyY2hpdGVjdHVyZXMuCi0JKiBtcHctbWFrZS5pbiAoZGlzYXNzZW1ibGUuYy5vKTogQWRkLgotCShBTExfQ0ZMQUdTKTogUmVtb3ZlIHNwZWNpYWwgZmxhZ3MgKC1tYzY4MDIwIC1tYzY4ODgxIC1tb2RlbCBmYXIpLgotCi0JKiBtcHctY29uZmlnLmluIChCRkRfTUFDSElORVMpOiBTZXQgdG8gYSBkZWZhdWx0IHZhbHVlLgotCSogbXB3LW1ha2UuaW4gKEJGRF9NQUNISU5FUyk6IFJlbW92ZSB3aXJlZC1pbiB2YWx1ZS4KLQotCSogbXB3LW1ha2UuaW4gKENTRUFSQ0gpOiBBZGQgZXh0cmEtaW5jbHVkZSB0byBzZWFyY2ggcGF0aC4KLQotCSogbXB3LWNvbmZpZy5pbiAodmFyYXJncy5oKTogRG9uJ3QgY3JlYXRlLgotCShzeXNkZXAuaCk6IENyZWF0ZSB1c2luZyBmb3J3YXJkLWluY2x1ZGUuCi0JKiBtcHctbWFrZS5pbiAoQ1NFQVJDSCk6IEFkZCBpbmNsdWRlL21wdyB0byBzZWFyY2ggcGF0aC4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0KLUZyaSBNYXIgMzEgMTQ6MjM6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBQdXQgZW1wdHkgc3RhdGVtZW50IGFmdGVyCi0JZGVmYXVsdCBsYWJlbC4KLQotVHVlIE1hciAyMSAxMDo1MTo0MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAoc2lnbl9leHRlbmQpOiBEZWxldGUsIHJlZHVuZGFudCB3aXRoIGxpYmhwcGEuaCB2ZXJzaW9uLgotCShsb3dfc2lnbl9leHRlbmQpOiBMaWtld2lzZS4KLQkoZ2V0X2ZpZWxkKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQkoc2V0X2ZpZWxkLCBkZXBvc2l0XzE0LCBkZXBvc2l0XzIxKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMTcgMTU6NTU6NTMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jOiBTdXBwb3J0IGZvciBtb3JlIHBlbnRpdW0gb3Bjb2Rlcy4gIEZyb20gR3V5IEhhcnJpcwotCSAgKGd1eUBuZXRhcHAuY29tKS4KLQotVHVlIE1hciAxNCAwMDo1Mjo1NyAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCVNhdCBGZWIgMTEgMTc6MjI6NDEgMTk5NSAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBkaWR5bXVzLnJtaS5kZSkKLQotCSogYWxwaGEtb3BjLmggKE9TRl9BU01DT0RFKTogZGVmaW5lCi0JcHJpbnQgcGFsLWNvZGUgbmFtZXMgYXMgZGVmaW5lZCBpbiBBcHAgQyBvZiB0aGUKLQlBbHBoYSBBcmNoaXRlY3R1cmUgUmVmZXJlbmNlIE1hbnVhbAotCi0JKiBhbHBoYS1kaXMuYzogY2xlYW5lZCB1cCBvdXRwdXQKLQlwcmludCBzdHlsaXplZCBjb2RlIGZvcm1zIGFzIGRlZmluZWQgaW4gQXBwIEEuNC4zIG9mIHRoZQotCUFscGhhIEFyY2hpdGVjdHVyZSBSZWZlcmVuY2UgTWFudWFsCi0KLVdlZCBNYXIgIDggMTU6MjE6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgbmV3IG1pcHM0IGluc3RydWN0aW9ucy4gIERvbid0IHNldCBJTlNOX1JGRSBmb3IKLQlgcmZlJy4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyBhcmd1bWVudCB0eXBlcyAnaCcsICdSJywKLQknTicsIGFuZCAnTScuCi0KLVdlZCBNYXIgIDggMDI6NTQ6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAob3Bjb2RlKTogTmV3IGZ1bmN0aW9uLiAgUmV0dXJucyBhZGRyZXNzIG9mIG9wY29kZQotCXRhYmxlIGVudHJ5IGdpdmVuIGluZGV4LCBldmVuIGlmIHRoZSBvcGNvZGUgdGFibGUgd2FzIHNwbGl0IHRvCi0Jd29yayBhcm91bmQgZ2NjIGJ1Z3MuCi0JKHByaW50X2luc25fbTY4ayk6IENhbGwgb3Bjb2RlIGluc3RlYWQgb2YgcmVmZXJlbmNpbmcgbTY4a19vcGNvZGVzCi0JZGlyZWN0bHkuCi0JKEJSRUFLX1VQX0JJR19ERUNMKTogTWFrZSBzZWNvbmRhcnkgYXJyYXkgc3RhdGljIGFuZCBjb25zdC4KLQkocmVnX25hbWVzKTogTm93IGNvbnN0LgotCShwcmludF9pbnNuX2FyZyk6IEFycmF5cyBjYWNoZUZpZWxkTmFtZSBhbmQgbmFtZXMgbm93IGNvbnN0LgotCShwcmludF9pbmRleGVkKTogQXJyYXkgc2NhbGVzIG5vdyBjb25zdC4KLQotVHVlIE1hciAgNyAxNjo0MToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYzogU29ydCByZWNlbnRseSBhZGRlZCBpbnN0cnVjdGlvbnMgYnkgbWlub3Igb3Bjb2RlCi0JbnVtYmVyIHdpdGhpbiBtYWpvciBvcGNvZGUgbnVtYmVyLgotCi1Nb24gTWFyICA2IDEwOjA0OjM2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jOiBJbmNsdWRlIGxpYmhwcGEuaC4KLQotRnJpIEZlYiAyNCAxOToxNTozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IENoYW5nZSBkbGkgdG8gdXNlIE1fRExJLCBhbmQgYWRkIGRsYS4KLQotTW9uIEZlYiAyMCAyMzo1NDozOCAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiAgQWRkIHc2NS1kaXMuby4KLQotVGh1IEZlYiAxNiAxNzozNDo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCByNDY1MCBtdWwgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBGZWIgMTUgMTU6NDU6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgdWxkIGFuZCB1c2QgbWFjcm9zIGZvciB1bmFsaWduZWQgZG91YmxlIGxvYWQgYW5kCi0gICAgICAgIHN0b3JlLgotCi1UdWUgRmViIDE0IDEzOjE3OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBBZGQgNDAzR0Egb3Bjb2RlcyByZmNpLCBkY2NjaSwKLQltZmRjciwgbXRkY3IsIGljYnQsIGljY2NpLgotCi1UaHUgRmViICA5IDEyOjI4OjEzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogaTk2MC1kaXMuYyAoc3RydWN0IHRhYmVudCwgc3RydWN0IHNwYXJzZV90YWJlbnQpOiBDaGFuZ2UgdGhlCi0gICAgICAgIHNpZ25lZCBjaGFyIGZpZWxkcyB0byBzaG9ydHMsIG1vcmUgcG9ydGFibGUuCi0KLVdlZCBGZWIgIDggMTc6Mjk6MjkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBpOTYwLWRpcy5jIChzdHJ1Y3QgdGFiZW50LCBzdHJ1Y3Qgc3BhcnNlX3RhYmVudCk6IERlY2xhcmUgdGhlCi0gICAgICAgIGNoYXIgZmllbGRzIGFzIHNpZ25lZCBjaGFycywgc2luY2UgdGhleSBtYXkgaGF2ZSBuZWdhdGl2ZSB2YWx1ZXMuCi0KLU1vbiBGZWIgIDYgMTA6NTI6MDYgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZfdHdvYnl0ZSk6IEFkZCBjcHVpZCwgRnJvbSBDaGFybGVzIEhhbm51bQotCSAgKG15Y3JvZnRAbmV0YnNkLm9yZykuCi0KLU1vbiBKYW4gMzAgMTI6Mzg6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSAiTG9nZywgRWQiIDxlbG9nZ0BlYS5jb20+OgotCSogcHBjLW9wYy5jIChleHRyYWN0X2JkbSk6IENvcnJlY3QgcGFyZW50aGV6aXNhdGlvbi4KLQkqIHBwYy1kaXMuYyAocHJpbnRfaW5zbl9wb3dlcnBjKTogUHJpbnQgLmxvbmcgYmVmb3JlIHVucmVjb2duaXplZAotCXZhbHVlLgotCi1UaHUgSmFuIDI2IDE4OjMyOjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jOiBDaGFuZ2VzIGJhc2VkIG9uIHBhdGNoIGZyb20gRGF2aWQgRWRlbHNvaG4KLQk8ZWRlbHNvaG5AbWhwY2MuZWR1Pi4KLQkocG93ZXJwY19vcGVyYW5kcyk6IEFkZCBvcGVyYW5kcyBTUFJCQVQgYW5kIFNQUkcuIFNwbGl0IFRCUiBvdXQgb2YKLQlTUFIuCi0JKEZYTV9NQVNLKTogRGVmaW5lLgotCShpbnNlcnRfdGJyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZXh0cmFjdF90YnIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShYRlhGWE1fTUFTSywgWEZYTSk6IERlZmluZS4KLQkoWFNQUkJBVF9NQVNLLCBYU1BSR19NQVNLKTogRGVmaW5lLgotCShwb3dlcnBjX29wY29kZXMpOiBBZGQgaW5zdHJ1Y3Rpb25zIHRvIGFjY2VzcyBzcGVjaWFsIHJlZ2lzdGVycyBieQotCW5hbWUuICBBZGQgbXRjciBhbmQgbWZ0YnUuCi0KLVR1ZSBKYW4gMTcgMTA6NTY6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChQMyk6IERlZmluZS4KLQkobWlwc19vcGNvZGVzKTogQWRkIG1hZCBhbmQgbWFkdS4KLQotU3VuIEphbiAxNSAxNjozMjo1OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29uZmlndXJlLmluOiBBZGQgVzY1IHN1cHBvcnQuCi0JKiBkaXNhc3NlbWJsZS5jOiBMaWtld2lzZS4KLQkqIHc2NS1vcGMuaCwgdzY1LWRpcy5jOiBOZXcgZmlsZXMuCi0KLVdlZCBEZWMgMjggMjI6MTU6MzMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciAyIGJpdAotCWltbWVkaWF0ZXMuCi0KLVR1ZSBEZWMgMjAgMTE6MjU6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgZGxpIGFzIGEgc3lub255bSBmb3IgbGkuCi0KLVRodSBEZWMgIDggMTg6MjM6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBIYW5kbGUgY2FsbF9wYWwgaW5zdHJ1Y3Rpb24sIGFuZAotCXByaW50IHNvbWV0aGluZyBmb3IgcmVzZXJ2ZWQgb3Bjb2RlIHZhbHVlcywgZXZlbiBpZiBpdCB3b24ndAotCWFzc2VtYmxlIGFnYWluLgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogV2hlbiBpbml0aWFsaXppbmcsIHNoaWZ0IHJpZ2h0Ci0JYW5kIG1hc2ssIHRvIGF2b2lkIHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zIG9uIHRoZSBBbHBoYS4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcsIGNhc2UgJ0onKTogSGFuZGxlIGJ1c2NyIGFuZCBwY3IKLQljb250cm9sIHJlZ2lzdGVycy4KLQotV2VkIE5vdiAyMyAyMjozNDo1MSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBzaC1vcGMuaCAobW92LmwgZ2JyKTogR2V0IGRpcmVjdGlvbiByaWdodC4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfaW5zbl9zaGwsIHByaW50X2luc25fc2gpOiBDYWxsIHByaW50X2luc25fc2h4IHRvCi0JcHJpbnQgb3Bjb2RlcyB3aXRoIHJpZ2h0IGJ5dGUgb3JkZXIuCi0KLVRodSBOb3YgIDMgMTk6MzI6MjIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbnMzMmstZGlzLmMgKHN0cnVjdCBuczMya19vcHRpb24pOiBSZW5hbWVkIGZyb20gc3RydWN0IG9wdGlvbiwKLQl0byBhdm9pZCBjb25mbGljdHMgd2l0aCBnZXRvcHQuCi0KLU1vbiBPY3QgMzEgMTg6NDg6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBSZWFkIHRoZSBpbnN0cnVjdGlvbiB1c2luZwotCWJmZF9nZXRiMzIsIHNvIHRoYXQgaXQgd29ya3Mgb24gYSBsaXR0bGUgZW5kaWFuIG9yIDY0IGJpdCBob3N0LgotCVJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgb3AuCi0KLVR1ZSBPY3QgMjUgMTc6MDc6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBVc2Ugb3IgaW5zdGVhZCBvZiBhZGR1IGZvciBwc2V1ZG8tb3AgbW92ZSwgc2luY2UKLQlhZGR1IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IGlmIC1taXBzMy4KLQotV2VkIE9jdCAxOSAxMzo0MDoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGEyOWstZGlzLmMgKHByaW50X3NwZWNpYWwpOiBBZGQgc3BlY2lhbCByZWdpc3RlciBuYW1lcyBkZWZpbmVkCi0Jb24gMjkwMzAsIDI5MDQwIGFuZCAyOTA1MC4KLQkocHJpbnRfaW5zbik6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlICdJJy4KLQotV2VkIE9jdCAxMiAxMTo1OTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlIHRvcCBsZXZlbCBpbnN0YWxsLnNoIHNjcmlwdC4KLQotV2VkIE9jdCAgNSAxOToxNjoyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jOiBSZXdyaXRlIHRvIHVzZSBiaXRmaWVsZHMsIHJhdGhlciB0aGFuIGEgdW5pb24sIHNvCi0JdGhhdCBpdCB3b3JrcyBvbiBhIGxpdHRsZSBlbmRpYW4gaG9zdC4KLQotVHVlIE9jdCAgNCAxMjoxNDoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgY29uZmlnLmJmZC4KLQotV2VkIFNlcCAyMSAxODo0OToxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6ICJkYWJzIiBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIC1taXBzMy4KLQotVGh1IFNlcCAxNSAxNjozMDoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMgKHByaW50X2luc24pOiBQcmludCB0aGUgb3Bjb2RlLgotCi1XZWQgU2VwIDE0IDE3OjUyOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogU2V0IFdSX3QgZm9yIHNjIGFuZCBzY2QuCi0KLVN1biBTZXAgMTEgMjI6MzI6MTcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHJlZ19uYW1lcyk6IFVzZSByMjYtcjIzIGZvciBhcmcwLWFyZzMuCi0KLVR1ZSBTZXAgIDYgMTE6Mzc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBTZXQgSU5TTl9TVE9SRV9NRU1PUlkgZmxhZyBmb3IgYWxsIGluc3RydWN0aW9ucwotCXdoaWNoIHN0b3JlIGEgdmFsdWUgaW50byBtZW1vcnkuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgZGlzYXNzZW1ibGUuYzogQWRkIHN1cHBvcnQgZm9yIHRoZSBBUk0uCi0JKiBhcm0tZGlzLmMsIGFybS1vcGMuaDogTmV3IGZpbGVzLgotCi1GcmkgQXVnICA1IDE0OjAwOjA1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG5zMzJrLWRpcy5vKTogQWRkIGRlcGVuZGVuY3kuCi0JKiBuczMyay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBEZWNsYXJlIGluaXRpYWxpemVkIGxvY2FsIGFzCi0Jc3RyaW5nLCBub3QgYXMgYXJyYXkgb2YgY2hhcnMuCi0KLVRodSBKdWwgMjggMTg6MTQ6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSAneCcuCi0KLQkqIHNwYXJjLW9wYy5jOiBBZGRlZCBzcGFyY2xpdGUgZXh0ZW5kZWQgRlAgb3BlcmF0aW9ucywgYW5kCi0JdmVyc2lvbnMgb2YgdjkgaW1wZGVwKiBpbnN0cnVjdGlvbnMgcGVybWl0dGluZyBzcGVjaWZpY2F0aW9uIG9mCi0JdGhlIE9QRiBmaWVsZC4KLQotVHVlIEp1bCAyNiAxNjozNjowMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChyZWdfbmFtZXMpOiBOb3cgY29uc3QuCi0JKHN0cnVjdCBzcGFyc2VfdGFiZW50KTogTmV3IHR5cGUsIGNvcGllZCBmcm9tIGFycmF5IHR5cGUgaW4gbWVtCi0JZnVuY3Rpb24uCi0JKGN0cmwpOiBMb2NhbCBzdGF0aWMgYXJyYXkgY3RybF90YWIgbm93IGNvbnN0LgotCShjb2JyKTogTG9jYWwgc3RhdGljIGFycmF5IGNvYnJfdGFiIG5vdyBjb25zdC4KLQkobWVtKTogTG9jYWwgdmFyaWFibGVzIHJlZzEsIHJlZzIsIHJlZzMgbm93IHBvaW50IHRvIGNvbnN0LiAgTG9jYWwKLQlzdGF0aWMgdmFyaWFibGUgbWVtX3RhYiBubyBsb25nZXIgZXhwbGljaXRseSBpbml0aWFsaXplZC4gIENoYW5nZWQKLQltZW1faW5pdCB0byBjb25zdCBhcnJheSBvZiBzdHJ1Y3Qgc3BhcnNlX3RhYmVudC4KLQkocmVnKTogTG9jYWwgc3RhdGljIHZhcmlhYmxlIHJlZ190YWIgbm8gbG9uZ2VyIGV4cGxpY2l0bHkKLQlpbml0aWFsaXplZC4gIENoYW5nZWQgcmVnX2luaXQgdG8gY29uc3QgYXJyYXkgb2Ygc3RydWN0Ci0Jc3BhcnNlX3RhYmVudC4KLQkoZWEpOiBMb2NhbCBzdGF0aWMgYXJyYXkgc2NhbGVfdGFiIG5vdyBjb25zdC4KLQotCSogaTk2MC1kaXMuYyAocmVnKTogQWRkZWQgaTk2MEpYIGluc3RydWN0aW9ucyB0byByZWdfaW5pdCB0YWJsZS4KLQkoUkVHX01BWCk6IFVwZGF0ZWQuCi0KLVR1ZSBKdWwgMTkgMjE6MDA6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB0aGUgZGlzYXNzZW1iZXIgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IKLQkib2JqZHVtcCAtZCIgdG8gd29yayBpbiBkamdwcC4KLQotV2VkIEp1bCAxMyAxODowMTo1OCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBuczMyay1kaXMuYzogRGVsZXRlZCBhbGwgY29kZSBpbiAiI2lmZGVmIEdEQiIuCi0JKGludmFsaWRfZmxvYXQpOiBFbmFibGVkIGdlbmVyYWwgdmVyc2lvbiwgZG9lc24ndCByZXF1aXJlIHJ1bm5pbmcKLQlvbiBuczMyayBob3N0LiAgQ2hhbmdlZCB0byB0YWtlIGNoYXIqIGFyZ3VtZW50LCBhbmQgdGVzdCBmb3IKLQlleHBsaWNpdGx5IHNwZWNpZmllZCBzaXplcywgaW5zdGVhZCBvZiB1c2luZyBzaXplb2YoKSBvbiBob3N0IENQVQotCXR5cGVzLgotCShJTlZBTElEX0ZMT0FUKTogQ2FzdCBmaXJzdCBhcmd1bWVudC4KLQkob3B0X3UsIG9wdF9VLCBvcHRfTywgb3B0X0MsIG9wdF9TLCBsaXN0X1A1MzIsIGxpc3RfTTUzMiwKLQlsaXN0X1AwMzIsIGxpc3RfTTAzMik6IE5vdyBjb25zdC4KLQkob3B0bGlzdCwgbGlzdF9zZWFyY2gpOiBNYWRlIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBub3cgcG9pbnQgdG8KLQljb25zdC4KLQkocHJpbnRfaW5zbl9hcmcpOiBDaGFuZ2VkIHN0YXRpYyBhcnJheSBvZiBvbmUtY2hhcmFjdGVyLXN0cmluZwotCXBvaW50ZXJzIGludG8gYSBzdGF0aWMgY29uc3QgYXJyYXkgb2YgY2hhcmFjdGVyczsgZml4ZWQgc3ByaW50ZgotCXN0YXRlbWVudCBhY2NvcmRpbmdseS4KLQotU3VuIEp1bCAxMCAwMDoyNzo0NyAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogb3Bjb2Rlcy9uczMyay1kaXMuYzogU2VtaS1uZXcgZmlsZS4gIEhhZCBhcHBhcmVudGx5IGJlZW4gZHJvcHBlZAotCWZyb20gZGlzdHJpYnV0aW9uLiBBIG5zMzJrLWRpcy5jIGZyb20gYSBwcmV2aW91cyBkaXN0cmlidXRpb24gaGFzCi0JYmVlbiBicm91Z2h0IHVwIHRvIGRhdGUgYW5kIHN1cHBvcnRzIHRoZSBuZXcgaW50ZXJmYWNlLgotCi0JKiBkaXNhc3NlbWJsZS5jOiBkZWZpbmUgQVJDSF9uczMyayBhbmQgYWRkIGNhc2UgYmZkX2FyY2hfbnMzMmsuCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGJmZF9uczMya19hcmNoIHRhcmdldCBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIG5zMzJrLWRpcy5vIHRvIEFMTF9NQUNISU5FUy4KLQlBZGQgbnMzMmstZGlzLmMgdG8gQ0ZJTEVTLiBBZGQgZGVwZW5kZW5jaWVzIGZvciBuczMyay1kaXMuby4KLQotV2VkIEp1biAyOSAyMjoxMDozNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogR2V0IDE2Yml0IGJyYW5jaAotCWRpc2Fzc2VtYmx5IHJpZ2h0LgotCi1UdWUgSnVuIDI4IDEzOjIyOjA2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMsIG1pcHMtZGlzLmM6IERvbid0IHVzZSB0cnVlIGFuZCBmYWxzZS4KLQotVGh1IEp1biAyMyAxMjo1MzoxOSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMuCi0KLVdlZCBKdW4gMjIgMTM6Mzg6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogQnVpbGQgYSBzdGF0aWMgaGFzaCB0YWJsZSBtYXBwaW5nCi0Jb3Bjb2RlcyB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd2l0aCB0aGF0IG9wY29kZSwgdG8gc3BlZWQKLQlkaXNhc3NlbWJseSBvZiBsYXJnZSBmaWxlcy4gIEZyb20gcmFscGhjQHB5cmFtaWQuY29tIChSYWxwaAotCUNhbXBiZWxsKS4KLQotVHVlIEp1biAgNyAxMjo0OTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IEZpeCB0eXBvICh3YXMgbW9zdHljbGVhbikuCi0KLVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgdG8gbGF0ZXN0IG1ha2VmaWxlLmluCi0KLVNhdCBNYXkgIDcgMTc6MTM6MjEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IFByaW50ICd4JyB0eXBlIG9wZXJhbmQgaW4gaGV4LgotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFByaW50IDE2Yml0IHJlbHMgY29ycmVjdGx5LgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2gpOiBEb24ndCByZWN1ciBlbmRsZXNzbHkgaWYgZGVsYXkKLQlzbG90IGluc24gaXMgaW4gYSBkZWxheSBzbG90LgotCSogejhrLW9wYy5oOiAocmVzZmxnKTogRml4IHBhdHRlcm5zLgotCSogaDg1MDAtb3BjLmggRml4IENSIGluc24gcGF0dGVybnMuCi0KLUZyaSBNYXkgIDYgMTQ6MzQ6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IFB1dCBQb3dlclBDIHZlcnNpb25zIG9mICJjbXAiIGFuZAotCSJjbXBsIiBiZWZvcmUgUE9XRVIgdmVyc2lvbnMsIHNvIHRoYXQgZ2FzIC1tYW55IHVzZXMgdGhlbS4KLQotVGh1IEFwciAyOCAxODozMjozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBkaXNhc3NlbWJsZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChPRklMRVMpOiBBZGQgZGlzYXNzZW1ibGUuby4KLQkoZGlzYXNzZW1ibGUubyk6IFByb3ZpZGUgZGVwZW5kZW5jaWVzOyBjb21waWxlIHdpdGggJChBUkNIREVGUykuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBBUkNIREVGUyBpbiBNYWtlZmlsZS4gIENvZGUgdGFrZW4gZnJvbQotCWJpbnV0aWxzL2NvbmZpZ3VyZS5pbi4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogSWYgRl9BTElBUyBmbGFnIGlzIHNldCwgc2tpcCB0aGUKLQlvcGNvZGUgYmVpbmcgZXhhbWluZWQuCi0KLVRodSBBcHIgMjEgMTc6MDg6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBBZGRlZCBSQUwsIFJBTSBhbmQgUkFTLgotCShpbnNlcnRfcmFsLCBpbnNlcnRfcmFtLCBpbnNlcnRfcmFzKTogTmV3IGZ1bmN0aW9ucy4KLQkocG93ZXJwY19vcGNvZGVzKTogVXNlIFJBTCBmb3IgbG9hZCB3aXRoIHVwZGF0ZSwgUkFNIGZvciBsbXcsIGFuZAotCVJBUyBmb3Igc3RvcmUgd2l0aCB1cGRhdGUuCi0KLVNhdCBBcHIgMTYgMjM6NDE6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IENvcnJlY3QgZmNpci4gIEZyb20gRGF2aWQgRWRlbHNvaG4KLQkoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KS4KLQotV2VkIEFwciAgNiAxNzoxMTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6IENvcnJlY3Qgb3BlcmFuZHMgb2YgIm5vciIgd2l0aCBhbgotCWltbWVkaWF0ZSBhcmd1bWVudC4KLQotTW9uIEFwciAgNCAxNjozMDo0NiAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCAicmQgJWZwcnMsJWwwIi4KLQotTW9uIEFwciAgNCAxMzoyMjowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IFRoZSBzaWduZWRwIGZpZWxkIGhhcyBiZWVuCi0JcmVtb3ZlZCwgc28gZG9uJ3QgaW5pdGlhbGl6ZSBpdC4gIFNldCB0aGUgUFBDX09QRVJBTkRfU0lHTkVEIGZsYWcKLQlpbnN0ZWFkLiAgQWRkIG5ldyBvcGVyYW5kIFNJU0lHTk9QVC4KLQkocG93ZXJwY19vcGNvZGVzKTogRm9yIGxpcywgbGl1LCBhZGRpcywgYW5kIGNhdSB1c2UgU0lTSUdOT1BULgotCUJhc2VkIG9uIHBhdGNoIGZyb20gRGF2aWQgRWRlbHNvaG4gKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkuCi0JKiBwcGMtZGlzLmMgKHByaW50X2luc25fcG93ZXJwYyk6IENoZWNrIFBQQ19PUEVSQU5EX1NJR05FRCByYXRoZXIKLQl0aGFuIHNpZ25lZHAgZmllbGQuCi0KLVdlZCBNYXIgMzAgMDA6MzE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpMzg2LWRpcy5jIChzdHJ1Y3QgcHJpdmF0ZSk6ICBSZW5hbWVkIHRvIGRpc19wcml2YXRlLiBgcHJpdmF0ZScKLQlpcyBhIHJlc2VydmVkIHdvcmQgZm9yIGR5bml4IGNjLgotCi1Nb24gTWFyIDI4IDEzOjAwOjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSB0byByZWZlciB0byBiZmQvY29uZmlnLmJmZAotCXJhdGhlciB0aGFuIGJmZC9jb25maWd1cmUuaW4uCi0KLU1vbiBNYXIgMjggMTI6Mjg6MzAgMTk5NCAgRGF2aWQgRWRlbHNvaG4gIChlZGVsc29obkBucGFjLnN5ci5lZHUpCi0KLQkqIHBwYy1vcGMuYzogRGVmaW5lIFBPV0VSMiBhcyBzaG9ydCBhbGlhcyBmbGFnLgotCShwb3dlcnBjX29wY29kZXMpOiBBZGQgUE9XRVIvMiBvcGNvZGVzIGxmcSosIHN0ZnEqLCBmY2lyW3pdLCBhbmQKLQlmc3FydC4KLQotV2VkIE1hciAyMyAxMjoyMzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IERvbid0IHJlYWQgYSBzZWNvbmQgd29yZCBmb3IKLQlvcGNvZGVzIDAsIDEsIDIgYW5kIDMuCi0KLVdlZCBNYXIgMTYgMTU6Mzc6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG02ODg4MS1leHQubyBmb3IgYmZkX202OGtfYXJjaC4KLQotTW9uIE1hciAxNCAxNDo1Mzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG02ODg4MS1leHQuYzogUmVtb3ZlZDsgbm8gbG9uZ2VyIHVzZWQuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQotCSogbTY4ay1kaXMuYyAoZXh0X2Zvcm1hdF82ODg4MSk6IERvbid0IGRlY2xhcmUuCi0JKHByaW50X2luc25fbTY4ayk6IElmIGFuIGluc3RydWN0aW9uIHVzZXMgcGxhY2UgJ2knLCBpdCB1c2VzIGF0Ci0JbGVhc3QgZm91ciBmaXhlZCBieXRlcy4KLQkocHJpbnRfaW5zbl9hcmcpOiBEb24ndCBidW1wIHAgYnkgMiBmb3IgY2FzZSAnSScsIHBsYWNlICdpJy4gIEZvcgotCWV4dGVuZGVkIGZsb2F0LCBjb252ZXJ0IHRvIGRvdWJsZSB1c2luZyBmbG9hdGZvcm1hdF90b19kb3VibGUsIG5vdAotCWllZWVfZXh0ZW5kZWRfdG9fZG91YmxlLCBhbmQgZmV0Y2ggdGhlIGRhdGEgYmVmb3JlIGNvbnZlcnRpbmcgaXQuCi0KLVR1ZSBNYXIgIDggMTg6MTI6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBJdCdzIHNxcnQucywgbm90IHNxcnQudy4gIEZyb20KLQlkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pLgotCi1UdWUgRmViICA4IDE2OjU1OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBUaGUgUE9XRVIgdXNlcyBiZG5bbF1bYV0gd2hlcmUgdGhlCi0JUG93ZXJQQyB1c2VzIGJkbnpbbF1bYV0uCi0KLVR1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBkaXMtYnVmLmMsIGkzODYtZGlzLmM6ICBJbmNsdWRlIHN5c2RlcC5oLgotCi1Nb24gRmViICA3IDE5OjIyOjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChiZmRfcG93ZXJwY19hcmNoKTogVXNlIHBwYy1kaXMubyBhbmQgcHBjLW9wYy5vLgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IE1hcmsgUE9XRVIgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZAotCWJ5IE1vdG9yb2xhIFBvd2VyUEMgNjAxIHdpdGggUFBDX09QQ09ERV82MDEuCi0JKiBwcGMtZGlzLmMgKHByaW50X2luc25fYmlnX3Bvd2VycGMsIHByaW50X2luc25fbGl0dGxlX3Bvd2VycGMpOgotCURpc2Fzc2VtYmxlIE1vdG9yb2xhIFBvd2VyUEMgNjAxIGluc3RydWN0aW9ucyBhcyB3ZWxsIGFzIG5vcm1hbAotCVBvd2VyUEMgaW5zdHJ1Y3Rpb25zLgotCi1TdW4gRmViICA2IDA3OjQ1OjE3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChyZWcsIG1lbSk6IEp1c3QgdXNlIGEgc3RhdGljIGFycmF5IGluc3RlYWQgb2YKLQljYWxsaW5nIHhtYWxsb2MuCi0KLVNhdCBGZWIgIDUgMDA6MDQ6MDIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEZvciAnPycgYW5kICdAJyBvbmx5IGFkanVzdCB0aGUKLQljb25kaXRpb24gbmFtZSBpbmRleCBpZiB0aGlzIGlzIGZvciBhIG5lZ2F0ZWQgY29uZGl0aW9uLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBObyBzcGFjZSBiZWZvcmUgJ0gnIG9wZXJhbmQuCi0JRmxvYXRpbmcgcG9pbnQgZm9ybWF0IGZvciAnSCcgb3BlcmFuZCBpcyBiYWNrd2FyZHMgZnJvbSBub3JtYWwKLQljYXNlICgwID09IGRvdWJsZSwgMSA9PSBzaW5nbGUpLiAgRm9yICc0JywgJzYnLCAnNycsICc5JywgYW5kICc4JwotCW9wZXJhbmRzIChmbXB5YWRkIGFuZCBmbXB5c3ViKSwgaGFuZGxlIGJpemFycmUgcmVnaXN0ZXIKLQl0cmFuc2xhdGlvbiBjb3JyZWN0bHkgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm9ybWF0LgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBEbyBub3QgZW1pdCBhIHNwYWNlIGFmdGVyICdGJwotCW9yICdJJyBvcGVyYW5kcyBpZiB0aGUgbmV4dCBmb3JtYXQgc3BlY2lmaWVyIGlzICdNJyAoZmNtcAotCWNvbmRpdGlvbiBjb21wbGV0ZXIpLgotCi1GZWIgIDQgMjM6Mzg6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBOZXcgb3BlcmFuZCB0eXBlIE1CRSB0byBoYW5kbGUgYQotCXNpbmdsZSBudW1iZXIgZ2l2aW5nIGEgYml0bWFzayBmb3IgdGhlIE1CIGFuZCBNRSBmaWVsZHMgb2YgYW4gTQotCWZvcm0gaW5zdHJ1Y3Rpb24uICBDaGFuZ2UgTkIgdG8gYWNjZXB0IDMyLCBhbmQgdHVybiBpdCBpbnRvIDA7Ci0JYWxzbyB0dXJuIDAgaW50byAzMiB3aGVuIGRpc2Fzc2VtYmxpbmcuICBTZXBlcmF0ZWQgU0ggZnJvbSBOQi4KLQkoaW5zZXJ0X21iZSwgZXh0cmFjdF9tYmUpOiBOZXcgZnVuY3Rpb25zLgotCShpbnNlcnRfbmIsIGV4dHJhY3RfbmIpOiBOZXcgZnVuY3Rpb25zLgotCShTQ19NQVNLKTogTWFzayBvdXQgU0EgYW5kIExLIGJpdHMuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IENoYW5nZSAiY2FsIiB0byB1c2UgUlQsIEQsIFJBIHJhdGhlciB0aGFuIFJULAotCVJBLCBTSS4gIENoYW5nZSAibGl1IiBhbmQgImNhdSIgdG8gdXNlIFVJIHJhdGhlciB0aGFuIFNJLiAgTWFyawotCSJiY3RyIiBhbmQgImJjdHJsIiBhcyBhY2NlcHRlZCBieSBQT1dFUi4gIENoYW5nZSAicmx3aW1pIiwKLQkicmxpbWkiLCAicmx3aW1pLiIsICJybGltaS4iLCAicmx3aW5tIiwgInJsaW5tIiwgInJsd2lubS4iLAotCSJybGlubS4iLCAicmxtaSIsICJybG1pLiIsICJybHdubSIsICJybG5tIiwgInJsd25tLiIsICJybG5tLiIgdG8KLQl1c2UgTUJFIHJhdGhlciB0aGFuIE1CLiAgQWRkICJtZm1xIiBhbmQgIm10bXEiIFBPV0VSIGluc3RydWN0aW9ucy4KLQkocG93ZXJwY19tYWNyb3MpOiBEZWZpbmUgdGFibGUgb2YgbWFjcm8gZGVmaW5pdGlvbnMuCi0JKHBvd2VycGNfbnVtX21hY3Jvcyk6IERlZmluZS4KLQotCSogcHBjLWRpcy5jIChwcmludF9pbnNuX3Bvd2VycGMpOiBEb24ndCBza2lwIG9wdGlvbmFsIG9wZXJhbmRzCi0JaWYgUFBDX09QRVJBTkRfTkVYVCBpcyBzZXQuCi0KLVNhdCBKYW4gMjIgMjM6MTA6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBNYWtlIGJ1ZmZlciBiZmRfYnl0ZSBpbnN0ZWFkIG9mCi0JY2hhci4gIFJldHJpZXZlIGNvbnRlbnRzIHVzaW5nIGJmZF9nZXRsMzIgaW5zdGVhZCBvZiBzaGlmdGluZy4KLQotRnJpIEphbiAyMSAxOTowMTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYzogTmV3IGZpbGUuICBPcGNvZGUgdGFibGUgZm9yIFBvd2VyUEMsIGluY2x1ZGluZwotCW9wY29kZXMgZm9yIFBPV0VSIChSUy82MDAwKS4KLQkqIHBwYy1kaXMuYzogTmV3IGZpbGUuICBQb3dlclBDIGFuZCBQb3dlciAoUlMvNjAwMCkgZGlzYXNzZW1ibGVyLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBwcGMtZGlzLm8gYW5kIHBwYy1vcGMuby4KLQkoQ0ZJTEVTKTogQWRkIHBwYy1kaXMuYy4KLQkocHBjLWRpcy5vLCBwcGMtb3BjLm8pOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgcHBjLWRpcy5vIGFuZCBwcGMtb3BjLm8gZm9yIGJmZF9yczYwMDBfYXJjaC4KLQotTW9uIEphbiAxNyAyMDowNTo0OSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdOJyBpbiBhc3NlbWJsZXIgdGVtcGxhdGUuCi0JTm8gc3BhY2UgYmVmb3JlICd1JywgJ2YnLCBvciAnTicuCi0KLVN1biBKYW4gMTYgMTQ6MjA6MTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTM4Nik6IEFkZCBGSVhNRSBjb21tZW50IHJlZ2FyZGluZyByZWFkaW5nCi0JZmFydGhlciB0aGFuIHdlIHNob3VsZC4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2KTogVXNlIFliIGFuZCBZdiBmb3Igc2Nhc2IgYW5kIHNjYXNTLgotCi1UaHUgSmFuICA2IDEyOjM4OjA1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmMgbTY4ay1kaXMuYyBhbHBoYS1kaXMuYyBhMjlrLWRpcy5jOiBGaXggY29tbWVudHMuCi0KLVdlZCBKYW4gIDUgMTE6NTY6MjEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBPbmx5IHJlYWQgd29yZDIgaWYgdGhlIGluc3RydWN0aW9uCi0JbmVlZHMgaXQsIHRvIHByZXZlbnQgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLgotCi1XZWQgTm92IDE3IDE3OjIwOjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuaDogVXNlIG1hY3JvIGZvciBqIGluc3RydWN0aW9uLCB0byBzdXBwb3J0IFNWUjQgUElDLgotCVJlbW92ZWQgdCxBIGNhc2UgZm9yIGxhOyBhbHdheXMgdXNlIHQsQShiKSBjYXNlLgotCi1Nb24gTm92ICA4IDEyOjM3OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUZyb20gVGVkIExlbWVuIDxtZWxsb25AcGVwcGVyLm5jZC5jb20+Ci0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSAnaycuCi0JKiBtaXBzLW9wYy5jOiBNYWtlIGNhY2hlIHVzZSBrLCBub3QgdC4KLQotU3VuIE5vdiAgNyAyMzo1MjozNCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFscGhhLW9wYy5oLCBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6ICBBZGQKLQlGTE9BVF9NRU1PUllfRk9STUFUX0NPREUsIEZMT0FUX0JSQU5DSF9GT1JNQVRfQ09ERSwgY29ycmVjdAotCUZMT0FUX0ZPUk1BVF9DT0RFIHRvIHB1dCBvdXQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbmFtZXMuCi0KLU1vbiBOb3YgIDEgMTg6MTc6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBVc2UgbWFjcm9zIGZvciBqYWwgdmFyaWFudHMsIHRvIHN1cHBvcnQgU1ZSNCBQSUMuCi0KLVRodSBPY3QgMjggMTc6NDI6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jIChwcmludF9pbnNuKTogVXNlIDB4JTA4eCwgbm90IDB4JTh4LgotCi1XZWQgT2N0IDI3IDExOjQ4OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAoZHNsbCwgZHNyYSwgZHNybCk6IEFkZGVkICc+JyBjYXNlcyBmb3Igc2hpZnQgY291bnRzCi0JbGFyZ2VyIHRoYW4gMzIuICBNb3ZlZCBkc3h4MzIgdmFyaWFudHMgZmlyc3QgZm9yIGRpc2Fzc2VtYmxlci4KLQotTW9uIE9jdCAyNSAxMTozMzoxNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiB6OGtnZW4uYywgejhrLW9wYy5oOiBBZGQgZnVsbCBsZGEgaW5mb3JtYXRpb24uCi0KLVR1ZSBPY3QgMTkgMTI6Mzk6MjUgMTk5MyAgSmVmZnJleSBBIExhdyAgKGxhd0Bjcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogRG8gbm90IGVtaXQgYSBzcGFjZSBhZnRlcgotCW1vdmIgaW5zdHJ1Y3Rpb25zLiAgQW55IG5lY2Vzc2FyeSBzcGFjZSB3aWxsIGJlIGVtaXR0ZWQgYnkKLQl0aGUgY29kZSB0byBoYW5kbGUgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXJzLgotCi1XZWQgT2N0IDEzIDE2OjE5OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogTW92ZWQgbC5kIGRvd24gc28gdGhhdCBpdCBkaXNhc3NlbWJsZXMgYXMgbGRjMS4KLQotRnJpIE9jdCAgOCAwMjozNDoyMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFscGhhLW9wYy5oOiAgQWRkIGxkbF9sLCBmaXggdHlwbyBmb3IgbGRxX3UuCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6ICBBZGQgY29kZSBmb3IgUEFMX0ZPUk1BVF9DT0RFLgotCi1UdWUgT2N0ICA1IDE3OjQ3OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQ29ycmVjdCBsd3Ugb3Bjb2RlIHZhbHVlIChib29rIGhhZCBpdCB3cm9uZykuCi0KLVRodSBTZXAgMzAgMTE6MjY6MTggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jIChGRVRDSF9EQVRBKTogZ2V0IGp1c3QgdGhlIHJpZ2h0IGFtb3VudCBvZiBkYXRhLgotCSh1bnBhY2tfaW5zdHIpOiBDb3BlIHdpdGggQVJHX0lNTTRNMSB0eXBlIGluc3RydWN0aW9ucy4KLQotV2VkIFNlcCAyOSAxNjoyNDo0OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIG04OGstZGlzLmMgKG04OGtkaXMpOiBjb21tZW50IGNoYW5nZS4gIFJlbW92ZSBzcGFjZSBhZnRlcgotCSAgcHJpbnRpbmcgbW5lbW9uaWMuCi0JICAocHJpbnRvcCk6IGhhbmRsZSBuZXcgYXJnIHR5cGVzIERFQyBhbmQgWFJFRyBmb3IgbTg4MTEwLgotCi1UdWUgU2VwIDI4IDE5OjIwOjE2IDE5OTMgIEplZmZyZXkgQSBMYXcgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICd6JyBvcGVyYW5kCi0JdHlwZSBmb3IgYWJzb2x1dGUgYnJhbmNoIGFkZHJlc3Nlcy4gIERlbGV0ZSBzcGVjaWFsCi0JImJsZSIgYW5kICJiZSIgY29kZSBpbiAnVycgb3BlcmFuZCBjb2RlLgotCi1GcmkgU2VwIDI0IDE0OjA4OjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogU2V0IGhhemFyZCBpbmZvcm1hdGlvbiBjb3JyZWN0bHkgZm9yIGJyYW5jaAotCWxpa2VseSBpbnN0cnVjdGlvbnMuCi0KLUZyaSBTZXAgMTcgMDQ6NDE6MTcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSksIGFscGhhLW9wYy5oOiAgRml4IGJ1Z3MsIHVzZQotCWluZm8tPmZwcmludGZfZnVuYyBmb3IgcHJpbnRpbmcgYW5kIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyBmb3IKLQlhZGRyZXNzIG91dHB1dC4KLQotV2VkIFNlcCAxNSAxMjoxMjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IFNldCBJTlNOX1RSQVAgZm9yIHRYWCBpbnN0cnVjdGlvbnMuCi0KLVRodSBTZXAgIDkgMTA6MTE6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6Ci0JQ29ycmVjdGVkIHNlY29uZCBjYXNlIG9mICJiIiBmb3IgZGlzYXNzZW1ibGVyLgotCi1UdWUgU2VwICA3IDE0OjI1OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYywgbTg4ay1kaXMuYzogRG9uJ3QgaW5jbHVkZSBsaWJiZmQuaC4gIENoYW5nZWQgY2FsbHMKLQl0byBCRkQgc3dhcHBpbmcgcm91dGluZXMgdG8gY29ycmVzcG9uZCB0byBCRkQgbmFtZSBjaGFuZ2VzLgotCi1UaHUgU2VwICAyIDEwOjM1OjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQ2hhbmdlIGRpdiBtYWNoaW5lIGluc3RydWN0aW9uIHRvIGJlIHoscyx0IHJhdGhlcgotCXRoYW4gcyx0LiAgQ2hhbmdlIGRpdiBtYWNybyB0byBiZSBkLHYsdCByYXRoZXIgdGhhbiBkLHMsdC4KLQlMaWtld2lzZSBmb3IgZGl2dSwgZGRpdiwgZGRpdnUuICBBZGRlZCB6LHMsdCBjYXNlIGZvciBkcmVtLCBkcmVtdSwKLQlyZW0gYW5kIHJlbXUgd2hpY2ggZ2VuZXJhdGVzIG9ubHkgdGhlIGNvcnJlc3BvbmRpbmcgZGl2Ci0JaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1JUFMgYXNzZW1ibGVyLAotCXdoaWNoIG9ubHkgZ2VuZXJhdGVzIHRoZSBzaW1wbGUgbWFjaGluZSBpbnN0cnVjdGlvbiB3aGVuIGFuCi0JZXhwbGljaXQgZGVzdGluYXRpb24gb2YgJDAgaXMgdXNlZC4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlICd6JyAoYWx3YXlzIHJlZ2lzdGVyIHplcm8pLgotCi1UaHUgQXVnIDI2IDE3OjQxOjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogRnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOiBTZXQKLQlXUl8zMSBoYXphcmQgZm9yIGJhbCwgYmdlemFsLCBibHR6YWwuCi0KLVRodSBBdWcgMjYgMTc6MjA6MDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFVzZSBwcmludCBmdW5jdGlvbgotCWZyb20gd2l0aGluIHRoZSBkaXNhc3NlbWJsZV9pbmZvLCBub3QgZnByaW50Zl9maWx0ZXJlZC4KLQotV2VkIEF1ZyAyNSAxMzo1MTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnfCcgbGlrZSAnPicuICAoRnJvbSBKZWZmCi0JTGF3LCBsYXdAY3MudXRhaC5lZHUuKQotCi1Nb24gQXVnIDIzIDEyOjQ0OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAoImFic3UiKTogUmVtb3ZlZC4KLQkoImRhYnMiKTogQWRkZWQuCi0KLUZyaSBBdWcgMjAgMTA6NTI6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBBZGRlZCByNjAwMCBhbmQgcjQwMDAgaW5zdHJ1Y3Rpb25zIGFuZCBtYWNyb3MuCi0JQ2hhbmdlZCBoYXphcmQgaW5mb3JtYXRpb24gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtZW1vcnkgbG9hZAotCWRlbGF5cyBhbmQgY29wcm9jZXNzb3IgbG9hZCBkZWxheXMuCi0KLVdlZCBBdWcgMTggMTU6Mzk6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBsaS5kIHVzZXMgIlQsTCIsIG5vdCAiUyxGIi4gIEFkZGVkIGxpLnMuCi0KLVR1ZSBBdWcgMTcgMDk6NDQ6NDIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHBhc3MgY3B1IHRvIGNvbmZpZy5iZmQuCi0KLVR1ZSBBdWcgMTcgMTI6MjM6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtODhrLWRpcy5jIChtODhrZGlzKTogTWFrZSBjbGFzcyB1bnNpZ25lZC4KLQotVGh1IEF1ZyAxMiAxNTowODoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogT25lIGJyYW5jaCBmb3JtYXQgY2FzZSB3YXMKLQltaXNzaW5nIHRoZSBpbnN0cnVjdGlvbiBuYW1lLgotCi1XZWQgQXVnIDExIDE5OjI5OjM5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IFJlbmFtZWQgZnJvbSBESVNfTElCUy4KLQlBZGQgdGhlIGFyY2gtc3BlY2lmaWMgYXV4aWxpYXJ5IGZpbGVzLgotCShPRklMRVMpOiBSZW1vdmUgdGhlIGFyY2gtc3BlY2lmaWMgYXV4aWxpYXJ5IGZpbGVzCi0JYW5kIHVzZSBCRkRfTUFDSElORVMgaW5zdGVhZCBvZiBESVNfTElCUy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRF9NQUNISU5FUyBiYXNlZCBvbiAtLXdpdGgtdGFyZ2V0cyBvcHRpb24uCi0KLVRodSBBdWcgMTIgMTI6MDQ6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBBZGRlZCBsd2MxIEUsQShiKSB0byBnbyB3aXRoIGx3YzEgVCxBKGIpLiAgU2ltaWxhcmx5Ci0JZm9yIHN3YzEuCi0KLVN1biBBdWcgIDggMTU6MDk6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jOiBDaGFuZ2UgQ09OU1QgdG8gY29uc3QgdG8gZGVhbCB3aXRoIGdjYwotCS1EY29uc3Q9X19jb25zdCAtdHJhZGl0aW9uYWwuCi0KLUZyaSBBdWcgIDYgMTA6NTg6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6IFRvb2sKLQljb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgb3V0IG9mICNpZiAwLCBhbmQgbWFkZSB0aGVtIHVzZSBuZXcKLQlhcmd1bWVudCB0eXBlICJDIi4KLQotVGh1IEF1ZyAgNSAxNzoxMTowNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IEluY2x1ZGUgYW5zaWRlY2wuaCBiZWZvcmUgb3Bjb2Rlcy9zcGFyYy5oLgotCi1GcmkgSnVsIDMwIDE4OjQ4OjE1IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYzogIEFkZCBGX0pTUiwgRl9VTkJSLCBvciBGX0NPTkRCUiBmbGFncyB0byBlYWNoIGJyYW5jaAotCWluc3RydWN0aW9uLCBmb3IgdXNlIGJ5IHRoZSBkaXNhc3NlbWJsZXIuCi0KLQkqIHNwYXJjLWRpcy5jIChTRVgpOiAgQWRkIHNpZ24gZXh0ZW5zaW9uIG1hY3JvLiAgUmVwbGFjZSBtYW55Ci0JaGFuZC1jb2RlZCBzaWduIGV4dGVuc2lvbnMgdGhhdCBkZXBlbmRlZCBvbiAzMi1iaXQgaG9zdCBpbnRzLgotCUZJWE1FLCB3ZSBzdGlsbCBkZXBlbmQgb24gYmlnLWVuZGlhbiBob3N0IGJpdGZpZWxkIG9yZGVyaW5nLgotCShzcGFyY19wcmludF9pbnNuKTogIFNldCB0aGUgaW5zbl9pbmZvX3ZhbGlkIGZpZWxkLCBhbmQgdGhlCi0Jb3RoZXIgZmllbGRzIHRoYXQgZGVzY3JpYmUgdGhlIGluc3RydWN0aW9uIGJlaW5nIHByaW50ZWQuCi0KLVR1ZSBKdWwgMjcgMTc6MDQ6NTggMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYyAoY2FsbCk6IEFjY2VwdCBhbGwgNiBhZGRyZXNzaW5nIG1vZGVzIHZhbGlkIGZvcgotCWBqbXAnIGluc3RlYWQgb2YganVzdCBvbmUgb2YgdGhlbS4KLQotV2VkIEp1bCAyMSAxMTo0MzozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogTW92ZSBmbG9hdGluZyByZWdpc3RlcnMgZnJvbSByZWdfbmFtZXMgdG8gZnBfcmVnX25hbWVzLgotCShmcHV0X2ZwX3JlZ19yKTogUmVuYW1lZCBmcm9tIGZwdXRfcmVnX3IuCi0JKGZwdXRfZnBfcmVnKTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9pbnNuX2hwcGEpOiBVc2UgZnB1dF9mcF9yZWd7LF9yfSB3aGVyZSBhcHByb3ByaWF0ZS4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlcyAnYScsICdkJyk6IFByaW50IHNwYWNlIGFmdGVyd2FyZHMuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZSAnZCcpOiBVc2UgR0VUX0NPTkQgbm90IEdFVF9GSUVMRC4KLQotTW9uIEp1bCAxOSAxMzo1MjoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogVXNlIGV4dHJhY3RfNXJfc3RvcmUgZm9yICdyJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlICc+Jyk6IElmIG5leHQgY2hhcmFjdGVyIGlzICduJywKLQlkb24ndCBvdXRwdXQgYSBzcGFjZS4KLQotCSogaHBwYS1kaXMuYyAoZmxvYXRfZm9ybWF0X25hbWVzKTogMTAgaXMgdW5kZWZpbmVkLCBhbmQgMTEgaXMgcXVhZC4KLQotU3VuIEp1bCAxOCAxNjozMDowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IE5ldyBmaWxlLCBjb250YWluaW5nIG9wY29kZSB0YWJsZSBmcm9tCi0JLi4vaW5jbHVkZS9vcGNvZGUvbWlwcy5oLgotCSogTWFrZWZpbGUuaW46IEFkZCBpdC4KLQotVGh1IEp1bCAxNSAxMjozNzowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG04OGstZGlzLmM6IE5ldyBmaWxlLCBtb3ZlZCBpbiBmcm9tIGdkYiBhbmQgY2hhbmdlZCB0byB1c2UgdGhlCi0JbmV3IGRpcy1hc20uaCBkaXNhc3NlbWJsZXIgaW50ZXJmYWNlLgotCSogTWFrZWZpbGUuaW4gKERJU19MSUJTKTogQWRkZWQgbTg4ay1kaXMuby4KLQkobTg4ay1kaXMubyk6IE5ldyB0YXJnZXQuCi0KLVR1ZSBKdWwgMTMgMTA6MDQ6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZywgX3ByaW50X2luc25fbWlwcyk6IE1hZGUgcG9pbnRlciB0bwotCWFyZ3VtZW50IHN0cmluZyBjb25zdCBjaGFyICogdG8gY29ycmVzcG9uZCB0byBvcGNvZGUvbWlwcy5oLgotCi1UdWUgSnVsICA2IDE1OjE4OjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYzogVXBkYXRlZCB0byBhY2NvdW50IGZvciBuYW1lIGNoYW5nZXMgaW4gbmV3IHZlcnNpb24KLQlvZiBvcGNvZGUvbWlwcy5oLgotCSogTWFrZWZpbGUuaW46IEFkZGVkIGhlYWRlciBmaWxlIGRlcGVuZGVuY2llcy4KLQotU2F0IEp1bCAgMyAyMzo0Nzo1NiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogQ29ycmVjdCBmZXRjaGluZyBvZiBpbnN0cnVjdGlvbi4KLQotVGh1IEp1bCAgMSAxMjoyMzozOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbTY4ay1kaXMuYyAoTkVYVFdPUkQsIE5FWFRMT05HKTogVXNlICgoeCkgXiAweDgwMDApIC0gMHg4MDAwIHRvIHNpZ24KLQlleHRlbmQsIHJhdGhlciB0aGFuIHNoaWZ0cy4KLQotU3VuIEp1biAyMCAyMDo1Njo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFVuZG8gMTUgSnVuZSBjaGFuZ2UuCi0KLUZyaSBKdW4gMTggMTQ6MTU6MTUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogIENoYW5nZSByZXR1cm4gdmFsdWUgdG8gYnl0ZSBjb3VudAotCW9yIGVycm9yIGNvZGUuCi0JKiBtNjhrLWRpcy5jOiAgUmUtd3JpdGUgdG8gZGV0ZWN0IGludmFsaWQgb3BlcmFuZHMgYmVmb3JlCi0JcHJpbnRpbmcgYW55dGhpbmcsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyB0aGUgc2FtZSB3YXkgd2UKLQloYW5kbGUgaW52YWxpZCBvcGNvZGVzLgotCi1UaHUgSnVuIDE3IDE1OjAxOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHNoLWRpcy5jLCBzaC1vcGMuaDogVW5kZXJzdGFuZCBzb21lIG1vcmUgb3Bjb2Rlcy4KLQotV2VkIEp1biAxNiAxMzo0ODowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmM6IEluY2x1ZGUgPGFuc2lkZWNsLmg+IGFuZCBzeXNkZXAuaCBiZWZvcmUgb3RoZXIKLQloZWFkZXIgZmlsZXMuCi0KLVR1ZSBKdW4gMTUgMjE6NDU6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYzogRG9uJ3QgZGVjbGFyZSBxc29ydCwgc2luY2Ugc3lzZGVwLmggbWlnaHQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gbWFrZSBzeXNkZXAuaCBsaW5rLgotCSogTWFrZWZpbGUuaW46IFNlYXJjaCAuLi9pbmNsdWRlLiAgRG9uJ3Qgc2VhcmNoIC4uL2JmZC4KLQotVHVlIEp1biAxNSAxMzozNjoxMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHU6Ci0JKiBocHBhLWRpcy5jOiBGaXggdHlwby4gICdhJyBhbmQgJ2QnIHdlcmUgcmV2ZXJzZWQuCi0JRG8gbm90IHByaW50IGEgc3BhY2UgYmVmb3JlIHRoZSBjb21wbGV0ZXJzIHNwZWNpZmllZCBieQotCSdhJyBhbmQgJ2QnLgotCi1GcmkgSnVuIDExIDE4OjQwOjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jOiBObyBsb25nZXIgbmVlZCB0byBib21iIG91dCBpZiBIT1NUXzY0X0JJVCBpcwotCWRlZmluZWQsIHNpbmNlIGdkYiBoYXMgYmVlbiBmaXhlZC4KLQotCUNoYW5nZXMgZnJvbSBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1OgotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogTGFzdCBhcmd1bWVudCB0byBmcHV0X3JlZywKLQlmcHV0X3JlZ19yLCBmcHV0X2NyZWcsIGZwdXRfY29uc3QsIGFuZCBmcHV0c19maWx0ZXJlZCBzaG91bGQKLQliZSBhICpkaXNhc3NlbWJsZV9pbmZvLCBub3QgYSAqRklMRS4KLQkqIGhwcGEtZGlzLmM6IFN1cHBvcnQgJ2QnLCAnIScsIGFuZCAnYScuCi0JKiBocHBhLWRpcy5jOiBTdXBwb3J0ICdzJyB0byBleHRyYWN0IGEgMiBiaXQgc3BhY2UgcmVnaXN0ZXIuCi0JKiBocHBhLWRpcy5jOiBEZWxldGUgY2FzZXMgd2hpY2ggYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0KLUZyaSBKdW4gMTEgMDc6NTM6NDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fe202OGssYXJnfSk6IEFkZCBNTVUgY29kZXMuCi0KLVR1ZSBKdW4gIDggMTI6MjU6MDEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmM6IE5ldyBmaWxlLCByZW1vdmVkIGZyb20gYmZkL2NwdS1oODMwMC5jLCB3aXRoCi0JSDgvMzAwLUggb3Bjb2Rlcy4KLQotTW9uIEp1biAgNyAxMjo1ODo0OSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDU0VBUkNIKTogQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgotCi1UaHUgSnVuICAzIDE1OjU2OjQ5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIFBhdGNoZXMgZnJvbSBKZWZmcmV5IExhdyA8bGF3QGNzLnV0YWguZWR1Pi4KLQkqIGhwcGEtZGlzLmM6IFN1cHBvcnQgJ0knLCAnSicsIGFuZCAnSycgaW4gb3V0cHV0Ci0JdGVtcGxhdGVzIGZvciAxLjEgRlAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBNYXkgMjUgMTM6MDU6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBoODUwMC1kaXMuYyAocHJpbnRfaW5zbl9oODUwMCk6IEFkZHJlc3MgYXJndW1lbnQgaXMgdHlwZQotCWJmZF92bWEuCi0JKiB6OGstZGlzLmMgKHByaW50X2luc25fejhrLCBwcmludF9pbnNuX3o4MDAxLCBwcmludF9pbnNuX3o4MDAyKToKLQlEaXR0by4KLQotCSogaDg1MDAtb3BjLmggKGFkZHJfY2xhc3NfdHlwZSk6IE5vIGNvbW1hIGF0IGVuZCBvZiBlbnVtZXJhdG9yLgotCSogc2gtb3BjLmggKHNoX25pYmJsZV90eXBlLCBzaF9hcmdfdHlwZSk6IERpdHRvLgotCi0JKiBzcGFyYy1kaXMuYyAoY29tcGFyZV9vcGNvZGVzKTogTW92ZSBzdGF0aWMgZGVjbGFyYXRpb24gdG8KLQl0b3AtbGV2ZWwuCi0KLUZyaSBNYXkgMjEgMTQ6MTc6MzcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEltcGxlbWVudCAnbicgYXJndW1lbnQgZm9yIHVuaW1wCi0JaW5zdHJ1Y3Rpb24sIHJlbW92ZSB1bmltcCBoYWNrIGZyb20gJ2wnIGFyZ3VtZW50LgotCi1XZWQgTWF5IDE5IDE1OjM1OjU0IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6ICBVc2UgdW5zaWduZWQgY2hhciB0byBtYWtlIGFuY2llbnQgZ2NjJ3MKLQloYXBweS4KLQotRnJpIE1heSAxNCAxNToyMjo0NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIEJhc2VkIG9uIHBhdGNoZXMgZnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgJ0MnIGZvciBnZW5lcmFsIGNvcHJvY2Vzc29yCi0JaW5zdHJ1Y3Rpb25zLgotCi1GcmkgTWF5IDE0IDAwOjA5OjE0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogSW5jbHVkZSBkaXMtYXNtLmggYmVmb3JlIHN5c2RlcC5oLiAgQ2hhbmdlZCBzb21lCi0JYXJyYXlzIG9mIHN0cmluZyBwb2ludGVycyB0byAyLWQgYXJyYXlzIG9mIGNoYXJzLCB0byBzYXZlCi0Jc3BhY2UuCi0KLVRodSBNYXkgIDYgMjA6NTE6MTcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMsIGFscGhhLWRpcy5jLCBpOTYwLWRpcy5jLCBzcGFyYy1kaXMuYywgejhrLWRpcy5jOgotCUNhc3Qgc2Vjb25kIGFyZyB0byByZWFkX21lbW9yeV9mdW5jIHRvICJiZmRfYnl0ZSAqIiwgYXMgbmVjZXNzYXJ5LgotCi1UdWUgTWF5ICA0IDIwOjMxOjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogTmV3IGZpbGUgZnJvbSBVdGFoLCBhZGFwdGVkIHRvIG5ldyBkaXNhc3NlbWJsZXIKLQljYWxsaW5nIGludGVyZmFjZS4KLQkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIGl0LgotCi1Nb24gQXByIDI2IDE4OjE3OjQyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzaC1kaXMuYywgc2gtb3BjLmg6IE5ldyBmaWxlcy4KLQotRnJpIEFwciAyMyAxODo1MToyMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYWxwaGEtZGlzLmMsIGFscGhhLW9wYy5oOiBOZXcgZmlsZXMuCi0KLVR1ZSBBcHIgIDYgMTI6NTQ6MDggMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBtaXBzLWRpcy5jOiBTaWduIGV4dGVuZCAnaicgYW5kICdiJyBhcmd1bWVudHMsIGRlbHRhIGlzIGEgc2lnbmVkCi0JdmFsdWUuCi0KLU1vbiBBcHIgIDUgMTc6Mzc6MzcgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jOiBNYWtlICJ0YSIgdGhlIGRlZmF1bHQgdHJhcCBpbnN0cnVjdGlvbiwgInQiIHRoZSBhbGlhcy4KLQotRnJpIEFwciAgMiAwNzoyNDoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMsIHNwYXJjLWRpcy5jLCBzcGFyYy1vcGMuYzogVXNlIENPTlNUIHJhdGhlciB0aGFuCi0JY29uc3QuCi0KLVRodSBBcHIgIDEgMTE6MjA6NDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jOiBVc2UgZnByaW50Zl9mdW5jIGEgZmV3IHBsYWNlcyB3aGVyZSBJIGZvcmdvdCwKLQlhbmQgZG91YmxlIHBlcmNlbnQgc2lnbnMgYSBmZXcgcGxhY2VzLgotCi0JKiBhMjlrLWRpcy5jLCBpOTYwLWRpcy5jOiBOZXcsIG1lcmdlZCBmcm9tIGdkYiBhbmQgYmludXRpbHMuCi0KLQkqIGkzODYtZGlzLmMsIG02OGstZGlzLmMsIG1pcHMtZGlzLmMsIHNwYXJjLWRpcy5jOgotCVVzZSBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgbm90IHByaW50X2FkZHJlc3MuCi0KLQkqIGRpcy1idWYuYyAoZ2VuZXJpY19wcmludF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgTWFyIDMxIDEwOjA3OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHNwYXJjLWRpcy5jLgotCXNwYXJjLWRpcy5jOiBOZXcgZmlsZSwgbWVyZ2VzIGJpbnV0aWxzIGFuZCBnZGIgdmVyc2lvbnMgYXMgZm9sbG93czoKLQlGcm9tIEdEQjoKLQkgICAgQWRkIGBhZGQnIGluc3RydWN0aW9uIHRvIHRoZSBzZXQgdGhhdCBnZXQgY2hlY2tlZAotCSAgICBmb3IgYSBwcmVjZWRpbmcgYHNldGhpJyBpbiBvcmRlciB0byBwcmludCBhbiBhYnNvbHV0ZSBhZGRyZXNzLgotCSAgICAqIChwcmludF9pbnNuKTogIERpc2Fzc2VtYmx5IHByZWZlcnMgcmVhbCBpbnN0cnVjdGlvbnMuCi0JICAgIChpc19kZWxheWVkX2JyYW5jaCk6ICBTcGVlZCB1cC4KLQkgICAgKiBzcGFyYy1vcGNvZGUuaDogQWRkIEFMSUFTIGJpdCB0byBhbGlhc2VzLiAgRml4IHVwIG9wY29kZSB0YWJsZXMuCi0JICAgIFN0aWxsIG1pc3Npbmcgc29tZSBmbG9hdCBvcHMsIGFuZCBuZWVkcyB0ZXN0aW5nLgotCSAgICAqIHNwYXJjLXBpbnNuLmMgKHByaW50X2luc24pOiBFbGltaW5hdGUgJ3NldCcgdGVzdCwgc3Vic3VtZWQgYnkKLQkgICAgRl9BTElBUy4gIFVzZSBwcmludGYsIG5vdCBmcHJpbnRmLCB3aGVuIG5vdCBwYXNzaW5nIGEgZmlsZQotCSAgICBwb2ludGVyLi4uCi0JICAgIChjb21wYXJlX29wY29kZXMpOiBDaGVjayB0aGF0IGlkZW50aWNhbCBpbnN0cnVjdGlvbnMgaGF2ZQotCSAgICBpZGVudGljYWwgb3Bjb2RlcywgY29tcGxhaW4gb3RoZXJ3aXNlLgotCUZyb20gYmludXRpbHM6Ci0JICAgICogTmV3ICdtJyBhcmcuCi0JICAgICogSW5jbHVkZSByZWdfbmFtZXMuCi0JRnJvbSBuZWl0aGVyOgotCSAgICBVc2UgZGlzLWFzbS5oL3JlYWRfbWVtb3J5X2Z1bmMgaW50ZXJmYWNlLgotCi1XZWQgTWFyIDMxIDIwOjQ5OjA2IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogaDg1MDAtZGlzLmMsIGkzODYtZGlzLmMsIG02OGstZGlzLmMsIHo4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6Ci0JICBkZWxpYmVyYXRlbHkgcmV0dXJuIG5vbi16ZXJvIHRvIHNldGptcCBmcm9tIGxvbmdqbXAuICBPdGhlcndpc2UKLQkgIHRoaXMgY29kZSBmYWlscyB0byBjb21waWxlLgotCi1XZWQgTWFyIDMxIDE3OjA0OjMxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGstZGlzLmM6ICBGaXggcHJvdG90eXBlIGZvciBmZXRjaF9hcmcoKS4KLQotV2VkIE1hciAzMSAxMDowNzowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZGlzLWJ1Zi5jOiBOZXcgZmlsZSwgZm9yIG5ldyByZWFkX21lbW9yeV9mdW5jIGludGVyZmFjZS4KLQlNYWtlZmlsZS5pbiAoT0ZJTEVTKTogSW5jbHVkZSBpdC4KLQltNjhrLWRpcy5jLCBpMzg2LWRpcy5jLCBoODUwMC1kaXMuYywgbWlwcy1kaXMuYywgejhrLWRpcy5jOgotCVVzZSBuZXcgcmVhZF9tZW1vcnlfZnVuYyBpbnRlcmZhY2UuCi0KLU1vbiBNYXIgMjkgMTQ6MDI6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jIChwcmludF9pbnNuX2g4NTAwKTogR2V0IHNpZ24gb2YgZnAgb2Zmc2V0cyByaWdodC4KLQkqIGg4NTAwLW9wYy5oOiBGaXggY291cGxlIG9mIG9wY29kZXMuCi0KLVdlZCBNYXIgMjQgMDI6MDM6MzYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgZHZpICYgaW5zdGFsbGNoZWNrIHRhcmdldHMKLQotTW9uIE1hciAyMiAxODo1NTowNCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZm9yIGg4NTAwLWRpcy5jLgotCi1GcmkgTWFyIDE5IDE0OjI3OjE3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBoODUwMC1kaXMuYywgaDg1MDAtb3BjLmg6IE5ldyBmaWxlcwotCi1UaHUgTWFyIDE4IDE0OjEyOjM3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYywgejhrLWRpcy5jOiAgQ29udmVydGVkIHRvIHVzZSBpbnRlcmZhY2UgZGVmaW5lZCBpbgotCS4uL2luY2x1ZGUvZGlzLWFzbS5oLgotCSogbTY4ay1kaXMuYzogIE5ldyBmaWxlIChtZXJnZSBvZiAuLi9iaW51dGlscy9tNjhrLXBpbnNuLmMKLQlhbmQgLi4vZ2RiL202OGstcGluc24uYykuCi0JKiBpMzg2LWRpcy5jOiAgTmV3IGZpbGUgKG1lcmdlIG9mIC4uL2JpbnV0aWxzL2kzODYtcGluc24uYwotCWFuZCAuLi9nZGIvaTM4Ni1waW5zbi5jKS4KLQkqIG02ODg4MS1leHQuYzogIE5ldyBmaWxlLiAgTW92ZWQgZGVmaW5pdGlvbiBvZgotCWV4dF9mb3JtYXQgZXh0X2Zvcm1hdF82ODg4MSBmcm9tIC4uL2dkYi9tNjhrLXRkZXAuYy4KLQkqIE1ha2VmaWxlLmluOiAgQWRqdXN0IGZvciBuZXcgZmlsZXMuCi0JKiBpMzg2LWRpcy5jOiAgUGF0Y2hlcyBmcm9tIEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkuCi0JKiBtNjhrLWRpcy5jOiAgUmVjb2duaXplICc5JyBwbGFjZW1lbnQgY29kZSwgc28gKHNheSkgcGZsdXNoCi0JY2FuIGJlIGRpcy1hc3NlbWJsZWQuCi0KLVdlZCBGZWIgMTcgMDk6MTk6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IE5vdyByZXR1cm5zIHZvaWQuCi0KLU1vbiBKYW4gMTEgMTY6MDk6MTYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKGFuc2lkZWNsLmgpOiAgSW5jbHVkZSBmb3IgYmVuZWZpdCBvZiBzeXNkZXAuaAotCWZpbGVzIHRoYXQgdXNlIHRoZSBtYWNyb3MuCi0KLVRodSBKYW4gIDcgMTM6MTU6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jOiBOZXcgZmlsZSwgZnJvbSBnZGIvbWlwcy1waW5zbi5jLgotCSogTWFrZWZpbGUuaW4gKERJU19MSUJTKTogQWRkZWQgbWlwcy1kaXMuby4KLQkoQ0ZJTEVTKTogQWRkZWQgbWlwcy1kaXMuYy4KLQotVGh1IEphbiAgNyAwNzozNjozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgIAkqIHo4ay1kaXMuYyAocHJpbnRfaW5zbl96ODAwMSwgcHJpbnRfaW5zbl96ODAwMik6IG5ldyByb3V0aW5lcwotCSogejhrZ2VuLmMsIHo4ay1vcGMuaDogZml4IHNpemVzIG9mIHNvbWUgc2hpZnRzLgotCi1UdWUgRGVjIDIyIDE1OjQyOjQ0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBJbXByb3ZlICpjbGVhbiBydWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IGEgZGVmYXVsdCBob3N0LgotCi1UdWUgTm92IDE3IDE5OjUzOjU0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsc28gdXNlIC1JJChzcmNkaXIpLy4uL2JmZCwgc2luY2Ugc29tZSBzeXNkZXAKLQlmaWxlcyBpbmNsdWRlIG90aGVyIHN5c2RlcCBmaWxlcwotCi1UaHUgTm92IDEyIDE2OjEwOjM3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgejhrLW9wYy5oIHo4a2dlbi5jOiBjaGVja3BvaW50Ci0KLUZyaSBPY3QgIDkgMDQ6NTY6MDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEZvciBob3N0IHN1cHBvcnQsIHVzZSAuLi9iZmQvY29uZmlndXJlLmhvc3QKLQlzbyBpdCBzdGF5cyBpbiBzeW5jIHdpdGggdGhlIC4uL2JmZC9ob3N0cyBkYXRhYmFzZS4KLQotVGh1IE9jdCAgMSAyMzozODo1NCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGluc3RlYWQgb2YgbmVzdGVkIGNhc2VzCi0KLVdlZCBTZXAgMzAgMTY6MDk6MjAgMTk5MiAgTWljaGFlbCBXZXJuZXIgIChtdHdAY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jICh1bnBhcnNlX2luc3RyKTogZml4IGJ1ZyB3aGVyZSBvcGNvZGUgcmV0dXJuZWQgd2FzCi0JKmFsd2F5cyogdGhlIHdyb25nIG9uZS4KLQotV2VkIFNlcCAzMCAwNzo0MjoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrZ2VuLmM6IGFkZGVkIGNvcHlyaWdodCBpbmZvCi0KLVR1ZSBTZXAgMjkgMTI6MjA6MjEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyAodW5wYXJzZV9pbnN0cik6IHByZXR0aWVyIHRhYnMKLQkqIHo4a2dlbi5jIC0+IHo4ay1vcGMuaDogYnVnIGZpeGVzIGluIHRhYmxlcwotCi1GcmkgU2VwIDI1IDEyOjUwOjMyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBuY3IqIGNvbmZpZ3VyYXRpb24uCi0JKiB6OGstZGlzLmMgKHN0cnVjdCBpbnN0cl9kYXRhX3MpOiAgTWFrZSBpbnN0cl9hc21zcmMgY2hhciB0byBtYWtlCi0JcGljYXl1bmUgQU5TSSBjb21waWxlcnMgaGFwcHkuCi0KLVNlcCAyMCAwODo1MDo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2KTogIE1ha2UgaTM4NiBhbmQgaTQ4NiBzeW5vbnltb3VzIGZvciBub3cuCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zeXN2NCk6ICBBZGQgbXlfaG9zdCBkZWZpbml0aW9uLgotCi1GcmkgU2VwIDE4IDE3OjAxOjIzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBGaXggdHlwby4KLQotRnJpIFNlcCAxOCAwMjowNDoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UpOiAgUmVtb3ZlIG9ic29sZXRlIGNydWQuCi0JKHNwYXJjLW9wYy5vKTogIEF2b2lkIFN1biBNYWtlIFZQQVRIIGJ1Zy4KLQotVHVlIFNlcCAgOCAxNzoyOToyNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBzaW5jZSB0aGVyZSBhcmUgbm8gU1VCRElSUywgcmVtb3ZlIHJ1bGUgYW5kCi0JcmVmZXJlbmNlcyBvZiBzdWJkaXJfZG8uCi0KLVR1ZSBTZXAgIDggMTc6MDI6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEdldCB0aGUgbGlicmFyeSBuYW1lIHJpZ2h0IGhlcmUgdG9vLgotCURvbid0IGluc3RhbGwgYmZkLmgsIHNpbmNlIGl0J3MgdW5yZWxhdGVkIHRvIHRoaXMgbGlicmFyeS4gIE5vCi0Jc3ViZGlycyB0byByZWN1cnNlIGludG8sIGVpdGhlci4KLQkoQ0ZJTEVTKTogVGhlIHNvdXJjZSBmaWxlIGhhcyBhIC5jIHN1ZmZpeCwgbm90IC5vLgotCi0JKiBzcGFyYy1vcGMuYzogTmV3IGZpbGUsIG1vdmVkIGZyb20gQkZELgotCSogTWFrZWZpbGUuaW4gKE9GSUxFUyk6IEJ1aWxkIGl0LgotCi1UaHUgU2VwICAzIDE2OjU5OjIwIDE5OTIgIE1pY2hhZWwgV2VybmVyICAobXR3QGN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYzogZml4ZWQgZm9yd2FyZCByZWZmZXJlbmNlcyBvZiBzb21lIGRlY2xhcmF0aW9ucy4KLQotTW9uIEF1ZyAzMSAxNjowOTo0NSAxOTkyICBNaWNoYWVsIFdlcm5lciAgKG10d0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZ2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHJpZ2h0Ci0KLU1vbiBBdWcgMzEgMTM6NDc6MzUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYzoga25vd3MgaG93IHRvIGRpc2Fzc2VtYmxlIHo4ayBzdHVmZgotCSogejhrLW9wYy5oOiBuZXcgZmlsZSBmdWxsIG9mIHo4MDAwIG9wY29kZXMKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9NYWtlZmlsZS5hbSBiL29wY29kZXMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTEwODAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotU1VCRElSUyA9IHBvCi0KLUlOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCi1CRkRESVIgPSAkKHNyY2RpcikvLi4vYmZkCi1NS0RFUCA9IG1rZGVwCi0KLWxpYl9MVExJQlJBUklFUyA9IGxpYm9wY29kZXMubGEKLQotIyBUaGlzIGlzIHdoZXJlIGJmZC5oIGxpdmVzLgotQkZEX0ggPSAuLi9iZmQvYmZkLmgKLQotIyBIZWFkZXIgZmlsZXMuCi1IRklMRVMgPSBcCi0JYXJtLW9wYy5oIFwKLQlmcjMwLWRlc2MuaCBmcjMwLW9wYy5oIFwKLQloODUwMC1vcGMuaCBcCi0JbTMyci1kZXNjLmggbTMyci1vcGMuaCBcCi0JbWNvcmUtb3BjLmggXAotCXNoLW9wYy5oIFwKLQlzeXNkZXAuaCBcCi0JdzY1LW9wYy5oIFwKLQl6OGstb3BjLmgKLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQlhMjlrLWRpcy5jIFwKLQlhbHBoYS1kaXMuYyBcCi0JYWxwaGEtb3BjLmMgXAotCWFyYy1kaXMuYyBcCi0JYXJjLW9wYy5jIFwKLQlhcm0tZGlzLmMgXAotCWF2ci1kaXMuYyBcCi0JY2dlbi1hc20uYyBcCi0JY2dlbi1kaXMuYyBcCi0JY2dlbi1vcGMuYyBcCi0JZDEwdi1kaXMuYyBcCi0JZDEwdi1vcGMuYyBcCi0JZDMwdi1kaXMuYyBcCi0JZDMwdi1vcGMuYyBcCi0JZGlzLWJ1Zi5jIFwKLQlkaXNhc3NlbWJsZS5jIFwKLQlmcjMwLWFzbS5jIFwKLQlmcjMwLWRlc2MuYyBcCi0JZnIzMC1kaXMuYyBcCi0JZnIzMC1pYmxkLmMgXAotCWZyMzAtb3BjLmMgXAotCWg4MzAwLWRpcy5jIFwKLQloODUwMC1kaXMuYyBcCi0JaHBwYS1kaXMuYyBcCi0JaTM3MC1kaXMuYyBcCi0JaTM3MC1vcGMuYyBcCi0JaTM4Ni1kaXMuYyBcCi0JaTk2MC1kaXMuYyBcCi0JbTMyci1hc20uYyBcCi0JbTMyci1kZXNjLmMgXAotCW0zMnItZGlzLmMgXAotCW0zMnItaWJsZC5jIFwKLQltMzJyLW9wYy5jIFwKLQltMzJyLW9waW5zdC5jIFwKLQltNjhrLWRpcy5jIFwKLQltNjhrLW9wYy5jIFwKLQltODhrLWRpcy5jIFwKLQltY29yZS1kaXMuYyBcCi0JbWlwcy1kaXMuYyBcCi0JbWlwcy1vcGMuYyBcCi0JbWlwczE2LW9wYy5jIFwKLQltMTAyMDAtZGlzLmMgXAotCW0xMDIwMC1vcGMuYyBcCi0JbTEwMzAwLWRpcy5jIFwKLQltMTAzMDAtb3BjLmMgXAotCW5zMzJrLWRpcy5jIFwKLQlwai1kaXMuYyBcCi0JcGotb3BjLmMgXAotCXBwYy1kaXMuYyBcCi0JcHBjLW9wYy5jIFwKLQlzaC1kaXMuYyBcCi0Jc3BhcmMtZGlzLmMgXAotCXNwYXJjLW9wYy5jIFwKLQl0aWMzMC1kaXMuYyBcCi0JdGljODAtZGlzLmMgXAotCXRpYzgwLW9wYy5jIFwKLQl2ODUwLWRpcy5jIFwKLQl2ODUwLW9wYy5jIFwKLQl2YXgtZGlzLmMgXAotCXc2NS1kaXMuYyBcCi0JejhrLWRpcy5jIFwKLQl6OGtnZW4uYwotCi1BTExfTUFDSElORVMgPSBcCi0JYTI5ay1kaXMubG8gXAotCWFscGhhLWRpcy5sbyBcCi0JYWxwaGEtb3BjLmxvIFwKLQlhcmMtZGlzLmxvIFwKLQlhcmMtb3BjLmxvIFwKLQlhcm0tZGlzLmxvIFwKLQlhdnItZGlzLmxvIFwKLQljZ2VuLWFzbS5sbyBcCi0JY2dlbi1kaXMubG8gXAotCWNnZW4tb3BjLmxvIFwKLQlkMTB2LWRpcy5sbyBcCi0JZDEwdi1vcGMubG8gXAotCWQzMHYtZGlzLmxvIFwKLQlkMzB2LW9wYy5sbyBcCi0JZnIzMC1hc20ubG8gXAotCWZyMzAtZGVzYy5sbyBcCi0JZnIzMC1kaXMubG8gXAotCWZyMzAtaWJsZC5sbyBcCi0JZnIzMC1vcGMubG8gXAotCWg4MzAwLWRpcy5sbyBcCi0JaDg1MDAtZGlzLmxvIFwKLQlocHBhLWRpcy5sbyBcCi0JaTM4Ni1kaXMubG8gXAotCWkzNzAtZGlzLmxvIFwKLQlpMzcwLW9wYy5sbyBcCi0JaTk2MC1kaXMubG8gXAotCW0zMnItYXNtLmxvIFwKLQltMzJyLWRlc2MubG8gXAotCW0zMnItZGlzLmxvIFwKLQltMzJyLWlibGQubG8gXAotCW0zMnItb3BjLmxvIFwKLQltMzJyLW9waW5zdC5sbyBcCi0JbTY4ay1kaXMubG8gXAotCW02OGstb3BjLmxvIFwKLQltODhrLWRpcy5sbyBcCi0JbTEwMjAwLWRpcy5sbyBcCi0JbTEwMjAwLW9wYy5sbyBcCi0JbTEwMzAwLWRpcy5sbyBcCi0JbTEwMzAwLW9wYy5sbyBcCi0JbWNvcmUtZGlzLmxvIFwKLQltaXBzLWRpcy5sbyBcCi0JbWlwcy1vcGMubG8gXAotCW1pcHMxNi1vcGMubG8gXAotCXBqLWRpcy5sbyBcCi0JcGotb3BjLmxvIFwKLQlwcGMtZGlzLmxvIFwKLQlwcGMtb3BjLmxvIFwKLQluczMyay1kaXMubG8gXAotCXNoLWRpcy5sbyBcCi0Jc3BhcmMtZGlzLmxvIFwKLQlzcGFyYy1vcGMubG8gXAotCXRpYzMwLWRpcy5sbyBcCi0JdGljODAtZGlzLmxvIFwKLQl0aWM4MC1vcGMubG8gXAotCXY4NTAtZGlzLmxvIFwKLQl2ODUwLW9wYy5sbyBcCi0JdmF4LWRpcy5sbyBcCi0JdzY1LWRpcy5sbyBcCi0JejhrLWRpcy5sbwotCi1PRklMRVMgPSBAQkZEX01BQ0hJTkVTQAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChJTkNESVIpIC1JJChCRkRESVIpIEBIREVGSU5FU0AgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwKLQotZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Rpcy1hc20uaAotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyBAYXJjaGRlZnNAICQoc3JjZGlyKS9kaXNhc3NlbWJsZS5jCi0KLWxpYm9wY29kZXNfbGFfU09VUkNFUyA9ICBkaXMtYnVmLmMgZGlzYXNzZW1ibGUuYwotbGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykKLWxpYm9wY29kZXNfbGFfTElCQUREID0gJChPRklMRVMpIEBXSU4zMkxJQkFEREAKLWxpYm9wY29kZXNfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikgQFdJTjMyTERGTEFHU0AKLQotIyBsaWJ0b29sIHdpbGwgYnVpbGQgLmxpYnMvbGlib3Bjb2Rlcy5hLiAgV2UgY3JlYXRlIGxpYm9wY29kZXMuYSBpbgotIyB0aGUgYnVpbGQgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUKLSMgcHJvZ3JhbXMgdGhhdCB1c2UgbGlib3Bjb2Rlcy5hIHNpbXVsdGFuZW91c2x5LiAgVGhpcyBpcyBhIGhhY2sgd2hpY2gKLSMgc2hvdWxkIGJlIHJlbW92ZWQgaWYgZXZlcnl0aGluZyBlbHNlIHN0YXJ0cyB1c2luZyBsaWJ0b29sLiAgRklYTUUuCi0KLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmEKLQotc3RhbXAtbGliOiBsaWJvcGNvZGVzLmxhCi0JbGlidG9vbGRpcj1gJChMSUJUT09MKSAtLWNvbmZpZyB8IHNlZCAtbiAtZSAncy9eb2JqZGlyPS8vcCdgOyBcCi0JaWYgWyAtZiAkJGxpYnRvb2xkaXIvbGlib3Bjb2Rlcy5hIF07IHRoZW4gXAotCSAgY3AgJCRsaWJ0b29sZGlyL2xpYm9wY29kZXMuYSBsaWJvcGNvZGVzLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYm9wY29kZXMudG1wIGxpYm9wY29kZXMuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGlib3Bjb2Rlcy5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotCi1QT1RGSUxFUyA9ICQoSEZJTEVTKSAkKENGSUxFUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLSMgV2Ugc2hvdWxkIHJlY29uZmlndXJlIHdoZW5ldmVyIGJmZC9jb25maWd1cmUuaW4gY2hhbmdlcywgYmVjYXVzZQotIyB0aGF0J3Mgd2hlcmUgdGhlIHZlcnNpb24gbnVtYmVyIGNvbWVzIGZyb20uCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS8uLi9iZmQvY29uZmlndXJlLmluCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi1DTEVBTkZJTEVTID0gXAotCWxpYm9wY29kZXMuYSBzdGFtcC1saWIgZGVwLnNlZCBERVAgREVQMQotCi0KLQotIyBUaGUgc3RhcnQgbWFya2VyIGlzIHdyaXR0ZW4gdGhpcyB3YXkgdG8gcGFzcyB0aHJvdWdoIGF1dG9tYWtlIHVuc2NhdGhlZC4KLQotCi0KLQotIyBUaGlzIGRlcGVuZGVuY3kgc3R1ZmYgaXMgY29waWVkIGZyb20gQkZELgotCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSQoTUtERVApIERFUDEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUDEgPiBERVAKLQotREVQMTogJChDRklMRVMpCi0Jcm0gLWYgREVQMiBERVAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQMgotCWVjaG8gPiBERVAyYQotCSQoTUtERVApIC1mIERFUDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCBERVAyYSA+PiBERVAyCi0Jcm0gLWYgREVQMmEKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQMiBERVAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWEyOWstZGlzLmxvOiBhMjlrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotYWxwaGEtZGlzLmxvOiBhbHBoYS1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9hbHBoYS5oCi1hbHBoYS1vcGMubG86IGFscGhhLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1hcmMtZGlzLmxvOiBhcmMtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgb3BpbnRsLmgKLWFyYy1vcGMubG86IGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgb3BpbnRsLmgKLWFybS1kaXMubG86IGFybS1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggYXJtLW9wYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotY2dlbi1hc20ubG86IGNnZW4tYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgb3BpbnRsLmgKLWNnZW4tZGlzLmxvOiBjZ2VuLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotY2dlbi1vcGMubG86IGNnZW4tb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1kMTB2LWRpcy5sbzogZDEwdi1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWQxMHYtb3BjLmxvOiBkMTB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oCi1kMzB2LWRpcy5sbzogZDMwdi1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWQzMHYtb3BjLmxvOiBkMzB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1kaXMtYnVmLmxvOiBkaXMtYnVmLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1kaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWZyMzAtYXNtLmxvOiBmcjMwLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kZXNjLmxvOiBmcjMwLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGlzLmxvOiBmcjMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWlibGQubG86IGZyMzAtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLW9wYy5sbzogZnIzMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmgKLWg4MzAwLWRpcy5sbzogaDgzMDAtZGlzLmMgJChJTkNESVIpL29wY29kZS9oODMwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotaDg1MDAtZGlzLmxvOiBoODUwMC1kaXMuYyBoODUwMC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWhwcGEtZGlzLmxvOiBocHBhLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1pMzg2LWRpcy5sbzogaTM4Ni1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggY29uZmlnLmggb3BpbnRsLmgKLWk5NjAtZGlzLmxvOiBpOTYwLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaAotbTMyci1hc20ubG86IG0zMnItYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRlc2MubG86IG0zMnItZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1kaXMubG86IG0zMnItZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItaWJsZC5sbzogbTMyci1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItb3BjLmxvOiBtMzJyLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaAotbTMyci1vcGluc3QubG86IG0zMnItb3BpbnN0LmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tNjhrLWRpcy5sbzogbTY4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2Zsb2F0Zm9ybWF0Lmggb3BpbnRsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAotbTY4ay1vcGMubG86IG02OGstb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tNjhrLmgKLW04OGstZGlzLmxvOiBtODhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL204OGsuaCBvcGludGwuaAotbWNvcmUtZGlzLmxvOiBtY29yZS1kaXMuYyBtY29yZS1vcGMuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLW1pcHMtZGlzLmxvOiBtaXBzLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1taXBzLW9wYy5sbzogbWlwcy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAotbWlwczE2LW9wYy5sbzogbWlwczE2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1tMTAyMDAtZGlzLmxvOiBtMTAyMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1tMTAyMDAtb3BjLmxvOiBtMTAyMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLW0xMDMwMC1kaXMubG86IG0xMDMwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLW0xMDMwMC1vcGMubG86IG0xMDMwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotbnMzMmstZGlzLmxvOiBuczMyay1kaXMuYyAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgb3BpbnRsLmgKLXBqLWRpcy5sbzogcGotZGlzLmMgJChJTkNESVIpL29wY29kZS9wai5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotcGotb3BjLmxvOiBwai1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3BqLmgKLXBwYy1kaXMubG86IHBwYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9wcGMuaAotcHBjLW9wYy5sbzogcHBjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmggXAotICBvcGludGwuaAotc2gtZGlzLmxvOiBzaC1kaXMuYyBzaC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXNwYXJjLWRpcy5sbzogc3BhcmMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9saWJpYmVydHkuaCBvcGludGwuaAotc3BhcmMtb3BjLmxvOiBzcGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLXRpYzMwLWRpcy5sbzogdGljMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotdGljODAtZGlzLmxvOiB0aWM4MC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi10aWM4MC1vcGMubG86IHRpYzgwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotdjg1MC1kaXMubG86IHY4NTAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS92ODUwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi12ODUwLW9wYy5sbzogdjg1MC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaCBcCi0gIG9waW50bC5oCi12YXgtZGlzLmxvOiB2YXgtZGlzLmMgJChJTkNESVIpL29wY29kZS92YXguaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXc2NS1kaXMubG86IHc2NS1kaXMuYyB3NjUtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCi16OGstZGlzLmxvOiB6OGstZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIHo4ay1vcGMuaAotejhrZ2VuLmxvOiB6OGtnZW4uYyBzeXNkZXAuaCBjb25maWcuaAotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9vcGNvZGVzL01ha2VmaWxlLmluIGIvb3Bjb2Rlcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjMDMwZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsODc4ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFSID0gQEFSQAotQVMgPSBAQVNACi1CRkRfTUFDSElORVMgPSBAQkZEX01BQ0hJTkVTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotT0JKRFVNUCA9IEBPQkpEVU1QQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1WRVJTSU9OID0gQFZFUlNJT05ACi1XSU4zMkxERkxBR1MgPSBAV0lOMzJMREZMQUdTQAotV0lOMzJMSUJBREQgPSBAV0lOMzJMSUJBRERACi1hcmNoZGVmcyA9IEBhcmNoZGVmc0AKLWwgPSBAbEAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1TVUJESVJTID0gcG8KLQotSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKLUJGRERJUiA9ICQoc3JjZGlyKS8uLi9iZmQKLU1LREVQID0gbWtkZXAKLQotbGliX0xUTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5sYQotCi0jIFRoaXMgaXMgd2hlcmUgYmZkLmggbGl2ZXMuCi1CRkRfSCA9IC4uL2JmZC9iZmQuaAotCi0jIEhlYWRlciBmaWxlcy4KLUhGSUxFUyA9IFwKLQlhcm0tb3BjLmggXAotCWZyMzAtZGVzYy5oIGZyMzAtb3BjLmggXAotCWg4NTAwLW9wYy5oIFwKLQltMzJyLWRlc2MuaCBtMzJyLW9wYy5oIFwKLQltY29yZS1vcGMuaCBcCi0Jc2gtb3BjLmggXAotCXN5c2RlcC5oIFwKLQl3NjUtb3BjLmggXAotCXo4ay1vcGMuaAotCi0KLSMgQyBzb3VyY2UgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIC5vJ3MuCi1DRklMRVMgPSBcCi0JYTI5ay1kaXMuYyBcCi0JYWxwaGEtZGlzLmMgXAotCWFscGhhLW9wYy5jIFwKLQlhcmMtZGlzLmMgXAotCWFyYy1vcGMuYyBcCi0JYXJtLWRpcy5jIFwKLQlhdnItZGlzLmMgXAotCWNnZW4tYXNtLmMgXAotCWNnZW4tZGlzLmMgXAotCWNnZW4tb3BjLmMgXAotCWQxMHYtZGlzLmMgXAotCWQxMHYtb3BjLmMgXAotCWQzMHYtZGlzLmMgXAotCWQzMHYtb3BjLmMgXAotCWRpcy1idWYuYyBcCi0JZGlzYXNzZW1ibGUuYyBcCi0JZnIzMC1hc20uYyBcCi0JZnIzMC1kZXNjLmMgXAotCWZyMzAtZGlzLmMgXAotCWZyMzAtaWJsZC5jIFwKLQlmcjMwLW9wYy5jIFwKLQloODMwMC1kaXMuYyBcCi0JaDg1MDAtZGlzLmMgXAotCWhwcGEtZGlzLmMgXAotCWkzNzAtZGlzLmMgXAotCWkzNzAtb3BjLmMgXAotCWkzODYtZGlzLmMgXAotCWk5NjAtZGlzLmMgXAotCW0zMnItYXNtLmMgXAotCW0zMnItZGVzYy5jIFwKLQltMzJyLWRpcy5jIFwKLQltMzJyLWlibGQuYyBcCi0JbTMyci1vcGMuYyBcCi0JbTMyci1vcGluc3QuYyBcCi0JbTY4ay1kaXMuYyBcCi0JbTY4ay1vcGMuYyBcCi0JbTg4ay1kaXMuYyBcCi0JbWNvcmUtZGlzLmMgXAotCW1pcHMtZGlzLmMgXAotCW1pcHMtb3BjLmMgXAotCW1pcHMxNi1vcGMuYyBcCi0JbTEwMjAwLWRpcy5jIFwKLQltMTAyMDAtb3BjLmMgXAotCW0xMDMwMC1kaXMuYyBcCi0JbTEwMzAwLW9wYy5jIFwKLQluczMyay1kaXMuYyBcCi0JcGotZGlzLmMgXAotCXBqLW9wYy5jIFwKLQlwcGMtZGlzLmMgXAotCXBwYy1vcGMuYyBcCi0Jc2gtZGlzLmMgXAotCXNwYXJjLWRpcy5jIFwKLQlzcGFyYy1vcGMuYyBcCi0JdGljMzAtZGlzLmMgXAotCXRpYzgwLWRpcy5jIFwKLQl0aWM4MC1vcGMuYyBcCi0Jdjg1MC1kaXMuYyBcCi0Jdjg1MC1vcGMuYyBcCi0JdmF4LWRpcy5jIFwKLQl3NjUtZGlzLmMgXAotCXo4ay1kaXMuYyBcCi0JejhrZ2VuLmMKLQotCi1BTExfTUFDSElORVMgPSBcCi0JYTI5ay1kaXMubG8gXAotCWFscGhhLWRpcy5sbyBcCi0JYWxwaGEtb3BjLmxvIFwKLQlhcmMtZGlzLmxvIFwKLQlhcmMtb3BjLmxvIFwKLQlhcm0tZGlzLmxvIFwKLQlhdnItZGlzLmxvIFwKLQljZ2VuLWFzbS5sbyBcCi0JY2dlbi1kaXMubG8gXAotCWNnZW4tb3BjLmxvIFwKLQlkMTB2LWRpcy5sbyBcCi0JZDEwdi1vcGMubG8gXAotCWQzMHYtZGlzLmxvIFwKLQlkMzB2LW9wYy5sbyBcCi0JZnIzMC1hc20ubG8gXAotCWZyMzAtZGVzYy5sbyBcCi0JZnIzMC1kaXMubG8gXAotCWZyMzAtaWJsZC5sbyBcCi0JZnIzMC1vcGMubG8gXAotCWg4MzAwLWRpcy5sbyBcCi0JaDg1MDAtZGlzLmxvIFwKLQlocHBhLWRpcy5sbyBcCi0JaTM4Ni1kaXMubG8gXAotCWkzNzAtZGlzLmxvIFwKLQlpMzcwLW9wYy5sbyBcCi0JaTk2MC1kaXMubG8gXAotCW0zMnItYXNtLmxvIFwKLQltMzJyLWRlc2MubG8gXAotCW0zMnItZGlzLmxvIFwKLQltMzJyLWlibGQubG8gXAotCW0zMnItb3BjLmxvIFwKLQltMzJyLW9waW5zdC5sbyBcCi0JbTY4ay1kaXMubG8gXAotCW02OGstb3BjLmxvIFwKLQltODhrLWRpcy5sbyBcCi0JbTEwMjAwLWRpcy5sbyBcCi0JbTEwMjAwLW9wYy5sbyBcCi0JbTEwMzAwLWRpcy5sbyBcCi0JbTEwMzAwLW9wYy5sbyBcCi0JbWNvcmUtZGlzLmxvIFwKLQltaXBzLWRpcy5sbyBcCi0JbWlwcy1vcGMubG8gXAotCW1pcHMxNi1vcGMubG8gXAotCXBqLWRpcy5sbyBcCi0JcGotb3BjLmxvIFwKLQlwcGMtZGlzLmxvIFwKLQlwcGMtb3BjLmxvIFwKLQluczMyay1kaXMubG8gXAotCXNoLWRpcy5sbyBcCi0Jc3BhcmMtZGlzLmxvIFwKLQlzcGFyYy1vcGMubG8gXAotCXRpYzMwLWRpcy5sbyBcCi0JdGljODAtZGlzLmxvIFwKLQl0aWM4MC1vcGMubG8gXAotCXY4NTAtZGlzLmxvIFwKLQl2ODUwLW9wYy5sbyBcCi0JdmF4LWRpcy5sbyBcCi0JdzY1LWRpcy5sbyBcCi0JejhrLWRpcy5sbwotCi0KLU9GSUxFUyA9IEBCRkRfTUFDSElORVNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKElOQ0RJUikgLUkkKEJGRERJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi1saWJvcGNvZGVzX2xhX1NPVVJDRVMgPSBkaXMtYnVmLmMgZGlzYXNzZW1ibGUuYwotbGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykKLWxpYm9wY29kZXNfbGFfTElCQUREID0gJChPRklMRVMpIEBXSU4zMkxJQkFEREAKLWxpYm9wY29kZXNfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikgQFdJTjMyTERGTEFHU0AKLQotIyBsaWJ0b29sIHdpbGwgYnVpbGQgLmxpYnMvbGlib3Bjb2Rlcy5hLiAgV2UgY3JlYXRlIGxpYm9wY29kZXMuYSBpbgotIyB0aGUgYnVpbGQgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUKLSMgcHJvZ3JhbXMgdGhhdCB1c2UgbGlib3Bjb2Rlcy5hIHNpbXVsdGFuZW91c2x5LiAgVGhpcyBpcyBhIGhhY2sgd2hpY2gKLSMgc2hvdWxkIGJlIHJlbW92ZWQgaWYgZXZlcnl0aGluZyBlbHNlIHN0YXJ0cyB1c2luZyBsaWJ0b29sLiAgRklYTUUuCi0KLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmEKLQotUE9URklMRVMgPSAkKEhGSUxFUykgJChDRklMRVMpCi0KLUNMRUFORklMRVMgPSBcCi0JbGlib3Bjb2Rlcy5hIHN0YW1wLWxpYiBkZXAuc2VkIERFUCBERVAxCi0KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1MSUJSQVJJRVMgPSAgJChub2luc3RfTElCUkFSSUVTKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1saWJvcGNvZGVzX2FfTElCQUREID0gCi1saWJvcGNvZGVzX2FfU09VUkNFUyA9IGxpYm9wY29kZXMuYS5jCi1saWJvcGNvZGVzX2FfT0JKRUNUUyA9ICBsaWJvcGNvZGVzLmEubwotTFRMSUJSQVJJRVMgPSAgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWxpYm9wY29kZXNfbGFfT0JKRUNUUyA9ICBkaXMtYnVmLmxvIGRpc2Fzc2VtYmxlLmxvCi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLURJU1RfQ09NTU9OID0gIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9IGxpYm9wY29kZXMuYS5jICQobGlib3Bjb2Rlc19sYV9TT1VSQ0VTKQotT0JKRUNUUyA9IGxpYm9wY29kZXMuYS5vICQobGlib3Bjb2Rlc19sYV9PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubG8gLm8gLnMKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0KLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1tb3N0bHljbGVhbi1saWJMVExJQlJBUklFUzoKLQotY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUzoKLQotaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgJChMSUJUT09MKSAgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCWRvbmUKLQotbGlib3Bjb2Rlcy5sYTogJChsaWJvcGNvZGVzX2xhX09CSkVDVFMpICQobGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMpCi0JJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGlib3Bjb2Rlc19sYV9MREZMQUdTKSAkKGxpYm9wY29kZXNfbGFfT0JKRUNUUykgJChsaWJvcGNvZGVzX2xhX0xJQkFERCkgJChMSUJTKQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1pbmZvLWFtOgotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbToKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1saWJMVExJQlJBUklFUwotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKSAkKExUTElCUkFSSUVTKSBjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChsaWJkaXIpCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgXAotCQltb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBcCi0JCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBcCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAotaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKLWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgXAotYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi1kaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCi1tb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9kaXMtYXNtLmgKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgQGFyY2hkZWZzQCAkKHNyY2RpcikvZGlzYXNzZW1ibGUuYwotCi1zdGFtcC1saWI6IGxpYm9wY29kZXMubGEKLQlsaWJ0b29sZGlyPWAkKExJQlRPT0wpIC0tY29uZmlnIHwgc2VkIC1uIC1lICdzL15vYmpkaXI9Ly9wJ2A7IFwKLQlpZiBbIC1mICQkbGlidG9vbGRpci9saWJvcGNvZGVzLmEgXTsgdGhlbiBcCi0JICBjcCAkJGxpYnRvb2xkaXIvbGlib3Bjb2Rlcy5hIGxpYm9wY29kZXMudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGlib3Bjb2Rlcy50bXAgbGlib3Bjb2Rlcy5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJvcGNvZGVzLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0jIFdlIHNob3VsZCByZWNvbmZpZ3VyZSB3aGVuZXZlciBiZmQvY29uZmlndXJlLmluIGNoYW5nZXMsIGJlY2F1c2UKLSMgdGhhdCdzIHdoZXJlIHRoZSB2ZXJzaW9uIG51bWJlciBjb21lcyBmcm9tLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvLi4vYmZkL2NvbmZpZ3VyZS5pbgotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotIyBUaGUgc3RhcnQgbWFya2VyIGlzIHdyaXR0ZW4gdGhpcyB3YXkgdG8gcGFzcyB0aHJvdWdoIGF1dG9tYWtlIHVuc2NhdGhlZC4KLQotIyBUaGlzIGRlcGVuZGVuY3kgc3R1ZmYgaXMgY29waWVkIGZyb20gQkZELgotCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSQoTUtERVApIERFUDEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUDEgPiBERVAKLQotREVQMTogJChDRklMRVMpCi0Jcm0gLWYgREVQMiBERVAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQMgotCWVjaG8gPiBERVAyYQotCSQoTUtERVApIC1mIERFUDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCBERVAyYSA+PiBERVAyCi0Jcm0gLWYgREVQMmEKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQMiBERVAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWEyOWstZGlzLmxvOiBhMjlrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotYWxwaGEtZGlzLmxvOiBhbHBoYS1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9hbHBoYS5oCi1hbHBoYS1vcGMubG86IGFscGhhLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1hcmMtZGlzLmxvOiBhcmMtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgb3BpbnRsLmgKLWFyYy1vcGMubG86IGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgb3BpbnRsLmgKLWFybS1kaXMubG86IGFybS1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggYXJtLW9wYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotY2dlbi1hc20ubG86IGNnZW4tYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgb3BpbnRsLmgKLWNnZW4tZGlzLmxvOiBjZ2VuLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotY2dlbi1vcGMubG86IGNnZW4tb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1kMTB2LWRpcy5sbzogZDEwdi1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWQxMHYtb3BjLmxvOiBkMTB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oCi1kMzB2LWRpcy5sbzogZDMwdi1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWQzMHYtb3BjLmxvOiBkMzB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1kaXMtYnVmLmxvOiBkaXMtYnVmLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1kaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWZyMzAtYXNtLmxvOiBmcjMwLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kZXNjLmxvOiBmcjMwLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGlzLmxvOiBmcjMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWlibGQubG86IGZyMzAtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLW9wYy5sbzogZnIzMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmgKLWg4MzAwLWRpcy5sbzogaDgzMDAtZGlzLmMgJChJTkNESVIpL29wY29kZS9oODMwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotaDg1MDAtZGlzLmxvOiBoODUwMC1kaXMuYyBoODUwMC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWhwcGEtZGlzLmxvOiBocHBhLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1pMzg2LWRpcy5sbzogaTM4Ni1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggY29uZmlnLmggb3BpbnRsLmgKLWk5NjAtZGlzLmxvOiBpOTYwLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaAotbTMyci1hc20ubG86IG0zMnItYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRlc2MubG86IG0zMnItZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1kaXMubG86IG0zMnItZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItaWJsZC5sbzogbTMyci1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItb3BjLmxvOiBtMzJyLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaAotbTMyci1vcGluc3QubG86IG0zMnItb3BpbnN0LmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tNjhrLWRpcy5sbzogbTY4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2Zsb2F0Zm9ybWF0Lmggb3BpbnRsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAotbTY4ay1vcGMubG86IG02OGstb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tNjhrLmgKLW04OGstZGlzLmxvOiBtODhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL204OGsuaCBvcGludGwuaAotbWNvcmUtZGlzLmxvOiBtY29yZS1kaXMuYyBtY29yZS1vcGMuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLW1pcHMtZGlzLmxvOiBtaXBzLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1taXBzLW9wYy5sbzogbWlwcy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAotbWlwczE2LW9wYy5sbzogbWlwczE2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1tMTAyMDAtZGlzLmxvOiBtMTAyMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1tMTAyMDAtb3BjLmxvOiBtMTAyMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLW0xMDMwMC1kaXMubG86IG0xMDMwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLW0xMDMwMC1vcGMubG86IG0xMDMwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotbnMzMmstZGlzLmxvOiBuczMyay1kaXMuYyAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgb3BpbnRsLmgKLXBqLWRpcy5sbzogcGotZGlzLmMgJChJTkNESVIpL29wY29kZS9wai5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotcGotb3BjLmxvOiBwai1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3BqLmgKLXBwYy1kaXMubG86IHBwYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9wcGMuaAotcHBjLW9wYy5sbzogcHBjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmggXAotICBvcGludGwuaAotc2gtZGlzLmxvOiBzaC1kaXMuYyBzaC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXNwYXJjLWRpcy5sbzogc3BhcmMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9saWJpYmVydHkuaCBvcGludGwuaAotc3BhcmMtb3BjLmxvOiBzcGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLXRpYzMwLWRpcy5sbzogdGljMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotdGljODAtZGlzLmxvOiB0aWM4MC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi10aWM4MC1vcGMubG86IHRpYzgwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotdjg1MC1kaXMubG86IHY4NTAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS92ODUwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi12ODUwLW9wYy5sbzogdjg1MC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaCBcCi0gIG9waW50bC5oCi12YXgtZGlzLmxvOiB2YXgtZGlzLmMgJChJTkNESVIpL29wY29kZS92YXguaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXc2NS1kaXMubG86IHc2NS1kaXMuYyB3NjUtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCi16OGstZGlzLmxvOiB6OGstZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIHo4ay1vcGMuaAotejhrZ2VuLmxvOiB6OGtnZW4uYyBzeXNkZXAuaCBjb25maWcuaAotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL29wY29kZXMvYTI5ay1kaXMuYyBiL29wY29kZXMvYTI5ay1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5NTljOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2EyOWstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gcHJpbnRpbmcgY29kZSBmb3IgdGhlIEFNRCAyOTAwMAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICBXcml0dGVuIGJ5IEppbSBLaW5nZG9uLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2EyOWsuaCIKLQotLyogUHJpbnQgYSBzeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBhIGdlbmVyYWwtcHVycG9zZQotICAgcmVnaXN0ZXIgbnVtYmVyIE5VTSBvbiBTVFJFQU0uCi0gICBOVU0gaXMgYSBudW1iZXIgYXMgZm91bmQgaW4gdGhlIGluc3RydWN0aW9uLCBub3QgYXMgZm91bmQgaW4KLSAgIGRlYnVnZ2luZyBzeW1ib2xzOyBpdCBtdXN0IGJlIGluIHRoZSByYW5nZSAwLTI1NS4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfZ2VuZXJhbCAobnVtLCBpbmZvKQotICAgICBpbnQgbnVtOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKG51bSA8IDEyOCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImdyJWQiLCBudW0pOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJsciVkIiwgbnVtIC0gMTI4KTsKLX0KLQotLyogTGlrZSBwcmludF9nZW5lcmFsIGJ1dCBhIHNwZWNpYWwtcHVycG9zZSByZWdpc3Rlci4KLSAgIAotICAgVGhlIG1uZW1vbmljcyB1c2VkIGJ5IHRoZSBBTUQgYXNzZW1ibGVyIGFyZSBub3QgcXVpdGUgdGhlIHNhbWUKLSAgIGFzIHRoZSBvbmVzIGluIHRoZSBVc2VyJ3MgTWFudWFsLiAgV2UgdXNlIHRoZSBvbmVzIHRoYXQgdGhlCi0gICBhc3NlbWJsZXIgdXNlcy4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfc3BlY2lhbCAobnVtLCBpbmZvKQotICAgICB1bnNpZ25lZCBpbnQgbnVtOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgLyogUmVnaXN0ZXIgbmFtZXMgb2YgcmVnaXN0ZXJzIDAtU1BFQzBfTlVNLTEuICAqLwotICBzdGF0aWMgY2hhciAqc3BlYzBfbmFtZXNbXSA9IHsKLSAgICAidmFiIiwgIm9wcyIsICJjcHMiLCAiY2ZnIiwgImNoYSIsICJjaGQiLCAiY2hjIiwgInJicCIsICJ0bWMiLCAidG1yIiwKLSAgICAicGMwIiwgInBjMSIsICJwYzIiLCAibW11IiwgImxydSIsICJyc24iLCAicm1hMCIsICJybWMwIiwgInJtYTEiLCAicm1jMSIsCi0gICAgInNwYzAiLCAic3BjMSIsICJzcGMyIiwgImliYTAiLCAiaWJjMCIsICJpYmExIiwgImliYzEiLCAiZGJhIiwgImRiYyIsCi0gICAgImNpciIsICJjZHIiCi0gICAgfTsKLSNkZWZpbmUgU1BFQzBfTlVNICgoc2l6ZW9mIHNwZWMwX25hbWVzKSAvIChzaXplb2Ygc3BlYzBfbmFtZXNbMF0pKQotCi0gIC8qIFJlZ2lzdGVyIG5hbWVzIG9mIHJlZ2lzdGVycyAxMjgtMTI4K1NQRUMxMjhfTlVNLTEuICAqLwotICBzdGF0aWMgY2hhciAqc3BlYzEyOF9uYW1lc1tdID0gewotICAgICJpcGMiLCAiaXBhIiwgImlwYiIsICJxIiwgImFsdSIsICJicCIsICJmYyIsICJjciIKLSAgICB9OwotI2RlZmluZSBTUEVDMTI4X05VTSAoKHNpemVvZiBzcGVjMTI4X25hbWVzKSAvIChzaXplb2Ygc3BlYzEyOF9uYW1lc1swXSkpCi0KLSAgLyogUmVnaXN0ZXIgbmFtZXMgb2YgcmVnaXN0ZXJzIDE2MC0xNjArU1BFQzE2MF9OVU0tMS4gICovCi0gIHN0YXRpYyBjaGFyICpzcGVjMTYwX25hbWVzW10gPSB7Ci0gICAgImZwZSIsICJpbnRlIiwgImZwcyIsICJzcjE2MyIsICJleG9wIgotICAgIH07Ci0jZGVmaW5lIFNQRUMxNjBfTlVNICgoc2l6ZW9mIHNwZWMxNjBfbmFtZXMpIC8gKHNpemVvZiBzcGVjMTYwX25hbWVzWzBdKSkKLQotICBpZiAobnVtIDwgU1BFQzBfTlVNKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBzcGVjMF9uYW1lc1tudW1dKTsKLSAgZWxzZSBpZiAobnVtID49IDEyOCAmJiBudW0gPCAxMjggKyBTUEVDMTI4X05VTSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc3BlYzEyOF9uYW1lc1tudW0tMTI4XSk7Ci0gIGVsc2UgaWYgKG51bSA+PSAxNjAgJiYgbnVtIDwgMTYwICsgU1BFQzE2MF9OVU0pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNwZWMxNjBfbmFtZXNbbnVtLTE2MF0pOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzciVkIiwgbnVtKTsKLX0KLQotLyogSXMgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBPUENPREUgYSBkZWxheWVkIGJyYW5jaD8gICovCi1zdGF0aWMgaW50Ci1pc19kZWxheWVkX2JyYW5jaCAob3Bjb2RlKQotICAgICBpbnQgb3Bjb2RlOwotewotICByZXR1cm4gKG9wY29kZSA9PSAweGE4IHx8IG9wY29kZSA9PSAweGE5IHx8IG9wY29kZSA9PSAweGEwIHx8IG9wY29kZSA9PSAweGExCi0JICB8fCBvcGNvZGUgPT0gMHhhNCB8fCBvcGNvZGUgPT0gMHhhNQotCSAgfHwgb3Bjb2RlID09IDB4YjQgfHwgb3Bjb2RlID09IDB4YjUKLQkgIHx8IG9wY29kZSA9PSAweGM0IHx8IG9wY29kZSA9PSAweGMwCi0JICB8fCBvcGNvZGUgPT0gMHhhYyB8fCBvcGNvZGUgPT0gMHhhZAotCSAgfHwgb3Bjb2RlID09IDB4Y2MpOwotfQotCi0vKiBOb3cgZmluZCB0aGUgZm91ciBieXRlcyBvZiBJTlNOIGFuZCBwdXQgdGhlbSBpbiAqSU5TTnswLDgsMTYsMjR9LiAgKi8KLXN0YXRpYyB2b2lkCi1maW5kX2J5dGVzX2JpZyAoaW5zbiwgaW5zbjAsIGluc244LCBpbnNuMTYsIGluc24yNCkKLSAgICAgY2hhciAqaW5zbjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc244OwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMTY7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24yNDsKLXsKLSAgKmluc24yNCA9IGluc25bMF07Ci0gICppbnNuMTYgPSBpbnNuWzFdOwotICAqaW5zbjggID0gaW5zblsyXTsKLSAgKmluc24wICA9IGluc25bM107Ci19Ci0KLXN0YXRpYyB2b2lkCi1maW5kX2J5dGVzX2xpdHRsZSAoaW5zbiwgaW5zbjAsIGluc244LCBpbnNuMTYsIGluc24yNCkKLSAgICAgY2hhciAqaW5zbjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc244OwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMTY7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24yNDsKLXsKLSAgKmluc24yNCA9IGluc25bM107Ci0gICppbnNuMTYgPSBpbnNuWzJdOwotICAqaW5zbjggPSBpbnNuWzFdOwotICAqaW5zbjAgPSBpbnNuWzBdOwotfQotCi10eXBlZGVmIHZvaWQgKCpmaW5kX2J5dGVfZnVuY190eXBlKQotICAgICBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLAotCSAgICAgIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKSk7Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIE1FTUFERFIgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoYWx3YXlzIDQgb24gYTI5aykuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAvKiBUaGUgcmF3IGluc3RydWN0aW9uLiAgKi8KLSAgY2hhciBpbnNuWzRdOwotCi0gIC8qIFRoZSBmb3VyIGJ5dGVzIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgaW5zbjI0LCBpbnNuMTYsIGluc244LCBpbnNuMDsKLQotICBmaW5kX2J5dGVfZnVuY190eXBlIGZpbmRfYnl0ZV9mdW5jID0gKGZpbmRfYnl0ZV9mdW5jX3R5cGUpaW5mby0+cHJpdmF0ZV9kYXRhOwotCi0gIHN0cnVjdCBhMjlrX29wY29kZSBDT05TVCAqIG9wY29kZTsKLQotICB7Ci0gICAgaW50IHN0YXR1cyA9Ci0gICAgICAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCAoYmZkX2J5dGUgKikgJmluc25bMF0sIDQsIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLQkoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0gIH0KLQotICAoKmZpbmRfYnl0ZV9mdW5jKSAoaW5zbiwgJmluc24wLCAmaW5zbjgsICZpbnNuMTYsICZpbnNuMjQpOwotCi0gIHByaW50ZiAoIiUwMnglMDJ4JTAyeCUwMnggIiwgaW5zbjI0LCBpbnNuMTYsIGluc244LCBpbnNuMCk7Ci0KLSAgLyogSGFuZGxlIHRoZSBub3AgKGFzZXEgMHg0MCxncjEsZ3IxKSBzcGVjaWFsbHkgKi8KLSAgaWYgKChpbnNuMjQ9PTB4NzApICYmIChpbnNuMTY9PTB4NDApICYmIChpbnNuOD09MHgwMSkgJiYgKGluc24wPT0weDAxKSkgewotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCJub3AiKTsKLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIC8qIFRoZSBvcGNvZGUgaXMgYWx3YXlzIGluIGluc24yNC4gICovCi0gIGZvciAob3Bjb2RlID0gJmEyOWtfb3Bjb2Rlc1swXTsKLSAgICAgICBvcGNvZGUgPCAmYTI5a19vcGNvZGVzW251bV9vcGNvZGVzXTsKLSAgICAgICArK29wY29kZSkKLSAgICB7Ci0gICAgICBpZiAoKCh1bnNpZ25lZCBsb25nKSBpbnNuMjQgPDwgMjQpID09IG9wY29kZS0+b3Bjb2RlKQotCXsKLQkgIGNoYXIgKnM7Ci0JICAKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwgb3Bjb2RlLT5uYW1lKTsKLQkgIGZvciAocyA9IG9wY29kZS0+YXJnczsgKnMgIT0gJ1wwJzsgKytzKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqcykKLQkJewotCQljYXNlICdhJzoKLQkJICBwcmludF9nZW5lcmFsIChpbnNuOCwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgJ2InOgotCQkgIHByaW50X2dlbmVyYWwgKGluc24wLCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdjJzoKLQkJICBwcmludF9nZW5lcmFsIChpbnNuMTYsIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2knOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAneCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgKGluc24xNiA8PCA4KSArIGluc24wKTsKLQkJICBicmVhazsKLQotCQljYXNlICdoJzoKLQkJICAvKiBUaGlzIHVzZWQgdG8gYmUgJXggZm9yIGJpbnV0aWxzLiAgKi8KLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJCSAgICAoaW5zbjE2IDw8IDI0KSArIChpbnNuMCA8PCAxNikpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1gnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICAoKGluc24xNiA8PCA4KSArIGluc24wKSB8IDB4ZmZmZjAwMDApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1AnOgotCQkgIC8qIFRoaXMgb3V0cHV0IGxvb2tzIGp1c3QgbGlrZSBhYnNvbHV0ZSBhZGRyZXNzaW5nLCBidXQKLQkJICAgICBtYXliZSB0aGF0J3MgT0sgKGl0J3Mgd2hhdCB0aGUgR0RCIG02OGsgYW5kIEVCTU9OCi0JCSAgICAgYTI5ayBkaXNhc3NlbWJsZXJzIGRvKS4gICovCi0JCSAgLyogQWxsIHRoZSBzaGlmdGluZyBpcyB0byBzaWduLWV4dGVuZCBpdC4gIHAqLwotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkgICAgKG1lbWFkZHIgKwotCQkgICAgICgoKGludCkoKGluc24xNiA8PCAxMCkgKyAoaW5zbjAgPDwgMikpIDw8IDE0KSA+PiAxNCksCi0JCSAgICAgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnQSc6Ci0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCSAgICAoKGluc24xNiA8PCAxMCkgKyAoaW5zbjAgPDwgMiksIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2UnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMTYgPj4gNyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgaW5zbjE2ICYgMHg3Zik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAndic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgaW5zbjE2KTsKLQkJICBicmVhazsKLQotCQljYXNlICdzJzoKLQkJICBwcmludF9zcGVjaWFsIChpbnNuOCwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAndSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wID4+IDcpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3InOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCAoaW5zbjAgPj4gNCkgJiA3KTsKLQkJICBicmVhazsKLQotCQljYXNlICdJJzoKLQkJICBpZiAoKGluc24xNiAmIDMpICE9IDApCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjE2ICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMCA+PiAyKSAmIDMpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2YnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMCAmIDMpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0YnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCAoaW5zbjE2ID4+IDIpICYgMTUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0MnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMTYgJiAzKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCAqcyk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBOb3cgd2UgbG9vayBmb3IgYSBjb25zdCxjb25zdGggcGFpciBvZiBpbnN0cnVjdGlvbnMsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIHRyeSB0byBwcmludCB0aGUgc3ltYm9saWMgYWRkcmVzcy4gICovCi0JICBpZiAoaW5zbjI0ID09IDIpICAvKiBjb25zdGggKi8KLQkgICAgewotCSAgICAgIGludCBlcnJjb2RlOwotCSAgICAgIGNoYXIgcHJldl9pbnNuWzRdOwotCSAgICAgIHVuc2lnbmVkIGNoYXIgcHJldl9pbnNuMCwgcHJldl9pbnNuOCwgcHJldl9pbnNuMTYsIHByZXZfaW5zbjI0OwotCSAgICAgIAotCSAgICAgIGVycmNvZGUgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyIC0gNCwKLQkJCQkJCSAgIChiZmRfYnl0ZSAqKSAmcHJldl9pbnNuWzBdLAotCQkJCQkJICAgNCwKLQkJCQkJCSAgIGluZm8pOwotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJZiBpdCBpcyBhIGRlbGF5ZWQgYnJhbmNoLCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlCi0JCSAgICAgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBkZWxheWVkIGJyYWNoIHRvIGhhbmRsZQotCQkgICAgIHRoaW5ncyBsaWtlCi0JCSAgICAgCi0JCSAgICAgY29uc3QgX2ZvbwotCQkgICAgIGNhbGwgX3ByaW50ZgotCQkgICAgIGNvbnN0aCBfZm9vCi0JCSAgICAgKi8KLQkJICAoKmZpbmRfYnl0ZV9mdW5jKSAocHJldl9pbnNuLCAmcHJldl9pbnNuMCwgJnByZXZfaW5zbjgsCi0JCQkJICAgICAmcHJldl9pbnNuMTYsICZwcmV2X2luc24yNCk7Ci0JCSAgaWYgKGlzX2RlbGF5ZWRfYnJhbmNoIChwcmV2X2luc24yNCkpCi0JCSAgICB7Ci0JCSAgICAgIGVycmNvZGUgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCQkobWVtYWRkciAtIDgsIChiZmRfYnl0ZSAqKSAmcHJldl9pbnNuWzBdLCA0LCBpbmZvKTsKLQkJICAgICAgKCpmaW5kX2J5dGVfZnVuYykgKHByZXZfaW5zbiwgJnByZXZfaW5zbjAsICZwcmV2X2luc244LAotCQkJCQkgJnByZXZfaW5zbjE2LCAmcHJldl9pbnNuMjQpOwotCQkgICAgfQotCQl9Ci0JCSAgCi0JICAgICAgLyogSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSByZWFkaW5nIG1lbW9yeSwgdGhlbiBhc3N1bWUKLQkJIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgbm90IGNvbnN0LiAgKi8KLQkgICAgICBpZiAoZXJyY29kZSA9PSAwKQotCQl7Ci0JCSAgLyogSXMgaXQgY29uc3QgdG8gdGhlIHNhbWUgcmVnaXN0ZXI/ICAqLwotCQkgIGlmIChwcmV2X2luc24yNCA9PSAzCi0JCSAgICAgICYmIHByZXZfaW5zbjggPT0gaW5zbjgpCi0JCSAgICB7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQ7ICIpOwotCQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJCSgoKGluc24xNiA8PCAyNCkgKyAoaW5zbjAgPDwgMTYpCi0JCQkgICsgKHByZXZfaW5zbjE2IDw8IDgpICsgKHByZXZfaW5zbjApKSwKLQkJCSBpbmZvKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIHJldHVybiA0OwotCX0KLSAgICB9Ci0gIC8qIFRoaXMgdXNlZCB0byBiZSAlOHggZm9yIGJpbnV0aWxzLiAgKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0gICAgKGluZm8tPnN0cmVhbSwgIi53b3JkIDB4JTA4eCIsCi0gICAgIChpbnNuMjQgPDwgMjQpICsgKGluc24xNiA8PCAxNikgKyAoaW5zbjggPDwgOCkgKyBpbnNuMCk7Ci0gIHJldHVybiA0OwotfQotCi0vKiBEaXNhc3NlbWJsZSBhbiBiaWctZW5kaWFuIGEyOWsgaW5zdHJ1Y3Rpb24uICAqLwotaW50Ci1wcmludF9pbnNuX2JpZ19hMjlrIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSBmaW5kX2J5dGVzX2JpZzsKLSAgcmV0dXJuIHByaW50X2luc24gKG1lbWFkZHIsIGluZm8pOwotfQotCi0vKiBEaXNhc3NlbWJsZSBhIGxpdHRsZS1lbmRpYW4gYTI5ayBpbnN0cnVjdGlvbi4gICovCi1pbnQKLXByaW50X2luc25fbGl0dGxlX2EyOWsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpIGZpbmRfYnl0ZXNfbGl0dGxlOwotICByZXR1cm4gcHJpbnRfaW5zbiAobWVtYWRkciwgaW5mbyk7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FjaW5jbHVkZS5tNCBiL29wY29kZXMvYWNpbmNsdWRlLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIwOWI5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKZGlmZiAtLWdpdCBhL29wY29kZXMvYWNsb2NhbC5tNCBiL29wY29kZXMvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhMWY0ZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSw5MTYgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgNDAgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBMREZMQUdTPSIkTERGTEFHUyIgTElCUz0iJExJQlMiIFwKLUxOX1M9IiRMTl9TIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBPQkpEVU1QPSIkT0JKRFVNUCIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRsdF90YXJnZXQgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotY2FzZSAiJHRhcmdldCIgaW4KLU5PTkUpIGx0X3RhcmdldD0iJGhvc3QiIDs7Ci0qKSBsdF90YXJnZXQ9IiR0YXJnZXQiIDs7Ci1lc2FjCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX0RMT1BFTl0sCi1bbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIl0pCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtd2luMzItZGxsIl0pCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLSAgWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siID0geG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotdGVzdCB4IiRzaWxlbnQiID0geHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi1pZmRlZihbQUNfUFJPVklERV9BQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqKQotICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi0gIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCi0gIDs7Ci1dKQotZXNhYwotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGVuYWJsZSBjaGVja3MgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSldKQotCi0jIEFDX0xJQlRPT0xfV0lOMzJfRExMIC0gZGVjbGFyZSBwYWNrYWdlIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpbjMyIGRsbCdzCi1BQ19ERUZVTihBQ19MSUJUT09MX1dJTjMyX0RMTCwgW0FDX0JFRk9SRShbJDBdLCBbQUNfTElCVE9PTF9TRVRVUF0pXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELCBbZG5sCi1kZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLCBbZG5sCi1kZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsIFtkbmwKLWRlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwgW0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLUFDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubSB8fCB0ZXN0IC1mICRhY19kaXIvbm0kYWNfZXhlZXh0IDsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotTElCTT0KLWNhc2UgIiRsdF90YXJnZXQiIGluCi0qLSotYmVvcyogfCAqLSotY3lnd2luKikKLSAgIyBUaGVzZSBzeXN0ZW0gZG9uJ3QgaGF2ZSBsaWJtCi0gIDs7Ci0qLW5jci1zeXN2NC4zKikKLSAgQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCwgTElCTT0iLWxtdyIpCi0gIEFDX0NIRUNLX0xJQihtLCBtYWluLCBMSUJNPSIkTElCTSAtbG0iKQotICA7OwotKikKLSAgQUNfQ0hFQ0tfTElCKG0sIG1haW4sIExJQk09Ii1sbSIpCi0gIDs7Ci1lc2FjCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLSAgSU5DTFRETD1pZmVsc2UoJCMsMSwtSSQxLFsnLUkke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLAotICBbdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4eWVzICYmIGVuYWJsZV9sdGRsX2luc3RhbGw9bm9dLAotICBbaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHhubzsgdGhlbgotICAgICBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkKLSAgIGVsc2UKLSAgICAgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgIGZpCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4InllcyI7IHRoZW4KLSAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIKLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICAgIElOQ0xUREw9aWZlbHNlKCQjLDEsLUkkMSxbJy1JJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkKLSAgZWxzZQotICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsPW5vIgotICAgIExJQkxUREw9Ii1sbHRkbCIKLSAgICBJTkNMVERMPQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotCi1kbmwgVGhpcyBpcyBqdXN0IHRvIHNpbGVuY2UgYWNsb2NhbCBhYm91dCB0aGUgbWFjcm8gbm90IGJlaW5nIHVzZWQKLWlmZWxzZShbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2FscGhhLWRpcy5jIGIvb3Bjb2Rlcy9hbHBoYS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyZDhmYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FscGhhLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qIGFscGhhLWRpcy5jIC0tIERpc2Fzc2VtYmxlIEFscGhhIEFYUCBpbnN0cnVjdGlvbnMKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4sCi0gICBwYXR0ZXJuZWQgYWZ0ZXIgdGhlIFBQQyBvcGNvZGUgaGFuZGxpbmcgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2FscGhhLmgiCi0KLS8qIE9TRiByZWdpc3RlciBuYW1lcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3NmX3JlZ25hbWVzWzY0XSA9Ci17Ci0gICJ2MCIsICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsICJ0NCIsICJ0NSIsICJ0NiIsCi0gICJ0NyIsICJzMCIsICJzMSIsICJzMiIsICJzMyIsICJzNCIsICJzNSIsICJmcCIsCi0gICJhMCIsICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJhNSIsICJ0OCIsICJ0OSIsCi0gICJ0MTAiLCAidDExIiwgInJhIiwgInQxMiIsICJhdCIsICJncCIsICJzcCIsICJ6ZXJvIiwKLSAgIiRmMCIsICIkZjEiLCAiJGYyIiwgIiRmMyIsICIkZjQiLCAiJGY1IiwgIiRmNiIsICIkZjciLAotICAiJGY4IiwgIiRmOSIsICIkZjEwIiwgIiRmMTEiLCAiJGYxMiIsICIkZjEzIiwgIiRmMTQiLCAiJGYxNSIsCi0gICIkZjE2IiwgIiRmMTciLCAiJGYxOCIsICIkZjE5IiwgIiRmMjAiLCAiJGYyMSIsICIkZjIyIiwgIiRmMjMiLAotICAiJGYyNCIsICIkZjI1IiwgIiRmMjYiLCAiJGYyNyIsICIkZjI4IiwgIiRmMjkiLCAiJGYzMCIsICIkZjMxIgotfTsKLQotLyogVk1TIHJlZ2lzdGVyIG5hbWVzLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXNfcmVnbmFtZXNbNjRdID0KLXsKLSAgIlIwIiwgIlIxIiwgIlIyIiwgIlIzIiwgIlI0IiwgIlI1IiwgIlI2IiwgIlI3IiwKLSAgIlI4IiwgIlI5IiwgIlIxMCIsICJSMTEiLCAiUjEyIiwgIlIxMyIsICJSMTQiLCAiUjE1IiwKLSAgIlIxNiIsICJSMTciLCAiUjE4IiwgIlIxOSIsICJSMjAiLCAiUjIxIiwgIlIyMiIsICJSMjMiLAotICAiUjI0IiwgIkFJIiwgIlJBIiwgIlBWIiwgIkFUIiwgIkZQIiwgIlNQIiwgIlJaIiwKLSAgIkYwIiwgIkYxIiwgIkYyIiwgIkYzIiwgIkY0IiwgIkY1IiwgIkY2IiwgIkY3IiwKLSAgIkY4IiwgIkY5IiwgIkYxMCIsICJGMTEiLCAiRjEyIiwgIkYxMyIsICJGMTQiLCAiRjE1IiwKLSAgIkYxNiIsICJGMTciLCAiRjE4IiwgIkYxOSIsICJGMjAiLCAiRjIxIiwgIkYyMiIsICJGMjMiLAotICAiRjI0IiwgIkYyNSIsICJGMjYiLCAiRjI3IiwgIkYyOCIsICJGMjkiLCAiRjMwIiwgIkZaIgotfTsKLQotLyogRGlzYXNzZW1ibGUgQWxwaGEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2FscGhhIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlX2luZGV4W0FYUF9OT1BTKzFdOwotICBjb25zdCBjaGFyICogY29uc3QgKiByZWduYW1lczsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlLCAqb3Bjb2RlX2VuZDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKLSAgdW5zaWduZWQgaW5zbiwgb3AsIGlzYV9tYXNrOwotICBpbnQgbmVlZF9jb21tYTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBtYWpvcm9wIHRhYmxlIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggKi8KLSAgaWYgKCFvcGNvZGVfaW5kZXhbMF0pCi0gICAgewotICAgICAgb3Bjb2RlID0gYWxwaGFfb3Bjb2RlczsKLSAgICAgIG9wY29kZV9lbmQgPSBvcGNvZGUgKyBhbHBoYV9udW1fb3Bjb2RlczsKLQotICAgICAgZm9yIChvcCA9IDA7IG9wIDwgQVhQX05PUFM7ICsrb3ApCi0gICAgICAgIHsKLSAgICAgICAgICBvcGNvZGVfaW5kZXhbb3BdID0gb3Bjb2RlOwotICAgICAgICAgIHdoaWxlIChvcGNvZGUgPCBvcGNvZGVfZW5kICYmIG9wID09IEFYUF9PUCAob3Bjb2RlLT5vcGNvZGUpKQotCSAgICArK29wY29kZTsKLSAgICAgICAgfQotICAgICAgb3Bjb2RlX2luZGV4W29wXSA9IG9wY29kZTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIpCi0gICAgcmVnbmFtZXMgPSB2bXNfcmVnbmFtZXM7Ci0gIGVsc2UKLSAgICByZWduYW1lcyA9IG9zZl9yZWduYW1lczsKLQotICBpc2FfbWFzayA9IEFYUF9PUENPREVfTk9QQUw7Ci0gIHN3aXRjaCAoaW5mby0+bWFjaCkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9hbHBoYV9ldjQ6Ci0gICAgICBpc2FfbWFzayB8PSBBWFBfT1BDT0RFX0VWNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfYWxwaGFfZXY1OgotICAgICAgaXNhX21hc2sgfD0gQVhQX09QQ09ERV9FVjU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX2FscGhhX2V2NjoKLSAgICAgIGlzYV9tYXNrIHw9IEFYUF9PUENPREVfRVY2OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGluc24gaW50byBhIGhvc3Qgd29yZCAqLwotICB7Ci0gICAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICAgIGludCBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICBpbnNuID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLSAgfQotCi0gIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9wID0gQVhQX09QIChpbnNuKTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgb3Bjb2RlX2VuZCA9IG9wY29kZV9pbmRleFtvcCsxXTsKLSAgZm9yIChvcGNvZGUgPSBvcGNvZGVfaW5kZXhbb3BdOyBvcGNvZGUgPCBvcGNvZGVfZW5kOyArK29wY29kZSkKLSAgICB7Ci0gICAgICBpZiAoKGluc24gJiBvcGNvZGUtPm1hc2spICE9IG9wY29kZS0+b3Bjb2RlKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoIShvcGNvZGUtPmZsYWdzICYgaXNhX21hc2spKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KLQkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0JIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIHsKLSAgICAgICAgaW50IGludmFsaWQgPSAwOwotICAgICAgICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0JICB7Ci0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9IGFscGhhX29wZXJhbmRzICsgKm9waW5kZXg7Ci0JICAgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICAgICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sICZpbnZhbGlkKTsKLQkgIH0KLSAgICAgICAgaWYgKGludmFsaWQpCi0JICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIGdvdG8gZm91bmQ7Ci0gICAgfQotCi0gIC8qIE5vIGluc3RydWN0aW9uIGZvdW5kICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmcgJSMwOHgiLCBpbnNuKTsKLSAgICAKLSAgcmV0dXJuIDQ7Ci0KLWZvdW5kOgotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3Bjb2RlLT5uYW1lKTsKLSAgaWYgKG9wY29kZS0+b3BlcmFuZHNbMF0gIT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgLyogTm93IGV4dHJhY3QgYW5kIHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0gIG5lZWRfY29tbWEgPSAwOwotICBmb3IgKG9waW5kZXggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleCAhPSAwOyBvcGluZGV4KyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSBhbHBoYV9vcGVyYW5kcyArICpvcGluZGV4OwotICAgICAgaW50IHZhbHVlOwotCi0gICAgICAvKiBPcGVyYW5kcyB0aGF0IGFyZSBtYXJrZWQgRkFLRSBhcmUgc2ltcGx5IGlnbm9yZWQuICBXZQotCSBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IHRoZSBleHRyYWN0IGZ1bmN0aW9uIGNvbnNpZGVyZWQKLQkgdGhlIGluc3RydWN0aW9uIHRvIGJlIHZhbGlkLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GQUtFKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQl2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWUgPSAoaW5zbiA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1NJR05FRCkKLQkgICAgewotCSAgICAgIGludCBzaWduYml0ID0gMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpOwotCSAgICAgIHZhbHVlID0gKHZhbHVlIF4gc2lnbmJpdCkgLSBzaWduYml0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobmVlZF9jb21tYSAmJgotCSAgKChvcGVyYW5kLT5mbGFncyAmIChBWFBfT1BFUkFORF9QQVJFTlN8QVhQX09QRVJBTkRfQ09NTUEpKQotCSAgICE9IEFYUF9PUEVSQU5EX1BBUkVOUykpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JfQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUEFSRU5TKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCi0gICAgICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfSVIpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ25hbWVzW3ZhbHVlXSk7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZQUikKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnbmFtZXNbdmFsdWUrMzJdKTsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUkVMQVRJVkUpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgNCArIHZhbHVlLCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWx1ZSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlI3giLCB2YWx1ZSk7Ci0KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1BBUkVOUykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLSAgICAgIG5lZWRfY29tbWEgPSAxOwotICAgIH0KLQotICByZXR1cm4gNDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYWxwaGEtb3BjLmMgYi9vcGNvZGVzL2FscGhhLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YThjYTU5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWxwaGEtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ2ICswLDAgQEAKLS8qIGFscGhhLW9wYy5jIC0tIEFscGhhIEFYUCBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEBjeWdudXMuY29tPiwKLSAgIHBhdHRlcm5lZCBhZnRlciB0aGUgUFBDIG9wY29kZSBoYW5kbGluZyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9hbHBoYS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIEFscGhhIEFYUCBvcGNvZGUgdGFibGUuICBUaGUgb3Bjb2RlIHRhYmxlIGluY2x1ZGVzCi0gICBhbG1vc3QgYWxsIG9mIHRoZSBleHRlbmRlZCBpbnN0cnVjdGlvbiBtbmVtb25pY3MuICBUaGlzIHBlcm1pdHMgdGhlCi0gICBkaXNhc3NlbWJsZXIgdG8gdXNlIHRoZW0sIGFuZCBzaW1wbGlmaWVzIHRoZSBhc3NlbWJsZXIgbG9naWMsIGF0IHRoZQotICAgY29zdCBvZiBpbmNyZWFzaW5nIHRoZSB0YWJsZSBzaXplLiAgVGhlIHRhYmxlIGlzIHN0cmljdGx5IGNvbnN0YW50Ci0gICBkYXRhLCBzbyB0aGUgY29tcGlsZXIgc2hvdWxkIGJlIGFibGUgdG8gcHV0IGl0IGluIHRoZSAudGV4dCBzZWN0aW9uLgotCi0gICBUaGlzIGZpbGUgYWxzbyBob2xkcyB0aGUgb3BlcmFuZCB0YWJsZS4gIEFsbCBrbm93bGVkZ2UgYWJvdXQgaW5zZXJ0aW5nCi0gICBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9ucyBhbmQgdmljZS12ZXJzYSBpcyBrZXB0IGluIHRoaXMgZmlsZS4KLQotICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYmFzZSBpbnN0cnVjdGlvbiBzZXQgd2FzIGNvbXBpbGVkIGZyb20gdGhlCi0gICBfQWxwaGEgQXJjaGl0ZWN0dXJlIEhhbmRib29rXywgRGlnaXRhbCBPcmRlciBOdW1iZXIgRUMtUUQyS0ItVEUsCi0gICB2ZXJzaW9uIDIuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBvc3QtZXY1IGFyY2hpdGVjdHVyZSBleHRlbnNpb25zIEJXWCwgQ0lYIGFuZAotICAgTUFYIGNhbWUgZnJvbSB2ZXJzaW9uIDMgb2YgdGhpcyBzYW1lIGRvY3VtZW50LCB3aGljaCBpcyBhbHNvIGF2YWlsYWJsZQotICAgb24tbGluZSBhdCBodHRwOi8vZnRwLmRpZ2l0YWwuY29tL3B1Yi9EaWdpdGFsL2luZm8vc2VtaWNvbmR1Y3RvcgotICAgL2xpdGVyYXR1cmUvYWxwaGFoYjIucGRmCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIEVWNCBQQUxjb2RlIGluc3RydWN0aW9ucyB3YXMgY29tcGlsZWQgZnJvbQotICAgX0RFQ2NoaXAgMjEwNjQgYW5kIERFQ2NoaXAgMjEwNjRBIEFscGhhIEFYUCBNaWNyb3Byb2Nlc3NvcnMgSGFyZHdhcmUKLSAgIFJlZmVyZW5jZSBNYW51YWxfLCBEaWdpdGFsIE9yZGVyIE51bWJlciBFQy1ROVpVQS1URSwgcHJlbGltaW5hcnkKLSAgIHJldmlzaW9uIGRhdGVkIEp1bmUgMTk5NC4KLQotICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgRVY1IFBBTGNvZGUgaW5zdHJ1Y3Rpb25zIHdhcyBjb21waWxlZCBmcm9tCi0gICBfQWxwaGEgMjExNjQgTWljcm9wcm9jZXNzb3IgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbF8sIERpZ2l0YWwKLSAgIE9yZGVyIE51bWJlciBFQy1RQUVRQi1URSwgcHJlbGltaW5hcnkgcmV2aXNpb24gZGF0ZWQgQXByaWwgMTk5NS4gICovCi0MCi0vKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfcmJhIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9yY2EgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3phIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF96YiBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfemMgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X2JkaXNwIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9qaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfZXY2aHdqaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLQotc3RhdGljIGludCBleHRyYWN0X3JiYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3JjYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3phIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfemIgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF96YyBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X2JkaXNwIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfamhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9ldjZod2poaW50IFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSAgKi8KLQotY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgYWxwaGFfb3BlcmFuZHNbXSA9Ci17Ci0gIC8qIFRoZSBmaWVsZHMgYXJlIGJpdHMsIHNoaWZ0LCBpbnNlcnQsIGV4dHJhY3QsIGZsYWdzICovCi0gIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgZW5kLW9mLWxpc3QgKi8KLSNkZWZpbmUgVU5VU0VECQkwCi0gIHsgMCwgMCwgMCwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBwbGFpbiBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkcyAqLwotI2RlZmluZSBSQQkJKFVOVVNFRCArIDEpCi0gIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0lSLCAwLCAwIH0sCi0jZGVmaW5lIFJCCQkoUkEgKyAxKQotICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAotI2RlZmluZSBSQwkJKFJCICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAotCi0gIC8qIFRoZSBwbGFpbiBmcCByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgRkEJCShSQyArIDEpCi0gIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAotI2RlZmluZSBGQgkJKEZBICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfRlBSLCAwLCAwIH0sCi0jZGVmaW5lIEZDCQkoRkIgKyAxKQotICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAotCi0gIC8qIFRoZSBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVuIHRoZXkgYXJlIFpFUk8gKi8KLSNkZWZpbmUgWkEJCShGQyArIDEpCi0gIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YSwgZXh0cmFjdF96YSB9LAotI2RlZmluZSBaQgkJKFpBICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3piLCBleHRyYWN0X3piIH0sCi0jZGVmaW5lIFpDCQkoWkIgKyAxKQotICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YywgZXh0cmFjdF96YyB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG5lZWRzIHBhcmVudGhlc2VzICovCi0jZGVmaW5lIFBSQgkJKFpDICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TLCAwLCAwIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgbmVlZHMgcGFyZW50aGVzZXMgX2FuZF8gYSBwcmVjZWRpbmcgY29tbWEgKi8KLSNkZWZpbmUgQ1BSQgkJKFBSQiArIDEpCi0gIHsgNSwgMTYsIDAsCi0gICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BLCAwLCAwIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgUkEgZmllbGQgKi8KLSNkZWZpbmUgUkJBCQkoQ1BSQiArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF9yYmEsIGV4dHJhY3RfcmJhIH0sCi0KLSAgLyogVGhlIFJDIGZpZWxkIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgUkIgZmllbGQgKi8KLSNkZWZpbmUgUkNBCQkoUkJBICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfcmNhLCBleHRyYWN0X3JjYSB9LAotCi0gIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkEgKi8KLSNkZWZpbmUgRFJDMQkJKFJDQSArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNULCAwLCAwIH0sCi0KLSAgLyogVGhlIFJDIGZpZWxkIHdoZW4gaXQgY2FuICpkZWZhdWx0KiB0byBSQiAqLwotI2RlZmluZSBEUkMyCQkoRFJDMSArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkEgKi8KLSNkZWZpbmUgREZDMQkJKERSQzIgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfRlBSfEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1QsIDAsIDAgfSwKLQotICAvKiBUaGUgRkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJCICovCi0jZGVmaW5lIERGQzIJCShERkMxICsgMSkKLSAgeyA1LCAwLCAwLAotICAgIEFYUF9PUEVSQU5EX0ZQUnxBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCwgMCwgMCB9LAotCi0gIC8qIFRoZSB1bnNpZ25lZCA4LWJpdCBsaXRlcmFsIG9mIE9wZXJhdGUgZm9ybWF0IGluc25zICovCi0jZGVmaW5lIExJVAkJKERGQzIgKyAxKQotICB7IDgsIDEzLCAtTElULCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSBzaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBvZiBNZW1vcnkgZm9ybWF0IGluc25zLiAgRnJvbSBoZXJlCi0gICAgIHdlIGNhbid0IHRlbGwgd2hhdCByZWxvY2F0aW9uIHNob3VsZCBiZSB1c2VkLCBzbyBkb24ndCB1c2UgYSBkZWZhdWx0LiAqLwotI2RlZmluZSBNRElTUAkJKExJVCArIDEpCi0gIHsgMTYsIDAsIC1NRElTUCwgQVhQX09QRVJBTkRfU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIHNpZ25lZCAiMjMtYml0IiBhbGlnbmVkIGRpc3BsYWNlbWVudCBvZiBCcmFuY2ggZm9ybWF0IGluc25zICovCi0jZGVmaW5lIEJESVNQCQkoTURJU1AgKyAxKQotICB7IDIxLCAwLCBCRkRfUkVMT0NfMjNfUENSRUxfUzIsIAotICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFLCBpbnNlcnRfYmRpc3AsIGV4dHJhY3RfYmRpc3AgfSwKLQotICAvKiBUaGUgMjYtYml0IFBBTGNvZGUgZnVuY3Rpb24gKi8KLSNkZWZpbmUgUEFMRk4JCShCRElTUCArIDEpCi0gIHsgMjYsIDAsIC1QQUxGTiwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgb3B0aW9uYWwgc2lnbmVkICIxNi1iaXQiIGFsaWduZWQgZGlzcGxhY2VtZW50IG9mIHRoZSBKTVAvSlNSIGhpbnQgKi8KLSNkZWZpbmUgSk1QSElOVAkJKFBBTEZOICsgMSkKLSAgeyAxNCwgMCwgQkZEX1JFTE9DX0FMUEhBX0hJTlQsCi0gICAgQVhQX09QRVJBTkRfUkVMQVRJVkV8QVhQX09QRVJBTkRfREVGQVVMVF9aRVJPfEFYUF9PUEVSQU5EX05PT1ZFUkZMT1csCi0gICAgaW5zZXJ0X2poaW50LCBleHRyYWN0X2poaW50IH0sCi0KLSAgLyogVGhlIG9wdGlvbmFsIGhpbnQgdG8gUkVUL0pTUl9DT1JPVVRJTkUgKi8KLSNkZWZpbmUgUkVUSElOVAkJKEpNUEhJTlQgKyAxKQotICB7IDE0LCAwLCAtUkVUSElOVCwKLSAgICBBWFBfT1BFUkFORF9VTlNJR05FRHxBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk8sIDAsIDAgfSwKLQotICAvKiBUaGUgMTItYml0IGRpc3BsYWNlbWVudCBmb3IgdGhlIGV2WzQ2XSBod197bGQsc3R9IChwYWwxYi9wYWwxZikgaW5zbnMgKi8KLSNkZWZpbmUgRVY0SFdESVNQCShSRVRISU5UICsgMSkKLSNkZWZpbmUgRVY2SFdESVNQCShFVjRIV0RJU1ApCi0gIHsgMTIsIDAsIC1FVjRIV0RJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSA1LWJpdCBpbmRleCBmb3IgdGhlIGV2NCBod19tW2Z0XXByIChwYWwxOS9wYWwxZCkgaW5zbnMgKi8KLSNkZWZpbmUgRVY0SFdJTkRFWAkoRVY0SFdESVNQICsgMSkKLSAgeyA1LCAwLCAtRVY0SFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgOC1iaXQgaW5kZXggZm9yIHRoZSBvZGRseSB1bnF1YWxpZmllZCBod19tW3RmXXByIGluc25zCi0gICAgIHRoYXQgb2NjdXIgaW4gREVDIFBBTGNvZGUuICAqLwotI2RlZmluZSBFVjRFWFRIV0lOREVYCShFVjRIV0lOREVYICsgMSkKLSAgeyA4LCAwLCAtRVY0RVhUSFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgMTAtYml0IGRpc3BsYWNlbWVudCBmb3IgdGhlIGV2NSBod197bGQsc3R9IChwYWwxYi9wYWwxZikgaW5zbnMgKi8KLSNkZWZpbmUgRVY1SFdESVNQCShFVjRFWFRIV0lOREVYICsgMSkKLSAgeyAxMCwgMCwgLUVWNUhXRElTUCwgQVhQX09QRVJBTkRfU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDE2LWJpdCBpbmRleCBmb3IgdGhlIGV2NSBod19tW2Z0XXByIChwYWwxOS9wYWwxZCkgaW5zbnMgKi8KLSNkZWZpbmUgRVY1SFdJTkRFWAkoRVY1SFdESVNQICsgMSkKLSAgeyAxNiwgMCwgLUVWNUhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDE2LWJpdCBjb21iaW5lZCBpbmRleC9zY29yZWJvYXJkIG1hc2sgZm9yIHRoZSBldjYKLSAgICAgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCi0jZGVmaW5lIEVWNkhXSU5ERVgJKEVWNUhXSU5ERVggKyAxKQotICB7IDE2LCAwLCAtRVY2SFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgMTMtYml0IGJyYW5jaCBoaW50IGZvciB0aGUgZXY2IGh3X2ptcC9qc3IgKHBhbDFlKSBpbnNuICovCi0jZGVmaW5lIEVWNkhXSk1QSElOVAkoRVY2SFdJTkRFWCsgMSkKLSAgeyA4LCAwLCAtRVY2SFdKTVBISU5ULAotICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFfEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVST3xBWFBfT1BFUkFORF9OT09WRVJGTE9XLAotICAgIGluc2VydF9ldjZod2poaW50LCBleHRyYWN0X2V2Nmh3amhpbnQgfQotfTsKLQotY29uc3QgdW5zaWduZWQgYWxwaGFfbnVtX29wZXJhbmRzID0gc2l6ZW9mKGFscGhhX29wZXJhbmRzKS9zaXplb2YoKmFscGhhX29wZXJhbmRzKTsKLQotLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgaXMgdGhlIHNhbWUgYXMgdGhlIFJBIGZpZWxkIGluIHRoZSBzYW1lIGluc24uCi0gICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIGZha2UuICBUaGUgaW5zZXJ0aW9uIGZ1bmN0aW9uIGp1c3QgY29waWVzCi0gICB0aGUgUkEgZmllbGQgaW50byB0aGUgUkIgZmllbGQsIGFuZCB0aGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0Ci0gICBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUgc2FtZS4gKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9yYmEoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF9yYmEoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAoKGluc24gPj4gMTYpICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgc2FtZSBmb3IgdGhlIFJDIGZpZWxkICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfcmNhKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgKChpbnNuID4+IDIxKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3JjYShpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9IChpbnNuICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBGYWtlIGFyZ3VtZW50cyBpbiB3aGljaCB0aGUgcmVnaXN0ZXJzIG11c3QgYmUgc2V0IHRvIFpFUk8gKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgzMSA8PCAyMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfemEoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9IDMxKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfemIoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoMzEgPDwgMTYpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3piKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMICYmICgoaW5zbiA+PiAxNikgJiAweDFmKSAhPSAzMSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3pjKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgMzE7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfemMoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwgJiYgKGluc24gJiAweDFmKSAhPSAzMSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoZSBkaXNwbGFjZW1lbnQgZmllbGQgb2YgYSBCcmFuY2ggZm9ybWF0IGluc24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9iZGlzcChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKLSAgICAqZXJybXNnID0gXygiYnJhbmNoIG9wZXJhbmQgdW5hbGlnbmVkIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgxRkZGRkYpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfYmRpc3AoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4MUZGRkZGKSBeIDB4MTAwMDAwKSAtIDB4MTAwMDAwKTsKLX0KLQotCi0vKiBUaGUgaGludCBmaWVsZCBvZiBhIEpNUC9KU1IgaW5zbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X2poaW50KGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKilOVUxMICYmICh2YWx1ZSAmIDMpKQotICAgICplcnJtc2cgPSBfKCJqdW1wIGhpbnQgdW5hbGlnbmVkIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgzRkZGKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1leHRyYWN0X2poaW50KGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gNCAqICgoKGluc24gJiAweDNGRkYpIF4gMHgyMDAwKSAtIDB4MjAwMCk7Ci19Ci0KLS8qIFRoZSBoaW50IGZpZWxkIG9mIGFuIEVWNiBIV19KTVAvSlNSIGluc24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9ldjZod2poaW50KGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKilOVUxMICYmICh2YWx1ZSAmIDMpKQotICAgICplcnJtc2cgPSBfKCJqdW1wIGhpbnQgdW5hbGlnbmVkIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgxRkZGKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1leHRyYWN0X2V2Nmh3amhpbnQoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4MUZGRikgXiAweDEwMDApIC0gMHgxMDAwKTsKLX0KLQotDAotLyogTWFjcm9zIHVzZWQgdG8gZm9ybSBvcGNvZGVzICovCi0KLS8qIFRoZSBtYWluIG9wY29kZSAqLwotI2RlZmluZSBPUCh4KQkJKCgoeCkgJiAweDNGKSA8PCAyNikKLSNkZWZpbmUgT1BfTUFTSwkJMHhGQzAwMDAwMAotCi0vKiBCcmFuY2ggZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBCUkFfKG9vKQlPUChvbykKLSNkZWZpbmUgQlJBX01BU0sJT1BfTUFTSwotI2RlZmluZSBCUkEob28pCQlCUkFfKG9vKSwgQlJBX01BU0sKLQotLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBGUF8ob28sZmZmKQkoT1Aob28pIHwgKCgoZmZmKSAmIDB4N0ZGKSA8PCA1KSkKLSNkZWZpbmUgRlBfTUFTSwkJKE9QX01BU0sgfCAweEZGRTApCi0jZGVmaW5lIEZQKG9vLGZmZikJRlBfKG9vLGZmZiksIEZQX01BU0sKLQotLyogTWVtb3J5IGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTUVNXyhvbykJT1Aob28pCi0jZGVmaW5lIE1FTV9NQVNLCU9QX01BU0sKLSNkZWZpbmUgTUVNKG9vKQkJTUVNXyhvbyksIE1FTV9NQVNLCi0KLS8qIE1lbW9yeS9GdW5jIENvZGUgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNRkNfKG9vLGZmZmYpCShPUChvbykgfCAoKGZmZmYpICYgMHhGRkZGKSkKLSNkZWZpbmUgTUZDX01BU0sJKE9QX01BU0sgfCAweEZGRkYpCi0jZGVmaW5lIE1GQyhvbyxmZmZmKQlNRkNfKG9vLGZmZmYpLCBNRkNfTUFTSwotCi0vKiBNZW1vcnkvQnJhbmNoIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTUJSXyhvbyxoKQkoT1Aob28pIHwgKCgoaCkgJiAzKSA8PCAxNCkpCi0jZGVmaW5lIE1CUl9NQVNLCShPUF9NQVNLIHwgMHhDMDAwKQotI2RlZmluZSBNQlIob28saCkJTUJSXyhvbyxoKSwgTUJSX01BU0sKLQotLyogT3BlcmF0ZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zLiAgVGhlIE9QUkwgdmFyaWFudCBzcGVjaWZpZXMgYQotICAgbGl0ZXJhbCBzZWNvbmQgYXJndW1lbnQuICovCi0jZGVmaW5lIE9QUl8ob28sZmYpCShPUChvbykgfCAoKChmZikgJiAweDdGKSA8PCA1KSkKLSNkZWZpbmUgT1BSTF8ob28sZmYpCShPUFJfKChvbyksKGZmKSkgfCAweDEwMDApCi0jZGVmaW5lIE9QUl9NQVNLCShPUF9NQVNLIHwgMHgxRkUwKQotI2RlZmluZSBPUFIob28sZmYpCU9QUl8ob28sZmYpLCBPUFJfTUFTSwotI2RlZmluZSBPUFJMKG9vLGZmKQlPUFJMXyhvbyxmZiksIE9QUl9NQVNLCi0KLS8qIEdlbmVyaWMgUEFMY29kZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFBDRF8ob28pCU9QKG9vKQotI2RlZmluZSBQQ0RfTUFTSwlPUF9NQVNLCi0jZGVmaW5lIFBDRChvbykJCVBDRF8ob28pLCBQQ0RfTUFTSwotCi0vKiBTcGVjaWZpYyBQQUxjb2RlIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBTUENEXyhvbyxmZmZmKQkoT1Aob28pIHwgKChmZmZmKSAmIDB4M0ZGRkZGRikpCi0jZGVmaW5lIFNQQ0RfTUFTSwkweEZGRkZGRkZGCi0jZGVmaW5lIFNQQ0Qob28sZmZmZikJU1BDRF8ob28sZmZmZiksIFNQQ0RfTUFTSwotCi0vKiBIYXJkd2FyZSBtZW1vcnkgKGh3X3tsZCxzdH0pIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBFVjRIV01FTV8ob28sZikJKE9QKG9vKSB8ICgoKGYpICYgMHhGKSA8PCAxMikpCi0jZGVmaW5lIEVWNEhXTUVNX01BU0sJKE9QX01BU0sgfCAweEYwMDApCi0jZGVmaW5lIEVWNEhXTUVNKG9vLGYpCUVWNEhXTUVNXyhvbyxmKSwgRVY0SFdNRU1fTUFTSwotCi0jZGVmaW5lIEVWNUhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweDNGKSA8PCAxMCkpCi0jZGVmaW5lIEVWNUhXTUVNX01BU0sJKE9QX01BU0sgfCAweEY4MDApCi0jZGVmaW5lIEVWNUhXTUVNKG9vLGYpCUVWNUhXTUVNXyhvbyxmKSwgRVY1SFdNRU1fTUFTSwotCi0jZGVmaW5lIEVWNkhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweEYpIDw8IDEyKSkKLSNkZWZpbmUgRVY2SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjAwMCkKLSNkZWZpbmUgRVY2SFdNRU0ob28sZikJRVY2SFdNRU1fKG9vLGYpLCBFVjZIV01FTV9NQVNLCi0KLSNkZWZpbmUgRVY2SFdNQlJfKG9vLGgpCShPUChvbykgfCAoKChoKSAmIDcpIDw8IDEzKSkKLSNkZWZpbmUgRVY2SFdNQlJfTUFTSwkoT1BfTUFTSyB8IDB4RTAwMCkKLSNkZWZpbmUgRVY2SFdNQlIob28saCkJRVY2SFdNQlJfKG9vLGgpLCBFVjZIV01CUl9NQVNLCi0KLS8qIEFiYnJldmlhdGlvbnMgZm9yIGluc3RydWN0aW9uIHN1YnNldHMuICAqLwotI2RlZmluZSBCQVNFCQkJQVhQX09QQ09ERV9CQVNFCi0jZGVmaW5lIEVWNAkJCUFYUF9PUENPREVfRVY0Ci0jZGVmaW5lIEVWNQkJCUFYUF9PUENPREVfRVY1Ci0jZGVmaW5lIEVWNgkJCUFYUF9PUENPREVfRVY2Ci0jZGVmaW5lIEJXWAkJCUFYUF9PUENPREVfQldYCi0jZGVmaW5lIENJWAkJCUFYUF9PUENPREVfQ0lYCi0jZGVmaW5lIE1BWAkJCUFYUF9PUENPREVfTUFYCi0KLS8qIENvbW1vbiBjb21iaW5hdGlvbnMgb2YgYXJndW1lbnRzICovCi0jZGVmaW5lIEFSR19OT05FCQl7IDAgfQotI2RlZmluZSBBUkdfQlJBCQkJeyBSQSwgQkRJU1AgfQotI2RlZmluZSBBUkdfRkJSQQkJeyBGQSwgQkRJU1AgfQotI2RlZmluZSBBUkdfRlAJCQl7IEZBLCBGQiwgREZDMSB9Ci0jZGVmaW5lIEFSR19GUFoxCQl7IFpBLCBGQiwgREZDMSB9Ci0jZGVmaW5lIEFSR19NRU0JCQl7IFJBLCBNRElTUCwgUFJCIH0KLSNkZWZpbmUgQVJHX0ZNRU0JCXsgRkEsIE1ESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfT1BSCQkJeyBSQSwgUkIsIERSQzEgfQotI2RlZmluZSBBUkdfT1BSTAkJeyBSQSwgTElULCBEUkMxIH0KLSNkZWZpbmUgQVJHX09QUloxCQl7IFpBLCBSQiwgRFJDMSB9Ci0jZGVmaW5lIEFSR19PUFJMWjEJCXsgWkEsIExJVCwgUkMgfQotI2RlZmluZSBBUkdfUENECQkJeyBQQUxGTiB9Ci0jZGVmaW5lIEFSR19FVjRIV01FTQkJeyBSQSwgRVY0SFdESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRVY0SFdNUFIJCXsgUkEsIFJCQSwgRVY0SFdJTkRFWCB9Ci0jZGVmaW5lIEFSR19FVjVIV01FTQkJeyBSQSwgRVY1SFdESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRVY2SFdNRU0JCXsgUkEsIEVWNkhXRElTUCwgUFJCIH0KLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRSBPUENPREUgTUFTSyB7IE9QRVJBTkRTIH0KLQotICAgTkFNRQkJaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotCi0gICBPUENPREUJaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLQotICAgTUFTSwkJaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgICAgICAgICAJd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLQotICAgT1BFUkFORFMJaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBwcmVjZWRpbmcgbWFjcm9zIG1lcmdlIHRoZSB0ZXh0IG9mIHRoZSBPUENPREUgYW5kIE1BU0sgZmllbGRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4KLQotICAgT3RoZXJ3aXNlLCBpdCBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIGFuZCBtaW5vciBmdW5jdGlvbiBjb2RlLgotCi0gICBUaGVyZSBhcmUgdGhyZWUgY2xhc3NlcyBvZiBub3QtcmVhbGx5LWluc3RydWN0aW9ucyBpbiB0aGlzIHRhYmxlOgotCi0gICBBTElBUwlpcyBhbm90aGVyIG5hbWUgZm9yIGFub3RoZXIgaW5zdHJ1Y3Rpb24uICBTb21lIG9mCi0JCXRoZXNlIGNvbWUgZnJvbSB0aGUgQXJjaGl0ZWN0dXJlIEhhbmRib29rLCBzb21lCi0JCWNvbWUgZnJvbSB0aGUgb3JpZ2luYWwgZ2FzIG9wY29kZSB0YWJsZXMuICBJbiBhbGwKLQkJY2FzZXMsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBvcGNvZGUgaXMgdW5jaGFuZ2VkLgotCi0gICBQU0VVRE8JYSBzdHlsaXplZCBjb2RlIGZvcm0gZW5kb3JzZWQgYnkgQ2hhcHRlciBBLjQgb2YgdGhlCi0JCUFyY2hpdGVjdHVyZSBIYW5kYm9vay4KLQotICAgRVhUUkEJYSBzdHlsaXplZCBjb2RlIGZvcm0gZm91bmQgaW4gdGhlIG9yaWdpbmFsIGdhcyB0YWJsZXMuCi0KLSAgIEFuZCB0d28gYW5ub3RhdGlvbnM6Ci0KLSAgIEVWNTYgQlVUCW9wY29kZXMgdGhhdCBhcmUgb2ZmaWNpYWxseSBpbnRyb2R1Y2VkIGFzIG9mIHRoZSBldjU2LAotICAgCQlidXQgd2l0aCBkZWZpbmVkIHJlc3VsdHMgb24gcHJldmlvdXMgaW1wbGVtZW50YXRpb25zLgotCi0gICBFVjU2IFVOQQlvcGNvZGVzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGFzIG9mIHRoZSBldjU2IHdpdGgKLSAgIAkJcHJlc3VtYWJseSB1bmRlZmluZWQgcmVzdWx0cyBvbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMKLQkJdGhhdCB3ZXJlIG5vdCBhc3NpZ25lZCB0byBhIHBhcnRpY3VsYXIgZXh0ZW5zaW9uLgotKi8KLQotY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSBhbHBoYV9vcGNvZGVzW10gPSB7Ci0gIHsgImhhbHQiLAkJU1BDRCgweDAwLDB4MDAwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImRyYWluYSIsCQlTUENEKDB4MDAsMHgwMDAyKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiYnB0IiwJCVNQQ0QoMHgwMCwweDAwODApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjYWxsc3lzIiwJCVNQQ0QoMHgwMCwweDAwODMpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjaG1rIiwgCQlTUENEKDB4MDAsMHgwMDgzKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiaW1iIiwJCVNQQ0QoMHgwMCwweDAwODYpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjYWxsX3BhbCIsCQlQQ0QoMHgwMCksIEJBU0UsIEFSR19QQ0QgfSwKLSAgeyAicGFsIiwJCVBDRCgweDAwKSwgQkFTRSwgQVJHX1BDRCB9LAkJLyogYWxpYXMgKi8KLQotICB7ICJsZGEiLAkJTUVNKDB4MDgpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkYWgiLAkJTUVNKDB4MDkpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkYnUiLAkJTUVNKDB4MEEpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAidW5vcCIsCQlNRU0oMHgwQiksIEJBU0UsIHsgWkEgfSB9LAkJLyogcHNldWRvICovCi0gIHsgImxkcV91IiwJCU1FTSgweDBCKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZHd1IiwJCU1FTSgweDBDKSwgQldYLCBBUkdfTUVNIH0sCi0gIHsgInN0dyIsCQlNRU0oMHgwRCksIEJXWCwgQVJHX01FTSB9LAotICB7ICJzdGIiLAkJTUVNKDB4MEUpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAic3RxX3UiLAkJTUVNKDB4MEYpLCBCQVNFLCBBUkdfTUVNIH0sCi0KLSAgeyAic2V4dGwiLAkJT1BSKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic2V4dGwiLAkJT1BSTCgweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJhZGRsIiwJCU9QUigweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZGwiLAkJT1BSTCgweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNGFkZGwiLAkJT1BSKDB4MTAsMHgwMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRhZGRsIiwJCU9QUkwoMHgxMCwweDAyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVnbCIsCQlPUFIoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJuZWdsIiwJCU9QUkwoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VibCIsCQlPUFIoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJsIiwJCU9QUkwoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczRzdWJsIiwJCU9QUigweDEwLDB4MEIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM0c3VibCIsCQlPUFJMKDB4MTAsMHgwQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGJnZSIsCQlPUFIoMHgxMCwweDBGKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBiZ2UiLAkJT1BSTCgweDEwLDB4MEYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOGFkZGwiLAkJT1BSKDB4MTAsMHgxMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhhZGRsIiwJCU9QUkwoMHgxMCwweDEyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhzdWJsIiwJCU9QUigweDEwLDB4MUIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4c3VibCIsCQlPUFJMKDB4MTAsMHgxQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcHVsdCIsCQlPUFIoMHgxMCwweDFEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXB1bHQiLAkJT1BSTCgweDEwLDB4MUQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhZGRxIiwJCU9QUigweDEwLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZHEiLAkJT1BSTCgweDEwLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNGFkZHEiLAkJT1BSKDB4MTAsMHgyMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRhZGRxIiwJCU9QUkwoMHgxMCwweDIyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVncSIsIAkJT1BSKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVncSIsIAkJT1BSTCgweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJxIiwJCU9QUigweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YnEiLAkJT1BSTCgweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNHN1YnEiLAkJT1BSKDB4MTAsMHgyQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRzdWJxIiwJCU9QUkwoMHgxMCwweDJCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wZXEiLAkJT1BSKDB4MTAsMHgyRCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wZXEiLAkJT1BSTCgweDEwLDB4MkQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOGFkZHEiLAkJT1BSKDB4MTAsMHgzMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhhZGRxIiwJCU9QUkwoMHgxMCwweDMyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhzdWJxIiwJCU9QUigweDEwLDB4M0IpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4c3VicSIsCQlPUFJMKDB4MTAsMHgzQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcHVsZSIsCQlPUFIoMHgxMCwweDNEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXB1bGUiLAkJT1BSTCgweDEwLDB4M0QpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhZGRsL3YiLAkJT1BSKDB4MTAsMHg0MCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYWRkbC92IiwJCU9QUkwoMHgxMCwweDQwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVnbC92IiwJCU9QUigweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5lZ2wvdiIsCQlPUFJMKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmwvdiIsCQlPUFIoMHgxMCwweDQ5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJsL3YiLAkJT1BSTCgweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXBsdCIsCQlPUFIoMHgxMCwweDREKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBsdCIsCQlPUFJMKDB4MTAsMHg0RCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImFkZHEvdiIsCQlPUFIoMHgxMCwweDYwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhZGRxL3YiLAkJT1BSTCgweDEwLDB4NjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdxL3YiLAkJT1BSKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVncS92IiwJCU9QUkwoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VicS92IiwJCU9QUigweDEwLDB4NjkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YnEvdiIsCQlPUFJMKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGxlIiwJCU9QUigweDEwLDB4NkQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcGxlIiwJCU9QUkwoMHgxMCwweDZEKSwgQkFTRSwgQVJHX09QUkwgfSwKLQotICB7ICJhbmQiLAkJT1BSKDB4MTEsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYW5kIiwJCU9QUkwoMHgxMSwweDAwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiYW5kbm90IiwJCU9QUigweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSIH0sCS8qIGFsaWFzICovCi0gIHsgImFuZG5vdCIsCQlPUFJMKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFJMIH0sCS8qIGFsaWFzICovCi0gIHsgImJpYyIsCQlPUFIoMHgxMSwweDA4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJiaWMiLAkJT1BSTCgweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bGJzIiwJCU9QUigweDExLDB4MTQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsYnMiLAkJT1BSTCgweDExLDB4MTQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bGJjIiwJCU9QUigweDExLDB4MTYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsYmMiLAkJT1BSTCgweDExLDB4MTYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJub3AiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFpCLCBaQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJjbHIiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFpCLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFJCLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgUkEsIFJCQSwgUkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAibW92IiwJCU9QUkwoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgTElULCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJvciIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUiB9LAkvKiBhbGlhcyAqLwotICB7ICJvciIsCQlPUFJMKDB4MTEsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCS8qIGFsaWFzICovCi0gIHsgImJpcyIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJiaXMiLAkJT1BSTCgweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92ZXEiLAkJT1BSKDB4MTEsMHgyNCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmVxIiwJCU9QUkwoMHgxMSwweDI0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdm5lIiwJCU9QUigweDExLDB4MjYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZuZSIsCQlPUFJMKDB4MTEsMHgyNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5vdCIsCQlPUFIoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJub3QiLAkJT1BSTCgweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJvcm5vdCIsCQlPUFIoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJvcm5vdCIsCQlPUFJMKDB4MTEsMHgyOCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInhvciIsCQlPUFIoMHgxMSwweDQwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ4b3IiLAkJT1BSTCgweDExLDB4NDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bHQiLAkJT1BSKDB4MTEsMHg0NCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmx0IiwJCU9QUkwoMHgxMSwweDQ0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmdlIiwJCU9QUigweDExLDB4NDYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZnZSIsCQlPUFJMKDB4MTEsMHg0NiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImVxdiIsCQlPUFIoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJlcXYiLAkJT1BSTCgweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJ4b3Jub3QiLAkJT1BSKDB4MTEsMHg0OCksIEJBU0UsIEFSR19PUFIgfSwJLyogYWxpYXMgKi8KLSAgeyAieG9ybm90IiwJCU9QUkwoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KLSAgeyAiYW1hc2siLAkJT1BSKDB4MTEsMHg2MSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBldjU2IGJ1dCAqLwotICB7ICJhbWFzayIsCQlPUFJMKDB4MTEsMHg2MSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogZXY1NiBidXQgKi8KLSAgeyAiY21vdmxlIiwJCU9QUigweDExLDB4NjQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsZSIsCQlPUFJMKDB4MTEsMHg2NCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZndCIsCQlPUFIoMHgxMSwweDY2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92Z3QiLAkJT1BSTCgweDExLDB4NjYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbXBsdmVyIiwJCU9QUkxfKDB4MTEsMHg2Qyl8KDMxPDwyMSl8KDE8PDEzKSwKLSAgICAJCQkweEZGRkZGRkUwLCBCQVNFLCB7IFJDIH0gfSwJCS8qIGV2NTYgYnV0ICovCi0KLSAgeyAibXNrYmwiLAkJT1BSKDB4MTIsMHgwMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrYmwiLAkJT1BSTCgweDEyLDB4MDIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRibCIsCQlPUFIoMHgxMiwweDA2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRibCIsCQlPUFJMKDB4MTIsMHgwNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2JsIiwJCU9QUigweDEyLDB4MEIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2JsIiwJCU9QUkwoMHgxMiwweDBCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrd2wiLAkJT1BSKDB4MTIsMHgxMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrd2wiLAkJT1BSTCgweDEyLDB4MTIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHR3bCIsCQlPUFIoMHgxMiwweDE2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHR3bCIsCQlPUFJMKDB4MTIsMHgxNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3dsIiwJCU9QUigweDEyLDB4MUIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3dsIiwJCU9QUkwoMHgxMiwweDFCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrbGwiLAkJT1BSKDB4MTIsMHgyMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrbGwiLAkJT1BSTCgweDEyLDB4MjIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRsbCIsCQlPUFIoMHgxMiwweDI2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRsbCIsCQlPUFJMKDB4MTIsMHgyNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2xsIiwJCU9QUigweDEyLDB4MkIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2xsIiwJCU9QUkwoMHgxMiwweDJCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiemFwIiwJCU9QUigweDEyLDB4MzApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInphcCIsCQlPUFJMKDB4MTIsMHgzMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInphcG5vdCIsCQlPUFIoMHgxMiwweDMxKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ6YXBub3QiLAkJT1BSTCgweDEyLDB4MzEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2txbCIsCQlPUFIoMHgxMiwweDMyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2txbCIsCQlPUFJMKDB4MTIsMHgzMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNybCIsCQlPUFIoMHgxMiwweDM0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzcmwiLAkJT1BSTCgweDEyLDB4MzQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRxbCIsCQlPUFIoMHgxMiwweDM2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRxbCIsCQlPUFJMKDB4MTIsMHgzNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNsbCIsCQlPUFIoMHgxMiwweDM5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzbGwiLAkJT1BSTCgweDEyLDB4MzkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnNxbCIsCQlPUFIoMHgxMiwweDNCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnNxbCIsCQlPUFJMKDB4MTIsMHgzQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNyYSIsCQlPUFIoMHgxMiwweDNDKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzcmEiLAkJT1BSTCgweDEyLDB4M0MpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2t3aCIsCQlPUFIoMHgxMiwweDUyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2t3aCIsCQlPUFJMKDB4MTIsMHg1MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3doIiwJCU9QUigweDEyLDB4NTcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3doIiwJCU9QUkwoMHgxMiwweDU3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0d2giLAkJT1BSKDB4MTIsMHg1QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0d2giLAkJT1BSTCgweDEyLDB4NUEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2tsaCIsCQlPUFIoMHgxMiwweDYyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2tsaCIsCQlPUFJMKDB4MTIsMHg2MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2xoIiwJCU9QUigweDEyLDB4NjcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2xoIiwJCU9QUkwoMHgxMiwweDY3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0bGgiLAkJT1BSKDB4MTIsMHg2QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0bGgiLAkJT1BSTCgweDEyLDB4NkEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2txaCIsCQlPUFIoMHgxMiwweDcyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2txaCIsCQlPUFJMKDB4MTIsMHg3MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3FoIiwJCU9QUigweDEyLDB4NzcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3FoIiwJCU9QUkwoMHgxMiwweDc3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0cWgiLAkJT1BSKDB4MTIsMHg3QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0cWgiLAkJT1BSTCgweDEyLDB4N0EpLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgIm11bGwiLAkJT1BSKDB4MTMsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVsbCIsCQlPUFJMKDB4MTMsMHgwMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm11bHEiLAkJT1BSKDB4MTMsMHgyMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVscSIsCQlPUFJMKDB4MTMsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInVtdWxoIiwJCU9QUigweDEzLDB4MzApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInVtdWxoIiwJCU9QUkwoMHgxMywweDMwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXVsbC92IiwJCU9QUigweDEzLDB4NDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm11bGwvdiIsCQlPUFJMKDB4MTMsMHg0MCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm11bHEvdiIsCQlPUFIoMHgxMywweDYwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtdWxxL3YiLAkJT1BSTCgweDEzLDB4NjApLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgIml0b2ZzIiwJCUZQKDB4MTQsMHgwMDQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCi0gIHsgInNxcnRmL2MiLAkJRlAoMHgxNCwweDAwQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvYyIsCQlGUCgweDE0LDB4MDBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJpdG9mZiIsCQlGUCgweDE0LDB4MDE0KSwgQ0lYLCB7IFJBLCBaQiwgRkMgfSB9LAotICB7ICJpdG9mdCIsCQlGUCgweDE0LDB4MDI0KSwgQ0lYLCB7IFJBLCBaQiwgRkMgfSB9LAotICB7ICJzcXJ0Zy9jIiwJCUZQKDB4MTQsMHgwMkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L2MiLAkJRlAoMHgxNCwweDAyQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvbSIsCQlGUCgweDE0LDB4MDRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9tIiwJCUZQKDB4MTQsMHgwNkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmIiwJCUZQKDB4MTQsMHgwOEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzIiwJCUZQKDB4MTQsMHgwOEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnIiwJCUZQKDB4MTQsMHgwQUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0IiwJCUZQKDB4MTQsMHgwQUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL2QiLAkJRlAoMHgxNCwweDBDQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvZCIsCQlGUCgweDE0LDB4MEVCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi91YyIsCQlGUCgweDE0LDB4MTBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91YyIsCQlGUCgweDE0LDB4MTBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy91YyIsCQlGUCgweDE0LDB4MTJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91YyIsCQlGUCgweDE0LDB4MTJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91bSIsCQlGUCgweDE0LDB4MTRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91bSIsCQlGUCgweDE0LDB4MTZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi91IiwJCUZQKDB4MTQsMHgxOEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3UiLAkJRlAoMHgxNCwweDE4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvdSIsCQlGUCgweDE0LDB4MUFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91IiwJCUZQKDB4MTQsMHgxQUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3VkIiwJCUZQKDB4MTQsMHgxQ0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3VkIiwJCUZQKDB4MTQsMHgxRUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3NjIiwJCUZQKDB4MTQsMHg0MEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3NjIiwJCUZQKDB4MTQsMHg0MkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3MiLAkJRlAoMHgxNCwweDQ4QSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvcyIsCQlGUCgweDE0LDB4NEFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zdWMiLAlGUCgweDE0LDB4NTBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWMiLAlGUCgweDE0LDB4NTBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zdWMiLAlGUCgweDE0LDB4NTJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWMiLAlGUCgweDE0LDB4NTJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdW0iLAlGUCgweDE0LDB4NTRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdW0iLAlGUCgweDE0LDB4NTZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zdSIsCQlGUCgweDE0LDB4NThBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdSIsCQlGUCgweDE0LDB4NThCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zdSIsCQlGUCgweDE0LDB4NUFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdSIsCQlGUCgweDE0LDB4NUFCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWQiLAlGUCgweDE0LDB4NUNCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWQiLAlGUCgweDE0LDB4NUVCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWljIiwJRlAoMHgxNCwweDcwQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpYyIsCUZQKDB4MTQsMHg3MkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1aW0iLAlGUCgweDE0LDB4NzRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWltIiwJRlAoMHgxNCwweDc2QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpIiwJRlAoMHgxNCwweDc4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpIiwJRlAoMHgxNCwweDdBQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpZCIsCUZQKDB4MTQsMHg3Q0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1aWQiLAlGUCgweDE0LDB4N0VCKSwgQ0lYLCBBUkdfRlBaMSB9LAotCi0gIHsgImFkZGYvYyIsCQlGUCgweDE1LDB4MDAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvYyIsCQlGUCgweDE1LDB4MDAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvYyIsCQlGUCgweDE1LDB4MDAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvYyIsCQlGUCgweDE1LDB4MDAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL2MiLAkJRlAoMHgxNSwweDAxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvYyIsCQlGUCgweDE1LDB4MDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmcvYyIsCQlGUCgweDE1LDB4MDIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvYyIsCQlGUCgweDE1LDB4MDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvYyIsCQlGUCgweDE1LDB4MDIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL2MiLAkJRlAoMHgxNSwweDAyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL2MiLAkJRlAoMHgxNSwweDAyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL2MiLAkJRlAoMHgxNSwweDAyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFmL2MiLAkJRlAoMHgxNSwweDAzQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFnL2MiLAkJRlAoMHgxNSwweDAzRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYiLAkJRlAoMHgxNSwweDA4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdmIiwJCUZQKDB4MTUsMHgwODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZiIsCQlGUCgweDE1LDB4MDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYiLAkJRlAoMHgxNSwweDA4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmIiwJCUZQKDB4MTUsMHgwODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGciLAkJRlAoMHgxNSwweDA5RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGciLAkJRlAoMHgxNSwweDBBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdnIiwJCUZQKDB4MTUsMHgwQTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZyIsCQlGUCgweDE1LDB4MEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGciLAkJRlAoMHgxNSwweDBBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnIiwJCUZQKDB4MTUsMHgwQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2VxIiwJCUZQKDB4MTUsMHgwQTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2x0IiwJCUZQKDB4MTUsMHgwQTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2xlIiwJCUZQKDB4MTUsMHgwQTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2YiLAkJRlAoMHgxNSwweDBBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkIiwJCUZQKDB4MTUsMHgwQUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncSIsCQlGUCgweDE1LDB4MEFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWYiLAkJRlAoMHgxNSwweDBCQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFnIiwJCUZQKDB4MTUsMHgwQkUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3VjIiwJCUZQKDB4MTUsMHgxMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi91YyIsCQlGUCgweDE1LDB4MTAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvdWMiLAkJRlAoMHgxNSwweDEwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3VjIiwJCUZQKDB4MTUsMHgxMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvdWMiLAkJRlAoMHgxNSwweDExRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvdWMiLAkJRlAoMHgxNSwweDEyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3VjIiwJCUZQKDB4MTUsMHgxMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy91YyIsCQlGUCgweDE1LDB4MTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvdWMiLAkJRlAoMHgxNSwweDEyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi91YyIsCQlGUCgweDE1LDB4MTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QvdWMiLAkJRlAoMHgxNSwweDEyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3ZjIiwJCUZQKDB4MTUsMHgxMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3UiLAkJRlAoMHgxNSwweDE4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3UiLAkJRlAoMHgxNSwweDE4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3UiLAkJRlAoMHgxNSwweDE4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3UiLAkJRlAoMHgxNSwweDE4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy91IiwJCUZQKDB4MTUsMHgxOUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3UiLAkJRlAoMHgxNSwweDFBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3UiLAkJRlAoMHgxNSwweDFBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3UiLAkJRlAoMHgxNSwweDFBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3UiLAkJRlAoMHgxNSwweDFBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi91IiwJCUZQKDB4MTUsMHgxQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC91IiwJCUZQKDB4MTUsMHgxQUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS92IiwJCUZQKDB4MTUsMHgxQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3NjIiwJCUZQKDB4MTUsMHg0MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi9zYyIsCQlGUCgweDE1LDB4NDAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvc2MiLAkJRlAoMHgxNSwweDQwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3NjIiwJCUZQKDB4MTUsMHg0MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvc2MiLAkJRlAoMHgxNSwweDQxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvc2MiLAkJRlAoMHgxNSwweDQyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3NjIiwJCUZQKDB4MTUsMHg0MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zYyIsCQlGUCgweDE1LDB4NDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvc2MiLAkJRlAoMHgxNSwweDQyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zYyIsCQlGUCgweDE1LDB4NDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2Qvc2MiLAkJRlAoMHgxNSwweDQyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3NjIiwJCUZQKDB4MTUsMHg0MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3MiLAkJRlAoMHgxNSwweDQ4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdmL3MiLAkJRlAoMHgxNSwweDQ4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJmL3MiLAkJRlAoMHgxNSwweDQ4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3MiLAkJRlAoMHgxNSwweDQ4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3MiLAkJRlAoMHgxNSwweDQ4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zIiwJCUZQKDB4MTUsMHg0OUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3MiLAkJRlAoMHgxNSwweDRBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdnL3MiLAkJRlAoMHgxNSwweDRBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJnL3MiLAkJRlAoMHgxNSwweDRBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3MiLAkJRlAoMHgxNSwweDRBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3MiLAkJRlAoMHgxNSwweDRBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnZXEvcyIsCQlGUCgweDE1LDB4NEE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdsdC9zIiwJCUZQKDB4MTUsMHg0QTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2xlL3MiLAkJRlAoMHgxNSwweDRBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zIiwJCUZQKDB4MTUsMHg0QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zIiwJCUZQKDB4MTUsMHg0QUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9zIiwJCUZQKDB4MTUsMHg0QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3N1YyIsCQlGUCgweDE1LDB4NTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvc3VjIiwJCUZQKDB4MTUsMHg1MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zdWMiLAkJRlAoMHgxNSwweDUwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3N1YyIsCQlGUCgweDE1LDB4NTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3N1YyIsCUZQKDB4MTUsMHg1MUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3N1YyIsCQlGUCgweDE1LDB4NTIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc3VjIiwJCUZQKDB4MTUsMHg1MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zdWMiLAkJRlAoMHgxNSwweDUyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3N1YyIsCQlGUCgweDE1LDB4NTIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3N1YyIsCUZQKDB4MTUsMHg1MkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zdWMiLAlGUCgweDE1LDB4NTJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc3ZjIiwJRlAoMHgxNSwweDUyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvc3UiLAkJRlAoMHgxNSwweDU4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3N1IiwJCUZQKDB4MTUsMHg1ODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zdSIsCQlGUCgweDE1LDB4NTgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvc3UiLAkJRlAoMHgxNSwweDU4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zdSIsCQlGUCgweDE1LDB4NTlFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9zdSIsCQlGUCgweDE1LDB4NUEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc3UiLAkJRlAoMHgxNSwweDVBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3N1IiwJCUZQKDB4MTUsMHg1QTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9zdSIsCQlGUCgweDE1LDB4NUEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3N1IiwJCUZQKDB4MTUsMHg1QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zdSIsCQlGUCgweDE1LDB4NUFEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc3YiLAkJRlAoMHgxNSwweDVBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAiYWRkcy9jIiwJCUZQKDB4MTYsMHgwMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9jIiwJCUZQKDB4MTYsMHgwMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9jIiwJCUZQKDB4MTYsMHgwMDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9jIiwJCUZQKDB4MTYsMHgwMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9jIiwJCUZQKDB4MTYsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9jIiwJCUZQKDB4MTYsMHgwMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9jIiwJCUZQKDB4MTYsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9jIiwJCUZQKDB4MTYsMHgwMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvYyIsCQlGUCgweDE2LDB4MDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvYyIsCQlGUCgweDE2LDB4MDJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvYyIsCQlGUCgweDE2LDB4MDNDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvYyIsCQlGUCgweDE2LDB4MDNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9tIiwJCUZQKDB4MTYsMHgwNDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9tIiwJCUZQKDB4MTYsMHgwNDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9tIiwJCUZQKDB4MTYsMHgwNDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9tIiwJCUZQKDB4MTYsMHgwNDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9tIiwJCUZQKDB4MTYsMHgwNjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9tIiwJCUZQKDB4MTYsMHgwNjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9tIiwJCUZQKDB4MTYsMHgwNjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9tIiwJCUZQKDB4MTYsMHgwNjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvbSIsCQlGUCgweDE2LDB4MDZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvbSIsCQlGUCgweDE2LDB4MDZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvbSIsCQlGUCgweDE2LDB4MDdDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvbSIsCQlGUCgweDE2LDB4MDdFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcyIsCQlGUCgweDE2LDB4MDgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3MiLCAJCUZQKDB4MTYsMHgwODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VicyIsCQlGUCgweDE2LDB4MDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMiLAkJRlAoMHgxNiwweDA4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzIiwJCUZQKDB4MTYsMHgwODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdCIsCQlGUCgweDE2LDB4MEEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3QiLCAJCUZQKDB4MTYsMHgwQTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidCIsCQlGUCgweDE2LDB4MEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQiLAkJRlAoMHgxNiwweDBBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0IiwJCUZQKDB4MTYsMHgwQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdHVuIiwJCUZQKDB4MTYsMHgwQTQpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGVxIiwJCUZQKDB4MTYsMHgwQTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGx0IiwJCUZQKDB4MTYsMHgwQTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGxlIiwJCUZQKDB4MTYsMHgwQTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMiLAkJRlAoMHgxNiwweDBBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxIiwJCUZQKDB4MTYsMHgwQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcyIsCQlGUCgweDE2LDB4MEJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQiLAkJRlAoMHgxNiwweDBCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvZCIsCQlGUCgweDE2LDB4MEMwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvZCIsCQlGUCgweDE2LDB4MEMxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvZCIsCQlGUCgweDE2LDB4MEMyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvZCIsCQlGUCgweDE2LDB4MEMzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvZCIsCQlGUCgweDE2LDB4MEUwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvZCIsCQlGUCgweDE2LDB4MEUxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvZCIsCQlGUCgweDE2LDB4MEUyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvZCIsCQlGUCgweDE2LDB4MEUzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL2QiLAkJRlAoMHgxNiwweDBFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL2QiLAkJRlAoMHgxNiwweDBFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL2QiLAkJRlAoMHgxNiwweDBGQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L2QiLAkJRlAoMHgxNiwweDBGRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvdWMiLAkJRlAoMHgxNiwweDEwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3VjIiwJCUZQKDB4MTYsMHgxMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91YyIsCQlGUCgweDE2LDB4MTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvdWMiLAkJRlAoMHgxNiwweDEwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3VjIiwJCUZQKDB4MTYsMHgxMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91YyIsCQlGUCgweDE2LDB4MTIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvdWMiLAkJRlAoMHgxNiwweDEyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3VjIiwJCUZQKDB4MTYsMHgxMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdWMiLAkJRlAoMHgxNiwweDEyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3ZjIiwJCUZQKDB4MTYsMHgxMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3VtIiwJCUZQKDB4MTYsMHgxNDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91bSIsCQlGUCgweDE2LDB4MTQxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvdW0iLAkJRlAoMHgxNiwweDE0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3VtIiwJCUZQKDB4MTYsMHgxNDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91bSIsCQlGUCgweDE2LDB4MTYwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvdW0iLAkJRlAoMHgxNiwweDE2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3VtIiwJCUZQKDB4MTYsMHgxNjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91bSIsCQlGUCgweDE2LDB4MTYzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3VtIiwJCUZQKDB4MTYsMHgxNkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS92bSIsCQlGUCgweDE2LDB4MTZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91IiwJCUZQKDB4MTYsMHgxODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91IiwJCUZQKDB4MTYsMHgxODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91IiwJCUZQKDB4MTYsMHgxODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91IiwJCUZQKDB4MTYsMHgxODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91IiwJCUZQKDB4MTYsMHgxQTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91IiwJCUZQKDB4MTYsMHgxQTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91IiwJCUZQKDB4MTYsMHgxQTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91IiwJCUZQKDB4MTYsMHgxQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdSIsCQlGUCgweDE2LDB4MUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdiIsCQlGUCgweDE2LDB4MUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91ZCIsCQlGUCgweDE2LDB4MUMwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvdWQiLAkJRlAoMHgxNiwweDFDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3VkIiwJCUZQKDB4MTYsMHgxQzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91ZCIsCQlGUCgweDE2LDB4MUMzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvdWQiLAkJRlAoMHgxNiwweDFFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3VkIiwJCUZQKDB4MTYsMHgxRTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91ZCIsCQlGUCgweDE2LDB4MUUyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvdWQiLAkJRlAoMHgxNiwweDFFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy91ZCIsCQlGUCgweDE2LDB4MUVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdmQiLAkJRlAoMHgxNiwweDFFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHN0IiwJCUZQKDB4MTYsMHgyQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1YyIsCQlGUCgweDE2LDB4NTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VjIiwJCUZQKDB4MTYsMHg1MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWMiLAkJRlAoMHgxNiwweDUwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1YyIsCQlGUCgweDE2LDB4NTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VjIiwJCUZQKDB4MTYsMHg1MjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdWMiLAkJRlAoMHgxNiwweDUyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1YyIsCQlGUCgweDE2LDB4NTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VjIiwJCUZQKDB4MTYsMHg1MjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VjIiwJRlAoMHgxNiwweDUyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2YyIsCUZQKDB4MTYsMHg1MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1bSIsCQlGUCgweDE2LDB4NTQwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VtIiwJCUZQKDB4MTYsMHg1NDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdW0iLAkJRlAoMHgxNiwweDU0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1bSIsCQlGUCgweDE2LDB4NTQzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VtIiwJCUZQKDB4MTYsMHg1NjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdW0iLAkJRlAoMHgxNiwweDU2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1bSIsCQlGUCgweDE2LDB4NTYyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VtIiwJCUZQKDB4MTYsMHg1NjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VtIiwJRlAoMHgxNiwweDU2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2bSIsCUZQKDB4MTYsMHg1NkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1IiwJCUZQKDB4MTYsMHg1ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncy9zdSIsCQlGUCgweDE2LDB4NTgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnMvc3UiLAkJRlAoMHgxNiwweDU4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1IiwJCUZQKDB4MTYsMHg1ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdSIsCQlGUCgweDE2LDB4NTgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3UiLAkJRlAoMHgxNiwweDVBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWd0L3N1IiwJCUZQKDB4MTYsMHg1QTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidC9zdSIsCQlGUCgweDE2LDB4NUExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3UiLAkJRlAoMHgxNiwweDVBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1IiwJCUZQKDB4MTYsMHg1QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdHVuL3N1IiwJRlAoMHgxNiwweDVBNCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0ZXEvc3UiLAlGUCgweDE2LDB4NUE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRsdC9zdSIsCUZQKDB4MTYsMHg1QTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGxlL3N1IiwJRlAoMHgxNiwweDVBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdSIsCQlGUCgweDE2LDB4NUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3YiLAkJRlAoMHgxNiwweDVBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VkIiwJCUZQKDB4MTYsMHg1QzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWQiLAkJRlAoMHgxNiwweDVDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1ZCIsCQlGUCgweDE2LDB4NUMyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VkIiwJCUZQKDB4MTYsMHg1QzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWQiLAkJRlAoMHgxNiwweDVFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1ZCIsCQlGUCgweDE2LDB4NUUxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VkIiwJCUZQKDB4MTYsMHg1RTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWQiLAkJRlAoMHgxNiwweDVFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWQiLAlGUCgweDE2LDB4NUVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZkIiwJRlAoMHgxNiwweDVFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHN0L3MiLAkJRlAoMHgxNiwweDZBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpYyIsCUZQKDB4MTYsMHg3MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWljIiwJRlAoMHgxNiwweDcwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aWMiLAlGUCgweDE2LDB4NzAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpYyIsCUZQKDB4MTYsMHg3MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWljIiwJRlAoMHgxNiwweDcyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aWMiLAlGUCgweDE2LDB4NzIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpYyIsCUZQKDB4MTYsMHg3MjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWljIiwJRlAoMHgxNiwweDcyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWljIiwJRlAoMHgxNiwweDcyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aWMiLAlGUCgweDE2LDB4NzJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpYyIsCUZQKDB4MTYsMHg3M0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWljIiwJRlAoMHgxNiwweDczRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpbSIsCUZQKDB4MTYsMHg3NDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWltIiwJRlAoMHgxNiwweDc0MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aW0iLAlGUCgweDE2LDB4NzQyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpbSIsCUZQKDB4MTYsMHg3NDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWltIiwJRlAoMHgxNiwweDc2MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aW0iLAlGUCgweDE2LDB4NzYxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpbSIsCUZQKDB4MTYsMHg3NjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWltIiwJRlAoMHgxNiwweDc2MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWltIiwJRlAoMHgxNiwweDc2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aW0iLAlGUCgweDE2LDB4NzZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpbSIsCUZQKDB4MTYsMHg3N0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWltIiwJRlAoMHgxNiwweDc3RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpIiwJCUZQKDB4MTYsMHg3ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncy9zdWkiLCAJRlAoMHgxNiwweDc4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJzL3N1aSIsCQlGUCgweDE2LDB4NzgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpIiwJCUZQKDB4MTYsMHg3ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWkiLAkJRlAoMHgxNiwweDc4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aSIsCQlGUCgweDE2LDB4N0EwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3Qvc3VpIiwgCUZQKDB4MTYsMHg3QTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidC9zdWkiLAkJRlAoMHgxNiwweDdBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1aSIsCQlGUCgweDE2LDB4N0EyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VpIiwJCUZQKDB4MTYsMHg3QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VpIiwJRlAoMHgxNiwweDdBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aSIsCUZQKDB4MTYsMHg3QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWkiLAlGUCgweDE2LDB4N0JDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvc3VpIiwJRlAoMHgxNiwweDdCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpZCIsCUZQKDB4MTYsMHg3QzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWlkIiwJRlAoMHgxNiwweDdDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aWQiLAlGUCgweDE2LDB4N0MyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpZCIsCUZQKDB4MTYsMHg3QzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWlkIiwJRlAoMHgxNiwweDdFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aWQiLAlGUCgweDE2LDB4N0UxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpZCIsCUZQKDB4MTYsMHg3RTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWlkIiwJRlAoMHgxNiwweDdFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWlkIiwJRlAoMHgxNiwweDdFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aWQiLAlGUCgweDE2LDB4N0VGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpZCIsCUZQKDB4MTYsMHg3RkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWlkIiwJRlAoMHgxNiwweDdGRSksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAiY3Z0bHEiLAkJRlAoMHgxNywweDAxMCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImZub3AiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgWkEsIFpCLCBaQyB9IH0sCS8qIHBzZXVkbyAqLwotICB7ICJmY2xyIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCB7IFpBLCBaQiwgRkMgfSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiZmFicyIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgImZtb3YiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgRkEsIFJCQSwgRkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAiY3B5cyIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZuZWciLAkJRlAoMHgxNywweDAyMSksIEJBU0UsIHsgRkEsIFJCQSwgRkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAiY3B5c24iLAkJRlAoMHgxNywweDAyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjcHlzZSIsCQlGUCgweDE3LDB4MDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm10X2ZwY3IiLAkJRlAoMHgxNywweDAyNCksIEJBU0UsIHsgRkEsIFJCQSwgUkNBIH0gfSwKLSAgeyAibWZfZnBjciIsCQlGUCgweDE3LDB4MDI1KSwgQkFTRSwgeyBGQSwgUkJBLCBSQ0EgfSB9LAotICB7ICJmY21vdmVxIiwJCUZQKDB4MTcsMHgwMkEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZuZSIsCQlGUCgweDE3LDB4MDJCKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92bHQiLAkJRlAoMHgxNywweDAyQyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdmdlIiwJCUZQKDB4MTcsMHgwMkQpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZsZSIsCQlGUCgweDE3LDB4MDJFKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92Z3QiLAkJRlAoMHgxNywweDAyRiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRxbCIsCQlGUCgweDE3LDB4MDMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWwvdiIsCQlGUCgweDE3LDB4MTMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWwvc3YiLAkJRlAoMHgxNywweDUzMCksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAidHJhcGIiLAkJTUZDKDB4MTgsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiZHJhaW50IiwJCU1GQygweDE4LDB4MDAwMCksIEJBU0UsIEFSR19OT05FIH0sCS8qIGFsaWFzICovCi0gIHsgImV4Y2IiLAkJTUZDKDB4MTgsMHgwNDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAibWIiLAkJTUZDKDB4MTgsMHg0MDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAid21iIiwJCU1GQygweDE4LDB4NDQwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImZldGNoIiwJCU1GQygweDE4LDB4ODAwMCksIEJBU0UsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImZldGNoX20iLAkJTUZDKDB4MTgsMHhBMDAwKSwgQkFTRSwgeyBaQSwgUFJCIH0gfSwKLSAgeyAicnBjYyIsCQlNRkMoMHgxOCwweEMwMDApLCBCQVNFLCB7IFJBIH0gfSwKLSAgeyAicmMiLAkJTUZDKDB4MTgsMHhFMDAwKSwgQkFTRSwgeyBSQSB9IH0sCi0gIHsgImVjYiIsCQlNRkMoMHgxOCwweEU4MDApLCBCQVNFLCB7IFpBLCBQUkIgfSB9LAkvKiBldjU2IHVuYSAqLwotICB7ICJycyIsCQlNRkMoMHgxOCwweEYwMDApLCBCQVNFLCB7IFJBIH0gfSwKLSAgeyAid2g2NCIsCQlNRkMoMHgxOCwweEY4MDApLCBCQVNFLCB7IFpBLCBQUkIgfSB9LAkvKiBldjU2IHVuYSAqLwotCi0gIHsgImh3X21mcHIiLAkJT1BSKDB4MTksMHgwMCksIEVWNCwgeyBSQSwgUkJBLCBFVjRFWFRIV0lOREVYIH0gfSwKLSAgeyAiaHdfbWZwciIsCQlPUCgweDE5KSwgT1BfTUFTSywgRVY1LCB7IFJBLCBSQkEsIEVWNUhXSU5ERVggfSB9LAotICB7ICJod19tZnByIiwJCU9QKDB4MTkpLCBPUF9NQVNLLCBFVjYsIHsgUkEsIFpCLCBFVjZIV0lOREVYIH0gfSwKLSAgeyAiaHdfbWZwci9pIiwJT1BSKDB4MTksMHgwMSksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvYSIsCU9QUigweDE5LDB4MDIpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL2FpIiwJT1BSKDB4MTksMHgwMyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvcCIsCU9QUigweDE5LDB4MDQpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL3BpIiwJT1BSKDB4MTksMHgwNSksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvcGEiLAlPUFIoMHgxOSwweDA2KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9wYWkiLAlPUFIoMHgxOSwweDA3KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAicGFsMTkiLAkJUENEKDB4MTkpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAiam1wIiwJCU1CUigweDFBLDApLCBCQVNFLCB7IFJBLCBDUFJCLCBKTVBISU5UIH0gfSwKLSAgeyAianNyIiwJCU1CUigweDFBLDEpLCBCQVNFLCB7IFJBLCBDUFJCLCBKTVBISU5UIH0gfSwKLSAgeyAicmV0IiwJCU1CUigweDFBLDIpLCBCQVNFLCB7IFJBLCBDUFJCLCBSRVRISU5UIH0gfSwKLSAgeyAiamNyIiwJCU1CUigweDFBLDMpLCBCQVNFLCB7IFJBLCBDUFJCLCBSRVRISU5UIH0gfSwgLyogYWxpYXMgKi8KLSAgeyAianNyX2Nvcm91dGluZSIsCU1CUigweDFBLDMpLCBCQVNFLCB7IFJBLCBDUFJCLCBSRVRISU5UIH0gfSwKLQotICB7ICJod19sZGwiLAkJRVY0SFdNRU0oMHgxQiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwiLAkJRVY1SFdNRU0oMHgxQiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsIiwJCUVWNkhXTUVNKDB4MUIsMHg4KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2EiLAkJRVY0SFdNRU0oMHgxQiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvYSIsCQlFVjVIV01FTSgweDFCLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYSIsCQlFVjZIV01FTSgweDFCLDB4QyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC9hbCIsCUVWNUhXTUVNKDB4MUIsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hciIsCUVWNEhXTUVNKDB4MUIsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F2IiwJRVY1SFdNRU0oMHgxQiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hd2wiLAlFVjVIV01FTSgweDFCLDB4MTkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3dmwiLAlFVjVIV01FTSgweDFCLDB4MWIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvbCIsCQlFVjVIV01FTSgweDFCLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcCIsCQlFVjRIV01FTSgweDFCLDB4OCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9wIiwJCUVWNUhXTUVNKDB4MUIsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wIiwJCUVWNkhXTUVNKDB4MUIsMHgwKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhIiwJRVY0SFdNRU0oMHgxQiwweEMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvcGEiLAlFVjVIV01FTSgweDFCLDB4MzApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGFsIiwJRVY1SFdNRU0oMHgxQiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhciIsCUVWNEhXTUVNKDB4MUIsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXZsIiwJRVY1SFdNRU0oMHgxQiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXdsIiwJRVY1SFdNRU0oMHgxQiwweDM5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2EpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3dmwiLAlFVjVIV01FTSgweDFCLDB4M2IpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGwiLAlFVjVIV01FTSgweDFCLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHIiLAlFVjRIV01FTSgweDFCLDB4QSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wdmwiLAlFVjVIV01FTSgweDFCLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHciLAlFVjVIV01FTSgweDFCLDB4MjgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHdsIiwJRVY1SFdNRU0oMHgxQiwweDI5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDJiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3IiLAkJRVY0SFdNRU0oMHgxQiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvdiIsCQlFVjVIV01FTSgweDFCLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvdiIsCQlFVjZIV01FTSgweDFCLDB4NCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC92bCIsCUVWNUhXTUVNKDB4MUIsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93IiwJCUVWNUhXTUVNKDB4MUIsMHgwOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93IiwJCUVWNkhXTUVNKDB4MUIsMHhBKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3dhIiwJRVY2SFdNRU0oMHgxQiwweEUpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvd2wiLAlFVjVIV01FTSgweDFCLDB4MDkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvd3YiLAlFVjVIV01FTSgweDFCLDB4MGEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDBiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wiLAkJRVY1SFdNRU0oMHgxQiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvYSIsCUVWNUhXTUVNKDB4MUIsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL2F2IiwJRVY1SFdNRU0oMHgxQiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvYXciLAlFVjVIV01FTSgweDFCLDB4MTkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wIiwJRVY1SFdNRU0oMHgxQiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcCIsCUVWNkhXTUVNKDB4MUIsMHgyKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcGEiLAlFVjVIV01FTSgweDFCLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wYXciLAlFVjVIV01FTSgweDFCLDB4MzkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcHYiLAlFVjVIV01FTSgweDFCLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3YiLAlFVjVIV01FTSgweDFCLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC93IiwJRVY1SFdNRU0oMHgxQiwweDA5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvd3YiLAlFVjVIV01FTSgweDFCLDB4MGIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEiLAkJRVY0SFdNRU0oMHgxQiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEiLAkJRVY1SFdNRU0oMHgxQiwweDA0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxIiwJCUVWNkhXTUVNKDB4MUIsMHg5KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2EiLAkJRVY0SFdNRU0oMHgxQiwweDUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvYSIsCQlFVjVIV01FTSgweDFCLDB4MTQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYSIsCQlFVjZIV01FTSgweDFCLDB4RCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS9hbCIsCUVWNUhXTUVNKDB4MUIsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hciIsCUVWNEhXTUVNKDB4MUIsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F2IiwJRVY1SFdNRU0oMHgxQiwweDE2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hd2wiLAlFVjVIV01FTSgweDFCLDB4MWQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3dmwiLAlFVjVIV01FTSgweDFCLDB4MWYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvbCIsCQlFVjVIV01FTSgweDFCLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcCIsCQlFVjRIV01FTSgweDFCLDB4OSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9wIiwJCUVWNUhXTUVNKDB4MUIsMHgyNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wIiwJCUVWNkhXTUVNKDB4MUIsMHgxKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhIiwJRVY0SFdNRU0oMHgxQiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvcGEiLAlFVjVIV01FTSgweDFCLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGFsIiwJRVY1SFdNRU0oMHgxQiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhciIsCUVWNEhXTUVNKDB4MUIsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXZsIiwJRVY1SFdNRU0oMHgxQiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXdsIiwJRVY1SFdNRU0oMHgxQiwweDNkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2UpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3dmwiLAlFVjVIV01FTSgweDFCLDB4M2YpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGwiLAlFVjVIV01FTSgweDFCLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHIiLAlFVjRIV01FTSgweDFCLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wdmwiLAlFVjVIV01FTSgweDFCLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHciLAlFVjVIV01FTSgweDFCLDB4MmMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHdsIiwJRVY1SFdNRU0oMHgxQiwweDJkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDJmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3IiLAkJRVY0SFdNRU0oMHgxQiwweDMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvdiIsCQlFVjVIV01FTSgweDFCLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvdiIsCQlFVjZIV01FTSgweDFCLDB4NSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS92bCIsCUVWNUhXTUVNKDB4MUIsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93IiwJCUVWNUhXTUVNKDB4MUIsMHgwYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93IiwJCUVWNkhXTUVNKDB4MUIsMHhCKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3dhIiwJRVY2SFdNRU0oMHgxQiwweEYpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvd2wiLAlFVjVIV01FTSgweDFCLDB4MGQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvd3YiLAlFVjVIV01FTSgweDFCLDB4MGUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDBmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wiLAkJRVY1SFdNRU0oMHgxQiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvYSIsCUVWNUhXTUVNKDB4MUIsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL2F2IiwJRVY1SFdNRU0oMHgxQiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvYXciLAlFVjVIV01FTSgweDFCLDB4MWQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wIiwJRVY1SFdNRU0oMHgxQiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcCIsCUVWNkhXTUVNKDB4MUIsMHgzKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcGEiLAlFVjVIV01FTSgweDFCLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wYXciLAlFVjVIV01FTSgweDFCLDB4M2QpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcHYiLAlFVjVIV01FTSgweDFCLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3YiLAlFVjVIV01FTSgweDFCLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC93IiwJRVY1SFdNRU0oMHgxQiwweDBkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvd3YiLAlFVjVIV01FTSgweDFCLDB4MGYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZCIsCQlFVjRIV01FTSgweDFCLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkIiwJCUVWNUhXTUVNKDB4MUIsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2EiLAkJRVY0SFdNRU0oMHgxQiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hIiwJCUVWNUhXTUVNKDB4MUIsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FsIiwJCUVWNUhXTUVNKDB4MUIsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FxIiwJCUVWNEhXTUVNKDB4MUIsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXEiLAkJRVY1SFdNRU0oMHgxQiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXFsIiwJRVY1SFdNRU0oMHgxQiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXF2IiwJRVY1SFdNRU0oMHgxQiwweDE2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXF2bCIsCUVWNUhXTUVNKDB4MUIsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2FyIiwJCUVWNEhXTUVNKDB4MUIsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXJxIiwJRVY0SFdNRU0oMHgxQiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hdiIsCQlFVjVIV01FTSgweDFCLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hdmwiLAlFVjVIV01FTSgweDFCLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hdyIsCQlFVjVIV01FTSgweDFCLDB4MTgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd2wiLAlFVjVIV01FTSgweDFCLDB4MTkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3EiLAlFVjVIV01FTSgweDFCLDB4MWMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3FsIiwJRVY1SFdNRU0oMHgxQiwweDFkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdxdiIsCUVWNUhXTUVNKDB4MUIsMHgxZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cXZsIiwJRVY1SFdNRU0oMHgxQiwweDFmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgxYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2wiLAkJRVY1SFdNRU0oMHgxQiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcCIsCQlFVjRIV01FTSgweDFCLDB4OCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3AiLAkJRVY1SFdNRU0oMHgxQiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGEiLAkJRVY0SFdNRU0oMHgxQiwweEMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wYSIsCQlFVjVIV01FTSgweDFCLDB4MzApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYWwiLAlFVjVIV01FTSgweDFCLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXEiLAlFVjRIV01FTSgweDFCLDB4RCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcSIsCUVWNUhXTUVNKDB4MUIsMHgzNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcWwiLAlFVjVIV01FTSgweDFCLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXF2IiwJRVY1SFdNRU0oMHgxQiwweDM2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxdmwiLAlFVjVIV01FTSgweDFCLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXIiLAlFVjRIV01FTSgweDFCLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcnEiLAlFVjRIV01FTSgweDFCLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhdmwiLAlFVjVIV01FTSgweDFCLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXciLAlFVjVIV01FTSgweDFCLDB4MzgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdsIiwJRVY1SFdNRU0oMHgxQiwweDM5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3cSIsCUVWNUhXTUVNKDB4MUIsMHgzYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3FsIiwJRVY1SFdNRU0oMHgxQiwweDNkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3cXYiLAlFVjVIV01FTSgweDFCLDB4M2UpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxdmwiLAlFVjVIV01FTSgweDFCLDB4M2YpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3dmwiLAlFVjVIV01FTSgweDFCLDB4M2IpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wbCIsCQlFVjVIV01FTSgweDFCLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wcSIsCQlFVjRIV01FTSgweDFCLDB4OSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BxIiwJCUVWNUhXTUVNKDB4MUIsMHgyNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BxbCIsCUVWNUhXTUVNKDB4MUIsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BxdiIsCUVWNUhXTUVNKDB4MUIsMHgyNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BxdmwiLAlFVjVIV01FTSgweDFCLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wciIsCQlFVjRIV01FTSgweDFCLDB4QSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BycSIsCUVWNEhXTUVNKDB4MUIsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHYiLAkJRVY1SFdNRU0oMHgxQiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHZsIiwJRVY1SFdNRU0oMHgxQiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHciLAkJRVY1SFdNRU0oMHgxQiwweDI4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdsIiwJRVY1SFdNRU0oMHgxQiwweDI5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdxIiwJRVY1SFdNRU0oMHgxQiwweDJjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdxbCIsCUVWNUhXTUVNKDB4MUIsMHgyZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3cXYiLAlFVjVIV01FTSgweDFCLDB4MmUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgyZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3diIsCUVWNUhXTUVNKDB4MUIsMHgyYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3dmwiLAlFVjVIV01FTSgweDFCLDB4MmIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9xIiwJCUVWNEhXTUVNKDB4MUIsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcSIsCQlFVjVIV01FTSgweDFCLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9xbCIsCQlFVjVIV01FTSgweDFCLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9xdiIsCQlFVjVIV01FTSgweDFCLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9xdmwiLAlFVjVIV01FTSgweDFCLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9yIiwJCUVWNEhXTUVNKDB4MUIsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcnEiLAkJRVY0SFdNRU0oMHgxQiwweDMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC92IiwJCUVWNUhXTUVNKDB4MUIsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3ZsIiwJCUVWNUhXTUVNKDB4MUIsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3ciLAkJRVY1SFdNRU0oMHgxQiwweDA4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd2wiLAkJRVY1SFdNRU0oMHgxQiwweDA5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3EiLAkJRVY1SFdNRU0oMHgxQiwweDBjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3FsIiwJRVY1SFdNRU0oMHgxQiwweDBkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3F2IiwJRVY1SFdNRU0oMHgxQiwweDBlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgwZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3d2IiwJCUVWNUhXTUVNKDB4MUIsMHgwYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3d2bCIsCUVWNUhXTUVNKDB4MUIsMHgwYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgInBhbDFiIiwJCVBDRCgweDFCKSwgQkFTRSwgQVJHX1BDRCB9LAotCi0gIHsgInNleHRiIiwJCU9QUigweDFDLCAweDAwKSwgQldYLCBBUkdfT1BSWjEgfSwKLSAgeyAic2V4dHciLAkJT1BSKDB4MUMsIDB4MDEpLCBCV1gsIEFSR19PUFJaMSB9LAotICB7ICJjdHBvcCIsCQlPUFIoMHgxQywgMHgzMCksIENJWCwgQVJHX09QUloxIH0sCi0gIHsgInBlcnIiLAkJT1BSKDB4MUMsIDB4MzEpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAiY3RseiIsCQlPUFIoMHgxQywgMHgzMiksIENJWCwgQVJHX09QUloxIH0sCi0gIHsgImN0dHoiLAkJT1BSKDB4MUMsIDB4MzMpLCBDSVgsIEFSR19PUFJaMSB9LAotICB7ICJ1bnBrYnciLAkJT1BSKDB4MUMsIDB4MzQpLCBNQVgsIEFSR19PUFJaMSB9LAotICB7ICJ1bnBrYmwiLAkJT1BSKDB4MUMsIDB4MzUpLCBNQVgsIEFSR19PUFJaMSB9LAotICB7ICJwa3diIiwJCU9QUigweDFDLCAweDM2KSwgTUFYLCBBUkdfT1BSWjEgfSwKLSAgeyAicGtsYiIsCQlPUFIoMHgxQywgMHgzNyksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgIm1pbnNiOCIsIAkJT1BSKDB4MUMsIDB4MzgpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWluc2I4IiwgCQlPUFJMKDB4MUMsIDB4MzgpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1pbnN3NCIsIAkJT1BSKDB4MUMsIDB4MzkpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWluc3c0IiwgCQlPUFJMKDB4MUMsIDB4MzkpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1pbnViOCIsIAkJT1BSKDB4MUMsIDB4M0EpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWludWI4IiwgCQlPUFJMKDB4MUMsIDB4M0EpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1pbnV3NCIsIAkJT1BSKDB4MUMsIDB4M0IpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWludXc0IiwgCQlPUFJMKDB4MUMsIDB4M0IpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1heHViOCIsCQlPUFIoMHgxQywgMHgzQyksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtYXh1YjgiLAkJT1BSTCgweDFDLCAweDNDKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtYXh1dzQiLAkJT1BSKDB4MUMsIDB4M0QpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWF4dXc0IiwJCU9QUkwoMHgxQywgMHgzRCksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4c2I4IiwJCU9QUigweDFDLCAweDNFKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHNiOCIsCQlPUFJMKDB4MUMsIDB4M0UpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1heHN3NCIsCQlPUFIoMHgxQywgMHgzRiksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtYXhzdzQiLAkJT1BSTCgweDFDLCAweDNGKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJmdG9pdCIsCQlGUCgweDFDLCAweDcwKSwgQ0lYLCB7IEZBLCBaQiwgUkMgfSB9LAotICB7ICJmdG9pcyIsCQlGUCgweDFDLCAweDc4KSwgQ0lYLCB7IEZBLCBaQiwgUkMgfSB9LAotCi0gIHsgImh3X210cHIiLAkJT1BSKDB4MUQsMHgwMCksIEVWNCwgeyBSQSwgUkJBLCBFVjRFWFRIV0lOREVYIH0gfSwKLSAgeyAiaHdfbXRwciIsCQlPUCgweDFEKSwgT1BfTUFTSywgRVY1LCB7IFJBLCBSQkEsIEVWNUhXSU5ERVggfSB9LAotICB7ICJod19tdHByIiwJCU9QKDB4MUQpLCBPUF9NQVNLLCBFVjYsIHsgWkEsIFJCLCBFVjZIV0lOREVYIH0gfSwKLSAgeyAiaHdfbXRwci9pIiwgCU9QUigweDFELDB4MDEpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL2EiLCAJT1BSKDB4MUQsMHgwMiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvYWkiLAlPUFIoMHgxRCwweDAzKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9wIiwgCU9QUigweDFELDB4MDQpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3BpIiwJT1BSKDB4MUQsMHgwNSksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvcGEiLAlPUFIoMHgxRCwweDA2KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9wYWkiLAlPUFIoMHgxRCwweDA3KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAicGFsMWQiLAkJUENEKDB4MUQpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAiaHdfcmVpIiwJCVNQQ0QoMHgxRSwweDNGRjgwMDApLCBFVjR8RVY1LCBBUkdfTk9ORSB9LAotICB7ICJod19yZWlfc3RhbGwiLAlTUENEKDB4MUUsMHgzRkZDMDAwKSwgRVY1LCBBUkdfTk9ORSB9LAotICB7ICJod19qbXAiLCAJCUVWNkhXTUJSKDB4MUUsMHgwKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCi0gIHsgImh3X2pzciIsIAkJRVY2SFdNQlIoMHgxRSwweDIpLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfcmV0IiwgCQlFVjZIV01CUigweDFFLDB4NCksIEVWNiwgeyBaQSwgUFJCIH0gfSwKLSAgeyAiaHdfamNyIiwgCQlFVjZIV01CUigweDFFLDB4NiksIEVWNiwgeyBaQSwgUFJCIH0gfSwKLSAgeyAiaHdfY29yb3V0aW5lIiwJRVY2SFdNQlIoMHgxRSwweDYpLCBFVjYsIHsgWkEsIFBSQiB9IH0sIC8qIGFsaWFzICovCi0gIHsgImh3X2ptcC9zdGFsbCIsCUVWNkhXTUJSKDB4MUUsMHgxKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCi0gIHsgImh3X2pzci9zdGFsbCIsIAlFVjZIV01CUigweDFFLDB4MyksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAotICB7ICJod19yZXQvc3RhbGwiLAlFVjZIV01CUigweDFFLDB4NSksIEVWNiwgeyBaQSwgUFJCIH0gfSwKLSAgeyAiaHdfamNyL3N0YWxsIiwgCUVWNkhXTUJSKDB4MUUsMHg3KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19jb3JvdXRpbmUvc3RhbGwiLCBFVjZIV01CUigweDFFLDB4NyksIEVWNiwgeyBaQSwgUFJCIH0gfSwgLyogYWxpYXMgKi8KLSAgeyAicGFsMWUiLAkJUENEKDB4MUUpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAiaHdfc3RsIiwJCUVWNEhXTUVNKDB4MUYsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsIiwJCUVWNUhXTUVNKDB4MUYsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bCIsCQlFVjZIV01FTSgweDFGLDB4NCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sIC8qID8/PyA4ICovCi0gIHsgImh3X3N0bC9hIiwJCUVWNEhXTUVNKDB4MUYsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2EiLAkJRVY1SFdNRU0oMHgxRiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2EiLAkJRVY2SFdNRU0oMHgxRiwweEMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdGwvYWMiLAlFVjVIV01FTSgweDFGLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvYXIiLAlFVjRIV01FTSgweDFGLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9hdmMiLAlFVjVIV01FTSgweDFGLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvYyIsCQlFVjVIV01FTSgweDFGLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcCIsCQlFVjRIV01FTSgweDFGLDB4OCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9wIiwJCUVWNUhXTUVNKDB4MUYsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wIiwJCUVWNkhXTUVNKDB4MUYsMHgwKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhIiwJRVY0SFdNRU0oMHgxRiwweEMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvcGEiLAlFVjVIV01FTSgweDFGLDB4MzApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGFjIiwJRVY1SFdNRU0oMHgxRiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYXZjIiwJRVY1SFdNRU0oMHgxRiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BjIiwJRVY1SFdNRU0oMHgxRiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3ByIiwJRVY0SFdNRU0oMHgxRiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvcHYiLAlFVjVIV01FTSgweDFGLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcHZjIiwJRVY1SFdNRU0oMHgxRiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3IiLAkJRVY0SFdNRU0oMHgxRiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvdiIsCQlFVjVIV01FTSgweDFGLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvdmMiLAlFVjVIV01FTSgweDFGLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYyIsCQlFVjVIV01FTSgweDFGLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9hIiwJRVY1SFdNRU0oMHgxRiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvYXYiLAlFVjVIV01FTSgweDFGLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9wIiwJRVY1SFdNRU0oMHgxRiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcCIsCUVWNkhXTUVNKDB4MUYsMHgyKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvcGEiLAlFVjVIV01FTSgweDFGLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3YiLAlFVjVIV01FTSgweDFGLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEiLAkJRVY0SFdNRU0oMHgxRiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEiLAkJRVY1SFdNRU0oMHgxRiwweDA0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxIiwJCUVWNkhXTUVNKDB4MUYsMHg1KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwgLyogPz8/IDkgKi8KLSAgeyAiaHdfc3RxL2EiLAkJRVY0SFdNRU0oMHgxRiwweDUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvYSIsCQlFVjVIV01FTSgweDFGLDB4MTQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvYSIsCQlFVjZIV01FTSgweDFGLDB4RCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0cS9hYyIsCUVWNUhXTUVNKDB4MUYsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9hciIsCUVWNEhXTUVNKDB4MUYsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2F2IiwJRVY1SFdNRU0oMHgxRiwweDE2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2F2YyIsCUVWNUhXTUVNKDB4MUYsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wIiwJCUVWNEhXTUVNKDB4MUYsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3AiLAkJRVY1SFdNRU0oMHgxRiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3AiLAkJRVY2SFdNRU0oMHgxRiwweDEpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdHEvcGEiLAlFVjRIV01FTSgweDFGLDB4RCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYWMiLAlFVjVIV01FTSgweDFGLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcGFyIiwJRVY0SFdNRU0oMHgxRiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcGFyIiwJRVY0SFdNRU0oMHgxRiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDM2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhdmMiLAlFVjVIV01FTSgweDFGLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcGMiLAlFVjVIV01FTSgweDFGLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcHIiLAlFVjRIV01FTSgweDFGLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wdmMiLAlFVjVIV01FTSgweDFGLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvciIsCQlFVjRIV01FTSgweDFGLDB4MyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS92IiwJCUVWNUhXTUVNKDB4MUYsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS92YyIsCUVWNUhXTUVNKDB4MUYsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL2EiLAlFVjVIV01FTSgweDFGLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3AiLAlFVjVIV01FTSgweDFGLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy9wIiwJRVY2SFdNRU0oMHgxRiwweDMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdHFfYy9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3B2IiwJRVY1SFdNRU0oMHgxRiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvdiIsCUVWNUhXTUVNKDB4MUYsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0IiwJCUVWNEhXTUVNKDB4MUYsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QiLAkJRVY1SFdNRU0oMHgxRiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYSIsCQlFVjRIV01FTSgweDFGLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2EiLAkJRVY1SFdNRU0oMHgxRiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYWMiLAkJRVY1SFdNRU0oMHgxRiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXEiLAkJRVY0SFdNRU0oMHgxRiwweDUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9hcSIsCQlFVjVIV01FTSgweDFGLDB4MTQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hcWMiLAlFVjVIV01FTSgweDFGLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hcXYiLAlFVjVIV01FTSgweDFGLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hcXZjIiwJRVY1SFdNRU0oMHgxRiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXIiLAkJRVY0SFdNRU0oMHgxRiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9hcnEiLAlFVjRIV01FTSgweDFGLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2F2IiwJCUVWNUhXTUVNKDB4MUYsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2F2YyIsCUVWNUhXTUVNKDB4MUYsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2MiLAkJRVY1SFdNRU0oMHgxRiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcCIsCQlFVjRIV01FTSgweDFGLDB4OCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3AiLAkJRVY1SFdNRU0oMHgxRiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGEiLAkJRVY0SFdNRU0oMHgxRiwweEMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wYSIsCQlFVjVIV01FTSgweDFGLDB4MzApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYWMiLAlFVjVIV01FTSgweDFGLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXEiLAlFVjRIV01FTSgweDFGLDB4RCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcSIsCUVWNUhXTUVNKDB4MUYsMHgzNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcWMiLAlFVjVIV01FTSgweDFGLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXF2IiwJRVY1SFdNRU0oMHgxRiwweDM2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxdmMiLAlFVjVIV01FTSgweDFGLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXIiLAlFVjRIV01FTSgweDFGLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcnEiLAlFVjRIV01FTSgweDFGLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhdmMiLAlFVjVIV01FTSgweDFGLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYyIsCQlFVjVIV01FTSgweDFGLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wcSIsCQlFVjRIV01FTSgweDFGLDB4OSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BxIiwJCUVWNUhXTUVNKDB4MUYsMHgyNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BxYyIsCUVWNUhXTUVNKDB4MUYsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BxdiIsCUVWNUhXTUVNKDB4MUYsMHgyNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BxdmMiLAlFVjVIV01FTSgweDFGLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wciIsCQlFVjRIV01FTSgweDFGLDB4QSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BycSIsCUVWNEhXTUVNKDB4MUYsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHYiLAkJRVY1SFdNRU0oMHgxRiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHZjIiwJRVY1SFdNRU0oMHgxRiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcSIsCQlFVjRIV01FTSgweDFGLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3EiLAkJRVY1SFdNRU0oMHgxRiwweDA0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcWMiLAkJRVY1SFdNRU0oMHgxRiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcXYiLAkJRVY1SFdNRU0oMHgxRiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcXZjIiwJRVY1SFdNRU0oMHgxRiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvciIsCQlFVjRIV01FTSgweDFGLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3YiLAkJRVY1SFdNRU0oMHgxRiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvdmMiLAkJRVY1SFdNRU0oMHgxRiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAicGFsMWYiLAkJUENEKDB4MUYpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAibGRmIiwJCU1FTSgweDIwKSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAibGRnIiwJCU1FTSgweDIxKSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAibGRzIiwJCU1FTSgweDIyKSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAibGR0IiwJCU1FTSgweDIzKSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAic3RmIiwJCU1FTSgweDI0KSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAic3RnIiwJCU1FTSgweDI1KSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAic3RzIiwJCU1FTSgweDI2KSwgQkFTRSwgQVJHX0ZNRU0gfSwKLSAgeyAic3R0IiwJCU1FTSgweDI3KSwgQkFTRSwgQVJHX0ZNRU0gfSwKLQotICB7ICJsZGwiLAkJTUVNKDB4MjgpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkcSIsCQlNRU0oMHgyOSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRsX2wiLAkJTUVNKDB4MkEpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkcV9sIiwJCU1FTSgweDJCKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJzdGwiLAkJTUVNKDB4MkMpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgInN0cSIsCQlNRU0oMHgyRCksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RsX2MiLAkJTUVNKDB4MkUpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgInN0cV9jIiwJCU1FTSgweDJGKSwgQkFTRSwgQVJHX01FTSB9LAotCi0gIHsgImJyIiwJCUJSQSgweDMwKSwgQkFTRSwgeyBaQSwgQkRJU1AgfSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiYnIiLAkJQlJBKDB4MzApLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImZiZXEiLAkJQlJBKDB4MzEpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJmYmx0IiwJCUJSQSgweDMyKSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiZmJsZSIsCQlCUkEoMHgzMyksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImJzciIsCQlCUkEoMHgzNCksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiZmJuZSIsCQlCUkEoMHgzNSksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZiZ2UiLAkJQlJBKDB4MzYpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJmYmd0IiwJCUJSQSgweDM3KSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiYmxiYyIsCQlCUkEoMHgzOCksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmVxIiwJCUJSQSgweDM5KSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibHQiLAkJQlJBKDB4M0EpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJsZSIsCQlCUkEoMHgzQiksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmxicyIsCQlCUkEoMHgzQyksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYm5lIiwJCUJSQSgweDNEKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJiZ2UiLAkJQlJBKDB4M0UpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJndCIsCQlCUkEoMHgzRiksIEJBU0UsIEFSR19CUkEgfSwKLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGFscGhhX251bV9vcGNvZGVzID0gc2l6ZW9mKGFscGhhX29wY29kZXMpL3NpemVvZigqYWxwaGFfb3Bjb2Rlcyk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FyYy1kaXMuYyBiL29wY29kZXMvYXJjLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDJiMDdiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYXJjLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIHByaW50aW5nIGNvZGUgZm9yIHRoZSBBUkMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2FyYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgaW50IHByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIGludCBwcmludF9pbnNuX2FyY19iYXNlX2JpZyBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKiwgaW50LCBpbnQpKTsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoNCBvciA4IGZvciB0aGUgQVJDKS4gKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAocGMsIGluZm8sIG1hY2gsIGJpZ19wKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgbWFjaDsKLSAgICAgaW50IGJpZ19wOwotewotICBjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICBpbnQgc3RhdHVzOwotICAvKiBGaXJzdCBlbGVtZW50IGlzIGluc24sIHNlY29uZCBlbGVtZW50IGlzIGxpbW0gKGlmIHByZXNlbnQpLiAgKi8KLSAgYXJjX2luc24gaW5zblsyXTsKLSAgaW50IGdvdF9saW1tX3AgPSAwOwotICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLSAgc3RhdGljIGludCBjdXJyZW50X21hY2ggPSAwOwotCi0gIGlmICghaW5pdGlhbGl6ZWQgfHwgbWFjaCAhPSBjdXJyZW50X21hY2gpCi0gICAgewotICAgICAgaW5pdGlhbGl6ZWQgPSAxOwotICAgICAgY3VycmVudF9tYWNoID0gYXJjX2dldF9vcGNvZGVfbWFjaCAobWFjaCwgYmlnX3ApOwotICAgICAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoY3VycmVudF9tYWNoKTsKLSAgICB9Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoYmlnX3ApCi0gICAgaW5zblswXSA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gIGVsc2UKLSAgICBpbnNuWzBdID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotICAoKmZ1bmMpIChzdHJlYW0sICIlMDhseFx0IiwgaW5zblswXSk7Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGxpc3RzIGhhc2hlZCBieSB0aGUgaW5zbiBjb2RlCi0gICAgICh0aG91Z2ggd2UgbmVlZG4ndCBjYXJlIGhvdyB0aGV5J3JlIGhhc2hlZCkuICAqLwotCi0gIG9wY29kZSA9IGFyY19vcGNvZGVfbG9va3VwX2RpcyAoaW5zblswXSk7Ci0gIGZvciAoIDsgb3Bjb2RlICE9IE5VTEw7IG9wY29kZSA9IEFSQ19PUENPREVfTkVYVF9ESVMgKG9wY29kZSkpCi0gICAgewotICAgICAgY2hhciAqc3luOwotICAgICAgaW50IG1vZHMsaW52YWxpZDsKLSAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKm9wdmFsOwotCi0gICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgaWYgKChpbnNuWzBdICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPnZhbHVlKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTdXBwb3J0ZWQgYnkgdGhpcyBjcHU/ICAqLwotICAgICAgaWYgKCEgYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIE1ha2UgdHdvIHBhc3NlcyBvdmVyIHRoZSBvcGVyYW5kcy4gIEZpcnN0IHNlZSBpZiBhbnkgb2YgdGhlbQotCSBoYXZlIGV4dHJhY3Rpb24gZnVuY3Rpb25zLCBhbmQsIGlmIHRoZXkgZG8sIG1ha2Ugc3VyZSB0aGUKLQkgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotCi0gICAgICBhcmNfb3Bjb2RlX2luaXRfZXh0cmFjdCAoKTsKLSAgICAgIGludmFsaWQgPSAwOwotCi0gICAgICAvKiA/Pz8gR3JhbnRlZCwgdGhpcyBpcyBzbG93ZXIgdGhhbiB0aGUgYHBwYycgd2F5LiAgTWF5YmUgd2hlbiB0aGlzIGlzCi0JIGRvbmUgaXQnbGwgYmUgY2xlYXIgd2hhdCB0aGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMgaXMuICAqLwotICAgICAgLyogSW5zdHJ1Y3Rpb25zIGxpa2UgImFkZC5mIHIwLHIxLDEiIGFyZSB0cmlja3kgYmVjYXVzZSB0aGUgIi5mIiBnZXRzCi0JIHByaW50ZWQgZmlyc3QsIGJ1dCB3ZSBkb24ndCBrbm93IGhvdyB0byBwcmludCBpdCB1bnRpbCB3ZSd2ZSBwcm9jZXNzZWQKLQkgdGhlIHJlZ3MuICBTaW5jZSB3ZSdyZSBzY2FubmluZyBhbGwgdGhlIGFyZ3MgYmVmb3JlIHByaW50aW5nIHRoZSBpbnNuCi0JIGFueXdheXMsIGl0J3MgYWN0dWFsbHkgcXVpdGUgZWFzeS4gICovCi0KLSAgICAgIGZvciAoc3luID0gb3Bjb2RlLT5zeW50YXg7ICpzeW47ICsrc3luKQotCXsKLQkgIGludCBjOwotCi0JICBpZiAoKnN5biAhPSAnJScgfHwgKisrc3luID09ICclJykKLQkgICAgY29udGludWU7Ci0JICBtb2RzID0gMDsKLQkgIGMgPSAqc3luOwotCSAgd2hpbGUgKEFSQ19NT0RfUCAoYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MpKQotCSAgICB7Ci0JICAgICAgbW9kcyB8PSBhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncyAmIEFSQ19NT0RfQklUUzsKLQkgICAgICArK3N5bjsKLQkgICAgICBjID0gKnN5bjsKLQkgICAgfQotCSAgb3BlcmFuZCA9IGFyY19vcGVyYW5kcyArIGFyY19vcGVyYW5kX21hcFtjXTsKLQkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCBvcGVyYW5kLCBtb2RzLAotCQkJCSAoY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqKSBOVUxMLAotCQkJCSAmaW52YWxpZCk7Ci0JfQotICAgICAgaWYgKGludmFsaWQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0KLSAgICAgIC8qIElmIHdlIGhhdmUgYW4gaW5zbiB3aXRoIGEgbGltbSwgZmV0Y2ggaXQgbm93LiAgU2Nhbm5pbmcgdGhlIGluc25zCi0JIHR3aWNlIGxldHMgdXMgZG8gdGhpcy4gICovCi0gICAgICBpZiAoYXJjX29wY29kZV9saW1tX3AgKE5VTEwpKQotCXsKLQkgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjICsgNCwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgIGlmIChzdGF0dXMgIT0gMCkKLQkgICAgewotCSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIGlmIChiaWdfcCkKLQkgICAgaW5zblsxXSA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0JICBlbHNlCi0JICAgIGluc25bMV0gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCSAgZ290X2xpbW1fcCA9IDE7Ci0JfQotCi0gICAgICBmb3IgKHN5biA9IG9wY29kZS0+c3ludGF4OyAqc3luOyArK3N5bikKLQl7Ci0JICBpbnQgYzsKLQotCSAgaWYgKCpzeW4gIT0gJyUnIHx8ICorK3N5biA9PSAnJScpCi0JICAgIHsKLQkgICAgICAoKmZ1bmMpIChzdHJlYW0sICIlYyIsICpzeW4pOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZC4gIEZldGNoIGFueSBzcGVjaWFsIG1vZGlmaWVycy4gICovCi0JICBtb2RzID0gMDsKLQkgIGMgPSAqc3luOwotCSAgd2hpbGUgKEFSQ19NT0RfUCAoYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MpKQotCSAgICB7Ci0JICAgICAgbW9kcyB8PSBhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncyAmIEFSQ19NT0RfQklUUzsKLQkgICAgICArK3N5bjsKLQkgICAgICBjID0gKnN5bjsKLQkgICAgfQotCSAgb3BlcmFuZCA9IGFyY19vcGVyYW5kcyArIGFyY19vcGVyYW5kX21hcFtjXTsKLQotCSAgLyogRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgb3B2YWwgPSBOVUxMOwotCSAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIG9wZXJhbmQsIG1vZHMsCi0JCQkJCSAgICZvcHZhbCwgKGludCAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSAoaW5zblswXSA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCQkgICYmICh2YWx1ZSAmICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKSkKLQkJdmFsdWUgLT0gMSA8PCBvcGVyYW5kLT5iaXRzOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHN1ZmZpeCBvcGVyYW5kLCBzZXQgYG9wdmFsJy4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKQotCQlvcHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgdmFsdWUpOwotCSAgICB9Ci0KLQkgIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBmbGFncy4gICovCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9GQUtFKQotCSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKD8/PyBhdCBsZWFzdCBub3QgeWV0KSAqLwotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TVUZGSVgpCi0JICAgIHsKLQkgICAgICAvKiBEZWZhdWx0IHN1ZmZpeGVzIGFyZW4ndCBwcmludGVkLiAgRm9ydHVuYXRlbHksIHRoZXkgYWxsIGhhdmUKLQkJIHplcm8gdmFsdWVzLiAgQWxzbywgemVybyB2YWx1ZXMgZm9yIGJvb2xlYW4gc3VmZml4ZXMgYXJlCi0JCSByZXByZXNlbnRlZCBieSB0aGUgYWJzZW5jZSBvZiB0ZXh0LiAgKi8KLQotCSAgICAgIGlmICh2YWx1ZSAhPSAwKQotCQl7Ci0JCSAgLyogPz8/IE9QVkFMIHNob3VsZCBoYXZlIGEgdmFsdWUuICBJZiBpdCBkb2Vzbid0IGp1c3QgY29wZQotCQkgICAgIGFzIHdlIHdhbnQgZGlzYXNzZW1ibHkgdG8gYmUgcmVhc29uYWJseSByb2J1c3QuCi0JCSAgICAgQWxzbyByZW1lbWJlciB0aGF0IHNldmVyYWwgY29uZGl0aW9uIGNvZGUgdmFsdWVzICgxNi0zMSkKLQkJICAgICBhcmVuJ3QgZGVmaW5lZCB5ZXQuICBGb3IgdGhlc2UgY2FzZXMganVzdCBwcmludCB0aGUKLQkJICAgICBudW1iZXIgc3VpdGFibHkgZGVjb3JhdGVkLiAgKi8KLQkJICBpZiAob3B2YWwpCi0JCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlcyVzIiwKLQkJCSAgICAgbW9kcyAmIEFSQ19NT0RfRE9UID8gIi4iIDogIiIsCi0JCQkgICAgIG9wdmFsLT5uYW1lKTsKLQkJICBlbHNlCi0JCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlcyVjJWQiLAotCQkJICAgICBtb2RzICYgQVJDX01PRF9ET1QgPyAiLiIgOiAiIiwKLQkJCSAgICAgb3BlcmFuZC0+Zm10LCB2YWx1ZSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0gpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAocGMgKyA0ICsgdmFsdWUsIGluZm8pOwotCSAgLyogPz8/IE5vdCBhbGwgY2FzZXMgb2YgdGhpcyBhcmUgY3VycmVudGx5IGNhdWdodC4gICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCkKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgdmFsdWUgJiAweGZmZmZmZmZmLCBpbmZvKTsKLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfQUREUkVTUykKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgdmFsdWUgJiAweGZmZmZmZmZmLCBpbmZvKTsKLQkgIGVsc2UgaWYgKG9wdmFsKQotCSAgICAvKiBOb3RlIHRoYXQgdGhpcyBjYXNlIGNhdGNoZXMgYm90aCBub3JtYWwgYW5kIGF1eGlsaWFyeSByZWdzLiAgKi8KLQkgICAgKCpmdW5jKSAoc3RyZWFtLCAiJXMiLCBvcHZhbC0+bmFtZSk7Ci0JICBlbHNlCi0JICAgICgqZnVuYykgKHN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgZm91bmQgYW5kIHByaW50ZWQgYW4gaW5zdHJ1Y3Rpb247IHJldHVybi4gICovCi0gICAgICByZXR1cm4gZ290X2xpbW1fcCA/IDggOiA0OwotICAgIH0KLQotICAoKmZ1bmMpIChzdHJlYW0sIF8oIip1bmtub3duKiIpKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIEdpdmVuIE1BQ0gsIG9uZSBvZiBiZmRfbWFjaF9hcmNfeHh4LCByZXR1cm4gdGhlIHByaW50X2luc24gZnVuY3Rpb24gdG8gdXNlLgotICAgVGhpcyBkb2VzIHRoaW5ncyBhIG5vbi1zdGFuZGFyZCB3YXkgKHRoZSAic3RhbmRhcmQiIHdheSB3b3VsZCBiZSB0byBjb3B5Ci0gICB0aGlzIGNvZGUgaW50byBkaXNhc3NlbWJsZS5jKS4gIFNpbmNlIHRoZXJlIGFyZSBtb3JlIHRoYW4gYSBjb3VwbGUgb2YKLSAgIHZhcmlhbnRzLCBoaWRpbmcgYWxsIHRoaXMgY3J1ZCBoZXJlIHNlZW1zIGNsZWFuZXIuICAqLwotCi1kaXNhc3NlbWJsZXJfZnR5cGUKLWFyY19nZXRfZGlzYXNzZW1ibGVyIChtYWNoLCBiaWdfcCkKLSAgICAgaW50IG1hY2g7Ci0gICAgIGludCBiaWdfcDsKLXsKLSAgc3dpdGNoIChtYWNoKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX2FyY19iYXNlOgotICAgICAgcmV0dXJuIGJpZ19wID8gcHJpbnRfaW5zbl9hcmNfYmFzZV9iaWcgOiBwcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZTsKLSAgICB9Ci0gIHJldHVybiBwcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmNfYmFzZV9saXR0bGUgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbiAocGMsIGluZm8sIGJmZF9tYWNoX2FyY19iYXNlLCAwKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmNfYmFzZV9iaWcgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbiAocGMsIGluZm8sIGJmZF9tYWNoX2FyY19iYXNlLCAxKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXJjLW9wYy5jIGIvb3Bjb2Rlcy9hcmMtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOGY2ODkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcmMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMxICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEFSQy4KLSAgIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvYXJjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi0jZGVmaW5lIElOU0VSVF9GTihmbikgXAotc3RhdGljIGFyY19pbnNuIGZuIFBBUkFNUyAoKGFyY19pbnNuLCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKiwgXAotCQkJICAgIGludCwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICosIGxvbmcsIFwKLQkJCSAgICBjb25zdCBjaGFyICoqKSkKLSNkZWZpbmUgRVhUUkFDVF9GTihmbikgXAotc3RhdGljIGxvbmcgZm4gUEFSQU1TICgoYXJjX2luc24gKiwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICosIFwKLQkJCWludCwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqLCBpbnQgKikpCi0KLUlOU0VSVF9GTiAoaW5zZXJ0X3JlZyk7Ci1JTlNFUlRfRk4gKGluc2VydF9zaGltbWZpbmlzaCk7Ci1JTlNFUlRfRk4gKGluc2VydF9saW1tZmluaXNoKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3NoaW1tb2Zmc2V0KTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3NoaW1temVybyk7Ci1JTlNFUlRfRk4gKGluc2VydF9mbGFnKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2ZsYWdmaW5pc2gpOwotSU5TRVJUX0ZOIChpbnNlcnRfY29uZCk7Ci1JTlNFUlRfRk4gKGluc2VydF9mb3JjZWxpbW0pOwotSU5TRVJUX0ZOIChpbnNlcnRfcmVsYWRkcik7Ci1JTlNFUlRfRk4gKGluc2VydF9hYnNhZGRyKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3Vub3BtYWNybyk7Ci0KLUVYVFJBQ1RfRk4gKGV4dHJhY3RfcmVnKTsKLUVYVFJBQ1RfRk4gKGV4dHJhY3RfZmxhZyk7Ci1FWFRSQUNUX0ZOIChleHRyYWN0X2NvbmQpOwotRVhUUkFDVF9GTiAoZXh0cmFjdF9yZWxhZGRyKTsKLUVYVFJBQ1RfRk4gKGV4dHJhY3RfdW5vcG1hY3JvKTsKLQotLyogVmFyaW91cyB0eXBlcyBvZiBBUkMgb3BlcmFuZHMsIGluY2x1ZGluZyBpbnNuIHN1ZmZpeGVzLiAgKi8KLQotLyogSW5zbiBmb3JtYXQgdmFsdWVzOgotCi0gICAnYScJUkVHQQkJcmVnaXN0ZXIgQSBmaWVsZAotICAgJ2InCVJFR0IJCXJlZ2lzdGVyIEIgZmllbGQKLSAgICdjJwlSRUdDCQlyZWdpc3RlciBDIGZpZWxkCi0gICAnUycJU0hJTU1GSU5JU0gJZmluaXNoIGluc2VydGluZyBhIHNoaW1tIHZhbHVlCi0gICAnTCcJTElNTUZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIGEgbGltbSB2YWx1ZQotICAgJ2QnCVNISU1NT0ZGU0VUCXNoaW1tIG9mZnNldCBpbiBsZCxzdCBpbnNucwotICAgJzAnCVNISU1NWkVSTwkwIHNoaW1tIHZhbHVlIGluIGxkLHN0IGluc25zCi0gICAnZicJRkxBRwkJRiBmbGFnCi0gICAnRicJRkxBR0ZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIHRoZSBGIGZsYWcKLSAgICdHJwlGTEFHSU5TTglpbnNlcnQgRiBmbGFnIGluICJmbGFnIiBpbnNuCi0gICAnbicJREVMQVkJCU4gZmllbGQgKG51bGxpZnkgZmllbGQpCi0gICAncScJQ09ORAkJY29uZGl0aW9uIGNvZGUgZmllbGQKLSAgICdRJwlGT1JDRUxJTU0Jc2V0IGBjb25kX3AnIHRvIDEgdG8gZW5zdXJlIGEgY29uc3RhbnQgaXMgYSBsaW1tCi0gICAnQicJQlJBTkNICQlicmFuY2ggYWRkcmVzcyAoMjIgYml0IHBjIHJlbGF0aXZlKQotICAgJ0onCUpVTVAJCWp1bXAgYWRkcmVzcyAoMjYgYml0IGFic29sdXRlKQotICAgJ3onCVNJWkUxCQlzaXplIGZpZWxkIGluIGxkIGEsW2IsY10KLSAgICdaJwlTSVpFMTAJCXNpemUgZmllbGQgaW4gbGQgYSxbYixzaGltbV0KLSAgICd5JwlTSVpFMjIJCXNpemUgZmllbGQgaW4gc3QgYyxbYixzaGltbV0KLSAgICd4JwlTSUdOMAkJc2lnbiBleHRlbmQgZmllbGQgbGQgYSxbYixjXQotICAgJ1gnCVNJR045CQlzaWduIGV4dGVuZCBmaWVsZCBsZCBhLFtiLHNoaW1tXQotICAgJ3cnCUFERFJFU1MzCXdyaXRlLWJhY2sgZmllbGQgaW4gbGQgYSxbYixjXQotICAgJ1cnCUFERFJFU1MxMgl3cml0ZS1iYWNrIGZpZWxkIGluIGxkIGEsW2Isc2hpbW1dCi0gICAndicJQUREUkVTUzI0CXdyaXRlLWJhY2sgZmllbGQgaW4gc3QgYyxbYixzaGltbV0KLSAgICdlJwlDQUNIRUJZUEFTUzUJY2FjaGUgYnlwYXNzIGluIGxkIGEsW2IsY10KLSAgICdFJwlDQUNIRUJZUEFTUzE0CWNhY2hlIGJ5cGFzcyBpbiBsZCBhLFtiLHNoaW1tXQotICAgJ0QnCUNBQ0hFQllQQVNTMjYJY2FjaGUgYnlwYXNzIGluIHN0IGMsW2Isc2hpbW1dCi0gICAnVScJVU5PUE1BQ1JPCWZha2Ugb3BlcmFuZCB0byBjb3B5IFJFR0IgdG8gUkVHQyBmb3IgdW5vcCBtYWNyb3MKLQotICAgVGhlIGZvbGxvd2luZyBtb2RpZmllcnMgbWF5IGFwcGVhciBiZXR3ZWVuIHRoZSAlIGFuZCBjaGFyIChlZzogJS5mKToKLQotICAgJy4nCU1PRERPVAkJJy4nIHByZWZpeCBtdXN0IGJlIHByZXNlbnQKLSAgICdyJwlSRUcJCWdlbmVyaWMgcmVnaXN0ZXIgdmFsdWUsIGZvciByZWdpc3RlciB0YWJsZQotICAgJ0EnCUFVWFJFRwkJYXV4aWxpYXJ5IHJlZ2lzdGVyIGluIGxyIGEsW2JdLCBzciBjLFtiXQotCi0gICBGaWVsZHMgYXJlOgotCi0gICBDSEFSIEJJVFMgU0hJRlQgRkxBR1MgSU5TRVJUX0ZOIEVYVFJBQ1RfRk4KLSovCi0KLWNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCBhcmNfb3BlcmFuZHNbXSA9Ci17Ci0vKiBwbGFjZSBob2xkZXIgKD8/PyBub3Qgc3VyZSBpZiBuZWVkZWQpICovCi0jZGVmaW5lIFVOVVNFRCAwCi0gIHsgMCB9LAotCi0vKiByZWdpc3RlciBBIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCi0jZGVmaW5lIFJFR0EgKFVOVVNFRCArIDEpCi0gIHsgJ2EnLCA2LCBBUkNfU0hJRlRfUkVHQSwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVnLCBleHRyYWN0X3JlZyB9LAotCi0vKiByZWdpc3RlciBCIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCi0jZGVmaW5lIFJFR0IgKFJFR0EgKyAxKQotICB7ICdiJywgNiwgQVJDX1NISUZUX1JFR0IsIEFSQ19PUEVSQU5EX1NJR05FRCwgaW5zZXJ0X3JlZywgZXh0cmFjdF9yZWcgfSwKLQotLyogcmVnaXN0ZXIgQyBvciBzaGltbS9saW1tIGluZGljYXRvciAqLwotI2RlZmluZSBSRUdDIChSRUdCICsgMSkKLSAgeyAnYycsIDYsIEFSQ19TSElGVF9SRUdDLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWcsIGV4dHJhY3RfcmVnIH0sCi0KLS8qIGZha2Ugb3BlcmFuZCB1c2VkIHRvIGluc2VydCBzaGltbSB2YWx1ZSBpbnRvIG1vc3QgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFNISU1NRklOSVNIIChSRUdDICsgMSkKLSAgeyAnUycsIDksIDAsIEFSQ19PUEVSQU5EX1NJR05FRCArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9zaGltbWZpbmlzaCwgMCB9LAotCi0vKiBmYWtlIG9wZXJhbmQgdXNlZCB0byBpbnNlcnQgbGltbSB2YWx1ZSBpbnRvIG1vc3QgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTElNTUZJTklTSCAoU0hJTU1GSU5JU0ggKyAxKQotICB7ICdMJywgMzIsIDMyLCBBUkNfT1BFUkFORF9BRERSRVNTICsgQVJDX09QRVJBTkRfTElNTSArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9saW1tZmluaXNoLCAwIH0sCi0KLS8qIHNoaW1tIG9wZXJhbmQgd2hlbiB0aGVyZSBpcyBubyByZWcgaW5kaWNhdG9yIChsZCxzdCkgKi8KLSNkZWZpbmUgU0hJTU1PRkZTRVQgKExJTU1GSU5JU0ggKyAxKQotICB7ICdkJywgOSwgMCwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfc2hpbW1vZmZzZXQsIDAgfSwKLQotLyogMCBzaGltbSBvcGVyYW5kIGZvciBsZCxzdCBpbnNucyAqLwotI2RlZmluZSBTSElNTVpFUk8gKFNISU1NT0ZGU0VUICsgMSkKLSAgeyAnMCcsIDksIDAsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9zaGltbXplcm8sIDAgfSwKLQotLyogZmxhZyB1cGRhdGUgYml0IChpbnNlcnRpb24gaXMgZGVmZXJlZCB1bnRpbCB3ZSBrbm93IGhvdykgKi8KLSNkZWZpbmUgRkxBRyAoU0hJTU1aRVJPICsgMSkKLSAgeyAnZicsIDEsIDgsIEFSQ19PUEVSQU5EX1NVRkZJWCwgaW5zZXJ0X2ZsYWcsIGV4dHJhY3RfZmxhZyB9LAotCi0vKiBmYWtlIHV0aWxpdHkgb3BlcmFuZCB0byBmaW5pc2ggJ2YnIHN1ZmZpeCBoYW5kbGluZyAqLwotI2RlZmluZSBGTEFHRklOSVNIIChGTEFHICsgMSkKLSAgeyAnRicsIDEsIDgsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9mbGFnZmluaXNoLCAwIH0sCi0KLS8qIGZha2UgdXRpbGl0eSBvcGVyYW5kIHRvIHNldCB0aGUgJ2YnIGZsYWcgZm9yIHRoZSAiZmxhZyIgaW5zbiAqLwotI2RlZmluZSBGTEFHSU5TTiAoRkxBR0ZJTklTSCArIDEpCi0gIHsgJ0cnLCAxLCA4LCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfZmxhZywgMCB9LAotCi0vKiBicmFuY2ggZGVsYXkgdHlwZXMgKi8KLSNkZWZpbmUgREVMQVkgKEZMQUdJTlNOICsgMSkKLSAgeyAnbicsIDIsIDUsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBjb25kaXRpb25zICovCi0jZGVmaW5lIENPTkQgKERFTEFZICsgMSkKLSAgeyAncScsIDUsIDAsIEFSQ19PUEVSQU5EX1NVRkZJWCwgaW5zZXJ0X2NvbmQsIGV4dHJhY3RfY29uZCB9LAotCi0vKiBzZXQgYGNvbmRfcCcgdG8gMSB0byBlbnN1cmUgYSBjb25zdGFudCBpcyB0cmVhdGVkIGFzIGEgbGltbSAqLwotI2RlZmluZSBGT1JDRUxJTU0gKENPTkQgKyAxKQotICB7ICdRJywgMCwgMCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2ZvcmNlbGltbSB9LAotCi0vKiBicmFuY2ggYWRkcmVzczsgYiwgYmwsIGFuZCBscCBpbnNucyAqLwotI2RlZmluZSBCUkFOQ0ggKEZPUkNFTElNTSArIDEpCi0gIHsgJ0InLCAyMCwgNywgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIICsgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVsYWRkciwgZXh0cmFjdF9yZWxhZGRyIH0sCi0KLS8qIGp1bXAgYWRkcmVzczsgaiBpbnNuICh0aGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyAnTCcgZXhjZXB0IHRoYXQgdGhlCi0gICB2YWx1ZSBpcyByaWdodCBzaGlmdGVkIGJ5IDIpICovCi0jZGVmaW5lIEpVTVAgKEJSQU5DSCArIDEpCi0gIHsgJ0onLCAyNCwgMzIsIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCArIEFSQ19PUEVSQU5EX0xJTU0gKyBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfYWJzYWRkciB9LAotCi0vKiBzaXplIGZpZWxkLCBzdG9yZWQgaW4gYml0IDEsMiAqLwotI2RlZmluZSBTSVpFMSAoSlVNUCArIDEpCi0gIHsgJ3onLCAyLCAxLCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogc2l6ZSBmaWVsZCwgc3RvcmVkIGluIGJpdCAxMCwxMSAqLwotI2RlZmluZSBTSVpFMTAgKFNJWkUxICsgMSkKLSAgeyAnWicsIDIsIDEwLCBBUkNfT1BFUkFORF9TVUZGSVgsIH0sCi0KLS8qIHNpemUgZmllbGQsIHN0b3JlZCBpbiBiaXQgMjIsMjMgKi8KLSNkZWZpbmUgU0laRTIyIChTSVpFMTAgKyAxKQotICB7ICd5JywgMiwgMjIsIEFSQ19PUEVSQU5EX1NVRkZJWCwgfSwKLQotLyogc2lnbiBleHRlbmQgZmllbGQsIHN0b3JlZCBpbiBiaXQgMCAqLwotI2RlZmluZSBTSUdOMCAoU0laRTIyICsgMSkKLSAgeyAneCcsIDEsIDAsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBzaWduIGV4dGVuZCBmaWVsZCwgc3RvcmVkIGluIGJpdCA5ICovCi0jZGVmaW5lIFNJR045IChTSUdOMCArIDEpCi0gIHsgJ1gnLCAxLCA5LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogYWRkcmVzcyB3cml0ZSBiYWNrLCBzdG9yZWQgaW4gYml0IDMgKi8KLSNkZWZpbmUgQUREUkVTUzMgKFNJR045ICsgMSkKLSAgeyAndycsIDEsIDMsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBhZGRyZXNzIHdyaXRlIGJhY2ssIHN0b3JlZCBpbiBiaXQgMTIgKi8KLSNkZWZpbmUgQUREUkVTUzEyIChBRERSRVNTMyArIDEpCi0gIHsgJ1cnLCAxLCAxMiwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGFkZHJlc3Mgd3JpdGUgYmFjaywgc3RvcmVkIGluIGJpdCAyNCAqLwotI2RlZmluZSBBRERSRVNTMjQgKEFERFJFU1MxMiArIDEpCi0gIHsgJ3YnLCAxLCAyNCwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGNhY2hlIGJ5cGFzcywgc3RvcmVkIGluIGJpdCA1ICovCi0jZGVmaW5lIENBQ0hFQllQQVNTNSAoQUREUkVTUzI0ICsgMSkKLSAgeyAnZScsIDEsIDUsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBjYWNoZSBieXBhc3MsIHN0b3JlZCBpbiBiaXQgMTQgKi8KLSNkZWZpbmUgQ0FDSEVCWVBBU1MxNCAoQ0FDSEVCWVBBU1M1ICsgMSkKLSAgeyAnRScsIDEsIDE0LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogY2FjaGUgYnlwYXNzLCBzdG9yZWQgaW4gYml0IDI2ICovCi0jZGVmaW5lIENBQ0hFQllQQVNTMjYgKENBQ0hFQllQQVNTMTQgKyAxKQotICB7ICdEJywgMSwgMjYsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiB1bm9wIG1hY3JvLCB1c2VkIHRvIGNvcHkgUkVHQiB0byBSRUdDICovCi0jZGVmaW5lIFVOT1BNQUNSTyAoQ0FDSEVCWVBBU1MyNiArIDEpCi0gIHsgJ1UnLCA2LCBBUkNfU0hJRlRfUkVHQywgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3Vub3BtYWNybywgZXh0cmFjdF91bm9wbWFjcm8gfSwKLQotLyogJy4nIG1vZGlmaWVyICgnLicgcmVxdWlyZWQpLiAgKi8KLSNkZWZpbmUgTU9ERE9UIChVTk9QTUFDUk8gKyAxKQotICB7ICcuJywgMSwgMCwgQVJDX01PRF9ET1QgfSwKLQotLyogRHVtbXkgJ3InIG1vZGlmaWVyIGZvciB0aGUgcmVnaXN0ZXIgdGFibGUuCi0gICBJdCdzIGNhbGxlZCBhICJkdW1teSIgYmVjYXVzZSB0aGVyZSdzIG5vIHBvaW50IGluIGluc2VydGluZyBhbiAncicgaW50byBhbGwKLSAgIHRoZSAlYS8lYi8lYyBvY2N1cnJlbmNlcyBpbiB0aGUgaW5zbiB0YWJsZS4gICovCi0jZGVmaW5lIFJFRyAoTU9ERE9UICsgMSkKLSAgeyAncicsIDYsIDAsIEFSQ19NT0RfUkVHIH0sCi0KLS8qIEtub3duIGF1eGlsaWFyeSByZWdpc3RlciBtb2RpZmllciAoc3RvcmVkIGluIHNoaW1tIGZpZWxkKS4gICovCi0jZGVmaW5lIEFVWFJFRyAoUkVHICsgMSkKLSAgeyAnQScsIDksIDAsIEFSQ19NT0RfQVVYUkVHIH0sCi0KLS8qIGVuZCBvZiBsaXN0IHBsYWNlIGhvbGRlciAqLwotICB7IDAgfQotfTsKLQwKLS8qIEdpdmVuIGEgZm9ybWF0IGxldHRlciwgeWllbGRzIHRoZSBpbmRleCBpbnRvIGBhcmNfb3BlcmFuZHMnLgotICAgZWc6IGFyY19vcGVyYW5kX21hcFsnYSddID0gUkVHQS4gICovCi11bnNpZ25lZCBjaGFyIGFyY19vcGVyYW5kX21hcFsyNTZdOwotCi0jZGVmaW5lIEkoeCkgKCgoeCkgJiAzMSkgPDwgMjcpCi0jZGVmaW5lIEEoeCkgKCgoeCkgJiBBUkNfTUFTS19SRUcpIDw8IEFSQ19TSElGVF9SRUdBKQotI2RlZmluZSBCKHgpICgoKHgpICYgQVJDX01BU0tfUkVHKSA8PCBBUkNfU0hJRlRfUkVHQikKLSNkZWZpbmUgQyh4KSAoKCh4KSAmIEFSQ19NQVNLX1JFRykgPDwgQVJDX1NISUZUX1JFR0MpCi0jZGVmaW5lIFIoeCxiLG0pICgoKHgpICYgKG0pKSA8PCAoYikpCS8qIHZhbHVlIFgsIG1hc2sgTSwgYXQgYml0IEIgKi8KLQotLyogQVJDIGluc3RydWN0aW9ucy4KLQotICAgTG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIG11c3QgYXBwZWFyIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGlmIGdhcyBzZWVzCi0gICAibHNyIHIyLHIzLDEiIHdoZW4gaXQncyBwYXJzaW5nICJsc3IgJWEsJWIiIGl0IHdpbGwgdGhpbmsgdGhlICIsMSIgaXMKLSAgIGp1bmspLiAgVGhpcyBpc24ndCBuZWNlc3NhcnkgZm9yIGBsZCcgYmVjYXVzZSBvZiB0aGUgdHJhaWxpbmcgJ10nLgotCi0gICBJbnN0cnVjdGlvbnMgdGhhdCBhcmUgcmVhbGx5IG1hY3JvcyBiYXNlZCBvbiBvdGhlciBpbnNucyBtdXN0IGFwcGVhcgotICAgYmVmb3JlIHRoZSByZWFsIGluc24gc28gdGhleSdyZSBjaG9zZW4gd2hlbiBkaXNhc3NlbWJsaW5nLiAgRWc6IFRoZSBgbW92JwotICAgaW5zbiBpcyByZWFsbHkgdGhlIGBhbmQnIGluc24uCi0KLSAgIFRoaXMgdGFibGUgaXMgYmVzdCB2aWV3ZWQgb24gYSB3aWRlIHNjcmVlbiAoMTYxIGNvbHVtbnMpLiAgSSdkIHByZWZlciB0bwotICAga2VlcCBpdCB0aGlzIHdheS4gIFRoZSByZXN0IG9mIHRoZSBmaWxlLCBob3dldmVyLCBzaG91bGQgYmUgdmlld2FibGUgb24gYW4KLSAgIDgwIGNvbHVtbiB0ZXJtaW5hbC4gICovCi0KLS8qID8/PyBUaGlzIHRhYmxlIGFsc28gaW5jbHVkZXMgbWFjcm9zOiBhc2wsIGxzbCwgYW5kIG1vdi4gIFRoZSBwcGMgcG9ydCBoYXMKLSAgIGEgbW9yZSBnZW5lcmFsIGZhY2lsaXR5IGZvciBkZWFsaW5nIHdpdGggbWFjcm9zIHdoaWNoIGNvdWxkIGJlIHVzZWQgaWYKLSAgIHdlIG5lZWQgdG8uICAqLwotCi0vKiBUaGlzIHRhYmxlIGNhbid0IGJlIGBjb25zdCcgYmVjYXVzZSBtZW1iZXJzIGBuZXh0X2FzbScgYW5kIGBuZXh0X2RpcycgYXJlCi0gICBjb21wdXRlZCBhdCBydW4tdGltZS4gIFdlIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28sIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbQotICAgd29ydGggaXQuICAqLwotCi1zdHJ1Y3QgYXJjX29wY29kZSBhcmNfb3Bjb2Rlc1tdID0gewotCi0gIC8qIE1hY3JvcyBhcHBlYXIgZmlyc3QuICAqLwotICAvKiAibW92IiBpcyByZWFsbHkgYW4gImFuZCIuICAqLwotICB7ICJtb3YlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoMTIpIH0sCi0gIC8qICJhc2wiIGlzIHJlYWxseSBhbiAiYWRkIi4gICovCi0gIHsgImFzbCUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg4KSB9LAotICAvKiAibHNsIiBpcyByZWFsbHkgYW4gImFkZCIuICAqLwotICB7ICJsc2wlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoOCkgfSwKLSAgLyogIm5vcCIgaXMgcmVhbGx5IGFuICJ4b3IiLiAgKi8KLSAgeyAibm9wIiwJCQkJMHhmZmZmZmZmZiwJMHg3ZmZmZmZmZiB9LAotICAvKiAicmxjIiBpcyByZWFsbHkgYW4gImFkYyIuICAqLwotICB7ICJybGMlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoOSkgfSwKLQotICAvKiBUaGUgcmVzdCBvZiB0aGVzZSBuZWVkbid0IGJlIHNvcnRlZCwgYnV0IGl0IGhlbHBzIHRvIGZpbmQgdGhlbSBpZiB0aGV5IGFyZS4gICovCi0gIHsgImFkYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoOSkgfSwKLSAgeyAiYWRkJS5xJS5mICVhLCViLCVjJUYlUyVMIiwJCUkoLTEpLAkJSSg4KSB9LAotICB7ICJhbmQlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEyKSB9LAotICB7ICJhc3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygxKSB9LAotICB7ICJiaWMlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDE0KSB9LAotICB7ICJiJXElLm4gJUIiLAkJCUkoLTEpLAkJSSg0KSwJCUFSQ19PUENPREVfQ09ORF9CUkFOQ0ggfSwKLSAgeyAiYmwlcSUubiAlQiIsCQkJSSgtMSksCQlJKDUpLAkJQVJDX09QQ09ERV9DT05EX0JSQU5DSCB9LAotICB7ICJleHRiJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNykgfSwKLSAgeyAiZXh0dyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDgpIH0sCi0gIHsgImZsYWclLnEgJWIlRyVTJUwiLAkJCUkoLTEpK0EoLTEpK0MoLTEpLAkJSSgzKStBKEFSQ19SRUdfU0hJTU1fVVBEQVRFKStDKDApIH0sCi0gIC8qICVROiBmb3JjZSBjb25kX3A9MSAtLT4gbm8gc2hpbW0gdmFsdWVzICovCi0gIC8qID8/PyBUaGlzIGluc24gYWxsb3dzIGFuIG9wdGlvbmFsIGZsYWdzIHNwZWMuICAqLwotICB7ICJqJXElUSUubiUuZiAlYiVKIiwJCQlJKC0xKStBKC0xKStDKC0xKStSKC0xLDcsMSksCUkoNykrQSgwKStDKDApK1IoMCw3LDEpIH0sCi0gIC8qIFB1dCBvcGNvZGUgMSBsZCBpbnNucyBmaXJzdCBzbyBzaGltbSBnZXRzIHByZWZlcmVkIG92ZXIgbGltbS4gICovCi0gIC8qICJbJWJdIiBpcyBiZWZvcmUgIlslYiwlZF0iIHNvIDAgb2Zmc2V0cyBkb24ndCBnZXQgcHJpbnRlZC4gICovCi0gIHsgImxkJVolLlglLlclLkUgJTAlYSxbJWJdJUwiLAlJKC0xKStSKC0xLDEzLDEpK1IoLTEsMCw1MTEpLAlJKDEpK1IoMCwxMywxKStSKDAsMCw1MTEpIH0sCi0gIHsgImxkJVolLlglLlclLkUgJWEsWyViLCVkXSVTJUwiLAlJKC0xKStSKC0xLDEzLDEpLAkJSSgxKStSKDAsMTMsMSkgfSwKLSAgeyAibGQleiUueCUudyUuZSVRICVhLFslYiwlY10lTCIsCUkoLTEpK1IoLTEsNCwxKStSKC0xLDYsNyksCUkoMCkrUigwLDQsMSkrUigwLDYsNykgfSwKLSAgeyAibHAlcSUubiAlQiIsCQkJSSgtMSksCQlJKDYpLCB9LAotICB7ICJsciAlYSxbJUFiXSVTJUwiLAkJCUkoLTEpK0MoLTEpLAlJKDEpK0MoMHgxMCkgfSwKLSAgeyAibHNyJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoMikgfSwKLSAgeyAib3IlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEzKSB9LAotICB7ICJyb3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygzKSB9LAotICB7ICJycmMlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg0KSB9LAotICB7ICJzYmMlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDExKSB9LAotICB7ICJzZXhiJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNSkgfSwKLSAgeyAic2V4dyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDYpIH0sCi0gIHsgInNyICVjLFslQWJdJVMlTCIsCQkJSSgtMSkrQSgtMSksCUkoMikrQSgweDEwKSB9LAotICAvKiAiWyViXSIgaXMgYmVmb3JlICJbJWIsJWRdIiBzbyAwIG9mZnNldHMgZG9uJ3QgZ2V0IHByaW50ZWQuICAqLwotICB7ICJzdCV5JS52JS5EJVEgJTAlYyxbJWJdJUwiLAkJSSgtMSkrUigtMSwyNSwxKStSKC0xLDIxLDEpK1IoLTEsMCw1MTEpLAlJKDIpK1IoMCwyNSwxKStSKDAsMjEsMSkrUigwLDAsNTExKSB9LAotICB7ICJzdCV5JS52JS5EICVjLFslYiwlZF0lUyVMIiwJSSgtMSkrUigtMSwyNSwxKStSKC0xLDIxLDEpLAkJCUkoMikrUigwLDI1LDEpK1IoMCwyMSwxKSB9LAotICB7ICJzdWIlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEwKSB9LAotICB7ICJ4b3IlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDE1KSB9Ci19OwotY29uc3QgaW50IGFyY19vcGNvZGVzX2NvdW50ID0gc2l6ZW9mIChhcmNfb3Bjb2RlcykgLyBzaXplb2YgKGFyY19vcGNvZGVzWzBdKTsKLQotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIGFyY19yZWdfbmFtZXNbXSA9Ci17Ci0gIC8qIFNvcnQgdGhpcyBzbyB0aGF0IHRoZSBmaXJzdCA2MSBlbnRyaWVzIGFyZSBzZXF1ZW50aWFsLgotICAgICBJRTogRm9yIGVhY2ggaSAoaTw2MSksIGFyY19yZWdfbmFtZXNbaV0udmFsdWUgPT0gaS4gICovCi0KLSAgeyAicjAiLCAwLCBSRUcgfSwgeyAicjEiLCAxLCBSRUcgfSwgeyAicjIiLCAyLCBSRUcgfSwgeyAicjMiLCAzLCBSRUcgfSwKLSAgeyAicjQiLCA0LCBSRUcgfSwgeyAicjUiLCA1LCBSRUcgfSwgeyAicjYiLCA2LCBSRUcgfSwgeyAicjciLCA3LCBSRUcgfSwKLSAgeyAicjgiLCA4LCBSRUcgfSwgeyAicjkiLCA5LCBSRUcgfSwgeyAicjEwIiwgMTAsIFJFRyB9LCB7ICJyMTEiLCAxMSwgUkVHIH0sCi0gIHsgInIxMiIsIDEyLCBSRUcgfSwgeyAicjEzIiwgMTMsIFJFRyB9LCB7ICJyMTQiLCAxNCwgUkVHIH0sIHsgInIxNSIsIDE1LCBSRUcgfSwKLSAgeyAicjE2IiwgMTYsIFJFRyB9LCB7ICJyMTciLCAxNywgUkVHIH0sIHsgInIxOCIsIDE4LCBSRUcgfSwgeyAicjE5IiwgMTksIFJFRyB9LAotICB7ICJyMjAiLCAyMCwgUkVHIH0sIHsgInIyMSIsIDIxLCBSRUcgfSwgeyAicjIyIiwgMjIsIFJFRyB9LCB7ICJyMjMiLCAyMywgUkVHIH0sCi0gIHsgInIyNCIsIDI0LCBSRUcgfSwgeyAicjI1IiwgMjUsIFJFRyB9LCB7ICJyMjYiLCAyNiwgUkVHIH0sIHsgImZwIiwgMjcsIFJFRyB9LAotICB7ICJzcCIsIDI4LCBSRUcgfSwgeyAiaWxpbmsxIiwgMjksIFJFRyB9LCB7ICJpbGluazIiLCAzMCwgUkVHIH0sIHsgImJsaW5rIiwgMzEsIFJFRyB9LAotICB7ICJyMzIiLCAzMiwgUkVHIH0sIHsgInIzMyIsIDMzLCBSRUcgfSwgeyAicjM0IiwgMzQsIFJFRyB9LCB7ICJyMzUiLCAzNSwgUkVHIH0sCi0gIHsgInIzNiIsIDM2LCBSRUcgfSwgeyAicjM3IiwgMzcsIFJFRyB9LCB7ICJyMzgiLCAzOCwgUkVHIH0sIHsgInIzOSIsIDM5LCBSRUcgfSwKLSAgeyAicjQwIiwgNDAsIFJFRyB9LCB7ICJyNDEiLCA0MSwgUkVHIH0sIHsgInI0MiIsIDQyLCBSRUcgfSwgeyAicjQzIiwgNDMsIFJFRyB9LAotICB7ICJyNDQiLCA0NCwgUkVHIH0sIHsgInI0NSIsIDQ1LCBSRUcgfSwgeyAicjQ2IiwgNDYsIFJFRyB9LCB7ICJyNDciLCA0NywgUkVHIH0sCi0gIHsgInI0OCIsIDQ4LCBSRUcgfSwgeyAicjQ5IiwgNDksIFJFRyB9LCB7ICJyNTAiLCA1MCwgUkVHIH0sIHsgInI1MSIsIDUxLCBSRUcgfSwKLSAgeyAicjUyIiwgNTIsIFJFRyB9LCB7ICJyNTMiLCA1MywgUkVHIH0sIHsgInI1NCIsIDU0LCBSRUcgfSwgeyAicjU1IiwgNTUsIFJFRyB9LAotICB7ICJyNTYiLCA1NiwgUkVHIH0sIHsgInI1NyIsIDU3LCBSRUcgfSwgeyAicjU4IiwgNTgsIFJFRyB9LCB7ICJyNTkiLCA1OSwgUkVHIH0sCi0gIHsgImxwX2NvdW50IiwgNjAsIFJFRyB9LAotCi0gIC8qIEknZCBwcmVmZXIgdG8gb3V0cHV0IHRoZXNlIGFzICJmcCIgYW5kICJzcCIgYnkgZGVmYXVsdCwgYnV0IHdlIHN0aWxsIG5lZWQKLSAgICAgdG8gcmVjb2duaXplIHRoZSBjYW5vbmljYWwgdmFsdWVzLiAgKi8KLSAgeyAicjI3IiwgMjcsIFJFRyB9LCB7ICJyMjgiLCAyOCwgUkVHIH0sCi0KLSAgLyogU29tZW9uZSBtYXkgd2lzaCB0byByZWZlciB0byB0aGVzZSBpbiB0aGlzIHdheSwgYW5kIGl0J3MgcHJvYmFibHkgYQotICAgICBnb29kIGlkZWEgdG8gcmVzZXJ2ZSB0aGVtIGFzIHN1Y2ggYW55d2F5LiAgKi8KLSAgeyAicjI5IiwgMjksIFJFRyB9LCB7ICJyMzAiLCAzMCwgUkVHIH0sIHsgInIzMSIsIDMxLCBSRUcgfSwgeyAicjYwIiwgNjAsIFJFRyB9LAotCi0gIC8qIFN0YW5kYXJkIGF1eGlsaWFyeSByZWdpc3RlcnMuICAqLwotICB7ICJzdGF0dXMiLAkwLCBBVVhSRUcgfSwKLSAgeyAic2VtYXBob3JlIiwgMSwgQVVYUkVHIH0sCi0gIHsgImxwX3N0YXJ0IiwJMiwgQVVYUkVHIH0sCi0gIHsgImxwX2VuZCIsCTMsIEFVWFJFRyB9LAotICB7ICJpZGVudGl0eSIsCTQsIEFVWFJFRyB9LAotICB7ICJkZWJ1ZyIsCTUsIEFVWFJFRyB9LAotfTsKLWNvbnN0IGludCBhcmNfcmVnX25hbWVzX2NvdW50ID0gc2l6ZW9mIChhcmNfcmVnX25hbWVzKSAvIHNpemVvZiAoYXJjX3JlZ19uYW1lc1swXSk7Ci0KLS8qIFRoZSBzdWZmaXggdGFibGUuCi0gICBPcGVyYW5kcyB3aXRoIHRoZSBzYW1lIG5hbWUgbXVzdCBiZSBzdG9yZWQgdG9nZXRoZXIuICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3N1ZmZpeGVzW10gPQotewotICAvKiBFbnRyeSAwIGlzIHNwZWNpYWwsIGRlZmF1bHQgdmFsdWVzIGFyZW4ndCBwcmludGVkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICAqLwotICB7ICIiLCAwLCAtMSB9LAotICB7ICJhbCIsIDAsIENPTkQgfSwKLSAgeyAicmEiLCAwLCBDT05EIH0sCi0gIHsgImVxIiwgMSwgQ09ORCB9LAotICB7ICJ6IiwgMSwgQ09ORCB9LAotICB7ICJuZSIsIDIsIENPTkQgfSwKLSAgeyAibnoiLCAyLCBDT05EIH0sCi0gIHsgInAiLCAzLCBDT05EIH0sCi0gIHsgInBsIiwgMywgQ09ORCB9LAotICB7ICJuIiwgNCwgQ09ORCB9LAotICB7ICJtaSIsIDQsIENPTkQgfSwKLSAgeyAiYyIsIDUsIENPTkQgfSwKLSAgeyAiY3MiLCA1LCBDT05EIH0sCi0gIHsgImxvIiwgNSwgQ09ORCB9LAotICB7ICJuYyIsIDYsIENPTkQgfSwKLSAgeyAiY2MiLCA2LCBDT05EIH0sCi0gIHsgImhzIiwgNiwgQ09ORCB9LAotICB7ICJ2IiwgNywgQ09ORCB9LAotICB7ICJ2cyIsIDcsIENPTkQgfSwKLSAgeyAibnYiLCA4LCBDT05EIH0sCi0gIHsgInZjIiwgOCwgQ09ORCB9LAotICB7ICJndCIsIDksIENPTkQgfSwKLSAgeyAiZ2UiLCAxMCwgQ09ORCB9LAotICB7ICJsdCIsIDExLCBDT05EIH0sCi0gIHsgImxlIiwgMTIsIENPTkQgfSwKLSAgeyAiaGkiLCAxMywgQ09ORCB9LAotICB7ICJscyIsIDE0LCBDT05EIH0sCi0gIHsgInBueiIsIDE1LCBDT05EIH0sCi0gIHsgImYiLCAxLCBGTEFHIH0sCi0gIHsgIm5kIiwgQVJDX0RFTEFZX05PTkUsIERFTEFZIH0sCi0gIHsgImQiLCBBUkNfREVMQVlfTk9STUFMLCBERUxBWSB9LAotICB7ICJqZCIsIEFSQ19ERUxBWV9KVU1QLCBERUxBWSB9LAotLyp7ICJiIiwgNywgU0laRUVYVCB9LCovCi0vKnsgImIiLCA1LCBTSVpFU0VYIH0sKi8KLSAgeyAiYiIsIDEsIFNJWkUxIH0sCi0gIHsgImIiLCAxLCBTSVpFMTAgfSwKLSAgeyAiYiIsIDEsIFNJWkUyMiB9LAotLyp7ICJ3IiwgOCwgU0laRUVYVCB9LCovCi0vKnsgInciLCA2LCBTSVpFU0VYIH0sKi8KLSAgeyAidyIsIDIsIFNJWkUxIH0sCi0gIHsgInciLCAyLCBTSVpFMTAgfSwKLSAgeyAidyIsIDIsIFNJWkUyMiB9LAotICB7ICJ4IiwgMSwgU0lHTjAgfSwKLSAgeyAieCIsIDEsIFNJR045IH0sCi0gIHsgImEiLCAxLCBBRERSRVNTMyB9LAotICB7ICJhIiwgMSwgQUREUkVTUzEyIH0sCi0gIHsgImEiLCAxLCBBRERSRVNTMjQgfSwKLSAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzUgfSwKLSAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzE0IH0sCi0gIHsgImRpIiwgMSwgQ0FDSEVCWVBBU1MyNiB9LAotfTsKLWNvbnN0IGludCBhcmNfc3VmZml4ZXNfY291bnQgPSBzaXplb2YgKGFyY19zdWZmaXhlcykgLyBzaXplb2YgKGFyY19zdWZmaXhlc1swXSk7Ci0KLS8qIEluZGV4ZWQgYnkgZmlyc3QgbGV0dGVyIG9mIG9wY29kZS4gIFBvaW50cyB0byBjaGFpbiBvZiBvcGNvZGVzIHdpdGggc2FtZQotICAgZmlyc3QgbGV0dGVyLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlX21hcFsyNiArIDFdOwotCi0vKiBJbmRleGVkIGJ5IGluc24gY29kZS4gIFBvaW50cyB0byBjaGFpbiBvZiBvcGNvZGVzIHdpdGggc2FtZSBpbnNuIGNvZGUuICAqLwotc3RhdGljIHN0cnVjdCBhcmNfb3Bjb2RlICppY29kZV9tYXBbMzJdOwotDAotLyogQ29uZmlndXJhdGlvbiBmbGFncy4gICovCi0KLS8qIFZhcmlvdXMgQVJDX0hBVkVfWFhYIGJpdHMuICAqLwotc3RhdGljIGludCBjcHVfdHlwZTsKLQotLyogVHJhbnNsYXRlIGEgYmZkX21hY2hfYXJjX3h4eCB2YWx1ZSB0byBhIEFSQ19NQUNIX1hYWCB2YWx1ZS4gICovCi0KLWludAotYXJjX2dldF9vcGNvZGVfbWFjaCAoYmZkX21hY2gsIGJpZ19wKQotICAgICBpbnQgYmZkX21hY2gsIGJpZ19wOwotewotICBzdGF0aWMgaW50IG1hY2hfdHlwZV9tYXBbXSA9Ci0gICAgewotICAgICAgQVJDX01BQ0hfQkFTRQotICAgIH07Ci0KLSAgcmV0dXJuIG1hY2hfdHlwZV9tYXBbYmZkX21hY2hdIHwgKGJpZ19wID8gQVJDX01BQ0hfQklHIDogMCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW55IHRhYmxlcyB0aGF0IG5lZWQgaXQuCi0gICBNdXN0IGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0IHVwIChvciB3aGVuIGZpcnN0IG5lZWRlZCkuCi0KLSAgIEZMQUdTIGlzIGEgc2V0IG9mIGJpdHMgdGhhdCBzYXkgd2hhdCB2ZXJzaW9uIG9mIHRoZSBjcHUgd2UgaGF2ZSwKLSAgIGFuZCBpbiBwYXJ0aWN1bGFyIGF0IGxlYXN0IChvbmUgb2YpIEFSQ19NQUNIX1hYWC4gICovCi0KLXZvaWQKLWFyY19vcGNvZGVfaW5pdF90YWJsZXMgKGZsYWdzKQotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIHN0YXRpYyBpbnQgaW5pdF9wID0gMDsKLQotICBjcHVfdHlwZSA9IGZsYWdzOwotCi0gIC8qIFdlIG1heSBiZSBpbnRlbnRpb25hbGx5IGNhbGxlZCBtb3JlIHRoYW4gb25jZSAoZm9yIGV4YW1wbGUgZ2RiIHdpbGwgY2FsbAotICAgICB1cyBlYWNoIHRpbWUgdGhlIHVzZXIgc3dpdGNoZXMgY3B1KS4gIFRoZXNlIHRhYmxlcyBvbmx5IG5lZWQgdG8gYmUgaW5pdCdkCi0gICAgIG9uY2UgdGhvdWdoLiAgKi8KLSAgLyogPz8/IFdlIGNhbiByZW1vdmUgdGhlIG5lZWQgZm9yIGFyY19vcGNvZGVfc3VwcG9ydGVkIGJ5IHRha2luZyBpdCBpbnRvCi0gICAgIGFjY291bnQgaGVyZSwgYnV0IEknbSBub3Qgc3VyZSBJIHdhbnQgdG8gZG8gdGhhdCB5ZXQgKGlmIGV2ZXIpLiAgKi8KLSAgaWYgKCFpbml0X3ApCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGksbjsKLQotICAgICAgbWVtc2V0IChhcmNfb3BlcmFuZF9tYXAsIDAsIHNpemVvZiAoYXJjX29wZXJhbmRfbWFwKSk7Ci0gICAgICBuID0gc2l6ZW9mIChhcmNfb3BlcmFuZHMpIC8gc2l6ZW9mIChhcmNfb3BlcmFuZHNbMF0pOwotICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKLQlhcmNfb3BlcmFuZF9tYXBbYXJjX29wZXJhbmRzW2ldLmZtdF0gPSBpOwotCi0gICAgICBtZW1zZXQgKG9wY29kZV9tYXAsIDAsIHNpemVvZiAob3Bjb2RlX21hcCkpOwotICAgICAgbWVtc2V0IChpY29kZV9tYXAsIDAsIHNpemVvZiAoaWNvZGVfbWFwKSk7Ci0gICAgICAvKiBTY2FuIHRoZSB0YWJsZSBiYWNrd2FyZHMgc28gbWFjcm9zIGFwcGVhciBhdCB0aGUgZnJvbnQuICAqLwotICAgICAgZm9yIChpID0gYXJjX29wY29kZXNfY291bnQgLSAxOyBpID49IDA7IC0taSkKLQl7Ci0JICBpbnQgb3Bjb2RlX2hhc2ggPSBBUkNfSEFTSF9PUENPREUgKGFyY19vcGNvZGVzW2ldLnN5bnRheCk7Ci0JICBpbnQgaWNvZGVfaGFzaCA9IEFSQ19IQVNIX0lDT0RFIChhcmNfb3Bjb2Rlc1tpXS52YWx1ZSk7Ci0KLQkgIGFyY19vcGNvZGVzW2ldLm5leHRfYXNtID0gb3Bjb2RlX21hcFtvcGNvZGVfaGFzaF07Ci0JICBvcGNvZGVfbWFwW29wY29kZV9oYXNoXSA9ICZhcmNfb3Bjb2Rlc1tpXTsKLQotCSAgYXJjX29wY29kZXNbaV0ubmV4dF9kaXMgPSBpY29kZV9tYXBbaWNvZGVfaGFzaF07Ci0JICBpY29kZV9tYXBbaWNvZGVfaGFzaF0gPSAmYXJjX29wY29kZXNbaV07Ci0JfQotCi0gICAgICBpbml0X3AgPSAxOwotICAgIH0KLX0KLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIE9QQ09ERSBpcyBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmllZCBjcHUuCi0gICBDcHUgc2VsZWN0aW9uIGlzIG1hZGUgd2hlbiBjYWxsaW5nIGBhcmNfb3Bjb2RlX2luaXRfdGFibGVzJy4gICovCi0KLWludAotYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKm9wY29kZTsKLXsKLSAgaWYgKEFSQ19PUENPREVfQ1BVIChvcGNvZGUtPmZsYWdzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoQVJDX09QQ09ERV9DUFUgKG9wY29kZS0+ZmxhZ3MpICYgQVJDX0hBVkVfQ1BVIChjcHVfdHlwZSkpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgT1BWQUwgaXMgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpZWQgY3B1LgotICAgQ3B1IHNlbGVjdGlvbiBpcyBtYWRlIHdoZW4gY2FsbGluZyBgYXJjX29wY29kZV9pbml0X3RhYmxlcycuICAqLwotCi1pbnQKLWFyY19vcHZhbF9zdXBwb3J0ZWQgKG9wdmFsKQotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKm9wdmFsOwotewotICBpZiAoQVJDX09QVkFMX0NQVSAob3B2YWwtPmZsYWdzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoQVJDX09QVkFMX0NQVSAob3B2YWwtPmZsYWdzKSAmIEFSQ19IQVZFX0NQVSAoY3B1X3R5cGUpKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBpbnNuIGluIHRoZSBjaGFpbiBmb3IgYXNzZW1ibGluZyBJTlNOLiAgKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKgotYXJjX29wY29kZV9sb29rdXBfYXNtIChpbnNuKQotICAgICBjb25zdCBjaGFyICppbnNuOwotewotICByZXR1cm4gb3Bjb2RlX21hcFtBUkNfSEFTSF9PUENPREUgKGluc24pXTsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBpbnNuIGluIHRoZSBjaGFpbiBmb3IgZGlzYXNzZW1ibGluZyBJTlNOLiAgKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKgotYXJjX29wY29kZV9sb29rdXBfZGlzIChpbnNuKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLXsKLSAgcmV0dXJuIGljb2RlX21hcFtBUkNfSEFTSF9JQ09ERSAoaW5zbildOwotfQotDAotLyogTm9uemVybyBpZiB3ZSd2ZSBzZWVuIGFuICdmJyBzdWZmaXggKGluIGNlcnRhaW4gaW5zbnMpLiAgKi8KLXN0YXRpYyBpbnQgZmxhZ19wOwotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlICdmJyBzdWZmaXguICAqLwotc3RhdGljIGludCBmbGFnc2hpbW1faGFuZGxlZF9wOwotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIHNlZW4gYSAncScgc3VmZml4IChjb25kaXRpb24gY29kZSkuICAqLwotc3RhdGljIGludCBjb25kX3A7Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgaW5zZXJ0ZWQgYSBzaGltbS4gICovCi1zdGF0aWMgaW50IHNoaW1tX3A7Ci0KLS8qIFRoZSB2YWx1ZSBvZiB0aGUgc2hpbW0gd2UgaW5zZXJ0ZWQgKGVhY2ggaW5zbiBvbmx5IGdldHMgb25lIGJ1dCBpdCBjYW4KLSAgIGFwcGVhciBtdWx0aXBsZSB0aW1lcy4gICovCi1zdGF0aWMgaW50IHNoaW1tOwotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIGluc2VydGVkIGEgbGltbSAoZHVyaW5nIGFzc2VtYmx5KSBvciBzZWVuIGEgbGltbQotICAgKGR1cmluZyBkaXNhc3NlbWJseSkuICAqLwotc3RhdGljIGludCBsaW1tX3A7Ci0KLS8qIFRoZSB2YWx1ZSBvZiB0aGUgbGltbSB3ZSBpbnNlcnRlZC4gIEVhY2ggaW5zbiBvbmx5IGdldHMgb25lIGJ1dCBpdCBjYW4KLSAgIGFwcGVhciBtdWx0aXBsZSB0aW1lcy4gICovCi1zdGF0aWMgbG9uZyBsaW1tOwotDAotLyogSW5zZXJ0aW9uIGZ1bmN0aW9ucy4gICovCi0KLS8qIENhbGxlZCBieSB0aGUgYXNzZW1ibGVyIGJlZm9yZSBwYXJzaW5nIGFuIGluc3RydWN0aW9uLiAgKi8KLQotdm9pZAotYXJjX29wY29kZV9pbml0X2luc2VydCAoKQotewotICBmbGFnX3AgPSAwOwotICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMDsKLSAgY29uZF9wID0gMDsKLSAgc2hpbW1fcCA9IDA7Ci0gIGxpbW1fcCA9IDA7Ci19Ci0KLS8qIENhbGxlZCBieSB0aGUgYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGUgaW5zbiBoYXMgYSBsaW1tIG9wZXJhbmQuCi0gICBBbHNvIGNhbGxlZCBieSB0aGUgZGlzYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGUgaW5zbiBjb250YWlucyBhIGxpbW0uICAqLwotCi1pbnQKLWFyY19vcGNvZGVfbGltbV9wIChsaW1tcCkKLSAgICAgbG9uZyAqbGltbXA7Ci17Ci0gIGlmIChsaW1tcCkKLSAgICAqbGltbXAgPSBsaW1tOwotICByZXR1cm4gbGltbV9wOwotfQotCi0vKiBJbnNlcnQgYSB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXIgZmllbGQuCi0gICBJZiBSRUcgaXMgTlVMTCwgdGhlbiB0aGlzIGlzIGFjdHVhbGx5IGEgY29uc3RhbnQuCi0KLSAgIFdlIG11c3QgYWxzbyBoYW5kbGUgYXV4aWxpYXJ5IHJlZ2lzdGVycyBmb3IgbHIvc3IgaW5zbnMuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9yZWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOwotCi0gIGlmIChyZWcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgY29uc3RhbnQgdGhhdCBhbHNvIHJlcXVpcmVzIGEgdmFsdWUgc3RvcmVkIGluIGEgcmVnaXN0ZXIKLQkgZmllbGQuICBIYW5kbGUgdGhlc2UgYnkgdXBkYXRpbmcgdGhlIHJlZ2lzdGVyIGZpZWxkIGFuZCBzYXZpbmcgdGhlCi0JIHZhbHVlIGZvciBsYXRlciBoYW5kbGluZyBieSBlaXRoZXIgJVMgKHNoaW1tKSBvciAlTCAobGltbSkuICAqLwotCi0gICAgICAvKiBUcnkgdG8gdXNlIGEgc2hpbW0gdmFsdWUgYmVmb3JlIGEgbGltbSBvbmUuICAqLwotICAgICAgaWYgKEFSQ19TSElNTV9DT05TVF9QICh2YWx1ZSkKLQkgIC8qIElmIHdlJ3ZlIHNlZW4gYSBjb25kaXRpb25hbCBzdWZmaXggd2UgaGF2ZSB0byB1c2UgYSBsaW1tLiAgKi8KLQkgICYmICFjb25kX3AKLQkgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBhIHNoaW1tIHZhbHVlIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4gb3VycwotCSAgICAgd2UgaGF2ZSB0byB1c2UgYSBsaW1tLiAgKi8KLQkgICYmICghc2hpbW1fcCB8fCBzaGltbSA9PSB2YWx1ZSkpCi0JewotCSAgaW50IG1hcmtlciA9IGZsYWdfcCA/IEFSQ19SRUdfU0hJTU1fVVBEQVRFIDogQVJDX1JFR19TSElNTTsKLQkgIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAxOwotCSAgc2hpbW1fcCA9IDE7Ci0JICBzaGltbSA9IHZhbHVlOwotCSAgaW5zbiB8PSBtYXJrZXIgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0JICAvKiBpbnNuIHw9IHZhbHVlICYgNTExOyAtIGRvbmUgbGF0ZXIgKi8KLQl9Ci0gICAgICAvKiBXZSBoYXZlIHRvIHVzZSBhIGxpbW0uICBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gb25lIHRoZXkgbXVzdCBtYXRjaC4gICovCi0gICAgICBlbHNlIGlmICghbGltbV9wIHx8IGxpbW0gPT0gdmFsdWUpCi0JewotCSAgbGltbV9wID0gMTsKLQkgIGxpbW0gPSB2YWx1ZTsKLQkgIGluc24gfD0gQVJDX1JFR19MSU1NIDw8IG9wZXJhbmQtPnNoaWZ0OwotCSAgLyogVGhlIGNvbnN0YW50IGlzIHN0b3JlZCBsYXRlci4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgICplcnJtc2cgPSBfKCJ1bmFibGUgdG8gZml0IGRpZmZlcmVudCB2YWx1ZWQgY29uc3RhbnRzIGludG8gaW5zdHJ1Y3Rpb24iKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBoYW5kbGUgYm90aCBub3JtYWwgYW5kIGF1eGlsaWFyeSByZWdpc3RlcnMuICAqLwotCi0gICAgICBpZiAocmVnLT50eXBlID09IEFVWFJFRykKLQl7Ci0JICBpZiAoIShtb2RzICYgQVJDX01PRF9BVVhSRUcpKQotCSAgICAqZXJybXNnID0gXygiYXV4aWxpYXJ5IHJlZ2lzdGVyIG5vdCBhbGxvd2VkIGhlcmUiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc24gfD0gQVJDX1JFR19TSElNTSA8PCBvcGVyYW5kLT5zaGlmdDsKLQkgICAgICBpbnNuIHw9IHJlZy0+dmFsdWUgPDwgYXJjX29wZXJhbmRzW3JlZy0+dHlwZV0uc2hpZnQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBhbiBpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciBoZXJlLiAgKi8KLQkgIGlmICgodW5zaWduZWQgaW50KSByZWctPnZhbHVlID4gNjApCi0JICAgIHsKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIHNwcmludGYgKGJ1ZiwgXygiaW52YWxpZCByZWdpc3RlciBudW1iZXIgYCVkJyIpLCByZWctPnZhbHVlKTsKLQkgICAgICAqZXJybXNnID0gYnVmOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGluc24gfD0gcmVnLT52YWx1ZSA8PCBvcGVyYW5kLT5zaGlmdDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgd2hlbiB3ZSBzZWUgYW4gJ2YnIGZsYWcuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9mbGFnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICAvKiBXZSBjYW4ndCBzdG9yZSBhbnl0aGluZyBpbiB0aGUgaW5zbiB1bnRpbCB3ZSd2ZSBwYXJzZWQgdGhlIHJlZ2lzdGVycy4KLSAgICAgSnVzdCByZWNvcmQgdGhlIGZhY3QgdGhhdCB3ZSd2ZSBnb3QgdGhpcyBmbGFnLiAgYGluc2VydF9yZWcnIHdpbGwgdXNlIGl0Ci0gICAgIHRvIHN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlIChBUkNfUkVHX1NISU1NX1VQREFURSBvciBiaXQgMHgxMDApLiAgKi8KLSAgZmxhZ19wID0gMTsKLQotICByZXR1cm4gaW5zbjsKLX0KLQotLyogQ2FsbGVkIGFmdGVyIGNvbXBsZXRlbHkgYnVpbGRpbmcgYW4gaW5zbiB0byBlbnN1cmUgdGhlICdmJyBmbGFnIGdldHMgc2V0Ci0gICBwcm9wZXJseS4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gc2V0IHRoaXMgZmxhZyB1bnRpbAotICAgd2UndmUgcGFyc2VkIHRoZSByZWdpc3RlcnMuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9mbGFnZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZmxhZ19wICYmICFmbGFnc2hpbW1faGFuZGxlZF9wKQotICAgIHsKLSAgICAgIGlmIChzaGltbV9wKQotCWFib3J0ICgpOwotICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0gICAgICBpbnNuIHw9ICgxIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgd2hlbiB3ZSBzZWUgYSBjb25kaXRpb25hbCBmbGFnIChlZzogLmVxKS4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2NvbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGNvbmRfcCA9IDE7Ci0gIGluc24gfD0gKHZhbHVlICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogVXNlZCBpbiB0aGUgImoiIGluc3RydWN0aW9uIHRvIHByZXZlbnQgY29uc3RhbnRzIGZyb20gYmVpbmcgaW50ZXJwcmV0ZWQgYXMKLSAgIHNoaW1tIHZhbHVlcyAod2hpY2ggdGhlIGp1bXAgaW5zbiBkb2Vzbid0IGFjY2VwdCkuICBUaGlzIGNhbiBhbHNvIGJlIHVzZWQKLSAgIHRvIGZvcmNlIHRoZSB1c2Ugb2YgbGltbSB2YWx1ZXMgaW4gb3RoZXIgc2l0dWF0aW9ucyAoZWc6IGxkIHIwLFtmb29dIHVzZXMKLSAgIHRoaXMpLgotICAgPz8/IFRoZSBtZWNoYW5pc20gaXMgc291bmQuICBBY2Nlc3MgdG8gaXQgaXMgYSBiaXQga2x1bmt5IHJpZ2h0IG5vdy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2ZvcmNlbGltbSAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uZF9wID0gMTsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIFVzZWQgaW4gbGQvc3QgaW5zbnMgdG8gaGFuZGxlIHRoZSBzaGltbSBvZmZzZXQgZmllbGQuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9zaGltbW9mZnNldCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgbG9uZyBtaW52YWwsIG1heHZhbDsKLSAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgaWYgKHJlZyAhPSBOVUxMKQotICAgIHsKLSAgICAgICplcnJtc2cgPSAicmVnaXN0ZXIgYXBwZWFycyB3aGVyZSBzaGltbSB2YWx1ZSBleHBlY3RlZCI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyAqd2F5KiBtb3JlIGdlbmVyYWwgdGhhbiBuZWNlc3NhcnksIGJ1dCBtYXliZSBzb21lIGRheSBpdCdsbAotCSBiZSB1c2VmdWwuICAqLwotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCXsKLQkgIG1pbnZhbCA9IC0oMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQkgIG1heHZhbCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWludmFsID0gMDsKLQkgIG1heHZhbCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQl9Ci0gICAgICBpZiAodmFsdWUgPCBtaW52YWwgfHwgdmFsdWUgPiBtYXh2YWwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIHNwcmludGYgKGJ1ZiwgXygidmFsdWUgd29uJ3QgZml0IGluIHJhbmdlICVsZCAtICVsZCIpLAotCQkgICBtaW52YWwsIG1heHZhbCk7Ci0JICAqZXJybXNnID0gYnVmOwotCX0KLSAgICAgIGVsc2UKLQlpbnNuIHw9ICh2YWx1ZSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBVc2VkIGluIGxkL3N0IGluc25zIHdoZW4gdGhlIHNoaW1tIG9mZnNldCBpcyAwLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfc2hpbW16ZXJvIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBzaGltbV9wID0gMTsKLSAgc2hpbW0gPSAwOwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBub3JtYWwgaW5zbnMgKGVnOiBhZGQpIHRvIGluc2VydCBhIHNoaW1tCi0gICB2YWx1ZSAoaWYgcHJlc2VudCkgaW50byB0aGUgaW5zbi4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3NoaW1tZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoc2hpbW1fcCkKLSAgICBpbnNuIHw9IChzaGltbSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIHByb2Nlc3Npbmcgbm9ybWFsIGluc25zIChlZzogYWRkKSB0byBpbnNlcnQgYSBsaW1tCi0gICB2YWx1ZSAoaWYgcHJlc2VudCkgaW50byB0aGUgaW5zbi4KLQotICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCB0byBoYW5kbGUgaW5zdHJ1Y3Rpb25zICh3aXRoIDQgYnl0ZQotICAgaW1tZWRpYXRlIG9wZXJhbmRzKS4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBoYW5kbGUgZGF0YS4gICovCi0KLS8qID8/PyBBY3R1YWxseSwgdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byBkbyBhcyB3ZSBjYW4ndCBjYWxsIGZyYWdfbW9yZSwgdGhlCi0gICBjYWxsZXIgbXVzdCBkbyB0aGF0LiAgVGhlIGV4dHJhY3QgZm5zIHRha2UgYSBwb2ludGVyIHRvIHR3byB3b3Jkcy4gIFRoZQotICAgaW5zZXJ0IGZucyBjb3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHRoZW4gd2UgY291bGQgZG8gc29tZXRoaW5nIHVzZWZ1bCwgYnV0Ci0gICB0aGVuIHRoZSByZWxvYyBoYW5kbGVycyB3b3VsZCBoYXZlIHRvIGtub3cgdG8gd29yayBvbiB0aGUgc2Vjb25kIHdvcmQgb2YKLSAgIGEgMiB3b3JkIHF1YW50aXR5LiAgVGhhdCdzIHRvbyBtdWNoIHNvIHdlIGRvbid0IGhhbmRsZSB0aGVtLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfbGltbWZpbmlzaCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGxpbW1fcCkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8sIGdhcyBkb2VzIGl0ICovCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB1bmFyeSBvcGVyYW5kIG1hY3JvcyB0byBjb3B5IHRoZSBCIGZpZWxkIHRvIEMuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF91bm9wbWFjcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGluc24gfD0gKChpbnNuID4+IEFSQ19TSElGVF9SRUdCKSAmIEFSQ19NQVNLX1JFRykgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBJbnNlcnQgYSByZWxhdGl2ZSBhZGRyZXNzIGZvciBhIGJyYW5jaCBpbnNuIChiLCBibCwgb3IgbHApLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfcmVsYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlICYgMykKLSAgICAqZXJybXNnID0gXygiYnJhbmNoIGFkZHJlc3Mgbm90IG9uIDQgYnl0ZSBib3VuZGFyeSIpOwotICBpbnNuIHw9ICgodmFsdWUgPj4gMikgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBJbnNlcnQgYSBsaW1tIHZhbHVlIGFzIGEgMjYgYml0IGFkZHJlc3MgcmlnaHQgc2hpZnRlZCAyIGludG8gdGhlIGluc24uCi0KLSAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgaW50ZW5kZWQgdG8gaGFuZGxlIGluc3RydWN0aW9ucyAod2l0aCA0IGJ5dGUKLSAgIGltbWVkaWF0ZSBvcGVyYW5kcykuICBJdCBpcyBub3QgaW50ZW5kZWQgdG8gaGFuZGxlIGRhdGEuICAqLwotCi0vKiA/Pz8gQWN0dWFsbHksIHRoZXJlJ3Mgbm90aGluZyBmb3IgdXMgdG8gZG8gYXMgd2UgY2FuJ3QgY2FsbCBmcmFnX21vcmUsIHRoZQotICAgY2FsbGVyIG11c3QgZG8gdGhhdC4gIFRoZSBleHRyYWN0IGZucyB0YWtlIGEgcG9pbnRlciB0byB0d28gd29yZHMuICBUaGUKLSAgIGluc2VydCBmbnMgY291bGQgYmUgY29udmVydGVkIGFuZCB0aGVuIHdlIGNvdWxkIGRvIHNvbWV0aGluZyB1c2VmdWwsIGJ1dAotICAgdGhlbiB0aGUgcmVsb2MgaGFuZGxlcnMgd291bGQgaGF2ZSB0byBrbm93IHRvIHdvcmsgb24gdGhlIHNlY29uZCB3b3JkIG9mCi0gICBhIDIgd29yZCBxdWFudGl0eS4gIFRoYXQncyB0b28gbXVjaCBzbyB3ZSBkb24ndCBoYW5kbGUgdGhlbS4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2Fic2FkZHIgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChsaW1tX3ApCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIHJldHVybiBpbnNuOwotfQotDAotLyogRXh0cmFjdGlvbiBmdW5jdGlvbnMuCi0KLSAgIFRoZSBzdWZmaXggZXh0cmFjdGlvbiBmdW5jdGlvbnMnIHJldHVybiB2YWx1ZSBpcyByZWR1bmRhbnQgc2luY2UgaXQgY2FuIGJlCi0gICBvYnRhaW5lZCBmcm9tICgqT1BWQUwpLT52YWx1ZS4gIEhvd2V2ZXIsIHRoZSBib29sZWFuIHN1ZmZpeGVzIGRvbid0IGhhdmUKLSAgIGEgc3VmZml4IHRhYmxlIGVudHJ5IGZvciB0aGUgImZhbHNlIiBjYXNlLCBzbyB2YWx1ZXMgb2YgemVybyBtdXN0IGJlCi0gICBvYnRhaW5lZCBmcm9tIHRoZSByZXR1cm4gdmFsdWUgKCpPUFZBTCA9PSBOVUxMKS4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKmxvb2t1cF9yZWdpc3RlciAoaW50IHR5cGUsIGxvbmcgcmVnbm8pOwotCi0vKiBDYWxsZWQgYnkgdGhlIGRpc2Fzc2VtYmxlciBiZWZvcmUgcHJpbnRpbmcgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi12b2lkCi1hcmNfb3Bjb2RlX2luaXRfZXh0cmFjdCAoKQotewotICBmbGFnX3AgPSAwOwotICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMDsKLSAgc2hpbW1fcCA9IDA7Ci0gIGxpbW1fcCA9IDA7Ci19Ci0KLS8qIEFzIHdlJ3JlIGV4dHJhY3RpbmcgcmVnaXN0ZXJzLCBrZWVwIGFuIGV5ZSBvdXQgZm9yIHRoZSAnZicgaW5kaWNhdG9yCi0gICAoQVJDX1JFR19TSElNTV9VUERBVEUpLiAgSWYgd2UgZmluZCBhIHJlZ2lzdGVyIChub3QgYSBjb25zdGFudCBtYXJrZXIsCi0gICBsaWtlIEFSQ19SRUdfU0hJTU0pLCBzZXQgT1BWQUwgc28gb3VyIGNhbGxlciB3aWxsIGtub3cgdGhpcyBpcyBhIHJlZ2lzdGVyLgotCi0gICBXZSBtdXN0IGFsc28gaGFuZGxlIGF1eGlsaWFyeSByZWdpc3RlcnMgZm9yIGxyL3NyIGluc25zLiAgVGhleSBhcmUganVzdAotICAgY29uc3RhbnRzIHdpdGggc3BlY2lhbCBuYW1lcy4gICovCi0KLXN0YXRpYyBsb25nCi1leHRyYWN0X3JlZyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgb3B2YWwsIGludmFsaWQpCi0gICAgIGFyY19pbnNuICppbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbDsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpbnQgcmVnbm87Ci0gIGxvbmcgdmFsdWU7Ci0KLSAgLyogR2V0IHRoZSByZWdpc3RlciBudW1iZXIuICAqLwotICByZWdubyA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCi0gIC8qIElzIGl0IGEgY29uc3RhbnQgbWFya2VyPyAgKi8KLSAgaWYgKHJlZ25vID09IEFSQ19SRUdfU0hJTU0pCi0gICAgewotICAgICAgdmFsdWUgPSBpbnNuWzBdICYgNTExOwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05FRCkKLQkgICYmICh2YWx1ZSAmIDI1NikpCi0JdmFsdWUgLT0gNTEyOwotICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA9PSBBUkNfUkVHX1NISU1NX1VQREFURSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGluc25bMF0gJiA1MTE7Ci0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgMjU2KSkKLQl2YWx1ZSAtPSA1MTI7Ci0gICAgICBmbGFnX3AgPSAxOwotICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA9PSBBUkNfUkVHX0xJTU0pCi0gICAgewotICAgICAgdmFsdWUgPSBpbnNuWzFdOwotICAgICAgbGltbV9wID0gMTsKLSAgICB9Ci0gIC8qIEl0J3MgYSByZWdpc3Rlciwgc2V0IE9QVkFMICh0aGF0J3MgdGhlIG9ubHkgd2F5IHdlIGRpc3Rpbmd1aXNoIHJlZ2lzdGVycwotICAgICBmcm9tIGNvbnN0YW50cyBoZXJlKS4gICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZyA9IGxvb2t1cF9yZWdpc3RlciAoUkVHLCByZWdubyk7Ci0KLSAgICAgIGlmIChyZWcgPT0gTlVMTCkKLQlhYm9ydCAoKTsKLSAgICAgIGlmIChvcHZhbCAhPSBOVUxMKQotCSpvcHZhbCA9IHJlZzsKLSAgICAgIHZhbHVlID0gcmVnbm87Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgZmllbGQgdGFrZXMgYW4gYXV4aWxpYXJ5IHJlZ2lzdGVyLCBzZWUgaWYgaXQncyBhIGtub3duIG9uZS4gICovCi0gIGlmICgobW9kcyAmIEFSQ19NT0RfQVVYUkVHKQotICAgICAgJiYgQVJDX1JFR19DT05TVEFOVF9QIChyZWdubykpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWcgPSBsb29rdXBfcmVnaXN0ZXIgKEFVWFJFRywgdmFsdWUpOwotCi0gICAgICAvKiBUaGlzIGlzIHJlYWxseSBhIGNvbnN0YW50LCBidXQgdGVsbCB0aGUgY2FsbGVyIGl0IGhhcyBhIHNwZWNpYWwKLQkgbmFtZS4gICovCi0gICAgICBpZiAocmVnICE9IE5VTEwgJiYgb3B2YWwgIT0gTlVMTCkKLQkqb3B2YWwgPSByZWc7Ci0gICAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgImZsYWcgdXBkYXRlIiBmaWVsZCBmb3Igc2hpbW0gaW5zbnMuCi0gICBUaGlzIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgZmllbGQuICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9mbGFnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGludCBmOwotICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnZhbDsKLQotICBpZiAoZmxhZ3NoaW1tX2hhbmRsZWRfcCkKLSAgICBmID0gZmxhZ19wICE9IDA7Ci0gIGVsc2UKLSAgICBmID0gKGluc25bMF0gJiAoMSA8PCBvcGVyYW5kLT5zaGlmdCkpICE9IDA7Ci0KLSAgLyogVGhlcmUgaXMgbm8gdGV4dCBmb3IgemVybyB2YWx1ZXMuICAqLwotICBpZiAoZiA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgMSk7Ci0gIGlmIChvcHZhbCAhPSBOVUxMICYmIHZhbCAhPSBOVUxMKQotICAgICpvcHZhbCA9IHZhbDsKLSAgcmV0dXJuIHZhbC0+dmFsdWU7Ci19Ci0KLS8qIEV4dHJhY3QgdGhlIGNvbmRpdGlvbiBjb2RlIChpZiBpdCBleGlzdHMpLgotICAgSWYgd2UndmUgc2VlbiBhIHNoaW1tIHZhbHVlIGluIHRoaXMgaW5zbiAobWVhbmluZyB0aGF0IHRoZSBpbnNuIGNhbid0IGhhdmUKLSAgIGEgY29uZGl0aW9uIGNvZGUgZmllbGQpLCB0aGVuIHdlIGRvbid0IHN0b3JlIGFueXRoaW5nIGluIE9QVkFMIGFuZCByZXR1cm4KLSAgIHplcm8uICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9jb25kIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgY29uZDsKLSAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICp2YWw7Ci0KLSAgaWYgKGZsYWdzaGltbV9oYW5kbGVkX3ApCi0gICAgcmV0dXJuIDA7Ci0KLSAgY29uZCA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotICB2YWwgPSBhcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggKG9wZXJhbmQsIGNvbmQpOwotCi0gIC8qIElnbm9yZSBOVUxMIHZhbHVlcyBvZiBgdmFsJy4gIFNldmVyYWwgY29uZGl0aW9uIGNvZGUgdmFsdWVzIGFyZQotICAgICByZXNlcnZlZCBmb3IgZXh0ZW5zaW9ucy4gICovCi0gIGlmIChvcHZhbCAhPSBOVUxMICYmIHZhbCAhPSBOVUxMKQotICAgICpvcHZhbCA9IHZhbDsKLSAgcmV0dXJuIGNvbmQ7Ci19Ci0KLS8qIEV4dHJhY3QgYSBicmFuY2ggYWRkcmVzcy4KLSAgIFdlIHJldHVybiB0aGUgdmFsdWUgYXMgYSByZWFsIGFkZHJlc3MgKG5vdCByaWdodCBzaGlmdGVkIGJ5IDIpLiAgKi8KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcmVsYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgb3B2YWwsIGludmFsaWQpCi0gICAgIGFyY19pbnNuICppbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbDsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIGFkZHI7Ci0KLSAgYWRkciA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotICAgICAgJiYgKGFkZHIgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkpCi0gICAgYWRkciAtPSAxIDw8IG9wZXJhbmQtPmJpdHM7Ci0KLSAgcmV0dXJuIGFkZHIgPDwgMjsKLX0KLQotLyogVGhlIG9ubHkgdGhpbmcgdGhpcyBkb2VzIGlzIHNldCB0aGUgYGludmFsaWQnIGZsYWcgaWYgQiAhPSBDLgotICAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgIm1vdiIgbWFjcm8gYXBwZWFycyBiZWZvcmUgaXQncyByZWFsIGluc24gImFuZCIKLSAgIGFuZCB3ZSBkb24ndCB3YW50IHRoZSBkaXNhc3NlbWJsZXIgdG8gY29uZnVzZSB0aGVtLiAgKi8KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfdW5vcG1hY3JvIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIC8qIFRoaXMgbWlzc2VzIHRoZSBjYXNlIHdoZXJlIEIgPT0gQVJDX1JFR19TSElNTV9VUERBVEUgJiYKLSAgICAgQyA9PSBBUkNfUkVHX1NISU1NIChvciB2aWNlIHZlcnNhKS4gIE5vIGJpZyBkZWFsLiAgVGhvc2UgaW5zbnMgd2lsbCBnZXQKLSAgICAgcHJpbnRlZCBhcyAiYW5kInMuICAqLwotICBpZiAoKChpbnNuWzBdID4+IEFSQ19TSElGVF9SRUdCKSAmIEFSQ19NQVNLX1JFRykKLSAgICAgICE9ICgoaW5zblswXSA+PiBBUkNfU0hJRlRfUkVHQykgJiBBUkNfTUFTS19SRUcpKQotICAgIGlmIChpbnZhbGlkICE9IE5VTEwpCi0gICAgICAqaW52YWxpZCA9IDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFV0aWxpdHkgZm9yIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9ucyB0byByZXR1cm4gdGhlIGluZGV4IGludG8KLSAgIGBhcmNfc3VmZml4ZXMnLiAgKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoKLWFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAodHlwZSwgdmFsdWUpCi0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqdHlwZTsKLSAgICAgaW50IHZhbHVlOwotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnYsKmVuZDsKLQotICAvKiA/Pz8gVGhpcyBpcyBhIGxpdHRsZSBzbG93IGFuZCBjYW4gYmUgc3BlZWRlZCB1cC4gICovCi0KLSAgZm9yICh2ID0gYXJjX3N1ZmZpeGVzLCBlbmQgPSBhcmNfc3VmZml4ZXMgKyBhcmNfc3VmZml4ZXNfY291bnQ7IHYgPCBlbmQ7ICsrdikKLSAgICBpZiAodHlwZSA9PSAmYXJjX29wZXJhbmRzW3YtPnR5cGVdCi0JJiYgdmFsdWUgPT0gdi0+dmFsdWUpCi0gICAgICByZXR1cm4gdjsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKgotbG9va3VwX3JlZ2lzdGVyICh0eXBlLCByZWdubykKLSAgICAgaW50IHR5cGU7Ci0gICAgIGxvbmcgcmVnbm87Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqciwqZW5kOwotCi0gIGlmICh0eXBlID09IFJFRykKLSAgICByZXR1cm4gJmFyY19yZWdfbmFtZXNbcmVnbm9dOwotCi0gIC8qID8/PyBUaGlzIGlzIGEgbGl0dGxlIHNsb3cgYW5kIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KLQotICBmb3IgKHIgPSBhcmNfcmVnX25hbWVzLCBlbmQgPSBhcmNfcmVnX25hbWVzICsgYXJjX3JlZ19uYW1lc19jb3VudDsKLSAgICAgICByIDwgZW5kOyArK3IpCi0gICAgaWYgKHR5cGUgPT0gci0+dHlwZQkmJiByZWdubyA9PSByLT52YWx1ZSkKLSAgICAgIHJldHVybiByOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXJtLWRpcy5jIGIvb3Bjb2Rlcy9hcm0tZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzFhZGEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcm0tZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY1ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIHByaW50aW5nIGNvZGUgZm9yIHRoZSBBUk0KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0gICBNb2RpZmljYXRpb24gYnkgSmFtZXMgRy4gU21pdGggKGpzbWl0aEBjeWdudXMuY28udWspCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYm9wY29kZXMuIAotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgotdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLiAKLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi1BTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLW1vcmUgZGV0YWlscy4gCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgImFybS1vcGMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgZG9uZSBoZXJlICovCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImVsZi9hcm0uaCIKLQotI2lmbmRlZiBzdHJlcQotI2RlZmluZSBzdHJlcShhLGIpCShzdHJjbXAgKChhKSwgKGIpKSA9PSAwKQotI2VuZGlmCi0KLSNpZm5kZWYgc3RybmVxCi0jZGVmaW5lIHN0cm5lcShhLGIsbikJKHN0cm5jbXAgKChhKSwgKGIpLCAobikpID09IDApCi0jZW5kaWYKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAgICAgKHNpemVvZiAoYSkgLyBzaXplb2YgKGEpWzBdKQotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICogYXJtX2NvbmRpdGlvbmFsW10gPQoteyJlcSIsICJuZSIsICJjcyIsICJjYyIsICJtaSIsICJwbCIsICJ2cyIsICJ2YyIsCi0gImhpIiwgImxzIiwgImdlIiwgImx0IiwgImd0IiwgImxlIiwgIiIsICJudiJ9OwotCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBjaGFyICogbmFtZTsKLSAgY29uc3QgY2hhciAqIGRlc2NyaXB0aW9uOwotICBjb25zdCBjaGFyICogcmVnX25hbWVzWzE2XTsKLX0KLWFybV9yZWduYW1lOwotCi1zdGF0aWMgYXJtX3JlZ25hbWUgcmVnbmFtZXNbXSA9Ci17Ci0gIHsgInJhdyIgLCAiU2VsZWN0IHJhdyByZWdpc3RlciBuYW1lcyIsCi0gICAgeyAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUifX0sCi0gIHsgInN0ZCIsICAiU2VsZWN0IHJlZ2lzdGVyIG5hbWVzIHVzZWQgaW4gQVJNJ3MgSVNBIGRvY3VtZW50YXRpb24iLAotICAgIHsgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwgInI4IiwgInI5IiwgInIxMCIsICJyMTEiLCAicjEyIiwgInNwIiwgICJsciIsICAicGMiIH19LAotICB7ICJhcGNzIiwgIlNlbGVjdCByZWdpc3RlciBuYW1lcyB1c2VkIGluIHRoZSBBUENTIiwKLSAgICB7ICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJ2MSIsICJ2MiIsICJ2MyIsICJ2NCIsICJ2NSIsICJ2NiIsICJzbCIsICAiZnAiLCAgImlwIiwgICJzcCIsICAibHIiLCAgInBjIiB9fSwKLSAgeyAiYXRwY3MiLCAiU2VsZWN0IHJlZ2lzdGVyIG5hbWVzIHVzZWQgaW4gdGhlIEFUUENTIiwKLSAgICB7ICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJ2MSIsICJ2MiIsICJ2MyIsICJ2NCIsICJ2NSIsICJ2NiIsICJ2NyIsICAidjgiLCAgIklQIiwgICJTUCIsICAiTFIiLCAgIlBDIiB9fSwKLSAgeyAic3BlY2lhbC1hdHBjcyIsICJTZWxlY3Qgc3BlY2lhbCByZWdpc3RlciBuYW1lcyB1c2VkIGluIHRoZSBBVFBDUyIsCi0gICAgeyAiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAidjEiLCAidjIiLCAidjMiLCAiV1IiLCAidjUiLCAiU0IiLCAiU0wiLCAgIkZQIiwgICJJUCIsICAiU1AiLCAgIkxSIiwgICJQQyIgfX0KLX07Ci0KLS8qIERlZmF1bHQgdG8gc3RhbmRhcmQgcmVnaXN0ZXIgbmFtZSBzZXQuICAqLwotc3RhdGljIHVuc2lnbmVkIGludCByZWduYW1lX3NlbGVjdGVkID0gMTsKLQotI2RlZmluZSBOVU1fQVJNX1JFR05BTUVTICBOVU1fRUxFTSAocmVnbmFtZXMpCi0jZGVmaW5lIGFybV9yZWduYW1lcyAgICAgIHJlZ25hbWVzW3JlZ25hbWVfc2VsZWN0ZWRdLnJlZ19uYW1lcwotCi1zdGF0aWMgYm9vbGVhbiBmb3JjZV90aHVtYiA9IGZhbHNlOwotCi1zdGF0aWMgY2hhciAqIGFybV9mcF9jb25zdFtdID0KLXsiMC4wIiwgIjEuMCIsICIyLjAiLCAiMy4wIiwgIjQuMCIsICI1LjAiLCAiMC41IiwgIjEwLjAifTsKLQotc3RhdGljIGNoYXIgKiBhcm1fc2hpZnRbXSA9IAoteyJsc2wiLCAibHNyIiwgImFzciIsICJyb3IifTsKLQwKLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAgKi8KLXN0YXRpYyB2b2lkIGFybV9kZWNvZGVfc2hpZnQgUEFSQU1TICgobG9uZywgZnByaW50Zl9mdHlwZSwgdm9pZCAqKSk7Ci1zdGF0aWMgaW50ICBwcmludF9pbnNuX2FybSAgIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyBpbnQgIHByaW50X2luc25fdGh1bWIgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotc3RhdGljIHZvaWQgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50ICBwcmludF9pbnNuICAgICAgIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJvb2xlYW4pKTsKLWludCBnZXRfYXJtX3JlZ25hbWVfbnVtX29wdGlvbnMgKHZvaWQpOwotaW50IHNldF9hcm1fcmVnbmFtZV9vcHRpb24gKGludCBvcHRpb24pOwotaW50IGdldF9hcm1fcmVnbmFtZXMgKGludCBvcHRpb24sIGNvbnN0IGNoYXIgKipzZXRuYW1lLAotCQkgICAgICBjb25zdCBjaGFyICoqc2V0ZGVzY3JpcHRpb24sCi0JCSAgICAgIGNvbnN0IGNoYXIgKioqcmVnaXN0ZXJfbmFtZXMpOwotDAotLyogRnVuY3Rpb25zLiAqLwotaW50Ci1nZXRfYXJtX3JlZ25hbWVfbnVtX29wdGlvbnMgKHZvaWQpCi17Ci0gIHJldHVybiBOVU1fQVJNX1JFR05BTUVTOwotfQotCi1pbnQKLXNldF9hcm1fcmVnbmFtZV9vcHRpb24gKGludCBvcHRpb24pCi17Ci0gIGludCBvbGQgPSByZWduYW1lX3NlbGVjdGVkOwotICByZWduYW1lX3NlbGVjdGVkID0gb3B0aW9uOwotICByZXR1cm4gb2xkOwotfQotCi1pbnQKLWdldF9hcm1fcmVnbmFtZXMgKGludCBvcHRpb24sIGNvbnN0IGNoYXIgKipzZXRuYW1lLAotCQkgIGNvbnN0IGNoYXIgKipzZXRkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKioqcmVnaXN0ZXJfbmFtZXMpCi17Ci0gICpzZXRuYW1lID0gcmVnbmFtZXNbb3B0aW9uXS5uYW1lOwotICAqc2V0ZGVzY3JpcHRpb24gPSByZWduYW1lc1tvcHRpb25dLmRlc2NyaXB0aW9uOwotICAqcmVnaXN0ZXJfbmFtZXMgPSByZWduYW1lc1tvcHRpb25dLnJlZ19uYW1lczsKLSAgcmV0dXJuIDE2OwotfQotCi1zdGF0aWMgdm9pZAotYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSkKLSAgICAgbG9uZyBnaXZlbjsKLSAgICAgZnByaW50Zl9mdHlwZSBmdW5jOwotICAgICB2b2lkICogc3RyZWFtOwotewotICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOwotICAKLSAgaWYgKChnaXZlbiAmIDB4ZmYwKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiAweDEwKSA9PSAwKQotCXsKLQkgIGludCBhbW91bnQgPSAoZ2l2ZW4gJiAweGY4MCkgPj4gNzsKLQkgIGludCBzaGlmdCA9IChnaXZlbiAmIDB4NjApID4+IDU7Ci0JICAKLQkgIGlmIChhbW91bnQgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzaGlmdCA9PSAzKQotCQl7Ci0JCSAgZnVuYyAoc3RyZWFtLCAiLCBycngiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICAKLQkgICAgICBhbW91bnQgPSAzMjsKLQkgICAgfQotCSAgCi0JICBmdW5jIChzdHJlYW0sICIsICVzICMlZCIsIGFybV9zaGlmdFtzaGlmdF0sIGFtb3VudCk7Ci0JfQotICAgICAgZWxzZQotCWZ1bmMgKHN0cmVhbSwgIiwgJXMgJXMiLCBhcm1fc2hpZnRbKGdpdmVuICYgMHg2MCkgPj4gNV0sCi0JICAgICAgYXJtX3JlZ25hbWVzWyhnaXZlbiAmIDB4ZjAwKSA+PiA4XSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChhbHdheXMgNCBvbiBBUk0pLiAqLwotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcm0gKHBjLCBpbmZvLCBnaXZlbikKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgIGdpdmVuOwotewotICBzdHJ1Y3QgYXJtX29wY29kZSAqICBpbnNuOwotICB2b2lkICogICAgICAgICAgICAgICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgICAgICAgIGZ1bmMgICA9IGluZm8tPmZwcmludGZfZnVuYzsKLQotICBmb3IgKGluc24gPSBhcm1fb3Bjb2RlczsgaW5zbi0+YXNzZW1ibGVyOyBpbnNuKyspCi0gICAgewotICAgICAgaWYgKChnaXZlbiAmIGluc24tPm1hc2spID09IGluc24tPnZhbHVlKQotCXsKLQkgIGNoYXIgKiBjOwotCSAgCi0JICBmb3IgKGMgPSBpbnNuLT5hc3NlbWJsZXI7ICpjOyBjKyspCi0JICAgIHsKLQkgICAgICBpZiAoKmMgPT0gJyUnKQotCQl7Ci0JCSAgc3dpdGNoICgqKytjKQotCQkgICAgewotCQkgICAgY2FzZSAnJSc6Ci0JCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiUlIik7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdhJzoKLQkJICAgICAgaWYgKCgoZ2l2ZW4gJiAweDAwMGYwMDAwKSA9PSAweDAwMGYwMDAwKQotCQkJICAmJiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgPT0gMCkpCi0JCQl7Ci0JCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOwotCQkJICAKLQkJCSAgZnVuYyAoc3RyZWFtLCAiW3BjIik7Ci0gCi0JCQkgIGlmIChnaXZlbiAmIDB4MDEwMDAwMDApCi0JCQkgICAgewotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJb2Zmc2V0ID0gLSBvZmZzZXQ7Ci0JCQkgIAotCQkJICAgICAgLyogcHJlLWluZGV4ZWQgKi8KLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgIyV4XSIsIG9mZnNldCk7Ci0KLQkJCSAgICAgIG9mZnNldCArPSBwYyArIDg7Ci0KLQkJCSAgICAgIC8qIENvcGUgd2l0aCB0aGUgcG9zc2liaWxpdHkgb2Ygd3JpdGUtYmFjawotCQkJCSBiZWluZyB1c2VkLiAgUHJvYmFibHkgYSB2ZXJ5IGRhbmdlcm91cyB0aGluZwotCQkJCSBmb3IgdGhlIHByb2dyYW1tZXIgdG8gZG8sIGJ1dCB3aG8gYXJlIHdlIHRvCi0JCQkJIGFyZ3VlID8gICovCi0JCQkgICAgICBpZiAoZ2l2ZW4gJiAweDAwMjAwMDAwKQotCQkJCWZ1bmMgKHN0cmVhbSwgIiEiKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBQb3N0IGluZGV4ZWQuICAqLwotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiXSwgIyV4Iiwgb2Zmc2V0KTsKLQotCQkJICAgICAgb2Zmc2V0ID0gcGMgKyA4OyAgLyogaWUgaWdub3JlIHRoZSBvZmZzZXQuICAqLwotCQkJICAgIH0KLQkJCSAgCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIlx0OyAiKTsKLQkJCSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChvZmZzZXQsIGluZm8pOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIAotCQkJCWFybV9yZWduYW1lc1soZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCQkgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKQotCQkJCXsKLQkJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZCIsCi0JCQkJCSAgKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgZnVuYyAoc3RyZWFtLCAiLCAlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJID8gIi0iIDogIiIpKTsKLQkJCQkgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkJCX0KLQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiXSVzIiwgCi0JCQkJICAgICgoZ2l2ZW4gJiAweDAwMjAwMDAwKSAhPSAwKSA/ICIhIiA6ICIiKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgPT0gMCkKLQkJCQl7Ci0JCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmZjsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCSAgZWxzZSAKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBmdW5jIChzdHJlYW0sICJdLCAlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkgCi0JCQkJCSA/ICItIiA6ICIiKSk7Ci0JCQkJICBhcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmIDB4MDA0ZjAwMDApID09IDB4MDA0ZjAwMDApCi0JCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIHJlbGF0aXZlIHdpdGggaW1tZWRpYXRlIG9mZnNldC4gICovCi0JCQkgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKLQkJCSAgCi0JCQkgIGlmICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0JCQkgIAotCQkJICBmdW5jIChzdHJlYW0sICJbcGMsICMleF1cdDsgIiwgb2Zmc2V0KTsKLQkJCSAgCi0JCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkJICAgIChvZmZzZXQgKyBwYyArIDgsIGluZm8pOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIAotCQkJCWFybV9yZWduYW1lc1soZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCQkgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByZS1pbmRleGVkLiAgKi8KLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwNDAwMDAwKSA9PSAweDAwNDAwMDAwKQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbW1lZGlhdGUuICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpc3Rlci4gICovCi0JCQkJICBmdW5jIChzdHJlYW0sICIsICVzJXMiLAotCQkJCQkoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSA/ICItIiA6ICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fcmVnbmFtZXNbZ2l2ZW4gJiAweGZdKTsKLQkJCQl9Ci0KLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl0lcyIsIAotCQkJCSAgICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCkgPyAiISIgOiAiIik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdC1pbmRleGVkLiAgKi8KLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwNDAwMDAwKSA9PSAweDAwNDAwMDAwKQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbW1lZGlhdGUuICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCSAgZWxzZSAKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaXN0ZXIuICAqLwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiXSwgJXMlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJID8gIi0iIDogIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkJICAKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJCShCRElTUCAoZ2l2ZW4pICogNCArIHBjICsgOCwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdjJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLAotCQkJICAgIGFybV9jb25kaXRpb25hbCBbKGdpdmVuID4+IDI4KSAmIDB4Zl0pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnbSc6Ci0JCSAgICAgIHsKLQkJCWludCBzdGFydGVkID0gMDsKLQkJCWludCByZWc7Ci0KLQkJCWZ1bmMgKHN0cmVhbSwgInsiKTsKLQkJCWZvciAocmVnID0gMDsgcmVnIDwgMTY7IHJlZysrKQotCQkJICBpZiAoKGdpdmVuICYgKDEgPDwgcmVnKSkgIT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc3RhcnRlZCkKLQkJCQlmdW5jIChzdHJlYW0sICIsICIpOwotCQkJICAgICAgc3RhcnRlZCA9IDE7Ci0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLQkJCSAgICB9Ci0JCQlmdW5jIChzdHJlYW0sICJ9Iik7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ28nOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgIT0gMCkKLQkJCXsKLQkJCSAgaW50IHJvdGF0ZSA9IChnaXZlbiAmIDB4ZjAwKSA+PiA3OwotCQkJICBpbnQgaW1tZWQgPSAoZ2l2ZW4gJiAweGZmKTsKLQkJCSAgaW1tZWQgPSAoKChpbW1lZCA8PCAoMzIgLSByb3RhdGUpKQotCQkJCSAgICB8IChpbW1lZCA+PiByb3RhdGUpKSAmIDB4ZmZmZmZmZmYpOwotCQkJICBmdW5jIChzdHJlYW0sICIjJWRcdDsgMHgleCIsIGltbWVkLCBpbW1lZCk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAncCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwMDBmMDAwKSA9PSAweDAwMDBmMDAwKQotCQkJZnVuYyAoc3RyZWFtLCAicCIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAxMjAwMDAwKSA9PSAweDAwMjAwMDAwKQotCQkJZnVuYyAoc3RyZWFtLCAidCIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnaCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKQotCQkJZnVuYyAoc3RyZWFtLCAiaCIpOwotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgImIiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0EnOgotCQkgICAgICBmdW5jIChzdHJlYW0sICJbJXMiLCBhcm1fcmVnbmFtZXMgWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKLQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCi0JCQl7Ci0JCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmY7Ci0JCQkgIGlmIChvZmZzZXQpCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZF0lcyIsCi0JCQkJICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKLQkJCQkgIG9mZnNldCAqIDQsCi0JCQkJICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCA/ICIhIiA6ICIiKSk7Ci0JCQkgIGVsc2UKLQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZjsKLQkJCSAgaWYgKG9mZnNldCkKLQkJCSAgICBmdW5jIChzdHJlYW0sICJdLCAlcyMlZCIsCi0JCQkJICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKLQkJCQkgIG9mZnNldCAqIDQpOwotCQkJICBlbHNlCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnQyc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDkwMDAwKQotCQkJewotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiXz8/PyIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg5MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2FsbCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgxMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2N0bCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2ZsZyIpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0YnOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDQwODAwMCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiNCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIxIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwNDAwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIyIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiMyIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJCQotCQkgICAgY2FzZSAnUCc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDgwMDgwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBmdW5jIChzdHJlYW0sICJzIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDgwOgotCQkJICBmdW5jIChzdHJlYW0sICJkIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwMDgwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICJlIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCBfKCI8aWxsZWdhbCBwcmVjaXNpb24+IikpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdRJzoKLQkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDA0MDgwMDApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInMiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4ODAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgwMDQwMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInAiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUic6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDYwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBicmVhazsKLQkJCWNhc2UgMHgyMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAicCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg0MDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAibSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInoiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotCQkgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCQkgICAgICB7Ci0JCQlpbnQgYml0c3RhcnQgPSAqYysrIC0gJzAnOwotCQkJaW50IGJpdGVuZCA9IDA7Ci0JCQl3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgYml0c3RhcnQgPSAoYml0c3RhcnQgKiAxMCkgKyAqYysrIC0gJzAnOwotCi0JCQlzd2l0Y2ggKCpjKQotCQkJICB7Ci0JCQkgIGNhc2UgJy0nOgotCQkJICAgIGMrKzsKLQkJCSAgICAKLQkJCSAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgICAgIGJpdGVuZCA9IChiaXRlbmQgKiAxMCkgKyAqYysrIC0gJzAnOwotCQkJICAgIAotCQkJICAgIGlmICghYml0ZW5kKQotCQkJICAgICAgYWJvcnQgKCk7Ci0JCQkgICAgCi0JCQkgICAgc3dpdGNoICgqYykKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgJ3InOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgCi0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICAKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ2QnOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgCi0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICAKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlICd4JzoKLQkJCQl7Ci0JCQkJICBsb25nIHJlZzsKLQkJCQkgIAotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgCi0JCQkJICBmdW5jIChzdHJlYW0sICIweCUwOHgiLCByZWcpOwotCQkJCSAgCi0JCQkJICAvKiBTb21lIFNXSSBpbnN0cnVjdGlvbnMgaGF2ZSBzcGVjaWFsCi0JCQkJICAgICBtZWFuaW5ncy4gICovCi0JCQkJICBpZiAoKGdpdmVuICYgMHgwZmZmZmZmZikgPT0gMHgwRkYwMDAwMCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXHQ7IElNQiIpOwotCQkJCSAgZWxzZSBpZiAoKGdpdmVuICYgMHgwZmZmZmZmZikgPT0gMHgwRkYwMDAwMSkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXHQ7IElNQlJhbmdlIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnWCc6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICAKLQkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLQkJCQkgIAotCQkJCSAgZnVuYyAoc3RyZWFtLCAiJTAxeCIsIHJlZyAmIDB4Zik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnZic6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICAKLQkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLQkJCQkgIAotCQkJCSAgaWYgKHJlZyA+IDcpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiMlcyIsCi0JCQkJCSAgYXJtX2ZwX2NvbnN0W3JlZyAmIDddKTsKLQkJCQkgIGVsc2UKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiZiVkIiwgcmVnKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBkZWZhdWx0OgotCQkJCWFib3J0ICgpOwotCQkJICAgICAgfQotCQkJICAgIGJyZWFrOwotCQkJICAgIAotCQkJICBjYXNlICdgJzoKLQkJCSAgICBjKys7Ci0JCQkgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgPT0gMCkKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotCQkJICAgIGJyZWFrOwotCQkJICBjYXNlICdcJyc6Ci0JCQkgICAgYysrOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAnPyc6Ci0JCQkgICAgKytjOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKyspOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKisrYyk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGRlZmF1bHQ6Ci0JCQkgICAgYWJvcnQgKCk7Ci0JCQkgIH0KLQkJCWJyZWFrOwotCi0JCSAgICAgIGRlZmF1bHQ6Ci0JCQlhYm9ydCAoKTsKLQkJICAgICAgfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQlmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkgICAgfQotCSAgcmV0dXJuIDQ7Ci0JfQotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3RodW1iIChwYywgaW5mbywgZ2l2ZW4pCi0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLSAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBnaXZlbjsKLXsKLSAgc3RydWN0IHRodW1iX29wY29kZSAqIGluc247Ci0gIHZvaWQgKiAgICAgICAgICAgICAgICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgICAgICAgICBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGZvciAoaW5zbiA9IHRodW1iX29wY29kZXM7IGluc24tPmFzc2VtYmxlcjsgaW5zbisrKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiBpbnNuLT5tYXNrKSA9PSBpbnNuLT52YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKiBjID0gaW5zbi0+YXNzZW1ibGVyOwotCi0gICAgICAgICAgLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBUaHVtYiAyIGluc3RydWN0aW9uIEJMIHNlcXVlbmNlOiAgKi8KLSAgICAgICAgICBpZiAoISpjKSAvKiBDaGVjayBmb3IgZW1wdHkgKG5vdCBOVUxMKSBhc3NlbWJsZXIgc3RyaW5nLiAgKi8KLSAgICAgICAgICAgIHsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lICA9IDQ7Ci0JICAgICAgCi0gICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiYmxcdCIpOwotCQkKLSAgICAgICAgICAgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChCRElTUDIzIChnaXZlbikgKiAyICsgcGMgKyA0LCBpbmZvKTsKLSAgICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgID0gNDsKLQkgIAkgICAgICAKLSAgICAgICAgICAgICAgZ2l2ZW4gJj0gMHhmZmZmOwotCSAgICAgIAotICAgICAgICAgICAgICBmb3IgKDsgKmM7IGMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJyUnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaW50IGRvbWFza3BjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9tYXNrbHIgPSAwOwotCQkgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCorK2MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJSUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZWc7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gKGdpdmVuID4+IDMpICYgMHg3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnaXZlbiAmICgxIDw8IDYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnICs9IDg7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZWc7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gZ2l2ZW4gJiAweDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdpdmVuICYgKDEgPDwgNykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyArPSA4OwotCQkJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fY29uZGl0aW9uYWwgWyhnaXZlbiA+PiA4KSAmIDB4Zl0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnaXZlbiAmICgxIDw8IDgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFza2xyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ08nOgotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJ08nICYmIChnaXZlbiAmICgxIDw8IDgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21hc2twYyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGVkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnOwotCQkJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgInsiKTsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHNwb3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMsIGFuZCBnZW5lcmF0ZSB0aGUgclMtckUgZm9ybWF0OiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocmVnID0gMDsgKHJlZyA8IDgpOyByZWcrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCByZWcpKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYXNrbHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sIGFybV9yZWduYW1lc1sxNF0gLyogImxyIiAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYXNrcGMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgYXJtX3JlZ25hbWVzWzE1XSAvKiAicGMiICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHN0YXJ0ID0gKmMrKyAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0ZW5kID0gMDsKLQkJCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0YXJ0ID0gKGJpdHN0YXJ0ICogMTApICsgKmMrKyAtICcwJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVnOwotCQkJCSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0ZW5kID0gKGJpdGVuZCAqIDEwKSArICpjKysgLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiaXRlbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6Ci0JCQkJICAgICAgLyogUEMtcmVsYXRpdmUgYWRkcmVzcyAtLSB0aGUgYm90dG9tIHR3bwotCQkJCQkgYml0cyBvZiB0aGUgYWRkcmVzcyBhcmUgZHJvcHBlZAotCQkJCQkgYmVmb3JlIHRoZSBjYWxjdWxhdGlvbi4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYwotCQkJCQkoKChwYyArIDQpICYgfjMpICsgKHJlZyA8PCAyKSwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiMHglMDR4IiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWcgKiAyICsgcGMgKyA0LCBpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYysrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKisrYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgfQotICAgIH0KLQotICAvKiBObyBtYXRjaC4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBQYXJzZSBhbiBpbmRpdmlkdWFsIGRpc2Fzc2VtYmxlciBvcHRpb24uICAqLwotdm9pZAotcGFyc2VfYXJtX2Rpc2Fzc2VtYmxlcl9vcHRpb24gKG9wdGlvbikKLSAgICAgY2hhciAqIG9wdGlvbjsKLXsKLSAgaWYgKG9wdGlvbiA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgICAgIAotICBpZiAoc3RybmVxIChvcHRpb24sICJyZWctbmFtZXMtIiwgMTApKQotICAgIHsKLSAgICAgIGludCBpOwotCQotICAgICAgb3B0aW9uICs9IDEwOwotCi0gICAgICBmb3IgKGkgPSBOVU1fQVJNX1JFR05BTUVTOyBpLS07KQotCWlmIChzdHJlcSAob3B0aW9uLCByZWduYW1lc1tpXS5uYW1lKSkKLQkgIHsKLQkgICAgcmVnbmFtZV9zZWxlY3RlZCA9IGk7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgCi0gICAgICBpZiAoaSA8IDApCi0JZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbmlzZWQgcmVnaXN0ZXIgbmFtZSBzZXQ6ICVzXG4iKSwgb3B0aW9uKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmVxIChvcHRpb24sICJmb3JjZS10aHVtYiIpKQotICAgIGZvcmNlX3RodW1iID0gMTsKLSAgZWxzZSBpZiAoc3RyZXEgKG9wdGlvbiwgIm5vLWZvcmNlLXRodW1iIikpCi0gICAgZm9yY2VfdGh1bWIgPSAwOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbmlzZWQgZGlzYXNzZW1ibGVyIG9wdGlvbjogJXNcbiIpLCBvcHRpb24pOwotICAKLSAgcmV0dXJuOwotfQotCi0vKiBQYXJzZSB0aGUgc3RyaW5nIG9mIGRpc2Fzc2VtYmxlciBvcHRpb25zLCBzcGxpdGluZyBpdCBhdCB3aGl0ZXNwYWNlcy4gICovCi1zdGF0aWMgdm9pZAotcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgKG9wdGlvbnMpCi0gICAgIGNoYXIgKiBvcHRpb25zOwotewotICBjaGFyICogc3BhY2U7Ci0gIAotICBpZiAob3B0aW9ucyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBkbwotICAgIHsKLSAgICAgIHNwYWNlID0gc3RyY2hyIChvcHRpb25zLCAnICcpOwotCi0gICAgICBpZiAoc3BhY2UpCi0JewotCSAgKiBzcGFjZSA9ICdcMCc7Ci0JICBwYXJzZV9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbiAob3B0aW9ucyk7Ci0JICAqIHNwYWNlID0gJyAnOwotCSAgb3B0aW9ucyA9IHNwYWNlICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JcGFyc2VfYXJtX2Rpc2Fzc2VtYmxlcl9vcHRpb24gKG9wdGlvbnMpOwotICAgIH0KLSAgd2hpbGUgKHNwYWNlKTsKLX0KLQotLyogTk9URTogVGhlcmUgYXJlIG5vIGNoZWNrcyBpbiB0aGVzZSByb3V0aW5lcyB0aGF0Ci0gICB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgZXhpc3QuICAqLwotc3RhdGljIGludAotcHJpbnRfaW5zbiAocGMsIGluZm8sIGxpdHRsZSkKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotICAgICBib29sZWFuIGxpdHRsZTsKLXsKLSAgdW5zaWduZWQgY2hhciAgICAgIGJbNF07Ci0gIGxvbmcgICAgICAgICAgICAgICBnaXZlbjsKLSAgaW50ICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgaW50ICAgICAgICAgICAgICAgIGlzX3RodW1iOwotCi0gIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucykKLSAgICB7Ci0gICAgICBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMpOwotICAgICAgCi0gICAgICAvKiBUbyBhdm9pZCByZXBlYXRlZCBwYXJzaW5nIG9mIHRoZXNlIG9wdGlvbnMsIHdlIHJlbW92ZSB0aGVtIGhlcmUuICAqLwotICAgICAgaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBOVUxMOwotICAgIH0KLSAgCi0gIGlzX3RodW1iID0gZm9yY2VfdGh1bWI7Ci0gIAotICBpZiAoIWlzX3RodW1iICYmIGluZm8tPnN5bWJvbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotCXsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKiBjczsKLQkgIAotCSAgY3MgPSBjb2Zmc3ltYm9sICgqaW5mby0+c3ltYm9scyk7Ci0JICBpc190aHVtYiA9ICggICBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhUCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFUCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJMQUJFTAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQwotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMpOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGVsZl9zeW1ib2xfdHlwZSAqICBlczsKLQkgIHVuc2lnbmVkIGludCAgICAgICB0eXBlOwotCSAgCi0JICBlcyA9ICooZWxmX3N5bWJvbF90eXBlICoqKShpbmZvLT5zeW1ib2xzKTsKLQkgIHR5cGUgPSBFTEZfU1RfVFlQRSAoZXMtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbyk7Ci0JICAKLQkgIGlzX3RodW1iID0gKHR5cGUgPT0gU1RUX0FSTV9URlVOQykgfHwgKHR5cGUgPT0gU1RUX0FSTV8xNkJJVCk7Ci0JfQotICAgIH0KLSAgCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuICA9IGxpdHRsZSA/IEJGRF9FTkRJQU5fTElUVExFIDogQkZEX0VORElBTl9CSUc7Ci0KLSAgaWYgKGxpdHRsZSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChwYywgKGJmZF9ieXRlICopICZiWzBdLCA0LCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCAmJiBpc190aHVtYikKLQl7Ci0JICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotCSAgCi0JICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChwYywgKGJmZF9ieXRlICopIGIsIDIsIGluZm8pOwotCSAgYlszXSA9IGJbMl0gPSAwOwotCX0KLSAgICAgIAotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICAKLSAgICAgIGdpdmVuID0gKGJbMF0pIHwgKGJbMV0gPDwgOCkgfCAoYlsyXSA8PCAxNikgfCAoYlszXSA8PCAyNCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYwotCShwYyAmIH4gMHgzLCAoYmZkX2J5dGUgKikgJmJbMF0sIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChpc190aHVtYikKLQl7Ci0JICBpZiAocGMgJiAweDIpCi0JICAgIHsKLQkgICAgICBnaXZlbiA9IChiWzJdIDw8IDgpIHwgYlszXTsKLQkgICAgICAKLQkgICAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jCi0JCSgocGMgKyA0KSAmIH4gMHgzLCAoYmZkX2J5dGUgKikgYiwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgcGMgKyA0LCBpbmZvKTsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQkgICAgICAKLQkgICAgICBnaXZlbiB8PSAoYlswXSA8PCAyNCkgfCAoYlsxXSA8PCAxNik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZ2l2ZW4gPSAoYlswXSA8PCA4KSB8IGJbMV0gfCAoYlsyXSA8PCAyNCkgfCAoYlszXSA8PCAxNik7Ci0JfQotICAgICAgZWxzZQotCWdpdmVuID0gKGJbMF0gPDwgMjQpIHwgKGJbMV0gPDwgMTYpIHwgKGJbMl0gPDwgOCkgfCAoYlszXSk7Ci0gICAgfQotICAKLSAgaWYgKGlzX3RodW1iKQotICAgIHN0YXR1cyA9IHByaW50X2luc25fdGh1bWIgKHBjLCBpbmZvLCBnaXZlbik7Ci0gIGVsc2UKLSAgICBzdGF0dXMgPSBwcmludF9pbnNuX2FybSAocGMsIGluZm8sIGdpdmVuKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi1pbnQKLXByaW50X2luc25fYmlnX2FybSAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc24gKHBjLCBpbmZvLCBmYWxzZSk7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9saXR0bGVfYXJtIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbiAocGMsIGluZm8sIHRydWUpOwotfQotCi12b2lkCi1wcmludF9hcm1fZGlzYXNzZW1ibGVyX29wdGlvbnMgKEZJTEUgKiBzdHJlYW0pCi17Ci0gIGludCBpOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXG5cCi1UaGUgZm9sbG93aW5nIEFSTSBzcGVjaWZpYyBkaXNhc3NlbWJsZXIgb3B0aW9ucyBhcmUgc3VwcG9ydGVkIGZvciB1c2Ugd2l0aFxuXAotdGhlIC1NIHN3aXRjaDpcbiIpKTsKLSAgCi0gIGZvciAoaSA9IE5VTV9BUk1fUkVHTkFNRVM7IGktLTspCi0gICAgZnByaW50ZiAoc3RyZWFtLCAiICByZWctbmFtZXMtJXMgJSpjJXNcbiIsCi0JICAgICByZWduYW1lc1tpXS5uYW1lLAotCSAgICAgMTQgLSBzdHJsZW4gKHJlZ25hbWVzW2ldLm5hbWUpLCAnICcsCi0JICAgICByZWduYW1lc1tpXS5kZXNjcmlwdGlvbik7Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCAiICBmb3JjZS10aHVtYiAgICAgICAgICAgICAgQXNzdW1lIGFsbCBpbnNucyBhcmUgVGh1bWIgaW5zbnNcbiIpOwotICBmcHJpbnRmIChzdHJlYW0sICIgIG5vLWZvcmNlLXRodW1iICAgICAgICAgICBFeGFtaW5lIHByZWNlZWRpbmcgbGFiZWwgdG8gZGV0ZXJtaW5lIGFuIGluc24ncyB0eXBlXG5cbiIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcm0tb3BjLmggYi9vcGNvZGVzL2FybS1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhMTZhNC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FybS1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBBUk0uCi0KLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLXN0cnVjdCBhcm1fb3Bjb2RlIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtYXNrOwkvKiByZWNvZ25pc2UgaW5zdHJ1Y3Rpb24gaWYgKG9wJm1hc2spPT12YWx1ZSAqLwotICAgIGNoYXIgKmFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi1zdHJ1Y3QgdGh1bWJfb3Bjb2RlCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqIGFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi0vKiBmb3JtYXQgb2YgdGhlIGFzc2VtYmxlciBzdHJpbmcgOgotICAgCi0gICAlJQkJCSUKLSAgICU8Yml0ZmllbGQ+ZAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+eAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGhleAotICAgJTxiaXRmaWVsZD5YCQlwcmludCB0aGUgYml0ZmllbGQgYXMgMSBoZXggZGlnaXQgd2l0aG91dCBsZWFkaW5nICIweCIKLSAgICU8Yml0ZmllbGQ+cgkJcHJpbnQgYXMgYW4gQVJNIHJlZ2lzdGVyCi0gICAlPGJpdGZpZWxkPmYJCXByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaWYgPjcgZWxzZSBhCi0JCQlmbG9hdGluZyBwb2ludCByZWdpc3RlcgotICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgMjgtMzEpCi0gICAlUAkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBhcml0aG1ldGljIGluc24KLSAgICVRCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGxkZi9zdGYgaW5zbgotICAgJVIJCQlwcmludCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBtb2RlCi0gICAlPGJpdG51bT4nYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyBvbmUKLSAgICU8Yml0bnVtPmBjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIHplcm8KLSAgICU8Yml0bnVtPj9hYgkJcHJpbnQgYSBpZiBiaXQgaXMgb25lIGVsc2UgcHJpbnQgYgotICAgJXAJCQlwcmludCAncCcgaWZmIGJpdHMgMTItMTUgYXJlIDE1Ci0gICAldAkJCXByaW50ICd0JyBpZmYgYml0IDIxIHNldCBhbmQgYml0IDI0IGNsZWFyCi0gICAlaCAgICAgICAgICAgICAgICAgICBwcmludCAnaCcgaWZmIGJpdCA1IHNldCwgZWxzZSBwcmludCAnYicKLSAgICVvCQkJcHJpbnQgb3BlcmFuZDIgKGltbWVkaWF0ZSBvciByZWdpc3RlciArIHNoaWZ0KQotICAgJWEJCQlwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGluc3RydWN0aW9uCi0gICAlcyAgICAgICAgICAgICAgICAgICBwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGhhbGZ3b3JkL3NpZ25leHRlbmQgaW5zdHJ1Y3Rpb24KLSAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCi0gICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgotICAgJW0JCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0gICAlQwkJCXByaW50IHRoZSBQU1Igc3ViIHR5cGUuCi0gICAlRgkJCXByaW50IHRoZSBDT1VOVCBmaWVsZCBvZiBhIExGTS9TRk0gaW5zdHJ1Y3Rpb24uCi1UaHVtYiBzcGVjaWZpYyBmb3JtYXQgb3B0aW9uczoKLSAgICVEICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIChiaXRzIDAuLjIgYXMgaGlnaCBudW1iZXIgaWYgYml0IDcgc2V0KQotICAgJVMgICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgKGJpdHMgMy4uNSBhcyBoaWdoIG51bWJlciBpZiBiaXQgNiBzZXQpCi0gICAlPGJpdGZpZWxkPkkgICAgICAgICBwcmludCBiaXRmaWVsZCBhcyBhIHNpZ25lZCBkZWNpbWFsCi0gICAJCQkJKHRvcCBiaXQgb2YgcmFuZ2UgYmVpbmcgdGhlIHNpZ24gYml0KQotICAgJU0gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzawotICAgJU4gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzayAod2l0aCBMUikKLSAgICVPICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIG1hc2sgKHdpdGggUEMpCi0gICAlVCAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgOC0xMSkKLSAgICU8Yml0ZmllbGQ+QiAgICAgICAgIHByaW50IFRodW1iIGJyYW5jaCBkZXN0aW5hdGlvbiAoc2lnbmVkIGRpc3BsYWNlbWVudCkKLSAgICU8Yml0ZmllbGQ+VyAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDQpIGFzIGEgZGVjaW1hbAotICAgJTxiaXRmaWVsZD5IICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogMikgYXMgYSBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPmEgICAgICAgICBwcmludCAoYml0ZmllbGQgKiA0KSBhcyBhIHBjLXJlbCBvZmZzZXQgKyBkZWNvZGVkIHN5bWJvbAotKi8KLQotLyogTm90ZTogVGhlcmUgaXMgYSBwYXJ0aWFsIG9yZGVyaW5nIGluIHRoaXMgdGFibGUgLSBpdCBtdXN0IGJlIHNlYXJjaGVkIGZyb20KLSAgIHRoZSB0b3AgdG8gb2J0YWluIGEgY29ycmVjdCBtYXRjaC4gKi8KLQotc3RhdGljIHN0cnVjdCBhcm1fb3Bjb2RlIGFybV9vcGNvZGVzW10gPQotewotICAgIC8qIEFSTSBpbnN0cnVjdGlvbnMgKi8KLSAgICB7MHhlMWEwMDAwMCwgMHhmZmZmZmZmZiwgIm5vcFx0XHRcdChtb3YgcjAscjApIn0sCi0gICAgezB4MDEyRkZGMTAsIDB4MGZmZmZmZjAsICJieCVjXHQlMC0zciJ9LAotICAgIHsweDAwMDAwMDkwLCAweDBmZTAwMGYwLCAibXVsJWMlMjAnc1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAotICAgIHsweDAwMjAwMDkwLCAweDBmZTAwMGYwLCAibWxhJWMlMjAnc1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciwgJTEyLTE1ciJ9LAotICAgIHsweDAxMDAwMDkwLCAweDBmYjAwZmYwLCAic3dwJWMlMjInYlx0JTEyLTE1ciwgJTAtM3IsIFslMTYtMTlyXSJ9LAotICAgIHsweDAwODAwMDkwLCAweDBmYTAwMGYwLCAiJTIyP3N1bXVsbCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKLSAgICB7MHgwMGEwMDA5MCwgMHgwZmEwMDBmMCwgIiUyMj9zdW1sYWwlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCi0gICAgezB4MDAwMDAwOTAsIDB4MGUxMDAwOTAsICJzdHIlYyU2J3MlaFx0JTEyLTE1ciwgJXMifSwKLSAgICB7MHgwMDEwMDA5MCwgMHgwZTEwMDA5MCwgImxkciVjJTYncyVoXHQlMTItMTVyLCAlcyJ9LAotICAgIHsweDAwMDAwMDAwLCAweDBkZTAwMDAwLCAiYW5kJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMDIwMDAwMCwgMHgwZGUwMDAwMCwgImVvciVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDA0MDAwMDAsIDB4MGRlMDAwMDAsICJzdWIlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwNjAwMDAwLCAweDBkZTAwMDAwLCAicnNiJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMDgwMDAwMCwgMHgwZGUwMDAwMCwgImFkZCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDBhMDAwMDAsIDB4MGRlMDAwMDAsICJhZGMlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwYzAwMDAwLCAweDBkZTAwMDAwLCAic2JjJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMGUwMDAwMCwgMHgwZGUwMDAwMCwgInJzYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDEyMGYwMDAsIDB4MGRiNmYwMDAsICJtc3IlY1x0JTIyP3NjcHNyJUMsICVvIn0sCi0gICAgezB4MDEwZjAwMDAsIDB4MGZiZjBmZmYsICJtcnMlY1x0JTEyLTE1ciwgJTIyP3NjcHNyIn0sCi0gICAgezB4MDEwMDAwMDAsIDB4MGRlMDAwMDAsICJ0c3QlYyVwXHQlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxMjAwMDAwLCAweDBkZTAwMDAwLCAidGVxJWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTQwMDAwMCwgMHgwZGUwMDAwMCwgImNtcCVjJXBcdCUxNi0xOXIsICVvIn0sCi0gICAgezB4MDE2MDAwMDAsIDB4MGRlMDAwMDAsICJjbW4lYyVwXHQlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxODAwMDAwLCAweDBkZTAwMDAwLCAib3JyJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMWEwMDAwMCwgMHgwZGUwMDAwMCwgIm1vdiVjJTIwJ3NcdCUxMi0xNXIsICVvIn0sCi0gICAgezB4MDFjMDAwMDAsIDB4MGRlMDAwMDAsICJiaWMlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxZTAwMDAwLCAweDBkZTAwMDAwLCAibXZuJWMlMjAnc1x0JTEyLTE1ciwgJW8ifSwKLSAgICB7MHgwNDAwMDAwMCwgMHgwZTEwMDAwMCwgInN0ciVjJTIyJ2IldFx0JTEyLTE1ciwgJWEifSwKLSAgICB7MHgwNjAwMDAwMCwgMHgwZTEwMGZmMCwgInN0ciVjJTIyJ2IldFx0JTEyLTE1ciwgJWEifSwKLSAgICB7MHgwNDAwMDAwMCwgMHgwYzEwMDAxMCwgInN0ciVjJTIyJ2IldFx0JTEyLTE1ciwgJWEifSwKLSAgICB7MHgwNjAwMDAxMCwgMHgwZTAwMDAxMCwgInVuZGVmaW5lZCJ9LAotICAgIHsweDA0MTAwMDAwLCAweDBjMTAwMDAwLCAibGRyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAotICAgIHsweDA4MDAwMDAwLCAweDBlMTAwMDAwLCAic3RtJWMlMjM/aWQlMjQ/YmFcdCUxNi0xOXIlMjEnISwgJW0lMjInXiJ9LAotICAgIHsweDA4MTAwMDAwLCAweDBlMTAwMDAwLCAibGRtJWMlMjM/aWQlMjQ/YmFcdCUxNi0xOXIlMjEnISwgJW0lMjInXiJ9LAotICAgIHsweDBhMDAwMDAwLCAweDBlMDAwMDAwLCAiYiUyNCdsJWNcdCViIn0sCi0gICAgezB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsICJzd2klY1x0JTAtMjN4In0sCi0KLSAgICAvKiBGbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgICB7MHgwZTAwMDEwMCwgMHgwZmYwOGYxMCwgImFkZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTEwMDEwMCwgMHgwZmYwOGYxMCwgIm11ZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTIwMDEwMCwgMHgwZmYwOGYxMCwgInN1ZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTMwMDEwMCwgMHgwZmYwOGYxMCwgInJzZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTQwMDEwMCwgMHgwZmYwOGYxMCwgImR2ZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTUwMDEwMCwgMHgwZmYwOGYxMCwgInJkZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTYwMDEwMCwgMHgwZmYwOGYxMCwgInBvdyVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTcwMDEwMCwgMHgwZmYwOGYxMCwgInJwdyVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTgwMDEwMCwgMHgwZmYwOGYxMCwgInJtZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTkwMDEwMCwgMHgwZmYwOGYxMCwgImZtbCVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWEwMDEwMCwgMHgwZmYwOGYxMCwgImZkdiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWIwMDEwMCwgMHgwZmYwOGYxMCwgImZyZCVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWMwMDEwMCwgMHgwZmYwOGYxMCwgInBvbCVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZTAwODEwMCwgMHgwZmYwOGYxMCwgIm12ZiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTEwODEwMCwgMHgwZmYwOGYxMCwgIm1uZiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTIwODEwMCwgMHgwZmYwOGYxMCwgImFicyVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTMwODEwMCwgMHgwZmYwOGYxMCwgInJuZCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTQwODEwMCwgMHgwZmYwOGYxMCwgInNxdCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTUwODEwMCwgMHgwZmYwOGYxMCwgImxvZyVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTYwODEwMCwgMHgwZmYwOGYxMCwgImxnbiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTcwODEwMCwgMHgwZmYwOGYxMCwgImV4cCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTgwODEwMCwgMHgwZmYwOGYxMCwgInNpbiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTkwODEwMCwgMHgwZmYwOGYxMCwgImNvcyVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWEwODEwMCwgMHgwZmYwOGYxMCwgInRhbiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWIwODEwMCwgMHgwZmYwOGYxMCwgImFzbiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWMwODEwMCwgMHgwZmYwOGYxMCwgImFjcyVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWQwODEwMCwgMHgwZmYwOGYxMCwgImF0biVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWUwODEwMCwgMHgwZmYwOGYxMCwgInVyZCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZWYwODEwMCwgMHgwZmYwOGYxMCwgIm5ybSVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKLSAgICB7MHgwZTAwMDExMCwgMHgwZmYwMGYxZiwgImZsdCVjJVAlUlx0JTE2LTE4ZiwgJTEyLTE1ciJ9LAotICAgIHsweDBlMTAwMTEwLCAweDBmZmYwZjk4LCAiZml4JWMlUlx0JTEyLTE1ciwgJTAtMmYifSwKLSAgICB7MHgwZTIwMDExMCwgMHgwZmZmMGZmZiwgIndmcyVjXHQlMTItMTVyIn0sCi0gICAgezB4MGUzMDAxMTAsIDB4MGZmZjBmZmYsICJyZnMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlNDAwMTEwLCAweDBmZmYwZmZmLCAid2ZjJWNcdCUxMi0xNXIifSwKLSAgICB7MHgwZTUwMDExMCwgMHgwZmZmMGZmZiwgInJmYyVjXHQlMTItMTVyIn0sCi0gICAgezB4MGU5MGYxMTAsIDB4MGZmOGZmZjAsICJjbWYlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWIwZjExMCwgMHgwZmY4ZmZmMCwgImNuZiVjXHQlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlZDBmMTEwLCAweDBmZjhmZmYwLCAiY21mZSVjXHQlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlZjBmMTEwLCAweDBmZjhmZmYwLCAiY25mZSVjXHQlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBjMDAwMTAwLCAweDBlMTAwZjAwLCAic3RmJWMlUVx0JTEyLTE0ZiwgJUEifSwKLSAgICB7MHgwYzEwMDEwMCwgMHgwZTEwMGYwMCwgImxkZiVjJVFcdCUxMi0xNGYsICVBIn0sCi0gICAgezB4MGMwMDAyMDAsIDB4MGUxMDBmMDAsICJzZm0lY1x0JTEyLTE0ZiwgJUYsICVBIn0sCi0gICAgezB4MGMxMDAyMDAsIDB4MGUxMDBmMDAsICJsZm0lY1x0JTEyLTE0ZiwgJUYsICVBIn0sCi0KLSAgICAvKiBHZW5lcmljIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIHsweDBlMDAwMDAwLCAweDBmMDAwMDEwLCAiY2RwJWNcdCU4LTExZCwgJTIwLTIzZCwgY3IlMTItMTVkLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0ifSwKLSAgICB7MHgwZTEwMDAxMCwgMHgwZjEwMDAxMCwgIm1yYyVjXHQlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAotICAgIHsweDBlMDAwMDEwLCAweDBmMTAwMDEwLCAibWNyJWNcdCU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9In0sCi0gICAgezB4MGMwMDAwMDAsIDB4MGUxMDAwMDAsICJzdGMlYyUyMidsXHQlOC0xMWQsIGNyJTEyLTE1ZCwgJUEifSwKLSAgICB7MHgwYzEwMDAwMCwgMHgwZTEwMDAwMCwgImxkYyVjJTIyJ2xcdCU4LTExZCwgY3IlMTItMTVkLCAlQSJ9LAotICAgIAotICAgIC8qIFRoZSByZXN0LiAgKi8KLSAgICB7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0zMXgifSwKLSAgICB7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0KLX07Ci0KLSNkZWZpbmUgQkRJU1AoeCkgKCgoKHgpICYgMHhmZmZmZmYpIF4gMHg4MDAwMDApIC0gMHg4MDAwMDApIC8qIDI2IGJpdCAqLwotCi1zdGF0aWMgc3RydWN0IHRodW1iX29wY29kZSB0aHVtYl9vcGNvZGVzW10gPQotewotICAvKiBUaHVtYiBpbnN0cnVjdGlvbnMgKi8KLSAgezB4NDZDMCwgMHhGRkZGLCAibm9wXHRcdFx0KG1vdiByOCxyOCkifSwgLyogZm9ybWF0IDUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCB1cGRhdGUgdGhlIFBTUiAqLwotICB7MHgxQzAwLCAweEZGQzAsICJtb3ZcdCUwLTJyLCAlMy01clx0XHQoYWRkICUwLTJyLCAlMy01ciwgIyU2LThkKSJ9LAotICAvKiBmb3JtYXQgNCAqLwotICB7MHg0MDAwLCAweEZGQzAsICJhbmRcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MDQwLCAweEZGQzAsICJlb3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MDgwLCAweEZGQzAsICJsc2xcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MEMwLCAweEZGQzAsICJsc3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MTAwLCAweEZGQzAsICJhc3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MTQwLCAweEZGQzAsICJhZGNcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MTgwLCAweEZGQzAsICJzYmNcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MUMwLCAweEZGQzAsICJyb3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MjAwLCAweEZGQzAsICJ0c3RcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MjQwLCAweEZGQzAsICJuZWdcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MjgwLCAweEZGQzAsICJjbXBcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MkMwLCAweEZGQzAsICJjbW5cdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MzAwLCAweEZGQzAsICJvcnJcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MzQwLCAweEZGQzAsICJtdWxcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MzgwLCAweEZGQzAsICJiaWNcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0M0MwLCAweEZGQzAsICJtdm5cdCUwLTJyLCAlMy01ciJ9LAotICAvKiBmb3JtYXQgMTMgKi8KLSAgezB4QjAwMCwgMHhGRjgwLCAiYWRkXHRzcCwgIyUwLTZXIn0sCi0gIHsweEIwODAsIDB4RkY4MCwgInN1Ylx0c3AsICMlMC02VyJ9LAotICAvKiBmb3JtYXQgNSAqLwotICB7MHg0NzAwLCAweEZGODAsICJieFx0JVMifSwKLSAgezB4NDQwMCwgMHhGRjAwLCAiYWRkXHQlRCwgJVMifSwKLSAgezB4NDUwMCwgMHhGRjAwLCAiY21wXHQlRCwgJVMifSwKLSAgezB4NDYwMCwgMHhGRjAwLCAibW92XHQlRCwgJVMifSwKLSAgLyogZm9ybWF0IDE0ICovCi0gIHsweEI0MDAsIDB4RkUwMCwgInB1c2hcdCVOIn0sCi0gIHsweEJDMDAsIDB4RkUwMCwgInBvcFx0JU8ifSwKLSAgLyogZm9ybWF0IDIgKi8KLSAgezB4MTgwMCwgMHhGRTAwLCAiYWRkXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCi0gIHsweDFBMDAsIDB4RkUwMCwgInN1Ylx0JTAtMnIsICUzLTVyLCAlNi04ciJ9LAotICB7MHgxQzAwLCAweEZFMDAsICJhZGRcdCUwLTJyLCAlMy01ciwgIyU2LThkIn0sCi0gIHsweDFFMDAsIDB4RkUwMCwgInN1Ylx0JTAtMnIsICUzLTVyLCAjJTYtOGQifSwKLSAgLyogZm9ybWF0IDggKi8KLSAgezB4NTIwMCwgMHhGRTAwLCAic3RyaFx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDVBMDAsIDB4RkUwMCwgImxkcmhcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICB7MHg1NjAwLCAweEY2MDAsICJsZHMlMTE/aGJcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAvKiBmb3JtYXQgNyAqLwotICB7MHg1MDAwLCAweEZBMDAsICJzdHIlMTAnYlx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDU4MDAsIDB4RkEwMCwgImxkciUxMCdiXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgLyogZm9ybWF0IDEgKi8KLSAgezB4MDAwMCwgMHhGODAwLCAibHNsXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgezB4MDgwMCwgMHhGODAwLCAibHNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgezB4MTAwMCwgMHhGODAwLCAiYXNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgLyogZm9ybWF0IDMgKi8KLSAgezB4MjAwMCwgMHhGODAwLCAibW92XHQlOC0xMHIsICMlMC03ZCJ9LAotICB7MHgyODAwLCAweEY4MDAsICJjbXBcdCU4LTEwciwgIyUwLTdkIn0sCi0gIHsweDMwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCAjJTAtN2QifSwKLSAgezB4MzgwMCwgMHhGODAwLCAic3ViXHQlOC0xMHIsICMlMC03ZCJ9LAotICAvKiBmb3JtYXQgNiAqLwotICB7MHg0ODAwLCAweEY4MDAsICJsZHJcdCU4LTEwciwgW3BjLCAjJTAtN1ddXHQoJTAtN2EpIn0sICAvKiBUT0RPOiBEaXNhc3NlbWJsZSBQQyByZWxhdGl2ZSAiTERSIHJELD08c3ltYm9saWM+IiAqLwotICAvKiBmb3JtYXQgOSAqLwotICB7MHg2MDAwLCAweEY4MDAsICJzdHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCi0gIHsweDY4MDAsIDB4RjgwMCwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NzAwMCwgMHhGODAwLCAic3RyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgezB4NzgwMCwgMHhGODAwLCAibGRyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgLyogZm9ybWF0IDEwICovCi0gIHsweDgwMDAsIDB4RjgwMCwgInN0cmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCi0gIHsweDg4MDAsIDB4RjgwMCwgImxkcmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCi0gIC8qIGZvcm1hdCAxMSAqLwotICB7MHg5MDAwLCAweEY4MDAsICJzdHJcdCU4LTEwciwgW3NwLCAjJTAtN1ddIn0sCi0gIHsweDk4MDAsIDB4RjgwMCwgImxkclx0JTgtMTByLCBbc3AsICMlMC03V10ifSwKLSAgLyogZm9ybWF0IDEyICovCi0gIHsweEEwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCBwYywgIyUwLTdXXHQoYWRyICU4LTEwciwlMC03YSkifSwKLSAgezB4QTgwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsIHNwLCAjJTAtN1cifSwKLSAgLyogZm9ybWF0IDE1ICovCi0gIHsweEMwMDAsIDB4RjgwMCwgInN0bWlhXHQlOC0xMHIhLCVNIn0sCi0gIHsweEM4MDAsIDB4RjgwMCwgImxkbWlhXHQlOC0xMHIhLCVNIn0sCi0gIC8qIGZvcm1hdCAxOCAqLwotICB7MHhFMDAwLCAweEY4MDAsICJiXHQlMC0xMEIifSwKLSAgezB4RTgwMCwgMHhGODAwLCAidW5kZWZpbmVkIn0sCi0gIC8qIGZvcm1hdCAxOSAqLwotICB7MHhGMDAwLCAweEY4MDAsICIifSwgLyogc3BlY2lhbCBwcm9jZXNzaW5nIHJlcXVpcmVkIGluIGRpc2Fzc2VtYmxlciAqLwotICB7MHhGODAwLCAweEY4MDAsICJzZWNvbmQgaGFsZiBvZiBCTCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKLSAgLyogZm9ybWF0IDE2ICovCi0gIHsweEQwMDAsIDB4RkYwMCwgImJlcVx0JTAtN0IifSwKLSAgezB4RDEwMCwgMHhGRjAwLCAiYm5lXHQlMC03QiJ9LAotICB7MHhEMjAwLCAweEZGMDAsICJiY3NcdCUwLTdCIn0sCi0gIHsweEQzMDAsIDB4RkYwMCwgImJjY1x0JTAtN0IifSwKLSAgezB4RDQwMCwgMHhGRjAwLCAiYm1pXHQlMC03QiJ9LAotICB7MHhENTAwLCAweEZGMDAsICJicGxcdCUwLTdCIn0sCi0gIHsweEQ2MDAsIDB4RkYwMCwgImJ2c1x0JTAtN0IifSwKLSAgezB4RDcwMCwgMHhGRjAwLCAiYnZjXHQlMC03QiJ9LAotICB7MHhEODAwLCAweEZGMDAsICJiaGlcdCUwLTdCIn0sCi0gIHsweEQ5MDAsIDB4RkYwMCwgImJsc1x0JTAtN0IifSwKLSAgezB4REEwMCwgMHhGRjAwLCAiYmdlXHQlMC03QiJ9LAotICB7MHhEQjAwLCAweEZGMDAsICJibHRcdCUwLTdCIn0sCi0gIHsweERDMDAsIDB4RkYwMCwgImJndFx0JTAtN0IifSwKLSAgezB4REQwMCwgMHhGRjAwLCAiYmxlXHQlMC03QiJ9LAotICAvKiBmb3JtYXQgMTcgKi8KLSAgezB4REUwMCwgMHhGRjAwLCAiYmFsXHQlMC03QiJ9LAotICB7MHhERjAwLCAweEZGMDAsICJzd2lcdCUwLTdkIn0sCi0gIC8qIGZvcm1hdCA5ICovCi0gIHsweDYwMDAsIDB4RjgwMCwgInN0clx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NjgwMCwgMHhGODAwLCAibGRyXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBXXSJ9LAotICB7MHg3MDAwLCAweEY4MDAsICJzdHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICB7MHg3ODAwLCAweEY4MDAsICJsZHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICAvKiB0aGUgcmVzdCAqLwotICB7MHgwMDAwLCAweDAwMDAsICJ1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gJTAtMTV4In0sCi0gIHsweDAwMDAsIDB4MDAwMCwgMH0KLX07Ci0KLSNkZWZpbmUgQkRJU1AyMyh4KSAoKCgoKCh4KSAmIDB4MDdmZikgPDwgMTEpIHwgKCgoeCkgJiAweDA3ZmYwMDAwKSA+PiAxNikpIFwKLSAgICAgICAgICAgICAgICAgICAgIF4gMHgyMDAwMDApIC0gMHgyMDAwMDApIC8qIDIzYml0ICovCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXZyLWRpcy5jIGIvb3Bjb2Rlcy9hdnItZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkN2ViOTQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hdnItZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgQVZSIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgRGVuaXMgQ2hlcnR5a292IDxkZW5pc2NAb3ZlcnRhLnJ1PgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHUzMjsKLQotI2RlZmluZSBJRk1BU0soYSxiKSAgICAgKChvcGNvZGUgJiAoYSkpID09IChiKSkKLSNkZWZpbmUgQ09ERV9NQVggICAgICAgIDY1NTM3Ci0KLXN0YXRpYyBjaGFyKiBTUkVHX2ZsYWdzID0gIkNaTlZTSFRJIjsKLXN0YXRpYyBjaGFyKiBzZWN0OTRbXSA9IHsiQ09NIiwiTkVHIiwiU1dBUCIsIklOQyIsIk5VTEwiLCJBU1IiLCJMU1IiLCJST1IiLAotCQkJIDAsMCwiREVDIiwwLDAsMCwwLDB9Owotc3RhdGljIGNoYXIqIHNlY3Q5OFtdID0geyJDQkkiLCJTQklDIiwiU0JJIiwiU0JJUyJ9Owotc3RhdGljIGNoYXIqIGJyYW5jaHNbXSA9IHsKLSAgIkJSQ1MiLCJCUkVRIiwiQlJNSSIsIkJSVlMiLAotICAiQlJMVCIsIkJSSFMiLCJCUlRTIiwiQlJJRSIsCi0gICJCUkNDIiwiQlJORSIsIkJSUEwiLCJCUlZDIiwKLSAgIkJSR0UiLCJCUkhDIiwiQlJUQyIsIkJSSUQiCi19Owotc3RhdGljIGNoYXIqIGxhc3Q0W10gPSB7IkJMRCIsIkJTVCIsIlNCUkMiLCJTQlJTIn07Ci0KLQotCi1zdGF0aWMgdm9pZCBkaXNwTEREIFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwTEREIChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9ICgoKG9wY29kZSAmIDB4MjAwMCkgPj4gOCkgfCAoKG9wY29kZSAmIDB4MGMwMCkgPj4gNykKLQkgICAgfCAob3Bjb2RlICYgNykpOwotICBzcHJpbnRmKGRlc3QsICIlZCIsIG9wY29kZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcmVnUFAgUEFSQU1TICgodTE2LCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXJlZ1BQIChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9ICgob3Bjb2RlICYgMHgwNjAwKSA+PiA1KSB8IChvcGNvZGUgJiAweGYpOwotICBzcHJpbnRmKGRlc3QsICIweCUwMlgiLCBvcGNvZGUpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZzUwIFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWc1MCAob3Bjb2RlLCBkZXN0KQotICAgICB1MTYgb3Bjb2RlOwotICAgICBjaGFyICpkZXN0OwotewotICBvcGNvZGUgPSAob3Bjb2RlICYgMHgwMWYwKSA+PiA0OwotICBzcHJpbnRmKGRlc3QsICJSJWQiLCBvcGNvZGUpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZzEwNCBQQVJBTVMgKCh1MTYsIGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVnMTA0IChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9IChvcGNvZGUgJiAweGYpIHwgKChvcGNvZGUgJiAweDAyMDApID4+IDUpOwotICBzcHJpbnRmKGRlc3QsICJSJWQiLCBvcGNvZGUpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZzQwIFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWc0MCAob3Bjb2RlLCBkZXN0KQotICAgICB1MTYgb3Bjb2RlOwotICAgICBjaGFyICpkZXN0OwotewotICBvcGNvZGUgPSAob3Bjb2RlICYgMHhmMCkgPj4gNDsKLSAgc3ByaW50ZihkZXN0LCAiUiVkIiwgb3Bjb2RlICsgMTYpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZzIwdyBQQVJBTVMgKCh1MTYsIGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVnMjB3IChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9IChvcGNvZGUgJiAweDMwKSA+PiA0OwotICBzcHJpbnRmKGRlc3QsICJSJWQiLCAyNCArIG9wY29kZSAqIDIpOwotfQotCi0KLXN0YXRpYyB2b2lkIGxpdDQwNCBQQVJBTVMgKCh1MTYsIGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotbGl0NDA0IChvcGNvZGUsIGRlc3QpCi0gICAgIHUxNiBvcGNvZGU7Ci0gICAgIGNoYXIgKmRlc3Q7Ci17Ci0gIG9wY29kZSA9ICgob3Bjb2RlICYgMHhmMDApID4+IDQpIHwgKG9wY29kZSAmIDB4Zik7Ci0gIHNwcmludGYoZGVzdCwgIjB4JTAyWCIsIG9wY29kZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgbGl0MjA0IFBBUkFNUyAoKHUxNiwgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1saXQyMDQgKG9wY29kZSwgZGVzdCkKLSAgICAgdTE2IG9wY29kZTsKLSAgICAgY2hhciAqZGVzdDsKLXsKLSAgb3Bjb2RlID0gKChvcGNvZGUgJiAweGMwKSA+PiAyKSB8IChvcGNvZGUgJiAweGYpOwotICBzcHJpbnRmKGRlc3QsICIweCUwMlgiLCBvcGNvZGUpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkZDBmZmYgUEFSQU1TICgodTE2LCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotYWRkMGZmZiAob3AsIGRlc3QsIHBjKQotICAgICB1MTYgb3A7Ci0gICAgIGNoYXIgKmRlc3Q7Ci0gICAgIGludCBwYzsKLXsKLSAgaW50IG9wY29kZSA9IG9wICYgMHgwZmZmOwotICBzcHJpbnRmKGRlc3QsICIuJSstOGQgOyAweCUwNlgiLCBvcGNvZGUgKiAyLCBwYyArIDIgKyBvcGNvZGUgKiAyKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhZGQwM2Y4IFBBUkFNUyAoKHUxNiwgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLWFkZDAzZjggKG9wLCBkZXN0LCBwYykKLSAgICAgdTE2IG9wOwotICAgICBjaGFyICpkZXN0OwotICAgICBpbnQgcGM7Ci17Ci0gIGludCBvcGNvZGUgPSAob3AgPj4gMykgJiAweDdmOwotICBzcHJpbnRmKGRlc3QsICIuJSstOGQgOyAweCUwNlgiLCBvcGNvZGUgKiAyLCBwYyArIDIgKyBvcGNvZGUgKiAyKTsKLX0KLQotCi1zdGF0aWMgdTE2IGF2cmRpc19vcGNvZGUgUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyB1MTYKLWF2cmRpc19vcGNvZGUgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotICBpbnQgc3RhdHVzOwotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jKGFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyhzdGF0dXMsIGFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci19Ci0KLQotaW50Ci1wcmludF9pbnNuX2F2cihhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNoYXIgcnJbMjAwXTsKLSAgY2hhciByZFsyMDBdOwotICB1MTYgb3Bjb2RlOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgcHJpbiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgaW50IGNtZF9sZW4gPSAyOwotCi0gIG9wY29kZSA9IGF2cmRpc19vcGNvZGUgKGFkZHIsIGluZm8pOwotCi0gIGlmIChJRk1BU0soMHhkMDAwLCAweDgwMDApKQotICAgIHsKLSAgICAgIGNoYXIgbGV0dGVyOwotICAgICAgcmVnNTAob3Bjb2RlLCByZCk7Ci0gICAgICBkaXNwTEREKG9wY29kZSwgcnIpOwotICAgICAgaWYgKG9wY29kZSAmIDgpCi0JbGV0dGVyID0gJ1knOwotICAgICAgZWxzZQotCWxldHRlciA9ICdaJzsKLSAgICAgIGlmIChvcGNvZGUgJiAweDAyMDApCi0JKCpwcmluKSAoc3RyZWFtLCAiICAgIFNURCAgICAgJWMrJXMsJXMiLCBsZXR0ZXIsIHJyLCByZCk7Ci0gICAgICBlbHNlCi0JKCpwcmluKSAoc3RyZWFtLCAiICAgIExERCAgICAgJXMsJWMrJXMiLCByZCwgbGV0dGVyLCBycik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChvcGNvZGUgJiAweGYwMDApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAweDAwMDA6Ci0JICB7Ci0JICAgIHJlZzUwKG9wY29kZSwgcmQpOwotCSAgICByZWcxMDQob3Bjb2RlLCBycik7Ci0JICAgIHN3aXRjaCAob3Bjb2RlICYgMHgwYzAwKQotCSAgICAgIHsKLQkgICAgICBjYXNlIDB4MDAwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIE5PUCIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MDQwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIENQQyAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MDgwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIFNCQyAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MGMwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIEFERCAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSAweDEwMDA6Ci0JICB7Ci0JICAgIHJlZzUwKG9wY29kZSwgcmQpOwotCSAgICByZWcxMDQob3Bjb2RlLCBycik7Ci0JICAgIHN3aXRjaCAob3Bjb2RlICYgMHgwYzAwKQotCSAgICAgIHsKLQkgICAgICBjYXNlIDB4MDAwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIENQU0UgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MDQwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIENQICAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MDgwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIFNVQiAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MGMwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIEFEQyAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSAweDIwMDA6Ci0JICB7Ci0JICAgIHJlZzUwKG9wY29kZSwgcmQpOwotCSAgICByZWcxMDQob3Bjb2RlLCBycik7Ci0JICAgIHN3aXRjaCAob3Bjb2RlICYgMHgwYzAwKQotCSAgICAgIHsKLQkgICAgICBjYXNlIDB4MDAwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIEFORCAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MDQwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIEVPUiAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MDgwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIE9SICAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MGMwMDoKLQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIE1PViAgICAgJXMsJXMiLCByZCwgcnIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSAweDMwMDA6Ci0JICB7Ci0JICAgIHJlZzQwKG9wY29kZSwgcmQpOwotCSAgICBsaXQ0MDQob3Bjb2RlLCBycik7Ci0JICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBDUEkgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAgICBjYXNlIDB4NDAwMDoKLQkgIHsKLQkgICAgcmVnNDAob3Bjb2RlLCByZCk7Ci0JICAgIGxpdDQwNChvcGNvZGUsIHJyKTsKLQkgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIFNCQ0kgICAgJXMsJXMiLCByZCwgcnIpOwotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHg1MDAwOgotCSAgewotCSAgICByZWc0MChvcGNvZGUsIHJkKTsKLQkgICAgbGl0NDA0KG9wY29kZSwgcnIpOwotCSAgICAoKnByaW4pIChzdHJlYW0sICIgICAgU1VCSSAgICAlcywlcyIsIHJkLCBycik7Ci0JICB9Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSAweDYwMDA6Ci0JICB7Ci0JICAgIHJlZzQwKG9wY29kZSwgcmQpOwotCSAgICBsaXQ0MDQob3Bjb2RlLCBycik7Ci0JICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBPUkkgICAgICVzLCVzIiwgcmQsIHJyKTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAgICBjYXNlIDB4NzAwMDoKLQkgIHsKLQkgICAgcmVnNDAob3Bjb2RlLCByZCk7Ci0JICAgIGxpdDQwNChvcGNvZGUsIHJyKTsKLQkgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIEFOREkgICAgJXMsJXMiLCByZCwgcnIpOwotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHg5MDAwOgotCSAgewotCSAgICBzd2l0Y2ggKG9wY29kZSAmIDB4MGUwMCkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAweDAwMDA6Ci0JCXsKLQkJICByZWc1MChvcGNvZGUsIHJkKTsKLQkJICBzd2l0Y2ggKG9wY29kZSAmIDB4ZikKLQkJICAgIHsKLQkJICAgIGNhc2UgMHgwOgotCQkgICAgICB7Ci0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgTERTICAgICAlcywweCUwNFgiLCByZCwKLQkJCQkgYXZyZGlzX29wY29kZShhZGRyICsgMiwgaW5mbykpOwotCQkJY21kX2xlbiA9IDQ7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4MToKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIExEICAgICAgJXMsWisiLCByZCk7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4MjoKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIExEICAgICAgJXMsLVoiLCByZCk7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4OToKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIExEICAgICAgJXMsWSsiLCByZCk7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4YToKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIExEICAgICAgJXMsLVkiLCByZCk7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4YzoKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIExEICAgICAgJXMsWCIsIHJkKTsKLQkJICAgICAgfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHhkOgotCQkgICAgICB7Ci0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgTEQgICAgICAlcyxYKyIsIHJkKTsKLQkJICAgICAgfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHhlOgotCQkgICAgICB7Ci0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgTEQgICAgICAlcywtWCIsIHJkKTsKLQkJICAgICAgfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHhmOgotCQkgICAgICB7Ci0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgUE9QICAgICAlcyIsIHJkKTsKLQkJICAgICAgfQotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIHsKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICA/Pz8/Iik7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDAyMDA6Ci0JCXsKLQkJICByZWc1MChvcGNvZGUsIHJkKTsKLQkJICBzd2l0Y2ggKG9wY29kZSAmIDB4ZikKLQkJICAgIHsKLQkJICAgIGNhc2UgMHgwOgotCQkgICAgICB7Ci0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgU1RTICAgICAweCUwNFgsJXMiLAotCQkJCSBhdnJkaXNfb3Bjb2RlKGFkZHIgKyAyLCBpbmZvKSwgcmQpOwotCQkJY21kX2xlbiA9IDQ7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4MToKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIFNUICAgICAgWissJXMiLCByZCk7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4MjoKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIFNUICAgICAgLVosJXMiLCByZCk7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4OToKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIFNUICAgICAgWSssJXMiLCByZCk7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4YToKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIFNUICAgICAgLVksJXMiLCByZCk7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDB4YzoKLQkJICAgICAgewotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIFNUICAgICAgWCwlcyIsIHJkKTsKLQkJICAgICAgfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHhkOgotCQkgICAgICB7Ci0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgU1QgICAgICBYKywlcyIsIHJkKTsKLQkJICAgICAgfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHhlOgotCQkgICAgICB7Ci0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgU1QgICAgICAtWCwlcyIsIHJkKTsKLQkJICAgICAgfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMHhmOgotCQkgICAgICB7Ci0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgUFVTSCAgICAlcyIsIHJkKTsKLQkJICAgICAgfQotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIHsKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICA/Pz8/Iik7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDA0MDA6Ci0JCXsKLQkJICBpZiAoSUZNQVNLKDB4MDIwYywgMHgwMDBjKSkKLQkJICAgIHsKLQkJICAgICAgdTMyIGsgPSAoKG9wY29kZSAmIDB4MDFmMCkgPj4gMykgfCAob3Bjb2RlICYgMSk7Ci0JCSAgICAgIGsgPSAoayA8PCAxNikgfCBhdnJkaXNfb3Bjb2RlKGFkZHIgKyAyLCBpbmZvKTsKLQkJICAgICAgaWYgKG9wY29kZSAmIDB4MDAwMikKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBDQUxMICAgIDB4JTA2WCIsIGsqMik7Ci0JCSAgICAgIGVsc2UKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBKTVAgICAgIDB4JTA2WCIsIGsqMik7Ci0JCSAgICAgIGNtZF9sZW4gPSA0OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKElGTUFTSygweDAxMGYsIDB4MDAwOCkpCi0JCSAgICB7Ci0JCSAgICAgIGludCBzZiA9IChvcGNvZGUgJiAweDcwKSA+PiA0OwotCQkgICAgICBpZiAob3Bjb2RlICYgMHgwMDgwKQotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIENMJWMiLCBTUkVHX2ZsYWdzW3NmXSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBTRSVjIiwgU1JFR19mbGFnc1tzZl0pOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKElGTUFTSygweDAwMGYsIDB4MDAwOSkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvcGNvZGUgJiAweDAxMDApCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgSUNBTEwiKTsKLQkJICAgICAgZWxzZQotCQkJKCpwcmluKSAoc3RyZWFtLCAiICAgIElKTVAiKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChJRk1BU0soMHgwMTBmLCAweDAxMDgpKQotCQkgICAgewotCQkgICAgICBpZiAoSUZNQVNLKDB4MDA5MCwgMHgwMDAwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBSRVQiKTsKLQkJICAgICAgZWxzZSBpZiAoSUZNQVNLKDB4MDA5MCwgMHgwMDEwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBSRVRJIik7Ci0JCSAgICAgIGVsc2UgaWYgKElGTUFTSygweDAwZTAsIDB4MDA4MCkpCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgU0xFRVAiKTsKLQkJICAgICAgZWxzZSBpZiAoSUZNQVNLKDB4MDBlMCwgMHgwMGEwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBXRFIiKTsKLQkJICAgICAgZWxzZSBpZiAoSUZNQVNLKDB4MDBmMCwgMHgwMGMwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBMUE0iKTsKLQkJICAgICAgZWxzZSBpZiAoSUZNQVNLKDB4MDBmMCwgMHgwMGQwKSkKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBFTFBNIik7Ci0JCSAgICAgIGVsc2UKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICA/Pz8/Iik7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyKiBwOwotCQkgICAgICByZWc1MChvcGNvZGUsIHJkKTsKLQkJICAgICAgcCA9IHNlY3Q5NFtvcGNvZGUgJiAweGZdOwotCQkgICAgICBpZiAoIXApCi0JCQlwID0gIj8/Pz8iOwotCQkgICAgICAoKnByaW4pIChzdHJlYW0sICIgICAgJS04cyVzIiwgcCwgcmQpOwotCQkgICAgfQotCQl9Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHgwNjAwOgotCQl7Ci0JCSAgaWYgKG9wY29kZSAmIDB4MDIwMCkKLQkJICAgIHsKLQkJICAgICAgbGl0MjA0KG9wY29kZSwgcmQpOwotCQkgICAgICByZWcyMHcob3Bjb2RlLCBycik7Ci0JCSAgICAgIGlmIChvcGNvZGUgJiAweDAxMDApCi0JCQkoKnByaW4pIChzdHJlYW0sICIgICAgU0JJVyAgICAlcywlcyIsIHJyLCByZCk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqcHJpbikgKHN0cmVhbSwgIiAgICBBRElXICAgICVzLCVzIiwgcnIsIHJkKTsKLQkJICAgIH0KLQkJfQotCQlicmVhazsKLQkgICAgICBjYXNlIDB4MDgwMDoKLQkgICAgICBjYXNlIDB4MGEwMDoKLQkJewotCQkgICgqcHJpbikgKHN0cmVhbSwgIiAgICAlLThzMHglMDJYLCVkIiwKLQkJCSAgIHNlY3Q5OFsob3Bjb2RlICYgMHgwMzAwKSA+PiA4XSwKLQkJCSAgIChvcGNvZGUgJiAweGY4KSA+PiAzLAotCQkJICAgb3Bjb2RlICYgNyk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJewotCQkgIHJlZzUwKG9wY29kZSwgcmQpOwotCQkgIHJlZzEwNChvcGNvZGUsIHJyKTsKLQkJICAoKnByaW4pIChzdHJlYW0sICIgICAgTVVMICAgICAlcywlcyIsIHJkLCBycik7Ci0JCX0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSAweGIwMDA6Ci0JICB7Ci0JICAgIHJlZzUwKG9wY29kZSwgcmQpOwotCSAgICByZWdQUChvcGNvZGUsIHJyKTsKLQkgICAgaWYgKG9wY29kZSAmIDB4MDgwMCkKLQkgICAgICAoKnByaW4pIChzdHJlYW0sICIgICAgT1VUICAgICAlcywlcyIsIHJyLCByZCk7Ci0JICAgIGVsc2UKLQkgICAgICAoKnByaW4pIChzdHJlYW0sICIgICAgSU4gICAgICAlcywlcyIsIHJkLCBycik7Ci0JICB9Ci0JICBicmVhazsKLSAgICAgICAgY2FzZSAweGMwMDA6Ci0JICB7Ci0JICAgIGFkZDBmZmYob3Bjb2RlLCByZCwgYWRkcik7Ci0JICAgICgqcHJpbikgKHN0cmVhbSwgIiAgICBSSk1QICAgICVzIiwgcmQpOwotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHhkMDAwOgotCSAgewotCSAgICBhZGQwZmZmKG9wY29kZSwgcmQsIGFkZHIpOwotCSAgICAoKnByaW4pIChzdHJlYW0sICIgICAgUkNBTEwgICAlcyIsIHJkKTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICAgICBjYXNlIDB4ZTAwMDoKLQkgIHsKLQkgICAgcmVnNDAob3Bjb2RlLCByZCk7Ci0JICAgIGxpdDQwNChvcGNvZGUsIHJyKTsKLQkgICAgKCpwcmluKSAoc3RyZWFtLCAiICAgIExESSAgICAgJXMsJXMiLCByZCwgcnIpOwotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHhmMDAwOgotCSAgewotCSAgICBpZiAob3Bjb2RlICYgMHgwODAwKQotCSAgICAgIHsKLQkJcmVnNTAob3Bjb2RlLCByZCk7Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICAlLThzJXMsJWQiLAotCQkJIGxhc3Q0WyhvcGNvZGUgJiAweDA2MDApID4+IDldLAotCQkJIHJkLCBvcGNvZGUgJiA3KTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNoYXIqIHA7Ci0JCWFkZDAzZjgob3Bjb2RlLCByZCwgYWRkcik7Ci0JCXAgPSBicmFuY2hzWygob3Bjb2RlICYgMHgwNDAwKSA+PiA3KSB8IChvcGNvZGUgJiA3KV07Ci0JCSgqcHJpbikgKHN0cmVhbSwgIiAgICAlLThzJXMiLCBwLCByZCk7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiBjbWRfbGVuOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLWFzbS5jIGIvb3Bjb2Rlcy9jZ2VuLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ2OTM2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY2dlbi1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKiBDR0VOIGdlbmVyaWMgYXNzZW1ibGVyIHN1cHBvcnQgY29kZS4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBTZXQgdGhlIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiBjYWxsYmFjay4gICovCi0KLXZvaWQKLWNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4gKGNkLCBmbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGZuOwotewotICBjZC0+cGFyc2Vfb3BlcmFuZF9mbiA9IGZuOwotfQotCi0vKiBDYWxsZWQgd2hlbmV2ZXIgc3RhcnRpbmcgdG8gcGFyc2UgYW4gaW5zbi4gICovCi0KLXZvaWQKLWNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgLyogVGhpcyB0ZWxscyB0aGUgY2FsbGJhY2sgdG8gcmUtaW5pdGlhbGl6ZS4gICovCi0gICh2b2lkKSAoKiBjZC0+cGFyc2Vfb3BlcmFuZF9mbikKLSAgICAoY2QsIENHRU5fUEFSU0VfT1BFUkFORF9JTklULCBOVUxMLCAwLCAwLCBOVUxMLCBOVUxMKTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9hc21faGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgIENPVU5UIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gSU5TTlMuCi0gICBFTlRTSVpFIGlzIHNpemVvZiAoQ0dFTl9JQkFTRSkgZm9yIHRoZSB0YXJnZXQuCi0gICA/Pz8gTm8gbG9uZ2VyIHVzZWQgYnV0IGxlYXZlIGluIGZvciBub3cuCi0gICBIVEFCTEUgcG9pbnRzIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgSEVOVEJVRiBpcyBhIHBvaW50ZXIgdG8gc3VmZmljaWVudGx5IGxhcmdlIGJ1ZmZlciBvZiBoYXNoIGVudHJpZXMuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBlbnRyeSB0byB1c2UuCi0KLSAgIFRoZSB0YWJsZSBpcyBzY2FubmVkIGJhY2t3YXJkcyBhcyBhZGRpdGlvbnMgYXJlIG1hZGUgdG8gdGhlIGZyb250IG9mIHRoZQotICAgbGlzdCBhbmQgd2Ugd2FudCBlYXJsaWVyIG9uZXMgdG8gYmUgcHJlZmVyZWQuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2FycmF5IChjZCwgaW5zbnMsIGNvdW50LCBlbnRzaXplLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbnM7Ci0gICAgIGludCBjb3VudDsKLSAgICAgaW50IGVudHNpemU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqaGVudGJ1ZjsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gY291bnQgLSAxOyBpID49IDA7IC0taSwgKytoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gJmluc25zW2ldOwotCi0gICAgICBpZiAoISAoKiBjZC0+YXNtX2hhc2hfcCkgKGluc24pKQotCWNvbnRpbnVlOwotICAgICAgaGFzaCA9ICgqIGNkLT5hc21faGFzaCkgKENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZVtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbnNuOwotICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfYXNtX2hhc2hfdGFibGUgdG8gYWRkIElOU05TIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaGFzaF9pbnNuX2FycmF5IGV4Y2VwdCB0aGUgaW5zbnMgYXJlCi0gICBpbiBhIGxpc3QuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNucywgaHRhYmxlLCBoZW50YnVmKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbnM7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqaGVudGJ1ZjsKLXsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OwotCi0gIGZvciAoaWxpc3QgPSBpbnNuczsgaWxpc3QgIT0gTlVMTDsgaWxpc3QgPSBpbGlzdC0+bmV4dCwgKysgaGVudGJ1ZikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICAgICAgaWYgKCEgKCogY2QtPmFzbV9oYXNoX3ApIChpbGlzdC0+aW5zbikpCi0JY29udGludWU7Ci0gICAgICBoYXNoID0gKCogY2QtPmFzbV9oYXNoKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbGlzdC0+aW5zbikpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZVtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbGlzdC0+aW5zbjsKLSAgICAgIGh0YWJsZVtoYXNoXSA9IGhlbnRidWY7Ci0gICAgfQotCi0gIHJldHVybiBoZW50YnVmOwotfQotCi0vKiBCdWlsZCB0aGUgYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfYXNtX2hhc2hfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgY291bnQgPSBjZ2VuX2luc25fY291bnQgKGNkKSArIGNnZW5fbWFjcm9faW5zbl9jb3VudCAoY2QpOwotICBDR0VOX0lOU05fVEFCTEUgKmluc25fdGFibGUgPSAmY2QtPmluc25fdGFibGU7Ci0gIENHRU5fSU5TTl9UQUJMRSAqbWFjcm9faW5zbl90YWJsZSA9ICZjZC0+bWFjcm9faW5zbl90YWJsZTsKLSAgdW5zaWduZWQgaW50IGhhc2hfc2l6ZSA9IGNkLT5hc21faGFzaF9zaXplOwotICBDR0VOX0lOU05fTElTVCAqaGFzaF9lbnRyeV9idWY7Ci0gIENHRU5fSU5TTl9MSVNUICoqYXNtX2hhc2hfdGFibGU7Ci0gIENHRU5fSU5TTl9MSVNUICphc21faGFzaF90YWJsZV9lbnRyaWVzOwotCi0gIC8qIFRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKLSAgICAgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBoYXNoIGxpc3RzLiAgKi8KLQotICBhc21faGFzaF90YWJsZSA9IChDR0VOX0lOU05fTElTVCAqKikKLSAgICB4bWFsbG9jIChoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgbWVtc2V0IChhc21faGFzaF90YWJsZSwgMCwgaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIGFzbV9oYXNoX3RhYmxlX2VudHJpZXMgPSBoYXNoX2VudHJ5X2J1ZiA9IChDR0VOX0lOU05fTElTVCAqKQotICAgIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCkpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBpbnNucy4KLSAgICAgRG9uJ3QgaW5jbHVkZSB0aGUgZmlyc3Qgb25lIGFzIGl0IGlzIGEgcmVzZXJ2ZWQgZW50cnkuICAqLwotICAvKiA/Pz8gSXQgd2FzIHRoZSBlbmQgb2YgYWxsIGhhc2ggY2hhaW5zLCBhbmQgYWxzbyB0aGUgc3BlY2lhbAotICAgICAiaW52YWxpZCBpbnNuIiBtYXJrZXIuICBNYXkgYmUgYWJsZSB0byBkbyBpdCBkaWZmZXJlbnRseSBub3cuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwKLQkJCQkgICAgaW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzICsgMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcyAtIDEsCi0JCQkJICAgIGluc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGFzbV9oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsIG1hY3JvX2luc25fdGFibGUtPmluaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBpbnNucy4KLSAgICAgTGF0ZXIgYWRkZWQgaW5zbnMgd2lsbCBiZSBwcmVmZXJlZCBvdmVyIGVhcmxpZXIgb25lcy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fbGlzdCAoY2QsIGluc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkJCSAgIGFzbV9oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfaW5zbl9saXN0IChjZCwgbWFjcm9faW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCSAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICBjZC0+YXNtX2hhc2hfdGFibGUgPSBhc21faGFzaF90YWJsZTsKLSAgY2QtPmFzbV9oYXNoX3RhYmxlX2VudHJpZXMgPSBhc21faGFzaF90YWJsZV9lbnRyaWVzOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBoYXNoIGxpc3QgZm9yIElOU04uICAqLwotCi1DR0VOX0lOU05fTElTVCAqCi1jZ2VuX2FzbV9sb29rdXBfaW5zbiAoY2QsIGluc24pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKmluc247Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChjZC0+YXNtX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9hc21faGFzaF90YWJsZSAoY2QpOwotCi0gIGhhc2ggPSAoKiBjZC0+YXNtX2hhc2gpIChpbnNuKTsKLSAgcmV0dXJuIGNkLT5hc21faGFzaF90YWJsZVtoYXNoXTsKLX0KLQwKLS8qIEtleXdvcmQgcGFyc2VyLgotICAgVGhlIHJlc3VsdCBpcyBOVUxMIHVwb24gc3VjY2VzcyBvciBhbiBlcnJvciBtZXNzYWdlLgotICAgSWYgc3VjY2Vzc2Z1bCwgKlNUUlAgaXMgdXBkYXRlZCB0byBwb2ludCBwYXNzZWQgdGhlIGtleXdvcmQuCi0KLSAgID8/PyBBdCBwcmVzZW50IHdlIGhhdmUgYSBzdGF0aWMgbm90aW9uIG9mIGhvdyB0byBwaWNrIG91dCBhIGtleXdvcmQuCi0gICBMYXRlciB3ZSBjYW4gYWxsb3cgYSB0YXJnZXQgdG8gY3VzdG9taXplIHRoaXMgaWYgbmVjZXNzYXJ5IFtzYXkgYnkKLSAgIHJlY29yZGluZyBzb21ldGhpbmcgaW4gdGhlIGtleXdvcmQgdGFibGVdLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCBrZXl3b3JkX3RhYmxlLCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLSAgY2hhciBidWZbMjU2XTsKLSAgY29uc3QgY2hhciAqcCwqc3RhcnQ7Ci0KLSAgcCA9IHN0YXJ0ID0gKnN0cnA7Ci0KLSAgLyogQWxsb3cgYW55IGZpcnN0IGNoYXJhY3Rlci4KLSAgICAgTm90ZSB0aGF0IHRoaXMgYWxsb3dzIHJlY29nbml6aW5nICIsYSIgZm9yIHRoZSBhbm51bCBmbGFnIGluIHNwYXJjCi0gICAgIGV2ZW4gdGhvdWdoICIsIiBpcyBzdWJzZXF1ZW50bHkgbm90IGEgdmFsaWQga2V5d29yZCBjaGFyLiAgKi8KLSAgaWYgKCpwKQotICAgICsrcDsKLQotICAvKiBOb3cgYWxsb3cgbGV0dGVycywgZGlnaXRzLCBhbmQgXy4gICovCi0gIHdoaWxlICgoKHAgLSBzdGFydCkgPCAoaW50KSBzaXplb2YgKGJ1ZikpCi0JICYmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnApIHx8ICpwID09ICdfJykpCi0gICAgKytwOwotCi0gIGlmIChwIC0gc3RhcnQgPj0gKGludCkgc2l6ZW9mIChidWYpKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQga2V5d29yZC9yZWdpc3RlciBuYW1lIik7Ci0KLSAgbWVtY3B5IChidWYsIHN0YXJ0LCBwIC0gc3RhcnQpOwotICBidWZbcCAtIHN0YXJ0XSA9IDA7Ci0KLSAga2UgPSBjZ2VuX2tleXdvcmRfbG9va3VwX25hbWUgKGtleXdvcmRfdGFibGUsIGJ1Zik7Ci0KLSAgaWYgKGtlICE9IE5VTEwpCi0gICAgewotICAgICAgKnZhbHVlcCA9IGtlLT52YWx1ZTsKLSAgICAgIC8qIERvbid0IGFkdmFuY2UgcG9pbnRlciBpZiB3ZSByZWNvZ25pemVkIHRoZSBudWxsIGtleXdvcmQuICAqLwotICAgICAgaWYgKGtlLT5uYW1lWzBdICE9IDApCi0JKnN0cnAgPSBwOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAidW5yZWNvZ25pemVkIGtleXdvcmQvcmVnaXN0ZXIgbmFtZSI7Ci19Ci0KLS8qIFBhcnNlIGEgc21hbGwgc2lnbmVkIGludGVnZXIgcGFyc2VyLgotICAgPz8/IFZBTFVFUCBpcyBub3QgYSBiZmRfdm1hICogb24gcHVycG9zZSwgdGhvdWdoIHRoaXMgaXMgY29uZnVzaW5nLgotICAgTm90ZSB0aGF0IGlmIHRoZSBjYWxsZXIgZXhwZWN0cyBhIGJmZF92bWEgcmVzdWx0LCBpdCBzaG91bGQgY2FsbAotICAgY2dlbl9wYXJzZV9hZGRyZXNzLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOVEVHRVIsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19OT05FLAotICAgICAmcmVzdWx0LCAmdmFsdWUpOwotICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCi0gIGlmICghZXJybXNnKQotICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogUGFyc2UgYSBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHBhcnNlci4KLSAgID8/PyBWQUxVRVAgaXMgbm90IGEgYmZkX3ZtYSAqIG9uIHB1cnBvc2UsIHRob3VnaCB0aGlzIGlzIGNvbmZ1c2luZy4KLSAgIE5vdGUgdGhhdCBpZiB0aGUgY2FsbGVyIGV4cGVjdHMgYSBiZmRfdm1hIHJlc3VsdCwgaXQgc2hvdWxkIGNhbGwKLSAgIGNnZW5fcGFyc2VfYWRkcmVzcy4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOVEVHRVIsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19OT05FLAotICAgICAmcmVzdWx0LCAmdmFsdWUpOwotICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCi0gIGlmICghZXJybXNnKQotICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogQWRkcmVzcyBwYXJzZXIuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIG9waW5mbywgcmVzdWx0cCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGludCBvcGluZm87Ci0gICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqcmVzdWx0cDsKLSAgICAgYmZkX3ZtYSAqdmFsdWVwOwotewotICBiZmRfdm1hIHZhbHVlOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICBlcnJtc2cgPSAoKiBjZC0+cGFyc2Vfb3BlcmFuZF9mbikKLSAgICAoY2QsIENHRU5fUEFSU0VfT1BFUkFORF9BRERSRVNTLCBzdHJwLCBvcGluZGV4LCBvcGluZm8sCi0gICAgICZyZXN1bHRfdHlwZSwgJnZhbHVlKTsKLSAgLyogRklYTUU6IEV4YW1pbmUgYHJlc3VsdCcuICAqLwotICBpZiAoIWVycm1zZykKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0cCAhPSBOVUxMKQotCSpyZXN1bHRwID0gcmVzdWx0X3R5cGU7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgfQotICByZXR1cm4gZXJybXNnOwotfQotDAotLyogU2lnbmVkIGludGVnZXIgdmFsaWRhdGlvbiByb3V0aW5lLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3ZhbGlkYXRlX3NpZ25lZF9pbnRlZ2VyICh2YWx1ZSwgbWluLCBtYXgpCi0gICAgIGxvbmcgdmFsdWUsIG1pbiwgbWF4OwotewotICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChidWYsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIiksCi0JCSAgICAgIHZhbHVlLCBtaW4sIG1heCk7Ci0gICAgICByZXR1cm4gYnVmOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVW5zaWduZWQgaW50ZWdlciB2YWxpZGF0aW9uIHJvdXRpbmUuCi0gICBTdXBwbHlpbmcgYG1pbicgaGVyZSBtYXkgc2VlbSB1bm5lY2Vzc2FyeSwgYnV0IHdlIGFsc28gd2FudCB0byBoYW5kbGUKLSAgIGNhc2VzIHdoZXJlIG1pbiAhPSAwIChhbmQgbWF4ID4gTE9OR19NQVgpLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3ZhbGlkYXRlX3Vuc2lnbmVkX2ludGVnZXIgKHZhbHVlLCBtaW4sIG1heCkKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbWluLCBtYXg7Ci17Ci0gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAlbHUgYW5kICVsdSkiKSwKLQkgICAgICAgdmFsdWUsIG1pbiwgbWF4KTsKLSAgICAgIHJldHVybiBidWY7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLWRpcy5jIGIvb3Bjb2Rlcy9jZ2VuLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGIxY2Q5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY2dlbi1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKiBDR0VOIGdlbmVyaWMgZGlzYXNzZW1ibGVyIHN1cHBvcnQgY29kZS4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9kaXNfaGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgIENPVU5UIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gSU5TTlMuCi0gICBFTlRTSVpFIGlzIHNpemVvZiAoQ0dFTl9JQkFTRSkgZm9yIHRoZSB0YXJnZXQuCi0gICA/Pz8gTm8gbG9uZ2VyIHVzZWQgYnV0IGxlYXZlIGluIGZvciBub3cuCi0gICBIVEFCTEUgcG9pbnRzIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgSEVOVEJVRiBpcyBhIHBvaW50ZXIgdG8gc3VmZmljaWVudGx5IGxhcmdlIGJ1ZmZlciBvZiBoYXNoIGVudHJpZXMuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBlbnRyeSB0byB1c2UuCi0KLSAgIFRoZSB0YWJsZSBpcyBzY2FubmVkIGJhY2t3YXJkcyBhcyBhZGRpdGlvbnMgYXJlIG1hZGUgdG8gdGhlIGZyb250IG9mIHRoZQotICAgbGlzdCBhbmQgd2Ugd2FudCBlYXJsaWVyIG9uZXMgdG8gYmUgcHJlZmVyZWQuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2FycmF5IChjZCwgaW5zbnMsIGNvdW50LCBlbnRzaXplLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqIGluc25zOwotICAgICBpbnQgY291bnQ7Ci0gICAgIGludCBlbnRzaXplOwotICAgICBDR0VOX0lOU05fTElTVCAqKiBodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICogaGVudGJ1ZjsKLXsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgLS1pLCArK2hlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0gICAgICBjaGFyIGJ1ZiBbNF07Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gJmluc25zW2ldOwotCi0gICAgICBpZiAoISAoKiBjZC0+ZGlzX2hhc2hfcCkgKGluc24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHRhcmdldCB1c2VzIHRoZSBidWZmZXIgb3IgdGhlIGJhc2UgaW5zbgotCSB0byBoYXNoIG9uLCBzbyBzZXQgYm90aCB1cC4gICovCi0KLSAgICAgIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pOwotICAgICAgc3dpdGNoIChDR0VOX0lOU05fTUFTS19CSVRTSVpFIChpbnNuKSkKLQl7Ci0JY2FzZSA4OgotCSAgYnVmWzBdID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDE2OgotCSAgaWYgKGJpZ19wKQotCSAgICBiZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGJyZWFrOwotCWNhc2UgMzI6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaGFzaCA9ICgqIGNkLT5kaXNfaGFzaCkgKGJ1ZiwgdmFsdWUpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZVtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbnNuOwotICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfZGlzX2hhc2hfdGFibGUgdG8gYWRkIElOU05TIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaGFzaF9pbnNuX2FycmF5IGV4Y2VwdCB0aGUgaW5zbnMgYXJlCi0gICBpbiBhIGxpc3QuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNucywgaHRhYmxlLCBoZW50YnVmKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbnM7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqaGVudGJ1ZjsKLXsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotICBjb25zdCBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0KLSAgZm9yIChpbGlzdCA9IGluc25zOyBpbGlzdCAhPSBOVUxMOyBpbGlzdCA9IGlsaXN0LT5uZXh0LCArKyBoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotICAgICAgY2hhciBidWZbNF07Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0gICAgICBpZiAoISAoKiBjZC0+ZGlzX2hhc2hfcCkgKGlsaXN0LT5pbnNuKSkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSB0YXJnZXQgdXNlcyB0aGUgYnVmZmVyIG9yIHRoZSBiYXNlIGluc24KLQkgdG8gaGFzaCBvbiwgc28gc2V0IGJvdGggdXAuICAqLwotCi0gICAgICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbGlzdC0+aW5zbik7Ci0gICAgICBzd2l0Y2ggKENHRU5fSU5TTl9NQVNLX0JJVFNJWkUgKGlsaXN0LT5pbnNuKSkKLQl7Ci0JY2FzZSA4OgotCSAgYnVmWzBdID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDE2OgotCSAgaWYgKGJpZ19wKQotCSAgICBiZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGJyZWFrOwotCWNhc2UgMzI6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaGFzaCA9ICgqIGNkLT5kaXNfaGFzaCkgKGJ1ZiwgdmFsdWUpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZSBbaGFzaF07Ci0gICAgICBoZW50YnVmLT5pbnNuID0gaWxpc3QtPmluc247Ci0gICAgICBodGFibGUgW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBkaXNhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9kaXNfaGFzaF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNnZW5faW5zbl9jb3VudCAoY2QpICsgY2dlbl9tYWNyb19pbnNuX2NvdW50IChjZCk7Ci0gIENHRU5fSU5TTl9UQUJMRSAqaW5zbl90YWJsZSA9ICYgY2QtPmluc25fdGFibGU7Ci0gIENHRU5fSU5TTl9UQUJMRSAqbWFjcm9faW5zbl90YWJsZSA9ICYgY2QtPm1hY3JvX2luc25fdGFibGU7Ci0gIHVuc2lnbmVkIGludCBoYXNoX3NpemUgPSBjZC0+ZGlzX2hhc2hfc2l6ZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmhhc2hfZW50cnlfYnVmOwotICBDR0VOX0lOU05fTElTVCAqKmRpc19oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqZGlzX2hhc2hfdGFibGVfZW50cmllczsKLQotICAvKiBUaGUgc3BhY2UgYWxsb2NhdGVkIGZvciB0aGUgaGFzaCB0YWJsZSBjb25zaXN0cyBvZiB0d28gcGFydHM6Ci0gICAgIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgaGFzaCBsaXN0cy4gICovCi0KLSAgZGlzX2hhc2hfdGFibGUgPSAoQ0dFTl9JTlNOX0xJU1QgKiopCi0gICAgeG1hbGxvYyAoaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIG1lbXNldCAoZGlzX2hhc2hfdGFibGUsIDAsIGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOwotICBkaXNfaGFzaF90YWJsZV9lbnRyaWVzID0gaGFzaF9lbnRyeV9idWYgPSAoQ0dFTl9JTlNOX0xJU1QgKikKLSAgICB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QpKTsKLQotICAvKiBBZGQgY29tcGlsZWQgaW4gaW5zbnMuCi0gICAgIERvbid0IGluY2x1ZGUgdGhlIGZpcnN0IG9uZSBhcyBpdCBpcyBhIHJlc2VydmVkIGVudHJ5LiAgKi8KLSAgLyogPz8/IEl0IHdhcyB0aGUgZW5kIG9mIGFsbCBoYXNoIGNoYWlucywgYW5kIGFsc28gdGhlIHNwZWNpYWwKLSAgICAgImludmFsaWQgaW5zbiIgbWFya2VyLiAgTWF5IGJlIGFibGUgdG8gZG8gaXQgZGlmZmVyZW50bHkgbm93LiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsCi0JCQkJICAgIGluc25fdGFibGUtPmluaXRfZW50cmllcyArIDEsCi0JCQkJICAgIGluc25fdGFibGUtPm51bV9pbml0X2VudHJpZXMgLSAxLAotCQkJCSAgICBpbnNuX3RhYmxlLT5lbnRyeV9zaXplLAotCQkJCSAgICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBtYWNyby1pbnNucy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5pbml0X2VudHJpZXMsCi0JCQkJICAgIG1hY3JvX2luc25fdGFibGUtPm51bV9pbml0X2VudHJpZXMsCi0JCQkJICAgIG1hY3JvX2luc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgaW5zbnMuCi0gICAgIExhdGVyIGFkZGVkIGluc25zIHdpbGwgYmUgcHJlZmVyZWQgb3ZlciBlYXJsaWVyIG9uZXMuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNuX3RhYmxlLT5uZXdfZW50cmllcywKLQkJCQkgICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBydW50aW1lIGFkZGVkIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2luc25fbGlzdCAoY2QsIG1hY3JvX2luc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgY2QtPmRpc19oYXNoX3RhYmxlID0gZGlzX2hhc2hfdGFibGU7Ci0gIGNkLT5kaXNfaGFzaF90YWJsZV9lbnRyaWVzID0gZGlzX2hhc2hfdGFibGVfZW50cmllczsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgaGFzaCBsaXN0IGZvciBJTlNOLiAgKi8KLQotQ0dFTl9JTlNOX0xJU1QgKgotY2dlbl9kaXNfbG9va3VwX2luc24gKGNkLCBidWYsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICogYnVmOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoY2QtPmRpc19oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfZGlzX2hhc2hfdGFibGUgKGNkKTsKLQotICBoYXNoID0gKCogY2QtPmRpc19oYXNoKSAoYnVmLCB2YWx1ZSk7Ci0KLSAgcmV0dXJuIGNkLT5kaXNfaGFzaF90YWJsZVtoYXNoXTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvY2dlbi1vcGMuYyBiL29wY29kZXMvY2dlbi1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlM2FkZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2NnZW4tb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotLyogQ0dFTiBnZW5lcmljIG9wY29kZSBzdXBwb3J0LgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaF9rZXl3b3JkX25hbWUKLSAgUEFSQU1TICgoY29uc3QgQ0dFTl9LRVlXT1JEICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfa2V5d29yZF92YWx1ZQotICBQQVJBTVMgKChjb25zdCBDR0VOX0tFWVdPUkQgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzCi0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqKSk7Ci0KLS8qIFJldHVybiBudW1iZXIgb2YgaGFzaCB0YWJsZSBlbnRyaWVzIHRvIHVzZSBmb3IgTiBlbGVtZW50cy4gICovCi0jZGVmaW5lIEtFWVdPUkRfSEFTSF9TSVpFKG4pICgobikgPD0gMzEgPyAxNyA6IDMxKQotCi0vKiBMb29rIHVwICpOQU1FUCBpbiB0aGUga2V5d29yZCB0YWJsZSBLVC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIGtleXdvcmQgZW50cnkgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgotY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lIChrdCwgbmFtZSkKLSAgICAgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLSAgY29uc3QgY2hhciAqcCwqbjsKLQotICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKLQotICBrZSA9IGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBuYW1lLCAwKV07Ci0KLSAgLyogV2UgZG8gY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29ucy4KLSAgICAgSWYgdGhhdCBldmVyIGJlY29tZXMgYSBwcm9ibGVtLCBhZGQgYW4gYXR0cmlidXRlIHRoYXQgZGVub3RlcwotICAgICAiZG8gY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbnMiLiAgKi8KLQotICB3aGlsZSAoa2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBuID0gbmFtZTsKLSAgICAgIHAgPSBrZS0+bmFtZTsKLQotICAgICAgd2hpbGUgKCpwCi0JICAgICAmJiAoKnAgPT0gKm4KLQkJIHx8IChpc2FscGhhICgodW5zaWduZWQgY2hhcikgKnApCi0JCSAgICAgJiYgKHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcCkKLQkJCSA9PSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKm4pKSkpKQotCSsrbiwgKytwOwotCi0gICAgICBpZiAoISpwICYmICEqbikKLQlyZXR1cm4ga2U7Ci0KLSAgICAgIGtlID0ga2UtPm5leHRfbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGt0LT5udWxsX2VudHJ5KQotICAgIHJldHVybiBrdC0+bnVsbF9lbnRyeTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2sgdXAgVkFMVUUgaW4gdGhlIGtleXdvcmQgdGFibGUgS1QuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBrZXl3b3JkIGVudHJ5IG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoKLWNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGt0LCB2YWx1ZSkKLSAgICAgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgaW50IHZhbHVlOwotewotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIGtlID0ga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwgdmFsdWUpXTsKLQotICB3aGlsZSAoa2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodmFsdWUgPT0ga2UtPnZhbHVlKQotCXJldHVybiBrZTsKLSAgICAgIGtlID0ga2UtPm5leHRfdmFsdWU7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBBZGQgYW4gZW50cnkgdG8gYSBrZXl3b3JkIHRhYmxlLiAgKi8KLQotdm9pZAotY2dlbl9rZXl3b3JkX2FkZCAoa3QsIGtlKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKLQotICBoYXNoID0gaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBrZS0+bmFtZSwgMCk7Ci0gIGtlLT5uZXh0X25hbWUgPSBrdC0+bmFtZV9oYXNoX3RhYmxlW2hhc2hdOwotICBrdC0+bmFtZV9oYXNoX3RhYmxlW2hhc2hdID0ga2U7Ci0KLSAgaGFzaCA9IGhhc2hfa2V5d29yZF92YWx1ZSAoa3QsIGtlLT52YWx1ZSk7Ci0gIGtlLT5uZXh0X3ZhbHVlID0ga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF07Ci0gIGt0LT52YWx1ZV9oYXNoX3RhYmxlW2hhc2hdID0ga2U7Ci0KLSAgaWYgKGtlLT5uYW1lWzBdID09IDApCi0gICAga3QtPm51bGxfZW50cnkgPSBrZTsKLX0KLQotLyogRklYTUU6IE5lZWQgZnVuY3Rpb24gdG8gcmV0dXJuIGNvdW50IG9mIGtleXdvcmRzLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhIGtleXdvcmQgdGFibGUgc2VhcmNoLgotICAgU1BFQyBpcyBhIHNwZWNpZmljYXRpb24gb2Ygd2hhdCB0byBzZWFyY2ggZm9yLgotICAgQSB2YWx1ZSBvZiBOVUxMIG1lYW5zIHRvIGZpbmQgZXZlcnkga2V5d29yZC4KLSAgIEN1cnJlbnRseSBOVUxMIGlzIHRoZSBvbmx5IGFjY2VwdGFibGUgdmFsdWUgW2Z1cnRoZXIgc3BlY2lmaWNhdGlvbgotICAgZGVmZXJyZWRdLgotICAgVGhlIHJlc3VsdCBpcyBhbiBvcGFxdWUgZGF0YSBpdGVtIHVzZWQgdG8gcmVjb3JkIHRoZSBzZWFyY2ggc3RhdHVzLgotICAgSXQgaXMgcGFzc2VkIHRvIGVhY2ggY2FsbCB0byBjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQuICAqLwotCi1DR0VOX0tFWVdPUkRfU0VBUkNICi1jZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQgKGt0LCBzcGVjKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBjb25zdCBjaGFyICpzcGVjOwotewotICBDR0VOX0tFWVdPUkRfU0VBUkNIIHNlYXJjaDsKLQotICAvKiBGSVhNRTogTmVlZCB0byBzcGVjaWZ5IGZvcm1hdCBvZiBQQVJBTVMuICAqLwotICBpZiAoc3BlYyAhPSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIHNlYXJjaC50YWJsZSA9IGt0OwotICBzZWFyY2guc3BlYyA9IHNwZWM7Ci0gIHNlYXJjaC5jdXJyZW50X2hhc2ggPSAwOwotICBzZWFyY2guY3VycmVudF9lbnRyeSA9IE5VTEw7Ci0gIHJldHVybiBzZWFyY2g7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmV4dCBrZXl3b3JkIHNwZWNpZmllZCBieSBTRUFSQ0guCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBuZXh0IGVudHJ5IG9yIE5VTEwgaWYgdGhlcmUgYXJlIG5vIG1vcmUuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgotY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0IChzZWFyY2gpCi0gICAgIENHRU5fS0VZV09SRF9TRUFSQ0ggKnNlYXJjaDsKLXsKLSAgLyogSGFzIHNlYXJjaCBmaW5pc2hlZD8gICovCi0gIGlmIChzZWFyY2gtPmN1cnJlbnRfaGFzaCA9PSBzZWFyY2gtPnRhYmxlLT5oYXNoX3RhYmxlX3NpemUpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU2VhcmNoIGluIHByb2dyZXNzPyAgKi8KLSAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMCi0gICAgICAvKiBBbnl0aGluZyBsZWZ0IG9uIHRoaXMgaGFzaCBjaGFpbj8gICovCi0gICAgICAmJiBzZWFyY2gtPmN1cnJlbnRfZW50cnktPm5leHRfbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNlYXJjaC0+Y3VycmVudF9lbnRyeSA9IHNlYXJjaC0+Y3VycmVudF9lbnRyeS0+bmV4dF9uYW1lOwotICAgICAgcmV0dXJuIHNlYXJjaC0+Y3VycmVudF9lbnRyeTsKLSAgICB9Ci0KLSAgLyogTW92ZSB0byBuZXh0IGhhc2ggY2hhaW4gW3VubGVzcyB3ZSBoYXZlbid0IHN0YXJ0ZWQgeWV0XS4gICovCi0gIGlmIChzZWFyY2gtPmN1cnJlbnRfZW50cnkgIT0gTlVMTCkKLSAgICArK3NlYXJjaC0+Y3VycmVudF9oYXNoOwotCi0gIHdoaWxlIChzZWFyY2gtPmN1cnJlbnRfaGFzaCA8IHNlYXJjaC0+dGFibGUtPmhhc2hfdGFibGVfc2l6ZSkKLSAgICB7Ci0gICAgICBzZWFyY2gtPmN1cnJlbnRfZW50cnkgPSBzZWFyY2gtPnRhYmxlLT5uYW1lX2hhc2hfdGFibGVbc2VhcmNoLT5jdXJyZW50X2hhc2hdOwotICAgICAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMKQotCXJldHVybiBzZWFyY2gtPmN1cnJlbnRfZW50cnk7Ci0gICAgICArK3NlYXJjaC0+Y3VycmVudF9oYXNoOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJuIGZpcnN0IGVudHJ5IGluIGhhc2ggY2hhaW4gZm9yIE5BTUUuCi0gICBJZiBDQVNFX1NFTlNJVElWRV9QIGlzIG5vbi16ZXJvLCByZXR1cm4gYSBjYXNlIHNlbnNpdGl2ZSBoYXNoLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBuYW1lLCBjYXNlX3NlbnNpdGl2ZV9wKQotICAgICBjb25zdCBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgY2FzZV9zZW5zaXRpdmVfcDsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgaWYgKGNhc2Vfc2Vuc2l0aXZlX3ApCi0gICAgZm9yIChoYXNoID0gMDsgKm5hbWU7ICsrbmFtZSkKLSAgICAgIGhhc2ggPSAoaGFzaCAqIDk3KSArICh1bnNpZ25lZCBjaGFyKSAqbmFtZTsKLSAgZWxzZQotICAgIGZvciAoaGFzaCA9IDA7ICpuYW1lOyArK25hbWUpCi0gICAgICBoYXNoID0gKGhhc2ggKiA5NykgKyAodW5zaWduZWQgY2hhcikgdG9sb3dlciAoKm5hbWUpOwotICByZXR1cm4gaGFzaCAlIGt0LT5oYXNoX3RhYmxlX3NpemU7Ci19Ci0KLS8qIFJldHVybiBmaXJzdCBlbnRyeSBpbiBoYXNoIGNoYWluIGZvciBWQUxVRS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWhhc2hfa2V5d29yZF92YWx1ZSAoa3QsIHZhbHVlKQotICAgICBjb25zdCBDR0VOX0tFWVdPUkQgKmt0OwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiB2YWx1ZSAlIGt0LT5oYXNoX3RhYmxlX3NpemU7Ci19Ci0KLS8qIEJ1aWxkIGEga2V5d29yZCB0YWJsZSdzIGhhc2ggdGFibGVzLgotICAgV2UgcHJvYmFibHkgbmVlZG4ndCBidWlsZCB0aGUgdmFsdWUgaGFzaCB0YWJsZSBmb3IgdGhlIGFzc2VtYmxlciB3aGVuCi0gICB3ZSdyZSB1c2luZyB0aGUgZGlzYXNzZW1ibGVyLCBidXQgd2Uga2VlcCB0aGluZ3Mgc2ltcGxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotewotICBpbnQgaTsKLSAgLyogVXNlIHRoZSBudW1iZXIgb2YgY29tcGlsZWQgaW4gZW50cmllcyBhcyBhbiBlc3RpbWF0ZSBmb3IgdGhlCi0gICAgIHR5cGljYWwgc2l6ZWQgdGFibGUgW25vdCB0b28gbWFueSBhZGRlZCBhdCBydW50aW1lXS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplID0gS0VZV09SRF9IQVNIX1NJWkUgKGt0LT5udW1faW5pdF9lbnRyaWVzKTsKLQotICBrdC0+aGFzaF90YWJsZV9zaXplID0gc2l6ZTsKLSAga3QtPm5hbWVfaGFzaF90YWJsZSA9IChDR0VOX0tFWVdPUkRfRU5UUlkgKiopCi0gICAgeG1hbGxvYyAoc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLSAgbWVtc2V0IChrdC0+bmFtZV9oYXNoX3RhYmxlLCAwLCBzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotICBrdC0+dmFsdWVfaGFzaF90YWJsZSA9IChDR0VOX0tFWVdPUkRfRU5UUlkgKiopCi0gICAgeG1hbGxvYyAoc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLSAgbWVtc2V0IChrdC0+dmFsdWVfaGFzaF90YWJsZSwgMCwgc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLQotICAvKiBUaGUgdGFibGUgaXMgc2Nhbm5lZCBiYWNrd2FyZHMgYXMgd2Ugd2FudCBrZXl3b3JkcyBhcHBlYXJpbmcgZWFybGllciB0bwotICAgICBiZSBwcmVmZXJlZCBvdmVyIGxhdGVyIG9uZXMuICAqLwotICBmb3IgKGkgPSBrdC0+bnVtX2luaXRfZW50cmllcyAtIDE7IGkgPj0gMDsgLS1pKQotICAgIGNnZW5fa2V5d29yZF9hZGQgKGt0LCAma3QtPmluaXRfZW50cmllc1tpXSk7Ci19Ci0MCi0vKiBIYXJkd2FyZSBzdXBwb3J0LiAgKi8KLQotLyogTG9va3VwIGEgaGFyZHdhcmUgZWxlbWVudCBieSBpdHMgbmFtZS4KLSAgIFJldHVybnMgTlVMTCBpZiBOQU1FIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgbWFjaC9pc2EuICAqLwotCi1jb25zdCBDR0VOX0hXX0VOVFJZICoKLWNnZW5faHdfbG9va3VwX2J5X25hbWUgKGNkLCBuYW1lKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKmh3ID0gY2QtPmh3X3RhYmxlLmVudHJpZXM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNkLT5od190YWJsZS5udW1fZW50cmllczsgKytpKQotICAgIGlmIChod1tpXSAmJiBzdHJjbXAgKG5hbWUsIGh3W2ldLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIGh3W2ldOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBMb29rdXAgYSBoYXJkd2FyZSBlbGVtZW50IGJ5IGl0cyBudW1iZXIuCi0gICBIYXJkd2FyZSBlbGVtZW50cyBhcmUgZW51bWVyYXRlZCwgaG93ZXZlciBpdCBtYXkgYmUgcG9zc2libGUgdG8gYWRkIHNvbWUKLSAgIGF0IHJ1bnRpbWUsIHRodXMgSFdOVU0gaXMgbm90IGFuIGVudW0gdHlwZSBidXQgcmF0aGVyIGFuIGludC4KLSAgIFJldHVybnMgTlVMTCBpZiBIV05VTSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFjaC4gICovCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgKgotY2dlbl9od19sb29rdXBfYnlfbnVtIChjZCwgaHdudW0pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBod251bTsKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipodyA9IGNkLT5od190YWJsZS5lbnRyaWVzOwotCi0gIC8qID8/PyBUaGlzIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGNkLT5od190YWJsZS5udW1fZW50cmllczsgKytpKQotICAgIGlmIChod1tpXSAmJiBod251bSA9PSBod1tpXS0+dHlwZSkKLSAgICAgIHJldHVybiBod1tpXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIE9wZXJhbmQgc3VwcG9ydC4gICovCi0KLS8qIExvb2t1cCBhbiBvcGVyYW5kIGJ5IGl0cyBuYW1lLgotICAgUmV0dXJucyBOVUxMIGlmIE5BTUUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICBtYWNoL2lzYS4gICovCi0KLWNvbnN0IENHRU5fT1BFUkFORCAqCi1jZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUgKGNkLCBuYW1lKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9PUEVSQU5EICoqb3AgPSBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjZC0+b3BlcmFuZF90YWJsZS5udW1fZW50cmllczsgKytpKQotICAgIGlmIChvcFtpXSAmJiBzdHJjbXAgKG5hbWUsIG9wW2ldLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIG9wW2ldOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBMb29rdXAgYW4gb3BlcmFuZCBieSBpdHMgbnVtYmVyLgotICAgT3BlcmFuZHMgYXJlIGVudW1lcmF0ZWQsIGhvd2V2ZXIgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGFkZCBzb21lCi0gICBhdCBydW50aW1lLCB0aHVzIE9QTlVNIGlzIG5vdCBhbiBlbnVtIHR5cGUgYnV0IHJhdGhlciBhbiBpbnQuCi0gICBSZXR1cm5zIE5VTEwgaWYgT1BOVU0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICBtYWNoL2lzYS4gICovCi0KLWNvbnN0IENHRU5fT1BFUkFORCAqCi1jZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoY2QsIG9wbnVtKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BudW07Ci17Ci0gIHJldHVybiBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzW29wbnVtXTsKLX0KLQwKLS8qIEluc3RydWN0aW9uIHN1cHBvcnQuICAqLwotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bnRpbWUuICAqLwotCi1pbnQKLWNnZW5faW5zbl9jb3VudCAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXM7Ci0gIENHRU5fSU5TTl9MSVNUICpydF9pbnNucyA9IGNkLT5pbnNuX3RhYmxlLm5ld19lbnRyaWVzOwotCi0gIGZvciAoIDsgcnRfaW5zbnMgIT0gTlVMTDsgcnRfaW5zbnMgPSBydF9pbnNucy0+bmV4dCkKLSAgICArK2NvdW50OwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogUmV0dXJuIG51bWJlciBvZiBtYWNyby1pbnN0cnVjdGlvbnMuCi0gICBUaGlzIGluY2x1ZGVzIGFueSBhZGRlZCBhdCBydW50aW1lLiAgKi8KLQotaW50Ci1jZ2VuX21hY3JvX2luc25fY291bnQgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgY291bnQgPSBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzOwotICBDR0VOX0lOU05fTElTVCAqcnRfaW5zbnMgPSBjZC0+bWFjcm9faW5zbl90YWJsZS5uZXdfZW50cmllczsKLQotICBmb3IgKCA7IHJ0X2luc25zICE9IE5VTEw7IHJ0X2luc25zID0gcnRfaW5zbnMtPm5leHQpCi0gICAgKytjb3VudDsKLQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qIENvdmVyIGZ1bmN0aW9uIHRvIHJlYWQgYW5kIHByb3Blcmx5IGJ5dGVzd2FwIGFuIGluc24gdmFsdWUuICAqLwotCi1DR0VOX0lOU05fSU5UCi1jZ2VuX2dldF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLQotICBzd2l0Y2ggKGxlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgdmFsdWUgPSAqYnVmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChjZC0+aW5zbl9lbmRpYW4gPT0gQ0dFTl9FTkRJQU5fQklHKQotCXZhbHVlID0gYmZkX2dldGIxNiAoYnVmKTsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JdmFsdWUgPSBiZmRfZ2V0YjMyIChidWYpOwotICAgICAgZWxzZQotCXZhbHVlID0gYmZkX2dldGwzMiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBDb3ZlciBmdW5jdGlvbiB0byBzdG9yZSBhbiBpbnNuIHZhbHVlIHByb3Blcmx5IGJ5dGVzd2FwcGVkLiAgKi8KLQotdm9pZAotY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICBzd2l0Y2ggKGxlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgYnVmWzBdID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JYmZkX3B1dGIxNiAodmFsdWUsIGJ1Zik7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwxNiAodmFsdWUsIGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JYmZkX3B1dGIzMiAodmFsdWUsIGJ1Zik7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAodmFsdWUsIGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotDAotLyogTG9vayB1cCBpbnN0cnVjdGlvbiBJTlNOXypfVkFMVUUgYW5kIGV4dHJhY3QgaXRzIGZpZWxkcy4KLSAgIElOU05fSU5UX1ZBTFVFIGlzIHVzZWQgaWYgQ0dFTl9JTlRfSU5TTl9QLgotICAgT3RoZXJ3aXNlIElOU05fQllURVNfVkFMVUUgaXMgdXNlZC4KLSAgIElOU04sIGlmIG5vbi1udWxsLCBpcyB0aGUgaW5zbiB0YWJsZSBlbnRyeS4KLSAgIE90aGVyd2lzZSBJTlNOXypfVkFMVUUgaXMgZXhhbWluZWQgdG8gY29tcHV0ZSBpdC4KLSAgIExFTkdUSCBpcyB0aGUgYml0IGxlbmd0aCBvZiBJTlNOXypfVkFMVUUgaWYga25vd24sIG90aGVyd2lzZSAwLgotICAgMCBpcyBvbmx5IHZhbGlkIGlmIGBpbnNuID09IE5VTEwgJiYgISBDR0VOX0lOVF9JTlNOX1AnLgotICAgSWYgSU5TTiAhPSBOVUxMLCBMRU5HVEggbXVzdCBiZSB2YWxpZC4KLSAgIEFMSUFTX1AgaXMgbm9uLXplcm8gaWYgYWxpYXMgaW5zbnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2guCi0KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnNuIHRhYmxlIGVudHJ5LCBvciBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbgotICAgd2Fzbid0IHJlY29nbml6ZWQuICAqLwotCi0vKiA/Pz8gV2lsbCBuZWVkIHRvIGJlIHJldmlzaXRlZCBmb3IgVkxJVyBhcmNoaXRlY3R1cmVzLiAgKi8KLQotY29uc3QgQ0dFTl9JTlNOICoKLWNnZW5fbG9va3VwX2luc24gKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwgbGVuZ3RoLCBmaWVsZHMsCi0JCSAgYWxpYXNfcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0lOU05fSU5UIGluc25faW50X3ZhbHVlOwotICAgICAvKiA/Pz8gQ0dFTl9JTlNOX0JZVEVTIHdvdWxkIGJlIGEgbmljZSB0eXBlIG5hbWUgdG8gdXNlIGhlcmUuICAqLwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzX3ZhbHVlOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBpbnQgYWxpYXNfcDsKLXsKLSAgdW5zaWduZWQgY2hhciAqYnVmOwotICBDR0VOX0lOU05fSU5UIGJhc2VfaW5zbjsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gKmluZm87Ci0KLSAgaWYgKGNkLT5pbnRfaW5zbl9wKQotICAgIHsKLSAgICAgIGluZm8gPSBOVUxMOwotICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgYWxsb2NhIChjZC0+bWF4X2luc25fYml0c2l6ZSAvIDgpOwotICAgICAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoLCBpbnNuX2ludF92YWx1ZSk7Ci0gICAgICBiYXNlX2luc24gPSBpbnNuX2ludF92YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmZvID0gJmV4X2luZm87Ci0gICAgICBleF9pbmZvLmRpc19pbmZvID0gTlVMTDsKLSAgICAgIGV4X2luZm8uaW5zbl9ieXRlcyA9IGluc25fYnl0ZXNfdmFsdWU7Ci0gICAgICBleF9pbmZvLnZhbGlkID0gLTE7Ci0gICAgICBidWYgPSBpbnNuX2J5dGVzX3ZhbHVlOwotICAgICAgYmFzZV9pbnNuID0gY2dlbl9nZXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgaWYgKCFpbnNuKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgotCSBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCi0KLSAgICAgIGluc25fbGlzdCA9IGNnZW5fZGlzX2xvb2t1cF9pbnNuIChjZCwgYnVmLCBiYXNlX2luc24pOwotICAgICAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQotCXsKLQkgIGluc24gPSBpbnNuX2xpc3QtPmluc247Ci0KLQkgIGlmIChhbGlhc19wCi0JICAgICAgLyogRklYTUU6IEVuc3VyZSBBTElBUyBhdHRyaWJ1dGUgYWx3YXlzIGhhcyBzYW1lIGluZGV4LiAgKi8KLQkgICAgICB8fCAhIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fQUxJQVMpKQotCSAgICB7Ci0JICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KLQkgICAgICAvKiA/Pz8gTWF5IHdpc2ggdG8gYWxsb3cgdGFyZ2V0IHRvIGRlZmVyIHRoaXMgY2hlY2sgdW50aWwgdGhlCi0JCSBleHRyYWN0IGhhbmRsZXIuICAqLwotCSAgICAgIGlmICgoYmFzZV9pbnNuICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCi0JCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQotCQl7Ci0JCSAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JCSAgaW50IGVsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQotCQkgICAgKGNkLCBpbnNuLCBpbmZvLCBiYXNlX2luc24sIGZpZWxkcywgKGJmZF92bWEpIDApOwotCQkgIGlmIChlbGVuZ3RoID4gMCkKLQkJICAgIHsKLQkJICAgICAgLyogc2FuaXR5IGNoZWNrICovCi0JCSAgICAgIGlmIChsZW5ndGggIT0gMCAmJiBsZW5ndGggIT0gZWxlbmd0aCkKLQkJCWFib3J0ICgpOwotCQkgICAgICByZXR1cm4gaW5zbjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGluc25fbGlzdCA9IGluc25fbGlzdC0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogU2FuaXR5IGNoZWNrOiBjYW4ndCBwYXNzIGFuIGFsaWFzIGluc24gaWYgISBhbGlhc19wLiAgKi8KLSAgICAgIGlmICghIGFsaWFzX3AKLQkgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fQUxJQVMpKQotCWFib3J0ICgpOwotICAgICAgLyogU2FuaXR5IGNoZWNrOiBsZW5ndGggbXVzdCBiZSBjb3JyZWN0LiAgKi8KLSAgICAgIGlmIChsZW5ndGggIT0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pKQotCWFib3J0ICgpOwotCi0gICAgICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLSAgICAgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JKGNkLCBpbnNuLCBpbmZvLCBiYXNlX2luc24sIGZpZWxkcywgKGJmZF92bWEpIDApOwotICAgICAgLyogU2FuaXR5IGNoZWNrOiBtdXN0IHN1Y2NlZWQuCi0JIENvdWxkIHJlbGF4IHRoaXMgbGF0ZXIgaWYgaXQgZXZlciBwcm92ZXMgdXNlZnVsLiAgKi8KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHJldHVybiBpbnNuOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRmlsbCBpbiB0aGUgb3BlcmFuZCBpbnN0YW5jZXMgdXNlZCBieSBJTlNOIHdob3NlIG9wZXJhbmRzIGFyZSBGSUVMRFMuCi0gICBJTkRJQ0VTIGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBvZiBNQVhfT1BFUkFORF9JTlNUQU5DRVMgaW50cyB0byBiZSBmaWxsZWQKLSAgIGluLiAgKi8KLQotdm9pZAotY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyAoY2QsIGluc24sIGZpZWxkcywgaW5kaWNlcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBpbnQgKmluZGljZXM7Ci17Ci0gIGNvbnN0IENHRU5fT1BJTlNUICpvcGluc3Q7Ci0gIGludCBpOwotCi0gIGlmIChpbnNuLT5vcGluc3QgPT0gTlVMTCkKLSAgICBhYm9ydCAoKTsKLSAgZm9yIChpID0gMCwgb3BpbnN0ID0gaW5zbi0+b3BpbnN0OyBvcGluc3QtPnR5cGUgIT0gQ0dFTl9PUElOU1RfRU5EOyArK2ksICsrb3BpbnN0KQotICAgIHsKLSAgICAgIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgb3BfdHlwZSA9IG9waW5zdC0+b3BfdHlwZTsKLSAgICAgIGlmIChvcF90eXBlID09IENHRU5fT1BFUkFORF9OSUwpCi0JaW5kaWNlc1tpXSA9IG9waW5zdC0+aW5kZXg7Ci0gICAgICBlbHNlCi0JaW5kaWNlc1tpXSA9ICgqY2QtPmdldF9pbnRfb3BlcmFuZCkgKGNkLCBvcF90eXBlLCBmaWVsZHMpOwotICAgIH0KLX0KLQotLyogQ292ZXIgZnVuY3Rpb24gdG8gY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyB3aGVuIGVpdGhlciBJTlNOIG9yIEZJRUxEUwotICAgaXNuJ3Qga25vd24uCi0gICBUaGUgSU5TTiwgSU5TTl8qX1ZBTFVFLCBhbmQgTEVOR1RIIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvCi0gICBjZ2VuX2xvb2t1cF9pbnNuIHVuY2hhbmdlZC4KLSAgIElOU05fSU5UX1ZBTFVFIGlzIHVzZWQgaWYgQ0dFTl9JTlRfSU5TTl9QLgotICAgT3RoZXJ3aXNlIElOU05fQllURVNfVkFMVUUgaXMgdXNlZC4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgaW5zbiB0YWJsZSBlbnRyeSBvciBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbiB3YXNuJ3QKLSAgIHJlY29nbml6ZWQuICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMgKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwKLQkJCSAgICAgICBsZW5ndGgsIGluZGljZXMsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0lOU05fSU5UIGluc25faW50X3ZhbHVlOwotICAgICAvKiA/Pz8gQ0dFTl9JTlNOX0JZVEVTIHdvdWxkIGJlIGEgbmljZSB0eXBlIG5hbWUgdG8gdXNlIGhlcmUuICAqLwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzX3ZhbHVlOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBpbnQgKmluZGljZXM7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci17Ci0gIC8qIFBhc3Mgbm9uLXplcm8gZm9yIEFMSUFTX1Agb25seSBpZiBJTlNOICE9IE5VTEwuCi0gICAgIElmIElOU04gPT0gTlVMTCwgd2Ugd2FudCBhIHJlYWwgaW5zbi4gICovCi0gIGluc24gPSBjZ2VuX2xvb2t1cF9pbnNuIChjZCwgaW5zbiwgaW5zbl9pbnRfdmFsdWUsIGluc25fYnl0ZXNfdmFsdWUsCi0JCQkgICBsZW5ndGgsIGZpZWxkcywgaW5zbiAhPSBOVUxMKTsKLSAgaWYgKCEgaW5zbikKLSAgICByZXR1cm4gTlVMTDsKLQotICBjZ2VuX2dldF9pbnNuX29wZXJhbmRzIChjZCwgaW5zbiwgZmllbGRzLCBpbmRpY2VzKTsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIEFsbG93IHNpZ25lZCBvdmVyZmxvdyBvZiBpbnN0cnVjdGlvbiBmaWVsZHMuICAqLwotdm9pZAotY2dlbl9zZXRfc2lnbmVkX292ZXJmbG93X29rIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgY2QtPnNpZ25lZF9vdmVyZmxvd19va19wID0gMTsKLX0KLQotLyogR2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSBpZiBhIHNpZ25lZCBmaWVsZCBpbiBhbiBpbnN0cnVjdGlvbiBvdmVyZmxvd3MuICAqLwotdm9pZAotY2dlbl9jbGVhcl9zaWduZWRfb3ZlcmZsb3dfb2sgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBjZC0+c2lnbmVkX292ZXJmbG93X29rX3AgPSAwOwotfQotCi0vKiBXaWxsIGFuIGVycm9yIG1lc3NhZ2UgYmUgZ2VuZXJhdGVkIGlmIGEgc2lnbmVkIGZpZWxkIGluIGFuIGluc3RydWN0aW9uIG92ZXJmbG93cyA/ICovCi11bnNpZ25lZCBpbnQKLWNnZW5fc2lnbmVkX292ZXJmbG93X29rX3AgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICByZXR1cm4gY2QtPnNpZ25lZF9vdmVyZmxvd19va19wOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jb25maWcuaW4gYi9vcGNvZGVzL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwYTMyMS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jb25maWd1cmUgYi9vcGNvZGVzL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmJmYTIwNy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MDQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMy4xIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMy4xIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPXo4ay1kaXMuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgICB0ZXN0IC1mICIkY2FjaGVfZmlsZSIgJiYgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiCi1hY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIKLWFjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2ODogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci1pZiB0ZXN0ICJ4JGFjX2N2X2hvc3QiID0gIngiIHx8ICh0ZXN0ICJ4JGhvc3QiICE9ICJ4Tk9ORSIgJiYgdGVzdCAieCRob3N0IiAhPSAieCRhY19jdl9ob3N0X2FsaWFzIik7IHRoZW4KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLQotICBhY19jdl9ob3N0X2FsaWFzPSRob3N0Ci0gIGNhc2UgIiRhY19jdl9ob3N0X2FsaWFzIiBpbgotICBOT05FKQotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgIE5PTkUpCi0gICAgICBpZiBhY19jdl9ob3N0X2FsaWFzPWAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgIGZpIDs7Ci0gICAgKikgYWNfY3ZfaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgCi0gIGFjX2N2X2hvc3RfY3B1PWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLSAgYWNfY3ZfaG9zdF92ZW5kb3I9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl9ob3N0X29zPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVsc2UKLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaG9zdCIgMT4mNgotCi1ob3N0PSRhY19jdl9ob3N0Ci1ob3N0X2FsaWFzPSRhY19jdl9ob3N0X2FsaWFzCi1ob3N0X2NwdT0kYWNfY3ZfaG9zdF9jcHUKLWhvc3RfdmVuZG9yPSRhY19jdl9ob3N0X3ZlbmRvcgotaG9zdF9vcz0kYWNfY3ZfaG9zdF9vcwotCi0KLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA5OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotaWYgdGVzdCAieCRhY19jdl90YXJnZXQiID0gIngiIHx8ICh0ZXN0ICJ4JHRhcmdldCIgIT0gInhOT05FIiAmJiB0ZXN0ICJ4JHRhcmdldCIgIT0gIngkYWNfY3ZfdGFyZ2V0X2FsaWFzIik7IHRoZW4KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLQotICBhY19jdl90YXJnZXRfYWxpYXM9JHRhcmdldAotICBjYXNlICIkYWNfY3ZfdGFyZ2V0X2FsaWFzIiBpbgotICBOT05FKQotICAgIGNhc2UgJG5vbm9wdCBpbgotICAgIE5PTkUpCi0gICAgICBhY19jdl90YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLQotICAgICopIGFjX2N2X3RhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfdGFyZ2V0PWAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzYAotICBhY19jdl90YXJnZXRfY3B1PWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotICBhY19jdl90YXJnZXRfdmVuZG9yPWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl90YXJnZXRfb3M9YGVjaG8gJGFjX2N2X3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lbHNlCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3RhcmdldCIgMT4mNgotCi10YXJnZXQ9JGFjX2N2X3RhcmdldAotdGFyZ2V0X2FsaWFzPSRhY19jdl90YXJnZXRfYWxpYXMKLXRhcmdldF9jcHU9JGFjX2N2X3RhcmdldF9jcHUKLXRhcmdldF92ZW5kb3I9JGFjX2N2X3RhcmdldF92ZW5kb3IKLXRhcmdldF9vcz0kYWNfY3ZfdGFyZ2V0X29zCi0KLQotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0OTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotaWYgdGVzdCAieCRhY19jdl9idWlsZCIgPSAieCIgfHwgKHRlc3QgIngkYnVpbGQiICE9ICJ4Tk9ORSIgJiYgdGVzdCAieCRidWlsZCIgIT0gIngkYWNfY3ZfYnVpbGRfYWxpYXMiKTsgdGhlbgotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0gIGlmICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotCi0gIGFjX2N2X2J1aWxkX2FsaWFzPSRidWlsZAotICBjYXNlICIkYWNfY3ZfYnVpbGRfYWxpYXMiIGluCi0gIE5PTkUpCi0gICAgY2FzZSAkbm9ub3B0IGluCi0gICAgTk9ORSkKLSAgICAgIGFjX2N2X2J1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0KLSAgICAqKSBhY19jdl9idWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gICAgZXNhYyA7OwotICBlc2FjCi0KLSAgYWNfY3ZfYnVpbGQ9YCRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhc2AKLSAgYWNfY3ZfYnVpbGRfY3B1PWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0gIGFjX2N2X2J1aWxkX3ZlbmRvcj1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotICBhY19jdl9idWlsZF9vcz1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWxzZQotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9idWlsZCIgMT4mNgotCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWJ1aWxkX2FsaWFzPSRhY19jdl9idWlsZF9hbGlhcwotYnVpbGRfY3B1PSRhY19jdl9idWlsZF9jcHUKLWJ1aWxkX3ZlbmRvcj0kYWNfY3ZfYnVpbGRfdmVuZG9yCi1idWlsZF9vcz0kYWNfY3ZfYnVpbGRfb3MKLQotCi0KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzE2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfQ0Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19DQytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiogfCAqQ1lHV0lOKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc5NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyOTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDg0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODcxOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3NjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfZ2NjK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkwNDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX2NjX2crc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkzNjogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLSMgV2UgY3VycmVudGx5IG9ubHkgdXNlIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIG5hbWUgb2YgYW55IHNoYXJlZAotIyBsaWJyYXJ5LiAgRm9yIHVzZXIgY29udmVuaWVuY2UsIHdlIGFsd2F5cyB1c2UgdGhlIHNhbWUgdmVyc2lvbgotIyBudW1iZXIgdGhhdCBCRkQgaXMgdXNpbmcuCi1CRkRfVkVSU0lPTj1gZ3JlcCBJTklUX0FVVE9NQUtFICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmluIHwgc2VkIC1uIC1lICdzL1sgCV0vL2cnIC1lICdzL14uKixcKC4qXCkpLiokL1wxL3AnYAotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk3NDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAzMTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4ODogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0K3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0KLVBBQ0tBR0U9b3Bjb2RlcwotCi1WRVJTSU9OPSR7QkZEX1ZFUlNJT059Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEzNDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFDTE9DQUw9YWNsb2NhbAotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBQ0xPQ0FMPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhY2xvY2FsIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQ3OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNjA6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTczOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvaGVhZGVyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0hFQURFUj1hdXRvaGVhZGVyCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9IRUFERVI9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9oZWFkZXIiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExODY6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0FSK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiIgJiYgYWNfY3ZfcHJvZ19BUj0iYXIiCi1maQotZmkKLUFSPSIkYWNfY3ZfcHJvZ19BUiIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjQxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfUkFOTElCK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfUkFOTElCK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBSQU5MSUI9IjoiCi1maQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfUkFOTElCK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MTg6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NDI6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ0NTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX0xEK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SLTp9IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXRlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ4MDogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfZ251X2xkK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ5NjogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX05NK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SLTp9IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tIHx8IHRlc3QgLWYgJGFjX2Rpci9ubSRhY19leGVleHQgOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTMyOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0xOX1Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1jYXNlICIkdGFyZ2V0IiBpbgotTk9ORSkgbHRfdGFyZ2V0PSIkaG9zdCIgOzsKLSopIGx0X3RhcmdldD0iJHRhcmdldCIgOzsKLWVzYWMKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIDoKLWZpCi0KLXRlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgPSB4bm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi10ZXN0IHgiJHNpbGVudCIgPSB4eWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGx0X3RhcmdldCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTU4MSAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjAzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHtsdF9jdl9jY19uZWVkc19iZWxmK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYwOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLQotZXNhYwotCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBMREZMQUdTPSIkTERGTEFHUyIgTElCUz0iJExJQlMiIFwKLUxOX1M9IiRMTl9TIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBPQkpEVU1QPSIkT0JKRFVNUCIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRsdF90YXJnZXQgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICAgIHRlc3QgLWYgIiRjYWNoZV9maWxlIiAmJiAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3Igb3Bjb2RlcyBjb21tb25iZmRsaWIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc2NTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3ODg6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2N5Z3dpbitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4MDQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODIwOiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfbWluZ3czMitzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgRU1YIE9TLzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NDg6IGNoZWNraW5nIGZvciBFTVggT1MvMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZW14b3MyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fRU1YX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg2MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2VteG9zMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZW14b3MyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2VteG9zMiIgMT4mNgotRU1YT1MyPQotdGVzdCAiJGFjX2N2X2VteG9zMiIgPSB5ZXMgJiYgRU1YT1MyPXllcwotCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODc5OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2V4ZWV4dCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllcyB8fCB0ZXN0ICIkRU1YT1MyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICouQyB8ICoubyB8ICoub2JqIHwgKi54Y29mZikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkxNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKiB8ICpDWUdXSU4qKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk5NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wcm9nX0NDK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMjg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyMDM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDc1OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19nY2Mrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDg0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19jY19nK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEzNzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfQ1BQK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTUyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTU4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTY5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTc1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTkyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjE3OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjMwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI2NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyOTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMyMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2NfY29uc3Qrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM5NjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfY19pbmxpbmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDAzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBpbnQgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDM2OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3R5cGVfb2ZmX3Qrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfdHlwZV9vZmZfdD15ZXMiCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfdHlwZV9vZmZfdD1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3R5cGVfJ29mZl90YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ3MTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfdHlwZV9zaXplX3Qrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X3R5cGVfc2l6ZV90PXllcyIKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl90eXBlX3NpemVfdD1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3R5cGVfJ3NpemVfdGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUwODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl9hbGxvY2FfaCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NDE6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYwNjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3Zfb3NfY3JheStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjM2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Z1bmNfJGFjX2Z1bmMrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLWNoYXIgKCpmKSgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotZiA9ICRhY19mdW5jOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2OTI6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3MTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc0NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl8kYWNfc2FmZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI3NTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc4MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jXyRhY19mdW5jK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci1jaGFyICgqZikoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLWYgPSAkYWNfZnVuYzsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgzNzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMTM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9oZWFkZXJfJGFjX3NhZmUrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDE4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDIzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA1MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jXyRhY19mdW5jK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci1jaGFyICgqZikoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLWYgPSAkYWNfZnVuYzsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA4MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzExMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9mdW5jXyRhY19mdW5jK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzExNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci1jaGFyICgqZikoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLWYgPSAkYWNfZnVuYzsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTc0OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FtX2N2X3ZhbF9MQ19NRVNTQUdFUytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIwNzogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjI3OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNDY6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl8kYWNfc2FmZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNzM6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI3OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzAxOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy06JV9fcF9fJSdgCi1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfbGliXyRhY19saWJfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMzNjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7Z3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzNzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9NU0dGTVQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MTA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfZnVuY18kYWNfZnVuYytzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotY2hhciAoKmYpKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi1mID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0Mzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NjY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9HTVNHRk1UK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTAyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfWEdFVFRFWFQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTc0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3BhdGhfTVNHRk1UK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYwODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX0dNU0dGTVQrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcGF0aF9YR0VUVEVYVCtzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MzQ6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NjI6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X2hlYWRlcl8kYWNfc2FmZStzZXR9XCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3NjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc3MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLS4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg0OTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJcJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fVwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTEwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfaGVhZGVyXyRhY19zYWZlK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzkxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkyMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi11c2luZ19jZ2VuPW5vCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2JmZCAtbGJmZCAtTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIgotICBmaQotICA7OwotZXNhYwotCi0KLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLQllbHNlCi0JICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgotCWZpCi0gICAgZG9uZQotZmkKLQotYWxsX3RhcmdldHM9ZmFsc2UKLXNlbGFyY2hzPQotZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cwotZG8KLSAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiIDsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0gICAgZWxzZQotCS4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0gICAgZmkKLWRvbmUJCi0KLSMgVXRpbGl0eSB2YXIsIGRvY3VtZW50cyBnZW5lcmljIGNnZW4gc3VwcG9ydCBmaWxlcy4KLQotY2dlbl9maWxlcz0iY2dlbi1vcGMubG8gY2dlbi1hc20ubG8gY2dlbi1kaXMubG8iCi0KLSMgV2UgZG9uJ3QgZG8gYW55IGxpbmtzIGJhc2VkIG9uIHRoZSB0YXJnZXQgc3lzdGVtLCBqdXN0IG1ha2VmaWxlIGNvbmZpZy4KLQotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4ZmFsc2UgOyB0aGVuCi0KLSAgICAjIFRhcmdldCBhcmNoaXRlY3R1cmUgLm8gZmlsZXMuCi0gICAgdGE9Ci0KLSAgICBmb3IgYXJjaCBpbiAkc2VsYXJjaHMKLSAgICBkbwotCWFkPWBlY2hvICRhcmNoIHwgc2VkIC1lIHMvYmZkXy8vZyAtZSBzL19hcmNoLy9nYAotCWFyY2hkZWZzPSIkYXJjaGRlZnMgLURBUkNIXyRhZCIKLQljYXNlICIkYXJjaCIgaW4KLQliZmRfYTI5a19hcmNoKQkJdGE9IiR0YSBhMjlrLWRpcy5sbyIgOzsKLQliZmRfYWxsaWFudF9hcmNoKQk7OwotCWJmZF9hbHBoYV9hcmNoKQkJdGE9IiR0YSBhbHBoYS1kaXMubG8gYWxwaGEtb3BjLmxvIiA7OwotCWJmZF9hcmNfYXJjaCkJCXRhPSIkdGEgYXJjLWRpcy5sbyBhcmMtb3BjLmxvIiA7OwotCWJmZF9hcm1fYXJjaCkJCXRhPSIkdGEgYXJtLWRpcy5sbyIgOzsKLQliZmRfYXZyX2FyY2gpCQl0YT0iJHRhIGF2ci1kaXMubG8iIDs7Ci0JYmZkX2NvbnZleF9hcmNoKQk7OwotCWJmZF9kMTB2X2FyY2gpCQl0YT0iJHRhIGQxMHYtZGlzLmxvIGQxMHYtb3BjLmxvIiA7OwotCWJmZF9kMzB2X2FyY2gpCQl0YT0iJHRhIGQzMHYtZGlzLmxvIGQzMHYtb3BjLmxvIiA7OwotCWJmZF9mcjMwX2FyY2gpICAgICAgICAgIHRhPSIkdGEgZnIzMC1hc20ubG8gZnIzMC1kZXNjLmxvIGZyMzAtZGlzLmxvIGZyMzAtaWJsZC5sbyBmcjMwLW9wYy5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfaDgzMDBfYXJjaCkJCXRhPSIkdGEgaDgzMDAtZGlzLmxvIiA7OwotCWJmZF9oODUwMF9hcmNoKQkJdGE9IiR0YSBoODUwMC1kaXMubG8iIDs7Ci0JYmZkX2hwcGFfYXJjaCkJCXRhPSIkdGEgaHBwYS1kaXMubG8iIDs7Ci0JYmZkX2kzNzBfYXJjaCkJCXRhPSIkdGEgaTM3MC1kaXMubG8gaTM3MC1vcGMubG8iIDs7Ci0JYmZkX2kzODZfYXJjaCkJCXRhPSIkdGEgaTM4Ni1kaXMubG8iIDs7Ci0JYmZkX2k4NjBfYXJjaCkJCTs7Ci0JYmZkX2k5NjBfYXJjaCkJCXRhPSIkdGEgaTk2MC1kaXMubG8iIDs7Ci0JYmZkX20zMnJfYXJjaCkJCXRhPSIkdGEgbTMyci1hc20ubG8gbTMyci1kZXNjLmxvIG0zMnItZGlzLmxvIG0zMnItaWJsZC5sbyBtMzJyLW9wYy5sbyBtMzJyLW9waW5zdC5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfbTY4a19hcmNoKQkJdGE9IiR0YSBtNjhrLWRpcy5sbyBtNjhrLW9wYy5sbyIgOzsKLQliZmRfbTg4a19hcmNoKQkJdGE9IiR0YSBtODhrLWRpcy5sbyIgOzsKLQliZmRfbWNvcmVfYXJjaCkJCXRhPSIkdGEgbWNvcmUtZGlzLmxvIiA7OwotCWJmZF9taXBzX2FyY2gpCQl0YT0iJHRhIG1pcHMtZGlzLmxvIG1pcHMtb3BjLmxvIG1pcHMxNi1vcGMubG8iIDs7Ci0JYmZkX21uMTAyMDBfYXJjaCkJdGE9IiR0YSBtMTAyMDAtZGlzLmxvIG0xMDIwMC1vcGMubG8iIDs7Ci0JYmZkX21uMTAzMDBfYXJjaCkJdGE9IiR0YSBtMTAzMDAtZGlzLmxvIG0xMDMwMC1vcGMubG8iIDs7Ci0JYmZkX25zMzJrX2FyY2gpCQl0YT0iJHRhIG5zMzJrLWRpcy5sbyIgOzsKLQliZmRfcGpfYXJjaCkJICAgICAgICB0YT0iJHRhIHBqLWRpcy5sbyBwai1vcGMubG8iIDs7Ci0JYmZkX3Bvd2VycGNfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3B5cmFtaWRfYXJjaCkJOzsKLQliZmRfcm9tcF9hcmNoKQkJOzsKLQliZmRfcnM2MDAwX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9zaF9hcmNoKQkJdGE9IiR0YSBzaC1kaXMubG8iIDs7Ci0JYmZkX3NwYXJjX2FyY2gpCQl0YT0iJHRhIHNwYXJjLWRpcy5sbyBzcGFyYy1vcGMubG8iIDs7Ci0JYmZkX3RhaG9lX2FyY2gpCQk7OwotCWJmZF90aWMzMF9hcmNoKQkJdGE9IiR0YSB0aWMzMC1kaXMubG8iIDs7Ci0JYmZkX3RpYzgwX2FyY2gpCQl0YT0iJHRhIHRpYzgwLWRpcy5sbyB0aWM4MC1vcGMubG8iIDs7Ci0JYmZkX3Y4NTBfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZWFfYXJjaCkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdmF4X2FyY2gpCQl0YT0iJHRhIHZheC1kaXMubG8iIDs7Ci0JYmZkX3c2NV9hcmNoKQkJdGE9IiR0YSB3NjUtZGlzLmxvIiA7OwotCWJmZF93ZTMya19hcmNoKQkJOzsKLQliZmRfejhrX2FyY2gpCQl0YT0iJHRhIHo4ay1kaXMubG8iIDs7Ci0KLQkiIikJCQk7OwotCSopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICoqKiB1bmtub3duIHRhcmdldCBhcmNoaXRlY3R1cmUgJGFyY2giIDE+JjI7IGV4aXQgMTsgfSA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotCXRhPSIkdGEgJGNnZW5fZmlsZXMiCi0gICAgZmkKLQotICAgICMgV2VlZCBvdXQgZHVwbGljYXRlIC5vIGZpbGVzLgotICAgIGY9IiIKLSAgICBmb3IgaSBpbiAkdGEgOyBkbwotCWNhc2UgIiAkZiAiIGluCi0JKiIgJGkgIiopIDs7Ci0JKikgZj0iJGYgJGkiIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgICB0YT0iJGYiCi0KLSAgICAjIEFuZCBkdXBsaWNhdGUgLUQgZmxhZ3MuCi0gICAgZj0iIgotICAgIGZvciBpIGluICRhcmNoZGVmcyA7IGRvCi0JY2FzZSAiICRmICIgaW4KLQkqIiAkaSAiKikgOzsKLQkqKSBmPSIkZiAkaSIgOzsKLQllc2FjCi0gICAgZG9uZQotICAgIGFyY2hkZWZzPSIkZiIKLQotICAgIEJGRF9NQUNISU5FUz0iJHRhIgotCi1lbHNlCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQotICAgIGFyY2hkZWZzPS1EQVJDSF9hbGwKLSAgICBCRkRfTUFDSElORVM9JyQoQUxMX01BQ0hJTkVTKScKLWZpCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMuMSIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQFdJTjMyTERGTEFHU0AlJFdJTjMyTERGTEFHUyVnCi1zJUBXSU4zMkxJQkFEREAlJFdJTjMyTElCQUREJWcKLXMlQGFyY2hkZWZzQCUkYXJjaGRlZnMlZwotcyVAQkZEX01BQ0hJTkVTQCUkQkZEX01BQ0hJTkVTJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAkU0hFTEwgJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlLmluIGIvb3Bjb2Rlcy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjQ2MWYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwKLQotQUNfUFJFUkVRKDIuMTMpCi1BQ19JTklUKHo4ay1kaXMuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotQUNfSVNDX1BPU0lYCi0KLSMgV2UgY3VycmVudGx5IG9ubHkgdXNlIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIG5hbWUgb2YgYW55IHNoYXJlZAotIyBsaWJyYXJ5LiAgRm9yIHVzZXIgY29udmVuaWVuY2UsIHdlIGFsd2F5cyB1c2UgdGhlIHNhbWUgdmVyc2lvbgotIyBudW1iZXIgdGhhdCBCRkQgaXMgdXNpbmcuCi1jaGFuZ2VxdW90ZSgsKWRubAotQkZEX1ZFUlNJT049YGdyZXAgSU5JVF9BVVRPTUFLRSAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5pbiB8IHNlZCAtbiAtZSAncy9bIAldLy9nJyAtZSAncy9eLiosXCguKlwpKS4qJC9cMS9wJ2AKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotQU1fSU5JVF9BVVRPTUFLRShvcGNvZGVzLCAke0JGRF9WRVJTSU9OfSkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLWRubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKLWRubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KLUFNX0RJU0FCTEVfU0hBUkVECi0KLUFNX1BST0dfTElCVE9PTAotCi1BQ19BUkdfRU5BQkxFKHRhcmdldHMsCi1bICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnNdLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIEFDX0VSUk9SKGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnKQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhY10pZG5sCi1BQ19BUkdfRU5BQkxFKGNvbW1vbmJmZGxpYiwKLVsgIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgQUNfTVNHX0VSUk9SKFtiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBvcGNvZGVzIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLUFDX0FSR19QUk9HUkFNCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotQUNfUFJPR19DQwotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLS4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAotCi1BQ19TVUJTVChIREVGSU5FUykKLUFDX1BST0dfSU5TVEFMTAotCi1BQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCkKLQotCi11c2luZ19jZ2VuPW5vCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2JmZCAtbGJmZCAtTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIgotICBmaQotICA7OwotZXNhYwotQUNfU1VCU1QoV0lOMzJMREZMQUdTKQotQUNfU1VCU1QoV0lOMzJMSUJBREQpCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1zZWxhcmNocz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIiA7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvLi4vYmZkL2NvbmZpZy5iZmQKLQlzZWxhcmNocz0iJHNlbGFyY2hzICR0YXJnX2FyY2hzIgotICAgIGZpCi1kb25lCQotCi0jIFV0aWxpdHkgdmFyLCBkb2N1bWVudHMgZ2VuZXJpYyBjZ2VuIHN1cHBvcnQgZmlsZXMuCi0KLWNnZW5fZmlsZXM9ImNnZW4tb3BjLmxvIGNnZW4tYXNtLmxvIGNnZW4tZGlzLmxvIgotCi0jIFdlIGRvbid0IGRvIGFueSBsaW5rcyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHN5c3RlbSwganVzdCBtYWtlZmlsZSBjb25maWcuCi0KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geGZhbHNlIDsgdGhlbgotCi0gICAgIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotICAgIHRhPQotCi0gICAgZm9yIGFyY2ggaW4gJHNlbGFyY2hzCi0gICAgZG8KLQlhZD1gZWNobyAkYXJjaCB8IHNlZCAtZSBzL2JmZF8vL2cgLWUgcy9fYXJjaC8vZ2AKLQlhcmNoZGVmcz0iJGFyY2hkZWZzIC1EQVJDSF8kYWQiCi0JY2FzZSAiJGFyY2giIGluCi0JYmZkX2EyOWtfYXJjaCkJCXRhPSIkdGEgYTI5ay1kaXMubG8iIDs7Ci0JYmZkX2FsbGlhbnRfYXJjaCkJOzsKLQliZmRfYWxwaGFfYXJjaCkJCXRhPSIkdGEgYWxwaGEtZGlzLmxvIGFscGhhLW9wYy5sbyIgOzsKLQliZmRfYXJjX2FyY2gpCQl0YT0iJHRhIGFyYy1kaXMubG8gYXJjLW9wYy5sbyIgOzsKLQliZmRfYXJtX2FyY2gpCQl0YT0iJHRhIGFybS1kaXMubG8iIDs7Ci0JYmZkX2F2cl9hcmNoKQkJdGE9IiR0YSBhdnItZGlzLmxvIiA7OwotCWJmZF9jb252ZXhfYXJjaCkJOzsKLQliZmRfZDEwdl9hcmNoKQkJdGE9IiR0YSBkMTB2LWRpcy5sbyBkMTB2LW9wYy5sbyIgOzsKLQliZmRfZDMwdl9hcmNoKQkJdGE9IiR0YSBkMzB2LWRpcy5sbyBkMzB2LW9wYy5sbyIgOzsKLQliZmRfZnIzMF9hcmNoKSAgICAgICAgICB0YT0iJHRhIGZyMzAtYXNtLmxvIGZyMzAtZGVzYy5sbyBmcjMwLWRpcy5sbyBmcjMwLWlibGQubG8gZnIzMC1vcGMubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX2g4MzAwX2FyY2gpCQl0YT0iJHRhIGg4MzAwLWRpcy5sbyIgOzsKLQliZmRfaDg1MDBfYXJjaCkJCXRhPSIkdGEgaDg1MDAtZGlzLmxvIiA7OwotCWJmZF9ocHBhX2FyY2gpCQl0YT0iJHRhIGhwcGEtZGlzLmxvIiA7OwotCWJmZF9pMzcwX2FyY2gpCQl0YT0iJHRhIGkzNzAtZGlzLmxvIGkzNzAtb3BjLmxvIiA7OwotCWJmZF9pMzg2X2FyY2gpCQl0YT0iJHRhIGkzODYtZGlzLmxvIiA7OwotCWJmZF9pODYwX2FyY2gpCQk7OwotCWJmZF9pOTYwX2FyY2gpCQl0YT0iJHRhIGk5NjAtZGlzLmxvIiA7OwotCWJmZF9tMzJyX2FyY2gpCQl0YT0iJHRhIG0zMnItYXNtLmxvIG0zMnItZGVzYy5sbyBtMzJyLWRpcy5sbyBtMzJyLWlibGQubG8gbTMyci1vcGMubG8gbTMyci1vcGluc3QubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX202OGtfYXJjaCkJCXRhPSIkdGEgbTY4ay1kaXMubG8gbTY4ay1vcGMubG8iIDs7Ci0JYmZkX204OGtfYXJjaCkJCXRhPSIkdGEgbTg4ay1kaXMubG8iIDs7Ci0JYmZkX21jb3JlX2FyY2gpCQl0YT0iJHRhIG1jb3JlLWRpcy5sbyIgOzsKLQliZmRfbWlwc19hcmNoKQkJdGE9IiR0YSBtaXBzLWRpcy5sbyBtaXBzLW9wYy5sbyBtaXBzMTYtb3BjLmxvIiA7OwotCWJmZF9tbjEwMjAwX2FyY2gpCXRhPSIkdGEgbTEwMjAwLWRpcy5sbyBtMTAyMDAtb3BjLmxvIiA7OwotCWJmZF9tbjEwMzAwX2FyY2gpCXRhPSIkdGEgbTEwMzAwLWRpcy5sbyBtMTAzMDAtb3BjLmxvIiA7OwotCWJmZF9uczMya19hcmNoKQkJdGE9IiR0YSBuczMyay1kaXMubG8iIDs7Ci0JYmZkX3BqX2FyY2gpCSAgICAgICAgdGE9IiR0YSBwai1kaXMubG8gcGotb3BjLmxvIiA7OwotCWJmZF9wb3dlcnBjX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9weXJhbWlkX2FyY2gpCTs7Ci0JYmZkX3JvbXBfYXJjaCkJCTs7Ci0JYmZkX3JzNjAwMF9hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKLQliZmRfc2hfYXJjaCkJCXRhPSIkdGEgc2gtZGlzLmxvIiA7OwotCWJmZF9zcGFyY19hcmNoKQkJdGE9IiR0YSBzcGFyYy1kaXMubG8gc3BhcmMtb3BjLmxvIiA7OwotCWJmZF90YWhvZV9hcmNoKQkJOzsKLQliZmRfdGljMzBfYXJjaCkJCXRhPSIkdGEgdGljMzAtZGlzLmxvIiA7OwotCWJmZF90aWM4MF9hcmNoKQkJdGE9IiR0YSB0aWM4MC1kaXMubG8gdGljODAtb3BjLmxvIiA7OwotCWJmZF92ODUwX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZV9hcmNoKQkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdjg1MGVhX2FyY2gpCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3ZheF9hcmNoKQkJdGE9IiR0YSB2YXgtZGlzLmxvIiA7OwotCWJmZF93NjVfYXJjaCkJCXRhPSIkdGEgdzY1LWRpcy5sbyIgOzsKLQliZmRfd2UzMmtfYXJjaCkJCTs7Ci0JYmZkX3o4a19hcmNoKQkJdGE9IiR0YSB6OGstZGlzLmxvIiA7OwotCi0JIiIpCQkJOzsKLQkqKQkJQUNfTVNHX0VSUk9SKCoqKiB1bmtub3duIHRhcmdldCBhcmNoaXRlY3R1cmUgJGFyY2gpIDs7Ci0JZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0JdGE9IiR0YSAkY2dlbl9maWxlcyIKLSAgICBmaQotCi0gICAgIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi0gICAgZj0iIgotICAgIGZvciBpIGluICR0YSA7IGRvCi0JY2FzZSAiICRmICIgaW4KLQkqIiAkaSAiKikgOzsKLQkqKSBmPSIkZiAkaSIgOzsKLQllc2FjCi0gICAgZG9uZQotICAgIHRhPSIkZiIKLQotICAgICMgQW5kIGR1cGxpY2F0ZSAtRCBmbGFncy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJGFyY2hkZWZzIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgYXJjaGRlZnM9IiRmIgotCi0gICAgQkZEX01BQ0hJTkVTPSIkdGEiCi0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICAgYXJjaGRlZnM9LURBUkNIX2FsbAotICAgIEJGRF9NQUNISU5FUz0nJChBTExfTUFDSElORVMpJwotZmkKLQotQUNfU1VCU1QoYXJjaGRlZnMpCi1BQ19TVUJTVChCRkRfTUFDSElORVMpCi0KLUFDX09VVFBVVChNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3NlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS9vcGNvZGVzL2QxMHYtZGlzLmMgYi9vcGNvZGVzL2QxMHYtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMWE3ZDMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kMTB2LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIEQxMFYgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDEwdi5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLS8qIHRoZSBQQyB3cmFwcyBhdCAxOCBiaXRzLCBleGNlcHQgZm9yIHRoZSBzZWdtZW50IG51bWJlciAqLwotLyogc28gdXNlIHRoaXMgbWFzayB0byBrZWVwIHRoZSBwYXJ0cyB3ZSB3YW50ICovCi0jZGVmaW5lIFBDX01BU0sJMHgwMzAzRkZGRgotCi1zdGF0aWMgdm9pZCBkaXNfMl9zaG9ydCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc24sIGJmZF92bWEgbWVtYWRkciwgCi0JCQkJIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLCBpbnQgb3JkZXIpKTsKLXN0YXRpYyB2b2lkIGRpc19sb25nIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zbiwgYmZkX3ZtYSBtZW1hZGRyLCAKLQkJCSAgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLWludCAKLXByaW50X2luc25fZDEwdiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0KLSAgc3RhdHVzID0gaW5zbiAmIEZNMTE7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gIGNhc2UgMDoKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0wMToKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0xMDoKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0xMToKLSAgICBkaXNfbG9uZyAoaW5zbiwgbWVtYWRkciwgaW5mbyk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kIChvcGVyLCBpbnNuLCBvcCwgbWVtYWRkciwgaW5mbykKLSAgICAgc3RydWN0IGQxMHZfb3BlcmFuZCAqb3BlcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgbnVtLCBzaGlmdDsKLQotICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVE1JTlVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQC0iKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX01JTlVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfUExVUykKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUU0lHTikKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUUEFSKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCgiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2hpZnQgPSBvcGVyLT5zaGlmdDsKLQotICAvKiB0aGUgTE9OR19MIGZvcm1hdCBzaGlmdHMgcmVnaXN0ZXJzIG92ZXIgYnkgMTUgKi8KLSAgaWYgKG9wLT5mb3JtYXQgPT0gTE9OR19MICYmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKSkKLSAgICBzaGlmdCArPSAxNTsKLQotICBudW0gPSAoaW5zbiA+PiBzaGlmdCkgJiAoMHg3RkZGRkZGRiA+PiAoMzEgLSBvcGVyLT5iaXRzKSk7Ci0KLSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgbWF0Y2g9MDsKLSAgICAgIG51bSArPSAob3Blci0+ZmxhZ3MKLQkgICAgICAmIChPUEVSQU5EX0dQUnxPUEVSQU5EX0ZGTEFHfE9QRVJBTkRfQ0ZMQUd8T1BFUkFORF9DT05UUk9MKSk7Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiAoT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMSkpCi0JbnVtICs9IG51bSA/IE9QRVJBTkRfQUNDMSA6IE9QRVJBTkRfQUNDMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkMTB2X3JlZ19uYW1lX2NudCgpOyBpKyspCi0JewotCSAgaWYgKG51bSA9PSBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW2ldLnZhbHVlKQotCSAgICB7Ci0JICAgICAgaWYgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpOwotCSAgICAgIGVsc2UKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5uYW1lKTsKLQkgICAgICBtYXRjaD0xOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKG1hdGNoID09IDApCi0JewotCSAgLyogdGhpcyB3b3VsZCBvbmx5IGdldCBleGVjdXRlZCBpZiBhIHJlZ2lzdGVyIHdhcyBub3QgaW4gdGhlIAotCSAgICAgcmVnaXN0ZXIgdGFibGUgKi8KLQkgIGlmIChvcGVyLT5mbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhIik7Ci0JICBlbHNlIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJjciIpOwotCSAgZWxzZSBpZihvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIiKTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLG51bSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGFkZHJlc3NlcyBhcmUgcmlnaHQtc2hpZnRlZCBieSAyICovCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0FERFIpCi0JewotCSAgbG9uZyBtYXg7Ci0JICBpbnQgbmVnPTA7Ci0JICBtYXggPSAoMSA8PCAob3Blci0+Yml0cyAtIDEpKTsKLQkgIGlmIChudW0gJiBtYXgpCi0JICAgIHsKLQkgICAgICBudW0gPSAtbnVtICYgKCgxIDw8IG9wZXItPmJpdHMpLTEpOwotCSAgICAgIG5lZyA9IDE7Ci0JICAgIH0KLQkgIG51bSA9IG51bTw8MjsKLQkgIGlmIChpbmZvLT5mbGFncyAmIElOU05fSEFTX1JFTE9DKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG51bSAmIFBDX01BU0ssIGluZm8pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG5lZykKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciAtIG51bSkgJiBQQ19NQVNLLCBpbmZvKTsKLQkgICAgICBlbHNlCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyBudW0pICYgUENfTUFTSywgaW5mbyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0JICAgIHsKLQkgICAgICBpbnQgbWF4ID0gKDEgPDwgKG9wZXItPmJpdHMgLSAxKSk7Ci0JICAgICAgaWYgKG51bSAmIG1heCkKLQkJewotCQkgIG51bSA9IC1udW0gJiAoKDEgPDwgb3Blci0+Yml0cyktMSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7Ci0JCX0KLQkgICAgfQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IixudW0pOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRpc19sb25nIChpbnNuLCBtZW1hZGRyLCBpbmZvKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBpOwotICBjaGFyIGJ1ZlszMl07Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqb3AgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOwotICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICBpbnQgbmVlZF9wYXJlbiA9IDA7Ci0gIGludCBtYXRjaCA9IDA7Ci0KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmICgob3AtPmZvcm1hdCAmIExPTkdfT1BDT0RFKSAmJiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZSkpCi0JewotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOyAgIAotCSAgZm9yICggaT0wOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQkgICAgewotCSAgICAgIG9wZXIgPSAoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV07Ci0JICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0JCW5lZWRfcGFyZW4gPSAxOwotCSAgICAgIHByaW50X29wZXJhbmQgKG9wZXIsIGluc24sIG9wLCBtZW1hZGRyLCBpbmZvKTsKLQkgICAgICBpZiAob3AtPm9wZXJhbmRzW2krMV0gJiYgb3Blci0+Yml0cyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfUExVUyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCAiKTsgICAKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLGluc24pOyAgIAotCi0gIGlmIChuZWVkX3BhcmVuKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOyAgIAotfQotCi1zdGF0aWMgdm9pZAotZGlzXzJfc2hvcnQgKGluc24sIG1lbWFkZHIsIGluZm8sIG9yZGVyKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBvcmRlcjsKLXsKLSAgaW50IGksajsKLSAgY2hhciBhc3RyWzJdWzMyXTsKLSAgdW5zaWduZWQgaW50IGluc1syXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDsKLSAgY2hhciBidWZbMzJdOwotICBpbnQgbWF0Y2gsIG51bV9tYXRjaD0wOwotICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICBpbnQgbmVlZF9wYXJlbiA9IDA7Ci0KLSAgaW5zWzBdID0gKGluc24gJiAweDNGRkZGRkZGKSA+PiAxNTsKLSAgaW5zWzFdID0gaW5zbiAmIDB4MDAwMDdGRkY7Ci0KLSAgZm9yKGo9MDtqPDI7aisrKQotICAgIHsKLSAgICAgIG9wID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWQxMHZfb3Bjb2RlczsKLSAgICAgIG1hdGNoPTA7Ci0gICAgICB3aGlsZSAob3AtPm5hbWUpCi0JewotCSAgaWYgKChvcC0+Zm9ybWF0ICYgU0hPUlRfT1BDT0RFKSAmJiAoKG9wLT5tYXNrICYgaW5zW2pdKSA9PSBvcC0+b3Bjb2RlKSkKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsb3AtPm5hbWUpOyAgIAotCSAgICAgIGZvciAoaT0wOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQkJewotCQkgIG9wZXIgPSAoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV07Ci0JCSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0JCSAgICBuZWVkX3BhcmVuID0gMTsKLQkJICBwcmludF9vcGVyYW5kIChvcGVyLCBpbnNbal0sIG9wLCBtZW1hZGRyLCBpbmZvKTsKLQkJICBpZiAob3AtPm9wZXJhbmRzW2krMV0gJiYgb3Blci0+Yml0cyAmJiAKLQkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX1BMVVMgJiYKLQkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX01JTlVTKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOyAgIAotCQl9Ci0JICAgICAgbWF0Y2ggPSAxOwotCSAgICAgIG51bV9tYXRjaCsrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvcCsrOwotCX0KLSAgICAgIGlmICghbWF0Y2gpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ1bmtub3duIik7ICAgCi0KLSAgICAgIHN3aXRjaCAob3JkZXIpCi0JewotCWNhc2UgMDoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQtPlx0Iik7ICAgCi0JICBvcmRlciA9IC0xOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDwtXHQiKTsgICAKLQkgIG9yZGVyID0gLTE7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0fHxcdCIpOyAgIAotCSAgb3JkZXIgPSAtMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChudW1fbWF0Y2ggPT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLGluc24pOyAgIAotCi0gIGlmIChuZWVkX3BhcmVuKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOyAgIAotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMTB2LW9wYy5jIGIvb3Bjb2Rlcy9kMTB2LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGJiMDk4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZDEwdi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKiBkMTB2LW9wYy5jIC0tIEQxMFYgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDEwdi5oIgotCi0KLS8qICAgVGhlIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1jb25zdCBzdHJ1Y3QgcGRfcmVnIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgTlVMTCwgT1BFUkFORF9BQ0MwKzAgfSwKLSAgeyAiYTEiLCBOVUxMLCBPUEVSQU5EX0FDQzErMSB9LAotICB7ICJicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiYyIsIE5VTEwsIE9QRVJBTkRfQ0ZMQUcrMyB9LAotICB7ICJjcjAiLCAicHN3IiwgT1BFUkFORF9DT05UUk9MIH0sCi0gIHsgImNyMSIsICJicHN3IiwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiY3IxMCIsICJtb2RfcyIsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJjcjExIiwgIm1vZF9lIiwgT1BFUkFORF9DT05UUk9MKzExIH0sCi0gIHsgImNyMTIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTIgfSwKLSAgeyAiY3IxMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMyB9LAotICB7ICJjcjE0IiwgImliYSIsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAotICB7ICJjcjE1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE1IH0sCi0gIHsgImNyMiIsICJwYyIsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgImNyMyIsICJicGMiLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJjcjQiLCAiZHBzdyIsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCi0gIHsgImNyNSIsICJkcGMiLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJjcjYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNiB9LAotICB7ICJjcjciLCAicnB0X2MiLCBPUEVSQU5EX0NPTlRST0wrNyB9LAotICB7ICJjcjgiLCAicnB0X3MiLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJjcjkiLCAicnB0X2UiLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJkcGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJkcHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiZjAiLCBOVUxMLCBPUEVSQU5EX0ZGTEFHKzAgfSwKLSAgeyAiZjEiLCBOVUxMLCBPUEVSQU5EX0ZGTEFHKzEgfSwKLSAgeyAiaWJhIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImxpbmsiLCAicjEzIiwgT1BFUkFORF9HUFIrMTMgfSwKLSAgeyAibW9kX2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAibW9kX3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMCB9LAotICB7ICJyMCIsIE5VTEwsIE9QRVJBTkRfR1BSKzAgfSwKLSAgeyAicjAtcjEiLCBOVUxMLCBPUEVSQU5EX0dQUiswfSwKLSAgeyAicjEiLCBOVUxMLCBPUEVSQU5EX0dQUisxIH0sCi0gIHsgInIxIiwgTlVMTCwgT1BFUkFORF9HUFIrMSB9LAotICB7ICJyMTAiLCBOVUxMLCBPUEVSQU5EX0dQUisxMCB9LAotICB7ICJyMTAtcjExIiwgTlVMTCwgT1BFUkFORF9HUFIrMTAgfSwKLSAgeyAicjExIiwgTlVMTCwgT1BFUkFORF9HUFIrMTEgfSwKLSAgeyAicjEyIiwgTlVMTCwgT1BFUkFORF9HUFIrMTIgfSwKLSAgeyAicjEyLXIxMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzEyIH0sCi0gIHsgInIxMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzEzIH0sCi0gIHsgInIxNCIsIE5VTEwsIE9QRVJBTkRfR1BSKzE0IH0sCi0gIHsgInIxNC1yMTUiLCBOVUxMLCBPUEVSQU5EX0dQUisxNCB9LAotICB7ICJyMTUiLCAic3AiLCBPUEVSQU5EX0dQUisxNSB9LAotICB7ICJyMiIsIE5VTEwsIE9QRVJBTkRfR1BSKzIgfSwKLSAgeyAicjItcjMiLCBOVUxMLCBPUEVSQU5EX0dQUisyIH0sCi0gIHsgInIzIiwgTlVMTCwgT1BFUkFORF9HUFIrMyB9LAotICB7ICJyNCIsIE5VTEwsIE9QRVJBTkRfR1BSKzQgfSwKLSAgeyAicjQtcjUiLCBOVUxMLCBPUEVSQU5EX0dQUis0IH0sCi0gIHsgInI1IiwgTlVMTCwgT1BFUkFORF9HUFIrNSB9LAotICB7ICJyNiIsIE5VTEwsIE9QRVJBTkRfR1BSKzYgfSwKLSAgeyAicjYtcjciLCBOVUxMLCBPUEVSQU5EX0dQUis2IH0sCi0gIHsgInI3IiwgTlVMTCwgT1BFUkFORF9HUFIrNyB9LAotICB7ICJyOCIsIE5VTEwsIE9QRVJBTkRfR1BSKzggfSwKLSAgeyAicjgtcjkiLCBOVUxMLCBPUEVSQU5EX0dQUis4IH0sCi0gIHsgInI5IiwgTlVMTCwgT1BFUkFORF9HUFIrOSB9LAotICB7ICJycHRfYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgInJwdF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzkgfSwKLSAgeyAicnB0X3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJzcCIsIE5VTEwsIE9QRVJBTkRfR1BSKzE1IH0sCi19OwotCi1pbnQgCi1kMTB2X3JlZ19uYW1lX2NudCgpCi17Ci0gIHJldHVybiAoc2l6ZW9mKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKTsKLX0KLQotY29uc3Qgc3RydWN0IGQxMHZfb3BlcmFuZCBkMTB2X29wZXJhbmRzW10gPQotewotI2RlZmluZSBVTlVTRUQJKDApCi0gIHsgMCwgMCwgMCB9LAotI2RlZmluZSBSU1JDCShVTlVTRUQgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJEU1QJKFJTUkMgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfREVTVHxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBU1JDCShSRFNUICsgMSkKLSAgeyAxLCA0LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFTUkMwT05MWSAoQVNSQyArIDEpCi0gIHsgMSwgNCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFEU1QJKEFTUkMwT05MWSArIDEpCi0gIHsgMSwgOCwgT1BFUkFORF9ERVNUfE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUlNSQ0UJKEFEU1QgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfRVZFTnxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSRFNURQkoUlNSQ0UgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfRVZFTnxPUEVSQU5EX0RFU1R8T1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgTlVNMTYJKFJEU1RFICsgMSkKLSAgeyAxNiwgMCwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgTlVNMwkoTlVNMTYgKyAxKQkJCS8qIHJhYywgcmFjaGkgKi8KLSAgeyAzLCAxLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRHxSRVNUUklDVEVEX05VTTMgfSwKLSNkZWZpbmUgTlVNNAkoTlVNMyArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgVU5VTTQJKE5VTTQgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIFVOVU00UwkoVU5VTTQgKyAxKQkJCS8qIGFkZGksIHNsbGksIHNyYWksIHNybGksIHN1YmkgKi8KLSAgeyA0LCAxLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NISUZUIH0sCi0jZGVmaW5lIFVOVU04CShVTlVNNFMgKyAxKQkJCS8qIHJlcGkgKi8KLSAgeyA4LCAxNiwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgVU5VTTE2CShVTlVNOCArIDEpCQkJLyogY21wdWkgKi8KLSAgeyAxNiwgMCwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgQU5VTTE2CShVTlVNMTYgKyAxKQotICB7IDE2LCAwLCBPUEVSQU5EX0FERFJ8T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgQU5VTTgJKEFOVU0xNiArIDEpCi0gIHsgOCwgMCwgT1BFUkFORF9BRERSfE9QRVJBTkRfU0lHTkVEIH0sCi0jZGVmaW5lIEFTUkMyCShBTlVNOCArIDEpCi0gIHsgMSwgOCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSU1JDMgkoQVNSQzIgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJTUkMyRQkoUlNSQzIgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHfE9QRVJBTkRfRVZFTiB9LAotI2RlZmluZSBBU1JDMAkoUlNSQzJFICsgMSkKLSAgeyAxLCAwLCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFEU1QwCShBU1JDMCArIDEpCi0gIHsgMSwgMCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFR3xPUEVSQU5EX0RFU1QgfSwKLSNkZWZpbmUgRkZTUkMJKEFEU1QwICsgMSkKLSAgeyAyLCAxLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkZMQUcgfSwKLSNkZWZpbmUgQ0ZTUkMJKEZGU1JDICsgMSkKLSAgeyAyLCAxLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfQ0ZMQUcgfSwKLSNkZWZpbmUgRkRTVAkoQ0ZTUkMgKyAxKQotICB7IDEsIDUsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GRkxBRyB8IE9QRVJBTkRfREVTVH0sCi0jZGVmaW5lIEFUU0lHTgkoRkRTVCArIDEpCi0gIHsgMCwgMCwgT1BFUkFORF9BVFNJR059LAotI2RlZmluZSBBVFBBUgkoQVRTSUdOICsgMSkJLyogIkAoIiAqLwotICB7IDAsIDAsIE9QRVJBTkRfQVRQQVJ9LAotI2RlZmluZSBQTFVTCShBVFBBUiArIDEpCS8qIHBvc3RpbmNyZW1lbnQgKi8KLSAgeyAwLCAwLCBPUEVSQU5EX1BMVVN9LAotI2RlZmluZSBNSU5VUwkoUExVUyArIDEpCS8qIHBvc3RkZWNyZW1lbnQgKi8KLSAgeyAwLCAwLCBPUEVSQU5EX01JTlVTfSwKLSNkZWZpbmUgQVRNSU5VUwkoTUlOVVMgKyAxKQkvKiBwcmVkZWNyZW1lbnQgKi8KLSAgeyAwLCAwLCBPUEVSQU5EX0FUTUlOVVN9LAotI2RlZmluZSBDU1JDCShBVE1JTlVTICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLwotICB7IDQsIDEsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTH0sCi0jZGVmaW5lIENEU1QJKENTUkMgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgNCwgNSwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfE9QRVJBTkRfREVTVH0sCi19OwotCi1jb25zdCBzdHJ1Y3QgZDEwdl9vcGNvZGUgZDEwdl9vcGNvZGVzW10gPSB7Ci0gIHsgImFicyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0NjA3LCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgImFicyIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDU2MDcsIDB4N2VmZiwgeyBBRFNUIH0gfSwKLSAgeyAiYWRkIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0NBUiwgMHgwMjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgImFkZCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTIwMSwgMHg3ZWUzLCB7IEFEU1QsIFJTUkNFIH0gfSwKLSAgeyAiYWRkIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMjAzLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgImFkZDJ3IiwgU0hPUlRfMiwgMiwgSVUsIFBBUnxXQ0FSLCAweDEyMDAsIDB4N2UyMywgeyBSRFNURSwgUlNSQ0UgfSB9LAotICB7ICJhZGQzIiwgTE9OR19MLCAxLCBNVSwgU0VRfFdDQVIsIDB4MTAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBSU1JDLCBOVU0xNiB9IH0sCi0gIHsgImFkZGFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDIwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKLSAgeyAiYWRkYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMjAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCi0gIHsgImFkZGFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEyMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCi0gIHsgImFkZGFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEyMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKLSAgeyAiYWRkaSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdDQVIsICAweDIwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00UyB9IH0sCi0gIHsgImFuZCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweGMwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJhbmQzIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDYwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICB7ICJiY2xyaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4YzAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJibCIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKLSAgeyAiYmwucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0hfTElOS3xQQVIsIDB4NDkwMCwgMHg3ZjAwLCB7IEFOVU04IH0gfSwKLSAgeyAiYmwubCIsIExPTkdfQiwgMywgTVUsIEJSQU5DSF9MSU5LfFNFUSwgMHgyNDgwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAotICB7ICJibm90aSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4YTAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJicmEiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCi0gIHsgImJyYS5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSHxQQVIsIDB4NDgwMCwgMHg3ZjAwLCB7IEFOVU04IH0gfSwKLSAgeyAiYnJhLmwiLCBMT05HX0IsIDMsIE1VLCBCUkFOQ0h8U0VRLCAweDI0MDAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCi0gIHsgImJyZjBmIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJicmYwZi5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSHxQQVJ8UkYwLCAweDRhMDAsIDB4N2YwMCwgeyBBTlVNOCB9IH0sCi0gIHsgImJyZjBmLmwiLCBMT05HX0IsIDMsIE1VLCBTRVEsIDB4MjUwMDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYnJmMHQiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCi0gIHsgImJyZjB0LnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIfFBBUnxSRjAsIDB4NGIwMCwgMHg3ZjAwLCB7IEFOVU04IH0gfSwKLSAgeyAiYnJmMHQubCIsIExPTkdfQiwgMywgTVUsIFNFUSwgMHgyNTgwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAotICB7ICJic2V0aSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4ODAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJidHN0aSIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweGUwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAiY2xyYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU2MDEsIDB4N2VmZiwgeyBBRFNUIH0gfSwKLSAgeyAiY21wIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDYwMCwgMHg3ZTAxLCB7IFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAiY21wIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MTYwMywgMHg3ZWVmLCB7IEFTUkMyLCBBU1JDIH0gfSwKLSAgeyAiY21wZXEiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NDAwLCAweDdlMDEsIHsgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJjbXBlcSIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDE0MDMsIDB4N2VlZiwgeyBBU1JDMiwgQVNSQyB9IH0sCi0gIHsgImNtcGVxaSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDEsIDQsIDE2LCAwIH0gfSwKLSAgeyAiY21wZXFpLnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NDAxLCAweDdlMDEsIHsgUlNSQzIsIE5VTTQgfSB9LAotICB7ICJjbXBlcWkubCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgyMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBOVU0xNiB9IH0sCi0gIHsgImNtcGkiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAxLCA0LCAxNiwgMCB9IH0sCi0gIHsgImNtcGkucyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg2MDEsIDB4N2UwMSwgeyBSU1JDMiwgTlVNNCB9IH0sCi0gIHsgImNtcGkubCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBOVU0xNiB9IH0sCi0gIHsgImNtcHUiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NDYwMCwgMHg3ZTAxLCB7IFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAiY21wdWkiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MjMwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIFVOVU0xNiB9IH0sCi0gIHsgImNwZmciLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDRlMGYsIDB4N2ZkZiwgeyBGRFNULCBDRlNSQyB9IH0sCi0gIHsgImNwZmciLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDRlMDksIDB4N2ZkOSwgeyBGRFNULCBGRlNSQyB9IH0sCi0gIHsgImRidCIsIFNIT1JUXzIsIDUsIE1VLCBQQVIsIDB4NWYyMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJkaXZzIiwgTE9OR19MLCAxLCBCT1RILCBTRVEsIDB4MTQwMDI4MDAsIDB4M2YxMGZlMjEsIHsgUkRTVEUsIFJTUkMgfSB9LAotICB7ICJleGVmMGYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUwNCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmMHQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUyNCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmMWYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGU0MCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmMXQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGU0MiwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmYWYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUwMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGVmYXQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUwMiwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGV0YWYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUyMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleGV0YXQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUk9OTFksIDB4NGUyMiwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJleHAiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTUwMDJhMDAsIDB4M2ZmZmZlMDMsIHsgUkRTVCwgUlNSQ0UgfSB9LAotICB7ICJleHAiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTUwMDJhMDIsIDB4M2ZmZmZlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgImpsIiwgU0hPUlRfMiwgMywgTVUsIEJSQU5DSF9MSU5LfFBBUiwgMHg0ZDAwLCAweDdmZTEsIHsgUlNSQyB9IH0sCi0gIHsgImptcCIsIFNIT1JUXzIsIDMsIE1VLCBCUkFOQ0h8UEFSLCAweDRjMDAsIDB4N2ZlMSwgeyBSU1JDIH0gfSwKLSAgeyAibGQiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzAwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAibGQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjQwMSwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAotICB7ICJsZCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2MDAxLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKLSAgeyAibGQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjAwMCwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgImxkIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMyMDEwMDAwLCAweDNmMGYwMDAwLCB7IFJEU1QsIEFUU0lHTiwgTlVNMTYgfSB9LAotICB7ICJsZDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMxMDAwMDAwLCAweDNmMTAwMDAwLCB7IFJEU1RFLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDY2MDEsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgImxkMnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjIwMSwgMHg3ZTIxLCB7IFJEU1RFLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYyMDAsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibGQydyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMzAxMDAwMCwgMHgzZjFmMDAwMCwgeyBSRFNURSwgQVRTSUdOLCBOVU0xNiB9IH0sCi0gIHsgImxkYiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzODAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZGIiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NzAwMCwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgImxkaSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDEsIDQsIDE2LCAwIH0gfSwKLSAgeyAibGRpLnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSTUVNLCAweDQwMDEsIDB4N2UwMSAsIHsgUkRTVCwgTlVNNCB9IH0sCi0gIHsgImxkaS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIwMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJEU1QsIE5VTTE2IH0gfSwKLSAgeyAibGR1YiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzOTAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZHViIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDcyMDAsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJtYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJhMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtYWNzdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWEwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1hY3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNhMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtYXgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgyNjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDAsIDB4N2VlMywgeyBBRFNULCBSU1JDRSB9IH0sCi0gIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDIsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MjYwMSwgMHg3ZTAxICwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMSwgMHg3ZWUzICwgeyBBRFNULCBSU1JDRSB9IH0sCi0gIHsgIm1pbiIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAibXNiIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyODAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXNic3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDE4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtc2J1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzODAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXVsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyZTAwLCAweDdlMDEgLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdWx4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyYzAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXVseHN1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxYzAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXVseHUiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDQwMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXYydyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTAwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCi0gIHsgIm12MndmYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDAsIDB4N2UyZiwgeyBSRFNURSwgQVNSQyB9IH0sCi0gIHsgIm12Mnd0YWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDEsIDB4N2VlMywgeyBSU1JDRSwgQURTVCB9IH0sCi0gIHsgIm12YWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAibXZiIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1NDAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm12ZjBmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8UkYwLCAweDQ0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXZmMHQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSRjAsIDB4NDQwMSwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdmZhY2ciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDQsIDB4N2UwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAibXZmYWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwMCwgMHg3ZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJtdmZhY2xvIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTAyLCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgIm12ZmMiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDUyMDAsIDB4N2UwMSwgeyBSRFNULCBDU1JDIH0gfSwKLSAgeyAibXZ0YWNnIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTQxLCAweDdlZTEsIHsgUlNSQywgQURTVCB9IH0sCi0gIHsgIm12dGFjaGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDEsIDB4N2VlMSwgeyBSU1JDLCBBRFNUIH0gfSwKLSAgeyAibXZ0YWNsbyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUyMSwgMHg3ZWUxLCB7IFJTUkMsIEFEU1QgfSB9LAotICB7ICJtdnRjIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg1NjAwLCAweDdlMDEsIHsgUlNSQywgQ0RTVCB9IH0sCi0gIHsgIm12dWIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU0MDEsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibmVnIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NDYwNSwgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJuZWciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU2MDUsIDB4N2VmZiwgeyBBRFNUIH0gfSwKLSAgeyAibm9wIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NWUwMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJub3QiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg0NjAzLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgIm9yIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4ODAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm9yMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg0MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgLyogU3BlY2lhbCBjYXNlLiBzYWMmc2FjaGkgbXVzdCBvY2N1ciBiZWZvcmUgcmFjJnJhY2hpIGJlY2F1c2UgdGhleSBoYXZlCi0gICAgIGludGVyc2VjdGluZyBtYXNrcyEgVGhlIG1hc2tzIGZvciByYWMmcmFjaGkgd2lsbCBtYXRjaCBzYWMmc2FjaGkgYnV0Ci0gICAgIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLSAgICovCi0gIHsgInNhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8UkYwfFdGMCwgMHg1MjA5LCAweDdlMmYsIHsgUkRTVEUsIEFTUkMgfSB9LAotICB7ICJzYWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8UkYwfFdGMCwgMHg0MjA5LCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgInJhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDUyMDEsIDB4N2UyMSwgeyBSRFNURSwgQVNSQzBPTkxZLCBOVU0zIH0gfSwKLSAgeyAicmFjaGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHg0MjAxLCAweDdlMDEsIHsgUkRTVCwgQVNSQywgTlVNMyB9IH0sCi0gIHsgInJlcCIsIExPTkdfTCwgMiwgTVUsIFNFUSwgMHgyNzAwMDAwMCwgMHgzZmYwMDAwMCwgeyBSU1JDLCBBTlVNMTYgfSB9LAotICB7ICJyZXBpIiwgTE9OR19MLCAyLCBNVSwgU0VRLCAweDJmMDAwMDAwLCAweDNmMDAwMDAwLCB7IFVOVU04LCBBTlVNMTYgfSB9LAotICB7ICJydGQiLCBTSE9SVF8yLCAzLCBNVSwgUEFSLCAweDVmNjAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAicnRlIiwgU0hPUlRfMiwgMywgTVUsIFBBUiwgMHg1ZjQwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInNhZGQiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEyMjMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAic2V0ZjBmIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSRjAsIDB4NDYxMSwgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJzZXRmMHQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJGMCwgMHg0NjEzLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInNsYWUiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMyMjAsIDB4N2VlMSwgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic2xlZXAiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDVmYzAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAic2xsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgInNsbCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzIwMCwgMHg3ZWUxLCB7IEFEU1QsIFJTUkMgfSB9LAotICB7ICJzbGxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMjAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJzbGxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMjAxLCAweDdlZTEsIHsgQURTVCwgVU5VTTRTIH0gfSwKLSAgeyAic2x4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxSRjAsIDB4NDYwYiwgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJzcmEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic3JhIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzNDAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNyYWkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI0MDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgInNyYWkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM0MDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAotICB7ICJzcmwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIwMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic3JsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMDAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNybGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIwMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgInNybGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMwMDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAotICB7ICJzcngiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFJGMCwgMHg0NjA5LCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInN0IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM0MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJTUkMyLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJzdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2ODAwLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZjMWYsIDB4N2UxZiwgeyBSU1JDMiwgQVRNSU5VUywgUlNSQyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDY4MDEsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmMwMSwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMsIE1JTlVTIH0gfSwKLSAgeyAic3QiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzYwMTAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIEFUU0lHTiwgTlVNMTYgfSB9LAotICB7ICJzdDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM1MDAwMDAwLCAweDNmMTAwMDAwLCB7IFJTUkMyRSwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YTAwLCAweDdlMjEsIHsgUlNSQzJFLCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZlMWYsIDB4N2UzZiwgeyBSU1JDMkUsIEFUTUlOVVMsIFJTUkMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZhMDEsIDB4N2UyMSwgeyBSU1JDMkUsIEFUU0lHTiwgUlNSQywgUExVUyB9IH0sCi0gIHsgInN0MnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmUwMSwgMHg3ZTIxLCB7IFJTUkMyRSwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgInN0MnciLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzcwMTAwMDAsIDB4M2YxZjAwMDAsIHsgUlNSQzJFLCBBVFNJR04sIE5VTTE2IH0gfSwKLSAgeyAic3RiIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDNjMDAwMDAwLCAweDNmMDAwMDAwLCB7IFJTUkMyLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJzdGIiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NzgwMCwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJzdG9wIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg1ZmUwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgInN1YiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdDQVIsIDB4MCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJzdWIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEwMDEsIDB4N2VlMywgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic3ViIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMDAzLCAweDdlZWYsIHsgQURTVCwgQVNSQyB9IH0sCi0gIHsgInN1YjJ3IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXQ0FSLCAweDEwMDAsIDB4N2UyMywgeyBSRFNURSwgUlNSQ0UgfSB9LAotICB7ICJzdWJhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAwMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCi0gIHsgInN1YmFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDAwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJzdWJhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMDAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJzdWJhYzNzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAxMDAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCi0gIHsgInN1YmkiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHgxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTRTIH0gfSwKLSAgeyAidHJhcCIsIFNIT1JUXzIsIDUsIE1VLCBCUkFOQ0hfTElOS3xQQVIsIDB4NWYwMCwgMHg3ZmUxLCB7IFVOVU00IH0gfSwKLSAgeyAidHN0MGkiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4NzAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgTlVNMTYgfSB9LAotICB7ICJ0c3QxaSIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHhmMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBOVU0xNiB9IH0sCi0gIHsgIndhaXQiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDVmODAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAieG9yIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4YTAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgInhvcjMiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4NTAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBSU1JDLCBOVU0xNiB9IH0sCi0gIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgeyAwIH0gfSwKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMzB2LWRpcy5jIGIvb3Bjb2Rlcy9kMzB2LWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2RhZDY5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZDMwdi1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBEMzBWIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAib3Bjb2RlL2QzMHYuaCIgCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jZGVmaW5lIFBDX01BU0sgMHhGRkZGRkZGRgotCi1zdGF0aWMgaW50IGxvb2t1cF9vcGNvZGUgUEFSQU1TICgoIHN0cnVjdCBkMzB2X2luc24gKmluc24sIGxvbmcgbnVtLCBpbnQgaXNfbG9uZyApKTsKLXN0YXRpYyB2b2lkIHByaW50X2luc24gUEFSQU1TICgoIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLCBiZmRfdm1hIG1lbWFkZHIsIGxvbmcgbG9uZyBudW0sIAotCQkJCSBzdHJ1Y3QgZDMwdl9pbnNuICppbnNuLCBpbnQgaXNfbG9uZywgaW50IHNob3dfZXh0ICkpOwotc3RhdGljIGludCBleHRyYWN0X3ZhbHVlIFBBUkFNUyAoKCBsb25nIGxvbmcgbnVtLCBzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcGVyLCBpbnQgaXNfbG9uZyApKTsKLQotaW50IAotcHJpbnRfaW5zbl9kMzB2IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzLCByZXN1bHQ7Ci0gIGJmZF9ieXRlIGJ1ZmZlclsxMl07Ci0gIHVuc2lnbmVkIGxvbmcgaW4xLGluMjsKLSAgc3RydWN0IGQzMHZfaW5zbiBpbnNuOwotICBsb25nIGxvbmcgbnVtOwotCi0gIGluc24uZm9ybSA9IChzdHJ1Y3QgZDMwdl9mb3JtYXQgKilOVUxMOwotCi0gIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gODsKLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpbjEgPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIrNCwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gODsKLSAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMSwgMCkpKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgiLGluMSk7Ci0gICAgICBlbHNlCi0JcHJpbnRfaW5zbihpbmZvLCBtZW1hZGRyLCAobG9uZyBsb25nKSBpbjEsICZpbnNuLCAwLCByZXN1bHQpOwotICAgICAgcmV0dXJuIDQ7ICAgICAgCi0gICAgfQotICBpbjIgPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAKLSAgaWYgKGluMSAmIGluMiAmIEZNMDEpCi0gICAgewotICAgICAgLyogTE9ORyBpbnN0cnVjdGlvbiAqLwotICAgICAgaWYgKCEocmVzdWx0ID0gbG9va3VwX29wY29kZSgmaW5zbiwgaW4xLCAxKSkpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHgleCwweCV4IixpbjEsaW4yKTsKLQkgIHJldHVybiA4OwotCX0KLSAgICAgIG51bSA9IChsb25nIGxvbmcpaW4xIDw8IDMyIHwgaW4yOwotICAgICAgcHJpbnRfaW5zbihpbmZvLCBtZW1hZGRyLCBudW0sICZpbnNuLCAxLCByZXN1bHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG51bSA9IGluMTsKLSAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMSwgMCkpKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgiLGluMSk7Ci0gICAgICBlbHNlCi0JcHJpbnRfaW5zbihpbmZvLCBtZW1hZGRyLCBudW0sICZpbnNuLCAwLCByZXN1bHQpOwotICAgICAgCi0gICAgICBzd2l0Y2ggKCAoKGluMT4+MzEpPDwxKSB8IChpbjI+PjMxKSApCi0JewotCWNhc2UgMDoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHR8fFx0Iik7ICAgCi0JICBicmVhazsKLQljYXNlIDE6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0LT5cdCIpOyAgIAotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDwtXHQiKTsgICAKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICBpbnNuLmZvcm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopTlVMTDsKLSAgICAgIG51bSA9IGluMjsKLSAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMiwgMCkpKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgiLGluMik7Ci0gICAgICBlbHNlCi0JcHJpbnRfaW5zbihpbmZvLCBtZW1hZGRyLCBudW0sICZpbnNuLCAwLCByZXN1bHQpOwotCi0gICAgfQotICByZXR1cm4gODsKLX0KLQotCi0vKiByZXR1cm5zIDAgaWYgbG9va3VwIGZhaWxzICovCi0vKiAxIGlmIGZvdW5kIGFuZCBvbmx5IG9uZSBmb3JtICovCi0vKiAyIGlmIGZvdW5kIGFuZCB0aGVyZSBhcmUgc2hvcnQgYW5kIGxvbmcgZm9ybXMgKi8KLXN0YXRpYyBpbnQKLWxvb2t1cF9vcGNvZGUgKGluc24sIG51bSwgaXNfbG9uZykKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqaW5zbjsKLSAgICAgbG9uZyBudW07Ci0gICAgIGludCBpc19sb25nOwotewotICBpbnQgaT0wLCBpbmRleDsKLSAgc3RydWN0IGQzMHZfZm9ybWF0ICpmOwotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wID0gKHN0cnVjdCBkMzB2X29wY29kZSAqKWQzMHZfb3Bjb2RlX3RhYmxlOwotICBpbnQgb3AxID0gKG51bSA+PiAyNSkgJiAweDc7Ci0gIGludCBvcDIgPSAobnVtID4+IDIwKSAmIDB4MWY7Ci0gIGludCBtb2QgPSAobnVtID4+IDE4KSAmIDB4MzsKLQotICAvKiBmaW5kIHRoZSBvcGNvZGUgKi8KLSAgZG8gewotICAgIGlmICgob3AtPm9wMSA9PSBvcDEpICYmIChvcC0+b3AyID09IG9wMikpCi0gICAgICBicmVhazsKLSAgICBvcCsrOwotICB9IHdoaWxlIChvcC0+bmFtZSk7Ci0KLSAgaWYgKCFvcCB8fCAhb3AtPm5hbWUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgd2hpbGUgKG9wLT5vcDEgPT0gb3AxICYmIG9wLT5vcDIgPT0gb3AyKQotICAgIHsKLSAgICAgIC8qIHNjYW4gdGhyb3VnaCBhbGwgdGhlIGZvcm1hdHMgZm9yIHRoZSBvcGNvZGUgICovCi0gICAgICBpbmRleCA9IG9wLT5mb3JtYXRbaSsrXTsKLSAgICAgIGRvIAotCXsKLQkgIGYgPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopJmQzMHZfZm9ybWF0X3RhYmxlW2luZGV4XTsKLQkgIHdoaWxlIChmLT5mb3JtID09IGluZGV4KQotCSAgICB7Ci0JICAgICAgaWYgKCghaXNfbG9uZyB8fCBmLT5mb3JtID49IExPTkcpICYmIChmLT5tb2RpZmllciA9PSBtb2QpKQotCQl7Ci0JCSAgaW5zbi0+Zm9ybSA9IGY7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBmKys7Ci0JICAgIH0KLQkgIGlmIChpbnNuLT5mb3JtKQotCSAgICBicmVhazsKLQl9IHdoaWxlICgoaW5kZXggPSBvcC0+Zm9ybWF0W2krK10pICE9IDApOwotICAgICAgaWYgKGluc24tPmZvcm0pCi0JYnJlYWs7Ci0gICAgICBvcCsrOwotICAgICAgaT0wOwotICAgIH0KLSAgaWYgKGluc24tPmZvcm0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpbnNuLT5vcCA9IG9wOwotICBpbnNuLT5lY2MgPSAobnVtID4+IDI4KSAmIDB4NzsKLSAgaWYgKG9wLT5mb3JtYXRbMV0pCi0gICAgcmV0dXJuIDI7Ci0gIGVsc2UKLSAgICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdm9pZCAKLXByaW50X2luc24gKCBpbmZvLCBtZW1hZGRyLCBudW0sIGluc24sIGlzX2xvbmcsIHNob3dfZXh0ICkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgbG9uZyBsb25nIG51bTsKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqaW5zbjsKLSAgICAgaW50IGlzX2xvbmc7Ci0gICAgIGludCBzaG93X2V4dDsKLXsKLSAgaW50IHZhbCwgb3BudW0sIG5lZWRfY29tbWE9MDsKLSAgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlcjsKLSAgaW50IGksIG1hdGNoLCBvcGluZD0wLCBuZWVkX3BhcmVuPTAsIGZvdW5kX2NvbnRyb2w9MDsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIixpbnNuLT5vcC0+bmFtZSk7Ci0KLSAgLyogY2hlY2sgZm9yIENNUCBvciBDTVBVICovCi0gIGlmIChkMzB2X29wZXJhbmRfdGFibGVbaW5zbi0+Zm9ybS0+b3BlcmFuZHNbMF1dLmZsYWdzICYgT1BFUkFORF9OQU1FKQotICAgIHsKLSAgICAgIG9waW5kKys7Ci0gICAgICB2YWwgPSBleHRyYWN0X3ZhbHVlKG51bSwoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbaW5zbi0+Zm9ybS0+b3BlcmFuZHNbMF1dLGlzX2xvbmcpOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsZDMwdl9jY19uYW1lc1t2YWxdKTsKLSAgICB9Ci0KLSAgLyogYWRkIGluICIucyIgb3IgIi5sIiAqLwotICBpZiAoc2hvd19leHQgPT0gMikKLSAgICB7Ci0gICAgICBpZiAoaXNfbG9uZykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sIik7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIucyIpOwotICAgIH0KLQotICBpZiAoaW5zbi0+ZWNjKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLyVzIixkMzB2X2VjY19uYW1lc1tpbnNuLT5lY2NdKTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgd2hpbGUgKChvcG51bSA9IGluc24tPmZvcm0tPm9wZXJhbmRzW29waW5kKytdKSAhPSAwKQotICAgIHsKLSAgICAgIGludCBiaXRzOwotICAgICAgb3BlciA9IChzdHJ1Y3QgZDMwdl9vcGVyYW5kICopJmQzMHZfb3BlcmFuZF90YWJsZVtvcG51bV07Ci0gICAgICBiaXRzID0gb3Blci0+Yml0czsKLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfU0hJRlQpCi0JYml0cyArPSAzOwotCi0gICAgICBpZiAobmVlZF9jb21tYSAmJiBvcGVyLT5mbGFncyAhPSBPUEVSQU5EX1BMVVMgJiYgb3Blci0+ZmxhZ3MgIT0gT1BFUkFORF9NSU5VUykKLQl7Ci0JICBuZWVkX2NvbW1hPTA7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwgIik7Ci0JfQotCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVE1JTlVTKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQC0iKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX01JTlVTKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSIpOyAgIAotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfUExVUykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisiKTsgICAKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUU0lHTikKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAiKTsgICAKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUUEFSKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCgiKTsgICAKLQkgIG5lZWRfcGFyZW4gPSAxOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9TUEVDSUFMKQotCWNvbnRpbnVlOwotCi0gICAgICB2YWwgPSBleHRyYWN0X3ZhbHVlKG51bSwgb3BlciwgaXNfbG9uZyk7Ci0gICAgICAKLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKQotCXsKLQkgIG1hdGNoID0gMDsKLQkgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXIzID0gCi0JCShzdHJ1Y3QgZDMwdl9vcGVyYW5kICopJmQzMHZfb3BlcmFuZF90YWJsZVtpbnNuLT5mb3JtLT5vcGVyYW5kc1syXV07CSAgICAgIAotCSAgICAgIGludCBpZCA9IGV4dHJhY3RfdmFsdWUgKG51bSwgb3BlcjMsIGlzX2xvbmcgKTsKLQkgICAgICBmb3VuZF9jb250cm9sID0gMTsKLQkgICAgICBzd2l0Y2ggKCBpZCApCi0JCXsKLQkJY2FzZSAwOgotCQkgIHZhbCB8PSBPUEVSQU5EX0NPTlRST0w7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQkgIHZhbCA9IE9QRVJBTkRfQ09OVFJPTCArIE1BWF9DT05UUk9MX1JFRyArIGlkOwotCQkgIGJyZWFrOwotCQljYXNlIDM6Ci0JCSAgdmFsIHw9IE9QRVJBTkRfRkxBRzsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBmcHJpbnRmKHN0ZGVyciwiaWxsZWdhbCBpZCAoJWQpXG4iLGlkKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQUNDKQotCSAgICB2YWwgfD0gT1BFUkFORF9BQ0M7Ci0JICBlbHNlIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfRkxBRykKLQkgICAgdmFsIHw9IE9QRVJBTkRfRkxBRzsKLQkgIGZvciAoaT0wO2k8cmVnX25hbWVfY250KCk7aSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHZhbCA9PSBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbaV0udmFsdWUpCi0JCXsKLQkJICBpZiAocHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLnBuYW1lKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCSAgICAgIChpbmZvLT5zdHJlYW0sICIlcyIscHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLnBuYW1lKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJICAgICAgKGluZm8tPnN0cmVhbSwgIiVzIixwcmVfZGVmaW5lZF9yZWdpc3RlcnNbaV0ubmFtZSk7Ci0JCSAgbWF0Y2g9MTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBpZiAobWF0Y2g9PTApCi0JICAgIHsKLQkgICAgICAvKiB0aGlzIHdvdWxkIG9ubHkgZ2V0IGV4ZWN1dGVkIGlmIGEgcmVnaXN0ZXIgd2FzIG5vdCBpbiB0aGUgCi0JCSByZWdpc3RlciB0YWJsZSAqLwotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkoaW5mby0+c3RyZWFtLCBfKCI8dW5rbm93biByZWdpc3RlciAlZD4iKSwgdmFsICYgMHgzRik7CSAgICAgIAotCSAgICB9Ci0JfQotICAgICAgLyogcmVwZWF0aSBoYXMgYSByZWxvY2F0aW9uLCBidXQgaXRzIGZpcnN0IGFyZ3VtZW50IGlzIGEgcGxhaW4KLQkgaW1tZWRpYXRlLiAgT1RPSCBpbnN0cnVjdGlvbnMgbGlrZSBkanNyaSBoYXZlIGEgcGMtcmVsYXRpdmUKLQkgZGVsYXkgdGFyZ2V0LCBidXQgYSBhYnNvbHV0ZSBqdW1wIHRhcmdldC4gIFRoZXJlZm9yZSwgYSB0ZXN0Ci0JIG9mIGluc24tPm9wLT5yZWxvY19mbGFnIGlzIG5vdCBzcGVjaWZpYyBlbm91Z2g7IHdlIG11c3QgdGVzdAotCSBpZiB0aGUgYWN0dWFsIG9wZXJhbmQgd2UgYXJlIGhhbmRsaW5nIG5vdyBpcyBwYy1yZWxhdGl2ZS4gICovCi0gICAgICBlbHNlIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfUENSRUwpCi0JewotCSAgaW50IG5lZyA9IDA7Ci0JICAKLQkgIC8qIElNTTZTMyBpcyB1bnNpZ25lZC4gICovCi0JICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCB8fCBiaXRzID09IDMyKQotCSAgICB7Ci0JICAgICAgbG9uZyBtYXg7Ci0JICAgICAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JICAgICAgaWYgKHZhbCAmIG1heCkKLQkJewotCQkgIGlmIChiaXRzID09IDMyKQotCQkgICAgdmFsID0gLXZhbDsKLQkJICBlbHNlCi0JCSAgICB2YWwgPSAtdmFsICYgKCgxIDw8IGJpdHMpLTEpOwotCQkgIG5lZyA9IDE7Ci0JCX0KLQkgICAgfQotCSAgaWYgKG5lZykKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSV4XHQoIix2YWwpOwotCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgLSB2YWwpICYgUENfTUFTSywgaW5mbyk7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXhcdCgiLHZhbCk7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIHZhbCkgJiBQQ19NQVNLLCBpbmZvKTsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24tPm9wLT5yZWxvY19mbGFnID09IFJFTE9DX0FCUykKLQl7Ci0JICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCwgaW5mbyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotCSAgICB7Ci0JICAgICAgaW50IG1heCA9ICgxIDw8IChiaXRzIC0gMSkpOwotCSAgICAgIGlmICh2YWwgJiBtYXgpCi0JCXsKLQkJICB2YWwgPSAtdmFsOwotCQkgIGlmIChiaXRzIDwgMzIpCi0JCSAgICB2YWwgJj0gKCgxIDw8IGJpdHMpIC0gMSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7Ci0JCX0KLQkgICAgfQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4Iix2YWwpOwotCX0KLSAgICAgIC8qIGlmIHRoZXJlIGlzIGFub3RoZXIgb3BlcmFuZCwgdGhlbiB3cml0ZSBhIGNvbW1hIGFuZCBzcGFjZSAqLwotICAgICAgaWYgKGluc24tPmZvcm0tPm9wZXJhbmRzW29waW5kXSAmJiAhKGZvdW5kX2NvbnRyb2wgJiYgb3BpbmQgPT0gMikpCi0JbmVlZF9jb21tYSA9IDE7Ci0gICAgfQotICBpZiAobmVlZF9wYXJlbikKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfdmFsdWUgKG51bSwgb3BlciwgaXNfbG9uZykKLSAgICAgbG9uZyBsb25nIG51bTsKLSAgICAgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlcjsKLSAgICAgaW50IGlzX2xvbmc7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBzaGlmdCA9IDEyIC0gb3Blci0+cG9zaXRpb247Ci0gIGludCBtYXNrID0gKDB4RkZGRkZGRkYgPj4gKDMyIC0gb3Blci0+Yml0cykpOwotCi0gIGlmIChpc19sb25nKQotICAgIHsKLSAgICAgIGlmIChvcGVyLT5iaXRzID09IDMyKSAKLQl7Ci0JICAvKiBwaWVjZSB0b2dldGhlciAzMi1iaXQgY29uc3RhbnQgKi8KLQkgIHZhbCA9ICgobnVtICYgMHgzRkZGRikKLQkJIHwgKChudW0gJiAweEZGMDAwMDApID4+IDIpCi0JCSB8ICgobnVtICYgMHgzRjAwMDAwMDAwTEwpID4+IDYpKTsKLQl9Ci0gICAgICBlbHNlCQotCXZhbCA9IChudW0gPj4gKDMyICsgc2hpZnQpKSAmIG1hc2s7CQotICAgIH0KLSAgZWxzZQotICAgIHZhbCA9IChudW0gPj4gc2hpZnQpICYgbWFzazsKLQotICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotICAgIHZhbCA8PD0gMzsKLQotICByZXR1cm4gdmFsOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMzB2LW9wYy5jIGIvb3Bjb2Rlcy9kMzB2LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTMzZjQ0Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZDMwdi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKiBkMzB2LW9wYy5jIC0tIEQzMFYgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2QzMHYuaCIKLQotLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuICovCi0vKiBJZiB5b3UgYWRkIGFueXRoaW5nLCBpdCBNVVNUIGJlIGluIGFscGhhYmV0aWNhbCBvcmRlciAqLwotLyogVGhlIGZpcnN0IGZpZWxkIGlzIHRoZSBuYW1lIHRoZSBhc3NlbWJsZXIgdXNlcyB3aGVuIGxvb2tpbmcgKi8KLS8qIHVwIG9yY29kZXMuICBUaGUgc2Vjb25kIGZpZWxkIGlzIHRoZSBuYW1lIHRoZSBkaXNhc3NlbWJsZXIgd2lsbCB1c2UuICovCi0vKiBUaGlzIGFsbG93cyB0aGUgYXNzZW1ibGVyIHRvIGFzc2VtYmxlIHJlZmVyZW5jZXMgdG8gcjYzIChmb3IgZXhhbXBsZSkgKi8KLS8qIG9yICJzcCIuICBUaGUgZGlzYXNzZW1ibGVyIHdpbGwgYWx3YXlzIHVzZSB0aGUgcHJlZmVycmVkIGZvcm0gKHNwKSAqLwotY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgTlVMTCwgT1BFUkFORF9BQ0MrMCB9LAotICB7ICJhMSIsIE5VTEwsIE9QRVJBTkRfQUNDKzEgfSwKLSAgeyAiYnBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMgfSwKLSAgeyAiYnBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxIH0sCi0gIHsgImMiLCAiYyIsIE9QRVJBTkRfRkxBRys3IH0sCi0gIHsgImNyMCIsICJwc3ciLCBPUEVSQU5EX0NPTlRST0wgfSwKLSAgeyAiY3IxIiwgImJwc3ciLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjcjEwIiwgIm1vZF9zIiwgT1BFUkFORF9DT05UUk9MKzEwIH0sCi0gIHsgImNyMTEiLCAibW9kX2UiLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAiY3IxMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMiB9LAotICB7ICJjcjEzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEzIH0sCi0gIHsgImNyMTQiLCAiaWJhIiwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImNyMTUiLCAiZWl0X3ZiIiwgT1BFUkFORF9DT05UUk9MKzE1IH0sCi0gIHsgImNyMTYiLCAiaW50X3MiLCBPUEVSQU5EX0NPTlRST0wrMTYgfSwKLSAgeyAiY3IxNyIsICJpbnRfbSIsIE9QRVJBTkRfQ09OVFJPTCsxNyB9LAotICB7ICJjcjE4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE4IH0sCi0gIHsgImNyMTkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTkgfSwKLSAgeyAiY3IyIiwgInBjIiwgT1BFUkFORF9DT05UUk9MKzIgfSwKLSAgeyAiY3IyMCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMCB9LAotICB7ICJjcjIxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIxIH0sCi0gIHsgImNyMjIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjIgfSwKLSAgeyAiY3IyMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMyB9LAotICB7ICJjcjI0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI0IH0sCi0gIHsgImNyMjUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjUgfSwKLSAgeyAiY3IyNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNiB9LAotICB7ICJjcjI3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI3IH0sCi0gIHsgImNyMjgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjggfSwKLSAgeyAiY3IyOSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyOSB9LAotICB7ICJjcjMiLCAiYnBjIiwgT1BFUkFORF9DT05UUk9MKzMgfSwKLSAgeyAiY3IzMCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMCB9LAotICB7ICJjcjMxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMxIH0sCi0gIHsgImNyMzIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzIgfSwKLSAgeyAiY3IzMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMyB9LAotICB7ICJjcjM0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM0IH0sCi0gIHsgImNyMzUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzUgfSwKLSAgeyAiY3IzNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNiB9LAotICB7ICJjcjM3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM3IH0sCi0gIHsgImNyMzgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzggfSwKLSAgeyAiY3IzOSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszOSB9LAotICB7ICJjcjQiLCAiZHBzdyIsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCi0gIHsgImNyNDAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDAgfSwKLSAgeyAiY3I0MSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MSB9LAotICB7ICJjcjQyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQyIH0sCi0gIHsgImNyNDMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDMgfSwKLSAgeyAiY3I0NCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NCB9LAotICB7ICJjcjQ1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ1IH0sCi0gIHsgImNyNDYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDYgfSwKLSAgeyAiY3I0NyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NyB9LAotICB7ICJjcjQ4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ4IH0sCi0gIHsgImNyNDkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDkgfSwKLSAgeyAiY3I1IiwiZHBjIiwgT1BFUkFORF9DT05UUk9MKzUgfSwKLSAgeyAiY3I1MCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MCB9LAotICB7ICJjcjUxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUxIH0sCi0gIHsgImNyNTIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTIgfSwKLSAgeyAiY3I1MyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MyB9LAotICB7ICJjcjU0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU0IH0sCi0gIHsgImNyNTUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTUgfSwKLSAgeyAiY3I1NiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NiB9LAotICB7ICJjcjU3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU3IH0sCi0gIHsgImNyNTgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTggfSwKLSAgeyAiY3I1OSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1OSB9LAotICB7ICJjcjYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNiB9LAotICB7ICJjcjYwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYwIH0sCi0gIHsgImNyNjEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjEgfSwKLSAgeyAiY3I2MiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MiB9LAotICB7ICJjcjYzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYzIH0sCi0gIHsgImNyNyIsICJycHRfYyIsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgImNyOCIsICJycHRfcyIsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgImNyOSIsICJycHRfZSIsIE9QRVJBTkRfQ09OVFJPTCs5IH0sCi0gIHsgImRwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImRwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNCB9LAotICB7ICJlaXRfdmIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTUgfSwKLSAgeyAiZjAiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMCB9LAotICB7ICJmMSIsIE5VTEwsIE9QRVJBTkRfRkxBRysxIH0sCi0gIHsgImYyIiwgTlVMTCwgT1BFUkFORF9GTEFHKzIgfSwKLSAgeyAiZjMiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMyB9LAotICB7ICJmNCIsICJzIiwgT1BFUkFORF9GTEFHKzQgfSwKLSAgeyAiZjUiLCAidiIsIE9QRVJBTkRfRkxBRys1IH0sCi0gIHsgImY2IiwgInZhIiwgT1BFUkFORF9GTEFHKzYgfSwKLSAgeyAiZjciLCAiYyIsIE9QRVJBTkRfRkxBRys3IH0sCi0gIHsgImliYSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAotICB7ICJpbnRfbSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNyB9LAotICB7ICJpbnRfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNiB9LAotICB7ICJsaW5rIiwgInI2MiIsIDYyIH0sCi0gIHsgIm1vZF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzExIH0sCi0gIHsgIm1vZF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEwIH0sCi0gIHsgInBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIgfSwKLSAgeyAicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MIH0sCi0gIHsgInBzd2giLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrTUFYX0NPTlRST0xfUkVHKzIgfSwKLSAgeyAicHN3bCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMSB9LAotICB7ICJyMCIsIE5VTEwsIDAgfSwKLSAgeyAicjEiLCBOVUxMLCAxIH0sCi0gIHsgInIxMCIsIE5VTEwsIDEwIH0sCi0gIHsgInIxMSIsIE5VTEwsIDExIH0sCi0gIHsgInIxMiIsIE5VTEwsIDEyIH0sCi0gIHsgInIxMyIsIE5VTEwsIDEzIH0sCi0gIHsgInIxNCIsIE5VTEwsIDE0IH0sCi0gIHsgInIxNSIsIE5VTEwsIDE1IH0sCi0gIHsgInIxNiIsIE5VTEwsIDE2IH0sCi0gIHsgInIxNyIsIE5VTEwsIDE3IH0sCi0gIHsgInIxOCIsIE5VTEwsIDE4IH0sCi0gIHsgInIxOSIsIE5VTEwsIDE5IH0sCi0gIHsgInIyIiwgTlVMTCwgMiB9LAotICB7ICJyMjAiLCBOVUxMLCAyMCB9LAotICB7ICJyMjEiLCBOVUxMLCAyMSB9LAotICB7ICJyMjIiLCBOVUxMLCAyMiB9LAotICB7ICJyMjMiLCBOVUxMLCAyMyB9LAotICB7ICJyMjQiLCBOVUxMLCAyNCB9LAotICB7ICJyMjUiLCBOVUxMLCAyNSB9LAotICB7ICJyMjYiLCBOVUxMLCAyNiB9LAotICB7ICJyMjciLCBOVUxMLCAyNyB9LAotICB7ICJyMjgiLCBOVUxMLCAyOCB9LAotICB7ICJyMjkiLCBOVUxMLCAyOSB9LAotICB7ICJyMyIsIE5VTEwsIDMgfSwKLSAgeyAicjMwIiwgTlVMTCwgMzAgfSwKLSAgeyAicjMxIiwgTlVMTCwgMzEgfSwKLSAgeyAicjMyIiwgTlVMTCwgMzIgfSwKLSAgeyAicjMzIiwgTlVMTCwgMzMgfSwKLSAgeyAicjM0IiwgTlVMTCwgMzQgfSwKLSAgeyAicjM1IiwgTlVMTCwgMzUgfSwKLSAgeyAicjM2IiwgTlVMTCwgMzYgfSwKLSAgeyAicjM3IiwgTlVMTCwgMzcgfSwKLSAgeyAicjM4IiwgTlVMTCwgMzggfSwKLSAgeyAicjM5IiwgTlVMTCwgMzkgfSwKLSAgeyAicjQiLCBOVUxMLCA0IH0sCi0gIHsgInI0MCIsIE5VTEwsIDQwIH0sCi0gIHsgInI0MSIsIE5VTEwsIDQxIH0sCi0gIHsgInI0MiIsIE5VTEwsIDQyIH0sCi0gIHsgInI0MyIsIE5VTEwsIDQzIH0sCi0gIHsgInI0NCIsIE5VTEwsIDQ0IH0sCi0gIHsgInI0NSIsIE5VTEwsIDQ1IH0sCi0gIHsgInI0NiIsIE5VTEwsIDQ2IH0sCi0gIHsgInI0NyIsIE5VTEwsIDQ3IH0sCi0gIHsgInI0OCIsIE5VTEwsIDQ4IH0sCi0gIHsgInI0OSIsIE5VTEwsIDQ5IH0sCi0gIHsgInI1IiwgTlVMTCwgNSB9LAotICB7ICJyNTAiLCBOVUxMLCA1MCB9LAotICB7ICJyNTEiLCBOVUxMLCA1MSB9LAotICB7ICJyNTIiLCBOVUxMLCA1MiB9LAotICB7ICJyNTMiLCBOVUxMLCA1MyB9LAotICB7ICJyNTQiLCBOVUxMLCA1NCB9LAotICB7ICJyNTUiLCBOVUxMLCA1NSB9LAotICB7ICJyNTYiLCBOVUxMLCA1NiB9LAotICB7ICJyNTciLCBOVUxMLCA1NyB9LAotICB7ICJyNTgiLCBOVUxMLCA1OCB9LAotICB7ICJyNTkiLCBOVUxMLCA1OSB9LAotICB7ICJyNiIsIE5VTEwsIDYgfSwKLSAgeyAicjYwIiwgTlVMTCwgNjAgfSwKLSAgeyAicjYxIiwgTlVMTCwgNjEgfSwKLSAgeyAicjYyIiwgImxpbmsiLCA2MiB9LAotICB7ICJyNjMiLCAic3AiLCA2MyB9LAotICB7ICJyNyIsIE5VTEwsIDcgfSwKLSAgeyAicjgiLCBOVUxMLCA4IH0sCi0gIHsgInI5IiwgTlVMTCwgOSB9LAotICB7ICJycHRfYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgInJwdF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzkgfSwKLSAgeyAicnB0X3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJzIiwgTlVMTCwgT1BFUkFORF9GTEFHKzQgfSwKLSAgeyAic3AiLCBOVUxMLCA2MyB9LAotICB7ICJ2IiwgTlVMTCwgT1BFUkFORF9GTEFHKzUgfSwKLSAgeyAidmEiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrNiB9LAotfTsKLQotaW50IAotcmVnX25hbWVfY250KCkKLXsKLSAgcmV0dXJuIChzaXplb2YocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcGRfcmVnKSk7Ci19Ci0KLS8qIE9QQ09ERSBUQUJMRSAqLwotLyogVGhlIGZvcm1hdCBvZiB0aGlzIHRhYmxlIGlzIGRlZmluZWQgaW4gb3Bjb2RlL2QzMHYuaCAqLwotY29uc3Qgc3RydWN0IGQzMHZfb3Bjb2RlIGQzMHZfb3Bjb2RlX3RhYmxlW10gPSB7Ci0gIHsgImFicyIsIElBTFUxLCAweDgsIHsgU0hPUlRfVSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYWRkIiwgSUFMVTEsIDB4MCwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkMmgiLCBJQUxVMSwgMHgxLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYWRkYyIsIElBTFUxLCAweDQsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQywgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhsbGwiLCBJQUxVMSwgMHgxMCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRobGxoIiwgSUFMVTEsIDB4MTEsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxobCIsIElBTFUxLCAweDEyLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhsaGgiLCBJQUxVMSwgMHgxMywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRoaGxsIiwgSUFMVTEsIDB4MTQsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGhsaCIsIElBTFUxLCAweDE1LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhoaGwiLCBJQUxVMSwgMHgxNiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRoaGhoIiwgSUFMVTEsIDB4MTcsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkcyIsIElBTFUxLCAweDYsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRzMmgiLCBJQUxVMSwgMHg3LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImFuZCIsIExPR0lDLCAweDE4LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImFuZGZnIiwgTE9HSUMsIDB4OCwgeyBTSE9SVF9GIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhdmciLCBJQUxVMSwgMHhhLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYXZnMmgiLCBJQUxVMSwgMHhiLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYmNsciIsIExPR0lDLCAweDMsIHsgU0hPUlRfQSB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAotICB7ICJibm90IiwgTE9HSUMsIDB4MSwgeyBTSE9SVF9BIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImJyYSIsIEJSQSwgMCwgeyBTSE9SVF9CMSwgU0hPUlRfQjJyLCBMT05HX1VyIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnJhdG56IiwgQlJBLCAweDQsIHsgU0hPUlRfQjNiciwgTE9OR18yYnIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJicmF0enIiLCBCUkEsIDB4NCwgeyBTSE9SVF9CM3IsIExPTkdfMnIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJic2V0IiwgTE9HSUMsIDB4MiwgeyBTSE9SVF9BIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImJzciIsIEJSQSwgMHgyLCB7IFNIT1JUX0IxLCBTSE9SVF9CMnIsIExPTkdfVXIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJic3J0bnoiLCBCUkEsIDB4NiwgeyBTSE9SVF9CM2JyLCBMT05HXzJiciB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJzcnR6ciIsIEJSQSwgMHg2LCB7IFNIT1JUX0IzciwgTE9OR18yciB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJ0c3QiLCBMT0dJQywgMCwgeyBTSE9SVF9BRiB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAotICB7ICJjbXAiLCBMT0dJQywgMHhDLCB7IFNIT1JUX0NNUCwgTE9OR19DTVAgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImNtcHUiLCBMT0dJQywgMHhELCB7IFNIT1JUX0NNUFUsIExPTkdfQ01QIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJkYnJhIiwgQlJBLCAweDEwLCB7IFNIT1JUX0IzciwgTE9OR18yciB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJkYnJhaSIsIEJSQSwgMHgxNCwgeyBTSE9SVF9EMnIsIExPTkdfRHIgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiZGJzciIsIEJSQSwgMHgxMiwgeyBTSE9SVF9CM3IsIExPTkdfMnIgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiZGJzcmkiLCBCUkEsIDB4MTYsIHsgU0hPUlRfRDJyLCBMT05HX0RyIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRidCIsIEJSQSwgMHhiLCB7IFNIT1JUX05PTkUgfSwgTVUsIEZMQUdfSlNSLCBGTEFHX0xLUiwgMCB9LAotICB7ICJkam1wIiwgQlJBLCAweDExLCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCi0gIHsgImRqbXBpIiwgQlJBLCAweDE1LCB7IFNIT1JUX0QyLCBMT05HX0QgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCi0gIHsgImRqc3IiLCBCUkEsIDB4MTMsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiZGpzcmkiLCBCUkEsIDB4MTcsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiam1wIiwgQlJBLCAweDEsIHsgU0hPUlRfQjEsIFNIT1JUX0IyLCBMT05HX1UgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAiam1wdG56IiwgQlJBLCAweDUsIHsgU0hPUlRfQjNiLCBMT05HXzJiIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImptcHR6ciIsIEJSQSwgMHg1LCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAiam9pbmxsIiwgSUFMVTEsIDB4QywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqb2lubGgiLCBJQUxVMSwgMHhELCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpvaW5obCIsIElBTFUxLCAweEUsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiam9pbmhoIiwgSUFMVTEsIDB4RiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqc3IiLCBCUkEsIDB4MywgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqc3J0bnoiLCBCUkEsIDB4NywgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAianNydHpyIiwgQlJBLCAweDcsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJsZDJoIiwgSU1FTSwgMHgzLCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZDJ3IiwgSU1FTSwgMHg2LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSB8IEZMQUdfTk9UX1dJVEhfQUREU1VCcHBwLCAwLCAwIH0sCi0gIHsgImxkNGJoIiwgSU1FTSwgMHg1LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSB8IEZMQUdfTk9UX1dJVEhfQUREU1VCcHBwLCAwLCAwIH0sCi0gIHsgImxkNGJodSIsIElNRU0sIDB4ZCwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRiIiwgSU1FTSwgMCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkYnUiLCBJTUVNLCAweDksIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGgiLCBJTUVNLCAweDIsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGhoIiwgSU1FTSwgMHgxLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRodSIsIElNRU0sIDB4YSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkdyIsIElNRU0sIDB4NCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgIm1hYzAiLCBJQUxVMiwgMHgxNCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1hYzEiLCBJQUxVMiwgMHgxNCwgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtYWNzMCIsIElBTFUyLCAweDE1LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibWFjczEiLCBJQUxVMiwgMHgxNSwgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtb2RkZWMiLCBJTUVNLCAweDcsIHsgU0hPUlRfTU9EREVDIH0sIE1VLCAwLCAwLCAwIH0sCi0gIHsgIm1vZGluYyIsIElNRU0sIDB4NywgeyBTSE9SVF9NT0RJTkMgfSwgTVUsIDAsIDAsIDAgfSwKLSAgeyAibXN1YjAiLCBJQUxVMiwgMHgxNiwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1zdWIxIiwgSUFMVTIsIDB4MTYsIHsgU0hPUlRfQTEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXN1YnMwIiwgSUFMVTIsIDB4MTcsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtc3ViczEiLCBJQUxVMiwgMHgxNywgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdWwiLCBJQUxVMiwgMHgxMCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm11bDJoIiwgSUFMVTIsIDAsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGxsIiwgSUFMVTIsIDB4NCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bGh4bGgiLCBJQUxVMiwgMHg1LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVsaHhobCIsIElBTFUyLCAweDYsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGhoIiwgSUFMVTIsIDB4NywgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bHgiLCBJQUxVMiwgMHgxOCwgeyBTSE9SVF9BQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdWx4MmgiLCBJQUxVMiwgMHgxLCB7IFNIT1JUX0EyIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bHhzIiwgSUFMVTIsIDB4MTksIHsgU0hPUlRfQUEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXZmYWNjIiwgSUFMVTIsIDB4MWYsIHsgU0hPUlRfUkEgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAibXZmc3lzIiwgQlJBLCAweDFlLCB7IFNIT1JUX0MxIH0sIE1VLCBGTEFHX0FMTCwgRkxBR19BTEwsIDAgfSwKLSAgeyAibXZ0YWNjIiwgSUFMVTIsIDB4ZiwgeyBTSE9SVF9BUiB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJtdnRzeXMiLCBCUkEsIDB4ZSwgeyBTSE9SVF9DMiB9LCBNVSwgRkxBR19BTEwsIEZMQUdfQUxMLCAwIH0sCi0gIHsgIm5vcCIsIEJSQSwgMHhGLCB7IFNIT1JUX05PTkUgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm5vdCIsIExPR0lDLCAweDE5LCB7IFNIT1JUX1UgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm5vdGZnIiwgTE9HSUMsIDB4OSwgeyBTSE9SVF9VRiB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAib3IiLCBMT0dJQywgMHgxYSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJvcmZnIiwgTE9HSUMsIDB4YSwgeyBTSE9SVF9GIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJyZWl0IiwgQlJBLCAweDgsIHsgU0hPUlRfTk9ORSB9LCBNVSwgRkxBR19TTSB8IEZMQUdfSk1QLCBGTEFHX1NNIHwgRkxBR19MS1IsIDAgfSwKLSAgeyAicmVwZWF0IiwgQlJBLCAweDE4LCB7IFNIT1JUX0QxciwgTE9OR18yciB9LCBNVSwgRkxBR19SUCwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAicmVwZWF0aSIsIEJSQSwgMHgxYSwgeyBTSE9SVF9EMkJyLCBMT05HX0RiciB9LCBNVSwgRkxBR19SUCwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAicm90IiwgTE9HSUMsIDB4MTQsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAicm90MmgiLCBMT0dJQywgMHgxNSwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJydGQiLCBCUkEsIDB4YSwgeyBTSE9SVF9OT05FIH0sIE1VLCBGTEFHX0pNUCwgRkxBR19MS1IsIDAgfSwKLSAgeyAic2F0IiwgSUFMVTIsIDB4OCwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzYXQyaCIsIElBTFUyLCAweDksIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAic2F0aGwiLCBJQUxVMiwgMHgxYywgeyBTSE9SVF9BNSB9LCBJVSwgRkxBR19BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAic2F0aGgiLCBJQUxVMiwgMHgxZCwgeyBTSE9SVF9BNSB9LCBJVSwgRkxBR19BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAic2F0eiIsIElBTFUyLCAweGEsIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAic2F0ejJoIiwgSUFMVTIsIDB4YiwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzcmEiLCBMT0dJQywgMHgxMCwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmEyaCIsIExPR0lDLCAweDExLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYWhoIiwgTE9HSUMsIDB4NSwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmFobCIsIExPR0lDLCAweDQsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JjIiwgTE9HSUMsIDB4MTYsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCAwLCAwIH0sCi0gIHsgInNybCIsIExPR0lDLCAweDEyLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNybDJoIiwgTE9HSUMsIDB4MTMsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JsaGgiLCBMT0dJQywgMHg3LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNybGhsIiwgTE9HSUMsIDB4NiwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzdDJoIiwgSU1FTSwgMHgxMywgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgMCwgRkxBR19NRU0gfCBGTEFHX05PVF9XSVRIX0FERFNVQnBwcCwgMCB9LAotICB7ICJzdDJ3IiwgSU1FTSwgMHgxNiwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgMCwgRkxBR19NRU0gfCBGTEFHX05PVF9XSVRIX0FERFNVQnBwcCwgMCB9LAotICB7ICJzdDRoYiIsIElNRU0sIDB4MTUsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIDAsIEZMQUdfTUVNIHwgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAsIDAgfSwKLSAgeyAic3RiIiwgSU1FTSwgMHgxMCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNIHwgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAsIDAgfSwKLSAgeyAic3RoIiwgSU1FTSwgMHgxMiwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNIHwgRkxBR19OT1RfV0lUSF9BRERTVUJwcHAsIDAgfSwKLSAgeyAic3RoaCIsIElNRU0sIDB4MTEsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSB8IEZMQUdfTk9UX1dJVEhfQUREU1VCcHBwLCAwIH0sCi0gIHsgInN0dyIsIElNRU0sIDB4MTQsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSB8IEZMQUdfTk9UX1dJVEhfQUREU1VCcHBwLCAwIH0sCi0gIHsgInN1YiIsIElBTFUxLCAweDIsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YjJoIiwgSUFMVTEsIDB4MywgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInN1YmIiLCBJQUxVMSwgMHg1LCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQywgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsbGwiLCBJQUxVMSwgMHgxOCwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsbGgiLCBJQUxVMSwgMHgxOSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsaGwiLCBJQUxVMSwgMHgxYSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsaGgiLCBJQUxVMSwgMHgxYiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhobGwiLCBJQUxVMSwgMHgxYywgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhobGgiLCBJQUxVMSwgMHgxZCwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhoaGwiLCBJQUxVMSwgMHgxZSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhoaGgiLCBJQUxVMSwgMHgxZiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInRyYXAiLCBCUkEsIDB4OSwgeyBTSE9SVF9CMSwgU0hPUlRfVH0sIE1VLCBGTEFHX0pTUiwgRkxBR19TTSB8IEZMQUdfTEtSLCAwIH0sCi0gIHsgInhvciIsIExPR0lDLCAweDFiLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInhvcmZnIiwgTE9HSUMsIDB4YiwgeyBTSE9SVF9GIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7IE5VTEwsIDAsIDAsIHsgMCB9LCAwLCAwLCAwLCAwIH0sCi19OwotCi0KLS8qIG5vdyBkZWZpbmUgdGhlIG9wZXJhbmQgdHlwZXMgKi8KLS8qIGZvcm1hdCBpcyBsZW5ndGgsIGJpdHMsIHBvc2l0aW9uLCBmbGFncyAqLwotY29uc3Qgc3RydWN0IGQzMHZfb3BlcmFuZCBkMzB2X29wZXJhbmRfdGFibGVbXSA9Ci17Ci0jZGVmaW5lIFVOVVNFRAkoMCkKLSAgeyAwLCAwLCAwLCAwIH0sCi0jZGVmaW5lIFJhCShVTlVTRUQgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBSYTIJKFJhICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0RFU1R8T1BFUkFORF8yUkVHIH0sCi0jZGVmaW5lIFJhMwkoUmEyICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSYgkoUmEzICsgMSkKLSAgeyA2LCA2LCA2LCBPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSYwkoUmIgKyAxKQotICB7IDYsIDYsIDEyLCBPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBYQkoUmMgKyAxKQotICB7IDYsIDEsIDAsIE9QRVJBTkRfQUNDfE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBBYgkoQWEgKyAxKQotICB7IDYsIDEsIDYsIE9QRVJBTkRfQUNDfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIElNTTUJKEFiICsgMSkKLSAgeyA2LCA1LCAxMiwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgSU1NNVUgKElNTTUgKyAxKQotICB7IDYsIDUsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LCAvKiBub3QgdXNlZCAqLwotI2RlZmluZSBJTU01UzMgICAgICAgIChJTU01VSArIDEpCi0gIHsgNiwgNSwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sIC8qIG5vdCB1c2VkICovCi0jZGVmaW5lIElNTTYgIChJTU01UzMgKyAxKQotICB7IDYsIDYsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBJTU02VSAoSU1NNiArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgSU1NNlUyICAgICAgICAoSU1NNlUgKyAxKQotICB7IDYsIDYsIDEyLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBSRUw2UzMgICAgICAgIChJTU02VTIgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0hJRlR8T1BFUkFORF9QQ1JFTCB9LAotI2RlZmluZSBSRUwxMlMzICAgICAgIChSRUw2UzMgKyAxKQotICB7IDEyLCAxMiwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEfE9QRVJBTkRfU0hJRlR8T1BFUkFORF9QQ1JFTCB9LAotI2RlZmluZSBJTU0xMlMzICAgICAgIChSRUwxMlMzICsgMSkKLSAgeyAxMiwgMTIsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRHxPUEVSQU5EX1NISUZUIH0sCi0jZGVmaW5lIFJFTDE4UzMgICAgICAgKElNTTEyUzMgKyAxKQotICB7IDE4LCAxOCwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEfE9QRVJBTkRfU0hJRlR8T1BFUkFORF9QQ1JFTCB9LAotI2RlZmluZSBJTU0xOFMzICAgICAgIChSRUwxOFMzICsgMSkKLSAgeyAxOCwgMTgsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRHxPUEVSQU5EX1NISUZUIH0sCi0jZGVmaW5lIFJFTDMyIChJTU0xOFMzICsgMSkKLSAgeyAzMiwgMzIsIDAsIE9QRVJBTkRfTlVNfE9QRVJBTkRfUENSRUwgfSwKLSNkZWZpbmUgSU1NMzIgKFJFTDMyICsgMSkKLSAgeyAzMiwgMzIsIDAsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIEZhCShJTU0zMiArIDEpCi0gIHsgNiwgMywgMCwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZMQUcgfCBPUEVSQU5EX0RFU1QgfSwKLSNkZWZpbmUgRmIJKEZhICsgMSkKLSAgeyA2LCAzLCA2LCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkxBRyB9LAotI2RlZmluZSBGYwkoRmIgKyAxKQotICB7IDYsIDMsIDEyLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkxBRyB9LAotI2RlZmluZSBBVFNJR04JKEZjICsgMSkKLSAgeyAwLCAwLCAwLCBPUEVSQU5EX0FUU0lHTn0sCi0jZGVmaW5lIEFUUEFSCShBVFNJR04gKyAxKQkvKiAiQCgiICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9BVFBBUn0sCi0jZGVmaW5lIFBMVVMJKEFUUEFSICsgMSkJLyogcG9zdGluY3JlbWVudCAqLwotICB7IDAsIDAsIDAsIE9QRVJBTkRfUExVU30sCi0jZGVmaW5lIE1JTlVTCShQTFVTICsgMSkJLyogcG9zdGRlY3JlbWVudCAqLwotICB7IDAsIDAsIDAsIE9QRVJBTkRfTUlOVVN9LAotI2RlZmluZSBBVE1JTlVTCShNSU5VUyArIDEpCS8qIHByZWRlY3JlbWVudCAqLwotICB7IDAsIDAsIDAsIE9QRVJBTkRfQVRNSU5VU30sCi0jZGVmaW5lIENhCShBVE1JTlVTICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLwotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTHxPUEVSQU5EX0RFU1R9LAotI2RlZmluZSBDYgkoQ2EgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgNiwgNiwgNiwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfSwKLSNkZWZpbmUgQ0MJKENiICsgMSkJLyogY29uZGl0aW9uIGNvZGUgKENNUGNjIGFuZCBDTVBVY2MpICovCi0gIHsgMywgMywgLTMsIE9QRVJBTkRfTkFNRX0sCi0jZGVmaW5lIEZhMgkoQ0MgKyAxKQkvKiBmbGFnIHJlZ2lzdGVyIChDTVBjYyBhbmQgQ01QVWNjKSAqLwotICB7IDMsIDMsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfRkxBR3xPUEVSQU5EX0RFU1R9LAotI2RlZmluZSBGYWtlCShGYTIgKyAxKQkvKiBwbGFjZSBob2xkZXIgZm9yICJpZCIgZmllbGQgaW4gbXZmc3lzIGFuZCBtdnRzeXMgKi8KLSAgeyA2LCAyLCAxMiwgT1BFUkFORF9TUEVDSUFMfSwKLX07Ci0KLS8qIG5vdyB3ZSBuZWVkIHRvIGRlZmluZSB0aGUgaW5zdHJ1Y3Rpb24gZm9ybWF0cyAqLwotY29uc3Qgc3RydWN0IGQzMHZfZm9ybWF0IGQzMHZfZm9ybWF0X3RhYmxlW10gPQotewotICB7IDAsIDAsIHsgMCB9IH0sCi0gIHsgU0hPUlRfTSwgMCwgeyBSYSwgQVRQQVIsIFJiLCBSYyB9IH0sCS8qIFJhLEAoUmIsUmMpICovCi0gIHsgU0hPUlRfTSwgMSwgeyBSYSwgQVRQQVIsIFJiLCBQTFVTLCBSYyB9IH0sCS8qIFJhLEAoUmIrLFJjKSAqLwotICB7IFNIT1JUX00sIDIsIHsgUmEsIEFUUEFSLCBSYiwgSU1NNiB9IH0sCS8qIFJhLEAoUmIsaW1tNikgKi8KLSAgeyBTSE9SVF9NLCAzLCB7IFJhLCBBVFBBUiwgUmIsIE1JTlVTLCBSYyB9IH0sCS8qIFJhLEAoUmItLFJjKSAqLwotICB7IFNIT1JUX00yLCAwLCB7IFJhMiwgQVRQQVIsIFJiLCBSYyB9IH0sCS8qIFJhLEAoUmIsUmMpICovCi0gIHsgU0hPUlRfTTIsIDEsIHsgUmEyLCBBVFBBUiwgUmIsIFBMVVMsIFJjIH0gfSwvKiBSYSxAKFJiKyxSYykgKi8KLSAgeyBTSE9SVF9NMiwgMiwgeyBSYTIsIEFUUEFSLCBSYiwgSU1NNiB9IH0sCS8qIFJhLEAoUmIsaW1tNikgKi8KLSAgeyBTSE9SVF9NMiwgMywgeyBSYTIsIEFUUEFSLCBSYiwgTUlOVVMsIFJjIH0gfSwvKiBSYSxAKFJiLSxSYykgKi8KLSAgeyBTSE9SVF9BLCAwLCB7IFJhLCBSYiwgUmMgfSB9LAkJLyogUmEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BLCAyLCB7IFJhLCBSYiwgSU1NNiB9IH0sCQkvKiBSYSxSYixpbW02ICovCi0gIHsgU0hPUlRfQjEsIDAsIHsgUmMgfSB9LAkJCS8qIFJjICovCi0gIHsgU0hPUlRfQjIsIDIsIHsgSU1NMThTMyB9IH0sCQkJLyogaW1tMTggKi8KLSAgeyBTSE9SVF9CMnIsIDIsIHsgUkVMMThTMyB9IH0sCQkvKiByZWwxOCAqLwotICB7IFNIT1JUX0IzLCAwLCB7IFJhMywgUmMgfSB9LAkJCS8qIFJhLFJjICovCi0gIHsgU0hPUlRfQjMsIDIsIHsgUmEzLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyICovCi0gIHsgU0hPUlRfQjNyLCAwLCB7IFJhMywgUmMgfSB9LAkJLyogUmEsUmMgKi8KLSAgeyBTSE9SVF9CM3IsIDIsIHsgUmEzLCBSRUwxMlMzIH0gfSwJCS8qIFJhLHJlbDEyICovCi0gIHsgU0hPUlRfQjNiLCAxLCB7IFJhMywgUmMgfSB9LAkJLyogUmEsUmMgKi8KLSAgeyBTSE9SVF9CM2IsIDMsIHsgUmEzLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyICovCi0gIHsgU0hPUlRfQjNiciwgMSwgeyBSYTMsIFJjIH0gfSwJCS8qIFJhLFJjICovCi0gIHsgU0hPUlRfQjNiciwgMywgeyBSYTMsIFJFTDEyUzMgfSB9LAkJLyogUmEscmVsMTIgKi8KLSAgeyBTSE9SVF9EMXIsIDAsIHsgUmEsIFJjIH0gfSwJCQkvKiBSYSxSYyAqLwotICB7IFNIT1JUX0QxciwgMiwgeyBSYSwgUkVMMTJTMyB9IH0sCQkvKiBSYSxyZWwxMnMzICovCi0gIHsgU0hPUlRfRDIsIDAsIHsgUkVMNlMzLCBSYyB9IH0sCQkvKiByZWw2czMsUmMgKi8KLSAgeyBTSE9SVF9EMiwgMiwgeyBSRUw2UzMsIElNTTEyUzMgfSB9LAkJLyogcmVsNnMzLGltbTEyczMgKi8KLSAgeyBTSE9SVF9EMnIsIDAsIHsgUkVMNlMzLCBSYyB9IH0sCQkvKiByZWw2czMsUmMgKi8KLSAgeyBTSE9SVF9EMnIsIDIsIHsgUkVMNlMzLCBSRUwxMlMzIH0gfSwJLyogcmVsNnMzLHJlbDEyczMgKi8KLSAgeyBTSE9SVF9EMkJyLCAwLCB7IElNTTZVLCBSYyB9IH0sCQkvKiBpbW02dSxSYyAqLwotICB7IFNIT1JUX0QyQnIsIDIsIHsgSU1NNlUsIFJFTDEyUzMgfSB9LAkvKiBpbW02dSxyZWwxMnMzICovCi0gIHsgU0hPUlRfVSwgMCwgeyBSYSwgUmIgfSB9LAkJCS8qIFJhLFJiICovCi0gIHsgU0hPUlRfRiwgMCwgeyBGYSwgRmIsIEZjIH0gfSwJCS8qIEZhLEZiLEZjICAob3JmZywgeG9yZmcpICovCi0gIHsgU0hPUlRfRiwgMiwgeyBGYSwgRmIsIElNTTYgfSB9LAkJLyogRmEsRmIsaW1tNiAqLwotICB7IFNIT1JUX0FGLCAwLCB7IEZhLCBSYiwgUmMgfSB9LAkJLyogRmEsUmIsUmMgKi8KLSAgeyBTSE9SVF9BRiwgMiwgeyBGYSwgUmIsIElNTTYgfSB9LAkJLyogRmEsUmIsaW1tNiAqLwotICB7IFNIT1JUX1QsIDIsIHsgSU1NNSB9IH0sCQkJLyogaW1tNXMzICAgKHRyYXApICovCi0gIHsgU0hPUlRfQTUsIDAsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyAqLwotICB7IFNIT1JUX0E1LCAyLCB7IFJhLCBSYiwgSU1NNSB9IH0sCQkvKiBSYSxSYixpbW01ICAgIChzYXQqKSAqLwotICB7IFNIT1JUX0NNUCwgMCwgeyBDQywgRmEyLCBSYiwgUmN9IH0sCQkvKiBDQyAgRmEyLFJiLFJjICovCi0gIHsgU0hPUlRfQ01QLCAyLCB7IENDLCBGYTIsIFJiLCBJTU02fSB9LAkvKiBDQyAgRmEyLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9DTVBVLCAwLCB7IENDLCBGYTIsIFJiLCBSY30gfSwJLyogQ0MgIEZhMixSYixSYyAqLwotICB7IFNIT1JUX0NNUFUsIDIsIHsgQ0MsIEZhMiwgUmIsIElNTTZVMn0gfSwJLyogQ0MgIEZhMixSYixpbW02ICovCi0gIHsgU0hPUlRfQTEsIDEsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyBmb3IgTUFDIHdoZXJlIGE9MSAqLwotICB7IFNIT1JUX0ExLCAzLCB7IFJhLCBSYiwgSU1NNiB9IH0sCQkvKiBSYSxSYixpbW02IGZvciBNQUMgd2hlcmUgYT0xICovCi0gIHsgU0hPUlRfQUEsIDAsIHsgQWEsIFJiLCBSYyB9IH0sCQkvKiBBYSxSYixSYyAqLwotICB7IFNIT1JUX0FBLCAyLCB7IEFhLCBSYiwgSU1NNiB9IH0sCQkvKiBBYSxSYixpbW02ICovCi0gIHsgU0hPUlRfUkEsIDAsIHsgUmEsIEFiLCBSYyB9IH0sCQkvKiBSYSxBYixSYyAqLwotICB7IFNIT1JUX1JBLCAyLCB7IFJhLCBBYiwgSU1NNlUyIH0gfSwJCS8qIFJhLEFiLGltbTZ1ICovCi0gIHsgU0hPUlRfTU9ESU5DLCAxLCB7IFJiLCBJTU01IH0gfSwJCS8qIFJiLGltbTUgKG1vZGluYykgKi8KLSAgeyBTSE9SVF9NT0RERUMsIDMsIHsgUmIsIElNTTUgfSB9LAkJLyogUmIsaW1tNSAobW9kZGVjKSAqLwotICB7IFNIT1JUX0MxLCAwLCB7IFJhLCBDYiwgRmFrZSB9IH0sCQkvKiBSYSxDYiAobXZmc3lzKSAqLwotICB7IFNIT1JUX0MyLCAwLCB7IENhLCBSYiwgRmFrZSB9IH0sCQkvKiBDYSxSYiAobXZ0c3lzKSAqLwotICB7IFNIT1JUX1VGLCAwLCB7IEZhLCBGYiB9IH0sCQkJLyogRmEsRmIgIChub3RmZykgKi8KLSAgeyBTSE9SVF9BMiwgMCwgeyBSYTIsIFJiLCBSYyB9IH0sCQkvKiBSYTIsUmIsUmMgKi8KLSAgeyBTSE9SVF9BMiwgMiwgeyBSYTIsIFJiLCBJTU02IH0gfSwJCS8qIFJhMixSYixpbW02ICovCi0gIHsgU0hPUlRfTk9ORSwgMCwgeyAwIH0gfSwJCQkvKiBubyBvcGVyYW5kcyAobm9wLCByZWl0KSAqLwotICB7IFNIT1JUX0FSLCAwLCB7IEFhLCBSYiwgUmMgfSB9LAkJLyogQWEsUmIsUmMgKi8KLSAgeyBMT05HLCAyLCB7IFJhLCBSYiwgSU1NMzIgfSB9LAkJLyogUmEsUmIsaW1tMzIgKi8KLSAgeyBMT05HX1UsIDIsIHsgSU1NMzIgfSB9LAkJCS8qIGltbTMyICovCi0gIHsgTE9OR19VciwgMiwgeyBSRUwzMiB9IH0sCQkJLyogcmVsMzIgKi8KLSAgeyBMT05HX0NNUCwgMiwgeyBDQywgRmEyLCBSYiwgSU1NMzJ9IH0sCS8qIENDICBGYTIsUmIsaW1tMzIgKi8KLSAgeyBMT05HX00sIDIsIHsgUmEsIEFUUEFSLCBSYiwgSU1NMzIgfSB9LAkvKiBSYSxAKFJiLGltbTMyKSAqLwotICB7IExPTkdfTTIsIDIsIHsgUmEyLCBBVFBBUiwgUmIsIElNTTMyIH0gfSwJLyogUmEsQChSYixpbW0zMikgKi8KLSAgeyBMT05HXzIsIDIsIHsgUmEzLCBJTU0zMiB9IH0sCQkvKiBSYSxpbW0zMiAqLwotICB7IExPTkdfMnIsIDIsIHsgUmEzLCBSRUwzMiB9IH0sCQkvKiBSYSxyZWwzMiAqLwotICB7IExPTkdfMmIsIDMsIHsgUmEzLCBJTU0zMiB9IH0sCQkvKiBSYSxpbW0zMiAqLwotICB7IExPTkdfMmJyLCAzLCB7IFJhMywgUkVMMzIgfSB9LAkJLyogUmEscmVsMzIgKi8KLSAgeyBMT05HX0QsIDIsIHsgUkVMNlMzLCBJTU0zMiB9IH0sCQkvKiByZWw2czMsaW1tMzIgKi8KLSAgeyBMT05HX0RyLCAyLCB7IFJFTDZTMywgUkVMMzIgfSB9LAkJLyogcmVsNnMzLHJlbDMyICovCi0gIHsgTE9OR19EYnIsIDIsIHsgSU1NNlUsIFJFTDMyIH0gfSwJCS8qIGltbTYscmVsMzIgKi8KLSAgeyAwLCAwLCB7IDAgfSB9LAotfTsKLQotY29uc3QgY2hhciAqZDMwdl9lY2NfbmFtZXNbXSA9Ci17Ci0gICJhbCIsCi0gICJ0eCIsCi0gICJmeCIsCi0gICJ4dCIsCi0gICJ4ZiIsCi0gICJ0dCIsCi0gICJ0ZiIsCi0gICJyZXMiCi19OwotCi1jb25zdCBjaGFyICpkMzB2X2NjX25hbWVzW10gPQotewotICAiZXEiLAotICAibmUiLAotICAiZ3QiLAotICAiZ2UiLAotICAibHQiLAotICAibGUiLAotICAicHMiLAotICAibmciLAotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kZXAtaW4uc2VkIGIvb3Bjb2Rlcy9kZXAtaW4uc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzBkZWU1Ni4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2RlcC1pbi5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi06bG9vcAotL1xcJC9OCi1zL1xcXG4gKi8gL2cKLXQgbG9vcAotCi1zIVwubzohLmxvOiEKLXMhIEBCRkRfSEAhICQoQkZEX0gpIWcKLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQEJGRERJUkAhJChCRkRESVIpIWcKLXMhQFNSQ0RJUkAvISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLXMvICo6LzovZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL29wY29kZXMvZGlzLWJ1Zi5jIGIvb3Bjb2Rlcy9kaXMtYnVmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MjgyMDYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kaXMtYnVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgZnJvbSBhIGJ1ZmZlciwgZm9yIEdOVS4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBHZXQgTEVOR1RIIGJ5dGVzIGZyb20gaW5mbydzIGJ1ZmZlciwgYXQgdGFyZ2V0IGFkZHJlc3MgbWVtYWRkci4KLSAgIFRyYW5zZmVyIHRoZW0gdG8gbXlhZGRyLiAgKi8KLWludAotYnVmZmVyX3JlYWRfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbmd0aCwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBiZmRfYnl0ZSAqbXlhZGRyOwotICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IG9wYiA9IGluZm8tPm9jdGV0c19wZXJfYnl0ZTsKLSAgdW5zaWduZWQgaW50IGVuZF9hZGRyX29mZnNldCA9IGxlbmd0aCAvIG9wYjsKLSAgdW5zaWduZWQgaW50IG1heF9hZGRyX29mZnNldCA9IGluZm8tPmJ1ZmZlcl9sZW5ndGggLyBvcGI7IAotICB1bnNpZ25lZCBpbnQgb2N0ZXRzID0gKG1lbWFkZHIgLSBpbmZvLT5idWZmZXJfdm1hKSAqIG9wYjsKLQotICBpZiAobWVtYWRkciA8IGluZm8tPmJ1ZmZlcl92bWEKLSAgICAgIHx8IG1lbWFkZHIgLSBpbmZvLT5idWZmZXJfdm1hICsgZW5kX2FkZHJfb2Zmc2V0ID4gbWF4X2FkZHJfb2Zmc2V0KQotICAgIC8qIE91dCBvZiBib3VuZHMuICBVc2UgRUlPIGJlY2F1c2UgR0RCIHVzZXMgaXQuICAqLwotICAgIHJldHVybiBFSU87Ci0gIG1lbWNweSAobXlhZGRyLCBpbmZvLT5idWZmZXIgKyBvY3RldHMsIGxlbmd0aCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UuICBXZSBjYW4gYXNzdW1lIHRoYXQgdGhpcyBpcyBpbiByZXNwb25zZSB0bwotICAgYW4gZXJyb3IgcmV0dXJuIGZyb20gYnVmZmVyX3JlYWRfbWVtb3J5LiAgKi8KLXZvaWQKLXBlcnJvcl9tZW1vcnkgKHN0YXR1cywgbWVtYWRkciwgaW5mbykKLSAgICAgaW50IHN0YXR1czsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKHN0YXR1cyAhPSBFSU8pCi0gICAgLyogQ2FuJ3QgaGFwcGVuLiAgKi8KLSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgXygiVW5rbm93biBlcnJvciAlZFxuIiksIHN0YXR1cyk7Ci0gIGVsc2UKLSAgICAvKiBBY3R1YWxseSwgYWRkcmVzcyBiZXR3ZWVuIG1lbWFkZHIgYW5kIG1lbWFkZHIgKyBsZW4gd2FzCi0gICAgICAgb3V0IG9mIGJvdW5kcy4gICovCi0gICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sCi0JCQlfKCJBZGRyZXNzIDB4JXggaXMgb3V0IG9mIGJvdW5kcy5cbiIpLCBtZW1hZGRyKTsKLX0KLQotLyogVGhpcyBjb3VsZCBiZSBpbiBhIHNlcGFyYXRlIGZpbGUsIHRvIHNhdmUgbWluaXNjdWxlIGFtb3VudHMgb2Ygc3BhY2UKLSAgIGluIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzLiAgKi8KLQotLyogSnVzdCBwcmludCB0aGUgYWRkcmVzcyBpcyBoZXguICBUaGlzIGlzIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MgZXZlbgotICAgdGhvdWdoIGJvdGggR0RCIGFuZCBvYmpkdW1wIHByb3ZpZGUgdGhlaXIgb3duICh0byBwcmludCBzeW1ib2xpYwotICAgYWRkcmVzc2VzKS4gICovCi0KLXZvaWQKLWdlbmVyaWNfcHJpbnRfYWRkcmVzcyAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY2hhciBidWZbMzBdOwotCi0gIHNwcmludGZfdm1hIChidWYsIGFkZHIpOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXMiLCBidWYpOwotfQotCi0vKiBKdXN0IGNvbmNhdGVuYXRlIHRoZSBhZGRyZXNzIGFzIGhleC4gIFRoaXMgaXMgaW5jbHVkZWQgZm9yCi0gICBjb21wbGV0ZW5lc3MgZXZlbiB0aG91Z2ggYm90aCBHREIgYW5kIG9iamR1bXAgcHJvdmlkZSB0aGVpciBvd24gKHRvCi0gICBwcmludCBzeW1ib2xpYyBhZGRyZXNzZXMpLiAgKi8KLQotdm9pZAotZ2VuZXJpY19zdHJjYXRfYWRkcmVzcyAoYWRkciwgYnVmLCBsZW4pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgbGVuOwotewotICBpZiAoYnVmICE9IChjaGFyICopTlVMTCAmJiBsZW4gPiAwKQotICAgIHsKLSAgICAgIGNoYXIgdG1wQnVmWzMwXTsKLQotICAgICAgc3ByaW50Zl92bWEgKHRtcEJ1ZiwgYWRkcik7Ci0gICAgICBpZiAoKHN0cmxlbiAoYnVmKSArIHN0cmxlbiAodG1wQnVmKSkgPD0gKHVuc2lnbmVkIGludCkgbGVuKQotCXN0cmNhdCAoYnVmLCB0bXBCdWYpOwotICAgICAgZWxzZQotCXN0cm5jYXQgKGJ1ZiwgdG1wQnVmLCAobGVuIC0gc3RybGVuKGJ1ZikpKTsKLSAgICB9Ci0gIHJldHVybjsKLX0KLQotLyogSnVzdCByZXR1cm4gdGhlIGdpdmVuIGFkZHJlc3MuICAqLwotCi1pbnQKLWdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZGlzYXNzZW1ibGUuYyBiL29wY29kZXMvZGlzYXNzZW1ibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3ZGU5MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2Rpc2Fzc2VtYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyogU2VsZWN0IGRpc2Fzc2VtYmx5IHJvdXRpbmUgZm9yIHNwZWNpZmllZCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotI2lmZGVmIEFSQ0hfYWxsCi0jZGVmaW5lIEFSQ0hfYTI5awotI2RlZmluZSBBUkNIX2FscGhhCi0jZGVmaW5lIEFSQ0hfYXJjCi0jZGVmaW5lIEFSQ0hfYXJtCi0jZGVmaW5lIEFSQ0hfYXZyCi0jZGVmaW5lIEFSQ0hfZDEwdgotI2RlZmluZSBBUkNIX2QzMHYKLSNkZWZpbmUgQVJDSF9oODMwMAotI2RlZmluZSBBUkNIX2g4NTAwCi0jZGVmaW5lIEFSQ0hfaHBwYQotI2RlZmluZSBBUkNIX2kzNzAKLSNkZWZpbmUgQVJDSF9pMzg2Ci0jZGVmaW5lIEFSQ0hfaTk2MAotI2RlZmluZSBBUkNIX2ZyMzAKLSNkZWZpbmUgQVJDSF9tMzJyCi0jZGVmaW5lIEFSQ0hfbTY4awotI2RlZmluZSBBUkNIX204OGsKLSNkZWZpbmUgQVJDSF9tY29yZQotI2RlZmluZSBBUkNIX21pcHMKLSNkZWZpbmUgQVJDSF9tbjEwMjAwCi0jZGVmaW5lIEFSQ0hfbW4xMDMwMAotI2RlZmluZSBBUkNIX25zMzJrCi0jZGVmaW5lIEFSQ0hfcGoKLSNkZWZpbmUgQVJDSF9wb3dlcnBjCi0jZGVmaW5lIEFSQ0hfcnM2MDAwCi0jZGVmaW5lIEFSQ0hfc2gKLSNkZWZpbmUgQVJDSF9zcGFyYwotI2RlZmluZSBBUkNIX3RpYzMwCi0jZGVmaW5lIEFSQ0hfdGljODAKLSNkZWZpbmUgQVJDSF92ODUwCi0jZGVmaW5lIEFSQ0hfdmF4Ci0jZGVmaW5lIEFSQ0hfdzY1Ci0jZGVmaW5lIEFSQ0hfejhrCi0jZW5kaWYKLQotCi1kaXNhc3NlbWJsZXJfZnR5cGUKLWRpc2Fzc2VtYmxlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYSA9IGJmZF9nZXRfYXJjaCAoYWJmZCk7Ci0gIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZTsKLQotICBzd2l0Y2ggKGEpCi0gICAgewotICAgICAgLyogSWYgeW91IGFkZCBhIGNhc2UgdG8gdGhpcyB0YWJsZSwgYWxzbyBhZGQgaXQgdG8gdGhlCi0JIEFSQ0hfYWxsIGRlZmluaXRpb24gcmlnaHQgYWJvdmUgdGhpcyBmdW5jdGlvbi4gICovCi0jaWZkZWYgQVJDSF9hMjlrCi0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgLyogQXMgZmFyIGFzIEkga25vdyB3ZSBvbmx5IGhhbmRsZSBiaWctZW5kaWFuIDI5ayBvYmplY3RzLiAgKi8KLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfYTI5azsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9hbHBoYQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYWxwaGE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfYXJjCi0gICAgY2FzZSBiZmRfYXJjaF9hcmM6Ci0gICAgICB7Ci0JZGlzYXNzZW1ibGUgPSBhcmNfZ2V0X2Rpc2Fzc2VtYmxlciAoYmZkX2dldF9tYWNoIChhYmZkKSwKLQkJCQkJICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2FybQotICAgIGNhc2UgYmZkX2FyY2hfYXJtOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX2FybTsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbGl0dGxlX2FybTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9hdnIKLSAgICBjYXNlIGJmZF9hcmNoX2F2cjoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9hdnI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfZDEwdgotICAgIGNhc2UgYmZkX2FyY2hfZDEwdjoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9kMTB2OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2QzMHYKLSAgICBjYXNlIGJmZF9hcmNoX2QzMHY6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fZDMwdjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9oODMwMAotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaCkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDBoOwotICAgICAgZWxzZSBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDBzOwotICAgICAgZWxzZSAKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDgzMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaDg1MDAKLSAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4NTAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2hwcGEKLSAgICBjYXNlIGJmZF9hcmNoX2hwcGE6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faHBwYTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9pMzcwCi0gICAgY2FzZSBiZmRfYXJjaF9pMzcwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2kzNzA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaTM4NgotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXgpCi0gICAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9pMzg2X2ludGVsOwotICAgICAgZWxzZQotICAgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faTM4Nl9hdHQ7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaTk2MAotICAgIGNhc2UgYmZkX2FyY2hfaTk2MDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9pOTYwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2ZyMzAKLSAgICBjYXNlIGJmZF9hcmNoX2ZyMzA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fZnIzMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tMzJyCi0gICAgY2FzZSBiZmRfYXJjaF9tMzJyOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX20zMnI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbTY4awotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tNjhrOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX204OGsKLSAgICBjYXNlIGJmZF9hcmNoX204OGs6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbTg4azsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9uczMyawotICAgIGNhc2UgYmZkX2FyY2hfbnMzMms6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbnMzMms7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbWNvcmUKLSAgICBjYXNlIGJmZF9hcmNoX21jb3JlOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX21jb3JlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX21pcHMKLSAgICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfbWlwczsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbGl0dGxlX21pcHM7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbW4xMDIwMAotICAgIGNhc2UgYmZkX2FyY2hfbW4xMDIwMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tbjEwMjAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX21uMTAzMDAKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAzMDA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbW4xMDMwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9wagotICAgIGNhc2UgYmZkX2FyY2hfcGo6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fcGo7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfcG93ZXJwYwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19wb3dlcnBjOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYzsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9yczYwMDAKLSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9yczYwMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfc2gKLSAgICBjYXNlIGJmZF9hcmNoX3NoOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fc2g7Ci0gICAgICBlbHNlCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NobDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9zcGFyYwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fc3BhcmM7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdGljMzAKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzMwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3RpYzMwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3RpYzgwCi0gICAgY2FzZSBiZmRfYXJjaF90aWM4MDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl90aWM4MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF92ODUwCi0gICAgY2FzZSBiZmRfYXJjaF92ODUwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3Y4NTA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdzY1Ci0gICAgY2FzZSBiZmRfYXJjaF93NjU6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdzY1OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3o4awotICAgIGNhc2UgYmZkX2FyY2hfejhrOgotICAgICAgaWYgKGJmZF9nZXRfbWFjaChhYmZkKSA9PSBiZmRfbWFjaF96ODAwMSkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fejgwMDE7Ci0gICAgICBlbHNlIAotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl96ODAwMjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF92YXgKLSAgICBjYXNlIGJmZF9hcmNoX3ZheDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl92YXg7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiBkaXNhc3NlbWJsZTsKLX0KLQotdm9pZAotZGlzYXNzZW1ibGVyX3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEFSQ0hfYXJtCi0gIHByaW50X2FybV9kaXNhc3NlbWJsZXJfb3B0aW9ucyAoc3RyZWFtKTsKLSNlbmRpZgotICAKLSAgcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWFzbS5jIGIvb3Bjb2Rlcy9mcjMwLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM4ZGJiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0vKiBBc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tYXNtLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwYXJzZV9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgY29uc3QgY2hhciAqKiwgQ0dFTl9GSUVMRFMgKikpOwotDAotLyogLS0gYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gYXNtLmMgKi8KLS8qIEhhbmRsZSByZWdpc3RlciBsaXN0cyBmb3IgTERNeCBhbmQgU1RNeCAgKi8KLQotc3RhdGljIGludAotcGFyc2VfcmVnaXN0ZXJfbnVtYmVyIChzdHJwKQotICAgICBjb25zdCBjaGFyICoqc3RycDsKLXsKLSAgaW50IHJlZ25vOwotICBpZiAoKipzdHJwIDwgJzAnIHx8ICoqc3RycCA+ICc5JykKLSAgICByZXR1cm4gLTE7IC8qIGVycm9yICovCi0gIHJlZ25vID0gKipzdHJwIC0gJzAnOwotICArKypzdHJwOwotCi0gIGlmICgqKnN0cnAgPj0gJzAnICYmICoqc3RycCA8PSAnOScpCi0gICAgewotICAgICAgcmVnbm8gPSByZWdubyAqIDEwICsgKCoqc3RycCAtICcwJyk7Ci0gICAgICArKypzdHJwOwotICAgIH0KLQotICByZXR1cm4gcmVnbm87Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIGhpZ2hfbG93LCBsb2FkX3N0b3JlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLSAgICAgaW50IGhpZ2hfbG93OyAgIC8qIDAgPT0gaGlnaCwgMSA9PSBsb3cgKi8KLSAgICAgaW50IGxvYWRfc3RvcmU7IC8qIDAgPT0gbG9hZCwgMSA9PSBzdG9yZSAqLwotewotICBpbnQgcmVnbm87Ci0gICp2YWx1ZXAgPSAwOwotICB3aGlsZSAoKipzdHJwICYmICoqc3RycCAhPSAnKScpCi0gICAgewotICAgICAgaWYgKCoqc3RycCAhPSAnUicgJiYgKipzdHJwICE9ICdyJykKLQlicmVhazsKLSAgICAgICsrKnN0cnA7Ci0KLSAgICAgIHJlZ25vID0gcGFyc2VfcmVnaXN0ZXJfbnVtYmVyIChzdHJwKTsKLSAgICAgIGlmIChyZWdubyA9PSAtMSkKLQlyZXR1cm4gIlJlZ2lzdGVyIG51bWJlciBpcyBub3QgdmFsaWQiOwotICAgICAgaWYgKHJlZ25vID4gNyAmJiAhaGlnaF9sb3cpCi0JcmV0dXJuICJSZWdpc3RlciBtdXN0IGJlIGJldHdlZW4gcjAgYW5kIHI3IjsKLSAgICAgIGlmIChyZWdubyA8IDggJiYgaGlnaF9sb3cpCi0JcmV0dXJuICJSZWdpc3RlciBtdXN0IGJlIGJldHdlZW4gcjggYW5kIHIxNSI7Ci0KLSAgICAgIGlmIChoaWdoX2xvdykKLQlyZWdubyAtPSA4OwotCi0gICAgICBpZiAobG9hZF9zdG9yZSkgLyogbWFzayBpcyByZXZlcnNlZCBmb3Igc3RvcmUgKi8KLQkqdmFsdWVwIHw9IDB4ODAgPj4gcmVnbm87Ci0gICAgICBlbHNlCi0JKnZhbHVlcCB8PSAxIDw8IHJlZ25vOwotCi0gICAgICBpZiAoKipzdHJwID09ICcsJykKLQl7Ci0JICBpZiAoKigqc3RycCArIDEpID09ICcpJykKLQkgICAgYnJlYWs7Ci0JICArKypzdHJwOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEqc3RycCB8fCAqKnN0cnAgIT0gJyknKQotICAgIHJldHVybiAiUmVnaXN0ZXIgbGlzdCBpcyBub3QgdmFsaWQiOwotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAwLypsb3cqLywgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxLypoaWdoKi8sIDAvKmxvYWQqLyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDAvKmxvdyovLCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxLypoaWdoKi8sIDEvKnN0b3JlKi8pOwotfQotCi0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIHBhcnNpbmcuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWNvbnN0IGNoYXIgKgotZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBvcGluZGV4LCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBjaGFyICoqIHN0cnA7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotewotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgLyogVXNlZCBieSBzY2FsYXIgb3BlcmFuZHMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHBhcnNlZC4gICovCi0gIGxvbmcganVuazsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfQ1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfQ1JqKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxMywgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SaSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JpYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SamMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCAmIGZpZWxkcy0+Zl9SczEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCAmIGZpZWxkcy0+Zl9SczIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0NDLCAmZmllbGRzLT5mX2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfQ0NDLCAmZmllbGRzLT5mX2NjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSMTAsICZmaWVsZHMtPmZfZGlyMTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSOCwgJmZpZWxkcy0+Zl9kaXI4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJUjksICZmaWVsZHMtPmZfZGlyOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQMTAsICZmaWVsZHMtPmZfZGlzcDEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElTUDgsICZmaWVsZHMtPmZfZGlzcDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQOSwgJmZpZWxkcy0+Zl9kaXNwOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0kyMCwgJmZpZWxkcy0+Zl9pMjApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JMzIsICZmaWVsZHMtPmZfaTMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JOCwgJmZpZWxkcy0+Zl9pOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0xBQkVMMTIsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfTEFCRUw5LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX000LCAmZmllbGRzLT5mX200KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcHMsICYganVuayk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZXJybXNnID0gcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NULCAmZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZXJybXNnID0gcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQsICZmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZXJybXNnID0gcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QsICZmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUzEwLCAmZmllbGRzLT5mX3MxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1UxMCwgJmZpZWxkcy0+Zl91MTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1U0LCAmZmllbGRzLT5mX3U0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTRDLCAmZmllbGRzLT5mX3U0Yyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTgsICZmaWVsZHMtPmZfdTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VRElTUDYsICZmaWVsZHMtPmZfdWRpc3A2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcGFyc2luZy5cbiIpLCBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotY2dlbl9wYXJzZV9mbiAqIGNvbnN0IGZyMzBfY2dlbl9wYXJzZV9oYW5kbGVyc1tdID0gCi17Ci0gIHBhcnNlX2luc25fbm9ybWFsLAotfTsKLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfYXNtIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgZnIzMF9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCk7Ci0gIGZyMzBfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKTsKLSAgY2QtPnBhcnNlX2hhbmRsZXJzID0gJiBmcjMwX2NnZW5fcGFyc2VfaGFuZGxlcnNbMF07Ci0gIGNkLT5wYXJzZV9vcGVyYW5kID0gZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQ7Ci19Ci0KLQwKLS8qIERlZmF1bHQgaW5zbiBwYXJzZXIuCi0KLSAgIFRoZSBzeW50YXggc3RyaW5nIGlzIHNjYW5uZWQgYW5kIG9wZXJhbmRzIGFyZSBwYXJzZWQgYW5kIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBSZWxvY3MgYXJlIHF1ZXVlZCBhcyB3ZSBnbyB2aWEgb3RoZXIgY2FsbGJhY2tzLgotCi0gICA/Pz8gTm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IGFuIGFsbC1vci1ub3RoaW5nIHBhcnNlci4gIElmIHdlIGZhaWwgdG8KLSAgIHBhcnNlIHRoZSBpbnN0cnVjdGlvbiwgd2UgcmV0dXJuIDAgYW5kIHRoZSBjYWxsZXIgd2lsbCBzdGFydCBvdmVyIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcuICBCYWNrdHJhY2tpbmcgd2lsbCBiZSBuZWNlc3NhcnkgaW4gcGFyc2luZyBzdWJleHByZXNzaW9ucywKLSAgIGJ1dCB0aGF0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLiAgTm90IGhhbmRsaW5nIGJhY2t0cmFja2luZyBoZXJlIG1heSBnZXQKLSAgIGV4cGVuc2l2ZSBpbiB0aGUgY2FzZSBvZiB0aGUgbTY4ay4gIERlYWwgd2l0aCBsYXRlci4KLQotICAgUmV0dXJucyBOVUxMIGZvciBzdWNjZXNzLCBhbiBlcnJvciBtZXNzYWdlIGZvciBmYWlsdXJlLgotKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci17Ci0gIC8qID8/PyBSdW50aW1lIGFkZGVkIGluc25zIG5vdCBoYW5kbGVkIHlldC4gICovCi0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgY2hhciAqc3RyID0gKnN0cnA7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN5bjsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIC8qIEZJWE1FOiB3aXAgKi8KLSAgaW50IHBhc3Rfb3Bjb2RlX3A7Ci0jZW5kaWYKLQotICAvKiBGb3Igbm93IHdlIGFzc3VtZSB0aGUgbW5lbW9uaWMgaXMgZmlyc3QgKHRoZXJlIGFyZSBubyBsZWFkaW5nIG9wZXJhbmRzKS4KLSAgICAgV2UgY2FuIHBhcnNlIGl0IHdpdGhvdXQgbmVlZGluZyB0byBzZXQgdXAgb3BlcmFuZCBwYXJzaW5nLgotICAgICBHQVMncyBpbnB1dCBzY3J1YmJlciB3aWxsIGVuc3VyZSBtbmVtb25pY3MgYXJlIGxvd2VyY2FzZSwgYnV0IHdlIG1heQotICAgICBub3QgYmUgY2FsbGVkIGZyb20gR0FTLiAgKi8KLSAgcCA9IENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbik7Ci0gIHdoaWxlICgqcCAmJiB0b2xvd2VyICgqcCkgPT0gdG9sb3dlciAoKnN0cikpCi0gICAgKytwLCArK3N0cjsKLQotICBpZiAoKiBwKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLQotI2lmbmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIGlmICgqIHN0ciAmJiAhaXNzcGFjZSAoKiBzdHIpKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLSNlbmRpZgotCi0gIENHRU5fSU5JVF9QQVJTRSAoY2QpOwotICBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCAoY2QpOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0jZW5kaWYKLQotICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLSAgICAgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOwotCi0gIC8qIE1uZW1vbmljcyBjb21lIGZpcnN0IGZvciBub3csIGVuc3VyZSB2YWxpZCBzdHJpbmcuICAqLwotICBpZiAoISBDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqIHN5bikpCi0gICAgYWJvcnQgKCk7Ci0KLSAgKytzeW47Ci0KLSAgd2hpbGUgKCogc3luICE9IDApCi0gICAgewotICAgICAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQl7Ci0JICAvKiBGSVhNRTogV2hpbGUgd2UgYWxsb3cgZm9yIG5vbi1HQVMgY2FsbGVycyBhYm92ZSwgd2UgYXNzdW1lIHRoZQotCSAgICAgZmlyc3QgY2hhciBhZnRlciB0aGUgbW5lbW9uaWMgcGFydCBpcyBhIHNwYWNlLiAgKi8KLQkgIC8qIEZJWE1FOiBXZSBhbHNvIHRha2UgaW5hcHByb3ByaWF0ZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdAotCSAgICAgR0FTJ3MgaW5wdXQgc2NydWJiZXIgd2lsbCByZW1vdmUgZXh0cmFuZW91cyBibGFua3MuICAqLwotCSAgaWYgKCpzdHIgPT0gQ0dFTl9TWU5UQVhfQ0hBUiAoKiBzeW4pKQotCSAgICB7Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotCSAgICAgIGlmICgqIHN5biA9PSAnICcpCi0JCXBhc3Rfb3Bjb2RlX3AgPSAxOwotI2VuZGlmCi0JICAgICAgKysgc3luOwotCSAgICAgICsrIHN0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU3ludGF4IGNoYXIgZGlkbid0IG1hdGNoLiAgQ2FuJ3QgYmUgdGhpcyBpbnNuLiAgKi8KLQkgICAgICAvKiBGSVhNRTogd291bGQgbGlrZSB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UKLQkJICJleHBlY3RlZCBjaGFyIGBjJyIgKi8KLQkgICAgICByZXR1cm4gXygic3ludGF4IGVycm9yIik7Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kIG9mIHNvbWUgc29ydC4gICovCi0gICAgICBlcnJtc2cgPSBmcjMwX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkJICAmc3RyLCBmaWVsZHMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotCi0gICAgICAvKiBEb25lIHdpdGggdGhpcyBvcGVyYW5kLCBjb250aW51ZSB3aXRoIG5leHQgb25lLiAgKi8KLSAgICAgICsrIHN5bjsKLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3ludGF4IHN0cmluZywgd2UncmUgZG9uZS4gICovCi0gIGlmICgqIHN5biA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBGb3IgdGhlIG1vbWVudCB3ZSBhc3N1bWUgYSB2YWxpZCBgc3RyJyBjYW4gb25seSBjb250YWluCi0JIGJsYW5rcyBub3cuICBJRTogV2UgbmVlZG4ndCB0cnkgYWdhaW4gd2l0aCBhIGxvbmdlciB2ZXJzaW9uIG9mCi0JIHRoZSBpbnNuIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgbG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIGFwcGVhcgotCSBiZWZvcmUgc2hvcnRlciBvbmVzIChlZzogbHNyIHIyLHIzLDEgdnMgbHNyIHIyLHIzKS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotCSsrIHN0cjsKLQotICAgICAgaWYgKCogc3RyICE9ICdcMCcpCi0JcmV0dXJuIF8oImp1bmsgYXQgZW5kIG9mIGxpbmUiKTsgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSBgc3RyJyAqLwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgY291bGRuJ3QgcGFyc2UgaXQuICAqLwotICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci19Ci0MCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuCi0gICBTVFIgcG9pbnRzIHRvIHRoZSBpbnNuIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFdlIGFzc3VtZSBhbGwgbmVjZXNzYXJ5IHRhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBUaGUgYXNzZW1ibGVkIGluc3RydWN0aW9uLCBsZXNzIGFueSBmaXh1cHMsIGlzIHN0b3JlZCBpbiBCVUYuCi0gICBSZW1lbWJlciB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCB0aGVuIEJVRiBpcyBhbiBpbnQgYW5kIHRodXMgdGhlIHZhbHVlCi0gICBzdGlsbCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUYgaXMgYW4gYXJyYXkKLSAgIG9mIGJ5dGVzIGluIHRhcmdldCBieXRlIG9yZGVyLgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGluc24ncyBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlLAotICAgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cmVkIChhbiBlcnJvciBtZXNzYWdlIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgIHByaW50ZWQpLgotCi0gICBOb3RlIHRoYXQgd2hlbiBwcm9jZXNzaW5nIChub24tYWxpYXMpIG1hY3JvLWluc25zLAotICAgdGhpcyBmdW5jdGlvbiByZWN1cnNlcy4KLQotICAgPz8/IEl0J3MgcG9zc2libGUgdG8gbWFrZSB0aGlzIGNwdS1pbmRlcGVuZGVudC4KLSAgIE9uZSB3b3VsZCBoYXZlIHRvIGRlYWwgd2l0aCBhIGZldyBtaW5vciB0aGluZ3MuCi0gICBBdCB0aGlzIHBvaW50IGluIHRpbWUgZG9pbmcgc28gd291bGQgYmUgbW9yZSBvZiBhIGN1cmlvc2l0eSB0aGFuIHVzZWZ1bAotICAgW2ZvciBleGFtcGxlIHRoaXMgZmlsZSBpc24ndCBfdGhhdF8gYmlnXSwgYnV0IGtlZXBpbmcgdGhlIHBvc3NpYmlsaXR5IGluCi0gICBtaW5kIGhlbHBzIGtlZXAgdGhlIGRlc2lnbiBjbGVhbi4gICovCi0KLWNvbnN0IENHRU5fSU5TTiAqCi1mcjMwX2NnZW5fYXNzZW1ibGVfaW5zbiAoY2QsIHN0ciwgZmllbGRzLCBidWYsIGVycm1zZykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZjsKLSAgICAgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gIENHRU5fSU5TTl9MSVNUICppbGlzdDsKLQotICAvKiBTa2lwIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotICAgICsrIHN0cjsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaGVkIGxpc3RzLgotICAgICBHZXQgdGhlIGZpcnN0IGluIHRoZSBsaXN0LiAgKi8KLSAgaWxpc3QgPSBDR0VOX0FTTV9MT09LVVBfSU5TTiAoY2QsIHN0cik7Ci0KLSAgLyogS2VlcCBsb29raW5nIHVudGlsIHdlIGZpbmQgYSBtYXRjaC4gICovCi0KLSAgc3RhcnQgPSBzdHI7Ci0gIGZvciAoIDsgaWxpc3QgIT0gTlVMTCA7IGlsaXN0ID0gQ0dFTl9BU01fTkVYVF9JTlNOIChpbGlzdCkpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaWxpc3QtPmluc247Ci0KLSNpZiAwIC8qIG5vdCBuZWVkZWQgYXMgdW5zdXBwb3J0ZWQgb3Bjb2RlcyBzaG91bGRuJ3QgYmUgaW4gdGhlIGhhc2ggbGlzdHMgKi8KLSAgICAgIC8qIElzIHRoaXMgaW5zbiBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGNwdT8gICovCi0gICAgICBpZiAoISBmcjMwX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBJZiB0aGUgUkVMQVggYXR0cmlidXRlIGlzIHNldCwgdGhpcyBpcyBhbiBpbnNuIHRoYXQgc2hvdWxkbid0IGJlCi0JIGNob3NlbiBpbW1lZGlhdGVseS4gIEluc3RlYWQsIGl0IGlzIHVzZWQgZHVyaW5nIGFzc2VtYmxlci9saW5rZXIKLQkgcmVsYXhhdGlvbiBpZiBwb3NzaWJsZS4gICovCi0gICAgICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3RyID0gc3RhcnQ7Ci0KLSAgICAgIC8qIEFsbG93IHBhcnNlL2luc2VydCBoYW5kbGVycyB0byBvYnRhaW4gbGVuZ3RoIG9mIGluc24uICAqLwotICAgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICAgICAgaWYgKCEgQ0dFTl9QQVJTRV9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgJiBzdHIsIGZpZWxkcykpCi0JewotCSAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JICBpZiAoQ0dFTl9JTlNFUlRfRk4gKGNkLCBpbnNuKSAoY2QsIGluc24sIGZpZWxkcywgYnVmLCAoYmZkX3ZtYSkgMCkKLQkgICAgICAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQkgIC8qIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gYWN0dWFsbHkgb3V0cHV0IHRoZSBpbnNuIGFuZCBhbnkKLQkgICAgIHF1ZXVlZCByZWxvY3MuICAqLwotCSAgcmV0dXJuIGluc247Ci0JfQotCi0gICAgICAvKiBUcnkgdGhlIG5leHQgZW50cnkuICAqLwotICAgIH0KLQotICAvKiBGSVhNRTogV2UgY2FuIHJldHVybiBhIGJldHRlciBlcnJvciBtZXNzYWdlIHRoYW4gdGhpcy4KLSAgICAgTmVlZCB0byB0cmFjayB3aHkgaXQgZmFpbGVkIGFuZCBwaWNrIHRoZSByaWdodCBvbmUuICAqLwotICB7Ci0gICAgc3RhdGljIGNoYXIgZXJyYnVmWzEwMF07Ci0gICAgaWYgKHN0cmxlbiAoc3RhcnQpID4gNTApCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoZXJyYnVmLCBfKCJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzLi4uJyIpLCBzdGFydCk7Ci0gICAgZWxzZSAKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMnIiksIHN0YXJ0KTsKLSAgICAgIAotICAgICplcnJtc2cgPSBlcnJidWY7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQwKLSNpZiAwIC8qIFRoaXMgY2FsbHMgYmFjayB0byBHQVMgd2hpY2ggd2UgY2FuJ3QgZG8gd2l0aG91dCBjYXJlLiAgKi8KLQotLyogUmVjb3JkIGVhY2ggbWVtYmVyIG9mIE9QVkFMUyBpbiB0aGUgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlLgotICAgVGhpcyBsZXRzIEdBUyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLgotICAgPz8/IEludGVyZXN0aW5nIGlkZWEgYnV0IG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLS8qIFJlY29yZCBlYWNoIG1lbWJlciBvZiBPUFZBTFMgaW4gdGhlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZS4KLSAgIEZJWE1FOiBOb3QgY3VycmVudGx5IHVzZWQuICAqLwotCi12b2lkCi1mcjMwX2NnZW5fYXNtX2hhc2hfa2V5d29yZHMgKGNkLCBvcHZhbHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fS0VZV09SRCAqb3B2YWxzOwotewotICBDR0VOX0tFWVdPUkRfU0VBUkNIIHNlYXJjaCA9IGNnZW5fa2V5d29yZF9zZWFyY2hfaW5pdCAob3B2YWxzLCBOVUxMKTsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoga2U7Ci0KLSAgd2hpbGUgKChrZSA9IGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dCAoJiBzZWFyY2gpKSAhPSBOVUxMKQotICAgIHsKLSNpZiAwIC8qIFVubmVjZXNzYXJ5LCBzaG91bGQgYmUgZG9uZSBpbiB0aGUgc2VhcmNoIHJvdXRpbmUuICAqLwotICAgICAgaWYgKCEgZnIzMF9jZ2VuX29wdmFsX3N1cHBvcnRlZCAoa2UpKQotCWNvbnRpbnVlOwotI2VuZGlmCi0gICAgICBjZ2VuX2FzbV9yZWNvcmRfcmVnaXN0ZXIgKGNkLCBrZS0+bmFtZSwga2UtPnZhbHVlKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGVzYy5jIGIvb3Bjb2Rlcy9mcjMwLWRlc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwZjA0Yi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtZGVzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0MyArMCwwIEBACi0vKiBDUFUgZGF0YSBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEF0dHJpYnV0ZXMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIGJvb2xfYXR0cltdID0KLXsKLSAgeyAiI2YiLCAwIH0sCi0gIHsgIiN0IiwgMSB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBNQUNIX2F0dHJbXSA9Ci17Ci0gIHsgImJhc2UiLCBNQUNIX0JBU0UgfSwKLSAgeyAiZnIzMCIsIE1BQ0hfRlIzMCB9LAotICB7ICJtYXgiLCBNQUNIX01BWCB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBJU0FfYXR0cltdID0KLXsKLSAgeyAiZnIzMCIsIElTQV9GUjMwIH0sCi0gIHsgIm1heCIsIElTQV9NQVggfSwKLSAgeyAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQ1JFTC1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJBQlMtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVTRVJWRUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDQUNIRS1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUFJPRklMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5FR0FUSVZFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0VNLU9OTFkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkhBU0gtUFJFRklYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pbnNuX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJBTElBUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiVU5DT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNLSVAtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWEFCTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJOTy1ESVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBCQiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTk9ULUlOLURFTEFZLVNMT1QiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi0vKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JU0EgZnIzMF9jZ2VuX2lzYV90YWJsZVtdID0gewotICB7ICJmcjMwIiwgMTYsIDE2LCAxNiwgNDgsICB9LAotICB7IDAgfQotfTsKLQotLyogTWFjaGluZSB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggZnIzMF9jZ2VuX21hY2hfdGFibGVbXSA9IHsKLSAgeyAiZnIzMCIsICJmcjMwIiwgTUFDSF9GUjMwIH0sCi0gIHsgMCB9Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzW10gPQotewotICB7ICJyMCIsIDAgfSwKLSAgeyAicjEiLCAxIH0sCi0gIHsgInIyIiwgMiB9LAotICB7ICJyMyIsIDMgfSwKLSAgeyAicjQiLCA0IH0sCi0gIHsgInI1IiwgNSB9LAotICB7ICJyNiIsIDYgfSwKLSAgeyAicjciLCA3IH0sCi0gIHsgInI4IiwgOCB9LAotICB7ICJyOSIsIDkgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAiYWMiLCAxMyB9LAotICB7ICJmcCIsIDE0IH0sCi0gIHsgInNwIiwgMTUgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcyA9Ci17Ci0gICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzX2VudHJpZXNbMF0sCi0gIDE5Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzW10gPQotewotICB7ICJjcjAiLCAwIH0sCi0gIHsgImNyMSIsIDEgfSwKLSAgeyAiY3IyIiwgMiB9LAotICB7ICJjcjMiLCAzIH0sCi0gIHsgImNyNCIsIDQgfSwKLSAgeyAiY3I1IiwgNSB9LAotICB7ICJjcjYiLCA2IH0sCi0gIHsgImNyNyIsIDcgfSwKLSAgeyAiY3I4IiwgOCB9LAotICB7ICJjcjkiLCA5IH0sCi0gIHsgImNyMTAiLCAxMCB9LAotICB7ICJjcjExIiwgMTEgfSwKLSAgeyAiY3IxMiIsIDEyIH0sCi0gIHsgImNyMTMiLCAxMyB9LAotICB7ICJjcjE0IiwgMTQgfSwKLSAgeyAiY3IxNSIsIDE1IH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzWzBdLAotICAxNgotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAidGJyIiwgMCB9LAotICB7ICJycCIsIDEgfSwKLSAgeyAic3NwIiwgMiB9LAotICB7ICJ1c3AiLCAzIH0sCi0gIHsgIm1kaCIsIDQgfSwKLSAgeyAibWRsIiwgNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXNfZW50cmllc1swXSwKLSAgNgotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfaF9wc19lbnRyaWVzW10gPQotewotICB7ICJwcyIsIDAgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3BzID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfaF9wc19lbnRyaWVzWzBdLAotICAxCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxM19lbnRyaWVzW10gPQotewotICB7ICJyMTMiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTMgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxM19lbnRyaWVzWzBdLAotICAxCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxNF9lbnRyaWVzW10gPQotewotICB7ICJyMTQiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTQgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNF9lbnRyaWVzWzBdLAotICAxCi19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxNV9lbnRyaWVzW10gPQotewotICB7ICJyMTUiLCAwIH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTUgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNV9lbnRyaWVzWzBdLAotICAxCi19OwotCi0KLQotLyogVGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSFdfLGEpKQotCi1jb25zdCBDR0VOX0hXX0VOVFJZIGZyMzBfY2dlbl9od190YWJsZVtdID0KLXsKLSAgeyAiaC1tZW1vcnkiLCBIV19IX01FTU9SWSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNpbnQiLCBIV19IX1NJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC11aW50IiwgSFdfSF9VSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWRkciIsIEhXX0hfQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWlhZGRyIiwgSFdfSF9JQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBjIiwgSFdfSF9QQywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwfEEoUFJPRklMRSl8QShQQyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZ3IiLCBIV19IX0dSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgeyAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jciIsIEhXX0hfQ1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZHIiLCBIV19IX0RSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBzIiwgSFdfSF9QUywgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXIxMyIsIEhXX0hfUjEzLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxMywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXIxNCIsIEhXX0hfUjE0LCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXIxNSIsIEhXX0hfUjE1LCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLW5iaXQiLCBIV19IX05CSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC16Yml0IiwgSFdfSF9aQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdmJpdCIsIEhXX0hfVkJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWNiaXQiLCBIV19IX0NCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1pYml0IiwgSFdfSF9JQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2JpdCIsIEhXX0hfU0JJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXRiaXQiLCBIV19IX1RCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1kMGJpdCIsIEhXX0hfRDBCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1kMWJpdCIsIEhXX0hfRDFCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jY3IiLCBIV19IX0NDUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNjciIsIEhXX0hfU0NSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaWxtIiwgSFdfSF9JTE0sIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lGTERfLGEpKQotCi1jb25zdCBDR0VOX0lGTEQgZnIzMF9jZ2VuX2lmbGRfdGFibGVbXSA9Ci17Ci0gIHsgRlIzMF9GX05JTCwgImYtbmlsIiwgMCwgMCwgMCwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1AxLCAiZi1vcDEiLCAwLCAxNiwgMCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1AyLCAiZi1vcDIiLCAwLCAxNiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1AzLCAiZi1vcDMiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1A0LCAiZi1vcDQiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX09QNSwgImYtb3A1IiwgMCwgMTYsIDQsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0NDLCAiZi1jYyIsIDAsIDE2LCA0LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9DQ0MsICJmLWNjYyIsIDE2LCAxNiwgMCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkosICJmLVJqIiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JJLCAiZi1SaSIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUlMxLCAiZi1SczEiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUlMyLCAiZi1SczIiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JKQywgImYtUmpjIiwgMTYsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SSUMsICJmLVJpYyIsIDE2LCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0NSSiwgImYtQ1JqIiwgMTYsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9DUkksICJmLUNSaSIsIDE2LCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1U0LCAiZi11NCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VNEMsICJmLXU0YyIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfSTQsICJmLWk0IiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX000LCAiZi1tNCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VOCwgImYtdTgiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfSTgsICJmLWk4IiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0kyMF80LCAiZi1pMjAtNCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9JMjBfMTYsICJmLWkyMC0xNiIsIDE2LCAxNiwgMCwgMTYsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0kzMiwgImYtaTMyIiwgMTYsIDMyLCAwLCAzMiwgeyAwfEEoU0lHTl9PUFQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfVURJU1A2LCAiZi11ZGlzcDYiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElTUDgsICJmLWRpc3A4IiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJU1A5LCAiZi1kaXNwOSIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVNQMTAsICJmLWRpc3AxMCIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9TMTAsICJmLXMxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VMTAsICJmLXUxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUw5LCAiZi1yZWw5IiwgMCwgMTYsIDgsIDgsIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElSOCwgImYtZGlyOCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVI5LCAiZi1kaXI5IiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJUjEwLCAiZi1kaXIxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUwxMiwgImYtcmVsMTIiLCAwLCAxNiwgNSwgMTEsIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVHTElTVF9ISV9TVCwgImYtcmVnbGlzdF9oaV9zdCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUdMSVNUX0xPV19TVCwgImYtcmVnbGlzdF9sb3dfc3QiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkVHTElTVF9ISV9MRCwgImYtcmVnbGlzdF9oaV9sZCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUdMSVNUX0xPV19MRCwgImYtcmVnbGlzdF9sb3dfbGQiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBvcGVyYW5kIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fT1BFUkFORF8sYSkpCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEZSMzBfT1BFUkFORF8sb3ApCi0KLWNvbnN0IENHRU5fT1BFUkFORCBmcjMwX2NnZW5fb3BlcmFuZF90YWJsZVtdID0KLXsKLS8qIHBjOiBwcm9ncmFtIGNvdW50ZXIgKi8KLSAgeyAicGMiLCBGUjMwX09QRVJBTkRfUEMsIEhXX0hfUEMsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJpOiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotICB7ICJSaSIsIEZSMzBfT1BFUkFORF9SSSwgSFdfSF9HUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJqOiBzb3VyY2UgcmVnaXN0ZXIgKi8KLSAgeyAiUmoiLCBGUjMwX09QRVJBTkRfUkosIEhXX0hfR1IsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJpYzogdGFyZ2V0IHJlZ2lzdGVyIGNvcHJvYyBpbnNuICovCi0gIHsgIlJpYyIsIEZSMzBfT1BFUkFORF9SSUMsIEhXX0hfR1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSamM6IHNvdXJjZSByZWdpc3RlciBjb3Byb2MgaW5zbiAqLwotICB7ICJSamMiLCBGUjMwX09QRVJBTkRfUkpDLCBIV19IX0dSLCA4LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBDUmk6IGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0gIHsgIkNSaSIsIEZSMzBfT1BFUkFORF9DUkksIEhXX0hfQ1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBDUmo6IGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0gIHsgIkNSaiIsIEZSMzBfT1BFUkFORF9DUkosIEhXX0hfQ1IsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJzMTogZGVkaWNhdGVkIHJlZ2lzdGVyICovCi0gIHsgIlJzMSIsIEZSMzBfT1BFUkFORF9SUzEsIEhXX0hfRFIsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJzMjogZGVkaWNhdGVkIHJlZ2lzdGVyICovCi0gIHsgIlJzMiIsIEZSMzBfT1BFUkFORF9SUzIsIEhXX0hfRFIsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSMTM6IEdlbmVyYWwgUmVnaXN0ZXIgMTMgKi8KLSAgeyAiUjEzIiwgRlIzMF9PUEVSQU5EX1IxMywgSFdfSF9SMTMsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFIxNDogR2VuZXJhbCBSZWdpc3RlciAxNCAqLwotICB7ICJSMTQiLCBGUjMwX09QRVJBTkRfUjE0LCBIV19IX1IxNCwgMCwgMCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUjE1OiBHZW5lcmFsIFJlZ2lzdGVyIDE1ICovCi0gIHsgIlIxNSIsIEZSMzBfT1BFUkFORF9SMTUsIEhXX0hfUjE1LCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBwczogUHJvZ3JhbSBTdGF0dXMgcmVnaXN0ZXIgKi8KLSAgeyAicHMiLCBGUjMwX09QRVJBTkRfUFMsIEhXX0hfUFMsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHU0OiA0ICBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInU0IiwgRlIzMF9PUEVSQU5EX1U0LCBIV19IX1VJTlQsIDgsIDQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHU0YzogNCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1NGMiLCBGUjMwX09QRVJBTkRfVTRDLCBIV19IX1VJTlQsIDEyLCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1ODogOCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1OCIsIEZSMzBfT1BFUkFORF9VOCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpODogOCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJpOCIsIEZSMzBfT1BFUkFORF9JOCwgSFdfSF9VSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1ZGlzcDY6IDYgIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidWRpc3A2IiwgRlIzMF9PUEVSQU5EX1VESVNQNiwgSFdfSF9VSU5ULCA4LCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwODogOCAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLwotICB7ICJkaXNwOCIsIEZSMzBfT1BFUkFORF9ESVNQOCwgSFdfSF9TSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwOTogOSAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLwotICB7ICJkaXNwOSIsIEZSMzBfT1BFUkFORF9ESVNQOSwgSFdfSF9TSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwMTA6IDEwIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KLSAgeyAiZGlzcDEwIiwgRlIzMF9PUEVSQU5EX0RJU1AxMCwgSFdfSF9TSU5ULCA0LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzMTA6IDEwIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KLSAgeyAiczEwIiwgRlIzMF9PUEVSQU5EX1MxMCwgSFdfSF9TSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1MTA6IDEwIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidTEwIiwgRlIzMF9PUEVSQU5EX1UxMCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpMzI6IDMyIGJpdCBpbW1lZGlhdGUgKi8KLSAgeyAiaTMyIiwgRlIzMF9PUEVSQU5EX0kzMiwgSFdfSF9VSU5ULCAwLCAzMiwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCl8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogbTQ6IDQgIGJpdCBuZWdhdGl2ZSBpbW1lZGlhdGUgKi8KLSAgeyAibTQiLCBGUjMwX09QRVJBTkRfTTQsIEhXX0hfU0lOVCwgOCwgNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaTIwOiAyMCBiaXQgaW1tZWRpYXRlICovCi0gIHsgImkyMCIsIEZSMzBfT1BFUkFORF9JMjAsIEhXX0hfVUlOVCwgMCwgMjAsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpfEEoVklSVFVBTCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlyODogOCAgYml0IGRpcmVjdCBhZGRyZXNzICovCi0gIHsgImRpcjgiLCBGUjMwX09QRVJBTkRfRElSOCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXI5OiA5ICBiaXQgZGlyZWN0IGFkZHJlc3MgKi8KLSAgeyAiZGlyOSIsIEZSMzBfT1BFUkFORF9ESVI5LCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpcjEwOiAxMCBiaXQgZGlyZWN0IGFkZHJlc3MgKi8KLSAgeyAiZGlyMTAiLCBGUjMwX09QRVJBTkRfRElSMTAsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogbGFiZWw5OiA5ICBiaXQgcGMgcmVsYXRpdmUgYWRkcmVzcyAqLwotICB7ICJsYWJlbDkiLCBGUjMwX09QRVJBTkRfTEFCRUw5LCBIV19IX0lBRERSLCA4LCA4LAotICAgIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGxhYmVsMTI6IDEyIGJpdCBwYyByZWxhdGl2ZSBhZGRyZXNzICovCi0gIHsgImxhYmVsMTIiLCBGUjMwX09QRVJBTkRfTEFCRUwxMiwgSFdfSF9JQUREUiwgNSwgMTEsCi0gICAgeyAwfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogcmVnbGlzdF9sb3dfbGQ6IDggYml0IGxvdyByZWdpc3RlciBtYXNrIGZvciBsZG0gKi8KLSAgeyAicmVnbGlzdF9sb3dfbGQiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogcmVnbGlzdF9oaV9sZDogOCBiaXQgaGlnaCByZWdpc3RlciBtYXNrIGZvciBsZG0gKi8KLSAgeyAicmVnbGlzdF9oaV9sZCIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xELCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHJlZ2xpc3RfbG93X3N0OiA4IGJpdCBsb3cgcmVnaXN0ZXIgbWFzayBmb3Igc3RtICovCi0gIHsgInJlZ2xpc3RfbG93X3N0IiwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NULCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHJlZ2xpc3RfaGlfc3Q6IDggYml0IGhpZ2ggcmVnaXN0ZXIgbWFzayBmb3Igc3RtICovCi0gIHsgInJlZ2xpc3RfaGlfc3QiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBjYzogY29uZGl0aW9uIGNvZGVzICovCi0gIHsgImNjIiwgRlIzMF9PUEVSQU5EX0NDLCBIV19IX1VJTlQsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGNjYzogY29wcm9jZXNzb3IgY2FsYyAqLwotICB7ICJjY2MiLCBGUjMwX09QRVJBTkRfQ0NDLCBIV19IX1VJTlQsIDAsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIG5iaXQ6IG5lZ2F0aXZlICAgYml0ICovCi0gIHsgIm5iaXQiLCBGUjMwX09QRVJBTkRfTkJJVCwgSFdfSF9OQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB2Yml0OiBvdmVyZmxvdyAgIGJpdCAqLwotICB7ICJ2Yml0IiwgRlIzMF9PUEVSQU5EX1ZCSVQsIEhXX0hfVkJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogemJpdDogemVybyAgICAgICBiaXQgKi8KLSAgeyAiemJpdCIsIEZSMzBfT1BFUkFORF9aQklULCBIV19IX1pCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGNiaXQ6IGNhcnJ5ICAgICAgYml0ICovCi0gIHsgImNiaXQiLCBGUjMwX09QRVJBTkRfQ0JJVCwgSFdfSF9DQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpYml0OiBpbnRlcnJ1cHQgIGJpdCAqLwotICB7ICJpYml0IiwgRlIzMF9PUEVSQU5EX0lCSVQsIEhXX0hfSUJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2JpdDogc3RhY2sgICAgICBiaXQgKi8KLSAgeyAic2JpdCIsIEZSMzBfT1BFUkFORF9TQklULCBIV19IX1NCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHRiaXQ6IHRyYWNlIHRyYXAgYml0ICovCi0gIHsgInRiaXQiLCBGUjMwX09QRVJBTkRfVEJJVCwgSFdfSF9UQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkMGJpdDogZGl2aXNpb24gMCBiaXQgKi8KLSAgeyAiZDBiaXQiLCBGUjMwX09QRVJBTkRfRDBCSVQsIEhXX0hfRDBCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGQxYml0OiBkaXZpc2lvbiAxIGJpdCAqLwotICB7ICJkMWJpdCIsIEZSMzBfT1BFUkFORF9EMUJJVCwgSFdfSF9EMUJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY2NyOiBjb25kaXRpb24gY29kZSBiaXRzICovCi0gIHsgImNjciIsIEZSMzBfT1BFUkFORF9DQ1IsIEhXX0hfQ0NSLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzY3I6IHN5c3RlbSBjb25kaXRpb24gYml0cyAqLwotICB7ICJzY3IiLCBGUjMwX09QRVJBTkRfU0NSLCBIV19IX1NDUiwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogaWxtOiBpbnRlcnJ1cHQgbGV2ZWwgbWFzayAqLwotICB7ICJpbG0iLCBGUjMwX09QRVJBTkRfSUxNLCBIV19IX0lMTSwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lCQVNFIGZyMzBfY2dlbl9pbnNuX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgMCwgMCwgMCB9LAotLyogYWRkICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREQsICJhZGQiLCAiYWRkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BRERJLCAiYWRkaSIsICJhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGQyICRtNCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREQyLCAiYWRkMiIsICJhZGQyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkYyAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQUREQywgImFkZGMiLCAiYWRkYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZG4gJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERE4sICJhZGRuIiwgImFkZG4iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRuICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREROSSwgImFkZG5pIiwgImFkZG4iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRuMiAkbTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQURETjIsICJhZGRuMiIsICJhZGRuMiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1YiAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1VCLCAic3ViIiwgInN1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1YmMgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NVQkMsICJzdWJjIiwgInN1YmMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWJuICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVUJOLCAic3VibiIsICJzdWJuIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DTVAsICJjbXAiLCAiY21wIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wICR1NCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DTVBJLCAiY21waSIsICJjbXAiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXAyICRtNCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DTVAyLCAiY21wMiIsICJjbXAyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkQsICJhbmQiLCAiYW5kIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX09SLCAib3IiLCAib3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBlb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUiwgImVvciIsICJlb3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmQgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkRNLCAiYW5kbSIsICJhbmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmRoICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQU5ESCwgImFuZGgiLCAiYW5kaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFuZGIgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkRCLCAiYW5kYiIsICJhbmRiIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3IgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9PUk0sICJvcm0iLCAib3IiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9PUkgsICJvcmgiLCAib3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3JiICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fT1JCLCAib3JiIiwgIm9yYiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVvciAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUk0sICJlb3JtIiwgImVvciIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FT1JILCAiZW9yaCIsICJlb3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW9yYiAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUkIsICJlb3JiIiwgImVvcmIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYW5kbCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JBTkRMLCAiYmFuZGwiLCAiYmFuZGwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBib3JsICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk9STCwgImJvcmwiLCAiYm9ybCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlb3JsICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVPUkwsICJiZW9ybCIsICJiZW9ybCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJhbmRoICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkFOREgsICJiYW5kaCIsICJiYW5kaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CT1JILCAiYm9yaCIsICJib3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmVvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CRU9SSCwgImJlb3JoIiwgImJlb3JoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnRzdGwgJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CVFNUTCwgImJ0c3RsIiwgImJ0c3RsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnRzdGggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CVFNUSCwgImJ0c3RoIiwgImJ0c3RoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXVsICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NVUwsICJtdWwiLCAibXVsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXVsdSAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTVVMVSwgIm11bHUiLCAibXVsdSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG11bGggJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01VTEgsICJtdWxoIiwgIm11bGgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdWx1aCAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTVVMVUgsICJtdWx1aCIsICJtdWx1aCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdjBzICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjBTLCAiZGl2MHMiLCAiZGl2MHMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXYwdSAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYwVSwgImRpdjB1IiwgImRpdjB1IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MSAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYxLCAiZGl2MSIsICJkaXYxIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MiAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ESVYyLCAiZGl2MiIsICJkaXYyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjMsICJkaXYzIiwgImRpdjMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXY0cyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjRTLCAiZGl2NHMiLCAiZGl2NHMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc2wgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTTCwgImxzbCIsICJsc2wiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc2wgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTTEksICJsc2xpIiwgImxzbCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzbDIgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTTDIsICJsc2wyIiwgImxzbDIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTUiwgImxzciIsICJsc3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTUkksICJsc3JpIiwgImxzciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xTUjIsICJsc3IyIiwgImxzcjIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FTUiwgImFzciIsICJhc3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FTUkksICJhc3JpIiwgImFzciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FTUjIsICJhc3IyIiwgImFzcjIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGk6OCAkaTgsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERJOCwgImxkaTgiLCAibGRpOjgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGk6MjAgJGkyMCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MREkyMCwgImxkaTIwIiwgImxkaToyMCIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaTozMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xESTMyLCAibGRpMzIiLCAibGRpOjMyIiwgNDgsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRCwgImxkIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1aCBAJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEVUgsICJsZHVoIiwgImxkdWgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViIEAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERVQiwgImxkdWIiLCAibGR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjEzLCAibGRyMTMiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjEzVUgsICJsZHIxM3VoIiwgImxkdWgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjEzVUIsICJsZHIxM3ViIiwgImxkdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCBAKCRSMTQsJGRpc3AxMCksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTQsICJsZHIxNCIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWggQCgkUjE0LCRkaXNwOSksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTRVSCwgImxkcjE0dWgiLCAibGR1aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTRVQiwgImxkcjE0dWIiLCAibGR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAoJFIxNSwkdWRpc3A2KSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNSwgImxkcjE1IiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSMTUrLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjE1R1IsICJsZHIxNWdyIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSMTUrLCRSczIgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNURSLCAibGRyMTVkciIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkcHMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNVBTLCAibGRyMTVwcyIsICJsZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSaSxAJFJqICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1QsICJzdCIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkUmksQCRSaiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUSCwgInN0aCIsICJzdGgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAkUmogKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVEIsICJzdGIiLCAic3RiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTMsICJzdHIxMyIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxM0gsICJzdHIxM2giLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjEzQiwgInN0cjEzYiIsICJzdGIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTQsICJzdHIxNCIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjE0LCRkaXNwOSkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNEgsICJzdHIxNGgiLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRSaSxAKCRSMTQsJGRpc3A4KSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjE0QiwgInN0cjE0YiIsICJzdGIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE1LCR1ZGlzcDYpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTUsICJzdHIxNSIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSaSxALSRSMTUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNUdSLCAic3RyMTVnciIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSczIsQC0kUjE1ICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTVEUiwgInN0cjE1ZHIiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkcHMsQC0kUjE1ICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTVQUywgInN0cjE1cHMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01PViwgIm1vdiIsICJtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJzMSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1ZEUiwgIm1vdmRyIiwgIm1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdiAkcHMsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTU9WUFMsICJtb3ZwcyIsICJtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJpLCRSczEgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1YyRFIsICJtb3YyZHIiLCAibW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92ICRSaSwkcHMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1YyUFMsICJtb3YycHMiLCAibW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogam1wIEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9KTVAsICJqbXAiLCAiam1wIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBqbXA6ZCBAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fSk1QRCwgImptcGQiLCAiam1wOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2FsbCBAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ0FMTFIsICJjYWxsciIsICJjYWxsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjYWxsOmQgQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTExSRCwgImNhbGxyZCIsICJjYWxsOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2FsbCAkbGFiZWwxMiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTEwsICJjYWxsIiwgImNhbGwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNhbGw6ZCAkbGFiZWwxMiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NBTExELCAiY2FsbGQiLCAiY2FsbDpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJldCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1JFVCwgInJldCIsICJyZXQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJldDpkICovCi0gIHsKLSAgICBGUjMwX0lOU05fUkVUX0QsICJyZXQ6ZCIsICJyZXQ6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBpbnQgJHU4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fSU5ULCAiaW50IiwgImludCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogaW50ZSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0lOVEUsICJpbnRlIiwgImludGUiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHJldGkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9SRVRJLCAicmV0aSIsICJyZXRpIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnJhOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JSQUQsICJicmFkIiwgImJyYTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlJBLCAiYnJhIiwgImJyYSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5vOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOT0QsICJibm9kIiwgImJubzpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibm8gJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOTywgImJubyIsICJibm8iLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZXE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVRRCwgImJlcWQiLCAiYmVxOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlcSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkVRLCAiYmVxIiwgImJlcSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuZTpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkVELCAiYm5lZCIsICJibmU6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5lICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkUsICJibmUiLCAiYm5lIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkNELCAiYmNkIiwgImJjOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJjICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CQywgImJjIiwgImJjIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOQ0QsICJibmNkIiwgImJuYzpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmMgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOQywgImJuYyIsICJibmMiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibjpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTkQsICJibmQiLCAiYm46ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm4gJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JOLCAiYm4iLCAiYm4iLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBicDpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CUEQsICJicGQiLCAiYnA6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnAgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JQLCAiYnAiLCAiYnAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBidjpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CVkQsICJidmQiLCAiYnY6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnYgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JWLCAiYnYiLCAiYnYiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5WRCwgImJudmQiLCAiYm52OmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJudiAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5WLCAiYm52IiwgImJudiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsdDpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTFRELCAiYmx0ZCIsICJibHQ6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmx0ICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTFQsICJibHQiLCAiYmx0IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmdlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JHRUQsICJiZ2VkIiwgImJnZTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZ2UgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JHRSwgImJnZSIsICJiZ2UiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibGU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxFRCwgImJsZWQiLCAiYmxlOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsZSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxFLCAiYmxlIiwgImJsZSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJndDpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CR1RELCAiYmd0ZCIsICJiZ3Q6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmd0ICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CR1QsICJiZ3QiLCAiYmd0IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmxzOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMU0QsICJibHNkIiwgImJsczpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibHMgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMUywgImJscyIsICJibHMiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiaGk6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkhJRCwgImJoaWQiLCAiYmhpOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJoaSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkhJLCAiYmhpIiwgImJoaSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgJFIxMyxAJGRpcjEwICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxMywgImRtb3ZyMTMiLCAiZG1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZoICRSMTMsQCRkaXI5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxM0gsICJkbW92cjEzaCIsICJkbW92aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZiICRSMTMsQCRkaXI4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVlIxM0IsICJkbW92cjEzYiIsICJkbW92YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzUEksICJkbW92cjEzcGkiLCAiZG1vdiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZoIEAkUjEzKyxAJGRpcjkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzUElILCAiZG1vdnIxM3BpaCIsICJkbW92aCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZiIEAkUjEzKyxAJGRpcjggKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzUElCLCAiZG1vdnIxM3BpYiIsICJkbW92YiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRSMTUrLEAkZGlyMTAgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjE1UEksICJkbW92cjE1cGkiLCAiZG1vdiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCwkUjEzICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTMsICJkbW92MnIxMyIsICJkbW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmggQCRkaXI5LCRSMTMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxM0gsICJkbW92MnIxM2giLCAiZG1vdmgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsJFIxMyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzQiwgImRtb3YycjEzYiIsICJkbW92YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCxAJFIxMysgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxM1BJLCAiZG1vdjJyMTNwaSIsICJkbW92IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmggQCRkaXI5LEAkUjEzKyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzUElILCAiZG1vdjJyMTNwaWgiLCAiZG1vdmgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsQCRSMTMrICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTNQSUIsICJkbW92MnIxM3BpYiIsICJkbW92YiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCxALSRSMTUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxNVBELCAiZG1vdjJyMTVwZCIsICJkbW92IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRyZXMgQCRSaSssJHU0ICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSRVMsICJsZHJlcyIsICJsZHJlcyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0cmVzICR1NCxAJFJpKyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUkVTLCAic3RyZXMiLCAic3RyZXMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ09QT1AsICJjb3BvcCIsICJjb3BvcCIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNvcGxkICR1NGMsJGNjYywkUmpjLCRDUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DT1BMRCwgImNvcGxkIiwgImNvcGxkIiwgMzIsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY29wc3QgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NPUFNULCAiY29wc3QiLCAiY29wc3QiLCAzMiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ09QU1YsICJjb3BzdiIsICJjb3BzdiIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG5vcCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX05PUCwgIm5vcCIsICJub3AiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmRjY3IgJHU4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQU5EQ0NSLCAiYW5kY2NyIiwgImFuZGNjciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9yY2NyICR1OCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX09SQ0NSLCAib3JjY3IiLCAib3JjY3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGlsbSAkdTggKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVElMTSwgInN0aWxtIiwgInN0aWxtIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkc3AgJHMxMCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERFNQLCAiYWRkc3AiLCAiYWRkc3AiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBleHRzYiAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FWFRTQiwgImV4dHNiIiwgImV4dHNiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZXh0dWIgJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRVhUVUIsICJleHR1YiIsICJleHR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGV4dHNoICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VYVFNILCAiZXh0c2giLCAiZXh0c2giLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBleHR1aCAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FWFRVSCwgImV4dHVoIiwgImV4dHVoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRtMCAoJHJlZ2xpc3RfbG93X2xkKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xETTAsICJsZG0wIiwgImxkbTAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZG0xICgkcmVnbGlzdF9oaV9sZCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRE0xLCAibGRtMSIsICJsZG0xIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RtMCAoJHJlZ2xpc3RfbG93X3N0KSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUTTAsICJzdG0wIiwgInN0bTAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG0xICgkcmVnbGlzdF9oaV9zdCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVE0xLCAic3RtMSIsICJzdG0xIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW50ZXIgJHUxMCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VOVEVSLCAiZW50ZXIiLCAiZW50ZXIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZWF2ZSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xFQVZFLCAibGVhdmUiLCAibGVhdmUiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4Y2hiIEAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fWENIQiwgInhjaGIiLCAieGNoYiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QCi0KLS8qIEluaXRpYWxpemUgYW55dGhpbmcgbmVlZGVkIHRvIGJlIGRvbmUgb25jZSwgYmVmb3JlIGFueSBjcHVfb3BlbiBjYWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfdGFibGVzICgpCi17Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGxvb2sgdXAgYSBtYWNoIHZpYSBpdHMgYmZkIG5hbWUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9NQUNIICoKLWxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAodGFibGUsIG5hbWUpCi0gICAgIGNvbnN0IENHRU5fTUFDSCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHdoaWxlICh0YWJsZS0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCB0YWJsZS0+YmZkX25hbWUpID09IDApCi0JcmV0dXJuIHRhYmxlOwotICAgICAgKyt0YWJsZTsKLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfaHdfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKmluaXQgPSAmIGZyMzBfY2dlbl9od190YWJsZVswXTsKLSAgLyogTUFYX0hXIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fSFdfRU5UUlkgKiopIHhtYWxsb2MgKE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7Ci0KLSAgY2QtPmh3X3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5od190YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0hXX0VOVFJZKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaHMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCi0gICAgaWYgKENHRU5fSFdfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fSFdfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+aHdfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOwotICBjZC0+aHdfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfSFc7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pZmllbGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGNkLT5pZmxkX3RhYmxlID0gJiBmcjMwX2NnZW5faWZsZF90YWJsZVswXTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBmcjMwX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX29wZXJhbmRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0gIGNvbnN0IENHRU5fT1BFUkFORCAqaW5pdCA9ICYgZnIzMF9jZ2VuX29wZXJhbmRfdGFibGVbMF07Ci0gIC8qIE1BWF9PUEVSQU5EUyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KLSAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgotICAgICB0aGUgdGFibGUuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKipzZWxlY3RlZCA9Ci0gICAgKGNvbnN0IENHRU5fT1BFUkFORCAqKikgeG1hbGxvYyAoTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotCi0gIGNkLT5vcGVyYW5kX3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fT1BFUkFORCk7Ci0gIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKLSAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaCB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX09QRVJBTkRfTUFDSCkKLQkmIG1hY2hzKQotICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOwotICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX09QRVJBTkRTOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuCi0gICA/Pz8gVGhpcyBjb3VsZCBsZWF2ZSBvdXQgaW5zbnMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIG1hY2gvaXNhLAotICAgYnV0IHRoYXQgd291bGQgY2F1c2UgZXJyb3JzIGxpa2UgImZvbyBvbmx5IHN1cHBvcnRlZCBieSBiYXIiIHRvIGJlY29tZQotICAgInVua25vd24gaW5zbiIsIHNvIGZvciBub3cgd2UgaW5jbHVkZSBhbGwgaW5zbnMgYW5kIHJlcXVpcmUgdGhlIGFwcCB0bwotICAgZG8gdGhlIGNoZWNraW5nIGxhdGVyLgotICAgPz8/IE9uIHRoZSBvdGhlciBoYW5kLCBwYXJzaW5nIG9mIHN1Y2ggaW5zbnMgbWF5IHJlcXVpcmUgdGhlaXIgaGFyZHdhcmUgb3IKLSAgIG9wZXJhbmQgZWxlbWVudHMgdG8gYmUgaW4gdGhlIHRhYmxlIFt3aGljaCB0aGV5IG1pZ2h0bid0IGJlXS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pbnNuX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIGZyMzBfY2dlbl9pbnNuX3RhYmxlWzBdOwotICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOwotCi0gIG1lbXNldCAoaW5zbnMsIDAsIE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPmluc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBNQVhfSU5TTlM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIHJlYnVpbGQgdGhlIHRhYmxlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1mcjMwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpLG5faXNhcyxuX21hY2hzOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IGNkLT5pc2FzOwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7Ci0KLSAgY2QtPmludF9pbnNuX3AgPSBDR0VOX0lOVF9JTlNOX1A7Ci0KLSAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIGlzYSBzcGVjLiAgKi8KLSNkZWZpbmUgVU5TRVQgKENHRU5fU0laRV9VTktOT1dOICsgMSkKLSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IFVOU0VUOwotICBjZC0+bWluX2luc25fYml0c2l6ZSA9IDY1NTM1OyAvKiBzb21lIHJpZGljdWxvdXNseSBiaWcgbnVtYmVyICovCi0gIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JU0FTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIGlzYXMpICE9IDApCi0gICAgICB7Ci0JY29uc3QgQ0dFTl9JU0EgKmlzYSA9ICYgZnIzMF9jZ2VuX2lzYV90YWJsZVtpXTsKLQotCS8qIERlZmF1bHQgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBCYXNlIGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKLQkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KLQlpZiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplID09IFVOU0VUKQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gaXNhLT5iYXNlX2luc25fYml0c2l6ZTsKLQllbHNlIGlmIChpc2EtPmJhc2VfaW5zbl9iaXRzaXplID09IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLQkgIDsgLyogdGhpcyBpcyBvayAqLwotCWVsc2UKLQkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOwotCi0JLyogU2V0IG1pbixtYXggaW5zbiBzaXplcy4gICovCi0JaWYgKGlzYS0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5taW5faW5zbl9iaXRzaXplKQotCSAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSBpc2EtPm1pbl9pbnNuX2JpdHNpemU7Ci0JaWYgKGlzYS0+bWF4X2luc25fYml0c2l6ZSA+IGNkLT5tYXhfaW5zbl9iaXRzaXplKQotCSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSBpc2EtPm1heF9pbnNuX2JpdHNpemU7Ci0KLQkrK25faXNhczsKLSAgICAgIH0KLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgbWFjaCBzcGVjLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9NQUNIUzsgKytpKQotICAgIGlmICgoKDEgPDwgaSkgJiBtYWNocykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX01BQ0ggKm1hY2ggPSAmIGZyMzBfY2dlbl9tYWNoX3RhYmxlW2ldOwotCi0JKytuX21hY2hzOwotICAgICAgfQotCi0gIC8qIERldGVybWluZSB3aGljaCBodyBlbGVtZW50cyBhcmUgdXNlZCBieSBNQUNILiAgKi8KLSAgYnVpbGRfaHdfdGFibGUgKGNkKTsKLQotICAvKiBCdWlsZCB0aGUgaWZpZWxkIHRhYmxlLiAgKi8KLSAgYnVpbGRfaWZpZWxkX3RhYmxlIChjZCk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmRzIGFyZSB1c2VkIGJ5IE1BQ0gvSVNBLiAgKi8KLSAgYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0gIGJ1aWxkX2luc25fdGFibGUgKGNkKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIGNwdSB0YWJsZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRvci4KLSAgIEl0J3MgbXVjaCBsaWtlIG9wZW5pbmcgYSBmaWxlLCBhbmQgbXVzdCBiZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkLgotICAgVGhlIGFyZ3VtZW50cyBhcmUgYSBzZXQgb2YgKHR5cGUvdmFsdWUpIHBhaXJzLCB0ZXJtaW5hdGVkIHdpdGgKLSAgIENHRU5fQ1BVX09QRU5fRU5ELgotCi0gICBDdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlczoKLSAgIENHRU5fQ1BVX09QRU5fSVNBUzogICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIGlzYV9hdHRyCi0gICBDR0VOX0NQVV9PUEVOX01BQ0hTOiAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBtYWNoX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fQkZETUFDSDogc3BlY2lmeSAxIG1hY2ggdXNpbmcgYmZkIG5hbWUKLSAgIENHRU5fQ1BVX09QRU5fRU5ESUFOOiAgc3BlY2lmeSBlbmRpYW4gY2hvaWNlCi0gICBDR0VOX0NQVV9PUEVOX0VORDogICAgIHRlcm1pbmF0ZXMgYXJndW1lbnRzCi0KLSAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICBwcmVjbHVkZWQuCi0KLSAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgotICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQotICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLWZyMzBfY2dlbl9jcHVfb3BlbiAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyBhcmdfdHlwZSwgLi4uKQotewotICBDR0VOX0NQVV9UQUJMRSAqY2QgPSAoQ0dFTl9DUFVfVEFCTEUgKikgeG1hbGxvYyAoc2l6ZW9mIChDR0VOX0NQVV9UQUJMRSkpOwotICBzdGF0aWMgaW50IGluaXRfcDsKLSAgdW5zaWduZWQgaW50IGlzYXMgPSAwOyAgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgdW5zaWduZWQgaW50IG1hY2hzID0gMDsgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW4gPSBDR0VOX0VORElBTl9VTktOT1dOOwotICB2YV9saXN0IGFwOwotCi0gIGlmICghIGluaXRfcCkKLSAgICB7Ci0gICAgICBpbml0X3RhYmxlcyAoKTsKLSAgICAgIGluaXRfcCA9IDE7Ci0gICAgfQotCi0gIG1lbXNldCAoY2QsIDAsIHNpemVvZiAoKmNkKSk7Ci0KLSAgdmFfc3RhcnQgKGFwLCBhcmdfdHlwZSk7Ci0gIHdoaWxlIChhcmdfdHlwZSAhPSBDR0VOX0NQVV9PUEVOX0VORCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ190eXBlKQotCXsKLQljYXNlIENHRU5fQ1BVX09QRU5fSVNBUyA6Ci0JICBpc2FzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9NQUNIUyA6Ci0JICBtYWNocyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7Ci0JICBicmVhazsKLQljYXNlIENHRU5fQ1BVX09QRU5fQkZETUFDSCA6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcgKGFwLCBjb25zdCBjaGFyICopOwotCSAgICBjb25zdCBDR0VOX01BQ0ggKm1hY2ggPQotCSAgICAgIGxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAoZnIzMF9jZ2VuX21hY2hfdGFibGUsIG5hbWUpOwotCi0JICAgIG1hY2hzIHw9IG1hY2gtPm51bSA8PCAxOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIENHRU5fQ1BVX09QRU5fRU5ESUFOIDoKLQkgIGVuZGlhbiA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9lbmRpYW4pOwotCSAgYnJlYWs7Ci0JZGVmYXVsdCA6Ci0JICBmcHJpbnRmIChzdGRlcnIsICJmcjMwX2NnZW5fY3B1X29wZW46IHVuc3VwcG9ydGVkIGFyZ3VtZW50IGAlZCdcbiIsCi0JCSAgIGFyZ190eXBlKTsKLQkgIGFib3J0ICgpOyAvKiA/Pz8gcmV0dXJuIE5VTEw/ICovCi0JfQotICAgICAgYXJnX3R5cGUgPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fY3B1X29wZW5fYXJnKTsKLSAgICB9Ci0gIHZhX2VuZCAoYXApOwotCi0gIC8qIG1hY2ggdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKG1hY2hzID09IDApCi0gICAgbWFjaHMgPSAoMSA8PCBNQVhfTUFDSFMpIC0gMTsKLSAgLyogYmFzZSBtYWNoIGlzIGFsd2F5cyBzZWxlY3RlZCAqLwotICBtYWNocyB8PSAxOwotICAvKiBpc2EgdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KLSAgaWYgKGlzYXMgPT0gMCkKLSAgICBpc2FzID0gKDEgPDwgTUFYX0lTQVMpIC0gMTsKLSAgaWYgKGVuZGlhbiA9PSBDR0VOX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIC8qID8/PyBJZiB0YXJnZXQgaGFzIG9ubHkgb25lLCBjb3VsZCBoYXZlIGEgZGVmYXVsdC4gICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJmcjMwX2NnZW5fY3B1X29wZW46IG5vIGVuZGlhbm5lc3Mgc3BlY2lmaWVkXG4iKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBjZC0+aXNhcyA9IGlzYXM7Ci0gIGNkLT5tYWNocyA9IG1hY2hzOwotICBjZC0+ZW5kaWFuID0gZW5kaWFuOwotICAvKiBGSVhNRTogZm9yIHRoZSBzcGFyYyBjYXNlIHdlIGNhbiBkZXRlcm1pbmUgaW5zbi1lbmRpYW5uZXNzIHN0YXRpY2FsbHkuCi0gICAgIFRoZSB3b3JyeSBoZXJlIGlzIHdoZXJlIGJvdGggZGF0YSBhbmQgaW5zbiBlbmRpYW4gY2FuIGJlIGluZGVwZW5kZW50bHkKLSAgICAgY2hvc2VuLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIGFub3RoZXIgYXJndW1lbnQuCi0gICAgIEFjdHVhbGx5LCB3aWxsIHdhbnQgdG8gYWxsb3cgZm9yIG1vcmUgYXJndW1lbnRzIGluIHRoZSBmdXR1cmUgYW55d2F5LiAgKi8KLSAgY2QtPmluc25fZW5kaWFuID0gZW5kaWFuOwotCi0gIC8qIFRhYmxlIChyZSlidWlsZGVyLiAgKi8KLSAgY2QtPnJlYnVpbGRfdGFibGVzID0gZnIzMF9jZ2VuX3JlYnVpbGRfdGFibGVzOwotICBmcjMwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKTsKLQotICByZXR1cm4gKENHRU5fQ1BVX0RFU0MpIGNkOwotfQotCi0vKiBDb3ZlciBmbiB0byBmcjMwX2NnZW5fY3B1X29wZW4gdG8gaGFuZGxlIHRoZSBzaW1wbGUgY2FzZSBvZiAxIGlzYSwgMSBtYWNoLgotICAgTUFDSF9OQU1FIGlzIHRoZSBiZmQgbmFtZSBvZiB0aGUgbWFjaC4gICovCi0KLUNHRU5fQ1BVX0RFU0MKLWZyMzBfY2dlbl9jcHVfb3Blbl8xIChtYWNoX25hbWUsIGVuZGlhbikKLSAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotICAgICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbjsKLXsKLSAgcmV0dXJuIGZyMzBfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9CRkRNQUNILCBtYWNoX25hbWUsCi0JCQkgICAgICAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIGVuZGlhbiwKLQkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORCk7Ci19Ci0KLS8qIENsb3NlIGEgY3B1IHRhYmxlLgotICAgPz8/IFRoaXMgY2FuIGxpdmUgaW4gYSBtYWNoaW5lIGluZGVwZW5kZW50IGZpbGUsIGJ1dCB0aGVyZSdzIGN1cnJlbnRseQotICAgbm8gcGxhY2UgdG8gcHV0IHRoaXMgZmlsZSAodGhlcmUncyBubyBsaWJjZ2VuKS4gIGxpYm9wY29kZXMgaXMgdGhlIHdyb25nCi0gICBwbGFjZSBhcyBzb21lIHNpbXVsYXRvciBwb3J0cyB1c2UgdGhpcyBidXQgdGhleSBkb24ndCB1c2UgbGlib3Bjb2Rlcy4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9jcHVfY2xvc2UgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpZiAoY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKTsKLSAgaWYgKGNkLT5od190YWJsZS5lbnRyaWVzKQotICAgIGZyZWUgKChDR0VOX0hXX0VOVFJZICopIGNkLT5od190YWJsZS5lbnRyaWVzKTsKLSAgZnJlZSAoY2QpOwotfQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGVzYy5oIGIvb3Bjb2Rlcy9mcjMwLWRlc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlMjljZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtZGVzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIENQVSBkYXRhIGhlYWRlciBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBGUjMwX0NQVV9ICi0jZGVmaW5lIEZSMzBfQ1BVX0gKLQotI2RlZmluZSBDR0VOX0FSQ0ggZnIzMAotCi0vKiBHaXZlbiBzeW1ib2wgUywgcmV0dXJuIGZyMzBfY2dlbl88Uz4uICAqLwotI2RlZmluZSBDR0VOX1NZTShzKSBDT05DQVQzIChmcjMwLF9jZ2VuXyxzKQotCi0vKiBTZWxlY3RlZCBjcHUgZmFtaWxpZXMuICAqLwotI2RlZmluZSBIQVZFX0NQVV9GUjMwQkYKLQotI2RlZmluZSBDR0VOX0lOU05fTFNCMF9QIDAKLQotLyogTWluaW11bSBzaXplIG9mIGFueSBpbnNuIChpbiBieXRlcykuICAqLwotI2RlZmluZSBDR0VOX01JTl9JTlNOX1NJWkUgMgotCi0vKiBNYXhpbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fU0laRSA2Ci0KLSNkZWZpbmUgQ0dFTl9JTlRfSU5TTl9QIDAKLQotLyogRklYTUU6IE5lZWQgdG8gY29tcHV0ZSBDR0VOX01BWF9TWU5UQVhfQllURVMuICAqLwotCi0vKiBDR0VOX01ORU1PTklDX09QRVJBTkRTIGlzIGRlZmluZWQgaWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMuCi0gICBlLmcuIEluICJiLGEgZm9vIiB0aGUgIixhIiBpcyBhbiBvcGVyYW5kLiAgSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMKLSAgIHdlIGNhbid0IGhhc2ggb24gZXZlcnl0aGluZyB1cCB0byB0aGUgc3BhY2UuICAqLwotI2RlZmluZSBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIGFueSBpbnNuIG9yIG1hY3JvLWluc24gaGFzLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9PUEVSQU5EUyAxNgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBmaWVsZHMgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBDR0VOX01BWF9JRk1UX09QRVJBTkRTIDcKLQotLyogRW51bXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wMSBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDEgewotICBPUDFfMCwgT1AxXzEsIE9QMV8yLCBPUDFfMwotICwgT1AxXzQsIE9QMV81LCBPUDFfNiwgT1AxXzcKLSAsIE9QMV84LCBPUDFfOSwgT1AxX0EsIE9QMV9CCi0gLCBPUDFfQywgT1AxX0QsIE9QMV9FLCBPUDFfRgotfSBJTlNOX09QMTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDIgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AyIHsKLSAgT1AyXzAsIE9QMl8xLCBPUDJfMiwgT1AyXzMKLSAsIE9QMl80LCBPUDJfNSwgT1AyXzYsIE9QMl83Ci0gLCBPUDJfOCwgT1AyXzksIE9QMl9BLCBPUDJfQgotICwgT1AyX0MsIE9QMl9ELCBPUDJfRSwgT1AyX0YKLX0gSU5TTl9PUDI7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3AzIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMyB7Ci0gIE9QM18wLCBPUDNfMSwgT1AzXzIsIE9QM18zCi0gLCBPUDNfNCwgT1AzXzUsIE9QM182LCBPUDNfNwotICwgT1AzXzgsIE9QM185LCBPUDNfQSwgT1AzX0IKLSAsIE9QM19DLCBPUDNfRCwgT1AzX0UsIE9QM19GCi19IElOU05fT1AzOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wNCBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDQgewotICBPUDRfMAotfSBJTlNOX09QNDsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDUgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3A1IHsKLSAgT1A1XzAsIE9QNV8xCi19IElOU05fT1A1OwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIGNjIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX2NjIHsKLSAgQ0NfUkEsIENDX05PLCBDQ19FUSwgQ0NfTkUKLSAsIENDX0MsIENDX05DLCBDQ19OLCBDQ19QCi0gLCBDQ19WLCBDQ19OViwgQ0NfTFQsIENDX0dFCi0gLCBDQ19MRSwgQ0NfR1QsIENDX0xTLCBDQ19ISQotfSBJTlNOX0NDOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGdyX25hbWVzIHsKLSAgSF9HUl9SMCA9IDAsIEhfR1JfUjEgPSAxLCBIX0dSX1IyID0gMiwgSF9HUl9SMyA9IDMKLSAsIEhfR1JfUjQgPSA0LCBIX0dSX1I1ID0gNSwgSF9HUl9SNiA9IDYsIEhfR1JfUjcgPSA3Ci0gLCBIX0dSX1I4ID0gOCwgSF9HUl9SOSA9IDksIEhfR1JfUjEwID0gMTAsIEhfR1JfUjExID0gMTEKLSAsIEhfR1JfUjEyID0gMTIsIEhfR1JfUjEzID0gMTMsIEhfR1JfUjE0ID0gMTQsIEhfR1JfUjE1ID0gMTUKLSAsIEhfR1JfQUMgPSAxMywgSF9HUl9GUCA9IDE0LCBIX0dSX1NQID0gMTUKLX0gR1JfTkFNRVM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gY3JfbmFtZXMgewotICBIX0NSX0NSMCwgSF9DUl9DUjEsIEhfQ1JfQ1IyLCBIX0NSX0NSMwotICwgSF9DUl9DUjQsIEhfQ1JfQ1I1LCBIX0NSX0NSNiwgSF9DUl9DUjcKLSAsIEhfQ1JfQ1I4LCBIX0NSX0NSOSwgSF9DUl9DUjEwLCBIX0NSX0NSMTEKLSAsIEhfQ1JfQ1IxMiwgSF9DUl9DUjEzLCBIX0NSX0NSMTQsIEhfQ1JfQ1IxNQotfSBDUl9OQU1FUzsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBkcl9uYW1lcyB7Ci0gIEhfRFJfVEJSLCBIX0RSX1JQLCBIX0RSX1NTUCwgSF9EUl9VU1AKLSAsIEhfRFJfTURILCBIX0RSX01ETAotfSBEUl9OQU1FUzsKLQotLyogQXR0cmlidXRlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1hY2hpbmUgdHlwZSBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIG1hY2hfYXR0ciB7Ci0gIE1BQ0hfQkFTRSwgTUFDSF9GUjMwLCBNQUNIX01BWAotfSBNQUNIX0FUVFI7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc3RydWN0aW9uIHNldCBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIGlzYV9hdHRyIHsKLSAgSVNBX0ZSMzAsIElTQV9NQVgKLX0gSVNBX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBhcmNoaXRlY3R1cmUgdmFyaWFudHMuICAqLwotI2RlZmluZSBNQVhfSVNBUyAgMQotI2RlZmluZSBNQVhfTUFDSFMgKChpbnQpIE1BQ0hfTUFYKQotCi0vKiBJZmllbGQgc3VwcG9ydC4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgY2dlbl9pZmxkIGZyMzBfY2dlbl9pZmxkX3RhYmxlW107Ci0KLS8qIElmaWVsZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faWZsZCBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pZmxkX2F0dHIgewotICBDR0VOX0lGTERfVklSVFVBTCwgQ0dFTl9JRkxEX1BDUkVMX0FERFIsIENHRU5fSUZMRF9BQlNfQUREUiwgQ0dFTl9JRkxEX1JFU0VSVkVECi0gLCBDR0VOX0lGTERfU0lHTl9PUFQsIENHRU5fSUZMRF9TSUdORUQsIENHRU5fSUZMRF9FTkRfQk9PTFMsIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgPSAzMQotICwgQ0dFTl9JRkxEX01BQ0gsIENHRU5fSUZMRF9FTkRfTkJPT0xTCi19IENHRU5fSUZMRF9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pZmxkX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lGTERfTkJPT0xfQVRUUlMgKENHRU5fSUZMRF9FTkRfTkJPT0xTIC0gQ0dFTl9JRkxEX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaWZpZWxkIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBpZmllbGRfdHlwZSB7Ci0gIEZSMzBfRl9OSUwsIEZSMzBfRl9PUDEsIEZSMzBfRl9PUDIsIEZSMzBfRl9PUDMKLSAsIEZSMzBfRl9PUDQsIEZSMzBfRl9PUDUsIEZSMzBfRl9DQywgRlIzMF9GX0NDQwotICwgRlIzMF9GX1JKLCBGUjMwX0ZfUkksIEZSMzBfRl9SUzEsIEZSMzBfRl9SUzIKLSAsIEZSMzBfRl9SSkMsIEZSMzBfRl9SSUMsIEZSMzBfRl9DUkosIEZSMzBfRl9DUkkKLSAsIEZSMzBfRl9VNCwgRlIzMF9GX1U0QywgRlIzMF9GX0k0LCBGUjMwX0ZfTTQKLSAsIEZSMzBfRl9VOCwgRlIzMF9GX0k4LCBGUjMwX0ZfSTIwXzQsIEZSMzBfRl9JMjBfMTYKLSAsIEZSMzBfRl9JMjAsIEZSMzBfRl9JMzIsIEZSMzBfRl9VRElTUDYsIEZSMzBfRl9ESVNQOAotICwgRlIzMF9GX0RJU1A5LCBGUjMwX0ZfRElTUDEwLCBGUjMwX0ZfUzEwLCBGUjMwX0ZfVTEwCi0gLCBGUjMwX0ZfUkVMOSwgRlIzMF9GX0RJUjgsIEZSMzBfRl9ESVI5LCBGUjMwX0ZfRElSMTAKLSAsIEZSMzBfRl9SRUwxMiwgRlIzMF9GX1JFR0xJU1RfSElfU1QsIEZSMzBfRl9SRUdMSVNUX0xPV19TVCwgRlIzMF9GX1JFR0xJU1RfSElfTEQKLSAsIEZSMzBfRl9SRUdMSVNUX0xPV19MRCwgRlIzMF9GX01BWAotfSBJRklFTERfVFlQRTsKLQotI2RlZmluZSBNQVhfSUZMRCAoKGludCkgRlIzMF9GX01BWCkKLQotLyogSGFyZHdhcmUgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2h3IGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X2F0dHIgewotICBDR0VOX0hXX1ZJUlRVQUwsIENHRU5fSFdfQ0FDSEVfQUREUiwgQ0dFTl9IV19QQywgQ0dFTl9IV19QUk9GSUxFCi0gLCBDR0VOX0hXX0VORF9CT09MUywgQ0dFTl9IV19TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9IV19NQUNILCBDR0VOX0hXX0VORF9OQk9PTFMKLX0gQ0dFTl9IV19BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9od19hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9IV19OQk9PTF9BVFRSUyAoQ0dFTl9IV19FTkRfTkJPT0xTIC0gQ0dFTl9IV19TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBmcjMwIGhhcmR3YXJlIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2h3X3R5cGUgewotICBIV19IX01FTU9SWSwgSFdfSF9TSU5ULCBIV19IX1VJTlQsIEhXX0hfQUREUgotICwgSFdfSF9JQUREUiwgSFdfSF9QQywgSFdfSF9HUiwgSFdfSF9DUgotICwgSFdfSF9EUiwgSFdfSF9QUywgSFdfSF9SMTMsIEhXX0hfUjE0Ci0gLCBIV19IX1IxNSwgSFdfSF9OQklULCBIV19IX1pCSVQsIEhXX0hfVkJJVAotICwgSFdfSF9DQklULCBIV19IX0lCSVQsIEhXX0hfU0JJVCwgSFdfSF9UQklUCi0gLCBIV19IX0QwQklULCBIV19IX0QxQklULCBIV19IX0NDUiwgSFdfSF9TQ1IKLSAsIEhXX0hfSUxNLCBIV19NQVgKLX0gQ0dFTl9IV19UWVBFOwotCi0jZGVmaW5lIE1BWF9IVyAoKGludCkgSFdfTUFYKQotCi0vKiBPcGVyYW5kIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9vcGVyYW5kIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfYXR0ciB7Ci0gIENHRU5fT1BFUkFORF9WSVJUVUFMLCBDR0VOX09QRVJBTkRfUENSRUxfQUREUiwgQ0dFTl9PUEVSQU5EX0FCU19BRERSLCBDR0VOX09QRVJBTkRfU0lHTl9PUFQKLSAsIENHRU5fT1BFUkFORF9TSUdORUQsIENHRU5fT1BFUkFORF9ORUdBVElWRSwgQ0dFTl9PUEVSQU5EX1JFTEFYLCBDR0VOX09QRVJBTkRfU0VNX09OTFkKLSAsIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCwgQ0dFTl9PUEVSQU5EX0VORF9CT09MUywgQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX09QRVJBTkRfTUFDSAotICwgQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMKLX0gQ0dFTl9PUEVSQU5EX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX29wZXJhbmRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAoQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMgLSBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBvcGVyYW5kIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB7Ci0gIEZSMzBfT1BFUkFORF9QQywgRlIzMF9PUEVSQU5EX1JJLCBGUjMwX09QRVJBTkRfUkosIEZSMzBfT1BFUkFORF9SSUMKLSAsIEZSMzBfT1BFUkFORF9SSkMsIEZSMzBfT1BFUkFORF9DUkksIEZSMzBfT1BFUkFORF9DUkosIEZSMzBfT1BFUkFORF9SUzEKLSAsIEZSMzBfT1BFUkFORF9SUzIsIEZSMzBfT1BFUkFORF9SMTMsIEZSMzBfT1BFUkFORF9SMTQsIEZSMzBfT1BFUkFORF9SMTUKLSAsIEZSMzBfT1BFUkFORF9QUywgRlIzMF9PUEVSQU5EX1U0LCBGUjMwX09QRVJBTkRfVTRDLCBGUjMwX09QRVJBTkRfVTgKLSAsIEZSMzBfT1BFUkFORF9JOCwgRlIzMF9PUEVSQU5EX1VESVNQNiwgRlIzMF9PUEVSQU5EX0RJU1A4LCBGUjMwX09QRVJBTkRfRElTUDkKLSAsIEZSMzBfT1BFUkFORF9ESVNQMTAsIEZSMzBfT1BFUkFORF9TMTAsIEZSMzBfT1BFUkFORF9VMTAsIEZSMzBfT1BFUkFORF9JMzIKLSAsIEZSMzBfT1BFUkFORF9NNCwgRlIzMF9PUEVSQU5EX0kyMCwgRlIzMF9PUEVSQU5EX0RJUjgsIEZSMzBfT1BFUkFORF9ESVI5Ci0gLCBGUjMwX09QRVJBTkRfRElSMTAsIEZSMzBfT1BFUkFORF9MQUJFTDksIEZSMzBfT1BFUkFORF9MQUJFTDEyLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQKLSAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xELCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NULCBGUjMwX09QRVJBTkRfQ0MKLSAsIEZSMzBfT1BFUkFORF9DQ0MsIEZSMzBfT1BFUkFORF9OQklULCBGUjMwX09QRVJBTkRfVkJJVCwgRlIzMF9PUEVSQU5EX1pCSVQKLSAsIEZSMzBfT1BFUkFORF9DQklULCBGUjMwX09QRVJBTkRfSUJJVCwgRlIzMF9PUEVSQU5EX1NCSVQsIEZSMzBfT1BFUkFORF9UQklUCi0gLCBGUjMwX09QRVJBTkRfRDBCSVQsIEZSMzBfT1BFUkFORF9EMUJJVCwgRlIzMF9PUEVSQU5EX0NDUiwgRlIzMF9PUEVSQU5EX1NDUgotICwgRlIzMF9PUEVSQU5EX0lMTSwgRlIzMF9PUEVSQU5EX01BWAotfSBDR0VOX09QRVJBTkRfVFlQRTsKLQotLyogTnVtYmVyIG9mIG9wZXJhbmRzIHR5cGVzLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRTICgoaW50KSBGUjMwX09QRVJBTkRfTUFYKQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyByZWZlcmVuY2VkIGJ5IGFueSBpbnNuLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRfSU5TVEFOQ0VTIDgKLQotLyogSW5zbiBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faW5zbiBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX2F0dHIgewotICBDR0VOX0lOU05fQUxJQVMsIENHRU5fSU5TTl9WSVJUVUFMLCBDR0VOX0lOU05fVU5DT05EX0NUSSwgQ0dFTl9JTlNOX0NPTkRfQ1RJCi0gLCBDR0VOX0lOU05fU0tJUF9DVEksIENHRU5fSU5TTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fUkVMQVhBQkxFLCBDR0VOX0lOU05fUkVMQVgKLSAsIENHRU5fSU5TTl9OT19ESVMsIENHRU5fSU5TTl9QQkIsIENHRU5fSU5TTl9OT1RfSU5fREVMQVlfU0xPVCwgQ0dFTl9JTlNOX0VORF9CT09MUwotICwgQ0dFTl9JTlNOX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0lOU05fTUFDSCwgQ0dFTl9JTlNOX0VORF9OQk9PTFMKLX0gQ0dFTl9JTlNOX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2luc25fYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAoQ0dFTl9JTlNOX0VORF9OQk9PTFMgLSBDR0VOX0lOU05fU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogY2dlbi5oIHVzZXMgdGhpbmdzIHdlIGp1c3QgZGVmaW5lZC4gICovCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotLyogQXR0cmlidXRlcy4gICovCi1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9oYXJkd2FyZV9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pbnNuX2F0dHJfdGFibGVbXTsKLQotLyogSGFyZHdhcmUgZGVjbHMuICAqLwotCi1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3BzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxNDsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjE1OwotCi0KLQotCi0jZW5kaWYgLyogRlIzMF9DUFVfSCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWRpcy5jIGIvb3Bjb2Rlcy9mcjMwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDI5MTViLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tZGlzLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogRGVmYXVsdCB0ZXh0IHRvIHByaW50IGlmIGFuIGluc3RydWN0aW9uIGlzbid0IHJlY29nbml6ZWQuICAqLwotI2RlZmluZSBVTktOT1dOX0lOU05fTVNHIF8oIip1bmtub3duKiIpCi0KLXN0YXRpYyB2b2lkIHByaW50X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9hZGRyZXNzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2tleXdvcmQKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBDR0VOX0tFWVdPUkQgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0ZJRUxEUyAqLAotCSAgICAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsCi0JCQkgICAgICAgZGlzYXNzZW1ibGVfaW5mbyAqLCBjaGFyICosIGludCkpOwotc3RhdGljIGludCBkZWZhdWx0X3ByaW50X2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0MCi0vKiAtLSBkaXNhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLwotCi0vKiAtLSBkaXMuYyAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCBvZmZzZXQsIGxvYWRfc3RvcmUpCi0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGludCBsb2FkX3N0b3JlOyAvKiAwID09IGxvYWQsIDEgPT0gc3RvcmUgKi8KLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IGRpc19pbmZvOwotICBpbnQgbWFzazsKLSAgaW50IGluZGV4ID0gMDsKLSAgY2hhciogY29tbWEgPSAiIjsKLQotICBpZiAobG9hZF9zdG9yZSkKLSAgICBtYXNrID0gMHg4MDsKLSAgZWxzZQotICAgIG1hc2sgPSAxOwotCi0gIGlmICh2YWx1ZSAmIG1hc2spCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWkiLCBpbmRleCArIG9mZnNldCk7Ci0gICAgICBjb21tYSA9ICIsIjsKLSAgICB9Ci0gICAgCi0gIGZvciAoaW5kZXggPSAxOyBpbmRleCA8PSA3OyArK2luZGV4KQotICAgIHsKLSAgICAgIGlmIChsb2FkX3N0b3JlKQotCW1hc2sgPj49IDE7Ci0gICAgICBlbHNlCi0JbWFzayA8PD0gMTsKLQotICAgICAgaWYgKHZhbHVlICYgbWFzaykKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzciVpIiwgY29tbWEsIGluZGV4ICsgb2Zmc2V0KTsKLQkgIGNvbW1hID0gIiwiOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgOCwgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgMCwgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCA4LCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgMCwgMS8qc3RvcmUqLyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9tNCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotfQotLyogLS0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3IgcHJpbnRpbmcgb3BlcmFuZHMuCi0gICBYSU5GTyBpcyBhIGB2b2lkIConIGFuZCBub3QgYSBgZGlzYXNzZW1ibGVfaW5mbyAqJyB0byBub3QgcHV0IGEgcmVxdWlyZW1lbnQKLSAgIG9mIGRpcy1hc20uaCBvbiBjZ2VuLmguCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLXZvaWQKLWZyMzBfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgeGluZm8sIGZpZWxkcywgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBQVFIgeGluZm87Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIHZvaWQgY29uc3QgKmF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSB4aW5mbzsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9DUmksIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX0NSaiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2hfcjEzLCAwLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTQsIDAsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgMCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SaSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfUmljLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JqLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SamMsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgZmllbGRzLT5mX1JzMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCBmaWVsZHMtPmZfUnMyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9jYywgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2NjYywgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlyMTAsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlyOCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXI5LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDEwLCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDgsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOSwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pMjAsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCl8KDE8PENHRU5fT1BFUkFORF9WSVJUVUFMKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2kzMiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKXwoMTw8Q0dFTl9PUEVSQU5EX1NJR05fT1BUKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaTgsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX3JlbDEyLCAwfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVsOSwgMHwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHByaW50X200IChjZCwgaW5mbywgZmllbGRzLT5mX200LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgMCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIHByaW50X2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIHByaW50X2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBwcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBwcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3MxMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91MTAsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3U0LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdTRjLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91OCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VkaXNwNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHByaW50aW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotY2dlbl9wcmludF9mbiAqIGNvbnN0IGZyMzBfY2dlbl9wcmludF9oYW5kbGVyc1tdID0gCi17Ci0gIHByaW50X2luc25fbm9ybWFsLAotfTsKLQotCi12b2lkCi1mcjMwX2NnZW5faW5pdF9kaXMgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBmcjMwX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cHJpbnRfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9wcmludF9oYW5kbGVyc1swXTsKLSAgY2QtPnByaW50X29wZXJhbmQgPSBmcjMwX2NnZW5fcHJpbnRfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBwcmludCBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X25vcm1hbCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0KLSNpZmRlZiBDR0VOX1BSSU5UX05PUk1BTAotICBDR0VOX1BSSU5UX05PUk1BTCAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgdmFsdWUpOwotfQotCi0vKiBEZWZhdWx0IGFkZHJlc3MgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyZXNzIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfQUREUkVTUwotICBDR0VOX1BSSU5UX0FERFJFU1MgKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGF0dHJpYnV0ZXMuICAqLwotICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0VNX09OTFkpKQotICAgIDsgLyogbm90aGluZyB0byBkbyAqLwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSkKLSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfQUJTX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TSUdORUQpKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgKGxvbmcpIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCAobG9uZykgdmFsdWUpOwotfQotCi0vKiBLZXl3b3JkIHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfa2V5d29yZCAoY2QsIGRpc19pbmZvLCBrZXl3b3JkX3RhYmxlLCB2YWx1ZSwgYXR0cnMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgQ0dFTl9LRVlXT1JEICprZXl3b3JkX3RhYmxlOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLQotICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGtleXdvcmRfdGFibGUsIHZhbHVlKTsKLSAgaWYgKGtlICE9IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGtlLT5uYW1lKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPz8/Iik7Ci19Ci0MCi0vKiBEZWZhdWx0IGluc24gcHJpbnRlci4KLQotICAgRElTX0lORk8gaXMgZGVmaW5lZCBhcyBgUFRSJyBzbyB0aGUgZGlzYXNzZW1ibGVyIG5lZWRuJ3Qga25vdyBhbnl0aGluZwotICAgYWJvdXQgZGlzYXNzZW1ibGVfaW5mby4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuX25vcm1hbCAoY2QsIGRpc19pbmZvLCBpbnNuLCBmaWVsZHMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fSU5JVF9QUklOVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsIENHRU5fU1lOVEFYX0NIQVIgKCpzeW4pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgKi8KLSAgICAgIGZyMzBfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLCBpbmZvLAotCQkJCSBmaWVsZHMsIENHRU5fSU5TTl9BVFRSUyAoaW5zbiksIHBjLCBsZW5ndGgpOwotICAgIH0KLX0KLQwKLS8qIFV0aWxpdHkgdG8gcHJpbnQgYW4gaW5zbi4KLSAgIEJVRiBpcyB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLCB0YXJnZXQgYnl0ZSBvcmRlciwgQlVGTEVOIGJ5dGVzIGxvbmcuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGJ1ZmxlbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgYnVmbGVuOwotewotICB1bnNpZ25lZCBsb25nIGluc25fdmFsdWU7Ci0gIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7Ci0gIENHRU5fRVhUUkFDVF9JTkZPIGV4X2luZm87Ci0KLSAgZXhfaW5mby5kaXNfaW5mbyA9IGluZm87Ci0gIGV4X2luZm8udmFsaWQgPSAoMSA8PCAoY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCkpIC0gMTsKLSAgZXhfaW5mby5pbnNuX2J5dGVzID0gYnVmOwotCi0gIHN3aXRjaCAoYnVmbGVuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpbnNuX3ZhbHVlID0gYnVmWzBdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMTYgKGJ1ZikgOiBiZmRfZ2V0bDE2IChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMzIgKGJ1ZikgOiBiZmRfZ2V0bDMyIChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaCBsaXN0cy4KLSAgICAgUGljayB0aGUgZmlyc3Qgb25lIGFuZCBrZWVwIHRyeWluZyB1bnRpbCB3ZSBmaW5kIHRoZSByaWdodCBvbmUuICAqLwotCi0gIGluc25fbGlzdCA9IENHRU5fRElTX0xPT0tVUF9JTlNOIChjZCwgYnVmLCBpbnNuX3ZhbHVlKTsKLSAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGluc25fbGlzdC0+aW5zbjsKLSAgICAgIENHRU5fRklFTERTIGZpZWxkczsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSNpZiAwIC8qIG5vdCBuZWVkZWQgYXMgaW5zbiBzaG91bGRuJ3QgYmUgaW4gaGFzaCBsaXN0cyBpZiBub3Qgc3VwcG9ydGVkICovCi0gICAgICAvKiBTdXBwb3J0ZWQgYnkgdGhpcyBjcHU/ICAqLwotICAgICAgaWYgKCEgZnIzMF9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KLSAgICAgIC8qID8/PyBNYXkgd2lzaCB0byBhbGxvdyB0YXJnZXQgdG8gZGVmZXIgdGhpcyBjaGVjayB1bnRpbCB0aGUgZXh0cmFjdAotCSBoYW5kbGVyLiAgKi8KLSAgICAgIGlmICgoaW5zbl92YWx1ZSAmIENHRU5fSU5TTl9CQVNFX01BU0sgKGluc24pKQotCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQotCXsKLQkgIC8qIFByaW50aW5nIGlzIGhhbmRsZWQgaW4gdHdvIHBhc3Nlcy4gIFRoZSBmaXJzdCBwYXNzIHBhcnNlcyB0aGUKLQkgICAgIG1hY2hpbmUgaW5zbiBhbmQgZXh0cmFjdHMgdGhlIGZpZWxkcy4gIFRoZSBzZWNvbmQgcGFzcyBwcmludHMKLQkgICAgIHRoZW0uICAqLwotCi0JICBsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQotCSAgICAoY2QsIGluc24sICZleF9pbmZvLCBpbnNuX3ZhbHVlLCAmZmllbGRzLCBwYyk7Ci0JICAvKiBsZW5ndGggPCAwIC0+IGVycm9yICovCi0JICBpZiAobGVuZ3RoIDwgMCkKLQkgICAgcmV0dXJuIGxlbmd0aDsKLQkgIGlmIChsZW5ndGggPiAwKQotCSAgICB7Ci0JICAgICAgQ0dFTl9QUklOVF9GTiAoY2QsIGluc24pIChjZCwgaW5mbywgaW5zbiwgJmZpZWxkcywgcGMsIGxlbmd0aCk7Ci0JICAgICAgLyogbGVuZ3RoIGlzIGluIGJpdHMsIHJlc3VsdCBpcyBpbiBieXRlcyAqLwotCSAgICAgIHJldHVybiBsZW5ndGggLyA4OwotCSAgICB9Ci0JfQotCi0gICAgICBpbnNuX2xpc3QgPSBDR0VOX0RJU19ORVhUX0lOU04gKGluc25fbGlzdCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBEZWZhdWx0IHZhbHVlIGZvciBDR0VOX1BSSU5UX0lOU04uCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJlZCBmZXRjaGluZyBieXRlcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9QUklOVF9JTlNOCi0jZGVmaW5lIENHRU5fUFJJTlRfSU5TTiBkZWZhdWx0X3ByaW50X2luc24KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X3ByaW50X2luc24gKGNkLCBwYywgaW5mbykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY2hhciBidWZbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBSZWFkIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24uICAqLwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgpOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoaW4gYnl0ZXMpLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2ZyMzAgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgQ0dFTl9DUFVfREVTQyBjZCA9IDA7Ci0gIHN0YXRpYyBwcmV2X2lzYSxwcmV2X21hY2gscHJldl9lbmRpYW47Ci0gIGludCBsZW5ndGg7Ci0gIGludCBpc2EsbWFjaDsKLSAgaW50IGVuZGlhbiA9IChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKLQkJPyBDR0VOX0VORElBTl9CSUcKLQkJOiBDR0VOX0VORElBTl9MSVRUTEUpOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiA/Pz8gZ2RiIHdpbGwgc2V0IG1hY2ggYnV0IGxlYXZlIHRoZSBhcmNoaXRlY3R1cmUgYXMgInVua25vd24iICovCi0jaWZuZGVmIENHRU5fQkZEX0FSQ0gKLSNkZWZpbmUgQ0dFTl9CRkRfQVJDSCBiZmRfYXJjaF9mcjMwCi0jZW5kaWYKLSAgYXJjaCA9IGluZm8tPmFyY2g7Ci0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYXJjaCA9IENHRU5fQkZEX0FSQ0g7Ci0gICAgICAKLSAgLyogVGhlcmUncyBubyBzdGFuZGFyZCB3YXkgdG8gY29tcHV0ZSB0aGUgaXNhIG51bWJlciAoZS5nLiBmb3IgYXJtIHRodW1iKQotICAgICBzbyB3ZSBsZWF2ZSBpdCB0byB0aGUgdGFyZ2V0LiAgKi8KLSNpZmRlZiBDR0VOX0NPTVBVVEVfSVNBCi0gIGlzYSA9IENHRU5fQ09NUFVURV9JU0EgKGluZm8pOwotI2Vsc2UKLSAgaXNhID0gMDsKLSNlbmRpZgotCi0gIG1hY2ggPSBpbmZvLT5tYWNoOwotCi0gIC8qIElmIHdlJ3ZlIHN3aXRjaGVkIGNwdSdzLCBjbG9zZSB0aGUgY3VycmVudCB0YWJsZSBhbmQgb3BlbiBhIG5ldyBvbmUuICAqLwotICBpZiAoY2QKLSAgICAgICYmIChpc2EgIT0gcHJldl9pc2EKLQkgIHx8IG1hY2ggIT0gcHJldl9tYWNoCi0JICB8fCBlbmRpYW4gIT0gcHJldl9lbmRpYW4pKQotICAgIHsKLSAgICAgIGZyMzBfY2dlbl9jcHVfY2xvc2UgKGNkKTsKLSAgICAgIGNkID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB5ZXQsIGluaXRpYWxpemUgdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIGlmICghIGNkKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaF90eXBlID0gYmZkX2xvb2t1cF9hcmNoIChhcmNoLCBtYWNoKTsKLSAgICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKLQotICAgICAgaWYgKCFhcmNoX3R5cGUpCi0JYWJvcnQgKCk7Ci0gICAgICBtYWNoX25hbWUgPSBhcmNoX3R5cGUtPnByaW50YWJsZV9uYW1lOwotCi0gICAgICBwcmV2X2lzYSA9IGlzYTsKLSAgICAgIHByZXZfbWFjaCA9IG1hY2g7Ci0gICAgICBwcmV2X2VuZGlhbiA9IGVuZGlhbjsKLSAgICAgIGNkID0gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0lTQVMsIHByZXZfaXNhLAotCQkJCSBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIHByZXZfZW5kaWFuLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gICAgICBpZiAoIWNkKQotCWFib3J0ICgpOwotICAgICAgZnIzMF9jZ2VuX2luaXRfZGlzIChjZCk7Ci0gICAgfQotCi0gIC8qIFdlIHRyeSB0byBoYXZlIGFzIG11Y2ggY29tbW9uIGNvZGUgYXMgcG9zc2libGUuCi0gICAgIEJ1dCBhdCB0aGlzIHBvaW50IHNvbWUgdGFyZ2V0cyBuZWVkIHRvIHRha2Ugb3Zlci4gICovCi0gIC8qID8/PyBTb21lIHRhcmdldHMgbWF5IG5lZWQgYSBob29rIGVsc2V3aGVyZS4gIFRyeSB0byBhdm9pZCB0aGlzLAotICAgICBidXQgaWYgbm90IHBvc3NpYmxlIHRyeSB0byBtb3ZlIHRoaXMgaG9vayBlbHNld2hlcmUgcmF0aGVyIHRoYW4KLSAgICAgaGF2ZSB0d28gaG9va3MuICAqLwotICBsZW5ndGggPSBDR0VOX1BSSU5UX0lOU04gKGNkLCBwYywgaW5mbyk7Ci0gIGlmIChsZW5ndGggPiAwKQotICAgIHJldHVybiBsZW5ndGg7Ci0gIGlmIChsZW5ndGggPCAwKQotICAgIHJldHVybiAtMTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0gIHJldHVybiBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgLyA4OwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWlibGQuYyBiL29wY29kZXMvZnIzMC1pYmxkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTQ0NTguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWlibGQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OTMgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gYnVpbGRpbmcvZXh0cmFjdGlvbiBzdXBwb3J0IGZvciBmcjMwLiAtKi0gQyAtKi0KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWlibGQuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotLyogVXNlZCBieSB0aGUgaWZpZWxkIHJ0eCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEZMRChmKSAoZmllbGRzLT5mKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgbG9uZywgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBDR0VOX0lOU05fQllURVNfUFRSKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwKLQkgICAgICBDR0VOX0ZJRUxEUyAqLCBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyBpbnQgZXh0cmFjdF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGxvbmcgKikpOwotc3RhdGljIGludCBleHRyYWN0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLAotCSAgICAgIENHRU5fSU5TTl9JTlQsIENHRU5fRklFTERTICosIGJmZF92bWEpKTsKLQwKLS8qIE9wZXJhbmQgaW5zZXJ0aW9uLiAgKi8KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLS8qIFN1YnJvdXRpbmUgb2YgaW5zZXJ0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSB2b2lkCi1pbnNlcnRfMSAoY2QsIHZhbHVlLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgaW50IHN0YXJ0LGxlbmd0aCx3b3JkX2xlbmd0aDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmcDsKLXsKLSAgdW5zaWduZWQgbG9uZyB4LG1hc2s7Ci0gIGludCBzaGlmdDsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgeCA9ICpidWZwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIxNiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXggPSAoYnVmcFswXSA8PCAxNikgfCBiZmRfZ2V0YjE2IChidWZwICsgMSk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApIHwgKGJ1ZnBbMl0gPDwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIzMiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMzIgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0gIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gIGVsc2UKLSAgICBzaGlmdCA9ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICB4ID0gKHggJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgKmJ1ZnAgPSB4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQliZmRfcHV0YjE2ICh4LCBidWZwKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDE2ICh4LCBidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl7Ci0JICBidWZwWzBdID0geCA+PiAxNjsKLQkgIGJmZF9wdXRiMTYgKHgsIGJ1ZnAgKyAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dGwxNiAoeCwgYnVmcCk7Ci0JICBidWZwWzJdID0geCA+PiAxNjsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMzIgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGluc2VydGlvbiByb3V0aW5lLgotCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotLyogPz8/IFRoaXMgZHVwbGljYXRlcyBmdW5jdGlvbmFsaXR5IHdpdGggYmZkJ3MgaG93dG8gdGFibGUgYW5kCi0gICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwKLQkgICAgICAgdG90YWxfbGVuZ3RoLCBidWZmZXIpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLXsKLSAgc3RhdGljIGNoYXIgZXJyYnVmWzEwMF07Ci0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgLyogSWYgTEVOR1RIIGlzIHplcm8sIHRoaXMgb3BlcmFuZCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHZhbHVlLiAgKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChDR0VOX0lOVF9JTlNOX1AKLSAgICAgICYmIHdvcmRfb2Zmc2V0ICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbnNucyBzbWFsbGVyIHRoYW4gdGhlIGJhc2UtaW5zbi1iaXRzaXplLAotICAgICB3b3JkX2xlbmd0aCBtYXkgYmUgdG9vIGJpZy4gICovCi0gIGlmIChjZC0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yZF9vZmZzZXQgPT0gMAotCSAgJiYgd29yZF9sZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0Jd29yZF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0gICAgfQotCi0gIC8qIEVuc3VyZSBWQUxVRSB3aWxsIGZpdC4gICovCi0gIGlmICghIENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9JRkxEX1NJR05FRCkpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBtYXh2YWwgPSBtYXNrOwotICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgc3ByaW50ZiAoZXJyYnVmLAotCQkgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuIDAgYW5kICVsdSkiKSwKLQkJICAgdmFsdWUsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIG1pbnZhbCA9IC0gKDFMIDw8IChsZW5ndGggLSAxKSk7Ci0gICAgICBsb25nIG1heHZhbCA9ICgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMTsKLSAgICAgIGlmICh2YWx1ZSA8IG1pbnZhbCB8fCB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICBzcHJpbnRmCi0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIChlcnJidWYsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIiksCi0JICAgICB2YWx1ZSwgbWludmFsLCBtYXh2YWwpOwotCSAgcmV0dXJuIGVycmJ1ZjsKLQl9Ci0gICAgfQotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgewotICAgIGludCBzaGlmdDsKLQotICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgICBlbHNlCi0gICAgICBzaGlmdCA9IHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKTsKLSAgICAqYnVmZmVyID0gKCpidWZmZXIgJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0gIH0KLQotI2Vsc2UgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmcCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlciArIHdvcmRfb2Zmc2V0IC8gODsKLQotICAgIGluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKTsKLSAgfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGJ1aWxkZXIgKGluc2VydCBoYW5kbGVyKS4KLSAgIFRoZSBpbnN0cnVjdGlvbiBpcyByZWNvcmRlZCBpbiBDR0VOX0lOVF9JTlNOX1AgYnl0ZSBvcmRlcgotICAgKG1lYW5pbmcgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgQlVGRkVSIGlzIGFuIGludCAqIGFuZCB0aHVzIHRoZSB2YWx1ZSBpcwotICAgcmVjb3JkZWQgaW4gaG9zdCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGRkVSIGlzIGFuIGFycmF5IG9mIGJ5dGVzIGFuZCB0aGUKLSAgIHZhbHVlIGlzIHJlY29yZGVkIGluIHRhcmdldCBieXRlIG9yZGVyKS4KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbnNlcnRfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqIGluc247Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotCi0gIENHRU5fSU5JVF9JTlNFUlQgKGNkKTsKLSAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbik7Ci0KLSAgLyogSWYgd2UncmUgcmVjb3JkaW5nIGluc25zIGFzIG51bWJlcnMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9mIGJ5dGVzKSwKLSAgICAgdGFyZ2V0IGJ5dGUgb3JkZXIgaGFuZGxpbmcgaXMgZGVmZXJyZWQgdW50aWwgbGF0ZXIuICAqLwotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgKmJ1ZmZlciA9IHZhbHVlOwotCi0jZWxzZQotCi0gIGNnZW5fcHV0X2luc25fdmFsdWUgKGNkLCBidWZmZXIsIG1pbiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplLAotCQkJCQlDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpKSwKLQkJICAgICAgIHZhbHVlKTsKLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgLyogPz8/IEl0IHdvdWxkIGJlIGJldHRlciB0byBzY2FuIHRoZSBmb3JtYXQncyBmaWVsZHMuCi0gICAgIFN0aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBpbnNlcnQgYSB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCB0aG91Z2g7Ci0gICAgIGUuZy4gc3RvcmluZyBhIGJyYW5jaCBkaXNwbGFjZW1lbnQgdGhhdCBnb3QgcmVzb2x2ZWQgbGF0ZXIuCi0gICAgIE5lZWRzIG1vcmUgdGhvdWdodCBmaXJzdC4gICovCi0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICogc3luICE9ICdcMCc7ICsrIHN5bikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQljb250aW51ZTsKLQotICAgICAgZXJybXNnID0gKCogY2QtPmluc2VydF9vcGVyYW5kKSAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkgICAgICAgZmllbGRzLCBidWZmZXIsIHBjKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0vKiBPcGVyYW5kIGV4dHJhY3Rpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4KLSAgIEVuc3VyZSBzdWZmaWNpZW50IGJ5dGVzIGFyZSBjYWNoZWQgaW4gRVhfSU5GTy4KLSAgIE9GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIEJZVEVTIGlzIHRoZSBsZW5ndGggb2YgdGhlIG5lZWRlZCB2YWx1ZS4KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBpbnQKLWZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCBvZmZzZXQsIGJ5dGVzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBvZmZzZXQsIGJ5dGVzOwotICAgICBiZmRfdm1hIHBjOwotewotICAvKiBJdCdzIGRvdWJ0ZnVsIHRoYXQgdGhlIG1pZGRsZSBwYXJ0IGhhcyBhbHJlYWR5IGJlZW4gZmV0Y2hlZCBzbwotICAgICB3ZSBkb24ndCBvcHRpbWl6ZSB0aGF0IGNhc2UuICBraXNzLiAgKi8KLSAgaW50IG1hc2s7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBleF9pbmZvLT5kaXNfaW5mbzsKLQotICAvKiBGaXJzdCBkbyBhIHF1aWNrIGNoZWNrLiAgKi8KLSAgbWFzayA9ICgxIDw8IGJ5dGVzKSAtIDE7Ci0gIGlmICgoKGV4X2luZm8tPnZhbGlkID4+IG9mZnNldCkgJiBtYXNrKSA9PSBtYXNrKQotICAgIHJldHVybiAxOwotCi0gIC8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGJ5dGUgd2UgbmVlZCB0byByZWFkLiAgKi8KLSAgZm9yIChtYXNrID0gMSA8PCBvZmZzZXQ7IGJ5dGVzID4gMDsgLS1ieXRlcywgKytvZmZzZXQsIG1hc2sgPDw9IDEpCi0gICAgaWYgKCEgKG1hc2sgJiBleF9pbmZvLT52YWxpZCkpCi0gICAgICBicmVhazsKLQotICBpZiAoYnl0ZXMpCi0gICAgewotICAgICAgaW50IHN0YXR1czsKLQotICAgICAgcGMgKz0gb2Zmc2V0OwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCShwYywgZXhfaW5mby0+aW5zbl9ieXRlcyArIG9mZnNldCwgYnl0ZXMsIGluZm8pOwotCi0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBleF9pbmZvLT52YWxpZCB8PSAoKDEgPDwgYnl0ZXMpIC0gMSkgPDwgb2Zmc2V0OwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBsb25nCi1leHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotICAgICBiZmRfdm1hIHBjOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHJldHVybiAoeCA+PiBzaGlmdCkgJiBtYXNrOwotfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotLyogRGVmYXVsdCBleHRyYWN0aW9uIHJvdXRpbmUuCi0KLSAgIElOU05fVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgb2YgdGhlIGluc24gaW4gaG9zdCBvcmRlciwKLSAgIG9yIHNvbWV0aW1lcyBsZXNzIGZvciBjYXNlcyBsaWtlIHRoZSBtMzJyIHdoZXJlIHRoZSBiYXNlIGluc24gc2l6ZSBpcyAzMgotICAgYnV0IHNvbWUgaW5zbnMgYXJlIDE2IGJpdHMuCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4gIFdlIG9ubHkgbmVlZCBgU0lHTkVEJywKLSAgIGJ1dCBmb3IgZ2VuZXJhbGl0eSB3ZSB0YWtlIGEgYml0bWFzayBvZiBhbGwgb2YgdGhlbS4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLwotCi0vKiA/Pz8gVGhlIHJldHVybiBjb2RlIGlzbid0IHByb3Blcmx5IHVzZWQuICB3aXAuICAqLwotCi0vKiA/Pz8gVGhpcyBkb2Vzbid0IGhhbmRsZSBiZmRfdm1hJ3MuICBDcmVhdGUgYW5vdGhlciBmdW5jdGlvbiB3aGVuCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIGF0dHJzLCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwKLQkJd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aCwgcGMsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUKLSAgICAgc28gZ2l2ZSBpdCBhIHN0YW5kYXJkIHZhbHVlIG9mIHplcm8uICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgewotICAgICAgKnZhbHVlcCA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgaW5zbi1iYXNlLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRG9lcyB0aGUgdmFsdWUgcmVzaWRlIGluIElOU05fVkFMVUU/ICAqLwotCi0gIGlmICh3b3JkX29mZnNldCA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gICAgICBDR0VOX0lOU05fSU5UIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0gICAgICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKChzdGFydCArIDEpIC0gbGVuZ3RoKTsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gICAgICB2YWx1ZSAmPSBtYXNrOwotICAgICAgLyogc2lnbiBleHRlbmQ/ICovCi0gICAgICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgKDFMIDw8IChsZW5ndGggLSAxKSkpKQotCXZhbHVlIHw9IH5tYXNrOwotICAgIH0KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnAgPSBleF9pbmZvLT5pbnNuX2J5dGVzICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgICBpZiAod29yZF9sZW5ndGggPiAzMikKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKGZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCB3b3JkX29mZnNldCAvIDgsIHdvcmRfbGVuZ3RoIC8gOCwgcGMpID09IDApCi0JcmV0dXJuIDA7Ci0KLSAgICAgIHZhbHVlID0gZXh0cmFjdF8xIChjZCwgZXhfaW5mbywgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnAsIHBjKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gICp2YWx1ZXAgPSB2YWx1ZTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGV4dHJhY3Rvci4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cywgdHJhbnNsYXRlZCB0byBob3N0IG9yZGVyLgotICAgVGhlIGV4dHJhY3RlZCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBFWF9JTkZPIGlzIHVzZWQgdG8gaGFuZGxlIHJlYWRpbmcgdmFyaWFibGUgbGVuZ3RoIGluc25zLgotICAgUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cywgb3IgMCBpZiBubyBtYXRjaCwKLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycyBmZXRjaGluZyBkYXRhIChtZW1vcnlfZXJyb3JfZnVuYyB3aWxsIGhhdmUKLSAgIGJlZW4gY2FsbGVkKS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci0KLSAgQ0dFTl9JTklUX0VYVFJBQ1QgKGNkKTsKLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKnN5bjsgKytzeW4pCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JY29udGludWU7Ci0KLSAgICAgIGxlbmd0aCA9ICgqIGNkLT5leHRyYWN0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQlleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKTsKLSAgICAgIGlmIChsZW5ndGggPD0gMCkKLQlyZXR1cm4gbGVuZ3RoOwotICAgIH0KLQotICAvKiBXZSByZWNvZ25pemVkIGFuZCBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkIHRoaXMgaW5zbi4gICovCi0gIHJldHVybiBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci19Ci0MCi0vKiBtYWNoaW5lIGdlbmVyYXRlZCBjb2RlIGFkZGVkIGhlcmUgKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBpbnNlcnRpb24uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4gIEl0J3MgYWxzbyBuZWVkZWQgYnkgR0FTIHRvIGluc2VydCBvcGVyYW5kcyB0aGF0IGNvdWxkbid0IGJlCi0gICByZXNvbHZlZCBkdXJpbmcgcGFyc2luZy4KLSovCi0KLWNvbnN0IGNoYXIgKgotZnIzMF9jZ2VuX2luc2VydF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCBidWZmZXIsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9DUmksIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX0NSaiwgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JpLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JpYywgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SaiwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JqYywgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SczEsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SczIsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9jYywgMCwgMCwgNCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2NjYywgMCwgMTYsIDAsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlyMTA7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2RpcjgsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OwotICAgICAgICB2YWx1ZSA9ICgodW5zaWduZWQgaW50KSAodmFsdWUpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDEwOwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2Rpc3A4LCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwOTsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKHZhbHVlKSA+PiAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHsKLXsKLSAgRkxEIChmX2kyMF80KSA9ICgodW5zaWduZWQgaW50KSAoRkxEIChmX2kyMCkpID4+ICgxNikpOwotICBGTEQgKGZfaTIwXzE2KSA9ICgoRkxEIChmX2kyMCkpICYgKDY1NTM1KSk7Ci19Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTIwXzQsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICAgIGlmIChlcnJtc2cpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTIwXzE2LCAwLCAxNiwgMCwgMTYsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICAgIGlmIChlcnJtc2cpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pMzIsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDE2LCAwLCAzMiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTgsIDAsIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKCgocGMpICsgKDIpKSkpKSA+PiAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDUsIDExLCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAoKChwYykgKyAoMikpKSkpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9tNDsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSAmICgxNSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0LCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91NCwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U0YywgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U4LCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGV4dHJhY3Rpb24uCi0gICBUaGUgcmVzdWx0IGlzIDw9IDAgZm9yIGVycm9yLCA+MCBmb3Igc3VjY2Vzcy4KLSAgID8/PyBBY3R1YWwgdmFsdWVzIGFyZW4ndCB3ZWxsIGRlZmluZWQgcmlnaHQgbm93LgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1pbnQKLWZyMzBfY2dlbl9leHRyYWN0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEFzc3VtZSBzdWNjZXNzIChmb3IgdGhvc2Ugb3BlcmFuZHMgdGhhdCBhcmUgbm9wcykuICAqLwotICBpbnQgbGVuZ3RoID0gMTsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9DUmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9DUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JpYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9Saik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JqYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUnMxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUnMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAwLCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfY2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX2RpcjEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2RpcjgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgxKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXI5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2Rpc3A4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgxKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTIwXzQpOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAwLCAxNiwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2kyMF8xNik7Ci17Ci0gIEZMRCAoZl9pMjApID0gKCgoKEZMRCAoZl9pMjBfNCkpIDw8ICgxNikpKSB8IChGTEQgKGZfaTIwXzE2KSkpOwotfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMTYsIDAsIDMyLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2k4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDUsIDExLCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMSkpKSArICgoKHBjKSArICgyKSkpKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOwotICAgICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSB8ICgoKC0xKSA8PCAoNCkpKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX3MxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91NGMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDIpKTsKLSAgICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLWNnZW5faW5zZXJ0X2ZuICogY29uc3QgZnIzMF9jZ2VuX2luc2VydF9oYW5kbGVyc1tdID0gCi17Ci0gIGluc2VydF9pbnNuX25vcm1hbCwKLX07Ci0KLWNnZW5fZXh0cmFjdF9mbiAqIGNvbnN0IGZyMzBfY2dlbl9leHRyYWN0X2hhbmRsZXJzW10gPSAKLXsKLSAgZXh0cmFjdF9pbnNuX25vcm1hbCwKLX07Ci0KLS8qIEdldHRpbmcgdmFsdWVzIGZyb20gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSByZXR1cm4uCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIHJlc3VsdCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi1pbnQKLWZyMzBfY2dlbl9nZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgaW50IHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaWM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SamM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2RpcjEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2k4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NGM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWJmZF92bWEKLWZyMzBfY2dlbl9nZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfQ1JqOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmljOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmpjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SczI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9jYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9jY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXIxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kyMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVsMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVsOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX200OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTRjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWRpc3A2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBTdHVmZmluZyB2YWx1ZXMgaW4gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSBhY2NlcHQuCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIGFyZ3VtZW50IHR5cGUKLSAgIG5vdCBhcHByb3ByaWF0ZS4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9zZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgZmllbGRzLT5mX0NSaSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGZpZWxkcy0+Zl9DUmogPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGZpZWxkcy0+Zl9SaSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGZpZWxkcy0+Zl9SaWMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGZpZWxkcy0+Zl9SaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGZpZWxkcy0+Zl9SamMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBmaWVsZHMtPmZfUnMxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgZmllbGRzLT5mX1JzMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZmllbGRzLT5mX2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgZmllbGRzLT5mX2NjYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgZmllbGRzLT5mX2RpcjEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXI4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXI5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgZmllbGRzLT5mX2Rpc3AxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICBmaWVsZHMtPmZfaTIwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgZmllbGRzLT5mX2kzMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgZmllbGRzLT5mX2k4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWwxMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICBmaWVsZHMtPmZfbTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgZmllbGRzLT5mX3MxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIGZpZWxkcy0+Zl91MTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIGZpZWxkcy0+Zl91NCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGZpZWxkcy0+Zl91NGMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGZpZWxkcy0+Zl91OCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIGZpZWxkcy0+Zl91ZGlzcDYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi12b2lkCi1mcjMwX2NnZW5fc2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBmaWVsZHMtPmZfQ1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgZmllbGRzLT5mX0NSaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgZmllbGRzLT5mX1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZmllbGRzLT5mX1JpYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZmllbGRzLT5mX1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgZmllbGRzLT5mX1JqYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGZpZWxkcy0+Zl9SczEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBmaWVsZHMtPmZfUnMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBmaWVsZHMtPmZfY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBmaWVsZHMtPmZfY2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgZmllbGRzLT5mX2RpcjggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIGZpZWxkcy0+Zl9pMjAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBmaWVsZHMtPmZfaTMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBmaWVsZHMtPmZfaTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZmllbGRzLT5mX3U0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgZmllbGRzLT5mX3U0YyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgZmllbGRzLT5mX3U4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBpbnN0cnVjdGlvbiBidWlsZGVyIHRhYmxlcy4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBjZC0+aW5zZXJ0X2hhbmRsZXJzID0gJiBmcjMwX2NnZW5faW5zZXJ0X2hhbmRsZXJzWzBdOwotICBjZC0+ZXh0cmFjdF9oYW5kbGVycyA9ICYgZnIzMF9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbMF07Ci0KLSAgY2QtPmluc2VydF9vcGVyYW5kID0gZnIzMF9jZ2VuX2luc2VydF9vcGVyYW5kOwotICBjZC0+ZXh0cmFjdF9vcGVyYW5kID0gZnIzMF9jZ2VuX2V4dHJhY3Rfb3BlcmFuZDsKLQotICBjZC0+Z2V0X2ludF9vcGVyYW5kID0gZnIzMF9jZ2VuX2dldF9pbnRfb3BlcmFuZDsKLSAgY2QtPnNldF9pbnRfb3BlcmFuZCA9IGZyMzBfY2dlbl9zZXRfaW50X29wZXJhbmQ7Ci0gIGNkLT5nZXRfdm1hX29wZXJhbmQgPSBmcjMwX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kOwotICBjZC0+c2V0X3ZtYV9vcGVyYW5kID0gZnIzMF9jZ2VuX3NldF92bWFfb3BlcmFuZDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1vcGMuYyBiL29wY29kZXMvZnIzMC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhN2UwYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY4ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIG9wY29kZSB0YWJsZSBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLQotLyogVGhlIGhhc2ggZnVuY3Rpb25zIGFyZSByZWNvcmRlZCBoZXJlIHRvIGhlbHAga2VlcCBhc3NlbWJsZXIgY29kZSBvdXQgb2YKLSAgIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHZpY2UgdmVyc2EuICAqLwotCi1zdGF0aWMgaW50IGFzbV9oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBhc21faGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBkaXNfaGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGlzX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLQotLyogSW5zdHJ1Y3Rpb24gZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgRihmKSAmIGZyMzBfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKEZSMzBfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZW1wdHkgPSB7Ci0gIDAsIDAsIDB4MCwgeyAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JKKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZGkgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1U0KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZDIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX000KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2RpdjBzID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZGl2MyA9IHsKLSAgMTYsIDE2LCAweGZmZmYsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9PUDQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4ID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfSTgpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMjAgPSB7Ci0gIDE2LCAzMiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JMjApLCBGIChGX09QMiksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkzMiA9IHsKLSAgMTYsIDQ4LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0kzMiksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTQgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9ESVNQMTApLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTR1aCA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0RJU1A5KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE0dWIgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9ESVNQOCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNSA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVURJU1A2KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE1ZHIgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUlMyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbW92ZHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JTMSksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jYWxsID0gewotICAxNiwgMTYsIDB4ZjgwMCwgeyBGIChGX09QMSksIEYgKEZfT1A1KSwgRiAoRl9SRUwxMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2ludCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVTgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9icmFkID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfQ0MpLCBGIChGX1JFTDkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kbW92cjEzID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9ESVIxMCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2Rtb3ZyMTNoID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9ESVI5KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZG1vdnIxM2IgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX0RJUjgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jb3BvcCA9IHsKLSAgMTYsIDMyLCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0NDQyksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX0NSSiksIEYgKEZfVTRDKSwgRiAoRl9DUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jb3BsZCA9IHsKLSAgMTYsIDMyLCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0NDQyksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JKQyksIEYgKEZfVTRDKSwgRiAoRl9DUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jb3BzdCA9IHsKLSAgMTYsIDMyLCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX0NDQyksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX0NSSiksIEYgKEZfVTRDKSwgRiAoRl9SSUMpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGRzcCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUzEwKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRtMCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9MT1dfTEQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZG0xID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0hJX0xEKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RtMCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9MT1dfU1QpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdG0xID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0hJX1NUKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZW50ZXIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1UxMCksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChGUjMwX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgZnIzMF9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgeyAwIH0gfSwKLS8qIGFkZCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhNjAwIH0KLSAgfSwKLS8qIGFkZCAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YTQwMCB9Ci0gIH0sCi0vKiBhZGQyICRtNCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChNNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDIsIHsgMHhhNTAwIH0KLSAgfSwKLS8qIGFkZGMgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTcwMCB9Ci0gIH0sCi0vKiBhZGRuICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGEyMDAgfQotICB9LAotLyogYWRkbiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YTAwMCB9Ci0gIH0sCi0vKiBhZGRuMiAkbTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQyLCB7IDB4YTEwMCB9Ci0gIH0sCi0vKiBzdWIgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWMwMCB9Ci0gIH0sCi0vKiBzdWJjICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFkMDAgfQotICB9LAotLyogc3VibiAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhZTAwIH0KLSAgfSwKLS8qIGNtcCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhYTAwIH0KLSAgfSwKLS8qIGNtcCAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YTgwMCB9Ci0gIH0sCi0vKiBjbXAyICRtNCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChNNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDIsIHsgMHhhOTAwIH0KLSAgfSwKLS8qIGFuZCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4MjAwIH0KLSAgfSwKLS8qIG9yICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDkyMDAgfQotICB9LAotLyogZW9yICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDlhMDAgfQotICB9LAotLyogYW5kICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDg0MDAgfQotICB9LAotLyogYW5kaCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4NTAwIH0KLSAgfSwKLS8qIGFuZGIgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODYwMCB9Ci0gIH0sCi0vKiBvciAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5NDAwIH0KLSAgfSwKLS8qIG9yaCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5NTAwIH0KLSAgfSwKLS8qIG9yYiAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5NjAwIH0KLSAgfSwKLS8qIGVvciAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5YzAwIH0KLSAgfSwKLS8qIGVvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWQwMCB9Ci0gIH0sCi0vKiBlb3JiICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDllMDAgfQotICB9LAotLyogYmFuZGwgJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDgwMDAgfQotICB9LAotLyogYm9ybCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4OTAwMCB9Ci0gIH0sCi0vKiBiZW9ybCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4OTgwMCB9Ci0gIH0sCi0vKiBiYW5kaCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4ODEwMCB9Ci0gIH0sCi0vKiBib3JoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5MTAwIH0KLSAgfSwKLS8qIGJlb3JoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5OTAwIH0KLSAgfSwKLS8qIGJ0c3RsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4ODAwIH0KLSAgfSwKLS8qIGJ0c3RoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4OTAwIH0KLSAgfSwKLS8qIG11bCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhZjAwIH0KLSAgfSwKLS8qIG11bHUgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWIwMCB9Ci0gIH0sCi0vKiBtdWxoICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGJmMDAgfQotICB9LAotLyogbXVsdWggJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YmIwMCB9Ci0gIH0sCi0vKiBkaXYwcyAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NDAgfQotICB9LAotLyogZGl2MHUgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzUwIH0KLSAgfSwKLS8qIGRpdjEgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzYwIH0KLSAgfSwKLS8qIGRpdjIgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzcwIH0KLSAgfSwKLS8qIGRpdjMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmNjAgfQotICB9LAotLyogZGl2NHMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmNzAgfQotICB9LAotLyogbHNsICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGI2MDAgfQotICB9LAotLyogbHNsICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiNDAwIH0KLSAgfSwKLS8qIGxzbDIgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI1MDAgfQotICB9LAotLyogbHNyICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGIyMDAgfQotICB9LAotLyogbHNyICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiMDAwIH0KLSAgfSwKLS8qIGxzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGIxMDAgfQotICB9LAotLyogYXNyICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGJhMDAgfQotICB9LAotLyogYXNyICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiODAwIH0KLSAgfSwKLS8qIGFzcjIgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI5MDAgfQotICB9LAotLyogbGRpOjggJGk4LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEk4KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpOCwgeyAweGMwMDAgfQotICB9LAotLyogbGRpOjIwICRpMjAsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTIwKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMjAsIHsgMHg5YjAwIH0KLSAgfSwKLS8qIGxkaTozMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEkzMiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTMyLCB7IDB4OWY4MCB9Ci0gIH0sCi0vKiBsZCBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg0MDAgfQotICB9LAotLyogbGR1aCBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg1MDAgfQotICB9LAotLyogbGR1YiBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg2MDAgfQotICB9LAotLyogbGQgQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgwIH0KLSAgfSwKLS8qIGxkdWggQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDAgfQotICB9LAotLyogbGR1YiBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwMCB9Ci0gIH0sCi0vKiBsZCBAKCRSMTQsJGRpc3AxMCksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1AxMCksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTQsIHsgMHgyMDAwIH0KLSAgfSwKLS8qIGxkdWggQCgkUjE0LCRkaXNwOSksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A5KSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNHVoLCB7IDB4NDAwMCB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxNCwkZGlzcDgpLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOCksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1YiwgeyAweDYwMDAgfQotICB9LAotLyogbGQgQCgkUjE1LCR1ZGlzcDYpLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTUpLCAnLCcsIE9QIChVRElTUDYpLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1LCB7IDB4MzAwIH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg3MDAgfQotICB9LAotLyogbGQgQCRSMTUrLCRSczIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCBPUCAoUlMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1ZHIsIHsgMHg3ODAgfQotICB9LAotLyogbGQgQCRSMTUrLCRwcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsIE9QIChQUyksIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4NzkwIH0KLSAgfSwKLS8qIHN0ICRSaSxAJFJqICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgT1AgKFJKKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDE0MDAgfQotICB9LAotLyogc3RoICRSaSxAJFJqICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgT1AgKFJKKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDE1MDAgfQotICB9LAotLyogc3RiICRSaSxAJFJqICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgT1AgKFJKKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDE2MDAgfQotICB9LAotLyogc3QgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDAwIH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDExMDAgfQotICB9LAotLyogc3RiICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTIwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDEwKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTQsIHsgMHgzMDAwIH0KLSAgfSwKLS8qIHN0aCAkUmksQCgkUjE0LCRkaXNwOSkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOSksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWgsIHsgMHg1MDAwIH0KLSAgfSwKLS8qIHN0YiAkUmksQCgkUjE0LCRkaXNwOCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWIsIHsgMHg3MDAwIH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTUsJHVkaXNwNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTUpLCAnLCcsIE9QIChVRElTUDYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNSwgeyAweDEzMDAgfQotICB9LAotLyogc3QgJFJpLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDE3MDAgfQotICB9LAotLyogc3QgJFJzMixALSRSMTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSUzIpLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1ZHIsIHsgMHgxNzgwIH0KLSAgfSwKLS8qIHN0ICRwcyxALSRSMTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChQUyksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDE3OTAgfQotICB9LAotLyogbW92ICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDhiMDAgfQotICB9LAotLyogbW92ICRSczEsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUlMxKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbW92ZHIsIHsgMHhiNzAwIH0KLSAgfSwKLS8qIG1vdiAkcHMsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUFMpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDE3MTAgfQotICB9LAotLyogbW92ICRSaSwkUnMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsIE9QIChSUzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfbW92ZHIsIHsgMHhiMzAwIH0KLSAgfSwKLS8qIG1vdiAkUmksJHBzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsIE9QIChQUyksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDcxMCB9Ci0gIH0sCi0vKiBqbXAgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzAwIH0KLSAgfSwKLS8qIGptcDpkIEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OWYwMCB9Ci0gIH0sCi0vKiBjYWxsIEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTcxMCB9Ci0gIH0sCi0vKiBjYWxsOmQgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5ZjEwIH0KLSAgfSwKLS8qIGNhbGwgJGxhYmVsMTIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDEyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NhbGwsIHsgMHhkMDAwIH0KLSAgfSwKLS8qIGNhbGw6ZCAkbGFiZWwxMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMMTIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY2FsbCwgeyAweGQ4MDAgfQotICB9LAotLyogcmV0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5NzIwIH0KLSAgfSwKLS8qIHJldDpkICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZjIwIH0KLSAgfSwKLS8qIGludCAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHgxZjAwIH0KLSAgfSwKLS8qIGludGUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmMzAgfQotICB9LAotLyogcmV0aSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OTczMCB9Ci0gIH0sCi0vKiBicmE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMDAwIH0KLSAgfSwKLS8qIGJyYSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMDAwIH0KLSAgfSwKLS8qIGJubzpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYxMDAgfQotICB9LAotLyogYm5vICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUxMDAgfQotICB9LAotLyogYmVxOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjIwMCB9Ci0gIH0sCi0vKiBiZXEgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTIwMCB9Ci0gIH0sCi0vKiBibmU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMzAwIH0KLSAgfSwKLS8qIGJuZSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMzAwIH0KLSAgfSwKLS8qIGJjOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjQwMCB9Ci0gIH0sCi0vKiBiYyAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlNDAwIH0KLSAgfSwKLS8qIGJuYzpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY1MDAgfQotICB9LAotLyogYm5jICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU1MDAgfQotICB9LAotLyogYm46ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNjAwIH0KLSAgfSwKLS8qIGJuICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU2MDAgfQotICB9LAotLyogYnA6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNzAwIH0KLSAgfSwKLS8qIGJwICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU3MDAgfQotICB9LAotLyogYnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmODAwIH0KLSAgfSwKLS8qIGJ2ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU4MDAgfQotICB9LAotLyogYm52OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjkwMCB9Ci0gIH0sCi0vKiBibnYgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTkwMCB9Ci0gIH0sCi0vKiBibHQ6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmYTAwIH0KLSAgfSwKLS8qIGJsdCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlYTAwIH0KLSAgfSwKLS8qIGJnZTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZiMDAgfQotICB9LAotLyogYmdlICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGViMDAgfQotICB9LAotLyogYmxlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmMwMCB9Ci0gIH0sCi0vKiBibGUgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWMwMCB9Ci0gIH0sCi0vKiBiZ3Q6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmZDAwIH0KLSAgfSwKLS8qIGJndCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlZDAwIH0KLSAgfSwKLS8qIGJsczpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZlMDAgfQotICB9LAotLyogYmxzICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVlMDAgfQotICB9LAotLyogYmhpOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmYwMCB9Ci0gIH0sCi0vKiBiaGkgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWYwMCB9Ci0gIH0sCi0vKiBkbW92ICRSMTMsQCRkaXIxMCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFIxMyksICcsJywgJ0AnLCBPUCAoRElSMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDE4MDAgfQotICB9LAotLyogZG1vdmggJFIxMyxAJGRpcjkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSMTMpLCAnLCcsICdAJywgT1AgKERJUjkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHgxOTAwIH0KLSAgfSwKLS8qIGRtb3ZiICRSMTMsQCRkaXI4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUjEzKSwgJywnLCAnQCcsIE9QIChESVI4KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4MWEwMCB9Ci0gIH0sCi0vKiBkbW92IEAkUjEzKyxAJGRpcjEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTMpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDFjMDAgfQotICB9LAotLyogZG1vdmggQCRSMTMrLEAkZGlyOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAnLCcsICdAJywgT1AgKERJUjkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHgxZDAwIH0KLSAgfSwKLS8qIGRtb3ZiIEAkUjEzKyxAJGRpcjggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxMyksICcrJywgJywnLCAnQCcsIE9QIChESVI4KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4MWUwMCB9Ci0gIH0sCi0vKiBkbW92IEAkUjE1KyxAJGRpcjEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDFiMDAgfQotICB9LAotLyogZG1vdiBAJGRpcjEwLCRSMTMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjEwKSwgJywnLCBPUCAoUjEzKSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHg4MDAgfQotICB9LAotLyogZG1vdmggQCRkaXI5LCRSMTMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjkpLCAnLCcsIE9QIChSMTMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHg5MDAgfQotICB9LAotLyogZG1vdmIgQCRkaXI4LCRSMTMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjgpLCAnLCcsIE9QIChSMTMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHhhMDAgfQotICB9LAotLyogZG1vdiBAJGRpcjEwLEAkUjEzKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSMTApLCAnLCcsICdAJywgT1AgKFIxMyksICcrJywgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHhjMDAgfQotICB9LAotLyogZG1vdmggQCRkaXI5LEAkUjEzKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOSksICcsJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2gsIHsgMHhkMDAgfQotICB9LAotLyogZG1vdmIgQCRkaXI4LEAkUjEzKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOCksICcsJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHhlMDAgfQotICB9LAotLyogZG1vdiBAJGRpcjEwLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSMTApLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHhiMDAgfQotICB9LAotLyogbGRyZXMgQCRSaSssJHU0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksICcrJywgJywnLCBPUCAoVTQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGJjMDAgfQotICB9LAotLyogc3RyZXMgJHU0LEAkUmkrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGJkMDAgfQotICB9LAotLyogY29wb3AgJHU0YywkY2NjLCRDUmosJENSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKENSSiksICcsJywgT1AgKENSSSksIDAgfSB9LAotICAgICYgaWZtdF9jb3BvcCwgeyAweDlmYzAgfQotICB9LAotLyogY29wbGQgJHU0YywkY2NjLCRSamMsJENSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKFJKQyksICcsJywgT1AgKENSSSksIDAgfSB9LAotICAgICYgaWZtdF9jb3BsZCwgeyAweDlmZDAgfQotICB9LAotLyogY29wc3QgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKENSSiksICcsJywgT1AgKFJJQyksIDAgfSB9LAotICAgICYgaWZtdF9jb3BzdCwgeyAweDlmZTAgfQotICB9LAotLyogY29wc3YgJHU0YywkY2NjLCRDUmosJFJpYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0QyksICcsJywgT1AgKENDQyksICcsJywgT1AgKENSSiksICcsJywgT1AgKFJJQyksIDAgfSB9LAotICAgICYgaWZtdF9jb3BzdCwgeyAweDlmZjAgfQotICB9LAotLyogbm9wICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZmEwIH0KLSAgfSwKLS8qIGFuZGNjciAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHg4MzAwIH0KLSAgfSwKLS8qIG9yY2NyICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDkzMDAgfQotICB9LAotLyogc3RpbG0gJHU4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfaW50LCB7IDB4ODcwMCB9Ci0gIH0sCi0vKiBhZGRzcCAkczEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUzEwKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHNwLCB7IDB4YTMwMCB9Ci0gIH0sCi0vKiBleHRzYiAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3ODAgfQotICB9LAotLyogZXh0dWIgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzkwIH0KLSAgfSwKLS8qIGV4dHNoICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTdhMCB9Ci0gIH0sCi0vKiBleHR1aCAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3YjAgfQotICB9LAotLyogbGRtMCAoJHJlZ2xpc3RfbG93X2xkKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9MT1dfTEQpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZG0wLCB7IDB4OGMwMCB9Ci0gIH0sCi0vKiBsZG0xICgkcmVnbGlzdF9oaV9sZCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfSElfTEQpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZG0xLCB7IDB4OGQwMCB9Ci0gIH0sCi0vKiBzdG0wICgkcmVnbGlzdF9sb3dfc3QpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0xPV19TVCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0bTAsIHsgMHg4ZTAwIH0KLSAgfSwKLS8qIHN0bTEgKCRyZWdsaXN0X2hpX3N0KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9ISV9TVCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0bTEsIHsgMHg4ZjAwIH0KLSAgfSwKLS8qIGVudGVyICR1MTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfZW50ZXIsIHsgMHhmMDAgfQotICB9LAotLyogbGVhdmUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmOTAgfQotICB9LAotLyogeGNoYiBAJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4YTAwIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0vKiBGb3JtYXRzIGZvciBBTElBUyBtYWNyby1pbnNucy4gICovCi0KLSNkZWZpbmUgRihmKSAmIGZyMzBfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKEZSMzBfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpOG0gPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JOCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkyMG0gPSB7Ci0gIDE2LCAzMiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JJKSwgRiAoRl9JMjApLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkzMm0gPSB7Ci0gIDE2LCA0OCwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCBGIChGX0kzMiksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotLyogRWFjaCBub24tc2ltcGxlIG1hY3JvIGVudHJ5IHBvaW50cyB0byBhbiBhcnJheSBvZiBleHBhbnNpb24gcG9zc2liaWxpdGllcy4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoRlIzMF9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGVbXSA9Ci17Ci0vKiBsZGk4ICRpOCwkUmkgKi8KLSAgewotICAgIC0xLCAibGRpOG0iLCAibGRpOCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGkyMCAkaTIwLCRSaSAqLwotICB7Ci0gICAgLTEsICJsZGkyMG0iLCAibGRpMjAiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpMzIgJGkzMiwkUmkgKi8KLSAgewotICAgIC0xLCAibGRpMzJtIiwgImxkaTMyIiwgNDgsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLX07Ci0KLS8qIFRoZSBtYWNybyBpbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgZnIzMF9jZ2VuX21hY3JvX2luc25fb3Bjb2RlX3RhYmxlW10gPQotewotLyogbGRpOCAkaTgsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTgpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGk4bSwgeyAweGMwMDAgfQotICB9LAotLyogbGRpMjAgJGkyMCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMjApLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkyMG0sIHsgMHg5YjAwIH0KLSAgfSwKLS8qIGxkaTMyICRpMzIsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTMyKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMzJtLCB7IDB4OWY4MCB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNIX1AKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9QKGluc24pIDEKLSNlbmRpZgotCi0jaWZuZGVmIENHRU5fRElTX0hBU0hfUAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLS8qIFJldHVybiBub24temVybyBpZiBJTlNOIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIX1AgaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyBpbnQKLWFzbV9oYXNoX2luc25fcCAoaW5zbikKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSF9QIChpbnNuKTsKLX0KLQotc3RhdGljIGludAotZGlzX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIC8qIElmIGJ1aWxkaW5nIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgTk8tRElTIGF0dHJpYnV0ZSBpcyBwcmVzZW50LAotICAgICBpZ25vcmUuICAqLwotICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9OT19ESVMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gQ0dFTl9ESVNfSEFTSF9QIChpbnNuKTsKLX0KLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNICi0jZGVmaW5lIENHRU5fQVNNX0hBU0hfU0laRSAxMjcKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpCi0jZWxzZQotI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKSAvKkZJWE1FKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIEl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHByb3ZpZGUgYSBkZWZhdWx0IGhlcmUsCi0gICBidXQgd2hpbGUgdGhpcyBpcyB1bmRlciBkZXZlbG9wbWVudCB3ZSBkby4KLSAgIEJVRkZFUiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2Ci0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmLCB2YWx1ZSkgKCoodW5zaWduZWQgY2hhciAqKSAoYnVmKSkKLSNlbmRpZgotCi0vKiBUaGUgcmVzdWx0IGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIIGluIHRoZSAub3BjIGZpbGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1hc21faGFzaF9pbnNuIChtbmVtKQotICAgICBjb25zdCBjaGFyICogbW5lbTsKLXsKLSAgcmV0dXJuIENHRU5fQVNNX0hBU0ggKG1uZW0pOwotfQotCi0vKiBCVUYgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgotICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kaXNfaGFzaF9pbnNuIChidWYsIHZhbHVlKQotICAgICBjb25zdCBjaGFyICogYnVmOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICByZXR1cm4gQ0dFTl9ESVNfSEFTSCAoYnVmLCB2YWx1ZSk7Ci19Ci0KLS8qIFNldCB0aGUgcmVjb3JkZWQgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIHRoZSBDR0VOX0ZJRUxEUyBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2ZpZWxkc19iaXRzaXplIChmaWVsZHMsIHNpemUpCi0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCBzaXplOwotewotICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gc2l6ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuCi0gICBUaGlzIHBsdWdzIHRoZSBvcGNvZGUgZW50cmllcyBhbmQgbWFjcm8gaW5zdHJ1Y3Rpb25zIGludG8gdGhlIGNwdSB0YWJsZS4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbnVtX21hY3JvcyA9IChzaXplb2YgKGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlKSAvCi0JCSAgICBzaXplb2YgKGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdKSk7Ci0gIGNvbnN0IENHRU5fSUJBU0UgKmliID0gJiBmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXTsKLSAgY29uc3QgQ0dFTl9PUENPREUgKm9jID0gJiBmcjMwX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBtZW1zZXQgKGluc25zLCAwLCBudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9tYWNyb3M7ICsraSkKLSAgICB7Ci0gICAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICAgICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotICAgIH0KLSAgY2QtPm1hY3JvX2luc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSUJBU0UpOwotICBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzID0gbnVtX21hY3JvczsKLQotICBvYyA9ICYgZnIzMF9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlWzBdOwotICBpbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotCi0gIGNkLT5zaXplb2ZfZmllbGRzID0gc2l6ZW9mIChDR0VOX0ZJRUxEUyk7Ci0gIGNkLT5zZXRfZmllbGRzX2JpdHNpemUgPSBzZXRfZmllbGRzX2JpdHNpemU7Ci0KLSAgY2QtPmFzbV9oYXNoX3AgPSBhc21faGFzaF9pbnNuX3A7Ci0gIGNkLT5hc21faGFzaCA9IGFzbV9oYXNoX2luc247Ci0gIGNkLT5hc21faGFzaF9zaXplID0gQ0dFTl9BU01fSEFTSF9TSVpFOwotCi0gIGNkLT5kaXNfaGFzaF9wID0gZGlzX2hhc2hfaW5zbl9wOwotICBjZC0+ZGlzX2hhc2ggPSBkaXNfaGFzaF9pbnNuOwotICBjZC0+ZGlzX2hhc2hfc2l6ZSA9IENHRU5fRElTX0hBU0hfU0laRTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1vcGMuaCBiL29wY29kZXMvZnIzMC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4N2VkNS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIGhlYWRlciBmb3IgZnIzMC4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBGUjMwX09QQ19ICi0jZGVmaW5lIEZSMzBfT1BDX0gKLQotLyogLS0gb3BjLmggKi8KLQotLyogPz8/IFRoaXMgY2FuIGJlIGltcHJvdmVkIHVwb24uICAqLwotI3VuZGVmIENHRU5fRElTX0hBU0hfU0laRQotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMTYKLSN1bmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmZmVyLCB2YWx1ZSkgKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMF0gPj4gNCkKLQotLyogLS0gKi8KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaW5zdHJ1Y3Rpb24gdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl90eXBlIHsKLSAgRlIzMF9JTlNOX0lOVkFMSUQsIEZSMzBfSU5TTl9BREQsIEZSMzBfSU5TTl9BRERJLCBGUjMwX0lOU05fQUREMgotICwgRlIzMF9JTlNOX0FEREMsIEZSMzBfSU5TTl9BREROLCBGUjMwX0lOU05fQURETkksIEZSMzBfSU5TTl9BREROMgotICwgRlIzMF9JTlNOX1NVQiwgRlIzMF9JTlNOX1NVQkMsIEZSMzBfSU5TTl9TVUJOLCBGUjMwX0lOU05fQ01QCi0gLCBGUjMwX0lOU05fQ01QSSwgRlIzMF9JTlNOX0NNUDIsIEZSMzBfSU5TTl9BTkQsIEZSMzBfSU5TTl9PUgotICwgRlIzMF9JTlNOX0VPUiwgRlIzMF9JTlNOX0FORE0sIEZSMzBfSU5TTl9BTkRILCBGUjMwX0lOU05fQU5EQgotICwgRlIzMF9JTlNOX09STSwgRlIzMF9JTlNOX09SSCwgRlIzMF9JTlNOX09SQiwgRlIzMF9JTlNOX0VPUk0KLSAsIEZSMzBfSU5TTl9FT1JILCBGUjMwX0lOU05fRU9SQiwgRlIzMF9JTlNOX0JBTkRMLCBGUjMwX0lOU05fQk9STAotICwgRlIzMF9JTlNOX0JFT1JMLCBGUjMwX0lOU05fQkFOREgsIEZSMzBfSU5TTl9CT1JILCBGUjMwX0lOU05fQkVPUkgKLSAsIEZSMzBfSU5TTl9CVFNUTCwgRlIzMF9JTlNOX0JUU1RILCBGUjMwX0lOU05fTVVMLCBGUjMwX0lOU05fTVVMVQotICwgRlIzMF9JTlNOX01VTEgsIEZSMzBfSU5TTl9NVUxVSCwgRlIzMF9JTlNOX0RJVjBTLCBGUjMwX0lOU05fRElWMFUKLSAsIEZSMzBfSU5TTl9ESVYxLCBGUjMwX0lOU05fRElWMiwgRlIzMF9JTlNOX0RJVjMsIEZSMzBfSU5TTl9ESVY0UwotICwgRlIzMF9JTlNOX0xTTCwgRlIzMF9JTlNOX0xTTEksIEZSMzBfSU5TTl9MU0wyLCBGUjMwX0lOU05fTFNSCi0gLCBGUjMwX0lOU05fTFNSSSwgRlIzMF9JTlNOX0xTUjIsIEZSMzBfSU5TTl9BU1IsIEZSMzBfSU5TTl9BU1JJCi0gLCBGUjMwX0lOU05fQVNSMiwgRlIzMF9JTlNOX0xESTgsIEZSMzBfSU5TTl9MREkyMCwgRlIzMF9JTlNOX0xESTMyCi0gLCBGUjMwX0lOU05fTEQsIEZSMzBfSU5TTl9MRFVILCBGUjMwX0lOU05fTERVQiwgRlIzMF9JTlNOX0xEUjEzCi0gLCBGUjMwX0lOU05fTERSMTNVSCwgRlIzMF9JTlNOX0xEUjEzVUIsIEZSMzBfSU5TTl9MRFIxNCwgRlIzMF9JTlNOX0xEUjE0VUgKLSAsIEZSMzBfSU5TTl9MRFIxNFVCLCBGUjMwX0lOU05fTERSMTUsIEZSMzBfSU5TTl9MRFIxNUdSLCBGUjMwX0lOU05fTERSMTVEUgotICwgRlIzMF9JTlNOX0xEUjE1UFMsIEZSMzBfSU5TTl9TVCwgRlIzMF9JTlNOX1NUSCwgRlIzMF9JTlNOX1NUQgotICwgRlIzMF9JTlNOX1NUUjEzLCBGUjMwX0lOU05fU1RSMTNILCBGUjMwX0lOU05fU1RSMTNCLCBGUjMwX0lOU05fU1RSMTQKLSAsIEZSMzBfSU5TTl9TVFIxNEgsIEZSMzBfSU5TTl9TVFIxNEIsIEZSMzBfSU5TTl9TVFIxNSwgRlIzMF9JTlNOX1NUUjE1R1IKLSAsIEZSMzBfSU5TTl9TVFIxNURSLCBGUjMwX0lOU05fU1RSMTVQUywgRlIzMF9JTlNOX01PViwgRlIzMF9JTlNOX01PVkRSCi0gLCBGUjMwX0lOU05fTU9WUFMsIEZSMzBfSU5TTl9NT1YyRFIsIEZSMzBfSU5TTl9NT1YyUFMsIEZSMzBfSU5TTl9KTVAKLSAsIEZSMzBfSU5TTl9KTVBELCBGUjMwX0lOU05fQ0FMTFIsIEZSMzBfSU5TTl9DQUxMUkQsIEZSMzBfSU5TTl9DQUxMCi0gLCBGUjMwX0lOU05fQ0FMTEQsIEZSMzBfSU5TTl9SRVQsIEZSMzBfSU5TTl9SRVRfRCwgRlIzMF9JTlNOX0lOVAotICwgRlIzMF9JTlNOX0lOVEUsIEZSMzBfSU5TTl9SRVRJLCBGUjMwX0lOU05fQlJBRCwgRlIzMF9JTlNOX0JSQQotICwgRlIzMF9JTlNOX0JOT0QsIEZSMzBfSU5TTl9CTk8sIEZSMzBfSU5TTl9CRVFELCBGUjMwX0lOU05fQkVRCi0gLCBGUjMwX0lOU05fQk5FRCwgRlIzMF9JTlNOX0JORSwgRlIzMF9JTlNOX0JDRCwgRlIzMF9JTlNOX0JDCi0gLCBGUjMwX0lOU05fQk5DRCwgRlIzMF9JTlNOX0JOQywgRlIzMF9JTlNOX0JORCwgRlIzMF9JTlNOX0JOCi0gLCBGUjMwX0lOU05fQlBELCBGUjMwX0lOU05fQlAsIEZSMzBfSU5TTl9CVkQsIEZSMzBfSU5TTl9CVgotICwgRlIzMF9JTlNOX0JOVkQsIEZSMzBfSU5TTl9CTlYsIEZSMzBfSU5TTl9CTFRELCBGUjMwX0lOU05fQkxUCi0gLCBGUjMwX0lOU05fQkdFRCwgRlIzMF9JTlNOX0JHRSwgRlIzMF9JTlNOX0JMRUQsIEZSMzBfSU5TTl9CTEUKLSAsIEZSMzBfSU5TTl9CR1RELCBGUjMwX0lOU05fQkdULCBGUjMwX0lOU05fQkxTRCwgRlIzMF9JTlNOX0JMUwotICwgRlIzMF9JTlNOX0JISUQsIEZSMzBfSU5TTl9CSEksIEZSMzBfSU5TTl9ETU9WUjEzLCBGUjMwX0lOU05fRE1PVlIxM0gKLSAsIEZSMzBfSU5TTl9ETU9WUjEzQiwgRlIzMF9JTlNOX0RNT1ZSMTNQSSwgRlIzMF9JTlNOX0RNT1ZSMTNQSUgsIEZSMzBfSU5TTl9ETU9WUjEzUElCCi0gLCBGUjMwX0lOU05fRE1PVlIxNVBJLCBGUjMwX0lOU05fRE1PVjJSMTMsIEZSMzBfSU5TTl9ETU9WMlIxM0gsIEZSMzBfSU5TTl9ETU9WMlIxM0IKLSAsIEZSMzBfSU5TTl9ETU9WMlIxM1BJLCBGUjMwX0lOU05fRE1PVjJSMTNQSUgsIEZSMzBfSU5TTl9ETU9WMlIxM1BJQiwgRlIzMF9JTlNOX0RNT1YyUjE1UEQKLSAsIEZSMzBfSU5TTl9MRFJFUywgRlIzMF9JTlNOX1NUUkVTLCBGUjMwX0lOU05fQ09QT1AsIEZSMzBfSU5TTl9DT1BMRAotICwgRlIzMF9JTlNOX0NPUFNULCBGUjMwX0lOU05fQ09QU1YsIEZSMzBfSU5TTl9OT1AsIEZSMzBfSU5TTl9BTkRDQ1IKLSAsIEZSMzBfSU5TTl9PUkNDUiwgRlIzMF9JTlNOX1NUSUxNLCBGUjMwX0lOU05fQUREU1AsIEZSMzBfSU5TTl9FWFRTQgotICwgRlIzMF9JTlNOX0VYVFVCLCBGUjMwX0lOU05fRVhUU0gsIEZSMzBfSU5TTl9FWFRVSCwgRlIzMF9JTlNOX0xETTAKLSAsIEZSMzBfSU5TTl9MRE0xLCBGUjMwX0lOU05fU1RNMCwgRlIzMF9JTlNOX1NUTTEsIEZSMzBfSU5TTl9FTlRFUgotICwgRlIzMF9JTlNOX0xFQVZFLCBGUjMwX0lOU05fWENIQiwgRlIzMF9JTlNOX01BWAotfSBDR0VOX0lOU05fVFlQRTsKLQotLyogSW5kZXggb2YgYGludmFsaWQnIGluc24gcGxhY2UgaG9sZGVyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSUQgRlIzMF9JTlNOX0lOVkFMSUQKLQotLyogVG90YWwgbnVtYmVyIG9mIGluc25zIGluIHRhYmxlLiAgKi8KLSNkZWZpbmUgTUFYX0lOU05TICgoaW50KSBGUjMwX0lOU05fTUFYKQotCi0vKiBUaGlzIHN0cnVjdCByZWNvcmRzIGRhdGEgcHJpb3IgdG8gaW5zZXJ0aW9uIG9yIGFmdGVyIGV4dHJhY3Rpb24uICAqLwotc3RydWN0IGNnZW5fZmllbGRzCi17Ci0gIGludCBsZW5ndGg7Ci0gIGxvbmcgZl9uaWw7Ci0gIGxvbmcgZl9vcDE7Ci0gIGxvbmcgZl9vcDI7Ci0gIGxvbmcgZl9vcDM7Ci0gIGxvbmcgZl9vcDQ7Ci0gIGxvbmcgZl9vcDU7Ci0gIGxvbmcgZl9jYzsKLSAgbG9uZyBmX2NjYzsKLSAgbG9uZyBmX1JqOwotICBsb25nIGZfUmk7Ci0gIGxvbmcgZl9SczE7Ci0gIGxvbmcgZl9SczI7Ci0gIGxvbmcgZl9SamM7Ci0gIGxvbmcgZl9SaWM7Ci0gIGxvbmcgZl9DUmo7Ci0gIGxvbmcgZl9DUmk7Ci0gIGxvbmcgZl91NDsKLSAgbG9uZyBmX3U0YzsKLSAgbG9uZyBmX2k0OwotICBsb25nIGZfbTQ7Ci0gIGxvbmcgZl91ODsKLSAgbG9uZyBmX2k4OwotICBsb25nIGZfaTIwXzQ7Ci0gIGxvbmcgZl9pMjBfMTY7Ci0gIGxvbmcgZl9pMjA7Ci0gIGxvbmcgZl9pMzI7Ci0gIGxvbmcgZl91ZGlzcDY7Ci0gIGxvbmcgZl9kaXNwODsKLSAgbG9uZyBmX2Rpc3A5OwotICBsb25nIGZfZGlzcDEwOwotICBsb25nIGZfczEwOwotICBsb25nIGZfdTEwOwotICBsb25nIGZfcmVsOTsKLSAgbG9uZyBmX2Rpcjg7Ci0gIGxvbmcgZl9kaXI5OwotICBsb25nIGZfZGlyMTA7Ci0gIGxvbmcgZl9yZWwxMjsKLSAgbG9uZyBmX3JlZ2xpc3RfaGlfc3Q7Ci0gIGxvbmcgZl9yZWdsaXN0X2xvd19zdDsKLSAgbG9uZyBmX3JlZ2xpc3RfaGlfbGQ7Ci0gIGxvbmcgZl9yZWdsaXN0X2xvd19sZDsKLX07Ci0KLSNkZWZpbmUgQ0dFTl9JTklUX1BBUlNFKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfSU5TRVJUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfRVhUUkFDVChvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX1BSSU5UKG9kKSBcCi17XAotfQotCi0KLSNlbmRpZiAvKiBGUjMwX09QQ19IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4MzAwLWRpcy5jIGIvb3Bjb2Rlcy9oODMwMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTNhOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2g4MzAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGg4MzAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2RlZmluZSBoOF9vcGNvZGVzIGg4b3BzCi0jaW5jbHVkZSAib3Bjb2RlL2g4MzAwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0KLS8qIFJ1biB0aHJvdWdoIHRoZSBvcGNvZGVzIGFuZCBzb3J0IHRoZW0gaW50byBvcmRlciB0byBtYWtlIHRoZW0gZWFzeQotICAgdG8gZGlzYXNzZW1ibGUKLSAqLwotc3RhdGljIHZvaWQKLWJmZF9oOF9kaXNhc3NlbWJsZV9pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0KLSAgc3RydWN0IGg4X29wY29kZSAqcDsKLQotICBmb3IgKHAgPSBoOF9vcGNvZGVzOyBwLT5uYW1lOyBwKyspCi0gICAgewotICAgICAgaW50IG4xID0gMDsKLSAgICAgIGludCBuMiA9IDA7Ci0KLSAgICAgIGlmICgoaW50KSBwLT5kYXRhLm5pYlswXSA8IDE2KQotCXsKLQkgIG4xID0gKGludCkgcC0+ZGF0YS5uaWJbMF07Ci0JfQotICAgICAgZWxzZQotCW4xID0gMDsKLSAgICAgIGlmICgoaW50KSBwLT5kYXRhLm5pYlsxXSA8IDE2KQotCXsKLQkgIG4yID0gKGludCkgcC0+ZGF0YS5uaWJbMV07Ci0JfQotICAgICAgZWxzZQotCW4yID0gMDsKLQotICAgICAgLyogSnVzdCBtYWtlIHN1cmUgdGhlcmUgYXJlIGFuIGV2ZW4gbnVtYmVyIG9mIG5pYmJsZXMgaW4gaXQsIGFuZAotCSB0aGF0IHRoZSBjb3VudCBpcyB0aGUgc2FtZSBzIHRoZSBsZW5ndGggKi8KLSAgICAgIGZvciAoaSA9IDA7IHAtPmRhdGEubmliW2ldICE9IEU7IGkrKykKLQkvKkVNUFRZKi8gOwotICAgICAgaWYgKGkgJiAxKQotCWFib3J0ICgpOwotICAgICAgcC0+bGVuZ3RoID0gaSAvIDI7Ci0gICAgfQotCi19Ci0KLQotdW5zaWduZWQgaW50Ci1iZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8sIG1vZGUpCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IG1vZGU7Ci17Ci0gIC8qIEZpbmQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZSBmb3IgdGhpcyBvcGNvZGUgKi8KLSAgc3RhdGljIENPTlNUIGNoYXIgKnJlZ25hbWVzW10gPQotICAgIHsKLSAgICAgICJyMGgiLCAicjFoIiwgInIyaCIsICJyM2giLCAicjRoIiwgInI1aCIsICJyNmgiLCAicjdoIiwKLSAgICAgICJyMGwiLCAicjFsIiwgInIybCIsICJyM2wiLCAicjRsIiwgInI1bCIsICJyNmwiLCAicjdsIn07Ci0gIAotICBzdGF0aWMgQ09OU1QgY2hhciAqd3JlZ25hbWVzW10gPQotICAgIHsKLSAgICAgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCi0gICAgICAiZTAiLCAiZTEiLCAiZTIiLCAiZTMiLCAiZTQiLCAiZTUiLCAiZTYiLCAiZTciCi0gICAgICB9OwotICAKLSAgc3RhdGljIENPTlNUIGNoYXIgKmxyZWduYW1lc1tdID0KLSAgICB7Ci0gICAgICAiZXIwIiwgImVyMSIsICJlcjIiLCAiZXIzIiwgImVyNCIsICJlcjUiLCAiZXI2IiwgImVyNyIsCi0gICAgICAiZXIwIiwgImVyMSIsICJlcjIiLCAiZXIzIiwgImVyNCIsICJlcjUiLCAiZXI2IiwgImVyNyIKLSAgICAgIH0KLSAgOwotCi0gIGludCBycyA9IDA7Ci0gIGludCByZCA9IDA7Ci0gIGludCByZGlzcCA9IDA7Ci0gIGludCBhYnMgPSAwOwotICBpbnQgYml0ID0gMDsKLSAgaW50IHBsZW4gPSAwOwotICBzdGF0aWMgYm9vbGVhbiBpbml0ID0gMDsKLSAgc3RydWN0IGg4X29wY29kZSAqcSA9IGg4X29wY29kZXM7Ci0gIGNoYXIgQ09OU1QgKipwcmVnbmFtZXMgPSBtb2RlICE9IDAgPyBscmVnbmFtZXMgOiB3cmVnbmFtZXM7Ci0gIGludCBzdGF0dXM7Ci0gIGludCBsOwotICAKLSAgdW5zaWduZWQgY2hhciBkYXRhWzIwXTsgIAotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgZnByaW50ZiA9IGluZm8tPmZwcmludGZfZnVuYzsKLQotICBpZiAoIWluaXQpCi0gICAgewotICAgICAgYmZkX2g4X2Rpc2Fzc2VtYmxlX2luaXQgKCk7Ci0gICAgICBpbml0ID0gMTsKLSAgICB9Ci0KLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyhhZGRyLCBkYXRhLCAyLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSAKLSAgICB7Ci0gICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyhzdGF0dXMsIGFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgZm9yIChsID0gMjsgc3RhdHVzID09IDAgJiYgbCA8IDEwOyBsKz0yKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMoYWRkcitsLCBkYXRhK2wsIDIsIGluZm8pOwotICAgIH0KLSAgCi0gIAotCi0gIC8qIEZpbmQgdGhlIGV4YWN0IG9wY29kZS9hcmcgY29tYm8gKi8KLSAgd2hpbGUgKHEtPm5hbWUpCi0gICAgewotICAgICAgb3BfdHlwZSAqbmliOwotICAgICAgdW5zaWduZWQgaW50IGxlbiA9IDA7Ci0KLSAgICAgIG5pYiA9IHEtPmRhdGEubmliOwotICAgICAgCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBvcF90eXBlIGxvb2tpbmdfZm9yID0gKm5pYjsKLQkgIGludCB0aGlzbmliID0gZGF0YVtsZW4gPj4gMV07Ci0JICAKLQkgIHRoaXNuaWIgPSAobGVuICYgMSkgPyAodGhpc25pYiAmIDB4ZikgOiAoKHRoaXNuaWIgPj4gNCkgJiAweGYpOwotCSAgCi0JICBpZiAobG9va2luZ19mb3IgPCAxNiAmJiBsb29raW5nX2ZvciA+PTApIAotCSAgICB7Ci0JICAgICAgCi0JICAgICAgaWYgKGxvb2tpbmdfZm9yICE9IHRoaXNuaWIpIAotCQlnb3RvIGZhaWw7Ci0JICAgIH0KLQkgIAotCSAgZWxzZSAKLQkgICAgewotCSAgICAgIAotCSAgICAgIGlmICgoaW50KSBsb29raW5nX2ZvciAmIChpbnQpIEIzMSkKLQkJewotCQkgIGlmICghICgoKGludCkgdGhpc25pYiAmIDB4OCkgIT0gMCkpIAotCQkgICAgZ290byBmYWlsOwotCQkgIGxvb2tpbmdfZm9yID0gKG9wX3R5cGUpICgoaW50KSBsb29raW5nX2ZvciAmIH4oaW50KSBCMzEpOwotCQl9Ci0JICAgICAgaWYgKChpbnQpIGxvb2tpbmdfZm9yICYgKGludCkgQjMwKQotCQl7Ci0JCSAgaWYgKCEoKChpbnQpIHRoaXNuaWIgJiAweDgpID09IDApKSAKLQkJICAgIGdvdG8gZmFpbDsKLQkJICBsb29raW5nX2ZvciA9IChvcF90eXBlKSAoKGludCkgbG9va2luZ19mb3IgJiB+KGludCkgQjMwKTsKLQkJfQotCi0JICAgICAgaWYgKGxvb2tpbmdfZm9yICYgREJJVCkKLQkJewotCQkgIGlmICgobG9va2luZ19mb3IgJiA1KSAhPSAodGhpc25pYiAmNSkpIGdvdG8gZmFpbDsKLQkJICBhYnMgPSAodGhpc25pYiAmIDB4OCkgPyAyIDogMTsKLQkJfQkJICAKLQkgICAgICAKLQkgICAgICBlbHNlICBpZiAobG9va2luZ19mb3IgJiAoUkVHIHwgSU5EfElOQ3xERUMpKQotCQl7Ci0JCSAgaWYgKGxvb2tpbmdfZm9yICYgU1JDKQotCQkgICAgewotCQkgICAgICBycyA9IHRoaXNuaWI7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICByZCA9IHRoaXNuaWI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMTYpCi0JCXsKLQkJICBhYnMgPSAoZGF0YVtsZW4gPj4gMV0pICogMjU2ICsgZGF0YVsobGVuICsgMikgPj4gMV07Ci0JCSAgcGxlbiA9IDE2OwotCSAgICAgIAotCQl9Ci0JICAgICAgZWxzZSBpZihsb29raW5nX2ZvciAmIEFCU0pNUCkKLQkJewotCQkgIGFicyA9Ci0JCSAgICAoZGF0YVsxXSA8PCAxNikKLQkJICAgICAgfCAoZGF0YVsyXSA8PCA4KQotCQkJfCAoZGF0YVszXSk7Ci0JCX0KLQkgICAgICBlbHNlIGlmKGxvb2tpbmdfZm9yICYgTUVNSU5EKQotCQl7Ci0JCSAgYWJzID0gZGF0YVsxXTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8zMikKLQkJewotCQkgIGludCBpID0gbGVuID4+IDE7Ci0JCSAgYWJzID0gKGRhdGFbaV0gPDwgMjQpCi0JCSAgICB8IChkYXRhW2kgKyAxXSA8PCAxNikKLQkJICAgICAgfCAoZGF0YVtpICsgMl0gPDwgOCkKLQkJCXwgKGRhdGFbaSsgM10pOwotCi0JCSAgcGxlbiA9MzI7Ci0JICAgICAgCi0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMjQpCi0JCXsKLQkJICBpbnQgaSA9IGxlbiA+PiAxOwotCQkgIGFicyA9IChkYXRhW2ldIDw8IDE2KSB8IChkYXRhW2kgKyAxXSA8PCA4KXwgIChkYXRhW2krMl0pOwotCQkgIHBsZW4gPTI0OwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBJR05PUkUpCi0JCXsKLQkJICAKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgRElTUFJFRykKLQkJewotCQkgIHJkaXNwID0gdGhpc25pYjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgS0JJVCkKLQkJewotCQkgIHN3aXRjaCAodGhpc25pYikgCi0JCSAgICB7Ci0JCSAgICBjYXNlIDk6Ci0JCSAgICAgIGFicyA9IDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA4OgotCQkgICAgICBhYnMgPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgYWJzID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBnb3RvIGZhaWw7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfOCkKLQkJewotCQkgIHBsZW4gPSA4OwkJICAKLQkJICBhYnMgPSBkYXRhW2xlbiA+PiAxXTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8zKQotCQl7Ci0JCSAgYml0ID0gdGhpc25pYiAmIDB4NzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8yKQotCQl7Ci0JCSAgcGxlbiA9IDI7Ci0JCSAgYWJzID0gdGhpc25pYiAmIDB4MzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTUFDUkVHKQotCQl7Ci0JCSAgYWJzID0gKHRoaXNuaWIgPT0gMyk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciA9PSBFKQotCQl7Ci0KLQkJICB7Ci0JCSAgICBpbnQgaTsKLQotCQkgICAgZm9yIChpID0gMDsgaSA8IHEtPmxlbmd0aDsgaSsrKQotCQkgICAgICB7Ci0JCQlmcHJpbnRmIChzdHJlYW0sICIlMDJ4ICIsIGRhdGFbaV0pOwotCQkgICAgICB9Ci0JCSAgICBmb3IgKDsgaSA8IDY7IGkrKykKLQkJICAgICAgewotCQkJZnByaW50ZiAoc3RyZWFtLCAiICAgIik7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCSAgZnByaW50ZiAoc3RyZWFtLCAiJXNcdCIsIHEtPm5hbWUpOwotCi0JCSAgLyogR3Jvc3MuICBEaXNndXN0aW5nLiAgKi8KLQkJICBpZiAoc3RyY21wIChxLT5uYW1lLCAibGRtLmwiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBpbnQgY291bnQsIGhpZ2g7Ci0KLQkJICAgICAgY291bnQgPSAoZGF0YVsxXSA+PiA0KSAmIDB4MzsKLQkJICAgICAgaGlnaCA9IGRhdGFbM10gJiAweDc7Ci0KLQkJICAgICAgZnByaW50ZiAoc3RyZWFtLCAiQHNwKyxlciVkLWVyJWQiLCBoaWdoIC0gY291bnQsIGhpZ2gpOwotCQkgICAgICByZXR1cm4gcS0+bGVuZ3RoOwotCQkgICAgfQotCi0JCSAgaWYgKHN0cmNtcCAocS0+bmFtZSwgInN0bS5sIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgaW50IGNvdW50LCBsb3c7Ci0KLQkJICAgICAgY291bnQgPSAoZGF0YVsxXSA+PiA0KSAmIDB4MzsKLQkJICAgICAgbG93ID0gZGF0YVszXSAmIDB4NzsKLQotCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICJlciVkLWVyJWQsQC1zcCIsIGxvdywgbG93ICsgY291bnQpOwotCQkgICAgICByZXR1cm4gcS0+bGVuZ3RoOwotCQkgICAgfQotCi0JCSAgLyogRmlsbCBpbiB0aGUgYXJncyAqLwotCQkgIHsKLQkJICAgIG9wX3R5cGUgKmFyZ3MgPSBxLT5hcmdzLm5pYjsKLQkJICAgIGludCBoYWRvbmUgPSAwOwotCi0KLQkJICAgIHdoaWxlICgqYXJncyAhPSBFKQotCQkgICAgICB7Ci0JCQlpbnQgeCA9ICphcmdzOwotCQkJaWYgKGhhZG9uZSkKLQkJCSAgZnByaW50ZiAoc3RyZWFtLCAiLCIpOwotCi0KLQkJCWlmICh4ICYgTF8zKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiIzB4JXgiLCAodW5zaWduZWQpIGJpdCk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiAoSU1NfEtCSVR8REJJVCkpCi0JCQkgIHsKLQkJCSAgICAvKiBCbGV0Y2guICBGb3Igc2hhbCAjMixlcjAgYW5kIGZyaWVuZHMuICAqLwotCQkJICAgIGlmICgqKGFyZ3MrMSkgJiBTUkNfSU5fRFNUKQotCQkJICAgICAgYWJzID0gMjsKLQotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIiMweCV4IiwgKHVuc2lnbmVkKSBhYnMpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgUkVHKQotCQkJICB7Ci0JCQkgICAgaW50IHJuID0gKHggJiBEU1QpID8gcmQgOiByczsKLQkJCSAgICBzd2l0Y2ggKHggJiBTSVpFKQotCQkJICAgICAgewotCQkJICAgICAgY2FzZSBMXzg6Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiJXMiLCByZWduYW1lc1tybl0pOwotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSBMXzE2OgotCQkJCWZwcmludGYgKHN0cmVhbSwgIiVzIiwgd3JlZ25hbWVzW3JuXSk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlIExfUDoKLQkJCSAgICAgIGNhc2UgTF8zMjoKLQkJCQlmcHJpbnRmIChzdHJlYW0sICIlcyIsIGxyZWduYW1lc1tybl0pOwotCQkJCWJyZWFrOwotCQkgICAgCi0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBNQUNSRUcpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJtYWMlYyIsIGFicyA/ICdsJyA6ICdoJyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBJTkMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAJXMrIiwgcHJlZ25hbWVzW3JzXSk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBERUMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJALSVzIiwgcHJlZ25hbWVzW3JkXSk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIElORCkKLQkJCSAgewotCQkJICAgIGludCBybiA9ICh4ICYgRFNUKSA/IHJkIDogcnM7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQCVzIiwgcHJlZ25hbWVzW3JuXSk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIEFCUzhNRU0pCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAMHgleDo4IiwgKHVuc2lnbmVkKSBhYnMpOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiAoQUJTfEFCU0pNUCkpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAMHgleDolZCIsICh1bnNpZ25lZCkgYWJzLCBwbGVuKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgTUVNSU5EKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQEAlZCAoJXgpIiwgYWJzLCBhYnMpOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiBQQ1JFTCkKLQkJCSAgewotCQkJICAgIGlmICh4ICYgTF8xNikgCi0JCQkgICAgICB7Ci0JCQkJYWJzICArPTI7Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiLiVzJWQgKCV4KSIsIChzaG9ydCkgYWJzID4gMCA/ICIrIiA6ICIiLCAoc2hvcnQpIGFicywKLQkJCQkJIGFkZHIgKyAoc2hvcnQpIGFicyArIDIpOwotCQkJICAgICAgfQotCQkJICAgIGVsc2UgewotCQkJICAgICAgZnByaW50ZiAoc3RyZWFtLCAiLiVzJWQgKCV4KSIsIChjaGFyKSBhYnMgPiAwID8gIisiIDogIiIsIChjaGFyKSBhYnMsCi0JCQkJICAgICAgIGFkZHIgKyAoY2hhcikgYWJzICsgMik7Ci0JCQkgICAgfQotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgRElTUCkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAoMHgleDolZCwlcykiLCBhYnMscGxlbiwgcHJlZ25hbWVzW3JkaXNwXSk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIENDUikKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgImNjciIpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgRVhSKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiZXhyIik7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCSAgZnByaW50ZiAoc3RyZWFtLCBfKCJIbW1tbSAleCIpLCB4KTsKLQkJCWhhZG9uZSA9IDE7Ci0JCQlhcmdzKys7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCSAgcmV0dXJuIHEtPmxlbmd0aDsKLQkJfQotCi0gICAgICAKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIGZwcmludGYgKHN0cmVhbSwgXygiRG9uJ3QgdW5kZXJzdGFuZCAleCBcbiIpLCBsb29raW5nX2Zvcik7Ci0JCX0KLQkgICAgfQotCSAgCi0JICBsZW4rKzsKLQkgIG5pYisrOwotCX0KLSAgICAgIAotICAgIGZhaWw6Ci0gICAgICBxKys7Ci0gICAgfQotCi0gIC8qIEZlbGwgb2YgdGhlIGVuZCAqLwotICBmcHJpbnRmIChzdHJlYW0sICIlMDJ4ICUwMnggICAgICAgIC53b3JkXHRIJyV4LEgnJXgiLAotCSAgIGRhdGFbMF0sIGRhdGFbMV0sCi0JICAgZGF0YVswXSwgZGF0YVsxXSk7Ci0gIHJldHVybiAyOwotfQotCi1pbnQgCi1wcmludF9pbnNuX2g4MzAwIChhZGRyLCBpbmZvKQotYmZkX3ZtYSBhZGRyOyAKLWRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBiZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8gLCAwKTsKLX0KLQotaW50IAotcHJpbnRfaW5zbl9oODMwMGggKGFkZHIsIGluZm8pCi1iZmRfdm1hIGFkZHI7Ci1kaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gYmZkX2g4X2Rpc2Fzc2VtYmxlIChhZGRyLCBpbmZvICwgMSk7Ci19Ci0KLWludCAKLXByaW50X2luc25faDgzMDBzIChhZGRyLCBpbmZvKQotYmZkX3ZtYSBhZGRyOwotZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbyAsIDIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9oODUwMC1kaXMuYyBiL29wY29kZXMvaDg1MDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODU4YzkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9oODUwMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBoODUwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgRElTQVNTRU1CTEVSX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAiaDg1MDAtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1BWExFTiA4Ci0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBwcml2YXRlICpwcml2ID0gKHN0cnVjdCBwcml2YXRlICopIGluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqY3JuYW1lW10gPQoteyJzciIsICJjY3IiLCAiKiIsICJiciIsICJlcCIsICJkcCIsICIqIiwgInRwIn07Ci0KLWludAotcHJpbnRfaW5zbl9oODUwMCAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGZwcmludGZfZnR5cGUgZnVuYyA9IGluZm8tPmZwcmludGZfZnVuYzsKLQotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICYgcHJpdjsKLSAgcHJpdi5tYXhfZmV0Y2hlZCA9IHByaXYudGhlX2J1ZmZlcjsKLSAgcHJpdi5pbnNuX3N0YXJ0ID0gYWRkcjsKLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIC8qIEVycm9yIHJldHVybi4gICovCi0gICAgcmV0dXJuIC0xOwotCi1pZiAoMCkgIHsKLSAgICBzdGF0aWMgICAgaW50IG9uZTsKLSAgICBpZiAoIW9uZSApIAotICAgICAgewotCW9uZSA9IDE7Ci0JZm9yIChvcGNvZGUgPSBoODUwMF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLQkgIHsKLQkgICAgaWYgKChvcGNvZGUtPmJ5dGVzWzBdLmNvbnRlbnRzICYgMHg4KSA9PSAwKQotCSAgICAgIHByaW50ZigiJXNcbiIsIG9wY29kZS0+bmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotCi0gIC8qIFJ1biBkb3duIHRoZSB0YWJsZSB0byBmaW5kIHRoZSBvbmUgd2hpY2ggbWF0Y2hlcyAqLwotICBmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGludCBieXRlOwotICAgICAgaW50IHJuID0gMDsKLSAgICAgIGludCByZCA9IDA7Ci0gICAgICBpbnQgcnMgPSAwOwotICAgICAgaW50IGRpc3AgPSAwOwotICAgICAgaW50IGFicyA9IDA7Ci0gICAgICBpbnQgaW1tID0gMDsKLSAgICAgIGludCBwY3JlbCA9IDA7Ci0gICAgICBpbnQgcWltID0gMDsKLSAgICAgIGludCBpOwotICAgICAgaW50IGNyID0gMDsKLSAgICAgIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBvcGNvZGUtPmxlbmd0aDsgYnl0ZSsrKQotCXsKLQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAxKTsKLQkgIGlmICgoYnVmZmVyW2J5dGVdICYgb3Bjb2RlLT5ieXRlc1tieXRlXS5tYXNrKQotCSAgICAgICE9IChvcGNvZGUtPmJ5dGVzW2J5dGVdLmNvbnRlbnRzKSkKLQkgICAgewotCSAgICAgIGdvdG8gbmV4dDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogZXh0cmFjdCBhbnkgaW5mbyBwYXJ0cyAqLwotCSAgICAgIHN3aXRjaCAob3Bjb2RlLT5ieXRlc1tieXRlXS5pbnNlcnQpCi0JCXsKLQkJY2FzZSAwOgotCQljYXNlIEZQOgotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgZnVuYyAoc3RyZWFtLCBfKCJjYW4ndCBjb3BlIHdpdGggaW5zZXJ0ICVkXG4iKSwKLQkJCW9wY29kZS0+Ynl0ZXNbYnl0ZV0uaW5zZXJ0KTsKLQkJICBicmVhazsKLQkJY2FzZSBSTjoKLQkJICBybiA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBicmVhazsKLQkJY2FzZSBSUzoKLQkJICBycyA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBicmVhazsKLQkJY2FzZSBDUkI6Ci0JCSAgY3IgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgaWYgKGNyID09IDApCi0JCSAgICBnb3RvIG5leHQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ1JXOgotCQkgIGNyID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGlmIChjciAhPSAwKQotCQkgICAgZ290byBuZXh0OwotCQkgIGJyZWFrOwotCQljYXNlIERJU1AxNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgZGlzcCA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRlBJTkRfRDg6Ci0JCWNhc2UgRElTUDg6Ci0JCSAgZGlzcCA9ICgoY2hhcikgKGJ1ZmZlcltieXRlXSkpOwotCQkgIGJyZWFrOwotCQljYXNlIFJEOgotCQljYXNlIFJESU5EOgotCQkgIHJkID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzI0OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAzKTsKLQkJICBhYnMgPQotCQkgICAgKGJ1ZmZlcltieXRlXSA8PCAxNikKLQkJICAgIHwgKGJ1ZmZlcltieXRlICsgMV0gPDwgOCkKLQkJICAgIHwgKGJ1ZmZlcltieXRlICsgMl0pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzE2OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKLQkJICBhYnMgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzg6Ci0JCSAgYWJzID0gKGJ1ZmZlcltieXRlXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgSU1NMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgSU1NNDoKLQkJICBpbW0gPSAoYnVmZmVyW2J5dGVdKSAmIDB4ZjsKLQkJICBicmVhazsKLQkJY2FzZSBJTU04OgotCQljYXNlIFJMSVNUOgotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0pOwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIHBjcmVsID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBQQ1JFTDg6Ci0JCSAgcGNyZWwgPSAoYnVmZmVyW2J5dGVdKTsKLQkJICBicmVhazsKLQkJY2FzZSBRSU06Ci0JCSAgc3dpdGNoIChidWZmZXJbYnl0ZV0gJiAweDcpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIHFpbSA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAxOgotCQkgICAgICBxaW0gPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgNDoKLQkJICAgICAgcWltID0gLTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA1OgotCQkgICAgICBxaW0gPSAtMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgLyogV2UgZ2V0IGhlcmUgd2hlbiBhbGwgdGhlIG1hc2tzIGhhdmUgcGFzc2VkIHNvIHdlIGNhbiBvdXRwdXQgdGhlCi0JIG9wZXJhbmRzKi8KLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIG9wY29kZS0+bGVuZ3RoKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBvcGNvZGUtPmxlbmd0aDsgaSsrKQotCXsKLQkgIChmdW5jKSAoc3RyZWFtLCAiJTAyeCAiLCBidWZmZXJbaV0pOwotCX0KLSAgICAgIGZvciAoOyBpIDwgNjsgaSsrKQotCXsKLQkgIChmdW5jKSAoc3RyZWFtLCAiICAgIik7Ci0JfQotICAgICAgKGZ1bmMpIChzdHJlYW0sICIlc1x0Iiwgb3Bjb2RlLT5uYW1lKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBvcGNvZGUtPm5hcmdzOyBpKyspCi0JewotCSAgaWYgKGkpCi0JICAgIChmdW5jKSAoc3RyZWFtLCAiLCIpOwotCSAgc3dpdGNoIChvcGNvZGUtPmFyZ190eXBlW2ldKQotCSAgICB7Ci0JICAgIGNhc2UgRlA6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiZnAiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORF9EMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjE2LHIlZCkiLCBkaXNwLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkRfRDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjggKCVkKSxyJWQpIiwgZGlzcCAmIDB4ZmYsIGRpc3AsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjE2LHIlZCkiLCBkaXNwLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkRfRDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjggKCVkKSwgciVkKSIsIGRpc3AgJiAweGZmLCBkaXNwLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRlBJTkRfRDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQCgweCV4OjggKCVkKSwgZnApIiwgZGlzcCAmIDB4ZmYsIGRpc3AsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUkI6Ci0JICAgIGNhc2UgQ1JXOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgY3JuYW1lW2NyXSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk46Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJEOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgInIlZCIsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSUzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJyJWQiLCBycyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5ERUM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQC1yJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHIlZCsiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAciVkIiwgcmQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQSU5DOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkBzcCsiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUERFQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJALXNwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMjQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQDB4JTB4OjI0IiwgYWJzKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAMHglMHg6MTYiLCBhYnMgJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQDB4JTB4OjgiLCBhYnMgJiAweGZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU0xNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjMHglMHg6MTYiLCBpbW0gJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJMSVNUOgotCSAgICAgIHsKLQkJaW50IGk7Ci0JCWludCBuYyA9IDA7Ci0JCWZ1bmMgKHN0cmVhbSwgIigiKTsKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJICB7Ci0JCSAgICBpZiAoaW1tICYgKDEgPDwgaSkpCi0JCSAgICAgIHsKLQkJCWZ1bmMgKHN0cmVhbSwgInIlZCIsIGkpOwotCQkJaWYgKG5jKQotCQkJICBmdW5jIChzdHJlYW0sICIsIik7Ci0JCQluYyA9IDE7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWZ1bmMgKHN0cmVhbSwgIikiKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NODoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjMHglMHg6OCIsIGltbSAmIDB4ZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiMHglMHg6MTYiLCAocGNyZWwgKyBhZGRyICsgb3Bjb2RlLT5sZW5ndGgpICYgMHhmZmZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiIzB4JTB4OjgiLAotCQkgICAgKChjaGFyKSBwY3JlbCArIGFkZHIgKyBvcGNvZGUtPmxlbmd0aCkgJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFFJTToKLQkgICAgICBmdW5jIChzdHJlYW0sICIjJWQ6cSIsIHFpbSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NNDoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjJWQ6NCIsIGltbSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gb3Bjb2RlLT5sZW5ndGg7Ci0gICAgbmV4dDo7Ci0gICAgfQotCi0gIC8qIENvdWxkbid0IHVuZGVyc3RhbmQgYW55dGhpbmcgKi8KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnVuYyAoc3RyZWFtLCBfKCIlMDJ4XHRcdCp1bmtub3duKiIpLCBidWZmZXJbMF0pOwotICByZXR1cm4gMTsKLQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9oODUwMC1vcGMuaCBiL29wY29kZXMvaDg1MDAtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTQ5YWYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9oODUwMC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4MzYgKzAsMCBAQAotdHlwZWRlZiBlbnVtCi17Ci0gIEdSMCxHUjEsR1IyLEdSMyxHUjQsR1I1LEdSNixHUjcsCi0gIEdQUjAsIEdQUjEsIEdQUjIsIEdQUjMsIEdQUjQsIEdQUjUsIEdQUjYsIEdQUjcsCi0gIEdDQ1IsIEdQQywgCi0gIEdTRUdDLCBHU0VHRCwgR1NFR0UsIEdTRUdULEdMQVNUCi19IGdkYnJlZ190eXBlOwotI2RlZmluZSBPX1hPUkMgMQotI2RlZmluZSBPX1hPUiAyCi0jZGVmaW5lIE9fWENIIDMKLSNkZWZpbmUgT19VTkxLIDQKLSNkZWZpbmUgT19UU1QgNQotI2RlZmluZSBPX1RSQVBBIDYKLSNkZWZpbmUgT19UUkFQX1ZTIDcKLSNkZWZpbmUgT19UQVMgOAotI2RlZmluZSBPX1NXQVAgOQotI2RlZmluZSBPX1NVQlggMTAKLSNkZWZpbmUgT19TVUJTIDExCi0jZGVmaW5lIE9fU1VCIDEyCi0jZGVmaW5lIE9fU1RNIDEzCi0jZGVmaW5lIE9fU1RDIDE0Ci0jZGVmaW5lIE9fU0xFRVAgMTUKLSNkZWZpbmUgT19TSExSIDE2Ci0jZGVmaW5lIE9fU0hMTCAxNwotI2RlZmluZSBPX1NIQVIgMTgKLSNkZWZpbmUgT19TSEFMIDE5Ci0jZGVmaW5lIE9fU0NCX05FIDIwCi0jZGVmaW5lIE9fU0NCX0YgMjEKLSNkZWZpbmUgT19TQ0JfRVEgMjIKLSNkZWZpbmUgT19SVFMgMjMKLSNkZWZpbmUgT19SVEQgMjQKLSNkZWZpbmUgT19ST1RYUiAyNQotI2RlZmluZSBPX1JPVFhMIDI2Ci0jZGVmaW5lIE9fUk9UUiAyNwotI2RlZmluZSBPX1JPVEwgMjgKLSNkZWZpbmUgT19QUlRTIDI5Ci0jZGVmaW5lIE9fUFJURCAzMAotI2RlZmluZSBPX1BKU1IgMzEKLSNkZWZpbmUgT19QSk1QIDMyCi0jZGVmaW5lIE9fT1JDIDMzCi0jZGVmaW5lIE9fT1IgMzQKLSNkZWZpbmUgT19OT1QgMzUKLSNkZWZpbmUgT19OT1AgMzYKLSNkZWZpbmUgT19ORUcgMzcKLSNkZWZpbmUgT19NVUxYVSAzOAotI2RlZmluZSBPX01PVlRQRSAzOQotI2RlZmluZSBPX01PVkZQRSA0MAotI2RlZmluZSBPX01PViA0MQotI2RlZmluZSBPX0xJTksgNDIKLSNkZWZpbmUgT19MRE0gNDMKLSNkZWZpbmUgT19MREMgNDQKLSNkZWZpbmUgT19KU1IgNDUKLSNkZWZpbmUgT19KTVAgNDYKLSNkZWZpbmUgT19FWFRVIDQ3Ci0jZGVmaW5lIE9fRVhUUyA0OAotI2RlZmluZSBPX0RTVUIgNDkKLSNkZWZpbmUgT19ESVZYVSA1MAotI2RlZmluZSBPX0RBREQgNTEKLSNkZWZpbmUgT19DTVAgNTIKLSNkZWZpbmUgT19DTFIgNTMKLSNkZWZpbmUgT19CVlMgNTQKLSNkZWZpbmUgT19CVkMgNTUKLSNkZWZpbmUgT19CVFNUIDU2Ci0jZGVmaW5lIE9fQlQgNTcKLSNkZWZpbmUgT19CU1IgNTgKLSNkZWZpbmUgT19CU0VUIDU5Ci0jZGVmaW5lIE9fQlJOIDYwCi0jZGVmaW5lIE9fQlJBIDYxCi0jZGVmaW5lIE9fQlBUIDYyCi0jZGVmaW5lIE9fQlBMIDYzCi0jZGVmaW5lIE9fQk5PVCA2NAotI2RlZmluZSBPX0JORSA2NQotI2RlZmluZSBPX0JNSSA2NgotI2RlZmluZSBPX0JMVCA2NwotI2RlZmluZSBPX0JMUyA2OAotI2RlZmluZSBPX0JMTyA2OQotI2RlZmluZSBPX0JMRSA3MAotI2RlZmluZSBPX0JIUyA3MQotI2RlZmluZSBPX0JISSA3MgotI2RlZmluZSBPX0JHVCA3MwotI2RlZmluZSBPX0JHRSA3NAotI2RlZmluZSBPX0JGIDc1Ci0jZGVmaW5lIE9fQkVRIDc2Ci0jZGVmaW5lIE9fQkNTIDc3Ci0jZGVmaW5lIE9fQkNMUiA3OAotI2RlZmluZSBPX0JDQyA3OQotI2RlZmluZSBPX0FOREMgODAKLSNkZWZpbmUgT19BTkQgODEKLSNkZWZpbmUgT19BRERYIDgyCi0jZGVmaW5lIE9fQUREUyA4MwotI2RlZmluZSBPX0FERCA4NAotI2RlZmluZSBPX0JZVEUgMTI4Ci0jZGVmaW5lIE9fV09SRCAweDAwMAotI2RlZmluZSBPX1VOU1ogMHgwMDAKLSNkZWZpbmUgRlBJTkRfRDgJMTAKLSNkZWZpbmUgUkRJTkRfRDE2CTExCi0jZGVmaW5lIFJESU5EX0Q4CTEyCi0jZGVmaW5lIFNQREVDCTEzCi0jZGVmaW5lIFJESU5ECTE0Ci0jZGVmaW5lIFJOCTE1Ci0jZGVmaW5lIFJOSU5EX0Q4CTE2Ci0jZGVmaW5lIFJOSU5EX0QxNgkxNwotI2RlZmluZSBSTkRFQwkxOAotI2RlZmluZSBSTklOQwkxOQotI2RlZmluZSBSTklORAkyMAotI2RlZmluZSBTUElOQwkyMQotI2RlZmluZSBBQlMxNgkyMgotI2RlZmluZSBBQlMyNAkyMwotI2RlZmluZSBQQ1JFTDE2CTI0Ci0jZGVmaW5lIFBDUkVMOAkyNQotI2RlZmluZSBBQlM4CTI2Ci0jZGVmaW5lIENSQgkyNwotI2RlZmluZSBDUgkyOAotI2RlZmluZSBDUlcJMjkKLSNkZWZpbmUgRElTUDE2CTMwCi0jZGVmaW5lIERJU1A4CTMxCi0jZGVmaW5lIEZQCTMyCi0jZGVmaW5lIElNTTE2CTMzCi0jZGVmaW5lIElNTTQJMzQKLSNkZWZpbmUgSU1NOAkzNQotI2RlZmluZSBSTElTVAkzNgotI2RlZmluZSBRSU0JMzcKLSNkZWZpbmUgUkQJMzgKLSNkZWZpbmUgUlMJMzkKLSNkZWZpbmUgU1AJNDAKLXR5cGVkZWYgZW51bSB7IEFDX0JBRCwgQUNfRUksIEFDX1JJLCBBQ19ELCBBQ18sQUNfRVJSLCBBQ19YLEFDX0IsIEFDX0VFLEFDX1JSLEFDX0lFLAotIEFDX1JFLEFDX0UsIEFDX0ksIEFDX0VSLEFDX0lSUiwgQUNfSVIsIEFDX1JFUiwgQUNfRVJFLEFDX0VJRSB9IGFkZHJfY2xhc3NfdHlwZTsgCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc2hvcnQgaW50IGlkeDsKLQljaGFyIGZsYWdzLHNyYzEsc3JjMixkc3Q7Ci0JdW5zaWduZWQgY2hhciBmbGF2b3I7Ci0JY2hhciAqbmFtZTsKLQlpbnQgbmFyZ3M7Ci0JaW50IGFyZ190eXBlWzJdOwotCWludCBsZW5ndGg7Ci0Jc3RydWN0IHsgdW5zaWduZWQgY2hhciBjb250ZW50czt1bnNpZ25lZCBjaGFyIG1hc2s7IGNoYXIgaW5zZXJ0OyB9IGJ5dGVzWzZdOwotfSBoODUwMF9vcGNvZGVfaW5mbzsKLWg4NTAwX29wY29kZV9pbmZvIGg4NTAwX3RhYmxlW10KLSNpZmRlZiBBU1NFTUJMRVJfVEFCTEUKLSNpZmRlZiBERUZJTkVfVEFCTEUKLT17Ci0vKgotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LAotCQkJCQkJCQkgICB7MHgwMCwweDAwLEFCUzE2IH0sCi0JCQkJCQkJCSAgIHsweDAwLDB4MDAsIH0sCi0JCQkJCQkJCSAgIHsweDA3LDB4ZmYsIH0sCi0JCQkJCQkJCSAgIHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sKi8KLQotezEsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX1dPUkQsInhvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LENSVyB9fX0sCi17MiwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fQllURSwieG9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NiwnLScsJ1gnLCchJywnIScsT19YQ0h8T19XT1JELCJ4Y2gudyIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCi17NywnLScsJ1gnLCchJywnIScsT19YQ0h8T19VTlNaLCJ4Y2giLDIse1JTLFJEfSwyLAl7ezB4YTgsMHhmOCxSUyB9LHsweDkwLDB4ZjgsUkQgfX19LAotezgsJy0nLCdCJywnIScsJyEnLE9fVU5MS3xPX1VOU1osInVubGsiLDEse0ZQLDB9LDEsCXt7MHgwZiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMiwnLScsJ0knLCchJywnIScsT19UUkFQQXxPX1VOU1osInRyYXBhIiwxLHtJTU00LDB9LDIsCXt7MHgwOCwweGZmLCB9LHsweDEwLDB4ZjAsSU1NNCB9fX0sCi17MTMsJy0nLCdCJywnIScsJyEnLE9fVFJBUF9WU3xPX1VOU1osInRyYXAvdnMiLDAsezAsMH0sMSwJe3sweDA5LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezE2LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19CWVRFLCJzd2FwLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAotezE3LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19VTlNaLCJzd2FwIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEwLDB4ZmYsIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNywnLScsJ0knLCchJywnRScsT19TVE18T19VTlNaLCJzdG0iLDIse1JMSVNULFNQREVDfSwyLAl7ezB4MTIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk59LDIsCQl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzEsJy0nLCchJywnIScsJyEnLE9fU0xFRVB8T19VTlNaLCJzbGVlcCIsMCx7MCwwfSwxLAl7ezB4MWEsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDQsJy0nLCdCJywnUycsJ1MnLE9fU0NCX05FfE9fVU5TWiwic2NiL25lIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwNiwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDUsJy0nLCdCJywnUycsJ1MnLE9fU0NCX0Z8T19VTlNaLCJzY2IvZiIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDEsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ2LCctJywnQicsJ1MnLCdTJyxPX1NDQl9FUXxPX1VOU1osInNjYi9lcSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDcsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ3LCctJywnQicsJyEnLCchJyxPX1JUU3xPX1VOU1osInJ0cyIsMCx7MCwwfSwxLAl7ezB4MTksMHhmZiwgfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NOCwwfSwyLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NMTYsMH0sMywJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYxLCctJywnQicsJyEnLCchJyxPX1BSVFN8T19VTlNaLCJwcnRzIiwwLHswLDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweDFjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzgsMHhmOCxSRElORCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse0FCUzI0LDB9LDQsCXt7MHgwMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzAsMHhmOCxSRElORCB9fX0sCi17NjQsJy0nLCdKJywnIScsJyEnLE9fUEpNUHxPX1VOU1osInBqbXAiLDEse0FCUzI0LDB9LDQsCXt7MHgxMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2NSwncycsJ0knLCdDJywnQycsT19PUkN8T19XT1JELCJvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LENSVyB9fX0sCi17NjYsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fQllURSwib3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCi17NjcsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fVU5TWiwib3JjIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDgsMHhmOCxDUkIgfX19LAotezY3LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1VOU1osIm9yYyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LENSVyB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezc0LCctJywnIScsJyEnLCchJyxPX05PUHxPX1VOU1osIm5vcCIsMCx7MCwwfSwxLAl7ezB4MDAsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOLFJEfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5DLFJEfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5ELFJEfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOREVDLFJEfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5EX0Q4LFJEfSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDE2LFJEfSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5DLFJEfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTklORCxSRH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtBQlM4LFJEfSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5EX0QxNixSRH0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6cy53IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OnMuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpzIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODgsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmwudyIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg5LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpsLmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs5MCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6bCIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezkxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTIsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmkiLCAgMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTixSRH0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUse3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk2LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk2LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk3LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk4LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpmIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTksJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMCwnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZSIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi0vKnsxMDMsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJEfSwyLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sKi8KLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORH0sMywJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklOQ30sMywJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NOH0sMiwJe3sweDE3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTE2fSwzLAl7ezB4MWYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNSwnLScsJ0UnLCchJywnQycsT19MRE18T19VTlNaLCJsZG0iLDIse1NQSU5DLFJMSVNUfSwyLAl7ezB4MDIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOLENSV30sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkQsQ1JXfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5DLENSV30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTkRFQyxDUld9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7QUJTOCxDUld9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5EX0Q4LENSV30sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtBQlMxNixDUld9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5EX0QxNixDUld9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOLENSQn0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5DLENSQn0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORCxDUkJ9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzgsQ1JCfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzE2LENSQn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOLENSV30sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk4sQ1JCfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklOQyxDUld9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5ELENSQn0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5ERUMsQ1JXfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORCxDUld9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOREVDLENSQn0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkMsQ1JCfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlM4LENSV30sMywJCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlM4LENSQn0sMywJCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtJTU04LENSQn0sMywJCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EOCxDUld9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlMxNixDUkJ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlMxNixDUld9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EMTYsQ1JXfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQ4LDB4ZjgsUkQgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse0FCUzE2LDB9LDMsCXt7MHgxOCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTgsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjgsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhkMCwweGY4LFJEIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTAsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGUwLDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweGYwLDB4ZjgsUkRJTkRfRDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17MTExLCdzJywnRCcsJyEnLCdEJyxPX0VYVFV8T19CWVRFLCJleHR1LmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTIsMHhmZiwgfX19LAotezExMiwncycsJ0QnLCchJywnRCcsT19FWFRVfE9fVU5TWiwiZXh0dSIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCi17MTEzLCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19CWVRFLCJleHRzLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTEsMHhmZiwgfX19LAotezExNCwncycsJ0QnLCchJywnRCcsT19FWFRTfE9fVU5TWiwiZXh0cyIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMSwweGZmLCB9fX0sCi17MTE1LCdzJywnRCcsJyEnLCchJyxPX0RTVUJ8T19VTlNaLCJkc3ViIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE5LCdzJywnRCcsJyEnLCchJyxPX0RBRER8T19VTlNaLCJkYWRkIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezEyMCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6aSIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LHt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTixSRH0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LHt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI1LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg0MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjYsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmUiLDIse0lNTTgsUkR9LDIsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LHt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTixSRH0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTgsUkR9LDIsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtBQlM4LFJEfSwzLAkJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk59LDQsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMywnLScsJ0InLCchJywnIScsT19CVlN8T19XT1JELCJidnMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTM0LCctJywnQicsJyEnLCchJyxPX0JWU3xPX0JZVEUsImJ2cy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzNSwnLScsJ0InLCchJywnIScsT19CVlN8T19VTlNaLCJidnMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM1LCctJywnQicsJyEnLCchJyxPX0JWU3xPX1VOU1osImJ2cyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTM2LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1dPUkQsImJ2Yy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzcsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fQllURSwiYnZjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM4LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1VOU1osImJ2YyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzgsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fVU5TWiwiYnZjIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQyLCctJywnQicsJyEnLCchJyxPX0JUfE9fV09SRCwiYnQudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTQzLCctJywnQicsJyEnLCchJyxPX0JUfE9fQllURSwiYnQuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDQsJy0nLCdCJywnIScsJyEnLE9fQlR8T19VTlNaLCJidCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDQsJy0nLCdCJywnIScsJyEnLE9fQlR8T19VTlNaLCJidCIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTQ1LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1dPUkQsImJzci53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgxZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDYsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fQllURSwiYnNyLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MGUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTQ3LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1VOU1osImJzciIsMSx7UENSRUw4LDB9LDIsCXt7MHgwZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDcsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fVU5TWiwiYnNyIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgxZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUxLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1dPUkQsImJybi53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTIsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fQllURSwiYnJuLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTUzLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1VOU1osImJybiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTMsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fVU5TWiwiYnJuIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTQsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fV09SRCwiYnJhLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1NSwnLScsJ0InLCchJywnIScsT19CUkF8T19CWVRFLCJicmEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTYsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fVU5TWiwiYnJhIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1NiwnLScsJ0InLCchJywnIScsT19CUkF8T19VTlNaLCJicmEiLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1NywnLScsJyEnLCchJywnIScsT19CUFR8T19VTlNaLCJicHQiLDAsezAsMH0sMSwJe3sweDBiLDB4ZmYsIH19fSwKLXsxNTgsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fV09SRCwiYnBsLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1OSwnLScsJ0InLCchJywnIScsT19CUEx8T19CWVRFLCJicGwuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjAsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fVU5TWiwiYnBsIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2MCwnLScsJ0InLCchJywnIScsT19CUEx8T19VTlNaLCJicGwiLDEse1BDUkVMMTYsMH0sMywJe3sweDNhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjQsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fV09SRCwiYm5lLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2NSwnLScsJ0InLCchJywnIScsT19CTkV8T19CWVRFLCJibmUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjYsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fVU5TWiwiYm5lIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2NiwnLScsJ0InLCchJywnIScsT19CTkV8T19VTlNaLCJibmUiLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2NywnLScsJ0InLCchJywnIScsT19CTUl8T19XT1JELCJibWkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2IsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY4LCctJywnQicsJyEnLCchJyxPX0JNSXxPX0JZVEUsImJtaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2OSwnLScsJ0InLCchJywnIScsT19CTUl8T19VTlNaLCJibWkiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY5LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1VOU1osImJtaSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2IsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTcwLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1dPUkQsImJsdC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzEsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fQllURSwiYmx0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTcyLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1VOU1osImJsdCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzIsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fVU5TWiwiYmx0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzMsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fV09SRCwiYmxzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3NCwnLScsJ0InLCchJywnIScsT19CTFN8T19CWVRFLCJibHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzUsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fVU5TWiwiYmxzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3NSwnLScsJ0InLCchJywnIScsT19CTFN8T19VTlNaLCJibHMiLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3NiwnLScsJ0InLCchJywnIScsT19CTE98T19XT1JELCJibG8udyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc3LCctJywnQicsJyEnLCchJyxPX0JMT3xPX0JZVEUsImJsby5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3OCwnLScsJ0InLCchJywnIScsT19CTE98T19VTlNaLCJibG8iLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc4LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1VOU1osImJsbyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc5LCctJywnQicsJyEnLCchJyxPX0JMRXxPX1dPUkQsImJsZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODAsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fQllURSwiYmxlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTgxLCctJywnQicsJyEnLCchJyxPX0JMRXxPX1VOU1osImJsZSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODEsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fVU5TWiwiYmxlIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODIsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fV09SRCwiYmhzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4MywnLScsJ0InLCchJywnIScsT19CSFN8T19CWVRFLCJiaHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODQsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fVU5TWiwiYmhzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NCwnLScsJ0InLCchJywnIScsT19CSFN8T19VTlNaLCJiaHMiLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4NSwnLScsJ0InLCchJywnIScsT19CSEl8T19XT1JELCJiaGkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg2LCctJywnQicsJyEnLCchJyxPX0JISXxPX0JZVEUsImJoaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NywnLScsJ0InLCchJywnIScsT19CSEl8T19VTlNaLCJiaGkiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg3LCctJywnQicsJyEnLCchJyxPX0JISXxPX1VOU1osImJoaSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg4LCctJywnQicsJyEnLCchJyxPX0JHVHxPX1dPUkQsImJndC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODksJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fQllURSwiYmd0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTkwLCctJywnQicsJyEnLCchJyxPX0JHVHxPX1VOU1osImJndCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTAsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fVU5TWiwiYmd0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTEsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fV09SRCwiYmdlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5MiwnLScsJ0InLCchJywnIScsT19CR0V8T19CWVRFLCJiZ2UuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTMsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fVU5TWiwiYmdlIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MywnLScsJ0InLCchJywnIScsT19CR0V8T19VTlNaLCJiZ2UiLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NCwnLScsJ0InLCchJywnIScsT19CRnxPX1dPUkQsImJmLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NSwnLScsJ0InLCchJywnIScsT19CRnxPX0JZVEUsImJmLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk2LCctJywnQicsJyEnLCchJyxPX0JGfE9fVU5TWiwiYmYiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk2LCctJywnQicsJyEnLCchJyxPX0JGfE9fVU5TWiwiYmYiLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NywnLScsJ0InLCchJywnIScsT19CRVF8T19XT1JELCJiZXEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk4LCctJywnQicsJyEnLCchJyxPX0JFUXxPX0JZVEUsImJlcS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5OSwnLScsJ0InLCchJywnIScsT19CRVF8T19VTlNaLCJiZXEiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk5LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1VOU1osImJlcSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjAwLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1dPUkQsImJjcy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDEsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fQllURSwiYmNzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjAyLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1VOU1osImJjcyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDIsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fVU5TWiwiYmNzIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA2LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1dPUkQsImJjYy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDcsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fQllURSwiYmNjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjA4LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1VOU1osImJjYyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDgsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fVU5TWiwiYmNjIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDksJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1dPUkQsImFuZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCi17MjEwLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19CWVRFLCJhbmRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1OCwweGY4LENSQiB9fX0sCi17MjExLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19VTlNaLCJhbmRjIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTgsMHhmOCxDUkIgfX19LAotezIxMSwncycsJ0knLCdTJywnUycsT19BTkRDfE9fVU5TWiwiYW5kYyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLTAsMCwwfQotI2VuZGlmCi07Ci0jZW5kaWYKLSNpZmRlZiBESVNBU1NFTUJMRVJfVEFCTEUKLSNpZmRlZiBERUZJTkVfVEFCTEUKLT17Ci17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzMCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezYsJy0nLCdYJywnIScsJyEnLE9fWENIfE9fV09SRCwieGNoLnciLDIse1JTLFJEfSwyLAl7ezB4YTgsMHhmOCxSUyB9LHsweDkwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxNiwnbScsJ0QnLCchJywnRCcsT19TV0FQfE9fV09SRCwic3dhcC5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEwLDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTcsMHhmZiwgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezIsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX0JZVEUsInhvcmMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDY4LDB4ZjgsQ1JCIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNiwweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTcsMHhmZiwgfX19LAotezEyLCctJywnSScsJyEnLCchJyxPX1RSQVBBfE9fVU5TWiwidHJhcGEiLDEse0lNTTQsMH0sMiwJe3sweDA4LDB4ZmYsIH0sezB4MTAsMHhmMCxJTU00IH19fSwKLXsxMywnLScsJ0InLCchJywnIScsT19UUkFQX1ZTfE9fVU5TWiwidHJhcC92cyIsMCx7MCwwfSwxLAl7ezB4MDksMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsxLCdzJywnRScsJ0MnLCdDJyxPX1hPUkN8T19XT1JELCJ4b3JjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxDUlcgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezgsJy0nLCdCJywnIScsJyEnLE9fVU5MS3xPX1VOU1osInVubGsiLDEse0ZQLDB9LDEsCXt7MHgwZiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyNywnLScsJ0knLCchJywnRScsT19TVE18T19VTlNaLCJzdG0iLDIse1JMSVNULFNQREVDfSwyLAl7ezB4MTIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWIsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMSwnLScsJyEnLCchJywnIScsT19TTEVFUHxPX1VOU1osInNsZWVwIiwwLHswLDB9LDEsCXt7MHgxYSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOCwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0NSwnLScsJ0InLCdTJywnUycsT19TQ0JfRnxPX1VOU1osInNjYi9mIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwMSwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0NCwnLScsJ0InLCdTJywnUycsT19TQ0JfTkV8T19VTlNaLCJzY2IvbmUiLDIse1JTLFBDUkVMOH0sMywJe3sweDA2LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0NiwnLScsJ0InLCdTJywnUycsT19TQ0JfRVF8T19VTlNaLCJzY2IvZXEiLDIse1JTLFBDUkVMOH0sMywJe3sweDA3LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NMTYsMH0sMywJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs0OCwnLScsJ0InLCchJywnIScsT19SVER8T19VTlNaLCJydGQiLDEse0lNTTgsMH0sMiwJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDcsJy0nLCdCJywnIScsJyEnLE9fUlRTfE9fVU5TWiwicnRzIiwwLHswLDB9LDEsCXt7MHgxOSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezk5LCdtJywnSScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDgwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NywnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDkwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezg5LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpsLmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6bC53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OnMuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpzLnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse0FCUzI0LDB9LDQsCXt7MHgwMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY2LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX0JZVEUsIm9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDgsMHhmOCxDUkIgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNSwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezc0LCctJywnIScsJyEnLCchJyxPX05PUHxPX1VOU1osIm5vcCIsMCx7MCwwfSwxLAl7ezB4MDAsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY1LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1dPUkQsIm9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzAsMHhmOCxSRElORCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGM4LDB4ZjgsUkRJTkQgfX19LAotezYyLCctJywnQicsJyEnLCchJyxPX1BSVER8T19VTlNaLCJwcnRkIiwxLHtJTU04LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs2MSwnLScsJ0InLCchJywnIScsT19QUlRTfE9fVU5TWiwicHJ0cyIsMCx7MCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHgxOSwweGZmLCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweDFjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7QUJTMjQsMH0sNCwJe3sweDEzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkQsUkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EMTYsUkR9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLQotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTMTYsUkR9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17MTI1LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg0MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk59LDQsCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk4sQ1JCfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMjAsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmkudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTksJ3MnLCdEJywnIScsJyEnLE9fREFERHxPX1VOU1osImRhZGQiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTE1LCdzJywnRCcsJyEnLCchJyxPX0RTVUJ8T19VTlNaLCJkc3ViIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezExMywncycsJ0QnLCchJywnRCcsT19FWFRTfE9fQllURSwiZXh0cy5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDExLDB4ZmYsIH19fSwKLXsxMTEsJ3MnLCdEJywnIScsJ0QnLE9fRVhUVXxPX0JZVEUsImV4dHUuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0QxNixDUkJ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTAsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQwLDB4ZjgsUkQgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQ4LDB4ZjgsUkQgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGUwLDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTgsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjAsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjgsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTgsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTMTYsQ1JCfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklOQyxDUkJ9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkQsQ1JCfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtBQlM4LENSQn0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOREVDLENSQn0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTA1LCctJywnRScsJyEnLCdDJyxPX0xETXxPX1VOU1osImxkbSIsMix7U1BJTkMsUkxJU1R9LDIsCXt7MHgwMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTE2fSwzLAl7ezB4MWYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NOH0sMiwJe3sweDE3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzcsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fQllURSwiYnZjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM0LCctJywnQicsJyEnLCchJyxPX0JWU3xPX0JZVEUsImJ2cy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzNiwnLScsJ0InLCchJywnIScsT19CVkN8T19XT1JELCJidmMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTMzLCctJywnQicsJyEnLCchJyxPX0JWU3xPX1dPUkQsImJ2cy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ2LCctJywnQicsJyEnLCchJyxPX0JTUnxPX0JZVEUsImJzci5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDBlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDUsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fV09SRCwiYnNyLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTAsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX0JZVEUsImFuZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDU4LDB4ZjgsQ1JCIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA5LCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19XT1JELCJhbmRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxDUlcgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezE1NywnLScsJyEnLCchJywnIScsT19CUFR8T19VTlNaLCJicHQiLDAsezAsMH0sMSwJe3sweDBiLDB4ZmYsIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNTUsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fQllURSwiYnJhLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNTIsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fQllURSwiYnJuLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg2LCctJywnQicsJyEnLCchJyxPX0JISXxPX0JZVEUsImJoaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3NCwnLScsJ0InLCchJywnIScsT19CTFN8T19CWVRFLCJibHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDcsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fQllURSwiYmNjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjAxLCctJywnQicsJyEnLCchJyxPX0JDU3xPX0JZVEUsImJjcy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2NSwnLScsJ0InLCchJywnIScsT19CTkV8T19CWVRFLCJibmUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTgsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fQllURSwiYmVxLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU5LCctJywnQicsJyEnLCchJyxPX0JQTHxPX0JZVEUsImJwbC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2OCwnLScsJ0InLCchJywnIScsT19CTUl8T19CWVRFLCJibWkuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTIsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fQllURSwiYmdlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTcxLCctJywnQicsJyEnLCchJyxPX0JMVHxPX0JZVEUsImJsdC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4OSwnLScsJ0InLCchJywnIScsT19CR1R8T19CWVRFLCJiZ3QuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODAsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fQllURSwiYmxlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU0LCctJywnQicsJyEnLCchJyxPX0JSQXxPX1dPUkQsImJyYS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTEsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fV09SRCwiYnJuLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4NSwnLScsJ0InLCchJywnIScsT19CSEl8T19XT1JELCJiaGkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTczLCctJywnQicsJyEnLCchJyxPX0JMU3xPX1dPUkQsImJscy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDYsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fV09SRCwiYmNjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMCwnLScsJ0InLCchJywnIScsT19CQ1N8T19XT1JELCJiY3MudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY0LCctJywnQicsJyEnLCchJyxPX0JORXxPX1dPUkQsImJuZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTcsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fV09SRCwiYmVxLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1OCwnLScsJ0InLCchJywnIScsT19CUEx8T19XT1JELCJicGwudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY3LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1dPUkQsImJtaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTEsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fV09SRCwiYmdlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MCwnLScsJ0InLCchJywnIScsT19CTFR8T19XT1JELCJibHQudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2QsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg4LCctJywnQicsJyEnLCchJyxPX0JHVHxPX1dPUkQsImJndC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzksJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fV09SRCwiYmxlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotLyogCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk4gICdzJywnQycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOREVDICAncycsJ0MnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkQgICdzJywnQycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUlMsUkQgICctJywnWCcsJyEnLCchJwotUk4sMCAgJ2EnLCdFJywnIScsJyEnCi1SUyxSRCAgJy0nLCdYJywnIScsJyEnCi1STiwwICAnYScsJ0UnLCchJywnIScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdhJywnRScsJyEnLCchJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQywwICAnYScsJ0UnLCchJywnIScKLVJOSU5DLDAgICdhJywnRScsJyEnLCchJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJyEnCi1STklORCwwICAnYScsJ0UnLCchJywnIScKLVJOREVDLDAgICdhJywnRScsJyEnLCchJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlM4LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCi1SRCwwICAnbScsJ0QnLCchJywnRCcKLUFCUzE2LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCchJwotUk4sMCAgJ3MnLCdFJywnIScsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQywwICAncycsJ0UnLCchJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdzJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAncycsJ0UnLCchJywnRScKLVJOLDAgICdzJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklOQywwICAncycsJ0UnLCchJywnRScKLVJOREVDLDAgICdzJywnRScsJyEnLCdFJwotSU1NOCwwICAncycsJ0UnLCchJywnRScKLUFCUzgsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAncycsJ0UnLCchJywnRScKLUFCUzE2LDAgICdzJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdzJywnRScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotUkQsMCAgJ20nLCdEJywnIScsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LDAgICdzJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICctJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdFJywnQycsJ0MnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsMCAgJ2EnLCdFJywnIScsJyEnCi1JTU04LDAgICdzJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLEFCUzggICdzJywnQycsJyEnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdhJywnRScsJyEnLCchJwotQUJTOCwwICAncycsJ0UnLCchJywnRScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTQsMCAgJy0nLCdJJywnIScsJyEnCi0wLDAgICctJywnQicsJyEnLCchJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsQ1JXICAncycsJ0UnLCdDJywnQycKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LDAgICdhJywnRScsJyEnLCchJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdhJywnRScsJyEnLCchJwotRlAsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsQUJTMTYgICdzJywnQycsJyEnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUkxJU1QsU1BERUMgICctJywnSScsJyEnLCdFJwotQ1JXLFJOICAncycsJ0MnLCchJywnRScKLUNSVyxSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkMgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EICAncycsJ0MnLCchJywnRScKLUNSVyxBQlM4ICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EOCAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsQUJTMTYgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnIScKLUFCUzE2LDAgICdzJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1DUlcsUk4gICdzJywnQycsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUkIsUk5ERUMgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EICAncycsJ0MnLCchJywnRScKLUNSVyxSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5ERUMgICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5EICAncycsJ0MnLCchJywnRScKLUNSQixSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotQ1JCLEFCUzggICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLUNSVyxBQlM4ICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EMTYgICdzJywnQycsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUkIsQUJTMTYgICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQ1JXLEFCUzE2ICAncycsJ0MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUkIsUk4gICdzJywnQycsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi0wLDAgICctJywnIScsJyEnLCchJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxQQ1JFTDggICctJywnQicsJ1MnLCdTJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCi1SUyxQQ1JFTDggICctJywnQicsJ1MnLCdTJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICctJywnQicsJyEnLCchJwotSU1NOCwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLTAsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STixSRCAgJy0nLCdFJywnIScsJ0QnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCchJywnRCcKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxSTiAgJy0nLCdTJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdwJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJ0UnCi1STiwwICAnbScsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdwJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJ0UnCi1STiwwICAnbScsJ0UnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOREVDICAnLScsJ1MnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdhJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ20nLCdFJywnIScsJ0UnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQywwICAnbScsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklOQywwICAnbScsJ0UnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdhJywnRScsJyEnLCdFJwotSU1NOCxDUkIgICdzJywnSScsJ0MnLCdDJwotSU1NMTYsQ1JXICAncycsJ0knLCdDJywnQycKLVJOSU5DLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdtJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdtJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzI0LDAgICctJywnSicsJyEnLCchJwotSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdJJywnQycsJ0MnCi1JTU04LDAgICdhJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlM4LDAgICdhJywnRScsJyEnLCdFJwotQUJTOCwwICAnbScsJ0UnLCchJywnRScKLVJOLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCi1STkRFQywwICAnbScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdtJywnRScsJyEnLCdFJwotQUJTOCwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLTAsMCAgJy0nLCchJywnIScsJyEnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsQ1JXICAncycsJ0knLCdDJywnQycKLUlNTTE2LDAgICdhJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCwwICAnYScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUkRJTkQsMCAgJy0nLCdKJywnIScsJyEnCi1SRElORCwwICAnLScsJ0onLCchJywnIScKLUlNTTgsMCAgJy0nLCdCJywnIScsJyEnCi0wLDAgICctJywnQicsJyEnLCchJwotSU1NMTYsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMyNCwwICAnLScsJ0onLCchJywnIScKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOLDAgICdhJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklOQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdhJywnRScsJyEnLCdFJwotQUJTOCwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnYScsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKLVJOREVDLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1BQlMxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1SUyxSTklOQyAgJy0nLCdTJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOSU5EICAnLScsJ1MnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5JTkRfRDggICctJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJy0nLCdTJywnIScsJ0UnCi1SUyxBQlM4ICAnLScsJ1MnLCchJywnRScKLVJTLFJOICAnLScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnLScsJ1MnLCchJywnRScKLVJTLFJOSU5EICAnLScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnLScsJ1MnLCchJywnRScKLVJTLEFCUzggICctJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICctJywnRScsJyEnLCdEJwotUlMsQUJTMTYgICctJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnLScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnLScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICctJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1STixSRCAgJy0nLCdFJywnIScsJ0QnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnLScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICctJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJyEnLCdEJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STklOQyxSRCAgJy0nLCdFJywnIScsJ0QnCi1JTU04LFJOREVDICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOREVDICAnbScsJ0knLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICctJywnRScsJyEnLCdEJwotUlMsQUJTMTYgICctJywnUycsJyEnLCdFJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotQUJTMTYsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotQUJTMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnbScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklOQyAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTkRFQyAgJ20nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJ20nLCdJJywnIScsJ0QnCi1JTU04LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk4gICdhJywnRScsJ0knLCchJwotUk4sQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5ELENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk5ERUMsQ1JXICAncycsJ0UnLCchJywnQycKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1JTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STixDUkIgICdzJywnRScsJyEnLCdDJwotQUJTOCxDUlcgICdzJywnRScsJyEnLCdDJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk4sUkQgICdzJywnRScsJ0QnLCdEJwotUlMsUkQgICdzJywnRCcsJyEnLCchJwotUlMsUkQgICdzJywnRCcsJyEnLCchJwotUkQsMCAgJ3MnLCdEJywnIScsJ0QnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLVJOLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STixDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkMsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5ELENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkQsQ1JXICAncycsJ0UnLCchJywnQycKLVJOREVDLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxDUkIgICdzJywnRScsJyEnLCdDJwotQUJTOCxDUlcgICdzJywnRScsJyEnLCdDJwotQUJTOCxDUkIgICdzJywnRScsJyEnLCdDJwotSU1NOCxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDgsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0Q4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlMxNixDUkIgICdzJywnRScsJyEnLCdDJwotQUJTMTYsQ1JXICAncycsJ0UnLCchJywnQycKLUlNTTE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0QxNixDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlMxNiwwICAnLScsJ0InLCchJywnIScKLVJESU5ELDAgICctJywnQicsJyEnLCchJwotUkRJTkQsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EOCwwICAnLScsJ0InLCchJywnIScKLVJESU5EX0Q4LDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDE2LDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDE2LDAgICctJywnQicsJyEnLCchJwotQUJTMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLUFCUzE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLVJOLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklOQyxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkQsQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NOCxDUkIgICdzJywnRScsJyEnLCdDJwotSU1NOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncycsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncycsJ0UnLCdEJywnRCcKLVJOLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAncycsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzgsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzgsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsQ1JCICAncycsJ0UnLCchJywnQycKLUlNTTgsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotU1BJTkMsUkxJU1QgICctJywnRScsJyEnLCdDJwotSU1NOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotRlAsSU1NMTYgICctJywnUycsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotRlAsSU1NOCAgJy0nLCdTJywnSScsJyEnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk5JTkMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTiAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLUlNTTgsUk5JTkMgICdhJywnRScsJ0knLCchJwotSU1NOCxSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlM4ICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTMTYgICdhJywnRScsJ0knLCchJwotSU1NOCxSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnSScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUk4sMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUk5ERUMsMCAgJ2MnLCchJywnIScsJ0UnCi1STklOQywwICAnYycsJyEnLCchJywnRScKLVJOSU5ELDAgICdjJywnIScsJyEnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDgsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDE2LDAgICdjJywnIScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdjJywnIScsJyEnLCdFJwotSU1NOCwwICAnYycsJyEnLCchJywnRScKLUFCUzgsMCAgJ2MnLCchJywnIScsJ0UnCi1STiwwICAnYycsJyEnLCchJywnRScKLVJOSU5ELDAgICdjJywnIScsJyEnLCdFJwotUk5JTkMsMCAgJ2MnLCchJywnIScsJ0UnCi1STkRFQywwICAnYycsJyEnLCchJywnRScKLUFCUzgsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORF9EOCwwICAnYycsJyEnLCchJywnRScKLUlNTTE2LDAgICdjJywnIScsJyEnLCdFJwotQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1STkRFQywwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0Q4LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTE2LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotQUJTOCwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUFCUzE2LDAgICdjJywnIScsJyEnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJOSU5DLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJOSU5ELDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxDUkIgICdzJywnSScsJ1MnLCdTJwotSU1NMTYsQ1JXICAncycsJ0knLCdTJywnUycKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICctJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdJJywnUycsJ1MnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsQ1JXICAncycsJ0knLCdTJywnUycKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotMCwwICAnLScsJyEnLCchJywnIScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi0qLyAKLXswLDAsMH19Ci0jZW5kaWYKLTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9ocHBhLWRpcy5jIGIvb3Bjb2Rlcy9ocHBhLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTM0ZmRjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaHBwYS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMTIgKzAsMCBAQAotLyogRGlzYXNzZW1ibGVyIGZvciB0aGUgUEEtUklTQy4gU29tZXdoYXQgZGVyaXZlZCBmcm9tIHNwYXJjLXBpbnNuLmMuCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MCwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAibGliaHBwYS5oIgotI2luY2x1ZGUgIm9wY29kZS9ocHBhLmgiCi0KLS8qIEludGVnZXIgcmVnaXN0ZXIgbmFtZXMsIGluZGV4ZWQgYnkgdGhlIG51bWJlcnMgd2hpY2ggYXBwZWFyIGluIHRoZQotICAgb3Bjb2Rlcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmVnX25hbWVzW10gPSAKLSB7ImZsYWdzIiwgInIxIiwgInJwIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwgInI4IiwgInI5IiwKLSAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgInIxNiIsICJyMTciLCAicjE4IiwgInIxOSIsCi0gICJyMjAiLCAicjIxIiwgInIyMiIsICJyMjMiLCAicjI0IiwgInIyNSIsICJyMjYiLCAiZHAiLCAicmV0MCIsICJyZXQxIiwKLSAgInNwIiwgInIzMSJ9OwotCi0vKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciBuYW1lcywgaW5kZXhlZCBieSB0aGUgbnVtYmVycyB3aGljaCBhcHBlYXIgaW4gdGhlCi0gICBvcGNvZGVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmcF9yZWdfbmFtZXNbXSA9IAotIHsiZnBzciIsICJmcGUyIiwgImZwZTQiLCAiZnBlNiIsIAotICAiZnI0IiwgImZyNSIsICJmcjYiLCAiZnI3IiwgImZyOCIsIAotICAiZnI5IiwgImZyMTAiLCAiZnIxMSIsICJmcjEyIiwgImZyMTMiLCAiZnIxNCIsICJmcjE1IiwgCi0gICJmcjE2IiwgImZyMTciLCAiZnIxOCIsICJmcjE5IiwgImZyMjAiLCAiZnIyMSIsICJmcjIyIiwgImZyMjMiLAotICAiZnIyNCIsICJmcjI1IiwgImZyMjYiLCAiZnIyNyIsICJmcjI4IiwgImZyMjkiLCAiZnIzMCIsICJmcjMxIn07Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50IENPUkVfQUREUjsKLQotLyogR2V0IGF0IHZhcmlvdXMgcmVsZXZlbnQgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uIHdvcmQuICovCi0KLSNkZWZpbmUgTUFTS181IDB4MWYKLSNkZWZpbmUgTUFTS18xMCAweDNmZgotI2RlZmluZSBNQVNLXzExIDB4N2ZmCi0jZGVmaW5lIE1BU0tfMTQgMHgzZmZmCi0jZGVmaW5lIE1BU0tfMjEgMHgxZmZmZmYKLQotLyogVGhpcyBtYWNybyBnZXRzIGJpdCBmaWVsZHMgdXNpbmcgSFAncyBudW1iZXJpbmcgKE1TQiA9IDApICovCi0KLSNkZWZpbmUgR0VUX0ZJRUxEKFgsIEZST00sIFRPKSBcCi0gICgoWCkgPj4gKDMxIC0gKFRPKSkgJiAoKDEgPDwgKChUTykgLSAoRlJPTSkgKyAxKSkgLSAxKSkKLQotLyogU29tZSBvZiB0aGVzZSBoYXZlIGJlZW4gY29udmVydGVkIHRvIDItZCBhcnJheXMgYmVjYXVzZSB0aGV5Ci0gICBjb25zdW1lIGxlc3Mgc3RvcmFnZSB0aGlzIHdheS4gIElmIHRoZSBtYWludGVuYW5jZSBiZWNvbWVzIGEKLSAgIHByb2JsZW0sIGNvbnZlcnQgdGhlbSBiYWNrIHRvIGNvbnN0IDEtZCBwb2ludGVyIGFycmF5cy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29udHJvbF9yZWdbXSA9IHsKLSAgInJjdHIiLCAiY3IxIiwgImNyMiIsICJjcjMiLCAiY3I0IiwgImNyNSIsICJjcjYiLCAiY3I3IiwKLSAgInBpZHIxIiwgInBpZHIyIiwgImNjciIsICJzYXIiLCAicGlkcjMiLCAicGlkcjQiLAotICAiaXZhIiwgImVpZW0iLCAiaXRtciIsICJwY3NxIiwgInBjb3EiLCAiaWlyIiwgImlzciIsCi0gICJpb3IiLCAiaXBzdyIsICJlaXJyIiwgInRyMCIsICJ0cjEiLCAidHIyIiwgInRyMyIsCi0gICJ0cjQiLCAidHI1IiwgInRyNiIsICJ0cjciCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29tcGFyZV9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLDw9IiwgIiw8PCIsICIsPDw9IiwgIixzdiIsICIsb2QiLAotICAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAiLD4+PSIsICIsPj4iLCAiLG5zdiIsICIsZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbXBhcmVfY29uZF82NF9uYW1lc1tdID0gewotICAiIiwgIiwqPSIsICIsKjwiLCAiLCo8PSIsICIsKjw8IiwgIiwqPDw9IiwgIiwqc3YiLCAiLCpvZCIsCi0gICIsKnRyIiwgIiwqPD4iLCAiLCo+PSIsICIsKj4iLCAiLCo+Pj0iLCAiLCo+PiIsICIsKm5zdiIsICIsKmV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjbXBpYl9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIsKjw8IiwgIiwqPSIsICIsKjwiLCAiLCo8PSIsICIsKj4+PSIsICIsKjw+IiwgIiwqPj0iLCAiLCo+IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZGRfY29uZF9uYW1lc1tdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsICIsbnV2IiwgIix6bnYiLCAiLHN2IiwgIixvZCIsCi0gICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsPiIsICIsdXYiLCAiLHZueiIsICIsbnN2IiwgIixldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWRkX2NvbmRfNjRfbmFtZXNbXSA9IHsKLSAgIiIsICIsKj0iLCAiLCo8IiwgIiwqPD0iLCAiLCpudXYiLCAiLCp6bnYiLCAiLCpzdiIsICIsKm9kIiwKLSAgIiwqdHIiLCAiLCo8PiIsICIsKj49IiwgIiwqPiIsICIsKnV2IiwgIiwqdm56IiwgIiwqbnN2IiwgIiwqZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHdpZGVfYWRkX2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsPD0iLCAiLG51diIsICIsKj0iLCAiLCo8IiwgIiwqPD0iLAotICAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAiLHV2IiwgIiwqPD4iLCAiLCo+PSIsICIsKj4iCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxvZ2ljYWxfY29uZF9uYW1lc1tdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsIDAsIDAsIDAsICIsb2QiLAotICAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAwLCAwLCAwLCAiLGV2In07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbG9naWNhbF9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIiLCAiLCo9IiwgIiwqPCIsICIsKjw9IiwgMCwgMCwgMCwgIiwqb2QiLAotICAiLCp0ciIsICIsKjw+IiwgIiwqPj0iLCAiLCo+IiwgMCwgMCwgMCwgIiwqZXYifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1bml0X2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsICIsc3d6IiwgIixzYnoiLCAiLHNoeiIsICIsc2RjIiwgIixzd2MiLCAiLHNiYyIsICIsc2hjIiwKLSAgIix0ciIsICIsbnd6IiwgIixuYnoiLCAiLG5oeiIsICIsbmRjIiwgIixud2MiLCAiLG5iYyIsICIsbmhjIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1bml0X2NvbmRfNjRfbmFtZXNbXSA9IHsKLSAgIiIsICIsKnN3eiIsICIsKnNieiIsICIsKnNoeiIsICIsKnNkYyIsICIsKnN3YyIsICIsKnNiYyIsICIsKnNoYyIsCi0gICIsKnRyIiwgIiwqbnd6IiwgIiwqbmJ6IiwgIiwqbmh6IiwgIiwqbmRjIiwgIiwqbndjIiwgIiwqbmJjIiwgIiwqbmhjIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaGlmdF9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLG9kIiwgIix0ciIsICIsPD4iLCAiLD49IiwgIixldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2hpZnRfY29uZF82NF9uYW1lc1tdID0gewotICAiIiwgIiwqPSIsICIsKjwiLCAiLCpvZCIsICIsKnRyIiwgIiwqPD4iLCAiLCo+PSIsICIsKmV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBiYl9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIsKjwiLCAiLCo+PSIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaW5kZXhfY29tcGxfbmFtZXNbXSA9IHsiIiwgIixtIiwgIixzIiwgIixzbSJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNob3J0X2xkc3RfY29tcGxfbmFtZXNbXSA9IHsiIiwgIixtYSIsICIiLCAiLG1iIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2hvcnRfYnl0ZXNfY29tcGxfbmFtZXNbXSA9IHsKLSAgIiIsICIsYixtIiwgIixlIiwgIixlLG0iCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZsb2F0X2Zvcm1hdF9uYW1lc1tdID0geyIsc2dsIiwgIixkYmwiLCAiIiwgIixxdWFkIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZmxvYXRfY29tcF9uYW1lc1tdID0KLXsKLSAgIixmYWxzZT8iLCAiLGZhbHNlIiwgIiw/IiwgIiwhPD0+IiwgIiw9IiwgIiw9dCIsICIsPz0iLCAiLCE8PiIsCi0gICIsIT8+PSIsICIsPCIsICIsPzwiLCAiLCE+PSIsICIsIT8+IiwgIiw8PSIsICIsPzw9IiwgIiwhPiIsCi0gICIsIT88PSIsICIsPiIsICIsPz4iLCAiLCE8PSIsICIsIT88IiwgIiw+PSIsICIsPz49IiwgIiwhPCIsCi0gICIsIT89IiwgIiw8PiIsICIsIT0iLCAiLCE9dCIsICIsIT8iLCAiLDw9PiIsICIsdHJ1ZT8iLCAiLHRydWUiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNpZ25lZF91bnNpZ25lZF9uYW1lc1tdID0geyIsdSIsICIscyJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1peF9oYWxmX25hbWVzW10gPSB7IixsIiwgIixyIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2F0dXJhdGlvbl9uYW1lc1tdID0geyIsdXMiLCAiLHNzIiwgMCwgIiJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlYWRfd3JpdGVfbmFtZXNbXSA9IHsiLHIiLCAiLHcifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZGRfY29tcGxfbmFtZXNbXSA9IHsgMCwgIiIsICIsbCIsICIsdHN2IiB9OwotCi0vKiBGb3IgYSBidW5jaCBvZiBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zIGZvcm0gYW4gaW5kZXggaW50byBhIAotICAgY29tcGxldGVyIG5hbWUgdGFibGUuICovCi0jZGVmaW5lIEdFVF9DT01QTChpbnNuKSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIHwgXAotCQkJIEdFVF9GSUVMRCAoaW5zbiwgMTgsIDE4KSA8PCAxKQotCi0jZGVmaW5lIEdFVF9DT05EKGluc24pIChHRVRfRklFTEQgKChpbnNuKSwgMTYsIDE4KSArIFwKLQkJCShHRVRfRklFTEQgKChpbnNuKSwgMTksIDE5KSA/IDggOiAwKSkKLQotLyogVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCByZWdpc3RlcnMuICBQdXQgdGhlc2UgZmlyc3QsIHNvIGdjYydzIGZ1bmN0aW9uCi0gICBpbmxpbmluZyBjYW4gZG8gaXRzIHN0dWZmLiAgKi8KLQotI2RlZmluZSBmcHV0c19maWx0ZXJlZChTVFIsRikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIFNUUikKLQotc3RhdGljIHZvaWQKLWZwdXRfcmVnIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHJlZyA/IHJlZ19uYW1lc1tyZWddIDogInIwIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcHV0X2ZwX3JlZyAocmVnLCBpbmZvKQotICAgICB1bnNpZ25lZCByZWc7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCByZWcgPyBmcF9yZWdfbmFtZXNbcmVnXSA6ICJmcjAiKTsKLX0KLQotc3RhdGljIHZvaWQKLWZwdXRfZnBfcmVnX3IgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAvKiBTcGVjaWFsIGNhc2UgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIHJlZ2lzdGVycy4gICovCi0gIGlmIChyZWcgPCA0KQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZnBlJWQiLCByZWcgKiAyICsgMSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzUiIsIHJlZyA/IGZwX3JlZ19uYW1lc1tyZWddIAotCQkJCQkJICAgIDogImZyMCIpOwotfQotCi1zdGF0aWMgdm9pZAotZnB1dF9jcmVnIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIGNvbnRyb2xfcmVnW3JlZ10pOwotfQotCi0vKiBwcmludCBjb25zdGFudHMgd2l0aCBzaWduICovCi0KLXN0YXRpYyB2b2lkCi1mcHV0X2NvbnN0IChudW0sIGluZm8pCi0gICAgIHVuc2lnbmVkIG51bTsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKChpbnQpbnVtIDwgMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0leCIsIC0oaW50KW51bSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4IiwgbnVtKTsKLX0KLQotLyogUm91dGluZXMgdG8gZXh0cmFjdCB2YXJpb3VzIHNpemVkIGNvbnN0YW50cyBvdXQgb2YgaHBwYQotICAgaW5zdHJ1Y3Rpb25zLiAqLwotCi0vKiBleHRyYWN0IGEgMy1iaXQgc3BhY2UgcmVnaXN0ZXIgbnVtYmVyIGZyb20gYSBiZSwgYmxlLCBtdHNwIG9yIG1mc3AgKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMyAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIEdFVF9GSUVMRCAod29yZCwgMTgsIDE4KSA8PCAyIHwgR0VUX0ZJRUxEICh3b3JkLCAxNiwgMTcpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0XzVfbG9hZCAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCA+PiAxNiAmIE1BU0tfNSwgNSk7Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEgc3R7Ymh3fXMgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfNV9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfNSwgNSk7Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEgYnJlYWsgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB1bnNpZ25lZAotZXh0cmFjdF81cl9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuICh3b3JkICYgTUFTS181KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSB7c3J9c20gaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB1bnNpZ25lZAotZXh0cmFjdF81Ul9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuICh3b3JkID4+IDE2ICYgTUFTS181KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgMTAgYml0IGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEge3NyfXNtIGluc3RydWN0aW9uICovCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfMTBVX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgPj4gMTYgJiBNQVNLXzEwKTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSBiYiBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0XzVRX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgPj4gMjEgJiBNQVNLXzUpOwotfQotCi0vKiBleHRyYWN0IGFuIDExIGJpdCBpbW1lZGlhdGUgZmllbGQgKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTEgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgJiBNQVNLXzExLCAxMSk7Ci19Ci0KLS8qIGV4dHJhY3QgYSAxNCBiaXQgaW1tZWRpYXRlIGZpZWxkICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzE0ICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS18xNCwgMTQpOwotfQotCi0vKiBleHRyYWN0IGEgMjEgYml0IGNvbnN0YW50ICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMjEgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIGludCB2YWw7Ci0KLSAgd29yZCAmPSBNQVNLXzIxOwotICB3b3JkIDw8PSAxMTsKLSAgdmFsID0gR0VUX0ZJRUxEICh3b3JkLCAyMCwgMjApOwotICB2YWwgPDw9IDExOwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCA5LCAxOSk7Ci0gIHZhbCA8PD0gMjsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgNSwgNik7Ci0gIHZhbCA8PD0gNTsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgMCwgNCk7Ci0gIHZhbCA8PD0gMjsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgNywgOCk7Ci0gIHJldHVybiBzaWduX2V4dGVuZCAodmFsLCAyMSkgPDwgMTE7Ci19Ci0KLS8qIGV4dHJhY3QgYSAxMiBiaXQgY29uc3RhbnQgZnJvbSBicmFuY2ggaW5zdHJ1Y3Rpb25zICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTIgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBzaWduX2V4dGVuZCAoR0VUX0ZJRUxEICh3b3JkLCAxOSwgMjgpIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAgICh3b3JkICYgMHgxKSA8PCAxMSwgMTIpIDw8IDI7Ci19Ci0KLS8qIGV4dHJhY3QgYSAxNyBiaXQgY29uc3RhbnQgZnJvbSBicmFuY2ggaW5zdHJ1Y3Rpb25zLCByZXR1cm5pbmcgdGhlCi0gICAxOSBiaXQgc2lnbmVkIHZhbHVlLiAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0XzE3ICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gc2lnbl9leHRlbmQgKEdFVF9GSUVMRCAod29yZCwgMTksIDI4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAyOSwgMjkpIDw8IDEwIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDExLCAxNSkgPDwgMTEgfAotICAgICAgICAgICAgICAgICAgICAgICh3b3JkICYgMHgxKSA8PCAxNiwgMTcpIDw8IDI7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMjIgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBzaWduX2V4dGVuZCAoR0VUX0ZJRUxEICh3b3JkLCAxOSwgMjgpIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMTEsIDE1KSA8PCAxMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCA2LCAxMCkgPDwgMTYgfAotICAgICAgICAgICAgICAgICAgICAgICh3b3JkICYgMHgxKSA8PCAyMSwgMjIpIDw8IDI7Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbi4gICovCi1pbnQKLXByaW50X2luc25faHBwYSAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGludCBpbnNuLCBpOwotCi0gIHsKLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0JKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTU9QQ09ERVM7ICsraSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcGFfb3Bjb2RlICpvcGNvZGUgPSAmcGFfb3Bjb2Rlc1tpXTsKLSAgICAgIGlmICgoaW5zbiAmIG9wY29kZS0+bWFzaykgPT0gb3Bjb2RlLT5tYXRjaCkKLQl7Ci0JICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotCSAgCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3Bjb2RlLT5uYW1lKTsKLQotCSAgaWYgKCFzdHJjaHIgKCJjZkNZPy0rbkhOWkZJdXYiLCBvcGNvZGUtPmFyZ3NbMF0pKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkgIGZvciAocyA9IG9wY29kZS0+YXJnczsgKnMgIT0gJ1wwJzsgKytzKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqcykKLQkJewotCQljYXNlICd4JzoKLQkJICBmcHV0X3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnYSc6Ci0JCWNhc2UgJ2InOgotCQkgIGZwdXRfcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ14nOgotCQkgIGZwdXRfY3JlZyAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd0JzoKLQkJICBmcHV0X3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICBicmVhazsKLQotCQkvKiBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLiAgKi8KLQkJY2FzZSAnZic6Ci0JCSAgc3dpdGNoICgqKytzKQotCQkgICAgewotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1QnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkJZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICAgICAgZWxzZQotCQkJZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYSc6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCi0JCQlmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgICAgIGVsc2UKLQkJCWZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICAvKiAnZkEnIHdpbGwgbm90IGdlbmVyYXRlIGEgc3BhY2UgYmVmb3JlIHRoZSByZWdzaXRlcgotCQkJbmFtZS4gIE5vcm1hbGx5IHRoYXQgaXMgZmluZS4gIEV4Y2VwdCB0aGF0IGl0Ci0JCQljYXVzZXMgcHJvYmxlbXMgd2l0aCB4bXB5dSB3aGljaCBoYXMgbm8gRlAgZm9ybWF0Ci0JCQljb21wbGV0ZXIuICAqLwotCQkgICAgY2FzZSAnWCc6Ci0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGluZm8pOwotCi0JCSAgICAvKiBGQUxMVEhSVSAqLwotCi0JCSAgICBjYXNlICdBJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjQsIDI0KSkKLQkJCWZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICAgICAgZWxzZQotCQkJZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICAgICAgCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCi0JCQlmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgICAgICBlbHNlCi0JCQlmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdCJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMTksIDE5KSkKLQkJCWZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgICAgIGVsc2UKLQkJCWZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ0MnOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyMSwgMjIpOwotCQkJcmVnIHw9IEdFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KSA8PCAyOwotCQkJaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjMsIDIzKSAhPSAwKQotCQkJICBmcHV0X2ZwX3JlZ19yIChyZWcsIGluZm8pOwotCQkJZWxzZQotCQkJICBmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBjYXNlICdpJzoKLQkJICAgICAgewotCQkJaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ2onOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ2snOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ2wnOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyMSwgMjUpOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ20nOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMjApOwotCi0JCQlyZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKLQkJCWZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ2UnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkJZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICAgICAgZWxzZQotCQkJZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnNSc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81X2xvYWQgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAncyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCi0JCQkJCSAic3IlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMTYsIDE3KSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzciVkIiwgZXh0cmFjdF8zIChpbnNuKSk7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogSGFuZGxlIGNvbXBsZXRlcnMuICAqLwotCQljYXNlICdjJzoKLQkJICBzd2l0Y2ggKCorK3MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICd4JzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgIGluZGV4X2NvbXBsX25hbWVzW0dFVF9DT01QTCAoaW5zbildKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdtJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgIHNob3J0X2xkc3RfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgc2hvcnRfYnl0ZXNfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2MnOgotCQkgICAgY2FzZSAnQyc6Ci0JCSAgICAgIHN3aXRjaCAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjEpKQotCQkJewotCQkJY2FzZSAxOgotCQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixiYyAiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHNsICIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2QnOgotCQkgICAgICBzd2l0Y2ggKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIxKSkKLQkJCXsKLQkJCWNhc2UgMToKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsY28gIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbyc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG8iKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdnJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsZ2F0ZSIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3AnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixsLHB1c2giKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdQJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIscG9wIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbCc6Ci0JCSAgICBjYXNlICdMJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbCIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3cnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgcmVhZF93cml0ZV9uYW1lc1tHRVRfRklFTEQgKGluc24sIDI1LCAyNSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdXJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsdyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3InOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMywgMjYpID09IDUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixyIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnWic6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixtICIpOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdpJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLGkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd6JzoKLQkJICAgICAgaWYgKCFHRVRfRklFTEQgKGluc24sIDIxLCAyMSkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix6Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYSc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJKGluZm8tPnN0cmVhbSwgIiVzIiwgYWRkX2NvbXBsX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAoaW5zbiwgMjAsIDIxKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1knOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCShpbmZvLT5zdHJlYW0sICIsZGMlcyIsIGFkZF9jb21wbF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAgKGluc24sIDIwLCAyMSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd5JzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkoaW5mby0+c3RyZWFtLCAiLGMlcyIsIGFkZF9jb21wbF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAoaW5zbiwgMjAsIDIxKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3YnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjApKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsdHN2Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRjIik7Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIwLCAyMCkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix0c3YiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdCJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsZGIiKTsKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIwKSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRzdiIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixiIik7Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIwLCAyMCkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix0c3YiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdUJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRjIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUyc6Ci0JCSAgICAgIC8qIEVYVFJEL1cgaGFzIGEgZm9sbG93aW5nIGNvbmRpdGlvbi4gICovCi0JCSAgICAgIGlmICgqKHMgKyAxKSA9PSAnPycpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCSAgKGluZm8tPnN0cmVhbSwgIiVzIiwgc2lnbmVkX3Vuc2lnbmVkX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCQkgICAgKGluc24sIDIxLCAyMSldKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyAiLCBzaWduZWRfdW5zaWduZWRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJCSAgICAgKGluc24sIDIxLCAyMSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdoJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsIG1peF9oYWxmX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgKGluc24sIDE3LCAxNyldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdIJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsIHNhdHVyYXRpb25fbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgIChpbnNuLCAyNCwgMjUpXSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnKic6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJICAoaW5mby0+c3RyZWFtLCAiLCVkJWQlZCVkICIsCi0JCQkgICBHRVRfRklFTEQgKGluc24sIDE3LCAxOCksIEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIxKSwKLQkJCSAgIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDIzKSwgR0VUX0ZJRUxEIChpbnNuLCAyNCwgMjUpKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3EnOgotCQkgICAgICB7Ci0JCQlpbnQgbSwgYTsKLQotCQkJbSA9IEdFVF9GSUVMRCAoaW5zbiwgMjgsIDI4KTsKLQkJCWEgPSBHRVRfRklFTEQgKGluc24sIDI5LCAyOSk7Ci0KLQkJCWlmIChtICYmICFhKQotCQkJICBmcHV0c19maWx0ZXJlZCAoIixtYSAiLCBpbmZvKTsKLQkJCWVsc2UgaWYgKG0gJiYgYSkKLQkJCSAgZnB1dHNfZmlsdGVyZWQgKCIsbWIgIiwgaW5mbyk7Ci0JCQllbHNlCi0JCQkgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgY2FzZSAnSic6Ci0JCSAgICAgIHsKLQkJCWludCBvcGNvZGUgPSBHRVRfRklFTEQgKGluc24sIDAsIDUpOwotCi0JCQlpZiAob3Bjb2RlID09IDB4MTYgfHwgb3Bjb2RlID09IDB4MWUpCi0JCQkgIHsKLQkJCSAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyOSwgMjkpID09IDApCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYSAiLCBpbmZvKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYiAiLCBpbmZvKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBmcHV0c19maWx0ZXJlZCAoIiAiLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGNhc2UgJ2UnOgotCQkgICAgICB7Ci0JCQlpbnQgb3Bjb2RlID0gR0VUX0ZJRUxEIChpbnNuLCAwLCA1KTsKLQotCQkJaWYgKG9wY29kZSA9PSAweDEzIHx8IG9wY29kZSA9PSAweDFiKQotCQkJICB7Ci0JCQkgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMTgsIDE4KSA9PSAxKQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWIgIiwgaW5mbyk7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWEgIiwgaW5mbyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKG9wY29kZSA9PSAweDE3IHx8IG9wY29kZSA9PSAweDFmKQotCQkJICB7Ci0JCQkgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMzEsIDMxKSA9PSAxKQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWEgIiwgaW5mbyk7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsbWIgIiwgaW5mbyk7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgaW5mbyk7Ci0KLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJLyogSGFuZGxlIGNvbmRpdGlvbnMuICAqLwotCQljYXNlICc/JzoKLQkJICB7Ci0JCSAgICBzKys7Ci0JCSAgICBzd2l0Y2ggKCpzKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgJ2YnOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgICAgZmxvYXRfY29tcF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAgKGluc24sIDI3LCAzMSldKTsKLQkJCWJyZWFrOwotCi0JCSAgICAgIC8qIHRoZXNlIGZvdXIgY29uZGl0aW9ucyBhcmUgZm9yIHRoZSBzZXQgb2YgaW5zdHJ1Y3Rpb25zCi0JCQkgICB3aGljaCBkaXN0aW5ndWlzaCB0cnVlL2ZhbHNlIGNvbmRpdGlvbnMgYnkgb3Bjb2RlCi0JCQkgICByYXRoZXIgdGhhbiBieSB0aGUgJ2YnIGJpdCAoc2lnaCk6IGNvbWIsIGNvbWliLAotCQkJICAgYWRkYiwgYWRkaWIgKi8KLQkJICAgICAgY2FzZSAndCc6Ci0JCQlmcHV0c19maWx0ZXJlZCAoY29tcGFyZV9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0sCi0JCQkJCWluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ24nOgotCQkJZnB1dHNfZmlsdGVyZWQgKGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKLQkJCQkJKyBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0sIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ04nOgotCQkJZnB1dHNfZmlsdGVyZWQgKGNvbXBhcmVfY29uZF82NF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKLQkJCQkJKyBHRVRfRklFTEQgKGluc24sIDIsIDIpICogOF0sIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ1EnOgotCQkJZnB1dHNfZmlsdGVyZWQgKGNtcGliX2NvbmRfNjRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSwKLQkJCQkJaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnQCc6Ci0JCQlmcHV0c19maWx0ZXJlZCAoYWRkX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpCi0JCQkJCSsgR0VUX0ZJRUxEIChpbnNuLCA0LCA0KSAqIDhdLCBpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdzJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdTJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGNvbXBhcmVfY29uZF82NF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdhJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGFkZF9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ0EnOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgICAgYWRkX2NvbmRfNjRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnZCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCQkJICAgICAgIGFkZF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOwotCQkJYnJlYWs7Ci0KLQkJICAgICAgY2FzZSAnVyc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICB3aWRlX2FkZF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KSArIAotCQkJCQkgICAgICBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0pOwotCQkJYnJlYWs7Ci0KLQkJICAgICAgY2FzZSAnbCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBsb2dpY2FsX2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnTCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBsb2dpY2FsX2NvbmRfNjRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAndSc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICB1bml0X2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnVSc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICB1bml0X2NvbmRfNjRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAneSc6Ci0JCSAgICAgIGNhc2UgJ3gnOgotCQkgICAgICBjYXNlICdiJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJICAoaW5mby0+c3RyZWFtLCAiJXMiLAotCQkJICAgc2hpZnRfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCldKTsKLQotCQkJLyogSWYgdGhlIG5leHQgY2hhcmFjdGVyIGluIGFyZ3MgaXMgJ24nLCBpdCB3aWxsIGhhbmRsZQotCQkJICAgcHV0dGluZyBvdXQgdGhlIHNwYWNlLiAgKi8KLQkJCWlmIChzWzFdICE9ICduJykKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnWCc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBzaGlmdF9jb25kXzY0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ0InOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICBiYl9jb25kXzY0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE2KV0pOwotCi0JCQkvKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gYXJncyBpcyAnbicsIGl0IHdpbGwgaGFuZGxlCi0JCQkgICBwdXR0aW5nIG91dCB0aGUgc3BhY2UuICAqLwotCQkJaWYgKHNbMV0gIT0gJ24nKQotCQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJY2FzZSAnVic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81X3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNXJfc3RvcmUgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnUic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81Ul9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdVJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzEwVV9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdCJzoKLQkJY2FzZSAnUSc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81UV9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdpJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzExIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2onOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTQgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnayc6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF8yMSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICduJzoKLQkJICBpZiAoaW5zbiAmIDB4MikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG4gIik7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ04nOgotCQkgIGlmICgoaW5zbiAmIDB4MjApICYmIHNbMV0pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixuICIpOwotCQkgIGVsc2UgaWYgKGluc24gJiAweDIwKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbiIpOwotCQkgIGVsc2UgaWYgKHNbMV0pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICBicmVhazsKLQkJY2FzZSAndyc6Ci0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgOCArIGV4dHJhY3RfMTIgKGluc24pLAotCQkJCQkgICAgICAgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1cnOgotCQkgIC8qIDE3IGJpdCBQQy1yZWxhdGl2ZSBicmFuY2guICAqLwotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyA4IAotCQkJCQkJKyBleHRyYWN0XzE3IChpbnNuKSksCi0JCQkJCSAgICAgICBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAneic6Ci0JCSAgLyogMTcgYml0IGRpc3BsYWNlbWVudC4gIFRoaXMgaXMgYW4gb2Zmc2V0IGZyb20gYSByZWdpc3RlcgotCQkgICAgIHNvIGl0IGdldHMgZGlzYXNzc2VtYmxlZCBhcyBqdXN0IGEgbnVtYmVyLCBub3QgYW55IHNvcnQKLQkJICAgICBvZiBhZGRyZXNzLiAgKi8KLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzE3IChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWic6Ci0JCSAgLyogYWRkaWwgJXIxIGltcGxpY2l0IG91dHB1dC4gICovCi0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXIxIik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWSc6Ci0JCSAgLyogYmUsbCAlc3IwLCVyMzEgaW1wbGljaXQgb3V0cHV0LiAgKi8KLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlc3IwLCUlcjMxIik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgJ0AnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMCIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJy4nOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICBHRVRfRklFTEQgKGluc24sIDI0LCAyNSkpOwotCQkgIGJyZWFrOwotCQljYXNlICcqJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgR0VUX0ZJRUxEIChpbnNuLCAyMiwgMjUpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnISc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXNhciIpOwotCQkgIGJyZWFrOwotCQljYXNlICdwJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgMzEgLSBHRVRfRklFTEQgKGluc24sIDIyLCAyNikpOwotCQkgIGJyZWFrOwotCQljYXNlICd+JzoKLQkJICB7Ci0JCSAgICBpbnQgbnVtOwotCQkgICAgbnVtID0gR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjApIDw8IDU7Ci0JCSAgICBudW0gfD0gR0VUX0ZJRUxEIChpbnNuLCAyMiwgMjYpOwotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIDYzIC0gbnVtKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnUCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDI2KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3EnOgotCQkgIHsKLQkJICAgIGludCBudW07Ci0JCSAgICBudW0gPSBHRVRfRklFTEQgKGluc24sIDIwLCAyMCkgPDwgNTsKLQkJICAgIG51bSB8PSBHRVRfRklFTEQgKGluc24sIDIyLCAyNik7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgbnVtKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnVCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgIDMyIC0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnJSc6Ci0JCSAgewotCQkgICAgaW50IG51bTsKLQkJICAgIG51bSA9IChHRVRfRklFTEQgKGluc24sIDIzLCAyMykgKyAxKSAqIDMyOwotCQkgICAgbnVtIC09IEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKTsKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBudW0pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICd8JzoKLQkJICB7Ci0JCSAgICBpbnQgbnVtOwotCQkgICAgbnVtID0gKEdFVF9GSUVMRCAoaW5zbiwgMTksIDE5KSArIDEpICogMzI7Ci0JCSAgICBudW0gLT0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOwotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIG51bSk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWNhc2UgJyQnOgotCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDI4KSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0EnOgotCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTgpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnRCc6Ci0JCSAgZnB1dF9jb25zdCAoR0VUX0ZJRUxEIChpbnNuLCA2LCAzMSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd2JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMjMsIDI1KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ08nOgotCQkgIGZwdXRfY29uc3QgKChHRVRfRklFTEQgKGluc24sIDYsMjApIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdvJzoKLQkJICBmcHV0X2NvbnN0IChHRVRfRklFTEQgKGluc24sIDYsIDIwKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzInOgotCQkgIGZwdXRfY29uc3QgKChHRVRfRklFTEQgKGluc24sIDYsIDIyKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnMSc6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDIwKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnMCc6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgMTYsIDIwKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAndSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJWQiLCBHRVRfRklFTEQgKGluc24sIDIzLCAyNSkpOwotCQkgIGJyZWFrOwotCQljYXNlICdGJzoKLQkJICAvKiBpZiBubyBkZXN0aW5hdGlvbiBjb21wbGV0ZXIgYW5kIG5vdCBiZWZvcmUgYSBjb21wbGV0ZXIKLQkJICAgICBmb3IgZmNtcCwgbmVlZCBhIHNwYWNlIGhlcmUgKi8KLQkJICBpZiAoc1sxXSA9PSAnRycgfHwgc1sxXSA9PSAnPycpCi0JCSAgICBmcHV0c19maWx0ZXJlZCAoZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTksIDIwKV0sCi0JCQkJICAgIGluZm8pOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgIChpbnNuLCAxOSwgMjApXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0cnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwKLQkJCQkJCQkJICAxNywgMTgpXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0gnOgotCQkgIGlmIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgPT0gMSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzWzBdKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIGZsb2F0X2Zvcm1hdF9uYW1lc1sxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0knOgotCQkgIC8qIGlmIG5vIGRlc3RpbmF0aW9uIGNvbXBsZXRlciBhbmQgbm90IGJlZm9yZSBhIGNvbXBsZXRlcgotCQkgICAgIGZvciBmY21wLCBuZWVkIGEgc3BhY2UgaGVyZSAqLwotCQkgIGlmIChzWzFdID09ICc/JykKLQkJICAgIGZwdXRzX2ZpbHRlcmVkIChmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjApXSwKLQkJCQkgICAgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgKGluc24sIDIwLCAyMCldKTsKLQkJICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ0onOgotICAgICAgICAgICAgICAgICAgZnB1dF9jb25zdCAoZXh0cmFjdF8xNCAoaW5zbiksIGluZm8pOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSAnIyc6Ci0JCSAgewotCQkgICAgaW50IHNpZ24gPSBHRVRfRklFTEQgKGluc24sIDMxLCAzMSk7Ci0JCSAgICBpbnQgaW1tMTAgPSBHRVRfRklFTEQgKGluc24sIDE4LCAyNyk7Ci0JCSAgICBpbnQgZGlzcDsKLQotCQkgICAgaWYgKHNpZ24pCi0JCSAgICAgIGRpc3AgPSAoLTEgPDwgMTApIHwgaW1tMTA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGRpc3AgPSBpbW0xMDsKLQotCQkgICAgZGlzcCA8PD0gMzsKLQkJICAgIGZwdXRfY29uc3QgKGRpc3AsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ0snOgotCQljYXNlICdkJzoKLQkJICB7Ci0JCSAgICBpbnQgc2lnbiA9IEdFVF9GSUVMRCAoaW5zbiwgMzEsIDMxKTsKLQkJICAgIGludCBpbW0xMSA9IEdFVF9GSUVMRCAoaW5zbiwgMTgsIDI4KTsKLQkJICAgIGludCBkaXNwOwotCi0JCSAgICBpZiAoc2lnbikKLQkJICAgICAgZGlzcCA9ICgtMSA8PCAxMSkgfCBpbW0xMTsKLQkJICAgIGVsc2UKLQkJICAgICAgZGlzcCA9IGltbTExOwotCi0JCSAgICBkaXNwIDw8PSAyOwotCQkgICAgZnB1dF9jb25zdCAoZGlzcCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJLyogPyE/IEZJWE1FICovCi0JCWNhc2UgJ18nOgotCQljYXNlICd7JzoKLQkJICBmcHV0c19maWx0ZXJlZCAoIkRpc2Fzc2VtYmxlciBib3RjaC5cbiIsIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ20nOgotCQkgIHsKLQkJICAgIGludCB5ID0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpOwotCi0JCSAgICBpZiAoeSAhPSAxKQotCQkgICAgICBmcHV0X2NvbnN0ICgoeSBeIDEpIC0gMSwgaW5mbyk7Ci0JCSAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2gnOgotCQkgIHsKLQkJICAgIGludCBjYml0OwotCi0JCSAgICBjYml0ID0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpOwotCi0JCSAgICBpZiAoY2JpdCA+IDApCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVkIiwgY2JpdCAtIDEpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWNhc2UgJz0nOgotCQkgIHsKLQkJICAgIGludCBjb25kID0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOwotCi0JCSAgICBpZiAoY29uZCA9PSAwKQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBpbmZvKTsKLQkJICAgIGVsc2UgaWYgKGNvbmQgPT0gMSkKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhY2MgIiwgaW5mbyk7Ci0JCSAgICBlbHNlIGlmIChjb25kID09IDIpCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgicmVqICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSA1KQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoImFjYzggIiwgaW5mbyk7Ci0JCSAgICBlbHNlIGlmIChjb25kID09IDYpCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgicmVqOCAiLCBpbmZvKTsKLQkJICAgIGVsc2UgaWYgKGNvbmQgPT0gOSkKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhY2M2ICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSAxMykKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhY2M0ICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSAxNykKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhY2MyICIsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWNhc2UgJ1gnOgotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyA4IAotCQkJCQkJKyBleHRyYWN0XzIyIChpbnNuKSksCi0JCQkJCSAgICAgICBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnTCc6Ci0JCSAgZnB1dHNfZmlsdGVyZWQgKCIsJXIyIiwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsICpzKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICByZXR1cm4gc2l6ZW9mKGluc24pOwotCX0KLSAgICB9Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyU4eCIsIGluc24pOwotICByZXR1cm4gc2l6ZW9mKGluc24pOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pMzcwLWRpcy5jIGIvb3Bjb2Rlcy9pMzcwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTkyYzc2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaTM3MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0KLS8qIGkzNzAtZGlzLmMgLS0gRGlzYXNzZW1ibGUgSW5zdHJ1Y3Rpb24gMzcwIChFU0EvMzkwKSBpbnN0cnVjdGlvbnMKLSAgIENvcHlyaWdodCAxOTk0LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgUG93ZXJQQyB2ZXJzaW9uIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLSAgIFJld3JpdHRlbiBmb3IgaTM3MCBFU0EvMzkwIHN1cHBvcnQgYnkgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvaTM3MC5oIgotCi0vKiBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zLCBhbGwgb2Ygd2hpY2ggdXNlCi0gICB0aGUgZGlzYXNzZW1ibGVyIGludGVyZmFjZSBkZWZpbmVkIGluIGRpcy1hc20uaC4KLSovCi0KLWludAotcHJpbnRfaW5zbl9pMzcwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbOF07Ci0gIGludCBzdGF0dXM7Ci0gIGkzNzBfaW5zbl90IGluc247Ci0gIGNvbnN0IHN0cnVjdCBpMzcwX29wY29kZSAqb3Bjb2RlOwotICBjb25zdCBzdHJ1Y3QgaTM3MF9vcGNvZGUgKm9wY29kZV9lbmQ7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA2LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBDYXN0IHRoZSBieXRlcyBpbnRvIHRoZSBpbnNuIChpbiBhIGhvc3QtZW5kaWFuIGluZGVwIHdheSkgKi8KLSAgaW5zbi5pWzBdID0gKGJ1ZmZlclswXSA8PCAyNCkgJiAweGZmMDAwMDAwOwotICBpbnNuLmlbMF0gfD0gKGJ1ZmZlclsxXSA8PCAxNikgJiAweGZmMDAwMDsKLSAgaW5zbi5pWzBdIHw9IChidWZmZXJbMl0gPDwgOCkgJiAweGZmMDA7Ci0gIGluc24uaVswXSB8PSBidWZmZXJbM10gICYgMHhmZjsKLSAgaW5zbi5pWzFdID0gKGJ1ZmZlcls0XSA8PCAyNCkgJiAweGZmMDAwMDAwOwotICBpbnNuLmlbMV0gfD0gKGJ1ZmZlcls1XSA8PCAxNikgJiAweGZmMDAwMDsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgV2UgY291bGQgc3BlZWQgdGhpcyB1cAotICAgICBhIGJpdCBieSBkb2luZyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIG1ham9yIG9wY29kZS4gICovCi0gIG9wY29kZV9lbmQgPSBpMzcwX29wY29kZXMgKyBpMzcwX251bV9vcGNvZGVzOwotICBmb3IgKG9wY29kZSA9IGkzNzBfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCi0gICAgewotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKLSAgICAgIGNvbnN0IHN0cnVjdCBpMzcwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBpMzcwX2luc25fdCBtYXNrZWQ7Ci0gICAgICBpbnQgaW52YWxpZDsKLQotICAgICAgLyogTWFzayBvZmYgb3BlcmFuZHMsIGFuZCBsb29rIGZvciBhIG1hdGNoIC4uLiAqLwotICAgICAgbWFza2VkID0gaW5zbjsKLSAgICAgIGlmICgyID09IG9wY29kZS0+bGVuKQotICAgICAgICB7Ci0gICAgICAgICAgbWFza2VkLmlbMF0gPj49IDE2OwotICAgICAgICAgIG1hc2tlZC5pWzBdICY9IDB4ZmZmZjsKLSAgICAgICAgfQotICAgICAgbWFza2VkLmlbMF0gJj0gb3Bjb2RlLT5tYXNrLmlbMF07Ci0gICAgICBpZiAobWFza2VkLmlbMF0gIT0gb3Bjb2RlLT5vcGNvZGUuaVswXSkgY29udGludWU7Ci0KLSAgICAgIGlmICg2ID09IG9wY29kZS0+bGVuKQotICAgICAgICB7Ci0gICAgICAgICAgbWFza2VkLmlbMV0gJj0gb3Bjb2RlLT5tYXNrLmlbMV07Ci0gICAgICAgICAgaWYgKG1hc2tlZC5pWzFdICE9IG9wY29kZS0+b3Bjb2RlLmlbMV0pIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIC8qIEZvdW5kIGEgbWF0Y2guICBhZGp1c3QgYSB0YWQgKi8KLSAgICAgIGlmICgyID09IG9wY29kZS0+bGVuKQotICAgICAgICB7Ci0gICAgICAgICAgaW5zbi5pWzBdID4+PSAxNjsKLSAgICAgICAgICBpbnNuLmlbMF0gJj0gMHhmZmZmOwotICAgICAgICB9Ci0KLSAgICAgIC8qIE1ha2UgdHdvIHBhc3NlcyBvdmVyIHRoZSBvcGVyYW5kcy4gIEZpcnN0IHNlZSBpZiBhbnkgb2YgdGhlbQotICAgICAgICAgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0gICAgICAgICBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0gICAgICBpbnZhbGlkID0gMDsKLSAgICAgIGZvciAob3BpbmRleCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4ICE9IDA7IG9waW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgIG9wZXJhbmQgPSBpMzcwX29wZXJhbmRzICsgKm9waW5kZXg7Ci0gICAgICAgICAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0gICAgICAgICAgICAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAmaW52YWxpZCk7Ci0gICAgICAgIH0KLSAgICAgIGlmIChpbnZhbGlkKSBjb250aW51ZTsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcGNvZGUtPm5hbWUpOwotICAgICAgaWYgKG9wY29kZS0+b3BlcmFuZHNbMF0gIT0gMCkKLSAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gICAgICAvKiBOb3cgZXh0cmFjdCBhbmQgcHJpbnQgdGhlIG9wZXJhbmRzLiAgKi8KLSAgICAgIGZvciAob3BpbmRleCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4ICE9IDA7IG9waW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgIGxvbmcgdmFsdWU7Ci0KLSAgICAgICAgICBvcGVyYW5kID0gaTM3MF9vcGVyYW5kcyArICpvcGluZGV4OwotCi0gICAgICAgICAgLyogRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgICAgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotICAgICAgICAgICAgdmFsdWUgPSAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAoaW50ICopIE5VTEwpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmFsdWUgPSAoaW5zbi5pWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLSAgICAgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgSTM3MF9PUEVSQU5EX09QVElPTkFMKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIociVsZCkiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgSTM3MF9PUEVSQU5EX1NCQVNFKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIihyJWxkKSIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBJMzcwX09QRVJBTkRfSU5ERVgpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIihyJWxkLCIsIHZhbHVlKTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBJMzcwX09QRVJBTkRfTEVOR1RIKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiglbGQsIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIEkzNzBfT1BFUkFORF9CQVNFKSAhPSAwKQotICAgICAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWxkKSIsIHZhbHVlKTsKLSAgICAgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBJMzcwX09QRVJBTkRfR1BSKSAhPSAwKQotICAgICAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWxkLCIsIHZhbHVlKTsKLSAgICAgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBJMzcwX09QRVJBTkRfRlBSKSAhPSAwKQotICAgICAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmJWxkLCIsIHZhbHVlKTsKLSAgICAgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBJMzcwX09QRVJBTkRfUkVMQVRJVkUpICE9IDApCi0gICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAlbGQsICIsIHZhbHVlKTsKLQotICAgICAgICB9Ci0KLSAgICAgIHJldHVybiBvcGNvZGUtPmxlbjsKLQotICAgIH0KLQotCi0gIC8qIFdlIGNvdWxkIG5vdCBmaW5kIGEgbWF0Y2guICAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5zaG9ydCAweCUwMnglMDJ4IiwgYnVmZmVyWzBdLCBidWZmZXJbMV0pOwotCi0gIHJldHVybiAyOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pMzcwLW9wYy5jIGIvb3Bjb2Rlcy9pMzcwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJmMTZiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaTM3MC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDk1OSArMCwwIEBACi0vKiBpMzcwLW9wYy5jIC0tIEluc3RydWN0aW9uIDM3MCAoRVNBLzM5MCkgYXJjaGl0ZWN0dXJlIG9wY29kZSBsaXN0Ci0gICBDb3B5cmlnaHQgMTk5NCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFBvd2VyUEMgdmVyc2lvbiB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0gICBSZXdyaXR0ZW4gZm9yIGkzNzAgRVNBLzM5MCBzdXBwb3J0IGJ5IExpbmFzIFZlcHN0YXMgPGxpbmFzQGxpbmFzLm9yZz4gMTk5OCwgMTk5OQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvaTM3MC5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIGkzNzAgb3Bjb2RlIHRhYmxlLiAgVGhlIG9wY29kZSB0YWJsZQotICAgaW5jbHVkZXMgYWxtb3N0IGFsbCBvZiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLiAgVGhpcwotICAgcGVybWl0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIHVzZSB0aGVtLCBhbmQgc2ltcGxpZmllcyB0aGUgYXNzZW1ibGVyCi0gICBsb2dpYywgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2luZyB0aGUgdGFibGUgc2l6ZS4gIFRoZSB0YWJsZSBpcwotICAgc3RyaWN0bHkgY29uc3RhbnQgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBpdCBpbgotICAgdGhlIC50ZXh0IHNlY3Rpb24uCi0KLSAgIFRoaXMgZmlsZSBhbHNvIGhvbGRzIHRoZSBvcGVyYW5kIHRhYmxlLiAgQWxsIGtub3dsZWRnZSBhYm91dAotICAgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zdHJ1Y3Rpb25zIGFuZCB2aWNlLXZlcnNhIGlzIGtlcHQgaW4gdGhpcwotICAgZmlsZS4gICovCi0MCi0vKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBpMzcwX2luc25fdCBpbnNlcnRfc3NfYjIgIFBBUkFNUyAoKCBpMzcwX2luc25fdCwgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGkzNzBfaW5zbl90IGluc2VydF9zc19kMiAgUEFSQU1TICgoIGkzNzBfaW5zbl90LCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgaTM3MF9pbnNuX3QgaW5zZXJ0X3J4Zl9yMyAgUEFSQU1TICgoIGkzNzBfaW5zbl90LCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X3NzX2IyIFBBUkFNUyAoKCBpMzcwX2luc25fdCwgaW50ICopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3Rfc3NfZDIgUEFSQU1TICgoIGkzNzBfaW5zbl90LCBpbnQgKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9yeGZfcjMgUEFSQU1TICgoIGkzNzBfaW5zbl90LCBpbnQgKikpOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUuCi0gICBUaGUgZmllbGRzIGFyZSBiaXRzLCBzaGlmdCwgaW5zZXJ0LCBleHRyYWN0LCBmbGFncywgbmFtZS4KLSAgIFRoZSB0eXBlczoKLSAgIEkzNzBfT1BFUkFORF9HUFIgcmVnaXN0ZXIsIG11c3QgbmFtZSBhIHJlZ2lzdGVyLCBtdXN0IGJlIHByZXNlbnQKLSAgIEkzNzBfT1BFUkFORF9SRUxBVElWRSBkaXNwbGFjZW1lbnQgb3IgbGVnbnRoIGZpZWxkLCBtdXN0IGJlIHByZXNlbnQKLSAgIEkzNzBfT1BFUkFORF9CQVNFIGJhc2UgcmVnaXN0ZXI7IGlmIHByZXNlbnQsIG11c3QgbmFtZSBhIHJlZ2lzdGVyCi0gICAgICAgICAgICAgICAgICAgICAgaWYgYWJzZW50LCBzaG91bGQgdGFrZSB2YWx1ZSBvZiB6ZXJvCi0gICBJMzcwX09QRVJBTkRfSU5ERVggaW5kZXggcmVnaXN0ZXI7IGlmIHByZXNlbnQsIG11c3QgbmFtZSBhIHJlZ2lzdGVyCi0gICAgICAgICAgICAgICAgICAgICAgaWYgYWJzZW50LCBzaG91bGQgdGFrZSB2YWx1ZSBvZiB6ZXJvCi0gICBJMzcwX09QRVJBTkRfT1BUSU9OQUwgb3RoZXIgb3B0aW9uYWwgb3BlcmFuZCAodXN1YWxsIHJlZz8pCi0qLwotCi1jb25zdCBzdHJ1Y3QgaTM3MF9vcGVyYW5kIGkzNzBfb3BlcmFuZHNbXSA9Ci17Ci0gIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZgotICAgICBvcGVyYW5kcy4gICovCi0jZGVmaW5lIFVOVVNFRCAwCi0gIHsgMCwgMCwgMCwgMCwgMCwgInVudXNlZCIgfSwKLQotICAvKiBUaGUgUjEgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlIgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJSX1IxIChVTlVTRUQgKyAxKQotI2RlZmluZSBSUl9SMV9NQVNLICgweGYgPDwgNCkKLSAgeyA0LCA0LCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUlIgUjEiIH0sCi0KLSAgLyogVGhlIFIyIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFJSIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUl9SMiAoUlJfUjEgKyAxKQotI2RlZmluZSBSUl9SMl9NQVNLICgweGYpCi0gIHsgNCwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJSIFIyIiB9LAotCi0gIC8qIFRoZSBJIGZpZWxkIGluIGFuIFJSIGZvcm0gU1ZDLXN0eWxlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlJfSSAoUlJfUjIgKyAxKQotI2RlZmluZSBSUl9JX01BU0sgKDB4ZmYpCi0gIHsgOCwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX1JFTEFUSVZFLCAiUlIgSSAoc3ZjKSIgfSwKLQotICAvKiBUaGUgUjEgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlJFIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkVfUjEgKFJSX0kgKyAxKQotI2RlZmluZSBSUkVfUjFfTUFTSyAoMHhmIDw8IDQpCi0gIHsgNCwgNCwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJSRSBSMSIgfSwKLQotICAvKiBUaGUgUjIgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlJFIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkVfUjIgKFJSRV9SMSArIDEpCi0jZGVmaW5lIFJSRV9SMl9NQVNLICgweGYpCi0gIHsgNCwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJSRSBSMiIgfSwKLQotICAvKiBUaGUgUjEgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlJGIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkZfUjEgKFJSRV9SMiArIDEpCi0jZGVmaW5lIFJSRl9SMV9NQVNLICgweGYgPDwgNCkKLSAgeyA0LCA0LCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUlJGIFIxIiB9LAotCi0gIC8qIFRoZSBSMiByZWdpc3RlciBmaWVsZCBpbiBhbiBSUkYgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJSRl9SMiAoUlJGX1IxICsgMSkKLSNkZWZpbmUgUlJGX1IyX01BU0sgKDB4ZikKLSAgeyA0LCAwLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUlJGIFIyIiB9LAotCi0gIC8qIFRoZSBSMyByZWdpc3RlciBmaWVsZCBpbiBhbiBSUkYgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJSRl9SMyAoUlJGX1IyICsgMSkKLSNkZWZpbmUgUlJGX1IzX01BU0sgKDB4ZiA8PCAxMikKLSAgeyA0LCAxMiwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJSRiBSMyIgfSwKLQotICAvKiBUaGUgUjEgcmVnaXN0ZXIgZmllbGQgaW4gYW4gUlggb3IgUlMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJYX1IxIChSUkZfUjMgKyAxKQotI2RlZmluZSBSWF9SMV9NQVNLICgweGYgPDwgMjApCi0gIHsgNCwgMjAsIDAsIDAsIEkzNzBfT1BFUkFORF9HUFIsICJSWCBSMSIgfSwKLQotICAvKiBUaGUgWDIgaW5kZXggZmllbGQgaW4gYW4gUlggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJYX1gyIChSWF9SMSArIDEpCi0jZGVmaW5lIFJYX1gyX01BU0sgKDB4ZiA8PCAxNikKLSAgeyA0LCAxNiwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiB8IEkzNzBfT1BFUkFORF9JTkRFWCwgIlJYIFgyIn0sCi0KLSAgLyogVGhlIEIyIGJhc2UgZmllbGQgaW4gYW4gUlggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJYX0IyIChSWF9YMiArIDEpCi0jZGVmaW5lIFJYX0IyX01BU0sgKDB4ZiA8PCAxMikKLSAgeyA0LCAxMiwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiB8IEkzNzBfT1BFUkFORF9CQVNFLCAiUlggQjIifSwKLQotICAvKiBUaGUgRDIgZGlzcGxhY2VtZW50IGZpZWxkIGluIGFuIFJYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSWF9EMiAoUlhfQjIgKyAxKQotI2RlZmluZSBSWF9EMl9NQVNLICgweGZmZikKLSAgeyAxMiwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX1JFTEFUSVZFLCAiUlggRDIifSwKLQotIC8qIFRoZSBSMyByZWdpc3RlciBmaWVsZCBpbiBhbiBSWEYgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJYRl9SMyAoUlhfRDIgKyAxKQotI2RlZmluZSBSWEZfUjNfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCBpbnNlcnRfcnhmX3IzLCBleHRyYWN0X3J4Zl9yMywgSTM3MF9PUEVSQU5EX0dQUiwgIlJYRiBSMyIgfSwKLQotICAvKiBUaGUgRDIgZGlzcGxhY2VtZW50IGZpZWxkIGluIGFuIFJTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSU19EMiAoUlhGX1IzICsgMSkKLSNkZWZpbmUgUlNfRDJfTUFTSyAoMHhmZmYpCi0gIHsgMTIsIDAsIDAsIDAsIEkzNzBfT1BFUkFORF9SRUxBVElWRSwgIlJTIEQyIn0sCi0KLSAgLyogVGhlIFIzIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFJTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSU19SMyAoUlNfRDIgKyAxKQotI2RlZmluZSBSU19SM19NQVNLICgweGYgPDwgMTYpCi0gIHsgNCwgMTYsIDAsIDAsIEkzNzBfT1BFUkFORF9HUFIsICJSUyBSMyIgfSwKLQotICAvKiBUaGUgQjIgYmFzZSBmaWVsZCBpbiBhbiBSUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlNfQjIgKFJTX1IzICsgMSkKLSNkZWZpbmUgUlNfQjJfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSIHwgSTM3MF9PUEVSQU5EX0JBU0UgfCBJMzcwX09QRVJBTkRfU0JBU0UsICJSUyBCMiJ9LAotCi0gIC8qIFRoZSBvcHRpb25hbCBCMiBiYXNlIGZpZWxkIGluIGFuIFJTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBOb3RlIHRoYXQgdGhpcyBmaWVsZCB3aWxsIGFsbW9zdCBhbHdheXMgYmUgYWJzZW50ICovCi0jZGVmaW5lIFJTX0IyX09QVCAoUlNfQjIgKyAxKQotI2RlZmluZSBSU19CMl9PUFRfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSIHwgSTM3MF9PUEVSQU5EX09QVElPTkFMLCAiUlMgQjIgT1BUIn0sCi0KLSAgLyogVGhlIFIxIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFJTSSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlNJX1IxIChSU19CMl9PUFQgKyAxKQotI2RlZmluZSBSU0lfUjFfTUFTSyAoMHhmIDw8IDIwKQotICB7IDQsIDIwLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUlNJIFIxIiB9LAotCi0gIC8qIFRoZSBSMyByZWdpc3RlciBmaWVsZCBpbiBhbiBSU0kgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJTSV9SMyAoUlNJX1IxICsgMSkKLSNkZWZpbmUgUlNJX1IzX01BU0sgKDB4ZiA8PCAxNikKLSAgeyA0LCAxNiwgMCwgMCwgSTM3MF9PUEVSQU5EX0dQUiwgIlJTSSBSMyIgfSwKLQotICAvKiBUaGUgSTIgaW1tZWRpYXRlIGZpZWxkIGluIGFuIFJTSSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlNJX0kyIChSU0lfUjMgKyAxKQotI2RlZmluZSBSU0lfSTJfTUFTSyAoMHhmZmZmKQotICB7IDE2LCAwLCAwLCAwLCBJMzcwX09QRVJBTkRfUkVMQVRJVkUsICJSU0kgSTIiIH0sCi0KLSAgLyogVGhlIFIxIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFJJIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSSV9SMSAoUlNJX0kyICsgMSkKLSNkZWZpbmUgUklfUjFfTUFTSyAoMHhmIDw8IDIwKQotICB7IDQsIDIwLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiUkkgUjEiIH0sCi0KLSAgLyogVGhlIEkyIGltbWVkaWF0ZSBmaWVsZCBpbiBhbiBSSSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUklfSTIgKFJJX1IxICsgMSkKLSNkZWZpbmUgUklfSTJfTUFTSyAoMHhmZmZmKQotICB7IDE2LCAwLCAwLCAwLCBJMzcwX09QRVJBTkRfUkVMQVRJVkUsICJSSSBJMiIgfSwKLQotIC8qIFRoZSBJMiBpbmRleCBmaWVsZCBpbiBhbiBTSSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0lfSTIgKFJJX0kyICsgMSkKLSNkZWZpbmUgU0lfSTJfTUFTSyAoMHhmZiA8PCAxNikKLSAgeyA4LCAxNiwgMCwgMCwgSTM3MF9PUEVSQU5EX1JFTEFUSVZFLCAiU0kgSTIifSwKLQotIC8qIFRoZSBCMSBiYXNlIHJlZ2lzdGVyIGZpZWxkIGluIGFuIFNJIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTSV9CMSAoU0lfSTIgKyAxKQotI2RlZmluZSBTSV9CMV9NQVNLICgweGYgPDwgMTIpCi0gIHsgNCwgMTIsIDAsIDAsIEkzNzBfT1BFUkFORF9HUFIsICJTSSBCMSIgfSwKLQotICAvKiBUaGUgRDEgZGlzcGxhY2VtZW50IGZpZWxkIGluIGFuIFNJIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTSV9EMSAoU0lfQjEgKyAxKQotI2RlZmluZSBTSV9EMV9NQVNLICgweGZmZikKLSAgeyAxMiwgMCwgMCwgMCwgSTM3MF9PUEVSQU5EX1JFTEFUSVZFLCAiU0kgRDEiIH0sCi0KLSAvKiBUaGUgQjIgYmFzZSByZWdpc3RlciBmaWVsZCBpbiBhbiBTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTX0IyIChTSV9EMSArIDEpCi0jZGVmaW5lIFNfQjJfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSIHwgSTM3MF9PUEVSQU5EX0JBU0UgfCBJMzcwX09QRVJBTkRfU0JBU0UsICJTIEIyIiB9LAotCi0gIC8qIFRoZSBEMiBkaXNwbGFjZW1lbnQgZmllbGQgaW4gYW4gUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU19EMiAoU19CMiArIDEpCi0jZGVmaW5lIFNfRDJfTUFTSyAoMHhmZmYpCi0gIHsgMTIsIDAsIDAsIDAsIEkzNzBfT1BFUkFORF9SRUxBVElWRSwgIlMgRDIiIH0sCi0KLSAgLyogVGhlIEwgbGVuZ3RoIGZpZWxkIGluIGFuIFNTIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFNTX0wgKFNfRDIgKyAxKQotI2RlZmluZSBTU19MX01BU0sgKDB4ZmZmZjw8MTYpCi0gIHsgOCwgMTYsIDAsIDAsIEkzNzBfT1BFUkFORF9SRUxBVElWRSB8IEkzNzBfT1BFUkFORF9MRU5HVEgsICJTUyBMIiB9LAotCi0gLyogVGhlIEIxIGJhc2UgcmVnaXN0ZXIgZmllbGQgaW4gYW4gU1MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNTX0IxIChTU19MICsgMSkKLSNkZWZpbmUgU1NfQjFfTUFTSyAoMHhmIDw8IDEyKQotICB7IDQsIDEyLCAwLCAwLCBJMzcwX09QRVJBTkRfR1BSLCAiU1MgQjEiIH0sCi0KLSAgLyogVGhlIEQxIGRpc3BsYWNlbWVudCBmaWVsZCBpbiBhbiBTUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1NfRDEgKFNTX0IxICsgMSkKLSNkZWZpbmUgU1NfRDFfTUFTSyAoMHhmZmYpCi0gIHsgMTIsIDAsIDAsIDAsIEkzNzBfT1BFUkFORF9SRUxBVElWRSwgIlNTIEQxIiB9LAotCi0gLyogVGhlIEIyIGJhc2UgcmVnaXN0ZXIgZmllbGQgaW4gYW4gU1MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNTX0IyIChTU19EMSArIDEpCi0jZGVmaW5lIFNTX0IyX01BU0sgKDB4ZiA8PCAxMikKLSAgeyA0LCAxMiwgaW5zZXJ0X3NzX2IyLCBleHRyYWN0X3NzX2IyLCBJMzcwX09QRVJBTkRfR1BSIHwgSTM3MF9PUEVSQU5EX0JBU0UgfCBJMzcwX09QRVJBTkRfU0JBU0UsICJTUyBCMiIgfSwKLQotICAvKiBUaGUgRDIgZGlzcGxhY2VtZW50IGZpZWxkIGluIGFuIFNTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTU19EMiAoU1NfQjIgKyAxKQotI2RlZmluZSBTU19EMl9NQVNLICgweGZmZikKLSAgeyAxMiwgMCwgaW5zZXJ0X3NzX2QyLCBleHRyYWN0X3NzX2QyLCBJMzcwX09QRVJBTkRfUkVMQVRJVkUsICJTUyBEMiIgfSwKLQotCi19OwotCi0vKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaTM3MF9pbnNuX3QKLWluc2VydF9zc19iMiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaW5zbi5pWzFdIHw9ICh2YWx1ZSAmIDB4ZikgPDwgMjg7Ci0gIHJldHVybiBpbnNuOwotfQotCi1zdGF0aWMgaTM3MF9pbnNuX3QKLWluc2VydF9zc19kMiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaW5zbi5pWzFdIHw9ICh2YWx1ZSAmIDB4ZmZmKSA8PCAxNjsKLSAgcmV0dXJuIGluc247Ci19Ci0KLXN0YXRpYyBpMzcwX2luc25fdAotaW5zZXJ0X3J4Zl9yMyAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaW5zbi5pWzFdIHw9ICh2YWx1ZSAmIDB4ZikgPDwgMjg7Ci0gIHJldHVybiBpbnNuOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9zc19iMiAoaW5zbiwgaW52YWxpZCkKLSAgICAgaTM3MF9pbnNuX3QgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICByZXR1cm4gKGluc24uaVsxXSA+PjI4KSAmIDB4ZjsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3Rfc3NfZDIgKGluc24sIGludmFsaWQpCi0gICAgIGkzNzBfaW5zbl90IGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgcmV0dXJuIChpbnNuLmlbMV0gPj4xNikgJiAweGZmZjsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcnhmX3IzIChpbnNuLCBpbnZhbGlkKQotICAgICBpMzcwX2luc25fdCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiAoaW5zbi5pWzFdID4+MjgpICYgMHhmOwotfQotCi0MCi0vKiBNYWNyb3MgdXNlZCB0byBmb3JtIG9wY29kZXMuICAqLwotCi0vKiBUaGUgc2hvcnQtaW5zdHJ1Y3Rpb24gb3Bjb2RlLiAgKi8KLSNkZWZpbmUgT1BTKHgpICgoKCh1bnNpZ25lZCBzaG9ydCkoeCkpICYgMHhmZikgPDwgOCkKLSNkZWZpbmUgT1BTX01BU0sgT1BTICgweGZmKQotCi0vKiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gb3Bjb2RlICovCi0jZGVmaW5lIFhPUFMoeCkgKCgoKHVuc2lnbmVkIHNob3J0KSh4KSkgJiAweGZmKSA8PCAyNCkKLSNkZWZpbmUgWE9QU19NQVNLIFhPUFMgKDB4ZmYpCi0KLS8qIHRoZSBTIGluc3RydWN0aW9uIG9wY29kZSAqLwotI2RlZmluZSBTT1BTKHgpICgoKCh1bnNpZ25lZCBzaG9ydCkoeCkpICYgMHhmZmZmKSA8PCAxNikKLSNkZWZpbmUgU09QU19NQVNLIFNPUFMgKDB4ZmZmZikKLQotLyogdGhlIEUgaW5zdHJ1Y3Rpb24gb3Bjb2RlICovCi0jZGVmaW5lIEVPUFMoeCkgKCgodW5zaWduZWQgc2hvcnQpKHgpKSAmIDB4ZmZmZikKLSNkZWZpbmUgRU9QU19NQVNLIEVPUFMgKDB4ZmZmZikKLQotLyogdGhlIFJJIGluc3RydWN0aW9uIG9wY29kZSAqLwotI2RlZmluZSBST1BTKHgpICgoKCgodW5zaWduZWQgc2hvcnQpKHgpKSAmIDB4ZmYwKSA8PCAyMCkgfCBcCi0gICAgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoeCkpICYgMHgwMGYpIDw8IDE2KSkKLSNkZWZpbmUgUk9QU19NQVNLIFJPUFMgKDB4ZmZmKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIEFuIEUgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEUob3ApICAoRU9QUyAob3ApKQotI2RlZmluZSBFX01BU0sgRSAoMHhmZmZmKQotCi0vKiBBbiBSUiBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlIob3AsIHIxLCByMikgXAotICAoT1BTIChvcCkgfCAoKCgodW5zaWduZWQgc2hvcnQpKHIxKSkgJiAweGYpIDw8IDQpIHwgICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkocjIpKSAmIDB4ZikgKSkKLQotI2RlZmluZSBSUl9NQVNLIFJSICgweGZmLCAweDAsIDB4MCkKLQotLyogQW4gU1ZDLXN0eWxlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1ZDKG9wLCBpKSBcCi0gIChPUFMgKG9wKSB8ICgoKHVuc2lnbmVkIHNob3J0KShpKSkgJiAweGZmKSkKLQotI2RlZmluZSBTVkNfTUFTSyBTVkMgKDB4ZmYsIDB4MCkKLQotLyogQW4gUlJFIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkUob3AsIHIxLCByMikgXAotICAoU09QUyAob3ApIHwgKCgoKHVuc2lnbmVkIHNob3J0KShyMSkpICYgMHhmKSA8PCA0KSB8ICAgXAotICAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShyMikpICYgMHhmKSApKQotCi0jZGVmaW5lIFJSRV9NQVNLIFJSRSAoMHhmZmZmLCAweDAsIDB4MCkKLQotLyogQW4gUlJGIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUkYob3AsIHIzLCByMSwgcjIpIFwKLSAgKFNPUFMgKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkocjMpKSAmIDB4ZikgPDwgMTIpIHwgICBcCi0gICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKHIxKSkgJiAweGYpIDw8IDQpICB8ICAgXAotICAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShyMikpICYgMHhmKSApKQotCi0jZGVmaW5lIFJSRl9NQVNLIFJSRiAoMHhmZmZmLCAweDAsIDB4MCwgMHgwKQotCi0vKiBBbiBSWCBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBSWChvcCwgcjEsIHgyLCBiMiwgZDIpIFwKLSAgKFhPUFMob3ApIHwgKCgoKHVuc2lnbmVkIHNob3J0KShyMSkpICYgMHhmKSA8PCAyMCkgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKHgyKSkgJiAweGYpIDw8IDE2KSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoYjIpKSAmIDB4ZikgPDwgMTIpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMikpICYgMHhmZmYpKSkKLQotI2RlZmluZSBSWF9NQVNLIFJYICgweGZmLCAweDAsIDB4MCwgMHgwLCAweDApCi0KLS8qIEFuIFJYRSBmb3JtIGluc3RydWN0aW9uIGhpZ2ggd29yZC4gKi8KLSNkZWZpbmUgUlhFSChvcCwgcjEsIHgyLCBiMiwgZDIpIFwKLSAgKFhPUFMob3ApIHwgKCgoKHVuc2lnbmVkIHNob3J0KShyMSkpICYgMHhmKSA8PCAyMCkgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKHgyKSkgJiAweGYpIDw8IDE2KSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoYjIpKSAmIDB4ZikgPDwgMTIpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMikpICYgMHhmZmYpKSkKLQotI2RlZmluZSBSWEVIX01BU0sgUlhFSCAoMHhmZiwgMCwgMCwgMCwgMCkKLQotLyogQW4gUlhFIGZvcm0gaW5zdHJ1Y3Rpb24gbG93IHdvcmQuICovCi0jZGVmaW5lIFJYRUwob3ApIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShvcCkpICYgMHhmZikgPDwgMTYgKQotCi0jZGVmaW5lIFJYRUxfTUFTSyBSWEVMICgweGZmKQotCi0vKiBBbiBSWEYgZm9ybSBpbnN0cnVjdGlvbiBoaWdoIHdvcmQuICovCi0jZGVmaW5lIFJYRkgob3AsIHIxLCB4MiwgYjIsIGQyKSBcCi0gIChYT1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkocjEpKSAmIDB4ZikgPDwgMjApIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KSh4MikpICYgMHhmKSA8PCAxNikgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKGIyKSkgJiAweGYpIDw8IDEyKSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoZDIpKSAmIDB4ZmZmKSkpCi0KLSNkZWZpbmUgUlhGSF9NQVNLIFJYRkggKDB4ZmYsIDAsIDAsIDAsIDApCi0KLS8qIEFuIFJYRiBmb3JtIGluc3RydWN0aW9uIGxvdyB3b3JkLiAqLwotI2RlZmluZSBSWEZMKG9wLCByMykgXAotICAgICAgICAgICAgICAoKCgoKHVuc2lnbmVkIHNob3J0KShyMykpICYgMHhmKSAgPDwgMjggKSB8IFwKLSAgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkob3ApKSAmIDB4ZmYpIDw8IDE2ICkpCi0KLSNkZWZpbmUgUlhGTF9NQVNLIFJYRkwgKDB4ZmYsIDApCi0KLS8qIEFuIFJTIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFJTKG9wLCByMSwgYjMsIGIyLCBkMikgXAotICAoWE9QUyhvcCkgfCAoKCgodW5zaWduZWQgc2hvcnQpKHIxKSkgJiAweGYpIDw8IDIwKSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoYjMpKSAmIDB4ZikgPDwgMTYpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShiMikpICYgMHhmKSA8PCAxMikgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKGQyKSkgJiAweGZmZikpKQotCi0jZGVmaW5lIFJTX01BU0sgUlMgKDB4ZmYsIDB4MCwgMHgwLCAweDAsIDB4MCkKLQotLyogQW4gUlNJIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFJTSShvcCwgcjEsIHIzLCBpMikgXAotICAoWE9QUyhvcCkgfCAoKCgodW5zaWduZWQgc2hvcnQpKHIxKSkgJiAweGYpIDw8IDIwKSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkocjMpKSAmIDB4ZikgPDwgMTYpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShpMikpICYgMHhmZmZmKSkpCi0KLSNkZWZpbmUgUlNJX01BU0sgUlNJICgweGZmLCAweDAsIDB4MCwgMHgwKQotCi0vKiBBbiBSSSBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBSSShvcCwgcjEsIGkyKSBcCi0gIChST1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkocjEpKSAmIDB4ZikgPDwgMjApIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShpMikpICYgMHhmZmZmKSkpCi0KLSNkZWZpbmUgUklfTUFTSyBSSSAoMHhmZmYsIDB4MCwgMHgwKQotCi0vKiBBbiBTSSBmb3JtIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBTSShvcCwgaTIsIGIxLCBkMSkgXAotICAoWE9QUyhvcCkgfCAoKCgodW5zaWduZWQgc2hvcnQpKGkyKSkgJiAweGZmKSA8PCAxNikgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKGIxKSkgJiAweGYpICA8PCAxMikgfCAgXAotICAgICAgICAgICAgICAoKCgodW5zaWduZWQgc2hvcnQpKGQxKSkgJiAweGZmZikpKQotCi0jZGVmaW5lIFNJX01BU0sgU0kgKDB4ZmYsIDB4MCwgMHgwLCAweDApCi0KLS8qIEFuIFMgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgUyhvcCwgYjIsIGQyKSBcCi0gIChTT1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkoYjIpKSAmIDB4ZikgPDwgMTIpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMikpICYgMHhmZmYpKSkKLQotI2RlZmluZSBTX01BU0sgUyAoMHhmZmZmLCAweDAsIDB4MCkKLQotLyogQW4gU1MgZm9ybSBpbnN0cnVjdGlvbiBoaWdoIHdvcmQuICovCi0jZGVmaW5lIFNTSChvcCwgbCwgYjEsIGQxKSBcCi0gIChYT1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkobCkpICYgMHhmZikgPDwgMTYpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShiMSkpICYgMHhmKSAgPDwgMTIpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMSkpICYgMHhmZmYpKSkKLQotLyogQW4gU1MgZm9ybSBpbnN0cnVjdGlvbiBsb3cgd29yZC4gKi8KLSNkZWZpbmUgU1NMKGIyLCBkMikgXAotICAgICAgICAgICAgKCAoKCgodW5zaWduZWQgc2hvcnQpKGIxKSkgJiAweGYpICAgPDwgMjgpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMSkpICYgMHhmZmYpIDw8IDE2ICkpCi0KLSNkZWZpbmUgU1NfTUFTSyBTU0ggKDB4ZmYsIDB4MCwgMHgwLCAweDApCi0KLS8qIEFuIFNTRSBmb3JtIGluc3RydWN0aW9uIGhpZ2ggd29yZC4gKi8KLSNkZWZpbmUgU1NFSChvcCwgYjEsIGQxKSBcCi0gIChTT1BTKG9wKSB8ICgoKCh1bnNpZ25lZCBzaG9ydCkoYjEpKSAmIDB4ZikgIDw8IDEyKSB8ICBcCi0gICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBzaG9ydCkoZDEpKSAmIDB4ZmZmKSkpCi0KLS8qIEFuIFNTRSBmb3JtIGluc3RydWN0aW9uIGxvdyB3b3JkLiAqLwotI2RlZmluZSBTU0VMKGIyLCBkMikgXAotICAgICAgICAgICAgKCAoKCgodW5zaWduZWQgc2hvcnQpKGIxKSkgJiAweGYpICAgPDwgMjgpIHwgIFwKLSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIHNob3J0KShkMSkpICYgMHhmZmYpIDw8IDE2ICkpCi0KLSNkZWZpbmUgU1NFX01BU0sgU1NFSCAoMHhmZmZmLCAweDAsIDB4MCkKLQotDAotLyogU21hbGxlciBuYW1lcyBmb3IgdGhlIGZsYWdzIHNvIGVhY2ggZW50cnkgaW4gdGhlIG9wY29kZXMgdGFibGUgd2lsbAotICAgZml0IG9uIGEgc2luZ2xlIGxpbmUuICBUaGVzZSBmbGFncyBhcmUgc2V0IHVwIHNvIHRoYXQgZS5nLiBJWEEgbWVhbnMKLSAgIHRoZSBpbnNuIGlzIHN1cHBvcnRlZCBvbiB0aGUgMzcwL1hBIG9yIG5ld2VyIGFyY2hpdGVjdHVyZS4KLSAgIE5vdGUgdGhhdCAzNzAgb3Igb2xkZXIgb2Jzb2xldGUgaW5zbidzIGFyZSBub3Qgc3VwcG9ydGVkIC4uLgotICovCi0jZGVmaW5lCUlCRglJMzcwX09QQ09ERV9FU0EzOTBfQkYKLSNkZWZpbmUJSUJTCUkzNzBfT1BDT0RFX0VTQTM5MF9CUwotI2RlZmluZQlJQ0sJSTM3MF9PUENPREVfRVNBMzkwX0NLCi0jZGVmaW5lCUlDTQlJMzcwX09QQ09ERV9FU0EzOTBfQ00KLSNkZWZpbmUJSUZYCUkzNzBfT1BDT0RFX0VTQTM5MF9GWAotI2RlZmluZQlJSFgJSTM3MF9PUENPREVfRVNBMzkwX0hYCi0jZGVmaW5lCUlJUglJMzcwX09QQ09ERV9FU0EzOTBfSVIKLSNkZWZpbmUJSU1JCUkzNzBfT1BDT0RFX0VTQTM5MF9NSQotI2RlZmluZQlJUEMJSTM3MF9PUENPREVfRVNBMzkwX1BDCi0jZGVmaW5lCUlQTAlJMzcwX09QQ09ERV9FU0EzOTBfUEwKLSNkZWZpbmUJSVFSCUkzNzBfT1BDT0RFX0VTQTM5MF9RUgotI2RlZmluZQlJUlAJSTM3MF9PUENPREVfRVNBMzkwX1JQCi0jZGVmaW5lCUlTQQlJMzcwX09QQ09ERV9FU0EzOTBfU0EKLSNkZWZpbmUJSVNHCUkzNzBfT1BDT0RFX0VTQTM5MF9TRwotI2RlZmluZQlJU1IJSTM3MF9PUENPREVfRVNBMzkwX1NSCi0jZGVmaW5lCUlUUglJMzcwX09QQ09ERV9FU0EzOTBfU1IKLSNkZWZpbmUJSTM5MAlJQkYgIHwgSUJTIHwgSUNLIHwgSUNNIHwgSUlSIHwgSUZYIHwgSUhYIHwgSU1JIHwgSVBDIHwgSVBMIHwgSVFSIHwgSVJQIHwgSVNBIHwgSVNHIHwgSVNSIHwgSVRSIHwgSTM3MF9PUENPREVfRVNBMzkwCi0jZGVmaW5lCUlFU0EJSTM5MCB8IEkzNzBfT1BDT0RFX0VTQTM3MAotI2RlZmluZSBJWEEJSUVTQSB8IEkzNzBfT1BDT0RFXzM3MF9YQQotI2RlZmluZQlJMzcwCUlYQSAgfCBJMzcwX09QQ09ERV8zNzAKLSNkZWZpbmUgSTM2MAlJMzcwIHwgSTM3MF9PUENPREVfMzYwCi0KLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkgICAgTEVOICBPUENPREVfSEkgIE9QQ09ERV9MTwlNQVNLX0hJIE1BU0tfTE8JRkxBR1MJCXsgT1BFUkFORFMgfQotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIEZMQUdTIGFyZSBmbGFncyBpbmRpY2F0ZWQgd2hhdCBwcm9jZXNzb3JzIHN1cHBvcnQgdGhlIGluc3RydWN0aW9uLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCi0KLWNvbnN0IHN0cnVjdCBpMzcwX29wY29kZSBpMzcwX29wY29kZXNbXSA9IHsKLQotLyogRSBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAicHIiLCAgICAgMiwge0UoMHgwMTAxKSwgICAgMH0sIHtFX01BU0ssICAwfSwgSUVTQSwgIHswfSB9LAotCi17ICJ0cmFwMiIsICAyLCB7RSgweDAxRkYpLCAgICAwfSwge0VfTUFTSywgIDB9LCBJVFIsICAgezB9IH0sCi17ICJ1cHQiLCAgICAyLCB7RSgweDAxMDIpLCAgICAwfSwge0VfTUFTSywgIDB9LCBJWEEsICAgezB9IH0sCi0KLS8qIFJSIGZvcm0gaW5zdHJ1Y3Rpb25zICovCi17ICJhciIsICAgICAyLCB7UlIoMHgxYSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImFkciIsICAgIDIsIHtSUigweDJhLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiYWVyIiwgICAgMiwge1JSKDB4M2EsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJhbHIiLCAgICAyLCB7UlIoMHgxZSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImF1ciIsICAgIDIsIHtSUigweDJlLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiYXdyIiwgICAgMiwge1JSKDB4M2UsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJheHIiLCAgICAyLCB7UlIoMHgzNiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImJhbHIiLCAgIDIsIHtSUigweDA1LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiYmFzciIsICAgMiwge1JSKDB4MGQsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSVhBLCAgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJiYXNzbSIsICAyLCB7UlIoMHgwYywwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJWEEsICAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImJzbSIsICAgIDIsIHtSUigweDBiLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIElYQSwgICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiYmNyIiwgICAgMiwge1JSKDB4MDcsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJiY3RyIiwgICAyLCB7UlIoMHgwNiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImNkciIsICAgIDIsIHtSUigweDI5LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiY2VyIiwgICAgMiwge1JSKDB4MzksMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJjbHIiLCAgICAyLCB7UlIoMHgxNSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImNsY2wiLCAgIDIsIHtSUigweDBmLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiY3IiLCAgICAgMiwge1JSKDB4MTksMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJkZHIiLCAgICAyLCB7UlIoMHgyZCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImRlciIsICAgIDIsIHtSUigweDNkLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAiZHIiLCAgICAgMiwge1JSKDB4MWQsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJoZHIiLCAgICAyLCB7UlIoMHgyNCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImhlciIsICAgIDIsIHtSUigweDM0LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibGNkciIsICAgMiwge1JSKDB4MjMsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJsY2VyIiwgICAyLCB7UlIoMHgzMywwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImxjciIsICAgIDIsIHtSUigweDEzLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibGRyIiwgICAgMiwge1JSKDB4MjgsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJsZXIiLCAgICAyLCB7UlIoMHgzOCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImxuZHIiLCAgIDIsIHtSUigweDIxLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibG5lciIsICAgMiwge1JSKDB4MzEsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJsbnIiLCAgICAyLCB7UlIoMHgxMSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImxwZHIiLCAgIDIsIHtSUigweDIwLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibHBlciIsICAgMiwge1JSKDB4MzAsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJscHIiLCAgICAyLCB7UlIoMHgxMCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImxyIiwgICAgIDIsIHtSUigweDE4LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibHJkciIsICAgMiwge1JSKDB4MjUsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJscmVyIiwgICAyLCB7UlIoMHgzNSwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgImx0ZHIiLCAgIDIsIHtSUigweDIyLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibHRlciIsICAgMiwge1JSKDB4MzIsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJsdHIiLCAgICAyLCB7UlIoMHgxMiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgIm1kciIsICAgIDIsIHtSUigweDJjLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibWVyIiwgICAgMiwge1JSKDB4M2MsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJtciIsICAgICAyLCB7UlIoMHgxYywwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgIm12Y2wiLCAgIDIsIHtSUigweDBlLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAibXhkciIsICAgMiwge1JSKDB4MjcsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJteHIiLCAgICAyLCB7UlIoMHgyNiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgIm5yIiwgICAgIDIsIHtSUigweDE0LDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAib3IiLCAgICAgMiwge1JSKDB4MTYsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJzZHIiLCAgICAyLCB7UlIoMHgyYiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgInNlciIsICAgIDIsIHtSUigweDNiLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAic2xyIiwgICAgMiwge1JSKDB4MWYsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJzcG0iLCAgICAyLCB7UlIoMHgwNCwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxfSB9LAoteyAic3IiLCAgICAgMiwge1JSKDB4MWIsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJzdXIiLCAgICAyLCB7UlIoMHgzZiwwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLXsgInN3ciIsICAgIDIsIHtSUigweDJmLDAsMCksIDB9LCB7UlJfTUFTSywgMH0sIEkzNzAsICB7UlJfUjEsIFJSX1IyfSB9LAoteyAic3hyIiwgICAgMiwge1JSKDB4MzcsMCwwKSwgMH0sIHtSUl9NQVNLLCAwfSwgSTM3MCwgIHtSUl9SMSwgUlJfUjJ9IH0sCi17ICJ4ciIsICAgICAyLCB7UlIoMHgxNywwLDApLCAwfSwge1JSX01BU0ssIDB9LCBJMzcwLCAge1JSX1IxLCBSUl9SMn0gfSwKLQotLyogdW51c3VhbCBSUiBmb3JtYXRzICovCi17ICJzdmMiLCAgICAyLCB7U1ZDKDB4MGEsMCksIDB9LCB7U1ZDX01BU0ssIDB9LCBJMzcwLCAge1JSX0l9IH0sCi0KLS8qIFJSRSBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAiYWRiciIsICAgNCwge1JSRSgweGIzMWEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYWViciIsICAgNCwge1JSRSgweGIzMGEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYXhiciIsICAgNCwge1JSRSgweGIzNGEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYmFrciIsICAgNCwge1JSRSgweGIyNDAsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUVTQSwge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYnNhIiwgICAgNCwge1JSRSgweGIyNWEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJTLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiYnNnIiwgICAgNCwge1JSRSgweGIyNTgsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVNHLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2RiciIsICAgNCwge1JSRSgweGIzMTksMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2RmYnIiLCAgNCwge1JSRSgweGIzOTUsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2RmciIsICAgNCwge1JSRSgweGIzYjUsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUhYLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2ViciIsICAgNCwge1JSRSgweGIzMDksMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2VmYnIiLCAgNCwge1JSRSgweGIzOTQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2VmciIsICAgNCwge1JSRSgweGIzYjQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUhYLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2tzbSIsICAgNCwge1JSRSgweGIyNDEsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUNLLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY2xzdCIsICAgNCwge1JSRSgweGIyNWQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVNSLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3B5YSIsICAgNCwge1JSRSgweGIyNGQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUVTQSwge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3VzZSIsICAgNCwge1JSRSgweGIyNTcsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUVTQSwge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3hiciIsICAgNCwge1JSRSgweGIzNDksMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3hmYnIiLCAgNCwge1JSRSgweGIzOTYsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3hmciIsICAgNCwge1JSRSgweGIzYjYsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUhYLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiY3hyIiwgICAgNCwge1JSRSgweGIzNjksMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUhYLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZGRiciIsICAgNCwge1JSRSgweGIzMWQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZGViciIsICAgNCwge1JSRSgweGIzMGQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZHhiciIsICAgNCwge1JSRSgweGIzNGQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZHhyIiwgICAgNCwge1JSRSgweGIyMmQsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVhBLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZWFyIiwgICAgNCwge1JSRSgweGIyNGYsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUVTQSwge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZWZwYyIsICAgNCwge1JSRSgweGIzOGMsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSUJGLCAge1JSRV9SMSwgUlJFX1IyfSB9LAoteyAiZXBhciIsICAgNCwge1JSRSgweGIyMjYsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVhBLCAge1JSRV9SMX0gfSwKLXsgImVyZWciLCAgIDQsIHtSUkUoMHhiMjQ5LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImVzYXIiLCAgIDQsIHtSUkUoMHhiMjI3LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjF9IH0sCi17ICJlc3RhIiwgICA0LCB7UlJFKDB4YjI0YSwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJmaWRyIiwgICA0LCB7UlJFKDB4YjM3ZiwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJSFgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJmaWVyIiwgICA0LCB7UlJFKDB4YjM3NywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJSFgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJmaXhyIiwgICA0LCB7UlJFKDB4YjM2NywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJSFgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJpYWMiLCAgICA0LCB7UlJFKDB4YjIyNCwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJWEEsICB7UlJFX1IxfSB9LAoteyAiaXBtIiwgICAgNCwge1JSRSgweGIyMjIsMCwwKSwgICAwfSwge1JSRV9NQVNLLCAwfSwgSVhBLCAge1JSRV9SMX0gfSwKLXsgImlwdGUiLCAgIDQsIHtSUkUoMHhiMjIxLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImlza2UiLCAgIDQsIHtSUkUoMHhiMjI5LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIml2c2siLCAgIDQsIHtSUkUoMHhiMjIzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImtkYnIiLCAgIDQsIHtSUkUoMHhiMzE4LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImtlYnIiLCAgIDQsIHtSUkUoMHhiMzA4LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImt4YnIiLCAgIDQsIHtSUkUoMHhiMzQ4LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxjZGJyIiwgIDQsIHtSUkUoMHhiMzEzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxjZWJyIiwgIDQsIHtSUkUoMHhiMzAzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxjeGJyIiwgIDQsIHtSUkUoMHhiMzQzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxjeHIiLCAgIDQsIHtSUkUoMHhiMzYzLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxkZXIiLCAgIDQsIHtSUkUoMHhiMzI0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxkeGJyIiwgIDQsIHtSUkUoMHhiMzQ1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxlZGJyIiwgIDQsIHtSUkUoMHhiMzQ0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxleGJyIiwgIDQsIHtSUkUoMHhiMzQ2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxleHIiLCAgIDQsIHtSUkUoMHhiMzY2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxuZGJyIiwgIDQsIHtSUkUoMHhiMzExLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxuZWJyIiwgIDQsIHtSUkUoMHhiMzAxLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxueGJyIiwgIDQsIHtSUkUoMHhiMzQxLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxueHIiLCAgIDQsIHtSUkUoMHhiMzYxLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxwZGJyIiwgIDQsIHtSUkUoMHhiMzEwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxwZWJyIiwgIDQsIHtSUkUoMHhiMzAwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxweGJyIiwgIDQsIHtSUkUoMHhiMzQwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImxweHIiLCAgIDQsIHtSUkUoMHhiMzYwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx0ZGJyIiwgIDQsIHtSUkUoMHhiMzEyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx0ZWJyIiwgIDQsIHtSUkUoMHhiMzAyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx0eGJyIiwgIDQsIHtSUkUoMHhiMzQyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx0eHIiLCAgIDQsIHtSUkUoMHhiMzYyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx1cmEiLCAgIDQsIHtSUkUoMHhiMjRiLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx4ZHIiLCAgIDQsIHtSUkUoMHhiMzI1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx4ZXIiLCAgIDQsIHtSUkUoMHhiMzI2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx4ciIsICAgIDQsIHtSUkUoMHhiMzY1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElGWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx6ZHIiLCAgIDQsIHtSUkUoMHhiMzc1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElGWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx6ZXIiLCAgIDQsIHtSUkUoMHhiMzc0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElGWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgImx6eHIiLCAgIDQsIHtSUkUoMHhiMzc2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElGWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1kYnIiLCAgIDQsIHtSUkUoMHhiMzFjLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1kZWJyIiwgIDQsIHtSUkUoMHhiMzBjLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1lZWJyIiwgIDQsIHtSUkUoMHhiMzE3LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1lZXIiLCAgIDQsIHtSUkUoMHhiMzM3LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1zciIsICAgIDQsIHtSUkUoMHhiMjUyLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElJUiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgIm1zdGEiLCAgIDQsIHtSUkUoMHhiMjQ3LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjF9IH0sCi17ICJtdnBnIiwgICA0LCB7UlJFKDB4YjI1NCwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJtdnN0IiwgICA0LCB7UlJFKDB4YjI1NSwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJU1IsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJteGJyIiwgICA0LCB7UlJFKDB4YjM0YywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJQkYsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJteGRiciIsICA0LCB7UlJFKDB4YjMwNywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJQkYsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJwYWxiIiwgICA0LCB7UlJFKDB4YjI0OCwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7MH0gfSwKLXsgInByYmUiLCAgIDQsIHtSUkUoMHhiMjJhLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIEkzNzAsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInB0IiwgICAgIDQsIHtSUkUoMHhiMjI4LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInJyYmUiLCAgIDQsIHtSUkUoMHhiMjJhLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNhciIsICAgIDQsIHtSUkUoMHhiMjRlLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNkYnIiLCAgIDQsIHtSUkUoMHhiMzFiLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNlYnIiLCAgIDQsIHtSUkUoMHhiMzBiLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNlcnZjIiwgIDQsIHtSUkUoMHhiMjIwLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElFU0EsIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNmcGMiLCAgIDQsIHtSUkUoMHhiMzg0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxZGJyIiwgIDQsIHtSUkUoMHhiMzE1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxZHIiLCAgIDQsIHtSUkUoMHhiMjQ0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElRUiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxZWJyIiwgIDQsIHtSUkUoMHhiMzE0LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxZXIiLCAgIDQsIHtSUkUoMHhiMjQ1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElRUiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxeGJyIiwgIDQsIHtSUkUoMHhiMzE2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElCRiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNxeHIiLCAgIDQsIHtSUkUoMHhiMzM2LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElIWCwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNyc3QiLCAgIDQsIHtSUkUoMHhiMjVlLDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElTUiwgIHtSUkVfUjEsIFJSRV9SMn0gfSwKLXsgInNzYXIiLCAgIDQsIHtSUkUoMHhiMjI1LDAsMCksICAgMH0sIHtSUkVfTUFTSywgMH0sIElYQSwgIHtSUkVfUjF9IH0sCi17ICJzc2tlIiwgICA0LCB7UlJFKDB4YjIyYiwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJWEEsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJzdHVyYSIsICA0LCB7UlJFKDB4YjI0NiwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJzeGJyIiwgICA0LCB7UlJFKDB4YjM0YiwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJQkYsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJ0YXIiLCAgICA0LCB7UlJFKDB4YjI0YywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRVNBLCB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJ0YiIsICAgICA0LCB7UlJFKDB4YjIyYywwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJWEEsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJ0aGRyIiwgICA0LCB7UlJFKDB4YjM1OSwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRlgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi17ICJ0aGRlciIsICA0LCB7UlJFKDB4YjM1OSwwLDApLCAgIDB9LCB7UlJFX01BU0ssIDB9LCBJRlgsICB7UlJFX1IxLCBSUkVfUjJ9IH0sCi0KLS8qIFJSRiBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAiY2ZkYnIiLCAgNCwge1JSRigweGIzOTksMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUJGLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJjZmRyIiwgICA0LCB7UlJGKDB4YjNiOSwwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJSFgsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgImNmZWJyIiwgIDQsIHtSUkYoMHhiMzk4LDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElCRiwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAiY2ZlciIsICAgNCwge1JSRigweGIzYjgsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUhYLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJjZnhiciIsICA0LCB7UlJGKDB4YjM5YSwwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJQkYsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgImNmeHIiLCAgIDQsIHtSUkYoMHhiM2JhLDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElIWCwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAiZGlkYnIiLCAgNCwge1JSRigweGIzNWIsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUJGLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJkaWViciIsICA0LCB7UlJGKDB4YjM1MywwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJQkYsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgImZpZGJyIiwgIDQsIHtSUkYoMHhiMzVmLDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElCRiwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAiZmllYnIiLCAgNCwge1JSRigweGIzNTcsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUJGLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJmaXhiciIsICA0LCB7UlJGKDB4YjM0NywwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJQkYsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgIm1hZGJyIiwgIDQsIHtSUkYoMHhiMzFlLDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElCRiwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAibWFlYnIiLCAgNCwge1JSRigweGIzMGUsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUJGLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJtc2RiciIsICA0LCB7UlJGKDB4YjMxZiwwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJQkYsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLXsgIm1zZWJyIiwgIDQsIHtSUkYoMHhiMzBmLDAsMCwwKSwgMH0sIHtSUkZfTUFTSywgMH0sIElCRiwgIHtSUkZfUjEsIFJSRl9SMywgUlJGX1IyfSB9LAoteyAidGJkciIsICAgNCwge1JSRigweGIzNTEsMCwwLDApLCAwfSwge1JSRl9NQVNLLCAwfSwgSUZYLCAge1JSRl9SMSwgUlJGX1IzLCBSUkZfUjJ9IH0sCi17ICJ0YmVkciIsICA0LCB7UlJGKDB4YjM1MCwwLDAsMCksIDB9LCB7UlJGX01BU0ssIDB9LCBJRlgsICB7UlJGX1IxLCBSUkZfUjMsIFJSRl9SMn0gfSwKLQotLyogUlggZm9ybSBpbnN0cnVjdGlvbnMgKi8KLXsgImEiLCAgICAgIDQsIHtSWCgweDVhLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImFkIiwgICAgIDQsIHtSWCgweDZhLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImFlIiwgICAgIDQsIHtSWCgweDdhLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImFoIiwgICAgIDQsIHtSWCgweDRhLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImFsIiwgICAgIDQsIHtSWCgweDVlLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImF1IiwgICAgIDQsIHtSWCgweDdlLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImF3IiwgICAgIDQsIHtSWCgweDZlLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImJhbCIsICAgIDQsIHtSWCgweDQ1LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImJhcyIsICAgIDQsIHtSWCgweDRkLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIElYQSwgIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImJjIiwgICAgIDQsIHtSWCgweDQ3LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImJjdCIsICAgIDQsIHtSWCgweDQ2LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImMiLCAgICAgIDQsIHtSWCgweDU5LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImNkIiwgICAgIDQsIHtSWCgweDY5LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImNlIiwgICAgIDQsIHtSWCgweDc5LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImNoIiwgICAgIDQsIHtSWCgweDQ5LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImNsIiwgICAgIDQsIHtSWCgweDU1LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImN2YiIsICAgIDQsIHtSWCgweDRmLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImN2ZCIsICAgIDQsIHtSWCgweDRlLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImQiLCAgICAgIDQsIHtSWCgweDVkLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImRkIiwgICAgIDQsIHtSWCgweDZkLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImRlIiwgICAgIDQsIHtSWCgweDdkLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImV4IiwgICAgIDQsIHtSWCgweDQ0LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImljIiwgICAgIDQsIHtSWCgweDQzLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImwiLCAgICAgIDQsIHtSWCgweDU4LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxhIiwgICAgIDQsIHtSWCgweDQxLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxhZSIsICAgIDQsIHtSWCgweDUxLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIElFU0EsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxkIiwgICAgIDQsIHtSWCgweDY4LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxlIiwgICAgIDQsIHtSWCgweDc4LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxoIiwgICAgIDQsIHtSWCgweDQ4LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgImxyYSIsICAgIDQsIHtSWCgweGIxLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIElYQSwgIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm0iLCAgICAgIDQsIHtSWCgweDVjLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1kIiwgICAgIDQsIHtSWCgweDZjLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1lIiwgICAgIDQsIHtSWCgweDdjLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1oIiwgICAgIDQsIHtSWCgweDRjLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1zIiwgICAgIDQsIHtSWCgweDcxLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIElJUiwgIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm14ZCIsICAgIDQsIHtSWCgweDY3LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm4iLCAgICAgIDQsIHtSWCgweDU0LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm8iLCAgICAgIDQsIHtSWCgweDU2LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInMiLCAgICAgIDQsIHtSWCgweDViLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInNkIiwgICAgIDQsIHtSWCgweDZiLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInNlIiwgICAgIDQsIHtSWCgweDdiLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInNoIiwgICAgIDQsIHtSWCgweDRiLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInNsIiwgICAgIDQsIHtSWCgweDVmLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0IiwgICAgIDQsIHtSWCgweDUwLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0YyIsICAgIDQsIHtSWCgweDQyLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0ZCIsICAgIDQsIHtSWCgweDYwLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0ZSIsICAgIDQsIHtSWCgweDcwLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN0aCIsICAgIDQsIHtSWCgweDQwLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN1IiwgICAgIDQsIHtSWCgweDdmLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgInN3IiwgICAgIDQsIHtSWCgweDZmLDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIngiLCAgICAgIDQsIHtSWCgweDU3LDAsMCwwLDApLCAgMH0sIHtSWF9NQVNLLCAgMH0sIEkzNzAsIHtSWF9SMSwgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLQotLyogUlhFIGZvcm0gaW5zdHJ1Y3Rpb25zICovCi17ICJhZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MWEpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJhZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MGEpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJjZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTkpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJjZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDkpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJkZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MWQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJkZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MGQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJrZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTgpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJrZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDgpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJsZGUiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MjQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJsZGViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJseGQiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MjUpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJseGRiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDUpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJseGUiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MjYpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJseGViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDYpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MWMpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtZGViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MGMpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtZWUiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MzcpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUhYLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtZWViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTcpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJteGRiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MDcpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzcWQiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MzUpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUhYLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzcWRiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTUpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzcWUiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MzQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUhYLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzcWViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTQpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzZGIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MWIpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJzZWIiLCAgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MGIpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJ0Y2RiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTEpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJ0Y2ViIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTApfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJ0Y3hiIiwgICA2LCB7UlhFSCgweGVkLDAsMCwwLDApLCBSWEVMKDB4MTIpfSwge1JYRUhfTUFTSywgUlhFTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi0KLS8qIFJYRiBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAibWFkYiIsICAgNiwge1JYRkgoMHhlZCwwLDAsMCwwKSwgUlhGTCgweDFlLDApfSwge1JYRkhfTUFTSywgUlhGTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYRl9SMywgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLXsgIm1hZWIiLCAgIDYsIHtSWEZIKDB4ZWQsMCwwLDAsMCksIFJYRkwoMHgwZSwwKX0sIHtSWEZIX01BU0ssIFJYRkxfTUFTS30sIElCRiwge1JYX1IxLCBSWEZfUjMsIFJYX0QyLCBSWF9YMiwgUlhfQjJ9IH0sCi17ICJtc2RiIiwgICA2LCB7UlhGSCgweGVkLDAsMCwwLDApLCBSWEZMKDB4MWYsMCl9LCB7UlhGSF9NQVNLLCBSWEZMX01BU0t9LCBJQkYsIHtSWF9SMSwgUlhGX1IzLCBSWF9EMiwgUlhfWDIsIFJYX0IyfSB9LAoteyAibXNlYiIsICAgNiwge1JYRkgoMHhlZCwwLDAsMCwwKSwgUlhGTCgweDBmLDApfSwge1JYRkhfTUFTSywgUlhGTF9NQVNLfSwgSUJGLCB7UlhfUjEsIFJYRl9SMywgUlhfRDIsIFJYX1gyLCBSWF9CMn0gfSwKLQotLyogUlMgZm9ybSBpbnN0cnVjdGlvbnMgKi8KLXsgImJ4aCIsICAgIDQsIHtSUygweDg2LDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJieGxlIiwgICA0LCB7UlMoMHg4NywwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAiY2RzIiwgICAgNCwge1JTKDB4YmIsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIElYQSwgIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgImNsY2xlIiwgIDQsIHtSUygweGE5LDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJQ00sICB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJjbG0iLCAgICA0LCB7UlMoMHhiZCwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAiY3MiLCAgICAgNCwge1JTKDB4YmEsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIElYQSwgIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgImljbSIsICAgIDQsIHtSUygweGJmLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJsYW0iLCAgICA0LCB7UlMoMHg5YSwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSUVTQSwge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAibGN0bCIsICAgNCwge1JTKDB4YjcsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIEkzNzAsIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgImxtIiwgICAgIDQsIHtSUygweDk4LDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJtdmNsZSIsICA0LCB7UlMoMHhhOCwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSUNNLCAge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAic2lncCIsICAgNCwge1JTKDB4YWUsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIElYQSwgIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgInN0YW0iLCAgIDQsIHtSUygweDliLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJRVNBLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJzdGNtIiwgICA0LCB7UlMoMHhiZSwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAoteyAic3RjdGwiLCAgNCwge1JTKDB4YjYsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIEkzNzAsIHtSWF9SMSwgUlNfUjMsIFJTX0QyLCBSU19CMn0gfSwKLXsgInN0bSIsICAgIDQsIHtSUygweDkwLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX1IzLCBSU19EMiwgUlNfQjJ9IH0sCi17ICJ0cmFjZSIsICA0LCB7UlMoMHg5OSwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSVhBLCAge1JYX1IxLCBSU19SMywgUlNfRDIsIFJTX0IyfSB9LAotCi0vKiBSUyBmb3JtIGluc3RydWN0aW9ucyB3aXRoIGJsYW5rIFIzIGFuZCBvcHRpb25hbCBCMiAoc2hpZnQgbGVmdC9yaWdodCkgKi8KLXsgInNsYSIsICAgIDQsIHtSUygweDhiLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX0QyLCBSU19CMl9PUFR9IH0sCi17ICJzbGRhIiwgICA0LCB7UlMoMHg4ZiwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19EMiwgUlNfQjJfT1BUfSB9LAoteyAic2xkbCIsICAgNCwge1JTKDB4OGQsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIEkzNzAsIHtSWF9SMSwgUlNfRDIsIFJTX0IyX09QVH0gfSwKLXsgInNsbCIsICAgIDQsIHtSUygweDg5LDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX0QyLCBSU19CMl9PUFR9IH0sCi17ICJzcmEiLCAgICA0LCB7UlMoMHg4YSwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19EMiwgUlNfQjJfT1BUfSB9LAoteyAic3JkYSIsICAgNCwge1JTKDB4OGUsMCwwLDAsMCksIDB9LCB7UlNfTUFTSywgMH0sIEkzNzAsIHtSWF9SMSwgUlNfRDIsIFJTX0IyX09QVH0gfSwKLXsgInNyZGwiLCAgIDQsIHtSUygweDhjLDAsMCwwLDApLCAwfSwge1JTX01BU0ssIDB9LCBJMzcwLCB7UlhfUjEsIFJTX0QyLCBSU19CMl9PUFR9IH0sCi17ICJzcmwiLCAgICA0LCB7UlMoMHg4OCwwLDAsMCwwKSwgMH0sIHtSU19NQVNLLCAwfSwgSTM3MCwge1JYX1IxLCBSU19EMiwgUlNfQjJfT1BUfSB9LAotCi0vKiBSU0kgZm9ybSBpbnN0cnVjdGlvbnMgKi8KLXsgImJyeGgiLCAgIDQsIHtSU0koMHg4NCwwLDAsMCksICAwfSwge1JTSV9NQVNLLCAwfSwgSUlSLCAge1JTSV9SMSwgUlNJX1IzLCBSU0lfSTJ9IH0sCi17ICJicnhsZSIsICA0LCB7UlNJKDB4ODUsMCwwLDApLCAgMH0sIHtSU0lfTUFTSywgMH0sIElJUiwgIHtSU0lfUjEsIFJTSV9SMywgUlNJX0kyfSB9LAotCi0vKiBSSSBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAiYWhpIiwgICAgNCwge1JJKDB4YTdhLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAiYnJhcyIsICAgNCwge1JJKDB4YTc1LDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAiYnJjIiwgICAgNCwge1JJKDB4YTc0LDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAiYnJjdCIsICAgNCwge1JJKDB4YTc2LDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAiY2hpIiwgICAgNCwge1JJKDB4YTdlLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAibGhpIiwgICAgNCwge1JJKDB4YTc4LDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAibWhpIiwgICAgNCwge1JJKDB4YTdjLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAidG1oIiwgICAgNCwge1JJKDB4YTcwLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAoteyAidG1sIiwgICAgNCwge1JJKDB4YTcxLDAsMCksICAgIDB9LCB7UklfTUFTSywgIDB9LCBJSVIsICB7UklfUjEsIFJJX0kyfSB9LAotCi0vKiBTSSBmb3JtIGluc3RydWN0aW9ucyAqLwoteyAiY2xpIiwgICAgNCwge1NJKDB4OTUsMCwwLDApLCAgIDB9LCB7U0lfTUFTSywgIDB9LCBJMzcwLCB7U0lfRDEsIFNJX0IxLCBTSV9JMn0gfSwKLXsgIm1jIiwgICAgIDQsIHtTSSgweGFmLDAsMCwwKSwgICAwfSwge1NJX01BU0ssICAwfSwgSTM3MCwge1NJX0QxLCBTSV9CMSwgU0lfSTJ9IH0sCi17ICJtdmkiLCAgICA0LCB7U0koMHg5MiwwLDAsMCksICAgMH0sIHtTSV9NQVNLLCAgMH0sIEkzNzAsIHtTSV9EMSwgU0lfQjEsIFNJX0kyfSB9LAoteyAibmkiLCAgICAgNCwge1NJKDB4OTQsMCwwLDApLCAgIDB9LCB7U0lfTUFTSywgIDB9LCBJMzcwLCB7U0lfRDEsIFNJX0IxLCBTSV9JMn0gfSwKLXsgIm9pIiwgICAgIDQsIHtTSSgweDk2LDAsMCwwKSwgICAwfSwge1NJX01BU0ssICAwfSwgSTM3MCwge1NJX0QxLCBTSV9CMSwgU0lfSTJ9IH0sCi17ICJzdG5zbSIsICA0LCB7U0koMHhhYywwLDAsMCksICAgMH0sIHtTSV9NQVNLLCAgMH0sIElYQSwgIHtTSV9EMSwgU0lfQjEsIFNJX0kyfSB9LAoteyAic3Rvc20iLCAgNCwge1NJKDB4YWQsMCwwLDApLCAgIDB9LCB7U0lfTUFTSywgIDB9LCBJWEEsICB7U0lfRDEsIFNJX0IxLCBTSV9JMn0gfSwKLXsgInRtIiwgICAgIDQsIHtTSSgweDkxLDAsMCwwKSwgICAwfSwge1NJX01BU0ssICAwfSwgSTM3MCwge1NJX0QxLCBTSV9CMSwgU0lfSTJ9IH0sCi17ICJ4aSIsICAgICA0LCB7U0koMHg5NywwLDAsMCksICAgMH0sIHtTSV9NQVNLLCAgMH0sIEkzNzAsIHtTSV9EMSwgU0lfQjEsIFNJX0kyfSB9LAotCi0vKiBTIGZvcm0gaW5zdHJ1Y3Rpb25zICovCi17ICJjZmMiLCAgICA0LCB7UygweGIyMWEsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAiY3NjaCIsICAgNCwge1MoMHhiMjMwLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7MH0gfSwKLXsgImhzY2giLCAgIDQsIHtTKDB4YjIzMSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAgezB9IH0sCi17ICJpcGsiLCAgICA0LCB7UygweGIyMGIsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHswfSB9LAoteyAibGZwYyIsICAgNCwge1MoMHhiMjlkLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJQkYsICB7U19EMiwgU19CMn0gfSwKLXsgImxwc3ciLCAgIDQsIHtTKDB4ODIwMCwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSTM3MCwge1NfRDIsIFNfQjJ9IH0sCi17ICJtc2NoIiwgICA0LCB7UygweGIyMzIsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAicGMiLCAgICAgNCwge1MoMHhiMjE4LDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInBjZiIsICAgIDQsIHtTKDB4YjIxOCwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVBDLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJwdGxiIiwgICA0LCB7UygweGIyMGQsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHswfSB9LAoteyAicmNocCIsICAgNCwge1MoMHhiMjNiLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7MH0gfSwKLXsgInJwIiwgICAgIDQsIHtTKDB4YjI3NywwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVJQLCAgezB9IH0sCi17ICJyc2NoIiwgICA0LCB7UygweGIyMzgsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHswfSB9LAoteyAic2FjIiwgICAgNCwge1MoMHhiMjE5LDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInNhY2YiLCAgIDQsIHtTKDB4YjI3OSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVNBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzYWwiLCAgICA0LCB7UygweGIyMzcsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHswfSB9LAoteyAic2NobSIsICAgNCwge1MoMHhiMjNjLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7MH0gfSwKLXsgInNjayIsICAgIDQsIHtTKDB4YjIwNCwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSTM3MCwge1NfRDIsIFNfQjJ9IH0sCi17ICJzY2tjIiwgICA0LCB7UygweGIyMDYsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAic3BrYSIsICAgNCwge1MoMHhiMjBhLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInNwdCIsICAgIDQsIHtTKDB4YjIwOCwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzcHgiLCAgICA0LCB7UygweGIyMTAsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAic3JubSIsICAgNCwge1MoMHhiMjk5LDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJQkYsICB7U19EMiwgU19CMn0gfSwKLXsgInNzY2giLCAgIDQsIHtTKDB4YjIzMywwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzc20iLCAgICA0LCB7UygweDgwMDAsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIEkzNzAsIHtTX0QyLCBTX0IyfSB9LAoteyAic3RhcCIsICAgNCwge1MoMHhiMjEyLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInN0Y2siLCAgIDQsIHtTKDB4YjIwNSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzdGNrYyIsICA0LCB7UygweGIyMDcsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIEkzNzAsIHtTX0QyLCBTX0IyfSB9LAoteyAic3RjcHMiLCAgNCwge1MoMHhiMjNhLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInN0Y3J3IiwgIDQsIHtTKDB4YjIzOSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzdGZwYyIsICA0LCB7UygweGIyOWMsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElCRiwgIHtTX0QyLCBTX0IyfSB9LAoteyAic3RpZHAiLCAgNCwge1MoMHhiMjAyLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJMzcwLCB7U19EMiwgU19CMn0gfSwKLXsgInN0cHQiLCAgIDQsIHtTKDB4YjIwOSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJzdHB4IiwgICA0LCB7UygweGIyMTEsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElYQSwgIHtTX0QyLCBTX0IyfSB9LAoteyAic3RzY2giLCAgNCwge1MoMHhiMjM0LDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJWEEsICB7U19EMiwgU19CMn0gfSwKLXsgInRwaSIsICAgIDQsIHtTKDB4YjIzNiwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi17ICJ0cmFwNCIsICA0LCB7UygweGIyZmYsMCwwKSwgICAgMH0sIHtTX01BU0ssIAkgMH0sIElUUiwgIHtTX0QyLCBTX0IyfSB9LAoteyAidHMiLCAgICAgNCwge1MoMHg5MzAwLDAsMCksICAgIDB9LCB7U19NQVNLLCAJIDB9LCBJMzcwLCB7U19EMiwgU19CMn0gfSwKLXsgInRzY2giLCAgIDQsIHtTKDB4YjIzNSwwLDApLCAgICAwfSwge1NfTUFTSywgCSAwfSwgSVhBLCAge1NfRDIsIFNfQjJ9IH0sCi0KLS8qIFNTIGZvcm0gaW5zdHJ1Y3Rpb25zICovCi17ICJhcCIsICAgICA2LCB7U1NIKDB4ZmEsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAiY2xjIiwgICAgNiwge1NTSCgweGQ1LDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgImNwIiwgICAgIDYsIHtTU0goMHhmOSwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJkcCIsICAgICA2LCB7U1NIKDB4ZmQsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAiZWQiLCAgICAgNiwge1NTSCgweGRlLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgImVkbWsiLCAgIDYsIHtTU0goMHhkZiwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJtdmMiLCAgICA2LCB7U1NIKDB4ZDIsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAibXZjaW4iLCAgNiwge1NTSCgweGU4LDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJTUksICB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgIm12Y2siLCAgIDYsIHtTU0goMHhkOSwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSVhBLCAge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJtdmNwIiwgICA2LCB7U1NIKDB4ZGEsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIElYQSwgIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAibXZjcyIsICAgNiwge1NTSCgweGRiLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJWEEsICB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgIm12biIsICAgIDYsIHtTU0goMHhkMSwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJtdm8iLCAgICA2LCB7U1NIKDB4ZjEsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAibXZ6IiwgICAgNiwge1NTSCgweGQzLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgIm5jIiwgICAgIDYsIHtTU0goMHhkNCwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJvYyIsICAgICA2LCB7U1NIKDB4ZDYsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAicGFjayIsICAgNiwge1NTSCgweGYyLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgInBsbyIsICAgIDYsIHtTU0goMHhlZSwwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSVBMLCAge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJzcCIsICAgICA2LCB7U1NIKDB4ZmIsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAic3JwIiwgICAgNiwge1NTSCgweGYwLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgInRyIiwgICAgIDYsIHtTU0goMHhkYywwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJ0cnQiLCAgICA2LCB7U1NIKDB4ZGQsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAoteyAidW5wayIsICAgNiwge1NTSCgweGYzLDAsMCwwKSwgIDB9LCB7U1NfTUFTSywgIDB9LCBJMzcwLCB7U1NfRDEsU1NfTCxTU19CMSxTU19EMixTU19CMn0gfSwKLXsgInhjIiwgICAgIDYsIHtTU0goMHhkNywwLDAsMCksICAwfSwge1NTX01BU0ssICAwfSwgSTM3MCwge1NTX0QxLFNTX0wsU1NfQjEsU1NfRDIsU1NfQjJ9IH0sCi17ICJ6YXAiLCAgICA2LCB7U1NIKDB4ZjgsMCwwLDApLCAgMH0sIHtTU19NQVNLLCAgMH0sIEkzNzAsIHtTU19EMSxTU19MLFNTX0IxLFNTX0QyLFNTX0IyfSB9LAotCi0vKiBTU0UgZm9ybSBpbnN0cnVjdGlvbnMgKi8KLXsgImxhc3AiLCAgIDYsIHtTU0VIKDB4ZTUwMCwwLDApLCAwfSwge1NTRV9NQVNLLCAwfSwgSVhBLCAge1NTX0QxLCBTU19CMSwgU1NfRDIsIFNTX0IyfSB9LAoteyAibXZjZGsiLCAgNiwge1NTRUgoMHhlNTBmLDAsMCksIDB9LCB7U1NFX01BU0ssIDB9LCBJRVNBLCB7U1NfRDEsIFNTX0IxLCBTU19EMiwgU1NfQjJ9IH0sCi17ICJtdmNzayIsICA2LCB7U1NFSCgweGU1MGUsMCwwKSwgMH0sIHtTU0VfTUFTSywgMH0sIElFU0EsIHtTU19EMSwgU1NfQjEsIFNTX0QyLCBTU19CMn0gfSwKLXsgInRwcm90IiwgIDYsIHtTU0VIKDB4ZTUwMSwwLDApLCAwfSwge1NTRV9NQVNLLCAwfSwgSVhBLCAge1NTX0QxLCBTU19CMSwgU1NfRDIsIFNTX0IyfSB9LAotCi0vKiAqLwotfTsKLQotY29uc3QgaW50IGkzNzBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKGkzNzBfb3Bjb2RlcykgLyBzaXplb2YgKGkzNzBfb3Bjb2Rlc1swXSk7Ci0MCi0vKiBUaGUgbWFjcm8gdGFibGUuICBUaGlzIGlzIG9ubHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotY29uc3Qgc3RydWN0IGkzNzBfbWFjcm8gaTM3MF9tYWNyb3NbXSA9IHsKLXsgImIiLCAgICAgMSwgICBJMzcwLAkiYmMgIDE1LCUwIiB9LAoteyAiYnIiLCAgICAxLCAgIEkzNzAsCSJiY3IgMTUsJTAiIH0sCi0KLXsgIm5vcCIsICAgMSwgICBJMzcwLAkiYmMgIDAsJTAiIH0sCi17ICJub3ByIiwgIDEsICAgSTM3MCwJImJjciAwLCUwIiB9LAotCi17ICJiaCIsICAgIDEsICAgSTM3MCwJImJjICAyLCUwIiB9LAoteyAiYmhyIiwgICAxLCAgIEkzNzAsCSJiY3IgMiwlMCIgfSwKLXsgImJsIiwgICAgMSwgICBJMzcwLAkiYmMgIDQsJTAiIH0sCi17ICJibHIiLCAgIDEsICAgSTM3MCwJImJjciA0LCUwIiB9LAoteyAiYmUiLCAgICAxLCAgIEkzNzAsCSJiYyAgOCwlMCIgfSwKLXsgImJlciIsICAgMSwgICBJMzcwLAkiYmNyIDgsJTAiIH0sCi0KLXsgImJuaCIsICAgIDEsICAgSTM3MCwJImJjICAxMywlMCIgfSwKLXsgImJuaHIiLCAgIDEsICAgSTM3MCwJImJjciAxMywlMCIgfSwKLXsgImJubCIsICAgIDEsICAgSTM3MCwJImJjICAxMSwlMCIgfSwKLXsgImJubHIiLCAgIDEsICAgSTM3MCwJImJjciAxMSwlMCIgfSwKLXsgImJuZSIsICAgIDEsICAgSTM3MCwJImJjICA3LCUwIiB9LAoteyAiYm5lciIsICAgMSwgICBJMzcwLAkiYmNyIDcsJTAiIH0sCi0KLXsgImJwIiwgICAgMSwgICBJMzcwLAkiYmMgIDIsJTAiIH0sCi17ICJicHIiLCAgIDEsICAgSTM3MCwJImJjciAyLCUwIiB9LAoteyAiYm0iLCAgICAxLCAgIEkzNzAsCSJiYyAgNCwlMCIgfSwKLXsgImJtciIsICAgMSwgICBJMzcwLAkiYmNyIDQsJTAiIH0sCi17ICJieiIsICAgIDEsICAgSTM3MCwJImJjICA4LCUwIiB9LAoteyAiYnpyIiwgICAxLCAgIEkzNzAsCSJiY3IgOCwlMCIgfSwKLXsgImJvIiwgICAgMSwgICBJMzcwLAkiYmMgIDEsJTAiIH0sCi17ICJib3IiLCAgIDEsICAgSTM3MCwJImJjciAxLCUwIiB9LAotCi17ICJibnAiLCAgICAxLCAgIEkzNzAsCSJiYyAgMTMsJTAiIH0sCi17ICJibnByIiwgICAxLCAgIEkzNzAsCSJiY3IgMTMsJTAiIH0sCi17ICJibm0iLCAgICAxLCAgIEkzNzAsCSJiYyAgMTEsJTAiIH0sCi17ICJibm1yIiwgICAxLCAgIEkzNzAsCSJiY3IgMTEsJTAiIH0sCi17ICJibnoiLCAgICAxLCAgIEkzNzAsCSJiYyAgNywlMCIgfSwKLXsgImJuenIiLCAgIDEsICAgSTM3MCwJImJjciA3LCUwIiB9LAoteyAiYm5vIiwgICAgMSwgICBJMzcwLAkiYmMgIDE0LCUwIiB9LAoteyAiYm5vciIsICAgMSwgICBJMzcwLAkiYmNyIDE0LCUwIiB9LAotCi17ICJzeW5jIiwgICAwLCAgIEkzNzAsCSJiY3IgMTUsMCIgfSwKLQotfTsKLQotY29uc3QgaW50IGkzNzBfbnVtX21hY3JvcyA9Ci0gIHNpemVvZiAoaTM3MF9tYWNyb3MpIC8gc2l6ZW9mIChpMzcwX21hY3Jvc1swXSk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL2kzODYtZGlzLmMgYi9vcGNvZGVzL2kzODYtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NWQ2ZTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pMzg2LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc1OSArMCwwIEBACi0vKiBQcmludCBpMzg2IGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg4LCA4OSwgOTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiA4MDM4NiBpbnN0cnVjdGlvbiBwcmludGVyIGJ5IFBhY2UgV2lsbGlzc29uIChwYWNlQHByZXAuYWkubWl0LmVkdSkKLSAqIEp1bHkgMTk4OAotICogIG1vZGlmaWVkIGJ5IEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkKLSAqLwotCi0vKgotICogVGhlIG1haW4gdGFibGVzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9ucyBpcyBlc3NlbnRpYWxseSBhIGNvcHkKLSAqIG9mIHRoZSAiT3Bjb2RlIE1hcCIgY2hhcHRlciAoQXBwZW5kaXggQSkgb2YgdGhlIEludGVsIDgwMzg2Ci0gKiBQcm9ncmFtbWVycyBNYW51YWwuICBVc3VhbGx5LCB0aGVyZSBpcyBhIGNhcGl0YWwgbGV0dGVyLCBmb2xsb3dlZAotICogYnkgYSBzbWFsbCBsZXR0ZXIuICBUaGUgY2FwaXRhbCBsZXR0ZXIgdGVsbCB0aGUgYWRkcmVzc2luZyBtb2RlLAotICogYW5kIHRoZSBzbWFsbCBsZXR0ZXIgdGVsbHMgYWJvdXQgdGhlIG9wZXJhbmQgc2l6ZS4gIFJlZmVyIHRvCi0gKiB0aGUgSW50ZWwgbWFudWFsIGZvciBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNkZWZpbmUgTUFYTEVOIDIwCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2lmbmRlZiBVTklYV0FSRV9DT01QQVQKLS8qIFNldCBub24temVybyBmb3IgYnJva2VuLCBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gIFNldCB0byB6ZXJvIGZvcgotICAgbm9uLWJyb2tlbiBvcGNvZGVzLiAgKi8KLSNkZWZpbmUgVU5JWFdBUkVfQ09NUEFUIDEKLSNlbmRpZgotCi1zdGF0aWMgaW50IGZldGNoX2RhdGEgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX2J5dGUgKikpOwotCi1zdHJ1Y3QgZGlzX3ByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBUaGUgb3Bjb2RlIGZvciB0aGUgZndhaXQgaW5zdHJ1Y3Rpb24sIHdoaWNoIHdlIHRyZWF0IGFzIGEgcHJlZml4Ci0gICB3aGVuIHdlIGNhbi4gICovCi0jZGVmaW5lIEZXQUlUX09QQ09ERSAoMHg5YikKLQotLyogRmxhZ3MgZm9yIHRoZSBwcmVmaXhlcyBmb3IgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICBTZWUgYmVsb3cuICAqLwotc3RhdGljIGludCBwcmVmaXhlczsKLQotLyogRmxhZ3MgZm9yIHByZWZpeGVzIHdoaWNoIHdlIHNvbWVob3cgaGFuZGxlZCB3aGVuIHByaW50aW5nIHRoZQotICAgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgaW50IHVzZWRfcHJlZml4ZXM7Ci0KLS8qIEZsYWdzIHN0b3JlZCBpbiBQUkVGSVhFUy4gICovCi0jZGVmaW5lIFBSRUZJWF9SRVBaIDEKLSNkZWZpbmUgUFJFRklYX1JFUE5aIDIKLSNkZWZpbmUgUFJFRklYX0xPQ0sgNAotI2RlZmluZSBQUkVGSVhfQ1MgOAotI2RlZmluZSBQUkVGSVhfU1MgMHgxMAotI2RlZmluZSBQUkVGSVhfRFMgMHgyMAotI2RlZmluZSBQUkVGSVhfRVMgMHg0MAotI2RlZmluZSBQUkVGSVhfRlMgMHg4MAotI2RlZmluZSBQUkVGSVhfR1MgMHgxMDAKLSNkZWZpbmUgUFJFRklYX0RBVEEgMHgyMDAKLSNkZWZpbmUgUFJFRklYX0FERFIgMHg0MDAKLSNkZWZpbmUgUFJFRklYX0ZXQUlUIDB4ODAwCi0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBkaXNfcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBkaXNfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgZGlzX3ByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgLyogSWYgd2UgZGlkIG1hbmFnZSB0byByZWFkIGF0IGxlYXN0IG9uZSBieXRlLCB0aGVuCi0gICAgICAgICBwcmludF9pbnNuX2kzODYgd2lsbCBkbyBzb21ldGhpbmcgc2Vuc2libGUuICBPdGhlcndpc2UsIHByaW50Ci0gICAgICAgICBhbiBlcnJvci4gIFdlIGRvIHRoYXQgaGVyZSBiZWNhdXNlIHRoaXMgaXMgd2hlcmUgd2Uga25vdwotICAgICAgICAgU1RBVFVTLiAgKi8KLSAgICAgIGlmIChwcml2LT5tYXhfZmV0Y2hlZCA9PSBwcml2LT50aGVfYnVmZmVyKQotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLSNkZWZpbmUgWFggTlVMTCwgMAotCi0jZGVmaW5lIEViIE9QX0UsIGJfbW9kZQotI2RlZmluZSBpbmRpckViIE9QX2luZGlyRSwgYl9tb2RlCi0jZGVmaW5lIEdiIE9QX0csIGJfbW9kZQotI2RlZmluZSBFdiBPUF9FLCB2X21vZGUKLSNkZWZpbmUgRWQgT1BfRSwgZF9tb2RlCi0jZGVmaW5lIGluZGlyRXYgT1BfaW5kaXJFLCB2X21vZGUKLSNkZWZpbmUgRXcgT1BfRSwgd19tb2RlCi0jZGVmaW5lIE1hIE9QX0UsIHZfbW9kZQotI2RlZmluZSBNIE9QX0UsIDAJCS8qIGxlYSAqLwotI2RlZmluZSBNcCBPUF9FLCAwCQkvKiAzMiBvciA0OCBiaXQgbWVtb3J5IG9wZXJhbmQgZm9yIExEUywgTEVTIGV0YyAqLwotI2RlZmluZSBHdiBPUF9HLCB2X21vZGUKLSNkZWZpbmUgR3cgT1BfRywgd19tb2RlCi0jZGVmaW5lIFJkIE9QX1JkLCBkX21vZGUKLSNkZWZpbmUgSWIgT1BfSSwgYl9tb2RlCi0jZGVmaW5lIHNJYiBPUF9zSSwgYl9tb2RlCS8qIHNpZ24gZXh0ZW5lZCBieXRlICovCi0jZGVmaW5lIEl2IE9QX0ksIHZfbW9kZQotI2RlZmluZSBJdyBPUF9JLCB3X21vZGUKLSNkZWZpbmUgSmIgT1BfSiwgYl9tb2RlCi0jZGVmaW5lIEp2IE9QX0osIHZfbW9kZQotI2RlZmluZSBDZCBPUF9DLCBkX21vZGUKLSNkZWZpbmUgRGQgT1BfRCwgZF9tb2RlCi0jZGVmaW5lIFRkIE9QX1QsIGRfbW9kZQotCi0jZGVmaW5lIGVBWCBPUF9SRUcsIGVBWF9yZWcKLSNkZWZpbmUgZUJYIE9QX1JFRywgZUJYX3JlZwotI2RlZmluZSBlQ1ggT1BfUkVHLCBlQ1hfcmVnCi0jZGVmaW5lIGVEWCBPUF9SRUcsIGVEWF9yZWcKLSNkZWZpbmUgZVNQIE9QX1JFRywgZVNQX3JlZwotI2RlZmluZSBlQlAgT1BfUkVHLCBlQlBfcmVnCi0jZGVmaW5lIGVTSSBPUF9SRUcsIGVTSV9yZWcKLSNkZWZpbmUgZURJIE9QX1JFRywgZURJX3JlZwotI2RlZmluZSBBTCBPUF9SRUcsIGFsX3JlZwotI2RlZmluZSBDTCBPUF9SRUcsIGNsX3JlZwotI2RlZmluZSBETCBPUF9SRUcsIGRsX3JlZwotI2RlZmluZSBCTCBPUF9SRUcsIGJsX3JlZwotI2RlZmluZSBBSCBPUF9SRUcsIGFoX3JlZwotI2RlZmluZSBDSCBPUF9SRUcsIGNoX3JlZwotI2RlZmluZSBESCBPUF9SRUcsIGRoX3JlZwotI2RlZmluZSBCSCBPUF9SRUcsIGJoX3JlZwotI2RlZmluZSBBWCBPUF9SRUcsIGF4X3JlZwotI2RlZmluZSBEWCBPUF9SRUcsIGR4X3JlZwotI2RlZmluZSBpbmRpckRYIE9QX1JFRywgaW5kaXJfZHhfcmVnCi0KLSNkZWZpbmUgU3cgT1BfU0VHLCB3X21vZGUKLSNkZWZpbmUgQXAgT1BfRElSLCAwCi0jZGVmaW5lIE9iIE9QX09GRiwgYl9tb2RlCi0jZGVmaW5lIE92IE9QX09GRiwgdl9tb2RlCi0jZGVmaW5lIFhiIE9QX0RTcmVnLCBlU0lfcmVnCi0jZGVmaW5lIFh2IE9QX0RTcmVnLCBlU0lfcmVnCi0jZGVmaW5lIFliIE9QX0VTcmVnLCBlRElfcmVnCi0jZGVmaW5lIFl2IE9QX0VTcmVnLCBlRElfcmVnCi0jZGVmaW5lIERTQlggT1BfRFNyZWcsIGVCWF9yZWcKLQotI2RlZmluZSBlcyBPUF9SRUcsIGVzX3JlZwotI2RlZmluZSBzcyBPUF9SRUcsIHNzX3JlZwotI2RlZmluZSBjcyBPUF9SRUcsIGNzX3JlZwotI2RlZmluZSBkcyBPUF9SRUcsIGRzX3JlZwotI2RlZmluZSBmcyBPUF9SRUcsIGZzX3JlZwotI2RlZmluZSBncyBPUF9SRUcsIGdzX3JlZwotCi0jZGVmaW5lIE1YIE9QX01NWCwgMAotI2RlZmluZSBYTSBPUF9YTU0sIDAKLSNkZWZpbmUgRU0gT1BfRU0sIHZfbW9kZQotI2RlZmluZSBFWCBPUF9FWCwgdl9tb2RlCi0jZGVmaW5lIE1TIE9QX01TLCB2X21vZGUKLSNkZWZpbmUgTm9uZSBPUF9FLCAwCi0jZGVmaW5lIE9QU1VGIE9QXzNETm93U3VmZml4LCAwCi0jZGVmaW5lIE9QU0lNRCBPUF9TSU1EX1N1ZmZpeCwgMAotCi0vKiBiaXRzIGluIHNpemVmbGFnICovCi0jaWYgMCAvKiBsZWF2ZSB1bmRlZmluZWQgdW50aWwgc29tZW9uZSBhZGRzIHRoZSBleHRyYSBmbGFnIHRvIG9iamR1bXAgKi8KLSNkZWZpbmUgU1VGRklYX0FMV0FZUyA0Ci0jZW5kaWYKLSNkZWZpbmUgQUZMQUcgMgotI2RlZmluZSBERkxBRyAxCi0KLXR5cGVkZWYgdm9pZCAoKm9wX3J0bikgUEFSQU1TICgoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpKTsKLQotc3RhdGljIHZvaWQgT1BfRSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfSSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfaW5kaXJFIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9zSSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfUkVHIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9KIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9ESVIgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX09GRiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRVNyZWcgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0RTcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TRUcgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0MgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1JkIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TVCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU1RpICBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfTU1YIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9YTU0gUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0VNIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9FWCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfTVMgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QXzNETm93U3VmZml4IFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TSU1EX1N1ZmZpeCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgU0lNRF9GaXh1cCBQQVJBTVMgKChpbnQsIGludCkpOwotCi1zdGF0aWMgdm9pZCBhcHBlbmRfc2VnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNldF9vcCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgb3ApKTsKLXN0YXRpYyB2b2lkIHB1dG9wIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnRlbXBsYXRlLCBpbnQgc2l6ZWZsYWcpKTsKLXN0YXRpYyB2b2lkIGRvZmxvYXQgUEFSQU1TICgoaW50IHNpemVmbGFnKSk7Ci1zdGF0aWMgaW50IGdldDE2IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2V0MzIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2twcmVmaXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeF9uYW1lIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwdHJfcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBCYWRPcCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgYl9tb2RlIDEKLSNkZWZpbmUgdl9tb2RlIDIKLSNkZWZpbmUgd19tb2RlIDMKLSNkZWZpbmUgZF9tb2RlIDQKLSNkZWZpbmUgeF9tb2RlIDUKLQotI2RlZmluZSBlc19yZWcgMTAwCi0jZGVmaW5lIGNzX3JlZyAxMDEKLSNkZWZpbmUgc3NfcmVnIDEwMgotI2RlZmluZSBkc19yZWcgMTAzCi0jZGVmaW5lIGZzX3JlZyAxMDQKLSNkZWZpbmUgZ3NfcmVnIDEwNQotCi0jZGVmaW5lIGVBWF9yZWcgMTA4Ci0jZGVmaW5lIGVDWF9yZWcgMTA5Ci0jZGVmaW5lIGVEWF9yZWcgMTEwCi0jZGVmaW5lIGVCWF9yZWcgMTExCi0jZGVmaW5lIGVTUF9yZWcgMTEyCi0jZGVmaW5lIGVCUF9yZWcgMTEzCi0jZGVmaW5lIGVTSV9yZWcgMTE0Ci0jZGVmaW5lIGVESV9yZWcgMTE1Ci0KLSNkZWZpbmUgYWxfcmVnIDExNgotI2RlZmluZSBjbF9yZWcgMTE3Ci0jZGVmaW5lIGRsX3JlZyAxMTgKLSNkZWZpbmUgYmxfcmVnIDExOQotI2RlZmluZSBhaF9yZWcgMTIwCi0jZGVmaW5lIGNoX3JlZyAxMjEKLSNkZWZpbmUgZGhfcmVnIDEyMgotI2RlZmluZSBiaF9yZWcgMTIzCi0KLSNkZWZpbmUgYXhfcmVnIDEyNAotI2RlZmluZSBjeF9yZWcgMTI1Ci0jZGVmaW5lIGR4X3JlZyAxMjYKLSNkZWZpbmUgYnhfcmVnIDEyNwotI2RlZmluZSBzcF9yZWcgMTI4Ci0jZGVmaW5lIGJwX3JlZyAxMjkKLSNkZWZpbmUgc2lfcmVnIDEzMAotI2RlZmluZSBkaV9yZWcgMTMxCi0KLSNkZWZpbmUgaW5kaXJfZHhfcmVnIDE1MAotCi0jZGVmaW5lIFVTRV9HUk9VUFMgMQotI2RlZmluZSBVU0VfUFJFRklYX1VTRVJfVEFCTEUgMgotCi0jZGVmaW5lIEdSUDFiIE5VTEwsIE5VTEwsIDAsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMVMgTlVMTCwgTlVMTCwgMSwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAxU3MgTlVMTCwgTlVMTCwgMiwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAyYiBOVUxMLCBOVUxMLCAzLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDJTIE5VTEwsIE5VTEwsIDQsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMmJfb25lIE5VTEwsIE5VTEwsIDUsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMlNfb25lIE5VTEwsIE5VTEwsIDYsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMmJfY2wgTlVMTCwgTlVMTCwgNywgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAyU19jbCBOVUxMLCBOVUxMLCA4LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDNiIE5VTEwsIE5VTEwsIDksIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQM1MgTlVMTCwgTlVMTCwgMTAsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNCAgTlVMTCwgTlVMTCwgMTEsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNSAgTlVMTCwgTlVMTCwgMTIsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNiAgTlVMTCwgTlVMTCwgMTMsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNyBOVUxMLCBOVUxMLCAxNCwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlA4IE5VTEwsIE5VTEwsIDE1LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDkgTlVMTCwgTlVMTCwgMTYsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTAgTlVMTCwgTlVMTCwgMTcsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTEgTlVMTCwgTlVMTCwgMTgsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTIgTlVMTCwgTlVMTCwgMTksIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTMgTlVMTCwgTlVMTCwgMjAsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTQgTlVMTCwgTlVMTCwgMjEsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQQU1EIE5VTEwsIE5VTEwsIDIyLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0KLSNkZWZpbmUgUFJFR1JQMCBOVUxMLCBOVUxMLCAwLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMSBOVUxMLCBOVUxMLCAxLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMiBOVUxMLCBOVUxMLCAyLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMyBOVUxMLCBOVUxMLCAzLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNCBOVUxMLCBOVUxMLCA0LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNSBOVUxMLCBOVUxMLCA1LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNiBOVUxMLCBOVUxMLCA2LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNyBOVUxMLCBOVUxMLCA3LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQOCBOVUxMLCBOVUxMLCA4LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQOSBOVUxMLCBOVUxMLCA5LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMTAgTlVMTCwgTlVMTCwgMTAsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSwgTlVMTCwgMAotI2RlZmluZSBQUkVHUlAxMSBOVUxMLCBOVUxMLCAxMSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDEyIE5VTEwsIE5VTEwsIDEyLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMTMgTlVMTCwgTlVMTCwgMTMsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSwgTlVMTCwgMAotI2RlZmluZSBQUkVHUlAxNCBOVUxMLCBOVUxMLCAxNCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0KLSNkZWZpbmUgRkxPQVRDT0RFIDUwCi0jZGVmaW5lIEZMT0FUIE5VTEwsIE5VTEwsIEZMT0FUQ09ERSwgTlVMTCwgMCwgTlVMTCwgMAotCi1zdHJ1Y3QgZGlzMzg2IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgb3BfcnRuIG9wMTsKLSAgaW50IGJ5dGVtb2RlMTsKLSAgb3BfcnRuIG9wMjsKLSAgaW50IGJ5dGVtb2RlMjsKLSAgb3BfcnRuIG9wMzsKLSAgaW50IGJ5dGVtb2RlMzsKLX07Ci0KLS8qIFVwcGVyIGNhc2UgbGV0dGVycyBpbiB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaGVyZSBhcmUgbWFjcm9zLgotICAgJ0EnID0+IHByaW50ICdiJyBpZiBubyByZWdpc3RlciBvcGVyYW5kcyBvciBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdCJyA9PiBwcmludCAnYicgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnRScgPT4gcHJpbnQgJ2UnIGlmIDMyLWJpdCBmb3JtIG9mIGpjeHoKLSAgICdMJyA9PiBwcmludCAnbCcgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnTicgPT4gcHJpbnQgJ24nIGlmIGluc3RydWN0aW9uIGhhcyBubyB3YWl0ICJwcmVmaXgiCi0gICAnUCcgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBpbnN0cnVjdGlvbiBoYXMgYW4gb3BlcmFuZCBzaXplIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ1EnID0+IHByaW50ICd3JyBvciAnbCcgaWYgbm8gcmVnaXN0ZXIgb3BlcmFuZHMgb3Igc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnUicgPT4gcHJpbnQgJ3cnIG9yICdsJyAoIndkIiBvciAiZHEiIGluIGludGVsIG1vZGUpCi0gICAnUycgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdXJyA9PiBwcmludCAnYicgb3IgJ3cnICgidyIgb3IgImRlIiBpbiBpbnRlbCBtb2RlKQotKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X2F0dFtdID0gewotICAvKiAwMCAqLwotICB7ICJhZGRCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGRTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJhZGRCIiwJR2IsIEViLCBYWCB9LAotICB7ICJhZGRTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGRCIiwJQUwsIEliLCBYWCB9LAotICB7ICJhZGRTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAicHVzaFAiLAllcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLAllcywgWFgsIFhYIH0sCi0gIC8qIDA4ICovCi0gIHsgIm9yQiIsCUViLCBHYiwgWFggfSwKLSAgeyAib3JTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJvckIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgIm9yUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAib3JCIiwJQUwsIEliLCBYWCB9LAotICB7ICJvclMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoUCIsCWNzLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCS8qIDB4MGYgZXh0ZW5kZWQgb3Bjb2RlIGVzY2FwZSAqLwotICAvKiAxMCAqLwotICB7ICJhZGNCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGNTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJhZGNCIiwJR2IsIEViLCBYWCB9LAotICB7ICJhZGNTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGNCIiwJQUwsIEliLCBYWCB9LAotICB7ICJhZGNTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAicHVzaFAiLAlzcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLAlzcywgWFgsIFhYIH0sCi0gIC8qIDE4ICovCi0gIHsgInNiYkIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInNiYlMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInNiYkIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInNiYlMiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInNiYkIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInNiYlMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoUCIsCWRzLCBYWCwgWFggfSwKLSAgeyAicG9wUCIsCWRzLCBYWCwgWFggfSwKLSAgLyogMjAgKi8KLSAgeyAiYW5kQiIsCUViLCBHYiwgWFggfSwKLSAgeyAiYW5kUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAiYW5kQiIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYW5kUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAiYW5kQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAiYW5kUyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBFUyBwcmVmaXggKi8KLSAgeyAiZGFhIiwJWFgsIFhYLCBYWCB9LAotICAvKiAyOCAqLwotICB7ICJzdWJCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJzdWJTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJzdWJCIiwJR2IsIEViLCBYWCB9LAotICB7ICJzdWJTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJzdWJCIiwJQUwsIEliLCBYWCB9LAotICB7ICJzdWJTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogU0VHIENTIHByZWZpeCAqLwotICB7ICJkYXMiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgInhvckIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInhvclMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInhvckIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInhvclMiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInhvckIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInhvclMiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgU1MgcHJlZml4ICovCi0gIHsgImFhYSIsCVhYLCBYWCwgWFggfSwKLSAgLyogMzggKi8KLSAgeyAiY21wQiIsCUViLCBHYiwgWFggfSwKLSAgeyAiY21wUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAiY21wQiIsCUdiLCBFYiwgWFggfSwKLSAgeyAiY21wUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAiY21wQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAiY21wUyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBEUyBwcmVmaXggKi8KLSAgeyAiYWFzIiwJWFgsIFhYLCBYWCB9LAotICAvKiA0MCAqLwotICB7ICJpbmNTIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgImluY1MiLAllRFgsIFhYLCBYWCB9LAotICB7ICJpbmNTIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgImluY1MiLAllQlAsIFhYLCBYWCB9LAotICB7ICJpbmNTIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDQ4ICovCi0gIHsgImRlY1MiLAllQVgsIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZUNYLCBYWCwgWFggfSwKLSAgeyAiZGVjUyIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgImRlY1MiLAllQlgsIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZVNQLCBYWCwgWFggfSwKLSAgeyAiZGVjUyIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgImRlY1MiLAllU0ksIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZURJLCBYWCwgWFggfSwKLSAgLyogNTAgKi8KLSAgeyAicHVzaFMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInB1c2hTIiwJZURYLCBYWCwgWFggfSwKLSAgeyAicHVzaFMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInB1c2hTIiwJZUJQLCBYWCwgWFggfSwKLSAgeyAicHVzaFMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDU4ICovCi0gIHsgInBvcFMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZUNYLCBYWCwgWFggfSwKLSAgeyAicG9wUyIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgInBvcFMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZVNQLCBYWCwgWFggfSwKLSAgeyAicG9wUyIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgInBvcFMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZURJLCBYWCwgWFggfSwKLSAgLyogNjAgKi8KLSAgeyAicHVzaGFQIiwJWFgsIFhYLCBYWCB9LAotICB7ICJwb3BhUCIsCVhYLCBYWCwgWFggfSwKLSAgeyAiYm91bmRTIiwJR3YsIE1hLCBYWCB9LAotICB7ICJhcnBsIiwJRXcsIEd3LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBzZWcgZnMgKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogc2VnIGdzICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIG9wIHNpemUgcHJlZml4ICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIGFkciBzaXplIHByZWZpeCAqLwotICAvKiA2OCAqLwotICB7ICJwdXNoUCIsCUl2LCBYWCwgWFggfSwJCS8qIDM4NiBib29rIHdyb25nICovCi0gIHsgImltdWxTIiwJR3YsIEV2LCBJdiB9LAotICB7ICJwdXNoUCIsCXNJYiwgWFgsIFhYIH0sCS8qIHB1c2ggb2YgYnl0ZSByZWFsbHkgcHVzaGVzIDIgb3IgNCBieXRlcyAqLwotICB7ICJpbXVsUyIsCUd2LCBFdiwgc0liIH0sCi0gIHsgImluc2IiLAlZYiwgaW5kaXJEWCwgWFggfSwKLSAgeyAiaW5zUiIsCVl2LCBpbmRpckRYLCBYWCB9LAotICB7ICJvdXRzYiIsCWluZGlyRFgsIFhiLCBYWCB9LAotICB7ICJvdXRzUiIsCWluZGlyRFgsIFh2LCBYWCB9LAotICAvKiA3MCAqLwotICB7ICJqbyIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5vIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamFlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5lIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImphIiwJSmIsIFhYLCBYWCB9LAotICAvKiA3OCAqLwotICB7ICJqcyIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5zIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqcCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamdlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbGUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpnIiwJSmIsIFhYLCBYWCB9LAotICAvKiA4MCAqLwotICB7IEdSUDFiIH0sCi0gIHsgR1JQMVMgfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgR1JQMVNzIH0sCi0gIHsgInRlc3RCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJ0ZXN0UyIsCUV2LCBHdiwgWFggfSwKLSAgeyAieGNoZ0IiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInhjaGdTIiwJRXYsIEd2LCBYWCB9LAotICAvKiA4OCAqLwotICB7ICJtb3ZCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJtb3ZTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJtb3ZCIiwJR2IsIEViLCBYWCB9LAotICB7ICJtb3ZTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJtb3ZRIiwJRXYsIFN3LCBYWCB9LAotICB7ICJsZWFTIiwJR3YsIE0sIFhYIH0sCi0gIHsgIm1vdlEiLAlTdywgRXYsIFhYIH0sCi0gIHsgInBvcFEiLAlFdiwgWFgsIFhYIH0sCi0gIC8qIDkwICovCi0gIHsgIm5vcCIsCVhYLCBYWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllQ1gsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllRFgsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllQlgsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllU1AsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllQlAsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllU0ksIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllREksIGVBWCwgWFggfSwKLSAgLyogOTggKi8KLSAgeyAiY1d0UiIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY1J0ZCIsCVhYLCBYWCwgWFggfSwKLSAgeyAibGNhbGxQIiwJQXAsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCS8qIGZ3YWl0ICovCi0gIHsgInB1c2hmUCIsCVhYLCBYWCwgWFggfSwKLSAgeyAicG9wZlAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInNhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgIm1vdkIiLAlBTCwgT2IsIFhYIH0sCi0gIHsgIm1vdlMiLAllQVgsIE92LCBYWCB9LAotICB7ICJtb3ZCIiwJT2IsIEFMLCBYWCB9LAotICB7ICJtb3ZTIiwJT3YsIGVBWCwgWFggfSwKLSAgeyAibW92c2IiLAlZYiwgWGIsIFhYIH0sCi0gIHsgIm1vdnNSIiwJWXYsIFh2LCBYWCB9LAotICB7ICJjbXBzYiIsCVhiLCBZYiwgWFggfSwKLSAgeyAiY21wc1IiLAlYdiwgWXYsIFhYIH0sCi0gIC8qIGE4ICovCi0gIHsgInRlc3RCIiwJQUwsIEliLCBYWCB9LAotICB7ICJ0ZXN0UyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInN0b3NCIiwJWWIsIEFMLCBYWCB9LAotICB7ICJzdG9zUyIsCVl2LCBlQVgsIFhYIH0sCi0gIHsgImxvZHNCIiwJQUwsIFhiLCBYWCB9LAotICB7ICJsb2RzUyIsCWVBWCwgWHYsIFhYIH0sCi0gIHsgInNjYXNCIiwJQUwsIFliLCBYWCB9LAotICB7ICJzY2FzUyIsCWVBWCwgWXYsIFhYIH0sCi0gIC8qIGIwICovCi0gIHsgIm1vdkIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlDTCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlETCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlCTCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlBSCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlDSCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlESCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlCSCwgSWIsIFhYIH0sCi0gIC8qIGI4ICovCi0gIHsgIm1vdlMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZUNYLCBJdiwgWFggfSwKLSAgeyAibW92UyIsCWVEWCwgSXYsIFhYIH0sCi0gIHsgIm1vdlMiLAllQlgsIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZVNQLCBJdiwgWFggfSwKLSAgeyAibW92UyIsCWVCUCwgSXYsIFhYIH0sCi0gIHsgIm1vdlMiLAllU0ksIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZURJLCBJdiwgWFggfSwKLSAgLyogYzAgKi8KLSAgeyBHUlAyYiB9LAotICB7IEdSUDJTIH0sCi0gIHsgInJldFAiLAlJdywgWFgsIFhYIH0sCi0gIHsgInJldFAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxlc1MiLAlHdiwgTXAsIFhYIH0sCi0gIHsgImxkc1MiLAlHdiwgTXAsIFhYIH0sCi0gIHsgIm1vdkEiLAlFYiwgSWIsIFhYIH0sCi0gIHsgIm1vdlEiLAlFdiwgSXYsIFhYIH0sCi0gIC8qIGM4ICovCi0gIHsgImVudGVyUCIsCUl3LCBJYiwgWFggfSwKLSAgeyAibGVhdmVQIiwJWFgsIFhYLCBYWCB9LAotICB7ICJscmV0UCIsCUl3LCBYWCwgWFggfSwKLSAgeyAibHJldFAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludDMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludCIsCUliLCBYWCwgWFggfSwKLSAgeyAiaW50byIsCVhYLCBYWCwgWFh9LAotICB7ICJpcmV0UCIsCVhYLCBYWCwgWFggfSwKLSAgLyogZDAgKi8KLSAgeyBHUlAyYl9vbmUgfSwKLSAgeyBHUlAyU19vbmUgfSwKLSAgeyBHUlAyYl9jbCB9LAotICB7IEdSUDJTX2NsIH0sCi0gIHsgImFhbSIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgImFhZCIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJ4bGF0IiwJRFNCWCwgWFgsIFhYIH0sCi0gIC8qIGQ4ICovCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICAvKiBlMCAqLwotICB7ICJsb29wbmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImxvb3BlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJsb29wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqRWN4eiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiaW5CIiwJQUwsIEliLCBYWCB9LAotICB7ICJpblMiLAllQVgsIEliLCBYWCB9LAotICB7ICJvdXRCIiwJSWIsIEFMLCBYWCB9LAotICB7ICJvdXRTIiwJSWIsIGVBWCwgWFggfSwKLSAgLyogZTggKi8KLSAgeyAiY2FsbFAiLAlKdiwgWFgsIFhYIH0sCi0gIHsgImptcFAiLAlKdiwgWFgsIFhYIH0sCi0gIHsgImxqbXBQIiwJQXAsIFhYLCBYWCB9LAotICB7ICJqbXAiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImluQiIsCUFMLCBpbmRpckRYLCBYWCB9LAotICB7ICJpblMiLAllQVgsIGluZGlyRFgsIFhYIH0sCi0gIHsgIm91dEIiLAlpbmRpckRYLCBBTCwgWFggfSwKLSAgeyAib3V0UyIsCWluZGlyRFgsIGVBWCwgWFggfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogbG9jayBwcmVmaXggKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHJlcG5lICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHJlcHogKi8KLSAgeyAiaGx0IiwJWFgsIFhYLCBYWCB9LAotICB7ICJjbWMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgR1JQM2IgfSwKLSAgeyBHUlAzUyB9LAotICAvKiBmOCAqLwotICB7ICJjbGMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInN0YyIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY2xpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzdGkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImNsZCIsCVhYLCBYWCwgWFggfSwKLSAgeyAic3RkIiwJWFgsIFhYLCBYWCB9LAotICB7IEdSUDQgfSwKLSAgeyBHUlA1IH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBkaXMzODZfaW50ZWxbXSA9IHsKLSAgLyogMDAgKi8KLSAgeyAiYWRkIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGQiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFkZCIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYWRkIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGQiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFkZCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAllcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVzLCBYWCwgWFggfSwKLSAgLyogMDggKi8KLSAgeyAib3IiLAlFYiwgR2IsIFhYIH0sCi0gIHsgIm9yIiwJRXYsIEd2LCBYWCB9LAotICB7ICJvciIsCUdiLCBFYiwgWFggfSwKLSAgeyAib3IiLAlHdiwgRXYsIFhYIH0sCi0gIHsgIm9yIiwJQUwsIEliLCBYWCB9LAotICB7ICJvciIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAljcywgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkvKiAweDBmIGV4dGVuZGVkIG9wY29kZSBlc2NhcGUgKi8KLSAgLyogMTAgKi8KLSAgeyAiYWRjIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFkYyIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYWRjIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGMiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFkYyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAlzcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsCXNzLCBYWCwgWFggfSwKLSAgLyogMTggKi8KLSAgeyAic2JiIiwJRWIsIEdiLCBYWCB9LAotICB7ICJzYmIiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInNiYiIsCUdiLCBFYiwgWFggfSwKLSAgeyAic2JiIiwJR3YsIEV2LCBYWCB9LAotICB7ICJzYmIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInNiYiIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAlkcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWRzLCBYWCwgWFggfSwKLSAgLyogMjAgKi8KLSAgeyAiYW5kIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhbmQiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFuZCIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYW5kIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhbmQiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFuZCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBFUyBwcmVmaXggKi8KLSAgeyAiZGFhIiwJWFgsIFhYLCBYWCB9LAotICAvKiAyOCAqLwotICB7ICJzdWIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInN1YiIsCUV2LCBHdiwgWFggfSwKLSAgeyAic3ViIiwJR2IsIEViLCBYWCB9LAotICB7ICJzdWIiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInN1YiIsCUFMLCBJYiwgWFggfSwKLSAgeyAic3ViIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogU0VHIENTIHByZWZpeCAqLwotICB7ICJkYXMiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgInhvciIsCUViLCBHYiwgWFggfSwKLSAgeyAieG9yIiwJRXYsIEd2LCBYWCB9LAotICB7ICJ4b3IiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInhvciIsCUd2LCBFdiwgWFggfSwKLSAgeyAieG9yIiwJQUwsIEliLCBYWCB9LAotICB7ICJ4b3IiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgU1MgcHJlZml4ICovCi0gIHsgImFhYSIsCVhYLCBYWCwgWFggfSwKLSAgLyogMzggKi8KLSAgeyAiY21wIiwJRWIsIEdiLCBYWCB9LAotICB7ICJjbXAiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImNtcCIsCUdiLCBFYiwgWFggfSwKLSAgeyAiY21wIiwJR3YsIEV2LCBYWCB9LAotICB7ICJjbXAiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImNtcCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBEUyBwcmVmaXggKi8KLSAgeyAiYWFzIiwJWFgsIFhYLCBYWCB9LAotICAvKiA0MCAqLwotICB7ICJpbmMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllQ1gsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllRFgsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllU1AsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllQlAsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJpbmMiLAllREksIFhYLCBYWCB9LAotICAvKiA0OCAqLwotICB7ICJkZWMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllQ1gsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllRFgsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllU1AsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllQlAsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJkZWMiLAllREksIFhYLCBYWCB9LAotICAvKiA1MCAqLwotICB7ICJwdXNoIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInB1c2giLAllRFgsIFhYLCBYWCB9LAotICB7ICJwdXNoIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInB1c2giLAllQlAsIFhYLCBYWCB9LAotICB7ICJwdXNoIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDU4ICovCi0gIHsgInBvcCIsCWVBWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVCWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVTSSwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDYwICovCi0gIHsgInB1c2hhIiwJWFgsIFhYLCBYWCB9LAotICB7ICJwb3BhIiwJWFgsIFhYLCBYWCB9LAotICB7ICJib3VuZCIsCUd2LCBNYSwgWFggfSwKLSAgeyAiYXJwbCIsCUV3LCBHdywgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogc2VnIGZzICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHNlZyBncyAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBvcCBzaXplIHByZWZpeCAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBhZHIgc2l6ZSBwcmVmaXggKi8KLSAgLyogNjggKi8KLSAgeyAicHVzaCIsCUl2LCBYWCwgWFggfSwJCS8qIDM4NiBib29rIHdyb25nICovCi0gIHsgImltdWwiLAlHdiwgRXYsIEl2IH0sCi0gIHsgInB1c2giLAlzSWIsIFhYLCBYWCB9LAkvKiBwdXNoIG9mIGJ5dGUgcmVhbGx5IHB1c2hlcyAyIG9yIDQgYnl0ZXMgKi8KLSAgeyAiaW11bCIsCUd2LCBFdiwgc0liIH0sCi0gIHsgImlucyIsCVliLCBpbmRpckRYLCBYWCB9LAotICB7ICJpbnMiLAlZdiwgaW5kaXJEWCwgWFggfSwKLSAgeyAib3V0cyIsCWluZGlyRFgsIFhiLCBYWCB9LAotICB7ICJvdXRzIiwJaW5kaXJEWCwgWHYsIFhYIH0sCi0gIC8qIDcwICovCi0gIHsgImpvIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbm8iLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpiIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYWUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImplIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpiZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamEiLAlKYiwgWFgsIFhYIH0sCi0gIC8qIDc4ICovCi0gIHsgImpzIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbnMiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpwIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbnAiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpsIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqZ2UiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpsZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamciLAlKYiwgWFgsIFhYIH0sCi0gIC8qIDgwICovCi0gIHsgR1JQMWIgfSwKLSAgeyBHUlAxUyB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgeyBHUlAxU3MgfSwKLSAgeyAidGVzdCIsCUViLCBHYiwgWFggfSwKLSAgeyAidGVzdCIsCUV2LCBHdiwgWFggfSwKLSAgeyAieGNoZyIsCUViLCBHYiwgWFggfSwKLSAgeyAieGNoZyIsCUV2LCBHdiwgWFggfSwKLSAgLyogODggKi8KLSAgeyAibW92IiwJRWIsIEdiLCBYWCB9LAotICB7ICJtb3YiLAlFdiwgR3YsIFhYIH0sCi0gIHsgIm1vdiIsCUdiLCBFYiwgWFggfSwKLSAgeyAibW92IiwJR3YsIEV2LCBYWCB9LAotICB7ICJtb3YiLAlFdiwgU3csIFhYIH0sCi0gIHsgImxlYSIsCUd2LCBNLCBYWCB9LAotICB7ICJtb3YiLAlTdywgRXYsIFhYIH0sCi0gIHsgInBvcCIsCUV2LCBYWCwgWFggfSwKLSAgLyogOTAgKi8KLSAgeyAibm9wIiwJWFgsIFhYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZUNYLCBlQVgsIFhYIH0sCi0gIHsgInhjaGciLAllRFgsIGVBWCwgWFggfSwKLSAgeyAieGNoZyIsCWVCWCwgZUFYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZVNQLCBlQVgsIFhYIH0sCi0gIHsgInhjaGciLAllQlAsIGVBWCwgWFggfSwKLSAgeyAieGNoZyIsCWVTSSwgZUFYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZURJLCBlQVgsIFhYIH0sCi0gIC8qIDk4ICovCi0gIHsgImNXIiwJWFgsIFhYLCBYWCB9LAkJLyogY3dkZSBhbmQgY2J3ICovCi0gIHsgImNSIiwJWFgsIFhYLCBYWCB9LAkJLyogY2RxIGFuZCBjd2QgKi8KLSAgeyAibGNhbGwiLAlBcCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJLyogZndhaXQgKi8KLSAgeyAicHVzaGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInBvcGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInNhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgIm1vdiIsCUFMLCBPYiwgWFggfSwKLSAgeyAibW92IiwJZUFYLCBPdiwgWFggfSwKLSAgeyAibW92IiwJT2IsIEFMLCBYWCB9LAotICB7ICJtb3YiLAlPdiwgZUFYLCBYWCB9LAotICB7ICJtb3ZzIiwJWWIsIFhiLCBYWCB9LAotICB7ICJtb3ZzIiwJWXYsIFh2LCBYWCB9LAotICB7ICJjbXBzIiwJWGIsIFliLCBYWCB9LAotICB7ICJjbXBzIiwJWHYsIFl2LCBYWCB9LAotICAvKiBhOCAqLwotICB7ICJ0ZXN0IiwJQUwsIEliLCBYWCB9LAotICB7ICJ0ZXN0IiwJZUFYLCBJdiwgWFggfSwKLSAgeyAic3RvcyIsCVliLCBBTCwgWFggfSwKLSAgeyAic3RvcyIsCVl2LCBlQVgsIFhYIH0sCi0gIHsgImxvZHMiLAlBTCwgWGIsIFhYIH0sCi0gIHsgImxvZHMiLAllQVgsIFh2LCBYWCB9LAotICB7ICJzY2FzIiwJQUwsIFliLCBYWCB9LAotICB7ICJzY2FzIiwJZUFYLCBZdiwgWFggfSwKLSAgLyogYjAgKi8KLSAgeyAibW92IiwJQUwsIEliLCBYWCB9LAotICB7ICJtb3YiLAlDTCwgSWIsIFhYIH0sCi0gIHsgIm1vdiIsCURMLCBJYiwgWFggfSwKLSAgeyAibW92IiwJQkwsIEliLCBYWCB9LAotICB7ICJtb3YiLAlBSCwgSWIsIFhYIH0sCi0gIHsgIm1vdiIsCUNILCBJYiwgWFggfSwKLSAgeyAibW92IiwJREgsIEliLCBYWCB9LAotICB7ICJtb3YiLAlCSCwgSWIsIFhYIH0sCi0gIC8qIGI4ICovCi0gIHsgIm1vdiIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVDWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVEWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVCWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVTUCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVCUCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVTSSwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVESSwgSXYsIFhYIH0sCi0gIC8qIGMwICovCi0gIHsgR1JQMmIgfSwKLSAgeyBHUlAyUyB9LAotICB7ICJyZXQiLAlJdywgWFgsIFhYIH0sCi0gIHsgInJldCIsCVhYLCBYWCwgWFggfSwKLSAgeyAibGVzIiwJR3YsIE1wLCBYWCB9LAotICB7ICJsZHMiLAlHdiwgTXAsIFhYIH0sCi0gIHsgIm1vdiIsCUViLCBJYiwgWFggfSwKLSAgeyAibW92IiwJRXYsIEl2LCBYWCB9LAotICAvKiBjOCAqLwotICB7ICJlbnRlciIsCUl3LCBJYiwgWFggfSwKLSAgeyAibGVhdmUiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxyZXQiLAlJdywgWFgsIFhYIH0sCi0gIHsgImxyZXQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludDMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludCIsCUliLCBYWCwgWFggfSwKLSAgeyAiaW50byIsCVhYLCBYWCwgWFggfSwKLSAgeyAiaXJldCIsCVhYLCBYWCwgWFggfSwKLSAgLyogZDAgKi8KLSAgeyBHUlAyYl9vbmUgfSwKLSAgeyBHUlAyU19vbmUgfSwKLSAgeyBHUlAyYl9jbCB9LAotICB7IEdSUDJTX2NsIH0sCi0gIHsgImFhbSIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgImFhZCIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJ4bGF0IiwJRFNCWCwgWFgsIFhYIH0sCi0gIC8qIGQ4ICovCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICAvKiBlMCAqLwotICB7ICJsb29wbmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImxvb3BlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJsb29wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqRWN4eiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiaW4iLAlBTCwgSWIsIFhYIH0sCi0gIHsgImluIiwJZUFYLCBJYiwgWFggfSwKLSAgeyAib3V0IiwJSWIsIEFMLCBYWCB9LAotICB7ICJvdXQiLAlJYiwgZUFYLCBYWCB9LAotICAvKiBlOCAqLwotICB7ICJjYWxsIiwJSnYsIFhYLCBYWCB9LAotICB7ICJqbXAiLAlKdiwgWFgsIFhYIH0sCi0gIHsgImxqbXAiLAlBcCwgWFgsIFhYIH0sCi0gIHsgImptcCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiaW4iLAlBTCwgaW5kaXJEWCwgWFggfSwKLSAgeyAiaW4iLAllQVgsIGluZGlyRFgsIFhYIH0sCi0gIHsgIm91dCIsCWluZGlyRFgsIEFMLCBYWCB9LAotICB7ICJvdXQiLAlpbmRpckRYLCBlQVgsIFhYIH0sCi0gIC8qIGYwICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIGxvY2sgcHJlZml4ICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiByZXBuZSAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiByZXB6ICovCi0gIHsgImhsdCIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY21jIiwJWFgsIFhYLCBYWCB9LAotICB7IEdSUDNiIH0sCi0gIHsgR1JQM1MgfSwKLSAgLyogZjggKi8KLSAgeyAiY2xjIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzdGMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImNsaSIsCVhYLCBYWCwgWFggfSwKLSAgeyAic3RpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJjbGQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInN0ZCIsCVhYLCBYWCwgWFggfSwKLSAgeyBHUlA0IH0sCi0gIHsgR1JQNSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X3R3b2J5dGVfYXR0W10gPSB7Ci0gIC8qIDAwICovCi0gIHsgR1JQNiB9LAotICB7IEdSUDcgfSwKLSAgeyAibGFyUyIsIEd2LCBFdywgWFggfSwKLSAgeyAibHNsUyIsIEd2LCBFdywgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJjbHRzIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMDggKi8KLSAgeyAiaW52ZCIsIFhYLCBYWCwgWFggfSwKLSAgeyAid2JpbnZkIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAidWQyYSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgR1JQQU1EIH0sCi0gIHsgImZlbW1zIiwgWFgsIFhYLCBYWCB9LAotICB7ICIiLCBNWCwgRU0sIE9QU1VGIH0sIC8qIFNlZSBPUF8zRE5vd1N1ZmZpeCAqLwotICAvKiAxMCAqLwotICB7IFBSRUdSUDggfSwKLSAgeyBQUkVHUlA5IH0sCi0gIHsgIm1vdmxwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2gnIH0sICAvKiByZWFsbHkgb25seSAyIG9wZXJhbmRzICovCi0gIHsgIm1vdmxwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2gnIH0sCi0gIHsgInVucGNrbHBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJ1bnBja2hwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAibW92aHBzIiwgWE0sIEVYLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgeyAibW92aHBzIiwgRVgsIFhNLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgLyogMTggKi8KLSAgeyBHUlAxNCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMjAgKi8KLSAgLyogdGhlc2UgYXJlIGFsbCBiYWNrd2FyZCBpbiBhcHBlbmRpeCBBIG9mIHRoZSBpbnRlbCBib29rICovCi0gIHsgIm1vdkwiLCBSZCwgQ2QsIFhYIH0sCi0gIHsgIm1vdkwiLCBSZCwgRGQsIFhYIH0sCi0gIHsgIm1vdkwiLCBDZCwgUmQsIFhYIH0sCi0gIHsgIm1vdkwiLCBEZCwgUmQsIFhYIH0sCi0gIHsgIm1vdkwiLCBSZCwgVGQsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZMIiwgVGQsIFJkLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMjggKi8KLSAgeyAibW92YXBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJtb3ZhcHMiLCBFWCwgWE0sIFhYIH0sCi0gIHsgUFJFR1JQMiB9LAotICB7ICJtb3ZudHBzIiwgRXYsIFhNLCBYWCB9LAotICB7IFBSRUdSUDQgfSwKLSAgeyBQUkVHUlAzIH0sCi0gIHsgInVjb21pc3MiLCBYTSwgRVgsIFhYIH0sCi0gIHsgImNvbWlzcyIsIFhNLCBFWCwgWFggfSwKLSAgLyogMzAgKi8KLSAgeyAid3Jtc3IiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInJkdHNjIiwgWFgsIFhYLCBYWCB9LAotICB7ICJyZG1zciIsIFhYLCBYWCwgWFggfSwKLSAgeyAicmRwbWMiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInN5c2VudGVyIiwgWFgsIFhYLCBYWCB9LAotICB7ICJzeXNleGl0IiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDM4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogNDAgKi8KLSAgeyAiY21vdm8iLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZubyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmIiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZhZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZuZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmJlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92YSIsIEd2LCBFdiwgWFggfSwKLSAgLyogNDggKi8KLSAgeyAiY21vdnMiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZucyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdnAiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZucCIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmwiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZnZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmxlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92ZyIsIEd2LCBFdiwgWFggfSwKLSAgLyogNTAgKi8KLSAgeyAibW92bXNrcHMiLCBHdiwgRVgsIFhYIH0sCi0gIHsgUFJFR1JQMTMgfSwKLSAgeyBQUkVHUlAxMiB9LAotICB7IFBSRUdSUDExIH0sCi0gIHsgImFuZHBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJhbmRucHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgIm9ycHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgInhvcnBzIiwgWE0sIEVYLCBYWCB9LAotICAvKiA1OCAqLwotICB7IFBSRUdSUDAgfSwKLSAgeyBQUkVHUlAxMCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgUFJFR1JQMTQgfSwKLSAgeyBQUkVHUlA3IH0sCi0gIHsgUFJFR1JQNSB9LAotICB7IFBSRUdSUDYgfSwKLSAgLyogNjAgKi8KLSAgeyAicHVucGNrbGJ3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tsd2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2xkcSIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFja3Nzd2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBndGIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBndHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBndGQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhY2t1c3diIiwgTVgsIEVNLCBYWCB9LAotICAvKiA2OCAqLwotICB7ICJwdW5wY2toYnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2h3ZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHVucGNraGRxIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWNrc3NkdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZkIiwgTVgsIEVkLCBYWCB9LAotICB7ICJtb3ZxIiwgTVgsIEVNLCBYWCB9LAotICAvKiA3MCAqLwotICB7ICJwc2h1ZnciLCBNWCwgRU0sIEliIH0sCi0gIHsgR1JQMTAgfSwKLSAgeyBHUlAxMSB9LAotICB7IEdSUDEyIH0sCi0gIHsgInBjbXBlcWIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBlcXciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBlcWQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgImVtbXMiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDc4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdmQiLCBFZCwgTVgsIFhYIH0sCi0gIHsgIm1vdnEiLCBFTSwgTVgsIFhYIH0sCi0gIC8qIDgwICovCi0gIHsgImpvIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbm8iLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpiIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYWUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImplIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbmUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpiZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamEiLCBKdiwgWFgsIFhYIH0sCi0gIC8qIDg4ICovCi0gIHsgImpzIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbnMiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpwIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbnAiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpsIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqZ2UiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpsZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamciLCBKdiwgWFgsIFhYIH0sCi0gIC8qIDkwICovCi0gIHsgInNldG8iLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5vIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRiIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRhZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0ZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bmUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGJlIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRhIiwgRWIsIFhYLCBYWCB9LAotICAvKiA5OCAqLwotICB7ICJzZXRzIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRucyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0cCIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bnAiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGwiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGdlIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRsZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0ZyIsIEViLCBYWCwgWFggfSwKLSAgLyogYTAgKi8KLSAgeyAicHVzaFAiLCBmcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLCBmcywgWFgsIFhYIH0sCi0gIHsgImNwdWlkIiwgWFgsIFhYLCBYWCB9LAotICB7ICJidFMiLCBFdiwgR3YsIFhYIH0sCi0gIHsgInNobGRTIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaGxkUyIsIEV2LCBHdiwgQ0wgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiBhOCAqLwotICB7ICJwdXNoUCIsIGdzLCBYWCwgWFggfSwKLSAgeyAicG9wUCIsIGdzLCBYWCwgWFggfSwKLSAgeyAicnNtIiwgWFgsIFhYLCBYWCB9LAotICB7ICJidHNTIiwgRXYsIEd2LCBYWCB9LAotICB7ICJzaHJkUyIsIEV2LCBHdiwgSWIgfSwKLSAgeyAic2hyZFMiLCBFdiwgR3YsIENMIH0sCi0gIHsgR1JQMTMgfSwKLSAgeyAiaW11bFMiLCBHdiwgRXYsIFhYIH0sCi0gIC8qIGIwICovCi0gIHsgImNtcHhjaGdCIiwgRWIsIEdiLCBYWCB9LAotICB7ICJjbXB4Y2hnUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAibHNzUyIsIEd2LCBNcCwgWFggfSwKLSAgeyAiYnRyUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAibGZzUyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibGdzUyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibW92emJSIiwgR3YsIEViLCBYWCB9LAotICB7ICJtb3Z6d1IiLCBHdiwgRXcsIFhYIH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnp3dyAhICovCi0gIC8qIGI4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJ1ZDJiIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUDggfSwKLSAgeyAiYnRjUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAiYnNmUyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiYnNyUyIsIEd2LCBFdiwgWFggfSwKLSAgeyAibW92c2JSIiwgR3YsIEViLCBYWCB9LAotICB7ICJtb3Zzd1IiLCBHdiwgRXcsIFhYIH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnN3dyAhICovCi0gIC8qIGMwICovCi0gIHsgInhhZGRCIiwgRWIsIEdiLCBYWCB9LAotICB7ICJ4YWRkUyIsIEV2LCBHdiwgWFggfSwKLSAgeyBQUkVHUlAxIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwaW5zcnciLCBNWCwgRXYsIEliIH0sCi0gIHsgInBleHRydyIsIEV2LCBNWCwgSWIgfSwKLSAgeyAic2h1ZnBzIiwgWE0sIEVYLCBJYiB9LAotICB7IEdSUDkgfSwKLSAgLyogYzggKi8KLSAgeyAiYnN3YXAiLCBlQVgsIFhYLCBYWCB9LAkvKiBic3dhcCBkb2Vzbid0IHN1cHBvcnQgMTYgYml0IHJlZ3MgKi8KLSAgeyAiYnN3YXAiLCBlQ1gsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVEWCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZUJYLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlU1AsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVCUCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZVNJLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlREksIFhYLCBYWCB9LAotICAvKiBkMCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicHNybHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmxkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JscSIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtdWxsdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtb3Ztc2tiIiwgRXYsIE1YLCBYWCB9LAotICAvKiBkOCAqLwotICB7ICJwc3VidXNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3VidXN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWludWIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhbmQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR1c2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR1c3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtYXh1YiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFuZG4iLCBNWCwgRU0sIFhYIH0sCi0gIC8qIGUwICovCi0gIHsgInBhdmdiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JhdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNyYWQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhdmd3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbXVsaHV3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbXVsaHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZudHEiLCBFdiwgTVgsIFhYIH0sCi0gIC8qIGU4ICovCi0gIHsgInBzdWJzYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YnN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWluc3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBvciIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkc3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtYXhzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHhvciIsIE1YLCBFTSwgWFggfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBzbGx3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2xsZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNsbHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwbWFkZHdkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2FkYnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIm1hc2ttb3ZxIiwgTVgsIEVNLCBYWCB9LAotICAvKiBmOCAqLwotICB7ICJwc3ViYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzdWJkIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicGFkZGIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGRpczM4Nl90d29ieXRlX2ludGVsW10gPSB7Ci0gIC8qIDAwICovCi0gIHsgR1JQNiB9LAotICB7IEdSUDcgfSwKLSAgeyAibGFyIiwgR3YsIEV3LCBYWCB9LAotICB7ICJsc2wiLCBHdiwgRXcsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiY2x0cyIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDA4ICovCi0gIHsgImludmQiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIndiaW52ZCIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInVkMmEiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUEFNRCB9LAotICB7ICJmZW1tcyIgLCBYWCwgWFgsIFhYfSwKLSAgeyAiIiwgTVgsIEVNLCBPUFNVRiB9LCAvKiBTZWUgT1BfM0ROb3dTdWZmaXggKi8KLSAgLyogMTAgKi8KLSAgeyBQUkVHUlA4IH0sCi0gIHsgUFJFR1JQOSB9LAotICB7ICJtb3ZscHMiLCBYTSwgRVgsIFNJTURfRml4dXAsICdoJyB9LCAgLyogcmVhbGx5IG9ubHkgMiBvcGVyYW5kcyAqLwotICB7ICJtb3ZscHMiLCBFWCwgWE0sIFNJTURfRml4dXAsICdoJyB9LAotICB7ICJ1bnBja2xwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAidW5wY2tocHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgIm1vdmhwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIHsgIm1vdmhwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIC8qIDE4ICovCi0gIHsgR1JQMTQgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDIwICovCi0gIC8qIHRoZXNlIGFyZSBhbGwgYmFja3dhcmQgaW4gYXBwZW5kaXggQSBvZiB0aGUgaW50ZWwgYm9vayAqLwotICB7ICJtb3YiLCBSZCwgQ2QsIFhYIH0sCi0gIHsgIm1vdiIsIFJkLCBEZCwgWFggfSwKLSAgeyAibW92IiwgQ2QsIFJkLCBYWCB9LAotICB7ICJtb3YiLCBEZCwgUmQsIFhYIH0sCi0gIHsgIm1vdiIsIFJkLCBUZCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdiIsIFRkLCBSZCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDI4ICovCi0gIHsgIm1vdmFwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAibW92YXBzIiwgRVgsIFhNLCBYWCB9LAotICB7IFBSRUdSUDIgfSwKLSAgeyAibW92bnRwcyIsIEV2LCBYTSwgWFggfSwKLSAgeyBQUkVHUlA0IH0sCi0gIHsgUFJFR1JQMyB9LAotICB7ICJ1Y29taXNzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJjb21pc3MiLCBYTSwgRVgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgIndybXNyIiwgWFgsIFhYLCBYWCB9LAotICB7ICJyZHRzYyIsIFhYLCBYWCwgWFggfSwKLSAgeyAicmRtc3IiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInJkcG1jIiwgWFgsIFhYLCBYWCB9LAotICB7ICJzeXNlbnRlciIsIFhYLCBYWCwgWFggfSwKLSAgeyAic3lzZXhpdCIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiAzOCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDQwICovCi0gIHsgImNtb3ZvIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bm8iLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZiIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92YWUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bmUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZiZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmEiLCBHdiwgRXYsIFhYIH0sCi0gIC8qIDQ4ICovCi0gIHsgImNtb3ZzIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bnMiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZwIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bnAiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZsIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92Z2UiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZsZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmciLCBHdiwgRXYsIFhYIH0sCi0gIC8qIDUwICovCi0gIHsgIm1vdm1za3BzIiwgR3YsIEVYLCBYWCB9LAotICB7IFBSRUdSUDEzIH0sCi0gIHsgUFJFR1JQMTIgfSwKLSAgeyBQUkVHUlAxMSB9LAotICB7ICJhbmRwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAiYW5kbnBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJvcnBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJ4b3JwcyIsIFhNLCBFWCwgWFggfSwKLSAgLyogNTggKi8KLSAgeyBQUkVHUlAwIH0sCi0gIHsgUFJFR1JQMTAgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7IFBSRUdSUDE0IH0sCi0gIHsgUFJFR1JQNyB9LAotICB7IFBSRUdSUDUgfSwKLSAgeyBQUkVHUlA2IH0sCi0gIC8qIDYwICovCi0gIHsgInB1bnBja2xidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHVucGNrbHdkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tsZHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhY2tzc3diIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3RiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3R3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3RkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWNrdXN3YiIsIE1YLCBFTSwgWFggfSwKLSAgLyogNjggKi8KLSAgeyAicHVucGNraGJ3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tod2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2hkcSIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFja3NzZHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAibW92ZCIsIE1YLCBFZCwgWFggfSwKLSAgeyAibW92cSIsIE1YLCBFTSwgWFggfSwKLSAgLyogNzAgKi8KLSAgeyAicHNodWZ3IiwgTVgsIEVNLCBJYiB9LAotICB7IEdSUDEwIH0sCi0gIHsgR1JQMTEgfSwKLSAgeyBHUlAxMiB9LAotICB7ICJwY21wZXFiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZXF3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZXFkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJlbW1zIiwgWFgsIFhYLCBYWCB9LAotICAvKiA3OCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZkIiwgRWQsIE1YLCBYWCB9LAotICB7ICJtb3ZxIiwgRU0sIE1YLCBYWCB9LAotICAvKiA4MCAqLwotICB7ICJqbyIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5vIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYiIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamFlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5lIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYmUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImphIiwgSnYsIFhYLCBYWCB9LAotICAvKiA4OCAqLwotICB7ICJqcyIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5zIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqcCIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5wIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbCIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamdlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbGUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpnIiwgSnYsIFhYLCBYWCB9LAotICAvKiA5MCAqLwotICB7ICJzZXRvIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRubyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YiIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YWUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5lIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRiZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YSIsIEViLCBYWCwgWFggfSwKLSAgLyogOTggKi8KLSAgeyAic2V0cyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bnMiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldHAiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5wIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRsIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRnZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bGUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGciLCBFYiwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgInB1c2giLCBmcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsIGZzLCBYWCwgWFggfSwKLSAgeyAiY3B1aWQiLCBYWCwgWFgsIFhYIH0sCi0gIHsgImJ0IiwgRXYsIEd2LCBYWCB9LAotICB7ICJzaGxkIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaGxkIiwgRXYsIEd2LCBDTCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIGE4ICovCi0gIHsgInB1c2giLCBncywgWFgsIFhYIH0sCi0gIHsgInBvcCIsIGdzLCBYWCwgWFggfSwKLSAgeyAicnNtIiAsIFhYLCBYWCwgWFh9LAotICB7ICJidHMiLCBFdiwgR3YsIFhYIH0sCi0gIHsgInNocmQiLCBFdiwgR3YsIEliIH0sCi0gIHsgInNocmQiLCBFdiwgR3YsIENMIH0sCi0gIHsgR1JQMTMgfSwKLSAgeyAiaW11bCIsIEd2LCBFdiwgWFggfSwKLSAgLyogYjAgKi8KLSAgeyAiY21weGNoZyIsIEViLCBHYiwgWFggfSwKLSAgeyAiY21weGNoZyIsIEV2LCBHdiwgWFggfSwKLSAgeyAibHNzIiwgR3YsIE1wLCBYWCB9LAotICB7ICJidHIiLCBFdiwgR3YsIFhYIH0sCi0gIHsgImxmcyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibGdzIiwgR3YsIE1wLCBYWCB9LAotICB7ICJtb3Z6eCIsIEd2LCBFYiwgWFggfSwKLSAgeyAibW92engiLCBHdiwgRXcsIFhYIH0sCi0gIC8qIGI4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJ1ZDJiIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUDggfSwKLSAgeyAiYnRjIiwgRXYsIEd2LCBYWCB9LAotICB7ICJic2YiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImJzciIsIEd2LCBFdiwgWFggfSwKLSAgeyAibW92c3giLCBHdiwgRWIsIFhYIH0sCi0gIHsgIm1vdnN4IiwgR3YsIEV3LCBYWCB9LAotICAvKiBjMCAqLwotICB7ICJ4YWRkIiwgRWIsIEdiLCBYWCB9LAotICB7ICJ4YWRkIiwgRXYsIEd2LCBYWCB9LAotICB7IFBSRUdSUDEgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBpbnNydyIsIE1YLCBFdiwgSWIgfSwKLSAgeyAicGV4dHJ3IiwgRXYsIE1YLCBJYiB9LAotICB7ICJzaHVmcHMiLCBYTSwgRVgsIEliIH0sCi0gIHsgR1JQOSB9LAotICAvKiBjOCAqLwotICB7ICJic3dhcCIsIGVBWCwgWFgsIFhYIH0sCS8qIGJzd2FwIGRvZXNuJ3Qgc3VwcG9ydCAxNiBiaXQgcmVncyAqLwotICB7ICJic3dhcCIsIGVDWCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZURYLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlQlgsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVTUCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZUJQLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlU0ksIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVESSwgWFgsIFhYIH0sCi0gIC8qIGQwICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwc3JsdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNybGQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmxxIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicG11bGx3IiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicG1vdm1za2IiLCBFdiwgTVgsIFhYIH0sCi0gIC8qIGQ4ICovCi0gIHsgInBzdWJ1c2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzdWJ1c3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtaW51YiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFuZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHVzYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHVzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG1heHViIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYW5kbiIsIE1YLCBFTSwgWFggfSwKLSAgLyogZTAgKi8KLSAgeyAicGF2Z2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmF3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JhZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGF2Z3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtdWxodXciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtdWxodyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdm50cSIsIEV2LCBNWCwgWFggfSwKLSAgLyogZTggKi8KLSAgeyAicHN1YnNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3Vic3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtaW5zdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG9yIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkc2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGRzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG1heHN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJweG9yIiwgTVgsIEVNLCBYWCB9LAotICAvKiBmMCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicHNsbHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzbGxkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2xscSIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtYWRkd2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzYWRidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAibWFza21vdnEiLCBNWCwgRU0sIFhYIH0sCi0gIC8qIGY4ICovCi0gIHsgInBzdWJiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3VidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YmQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwYWRkYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGRkIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb25lYnl0ZV9oYXNfbW9kcm1bMjU2XSA9IHsKLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogMDAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMDAgKi8KLSAgLyogMTAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMTAgKi8KLSAgLyogMjAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMjAgKi8KLSAgLyogMzAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMzAgKi8KLSAgLyogNDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNDAgKi8KLSAgLyogNTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNTAgKi8KLSAgLyogNjAgKi8gMCwwLDEsMSwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwgLyogNjAgKi8KLSAgLyogNzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNzAgKi8KLSAgLyogODAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogODAgKi8KLSAgLyogOTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOTAgKi8KLSAgLyogYTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYTAgKi8KLSAgLyogYjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYjAgKi8KLSAgLyogYzAgKi8gMSwxLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwgLyogYzAgKi8KLSAgLyogZDAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwgLyogZDAgKi8KLSAgLyogZTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZTAgKi8KLSAgLyogZjAgKi8gMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDEsMSAgLyogZjAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHR3b2J5dGVfaGFzX21vZHJtWzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsIC8qIDBmICovCi0gIC8qIDEwICovIDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCi0gIC8qIDIwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDJmICovCi0gIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCi0gIC8qIDQwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDRmICovCi0gIC8qIDUwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsIC8qIDVmICovCi0gIC8qIDYwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsIC8qIDZmICovCi0gIC8qIDcwICovIDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDEsIC8qIDdmICovCi0gIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCi0gIC8qIDkwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDlmICovCi0gIC8qIGEwICovIDAsMCwwLDEsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDEsIC8qIGFmICovCi0gIC8qIGIwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMSwxLDEsIC8qIGJmICovCi0gIC8qIGMwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCi0gIC8qIGQwICovIDAsMSwxLDEsMCwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIGRmICovCi0gIC8qIGUwICovIDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIGVmICovCi0gIC8qIGYwICovIDAsMSwxLDEsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDAgIC8qIGZmICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0d29ieXRlX3VzZXNfZjNfcHJlZml4WzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDBmICovCi0gIC8qIDEwICovIDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCi0gIC8qIDIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLDAsIC8qIDJmICovCi0gIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCi0gIC8qIDQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDRmICovCi0gIC8qIDUwICovIDAsMSwxLDEsMCwwLDAsMCwxLDEsMCwwLDEsMSwxLDEsIC8qIDVmICovCi0gIC8qIDYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDZmICovCi0gIC8qIDcwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDdmICovCi0gIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCi0gIC8qIDkwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDlmICovCi0gIC8qIGEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGFmICovCi0gIC8qIGIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGJmICovCi0gIC8qIGMwICovIDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCi0gIC8qIGQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGRmICovCi0gIC8qIGUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGVmICovCi0gIC8qIGYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgIC8qIGZmICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY2hhciBvYnVmWzEwMF07Ci1zdGF0aWMgY2hhciAqb2J1ZnA7Ci1zdGF0aWMgY2hhciBzY3JhdGNoYnVmWzEwMF07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqc3RhcnRfY29kZXA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5zbl9jb2RlcDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpjb2RlcDsKLXN0YXRpYyBkaXNhc3NlbWJsZV9pbmZvICp0aGVfaW5mbzsKLXN0YXRpYyBpbnQgbW9kOwotc3RhdGljIGludCBybTsKLXN0YXRpYyBpbnQgcmVnOwotc3RhdGljIHZvaWQgb2FwcGVuZCBQQVJBTVMgKChjb25zdCBjaGFyICpzKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lczMyW109ewotICAiJWVheCIsIiVlY3giLCIlZWR4IiwiJWVieCIsICIlZXNwIiwiJWVicCIsIiVlc2kiLCIlZWRpIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXMxNltdID0gewotICAiJWF4IiwiJWN4IiwiJWR4IiwiJWJ4IiwiJXNwIiwiJWJwIiwiJXNpIiwiJWRpIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXM4W10gPSB7Ci0gICIlYWwiLCIlY2wiLCIlZGwiLCIlYmwiLCIlYWgiLCIlY2giLCIlZGgiLCIlYmgiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lc19zZWdbXSA9IHsKLSAgIiVlcyIsIiVjcyIsIiVzcyIsIiVkcyIsIiVmcyIsIiVncyIsIiU/IiwiJT8iLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICppbmRleDE2W10gPSB7Ci0gICIlYngsJXNpIiwiJWJ4LCVkaSIsIiVicCwlc2kiLCIlYnAsJWRpIiwiJXNpIiwiJWRpIiwiJWJwIiwiJWJ4IgotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZ3Jwc1tdWzhdID0gewotICAvKiBHUlAxYiAqLwotICB7Ci0gICAgeyAiYWRkQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJvckEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAiYWRjQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJzYmJBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgImFuZEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAic3ViQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJ4b3JBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgImNtcEEiLAlFYiwgSWIsIFhYIH0KLSAgfSwKLSAgLyogR1JQMVMgKi8KLSAgewotICAgIHsgImFkZFEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAib3JRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgImFkY1EiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAic2JiUSIsCUV2LCBJdiwgWFggfSwKLSAgICB7ICJhbmRRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgInN1YlEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAieG9yUSIsCUV2LCBJdiwgWFggfSwKLSAgICB7ICJjbXBRIiwJRXYsIEl2LCBYWCB9Ci0gIH0sCi0gIC8qIEdSUDFTcyAqLwotICB7Ci0gICAgeyAiYWRkUSIsCUV2LCBzSWIsIFhYIH0sCi0gICAgeyAib3JRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJhZGNRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJzYmJRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJhbmRRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJzdWJRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJ4b3JRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJjbXBRIiwJRXYsIHNJYiwgWFggfQotICB9LAotICAvKiBHUlAyYiAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJyb3JBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgInJjbEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAicmNyQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJzaGxBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgInNockEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyQSIsCUViLCBJYiwgWFggfSwKLSAgfSwKLSAgLyogR1JQMlMgKi8KLSAgewotICAgIHsgInJvbFEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAicm9yUSIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJyY2xRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgInJjclEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAic2hsUSIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJzaHJRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInNhclEiLAlFdiwgSWIsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDJiX29uZSAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJyb3JBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgInJjbEEiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAicmNyQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJzaGxBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgInNockEiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyQSIsCUViLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQMlNfb25lICovCi0gIHsKLSAgICB7ICJyb2xRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgInJvclEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAicmNsUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJyY3JRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgInNobFEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAic2hyUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFh9LAotICAgIHsgInNhclEiLAlFdiwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDJiX2NsICovCi0gIHsKLSAgICB7ICJyb2xBIiwJRWIsIENMLCBYWCB9LAotICAgIHsgInJvckEiLAlFYiwgQ0wsIFhYIH0sCi0gICAgeyAicmNsQSIsCUViLCBDTCwgWFggfSwKLSAgICB7ICJyY3JBIiwJRWIsIENMLCBYWCB9LAotICAgIHsgInNobEEiLAlFYiwgQ0wsIFhYIH0sCi0gICAgeyAic2hyQSIsCUViLCBDTCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJzYXJBIiwJRWIsIENMLCBYWCB9LAotICB9LAotICAvKiBHUlAyU19jbCAqLwotICB7Ci0gICAgeyAicm9sUSIsCUV2LCBDTCwgWFggfSwKLSAgICB7ICJyb3JRIiwJRXYsIENMLCBYWCB9LAotICAgIHsgInJjbFEiLAlFdiwgQ0wsIFhYIH0sCi0gICAgeyAicmNyUSIsCUV2LCBDTCwgWFggfSwKLSAgICB7ICJzaGxRIiwJRXYsIENMLCBYWCB9LAotICAgIHsgInNoclEiLAlFdiwgQ0wsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyUSIsCUV2LCBDTCwgWFggfQotICB9LAotICAvKiBHUlAzYiAqLwotICB7Ci0gICAgeyAidGVzdEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAibm90QSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJuZWdBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgIm11bEIiLAlBTCwgRWIsIFhYIH0sCi0gICAgeyAiaW11bEIiLAlBTCwgRWIsIFhYIH0sCi0gICAgeyAiZGl2QiIsCUFMLCBFYiwgWFggfSwKLSAgICB7ICJpZGl2QiIsCUFMLCBFYiwgWFggfQotICB9LAotICAvKiBHUlAzUyAqLwotICB7Ci0gICAgeyAidGVzdFEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAibm90USIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJuZWdRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgIm11bFMiLAllQVgsIEV2LCBYWCB9LAotICAgIHsgImltdWxTIiwJZUFYLCBFdiwgWFggfSwKLSAgICB7ICJkaXZTIiwJZUFYLCBFdiwgWFggfSwKLSAgICB7ICJpZGl2UyIsCWVBWCwgRXYsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDQgKi8KLSAgewotICAgIHsgImluY0EiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAiZGVjQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQNSAqLwotICB7Ci0gICAgeyAiaW5jUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJkZWNRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgImNhbGxQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAibGNhbGxQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAiam1wUCIsCWluZGlyRXYsIFhYLCBYWCB9LAotICAgIHsgImxqbXBQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAicHVzaFEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDYgKi8KLSAgewotICAgIHsgInNsZHQiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAic3RyIiwJRXcsIFhYLCBYWCB9LAotICAgIHsgImxsZHQiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAibHRyIiwJRXcsIFhYLCBYWCB9LAotICAgIHsgInZlcnIiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAidmVydyIsCUV3LCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfQotICB9LAotICAvKiBHUlA3ICovCi0gIHsKLSAgICB7ICJzZ2R0IiwgRXcsIFhYLCBYWCB9LAotICAgIHsgInNpZHQiLCBFdywgWFgsIFhYIH0sCi0gICAgeyAibGdkdCIsIEV3LCBYWCwgWFggfSwKLSAgICB7ICJsaWR0IiwgRXcsIFhYLCBYWCB9LAotICAgIHsgInNtc3ciLCBFdywgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gICAgeyAibG1zdyIsIEV3LCBYWCwgWFggfSwKLSAgICB7ICJpbnZscGciLCBFdywgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDggKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgImJ0USIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJidHNRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgImJ0clEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAiYnRjUSIsCUV2LCBJYiwgWFggfSwKLSAgfSwKLSAgLyogR1JQOSAqLwotICB7Ci0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiY21weGNoZzhiIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxMCAqLwotICB7Ci0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNybHciLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNyYXciLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNsbHciLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDExICovCi0gIHsKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc3JsZCIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc3JhZCIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc2xsZCIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQMTIgKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInBzcmxxIiwJTVMsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInBzbGxxIiwJTVMsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxMyAqLwotICB7Ci0gICAgeyAiZnhzYXZlIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgImZ4cnN0b3IiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAibGRteGNzciIsIEV2LCBYWCwgWFggfSwKLSAgICB7ICJzdG14Y3NyIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInNmZW5jZSIsIE5vbmUsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxNCAqLwotICB7Ci0gICAgeyAicHJlZmV0Y2hudGEiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAicHJlZmV0Y2h0MCIsIEV2LCBYWCwgWFggfSwKLSAgICB7ICJwcmVmZXRjaHQxIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgInByZWZldGNodDIiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUEFNRCAqLwotICB7Ci0gICAgeyAicHJlZmV0Y2giLCBFYiwgWFgsIFhYIH0sCi0gICAgeyAicHJlZmV0Y2h3IiwgRWIsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9Ci0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IHByZWZpeF91c2VyX3RhYmxlW11bMl0gPSB7Ci0gIC8qIFBSRUdSUDAgKi8KLSAgewotICAgIHsgImFkZHBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgImFkZHNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlAxICovCi0gIHsKLSAgICB7ICIiLCBYTSwgRVgsIE9QU0lNRCB9LAkvKiBTZWUgT1BfU0lNRF9TVUZGSVggKi8KLSAgICB7ICIiLCBYTSwgRVgsIE9QU0lNRCB9LAotICB9LAotICAvKiBQUkVHUlAyICovCi0gIHsKLSAgICB7ICJjdnRwaTJwcyIsIFhNLCBFTSwgWFggfSwKLSAgICB7ICJjdnRzaTJzcyIsIFhNLCBFdiwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMyAqLwotICB7Ci0gICAgeyAiY3Z0cHMycGkiLCBNWCwgRVgsIFhYIH0sCi0gICAgeyAiY3Z0c3Myc2kiLCBHdiwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDQgKi8KLSAgewotICAgIHsgImN2dHRwczJwaSIsIE1YLCBFWCwgWFggfSwKLSAgICB7ICJjdnR0c3Myc2kiLCBHdiwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDUgKi8KLSAgewotICAgIHsgImRpdnBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgImRpdnNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlA2ICovCi0gIHsKLSAgICB7ICJtYXhwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJtYXhzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQNyAqLwotICB7Ci0gICAgeyAibWlucHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAibWluc3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDggKi8KLSAgewotICAgIHsgIm1vdnVwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJtb3ZzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQOSAqLwotICB7Ci0gICAgeyAibW92dXBzIiwgRVgsIFhNLCBYWCB9LAotICAgIHsgIm1vdnNzIiwgRVgsIFhNLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlAxMCAqLwotICB7Ci0gICAgeyAibXVscHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAibXVsc3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDExICovCi0gIHsKLSAgICB7ICJyY3BwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJyY3BzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTIgKi8KLSAgewotICAgIHsgInJzcXJ0cHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAicnNxcnRzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTMgKi8KLSAgewotICAgIHsgInNxcnRwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJzcXJ0c3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDE0ICovCi0gIHsKLSAgICB7ICJzdWJwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJzdWJzcyIsIFhNLCBFWCwgWFggfSwKLSAgfQotfTsKLQotI2RlZmluZSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IgXygiPGludGVybmFsIGRpc2Fzc2VtYmxlciBlcnJvcj4iKQotCi1zdGF0aWMgdm9pZAotY2twcmVmaXggKCkKLXsKLSAgcHJlZml4ZXMgPSAwOwotICB1c2VkX3ByZWZpeGVzID0gMDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gICAgICBzd2l0Y2ggKCpjb2RlcCkKLQl7Ci0JY2FzZSAweGYzOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX1JFUFo7Ci0JICBicmVhazsKLQljYXNlIDB4ZjI6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfUkVQTlo7Ci0JICBicmVhazsKLQljYXNlIDB4ZjA6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfTE9DSzsKLQkgIGJyZWFrOwotCWNhc2UgMHgyZToKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9DUzsKLQkgIGJyZWFrOwotCWNhc2UgMHgzNjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9TUzsKLQkgIGJyZWFrOwotCWNhc2UgMHgzZToKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9EUzsKLQkgIGJyZWFrOwotCWNhc2UgMHgyNjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9FUzsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NDoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9GUzsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NToKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9HUzsKLQkgIGJyZWFrOwotCWNhc2UgMHg2NjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9EQVRBOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY3OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0FERFI7Ci0JICBicmVhazsKLQljYXNlIEZXQUlUX09QQ09ERToKLQkgIC8qIGZ3YWl0IGlzIHJlYWxseSBhbiBpbnN0cnVjdGlvbi4gIElmIHRoZXJlIGFyZSBwcmVmaXhlcwotCSAgICAgYmVmb3JlIHRoZSBmd2FpdCwgdGhleSBiZWxvbmcgdG8gdGhlIGZ3YWl0LCAqbm90KiB0byB0aGUKLQkgICAgIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4gICovCi0JICBpZiAocHJlZml4ZXMpCi0JICAgIHsKLQkgICAgICBwcmVmaXhlcyB8PSBQUkVGSVhfRldBSVQ7Ci0JICAgICAgY29kZXArKzsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHByZWZpeGVzID0gUFJFRklYX0ZXQUlUOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybjsKLQl9Ci0gICAgICBjb2RlcCsrOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmVmaXggYnl0ZSBQUkVGLCBvciBOVUxMIGlmIFBSRUYgaXMgbm90IGEKLSAgIHByZWZpeCBieXRlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcHJlZml4X25hbWUgKHByZWYsIHNpemVmbGFnKQotICAgICBpbnQgcHJlZjsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzd2l0Y2ggKHByZWYpCi0gICAgewotICAgIGNhc2UgMHhmMzoKLSAgICAgIHJldHVybiAicmVweiI7Ci0gICAgY2FzZSAweGYyOgotICAgICAgcmV0dXJuICJyZXBueiI7Ci0gICAgY2FzZSAweGYwOgotICAgICAgcmV0dXJuICJsb2NrIjsKLSAgICBjYXNlIDB4MmU6Ci0gICAgICByZXR1cm4gImNzIjsKLSAgICBjYXNlIDB4MzY6Ci0gICAgICByZXR1cm4gInNzIjsKLSAgICBjYXNlIDB4M2U6Ci0gICAgICByZXR1cm4gImRzIjsKLSAgICBjYXNlIDB4MjY6Ci0gICAgICByZXR1cm4gImVzIjsKLSAgICBjYXNlIDB4NjQ6Ci0gICAgICByZXR1cm4gImZzIjsKLSAgICBjYXNlIDB4NjU6Ci0gICAgICByZXR1cm4gImdzIjsKLSAgICBjYXNlIDB4NjY6Ci0gICAgICByZXR1cm4gKHNpemVmbGFnICYgREZMQUcpID8gImRhdGExNiIgOiAiZGF0YTMyIjsKLSAgICBjYXNlIDB4Njc6Ci0gICAgICByZXR1cm4gKHNpemVmbGFnICYgQUZMQUcpID8gImFkZHIxNiIgOiAiYWRkcjMyIjsKLSAgICBjYXNlIEZXQUlUX09QQ09ERToKLSAgICAgIHJldHVybiAiZndhaXQiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyIG9wMW91dFsxMDBdLCBvcDJvdXRbMTAwXSwgb3Azb3V0WzEwMF07Ci1zdGF0aWMgaW50IG9wX2FkLCBvcF9pbmRleFszXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb3BfYWRkcmVzc1szXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnRfcGM7Ci0KLQwKLS8qCi0gKiAgIE9uIHRoZSAzODYncyBvZiAxOTg4LCB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gaXMgMTUgYnl0ZXMuCi0gKiAgIChzZWUgdG9waWMgIlJlZHVuZGFudCBwcmVmaXhlcyIgaW4gdGhlICJEaWZmZXJlbmNlcyBmcm9tIDgwODYiCi0gKiAgIHNlY3Rpb24gb2YgdGhlICJWaXJ0dWFsIDgwODYgTW9kZSIgY2hhcHRlci4pCi0gKiAncGMnIHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiB0aGlzIGluc3RydWN0aW9uLCBpdCB3aWxsCi0gKiAgIGJlIHVzZWQgdG8gcHJpbnQgdGhlIHRhcmdldCBhZGRyZXNzIGlmIHRoaXMgaXMgYSByZWxhdGl2ZSBqdW1wIG9yIGNhbGwKLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiBieXRlcy4KLSAqLwotCi1zdGF0aWMgaW50IHByaW50X2luc25faTM4NgotICBQQVJBTVMgKChiZmRfdm1hIHBjLCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLXN0YXRpYyBjaGFyIGludGVsX3N5bnRheDsKLXN0YXRpYyBjaGFyIG9wZW5fY2hhcjsKLXN0YXRpYyBjaGFyIGNsb3NlX2NoYXI7Ci1zdGF0aWMgY2hhciBzZXBhcmF0b3JfY2hhcjsKLXN0YXRpYyBjaGFyIHNjYWxlX2NoYXI7Ci0KLWludAotcHJpbnRfaW5zbl9pMzg2X2F0dCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludGVsX3N5bnRheCA9IDA7Ci0gIG9wZW5fY2hhciA9ICcoJzsKLSAgY2xvc2VfY2hhciA9ICAnKSc7Ci0gIHNlcGFyYXRvcl9jaGFyID0gJywnOwotICBzY2FsZV9jaGFyID0gJywnOwotCi0gIHJldHVybiBwcmludF9pbnNuX2kzODYgKHBjLCBpbmZvKTsKLX0KLQotaW50Ci1wcmludF9pbnNuX2kzODZfaW50ZWwgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnRlbF9zeW50YXggPSAxOwotICBvcGVuX2NoYXIgPSAnWyc7Ci0gIGNsb3NlX2NoYXIgPSAnXSc7Ci0gIHNlcGFyYXRvcl9jaGFyID0gJysnOwotICBzY2FsZV9jaGFyID0gJyonOwotCi0gIHJldHVybiBwcmludF9pbnNuX2kzODYgKHBjLCBpbmZvKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9pMzg2IChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpczM4NiAqZHA7Ci0gIGludCBpOwotICBpbnQgdHdvX3NvdXJjZV9vcHM7Ci0gIGNoYXIgKmZpcnN0LCAqc2Vjb25kLCAqdGhpcmQ7Ci0gIGludCBuZWVkY29tbWE7Ci0gIHVuc2lnbmVkIGNoYXIgbmVlZF9tb2RybTsKLSAgdW5zaWduZWQgY2hhciB1c2VzX2YzX3ByZWZpeDsKLSAgVk9MQVRJTEUgaW50IHNpemVmbGFnOwotICBWT0xBVElMRSBpbnQgb3JpZ19zaXplZmxhZzsKLQotICBzdHJ1Y3QgZGlzX3ByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmluYnVmID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGlmIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2kzODZfaTM4NgotICAgICAgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KQotICAgIHNpemVmbGFnID0gQUZMQUd8REZMQUc7Ci0gIGVsc2UgaWYgKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pODA4NikKLSAgICBzaXplZmxhZyA9IDA7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgb3JpZ19zaXplZmxhZyA9IHNpemVmbGFnOwotCi0gIC8qIFRoZSBvdXRwdXQgbG9va3MgYmV0dGVyIGlmIHdlIHB1dCA3IGJ5dGVzIG9uIGEgbGluZSwgc2luY2UgdGhhdAotICAgICBwdXRzIG1vc3QgbG9uZyB3b3JkIGluc3RydWN0aW9ucyBvbiBhIHNpbmdsZSBsaW5lLiAgKi8KLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA3OwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBwYzsKLQotICBvYnVmWzBdID0gMDsKLSAgb3Axb3V0WzBdID0gMDsKLSAgb3Ayb3V0WzBdID0gMDsKLSAgb3Azb3V0WzBdID0gMDsKLQotICBvcF9pbmRleFswXSA9IG9wX2luZGV4WzFdID0gb3BfaW5kZXhbMl0gPSAtMTsKLQotICB0aGVfaW5mbyA9IGluZm87Ci0gIHN0YXJ0X3BjID0gcGM7Ci0gIHN0YXJ0X2NvZGVwID0gaW5idWY7Ci0gIGNvZGVwID0gaW5idWY7Ci0KLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIEdldHRpbmcgaGVyZSBtZWFucyB3ZSB0cmllZCBmb3IgZGF0YSBidXQgZGlkbid0IGdldCBpdC4gIFRoYXQKLSAgICAgICAgIG1lYW5zIHdlIGhhdmUgYW4gaW5jb21wbGV0ZSBpbnN0cnVjdGlvbiBvZiBzb21lIHNvcnQuICBKdXN0Ci0gICAgICAgICBwcmludCB0aGUgZmlyc3QgYnl0ZSBhcyBhIHByZWZpeCBvciBhIC5ieXRlIHBzZXVkby1vcC4gICovCi0gICAgICBpZiAoY29kZXAgPiBpbmJ1ZikKLQl7Ci0JICBuYW1lID0gcHJlZml4X25hbWUgKGluYnVmWzBdLCBvcmlnX3NpemVmbGFnKTsKLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEp1c3QgcHJpbnQgdGhlIGZpcnN0IGJ5dGUgYXMgYSAuYnl0ZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIuYnl0ZSAweCV4IiwKLQkJCQkgICAgICh1bnNpZ25lZCBpbnQpIGluYnVmWzBdKTsKLQkgICAgfQotCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgY2twcmVmaXggKCk7Ci0KLSAgaW5zbl9jb2RlcCA9IGNvZGVwOwotCi0gIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMSk7Ci0gIHR3b19zb3VyY2Vfb3BzID0gKCpjb2RlcCA9PSAweDYyKSB8fCAoKmNvZGVwID09IDB4YzgpOwotCi0gIG9idWZwID0gb2J1ZjsKLQotICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0ZXQUlUKQotICAgICAgJiYgKCgqY29kZXAgPCAweGQ4KSB8fCAoKmNvZGVwID4gMHhkZikpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIC8qIGZ3YWl0IG5vdCBmb2xsb3dlZCBieSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbi4gIFByaW50IHRoZQotICAgICAgICAgZmlyc3QgcHJlZml4LCB3aGljaCBpcyBwcm9iYWJseSBmd2FpdCBpdHNlbGYuICAqLwotICAgICAgbmFtZSA9IHByZWZpeF9uYW1lIChpbmJ1ZlswXSwgb3JpZ19zaXplZmxhZyk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCW5hbWUgPSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1I7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKCpjb2RlcCA9PSAweDBmKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMik7Ci0gICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICBkcCA9ICZkaXMzODZfdHdvYnl0ZV9pbnRlbFsqKytjb2RlcF07Ci0gICAgICBlbHNlCi0gICAgICAgIGRwID0gJmRpczM4Nl90d29ieXRlX2F0dFsqKytjb2RlcF07Ci0gICAgICBuZWVkX21vZHJtID0gdHdvYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKLSAgICAgIHVzZXNfZjNfcHJlZml4ID0gdHdvYnl0ZV91c2VzX2YzX3ByZWZpeFsqY29kZXBdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgIGRwID0gJmRpczM4Nl9pbnRlbFsqY29kZXBdOwotICAgICAgZWxzZQotICAgICAgICBkcCA9ICZkaXMzODZfYXR0Wypjb2RlcF07Ci0gICAgICBuZWVkX21vZHJtID0gb25lYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKLSAgICAgIHVzZXNfZjNfcHJlZml4ID0gMDsKLSAgICB9Ci0gIGNvZGVwKys7Ci0KLSAgaWYgKCF1c2VzX2YzX3ByZWZpeCAmJiAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWikpCi0gICAgewotICAgICAgb2FwcGVuZCAoInJlcHogIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9SRVBaOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX1JFUE5aKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCJyZXBueiAiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX1JFUE5aOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0xPQ0spCi0gICAgewotICAgICAgb2FwcGVuZCAoImxvY2sgIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9MT0NLOwotICAgIH0KLQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKLSAgICBzaXplZmxhZyBePSBERkxBRzsKLQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQUREUikKLSAgICB7Ci0gICAgICBzaXplZmxhZyBePSBBRkxBRzsKLSAgICAgIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgICAgICBvYXBwZW5kICgiYWRkcjMyICIpOwotICAgICAgZWxzZQotCW9hcHBlbmQgKCJhZGRyMTYgIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9BRERSOwotICAgIH0KLQotICBpZiAobmVlZF9tb2RybSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBjb2RlcCArIDEpOwotICAgICAgbW9kID0gKCpjb2RlcCA+PiA2KSAmIDM7Ci0gICAgICByZWcgPSAoKmNvZGVwID4+IDMpICYgNzsKLSAgICAgIHJtID0gKmNvZGVwICYgNzsKLSAgICB9Ci0KLSAgaWYgKGRwLT5uYW1lID09IE5VTEwgJiYgZHAtPmJ5dGVtb2RlMSA9PSBGTE9BVENPREUpCi0gICAgewotICAgICAgZG9mbG9hdCAoc2l6ZWZsYWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChkcC0+bmFtZSA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaChkcC0+Ynl0ZW1vZGUyKQotCSAgICB7Ci0JICAgICAgY2FzZSBVU0VfR1JPVVBTOgotCSAgICAgICAgZHAgPSAmZ3Jwc1tkcC0+Ynl0ZW1vZGUxXVtyZWddOwotCQlicmVhazsKLQkgICAgICBjYXNlIFVTRV9QUkVGSVhfVVNFUl9UQUJMRToKLQkJZHAgPSAmcHJlZml4X3VzZXJfdGFibGVbZHAtPmJ5dGVtb2RlMV1bcHJlZml4ZXMgJiBQUkVGSVhfUkVQWiA/IDEgOiAwXTsKLQkJdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWik7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCW9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBwdXRvcCAoZHAtPm5hbWUsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDFvdXQ7Ci0gICAgICBvcF9hZCA9IDI7Ci0gICAgICBpZiAoZHAtPm9wMSkKLQkoKmRwLT5vcDEpKGRwLT5ieXRlbW9kZTEsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDJvdXQ7Ci0gICAgICBvcF9hZCA9IDE7Ci0gICAgICBpZiAoZHAtPm9wMikKLQkoKmRwLT5vcDIpKGRwLT5ieXRlbW9kZTIsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDNvdXQ7Ci0gICAgICBvcF9hZCA9IDA7Ci0gICAgICBpZiAoZHAtPm9wMykKLQkoKmRwLT5vcDMpKGRwLT5ieXRlbW9kZTMsIHNpemVmbGFnKTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIGFueSBwcmVmaXhlcyB3ZXJlIG5vdCB1c2VkLiAgSWYgc28sIHByaW50IHRoZSBmaXJzdCBvbmUKLSAgICAgc2VwYXJhdGVseS4gIElmIHdlIGRvbid0IGRvIHRoaXMsIHdlJ2xsIHdpbmQgdXAgcHJpbnRpbmcgYW4KLSAgICAgaW5zdHJ1Y3Rpb24gc3RyZWFtIHdoaWNoIGRvZXMgbm90IHByZWNpc2VseSBjb3JyZXNwb25kIHRvIHRoZQotICAgICBieXRlcyB3ZSBhcmUgZGlzYXNzZW1ibGluZy4gICovCi0gIGlmICgocHJlZml4ZXMgJiB+dXNlZF9wcmVmaXhlcykgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gcHJlZml4X25hbWUgKGluYnVmWzBdLCBvcmlnX3NpemVmbGFnKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9IElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBvYnVmcCA9IG9idWYgKyBzdHJsZW4gKG9idWYpOwotICBmb3IgKGkgPSBzdHJsZW4gKG9idWYpOyBpIDwgNjsgaSsrKQotICAgIG9hcHBlbmQgKCIgIik7Ci0gIG9hcHBlbmQgKCIgIik7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvYnVmKTsKLQotICAvKiBUaGUgZW50ZXIgYW5kIGJvdW5kIGluc3RydWN0aW9ucyBhcmUgcHJpbnRlZCB3aXRoIG9wZXJhbmRzIGluIHRoZSBzYW1lCi0gICAgIG9yZGVyIGFzIHRoZSBpbnRlbCBib29rOyBldmVyeXRoaW5nIGVsc2UgaXMgcHJpbnRlZCBpbiByZXZlcnNlIG9yZGVyLiAgKi8KLSAgaWYgKGludGVsX3N5bnRheCB8fCB0d29fc291cmNlX29wcykKLSAgICB7Ci0gICAgICBmaXJzdCA9IG9wMW91dDsKLSAgICAgIHNlY29uZCA9IG9wMm91dDsKLSAgICAgIHRoaXJkID0gb3Azb3V0OwotICAgICAgb3BfYWQgPSBvcF9pbmRleFswXTsKLSAgICAgIG9wX2luZGV4WzBdID0gb3BfaW5kZXhbMl07Ci0gICAgICBvcF9pbmRleFsyXSA9IG9wX2FkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpcnN0ID0gb3Azb3V0OwotICAgICAgc2Vjb25kID0gb3Ayb3V0OwotICAgICAgdGhpcmQgPSBvcDFvdXQ7Ci0gICAgfQotICBuZWVkY29tbWEgPSAwOwotICBpZiAoKmZpcnN0KQotICAgIHsKLSAgICAgIGlmIChvcF9pbmRleFswXSAhPSAtMSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSBvcF9hZGRyZXNzW29wX2luZGV4WzBdXSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGZpcnN0KTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnNlY29uZCkKLSAgICB7Ci0gICAgICBpZiAobmVlZGNvbW1hKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotICAgICAgaWYgKG9wX2luZGV4WzFdICE9IC0xKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIG9wX2FkZHJlc3Nbb3BfaW5kZXhbMV1dLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgc2Vjb25kKTsKLSAgICAgIG5lZWRjb21tYSA9IDE7Ci0gICAgfQotICBpZiAoKnRoaXJkKQotICAgIHsKLSAgICAgIGlmIChuZWVkY29tbWEpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0gICAgICBpZiAob3BfaW5kZXhbMl0gIT0gLTEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgb3BfYWRkcmVzc1tvcF9pbmRleFsyXV0sIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCB0aGlyZCk7Ci0gICAgfQotICByZXR1cm4gY29kZXAgLSBpbmJ1ZjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZsb2F0X21lbV9hdHRbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGRzIiwKLSAgImZtdWxzIiwKLSAgImZjb21zIiwKLSAgImZjb21wcyIsCi0gICJmc3VicyIsCi0gICJmc3VicnMiLAotICAiZmRpdnMiLAotICAiZmRpdnJzIiwKLSAgLyogIGQ5ICovCi0gICJmbGRzIiwKLSAgIihiYWQpIiwKLSAgImZzdHMiLAotICAiZnN0cHMiLAotICAiZmxkZW52IiwKLSAgImZsZGN3IiwKLSAgImZOc3RlbnYiLAotICAiZk5zdGN3IiwKLSAgLyogZGEgKi8KLSAgImZpYWRkbCIsCi0gICJmaW11bGwiLAotICAiZmljb21sIiwKLSAgImZpY29tcGwiLAotICAiZmlzdWJsIiwKLSAgImZpc3VicmwiLAotICAiZmlkaXZsIiwKLSAgImZpZGl2cmwiLAotICAvKiBkYiAqLwotICAiZmlsZGwiLAotICAiKGJhZCkiLAotICAiZmlzdGwiLAotICAiZmlzdHBsIiwKLSAgIihiYWQpIiwKLSAgImZsZHQiLAotICAiKGJhZCkiLAotICAiZnN0cHQiLAotICAvKiBkYyAqLwotICAiZmFkZGwiLAotICAiZm11bGwiLAotICAiZmNvbWwiLAotICAiZmNvbXBsIiwKLSAgImZzdWJsIiwKLSAgImZzdWJybCIsCi0gICJmZGl2bCIsCi0gICJmZGl2cmwiLAotICAvKiBkZCAqLwotICAiZmxkbCIsCi0gICIoYmFkKSIsCi0gICJmc3RsIiwKLSAgImZzdHBsIiwKLSAgImZyc3RvciIsCi0gICIoYmFkKSIsCi0gICJmTnNhdmUiLAotICAiZk5zdHN3IiwKLSAgLyogZGUgKi8KLSAgImZpYWRkIiwKLSAgImZpbXVsIiwKLSAgImZpY29tIiwKLSAgImZpY29tcCIsCi0gICJmaXN1YiIsCi0gICJmaXN1YnIiLAotICAiZmlkaXYiLAotICAiZmlkaXZyIiwKLSAgLyogZGYgKi8KLSAgImZpbGQiLAotICAiKGJhZCkiLAotICAiZmlzdCIsCi0gICJmaXN0cCIsCi0gICJmYmxkIiwKLSAgImZpbGRsbCIsCi0gICJmYnN0cCIsCi0gICJmaXN0cGxsIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpmbG9hdF9tZW1faW50ZWxbXSA9IHsKLSAgLyogZDggKi8KLSAgImZhZGQiLAotICAiZm11bCIsCi0gICJmY29tIiwKLSAgImZjb21wIiwKLSAgImZzdWIiLAotICAiZnN1YnIiLAotICAiZmRpdiIsCi0gICJmZGl2ciIsCi0gIC8qICBkOSAqLwotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdCIsCi0gICJmc3RwIiwKLSAgImZsZGVudiIsCi0gICJmbGRjdyIsCi0gICJmTnN0ZW52IiwKLSAgImZOc3RjdyIsCi0gIC8qIGRhICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRiICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiKGJhZCkiLAotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdHAiLAotICAvKiBkYyAqLwotICAiZmFkZCIsCi0gICJmbXVsIiwKLSAgImZjb20iLAotICAiZmNvbXAiLAotICAiZnN1YiIsCi0gICJmc3ViciIsCi0gICJmZGl2IiwKLSAgImZkaXZyIiwKLSAgLyogZGQgKi8KLSAgImZsZCIsCi0gICIoYmFkKSIsCi0gICJmc3QiLAotICAiZnN0cCIsCi0gICJmcnN0b3IiLAotICAiKGJhZCkiLAotICAiZk5zYXZlIiwKLSAgImZOc3RzdyIsCi0gIC8qIGRlICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRmICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiZmJsZCIsCi0gICJmaWxkIiwKLSAgImZic3RwIiwKLSAgImZpc3RwbGwiLAotfTsKLQotI2RlZmluZSBTVCBPUF9TVCwgMAotI2RlZmluZSBTVGkgT1BfU1RpLCAwCi0KLSNkZWZpbmUgRkdSUGQ5XzIgTlVMTCwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZDlfNCBOVUxMLCBOVUxMLCAxLCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkOV81IE5VTEwsIE5VTEwsIDIsIE5VTEwsIDAsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGQ5XzYgTlVMTCwgTlVMTCwgMywgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZDlfNyBOVUxMLCBOVUxMLCA0LCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkYV81IE5VTEwsIE5VTEwsIDUsIE5VTEwsIDAsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGRiXzQgTlVMTCwgTlVMTCwgNiwgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZGVfMyBOVUxMLCBOVUxMLCA3LCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkZl80IE5VTEwsIE5VTEwsIDgsIE5VTEwsIDAsIE5VTEwsIDAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZmxvYXRfcmVnW11bOF0gPSB7Ci0gIC8qIGQ4ICovCi0gIHsKLSAgICB7ICJmYWRkIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmbXVsIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY29tIiwJU1RpLCBYWCwgWFggfSwKLSAgICB7ICJmY29tcCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnN1YiIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZnN1YnIiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgImZkaXYiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgImZkaXZyIiwJU1QsIFNUaSwgWFggfSwKLSAgfSwKLSAgLyogZDkgKi8KLSAgewotICAgIHsgImZsZCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnhjaCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyBGR1JQZDlfMiB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgRkdSUGQ5XzQgfSwKLSAgICB7IEZHUlBkOV81IH0sCi0gICAgeyBGR1JQZDlfNiB9LAotICAgIHsgRkdSUGQ5XzcgfSwKLSAgfSwKLSAgLyogZGEgKi8KLSAgewotICAgIHsgImZjbW92YiIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNtb3ZlIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY21vdmJlIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92dSIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyBGR1JQZGFfNSB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBkYiAqLwotICB7Ci0gICAgeyAiZmNtb3ZuYiIsU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY21vdm5lIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92bmJlIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92bnUiLFNULCBTVGksIFhYIH0sCi0gICAgeyBGR1JQZGJfNCB9LAotICAgIHsgImZ1Y29taSIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNvbWkiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBkYyAqLwotICB7Ci0gICAgeyAiZmFkZCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZm11bCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi0gICAgeyAiZnN1YiIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZnN1YnIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXYiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXZyIiwJU1RpLCBTVCwgWFggfSwKLSNlbHNlCi0gICAgeyAiZnN1YnIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZzdWIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXZyIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2IiwJU1RpLCBTVCwgWFggfSwKLSNlbmRpZgotICB9LAotICAvKiBkZCAqLwotICB7Ci0gICAgeyAiZmZyZWUiLAlTVGksIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgImZzdCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnN0cCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnVjb20iLAlTVGksIFhYLCBYWCB9LAotICAgIHsgImZ1Y29tcCIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIGRlICovCi0gIHsKLSAgICB7ICJmYWRkcCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZm11bHAiLAlTVGksIFNULCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgRkdSUGRlXzMgfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLSAgICB7ICJmc3VicCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZnN1YnJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2cCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZmRpdnJwIiwJU1RpLCBTVCwgWFggfSwKLSNlbHNlCi0gICAgeyAiZnN1YnJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmc3VicCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZmRpdnJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2cCIsCVNUaSwgU1QsIFhYIH0sCi0jZW5kaWYKLSAgfSwKLSAgLyogZGYgKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgRkdSUGRmXzQgfSwKLSAgICB7ICJmdWNvbWlwIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjb21pcCIsIFNULCBTVGksIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi19OwotCi0KLXN0YXRpYyBjaGFyICpmZ3Jwc1tdWzhdID0gewotICAvKiBkOV8yICAwICovCi0gIHsKLSAgICAiZm5vcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkOV80ICAxICovCi0gIHsKLSAgICAiZmNocyIsImZhYnMiLCIoYmFkKSIsIihiYWQpIiwiZnRzdCIsImZ4YW0iLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkOV81ICAyICovCi0gIHsKLSAgICAiZmxkMSIsImZsZGwydCIsImZsZGwyZSIsImZsZHBpIiwiZmxkbGcyIiwiZmxkbG4yIiwiZmxkeiIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkOV82ICAzICovCi0gIHsKLSAgICAiZjJ4bTEiLCJmeWwyeCIsImZwdGFuIiwiZnBhdGFuIiwiZnh0cmFjdCIsImZwcmVtMSIsImZkZWNzdHAiLCJmaW5jc3RwIiwKLSAgfSwKLQotICAvKiBkOV83ICA0ICovCi0gIHsKLSAgICAiZnByZW0iLCJmeWwyeHAxIiwiZnNxcnQiLCJmc2luY29zIiwiZnJuZGludCIsImZzY2FsZSIsImZzaW4iLCJmY29zIiwKLSAgfSwKLQotICAvKiBkYV81ICA1ICovCi0gIHsKLSAgICAiKGJhZCkiLCJmdWNvbXBwIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkYl80ICA2ICovCi0gIHsKLSAgICAiZmVuaSgyODcgb25seSkiLCJmZGlzaSgyODcgb25seSkiLCJmTmNsZXgiLCJmTmluaXQiLAotICAgICJmTnNldHBtKDI4NyBvbmx5KSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi0KLSAgLyogZGVfMyAgNyAqLwotICB7Ci0gICAgIihiYWQpIiwiZmNvbXBwIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkZl80ICA4ICovCi0gIHsKLSAgICAiZk5zdHN3IiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotfTsKLQotc3RhdGljIHZvaWQKLWRvZmxvYXQgKHNpemVmbGFnKQotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IHN0cnVjdCBkaXMzODYgKmRwOwotICB1bnNpZ25lZCBjaGFyIGZsb2F0b3A7Ci0KLSAgZmxvYXRvcCA9IGNvZGVwWy0xXTsKLQotICBpZiAobW9kICE9IDMpCi0gICAgewotICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgcHV0b3AgKGZsb2F0X21lbV9pbnRlbFsoZmxvYXRvcCAtIDB4ZDggKSAqIDggKyByZWddLCBzaXplZmxhZyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHB1dG9wIChmbG9hdF9tZW1fYXR0WyhmbG9hdG9wIC0gMHhkOCApICogOCArIHJlZ10sIHNpemVmbGFnKTsKLSAgICAgIG9idWZwID0gb3Axb3V0OwotICAgICAgaWYgKGZsb2F0b3AgPT0gMHhkYikKLSAgICAgICAgT1BfRSAoeF9tb2RlLCBzaXplZmxhZyk7Ci0gICAgICBlbHNlIGlmIChmbG9hdG9wID09IDB4ZGQpCi0gICAgICAgIE9QX0UgKGRfbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgZWxzZQotICAgICAgICBPUF9FICh2X21vZGUsIHNpemVmbGFnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGNvZGVwKys7Ci0KLSAgZHAgPSAmZmxvYXRfcmVnW2Zsb2F0b3AgLSAweGQ4XVtyZWddOwotICBpZiAoZHAtPm5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwdXRvcCAoZmdycHNbZHAtPmJ5dGVtb2RlMV1bcm1dLCBzaXplZmxhZyk7Ci0KLSAgICAgIC8qIGluc3RydWN0aW9uIGZuc3RzdyBpcyBvbmx5IG9uZSB3aXRoIHN0cmFuZ2UgYXJnICovCi0gICAgICBpZiAoZmxvYXRvcCA9PSAweGRmICYmIGNvZGVwWy0xXSA9PSAweGUwKQotCXN0cmNweSAob3Axb3V0LCBuYW1lczE2WzBdKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwdXRvcCAoZHAtPm5hbWUsIHNpemVmbGFnKTsKLQotICAgICAgb2J1ZnAgPSBvcDFvdXQ7Ci0gICAgICBpZiAoZHAtPm9wMSkKLQkoKmRwLT5vcDEpKGRwLT5ieXRlbW9kZTEsIHNpemVmbGFnKTsKLSAgICAgIG9idWZwID0gb3Ayb3V0OwotICAgICAgaWYgKGRwLT5vcDIpCi0JKCpkcC0+b3AyKShkcC0+Ynl0ZW1vZGUyLCBzaXplZmxhZyk7Ci0gICAgfQotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX1NUIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBvYXBwZW5kICgiJXN0Iik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU1RpIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVzdCglZCkiLCBybSk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0KLS8qIGNhcGl0YWwgbGV0dGVycyBpbiB0ZW1wbGF0ZSBhcmUgbWFjcm9zICovCi1zdGF0aWMgdm9pZAotcHV0b3AgKHRlbXBsYXRlLCBzaXplZmxhZykKLSAgICAgY29uc3QgY2hhciAqdGVtcGxhdGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgY29uc3QgY2hhciAqcDsKLQotICBmb3IgKHAgPSB0ZW1wbGF0ZTsgKnA7IHArKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpwKQotCXsKLQlkZWZhdWx0OgotCSAgKm9idWZwKysgPSAqcDsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmIChtb2QgIT0gMwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgICAgICB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotI2VuZGlmCi0JICAgICAgKQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLQkgIGJyZWFrOwotCWNhc2UgJ0InOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSAnRSc6CQkvKiBGb3IgamN4ei9qZWN4eiAqLwotCSAgaWYgKHNpemVmbGFnICYgQUZMQUcpCi0JICAgICpvYnVmcCsrID0gJ2UnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgICpvYnVmcCsrID0gJ2wnOwotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfRldBSVQpID09IDApCi0JICAgICpvYnVmcCsrID0gJ24nOwotCSAgZWxzZQotCSAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICAgICAgfHwgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLSNlbmRpZgotCSAgICAgICkKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdRJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgYnJlYWs7Ci0JICBpZiAobW9kICE9IDMKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICAgICAgfHwgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLSNlbmRpZgotCSAgICAgICkKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdSJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCXsKLQkJICAqb2J1ZnArKyA9ICdkJzsKLQkJICAqb2J1ZnArKyA9ICdxJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICpvYnVmcCsrID0gJ3cnOwotCQkgICpvYnVmcCsrID0gJ2QnOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICB9Ci0JICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICAgIH0KLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSAnVyc6Ci0JICAvKiBvcGVyYW5kIHNpemUgZmxhZyBmb3IgY3d0bCwgY2J0dyAqLwotCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JICAgICpvYnVmcCsrID0gJ3cnOwotCSAgZWxzZQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCXsKLQkJICAqb2J1ZnArKyA9ICdkJzsKLQkJICAqb2J1ZnArKyA9ICdlJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICpvYnVmcCsrID0gJ3cnOwotCQl9Ci0JICAgIH0KLQkgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgKm9idWZwID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLW9hcHBlbmQgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHN0cmNweSAob2J1ZnAsIHMpOwotICBvYnVmcCArPSBzdHJsZW4gKHMpOwotfQotCi1zdGF0aWMgdm9pZAotYXBwZW5kX3NlZyAoKQotewotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQ1MpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVjczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0NTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZHM6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9EUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9TUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJXNzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfU1M7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRVMpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVlczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0VTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0ZTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZnM6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9GUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9HUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJWdzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfR1M7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotT1BfaW5kaXJFIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAoIWludGVsX3N5bnRheCkKLSAgICBvYXBwZW5kICgiKiIpOwotICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IGRpc3A7Ci0KLSAgLyogc2tpcCBtb2Qvcm0gYnl0ZSAqLwotICBjb2RlcCsrOwotCi0gIGlmIChtb2QgPT0gMykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQotCXsKLQljYXNlIGJfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzOFtybV0pOwotCSAgYnJlYWs7Ci0JY2FzZSB3X21vZGU6Ci0JICBvYXBwZW5kIChuYW1lczE2W3JtXSk7Ci0JICBicmVhazsKLQljYXNlIGRfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGJyZWFrOwotCWNhc2Ugdl9tb2RlOgotCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JICAgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGVsc2UKLQkgICAgb2FwcGVuZCAobmFtZXMxNltybV0pOwotCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICBicmVhazsKLQljYXNlIDA6Ci0JICBpZiAoICEoY29kZXBbLTJdID09IDB4QUUgJiYgY29kZXBbLTFdID09IDB4RjggLyogc2ZlbmNlICovKSkKLQkgICAgQmFkT3AoKTsJLyogYmFkIHNmZW5jZSxsZWEsbGRzLGxlcyxsZnMsbGdzLGxzcyBtb2RybSAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0JICBicmVhazsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRpc3AgPSAwOwotICBhcHBlbmRfc2VnICgpOwotCi0gIGlmIChzaXplZmxhZyAmIEFGTEFHKSAvKiAzMiBiaXQgYWRkcmVzcyBtb2RlICovCi0gICAgewotICAgICAgaW50IGhhdmVzaWI7Ci0gICAgICBpbnQgaGF2ZWJhc2U7Ci0gICAgICBpbnQgYmFzZTsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICBpbnQgc2NhbGUgPSAwOwotCi0gICAgICBoYXZlc2liID0gMDsKLSAgICAgIGhhdmViYXNlID0gMTsKLSAgICAgIGJhc2UgPSBybTsKLQotICAgICAgaWYgKGJhc2UgPT0gNCkKLQl7Ci0JICBoYXZlc2liID0gMTsKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgc2NhbGUgPSAoKmNvZGVwID4+IDYpICYgMzsKLQkgIGluZGV4ID0gKCpjb2RlcCA+PiAzKSAmIDc7Ci0JICBiYXNlID0gKmNvZGVwICYgNzsKLQkgIGNvZGVwKys7Ci0JfQotCi0gICAgICBzd2l0Y2ggKG1vZCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGJhc2UgPT0gNSkKLQkgICAgewotCSAgICAgIGhhdmViYXNlID0gMDsKLQkgICAgICBkaXNwID0gZ2V0MzIgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgZGlzcCA9ICpjb2RlcCsrOwotCSAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGRpc3AgPSBnZXQzMiAoKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCFpbnRlbF9zeW50YXgpCi0gICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgIH0KLQotICAgICAgaWYgKGhhdmViYXNlIHx8IChoYXZlc2liICYmIChpbmRleCAhPSA0IHx8IHNjYWxlICE9IDApKSkKLQl7Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3dpdGNoIChieXRlbW9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBiX21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJCWVRFIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Ugd19tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIHZfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIkRXT1JEIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZF9tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiUVdPUkQgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSB4X21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJYV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLQkgICpvYnVmcCsrID0gb3Blbl9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICBpZiAoaGF2ZWJhc2UpCi0JICAgIG9hcHBlbmQgKG5hbWVzMzJbYmFzZV0pOwotCSAgaWYgKGhhdmVzaWIpCi0JICAgIHsKLQkgICAgICBpZiAoaW5kZXggIT0gNCkKLQkJewotICAgICAgICAgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlYmFzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKm9idWZwKysgPSBzZXBhcmF0b3JfY2hhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKm9idWZwID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJXMiLCBuYW1lczMyW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLQkJICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIsJXMiLCBuYW1lczMyW2luZGV4XSk7Ci0JCSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0JCX0KLSAgICAgICAgICAgICAgaWYgKCFpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgIHx8IChpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSBiX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB3X21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB2X21vZGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpvYnVmcCsrID0gc2NhbGVfY2hhcjsKLSAgICAgICAgICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIDEgPDwgc2NhbGUpOwotCSAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0JICAgIH0KLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERvbid0IHByaW50IHplcm8gZGlzcGxhY2VtZW50cyAqLwotICAgICAgICAgICAgICAgIGlmIChkaXNwID4gMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIislZCIsIGRpc3ApOwotICAgICAgICAgICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChkaXNwIDwgMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7Ci0gICAgICAgICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLQkgICpvYnVmcCsrID0gY2xvc2VfY2hhcjsKLSAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotCX0KLSAgICAgIGVsc2UgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCi0gICAgICAgICAgICB7Ci0JICAgICAgaWYgKHByZWZpeGVzICYgKFBSRUZJWF9DUyB8IFBSRUZJWF9TUyB8IFBSRUZJWF9EUwotCQkJICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKQotCQk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb2FwcGVuZCAobmFtZXNfc2VnWzNdKTsKLQkJICBvYXBwZW5kICgiOiIpOwotCQl9Ci0gICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4IiwgZGlzcCk7Ci0gICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgeyAvKiAxNiBiaXQgYWRkcmVzcyBtb2RlICovCi0gICAgICBzd2l0Y2ggKG1vZCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKHJtID09IDYpCi0JICAgIHsKLQkgICAgICBkaXNwID0gZ2V0MTYgKCk7Ci0JICAgICAgaWYgKChkaXNwICYgMHg4MDAwKSAhPSAwKQotCQlkaXNwIC09IDB4MTAwMDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgZGlzcCA9ICpjb2RlcCsrOwotCSAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGRpc3AgPSBnZXQxNiAoKTsKLQkgIGlmICgoZGlzcCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoIWludGVsX3N5bnRheCkKLSAgICAgICAgaWYgKG1vZCAhPSAwIHx8IHJtID09IDYpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7Ci0gICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICB9Ci0KLSAgICAgIGlmIChtb2QgIT0gMCB8fCBybSAhPSA2KQotCXsKLQkgICpvYnVmcCsrID0gb3Blbl9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICBvYXBwZW5kIChpbmRleDE2W3JtXSk7Ci0gICAgICAgICAgKm9idWZwKysgPSBjbG9zZV9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLU9QX0cgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgb2FwcGVuZCAobmFtZXM4W3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczE2W3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBkX21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczMyW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlvYXBwZW5kIChuYW1lczMyW3JlZ10pOwotICAgICAgZWxzZQotCW9hcHBlbmQgKG5hbWVzMTZbcmVnXSk7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZXQzMiAoKQotewotICBpbnQgeCA9IDA7Ci0KLSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgNCk7Ci0gIHggPSAqY29kZXArKyAmIDB4ZmY7Ci0gIHggfD0gKCpjb2RlcCsrICYgMHhmZikgPDwgODsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAxNjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAyNDsKLSAgcmV0dXJuIHg7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldDE2ICgpCi17Ci0gIGludCB4ID0gMDsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAyKTsKLSAgeCA9ICpjb2RlcCsrICYgMHhmZjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9vcCAob3ApCi0gICAgIHVuc2lnbmVkIGludCBvcDsKLXsKLSAgb3BfaW5kZXhbb3BfYWRdID0gb3BfYWQ7Ci0gIG9wX2FkZHJlc3Nbb3BfYWRdID0gb3A7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9SRUcgKGNvZGUsIHNpemVmbGFnKQotICAgICBpbnQgY29kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBjaGFyICpzOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBpbmRpcl9keF9yZWc6Ci0gICAgICBzID0gIiglZHgpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYXhfcmVnOiBjYXNlIGN4X3JlZzogY2FzZSBkeF9yZWc6IGNhc2UgYnhfcmVnOgotICAgIGNhc2Ugc3BfcmVnOiBjYXNlIGJwX3JlZzogY2FzZSBzaV9yZWc6IGNhc2UgZGlfcmVnOgotICAgICAgcyA9IG5hbWVzMTZbY29kZSAtIGF4X3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGVzX3JlZzogY2FzZSBzc19yZWc6IGNhc2UgY3NfcmVnOgotICAgIGNhc2UgZHNfcmVnOiBjYXNlIGZzX3JlZzogY2FzZSBnc19yZWc6Ci0gICAgICBzID0gbmFtZXNfc2VnW2NvZGUgLSBlc19yZWddOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBhbF9yZWc6IGNhc2UgYWhfcmVnOiBjYXNlIGNsX3JlZzogY2FzZSBjaF9yZWc6Ci0gICAgY2FzZSBkbF9yZWc6IGNhc2UgZGhfcmVnOiBjYXNlIGJsX3JlZzogY2FzZSBiaF9yZWc6Ci0gICAgICBzID0gbmFtZXM4W2NvZGUgLSBhbF9yZWddOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlQVhfcmVnOiBjYXNlIGVDWF9yZWc6IGNhc2UgZURYX3JlZzogY2FzZSBlQlhfcmVnOgotICAgIGNhc2UgZVNQX3JlZzogY2FzZSBlQlBfcmVnOiBjYXNlIGVTSV9yZWc6IGNhc2UgZURJX3JlZzoKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCXMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKLSAgICAgIGVsc2UKLQlzID0gbmFtZXMxNltjb2RlIC0gZUFYX3JlZ107Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBvYXBwZW5kIChzKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0kgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvcDsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgb3AgPSAqY29kZXArKyAmIDB4ZmY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCW9wID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0Jb3AgPSBnZXQxNiAoKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvcCA9IGdldDE2ICgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBvcCk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJDB4JXgiLCBvcCk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICBzY3JhdGNoYnVmWzBdID0gJ1wwJzsKLX0KLQotc3RhdGljIHZvaWQKLU9QX3NJIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgb3A7Ci0KLSAgc3dpdGNoIChieXRlbW9kZSkKLSAgICB7Ci0gICAgY2FzZSBiX21vZGU6Ci0gICAgICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgICAgIG9wID0gKmNvZGVwKys7Ci0gICAgICBpZiAoKG9wICYgMHg4MCkgIT0gMCkKLQlvcCAtPSAweDEwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugdl9tb2RlOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0Jb3AgPSBnZXQzMiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcCA9IGdldDE2KCk7Ci0JICBpZiAoKG9wICYgMHg4MDAwKSAhPSAwKQotCSAgICBvcCAtPSAweDEwMDAwOwotCX0KLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvcCA9IGdldDE2ICgpOwotICAgICAgaWYgKChvcCAmIDB4ODAwMCkgIT0gMCkKLQlvcCAtPSAweDEwMDAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoaW50ZWxfc3ludGF4KQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIG9wKTsKLSAgZWxzZQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCIsIG9wKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9KIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgZGlzcDsKLSAgaW50IG1hc2sgPSAtMTsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgZGlzcCA9ICpjb2RlcCsrOwotICAgICAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQlkaXNwIC09IDB4MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlkaXNwID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0JewotCSAgZGlzcCA9IGdldDE2ICgpOwotCSAgLyogZm9yIHNvbWUgcmVhc29uLCBhIGRhdGExNiBwcmVmaXggb24gYSBqdW1wIGluc3RydWN0aW9uCi0JICAgICBtZWFucyB0aGF0IHRoZSBwYyBpcyBtYXNrZWQgdG8gMTYgYml0cyBhZnRlciB0aGUKLQkgICAgIGRpc3BsYWNlbWVudCBpcyBhZGRlZCEgICovCi0JICBtYXNrID0gMHhmZmZmOwotCX0KLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBkaXNwID0gKHN0YXJ0X3BjICsgY29kZXAgLSBzdGFydF9jb2RlcCArIGRpc3ApICYgbWFzazsKLSAgc2V0X29wIChkaXNwKTsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU0VHIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RhdGljIGNoYXIgKnNyZWdbXSA9IHsKLSAgICAiJWVzIiwiJWNzIiwiJXNzIiwiJWRzIiwiJWZzIiwiJWdzIiwiJT8iLCIlPyIsCi0gIH07Ci0KLSAgb2FwcGVuZCAoc3JlZ1tyZWddKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9ESVIgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IHNlZywgb2Zmc2V0OwotCi0gIGlmIChzaXplZmxhZyAmIERGTEFHKQotICAgIHsKLSAgICAgIG9mZnNldCA9IGdldDMyICgpOwotICAgICAgc2VnID0gZ2V0MTYgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2Zmc2V0ID0gZ2V0MTYgKCk7Ci0gICAgICBzZWcgPSBnZXQxNiAoKTsKLSAgICB9Ci0gIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJDB4JXgsJDB4JXgiLCBzZWcsIG9mZnNldCk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX09GRiAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvZmY7Ci0KLSAgYXBwZW5kX3NlZyAoKTsKLQotICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLSAgICBvZmYgPSBnZXQzMiAoKTsKLSAgZWxzZQotICAgIG9mZiA9IGdldDE2ICgpOwotCi0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgewotICAgICAgaWYgKCEocHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX1NTIHwgUFJFRklYX0RTCi0JCSAgICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKSkKLQl7Ci0JICBvYXBwZW5kIChuYW1lc19zZWdbM10pOwotCSAgb2FwcGVuZCAoIjoiKTsKLQl9Ci0gICAgfQotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9mZik7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIG9hcHBlbmQgKCIoIik7Ci0gIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgIHMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKLSAgZWxzZQotICAgIHMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKLSAgb2FwcGVuZCAocyk7Ci0gIG9hcHBlbmQgKCIpIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FU3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIG9hcHBlbmQgKCIlZXM6Iik7Ci0gIHB0cl9yZWcgKGNvZGUsIHNpemVmbGFnKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0RTcmVnIChjb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKChwcmVmaXhlcwotICAgICAgICYgKFBSRUZJWF9DUwotCSAgfCBQUkVGSVhfRFMKLQkgIHwgUFJFRklYX1NTCi0JICB8IFBSRUZJWF9FUwotCSAgfCBQUkVGSVhfRlMKLQkgIHwgUFJFRklYX0dTKSkgPT0gMCkKLSAgICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7Ci0gIGFwcGVuZF9zZWcoKTsKLSAgcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX0MgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVjciVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfRCAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJWRiJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9UIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUldHIlZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfUmQgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgPT0gMykKLSAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICBlbHNlCi0gICAgQmFkT3AoKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX01NWCAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlbW0lZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfWE1NIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUleG1tJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0VNIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAobW9kICE9IDMpCi0gICAgewotICAgICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29kZXArKzsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlbW0lZCIsIHJtKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FWCAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKG1vZCAhPSAzKQotICAgIHsKLSAgICAgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvZGVwKys7Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXhtbSVkIiwgcm0pOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX01TIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAobW9kID09IDMpCi0gICAgT1BfRU0gKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci0gIGVsc2UKLSAgICBCYWRPcCgpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqU3VmZml4M0ROb3dbXSA9IHsKLS8qIDAwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAwNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDBDICovCSJwaTJmdyIsCSJwaTJmZCIsCU5VTEwsCQlOVUxMLAotLyogMTAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDE0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAxOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMUMgKi8JInBmMml3IiwJInBmMmlkIiwJTlVMTCwJCU5VTEwsCi0vKiAyMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAyQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDM0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAzOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogM0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDQwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA0NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDRDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDU4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDY0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA2OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDcwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA3NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDdDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA4MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogODQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDg4ICovCU5VTEwsCQlOVUxMLAkJInBmbmFjYyIsCU5VTEwsCi0vKiA4QyAqLwlOVUxMLAkJTlVMTCwJCSJwZnBuYWNjIiwJTlVMTCwKLS8qIDkwICovCSJwZmNtcGdlIiwJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogOTQgKi8JInBmbWluIiwJTlVMTCwJCSJwZnJjcCIsCSJwZnJzcXJ0IiwKLS8qIDk4ICovCU5VTEwsCQlOVUxMLAkJInBmc3ViIiwJTlVMTCwKLS8qIDlDICovCU5VTEwsCQlOVUxMLAkJInBmYWRkIiwJTlVMTCwKLS8qIEEwICovCSJwZmNtcGd0IiwJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQTQgKi8JInBmbWF4IiwJTlVMTCwJCSJwZnJjcGl0MSIsCSJwZnJzcWl0MSIsCi0vKiBBOCAqLwlOVUxMLAkJTlVMTCwJCSJwZnN1YnIiLAlOVUxMLAotLyogQUMgKi8JTlVMTCwJCU5VTEwsCQkicGZhY2MiLAlOVUxMLAotLyogQjAgKi8JInBmY21wZXEiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBCNCAqLwkicGZtdWwiLAlOVUxMLAkJInBmcmNwaXQyIiwJInBmbXVsaHJ3IiwKLS8qIEI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCSJwc3dhcGQiLAotLyogQkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJInBhdmd1c2IiLAotLyogQzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEM0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBDOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQ0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEQwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBENCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIERDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEU4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEY0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBGOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLX07Ci0KLXN0YXRpYyB2b2lkCi1PUF8zRE5vd1N1ZmZpeCAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNvbnN0IGNoYXIgKm1uZW1vbmljOwotCi0gIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAvKiBBTUQgM0ROb3chIGluc3RydWN0aW9ucyBhcmUgc3BlY2lmaWVkIGJ5IGFuIG9wY29kZSBzdWZmaXggaW4gdGhlCi0gICAgIHBsYWNlIHdoZXJlIGFuIDgtYml0IGltbWVkaWF0ZSB3b3VsZCBub3JtYWxseSBnby4gIGllLiB0aGUgbGFzdAotICAgICBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9idWZwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgbW5lbW9uaWMgPSBTdWZmaXgzRE5vd1sqY29kZXArKyAmIDB4ZmZdOwotICBpZiAobW5lbW9uaWMpCi0gICAgb2FwcGVuZCAobW5lbW9uaWMpOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2luY2UgYSB2YXJpYWJsZSBzaXplZCBtb2RybS9zaWIgY2h1bmsgaXMgYmV0d2VlbiB0aGUgc3RhcnQKLQkgb2YgdGhlIG9wY29kZSAoMHgwZjBmKSBhbmQgdGhlIG9wY29kZSBzdWZmaXgsIHdlIG5lZWQgdG8gZG8KLQkgYWxsIHRoZSBtb2RybSBwcm9jZXNzaW5nIGZpcnN0LCBhbmQgZG9uJ3Qga25vdyB1bnRpbCBub3cgdGhhdAotCSB3ZSBoYXZlIGEgYmFkIG9wY29kZS4gIFRoaXMgbmVjZXNzaXRhdGVzIHNvbWUgY2xlYW5pbmcgdXAuICAqLwotICAgICAgb3Axb3V0WzBdID0gJ1wwJzsKLSAgICAgIG9wMm91dFswXSA9ICdcMCc7Ci0gICAgICBCYWRPcCgpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2ltZF9jbXBfb3AgW10gPSB7Ci0gICJlcSIsCi0gICJsdCIsCi0gICJsZSIsCi0gICJ1bm9yZCIsCi0gICJuZXEiLAotICAibmx0IiwKLSAgIm5sZSIsCi0gICJvcmQiCi19OwotCi1zdGF0aWMgdm9pZAotT1BfU0lNRF9TdWZmaXggKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBpbnQgY21wX3R5cGU7Ci0KLSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gIG9idWZwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgY21wX3R5cGUgPSAqY29kZXArKyAmIDB4ZmY7Ci0gIGlmIChjbXBfdHlwZSA8IDgpCi0gICAgewotICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgImNtcCVzJWNzIiwKLQkgICAgICAgc2ltZF9jbXBfb3BbY21wX3R5cGVdLAotCSAgICAgICBwcmVmaXhlcyAmIFBSRUZJWF9SRVBaID8gJ3MnIDogJ3AnKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX1JFUFopOwotICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhIGJhZCBleHRlbnNpb24gYnl0ZS4gIENsZWFuIHVwLiAgKi8KLSAgICAgIG9wMW91dFswXSA9ICdcMCc7Ci0gICAgICBvcDJvdXRbMF0gPSAnXDAnOwotICAgICAgQmFkT3AoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1TSU1EX0ZpeHVwIChleHRyYWNoYXIsIHNpemVmbGFnKQotICAgICBpbnQgZXh0cmFjaGFyOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogQ2hhbmdlIG1vdmxwcy9tb3ZocHMgdG8gbW92aGxwcy9tb3ZsaHBzIGZvciAyIHJlZ2lzdGVyIG9wZXJhbmQKLSAgICAgZm9ybXMgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgaWYgKG1vZCA9PSAzKQotICAgIHsKLSAgICAgIGNoYXIgKnAgPSBvYnVmICsgc3RybGVuKG9idWYpOwotICAgICAgKihwKzEpID0gJ1wwJzsKLSAgICAgICpwICAgICA9ICoocC0xKTsKLSAgICAgICoocC0xKSA9ICoocC0yKTsKLSAgICAgICoocC0yKSA9ICoocC0zKTsKLSAgICAgICoocC0zKSA9IGV4dHJhY2hhcjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEJhZE9wICh2b2lkKQotewotICBjb2RlcCA9IGluc25fY29kZXAgKyAxOwkvKiB0aHJvdyBhd2F5IHByZWZpeGVzIGFuZCAxc3QuIG9wY29kZSBieXRlICovCi0gIG9hcHBlbmQgKCIoYmFkKSIpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9pOTYwLWRpcy5jIGIvb3Bjb2Rlcy9pOTYwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJkODQ4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaTk2MC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBpODA5NjAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IHsKLS8qICAwICovCSJwZnAiLCAic3AiLCAgInJpcCIsICJyMyIsICAicjQiLCAgInI1IiwgICJyNiIsICAicjciLCAKLS8qICA4ICovCSJyOCIsICAicjkiLCAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwKLS8qIDE2ICovCSJnMCIsICAiZzEiLCAgImcyIiwgICJnMyIsICAiZzQiLCAgImc1IiwgICJnNiIsICAiZzciLCAKLS8qIDI0ICovCSJnOCIsICAiZzkiLCAgImcxMCIsICJnMTEiLCAiZzEyIiwgImcxMyIsICJnMTQiLCAiZnAiLCAKLS8qIDMyICovCSJwYyIsICAiYWMiLCAgImlwIiwgICJ0YyIsICAiZnAwIiwgImZwMSIsICJmcDIiLCAiZnAzIiAKLX07Ci0KLQotc3RhdGljIEZJTEUgKnN0cmVhbTsJCS8qIE91dHB1dCBnb2VzIGhlcmUgKi8KLXN0YXRpYyBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHIoKTsKLXN0YXRpYyB2b2lkIGN0cmwoKTsKLXN0YXRpYyB2b2lkIGNvYnIoKTsKLXN0YXRpYyB2b2lkIHJlZygpOwotc3RhdGljIGludCBtZW0oKTsKLXN0YXRpYyB2b2lkIGVhKCk7Ci1zdGF0aWMgdm9pZCBkc3RvcCgpOwotc3RhdGljIHZvaWQgcmVnb3AoKTsKLXN0YXRpYyB2b2lkIGludmFsaWQoKTsKLXN0YXRpYyBpbnQgcGluc24oKTsKLXN0YXRpYyB2b2lkIHB1dF9hYnMoKTsKLQotCi0vKiBQcmludCB0aGUgaTk2MCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICdtZW1hZGRyJyBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2k5NjAgKG1lbWFkZHIsIGluZm9fYXJnKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mb19hcmc7Ci17Ci0gIHVuc2lnbmVkIGludCB3b3JkMSwgd29yZDIgPSAweGRlYWRiZWVmOwotICBiZmRfYnl0ZSBidWZmZXJbOF07Ci0gIGludCBzdGF0dXM7Ci0KLSAgaW5mbyA9IGluZm9fYXJnOwotICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0KLSAgLyogUmVhZCB3b3JkMS4gIE9ubHkgcmVhZCB3b3JkMiBpZiB0aGUgaW5zdHJ1Y3Rpb24KLSAgICAgbmVlZHMgaXQsIHRvIHByZXZlbnQgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCAoYmZkX2J5dGUgKikgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICB3b3JkMSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLSAgLyogRGl2aWRlIGluc3RydWN0aW9uIHNldCBpbnRvIGNsYXNzZXMgYmFzZWQgb24gaGlnaCA0IGJpdHMgb2Ygb3Bjb2RlLiAgKi8KLSAgc3dpdGNoICggKHdvcmQxID4+IDI4KSAmIDB4ZiApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODoKLSAgICBjYXNlIDB4OToKLSAgICBjYXNlIDB4YToKLSAgICBjYXNlIDB4YjoKLSAgICBjYXNlIDB4YzoKLSAgICAgIC8qIFJlYWQgd29yZDIuICAqLwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCShtZW1hZGRyICsgNCwgKGJmZF9ieXRlICopIChidWZmZXIgKyA0KSwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgd29yZDIgPSBiZmRfZ2V0bDMyIChidWZmZXIgKyA0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcGluc24oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApOwotfQotDAotI2RlZmluZSBJTl9HREIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglBbGwgY29kZSBiZWxvdyB0aGlzIHBvaW50IHNob3VsZCBiZSBpZGVudGljYWwgd2l0aCB0aGF0IG9mCi0gKgl0aGUgZGlzYXNzZW1ibGVyIGluIGdkbXA5NjAuCi0KLSBBIG5vYmxlIHNlbnRpbWVudCwgYnV0IGF0IGxlYXN0IGluIGNvc21ldGljIHdheXMgKGluZm8tPmZwcmludGZfZnVuYyksIGl0Ci0ganVzdCBhaW4ndCBzby4gLWtpbmdkb24sIDMxIE1hciA5MwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgdGFiZW50IHsKLSAgY2hhciAqbmFtZTsKLSAgc2hvcnQgbnVtb3BzOwotfTsKLQotc3RydWN0IHNwYXJzZV90YWJlbnQgewotICBpbnQgb3Bjb2RlOwotICBjaGFyICpuYW1lOwotICBzaG9ydCBudW1vcHM7Ci19OwotCi1zdGF0aWMgaW50Ci1waW5zbiggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0JaW50IGluc3RyX2xlbjsKLQotCWluc3RyX2xlbiA9IDQ7Ci0JcHV0X2Ficyggd29yZDEsIHdvcmQyICk7Ci0KLQkvKiBEaXZpZGUgaW5zdHJ1Y3Rpb24gc2V0IGludG8gY2xhc3NlcyBiYXNlZCBvbiBoaWdoIDQgYml0cyBvZiBvcGNvZGUqLwotCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKLQljYXNlIDB4MDoKLQljYXNlIDB4MToKLQkJY3RybCggbWVtYWRkciwgd29yZDEsIHdvcmQyICk7Ci0JCWJyZWFrOwotCWNhc2UgMHgyOgotCWNhc2UgMHgzOgotCQljb2JyKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDU6Ci0JY2FzZSAweDY6Ci0JY2FzZSAweDc6Ci0JCXJlZyggd29yZDEgKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDg6Ci0JY2FzZSAweDk6Ci0JY2FzZSAweGE6Ci0JY2FzZSAweGI6Ci0JY2FzZSAweGM6Ci0JCWluc3RyX2xlbiA9IG1lbSggbWVtYWRkciwgd29yZDEsIHdvcmQyLCAwICk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGludmFsaWQgaW5zdHJ1Y3Rpb24sIHByaW50IGFzIGRhdGEgd29yZCAqLyAKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBpbnN0cl9sZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ1RSTCBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWN0cmwoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotCWludCBpOwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFiZW50IGN0cmxfdGFiW10gPSB7Ci0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAwICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAxICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAyICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDAzICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA0ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA1ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA2ICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDA3ICovCi0JICB7ICJiIiwJCTEsIH0sCS8qIDB4MDggKi8KLQkgIHsgImNhbGwiLAkJMSwgfSwJLyogMHgwOSAqLwotCSAgeyAicmV0IiwJCTAsIH0sCS8qIDB4MGEgKi8KLQkgIHsgImJhbCIsCQkxLCB9LAkvKiAweDBiICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBjICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBkICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBlICovCi0JICB7IE5VTEwsCQkwLCB9LAkvKiAweDBmICovCi0JICB7ICJibm8iLAkJMSwgfSwJLyogMHgxMCAqLwotCSAgeyAiYmciLAkJMSwgfSwJLyogMHgxMSAqLwotCSAgeyAiYmUiLAkJMSwgfSwJLyogMHgxMiAqLwotCSAgeyAiYmdlIiwJCTEsIH0sCS8qIDB4MTMgKi8KLQkgIHsgImJsIiwJCTEsIH0sCS8qIDB4MTQgKi8KLQkgIHsgImJuZSIsCQkxLCB9LAkvKiAweDE1ICovCi0JICB7ICJibGUiLAkJMSwgfSwJLyogMHgxNiAqLwotCSAgeyAiYm8iLAkJMSwgfSwJLyogMHgxNyAqLwotCSAgeyAiZmF1bHRubyIsCQkwLCB9LAkvKiAweDE4ICovCi0JICB7ICJmYXVsdGciLAkJMCwgfSwJLyogMHgxOSAqLwotCSAgeyAiZmF1bHRlIiwJCTAsIH0sCS8qIDB4MWEgKi8KLQkgIHsgImZhdWx0Z2UiLAkJMCwgfSwJLyogMHgxYiAqLwotCSAgeyAiZmF1bHRsIiwJCTAsIH0sCS8qIDB4MWMgKi8KLQkgIHsgImZhdWx0bmUiLAkJMCwgfSwJLyogMHgxZCAqLwotCSAgeyAiZmF1bHRsZSIsCQkwLCB9LAkvKiAweDFlICovCi0JICB7ICJmYXVsdG8iLAkJMCwgfSwJLyogMHgxZiAqLwotCX07Ci0KLQlpID0gKHdvcmQxID4+IDI0KSAmIDB4ZmY7Ci0JaWYgKCAoY3RybF90YWJbaV0ubmFtZSA9PSBOVUxMKSB8fCAoKHdvcmQxICYgMSkgIT0gMCkgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuOwotCX0KLQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgY3RybF90YWJbaV0ubmFtZSApOwotCWlmICggd29yZDEgJiAyICl7CQkvKiBQcmVkaWN0cyBicmFuY2ggbm90IHRha2VuICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgIi5mIiApOwotCX0KLQotCWlmICggY3RybF90YWJbaV0ubnVtb3BzID09IDEgKXsKLQkJLyogRVhUUkFDVCBESVNQTEFDRU1FTlQgQU5EIENPTlZFUlQgVE8gQUREUkVTUyAqLwotCQl3b3JkMSAmPSAweDAwZmZmZmZmOwotCQlpZiAoIHdvcmQxICYgMHgwMDgwMDAwMCApewkJLyogU2lnbiBiaXQgaXMgc2V0ICovCi0JCQl3b3JkMSB8PSAoLTEgJiB+MHhmZmZmZmYpOwkvKiBTaWduIGV4dGVuZCAqLwotCQl9Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0JCXByaW50X2FkZHIoIHdvcmQxICsgbWVtYWRkciApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBDT0JSIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY29iciggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0JaW50IHNyYzE7Ci0JaW50IHNyYzI7Ci0JaW50IGk7Ci0KLQlzdGF0aWMgY29uc3Qgc3RydWN0IHRhYmVudCBjb2JyX3RhYltdID0gewotCSAgeyAidGVzdG5vIiwJMSwgfSwJLyogMHgyMCAqLwotCSAgeyAidGVzdGciLAkxLCB9LAkvKiAweDIxICovCi0JICB7ICJ0ZXN0ZSIsCTEsIH0sCS8qIDB4MjIgKi8KLQkgIHsgInRlc3RnZSIsCTEsIH0sCS8qIDB4MjMgKi8KLQkgIHsgInRlc3RsIiwJMSwgfSwJLyogMHgyNCAqLwotCSAgeyAidGVzdG5lIiwJMSwgfSwJLyogMHgyNSAqLwotCSAgeyAidGVzdGxlIiwJMSwgfSwJLyogMHgyNiAqLwotCSAgeyAidGVzdG8iLAkxLCB9LAkvKiAweDI3ICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MjggKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyOSAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJhICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmIgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyYyAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJkICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmUgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyZiAqLwotCSAgeyAiYmJjIiwJMywgfSwJLyogMHgzMCAqLwotCSAgeyAiY21wb2JnIiwJMywgfSwJLyogMHgzMSAqLwotCSAgeyAiY21wb2JlIiwJMywgfSwJLyogMHgzMiAqLwotCSAgeyAiY21wb2JnZSIsCTMsIH0sCS8qIDB4MzMgKi8KLQkgIHsgImNtcG9ibCIsCTMsIH0sCS8qIDB4MzQgKi8KLQkgIHsgImNtcG9ibmUiLAkzLCB9LAkvKiAweDM1ICovCi0JICB7ICJjbXBvYmxlIiwJMywgfSwJLyogMHgzNiAqLwotCSAgeyAiYmJzIiwJMywgfSwJLyogMHgzNyAqLwotCSAgeyAiY21waWJubyIsCTMsIH0sCS8qIDB4MzggKi8KLQkgIHsgImNtcGliZyIsCTMsIH0sCS8qIDB4MzkgKi8KLQkgIHsgImNtcGliZSIsCTMsIH0sCS8qIDB4M2EgKi8KLQkgIHsgImNtcGliZ2UiLAkzLCB9LAkvKiAweDNiICovCi0JICB7ICJjbXBpYmwiLAkzLCB9LAkvKiAweDNjICovCi0JICB7ICJjbXBpYm5lIiwJMywgfSwJLyogMHgzZCAqLwotCSAgeyAiY21waWJsZSIsCTMsIH0sCS8qIDB4M2UgKi8KLQkgIHsgImNtcGlibyIsCTMsIH0sCS8qIDB4M2YgKi8KLQl9OwotCi0JaSA9ICgod29yZDEgPj4gMjQpICYgMHhmZikgLSAweDIwOwotCWlmICggY29icl90YWJbaV0ubmFtZSA9PSBOVUxMICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sIGNvYnJfdGFiW2ldLm5hbWUgKTsKLQlpZiAoIHdvcmQxICYgMiApewkJLyogUHJlZGljdHMgYnJhbmNoIG5vdCB0YWtlbiAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sICIuZiIgKTsKLQl9Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJcdCIgKTsKLQotCXNyYzEgPSAod29yZDEgPj4gMTkpICYgMHgxZjsKLQlzcmMyID0gKHdvcmQxID4+IDE0KSAmIDB4MWY7Ci0KLQlpZiAoIHdvcmQxICYgMHgwMjAwMCApewkJLyogTTEgaXMgMSAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVkIiwgc3JjMSApOwotCX0gZWxzZSB7CQkJLyogTTEgaXMgMCAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3NyYzFdICk7Ci0JfQotCi0JaWYgKCBjb2JyX3RhYltpXS5udW1vcHMgPiAxICl7Ci0JCWlmICggd29yZDEgJiAxICl7CQkvKiBTMiBpcyAxICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIixzZiVkLCIsIHNyYzIgKTsKLQkJfSBlbHNlIHsJCQkvKiBTMSBpcyAwICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwlcywiLCByZWdfbmFtZXNbc3JjMl0gKTsKLQkJfQotCi0JCS8qIEV4dHJhY3QgZGlzcGxhY2VtZW50IGFuZCBjb252ZXJ0IHRvIGFkZHJlc3MKLQkJICovCi0JCXdvcmQxICY9IDB4MDAwMDFmZmM7Ci0JCWlmICggd29yZDEgJiAweDAwMDAxMDAwICl7CS8qIE5lZ2F0aXZlIGRpc3BsYWNlbWVudCAqLwotCQkJd29yZDEgfD0gKC0xICYgfjB4MWZmZik7CS8qIFNpZ24gZXh0ZW5kICovCi0JCX0KLQkJcHJpbnRfYWRkciggbWVtYWRkciArIHdvcmQxICk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE1FTSBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAkJCQkvKiByZXR1cm5zIGluc3RydWN0aW9uIGxlbmd0aDogNCBvciA4ICovCi1tZW0oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiwgbm9wcmludCApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotICAgIGludCBub3ByaW50OwkJLyogSWYgVFJVRSwgcmV0dXJuIGluc3RydWN0aW9uIGxlbmd0aCwgYnV0Ci0JCQkJICogZG9uJ3Qgb3V0cHV0IGFueSB0ZXh0LgotCQkJCSAqLwotewotCWludCBpLCBqOwotCWludCBsZW47Ci0JaW50IG1vZGU7Ci0JaW50IG9mZnNldDsKLQljb25zdCBjaGFyICpyZWcxLCAqcmVnMiwgKnJlZzM7Ci0KLQkvKiBUaGlzIGxvb2t1cCB0YWJsZSBpcyB0b28gc3BhcnNlIHRvIG1ha2UgaXQgd29ydGggdHlwaW5nIGluLCBidXQgbm90Ci0JICAgc28gbGFyZ2UgYXMgdG8gbWFrZSBhIHNwYXJzZSBhcnJheSBuZWNlc3NhcnkuICBXZSBjcmVhdGUgdGhlIHRhYmxlCi0JICAgYXQgcnVudGltZS4gICovCi0KLQkvKgotCSAqIE5PVEU6IEluIHRoaXMgdGFibGUsIHRoZSBtZWFuaW5nIG9mICdudW1vcHMnIGlzOgotCSAqCSAxOiBzaW5nbGUgb3BlcmFuZAotCSAqCSAyOiAyIG9wZXJhbmRzLCBsb2FkIGluc3RydWN0aW9uCi0JICoJLTI6IDIgb3BlcmFuZHMsIHN0b3JlIGluc3RydWN0aW9uCi0JICovCi0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgKm1lbV90YWI7Ci0vKiBPcGNvZGVzIG9mIDB4OFgsIDlYLCBhWCwgYlgsIGFuZCBjWCBtdXN0IGJlIGluIHRoZSB0YWJsZS4gICovCi0jZGVmaW5lIE1FTV9NSU4JMHg4MAotI2RlZmluZSBNRU1fTUFYCTB4Y2YKLSNkZWZpbmUgTUVNX1NJWgkoICogc2l6ZW9mKHN0cnVjdCB0YWJlbnQpKQotCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyc2VfdGFiZW50IG1lbV9pbml0W10gPSB7Ci0JICB7IDB4ODAsCSJsZG9iIiwJIDIgfSwKLQkgIHsgMHg4MiwJInN0b2IiLAktMiB9LAotCSAgeyAweDg0LAkiYngiLAkgMSB9LAotCSAgeyAweDg1LAkiYmFseCIsCSAyIH0sCi0JICB7IDB4ODYsCSJjYWxseCIsIDEgfSwKLQkgIHsgMHg4OCwJImxkb3MiLAkgMiB9LAotCSAgeyAweDhhLAkic3RvcyIsCS0yIH0sCi0JICB7IDB4OGMsCSJsZGEiLAkgMiB9LAotCSAgeyAweDkwLAkibGQiLAkgMiB9LAotCSAgeyAweDkyLAkic3QiLAktMiB9LAotCSAgeyAweDk4LAkibGRsIiwJIDIgfSwKLQkgIHsgMHg5YSwJInN0bCIsCS0yIH0sCi0JICB7IDB4YTAsCSJsZHQiLAkgMiB9LAotCSAgeyAweGEyLAkic3R0IiwJLTIgfSwKLQkgIHsgMHhhYywJImRjaW52YSIsIDEgfSwKLQkgIHsgMHhiMCwJImxkcSIsCSAyIH0sCi0JICB7IDB4YjIsCSJzdHEiLAktMiB9LAotCSAgeyAweGMwLAkibGRpYiIsCSAyIH0sCi0JICB7IDB4YzIsCSJzdGliIiwJLTIgfSwKLQkgIHsgMHhjOCwJImxkaXMiLAkgMiB9LAotCSAgeyAweGNhLAkic3RpcyIsCS0yIH0sCi0JICB7IDAsCQlOVUxMLAkwIH0KLQl9OwotCXN0YXRpYyBzdHJ1Y3QgdGFiZW50IG1lbV90YWJfYnVmW01FTV9NQVggLSBNRU1fTUlOICsgMV07Ci0KLQlpZiAoIG1lbV90YWIgPT0gTlVMTCApewotCQltZW1fdGFiID0gbWVtX3RhYl9idWY7Ci0JCWZvciAoIGkgPSAwOyBtZW1faW5pdFtpXS5vcGNvZGUgIT0gMDsgaSsrICl7Ci0JCQlqID0gbWVtX2luaXRbaV0ub3Bjb2RlIC0gTUVNX01JTjsKLQkJCW1lbV90YWJbal0ubmFtZSA9IG1lbV9pbml0W2ldLm5hbWU7Ci0JCQltZW1fdGFiW2pdLm51bW9wcyA9IG1lbV9pbml0W2ldLm51bW9wczsKLQkJfQotCX0KLQotCWkgPSAoKHdvcmQxID4+IDI0KSAmIDB4ZmYpIC0gTUVNX01JTjsKLQltb2RlID0gKHdvcmQxID4+IDEwKSAmIDB4ZjsKLQotCWlmICggKG1lbV90YWJbaV0ubmFtZSAhPSBOVUxMKQkJLyogVmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLQkmJiAgICgobW9kZSA9PSA1KSB8fCAobW9kZSA+PTEyKSkgKXsJLyogV2l0aCAzMi1iaXQgZGlzcGxhY2VtZW50ICovCi0JCWxlbiA9IDg7Ci0JfSBlbHNlIHsKLQkJbGVuID0gNDsKLQl9Ci0KLQlpZiAoIG5vcHJpbnQgKXsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlpZiAoIChtZW1fdGFiW2ldLm5hbWUgPT0gTlVMTCkgfHwgKG1vZGUgPT0gNikgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVzXHQiLCBtZW1fdGFiW2ldLm5hbWUgKTsKLQotCXJlZzEgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxOSkgJiAweDFmIF07CS8qIE1FTUIgb25seSAqLwotCXJlZzIgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxNCkgJiAweDFmIF07Ci0JcmVnMyA9IHJlZ19uYW1lc1sgd29yZDEgJiAweDFmIF07CQkvKiBNRU1CIG9ubHkgKi8KLQlvZmZzZXQgPSB3b3JkMSAmIDB4ZmZmOwkJCQkvKiBNRU1BIG9ubHkgICovCi0KLQlzd2l0Y2ggKCBtZW1fdGFiW2ldLm51bW9wcyApewotCi0JY2FzZSAyOiAvKiBMT0FEIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSAmIDQgKXsJCQkvKiBNRU1CIEZPUk1BVCAqLwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7Ci0JCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOwotCQkJaWYgKG1vZGUgJiA4KSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQkJfQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIC0yOiAvKiBTVE9SRSBJTlNUUlVDVElPTiAqLwotCQlpZiAoIG1vZGUgJiA0ICl7CQkJLyogTUVNQiBGT1JNQVQgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJXMsIiwgcmVnMSApOwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQl9IGVsc2UgewkJCQkvKiBNRU1BIEZPUk1BVCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlcywweCV4IiwgcmVnMSwgKHVuc2lnbmVkKSBvZmZzZXQgKTsKLQkJCWlmIChtb2RlICYgOCkgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgMTogLyogQlgvQ0FMTFggSU5TVFJVQ1RJT04gKi8KLQkJaWYgKCBtb2RlICYgNCApewkJCS8qIE1FTUIgRk9STUFUICovCi0JCQllYSggbWVtYWRkciwgbW9kZSwgcmVnMiwgcmVnMywgd29yZDEsIHdvcmQyICk7Ci0JCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOwotCQkJaWYgKG1vZGUgJiA4KSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUkVHIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcmVnKCB3b3JkMSApCi0gICAgdW5zaWduZWQgbG9uZyB3b3JkMTsKLXsKLQlpbnQgaSwgajsKLQlpbnQgb3Bjb2RlOwotCWludCBmcDsKLQlpbnQgbTEsIG0yLCBtMzsKLQlpbnQgczEsIHMyOwotCWludCBzcmMsIHNyYzIsIGRzdDsKLQljaGFyICptbmVtcDsKLQotCS8qIFRoaXMgbG9va3VwIHRhYmxlIGlzIHRvbyBzcGFyc2UgdG8gbWFrZSBpdCB3b3J0aCB0eXBpbmcgaW4sIGJ1dCBub3QKLQkgICBzbyBsYXJnZSBhcyB0byBtYWtlIGEgc3BhcnNlIGFycmF5IG5lY2Vzc2FyeS4gIFdlIGNyZWF0ZSB0aGUgdGFibGUKLQkgICBhdCBydW50aW1lLiAgKi8KLQotCS8qCi0JICogTk9URTogSW4gdGhpcyB0YWJsZSwgdGhlIG1lYW5pbmcgb2YgJ251bW9wcycgaXM6Ci0JICoJIDE6IHNpbmdsZSBvcGVyYW5kLCB3aGljaCBpcyBOT1QgYSBkZXN0aW5hdGlvbi4KLQkgKgktMTogc2luZ2xlIG9wZXJhbmQsIHdoaWNoIElTIGEgZGVzdGluYXRpb24uCi0JICoJIDI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggaXMgTk9UIGEgZGVzdGluYXRpb24uCi0JICoJLTI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggSVMgYSBkZXN0aW5hdGlvbi4KLQkgKgkgMzogMyBvcGVyYW5kcwotCSAqCi0JICoJSWYgYW4gb3Bjb2RlIG1uZW1vbmljIGJlZ2lucyB3aXRoICJGIiwgaXQgaXMgYSBmbG9hdGluZy1wb2ludAotCSAqCW9wY29kZSAodGhlICJGIiBpcyBub3QgcHJpbnRlZCkuCi0JICovCi0KLQlzdGF0aWMgc3RydWN0IHRhYmVudCAqcmVnX3RhYjsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJzZV90YWJlbnQgcmVnX2luaXRbXSA9IHsKLSNkZWZpbmUgUkVHX01JTgkweDU4MAotCSAgeyAweDU4MCwJIm5vdGJpdCIsCTMgfSwKLQkgIHsgMHg1ODEsCSJhbmQiLAkJMyB9LAotCSAgeyAweDU4MiwJImFuZG5vdCIsCTMgfSwKLQkgIHsgMHg1ODMsCSJzZXRiaXQiLAkzIH0sCi0JICB7IDB4NTg0LAkibm90YW5kIiwJMyB9LAotCSAgeyAweDU4NiwJInhvciIsCQkzIH0sCi0JICB7IDB4NTg3LAkib3IiLAkJMyB9LAotCSAgeyAweDU4OCwJIm5vciIsCQkzIH0sCi0JICB7IDB4NTg5LAkieG5vciIsCQkzIH0sCi0JICB7IDB4NThhLAkibm90IiwJCS0yIH0sCi0JICB7IDB4NThiLAkib3Jub3QiLAkzIH0sCi0JICB7IDB4NThjLAkiY2xyYml0IiwJMyB9LAotCSAgeyAweDU4ZCwJIm5vdG9yIiwJMyB9LAotCSAgeyAweDU4ZSwJIm5hbmQiLAkJMyB9LAotCSAgeyAweDU4ZiwJImFsdGVyYml0IiwJMyB9LAotCSAgeyAweDU5MCwgCSJhZGRvIiwJCTMgfSwKLQkgIHsgMHg1OTEsIAkiYWRkaSIsCQkzIH0sCi0JICB7IDB4NTkyLCAJInN1Ym8iLAkJMyB9LAotCSAgeyAweDU5MywgCSJzdWJpIiwJCTMgfSwKLQkgIHsgMHg1OTQsCSJjbXBvYiIsCTIgfSwKLQkgIHsgMHg1OTUsCSJjbXBpYiIsCTIgfSwKLQkgIHsgMHg1OTYsCSJjbXBvcyIsCTIgfSwKLQkgIHsgMHg1OTcsCSJjbXBpcyIsCTIgfSwKLQkgIHsgMHg1OTgsIAkic2hybyIsCQkzIH0sCi0JICB7IDB4NTlhLCAJInNocmRpIiwJMyB9LAotCSAgeyAweDU5YiwgCSJzaHJpIiwJCTMgfSwKLQkgIHsgMHg1OWMsIAkic2hsbyIsCQkzIH0sCi0JICB7IDB4NTlkLCAJInJvdGF0ZSIsCTMgfSwKLQkgIHsgMHg1OWUsIAkic2hsaSIsCQkzIH0sCi0JICB7IDB4NWEwLCAJImNtcG8iLAkJMiB9LAotCSAgeyAweDVhMSwgCSJjbXBpIiwJCTIgfSwKLQkgIHsgMHg1YTIsIAkiY29uY21wbyIsCTIgfSwKLQkgIHsgMHg1YTMsIAkiY29uY21waSIsCTIgfSwKLQkgIHsgMHg1YTQsIAkiY21waW5jbyIsCTMgfSwKLQkgIHsgMHg1YTUsIAkiY21waW5jaSIsCTMgfSwKLQkgIHsgMHg1YTYsIAkiY21wZGVjbyIsCTMgfSwKLQkgIHsgMHg1YTcsIAkiY21wZGVjaSIsCTMgfSwKLQkgIHsgMHg1YWMsIAkic2NhbmJ5dGUiLAkyIH0sCi0JICB7IDB4NWFkLAkiYnN3YXAiLAktMiB9LAotCSAgeyAweDVhZSwgCSJjaGtiaXQiLAkyIH0sCi0JICB7IDB4NWIwLCAJImFkZGMiLAkJMyB9LAotCSAgeyAweDViMiwgCSJzdWJjIiwJCTMgfSwKLQkgIHsgMHg1YjQsCSJpbnRkaXMiLAkwIH0sCi0JICB7IDB4NWI1LAkiaW50ZW4iLAkwIH0sCi0JICB7IDB4NWNjLAkibW92IiwJCS0yIH0sCi0JICB7IDB4NWQ4LAkiZXNocm8iLAkzIH0sCi0JICB7IDB4NWRjLAkibW92bCIsCQktMiB9LAotCSAgeyAweDVlYywJIm1vdnQiLAkJLTIgfSwKLQkgIHsgMHg1ZmMsCSJtb3ZxIiwJCS0yIH0sCi0JICB7IDB4NjAwLAkic3lubW92IiwJMiB9LAotCSAgeyAweDYwMSwJInN5bm1vdmwiLAkyIH0sCi0JICB7IDB4NjAyLAkic3lubW92cSIsCTIgfSwKLQkgIHsgMHg2MDMsCSJjbXBzdHIiLAkzIH0sCi0JICB7IDB4NjA0LAkibW92cXN0ciIsCTMgfSwKLQkgIHsgMHg2MDUsCSJtb3ZzdHIiLAkzIH0sCi0JICB7IDB4NjEwLAkiYXRtb2QiLAkzIH0sCi0JICB7IDB4NjEyLAkiYXRhZGQiLAkzIH0sCi0JICB7IDB4NjEzLAkiaW5zcGFjYyIsCS0yIH0sCi0JICB7IDB4NjE0LAkibGRwaHkiLAktMiB9LAotCSAgeyAweDYxNSwJInN5bmxkIiwJLTIgfSwKLQkgIHsgMHg2MTcsCSJmaWxsIiwJCTMgfSwKLQkgIHsgMHg2MzAsCSJzZG1hIiwJCTMgfSwKLQkgIHsgMHg2MzEsCSJ1ZG1hIiwJCTAgfSwKLQkgIHsgMHg2NDAsCSJzcGFuYml0IiwJLTIgfSwKLQkgIHsgMHg2NDEsCSJzY2FuYml0IiwJLTIgfSwKLQkgIHsgMHg2NDIsCSJkYWRkYyIsCTMgfSwKLQkgIHsgMHg2NDMsCSJkc3ViYyIsCTMgfSwKLQkgIHsgMHg2NDQsCSJkbW92dCIsCS0yIH0sCi0JICB7IDB4NjQ1LAkibW9kYWMiLAkzIH0sCi0JICB7IDB4NjQ2LAkiY29uZHJlYyIsCS0yIH0sCi0JICB7IDB4NjUwLAkibW9kaWZ5IiwJMyB9LAotCSAgeyAweDY1MSwJImV4dHJhY3QiLAkzIH0sCi0JICB7IDB4NjU0LAkibW9kdGMiLAkzIH0sCi0JICB7IDB4NjU1LAkibW9kcGMiLAkzIH0sCi0JICB7IDB4NjU2LAkicmVjZWl2ZSIsCS0yIH0sCi0JICB7IDB4NjU4LAkiaW50Y3RsIiwJLTIgfSwKLQkgIHsgMHg2NTksCSJzeXNjdGwiLAkzIH0sCi0JICB7IDB4NjViLAkiaWNjdGwiLAkzIH0sCi0JICB7IDB4NjVjLAkiZGNjdGwiLAkzIH0sCi0JICB7IDB4NjVkLAkiaGFsdCIsCQkwIH0sCi0JICB7IDB4NjYwLAkiY2FsbHMiLAkxIH0sCi0JICB7IDB4NjYyLAkic2VuZCIsCQkzIH0sCi0JICB7IDB4NjYzLAkic2VuZHNlcnYiLAkxIH0sCi0JICB7IDB4NjY0LAkicmVzdW1wcmNzIiwJMSB9LAotCSAgeyAweDY2NSwJInNjaGVkcHJjcyIsCTEgfSwKLQkgIHsgMHg2NjYsCSJzYXZlcHJjcyIsCTAgfSwKLQkgIHsgMHg2NjgsCSJjb25kd2FpdCIsCTEgfSwKLQkgIHsgMHg2NjksCSJ3YWl0IiwJCTEgfSwKLQkgIHsgMHg2NmEsCSJzaWduYWwiLAkxIH0sCi0JICB7IDB4NjZiLAkibWFyayIsCQkwIH0sCi0JICB7IDB4NjZjLAkiZm1hcmsiLAkwIH0sCi0JICB7IDB4NjZkLAkiZmx1c2hyZWciLAkwIH0sCi0JICB7IDB4NjZmLAkic3luY2YiLAkwIH0sCi0JICB7IDB4NjcwLAkiZW11bCIsCQkzIH0sCi0JICB7IDB4NjcxLAkiZWRpdiIsCQkzIH0sCi0JICB7IDB4NjczLCAJImxkdGltZSIsCS0xIH0sCi0JICB7IDB4Njc0LAkiRmN2dGlyIiwJLTIgfSwKLQkgIHsgMHg2NzUsCSJGY3Z0aWxyIiwJLTIgfSwKLQkgIHsgMHg2NzYsCSJGc2NhbGVybCIsCTMgfSwKLQkgIHsgMHg2NzcsCSJGc2NhbGVyIiwJMyB9LAotCSAgeyAweDY4MCwJIkZhdGFuciIsCTMgfSwKLQkgIHsgMHg2ODEsCSJGbG9nZXByIiwJMyB9LAotCSAgeyAweDY4MiwJIkZsb2dyIiwJMyB9LAotCSAgeyAweDY4MywJIkZyZW1yIiwJMyB9LAotCSAgeyAweDY4NCwJIkZjbXBvciIsCTIgfSwKLQkgIHsgMHg2ODUsCSJGY21wciIsCTIgfSwKLQkgIHsgMHg2ODgsCSJGc3FydHIiLAktMiB9LAotCSAgeyAweDY4OSwJIkZleHByIiwJLTIgfSwKLQkgIHsgMHg2OGEsCSJGbG9nYm5yIiwJLTIgfSwKLQkgIHsgMHg2OGIsCSJGcm91bmRyIiwJLTIgfSwKLQkgIHsgMHg2OGMsCSJGc2luciIsCS0yIH0sCi0JICB7IDB4NjhkLAkiRmNvc3IiLAktMiB9LAotCSAgeyAweDY4ZSwJIkZ0YW5yIiwJLTIgfSwKLQkgIHsgMHg2OGYsCSJGY2xhc3NyIiwJMSB9LAotCSAgeyAweDY5MCwJIkZhdGFucmwiLAkzIH0sCi0JICB7IDB4NjkxLAkiRmxvZ2VwcmwiLAkzIH0sCi0JICB7IDB4NjkyLAkiRmxvZ3JsIiwJMyB9LAotCSAgeyAweDY5MywJIkZyZW1ybCIsCTMgfSwKLQkgIHsgMHg2OTQsCSJGY21wb3JsIiwJMiB9LAotCSAgeyAweDY5NSwJIkZjbXBybCIsCTIgfSwKLQkgIHsgMHg2OTgsCSJGc3FydHJsIiwJLTIgfSwKLQkgIHsgMHg2OTksCSJGZXhwcmwiLAktMiB9LAotCSAgeyAweDY5YSwJIkZsb2dibnJsIiwJLTIgfSwKLQkgIHsgMHg2OWIsCSJGcm91bmRybCIsCS0yIH0sCi0JICB7IDB4NjljLAkiRnNpbnJsIiwJLTIgfSwKLQkgIHsgMHg2OWQsCSJGY29zcmwiLAktMiB9LAotCSAgeyAweDY5ZSwJIkZ0YW5ybCIsCS0yIH0sCi0JICB7IDB4NjlmLAkiRmNsYXNzcmwiLAkxIH0sCi0JICB7IDB4NmMwLAkiRmN2dHJpIiwJLTIgfSwKLQkgIHsgMHg2YzEsCSJGY3Z0cmlsIiwJLTIgfSwKLQkgIHsgMHg2YzIsCSJGY3Z0enJpIiwJLTIgfSwKLQkgIHsgMHg2YzMsCSJGY3Z0enJpbCIsCS0yIH0sCi0JICB7IDB4NmM5LAkiRm1vdnIiLAktMiB9LAotCSAgeyAweDZkOSwJIkZtb3ZybCIsCS0yIH0sCi0JICB7IDB4NmUxLCAJIkZtb3ZyZSIsCS0yIH0sCi0JICB7IDB4NmUyLCAJIkZjcHlzcmUiLAkzIH0sCi0JICB7IDB4NmUzLCAJIkZjcHlyc3JlIiwJMyB9LAotCSAgeyAweDcwMSwJIm11bG8iLAkJMyB9LAotCSAgeyAweDcwOCwJInJlbW8iLAkJMyB9LAotCSAgeyAweDcwYiwJImRpdm8iLAkJMyB9LAotCSAgeyAweDc0MSwJIm11bGkiLAkJMyB9LAotCSAgeyAweDc0OCwJInJlbWkiLAkJMyB9LAotCSAgeyAweDc0OSwJIm1vZGkiLAkJMyB9LAotCSAgeyAweDc0YiwJImRpdmkiLAkJMyB9LAotCSAgeyAweDc4MCwJImFkZG9ubyIsCTMgfSwKLQkgIHsgMHg3ODEsCSJhZGRpbm8iLAkzIH0sCi0JICB7IDB4NzgyLAkic3Vib25vIiwJMyB9LAotCSAgeyAweDc4MywJInN1YmlubyIsCTMgfSwKLQkgIHsgMHg3ODQsCSJzZWxubyIsCTMgfSwKLQkgIHsgMHg3OGIsCSJGZGl2ciIsCTMgfSwKLQkgIHsgMHg3OGMsCSJGbXVsciIsCTMgfSwKLQkgIHsgMHg3OGQsCSJGc3ViciIsCTMgfSwKLQkgIHsgMHg3OGYsCSJGYWRkciIsCTMgfSwKLQkgIHsgMHg3OTAsCSJhZGRvZyIsCTMgfSwKLQkgIHsgMHg3OTEsCSJhZGRpZyIsICAgICAgICAzIH0sCi0JICB7IDB4NzkyLAkic3Vib2ciLAkzIH0sCi0JICB7IDB4NzkzLAkic3ViaWciLAkzIH0sCi0JICB7IDB4Nzk0LAkic2VsZyIsCQkzIH0sCi0JICB7IDB4NzliLAkiRmRpdnJsIiwJMyB9LAotCSAgeyAweDc5YywJIkZtdWxybCIsCTMgfSwKLQkgIHsgMHg3OWQsCSJGc3VicmwiLAkzIH0sCi0JICB7IDB4NzlmLAkiRmFkZHJsIiwJMyB9LAotCSAgeyAweDdhMCwJImFkZG9lIiwJMyB9LAotCSAgeyAweDdhMSwJImFkZGllIiwgICAgICAgIDMgfSwKLQkgIHsgMHg3YTIsCSJzdWJvZSIsCTMgfSwKLQkgIHsgMHg3YTMsCSJzdWJpZSIsCTMgfSwKLQkgIHsgMHg3YTQsCSJzZWxlIiwJCTMgfSwKLQkgIHsgMHg3YjAsCSJhZGRvZ2UiLAkzIH0sCi0JICB7IDB4N2IxLAkiYWRkaWdlIiwJMyB9LAotCSAgeyAweDdiMiwJInN1Ym9nZSIsCTMgfSwKLQkgIHsgMHg3YjMsCSJzdWJpZ2UiLAkzIH0sCi0JICB7IDB4N2I0LAkic2VsZ2UiLAkzIH0sCi0JICB7IDB4N2MwLAkiYWRkb2wiLAkzIH0sCi0JICB7IDB4N2MxLAkiYWRkaWwiLAkzIH0sCi0JICB7IDB4N2MyLAkic3Vib2wiLAkzIH0sCi0JICB7IDB4N2MzLAkic3ViaWwiLAkzIH0sCi0JICB7IDB4N2M0LAkic2VsbCIsCQkzIH0sCi0JICB7IDB4N2QwLAkiYWRkb25lIiwJMyB9LAotCSAgeyAweDdkMSwJImFkZGluZSIsCTMgfSwKLQkgIHsgMHg3ZDIsCSJzdWJvbmUiLAkzIH0sCi0JICB7IDB4N2QzLAkic3ViaW5lIiwJMyB9LAotCSAgeyAweDdkNCwJInNlbG5lIiwJMyB9LAotCSAgeyAweDdlMCwJImFkZG9sZSIsCTMgfSwKLQkgIHsgMHg3ZTEsCSJhZGRpbGUiLAkzIH0sCi0JICB7IDB4N2UyLAkic3Vib2xlIiwJMyB9LAotCSAgeyAweDdlMywJInN1YmlsZSIsCTMgfSwKLQkgIHsgMHg3ZTQsCSJzZWxsZSIsCTMgfSwKLQkgIHsgMHg3ZjAsCSJhZGRvbyIsCTMgfSwKLQkgIHsgMHg3ZjEsCSJhZGRpbyIsCTMgfSwKLQkgIHsgMHg3ZjIsCSJzdWJvbyIsCTMgfSwKLQkgIHsgMHg3ZjMsCSJzdWJpbyIsCTMgfSwKLQkgIHsgMHg3ZjQsCSJzZWxvIiwJCTMgfSwKLSNkZWZpbmUgUkVHX01BWCAweDdmNAotCSAgeyAwLAkJTlVMTCwJCTAgfQotCX07Ci0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgcmVnX3RhYl9idWZbUkVHX01BWCAtIFJFR19NSU4gKyAxXTsKLQotCWlmICggcmVnX3RhYiA9PSBOVUxMICl7Ci0JCXJlZ190YWIgPSByZWdfdGFiX2J1ZjsKLQkJZm9yICggaSA9IDA7IHJlZ19pbml0W2ldLm9wY29kZSAhPSAwOyBpKysgKXsKLQkJCWogPSByZWdfaW5pdFtpXS5vcGNvZGUgLSBSRUdfTUlOOwotCQkJcmVnX3RhYltqXS5uYW1lID0gcmVnX2luaXRbaV0ubmFtZTsKLQkJCXJlZ190YWJbal0ubnVtb3BzID0gcmVnX2luaXRbaV0ubnVtb3BzOwotCQl9Ci0JfQotCi0Jb3Bjb2RlID0gKCh3b3JkMSA+PiAyMCkgJiAweGZmMCkgfCAoKHdvcmQxID4+IDcpICYgMHhmKTsKLQlpID0gb3Bjb2RlIC0gUkVHX01JTjsKLQotCWlmICggKG9wY29kZTxSRUdfTUlOKSB8fCAob3Bjb2RlPlJFR19NQVgpIHx8IChyZWdfdGFiW2ldLm5hbWU9PU5VTEwpICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQltbmVtcCA9IHJlZ190YWJbaV0ubmFtZTsKLQlpZiAoICptbmVtcCA9PSAnRicgKXsKLQkJZnAgPSAxOwotCQltbmVtcCsrOwotCX0gZWxzZSB7Ci0JCWZwID0gMDsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgbW5lbXAgKTsKLQotCXMxICAgPSAod29yZDEgPj4gNSkgICYgMTsKLQlzMiAgID0gKHdvcmQxID4+IDYpICAmIDE7Ci0JbTEgICA9ICh3b3JkMSA+PiAxMSkgJiAxOwotCW0yICAgPSAod29yZDEgPj4gMTIpICYgMTsKLQltMyAgID0gKHdvcmQxID4+IDEzKSAmIDE7Ci0Jc3JjICA9ICB3b3JkMSAgICAgICAgJiAweDFmOwotCXNyYzIgPSAod29yZDEgPj4gMTQpICYgMHgxZjsKLQlkc3QgID0gKHdvcmQxID4+IDE5KSAmIDB4MWY7Ci0KLQlpZiAgKCByZWdfdGFiW2ldLm51bW9wcyAhPSAwICl7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0KLQkJc3dpdGNoICggcmVnX3RhYltpXS5udW1vcHMgKXsKLQkJY2FzZSAxOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgLTE6Ci0JCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgLTI6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJZHN0b3AoIG0zLCBkc3QsIGZwICk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotCi0vKgotICogUHJpbnQgb3V0IGVmZmVjdGl2ZSBhZGRyZXNzIGZvciBtZW1iIGluc3RydWN0aW9ucy4KLSAqLwotc3RhdGljIHZvaWQKLWVhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGludCBtb2RlOwotICAgICBjaGFyICpyZWcyLCAqcmVnMzsKLSAgICAgaW50IHdvcmQxOwotICAgICB1bnNpZ25lZCBpbnQgd29yZDI7Ci17Ci0JaW50IHNjYWxlOwotCXN0YXRpYyBjb25zdCBpbnQgc2NhbGVfdGFiW10gPSB7IDEsIDIsIDQsIDgsIDE2IH07Ci0KLQlzY2FsZSA9ICh3b3JkMSA+PiA3KSAmIDB4MDc7Ci0JaWYgKCAoc2NhbGUgPiA0KSB8fCAoKCh3b3JkMSA+PiA1KSAmIDB4MDMpICE9IDApICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0Jc2NhbGUgPSBzY2FsZV90YWJbc2NhbGVdOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSA0OgkgCQkJCQkvKiAocmVnKSAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCWJyZWFrOwotCWNhc2UgNToJCQkJCQkvKiBkaXNwbCs4KGlwKSAqLwotCQlwcmludF9hZGRyKCB3b3JkMis4K21lbWFkZHIgKTsKLQkJYnJlYWs7Ci0JY2FzZSA3OgkJCQkJCS8qIChyZWcpW2luZGV4KnNjYWxlXSAqLwotCQlpZiAoc2NhbGUgPT0gMSkgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpWyVzXSIsIHJlZzIsIHJlZzMgKTsKLQkJfSBlbHNlIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslcyolZF0iLHJlZzIscmVnMyxzY2FsZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAxMjoJCQkJCS8qIGRpc3BsYWNlbWVudCAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQlicmVhazsKLQljYXNlIDEzOgkJCQkJLyogZGlzcGwocmVnKSAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCWJyZWFrOwotCWNhc2UgMTQ6CQkJCQkvKiBkaXNwbFtpbmRleCpzY2FsZV0gKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzXSIsIHJlZzMgKTsKLQkJfSBlbHNlIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzKiVkXSIsIHJlZzMsIHNjYWxlICk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAxNToJCQkJLyogZGlzcGwocmVnKVtpbmRleCpzY2FsZV0gKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslc10iLCByZWcyLCByZWczICk7Ci0JCX0gZWxzZSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXMqJWRdIixyZWcyLHJlZzMsc2NhbGUgKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSZWdpc3RlciBJbnN0cnVjdGlvbiBPcGVyYW5kICAJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXJlZ29wKCBtb2RlLCBzcGVjLCByZWcsIGZwICkKLSAgICBpbnQgbW9kZSwgc3BlYywgcmVnLCBmcDsKLXsKLQlpZiAoIGZwICl7CQkJCS8qIEZMT0FUSU5HIFBPSU5UIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSA9PSAxICl7CQkJLyogRlAgb3BlcmFuZCAqLwotCQkJc3dpdGNoICggcmVnICl7Ci0JCQljYXNlIDA6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMCIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMSIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDI6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMiIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDM6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMyIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE2OiAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjBmMC4wIiApOwotCQkJICBicmVhazsKLQkJCWNhc2UgMjI6ICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiMGYxLjAiICk7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDogKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICI/IiApOwotCQkJICBicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsJCQkJLyogTm9uLUZQIHJlZ2lzdGVyICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3JlZ10gKTsKLQkJfQotCX0gZWxzZSB7CQkJCS8qIE5PVCBGTE9BVElORyBQT0lOVCAqLwotCQlpZiAoIG1vZGUgPT0gMSApewkJCS8qIExpdGVyYWwgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJWQiLCByZWcgKTsKLQkJfSBlbHNlIHsJCQkJLyogUmVnaXN0ZXIgKi8KLQkJCWlmICggc3BlYyA9PSAwICl7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIHJlZ19uYW1lc1tyZWddICk7Ci0JCQl9IGVsc2UgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAic2YlZCIsIHJlZyApOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUmVnaXN0ZXIgSW5zdHJ1Y3Rpb24gRGVzdGluYXRpb24gT3BlcmFuZAkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1kc3RvcCggbW9kZSwgcmVnLCBmcCApCi0gICAgaW50IG1vZGUsIHJlZywgZnA7Ci17Ci0JLyogJ2RzdCcgb3BlcmFuZCBjYW4ndCBiZSBhIGxpdGVyYWwuIE9uIG5vbi1GUCBpbnN0cnVjdGlvbnMsICByZWdpc3RlcgotCSAqIG1vZGUgaXMgYXNzdW1lZCBhbmQgIm0zIiBhY3RzIGFzIGlmIHdlcmUgInMzIjsgIG9uIEZQLWluc3RydWN0aW9ucywKLQkgKiBzZiByZWdpc3RlcnMgYXJlIG5vdCBhbGxvd2VkIHNvIG0zIGFjdHMgbm9ybWFsbHkuCi0JICovCi0JIGlmICggZnAgKXsKLQkJcmVnb3AoIG1vZGUsIDAsIHJlZywgZnAgKTsKLQkgfSBlbHNlIHsKLQkJcmVnb3AoIDAsIG1vZGUsIHJlZywgZnAgKTsKLQkgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1pbnZhbGlkKCB3b3JkMSApCi0gICAgaW50IHdvcmQxOwotewotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLndvcmRcdDB4JTA4eCIsICh1bnNpZ25lZCkgd29yZDEgKTsKLX0JCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyKGEpCi1iZmRfdm1hIGE7Ci17Ci0gICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYSwgaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdXRfYWJzKCB3b3JkMSwgd29yZDIgKQotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotI2lmZGVmIElOX0dEQgotCXJldHVybjsKLSNlbHNlCi0JaW50IGxlbjsKLQotCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKLQljYXNlIDB4ODoKLQljYXNlIDB4OToKLQljYXNlIDB4YToKLQljYXNlIDB4YjoKLQljYXNlIDB4YzoKLQkJLyogTUVNIGZvcm1hdCBpbnN0cnVjdGlvbiAqLwotCQlsZW4gPSBtZW0oIDAsIHdvcmQxLCB3b3JkMiwgMSApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSA0OwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIGxlbiA9PSA4ICl7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJTA4eCAlMDh4XHQiLCB3b3JkMSwgd29yZDIgKTsKLQl9IGVsc2UgewotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiUwOHggICAgICAgICBcdCIsIHdvcmQxICk7Ci0JfQotOwotCi0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMjAwLWRpcy5jIGIvb3Bjb2Rlcy9tMTAyMDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmM3ZTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMTAyMDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgTU4xMDIwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMjAwLmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIHZvaWQgZGlzYXNzZW1ibGUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKLQkJCQkgdW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBsb25nLAotCQkJCSB1bnNpZ25lZCBpbnQpKTsKLQotaW50IAotcHJpbnRfaW5zbl9tbjEwMjAwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gPSAwOwotICB1bnNpZ25lZCBpbnQgY29uc3VtZTsKLQotICAvKiBGaXJzdCBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIG9wY29kZSBpcy4gICovCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaW5zbiA9ICoodW5zaWduZWQgY2hhciAqKSBidWZmZXI7Ci0KLSAgLyogVGhlc2UgYXJlIG9uZSBieXRlIGluc25zLiAgKi8KLSAgaWYgKChpbnNuICYgMHhmMCkgPT0gMHgwMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDEwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MjAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHgzMAotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4OTAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhhMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweGIwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZWIKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNgotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZlCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmYpCi0gICAgewotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSAxOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdHdvIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4NDAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NjAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NzAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDgKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZTAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZTQKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZTgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZTkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZWEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjIKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjMpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gMjsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMgd2l0aCBhIDE2Yml0IG9wZXJhbmQgaW4gbGl0dGxlCi0gICAgIGVuZGlhbiBmb3JtLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGYwKSA9PSAweGMwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGRjCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGVjCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY4Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY5Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZiCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZjCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZkKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPDw9IDE2OwotICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSAzOwotICAgIH0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMgdG9vLCBidXQgd2UgZG9uJ3QgaGF2ZSB0byBtZXNzIHdpdGgKLSAgICAgZW5kaWFubmVzcyBzdHVmZi4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIDw8PSAxNjsKLSAgICAgIGluc24gfD0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBjb25zdW1lID0gMzsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZvdXIgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgaW5zbiA8PD0gMTY7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgY29uc3VtZSA9IDQ7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBmaXZlIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjQpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDE2OwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNCwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICgqKHVuc2lnbmVkIGNoYXIgKilidWZmZXIgPDwgOCkgJiAweGZmMDA7Ci0KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAzLCBidWZmZXIsIDEsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gfD0gKCoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcikgJiAweGZmOwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBleHRlbnNpb24gPSAoKih1bnNpZ25lZCBjaGFyICopYnVmZmVyKSAmIDB4ZmY7Ci0gICAgICBjb25zdW1lID0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDJ4IiksIGluc24pOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuLCBleHRlbnNpb24sIGNvbnN1bWUpOwotCi0gIHJldHVybiBjb25zdW1lOwotfQotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIGV4dGVuc2lvbiwgc2l6ZSkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIGV4dGVuc2lvbjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3AgPSAoc3RydWN0IG1uMTAyMDBfb3Bjb2RlICopbW4xMDIwMF9vcGNvZGVzOwotICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotICBpbnQgbWF0Y2ggPSAwOwotCi0gIC8qIEZpbmQgdGhlIG9wY29kZS4gICovCi0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpbnQgbXlzaXplLCBleHRyYV9zaGlmdDsKLQotICAgICAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzEpCi0JbXlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzIKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNCkKLQlteXNpemUgPSAyOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMwotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF81KQotCW15c2l6ZSA9IDM7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF82KQotCW15c2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF83KQotCW15c2l6ZSA9IDU7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0JCi0gICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMiB8fCBvcC0+Zm9ybWF0ID09IEZNVF81KQotCWV4dHJhX3NoaWZ0ID0gODsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzMKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNgotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF83KQotCWV4dHJhX3NoaWZ0ID0gMTY7Ci0gICAgICBlbHNlCi0JZXh0cmFfc2hpZnQgPSAwOwotCi0gICAgICBpZiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZQotCSAgJiYgc2l6ZSA9PSAodW5zaWduZWQgaW50KSBteXNpemUpCi0JewotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0JICB1bnNpZ25lZCBpbnQgbm9jb21tYTsKLQkgIGludCBwYXJlbiA9IDA7Ci0JICAKLQkgIG1hdGNoID0gMTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsKLQotCSAgLyogTm93IHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBub2NvbW1hID0gMTsKLQkgICAgICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgICAgIG9waW5kZXhfcHRyKyspCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0JICAgICAgb3BlcmFuZCA9ICZtbjEwMjAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoaW5zbiAmIDB4ZmZmZikgPDwgODsKLQkJICB2YWx1ZSB8PSBleHRlbnNpb247Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQpKQotCQkJICAgJiAoKDFMIDw8IG9wZXJhbmQtPmJpdHMpIC0gMUwpKTsKLQkJfQotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JCXZhbHVlID0gKChsb25nKSh2YWx1ZSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkKLQkJCSAgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpOwotCi0JICAgICAgaWYgKCFub2NvbW1hCi0JCSAgJiYgKCFwYXJlbgotCQkgICAgICB8fCAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BBUkVOKSA9PSAwKSkpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCi0JICAgICAgbm9jb21tYSA9IDA7Ci0JCQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfRFJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZCVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfQVJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYSVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUFNXKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInBzdyIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX01EUikgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJtZHIiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQVJFTikgIT0gMCkKLQkJewotCQkgIGlmIChwYXJlbikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JCSAgICAgIG5vY29tbWEgPSAxOwotCQkgICAgfQotCQkgIHBhcmVuID0gIXBhcmVuOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUENSRUwpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKHZhbHVlICsgbWVtYWRkciArIG15c2l6ZSkgJiAweGZmZmZmZiwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTUVNQUREUikgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIAotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLQkgICAgfQotCSAgLyogQWxsIGRvbmUuICovCi0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgIHsKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDRseCIpLCBpbnNuKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDIwMC1vcGMuYyBiL29wY29kZXMvbTEwMjAwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjcwYjkwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMjAwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qIEFzc2VtYmxlIE1hdHN1c2hpdGEgTU4xMDIwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMjAwLmgiCi0KLQwKLWNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgbW4xMDIwMF9vcGVyYW5kc1tdID0gewotI2RlZmluZSBVTlVTRUQJMAotICB7MCwgMCwgMH0sIAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMCAgICAgIChVTlVTRUQrMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4xICAgICAgKEROMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMCAgICAgIChETjErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE0xICAgICAgKERNMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMCAgICAgIChETTErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4xICAgICAgKEFOMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMCAgICAgIChBTjErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0xICAgICAgKEFNMCsxKQotICB7MiwgMiwgTU4xMDIwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NOCAgICAoQU0xKzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAzMmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTYgICAgKElNTTgrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBwYy1yZWxhdGl2ZSBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgcGMtcmVsYXRpdmUgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTZfUENSRUwgICAgKElNTTE2KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1JFTEFYIHwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDE2Yml0IHVuc2lnbmVkIGRpc3BhY2VtZW50IGluIGEgbWVtb3J5IG9wZXJhdGlvbiB3aGljaAotICAgbWF5IHByb21vdGUgdG8gYSAzMmJpdCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBJTU0xNl9NRU0gICAgKElNTTE2X1BDUkVMKzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMjAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDI0IGltbWVkaWF0ZSwgbG93IDE2IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDggaW4gdGhlIGV4dGVuc2lvbiB3b3JkLiAgKi8KLQotI2RlZmluZSBJTU0yNCAgICAoSU1NMTZfTUVNKzEpCi0gIHsyNCwgMCwgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEfSwKLQotLyogMzJiaXQgcGMtcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMjRfUENSRUwgICAgKElNTTI0KzEpCi0gIHsyNCwgMCwgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDMyYml0IG1lbW9yeSBvZmZzZXQuICAqLwotI2RlZmluZSBJTU0yNF9NRU0gICAgKElNTTI0X1BDUkVMKzEpCi0gIHsyNCwgMCwgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDIwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiBQcm9jZXNzb3Igc3RhdHVzIHdvcmQuICAqLwotI2RlZmluZSBQU1cgICAgKElNTTI0X01FTSsxKQotICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BTV30sCi0KLS8qIE1EUiByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1EUiAgICAoUFNXKzEpCi0gIHswLCAwLCBNTjEwMjAwX09QRVJBTkRfTURSfSwKLQotLyogSW5kZXggcmVnaXN0ZXIuICAqLwotI2RlZmluZSBESSAoTURSKzEpCi0gIHsyLCA0LCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBkaXNwYWNlbWVudC4gICovCi0jZGVmaW5lIFNEOCAgICAoREkrMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAzMmJpdCBkaXNwYWNlbWVudC4gICovCi0jZGVmaW5lIFNEMTYgICAgKFNEOCsxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDggYml0IHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIFNEOE5fUENSRUwgICAgKFNEMTYrMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUENSRUwgfCBNTjEwMjAwX09QRVJBTkRfUkVMQVh9LAotCi0vKiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NOCAgICAoU0Q4Tl9QQ1JFTCsxKQotICB7OCwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gMzJiaXQgIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIFNJTU0xNiAgICAoU0lNTTgrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgbm90IHByb21vdGUuICAqLwotI2RlZmluZSBTSU1NMTZOICAgIChTSU1NMTYrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0t9LAotCi0vKiBFaXRoZXIgYW4gb3BlbiBwYXJlbiBvciBjbG9zZSBwYXJlbi4gICovCi0jZGVmaW5lIFBBUkVOCShTSU1NMTZOKzEpCi0gIHswLCAwLCBNTjEwMjAwX09QRVJBTkRfUEFSRU59LCAKLQotLyogZG4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEROMDEgICAgIChQQVJFTisxKQotICB7MiwgMCwgTU4xMDIwMF9PUEVSQU5EX0RSRUcgfCBNTjEwMjAwX09QRVJBTkRfUkVQRUFURUR9LAotCi0vKiBhbiByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVnaXN0ZXIgcG9zaXRpb25zLiAgKi8KLSNkZWZpbmUgQU4wMSAgICAgKEROMDErMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9BUkVHIHwgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLX0gOyAKLQotI2RlZmluZSBNRU0oQUREUikgUEFSRU4sIEFERFIsIFBBUkVOIAotI2RlZmluZSBNRU0yKEFERFIxLEFERFIyKSBQQVJFTiwgQUREUjEsIEFERFIyLCBQQVJFTiAKLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkJT1BDT0RFCQlNQVNLCQl7IE9QRVJBTkRTIH0KLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBPUEVSQU5EUyBpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLQotICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKLSAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCi0gICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCi0gICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLiAgKi8KLQotY29uc3Qgc3RydWN0IG1uMTAyMDBfb3Bjb2RlIG1uMTAyMDBfb3Bjb2Rlc1tdID0gewoteyAibW92IiwJMHg4MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtTSU1NOCwgRE4wMX19LAoteyAibW92IiwJMHg4MCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCi17ICJtb3YiLAkweGYyMzAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCi17ICJtb3YiLAkweGYyZjAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJtb3YiLAkweGYyNzAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJtb3YiLAkweGYzZjAsCQkweGZmZmMsCQlGTVRfNCwge1BTVywgRE4wfX0sCi17ICJtb3YiLAkweGYzZDAsCQkweGZmZjMsCQlGTVRfNCwge0ROMSwgUFNXfX0sCi17ICJtb3YiLAkweGYzZTAsCQkweGZmZmMsCQlGTVRfNCwge01EUiwgRE4wfX0sCi17ICJtb3YiLAkweGYzYzAsCQkweGZmZjMsCQlGTVRfNCwge0ROMSwgTURSfX0sCi17ICJtb3YiLAkweDIwLAkJMHhmMCwJCUZNVF8xLCB7TUVNKEFOMSksIERNMH19LAoteyAibW92IiwJMHg2MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGY3YzAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGY0ODAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGYxNDAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoteyAibW92IiwJMHhjODAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjRjMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEROMH19LAoteyAibW92IiwJMHg3MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtNRU0yKFNEOCxBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4NzAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNKEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmN2IwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmNGYwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmMTAwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjczMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7TUVNKElNTTE2X01FTSksIEFOMH19LAoteyAibW92IiwJMHhmNGQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtNRU0oSU1NMjRfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweDAwLAkJMHhmMCwJCUZNVF8xLCB7RE0wLCBNRU0oQU4xKX19LAoteyAibW92IiwJMHg0MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3YiLAkweGY3ODAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0RNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3YiLAkweGY0MDAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge0RNMCwgTUVNMihJTU0yNCwgQU4xKX19LAoteyAibW92IiwJMHhmMWMwLAkJMHhmZmMwLAkJRk1UXzQsIHtETTAsIE1FTTIoREksIEFOMSl9fSwKLXsgIm1vdiIsCTB4YzAwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtETjAsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweGY0NDAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0ROMCwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdiIsCTB4NTAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7QU0wLCBNRU0yKFNEOCwgQU4xKX19LAoteyAibW92IiwJMHg1MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtBTTAsIE1FTShBTjEpfX0sCi17ICJtb3YiLAkweGY3YTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0FNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3YiLAkweGY0MTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge0FNMCwgTUVNMihJTU0yNCxBTjEpfX0sCi17ICJtb3YiLAkweGYxODAsCQkweGZmYzAsCQlGTVRfNCwge0FNMCwgTUVNMihESSwgQU4xKX19LAoteyAibW92IiwJMHhmNzIwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtBTjAsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweGY0NTAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0FOMCwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdiIsCTB4ZjgwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtTSU1NMTYsIEROMH19LAoteyAibW92IiwJMHhmNDcwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJtb3YiLAkweGRjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7SU1NMTYsIEFOMH19LAoteyAibW92IiwJMHhmNDc0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi0KLXsgIm1vdngiLAkweGY1NzAwMCwJMHhmZmYwMDAsCUZNVF81LCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92eCIsCTB4Zjc3MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdngiLAkweGY0YjAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3Z4IiwJMHhmNTUwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge0RNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdngiLAkweGY3NjAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0RNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3Z4IiwJMHhmNDMwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKLQoteyAibW92YiIsCTB4ZjUyMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3ZiIiwJMHhmN2QwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjRhMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGYwNDAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjRjNDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEROMH19LAoteyAibW92YiIsCTB4MTAsCQkweGYwLAkJRk1UXzEsIHtETTAsIE1FTShBTjEpfX0sCi17ICJtb3ZiIiwJMHhmNTEwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge0RNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdmIiLAkweGY3OTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge0RNMCwgTUVNMihTRDE2LCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhmNDIwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKLXsgIm1vdmIiLAkweGYwYzAsCQkweGZmYzAsCQlGTVRfNCwge0RNMCwgTUVNMihESSwgQU4xKX19LAoteyAibW92YiIsCTB4YzQwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtETjAsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3ZiIiwJMHhmNDQ0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtETjAsIE1FTShJTU0yNF9NRU0pfX0sCi0KLXsgIm1vdmJ1IiwJMHgzMCwJCTB4ZjAsCQlGTVRfMSwge01FTShBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmNTMwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge01FTTIoU0Q4LCBBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmNzUwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGY0OTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4ZjA4MCwJCTB4ZmZjMCwJCUZNVF80LCB7TUVNMihESSwgQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4Y2MwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZjRjODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEROMH19LAotCi17ICJleHQiLAkweGYzYzEsCQkweGZmZjMsCQlGTVRfNCwge0ROMX19LAoteyAiZXh0eCIsCTB4YjAsIAkJMHhmYywJCUZNVF8xLCB7RE4wfX0sCi17ICJleHR4dSIsCTB4YjQsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLXsgImV4dHhiIiwJMHhiOCwJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAoteyAiZXh0eGJ1IiwJMHhiYywJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAotCi17ICJhZGQiLAkweDkwLAkJMHhmMCwJCUZNVF8xLCB7RE4xLCBETTB9fSwKLXsgImFkZCIsCTB4ZjIwMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0xLCBBTjB9fSwKLXsgImFkZCIsCTB4ZjJjMCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBETTB9fSwKLXsgImFkZCIsCTB4ZjI0MCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBBTTB9fSwKLXsgImFkZCIsCTB4ZDQwMCwJCTB4ZmMwMCwJCUZNVF8yLCB7U0lNTTgsIEROMH19LAoteyAiYWRkIiwJMHhmNzE4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTYsIEROMH19LAoteyAiYWRkIiwJMHhmNDYwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJhZGQiLAkweGQwMDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBBTjB9fSwKLXsgImFkZCIsCTB4ZjcwODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBBTjB9fSwKLXsgImFkZCIsCTB4ZjQ2NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAoteyAiYWRkYyIsCTB4ZjI4MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgImFkZG5mIiwJMHhmNTBjMDAsCTB4ZmZmYzAwLAlGTVRfNSwge1NJTU04LCBBTjB9fSwKLQoteyAic3ViIiwJMHhhMCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCi17ICJzdWIiLAkweGYyMTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgQU4wfX0sCi17ICJzdWIiLAkweGYyZDAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJzdWIiLAkweGYyNTAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJzdWIiLAkweGY3MWMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge0lNTTE2LCBETjB9fSwKLXsgInN1YiIsCTB4ZjQ2ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAic3ViIiwJMHhmNzBjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtJTU0xNiwgQU4wfX0sCi17ICJzdWIiLAkweGY0NmMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBBTjB9fSwKLXsgInN1YmMiLAkweGYyOTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi0KLXsgIm11bCIsCTB4ZjM0MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgIm11bHUiLAkweGYzNTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi0KLXsgImRpdnUiLAkweGYzNjAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi0KLXsgImNtcCIsCTB4ZjM5MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgImNtcCIsCTB4ZjIyMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0xLCBBTjB9fSwKLXsgImNtcCIsCTB4ZjJlMCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBETTB9fSwKLXsgImNtcCIsCTB4ZjI2MCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBBTTB9fSwKLXsgImNtcCIsCTB4ZDgwMCwJCTB4ZmMwMCwJCUZNVF8yLCB7U0lNTTgsIEROMH19LAoteyAiY21wIiwJMHhmNzQ4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTYsIEROMH19LAoteyAiY21wIiwJMHhmNDc4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJjbXAiLAkweGVjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7SU1NMTYsIEFOMH19LAoteyAiY21wIiwJMHhmNDdjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi0KLXsgImFuZCIsCTB4ZjMwMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgImFuZCIsCTB4ZjUwMDAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKLXsgImFuZCIsCTB4ZjcwMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2TiwgRE4wfX0sCi17ICJhbmQiLAkweGY3MTAwMDAwLAkweGZmZmYwMDAwLAlGTVRfNiwge1NJTU0xNk4sIFBTV319LAoteyAib3IiLAkJMHhmMzEwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAib3IiLAkJMHhmNTA4MDAsCTB4ZmZmYzAwLAlGTVRfNSwge0lNTTgsIEROMH19LAoteyAib3IiLAkJMHhmNzQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgIm9yIiwJCTB4ZjcxNDAwMDAsCTB4ZmZmZjAwMDAsCUZNVF82LCB7U0lNTTE2TiwgUFNXfX0sCi17ICJ4b3IiLAkweGYzMjAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJ4b3IiLAkweGY3NGMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAibm90IiwJMHhmM2U0LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLQoteyAiYXNyIiwJMHhmMzM4LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLXsgImxzciIsCTB4ZjMzYywJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi17ICJyb3IiLAkweGYzMzQsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAoteyAicm9sIiwJMHhmMzMwLAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLQoteyAiYnRzdCIsCTB4ZjUwNDAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKLXsgImJ0c3QiLAkweGY3MDQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAiYnNldCIsCTB4ZjAyMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0wLCBNRU0oQU4xKX19LAoteyAiYmNsciIsCTB4ZjAzMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0wLCBNRU0oQU4xKX19LAotCi17ICJiZXEiLAkweGU4MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJuZSIsCTB4ZTkwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmx0IiwJMHhlMDAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibGUiLAkweGUzMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJnZSIsCTB4ZTIwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmd0IiwJMHhlMTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiY3MiLAkweGU0MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJscyIsCTB4ZTcwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNjIiwJMHhlNjAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiaGkiLAkweGU1MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJ2YyIsCTB4ZjVmYzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJidnMiLAkweGY1ZmQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5jIiwJMHhmNWZlMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJucyIsCTB4ZjVmZjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJicmEiLAkweGVhMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLQoteyAiYmVxeCIsCTB4ZjVlODAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibmV4IiwJMHhmNWU5MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJsdHgiLAkweGY1ZTAwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxleCIsCTB4ZjVlMzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ2V4IiwJMHhmNWUyMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJndHgiLAkweGY1ZTEwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNzeCIsCTB4ZjVlNDAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibHN4IiwJMHhmNWU3MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJjY3giLAkweGY1ZTYwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmhpeCIsCTB4ZjVlNTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJidmN4IiwJMHhmNWVjMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJ2c3giLAkweGY1ZWQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5jeCIsCTB4ZjVlZTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibnN4IiwJMHhmNWVmMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLQoteyAiam1wIiwJMHhmYzAwMDAsCTB4ZmYwMDAwLAlGTVRfMywge0lNTTE2X1BDUkVMfX0sCi17ICJqbXAiLAkweGY0ZTAwMDAwLAkweGZmZmYwMDAwLAlGTVRfNywge0lNTTI0X1BDUkVMfX0sCi17ICJqbXAiLAkweGYwMDAsCQkweGZmZjMsCQlGTVRfNCwge1BBUkVOLEFOMSxQQVJFTn19LAoteyAianNyIiwJMHhmZDAwMDAsCTB4ZmYwMDAwLAlGTVRfMywge0lNTTE2X1BDUkVMfX0sCi17ICJqc3IiLAkweGY0ZTEwMDAwLAkweGZmZmYwMDAwLAlGTVRfNywge0lNTTI0X1BDUkVMfX0sCi17ICJqc3IiLAkweGYwMDEsCQkweGZmZjMsCQlGTVRfNCwge1BBUkVOLEFOMSxQQVJFTn19LAotCi17ICJub3AiLAkweGY2LAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCi0KLXsgInJ0cyIsCTB4ZmUsCQkweGZmLAkJRk1UXzEsIHtVTlVTRUR9fSwKLXsgInJ0aSIsCTB4ZWIsCQkweGZmLAkJRk1UXzEsIHtVTlVTRUR9fSwKLQotLyogRXh0ZW5zaW9uLiAgV2UgbmVlZCBzb21lIGluc3RydWN0aW9uIHRvIHRyaWdnZXIgImVtdWxhdGVkIHN5c2NhbGxzIgotICAgZm9yIG91ciBzaW11bGF0b3IuICAqLwoteyAic3lzY2FsbCIsCTB4ZjAxMCwJCTB4ZmZmZiwJCUZNVF80LCB7VU5VU0VEfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdoZW4gdGFsa2luZyB0byB0aGUgc2ltdWxhdG9yLCBnZGIgcmVxdWlyZXMgc29tZSBpbnN0cnVjdGlvbgotICAgdGhhdCB3aWxsIHRyaWdnZXIgYSAiYnJlYWtwb2ludCIgKHJlYWxseSBqdXN0IGFuIGluc3RydWN0aW9uIHRoYXQgaXNuJ3QKLSAgIG90aGVyd2lzZSB1c2VkIGJ5IHRoZSB0b29scy4gIFRoaXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSB0aGUgc2FtZSBzaXplCi0gICBhcyB0aGUgc21hbGxlc3QgaW5zdHJ1Y3Rpb24gb24gdGhlIHRhcmdldCBtYWNoaW5lLiAgSW4gdGhlIGNhc2Ugb2YgdGhlCi0gICBtbjEweDAwIHRoZSAiYnJlYWsiIGluc3RydWN0aW9uIG11c3QgYmUgb25lIGJ5dGUuICAweGZmIGlzIGF2YWlsYWJsZSBvbgotICAgYm90aCBtbjEweDAwIGFyY2hpdGVjdHVyZXMuICAqLwoteyAiYnJlYWsiLCAgICAgIDB4ZmYsICAgICAgICAgICAweGZmLCAgICAgICAgICAgRk1UXzEsIHtVTlVTRUR9fSwKLQoteyAwLCAwLCAwLCAwLCB7MH19LAotCi19IDsKLQotY29uc3QgaW50IG1uMTAyMDBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKG1uMTAyMDBfb3Bjb2RlcykgLyBzaXplb2YgKG1uMTAyMDBfb3Bjb2Rlc1swXSk7Ci0KLQwKZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMzAwLWRpcy5jIGIvb3Bjb2Rlcy9tMTAzMDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2Y3NGMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMTAzMDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgTU4xMDMwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIHZvaWQgZGlzYXNzZW1ibGUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKLQkJCQkgdW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBpbnQpKTsKLQotaW50IAotcHJpbnRfaW5zbl9tbjEwMzAwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgaW50IGNvbnN1bWU7Ci0KLSAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgYmlnIHRoZSBvcGNvZGUgaXMuICAqLwotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDEsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpbnNuID0gKih1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKLQotICAvKiBUaGVzZSBhcmUgb25lIGJ5dGUgaW5zbnMuICAqLwotICBpZiAoKGluc24gJiAweGYzKSA9PSAweDAwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MTAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgzYwotICAgICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQxCi0gICAgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHg1MAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweDU0Ci0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NjAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg3MAotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweDkwCi0JICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4YTAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHhiMAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2IKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkMAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ0Ci0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDgKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhlMAotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZmKQotICAgIHsKLSAgICAgIGNvbnN1bWUgPSAxOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdHdvIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4OTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YTAKLQkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YjAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjgKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDMKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDIKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NTgKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NWMKLQkgICB8fCAoKGluc24gJiAweGYwKSA9PSAweGMwCi0JICAgICAgICYmIChpbnNuICYgMHhmZikgIT0gMHhjYgotCSAgICAgICAmJiAoaW5zbiAmIDB4ZmYpICE9IDB4Y2MKLQkgICAgICAgJiYgKGluc24gJiAweGZmKSAhPSAweGNkKQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMgotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMwotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNikKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSAyOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdGhyZWUgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmOAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhjYyAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDEKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDIKLQkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDMKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MmMKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzQKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGUKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGYKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2MpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDg7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLSAgICAgIGNvbnN1bWUgPSAzOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgZm91ciBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGZhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY3Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZiKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNDsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZpdmUgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhjZAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhkYykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDU7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBzaXggYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmZAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNjsKLSAgICB9Ci0KLSAgLyogRWxzZSBpdHMgYSBzZXZlbiBieXRlIGluc25zIChpbiB0aGVvcnkpLiAgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSA3OwotICAgIH0KLQotICBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgY29uc3VtZSk7Ci0KLSAgcmV0dXJuIGNvbnN1bWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgc2l6ZSkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKiltbjEwMzAwX29wY29kZXM7Ci0gIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gPSAwOwotICBpbnQgc3RhdHVzLCBtYXRjaCA9IDA7Ci0KLSAgLyogRmluZCB0aGUgb3Bjb2RlLiAgKi8KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGludCBteXNpemUsIGV4dHJhX3NoaWZ0OwotCi0gICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzApCi0JbXlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1MxCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QwKQotCW15c2l6ZSA9IDI7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9TMgotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EMSkKLQlteXNpemUgPSAzOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzQpCi0JbXlzaXplID0gNTsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QyKQotCW15c2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9ENCkKLQlteXNpemUgPSA2OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDYpCi0JbXlzaXplID0gMzsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q3IHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QxMCkKLQlteXNpemUgPSA0OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDgpCi0JbXlzaXplID0gNjsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q5KQotCW15c2l6ZSA9IDc7Ci0gICAgICBlbHNlCi0JbXlzaXplID0gNzsKLQkKLSAgICAgIGlmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlCi0JICAmJiBzaXplID09ICh1bnNpZ25lZCBpbnQpIG15c2l6ZQotCSAgJiYgKG9wLT5tYWNoaW5lID09IDAKLQkgICAgICB8fCBvcC0+bWFjaGluZSA9PSBpbmZvLT5tYWNoKSkKLQl7Ci0JICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLQkgIHVuc2lnbmVkIGludCBub2NvbW1hOwotCSAgaW50IHBhcmVuID0gMDsKLQkgIAotCSAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QxIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1MxKQotCSAgICBleHRyYV9zaGlmdCA9IDg7Ci0JICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9EMiB8fCBvcC0+Zm9ybWF0ID09IEZNVF9ENAotCQkgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9TMiB8fCBvcC0+Zm9ybWF0ID09IEZNVF9TNAotCQkgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9TNiB8fCBvcC0+Zm9ybWF0ID09IEZNVF9ENSkKLQkgICAgZXh0cmFfc2hpZnQgPSAxNjsKLQkgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q3Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q4Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q5KQotCSAgICBleHRyYV9zaGlmdCA9IDg7Ci0JICBlbHNlCi0JICAgIGV4dHJhX3NoaWZ0ID0gMDsKLQotCSAgaWYgKHNpemUgPT0gMSB8fCBzaXplID09IDIpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDMKLQkJICAgJiYgKG9wLT5mb3JtYXQgPT0gRk1UX0QxCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZGYwMDAwCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZGUwMDAwKSkKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gMwotCQkgICAmJiBvcC0+Zm9ybWF0ID09IEZNVF9ENikKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gMykKLQkgICAgewotCSAgICAgIGluc24gJj0gMHhmZjAwMDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA0Ci0JCSAgICYmIChvcC0+b3Bjb2RlID09IDB4ZmFmODAwMDAKLQkJICAgICAgIHx8IG9wLT5vcGNvZGUgPT0gMHhmYWYwMDAwMAotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGZhZjQwMDAwKSkKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNAotCQkgICAmJiAob3AtPmZvcm1hdCA9PSBGTVRfRDcKLQkJICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QxMCkpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDQpCi0JICAgIHsKLQkgICAgICBpbnNuICY9IDB4ZmZmZjAwMDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA1ICYmIG9wLT5vcGNvZGUgPT0gMHhkYzAwMDAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmMDAwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgJiAweGZmZmZmZjAwKSA+PiA4OwotCSAgICAgIGV4dGVuc2lvbiA9IHRlbXAgJiAweGZmOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDUpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZjAwMDBmZjsKLQkgICAgICBpbnNuIHw9IHRlbXAgPDwgODsKLQotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA0LCBidWZmZXIsIDEsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiA9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA2ICYmIG9wLT5mb3JtYXQgPT0gRk1UX0Q4KQotCSAgICB7Ci0JICAgICAgaW5zbiAmPSAweGZmZmZmZjAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA1LCBidWZmZXIsIDEsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGluc24gfD0gKih1bnNpZ25lZCBjaGFyICopYnVmZmVyOwotCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDMsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXh0ZW5zaW9uID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA2KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmZmZjAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCA+PiAxNikgJiAweGZmZmY7Ci0JICAgICAgZXh0ZW5zaW9uID0gdGVtcCAmIDB4ZmZmZjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA3ICYmIG9wLT5mb3JtYXQgPT0gRk1UX0Q5KQotCSAgICB7Ci0JICAgICAgaW5zbiAmPSAweGZmZmZmZjAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAzLCBidWZmZXIsIDQsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JICAgICAgaW5zbiB8PSAoZXh0ZW5zaW9uICYgMHhmZjAwMDAwMCkgPj4gMjQ7Ci0JICAgICAgZXh0ZW5zaW9uICY9IDB4ZmZmZmZmOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDcgJiYgb3AtPm9wY29kZSA9PSAweGRkMDAwMDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmYwMDAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCA+PiA4KSAmIDB4ZmZmZmZmOwotCSAgICAgIGV4dGVuc2lvbiA9ICh0ZW1wICYgMHhmZikgPDwgMTY7Ci0JICAgICAgCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDUsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXh0ZW5zaW9uIHw9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmZmYwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgPj4gMTYpICYgMHhmZmZmOwotCSAgICAgIGV4dGVuc2lvbiA9ICh0ZW1wICYgMHhmZmZmKSA8PCA4OwotCSAgICAgIAotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA2LCBidWZmZXIsIDEsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiB8PSAqKHVuc2lnbmVkIGNoYXIgKilidWZmZXI7Ci0JICAgIH0KLQotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOwotCi0JICAvKiBOb3cgcHJpbnQgdGhlIG9wZXJhbmRzLiAgKi8KLQkgIGZvciAob3BpbmRleF9wdHIgPSBvcC0+b3BlcmFuZHMsIG5vY29tbWEgPSAxOwotCSAgICAgICAqb3BpbmRleF9wdHIgIT0gMDsKLQkgICAgICAgb3BpbmRleF9wdHIrKykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLQkgICAgICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBpcyBhIFBMVVMgKGF1dG9pbmNyZW1lbnQpLCB0aGVuIGRvIG5vdCBlbWl0Ci0JCSBhIGNvbW1hIGJlZm9yZSBlbWl0dGluZyB0aGUgcGx1cy4gICovCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QTFVTKSAhPSAwKQotCQlub2NvbW1hID0gMTsKLQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0JCSAgdmFsdWUgPSBpbnNuICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0JCSAgdmFsdWUgPDw9ICgzMiAtIG9wZXJhbmQtPmJpdHMpOwotCQkgIHRlbXAgPSBleHRlbnNpb24gPj4gb3BlcmFuZC0+c2hpZnQ7Ci0JCSAgdGVtcCAmPSAoKDEgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpIC0gMSk7Ci0JCSAgdmFsdWUgfD0gdGVtcDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkgIT0gMCkKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQkJICB2YWx1ZSA9IGluc24gJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkJICB2YWx1ZSA8PD0gKDI0IC0gb3BlcmFuZC0+Yml0cyk7Ci0JCSAgdGVtcCA9IGV4dGVuc2lvbiA+PiBvcGVyYW5kLT5zaGlmdDsKLQkJICB0ZW1wICY9ICgoMSA8PCAoMjQgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKTsKLQkJICB2YWx1ZSB8PSB0ZW1wOwotCQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCQkgICAgdmFsdWUgPSAoKHZhbHVlICYgMHhmZmZmZmYpIF4gKH4weDdmZmZmZikpICsgMHg4MDAwMDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoZXh0ZW5zaW9uID4+IChvcGVyYW5kLT5zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJfQotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TSUdORUQpICE9IDAKLQkJICAgLyogVGhlc2UgYXJlIHByb3Blcmx5IGV4dGVuZGVkIGJ5IHRoZSBjb2RlIGFib3ZlLiAgKi8KLQkJICAgJiYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF8yNEJJVCkgPT0gMCkKLQkJICApCi0JCXZhbHVlID0gKChsb25nKSh2YWx1ZSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkKLQkJCSAgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpOwotCi0JICAgICAgaWYgKCFub2NvbW1hCi0JCSAgJiYgKCFwYXJlbgotCQkgICAgICB8fCAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BBUkVOKSA9PSAwKSkpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCi0JICAgICAgbm9jb21tYSA9IDA7Ci0JCQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRFJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZCVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfQVJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYSVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1ApICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3AiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QU1cpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAicHN3Iik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTURSKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIm1kciIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICBpZiAodmFsdWUgPCA4KQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWQiLCB2YWx1ZSk7Ci0JCSAgZWxzZSBpZiAodmFsdWUgPCAxMikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYSVkIiwgdmFsdWUgLSA4KTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQlZCIsIHZhbHVlIC0gMTIpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfWFJSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICBpZiAodmFsdWUgPT0gMCkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3AiLCB2YWx1ZSk7Ci0JCSAgZWxzZQotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAieHIlZCIsIHZhbHVlKTsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1VTUCkgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ1c3AiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TU1ApICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAic3NwIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTVNQKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIm1zcCIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BDKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInBjIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRVBTVykgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJlcHN3Iik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUExVUykgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEFSRU4pICE9IDApCi0JCXsKLQkJICBpZiAocGFyZW4pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCQkgICAgICBub2NvbW1hID0gMTsKLQkJICAgIH0KLQkJICBwYXJlbiA9ICFwYXJlbjsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BDUkVMKSAhPSAwKQotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChsb25nKSB2YWx1ZSArIG1lbWFkZHIsIGluZm8pOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX01FTUFERFIpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUKSAhPSAwKQotCQl7Ci0JCSAgaW50IGNvbW1hID0gMDsKLQotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiWyIpOwotCQkgIGlmICh2YWx1ZSAmIDB4ODApCi0JCSAgICB7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZDIiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHg0MCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZDMiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHgyMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYTIiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHgxMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYTMiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHgwOCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAib3RoZXIiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCi0JCSAgaWYgKHZhbHVlICYgMHgwNCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXhyZWcwIik7Ci0JCSAgICAgIGNvbW1hID0gMTsKLQkJICAgIH0KLQkJICBpZiAodmFsdWUgJiAweDAyKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHJlZzEiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCQkgIGlmICh2YWx1ZSAmIDB4MDEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb21tYSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4b3RoZXIiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXSIpOwotCQl9Ci0KLQkgICAgICBlbHNlIAotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOwotCSAgICB9Ci0JICAvKiBBbGwgZG9uZS4gKi8KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIGlmICghbWF0Y2gpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCJ1bmtub3duXHQweCUwNHgiKSwgaW5zbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMgYi9vcGNvZGVzL20xMDMwMC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3OWRiYy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20xMDMwMC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjcgKzAsMCBAQAotLyogQXNzZW1ibGUgTWF0c3VzaGl0YSBNTjEwMzAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGZvcm1hdHRlZCBhdCA+IDgwIGNvbHVtbnMuICBBdHRlbXB0aW5nIHRvIHJlYWQgaXQgb24gYQotICAgc2NyZWVlbiB3aXRoIGxlc3MgdGhhbiA4MCBjb2x1bW5zIHdpbGwgYmUgZGlmZmljdWx0LiAgKi8KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiCi0KLQwKLWNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgbW4xMDMwMF9vcGVyYW5kc1tdID0gewotI2RlZmluZSBVTlVTRUQJMAotICB7MCwgMCwgMH0sIAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMCAgICAgIChVTlVTRUQrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4xICAgICAgKEROMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMiAgICAgIChETjErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTAgICAgICAoRE4yKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMSAgICAgIChETTArMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTIgICAgICAoRE0xKzEpCi0gIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4wICAgICAgKERNMisxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjEgICAgICAoQU4wKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4yICAgICAgKEFOMSsxKQotICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMCAgICAgIChBTjIrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0xICAgICAgKEFNMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMiAgICAgIChBTTErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTggICAgKEFNMisxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2ICAgIChJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgcGMtcmVsYXRpdmUgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHBjLXJlbGF0aXZlIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2X1BDUkVMICAgIChJTU0xNisxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAxNmJpdCB1bnNpZ25lZCBkaXNwbGFjZW1lbnQgaW4gYSBtZW1vcnkgb3BlcmF0aW9uIHdoaWNoCi0gICBtYXkgcHJvbW90ZSB0byBhIDMyYml0IGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIElNTTE2X01FTSAgICAoSU1NMTZfUENSRUwrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDE2IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDE2Yml0cyBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuIAotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzIgICAgKElNTTE2X01FTSsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVH0sCi0KLS8qIDMyYml0IHBjLXJlbGF0aXZlIG9mZnNldC4gICovCi0jZGVmaW5lIElNTTMyX1BDUkVMICAgIChJTU0zMisxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTH0sCi0KLS8qIDMyYml0IG1lbW9yeSBvZmZzZXQuICAqLwotI2RlZmluZSBJTU0zMl9NRU0gICAgKElNTTMyX1BDUkVMKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMTYgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgMTZiaXRzIGluIHRoZSBleHRlbnNpb24gd29yZCwgbG93IDE2Yml0cyBhcmUgbGVmdAotICAgc2hpZnRlZCA4IHBsYWNlcy4gCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMl9MT1dTSElGVDggICAgKElNTTMyX01FTSsxKQotICB7MTYsIDgsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDI0IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDggaW4gdGhlIGV4dGVuc2lvbiB3b3JkLgotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzJfSElHSDI0ICAgIChJTU0zMl9MT1dTSElGVDgrMSkKLSAgezI0LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUx9LAotCi0vKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMjQgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgOCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQsIGxvdyA4IGJpdHMgYXJlIGxlZnQKLSAgIHNoaWZ0ZWQgMTYgcGxhY2VzLiAKLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyX0hJR0gyNF9MT1dTSElGVDE2ICAgIChJTU0zMl9ISUdIMjQrMSkKLSAgezI0LCAxNiwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMfSwKLQotLyogU3RhY2sgcG9pbnRlci4gICovCi0jZGVmaW5lIFNQICAgIChJTU0zMl9ISUdIMjRfTE9XU0hJRlQxNisxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQfSwKLQotLyogUHJvY2Vzc29yIHN0YXR1cyB3b3JkLiAgKi8KLSNkZWZpbmUgUFNXICAgIChTUCsxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BTV30sCi0KLS8qIE1EUiByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1EUiAgICAoUFNXKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfTURSfSwKLQotLyogSW5kZXggcmVnaXN0ZXIuICAqLwotI2RlZmluZSBESSAoTURSKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDggICAgKERJKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0QxNiAgICAoU0Q4KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCB0aGF0IGNhbiBub3QgcHJvbW90ZS4gICovCi0jZGVmaW5lIFNEOE4gICAgKFNEMTYrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiA4IGJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDhOX1BDUkVMICAgIChTRDhOKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCBzaGlmdGVkIGxlZnQgOCBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNEOE5fU0hJRlQ4ICAgIChTRDhOX1BDUkVMKzEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTggICAgKFNEOE5fU0hJRlQ4KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAzMmJpdCAgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTE2ICAgIChTSU1NOCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIEVpdGhlciBhbiBvcGVuIHBhcmVuIG9yIGNsb3NlIHBhcmVuLiAgKi8KLSNkZWZpbmUgUEFSRU4JKFNJTU0xNisxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BBUkVOfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLwotI2RlZmluZSBETjAxICAgICAoUEFSRU4rMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogYW4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEFOMDEgICAgIChETjAxKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfQVJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLS8qIDE2Yml0IHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudCB3aGljaCBtYXkgcHJvbW90ZSB0byAzMmJpdCBwYy1yZWxhdGl2ZQotICAgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgRDE2X1NISUZUIChBTjAxKzEpCi0gIHsxNiwgOCwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIHwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDggYml0IGltbWVkaWF0ZSBmb3VuZCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuICAqLwotI2RlZmluZSBJTU04RSAgICAoRDE2X1NISUZUKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUR9LAotCi0vKiBSZWdpc3RlciBsaXN0IGZvdW5kIGluIHRoZSBleHRlbnNpb24gd29yZCBzaGlmdGVkIDggYml0cyBsZWZ0LiAgKi8KLSNkZWZpbmUgUkVHU0VfU0hJRlQ4ICAgIChJTU04RSsxKQotICB7OCwgOCwgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUfSwKLQotLyogUmVnaXN0ZXIgbGlzdCBzaGlmdGVkIDggYml0cyBsZWZ0LiAgKi8KLSNkZWZpbmUgUkVHU19TSElGVDggKFJFR1NFX1NISUZUOCArIDEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1R9LAotCi0vKiBSZWlnc3RlciBsaXN0LiAgKi8KLSNkZWZpbmUgUkVHUyAgICAoUkVHU19TSElGVDgrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVH0sCi0KLS8qIFVTdGFjayBwb2ludGVyLiAgKi8KLSNkZWZpbmUgVVNQICAgIChSRUdTKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfVVNQfSwKLQotLyogU1N0YWNrIHBvaW50ZXIuICAqLwotI2RlZmluZSBTU1AgICAgKFVTUCsxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NTUH0sCi0KLS8qIE1TdGFjayBwb2ludGVyLiAgKi8KLSNkZWZpbmUgTVNQICAgIChTU1ArMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9NU1B9LAotCi0vKiBQQyAuICAqLwotI2RlZmluZSBQQyAgICAoTVNQKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfUEN9LAotCi0vKiA0IGJpdCBpbW1lZGlhdGUgZm9yIHN5c2NhbGwuICAqLwotI2RlZmluZSBJTU00ICAgIChQQysxKQotICB7NCwgMCwgMH0sCi0KLS8qIFByb2Nlc3NvciBzdGF0dXMgd29yZC4gICovCi0jZGVmaW5lIEVQU1cgICAgKElNTTQrMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9FUFNXfSwKLQotLyogcm4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTjAgICAgICAoRVBTVysxKQotICB7NCwgMCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiBybiByZWdpc3RlciBpbiB0aGUgZm91cnRoIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTjIgICAgICAoUk4wKzEpCi0gIHs0LCA0LCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIHJtIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgUk0wICAgICAgKFJOMisxKQotICB7NCwgMCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiBybSByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTTEgICAgICAoUk0wKzEpCi0gIHs0LCAyLCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIHJtIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgUk0yICAgICAgKFJNMSsxKQotICB7NCwgNCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0jZGVmaW5lIFJOMDIgICAgICAoUk0yKzEpCi0gIHs0LCAwLCBNTjEwMzAwX09QRVJBTkRfUlJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLSNkZWZpbmUgWFJOMCAgICAgIChSTjAyKzEpCi0gIHs0LCAwLCBNTjEwMzAwX09QRVJBTkRfWFJSRUd9LAotCi0jZGVmaW5lIFhSTTIgICAgICAoWFJOMCsxKQotICB7NCwgNCwgTU4xMDMwMF9PUEVSQU5EX1hSUkVHfSwKLQotLyogKyBmb3IgYXV0b2luY3JlbWVudCAqLwotI2RlZmluZSBQTFVTCShYUk0yKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfUExVU30sIAotCi0jZGVmaW5lIFhSTjAyICAgICAgKFBMVVMrMSkKLSAgezQsIDAsIE1OMTAzMDBfT1BFUkFORF9YUlJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLS8qIEljayAqLwotI2RlZmluZSBSRDAgICAgICAoWFJOMDIrMSkKLSAgezQsIC04LCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLSNkZWZpbmUgUkQyICAgICAgKFJEMCsxKQotICB7NCwgLTQsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogOCB1bnNpZ25lZCBkaXNwbGFjZW1lbnQgaW4gYSBtZW1vcnkgb3BlcmF0aW9uIHdoaWNoCi0gICBtYXkgcHJvbW90ZSB0byBhIDMyYml0IGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIElNTThfTUVNICAgIChSRDIrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiBJbmRleCByZWdpc3Rlci4gICovCi0jZGVmaW5lIFJJIChJTU04X01FTSsxKQotICB7NCwgNCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiAyNCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0QyNCAgICAoUkkrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF8yNEJJVCB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDI0IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAzMmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMjQgICAgKFNEMjQrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF8yNEJJVCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMjQgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAzMmJpdAotICAgc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIFNJTU0yNCAgICAoSU1NMjQrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF8yNEJJVCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDI0Yml0IHVuc2lnbmVkIGRpc3BsYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKLSAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSU1NMjRfTUVNICAgIChTSU1NMjQrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF8yNEJJVCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDggYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgMjQgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLgotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzJfSElHSDggICAgKElNTTI0X01FTSsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUfSwKLQotLyogU2ltaWxhcmx5LCBidXQgYSBtZW1vcnkgYWRkcmVzcy4gICovCi0jZGVmaW5lIElNTTMyX0hJR0g4X01FTSAgKElNTTMyX0hJR0g4KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIHJtIHJlZ2lzdGVyIGluIHRoZSBzZXZlbnRoIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTTYgICAgICAoSU1NMzJfSElHSDhfTUVNKzEpCi0gIHs0LCAxMiwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiBybSByZWdpc3RlciBpbiB0aGUgZmlmdGggcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIFJONCAgICAgIChSTTYrMSkKLSAgezQsIDgsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogNCBiaXQgaW1tZWRpYXRlIGZvciBkc3AgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgSU1NNF8yICAgIChSTjQrMSkKLSAgezQsIDQsIDB9LAotCi0vKiA0IGJpdCBpbW1lZGlhdGUgZm9yIGRzcCBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBTSU1NNF8yICAgIChJTU00XzIrMSkKLSAgezQsIDQsIE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiA0IGJpdCBpbW1lZGlhdGUgZm9yIGRzcCBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBTSU1NNF82ICAgIChTSU1NNF8yKzEpCi0gIHs0LCAxMiwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLX0gOyAKLQotI2RlZmluZSBNRU0oQUREUikgUEFSRU4sIEFERFIsIFBBUkVOIAotI2RlZmluZSBNRU1JTkMoQUREUikgUEFSRU4sIEFERFIsIFBMVVMsIFBBUkVOIAotI2RlZmluZSBNRU1JTkMyKEFERFIsSU5DKSBQQVJFTiwgQUREUiwgUExVUywgSU5DLCBQQVJFTiAKLSNkZWZpbmUgTUVNMihBRERSMSxBRERSMikgUEFSRU4sIEFERFIxLCBBRERSMiwgUEFSRU4gCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLgotCi0gICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6Ci0KLSAgIE5BTUUJCU9QQ09ERQkJTUFTSwlNQVRDSF9NQVNLLCBGT1JNQVQsIFBST0NFU1NPUgl7IE9QRVJBTkRTIH0KLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBPUEVSQU5EUyBpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLQotICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKLSAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCi0gICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCi0gICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLiAgKi8KLQotY29uc3Qgc3RydWN0IG1uMTAzMDBfb3Bjb2RlIG1uMTAzMDBfb3Bjb2Rlc1tdID0gewoteyAibW92IiwJMHg4MDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgRE4wMX19LAoteyAibW92IiwJMHg4MCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJtb3YiLAkweGYxZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJtb3YiLAkweGYxZDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJtb3YiLAkweDkwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0lNTTgsIEFOMDF9fSwKLXsgIm1vdiIsCTB4OTAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtBTTEsIEFOMH19LAoteyAibW92IiwJMHgzYywJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe1NQLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjJmMCwJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBTUH19LAoteyAibW92IiwJMHhmMmU0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtQU1csIEROMH19LAoteyAibW92IiwJMHhmMmYzLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIFBTV319LAoteyAibW92IiwJMHhmMmUwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtNRFIsIEROMH19LAoteyAibW92IiwJMHhmMmYyLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1EUn19LAoteyAibW92IiwJMHg3MCwJICAgICAweGYwLAkgIDAsICAgIEZNVF9TMCwgMCwJe01FTShBTTApLCBETjF9fSwKLXsgIm1vdiIsCTB4NTgwMCwJICAgICAweGZjZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNKFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweDMwMDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjAwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEFOMX19LAoteyAibW92IiwJMHg1YzAwLAkgICAgIDB4ZmNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0oU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmFhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNKElNTTE2X01FTSksIEFOMH19LAoteyAibW92IiwJMHg2MCwJICAgICAweGYwLAkgIDAsICAgIEZNVF9TMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgIm1vdiIsCTB4NDIwMCwJICAgICAweGYzZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCi17ICJtb3YiLAkweDAxMDAwMCwgICAgMHhmMzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0RNMSwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdiIsCTB4ZjAxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBNRU0oQU4wKX19LAoteyAibW92IiwJMHg0MzAwLAkgICAgIDB4ZjNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtBTTEsIE1FTShTUCl9fSwKLXsgIm1vdiIsCTB4ZmE4MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7QU0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHg1YzAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0yKElNTTgsIFNQKSwgQU4wfX0sCi17ICJtb3YiLAkweGY4MDAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKLXsgIm1vdiIsCTB4ZmEwMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBETjF9fSwKLXsgIm1vdiIsCTB4NTgwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNMihJTU04LCBTUCksIEROMH19LAoteyAibW92IiwJMHhmYWI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoteyAibW92IiwJMHhmMzAwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBETjJ9fSwKLXsgIm1vdiIsCTB4ZjgyMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsQU0wKSwgQU4xfX0sCi17ICJtb3YiLAkweGZhMjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgQU4xfX0sCi17ICJtb3YiLAkweGZhYjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgQU4wfX0sCi17ICJtb3YiLAkweGYzODAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEFOMn19LAoteyAibW92IiwJMHg0MzAwLAkgICAgIDB4ZjMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtBTTEsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3YiLAkweGY4MTAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihTRDgsIEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmExMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKLXsgIm1vdiIsCTB4NDIwMCwJICAgICAweGYzMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92IiwJMHhmYTkxMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoSU1NMTYsIFNQKX19LAoteyAibW92IiwJMHhmMzQwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTIsIE1FTTIoREksIEFOMCl9fSwKLXsgIm1vdiIsCTB4ZjgzMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7QU0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92IiwJMHhmYTMwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtBTTEsIE1FTTIoU0QxNiwgQU4wKX19LAoteyAibW92IiwJMHhmYTkwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtBTTEsIE1FTTIoSU1NMTYsIFNQKX19LAoteyAibW92IiwJMHhmM2MwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTIsIE1FTTIoREksIEFOMCl9fSwKLQoteyAibW92IiwJMHhmMDIwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtVU1AsIEFOMH19LAoteyAibW92IiwJMHhmMDI0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtTU1AsIEFOMH19LAoteyAibW92IiwJMHhmMDI4LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtNU1AsIEFOMH19LAoteyAibW92IiwJMHhmMDJjLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtQQywgQU4wfX0sCi17ICJtb3YiLAkweGYwMzAsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0FOMSwgVVNQfX0sCi17ICJtb3YiLAkweGYwMzEsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0FOMSwgU1NQfX0sCi17ICJtb3YiLAkweGYwMzIsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0FOMSwgTVNQfX0sCi17ICJtb3YiLAkweGYyZWMsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0VQU1csIEROMH19LAoteyAibW92IiwJMHhmMmYxLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETTEsIEVQU1d9fSwKLXsgIm1vdiIsCTB4ZjUwMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7QU0yLCBSTjB9fSwKLXsgIm1vdiIsCTB4ZjU0MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE0yLCBSTjB9fSwKLXsgIm1vdiIsCTB4ZjU4MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7Uk0xLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjVjMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7Uk0xLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjkwODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1vdiIsCTB4ZjllODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7WFJNMiwgUk4wfX0sCi17ICJtb3YiLAkweGY5ZjgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgWFJOMH19LAoteyAibW92IiwJMHhmOTBhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtNRU0oUk0wKSwgUk4yfX0sCi17ICJtb3YiLAkweGY5OGEwMCwgICAgMHhmZmZmMGYsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe01FTShTUCksIFJOMn19LAoteyAibW92IiwJMHhmOTZhMDAsICAgIDB4ZmZmZjAwLCAgICAweDEyLCBGTVRfRDYsIEFNMzMsCXtNRU1JTkMoUk0wKSwgUk4yfX0sCi17ICJtb3YiLAkweGZiMGUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTShJTU04X01FTSksIFJOMn19LAoteyAibW92IiwJMHhmZDBlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0oSU1NMjRfTUVNKSwgUk4yfX0sCi17ICJtb3YiLAkweGY5MWEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgTUVNKFJOMCl9fSwKLXsgIm1vdiIsCTB4Zjk5YTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU0oU1ApfX0sCi17ICJtb3YiLAkweGY5N2EwMCwgICAgMHhmZmZmMDAsICAgIDAsCUZNVF9ENiwgQU0zMywJe1JNMiwgTUVNSU5DKFJOMCl9fSwKLXsgIm1vdiIsCTB4ZmIxZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0oSU1NOF9NRU0pfX0sCi17ICJtb3YiLAkweGZkMWUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdiIsCTB4ZmIwYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihTRDgsIFJNMCksIFJOMn19LAoteyAibW92IiwJMHhmZDBhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0yKFNEMjQsIFJNMCksIFJOMn19LAoteyAibW92IiwJMHhmYjhlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFJJLCBSTTApLCBSRDJ9fSwKLXsgIm1vdiIsCTB4ZmIxYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0yKFNEOCwgUk4wKX19LAoteyAibW92IiwJMHhmZDFhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTTIoU0QyNCwgUk4wKX19LAoteyAibW92IiwJMHhmYjhhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKElNTTgsIFNQKSwgUk4yfX0sCi17ICJtb3YiLAkweGZkOGEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTTIoSU1NMjQsIFNQKSwgUk4yfX0sCi17ICJtb3YiLAkweGZiOWEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZmQ5YTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTI0LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZmI5ZTAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7UkQyLCBNRU0yKFJJLCBSTjApfX0sCi17ICJtb3YiLAkweGZiNmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9ENywgQU0zMywJe01FTUlOQzIgKFJNMCwgU0lNTTgpLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmI3YTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU1JTkMyIChSTjAsIFNJTU04KX19LAoteyAibW92IiwJMHhmZDZhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDIyLCBGTVRfRDgsIEFNMzMsCXtNRU1JTkMyIChSTTAsIElNTTI0KSwgUk4yfX0sCi17ICJtb3YiLAkweGZkN2EwMDAwLCAgMHhmZmZmMDAwMCwgIDAsCUZNVF9EOCwgQU0zMywJe1JNMiwgTUVNSU5DMiAoUk4wLCBJTU0yNCl9fSwKLXsgIm1vdiIsCTB4ZmU2YTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q5LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBJTU0zMl9ISUdIOCksIFJOMn19LAoteyAibW92IiwJMHhmZTdhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDksIEFNMzMsCXtSTjIsIE1FTUlOQzIgKFJNMCwgSU1NMzJfSElHSDgpfX0sCi0vKiBUaGVzZSBtdXN0IGNvbWUgYWZ0ZXIgbW9zdCBvZiB0aGUgb3RoZXIgbW92ZSBpbnN0cnVjdGlvbnMgdG8gYXZvaWQgbWF0Y2hpbmcKLSAgIGEgc3ltYm9saWMgbmFtZSB3aXRoIElNTXh4IG9wZXJhbmRzLiAgVWdoLiAgKi8KLXsgIm1vdiIsCTB4MmMwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7U0lNTTE2LCBETjB9fSwKLXsgIm1vdiIsCTB4ZmNjYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAibW92IiwJMHgyNDAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtJTU0xNiwgQU4wfX0sCi17ICJtb3YiLAkweGZjZGMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmNhNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoteyAibW92IiwJMHhmY2EwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweGZjODEwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNKElNTTMyX01FTSl9fSwKLXsgIm1vdiIsCTB4ZmM4MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7QU0xLCBNRU0oSU1NMzJfTUVNKX19LAoteyAibW92IiwJMHhmYzAwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoteyAibW92IiwJMHhmY2I0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLCBTUCksIEROMH19LAoteyAibW92IiwJMHhmYzIwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEFOMX19LAoteyAibW92IiwJMHhmY2IwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLCBTUCksIEFOMH19LAoteyAibW92IiwJMHhmYzEwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsQU4wKX19LAoteyAibW92IiwJMHhmYzkxMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsIFNQKX19LAoteyAibW92IiwJMHhmYzMwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtBTTEsIE1FTTIoSU1NMzIsQU4wKX19LAoteyAibW92IiwJMHhmYzkwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtBTTEsIE1FTTIoSU1NMzIsIFNQKX19LAotLyogVGhlc2Ugbm9uLXByb21vdGluZyB2YXJpYW50cyBuZWVkIHRvIGNvbWUgYWZ0ZXIgYWxsIHRoZSBvdGhlciBtZW1vcnkKLSAgIG1vdmVzLiAgKi8KLXsgIm1vdiIsCTB4ZjhmMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7TUVNMihTRDhOLCBBTTApLCBTUH19LAoteyAibW92IiwJMHhmOGY0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtTUCwgTUVNMihTRDhOLCBBTjApfX0sCi0vKiBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIG5vbi1wcm9tb3RpbmcgdmVyc2lvbnMuICBUaGUgYW0zMwotICAgZG9lcyBub3QgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIG9mZnNldHMgdXNlZCB0byBsb2FkL3N0b3JlIHRoZSBzdGFjawotICAgcG9pbnRlci4gICovCi17ICJtb3YiLAkweGY4ZjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMywJe01FTTIoU0Q4LCBBTTApLCBTUH19LAoteyAibW92IiwJMHhmOGY0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzMsCXtTUCwgTUVNMihTRDgsIEFOMCl9fSwKLS8qIFRoZXNlIG11c3QgY29tZSBsYXN0IHNvIHRoYXQgd2UgZmF2b3Igc2hvcnRlciBtb3ZlIGluc3RydWN0aW9ucyBmb3IKLSAgIGxvYWRpbmcgaW1tZWRpYXRlcyBpbnRvIGQwLWQzL2EwLWEzLiAgKi8KLXsgIm1vdiIsCTB4ZmIwODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgIm1vdiIsCTB4ZmQwODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJtb3YiLAkweGZlMDgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJtb3YiLAkweGZiZjgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBYUk4wMn19LAoteyAibW92IiwJMHhmZGY4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFhSTjAyfX0sCi17ICJtb3YiLAkweGZlZjgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBYUk4wMn19LAoteyAibW92IiwJMHhmZTBlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0oSU1NMzJfSElHSDhfTUVNKSwgUk4yfX0sCi17ICJtb3YiLAkweGZlMWUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNKElNTTMyX0hJR0g4X01FTSl9fSwKLXsgIm1vdiIsCTB4ZmUwYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNMihJTU0zMl9ISUdIOCxSTTApLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmUxYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTMyX0hJR0g4LCBSTjApfX0sCi17ICJtb3YiLAkweGZlOGEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTTIoSU1NMzJfSElHSDgsIFNQKSwgUk4yfX0sCi17ICJtb3YiLAkweGZlOWEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNMihJTU0zMl9ISUdIOCwgU1ApfX0sCi0KLXsgIm1vdnUiLAkweGZiMTgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgIm1vdnUiLAkweGZkMTgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJtb3Z1IiwJMHhmZTE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJtY3N0OSIsCTB4ZjYzMCwgICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE4wMX19LAoteyAibWNzdDQ4IiwJMHhmNjYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETjAxfX0sCi17ICJzd2FwIiwJMHhmNjgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETTEsIEROMH19LAoteyAic3dhcCIsCTB4ZjljYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgInN3YXBoIiwJMHhmNjkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETTEsIEROMH19LAoteyAic3dhcGgiLAkweGY5ZGIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJnZXRjaHgiLAkweGY2YzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0ROMDF9fSwKLXsgImdldGNseCIsCTB4ZjZkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE4wMX19LAoteyAibWFjIiwJMHhmYjBmMDAwMCwgIDB4ZmZmZjAwMDAsICAweGMsICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyLCBSRDB9fSwKLXsgIm1hYyIsCTB4ZjkwYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1hYyIsCTB4ZmIwYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgIm1hYyIsCTB4ZmQwYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJtYWMiLAkweGZlMGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJtYWN1IiwJMHhmYjFmMDAwMCwgIDB4ZmZmZjAwMDAsICAweGMsICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyLCBSRDB9fSwKLXsgIm1hY3UiLAkweGY5MWIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtYWN1IiwJMHhmYjFiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJtYWN1IiwJMHhmZDFiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAibWFjdSIsCTB4ZmUxYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgIm1hY2IiLAkweGZiMmYwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgIm1hY2IiLAkweGY5MmIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtYWNiIiwJMHhmYjJiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAibWFjYiIsCTB4ZmQyYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJtYWNiIiwJMHhmZTJiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibWFjYnUiLAkweGZiM2YwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgIm1hY2J1IiwJMHhmOTNiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjYnUiLAkweGZiM2IwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgIm1hY2J1IiwJMHhmZDNiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAibWFjYnUiLAkweGZlM2IwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJtYWNoIiwJMHhmYjRmMDAwMCwgIDB4ZmZmZjAwMDAsICAweGMsICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyLCBSRDB9fSwKLXsgIm1hY2giLAkweGY5NGIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtYWNoIiwJMHhmYjRiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAibWFjaCIsCTB4ZmQ0YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJtYWNoIiwJMHhmZTRiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibWFjaHUiLAkweGZiNWYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAibWFjaHUiLAkweGY5NWIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtYWNodSIsCTB4ZmI1YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAibWFjaHUiLAkweGZkNWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJtYWNodSIsCTB4ZmU1YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImRtYWNoIiwJMHhmYjZmMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJkbWFjaCIsCTB4Zjk2YjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImRtYWNoIiwJMHhmZTZiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAiZG1hY2h1IiwJMHhmYjdmMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJkbWFjaHUiLAkweGY5N2IwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJkbWFjaHUiLAkweGZlN2IwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJkbXVsaCIsCTB4ZmI4ZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJkbXVsaCIsCTB4Zjk4YjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImRtdWxoIiwJMHhmZThiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAiZG11bGh1IiwJMHhmYjlmMDAwMCwgIDB4ZmZmZjAwMDAsICAweGMsICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyLCBSRDB9fSwKLXsgImRtdWxodSIsCTB4Zjk5YjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImRtdWxodSIsCTB4ZmU5YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgIm1jc3RlIiwJMHhmOWJiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWNzdGUiLAkweGZiYmIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgInN3aHciLAkweGY5ZWIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi0KLXsgIm1vdmJ1IiwJMHhmMDQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgRE4xfX0sCi17ICJtb3ZidSIsCTB4Zjg0MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsIEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGZhNDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgRE4xfX0sCi17ICJtb3ZidSIsCTB4ZjhiODAwLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNKFNQKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZjhiODAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihJTU04LCBTUCksIEROMH19LAoteyAibW92YnUiLAkweGZhYjgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZjQwMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgRE4yfX0sCi17ICJtb3ZidSIsCTB4MzQwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92YnUiLAkweGYwNTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmODUwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoU0Q4LCBBTjApfX0sCi17ICJtb3ZidSIsCTB4ZmE1MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmODkyMDAsICAgIDB4ZmZmM2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTShTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmODkyMDAsICAgIDB4ZmZmMzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZmE5MjAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKElNTTE2LCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmNDQwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTIsIE1FTTIoREksIEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHgwMjAwMDAsICAgIDB4ZjMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtETTEsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3ZidSIsCTB4ZjkyYTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFJNMCksIFJOMn19LAoteyAibW92YnUiLAkweGY5M2EwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgTUVNKFJOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmOWFhMDAsICAgIDB4ZmZmZjBmLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtNRU0oU1ApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmOWJhMDAsICAgIDB4ZmZmZjBmLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTShTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmYjJhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFNEOCwgUk0wKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmQyYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNMihTRDI0LCBSTTApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmYjNhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoU0Q4LCBSTjApfX0sCi17ICJtb3ZidSIsCTB4ZmQzYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKFNEMjQsIFJOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmYmFhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKElNTTgsIFNQKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmRhYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNMihJTU0yNCwgU1ApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmYmJhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZmRiYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTI0LCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmYjJlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0oSU1NOF9NRU0pLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmZDJlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0oSU1NMjRfTUVNKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmIzZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0oSU1NOF9NRU0pfX0sCi17ICJtb3ZidSIsCTB4ZmQzZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0oSU1NMjRfTUVNKX19LAoteyAibW92YnUiLAkweGZiYWUwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoUkksIFJNMCksIFJEMn19LAoteyAibW92YnUiLAkweGZiYmUwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JEMiwgTUVNMihSSSwgUk4wKX19LAoteyAibW92YnUiLAkweGZjNDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgRE4xfX0sCi17ICJtb3ZidSIsCTB4ZmNiODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmY2E4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZmM1MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmYzkyMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsIFNQKX19LAoteyAibW92YnUiLAkweGZjODIwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNKElNTTMyX01FTSl9fSwKLXsgIm1vdmJ1IiwJMHhmZTJhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LFJNMCksIFJOMn19LAoteyAibW92YnUiLAkweGZlM2EwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNMihJTU0zMl9ISUdIOCwgUk4wKX19LAoteyAibW92YnUiLAkweGZlYWEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTTIoSU1NMzJfSElHSDgsU1ApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmZWJhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFNQKX19LAoteyAibW92YnUiLAkweGZlMmUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTShJTU0zMl9ISUdIOF9NRU0pLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmZTNlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTShJTU0zMl9ISUdIOF9NRU0pfX0sCi0KLXsgIm1vdmh1IiwJMHhmMDYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgRE4xfX0sCi17ICJtb3ZodSIsCTB4Zjg2MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsIEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGZhNjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgRE4xfX0sCi17ICJtb3ZodSIsCTB4ZjhiYzAwLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNKFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZjhiYzAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihJTU04LCBTUCksIEROMH19LAoteyAibW92aHUiLAkweGZhYmMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZjQ4MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgRE4yfX0sCi17ICJtb3ZodSIsCTB4MzgwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92aHUiLAkweGYwNzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgIm1vdmh1IiwJMHhmODcwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoU0Q4LCBBTjApfX0sCi17ICJtb3ZodSIsCTB4ZmE3MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKLXsgIm1vdmh1IiwJMHhmODkzMDAsICAgIDB4ZmZmM2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTShTUCl9fSwKLXsgIm1vdmh1IiwJMHhmODkzMDAsICAgIDB4ZmZmMzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZmE5MzAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKElNTTE2LCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmNGMwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTIsIE1FTTIoREksIEFOMCl9fSwKLXsgIm1vdmh1IiwJMHgwMzAwMDAsICAgIDB4ZjMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtETTEsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3ZodSIsCTB4Zjk0YTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFJNMCksIFJOMn19LAoteyAibW92aHUiLAkweGY5NWEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgTUVNKFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmOWNhMDAsICAgIDB4ZmZmZjBmLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtNRU0oU1ApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmOWRhMDAsICAgIDB4ZmZmZjBmLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTShTUCl9fSwKLXsgIm1vdmh1IiwJMHhmOWVhMDAsICAgIDB4ZmZmZjAwLCAgICAweDEyLCBGTVRfRDYsIEFNMzMsCXtNRU1JTkMoUk0wKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZjlmYTAwLCAgICAweGZmZmYwMCwgICAgMCwJRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU1JTkMoUk4wKX19LAoteyAibW92aHUiLAkweGZiNGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoU0Q4LCBSTTApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZDRhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0yKFNEMjQsIFJNMCksIFJOMn19LAoteyAibW92aHUiLAkweGZiNWEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNMihTRDgsIFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmZDVhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTTIoU0QyNCwgUk4wKX19LAoteyAibW92aHUiLAkweGZiY2EwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoSU1NOCwgU1ApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZGNhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0yKElNTTI0LCBTUCksIFJOMn19LAoteyAibW92aHUiLAkweGZiZGEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmZGRhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTTIoSU1NMjQsIFNQKX19LAoteyAibW92aHUiLAkweGZiNGUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTShJTU04X01FTSksIFJOMn19LAoteyAibW92aHUiLAkweGZkNGUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTShJTU0yNF9NRU0pLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmYmNlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFJJLCBSTTApLCBSRDJ9fSwKLXsgIm1vdmh1IiwJMHhmYmRlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSRDIsIE1FTTIoUkksIFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYzYwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGZjYmMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZmNhYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoteyAibW92aHUiLAkweGZjNzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3ZodSIsCTB4ZmM5MzAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmYzgzMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCi17ICJtb3ZodSIsCTB4ZmU0YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNMihJTU0zMl9ISUdIOCxSTTApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZTVhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmZWNhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LCBTUCksIFJOMn19LAoteyAibW92aHUiLAkweGZlZGEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNMihJTU0zMl9ISUdIOCwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZmU0ZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNKElNTTMyX0hJR0g4X01FTSksIFJOMn19LAoteyAibW92aHUiLAkweGZiNWUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNKElNTThfTUVNKX19LAoteyAibW92aHUiLAkweGZkNWUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNKElNTTI0X01FTSl9fSwKLXsgIm1vdmh1IiwJMHhmZTVlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTShJTU0zMl9ISUdIOF9NRU0pfX0sCi17ICJtb3ZodSIsCTB4ZmJlYTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q3LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBTSU1NOCksIFJOMn19LAoteyAibW92aHUiLAkweGZiZmEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsCUZNVF9ENywgQU0zMywJe1JNMiwgTUVNSU5DMiAoUk4wLCBTSU1NOCl9fSwKLXsgIm1vdmh1IiwJMHhmZGVhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDIyLCBGTVRfRDgsIEFNMzMsCXtNRU1JTkMyIChSTTAsIElNTTI0KSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmRmYTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU1JTkMyIChSTjAsIElNTTI0KX19LAoteyAibW92aHUiLAkweGZlZWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9EOSwgQU0zMywJe01FTUlOQzIgKFJNMCwgSU1NMzJfSElHSDgpLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZWZhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDksIEFNMzMsCXtSTjIsIE1FTUlOQzIgKFJNMCwgSU1NMzJfSElHSDgpfX0sCi0KLXsgImV4dCIsCTB4ZjJkMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi17ICJleHQiLAkweGY5MTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiZXh0YiIsCTB4ZjkyODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImV4dGIiLAkweDEwLCAJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAoteyAiZXh0YiIsCTB4ZjkyODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJleHRidSIsCTB4ZjkzODAwLCAgICAweGZmZmYwMCwJICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZXh0YnUiLAkweDE0LAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi17ICJleHRidSIsCTB4ZjkzODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJleHRoIiwJMHhmOTQ4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZXh0aCIsCTB4MTgsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLXsgImV4dGgiLAkweGY5NDgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiZXh0aHUiLAkweGY5NTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJleHRodSIsCTB4MWMsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLXsgImV4dGh1IiwJMHhmOTU4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgIm1vdm0iLAkweGNlMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTShTUCksIFJFR1N9fSwKLXsgIm1vdm0iLAkweGNmMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1JFR1MsIE1FTShTUCl9fSwKLXsgIm1vdm0iLAkweGY4Y2UwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMywJe01FTShVU1ApLCBSRUdTfX0sCi17ICJtb3ZtIiwJMHhmOGNmMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzMsCXtSRUdTLCBNRU0oVVNQKX19LAotCi17ICJjbHIiLAkweDAwLAkgICAgIDB4ZjMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4xfX0sCi17ICJjbHIiLAkweGY5NjgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiYWRkIiwJMHhmYjdjMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJhZGQiLAkweGUwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFkZCIsCTB4ZjE2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgImFkZCIsCTB4ZjE1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgImFkZCIsCTB4ZjE3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBBTjB9fSwKLXsgImFkZCIsCTB4MjgwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEROMH19LAoteyAiYWRkIiwJMHhmYWMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAiYWRkIiwJMHgyMDAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgQU4wfX0sCi17ICJhZGQiLAkweGZhZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgQU4wfX0sCi17ICJhZGQiLAkweGY4ZmUwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBTUH19LAoteyAiYWRkIiwJMHhmYWZlMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIFNQfX0sCi17ICJhZGQiLAkweGY5NzgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJhZGQiLAkweGZjYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImFkZCIsCTB4ZmNkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAiYWRkIiwJMHhmY2ZlMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgU1B9fSwKLXsgImFkZCIsCTB4ZmI3ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgImFkZCIsCTB4ZmQ3ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJhZGQiLAkweGZlNzgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgImFkZGMiLAkweGZiOGMwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImFkZGMiLAkweGYxNDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhZGRjIiwJMHhmOTg4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiYWRkYyIsCTB4ZmI4ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgImFkZGMiLAkweGZkODgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAiYWRkYyIsCTB4ZmU4ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAic3ViIiwJMHhmYjljMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJzdWIiLAkweGYxMDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJzdWIiLAkweGYxMjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJzdWIiLAkweGYxMTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJzdWIiLAkweGYxMzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgQU4wfX0sCi17ICJzdWIiLAkweGY5OTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJzdWIiLAkweGZjYzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInN1YiIsCTB4ZmNkNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAic3ViIiwJMHhmYjk4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAic3ViIiwJMHhmZDk4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgInN1YiIsCTB4ZmU5ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAic3ViYyIsCTB4ZmE4YzAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAic3ViYyIsCTB4ZjE4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInN1YmMiLAkweGY5YTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJzdWJjIiwJMHhmYmE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAic3ViYyIsCTB4ZmRhODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJzdWJjIiwJMHhmZWE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJtdWwiLAkweGZiYWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAibXVsIiwJMHhmMjQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAibXVsIiwJMHhmOWE5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibXVsIiwJMHhmYmE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAibXVsIiwJMHhmZGE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgIm11bCIsCTB4ZmVhOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAibXVsdSIsCTB4ZmJiZDAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtdWx1IiwJMHhmMjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAibXVsdSIsCTB4ZjliOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm11bHUiLAkweGZiYjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgIm11bHUiLAkweGZkYjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJtdWx1IiwJMHhmZWI5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJkaXYiLAkweGYyNjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJkaXYiLAkweGY5YzkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi0KLXsgImRpdnUiLAkweGYyNzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJkaXZ1IiwJMHhmOWQ5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAotCi17ICJpbmMiLAkweDQwLAkgICAgIDB4ZjMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4xfX0sCi17ICJpbmMiLAkweDQxLAkgICAgIDB4ZjMsCSAgMCwgICAgRk1UX1MwLCAwLAl7QU4xfX0sCi17ICJpbmMiLAkweGY5YjgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiaW5jNCIsCTB4NTAsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtBTjB9fSwKLXsgImluYzQiLAkweGY5YzgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiY21wIiwJMHhhMDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgRE4wMX19LAoteyAiY21wIiwJMHhhMCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJjbXAiLAkweGYxYTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJjbXAiLAkweGYxOTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJjbXAiLAkweGIwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0lNTTgsIEFOMDF9fSwKLXsgImNtcCIsCTB4YjAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtBTTEsIEFOMH19LAoteyAiY21wIiwJMHhmYWM4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAiY21wIiwJMHhmYWQ4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgQU4wfX0sCi17ICJjbXAiLAkweGY5ZDgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJjbXAiLAkweGZjYzgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImNtcCIsCTB4ZmNkODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAiY21wIiwJMHhmYmQ4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAiY21wIiwJMHhmZGQ4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgImNtcCIsCTB4ZmVkODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAiYW5kIiwJMHhmYjBkMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJhbmQiLAkweGYyMDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhbmQiLAkweGY4ZTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAiYW5kIiwJMHhmYWUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCi17ICJhbmQiLAkweGZhZmMwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBQU1d9fSwKLXsgImFuZCIsCTB4ZmNmYzAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMzLAl7SU1NMzIsIEVQU1d9fSwKLXsgImFuZCIsCTB4ZjkwOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImFuZCIsCTB4ZmNlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAiYW5kIiwJMHhmYjA5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJhbmQiLAkweGZkMDkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJhbmQiLAkweGZlMDkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgIm9yIiwJCTB4ZmIxZDAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAib3IiLAkJMHhmMjEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAib3IiLAkJMHhmOGU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgIm9yIiwJCTB4ZmFlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoteyAib3IiLAkJMHhmYWZkMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgUFNXfX0sCi17ICJvciIsCQkweGZjZmQwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENCwgQU0zMywJe0lNTTMyLCBFUFNXfX0sCi17ICJvciIsCQkweGY5MTkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJvciIsCQkweGZjZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgIm9yIiwJCTB4ZmIxOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAib3IiLAkJMHhmZDE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAib3IiLAkJMHhmZTE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJ4b3IiLAkweGZiMmQwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgInhvciIsCTB4ZjIyMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInhvciIsCTB4ZmFlODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoteyAieG9yIiwJMHhmOTI5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAieG9yIiwJMHhmY2U4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ4b3IiLAkweGZiMjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgInhvciIsCTB4ZmQyOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgInhvciIsCTB4ZmUyOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAibm90IiwJMHhmMjMwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKLXsgIm5vdCIsCTB4ZjkzOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJidHN0IiwJMHhmOGVjMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImJ0c3QiLAkweGZhZWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgImJ0c3QiLAkweGZjZWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLS8qIFBsYWNlIHRoZXNlIGJlZm9yZSB0aGUgb25lcyB3aXRoIElNTThFIGFuZCBTRDhOX1NISUZUOCBzaW5jZSB3ZSB3YW50IHRoZQotICAgdGhlbSB0byBtYXRjaCBsYXN0IHNpbmNlIHRoZXkgZG8gbm90IHByb21vdGUuICAqLwoteyAiYnRzdCIsCTB4ZmJlOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAiYnRzdCIsCTB4ZmRlOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgImJ0c3QiLAkweGZlZTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJidHN0IiwJMHhmZTAyMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDUsIDAsCXtJTU04RSwgTUVNKElNTTMyX0xPV1NISUZUOCl9fSwKLXsgImJ0c3QiLAkweGZhZjgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgCXtJTU04LCBNRU0yKFNEOE5fU0hJRlQ4LCBBTjApfX0sCi0KLXsgImJzZXQiLAkweGYwODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgImJzZXQiLAkweGZlMDAwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENSwgMCwJe0lNTThFLCBNRU0oSU1NMzJfTE9XU0hJRlQ4KX19LAoteyAiYnNldCIsCTB4ZmFmMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NOCwgTUVNMihTRDhOX1NISUZUOCwgQU4wKX19LAotCi17ICJiY2xyIiwJMHhmMDkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJiY2xyIiwJMHhmZTAxMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDUsIDAsCXtJTU04RSwgTUVNKElNTTMyX0xPV1NISUZUOCl9fSwKLXsgImJjbHIiLAkweGZhZjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTgsIE1FTTIoU0Q4Tl9TSElGVDgsQU4wKX19LAotCi17ICJhc3IiLAkweGZiNGQwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImFzciIsCTB4ZjJiMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFzciIsCTB4ZjhjODAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJhc3IiLAkweGY5NDkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJhc3IiLAkweGZiNDkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgImFzciIsCTB4ZmQ0OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgImFzciIsCTB4ZmU0OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImFzciIsCTB4ZjhjODAxLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE4wfX0sCi17ICJhc3IiLAkweGZiNDkwMDAxLCAgMHhmZmZmMDBmZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JOMDJ9fSwKLQoteyAibHNyIiwJMHhmYjVkMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJsc3IiLAkweGYyYTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJsc3IiLAkweGY4YzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAibHNyIiwJMHhmOTU5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibHNyIiwJMHhmYjU5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJsc3IiLAkweGZkNTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJsc3IiLAkweGZlNTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJsc3IiLAkweGY4YzQwMSwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0ROMH19LAoteyAibHNyIiwJMHhmYjU5MDAwMSwgIDB4ZmZmZjAwZmYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImFzbCIsCTB4ZmI2ZDAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiYXNsIiwJMHhmMjkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiYXNsIiwJMHhmOGMwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImFzbCIsCTB4Zjk2OTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImFzbCIsCTB4ZmI2OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgImFzbCIsCTB4ZmQ2OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgImFzbCIsCTB4ZmU2OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImFzbCIsCTB4ZjhjMDAxLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE4wfX0sCi17ICJhc2wiLAkweGZiNjkwMDAxLCAgMHhmZmZmMDBmZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JOMDJ9fSwKLQoteyAiYXNsMiIsCTB4NTQsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLXsgImFzbDIiLAkweGY5NzkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAicm9yIiwJMHhmMjg0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKLXsgInJvciIsCTB4Zjk4OTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJyb2wiLAkweGYyODAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAoteyAicm9sIiwJMHhmOTk5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImJlcSIsCTB4YzgwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5lIiwJMHhjOTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJiZ3QiLAkweGMxMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJnZSIsCTB4YzIwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmxlIiwJMHhjMzAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibHQiLAkweGMwMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJoaSIsCTB4YzUwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmNjIiwJMHhjNjAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibHMiLAkweGM3MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJjcyIsCTB4YzQwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYnZjIiwJMHhmOGU4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJidnMiLAkweGY4ZTkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJuYyIsCTB4ZjhlYTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5zIiwJMHhmOGViMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJicmEiLAkweGNhMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLQoteyAibGVxIiwJMHhkOCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibG5lIiwJMHhkOSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGd0IiwJMHhkMSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGdlIiwJMHhkMiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGxlIiwJMHhkMywJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGx0IiwJMHhkMCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGhpIiwJMHhkNSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGNjIiwJMHhkNiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGxzIiwJMHhkNywJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGNzIiwJMHhkNCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibHJhIiwJMHhkYSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAic2V0bGIiLAkweGRiLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi0KLXsgImptcCIsCTB4ZjBmNCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7UEFSRU4sQU4wLFBBUkVOfX0sCi17ICJqbXAiLAkweGNjMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0lNTTE2X1BDUkVMfX0sCi17ICJqbXAiLAkweGRjMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNCwgMCwJe0lNTTMyX0hJR0gyNH19LAoteyAiY2FsbCIsCTB4Y2QwMDAwMDAsICAweGZmMDAwMDAwLCAgMCwgICAgRk1UX1M0LCAwLAl7RDE2X1NISUZULFJFR1MsSU1NOEV9fSwKLXsgImNhbGwiLAkweGRkMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNiwgMCwJe0lNTTMyX0hJR0gyNF9MT1dTSElGVDE2LCBSRUdTRV9TSElGVDgsSU1NOEV9fSwKLXsgImNhbGxzIiwJMHhmMGYwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtQQVJFTixBTjAsUEFSRU59fSwKLXsgImNhbGxzIiwJMHhmYWZmMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNl9QQ1JFTH19LAoteyAiY2FsbHMiLAkweGZjZmYwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyX1BDUkVMfX0sCi0KLXsgInJldCIsCTB4ZGYwMDAwLCAgICAweGZmMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7UkVHU19TSElGVDgsIElNTTh9fSwKLXsgInJldGYiLAkweGRlMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe1JFR1NfU0hJRlQ4LCBJTU04fX0sCi17ICJyZXRzIiwJMHhmMGZjLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInJ0aSIsCTB4ZjBmZCwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJ0cmFwIiwJMHhmMGZlLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInJ0bSIsCTB4ZjBmZiwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJub3AiLAkweGNiLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi0KLS8qIFVERiBpbnN0cnVjdGlvbnMuICAqLwoteyAidWRmMDAiLAkweGY2MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMCIsCTB4ZjkwMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDAiLAkweGZiMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAwIiwJMHhmZDAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZjYxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjAxIiwJMHhmOTEwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZmIxMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDEiLAkweGZkMTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjAyIiwJMHhmNjIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDIiLAkweGY5MjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjAyIiwJMHhmYjIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwMiIsCTB4ZmQyMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDMiLAkweGY2MzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMyIsCTB4ZjkzMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDMiLAkweGZiMzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAzIiwJMHhmZDMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZjY0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA0IiwJMHhmOTQwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZmI0MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDQiLAkweGZkNDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA1IiwJMHhmNjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDUiLAkweGY5NTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA1IiwJMHhmYjUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwNSIsCTB4ZmQ1MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDYiLAkweGY2NjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwNiIsCTB4Zjk2MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDYiLAkweGZiNjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA2IiwJMHhmZDYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZjY3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA3IiwJMHhmOTcwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZmI3MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDciLAkweGZkNzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA4IiwJMHhmNjgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDgiLAkweGY5ODAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA4IiwJMHhmYjgwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwOCIsCTB4ZmQ4MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDkiLAkweGY2OTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwOSIsCTB4Zjk5MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDkiLAkweGZiOTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA5IiwJMHhmZDkwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZjZhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEwIiwJMHhmOWEwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZmJhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTAiLAkweGZkYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjExIiwJMHhmNmIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTEiLAkweGY5YjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjExIiwJMHhmYmIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxMSIsCTB4ZmRiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTIiLAkweGY2YzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxMiIsCTB4ZjljMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTIiLAkweGZiYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjEyIiwJMHhmZGMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZjZkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEzIiwJMHhmOWQwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZmJkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTMiLAkweGZkZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjE0IiwJMHhmNmUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTQiLAkweGY5ZTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjE0IiwJMHhmYmUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxNCIsCTB4ZmRlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTUiLAkweGY2ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxNSIsCTB4ZjlmMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTUiLAkweGZiZjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjE1IiwJMHhmZGYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYyMCIsCTB4ZjUwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjIxIiwJMHhmNTEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjIiLAkweGY1MjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyMyIsCTB4ZjUzMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI0IiwJMHhmNTQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjUiLAkweGY1NTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyNiIsCTB4ZjU2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI3IiwJMHhmNTcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjgiLAkweGY1ODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyOSIsCTB4ZjU5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMwIiwJMHhmNWEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzEiLAkweGY1YjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzMiIsCTB4ZjVjMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMzIiwJMHhmNWQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzQiLAkweGY1ZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzNSIsCTB4ZjVmMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZnUwMCIsCTB4ZjkwNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDAiLAkweGZiMDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAwIiwJMHhmZDA0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDEiLAkweGY5MTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTAxIiwJMHhmYjE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwMSIsCTB4ZmQxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTAyIiwJMHhmOTI0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwMiIsCTB4ZmIyNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDIiLAkweGZkMjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwMyIsCTB4ZjkzNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDMiLAkweGZiMzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAzIiwJMHhmZDM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDQiLAkweGY5NDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA0IiwJMHhmYjQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNCIsCTB4ZmQ0NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA1IiwJMHhmOTU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwNSIsCTB4ZmI1NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDUiLAkweGZkNTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwNiIsCTB4Zjk2NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDYiLAkweGZiNjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA2IiwJMHhmZDY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDciLAkweGY5NzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA3IiwJMHhmYjc0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNyIsCTB4ZmQ3NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA4IiwJMHhmOTg0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwOCIsCTB4ZmI4NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDgiLAkweGZkODQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwOSIsCTB4Zjk5NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDkiLAkweGZiOTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA5IiwJMHhmZDk0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTAiLAkweGY5YTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTEwIiwJMHhmYmE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMCIsCTB4ZmRhNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTExIiwJMHhmOWI0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxMSIsCTB4ZmJiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTEiLAkweGZkYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxMiIsCTB4ZjljNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTIiLAkweGZiYzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTEyIiwJMHhmZGM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTMiLAkweGY5ZDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTEzIiwJMHhmYmQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMyIsCTB4ZmRkNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTE0IiwJMHhmOWU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxNCIsCTB4ZmJlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTQiLAkweGZkZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxNSIsCTB4ZjlmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTUiLAkweGZiZjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTE1IiwJMHhmZGY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi0KLXsgInB1dHgiLAkweGY1MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0ROMDF9fSwKLXsgImdldHgiLAkweGY2ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0ROMDF9fSwKLXsgIm11bHEiLAkweGY2MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJtdWxxIiwJMHhmOTAwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtTSU1NOCwgRE4wfX0sCi17ICJtdWxxIiwJMHhmYjAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIEFNMzAsCXtTSU1NMTYsIEROMH19LAoteyAibXVscSIsCTB4ZmQwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMwLAl7SU1NMzIsIEROMH19LAoteyAibXVscXUiLAkweGY2MTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZjkxNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7U0lNTTgsIEROMH19LAoteyAibXVscXUiLAkweGZiMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgQU0zMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZmQxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMwLAl7SU1NMzIsIEROMH19LAoteyAic2F0MTYiLAkweGY2NDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJzYXQxNiIsCTB4ZjlhYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLQoteyAic2F0MjQiLAkweGY2NTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJzYXQyNCIsCTB4ZmJhZjAwMDAsICAweGZmZmYwMGZmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLQoteyAiYnNjaCIsCTB4ZmJmZjAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiYnNjaCIsCTB4ZjY3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKLXsgImJzY2giLAkweGY5ZmIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdlIG5lZWQgc29tZSBpbnN0cnVjdGlvbiB0byB0cmlnZ2VyICJlbXVsYXRlZCBzeXNjYWxscyIKLSAgIGZvciBvdXIgc2ltdWxhdG9yLiAgKi8KLXsgInN5c2NhbGwiLAkweGYwZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0lNTTR9fSwKLXsgInN5c2NhbGwiLCAgICAweGYwYzAsICAgICAgMHhmZmZmLCAgICAgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAotCi0vKiBFeHRlbnNpb24uICBXaGVuIHRhbGtpbmcgdG8gdGhlIHNpbXVsYXRvciwgZ2RiIHJlcXVpcmVzIHNvbWUgaW5zdHJ1Y3Rpb24KLSAgIHRoYXQgd2lsbCB0cmlnZ2VyIGEgImJyZWFrcG9pbnQiIChyZWFsbHkganVzdCBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzbid0Ci0gICBvdGhlcndpc2UgdXNlZCBieSB0aGUgdG9vbHMuICBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgdGhlIHNhbWUgc2l6ZQotICAgYXMgdGhlIHNtYWxsZXN0IGluc3RydWN0aW9uIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gIEluIHRoZSBjYXNlIG9mIHRoZQotICAgbW4xMHgwMCB0aGUgImJyZWFrIiBpbnN0cnVjdGlvbiBtdXN0IGJlIG9uZSBieXRlLiAgMHhmZiBpcyBhdmFpbGFibGUgb24KLSAgIGJvdGggbW4xMHgwMCBhcmNoaXRlY3R1cmVzLiAgKi8KLXsgImJyZWFrIiwJMHhmZiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAotCi17ICJhZGRfYWRkIiwJMHhmNzAwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2FkZCIsCTB4ZjcxMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfYWRkIiwJMHhmNzA0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9hZGQiLAkweGY3MTQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9zdWIiLAkweGY3MjAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfc3ViIiwJMHhmNzMwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9zdWIiLAkweGY3MjQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX3N1YiIsCTB4ZjczNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX2NtcCIsCTB4Zjc0MDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9jbXAiLAkweGY3NTAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX2NtcCIsCTB4Zjc0NDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfY21wIiwJMHhmNzU0MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfbW92IiwJMHhmNzYwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX21vdiIsCTB4Zjc3MDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfbW92IiwJMHhmNzY0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9tb3YiLAkweGY3NzQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9hc3IiLAkweGY3ODAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYXNyIiwJMHhmNzkwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYWRkX2FzciIsCTB4Zjc4NDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYXNyIiwJMHhmNzk0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9sc3IiLAkweGY3YTAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfbHNyIiwJMHhmN2IwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYWRkX2xzciIsCTB4ZjdhNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfbHNyIiwJMHhmN2I0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9hc2wiLAkweGY3YzAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYXNsIiwJMHhmN2QwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYWRkX2FzbCIsCTB4ZjdjNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYXNsIiwJMHhmN2Q0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hZGQiLAkweGY3MDEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYWRkIiwJMHhmNzExMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hZGQiLAkweGY3MDUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX2FkZCIsCTB4ZjcxNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiY21wX3N1YiIsCTB4ZjcyMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9zdWIiLAkweGY3MzEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiY21wX3N1YiIsCTB4ZjcyNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfc3ViIiwJMHhmNzM1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJjbXBfbW92IiwJMHhmNzYxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX21vdiIsCTB4Zjc3MTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJjbXBfbW92IiwJMHhmNzY1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9tb3YiLAkweGY3NzUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hc3IiLAkweGY3ODEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYXNyIiwJMHhmNzkxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiY21wX2FzciIsCTB4Zjc4NTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYXNyIiwJMHhmNzk1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9sc3IiLAkweGY3YTEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfbHNyIiwJMHhmN2IxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiY21wX2xzciIsCTB4ZjdhNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfbHNyIiwJMHhmN2I1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9hc2wiLAkweGY3YzEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYXNsIiwJMHhmN2QxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiY21wX2FzbCIsCTB4ZjdjNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYXNsIiwJMHhmN2Q1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9hZGQiLAkweGY3MDIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfYWRkIiwJMHhmNzEyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9hZGQiLAkweGY3MDYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2FkZCIsCTB4ZjcxNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX3N1YiIsCTB4ZjcyMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9zdWIiLAkweGY3MzIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX3N1YiIsCTB4ZjcyNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfc3ViIiwJMHhmNzM2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfY21wIiwJMHhmNzQyMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2NtcCIsCTB4Zjc1MjAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfY21wIiwJMHhmNzQ2MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9jbXAiLAkweGY3NTYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9tb3YiLAkweGY3NjIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfbW92IiwJMHhmNzcyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9tb3YiLAkweGY3NjYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX21vdiIsCTB4Zjc3NjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX2FzciIsCTB4Zjc4MjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hc3IiLAkweGY3OTIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzdWJfYXNyIiwJMHhmNzg2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hc3IiLAkweGY3OTYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3ViX2xzciIsCTB4ZjdhMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9sc3IiLAkweGY3YjIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzdWJfbHNyIiwJMHhmN2E2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9sc3IiLAkweGY3YjYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3ViX2FzbCIsCTB4ZjdjMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hc2wiLAkweGY3ZDIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzdWJfYXNsIiwJMHhmN2M2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hc2wiLAkweGY3ZDYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAibW92X2FkZCIsCTB4ZjcwMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9hZGQiLAkweGY3MTMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X2FkZCIsCTB4ZjcwNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfYWRkIiwJMHhmNzE3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3Zfc3ViIiwJMHhmNzIzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X3N1YiIsCTB4ZjczMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3Zfc3ViIiwJMHhmNzI3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9zdWIiLAkweGY3MzcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9jbXAiLAkweGY3NDMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfY21wIiwJMHhmNzUzMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9jbXAiLAkweGY3NDcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2NtcCIsCTB4Zjc1NzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X21vdiIsCTB4Zjc2MzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9tb3YiLAkweGY3NzMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X21vdiIsCTB4Zjc2NzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfbW92IiwJMHhmNzc3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3ZfYXNyIiwJMHhmNzgzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FzciIsCTB4Zjc5MzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9hc3IiLAkweGY3ODcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FzciIsCTB4Zjc5NzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJtb3ZfbHNyIiwJMHhmN2EzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2xzciIsCTB4ZjdiMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9sc3IiLAkweGY3YTcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2xzciIsCTB4ZjdiNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJtb3ZfYXNsIiwJMHhmN2MzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FzbCIsCTB4ZjdkMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9hc2wiLAkweGY3YzcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FzbCIsCTB4ZjdkNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJhbmRfYWRkIiwJMHhmNzA4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX2FkZCIsCTB4ZjcxODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhbmRfc3ViIiwJMHhmNzI4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX3N1YiIsCTB4ZjczODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhbmRfY21wIiwJMHhmNzQ4MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX2NtcCIsCTB4Zjc1ODAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhbmRfbW92IiwJMHhmNzY4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX21vdiIsCTB4Zjc3ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhbmRfYXNyIiwJMHhmNzg4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX2FzciIsCTB4Zjc5ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFuZF9sc3IiLAkweGY3YTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhbmRfbHNyIiwJMHhmN2I4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYW5kX2FzbCIsCTB4ZjdjODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFuZF9hc2wiLAkweGY3ZDgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJkbWFjaF9hZGQiLAkweGY3MDkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJkbWFjaF9hZGQiLAkweGY3MTkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfc3ViIiwJMHhmNzI5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfc3ViIiwJMHhmNzM5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImRtYWNoX2NtcCIsCTB4Zjc0OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImRtYWNoX2NtcCIsCTB4Zjc1OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJkbWFjaF9tb3YiLAkweGY3NjkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJkbWFjaF9tb3YiLAkweGY3NzkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfYXNyIiwJMHhmNzg5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfYXNyIiwJMHhmNzk5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfbHNyIiwJMHhmN2E5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfbHNyIiwJMHhmN2I5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfYXNsIiwJMHhmN2M5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfYXNsIiwJMHhmN2Q5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAieG9yX2FkZCIsCTB4ZjcwYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9hZGQiLAkweGY3MWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAieG9yX3N1YiIsCTB4ZjcyYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9zdWIiLAkweGY3M2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAieG9yX2NtcCIsCTB4Zjc0YTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9jbXAiLAkweGY3NWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAieG9yX21vdiIsCTB4Zjc2YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9tb3YiLAkweGY3N2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAieG9yX2FzciIsCTB4Zjc4YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9hc3IiLAkweGY3OWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJ4b3JfbHNyIiwJMHhmN2FhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAieG9yX2xzciIsCTB4ZjdiYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInhvcl9hc2wiLAkweGY3Y2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJ4b3JfYXNsIiwJMHhmN2RhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3dod19hZGQiLAkweGY3MGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X2FkZCIsCTB4ZjcxYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzd2h3X3N1YiIsCTB4ZjcyYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN3aHdfc3ViIiwJMHhmNzNiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN3aHdfY21wIiwJMHhmNzRiMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3dod19jbXAiLAkweGY3NWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3dod19tb3YiLAkweGY3NmIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X21vdiIsCTB4Zjc3YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzd2h3X2FzciIsCTB4Zjc4YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN3aHdfYXNyIiwJMHhmNzliMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3dod19sc3IiLAkweGY3YWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X2xzciIsCTB4ZjdiYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN3aHdfYXNsIiwJMHhmN2NiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3dod19hc2wiLAkweGY3ZGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJvcl9hZGQiLAkweGY3MGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJvcl9hZGQiLAkweGY3MWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAib3Jfc3ViIiwJMHhmNzJjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3Jfc3ViIiwJMHhmNzNjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm9yX2NtcCIsCTB4Zjc0YzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm9yX2NtcCIsCTB4Zjc1YzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJvcl9tb3YiLAkweGY3NmMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJvcl9tb3YiLAkweGY3N2MwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAib3JfYXNyIiwJMHhmNzhjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3JfYXNyIiwJMHhmNzljMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAib3JfbHNyIiwJMHhmN2FjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3JfbHNyIiwJMHhmN2JjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAib3JfYXNsIiwJMHhmN2NjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3JfYXNsIiwJMHhmN2RjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic2F0MTZfYWRkIiwJMHhmNzBkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic2F0MTZfYWRkIiwJMHhmNzFkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X3N1YiIsCTB4ZjcyZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X3N1YiIsCTB4ZjczZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzYXQxNl9jbXAiLAkweGY3NGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzYXQxNl9jbXAiLAkweGY3NWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic2F0MTZfbW92IiwJMHhmNzZkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic2F0MTZfbW92IiwJMHhmNzdkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X2FzciIsCTB4Zjc4ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X2FzciIsCTB4Zjc5ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X2xzciIsCTB4ZjdhZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X2xzciIsCTB4ZjdiZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X2FzbCIsCTB4ZjdjZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X2FzbCIsCTB4ZjdkZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLS8qIFVnaC4gIFN5bnRoZXRpYyBpbnN0cnVjdGlvbnMuICAqLwoteyAiYWRkX2FuZCIsCTB4ZjcwODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9hbmQiLAkweGY3MTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX2RtYWNoIiwJMHhmNzA5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX2RtYWNoIiwJMHhmNzE5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9vciIsCTB4ZjcwYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9vciIsCTB4ZjcxYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfc2F0MTYiLAkweGY3MGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfc2F0MTYiLAkweGY3MWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX3N3aHciLAkweGY3MGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfc3dodyIsCTB4ZjcxYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfeG9yIiwJMHhmNzBhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX3hvciIsCTB4ZjcxYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfYWRkIiwJMHhmN2MwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2FkZCIsCTB4ZjdkMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9hZGQiLAkweGY3YzQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX2FkZCIsCTB4ZjdkNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc2xfYW5kIiwJMHhmN2M4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2FuZCIsCTB4ZjdkODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9jbXAiLAkweGY3YzEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfY21wIiwJMHhmN2QxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONCwgfX0sCi17ICJhc2xfY21wIiwJMHhmN2M1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9jbXAiLAkweGY3ZDUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX2RtYWNoIiwJMHhmN2M5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2RtYWNoIiwJMHhmN2Q5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX21vdiIsCTB4ZjdjMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9tb3YiLAkweGY3ZDMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfbW92IiwJMHhmN2M3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9tb3YiLAkweGY3ZDcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX29yIiwJMHhmN2NjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX29yIiwJMHhmN2RjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3NhdDE2IiwJMHhmN2NkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3NhdDE2IiwJMHhmN2RkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3N1YiIsCTB4ZjdjMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9zdWIiLAkweGY3ZDIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfc3ViIiwJMHhmN2M2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9zdWIiLAkweGY3ZDYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX3N3aHciLAkweGY3Y2IwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfc3dodyIsCTB4ZjdkYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF94b3IiLAkweGY3Y2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfeG9yIiwJMHhmN2RhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX2FkZCIsCTB4Zjc4MDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9hZGQiLAkweGY3OTAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfYWRkIiwJMHhmNzg0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9hZGQiLAkweGY3OTQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNyX2FuZCIsCTB4Zjc4ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9hbmQiLAkweGY3OTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfY21wIiwJMHhmNzgxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX2NtcCIsCTB4Zjc5MTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjQsIH19LAoteyAiYXNyX2NtcCIsCTB4Zjc4NTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3JfY21wIiwJMHhmNzk1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9kbWFjaCIsCTB4Zjc4OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9kbWFjaCIsCTB4Zjc5OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9tb3YiLAkweGY3ODMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfbW92IiwJMHhmNzkzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX21vdiIsCTB4Zjc4NzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3JfbW92IiwJMHhmNzk3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9vciIsCTB4Zjc4YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9vciIsCTB4Zjc5YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9zYXQxNiIsCTB4Zjc4ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9zYXQxNiIsCTB4Zjc5ZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9zdWIiLAkweGY3ODIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3Jfc3ViIiwJMHhmNzkyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3N1YiIsCTB4Zjc4NjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3Jfc3ViIiwJMHhmNzk2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9zd2h3IiwJMHhmNzhiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3N3aHciLAkweGY3OWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfeG9yIiwJMHhmNzhhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3hvciIsCTB4Zjc5YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9hbmQiLAkweGY3NDgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfYW5kIiwJMHhmNzU4MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9kbWFjaCIsCTB4Zjc0OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9kbWFjaCIsCTB4Zjc1OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfb3IiLAkweGY3NGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfb3IiLAkweGY3NWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3NhdDE2IiwJMHhmNzRkMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3NhdDE2IiwJMHhmNzVkMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9zd2h3IiwJMHhmNzRiMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3N3aHciLAkweGY3NWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3hvciIsCTB4Zjc0YTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF94b3IiLAkweGY3NWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX2FkZCIsCTB4ZjdhMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9hZGQiLAkweGY3YjAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfYWRkIiwJMHhmN2E0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9hZGQiLAkweGY3YjQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAibHNyX2FuZCIsCTB4ZjdhODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9hbmQiLAkweGY3YjgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfY21wIiwJMHhmN2ExMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX2NtcCIsCTB4ZjdiMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjQsIH19LAoteyAibHNyX2NtcCIsCTB4ZjdhNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3JfY21wIiwJMHhmN2I1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9kbWFjaCIsCTB4ZjdhOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9kbWFjaCIsCTB4ZjdiOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9tb3YiLAkweGY3YTMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfbW92IiwJMHhmN2IzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX21vdiIsCTB4ZjdhNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3JfbW92IiwJMHhmN2I3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9vciIsCTB4ZjdhYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9vciIsCTB4ZjdiYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9zYXQxNiIsCTB4ZjdhZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9zYXQxNiIsCTB4ZjdiZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9zdWIiLAkweGY3YTIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3Jfc3ViIiwJMHhmN2IyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3N1YiIsCTB4ZjdhNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3Jfc3ViIiwJMHhmN2I2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9zd2h3IiwJMHhmN2FiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3N3aHciLAkweGY3YmIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfeG9yIiwJMHhmN2FhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3hvciIsCTB4ZjdiYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9hbmQiLAkweGY3NjgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3ZfYW5kIiwJMHhmNzc4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9kbWFjaCIsCTB4Zjc2OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9kbWFjaCIsCTB4Zjc3OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3Zfb3IiLAkweGY3NmMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3Zfb3IiLAkweGY3N2MwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3NhdDE2IiwJMHhmNzZkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3NhdDE2IiwJMHhmNzdkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9zd2h3IiwJMHhmNzZiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3N3aHciLAkweGY3N2IwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3hvciIsCTB4Zjc2YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl94b3IiLAkweGY3N2EwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX2FuZCIsCTB4ZjcyODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9hbmQiLAkweGY3MzgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX2RtYWNoIiwJMHhmNzI5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX2RtYWNoIiwJMHhmNzM5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9vciIsCTB4ZjcyYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9vciIsCTB4ZjczYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfc2F0MTYiLAkweGY3MmQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfc2F0MTYiLAkweGY3M2QwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX3N3aHciLAkweGY3MmIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfc3dodyIsCTB4ZjczYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfeG9yIiwJMHhmNzJhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX3hvciIsCTB4ZjczYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3ZfbGx0IiwJMHhmN2UwMDAwMCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGd0IiwJMHhmN2UwMDAwMSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGdlIiwJMHhmN2UwMDAwMiwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGxlIiwJMHhmN2UwMDAwMywgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGNzIiwJMHhmN2UwMDAwNCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGhpIiwJMHhmN2UwMDAwNSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGNjIiwJMHhmN2UwMDAwNiwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGxzIiwJMHhmN2UwMDAwNywgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbGVxIiwJMHhmN2UwMDAwOCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbG5lIiwJMHhmN2UwMDAwOSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJtb3ZfbHJhIiwJMHhmN2UwMDAwYSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsbHRfbW92IiwJMHhmN2UwMDAwMCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsZ3RfbW92IiwJMHhmN2UwMDAwMSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsZ2VfbW92IiwJMHhmN2UwMDAwMiwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsbGVfbW92IiwJMHhmN2UwMDAwMywgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsY3NfbW92IiwJMHhmN2UwMDAwNCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsaGlfbW92IiwJMHhmN2UwMDAwNSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsY2NfbW92IiwJMHhmN2UwMDAwNiwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsbHNfbW92IiwJMHhmN2UwMDAwNywgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsZXFfbW92IiwJMHhmN2UwMDAwOCwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJsbmVfbW92IiwJMHhmN2UwMDAwOSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi17ICJscmFfbW92IiwJMHhmN2UwMDAwYSwgIDB4ZmZmZjAwMGYsICAweDIyLCBGTVRfRDEwLCBBTTMzLAkge01FTUlOQzIgKFJONCxTSU1NNF8yKSwgUk02fX0sCi0gCi17IDAsIDAsIDAsIDAsIDAsIDAsIHswfX0sCi0KLX0gOwotCi1jb25zdCBpbnQgbW4xMDMwMF9udW1fb3Bjb2RlcyA9Ci0gIHNpemVvZiAobW4xMDMwMF9vcGNvZGVzKSAvIHNpemVvZiAobW4xMDMwMF9vcGNvZGVzWzBdKTsKLQotDApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWFzbS5jIGIvb3Bjb2Rlcy9tMzJyLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE2MmNlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKiBBc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tYXNtLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwYXJzZV9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgY29uc3QgY2hhciAqKiwgQ0dFTl9GSUVMRFMgKikpOwotDAotLyogLS0gYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gYXNtLmMgKi8KLQotLyogSGFuZGxlICcjJyBwcmVmaXhlcyAoaS5lLiBza2lwIG92ZXIgdGhlbSkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oYXNoIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEhhbmRsZSBzaGlnaCgpLCBoaWdoKCkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oaTE2IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLQotICBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAiaGlnaCgiLCA1KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDU7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTywKLQkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLSAgCSAgJiYgcmVzdWx0X3R5cGUgPT0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIpCi0JdmFsdWUgPj49IDE2OwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgInNoaWdoKCIsIDYpID09IDApCi0gICAgewotICAgICAgKnN0cnAgKz0gNjsKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPLAotIAkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLQkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlID0gKHZhbHVlID4+IDE2KSArICh2YWx1ZSAmIDB4ODAwMCA/IDEgOiAwKTsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApOwotfQotCi0vKiBIYW5kbGUgbG93KCkgaW4gYSBzaWduZWQgY29udGV4dC4gIEFsc28gaGFuZGxlIHNkYSgpLgotICAgVGhlIHNpZ25lZG5lc3Mgb2YgdGhlIHZhbHVlIGRvZXNuJ3QgbWF0dGVyIHRvIGxvdygpLCBidXQgdGhpcyBhbHNvCi0gICBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGxvdygpIGlzbid0IHByZXNlbnQuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9zbG8xNiAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBsb25nICp2YWx1ZXA7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdF90eXBlOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgImxvdygiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDQ7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9MTzE2LAotCQkJCSAgICZyZXN1bHRfdHlwZSwgJnZhbHVlKTsKLSAgICAgIGlmICgqKnN0cnAgIT0gJyknKQotCXJldHVybiAibWlzc2luZyBgKSciOwotICAgICAgKysqc3RycDsKLSAgICAgIGlmIChlcnJtc2cgPT0gTlVMTAotCSAgJiYgcmVzdWx0X3R5cGUgPT0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIpCi0JdmFsdWUgJj0gMHhmZmZmOwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgInNkYSgiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDQ7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9TREExNiwKLQkJCQkgICBOVUxMLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApOwotfQotCi0vKiBIYW5kbGUgbG93KCkgaW4gYW4gdW5zaWduZWQgY29udGV4dC4KLSAgIFRoZSBzaWduZWRuZXNzIG9mIHRoZSB2YWx1ZSBkb2Vzbid0IG1hdHRlciB0byBsb3coKSwgYnV0IHRoaXMgYWxzbwotICAgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBsb3coKSBpc24ndCBwcmVzZW50LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfdWxvMTYgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBpZiAoKipzdHJwID09ICcjJykKLSAgICArKypzdHJwOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJsb3coIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA0OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfTE8xNiwKLQkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLQkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlICY9IDB4ZmZmZjsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApOwotfQotCi0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIHBhcnNpbmcuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWNvbnN0IGNoYXIgKgotbTMycl9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBvcGluZGV4LCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBjaGFyICoqIHN0cnA7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotewotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgLyogVXNlZCBieSBzY2FsYXIgb3BlcmFuZHMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHBhcnNlZC4gICovCi0gIGxvbmcganVuazsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgJiBmaWVsZHMtPmZfYWNjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMsICYgZmllbGRzLT5mX2FjY2QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgJiBmaWVsZHMtPmZfYWNjcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9ESVNQMTYsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AxNiA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1AyNCwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9ESVNQOCwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hhc2ggKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfSEFTSCwgJmp1bmspOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9oaTE2IChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0hJMTYsICZmaWVsZHMtPmZfaGkxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9JTU0xLCAmZmllbGRzLT5mX2ltbTEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9TSU1NMTYsICZmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0lNTTgsICZmaWVsZHMtPmZfc2ltbTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZXJybXNnID0gcGFyc2Vfc2xvMTYgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0xPMTYsICZmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU0xNiwgJmZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU0yNCwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfdWltbTI0ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfVUlNTTQsICZmaWVsZHMtPmZfdWltbTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU01LCAmZmllbGRzLT5mX3VpbW01KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX3VsbzE2IChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VMTzE2LCAmZmllbGRzLT5mX3VpbW0xNik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHBhcnNpbmcuXG4iKSwgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLWNnZW5fcGFyc2VfZm4gKiBjb25zdCBtMzJyX2NnZW5fcGFyc2VfaGFuZGxlcnNbXSA9IAotewotICBwYXJzZV9pbnNuX25vcm1hbCwKLX07Ci0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X2FzbSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIG0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBtMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wYXJzZV9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX3BhcnNlX2hhbmRsZXJzWzBdOwotICBjZC0+cGFyc2Vfb3BlcmFuZCA9IG0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IGluc24gcGFyc2VyLgotCi0gICBUaGUgc3ludGF4IHN0cmluZyBpcyBzY2FubmVkIGFuZCBvcGVyYW5kcyBhcmUgcGFyc2VkIGFuZCBzdG9yZWQgaW4gRklFTERTLgotICAgUmVsb2NzIGFyZSBxdWV1ZWQgYXMgd2UgZ28gdmlhIG90aGVyIGNhbGxiYWNrcy4KLQotICAgPz8/IE5vdGUgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBhbiBhbGwtb3Itbm90aGluZyBwYXJzZXIuICBJZiB3ZSBmYWlsIHRvCi0gICBwYXJzZSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHJldHVybiAwIGFuZCB0aGUgY2FsbGVyIHdpbGwgc3RhcnQgb3ZlciBmcm9tCi0gICB0aGUgYmVnaW5uaW5nLiAgQmFja3RyYWNraW5nIHdpbGwgYmUgbmVjZXNzYXJ5IGluIHBhcnNpbmcgc3ViZXhwcmVzc2lvbnMsCi0gICBidXQgdGhhdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS4gIE5vdCBoYW5kbGluZyBiYWNrdHJhY2tpbmcgaGVyZSBtYXkgZ2V0Ci0gICBleHBlbnNpdmUgaW4gdGhlIGNhc2Ugb2YgdGhlIG02OGsuICBEZWFsIHdpdGggbGF0ZXIuCi0KLSAgIFJldHVybnMgTlVMTCBmb3Igc3VjY2VzcywgYW4gZXJyb3IgbWVzc2FnZSBmb3IgZmFpbHVyZS4KLSovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2luc25fbm9ybWFsIChjZCwgaW5zbiwgc3RycCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotewotICAvKiA/Pz8gUnVudGltZSBhZGRlZCBpbnNucyBub3QgaGFuZGxlZCB5ZXQuICAqLwotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGNvbnN0IGNoYXIgKnN0ciA9ICpzdHJwOwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICAvKiBGSVhNRTogd2lwICovCi0gIGludCBwYXN0X29wY29kZV9wOwotI2VuZGlmCi0KLSAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhlIG1uZW1vbmljIGlzIGZpcnN0ICh0aGVyZSBhcmUgbm8gbGVhZGluZyBvcGVyYW5kcykuCi0gICAgIFdlIGNhbiBwYXJzZSBpdCB3aXRob3V0IG5lZWRpbmcgdG8gc2V0IHVwIG9wZXJhbmQgcGFyc2luZy4KLSAgICAgR0FTJ3MgaW5wdXQgc2NydWJiZXIgd2lsbCBlbnN1cmUgbW5lbW9uaWNzIGFyZSBsb3dlcmNhc2UsIGJ1dCB3ZSBtYXkKLSAgICAgbm90IGJlIGNhbGxlZCBmcm9tIEdBUy4gICovCi0gIHAgPSBDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pOwotICB3aGlsZSAoKnAgJiYgdG9sb3dlciAoKnApID09IHRvbG93ZXIgKCpzdHIpKQotICAgICsrcCwgKytzdHI7Ci0KLSAgaWYgKCogcCkKLSAgICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci0KLSNpZm5kZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICBpZiAoKiBzdHIgJiYgIWlzc3BhY2UgKCogc3RyKSkKLSAgICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci0jZW5kaWYKLQotICBDR0VOX0lOSVRfUEFSU0UgKGNkKTsKLSAgY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgKGNkKTsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIHBhc3Rfb3Bjb2RlX3AgPSAwOwotI2VuZGlmCi0KLSAgLyogV2UgZG9uJ3QgY2hlY2sgZm9yICgqc3RyICE9ICdcMCcpIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHBhcnNlCi0gICAgIGFueSB0cmFpbGluZyBmYWtlIGFyZ3VtZW50cyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0gIHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsKLQotICAvKiBNbmVtb25pY3MgY29tZSBmaXJzdCBmb3Igbm93LCBlbnN1cmUgdmFsaWQgc3RyaW5nLiAgKi8KLSAgaWYgKCEgQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUCAoKiBzeW4pKQotICAgIGFib3J0ICgpOwotCi0gICsrc3luOwotCi0gIHdoaWxlICgqIHN5biAhPSAwKQotICAgIHsKLSAgICAgIC8qIE5vbiBvcGVyYW5kIGNoYXJzIG11c3QgbWF0Y2ggZXhhY3RseS4gICovCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqIHN5bikpCi0JewotCSAgLyogRklYTUU6IFdoaWxlIHdlIGFsbG93IGZvciBub24tR0FTIGNhbGxlcnMgYWJvdmUsIHdlIGFzc3VtZSB0aGUKLQkgICAgIGZpcnN0IGNoYXIgYWZ0ZXIgdGhlIG1uZW1vbmljIHBhcnQgaXMgYSBzcGFjZS4gICovCi0JICAvKiBGSVhNRTogV2UgYWxzbyB0YWtlIGluYXBwcm9wcmlhdGUgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQKLQkgICAgIEdBUydzIGlucHV0IHNjcnViYmVyIHdpbGwgcmVtb3ZlIGV4dHJhbmVvdXMgYmxhbmtzLiAgKi8KLQkgIGlmICgqc3RyID09IENHRU5fU1lOVEFYX0NIQVIgKCogc3luKSkKLQkgICAgewotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLQkgICAgICBpZiAoKiBzeW4gPT0gJyAnKQotCQlwYXN0X29wY29kZV9wID0gMTsKLSNlbmRpZgotCSAgICAgICsrIHN5bjsKLQkgICAgICArKyBzdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFN5bnRheCBjaGFyIGRpZG4ndCBtYXRjaC4gIENhbid0IGJlIHRoaXMgaW5zbi4gICovCi0JICAgICAgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gcmV0dXJuIHNvbWV0aGluZyBsaWtlCi0JCSAiZXhwZWN0ZWQgY2hhciBgYyciICovCi0JICAgICAgcmV0dXJuIF8oInN5bnRheCBlcnJvciIpOwotCSAgICB9Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZCBvZiBzb21lIHNvcnQuICAqLwotICAgICAgZXJybXNnID0gbTMycl9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCSAgJnN0ciwgZmllbGRzKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JcmV0dXJuIGVycm1zZzsKLQotICAgICAgLyogRG9uZSB3aXRoIHRoaXMgb3BlcmFuZCwgY29udGludWUgd2l0aCBuZXh0IG9uZS4gICovCi0gICAgICArKyBzeW47Ci0gICAgfQotCi0gIC8qIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHN5bnRheCBzdHJpbmcsIHdlJ3JlIGRvbmUuICAqLwotICBpZiAoKiBzeW4gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogRm9yIHRoZSBtb21lbnQgd2UgYXNzdW1lIGEgdmFsaWQgYHN0cicgY2FuIG9ubHkgY29udGFpbgotCSBibGFua3Mgbm93LiAgSUU6IFdlIG5lZWRuJ3QgdHJ5IGFnYWluIHdpdGggYSBsb25nZXIgdmVyc2lvbiBvZgotCSB0aGUgaW5zbiBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IGxvbmdlciB2ZXJzaW9ucyBvZiBpbnNucyBhcHBlYXIKLQkgYmVmb3JlIHNob3J0ZXIgb25lcyAoZWc6IGxzciByMixyMywxIHZzIGxzciByMixyMykuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLQkrKyBzdHI7Ci0KLSAgICAgIGlmICgqIHN0ciAhPSAnXDAnKQotCXJldHVybiBfKCJqdW5rIGF0IGVuZCBvZiBsaW5lIik7IC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgYHN0cicgKi8KLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGNvdWxkbid0IHBhcnNlIGl0LiAgKi8KLSAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotfQotDAotLyogTWFpbiBlbnRyeSBwb2ludC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLgotICAgU1RSIHBvaW50cyB0byB0aGUgaW5zbiB0byBiZSBhc3NlbWJsZWQuCi0gICBXZSBhc3N1bWUgYWxsIG5lY2Vzc2FyeSB0YWJsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgotICAgVGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiwgbGVzcyBhbnkgZml4dXBzLCBpcyBzdG9yZWQgaW4gQlVGLgotICAgUmVtZW1iZXIgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgdGhlbiBCVUYgaXMgYW4gaW50IGFuZCB0aHVzIHRoZSB2YWx1ZQotICAgc3RpbGwgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIHRhcmdldCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGIGlzIGFuIGFycmF5Ci0gICBvZiBieXRlcyBpbiB0YXJnZXQgYnl0ZSBvcmRlci4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnNuJ3MgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSwKLSAgIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJlZCAoYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuCi0gICBwcmludGVkKS4KLQotICAgTm90ZSB0aGF0IHdoZW4gcHJvY2Vzc2luZyAobm9uLWFsaWFzKSBtYWNyby1pbnNucywKLSAgIHRoaXMgZnVuY3Rpb24gcmVjdXJzZXMuCi0KLSAgID8/PyBJdCdzIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBjcHUtaW5kZXBlbmRlbnQuCi0gICBPbmUgd291bGQgaGF2ZSB0byBkZWFsIHdpdGggYSBmZXcgbWlub3IgdGhpbmdzLgotICAgQXQgdGhpcyBwb2ludCBpbiB0aW1lIGRvaW5nIHNvIHdvdWxkIGJlIG1vcmUgb2YgYSBjdXJpb3NpdHkgdGhhbiB1c2VmdWwKLSAgIFtmb3IgZXhhbXBsZSB0aGlzIGZpbGUgaXNuJ3QgX3RoYXRfIGJpZ10sIGJ1dCBrZWVwaW5nIHRoZSBwb3NzaWJpbGl0eSBpbgotICAgbWluZCBoZWxwcyBrZWVwIHRoZSBkZXNpZ24gY2xlYW4uICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24gKGNkLCBzdHIsIGZpZWxkcywgYnVmLCBlcnJtc2cpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWY7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0gIGNvbnN0IGNoYXIgKnRtcF9lcnJtc2c7Ci0KLSAgLyogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLSAgICArKyBzdHI7Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2hlZCBsaXN0cy4KLSAgICAgR2V0IHRoZSBmaXJzdCBpbiB0aGUgbGlzdC4gICovCi0gIGlsaXN0ID0gQ0dFTl9BU01fTE9PS1VQX0lOU04gKGNkLCBzdHIpOwotCi0gIC8qIEtlZXAgbG9va2luZyB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guICAqLwotCi0gIHN0YXJ0ID0gc3RyOwotICBmb3IgKCA7IGlsaXN0ICE9IE5VTEwgOyBpbGlzdCA9IENHRU5fQVNNX05FWFRfSU5TTiAoaWxpc3QpKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGlsaXN0LT5pbnNuOwotCi0jaWZkZWYgQ0dFTl9WQUxJREFURV9JTlNOX1NVUFBPUlRFRCAKLSAgICAgIC8qIG5vdCB1c3VhbGx5IG5lZWRlZCBhcyB1bnN1cHBvcnRlZCBvcGNvZGVzIHNob3VsZG4ndCBiZSBpbiB0aGUgaGFzaCBsaXN0cyAqLwotICAgICAgLyogSXMgdGhpcyBpbnNuIHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgY3B1PyAgKi8KLSAgICAgIGlmICghIG0zMnJfY2dlbl9pbnNuX3N1cHBvcnRlZCAoY2QsIGluc24pKQotCWNvbnRpbnVlOwotI2VuZGlmCi0KLSAgICAgIC8qIElmIHRoZSBSRUxBWCBhdHRyaWJ1dGUgaXMgc2V0LCB0aGlzIGlzIGFuIGluc24gdGhhdCBzaG91bGRuJ3QgYmUKLQkgY2hvc2VuIGltbWVkaWF0ZWx5LiAgSW5zdGVhZCwgaXQgaXMgdXNlZCBkdXJpbmcgYXNzZW1ibGVyL2xpbmtlcgotCSByZWxheGF0aW9uIGlmIHBvc3NpYmxlLiAgKi8KLSAgICAgIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzdHIgPSBzdGFydDsKLQotICAgICAgLyogQWxsb3cgcGFyc2UvaW5zZXJ0IGhhbmRsZXJzIHRvIG9idGFpbiBsZW5ndGggb2YgaW5zbi4gICovCi0gICAgICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotCi0gICAgICBpZiAoISh0bXBfZXJybXNnID0gQ0dFTl9QQVJTRV9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgJiBzdHIsIGZpZWxkcykpKQotCXsKLQkgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotCSAgaWYgKENHRU5fSU5TRVJUX0ZOIChjZCwgaW5zbikgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZiwgKGJmZF92bWEpIDApCi0JICAgICAgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JICAvKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGFjdHVhbGx5IG91dHB1dCB0aGUgaW5zbiBhbmQgYW55Ci0JICAgICBxdWV1ZWQgcmVsb2NzLiAgKi8KLQkgIHJldHVybiBpbnNuOwotCX0KLQotICAgICAgLyogVHJ5IHRoZSBuZXh0IGVudHJ5LiAgKi8KLSAgICB9Ci0KLSAgewotICAgIHN0YXRpYyBjaGFyIGVycmJ1ZlsxNTBdOwotCi0jaWZkZWYgQ0dFTl9WRVJCT1NFX0FTU0VNQkxFUl9FUlJPUlMKLSAgICAvKiBpZiB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzLCB1c2UgZXJybXNnIGZyb20gQ0dFTl9QQVJTRV9GTiAqLwotICAgIGlmIChzdHJsZW4gKHN0YXJ0KSA+IDUwKQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGVycmJ1ZiwgIiVzIGAlLjUwcy4uLiciLCB0bXBfZXJybXNnLCBzdGFydCk7Ci0gICAgZWxzZSAKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsICIlcyBgJS41MHMnIiwgdG1wX2Vycm1zZywgc3RhcnQpOwotI2Vsc2UKLSAgICBpZiAoc3RybGVuIChzdGFydCkgPiA1MCkKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMuLi4nIiksIHN0YXJ0KTsKLSAgICBlbHNlIAotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGVycmJ1ZiwgXygiYmFkIGluc3RydWN0aW9uIGAlLjUwcyciKSwgc3RhcnQpOwotI2VuZGlmCi0gICAgICAKLSAgICAqZXJybXNnID0gZXJyYnVmOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0MCi0jaWYgMCAvKiBUaGlzIGNhbGxzIGJhY2sgdG8gR0FTIHdoaWNoIHdlIGNhbid0IGRvIHdpdGhvdXQgY2FyZS4gICovCi0KLS8qIFJlY29yZCBlYWNoIG1lbWJlciBvZiBPUFZBTFMgaW4gdGhlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZS4KLSAgIFRoaXMgbGV0cyBHQVMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4KLSAgID8/PyBJbnRlcmVzdGluZyBpZGVhIGJ1dCBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi0vKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCi0gICBGSVhNRTogTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2FzbV9oYXNoX2tleXdvcmRzIChjZCwgb3B2YWxzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0tFWVdPUkQgKm9wdmFsczsKLXsKLSAgQ0dFTl9LRVlXT1JEX1NFQVJDSCBzZWFyY2ggPSBjZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQgKG9wdmFscywgTlVMTCk7Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqIGtlOwotCi0gIHdoaWxlICgoa2UgPSBjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQgKCYgc2VhcmNoKSkgIT0gTlVMTCkKLSAgICB7Ci0jaWYgMCAvKiBVbm5lY2Vzc2FyeSwgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIHNlYXJjaCByb3V0aW5lLiAgKi8KLSAgICAgIGlmICghIG0zMnJfY2dlbl9vcHZhbF9zdXBwb3J0ZWQgKGtlKSkKLQljb250aW51ZTsKLSNlbmRpZgotICAgICAgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIChjZCwga2UtPm5hbWUsIGtlLT52YWx1ZSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogMCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWRlc2MuYyBiL29wY29kZXMvbTMyci1kZXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MGMzOGYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWRlc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNzUgKzAsMCBAQAotLyogQ1BVIGRhdGEgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBib29sX2F0dHJbXSA9Ci17Ci0gIHsgIiNmIiwgMCB9LAotICB7ICIjdCIsIDEgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgTUFDSF9hdHRyW10gPQotewotICB7ICJiYXNlIiwgTUFDSF9CQVNFIH0sCi0gIHsgIm0zMnIiLCBNQUNIX00zMlIgfSwKLSAgeyAibTMycngiLCBNQUNIX00zMlJYIH0sCi0gIHsgIm1heCIsIE1BQ0hfTUFYIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIElTQV9hdHRyW10gPQotewotICB7ICJtMzJyIiwgSVNBX00zMlIgfSwKLSAgeyAibWF4IiwgSVNBX01BWCB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBQSVBFX2F0dHJbXSA9Ci17Ci0gIHsgIk5PTkUiLCBQSVBFX05PTkUgfSwKLSAgeyAiTyIsIFBJUEVfTyB9LAotICB7ICJTIiwgUElQRV9TIH0sCi0gIHsgIk9TIiwgUElQRV9PUyB9LAotICB7IDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDUkVMLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkFCUy1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRVNFUlZFRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTi1PUFQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMT0MiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDQUNIRS1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUFJPRklMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5FR0FUSVZFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0VNLU9OTFkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTE9DIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJIQVNILVBSRUZJWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faW5zbl9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiUElQRSIsICYgUElQRV9hdHRyWzBdIH0sCi0gIHsgIkFMSUFTIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJVTkNPTkQtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0tJUC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkRFTEFZLVNMT1QiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYQUJMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVgiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5PLURJUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUEJCIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJGSUxMLVNMT1QiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNQRUNJQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi0vKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JU0EgbTMycl9jZ2VuX2lzYV90YWJsZVtdID0gewotICB7ICJtMzJyIiwgMzIsIDMyLCAxNiwgMzIsICB9LAotICB7IDAgfQotfTsKLQotLyogTWFjaGluZSB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggbTMycl9jZ2VuX21hY2hfdGFibGVbXSA9IHsKLSAgeyAibTMyciIsICJtMzJyIiwgTUFDSF9NMzJSIH0sCi0gIHsgIm0zMnJ4IiwgIm0zMnJ4IiwgTUFDSF9NMzJSWCB9LAotICB7IDAgfQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAiZnAiLCAxMyB9LAotICB7ICJsciIsIDE0IH0sCi0gIHsgInNwIiwgMTUgfSwKLSAgeyAicjAiLCAwIH0sCi0gIHsgInIxIiwgMSB9LAotICB7ICJyMiIsIDIgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi0gIHsgInIxMCIsIDEwIH0sCi0gIHsgInIxMSIsIDExIH0sCi0gIHsgInIxMiIsIDEyIH0sCi0gIHsgInIxMyIsIDEzIH0sCi0gIHsgInIxNCIsIDE0IH0sCi0gIHsgInIxNSIsIDE1IH0KLX07Ci0KLUNHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMgPQotewotICAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzWzBdLAotICAxOQotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1tdID0KLXsKLSAgeyAicHN3IiwgMCB9LAotICB7ICJjYnIiLCAxIH0sCi0gIHsgInNwaSIsIDIgfSwKLSAgeyAic3B1IiwgMyB9LAotICB7ICJicGMiLCA2IH0sCi0gIHsgImJicHN3IiwgOCB9LAotICB7ICJiYnBjIiwgMTQgfSwKLSAgeyAiY3IwIiwgMCB9LAotICB7ICJjcjEiLCAxIH0sCi0gIHsgImNyMiIsIDIgfSwKLSAgeyAiY3IzIiwgMyB9LAotICB7ICJjcjQiLCA0IH0sCi0gIHsgImNyNSIsIDUgfSwKLSAgeyAiY3I2IiwgNiB9LAotICB7ICJjcjciLCA3IH0sCi0gIHsgImNyOCIsIDggfSwKLSAgeyAiY3I5IiwgOSB9LAotICB7ICJjcjEwIiwgMTAgfSwKLSAgeyAiY3IxMSIsIDExIH0sCi0gIHsgImNyMTIiLCAxMiB9LAotICB7ICJjcjEzIiwgMTMgfSwKLSAgeyAiY3IxNCIsIDE0IH0sCi0gIHsgImNyMTUiLCAxNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzID0KLXsKLSAgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1swXSwKLSAgMjMKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zX2VudHJpZXNbXSA9Ci17Ci0gIHsgImEwIiwgMCB9LAotICB7ICJhMSIsIDEgfQotfTsKLQotQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcyA9Ci17Ci0gICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zX2VudHJpZXNbMF0sCi0gIDIKLX07Ci0KLQotCi0vKiBUaGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9IV18sYSkpCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgbTMycl9jZ2VuX2h3X3RhYmxlW10gPQotewotICB7ICJoLW1lbW9yeSIsIEhXX0hfTUVNT1JZLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2ludCIsIEhXX0hfU0lOVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXVpbnQiLCBIV19IX1VJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1hZGRyIiwgSFdfSF9BRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaWFkZHIiLCBIV19IX0lBRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtcGMiLCBIV19IX1BDLCBDR0VOX0FTTV9OT05FLCAwLCB7IDB8QShQUk9GSUxFKXxBKFBDKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1oaTE2IiwgSFdfSF9ISTE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdWxvMTYiLCBIV19IX1VMTzE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtZ3IiLCBIV19IX0dSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgeyAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1jciIsIEhXX0hfQ1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWNjdW1zIiwgSFdfSF9BQ0NVTVMsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zLCB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpIH0gfSB9LAotICB7ICJoLWNvbmQiLCBIV19IX0NPTkQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1wc3ciLCBIV19IX1BTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWJwc3ciLCBIV19IX0JQU1csIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1iYnBzdyIsIEhXX0hfQkJQU1csIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gZmllbGQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JRkxEXyxhKSkKLQotY29uc3QgQ0dFTl9JRkxEIG0zMnJfY2dlbl9pZmxkX3RhYmxlW10gPQotewotICB7IE0zMlJfRl9OSUwsICJmLW5pbCIsIDAsIDAsIDAsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0FOWU9GLCAiZi1hbnlvZiIsIDAsIDAsIDAsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMSwgImYtb3AxIiwgMCwgMzIsIDAsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMiwgImYtb3AyIiwgMCwgMzIsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0NPTkQsICJmLWNvbmQiLCAwLCAzMiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfUjEsICJmLXIxIiwgMCwgMzIsIDQsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1IyLCAiZi1yMiIsIDAsIDMyLCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0lNTTgsICJmLXNpbW04IiwgMCwgMzIsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1NJTU0xNiwgImYtc2ltbTE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0hJRlRfT1AyLCAiZi1zaGlmdC1vcDIiLCAwLCAzMiwgOCwgMywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTQsICJmLXVpbW00IiwgMCwgMzIsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9VSU1NNSwgImYtdWltbTUiLCAwLCAzMiwgMTEsIDUsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1VJTU0xNiwgImYtdWltbTE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTI0LCAiZi11aW1tMjQiLCAwLCAzMiwgOCwgMjQsIHsgMHxBKFJFTE9DKXxBKEFCU19BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0hJMTYsICJmLWhpMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDB8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQOCwgImYtZGlzcDgiLCAwLCAzMiwgOCwgOCwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQMTYsICJmLWRpc3AxNiIsIDAsIDMyLCAxNiwgMTYsIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfRElTUDI0LCAiZi1kaXNwMjQiLCAwLCAzMiwgOCwgMjQsIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfT1AyMywgImYtb3AyMyIsIDAsIDMyLCA5LCAzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9PUDMsICJmLW9wMyIsIDAsIDMyLCAxNCwgMiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQUNDLCAiZi1hY2MiLCAwLCAzMiwgOCwgMSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQUNDUywgImYtYWNjcyIsIDAsIDMyLCAxMiwgMiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQUNDRCwgImYtYWNjZCIsIDAsIDMyLCA0LCAyLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9CSVRTNjcsICJmLWJpdHM2NyIsIDAsIDMyLCA2LCAyLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9CSVQxNCwgImYtYml0MTQiLCAwLCAzMiwgMTQsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0lNTTEsICJmLWltbTEiLCAwLCAzMiwgMTUsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0vKiBUaGUgb3BlcmFuZCB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX09QRVJBTkRfLGEpKQotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChNMzJSX09QRVJBTkRfLG9wKQotCi1jb25zdCBDR0VOX09QRVJBTkQgbTMycl9jZ2VuX29wZXJhbmRfdGFibGVbXSA9Ci17Ci0vKiBwYzogcHJvZ3JhbSBjb3VudGVyICovCi0gIHsgInBjIiwgTTMyUl9PUEVSQU5EX1BDLCBIV19IX1BDLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzcjogc291cmNlIHJlZ2lzdGVyICovCi0gIHsgInNyIiwgTTMyUl9PUEVSQU5EX1NSLCBIV19IX0dSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZHI6IGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0gIHsgImRyIiwgTTMyUl9PUEVSQU5EX0RSLCBIV19IX0dSLCA0LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzcmMxOiBzb3VyY2UgcmVnaXN0ZXIgMSAqLwotICB7ICJzcmMxIiwgTTMyUl9PUEVSQU5EX1NSQzEsIEhXX0hfR1IsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNyYzI6IHNvdXJjZSByZWdpc3RlciAyICovCi0gIHsgInNyYzIiLCBNMzJSX09QRVJBTkRfU1JDMiwgSFdfSF9HUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNjcjogc291cmNlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyAic2NyIiwgTTMyUl9PUEVSQU5EX1NDUiwgSFdfSF9DUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRjcjogZGVzdGluYXRpb24gY29udHJvbCByZWdpc3RlciAqLwotICB7ICJkY3IiLCBNMzJSX09QRVJBTkRfRENSLCBIV19IX0NSLCA0LCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzaW1tODogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJzaW1tOCIsIE0zMlJfT1BFUkFORF9TSU1NOCwgSFdfSF9TSU5ULCA4LCA4LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzaW1tMTY6IDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInNpbW0xNiIsIE0zMlJfT1BFUkFORF9TSU1NMTYsIEhXX0hfU0lOVCwgMTYsIDE2LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tNDogNCBiaXQgdHJhcCBudW1iZXIgKi8KLSAgeyAidWltbTQiLCBNMzJSX09QRVJBTkRfVUlNTTQsIEhXX0hfVUlOVCwgMTIsIDQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVpbW01OiA1IGJpdCBzaGlmdCBjb3VudCAqLwotICB7ICJ1aW1tNSIsIE0zMlJfT1BFUkFORF9VSU1NNSwgSFdfSF9VSU5ULCAxMSwgNSwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWltbTE2OiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInVpbW0xNiIsIE0zMlJfT1BFUkFORF9VSU1NMTYsIEhXX0hfVUlOVCwgMTYsIDE2LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpbW0xOiAxIGJpdCBpbW1lZGlhdGUgKi8KLSAgeyAiaW1tMSIsIE0zMlJfT1BFUkFORF9JTU0xLCBIV19IX1VJTlQsIDE1LCAxLAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9NMzJSWCkgfSB9ICB9LAotLyogYWNjZDogYWNjdW11bGF0b3IgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLSAgeyAiYWNjZCIsIE0zMlJfT1BFUkFORF9BQ0NELCBIV19IX0FDQ1VNUywgNCwgMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpIH0gfSAgfSwKLS8qIGFjY3M6IGFjY3VtdWxhdG9yIHNvdXJjZSByZWdpc3RlciAqLwotICB7ICJhY2NzIiwgTTMyUl9PUEVSQU5EX0FDQ1MsIEhXX0hfQUNDVU1TLCAxMiwgMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpIH0gfSAgfSwKLS8qIGFjYzogYWNjdW11bGF0b3IgcmVnIChkKSAqLwotICB7ICJhY2MiLCBNMzJSX09QRVJBTkRfQUNDLCBIV19IX0FDQ1VNUywgOCwgMSwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpIH0gfSAgfSwKLS8qIGhhc2g6ICMgcHJlZml4ICovCi0gIHsgImhhc2giLCBNMzJSX09QRVJBTkRfSEFTSCwgSFdfSF9TSU5ULCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBoaTE2OiBoaWdoIDE2IGJpdCBpbW1lZGlhdGUsIHNpZ24gb3B0aW9uYWwgKi8KLSAgeyAiaGkxNiIsIE0zMlJfT1BFUkFORF9ISTE2LCBIV19IX0hJMTYsIDE2LCAxNiwKLSAgICB7IDB8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2xvMTY6IDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlLCBmb3IgbG93KCkgKi8KLSAgeyAic2xvMTYiLCBNMzJSX09QRVJBTkRfU0xPMTYsIEhXX0hfU0xPMTYsIDE2LCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWxvMTY6IDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUsIGZvciBsb3coKSAqLwotICB7ICJ1bG8xNiIsIE0zMlJfT1BFUkFORF9VTE8xNiwgSFdfSF9VTE8xNiwgMTYsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tMjQ6IDI0IGJpdCBhZGRyZXNzICovCi0gIHsgInVpbW0yNCIsIE0zMlJfT1BFUkFORF9VSU1NMjQsIEhXX0hfQUREUiwgOCwgMjQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpfEEoUkVMT0MpfEEoQUJTX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3A4OiA4IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDgiLCBNMzJSX09QRVJBTkRfRElTUDgsIEhXX0hfSUFERFIsIDgsIDgsCi0gICAgeyAwfEEoUkVMQVgpfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDE2OiAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0gIHsgImRpc3AxNiIsIE0zMlJfT1BFUkFORF9ESVNQMTYsIEhXX0hfSUFERFIsIDE2LCAxNiwKLSAgICB7IDB8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwMjQ6IDI0IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDI0IiwgTTMyUl9PUEVSQU5EX0RJU1AyNCwgSFdfSF9JQUREUiwgOCwgMjQsCi0gICAgeyAwfEEoUkVMQVgpfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY29uZGJpdDogY29uZGl0aW9uIGJpdCAqLwotICB7ICJjb25kYml0IiwgTTMyUl9PUEVSQU5EX0NPTkRCSVQsIEhXX0hfQ09ORCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogYWNjdW06IGFjY3VtdWxhdG9yICovCi0gIHsgImFjY3VtIiwgTTMyUl9PUEVSQU5EX0FDQ1VNLCBIV19IX0FDQ1VNLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgbTMycl9jZ2VuX2luc25fdGFibGVbTUFYX0lOU05TXSA9Ci17Ci0gIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KLSAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KLSAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KLSAgeyAwLCAwLCAwIH0sCi0vKiBhZGQgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERCwgImFkZCIsICJhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBhZGQzICRkciwkc3IsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BREQzLCAiYWRkMyIsICJhZGQzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBhbmQgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FORCwgImFuZCIsICJhbmQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FORDMsICJhbmQzIiwgImFuZDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIG9yICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9PUiwgIm9yIiwgIm9yIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogb3IzICRkciwkc3IsJGhhc2gkdWxvMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9PUjMsICJvcjMiLCAib3IzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiB4b3IgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1hPUiwgInhvciIsICJ4b3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiB4b3IzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1hPUjMsICJ4b3IzIiwgInhvcjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGFkZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FEREksICJhZGRpIiwgImFkZGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBhZGR2ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERWLCAiYWRkdiIsICJhZGR2IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogYWRkdjMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQUREVjMsICJhZGR2MyIsICJhZGR2MyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYWRkeCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQUREWCwgImFkZHgiLCAiYWRkeCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGJjLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkM4LCAiYmM4IiwgImJjLnMiLCAxNiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJjLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JDMjQsICJiYzI0IiwgImJjLmwiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkVRLCAiYmVxIiwgImJlcSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmVxeiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkVRWiwgImJlcXoiLCAiYmVxeiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmdleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkdFWiwgImJnZXoiLCAiYmdleiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmd0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkdUWiwgImJndHoiLCAiYmd0eiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmxleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkxFWiwgImJsZXoiLCAiYmxleiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmx0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkxUWiwgImJsdHoiLCAiYmx0eiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYm5leiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5FWiwgImJuZXoiLCAiYm5leiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmwucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTDgsICJibDgiLCAiYmwucyIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYmwubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkwyNCwgImJsMjQiLCAiYmwubCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBiY2wucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CQ0w4LCAiYmNsOCIsICJiY2wucyIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBiY2wubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkNMMjQsICJiY2wyNCIsICJiY2wubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJuYy5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JOQzgsICJibmM4IiwgImJuYy5zIiwgMTYsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBibmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DMjQsICJibmMyNCIsICJibmMubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYm5lICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkUsICJibmUiLCAiYm5lIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBicmEucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CUkE4LCAiYnJhOCIsICJicmEucyIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYnJhLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JSQTI0LCAiYnJhMjQiLCAiYnJhLmwiLCAzMiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYm5jbC5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JOQ0w4LCAiYm5jbDgiLCAiYm5jbC5zIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJuY2wubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DTDI0LCAiYm5jbDI0IiwgImJuY2wubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGNtcCAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUCwgImNtcCIsICJjbXAiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBJLCAiY21waSIsICJjbXBpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBjbXB1ICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QVSwgImNtcHUiLCAiY21wdSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGNtcHVpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBVSSwgImNtcHVpIiwgImNtcHVpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBjbXBlcSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUEVRLCAiY21wZXEiLCAiY21wZXEiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX09TIH0gfQotICB9LAotLyogY21weiAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUFosICJjbXB6IiwgImNtcHoiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX09TIH0gfQotICB9LAotLyogZGl2ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9ESVYsICJkaXYiLCAiZGl2IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBkaXZ1ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9ESVZVLCAiZGl2dSIsICJkaXZ1IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiByZW0gJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JFTSwgInJlbSIsICJyZW0iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHJlbXUgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JFTVUsICJyZW11IiwgInJlbXUiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGRpdmggJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0RJVkgsICJkaXZoIiwgImRpdmgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBqYyAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9KQywgImpjIiwgImpjIiwgMTYsCi0gICAgeyAwfEEoU1BFQ0lBTCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBqbmMgJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fSk5DLCAiam5jIiwgImpuYyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogamwgJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fSkwsICJqbCIsICJqbCIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogam1wICRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0pNUCwgImptcCIsICJqbXAiLCAxNiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGQgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRCwgImxkIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEX0QsICJsZC1kIiwgImxkIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREIsICJsZGIiLCAibGRiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREJfRCwgImxkYi1kIiwgImxkYiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGRoICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERILCAibGRoIiwgImxkaCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGRoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERIX0QsICJsZGgtZCIsICJsZGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVCLCAibGR1YiIsICJsZHViIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVQl9ELCAibGR1Yi1kIiwgImxkdWIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkdWggJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVILCAibGR1aCIsICJsZHVoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVSF9ELCAibGR1aC1kIiwgImxkdWgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkICRkcixAJHNyKyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEX1BMVVMsICJsZC1wbHVzIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZDI0ICRkciwkdWltbTI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fTEQyNCwgImxkMjQiLCAibGQyNCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGRpOCAkZHIsJHNpbW04ICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERJOCwgImxkaTgiLCAibGRpOCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGxkaTE2ICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xESTE2LCAibGRpMTYiLCAibGRpMTYiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxvY2sgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MT0NLLCAibG9jayIsICJsb2NrIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBtYWNoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0hJLCAibWFjaGkiLCAibWFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNISV9BLCAibWFjaGktYSIsICJtYWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDTE8sICJtYWNsbyIsICJtYWNsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjbG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0xPX0EsICJtYWNsby1hIiwgIm1hY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjd2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDV0hJLCAibWFjd2hpIiwgIm1hY3doaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNXSElfQSwgIm1hY3doaS1hIiwgIm1hY3doaSIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDV0xPLCAibWFjd2xvIiwgIm1hY3dsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjd2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNXTE9fQSwgIm1hY3dsby1hIiwgIm1hY3dsbyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUwsICJtdWwiLCAibXVsIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWxoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTEhJLCAibXVsaGkiLCAibXVsaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bGhpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxISV9BLCAibXVsaGktYSIsICJtdWxoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bGxvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMTE8sICJtdWxsbyIsICJtdWxsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsbG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTExPX0EsICJtdWxsby1hIiwgIm11bGxvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV0hJLCAibXVsd2hpIiwgIm11bHdoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXSElfQSwgIm11bHdoaS1hIiwgIm11bHdoaSIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV0xPLCAibXVsd2xvIiwgIm11bHdsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXTE9fQSwgIm11bHdsby1hIiwgIm11bHdsbyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXYgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WLCAibXYiLCAibXYiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBtdmZhY2hpICRkciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDSEksICJtdmZhY2hpIiwgIm12ZmFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ZmFjaGkgJGRyLCRhY2NzICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQUNISV9BLCAibXZmYWNoaS1hIiwgIm12ZmFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdmZhY2xvICRkciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDTE8sICJtdmZhY2xvIiwgIm12ZmFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ZmFjbG8gJGRyLCRhY2NzICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQUNMT19BLCAibXZmYWNsby1hIiwgIm12ZmFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdmZhY21pICRkciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkFDTUksICJtdmZhY21pIiwgIm12ZmFjbWkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ZmFjbWkgJGRyLCRhY2NzICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQUNNSV9BLCAibXZmYWNtaS1hIiwgIm12ZmFjbWkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdmZjICRkciwkc2NyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQywgIm12ZmMiLCAibXZmYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbXZ0YWNoaSAkc3JjMSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WVEFDSEksICJtdnRhY2hpIiwgIm12dGFjaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12dGFjaGkgJHNyYzEsJGFjY3MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRBQ0hJX0EsICJtdnRhY2hpLWEiLCAibXZ0YWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12dGFjbG8gJHNyYzEgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRBQ0xPLCAibXZ0YWNsbyIsICJtdnRhY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdnRhY2xvICRzcmMxLCRhY2NzICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQUNMT19BLCAibXZ0YWNsby1hIiwgIm12dGFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdnRjICRzciwkZGNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQywgIm12dGMiLCAibXZ0YyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbmVnICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9ORUcsICJuZWciLCAibmVnIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogbm9wICovCi0gIHsKLSAgICBNMzJSX0lOU05fTk9QLCAibm9wIiwgIm5vcCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIG5vdCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTk9ULCAibm90IiwgIm5vdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIHJhYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JBQywgInJhYyIsICJyYWMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHJhYyAkYWNjZCwkYWNjcywkaW1tMSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JBQ19EU0ksICJyYWMtZHNpIiwgInJhYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHJhY2ggKi8KLSAgewotICAgIE0zMlJfSU5TTl9SQUNILCAicmFjaCIsICJyYWNoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiByYWNoICRhY2NkLCRhY2NzLCRpbW0xICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkFDSF9EU0ksICJyYWNoLWRzaSIsICJyYWNoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogcnRlICovCi0gIHsKLSAgICBNMzJSX0lOU05fUlRFLCAicnRlIiwgInJ0ZSIsIDE2LAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzZXRoICRkciwkaGFzaCRoaTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0VUSCwgInNldGgiLCAic2V0aCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc2xsICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TTEwsICJzbGwiLCAic2xsIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzbGwzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTDMsICJzbGwzIiwgInNsbDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHNsbGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTEksICJzbGxpIiwgInNsbGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNyYSAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JBLCAic3JhIiwgInNyYSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3JhMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkEzLCAic3JhMyIsICJzcmEzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzcmFpICRkciwkdWltbTUgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkFJLCAic3JhaSIsICJzcmFpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzcmwgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSTCwgInNybCIsICJzcmwiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNybDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMMywgInNybDMiLCAic3JsMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc3JsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMSSwgInNybGkiLCAic3JsaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1QsICJzdCIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RfRCwgInN0LWQiLCAic3QiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEIsICJzdGIiLCAic3RiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RCX0QsICJzdGItZCIsICJzdGIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEgsICJzdGgiLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RIX0QsICJzdGgtZCIsICJzdGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHN0ICRzcmMxLEArJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVF9QTFVTLCAic3QtcGx1cyIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3QgJHNyYzEsQC0kc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUX01JTlVTLCAic3QtbWludXMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN1YiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1VCLCAic3ViIiwgInN1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIHN1YnYgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NVQlYsICJzdWJ2IiwgInN1YnYiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBzdWJ4ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVUJYLCAic3VieCIsICJzdWJ4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogdHJhcCAkdWltbTQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9UUkFQLCAidHJhcCIsICJ0cmFwIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiB1bmxvY2sgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fVU5MT0NLLCAidW5sb2NrIiwgInVubG9jayIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc2F0YiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0FUQiwgInNhdGIiLCAic2F0YiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHNhdGggJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NBVEgsICJzYXRoIiwgInNhdGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzYXQgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NBVCwgInNhdCIsICJzYXQiLCAzMiwKLSAgICB7IDB8QShTUEVDSUFMKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHBjbXBieiAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1BDTVBCWiwgInBjbXBieiIsICJwY21wYnoiLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBzYWRkICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0FERCwgInNhZGQiLCAic2FkZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY3d1MSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ1dVMSwgIm1hY3d1MSIsICJtYWN3dTEiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtc2JsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01TQkxPLCAibXNibG8iLCAibXNibG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWx3dTEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXVTEsICJtdWx3dTEiLCAibXVsd3UxIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjbGgxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDTEgxLCAibWFjbGgxIiwgIm1hY2xoMSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0MsICJzYyIsICJzYyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpfEEoU0tJUF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogc25jICovCi0gIHsKLSAgICBNMzJSX0lOU05fU05DLCAic25jIiwgInNuYyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpfEEoU0tJUF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1AKLQotLyogSW5pdGlhbGl6ZSBhbnl0aGluZyBuZWVkZWQgdG8gYmUgZG9uZSBvbmNlLCBiZWZvcmUgYW55IGNwdV9vcGVuIGNhbGwuICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF90YWJsZXMgKCkKLXsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gbG9vayB1cCBhIG1hY2ggdmlhIGl0cyBiZmQgbmFtZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggKgotbG9va3VwX21hY2hfdmlhX2JmZF9uYW1lICh0YWJsZSwgbmFtZSkKLSAgICAgY29uc3QgQ0dFTl9NQUNIICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgd2hpbGUgKHRhYmxlLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHRhYmxlLT5iZmRfbmFtZSkgPT0gMCkKLQlyZXR1cm4gdGFibGU7Ci0gICAgICArK3RhYmxlOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9od190YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBtYWNocyA9IGNkLT5tYWNoczsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqaW5pdCA9ICYgbTMycl9jZ2VuX2h3X3RhYmxlWzBdOwotICAvKiBNQVhfSFcgaXMgb25seSBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVudHJpZXMuCi0gICAgIEhvd2V2ZXIgZWFjaCBlbnRyeSBpcyBpbmRleGVkIGJ5IGl0J3MgZW51bSBzbyB0aGVyZSBjYW4gYmUgaG9sZXMgaW4KLSAgICAgdGhlIHRhYmxlLiAgKi8KLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKnNlbGVjdGVkID0KLSAgICAoY29uc3QgQ0dFTl9IV19FTlRSWSAqKikgeG1hbGxvYyAoTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLQotICBjZC0+aHdfdGFibGUuaW5pdF9lbnRyaWVzID0gaW5pdDsKLSAgY2QtPmh3X3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSFdfRU5UUlkpOwotICBtZW1zZXQgKHNlbGVjdGVkLCAwLCBNQVhfSFcgKiBzaXplb2YgKENHRU5fSFdfRU5UUlkgKikpOwotICAvKiA/Pz8gRm9yIG5vdyB3ZSBqdXN0IHVzZSBtYWNocyB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9IV19BVFRSX1ZBTFVFICgmaW5pdFtpXSwgQ0dFTl9IV19NQUNIKQotCSYgbWFjaHMpCi0gICAgICBzZWxlY3RlZFtpbml0W2ldLnR5cGVdID0gJmluaXRbaV07Ci0gIGNkLT5od190YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5od190YWJsZS5udW1fZW50cmllcyA9IE1BWF9IVzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2lmaWVsZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgY2QtPmlmbGRfdGFibGUgPSAmIG0zMnJfY2dlbl9pZmxkX3RhYmxlWzBdOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBtYWNocyA9IGNkLT5tYWNoczsKLSAgY29uc3QgQ0dFTl9PUEVSQU5EICppbml0ID0gJiBtMzJyX2NnZW5fb3BlcmFuZF90YWJsZVswXTsKLSAgLyogTUFYX09QRVJBTkRTIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fT1BFUkFORCAqKnNlbGVjdGVkID0KLSAgICAoY29uc3QgQ0dFTl9PUEVSQU5EICoqKSB4bWFsbG9jIChNQVhfT1BFUkFORFMgKiBzaXplb2YgKENHRU5fT1BFUkFORCAqKSk7Ci0KLSAgY2QtPm9wZXJhbmRfdGFibGUuaW5pdF9lbnRyaWVzID0gaW5pdDsKLSAgY2QtPm9wZXJhbmRfdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9PUEVSQU5EKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotICAvKiA/Pz8gRm9yIG5vdyB3ZSBqdXN0IHVzZSBtYWNoIHRvIGRldGVybWluZSB3aGljaCBvbmVzIHdlIHdhbnQuICAqLwotICBmb3IgKGkgPSAwOyBpbml0W2ldLm5hbWUgIT0gTlVMTDsgKytpKQotICAgIGlmIChDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fT1BFUkFORF9NQUNIKQotCSYgbWFjaHMpCi0gICAgICBzZWxlY3RlZFtpbml0W2ldLnR5cGVdID0gJmluaXRbaV07Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXMgPSBzZWxlY3RlZDsKLSAgY2QtPm9wZXJhbmRfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfT1BFUkFORFM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4KLSAgID8/PyBUaGlzIGNvdWxkIGxlYXZlIG91dCBpbnNucyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzcGVjaWZpZWQgbWFjaC9pc2EsCi0gICBidXQgdGhhdCB3b3VsZCBjYXVzZSBlcnJvcnMgbGlrZSAiZm9vIG9ubHkgc3VwcG9ydGVkIGJ5IGJhciIgdG8gYmVjb21lCi0gICAidW5rbm93biBpbnNuIiwgc28gZm9yIG5vdyB3ZSBpbmNsdWRlIGFsbCBpbnNucyBhbmQgcmVxdWlyZSB0aGUgYXBwIHRvCi0gICBkbyB0aGUgY2hlY2tpbmcgbGF0ZXIuCi0gICA/Pz8gT24gdGhlIG90aGVyIGhhbmQsIHBhcnNpbmcgb2Ygc3VjaCBpbnNucyBtYXkgcmVxdWlyZSB0aGVpciBoYXJkd2FyZSBvcgotICAgb3BlcmFuZCBlbGVtZW50cyB0byBiZSBpbiB0aGUgdGFibGUgW3doaWNoIHRoZXkgbWlnaHRuJ3QgYmVdLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2luc25fdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX0lCQVNFICppYiA9ICYgbTMycl9jZ2VuX2luc25fdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0KLSAgbWVtc2V0IChpbnNucywgMCwgTUFYX0lOU05TICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQotICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcyA9IGluc25zOwotICBjZC0+aW5zbl90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0lCQVNFKTsKLSAgY2QtPmluc25fdGFibGUubnVtX2luaXRfZW50cmllcyA9IE1BWF9JTlNOUzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gcmVidWlsZCB0aGUgdGFibGVzLiAgKi8KLQotc3RhdGljIHZvaWQKLW0zMnJfY2dlbl9yZWJ1aWxkX3RhYmxlcyAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGksbl9pc2FzLG5fbWFjaHM7Ci0gIHVuc2lnbmVkIGludCBpc2FzID0gY2QtPmlzYXM7Ci0gIHVuc2lnbmVkIGludCBtYWNocyA9IGNkLT5tYWNoczsKLQotICBjZC0+aW50X2luc25fcCA9IENHRU5fSU5UX0lOU05fUDsKLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgaXNhIHNwZWMuICAqLwotI2RlZmluZSBVTlNFVCAoQ0dFTl9TSVpFX1VOS05PV04gKyAxKQotICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBVTlNFVDsKLSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5taW5faW5zbl9iaXRzaXplID0gNjU1MzU7IC8qIHNvbWUgcmlkaWN1bG91c2x5IGJpZyBudW1iZXIgKi8KLSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lTQVM7ICsraSkKLSAgICBpZiAoKCgxIDw8IGkpICYgaXNhcykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX0lTQSAqaXNhID0gJiBtMzJyX2NnZW5faXNhX3RhYmxlW2ldOwotCi0JLyogRGVmYXVsdCBpbnNuIHNpemVzIG9mIGFsbCBzZWxlY3RlZCBpc2FzIG11c3QgYmUgZXF1YWwgb3Igd2Ugc2V0Ci0JICAgdGhlIHJlc3VsdCB0byAwLCBtZWFuaW5nICJ1bmtub3duIi4gICovCi0JaWYgKGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9PSBVTlNFVCkKLQkgIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemU7Ci0JZWxzZSBpZiAoaXNhLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9PSBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUpCi0JICA7IC8qIHRoaXMgaXMgb2sgKi8KLQllbHNlCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBDR0VOX1NJWkVfVU5LTk9XTjsKLQotCS8qIEJhc2UgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+YmFzZV9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBpc2EtPmJhc2VfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+YmFzZV9pbnNuX2JpdHNpemUgPT0gY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBTZXQgbWluLG1heCBpbnNuIHNpemVzLiAgKi8KLQlpZiAoaXNhLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPm1pbl9pbnNuX2JpdHNpemUpCi0JICBjZC0+bWluX2luc25fYml0c2l6ZSA9IGlzYS0+bWluX2luc25fYml0c2l6ZTsKLQlpZiAoaXNhLT5tYXhfaW5zbl9iaXRzaXplID4gY2QtPm1heF9pbnNuX2JpdHNpemUpCi0JICBjZC0+bWF4X2luc25fYml0c2l6ZSA9IGlzYS0+bWF4X2luc25fYml0c2l6ZTsKLQotCSsrbl9pc2FzOwotICAgICAgfQotCi0gIC8qIERhdGEgZGVyaXZlZCBmcm9tIHRoZSBtYWNoIHNwZWMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX01BQ0hTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIG1hY2hzKSAhPSAwKQotICAgICAgewotCWNvbnN0IENHRU5fTUFDSCAqbWFjaCA9ICYgbTMycl9jZ2VuX21hY2hfdGFibGVbaV07Ci0KLQkrK25fbWFjaHM7Ci0gICAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIGh3IGVsZW1lbnRzIGFyZSB1c2VkIGJ5IE1BQ0guICAqLwotICBidWlsZF9od190YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpZmllbGQgdGFibGUuICAqLwotICBidWlsZF9pZmllbGRfdGFibGUgKGNkKTsKLQotICAvKiBEZXRlcm1pbmUgd2hpY2ggb3BlcmFuZHMgYXJlIHVzZWQgYnkgTUFDSC9JU0EuICAqLwotICBidWlsZF9vcGVyYW5kX3RhYmxlIChjZCk7Ci0KLSAgLyogQnVpbGQgdGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLSAgYnVpbGRfaW5zbl90YWJsZSAoY2QpOwotfQotCi0vKiBJbml0aWFsaXplIGEgY3B1IHRhYmxlIGFuZCByZXR1cm4gYSBkZXNjcmlwdG9yLgotICAgSXQncyBtdWNoIGxpa2Ugb3BlbmluZyBhIGZpbGUsIGFuZCBtdXN0IGJlIHRoZSBmaXJzdCBmdW5jdGlvbiBjYWxsZWQuCi0gICBUaGUgYXJndW1lbnRzIGFyZSBhIHNldCBvZiAodHlwZS92YWx1ZSkgcGFpcnMsIHRlcm1pbmF0ZWQgd2l0aAotICAgQ0dFTl9DUFVfT1BFTl9FTkQuCi0KLSAgIEN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzOgotICAgQ0dFTl9DUFVfT1BFTl9JU0FTOiAgICBiaXRtYXAgb2YgdmFsdWVzIGluIGVudW0gaXNhX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fTUFDSFM6ICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIG1hY2hfYXR0cgotICAgQ0dFTl9DUFVfT1BFTl9CRkRNQUNIOiBzcGVjaWZ5IDEgbWFjaCB1c2luZyBiZmQgbmFtZQotICAgQ0dFTl9DUFVfT1BFTl9FTkRJQU46ICBzcGVjaWZ5IGVuZGlhbiBjaG9pY2UKLSAgIENHRU5fQ1BVX09QRU5fRU5EOiAgICAgdGVybWluYXRlcyBhcmd1bWVudHMKLQotICAgPz8/IFNpbXVsdGFuZW91cyBtdWx0aXBsZSBpc2FzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlLCBidXQgaXQncyBub3QgKHlldCkKLSAgIHByZWNsdWRlZC4KLQotICAgPz8/IFdlIG9ubHkgc3VwcG9ydCBJU08gQyBzdGRhcmdzIGhlcmUsIG5vdCBLJlIuCi0gICBMYXppbmVzcywgcGx1cyBleHBlcmltZW50IHRvIHNlZSBpZiBhbnl0aGluZyByZXF1aXJlcyBLJlIgLSBldmVudHVhbGx5Ci0gICBLJlIgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIC0gZS5nLiBHREIgaXMgY3VycmVudGx5IHRyeWluZyB0aGlzLiAgKi8KLQotQ0dFTl9DUFVfREVTQwotbTMycl9jZ2VuX2NwdV9vcGVuIChlbnVtIGNnZW5fY3B1X29wZW5fYXJnIGFyZ190eXBlLCAuLi4pCi17Ci0gIENHRU5fQ1BVX1RBQkxFICpjZCA9IChDR0VOX0NQVV9UQUJMRSAqKSB4bWFsbG9jIChzaXplb2YgKENHRU5fQ1BVX1RBQkxFKSk7Ci0gIHN0YXRpYyBpbnQgaW5pdF9wOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IDA7ICAvKiAwID0gInVuc3BlY2lmaWVkIiAqLwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSAwOyAvKiAwID0gInVuc3BlY2lmaWVkIiAqLwotICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbiA9IENHRU5fRU5ESUFOX1VOS05PV047Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgaWYgKCEgaW5pdF9wKQotICAgIHsKLSAgICAgIGluaXRfdGFibGVzICgpOwotICAgICAgaW5pdF9wID0gMTsKLSAgICB9Ci0KLSAgbWVtc2V0IChjZCwgMCwgc2l6ZW9mICgqY2QpKTsKLQotICB2YV9zdGFydCAoYXAsIGFyZ190eXBlKTsKLSAgd2hpbGUgKGFyZ190eXBlICE9IENHRU5fQ1BVX09QRU5fRU5EKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYXJnX3R5cGUpCi0JewotCWNhc2UgQ0dFTl9DUFVfT1BFTl9JU0FTIDoKLQkgIGlzYXMgPSB2YV9hcmcgKGFwLCB1bnNpZ25lZCBpbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX01BQ0hTIDoKLQkgIG1hY2hzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9CRkRNQUNIIDoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZSA9IHZhX2FyZyAoYXAsIGNvbnN0IGNoYXIgKik7Ci0JICAgIGNvbnN0IENHRU5fTUFDSCAqbWFjaCA9Ci0JICAgICAgbG9va3VwX21hY2hfdmlhX2JmZF9uYW1lIChtMzJyX2NnZW5fbWFjaF90YWJsZSwgbmFtZSk7Ci0KLQkgICAgbWFjaHMgfD0gbWFjaC0+bnVtIDw8IDE7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgQ0dFTl9DUFVfT1BFTl9FTkRJQU4gOgotCSAgZW5kaWFuID0gdmFfYXJnIChhcCwgZW51bSBjZ2VuX2VuZGlhbik7Ci0JICBicmVhazsKLQlkZWZhdWx0IDoKLQkgIGZwcmludGYgKHN0ZGVyciwgIm0zMnJfY2dlbl9jcHVfb3BlbjogdW5zdXBwb3J0ZWQgYXJndW1lbnQgYCVkJ1xuIiwKLQkJICAgYXJnX3R5cGUpOwotCSAgYWJvcnQgKCk7IC8qID8/PyByZXR1cm4gTlVMTD8gKi8KLQl9Ci0gICAgICBhcmdfdHlwZSA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9jcHVfb3Blbl9hcmcpOwotICAgIH0KLSAgdmFfZW5kIChhcCk7Ci0KLSAgLyogbWFjaCB1bnNwZWNpZmllZCBtZWFucyAiYWxsIiAqLwotICBpZiAobWFjaHMgPT0gMCkKLSAgICBtYWNocyA9ICgxIDw8IE1BWF9NQUNIUykgLSAxOwotICAvKiBiYXNlIG1hY2ggaXMgYWx3YXlzIHNlbGVjdGVkICovCi0gIG1hY2hzIHw9IDE7Ci0gIC8qIGlzYSB1bnNwZWNpZmllZCBtZWFucyAiYWxsIiAqLwotICBpZiAoaXNhcyA9PSAwKQotICAgIGlzYXMgPSAoMSA8PCBNQVhfSVNBUykgLSAxOwotICBpZiAoZW5kaWFuID09IENHRU5fRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgLyogPz8/IElmIHRhcmdldCBoYXMgb25seSBvbmUsIGNvdWxkIGhhdmUgYSBkZWZhdWx0LiAgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIm0zMnJfY2dlbl9jcHVfb3Blbjogbm8gZW5kaWFubmVzcyBzcGVjaWZpZWRcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGNkLT5pc2FzID0gaXNhczsKLSAgY2QtPm1hY2hzID0gbWFjaHM7Ci0gIGNkLT5lbmRpYW4gPSBlbmRpYW47Ci0gIC8qIEZJWE1FOiBmb3IgdGhlIHNwYXJjIGNhc2Ugd2UgY2FuIGRldGVybWluZSBpbnNuLWVuZGlhbm5lc3Mgc3RhdGljYWxseS4KLSAgICAgVGhlIHdvcnJ5IGhlcmUgaXMgd2hlcmUgYm90aCBkYXRhIGFuZCBpbnNuIGVuZGlhbiBjYW4gYmUgaW5kZXBlbmRlbnRseQotICAgICBjaG9zZW4sIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgYW5vdGhlciBhcmd1bWVudC4KLSAgICAgQWN0dWFsbHksIHdpbGwgd2FudCB0byBhbGxvdyBmb3IgbW9yZSBhcmd1bWVudHMgaW4gdGhlIGZ1dHVyZSBhbnl3YXkuICAqLwotICBjZC0+aW5zbl9lbmRpYW4gPSBlbmRpYW47Ci0KLSAgLyogVGFibGUgKHJlKWJ1aWxkZXIuICAqLwotICBjZC0+cmVidWlsZF90YWJsZXMgPSBtMzJyX2NnZW5fcmVidWlsZF90YWJsZXM7Ci0gIG0zMnJfY2dlbl9yZWJ1aWxkX3RhYmxlcyAoY2QpOwotCi0gIC8qIEluaXRpYWxpc2UgZmxhZ3MuICAqLwotICBjZC0+c2lnbmVkX292ZXJmbG93X29rX3AgPSAwOwotICAKLSAgcmV0dXJuIChDR0VOX0NQVV9ERVNDKSBjZDsKLX0KLQotLyogQ292ZXIgZm4gdG8gbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugb2YgMSBpc2EsIDEgbWFjaC4KLSAgIE1BQ0hfTkFNRSBpcyB0aGUgYmZkIG5hbWUgb2YgdGhlIG1hY2guICAqLwotCi1DR0VOX0NQVV9ERVNDCi1tMzJyX2NnZW5fY3B1X29wZW5fMSAobWFjaF9uYW1lLCBlbmRpYW4pCi0gICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKLSAgICAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW47Ci17Ci0gIHJldHVybiBtMzJyX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAotCQkJICAgICAgIENHRU5fQ1BVX09QRU5fRU5ESUFOLCBlbmRpYW4sCi0JCQkgICAgICAgQ0dFTl9DUFVfT1BFTl9FTkQpOwotfQotCi0vKiBDbG9zZSBhIGNwdSB0YWJsZS4KLSAgID8/PyBUaGlzIGNhbiBsaXZlIGluIGEgbWFjaGluZSBpbmRlcGVuZGVudCBmaWxlLCBidXQgdGhlcmUncyBjdXJyZW50bHkKLSAgIG5vIHBsYWNlIHRvIHB1dCB0aGlzIGZpbGUgKHRoZXJlJ3Mgbm8gbGliY2dlbikuICBsaWJvcGNvZGVzIGlzIHRoZSB3cm9uZwotICAgcGxhY2UgYXMgc29tZSBzaW11bGF0b3IgcG9ydHMgdXNlIHRoaXMgYnV0IHRoZXkgZG9uJ3QgdXNlIGxpYm9wY29kZXMuICAqLwotCi12b2lkCi1tMzJyX2NnZW5fY3B1X2Nsb3NlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaWYgKGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcykKLSAgICBmcmVlICgoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcyk7Ci0gIGlmIChjZC0+aHdfdGFibGUuZW50cmllcykKLSAgICBmcmVlICgoQ0dFTl9IV19FTlRSWSAqKSBjZC0+aHdfdGFibGUuZW50cmllcyk7Ci0gIGZyZWUgKGNkKTsKLX0KLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWRlc2MuaCBiL29wY29kZXMvbTMyci1kZXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDI4MDcuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWRlc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKiBDUFUgZGF0YSBoZWFkZXIgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgTTMyUl9DUFVfSAotI2RlZmluZSBNMzJSX0NQVV9ICi0KLSNkZWZpbmUgQ0dFTl9BUkNIIG0zMnIKLQotLyogR2l2ZW4gc3ltYm9sIFMsIHJldHVybiBtMzJyX2NnZW5fPFM+LiAgKi8KLSNkZWZpbmUgQ0dFTl9TWU0ocykgQ09OQ0FUMyAobTMycixfY2dlbl8scykKLQotLyogU2VsZWN0ZWQgY3B1IGZhbWlsaWVzLiAgKi8KLSNkZWZpbmUgSEFWRV9DUFVfTTMyUkJGCi0jZGVmaW5lIEhBVkVfQ1BVX00zMlJYRgotCi0jZGVmaW5lIENHRU5fSU5TTl9MU0IwX1AgMAotCi0vKiBNaW5pbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUlOX0lOU05fU0laRSAyCi0KLS8qIE1heGltdW0gc2l6ZSBvZiBhbnkgaW5zbiAoaW4gYnl0ZXMpLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9TSVpFIDQKLQotI2RlZmluZSBDR0VOX0lOVF9JTlNOX1AgMQotCi0vKiBGSVhNRTogTmVlZCB0byBjb21wdXRlIENHRU5fTUFYX1NZTlRBWF9CWVRFUy4gICovCi0KLS8qIENHRU5fTU5FTU9OSUNfT1BFUkFORFMgaXMgZGVmaW5lZCBpZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcy4KLSAgIGUuZy4gSW4gImIsYSBmb28iIHRoZSAiLGEiIGlzIGFuIG9wZXJhbmQuICBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcwotICAgd2UgY2FuJ3QgaGFzaCBvbiBldmVyeXRoaW5nIHVwIHRvIHRoZSBzcGFjZS4gICovCi0jZGVmaW5lIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLQotLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgYW55IGluc24gb3IgbWFjcm8taW5zbiBoYXMuICAqLwotI2RlZmluZSBDR0VOX01BWF9JTlNOX09QRVJBTkRTIDE2Ci0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGZpZWxkcyBpbiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lGTVRfT1BFUkFORFMgNwotCi0vKiBFbnVtcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gZm9ybWF0IGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMSB7Ci0gIE9QMV8wLCBPUDFfMSwgT1AxXzIsIE9QMV8zCi0gLCBPUDFfNCwgT1AxXzUsIE9QMV82LCBPUDFfNwotICwgT1AxXzgsIE9QMV85LCBPUDFfMTAsIE9QMV8xMQotICwgT1AxXzEyLCBPUDFfMTMsIE9QMV8xNCwgT1AxXzE1Ci19IElOU05fT1AxOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBvcDIgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AyIHsKLSAgT1AyXzAsIE9QMl8xLCBPUDJfMiwgT1AyXzMKLSAsIE9QMl80LCBPUDJfNSwgT1AyXzYsIE9QMl83Ci0gLCBPUDJfOCwgT1AyXzksIE9QMl8xMCwgT1AyXzExCi0gLCBPUDJfMTIsIE9QMl8xMywgT1AyXzE0LCBPUDJfMTUKLX0gSU5TTl9PUDI7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gZ3JfbmFtZXMgewotICBIX0dSX0ZQID0gMTMsIEhfR1JfTFIgPSAxNCwgSF9HUl9TUCA9IDE1LCBIX0dSX1IwID0gMAotICwgSF9HUl9SMSA9IDEsIEhfR1JfUjIgPSAyLCBIX0dSX1IzID0gMywgSF9HUl9SNCA9IDQKLSAsIEhfR1JfUjUgPSA1LCBIX0dSX1I2ID0gNiwgSF9HUl9SNyA9IDcsIEhfR1JfUjggPSA4Ci0gLCBIX0dSX1I5ID0gOSwgSF9HUl9SMTAgPSAxMCwgSF9HUl9SMTEgPSAxMSwgSF9HUl9SMTIgPSAxMgotICwgSF9HUl9SMTMgPSAxMywgSF9HUl9SMTQgPSAxNCwgSF9HUl9SMTUgPSAxNQotfSBHUl9OQU1FUzsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBjcl9uYW1lcyB7Ci0gIEhfQ1JfUFNXID0gMCwgSF9DUl9DQlIgPSAxLCBIX0NSX1NQSSA9IDIsIEhfQ1JfU1BVID0gMwotICwgSF9DUl9CUEMgPSA2LCBIX0NSX0JCUFNXID0gOCwgSF9DUl9CQlBDID0gMTQsIEhfQ1JfQ1IwID0gMAotICwgSF9DUl9DUjEgPSAxLCBIX0NSX0NSMiA9IDIsIEhfQ1JfQ1IzID0gMywgSF9DUl9DUjQgPSA0Ci0gLCBIX0NSX0NSNSA9IDUsIEhfQ1JfQ1I2ID0gNiwgSF9DUl9DUjcgPSA3LCBIX0NSX0NSOCA9IDgKLSAsIEhfQ1JfQ1I5ID0gOSwgSF9DUl9DUjEwID0gMTAsIEhfQ1JfQ1IxMSA9IDExLCBIX0NSX0NSMTIgPSAxMgotICwgSF9DUl9DUjEzID0gMTMsIEhfQ1JfQ1IxNCA9IDE0LCBIX0NSX0NSMTUgPSAxNQotfSBDUl9OQU1FUzsKLQotLyogQXR0cmlidXRlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1hY2hpbmUgdHlwZSBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIG1hY2hfYXR0ciB7Ci0gIE1BQ0hfQkFTRSwgTUFDSF9NMzJSLCBNQUNIX00zMlJYLCBNQUNIX01BWAotfSBNQUNIX0FUVFI7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc3RydWN0aW9uIHNldCBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIGlzYV9hdHRyIHsKLSAgSVNBX00zMlIsIElTQV9NQVgKLX0gSVNBX0FUVFI7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIHBhcmFsbGVsIGV4ZWN1dGlvbiBwaXBlbGluZSBzZWxlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIHBpcGVfYXR0ciB7Ci0gIFBJUEVfTk9ORSwgUElQRV9PLCBQSVBFX1MsIFBJUEVfT1MKLX0gUElQRV9BVFRSOwotCi0vKiBOdW1iZXIgb2YgYXJjaGl0ZWN0dXJlIHZhcmlhbnRzLiAgKi8KLSNkZWZpbmUgTUFYX0lTQVMgIDEKLSNkZWZpbmUgTUFYX01BQ0hTICgoaW50KSBNQUNIX01BWCkKLQotLyogSWZpZWxkIHN1cHBvcnQuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGNnZW5faWZsZCBtMzJyX2NnZW5faWZsZF90YWJsZVtdOwotCi0vKiBJZmllbGQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2lmbGQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faWZsZF9hdHRyIHsKLSAgQ0dFTl9JRkxEX1ZJUlRVQUwsIENHRU5fSUZMRF9QQ1JFTF9BRERSLCBDR0VOX0lGTERfQUJTX0FERFIsIENHRU5fSUZMRF9SRVNFUlZFRAotICwgQ0dFTl9JRkxEX1NJR05fT1BULCBDR0VOX0lGTERfU0lHTkVELCBDR0VOX0lGTERfUkVMT0MsIENHRU5fSUZMRF9FTkRfQk9PTFMKLSAsIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9JRkxEX01BQ0gsIENHRU5fSUZMRF9FTkRfTkJPT0xTCi19IENHRU5fSUZMRF9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pZmxkX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lGTERfTkJPT0xfQVRUUlMgKENHRU5fSUZMRF9FTkRfTkJPT0xTIC0gQ0dFTl9JRkxEX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgaWZpZWxkIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBpZmllbGRfdHlwZSB7Ci0gIE0zMlJfRl9OSUwsIE0zMlJfRl9BTllPRiwgTTMyUl9GX09QMSwgTTMyUl9GX09QMgotICwgTTMyUl9GX0NPTkQsIE0zMlJfRl9SMSwgTTMyUl9GX1IyLCBNMzJSX0ZfU0lNTTgKLSAsIE0zMlJfRl9TSU1NMTYsIE0zMlJfRl9TSElGVF9PUDIsIE0zMlJfRl9VSU1NNCwgTTMyUl9GX1VJTU01Ci0gLCBNMzJSX0ZfVUlNTTE2LCBNMzJSX0ZfVUlNTTI0LCBNMzJSX0ZfSEkxNiwgTTMyUl9GX0RJU1A4Ci0gLCBNMzJSX0ZfRElTUDE2LCBNMzJSX0ZfRElTUDI0LCBNMzJSX0ZfT1AyMywgTTMyUl9GX09QMwotICwgTTMyUl9GX0FDQywgTTMyUl9GX0FDQ1MsIE0zMlJfRl9BQ0NELCBNMzJSX0ZfQklUUzY3Ci0gLCBNMzJSX0ZfQklUMTQsIE0zMlJfRl9JTU0xLCBNMzJSX0ZfTUFYCi19IElGSUVMRF9UWVBFOwotCi0jZGVmaW5lIE1BWF9JRkxEICgoaW50KSBNMzJSX0ZfTUFYKQotCi0vKiBIYXJkd2FyZSBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faHcgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfYXR0ciB7Ci0gIENHRU5fSFdfVklSVFVBTCwgQ0dFTl9IV19DQUNIRV9BRERSLCBDR0VOX0hXX1BDLCBDR0VOX0hXX1BST0ZJTEUKLSAsIENHRU5fSFdfRU5EX0JPT0xTLCBDR0VOX0hXX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0hXX01BQ0gsIENHRU5fSFdfRU5EX05CT09MUwotfSBDR0VOX0hXX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2h3X2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0hXX05CT09MX0FUVFJTIChDR0VOX0hXX0VORF9OQk9PTFMgLSBDR0VOX0hXX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgaGFyZHdhcmUgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfdHlwZSB7Ci0gIEhXX0hfTUVNT1JZLCBIV19IX1NJTlQsIEhXX0hfVUlOVCwgSFdfSF9BRERSCi0gLCBIV19IX0lBRERSLCBIV19IX1BDLCBIV19IX0hJMTYsIEhXX0hfU0xPMTYKLSAsIEhXX0hfVUxPMTYsIEhXX0hfR1IsIEhXX0hfQ1IsIEhXX0hfQUNDVU0KLSAsIEhXX0hfQUNDVU1TLCBIV19IX0NPTkQsIEhXX0hfUFNXLCBIV19IX0JQU1cKLSAsIEhXX0hfQkJQU1csIEhXX0hfTE9DSywgSFdfTUFYCi19IENHRU5fSFdfVFlQRTsKLQotI2RlZmluZSBNQVhfSFcgKChpbnQpIEhXX01BWCkKLQotLyogT3BlcmFuZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5fb3BlcmFuZCBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX2F0dHIgewotICBDR0VOX09QRVJBTkRfVklSVFVBTCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIsIENHRU5fT1BFUkFORF9BQlNfQUREUiwgQ0dFTl9PUEVSQU5EX1NJR05fT1BUCi0gLCBDR0VOX09QRVJBTkRfU0lHTkVELCBDR0VOX09QRVJBTkRfTkVHQVRJVkUsIENHRU5fT1BFUkFORF9SRUxBWCwgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZCi0gLCBDR0VOX09QRVJBTkRfUkVMT0MsIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCwgQ0dFTl9PUEVSQU5EX0VORF9CT09MUywgQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyA9IDMxCi0gLCBDR0VOX09QRVJBTkRfTUFDSCwgQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMKLX0gQ0dFTl9PUEVSQU5EX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX29wZXJhbmRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUyAoQ0dFTl9PUEVSQU5EX0VORF9OQk9PTFMgLSBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbTMyciBvcGVyYW5kIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB7Ci0gIE0zMlJfT1BFUkFORF9QQywgTTMyUl9PUEVSQU5EX1NSLCBNMzJSX09QRVJBTkRfRFIsIE0zMlJfT1BFUkFORF9TUkMxCi0gLCBNMzJSX09QRVJBTkRfU1JDMiwgTTMyUl9PUEVSQU5EX1NDUiwgTTMyUl9PUEVSQU5EX0RDUiwgTTMyUl9PUEVSQU5EX1NJTU04Ci0gLCBNMzJSX09QRVJBTkRfU0lNTTE2LCBNMzJSX09QRVJBTkRfVUlNTTQsIE0zMlJfT1BFUkFORF9VSU1NNSwgTTMyUl9PUEVSQU5EX1VJTU0xNgotICwgTTMyUl9PUEVSQU5EX0lNTTEsIE0zMlJfT1BFUkFORF9BQ0NELCBNMzJSX09QRVJBTkRfQUNDUywgTTMyUl9PUEVSQU5EX0FDQwotICwgTTMyUl9PUEVSQU5EX0hBU0gsIE0zMlJfT1BFUkFORF9ISTE2LCBNMzJSX09QRVJBTkRfU0xPMTYsIE0zMlJfT1BFUkFORF9VTE8xNgotICwgTTMyUl9PUEVSQU5EX1VJTU0yNCwgTTMyUl9PUEVSQU5EX0RJU1A4LCBNMzJSX09QRVJBTkRfRElTUDE2LCBNMzJSX09QRVJBTkRfRElTUDI0Ci0gLCBNMzJSX09QRVJBTkRfQ09OREJJVCwgTTMyUl9PUEVSQU5EX0FDQ1VNLCBNMzJSX09QRVJBTkRfTUFYCi19IENHRU5fT1BFUkFORF9UWVBFOwotCi0vKiBOdW1iZXIgb2Ygb3BlcmFuZHMgdHlwZXMuICAqLwotI2RlZmluZSBNQVhfT1BFUkFORFMgKChpbnQpIE0zMlJfT1BFUkFORF9NQVgpCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIHJlZmVyZW5jZWQgYnkgYW55IGluc24uICAqLwotI2RlZmluZSBNQVhfT1BFUkFORF9JTlNUQU5DRVMgMTEKLQotLyogSW5zbiBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faW5zbiBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX2F0dHIgewotICBDR0VOX0lOU05fQUxJQVMsIENHRU5fSU5TTl9WSVJUVUFMLCBDR0VOX0lOU05fVU5DT05EX0NUSSwgQ0dFTl9JTlNOX0NPTkRfQ1RJCi0gLCBDR0VOX0lOU05fU0tJUF9DVEksIENHRU5fSU5TTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fUkVMQVhBQkxFLCBDR0VOX0lOU05fUkVMQVgKLSAsIENHRU5fSU5TTl9OT19ESVMsIENHRU5fSU5TTl9QQkIsIENHRU5fSU5TTl9GSUxMX1NMT1QsIENHRU5fSU5TTl9TUEVDSUFMCi0gLCBDR0VOX0lOU05fRU5EX0JPT0xTLCBDR0VOX0lOU05fU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSU5TTl9NQUNILCBDR0VOX0lOU05fUElQRQotICwgQ0dFTl9JTlNOX0VORF9OQk9PTFMKLX0gQ0dFTl9JTlNOX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2luc25fYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAoQ0dFTl9JTlNOX0VORF9OQk9PTFMgLSBDR0VOX0lOU05fU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogY2dlbi5oIHVzZXMgdGhpbmdzIHdlIGp1c3QgZGVmaW5lZC4gICovCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotLyogQXR0cmlidXRlcy4gICovCi1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9oYXJkd2FyZV9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pbnNuX2F0dHJfdGFibGVbXTsKLQotLyogSGFyZHdhcmUgZGVjbHMuICAqLwotCi1leHRlcm4gQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXM7Ci0KLQotCi0KLSNlbmRpZiAvKiBNMzJSX0NQVV9IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItZGlzLmMgYi9vcGNvZGVzL20zMnItZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZDUzNzcuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlciBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTi4gLSotIEMgLSotCi0gICBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1kaXMuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBEZWZhdWx0IHRleHQgdG8gcHJpbnQgaWYgYW4gaW5zdHJ1Y3Rpb24gaXNuJ3QgcmVjb2duaXplZC4gICovCi0jZGVmaW5lIFVOS05PV05fSU5TTl9NU0cgXygiKnVua25vd24qIikKLQotc3RhdGljIHZvaWQgcHJpbnRfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHJlc3MKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBiZmRfdm1hLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfa2V5d29yZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIENHRU5fS0VZV09SRCAqLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRklFTERTICosCi0JICAgICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgaW50IHByaW50X2luc24gUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwKLQkJCSAgICAgICBkaXNhc3NlbWJsZV9pbmZvICosIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGRlZmF1bHRfcHJpbnRfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQwKLS8qIC0tIGRpc2Fzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCi0KLS8qIC0tIGRpcy5jICovCi0KLS8qIEltbWVkaWF0ZSB2YWx1ZXMgYXJlIHByZWZpeGVkIHdpdGggJyMnLiAgKi8KLQotI2RlZmluZSBDR0VOX1BSSU5UX05PUk1BTChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKSBcCi1kbyB7IFwKLSAgaWYgKENHRU5fQk9PTF9BVFRSICgoYXR0cnMpLCBDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpKSBcCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjIik7IFwKLX0gd2hpbGUgKDApCi0KLS8qIEhhbmRsZSAnIycgcHJlZml4ZXMgYXMgb3BlcmFuZHMuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfaGFzaCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyIpOwotfQotCi0jdW5kZWYgQ0dFTl9QUklOVF9JTlNOCi0jZGVmaW5lIENHRU5fUFJJTlRfSU5TTiBteV9wcmludF9pbnNuCi0KLXN0YXRpYyBpbnQKLW15X3ByaW50X2luc24gKGNkLCBwYywgaW5mbykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY2hhciBidWZmZXJbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSAgY2hhciAqYnVmID0gYnVmZmVyOwotICBpbnQgc3RhdHVzOwotICBpbnQgYnVmbGVuID0gKHBjICYgMykgPT0gMCA/IDQgOiAyOwotCi0gIC8qIFJlYWQgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZiwgYnVmbGVuLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogMzIgYml0IGluc24/ICAqLwotICBpZiAoKHBjICYgMykgPT0gMCAmJiAoYnVmWzBdICYgMHg4MCkgIT0gMCkKLSAgICByZXR1cm4gcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGJ1Zmxlbik7Ci0KLSAgLyogUHJpbnQgdGhlIGZpcnN0IGluc24uICAqLwotICBpZiAoKHBjICYgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIDIpID09IDApCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIFVOS05PV05fSU5TTl9NU0cpOwotICAgICAgYnVmICs9IDI7Ci0gICAgfQotCi0gIGlmIChidWZbMF0gJiAweDgwKQotICAgIHsKLSAgICAgIC8qIFBhcmFsbGVsLiAgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIHx8ICIpOwotICAgICAgYnVmWzBdICY9IDB4N2Y7Ci0gICAgfQotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgLT4gIik7Ci0KLSAgLyogVGhlICImIDMiIGlzIHRvIHBhc3MgYSBjb25zaXN0ZW50IGFkZHJlc3MuCi0gICAgIFBhcmFsbGVsIGluc25zIGFyZ3VhYmx5IGJvdGggYmVnaW4gb24gdGhlIHdvcmQgYm91bmRhcnkuCi0gICAgIEFsc28sIGJyYW5jaCBpbnNucyBhcmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aGUgd29yZCBib3VuZGFyeS4gICovCi0gIGlmIChwcmludF9pbnNuIChjZCwgcGMgJiB+IChiZmRfdm1hKSAzLCBpbmZvLCBidWYsIDIpID09IDApCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIFVOS05PV05fSU5TTl9NU0cpOwotCi0gIHJldHVybiAocGMgJiAzKSA/IDIgOiA0OwotfQotCi0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBwcmludGluZyBvcGVyYW5kcy4KLSAgIFhJTkZPIGlzIGEgYHZvaWQgKicgYW5kIG5vdCBhIGBkaXNhc3NlbWJsZV9pbmZvIConIHRvIG5vdCBwdXQgYSByZXF1aXJlbWVudAotICAgb2YgZGlzLWFzbS5oIG9uIGNnZW4uaC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwcmludF9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHByaW50X2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotdm9pZAotbTMycl9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCB4aW5mbywgZmllbGRzLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIFBUUiB4aW5mbzsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgdm9pZCBjb25zdCAqYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIHhpbmZvOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgZmllbGRzLT5mX2FjYywgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgZmllbGRzLT5mX2FjY2QsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMsIGZpZWxkcy0+Zl9hY2NzLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9yMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwMTYsIDB8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwMjQsIDB8KDE8PENHRU5fT1BFUkFORF9SRUxBWCl8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3A4LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMQVgpfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBwcmludF9oYXNoIChjZCwgaW5mbywgMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaGkxNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05fT1BUKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pbW0xLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9yMiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3NpbW04LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9yMiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tMTYsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTI0LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfQUJTX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tNCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTUsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW0xNiwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHByaW50aW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotY2dlbl9wcmludF9mbiAqIGNvbnN0IG0zMnJfY2dlbl9wcmludF9oYW5kbGVyc1tdID0gCi17Ci0gIHByaW50X2luc25fbm9ybWFsLAotfTsKLQotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9kaXMgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBtMzJyX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgbTMycl9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cHJpbnRfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9wcmludF9oYW5kbGVyc1swXTsKLSAgY2QtPnByaW50X29wZXJhbmQgPSBtMzJyX2NnZW5fcHJpbnRfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBwcmludCBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X25vcm1hbCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0KLSNpZmRlZiBDR0VOX1BSSU5UX05PUk1BTAotICBDR0VOX1BSSU5UX05PUk1BTCAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgdmFsdWUpOwotfQotCi0vKiBEZWZhdWx0IGFkZHJlc3MgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyZXNzIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfQUREUkVTUwotICBDR0VOX1BSSU5UX0FERFJFU1MgKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGF0dHJpYnV0ZXMuICAqLwotICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0VNX09OTFkpKQotICAgIDsgLyogbm90aGluZyB0byBkbyAqLwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSkKLSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfQUJTX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TSUdORUQpKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgKGxvbmcpIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCAobG9uZykgdmFsdWUpOwotfQotCi0vKiBLZXl3b3JkIHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfa2V5d29yZCAoY2QsIGRpc19pbmZvLCBrZXl3b3JkX3RhYmxlLCB2YWx1ZSwgYXR0cnMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgQ0dFTl9LRVlXT1JEICprZXl3b3JkX3RhYmxlOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLQotICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGtleXdvcmRfdGFibGUsIHZhbHVlKTsKLSAgaWYgKGtlICE9IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGtlLT5uYW1lKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPz8/Iik7Ci19Ci0MCi0vKiBEZWZhdWx0IGluc24gcHJpbnRlci4KLQotICAgRElTX0lORk8gaXMgZGVmaW5lZCBhcyBgUFRSJyBzbyB0aGUgZGlzYXNzZW1ibGVyIG5lZWRuJ3Qga25vdyBhbnl0aGluZwotICAgYWJvdXQgZGlzYXNzZW1ibGVfaW5mby4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnNuX25vcm1hbCAoY2QsIGRpc19pbmZvLCBpbnNuLCBmaWVsZHMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fSU5JVF9QUklOVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsIENHRU5fU1lOVEFYX0NIQVIgKCpzeW4pKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgKi8KLSAgICAgIG0zMnJfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLCBpbmZvLAotCQkJCSBmaWVsZHMsIENHRU5fSU5TTl9BVFRSUyAoaW5zbiksIHBjLCBsZW5ndGgpOwotICAgIH0KLX0KLQwKLS8qIFV0aWxpdHkgdG8gcHJpbnQgYW4gaW5zbi4KLSAgIEJVRiBpcyB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLCB0YXJnZXQgYnl0ZSBvcmRlciwgQlVGTEVOIGJ5dGVzIGxvbmcuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGJ1ZmxlbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgYnVmbGVuOwotewotICB1bnNpZ25lZCBsb25nIGluc25fdmFsdWU7Ci0gIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7Ci0gIENHRU5fRVhUUkFDVF9JTkZPIGV4X2luZm87Ci0KLSAgZXhfaW5mby5kaXNfaW5mbyA9IGluZm87Ci0gIGV4X2luZm8udmFsaWQgPSAoMSA8PCAoY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCkpIC0gMTsKLSAgZXhfaW5mby5pbnNuX2J5dGVzID0gYnVmOwotCi0gIHN3aXRjaCAoYnVmbGVuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpbnNuX3ZhbHVlID0gYnVmWzBdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMTYgKGJ1ZikgOiBiZmRfZ2V0bDE2IChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMzIgKGJ1ZikgOiBiZmRfZ2V0bDMyIChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaCBsaXN0cy4KLSAgICAgUGljayB0aGUgZmlyc3Qgb25lIGFuZCBrZWVwIHRyeWluZyB1bnRpbCB3ZSBmaW5kIHRoZSByaWdodCBvbmUuICAqLwotCi0gIGluc25fbGlzdCA9IENHRU5fRElTX0xPT0tVUF9JTlNOIChjZCwgYnVmLCBpbnNuX3ZhbHVlKTsKLSAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGluc25fbGlzdC0+aW5zbjsKLSAgICAgIENHRU5fRklFTERTIGZpZWxkczsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSNpZmRlZiBDR0VOX1ZBTElEQVRFX0lOU05fU1VQUE9SVEVEIAotICAgICAgLyogbm90IG5lZWRlZCBhcyBpbnNuIHNob3VsZG4ndCBiZSBpbiBoYXNoIGxpc3RzIGlmIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCi0gICAgICBpZiAoISBtMzJyX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLSAgICAgICAgewotICAgICAgICAgIGluc25fbGlzdCA9IENHRU5fRElTX05FWFRfSU5TTiAoaW5zbl9saXN0KTsKLQkgIGNvbnRpbnVlOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KLSAgICAgIC8qID8/PyBNYXkgd2lzaCB0byBhbGxvdyB0YXJnZXQgdG8gZGVmZXIgdGhpcyBjaGVjayB1bnRpbCB0aGUgZXh0cmFjdAotCSBoYW5kbGVyLiAgKi8KLSAgICAgIGlmICgoaW5zbl92YWx1ZSAmIENHRU5fSU5TTl9CQVNFX01BU0sgKGluc24pKQotCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQotCXsKLQkgIC8qIFByaW50aW5nIGlzIGhhbmRsZWQgaW4gdHdvIHBhc3Nlcy4gIFRoZSBmaXJzdCBwYXNzIHBhcnNlcyB0aGUKLQkgICAgIG1hY2hpbmUgaW5zbiBhbmQgZXh0cmFjdHMgdGhlIGZpZWxkcy4gIFRoZSBzZWNvbmQgcGFzcyBwcmludHMKLQkgICAgIHRoZW0uICAqLwotCi0JICBsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQotCSAgICAoY2QsIGluc24sICZleF9pbmZvLCBpbnNuX3ZhbHVlLCAmZmllbGRzLCBwYyk7Ci0JICAvKiBsZW5ndGggPCAwIC0+IGVycm9yICovCi0JICBpZiAobGVuZ3RoIDwgMCkKLQkgICAgcmV0dXJuIGxlbmd0aDsKLQkgIGlmIChsZW5ndGggPiAwKQotCSAgICB7Ci0JICAgICAgQ0dFTl9QUklOVF9GTiAoY2QsIGluc24pIChjZCwgaW5mbywgaW5zbiwgJmZpZWxkcywgcGMsIGxlbmd0aCk7Ci0JICAgICAgLyogbGVuZ3RoIGlzIGluIGJpdHMsIHJlc3VsdCBpcyBpbiBieXRlcyAqLwotCSAgICAgIHJldHVybiBsZW5ndGggLyA4OwotCSAgICB9Ci0JfQotCi0gICAgICBpbnNuX2xpc3QgPSBDR0VOX0RJU19ORVhUX0lOU04gKGluc25fbGlzdCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBEZWZhdWx0IHZhbHVlIGZvciBDR0VOX1BSSU5UX0lOU04uCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJlZCBmZXRjaGluZyBieXRlcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9QUklOVF9JTlNOCi0jZGVmaW5lIENHRU5fUFJJTlRfSU5TTiBkZWZhdWx0X3ByaW50X2luc24KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X3ByaW50X2luc24gKGNkLCBwYywgaW5mbykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY2hhciBidWZbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBSZWFkIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24uICAqLwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgpOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoaW4gYnl0ZXMpLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX20zMnIgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgQ0dFTl9DUFVfREVTQyBjZCA9IDA7Ci0gIHN0YXRpYyBwcmV2X2lzYSxwcmV2X21hY2gscHJldl9lbmRpYW47Ci0gIGludCBsZW5ndGg7Ci0gIGludCBpc2EsbWFjaDsKLSAgaW50IGVuZGlhbiA9IChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKLQkJPyBDR0VOX0VORElBTl9CSUcKLQkJOiBDR0VOX0VORElBTl9MSVRUTEUpOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiA/Pz8gZ2RiIHdpbGwgc2V0IG1hY2ggYnV0IGxlYXZlIHRoZSBhcmNoaXRlY3R1cmUgYXMgInVua25vd24iICovCi0jaWZuZGVmIENHRU5fQkZEX0FSQ0gKLSNkZWZpbmUgQ0dFTl9CRkRfQVJDSCBiZmRfYXJjaF9tMzJyCi0jZW5kaWYKLSAgYXJjaCA9IGluZm8tPmFyY2g7Ci0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYXJjaCA9IENHRU5fQkZEX0FSQ0g7Ci0gICAgICAKLSAgLyogVGhlcmUncyBubyBzdGFuZGFyZCB3YXkgdG8gY29tcHV0ZSB0aGUgaXNhIG51bWJlciAoZS5nLiBmb3IgYXJtIHRodW1iKQotICAgICBzbyB3ZSBsZWF2ZSBpdCB0byB0aGUgdGFyZ2V0LiAgKi8KLSNpZmRlZiBDR0VOX0NPTVBVVEVfSVNBCi0gIGlzYSA9IENHRU5fQ09NUFVURV9JU0EgKGluZm8pOwotI2Vsc2UKLSAgaXNhID0gMDsKLSNlbmRpZgotCi0gIG1hY2ggPSBpbmZvLT5tYWNoOwotCi0gIC8qIElmIHdlJ3ZlIHN3aXRjaGVkIGNwdSdzLCBjbG9zZSB0aGUgY3VycmVudCB0YWJsZSBhbmQgb3BlbiBhIG5ldyBvbmUuICAqLwotICBpZiAoY2QKLSAgICAgICYmIChpc2EgIT0gcHJldl9pc2EKLQkgIHx8IG1hY2ggIT0gcHJldl9tYWNoCi0JICB8fCBlbmRpYW4gIT0gcHJldl9lbmRpYW4pKQotICAgIHsKLSAgICAgIG0zMnJfY2dlbl9jcHVfY2xvc2UgKGNkKTsKLSAgICAgIGNkID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB5ZXQsIGluaXRpYWxpemUgdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIGlmICghIGNkKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaF90eXBlID0gYmZkX2xvb2t1cF9hcmNoIChhcmNoLCBtYWNoKTsKLSAgICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKLQotICAgICAgaWYgKCFhcmNoX3R5cGUpCi0JYWJvcnQgKCk7Ci0gICAgICBtYWNoX25hbWUgPSBhcmNoX3R5cGUtPnByaW50YWJsZV9uYW1lOwotCi0gICAgICBwcmV2X2lzYSA9IGlzYTsKLSAgICAgIHByZXZfbWFjaCA9IG1hY2g7Ci0gICAgICBwcmV2X2VuZGlhbiA9IGVuZGlhbjsKLSAgICAgIGNkID0gbTMycl9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0lTQVMsIHByZXZfaXNhLAotCQkJCSBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIHByZXZfZW5kaWFuLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gICAgICBpZiAoIWNkKQotCWFib3J0ICgpOwotICAgICAgbTMycl9jZ2VuX2luaXRfZGlzIChjZCk7Ci0gICAgfQotCi0gIC8qIFdlIHRyeSB0byBoYXZlIGFzIG11Y2ggY29tbW9uIGNvZGUgYXMgcG9zc2libGUuCi0gICAgIEJ1dCBhdCB0aGlzIHBvaW50IHNvbWUgdGFyZ2V0cyBuZWVkIHRvIHRha2Ugb3Zlci4gICovCi0gIC8qID8/PyBTb21lIHRhcmdldHMgbWF5IG5lZWQgYSBob29rIGVsc2V3aGVyZS4gIFRyeSB0byBhdm9pZCB0aGlzLAotICAgICBidXQgaWYgbm90IHBvc3NpYmxlIHRyeSB0byBtb3ZlIHRoaXMgaG9vayBlbHNld2hlcmUgcmF0aGVyIHRoYW4KLSAgICAgaGF2ZSB0d28gaG9va3MuICAqLwotICBsZW5ndGggPSBDR0VOX1BSSU5UX0lOU04gKGNkLCBwYywgaW5mbyk7Ci0gIGlmIChsZW5ndGggPiAwKQotICAgIHJldHVybiBsZW5ndGg7Ci0gIGlmIChsZW5ndGggPCAwKQotICAgIHJldHVybiAtMTsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0gIHJldHVybiBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgLyA4OwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWlibGQuYyBiL29wY29kZXMvbTMyci1pYmxkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzNjNmEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWlibGQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDUgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gYnVpbGRpbmcvZXh0cmFjdGlvbiBzdXBwb3J0IGZvciBtMzJyLiAtKi0gQyAtKi0KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvci4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWlibGQuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotLyogVXNlZCBieSB0aGUgaWZpZWxkIHJ0eCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEZMRChmKSAoZmllbGRzLT5mKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgbG9uZywgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBDR0VOX0lOU05fQllURVNfUFRSKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqIGluc2VydF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwKLQkgICAgICBDR0VOX0ZJRUxEUyAqLCBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyBpbnQgZXh0cmFjdF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGxvbmcgKikpOwotc3RhdGljIGludCBleHRyYWN0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLAotCSAgICAgIENHRU5fSU5TTl9JTlQsIENHRU5fRklFTERTICosIGJmZF92bWEpKTsKLQwKLS8qIE9wZXJhbmQgaW5zZXJ0aW9uLiAgKi8KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLS8qIFN1YnJvdXRpbmUgb2YgaW5zZXJ0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSB2b2lkCi1pbnNlcnRfMSAoY2QsIHZhbHVlLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgaW50IHN0YXJ0LGxlbmd0aCx3b3JkX2xlbmd0aDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmcDsKLXsKLSAgdW5zaWduZWQgbG9uZyB4LG1hc2s7Ci0gIGludCBzaGlmdDsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgeCA9ICpidWZwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIxNiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXggPSAoYnVmcFswXSA8PCAxNikgfCBiZmRfZ2V0YjE2IChidWZwICsgMSk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApIHwgKGJ1ZnBbMl0gPDwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIzMiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMzIgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0gIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gIGVsc2UKLSAgICBzaGlmdCA9ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICB4ID0gKHggJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgKmJ1ZnAgPSB4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQliZmRfcHV0YjE2ICh4LCBidWZwKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDE2ICh4LCBidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl7Ci0JICBidWZwWzBdID0geCA+PiAxNjsKLQkgIGJmZF9wdXRiMTYgKHgsIGJ1ZnAgKyAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dGwxNiAoeCwgYnVmcCk7Ci0JICBidWZwWzJdID0geCA+PiAxNjsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMzIgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMzIgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGluc2VydGlvbiByb3V0aW5lLgotCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotLyogPz8/IFRoaXMgZHVwbGljYXRlcyBmdW5jdGlvbmFsaXR5IHdpdGggYmZkJ3MgaG93dG8gdGFibGUgYW5kCi0gICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwKLQkgICAgICAgdG90YWxfbGVuZ3RoLCBidWZmZXIpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLXsKLSAgc3RhdGljIGNoYXIgZXJyYnVmWzEwMF07Ci0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgLyogSWYgTEVOR1RIIGlzIHplcm8sIHRoaXMgb3BlcmFuZCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHZhbHVlLiAgKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChDR0VOX0lOVF9JTlNOX1AKLSAgICAgICYmIHdvcmRfb2Zmc2V0ICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbnNucyBzbWFsbGVyIHRoYW4gdGhlIGJhc2UtaW5zbi1iaXRzaXplLAotICAgICB3b3JkX2xlbmd0aCBtYXkgYmUgdG9vIGJpZy4gICovCi0gIGlmIChjZC0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yZF9vZmZzZXQgPT0gMAotCSAgJiYgd29yZF9sZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0Jd29yZF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0gICAgfQotCi0gIC8qIEVuc3VyZSBWQUxVRSB3aWxsIGZpdC4gICovCi0gIGlmICghIENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9JRkxEX1NJR05FRCkpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBtYXh2YWwgPSBtYXNrOwotICAgICAgCi0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBzcHJpbnRmIChlcnJidWYsCi0JCSAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIpLAotCQkgICB2YWx1ZSwgbWF4dmFsKTsKLQkgIHJldHVybiBlcnJidWY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGNnZW5fc2lnbmVkX292ZXJmbG93X29rX3AgKGNkKSkKLQl7Ci0JICBsb25nIG1pbnZhbCA9IC0gKDFMIDw8IChsZW5ndGggLSAxKSk7Ci0JICBsb25nIG1heHZhbCA9ICAgKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxOwotCSAgCi0JICBpZiAodmFsdWUgPCBtaW52YWwgfHwgdmFsdWUgPiBtYXh2YWwpCi0JICAgIHsKLQkgICAgICBzcHJpbnRmCi0JCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCShlcnJidWYsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIiksCi0JCSB2YWx1ZSwgbWludmFsLCBtYXh2YWwpOwotCSAgICAgIHJldHVybiBlcnJidWY7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgewotICAgIGludCBzaGlmdDsKLQotICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgICBlbHNlCi0gICAgICBzaGlmdCA9IHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKTsKLSAgICAqYnVmZmVyID0gKCpidWZmZXIgJiB+KG1hc2sgPDwgc2hpZnQpKSB8ICgodmFsdWUgJiBtYXNrKSA8PCBzaGlmdCk7Ci0gIH0KLQotI2Vsc2UgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmcCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlciArIHdvcmRfb2Zmc2V0IC8gODsKLQotICAgIGluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKTsKLSAgfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGJ1aWxkZXIgKGluc2VydCBoYW5kbGVyKS4KLSAgIFRoZSBpbnN0cnVjdGlvbiBpcyByZWNvcmRlZCBpbiBDR0VOX0lOVF9JTlNOX1AgYnl0ZSBvcmRlcgotICAgKG1lYW5pbmcgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgQlVGRkVSIGlzIGFuIGludCAqIGFuZCB0aHVzIHRoZSB2YWx1ZSBpcwotICAgcmVjb3JkZWQgaW4gaG9zdCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGRkVSIGlzIGFuIGFycmF5IG9mIGJ5dGVzIGFuZCB0aGUKLSAgIHZhbHVlIGlzIHJlY29yZGVkIGluIHRhcmdldCBieXRlIG9yZGVyKS4KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbnNlcnRfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqIGluc247Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotCi0gIENHRU5fSU5JVF9JTlNFUlQgKGNkKTsKLSAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbik7Ci0KLSAgLyogSWYgd2UncmUgcmVjb3JkaW5nIGluc25zIGFzIG51bWJlcnMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9mIGJ5dGVzKSwKLSAgICAgdGFyZ2V0IGJ5dGUgb3JkZXIgaGFuZGxpbmcgaXMgZGVmZXJyZWQgdW50aWwgbGF0ZXIuICAqLwotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgKmJ1ZmZlciA9IHZhbHVlOwotCi0jZWxzZQotCi0gIGNnZW5fcHV0X2luc25fdmFsdWUgKGNkLCBidWZmZXIsIG1pbiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplLAotCQkJCQlDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpKSwKLQkJICAgICAgIHZhbHVlKTsKLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgLyogPz8/IEl0IHdvdWxkIGJlIGJldHRlciB0byBzY2FuIHRoZSBmb3JtYXQncyBmaWVsZHMuCi0gICAgIFN0aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBpbnNlcnQgYSB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCB0aG91Z2g7Ci0gICAgIGUuZy4gc3RvcmluZyBhIGJyYW5jaCBkaXNwbGFjZW1lbnQgdGhhdCBnb3QgcmVzb2x2ZWQgbGF0ZXIuCi0gICAgIE5lZWRzIG1vcmUgdGhvdWdodCBmaXJzdC4gICovCi0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICogc3luICE9ICdcMCc7ICsrIHN5bikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQljb250aW51ZTsKLQotICAgICAgZXJybXNnID0gKCogY2QtPmluc2VydF9vcGVyYW5kKSAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkgICAgICAgZmllbGRzLCBidWZmZXIsIHBjKTsKLSAgICAgIGlmIChlcnJtc2cpCi0JcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0MCi0vKiBPcGVyYW5kIGV4dHJhY3Rpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4KLSAgIEVuc3VyZSBzdWZmaWNpZW50IGJ5dGVzIGFyZSBjYWNoZWQgaW4gRVhfSU5GTy4KLSAgIE9GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIEJZVEVTIGlzIHRoZSBsZW5ndGggb2YgdGhlIG5lZWRlZCB2YWx1ZS4KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBpbnQKLWZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCBvZmZzZXQsIGJ5dGVzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBvZmZzZXQsIGJ5dGVzOwotICAgICBiZmRfdm1hIHBjOwotewotICAvKiBJdCdzIGRvdWJ0ZnVsIHRoYXQgdGhlIG1pZGRsZSBwYXJ0IGhhcyBhbHJlYWR5IGJlZW4gZmV0Y2hlZCBzbwotICAgICB3ZSBkb24ndCBvcHRpbWl6ZSB0aGF0IGNhc2UuICBraXNzLiAgKi8KLSAgaW50IG1hc2s7Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBleF9pbmZvLT5kaXNfaW5mbzsKLQotICAvKiBGaXJzdCBkbyBhIHF1aWNrIGNoZWNrLiAgKi8KLSAgbWFzayA9ICgxIDw8IGJ5dGVzKSAtIDE7Ci0gIGlmICgoKGV4X2luZm8tPnZhbGlkID4+IG9mZnNldCkgJiBtYXNrKSA9PSBtYXNrKQotICAgIHJldHVybiAxOwotCi0gIC8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGJ5dGUgd2UgbmVlZCB0byByZWFkLiAgKi8KLSAgZm9yIChtYXNrID0gMSA8PCBvZmZzZXQ7IGJ5dGVzID4gMDsgLS1ieXRlcywgKytvZmZzZXQsIG1hc2sgPDw9IDEpCi0gICAgaWYgKCEgKG1hc2sgJiBleF9pbmZvLT52YWxpZCkpCi0gICAgICBicmVhazsKLQotICBpZiAoYnl0ZXMpCi0gICAgewotICAgICAgaW50IHN0YXR1czsKLQotICAgICAgcGMgKz0gb2Zmc2V0OwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCShwYywgZXhfaW5mby0+aW5zbl9ieXRlcyArIG9mZnNldCwgYnl0ZXMsIGluZm8pOwotCi0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBleF9pbmZvLT52YWxpZCB8PSAoKDEgPDwgYnl0ZXMpIC0gMSkgPDwgb2Zmc2V0OwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBleHRyYWN0X25vcm1hbC4gICovCi0KLXN0YXRpYyBDR0VOX0lOTElORSBsb25nCi1leHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotICAgICBiZmRfdm1hIHBjOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHJldHVybiAoeCA+PiBzaGlmdCkgJiBtYXNrOwotfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotLyogRGVmYXVsdCBleHRyYWN0aW9uIHJvdXRpbmUuCi0KLSAgIElOU05fVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgb2YgdGhlIGluc24gaW4gaG9zdCBvcmRlciwKLSAgIG9yIHNvbWV0aW1lcyBsZXNzIGZvciBjYXNlcyBsaWtlIHRoZSBtMzJyIHdoZXJlIHRoZSBiYXNlIGluc24gc2l6ZSBpcyAzMgotICAgYnV0IHNvbWUgaW5zbnMgYXJlIDE2IGJpdHMuCi0gICBBVFRSUyBpcyBhIG1hc2sgb2YgdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4gIFdlIG9ubHkgbmVlZCBgU0lHTkVEJywKLSAgIGJ1dCBmb3IgZ2VuZXJhbGl0eSB3ZSB0YWtlIGEgYml0bWFzayBvZiBhbGwgb2YgdGhlbS4KLSAgIFdPUkRfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYml0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBXT1JEX0xFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIGluIGJpdHMgaW4gd2hpY2ggdGhlIHZhbHVlIHJlc2lkZXMuCi0gICBTVEFSVCBpcyB0aGUgc3RhcnRpbmcgYml0IG51bWJlciBpbiB0aGUgd29yZCwgYXJjaGl0ZWN0dXJlIG9yaWdpbi4KLSAgIExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIFZBTFVFIGluIGJpdHMuCi0gICBUT1RBTF9MRU5HVEggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLgotCi0gICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLwotCi0vKiA/Pz8gVGhlIHJldHVybiBjb2RlIGlzbid0IHByb3Blcmx5IHVzZWQuICB3aXAuICAqLwotCi0vKiA/Pz8gVGhpcyBkb2Vzbid0IGhhbmRsZSBiZmRfdm1hJ3MuICBDcmVhdGUgYW5vdGhlciBmdW5jdGlvbiB3aGVuCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIGF0dHJzLCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwKLQkJd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aCwgcGMsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUKLSAgICAgc28gZ2l2ZSBpdCBhIHN0YW5kYXJkIHZhbHVlIG9mIHplcm8uICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgewotICAgICAgKnZhbHVlcCA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgaW5zbi1iYXNlLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRG9lcyB0aGUgdmFsdWUgcmVzaWRlIGluIElOU05fVkFMVUU/ICAqLwotCi0gIGlmICh3b3JkX29mZnNldCA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gICAgICBDR0VOX0lOU05fSU5UIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0gICAgICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKChzdGFydCArIDEpIC0gbGVuZ3RoKTsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IGluc25fdmFsdWUgPj4gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gICAgICB2YWx1ZSAmPSBtYXNrOwotICAgICAgLyogc2lnbiBleHRlbmQ/ICovCi0gICAgICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgKDFMIDw8IChsZW5ndGggLSAxKSkpKQotCXZhbHVlIHw9IH5tYXNrOwotICAgIH0KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnAgPSBleF9pbmZvLT5pbnNuX2J5dGVzICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgICBpZiAod29yZF9sZW5ndGggPiAzMikKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKGZpbGxfY2FjaGUgKGNkLCBleF9pbmZvLCB3b3JkX29mZnNldCAvIDgsIHdvcmRfbGVuZ3RoIC8gOCwgcGMpID09IDApCi0JcmV0dXJuIDA7Ci0KLSAgICAgIHZhbHVlID0gZXh0cmFjdF8xIChjZCwgZXhfaW5mbywgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnAsIHBjKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gICp2YWx1ZXAgPSB2YWx1ZTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVmYXVsdCBpbnNuIGV4dHJhY3Rvci4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cywgdHJhbnNsYXRlZCB0byBob3N0IG9yZGVyLgotICAgVGhlIGV4dHJhY3RlZCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBFWF9JTkZPIGlzIHVzZWQgdG8gaGFuZGxlIHJlYWRpbmcgdmFyaWFibGUgbGVuZ3RoIGluc25zLgotICAgUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cywgb3IgMCBpZiBubyBtYXRjaCwKLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycyBmZXRjaGluZyBkYXRhIChtZW1vcnlfZXJyb3JfZnVuYyB3aWxsIGhhdmUKLSAgIGJlZW4gY2FsbGVkKS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOwotCi0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci0KLSAgQ0dFTl9JTklUX0VYVFJBQ1QgKGNkKTsKLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKnN5bjsgKytzeW4pCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCi0JY29udGludWU7Ci0KLSAgICAgIGxlbmd0aCA9ICgqIGNkLT5leHRyYWN0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQlleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKTsKLSAgICAgIGlmIChsZW5ndGggPD0gMCkKLQlyZXR1cm4gbGVuZ3RoOwotICAgIH0KLQotICAvKiBXZSByZWNvZ25pemVkIGFuZCBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkIHRoaXMgaW5zbi4gICovCi0gIHJldHVybiBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7Ci19Ci0MCi0vKiBtYWNoaW5lIGdlbmVyYXRlZCBjb2RlIGFkZGVkIGhlcmUgKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBpbnNlcnRpb24uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4gIEl0J3MgYWxzbyBuZWVkZWQgYnkgR0FTIHRvIGluc2VydCBvcGVyYW5kcyB0aGF0IGNvdWxkbid0IGJlCi0gICByZXNvbHZlZCBkdXJpbmcgcGFyc2luZy4KLSovCi0KLWNvbnN0IGNoYXIgKgotbTMycl9jZ2VuX2luc2VydF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCBidWZmZXIsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBjaGFyICogZXJybXNnID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9hY2MsIDAsIDAsIDgsIDEsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfYWNjZCwgMCwgMCwgNCwgMiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9hY2NzLCAwLCAwLCAxMiwgMiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IxLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTY7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtIChwYykpKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDI0OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAocGMpKSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCAyNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKCgocGMpICYgKC00KSkpKSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCA4LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2hpMTYsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2ltbTE7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgLSAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDE1LCAxLCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjIsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9zaW1tOCwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjIsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IxLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0xNiwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTI0LCAwfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfQUJTX0FERFIpLCAwLCA4LCAyNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTQsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tNSwgMCwgMCwgMTEsIDUsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0xNiwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGV4dHJhY3Rpb24uCi0gICBUaGUgcmVzdWx0IGlzIDw9IDAgZm9yIGVycm9yLCA+MCBmb3Igc3VjY2Vzcy4KLSAgID8/PyBBY3R1YWwgdmFsdWVzIGFyZW4ndCB3ZWxsIGRlZmluZWQgcmlnaHQgbm93LgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1pbnQKLW0zMnJfY2dlbl9leHRyYWN0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEFzc3VtZSBzdWNjZXNzIChmb3IgdGhvc2Ugb3BlcmFuZHMgdGhhdCBhcmUgbm9wcykuICAqLwotICBpbnQgbGVuZ3RoID0gMTsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCAxLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfYWNjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCAyLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfYWNjZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDIsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9hY2NzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDIpKSkgKyAocGMpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AxNiA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCAyNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDIpKSkgKyAocGMpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgyKSkpICsgKCgocGMpICYgKC00KSkpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTl9PUFQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9oaTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDE1LCAxLCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgKyAoMSkpOwotICAgICAgICBmaWVsZHMtPmZfaW1tMSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9BQlNfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTI0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDExLCA1LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLWNnZW5faW5zZXJ0X2ZuICogY29uc3QgbTMycl9jZ2VuX2luc2VydF9oYW5kbGVyc1tdID0gCi17Ci0gIGluc2VydF9pbnNuX25vcm1hbCwKLX07Ci0KLWNnZW5fZXh0cmFjdF9mbiAqIGNvbnN0IG0zMnJfY2dlbl9leHRyYWN0X2hhbmRsZXJzW10gPSAKLXsKLSAgZXh0cmFjdF9pbnNuX25vcm1hbCwKLX07Ci0KLS8qIEdldHRpbmcgdmFsdWVzIGZyb20gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSByZXR1cm4uCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIHJlc3VsdCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi1pbnQKLW0zMnJfY2dlbl9nZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgaW50IHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2FjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9oaTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pbW0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW04OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotYmZkX3ZtYQotbTMycl9jZ2VuX2dldF92bWFfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBiZmRfdm1hIHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2FjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9oaTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pbW0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW04OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyB2bWEgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogU3R1ZmZpbmcgdmFsdWVzIGluIGNnZW5fZmllbGRzIGlzIGhhbmRsZWQgYnkgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucy4KLSAgIFRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFZBTFVFIGFyZ3VtZW50IHRoZXkgYWNjZXB0LgotICAgVE9ETzogZmxvYXRpbmcgcG9pbnQsIGlubGluaW5nIHN1cHBvcnQsIHJlbW92ZSBjYXNlcyB3aGVyZSBhcmd1bWVudCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi12b2lkCi1tMzJyX2NnZW5fc2V0X2ludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIGZpZWxkcy0+Zl9hY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgZmllbGRzLT5mX2FjY2QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgZmllbGRzLT5mX2FjY3MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBmaWVsZHMtPmZfaGkxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICBmaWVsZHMtPmZfaW1tMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZmllbGRzLT5mX3VpbW00ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTUgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi12b2lkCi1tMzJyX2NnZW5fc2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICBmaWVsZHMtPmZfYWNjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NEIDoKLSAgICAgIGZpZWxkcy0+Zl9hY2NkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIGZpZWxkcy0+Zl9hY2NzID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgZmllbGRzLT5mX2Rpc3AxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgZmllbGRzLT5mX2hpMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgZmllbGRzLT5mX2ltbTEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgZmllbGRzLT5mX3VpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMjQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgZmllbGRzLT5mX3VpbW01ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIGluc3RydWN0aW9uIGJ1aWxkZXIgdGFibGVzLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGNkLT5pbnNlcnRfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9pbnNlcnRfaGFuZGxlcnNbMF07Ci0gIGNkLT5leHRyYWN0X2hhbmRsZXJzID0gJiBtMzJyX2NnZW5fZXh0cmFjdF9oYW5kbGVyc1swXTsKLQotICBjZC0+aW5zZXJ0X29wZXJhbmQgPSBtMzJyX2NnZW5faW5zZXJ0X29wZXJhbmQ7Ci0gIGNkLT5leHRyYWN0X29wZXJhbmQgPSBtMzJyX2NnZW5fZXh0cmFjdF9vcGVyYW5kOwotCi0gIGNkLT5nZXRfaW50X29wZXJhbmQgPSBtMzJyX2NnZW5fZ2V0X2ludF9vcGVyYW5kOwotICBjZC0+c2V0X2ludF9vcGVyYW5kID0gbTMycl9jZ2VuX3NldF9pbnRfb3BlcmFuZDsKLSAgY2QtPmdldF92bWFfb3BlcmFuZCA9IG0zMnJfY2dlbl9nZXRfdm1hX29wZXJhbmQ7Ci0gIGNkLT5zZXRfdm1hX29wZXJhbmQgPSBtMzJyX2NnZW5fc2V0X3ZtYV9vcGVyYW5kOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLW9wYy5jIGIvb3Bjb2Rlcy9tMzJyLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWVmZWNjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2ODUgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotCi0vKiBUaGUgaGFzaCBmdW5jdGlvbnMgYXJlIHJlY29yZGVkIGhlcmUgdG8gaGVscCBrZWVwIGFzc2VtYmxlciBjb2RlIG91dCBvZgotICAgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdmljZSB2ZXJzYS4gICovCi0KLXN0YXRpYyBpbnQgYXNtX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGFzbV9oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRpc19oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBkaXNfaGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgQ0dFTl9JTlNOX0lOVCkpOwotCi0vKiBJbnN0cnVjdGlvbiBmb3JtYXRzLiAgKi8KLQotI2RlZmluZSBGKGYpICYgbTMycl9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoTTMyUl8sZildCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9lbXB0eSA9IHsKLSAgMCwgMCwgMHgwLCB7IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZCA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkMyA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYW5kMyA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfVUlNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfb3IzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9VSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGRpID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1NJTU04KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkdjMgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjOCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjMjQgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JlcSA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfRElTUDE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmVxeiA9IHsKLSAgMzIsIDMyLCAweGZmZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfRElTUDE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY21wID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jbXBpID0gewotICAzMiwgMzIsIDB4ZmZmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jbXB6ID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kaXYgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwZmZmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2pjID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZDI0ID0gewotICAzMiwgMzIsIDB4ZjAwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9VSU1NMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkxNiA9IHsKLSAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbWFjaGlfYSA9IHsKLSAgMTYsIDE2LCAweGYwNzAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9BQ0MpLCBGIChGX09QMjMpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZmYWNoaSA9IHsKLSAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZmYWNoaV9hID0gewotICAxNiwgMTYsIDB4ZjBmMywgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfT1AzKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZmYyA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZ0YWNoaSA9IHsKLSAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZ0YWNoaV9hID0gewotICAxNiwgMTYsIDB4ZjBmMywgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfT1AzKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZ0YyA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbm9wID0gewotICAxNiwgMTYsIDB4ZmZmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9yYWNfZHNpID0gewotICAxNiwgMTYsIDB4ZjNmMiwgeyBGIChGX09QMSksIEYgKEZfQUNDRCksIEYgKEZfQklUUzY3KSwgRiAoRl9PUDIpLCBGIChGX0FDQ1MpLCBGIChGX0JJVDE0KSwgRiAoRl9JTU0xKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc2V0aCA9IHsKLSAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfSEkxNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3NsbGkgPSB7Ci0gIDE2LCAxNiwgMHhmMGUwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfU0hJRlRfT1AyKSwgRiAoRl9VSU1NNSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0X2QgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3RyYXAgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9VSU1NNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3NhdGIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwZmZmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1VJTU0xNiksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChNMzJSX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUENPREUgbTMycl9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlW01BWF9JTlNOU10gPQotewotICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCi0gICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCi0gICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCi0gIHsgeyAwIH0gfSwKLS8qIGFkZCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhMCB9Ci0gIH0sCi0vKiBhZGQzICRkciwkc3IsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoSEFTSCksIE9QIChTTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4ODBhMDAwMDAgfQotICB9LAotLyogYW5kICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGMwIH0KLSAgfSwKLS8qIGFuZDMgJGRyLCRzciwkdWltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFVJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hbmQzLCB7IDB4ODBjMDAwMDAgfQotICB9LAotLyogb3IgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ZTAgfQotICB9LAotLyogb3IzICRkciwkc3IsJGhhc2gkdWxvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoSEFTSCksIE9QIChVTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9vcjMsIHsgMHg4MGUwMDAwMCB9Ci0gIH0sCi0vKiB4b3IgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ZDAgfQotICB9LAotLyogeG9yMyAkZHIsJHNyLCR1aW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoVUlNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FuZDMsIHsgMHg4MGQwMDAwMCB9Ci0gIH0sCi0vKiBhZGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNJTU04KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg0MDAwIH0KLSAgfSwKLS8qIGFkZHYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODAgfQotICB9LAotLyogYWRkdjMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDgwODAwMDAwIH0KLSAgfSwKLS8qIGFkZHggJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OTAgfQotICB9LAotLyogYmMucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3YzAwIH0KLSAgfSwKLS8qIGJjLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmMwMDAwMDAgfQotICB9LAotLyogYmVxICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXEsIHsgMHhiMDAwMDAwMCB9Ci0gIH0sCi0vKiBiZXF6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMDgwMDAwMCB9Ci0gIH0sCi0vKiBiZ2V6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGIwMDAwMCB9Ci0gIH0sCi0vKiBiZ3R6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGQwMDAwMCB9Ci0gIH0sCi0vKiBibGV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGMwMDAwMCB9Ci0gIH0sCi0vKiBibHR6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMGEwMDAwMCB9Ci0gIH0sCi0vKiBibmV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcXosIHsgMHhiMDkwMDAwMCB9Ci0gIH0sCi0vKiBibC5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDdlMDAgfQotICB9LAotLyogYmwubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmZTAwMDAwMCB9Ci0gIH0sCi0vKiBiY2wucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3ODAwIH0KLSAgfSwKLS8qIGJjbC5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGY4MDAwMDAwIH0KLSAgfSwKLS8qIGJuYy5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDdkMDAgfQotICB9LAotLyogYm5jLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmQwMDAwMDAgfQotICB9LAotLyogYm5lICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXEsIHsgMHhiMDEwMDAwMCB9Ci0gIH0sCi0vKiBicmEucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3ZjAwIH0KLSAgfSwKLS8qIGJyYS5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGZmMDAwMDAwIH0KLSAgfSwKLS8qIGJuY2wucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3OTAwIH0KLSAgfSwKLS8qIGJuY2wubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmOTAwMDAwMCB9Ci0gIH0sCi0vKiBjbXAgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg0MCB9Ci0gIH0sCi0vKiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcGksIHsgMHg4MDQwMDAwMCB9Ci0gIH0sCi0vKiBjbXB1ICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NTAgfQotICB9LAotLyogY21wdWkgJHNyYzIsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21waSwgeyAweDgwNTAwMDAwIH0KLSAgfSwKLS8qIGNtcGVxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NjAgfQotICB9LAotLyogY21weiAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21weiwgeyAweDcwIH0KLSAgfSwKLS8qIGRpdiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDAwMDAwMCB9Ci0gIH0sCi0vKiBkaXZ1ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdiwgeyAweDkwMTAwMDAwIH0KLSAgfSwKLS8qIHJlbSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDIwMDAwMCB9Ci0gIH0sCi0vKiByZW11ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdiwgeyAweDkwMzAwMDAwIH0KLSAgfSwKLS8qIGRpdmggJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAwMDAwMTAgfQotICB9LAotLyogamMgJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfamMsIHsgMHgxY2MwIH0KLSAgfSwKLS8qIGpuYyAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9qYywgeyAweDFkYzAgfQotICB9LAotLyogamwgJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfamMsIHsgMHgxZWMwIH0KLSAgfSwKLS8qIGptcCAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9qYywgeyAweDFmYzAgfQotICB9LAotLyogbGQgJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBjMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTBjMDAwMDAgfQotICB9LAotLyogbGRiICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwODAgfQotICB9LAotLyogbGRiICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMDgwMDAwMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBhMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwYTAwMDAwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjA5MCB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMDkwMDAwMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwYjAgfQotICB9LAotLyogbGR1aCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTBiMDAwMDAgfQotICB9LAotLyogbGQgJGRyLEAkc3IrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBlMCB9Ci0gIH0sCi0vKiBsZDI0ICRkciwkdWltbTI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGQyNCwgeyAweGUwMDAwMDAwIH0KLSAgfSwKLS8qIGxkaTggJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0lNTTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDYwMDAgfQotICB9LAotLyogbGRpMTYgJGRyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChIQVNIKSwgT1AgKFNMTzE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTE2LCB7IDB4OTBmMDAwMDAgfQotICB9LAotLyogbG9jayAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGQwIH0KLSAgfSwKLS8qIG1hY2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzA0MCB9Ci0gIH0sCi0vKiBtYWNoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwNDAgfQotICB9LAotLyogbWFjbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDUwIH0KLSAgfSwKLS8qIG1hY2xvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzA1MCB9Ci0gIH0sCi0vKiBtYWN3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDYwIH0KLSAgfSwKLS8qIG1hY3doaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwNjAgfQotICB9LAotLyogbWFjd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzA3MCB9Ci0gIH0sCi0vKiBtYWN3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDcwIH0KLSAgfSwKLS8qIG11bCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDYwIH0KLSAgfSwKLS8qIG11bGhpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzAwMCB9Ci0gIH0sCi0vKiBtdWxoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwMDAgfQotICB9LAotLyogbXVsbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDEwIH0KLSAgfSwKLS8qIG11bGxvICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzAxMCB9Ci0gIH0sCi0vKiBtdWx3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDIwIH0KLSAgfSwKLS8qIG11bHdoaSAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwMjAgfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzAzMCB9Ci0gIH0sCi0vKiBtdWx3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDMwIH0KLSAgfSwKLS8qIG12ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwODAgfQotICB9LAotLyogbXZmYWNoaSAkZHIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpLCB7IDB4NTBmMCB9Ci0gIH0sCi0vKiBtdmZhY2hpICRkciwkYWNjcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpX2EsIHsgMHg1MGYwIH0KLSAgfSwKLS8qIG12ZmFjbG8gJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaSwgeyAweDUwZjEgfQotICB9LAotLyogbXZmYWNsbyAkZHIsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEFDQ1MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaV9hLCB7IDB4NTBmMSB9Ci0gIH0sCi0vKiBtdmZhY21pICRkciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGksIHsgMHg1MGYyIH0KLSAgfSwKLS8qIG12ZmFjbWkgJGRyLCRhY2NzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChBQ0NTKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGlfYSwgeyAweDUwZjIgfQotICB9LAotLyogbXZmYyAkZHIsJHNjciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0NSKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmMsIHsgMHgxMDkwIH0KLSAgfSwKLS8qIG12dGFjaGkgJHNyYzEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgMCB9IH0sCi0gICAgJiBpZm10X212dGFjaGksIHsgMHg1MDcwIH0KLSAgfSwKLS8qIG12dGFjaGkgJHNyYzEsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9tdnRhY2hpX2EsIHsgMHg1MDcwIH0KLSAgfSwKLS8qIG12dGFjbG8gJHNyYzEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgMCB9IH0sCi0gICAgJiBpZm10X212dGFjaGksIHsgMHg1MDcxIH0KLSAgfSwKLS8qIG12dGFjbG8gJHNyYzEsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9tdnRhY2hpX2EsIHsgMHg1MDcxIH0KLSAgfSwKLS8qIG12dGMgJHNyLCRkY3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksICcsJywgT1AgKERDUiksIDAgfSB9LAotICAgICYgaWZtdF9tdnRjLCB7IDB4MTBhMCB9Ci0gIH0sCi0vKiBuZWcgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MzAgfQotICB9LAotLyogbm9wICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDcwMDAgfQotICB9LAotLyogbm90ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGIwIH0KLSAgfSwKLS8qIHJhYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg1MDkwIH0KLSAgfSwKLS8qIHJhYyAkYWNjZCwkYWNjcywkaW1tMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEFDQ0QpLCAnLCcsIE9QIChBQ0NTKSwgJywnLCBPUCAoSU1NMSksIDAgfSB9LAotICAgICYgaWZtdF9yYWNfZHNpLCB7IDB4NTA5MCB9Ci0gIH0sCi0vKiByYWNoICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDUwODAgfQotICB9LAotLyogcmFjaCAkYWNjZCwkYWNjcywkaW1tMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEFDQ0QpLCAnLCcsIE9QIChBQ0NTKSwgJywnLCBPUCAoSU1NMSksIDAgfSB9LAotICAgICYgaWZtdF9yYWNfZHNpLCB7IDB4NTA4MCB9Ci0gIH0sCi0vKiBydGUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4MTBkNiB9Ci0gIH0sCi0vKiBzZXRoICRkciwkaGFzaCRoaTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChIQVNIKSwgT1AgKEhJMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2V0aCwgeyAweGQwYzAwMDAwIH0KLSAgfSwKLS8qIHNsbCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDQwIH0KLSAgfSwKLS8qIHNsbDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDkwYzAwMDAwIH0KLSAgfSwKLS8qIHNsbGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2xsaSwgeyAweDUwNDAgfQotICB9LAotLyogc3JhICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMjAgfQotICB9LAotLyogc3JhMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHYzLCB7IDB4OTBhMDAwMDAgfQotICB9LAotLyogc3JhaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NNSksIDAgfSB9LAotICAgICYgaWZtdF9zbGxpLCB7IDB4NTAyMCB9Ci0gIH0sCi0vKiBzcmwgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTAwMCB9Ci0gIH0sCi0vKiBzcmwzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg5MDgwMDAwMCB9Ci0gIH0sCi0vKiBzcmxpICRkciwkdWltbTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU01KSwgMCB9IH0sCi0gICAgJiBpZm10X3NsbGksIHsgMHg1MDAwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA0MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0X2QsIHsgMHhhMDQwMDAwMCB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDAwIH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0X2QsIHsgMHhhMDAwMDAwMCB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDIwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0X2QsIHsgMHhhMDIwMDAwMCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKyRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKycsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwNjAgfQotICB9LAotLyogc3QgJHNyYzEsQC0kc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJy0nLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDcwIH0KLSAgfSwKLS8qIHN1YiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMCB9Ci0gIH0sCi0vKiBzdWJ2ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDAgfQotICB9LAotLyogc3VieCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMCB9Ci0gIH0sCi0vKiB0cmFwICR1aW1tNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFVJTU00KSwgMCB9IH0sCi0gICAgJiBpZm10X3RyYXAsIHsgMHgxMGYwIH0KLSAgfSwKLS8qIHVubG9jayAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwNTAgfQotICB9LAotLyogc2F0YiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9zYXRiLCB7IDB4ODA2MDAzMDAgfQotICB9LAotLyogc2F0aCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9zYXRiLCB7IDB4ODA2MDAyMDAgfQotICB9LAotLyogc2F0ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X3NhdGIsIHsgMHg4MDYwMDAwMCB9Ci0gIH0sCi0vKiBwY21wYnogJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcHosIHsgMHgzNzAgfQotICB9LAotLyogc2FkZCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg1MGU0IH0KLSAgfSwKLS8qIG1hY3d1MSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDUwYjAgfQotICB9LAotLyogbXNibG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg1MGQwIH0KLSAgfSwKLS8qIG11bHd1MSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDUwYTAgfQotICB9LAotLyogbWFjbGgxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NTBjMCB9Ci0gIH0sCi0vKiBzYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg3NDAxIH0KLSAgfSwKLS8qIHNuYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg3NTAxIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0vKiBGb3JtYXRzIGZvciBBTElBUyBtYWNyby1pbnNucy4gICovCi0KLSNkZWZpbmUgRihmKSAmIG0zMnJfY2dlbl9pZmxkX3RhYmxlW0NPTkNBVDIgKE0zMlJfLGYpXQotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmM4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibDhyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmwyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjbDhyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmNsMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibmM4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuYzI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYnJhOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9icmEyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuY2w4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuY2wyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGJfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRiX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGhfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRoX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHViXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWhfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1aF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcG9wID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4YSA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9TSU1NOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTE2YSA9IHsKLSAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9SMSksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcmFjX2QgPSB7Ci0gIDE2LCAxNiwgMHhmM2ZmLCB7IEYgKEZfT1AxKSwgRiAoRl9BQ0NEKSwgRiAoRl9CSVRTNjcpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfQklUMTQpLCBGIChGX0lNTTEpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9yYWNfZHMgPSB7Ci0gIDE2LCAxNiwgMHhmM2YzLCB7IEYgKEZfT1AxKSwgRiAoRl9BQ0NEKSwgRiAoRl9CSVRTNjcpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfQklUMTQpLCBGIChGX0lNTTEpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9yYWNoX2QgPSB7Ci0gIDE2LCAxNiwgMHhmM2ZmLCB7IEYgKEZfT1AxKSwgRiAoRl9BQ0NEKSwgRiAoRl9CSVRTNjcpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfQklUMTQpLCBGIChGX0lNTTEpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9yYWNoX2RzID0gewotICAxNiwgMTYsIDB4ZjNmMywgeyBGIChGX09QMSksIEYgKEZfQUNDRCksIEYgKEZfQklUUzY3KSwgRiAoRl9PUDIpLCBGIChGX0FDQ1MpLCBGIChGX0JJVDE0KSwgRiAoRl9JTU0xKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0Yl8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0aF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGhfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3B1c2ggPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotLyogRWFjaCBub24tc2ltcGxlIG1hY3JvIGVudHJ5IHBvaW50cyB0byBhbiBhcnJheSBvZiBleHBhbnNpb24gcG9zc2liaWxpdGllcy4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgbTMycl9jZ2VuX21hY3JvX2luc25fdGFibGVbXSA9Ci17Ci0vKiBiYyAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYmM4ciIsICJiYyIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJjICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYmMyNHIiLCAiYmMiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJsICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJibDhyIiwgImJsIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYmwgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJibDI0ciIsICJibCIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBiY2wgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJjbDhyIiwgImJjbCIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShGSUxMX1NMT1QpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogYmNsICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYmNsMjRyIiwgImJjbCIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJuYyAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYm5jOHIiLCAiYm5jIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYm5jICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYm5jMjRyIiwgImJuYyIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYnJhICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJicmE4ciIsICJicmEiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBicmEgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJicmEyNHIiLCAiYnJhIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoVU5DT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJuY2wgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJuY2w4ciIsICJibmNsIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKEZJTExfU0xPVCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBibmNsICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYm5jbDI0ciIsICJibmNsIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGQgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZC0yIiwgImxkIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGQgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAibGQtZDIiLCAibGQiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZGItMiIsICJsZGIiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAibGRiLWQyIiwgImxkYiIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc3IpICovCi0gIHsKLSAgICAtMSwgImxkaC0yIiwgImxkaCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZGgtZDIiLCAibGRoIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICAtMSwgImxkdWItMiIsICJsZHViIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZHViLWQyIiwgImxkdWIiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGR1aC0yIiwgImxkdWgiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkdWgtZDIiLCAibGR1aCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHBvcCAkZHIgKi8KLSAgewotICAgIC0xLCAicG9wIiwgInBvcCIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIC0xLCAibGRpOGEiLCAibGRpIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogbGRpICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgLTEsICJsZGkxNmEiLCAibGRpIiwgMzIsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiByYWMgJGFjY2QgKi8KLSAgewotICAgIC0xLCAicmFjLWQiLCAicmFjIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogcmFjICRhY2NkLCRhY2NzICovCi0gIHsKLSAgICAtMSwgInJhYy1kcyIsICJyYWMiLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiByYWNoICRhY2NkICovCi0gIHsKLSAgICAtMSwgInJhY2gtZCIsICJyYWNoIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogcmFjaCAkYWNjZCwkYWNjcyAqLwotICB7Ci0gICAgLTEsICJyYWNoLWRzIiwgInJhY2giLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgLTEsICJzdC0yIiwgInN0IiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgInN0LWQyIiwgInN0IiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICAtMSwgInN0Yi0yIiwgInN0YiIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAic3RiLWQyIiwgInN0YiIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgLTEsICJzdGgtMiIsICJzdGgiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgInN0aC1kMiIsICJzdGgiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBwdXNoICRzcmMxICovCi0gIHsKLSAgICAtMSwgInB1c2giLCAicHVzaCIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotfTsKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBtMzJyX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbXSA9Ci17Ci0vKiBiYyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzhyLCB7IDB4N2MwMCB9Ci0gIH0sCi0vKiBiYyAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjRyLCB7IDB4ZmMwMDAwMDAgfQotICB9LAotLyogYmwgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmw4ciwgeyAweDdlMDAgfQotICB9LAotLyogYmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9ibDI0ciwgeyAweGZlMDAwMDAwIH0KLSAgfSwKLS8qIGJjbCAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iY2w4ciwgeyAweDc4MDAgfQotICB9LAotLyogYmNsICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmNsMjRyLCB7IDB4ZjgwMDAwMDAgfQotICB9LAotLyogYm5jICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JuYzhyLCB7IDB4N2QwMCB9Ci0gIH0sCi0vKiBibmMgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9ibmMyNHIsIHsgMHhmZDAwMDAwMCB9Ci0gIH0sCi0vKiBicmEgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhOHIsIHsgMHg3ZjAwIH0KLSAgfSwKLS8qIGJyYSAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYTI0ciwgeyAweGZmMDAwMDAwIH0KLSAgfSwKLS8qIGJuY2wgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYm5jbDhyLCB7IDB4NzkwMCB9Ci0gIH0sCi0vKiBibmNsICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYm5jbDI0ciwgeyAweGY5MDAwMDAwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkXzIsIHsgMHgyMGMwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkX2QyLCB7IDB4YTBjMDAwMDAgfQotICB9LAotLyogbGRiICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkYl8yLCB7IDB4MjA4MCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRiX2QyLCB7IDB4YTA4MDAwMDAgfQotICB9LAotLyogbGRoICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkaF8yLCB7IDB4MjBhMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRoX2QyLCB7IDB4YTBhMDAwMDAgfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHViXzIsIHsgMHgyMDkwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1Yl9kMiwgeyAweGEwOTAwMDAwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1aF8yLCB7IDB4MjBiMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkdWhfZDIsIHsgMHhhMGIwMDAwMCB9Ci0gIH0sCi0vKiBwb3AgJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfcG9wLCB7IDB4MjBlZiB9Ci0gIH0sCi0vKiBsZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0lNTTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpOGEsIHsgMHg2MDAwIH0KLSAgfSwKLS8qIGxkaSAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMTZhLCB7IDB4OTBmMDAwMDAgfQotICB9LAotLyogcmFjICRhY2NkICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoQUNDRCksIDAgfSB9LAotICAgICYgaWZtdF9yYWNfZCwgeyAweDUwOTAgfQotICB9LAotLyogcmFjICRhY2NkLCRhY2NzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoQUNDRCksICcsJywgT1AgKEFDQ1MpLCAwIH0gfSwKLSAgICAmIGlmbXRfcmFjX2RzLCB7IDB4NTA5MCB9Ci0gIH0sCi0vKiByYWNoICRhY2NkICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoQUNDRCksIDAgfSB9LAotICAgICYgaWZtdF9yYWNoX2QsIHsgMHg1MDgwIH0KLSAgfSwKLS8qIHJhY2ggJGFjY2QsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChBQ0NEKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9yYWNoX2RzLCB7IDB4NTA4MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0XzIsIHsgMHgyMDQwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZDIsIHsgMHhhMDQwMDAwMCB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdGJfMiwgeyAweDIwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RiX2QyLCB7IDB4YTAwMDAwMDAgfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RoXzIsIHsgMHgyMDIwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0aF9kMiwgeyAweGEwMjAwMDAwIH0KLSAgfSwKLS8qIHB1c2ggJHNyYzEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgMCB9IH0sCi0gICAgJiBpZm10X3B1c2gsIHsgMHgyMDdmIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0hfUAotI2RlZmluZSBDR0VOX0FTTV9IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSF9QCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfUChpbnNuKSAxCi0jZW5kaWYKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElOU04gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0hfUCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KLQotc3RhdGljIGludAotYXNtX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIHJldHVybiBDR0VOX0FTTV9IQVNIX1AgKGluc24pOwotfQotCi1zdGF0aWMgaW50Ci1kaXNfaGFzaF9pbnNuX3AgKGluc24pCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLXsKLSAgLyogSWYgYnVpbGRpbmcgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBOTy1ESVMgYXR0cmlidXRlIGlzIHByZXNlbnQsCi0gICAgIGlnbm9yZS4gICovCi0gIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX05PX0RJUykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIX1AgKGluc24pOwotfQotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0gKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9TSVpFIDEyNwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkKLSNlbHNlCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpIC8qRklYTUUqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogSXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgdG8gcHJvdmlkZSBhIGRlZmF1bHQgaGVyZSwKLSAgIGJ1dCB3aGlsZSB0aGlzIGlzIHVuZGVyIGRldmVsb3BtZW50IHdlIGRvLgotICAgQlVGRkVSIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KLSAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KLQotI2lmbmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAyNTYKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWYsIHZhbHVlKSAoKih1bnNpZ25lZCBjaGFyICopIChidWYpKQotI2VuZGlmCi0KLS8qIFRoZSByZXN1bHQgaXMgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIGluc24uCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0ggaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWFzbV9oYXNoX2luc24gKG1uZW0pCi0gICAgIGNvbnN0IGNoYXIgKiBtbmVtOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSCAobW5lbSk7Ci19Ci0KLS8qIEJVRiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWRpc19oYXNoX2luc24gKGJ1ZiwgdmFsdWUpCi0gICAgIGNvbnN0IGNoYXIgKiBidWY7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIIChidWYsIHZhbHVlKTsKLX0KLQotLyogU2V0IHRoZSByZWNvcmRlZCBsZW5ndGggb2YgdGhlIGluc24gaW4gdGhlIENHRU5fRklFTERTIHN0cnVjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZmllbGRzX2JpdHNpemUgKGZpZWxkcywgc2l6ZSkKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgaW50IHNpemU7Ci17Ci0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBzaXplOwotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4KLSAgIFRoaXMgcGx1Z3MgdGhlIG9wY29kZSBlbnRyaWVzIGFuZCBtYWNybyBpbnN0cnVjdGlvbnMgaW50byB0aGUgY3B1IHRhYmxlLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBudW1fbWFjcm9zID0gKHNpemVvZiAobTMycl9jZ2VuX21hY3JvX2luc25fdGFibGUpIC8KLQkJICAgIHNpemVvZiAobTMycl9jZ2VuX21hY3JvX2luc25fdGFibGVbMF0pKTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdOwotICBjb25zdCBDR0VOX09QQ09ERSAqb2MgPSAmIG0zMnJfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAobnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIG1lbXNldCAoaW5zbnMsIDAsIG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hY3JvczsgKytpKQotICAgIHsKLSAgICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gICAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0gICAgfQotICBjZC0+bWFjcm9faW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPm1hY3JvX2luc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBudW1fbWFjcm9zOwotCi0gIG9jID0gJiBtMzJyX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIGluc25zID0gKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXM7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0KLSAgY2QtPnNpemVvZl9maWVsZHMgPSBzaXplb2YgKENHRU5fRklFTERTKTsKLSAgY2QtPnNldF9maWVsZHNfYml0c2l6ZSA9IHNldF9maWVsZHNfYml0c2l6ZTsKLQotICBjZC0+YXNtX2hhc2hfcCA9IGFzbV9oYXNoX2luc25fcDsKLSAgY2QtPmFzbV9oYXNoID0gYXNtX2hhc2hfaW5zbjsKLSAgY2QtPmFzbV9oYXNoX3NpemUgPSBDR0VOX0FTTV9IQVNIX1NJWkU7Ci0KLSAgY2QtPmRpc19oYXNoX3AgPSBkaXNfaGFzaF9pbnNuX3A7Ci0gIGNkLT5kaXNfaGFzaCA9IGRpc19oYXNoX2luc247Ci0gIGNkLT5kaXNfaGFzaF9zaXplID0gQ0dFTl9ESVNfSEFTSF9TSVpFOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLW9wYy5oIGIvb3Bjb2Rlcy9tMzJyLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOThjNWY5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgaGVhZGVyIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIE0zMlJfT1BDX0gKLSNkZWZpbmUgTTMyUl9PUENfSAotCi0vKiAtLSBvcGMuaCAqLwotCi0jdW5kZWYgQ0dFTl9ESVNfSEFTSF9TSVpFCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAyNTYKLSN1bmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIFgoYikgKCgodW5zaWduZWQgY2hhciAqKSAoYikpWzBdICYgMHhmMCkKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWZmZXIsIHZhbHVlKSBcCi0oWCAoYnVmZmVyKSB8IFwKLSAoWCAoYnVmZmVyKSA9PSAweDQwIHx8IFggKGJ1ZmZlcikgPT0gMHhlMCB8fCBYIChidWZmZXIpID09IDB4NjAgfHwgWCAoYnVmZmVyKSA9PSAweDUwID8gMCBcCi0gIDogWCAoYnVmZmVyKSA9PSAweDcwIHx8IFggKGJ1ZmZlcikgPT0gMHhmMCA/ICgoKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlcikpWzBdICYgMHhmKSBcCi0gIDogWCAoYnVmZmVyKSA9PSAweDMwID8gKCgoKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlcikpWzFdICYgMHg3MCkgPj4gNCkgXAotICA6ICgoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVsxXSAmIDB4ZjApID4+IDQpKSkKLQotLyogLS0gKi8KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgaW5zdHJ1Y3Rpb24gdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl90eXBlIHsKLSAgTTMyUl9JTlNOX0lOVkFMSUQsIE0zMlJfSU5TTl9BREQsIE0zMlJfSU5TTl9BREQzLCBNMzJSX0lOU05fQU5ECi0gLCBNMzJSX0lOU05fQU5EMywgTTMyUl9JTlNOX09SLCBNMzJSX0lOU05fT1IzLCBNMzJSX0lOU05fWE9SCi0gLCBNMzJSX0lOU05fWE9SMywgTTMyUl9JTlNOX0FEREksIE0zMlJfSU5TTl9BRERWLCBNMzJSX0lOU05fQUREVjMKLSAsIE0zMlJfSU5TTl9BRERYLCBNMzJSX0lOU05fQkM4LCBNMzJSX0lOU05fQkMyNCwgTTMyUl9JTlNOX0JFUQotICwgTTMyUl9JTlNOX0JFUVosIE0zMlJfSU5TTl9CR0VaLCBNMzJSX0lOU05fQkdUWiwgTTMyUl9JTlNOX0JMRVoKLSAsIE0zMlJfSU5TTl9CTFRaLCBNMzJSX0lOU05fQk5FWiwgTTMyUl9JTlNOX0JMOCwgTTMyUl9JTlNOX0JMMjQKLSAsIE0zMlJfSU5TTl9CQ0w4LCBNMzJSX0lOU05fQkNMMjQsIE0zMlJfSU5TTl9CTkM4LCBNMzJSX0lOU05fQk5DMjQKLSAsIE0zMlJfSU5TTl9CTkUsIE0zMlJfSU5TTl9CUkE4LCBNMzJSX0lOU05fQlJBMjQsIE0zMlJfSU5TTl9CTkNMOAotICwgTTMyUl9JTlNOX0JOQ0wyNCwgTTMyUl9JTlNOX0NNUCwgTTMyUl9JTlNOX0NNUEksIE0zMlJfSU5TTl9DTVBVCi0gLCBNMzJSX0lOU05fQ01QVUksIE0zMlJfSU5TTl9DTVBFUSwgTTMyUl9JTlNOX0NNUFosIE0zMlJfSU5TTl9ESVYKLSAsIE0zMlJfSU5TTl9ESVZVLCBNMzJSX0lOU05fUkVNLCBNMzJSX0lOU05fUkVNVSwgTTMyUl9JTlNOX0RJVkgKLSAsIE0zMlJfSU5TTl9KQywgTTMyUl9JTlNOX0pOQywgTTMyUl9JTlNOX0pMLCBNMzJSX0lOU05fSk1QCi0gLCBNMzJSX0lOU05fTEQsIE0zMlJfSU5TTl9MRF9ELCBNMzJSX0lOU05fTERCLCBNMzJSX0lOU05fTERCX0QKLSAsIE0zMlJfSU5TTl9MREgsIE0zMlJfSU5TTl9MREhfRCwgTTMyUl9JTlNOX0xEVUIsIE0zMlJfSU5TTl9MRFVCX0QKLSAsIE0zMlJfSU5TTl9MRFVILCBNMzJSX0lOU05fTERVSF9ELCBNMzJSX0lOU05fTERfUExVUywgTTMyUl9JTlNOX0xEMjQKLSAsIE0zMlJfSU5TTl9MREk4LCBNMzJSX0lOU05fTERJMTYsIE0zMlJfSU5TTl9MT0NLLCBNMzJSX0lOU05fTUFDSEkKLSAsIE0zMlJfSU5TTl9NQUNISV9BLCBNMzJSX0lOU05fTUFDTE8sIE0zMlJfSU5TTl9NQUNMT19BLCBNMzJSX0lOU05fTUFDV0hJCi0gLCBNMzJSX0lOU05fTUFDV0hJX0EsIE0zMlJfSU5TTl9NQUNXTE8sIE0zMlJfSU5TTl9NQUNXTE9fQSwgTTMyUl9JTlNOX01VTAotICwgTTMyUl9JTlNOX01VTEhJLCBNMzJSX0lOU05fTVVMSElfQSwgTTMyUl9JTlNOX01VTExPLCBNMzJSX0lOU05fTVVMTE9fQQotICwgTTMyUl9JTlNOX01VTFdISSwgTTMyUl9JTlNOX01VTFdISV9BLCBNMzJSX0lOU05fTVVMV0xPLCBNMzJSX0lOU05fTVVMV0xPX0EKLSAsIE0zMlJfSU5TTl9NViwgTTMyUl9JTlNOX01WRkFDSEksIE0zMlJfSU5TTl9NVkZBQ0hJX0EsIE0zMlJfSU5TTl9NVkZBQ0xPCi0gLCBNMzJSX0lOU05fTVZGQUNMT19BLCBNMzJSX0lOU05fTVZGQUNNSSwgTTMyUl9JTlNOX01WRkFDTUlfQSwgTTMyUl9JTlNOX01WRkMKLSAsIE0zMlJfSU5TTl9NVlRBQ0hJLCBNMzJSX0lOU05fTVZUQUNISV9BLCBNMzJSX0lOU05fTVZUQUNMTywgTTMyUl9JTlNOX01WVEFDTE9fQQotICwgTTMyUl9JTlNOX01WVEMsIE0zMlJfSU5TTl9ORUcsIE0zMlJfSU5TTl9OT1AsIE0zMlJfSU5TTl9OT1QKLSAsIE0zMlJfSU5TTl9SQUMsIE0zMlJfSU5TTl9SQUNfRFNJLCBNMzJSX0lOU05fUkFDSCwgTTMyUl9JTlNOX1JBQ0hfRFNJCi0gLCBNMzJSX0lOU05fUlRFLCBNMzJSX0lOU05fU0VUSCwgTTMyUl9JTlNOX1NMTCwgTTMyUl9JTlNOX1NMTDMKLSAsIE0zMlJfSU5TTl9TTExJLCBNMzJSX0lOU05fU1JBLCBNMzJSX0lOU05fU1JBMywgTTMyUl9JTlNOX1NSQUkKLSAsIE0zMlJfSU5TTl9TUkwsIE0zMlJfSU5TTl9TUkwzLCBNMzJSX0lOU05fU1JMSSwgTTMyUl9JTlNOX1NUCi0gLCBNMzJSX0lOU05fU1RfRCwgTTMyUl9JTlNOX1NUQiwgTTMyUl9JTlNOX1NUQl9ELCBNMzJSX0lOU05fU1RICi0gLCBNMzJSX0lOU05fU1RIX0QsIE0zMlJfSU5TTl9TVF9QTFVTLCBNMzJSX0lOU05fU1RfTUlOVVMsIE0zMlJfSU5TTl9TVUIKLSAsIE0zMlJfSU5TTl9TVUJWLCBNMzJSX0lOU05fU1VCWCwgTTMyUl9JTlNOX1RSQVAsIE0zMlJfSU5TTl9VTkxPQ0sKLSAsIE0zMlJfSU5TTl9TQVRCLCBNMzJSX0lOU05fU0FUSCwgTTMyUl9JTlNOX1NBVCwgTTMyUl9JTlNOX1BDTVBCWgotICwgTTMyUl9JTlNOX1NBREQsIE0zMlJfSU5TTl9NQUNXVTEsIE0zMlJfSU5TTl9NU0JMTywgTTMyUl9JTlNOX01VTFdVMQotICwgTTMyUl9JTlNOX01BQ0xIMSwgTTMyUl9JTlNOX1NDLCBNMzJSX0lOU05fU05DLCBNMzJSX0lOU05fTUFYCi19IENHRU5fSU5TTl9UWVBFOwotCi0vKiBJbmRleCBvZiBgaW52YWxpZCcgaW5zbiBwbGFjZSBob2xkZXIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSU5WQUxJRCBNMzJSX0lOU05fSU5WQUxJRAotCi0vKiBUb3RhbCBudW1iZXIgb2YgaW5zbnMgaW4gdGFibGUuICAqLwotI2RlZmluZSBNQVhfSU5TTlMgKChpbnQpIE0zMlJfSU5TTl9NQVgpCi0KLS8qIFRoaXMgc3RydWN0IHJlY29yZHMgZGF0YSBwcmlvciB0byBpbnNlcnRpb24gb3IgYWZ0ZXIgZXh0cmFjdGlvbi4gICovCi1zdHJ1Y3QgY2dlbl9maWVsZHMKLXsKLSAgaW50IGxlbmd0aDsKLSAgbG9uZyBmX25pbDsKLSAgbG9uZyBmX2FueW9mOwotICBsb25nIGZfb3AxOwotICBsb25nIGZfb3AyOwotICBsb25nIGZfY29uZDsKLSAgbG9uZyBmX3IxOwotICBsb25nIGZfcjI7Ci0gIGxvbmcgZl9zaW1tODsKLSAgbG9uZyBmX3NpbW0xNjsKLSAgbG9uZyBmX3NoaWZ0X29wMjsKLSAgbG9uZyBmX3VpbW00OwotICBsb25nIGZfdWltbTU7Ci0gIGxvbmcgZl91aW1tMTY7Ci0gIGxvbmcgZl91aW1tMjQ7Ci0gIGxvbmcgZl9oaTE2OwotICBsb25nIGZfZGlzcDg7Ci0gIGxvbmcgZl9kaXNwMTY7Ci0gIGxvbmcgZl9kaXNwMjQ7Ci0gIGxvbmcgZl9vcDIzOwotICBsb25nIGZfb3AzOwotICBsb25nIGZfYWNjOwotICBsb25nIGZfYWNjczsKLSAgbG9uZyBmX2FjY2Q7Ci0gIGxvbmcgZl9iaXRzNjc7Ci0gIGxvbmcgZl9iaXQxNDsKLSAgbG9uZyBmX2ltbTE7Ci19OwotCi0jZGVmaW5lIENHRU5fSU5JVF9QQVJTRShvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX0lOU0VSVChvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX0VYVFJBQ1Qob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9QUklOVChvZCkgXAote1wKLX0KLQotCi0jZW5kaWYgLyogTTMyUl9PUENfSCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLW9waW5zdC5jIGIvb3Bjb2Rlcy9tMzJyLW9waW5zdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk2NTFmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1vcGluc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDY3MyArMCwwIEBACi0vKiBTZW1hbnRpYyBvcGVyYW5kIGluc3RhbmNlcyBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLQotLyogT3BlcmFuZCByZWZlcmVuY2VzLiAgKi8KLQotI2RlZmluZSBJTlBVVCBDR0VOX09QSU5TVF9JTlBVVAotI2RlZmluZSBPVVRQVVQgQ0dFTl9PUElOU1RfT1VUUFVUCi0jZGVmaW5lIEVORCBDR0VOX09QSU5TVF9FTkQKLSNkZWZpbmUgQ09ORF9SRUYgQ0dFTl9PUElOU1RfQ09ORF9SRUYKLSNkZWZpbmUgT1BfRU5UKG9wKSBDT05DQVQyIChNMzJSX09QRVJBTkRfLG9wKQotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9lbXB0eV9vcHNbXSA9IHsKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkX29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9hbmQzX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1aW1tMTYiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVJTU0xNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfb3IzX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1bG8xNiIsIEhXX0hfVUxPMTYsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVMTzE2KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9hZGRpX29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzaW1tOCIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTSU1NOCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkdl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2FkZHYzX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9hZGR4X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iYzhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iYzI0X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iZXFfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwMTYiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AxNiksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iZXF6X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDE2IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMTYpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmw4X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDgiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1A4KSwgMCwgMCB9LAotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmwyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AyNCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDI0KSwgMCwgMCB9LAotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmNsOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiZGlzcDgiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1A4KSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBPVVRQVVQsICJoX2dyXzE0IiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCAwLCAxNCwgQ09ORF9SRUYgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2JjbDI0X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9icmE4X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDgiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1A4KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9icmEyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AyNCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDI0KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9jbXBfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2NtcGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzaW1tMTYiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9jbXB6X29wc1tdID0gewotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9kaXZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2pjX29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9qbF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfam1wX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xkX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfc3IiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xkX2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9hZGRfX0RGTFRfc3Jfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbGRfcGx1c19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9sZDI0X29wc1tdID0gewotICB7IElOUFVULCAidWltbTI0IiwgSFdfSF9BRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFVJTU0yNCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbGRpOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW04IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU04KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9sZGkxNl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbG9ja19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbG9jayIsIEhXX0hfTE9DSywgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X21hY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tYWNoaV9hX29wc1tdID0gewotICB7IElOUFVULCAiYWNjIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0MpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0MpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X211bGhpX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X211bGhpX2Ffb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0MpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212X29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212ZmFjaGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdmZhY2hpX2Ffb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2NzIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0NTKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdmZjX29wc1tdID0gewotICB7IElOUFVULCAic2NyIiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTQ1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212dGFjaGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212dGFjaGlfYV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3MiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCBPUF9FTlQgKEFDQ1MpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjcyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDUyksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbXZ0Y19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRjciIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRENSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9ub3Bfb3BzW10gPSB7Ci0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3JhY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfcmFjX2RzaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3MiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCBPUF9FTlQgKEFDQ1MpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJpbW0xIiwgSFdfSF9VSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKElNTTEpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjZCIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDRCksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfcnRlX29wc1tdID0gewotICB7IElOUFVULCAiaF9iYnBzdyIsIEhXX0hfQkJQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiaF9jcl8xNCIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDE0LCAwIH0sCi0gIHsgSU5QVVQsICJoX2NyXzYiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCA2LCAwIH0sCi0gIHsgT1VUUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IE9VVFBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc2V0aF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhpMTYiLCBIV19IX0hJMTYsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChISTE2KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zbGwzX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU0lNTTE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NsbGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInVpbW01IiwgSFdfSF9VSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFVJTU01KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zdF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX0RGTFRfc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RiX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9RSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9zcmMyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9RSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zdGJfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfUUksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX0RGTFRfc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RoX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9ISSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9zcmMyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9ISSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zdGhfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfSEksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX0RGTFRfc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RfcGx1c19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9uZXdfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3RyYXBfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBJTlBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTQiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVJTU00KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfYmJwc3ciLCBIV19IX0JCUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl8xNCIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IE9VVFBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF91bmxvY2tfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgImhfbG9jayIsIEhXX0hfTE9DSywgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NhdGJfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc2F0X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NhZGRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2FjY3Vtc18wIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiaF9hY2N1bXNfMSIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDEsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2FjY3Vtc18wIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tYWN3dTFfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2FjY3Vtc18xIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMSwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfYWNjdW1zXzEiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCAwLCAxLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X211bHd1MV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2FjY3Vtc18xIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMSwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi0jdW5kZWYgSU5QVVQKLSN1bmRlZiBPVVRQVVQKLSN1bmRlZiBFTkQKLSN1bmRlZiBDT05EX1JFRgotI3VuZGVmIE9QX0VOVAotCi0vKiBPcGVyYW5kIGluc3RhbmNlIGxvb2t1cCB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCAqbTMycl9jZ2VuX29waW5zdF90YWJsZVtNQVhfSU5TTlNdID0gewotICAwLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X2FkZDNfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X2FuZDNfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X29yM19vcHNbMF0sCi0gICYgc2ZtdF9hZGRfb3BzWzBdLAotICAmIHNmbXRfYW5kM19vcHNbMF0sCi0gICYgc2ZtdF9hZGRpX29wc1swXSwKLSAgJiBzZm10X2FkZHZfb3BzWzBdLAotICAmIHNmbXRfYWRkdjNfb3BzWzBdLAotICAmIHNmbXRfYWRkeF9vcHNbMF0sCi0gICYgc2ZtdF9iYzhfb3BzWzBdLAotICAmIHNmbXRfYmMyNF9vcHNbMF0sCi0gICYgc2ZtdF9iZXFfb3BzWzBdLAotICAmIHNmbXRfYmVxel9vcHNbMF0sCi0gICYgc2ZtdF9iZXF6X29wc1swXSwKLSAgJiBzZm10X2JlcXpfb3BzWzBdLAotICAmIHNmbXRfYmVxel9vcHNbMF0sCi0gICYgc2ZtdF9iZXF6X29wc1swXSwKLSAgJiBzZm10X2JlcXpfb3BzWzBdLAotICAmIHNmbXRfYmw4X29wc1swXSwKLSAgJiBzZm10X2JsMjRfb3BzWzBdLAotICAmIHNmbXRfYmNsOF9vcHNbMF0sCi0gICYgc2ZtdF9iY2wyNF9vcHNbMF0sCi0gICYgc2ZtdF9iYzhfb3BzWzBdLAotICAmIHNmbXRfYmMyNF9vcHNbMF0sCi0gICYgc2ZtdF9iZXFfb3BzWzBdLAotICAmIHNmbXRfYnJhOF9vcHNbMF0sCi0gICYgc2ZtdF9icmEyNF9vcHNbMF0sCi0gICYgc2ZtdF9iY2w4X29wc1swXSwKLSAgJiBzZm10X2JjbDI0X29wc1swXSwKLSAgJiBzZm10X2NtcF9vcHNbMF0sCi0gICYgc2ZtdF9jbXBpX29wc1swXSwKLSAgJiBzZm10X2NtcF9vcHNbMF0sCi0gICYgc2ZtdF9jbXBpX29wc1swXSwKLSAgJiBzZm10X2NtcF9vcHNbMF0sCi0gICYgc2ZtdF9jbXB6X29wc1swXSwKLSAgJiBzZm10X2Rpdl9vcHNbMF0sCi0gICYgc2ZtdF9kaXZfb3BzWzBdLAotICAmIHNmbXRfZGl2X29wc1swXSwKLSAgJiBzZm10X2Rpdl9vcHNbMF0sCi0gICYgc2ZtdF9kaXZfb3BzWzBdLAotICAmIHNmbXRfamNfb3BzWzBdLAotICAmIHNmbXRfamNfb3BzWzBdLAotICAmIHNmbXRfamxfb3BzWzBdLAotICAmIHNmbXRfam1wX29wc1swXSwKLSAgJiBzZm10X2xkX29wc1swXSwKLSAgJiBzZm10X2xkX2Rfb3BzWzBdLAotICAmIHNmbXRfbGRfb3BzWzBdLAotICAmIHNmbXRfbGRfZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9kX29wc1swXSwKLSAgJiBzZm10X2xkX29wc1swXSwKLSAgJiBzZm10X2xkX2Rfb3BzWzBdLAotICAmIHNmbXRfbGRfb3BzWzBdLAotICAmIHNmbXRfbGRfZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9wbHVzX29wc1swXSwKLSAgJiBzZm10X2xkMjRfb3BzWzBdLAotICAmIHNmbXRfbGRpOF9vcHNbMF0sCi0gICYgc2ZtdF9sZGkxNl9vcHNbMF0sCi0gICYgc2ZtdF9sb2NrX29wc1swXSwKLSAgJiBzZm10X21hY2hpX29wc1swXSwKLSAgJiBzZm10X21hY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbWFjaGlfb3BzWzBdLAotICAmIHNmbXRfbWFjaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X21hY2hpX29wc1swXSwKLSAgJiBzZm10X21hY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X211bGhpX29wc1swXSwKLSAgJiBzZm10X211bGhpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXVsaGlfb3BzWzBdLAotICAmIHNmbXRfbXVsaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9hX29wc1swXSwKLSAgJiBzZm10X211bGhpX29wc1swXSwKLSAgJiBzZm10X211bGhpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZfb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdmZhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdmZhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdmZhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZmY19vcHNbMF0sCi0gICYgc2ZtdF9tdnRhY2hpX29wc1swXSwKLSAgJiBzZm10X212dGFjaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tdnRhY2hpX29wc1swXSwKLSAgJiBzZm10X212dGFjaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tdnRjX29wc1swXSwKLSAgJiBzZm10X212X29wc1swXSwKLSAgJiBzZm10X25vcF9vcHNbMF0sCi0gICYgc2ZtdF9tdl9vcHNbMF0sCi0gICYgc2ZtdF9yYWNfb3BzWzBdLAotICAmIHNmbXRfcmFjX2RzaV9vcHNbMF0sCi0gICYgc2ZtdF9yYWNfb3BzWzBdLAotICAmIHNmbXRfcmFjX2RzaV9vcHNbMF0sCi0gICYgc2ZtdF9ydGVfb3BzWzBdLAotICAmIHNmbXRfc2V0aF9vcHNbMF0sCi0gICYgc2ZtdF9hZGRfb3BzWzBdLAotICAmIHNmbXRfc2xsM19vcHNbMF0sCi0gICYgc2ZtdF9zbGxpX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9zbGwzX29wc1swXSwKLSAgJiBzZm10X3NsbGlfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X3NsbDNfb3BzWzBdLAotICAmIHNmbXRfc2xsaV9vcHNbMF0sCi0gICYgc2ZtdF9zdF9vcHNbMF0sCi0gICYgc2ZtdF9zdF9kX29wc1swXSwKLSAgJiBzZm10X3N0Yl9vcHNbMF0sCi0gICYgc2ZtdF9zdGJfZF9vcHNbMF0sCi0gICYgc2ZtdF9zdGhfb3BzWzBdLAotICAmIHNmbXRfc3RoX2Rfb3BzWzBdLAotICAmIHNmbXRfc3RfcGx1c19vcHNbMF0sCi0gICYgc2ZtdF9zdF9wbHVzX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9hZGR2X29wc1swXSwKLSAgJiBzZm10X2FkZHhfb3BzWzBdLAotICAmIHNmbXRfdHJhcF9vcHNbMF0sCi0gICYgc2ZtdF91bmxvY2tfb3BzWzBdLAotICAmIHNmbXRfc2F0Yl9vcHNbMF0sCi0gICYgc2ZtdF9zYXRiX29wc1swXSwKLSAgJiBzZm10X3NhdF9vcHNbMF0sCi0gICYgc2ZtdF9jbXB6X29wc1swXSwKLSAgJiBzZm10X3NhZGRfb3BzWzBdLAotICAmIHNmbXRfbWFjd3UxX29wc1swXSwKLSAgJiBzZm10X21hY2hpX29wc1swXSwKLSAgJiBzZm10X211bHd1MV9vcHNbMF0sCi0gICYgc2ZtdF9tYWN3dTFfb3BzWzBdLAotICAmIHNmbXRfc2Nfb3BzWzBdLAotICAmIHNmbXRfc2Nfb3BzWzBdLAotfTsKLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuICAqLwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9vcGluc3RfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKipvaSA9ICYgbTMycl9jZ2VuX29waW5zdF90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3BpbnN0ID0gb2lbaV07Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL202OGstZGlzLmMgYi9vcGNvZGVzL202OGstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDNhODIxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTY4ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMDggKzAsMCBAQAotLyogUHJpbnQgTW90b3JvbGEgNjhrIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAxOTg2LCA4NywgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9tNjhrLmgiCi0KLS8qIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9wcmludF9hZGRyZXNzIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludAotZmV0Y2hfYXJnIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYmFzZSBQQVJBTVMgKChpbnQsIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXByaW50X2luZGV4ZWQgUEFSQU1TICgoaW50LCB1bnNpZ25lZCBjaGFyICosIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLAotCQkJYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLUNPTlNUIGNoYXIgKiBDT05TVCBmcGNyX25hbWVzW10gPSB7Ci0gICIiLCAiJWZwaWFyIiwgIiVmcHNyIiwgIiVmcGlhci8lZnBzciIsICIlZnBjciIsCi0gICIlZnBpYXIvJWZwY3IiLCAiJWZwc3IvJWZwY3IiLCAiJWZwaWFyLyVmcHNyLyVmcGNyIn07Ci0KLXN0YXRpYyBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IHsKLSAgIiVkMCIsICIlZDEiLCAiJWQyIiwgIiVkMyIsICIlZDQiLCAiJWQ1IiwgIiVkNiIsICIlZDciLAotICAiJWEwIiwgIiVhMSIsICIlYTIiLCAiJWEzIiwgIiVhNCIsICIlYTUiLCAiJWZwIiwgIiVzcCIsCi0gICIlcHMiLCAiJXBjIn07Ci0KLS8qIFNpZ24tZXh0ZW5kIGFuICh1bnNpZ25lZCBjaGFyKS4gKi8KLSNpZiBfX1NURENfXyA9PSAxCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChzaWduZWQgY2hhcikoY2gpKQotI2Vsc2UKLSNkZWZpbmUgQ09FUkNFX1NJR05FRF9DSEFSKGNoKSAoKGludCkoKChjaCkgXiAweDgwKSAmIDB4RkYpIC0gMTI4KQotI2VuZGlmCi0KLS8qIEdldCBhIDEgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIE5FWFRCWVRFKHApICAocCArPSAyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgQ09FUkNFX1NJR05FRF9DSEFSKHBbLTFdKSkKLQotLyogR2V0IGEgMiBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgQ09FUkNFMTYoeCkgKChpbnQpICgoKHgpIF4gMHg4MDAwKSAtIDB4ODAwMCkpCi0jZGVmaW5lIE5FWFRXT1JEKHApICBcCi0gIChwICs9IDIsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBDT0VSQ0UxNiAoKHBbLTJdIDw8IDgpICsgcFstMV0pKQotCi0vKiBHZXQgYSA0IGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBDT0VSQ0UzMih4KSAoKGJmZF9zaWduZWRfdm1hKSAoKHgpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotI2RlZmluZSBORVhUTE9ORyhwKSAgXAotICAocCArPSA0LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgKENPRVJDRTMyICgoKCgoKHBbLTRdIDw8IDgpICsgcFstM10pIDw8IDgpICsgcFstMl0pIDw8IDgpICsgcFstMV0pKSkKLQotLyogR2V0IGEgNCBieXRlIHVuc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBORVhUVUxPTkcocCkgIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgICh1bnNpZ25lZCBpbnQpICgoKCgoKHBbLTRdIDw8IDgpICsgcFstM10pIDw8IDgpICsgcFstMl0pIDw8IDgpICsgcFstMV0pKQotCi0vKiBHZXQgYSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0LiAgKi8KLSNkZWZpbmUgTkVYVFNJTkdMRSh2YWwsIHApIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2JpZywgKGNoYXIgKikgcCAtIDQsICZ2YWwpKQotCi0vKiBHZXQgYSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0LiAgKi8KLSNkZWZpbmUgTkVYVERPVUJMRSh2YWwsIHApIFwKLSAgKHAgKz0gOCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZywgKGNoYXIgKikgcCAtIDgsICZ2YWwpKQotCi0vKiBHZXQgYW4gZXh0ZW5kZWQgcHJlY2lzaW9uIGZsb2F0LiAgKi8KLSNkZWZpbmUgTkVYVEVYVEVORCh2YWwsIHApIFwKLSAgKHAgKz0gMTIsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9tNjg4ODFfZXh0LCAoY2hhciAqKSBwIC0gMTIsICZ2YWwpKQotCi0vKiBOZWVkIGEgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIHBhY2tlZCB0byBkb3VibGUKLSAgIHByZWNpc2lvbi4gICBBY3R1YWxseSwgaXQncyBlYXNpZXIgdG8gcHJpbnQgYQotICAgcGFja2VkIG51bWJlciB0aGFuIGEgZG91YmxlIGFueXdheSwgc28gbWF5YmUKLSAgIHRoZXJlIHNob3VsZCBiZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgdGhpcy4uLiAqLwotI2RlZmluZSBORVhUUEFDS0VEKHApIFwKLSAgKHAgKz0gMTIsIEZFVENIX0RBVEEgKGluZm8sIHApLCAwLjApCi0KLQwKLS8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDIyCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBwcml2YXRlICpwcml2ID0gKHN0cnVjdCBwcml2YXRlICopaW5mby0+cHJpdmF0ZV9kYXRhOwotICBiZmRfdm1hIHN0YXJ0ID0gcHJpdi0+aW5zbl9zdGFydCArIChwcml2LT5tYXhfZmV0Y2hlZCAtIHByaXYtPnRoZV9idWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHN0YXJ0LAotCQkJCSAgICAgIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLSAgcmV0dXJuIDE7Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJpbnQgdG8gdGhlIGJpdC1idWNrZXQuICovCi1zdGF0aWMgaW50Ci0jaWZkZWYgX19TVERDX18KLWR1bW15X3ByaW50ZXIgKEZJTEUgKiBmaWxlLCBjb25zdCBjaGFyICogZm9ybWF0LCAuLi4pCi0jZWxzZQotZHVtbXlfcHJpbnRlciAoZmlsZSkgRklMRSAqZmlsZTsKLSNlbmRpZgotIHsgcmV0dXJuIDA7IH0KLQotc3RhdGljIHZvaWQKLWR1bW15X3ByaW50X2FkZHJlc3MgKHZtYSwgaW5mbykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotfQotCi0vKiBQcmludCB0aGUgbTY4ayBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAotICAgb24gSU5GTy0+U1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICovCi0KLWludAotcHJpbnRfaW5zbl9tNjhrIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBjaGFyICpzYXZlX3A7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmQ7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYmVzdG1hc2s7Ci0gIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqYmVzdCA9IDA7Ci0gIHVuc2lnbmVkIGludCBhcmNoX21hc2s7Ci0gIHN0cnVjdCBwcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7Ci0gIGZwcmludGZfZnR5cGUgc2F2ZV9wcmludGVyID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICB2b2lkICgqc2F2ZV9wcmludF9hZGRyZXNzKSBQQVJBTVMoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKikpCi0gICAgPSBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmM7Ci0gIGludCBtYWpvcl9vcGNvZGU7Ci0gIHN0YXRpYyBpbnQgbnVtb3Bjb2Rlc1sxNl07Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKipvcGNvZGVzWzE2XTsKLQotICBpZiAoIW9wY29kZXNbMF0pCi0gICAgewotICAgICAgLyogU3BlZWQgdXAgdGhlIG1hdGNoaW5nIGJ5IHNvcnRpbmcgdGhlIG9wY29kZSB0YWJsZSBvbiB0aGUgdXBwZXIKLQkgZm91ciBiaXRzIG9mIHRoZSBvcGNvZGUuICAqLwotICAgICAgY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICoqb3BjX3BvaW50ZXJbMTZdOwotCi0gICAgICAvKiBGaXJzdCBjb3VudCBob3cgbWFueSBvcGNvZGVzIGFyZSBpbiBlYWNoIG9mIHRoZSBzaXh0ZWVuIGJ1Y2tldHMuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IG02OGtfbnVtb3Bjb2RlczsgaSsrKQotCW51bW9wY29kZXNbKG02OGtfb3Bjb2Rlc1tpXS5vcGNvZGUgPj4gMjgpICYgMTVdKys7Ci0KLSAgICAgIC8qIFRoZW4gY3JlYXRlIGEgc29ydGVkIHRhYmxlIG9mIHBvaW50ZXJzIHRoYXQgcG9pbnQgaW50byB0aGUKLQkgdW5zb3J0ZWQgdGFibGUuICAqLwotICAgICAgb3BjX3BvaW50ZXJbMF0gPSAoKGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqKikKLQkJCXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG02OGtfb3Bjb2RlICopCi0JCQkJICogbTY4a19udW1vcGNvZGVzKSk7Ci0gICAgICBvcGNvZGVzWzBdID0gb3BjX3BvaW50ZXJbMF07Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykKLQl7Ci0JICBvcGNfcG9pbnRlcltpXSA9IG9wY19wb2ludGVyW2kgLSAxXSArIG51bW9wY29kZXNbaSAtIDFdOwotCSAgb3Bjb2Rlc1tpXSA9IG9wY19wb2ludGVyW2ldOwotCX0KLQotICAgICAgZm9yIChpID0gMDsgaSA8IG02OGtfbnVtb3Bjb2RlczsgaSsrKQotCSpvcGNfcG9pbnRlclsobTY4a19vcGNvZGVzW2ldLm9wY29kZSA+PiAyOCkgJiAxNV0rKyA9ICZtNjhrX29wY29kZXNbaV07Ci0KLSAgICB9Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7Ci0gIC8qIFRlbGwgb2JqZHVtcCB0byB1c2UgdHdvIGJ5dGVzIHBlciBjaHVuayBhbmQgc2l4IGJ5dGVzIHBlciBsaW5lIGZvcgotICAgICBkaXNwbGF5aW5nIHJhdyBkYXRhLiAgKi8KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA2OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBtZW1hZGRyOwotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLSAgc3dpdGNoIChpbmZvLT5tYWNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFyY2hfbWFzayA9ICh1bnNpZ25lZCBpbnQpIC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMDA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAwODoKLSAgICAgIGFyY2hfbWFzayA9IG02ODAwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDEwOgotICAgICAgYXJjaF9tYXNrID0gbTY4MDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAzMDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODAzMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDQwOgotICAgICAgYXJjaF9tYXNrID0gbTY4MDQwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwNjA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwNjA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYXJjaF9tYXNrIHw9IG02ODg4MSB8IG02ODg1MTsKLQotICBiZXN0bWFzayA9IDA7Ci0gIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDIpOwotICBtYWpvcl9vcGNvZGUgPSAoYnVmZmVyWzBdID4+IDQpICYgMTU7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1vcGNvZGVzW21ham9yX29wY29kZV07IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKm9wYyA9IG9wY29kZXNbbWFqb3Jfb3Bjb2RlXVtpXTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlID0gb3BjLT5vcGNvZGU7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1hdGNoID0gb3BjLT5tYXRjaDsKLQotICAgICAgaWYgKCgoMHhmZiAmIGJ1ZmZlclswXSAmIChtYXRjaCA+PiAyNCkpID09ICgweGZmICYgKG9wY29kZSA+PiAyNCkpKQotCSAgJiYgKCgweGZmICYgYnVmZmVyWzFdICYgKG1hdGNoID4+IDE2KSkgPT0gKDB4ZmYgJiAob3Bjb2RlID4+IDE2KSkpCi0JICAvKiBPbmx5IGZldGNoIHRoZSBuZXh0IHR3byBieXRlcyBpZiB3ZSBuZWVkIHRvLiAgKi8KLQkgICYmICgoKDB4ZmZmZiAmIG1hdGNoKSA9PSAwKQotCSAgICAgIHx8Ci0JICAgICAgKEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDQpCi0JICAgICAgICYmICgoMHhmZiAmIGJ1ZmZlclsyXSAmIChtYXRjaCA+PiA4KSkgPT0gKDB4ZmYgJiAob3Bjb2RlID4+IDgpKSkKLQkgICAgICAgJiYgKCgweGZmICYgYnVmZmVyWzNdICYgbWF0Y2gpID09ICgweGZmICYgb3Bjb2RlKSkpCi0JICAgICAgKQotCSAgJiYgKG9wYy0+YXJjaCAmIGFyY2hfbWFzaykgIT0gMCkKLQl7Ci0JICAvKiBEb24ndCB1c2UgZm9yIHByaW50b3V0IHRoZSB2YXJpYW50cyBvZiBkaXZ1bCBhbmQgZGl2c2wKLQkgICAgIHRoYXQgaGF2ZSB0aGUgc2FtZSByZWdpc3RlciBudW1iZXIgaW4gdHdvIHBsYWNlcy4KLQkgICAgIFRoZSBtb3JlIGdlbmVyYWwgdmFyaWFudHMgd2lsbCBtYXRjaCBpbnN0ZWFkLiAgKi8KLQkgIGZvciAoZCA9IG9wYy0+YXJnczsgKmQ7IGQgKz0gMikKLQkgICAgaWYgKGRbMV0gPT0gJ0QnKQotCSAgICAgIGJyZWFrOwotCi0JICAvKiBEb24ndCB1c2UgZm9yIHByaW50b3V0IHRoZSB2YXJpYW50cyBvZiBtb3N0IGZsb2F0aW5nCi0JICAgICBwb2ludCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgd2hpY2ggdXNlIHRoZSBzYW1lCi0JICAgICByZWdpc3RlciBudW1iZXIgaW4gdHdvIHBsYWNlcywgYXMgYWJvdmUuICovCi0JICBpZiAoKmQgPT0gJ1wwJykKLQkgICAgZm9yIChkID0gb3BjLT5hcmdzOyAqZDsgZCArPSAyKQotCSAgICAgIGlmIChkWzFdID09ICd0JykKLQkJYnJlYWs7Ci0KLQkgIC8qIERvbid0IG1hdGNoIGZtb3ZlbCB3aXRoIG1vcmUgdGhhbiBvbmUgcmVnaXN0ZXI7IHdhaXQgZm9yCi0gICAgICAgICAgICAgZm1vdmVtbC4gICovCi0JICBpZiAoKmQgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGZvciAoZCA9IG9wYy0+YXJnczsgKmQ7IGQgKz0gMikKLQkJewotCQkgIGlmIChkWzBdID09ICdzJyAmJiBkWzFdID09ICc4JykKLQkJICAgIHsKLQkJICAgICAgaW50IHZhbDsKLQotCQkgICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgZFsxXSwgMywgaW5mbyk7Ci0JCSAgICAgIGlmICgodmFsICYgKHZhbCAtIDEpKSAhPSAwKQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoKmQgPT0gJ1wwJyAmJiBtYXRjaCA+IGJlc3RtYXNrKQotCSAgICB7Ci0JICAgICAgYmVzdCA9IG9wYzsKLQkgICAgICBiZXN0bWFzayA9IG1hdGNoOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYmVzdCA9PSAwKQotICAgIGdvdG8gaW52YWxpZDsKLQotICAvKiBQb2ludCBhdCBmaXJzdCB3b3JkIG9mIGFyZ3VtZW50IGRhdGEsCi0gICAgIGFuZCBhdCBkZXNjcmlwdG9yIGZvciBmaXJzdCBhcmd1bWVudC4gICovCi0gIHAgPSBidWZmZXIgKyAyOwotICAKLSAgLyogRmlndXJlIG91dCBob3cgbG9uZyB0aGUgZml4ZWQtc2l6ZSBwb3J0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiBpcy4KLSAgICAgVGhlIG9ubHkgcGxhY2UgdGhpcyBpcyBzdG9yZWQgaW4gdGhlIG9wY29kZSB0YWJsZSBpcwotICAgICBpbiB0aGUgYXJndW1lbnRzLS1sb29rIGZvciBhcmd1bWVudHMgd2hpY2ggc3BlY2lmeSBmaWVsZHMgaW4gdGhlIDJuZAotICAgICBvciAzcmQgd29yZHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgZm9yIChkID0gYmVzdC0+YXJnczsgKmQ7IGQgKz0gMikKLSAgICB7Ci0gICAgICAvKiBJIGRvbid0IHRoaW5rIGl0IGlzIG5lY2Vzc2FyeSB0byBiZSBjaGVja2luZyBkWzBdIGhlcmU7IEkgc3VzcGVjdAotCSBhbGwgdGhpcyBjb3VsZCBiZSBtb3ZlZCB0byB0aGUgY2FzZSBzdGF0ZW1lbnQgYmVsb3cuICAqLwotICAgICAgaWYgKGRbMF0gPT0gJyMnKQotCXsKLQkgIGlmIChkWzFdID09ICdsJyAmJiBwIC0gYnVmZmVyIDwgNikKLQkgICAgcCA9IGJ1ZmZlciArIDY7Ci0JICBlbHNlIGlmIChwIC0gYnVmZmVyIDwgNCAmJiBkWzFdICE9ICdDJyAmJiBkWzFdICE9ICc4JyApCi0JICAgIHAgPSBidWZmZXIgKyA0OwotCX0KLSAgICAgIGlmICgoZFswXSA9PSAnTCcgfHwgZFswXSA9PSAnbCcpICYmIGRbMV0gPT0gJ3cnICYmIHAgLSBidWZmZXIgPCA0KQotCXAgPSBidWZmZXIgKyA0OwotICAgICAgc3dpdGNoIChkWzFdKQotCXsKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc3JzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQljYXNlICdpJzoKLQkgIGlmIChwIC0gYnVmZmVyIDwgNCkKLQkgICAgcCA9IGJ1ZmZlciArIDQ7Ci0JICBicmVhazsKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQkgIGlmIChwIC0gYnVmZmVyIDwgNikKLQkgICAgcCA9IGJ1ZmZlciArIDY7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBwZmx1c2hhIGlzIGFuIGV4Y2VwdGlvbnMuICBJdCB0YWtlcyBubyBhcmd1bWVudHMgYnV0IGlzIHR3byB3b3JkcwotICAgICBsb25nLiAgUmVjb2duaXplIGl0IGJ5IGxvb2tpbmcgYXQgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIG1hc2suICAqLwotICBpZiAocCAtIGJ1ZmZlciA8IDQgJiYgKGJlc3QtPm1hdGNoICYgMHhGRkZGKSAhPSAwKQotICAgIHAgPSBidWZmZXIgKyA0OwotCi0gIC8qIGxwc3RvcCBpcyBhbm90aGVyIGV4Y2VwdGlvbi4gIEl0IHRha2VzIGEgb25lIHdvcmQgYXJndW1lbnQgYnV0IGlzCi0gICAgIHRocmVlIHdvcmRzIGxvbmcuICAqLwotICBpZiAocCAtIGJ1ZmZlciA8IDYKLSAgICAgICYmIChiZXN0LT5tYXRjaCAmIDB4ZmZmZikgPT0gMHhmZmZmCi0gICAgICAmJiBiZXN0LT5hcmdzWzBdID09ICcjJwotICAgICAgJiYgYmVzdC0+YXJnc1sxXSA9PSAndycpCi0gICAgewotICAgICAgLyogQ29weSB0aGUgb25lIHdvcmQgYXJndW1lbnQgaW50byB0aGUgdXN1YWwgbG9jYXRpb24gZm9yIGEgb25lCi0JIHdvcmQgYXJndW1lbnQsIHRvIHNpbXBsaWZ5IHByaW50aW5nIGl0LiAgV2UgY2FuIGdldCBhd2F5IHdpdGgKLQkgdGhpcyBiZWNhdXNlIHdlIGtub3cgZXhhY3RseSB3aGF0IHRoZSBzZWNvbmQgd29yZCBpcywgYW5kIHdlCi0JIGFyZW4ndCBnb2luZyB0byBwcmludCBhbnl0aGluZyBiYXNlZCBvbiBpdC4gICovCi0gICAgICBwID0gYnVmZmVyICsgNjsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIHApOwotICAgICAgYnVmZmVyWzJdID0gYnVmZmVyWzRdOwotICAgICAgYnVmZmVyWzNdID0gYnVmZmVyWzVdOwotICAgIH0KLQotICBGRVRDSF9EQVRBIChpbmZvLCBwKTsKLSAgCi0gIGQgPSBiZXN0LT5hcmdzOwotCi0gIC8qIFdlIGNhbiB0aGUgb3BlcmFuZHMgdHdpY2UuICBUaGUgZmlyc3QgdGltZSB3ZSBkb24ndCBwcmludCBhbnl0aGluZywKLSAgICAgYnV0IGxvb2sgZm9yIGVycm9ycy4gKi8KLQotICBzYXZlX3AgPSBwOwotICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgPSBkdW1teV9wcmludF9hZGRyZXNzOwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgPSAoZnByaW50Zl9mdHlwZSlkdW1teV9wcmludGVyOwotICBmb3IgKCA7ICpkOyBkICs9IDIpCi0gICAgewotICAgICAgaW50IGVhdGVuID0gcHJpbnRfaW5zbl9hcmcgKGQsIGJ1ZmZlciwgcCwgbWVtYWRkciArIChwIC0gYnVmZmVyKSwgaW5mbyk7Ci0gICAgICBpZiAoZWF0ZW4gPj0gMCkKLQlwICs9IGVhdGVuOwotICAgICAgZWxzZSBpZiAoZWF0ZW4gPT0gLTEpCi0JZ290byBpbnZhbGlkOwotICAgICAgZWxzZQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKShpbmZvLT5zdHJlYW0sCi0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCQlfKCI8aW50ZXJuYWwgZXJyb3IgaW4gb3Bjb2RlIHRhYmxlOiAlcyAlcz5cbiIpLAotCQkJCWJlc3QtPm5hbWUsCi0JCQkJYmVzdC0+YXJncyk7Ci0JICBnb3RvIGludmFsaWQ7Ci0JfQotCi0gICAgfQotICBwID0gc2F2ZV9wOwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgPSBzYXZlX3ByaW50ZXI7Ci0gIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyA9IHNhdmVfcHJpbnRfYWRkcmVzczsKLQotICBkID0gYmVzdC0+YXJnczsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgYmVzdC0+bmFtZSk7Ci0KLSAgaWYgKCpkKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCi0gIHdoaWxlICgqZCkKLSAgICB7Ci0gICAgICBwICs9IHByaW50X2luc25fYXJnIChkLCBidWZmZXIsIHAsIG1lbWFkZHIgKyAocCAtIGJ1ZmZlciksIGluZm8pOwotICAgICAgZCArPSAyOwotICAgICAgaWYgKCpkICYmICooZCAtIDIpICE9ICdJJyAmJiAqZCAhPSAnaycpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0gICAgfQotICByZXR1cm4gcCAtIGJ1ZmZlcjsKLQotIGludmFsaWQ6Ci0gIC8qIEhhbmRsZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgaW5mby0+ZnByaW50Zl9mdW5jID0gc2F2ZV9wcmludGVyOwotICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgPSBzYXZlX3ByaW50X2FkZHJlc3M7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMCVvIiwKLQkJCSAoYnVmZmVyWzBdIDw8IDgpICsgYnVmZmVyWzFdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzICJlYXRlbiIgYnkgdGhlIG9wZXJhbmQsIG9yCi0gICByZXR1cm4gLTEgaWYgYW4gaW52YWxpZCBvcGVyYW5kIHdhcyBmb3VuZCwgb3IgLTIgaWYKLSAgIGFuIG9wY29kZSB0YWJlIGVycm9yIHdhcyBmb3VuZC4gKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgKGQsIGJ1ZmZlciwgcDAsIGFkZHIsIGluZm8pCi0gICAgIGNvbnN0IGNoYXIgKmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgICAgdW5zaWduZWQgY2hhciAqcDA7Ci0gICAgIGJmZF92bWEgYWRkcjsJCS8qIFBDIGZvciB0aGlzIGFyZyB0byBiZSByZWxhdGl2ZSB0byAqLwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciBpbnQgdmFsID0gMDsKLSAgcmVnaXN0ZXIgaW50IHBsYWNlID0gZFsxXTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcCA9IHAwOwotICBpbnQgcmVnbm87Ci0gIHJlZ2lzdGVyIENPTlNUIGNoYXIgKnJlZ25hbWU7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnAxOwotICBkb3VibGUgZmx2YWw7Ci0gIGludCBmbHRfcDsKLSAgYmZkX3NpZ25lZF92bWEgZGlzcDsKLSAgdW5zaWduZWQgaW50IHV2YWw7Ci0KLSAgc3dpdGNoICgqZCkKLSAgICB7Ci0gICAgY2FzZSAnYyc6CQkvKiBjYWNoZSBpZGVudGlmaWVyICovCi0gICAgICB7Ci0gICAgICAgIHN0YXRpYyBjaGFyICpjb25zdCBjYWNoZUZpZWxkTmFtZVtdID0geyAibmMiLCAiZGMiLCAiaWMiLCAiYmMiIH07Ci0gICAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMiwgaW5mbyk7Ci0gICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBjYWNoZUZpZWxkTmFtZVt2YWxdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlICdhJzoJCS8qIGFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgb25seS4gQ2YuIGNhc2UgJysnLiAqLwotICAgICAgewotICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkgIChpbmZvLT5zdHJlYW0sCi0JICAgIiVzQCIsCi0JICAgcmVnX25hbWVzIFtmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgOF0pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgJ18nOgkJLyogMzItYml0IGFic29sdXRlIGFkZHJlc3MgZm9yIG1vdmUxNi4gKi8KLSAgICAgIHsKLSAgICAgICAgdXZhbCA9IE5FWFRVTE9ORyAocCk7Ci0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh1dmFsLCBpbmZvKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVjY3IiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlc3IiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUldXNwIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0UnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWFjYyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVtYWNzciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdIJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVtYXNrIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0onOgotICAgICAgewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeyBjaGFyICpuYW1lOyBpbnQgdmFsdWU7IH0gbmFtZXNbXQotCSAgPSB7eyIlc2ZjIiwgMHgwMDB9LCB7IiVkZmMiLCAweDAwMX0sIHsiJWNhY3IiLCAweDAwMn0sCi0JICAgICB7IiV0YyIsICAweDAwM30sIHsiJWl0dDAiLDB4MDA0fSwgeyIlaXR0MSIsIDB4MDA1fSwKLSAgICAgICAgICAgICB7IiVkdHQwIiwweDAwNn0sIHsiJWR0dDEiLDB4MDA3fSwgeyIlYnVzY3IiLDB4MDA4fSwKLQkgICAgIHsiJXVzcCIsIDB4ODAwfSwgeyIldmJyIiwgMHg4MDF9LCB7IiVjYWFyIiwgMHg4MDJ9LAotCSAgICAgeyIlbXNwIiwgMHg4MDN9LCB7IiVpc3AiLCAweDgwNH0sCi0KLQkgICAgIC8qIFNob3VsZCB3ZSBiZSBjYWxsaW5nIHRoaXMgcHNyIGxpa2Ugd2UgZG8gaW4gY2FzZSAnWSc/ICAqLwotCSAgICAgeyIlbW11c3IiLDB4ODA1fSwKLQotICAgICAgICAgICAgIHsiJXVycCIsIDB4ODA2fSwgeyIlc3JwIiwgMHg4MDd9LCB7IiVwY3IiLCAweDgwOH19OwotCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAxMiwgaW5mbyk7Ci0JZm9yIChyZWdubyA9IHNpemVvZiBuYW1lcyAvIHNpemVvZiBuYW1lc1swXSAtIDE7IHJlZ25vID49IDA7IHJlZ25vLS0pCi0JICBpZiAobmFtZXNbcmVnbm9dLnZhbHVlID09IHZhbCkKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lc1tyZWdub10ubmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQlpZiAocmVnbm8gPCAwKQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIHZhbCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1EnOgotICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKTsKLSAgICAgIC8qIDAgbWVhbnMgOCwgZXhjZXB0IGZvciB0aGUgYmtwdCBpbnN0cnVjdGlvbi4uLiAqLwotICAgICAgaWYgKHZhbCA9PSAwICYmIGRbMV0gIT0gJ3MnKQotCXZhbCA9IDg7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZCIsIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ00nOgotICAgICAgaWYgKHBsYWNlID09ICdoJykKLQl7Ci0JICBzdGF0aWMgY2hhciAqY29uc3Qgc2NhbGVmYWN0b3JfbmFtZVtdID0geyAiPDwiLCAiPj4iIH07Ci0JICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDEsIGluZm8pOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNjYWxlZmFjdG9yX25hbWVbdmFsXSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgOCwgaW5mbyk7Ci0JICBpZiAodmFsICYgMHg4MCkKLQkgICAgdmFsID0gdmFsIC0gMHgxMDA7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZCIsIHZhbCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNCwgaW5mbyk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZCIsIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyAwMTBdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXMiLAotCSByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIHJlZ25vID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKTsKLSAgICAgIGlmIChyZWdubyA+IDcpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AiLCByZWdfbmFtZXNbcmVnbm9dKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoJXMpIiwgcmVnX25hbWVzW3JlZ25vXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JKGluZm8tPnN0cmVhbSwgIiUlZnAlZCIsCi0JIGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdPJzoKLSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNiwgaW5mbyk7Ci0gICAgICBpZiAodmFsICYgMHgyMCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnX25hbWVzIFt2YWwgJiA3XSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJysnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JKGluZm8tPnN0cmVhbSwgIiVzQCsiLAotCSByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSArIDhdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXNALSIsCi0JIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgOF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgIGlmIChwbGFjZSA9PSAnaycpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JICAoaW5mby0+c3RyZWFtLCAieyVzfSIsCi0JICAgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyldKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdDJykKLQl7Ci0JICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDcsIGluZm8pOwotCSAgaWYgKCB2YWwgPiA2MyApCQkvKiBUaGlzIGlzIGEgc2lnbmVkIGNvbnN0YW50LiAqLwotCSAgICB2YWwgLT0gMTI4OwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ7IyVkfSIsIHZhbCk7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAtMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnIyc6Ci0gICAgY2FzZSAnXic6Ci0gICAgICBwMSA9IGJ1ZmZlciArICgqZCA9PSAnIycgPyAyIDogNCk7Ci0gICAgICBpZiAocGxhY2UgPT0gJ3MnKQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNCwgaW5mbyk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnQycpCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA3LCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICc4JykKLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJzMnKQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgOCwgaW5mbyk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnYicpCi0JdmFsID0gTkVYVEJZVEUgKHAxKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICd3JyB8fCBwbGFjZSA9PSAnVycpCi0JdmFsID0gTkVYVFdPUkQgKHAxKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdsJykKLQl2YWwgPSBORVhUTE9ORyAocDEpOwotICAgICAgZWxzZQotCXJldHVybiAtMjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgICBpZiAocGxhY2UgPT0gJ2InKQotCWRpc3AgPSBORVhUQllURSAocCk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnQicpCi0JZGlzcCA9IENPRVJDRV9TSUdORURfQ0hBUihidWZmZXJbMV0pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ3cnIHx8IHBsYWNlID09ICdXJykKLQlkaXNwID0gTkVYVFdPUkQgKHApOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2wnIHx8IHBsYWNlID09ICdMJyB8fCBwbGFjZSA9PSAnQycpCi0JZGlzcCA9IE5FWFRMT05HIChwKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdnJykKLQl7Ci0JICBkaXNwID0gTkVYVEJZVEUgKGJ1ZmZlcik7Ci0JICBpZiAoZGlzcCA9PSAwKQotCSAgICBkaXNwID0gTkVYVFdPUkQgKHApOwotCSAgZWxzZSBpZiAoZGlzcCA9PSAtMSkKLQkgICAgZGlzcCA9IE5FWFRMT05HIChwKTsKLQl9Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnYycpCi0JewotCSAgaWYgKGJ1ZmZlclsxXSAmIDB4NDApCQkvKiBJZiBiaXQgc2l4IGlzIG9uZSwgbG9uZyBvZmZzZXQgKi8KLQkgICAgZGlzcCA9IE5FWFRMT05HIChwKTsKLQkgIGVsc2UKLQkgICAgZGlzcCA9IE5FWFRXT1JEIChwKTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0yOwotCi0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyBkaXNwLCBpbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICB2YWwgPSBORVhUV09SRCAocCk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXNAKCVkKSIsCi0JIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgOF0sIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICAgIGZwY3JfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdJJzoKLSAgICAgIC8qIEdldCBjb3Byb2Nlc3NvciBJRC4uLiAqLwotICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsICdkJywgMywgaW5mbyk7Ci0gICAgICAKLSAgICAgIGlmICh2YWwgIT0gMSkJCQkJLyogVW51c3VhbCBjb3Byb2Nlc3NvciBJRD8gKi8KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIihjcGlkPSVkKSAiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcqJzoKLSAgICBjYXNlICd+JzoKLSAgICBjYXNlICclJzoKLSAgICBjYXNlICc7JzoKLSAgICBjYXNlICdAJzoKLSAgICBjYXNlICchJzoKLSAgICBjYXNlICckJzoKLSAgICBjYXNlICc/JzoKLSAgICBjYXNlICcvJzoKLSAgICBjYXNlICcmJzoKLSAgICBjYXNlICd8JzoKLSAgICBjYXNlICc8JzoKLSAgICBjYXNlICc+JzoKLSAgICBjYXNlICdtJzoKLSAgICBjYXNlICduJzoKLSAgICBjYXNlICdvJzoKLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdxJzoKLSAgICBjYXNlICd2JzoKLQotICAgICAgaWYgKHBsYWNlID09ICdkJykKLQl7Ci0JICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgJ3gnLCA2LCBpbmZvKTsKLQkgIHZhbCA9ICgodmFsICYgNykgPDwgMykgKyAoKHZhbCA+PiAzKSAmIDcpOwotCX0KLSAgICAgIGVsc2UKLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgJ3MnLCA2LCBpbmZvKTsKLQotICAgICAgLyogR2V0IHJlZ2lzdGVyIG51bWJlciBhc3N1bWluZyBhZGRyZXNzIHJlZ2lzdGVyLiAgKi8KLSAgICAgIHJlZ25vID0gKHZhbCAmIDcpICsgODsKLSAgICAgIHJlZ25hbWUgPSByZWdfbmFtZXNbcmVnbm9dOwotICAgICAgc3dpdGNoICh2YWwgPj4gMykKLQl7Ci0JY2FzZSAwOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ19uYW1lc1t2YWxdKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAxOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ25hbWUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDI6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCIsIHJlZ25hbWUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCsiLCByZWduYW1lKTsKLQkgIGJyZWFrOwotCi0JY2FzZSA0OgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AtIiwgcmVnbmFtZSk7Ci0JICBicmVhazsKLQotCWNhc2UgNToKLQkgIHZhbCA9IE5FWFRXT1JEIChwKTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAKCVkKSIsIHJlZ25hbWUsIHZhbCk7Ci0JICBicmVhazsKLQotCWNhc2UgNjoKLQkgIHAgPSBwcmludF9pbmRleGVkIChyZWdubywgcCwgYWRkciwgaW5mbyk7Ci0JICBicmVhazsKLQotCWNhc2UgNzoKLQkgIHN3aXRjaCAodmFsICYgNykKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgdmFsID0gTkVYVFdPUkQgKHApOwotCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDE6Ci0JICAgICAgdXZhbCA9IE5FWFRVTE9ORyAocCk7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh1dmFsLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDI6Ci0JICAgICAgdmFsID0gTkVYVFdPUkQgKHApOwotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVwY0AoIik7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgdmFsLCBpbmZvKTsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDM6Ci0JICAgICAgcCA9IHByaW50X2luZGV4ZWQgKC0xLCBwLCBhZGRyLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDQ6Ci0JICAgICAgZmx0X3AgPSAxOwkvKiBBc3N1bWUgaXQncyBhIGZsb2F0Li4uICovCi0JICAgICAgc3dpdGNoKCBwbGFjZSApCi0JICAgICAgewotCQljYXNlICdiJzoKLQkJICB2YWwgPSBORVhUQllURSAocCk7Ci0JCSAgZmx0X3AgPSAwOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3cnOgotCQkgIHZhbCA9IE5FWFRXT1JEIChwKTsKLQkJICBmbHRfcCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbCc6Ci0JCSAgdmFsID0gTkVYVExPTkcgKHApOwotCQkgIGZsdF9wID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlICdmJzoKLQkJICBORVhUU0lOR0xFKGZsdmFsLCBwKTsKLQkJICBicmVhazsKLQotCQljYXNlICdGJzoKLQkJICBORVhURE9VQkxFKGZsdmFsLCBwKTsKLQkJICBicmVhazsKLQotCQljYXNlICd4JzoKLQkJICBORVhURVhURU5EKGZsdmFsLCBwKTsKLQkJICBicmVhazsKLQotCQljYXNlICdwJzoKLQkJICBmbHZhbCA9IE5FWFRQQUNLRUQocCk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICByZXR1cm4gLTE7Ci0JICAgICAgfQotCSAgICAgIGlmICggZmx0X3AgKQkvKiBQcmludCBhIGZsb2F0PyAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZyIsIGZsdmFsKTsKLQkgICAgICBlbHNlCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTCc6Ci0gICAgY2FzZSAnbCc6Ci0JaWYgKHBsYWNlID09ICd3JykKLQkgIHsKLQkgICAgY2hhciBkb25lYW55OwotCSAgICBwMSA9IGJ1ZmZlciArIDI7Ci0JICAgIHZhbCA9IE5FWFRXT1JEIChwMSk7Ci0JICAgIC8qIE1vdmUgdGhlIHBvaW50ZXIgYWhlYWQgaWYgdGhpcyBwb2ludCBpcyBmYXJ0aGVyIGFoZWFkCi0JICAgICAgIHRoYW4gdGhlIGxhc3QuICAqLwotCSAgICBwID0gcDEgPiBwID8gcDEgOiBwOwotCSAgICBpZiAodmFsID09IDApCi0JICAgICAgewotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMwIik7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgaWYgKCpkID09ICdsJykKLQkgICAgICB7Ci0JCXJlZ2lzdGVyIGludCBuZXd2YWwgPSAwOwotCQlmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCAxNjsgKytyZWdubykKLQkJICBpZiAodmFsICYgKDB4ODAwMCA+PiByZWdubykpCi0JCSAgICBuZXd2YWwgfD0gMSA8PCByZWdubzsKLQkJdmFsID0gbmV3dmFsOwotCSAgICAgIH0KLQkgICAgdmFsICY9IDB4ZmZmZjsKLQkgICAgZG9uZWFueSA9IDA7Ci0JICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IDE2OyArK3JlZ25vKQotCSAgICAgIGlmICh2YWwgJiAoMSA8PCByZWdubykpCi0JCXsKLQkJICBpbnQgZmlyc3RfcmVnbm87Ci0JCSAgaWYgKGRvbmVhbnkpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi8iKTsKLQkJICBkb25lYW55ID0gMTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnX25hbWVzW3JlZ25vXSk7Ci0JCSAgZmlyc3RfcmVnbm8gPSByZWdubzsKLQkJICB3aGlsZSAodmFsICYgKDEgPDwgKHJlZ25vICsgMSkpKQotCQkgICAgKytyZWdubzsKLQkJICBpZiAocmVnbm8gPiBmaXJzdF9yZWdubykKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSVzIiwKLQkJCQkJICAgcmVnX25hbWVzW3JlZ25vXSk7Ci0JCX0KLQkgIH0KLQllbHNlIGlmIChwbGFjZSA9PSAnMycpCi0JICB7Ci0JICAgIC8qIGBmbW92ZW0nIGluc24uICAqLwotCSAgICBjaGFyIGRvbmVhbnk7Ci0JICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgOCwgaW5mbyk7Ci0JICAgIGlmICh2YWwgPT0gMCkKLQkgICAgICB7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIzAiKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoKmQgPT0gJ2wnKQotCSAgICAgIHsKLQkJcmVnaXN0ZXIgaW50IG5ld3ZhbCA9IDA7Ci0JCWZvciAocmVnbm8gPSAwOyByZWdubyA8IDg7ICsrcmVnbm8pCi0JCSAgaWYgKHZhbCAmICgweDgwID4+IHJlZ25vKSkKLQkJICAgIG5ld3ZhbCB8PSAxIDw8IHJlZ25vOwotCQl2YWwgPSBuZXd2YWw7Ci0JICAgICAgfQotCSAgICB2YWwgJj0gMHhmZjsKLQkgICAgZG9uZWFueSA9IDA7Ci0JICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IDg7ICsrcmVnbm8pCi0JICAgICAgaWYgKHZhbCAmICgxIDw8IHJlZ25vKSkKLQkJewotCQkgIGludCBmaXJzdF9yZWdubzsKLQkJICBpZiAoZG9uZWFueSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLyIpOwotCQkgIGRvbmVhbnkgPSAxOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVmcCVkIiwgcmVnbm8pOwotCQkgIGZpcnN0X3JlZ25vID0gcmVnbm87Ci0JCSAgd2hpbGUgKHZhbCAmICgxIDw8IChyZWdubyArIDEpKSkKLQkJICAgICsrcmVnbm87Ci0JCSAgaWYgKHJlZ25vID4gZmlyc3RfcmVnbm8pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0lJWZwJWQiLCByZWdubyk7Ci0JCX0KLQkgIH0KLQllbHNlIGlmIChwbGFjZSA9PSAnOCcpCi0JICB7Ci0JICAgIC8qIGZtb3ZlbWwgZm9yIEZQIHN0YXR1cyByZWdpc3RlcnMgKi8KLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkJICAgZnBjcl9uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsCi0JCQkJCQkJIGluZm8pXSk7Ci0JICB9Ci0JZWxzZQotCSAgcmV0dXJuIC0yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICAgIHBsYWNlID0gJzgnOwotICAgIGNhc2UgJ1knOgotICAgIGNhc2UgJ1onOgotICAgIGNhc2UgJ1cnOgotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgICAgewotCWludCB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDUsIGluZm8pOwotCWNoYXIgKm5hbWUgPSAwOwotCXN3aXRjaCAodmFsKQotCSAgewotCSAgY2FzZSAyOiBuYW1lID0gIiV0dDAiOyBicmVhazsKLQkgIGNhc2UgMzogbmFtZSA9ICIldHQxIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTA6IG5hbWUgPSAiJXRjIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTE6IG5hbWUgPSAiJWRycCI7IGJyZWFrOwotCSAgY2FzZSAweDEyOiBuYW1lID0gIiVzcnAiOyBicmVhazsKLQkgIGNhc2UgMHgxMzogbmFtZSA9ICIlY3JwIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTQ6IG5hbWUgPSAiJWNhbCI7IGJyZWFrOwotCSAgY2FzZSAweDE1OiBuYW1lID0gIiV2YWwiOyBicmVhazsKLQkgIGNhc2UgMHgxNjogbmFtZSA9ICIlc2NjIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTc6IG5hbWUgPSAiJWFjIjsgYnJlYWs7Ci0gCSAgY2FzZSAweDE4OiBuYW1lID0gIiVwc3IiOyBicmVhazsKLQkgIGNhc2UgMHgxOTogbmFtZSA9ICIlcGNzciI7IGJyZWFrOwotCSAgY2FzZSAweDFjOgotCSAgY2FzZSAweDFkOgotCSAgICB7Ci0JICAgICAgaW50IGJyZWFrX3JlZyA9ICgoYnVmZmVyWzNdID4+IDIpICYgNyk7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCShpbmZvLT5zdHJlYW0sIHZhbCA9PSAweDFjID8gIiUlYmFkJWQiIDogIiUlYmFjJWQiLAotCQkgYnJlYWtfcmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPG1tdSByZWdpc3RlciAlZD4iLCB2YWwpOwotCSAgfQotCWlmIChuYW1lKQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICAgIHsKLQlpbnQgZmMgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDUsIGluZm8pOwotCWlmIChmYyA9PSAxKQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWRmYyIpOwotCWVsc2UgaWYgKGZjID09IDApCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlc2ZjIik7Ci0JZWxzZQotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCI8ZnVuY3Rpb24gY29kZSAlZD4iKSwgZmMpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSV2YWwiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICB7Ci0JaW50IGxldmVsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKTsKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgbGV2ZWwpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd1JzoKLSAgICAgIHsKLQlzaG9ydCBpc191cHBlciA9IDA7Ci0JaW50IHJlZyA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNSwgaW5mbyk7Ci0JCi0JaWYgKHJlZyAmIDB4MTApCi0JICB7Ci0JICAgIGlzX3VwcGVyID0gMTsKLQkgICAgcmVnICY9IDB4ZjsKLQkgIH0KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzJXMiLAotCQkJICAgICAgIHJlZ19uYW1lc1tyZWddLAotCQkJICAgICAgIGlzX3VwcGVyID8gInUiIDogImwiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTI7Ci0gICAgfQotCi0gIHJldHVybiBwIC0gcDA7Ci19Ci0KLS8qIEZldGNoIEJJVFMgYml0cyBmcm9tIGEgcG9zaXRpb24gaW4gdGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCBieSBDT0RFLgotICAgQ09ERSBpcyBhICJwbGFjZSB0byBwdXQgYW4gYXJndW1lbnQiLCBvciAneCcgZm9yIGEgZGVzdGluYXRpb24KLSAgIHRoYXQgaXMgYSBnZW5lcmFsIGFkZHJlc3MgKG1vZGUgYW5kIHJlZ2lzdGVyKS4KLSAgIEJVRkZFUiBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1mZXRjaF9hcmcgKGJ1ZmZlciwgY29kZSwgYml0cywgaW5mbykKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICBpbnQgY29kZTsKLSAgICAgaW50IGJpdHM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGludCB2YWwgPSAwOwotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgJ3MnOgotICAgICAgdmFsID0gYnVmZmVyWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoJCQkvKiBEZXN0aW5hdGlvbiwgZm9yIHJlZ2lzdGVyIG9yIHF1aWNrLiAgKi8KLSAgICAgIHZhbCA9IChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV07Ci0gICAgICB2YWwgPj49IDk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgkJCS8qIERlc3RpbmF0aW9uLCBmb3IgZ2VuZXJhbCBhcmcgKi8KLSAgICAgIHZhbCA9IChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV07Ci0gICAgICB2YWwgPj49IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzNdID4+IDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gYnVmZmVyWzNdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKLSAgICAgIHZhbCA+Pj0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzInOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICczJzoKLSAgICBjYXNlICdqJzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnNCc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyA1KTsKLSAgICAgIHZhbCA9IChidWZmZXJbNF0gPDwgOCkgKyBidWZmZXJbNV07Ci0gICAgICB2YWwgPj49IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc1JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDUpOwotICAgICAgdmFsID0gKGJ1ZmZlcls0XSA8PCA4KSArIGJ1ZmZlcls1XTsKLSAgICAgIHZhbCA+Pj0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnNic6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyA1KTsKLSAgICAgIHZhbCA9IChidWZmZXJbNF0gPDwgOCkgKyBidWZmZXJbNV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzcnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSA3OwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlICc4JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKLSAgICAgIHZhbCA+Pj0gMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzknOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdlJzoKLSAgICAgIHZhbCA9IChidWZmZXJbMV0gPj4gNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ20nOiAKLSAgICAgIHZhbCA9IChidWZmZXJbMV0gJiAweDQwID8gMHg4IDogMCkKLQl8ICgoYnVmZmVyWzBdID4+IDEpICYgMHg3KQotCXwgKGJ1ZmZlclszXSAmIDB4ODAgPyAweDEwIDogMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ24nOiAKLSAgICAgIHZhbCA9IChidWZmZXJbMV0gJiAweDQwID8gMHg4IDogMCkgfCAoKGJ1ZmZlclswXSA+PiAxKSAmIDB4Nyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ28nOgotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA+PiA0KSB8IChidWZmZXJbM10gJiAweDgwID8gMHgxMCA6IDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgIHZhbCA9IGJ1ZmZlclsxXSB8IChidWZmZXJbM10gJiAweDQwID8gMHgxMCA6IDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdOJzoKLSAgICAgIHZhbCA9IGJ1ZmZlclszXSB8IChidWZmZXJbM10gJiAweDQwID8gMHgxMCA6IDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoKLSAgICAgIHZhbCA9IGJ1ZmZlclsyXSA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHN3aXRjaCAoYml0cykKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuIHZhbCAmIDE7Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIHZhbCAmIDM7Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIHZhbCAmIDc7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIHZhbCAmIDAxNzsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gdmFsICYgMDM3OwotICAgIGNhc2UgNjoKLSAgICAgIHJldHVybiB2YWwgJiAwNzc7Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIHZhbCAmIDAxNzc7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIHZhbCAmIDAzNzc7Ci0gICAgY2FzZSAxMjoKLSAgICAgIHJldHVybiB2YWwgJiAwNzc3NzsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBQcmludCBhbiBpbmRleGVkIGFyZ3VtZW50LiAgVGhlIGJhc2UgcmVnaXN0ZXIgaXMgQkFTRVJFRyAoLTEgZm9yIHBjKS4KLSAgIFAgcG9pbnRzIHRvIGV4dGVuc2lvbiB3b3JkLCBpbiBidWZmZXIuCi0gICBBRERSIGlzIHRoZSBub21pbmFsIGNvcmUgYWRkcmVzcyBvZiB0aGF0IGV4dGVuc2lvbiB3b3JkLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotcHJpbnRfaW5kZXhlZCAoYmFzZXJlZywgcCwgYWRkciwgaW5mbykKLSAgICAgaW50IGJhc2VyZWc7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgaW50IHdvcmQ7Ci0gIHN0YXRpYyBjaGFyICpjb25zdCBzY2FsZXNbXSA9IHsiIiwgIjoyIiwgIjo0IiwgIjo4In07Ci0gIGJmZF92bWEgYmFzZV9kaXNwOwotICBiZmRfdm1hIG91dGVyX2Rpc3A7Ci0gIGNoYXIgYnVmWzQwXTsKLSAgY2hhciB2bWFidWZbNTBdOwotCi0gIHdvcmQgPSBORVhUV09SRCAocCk7Ci0KLSAgLyogR2VuZXJhdGUgdGhlIHRleHQgZm9yIHRoZSBpbmRleCByZWdpc3Rlci4KLSAgICAgV2hlcmUgdGhpcyB3aWxsIGJlIG91dHB1dCBpcyBub3QgeWV0IGRldGVybWluZWQuICAqLwotICBzcHJpbnRmIChidWYsICIlczolYyVzIiwKLQkgICByZWdfbmFtZXNbKHdvcmQgPj4gMTIpICYgMHhmXSwKLQkgICAod29yZCAmIDB4ODAwKSA/ICdsJyA6ICd3JywKLQkgICBzY2FsZXNbKHdvcmQgPj4gOSkgJiAzXSk7Ci0KLSAgLyogSGFuZGxlIHRoZSA2ODAwMCBzdHlsZSBvZiBpbmRleGluZy4gICovCi0KLSAgaWYgKCh3b3JkICYgMHgxMDApID09IDApCi0gICAgewotICAgICAgYmFzZV9kaXNwID0gd29yZCAmIDB4ZmY7Ci0gICAgICBpZiAoKGJhc2VfZGlzcCAmIDB4ODApICE9IDApCi0JYmFzZV9kaXNwIC09IDB4MTAwOwotICAgICAgaWYgKGJhc2VyZWcgPT0gLTEpCi0JYmFzZV9kaXNwICs9IGFkZHI7Ci0gICAgICBwcmludF9iYXNlIChiYXNlcmVnLCBiYXNlX2Rpc3AsIGluZm8pOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJXMpIiwgYnVmKTsKLSAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIGdlbmVyYWxpemVkIGtpbmQuICAqLwotICAvKiBGaXJzdCwgY29tcHV0ZSB0aGUgZGlzcGxhY2VtZW50IHRvIGFkZCB0byB0aGUgYmFzZSByZWdpc3Rlci4gICovCi0KLSAgaWYgKHdvcmQgJiAwMjAwKQotICAgIHsKLSAgICAgIGlmIChiYXNlcmVnID09IC0xKQotCWJhc2VyZWcgPSAtMzsKLSAgICAgIGVsc2UKLQliYXNlcmVnID0gLTI7Ci0gICAgfQotICBpZiAod29yZCAmIDAxMDApCi0gICAgYnVmWzBdID0gJ1wwJzsKLSAgYmFzZV9kaXNwID0gMDsKLSAgc3dpdGNoICgod29yZCA+PiA0KSAmIDMpCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIGJhc2VfZGlzcCA9IE5FWFRXT1JEIChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGJhc2VfZGlzcCA9IE5FWFRMT05HIChwKTsKLSAgICB9Ci0gIGlmIChiYXNlcmVnID09IC0xKQotICAgIGJhc2VfZGlzcCArPSBhZGRyOwotCi0gIC8qIEhhbmRsZSBzaW5nbGUtbGV2ZWwgY2FzZSAobm90IGluZGlyZWN0KSAqLwotCi0gIGlmICgod29yZCAmIDcpID09IDApCi0gICAgewotICAgICAgcHJpbnRfYmFzZSAoYmFzZXJlZywgYmFzZV9kaXNwLCBpbmZvKTsKLSAgICAgIGlmIChidWZbMF0gIT0gJ1wwJykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcyIsIGJ1Zik7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLSAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAvKiBUd28gbGV2ZWwuICBDb21wdXRlIGRpc3BsYWNlbWVudCB0byBhZGQgYWZ0ZXIgaW5kaXJlY3Rpb24uICAqLwotCi0gIG91dGVyX2Rpc3AgPSAwOwotICBzd2l0Y2ggKHdvcmQgJiAzKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICBvdXRlcl9kaXNwID0gTkVYVFdPUkQgKHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgb3V0ZXJfZGlzcCA9IE5FWFRMT05HIChwKTsKLSAgICB9Ci0KLSAgcHJpbnRfYmFzZSAoYmFzZXJlZywgYmFzZV9kaXNwLCBpbmZvKTsKLSAgaWYgKCh3b3JkICYgNCkgPT0gMCAmJiBidWZbMF0gIT0gJ1wwJykKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcyIsIGJ1Zik7Ci0gICAgICBidWZbMF0gPSAnXDAnOwotICAgIH0KLSAgc3ByaW50Zl92bWEgKHZtYWJ1Ziwgb3V0ZXJfZGlzcCk7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKUAoJXMiLCB2bWFidWYpOwotICBpZiAoYnVmWzBdICE9ICdcMCcpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJXMiLCBidWYpOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQotICByZXR1cm4gcDsKLX0KLQotLyogUHJpbnQgYSBiYXNlIHJlZ2lzdGVyIFJFR05PIGFuZCBkaXNwbGFjZW1lbnQgRElTUCwgb24gSU5GTy0+U1RSRUFNLgotICAgUkVHTk8gPSAtMSBmb3IgcGMsIC0yIGZvciBub25lIChzdXBwcmVzc2VkKS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9iYXNlIChyZWdubywgZGlzcCwgaW5mbykKLSAgICAgaW50IHJlZ25vOwotICAgICBiZmRfdm1hIGRpc3A7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmIChyZWdubyA9PSAtMSkKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlcGNAKCIpOwotICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChkaXNwLCBpbmZvKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1Zls1MF07Ci0KLSAgICAgIGlmIChyZWdubyA9PSAtMikKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoIik7Ci0gICAgICBlbHNlIGlmIChyZWdubyA9PSAtMykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlenBjQCgiKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCgiLCByZWdfbmFtZXNbcmVnbm9dKTsKLQotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiwgZGlzcCk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgYnVmKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL202OGstb3BjLmMgYi9vcGNvZGVzL202OGstb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0N2FkN2MuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tNjhrLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE4NyArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIG02ODBbMDEyMzQ2XTAvbTY4ODhbMTJdL202ODg1MS9tY2Y1MjAwLgotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL202OGsuaCIKLQotI2RlZmluZSBvbmUoeCkgKCh1bnNpZ25lZCBpbnQpICh4KSA8PCAxNikKLSNkZWZpbmUgdHdvKHgsIHkpICgoKHVuc2lnbmVkIGludCkgKHgpIDw8IDE2KSArICh5KSkKLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdAotICAgYmUgY29uc2VjdXRpdmUuICBJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQKLSAgIHJ1bnRpbWUuICAqLwotCi1jb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgbTY4a19vcGNvZGVzW10gPQotewoteyJhYmNkIiwJb25lKDAxNDA0MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsiYWJjZCIsCW9uZSgwMTQwNDEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi0KLXsiYWRkYXciLAlvbmUoMDE1MDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJhZGRhbCIsCW9uZSgwMTUwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYWRkaWIiLAlvbmUoMDAwMzAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhZGRpdyIsCW9uZSgwMDAzMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImFkZGlsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkaWwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLQoteyJhZGRxYiIsCW9uZSgwMDUwMDAwKSwJb25lKDAxNzA3MDApLCAiUWQkYiIsIG02ODAwMHVwIH0sCi17ImFkZHF3IiwJb25lKDAwNTAxMDApLAlvbmUoMDE3MDcwMCksICJRZCV3IiwgbTY4MDAwdXAgfSwKLXsiYWRkcWwiLAlvbmUoMDA1MDIwMCksCW9uZSgwMTcwNzAwKSwgIlFkJWwiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi0vKiBUaGUgYWRkIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIGFkZGEsIGFkZGksIGFuZCBhZGRxIGluc3RydWN0aW9ucy4gICovCi17ImFkZGIiLAlvbmUoMDA1MDAwMCksCW9uZSgwMTcwNzAwKSwgIlFkJGIiLCBtNjgwMDB1cCB9LAoteyJhZGRiIiwJb25lKDAwMDMwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkYiIsCW9uZSgwMTUwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17ImFkZGIiLAlvbmUoMDE1MDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmIiLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAwNTAxMDApLAlvbmUoMDE3MDcwMCksICJRZCV3IiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMTUwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17ImFkZHciLAlvbmUoMDAwMzEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAxNTAxMDApLAlvbmUoMDE3MDcwMCksICIqd0RkIiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMTUwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+dyIsIG02ODAwMHVwIH0sCi17ImFkZGwiLAlvbmUoMDA1MDIwMCksCW9uZSgwMTcwNzAwKSwgIlFkJWwiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhZGRsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkbCIsCW9uZSgwMDAzMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJhZGRsIiwJb25lKDAxNTA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYWRkbCIsCW9uZSgwMTUwMjAwKSwJb25lKDAxNzA3MDApLCAiKmxEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFkZGwiLAlvbmUoMDE1MDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmwiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImFkZHhiIiwJb25lKDAxNTA0MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsiYWRkeGIiLAlvbmUoMDE1MDQxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoteyJhZGR4dyIsCW9uZSgwMTUwNTAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17ImFkZHh3IiwJb25lKDAxNTA1MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLXsiYWRkeGwiLAlvbmUoMDE1MDYwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhZGR4bCIsCW9uZSgwMTUwNjEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi0KLXsiYW5kaWIiLAlvbmUoMDAwMTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhbmRpYiIsCW9uZSgwMDAxMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImFuZGl3IiwJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaXciLAlvbmUoMDAwMTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJhbmRpbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImFuZGlsIiwJb25lKDAwMDEyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImFuZGkiLAlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhbmRpIiwJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaSIsCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi0KLS8qIFRoZSBhbmQgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgYW5kaSBpbnN0cnVjdGlvbi4gICovCi17ImFuZGIiLAlvbmUoMDAwMTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhbmRiIiwJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiYW5kYiIsCW9uZSgwMTQwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17ImFuZGIiLAlvbmUoMDE0MDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmIiLCBtNjgwMDB1cCB9LAoteyJhbmR3IiwJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kdyIsCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImFuZHciLAlvbmUoMDE0MDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJhbmR3IiwJb25lKDAxNDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH53IiwgbTY4MDAwdXAgfSwKLXsiYW5kbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImFuZGwiLAlvbmUoMDAwMTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiYW5kbCIsCW9uZSgwMTQwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFuZGwiLAlvbmUoMDE0MDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmwiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhbmQiLAkJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyR3IiwgbTY4MDAwdXAgfSwKLXsiYW5kIiwJCW9uZSgwMDAxMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImFuZCIsCQlvbmUoMDAwMTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJhbmQiLAkJb25lKDAxNDAxMDApLAlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXAgfSwKLXsiYW5kIiwJCW9uZSgwMTQwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+dyIsIG02ODAwMHVwIH0sCi0KLXsiYXNsYiIsCW9uZSgwMTYwNDAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImFzbGIiLAlvbmUoMDE2MDQ0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJhc2x3IiwJb25lKDAxNjA1MDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNsdyIsCW9uZSgwMTYwNTQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImFzbHciLAlvbmUoMDE2MDcwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJhc2xsIiwJb25lKDAxNjA2MDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYXNsbCIsCW9uZSgwMTYwNjQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYXNyYiIsCW9uZSgwMTYwMDAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImFzcmIiLAlvbmUoMDE2MDA0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJhc3J3IiwJb25lKDAxNjAxMDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNydyIsCW9uZSgwMTYwMTQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImFzcnciLAlvbmUoMDE2MDMwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJhc3JsIiwJb25lKDAxNjAyMDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYXNybCIsCW9uZSgwMTYwMjQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYmhpdyIsCW9uZSgwMDYxMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibHN3IiwJb25lKDAwNjE0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJjY3ciLAlvbmUoMDA2MjAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmNzdyIsCW9uZSgwMDYyNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibmV3IiwJb25lKDAwNjMwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJlcXciLAlvbmUoMDA2MzQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnZjdyIsCW9uZSgwMDY0MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJidnN3IiwJb25lKDAwNjQ0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJwbHciLAlvbmUoMDA2NTAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYm1pdyIsCW9uZSgwMDY1NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZ2V3IiwJb25lKDAwNjYwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJsdHciLAlvbmUoMDA2NjQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmd0dyIsCW9uZSgwMDY3MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibGV3IiwJb25lKDAwNjc0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYmhpbCIsCW9uZSgwMDYxMzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJsc2wiLAlvbmUoMDA2MTc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiY2NsIiwJb25lKDAwNjIzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmNzbCIsCW9uZSgwMDYyNzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJuZWwiLAlvbmUoMDA2MzM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiZXFsIiwJb25lKDAwNjM3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnZjbCIsCW9uZSgwMDY0Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJ2c2wiLAlvbmUoMDA2NDc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJicGxsIiwJb25lKDAwNjUzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYm1pbCIsCW9uZSgwMDY1Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJnZWwiLAlvbmUoMDA2NjM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJibHRsIiwJb25lKDAwNjY3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmd0bCIsCW9uZSgwMDY3Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJsZWwiLAlvbmUoMDA2Nzc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17ImJoaXMiLAlvbmUoMDA2MTAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmxzcyIsCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiY2NzIiwJb25lKDAwNjIwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJjc3MiLAlvbmUoMDA2MjQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYm5lcyIsCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZXFzIiwJb25lKDAwNjM0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJ2Y3MiLAlvbmUoMDA2NDAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnZzcyIsCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJicGxzIiwJb25lKDAwNjUwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJtaXMiLAlvbmUoMDA2NTQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmdlcyIsCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibHRzIiwJb25lKDAwNjY0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJndHMiLAlvbmUoMDA2NzAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmxlcyIsCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImpoaSIsCQlvbmUoMDA2MTAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamxzIiwJCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqY2MiLAkJb25lKDAwNjIwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpjcyIsCQlvbmUoMDA2MjQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiam5lIiwJCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqZXEiLAkJb25lKDAwNjM0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17Imp2YyIsCQlvbmUoMDA2NDAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsianZzIiwJCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqcGwiLAkJb25lKDAwNjUwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImptaSIsCQlvbmUoMDA2NTQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamdlIiwJCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqbHQiLAkJb25lKDAwNjY0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpndCIsCQlvbmUoMDA2NzAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamxlIiwJCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJjaGciLAlvbmUoMDAwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiY2hnIiwJb25lKDAwMDQxMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYmNoZyIsCW9uZSgwMDA0MTAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZiB9LAotCi17ImJjbHIiLAlvbmUoMDAwMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoteyJiY2xyIiwJb25lKDAwMDA2MDApLAlvbmUoMDE3MDcwMCksICJEZHZzIiwgbWNmIH0sCi17ImJjbHIiLAlvbmUoMDAwNDIwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJiY2xyIiwJb25lKDAwMDQyMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmIH0sCi0KLXsiYmZjaGciLAl0d28oMDE2NTMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIj9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLXsiYmZjbHIiLAl0d28oMDE2NjMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIj9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLXsiYmZleHRzIiwJdHdvKDAxNjU3MDAsIDApLCB0d28oMDE3NzcwMCwgMDEwMDAwMCksCSIvc08yTzNEMSIsIG02ODAyMHVwIH0sCi17ImJmZXh0dSIsCXR3bygwMTY0NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiL3NPMk8zRDEiLCBtNjgwMjB1cCB9LAoteyJiZmZmbyIsCXR3bygwMTY2NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiL3NPMk8zRDEiLCBtNjgwMjB1cCB9LAoteyJiZmlucyIsCXR3bygwMTY3NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiRDE/c08yTzMiLCBtNjgwMjB1cCB9LAoteyJiZnNldCIsCXR3bygwMTY3MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzAwMDApLAkiP3NPMk8zIiwgICBtNjgwMjB1cCB9LAoteyJiZnRzdCIsCXR3bygwMTY0MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzAwMDApLAkiL3NPMk8zIiwgICBtNjgwMjB1cCB9LAotCi17ImJnbmQiLAlvbmUoMDA0NTM3MiksCQlvbmUoMDE3Nzc3NyksICIiLCBjcHUzMiB9LAotCi17ImJrcHQiLAlvbmUoMDA0NDExMCksCQlvbmUoMDE3Nzc3MCksICJ0cyIsIG02ODAxMHVwIH0sCi0KLXsiYnJhdyIsCW9uZSgwMDYwMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJicmFsIiwJb25lKDAwNjAzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnJhcyIsCW9uZSgwMDYwMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJzZXQiLAlvbmUoMDAwMDcwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoteyJic2V0IiwJb25lKDAwMDA3MDApLAlvbmUoMDE3MDcwMCksICJEZHZzIiwgbWNmIH0sCi17ImJzZXQiLAlvbmUoMDAwNDMwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJic2V0IiwJb25lKDAwMDQzMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmIH0sCi0KLXsiYnNydyIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJic3JsIiwJb25lKDAwNjA3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnNycyIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJ0c3QiLAlvbmUoMDAwMDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkO2IiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJidHN0IiwJb25lKDAwMDQwMDApLAlvbmUoMDE3NzcwMCksICIjYkBzIiwgbTY4MDAwdXAgfSwKLXsiYnRzdCIsCW9uZSgwMDA0MDAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZiB9LAotCi17ImNhbGxtIiwJb25lKDAwMDMzMDApLAkJb25lKDAxNzc3MDApLCAiI2IhcyIsIG02ODAyMCB9LAotCi17ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCi17ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCi17ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCi17ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCi0KLXsiY2FzYiIsCXR3bygwMDA1MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLXsiY2FzdyIsCXR3bygwMDA2MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLXsiY2FzbCIsCXR3bygwMDA3MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLQoteyJjaGsyYiIsIHR3bygwMDAwMzAwLDAwMDQwMDApLCB0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjaGsydyIsIHR3bygwMDAxMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjaGsybCIsIHR3bygwMDAyMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17ImNoa2wiLAlvbmUoMDA0MDQwMCksCQlvbmUoMDE3MDcwMCksICI7bERkIiwgbTY4MDAwdXAgfSwKLXsiY2hrdyIsCW9uZSgwMDQwNjAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAotCi0jZGVmaW5lIFNDT1BFX0xJTkUgKDB4MSA8PCAzKQotI2RlZmluZSBTQ09QRV9QQUdFICgweDIgPDwgMykKLSNkZWZpbmUgU0NPUEVfQUxMICAoMHgzIDw8IDMpCi0KLXsiY2ludmEiLAlvbmUoMHhmNDAwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoteyJjaW52bCIsCW9uZSgweGY0MDB8U0NPUEVfTElORSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCi17ImNpbnZwIiwJb25lKDB4ZjQwMHxTQ09QRV9QQUdFKSwgb25lKDB4ZmYzOCksICJjZWFzIiwgbTY4MDQwdXAgfSwKLQoteyJjcHVzaGEiLAlvbmUoMHhmNDIwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoteyJjcHVzaGwiLAlvbmUoMHhmNDIwfFNDT1BFX0xJTkUpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAoteyJjcHVzaGwiLAlvbmUoMHgwNGU4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCAgIG1jZiB9LAoteyJjcHVzaHAiLAlvbmUoMHhmNDIwfFNDT1BFX1BBR0UpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAotCi0jdW5kZWYgU0NPUEVfTElORQotI3VuZGVmIFNDT1BFX1BBR0UKLSN1bmRlZiBTQ09QRV9BTEwKLQoteyJjbHJiIiwJb25lKDAwNDEwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImNscnciLAlvbmUoMDA0MTEwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiY2xybCIsCW9uZSgwMDQxMjAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImNtcDJiIiwJdHdvKDAwMDAzMDAsMCksIHR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImNtcDJ3IiwJdHdvKDAwMDEzMDAsMCksCXR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImNtcDJsIiwJdHdvKDAwMDIzMDAsMCksCXR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsiY21wYXciLAlvbmUoMDEzMDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJjbXBhbCIsCW9uZSgwMTMwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiY21waWIiLAlvbmUoMDAwNjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoteyJjbXBpdyIsCW9uZSgwMDA2MTAwKSwJb25lKDAxNzc3MDApLCAiI3dAcyIsIG02ODAwMHVwIH0sCi17ImNtcGlsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbEBzIiwgbTY4MDAwdXAgfSwKLXsiY21waWwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLQoteyJjbXBtYiIsCW9uZSgwMTMwNDEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcG13IiwJb25lKDAxMzA1MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLXsiY21wbWwiLAlvbmUoMDEzMDYxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAotCi0vKiBUaGUgY21wIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIGNtcGEsIGNtcG0sIGFuZCBjbXBpIGluc3RydWN0aW9ucy4gICovCi17ImNtcGIiLAlvbmUoMDAwNjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoteyJjbXBiIiwJb25lKDAxMzA0MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLXsiY21wYiIsCW9uZSgwMTMwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17ImNtcHciLAlvbmUoMDEzMDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJjbXB3IiwJb25lKDAwMDYxMDApLAlvbmUoMDE3NzcwMCksICIjd0BzIiwgbTY4MDAwdXAgfSwKLXsiY21wdyIsCW9uZSgwMTMwNTEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcHciLAlvbmUoMDEzMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3RGQiLCBtNjgwMDB1cCB9LAoteyJjbXBsIiwJb25lKDAxMzA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiY21wbCIsCW9uZSgwMDA2MjAwKSwJb25lKDAxNzc3MDApLCAiI2xAcyIsIG02ODAwMHVwIH0sCi17ImNtcGwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiY21wbCIsCW9uZSgwMTMwNjEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcGwiLAlvbmUoMDEzMDIwMCksCW9uZSgwMTcwNzAwKSwgIipsRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImRiY2MiLAlvbmUoMDA1MjMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmNzIiwJb25lKDAwNTI3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJlcSIsCW9uZSgwMDUzNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiZiIsCQlvbmUoMDA1MDcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmdlIiwJb25lKDAwNTYzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJndCIsCW9uZSgwMDU3MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiaGkiLAlvbmUoMDA1MTMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmxlIiwJb25lKDAwNTc3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJscyIsCW9uZSgwMDUxNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRibHQiLAlvbmUoMDA1NjcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYm1pIiwJb25lKDAwNTU3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJuZSIsCW9uZSgwMDUzMzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRicGwiLAlvbmUoMDA1NTMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYnQiLAkJb25lKDAwNTAzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJ2YyIsCW9uZSgwMDU0MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRidnMiLAlvbmUoMDA1NDcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAotCi17ImRpdnN3IiwJb25lKDAxMDA3MDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17ImRpdnN3IiwJb25lKDAxMDA3MDApLCAgIG9uZSgwMTcwNzAwKSwgInZzRGQiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJkaXZzbCIsIHR3bygwMDQ2MTAwLDAwMDYwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEQzRDEiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZzbCIsIHR3bygwMDQ2MTAwLDAwMDQwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEREIiwgICBtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZzbCIsIHR3bygwMDQ2MTAwLDAwMDQwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCJ2c0REIiwgICBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJkaXZzbGwiLCB0d28oMDA0NjEwMCwwMDA0MDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xEM0QxIixtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZzbGwiLCB0d28oMDA0NjEwMCwwMDA0MDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xERCIsICBtNjgwMjB1cHxjcHUzMiB9LAotCi17ImRpdnV3IiwJb25lKDAxMDAzMDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17ImRpdnV3IiwJb25lKDAxMDAzMDApLAkJb25lKDAxNzA3MDApLCAidnNEZCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMjAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksInZzREQiLCAgIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17ImRpdnVsbCIsIHR3bygwMDQ2MTAwLDAwMDAwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEQzRDEiLG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsbCIsIHR3bygwMDQ2MTAwLDAwMDAwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEREIiwgIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsiZW9yaWIiLAlvbmUoMDAwNTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JpYiIsCW9uZSgwMDA1MDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImVvcml3IiwJb25lKDAwMDUxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaXciLAlvbmUoMDAwNTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJlb3JpbCIsCW9uZSgwMDA1MjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImVvcmlsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImVvcmkiLAlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJlb3JpIiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaSIsCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi0KLS8qIFRoZSBlb3Igb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgZW9yaSBpbnN0cnVjdGlvbi4gICovCi17ImVvcmIiLAlvbmUoMDAwNTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JiIiwJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yYiIsCW9uZSgwMTMwNDAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImVvcnciLAlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJlb3J3IiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9ydyIsCW9uZSgwMTMwNTAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImVvcmwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImVvcmwiLAlvbmUoMDEzMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJlb3IiLAkJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yIiwJCW9uZSgwMDA1MTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImVvciIsCQlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJlb3IiLAkJb25lKDAxMzA1MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfSwKLQoteyJleGciLAkJb25lKDAxNDA1MDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsiZXhnIiwJCW9uZSgwMTQwNTEwKSwJb25lKDAxNzA3NzApLCAiQWRBcyIsIG02ODAwMHVwIH0sCi17ImV4ZyIsCQlvbmUoMDE0MDYxMCksCW9uZSgwMTcwNzcwKSwgIkRkQXMiLCBtNjgwMDB1cCB9LAoteyJleGciLAkJb25lKDAxNDA2MTApLAlvbmUoMDE3MDc3MCksICJBc0RkIiwgbTY4MDAwdXAgfSwKLQoteyJleHR3IiwJb25lKDAwNDQyMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwfG1jZiB9LAoteyJleHRsIiwJb25lKDAwNDQzMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwfG1jZiB9LAoteyJleHRibCIsCW9uZSgwMDQ0NzAwKSwJb25lKDAxNzc3NzApLCAiRHMiLCBtNjgwMjB1cHxjcHUzMnxtY2YgfSwKLQotLyogZmxvYXQgc3R1ZmYgc3RhcnRzIGhlcmUgKi8KLQoteyJmYWJzYiIsCXR3bygweEYwMDAsIDB4NTgxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmFic2QiLAl0d28oMHhGMDAwLCAweDU0MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhYnNsIiwJdHdvKDB4RjAwMCwgMHg0MDE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYWJzcCIsCXR3bygweEYwMDAsIDB4NEMxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmFic3MiLAl0d28oMHhGMDAwLCAweDQ0MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhYnN3IiwJdHdvKDB4RjAwMCwgMHg1MDE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYWJzeCIsCXR3bygweEYwMDAsIDB4MDAxOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmFic3giLAl0d28oMHhGMDAwLCAweDQ4MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDE4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzYWJzYiIsCXR3bygweEYwMDAsIDB4NTg1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic2QiLAl0d28oMHhGMDAwLCAweDU0NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnNsIiwJdHdvKDB4RjAwMCwgMHg0MDU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzcCIsCXR3bygweEYwMDAsIDB4NEM1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3MiLAl0d28oMHhGMDAwLCAweDQ0NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnN3IiwJdHdvKDB4RjAwMCwgMHg1MDU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzeCIsCXR3bygweEYwMDAsIDB4MDA1OCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3giLAl0d28oMHhGMDAwLCAweDQ4NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDU4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRhYnNiIiwJdHdvKDB4RjAwMCwgMHg1ODVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNkIiwJdHdvKDB4RjAwMCwgMHg1NDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNsIiwJdHdvKDB4RjAwMCwgMHg0MDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNwIiwJdHdvKDB4RjAwMCwgMHg0QzVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNzIiwJdHdvKDB4RjAwMCwgMHg0NDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN3IiwJdHdvKDB4RjAwMCwgMHg1MDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDVjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN4IiwJdHdvKDB4RjAwMCwgMHg0ODVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDVjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwfSwKLQoteyJmYWNvc2IiLAl0d28oMHhGMDAwLCAweDU4MUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhY29zZCIsCXR3bygweEYwMDAsIDB4NTQxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmFjb3NsIiwJdHdvKDB4RjAwMCwgMHg0MDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3AiLAl0d28oMHhGMDAwLCAweDRDMUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhY29zcyIsCXR3bygweEYwMDAsIDB4NDQxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmFjb3N3IiwJdHdvKDB4RjAwMCwgMHg1MDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3giLAl0d28oMHhGMDAwLCAweDAwMUMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhY29zeCIsCXR3bygweEYwMDAsIDB4NDgxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmFjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFDKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZhZGRiIiwJdHdvKDB4RjAwMCwgMHg1ODIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYWRkZCIsCXR3bygweEYwMDAsIDB4NTQyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmFkZGwiLAl0d28oMHhGMDAwLCAweDQwMjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhZGRwIiwJdHdvKDB4RjAwMCwgMHg0QzIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYWRkcyIsCXR3bygweEYwMDAsIDB4NDQyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmFkZHciLAl0d28oMHhGMDAwLCAweDUwMjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhZGR4IiwJdHdvKDB4RjAwMCwgMHgwMDIyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYWRkeCIsCXR3bygweEYwMDAsIDB4NDgyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmc2FkZGIiLAl0d28oMHhGMDAwLCAweDU4NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGRkIiwJdHdvKDB4RjAwMCwgMHg1NDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkbCIsCXR3bygweEYwMDAsIDB4NDA2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHAiLAl0d28oMHhGMDAwLCAweDRDNjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGRzIiwJdHdvKDB4RjAwMCwgMHg0NDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkdyIsCXR3bygweEYwMDAsIDB4NTA2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHgiLAl0d28oMHhGMDAwLCAweDAwNjIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGR4IiwJdHdvKDB4RjAwMCwgMHg0ODYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRhZGRiIiwJdHdvKDB4RjAwMCwgMHg1ODY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkZCIsCXR3bygweEYwMDAsIDB4NTQ2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZGwiLAl0d28oMHhGMDAwLCAweDQwNjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGRwIiwJdHdvKDB4RjAwMCwgMHg0QzY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkcyIsCXR3bygweEYwMDAsIDB4NDQ2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZHciLAl0d28oMHhGMDAwLCAweDUwNjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGR4IiwJdHdvKDB4RjAwMCwgMHgwMDY2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkeCIsCXR3bygweEYwMDAsIDB4NDg2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZhc2luYiIsCXR3bygweEYwMDAsIDB4NTgwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmFzaW5kIiwJdHdvKDB4RjAwMCwgMHg1NDBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYXNpbmwiLAl0d28oMHhGMDAwLCAweDQwMEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhc2lucCIsCXR3bygweEYwMDAsIDB4NEMwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmFzaW5zIiwJdHdvKDB4RjAwMCwgMHg0NDBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYXNpbnciLAl0d28oMHhGMDAwLCAweDUwMEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhc2lueCIsCXR3bygweEYwMDAsIDB4MDAwQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmFzaW54IiwJdHdvKDB4RjAwMCwgMHg0ODBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYXNpbngiLAl0d28oMHhGMDAwLCAweDAwMEMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmF0YW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmQiLAl0d28oMHhGMDAwLCAweDU0MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhdGFubCIsCXR3bygweEYwMDAsIDB4NDAwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYXRhbnMiLAl0d28oMHhGMDAwLCAweDQ0MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhdGFudyIsCXR3bygweEYwMDAsIDB4NTAwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmF0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYXRhbngiLAl0d28oMHhGMDAwLCAweDQ4MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhdGFueCIsCXR3bygweEYwMDAsIDB4MDAwQSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmYXRhbmhiIiwJdHdvKDB4RjAwMCwgMHg1ODBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhkIiwJdHdvKDB4RjAwMCwgMHg1NDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhsIiwJdHdvKDB4RjAwMCwgMHg0MDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhwIiwJdHdvKDB4RjAwMCwgMHg0QzBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhzIiwJdHdvKDB4RjAwMCwgMHg0NDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh3IiwJdHdvKDB4RjAwMCwgMHg1MDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDBEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh4IiwJdHdvKDB4RjAwMCwgMHg0ODBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDBEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZiZXEiLAlvbmUoMHhGMDgxKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmYiLAkJb25lKDB4RjA4MCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJnZSIsCW9uZSgweEYwOTMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZ2wiLAlvbmUoMHhGMDk2KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmdsZSIsCW9uZSgweEYwOTcpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZ3QiLAlvbmUoMHhGMDkyKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmxlIiwJb25lKDB4RjA5NSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJsdCIsCW9uZSgweEYwOTQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmUiLAlvbmUoMHhGMDhFKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5nZSIsCW9uZSgweEYwOUMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmdsIiwJb25lKDB4RjA5OSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZ2xlIiwJb25lKDB4RjA5OCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZ3QiLAlvbmUoMHhGMDlEKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5sZSIsCW9uZSgweEYwOUEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmx0IiwJb25lKDB4RjA5QiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvZ2UiLAlvbmUoMHhGMDgzKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9nbCIsCW9uZSgweEYwODYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib2d0IiwJb25lKDB4RjA4MiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvbGUiLAlvbmUoMHhGMDg1KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9sdCIsCW9uZSgweEYwODQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib3IiLAlvbmUoMHhGMDg3KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnNlcSIsCW9uZSgweEYwOTEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic2YiLAlvbmUoMHhGMDkwKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnNuZSIsCW9uZSgweEYwOUUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic3QiLAlvbmUoMHhGMDlGKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnQiLAkJb25lKDB4RjA4RiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1ZXEiLAlvbmUoMHhGMDg5KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVnZSIsCW9uZSgweEYwOEIpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidWd0IiwJb25lKDB4RjA4QSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1bGUiLAlvbmUoMHhGMDhEKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVsdCIsCW9uZSgweEYwOEMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidW4iLAlvbmUoMHhGMDg4KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAotCi17ImZiZXFsIiwJb25lKDB4RjBDMSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJmbCIsCW9uZSgweEYwQzApLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZiZ2VsIiwJb25lKDB4RjBEMyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJnbGwiLAlvbmUoMHhGMEQ2KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmdsZWwiLAlvbmUoMHhGMEQ3KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmd0bCIsCW9uZSgweEYwRDIpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibGVsIiwJb25lKDB4RjBENSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJsdGwiLAlvbmUoMHhGMEQ0KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5lbCIsCW9uZSgweEYwQ0UpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmdlbCIsCW9uZSgweEYwREMpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmdsbCIsCW9uZSgweEYwRDkpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmdsZWwiLAlvbmUoMHhGMEQ4KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5ndGwiLAlvbmUoMHhGMEREKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5sZWwiLAlvbmUoMHhGMERBKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5sdGwiLAlvbmUoMHhGMERCKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9nZWwiLAlvbmUoMHhGMEMzKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9nbGwiLAlvbmUoMHhGMEM2KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9ndGwiLAlvbmUoMHhGMEMyKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9sZWwiLAlvbmUoMHhGMEM1KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9sdGwiLAlvbmUoMHhGMEM0KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9ybCIsCW9uZSgweEYwQzcpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZic2VxbCIsCW9uZSgweEYwRDEpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZic2ZsIiwJb25lKDB4RjBEMCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzbmVsIiwJb25lKDB4RjBERSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzdGwiLAlvbmUoMHhGMERGKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnRsIiwJb25lKDB4RjBDRiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1ZXFsIiwJb25lKDB4RjBDOSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1Z2VsIiwJb25lKDB4RjBDQiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1Z3RsIiwJb25lKDB4RjBDQSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1bGVsIiwJb25lKDB4RjBDRCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1bHRsIiwJb25lKDB4RjBDQyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1bmwiLAlvbmUoMHhGMEM4KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAotCi17ImZqZXEiLAlvbmUoMHhGMDgxKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamYiLAkJb25lKDB4RjA4MCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpnZSIsCW9uZSgweEYwOTMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZ2wiLAlvbmUoMHhGMDk2KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamdsZSIsCW9uZSgweEYwOTcpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZ3QiLAlvbmUoMHhGMDkyKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamxlIiwJb25lKDB4RjA5NSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpsdCIsCW9uZSgweEYwOTQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmUiLAlvbmUoMHhGMDhFKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5nZSIsCW9uZSgweEYwOUMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmdsIiwJb25lKDB4RjA5OSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZ2xlIiwJb25lKDB4RjA5OCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZ3QiLAlvbmUoMHhGMDlEKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5sZSIsCW9uZSgweEYwOUEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmx0IiwJb25lKDB4RjA5QiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvZ2UiLAlvbmUoMHhGMDgzKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9nbCIsCW9uZSgweEYwODYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb2d0IiwJb25lKDB4RjA4MiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvbGUiLAlvbmUoMHhGMDg1KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9sdCIsCW9uZSgweEYwODQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb3IiLAlvbmUoMHhGMDg3KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanNlcSIsCW9uZSgweEYwOTEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc2YiLAlvbmUoMHhGMDkwKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanNuZSIsCW9uZSgweEYwOUUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc3QiLAlvbmUoMHhGMDlGKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanQiLAkJb25lKDB4RjA4RiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1ZXEiLAlvbmUoMHhGMDg5KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVnZSIsCW9uZSgweEYwOEIpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdWd0IiwJb25lKDB4RjA4QSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1bGUiLAlvbmUoMHhGMDhEKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVsdCIsCW9uZSgweEYwOEMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdW4iLAlvbmUoMHhGMDg4KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAotCi17ImZjbXBiIiwJdHdvKDB4RjAwMCwgMHg1ODM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmY21wZCIsCXR3bygweEYwMDAsIDB4NTQzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmNtcGwiLAl0d28oMHhGMDAwLCAweDQwMzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZjbXBwIiwJdHdvKDB4RjAwMCwgMHg0QzM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmY21wcyIsCXR3bygweEYwMDAsIDB4NDQzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmNtcHciLAl0d28oMHhGMDAwLCAweDUwMzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZjbXB4IiwJdHdvKDB4RjAwMCwgMHgwMDM4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmY21weCIsCXR3bygweEYwMDAsIDB4NDgzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmY29zYiIsCXR3bygweEYwMDAsIDB4NTgxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmNvc2QiLAl0d28oMHhGMDAwLCAweDU0MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZjb3NsIiwJdHdvKDB4RjAwMCwgMHg0MDFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmY29zcCIsCXR3bygweEYwMDAsIDB4NEMxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmNvc3MiLAl0d28oMHhGMDAwLCAweDQ0MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZjb3N3IiwJdHdvKDB4RjAwMCwgMHg1MDFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmY29zeCIsCXR3bygweEYwMDAsIDB4MDAxRCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmNvc3giLAl0d28oMHhGMDAwLCAweDQ4MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZjb3NoYiIsCXR3bygweEYwMDAsIDB4NTgxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmNvc2hkIiwJdHdvKDB4RjAwMCwgMHg1NDE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmY29zaGwiLAl0d28oMHhGMDAwLCAweDQwMTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZjb3NocCIsCXR3bygweEYwMDAsIDB4NEMxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmNvc2hzIiwJdHdvKDB4RjAwMCwgMHg0NDE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmY29zaHciLAl0d28oMHhGMDAwLCAweDUwMTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZjb3NoeCIsCXR3bygweEYwMDAsIDB4MDAxOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmNvc2h4IiwJdHdvKDB4RjAwMCwgMHg0ODE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmY29zaHgiLAl0d28oMHhGMDAwLCAweDAwMTkpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmRiZXEiLAl0d28oMHhGMDQ4LCAweDAwMDEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmYiLAl0d28oMHhGMDQ4LCAweDAwMDApLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmdlIiwJdHdvKDB4RjA0OCwgMHgwMDEzKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJnbCIsCXR3bygweEYwNDgsIDB4MDAxNiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRiZ2xlIiwJdHdvKDB4RjA0OCwgMHgwMDE3KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJndCIsCXR3bygweEYwNDgsIDB4MDAxMiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibGUiLAl0d28oMHhGMDQ4LCAweDAwMTUpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmx0IiwJdHdvKDB4RjA0OCwgMHgwMDE0KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZSIsCXR3bygweEYwNDgsIDB4MDAwRSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmdlIiwJdHdvKDB4RjA0OCwgMHgwMDFDKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZ2wiLAl0d28oMHhGMDQ4LCAweDAwMTkpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5nbGUiLAl0d28oMHhGMDQ4LCAweDAwMTgpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5ndCIsCXR3bygweEYwNDgsIDB4MDAxRCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmxlIiwJdHdvKDB4RjA0OCwgMHgwMDFBKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJubHQiLAl0d28oMHhGMDQ4LCAweDAwMUIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9nZSIsCXR3bygweEYwNDgsIDB4MDAwMyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2dsIiwJdHdvKDB4RjA0OCwgMHgwMDA2KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvZ3QiLAl0d28oMHhGMDQ4LCAweDAwMDIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9sZSIsCXR3bygweEYwNDgsIDB4MDAwNSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2x0IiwJdHdvKDB4RjA0OCwgMHgwMDA0KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvciIsCXR3bygweEYwNDgsIDB4MDAwNyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRic2VxIiwJdHdvKDB4RjA0OCwgMHgwMDExKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzZiIsCXR3bygweEYwNDgsIDB4MDAxMCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRic25lIiwJdHdvKDB4RjA0OCwgMHgwMDFFKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzdCIsCXR3bygweEYwNDgsIDB4MDAxRiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidCIsCXR3bygweEYwNDgsIDB4MDAwRiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWVxIiwJdHdvKDB4RjA0OCwgMHgwMDA5KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1Z2UiLAl0d28oMHhGMDQ4LCAweDAwMEIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVndCIsCXR3bygweEYwNDgsIDB4MDAwQSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWxlIiwJdHdvKDB4RjA0OCwgMHgwMDBEKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1bHQiLAl0d28oMHhGMDQ4LCAweDAwMEMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVuIiwJdHdvKDB4RjA0OCwgMHgwMDA4KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAotCi17ImZkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmRpdmwiLAl0d28oMHhGMDAwLCAweDQwMjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZGl2cyIsCXR3bygweEYwMDAsIDB4NDQyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmRpdnciLAl0d28oMHhGMDAwLCAweDUwMjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDIwKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZGl2eCIsCXR3bygweEYwMDAsIDB4NDgyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmc2RpdmIiLAl0d28oMHhGMDAwLCAweDU4NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2bCIsCXR3bygweEYwMDAsIDB4NDA2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdnAiLAl0d28oMHhGMDAwLCAweDRDNjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2dyIsCXR3bygweEYwMDAsIDB4NTA2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdngiLAl0d28oMHhGMDAwLCAweDAwNjApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQ2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdmwiLAl0d28oMHhGMDAwLCAweDQwNjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2cyIsCXR3bygweEYwMDAsIDB4NDQ2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdnciLAl0d28oMHhGMDAwLCAweDUwNjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDY0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2eCIsCXR3bygweEYwMDAsIDB4NDg2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZldG94YiIsCXR3bygweEYwMDAsIDB4NTgxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmV0b3hkIiwJdHdvKDB4RjAwMCwgMHg1NDEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveGwiLAl0d28oMHhGMDAwLCAweDQwMTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZldG94cCIsCXR3bygweEYwMDAsIDB4NEMxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmV0b3hzIiwJdHdvKDB4RjAwMCwgMHg0NDEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveHciLAl0d28oMHhGMDAwLCAweDUwMTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZldG94eCIsCXR3bygweEYwMDAsIDB4MDAxMCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmV0b3h4IiwJdHdvKDB4RjAwMCwgMHg0ODEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmZXRveHgiLAl0d28oMHhGMDAwLCAweDAwMTApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmV0b3htMWIiLAl0d28oMHhGMDAwLCAweDU4MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZldG94bTFkIiwJdHdvKDB4RjAwMCwgMHg1NDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xbCIsCXR3bygweEYwMDAsIDB4NDAwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXAiLAl0d28oMHhGMDAwLCAweDRDMDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZldG94bTFzIiwJdHdvKDB4RjAwMCwgMHg0NDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xdyIsCXR3bygweEYwMDAsIDB4NTAwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXgiLAl0d28oMHhGMDAwLCAweDAwMDgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZldG94bTF4IiwJdHdvKDB4RjAwMCwgMHg0ODA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xeCIsCXR3bygweEYwMDAsIDB4MDAwOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmZ2V0ZXhwYiIsCXR3bygweEYwMDAsIDB4NTgxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cGQiLAl0d28oMHhGMDAwLCAweDU0MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHBsIiwJdHdvKDB4RjAwMCwgMHg0MDFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhwcCIsCXR3bygweEYwMDAsIDB4NEMxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHMiLAl0d28oMHhGMDAwLCAweDQ0MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHB3IiwJdHdvKDB4RjAwMCwgMHg1MDFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhweCIsCXR3bygweEYwMDAsIDB4MDAxRSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHgiLAl0d28oMHhGMDAwLCAweDQ4MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHB4IiwJdHdvKDB4RjAwMCwgMHgwMDFFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZnZXRtYW5iIiwJdHdvKDB4RjAwMCwgMHg1ODFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFuZCIsCXR3bygweEYwMDAsIDB4NTQxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbmwiLAl0d28oMHhGMDAwLCAweDQwMUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW5wIiwJdHdvKDB4RjAwMCwgMHg0QzFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFucyIsCXR3bygweEYwMDAsIDB4NDQxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbnciLAl0d28oMHhGMDAwLCAweDUwMUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW54IiwJdHdvKDB4RjAwMCwgMHgwMDFGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFueCIsCXR3bygweEYwMDAsIDB4NDgxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbngiLAl0d28oMHhGMDAwLCAweDAwMUYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmludGIiLAl0d28oMHhGMDAwLCAweDU4MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZpbnRkIiwJdHdvKDB4RjAwMCwgMHg1NDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmaW50bCIsCXR3bygweEYwMDAsIDB4NDAwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmludHAiLAl0d28oMHhGMDAwLCAweDRDMDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZpbnRzIiwJdHdvKDB4RjAwMCwgMHg0NDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmaW50dyIsCXR3bygweEYwMDAsIDB4NTAwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmludHgiLAl0d28oMHhGMDAwLCAweDAwMDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZpbnR4IiwJdHdvKDB4RjAwMCwgMHg0ODAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmaW50eCIsCXR3bygweEYwMDAsIDB4MDAwMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmaW50cnpiIiwJdHdvKDB4RjAwMCwgMHg1ODAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpkIiwJdHdvKDB4RjAwMCwgMHg1NDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpsIiwJdHdvKDB4RjAwMCwgMHg0MDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpwIiwJdHdvKDB4RjAwMCwgMHg0QzAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpzIiwJdHdvKDB4RjAwMCwgMHg0NDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp3IiwJdHdvKDB4RjAwMCwgMHg1MDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp4IiwJdHdvKDB4RjAwMCwgMHgwMDAzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp4IiwJdHdvKDB4RjAwMCwgMHg0ODAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp4IiwJdHdvKDB4RjAwMCwgMHgwMDAzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZsb2cxMGIiLAl0d28oMHhGMDAwLCAweDU4MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMGQiLAl0d28oMHhGMDAwLCAweDU0MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMGwiLAl0d28oMHhGMDAwLCAweDQwMTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHAiLAl0d28oMHhGMDAwLCAweDRDMTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHMiLAl0d28oMHhGMDAwLCAweDQ0MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHciLAl0d28oMHhGMDAwLCAweDUwMTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHgiLAl0d28oMHhGMDAwLCAweDAwMTUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHgiLAl0d28oMHhGMDAwLCAweDQ4MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHgiLAl0d28oMHhGMDAwLCAweDAwMTUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmxvZzJiIiwJdHdvKDB4RjAwMCwgMHg1ODE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbG9nMmQiLAl0d28oMHhGMDAwLCAweDU0MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZsb2cybCIsCXR3bygweEYwMDAsIDB4NDAxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmxvZzJwIiwJdHdvKDB4RjAwMCwgMHg0QzE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbG9nMnMiLAl0d28oMHhGMDAwLCAweDQ0MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZsb2cydyIsCXR3bygweEYwMDAsIDB4NTAxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmxvZzJ4IiwJdHdvKDB4RjAwMCwgMHgwMDE2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbG9nMngiLAl0d28oMHhGMDAwLCAweDQ4MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZsb2cyeCIsCXR3bygweEYwMDAsIDB4MDAxNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmbG9nbmIiLAl0d28oMHhGMDAwLCAweDU4MTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2duZCIsCXR3bygweEYwMDAsIDB4NTQxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25sIiwJdHdvKDB4RjAwMCwgMHg0MDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAiLAl0d28oMHhGMDAwLCAweDRDMTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducyIsCXR3bygweEYwMDAsIDB4NDQxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZ253IiwJdHdvKDB4RjAwMCwgMHg1MDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbG9nbngiLAl0d28oMHhGMDAwLCAweDAwMTQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2dueCIsCXR3bygweEYwMDAsIDB4NDgxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZ254IiwJdHdvKDB4RjAwMCwgMHgwMDE0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZsb2ducDFiIiwJdHdvKDB4RjAwMCwgMHg1ODA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxZCIsCXR3bygweEYwMDAsIDB4NTQwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMWwiLAl0d28oMHhGMDAwLCAweDQwMDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDFwIiwJdHdvKDB4RjAwMCwgMHg0QzA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxcyIsCXR3bygweEYwMDAsIDB4NDQwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXciLAl0d28oMHhGMDAwLCAweDUwMDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZsb2ducDF4IiwJdHdvKDB4RjAwMCwgMHgwMDA2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxeCIsCXR3bygweEYwMDAsIDB4NDgwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXgiLAl0d28oMHhGMDAwLCAweDAwMDYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZm1vZGIiLAl0d28oMHhGMDAwLCAweDU4MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZtb2RkIiwJdHdvKDB4RjAwMCwgMHg1NDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbW9kbCIsCXR3bygweEYwMDAsIDB4NDAyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZm1vZHAiLAl0d28oMHhGMDAwLCAweDRDMjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZtb2RzIiwJdHdvKDB4RjAwMCwgMHg0NDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbW9kdyIsCXR3bygweEYwMDAsIDB4NTAyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZm1vZHgiLAl0d28oMHhGMDAwLCAweDAwMjEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZtb2R4IiwJdHdvKDB4RjAwMCwgMHg0ODIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZtb3ZlYiIsCXR3bygweEYwMDAsIDB4NTgwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm1vdmViIiwJdHdvKDB4RjAwMCwgMHg3ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjckYiIsIG1mbG9hdCB9LAoteyJmbW92ZWQiLAl0d28oMHhGMDAwLCAweDU0MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlZCIsCXR3bygweEYwMDAsIDB4NzQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3fkYiLCBtZmxvYXQgfSwKLXsiZm1vdmVsIiwJdHdvKDB4RjAwMCwgMHg0MDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweDYwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyRsIiwgbWZsb2F0IH0sCi0vKiBGSVhNRTogdGhlIG5leHQgdHdvIHZhcmlhbnRzIHNob3VsZCBub3QgcGVybWl0IG1vdmluZyBhbiBhZGRyZXNzCi0gICByZWdpc3RlciB0byBhbnl0aGluZyBidXQgdGhlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIHJlZ2lzdGVyLiAgKi8KLXsiZm1vdmVsIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpczglcyIsIG1mbG9hdCB9LAoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWkqbHM4IiwgbWZsb2F0IH0sCi17ImZtb3ZlcCIsCXR3bygweEYwMDAsIDB4NEMwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm1vdmVwIiwJdHdvKDB4RjAwMCwgMHg2QzAwKSwgdHdvKDB4RjFDMCwgMHhGQzAwKSwgIklpRjd+cGtDIiwgbWZsb2F0IH0sCi17ImZtb3ZlcCIsCXR3bygweEYwMDAsIDB4N0MwMCksIHR3bygweEYxQzAsIDB4RkMwRiksICJJaUY3fnBEayIsIG1mbG9hdCB9LAoteyJmbW92ZXMiLAl0d28oMHhGMDAwLCAweDQ0MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlcyIsCXR3bygweEYwMDAsIDB4NjQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JGYiLCBtZmxvYXQgfSwKLXsiZm1vdmV3IiwJdHdvKDB4RjAwMCwgMHg1MDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXciLAl0d28oMHhGMDAwLCAweDcwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyR3IiwgbWZsb2F0IH0sCi17ImZtb3ZleCIsCXR3bygweEYwMDAsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm1vdmV4IiwJdHdvKDB4RjAwMCwgMHg0ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXgiLAl0d28oMHhGMDAwLCAweDY4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGN354IiwgbWZsb2F0IH0sCi0KLXsiZnNtb3ZlYiIsCXR3bygweEYwMDAsIDB4NTg0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmVkIiwJdHdvKDB4RjAwMCwgMHg1NDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZWwiLAl0d28oMHhGMDAwLCAweDQwNDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZlcyIsCXR3bygweEYwMDAsIDB4NDQ0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmV3IiwJdHdvKDB4RjAwMCwgMHg1MDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZXgiLAl0d28oMHhGMDAwLCAweDAwNDApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZleCIsCXR3bygweEYwMDAsIDB4NDg0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmVwIiwJdHdvKDB4RjAwMCwgMHg0QzQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRtb3ZlYiIsCXR3bygweEYwMDAsIDB4NTg0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmVkIiwJdHdvKDB4RjAwMCwgMHg1NDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZWwiLAl0d28oMHhGMDAwLCAweDQwNDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZlcyIsCXR3bygweEYwMDAsIDB4NDQ0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmV3IiwJdHdvKDB4RjAwMCwgMHg1MDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZXgiLAl0d28oMHhGMDAwLCAweDAwNDQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZleCIsCXR3bygweEYwMDAsIDB4NDg0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmVwIiwJdHdvKDB4RjAwMCwgMHg0QzQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi0KLXsiZm1vdmVjcngiLAl0d28oMHhGMDAwLCAweDVDMDApLCB0d28oMHhGMUZGLCAweEZDMDApLCAiSWkjQ0Y3IiwgbWZsb2F0IH0sCi0KLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RjgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaURrJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMjAsIDB4RTgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaURrLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RDgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaSZzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMTgsIDB4RDgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaStzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZGwzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCMzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzIzMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZEwzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCMzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzIzMiLCBtZmxvYXQgfSwKLQoteyJmbW92ZW1sIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpczglcyIsIG1mbG9hdCB9LAoteyJmbW92ZW1sIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpTDh+cyIsIG1mbG9hdCB9LAotLyogRklYTUU6IEluIHRoZSBuZXh0IGluc3RydWN0aW9uLCB3ZSBzaG91bGQgb25seSBwZXJtaXQgJWRuIGlmIHRoZQotICAgdGFyZ2V0IGlzIGEgc2luZ2xlIHJlZ2lzdGVyLiAgV2Ugc2hvdWxkIG9ubHkgcGVybWl0ICVhbiBpZiB0aGUKLSAgIHRhcmdldCBpcyBhIHNpbmdsZSAlZnBpYXIuICAqLwoteyJmbW92ZW1sIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpKmxMOCIsIG1mbG9hdCB9LAotCi17ImZtb3ZlbSIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZEwzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkbDMmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDE4LCAweEQwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQrc2wzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkIzMtcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDIwLCAweEU4MDApLCB0d28oMHhGMUY4LCAweEZGOEYpLCAiSWlEay1zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCMzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhGODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpRGsmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDE4LCAweEQwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQrcyMzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMTgsIDB4RDgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaStzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnMjMyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEQ4MDApLCB0d28oMHhGMUMwLCAweEZGOEYpLCAiSWkmc0RrIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4QTAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaXM4JXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpKnNzOCIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlMOH5zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4ODAwMCksIHR3bygweEYyQzAsIDB4RTNGRiksICJJaSpzTDgiLCBtZmxvYXQgfSwKLQoteyJmbXVsYiIsCXR3bygweEYwMDAsIDB4NTgyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm11bGQiLAl0d28oMHhGMDAwLCAweDU0MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbXVscCIsCXR3bygweEYwMDAsIDB4NEMyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm11bHMiLAl0d28oMHhGMDAwLCAweDQ0MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbXVseCIsCXR3bygweEYwMDAsIDB4MDAyMyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm11bHgiLAl0d28oMHhGMDAwLCAweDQ4MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZnNtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVsZCIsCXR3bygweEYwMDAsIDB4NTQ2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc211bGwiLAl0d28oMHhGMDAwLCAweDQwNjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVscyIsCXR3bygweEYwMDAsIDB4NDQ2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc211bHciLAl0d28oMHhGMDAwLCAweDUwNjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDYzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVseCIsCXR3bygweEYwMDAsIDB4NDg2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZkbXVsYiIsCXR3bygweEYwMDAsIDB4NTg2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bGQiLAl0d28oMHhGMDAwLCAweDU0NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVscCIsCXR3bygweEYwMDAsIDB4NEM2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHMiLAl0d28oMHhGMDAwLCAweDQ0NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVseCIsCXR3bygweEYwMDAsIDB4MDA2NyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHgiLAl0d28oMHhGMDAwLCAweDQ4NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmbmVnYiIsCXR3bygweEYwMDAsIDB4NTgxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm5lZ2QiLAl0d28oMHhGMDAwLCAweDU0MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZuZWdsIiwJdHdvKDB4RjAwMCwgMHg0MDFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbmVncCIsCXR3bygweEYwMDAsIDB4NEMxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm5lZ3MiLAl0d28oMHhGMDAwLCAweDQ0MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZuZWd3IiwJdHdvKDB4RjAwMCwgMHg1MDFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbmVneCIsCXR3bygweEYwMDAsIDB4MDAxQSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm5lZ3giLAl0d28oMHhGMDAwLCAweDQ4MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDFBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzbmVnYiIsCXR3bygweEYwMDAsIDB4NTg1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ2QiLAl0d28oMHhGMDAwLCAweDU0NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWdsIiwJdHdvKDB4RjAwMCwgMHg0MDVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVncCIsCXR3bygweEYwMDAsIDB4NEM1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3MiLAl0d28oMHhGMDAwLCAweDQ0NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWd3IiwJdHdvKDB4RjAwMCwgMHg1MDVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVneCIsCXR3bygweEYwMDAsIDB4MDA1QSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3giLAl0d28oMHhGMDAwLCAweDQ4NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRuZWdiIiwJdHdvKDB4RjAwMCwgMHg1ODVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVnZCIsCXR3bygweEYwMDAsIDB4NTQ1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ2wiLAl0d28oMHhGMDAwLCAweDQwNUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWdwIiwJdHdvKDB4RjAwMCwgMHg0QzVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVncyIsCXR3bygweEYwMDAsIDB4NDQ1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3ciLAl0d28oMHhGMDAwLCAweDUwNUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVneCIsCXR3bygweEYwMDAsIDB4NDg1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3giLAl0d28oMHhGMDAwLCAweDAwNUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmbm9wIiwJdHdvKDB4RjI4MCwgMHgwMDAwKSwgdHdvKDB4RkZGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi0KLXsiZnJlbWIiLAl0d28oMHhGMDAwLCAweDU4MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZyZW1kIiwJdHdvKDB4RjAwMCwgMHg1NDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmcmVtbCIsCXR3bygweEYwMDAsIDB4NDAyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnJlbXAiLAl0d28oMHhGMDAwLCAweDRDMjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZyZW1zIiwJdHdvKDB4RjAwMCwgMHg0NDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmcmVtdyIsCXR3bygweEYwMDAsIDB4NTAyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnJlbXgiLAl0d28oMHhGMDAwLCAweDAwMjUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZyZW14IiwJdHdvKDB4RjAwMCwgMHg0ODI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZyZXN0b3JlIiwJb25lKDB4RjE0MCksCQlvbmUoMHhGMUMwKSwgIklkPHMiLCBtZmxvYXQgfSwKLQoteyJmc2F2ZSIsCW9uZSgweEYxMDApLAkJb25lKDB4RjFDMCksICJJZD5zIiwgbWZsb2F0IH0sCi0KLXsiZnNjYWxlYiIsCXR3bygweEYwMDAsIDB4NTgyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlZCIsCXR3bygweEYwMDAsIDB4NTQyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlbCIsCXR3bygweEYwMDAsIDB4NDAyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlcCIsCXR3bygweEYwMDAsIDB4NEMyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlcyIsCXR3bygweEYwMDAsIDB4NDQyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxldyIsCXR3bygweEYwMDAsIDB4NTAyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNjYWxleCIsCXR3bygweEYwMDAsIDB4MDAyNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNjYWxleCIsCXR3bygweEYwMDAsIDB4NDgyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQotLyogJCBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgYXNzZW1ibGVyIGZyb20gdXNpbmcgUEMtcmVsYXRpdmUuCi0gICBJZiBAIHdlcmUgdXNlZCwgImxhYmVsOiBmc2VxIGxhYmVsIiBjb3VsZCBwcm9kdWNlICJmdHJhcGVxIiwKLSAgIGJlY2F1c2UgImxhYmVsIiBiZWNhbWUgInBjQGxhYmVsIi4gICovCi17ImZzZXEiLAl0d28oMHhGMDQwLCAweDAwMDEpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2YiLAkJdHdvKDB4RjA0MCwgMHgwMDAwKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNnZSIsCXR3bygweEYwNDAsIDB4MDAxMyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZ2wiLAl0d28oMHhGMDQwLCAweDAwMTYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2dsZSIsCXR3bygweEYwNDAsIDB4MDAxNyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZ3QiLAl0d28oMHhGMDQwLCAweDAwMTIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2xlIiwJdHdvKDB4RjA0MCwgMHgwMDE1KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNsdCIsCXR3bygweEYwNDAsIDB4MDAxNCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmUiLAl0d28oMHhGMDQwLCAweDAwMEUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25nZSIsCXR3bygweEYwNDAsIDB4MDAxQyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmdsIiwJdHdvKDB4RjA0MCwgMHgwMDE5KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZ2xlIiwJdHdvKDB4RjA0MCwgMHgwMDE4KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZ3QiLAl0d28oMHhGMDQwLCAweDAwMUQpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25sZSIsCXR3bygweEYwNDAsIDB4MDAxQSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmx0IiwJdHdvKDB4RjA0MCwgMHgwMDFCKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvZ2UiLAl0d28oMHhGMDQwLCAweDAwMDMpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29nbCIsCXR3bygweEYwNDAsIDB4MDAwNiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb2d0IiwJdHdvKDB4RjA0MCwgMHgwMDAyKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvbGUiLAl0d28oMHhGMDQwLCAweDAwMDUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29sdCIsCXR3bygweEYwNDAsIDB4MDAwNCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb3IiLAl0d28oMHhGMDQwLCAweDAwMDcpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3NlcSIsCXR3bygweEYwNDAsIDB4MDAxMSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc2YiLAl0d28oMHhGMDQwLCAweDAwMTApLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3NuZSIsCXR3bygweEYwNDAsIDB4MDAxRSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc3QiLAl0d28oMHhGMDQwLCAweDAwMUYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3QiLAkJdHdvKDB4RjA0MCwgMHgwMDBGKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1ZXEiLAl0d28oMHhGMDQwLCAweDAwMDkpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VnZSIsCXR3bygweEYwNDAsIDB4MDAwQiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdWd0IiwJdHdvKDB4RjA0MCwgMHgwMDBBKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1bGUiLAl0d28oMHhGMDQwLCAweDAwMEQpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VsdCIsCXR3bygweEYwNDAsIDB4MDAwQyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdW4iLAl0d28oMHhGMDQwLCAweDAwMDgpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAotCi17ImZzZ2xkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdmwiLAl0d28oMHhGMDAwLCAweDQwMjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2cyIsCXR3bygweEYwMDAsIDB4NDQyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdnciLAl0d28oMHhGMDAwLCAweDUwMjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDI0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2eCIsCXR3bygweEYwMDAsIDB4NDgyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdngiLAl0d28oMHhGMDAwLCAweDAwMjQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNnbG11bGIiLAl0d28oMHhGMDAwLCAweDU4MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWxkIiwJdHdvKDB4RjAwMCwgMHg1NDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVsbCIsCXR3bygweEYwMDAsIDB4NDAyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHAiLAl0d28oMHhGMDAwLCAweDRDMjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWxzIiwJdHdvKDB4RjAwMCwgMHg0NDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVsdyIsCXR3bygweEYwMDAsIDB4NTAyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHgiLAl0d28oMHhGMDAwLCAweDAwMjcpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWx4IiwJdHdvKDB4RjAwMCwgMHg0ODI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVseCIsCXR3bygweEYwMDAsIDB4MDAyNyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc2luYiIsCXR3bygweEYwMDAsIDB4NTgwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNpbmQiLAl0d28oMHhGMDAwLCAweDU0MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzaW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2lucCIsCXR3bygweEYwMDAsIDB4NEMwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNpbnMiLAl0d28oMHhGMDAwLCAweDQ0MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzaW53IiwJdHdvKDB4RjAwMCwgMHg1MDBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2lueCIsCXR3bygweEYwMDAsIDB4MDAwRSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNpbngiLAl0d28oMHhGMDAwLCAweDQ4MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzaW5jb3NiIiwJdHdvKDB4RjAwMCwgMHg1ODMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO2JGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NkIiwJdHdvKDB4RjAwMCwgMHg1NDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO0ZGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NsIiwJdHdvKDB4RjAwMCwgMHg0MDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO2xGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NwIiwJdHdvKDB4RjAwMCwgMHg0QzMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO3BGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NzIiwJdHdvKDB4RjAwMCwgMHg0NDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO2ZGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3N3IiwJdHdvKDB4RjAwMCwgMHg1MDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO3dGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDMwKSwgdHdvKDB4RjFDMCwgMHhFMDc4KSwgIklpRjhGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3N4IiwJdHdvKDB4RjAwMCwgMHg0ODMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO3hGM0Y3IiwgbWZsb2F0IH0sCi0KLXsiZnNpbmhiIiwJdHdvKDB4RjAwMCwgMHg1ODAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2luaGQiLAl0d28oMHhGMDAwLCAweDU0MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzaW5obCIsCXR3bygweEYwMDAsIDB4NDAwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNpbmhwIiwJdHdvKDB4RjAwMCwgMHg0QzAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2luaHMiLAl0d28oMHhGMDAwLCAweDQ0MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzaW5odyIsCXR3bygweEYwMDAsIDB4NTAwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNpbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDAyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2luaHgiLAl0d28oMHhGMDAwLCAweDQ4MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzaW5oeCIsCXR3bygweEYwMDAsIDB4MDAwMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc3FydGIiLAl0d28oMHhGMDAwLCAweDU4MDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0ZCIsCXR3bygweEYwMDAsIDB4NTQwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNxcnRsIiwJdHdvKDB4RjAwMCwgMHg0MDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc3FydHAiLAl0d28oMHhGMDAwLCAweDRDMDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0cyIsCXR3bygweEYwMDAsIDB4NDQwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNxcnR3IiwJdHdvKDB4RjAwMCwgMHg1MDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc3FydHgiLAl0d28oMHhGMDAwLCAweDAwMDQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0eCIsCXR3bygweEYwMDAsIDB4NDgwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDA0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzc3FydGIiLAl0d28oMHhGMDAwLCAweDU4NDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0ZCIsCXR3bygweEYwMDAsIDB4NTQ0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnRsIiwJdHdvKDB4RjAwMCwgMHg0MDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHAiLAl0d28oMHhGMDAwLCAweDRDNDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0cyIsCXR3bygweEYwMDAsIDB4NDQ0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnR3IiwJdHdvKDB4RjAwMCwgMHg1MDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0eCIsCXR3bygweEYwMDAsIDB4NDg0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDQxKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRzcXJ0YiIsCXR3bygweEYwMDAsIDB4NTg0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnRkIiwJdHdvKDB4RjAwMCwgMHg1NDQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydGwiLAl0d28oMHhGMDAwLCAweDQwNDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0cCIsCXR3bygweEYwMDAsIDB4NEM0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnRzIiwJdHdvKDB4RjAwMCwgMHg0NDQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHciLAl0d28oMHhGMDAwLCAweDUwNDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0NSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnR4IiwJdHdvKDB4RjAwMCwgMHg0ODQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmc3ViYiIsCXR3bygweEYwMDAsIDB4NTgyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnN1YmQiLAl0d28oMHhGMDAwLCAweDU0MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzdWJsIiwJdHdvKDB4RjAwMCwgMHg0MDI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc3VicCIsCXR3bygweEYwMDAsIDB4NEMyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnN1YnMiLAl0d28oMHhGMDAwLCAweDQ0MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzdWJ3IiwJdHdvKDB4RjAwMCwgMHg1MDI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc3VieCIsCXR3bygweEYwMDAsIDB4MDAyOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnN1YngiLAl0d28oMHhGMDAwLCAweDQ4MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDI4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzc3ViYiIsCXR3bygweEYwMDAsIDB4NTg2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YmQiLAl0d28oMHhGMDAwLCAweDU0NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJsIiwJdHdvKDB4RjAwMCwgMHg0MDY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VicCIsCXR3bygweEYwMDAsIDB4NEM2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YnMiLAl0d28oMHhGMDAwLCAweDQ0NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJ3IiwJdHdvKDB4RjAwMCwgMHg1MDY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VieCIsCXR3bygweEYwMDAsIDB4MDA2OCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YngiLAl0d28oMHhGMDAwLCAweDQ4NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDY4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRzdWJiIiwJdHdvKDB4RjAwMCwgMHg1ODZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkc3ViZCIsCXR3bygweEYwMDAsIDB4NTQ2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YmwiLAl0d28oMHhGMDAwLCAweDQwNmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJwIiwJdHdvKDB4RjAwMCwgMHg0QzZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VicyIsCXR3bygweEYwMDAsIDB4NDQ2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YnciLAl0d28oMHhGMDAwLCAweDUwNmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDZjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VieCIsCXR3bygweEYwMDAsIDB4NDg2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YngiLAl0d28oMHhGMDAwLCAweDAwNmMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmdGFuYiIsCXR3bygweEYwMDAsIDB4NTgwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnRhbmQiLAl0d28oMHhGMDAwLCAweDU0MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZ0YW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmdGFucCIsCXR3bygweEYwMDAsIDB4NEMwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnRhbnMiLAl0d28oMHhGMDAwLCAweDQ0MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZ0YW53IiwJdHdvKDB4RjAwMCwgMHg1MDBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmdGFueCIsCXR3bygweEYwMDAsIDB4MDAwRiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnRhbngiLAl0d28oMHhGMDAwLCAweDQ4MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZ0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZ0YW5oYiIsCXR3bygweEYwMDAsIDB4NTgwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnRhbmhkIiwJdHdvKDB4RjAwMCwgMHg1NDA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmdGFuaGwiLAl0d28oMHhGMDAwLCAweDQwMDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5ocCIsCXR3bygweEYwMDAsIDB4NEMwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnRhbmhzIiwJdHdvKDB4RjAwMCwgMHg0NDA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHciLAl0d28oMHhGMDAwLCAweDUwMDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZ0YW5oeCIsCXR3bygweEYwMDAsIDB4MDAwOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnRhbmh4IiwJdHdvKDB4RjAwMCwgMHg0ODA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMDkpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnRlbnRveGIiLAl0d28oMHhGMDAwLCAweDU4MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3hkIiwJdHdvKDB4RjAwMCwgMHg1NDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94bCIsCXR3bygweEYwMDAsIDB4NDAxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHAiLAl0d28oMHhGMDAwLCAweDRDMTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3hzIiwJdHdvKDB4RjAwMCwgMHg0NDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94dyIsCXR3bygweEYwMDAsIDB4NTAxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHgiLAl0d28oMHhGMDAwLCAweDAwMTIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3h4IiwJdHdvKDB4RjAwMCwgMHg0ODEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94eCIsCXR3bygweEYwMDAsIDB4MDAxMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmdHJhcGVxIiwJdHdvKDB4RjA3QywgMHgwMDAxKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZiIsCXR3bygweEYwN0MsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGdlIiwJdHdvKDB4RjA3QywgMHgwMDEzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2wiLAl0d28oMHhGMDdDLCAweDAwMTYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBnbGUiLAl0d28oMHhGMDdDLCAweDAwMTcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBndCIsCXR3bygweEYwN0MsIDB4MDAxMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGxlIiwJdHdvKDB4RjA3QywgMHgwMDE1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbHQiLAl0d28oMHhGMDdDLCAweDAwMTQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZSIsCXR3bygweEYwN0MsIDB4MDAwRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5nZSIsCXR3bygweEYwN0MsIDB4MDAxQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbCIsCXR3bygweEYwN0MsIDB4MDAxOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbGUiLAl0d28oMHhGMDdDLCAweDAwMTgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ3QiLAl0d28oMHhGMDdDLCAweDAwMUQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBubGUiLAl0d28oMHhGMDdDLCAweDAwMUEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBubHQiLAl0d28oMHhGMDdDLCAweDAwMUIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2UiLAl0d28oMHhGMDdDLCAweDAwMDMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2wiLAl0d28oMHhGMDdDLCAweDAwMDYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ3QiLAl0d28oMHhGMDdDLCAweDAwMDIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvbGUiLAl0d28oMHhGMDdDLCAweDAwMDUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvbHQiLAl0d28oMHhGMDdDLCAweDAwMDQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvciIsCXR3bygweEYwN0MsIDB4MDAwNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHNlcSIsCXR3bygweEYwN0MsIDB4MDAxMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHNmIiwJdHdvKDB4RjA3QywgMHgwMDEwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc25lIiwJdHdvKDB4RjA3QywgMHgwMDFFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc3QiLAl0d28oMHhGMDdDLCAweDAwMUYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB0IiwJdHdvKDB4RjA3QywgMHgwMDBGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWVxIiwJdHdvKDB4RjA3QywgMHgwMDA5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWdlIiwJdHdvKDB4RjA3QywgMHgwMDBCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWd0IiwJdHdvKDB4RjA3QywgMHgwMDBBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWxlIiwJdHdvKDB4RjA3QywgMHgwMDBEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWx0IiwJdHdvKDB4RjA3QywgMHgwMDBDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdW4iLAl0d28oMHhGMDdDLCAweDAwMDgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLSAgICAgICAgCi17ImZ0cmFwZXF3IiwJdHdvKDB4RjA3QSwgMHgwMDAxKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBmdyIsCXR3bygweEYwN0EsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2V3IiwJdHdvKDB4RjA3QSwgMHgwMDEzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBnbHciLAl0d28oMHhGMDdBLCAweDAwMTYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGdsZXciLAl0d28oMHhGMDdBLCAweDAwMTcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGd0dyIsCXR3bygweEYwN0EsIDB4MDAxMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbGV3IiwJdHdvKDB4RjA3QSwgMHgwMDE1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBsdHciLAl0d28oMHhGMDdBLCAweDAwMTQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5ldyIsCXR3bygweEYwN0EsIDB4MDAwRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdldyIsCXR3bygweEYwN0EsIDB4MDAxQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsdyIsCXR3bygweEYwN0EsIDB4MDAxOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsZXciLAl0d28oMHhGMDdBLCAweDAwMTgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5ndHciLAl0d28oMHhGMDdBLCAweDAwMUQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5sZXciLAl0d28oMHhGMDdBLCAweDAwMUEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5sdHciLAl0d28oMHhGMDdBLCAweDAwMUIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9nZXciLAl0d28oMHhGMDdBLCAweDAwMDMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9nbHciLAl0d28oMHhGMDdBLCAweDAwMDYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9ndHciLAl0d28oMHhGMDdBLCAweDAwMDIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9sZXciLAl0d28oMHhGMDdBLCAweDAwMDUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9sdHciLAl0d28oMHhGMDdBLCAweDAwMDQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9ydyIsCXR3bygweEYwN0EsIDB4MDAwNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwc2VxdyIsCXR3bygweEYwN0EsIDB4MDAxMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwc2Z3IiwJdHdvKDB4RjA3QSwgMHgwMDEwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzbmV3IiwJdHdvKDB4RjA3QSwgMHgwMDFFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzdHciLAl0d28oMHhGMDdBLCAweDAwMUYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHR3IiwJdHdvKDB4RjA3QSwgMHgwMDBGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1ZXF3IiwJdHdvKDB4RjA3QSwgMHgwMDA5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z2V3IiwJdHdvKDB4RjA3QSwgMHgwMDBCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z3R3IiwJdHdvKDB4RjA3QSwgMHgwMDBBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1bGV3IiwJdHdvKDB4RjA3QSwgMHgwMDBEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1bHR3IiwJdHdvKDB4RjA3QSwgMHgwMDBDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1bnciLAl0d28oMHhGMDdBLCAweDAwMDgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAotCi17ImZ0cmFwZXFsIiwJdHdvKDB4RjA3QiwgMHgwMDAxKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBmbCIsCXR3bygweEYwN0IsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2VsIiwJdHdvKDB4RjA3QiwgMHgwMDEzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBnbGwiLAl0d28oMHhGMDdCLCAweDAwMTYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGdsZWwiLAl0d28oMHhGMDdCLCAweDAwMTcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGd0bCIsCXR3bygweEYwN0IsIDB4MDAxMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbGVsIiwJdHdvKDB4RjA3QiwgMHgwMDE1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBsdGwiLAl0d28oMHhGMDdCLCAweDAwMTQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5lbCIsCXR3bygweEYwN0IsIDB4MDAwRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdlbCIsCXR3bygweEYwN0IsIDB4MDAxQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsbCIsCXR3bygweEYwN0IsIDB4MDAxOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsZWwiLAl0d28oMHhGMDdCLCAweDAwMTgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5ndGwiLAl0d28oMHhGMDdCLCAweDAwMUQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5sZWwiLAl0d28oMHhGMDdCLCAweDAwMUEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5sdGwiLAl0d28oMHhGMDdCLCAweDAwMUIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9nZWwiLAl0d28oMHhGMDdCLCAweDAwMDMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9nbGwiLAl0d28oMHhGMDdCLCAweDAwMDYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9ndGwiLAl0d28oMHhGMDdCLCAweDAwMDIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9sZWwiLAl0d28oMHhGMDdCLCAweDAwMDUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9sdGwiLAl0d28oMHhGMDdCLCAweDAwMDQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9ybCIsCXR3bygweEYwN0IsIDB4MDAwNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2VxbCIsCXR3bygweEYwN0IsIDB4MDAxMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2ZsIiwJdHdvKDB4RjA3QiwgMHgwMDEwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzbmVsIiwJdHdvKDB4RjA3QiwgMHgwMDFFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzdGwiLAl0d28oMHhGMDdCLCAweDAwMUYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHRsIiwJdHdvKDB4RjA3QiwgMHgwMDBGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1ZXFsIiwJdHdvKDB4RjA3QiwgMHgwMDA5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z2VsIiwJdHdvKDB4RjA3QiwgMHgwMDBCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z3RsIiwJdHdvKDB4RjA3QiwgMHgwMDBBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bGVsIiwJdHdvKDB4RjA3QiwgMHgwMDBEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bHRsIiwJdHdvKDB4RjA3QiwgMHgwMDBDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bmwiLAl0d28oMHhGMDdCLCAweDAwMDgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAotCi17ImZ0c3RiIiwJdHdvKDB4RjAwMCwgMHg1ODNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2IiLCBtZmxvYXQgfSwKLXsiZnRzdGQiLAl0d28oMHhGMDAwLCAweDU0M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RiIsIG1mbG9hdCB9LAoteyJmdHN0bCIsCXR3bygweEYwMDAsIDB4NDAzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsIiwgbWZsb2F0IH0sCi17ImZ0c3RwIiwJdHdvKDB4RjAwMCwgMHg0QzNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3AiLCBtZmxvYXQgfSwKLXsiZnRzdHMiLAl0d28oMHhGMDAwLCAweDQ0M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZiIsIG1mbG9hdCB9LAoteyJmdHN0dyIsCXR3bygweEYwMDAsIDB4NTAzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3IiwgbWZsb2F0IH0sCi17ImZ0c3R4IiwJdHdvKDB4RjAwMCwgMHgwMDNBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjgiLCBtZmxvYXQgfSwKLXsiZnRzdHgiLAl0d28oMHhGMDAwLCAweDQ4M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eCIsIG1mbG9hdCB9LAotCi17ImZ0d290b3hiIiwJdHdvKDB4RjAwMCwgMHg1ODExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94ZCIsCXR3bygweEYwMDAsIDB4NTQxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveGwiLAl0d28oMHhGMDAwLCAweDQwMTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3hwIiwJdHdvKDB4RjAwMCwgMHg0QzExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94cyIsCXR3bygweEYwMDAsIDB4NDQxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHciLAl0d28oMHhGMDAwLCAweDUwMTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZ0d290b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDExKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94eCIsCXR3bygweEYwMDAsIDB4NDgxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHgiLAl0d28oMHhGMDAwLCAweDAwMTEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiaGFsdCIsCW9uZSgwMDQ1MzEwKSwJb25lKDAxNzc3NzcpLCAiIiwgICAgIG02ODA2MCB8IG1jZiB9LAotCi17ImlsbGVnYWwiLAlvbmUoMDA0NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsICAgICBtNjgwMDB1cCB9LAotCi17ImptcCIsCQlvbmUoMDA0NzMwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJqcmEiLAkJb25lKDAwNjAwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpyYSIsCQlvbmUoMDA0NzMwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJqc3IiLAkJb25lKDAwNDcyMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiamJzciIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqYnNyIiwJb25lKDAwNDcyMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibGVhIiwJCW9uZSgwMDQwNzAwKSwJb25lKDAxNzA3MDApLCAiIXNBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibHBzdG9wIiwJdHdvKDAxNzQwMDAsMDAwMDcwMCksdHdvKDAxNzc3NzcsMDE3Nzc3NyksIiN3IiwgY3B1MzJ8bTY4MDYwIH0sCi0KLXsibGlua3ciLAlvbmUoMDA0NzEyMCksCW9uZSgwMTc3NzcwKSwgIkFzI3ciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJsaW5rbCIsCW9uZSgwMDQ0MDEwKSwJb25lKDAxNzc3NzApLCAiQXMjbCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsibGluayIsCW9uZSgwMDQ3MTIwKSwJb25lKDAxNzc3NzApLCAiQXMjVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImxpbmsiLAlvbmUoMDA0NDAxMCksCW9uZSgwMTc3NzcwKSwgIkFzI2wiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsibHNsYiIsCW9uZSgwMTYwNDEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImxzbGIiLAlvbmUoMDE2MDQ1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJsc2x3IiwJb25lKDAxNjA1MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNsdyIsCW9uZSgwMTYwNTUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzbHciLAlvbmUoMDE2MTcwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJsc2xsIiwJb25lKDAxNjA2MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibHNsbCIsCW9uZSgwMTYwNjUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibHNyYiIsCW9uZSgwMTYwMDEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImxzcmIiLAlvbmUoMDE2MDA1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJsc3J3IiwJb25lKDAxNjAxMTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNydyIsCW9uZSgwMTYwMTUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzcnciLAlvbmUoMDE2MTMwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJsc3JsIiwJb25lKDAxNjAyMTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibHNybCIsCW9uZSgwMTYwMjUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLSAgLyogRklYTUU6IGFkZCBNQU0gbW9kZSAoYCYnIGFmdGVyIDxlYT4gb3BlcmFuZCkgLyByZW1vdmUgTUFDTSAqLwoteyJtYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAwMDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bU1oIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyMjAsIDAwMDAwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAwMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDI0MCwgMDAwMDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8tc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyNTAsIDAwMDAwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjIwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjQwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjUwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjIwLCAwMDAwMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2FzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIzMCwgMDAwMDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8rc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyNDAsIDAwMDAwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjUwLCAwMDAwMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2RzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIyMCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIzMCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDI0MCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDI1MCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJtYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA0MDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbU1oIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyMjAsIDAwMDQwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA0MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDI0MCwgMDAwNDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjEtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyNTAsIDAwMDQwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjIwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjQwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjUwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjIwLCAwMDA0MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIzMCwgMDAwNDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjErc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyNDAsIDAwMDQwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjUwLCAwMDA0MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIyMCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIzMCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDI0MCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDI1MCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQotLyogTk9URTogVGhlIG1jZjUyMDAgZmFtaWx5IHByb2dyYW1tZXIncyByZWZlcmVuY2UgbWFudWFsIGRvZXMgbm90IAotICAgaW5kaWNhdGUgdGhlIGJ5dGUgZm9ybSBvZiB0aGUgbW92ZWEgaW5zdHJ1Y3Rpb24gaXMgaW52YWxpZCAoYXMgaXQKLSAgIGlzIG9uIDY4MDAwIGZhbWlseSBjcHVzKS4gIEhvd2V2ZXIsIGV4cGVyaW1lbnRzIG9uIHRoZSA1MjAyIHllaWxkCi0gICB1bmV4cGVjdGVkIHJlc3VsdHMuICBUaGUgdmFsdWUgaXMgY29waWVkLCBidXQgaXQgaXMgbm90IHNpZ24gZXh0ZW5kZWQKLSAgIChhcyBpcyBkb25lIHdpdGggbW92ZWEudykgYW5kIHRoZSB0b3AgdGhyZWUgYnl0ZXMgaW4gdGhlIGFkZHJlc3MgCi0gICByZWdpc3RlciBhcmUgbm90IGRpc3R1cmJlZC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIHRoZSBpbnRlbmRlZAotICAgYmVoYXZpb3IgLS0tIGl0IGNvdWxkIGJlIGEgaG9sZSBpbiBpbnN0cnVjdGlvbiBkZWNvZGluZyAoTW90b3JvbGEKLSAgIGRlY2lkZWQgbm90IHRvIHRyYXAgYWxsIGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvciBwZXJmb3JtYW5jZSByZWFzb25zKQotICAgLS0tIGJ1dCBJIHN1c3BlY3QgdGhhdCBpdCBpcyBub3QuICAgCi0KLSAgIEkgcmVwb3J0ZWQgdGhpcyB0byBNb3Rvcm9sYSBJU0QgVGVjaG5pY2FsIENvbW11bmljYXRpb25zIFN1cHBvcnQsIAotICAgd2hpY2ggcmVwbGllZCB0aGF0IG90aGVyIGNvbGRmaXJlIGFzc2VtYmxlcnMgcmVqZWN0IG1vdmVhLmIuICBGb3IgCi0gICB0aGlzIHJlYXNvbiBJJ3ZlIGRlY2lkZWQgdG8gbm90IGFsbG93IG1vdmVhYi4gCi0KLQlqdGNAY3lnbnVzLmNvbSAtIDk3LzAxLzI0Ci0gKi8KLQoteyJtb3ZlYWwiLAlvbmUoMDAyMDEwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJtb3ZlYXciLAlvbmUoMDAzMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17Im1vdmVjIiwJb25lKDAwNDcxNzMpLAlvbmUoMDE3Nzc3NyksICJSMUpqIiwgbTY4MDEwdXAgfCBtY2YgfSwKLXsibW92ZWMiLAlvbmUoMDA0NzE3MyksCW9uZSgwMTc3Nzc3KSwgIlIxI2oiLCBtNjgwMTB1cCB8IG1jZiB9LAoteyJtb3ZlYyIsCW9uZSgwMDQ3MTcyKSwJb25lKDAxNzc3NzcpLCAiSmpSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVjIiwJb25lKDAwNDcxNzIpLAlvbmUoMDE3Nzc3NyksICIjalIxIiwgbTY4MDEwdXAgfSwKLQoteyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NDI0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDM0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAotLyogRklYTUU6IG5lZWQgc3BlY2lmaWVyIGZvciBtb2RlIDIgYW5kIDUgdG8gc2ltcGxpZnkgYmVsb3cgaW5zbiBwYXR0ZXJucyAqLwoteyJtb3ZlbWwiLAlvbmUoMDA0NDMyMCksCW9uZSgwMTc3NzcwKSwgIkx3YXMiLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDQzMjApLAlvbmUoMDE3Nzc3MCksICIjd2FzIiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzUwKSwJb25lKDAxNzc3NzApLCAiTHdkcyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDM1MCksCW9uZSgwMTc3NzcwKSwgIiN3ZHMiLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzMjApLAlvbmUoMDE3Nzc3MCksICJhc0x3IiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzIwKSwJb25lKDAxNzc3NzApLCAiYXMjdyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjM1MCksCW9uZSgwMTc3NzcwKSwgImRzTHciLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzNTApLAlvbmUoMDE3Nzc3MCksICJkcyN3IiwgbWNmIH0sCi0KLXsibW92ZXB3IiwJb25lKDAwMDA0MTApLAlvbmUoMDE3MDc3MCksICJkc0RkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXB3IiwJb25lKDAwMDA2MTApLAlvbmUoMDE3MDc3MCksICJEZGRzIiwgbTY4MDAwdXAgfSwKLXsibW92ZXBsIiwJb25lKDAwMDA1MTApLAlvbmUoMDE3MDc3MCksICJkc0RkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXBsIiwJb25lKDAwMDA3MTApLAlvbmUoMDE3MDc3MCksICJEZGRzIiwgbTY4MDAwdXAgfSwKLQoteyJtb3ZlcSIsCW9uZSgwMDcwMDAwKSwJb25lKDAxNzA0MDApLCAiTXNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im1vdmVxIiwJb25lKDAwNzAwMDApLAlvbmUoMDE3MDQwMCksICIjQkRkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQotLyogVGhlIG1vdmUgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgbW92ZWEgYW5kIG1vdmVxIGluc3RydWN0aW9ucy4gICovCi17Im1vdmViIiwJb25lKDAwMTAwMDApLAlvbmUoMDE3MDAwMCksICI7YiRkIiwgbTY4MDAwdXAgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2YgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm9ibWQiLCBtY2YgfSwKLQoteyJtb3ZldyIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAiKnclZCIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJtcyVkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJuc3BkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJvd21kIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDAzMDApLAlvbmUoMDE3NzcwMCksICJTcyRzIiwgbTY4MDAwdXAgfSwKLXsibW92ZXciLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzcwKSwgIlNzRHMiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzAwKSwgIkNzJHMiLCBtNjgwMTB1cCB9LAoteyJtb3ZldyIsCW9uZSgwMDQxMzAwKSwJb25lKDAxNzc3NzApLCAiQ3NEcyIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiO3dDZCIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICJEc0NkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDIzNzQpLAlvbmUoMDE3Nzc3NyksICIjd0NkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDMzMDApLAlvbmUoMDE3NzcwMCksICI7d1NkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXciLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzU2QiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U2QiLCBtY2YgfSwKLQoteyJtb3ZlbCIsCW9uZSgwMDcwMDAwKSwJb25lKDAxNzA0MDApLCAiTXNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im1vdmVsIiwJb25lKDAwMjAwMDApLAlvbmUoMDE3MDAwMCksICIqbCVkIiwgbTY4MDAwdXAgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm9sbWQiLCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDA0NzE0MCksCW9uZSgwMTc3NzcwKSwgIkFzVWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbCIsCW9uZSgwMDQ3MTUwKSwJb25lKDAxNzc3NzApLCAiVWRBcyIsIG02ODAwMHVwIH0sCi17Im1vdmVsIiwJb25lKDAxMjA2MDApLAlvbmUoMDE3Nzc2MCksICJFc1JzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjA0MDApLAlvbmUoMDE3Nzc2MCksICJSc0VzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjA0NzQpLAlvbmUoMDE3Nzc3NyksICIjbEVzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ2MDApLAlvbmUoMDE3Nzc2MCksICJHc1JzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ0MDApLAlvbmUoMDE3Nzc2MCksICJSc0dzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ0NzQpLAlvbmUoMDE3Nzc3NyksICIjbEdzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjY2MDApLAlvbmUoMDE3Nzc2MCksICJIc1JzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjY0MDApLAlvbmUoMDE3Nzc2MCksICJSc0hzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjY0NzQpLAlvbmUoMDE3Nzc3NyksICIjbEhzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ3MDApLAlvbmUoMDE3Nzc3NyksICJHc0NzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAiKnclZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJvd21kIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzAwKSwgIlNzJHMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDAzMDApLAlvbmUoMDE3Nzc3MCksICJTc0RzIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzAwKSwgIkNzJHMiLCBtNjgwMTB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDEzMDApLAlvbmUoMDE3Nzc3MCksICJDc0RzIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MjMwMCksCW9uZSgwMTc3NzAwKSwgIjt3Q2QiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICJEc0NkIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MjM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3Q2QiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiO3dTZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzU2QiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQzMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dTZCIsIG1jZiB9LAotCi17Im1vdmUiLAlvbmUoMDA0NzE0MCksCW9uZSgwMTc3NzcwKSwgIkFzVWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDcxNTApLAlvbmUoMDE3Nzc3MCksICJVZEFzIiwgbTY4MDAwdXAgfSwKLQoteyJtb3Zlc2IiLAl0d28oMDAwNzAwMCwgMCksICAgICB0d28oMDE3NzcwMCwgMDc3NzcpLCAifnNSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVzYiIsCXR3bygwMDA3MDAwLCAwNDAwMCksIHR3bygwMTc3NzAwLCAwNzc3NyksICJSMX5zIiwgbTY4MDEwdXAgfSwKLXsibW92ZXN3IiwJdHdvKDAwMDcxMDAsIDApLCAgICAgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIn5zUjEiLCBtNjgwMTB1cCB9LAoteyJtb3Zlc3ciLAl0d28oMDAwNzEwMCwgMDQwMDApLCB0d28oMDE3NzcwMCwgMDc3NzcpLCAiUjF+cyIsIG02ODAxMHVwIH0sCi17Im1vdmVzbCIsCXR3bygwMDA3MjAwLCAwKSwgICAgIHR3bygwMTc3NzAwLCAwNzc3NyksICJ+c1IxIiwgbTY4MDEwdXAgfSwKLXsibW92ZXNsIiwJdHdvKDAwMDcyMDAsIDA0MDAwKSwgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIlIxfnMiLCBtNjgwMTB1cCB9LAotCi17Im1vdmUxNiIsCXR3bygweGY2MjAsIDB4ODAwMCksIHR3bygweGZmZjgsIDB4OGZmZiksICIrcysxIiwgbTY4MDQwdXAgfSwKLXsibW92ZTE2IiwJb25lKDB4ZjYwMCksCQlvbmUoMHhmZmY4KSwgIitzX0wiLCBtNjgwNDB1cCB9LAoteyJtb3ZlMTYiLAlvbmUoMHhmNjA4KSwJCW9uZSgweGZmZjgpLCAiX0wrcyIsIG02ODA0MHVwIH0sCi17Im1vdmUxNiIsCW9uZSgweGY2MTApLAkJb25lKDB4ZmZmOCksICJhc19MIiwgbTY4MDQwdXAgfSwKLXsibW92ZTE2IiwJb25lKDB4ZjYxOCksCQlvbmUoMHhmZmY4KSwgIl9MYXMiLCBtNjgwNDB1cCB9LAotCi0gIC8qIEZJWE1FOiBhZGQgTUFNIG1vZGUgKGAmJyBhZnRlciA8ZWE+IG9wZXJhbmQpIC8gcmVtb3ZlIE1TQUNNICovCi17Im1zYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAwNDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDAwMCwgMDAwMTQwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgInVNdW1NaCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDIyMCwgMDAwMDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9hc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAwNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyNDAsIDAwMDA0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDI1MCwgMDAwMDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9kc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjIwLCAwMDAxNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDIzMCwgMDAwMTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyNDAsIDAwMDE0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjUwLCAwMDAxNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDIyMCwgMDAwMDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9hc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjMwLCAwMDAwNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyNDAsIDAwMDA0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDI1MCwgMDAwMDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9kc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjIwLCAwMDAxNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDIzMCwgMDAwMTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyNDAsIDAwMDE0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjUwLCAwMDAxNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17Im1zYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA0NDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDAwMCwgMDAwNTQwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgIlJzUm1NaCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDIyMCwgMDAwNDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA0NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyNDAsIDAwMDQ0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDI1MCwgMDAwNDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjIwLCAwMDA1NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDIzMCwgMDAwNTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyNDAsIDAwMDU0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjUwLCAwMDA1NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDIyMCwgMDAwNDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjMwLCAwMDA0NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyNDAsIDAwMDQ0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDI1MCwgMDAwNDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjIwLCAwMDA1NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDIzMCwgMDAwNTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyNDAsIDAwMDU0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjUwLCAwMDA1NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17Im11bHN3IiwJb25lKDAxNDA3MDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwfG1jZiB9LAoteyJtdWxzbCIsCXR3bygwMDQ2MDAwLDAwNDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17Im11bHNsIiwJdHdvKDAwNDYwMDAsMDA0MDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICJxc0QxIiwgbWNmIH0sCi17Im11bHNsIiwJdHdvKDAwNDYwMDAsMDA2MDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICI7bEQzRDEiLG02ODAyMHVwfGNwdTMyIH0sCi0KLXsibXVsdXciLAlvbmUoMDE0MDMwMCksCQlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXB8bWNmIH0sCi17Im11bHVsIiwJdHdvKDAwNDYwMDAsMDAwMDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICI7bEQxIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsibXVsdWwiLAl0d28oMDA0NjAwMCwwMDAwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgInFzRDEiLCBtY2YgfSwKLXsibXVsdWwiLAl0d28oMDA0NjAwMCwwMDIwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJuYmNkIiwJb25lKDAwNDQwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi0KLXsibmVnYiIsCW9uZSgwMDQyMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd3IiwJb25lKDAwNDIxMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ2wiLAlvbmUoMDA0MjIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibmVnbCIsCW9uZSgwMDQyMjAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Z9LAotCi17Im5lZ3hiIiwJb25lKDAwNDAwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3h3IiwJb25lKDAwNDAxMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3hsIiwJb25lKDAwNDAyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3hsIiwJb25lKDAwNDAyMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZn0sCi0KLXsibm9wIiwJCW9uZSgwMDQ3MTYxKSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDAwdXAgfCBtY2Z9LAotCi17Im5vdGIiLAlvbmUoMDA0MzAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibm90dyIsCW9uZSgwMDQzMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJub3RsIiwJb25lKDAwNDMyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5vdGwiLAlvbmUoMDA0MzIwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmfSwKLQoteyJvcmliIiwJb25lKDAwMDAwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsib3JpYiIsCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17Im9yaXciLAlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvcml3IiwJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsib3JpbCIsCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17Im9yaWwiLAlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsib3JpIiwJCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17Im9yaSIsCQlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvcmkiLAkJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLQotLyogVGhlIG9yIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIG9yaSBpbnN0cnVjdGlvbi4gICovCi17Im9yYiIsCQlvbmUoMDAwMDAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJvcmIiLAkJb25lKDAwMDAwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsib3JiIiwJCW9uZSgwMTAwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17Im9yYiIsCQlvbmUoMDEwMDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAoteyJvcnciLAkJb25lKDAwMDAxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsib3J3IiwJCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17Im9ydyIsCQlvbmUoMDEwMDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJvcnciLAkJb25lKDAxMDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLXsib3JsIiwJCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17Im9ybCIsCQlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsib3JsIiwJCW9uZSgwMTAwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im9ybCIsCQlvbmUoMDEwMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJvciIsCQlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDAwMDE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDEwMDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDEwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAotCi17InBhY2siLAlvbmUoMDEwMDUwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQjdyIsIG02ODAyMHVwIH0sCi17InBhY2siLAlvbmUoMDEwMDUxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQjdyIsIG02ODAyMHVwIH0sCi0KLXsicGJhYyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmFjdyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmFzIiwJb25lKDB4ZjA4NiksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiYXN3IiwJb25lKDB4ZjA4NiksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiYmMiLAlvbmUoMHhmMDgxKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJiY3ciLAlvbmUoMHhmMDgxKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJicyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmJzdyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmNjIiwJb25lKDB4ZjA4ZiksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiY2N3IiwJb25lKDB4ZjA4ZiksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiY3MiLAlvbmUoMHhmMDhlKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJjc3ciLAlvbmUoMHhmMDhlKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJnYyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmdjdyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmdzIiwJb25lKDB4ZjA4YyksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiZ3N3IiwJb25lKDB4ZjA4YyksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiaWMiLAlvbmUoMHhmMDhiKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJpY3ciLAlvbmUoMHhmMDhiKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJpcyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmlzdyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmxjIiwJb25lKDB4ZjA4MyksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBibGN3IiwJb25lKDB4ZjA4MyksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBibHMiLAlvbmUoMHhmMDgyKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJsc3ciLAlvbmUoMHhmMDgyKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJzYyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYnNjdyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYnNzIiwJb25lKDB4ZjA4NCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBic3N3IiwJb25lKDB4ZjA4NCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBid2MiLAlvbmUoMHhmMDg5KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJ3Y3ciLAlvbmUoMHhmMDg5KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJ3cyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYndzdyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAotCi17InBkYmFjIiwJdHdvKDB4ZjA0OCwgMHgwMDA3KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiYXMiLAl0d28oMHhmMDQ4LCAweDAwMDYpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJiYyIsCXR3bygweGYwNDgsIDB4MDAwMSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmJzIiwJdHdvKDB4ZjA0OCwgMHgwMDAwKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiY2MiLAl0d28oMHhmMDQ4LCAweDAwMGYpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJjcyIsCXR3bygweGYwNDgsIDB4MDAwZSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmdjIiwJdHdvKDB4ZjA0OCwgMHgwMDBkKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiZ3MiLAl0d28oMHhmMDQ4LCAweDAwMGMpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJpYyIsCXR3bygweGYwNDgsIDB4MDAwYiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmlzIiwJdHdvKDB4ZjA0OCwgMHgwMDBhKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRibGMiLAl0d28oMHhmMDQ4LCAweDAwMDMpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJscyIsCXR3bygweGYwNDgsIDB4MDAwMiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYnNjIiwJdHdvKDB4ZjA0OCwgMHgwMDA1KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRic3MiLAl0d28oMHhmMDQ4LCAweDAwMDQpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJ3YyIsCXR3bygweGYwNDgsIDB4MDAwOSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYndzIiwJdHdvKDB4ZjA0OCwgMHgwMDA4KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLQoteyJwZWEiLAkJb25lKDAwNDQxMDApLAkJb25lKDAxNzc3MDApLCAiIXMiLCBtNjgwMDB1cHxtY2YgfSwKLQoteyJwZmx1c2hhIiwJb25lKDB4ZjUxOCksCQlvbmUoMHhmZmY4KSwgIiIsIG02ODA0MHVwIH0sCi17InBmbHVzaGEiLAl0d28oMHhmMDAwLDB4MjQwMCksIHR3bygweGZmZmYsMHhmZmZmKSwgIiIsIG02ODAzMCB8IG02ODg1MSB9LAotCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDMwMTApLCB0d28oMHhmZmMwLDB4ZmUxMCksICJUM1Q5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzODEwKSwgdHdvKDB4ZmZjMCwweGZlMTApLCAiVDNUOSZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzMDA4KSwgdHdvKDB4ZmZjMCwweGZlMTgpLCAiRDNUOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzgwOCksIHR3bygweGZmYzAsMHhmZTE4KSwgIkQzVDkmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzAwMCksIHR3bygweGZmYzAsMHhmZTFlKSwgImYzVDkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDM4MDApLCB0d28oMHhmZmMwLDB4ZmUxZSksICJmM1Q5JnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCi17InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJBcyIsIG02ODA0MHVwIH0sCi0KLXsicGZsdXNoYW4iLAlvbmUoMHhmNTEwKSwJCW9uZSgweGZmZjgpLCAiIiwgbTY4MDQwdXAgfSwKLXsicGZsdXNobiIsCW9uZSgweGY1MDApLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCi17InBmbHVzaG4iLAlvbmUoMHhmNTAwKSwJCW9uZSgweGZmZjgpLCAiQXMiLCBtNjgwNDB1cCB9LAotCi17InBmbHVzaHIiLAl0d28oMHhmMDAwLCAweGEwMDApLCB0d28oMHhmZmMwLCAweGZmZmYpLCAifHMiLCBtNjg4NTEgfSwKLQoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDEwKSwgdHdvKDB4ZmZmOCwgMHhmZTEwKSwgIlQzVDkiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MxMCksIHR3bygweGZmZjgsIDB4ZmUxMCksICJUM1Q5JnMiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwOCksIHR3bygweGZmZjgsIDB4ZmUxOCksICJEM1Q5IiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDgpLCB0d28oMHhmZmY4LCAweGZlMTgpLCAiRDNUOSZzIiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MDApLCB0d28oMHhmZmY4LCAweGZlMWUpLCAiZjNUOSIsIG02ODg1MSB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwgdHdvKDB4ZmZmOCwgMHhmZTFlKSwgImYzVDkmcyIsIG02ODg1MSB9LAotCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi0KLXsicGxwYXIiLAlvbmUoMHhmNWM4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKLXsicGxwYXciLAlvbmUoMHhmNTg4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKLQoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqbDA4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDVjMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqdzE4IiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIipiMjgiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MjAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMDglcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg1ZTAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMTglcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQyMDApLCB0d28oMHhmZmMwLDB4ZTNmZiksICIyOCVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDIwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIlc4fnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NjIwMCksIHR3bygweGZmYzAsMHhlM2UzKSwgIip3WDMiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg2MDAwKSwgdHdvKDB4ZmZjMCwweGUzZTMpLCAiWDMlcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqd1k4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYyMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJZOCVzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDY2MDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJaOCVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4MDgwMCksIHR3bygweGZmYzAsMHhmYmZmKSwgIipsMzgiLCBtNjgwMzAgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHgwYTAwKSwgdHdvKDB4ZmZjMCwweGZiZmYpLCAiMzglcyIsIG02ODAzMCB9LAotCi17InBtb3ZlZmQiLAl0d28oMHhmMDAwLCAweDQxMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLCAiKmwwOCIsIG02ODAzMCB9LAoteyJwbW92ZWZkIiwJdHdvKDB4ZjAwMCwgMHg0MTAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzAgfSwKLXsicG1vdmVmZCIsCXR3bygweGYwMDAsIDB4MDkwMCksCXR3bygweGZmYzAsIDB4ZmJmZiksICIqbDM4IiwgbTY4MDMwIH0sCi0KLXsicHJlc3RvcmUiLAlvbmUoMHhmMTQwKSwJCW9uZSgweGZmYzApLCAiPHMiLCBtNjg4NTEgfSwKLQoteyJwc2F2ZSIsCW9uZSgweGYxMDApLAkJb25lKDB4ZmZjMCksICI+cyIsIG02ODg1MSB9LAotCi17InBzYWMiLAl0d28oMHhmMDQwLCAweDAwMDcpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNhcyIsCXR3bygweGYwNDAsIDB4MDAwNiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2JjIiwJdHdvKDB4ZjA0MCwgMHgwMDAxKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzYnMiLAl0d28oMHhmMDQwLCAweDAwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNjYyIsCXR3bygweGYwNDAsIDB4MDAwZiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2NzIiwJdHdvKDB4ZjA0MCwgMHgwMDBlKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzZ2MiLAl0d28oMHhmMDQwLCAweDAwMGQpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNncyIsCXR3bygweGYwNDAsIDB4MDAwYyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2ljIiwJdHdvKDB4ZjA0MCwgMHgwMDBiKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzaXMiLAl0d28oMHhmMDQwLCAweDAwMGEpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNsYyIsCXR3bygweGYwNDAsIDB4MDAwMyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2xzIiwJdHdvKDB4ZjA0MCwgMHgwMDAyKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzc2MiLAl0d28oMHhmMDQwLCAweDAwMDUpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNzcyIsCXR3bygweGYwNDAsIDB4MDAwNCksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc3djIiwJdHdvKDB4ZjA0MCwgMHgwMDA5KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzd3MiLAl0d28oMHhmMDQwLCAweDAwMDgpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLQoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIxMCksIHR3bygweGZmYzAsIDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MzEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MjA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODMwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgzMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwJb25lKDB4ZjU2OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCi0KLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgwMTApLCB0d28oMHhmZmMwLDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MTEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MDA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODEwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODAwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgxMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwJb25lKDB4ZjU0OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCi0KLXsicHRyYXBhY3ciLAl0d28oMHhmMDdhLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBhY2wiLAl0d28oMHhmMDdiLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBhYyIsCXR3bygweGYwN2MsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwYXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwYXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwYXMiLAl0d28oMHhmMDdjLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGJjdyIsCXR3bygweGYwN2EsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGJjbCIsCXR3bygweGYwN2IsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGJjIiwJdHdvKDB4ZjA3YywgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBic3ciLAl0d28oMHhmMDdhLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBic2wiLAl0d28oMHhmMDdiLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBicyIsCXR3bygweGYwN2MsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwY2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwY2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwY2MiLAl0d28oMHhmMDdjLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGNzdyIsCXR3bygweGYwN2EsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGNzbCIsCXR3bygweGYwN2IsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGNzIiwJdHdvKDB4ZjA3YywgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBnY3ciLAl0d28oMHhmMDdhLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBnY2wiLAl0d28oMHhmMDdiLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBnYyIsCXR3bygweGYwN2MsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwZ3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwZ3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwZ3MiLAl0d28oMHhmMDdjLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGljdyIsCXR3bygweGYwN2EsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGljbCIsCXR3bygweGYwN2IsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGljIiwJdHdvKDB4ZjA3YywgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBpc3ciLAl0d28oMHhmMDdhLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBpc2wiLAl0d28oMHhmMDdiLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBpcyIsCXR3bygweGYwN2MsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwbGN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwbGNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwbGMiLAl0d28oMHhmMDdjLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGxzdyIsCXR3bygweGYwN2EsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGxzbCIsCXR3bygweGYwN2IsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGxzIiwJdHdvKDB4ZjA3YywgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBzY3ciLAl0d28oMHhmMDdhLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBzY2wiLAl0d28oMHhmMDdiLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBzYyIsCXR3bygweGYwN2MsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwc3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwc3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwc3MiLAl0d28oMHhmMDdjLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcHdjdyIsCXR3bygweGYwN2EsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcHdjbCIsCXR3bygweGYwN2IsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcHdjIiwJdHdvKDB4ZjA3YywgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXB3c3ciLAl0d28oMHhmMDdhLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXB3c2wiLAl0d28oMHhmMDdiLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXB3cyIsCXR3bygweGYwN2MsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB1bHNlIiwJb25lKDAwNDUzMTQpLAkJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDYwIHwgbWNmIH0sCi0KLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyODAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIlZzJnMiLCBtNjg4NTEgfSwKLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyYzAwKSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwgIkEzJnMiLCBtNjg4NTEgfSwKLQotICAvKiBGSVhNRTogZG9uJ3QgYWxsb3cgRHc9PUR4LiAqLwoteyJyZW1zbCIsICAgICAgIHR3bygweDRjNDAsIDB4MDgwMCksICAgIHR3bygweGZmYzAsIDB4OGZmOCksICJ2c0QzRDEiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsicmVtdWwiLCAgICAgICB0d28oMHg0YzQwLCAweDAwMDApLCAgICB0d28oMHhmZmMwLCAweDhmZjgpLCAidnNEM0QxIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsicmVzZXQiLAlvbmUoMDA0NzE2MCksCQlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMDB1cCB9LAotCi17InJvbGIiLAlvbmUoMDE2MDQzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sYiIsCW9uZSgwMTYwNDcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb2x3IiwJb25lKDAxNjA1MzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvbHciLAlvbmUoMDE2MDU3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sdyIsCW9uZSgwMTYzNzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb2xsIiwJb25lKDAxNjA2MzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvbGwiLAlvbmUoMDE2MDY3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLQoteyJyb3JiIiwJb25lKDAxNjAwMzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvcmIiLAlvbmUoMDE2MDA3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm9ydyIsCW9uZSgwMTYwMTMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3J3IiwJb25lKDAxNjAxNzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJvcnciLAlvbmUoMDE2MzMwMCksCQlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsicm9ybCIsCW9uZSgwMTYwMjMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3JsIiwJb25lKDAxNjAyNzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi0KLXsicm94bGIiLAlvbmUoMDE2MDQyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bGIiLAlvbmUoMDE2MDQ2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bHciLAlvbmUoMDE2MDUyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bHciLAlvbmUoMDE2MDU2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bHciLAlvbmUoMDE2MjcwMCksCQlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsicm94bGwiLAlvbmUoMDE2MDYyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bGwiLAlvbmUoMDE2MDY2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLQoteyJyb3hyYiIsCW9uZSgwMTYwMDIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hyYiIsCW9uZSgwMTYwMDYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hydyIsCW9uZSgwMTYwMTIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hydyIsCW9uZSgwMTYwMTYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hydyIsCW9uZSgwMTYyMzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb3hybCIsCW9uZSgwMTYwMjIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hybCIsCW9uZSgwMTYwMjYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAotCi17InJ0ZCIsCQlvbmUoMDA0NzE2NCksCQlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAxMHVwIH0sCi0KLXsicnRlIiwJCW9uZSgwMDQ3MTYzKSwJCW9uZSgwMTc3Nzc3KSwgIiIsICAgbTY4MDAwdXB8bWNmIH0sCi0KLXsicnRtIiwJCW9uZSgwMDAzMzAwKSwJCW9uZSgwMTc3NzYwKSwgIlJzIiwgbTY4MDIwIH0sCi0KLXsicnRyIiwJCW9uZSgwMDQ3MTY3KSwJCW9uZSgwMTc3Nzc3KSwgIiIsICAgbTY4MDAwdXAgfSwKLQoteyJydHMiLAkJb25lKDAwNDcxNjUpLAkJb25lKDAxNzc3NzcpLCAiIiwgICBtNjgwMDB1cHxtY2YgfSwKLQoteyJzYmNkIiwJb25lKDAxMDA0MDApLAkJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17InNiY2QiLAlvbmUoMDEwMDQxMCksCQlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLQotCi17InNjYyIsCQlvbmUoMDA1MjMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2NjIiwJCW9uZSgwMDUyMzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2NzIiwJCW9uZSgwMDUyNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzY3MiLAkJb25lKDAwNTI3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzZXEiLAkJb25lKDAwNTM3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNlcSIsCQlvbmUoMDA1MzcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNmIiwJCW9uZSgwMDUwNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZiIsCQlvbmUoMDA1MDcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNnZSIsCQlvbmUoMDA1NjMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2dlIiwJCW9uZSgwMDU2MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2d0IiwJCW9uZSgwMDU3MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZ3QiLAkJb25lKDAwNTczMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzaGkiLAkJb25lKDAwNTEzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNoaSIsCQlvbmUoMDA1MTMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNsZSIsCQlvbmUoMDA1NzcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2xlIiwJCW9uZSgwMDU3NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2xzIiwJCW9uZSgwMDUxNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbHMiLAkJb25lKDAwNTE3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzbHQiLAkJb25lKDAwNTY3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNsdCIsCQlvbmUoMDA1NjcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNtaSIsCQlvbmUoMDA1NTcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic21pIiwJCW9uZSgwMDU1NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic25lIiwJCW9uZSgwMDUzMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbmUiLAkJb25lKDAwNTMzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzcGwiLAkJb25lKDAwNTUzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNwbCIsCQlvbmUoMDA1NTMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InN0IiwJCW9uZSgwMDUwMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzdCIsCQlvbmUoMDA1MDMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InN2YyIsCQlvbmUoMDA1NDMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic3ZjIiwJCW9uZSgwMDU0MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic3ZzIiwJCW9uZSgwMDU0NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzdnMiLAkJb25lKDAwNTQ3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAotCi17InN0b3AiLAlvbmUoMDA0NzE2MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJzdWJhbCIsCW9uZSgwMTEwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YmF3IiwJb25lKDAxMTAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLQoteyJzdWJpYiIsCW9uZSgwMDAyMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17InN1Yml3IiwJb25lKDAwMDIxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsic3ViaWwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJpbCIsCW9uZSgwMDAyMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAotCi17InN1YnFiIiwJb25lKDAwNTA0MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfSwKLXsic3VicXciLAlvbmUoMDA1MDUwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJxbCIsCW9uZSgwMDUwNjAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLS8qIFRoZSBzdWIgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgc3ViYSwgc3ViaSwgYW5kIHN1YnEgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsic3ViYiIsCW9uZSgwMDUwNDAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCi17InN1YmIiLAlvbmUoMDAwMjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJiIiwJb25lKDAxMTAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsic3ViYiIsCW9uZSgwMTEwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDA1MDUwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAwMDIxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsic3VidyIsCW9uZSgwMTEwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDExMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3RGQiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAxMTA1MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLXsic3VibCIsCW9uZSgwMDUwNjAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YmwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17InN1YmwiLAlvbmUoMDExMDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJzdWJsIiwJb25lKDAxMTAyMDApLAlvbmUoMDE3MDcwMCksICIqbERkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsic3VibCIsCW9uZSgwMTEwNjAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsic3VieGIiLAlvbmUoMDExMDQwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJzdWJ4YiIsCW9uZSgwMTEwNDEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi17InN1Ynh3IiwJb25lKDAxMTA1MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsic3VieHciLAlvbmUoMDExMDUxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoteyJzdWJ4bCIsCW9uZSgwMTEwNjAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YnhsIiwJb25lKDAxMTA2MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLQoteyJzd2FwIiwJb25lKDAwNDQxMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLS8qIHN3YmVnIGFuZCBzd2JlZ2wgYXJlIG1hZ2ljIGNvbnN0YW50cyB1c2VkIG9uIHN5c1Y2OC4gIFRoZSBjb21waWxlcgotICAgZ2VuZXJhdGVzIHRoZW0gYmVmb3JlIGEgc3dpdGNoIHRhYmxlLiAgVGhleSB0ZWxsIHRoZSBkZWJ1Z2dlciBhbmQKLSAgIGRpc2Fzc2VtYmxlciB0aGF0IGEgc3dpdGNoIHRhYmxlIGZvbGxvd3MuICBUaGUgcGFyYW1ldGVyIGlzIHRoZQotICAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZS4gIHN3YmVnIG1lYW5zIHRoYXQgdGhlIGVudHJpZXMgaW4KLSAgIHRoZSB0YWJsZSBhcmUgd29yZCAoMiBieXRlKSBzaXplZCwgYW5kIHN3YmVnbCBtZWFucyB0aGF0IHRoZQotICAgZW50cmllcyBpbiB0aGUgdGFibGUgYXJlIGxvbmd3b3JkICg0IGJ5dGUpIHNpemVkLiAgKi8KLXsic3diZWciLAlvbmUoMDA0NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgICBtNjgwMDB1cCB8IG1jZiB9LAoteyJzd2JlZ2wiLAlvbmUoMDA0NTM3NSksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgICBtNjgwMDB1cCB8IG1jZiB9LAotCi17InRhcyIsCQlvbmUoMDA0NTMwMCksCQlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi0KLSNkZWZpbmUgVEJMMShuYW1lLHNpZ25lZCxyb3VuZCxzaXplKQkJCQkJXAotICB7bmFtZSwgdHdvKDAxNzQwMDAsIChzaWduZWQ8PDExKXwoIXJvdW5kPDwxMCl8KHNpemU8PDYpfDAwMDA0MDApLAlcCi0gICAgIHR3bygwMTc3NzAwLDAxMDc3NzcpLCAiIXNEMSIsIGNwdTMyIH0sCQkJCVwKLSAge25hbWUsIHR3bygwMTc0MDAwLCAoc2lnbmVkPDwxMSl8KCFyb3VuZDw8MTApfChzaXplPDw2KSksCQlcCi0gICAgIHR3bygwMTc3NzcwLDAxMDc3NzApLCAiRHNEM0QxIiwgY3B1MzIgfQotI2RlZmluZSBUQkwobmFtZTEsIG5hbWUyLCBuYW1lMywgcywgcikgXAotICBUQkwxKG5hbWUxLCBzLCByLCAwKSwgVEJMMShuYW1lMiwgcywgciwgMSksIFRCTDEobmFtZTMsIHMsIHIsIDIpCi1UQkwoInRibHNiIiwgInRibHN3IiwgInRibHNsIiwgMSwgMSksCi1UQkwoInRibHNuYiIsICJ0YmxzbnciLCAidGJsc25sIiwgMSwgMCksCi1UQkwoInRibHViIiwgInRibHV3IiwgInRibHVsIiwgMCwgMSksCi1UQkwoInRibHVuYiIsICJ0Ymx1bnciLCAidGJsdW5sIiwgMCwgMCksCi0KLXsidHJhcCIsCW9uZSgwMDQ3MTAwKSwJb25lKDAxNzc3NjApLCAiVHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17InRyYXBjYyIsCW9uZSgwMDUyMzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwY3MiLAlvbmUoMDA1Mjc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGVxIiwJb25lKDAwNTM3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBmIiwJb25lKDAwNTA3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIHwgbWNmIH0sCi17InRyYXBnZSIsCW9uZSgwMDU2Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwZ3QiLAlvbmUoMDA1NzM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGhpIiwJb25lKDAwNTEzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBsZSIsCW9uZSgwMDU3Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbHMiLAlvbmUoMDA1MTc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGx0IiwJb25lKDAwNTY3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBtaSIsCW9uZSgwMDU1Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbmUiLAlvbmUoMDA1MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcHBsIiwJb25lKDAwNTUzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXB0IiwJb25lKDAwNTAzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXB2YyIsCW9uZSgwMDU0Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwdnMiLAlvbmUoMDA1NDc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLQoteyJ0cmFwY2N3IiwJb25lKDAwNTIzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBjc3ciLAlvbmUoMDA1Mjc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGVxdyIsCW9uZSgwMDUzNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZnciLAlvbmUoMDA1MDc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzJ8bWNmfSwKLXsidHJhcGdldyIsCW9uZSgwMDU2MzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZ3R3IiwJb25lKDAwNTczNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBoaXciLAlvbmUoMDA1MTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGxldyIsCW9uZSgwMDU3NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbHN3IiwJb25lKDAwNTE3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsdHciLAlvbmUoMDA1Njc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcG1pdyIsCW9uZSgwMDU1NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbmV3IiwJb25lKDAwNTMzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBwbHciLAlvbmUoMDA1NTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHR3IiwJb25lKDAwNTAzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB2Y3ciLAlvbmUoMDA1NDM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZzdyIsCW9uZSgwMDU0NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAotCi17InRyYXBjY2wiLAlvbmUoMDA1MjM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGNzbCIsCW9uZSgwMDUyNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZXFsIiwJb25lKDAwNTM3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBmbCIsCW9uZSgwMDUwNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMnxtY2Z9LAoteyJ0cmFwZ2VsIiwJb25lKDAwNTYzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBndGwiLAlvbmUoMDA1NzM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGhpbCIsCW9uZSgwMDUxMzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbGVsIiwJb25lKDAwNTc3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsc2wiLAlvbmUoMDA1MTc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGx0bCIsCW9uZSgwMDU2NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbWlsIiwJb25lKDAwNTU3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBuZWwiLAlvbmUoMDA1MzM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHBsbCIsCW9uZSgwMDU1MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdGwiLAlvbmUoMDA1MDM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZjbCIsCW9uZSgwMDU0MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdnNsIiwJb25lKDAwNTQ3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsidHJhcHYiLAlvbmUoMDA0NzE2NiksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAwMHVwIH0sCi0KLXsidHN0YiIsCW9uZSgwMDQ1MDAwKSwJb25lKDAxNzc3MDApLCAiO2IiLCBtNjgwMjB1cHxjcHUzMnxtY2YgfSwKLXsidHN0YiIsCW9uZSgwMDQ1MDAwKSwJb25lKDAxNzc3MDApLCAiJGIiLCBtNjgwMDB1cCB9LAoteyJ0c3R3IiwJb25lKDAwNDUxMDApLAlvbmUoMDE3NzcwMCksICIqdyIsIG02ODAyMHVwfGNwdTMyfG1jZiB9LAoteyJ0c3R3IiwJb25lKDAwNDUxMDApLAlvbmUoMDE3NzcwMCksICIkdyIsIG02ODAwMHVwIH0sCi17InRzdGwiLAlvbmUoMDA0NTIwMCksCW9uZSgwMTc3NzAwKSwgIipsIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmIH0sCi17InRzdGwiLAlvbmUoMDA0NTIwMCksCW9uZSgwMTc3NzAwKSwgIiRsIiwgbTY4MDAwdXAgfSwKLQoteyJ1bmxrIiwJb25lKDAwNDcxMzApLAlvbmUoMDE3Nzc3MCksICJBcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsidW5wayIsCW9uZSgwMTAwNjAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCN3IiwgbTY4MDIwdXAgfSwKLXsidW5wayIsCW9uZSgwMTAwNjEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCN3IiwgbTY4MDIwdXAgfSwKLQoteyJ3ZGRhdGFiIiwJb25lKDAxNzIwMDApLCAgIG9uZSgwMTc3NzAwKSwgIn5zIiwgbWNmIH0sCi17IndkZGF0YXciLAlvbmUoMDE3MjEwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2YgfSwKLXsid2RkYXRhbCIsCW9uZSgwMTcyMjAwKSwgICBvbmUoMDE3NzcwMCksICJ+cyIsIG1jZiB9LAotCi19OwotCi1jb25zdCBpbnQgbTY4a19udW1vcGNvZGVzID0gc2l6ZW9mIG02OGtfb3Bjb2RlcyAvIHNpemVvZiBtNjhrX29wY29kZXNbMF07Ci0KLS8qIFRoZXNlIGFsaWFzZXMgdXNlZCB0byBiZSBpbiB0aGUgYWJvdmUgdGFibGUsIGVhY2ggb25lIGR1cGxpY2F0aW5nCi0gICBhbGwgb2YgdGhlIGVudHJpZXMgZm9yIGl0cyBwcmltYXJ5IGV4YWN0bHkuICBUaGlzIHRhYmxlIHdhcwotICAgY29uc3RydWN0ZWQgYnkgbWVjaGFuaWNhbCBwcm9jZXNzaW5nIG9mIHRoZSBvcGNvZGUgdGFibGUsIHdpdGggYQotICAgc21hbGwgbnVtYmVyIG9mIHR3ZWFrcyBkb25lIGJ5IGhhbmQuICBUaGVyZSBhcmUgcHJvYmFibHkgYSBsb3QgbW9yZQotICAgYWxpYXNlcyBhYm92ZSB0aGF0IGNvdWxkIGJlIG1vdmVkIGRvd24gaGVyZSwgZXhjZXB0IGZvciB2ZXJ5IG1pbm9yCi0gICBkaWZmZXJlbmNlcy4gICovCi0KLWNvbnN0IHN0cnVjdCBtNjhrX29wY29kZV9hbGlhcyBtNjhrX29wY29kZV9hbGlhc2VzW10gPQotewotICB7ICJhZGQiLAkiYWRkdyIsIH0sCi0gIHsgImFkZGEiLAkiYWRkYXciLCB9LAotICB7ICJhZGRpIiwJImFkZGl3IiwgfSwKLSAgeyAiYWRkcSIsCSJhZGRxdyIsIH0sCi0gIHsgImFkZHgiLAkiYWRkeHciLCB9LAotICB7ICJhc2wiLAkiYXNsdyIsIH0sCi0gIHsgImFzciIsCSJhc3J3IiwgfSwKLSAgeyAiYmhpIiwJImJoaXciLCB9LAotICB7ICJibHMiLAkiYmxzdyIsIH0sCi0gIHsgImJjYyIsCSJiY2N3IiwgfSwKLSAgeyAiYmNzIiwJImJjc3ciLCB9LAotICB7ICJibmUiLAkiYm5ldyIsIH0sCi0gIHsgImJlcSIsCSJiZXF3IiwgfSwKLSAgeyAiYnZjIiwJImJ2Y3ciLCB9LAotICB7ICJidnMiLAkiYnZzdyIsIH0sCi0gIHsgImJwbCIsCSJicGx3IiwgfSwKLSAgeyAiYm1pIiwJImJtaXciLCB9LAotICB7ICJiZ2UiLAkiYmdldyIsIH0sCi0gIHsgImJsdCIsCSJibHR3IiwgfSwKLSAgeyAiYmd0IiwJImJndHciLCB9LAotICB7ICJibGUiLAkiYmxldyIsIH0sCi0gIHsgImJyYSIsCSJicmF3IiwgfSwKLSAgeyAiYnNyIiwJImJzcnciLCB9LAotICB7ICJiaGliIiwJImJoaXMiLCB9LAotICB7ICJibHNiIiwJImJsc3MiLCB9LAotICB7ICJiY2NiIiwJImJjY3MiLCB9LAotICB7ICJiY3NiIiwJImJjc3MiLCB9LAotICB7ICJibmViIiwJImJuZXMiLCB9LAotICB7ICJiZXFiIiwJImJlcXMiLCB9LAotICB7ICJidmNiIiwJImJ2Y3MiLCB9LAotICB7ICJidnNiIiwJImJ2c3MiLCB9LAotICB7ICJicGxiIiwJImJwbHMiLCB9LAotICB7ICJibWliIiwJImJtaXMiLCB9LAotICB7ICJiZ2ViIiwJImJnZXMiLCB9LAotICB7ICJibHRiIiwJImJsdHMiLCB9LAotICB7ICJiZ3RiIiwJImJndHMiLCB9LAotICB7ICJibGViIiwJImJsZXMiLCB9LAotICB7ICJicmFiIiwJImJyYXMiLCB9LAotICB7ICJic3JiIiwJImJzcnMiLCB9LAotICB7ICJiaHMiLAkiYmNjdyIgfSwKLSAgeyAiYmhzcyIsCSJiY2NzIiB9LAotICB7ICJiaHNiIiwJImJjY3MiIH0sCi0gIHsgImJoc3ciLAkiYmNjdyIgfSwKLSAgeyAiYmhzbCIsCSJiY2NsIiB9LAotICB7ICJibG8iLAkiYmNzdyIgfSwKLSAgeyAiYmxvcyIsCSJiY3NzIiB9LAotICB7ICJibG9iIiwJImJjc3MiIH0sCi0gIHsgImJsb3ciLAkiYmNzdyIgfSwKLSAgeyAiYmxvbCIsCSJiY3NsIiB9LAotICB7ICJiciIsCSJicmF3IiwgfSwKLSAgeyAiYnJzIiwJImJyYXMiLCB9LAotICB7ICJicmIiLAkiYnJhcyIsIH0sCi0gIHsgImJydyIsCSJicmF3IiwgfSwKLSAgeyAiYnJsIiwJImJyYWwiLCB9LAotICB7ICJqZm5sdCIsCSJiY2MiLCB9LAkvKiBhcHBhcmVudGx5IGEgc3VuIGFsaWFzICovCi0gIHsgImpmbmd0IiwJImJsZSIsIH0sCS8qIGFwcGFyZW50bHkgYSBzdW4gYWxpYXMgKi8KLSAgeyAiamZlcSIsCSJiZXFzIiwgfSwJLyogYXBwYXJlbnRseSBhIHN1biBhbGlhcyAqLwotICB7ICJiY2hnYiIsCSJiY2hnIiwgfSwKLSAgeyAiYmNoZ2wiLAkiYmNoZyIsIH0sCi0gIHsgImJjbHJiIiwJImJjbHIiLCB9LAotICB7ICJiY2xybCIsCSJiY2xyIiwgfSwKLSAgeyAiYnNldGIiLAkiYnNldCIsIH0sCi0gIHsgImJzZXRsIiwJImJzZXQiLCB9LAotICB7ICJidHN0YiIsCSJidHN0IiwgfSwKLSAgeyAiYnRzdGwiLAkiYnRzdCIsIH0sCi0gIHsgImNhczIiLAkiY2FzMnciLCB9LAotICB7ICJjYXMiLAkiY2FzdyIsIH0sCi0gIHsgImNoazIiLAkiY2hrMnciLCB9LAotICB7ICJjaGsiLAkiY2hrdyIsIH0sCi0gIHsgImNsciIsCSJjbHJ3IiwgfSwKLSAgeyAiY21wMiIsCSJjbXAydyIsIH0sCi0gIHsgImNtcGEiLAkiY21wYXciLCB9LAotICB7ICJjbXBpIiwJImNtcGl3IiwgfSwKLSAgeyAiY21wbSIsCSJjbXBtdyIsIH0sCi0gIHsgImNtcCIsCSJjbXB3IiwgfSwKLSAgeyAiZGJjY3ciLAkiZGJjYyIsIH0sCi0gIHsgImRiY3N3IiwJImRiY3MiLCB9LAotICB7ICJkYmVxdyIsCSJkYmVxIiwgfSwKLSAgeyAiZGJmdyIsCSJkYmYiLCB9LAotICB7ICJkYmdldyIsCSJkYmdlIiwgfSwKLSAgeyAiZGJndHciLAkiZGJndCIsIH0sCi0gIHsgImRiaGl3IiwJImRiaGkiLCB9LAotICB7ICJkYmxldyIsCSJkYmxlIiwgfSwKLSAgeyAiZGJsc3ciLAkiZGJscyIsIH0sCi0gIHsgImRibHR3IiwJImRibHQiLCB9LAotICB7ICJkYm1pdyIsCSJkYm1pIiwgfSwKLSAgeyAiZGJuZXciLAkiZGJuZSIsIH0sCi0gIHsgImRicGx3IiwJImRicGwiLCB9LAotICB7ICJkYnR3IiwJImRidCIsIH0sCi0gIHsgImRidmN3IiwJImRidmMiLCB9LAotICB7ICJkYnZzdyIsCSJkYnZzIiwgfSwKLSAgeyAiZGJocyIsCSJkYmNjIiwgfSwKLSAgeyAiZGJoc3ciLAkiZGJjYyIsIH0sCi0gIHsgImRicmEiLAkiZGJmIiwgfSwKLSAgeyAiZGJyYXciLAkiZGJmIiwgfSwKLSAgeyAidGRpdnNsIiwJImRpdnNsIiwgfSwKLSAgeyAiZGl2cyIsCSJkaXZzdyIsIH0sCi0gIHsgImRpdnUiLAkiZGl2dXciLCB9LAotICB7ICJleHQiLAkiZXh0dyIsIH0sCi0gIHsgImV4dGJ3IiwJImV4dHciLCB9LAotICB7ICJleHR3bCIsCSJleHRsIiwgfSwKLSAgeyAiZmJuZXEiLAkiZmJuZSIsIH0sCi0gIHsgImZic25lcSIsCSJmYnNuZSIsIH0sCi0gIHsgImZkYm5lcSIsCSJmZGJuZSIsIH0sCi0gIHsgImZkYnNuZXEiLAkiZmRic25lIiwgfSwKLSAgeyAiZm1vdmVjciIsCSJmbW92ZWNyeCIsIH0sCi0gIHsgImZtb3ZtIiwJImZtb3ZlbSIsIH0sCi0gIHsgImZzbmVxIiwJImZzbmUiLCB9LAotICB7ICJmc3NuZXEiLAkiZnNzbmUiLCB9LAotICB7ICJmdHJhcG5lcSIsCSJmdHJhcG5lIiwgfSwKLSAgeyAiZnRyYXBzbmVxIiwgImZ0cmFwc25lIiwgfSwKLSAgeyAiZmpuZXEiLAkiZmpuZSIsIH0sCi0gIHsgImZqc25lcSIsCSJmanNuZSIsIH0sCi0gIHsgImptcGwiLAkiam1wIiwgfSwKLSAgeyAiam1wcyIsCSJqbXAiLCB9LAotICB7ICJqc3JsIiwJImpzciIsIH0sCi0gIHsgImpzcnMiLAkianNyIiwgfSwKLSAgeyAibGVhbCIsCSJsZWEiLCB9LAotICB7ICJsc2wiLAkibHNsdyIsIH0sCi0gIHsgImxzciIsCSJsc3J3IiwgfSwKLSAgeyAibWFjIiwJIm1hY3ciIH0sCi0gIHsgIm1vdmVhIiwJIm1vdmVhdyIsIH0sCi0gIHsgIm1vdmVtIiwJIm1vdmVtdyIsIH0sCi0gIHsgIm1vdm1sIiwJIm1vdmVtbCIsIH0sCi0gIHsgIm1vdm13IiwJIm1vdmVtdyIsIH0sCi0gIHsgIm1vdm0iLAkibW92ZW13IiwgfSwKLSAgeyAibW92ZXAiLAkibW92ZXB3IiwgfSwKLSAgeyAibW92cHciLAkibW92ZXB3IiwgfSwKLSAgeyAibW92ZXMiLAkibW92ZXN3IiB9LAotICB7ICJtdWxzIiwJIm11bHN3IiwgfSwKLSAgeyAibXVsdSIsCSJtdWx1dyIsIH0sCi0gIHsgIm1zYWMiLAkibXNhY3ciIH0sCi0gIHsgIm5iY2RiIiwJIm5iY2QiIH0sCi0gIHsgIm5lZyIsCSJuZWd3IiwgfSwKLSAgeyAibmVneCIsCSJuZWd4dyIsIH0sCi0gIHsgIm5vdCIsCSJub3R3IiwgfSwKLSAgeyAicGVhbCIsCSJwZWEiLCB9LAotICB7ICJyb2wiLAkicm9sdyIsIH0sCi0gIHsgInJvciIsCSJyb3J3IiwgfSwKLSAgeyAicm94bCIsCSJyb3hsdyIsIH0sCi0gIHsgInJveHIiLAkicm94cnciLCB9LAotICB7ICJzYmNkYiIsCSJzYmNkIiwgfSwKLSAgeyAic2NjYiIsCSJzY2MiLCB9LAotICB7ICJzY3NiIiwJInNjcyIsIH0sCi0gIHsgInNlcWIiLAkic2VxIiwgfSwKLSAgeyAic2ZiIiwJInNmIiwgfSwKLSAgeyAic2dlYiIsCSJzZ2UiLCB9LAotICB7ICJzZ3RiIiwJInNndCIsIH0sCi0gIHsgInNoaWIiLAkic2hpIiwgfSwKLSAgeyAic2xlYiIsCSJzbGUiLCB9LAotICB7ICJzbHNiIiwJInNscyIsIH0sCi0gIHsgInNsdGIiLAkic2x0IiwgfSwKLSAgeyAic21pYiIsCSJzbWkiLCB9LAotICB7ICJzbmViIiwJInNuZSIsIH0sCi0gIHsgInNwbGIiLAkic3BsIiwgfSwKLSAgeyAic3RiIiwJInN0IiwgfSwKLSAgeyAic3ZjYiIsCSJzdmMiLCB9LAotICB7ICJzdnNiIiwJInN2cyIsIH0sCi0gIHsgInNmZ2UiLAkic2dlIiwgfSwKLSAgeyAic2ZndCIsCSJzZ3QiLCB9LAotICB7ICJzZmxlIiwJInNsZSIsIH0sCi0gIHsgInNmbHQiLAkic2x0IiwgfSwKLSAgeyAic2ZuZXEiLAkic25lIiwgfSwKLSAgeyAic3ViYSIsCSJzdWJhdyIsIH0sCi0gIHsgInN1YmkiLAkic3ViaXciLCB9LAotICB7ICJzdWJxIiwJInN1YnF3IiwgfSwKLSAgeyAic3ViIiwJInN1YnciLCB9LAotICB7ICJzdWJ4IiwJInN1Ynh3IiwgfSwKLSAgeyAic3dhcHciLAkic3dhcCIsIH0sCi0gIHsgInRhc2IiLAkidGFzIiwgfSwKLSAgeyAidHBjYyIsCSJ0cmFwY2MiLCB9LAotICB7ICJ0Y2MiLAkidHJhcGNjIiwgfSwKLSAgeyAidHN0IiwJInRzdHciLCB9LAotICB7ICJqYnJhIiwJImpyYSIsIH0sCi0gIHsgImpiaGkiLAkiamhpIiwgfSwKLSAgeyAiamJscyIsCSJqbHMiLCB9LAotICB7ICJqYmNjIiwJImpjYyIsIH0sCi0gIHsgImpiY3MiLAkiamNzIiwgfSwKLSAgeyAiamJuZSIsCSJqbmUiLCB9LAotICB7ICJqYmVxIiwJImplcSIsIH0sCi0gIHsgImpidmMiLAkianZjIiwgfSwKLSAgeyAiamJ2cyIsCSJqdnMiLCB9LAotICB7ICJqYnBsIiwJImpwbCIsIH0sCi0gIHsgImpibWkiLAkiam1pIiwgfSwKLSAgeyAiamJnZSIsCSJqZ2UiLCB9LAotICB7ICJqYmx0IiwJImpsdCIsIH0sCi0gIHsgImpiZ3QiLAkiamd0IiwgfSwKLSAgeyAiamJsZSIsCSJqbGUiLCB9LAotICB7ICJtb3ZxbCIsCSJtb3ZlcSIsIH0sCi0gIHsgIm1vdmVxbCIsCSJtb3ZlcSIsIH0sCi0gIHsgIm1vdmwiLAkibW92ZWwiLCB9LAotICB7ICJtb3ZxIiwJIm1vdmVxIiwgfSwKLSAgeyAibW92YWwiLAkibW92ZWFsIiwgfSwKLSAgeyAibW92YXciLAkibW92ZWF3IiwgfSwKLSAgeyAibW92YiIsCSJtb3ZlYiIsIH0sCi0gIHsgIm1vdmMiLAkibW92ZWMiLCB9LAotICB7ICJtb3ZlY2wiLAkibW92ZWMiLCB9LAotICB7ICJtb3ZwbCIsCSJtb3ZlcGwiLCB9LAotICB7ICJtb3Z3IiwJIm1vdmV3IiwgfSwKLSAgeyAibW92c2IiLAkibW92ZXNiIiwgfSwKLSAgeyAibW92c2wiLAkibW92ZXNsIiwgfSwKLSAgeyAibW92c3ciLAkibW92ZXN3IiwgfSwKLQotICB7ICJ0ZGl2dWwiLAkiZGl2dWwiLCB9LAkvKiBmb3IgbTY4ay1zdnI0ICovCi0gIHsgImZtb3ZiIiwJImZtb3ZlYiIsIH0sCi0gIHsgImZzbW92YiIsCSJmc21vdmViIiwgfSwKLSAgeyAiZmRtb3ZiIiwJImZkbW92ZWIiLCB9LAotICB7ICJmbW92ZCIsCSJmbW92ZWQiLCB9LAotICB7ICJmc21vdmQiLAkiZnNtb3ZlZCIsIH0sCi0gIHsgImZtb3ZsIiwJImZtb3ZlbCIsIH0sCi0gIHsgImZzbW92bCIsCSJmc21vdmVsIiwgfSwKLSAgeyAiZmRtb3ZsIiwJImZkbW92ZWwiLCB9LAotICB7ICJmbW92cCIsCSJmbW92ZXAiLCB9LAotICB7ICJmc21vdnAiLAkiZnNtb3ZlcCIsIH0sCi0gIHsgImZkbW92cCIsCSJmZG1vdmVwIiwgfSwKLSAgeyAiZm1vdnMiLAkiZm1vdmVzIiwgfSwKLSAgeyAiZnNtb3ZzIiwJImZzbW92ZXMiLCB9LAotICB7ICJmZG1vdnMiLAkiZmRtb3ZlcyIsIH0sCi0gIHsgImZtb3Z3IiwJImZtb3ZldyIsIH0sCi0gIHsgImZzbW92dyIsCSJmc21vdmV3IiwgfSwKLSAgeyAiZmRtb3Z3IiwJImZkbW92ZXciLCB9LAotICB7ICJmbW92eCIsCSJmbW92ZXgiLCB9LAotICB7ICJmc21vdngiLAkiZnNtb3ZleCIsIH0sCi0gIHsgImZkbW92eCIsCSJmZG1vdmV4IiwgfSwKLSAgeyAiZm1vdmNyIiwJImZtb3ZlY3IiLCB9LAotICB7ICJmbW92Y3J4IiwJImZtb3ZlY3J4IiwgfSwKLSAgeyAiZnRlc3RiIiwJImZ0c3RiIiwgfSwKLSAgeyAiZnRlc3RkIiwJImZ0c3RkIiwgfSwKLSAgeyAiZnRlc3RsIiwJImZ0c3RsIiwgfSwKLSAgeyAiZnRlc3RwIiwJImZ0c3RwIiwgfSwKLSAgeyAiZnRlc3RzIiwJImZ0c3RzIiwgfSwKLSAgeyAiZnRlc3R3IiwJImZ0c3R3IiwgfSwKLSAgeyAiZnRlc3R4IiwJImZ0c3R4IiwgfSwKLX07Ci0KLWNvbnN0IGludCBtNjhrX251bWFsaWFzZXMgPQotICBzaXplb2YgbTY4a19vcGNvZGVfYWxpYXNlcyAvIHNpemVvZiBtNjhrX29wY29kZV9hbGlhc2VzWzBdOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tODhrLWRpcy5jIGIvb3Bjb2Rlcy9tODhrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY2Yjg3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTg4ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKiBQcmludCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMCwgZm9yIEdEQiBhbmQgR05VIEJpbnV0aWxzLgotICAgQ29weXJpZ2h0IChjKSAxOTg2LCAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERhdGEgR2VuZXJhbCBDb3Jwb3JhdGlvbiwgTm92ZW1iZXIgMTk4OS4KLSAgIFBhcnRpYWxseSBkZXJpdmVkIGZyb20gYW4gZWFybGllciBwcmludGNtZC5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIHRoZSBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL204OGsuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotSU5TVEFCICAqaGFzaHRhYmxlW0hBU0hWQUxdID0gezB9OwotCi1zdGF0aWMgaW50Ci1tODhrZGlzIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50b3AgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgT1BTUEVDICosCi0JCSB1bnNpZ25lZCBsb25nLCBiZmRfdm1hLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLWluaXRfZGlzYXNtIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLWluc3RhbGwgUEFSQU1TICgoSU5TVEFCICppbnN0cHRyKSk7Ci0KLS8qCi0qCQlEaXNhc3NlbWJsZSBhbiBNODgwMDAgSW5zdHJ1Y3Rpb24KLSoKLSoKLSogICAgICAgVGhpcyBtb2R1bGUgZGVjb2RlcyB0aGUgaW5zdHJ1Y3Rpb24gYXQgbWVtYWRkci4KLSoKLSoJCQlSZXZpc2lvbiBIaXN0b3J5Ci0qCi0qICAgICAgIFJldmlzaW9uIDEuMCAgICAxMS8wOC84NSAgICAgICAgQ3JlYXRpb24gZGF0ZSBieSBNb3Rvcm9sYQotKgkJCTA1LzExLzg5CVIuIFRyYXdpY2sgYWRhcHRlZCB0byBHREIgaW50ZXJmYWNlLgotKgkJCTA3LzEyLzkzCUlhbiBMYW5jZSBUYXlsb3IgdXBkYXRlZCB0bwotKgkJCQkJYmludXRpbHMgaW50ZXJmYWNlLgotKi8KLQotaW50Ci1wcmludF9pbnNuX204OGsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBJbnN0cnVjdGlvbiBhZGRyZXNzZXMgbWF5IGhhdmUgbG93IHR3byBiaXRzIHNldC4gQ2xlYXIgdGhlbS4JKi8KLSAgbWVtYWRkciAmPX4gKGJmZF92bWEpIDM7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gbTg4a2RpcyAobWVtYWRkciwgYmZkX2dldGIzMiAoYnVmZmVyKSwgaW5mbyk7Ci19Ci0KLS8qCi0gKiBkaXNhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb24gaW4gJ2luc3RydWN0aW9uJy4KLSAqICdwYycgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24sIGl0IHdpbGwKLSAqICAgYmUgdXNlZCB0byBwcmludCB0aGUgdGFyZ2V0IGFkZHJlc3MgaWYgdGhpcyBpcyBhIHJlbGF0aXZlIGp1bXAgb3IgY2FsbAotICogdGhlIGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbiBpcyB3cml0dGVuIHRvICdpbmZvJy4KLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiBieXRlcy4KLSAqLwotCi1zdGF0aWMgaW50Ci1tODhrZGlzIChwYywgaW5zdHJ1Y3Rpb24sIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb247Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgaW50IGloYXNodGFiX2luaXRpYWxpemVkID0gMDsKLSAgdW5zaWduZWQgaW50IG9wY29kZTsKLSAgSU5TVEFCICplbnRyeV9wdHI7Ci0gIGludCBvcG1hc2s7Ci0gIHVuc2lnbmVkIGludCBjbGFzczsKLQotICBpZiAoISBpaGFzaHRhYl9pbml0aWFsaXplZCkKLSAgICBpbml0X2Rpc2FzbSAoKTsKLQotICAvKiBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIG1hc2sgdG8gaXNvbGF0ZSB0aGUgb3Bjb2RlICovCi0gIG9wbWFzayA9IERFRk1BU0s7Ci0gIGNsYXNzID0gaW5zdHJ1Y3Rpb24gJiBERUZNQVNLOwotICBpZiAoKGNsYXNzID49IFNGVTApICYmIChjbGFzcyA8PSBTRlU3KSkKLSAgICB7Ci0gICAgICBpZiAoaW5zdHJ1Y3Rpb24gPCBTRlUxKQotCW9wbWFzayA9IENUUkxNQVNLOwotICAgICAgZWxzZQotCW9wbWFzayA9IFNGVU1BU0s7Ci0gICAgfQotICBlbHNlIGlmIChjbGFzcyA9PSBSUlIpCi0gICAgb3BtYXNrID0gUlJSTUFTSzsKLSAgZWxzZSBpZiAoY2xhc3MgPT0gUlJJMTApCi0gICAgb3BtYXNrID0gUlJJMTBNQVNLOwotCi0gIC8qIGlzb2xhdGUgdGhlIG9wY29kZSAqLwotICBvcGNvZGUgPSBpbnN0cnVjdGlvbiAmIG9wbWFzazsKLQotICAvKiBzZWFyY2ggdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgaXNvbGF0ZWQgb3Bjb2RlICovCi0gIGZvciAoZW50cnlfcHRyID0gaGFzaHRhYmxlW29wY29kZSAlIEhBU0hWQUxdOwotICAgICAgIChlbnRyeV9wdHIgIT0gTlVMTCkgJiYgKGVudHJ5X3B0ci0+b3Bjb2RlICE9IG9wY29kZSk7Ci0gICAgICAgZW50cnlfcHRyID0gZW50cnlfcHRyLT5uZXh0KQotICAgIDsKLQotICBpZiAoZW50cnlfcHRyID09IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ3b3JkXHQlMDh4IiwgaW5zdHJ1Y3Rpb24pOwotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGVudHJ5X3B0ci0+bW5lbW9uaWMpOwotICAgICAgcHJpbnRvcCAoaW5mbywgJihlbnRyeV9wdHItPm9wMSksIGluc3RydWN0aW9uLCBwYywgMSk7Ci0gICAgICBwcmludG9wIChpbmZvLCAmKGVudHJ5X3B0ci0+b3AyKSwgaW5zdHJ1Y3Rpb24sIHBjLCAwKTsKLSAgICAgIHByaW50b3AgKGluZm8sICYoZW50cnlfcHRyLT5vcDMpLCBpbnN0cnVjdGlvbiwgcGMsIDApOwotICAgIH0KLQotICByZXR1cm4gNDsKLX0KLQwKLS8qCi0qICAgICAgICAgICAgICAgICAgICAgIERlY29kZSBhbiBPcGVyYW5kIG9mIGFuIEluc3RydWN0aW9uCi0qCi0qCQkJRnVuY3Rpb25hbCBEZXNjcmlwdGlvbgotKgotKiAgICAgICBUaGlzIG1vZHVsZSBmb3JtYXRzIGFuZCB3cml0ZXMgYW4gb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbiB0byBpbmZvCi0qICAgICAgIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHNwZWNpZmljYXRpb24uICBXaGVuIHRoZSBmaXJzdCBmbGFnIGlzIHNldCB0aGlzCi0qICAgICAgIGlzIHRoZSBmaXJzdCBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uLiAgVW5kZWZpbmVkIG9wZXJhbmQgdHlwZXMKLSogICAgICAgY2F1c2UgYSA8ZGlzIGVycm9yPiBtZXNzYWdlLgotKgotKgkJCVBhcmFtZXRlcnMKLSoJZGlzYXNzZW1ibGVfaW5mbwl3aGVyZSB0aGUgb3BlcmFuZCBtYXkgYmUgcHJpbnRlZAotKiAgICAgICBPUFNQRUMgICpvcHB0ciAgICAgICAgICBQb2ludGVyIHRvIGFuIG9wZXJhbmQgc3BlY2lmaWNhdGlvbgotKiAgICAgICBVSU5UICAgIGluc3QgICAgICAgICAgICBJbnN0cnVjdGlvbiBmcm9tIHdoaWNoIG9wZXJhbmQgaXMgZXh0cmFjdGVkCi0qCVVJTlQgICAgcGMJCVBDIG9mIGluc3RydWN0aW9uOyB1c2VkIGZvciBwYy1yZWxhdGl2ZSBkaXNwLgotKiAgICAgICBpbnQgICAgIGZpcnN0ICAgICAgICAgICBGbGFnIHdoaWNoIGlmIG5vbnplcm8gaW5kaWNhdGVzIHRoZSBmaXJzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uCi0qCi0qCQkJT3V0cHV0Ci0qCi0qICAgICAgIFRoZSBvcGVyYW5kIHNwZWNpZmllZCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGlzCi0qICAgICAgIHdyaXR0ZW4gdG8gYnVmIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkLiBUaGUgb3BlcmFuZCBpcyBwcmVjZWRlZAotKiAgICAgICBieSBhIGNvbW1hIGlmIGl0IGlzIG5vdCB0aGUgZmlyc3Qgb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbiBhbmQgaXQKLSogICAgICAgaXMgbm90IGEgcmVnaXN0ZXIgaW5kaXJlY3QgZm9ybS4gIFJlZ2lzdGVycyBhcmUgcHJlY2VkZWQgYnkgJ3InIGFuZAotKiAgICAgICBoZXggdmFsdWVzIGJ5ICcweCcuCi0qCi0qCQkJUmV2aXNpb24gSGlzdG9yeQotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKLSovCi0KLXN0YXRpYyB2b2lkCi1wcmludG9wIChpbmZvLCBvcHB0ciwgaW5zdCwgcGMsIGZpcnN0KQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgT1BTUEVDICpvcHB0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnN0OwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgZmlyc3Q7Ci17Ci0gIGludCBleHRyYWN0ZWRfZmllbGQ7Ci0gIGNoYXIgKmNvbmRfbWFza19zeW07Ci0KLSAgaWYgKG9wcHRyLT53aWR0aCA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoISBmaXJzdCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wcHRyLT50eXBlKQotCXsKLQljYXNlIFJFR1NDOgotCWNhc2UgQ09OVDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgc3dpdGNoIChvcHB0ci0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBDUlJFRzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiY3IlZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZDUlJFRzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZmNyJWQiLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUdTQzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiW3IlZF0iLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFhSRUc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInglZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhFWDoKLSAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7Ci0gICAgICBpZiAoZXh0cmFjdGVkX2ZpZWxkID09IDApCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwIik7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCUwMngiLCBleHRyYWN0ZWRfZmllbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQzoKLSAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgZXh0cmFjdGVkX2ZpZWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT05ETUFTSzoKLSAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7Ci0gICAgICBzd2l0Y2ggKGV4dHJhY3RlZF9maWVsZCAmIDB4MGYpCi0JewotCWNhc2UgMHgxOiBjb25kX21hc2tfc3ltID0gImd0MCI7IGJyZWFrOwotCWNhc2UgMHgyOiBjb25kX21hc2tfc3ltID0gImVxMCI7IGJyZWFrOwotCWNhc2UgMHgzOiBjb25kX21hc2tfc3ltID0gImdlMCI7IGJyZWFrOwotCWNhc2UgMHhjOiBjb25kX21hc2tfc3ltID0gImx0MCI7IGJyZWFrOwotCWNhc2UgMHhkOiBjb25kX21hc2tfc3ltID0gIm5lMCI7IGJyZWFrOwotCWNhc2UgMHhlOiBjb25kX21hc2tfc3ltID0gImxlMCI7IGJyZWFrOwotCWRlZmF1bHQ6IGNvbmRfbWFza19zeW0gPSBOVUxMOyBicmVhazsKLQl9Ci0gICAgICBpZiAoY29uZF9tYXNrX3N5bSAhPSBOVUxMKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBjb25kX21hc2tfc3ltKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4IiwgZXh0cmFjdGVkX2ZpZWxkKTsKLSAgICAgIGJyZWFrOwotCQkJCi0gICAgY2FzZSBQQ1JFTDoKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCShwYyArICg0ICogKFNFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpKSwKLQkgaW5mbyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09OVDoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQsciVkIiwKLQkJCSAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgNSksCi0JCQkgICAgIFVFWFQgKGluc3QsIChvcHB0ci0+b2Zmc2V0KSArIDUsIDUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRjoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQ8JWQ+IiwKLQkJCSAgICAgIFVFWFQgKGluc3QsIChvcHB0ci0+b2Zmc2V0KSArIDUsIDUpLAotCQkJICAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgNSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCIjIDxkaXMgZXJyb3I6ICUwOHg+IiksIGluc3QpOwotICAgIH0KLX0KLQotLyoKLSogICAgICAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIERpc2Fzc2VtYmxlciBJbnN0cnVjdGlvbiBUYWJsZQotKgotKiAgICAgICBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIGFuZCBpbnN0cnVjdGlvbiB0YWJsZSBmb3IgdGhlIGRpc2Fzc2VtYmxlci4KLSogICAgICAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIGRpc2FzbSgpLgotKgotKgkJCVBhcmFtZXRlcnMKLSoKLSoJCQlPdXRwdXQKLSoKLSogICAgICAgSWYgdGhlIGRlYnVnIG9wdGlvbiBpcyBzZWxlY3RlZCwgY2VydGFpbiBzdGF0aXN0aWNzIGFib3V0IHRoZSBoYXNoaW5nCi0qICAgICAgIGRpc3RyaWJ1dGlvbiBhcmUgd3JpdHRlbiB0byBzdGRvdXQuCi0qCi0qCQkJUmV2aXNpb24gSGlzdG9yeQotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKLSovCi0KLXN0YXRpYyB2b2lkCi1pbml0X2Rpc2FzbSAoKQotewotICAgaW50IGksIHNpemU7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBIQVNIVkFMOyBpKyspCi0gICAgIGhhc2h0YWJsZVtpXSA9IE5VTEw7Ci0KLSAgIHNpemUgPSBzaXplb2YgKGluc3RydWN0aW9ucykgLyBzaXplb2YgKElOU1RBQik7Ci0gICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICBpbnN0YWxsICgmaW5zdHJ1Y3Rpb25zW2ldKTsKLX0KLQotLyoKLSogICAgICAgSW5zZXJ0IGFuIGluc3RydWN0aW9uIGludG8gdGhlIGRpc2Fzc2VtYmxlciB0YWJsZSBieSBoYXNoaW5nIHRoZQotKiAgICAgICBvcGNvZGUgYW5kIGluc2VydGluZyBpdCBpbnRvIHRoZSBsaW5rZWQgbGlzdCBmb3IgdGhhdCBoYXNoIHZhbHVlLgotKgotKgkJCVBhcmFtZXRlcnMKLSoKLSogICAgICAgSU5TVEFCICppbnN0cHRyICAgICAgICAgUG9pbnRlciB0byB0aGUgZW50cnkgaW4gdGhlIGluc3RydWN0aW9uIHRhYmxlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGluc3RhbGxlZAotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKLSoJCQkwNS8xMS84OQlSLiBUUkFXSUNLIEFEQVBURUQgRlJPTSBNT1RPUk9MQQotKi8KLQotc3RhdGljIHZvaWQKLWluc3RhbGwgKGluc3RwdHIpCi0gICAgIElOU1RBQiAqaW5zdHB0cjsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaSA9IChpbnN0cHRyLT5vcGNvZGUpICUgSEFTSFZBTDsKLSAgaW5zdHB0ci0+bmV4dCA9IGhhc2h0YWJsZVtpXTsKLSAgaGFzaHRhYmxlW2ldID0gaW5zdHB0cjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWFrZWZpbGUudm1zIGIvb3Bjb2Rlcy9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODcwNDguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBsaWJvcGNvZGVzIHVuZGVyIG9wZW5WTVMgVkFYIGFuZCBBbHBoYQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBwcm9naXMuZGUKLSMKLSMKLWlmZXEgKCQoQVJDSCksYWxwaGEpCi1PQkpTPWFscGhhLWRpcy5vYmosYWxwaGEtb3BjLm9iaixkaXMtYnVmLm9iaixkaXNhc3NlbWJsZS5vYmoKLUZPUk1BVD1PQkpfRVZBWAotQVJDSERFRj0iQVJDSF9hbHBoYSIKLWVsc2UKLU9CSlM9dmF4LWRpcy5vYmosZGlzLWJ1Zi5vYmosZGlzYXNzZW1ibGUub2JqCi1GT1JNQVQ9T0JKX1ZBWAotQVJDSERFRj0iQVJDSF92YXgiCi1lbmRpZgotCi1pZmVxICgkKENDKSxnY2MpCi1ERUZTPS9kZWZpbmU9KCQoRk9STUFUKSkKLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpCi1lbHNlCi1ERUZTPS9kZWZpbmU9KCQoRk9STUFUKSwiY29uc3Q9IikKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1lbmRpZgotCi1saWJvcGNvZGVzLm9sYjogc3lzZGVwLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJvcGNvZGVzICoub2JqCi0KLWRpc2Fzc2VtYmxlLm9iajogZGlzYXNzZW1ibGUuYwotCSQoQ0MpJChDRkxBR1MpL2RlZmluZT0oJChBUkNIREVGKSkgJDwKLQotc3lzZGVwLmg6IFstLmJmZC5ob3N0c10kKEFSQ0gpdm1zLmgKLQkkKENQKSAkPCAkQAotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pICoub2JqOwotCSQoUk0pIHN5c2RlcC5oOwotCSQoUk0pIGxpYm9wY29kZXMub2xiOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tY29yZS1kaXMuYyBiL29wY29kZXMvbWNvcmUtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NmNlYzkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tY29yZS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBNb3Rvcm9sYSBNKkNvcmUgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgU1RBVElDX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAibWNvcmUtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0vKiBNYXNrIGZvciBlYWNoIG1jb3JlX29wY2xhc3M6ICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaW1za1tdID0KLXsKLSAgICAvKiBPMCAgKi8gMHhGRkZGLAotICAgIC8qIE9UICAqLyAweEZGRkMsCi0gICAgLyogTzEgICovIDB4RkZGMCwKLSAgICAvKiBPQyAgKi8gMHhGRkUwLAotICAgIC8qIE8yICAqLyAweEZGMDAsCi0gICAgLyogWDEgICovIDB4RkZGMCwKLSAgICAvKiBPSSAgKi8gMHhGRTAwLAotICAgIC8qIE9CICAqLyAweEZFMDAsCi0JICAgICAgCi0gICAgLyogT01hICovIDB4RkZGMCwKLSAgICAvKiBTSSAgKi8gMHhGRTAwLAotICAgIC8qIEk3ICAqLyAweEY4MDAsCi0gICAgLyogTFMgICovIDB4RjAwMCwKLSAgICAvKiBCUiAgKi8gMHhGODAwLAotICAgIC8qIEJMICAqLyAweEZGMDAsCi0gICAgLyogTFIgICovIDB4RjAwMCwKLSAgICAvKiBMSiAgKi8gMHhGRjAwLAotCSAgICAgIAotICAgIC8qIFJNICAqLyAweEZGRjAsCi0gICAgLyogUlEgICovIDB4RkZGMCwKLSAgICAvKiBKU1IgKi8gMHhGRkYwLAotICAgIC8qIEpNUCAqLyAweEZGRjAsCi0gICAgLyogT0JSYSovIDB4RkZGMCwKLSAgICAvKiBPQlJiKi8gMHhGRjgwLAotICAgIC8qIE9CUmMqLyAweEZGMDAsCi0gICAgLyogT0JSMiovIDB4RkUwMCwKLQkgICAgICAKLSAgICAvKiBPMVIxKi8gMHhGRkYwLAotICAgIC8qIE9NYiAqLyAweEZGODAsCi0gICAgLyogT01jICovIDB4RkYwMCwKLSAgICAvKiBTSWEgKi8gMHhGRTAwLAotCi0gIC8qIE1VTFNIICovIDB4RkYwMCwgICAgCi0gIC8qIE9QU1IgICovIDB4RkZGOCwgICAvKiBwc3JzZXQvcHNyY2xyICovCi0JCSAKLSAgICAvKiBKQyAgKi8gMCwJCS8qIEpDLEpVLEpMIGRvbid0IGFwcGVhciBpbiBvYmplY3QgKi8KLSAgICAvKiBKVSAgKi8gMCwKLSAgICAvKiBKTCAgKi8gMCwKLSAgICAvKiBSU0kgKi8gMCwKLSAgICAvKiBETzIxKi8gMCwKLSAgICAvKiBPQjIgKi8gMCAJCS8qIE9CMiB3b24ndCBhcHBlYXIgaW4gb2JqZWN0LiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBncm5hbWVbXSA9Ci17Ci0gInIwIiwgICJyMSIsICAicjIiLCAgInIzIiwgICJyNCIsICAicjUiLCAgInI2IiwgICJyNyIsCi0gInI4IiwgICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIFhbXSA9ICI/PyI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY3JuYW1lW10gPQotewotICAicHNyIiwgICJ2YnIiLCAiZXBzciIsICJmcHNyIiwgImVwYyIsICAiZnBjIiwgICJzczAiLCAgInNzMSIsCi0gICJzczIiLCAgInNzMyIsICJzczQiLCAgImdjciIsICAiZ3NyIiwgICAgIFgsICAgICAgWCwgICAgICBYLAotICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICBYLCAgICAgIFgsICAgICAgWCwKLSAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgWCwgICAgICBYLCAgICAgIFgKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpc2l6W10gPSB7IDIsIDAsIDEsIDAgfTsKLQotaW50IAotcHJpbnRfaW5zbl9tY29yZSAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgICAgICAgaWJ5dGVzWzRdOwotICBmcHJpbnRmX2Z0eXBlICAgICAgIGZwcmludGYgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIHZvaWQgKiAgICAgICAgICAgICAgc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICB1bnNpZ25lZCBzaG9ydCAgICAgIGluc3Q7Ci0gIG1jb3JlX29wY29kZV9pbmZvICogb3A7Ci0gIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOwotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0KLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgaWJ5dGVzLCAyLCBpbmZvKTsKLQotICBpZiAoc3RhdHVzICE9IDApIAotICAgIHsKLSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIGluc3QgPSAoaWJ5dGVzWzBdIDw8IDgpIHwgaWJ5dGVzWzFdOwotICBlbHNlIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgaW5zdCA9IChpYnl0ZXNbMV0gPDwgOCkgfCBpYnl0ZXNbMF07Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICAvKiBKdXN0IGEgbGluZWFyIHNlYXJjaCBvZiB0aGUgdGFibGUuICAqLwotICBmb3IgKG9wID0gbWNvcmVfdGFibGU7IG9wLT5uYW1lICE9IDA7IG9wICsrKQotICAgIGlmIChvcC0+aW5zdCA9PSAoaW5zdCAmIGltc2tbb3AtPm9wY2xhc3NdKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChvcC0+bmFtZSA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgIi5zaG9ydCAweCUwNHgiLCBpbnN0KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lID0gZ3JuYW1lW2luc3QgJiAweDBGXTsKLSAgICAgIAotICAgICAgZnByaW50ZiAoc3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7Ci0gICAgICAKLSAgICAgIHN3aXRjaCAob3AtPm9wY2xhc3MpCi0JewotCWNhc2UgTzA6IGJyZWFrOwotCWNhc2UgT1Q6IGZwcmludGYgKHN0cmVhbSwgIlx0JWQiLCBpbnN0ICYgMHgzKTsgYnJlYWs7Ci0JY2FzZSBPMToKLQljYXNlIEpNUDoKLQljYXNlIEpTUjogZnByaW50ZiAoc3RyZWFtLCAiXHQlcyIsIG5hbWUpOyBicmVhazsKLQljYXNlIE9DOiAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJXMiLCBuYW1lLCBjcm5hbWVbKGluc3QgPj4gNCkgJiAweDFGXSk7IGJyZWFrOwotCWNhc2UgTzFSMTogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgcjEiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBNVUxTSDoKLQljYXNlIE8yOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlcyIsIG5hbWUsIGdybmFtZVsoaW5zdCA+PiA0KSAmIDB4Rl0pOyBicmVhazsKLQljYXNlIFgxOiBmcHJpbnRmIChzdHJlYW0sICJcdHIxLCAlcyIsIG5hbWUpOyBicmVhazsKLQljYXNlIE9JOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsICgoaW5zdCA+PiA0KSAmIDB4MUYpICsgMSk7IGJyZWFrOwotCWNhc2UgUk06IGZwcmludGYgKHN0cmVhbSwgIlx0JXMtcjE1LCAocjApIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgUlE6IGZwcmludGYgKHN0cmVhbSwgIlx0cjQtcjcsICglcykiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBPQjoKLQljYXNlIE9CUmE6Ci0JY2FzZSBPQlJiOgotCWNhc2UgT0JSYzoKLQljYXNlIFNJOgotCWNhc2UgU0lhOgotCWNhc2UgT01hOgotCWNhc2UgT01iOgotCWNhc2UgT01jOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsIChpbnN0ID4+IDQpICYgMHgxRik7IGJyZWFrOwotCWNhc2UgSTc6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVkIiwgbmFtZSwgKGluc3QgPj4gNCkgJiAweDdGKTsgYnJlYWs7Ci0JY2FzZSBMUzogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgKCVzLCAlZCkiLCBncm5hbWVbKGluc3QgPj4gOCkgJiAweEZdLAotCQkJICBuYW1lLCAoKGluc3QgPj4gNCkgJiAweEYpIDw8IGlzaXpbKGluc3QgPj4gMTMpICYgM10pOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEJSOgotCSAgewotCSAgICBsb25nIHZhbCA9IGluc3QgJiAweDNGRjsKLQkgICAgCi0JICAgIGlmIChpbnN0ICYgMHg0MDApCi0JICAgICAgdmFsIHw9IDB4RkZGRkZDMDA7Ci0JICAgIAotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdDB4JXgiLCBtZW1hZGRyICsgMiArICh2YWw8PDEpKTsKLQkgICAgCi0JICAgIGlmIChzdHJjbXAgKG9wLT5uYW1lLCAiYnNyIikgPT0gMCkKLQkgICAgICB7Ci0JCS8qIGZvciBic3IsIHdlJ2xsIHRyeSB0byBnZXQgYSBzeW1ib2wgZm9yIHRoZSB0YXJnZXQgKi8KLQkJdmFsID0gbWVtYWRkciArIDIgKyAodmFsIDw8IDEpOwotCQkKLQkJaWYgKGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAmJiB2YWwgIT0gMCkKLQkJICB7Ci0JCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdC8vICIpOwotCQkgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICh2YWwsIGluZm8pOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgQkw6Ci0JICB7Ci0JICAgIGxvbmcgdmFsOwotCSAgICB2YWwgPSAoaW5zdCAmIDB4MDAwRik7Ci0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0JXMsIDB4JXgiLAotCQkgICAgZ3JuYW1lWyhpbnN0ID4+IDQpICYgMHhGXSwgbWVtYWRkciAtICh2YWwgPDwgMSkpOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIExSOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgICAgCi0JICAgIHZhbCA9IChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkM7Ci0JICAgIAotCSAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jICh2YWwsIGlieXRlcywgNCwgaW5mbyk7Ci0JICAgIGlmIChzdGF0dXMgIT0gMCkgCi0JICAgICAgewotCQlpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAKLQkgICAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLQkgICAgICB2YWwgPSAoaWJ5dGVzWzNdIDw8IDI0KSB8IChpYnl0ZXNbMl0gPDwgMTYpCi0JCXwgKGlieXRlc1sxXSA8PCA4KSB8IChpYnl0ZXNbMF0pOwotCSAgICBlbHNlCi0JICAgICAgdmFsID0gKGlieXRlc1swXSA8PCAyNCkgfCAoaWJ5dGVzWzFdIDw8IDE2KQotCQl8IChpYnl0ZXNbMl0gPDwgOCkgfCAoaWJ5dGVzWzNdKTsKLQkgICAgCi0JICAgIC8qIFJlbW92ZWQgW10gYXJvdW5kIGxpdGVyYWwgdmFsdWUgdG8gbWF0Y2ggQUJJIHN5bnRheCAxMi85NS4gICovCi0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0JXMsIDB4JVgiLCBncm5hbWVbKGluc3QgPj4gOCkgJiAweEZdLCB2YWwpOwotCi0JICAgIGlmICh2YWwgPT0gMCkKLQkgICAgICBmcHJpbnRmIChzdHJlYW0sICJcdC8vIGZyb20gYWRkcmVzcyBwb29sIGF0IDB4JXgiLAotCQkgICAgICAgKG1lbWFkZHIgKyAyICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQyk7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgTEo6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgICAKLQkgICAgdmFsID0gKG1lbWFkZHIgKyAyICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQzsKLQkgICAgCi0JICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKHZhbCwgaWJ5dGVzLCA0LCBpbmZvKTsKLQkgICAgaWYgKHN0YXR1cyAhPSAwKSAKLQkgICAgICB7Ci0JCWluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLQkgICAgICB2YWwgPSAoaWJ5dGVzWzNdIDw8IDI0KSB8IChpYnl0ZXNbMl0gPDwgMTYpCi0JCXwgKGlieXRlc1sxXSA8PCA4KSB8IChpYnl0ZXNbMF0pOwotCSAgICBlbHNlCi0JICAgICAgdmFsID0gKGlieXRlc1swXSA8PCAyNCkgfCAoaWJ5dGVzWzFdIDw8IDE2KQotCQl8IChpYnl0ZXNbMl0gPDwgOCkgfCAoaWJ5dGVzWzNdKTsKLQkgICAgCi0JICAgIC8qIFJlbW92ZWQgW10gYXJvdW5kIGxpdGVyYWwgdmFsdWUgdG8gbWF0Y2ggQUJJIHN5bnRheCAxMi85NS4gICovCi0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0MHglWCIsIHZhbCk7Ci0JICAgIC8qIEZvciBqbXBpL2pzcmksIHdlJ2xsIHRyeSB0byBnZXQgYSBzeW1ib2wgZm9yIHRoZSB0YXJnZXQuICAqLwotCSAgICBpZiAoaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICYmIHZhbCAhPSAwKQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RyZWFtLCAiXHQvLyAiKTsKLQkJaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICh2YWwsIGluZm8pOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RyZWFtLCAiXHQvLyBmcm9tIGFkZHJlc3MgcG9vbCBhdCAweCV4IiwKLQkJCSAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDKTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgT1BTUjoKLQkgIHsKLQkgICAgc3RhdGljIGNoYXIgKiBmaWVsZHNbXSA9IAotCSAgICB7Ci0JICAgICAgImFmIiwgImllIiwgICAgImZlIiwgICAgImZlLGllIiwgCi0JICAgICAgImVlIiwgImVlLGllIiwgImVlLGZlIiwgImVlLGZlLGllIgotCSAgICB9OwotCSAgICAKLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcyIsIGZpZWxkc1tpbnN0ICYgMHg3XSk7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWRlZmF1bHQ6Ci0JICAvKiBpZiB0aGUgZGlzYXNzZW1ibGVyIGxhZ3MgdGhlIGluc3RydWN0aW9uIHNldCAqLwotCSAgZnByaW50ZiAoc3RyZWFtLCAiXHR1bmRlY29kZWQgb3BlcmFuZHMsIGluc3QgaXMgMHglMDR4IiwgaW5zdCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAKLSAgLyogU2F5IGhvdyBtYW55IGJ5dGVzIHdlIGNvbnN1bWVkPyAqLwotICByZXR1cm4gMjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWNvcmUtb3BjLmggYi9vcGNvZGVzL21jb3JlLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmYwNWVlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWNvcmUtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyogQXNzZW1ibGVyIGluc3RydWN0aW9ucyBmb3IgTW90b3JvbGEncyBNY29yZSBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotdHlwZWRlZiBlbnVtCi17Ci0gIE8wLCAgICBPVCwgICBPMSwgICBPQywgICBPMiwgICAgWDEsICAgIE9JLCAgICBPQiwKLSAgT01hLCAgIFNJLCAgIEk3LCAgIExTLCAgIEJSLCAgICBCTCwgICAgTFIsICAgIExKLAotICBSTSwgICAgUlEsICAgSlNSLCAgSk1QLCAgT0JSYSwgIE9CUmIsICBPQlJjLCAgT0JSMiwKLSAgTzFSMSwgIE9NYiwgIE9NYywgIFNJYSwKLSAgTVVMU0gsIE9QU1IsCi0gIEpDLCAgICBKVSwgICBKTCwgICBSU0ksICBETzIxLCAgT0IyCi19Ci1tY29yZV9vcGNsYXNzOwotCi10eXBlZGVmIHN0cnVjdCBpbnN0Ci17Ci0gIGNoYXIgKiAgICAgICAgIG5hbWU7Ci0gIG1jb3JlX29wY2xhc3MgIG9wY2xhc3M7Ci0gIHVuc2lnbmVkIGNoYXIgIHRyYW5zZmVyOwotICB1bnNpZ25lZCBzaG9ydCBpbnN0OwotfQotbWNvcmVfb3Bjb2RlX2luZm87Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLW1jb3JlX29wY29kZV9pbmZvIG1jb3JlX3RhYmxlW10gPQotewotICB7ICJia3B0IiwJTzAsCTAsCTB4MDAwMCB9LAotICB7ICJzeW5jIiwJTzAsCTAsCTB4MDAwMSB9LAotICB7ICJydGUiLAlPMCwJMSwJMHgwMDAyIH0sCi0gIHsgInJmZSIsCU8wLAkxLAkweDAwMDIgfSwKLSAgeyAicmZpIiwJTzAsCTEsCTB4MDAwMyB9LAotICB7ICJzdG9wIiwJTzAsCTAsCTB4MDAwNCB9LAotICB7ICJ3YWl0IiwJTzAsCTAsCTB4MDAwNSB9LAotICB7ICJkb3plIiwJTzAsCTAsCTB4MDAwNiB9LAotICB7ICJpZGx5NCIsICAgIE8wLCAgICAgMCwgICAgICAweDAwMDcgfSwKLSAgeyAidHJhcCIsCU9ULAkwLAkweDAwMDggfSwKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBDIC0gMHgwMDBGICovCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAtIDB4MDAxRiAqLwotICB7ICJtdmMiLAlPMSwJMCwJMHgwMDIwIH0sCi0gIHsgIm12Y3YiLAlPMSwJMCwJMHgwMDMwIH0sCi0gIHsgImxkcSIsCVJRLAkwLAkweDAwNDAgfSwKLSAgeyAic3RxIiwJUlEsCTAsCTB4MDA1MCB9LAotICB7ICJsZG0iLAlSTSwJMCwJMHgwMDYwIH0sCi0gIHsgInN0bSIsCVJNLAkwLAkweDAwNzAgfSwKLSAgeyAiZGVjdCIsCU8xLAkwLAkweDAwODAgfSwKLSAgeyAiZGVjZiIsCU8xLAkwLAkweDAwOTAgfSwKLSAgeyAiaW5jdCIsCU8xLAkwLAkweDAwQTAgfSwKLSAgeyAiaW5jZiIsCU8xLAkwLAkweDAwQjAgfSwKLSAgeyAiam1wIiwJSk1QLAkyLAkweDAwQzAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KTVAJMHgwMEMwCi0gIHsgImpzciIsCUpTUiwJMCwJMHgwMEQwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfSlNSCTB4MDBFMAotICB7ICJmZjEiLAlPMSwJMCwJMHgwMEUwIH0sCi0gIHsgImJyZXYiLAlPMSwJMCwJMHgwMEYwIH0sCi0gIHsgInh0cmIzIiwJWDEsCTAsCTB4MDEwMCB9LAotICB7ICJ4dHJiMiIsCVgxLAkwLAkweDAxMTAgfSwKLSAgeyAieHRyYjEiLAlYMSwJMCwJMHgwMTIwIH0sCi0gIHsgInh0cmIwIiwJWDEsCTAsCTB4MDEzMCB9LAotICB7ICJ6ZXh0YiIsCU8xLAkwLAkweDAxNDAgfSwKLSAgeyAic2V4dGIiLAlPMSwJMCwJMHgwMTUwIH0sCi0gIHsgInpleHRoIiwJTzEsCTAsCTB4MDE2MCB9LAotICB7ICJzZXh0aCIsCU8xLAkwLAkweDAxNzAgfSwKLSAgeyAiZGVjbHQiLAlPMSwJMCwJMHgwMTgwIH0sCi0gIHsgInRzdG5ieiIsCU8xLAkwLAkweDAxOTAgfSwKLSAgeyAiZGVjZ3QiLAlPMSwJMCwJMHgwMUEwIH0sCi0gIHsgImRlY25lIiwJTzEsCTAsCTB4MDFCMCB9LAotICB7ICJjbHJ0IiwJTzEsCTAsCTB4MDFDMCB9LAotICB7ICJjbHJmIiwJTzEsCTAsCTB4MDFEMCB9LAotICB7ICJhYnMiLAlPMSwJMCwJMHgwMUUwIH0sCi0gIHsgIm5vdCIsCU8xLAkwLAkweDAxRjAgfSwKLSAgeyAibW92dCIsCU8yLAkwLAkweDAyMDAgfSwKLSAgeyAibXVsdCIsCU8yLAkwLAkweDAzMDAgfSwKLSAgeyAibG9vcHQiLAlCTCwJMCwJMHgwNDAwIH0sCi0gIHsgInN1YnUiLAlPMiwJMCwJMHgwNTAwIH0sCi0gIHsgInN1YiIsCU8yLAkwLAkweDA1MDAgfSwgLyogT2ZmaWNpYWwgYWxpYXMuICAqLwotICB7ICJhZGRjIiwJTzIsCTAsCTB4MDYwMCB9LAotICB7ICJzdWJjIiwJTzIsCTAsCTB4MDcwMCB9LAotLyogU1BBQ0U6IDB4MDgwMC0weDA4ZmYgZm9yIGEgZGlhZGljIG9wZXJhdGlvbiAqLwotLyogU1BBQ0U6IDB4MDkwMC0weDA5ZmYgZm9yIGEgZGlhZGljIG9wZXJhdGlvbiAqLwotICB7ICJtb3ZmIiwJTzIsCTAsCTB4MEEwMCB9LAotICB7ICJsc3IiLAlPMiwJMCwJMHgwQjAwIH0sCi0gIHsgImNtcGhzIiwJTzIsCTAsCTB4MEMwMCB9LAotICB7ICJjbXBsdCIsCU8yLAkwLAkweDBEMDAgfSwKLSAgeyAidHN0IiwJTzIsCTAsCTB4MEUwMCB9LAotICB7ICJjbXBuZSIsCU8yLAkwLAkweDBGMDAgfSwKLSAgeyAibWZjciIsCU9DLAkwLAkweDEwMDAgfSwKLSAgeyAicHNyY2xyIiwJT1BTUiwJMCwJMHgxMUYwIH0sCi0gIHsgInBzcnNldCIsCU9QU1IsCTAsCTB4MTFGOCB9LAotICB7ICJtb3YiLAlPMiwJMCwJMHgxMjAwIH0sCi0gIHsgImJnZW5yIiwJTzIsCTAsCTB4MTMwMCB9LAotICB7ICJyc3ViIiwJTzIsCTAsCTB4MTQwMCB9LAotICB7ICJpeHciLAlPMiwJMCwJMHgxNTAwIH0sCi0gIHsgImFuZCIsCU8yLAkwLAkweDE2MDAgfSwKLSAgeyAieG9yIiwJTzIsCTAsCTB4MTcwMCB9LAotICB7ICJtdGNyIiwJT0MsCTAsCTB4MTgwMCB9LAotICB7ICJhc3IiLAlPMiwJMCwJMHgxQTAwIH0sCi0gIHsgImxzbCIsCU8yLAkwLAkweDFCMDAgfSwKLSAgeyAiYWRkdSIsCU8yLAkwLAkweDFDMDAgfSwKLSAgeyAiYWRkIiwJTzIsCTAsCTB4MUMwMCB9LCAvKiBPZmZpY2lhbCBhbGlhcy4gICovCi0gIHsgIml4aCIsCU8yLAkwLAkweDFEMDAgfSwKLSAgeyAib3IiLAlPMiwJMCwJMHgxRTAwIH0sCi0gIHsgImFuZG4iLAlPMiwJMCwJMHgxRjAwIH0sCi0gIHsgImFkZGkiLAlPSSwJMCwJMHgyMDAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfQURESQkweDIwMDAKLSAgeyAiY21wbHRpIiwJT0ksCTAsCTB4MjIwMCB9LAotICB7ICJzdWJpIiwJT0ksCTAsCTB4MjQwMCB9LAotLyogU1BBQ0U6IDB4MjYwMC0weDI3ZmYgb3BlbiBmb3IgYSByZWdpc3RlcitpbW1lZGlhdGUgIG9wZXJhdGlvbiAqLwotICB7ICJyc3ViaSIsCU9CLAkwLAkweDI4MDAgfSwKLSAgeyAiY21wbmVpIiwJT0IsCTAsCTB4MkEwMCB9LAotICB7ICJibWFza2kiLAlPTWEsCTAsCTB4MkMwMCB9LAotICB7ICJkaXZ1IiwJTzFSMSwJMCwJMHgyQzEwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MmMyMCAtIDB4MmM3ZiAqLyAgCi0gIHsgImJtYXNraSIsCU9NYiwJMCwJMHgyQzgwIH0sCi0gIHsgImJtYXNraSIsCU9NYywJMCwJMHgyRDAwIH0sCi0gIHsgImFuZGkiLAlPQiwJMCwJMHgyRTAwIH0sCi0gIHsgImJjbHJpIiwJT0IsCTAsCTB4MzAwMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDMyMDAgLSAweDMyMGYgKi8KLSAgeyAiZGl2cyIsCU8xUjEsCTAsCTB4MzIxMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDMyMjAgLSAweDMyNmYgKi8gIAotICB7ICJiZ2VuaSIsCU9CUmEsCTAsCTB4MzI3MCB9LAotICB7ICJiZ2VuaSIsCU9CUmIsCTAsCTB4MzI4MCB9LAotICB7ICJiZ2VuaSIsCU9CUmMsCTAsCTB4MzMwMCB9LAotICB7ICJic2V0aSIsCU9CLAkwLAkweDM0MDAgfSwKLSAgeyAiYnRzdGkiLAlPQiwJMCwJMHgzNjAwIH0sCi0gIHsgInhzciIsCU8xLAkwLAkweDM4MDAgfSwKLSAgeyAicm90bGkiLAlTSWEsCTAsCTB4MzgwMCB9LAotICB7ICJhc3JjIiwJTzEsCTAsCTB4M0EwMCB9LAotICB7ICJhc3JpIiwJU0lhLAkwLAkweDNBMDAgfSwKLSAgeyAibHNsYyIsCU8xLAkwLAkweDNDMDAgfSwKLSAgeyAibHNsaSIsCVNJYSwJMCwJMHgzQzAwIH0sCi0gIHsgImxzcmMiLAlPMSwJMCwJMHgzRTAwIH0sCi0gIHsgImxzcmkiLAlTSWEsCTAsCTB4M0UwMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgLSAweDVmZmYgKi8KLSAgeyAibW92aSIsCUk3LAkwLAkweDYwMDAgfSwKLSNkZWZpbmUgTUNPUkVfSU5TVF9CTUFTS0lfQUxUCTB4NjAwMAotI2RlZmluZSBNQ09SRV9JTlNUX0JHRU5JX0FMVAkweDYwMDAKLSAgeyAibXVsc2giLCAgICBNVUxTSCwgIDAsICAgICAgMHg2ODAwIH0sCi0gIHsgIm11bHMuaCIsICAgTVVMU0gsICAwLCAgICAgIDB4NjgwMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDY5MDAgLSAweDZGRkYgKi8KLSAgeyAiam1waSIsCUxKLAkxLAkweDcwMDAgfSwKLSAgeyAianNyaSIsCUxKLAkwLAkweDdGMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KTVBJCTB4NzAwMAotICB7ICJscnciLAlMUiwJMCwJMHg3MDAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfSlNSSQkweDdGMDAKLSAgeyAibGQiLAlMUywJMCwJMHg4MDAwIH0sCi0gIHsgImxkdyIsCUxTLAkwLAkweDgwMDAgfSwKLSAgeyAibGQudyIsCUxTLAkwLAkweDgwMDAgfSwKLSAgeyAic3QiLAlMUywJMCwJMHg5MDAwIH0sCi0gIHsgInN0dyIsCUxTLAkwLAkweDkwMDAgfSwKLSAgeyAic3QudyIsCUxTLAkwLAkweDkwMDAgfSwKLSAgeyAibGRiIiwJTFMsCTAsCTB4QTAwMCB9LAotICB7ICJsZC5iIiwJTFMsCTAsCTB4QTAwMCB9LAotICB7ICJzdGIiLAlMUywJMCwJMHhCMDAwIH0sCi0gIHsgInN0LmIiLAlMUywJMCwJMHhCMDAwIH0sCi0gIHsgImxkaCIsCUxTLAkwLAkweEMwMDAgfSwKLSAgeyAibGQuaCIsCUxTLAkwLAkweEMwMDAgfSwKLSAgeyAic3RoIiwJTFMsCTAsCTB4RDAwMCB9LAotICB7ICJzdC5oIiwJTFMsCTAsCTB4RDAwMCB9LAotICB7ICJidCIsCUJSLAkwLAkweEUwMDAgfSwKLSAgeyAiYmYiLAlCUiwJMCwJMHhFODAwIH0sCi0gIHsgImJyIiwJQlIsCTEsCTB4RjAwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0JSCTB4RjAwMAotICB7ICJic3IiLAlCUiwJMCwJMHhGODAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfQlNSCTB4RjgwMAotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSByZWxheGFibGUgYnJhbmNoZXMgKi8KLSAgeyAiamJ0IiwJSkMsCTAsCTB4RTAwMCB9LAotICB7ICJqYmYiLAlKQywJMCwJMHhFODAwIH0sCi0gIHsgImpiciIsCUpVLAkxLAkweEYwMDAgfSwKLSAgeyAiamJzciIsCUpMLAkwLAkweEY4MDAgfSwKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgYWxpYXNlcyBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zICovCi0gIHsgInJ0cyIsCU8wLAkyLAkweDAwQ0YgfSwgIC8qIGptcCByMTUgKi8KLSAgeyAicm9sYyIsCURPMjEsCTAsCTB4MDYwMCB9LCAgLyogYWRkYyByZCxyZCAqLwotICB7ICJyb3RsYyIsCURPMjEsICAgMCwJMHgwNjAwIH0sICAvKiBhZGRjIHJkLHJkICovCi0gIHsgInNldGMiLAlPMCwJMCwJMHgwQzAwIH0sICAvKiBjbXBocyByMCxyMCAqLwotICB7ICJjbHJjIiwJTzAsCTAsCTB4MEYwMCB9LCAgLyogY21wbmUgcjAscjAgKi8KLSAgeyAidHN0bGUiLAlPMSwJMCwJMHgyMjAwIH0sICAvKiBjbXBsdGkgcmQsMSAqLwotICB7ICJjbXBsZWkiLAlPQiwJMCwJMHgyMjAwIH0sICAvKiBjbXBsZWkgcmQsWCAtPiBjbXBsdGkgcmQsWCsxICovCi0gIHsgIm5lZyIsCU8xLAkwLAkweDI4MDAgfSwgIC8qIHJzdWJpIHJkLDAgKi8KLSAgeyAidHN0bmUiLAlPMSwJMCwJMHgyQTAwIH0sICAvKiBjbXBuZWkgcmQsMCAqLwotICB7ICJ0c3RsdCIsCU8xLAkwLAkweDM3RjAgfSwgIC8qIGJ0c3RpIHJ4LDMxICovCi0gIHsgIm1jbHJpIiwJT0IyLAkwLAkweDMwMDAgfSwgIC8qIGJjbHJpIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJtZ2VuaSIsCU9CUjIsCTAsCTB4MzIwMCB9LCAgLyogYmdlbmkgcngsbG9nMihpbW0pICovCi0gIHsgIm1zZXRpIiwJT0IyLAkwLAkweDM0MDAgfSwgIC8qIGJzZXRpIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJtdHN0aSIsCU9CMiwJMCwJMHgzNjAwIH0sICAvKiBidHN0aSByeCxsb2cyKGltbSkgKi8KLSAgeyAicm9yaSIsCVJTSSwJMCwJMHgzODAwIH0sCi0gIHsgInJvdHJpIiwJUlNJLCAgICAwLAkweDM4MDAgfSwKLSAgeyAibm9wIiwJTzAsICAgICAwLAkweDEyMDAgfSwgIC8qIG1vdiByMCwgcjAgKi8KLSAgeyAwLAkJMCwJMCwgICAgICAwIH0KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvbWlwcy1kaXMuYyBiL29wY29kZXMvbWlwcy1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3NTI2Ni4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21pcHMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ4ICswLDAgQEAKLS8qIFByaW50IG1pcHMgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIsIG9yIGZvciBvYmpkdW1wLgotICAgQ29weXJpZ2h0IChjKSAxOTg5LCA5MS05NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE5vYnV5dWtpIEhpa2ljaGkoaGlraWNoaUBzcmEuY28uanApLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBGSVhNRTogVGhlc2UgYXJlIG5lZWRlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBjb2RlIGlzIG1pcHMxNiBvcgotICAgbm90LiBUaGUgbG93IGJpdCBvZiB0aGUgYWRkcmVzcyBpcyBvZnRlbiBhIGdvb2QgaW5kaWNhdG9yLiAgTm8KLSAgIHN5bWJvbCB0YWJsZSBpcyBhdmFpbGFibGUgd2hlbiB0aGlzIGNvZGUgcnVucyBvdXQgaW4gYW4gZW1iZWRkZWQKLSAgIHN5c3RlbSBhcyB3aGVuIGl0IGlzIHVzZWQgZm9yIGRpc2Fzc2VtYmxlciBzdXBwb3J0IGluIGEgbW9uaXRvci4gKi8KLQotI2lmICFkZWZpbmVkKEVNQkVEREVEX0VOVikKLSNkZWZpbmUgU1lNVEFCX0FWQUlMQUJMRSAxCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0jZW5kaWYKLQotc3RhdGljIGludCBwcmludF9pbnNuX21pcHMxNiBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9taXBzMTZfaW5zbl9hcmcKLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKiwgaW50LCBib29sZWFuLCBpbnQsIGJmZF92bWEsCi0JICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBNaXBzIGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcyBtYW55IGJ5dGVzLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDQKLQotc3RhdGljIHZvaWQgcHJpbnRfaW5zbl9hcmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hLAotCQkJCSAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IF9wcmludF9pbnNuX21pcHMgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgbG9uZyBpbnQsCi0JCQkJICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLQwKLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBnZGIgc29tZWhvdy4gICovCi0jZGVmaW5lIFJFR0lTVEVSX05BTUVTIAlcCi0gICAgewkiemVybyIsCSJhdCIsCSJ2MCIsCSJ2MSIsCSJhMCIsCSJhMSIsCSJhMiIsCSJhMyIsIFwKLQkidDAiLAkidDEiLAkidDIiLAkidDMiLAkidDQiLAkidDUiLAkidDYiLAkidDciLCBcCi0JInMwIiwJInMxIiwJInMyIiwJInMzIiwJInM0IiwJInM1IiwJInM2IiwJInM3IiwgXAotCSJ0OCIsCSJ0OSIsCSJrMCIsCSJrMSIsCSJncCIsCSJzcCIsCSJzOCIsCSJyYSIsIFwKLQkic3IiLAkibG8iLAkiaGkiLAkiYmFkIiwJImNhdXNlIiwicGMiLCAgICBcCi0JImYwIiwgICAiZjEiLCAgICJmMiIsICAgImYzIiwgICAiZjQiLCAgICJmNSIsICAgImY2IiwgICAiZjciLCBcCi0JImY4IiwgICAiZjkiLCAgICJmMTAiLCAgImYxMSIsICAiZjEyIiwgICJmMTMiLCAgImYxNCIsICAiZjE1IiwgXAotCSJmMTYiLCAgImYxNyIsICAiZjE4IiwgICJmMTkiLCAgImYyMCIsICAiZjIxIiwgICJmMjIiLCAgImYyMyIsXAotCSJmMjQiLCAgImYyNSIsICAiZjI2IiwgICJmMjciLCAgImYyOCIsICAiZjI5IiwgICJmMzAiLCAgImYzMSIsXAotCSJmc3IiLCAgImZpciIsICAiZnAiLCAgICJpbngiLCAgInJhbmQiLCAidGxibG8iLCJjdHh0IiwgInRsYmhpIixcCi0JImVwYyIsICAicHJpZCJcCi0gICAgfQotCi1zdGF0aWMgQ09OU1QgY2hhciAqIENPTlNUIHJlZ19uYW1lc1tdID0gUkVHSVNURVJfTkFNRVM7Ci0KLS8qIFRoZSBtaXBzMTYgcmVnaXN0ZXIgbmFtZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzMTZfcmVnX25hbWVzW10gPQotewotICAiczAiLCAiczEiLCAidjAiLCAidjEiLCAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiCi19OwotDAotLyogc3Vicm91dGluZSAqLwotc3RhdGljIHZvaWQKLXByaW50X2luc25fYXJnIChkLCBsLCBwYywgaW5mbykKLSAgICAgY29uc3QgY2hhciAqZDsKLSAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgbDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBkZWx0YTsKLQotICBzd2l0Y2ggKCpkKQotICAgIHsKLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICcoJzoKLSAgICBjYXNlICcpJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCAqZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ2InOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ3YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbKGwgPj4gT1BfU0hfUlMpICYgT1BfTUFTS19SU10pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICBjYXNlICd3JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzWyhsID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlRdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaSc6Ci0gICAgY2FzZSAndSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJKGwgPj4gT1BfU0hfSU1NRURJQVRFKSAmIE9QX01BU0tfSU1NRURJQVRFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaic6IC8qIHNhbWUgYXMgaSwgYnV0IHNpZ24tZXh0ZW5kZWQgKi8KLSAgICBjYXNlICdvJzoKLSAgICAgIGRlbHRhID0gKGwgPj4gT1BfU0hfREVMVEEpICYgT1BfTUFTS19ERUxUQTsKLSAgICAgIGlmIChkZWx0YSAmIDB4ODAwMCkKLQlkZWx0YSB8PSB+MHhmZmZmOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkgICAgIGRlbHRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAodW5zaWduZWQgaW50KSAoKGwgPj4gT1BfU0hfUFJFRlgpCi0JCQkJCSAgICAgJiBPUF9NQVNLX1BSRUZYKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKHVuc2lnbmVkIGludCkgKChsID4+IE9QX1NIX0NBQ0hFKQotCQkJCQkgICAgICYgT1BfTUFTS19DQUNIRSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdhJzoKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCSgoKHBjICYgMHhGMDAwMDAwMCkgfCAoKChsID4+IE9QX1NIX1RBUkdFVCkgJiBPUF9NQVNLX1RBUkdFVCkgPDwgMikpLAotCSBpbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgICAvKiBzaWduIGV4dGVuZCB0aGUgZGlzcGxhY2VtZW50ICovCi0gICAgICBkZWx0YSA9IChsID4+IE9QX1NIX0RFTFRBKSAmIE9QX01BU0tfREVMVEE7Ci0gICAgICBpZiAoZGVsdGEgJiAweDgwMDApCi0JZGVsdGEgfD0gfjB4ZmZmZjsKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCSgoZGVsdGEgPDwgMikgKyBwYyArIDQsCi0JIGluZm8pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzWyhsID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkRdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1swXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzwnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfU0hBTVQpICYgT1BfTUFTS19TSEFNVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQ09ERSkgJiBPUF9NQVNLX0NPREUpOwotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgJ3EnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQ09ERTIpICYgT1BfTUFTS19DT0RFMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQ09QWikgJiBPUF9NQVNLX0NPUFopOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdCJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1NZU0NBTEwpICYgT1BfTUFTS19TWVNDQUxMKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgY2FzZSAnVic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9GUykgJiBPUF9NQVNLX0ZTKTsKLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlICdUJzoKLSAgICBjYXNlICdXJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGYlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0ZUKSAmIE9QX01BU0tfRlQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdEJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGYlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0ZEKSAmIE9QX01BU0tfRkQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGYlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0ZSKSAmIE9QX01BU0tfRlIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdFJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmY2MlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0JDQykgJiBPUF9NQVNLX0JDQyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ00nOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZmNjJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9DQ0MpICYgT1BfTUFTS19DQ0MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdQJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9QRVJGUkVHKSAmIE9QX01BU0tfUEVSRlJFRyk7Ci0gICAgICBicmVhazsKLQotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwKLQkJCSAgICAgXygiIyBpbnRlcm5hbCBlcnJvciwgdW5kZWZpbmVkIG1vZGlmaWVyKCVjKSIpLAotCQkJICAgICAqZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0jaWYgU1lNVEFCX0FWQUlMQUJMRQotCi0vKiBGaWd1cmUgb3V0IHRoZSBNSVBTIElTQSBhbmQgQ1BVIGJhc2VkIG9uIHRoZSBtYWNoaW5lIG51bWJlci4KLSAgIEZJWE1FOiBXaGF0IGRvZXMgdGhpcyBoYXZlIHRvIGRvIHdpdGggU1lNVEFCX0FWQUlMQUJMRT8gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfbWlwc19pc2FfdHlwZSAobWFjaCwgaXNhLCBjcHV0eXBlKQotICAgICBpbnQgbWFjaDsKLSAgICAgaW50ICppc2E7Ci0gICAgIGludCAqY3B1dHlwZTsKLXsKLSAgaW50IHRhcmdldF9wcm9jZXNzb3IgPSAwOwotICBpbnQgbWlwc19pc2EgPSAwOwotCi0gIHN3aXRjaCAobWFjaCkKLSAgICB7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHMzMDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSAzMDAwOwotCW1pcHNfaXNhID0gMTsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczM5MDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDM5MDA7Ci0JbWlwc19pc2EgPSAxOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDAwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDEwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MDEwOwotCW1pcHNfaXNhID0gMjsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQxMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDExMToKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDEwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MzAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MzAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQ0MDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQ0MDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDYwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDYwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjUwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0NjUwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczUwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDUwMDA7Ci0JbWlwc19pc2EgPSA0OwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNjAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNjAwMDsKLQltaXBzX2lzYSA9IDI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM4MDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA4MDAwOwotCW1pcHNfaXNhID0gNDsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczEwMDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSAxMDAwMDsKLQltaXBzX2lzYSA9IDQ7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHMxNjoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMTY7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMzAwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0KLSAgICB9Ci0KLSAgKmlzYSA9IG1pcHNfaXNhOwotICAqY3B1dHlwZSA9IHRhcmdldF9wcm9jZXNzb3I7Ci19Ci0KLSNlbmRpZiAvKiBTWU1UQUJfQVZBSUxBQkxFICovCi0KLS8qIFByaW50IHRoZSBtaXBzIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiB1c2luZyBJTkZPLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcywgd2hpY2ggaXMKLSAgIGFsd2F5cyA0LiAgQklHRU5ESUFOIG11c3QgYmUgMSBpZiB0aGlzIGlzIGJpZy1lbmRpYW4gY29kZSwgMCBpZgotICAgdGhpcyBpcyBsaXR0bGUtZW5kaWFuIGNvZGUuICAqLwotCi1zdGF0aWMgaW50Ci1fcHJpbnRfaW5zbl9taXBzIChtZW1hZGRyLCB3b3JkLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW50IHdvcmQ7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wOwotICBpbnQgdGFyZ2V0X3Byb2Nlc3NvciwgbWlwc19pc2E7Ci0gIHN0YXRpYyBib29sZWFuIGluaXQgPSAwOwotICBzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX2hhc2hbT1BfTUFTS19PUCArIDFdOwotCi0gIC8qIEJ1aWxkIGEgaGFzaCB0YWJsZSB0byBzaG9ydGVuIHRoZSBzZWFyY2ggdGltZS4gICovCi0gIGlmICghIGluaXQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPD0gT1BfTUFTS19PUDsgaSsrKQotCXsKLQkgIGZvciAob3AgPSBtaXBzX29wY29kZXM7IG9wIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXTsgb3ArKykKLQkgICAgewotCSAgICAgIGlmIChvcC0+cGluZm8gPT0gSU5TTl9NQUNSTykKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGkgPT0gKChvcC0+bWF0Y2ggPj4gT1BfU0hfT1ApICYgT1BfTUFTS19PUCkpCi0JCXsKLQkJICBtaXBzX2hhc2hbaV0gPSBvcDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0gICAgICAgIH0KLQotICAgICAgaW5pdCA9IDE7Ci0gICAgfQotCi0jaWYgISBTWU1UQUJfQVZBSUxBQkxFCi0gIC8qIFRoaXMgaXMgcnVubmluZyBvdXQgb24gYSB0YXJnZXQgbWFjaGluZSwgbm90IGluIGEgaG9zdCB0b29sLgotICAgICBGSVhNRTogV2hlcmUgZG9lcyBtaXBzX3RhcmdldF9pbmZvIGNvbWUgZnJvbT8gICovCi0gIHRhcmdldF9wcm9jZXNzb3IgPSBtaXBzX3RhcmdldF9pbmZvLnByb2Nlc3NvcjsKLSAgbWlwc19pc2EgPSBtaXBzX3RhcmdldF9pbmZvLmlzYTsKLSNlbHNlICAKLSAgc2V0X21pcHNfaXNhX3R5cGUgKGluZm8tPm1hY2gsICZtaXBzX2lzYSwgJnRhcmdldF9wcm9jZXNzb3IpOwotI2VuZGlmICAKLQotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IGluZm8tPmVuZGlhbjsKLQotICBvcCA9IG1pcHNfaGFzaFsod29yZCA+PiBPUF9TSF9PUCkgJiBPUF9NQVNLX09QXTsKLSAgaWYgKG9wICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yICg7IG9wIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXTsgb3ArKykKLQl7Ci0JICBpZiAob3AtPnBpbmZvICE9IElOU05fTUFDUk8gJiYgKHdvcmQgJiBvcC0+bWFzaykgPT0gb3AtPm1hdGNoKQotCSAgICB7Ci0JICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZDsKLQotCSAgICAgIGlmICghIE9QQ09ERV9JU19NRU1CRVIgKG9wLCBtaXBzX2lzYSwgdGFyZ2V0X3Byb2Nlc3NvciwgMCkpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wLT5uYW1lKTsKLQotCSAgICAgIGQgPSBvcC0+YXJnczsKLQkgICAgICBpZiAoZCAhPSBOVUxMICYmICpkICE9ICdcMCcpCi0JCXsKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQkJICBmb3IgKDsgKmQgIT0gJ1wwJzsgZCsrKQotCQkgICAgICBwcmludF9pbnNuX2FyZyAoZCwgd29yZCwgbWVtYWRkciwgaW5mbyk7Ci0JCX0KLQotCSAgICAgIHJldHVybiA0OwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIHdvcmQpOwotICByZXR1cm4gNDsKLX0KLQotCi0vKiBJbiBhbiBlbnZpcm9ubWVudCB3aGVyZSB3ZSBkbyBub3Qga25vdyB0aGUgc3ltYm9sIHR5cGUgb2YgdGhlCi0gICBpbnN0cnVjdGlvbiB3ZSBhcmUgZm9yY2VkIHRvIGFzc3VtZSB0aGF0IHRoZSBsb3cgb3JkZXIgYml0IG9mIHRoZQotICAgaW5zdHJ1Y3Rpb25zJyBhZGRyZXNzIG1heSBtYXJrIGl0IGFzIGEgbWlwczE2IGluc3RydWN0aW9uLiAgSWYgd2UKLSAgIGFyZSBzaW5nbGUgc3RlcHBpbmcsIG9yIHRoZSBwYyBpcyB3aXRoaW4gdGhlIGRpc2Fzc2VtYmxlZCBmdW5jdGlvbiwKLSAgIHRoaXMgd29ya3MuICBPdGhlcndpc2UsIHdlIG5lZWQgYSBjbHVlLiAgU29tZXRpbWVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2JpZ19taXBzIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0KLSNpZiAxCi0gIC8qIEZJWE1FOiBJZiBvZGQgYWRkcmVzcywgdGhpcyBpcyBDTEVBUkxZIGEgbWlwcyAxNiBpbnN0cnVjdGlvbi4gICovCi0gIC8qIE9ubHkgYSBmZXcgdG9vbHMgd2lsbCB3b3JrIHRoaXMgd2F5LiAgKi8KLSAgaWYgKG1lbWFkZHIgJiAweDAxKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0jaWYgU1lNVEFCX0FWQUlMQUJMRQotICBpZiAoaW5mby0+bWFjaCA9PSAxNgotICAgICAgfHwgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgaW5mby0+c3ltYm9scyAhPSBOVUxMCi0JICAmJiAoKCooZWxmX3N5bWJvbF90eXBlICoqKSBpbmZvLT5zeW1ib2xzKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcgotCSAgICAgID09IFNUT19NSVBTMTYpKSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgcmV0dXJuIF9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0YjMyIChidWZmZXIpLAotCQkJICAgICBpbmZvKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotaW50Ci1wcmludF9pbnNuX2xpdHRsZV9taXBzIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0KLQotI2lmIDEKLSAgaWYgKG1lbWFkZHIgJiAweDAxKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0jaWYgU1lNVEFCX0FWQUlMQUJMRQotICBpZiAoaW5mby0+bWFjaCA9PSAxNgotICAgICAgfHwgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgaW5mby0+c3ltYm9scyAhPSBOVUxMCi0JICAmJiAoKCooZWxmX3N5bWJvbF90eXBlICoqKSBpbmZvLT5zeW1ib2xzKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcgotCSAgICAgID09IFNUT19NSVBTMTYpKSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgcmV0dXJuIF9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0bDMyIChidWZmZXIpLAotCQkJICAgICBpbmZvKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQwKLS8qIERpc2Fzc2VtYmxlIG1pcHMxNiBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotICBpbnQgbGVuZ3RoOwotICBpbnQgaW5zbjsKLSAgYm9vbGVhbiB1c2VfZXh0ZW5kOwotICBpbnQgZXh0ZW5kID0gMDsKLSAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcCwgKm9wZW5kOwotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gaW5mby0+ZW5kaWFuOwotCi0gIGluZm8tPmluc25faW5mb192YWxpZCA9IDE7Ci0gIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDA7Ci0gIGluZm8tPmRhdGFfc2l6ZSA9IDA7Ci0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25icmFuY2g7Ci0gIGluZm8tPnRhcmdldCA9IDA7Ci0gIGluZm8tPnRhcmdldDIgPSAwOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgbGVuZ3RoID0gMjsKLQotICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICBlbHNlCi0gICAgaW5zbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0KLSAgLyogSGFuZGxlIHRoZSBleHRlbmQgb3Bjb2RlIHNwZWNpYWxseS4gICovCi0gIHVzZV9leHRlbmQgPSBmYWxzZTsKLSAgaWYgKChpbnNuICYgMHhmODAwKSA9PSAweGYwMDApCi0gICAgewotICAgICAgdXNlX2V4dGVuZCA9IHRydWU7Ci0gICAgICBleHRlbmQgPSBpbnNuICYgMHg3ZmY7Ci0KLSAgICAgIG1lbWFkZHIgKz0gMjsKLQotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKLQkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLQlpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotICAgICAgLyogQ2hlY2sgZm9yIGFuIGV4dGVuZCBvcGNvZGUgZm9sbG93ZWQgYnkgYW4gZXh0ZW5kIG9wY29kZS4gICovCi0gICAgICBpZiAoKGluc24gJiAweGY4MDApID09IDB4ZjAwMCkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKLQkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKLQkgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwotCSAgcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLSAgICAgIGxlbmd0aCArPSAyOwotICAgIH0KLQotICAvKiBGSVhNRTogU2hvdWxkIHByb2JhYmx5IHVzZSBhIGhhc2ggdGFibGUgb24gdGhlIG1ham9yIG9wY29kZSBoZXJlLiAgKi8KLQotICBvcGVuZCA9IG1pcHMxNl9vcGNvZGVzICsgYmZkX21pcHMxNl9udW1fb3Bjb2RlczsKLSAgZm9yIChvcCA9IG1pcHMxNl9vcGNvZGVzOyBvcCA8IG9wZW5kOyBvcCsrKQotICAgIHsKLSAgICAgIGlmIChvcC0+cGluZm8gIT0gSU5TTl9NQUNSTyAmJiAoaW5zbiAmIG9wLT5tYXNrKSA9PSBvcC0+bWF0Y2gpCi0JewotCSAgY29uc3QgY2hhciAqczsKLQotCSAgaWYgKHN0cmNociAob3AtPmFyZ3MsICdhJykgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICh1c2VfZXh0ZW5kKQotCQl7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHRlbmQgMHgleCIsCi0JCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOwotCQkgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwotCQkgIHJldHVybiBsZW5ndGggLSAyOwotCQl9Ci0KLQkgICAgICB1c2VfZXh0ZW5kID0gZmFsc2U7Ci0KLQkgICAgICBtZW1hZGRyICs9IDI7Ci0KLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsCi0JCQkJCQkgIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQkJewotCQkgIHVzZV9leHRlbmQgPSB0cnVlOwotCQkgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0JCSAgICBleHRlbmQgPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotCQkgIGVsc2UKLQkJICAgIGV4dGVuZCA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JCSAgbGVuZ3RoICs9IDI7Ci0JCX0KLQkgICAgfQotCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOwotCSAgaWYgKG9wLT5hcmdzWzBdICE9ICdcMCcpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotCSAgZm9yIChzID0gb3AtPmFyZ3M7ICpzICE9ICdcMCc7IHMrKykKLQkgICAgewotCSAgICAgIGlmICgqcyA9PSAnLCcKLQkJICAmJiBzWzFdID09ICd3JwotCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWCkKLQkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JZKSAmIE1JUFMxNk9QX01BU0tfUlkpKSkKLQkJewotCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLwotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmICgqcyA9PSAnLCcKLQkJICAmJiBzWzFdID09ICd2JwotCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWikKLQkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlgpKSkKLQkJewotCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLwotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIHByaW50X21pcHMxNl9pbnNuX2FyZyAoKnMsIG9wLCBpbnNuLCB1c2VfZXh0ZW5kLCBleHRlbmQsIG1lbWFkZHIsCi0JCQkJICAgICBpbmZvKTsKLQkgICAgfQotCi0JICBpZiAoKG9wLT5waW5mbyAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSkgIT0gMCkKLQkgICAgewotCSAgICAgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7Ci0JICAgICAgaWYgKGluZm8tPmluc25fdHlwZSAhPSBkaXNfanNyKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOwotCSAgICB9Ci0KLQkgIHJldHVybiBsZW5ndGg7Ci0JfQotICAgIH0KLQotICBpZiAodXNlX2V4dGVuZCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBleHRlbmQgfCAweGYwMDApOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuKTsKLSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotLyogRGlzYXNzZW1ibGUgYW4gb3BlcmFuZCBmb3IgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfbWlwczE2X2luc25fYXJnICh0eXBlLCBvcCwgbCwgdXNlX2V4dGVuZCwgZXh0ZW5kLCBtZW1hZGRyLCBpbmZvKQotICAgICBpbnQgdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcDsKLSAgICAgaW50IGw7Ci0gICAgIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgICAgaW50IGV4dGVuZDsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICcoJzoKLSAgICBjYXNlICcpJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneSc6Ci0gICAgY2FzZSAndyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JZKQotCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX1JZKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICd2JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUlgpCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfUlgpXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3onOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SWikKLQkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19SWildKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX01PVkUzMlopCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfTU9WRTMyWildKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1swXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMjldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRwYyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzMxXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JFR1IzMikKLQkJCQkJJiBNSVBTMTZPUF9NQVNLX1JFR1IzMildKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1tNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAobCldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPCc6Ci0gICAgY2FzZSAnPic6Ci0gICAgY2FzZSAnWyc6Ci0gICAgY2FzZSAnXSc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnSCc6Ci0gICAgY2FzZSAnVyc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnaic6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnVic6Ci0gICAgY2FzZSAnQyc6Ci0gICAgY2FzZSAnVSc6Ci0gICAgY2FzZSAnayc6Ci0gICAgY2FzZSAnSyc6Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAncSc6Ci0gICAgY2FzZSAnQSc6Ci0gICAgY2FzZSAnQic6Ci0gICAgY2FzZSAnRSc6Ci0gICAgICB7Ci0JaW50IGltbWVkLCBuYml0cywgc2hpZnQsIHNpZ25lZHAsIGV4dGJpdHMsIHBjcmVsLCBleHR1LCBicmFuY2g7Ci0KLQlzaGlmdCA9IDA7Ci0Jc2lnbmVkcCA9IDA7Ci0JZXh0Yml0cyA9IDE2OwotCXBjcmVsID0gMDsKLQlleHR1ID0gMDsKLQlicmFuY2ggPSAwOwotCXN3aXRjaCAodHlwZSkKLQkgIHsKLQkgIGNhc2UgJzwnOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKLQkgICAgZXh0Yml0cyA9IDU7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJz4nOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKLQkgICAgZXh0Yml0cyA9IDU7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1snOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKLQkgICAgZXh0Yml0cyA9IDY7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ10nOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKLQkgICAgZXh0Yml0cyA9IDY7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJzQnOgotCSAgICBuYml0cyA9IDQ7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNCkgJiBNSVBTMTZPUF9NQVNLX0lNTTQ7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBleHRiaXRzID0gMTU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnNSc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnSCc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAxOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gMjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdXJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGlmICgob3AtPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9QQykgPT0gMAotCQkmJiAob3AtPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9TUCkgPT0gMCkKLQkgICAgICB7Ci0JCWluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCQlpbmZvLT5kYXRhX3NpemUgPSA0OwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICBjYXNlICdEJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2onOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJzYnOgotCSAgICBuYml0cyA9IDY7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNikgJiBNSVBTMTZPUF9NQVNLX0lNTTY7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnOCc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdWJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIC8qIEZJWE1FOiBUaGlzIG1pZ2h0IGJlIGx3LCBvciBpdCBtaWdodCBiZSBhZGRpdSB0byAkc3Agb3IKLSAgICAgICAgICAgICAgICRwYy4gIFdlIGFzc3VtZSBpdCdzIGxvYWQuICAqLwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gNDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdDJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1UnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2snOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0snOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIHNoaWZ0ID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAncCc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgYnJhbmNoID0gMTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2NvbmRicmFuY2g7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAncSc6Ci0JICAgIG5iaXRzID0gMTE7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NMTEpICYgTUlQUzE2T1BfTUFTS19JTU0xMTsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgYnJhbmNoID0gMTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdBJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgLyogRklYTUU6IFRoaXMgY2FuIGJlIGx3IG9yIGxhLiAgV2UgYXNzdW1lIGl0IGlzIGx3LiAgKi8KLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnQic6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0UnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgcGNyZWwgPSAxOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotCi0JaWYgKCEgdXNlX2V4dGVuZCkKLQkgIHsKLQkgICAgaWYgKHNpZ25lZHAgJiYgaW1tZWQgPj0gKDEgPDwgKG5iaXRzIC0gMSkpKQotCSAgICAgIGltbWVkIC09IDEgPDwgbmJpdHM7Ci0JICAgIGltbWVkIDw8PSBzaGlmdDsKLQkgICAgaWYgKCh0eXBlID09ICc8JyB8fCB0eXBlID09ICc+JyB8fCB0eXBlID09ICdbJyB8fCB0eXBlID09ICddJykKLQkJJiYgaW1tZWQgPT0gMCkKLQkgICAgICBpbW1lZCA9IDg7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAoZXh0Yml0cyA9PSAxNikKLQkgICAgICBpbW1lZCB8PSAoKGV4dGVuZCAmIDB4MWYpIDw8IDExKSB8IChleHRlbmQgJiAweDdlMCk7Ci0JICAgIGVsc2UgaWYgKGV4dGJpdHMgPT0gMTUpCi0JICAgICAgaW1tZWQgfD0gKChleHRlbmQgJiAweGYpIDw8IDExKSB8IChleHRlbmQgJiAweDdmMCk7Ci0JICAgIGVsc2UKLQkgICAgICBpbW1lZCA9ICgoZXh0ZW5kID4+IDYpICYgMHgxZikgfCAoZXh0ZW5kICYgMHgyMCk7Ci0JICAgIGltbWVkICY9ICgxIDw8IGV4dGJpdHMpIC0gMTsKLQkgICAgaWYgKCEgZXh0dSAmJiBpbW1lZCA+PSAoMSA8PCAoZXh0Yml0cyAtIDEpKSkKLQkgICAgICBpbW1lZCAtPSAxIDw8IGV4dGJpdHM7Ci0JICB9Ci0KLQlpZiAoISBwY3JlbCkKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbW1lZCk7Ci0JZWxzZQotCSAgewotCSAgICBiZmRfdm1hIGJhc2VhZGRyOwotCSAgICBiZmRfdm1hIHZhbDsKLQotCSAgICBpZiAoYnJhbmNoKQotCSAgICAgIHsKLQkJaW1tZWQgKj0gMjsKLQkJYmFzZWFkZHIgPSBtZW1hZGRyICsgMjsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHVzZV9leHRlbmQpCi0JICAgICAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gMjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW50IHN0YXR1czsKLQkJYmZkX2J5dGUgYnVmZmVyWzJdOwotCi0JCWJhc2VhZGRyID0gbWVtYWRkcjsKLQotCQkvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGEganIKLSAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICBqciBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGphbHIKLSAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICBqYWxyIGluc3RydWN0aW9uLiAgVGhpcyB0ZXN0IGlzIHVucmVsaWFibGU6IHdlIGhhdmUKLSAgICAgICAgICAgICAgICAgICBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBwcmV2aW91cyB3b3JkIGlzCi0gICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gb3IgZGF0YS4gICovCi0JCXN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSA0LCBidWZmZXIsIDIsCi0JCQkJCQkgICAgaW5mbyk7Ci0JCWlmIChzdGF0dXMgPT0gMAotCQkgICAgJiYgKCgoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCi0JCQkgID8gYmZkX2dldGIxNiAoYnVmZmVyKQotCQkJICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCi0JCQkgJiAweGY4MDApID09IDB4MTgwMCkpCi0JCSAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gNDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSAyLCBidWZmZXIsCi0JCQkJCQkJMiwgaW5mbyk7Ci0JCSAgICBpZiAoc3RhdHVzID09IDAKLQkJCSYmICgoKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQkJICAgICAgPyBiZmRfZ2V0YjE2IChidWZmZXIpCi0JCQkgICAgICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCi0JCQkgICAgICYgMHhmODFmKSA9PSAweGU4MDApKQotCQkgICAgICBiYXNlYWRkciA9IG1lbWFkZHIgLSAyOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIHZhbCA9IChiYXNlYWRkciAmIH4gKCgxIDw8IHNoaWZ0KSAtIDEpKSArIGltbWVkOwotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCwgaW5mbyk7Ci0JICAgIGluZm8tPnRhcmdldCA9IHZhbDsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICBpZiAoISB1c2VfZXh0ZW5kKQotCWV4dGVuZCA9IDA7Ci0gICAgICBsID0gKChsICYgMHgxZikgPDwgMjMpIHwgKChsICYgMHgzZTApIDw8IDEzKSB8IChleHRlbmQgPDwgMik7Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyICYgMHhmMDAwMDAwMCkgfCBsLCBpbmZvKTsKLSAgICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19qc3I7Ci0gICAgICBpbmZvLT50YXJnZXQgPSAobWVtYWRkciAmIDB4ZjAwMDAwMDApIHwgbDsKLSAgICAgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2wnOgotICAgIGNhc2UgJ0wnOgotICAgICAgewotCWludCBuZWVkX2NvbW1hLCBhbWFzaywgc21hc2s7Ci0KLQluZWVkX2NvbW1hID0gMDsKLQotCWwgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU02KSAmIE1JUFMxNk9QX01BU0tfSU1NNjsKLQotCWFtYXNrID0gKGwgPj4gMykgJiA3OwotCi0JaWYgKGFtYXNrID4gMCAmJiBhbWFzayA8IDUpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzRdKTsKLQkgICAgaWYgKGFtYXNrID4gMSkKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0kJXMiLAotCQkJCSAgICAgcmVnX25hbWVzW2FtYXNrICsgM10pOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQotCXNtYXNrID0gKGwgPj4gMSkgJiAzOwotCWlmIChzbWFzayA9PSAzKQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzPz8iLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIik7Ci0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgfQotCWVsc2UgaWYgKHNtYXNrID4gMCkKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyQlcyIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiLAotCQkJCSAgIHJlZ19uYW1lc1sxNl0pOwotCSAgICBpZiAoc21hc2sgPiAxKQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSQlcyIsCi0JCQkJICAgICByZWdfbmFtZXNbc21hc2sgKyAxNV0pOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQotCWlmIChsICYgMSkKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyQlcyIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiLAotCQkJCSAgIHJlZ19uYW1lc1szMV0pOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQotCWlmIChhbWFzayA9PSA1IHx8IGFtYXNrID09IDYpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMkZjAiLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIik7Ci0JICAgIGlmIChhbWFzayA9PSA2KQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSRmMSIpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzLW9wYy5jIGIvb3Bjb2Rlcy9taXBzLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2RkODMzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWlwcy1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDgzNiArMCwwIEBACi0vKiBtaXBzLmguICBNaXBzIG9wY29kZSBsaXN0IGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJhbHBoIENhbXBiZWxsIGFuZCBPU0YKLSAgIENvbW1lbnRlZCBhbmQgbW9kaWZpZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotCi0vKiBTaG9ydCBoYW5kIHNvIHRoZSBsaW5lcyBhcmVuJ3QgdG9vIGxvbmcuICAqLwotCi0jZGVmaW5lIExERCAgICAgSU5TTl9MT0FEX01FTU9SWV9ERUxBWQotI2RlZmluZSBMQ0QJSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQotI2RlZmluZSBVQkQgICAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotI2RlZmluZSBDQkQJSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotI2RlZmluZSBDT0QgICAgIElOU05fQ09QUk9DX01PVkVfREVMQVkKLSNkZWZpbmUgQ0xECUlOU05fQ09QUk9DX01FTU9SWV9ERUxBWQotI2RlZmluZSBDQkwJSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkKLSNkZWZpbmUgVFJBUAlJTlNOX1RSQVAKLSNkZWZpbmUgU00JSU5TTl9TVE9SRV9NRU1PUlkKLQotI2RlZmluZSBXUl9kICAgIElOU05fV1JJVEVfR1BSX0QKLSNkZWZpbmUgV1JfdCAgICBJTlNOX1dSSVRFX0dQUl9UCi0jZGVmaW5lIFdSXzMxICAgSU5TTl9XUklURV9HUFJfMzEgICAgICAgCi0jZGVmaW5lIFdSX0QgICAgSU5TTl9XUklURV9GUFJfRCAgICAgICAgCi0jZGVmaW5lIFdSX1QJSU5TTl9XUklURV9GUFJfVAotI2RlZmluZSBXUl9TCUlOU05fV1JJVEVfRlBSX1MKLSNkZWZpbmUgUkRfcyAgICBJTlNOX1JFQURfR1BSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfYiAgICBJTlNOX1JFQURfR1BSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfdCAgICBJTlNOX1JFQURfR1BSX1QgICAgICAgICAKLSNkZWZpbmUgUkRfUyAgICBJTlNOX1JFQURfRlBSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfVCAgICBJTlNOX1JFQURfRlBSX1QgICAgICAgICAKLSNkZWZpbmUgUkRfUglJTlNOX1JFQURfRlBSX1IKLSNkZWZpbmUgV1JfQ0MJSU5TTl9XUklURV9DT05EX0NPREUKLSNkZWZpbmUgUkRfQ0MJSU5TTl9SRUFEX0NPTkRfQ09ERQotI2RlZmluZSBSRF9DMCAgIElOU05fQ09QCi0jZGVmaW5lIFJEX0MxCUlOU05fQ09QCi0jZGVmaW5lIFJEX0MyICAgSU5TTl9DT1AKLSNkZWZpbmUgUkRfQzMgICBJTlNOX0NPUAotI2RlZmluZSBXUl9DMCAgIElOU05fQ09QCi0jZGVmaW5lIFdSX0MxCUlOU05fQ09QCi0jZGVmaW5lIFdSX0MyICAgSU5TTl9DT1AKLSNkZWZpbmUgV1JfQzMgICBJTlNOX0NPUAotCi0jZGVmaW5lIFdSX0hJCUlOU05fV1JJVEVfSEkKLSNkZWZpbmUgUkRfSEkJSU5TTl9SRUFEX0hJCi0jZGVmaW5lIE1PRF9ISSAgV1JfSEl8UkRfSEkKLQotI2RlZmluZSBXUl9MTwlJTlNOX1dSSVRFX0xPCi0jZGVmaW5lIFJEX0xPCUlOU05fUkVBRF9MTwotI2RlZmluZSBNT0RfTE8gIFdSX0xPfFJEX0xPCi0KLSNkZWZpbmUgV1JfSElMTyBXUl9ISXxXUl9MTwotI2RlZmluZSBSRF9ISUxPIFJEX0hJfFJEX0xPCi0jZGVmaW5lIE1PRF9ISUxPIFdSX0hJTE98UkRfSElMTwotCi0jZGVmaW5lIElTX00gICAgSU5TTl9NVUxUCi0KLSNkZWZpbmUgSTEJSU5TTl9JU0ExCi0jZGVmaW5lIEkyCUlOU05fSVNBMgotI2RlZmluZSBJMwlJTlNOX0lTQTMKLSNkZWZpbmUgSTQJSU5TTl9JU0E0Ci0jZGVmaW5lIEk1CUlOU05fSVNBNQotI2RlZmluZSBQMwlJTlNOXzQ2NTAKLSNkZWZpbmUgTDEJSU5TTl80MDEwCi0jZGVmaW5lIFYxICAgICAgSU5TTl80MTAwCi0jZGVmaW5lIFQzICAgICAgSU5TTl8zOTAwCi0KLSNkZWZpbmUgRzEgICAgICAoVDMgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgRzIgICAgICAoVDMgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgRzMgKEk0ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICkKLQotI2RlZmluZSBHNiAgICAgIElOU05fR1AzMgotCi0jZGVmaW5lIE0xICAgICAgMAotI2RlZmluZSBNMiAgICAgIDAKLQotLyogVGhlIG9yZGVyIG9mIG92ZXJsb2FkZWQgaW5zdHJ1Y3Rpb25zIG1hdHRlcnMuICBMYWJlbCBhcmd1bWVudHMgYW5kCi0gICByZWdpc3RlciBhcmd1bWVudHMgbG9vayB0aGUgc2FtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgZWl0aGVyCi0gICBmb3IgYXJndW1lbnRzIG11c3QgYXBlYXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhpcyB0YWJsZSBmb3IgdGhlCi0gICBhc3NlbWJsZXIgdG8gcGljayB0aGUgcmlnaHQgb25lLiBJbiBvdGhlciB3b3JkcywgZW50cmllcyB3aXRoCi0gICBpbW1lZGlhdGUgb3BlcmFuZHMgbXVzdCBhcGVhciBhZnRlciB0aGUgc2FtZSBpbnN0cnVjdGlvbiB3aXRoCi0gICByZWdpc3RlcnMuCi0KLSAgIE1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCBoYW5kIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKGkuZS4sIFRoZQotICAgamFsIDxyZWdpc3Rlcj4gaW5zdHJ1Y3Rpb24gaXMgc2hvcnQgZm9yIGphbHIgPHJlZ2lzdGVyPikuICAqLwotCi1jb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwc19idWlsdGluX29wY29kZXNbXSA9IHsKLS8qIFRoZXNlIGluc3RydWN0aW9ucyBhcHBlYXIgZmlyc3Qgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgZmluZAotICAgdGhlbSBmaXJzdC4gIFRoZSBhc3NlbWJsZXJzIHVzZXMgYSBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZQotICAgaW5zdHJ1Y3Rpb24gbmFtZSBhbnlob3cuICAqLwotLyogbmFtZSwJYXJncywJbWFzaywJCW1hdGNoLAlwaW5mbyAqLwoteyJub3AiLCAgICAgIiIsCQkweDAwMDAwMDAwLCAweGZmZmZmZmZmLAkwLAkJSTEJfSwKLXsibGkiLCAgICAgICJ0LGoiLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCQlJMQl9LCAvKiBhZGRpdSAqLwoteyJsaSIsCSAgICAidCxpIiwJMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJCUkxCX0sIC8qIG9yaSAqLwoteyJsaSIsICAgICAgInQsSSIsCTAsICAgIChpbnQpIE1fTEksCUlOU05fTUFDUk8sCUkxCX0sCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyNSwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLAlJMXxHNgl9LC8qIG9yICovCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyZCwgMHhmYzFmMDdmZiwgV1JfZHxSRF9zLAlJMwl9LC8qIGRhZGR1ICovCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyMSwgMHhmYzFmMDdmZiwgV1JfZHxSRF9zLAlJMQl9LC8qIGFkZHUgKi8KLXsibW92ZSIsICAgICJkLHMiLAkweDAwMDAwMDI1LCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsCUkxCX0sLyogb3IgKi8KLXsiYiIsICAgICAgICJwIiwJMHgxMDAwMDAwMCwgMHhmZmZmMDAwMCwJVUJELAkJSTEJfSwvKiBiZXEgMCwwICovCi17ImIiLCAgICAgICAicCIsCTB4MDQwMTAwMDAsIDB4ZmZmZjAwMDAsCVVCRCwJCUkxCX0sLyogYmdleiAwICovCi17ImJhbCIsICAgICAicCIsCTB4MDQxMTAwMDAsIDB4ZmZmZjAwMDAsCVVCRHxXUl8zMSwJSTEJfSwvKiBiZ2V6YWwgMCovCi0KLXsiYWJzIiwgICAgICJkLHYiLAkwLCAgICAoaW50KSBNX0FCUywJSU5TTl9NQUNSTywJSTEJfSwKLXsiYWJzLnMiLCAgICJELFYiLAkweDQ2MDAwMDA1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsiYWJzLmQiLCAgICJELFYiLAkweDQ2MjAwMDA1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsiYWJzLnBzIiwgICJELFYiLAkweDQ2YzAwMDA1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTUJfSwKLXsiYWRkIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjAsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJhZGQiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9BRERfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYWRkLnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxfSwKLXsiYWRkLmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxfSwKLXsiYWRkLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLXsiYWRkaSIsICAgICJ0LHIsaiIsCTB4MjAwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsiYWRkaXUiLCAgICJ0LHIsaiIsCTB4MjQwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsiYWRkdSIsICAgICJkLHYsdCIsCTB4MDAwMDAwMjEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJhZGR1IiwgICAgInQscixJIiwJMCwgICAgKGludCkgTV9BRERVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImFsbnYucHMiLCAiRCxWLFQscyIsCTB4NGMwMDAwMWUsIDB4ZmMwMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLXsiYW5kIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJhbmQiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9BTkRfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYW5kaSIsICAgICJ0LHIsaSIsCTB4MzAwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLS8qIGIgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUuICAqLwotLyogYmFsIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHRhYmxlLiAgKi8KLXsiYmMwZiIsICAgICJwIiwJMHg0MTAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzBmbCIsICAgInAiLAkweDQxMDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjMWYiLCAgICAicCIsCTB4NDUwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJMXxNMQl9LAoteyJiYzFmIiwgICAgIk4scCIsCTB4NDUwMDAwMDAsIDB4ZmZlMzAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJNHxNMQl9LAoteyJiYzFmbCIsICAgInAiLAkweDQ1MDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0N8RlBfUywJSTJ8VDN8TTF9LAoteyJiYzFmbCIsICAgIk4scCIsCTB4NDUwMjAwMDAsIDB4ZmZlMzAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJNHxNMQl9LAoteyJiYzJmIiwgICAgInAiLAkweDQ5MDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjMmZsIiwgICAicCIsCTB4NDkwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMzZiIsICAgICJwIiwJMHg0ZDAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzNmbCIsICAgInAiLAkweDRkMDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjMHQiLCAgICAicCIsCTB4NDEwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMwdGwiLCAgICJwIiwJMHg0MTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzF0IiwgICAgInAiLAkweDQ1MDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTEJfSwKLXsiYmMxdCIsICAgICJOLHAiLAkweDQ1MDEwMDAwLCAweGZmZTMwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTQJfSwKLXsiYmMxdGwiLCAgICJwIiwJMHg0NTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUkyfFQzCX0sCi17ImJjMXRsIiwgICAiTixwIiwJMHg0NTAzMDAwMCwgMHhmZmUzMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUk0CX0sCi17ImJjMnQiLCAgICAicCIsCTB4NDkwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMydGwiLCAgICJwIiwJMHg0OTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzN0IiwgICAgInAiLAkweDRkMDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjM3RsIiwgICAicCIsCTB4NGQwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmVxeiIsICAgICJzLHAiLAkweDEwMDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmVxemwiLCAgICJzLHAiLAkweDUwMDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmVxIiwgICAgICJzLHQscCIsCTB4MTAwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCRHxSRF9zfFJEX3QsCUkxCX0sCi17ImJlcSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JFUV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZXFsIiwgICAgInMsdCxwIiwJMHg1MDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JMfFJEX3N8UkRfdCwJSTJ8VDMJfSwKLXsiYmVxbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkVRTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2UiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0UsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ2VsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0VMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2VsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZXUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZXUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmdldWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZXVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRVVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZXoiLCAgICAicyxwIiwJMHgwNDAxMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJnZXpsIiwgICAicyxwIiwJMHgwNDAzMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJnZXphbCIsICAicyxwIiwJMHgwNDExMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3N8V1JfMzEsCUkxCX0sCi17ImJnZXphbGwiLCAicyxwIiwJMHgwNDEzMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJndCIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVCwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0IiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJndGwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVEwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJndGwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVExfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0dSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdUVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0dSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ3R1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RVTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0dWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0eiIsICAgICJzLHAiLAkweDFjMDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmd0emwiLCAgICJzLHAiLAkweDVjMDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmxlIiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGUiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmxlbCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmxlbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGV1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEVVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGV1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsZXVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRVVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGV1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGV6IiwgICAgInMscCIsCTB4MTgwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJibGV6bCIsICAgInMscCIsCTB4NTgwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibHQiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFQsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdCIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibHRsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFRMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibHRsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdHUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVFUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdHUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmx0dWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxUVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdHVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVFVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdHoiLCAgICAicyxwIiwJMHgwNDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJsdHpsIiwgICAicyxwIiwJMHgwNDAyMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJsdHphbCIsICAicyxwIiwJMHgwNDEwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3N8V1JfMzEsCUkxCX0sCi17ImJsdHphbGwiLCAicyxwIiwJMHgwNDEyMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJuZXoiLCAgICAicyxwIiwJMHgxNDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJuZXpsIiwgICAicyxwIiwJMHg1NDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJuZSIsICAgICAicyx0LHAiLAkweDE0MDAwMDAwLCAweGZjMDAwMDAwLAlDQkR8UkRfc3xSRF90LAlJMQl9LAoteyJibmUiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTkVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYm5lbCIsICAgICJzLHQscCIsCTB4NTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCTHxSRF9zfFJEX3QsIAlJMnxUMwl9LAoteyJibmVsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTkVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJyZWFrIiwgICAiIiwJCTB4MDAwMDAwMGQsIDB4ZmZmZmZmZmYsCVRSQVAsCQlJMQl9LAoteyJicmVhayIsICAgImMiLAkweDAwMDAwMDBkLCAweGZjMDBmZmZmLAlUUkFQLAkJSTEJfSwKLXsiYnJlYWsiLCAgICJjLHEiLAkweDAwMDAwMDBkLCAweGZjMDAwMDNmLAlUUkFQLAkJSTEJfSwKLXsiYy5mLmQiLCAgICJTLFQiLAkweDQ2MjAwMDMwLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5mLmQiLCAgICJNLFMsVCIsCTB4NDYyMDAwMzAsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLmYucyIsICAgIlMsVCIsCTB4NDYwMDAwMzAsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmYucyIsICAgIk0sUyxUIiwJMHg0NjAwMDAzMCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMuZi5wcyIsICAiUyxUIiwJMHg0NmMwMDAzMCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuZi5wcyIsICAiTSxTLFQiLAkweDQ2YzAwMDMwLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51bi5kIiwgICJTLFQiLAkweDQ2MjAwMDMxLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51bi5kIiwgICJNLFMsVCIsCTB4NDYyMDAwMzEsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnVuLnMiLCAgIlMsVCIsCTB4NDYwMDAwMzEsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVuLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzMSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMudW4ucHMiLCAiUyxUIiwJMHg0NmMwMDAzMSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudW4ucHMiLCAiTSxTLFQiLAkweDQ2YzAwMDMxLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5lcS5kIiwgICJTLFQiLAkweDQ2MjAwMDMyLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5lcS5kIiwgICJNLFMsVCIsCTB4NDYyMDAwMzIsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLmVxLnMiLCAgIlMsVCIsCTB4NDYwMDAwMzIsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmVxLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzMiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMuZXEucHMiLCAiUyxUIiwJMHg0NmMwMDAzMiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuZXEucHMiLCAiTSxTLFQiLAkweDQ2YzAwMDMyLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51ZXEuZCIsICJTLFQiLAkweDQ2MjAwMDMzLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51ZXEuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzMsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnVlcS5zIiwgIlMsVCIsCTB4NDYwMDAwMzMsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVlcS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzMywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMudWVxLnBzIiwiUyxUIiwJMHg0NmMwMDAzMywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudWVxLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDMzLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5sdC5zIiwgICJTLFQiLAkweDQ2MDAwMDNjLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5sdC5zIiwgICJNLFMsVCIsCTB4NDYwMDAwM2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm9sdC5kIiwgIlMsVCIsCTB4NDYyMDAwMzQsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm9sdC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMub2x0LnMiLCAiUyxUIiwJMHg0NjAwMDAzNCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMub2x0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM0LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5vbHQucHMiLCJTLFQiLAkweDQ2YzAwMDM0LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5vbHQucHMiLCJNLFMsVCIsCTB4NDZjMDAwMzQsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVsdC5kIiwgIlMsVCIsCTB4NDYyMDAwMzUsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnVsdC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMudWx0LnMiLCAiUyxUIiwJMHg0NjAwMDAzNSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMudWx0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM1LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy51bHQucHMiLCJTLFQiLAkweDQ2YzAwMDM1LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51bHQucHMiLCJNLFMsVCIsCTB4NDZjMDAwMzUsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmxlLnMiLCAgIlMsVCIsCTB4NDYwMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLmxlLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzZSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMub2xlLmQiLCAiUyxUIiwJMHg0NjIwMDAzNiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMub2xlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM2LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5vbGUucyIsICJTLFQiLAkweDQ2MDAwMDM2LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5vbGUucyIsICJNLFMsVCIsCTB4NDYwMDAwMzYsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm9sZS5wcyIsIlMsVCIsCTB4NDZjMDAwMzYsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm9sZS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzNiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudWxlLmQiLCAiUyxUIiwJMHg0NjIwMDAzNywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMudWxlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM3LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy51bGUucyIsICJTLFQiLAkweDQ2MDAwMDM3LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy51bGUucyIsICJNLFMsVCIsCTB4NDYwMDAwMzcsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnVsZS5wcyIsIlMsVCIsCTB4NDZjMDAwMzcsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVsZS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzNywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuc2YuZCIsICAiUyxUIiwJMHg0NjIwMDAzOCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMuc2YuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDM4LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5zZi5zIiwgICJTLFQiLAkweDQ2MDAwMDM4LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5zZi5zIiwgICJNLFMsVCIsCTB4NDYwMDAwMzgsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnNmLnBzIiwgIlMsVCIsCTB4NDZjMDAwMzgsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnNmLnBzIiwgIk0sUyxUIiwJMHg0NmMwMDAzOCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmdsZS5kIiwiUyxUIiwJMHg0NjIwMDAzOSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmdsZS5kIiwiTSxTLFQiLAkweDQ2MjAwMDM5LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5uZ2xlLnMiLCJTLFQiLAkweDQ2MDAwMDM5LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ2xlLnMiLCJNLFMsVCIsCTB4NDYwMDAwMzksIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm5nbGUucHMiLCJTLFQiLAkweDQ2YzAwMDM5LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ2xlLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDM5LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5zZXEuZCIsICJTLFQiLAkweDQ2MjAwMDNhLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5zZXEuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2EsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnNlcS5zIiwgIlMsVCIsCTB4NDYwMDAwM2EsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnNlcS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzYSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMuc2VxLnBzIiwiUyxUIiwJMHg0NmMwMDAzYSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuc2VxLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDNhLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ2wuZCIsICJTLFQiLAkweDQ2MjAwMDNiLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5uZ2wuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2IsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm5nbC5zIiwgIlMsVCIsCTB4NDYwMDAwM2IsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm5nbC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzYiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubmdsLnBzIiwiUyxUIiwJMHg0NmMwMDAzYiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmdsLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDNiLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5sdC5kIiwgICJTLFQiLAkweDQ2MjAwMDNjLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5sdC5kIiwgICJNLFMsVCIsCTB4NDYyMDAwM2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLmx0LnBzIiwgIlMsVCIsCTB4NDZjMDAwM2MsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmx0LnBzIiwgIk0sUyxUIiwJMHg0NmMwMDAzYywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmdlLmQiLCAiUyxUIiwJMHg0NjIwMDAzZCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmdlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNkLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5uZ2UucyIsICJTLFQiLAkweDQ2MDAwMDNkLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ2UucyIsICJNLFMsVCIsCTB4NDYwMDAwM2QsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm5nZS5wcyIsIlMsVCIsCTB4NDZjMDAwM2QsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5nZS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzZCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubGUuZCIsICAiUyxUIiwJMHg0NjIwMDAzZSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubGUuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDNlLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5sZS5wcyIsICJTLFQiLAkweDQ2YzAwMDNlLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5sZS5wcyIsICJNLFMsVCIsCTB4NDZjMDAwM2UsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5ndC5kIiwgIlMsVCIsCTB4NDYyMDAwM2YsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm5ndC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzZiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubmd0LnMiLCAiUyxUIiwJMHg0NjAwMDAzZiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubmd0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNmLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5uZ3QucHMiLCJTLFQiLAkweDQ2YzAwMDNmLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ3QucHMiLCJNLFMsVCIsCTB4NDZjMDAwM2YsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjYWNoZSIsICAgImssbyhiKSIsCTB4YmMwMDAwMDAsIDB4ZmMwMDAwMDAsIFJEX2IsCQlJM3xUM3xNMQl9LAoteyJjZWlsLmwuZCIsICJELFMiLAkweDQ2MjAwMDBhLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsiY2VpbC5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwYSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImNlaWwudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJjZWlsLncucyIsICJELFMiLAkweDQ2MDAwMDBlLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsiY2ZjMCIsICAgICJ0LEciLAkweDQwNDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMCwJSTEJfSwKLXsiY2ZjMSIsICAgICJ0LEciLAkweDQ0NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMXxGUF9TLAlJMQl9LAoteyJjZmMxIiwgICAgInQsUyIsCTB4NDQ0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MxfEZQX1MsCUkxCX0sCi17ImNmYzIiLCAgICAidCxHIiwJMHg0ODQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzIsCUkxCX0sCi17ImNmYzMiLCAgICAidCxHIiwJMHg0YzQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzMsCUkxCX0sCi17ImN0YzAiLCAgICAidCxHIiwJMHg0MGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCUkxCX0sCi17ImN0YzEiLCAgICAidCxHIiwJMHg0NGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiY3RjMSIsICAgICJ0LFMiLAkweDQ0YzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjdGMyIiwgICAgInQsRyIsCTB4NDhjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDLAlJMQl9LAoteyJjdGMzIiwgICAgInQsRyIsCTB4NGNjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDLAlJMQl9LAoteyJjdnQuZC5sIiwgIkQsUyIsCTB4NDZhMDAwMjEsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJjdnQuZC5zIiwgIkQsUyIsCTB4NDYwMDAwMjEsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9EfEZQX1MsCUkxCX0sCi17ImN2dC5kLnciLCAiRCxTIiwJMHg0NjgwMDAyMSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17ImN2dC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAyNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17ImN2dC5sLnMiLCAiRCxTIiwJMHg0NjAwMDAyNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImN2dC5zLmwiLCAiRCxTIiwJMHg0NmEwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImN2dC5zLmQiLCAiRCxTIiwJMHg0NjIwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1N8RlBfRCwJSTEJfSwKLXsiY3Z0LnMudyIsICJELFMiLAkweDQ2ODAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsiY3Z0LnMucGwiLCJELFMiLAkweDQ2YzAwMDI4LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAlJNQl9LAoteyJjdnQucy5wdSIsIkQsUyIsCTB4NDZjMDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TfEZQX0QsCUk1CX0sCi17ImN2dC53LmQiLCAiRCxTIiwJMHg0NjIwMDAyNCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17ImN2dC53LnMiLCAiRCxTIiwJMHg0NjAwMDAyNCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17ImN2dC5wcy5zIiwiRCxWLFQiLAkweDQ2MDAwMDI2LCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNX0sCi17ImRhYnMiLCAgICAiZCx2IiwJMCwgICAgKGludCkgTV9EQUJTLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkYWRkIiwgICAgImQsdix0IiwJMHgwMDAwMDAyYywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCUkzCX0sCi17ImRhZGQiLCAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0RBRERfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGFkZGkiLCAgICJ0LHIsaiIsCTB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfcywJSTMJfSwKLXsiZGFkZGl1IiwgICJ0LHIsaiIsCTB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfcywJSTMJfSwKLXsiZGFkZHUiLCAgICJkLHYsdCIsCTB4MDAwMDAwMmQsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkYWRkdSIsICAgInQscixJIiwJMCwgICAgKGludCkgTV9EQUREVV9JLAlJTlNOX01BQ1JPLAlJMwl9LAotLyogZGN0ciBhbmQgZGN0dyBhcmUgdXNlZCBvbiB0aGUgcjUwMDAuICAqLwoteyJkY3RyIiwgICAgIm8oYikiLAkweGJjMDUwMDAwLCAweGZjMWYwMDAwLCBSRF9iLAlJMwl9LAoteyJkY3R3IiwgICAgIm8oYikiLAkweGJjMDkwMDAwLCAweGZjMWYwMDAwLCBSRF9iLAlJMwl9LAoteyJkZXJldCIsICAgIiIsICAgICAgICAgMHg0MjAwMDAxZiwgMHhmZmZmZmZmZiwgICAgMCwJRzJ8TTEJfSwKLS8qIEZvciBkZGl2LCBzZWUgdGhlIGNvbW1lbnRzIGFib3V0IGRpdi4gICovCi17ImRkaXYiLCAgICAieixzLHQiLAkweDAwMDAwMDFlLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCi17ImRkaXYiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RESVZfMywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGRpdiIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRERJVl8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLS8qIEZvciBkZGl2dSwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLwoteyJkZGl2dSIsICAgInoscyx0IiwJMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkZGl2dSIsICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ERElWVV8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkZGl2dSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ERElWVV8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLS8qIFRoZSBNSVBTIGFzc2VtYmxlciB0cmVhdHMgdGhlIGRpdiBvcGNvZGUgd2l0aCB0d28gb3BlcmFuZHMgYXMKLSAgIHRob3VnaCB0aGUgZmlyc3Qgb3BlcmFuZCBhcHBlYXJlZCB0d2ljZSAodGhlIGZpcnN0IG9wZXJhbmQgaXMgYm90aAotICAgYSBzb3VyY2UgYW5kIGEgZGVzdGluYXRpb24pLiAgVG8gZ2V0IHRoZSBkaXYgbWFjaGluZSBpbnN0cnVjdGlvbiwKLSAgIHlvdSBtdXN0IHVzZSBhbiBleHBsaWNpdCBkZXN0aW5hdGlvbiBvZiAkMC4gICovCi17ImRpdiIsICAgICAieixzLHQiLAkweDAwMDAwMDFhLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCi17ImRpdiIsICAgICAieix0IiwJMHgwMDAwMDAxYSwgMHhmZmUwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXYiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ESVZfMywJSU5TTl9NQUNSTywJSTEJfSwKLXsiZGl2IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRElWXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkaXYuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMywgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTEJfSwKLXsiZGl2LnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxCX0sCi0vKiBGb3IgZGl2dSwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLwoteyJkaXZ1IiwgICAgInoscyx0IiwJMHgwMDAwMDAxYiwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXZ1IiwgICAgInosdCIsCTB4MDAwMDAwMWIsIDB4ZmZlMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKLXsiZGl2dSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRElWVV8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkaXZ1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ESVZVXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkbGEiLCAgICAgInQsbyhiKSIsCTB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfcywJSTMJfSwgLyogZGFkZGl1ICovCi17ImRsYSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9ETEFfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRsaSIsICAgICAidCxqIiwgICAgICAweDI0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAlJMwl9LCAvKiBhZGRpdSAqLwoteyJkbGkiLAkgICAgInQsaSIsCTB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCUkzCX0sIC8qIG9yaSAqLwoteyJkbGkiLCAgICAgInQsSSIsCTAsICAgIChpbnQpIE1fRExJLAlJTlNOX01BQ1JPLAlJMwl9LAotCi17ImRtYWRkMTYiLCAicyx0IiwgICAgICAweDAwMDAwMDI5LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfTE98UkRfTE8sCVYxCX0sCi17ImRtZmMwIiwgICAidCxHIiwJMHg0MDIwMDAwMCwgMHhmZmUwMDdmZiwgTENEfFdSX3R8UkRfQzAsCUkzCX0sCi17ImRtdGMwIiwgICAidCxHIiwJMHg0MGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfQzB8V1JfQ0MsCUkzCX0sCi17ImRtZmMxIiwgICAidCxTIiwJMHg0NDIwMDAwMCwgMHhmZmUwMDdmZiwgTENEfFdSX3R8UkRfU3xGUF9TLAlJMwl9LAoteyJkbXRjMSIsICAgInQsUyIsCTB4NDRhMDAwMDAsIDB4ZmZlMDA3ZmYsIENPRHxSRF90fFdSX1N8RlBfUywJSTMJfSwKLXsiZG1mYzIiLCAgICJ0LFMiLAkweDQ4MjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9TfEZQX1MsCUkzCX0sCi17ImRtdGMyIiwgICAidCxTIiwJMHg0OGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfU3xGUF9TLAlJMwl9LAoteyJkbXVsIiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ETVVMLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsIiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ETVVMX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvIiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUxPLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsbyIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ETVVMT19JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsb3UiLCAgImQsdix0IiwJMCwgICAgKGludCkgTV9ETVVMT1UsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRtdWxvdSIsICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxPVV9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsdCIsICAgInMsdCIsCTB4MDAwMDAwMWMsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJICAgIEkzfSwKLXsiZG11bHR1IiwgICJzLHQiLAkweDAwMDAwMDFkLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sICAgICAgSTN9LAoteyJkbmVnIiwgICAgImQsdyIsCTB4MDAwMDAwMmUsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTMJfSwgLyogZHN1YiAwICovCi17ImRuZWd1IiwgICAiZCx3IiwJMHgwMDAwMDAyZiwgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMwl9LCAvKiBkc3VidSAwKi8KLXsiZHJlbSIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWUsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKLXsiZHJlbSIsICAgICJkLHYsdCIsCTMsICAgIChpbnQpIE1fRFJFTV8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkcmVtIiwgICAgImQsdixJIiwJMywgICAgKGludCkgTV9EUkVNXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkcmVtdSIsICAgInoscyx0IiwJMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkcmVtdSIsICAgImQsdix0IiwJMywgICAgKGludCkgTV9EUkVNVV8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkcmVtdSIsICAgImQsdixJIiwJMywgICAgKGludCkgTV9EUkVNVV8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHNsbHYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LAoteyJkc2xsMzIiLCAgImQsdyw8IiwJMHgwMDAwMDAzYywgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LAoteyJkc2xsIiwgICAgImQsdyxzIiwJMHgwMDAwMDAxNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sIC8qIGRzbGx2ICovCi17ImRzbGwiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNjLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sIC8qIGRzbGwzMiAqLwoteyJkc2xsIiwgICAgImQsdyw8IiwJMHgwMDAwMDAzOCwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMwl9LAoteyJkc3JhdiIsICAgImQsdCxzIiwJMHgwMDAwMDAxNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sCi17ImRzcmEzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNmLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmEiLCAgICAiZCx3LHMiLAkweDAwMDAwMDE3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwgLyogZHNyYXYgKi8KLXsiZHNyYSIsICAgICJkLHcsPiIsCTB4MDAwMDAwM2YsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwgLyogZHNyYTMyICovCi17ImRzcmEiLCAgICAiZCx3LDwiLAkweDAwMDAwMDNiLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmx2IiwgICAiZCx0LHMiLAkweDAwMDAwMDE2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwKLXsiZHNybDMyIiwgICJkLHcsPCIsCTB4MDAwMDAwM2UsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwKLXsiZHNybCIsICAgICJkLHcscyIsCTB4MDAwMDAwMTYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LCAvKiBkc3JsdiAqLwoteyJkc3JsIiwgICAgImQsdyw+IiwJMHgwMDAwMDAzZSwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LCAvKiBkc3JsMzIgKi8KLXsiZHNybCIsICAgICJkLHcsPCIsCTB4MDAwMDAwM2EsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTMJfSwKLXsiZHN1YiIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmUsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkc3ViIiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9EU1VCX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRzdWJ1IiwgICAiZCx2LHQiLAkweDAwMDAwMDJmLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTMJfSwKLXsiZHN1YnUiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRFNVQlVfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZXJldCIsICAgICIiLAkJMHg0MjAwMDAxOCwgMHhmZmZmZmZmZiwJMCwJSTN8TTEJfSwKLXsiZmxvb3IubC5kIiwgIkQsUyIsCTB4NDYyMDAwMGIsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJmbG9vci5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwYiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17ImZsb29yLncuZCIsICJELFMiLAkweDQ2MjAwMDBmLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsiZmxvb3Iudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJmbHVzaGkiLCAgIiIsCQkweGJjMDEwMDAwLCAweGZmZmZmZmZmLCAwLAkJTDEJfSwKLXsiZmx1c2hkIiwgICIiLAkJMHhiYzAyMDAwMCwgMHhmZmZmZmZmZiwgMCwgTDEJCX0sCi17ImZsdXNoaWQiLCAiIiwJCTB4YmMwMzAwMDAsIDB4ZmZmZmZmZmYsIDAsIEwxCQl9LAoteyJoaWJlcm5hdGUiLCIiLCAgICAgICAgMHg0MjAwMDAyMywgMHhmZmZmZmZmZiwJMCwgVjEJfSwKLXsianIiLCAgICAgICJzIiwJMHgwMDAwMDAwOCwgMHhmYzFmZmZmZiwJVUJEfFJEX3MsCUkxCX0sCi17ImoiLCAgICAgICAicyIsCTB4MDAwMDAwMDgsIDB4ZmMxZmZmZmYsCVVCRHxSRF9zLAlJMQl9LCAvKiBqciAqLwotLyogU1ZSNCBQSUMgY29kZSByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nIGZvciBqLCBzbyBpdCBtdXN0IGJlIGEKLSAgIG1hY3JvLiAgKi8KLXsiaiIsCSAgICAiYSIsCTAsICAgICAoaW50KSBNX0pfQSwJSU5TTl9NQUNSTywJSTEJfSwKLS8qIFRoaXMgZm9ybSBvZiBqIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlciBhbmQgaW50ZXJuYWxseSBieSB0aGUKLSAgIGFzc2VtYmxlciwgYnV0IHdpbGwgbmV2ZXIgbWF0Y2ggdXNlciBpbnB1dCAoYmVjYXVzZSB0aGUgbGluZSBhYm92ZQotICAgd2lsbCBtYXRjaCBmaXJzdCkuICAqLwoteyJqIiwgICAgICAgImEiLAkweDA4MDAwMDAwLCAweGZjMDAwMDAwLAlVQkQsCQlJMQl9LAoteyJqYWxyIiwgICAgInMiLAkweDAwMDBmODA5LCAweGZjMWZmZmZmLAlVQkR8UkRfc3xXUl9kLAlJMQl9LAoteyJqYWxyIiwgICAgImQscyIsCTB4MDAwMDAwMDksIDB4ZmMxZjA3ZmYsCVVCRHxSRF9zfFdSX2QsCUkxCX0sCi0vKiBTVlI0IFBJQyBjb2RlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGphbCwgc28gaXQgbXVzdCBiZSBhCi0gICBtYWNyby4gICovCi17ImphbCIsICAgICAiZCxzIiwJMCwgICAgIChpbnQpIE1fSkFMXzIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImphbCIsICAgICAicyIsCTAsICAgICAoaW50KSBNX0pBTF8xLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJqYWwiLCAgICAgImEiLAkwLCAgICAgKGludCkgTV9KQUxfQSwJSU5TTl9NQUNSTywJSTEJfSwKLS8qIFRoaXMgZm9ybSBvZiBqYWwgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGFuZCBpbnRlcm5hbGx5IGJ5IHRoZQotICAgYXNzZW1ibGVyLCBidXQgd2lsbCBuZXZlciBtYXRjaCB1c2VyIGlucHV0IChiZWNhdXNlIHRoZSBsaW5lIGFib3ZlCi0gICB3aWxsIG1hdGNoIGZpcnN0KS4gICovCi17ImphbCIsICAgICAiYSIsCTB4MGMwMDAwMDAsIDB4ZmMwMDAwMDAsCVVCRHxXUl8zMSwJSTEJfSwKLSAgLyogamFseCByZWFsbHkgc2hvdWxkIG9ubHkgYmUgYXZhbGlhYmxlIGlmIG1pcHMxNiBpcyBhdmFpbGFibGUsCi0gICAgIGJ1dCBmb3Igbm93IG1ha2UgaXQgSTEuICovCi17ImphbHgiLCAgICAiYSIsCTB4NzQwMDAwMDAsIDB4ZmMwMDAwMDAsIFVCRHxXUl8zMSwJSTEgICAgICB9LAoteyJsYSIsICAgICAgInQsbyhiKSIsCTB4MjQwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwgLyogYWRkaXUgKi8KLXsibGEiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xBX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsYiIsICAgICAgInQsbyhiKSIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxiIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGJ1IiwgICAgICJ0LG8oYikiLAkweDkwMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsYnUiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEJVX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZCIsCSAgICAidCxvKGIpIiwgICAweGRjMDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX2IsCUkzCX0sCi17ImxkIiwgICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9MRF9PQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGQiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xEX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZGMxIiwgICAgIlQsbyhiKSIsCTB4ZDQwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX1R8RlBfRCwJSTIJfSwKLXsibGRjMSIsICAgICJFLG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCUkyCX0sCi17ImxkYzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsZGMxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibC5kIiwgICAgICJULG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCUkyCX0sIC8qIGxkYzEgKi8KLXsibC5kIiwgICAgICJULG8oYikiLAkwLCAgICAoaW50KSBNX0xfRE9CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsLmQiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTF9EQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxkYzIiLCAgICAiRSxvKGIpIiwJMHhkODAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfQ0MsCUkyCX0sCi17ImxkYzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MREMyX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsZGMzIiwgICAgIkUsbyhiKSIsCTB4ZGMwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX0NDLAlJMgl9LAoteyJsZGMzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDM19BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGRsIiwJICAgICJ0LG8oYikiLAkweDY4MDAwMDAwLCAweGZjMDAwMDAwLCBMRER8V1JfdHxSRF9iLAlJMwl9LAoteyJsZGwiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTERMX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsZHIiLAkgICAgInQsbyhiKSIsCTB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxXUl90fFJEX2IsCUkzCX0sCi17ImxkciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MRFJfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17ImxkeGMxIiwgICAiRCx0KGIpIiwJMHg0YzAwMDAwMSwgMHhmYzAwZjgzZiwgTEREfFdSX0R8UkRfdHxSRF9iLAlJNAl9LAoteyJsaCIsICAgICAgInQsbyhiKSIsCTB4ODQwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxoIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MSF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGh1IiwgICAgICJ0LG8oYikiLAkweDk0MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsaHUiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEhVX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAotLyogbGkgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZS4gICovCi17ImxpLmQiLCAgICAidCxGIiwJMCwgICAgKGludCkgTV9MSV9ELAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaS5kIiwgICAgIlQsTCIsCTAsICAgIChpbnQpIE1fTElfREQsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxpLnMiLCAgICAidCxmIiwJMCwgICAgKGludCkgTV9MSV9TLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaS5zIiwgICAgIlQsbCIsCTAsICAgIChpbnQpIE1fTElfU1MsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxsIiwJICAgICJ0LG8oYikiLAkweGMwMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8UkRfYnxXUl90LAlJMgl9LAoteyJsbCIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGxkIiwJICAgICJ0LG8oYikiLAkweGQwMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8UkRfYnxXUl90LAlJMwl9LAoteyJsbGQiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTExEX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsdWkiLCAgICAgInQsdSIsCTB4M2MwMDAwMDAsIDB4ZmZlMDAwMDAsCVdSX3QsCQlJMQl9LAoteyJsdXhjMSIsICAgIkQsdChiKSIsCTB4NGMwMDAwMDUsIDB4ZmMwMGY4M2YsIExERHxXUl9EfFJEX3R8UkRfYiwJSTUJfSwKLXsibHciLCAgICAgICJ0LG8oYikiLAkweDhjMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsdyIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzAiLCAgICAiRSxvKGIpIiwJMHhjMDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCi17Imx3YzAiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MwX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MxIiwgICAgIlQsbyhiKSIsCTB4YzQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX1R8RlBfUywJSTEJfSwKLXsibHdjMSIsICAgICJFLG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sCi17Imx3YzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibC5zIiwgICAgICJULG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sIC8qIGx3YzEgKi8KLXsibC5zIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzIiLCAgICAiRSxvKGIpIiwJMHhjODAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCi17Imx3YzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MyX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MzIiwgICAgIkUsbyhiKSIsCTB4Y2MwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX0NDLAlJMQl9LAoteyJsd2MzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDM19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdsIiwgICAgICJ0LG8oYikiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsd2wiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdMX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsY2FjaGUiLCAgInQsbyhiKSIsCTB4ODgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkyCX0sIC8qIHNhbWUgKi8KLXsibGNhY2hlIiwgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgbHdsICovCi17Imx3ciIsICAgICAidCxvKGIpIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibHdyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXUl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiZmx1c2giLCAgICJ0LG8oYikiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMgl9LCAvKiBzYW1lICovCi17ImZsdXNoIiwgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1JfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIGx3ciAqLwoteyJsd3UiLCAgICAgInQsbyhiKSIsCTB4OWMwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkzCX0sCi17Imx3dSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1VfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17Imx3eGMxIiwgICAiRCx0KGIpIiwJMHg0YzAwMDAwMCwgMHhmYzAwZjgzZiwgTEREfFdSX0R8UkRfdHxSRF9iLAlJNAl9LAotCi0KLXsibWFkIiwJICAgICJzLHQiLAkweDcwMDAwMDAwLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98UkRfSEl8UkRfTE8sCVAzCX0sCi17Im1hZHUiLCAgICAicyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFJEX0hJfFJEX0xPLAlQMwl9LAoteyJtYWRkLmQiLCAgIkQsUixTLFQiLAkweDRjMDAwMDIxLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im1hZGQucyIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjAsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLXsibWFkZC5wcyIsICJELFIsUyxUIiwJMHg0YzAwMDAyNiwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNQl9LAoteyJtYWRkIiwgICAgInMsdCIsCTB4MDAwMDAwMWMsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJCUwxCX0sCi17Im1hZGQiLCAgICAicyx0IiwJMHg3MDAwMDAwMCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCSAgICAgICAgRzF8TTEJfSwKLXsibWFkZCIsICAgICJkLHMsdCIsCTB4NzAwMDAwMDAsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sCUcxCX0sCi17Im1hZGR1IiwgICAicyx0IiwJMHgwMDAwMDAxZCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAkJTDEJfSwKLXsibWFkZHUiLCAgICJzLHQiLAkweDcwMDAwMDAxLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJRzF8TTF9LAoteyJtYWRkdSIsICAgImQscyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwJRzF9LAoteyJtYWRkMTYiLCAgInMsdCIsICAgICAgMHgwMDAwMDAyOCwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPfFJEX0hJfFJEX0xPLAlWMQl9LAoteyJtZmMwIiwgICAgInQsRyIsCTB4NDAwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MwLAlJMQl9LAoteyJtZmMxIiwgICAgInQsUyIsCTB4NDQwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX1N8RlBfUywJSTEJfSwKLXsibWZjMSIsICAgICJ0LEciLAkweDQ0MDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9TfEZQX1MsCUkxCX0sCi17Im1mYzIiLCAgICAidCxHIiwJMHg0ODAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzIsCUkxCX0sCi17Im1mYzMiLCAgICAidCxHIiwJMHg0YzAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzMsCUkxCX0sCi17Im1maGkiLCAgICAiZCIsCTB4MDAwMDAwMTAsIDB4ZmZmZjA3ZmYsCVdSX2R8UkRfSEksCUkxCX0sCi17Im1mbG8iLCAgICAiZCIsCTB4MDAwMDAwMTIsIDB4ZmZmZjA3ZmYsCVdSX2R8UkRfTE8sCUkxCX0sCi17Im1vdi5kIiwgICAiRCxTIiwJMHg0NjIwMDAwNiwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17Im1vdi5zIiwgICAiRCxTIiwJMHg0NjAwMDAwNiwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17Im1vdi5wcyIsICAiRCxTIiwJMHg0NmMwMDAwNiwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUk1CX0sCi17Im1vdmYiLCAgICAiZCxzLE4iLAkweDAwMDAwMDAxLCAweGZjMDMwN2ZmLCBXUl9kfFJEX3N8UkRfQ0N8RlBfRHxGUF9TLCBJNHxNMX0sCi17Im1vdmYuZCIsICAiRCxTLE4iLAkweDQ2MjAwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfRCwJSTR8TTEJfSwKLXsibW92Zi5zIiwgICJELFMsTiIsCTB4NDYwMDAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9TLAlJNHxNMQl9LAoteyJtb3ZmLnBzIiwgIkQsUyxOIiwJMHg0NmMwMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX0QsCUk1CX0sCi17Im1vdm4iLCAgICAiZCx2LHQiLAkweDAwMDAwMDBiLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTR8TTEJfSwKLXsiZmZjIiwgICAgICJkLHYiLAkweDAwMDAwMDBiLCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsTDEJfSwKLXsibW92bi5kIiwgICJELFMsdCIsCTB4NDYyMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsCUk0fE0xCX0sCi17Im1vdm4ucyIsICAiRCxTLHQiLAkweDQ2MDAwMDEzLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9TLAlJNHxNMQl9LAoteyJtb3Z0IiwgICAgImQscyxOIiwJMHgwMDAxMDAwMSwgMHhmYzAzMDdmZiwgV1JfZHxSRF9zfFJEX0NDLAlJNHxNMQl9LAoteyJtb3Z0LmQiLCAgIkQsUyxOIiwJMHg0NjIxMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX0QsCUk0fE0xCX0sCi17Im1vdnQucyIsICAiRCxTLE4iLAkweDQ2MDEwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfUywJSTR8TTEJfSwKLXsibW92dC5wcyIsICJELFMsTiIsCTB4NDZjMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAlJNX0sCi17Im1vdnoiLCAgICAiZCx2LHQiLAkweDAwMDAwMDBhLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTR8TTEJfSwKLXsiZmZzIiwgICAgICJkLHYiLAkweDAwMDAwMDBhLCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsTDEJfSwKLXsibW92ei5kIiwgICJELFMsdCIsCTB4NDYyMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsCUk0fE0xCX0sCi17Im1vdnoucyIsICAiRCxTLHQiLAkweDQ2MDAwMDEyLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9TLAlJNHxNMQl9LAotLyogbW92ZSBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0YWJsZS4gICovCi17Im1zdWIuZCIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjksIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibXN1Yi5zIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyOCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAoteyJtc3ViLnBzIiwgIkQsUixTLFQiLAkweDRjMDAwMDJlLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk1CX0sCi17Im1zdWIiLCAgICAicyx0IiwJMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLEwxCX0sCi17Im1zdWJ1IiwgICAicyx0IiwJMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLEwxCX0sCi17Im10YzAiLCAgICAidCxHIiwJMHg0MDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzB8V1JfQ0MsCUkxCX0sCi17Im10YzEiLCAgICAidCxTIiwJMHg0NDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfU3xGUF9TLAlJMQl9LAoteyJtdGMxIiwgICAgInQsRyIsCTB4NDQ4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX1N8RlBfUywJSTEJfSwKLXsibXRjMiIsICAgICJ0LEciLAkweDQ4ODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DMnxXUl9DQywJSTEJfSwKLXsibXRjMyIsICAgICJ0LEciLAkweDRjODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DM3xXUl9DQywJSTEJfSwKLXsibXRoaSIsICAgICJzIiwJMHgwMDAwMDAxMSwgMHhmYzFmZmZmZiwJUkRfc3xXUl9ISSwJSTEJfSwKLXsibXRsbyIsICAgICJzIiwJMHgwMDAwMDAxMywgMHhmYzFmZmZmZiwJUkRfc3xXUl9MTywJSTEJfSwKLXsibXVsLmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxCX0sCi17Im11bC5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAyLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMQl9LAoteyJtdWwucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAwMiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTUJfSwKLXsibXVsIiwgICAgICJkLHYsdCIsCTB4NzAwMDAwMDIsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90fFdSX0hJfFdSX0xPLFAzfSwKLXsibXVsIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fTVVMLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWwiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9NVUxfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsbyIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fTVVMTywJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsbyIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fTVVMT19JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtdWxvdSIsICAgImQsdix0IiwJMCwgICAgKGludCkgTV9NVUxPVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsb3UiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fTVVMT1VfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsdCIsICAgICJzLHQiLAkweDAwMDAwMDE4LCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJSTF9LAoteyJtdWx0IiwgICAgImQscyx0IiwJMHgwMDAwMDAxOCwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwgRzF9LAoteyJtdWx0dSIsICAgInMsdCIsCTB4MDAwMDAwMTksIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAlJMX0sCi17Im11bHR1IiwgICAiZCxzLHQiLAkweDAwMDAwMDE5LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLCBHMX0sCi17Im5lZyIsICAgICAiZCx3IiwJMHgwMDAwMDAyMiwgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMQl9LCAvKiBzdWIgMCAqLwoteyJuZWd1IiwgICAgImQsdyIsCTB4MDAwMDAwMjMsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTEJfSwgLyogc3VidSAwICovCi17Im5lZy5kIiwgICAiRCxWIiwJMHg0NjIwMDAwNywgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17Im5lZy5zIiwgICAiRCxWIiwJMHg0NjAwMDAwNywgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17Im5lZy5wcyIsICAiRCxWIiwJMHg0NmMwMDAwNywgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsSTUJfSwKLXsibm1hZGQuZCIsICJELFIsUyxUIiwJMHg0YzAwMDAzMSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoteyJubWFkZC5zIiwgIkQsUixTLFQiLAkweDRjMDAwMDMwLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCi17Im5tYWRkLnBzIiwiRCxSLFMsVCIsCTB4NGMwMDAwMzYsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTUJfSwKLXsibm1zdWIuZCIsICJELFIsUyxUIiwJMHg0YzAwMDAzOSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoteyJubXN1Yi5zIiwgIkQsUixTLFQiLAkweDRjMDAwMDM4LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCi17Im5tc3ViLnBzIiwiRCxSLFMsVCIsCTB4NGMwMDAwM2UsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTUJfSwKLS8qIG5vcCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlLiAgKi8KLXsibm9yIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJub3IiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9OT1JfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibm90IiwgICAgICJkLHYiLAkweDAwMDAwMDI3LCAweGZjMWYwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwvKm5vciBkLHMsMCovCi17Im9yIiwgICAgICAiZCx2LHQiLAkweDAwMDAwMDI1LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsib3IiLCAgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fT1JfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsib3JpIiwgICAgICJ0LHIsaSIsCTB4MzQwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLQoteyJwbGwucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAyYywgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTV9LAoteyJwbHUucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAyZCwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTV9LAotCi17InByZWYiLCAgICAiayxvKGIpIiwJMHhjYzAwMDAwMCwgMHhmYzAwMDAwMCwgUkRfYiwJCUczfE0xCX0sCi17InByZWZ4IiwgICAiaCx0KGIpIiwJMHg0YzAwMDAwZiwgMHhmYzAwMDdmZiwgUkRfYnxSRF90LAlJNAl9LAotCi17InB1bC5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDJlLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNX0sCi17InB1dS5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDJmLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNX0sCi0KLXsicmVjaXAuZCIsICJELFMiLAkweDQ2MjAwMDE1LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTQJfSwKLXsicmVjaXAucyIsICJELFMiLAkweDQ2MDAwMDE1LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTQJfSwKLXsicmVtIiwgICAgICJ6LHMsdCIsCTB4MDAwMDAwMWEsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEgfSwKLXsicmVtIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fUkVNXzMsCUlOU05fTUFDUk8sCUkxCX0sCi17InJlbSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JFTV8zSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsicmVtdSIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWIsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEgfSwKLXsicmVtdSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fUkVNVV8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyZW11IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9SRU1VXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyZmUiLCAgICAgIiIsCQkweDQyMDAwMDEwLCAweGZmZmZmZmZmLAkwLAlJMXxUMwkJfSwKLXsicm9sIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fUk9MLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyb2wiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ST0xfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm9yIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fUk9SLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyb3IiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ST1JfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm91bmQubC5kIiwgIkQsUyIsCTB4NDYyMDAwMDgsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJyb3VuZC5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwOCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17InJvdW5kLncuZCIsICJELFMiLAkweDQ2MjAwMDBjLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsicm91bmQudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGMsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJyc3FydC5kIiwgIkQsUyIsCTB4NDYyMDAwMTYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJNAl9LAoteyJyc3FydC5zIiwgIkQsUyIsCTB4NDYwMDAwMTYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJNAl9LAoteyJzYiIsICAgICAgInQsbyhiKSIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic2IiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NCX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzYyIsCSAgICAidCxvKGIpIiwJMHhlMDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfdHxXUl90fFJEX2IsCUkyCX0sCi17InNjIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NDX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzY2QiLAkgICAgInQsbyhiKSIsCTB4ZjAwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX3R8V1JfdHxSRF9iLAlJMwl9LAoteyJzY2QiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0NEX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJzZCIsCSAgICAidCxvKGIpIiwJMHhmYzAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMwl9LAoteyJzZCIsICAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fU0RfT0IsCUlOU05fTUFDUk8sCUkxCX0sCi17InNkIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TRF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2RiYnAiLCAgICIiLAkJMHgwMDAwMDAwZSwgMHhmZmZmZmZmZiwJVFJBUCwgICAgICAgICAgIEcyfE0xCX0sCi17InNkYmJwIiwgICAiYyIsCTB4MDAwMDAwMGUsIDB4ZmMwMGZmZmYsCVRSQVAsCQlHMnxNMQl9LAoteyJzZGJicCIsICAgImMscSIsCTB4MDAwMDAwMGUsIDB4ZmMwMDAwM2YsCVRSQVAsCQlHMnxNMQl9LAoteyJzZGMxIiwgICAgIlQsbyhiKSIsCTB4ZjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX1R8UkRfYnxGUF9ELAlJMgl9LAoteyJzZGMxIiwgICAgIkUsbyhiKSIsCTB4ZjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX1R8UkRfYnxGUF9ELAlJMgl9LAoteyJzZGMxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsic2RjMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InNkYzIiLCAgICAiRSxvKGIpIiwJMHhmODAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfQzJ8UkRfYiwJSTIJfSwKLXsic2RjMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzJfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InNkYzMiLCAgICAiRSxvKGIpIiwJMHhmYzAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfQzN8UkRfYiwJSTIJfSwKLXsic2RjMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzNfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InMuZCIsICAgICAiVCxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCUkyCX0sCi17InMuZCIsICAgICAiVCxvKGIpIiwJMCwgICAgKGludCkgTV9TX0RPQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsicy5kIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NfREFCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZGwiLCAgICAgInQsbyhiKSIsCTB4YjAwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTMJfSwKLXsic2RsIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NETF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsic2RyIiwgICAgICJ0LG8oYikiLAkweGI0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkzCX0sCi17InNkciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TRFJfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17InNkeGMxIiwgICAiUyx0KGIpIiwgICAweDRjMDAwMDA5LCAweGZjMDAwN2ZmLCBTTXxSRF9TfFJEX3R8UkRfYiwJSTQJfSwKLXsic2Vsc2wiLCAgICJkLHYsdCIsCTB4MDAwMDAwMDUsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LEwxCX0sCi17InNlbHNyIiwgICAiZCx2LHQiLAkweDAwMDAwMDAxLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCxMMQl9LAoteyJzZXEiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TRVEsCUlOU05fTUFDUk8sCUkxCX0sCi17InNlcSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NFUV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ2UiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR0UsCUlOU05fTUFDUk8sCUkxCX0sCi17InNnZSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ2V1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR0VVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ2V1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR0VVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNndCIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHVCwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2d0IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dUX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNndHUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHVFUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNndHUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2giLCAgICAgICJ0LG8oYikiLAkweGE0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InNoIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TSF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xlIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0xFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGUiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTEVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xldSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0xFVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xldSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xFVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbGx2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sCi17InNsbCIsICAgICAiZCx3LHMiLAkweDAwMDAwMDA0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwgLyogc2xsdiAqLwoteyJzbGwiLCAgICAgImQsdyw8IiwJMHgwMDAwMDAwMCwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMQl9LAoteyJzbHQiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyYSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InNsdCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbHRpIiwgICAgInQscixqIiwJMHgyODAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJzbHRpdSIsICAgInQscixqIiwJMHgyYzAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJzbHR1IiwgICAgImQsdix0IiwJMHgwMDAwMDAyYiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InNsdHUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic25lIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU05FLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzbmUiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTkVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3FydC5kIiwgICJELFMiLAkweDQ2MjAwMDA0LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsic3FydC5zIiwgICJELFMiLAkweDQ2MDAwMDA0LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsic3JhdiIsICAgICJkLHQscyIsCTB4MDAwMDAwMDcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LAoteyJzcmEiLCAgICAgImQsdyxzIiwJMHgwMDAwMDAwNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sIC8qIHNyYXYgKi8KLXsic3JhIiwgICAgICJkLHcsPCIsCTB4MDAwMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTEJfSwKLXsic3JsdiIsICAgICJkLHQscyIsCTB4MDAwMDAwMDYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LAoteyJzcmwiLCAgICAgImQsdyxzIiwJMHgwMDAwMDAwNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sIC8qIHNybHYgKi8KLXsic3JsIiwgICAgICJkLHcsPCIsCTB4MDAwMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTEJfSwKLXsic3Nub3AiLCAgICAgIiIsCTB4MDAwMDAwNDAsIDB4ZmZmZmZmZmYsCTAsCQlNMQl9LAoteyJzdGFuZGJ5IiwgIiIsICAgICAgICAgMHg0MjAwMDAyMSwgMHhmZmZmZmZmZiwJMCwJCVYxCX0sCi17InN1YiIsICAgICAiZCx2LHQiLAkweDAwMDAwMDIyLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsic3ViIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU1VCX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InN1Yi5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAxLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMQl9LCAgICAgCi17InN1Yi5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAxLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMQl9LAoteyJzdWIucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAwMSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTUJfSwKLXsic3VidSIsICAgICJkLHYsdCIsCTB4MDAwMDAwMjMsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzdWJ1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TVUJVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InN1c3BlbmQiLCAiIiwgICAgICAgICAweDQyMDAwMDIyLCAweGZmZmZmZmZmLAkwLAkJVjEJfSwKLXsic3V4YzEiLCAgICJTLHQoYikiLCAgIDB4NGMwMDAwMGQsIDB4ZmMwMDA3ZmYsIFNNfFJEX1N8UkRfdHxSRF9iLAlJNQl9LAoteyJzdyIsICAgICAgInQsbyhiKSIsCTB4YWMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic3ciLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MwIiwgICAgIkUsbyhiKSIsCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MwfFJEX2IsCUkxCX0sCi17InN3YzAiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MwX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MxIiwgICAgIlQsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAlJMQl9LAoteyJzd2MxIiwgICAgIkUsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAlJMQl9LAoteyJzd2MxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InMucyIsICAgICAiVCxvKGIpIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfVHxSRF9ifEZQX1MsCUkxCX0sIC8qIHN3YzEgKi8KLXsicy5zIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzIiLCAgICAiRSxvKGIpIiwJMHhlODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzJ8UkRfYiwJSTEJfSwKLXsic3djMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzJfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzMiLCAgICAiRSxvKGIpIiwJMHhlYzAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzN8UkRfYiwJSTEJfSwKLXsic3djMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzNfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3bCIsICAgICAidCxvKGIpIiwJMHhhODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzd2wiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dMX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzY2FjaGUiLCAgInQsbyhiKSIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVJEX3R8UkRfYiwJSTIJfSwgLyogc2FtZSAqLwoteyJzY2FjaGUiLCAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dMX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBzd2wgKi8KLXsic3dyIiwgICAgICJ0LG8oYikiLAkweGI4MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InN3ciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV1JfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImludmFsaWRhdGUiLCAidCxvKGIpIiwweGI4MDAwMDAwLCAweGZjMDAwMDAwLAlSRF90fFJEX2IsCUkyCX0sIC8qIHNhbWUgKi8KLXsiaW52YWxpZGF0ZSIsICJ0LEEoYikiLDAsICAgIChpbnQpIE1fU1dSX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBzd3IgKi8KLXsic3d4YzEiLCAgICJTLHQoYikiLCAgIDB4NGMwMDAwMDgsIDB4ZmMwMDA3ZmYsIFNNfFJEX1N8UkRfdHxSRF9iLAlJNAl9LAoteyJzeW5jIiwgICAgIiIsCQkweDAwMDAwMDBmLCAweGZmZmZmZmZmLAlJTlNOX1NZTkMsCUkyfEcxCX0sCi17InN5bmMucCIsICAiIiwJCTB4MDAwMDA0MGYsIDB4ZmZmZmZmZmYsCUlOU05fU1lOQywJSTIJfSwKLXsic3luYy5sIiwgICIiLAkJMHgwMDAwMDAwZiwgMHhmZmZmZmZmZiwJSU5TTl9TWU5DLAlJMgl9LAoteyJzeXNjYWxsIiwgIiIsCQkweDAwMDAwMDBjLCAweGZmZmZmZmZmLAlUUkFQLAlJMQkJfSwKLXsic3lzY2FsbCIsICJCIiwJMHgwMDAwMDAwYywgMHhmYzAwMDAzZiwJVFJBUCwJSTEJCX0sCi17InRlcWkiLCAgICAicyxqIiwJMHgwNDBjMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LAoteyJ0ZXEiLAkgICAgInMsdCIsCTB4MDAwMDAwMzQsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0ZXEiLAkgICAgInMsdCxxIiwJMHgwMDAwMDAzNCwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCX0sCi17InRlcSIsICAgICAicyxqIiwJMHgwNDBjMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LCAvKiB0ZXFpICovCi17InRlcSIsICAgICAicyxJIiwJMCwgICAgKGludCkgTV9URVFfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidGdlaSIsICAgICJzLGoiLAkweDA0MDgwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sCi17InRnZSIsCSAgICAicyx0IiwJMHgwMDAwMDAzMCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFRSQVAsCUkyCX0sCi17InRnZSIsCSAgICAicyx0LHEiLAkweDAwMDAwMDMwLCAweGZjMDAwMDNmLAlSRF9zfFJEX3R8VFJBUCwJSTIJfSwKLXsidGdlIiwgICAgICJzLGoiLAkweDA0MDgwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sIC8qIHRnZWkgKi8KLXsidGdlIiwJICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RHRV9JLCAgICBJTlNOX01BQ1JPLAlJMgl9LAoteyJ0Z2VpdSIsICAgInMsaiIsCTB4MDQwOTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sCi17InRnZXUiLCAgICAicyx0IiwJMHgwMDAwMDAzMSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0Z2V1IiwgICAgInMsdCxxIiwJMHgwMDAwMDAzMSwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0Z2V1IiwgICAgInMsaiIsCTB4MDQwOTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sIC8qIHRnZWl1ICovCi17InRnZXUiLCAgICAicyxJIiwJMCwgICAgKGludCkgTV9UR0VVX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRsYnAiLCAgICAiIiwJCTB4NDIwMDAwMDgsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMXxNMQl9LAoteyJ0bGJyIiwgICAgIiIsCQkweDQyMDAwMDAxLCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTF8TTEJfSwKLXsidGxid2kiLCAgICIiLAkJMHg0MjAwMDAwMiwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxfE0xCX0sCi17InRsYndyIiwgICAiIiwJCTB4NDIwMDAwMDYsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMXxNMQl9LAoteyJ0bHRpIiwgICAgInMsaiIsCTB4MDQwYTAwMDAsIDB4ZmMxZjAwMDAsCVJEX3N8VFJBUCwJSTIJCX0sCi17InRsdCIsICAgICAicyx0IiwJMHgwMDAwMDAzMiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bHQiLCAgICAgInMsdCxxIiwJMHgwMDAwMDAzMiwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bHQiLCAgICAgInMsaiIsCTB4MDQwYTAwMDAsIDB4ZmMxZjAwMDAsCVJEX3N8VFJBUCwJSTIJCX0sIC8qIHRsdGkgKi8KLXsidGx0IiwgICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RMVF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0bHRpdSIsICAgInMsaiIsCTB4MDQwYjAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sCi17InRsdHUiLCAgICAicyx0IiwJMHgwMDAwMDAzMywgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bHR1IiwgICAgInMsdCxxIiwJMHgwMDAwMDAzMywgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bHR1IiwgICAgInMsaiIsCTB4MDQwYjAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sIC8qIHRsdGl1ICovCi17InRsdHUiLCAgICAicyxJIiwJMCwgICAgKGludCkgTV9UTFRVX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRuZWkiLCAgICAicyxqIiwJMHgwNDBlMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwKLXsidG5lIiwgICAgICJzLHQiLAkweDAwMDAwMDM2LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRuZSIsICAgICAicyx0LHEiLAkweDAwMDAwMDM2LCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRuZSIsICAgICAicyxqIiwJMHgwNDBlMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwgLyogdG5laSAqLwoteyJ0bmUiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVE5FX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRydW5jLmwuZCIsICJELFMiLAkweDQ2MjAwMDA5LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsidHJ1bmMubC5zIiwgIkQsUyIsCTB4NDYwMDAwMDksIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJ0cnVuYy53LmQiLCAiRCxTIiwJMHg0NjIwMDAwZCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InRydW5jLncuZCIsICJELFMseCIsCTB4NDYyMDAwMGQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJ0cnVuYy53LmQiLCAiRCxTLHQiLAkwLCAgICAoaW50KSBNX1RSVU5DV0QsCUlOU05fTUFDUk8sCUkxCX0sCi17InRydW5jLncucyIsICJELFMiLAkweDQ2MDAwMDBkLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsidHJ1bmMudy5zIiwgIkQsUyx4IiwJMHg0NjAwMDAwZCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InRydW5jLncucyIsICJELFMsdCIsCTAsICAgIChpbnQpIE1fVFJVTkNXUywJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxkIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMRCwJSU5TTl9NQUNSTywJSTMJfSwKLXsidWxkIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMRF9BLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJ1bGgiLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxILAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bGgiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxIX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsaHUiLCAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEhVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bGh1IiwgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxIVV9BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bHciLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxXLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bHciLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxXX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InVzZCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VU0QsCUlOU05fTUFDUk8sCUkzCX0sCi17InVzZCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VU0RfQSwJSU5TTl9NQUNSTywJSTMJfSwKLXsidXNoIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTSCwJSU5TTl9NQUNSTywJSTEJfSwKLXsidXNoIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VTSF9BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1c3ciLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVVNXLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1c3ciLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNXX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InhvciIsICAgICAiZCx2LHQiLAkweDAwMDAwMDI2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsieG9yIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fWE9SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InhvcmkiLCAgICAidCxyLGkiLAkweDM4MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17IndhaXQiLCAgICAiIiwJCTB4NDIwMDAwMjAsIDB4ZmZmZmZmZmYsCVRSQVAsCUkzfE0xCX0sCi17IndhaXRpIiwgICAiIiwJCTB4NDIwMDAwMjAsIDB4ZmZmZmZmZmYsCVRSQVAsCUwxCX0sCi17IndiIiwgCSAgICAibyhiKSIsCTB4YmMwNDAwMDAsIDB4ZmMxZjAwMDAsIFNNfFJEX2IsCUwxCX0sCi0vKiBObyBoYXphcmQgcHJvdGVjdGlvbiBvbiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMtLXRoZXkgc2hvdWxkbid0Ci0gICBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBwcm9jZXNzb3IgYW5kIGlmIHRoZXkgZG8gaXQncyB1cCB0byB0aGUKLSAgIHVzZXIgdG8gcHV0IGluIG5vcHMgYXMgbmVjZXNzYXJ5LiAgVGhlc2UgYXJlIGF0IHRoZSBlbmQgc28gdGhhdCB0aGUKLSAgIGRpc2FzZW1ibGVyIHJlY29nbml6ZXMgbW9yZSBzcGVjaWZpYyB2ZXJzaW9ucyBmaXJzdC4gICovCi17ImMwIiwgICAgICAiQyIsCTB4NDIwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoteyJjMSIsICAgICAgIkMiLAkweDQ2MDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiYzIiLCAgICAgICJDIiwJMHg0YTAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCi17ImMzIiwgICAgICAiQyIsCTB4NGUwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoteyJjb3AwIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AwLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJjb3AxIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AxLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJjb3AyIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AyLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJjb3AzIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AzLAlJTlNOX01BQ1JPLAlJMQl9LAotCi0gIC8qIENvbmZsaWN0cyB3aXRoIHRoZSA0NjUwJ3MgIm11bCIgaW5zdHJ1Y3Rpb24uICBOb2JvZHkncyB1c2luZyB0aGUKLSAgICAgNDAxMCBhbnkgbW9yZSwgc28gbW92ZSB0aGlzIGluc24gb3V0IG9mIHRoZSB3YXkuICBJZiB0aGUgb2JqZWN0Ci0gICAgIGZvcm1hdCBnYXZlIHVzIG1vcmUgaW5mbywgd2UgY291bGQgZG8gdGhpcyByaWdodC4gICovCi17ImFkZGNpdSIsICAidCxyLGoiLAkweDcwMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsTDEJfSwKLX07Ci0KLSNkZWZpbmUgTUlQU19OVU1fT1BDT0RFUyBcCi0JKChzaXplb2YgbWlwc19idWlsdGluX29wY29kZXMpIC8gKHNpemVvZiAobWlwc19idWlsdGluX29wY29kZXNbMF0pKSkKLWNvbnN0IGludCBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzID0gTUlQU19OVU1fT1BDT0RFUzsKLQotLyogY29uc3QgcmVtb3ZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgdG8gYWxsb3cgZm9yIGR5bmFtaWMgZXh0ZW5zaW9ucyB0byB0aGUgCi0gKiBidWlsdC1pbiBpbnN0cnVjdGlvbiBzZXQuICovCi1zdHJ1Y3QgbWlwc19vcGNvZGUgKm1pcHNfb3Bjb2RlcyA9Ci0gIChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgbWlwc19idWlsdGluX29wY29kZXM7Ci1pbnQgYmZkX21pcHNfbnVtX29wY29kZXMgPSBNSVBTX05VTV9PUENPREVTOwotI3VuZGVmIE1JUFNfTlVNX09QQ09ERVMKLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzMTYtb3BjLmMgYi9vcGNvZGVzL21pcHMxNi1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkMmRiYi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21pcHMxNi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKiBtaXBzMTYtb3BjLmMuICBNaXBzMTYgb3Bjb2RlIHRhYmxlLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotCi0vKiBUaGlzIGlzIHRoZSBvcGNvZGVzIHRhYmxlIGZvciB0aGUgbWlwczE2IHByb2Nlc3Nvci4gIFRoZSBmb3JtYXQgb2YKLSAgIHRoaXMgdGFibGUgaXMgaW50ZW50aW9uYWxseSBpZGVudGljYWwgdG8gdGhlIG9uZSBpbiBtaXBzLW9wYy5jLgotICAgSG93ZXZlciwgdGhlIHNwZWNpYWwgbGV0dGVycyB0aGF0IGFwcGVhciBpbiB0aGUgYXJndW1lbnQgc3RyaW5nIGFyZQotICAgZGlmZmVyZW50LCBhbmQgdGhlIHRhYmxlIHVzZXMgc29tZSBkaWZmZXJlbnQgZmxhZ3MuICAqLwotCi0vKiBVc2Ugc29tZSBzaG9ydCBoYW5kIG1hY3JvcyB0byBrZWVwIGRvd24gdGhlIGxlbmd0aCBvZiB0aGUgbGluZXMgaW4KLSAgIHRoZSBvcGNvZGVzIHRhYmxlLiAgKi8KLQotI2RlZmluZSBVQkQgICAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotI2RlZmluZSBCUiAgICAgIE1JUFMxNl9JTlNOX0JSQU5DSAotCi0jZGVmaW5lIFdSX3gJTUlQUzE2X0lOU05fV1JJVEVfWAotI2RlZmluZSBXUl95CU1JUFMxNl9JTlNOX1dSSVRFX1kKLSNkZWZpbmUgV1JfeglNSVBTMTZfSU5TTl9XUklURV9aCi0jZGVmaW5lIFdSX1QJTUlQUzE2X0lOU05fV1JJVEVfVAotI2RlZmluZSBXUl9TUAlNSVBTMTZfSU5TTl9XUklURV9TUAotI2RlZmluZSBXUl8zMQlNSVBTMTZfSU5TTl9XUklURV8zMQotI2RlZmluZSBXUl9ZCU1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZCi0KLSNkZWZpbmUgUkRfeAlNSVBTMTZfSU5TTl9SRUFEX1gKLSNkZWZpbmUgUkRfeQlNSVBTMTZfSU5TTl9SRUFEX1kKLSNkZWZpbmUgUkRfWglNSVBTMTZfSU5TTl9SRUFEX1oKLSNkZWZpbmUgUkRfVAlNSVBTMTZfSU5TTl9SRUFEX1QKLSNkZWZpbmUgUkRfU1AJTUlQUzE2X0lOU05fUkVBRF9TUAotI2RlZmluZSBSRF8zMQlNSVBTMTZfSU5TTl9SRUFEXzMxCi0jZGVmaW5lIFJEX1BDCU1JUFMxNl9JTlNOX1JFQURfUEMKLSNkZWZpbmUgUkRfWAlNSVBTMTZfSU5TTl9SRUFEX0dQUl9YCi0KLSNkZWZpbmUgV1JfSEkJSU5TTl9XUklURV9ISQotI2RlZmluZSBXUl9MTwlJTlNOX1dSSVRFX0xPCi0jZGVmaW5lIFJEX0hJCUlOU05fUkVBRF9ISQotI2RlZmluZSBSRF9MTwlJTlNOX1JFQURfTE8KLQotI2RlZmluZSBUUkFQCUlOU05fVFJBUAotCi0jZGVmaW5lIEkzCUlOU05fSVNBMwotCi0jZGVmaW5lIFQzICAgICAgSU5TTl8zOTAwCi0KLWNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBtaXBzMTZfb3Bjb2Rlc1tdID0gewoteyJub3AiLAkgICAgIiIsCQkweDY1MDAsIDB4ZmZmZiwgUkRfWiB9LCAvKiBtb3ZlICQwLCRaICovCi17ImxhIiwJICAgICJ4LEEiLAkweDA4MDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoteyJhYnMiLAkgICAgIngsdyIsCTAsIChpbnQpIE1fQUJTLCBJTlNOX01BQ1JPIH0sCi17ImFkZGl1IiwgICAieSx4LDQiLAkweDQwMDAsIDB4ZjgxMCwgV1JfeXxSRF94IH0sCi17ImFkZGl1IiwgICAieCxrIiwJMHg0ODAwLCAweGY4MDAsIFdSX3h8UkRfeCB9LAoteyJhZGRpdSIsICAgIlMsSyIsCTB4NjMwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCB9LAoteyJhZGRpdSIsICAgIlMsUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCi17ImFkZGl1IiwgICAieCxQLFYiLAkweDA4MDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoteyJhZGRpdSIsICAgIngsUyxWIiwJMHgwMDAwLCAweGY4MDAsIFdSX3h8UkRfU1AgfSwKLXsiYWRkdSIsICAgICJ6LHYseSIsCTB4ZTAwMSwgMHhmODAzLCBXUl96fFJEX3h8UkRfeSB9LAoteyJhZGR1IiwgICAgInkseCw0IiwJMHg0MDAwLCAweGY4MTAsIFdSX3l8UkRfeCB9LAoteyJhZGR1IiwgICAgIngsayIsCTB4NDgwMCwgMHhmODAwLCBXUl94fFJEX3ggfSwKLXsiYWRkdSIsICAgICJTLEsiLAkweDYzMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AgfSwKLXsiYWRkdSIsICAgICJTLFMsSyIsCTB4NjMwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCB9LAoteyJhZGR1IiwgICAgIngsUCxWIiwJMHgwODAwLCAweGY4MDAsIFdSX3h8UkRfUEMgfSwKLXsiYWRkdSIsICAgICJ4LFMsViIsCTB4MDAwMCwgMHhmODAwLCBXUl94fFJEX1NQIH0sCi17ImFuZCIsCSAgICAieCx5IiwJMHhlODBjLCAweGY4MWYsIFdSX3h8UkRfeHxSRF95IH0sCi17ImIiLAkgICAgInEiLAkweDEwMDAsIDB4ZjgwMCwgQlJ9LAoteyJiZXEiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CRVEsIElOU05fTUFDUk8gfSwKLXsiYmVxIiwgICAgICJ4LFUscCIsCTAsIChpbnQpIE1fQkVRX0ksIElOU05fTUFDUk8gfSwKLXsiYmVxeiIsICAgICJ4LHAiLAkweDIwMDAsIDB4ZjgwMCwgQlJ8UkRfeCB9LAoteyJiZ2UiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CR0UsIElOU05fTUFDUk8gfSwKLXsiYmdlIiwgICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkdFX0ksIElOU05fTUFDUk8gfSwKLXsiYmdldSIsICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkdFVSwgSU5TTl9NQUNSTyB9LAoteyJiZ2V1IiwgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR0VVX0ksIElOU05fTUFDUk8gfSwKLXsiYmd0IiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkdULCBJTlNOX01BQ1JPIH0sCi17ImJndCIsICAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JHVF9JLCBJTlNOX01BQ1JPIH0sCi17ImJndHUiLCAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JHVFUsIElOU05fTUFDUk8gfSwKLXsiYmd0dSIsICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkdUVV9JLCBJTlNOX01BQ1JPIH0sCi17ImJsZSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMRSwgSU5TTl9NQUNSTyB9LAoteyJibGUiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CTEVfSSwgSU5TTl9NQUNSTyB9LAoteyJibGV1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CTEVVLCBJTlNOX01BQ1JPIH0sCi17ImJsZXUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMRVVfSSwgSU5TTl9NQUNSTyB9LAoteyJibHQiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CTFQsIElOU05fTUFDUk8gfSwKLXsiYmx0IiwgICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkxUX0ksIElOU05fTUFDUk8gfSwKLXsiYmx0dSIsICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkxUVSwgSU5TTl9NQUNSTyB9LAoteyJibHR1IiwgICAgIngsOCxwIiwJMCwgKGludCkgTV9CTFRVX0ksIElOU05fTUFDUk8gfSwKLXsiYm5lIiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQk5FLCBJTlNOX01BQ1JPIH0sCi17ImJuZSIsICAgICAieCxVLHAiLAkwLCAoaW50KSBNX0JORV9JLCBJTlNOX01BQ1JPIH0sCi17ImJuZXoiLCAgICAieCxwIiwJMHgyODAwLCAweGY4MDAsIEJSfFJEX3ggfSwKLXsiYnJlYWsiLCAgICI2IiwJMHhlODA1LCAweGY4MWYsIFRSQVAgfSwKLXsiYnRlcXoiLCAgICJwIiwJMHg2MDAwLCAweGZmMDAsIEJSfFJEX1QgfSwKLXsiYnRuZXoiLCAgICJwIiwJMHg2MTAwLCAweGZmMDAsIEJSfFJEX1QgfSwKLXsiY21waSIsICAgICJ4LFUiLAkweDcwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17ImNtcCIsCSAgICAieCx5IiwJMHhlODBhLCAweGY4MWYsIFdSX1R8UkRfeHxSRF95IH0sCi17ImNtcCIsICAgICAieCxVIiwJMHg3MDAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJkbGEiLAkgICAgInksRSIsCTB4ZmUwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoteyJkYWRkaXUiLCAgInkseCw0IiwJMHg0MDEwLCAweGY4MTAsIFdSX3l8UkRfeCwgSTMgfSwKLXsiZGFkZGl1IiwgICJ5LGoiLAkweGZkMDAsIDB4ZmYwMCwgV1JfeXxSRF95LCBJMyB9LAoteyJkYWRkaXUiLCAgIlMsSyIsCTB4ZmIwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCwgSTMgfSwKLXsiZGFkZGl1IiwgICJTLFMsSyIsCTB4ZmIwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCwgSTMgfSwKLXsiZGFkZGl1IiwgICJ5LFAsVyIsCTB4ZmUwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoteyJkYWRkaXUiLCAgInksUyxXIiwJMHhmZjAwLCAweGZmMDAsIFdSX3l8UkRfU1AsIEkzIH0sCi17ImRhZGR1IiwgICAieix2LHkiLAkweGUwMDAsIDB4ZjgwMywgV1JfenxSRF94fFJEX3ksIEkzIH0sCi17ImRhZGR1IiwgICAieSx4LDQiLAkweDQwMTAsIDB4ZjgxMCwgV1JfeXxSRF94LCBJMyB9LAoteyJkYWRkdSIsICAgInksaiIsCTB4ZmQwMCwgMHhmZjAwLCBXUl95fFJEX3ksIEkzIH0sCi17ImRhZGR1IiwgICAiUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoteyJkYWRkdSIsICAgIlMsUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoteyJkYWRkdSIsICAgInksUCxXIiwJMHhmZTAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImRhZGR1IiwgICAieSxTLFciLAkweGZmMDAsIDB4ZmYwMCwgV1JfeXxSRF9TUCwgSTMgfSwKLXsiZGRpdiIsICAgICIwLHgseSIsCTB4ZTgxZSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRkaXYiLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RESVZfMywgSU5TTl9NQUNSTyB9LAoteyJkZGl2dSIsICAgIjAseCx5IiwJMHhlODFmLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZGRpdnUiLCAgICJ6LHYseSIsCTAsIChpbnQpIE1fRERJVlVfMywgSU5TTl9NQUNSTyB9LAoteyJkaXYiLCAgICAgIjAseCx5IiwJMHhlODFhLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJkaXYiLCAgICAgInosdix5IiwJMCwgKGludCkgTV9ESVZfMywgSU5TTl9NQUNSTyB9LAoteyJkaXZ1IiwgICAgIjAseCx5IiwJMHhlODFiLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJkaXZ1IiwgICAgInosdix5IiwJMCwgKGludCkgTV9ESVZVXzMsIElOU05fTUFDUk8gfSwKLXsiZG11bCIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRE1VTCwgSU5TTl9NQUNSTywgSTMgfSwKLXsiZG11bHQiLCAgICJ4LHkiLAkweGU4MWMsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkbXVsdHUiLCAgIngseSIsCTB4ZTgxZCwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRyZW0iLCAgICAiMCx4LHkiLAkweGU4MWUsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkcmVtIiwgICAgInosdix5IiwJMCwgKGludCkgTV9EUkVNXzMsIElOU05fTUFDUk8gfSwKLXsiZHJlbXUiLCAgICIwLHgseSIsCTB4ZTgxZiwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRyZW11IiwgICAieix2LHkiLAkwLCAoaW50KSBNX0RSRU1VXzMsIElOU05fTUFDUk8gfSwKLXsiZHNsbHYiLCAgICJ5LHgiLAkweGU4MTQsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzbGwiLCAgICAieCx3LFsiLAkweDMwMDEsIDB4ZjgwMywgV1JfeHxSRF95LCBJMyB9LAoteyJkc2xsIiwgICAgInkseCIsCTB4ZTgxNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNyYXYiLCAgICJ5LHgiLAkweGU4MTcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzcmEiLCAgICAieSxdIiwJMHhlODEzLCAweGY4MWYsIFdSX3l8UkRfeSwgSTMgfSwKLXsiZHNyYSIsICAgICJ5LHgiLAkweGU4MTcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzcmx2IiwgICAieSx4IiwJMHhlODE2LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc3JsIiwgICAgInksXSIsCTB4ZTgwOCwgMHhmODFmLCBXUl95fFJEX3ksIEkzIH0sCi17ImRzcmwiLCAgICAieSx4IiwJMHhlODE2LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc3VidSIsICAgInosdix5IiwJMHhlMDAyLCAweGY4MDMsIFdSX3p8UkRfeHxSRF95LCBJMyB9LAoteyJkc3VidSIsICAgInkseCw0IiwJMCwgKGludCkgTV9EU1VCVV9JLCBJTlNOX01BQ1JPIH0sCi17ImRzdWJ1IiwgICAieSxqIiwJMCwgKGludCkgTV9EU1VCVV9JXzIsIElOU05fTUFDUk8gfSwKLXsiZXhpdCIsICAgICJMIiwJMHhlZDA5LCAweGZmMWYsIFRSQVAgfSwKLXsiZXhpdCIsICAgICJMIiwJMHhlZTA5LCAweGZmMWYsIFRSQVAgfSwKLXsiZXhpdCIsICAgICJMIiwJMHhlZjA5LCAweGZmMWYsIFRSQVAgfSwKLXsiZW50cnkiLCAgICJsIiwJMHhlODA5LCAweGY4MWYsIFRSQVAgfSwKLXsiZXh0ZW5kIiwgICJlIiwJMHhmMDAwLCAweGY4MDAsIDAgfSwKLXsiamFsciIsICAgICJ4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCi17ImphbHIiLCAgICAiUix4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCi17ImphbCIsICAgICAieCIsCTB4ZTg0MCwgMHhmOGZmLCBVQkR8V1JfMzF8UkRfeCB9LAoteyJqYWwiLCAgICAgIlIseCIsCTB4ZTg0MCwgMHhmOGZmLCBVQkR8V1JfMzF8UkRfeCB9LAoteyJqYWwiLAkgICAgImEiLAkweDE4MDAsIDB4ZmMwMCwgVUJEfFdSXzMxIH0sCi17ImphbHgiLCAgICAiYSIsCTB4MWMwMCwgMHhmYzAwLCBVQkR8V1JfMzEgfSwKLXsianIiLAkgICAgIngiLAkweGU4MDAsIDB4ZjhmZiwgVUJEfFJEX3ggfSwKLXsianIiLAkgICAgIlIiLAkweGU4MjAsIDB4ZmZmZiwgVUJEfFJEXzMxIH0sCi17ImoiLAkgICAgIngiLAkweGU4MDAsIDB4ZjhmZiwgVUJEfFJEX3ggfSwKLXsiaiIsCSAgICAiUiIsCTB4ZTgyMCwgMHhmZmZmLCBVQkR8UkRfMzEgfSwKLXsibGIiLAkgICAgInksNSh4KSIsCTB4ODAwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibGJ1IiwJICAgICJ5LDUoeCkiLAkweGEwMDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCi17ImxkIiwJICAgICJ5LEQoeCkiLAkweDM4MDAsIDB4ZjgwMCwgV1JfeXxSRF94LCBJMyB9LAoteyJsZCIsCSAgICAieSxCIiwJMHhmYzAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImxkIiwJICAgICJ5LEQoUCkiLAkweGZjMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsibGQiLAkgICAgInksRChTKSIsCTB4ZjgwMCwgMHhmZjAwLCBXUl95fFJEX1NQLCBJMyB9LAoteyJsaCIsCSAgICAieSxIKHgpIiwJMHg4ODAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsaHUiLAkgICAgInksSCh4KSIsCTB4YTgwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibGkiLAkgICAgIngsVSIsCTB4NjgwMCwgMHhmODAwLCBXUl94IH0sCi17Imx3IiwJICAgICJ5LFcoeCkiLAkweDk4MDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCi17Imx3IiwJICAgICJ4LEEiLAkweGIwMDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoteyJsdyIsCSAgICAieCxWKFApIiwJMHhiMDAwLCAweGY4MDAsIFdSX3h8UkRfUEMgfSwKLXsibHciLAkgICAgIngsVihTKSIsCTB4OTAwMCwgMHhmODAwLCBXUl94fFJEX1NQIH0sCi17Imx3dSIsICAgICAieSxXKHgpIiwJMHhiODAwLCAweGY4MDAsIFdSX3l8UkRfeCwgSTMgfSwKLXsibWZoaSIsICAgICJ4IiwJMHhlODEwLCAweGY4ZmYsIFdSX3h8UkRfSEkgfSwKLXsibWZsbyIsICAgICJ4IiwJMHhlODEyLCAweGY4ZmYsIFdSX3h8UkRfTE8gfSwKLXsibW92ZSIsICAgICJ5LFgiLAkweDY3MDAsIDB4ZmYwMCwgV1JfeXxSRF9YIH0sCi17Im1vdmUiLCAgICAiWSxaIiwJMHg2NTAwLCAweGZmMDAsIFdSX1l8UkRfWiB9LAoteyJtdWwiLCAgICAgInosdix5IiwJMCwgKGludCkgTV9NVUwsIElOU05fTUFDUk8gfSwKLXsibXVsdCIsICAgICJ4LHkiLAkweGU4MTgsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17Im11bHR1IiwgICAieCx5IiwJMHhlODE5LCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJuZWciLAkgICAgIngsdyIsCTB4ZTgwYiwgMHhmODFmLCBXUl94fFJEX3kgfSwKLXsibm90IiwJICAgICJ4LHciLAkweGU4MGYsIDB4ZjgxZiwgV1JfeHxSRF95IH0sCi17Im9yIiwJICAgICJ4LHkiLAkweGU4MGQsIDB4ZjgxZiwgV1JfeHxSRF94fFJEX3kgfSwKLXsicmVtIiwgICAgICIwLHgseSIsCTB4ZTgxYSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsicmVtIiwgICAgICJ6LHYseSIsCTAsIChpbnQpIE1fUkVNXzMsIElOU05fTUFDUk8gfSwKLXsicmVtdSIsICAgICIwLHgseSIsCTB4ZTgxYiwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsicmVtdSIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fUkVNVV8zLCBJTlNOX01BQ1JPIH0sCi17InNiIiwJICAgICJ5LDUoeCkiLAkweGMwMDAsIDB4ZjgwMCwgUkRfeXxSRF94IH0sCi17InNkIiwJICAgICJ5LEQoeCkiLAkweDc4MDAsIDB4ZjgwMCwgUkRfeXxSRF94LCBJMyB9LAoteyJzZCIsCSAgICAieSxEKFMpIiwJMHhmOTAwLCAweGZmMDAsIFJEX3l8UkRfUEMsIEkzIH0sCi17InNkIiwJICAgICJSLEMoUykiLAkweGZhMDAsIDB4ZmYwMCwgUkRfMzF8UkRfUEMgfSwKLXsic2giLAkgICAgInksSCh4KSIsCTB4YzgwMCwgMHhmODAwLCBSRF95fFJEX3ggfSwKLXsic2xsdiIsICAgICJ5LHgiLAkweGU4MDQsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic2xsIiwJICAgICJ4LHcsPCIsCTB4MzAwMCwgMHhmODAzLCBXUl94fFJEX3kgfSwKLXsic2xsIiwgICAgICJ5LHgiLAkweGU4MDQsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic2x0aSIsICAgICJ4LDgiLAkweDUwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17InNsdCIsCSAgICAieCx5IiwJMHhlODAyLCAweGY4MWYsIFdSX1R8UkRfeHxSRF95IH0sCi17InNsdCIsICAgICAieCw4IiwJMHg1MDAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJzbHRpdSIsICAgIngsOCIsCTB4NTgwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsic2x0dSIsICAgICJ4LHkiLAkweGU4MDMsIDB4ZjgxZiwgV1JfVHxSRF94fFJEX3kgfSwKLXsic2x0dSIsICAgICJ4LDgiLAkweDU4MDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17InNyYXYiLCAgICAieSx4IiwJMHhlODA3LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94IH0sCi17InNyYSIsCSAgICAieCx3LDwiLAkweDMwMDMsIDB4ZjgwMywgV1JfeHxSRF95IH0sCi17InNyYSIsICAgICAieSx4IiwJMHhlODA3LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94IH0sCi17InNybHYiLCAgICAieSx4IiwJMHhlODA2LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94IH0sCi17InNybCIsCSAgICAieCx3LDwiLAkweDMwMDIsIDB4ZjgwMywgV1JfeHxSRF95IH0sCi17InNybCIsICAgICAieSx4IiwJMHhlODA2LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94IH0sCi17InN1YnUiLCAgICAieix2LHkiLAkweGUwMDMsIDB4ZjgwMywgV1JfenxSRF94fFJEX3kgfSwKLXsic3VidSIsICAgICJ5LHgsNCIsCTAsIChpbnQpIE1fU1VCVV9JLCBJTlNOX01BQ1JPIH0sCi17InN1YnUiLCAgICAieCxrIiwJMCwgKGludCkgTV9TVUJVX0lfMiwgSU5TTl9NQUNSTyB9LAoteyJzdyIsCSAgICAieSxXKHgpIiwJMHhkODAwLCAweGY4MDAsIFJEX3l8UkRfeCB9LAoteyJzdyIsCSAgICAieCxWKFMpIiwJMHhkMDAwLCAweGY4MDAsIFJEX3h8UkRfU1AgfSwKLXsic3ciLAkgICAgIlIsVihTKSIsCTB4NjIwMCwgMHhmZjAwLCBSRF8zMXxSRF9TUCB9LAoteyJ4b3IiLAkgICAgIngseSIsCTB4ZTgwZSwgMHhmODFmLCBXUl94fFJEX3h8UkRfeSB9LAotfTsKLQotY29uc3QgaW50IGJmZF9taXBzMTZfbnVtX29wY29kZXMgPQotICAoKHNpemVvZiBtaXBzMTZfb3Bjb2RlcykgLyAoc2l6ZW9mIChtaXBzMTZfb3Bjb2Rlc1swXSkpKTsKZGlmZiAtLWdpdCBhL29wY29kZXMvbXB3LWNvbmZpZy5pbiBiL29wY29kZXMvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5YmU5ZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIG9wY29kZXMuCi0KLVNldCB0YXJnZXRfYXJjaCBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLS4qLS4qLy8nYAotCi1TZXQgYXJjaG5hbWUgQVJDSF97dGFyZ2V0X2FyY2h9Ci0KLUlmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvbTY4ay8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJtNjhrLWRpcy5jLm8gIntvfSJtNjhrLW9wYy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvcG93ZXJwYy8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJwcGMtZGlzLmMubyAie299InBwYy1vcGMuYy5vJwotRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL2kzODYvCi0JU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30iaTM4Ni1kaXMuYy5vJwotRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL21pcHMvCi0JU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30ibWlwcy1kaXMuYy5vICJ7b30ibWlwcy1vcGMuYy5vJwotRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL3NoLwotCVNldCBCRkRfTUFDSElORVMgICcie299InNoLWRpcy5jLm8nCi1FbmQgSWYKLQotRWNobyAnIyBTdGFydCBmcm9tIG1wdy1jb25maWcuaW4nCQkJID4gIntvfSJtay50bXAKLUVjaG8gIkJGRF9NQUNISU5FUyA9ICIge0JGRF9NQUNISU5FU30JCQk+PiAie299Im1rLnRtcAotRWNobyAiQVJDSERFRlMgPSAtZCIge2FyY2huYW1lfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCQk+PiAie299Im1rLnRtcAotCi1FY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldwotRWNobyAnI2luY2x1ZGUgIm1wdy5oIicJCSAJCQk+PiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCmRpZmYgLS1naXQgYS9vcGNvZGVzL21wdy1tYWtlLnNlZCBiL29wY29kZXMvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTYwNDg2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBvcGNvZGVzIE1ha2VmaWxlLmluIGludG8gTVBXIHN5bnRheC4KLQotIyBFbXB0eSBIREVGSU5FUy4KLS9IREVGSU5FUy9zL0BIREVGSU5FU0AvLwotCi0jIEZpeCBwYXRobmFtZXMgdG8gaW5jbHVkZSBkaXJlY3Rvcmllcy4KLS9eSU5DRElSID0gL3MvXklOQ0RJUiA9IC4qJC9JTkNESVIgPSAie3RvcHNyY2Rpcn0iaW5jbHVkZS8KLS9eQ1NFQVJDSCA9IC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotCi0vQkZEX01BQ0hJTkVTL3MvQEJGRF9NQUNISU5FU0Ave0JGRF9NQUNISU5FU30vCi0vYXJjaGRlZnMvcy9AYXJjaGRlZnNAL3tBUkNIREVGU30vCi0KLSMgTm8gUElDIGZvb2xlcnkgaW4gdGhpcyBlbnZpcm9ubWVudC4KLS9AQUxMTElCU0Avcy9AQUxMTElCU0Ave1RBUkdFVExJQn0vCi0vQFBJQ0xJU1RAL3MvQFBJQ0xJU1RALy8KLS9AUElDRkxBR0Avcy9AUElDRkxBR0AvLwotL157T0ZJTEVTfSBcXE9wdGlvbi1mIHN0YW1wLXBpY2Rpci8sL14kL2QKLQotIyBSZW1vdmUgdGhlIHBpYyB0cmlja2VyeSBmcm9tIHRoZSBkZWZhdWx0IGJ1aWxkIHJ1bGUuCi0vXlwuY1wubyBcXE9wdGlvbi1mIC8sL0VuZCBJZi9jXAotLmMubyBcXE9wdGlvbi1mIC5jCi0KLSMgUmVtb3ZlIHBpYyB0cmlja2VyeSBmcm9tIG90aGVyIHJ1bGVzIC0gYWltZWQgYXQgdGhlIHJ1bGUKLSMgZm9yIGRpc2Fzc2VtYmxlLm8gaW4gcGFydGljdWxhci4KLS8tbiAie1BJQ0ZMQUd9Ii8sL0VuZCBJZi9kCmRpZmYgLS1naXQgYS9vcGNvZGVzL25zMzJrLWRpcy5jIGIvb3Bjb2Rlcy9uczMyay1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwMjY2Yi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL25zMzJrLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODk0ICswLDAgQEAKLS8qIFByaW50IE5hdGlvbmFsIFNlbWljb25kdWN0b3IgMzIwMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChjKSAxOTg2LCA4OCwgOTEsIDkyLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIG9wY29kZXMgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2lmICFkZWZpbmVkKGNvbnN0KSAmJiAhZGVmaW5lZChfX1NURENfXykKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotI2luY2x1ZGUgIm9wY29kZS9uczMyay5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgZGlzYXNzZW1ibGVfaW5mbyAqZGlzX2luZm87Ci0KLS8qCi0gKiBIYWNrcyB0byBnZXQgaXQgdG8gY29tcGlsZSA8PSBSRUFEIFRIRVNFIEFTIEZJWEVTIE5FRURFRAotICovCi0jZGVmaW5lIElOVkFMSURfRkxPQVQodmFsLCBzaXplKSBpbnZhbGlkX2Zsb2F0KChjaGFyICopdmFsLCBzaXplKQotCi1zdGF0aWMgaW50IHByaW50X2luc25fYXJnCi0gIFBBUkFNUyAoKGludCwgaW50LCBpbnQgKiwgY2hhciAqLCBiZmRfdm1hLCBjaGFyICosIGludCkpOwotc3RhdGljIGludCBnZXRfZGlzcGxhY2VtZW50IFBBUkFNUyAoKGNoYXIgKiwgaW50ICopKTsKLXN0YXRpYyBpbnQgaW52YWxpZF9mbG9hdCBQQVJBTVMgKChjaGFyICosIGludCkpOwotCi1zdGF0aWMgbG9uZyByZWFkX21lbW9yeV9pbnRlZ2VyKGFkZHIsIG5yKQotICAgICB1bnNpZ25lZCBjaGFyICphZGRyOwotICAgICBpbnQgbnI7Ci17Ci0gIGxvbmcgdmFsOwotICBpbnQgaTsKLSAgZm9yICh2YWwgPSAwLCBpID0gbnIgLSAxOyBpID49IDA7IGktLSkgewotICAgIHZhbCA9ICAodmFsIDw8IDgpOwotICAgIHZhbCB8PSAoMHhmZiAmICooYWRkciArIGkpKTsKLSAgfQotICByZXR1cm4gdmFsOwotfQotCi0vKiAzMjAwMCBpbnN0cnVjdGlvbnMgYXJlIG5ldmVyIGxvbmdlciB0aGFuIHRoaXMuICAqLwotI2RlZmluZSBNQVhMRU4gNjIKLQotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLXN0cnVjdCBwcml2YXRlCi17Ci0gIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KLSAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOwotICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotfTsKLQotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBwcml2YXRlICpwcml2ID0gKHN0cnVjdCBwcml2YXRlICopaW5mby0+cHJpdmF0ZV9kYXRhOwotICBiZmRfdm1hIHN0YXJ0ID0gcHJpdi0+aW5zbl9zdGFydCArIChwcml2LT5tYXhfZmV0Y2hlZCAtIHByaXYtPnRoZV9idWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHN0YXJ0LAotCQkJCSAgICAgIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLSAgcmV0dXJuIDE7Ci19Ci0vKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0jZGVmaW5lIE5PUENPREVTIChzaXplb2YgbnMzMmtfb3Bjb2RlcyAvIHNpemVvZiBuczMya19vcGNvZGVzWzBdKQotCi0jZGVmaW5lIE5FWFRfSVNfQUREUgknfCcKLQotDAotc3RydWN0IG5zMzJrX29wdGlvbiB7Ci0gIGNoYXIgKnBhdHRlcm47CQkvKiB0aGUgb3B0aW9uIGl0c2VsZiAqLwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwkJLyogYmluYXJ5IHZhbHVlIG9mIHRoZSBvcHRpb24gKi8KLSAgdW5zaWduZWQgbG9uZyBtYXRjaDsJCS8qIHRoZXNlIGJpdHMgbXVzdCBtYXRjaCAqLwotfTsKLQotDAotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gb3B0X3VbXT0gLyogcmVzdG9yZSwgZXhpdCAqLwotewotICB7ICJyMCIsCTB4ODAsCTB4ODAJfSwKLSAgeyAicjEiLAkweDQwLAkweDQwCX0sCi0gIHsgInIyIiwJMHgyMCwJMHgyMAl9LAotICB7ICJyMyIsCTB4MTAsCTB4MTAJfSwKLSAgeyAicjQiLAkweDA4LAkweDA4CX0sCi0gIHsgInI1IiwJMHgwNCwJMHgwNAl9LAotICB7ICJyNiIsCTB4MDIsCTB4MDIJfSwKLSAgeyAicjciLAkweDAxLAkweDAxCX0sCi0gIHsgIDAgLAkweDAwLAkweDAwCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdF9VW109IC8qIHNhdmUsIGVudGVyICovCi17Ci0gIHsgInIwIiwJMHgwMSwJMHgwMQl9LAotICB7ICJyMSIsCTB4MDIsCTB4MDIJfSwKLSAgeyAicjIiLAkweDA0LAkweDA0CX0sCi0gIHsgInIzIiwJMHgwOCwJMHgwOAl9LAotICB7ICJyNCIsCTB4MTAsCTB4MTAJfSwKLSAgeyAicjUiLAkweDIwLAkweDIwCX0sCi0gIHsgInI2IiwJMHg0MCwJMHg0MAl9LAotICB7ICJyNyIsCTB4ODAsCTB4ODAJfSwKLSAgeyAgMCAsCTB4MDAsCTB4MDAJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gb3B0X09bXT0gLyogc2V0Y2ZnICovCi17Ci0gIHsgImMiLAkweDgsCTB4OAl9LAotICB7ICJtIiwJMHg0LAkweDQJfSwKLSAgeyAiZiIsCTB4MiwJMHgyCX0sCi0gIHsgImkiLAkweDEsCTB4MQl9LAotICB7ICAwICwJMHgwLAkweDAJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gb3B0X0NbXT0gLyogY2ludiAqLwotewotICB7ICJhIiwJMHg0LAkweDQJfSwKLSAgeyAiaSIsCTB4MiwJMHgyCX0sCi0gIHsgImQiLAkweDEsCTB4MQl9LAotICB7ICAwICwJMHgwLAkweDAJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gb3B0X1NbXT0gLyogc3RyaW5nIGluc3QgKi8KLXsKLSAgeyAiYiIsCTB4MSwJMHgxCX0sCi0gIHsgInUiLAkweDYsCTB4Ngl9LAotICB7ICJ3IiwJMHgyLAkweDIJfSwKLSAgeyAgMCAsCTB4MCwJMHgwCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfUDUzMltdPSAvKiBscHIgc3ByICovCi17Ci0gIHsgInVzIiwJMHgwLAkweGYJfSwKLSAgeyAiZGNyIiwJMHgxLAkweGYJfSwKLSAgeyAiYnBjIiwJMHgyLAkweGYJfSwKLSAgeyAiZHNyIiwJMHgzLAkweGYJfSwKLSAgeyAiY2FyIiwJMHg0LAkweGYJfSwKLSAgeyAiZnAiLAkweDgsCTB4Zgl9LAotICB7ICJzcCIsCTB4OSwJMHhmCX0sCi0gIHsgInNiIiwJMHhhLAkweGYJfSwKLSAgeyAidXNwIiwJMHhiLAkweGYJfSwKLSAgeyAiY2ZnIiwJMHhjLAkweGYJfSwKLSAgeyAicHNyIiwJMHhkLAkweGYJfSwKLSAgeyAiaW50YmFzZSIsCTB4ZSwJMHhmCX0sCi0gIHsgIm1vZCIsCTB4ZiwJMHhmCX0sCi0gIHsgIDAgLAkweDAwLAkweGYJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gbGlzdF9NNTMyW109IC8qIGxtciBzbXIgKi8KLXsKLSAgeyAibWNyIiwJMHg5LAkweGYJfSwKLSAgeyAibXNyIiwJMHhhLAkweGYJfSwKLSAgeyAidGVhciIsCTB4YiwJMHhmCX0sCi0gIHsgInB0YjAiLAkweGMsCTB4Zgl9LAotICB7ICJwdGIxIiwJMHhkLAkweGYJfSwKLSAgeyAiaXZhcjAiLAkweGUsCTB4Zgl9LAotICB7ICJpdmFyMSIsCTB4ZiwJMHhmCX0sCi0gIHsgIDAgLAkweDAsCTB4Zgl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBsaXN0X1AwMzJbXT0gLyogbHByIHNwciAqLwotewotICB7ICJ1cHNyIiwJMHgwLAkweGYJfSwKLSAgeyAiZnAiLAkweDgsCTB4Zgl9LAotICB7ICJzcCIsCTB4OSwJMHhmCX0sCi0gIHsgInNiIiwJMHhhLAkweGYJfSwKLSAgeyAicHNyIiwJMHhiLAkweGYJfSwKLSAgeyAiaW50YmFzZSIsCTB4ZSwJMHhmCX0sCi0gIHsgIm1vZCIsCTB4ZiwJMHhmCX0sCi0gIHsgIDAgLAkweDAsCTB4Zgl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBsaXN0X00wMzJbXT0gLyogbG1yIHNtciAqLwotewotICB7ICJicHIwIiwJMHgwLAkweGYJfSwKLSAgeyAiYnByMSIsCTB4MSwJMHhmCX0sCi0gIHsgInBmMCIsCTB4NCwJMHhmCX0sCi0gIHsgInBmMSIsCTB4NSwJMHhmCX0sCi0gIHsgInNjIiwJMHg4LAkweGYJfSwKLSAgeyAibXNyIiwJMHhhLAkweGYJfSwKLSAgeyAiYmNudCIsCTB4YiwJMHhmCX0sCi0gIHsgInB0YjAiLAkweGMsCTB4Zgl9LAotICB7ICJwdGIxIiwJMHhkLAkweGYJfSwKLSAgeyAiZWlhIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MCwJMHhmCX0KLX07Ci0KLQotLyoKLSAqIGZpZ3VyZSBvdXQgd2hpY2ggb3B0aW9ucyBhcmUgcHJlc2VudAotICovCi1zdGF0aWMgdm9pZAotb3B0bGlzdChvcHRpb25zLCBvcHRpb25QLCByZXN1bHQpCi0gICAgIGludCBvcHRpb25zOwotICAgICBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uICpvcHRpb25QOwotICAgICBjaGFyICpyZXN1bHQ7Ci17Ci0gICAgaWYgKG9wdGlvbnMgPT0gMCkgewotCXNwcmludGYocmVzdWx0LCAiW10iKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIHNwcmludGYocmVzdWx0LCAiWyIpOwotCi0gICAgZm9yICg7IChvcHRpb25zICE9IDApICYmIG9wdGlvblAtPnBhdHRlcm47IG9wdGlvblArKykgewotCWlmICgob3B0aW9ucyAmIG9wdGlvblAtPm1hdGNoKSA9PSBvcHRpb25QLT52YWx1ZSkgewotCSAgICAvKiB3ZSBmb3VuZCBhIG1hdGNoLCB1cGRhdGUgcmVzdWx0IGFuZCBvcHRpb25zICovCi0JICAgIHN0cmNhdChyZXN1bHQsIG9wdGlvblAtPnBhdHRlcm4pOwotCSAgICBvcHRpb25zICY9IH5vcHRpb25QLT52YWx1ZTsKLQkgICAgaWYgKG9wdGlvbnMgIT0gMCkJLyogbW9yZSBvcHRpb25zIHRvIGNvbWUgKi8KLQkJc3RyY2F0KHJlc3VsdCwgIiwiKTsKLQl9Ci0gICAgfQotICAgIGlmIChvcHRpb25zICE9IDApCi0Jc3RyY2F0KHJlc3VsdCwgInVuZGVmaW5lZCIpOwotCi0gICAgc3RyY2F0KHJlc3VsdCwgIl0iKTsKLX0KLQotc3RhdGljIHZvaWQKLWxpc3Rfc2VhcmNoIChyZWdfdmFsdWUsIG9wdGlvblAsIHJlc3VsdCkKLSAgICAgaW50IHJlZ192YWx1ZTsKLSAgICAgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiAqb3B0aW9uUDsKLSAgICAgY2hhciAqcmVzdWx0OwotewotICAgIGZvciAoOyBvcHRpb25QLT5wYXR0ZXJuOyBvcHRpb25QKyspIHsKLQlpZiAoKHJlZ192YWx1ZSAmIG9wdGlvblAtPm1hdGNoKSA9PSBvcHRpb25QLT52YWx1ZSkgewotCSAgICBzcHJpbnRmKHJlc3VsdCwgIiVzIiwgb3B0aW9uUC0+cGF0dGVybik7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotICAgIHNwcmludGYocmVzdWx0LCAidW5kZWZpbmVkIik7Ci19Ci0MCi0vKgotICogZXh0cmFjdCAiY291bnQiIGJpdHMgc3RhcnRpbmcgIm9mZnNldCIgYml0cwotICogaW50byBidWZmZXIKLSAqLwotCi1zdGF0aWMgaW50Ci1iaXRfZXh0cmFjdCAoYnVmZmVyLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBpbnQgb2Zmc2V0OwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGludCByZXN1bHQ7Ci0gIGludCBiaXQ7Ci0KLSAgYnVmZmVyICs9IG9mZnNldCA+PiAzOwotICBvZmZzZXQgJj0gNzsKLSAgYml0ID0gMTsKLSAgcmVzdWx0ID0gMDsKLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgewotICAgICAgRkVUQ0hfREFUQShkaXNfaW5mbywgYnVmZmVyICsgMSk7Ci0gICAgICBpZiAoKCpidWZmZXIgJiAoMSA8PCBvZmZzZXQpKSkKLQlyZXN1bHQgfD0gYml0OwotICAgICAgaWYgKCsrb2Zmc2V0ID09IDgpCi0JewotCSAgb2Zmc2V0ID0gMDsKLQkgIGJ1ZmZlcisrOwotCX0KLSAgICAgIGJpdCA8PD0gMTsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIExpa2UgYml0IGV4dHJhY3QgYnV0IHRoZSBidWZmZXIgaXMgdmFsaWQgYW5kIGRvZW4ndCBuZWVkIHRvIGJlCi0gKiBmZXRjaGVkCi0gKi8KLXN0YXRpYyBpbnQKLWJpdF9leHRyYWN0X3NpbXBsZSAoYnVmZmVyLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBpbnQgb2Zmc2V0OwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGludCByZXN1bHQ7Ci0gIGludCBtYXNrOwotICBpbnQgYml0OwotCi0gIGJ1ZmZlciArPSBvZmZzZXQgPj4gMzsKLSAgb2Zmc2V0ICY9IDc7Ci0gIGJpdCA9IDE7Ci0gIHJlc3VsdCA9IDA7Ci0gIHdoaWxlIChjb3VudC0tKQotICAgIHsKLSAgICAgIGlmICgoKmJ1ZmZlciAmICgxIDw8IG9mZnNldCkpKQotCXJlc3VsdCB8PSBiaXQ7Ci0gICAgICBpZiAoKytvZmZzZXQgPT0gOCkKLQl7Ci0JICBvZmZzZXQgPSAwOwotCSAgYnVmZmVyKys7Ci0JfQotICAgICAgYml0IDw8PSAxOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQKLWJpdF9jb3B5IChidWZmZXIsIG9mZnNldCwgY291bnQsIHRvKQotICAgICBjaGFyICpidWZmZXI7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLSAgICAgY2hhciAqdG87Ci17Ci0gIGZvcig7IGNvdW50ID4gODsgY291bnQgLT0gOCwgdG8rKywgb2Zmc2V0ICs9IDgpCi0gICAgKnRvID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgb2Zmc2V0LCA4KTsKLSAgKnRvID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7Ci19Ci0KLQotc3RhdGljIGludAotc2lnbl9leHRlbmQgKHZhbHVlLCBiaXRzKQotICAgICBpbnQgdmFsdWUsIGJpdHM7Ci17Ci0gIHZhbHVlID0gdmFsdWUgJiAoKDEgPDwgYml0cykgLSAxKTsKLSAgcmV0dXJuICh2YWx1ZSAmICgxIDw8IChiaXRzLTEpKQotCSAgPyB2YWx1ZSB8ICh+KCgxIDw8IGJpdHMpIC0gMSkpCi0JICA6IHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQKLWZsaXBfYnl0ZXMgKHB0ciwgY291bnQpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50IGNvdW50OwotewotICBjaGFyIHRtcDsKLQotICB3aGlsZSAoY291bnQgPiAwKQotICAgIHsKLSAgICAgIHRtcCA9IHB0clswXTsKLSAgICAgIHB0clswXSA9IHB0cltjb3VudC0xXTsKLSAgICAgIHB0cltjb3VudC0xXSA9IHRtcDsKLSAgICAgIHB0cisrOwotICAgICAgY291bnQgLT0gMjsKLSAgICB9Ci19Ci0MCi0vKiBHaXZlbiBhIGNoYXJhY3RlciBDLCBkb2VzIGl0IHJlcHJlc2VudCBhIGdlbmVyYWwgYWRkcmVzc2luZyBtb2RlPyAgKi8KLSNkZWZpbmUgSXNfZ2VuKGMpIFwKLSAgKChjKSA9PSAnRicgfHwgKGMpID09ICdMJyB8fCAoYykgPT0gJ0InIFwKLSAgIHx8IChjKSA9PSAnVycgfHwgKGMpID09ICdEJyB8fCAoYykgPT0gJ0EnIHx8IChjKSA9PSAnSScgfHwgKGMpID09ICdaJykKLQotLyogQWRyZXNzaW5nIG1vZGVzLiAgKi8KLSNkZWZpbmUgQWRybW9kX2luZGV4X2J5dGUgMHgxYwotI2RlZmluZSBBZHJtb2RfaW5kZXhfd29yZCAweDFkCi0jZGVmaW5lIEFkcm1vZF9pbmRleF9kb3VibGV3b3JkIDB4MWUKLSNkZWZpbmUgQWRybW9kX2luZGV4X3F1YWR3b3JkIDB4MWYKLQotLyogSXMgTU9ERSBhbiBpbmRleGVkIGFkZHJlc3NpbmcgbW9kZT8gICovCi0jZGVmaW5lIEFkcm1vZF9pc19pbmRleChtb2RlKSBcCi0gIChtb2RlID09IEFkcm1vZF9pbmRleF9ieXRlIFwKLSAgIHx8IG1vZGUgPT0gQWRybW9kX2luZGV4X3dvcmQgXAotICAgfHwgbW9kZSA9PSBBZHJtb2RfaW5kZXhfZG91Ymxld29yZCBcCi0gICB8fCBtb2RlID09IEFkcm1vZF9pbmRleF9xdWFkd29yZCkKLQotDAotLyogUHJpbnQgdGhlIDMyMDAwIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBTVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX25zMzJrIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICByZWdpc3RlciBjaGFyICpkOwotICB1bnNpZ25lZCBzaG9ydCBmaXJzdF93b3JkOwotICBpbnQgaW9mZnNldDsJCS8qIGJpdHMgaW50byBpbnN0cnVjdGlvbiAqLwotICBpbnQgYW9mZnNldDsJCS8qIGJpdHMgaW50byBhcmd1bWVudHMgKi8KLSAgY2hhciBhcmdfYnVmc1tNQVhfQVJHUysxXVtBUkdfTEVOXTsKLSAgaW50IGFyZ251bTsKLSAgaW50IG1heGFyZzsKLSAgc3RydWN0IHByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmJ1ZmZlciA9IHByaXYudGhlX2J1ZmZlcjsKLSAgZGlzX2luZm8gPSBpbmZvOwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBtZW1hZGRyOwotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogTG9vayBmb3IgOGJpdCBvcGNvZGVzIGZpcnN0LiBPdGhlciB3aXNlLCBmZXRjaGluZyB0d28gYnl0ZXMgY291bGQgdGFrZQotICAgKiB1cyBvdmVyIHRoZSBlbmQgb2YgYWNjZXNzaWJsZSBkYXRhIHVubmVjZXNzYXJpbGx5Ci0gICAqLwotICBGRVRDSF9EQVRBKGluZm8sIGJ1ZmZlciArIDEpOwotICBmb3IgKGkgPSAwOyBpIDwgTk9QQ09ERVM7IGkrKykKLSAgICBpZiAobnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfaWRfc2l6ZSA8PSA4Ci0JJiYgKChidWZmZXJbMF0KLQkgICAgICYgKCgodW5zaWduZWQgbG9uZykgMSA8PCBuczMya19vcGNvZGVzW2ldLm9wY29kZV9pZF9zaXplKSAtIDEpKQotCSAgICA9PSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zZWVkKSkKLSAgICAgIGJyZWFrOwotICBpZiAoaSA9PSBOT1BDT0RFUykgewotICAgIC8qIE1heWJlIGl0IGlzIDkgdG8gMTYgYml0cyBiaWcgKi8KLSAgICBGRVRDSF9EQVRBKGluZm8sIGJ1ZmZlciArIDIpOwotICAgIGZpcnN0X3dvcmQgPSByZWFkX21lbW9yeV9pbnRlZ2VyKGJ1ZmZlciwgMik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTk9QQ09ERVM7IGkrKykKLSAgICAgIGlmICgoZmlyc3Rfd29yZAotCSAgICYgKCgodW5zaWduZWQgbG9uZykgMSA8PCBuczMya19vcGNvZGVzW2ldLm9wY29kZV9pZF9zaXplKSAtIDEpKQotCSAgPT0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfc2VlZCkKLQlicmVhazsKLQotICAgIC8qIEhhbmRsZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICBpZiAoaSA9PSBOT1BDT0RFUykKLSAgICAgIHsKLQkoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIwJW8iLCBidWZmZXJbMF0pOwotCXJldHVybiAxOwotICAgICAgfQotICB9Ci0KLSAgKCpkaXNfaW5mby0+ZnByaW50Zl9mdW5jKShkaXNfaW5mby0+c3RyZWFtLCAiJXMiLCBuczMya19vcGNvZGVzW2ldLm5hbWUpOwotCi0gIGlvZmZzZXQgPSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zaXplOwotICBhb2Zmc2V0ID0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfc2l6ZTsKLSAgZCA9IG5zMzJrX29wY29kZXNbaV0ub3BlcmFuZHM7Ci0KLSAgaWYgKCpkKQotICAgIHsKLSAgICAgIC8qIE9mZnNldCBpbiBiaXRzIG9mIHRoZSBmaXJzdCB0aGluZyBiZXlvbmQgZWFjaCBpbmRleCBieXRlLgotCSBFbGVtZW50IDAgaXMgZm9yIG9wZXJhbmQgQSBhbmQgZWxlbWVudCAxIGlzIGZvciBvcGVyYW5kIEIuCi0JIFRoZSByZXN0IGFyZSBpcnJlbGV2YW50LCBidXQgd2UgcHV0IHRoZW0gaGVyZSBzbyB3ZSBkb24ndAotCSBpbmRleCBvdXRzaWRlIHRoZSBhcnJheS4gICovCi0gICAgICBpbnQgaW5kZXhfb2Zmc2V0W01BWF9BUkdTXTsKLQotICAgICAgLyogMCBmb3Igb3BlcmFuZCBBLCAxIGZvciBvcGVyYW5kIEIsIGdyZWF0ZXIgZm9yIG90aGVyIGFyZ3MuICAqLwotICAgICAgaW50IHdoaWNoYXJnID0gMDsKLSAgICAgIAotICAgICAgKCpkaXNfaW5mby0+ZnByaW50Zl9mdW5jKShkaXNfaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotICAgICAgbWF4YXJnID0gMDsKLQotICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBmaW5kIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSBpbmRleCBieXRlcywKLQkgaWYgd2UgYXJlIHVzaW5nIHNjYWxlZCBpbmRleGVkIGFkZHJlc3NpbmcgbW9kZSwgc2luY2UgdGhlIGluZGV4Ci0JIGJ5dGVzIG9jY3VyIHJpZ2h0IGFmdGVyIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiwgbm90IGFzIHBhcnQKLQkgb2YgdGhlIGFkZHJlc3NpbmcgZXh0ZW5zaW9uLiAgKi8KLSAgICAgIGlmIChJc19nZW4oZFsxXSkpCi0JewotCSAgaW50IGFkZHJfbW9kZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQgLSA1LCA1KTsKLQotCSAgaWYgKEFkcm1vZF9pc19pbmRleCAoYWRkcl9tb2RlKSkKLQkgICAgewotCSAgICAgIGFvZmZzZXQgKz0gODsKLQkgICAgICBpbmRleF9vZmZzZXRbMF0gPSBhb2Zmc2V0OwotCSAgICB9Ci0JfQotICAgICAgaWYgKGRbMl0gJiYgSXNfZ2VuKGRbM10pKQotCXsKLQkgIGludCBhZGRyX21vZGUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0IC0gMTAsIDUpOwotCi0JICBpZiAoQWRybW9kX2lzX2luZGV4IChhZGRyX21vZGUpKQotCSAgICB7Ci0JICAgICAgYW9mZnNldCArPSA4OwotCSAgICAgIGluZGV4X29mZnNldFsxXSA9IGFvZmZzZXQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHdoaWxlICgqZCkKLQl7Ci0JICBhcmdudW0gPSAqZCAtICcxJzsKLQkgIGQrKzsKLQkgIGlmIChhcmdudW0gPiBtYXhhcmcgJiYgYXJnbnVtIDwgTUFYX0FSR1MpCi0JICAgIG1heGFyZyA9IGFyZ251bTsKLQkgIGlvZmZzZXQgPSBwcmludF9pbnNuX2FyZyAoKmQsIGlvZmZzZXQsICZhb2Zmc2V0LCBidWZmZXIsCi0JCQkJICAgIG1lbWFkZHIsIGFyZ19idWZzW2FyZ251bV0sCi0JCQkJICAgIGluZGV4X29mZnNldFt3aGljaGFyZ10pOwotCSAgZCsrOwotCSAgd2hpY2hhcmcrKzsKLQl9Ci0gICAgICBmb3IgKGFyZ251bSA9IDA7IGFyZ251bSA8PSBtYXhhcmc7IGFyZ251bSsrKQotCXsKLQkgIGJmZF92bWEgYWRkcjsKLQkgIGNoYXIgKmNoOwotCSAgZm9yIChjaCA9IGFyZ19idWZzW2FyZ251bV07ICpjaDspCi0JICAgIHsKLQkgICAgICBpZiAoKmNoID09IE5FWFRfSVNfQUREUikKLQkJewotCQkgICsrY2g7Ci0JCSAgYWRkciA9IGJmZF9zY2FuX3ZtYSAoY2gsIE5VTEwsIDE2KTsKLQkJICAoKmRpc19pbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyLCBkaXNfaW5mbyk7Ci0JCSAgd2hpbGUgKCpjaCAmJiAqY2ggIT0gTkVYVF9JU19BRERSKQotCQkgICAgKytjaDsKLQkJICBpZiAoKmNoKQotCQkgICAgKytjaDsKLQkJfQotCSAgICAgIGVsc2UKLQkJKCpkaXNfaW5mby0+ZnByaW50Zl9mdW5jKShkaXNfaW5mby0+c3RyZWFtLCAiJWMiLCAqY2grKyk7Ci0JICAgIH0KLQkgIGlmIChhcmdudW0gPCBtYXhhcmcpCi0JICAgICgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIiwgIik7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGFvZmZzZXQgLyA4OwotfQotCi0vKiBQcmludCBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kIG9mIGNhdGVnb3J5IGdpdmVuIGJ5IGQuICBJT0ZGU0VUIGlzCi0gICB0aGUgYml0IHBvc2l0aW9uIGJlbG93IHdoaWNoIHNtYWxsICg8MSBieXRlKSBwYXJ0cyBvZiB0aGUgb3BlcmFuZCBjYW4KLSAgIGJlIGZvdW5kICh1c3VhbGx5IGluIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiwgYnV0IGZvciBpbmRleGVkCi0gICBhZGRyZXNzaW5nIGl0IGNhbiBiZSBpbiB0aGUgaW5kZXggYnl0ZSkuICBBT0ZGU0VUUCBpcyBhIHBvaW50ZXIgdG8gdGhlCi0gICBiaXQgcG9zaXRpb24gb2YgdGhlIGFkZHJlc3NpbmcgZXh0ZW5zaW9uLiAgQlVGRkVSIGNvbnRhaW5zIHRoZQotICAgaW5zdHJ1Y3Rpb24uICBBRERSIGlzIHdoZXJlIEJVRkZFUiB3YXMgcmVhZCBmcm9tLiAgUHV0IHRoZSBkaXNhc3NlbWJsZWQKLSAgIHZlcnNpb24gb2YgdGhlIG9wZXJhbmQgaW4gUkVTVUxULiAgSU5ERVhfT0ZGU0VUIGlzIHRoZSBiaXQgcG9zaXRpb24KLSAgIG9mIHRoZSBpbmRleCBieXRlIChpdCBjb250YWlucyBnYXJiYWdlIGlmIHRoaXMgb3BlcmFuZCBpcyBub3QgYQotICAgZ2VuZXJhbCBvcGVyYW5kIHVzaW5nIHNjYWxlZCBpbmRleGVkIGFkZHJlc3NpbmcgbW9kZSkuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyAoZCwgaW9mZnNldCwgYW9mZnNldHAsIGJ1ZmZlciwgYWRkciwgcmVzdWx0LCBpbmRleF9vZmZzZXQpCi0gICAgIGludCBkOwotICAgICBpbnQgaW9mZnNldCwgKmFvZmZzZXRwOwotICAgICBjaGFyICpidWZmZXI7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY2hhciAqcmVzdWx0OwotICAgICBpbnQgaW5kZXhfb2Zmc2V0OwotewotICBpbnQgYWRkcl9tb2RlOwotICBmbG9hdCBGdmFsdWU7Ci0gIGRvdWJsZSBMdmFsdWU7Ci0gIGludCBJdmFsdWU7Ci0gIGludCBkaXNwMSwgZGlzcDI7Ci0gIGludCBpbmRleDsKLSAgaW50IHNpemU7Ci0KLSAgc3dpdGNoIChkKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIC8qIGEgImdlbiIgb3BlcmFuZCBidXQgNSBiaXRzIGZyb20gdGhlIGVuZCBvZiBpbnN0cnVjdGlvbiAqLwotICAgICAgaW9mZnNldCAtPSA1OwotICAgIGNhc2UgJ1onOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ0wnOgotICAgIGNhc2UgJ0knOgotICAgIGNhc2UgJ0InOgotICAgIGNhc2UgJ1cnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ0EnOgotICAgICAgYWRkcl9tb2RlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldC01LCA1KTsKLSAgICAgIGlvZmZzZXQgLT0gNTsKLSAgICAgIHN3aXRjaCAoYWRkcl9tb2RlKQotCXsKLQljYXNlIDB4MDogY2FzZSAweDE6IGNhc2UgMHgyOiBjYXNlIDB4MzoKLQljYXNlIDB4NDogY2FzZSAweDU6IGNhc2UgMHg2OiBjYXNlIDB4NzoKLQkgIC8qIHJlZ2lzdGVyIG1vZGUgUjAgLS0gUjcgKi8KLQkgIHN3aXRjaCAoZCkKLQkgICAgewotCSAgICBjYXNlICdGJzoKLQkgICAgY2FzZSAnTCc6Ci0JICAgIGNhc2UgJ1onOgotCSAgICAgIHNwcmludGYgKHJlc3VsdCwgImYlZCIsIGFkZHJfbW9kZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiciVkIiwgYWRkcl9tb2RlKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDg6IGNhc2UgMHg5OiBjYXNlIDB4YTogY2FzZSAweGI6Ci0JY2FzZSAweGM6IGNhc2UgMHhkOiBjYXNlIDB4ZTogY2FzZSAweGY6Ci0JICAvKiBSZWdpc3RlciByZWxhdGl2ZSBkaXNwKFIwIC0tIFI3KSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKHIlZCkiLCBkaXNwMSwgYWRkcl9tb2RlICYgNyk7Ci0JICBicmVhazsKLQljYXNlIDB4MTA6Ci0JY2FzZSAweDExOgotCWNhc2UgMHgxMjoKLQkgIC8qIE1lbW9yeSByZWxhdGl2ZSBkaXNwMihkaXNwMShGUCwgU1AsIFNCKSkgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBkaXNwMiA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQoJWQoJXMpKSIsIGRpc3AyLCBkaXNwMSwKLQkJICAgYWRkcl9tb2RlPT0weDEwPyJmcCI6YWRkcl9tb2RlPT0weDExPyJzcCI6InNiIik7Ci0JICBicmVhazsKLQljYXNlIDB4MTM6Ci0JICAvKiByZXNlcnZlZCAqLwotCSAgc3ByaW50ZiAocmVzdWx0LCAicmVzZXJ2ZWQiKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxNDoKLQkgIC8qIEltbWVkaWF0ZSAqLwotCSAgc3dpdGNoIChkKQotCSAgICB7Ci0JICAgIGNhc2UgJ0knOiBjYXNlICdaJzogY2FzZSAnQSc6Ci0JICAgICAgLyogSSBhbmQgWiBhcmUgb3V0cHV0IG9wZXJhbmRzIGFuZCBjYW5gdCBiZSBpbW1lZGlhdGUKLQkgICAgICAgKiBBIGlzIGFuIGFkZHJlc3MgYW5kIHdlIGNhbmB0IGhhdmUgdGhlIGFkZHJlc3Mgb2YKLQkgICAgICAgKiBhbiBpbW1lZGlhdGUgZWl0aGVyLiBXZSBkb24ndCBrbm93IGhvdyBtdWNoIHRvIGluY3JlYXNlCi0JICAgICAgICogYW9mZnNldHAgYnkgc2luY2Ugd2hhdGV2ZXIgZ2VuZXJhdGVkIHRoaXMgaXMgYnJva2VuCi0JICAgICAgICogYW55d2F5IQotCSAgICAgICAqLwotCSAgICAgIHNwcmludGYgKHJlc3VsdCwgXygiJDx1bmRlZmluZWQ+IikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdCJzoKLQkgICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDgpOwotCSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDgpOwotCSAgICAgICphb2Zmc2V0cCArPSA4OwotCSAgICAgIHNwcmludGYgKHJlc3VsdCwgIiQlZCIsIEl2YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgMTYpOwotCSAgICAgIGZsaXBfYnl0ZXMgKCZJdmFsdWUsIDIpOwotCSAgICAgICphb2Zmc2V0cCArPSAxNjsKLQkgICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlLCAxNik7Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJCVkIiwgSXZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnRCc6Ci0JICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAzMik7Ci0JICAgICAgZmxpcF9ieXRlcyAoJkl2YWx1ZSwgNCk7Ci0JICAgICAgKmFvZmZzZXRwICs9IDMyOwotCSAgICAgIHNwcmludGYgKHJlc3VsdCwgIiQlZCIsIEl2YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0YnOgotCSAgICAgIGJpdF9jb3B5IChidWZmZXIsICphb2Zmc2V0cCwgMzIsIChjaGFyICopICZGdmFsdWUpOwotCSAgICAgIGZsaXBfYnl0ZXMgKCZGdmFsdWUsIDQpOwotCSAgICAgICphb2Zmc2V0cCArPSAzMjsKLQkgICAgICBpZiAoSU5WQUxJRF9GTE9BVCAoJkZ2YWx1ZSwgNCkpCi0JCXNwcmludGYgKHJlc3VsdCwgIjw8aW52YWxpZCBmbG9hdCAweCUuOHg+PiIsICooaW50ICopICZGdmFsdWUpOwotCSAgICAgIGVsc2UgLyogYXNzdW1lIGhvc3QgaGFzIGllZWUgZmxvYXQgKi8KLQkJc3ByaW50ZiAocmVzdWx0LCAiJCVnIiwgRnZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnTCc6Ci0JICAgICAgYml0X2NvcHkgKGJ1ZmZlciwgKmFvZmZzZXRwLCA2NCwgKGNoYXIgKikgJkx2YWx1ZSk7Ci0JICAgICAgZmxpcF9ieXRlcyAoJkx2YWx1ZSwgOCk7Ci0JICAgICAgKmFvZmZzZXRwICs9IDY0OwotCSAgICAgIGlmIChJTlZBTElEX0ZMT0FUICgmTHZhbHVlLCA4KSkKLQkJc3ByaW50ZiAocmVzdWx0LCAiPDxpbnZhbGlkIGxvbmcgMHglLjh4JS44eD4+IiwKLQkJCSAqKCgoaW50ICopICZMdmFsdWUpICsgMSksICooaW50ICopICZMdmFsdWUpOwotCSAgICAgIGVsc2UgLyogYXNzdW1lIGhvc3QgaGFzIGllZWUgZmxvYXQgKi8KLQkJc3ByaW50ZiAocmVzdWx0LCAiJCVnIiwgTHZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAweDE1OgotCSAgLyogQWJzb2x1dGUgQGRpc3AgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICJAfCVkfCIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxNjoKLQkgIC8qIEV4dGVybmFsIEVYVChkaXNwMSkgKyBkaXNwMiAoTW9kIHRhYmxlIHN0dWZmKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIGRpc3AyID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICJFWFQoJWQpICsgJWQiLCBkaXNwMSwgZGlzcDIpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE3OgotCSAgLyogVG9wIG9mIHN0YWNrIHRvcyAqLwotCSAgc3ByaW50ZiAocmVzdWx0LCAidG9zIik7Ci0JICBicmVhazsKLQljYXNlIDB4MTg6Ci0JICAvKiBNZW1vcnkgc3BhY2UgZGlzcChGUCkgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICIlZChmcCkiLCBkaXNwMSk7Ci0JICBicmVhazsKLQljYXNlIDB4MTk6Ci0JICAvKiBNZW1vcnkgc3BhY2UgZGlzcChTUCkgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICIlZChzcCkiLCBkaXNwMSk7Ci0JICBicmVhazsKLQljYXNlIDB4MWE6Ci0JICAvKiBNZW1vcnkgc3BhY2UgZGlzcChTQikgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICIlZChzYikiLCBkaXNwMSk7Ci0JICBicmVhazsKLQljYXNlIDB4MWI6Ci0JICAvKiBNZW1vcnkgc3BhY2UgZGlzcChQQykgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICAqcmVzdWx0KysgPSBORVhUX0lTX0FERFI7Ci0JICBzcHJpbnRmX3ZtYSAocmVzdWx0LCBhZGRyICsgZGlzcDEpOwotCSAgcmVzdWx0ICs9IHN0cmxlbiAocmVzdWx0KTsKLQkgICpyZXN1bHQrKyA9IE5FWFRfSVNfQUREUjsKLQkgICpyZXN1bHQgPSAnXDAnOwotCSAgYnJlYWs7Ci0JY2FzZSAweDFjOgotCWNhc2UgMHgxZDoKLQljYXNlIDB4MWU6Ci0JY2FzZSAweDFmOgotCSAgLyogU2NhbGVkIGluZGV4IGJhc2Vtb2RlW1IwIC0tIFI3OkIsVyxELFFdICovCi0JICBpbmRleCA9IGJpdF9leHRyYWN0IChidWZmZXIsIGluZGV4X29mZnNldCAtIDgsIDMpOwotCSAgcHJpbnRfaW5zbl9hcmcgKGQsIGluZGV4X29mZnNldCwgYW9mZnNldHAsIGJ1ZmZlciwgYWRkciwKLQkJCSAgcmVzdWx0LCAwKTsKLQkgIHsKLQkgICAgc3RhdGljIGNvbnN0IGNoYXIgKmluZCA9ICJid2RxIjsKLQkgICAgY2hhciAqb2ZmOwotCi0JICAgIG9mZiA9IHJlc3VsdCArIHN0cmxlbiAocmVzdWx0KTsKLQkgICAgc3ByaW50ZiAob2ZmLCAiW3IlZDolY10iLCBpbmRleCwKLQkJICAgICBpbmRbYWRkcl9tb2RlICYgM10pOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnSCc6Ci0gICAgY2FzZSAncSc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOwotICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgNCk7Ci0gICAgICBzcHJpbnRmIChyZXN1bHQsICIlZCIsIEl2YWx1ZSk7Ci0gICAgICBpb2Zmc2V0IC09IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdyJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQtMywgMyk7Ci0gICAgICBzcHJpbnRmIChyZXN1bHQsICJyJWQiLCBJdmFsdWUmNyk7Ci0gICAgICBpb2Zmc2V0IC09IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHNwcmludGYgKHJlc3VsdCwgIiVkIiwgZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICBJdmFsdWUgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLSAgICAgIC8qCi0gICAgICAgKiBXYXJuaW5nISEgIEhBQ0sgQUxFUlQhCi0gICAgICAgKiBPcGVyYW5kIHR5cGUgJ2InIGlzIG9ubHkgdXNlZCBieSB0aGUgY21we2IsdyxkfSBhbmQKLSAgICAgICAqIG1vdm17Yix3LGR9IGluc3RydWN0aW9uczsgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIKLSAgICAgICAqIGl0J3MgYSBgYicgb3IgYHcnIG9yIGBkJyBpbnN0cnVjdGlvbjsgYW5kIGZvciBib3RoCi0gICAgICAgKiBjbXBtIGFuZCBtb3ZtIGl0J3Mgc3RvcmVkIGF0IHRoZSBzYW1lIHBsYWNlIHNvIHdlCi0gICAgICAgKiBqdXN0IGdyYWIgdHdvIGJpdHMgb2YgdGhlIG9wY29kZSBhbmQgbG9vayBhdCBpdC4uLgotICAgICAgICogCi0gICAgICAgKi8KLSAgICAgIHNpemUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtNiwgMik7Ci0gICAgICBpZiAoc2l6ZSA9PSAwKQkJLyogMDAgPT4gYiAqLwotCXNpemUgPSAxOwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAxKQkvKiAwMSA9PiB3ICovCi0Jc2l6ZSA9IDI7Ci0gICAgICBlbHNlCi0Jc2l6ZSA9IDQ7CQkvKiAxMSA9PiBkICovCi0KLSAgICAgIHNwcmludGYgKHJlc3VsdCwgIiVkIiwgKEl2YWx1ZSAvIHNpemUpICsgMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdwJzoKLSAgICAgICpyZXN1bHQrKyA9IE5FWFRfSVNfQUREUjsKLSAgICAgIHNwcmludGZfdm1hIChyZXN1bHQsIGFkZHIgKyBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKSk7Ci0gICAgICByZXN1bHQgKz0gc3RybGVuIChyZXN1bHQpOwotICAgICAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOwotICAgICAgKnJlc3VsdCA9ICdcMCc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0gICAgICAqYW9mZnNldHAgKz0gODsKLSAgICAgIHNwcmludGYgKHJlc3VsdCwgIjB4JXgiLCBJdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndSc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDgpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF91LCByZXN1bHQpOwotICAgICAgKmFvZmZzZXRwICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdVJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfVSwgcmVzdWx0KTsKLSAgICAgICphb2Zmc2V0cCArPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnTyc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtOSwgOSk7Ci0gICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X08sIHJlc3VsdCk7Ci0gICAgICBpb2Zmc2V0IC09IDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdDJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC00LCA0KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfQywgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1MnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0IC0gOCwgOCk7Ci0gICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X1MsIHJlc3VsdCk7Ci0gICAgICBpb2Zmc2V0IC09IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdNJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC00LCA0KTsKLSAgICAgIGxpc3Rfc2VhcmNoKEl2YWx1ZSwgMCA/IGxpc3RfTTAzMiA6IGxpc3RfTTUzMiwgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1AnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOwotICAgICAgbGlzdF9zZWFyY2goSXZhbHVlLCAwID8gbGlzdF9QMDMyIDogbGlzdF9QNTMyLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZyc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsICphb2Zmc2V0cCwgMyk7Ci0gICAgICBzcHJpbnRmKHJlc3VsdCwgIiVkIiwgSXZhbHVlKTsKLSAgICAgICphb2Zmc2V0cCArPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRyc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsICphb2Zmc2V0cCwgNSk7Ci0gICAgICBzcHJpbnRmKHJlc3VsdCwgIiVkIiwgSXZhbHVlICsgMSk7Ci0gICAgICAqYW9mZnNldHAgKz0gNTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIGlvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApCi0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50ICphb2Zmc2V0cDsKLXsKLSAgaW50IEl2YWx1ZTsKLSAgc2hvcnQgSXZhbHVlMjsKLQotICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDgpOwotICBzd2l0Y2ggKEl2YWx1ZSAmIDB4YzApCi0gICAgewotICAgIGNhc2UgMHgwMDoKLSAgICBjYXNlIDB4NDA6Ci0gICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlLCA3KTsKLSAgICAgICphb2Zmc2V0cCArPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDgwOgotICAgICAgSXZhbHVlMiA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgMTYpOwotICAgICAgZmxpcF9ieXRlcyAoJkl2YWx1ZTIsIDIpOwotICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZTIsIDE0KTsKLSAgICAgICphb2Zmc2V0cCArPSAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhjMDoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgMzIpOwotICAgICAgZmxpcF9ieXRlcyAoJkl2YWx1ZSwgNCk7Ci0gICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlLCAzMCk7Ci0gICAgICAqYW9mZnNldHAgKz0gMzI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBJdmFsdWU7Ci19Ci0MCi0KLSNpZiAxIC8qIGEgdmVyc2lvbiB0aGF0IHNob3VsZCB3b3JrIG9uIG5zMzJrIGYncyZkJ3Mgb24gYW55IG1hY2hpbmUgKi8KLXN0YXRpYyBpbnQKLWludmFsaWRfZmxvYXQgKHAsIGxlbikKLSAgICAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgICAgcmVnaXN0ZXIgaW50IGxlbjsKLXsKLSAgcmVnaXN0ZXIgaW50IHZhbDsKLQotICBpZiAoIGxlbiA9PSA0ICkKLSAgICB2YWwgPSAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDIzLCA4KS8qZXhwb25lbnQqLyA9PSAweGZmCi0JICAgfHwgKGJpdF9leHRyYWN0X3NpbXBsZShwLCAyMywgOCkvKmV4cG9uZW50Ki8gPT0gMCAmJgotCSAgICAgICBiaXRfZXh0cmFjdF9zaW1wbGUocCwgMCwgMjMpLyptYW50aXNhKi8gIT0gMCkpOwotICBlbHNlIGlmICggbGVuID09IDggKQotICAgIHZhbCA9IChiaXRfZXh0cmFjdF9zaW1wbGUocCwgNTIsIDExKS8qZXhwb25lbnQqLyA9PSAweDdmZgotCSAgIHx8IChiaXRfZXh0cmFjdF9zaW1wbGUocCwgNTIsIDExKS8qZXhwb25lbnQqLyA9PSAwCi0JICAgICAgICYmIChiaXRfZXh0cmFjdF9zaW1wbGUocCwgMCwgMzIpLypsb3cgbWFudGlzYSovICE9IDAKLQkJICAgfHwgYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDMyLCAyMCkvKmhpZ2ggbWFudGlzYSovICE9IDApKSk7Ci0gIGVsc2UKLSAgICB2YWwgPSAxOwotICByZXR1cm4gKHZhbCk7Ci19Ci0jZWxzZQotCi0vKiBhc3N1bWVzIHRoZSBieXRlcyBoYXZlIGJlZW4gc3dhcHBlZCB0byBsb2NhbCBvcmRlciAqLwotdHlwZWRlZiB1bmlvbiB7IGRvdWJsZSBkOwotCQlmbG9hdCBmOwotCQlzdHJ1Y3QgeyB1bnNpZ25lZCBtOjIzLCBlOjgsIDoxO30gc2Y7Ci0JCXN0cnVjdCB7IHVuc2lnbmVkIGxtOyB1bnNpZ25lZCBtOjIwLCBlOjExLCA6MTt9IHNkOwotCSAgICAgIH0gZmxvYXRfdHlwZV91OwotCi1zdGF0aWMgaW50Ci1pbnZhbGlkX2Zsb2F0IChwLCBsZW4pCi0gICAgIHJlZ2lzdGVyIGZsb2F0X3R5cGVfdSAqcDsKLSAgICAgcmVnaXN0ZXIgaW50IGxlbjsKLXsKLSAgcmVnaXN0ZXIgaW50IHZhbDsKLSAgaWYgKCBsZW4gPT0gc2l6ZW9mIChmbG9hdCkgKQotICAgIHZhbCA9IChwLT5zZi5lID09IDB4ZmYKLQkgICB8fCAocC0+c2YuZSA9PSAwICYmIHAtPnNmLm0gIT0gMCkpOwotICBlbHNlIGlmICggbGVuID09IHNpemVvZiAoZG91YmxlKSApCi0gICAgdmFsID0gKHAtPnNkLmUgPT0gMHg3ZmYKLQkgICB8fCAocC0+c2QuZSA9PSAwICYmIChwLT5zZC5tICE9IDAgfHwgcC0+c2QubG0gIT0gMCkpKTsKLSAgZWxzZQotICAgIHZhbCA9IDE7Ci0gIHJldHVybiAodmFsKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9vcGludGwuaCBiL29wY29kZXMvb3BpbnRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OTAxNjAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9vcGludGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIG9waW50bC5oIC0gb3Bjb2RlcyBzcGVjaWZpYyBoZWFkZXIgZm9yIGdldHRleHQgY29kZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIG9wY29kZXMgbGlicmFyeSB1c2VkIGJ5IEdBUyBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGRlZmluZSBfKFN0cmluZykgZGdldHRleHQgKFBBQ0tBR0UsIFN0cmluZykKLSMgaWZkZWYgZ2V0dGV4dF9ub29wCi0jICBkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKLSMgZWxzZQotIyAgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSMgZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotIyBkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wai1kaXMuYyBiL29wY29kZXMvcGotZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTgyOTUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wai1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKiBwai1kaXMuYyAtLSBEaXNhc3NlbWJsZSBwaWNvSmF2YSBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAotICAgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4sIG9mIFRyYW5zbWV0YSAoc2FjQHBvYm94LmNvbSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAib3Bjb2RlL3BqLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi1leHRlcm4gY29uc3QgcGpfb3BjX2luZm9fdCBwal9vcGNfaW5mb1s1MTJdOwotCi1zdGF0aWMgaW50IGdldF9pbnQgKG1lbWFkZHIsIGlwdHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgaW50ICppcHRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciBpdmFsWzRdOwotCi0gIGludCBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBpdmFsLCA0LCBpbmZvKTsKLQotICAqaXB0ciA9IChpdmFsWzBdIDw8IDI0KSAKLSAgICB8IChpdmFsWzFdIDw8IDE2KSAKLSAgICB8IChpdmFsWzJdIDw8IDgpIAotICAgIHwgKGl2YWxbM10gPDwgMCkgOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLWludAotcHJpbnRfaW5zbl9waiAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2ZuID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlOwotICBpbnQgc3RhdHVzOwotCi0gIGlmICgoc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoYWRkciwgJm9wY29kZSwgMSwgaW5mbykpKQotICAgIGdvdG8gZmFpbDsKLQotICBpZiAob3Bjb2RlID09IDB4ZmYpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBieXRlXzI7Ci0gICAgICBpZiAoKHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGFkZHIgKyAxLCAmYnl0ZV8yLCAxLCBpbmZvKSkpCi0JZ290byBmYWlsOwotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiJXNcdCIsIHBqX29wY19pbmZvW29wY29kZSArIGJ5dGVfMl0ubmFtZSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpzZXAgPSAiXHQiOwotICAgICAgaW50IGluc25fc3RhcnQgPSBhZGRyOwotICAgICAgY29uc3QgcGpfb3BjX2luZm9fdCAqb3AgPSAmcGpfb3BjX2luZm9bb3Bjb2RlXTsKLSAgICAgIGludCBhOwotICAgICAgYWRkcisrOwotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7Ci0KLSAgICAgIC8qIFRoZSB0YWJsZXN3aXRjaCBpbnN0cnVjdGlvbiBpcyBmb2xsb3dlZCBieSB0aGUgZGVmYXVsdAotCSBhZGRyZXNzLCBsb3cgdmFsdWUsIGhpZ2ggdmFsdWUgYW5kIHRoZSBkZXN0aW5hdGlvbnMuICovCi0KLSAgICAgIGlmIChzdHJjbXAgKG9wLT5uYW1lLCAidGFibGVzd2l0Y2giKSA9PSAwKQotCXsKLQkgIGludCBsb3d2YWw7Ci0JICBpbnQgaGlnaHZhbDsKLQkgIGludCB2YWw7Ci0KLQkgIGFkZHIgPSAoYWRkciArIDMpICYgfjM7Ci0JICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZ2YWwsIGluZm8pKSkKLQkgICAgZ290byBmYWlsOwotCi0JICBmcHJpbnRmX2ZuIChzdHJlYW0sIiBkZWZhdWx0OiAiKTsKLQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsICsgaW5zbl9zdGFydCwgaW5mbyk7Ci0JICBhZGRyICs9IDQ7Ci0KLQkgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJmxvd3ZhbCwgaW5mbykpKQotCSAgICBnb3RvIGZhaWw7Ci0JICBhZGRyICs9IDQ7Ci0KLQkgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJmhpZ2h2YWwsIGluZm8pKSkKLQkgICAgZ290byBmYWlsOwotCSAgYWRkciArPSA0OwotCi0JICB3aGlsZSAobG93dmFsIDw9IGhpZ2h2YWwpIHsKLQkgICAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmdmFsLCBpbmZvKSkpCi0JICAgICAgZ290byBmYWlsOwotCSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sIiAlZDpbIiwgbG93dmFsKTsKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwgKyBpbnNuX3N0YXJ0LCBpbmZvKTsKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIgXSIpOwotCSAgICBhZGRyICs9IDQ7Ci0JICAgIGxvd3ZhbCsrOwotCSAgfQotCSAgcmV0dXJuIGFkZHIgLSBpbnNuX3N0YXJ0OwotCX0KLQotICAgICAgLyogVGhlIGxvb2t1cHN3aXRjaCBpbnN0cnVjdGlvbiBpcyBmb2xsb3dlZCBieSB0aGUgZGVmYXVsdAotCSBhZGRyZXNzLCBlbGVtZW50IGNvdW50IGFuZCBwYWlycyBvZiB2YWx1ZXMgYW5kCi0JIGFkZHJlc3Nlcy4gKi8KLQkgICAgCi0gICAgICBpZiAoc3RyY21wIChvcC0+bmFtZSwgImxvb2t1cHN3aXRjaCIpID09IDApCi0JewotCSAgaW50IGNvdW50OwotCSAgaW50IHZhbDsKLQotCSAgYWRkciA9IChhZGRyICsgMykgJiB+MzsKLQkgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJnZhbCwgaW5mbykpKQotCSAgICBnb3RvIGZhaWw7Ci0JICBhZGRyICs9IDQ7Ci0KLQkgIGZwcmludGZfZm4gKHN0cmVhbSwiIGRlZmF1bHQ6ICIpOwotCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwgKyBpbnNuX3N0YXJ0LCBpbmZvKTsKLQotCSAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmY291bnQsIGluZm8pKSkKLQkgICAgZ290byBmYWlsOwotCSAgYWRkciArPSA0OwotCi0JICB3aGlsZSAoY291bnQtLSkgewotCSAgICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZ2YWwsIGluZm8pKSkKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIGFkZHIgKz0gNDsKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIgJWQ6WyIsIHZhbCk7Ci0KLQkgICAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmdmFsLCBpbmZvKSkpCi0JICAgICAgZ290byBmYWlsOwotCSAgICBhZGRyICs9IDQ7Ci0KLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwgKyBpbnNuX3N0YXJ0LCBpbmZvKTsKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIgXSIpOwotCSAgfQotCSAgcmV0dXJuIGFkZHIgLSBpbnNuX3N0YXJ0OwotCX0KLSAgICAgIGZvciAoYSA9IDA7IG9wLT5hcmdbYV07IGErKykKLQl7Ci0JICB1bnNpZ25lZCBjaGFyIGRhdGFbNF07Ci0JICBpbnQgdmFsID0gMDsKLQkgIGludCBpOwotCSAgaW50IHNpemUgPSBBU0laRSAob3AtPmFyZ1thXSk7Ci0KLQkgIGlmICgoc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoYWRkciwgZGF0YSwgc2l6ZSwgaW5mbykpKQotCSAgICBnb3RvIGZhaWw7Ci0KLQkgIHZhbCA9IChVTlMgKG9wLT5hcmdbMF0pIHx8ICgoZGF0YVswXSAmIDB4ODApID09IDApKSA/IDAgOiAtMTsKLQotCSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLQkgICAgdmFsID0gKHZhbCA8PCA4KSB8IChkYXRhW2ldICYgMHhmZik7Ci0KLQkgIGlmIChQQ1JFTCAob3AtPmFyZ1thXSkpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsICsgaW5zbl9zdGFydCwgaW5mbyk7Ci0JICBlbHNlCi0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIiVzJWQiLCBzZXAsIHZhbCk7Ci0KLQkgIHNlcCA9ICIsIjsKLQkgIGFkZHIgKz0gc2l6ZTsKLQl9Ci0gICAgICByZXR1cm4gb3AtPmxlbjsKLSAgICB9Ci0KLSBmYWlsOgotICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBhZGRyLCBpbmZvKTsKLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wai1vcGMuYyBiL29wY29kZXMvcGotb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmN2UzOGUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wai1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKiBwai1vcGMuYyAtLSBEZWZpbml0aW9ucyBmb3IgcGljb0phdmEgb3Bjb2Rlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIFRyYW5zbWV0YSAoc2FjQHBvYm94LmNvbSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3BqLmgiCi0KLWNvbnN0IHBqX29wY19pbmZvX3QgcGpfb3BjX2luZm9bNTEyXSA9Ci17Ci17IDB4MDAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJub3AifSwKLXsgMHgwMSwgICAtMSwgMSwge09fTiwgT19OfSwgImFjb25zdF9udWxsIn0sCi17IDB4MDIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpY29uc3RfbTEifSwKLXsgMHgwMywgICAtMSwgMSwge09fTiwgT19OfSwgImljb25zdF8wIn0sCi17IDB4MDQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpY29uc3RfMSJ9LAoteyAweDA1LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0XzIifSwKLXsgMHgwNiwgICAtMSwgMSwge09fTiwgT19OfSwgImljb25zdF8zIn0sCi17IDB4MDcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpY29uc3RfNCJ9LAoteyAweDA4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0XzUifSwKLXsgMHgwOSwgICAtMSwgMSwge09fTiwgT19OfSwgImxjb25zdF8wIn0sCi17IDB4MGEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsY29uc3RfMSJ9LAoteyAweDBiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmNvbnN0XzAifSwKLXsgMHgwYywgICAtMSwgMSwge09fTiwgT19OfSwgImZjb25zdF8xIn0sCi17IDB4MGQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmY29uc3RfMiJ9LAoteyAweDBlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGNvbnN0XzAifSwKLXsgMHgwZiwgICAtMSwgMSwge09fTiwgT19OfSwgImRjb25zdF8xIn0sCi17IDB4MTAsICAgLTEsIDIsIHtPXzgsIE9fTn0sICJiaXB1c2gifSwKLXsgMHgxMSwgICAtMSwgMywge09fMTYsIE9fTn0sICJzaXB1c2gifSwKLXsgMHgxMiwgICAtMSwgMiwge09fTiwgT19OfSwgImxkYyJ9LAoteyAweDEzLCAgIC0xLCAzLCB7T19OLCBPX059LCAibGRjX3cifSwKLXsgMHgxNCwgICAtMSwgMywge09fTiwgT19OfSwgImxkYzJfdyJ9LAoteyAweDE1LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImlsb2FkIn0sCi17IDB4MTYsICAgLTEsIDIsIHtPX1U4LCBPX059LCAibGxvYWQifSwKLXsgMHgxNywgICAtMSwgMiwge09fVTgsIE9fTn0sICJmbG9hZCJ9LAoteyAweDE4LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImRsb2FkIn0sCi17IDB4MTksICAgLTEsIDIsIHtPX1U4LCBPX059LCAiYWxvYWQifSwKLXsgMHgxYSwgICAtMSwgMSwge09fTiwgT19OfSwgImlsb2FkXzAifSwKLXsgMHgxYiwgICAtMSwgMSwge09fTiwgT19OfSwgImlsb2FkXzEifSwKLXsgMHgxYywgICAtMSwgMSwge09fTiwgT19OfSwgImlsb2FkXzIifSwKLXsgMHgxZCwgICAtMSwgMSwge09fTiwgT19OfSwgImlsb2FkXzMifSwKLXsgMHgxZSwgICAtMSwgMSwge09fTiwgT19OfSwgImxsb2FkXzAifSwKLXsgMHgxZiwgICAtMSwgMSwge09fTiwgT19OfSwgImxsb2FkXzEifSwKLXsgMHgyMCwgICAtMSwgMSwge09fTiwgT19OfSwgImxsb2FkXzIifSwKLXsgMHgyMSwgICAtMSwgMSwge09fTiwgT19OfSwgImxsb2FkXzMifSwKLXsgMHgyMiwgICAtMSwgMSwge09fTiwgT19OfSwgImZsb2FkXzAifSwKLXsgMHgyMywgICAtMSwgMSwge09fTiwgT19OfSwgImZsb2FkXzEifSwKLXsgMHgyNCwgICAtMSwgMSwge09fTiwgT19OfSwgImZsb2FkXzIifSwKLXsgMHgyNSwgICAtMSwgMSwge09fTiwgT19OfSwgImZsb2FkXzMifSwKLXsgMHgyNiwgICAtMSwgMSwge09fTiwgT19OfSwgImRsb2FkXzAifSwKLXsgMHgyNywgICAtMSwgMSwge09fTiwgT19OfSwgImRsb2FkXzEifSwKLXsgMHgyOCwgICAtMSwgMSwge09fTiwgT19OfSwgImRsb2FkXzIifSwKLXsgMHgyOSwgICAtMSwgMSwge09fTiwgT19OfSwgImRsb2FkXzMifSwKLXsgMHgyYSwgICAtMSwgMSwge09fTiwgT19OfSwgImFsb2FkXzAifSwKLXsgMHgyYiwgICAtMSwgMSwge09fTiwgT19OfSwgImFsb2FkXzEifSwKLXsgMHgyYywgICAtMSwgMSwge09fTiwgT19OfSwgImFsb2FkXzIifSwKLXsgMHgyZCwgICAtMSwgMSwge09fTiwgT19OfSwgImFsb2FkXzMifSwKLXsgMHgyZSwgICAtMSwgMSwge09fTiwgT19OfSwgImlhbG9hZCJ9LAoteyAweDJmLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGFsb2FkIn0sCi17IDB4MzAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmYWxvYWQifSwKLXsgMHgzMSwgICAtMSwgMSwge09fTiwgT19OfSwgImRhbG9hZCJ9LAoteyAweDMyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYWFsb2FkIn0sCi17IDB4MzMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWxvYWQifSwKLXsgMHgzNCwgICAtMSwgMSwge09fTiwgT19OfSwgImNhbG9hZCJ9LAoteyAweDM1LCAgIC0xLCAxLCB7T19OLCBPX059LCAic2Fsb2FkIn0sCi17IDB4MzYsICAgLTEsIDIsIHtPX1U4LCBPX059LCAiaXN0b3JlIn0sCi17IDB4MzcsICAgLTEsIDIsIHtPX1U4LCBPX059LCAibHN0b3JlIn0sCi17IDB4MzgsICAgLTEsIDIsIHtPX1U4LCBPX059LCAiZnN0b3JlIn0sCi17IDB4MzksICAgLTEsIDIsIHtPX1U4LCBPX059LCAiZHN0b3JlIn0sCi17IDB4M2EsICAgLTEsIDIsIHtPX1U4LCBPX059LCAiYXN0b3JlIn0sCi17IDB4M2IsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpc3RvcmVfMCJ9LAoteyAweDNjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXN0b3JlXzEifSwKLXsgMHgzZCwgICAtMSwgMSwge09fTiwgT19OfSwgImlzdG9yZV8yIn0sCi17IDB4M2UsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpc3RvcmVfMyJ9LAoteyAweDNmLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHN0b3JlXzAifSwKLXsgMHg0MCwgICAtMSwgMSwge09fTiwgT19OfSwgImxzdG9yZV8xIn0sCi17IDB4NDEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsc3RvcmVfMiJ9LAoteyAweDQyLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHN0b3JlXzMifSwKLXsgMHg0MywgICAtMSwgMSwge09fTiwgT19OfSwgImZzdG9yZV8wIn0sCi17IDB4NDQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmc3RvcmVfMSJ9LAoteyAweDQ1LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZnN0b3JlXzIifSwKLXsgMHg0NiwgICAtMSwgMSwge09fTiwgT19OfSwgImZzdG9yZV8zIn0sCi17IDB4NDcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkc3RvcmVfMCJ9LAoteyAweDQ4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHN0b3JlXzEifSwKLXsgMHg0OSwgICAtMSwgMSwge09fTiwgT19OfSwgImRzdG9yZV8yIn0sCi17IDB4NGEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkc3RvcmVfMyJ9LAoteyAweDRiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYXN0b3JlXzAifSwKLXsgMHg0YywgICAtMSwgMSwge09fTiwgT19OfSwgImFzdG9yZV8xIn0sCi17IDB4NGQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhc3RvcmVfMiJ9LAoteyAweDRlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYXN0b3JlXzMifSwKLXsgMHg0ZiwgICAtMSwgMSwge09fTiwgT19OfSwgImlhc3RvcmUifSwKLXsgMHg1MCwgICAtMSwgMSwge09fTiwgT19OfSwgImxhc3RvcmUifSwKLXsgMHg1MSwgICAtMSwgMSwge09fTiwgT19OfSwgImZhc3RvcmUifSwKLXsgMHg1MiwgICAtMSwgMSwge09fTiwgT19OfSwgImRhc3RvcmUifSwKLXsgMHg1MywgICAtMSwgMSwge09fTiwgT19OfSwgImFhc3RvcmUifSwKLXsgMHg1NCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhc3RvcmUifSwKLXsgMHg1NSwgICAtMSwgMSwge09fTiwgT19OfSwgImNhc3RvcmUifSwKLXsgMHg1NiwgICAtMSwgMSwge09fTiwgT19OfSwgInNhc3RvcmUifSwKLXsgMHg1NywgICAtMSwgMSwge09fTiwgT19OfSwgInBvcCJ9LAoteyAweDU4LCAgIC0xLCAxLCB7T19OLCBPX059LCAicG9wMiJ9LAoteyAweDU5LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHVwIn0sCi17IDB4NWEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkdXBfeDEifSwKLXsgMHg1YiwgICAtMSwgMSwge09fTiwgT19OfSwgImR1cF94MiJ9LAoteyAweDVjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHVwMiJ9LAoteyAweDVkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHVwMl94MSJ9LAoteyAweDVlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHVwMl94MiJ9LAoteyAweDVmLCAgIC0xLCAxLCB7T19OLCBPX059LCAic3dhcCJ9LAoteyAweDYwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWFkZCJ9LAoteyAweDYxLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGFkZCJ9LAoteyAweDYyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmFkZCJ9LAoteyAweDYzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGFkZCJ9LAoteyAweDY0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXN1YiJ9LAoteyAweDY1LCAgIC0xLCAxLCB7T19OLCBPX059LCAibHN1YiJ9LAoteyAweDY2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZnN1YiJ9LAoteyAweDY3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHN1YiJ9LAoteyAweDY4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaW11bCJ9LAoteyAweDY5LCAgIC0xLCAxLCB7T19OLCBPX059LCAibG11bCJ9LAoteyAweDZhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZm11bCJ9LAoteyAweDZiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZG11bCJ9LAoteyAweDZjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWRpdiJ9LAoteyAweDZkLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGRpdiJ9LAoteyAweDZlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmRpdiJ9LAoteyAweDZmLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGRpdiJ9LAoteyAweDcwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXJlbSJ9LAoteyAweDcxLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHJlbSJ9LAoteyAweDcyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZnJlbSJ9LAoteyAweDczLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHJlbSJ9LAoteyAweDc0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaW5lZyJ9LAoteyAweDc1LCAgIC0xLCAxLCB7T19OLCBPX059LCAibG5lZyJ9LAoteyAweDc2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZm5lZyJ9LAoteyAweDc3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZG5lZyJ9LAoteyAweDc4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXNobCJ9LAoteyAweDc5LCAgIC0xLCAxLCB7T19OLCBPX059LCAibHNobCJ9LAoteyAweDdhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXNociJ9LAoteyAweDdiLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHNociJ9LAoteyAweDdjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXVzaHIifSwKLXsgMHg3ZCwgICAtMSwgMSwge09fTiwgT19OfSwgImx1c2hyIn0sCi17IDB4N2UsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpYW5kIn0sCi17IDB4N2YsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsYW5kIn0sCi17IDB4ODAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpb3IifSwKLXsgMHg4MSwgICAtMSwgMSwge09fTiwgT19OfSwgImxvciJ9LAoteyAweDgyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXhvciJ9LAoteyAweDgzLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHhvciJ9LAoteyAweDg0LCAgIC0xLCAzLCB7T19VOCwgT184fSwgImlpbmMifSwKLXsgMHg4NSwgICAtMSwgMSwge09fTiwgT19OfSwgImkybCJ9LAoteyAweDg2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaTJmIn0sCi17IDB4ODcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpMmQifSwKLXsgMHg4OCwgICAtMSwgMSwge09fTiwgT19OfSwgImwyaSJ9LAoteyAweDg5LCAgIC0xLCAxLCB7T19OLCBPX059LCAibDJmIn0sCi17IDB4OGEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsMmQifSwKLXsgMHg4YiwgICAtMSwgMSwge09fTiwgT19OfSwgImYyaSJ9LAoteyAweDhjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZjJsIn0sCi17IDB4OGQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmMmQifSwKLXsgMHg4ZSwgICAtMSwgMSwge09fTiwgT19OfSwgImQyaSJ9LAoteyAweDhmLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZDJsIn0sCi17IDB4OTAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkMmYifSwKLXsgMHg5MSwgICAtMSwgMSwge09fTiwgT19OfSwgImkyYiJ9LAoteyAweDkyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaTJjIn0sCi17IDB4OTMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpMnMifSwKLXsgMHg5NCwgICAtMSwgMSwge09fTiwgT19OfSwgImxjbXAifSwKLXsgMHg5NSwgICAtMSwgMSwge09fTiwgT19OfSwgImZjbXBsIn0sCi17IDB4OTYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmY21wZyJ9LAoteyAweDk3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZGNtcGwifSwKLXsgMHg5OCwgICAtMSwgMSwge09fTiwgT19OfSwgImRjbXBnIn0sCi17IDB4OTksICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmZXEifSwKLXsgMHg5YSwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZuZSJ9LAoteyAweDliLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZmx0In0sCi17IDB4OWMsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmZ2UifSwKLXsgMHg5ZCwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZndCJ9LAoteyAweDllLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZmxlIn0sCi17IDB4OWYsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2ljbXBlcSJ9LAoteyAweGEwLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9pY21wbmUifSwKLXsgMHhhMSwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfaWNtcGx0In0sCi17IDB4YTIsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2ljbXBnZSJ9LAoteyAweGEzLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9pY21wZ3QifSwKLXsgMHhhNCwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfaWNtcGxlIn0sCi17IDB4YTUsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2FjbXBlcSJ9LAoteyAweGE2LCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9hY21wbmUifSwKLXsgMHhhNywgICAtMSwgMywge09fUjE2LCBPX059LCAiZ290byJ9LAoteyAweGE4LCAgIC0xLCAzLCB7T19OLCBPX059LCAianNyIn0sCi17IDB4YTksICAgLTEsIDIsIHtPX04sIE9fTn0sICJyZXQifSwKLXsgMHhhYSwgICAtMSwgMSwge09fTiwgT19OfSwgInRhYmxlc3dpdGNoIn0sCi17IDB4YWIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsb29rdXBzd2l0Y2gifSwKLXsgMHhhYywgICAtMSwgMSwge09fTiwgT19OfSwgImlyZXR1cm4ifSwKLXsgMHhhZCwgICAtMSwgMSwge09fTiwgT19OfSwgImxyZXR1cm4ifSwKLXsgMHhhZSwgICAtMSwgMSwge09fTiwgT19OfSwgImZyZXR1cm4ifSwKLXsgMHhhZiwgICAtMSwgMSwge09fTiwgT19OfSwgImRyZXR1cm4ifSwKLXsgMHhiMCwgICAtMSwgMSwge09fTiwgT19OfSwgImFyZXR1cm4ifSwKLXsgMHhiMSwgICAtMSwgMSwge09fTiwgT19OfSwgInJldHVybiJ9LAoteyAweGIyLCAgIC0xLCAzLCB7T19OLCBPX059LCAiZ2V0c3RhdGljIn0sCi17IDB4YjMsICAgLTEsIDMsIHtPX04sIE9fTn0sICJwdXRzdGF0aWMifSwKLXsgMHhiNCwgICAtMSwgMywge09fTiwgT19OfSwgImdldGZpZWxkIn0sCi17IDB4YjUsICAgLTEsIDMsIHtPX04sIE9fTn0sICJwdXRmaWVsZCJ9LAoteyAweGI2LCAgIC0xLCAzLCB7T19OLCBPX059LCAiaW52b2tldmlydHVhbCJ9LAoteyAweGI3LCAgIC0xLCAzLCB7T19OLCBPX059LCAiaW52b2tlc3BlY2lhbCJ9LAoteyAweGI4LCAgIC0xLCAzLCB7T19OLCBPX059LCAiaW52b2tlc3RhdGljIn0sCi17IDB4YjksICAgLTEsIDUsIHtPX04sIE9fTn0sICJpbnZva2VpbnRlcmZhY2UifSwKLXsgMHhiYSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9iYSJ9LAoteyAweGJiLCAgIC0xLCAzLCB7T19OLCBPX059LCAibmV3In0sCi17IDB4YmMsICAgLTEsIDIsIHtPX04sIE9fTn0sICJuZXdhcnJheSJ9LAoteyAweGJkLCAgIC0xLCAzLCB7T19OLCBPX059LCAiYW5ld2FycmF5In0sCi17IDB4YmUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhcnJheWxlbmd0aCJ9LAoteyAweGJmLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYXRocm93In0sCi17IDB4YzAsICAgLTEsIDMsIHtPX04sIE9fTn0sICJjaGVja2Nhc3QifSwKLXsgMHhjMSwgICAtMSwgMywge09fTiwgT19OfSwgImluc3RhbmNlb2YifSwKLXsgMHhjMiwgICAtMSwgMSwge09fTiwgT19OfSwgIm1vbml0b3JlbnRlciJ9LAoteyAweGMzLCAgIC0xLCAxLCB7T19OLCBPX059LCAibW9uaXRvcmV4aXQifSwKLXsgMHhjNCwgICAtMSwgMSwge09fTiwgT19OfSwgIndpZGUifSwKLXsgMHhjNSwgICAtMSwgNCwge09fTiwgT19OfSwgIm11bHRpYW5ld2FycmF5In0sCi17IDB4YzYsICAgLTEsIDMsIHtPX04sIE9fTn0sICJpZm51bGwifSwKLXsgMHhjNywgICAtMSwgMywge09fTiwgT19OfSwgImlmbm9ubnVsbCJ9LAoteyAweGM4LCAgIC0xLCA1LCB7T19OLCBPX059LCAiZ290b193In0sCi17IDB4YzksICAgLTEsIDUsIHtPX04sIE9fTn0sICJqc3JfdyJ9LAoteyAweGNhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYnJlYWtwb2ludCJ9LAoteyAweGNiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYnl0ZWNvZGUifSwKLXsgMHhjYywgICAtMSwgMSwge09fTiwgT19OfSwgInRyeSJ9LAoteyAweGNkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZW5kdHJ5In0sCi17IDB4Y2UsICAgLTEsIDEsIHtPX04sIE9fTn0sICJjYXRjaCJ9LAoteyAweGNmLCAgIC0xLCAxLCB7T19OLCBPX059LCAidmFyIn0sCi17IDB4ZDAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJlbmR2YXIifSwKLXsgMHhkMSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kMSJ9LAoteyAweGQyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2QyIn0sCi17IDB4ZDMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDMifSwKLXsgMHhkNCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kNCJ9LAoteyAweGQ1LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Q1In0sCi17IDB4ZDYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDYifSwKLXsgMHhkNywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kNyJ9LAoteyAweGQ4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Q4In0sCi17IDB4ZDksICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDkifSwKLXsgMHhkYSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kYSJ9LAoteyAweGRiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2RiIn0sCi17IDB4ZGMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZGMifSwKLXsgMHhkZCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kZCJ9LAoteyAweGRlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2RlIn0sCi17IDB4ZGYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZGYifSwKLXsgMHhlMCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lMCJ9LAoteyAweGUxLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2UxIn0sCi17IDB4ZTIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTIifSwKLXsgMHhlMywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lMyJ9LAoteyAweGU0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2U0In0sCi17IDB4ZTUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTUifSwKLXsgMHhlNiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lNiJ9LAoteyAweGU3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2U3In0sCi17IDB4ZTgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTgifSwKLXsgMHhlOSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lOSJ9LAoteyAweGVhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2VhIn0sCi17IDB4ZWIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZWIifSwKLXsgMHhlYywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lYyJ9LAoteyAweGVkLCAgIC0xLCAzLCB7T18xNiwgT19OfSwgInNldGhpIn0sCi17IDB4ZWUsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAibG9hZF93b3JkX2luZGV4In0sCi17IDB4ZWYsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAibG9hZF9zaG9ydF9pbmRleCJ9LAoteyAweGYwLCAgIC0xLCAzLCB7T19VOCwgT184fSwgImxvYWRfY2hhcl9pbmRleCJ9LAoteyAweGYxLCAgIC0xLCAzLCB7T19VOCwgT184fSwgImxvYWRfYnl0ZV9pbmRleCJ9LAoteyAweGYyLCAgIC0xLCAzLCB7T19VOCwgT184fSwgImxvYWRfdWJ5dGVfaW5kZXgifSwKLXsgMHhmMywgICAtMSwgMywge09fVTgsIE9fOH0sICJzdG9yZV93b3JkX2luZGV4In0sCi17IDB4ZjQsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAibmFfc3RvcmVfd29yZF9pbmRleCJ9LAoteyAweGY1LCAgIC0xLCAzLCB7T19VOCwgT184fSwgInN0b3JlX3Nob3J0X2luZGV4In0sCi17IDB4ZjYsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAic3RvcmVfYnl0ZV9pbmRleCJ9LAoteyAweGY3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Y3In0sCi17IDB4ZjgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZjgifSwKLXsgMHhmOSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mOSJ9LAoteyAweGZhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2ZhIn0sCi17IDB4ZmIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZmIifSwKLXsgMHhmYywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mYyJ9LAoteyAweGZkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2ZkIn0sCi17IDB4ZmUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZmUifSwKLXsgMHhmZiwgMHgwMCwgMiwge09fTiwgT19OfSwgImxvYWRfdWJ5dGUifSwKLXsgMHhmZiwgMHgwMSwgMiwge09fTiwgT19OfSwgImxvYWRfYnl0ZSJ9LAoteyAweGZmLCAweDAyLCAyLCB7T19OLCBPX059LCAibG9hZF9jaGFyIn0sCi17IDB4ZmYsIDB4MDMsIDIsIHtPX04sIE9fTn0sICJsb2FkX3Nob3J0In0sCi17IDB4ZmYsIDB4MDQsIDIsIHtPX04sIE9fTn0sICJsb2FkX3dvcmQifSwKLXsgMHhmZiwgMHgwNSwgMiwge09fTiwgT19OfSwgInByaXZfcmV0X2Zyb21fdHJhcCJ9LAoteyAweGZmLCAweDA2LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2RjYWNoZV90YWcifSwKLXsgMHhmZiwgMHgwNywgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9kY2FjaGVfZGF0YSJ9LAoteyAweGZmLCAweDA4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MDksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgwYSwgMiwge09fTiwgT19OfSwgImxvYWRfY2hhcl9vZSJ9LAoteyAweGZmLCAweDBiLCAyLCB7T19OLCBPX059LCAibG9hZF9zaG9ydF9vZSJ9LAoteyAweGZmLCAweDBjLCAyLCB7T19OLCBPX059LCAibG9hZF93b3JkX29lIn0sCi17IDB4ZmYsIDB4MGQsIDIsIHtPX04sIE9fTn0sICJyZXR1cm4wIn0sCi17IDB4ZmYsIDB4MGUsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfaWNhY2hlX3RhZyJ9LAoteyAweGZmLCAweDBmLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2ljYWNoZV9kYXRhIn0sCi17IDB4ZmYsIDB4MTAsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfdWJ5dGUifSwKLXsgMHhmZiwgMHgxMSwgMiwge09fTiwgT19OfSwgIm5jbG9hZF9ieXRlIn0sCi17IDB4ZmYsIDB4MTIsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfY2hhciJ9LAoteyAweGZmLCAweDEzLCAyLCB7T19OLCBPX059LCAibmNsb2FkX3Nob3J0In0sCi17IDB4ZmYsIDB4MTQsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfd29yZCJ9LAoteyAweGZmLCAweDE1LCAyLCB7T19OLCBPX059LCAiaXVjbXAifSwKLXsgMHhmZiwgMHgxNiwgMiwge09fTiwgT19OfSwgInByaXZfcG93ZXJkb3duIn0sCi17IDB4ZmYsIDB4MTcsIDIsIHtPX04sIE9fTn0sICJjYWNoZV9pbnZhbGlkYXRlIn0sCi17IDB4ZmYsIDB4MTgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgxOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDFhLCAyLCB7T19OLCBPX059LCAibmNsb2FkX2NoYXJfb2UifSwKLXsgMHhmZiwgMHgxYiwgMiwge09fTiwgT19OfSwgIm5jbG9hZF9zaG9ydF9vZSJ9LAoteyAweGZmLCAweDFjLCAyLCB7T19OLCBPX059LCAibmNsb2FkX3dvcmRfb2UifSwKLXsgMHhmZiwgMHgxZCwgMiwge09fTiwgT19OfSwgInJldHVybjEifSwKLXsgMHhmZiwgMHgxZSwgMiwge09fTiwgT19OfSwgImNhY2hlX2ZsdXNoIn0sCi17IDB4ZmYsIDB4MWYsIDIsIHtPX04sIE9fTn0sICJjYWNoZV9pbmRleF9mbHVzaCJ9LAoteyAweGZmLCAweDIwLCAyLCB7T19OLCBPX059LCAic3RvcmVfYnl0ZSJ9LAoteyAweGZmLCAweDIxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MjIsIDIsIHtPX04sIE9fTn0sICJzdG9yZV9zaG9ydCJ9LAoteyAweGZmLCAweDIzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MjQsIDIsIHtPX04sIE9fTn0sICJzdG9yZV93b3JkIn0sCi17IDB4ZmYsIDB4MjUsIDIsIHtPX04sIE9fTn0sICJzb2Z0X3RyYXAifSwKLXsgMHhmZiwgMHgyNiwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfZGNhY2hlX3RhZyJ9LAoteyAweGZmLCAweDI3LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9kY2FjaGVfZGF0YSJ9LAoteyAweGZmLCAweDI4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MjksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgyYSwgMiwge09fTiwgT19OfSwgInN0b3JlX3Nob3J0X29lIn0sCi17IDB4ZmYsIDB4MmIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgyYywgMiwge09fTiwgT19OfSwgInN0b3JlX3dvcmRfb2UifSwKLXsgMHhmZiwgMHgyZCwgMiwge09fTiwgT19OfSwgInJldHVybjIifSwKLXsgMHhmZiwgMHgyZSwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfaWNhY2hlX3RhZyJ9LAoteyAweGZmLCAweDJmLCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9pY2FjaGVfZGF0YSJ9LAoteyAweGZmLCAweDMwLCAyLCB7T19OLCBPX059LCAibmNzdG9yZV9ieXRlIn0sCi17IDB4ZmYsIDB4MzEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgzMiwgMiwge09fTiwgT19OfSwgIm5jc3RvcmVfc2hvcnQifSwKLXsgMHhmZiwgMHgzMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDM0LCAyLCB7T19OLCBPX059LCAibmNzdG9yZV93b3JkIn0sCi17IDB4ZmYsIDB4MzUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgzNiwgMiwge09fTiwgT19OfSwgInByaXZfcmVzZXQifSwKLXsgMHhmZiwgMHgzNywgMiwge09fTiwgT19OfSwgImdldF9jdXJyZW50X2NsYXNzIn0sCi17IDB4ZmYsIDB4MzgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgzOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDNhLCAyLCB7T19OLCBPX059LCAibmNzdG9yZV9zaG9ydF9vZSJ9LAoteyAweGZmLCAweDNiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4M2MsIDIsIHtPX04sIE9fTn0sICJuY3N0b3JlX3dvcmRfb2UifSwKLXsgMHhmZiwgMHgzZCwgMiwge09fTiwgT19OfSwgImNhbGwifSwKLXsgMHhmZiwgMHgzZSwgMiwge09fTiwgT19OfSwgInplcm9fbGluZSJ9LAoteyAweGZmLCAweDNmLCAyLCB7T19OLCBPX059LCAicHJpdl91cGRhdGVfb3B0b3AifSwKLXsgMHhmZiwgMHg0MCwgMiwge09fTiwgT19OfSwgInJlYWRfcGMifSwKLXsgMHhmZiwgMHg0MSwgMiwge09fTiwgT19OfSwgInJlYWRfdmFycyJ9LAoteyAweGZmLCAweDQyLCAyLCB7T19OLCBPX059LCAicmVhZF9mcmFtZSJ9LAoteyAweGZmLCAweDQzLCAyLCB7T19OLCBPX059LCAicmVhZF9vcHRvcCJ9LAoteyAweGZmLCAweDQ0LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX29wbGltIn0sCi17IDB4ZmYsIDB4NDUsIDIsIHtPX04sIE9fTn0sICJyZWFkX2NvbnN0X3Bvb2wifSwKLXsgMHhmZiwgMHg0NiwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9wc3IifSwKLXsgMHhmZiwgMHg0NywgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF90cmFwYmFzZSJ9LAoteyAweGZmLCAweDQ4LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2xvY2tjb3VudDAifSwKLXsgMHhmZiwgMHg0OSwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9sb2NrY291bnQxIn0sCi17IDB4ZmYsIDB4NGEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg0YiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDRjLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2xvY2thZGRyMCJ9LAoteyAweGZmLCAweDRkLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2xvY2thZGRyMSJ9LAoteyAweGZmLCAweDRlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NGYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg1MCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF91c2VycmFuZ2UxIn0sCi17IDB4ZmYsIDB4NTEsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfZ2NfY29uZmlnIn0sCi17IDB4ZmYsIDB4NTIsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfYnJrMWEifSwKLXsgMHhmZiwgMHg1MywgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9icmsyYSJ9LAoteyAweGZmLCAweDU0LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2JyazEyYyJ9LAoteyAweGZmLCAweDU1LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX3VzZXJyYW5nZTIifSwKLXsgMHhmZiwgMHg1NiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDU3LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX3ZlcnNpb25pZCJ9LAoteyAweGZmLCAweDU4LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2hjciJ9LAoteyAweGZmLCAweDU5LCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX3NjX2JvdHRvbSJ9LAoteyAweGZmLCAweDVhLCAyLCB7T19OLCBPX059LCAicmVhZF9nbG9iYWwwIn0sCi17IDB4ZmYsIDB4NWIsIDIsIHtPX04sIE9fTn0sICJyZWFkX2dsb2JhbDEifSwKLXsgMHhmZiwgMHg1YywgMiwge09fTiwgT19OfSwgInJlYWRfZ2xvYmFsMiJ9LAoteyAweGZmLCAweDVkLCAyLCB7T19OLCBPX059LCAicmVhZF9nbG9iYWwzIn0sCi17IDB4ZmYsIDB4NWUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg1ZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDYwLCAyLCB7T19OLCBPX059LCAid3JpdGVfcGMifSwKLXsgMHhmZiwgMHg2MSwgMiwge09fTiwgT19OfSwgIndyaXRlX3ZhcnMifSwKLXsgMHhmZiwgMHg2MiwgMiwge09fTiwgT19OfSwgIndyaXRlX2ZyYW1lIn0sCi17IDB4ZmYsIDB4NjMsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9vcHRvcCJ9LAoteyAweGZmLCAweDY0LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9vcGxpbSJ9LAoteyAweGZmLCAweDY1LCAyLCB7T19OLCBPX059LCAid3JpdGVfY29uc3RfcG9vbCJ9LAoteyAweGZmLCAweDY2LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9wc3IifSwKLXsgMHhmZiwgMHg2NywgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfdHJhcGJhc2UifSwKLXsgMHhmZiwgMHg2OCwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfbG9ja2NvdW50MCJ9LAoteyAweGZmLCAweDY5LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9sb2NrY291bnQxIn0sCi17IDB4ZmYsIDB4NmEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg2YiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDZjLCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9sb2NrYWRkcjAifSwKLXsgMHhmZiwgMHg2ZCwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfbG9ja2FkZHIxIn0sCi17IDB4ZmYsIDB4NmUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg2ZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDcwLCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV91c2VycmFuZ2UxIn0sCi17IDB4ZmYsIDB4NzEsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2djX2NvbmZpZyJ9LAoteyAweGZmLCAweDcyLCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9icmsxYSJ9LAoteyAweGZmLCAweDczLCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9icmsyYSJ9LAoteyAweGZmLCAweDc0LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9icmsxMmMifSwKLXsgMHhmZiwgMHg3NSwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfdXNlcnJhbmdlMiJ9LAoteyAweGZmLCAweDc2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NzcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg3OCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDc5LCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9zY19ib3R0b20ifSwKLXsgMHhmZiwgMHg3YSwgMiwge09fTiwgT19OfSwgIndyaXRlX2dsb2JhbDAifSwKLXsgMHhmZiwgMHg3YiwgMiwge09fTiwgT19OfSwgIndyaXRlX2dsb2JhbDEifSwKLXsgMHhmZiwgMHg3YywgMiwge09fTiwgT19OfSwgIndyaXRlX2dsb2JhbDIifSwKLXsgMHhmZiwgMHg3ZCwgMiwge09fTiwgT19OfSwgIndyaXRlX2dsb2JhbDMifSwKLXsgMHhmZiwgMHg3ZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDdmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODAsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4MSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDgyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4NCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDg1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4NywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDg4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4YSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDhiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OGMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4ZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDhlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OGYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5MCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDkxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5MywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDk0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5NiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDk3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5OSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDlhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OWIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5YywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDlkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OWUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5ZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGEwLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhMiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGEzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhNSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGE2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGE5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YWEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGFjLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YWQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhZSwgMiwge09fTiwgT19OfSwgInRtX3B1dGNoYXIifSwKLXsgMHhmZiwgMHhhZiwgMiwge09fTiwgT19OfSwgInRtX2V4aXQifSwKLXsgMHhmZiwgMHhiMCwgMiwge09fTiwgT19OfSwgInRtX3RyYXAifSwKLXsgMHhmZiwgMHhiMSwgMiwge09fTiwgT19OfSwgInRtX21pbmZvIn0sCi17IDB4ZmYsIDB4YjIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGI0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiNiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGI3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGJhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YmIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiYywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGJkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YmUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGMwLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjMiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGMzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjNSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGM2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGM5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4Y2EsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGNjLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4Y2QsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGNmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDAsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkMSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkNCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQ1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkNywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQ4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkYSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGRiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZGMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGRlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZGYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlMCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGUxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGU0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlNiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGU3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGVhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZWIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlYywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGVkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZWUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGYwLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmMiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGYzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmNSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGY2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGY5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZmEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGZjLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZmQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGZmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi19OwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wby9NYWtlLWluIGIvb3Bjb2Rlcy9wby9NYWtlLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyZGIxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9vcGNvZGVzL3BvL1BPVEZJTEVTLmluIGIvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMyM2M1YS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotYTI5ay1kaXMuYwotYWxwaGEtZGlzLmMKLWFscGhhLW9wYy5jCi1hcmMtZGlzLmMKLWFyYy1vcGMuYwotYXJtLWRpcy5jCi1hcm0tb3BjLmgKLWNnZW4tYXNtLmMKLWNnZW4tZGlzLmMKLWNnZW4tb3BjLmMKLWQxMHYtZGlzLmMKLWQxMHYtb3BjLmMKLWQzMHYtZGlzLmMKLWQzMHYtb3BjLmMKLWRpcy1idWYuYwotZGlzYXNzZW1ibGUuYwotZnIzMC1hc20uYwotZnIzMC1kZXNjLmMKLWZyMzAtZGVzYy5oCi1mcjMwLWRpcy5jCi1mcjMwLWlibGQuYwotZnIzMC1vcGMuYwotZnIzMC1vcGMuaAotaDgzMDAtZGlzLmMKLWg4NTAwLWRpcy5jCi1oODUwMC1vcGMuaAotaHBwYS1kaXMuYwotaTM3MC1kaXMuYwotaTM3MC1vcGMuYwotaTM4Ni1kaXMuYwotaTk2MC1kaXMuYwotbTEwMjAwLWRpcy5jCi1tMTAyMDAtb3BjLmMKLW0xMDMwMC1kaXMuYwotbTEwMzAwLW9wYy5jCi1tMzJyLWFzbS5jCi1tMzJyLWRlc2MuYwotbTMyci1kZXNjLmgKLW0zMnItZGlzLmMKLW0zMnItaWJsZC5jCi1tMzJyLW9wYy5jCi1tMzJyLW9wYy5oCi1tMzJyLW9waW5zdC5jCi1tNjhrLWRpcy5jCi1tNjhrLW9wYy5jCi1tODhrLWRpcy5jCi1tY29yZS1kaXMuYwotbWNvcmUtb3BjLmgKLW1pcHMtZGlzLmMKLW1pcHMtb3BjLmMKLW1pcHMxNi1vcGMuYwotbnMzMmstZGlzLmMKLXBqLWRpcy5jCi1wai1vcGMuYwotcHBjLWRpcy5jCi1wcGMtb3BjLmMKLXNoLWRpcy5jCi1zaC1vcGMuaAotc3BhcmMtZGlzLmMKLXNwYXJjLW9wYy5jCi1zeXNkZXAuaAotdGljMzAtZGlzLmMKLXRpYzgwLWRpcy5jCi10aWM4MC1vcGMuYwotdjg1MC1kaXMuYwotdjg1MC1vcGMuYwotdmF4LWRpcy5jCi13NjUtZGlzLmMKLXc2NS1vcGMuaAotejhrLWRpcy5jCi16OGstb3BjLmgKLXo4a2dlbi5jCmRpZmYgLS1naXQgYS9vcGNvZGVzL3BvL29wY29kZXMucG90IGIvb3Bjb2Rlcy9wby9vcGNvZGVzLnBvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExNDVkMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BvL29wY29kZXMucG90CisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDAwLTAyLTI1IDIyOjE2LTA1MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhbHBoYS1vcGMuYzozMzUKLW1zZ2lkICJicmFuY2ggb3BlcmFuZCB1bmFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogYWxwaGEtb3BjLmM6MzU4IGFscGhhLW9wYy5jOjM4MAotbXNnaWQgImp1bXAgaGludCB1bmFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogYXJjLWRpcy5jOjIzMQotbXNnaWQgIip1bmtub3duKiIKLW1zZ3N0ciAiIgotCi0jOiBhcmMtb3BjLmM6NjI5Ci1tc2dpZCAidW5hYmxlIHRvIGZpdCBkaWZmZXJlbnQgdmFsdWVkIGNvbnN0YW50cyBpbnRvIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGFyYy1vcGMuYzo2MzkKLW1zZ2lkICJhdXhpbGlhcnkgcmVnaXN0ZXIgbm90IGFsbG93ZWQgaGVyZSIKLW1zZ3N0ciAiIgotCi0jOiBhcmMtb3BjLmM6NjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbnVtYmVyIGAlZCciCi1tc2dzdHIgIiIKLQotIzogYXJjLW9wYy5jOjc3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ2YWx1ZSB3b24ndCBmaXQgaW4gcmFuZ2UgJWxkIC0gJWxkIgotbXNnc3RyICIiCi0KLSM6IGFyYy1vcGMuYzo4NzEKLW1zZ2lkICJicmFuY2ggYWRkcmVzcyBub3Qgb24gNCBieXRlIGJvdW5kYXJ5IgotbXNnc3RyICIiCi0KLSM6IGFybS1kaXMuYzo0NzAKLW1zZ2lkICI8aWxsZWdhbCBwcmVjaXNpb24+IgotbXNnc3RyICIiCi0KLSM6IGFybS1kaXMuYzo4ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIHJlZ2lzdGVyIG5hbWUgc2V0OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFybS1kaXMuYzo4ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIGRpc2Fzc2VtYmxlciBvcHRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJtLWRpcy5jOjEwNTMKLW1zZ2lkICIiCi0iXG4iCi0iVGhlIGZvbGxvd2luZyBBUk0gc3BlY2lmaWMgZGlzYXNzZW1ibGVyIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCBmb3IgdXNlIHdpdGhcbiIKLSJ0aGUgLU0gc3dpdGNoOlxuIgotbXNnc3RyICIiCi0KLSM6IGNnZW4tYXNtLmM6MjI0Ci1tc2dpZCAidW5yZWNvZ25pemVkIGtleXdvcmQvcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjZ2VuLWFzbS5jOjMzMiBmcjMwLWlibGQuYzoyMjMgbTMyci1pYmxkLmM6MjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIgotbXNnc3RyICIiCi0KLSM6IGNnZW4tYXNtLmM6MzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gJWx1IGFuZCAlbHUpIgotbXNnc3RyICIiCi0KLSM6IGQzMHYtZGlzLmM6MzA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duIHJlZ2lzdGVyICVkPiIKLW1zZ3N0ciAiIgotCi0jLiBDYW4ndCBoYXBwZW4uCi0jOiBkaXMtYnVmLmM6NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBlcnJvciAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGRpcy1idWYuYzo2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJBZGRyZXNzIDB4JXggaXMgb3V0IG9mIGJvdW5kcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjMwNSBtMzJyLWFzbS5jOjMxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcGFyc2luZy5cbiIKLW1zZ3N0ciAiIgotCi0jLiBXZSBjb3VsZG4ndCBwYXJzZSBpdC4KLSM6IGZyMzAtYXNtLmM6MzY5IGZyMzAtYXNtLmM6MzczIGZyMzAtYXNtLmM6NDQ3IG0zMnItYXNtLmM6Mzc3IG0zMnItYXNtLmM6MzgxCi0jOiBtMzJyLWFzbS5jOjQ1NQotbXNnaWQgInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiBTeW50YXggY2hhciBkaWRuJ3QgbWF0Y2guICBDYW4ndCBiZSB0aGlzIGluc24uCi0jLiBGSVhNRTogd291bGQgbGlrZSB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UKLSMuICJleHBlY3RlZCBjaGFyIGBjJyIKLSM6IGZyMzAtYXNtLmM6NDE1IG0zMnItYXNtLmM6NDIzCi1tc2dpZCAic3ludGF4IGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtYXNtLmM6NDQxIG0zMnItYXNtLmM6NDQ5Ci1tc2dpZCAianVuayBhdCBlbmQgb2YgbGluZSIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjUzNCBtMzJyLWFzbS5jOjU1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzLi4uJyIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjUzNyBtMzJyLWFzbS5jOjU1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzJyIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWRpcy5jOjMwMCBtMzJyLWRpcy5jOjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoyMTAgbTMyci1pYmxkLmM6MjExCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzo3NDUgbTMyci1pYmxkLmM6Njc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjk0NyBtMzJyLWlibGQuYzo4MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MTA5MSBtMzJyLWlibGQuYzo5MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MTIyMCBtMzJyLWlibGQuYzoxMDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIHZtYSBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjEzNDkgbTMyci1pYmxkLmM6MTA5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxNDcxIG0zMnItaWJsZC5jOjExODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogaDgzMDAtZGlzLmM6NDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkhtbW1tICV4IgotbXNnc3RyICIiCi0KLSM6IGg4MzAwLWRpcy5jOjQxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJEb24ndCB1bmRlcnN0YW5kICV4IFxuIgotbXNnc3RyICIiCi0KLSM6IGg4NTAwLWRpcy5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBjb3BlIHdpdGggaW5zZXJ0ICVkXG4iCi1tc2dzdHIgIiIKLQotIy4gQ291bGRuJ3QgdW5kZXJzdGFuZCBhbnl0aGluZwotIzogaDg1MDAtZGlzLmM6MzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUwMnhcdFx0KnVua25vd24qIgotbXNnc3RyICIiCi0KLSM6IG0xMDIwMC1kaXMuYzoxOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93blx0MHglMDJ4IgotbXNnc3RyICIiCi0KLSM6IG0xMDIwMC1kaXMuYzozMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93blx0MHglMDRseCIKLW1zZ3N0ciAiIgotCi0jOiBtMTAzMDAtZGlzLmM6NjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd25cdDB4JTA0eCIKLW1zZ3N0ciAiIgotCi0jOiBtNjhrLWRpcy5jOjQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICI8aW50ZXJuYWwgZXJyb3IgaW4gb3Bjb2RlIHRhYmxlOiAlcyAlcz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBtNjhrLWRpcy5jOjk4OAotIywgYy1mb3JtYXQKLW1zZ2lkICI8ZnVuY3Rpb24gY29kZSAlZD4iCi1tc2dzdHIgIiIKLQotIzogbTg4ay1kaXMuYzoyNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIyA8ZGlzIGVycm9yOiAlMDh4PiIKLW1zZ3N0ciAiIgotCi0jOiBtaXBzLWRpcy5jOjIzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIjIGludGVybmFsIGVycm9yLCB1bmRlZmluZWQgbW9kaWZpZXIoJWMpIgotbXNnc3RyICIiCi0KLSMuIEkgYW5kIFogYXJlIG91dHB1dCBvcGVyYW5kcyBhbmQgY2FuYHQgYmUgaW1tZWRpYXRlCi0jLiAqIEEgaXMgYW4gYWRkcmVzcyBhbmQgd2UgY2FuYHQgaGF2ZSB0aGUgYWRkcmVzcyBvZgotIy4gKiBhbiBpbW1lZGlhdGUgZWl0aGVyLiBXZSBkb24ndCBrbm93IGhvdyBtdWNoIHRvIGluY3JlYXNlCi0jLiAqIGFvZmZzZXRwIGJ5IHNpbmNlIHdoYXRldmVyIGdlbmVyYXRlZCB0aGlzIGlzIGJyb2tlbgotIy4gKiBhbnl3YXkhCi0jLgotIzogbnMzMmstZGlzLmM6NjE4Ci1tc2dpZCAiJDx1bmRlZmluZWQ+IgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo1ODYgcHBjLW9wYy5jOjYxNwotbXNnaWQgImludmFsaWQgY29uZGl0aW9uYWwgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo2MTkKLW1zZ2lkICJhdHRlbXB0IHRvIHNldCB5IGJpdCB3aGVuIHVzaW5nICsgb3IgLSBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6Njc0Ci1tc2dpZCAiaWdub3JpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBicmFuY2ggb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo3MDkgcHBjLW9wYy5jOjc0NgotbXNnaWQgImlsbGVnYWwgYml0bWFzayIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6ODE1Ci1tc2dpZCAidmFsdWUgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo4ODkKLW1zZ2lkICJpbmRleCByZWdpc3RlciBpbiBsb2FkIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo5MDQKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG9wZXJhbmQgd2hlbiB1cGRhdGluZyIKLW1zZ3N0ciAiIgotCi0jLiBNYXJrIGFzIG5vbi12YWxpZCBpbnN0cnVjdGlvbgotIzogc3BhcmMtZGlzLmM6NzQ0Ci1tc2dpZCAidW5rbm93biIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6ICBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIgotbXNnc3RyICIiCi0KLSM6IHNwYXJjLWRpcy5jOjg3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIgPT0gXCIlc1wiXG4iCi1tc2dzdHIgIiIKLQotIzogdjg1MC1kaXMuYzoyMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcGVyYW5kIHNoaWZ0OiAleFxuIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtZGlzLmM6MjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gcG9wIHJlZzogJWRcbiIKLW1zZ3N0ciAiIgotCi0jLiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLgotIy4gTm90ZTogVGhlcmUgaXMgYSBjb25zcGlyYWN5IGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zIGFuZAotIy4gdjg1MF9pbnNlcnRfb3BlcmFuZCgpIGluIGdhcy9jb25maWcvdGMtdjg1MC5jLiAgRXJyb3IgbWVzc2FnZXMKLSMuIGNvbnRhaW5pbmcgdGhlIHN0cmluZyAnb3V0IG9mIHJhbmdlJyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIGEKLSMuIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZ2l2ZW4gdG8gR0FTLgotIzogdjg1MC1vcGMuYzo0NgotbXNnaWQgImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBub3QgaW4gcmFuZ2UgYW5kIGlzIG5vdCBhbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NDcKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NDgKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo1MAotbXNnaWQgImltbWVkaWF0ZSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo2MQotbXNnaWQgImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIG9kZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo2MyB2ODUwLW9wYy5jOjk1Ci1tc2dpZCAiYnJhbmNoIHZhbHVlIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjY2IHY4NTAtb3BjLmM6OTgKLW1zZ2lkICJicmFuY2ggdG8gb2RkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjkzCi1tc2dpZCAiYnJhbmNoIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgdG8gYW4gb2RkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjMyMQotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgZm9yIHN0YWNrIGFkanVzdG1lbnQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzozNDMKLW1zZ2lkICJpbW1lZGlhdGUgdmFsdWUgbm90IGluIHJhbmdlIGFuZCBub3QgZXZlbiIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjM0OAotbXNnaWQgImltbWVkaWF0ZSB2YWx1ZSBtdXN0IGJlIGV2ZW4iCi1tc2dzdHIgIiIKZGlmZiAtLWdpdCBhL29wY29kZXMvcHBjLWRpcy5jIGIvb3Bjb2Rlcy9wcGMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzE2ZWEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wcGMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogcHBjLWRpcy5jIC0tIERpc2Fzc2VtYmxlIFBvd2VyUEMgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3BwYy5oIgotCi0vKiBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zLCBhbGwgb2Ygd2hpY2ggdXNlCi0gICB0aGUgZGlzYXNzZW1ibGVyIGludGVyZmFjZSBkZWZpbmVkIGluIGRpcy1hc20uaC4gIFNldmVyYWwgZnVuY3Rpb25zCi0gICBhcmUgcHJvdmlkZWQgYmVjYXVzZSB0aGlzIGZpbGUgaGFuZGxlcyBkaXNhc3NlbWJseSBmb3IgdGhlIFBvd2VyUEMKLSAgIGluIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIG1vZGUgYW5kIGFsc28gZm9yIHRoZSBQT1dFUiAoUlMvNjAwMCkKLSAgIGNoaXAuICAqLwotCi1zdGF0aWMgaW50IHByaW50X2luc25fcG93ZXJwYyBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLAotCQkJCSAgICAgICBpbnQgYmlnZW5kaWFuLCBpbnQgZGlhbGVjdCkpOwotCi0vKiBQcmludCBhIGJpZyBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbi4gIEZvciBjb252ZW5pZW5jZSwgYWxzbwotICAgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEuICAqLwotCi1pbnQKLXByaW50X2luc25fYmlnX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsCi0JCQkgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEpOwotfQotCi0vKiBQcmludCBhIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbi4gIEZvciBjb252ZW5pZW5jZSwgYWxzbwotICAgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEuICAqLwotCi1pbnQKLXByaW50X2luc25fbGl0dGxlX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDAsCi0JCQkgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEpOwotfQotCi0vKiBQcmludCBhIFBPV0VSIChSUy82MDAwKSBpbnN0cnVjdGlvbi4gICovCi0KLWludAotcHJpbnRfaW5zbl9yczYwMDAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsIFBQQ19PUENPREVfUE9XRVIpOwotfQotCi0vKiBQcmludCBhIFBvd2VyUEMgb3IgUE9XRVIgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIGJpZ2VuZGlhbiwgZGlhbGVjdCkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IGJpZ2VuZGlhbjsKLSAgICAgaW50IGRpYWxlY3Q7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGVfZW5kOwotICB1bnNpZ25lZCBsb25nIG9wOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGJpZ2VuZGlhbikKLSAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgZWxzZQotICAgIGluc24gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0gIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9wID0gUFBDX09QIChpbnNuKTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgV2UgY291bGQgc3BlZWQgdGhpcyB1cAotICAgICBhIGJpdCBieSBkb2luZyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIG1ham9yIG9wY29kZS4gICovCi0gIG9wY29kZV9lbmQgPSBwb3dlcnBjX29wY29kZXMgKyBwb3dlcnBjX251bV9vcGNvZGVzOwotICBmb3IgKG9wY29kZSA9IHBvd2VycGNfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyB0YWJsZV9vcDsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgaW50IGludmFsaWQ7Ci0gICAgICBpbnQgbmVlZF9jb21tYTsKLSAgICAgIGludCBuZWVkX3BhcmVuOwotCi0gICAgICB0YWJsZV9vcCA9IFBQQ19PUCAob3Bjb2RlLT5vcGNvZGUpOwotICAgICAgaWYgKG9wIDwgdGFibGVfb3ApCi0JYnJlYWs7Ci0gICAgICBpZiAob3AgPiB0YWJsZV9vcCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPm9wY29kZQotCSAgfHwgKG9wY29kZS0+ZmxhZ3MgJiBkaWFsZWN0KSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KLQkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0JIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIGludmFsaWQgPSAwOwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCXsKLQkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7Ci0JICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgJmludmFsaWQpOwotCX0KLSAgICAgIGlmIChpbnZhbGlkKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7Ci0gICAgICBpZiAob3Bjb2RlLT5vcGVyYW5kc1swXSAhPSAwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotICAgICAgLyogTm93IGV4dHJhY3QgYW5kIHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0gICAgICBuZWVkX2NvbW1hID0gMDsKLSAgICAgIG5lZWRfcGFyZW4gPSAwOwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCXsKLQkgIGxvbmcgdmFsdWU7Ci0KLQkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7Ci0KLQkgIC8qIE9wZXJhbmRzIHRoYXQgYXJlIG1hcmtlZCBGQUtFIGFyZSBzaW1wbHkgaWdub3JlZC4gIFdlCi0JICAgICBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IHRoZSBleHRyYWN0IGZ1bmN0aW9uIGNvbnNpZGVyZWQKLQkgICAgIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2YWxpZC4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRkFLRSkgIT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICB2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpICE9IDAKLQkJICAmJiAodmFsdWUgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkgIT0gMCkKLQkJdmFsdWUgLT0gMSA8PCBvcGVyYW5kLT5iaXRzOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoZSBvcGVyYW5kIGlzIG9wdGlvbmFsLCBhbmQgdGhlIHZhbHVlIGlzIHplcm8sIGRvbid0Ci0JICAgICBwcmludCBhbnl0aGluZy4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfT1BUSU9OQUwpICE9IDAKLQkgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORVhUKSA9PSAwCi0JICAgICAgJiYgdmFsdWUgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChuZWVkX2NvbW1hKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JICAgICAgbmVlZF9jb21tYSA9IDA7Ci0JICAgIH0KLQotCSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9HUFIpICE9IDApCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciVsZCIsIHZhbHVlKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZQUikgIT0gMCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmJWxkIiwgdmFsdWUpOwotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDApCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIHZhbHVlLCBpbmZvKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSB2YWx1ZSAmIDB4ZmZmZmZmZmYsIGluZm8pOwotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQ1IpID09IDAKLQkJICAgfHwgKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BQQykgPT0gMCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+Yml0cyA9PSAzKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImNyJWQiLCB2YWx1ZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3RhdGljIGNvbnN0IGNoYXIgKmNibmFtZXNbNF0gPSB7ICJsdCIsICJndCIsICJlcSIsICJzbyIgfTsKLQkJICBpbnQgY3I7Ci0JCSAgaW50IGNjOwotCi0JCSAgY3IgPSB2YWx1ZSA+PiAyOwotCQkgIGlmIChjciAhPSAwKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI0KmNyJWQiLCBjcik7Ci0JCSAgY2MgPSB2YWx1ZSAmIDM7Ci0JCSAgaWYgKGNjICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjciAhPSAwKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBjYm5hbWVzW2NjXSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobmVlZF9wYXJlbikKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCSAgICAgIG5lZWRfcGFyZW4gPSAwOwotCSAgICB9Ci0KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9QQVJFTlMpID09IDApCi0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JICAgICAgbmVlZF9wYXJlbiA9IDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgZm91bmQgYW5kIHByaW50ZWQgYW4gaW5zdHJ1Y3Rpb247IHJldHVybi4gICovCi0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgLyogV2UgY291bGQgbm90IGZpbmQgYSBtYXRjaC4gICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmcgMHglbHgiLCBpbnNuKTsKLQotICByZXR1cm4gNDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvcHBjLW9wYy5jIGIvb3Bjb2Rlcy9wcGMtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDRlMmQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wcGMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTI0ICswLDAgQEAKLS8qIHBwYy1vcGMuYyAtLSBQb3dlclBDIG9wY29kZSBsaXN0Ci0gICBDb3B5cmlnaHQgKGMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3BwYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIFBvd2VyUEMgb3Bjb2RlIHRhYmxlLiAgVGhlIG9wY29kZSB0YWJsZQotICAgaW5jbHVkZXMgYWxtb3N0IGFsbCBvZiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLiAgVGhpcwotICAgcGVybWl0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIHVzZSB0aGVtLCBhbmQgc2ltcGxpZmllcyB0aGUgYXNzZW1ibGVyCi0gICBsb2dpYywgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2luZyB0aGUgdGFibGUgc2l6ZS4gIFRoZSB0YWJsZSBpcwotICAgc3RyaWN0bHkgY29uc3RhbnQgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBpdCBpbgotICAgdGhlIC50ZXh0IHNlY3Rpb24uCi0KLSAgIFRoaXMgZmlsZSBhbHNvIGhvbGRzIHRoZSBvcGVyYW5kIHRhYmxlLiAgQWxsIGtub3dsZWRnZSBhYm91dAotICAgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zdHJ1Y3Rpb25zIGFuZCB2aWNlLXZlcnNhIGlzIGtlcHQgaW4gdGhpcwotICAgZmlsZS4gICovCi0MCi0vKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JhdCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JhdCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JiYSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JiYSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JkIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmQgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iZG0gUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iZG0gUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iZHAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iZHAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyBpbnQgdmFsaWRfYm8gUEFSQU1TICgobG9uZykpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JvIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYm8gUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9ib2UgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9ib2UgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9kcyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2RzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbGkgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9saSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X21iZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X21iZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X21iNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X21iNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X25iIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbmIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9uc2kgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9uc2kgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYWwgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JhbSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmFzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYnMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9yYnMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9zaDYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9zaDYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9zcHIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9zcHIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF90YnIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF90YnIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZS4KLQotICAgVGhlIGZpZWxkcyBhcmUgYml0cywgc2hpZnQsIGluc2VydCwgZXh0cmFjdCwgZmxhZ3MuCi0KLSAgIFdlIHVzZWQgdG8gcHV0IHBhcmVucyBhcm91bmQgdGhlIHZhcmlvdXMgYWRkaXRpb25zLCBsaWtlIHRoZSBvbmUKLSAgIGZvciBCQSBqdXN0IGJlbG93LiAgSG93ZXZlciwgdGhhdCBjYXVzZWQgdHJvdWJsZSB3aXRoIGZlZWJsZQotICAgY29tcGlsZXJzIHdpdGggYSBsaW1pdCBvbiBkZXB0aCBvZiBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiwgbGlrZQotICAgKHJlcG9ydGVkbHkpIHRoZSBjb21waWxlciBpbiBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyA1LiAgU28gd2UKLSAgIG9taXQgdGhlIHBhcmVucywgc2luY2UgdGhlIG1hY3JvcyBhcmUgbmV2ZXIgdXNlZCBpbiBhIGNvbnRleHQgd2hlcmUKLSAgIHRoZSBhZGRpdGlvbiB3aWxsIGJlIGFtYmlndW91cy4gICovCi0KLWNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgcG93ZXJwY19vcGVyYW5kc1tdID0KLXsKLSAgLyogVGhlIHplcm8gaW5kZXggaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mCi0gICAgIG9wZXJhbmRzLiAgKi8KLSNkZWZpbmUgVU5VU0VEIDAKLSAgeyAwLCAwLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCQSBVTlVTRUQgKyAxCi0jZGVmaW5lIEJBX01BU0sgKDB4MWYgPDwgMTYpCi0gIHsgNSwgMTYsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lCi0gICAgIGFzIHRoZSBCVCBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJBVCBCQSArIDEKLSAgeyA1LCAxNiwgaW5zZXJ0X2JhdCwgZXh0cmFjdF9iYXQsIFBQQ19PUEVSQU5EX0ZBS0UgfSwKLQotICAvKiBUaGUgQkIgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJCIEJBVCArIDEKLSNkZWZpbmUgQkJfTUFTSyAoMHgxZiA8PCAxMSkKLSAgeyA1LCAxMSwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgQkIgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUKLSAgICAgYXMgdGhlIEJBIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkJBIEJCICsgMQotICB7IDUsIDExLCBpbnNlcnRfYmJhLCBleHRyYWN0X2JiYSwgUFBDX09QRVJBTkRfRkFLRSB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKLSAgICAgZm9yY2VkIHRvIHplcm8uICAqLwotI2RlZmluZSBCRCBCQkEgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZCwgZXh0cmFjdF9iZCwgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBhYnNvbHV0ZSBhZGRyZXNzaW5nIGlzCi0gICAgIHVzZWQuICAqLwotI2RlZmluZSBCREEgQkQgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZCwgZXh0cmFjdF9iZCwgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgLSBtb2RpZmllciBpcyB1c2VkLgotICAgICBUaGlzIHNldHMgdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCBhcHByb3ByaWF0ZWx5LiAgKi8KLSNkZWZpbmUgQkRNIEJEQSArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkbSwgZXh0cmFjdF9iZG0sCi0gICAgICBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSAtIG1vZGlmaWVyIGlzIHVzZWQKLSAgICAgYW5kIGFic29sdXRlIGFkZHJlc3MgaXMgdXNlZC4gICovCi0jZGVmaW5lIEJETUEgQkRNICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmRtLCBleHRyYWN0X2JkbSwKLSAgICAgIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgbW9kaWZpZXIgaXMgdXNlZC4KLSAgICAgVGhpcyBzZXRzIHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgYXBwcm9wcmlhdGVseS4gICovCi0jZGVmaW5lIEJEUCBCRE1BICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmRwLCBleHRyYWN0X2JkcCwKLSAgICAgIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgbW9kaWZpZXIgaXMgdXNlZAotICAgICBhbmQgYWJzb2x1dGUgYWRkcmVzc2luZyBpcyB1c2VkLiAgKi8KLSNkZWZpbmUgQkRQQSBCRFAgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZHAsIGV4dHJhY3RfYmRwLAotICAgICAgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkYgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkYgQkRQQSArIDEKLSAgeyAzLCAyMywgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBBbiBvcHRpb25hbCBCRiBmaWVsZC4gIFRoaXMgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMsCi0gICAgIGluIHdoaWNoIGFuIG9taXR0ZWQgQkYgZmllbGQgaXMgdGFrZW4gYXMgemVyby4gICovCi0jZGVmaW5lIE9CRiBCRiArIDEKLSAgeyAzLCAyMywgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAotCi0gIC8qIFRoZSBCRkEgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkZBIE9CRiArIDEKLSAgeyAzLCAxOCwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgQkkgZmllbGQgaW4gYSBCIGZvcm0gb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJJIEJGQSArIDEKLSNkZWZpbmUgQklfTUFTSyAoMHgxZiA8PCAxNikKLSAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKLQotICAvKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBDZXJ0YWluIHZhbHVlcyBhcmUKLSAgICAgaWxsZWdhbC4gICovCi0jZGVmaW5lIEJPIEJJICsgMQotI2RlZmluZSBCT19NQVNLICgweDFmIDw8IDIxKQotICB7IDUsIDIxLCBpbnNlcnRfYm8sIGV4dHJhY3RfYm8sIDAgfSwKLQotICAvKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBvciAtIG1vZGlmaWVyIGlzCi0gICAgIHVzZWQuICBUaGlzIGlzIGxpa2UgdGhlIEJPIGZpZWxkLCBidXQgaXQgbXVzdCBiZSBldmVuLiAgKi8KLSNkZWZpbmUgQk9FIEJPICsgMQotICB7IDUsIDIxLCBpbnNlcnRfYm9lLCBleHRyYWN0X2JvZSwgMCB9LAotCi0gIC8qIFRoZSBCVCBmaWVsZCBpbiBhbiBYIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCVCBCT0UgKyAxCi0gIHsgNSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIGNvbmRpdGlvbiByZWdpc3RlciBudW1iZXIgcG9ydGlvbiBvZiB0aGUgQkkgZmllbGQgaW4gYSBCIGZvcm0KLSAgICAgb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGV4dGVuZGVkCi0gICAgIGNvbmRpdGlvbmFsIGJyYW5jaCBtbmVtb25pY3MsIHdoaWNoIHNldCB0aGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlCi0gICAgIEJJIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gICovCi0jZGVmaW5lIENSIEJUICsgMQotICB7IDMsIDE4LCAwLCAwLCBQUENfT1BFUkFORF9DUiB8IFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCi0KLSAgLyogVGhlIEQgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGEgZGlzcGxhY2VtZW50IG9mZgotICAgICBhIHJlZ2lzdGVyLCBhbmQgaW1wbGllcyB0aGF0IHRoZSBuZXh0IG9wZXJhbmQgaXMgYSByZWdpc3RlciBpbgotICAgICBwYXJlbnRoZXNlcy4gICovCi0jZGVmaW5lIEQgQ1IgKyAxCi0gIHsgMTYsIDAsIDAsIDAsIFBQQ19PUEVSQU5EX1BBUkVOUyB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBEUyBmaWVsZCBpbiBhIERTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGxpa2UgRCwgYnV0IHRoZQotICAgICBsb3dlciB0d28gYml0cyBhcmUgZm9yY2VkIHRvIHplcm8uICAqLwotI2RlZmluZSBEUyBEICsgMQotICB7IDE2LCAwLCBpbnNlcnRfZHMsIGV4dHJhY3RfZHMsIFBQQ19PUEVSQU5EX1BBUkVOUyB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBFIGZpZWxkIGluIGEgd3J0ZWVpIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRSBEUyArIDEKLSAgeyAxLCAxNSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGTDEgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRkwxIEUgKyAxCi0gIHsgNCwgMTIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgRkwyIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZMMiBGTDEgKyAxCi0gIHsgMywgMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGTE0gZmllbGQgaW4gYW4gWEZMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGTE0gRkwyICsgMQotICB7IDgsIDE3LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEZSQSBmaWVsZCBpbiBhbiBYIG9yIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZSQSBGTE0gKyAxCi0jZGVmaW5lIEZSQV9NQVNLICgweDFmIDw8IDE2KQotICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKLQotICAvKiBUaGUgRlJCIGZpZWxkIGluIGFuIFggb3IgQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlJCIEZSQSArIDEKLSNkZWZpbmUgRlJCX01BU0sgKDB4MWYgPDwgMTEpCi0gIHsgNSwgMTEsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAotCi0gIC8qIFRoZSBGUkMgZmllbGQgaW4gYW4gQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlJDIEZSQiArIDEKLSNkZWZpbmUgRlJDX01BU0sgKDB4MWYgPDwgNikKLSAgeyA1LCA2LCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKLQotICAvKiBUaGUgRlJTIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbiBvciB0aGUgRlJUIGZpZWxkIGluIGEgRCwgWAotICAgICBvciBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGUlMgRlJDICsgMQotI2RlZmluZSBGUlQgRlJTCi0gIHsgNSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAotCi0gIC8qIFRoZSBGWE0gZmllbGQgaW4gYW4gWEZYIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlhNIEZSUyArIDEKLSNkZWZpbmUgRlhNX01BU0sgKDB4ZmYgPDwgMTIpCi0gIHsgOCwgMTIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgTCBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTCBGWE0gKyAxCi0gIHsgMSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCi0KLSAgLyogVGhlIExFViBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBMRVYgTCArIDEKLSAgeyA3LCA1LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKLSAgICAgZm9yY2VkIHRvIHplcm8uICAqLwotI2RlZmluZSBMSSBMRVYgKyAxCi0gIHsgMjYsIDAsIGluc2VydF9saSwgZXh0cmFjdF9saSwgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uIHdoZW4gdXNlZCBhcyBhbiBhYnNvbHV0ZQotICAgICBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgTElBIExJICsgMQotICB7IDI2LCAwLCBpbnNlcnRfbGksIGV4dHJhY3RfbGksIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIE1CIGZpZWxkIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1CIExJQSArIDEKLSNkZWZpbmUgTUJfTUFTSyAoMHgxZiA8PCA2KQotICB7IDUsIDYsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgTUUgZmllbGQgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUUgTUIgKyAxCi0jZGVmaW5lIE1FX01BU0sgKDB4MWYgPDwgMSkKLSAgeyA1LCAxLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIE1CIGFuZCBNRSBmaWVsZHMgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uIGV4cHJlc3NlZCBhIHNpbmdsZQotICAgICBvcGVyYW5kIHdoaWNoIGlzIGEgYml0bWFzayBpbmRpY2F0aW5nIHdoaWNoIGJpdHMgdG8gc2VsZWN0LiAgVGhpcwotICAgICBpcyBhIHR3byBvcGVyYW5kIGZvcm0gdXNpbmcgUFBDX09QRVJBTkRfTkVYVC4gIFNlZSB0aGUKLSAgICAgZGVzY3JpcHRpb24gaW4gb3Bjb2RlL3BwYy5oIGZvciB3aGF0IHRoaXMgbWVhbnMuICAqLwotI2RlZmluZSBNQkUgTUUgKyAxCi0gIHsgNSwgNiwgMCwgMCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfCBQUENfT1BFUkFORF9ORVhUIH0sCi0gIHsgMzIsIDAsIGluc2VydF9tYmUsIGV4dHJhY3RfbWJlLCAwIH0sCi0KLSAgLyogVGhlIE1CIG9yIE1FIGZpZWxkIGluIGFuIE1EIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGhpZ2gKLSAgICAgYml0IGlzIHdyYXBwZWQgdG8gdGhlIGxvdyBlbmQuICAqLwotI2RlZmluZSBNQjYgTUJFICsgMgotI2RlZmluZSBNRTYgTUI2Ci0jZGVmaW5lIE1CNl9NQVNLICgweDNmIDw8IDUpCi0gIHsgNiwgNSwgaW5zZXJ0X21iNiwgZXh0cmFjdF9tYjYsIDAgfSwKLQotICAvKiBUaGUgTkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgVGhlIHZhbHVlIDMyIGlzIHN0b3JlZCBhcwotICAgICAwLiAgKi8KLSNkZWZpbmUgTkIgTUI2ICsgMQotICB7IDYsIDExLCBpbnNlcnRfbmIsIGV4dHJhY3RfbmIsIDAgfSwKLQotICAvKiBUaGUgTlNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUKLSAgICAgU0kgZmllbGQsIG9ubHkgbmVnYXRlZC4gICovCi0jZGVmaW5lIE5TSSBOQiArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X25zaSwgZXh0cmFjdF9uc2ksCi0gICAgICBQUENfT1BFUkFORF9ORUdBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBSQSBmaWVsZCBpbiBhbiBELCBEUywgWCwgWE8sIE0sIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUkEgTlNJICsgMQotI2RlZmluZSBSQV9NQVNLICgweDFmIDw8IDE2KQotICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgICBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQSBmaWVsZCBtYXkgbm90IGJlIHplcm8gYW5kIG1heSBub3QKLSAgICAgZXF1YWwgdGhlIFJUIGZpZWxkLiAgKi8KLSNkZWZpbmUgUkFMIFJBICsgMQotICB7IDUsIDE2LCBpbnNlcnRfcmFsLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkEgZmllbGQgaW4gYW4gbG13IGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbCB2YWx1ZQotICAgICByZXN0cmljdGlvbnMuICAqLwotI2RlZmluZSBSQU0gUkFMICsgMQotICB7IDUsIDE2LCBpbnNlcnRfcmFtLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgICBzdG9yZSBvciBhbiB1cGRhdGluZyBmbG9hdGluZyBwb2ludCBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQQotICAgICBmaWVsZCBtYXkgbm90IGJlIHplcm8uICAqLwotI2RlZmluZSBSQVMgUkFNICsgMQotICB7IDUsIDE2LCBpbnNlcnRfcmFzLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkIgZmllbGQgaW4gYW4gWCwgWE8sIE0sIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUkIgUkFTICsgMQotI2RlZmluZSBSQl9NQVNLICgweDFmIDw8IDExKQotICB7IDUsIDExLCAwLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgUkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcwotICAgICB0aGUgUlMgZmllbGQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZAotICAgICBtbmVtb25pY3MgbGlrZSBtci4gICovCi0jZGVmaW5lIFJCUyBSQiArIDEKLSAgeyA1LCAxLCBpbnNlcnRfcmJzLCBleHRyYWN0X3JicywgUFBDX09QRVJBTkRfRkFLRSB9LAotCi0gIC8qIFRoZSBSUyBmaWVsZCBpbiBhIEQsIERTLCBYLCBYRlgsIFhTLCBNLCBNRCBvciBNRFMgZm9ybQotICAgICBpbnN0cnVjdGlvbiBvciB0aGUgUlQgZmllbGQgaW4gYSBELCBEUywgWCwgWEZYIG9yIFhPIGZvcm0KLSAgICAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBSUyBSQlMgKyAxCi0jZGVmaW5lIFJUIFJTCi0jZGVmaW5lIFJUX01BU0sgKDB4MWYgPDwgMjEpCi0gIHsgNSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAotCi0gIC8qIFRoZSBTSCBmaWVsZCBpbiBhbiBYIG9yIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNIIFJTICsgMQotI2RlZmluZSBTSF9NQVNLICgweDFmIDw8IDExKQotICB7IDUsIDExLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFNIIGZpZWxkIGluIGFuIE1EIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHNwbGl0LiAgKi8KLSNkZWZpbmUgU0g2IFNIICsgMQotI2RlZmluZSBTSDZfTUFTSyAoKDB4MWYgPDwgMTEpIHwgKDEgPDwgMSkpCi0gIHsgNiwgMSwgaW5zZXJ0X3NoNiwgZXh0cmFjdF9zaDYsIDAgfSwKLQotICAvKiBUaGUgU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTSSBTSDYgKyAxCi0gIHsgMTYsIDAsIDAsIDAsIFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBTSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHdlIGFjY2VwdCBhIHdpZGUgcmFuZ2UKLSAgICAgb2YgcG9zaXRpdmUgdmFsdWVzLiAgKi8KLSNkZWZpbmUgU0lTSUdOT1BUIFNJICsgMQotICB7IDE2LCAwLCAwLCAwLCBQUENfT1BFUkFORF9TSUdORUQgfCBQUENfT1BFUkFORF9TSUdOT1BUIH0sCi0KLSAgLyogVGhlIFNQUiBmaWVsZCBpbiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZmxpcHBlZC0tdGhlCi0gICAgIGxvd2VyIDUgYml0cyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciA1IGFuZCB2aWNlLSB2ZXJzYS4gICovCi0jZGVmaW5lIFNQUiBTSVNJR05PUFQgKyAxCi0jZGVmaW5lIFNQUl9NQVNLICgweDNmZiA8PCAxMSkKLSAgeyAxMCwgMTEsIGluc2VydF9zcHIsIGV4dHJhY3Rfc3ByLCAwIH0sCi0KLSAgLyogVGhlIEJBVCBpbmRleCBudW1iZXIgaW4gYW4gWEZYIGZvcm0gbVtmdF1pYmF0W2x1XSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNQUkJBVCBTUFIgKyAxCi0jZGVmaW5lIFNQUkJBVF9NQVNLICgweDMgPDwgMTcpCi0gIHsgMiwgMTcsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgU1BSRyByZWdpc3RlciBudW1iZXIgaW4gYW4gWEZYIGZvcm0gbVtmdF1zcHJnIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1BSRyBTUFJCQVQgKyAxCi0jZGVmaW5lIFNQUkdfTUFTSyAoMHgzIDw8IDE2KQotICB7IDIsIDE2LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFNSIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNSIFNQUkcgKyAxCi0gIHsgNCwgMTYsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgU1YgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU1YgU1IgKyAxCi0gIHsgMTQsIDIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgVEJSIGZpZWxkIGluIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIHRoZSBTUFIKLSAgICAgZmllbGQsIGJ1dCBpdCBpcyBvcHRpb25hbC4gICovCi0jZGVmaW5lIFRCUiBTViArIDEKLSAgeyAxMCwgMTEsIGluc2VydF90YnIsIGV4dHJhY3RfdGJyLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAotCi0gIC8qIFRoZSBUTyBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVE8gVEJSICsgMQotI2RlZmluZSBUT19NQVNLICgweDFmIDw8IDIxKQotICB7IDUsIDIxLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFUgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVSBUTyArIDEKLSAgeyA0LCAxMiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBVSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVJIFUgKyAxCi0gIHsgMTYsIDAsIDAsIDAsIDAgfSwKLX07Ci0KLS8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbnNlcnQgYW5kIGV4dHJhY3QgY29tcGxpY2F0ZWQgb3BlcmFuZHMuICAqLwotCi0vKiBUaGUgQkEgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKLSAgIHRoZSBCVCBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgRkFLRS4KLSAgIFRoZSBpbnNlcnRpb24gZnVuY3Rpb24ganVzdCBjb3BpZXMgdGhlIEJUIGZpZWxkIGludG8gdGhlIEJBIGZpZWxkLAotICAgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlCi0gICBzYW1lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JhdCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmF0IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDE2KSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBCQiBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcwotICAgdGhlIEJBIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBGQUtFLgotICAgVGhlIGluc2VydGlvbiBmdW5jdGlvbiBqdXN0IGNvcGllcyB0aGUgQkEgZmllbGQgaW50byB0aGUgQkIgZmllbGQsCi0gICBhbmQgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUKLSAgIHNhbWUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmJhIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgoKGluc24gPj4gMTYpICYgMHgxZikgPDwgMTEpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9iYmEgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiA+PiAxNikgJiAweDFmKSAhPSAoKGluc24gPj4gMTEpICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQotICAgZm9yY2VkIHRvIHplcm8uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmQgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmQgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHhmZmZjOwotfQotCi0vKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgLSBtb2RpZmllciBpcyB1c2VkLgotICAgVGhpcyBtb2RpZmllciBtZWFucyB0aGF0IHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLgotICAgV2UgbXVzdCBzZXQgdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCB0byAxIGlmIHRoZSBvZmZzZXQgaXMKLSAgIG5lZ2F0aXZlLiAgV2hlbiBleHRyYWN0aW5nLCB3ZSByZXF1aXJlIHRoYXQgdGhlIHkgYml0IGJlIDEgYW5kIHRoYXQKLSAgIHRoZSBvZmZzZXQgYmUgcG9zaXRpdmUsIHNpbmNlIGlmIHRoZSB5IGJpdCBpcyAwIHdlIGp1c3Qgd2FudCB0bwotICAgcHJpbnQgdGhlIG5vcm1hbCBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iZG0gKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoKHZhbHVlICYgMHg4MDAwKSAhPSAwKQotICAgIGluc24gfD0gMSA8PCAyMTsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9iZG0gKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICgoaW5zbiAmICgxIDw8IDIxKSkgPT0gMAotCSAgfHwgKGluc24gJiAoMSA8PCAxNSkpID09IDApKQotICAgICppbnZhbGlkID0gMTsKLSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotICAgIHJldHVybiAoaW5zbiAmIDB4ZmZmYykgLSAweDEwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluc24gJiAweGZmZmM7Ci19Ci0KLS8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG1vZGlmaWVyIGlzIHVzZWQuCi0gICBUaGlzIGlzIGxpa2UgQkRNLCBhYm92ZSwgZXhjZXB0IHRoYXQgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZQotICAgdGFrZW4uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmRwIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKCh2YWx1ZSAmIDB4ODAwMCkgPT0gMCkKLSAgICBpbnNuIHw9IDEgPDwgMjE7Ci0gIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmZjKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmRwIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gJiAoMSA8PCAyMSkpID09IDAKLQkgIHx8IChpbnNuICYgKDEgPDwgMTUpKSAhPSAwKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHhmZmZjOwotfQotCi0vKiBDaGVjayBmb3IgbGVnYWwgdmFsdWVzIG9mIGEgQk8gZmllbGQuICAqLwotCi1zdGF0aWMgaW50Ci12YWxpZF9ibyAodmFsdWUpCi0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIC8qIENlcnRhaW4gZW5jb2RpbmdzIGhhdmUgYml0cyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSB6ZXJvLiAgVGhlc2UKLSAgICAgYXJlICh6IG11c3QgYmUgemVybywgeSBtYXkgYmUgYW55dGhpbmcpOgotICAgICAgICAgMDAxenkKLQkgMDExenkKLQkgMXowMHkKLQkgMXowMXkKLQkgMXoxenoKLSAgICAgKi8KLSAgc3dpdGNoICh2YWx1ZSAmIDB4MTQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSAweDQ6Ci0gICAgICByZXR1cm4gKHZhbHVlICYgMHgyKSA9PSAwOwotICAgIGNhc2UgMHgxMDoKLSAgICAgIHJldHVybiAodmFsdWUgJiAweDgpID09IDA7Ci0gICAgY2FzZSAweDE0OgotICAgICAgcmV0dXJuIHZhbHVlID09IDB4MTQ7Ci0gICAgfQotfQotCi0vKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBXYXJuIGFib3V0IGF0dGVtcHRzIHRvIHNldAotICAgdGhlIGZpZWxkIHRvIGFuIGlsbGVnYWwgdmFsdWUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JvIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwKLSAgICAgICYmICEgdmFsaWRfYm8gKHZhbHVlKSkKLSAgICAqZXJybXNnID0gXygiaW52YWxpZCBjb25kaXRpb25hbCBvcHRpb24iKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMjEpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9ibyAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgdmFsdWU7Ci0KLSAgdmFsdWUgPSAoaW5zbiA+PiAyMSkgJiAweDFmOwotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICEgdmFsaWRfYm8gKHZhbHVlKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgb3IgLSBtb2RpZmllciBpcwotICAgdXNlZC4gIFRoaXMgaXMgbGlrZSB0aGUgQk8gZmllbGQsIGJ1dCBpdCBtdXN0IGJlIGV2ZW4uICBXaGVuCi0gICBleHRyYWN0aW5nIGl0LCB3ZSBmb3JjZSBpdCB0byBiZSBldmVuLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9ib2UgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISB2YWxpZF9ibyAodmFsdWUpKQotCSplcnJtc2cgPSBfKCJpbnZhbGlkIGNvbmRpdGlvbmFsIG9wdGlvbiIpOwotICAgICAgZWxzZSBpZiAoKHZhbHVlICYgMSkgIT0gMCkKLQkqZXJybXNnID0gXygiYXR0ZW1wdCB0byBzZXQgeSBiaXQgd2hlbiB1c2luZyArIG9yIC0gbW9kaWZpZXIiKTsKLSAgICB9Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDIxKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYm9lIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyB2YWx1ZTsKLQotICB2YWx1ZSA9IChpbnNuID4+IDIxKSAmIDB4MWY7Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgISB2YWxpZF9ibyAodmFsdWUpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIHZhbHVlICYgMHgxZTsKLX0KLQotLyogVGhlIERTIGZpZWxkIGluIGEgRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSBELCBidXQgdGhlCi0gICBsb3dlciB0d28gYml0cyBhcmUgZm9yY2VkIHRvIHplcm8uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZHMgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfZHMgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHhmZmZjOwotfQotCi0vKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQotICAgZm9yY2VkIHRvIHplcm8uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfbGkgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKCh2YWx1ZSAmIDMpICE9IDAgJiYgZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMKQotICAgICplcnJtc2cgPSBfKCJpZ25vcmluZyBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGluIGJyYW5jaCBvZmZzZXQiKTsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweDNmZmZmZmMpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X2xpIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoKGluc24gJiAweDIwMDAwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHgzZmZmZmZjKSAtIDB4NDAwMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHgzZmZmZmZjOwotfQotCi0vKiBUaGUgTUIgYW5kIE1FIGZpZWxkcyBpbiBhbiBNIGZvcm0gaW5zdHJ1Y3Rpb24gZXhwcmVzc2VkIGFzIGEgc2luZ2xlCi0gICBvcGVyYW5kIHdoaWNoIGlzIGl0c2VsZiBhIGJpdG1hc2suICBUaGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBhbHdheXMKLSAgIG1hcmtzIGl0IGFzIGludmFsaWQsIHNpbmNlIHdlIG5ldmVyIHdhbnQgdG8gcmVjb2duaXplIGFuCi0gICBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIGEgZmllbGQgb2YgdGhpcyB0eXBlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9tYmUgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgdW5zaWduZWQgbG9uZyB1dmFsLCBtYXNrOwotICBpbnQgbWIsIG1lLCBteCwgY291bnQsIGxhc3Q7Ci0KLSAgdXZhbCA9IHZhbHVlOwotCi0gIGlmICh1dmFsID09IDApCi0gICAgewotICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLQkqZXJybXNnID0gXygiaWxsZWdhbCBiaXRtYXNrIik7Ci0gICAgICByZXR1cm4gaW5zbjsKLSAgICB9Ci0KLSAgbWIgPSAwOwotICBtZSA9IDMyOwotICBpZiAoKHV2YWwgJiAxKSAhPSAwKQotICAgIGxhc3QgPSAxOwotICBlbHNlCi0gICAgbGFzdCA9IDA7Ci0gIGNvdW50ID0gMDsKLQotICAvKiBtYjogbG9jYXRpb24gb2YgbGFzdCAwLT4xIHRyYW5zaXRpb24gKi8KLSAgLyogbWU6IGxvY2F0aW9uIG9mIGxhc3QgMS0+MCB0cmFuc2l0aW9uICovCi0gIC8qIGNvdW50OiAjIHRyYW5zaXRpb25zICovCi0KLSAgZm9yIChteCA9IDAsIG1hc2sgPSAxIDw8IDMxOyBteCA8IDMyOyArK214LCBtYXNrID4+PSAxKQotICAgIHsKLSAgICAgIGlmICgodXZhbCAmIG1hc2spICYmICFsYXN0KQotCXsKLQkgICsrY291bnQ7Ci0JICBtYiA9IG14OwotCSAgbGFzdCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoISh1dmFsICYgbWFzaykgJiYgbGFzdCkKLQl7Ci0JICArK2NvdW50OwotCSAgbWUgPSBteDsKLQkgIGxhc3QgPSAwOwotCX0KLSAgICB9Ci0gIGlmIChtZSA9PSAwKQotICAgIG1lID0gMzI7Ci0KLSAgaWYgKGNvdW50ICE9IDIgJiYgKGNvdW50ICE9IDAgfHwgISBsYXN0KSkKLSAgICB7Ci0gICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMKQotCSplcnJtc2cgPSBfKCJpbGxlZ2FsIGJpdG1hc2siKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGluc24gfCAobWIgPDwgNikgfCAoKG1lIC0gMSkgPDwgMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X21iZSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgcmV0OwotICBpbnQgbWIsIG1lOwotICBpbnQgaTsKLQotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwpCi0gICAgKmludmFsaWQgPSAxOwotCi0gIG1iID0gKGluc24gPj4gNikgJiAweDFmOwotICBtZSA9IChpbnNuID4+IDEpICYgMHgxZjsKLSAgaWYgKG1iIDwgbWUgKyAxKQotICAgIHsKLSAgICAgIHJldCA9IDA7Ci0gICAgICBmb3IgKGkgPSBtYjsgaSA8PSBtZTsgaSsrKQotCXJldCB8PSAobG9uZykgMSA8PCAoMzEgLSBpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG1iID09IG1lICsgMSkKLSAgICByZXQgPSB+MDsKLSAgZWxzZSAvKiAobWIgPiBtZSArIDEpICovCi0gICAgewotICAgICAgcmV0ID0gfiAobG9uZykgMDsKLSAgICAgIGZvciAoaSA9IG1lICsgMTsgaSA8IG1iOyBpKyspCi0JcmV0ICY9IH4gKChsb25nKSAxIDw8ICgzMSAtIGkpKTsKLSAgICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBNQiBvciBNRSBmaWVsZCBpbiBhbiBNRCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIGJpdAotICAgaXMgd3JhcHBlZCB0byB0aGUgbG93IGVuZC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9tYjYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCA2KSB8ICh2YWx1ZSAmIDB4MjApOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X21iNiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuICgoaW5zbiA+PiA2KSAmIDB4MWYpIHwgKGluc24gJiAweDIwKTsKLX0KLQotLyogVGhlIE5CIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSB2YWx1ZSAzMiBpcyBzdG9yZWQgYXMKLSAgIDAuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X25iIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAzMikKLSAgICAqZXJybXNnID0gXygidmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0gIGlmICh2YWx1ZSA9PSAzMikKLSAgICB2YWx1ZSA9IDA7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDExKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9uYiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gKGluc24gPj4gMTEpICYgMHgxZjsKLSAgaWYgKHJldCA9PSAwKQotICAgIHJldCA9IDMyOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgTlNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgU0kKLSAgIGZpZWxkLCBvbmx5IG5lZ2F0ZWQuICBUaGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBhbHdheXMgbWFya3MgaXQgYXMKLSAgIGludmFsaWQsIHNpbmNlIHdlIG5ldmVyIHdhbnQgdG8gcmVjb2duaXplIGFuIGluc3RydWN0aW9uIHdoaWNoIHVzZXMKLSAgIGEgZmllbGQgb2YgdGhpcyB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X25zaSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgtIHZhbHVlKSAmIDB4ZmZmZik7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X25zaSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gLSAoKGxvbmcpKGluc24gJiAweGZmZmYpIC0gMHgxMDAwMCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gLSAobG9uZykoaW5zbiAmIDB4ZmZmZik7Ci19Ci0KLS8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCi0gICBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQSBmaWVsZCBtYXkgbm90IGJlIHplcm8gYW5kIG1heSBub3QKLSAgIGVxdWFsIHRoZSBSVCBmaWVsZC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfcmFsIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA9PSAwCi0gICAgICB8fCAodW5zaWduZWQgbG9uZykgdmFsdWUgPT0gKChpbnNuID4+IDIxKSAmIDB4MWYpKQotICAgICplcnJtc2cgPSAiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Ci19Ci0KLS8qIFRoZSBSQSBmaWVsZCBpbiBhbiBsbXcgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsIHZhbHVlCi0gICByZXN0cmljdGlvbnMuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3JhbSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID49ICgoaW5zbiA+PiAyMSkgJiAweDFmKSkKLSAgICAqZXJybXNnID0gXygiaW5kZXggcmVnaXN0ZXIgaW4gbG9hZCByYW5nZSIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Ci19Ci0KLS8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCi0gICBzdG9yZSBvciBhbiB1cGRhdGluZyBmbG9hdGluZyBwb2ludCBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQQotICAgZmllbGQgbWF5IG5vdCBiZSB6ZXJvLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9yYXMgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID09IDApCi0gICAgKmVycm1zZyA9IF8oImludmFsaWQgcmVnaXN0ZXIgb3BlcmFuZCB3aGVuIHVwZGF0aW5nIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotLyogVGhlIFJCIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKLSAgIHRoZSBSUyBmaWVsZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIGV4dGVuZGVkCi0gICBtbmVtb25pY3MgbGlrZSBtci4gIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgRkFLRS4gIFRoZSBpbnNlcnRpb24KLSAgIGZ1bmN0aW9uIGp1c3QgY29waWVzIHRoZSBCVCBmaWVsZCBpbnRvIHRoZSBCQSBmaWVsZCwgYW5kIHRoZQotICAgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZSBzYW1lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3JicyAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDExKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcmJzIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDExKSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBTSCBmaWVsZCBpbiBhbiBNRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBzcGxpdC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9zaDYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxMSkgfCAoKHZhbHVlICYgMHgyMCkgPj4gNCk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3Rfc2g2IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gKChpbnNuID4+IDExKSAmIDB4MWYpIHwgKChpbnNuIDw8IDQpICYgMHgyMCk7Ci19Ci0KLS8qIFRoZSBTUFIgZmllbGQgaW4gYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGZsaXBwZWQtLXRoZQotICAgbG93ZXIgNSBiaXRzIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIDUgYW5kIHZpY2UtIHZlcnNhLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9zcHIgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNikgfCAoKHZhbHVlICYgMHgzZTApIDw8IDYpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9zcHIgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAoKGluc24gPj4gMTYpICYgMHgxZikgfCAoKGluc24gPj4gNikgJiAweDNlMCk7Ci19Ci0KLS8qIFRoZSBUQlIgZmllbGQgaW4gYW4gWEZYIGluc3RydWN0aW9uLiAgVGhpcyBpcyBqdXN0IGxpa2UgU1BSLCBidXQgaXQKLSAgIGlzIG9wdGlvbmFsLiAgV2hlbiBUQlIgaXMgb21pdHRlZCwgaXQgbXVzdCBiZSBpbnNlcnRlZCBhcyAyNjggKHRoZQotICAgbWFnaWMgbnVtYmVyIG9mIHRoZSBUQiByZWdpc3RlcikuICBUaGVzZSBmdW5jdGlvbnMgdHJlYXQgMAotICAgKGluZGljYXRpbmcgYW4gb21pdHRlZCBvcHRpb25hbCBvcGVyYW5kKSBhcyAyNjguICBUaGlzIG1lYW5zIHRoYXQKLSAgIGBgbWZ0YiA0LDAnJyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICBUaGlzIGRvZXMgbm90IG1hdHRlciB2ZXJ5Ci0gICBtdWNoLCBzaW5jZSB0aGUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBkb2VzIG5vdCBkZWZpbmUgbWZ0YiBhcwotICAgYWNjZXB0aW5nIGFueSB2YWx1ZXMgb3RoZXIgdGhhbiAyNjggb3IgMjY5LiAgKi8KLQotI2RlZmluZSBUQiAoMjY4KQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3RiciAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgIHZhbHVlID0gVEI7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNlMCkgPDwgNik7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X3RiciAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gKChpbnNuID4+IDE2KSAmIDB4MWYpIHwgKChpbnNuID4+IDYpICYgMHgzZTApOwotICBpZiAocmV0ID09IFRCKQotICAgIHJldCA9IDA7Ci0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBNYWNyb3MgdXNlZCB0byBmb3JtIG9wY29kZXMuICAqLwotCi0vKiBUaGUgbWFpbiBvcGNvZGUuICAqLwotI2RlZmluZSBPUCh4KSAoKCgodW5zaWduZWQgbG9uZykoeCkpICYgMHgzZikgPDwgMjYpCi0jZGVmaW5lIE9QX01BU0sgT1AgKDB4M2YpCi0KLS8qIFRoZSBtYWluIG9wY29kZSBjb21iaW5lZCB3aXRoIGEgdHJhcCBjb2RlIGluIHRoZSBUTyBmaWVsZCBvZiBhIEQKLSAgIGZvcm0gaW5zdHJ1Y3Rpb24uICBVc2VkIGZvciBleHRlbmRlZCBtbmVtb25pY3MgZm9yIHRoZSB0cmFwCi0gICBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBPUFRPKHgsdG8pIChPUCAoeCkgfCAoKCgodW5zaWduZWQgbG9uZykodG8pKSAmIDB4MWYpIDw8IDIxKSkKLSNkZWZpbmUgT1BUT19NQVNLIChPUF9NQVNLIHwgVE9fTUFTSykKLQotLyogVGhlIG1haW4gb3Bjb2RlIGNvbWJpbmVkIHdpdGggYSBjb21wYXJpc29uIHNpemUgYml0IGluIHRoZSBMIGZpZWxkCi0gICBvZiBhIEQgZm9ybSBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24uICBVc2VkIGZvciBleHRlbmRlZCBtbmVtb25pY3MgZm9yCi0gICB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBPUEwoeCxsKSAoT1AgKHgpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDEpIDw8IDIxKSkKLSNkZWZpbmUgT1BMX01BU0sgT1BMICgweDNmLDEpCi0KLS8qIEFuIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEEob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZikgPDwgMSkgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCi0jZGVmaW5lIEFfTUFTSyBBICgweDNmLCAweDFmLCAxKQotCi0vKiBBbiBBX01BU0sgd2l0aCB0aGUgRlJCIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgQUZSQl9NQVNLIChBX01BU0sgfCBGUkJfTUFTSykKLQotLyogQW4gQV9NQVNLIHdpdGggdGhlIEZSQyBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIEFGUkNfTUFTSyAoQV9NQVNLIHwgRlJDX01BU0spCi0KLS8qIEFuIEFfTUFTSyB3aXRoIHRoZSBGUkEgYW5kIEZSQyBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBBRlJBRlJDX01BU0sgKEFfTUFTSyB8IEZSQV9NQVNLIHwgRlJDX01BU0spCi0KLS8qIEEgQiBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQihvcCwgYWEsIGxrKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKShhYSkpICYgMSkgPDwgMSkgfCAoKGxrKSAmIDEpKQotI2RlZmluZSBCX01BU0sgQiAoMHgzZiwgMSwgMSkKLQotLyogQSBCIGZvcm0gaW5zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgQk8gZmllbGQuICAqLwotI2RlZmluZSBCQk8ob3AsIGJvLCBhYSwgbGspIChCICgob3ApLCAoYWEpLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShibykpICYgMHgxZikgPDwgMjEpKQotI2RlZmluZSBCQk9fTUFTSyBCQk8gKDB4M2YsIDB4MWYsIDEsIDEpCi0KLS8qIEEgQkJPX01BU0sgd2l0aCB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIHJlbW92ZWQuICBUaGlzIHBlcm1pdHMKLSAgIG1hdGNoaW5nIGEgY29uZGl0aW9uYWwgYnJhbmNoIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgdGhlIHkKLSAgIGJpdC4gICovCi0jZGVmaW5lIFlfTUFTSyAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIxKQotI2RlZmluZSBCQk9ZX01BU0sgKEJCT19NQVNLICZ+IFlfTUFTSykKLQotLyogQSBCIGZvcm0gaW5zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgQk8gZmllbGQgYW5kIHRoZSBjb25kaXRpb24gYml0cyBvZgotICAgdGhlIEJJIGZpZWxkLiAgKi8KLSNkZWZpbmUgQkJPQ0Iob3AsIGJvLCBjYiwgYWEsIGxrKSBcCi0gIChCQk8gKChvcCksIChibyksIChhYSksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGNiKSkgJiAweDMpIDw8IDE2KSkKLSNkZWZpbmUgQkJPQ0JfTUFTSyBCQk9DQiAoMHgzZiwgMHgxZiwgMHgzLCAxLCAxKQotCi0vKiBBIEJCT0NCX01BU0sgd2l0aCB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIHJlbW92ZWQuICAqLwotI2RlZmluZSBCQk9ZQ0JfTUFTSyAoQkJPQ0JfTUFTSyAmfiBZX01BU0spCi0KLS8qIEEgQkJPWUNCX01BU0sgaW4gd2hpY2ggdGhlIEJJIGZpZWxkIGlzIGZpeGVkLiAgKi8KLSNkZWZpbmUgQkJPWUJJX01BU0sgKEJCT1lDQl9NQVNLIHwgQklfTUFTSykKLQotLyogVGhlIG1haW4gb3Bjb2RlIG1hc2sgd2l0aCB0aGUgUkEgZmllbGQgY2xlYXIuICAqLwotI2RlZmluZSBEUkFfTUFTSyAoT1BfTUFTSyB8IFJBX01BU0spCi0KLS8qIEEgRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIERTTyhvcCwgeG9wKSAoT1AgKG9wKSB8ICgoeG9wKSAmIDB4MykpCi0jZGVmaW5lIERTX01BU0sgRFNPICgweDNmLCAzKQotCi0vKiBBbiBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNKG9wLCByYykgKE9QIChvcCkgfCAoKHJjKSAmIDEpKQotI2RlZmluZSBNX01BU0sgTSAoMHgzZiwgMSkKLQotLyogQW4gTSBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIE1FIGZpZWxkIHNwZWNpZmllZC4gICovCi0jZGVmaW5lIE1NRShvcCwgbWUsIHJjKSAoTSAoKG9wKSwgKHJjKSkgfCAoKCgodW5zaWduZWQgbG9uZykobWUpKSAmIDB4MWYpIDw8IDEpKQotCi0vKiBBbiBNX01BU0sgd2l0aCB0aGUgTUIgYW5kIE1FIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIE1NQk1FX01BU0sgKE1fTUFTSyB8IE1CX01BU0sgfCBNRV9NQVNLKQotCi0vKiBBbiBNX01BU0sgd2l0aCB0aGUgU0ggYW5kIE1FIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIE1TSE1FX01BU0sgKE1fTUFTSyB8IFNIX01BU0sgfCBNRV9NQVNLKQotCi0vKiBBbiBNRCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUQob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHg3KSA8PCAyKSB8ICgocmMpICYgMSkpCi0jZGVmaW5lIE1EX01BU0sgTUQgKDB4M2YsIDB4NywgMSkKLQotLyogQW4gTURfTUFTSyB3aXRoIHRoZSBNQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIE1ETUJfTUFTSyAoTURfTUFTSyB8IE1CNl9NQVNLKQotCi0vKiBBbiBNRF9NQVNLIHdpdGggdGhlIFNIIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgTURTSF9NQVNLIChNRF9NQVNLIHwgU0g2X01BU0spCi0KLS8qIEFuIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTURTKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4ZikgPDwgMSkgfCAoKHJjKSAmIDEpKQotI2RlZmluZSBNRFNfTUFTSyBNRFMgKDB4M2YsIDB4ZiwgMSkKLQotLyogQW4gTURTX01BU0sgd2l0aCB0aGUgTUIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBNRFNNQl9NQVNLIChNRFNfTUFTSyB8IE1CNl9NQVNLKQotCi0vKiBBbiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0Mob3AsIHNhLCBsaykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoc2EpKSAmIDEpIDw8IDEpIHwgKChsaykgJiAxKSkKLSNkZWZpbmUgU0NfTUFTSyAoT1BfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMHgzZmYpIDw8IDE2KSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMSkgfCAxKQotCi0vKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYKG9wLCB4b3ApIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpKQotCi0vKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgUkMgYml0IHNwZWNpZmllZC4gICovCi0jZGVmaW5lIFhSQyhvcCwgeG9wLCByYykgKFggKChvcCksICh4b3ApKSB8ICgocmMpICYgMSkpCi0KLS8qIFRoZSBtYXNrIGZvciBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYX01BU0sgWFJDICgweDNmLCAweDNmZiwgMSkKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWFJBX01BU0sgKFhfTUFTSyB8IFJBX01BU0spCi0KLS8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIFhSQl9NQVNLIChYX01BU0sgfCBSQl9NQVNLKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUlQgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYUlRfTUFTSyAoWF9NQVNLIHwgUlRfTUFTSykKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGFuZCBSQiBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYUkFSQl9NQVNLIChYX01BU0sgfCBSQV9NQVNLIHwgUkJfTUFTSykKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJUIGFuZCBSQSBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYUlRSQV9NQVNLIChYX01BU0sgfCBSVF9NQVNLIHwgUkFfTUFTSykKLQotLyogQW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYQ01QTChvcCwgeG9wLCBsKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDEpIDw8IDIxKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWENNUF9NQVNLIChYX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIyKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uIHdpdGggdGhlIEwgZmllbGQKLSAgIGZpeGVkLiAgKi8KLSNkZWZpbmUgWENNUExfTUFTSyAoWENNUF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMSkpCi0KLS8qIEFuIFggZm9ybSB0cmFwIGluc3RydWN0aW9uIHdpdGggdGhlIFRPIGZpZWxkIHNwZWNpZmllZC4gICovCi0jZGVmaW5lIFhUTyhvcCwgeG9wLCB0bykgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh0bykpICYgMHgxZikgPDwgMjEpKQotI2RlZmluZSBYVE9fTUFTSyAoWF9NQVNLIHwgVE9fTUFTSykKLQotLyogQW4gWEZMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYRkwob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQotI2RlZmluZSBYRkxfTUFTSyAoWEZMICgweDNmLCAweDNmZiwgMSkgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDI1KSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMTYpKQotCi0vKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIExLIGZpZWxkIHNldCB0byAwLiAgKi8KLSNkZWZpbmUgWEwob3AsIHhvcCkgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkpCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcyB0aGUgTEsgZmllbGQuICAqLwotI2RlZmluZSBYTExLKG9wLCB4b3AsIGxrKSAoWEwgKChvcCksICh4b3ApKSB8ICgobGspICYgMSkpCi0KLS8qIFRoZSBtYXNrIGZvciBhbiBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWExfTUFTSyBYTExLICgweDNmLCAweDNmZiwgMSkKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBleHBsaWNpdGx5IHNldHMgdGhlIEJPIGZpZWxkLiAgKi8KLSNkZWZpbmUgWExPKG9wLCBibywgeG9wLCBsaykgXAotICAoWExMSyAoKG9wKSwgKHhvcCksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGJvKSkgJiAweDFmKSA8PCAyMSkpCi0jZGVmaW5lIFhMT19NQVNLIChYTF9NQVNLIHwgQk9fTUFTSykKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBleHBsaWNpdGx5IHNldHMgdGhlIHkgYml0IG9mIHRoZSBCTwotICAgZmllbGQuICAqLwotI2RlZmluZSBYTFlMSyhvcCwgeG9wLCB5LCBsaykgKFhMTEsgKChvcCksICh4b3ApLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh5KSkgJiAxKSA8PCAyMSkpCi0jZGVmaW5lIFhMWUxLX01BU0sgKFhMX01BU0sgfCBZX01BU0spCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggc2V0cyB0aGUgQk8gZmllbGQgYW5kIHRoZSBjb25kaXRpb24KLSAgIGJpdHMgb2YgdGhlIEJJIGZpZWxkLiAgKi8KLSNkZWZpbmUgWExPQ0Iob3AsIGJvLCBjYiwgeG9wLCBsaykgXAotICAoWExPICgob3ApLCAoYm8pLCAoeG9wKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoY2IpKSAmIDMpIDw8IDE2KSkKLSNkZWZpbmUgWExPQ0JfTUFTSyBYTE9DQiAoMHgzZiwgMHgxZiwgMHgzLCAweDNmZiwgMSkKLQotLyogQW4gWExfTUFTSyBvciBYTFlMS19NQVNLIG9yIFhMT0NCX01BU0sgd2l0aCB0aGUgQkIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYTEJCX01BU0sgKFhMX01BU0sgfCBCQl9NQVNLKQotI2RlZmluZSBYTFlCQl9NQVNLIChYTFlMS19NQVNLIHwgQkJfTUFTSykKLSNkZWZpbmUgWExCT0NCQkJfTUFTSyAoWExPQ0JfTUFTSyB8IEJCX01BU0spCi0KLS8qIEFuIFhMX01BU0sgd2l0aCB0aGUgQk8gYW5kIEJCIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIFhMQk9CQl9NQVNLIChYTF9NQVNLIHwgQk9fTUFTSyB8IEJCX01BU0spCi0KLS8qIEFuIFhMX01BU0sgd2l0aCB0aGUgQk8sIEJJIGFuZCBCQiBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYTEJPQklCQl9NQVNLIChYTF9NQVNLIHwgQk9fTUFTSyB8IEJJX01BU0sgfCBCQl9NQVNLKQotCi0vKiBBbiBYTyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWE8ob3AsIHhvcCwgb2UsIHJjKSBcCi0gIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZmYpIDw8IDEpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKG9lKSkgJiAxKSA8PCAxMCkgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCi0jZGVmaW5lIFhPX01BU0sgWE8gKDB4M2YsIDB4MWZmLCAxLCAxKQotCi0vKiBBbiBYT19NQVNLIHdpdGggdGhlIFJCIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWE9SQl9NQVNLIChYT19NQVNLIHwgUkJfTUFTSykKLQotLyogQW4gWFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhTKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWZmKSA8PCAyKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKLSNkZWZpbmUgWFNfTUFTSyBYUyAoMHgzZiwgMHgxZmYsIDEpCi0KLS8qIEEgbWFzayBmb3IgdGhlIEZYTSB2ZXJzaW9uIG9mIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWEZYRlhNX01BU0sgKFhfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjApIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAxMSkpCi0KLS8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIEZYTSBmaWVsZCBmaWxsZWQgaW4uICAqLwotI2RlZmluZSBYRlhNKG9wLCB4b3AsIGZ4bSkgXAotICAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGZ4bSkpICYgMHhmZikgPDwgMTIpKQotCi0vKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluLiAgKi8KLSNkZWZpbmUgWFNQUihvcCwgeG9wLCBzcHIpIFwKLSAgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKShzcHIpKSAmIDB4MWYpIDw8IDE2KSB8ICgoKCh1bnNpZ25lZCBsb25nKShzcHIpKSAmIDB4M2UwKSA8PCA2KSkKLSNkZWZpbmUgWFNQUl9NQVNLIChYX01BU0sgfCBTUFJfTUFTSykKLQotLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgU1BSIGZpZWxkIGZpbGxlZCBpbiBleGNlcHQgZm9yIHRoZQotICAgU1BSQkFUIGZpZWxkLiAgKi8KLSNkZWZpbmUgWFNQUkJBVF9NQVNLIChYU1BSX01BU0sgJn4gU1BSQkFUX01BU0spCi0KLS8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFNQUiBmaWVsZCBmaWxsZWQgaW4gZXhjZXB0IGZvciB0aGUKLSAgIFNQUkcgZmllbGQuICAqLwotI2RlZmluZSBYU1BSR19NQVNLIChYU1BSX01BU0sgJn4gU1BSR19NQVNLKQotCi0vKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCBldmVyeXRoaW5nIGZpbGxlZCBpbiBleGNlcHQgdGhlIEUgZmllbGQuICAqLwotI2RlZmluZSBYRV9NQVNLICgweGZmZmY3ZmZmKQotCi0vKiBUaGUgQk8gZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgY29uZGl0aW9uYWwgYnJhbmNoIG1uZW1vbmljcy4gICovCi0jZGVmaW5lIEJPRE5aRgkoMHgwKQotI2RlZmluZSBCT0ROWkZQCSgweDEpCi0jZGVmaW5lIEJPRFpGCSgweDIpCi0jZGVmaW5lIEJPRFpGUAkoMHgzKQotI2RlZmluZSBCT0YJKDB4NCkKLSNkZWZpbmUgQk9GUAkoMHg1KQotI2RlZmluZSBCT0ROWlQJKDB4OCkKLSNkZWZpbmUgQk9ETlpUUAkoMHg5KQotI2RlZmluZSBCT0RaVAkoMHhhKQotI2RlZmluZSBCT0RaVFAJKDB4YikKLSNkZWZpbmUgQk9UCSgweGMpCi0jZGVmaW5lIEJPVFAJKDB4ZCkKLSNkZWZpbmUgQk9ETloJKDB4MTApCi0jZGVmaW5lIEJPRE5aUAkoMHgxMSkKLSNkZWZpbmUgQk9EWgkoMHgxMikKLSNkZWZpbmUgQk9EWlAJKDB4MTMpCi0jZGVmaW5lIEJPVQkoMHgxNCkKLQotLyogVGhlIEJJIGNvbmRpdGlvbiBiaXQgZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgY29uZGl0aW9uYWwgYnJhbmNoCi0gICBtbmVtb25pY3MuICAqLwotI2RlZmluZSBDQkxUCSgwKQotI2RlZmluZSBDQkdUCSgxKQotI2RlZmluZSBDQkVRCSgyKQotI2RlZmluZSBDQlNPCSgzKQotCi0vKiBUaGUgVE8gZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgdHJhcCBtbmVtb25pY3MuICAqLwotI2RlZmluZSBUT0xHVAkoMHgxKQotI2RlZmluZSBUT0xMVAkoMHgyKQotI2RlZmluZSBUT0VRCSgweDQpCi0jZGVmaW5lIFRPTEdFCSgweDUpCi0jZGVmaW5lIFRPTE5MCSgweDUpCi0jZGVmaW5lIFRPTExFCSgweDYpCi0jZGVmaW5lIFRPTE5HCSgweDYpCi0jZGVmaW5lIFRPR1QJKDB4OCkKLSNkZWZpbmUgVE9HRQkoMHhjKQotI2RlZmluZSBUT05MCSgweGMpCi0jZGVmaW5lIFRPTFQJKDB4MTApCi0jZGVmaW5lIFRPTEUJKDB4MTQpCi0jZGVmaW5lIFRPTkcJKDB4MTQpCi0jZGVmaW5lIFRPTkUJKDB4MTgpCi0jZGVmaW5lIFRPVQkoMHgxZikKLQwKLS8qIFNtYWxsZXIgbmFtZXMgZm9yIHRoZSBmbGFncyBzbyBlYWNoIGVudHJ5IGluIHRoZSBvcGNvZGVzIHRhYmxlIHdpbGwKLSAgIGZpdCBvbiBhIHNpbmdsZSBsaW5lLiAgKi8KLSN1bmRlZglQUEMKLSNkZWZpbmUgUFBDICAgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ0NPTQlQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFBDMzIgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQUEM2NCAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82NCB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ09OTFkJUFBDX09QQ09ERV9QUEMKLSNkZWZpbmUgUFBDNDAzCVBQQwotI2RlZmluZSBQUEM3NTAJUFBDCi0jZGVmaW5lIFBQQzg2MAlQUEMKLSNkZWZpbmUJUE9XRVIgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUJUE9XRVIyCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ1BXUjIJUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjIgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlQT1dFUjMyCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX0FOWSB8IFBQQ19PUENPREVfMzIKLSNkZWZpbmUJQ09NICAgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lCUNPTTMyICAgUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWSB8IFBQQ19PUENPREVfMzIKLSNkZWZpbmUJTTYwMSAgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV82MDEgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQV1JDT00JUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfNjAxIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlNRkRFQzEJUFBDX09QQ09ERV9QT1dFUgotI2RlZmluZQlNRkRFQzIJUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzYwMQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCSAgICAgT1BDT0RFCU1BU0sJCUZMQUdTCQl7IE9QRVJBTkRTIH0KLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBGTEFHUyBhcmUgZmxhZ3MgaW5kaWNhdGVkIHdoYXQgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4gIEl0IGlzIGFsc28KLSAgIHNvcnRlZCBieSBtYWpvciBvcGNvZGUuICAqLwotCi1jb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgcG93ZXJwY19vcGNvZGVzW10gPSB7Ci17ICJ0ZGxndGkiLCAgT1BUTygyLFRPTEdUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGx0aSIsICBPUFRPKDIsVE9MTFQpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRlcWkiLCAgIE9QVE8oMixUT0VRKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGdlaSIsICBPUFRPKDIsVE9MR0UpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsbmxpIiwgIE9QVE8oMixUT0xOTCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGxsZWkiLCAgT1BUTygyLFRPTExFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbG5naSIsICBPUFRPKDIsVE9MTkcpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRndGkiLCAgIE9QVE8oMixUT0dUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkZ2VpIiwgICBPUFRPKDIsVE9HRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZG5saSIsICAgT1BUTygyLFRPTkwpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsdGkiLCAgIE9QVE8oMixUT0xUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGVpIiwgICBPUFRPKDIsVE9MRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZG5naSIsICAgT1BUTygyLFRPTkcpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRuZWkiLCAgIE9QVE8oMixUT05FKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkaSIsICAgICBPUCgyKSwJT1BfTUFTSywJUFBDNjQsCQl7IFRPLCBSQSwgU0kgfSB9LAotCi17ICJ0d2xndGkiLCAgT1BUTygzLFRPTEdUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGd0aSIsICAgT1BUTygzLFRPTEdUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2xsdGkiLCAgT1BUTygzLFRPTExUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGx0aSIsICAgT1BUTygzLFRPTExUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2VxaSIsICAgT1BUTygzLFRPRVEpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRlcWkiLCAgICBPUFRPKDMsVE9FUSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsZ2VpIiwgIE9QVE8oMyxUT0xHRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxnZWkiLCAgIE9QVE8oMyxUT0xHRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbmxpIiwgIE9QVE8oMyxUT0xOTCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxubGkiLCAgIE9QVE8oMyxUT0xOTCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbGVpIiwgIE9QVE8oMyxUT0xMRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxsZWkiLCAgIE9QVE8oMyxUT0xMRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbmdpIiwgIE9QVE8oMyxUT0xORyksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxuZ2kiLCAgIE9QVE8oMyxUT0xORyksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdndGkiLCAgIE9QVE8oMyxUT0dUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0Z3RpIiwgICAgT1BUTygzLFRPR1QpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3Z2VpIiwgICBPUFRPKDMsVE9HRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGdlaSIsICAgIE9QVE8oMyxUT0dFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d25saSIsICAgT1BUTygzLFRPTkwpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRubGkiLCAgICBPUFRPKDMsVE9OTCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsdGkiLCAgIE9QVE8oMyxUT0xUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bHRpIiwgICAgT1BUTygzLFRPTFQpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bGVpIiwgICBPUFRPKDMsVE9MRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxlaSIsICAgIE9QVE8oMyxUT0xFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d25naSIsICAgT1BUTygzLFRPTkcpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRuZ2kiLCAgICBPUFRPKDMsVE9ORyksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHduZWkiLCAgIE9QVE8oMyxUT05FKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bmVpIiwgICAgT1BUTygzLFRPTkUpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3aSIsICAgICBPUCgzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBUTywgUkEsIFNJIH0gfSwKLXsgInRpIiwgICAgICBPUCgzKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBUTywgUkEsIFNJIH0gfSwKLQoteyAibXVsbGkiLCAgIE9QKDcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAibXVsaSIsICAgIE9QKDcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAotCi17ICJzdWJmaWMiLCAgT1AoOCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJzZmkiLCAgICAgT1AoOCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi0KLXsgImRvemkiLCAgICBPUCg5KSwJT1BfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBTSSB9IH0sCi0KLXsgImNtcGx3aSIsICBPUEwoMTAsMCksCU9QTF9NQVNLLAlQUENDT00sCQl7IE9CRiwgUkEsIFVJIH0gfSwKLXsgImNtcGxkaSIsICBPUEwoMTAsMSksIE9QTF9NQVNLLAlQUEM2NCwJCXsgT0JGLCBSQSwgVUkgfSB9LAoteyAiY21wbGkiLCAgIE9QKDEwKSwJT1BfTUFTSywJUFBDT05MWSwJeyBCRiwgTCwgUkEsIFVJIH0gfSwKLXsgImNtcGxpIiwgICBPUCgxMCksCU9QX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBVSSB9IH0sCi0KLXsgImNtcHdpIiwgICBPUEwoMTEsMCksCU9QTF9NQVNLLAlQUENDT00sCQl7IE9CRiwgUkEsIFNJIH0gfSwKLXsgImNtcGRpIiwgICBPUEwoMTEsMSksCU9QTF9NQVNLLAlQUEM2NCwJCXsgT0JGLCBSQSwgU0kgfSB9LAoteyAiY21waSIsICAgIE9QKDExKSwJT1BfTUFTSywJUFBDT05MWSwJeyBCRiwgTCwgUkEsIFNJIH0gfSwKLXsgImNtcGkiLCAgICBPUCgxMSksCU9QX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBTSSB9IH0sCi0KLXsgImFkZGljIiwgICBPUCgxMiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJhaSIsCSAgICAgT1AoMTIpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAic3ViaWMiLCAgIE9QKDEyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi0KLXsgImFkZGljLiIsICBPUCgxMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJhaS4iLCAgICAgT1AoMTMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAic3ViaWMuIiwgIE9QKDEzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi0KLXsgImxpIiwJICAgICBPUCgxNCksCURSQV9NQVNLLAlQUENDT00sCQl7IFJULCBTSSB9IH0sCi17ICJsaWwiLCAgICAgT1AoMTQpLAlEUkFfTUFTSywJUFdSQ09NLAkJeyBSVCwgU0kgfSB9LAoteyAiYWRkaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgImNhbCIsICAgICBPUCgxNCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLXsgInN1YmkiLCAgICBPUCgxNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAoteyAibGEiLAkgICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsaXMiLCAgICAgT1AoMTUpLAlEUkFfTUFTSywJUFBDQ09NLAkJeyBSVCwgU0lTSUdOT1BUIH0gfSwKLXsgImxpdSIsICAgICBPUCgxNSksCURSQV9NQVNLLAlQV1JDT00sCQl7IFJULCBTSVNJR05PUFQgfSB9LAoteyAiYWRkaXMiLCAgIE9QKDE1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCxSQSxTSVNJR05PUFQgfSB9LAoteyAiY2F1IiwgICAgIE9QKDE1KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCxSQSxTSVNJR05PUFQgfSB9LAoteyAic3ViaXMiLCAgIE9QKDE1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi0KLXsgImJkbnotIiwgICBCQk8oMTYsQk9ETlosMCwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE0gfSB9LAoteyAiYmRueisiLCAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUCB9IH0sCi17ICJiZG56IiwgICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkQgfSB9LAoteyAiYmRuIiwgICAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEIH0gfSwKLXsgImJkbnpsLSIsICBCQk8oMTYsQk9ETlosMCwxKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE0gfSB9LAoteyAiYmRuemwrIiwgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUCB9IH0sCi17ICJiZG56bCIsICAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkQgfSB9LAoteyAiYmRubCIsICAgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEIH0gfSwKLXsgImJkbnphLSIsICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE1BIH0gfSwKLXsgImJkbnphKyIsICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRFBBIH0gfSwKLXsgImJkbnphIiwgICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCREEgfSB9LAoteyAiYmRuYSIsICAgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEQSB9IH0sCi17ICJiZG56bGEtIiwgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNQSB9IH0sCi17ICJiZG56bGErIiwgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQQSB9IH0sCi17ICJiZG56bGEiLCAgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkRBIH0gfSwKLXsgImJkbmxhIiwgICBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBXUkNPTSwJeyBCREEgfSB9LAoteyAiYmR6LSIsICAgIEJCTygxNixCT0RaLDAsMCksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJETSB9IH0sCi17ICJiZHorIiwgICAgQkJPKDE2LEJPRFosMCwwKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQIH0gfSwKLXsgImJkeiIsICAgICBCQk8oMTYsQk9EWiwwLDApLCAgQkJPWUJJX01BU0ssIENPTSwJeyBCRCB9IH0sCi17ICJiZHpsLSIsICAgQkJPKDE2LEJPRFosMCwxKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNIH0gfSwKLXsgImJkemwrIiwgICBCQk8oMTYsQk9EWiwwLDEpLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRFAgfSB9LAoteyAiYmR6bCIsICAgIEJCTygxNixCT0RaLDAsMSksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEIH0gfSwKLXsgImJkemEtIiwgICBCQk8oMTYsQk9EWiwxLDApLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRE1BIH0gfSwKLXsgImJkemErIiwgICBCQk8oMTYsQk9EWiwxLDApLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRFBBIH0gfSwKLXsgImJkemEiLCAgICBCQk8oMTYsQk9EWiwxLDApLCAgQkJPWUJJX01BU0ssIENPTSwJeyBCREEgfSB9LAoteyAiYmR6bGEtIiwgIEJCTygxNixCT0RaLDEsMSksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJETUEgfSB9LAoteyAiYmR6bGErIiwgIEJCTygxNixCT0RaLDEsMSksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUEEgfSB9LAoteyAiYmR6bGEiLCAgIEJCTygxNixCT0RaLDEsMSksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEQSB9IH0sCi17ICJibHQtIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJsdCsiLCAgICBCQk9DQigxNixCT1QsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmx0IiwgICAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJsdGwtIiwgICBCQk9DQigxNixCT1QsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmx0bCsiLCAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibHRsIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmx0YS0iLCAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmx0YSsiLCAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmx0YSIsICAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibHRsYS0iLCAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibHRsYSsiLCAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibHRsYSIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJndC0iLCAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmd0KyIsICAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJiZ3QiLCAgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmd0bC0iLCAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZ3RsKyIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJndGwiLCAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZ3RhLSIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJiZ3RhKyIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJiZ3RhIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJndGxhLSIsICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJndGxhKyIsICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJndGxhIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmVxLSIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZXErIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJlcSIsICAgICBCQk9DQigxNixCT1QsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZXFsLSIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJlcWwrIiwgICBCQk9DQigxNixCT1QsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmVxbCIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJlcWEtIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJlcWErIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJlcWEiLCAgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmVxbGEtIiwgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmVxbGErIiwgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmVxbGEiLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJic28tIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJzbysiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYnNvIiwgICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJzb2wtIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYnNvbCsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJic29sIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYnNvYS0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYnNvYSsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYnNvYSIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJic29sYS0iLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJic29sYSsiLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJic29sYSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJ1bi0iLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYnVuKyIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJidW4iLCAgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkQgfSB9LAoteyAiYnVubC0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJidW5sKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJ1bmwiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCRCB9IH0sCi17ICJidW5hLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJidW5hKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJidW5hIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkRBIH0gfSwKLXsgImJ1bmxhLSIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJ1bmxhKyIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJ1bmxhIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCREEgfSB9LAoteyAiYmdlLSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZ2UrIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJnZSIsICAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZ2VsLSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJnZWwrIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmdlbCIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJnZWEtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJnZWErIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJnZWEiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmdlbGEtIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmdlbGErIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmdlbGEiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmwtIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJubCsiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5sIiwgICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJubGwtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5sbCsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmxsIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5sYS0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5sYSsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5sYSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmxsYS0iLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmxsYSsiLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmxsYSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJsZS0iLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmxlKyIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibGUiLCAgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmxlbC0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibGVsKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJsZWwiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibGVhLSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibGVhKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibGVhIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJsZWxhLSIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJsZWxhKyIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJsZWxhIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5nLSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibmcrIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJuZyIsICAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibmdsLSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJuZ2wrIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5nbCIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuZ2EtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuZ2ErIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuZ2EiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5nbGEtIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5nbGErIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5nbGEiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmUtIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJuZSsiLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5lIiwgICAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuZWwtIiwgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5lbCsiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmVsIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5lYS0iLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5lYSsiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5lYSIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmVsYS0iLCAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmVsYSsiLCAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmVsYSIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJucy0iLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5zKyIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibnMiLCAgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5zbC0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibnNsKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJuc2wiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibnNhLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibnNhKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibnNhIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJuc2xhLSIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuc2xhKyIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuc2xhIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm51LSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibnUrIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJudSIsICAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCRCB9IH0sCi17ICJibnVsLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJudWwrIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm51bCIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEIH0gfSwKLXsgImJudWEtIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJudWErIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJudWEiLCAgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCREEgfSB9LAoteyAiYm51bGEtIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm51bGErIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm51bGEiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEQSB9IH0sCi17ICJiZG56dC0iLCAgQkJPKDE2LEJPRE5aVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNIH0gfSwKLXsgImJkbnp0KyIsICBCQk8oMTYsQk9ETlpULDAsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFAgfSB9LAoteyAiYmRuenQiLCAgIEJCTygxNixCT0ROWlQsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkbnp0bC0iLCBCQk8oMTYsQk9ETlpULDAsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuenRsKyIsIEJCTygxNixCT0ROWlQsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUCB9IH0sCi17ICJiZG56dGwiLCAgQkJPKDE2LEJPRE5aVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuenRhLSIsIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETUEgfSB9LAoteyAiYmRuenRhKyIsIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUEEgfSB9LAoteyAiYmRuenRhIiwgIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZG56dGxhLSIsQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56dGxhKyIsQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56dGxhIiwgQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkbnpmLSIsICBCQk8oMTYsQk9ETlpGLDAsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuemYrIiwgIEJCTygxNixCT0ROWkYsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUCB9IH0sCi17ICJiZG56ZiIsICAgQkJPKDE2LEJPRE5aRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuemZsLSIsIEJCTygxNixCT0ROWkYsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETSB9IH0sCi17ICJiZG56ZmwrIiwgQkJPKDE2LEJPRE5aRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQIH0gfSwKLXsgImJkbnpmbCIsICBCQk8oMTYsQk9ETlpGLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZG56ZmEtIiwgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56ZmErIiwgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56ZmEiLCAgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkbnpmbGEtIixCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE1BIH0gfSwKLXsgImJkbnpmbGErIixCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFBBIH0gfSwKLXsgImJkbnpmbGEiLCBCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYnQtIiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYnQrIiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYnQiLAkgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJidCIsICAgICBCQk8oMTYsQk9ULDAsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJidGwtIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJidGwrIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJidGwiLCAgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmJ0bCIsICAgIEJCTygxNixCT1QsMCwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKLXsgImJ0YS0iLCAgICBCQk8oMTYsQk9ULDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJidGErIiwgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYnRhIiwgICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYnRhIiwgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJ0bGEtIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJidGxhKyIsICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYnRsYSIsICAgIEJCTygxNixCT1QsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYnRsYSIsICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJmLSIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJmKyIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJmIiwJICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiYmYiLCAgICAgQkJPKDE2LEJPRiwwLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmZsLSIsICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmZsKyIsICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmZsIiwgICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJiZmwiLCAgICBCQk8oMTYsQk9GLDAsMSksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZmEtIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmZhKyIsICAgIEJCTygxNixCT0YsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJmYSIsICAgICBCQk8oMTYsQk9GLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmJmYSIsICAgIEJCTygxNixCT0YsMSwwKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZmxhLSIsICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmZsYSsiLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJmbGEiLCAgICBCQk8oMTYsQk9GLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmJmbGEiLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZHp0LSIsICAgQkJPKDE2LEJPRFpULDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJkenQrIiwgICBCQk8oMTYsQk9EWlQsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmR6dCIsICAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmR6dGwtIiwgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZHp0bCsiLCAgQkJPKDE2LEJPRFpULDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJkenRsIiwgICBCQk8oMTYsQk9EWlQsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkenRhLSIsICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJkenRhKyIsICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJkenRhIiwgICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZHp0bGEtIiwgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZHp0bGErIiwgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHp0bGEiLCAgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6Zi0iLCAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZHpmKyIsICAgQkJPKDE2LEJPRFpGLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJkemYiLCAgICBCQk8oMTYsQk9EWkYsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkemZsLSIsICBCQk8oMTYsQk9EWkYsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmR6ZmwrIiwgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJiZHpmbCIsICAgQkJPKDE2LEJPRFpGLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZHpmYS0iLCAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZHpmYSsiLCAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHpmYSIsICAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6ZmxhLSIsIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmR6ZmxhKyIsIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYmR6ZmxhIiwgIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJjLSIsICAgICBCKDE2LDAsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRNIH0gfSwKLXsgImJjKyIsICAgICBCKDE2LDAsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQIH0gfSwKLXsgImJjIiwJICAgICBCKDE2LDAsMCksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCRCB9IH0sCi17ICJiY2wtIiwgICAgQigxNiwwLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJETSB9IH0sCi17ICJiY2wrIiwgICAgQigxNiwwLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJEUCB9IH0sCi17ICJiY2wiLCAgICAgQigxNiwwLDEpLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkQgfSB9LAoteyAiYmNhLSIsICAgIEIoMTYsMSwwKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRE1BIH0gfSwKLXsgImJjYSsiLCAgICBCKDE2LDEsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQQSB9IH0sCi17ICJiY2EiLCAgICAgQigxNiwxLDApLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkRBIH0gfSwKLXsgImJjbGEtIiwgICBCKDE2LDEsMSksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRNQSB9IH0sCi17ICJiY2xhKyIsICAgQigxNiwxLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJEUEEgfSB9LAoteyAiYmNsYSIsICAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEQSB9IH0sCi0KLXsgInNjIiwgICAgICBTQygxNywxLDApLCAweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAoteyAic3ZjIiwgICAgIFNDKDE3LDAsMCksIFNDX01BU0ssCVBPV0VSLAkJeyBMRVYsIEZMMSwgRkwyIH0gfSwKLXsgInN2Y2wiLCAgICBTQygxNywwLDEpLCBTQ19NQVNLLAlQT1dFUiwJCXsgTEVWLCBGTDEsIEZMMiB9IH0sCi17ICJzdmNhIiwgICAgU0MoMTcsMSwwKSwgU0NfTUFTSywJUFdSQ09NLAkJeyBTViB9IH0sCi17ICJzdmNsYSIsICAgU0MoMTcsMSwxKSwgU0NfTUFTSywJUE9XRVIsCQl7IFNWIH0gfSwKLQoteyAiYiIsCSAgICAgQigxOCwwLDApLAlCX01BU0ssCQlDT00sCXsgTEkgfSB9LAoteyAiYmwiLCAgICAgIEIoMTgsMCwxKSwJQl9NQVNLLAkJQ09NLAl7IExJIH0gfSwKLXsgImJhIiwgICAgICBCKDE4LDEsMCksCUJfTUFTSywJCUNPTSwJeyBMSUEgfSB9LAoteyAiYmxhIiwgICAgIEIoMTgsMSwxKSwJQl9NQVNLLAkJQ09NLAl7IExJQSB9IH0sCi0KLXsgIm1jcmYiLCAgICBYTCgxOSwwKSwJWExCQl9NQVNLfCgzPDwyMSl8KDM8PDE2KSwgQ09NLAl7IEJGLCBCRkEgfSB9LAotCi17ICJibHIiLCAgICAgWExPKDE5LEJPVSwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYnIiLCAgICAgIFhMTygxOSxCT1UsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBXUkNPTSwJeyAwIH0gfSwKLXsgImJscmwiLCAgICBYTE8oMTksQk9VLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJicmwiLCAgICAgWExPKDE5LEJPVSwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFdSQ09NLAl7IDAgfSB9LAoteyAiYmRuemxyIiwgIFhMTygxOSxCT0ROWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYmRuemxyLSIsIFhMTygxOSxCT0ROWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmRuemxyKyIsIFhMTygxOSxCT0ROWlAsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkbnpscmwiLCBYTE8oMTksQk9ETlosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkbnpscmwtIixYTE8oMTksQk9ETlosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkbnpscmwrIixYTE8oMTksQk9ETlpQLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJiZHpsciIsICAgWExPKDE5LEJPRFosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkemxyLSIsICBYTE8oMTksQk9EWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmR6bHIrIiwgIFhMTygxOSxCT0RaUCwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmR6bHJsIiwgIFhMTygxOSxCT0RaLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZHpscmwtIiwgWExPKDE5LEJPRFosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkemxybCsiLCBYTE8oMTksQk9EWlAsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJsdGxyIiwgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsdGxyLSIsICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsdGxyKyIsICBYTE9DQigxOSxCT1RQLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibHRyIiwgICAgWExPQ0IoMTksQk9ULENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibHRscmwiLCAgWExPQ0IoMTksQk9ULENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibHRscmwtIiwgWExPQ0IoMTksQk9ULENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibHRscmwrIiwgWExPQ0IoMTksQk9UUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmx0cmwiLCAgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmd0bHIiLCAgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmd0bHItIiwgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmd0bHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJndHIiLCAgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJndGxybCIsICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJndGxybC0iLCBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJndGxybCsiLCBYTE9DQigxOSxCT1RQLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ3RybCIsICAgWExPQ0IoMTksQk9ULENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJiZXFsciIsICAgWExPQ0IoMTksQk9ULENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZXFsci0iLCAgWExPQ0IoMTksQk9ULENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZXFscisiLCAgWExPQ0IoMTksQk9UUCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmVxciIsICAgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHJsIiwgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHJsLSIsIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmVxbHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJlcXJsIiwgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJzb2xyIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJzb2xyLSIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJzb2xyKyIsICBYTE9DQigxOSxCT1RQLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJic29yIiwgICAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJic29scmwiLCAgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJic29scmwtIiwgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJic29scmwrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnNvcmwiLCAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYnVubHIiLCAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYnVubHItIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnVubHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ1bmxybCIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJ1bmxybC0iLCBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ1bmxybCsiLCBYTE9DQigxOSxCT1RQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ2VsciIsICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ2Vsci0iLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ2VscisiLCAgWExPQ0IoMTksQk9GUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmdlciIsICAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHJsIiwgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHJsLSIsIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmdlbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJnZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJubGxyIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJubGxyLSIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJubGxyKyIsICBYTE9DQigxOSxCT0ZQLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmxyIiwgICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmxscmwiLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmxscmwtIiwgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmxscmwrIiwgWExPQ0IoMTksQk9GUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5scmwiLCAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmxlbHIiLCAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmxlbHItIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmxlbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJsZWxybCIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsZWxybCsiLCBYTE9DQigxOSxCT0ZQLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibGVybCIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmdsciIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmdsci0iLCAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmdscisiLCAgWExPQ0IoMTksQk9GUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5nciIsICAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHJsIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHJsLSIsIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5nbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZ3JsIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZWxyKyIsICBYTE9DQigxOSxCT0ZQLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmVyIiwgICAgWExPQ0IoMTksQk9GLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmVscmwiLCAgWExPQ0IoMTksQk9GLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmVscmwtIiwgWExPQ0IoMTksQk9GLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmVscmwrIiwgWExPQ0IoMTksQk9GUCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5lcmwiLCAgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5zbHIiLCAgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5zbHItIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5zbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuc3IiLCAgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuc2xybCIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuc2xybC0iLCBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuc2xybCsiLCBYTE9DQigxOSxCT0ZQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnNybCIsICAgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibnVsciIsICAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibnVsci0iLCAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnVscisiLCAgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm51bHJsIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm51bHJsLSIsIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm51bHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ0bHIiLCAgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0bHItIiwgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJ0bHIrIiwgICBYTE8oMTksQk9UUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiYnRyIiwgICAgWExPKDE5LEJPVCwxNiwwKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCi17ICJidGxybCIsICAgWExPKDE5LEJPVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGxybC0iLCAgWExPKDE5LEJPVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJidGxybCsiLCAgWExPKDE5LEJPVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmJ0cmwiLCAgIFhMTygxOSxCT1QsMTYsMSksIFhMQk9CQl9NQVNLLCBQV1JDT00sCXsgQkkgfSB9LAoteyAiYmZsciIsICAgIFhMTygxOSxCT0YsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmZsci0iLCAgIFhMTygxOSxCT0YsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZscisiLCAgIFhMTygxOSxCT0ZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJiZnIiLCAgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKLXsgImJmbHJsIiwgICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmbHJsLSIsICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJmbHJsKyIsICBYTE8oMTksQk9GUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiYmZybCIsICAgWExPKDE5LEJPRiwxNiwxKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCi17ICJiZG56dGxyIiwgWExPKDE5LEJPRE5aVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZG56dGxyLSIsWExPKDE5LEJPRE5aVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56dGxyKyIsWExPKDE5LEJPRE5aVFAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuenRscmwiLFhMTygxOSxCT0ROWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuenRscmwtIixYTE8oMTksQk9ETlpULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnp0bHJsKyIsWExPKDE5LEJPRE5aVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuemZsciIsIFhMTygxOSxCT0ROWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuemZsci0iLFhMTygxOSxCT0ROWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuemZscisiLFhMTygxOSxCT0ROWkZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnpmbHJsIixYTE8oMTksQk9ETlpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnpmbHJsLSIsWExPKDE5LEJPRE5aRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56ZmxybCsiLFhMTygxOSxCT0ROWkZQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkenRsciIsICBYTE8oMTksQk9EWlQsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6dGxyLSIsIFhMTygxOSxCT0RaVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHp0bHIrIiwgWExPKDE5LEJPRFpUUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHp0bHJsIiwgWExPKDE5LEJPRFpULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkenRscmwtIixYTE8oMTksQk9EWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6dGxybCsiLFhMTygxOSxCT0RaVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6ZmxyIiwgIFhMTygxOSxCT0RaRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHpmbHItIiwgWExPKDE5LEJPRFpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkemZscisiLCBYTE8oMTksQk9EWkZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkemZscmwiLCBYTE8oMTksQk9EWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6ZmxybC0iLFhMTygxOSxCT0RaRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHpmbHJsKyIsWExPKDE5LEJPRFpGUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiY2xyIiwgICAgWExMSygxOSwxNiwwKSwgWExZQkJfTUFTSywJUFBDQ09NLAkJeyBCTywgQkkgfSB9LAoteyAiYmNscmwiLCAgIFhMTEsoMTksMTYsMSksIFhMWUJCX01BU0ssCVBQQ0NPTSwJCXsgQk8sIEJJIH0gfSwKLXsgImJjbHIrIiwgICBYTFlMSygxOSwxNiwxLDApLCBYTFlCQl9NQVNLLCBQUEMsCQl7IEJPRSwgQkkgfSB9LAoteyAiYmNscmwrIiwgIFhMWUxLKDE5LDE2LDEsMSksIFhMWUJCX01BU0ssIFBQQywJCXsgQk9FLCBCSSB9IH0sCi17ICJiY2xyLSIsICAgWExZTEsoMTksMTYsMCwwKSwgWExZQkJfTUFTSywgUFBDLAkJeyBCT0UsIEJJIH0gfSwKLXsgImJjbHJsLSIsICBYTFlMSygxOSwxNiwwLDEpLCBYTFlCQl9NQVNLLCBQUEMsCQl7IEJPRSwgQkkgfSB9LAoteyAiYmNyIiwgICAgIFhMTEsoMTksMTYsMCksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAoteyAiYmNybCIsICAgIFhMTEsoMTksMTYsMSksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAotCi17ICJjcm5vdCIsICAgWEwoMTksMzMpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQSwgQkJBIH0gfSwKLXsgImNybm9yIiwgICBYTCgxOSwzMyksCVhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgInJmaSIsICAgICBYTCgxOSw1MCksCTB4ZmZmZmZmZmYsCUNPTSwJCXsgMCB9IH0sCi17ICJyZmNpIiwgICAgWEwoMTksNTEpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJyZnN2YyIsICAgWEwoMTksODIpLAkweGZmZmZmZmZmLAlQT1dFUiwJCXsgMCB9IH0sCi0KLXsgImNyYW5kYyIsICBYTCgxOSwxMjkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJpc3luYyIsICAgWEwoMTksMTUwKSwgMHhmZmZmZmZmZiwJUFBDQ09NLAkJeyAwIH0gfSwKLXsgImljcyIsICAgICBYTCgxOSwxNTApLCAweGZmZmZmZmZmLAlQV1JDT00sCQl7IDAgfSB9LAotCi17ICJjcmNsciIsICAgWEwoMTksMTkzKSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkFULCBCQkEgfSB9LAoteyAiY3J4b3IiLCAgIFhMKDE5LDE5MyksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImNybmFuZCIsICBYTCgxOSwyMjUpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcmFuZCIsICAgWEwoMTksMjU3KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3JzZXQiLCAgIFhMKDE5LDI4OSksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBVCwgQkJBIH0gfSwKLXsgImNyZXF2IiwgICBYTCgxOSwyODkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcm9yYyIsICAgWEwoMTksNDE3KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3Jtb3ZlIiwgIFhMKDE5LDQ0OSksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBLCBCQkEgfSB9LAoteyAiY3JvciIsICAgIFhMKDE5LDQ0OSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImJjdHIiLCAgICBYTE8oMTksQk9VLDUyOCwwKSwgWExCT0JJQkJfTUFTSywgQ09NLAl7IDAgfSB9LAoteyAiYmN0cmwiLCAgIFhMTygxOSxCT1UsNTI4LDEpLCBYTEJPQklCQl9NQVNLLCBDT00sCXsgMCB9IH0sCi17ICJibHRjdHIiLCAgWExPQ0IoMTksQk9ULENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsdGN0ci0iLCBYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmx0Y3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibHRjdHJsIiwgWExPQ0IoMTksQk9ULENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsdGN0cmwtIixYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmx0Y3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ3RjdHIiLCAgWExPQ0IoMTksQk9ULENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJndGN0ci0iLCBYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmd0Y3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ3RjdHJsIiwgWExPQ0IoMTksQk9ULENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJndGN0cmwtIixYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmd0Y3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZXFjdHIiLCAgWExPQ0IoMTksQk9ULENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJlcWN0ci0iLCBYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmVxY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JFUSw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZXFjdHJsIiwgWExPQ0IoMTksQk9ULENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJlcWN0cmwtIixYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmVxY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JFUSw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJic29jdHIiLCAgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJzb2N0ci0iLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnNvY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJic29jdHJsIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJzb2N0cmwtIixYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnNvY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidW5jdHIiLCAgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJ1bmN0ci0iLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnVuY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidW5jdHJsIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJ1bmN0cmwtIixYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnVuY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ2VjdHIiLCAgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJnZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmdlY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ2VjdHJsIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJnZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmdlY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmxjdHIiLCAgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJubGN0ci0iLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5sY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmxjdHJsIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJubGN0cmwtIixYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5sY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibGVjdHIiLCAgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmxlY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibGVjdHJsIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmxlY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmdjdHIiLCAgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZ2N0ci0iLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5nY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmdjdHJsIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZ2N0cmwtIixYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5nY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmVjdHIiLCAgWExPQ0IoMTksQk9GLENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5lY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JFUSw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmVjdHJsIiwgWExPQ0IoMTksQk9GLENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5lY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JFUSw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnNjdHIiLCAgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuc2N0ci0iLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5zY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnNjdHJsIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuc2N0cmwtIixYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5zY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnVjdHIiLCAgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJudWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm51Y3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnVjdHJsIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJudWN0cmwtIixYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm51Y3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidGN0ciIsICAgWExPKDE5LEJPVCw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0Y3RyLSIsICBYTE8oMTksQk9ULDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYnRjdHIrIiwgIFhMTygxOSxCT1RQLDUyOCwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJidGN0cmwiLCAgWExPKDE5LEJPVCw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0Y3RybC0iLCBYTE8oMTksQk9ULDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYnRjdHJsKyIsIFhMTygxOSxCT1RQLDUyOCwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmN0ciIsICAgWExPKDE5LEJPRiw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmY3RyLSIsICBYTE8oMTksQk9GLDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZjdHIrIiwgIFhMTygxOSxCT0ZQLDUyOCwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmN0cmwiLCAgWExPKDE5LEJPRiw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmY3RybC0iLCBYTE8oMTksQk9GLDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZjdHJsKyIsIFhMTygxOSxCT0ZQLDUyOCwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiY2N0ciIsICAgWExMSygxOSw1MjgsMCksICAgICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPLCBCSSB9IH0sCi17ICJiY2N0ci0iLCAgWExZTEsoMTksNTI4LDAsMCksICBYTFlCQl9NQVNLLCAgUFBDLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjdHIrIiwgIFhMWUxLKDE5LDUyOCwxLDApLCAgWExZQkJfTUFTSywgIFBQQywJeyBCT0UsIEJJIH0gfSwKLXsgImJjY3RybCIsICBYTExLKDE5LDUyOCwxKSwgICAgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk8sIEJJIH0gfSwKLXsgImJjY3RybC0iLCBYTFlMSygxOSw1MjgsMCwxKSwgIFhMWUJCX01BU0ssICBQUEMsCXsgQk9FLCBCSSB9IH0sCi17ICJiY2N0cmwrIiwgWExZTEsoMTksNTI4LDEsMSksICBYTFlCQl9NQVNLLCAgUFBDLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjIiwgICAgIFhMTEsoMTksNTI4LDApLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAoteyAiYmNjbCIsICAgIFhMTEsoMTksNTI4LDEpLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAotCi17ICJybHdpbWkiLCAgTSgyMCwwKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicmxpbWkiLCAgIE0oMjAsMCksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLQoteyAicmx3aW1pLiIsIE0oMjAsMSksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW1pLiIsICBNKDIwLDEpLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi0KLXsgInJvdGx3aSIsICBNTUUoMjEsMzEsMCksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJjbHJsd2kiLCAgTU1FKDIxLDMxLDApLCBNU0hNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgTUIgfSB9LAoteyAicmx3aW5tIiwgIE0oMjEsMCksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW5tIiwgICBNKDIxLDApLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi17ICJyb3Rsd2kuIiwgTU1FKDIxLDMxLDEpLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLFJTLFNIIH0gfSwKLXsgImNscmx3aS4iLCBNTUUoMjEsMzEsMSksIE1TSE1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBNQiB9IH0sCi17ICJybHdpbm0uIiwgTSgyMSwxKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicmxpbm0uIiwgIE0oMjEsMSksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLQoteyAicmxtaSIsICAgIE0oMjIsMCksCU1fTUFTSywJCU02MDEsCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJybG1pLiIsICAgTSgyMiwxKSwJTV9NQVNLLAkJTTYwMSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLQoteyAicm90bHciLCAgIE1NRSgyMywzMSwwKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsd25tIiwgICBNKDIzLDApLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJybG5tIiwgICAgTSgyMywwKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAoteyAicm90bHcuIiwgIE1NRSgyMywzMSwxKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsd25tLiIsICBNKDIzLDEpLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJybG5tLiIsICAgTSgyMywxKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAotCi17ICJub3AiLCAgICAgT1AoMjQpLAkweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAib3JpIiwgICAgIE9QKDI0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgIm9yaWwiLCAgICBPUCgyNCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgIm9yaXMiLCAgICBPUCgyNSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJvcml1IiwgICAgT1AoMjUpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJ4b3JpIiwgICAgT1AoMjYpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAieG9yaWwiLCAgIE9QKDI2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAieG9yaXMiLCAgIE9QKDI3KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgInhvcml1IiwgICBPUCgyNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgImFuZGkuIiwgICBPUCgyOCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJhbmRpbC4iLCAgT1AoMjgpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJhbmRpcy4iLCAgT1AoMjkpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAiYW5kaXUuIiwgIE9QKDI5KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAicm90bGRpIiwgIE1EKDMwLDAsMCksIE1ETUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKLXsgImNscmxkaSIsICBNRCgzMCwwLDApLCBNRFNIX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIE1CNiB9IH0sCi17ICJybGRpY2wiLCAgTUQoMzAsMCwwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAoteyAicm90bGRpLiIsIE1EKDMwLDAsMSksIE1ETUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKLXsgImNscmxkaS4iLCBNRCgzMCwwLDEpLCBNRFNIX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIE1CNiB9IH0sCi17ICJybGRpY2wuIiwgTUQoMzAsMCwxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAotCi17ICJybGRpY3IiLCAgTUQoMzAsMSwwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNRTYgfSB9LAoteyAicmxkaWNyLiIsIE1EKDMwLDEsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUU2IH0gfSwKLQoteyAicmxkaWMiLCAgIE1EKDMwLDIsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLXsgInJsZGljLiIsICBNRCgzMCwyLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi0KLXsgInJsZGltaSIsICBNRCgzMCwzLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi17ICJybGRpbWkuIiwgTUQoMzAsMywxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAotCi17ICJyb3RsZCIsICAgTURTKDMwLDgsMCksIE1EU01CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsZGNsIiwgICBNRFMoMzAsOCwwKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNQjYgfSB9LAoteyAicm90bGQuIiwgIE1EUygzMCw4LDEpLCBNRFNNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJybGRjbC4iLCAgTURTKDMwLDgsMSksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUI2IH0gfSwKLQoteyAicmxkY3IiLCAgIE1EUygzMCw5LDApLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1FNiB9IH0sCi17ICJybGRjci4iLCAgTURTKDMwLDksMSksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUU2IH0gfSwKLQoteyAiY21wdyIsICAgIFhDTVBMKDMxLDAsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wZCIsICAgIFhDTVBMKDMxLDAsMSksIFhDTVBMX01BU0ssIFBQQzY0LAkJeyBPQkYsIFJBLCBSQiB9IH0sCi17ICJjbXAiLCAgICAgWCgzMSwwKSwJWENNUF9NQVNLLAlQUENPTkxZLAl7IEJGLCBMLCBSQSwgUkIgfSB9LAoteyAiY21wIiwgICAgIFgoMzEsMCksCVhDTVBMX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBSQiB9IH0sCi0KLXsgInR3bGd0IiwgICBYVE8oMzEsNCxUT0xHVCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGd0IiwgICAgWFRPKDMxLDQsVE9MR1QpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsbHQiLCAgIFhUTygzMSw0LFRPTExUKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsbHQiLCAgICBYVE8oMzEsNCxUT0xMVCksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2VxIiwgICAgWFRPKDMxLDQsVE9FUSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZXEiLCAgICAgWFRPKDMxLDQsVE9FUSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xnZSIsICAgWFRPKDMxLDQsVE9MR0UpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxnZSIsICAgIFhUTygzMSw0LFRPTEdFKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bG5sIiwgICBYVE8oMzEsNCxUT0xOTCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bG5sIiwgICAgWFRPKDMxLDQsVE9MTkwpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsbGUiLCAgIFhUTygzMSw0LFRPTExFKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsbGUiLCAgICBYVE8oMzEsNCxUT0xMRSksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xuZyIsICAgWFRPKDMxLDQsVE9MTkcpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxuZyIsICAgIFhUTygzMSw0LFRPTE5HKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3Z3QiLCAgICBYVE8oMzEsNCxUT0dUKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRndCIsICAgICBYVE8oMzEsNCxUT0dUKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3Z2UiLCAgICBYVE8oMzEsNCxUT0dFKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRnZSIsICAgICBYVE8oMzEsNCxUT0dFKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bmwiLCAgICBYVE8oMzEsNCxUT05MKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRubCIsICAgICBYVE8oMzEsNCxUT05MKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bHQiLCAgICBYVE8oMzEsNCxUT0xUKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsdCIsICAgICBYVE8oMzEsNCxUT0xUKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bGUiLCAgICBYVE8oMzEsNCxUT0xFKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsZSIsICAgICBYVE8oMzEsNCxUT0xFKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bmciLCAgICBYVE8oMzEsNCxUT05HKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRuZyIsICAgICBYVE8oMzEsNCxUT05HKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bmUiLCAgICBYVE8oMzEsNCxUT05FKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRuZSIsICAgICBYVE8oMzEsNCxUT05FKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRyYXAiLCAgICBYVE8oMzEsNCxUT1UpLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAidHciLCAgICAgIFgoMzEsNCksCVhfTUFTSywJCVBQQ0NPTSwJCXsgVE8sIFJBLCBSQiB9IH0sCi17ICJ0IiwgICAgICAgWCgzMSw0KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBUTywgUkEsIFJCIH0gfSwKLQoteyAic3ViZmMiLCAgIFhPKDMxLDgsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmIiwgICAgICBYTygzMSw4LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjIiwgICAgWE8oMzEsOCwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZmMuIiwgIFhPKDMxLDgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmLiIsICAgICBYTygzMSw4LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjLiIsICAgWE8oMzEsOCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZmNvIiwgIFhPKDMxLDgsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmbyIsICAgICBYTygzMSw4LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjbyIsICAgWE8oMzEsOCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZmNvLiIsIFhPKDMxLDgsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmby4iLCAgICBYTygzMSw4LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjby4iLCAgWE8oMzEsOCwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAotCi17ICJtdWxoZHUiLCAgWE8oMzEsOSwwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxoZHUuIiwgWE8oMzEsOSwwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZGMiLCAgICBYTygzMSwxMCwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYSIsICAgICAgIFhPKDMxLDEwLDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRjLiIsICAgWE8oMzEsMTAsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImEuIiwgICAgICBYTygzMSwxMCwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkY28iLCAgIFhPKDMxLDEwLDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhbyIsICAgICAgWE8oMzEsMTAsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGNvLiIsICBYTygzMSwxMCwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYW8uIiwgICAgIFhPKDMxLDEwLDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm11bGh3dSIsICBYTygzMSwxMSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsaHd1LiIsIFhPKDMxLDExLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm1mY3IiLCAgICBYKDMxLDE5KSwJWFJBUkJfTUFTSywJQ09NLAkJeyBSVCB9IH0sCi0KLXsgImx3YXJ4IiwgICBYKDMxLDIwKSwJWF9NQVNLLAkJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibGR4IiwgICAgIFgoMzEsMjEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImx3engiLCAgICBYKDMxLDIzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImx4IiwgICAgICBYKDMxLDIzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic2x3IiwgICAgIFhSQygzMSwyNCwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2wiLCAgICAgIFhSQygzMSwyNCwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2x3LiIsICAgIFhSQygzMSwyNCwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2wuIiwgICAgIFhSQygzMSwyNCwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJjbnRsenciLCAgWFJDKDMxLDI2LDApLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiY250bHoiLCAgIFhSQygzMSwyNiwwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImNudGx6dy4iLCBYUkMoMzEsMjYsMSksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJjbnRsei4iLCAgWFJDKDMxLDI2LDEpLCBYUkJfTUFTSywgCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLQoteyAic2xkIiwgICAgIFhSQygzMSwyNywwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbGQuIiwgICAgWFJDKDMxLDI3LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiYW5kIiwgICAgIFhSQygzMSwyOCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAiYW5kLiIsICAgIFhSQygzMSwyOCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtYXNrZyIsICAgWFJDKDMxLDI5LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibWFza2cuIiwgIFhSQygzMSwyOSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiY21wbHciLCAgIFhDTVBMKDMxLDMyLDApLCBYQ01QTF9NQVNLLCBQUENDT00sCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wbGQiLCAgIFhDTVBMKDMxLDMyLDEpLCBYQ01QTF9NQVNLLCBQUEM2NCwJCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wbCIsICAgIFgoMzEsMzIpLAlYQ01QX01BU0ssCSBQUENPTkxZLAl7IEJGLCBMLCBSQSwgUkIgfSB9LAoteyAiY21wbCIsICAgIFgoMzEsMzIpLAlYQ01QTF9NQVNLLAkgUFdSQ09NLAl7IEJGLCBSQSwgUkIgfSB9LAotCi17ICJzdWJmIiwgICAgWE8oMzEsNDAsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YiIsICAgICBYTygzMSw0MCwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZi4iLCAgIFhPKDMxLDQwLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWIuIiwgICAgWE8oMzEsNDAsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZvIiwgICBYTygzMSw0MCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3VibyIsICAgIFhPKDMxLDQwLDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi17ICJzdWJmby4iLCAgWE8oMzEsNDAsMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1Ym8uIiwgICBYTygzMSw0MCwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAotCi17ICJsZHV4IiwgICAgWCgzMSw1MyksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgImRjYnN0IiwgICBYKDMxLDU0KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibHd6dXgiLCAgIFgoMzEsNTUpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLXsgImx1eCIsICAgICBYKDMxLDU1KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiY250bHpkIiwgIFhSQygzMSw1OCwwKSwgWFJCX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMgfSB9LAoteyAiY250bHpkLiIsIFhSQygzMSw1OCwxKSwgWFJCX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMgfSB9LAotCi17ICJhbmRjIiwgICAgWFJDKDMxLDYwLDApLCBYX01BU0ssCUNPTSwJeyBSQSwgUlMsIFJCIH0gfSwKLXsgImFuZGMuIiwgICBYUkMoMzEsNjAsMSksIFhfTUFTSywJQ09NLAl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ0ZGxndCIsICAgWFRPKDMxLDY4LFRPTEdUKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsbHQiLCAgIFhUTygzMSw2OCxUT0xMVCksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkZXEiLCAgICBYVE8oMzEsNjgsVE9FUSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxnZSIsICAgWFRPKDMxLDY4LFRPTEdFKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsbmwiLCAgIFhUTygzMSw2OCxUT0xOTCksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbGxlIiwgICBYVE8oMzEsNjgsVE9MTEUpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxuZyIsICAgWFRPKDMxLDY4LFRPTE5HKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRndCIsICAgIFhUTygzMSw2OCxUT0dUKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkZ2UiLCAgICBYVE8oMzEsNjgsVE9HRSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZG5sIiwgICAgWFRPKDMxLDY4LFRPTkwpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsdCIsICAgIFhUTygzMSw2OCxUT0xUKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbGUiLCAgICBYVE8oMzEsNjgsVE9MRSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZG5nIiwgICAgWFRPKDMxLDY4LFRPTkcpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRuZSIsICAgIFhUTygzMSw2OCxUT05FKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkIiwJICAgICBYKDMxLDY4KSwJWF9NQVNLLAkJIFBQQzY0LAkJeyBUTywgUkEsIFJCIH0gfSwKLQoteyAibXVsaGQiLCAgIFhPKDMxLDczLDAsMCksIFhPX01BU0ssCSBQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxoZC4iLCAgWE8oMzEsNzMsMCwxKSwgWE9fTUFTSywJIFBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXVsaHciLCAgIFhPKDMxLDc1LDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxody4iLCAgWE8oMzEsNzUsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibWZtc3IiLCAgIFgoMzEsODMpLAlYUkFSQl9NQVNLLAlDT00sCQl7IFJUIH0gfSwKLQoteyAibGRhcngiLCAgIFgoMzEsODQpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjYmYiLCAgICBYKDMxLDg2KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibGJ6eCIsICAgIFgoMzEsODcpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJuZWciLCAgICAgWE8oMzEsMTA0LDAsMCksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAibmVnLiIsICAgIFhPKDMxLDEwNCwwLDEpLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5lZ28iLCAgICBYTygzMSwxMDQsMSwwKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCi17ICJuZWdvLiIsICAgWE8oMzEsMTA0LDEsMSksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtdWwiLCAgICAgWE8oMzEsMTA3LDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsLiIsICAgIFhPKDMxLDEwNywwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bG8iLCAgICBYTygzMSwxMDcsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxvLiIsICAgWE8oMzEsMTA3LDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJjbGYiLCAgICAgWCgzMSwxMTgpLCBYUkJfTUFTSywJUE9XRVIsCQl7IFJULCBSQSB9IH0sCi0KLXsgImxienV4IiwgICBYKDMxLDExOSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJub3QiLCAgICAgWFJDKDMxLDEyNCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKLXsgIm5vciIsICAgICBYUkMoMzEsMTI0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJub3QuIiwgICAgWFJDKDMxLDEyNCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKLXsgIm5vci4iLCAgICBYUkMoMzEsMTI0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIndydGVlIiwgICBYKDMxLDEzMSksCVhSQVJCX01BU0ssCVBQQzQwMywJCXsgUlMgfSB9LAotCi17ICJzdWJmZSIsICAgWE8oMzEsMTM2LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmUiLCAgICAgWE8oMzEsMTM2LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJmZS4iLCAgWE8oMzEsMTM2LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmUuIiwgICAgWE8oMzEsMTM2LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJmZW8iLCAgWE8oMzEsMTM2LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmVvIiwgICAgWE8oMzEsMTM2LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJmZW8uIiwgWE8oMzEsMTM2LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmVvLiIsICAgWE8oMzEsMTM2LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZGUiLCAgICBYTygzMSwxMzgsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlIiwgICAgICBYTygzMSwxMzgsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGUuIiwgICBYTygzMSwxMzgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlLiIsICAgICBYTygzMSwxMzgsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGVvIiwgICBYTygzMSwxMzgsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlbyIsICAgICBYTygzMSwxMzgsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGVvLiIsICBYTygzMSwxMzgsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlby4iLCAgICBYTygzMSwxMzgsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXRjciIsICAgIFhGWE0oMzEsMTQ0LDB4ZmYpLCBYRlhGWE1fTUFTS3xGWE1fTUFTSywgQ09NLAl7IFJTIH19LAoteyAibXRjcmYiLCAgIFgoMzEsMTQ0KSwJWEZYRlhNX01BU0ssCUNPTSwJCXsgRlhNLCBSUyB9IH0sCi0KLXsgIm10bXNyIiwgICBYKDMxLDE0NiksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlMgfSB9LAotCi17ICJzdGR4IiwgICAgWCgzMSwxNDkpLCBYX01BU0ssCQlQUEM2NCwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0d2N4LiIsICBYUkMoMzEsMTUwLDEpLCBYX01BU0ssCVBQQywJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0d3giLCAgICBYKDMxLDE1MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi17ICJzdHgiLCAgICAgWCgzMSwxNTEpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzbHEiLCAgICAgWFJDKDMxLDE1MiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNscS4iLCAgICBYUkMoMzEsMTUyLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzbGUiLCAgICAgWFJDKDMxLDE1MywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsZS4iLCAgICBYUkMoMzEsMTUzLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ3cnRlZWkiLCAgWCgzMSwxNjMpLAlYRV9NQVNLLAlQUEM0MDMsCQl7IEUgfSB9LAotCi17ICJzdGR1eCIsICAgWCgzMSwxODEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlMsIFJBUywgUkIgfSB9LAotCi17ICJzdHd1eCIsICAgWCgzMSwxODMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKLXsgInN0dXgiLCAgICBYKDMxLDE4MyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNsaXEiLCAgICBYUkMoMzEsMTg0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic2xpcS4iLCAgIFhSQygzMSwxODQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgInN1YmZ6ZSIsICBYTygzMSwyMDAsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZnplIiwgICAgWE8oMzEsMjAwLDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZnplLiIsIFhPKDMxLDIwMCwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmemUuIiwgICBYTygzMSwyMDAsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmemVvIiwgWE8oMzEsMjAwLDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2Z6ZW8iLCAgIFhPKDMxLDIwMCwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZ6ZW8uIixYTygzMSwyMDAsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZnplby4iLCAgWE8oMzEsMjAwLDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJhZGR6ZSIsICAgWE8oMzEsMjAyLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYXplIiwgICAgIFhPKDMxLDIwMiwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZHplLiIsICBYTygzMSwyMDIsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhemUuIiwgICAgWE8oMzEsMjAyLDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkemVvIiwgIFhPKDMxLDIwMiwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImF6ZW8iLCAgICBYTygzMSwyMDIsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGR6ZW8uIiwgWE8oMzEsMjAyLDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYXplby4iLCAgIFhPKDMxLDIwMiwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibXRzciIsICAgIFgoMzEsMjEwKSwJWFJCX01BU0t8KDE8PDIwKSwgQ09NMzIsCXsgU1IsIFJTIH0gfSwKLQoteyAic3RkY3guIiwgIFhSQygzMSwyMTQsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdGJ4IiwgICAgWCgzMSwyMTUpLAlYX01BU0ssCQlDT00sCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNsbHEiLCAgICBYUkMoMzEsMjE2LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xscS4iLCAgIFhSQygzMSwyMTYsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNsZXEiLCAgICBYUkMoMzEsMjE3LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xlcS4iLCAgIFhSQygzMSwyMTcsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInN1YmZtZSIsICBYTygzMSwyMzIsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZm1lIiwgICAgWE8oMzEsMjMyLDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZm1lLiIsIFhPKDMxLDIzMiwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmbWUuIiwgICBYTygzMSwyMzIsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmbWVvIiwgWE8oMzEsMjMyLDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2ZtZW8iLCAgIFhPKDMxLDIzMiwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZtZW8uIixYTygzMSwyMzIsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZm1lby4iLCAgWE8oMzEsMjMyLDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtdWxsZCIsICAgWE8oMzEsMjMzLDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGxkLiIsICBYTygzMSwyMzMsMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbGRvIiwgIFhPKDMxLDIzMywxLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsZG8uIiwgWE8oMzEsMjMzLDEsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiYWRkbWUiLCAgIFhPKDMxLDIzNCwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFtZSIsICAgICBYTygzMSwyMzQsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGRtZS4iLCAgWE8oMzEsMjM0LDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYW1lLiIsICAgIFhPKDMxLDIzNCwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZG1lbyIsICBYTygzMSwyMzQsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhbWVvIiwgICAgWE8oMzEsMjM0LDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkbWVvLiIsIFhPKDMxLDIzNCwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFtZW8uIiwgICBYTygzMSwyMzQsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi0KLXsgIm11bGx3IiwgICBYTygzMSwyMzUsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHMiLCAgICBYTygzMSwyMzUsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGx3LiIsICBYTygzMSwyMzUsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHMuIiwgICBYTygzMSwyMzUsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGx3byIsICBYTygzMSwyMzUsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHNvIiwgICBYTygzMSwyMzUsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGx3by4iLCBYTygzMSwyMzUsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHNvLiIsICBYTygzMSwyMzUsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXRzcmluIiwgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBQQzMyLAkJeyBSUywgUkIgfSB9LAoteyAibXRzcmkiLCAgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBPV0VSMzIsCXsgUlMsIFJCIH0gfSwKLQoteyAiZGNidHN0IiwgIFgoMzEsMjQ2KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAic3RidXgiLCAgIFgoMzEsMjQ3KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkFTLCBSQiB9IH0sCi0KLXsgInNsbGlxIiwgICBYUkMoMzEsMjQ4LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic2xsaXEuIiwgIFhSQygzMSwyNDgsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImRveiIsICAgICBYTygzMSwyNjQsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkb3ouIiwgICAgWE8oMzEsMjY0LDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZG96byIsICAgIFhPKDMxLDI2NCwxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRvem8uIiwgICBYTygzMSwyNjQsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZCIsICAgICBYTygzMSwyNjYsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheCIsICAgICBYTygzMSwyNjYsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZC4iLCAgICBYTygzMSwyNjYsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheC4iLCAgICBYTygzMSwyNjYsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZG8iLCAgICBYTygzMSwyNjYsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheG8iLCAgICBYTygzMSwyNjYsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZG8uIiwgICBYTygzMSwyNjYsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheG8uIiwgICBYTygzMSwyNjYsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibHNjYngiLCAgIFhSQygzMSwyNzcsMCksIFhfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJsc2NieC4iLCAgWFJDKDMxLDI3NywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGNidCIsICAgIFgoMzEsMjc4KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibGh6eCIsICAgIFgoMzEsMjc5KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiaWNidCIsICAgIFgoMzEsMjYyKSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAiZXF2IiwgICAgIFhSQygzMSwyODQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgImVxdi4iLCAgICBYUkMoMzEsMjg0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInRsYmllIiwgICBYKDMxLDMwNiksCVhSVFJBX01BU0ssCVBQQywJCXsgUkIgfSB9LAoteyAidGxiaSIsICAgIFgoMzEsMzA2KSwJWFJUX01BU0ssCVBPV0VSLAkJeyBSQSwgUkIgfSB9LAotCi17ICJlY2l3eCIsICAgWCgzMSwzMTApLCBYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsaHp1eCIsICAgWCgzMSwzMTEpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLQoteyAieG9yIiwgICAgIFhSQygzMSwzMTYsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInhvci4iLCAgICBYUkMoMzEsMzE2LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIm1mZXhpc3IiLCBYU1BSKDMxLDMyMyw2NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZXhpZXIiLCBYU1BSKDMxLDMyMyw2NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnIwIiwgICBYU1BSKDMxLDMyMywxMjgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyMSIsICAgWFNQUigzMSwzMjMsMTI5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjIiLCAgIFhTUFIoMzEsMzIzLDEzMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnIzIiwgICBYU1BSKDMxLDMyMywxMzEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyNCIsICAgWFNQUigzMSwzMjMsMTMyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjUiLCAgIFhTUFIoMzEsMzIzLDEzMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnI2IiwgICBYU1BSKDMxLDMyMywxMzQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyNyIsICAgWFNQUigzMSwzMjMsMTM1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZiZWFyIiwgIFhTUFIoMzEsMzIzLDE0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYmVzciIsICBYU1BSKDMxLDMyMywxNDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmlvY3IiLCAgWFNQUigzMSwzMjMsMTYwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjcjAiLCBYU1BSKDMxLDMyMywxOTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWN0MCIsIFhTUFIoMzEsMzIzLDE5MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hZGEwIiwgWFNQUigzMSwzMjMsMTk0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzYTAiLCBYU1BSKDMxLDMyMywxOTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNjMCIsIFhTUFIoMzEsMzIzLDE5NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3IxIiwgWFNQUigzMSwzMjMsMjAwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjdDEiLCBYU1BSKDMxLDMyMywyMDEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWRhMSIsIFhTUFIoMzEsMzIzLDIwMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc2ExIiwgWFNQUigzMSwzMjMsMjAzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjYzEiLCBYU1BSKDMxLDMyMywyMDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNyMiIsIFhTUFIoMzEsMzIzLDIwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3QyIiwgWFNQUigzMSwzMjMsMjA5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFkYTIiLCBYU1BSKDMxLDMyMywyMTApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYXNhMiIsIFhTUFIoMzEsMzIzLDIxMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY2MyIiwgWFNQUigzMSwzMjMsMjEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjcjMiLCBYU1BSKDMxLDMyMywyMTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWN0MyIsIFhTUFIoMzEsMzIzLDIxNyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hZGEzIiwgWFNQUigzMSwzMjMsMjE4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzYTMiLCBYU1BSKDMxLDMyMywyMTkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNjMyIsIFhTUFIoMzEsMzIzLDIyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc3IiLCBYU1BSKDMxLDMyMywyMjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRjciIsICAgWCgzMSwzMjMpLAlYX01BU0ssCQlQUEMsCQl7IFJULCBTUFIgfSB9LAotCi17ICJkaXYiLCAgICAgWE8oMzEsMzMxLDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2LiIsICAgIFhPKDMxLDMzMSwwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdm8iLCAgICBYTygzMSwzMzEsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZvLiIsICAgWE8oMzEsMzMxLDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtZm1xIiwgICAgIFhTUFIoMzEsMzM5LDApLCAgIFhTUFJfTUFTSywgTTYwMSwJeyBSVCB9IH0sCi17ICJtZnhlciIsICAgIFhTUFIoMzEsMzM5LDEpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnJ0Y3UiLCAgIFhTUFIoMzEsMzM5LDQpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnJ0Y2wiLCAgIFhTUFIoMzEsMzM5LDUpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmRlYyIsICAgIFhTUFIoMzEsMzM5LDYpLCAgIFhTUFJfTUFTSywgTUZERUMxLAl7IFJUIH0gfSwKLXsgIm1mbHIiLCAgICAgWFNQUigzMSwzMzksOCksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mY3RyIiwgICAgWFNQUigzMSwzMzksOSksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mdGlkIiwgICAgWFNQUigzMSwzMzksMTcpLCAgWFNQUl9NQVNLLCBQT1dFUiwJeyBSVCB9IH0sCi17ICJtZmRzaXNyIiwgIFhTUFIoMzEsMzM5LDE4KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmRhciIsICAgIFhTUFIoMzEsMzM5LDE5KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmRlYyIsICAgIFhTUFIoMzEsMzM5LDIyKSwgIFhTUFJfTUFTSywgTUZERUMyLAl7IFJUIH0gfSwKLXsgIm1mc2RyMCIsICAgWFNQUigzMSwzMzksMjQpLCAgWFNQUl9NQVNLLCBQT1dFUiwJeyBSVCB9IH0sCi17ICJtZnNkcjEiLCAgIFhTUFIoMzEsMzM5LDI1KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnNycjAiLCAgIFhTUFIoMzEsMzM5LDI2KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnNycjEiLCAgIFhTUFIoMzEsMzM5LDI3KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmNtcGEiLCAgIFhTUFIoMzEsMzM5LDE0NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wYiIsICAgWFNQUigzMSwzMzksMTQ1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBjIiwgICBYU1BSKDMxLDMzOSwxNDYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGQiLCAgIFhTUFIoMzEsMzM5LDE0NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maWNyIiwgICAgWFNQUigzMSwzMzksMTQ4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkZXIiLCAgICBYU1BSKDMxLDMzOSwxNDkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNvdW50YSIsIFhTUFIoMzEsMzM5LDE1MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY291bnRiIiwgWFNQUigzMSwzMzksMTUxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBlIiwgICBYU1BSKDMxLDMzOSwxNTIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGYiLCAgIFhTUFIoMzEsMzM5LDE1MyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wZyIsICAgWFNQUigzMSwzMzksMTU0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBoIiwgICBYU1BSKDMxLDMzOSwxNTUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmxjdHJsMSIsIFhTUFIoMzEsMzM5LDE1NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbGN0cmwyIiwgWFNQUigzMSwzMzksMTU3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZpY3RybCIsICBYU1BSKDMxLDMzOSwxNTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmJhciIsICAgIFhTUFIoMzEsMzM5LDE1OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mc3ByZyIsICAgWFNQUigzMSwzMzksMjcyKSwgWFNQUkdfTUFTSywgUFBDLAl7IFJULCBTUFJHIH0gfSwKLXsgIm1mc3ByZzAiLCAgWFNQUigzMSwzMzksMjcyKSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mc3ByZzEiLCAgWFNQUigzMSwzMzksMjczKSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mc3ByZzIiLCAgWFNQUigzMSwzMzksMjc0KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mc3ByZzMiLCAgWFNQUigzMSwzMzksMjc1KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mYXNyIiwgICAgWFNQUigzMSwzMzksMjgwKSwgWFNQUl9NQVNLLCBQUEM2NCwJeyBSVCB9IH0sCi17ICJtZmVhciIsICAgIFhTUFIoMzEsMzM5LDI4MiksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnB2ciIsICAgIFhTUFIoMzEsMzM5LDI4NyksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZmliYXR1IiwgIFhTUFIoMzEsMzM5LDUyOCksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoteyAibWZpYmF0bCIsICBYU1BSKDMxLDMzOSw1MjkpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKLXsgIm1mZGJhdHUiLCAgWFNQUigzMSwzMzksNTM2KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCi17ICJtZmRiYXRsIiwgIFhTUFIoMzEsMzM5LDUzNyksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoteyAibWZpY19jc3QiLCBYU1BSKDMxLDMzOSw1NjApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmljX2FkciIsIFhTUFIoMzEsMzM5LDU2MSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maWNfZGF0IiwgWFNQUigzMSwzMzksNTYyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkY19jc3QiLCBYU1BSKDMxLDMzOSw1NjgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRjX2FkciIsIFhTUFIoMzEsMzM5LDU2OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZGNfZGF0IiwgWFNQUigzMSwzMzksNTcwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkcGRyIiwgICBYU1BSKDMxLDMzOSw2MzApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRwaXIiLCAgIFhTUFIoMzEsMzM5LDYzMSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maW1tciIsICAgWFNQUigzMSwzMzksNjM4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9jdHIiLCBYU1BSKDMxLDMzOSw3ODQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2FwIiwgIFhTUFIoMzEsMzM5LDc4NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfZXBuIiwgWFNQUigzMSwzMzksNzg3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV90d2MiLCBYU1BSKDMxLDMzOSw3ODkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX3JwbiIsIFhTUFIoMzEsMzM5LDc5MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfY3RyIiwgWFNQUigzMSwzMzksNzkyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtX2Nhc2lkIixYU1BSKDMxLDMzOSw3OTMpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2FwIiwgIFhTUFIoMzEsMzM5LDc5NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfZXBuIiwgWFNQUigzMSwzMzksNzk1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF90d2IiLCBYU1BSKDMxLDMzOSw3OTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX3R3YyIsIFhTUFIoMzEsMzM5LDc5NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfcnBuIiwgWFNQUigzMSwzMzksNzk4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtX3R3IiwgICBYU1BSKDMxLDMzOSw3OTkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2RiY2FtIixYU1BSKDMxLDMzOSw4MTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2RicmFtMCIsWFNQUigzMSwzMzksODE3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9kYnJhbTEiLFhTUFIoMzEsMzM5LDgxOCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfZGJjYW0iLCBYU1BSKDMxLDMzOSw4MjQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2RicmFtMCIsWFNQUigzMSwzMzksODI1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9kYnJhbTEiLFhTUFIoMzEsMzM5LDgyNiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1menByIiwgICBYU1BSKDMxLDMzOSw5NDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBpZCIsICAgWFNQUigzMSwzMzksOTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpY2RiZHIiLFhTUFIoMzEsMzM5LDk3OSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdW1tY3IwIiwJWFNQUigzMSwzMzksOTM2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdXBtYzEiLAlYU1BSKDMxLDMzOSw5MzcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1cG1jMiIsCVhTUFIoMzEsMzM5LDkzOCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVzaWEiLAlYU1BSKDMxLDMzOSw5MzkpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1bW1jcjEiLAlYU1BSKDMxLDMzOSw5NDApLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1cG1jMyIsCVhTUFIoMzEsMzM5LDk0MSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVwbWM0IiwJWFNQUigzMSwzMzksOTQyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mbW1jcjAiLAlYU1BSKDMxLDMzOSw5NTIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZwbWMxIiwJWFNQUigzMSwzMzksOTUzKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mcG1jMiIsCVhTUFIoMzEsMzM5LDk1NCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnNpYSIsCVhTUFIoMzEsMzM5LDk1NSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZm1tY3IxIiwJWFNQUigzMSwzMzksOTU2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mcG1jMyIsCVhTUFIoMzEsMzM5LDk1NyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnBtYzQiLAlYU1BSKDMxLDMzOSw5NTgpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZlc3IiLCAgIFhTUFIoMzEsMzM5LDk4MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGVhciIsICBYU1BSKDMxLDMzOSw5ODEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmV2cHIiLCAgWFNQUigzMSwzMzksOTgyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZjZGJjciIsIFhTUFIoMzEsMzM5LDk4MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdHNyIiwgICBYU1BSKDMxLDMzOSw5ODQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRjciIsICAgWFNQUigzMSwzMzksOTg2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwaXQiLCAgIFhTUFIoMzEsMzM5LDk4NyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdGJoaSIsICBYU1BSKDMxLDMzOSw5ODgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRibG8iLCAgWFNQUigzMSwzMzksOTg5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZzcnIyIiwgIFhTUFIoMzEsMzM5LDk5MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mc3JyMyIsICBYU1BSKDMxLDMzOSw5OTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRic3IiLCAgWFNQUigzMSwzMzksMTAwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1maWFjMSIsICBYU1BSKDMxLDMzOSwxMDEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpYWMyIiwgIFhTUFIoMzEsMzM5LDEwMTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRhYzEiLCAgWFNQUigzMSwzMzksMTAxNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGFjMiIsICBYU1BSKDMxLDMzOSwxMDE1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkY2NyIiwgIFhTUFIoMzEsMzM5LDEwMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmljY3IiLCAgWFNQUigzMSwzMzksMTAxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGJsMSIsICBYU1BSKDMxLDMzOSwxMDIwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwYnUxIiwgIFhTUFIoMzEsMzM5LDEwMjEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBibDIiLCAgWFNQUigzMSwzMzksMTAyMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGJ1MiIsICBYU1BSKDMxLDMzOSwxMDIzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZsMmNyIiwJWFNQUigzMSwzMzksMTAxNyksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1maWN0YyIsCVhTUFIoMzEsMzM5LDEwMTkpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnRocm0xIiwJWFNQUigzMSwzMzksMTAyMCksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdGhybTIiLAlYU1BSKDMxLDMzOSwxMDIxKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ0aHJtMyIsCVhTUFIoMzEsMzM5LDEwMjIpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnNwciIsICAgWCgzMSwzMzkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBTUFIgfSB9LAotCi17ICJsd2F4IiwgICAgWCgzMSwzNDEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxoYXgiLCAgICBYKDMxLDM0MyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjY2NpIiwgICBYKDMxLDQ1NCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImFicyIsICAgICBYTygzMSwzNjAsMCwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAiYWJzLiIsICAgIFhPKDMxLDM2MCwwLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJhYnNvIiwgICAgWE8oMzEsMzYwLDEsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgImFic28uIiwgICBYTygzMSwzNjAsMSwxKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAotCi17ICJkaXZzIiwgICAgWE8oMzEsMzYzLDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2cy4iLCAgIFhPKDMxLDM2MywwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdnNvIiwgICBYTygzMSwzNjMsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZzby4iLCAgWE8oMzEsMzYzLDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJ0bGJpYSIsICAgWCgzMSwzNzApLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJtZnRidSIsICAgWFNQUigzMSwzNzEsMjY5KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mdGIiLCAgICBYKDMxLDM3MSksCVhfTUFTSywJCVBQQywJCXsgUlQsIFRCUiB9IH0sCi0KLXsgImx3YXV4IiwgICBYKDMxLDM3MyksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgImxoYXV4IiwgICBYKDMxLDM3NSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJzdGh4IiwgICAgWCgzMSw0MDcpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJsZnF4IiwgICAgWCgzMSw3OTEpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSVCwgUkEsIFJCIH0gfSwKLQoteyAibGZxdXgiLCAgIFgoMzEsODIzKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlQsIFJBLCBSQiB9IH0sCi0KLXsgInN0ZnF4IiwgICBYKDMxLDkxOSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJzdGZxdXgiLCAgWCgzMSw5NTEpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAib3JjIiwgICAgIFhSQygzMSw0MTIsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm9yYy4iLCAgICBYUkMoMzEsNDEyLDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyYWRpIiwgICBYUygzMSw0MTMsMCksIFhTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCi17ICJzcmFkaS4iLCAgWFMoMzEsNDEzLDEpLCBYU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAotCi17ICJzbGJpZSIsICAgWCgzMSw0MzQpLAlYUlRSQV9NQVNLLAlQUEM2NCwJCXsgUkIgfSB9LAotCi17ICJlY293eCIsICAgWCgzMSw0MzgpLAlYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzdGh1eCIsICAgWCgzMSw0MzkpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKLQoteyAibXIiLAkgICAgIFhSQygzMSw0NDQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJvciIsICAgICAgWFJDKDMxLDQ0NCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibXIuIiwgICAgIFhSQygzMSw0NDQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJvci4iLCAgICAgWFJDKDMxLDQ0NCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtdGV4aXNyIiwgWFNQUigzMSw0NTEsNjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGV4aWVyIiwgWFNQUigzMSw0NTEsNjYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyMCIsICAgWFNQUigzMSw0NTEsMTI4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjEiLCAgIFhTUFIoMzEsNDUxLDEyOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnIyIiwgICBYU1BSKDMxLDQ1MSwxMzApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyMyIsICAgWFNQUigzMSw0NTEsMTMxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjQiLCAgIFhTUFIoMzEsNDUxLDEzMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnI1IiwgICBYU1BSKDMxLDQ1MSwxMzMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyNiIsICAgWFNQUigzMSw0NTEsMTM0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjciLCAgIFhTUFIoMzEsNDUxLDEzNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YmVhciIsICBYU1BSKDMxLDQ1MSwxNDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJlc3IiLCAgWFNQUigzMSw0NTEsMTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpb2NyIiwgIFhTUFIoMzEsNDUxLDE2MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3IwIiwgWFNQUigzMSw0NTEsMTkyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjdDAiLCBYU1BSKDMxLDQ1MSwxOTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWRhMCIsIFhTUFIoMzEsNDUxLDE5NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc2EwIiwgWFNQUigzMSw0NTEsMTk1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjYzAiLCBYU1BSKDMxLDQ1MSwxOTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNyMSIsIFhTUFIoMzEsNDUxLDIwMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3QxIiwgWFNQUigzMSw0NTEsMjAxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFkYTEiLCBYU1BSKDMxLDQ1MSwyMDIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNhMSIsIFhTUFIoMzEsNDUxLDIwMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY2MxIiwgWFNQUigzMSw0NTEsMjA0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjcjIiLCBYU1BSKDMxLDQ1MSwyMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWN0MiIsIFhTUFIoMzEsNDUxLDIwOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hZGEyIiwgWFNQUigzMSw0NTEsMjEwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFzYTIiLCBYU1BSKDMxLDQ1MSwyMTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNjMiIsIFhTUFIoMzEsNDUxLDIxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3IzIiwgWFNQUigzMSw0NTEsMjE2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjdDMiLCBYU1BSKDMxLDQ1MSwyMTcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWRhMyIsIFhTUFIoMzEsNDUxLDIxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc2EzIiwgWFNQUigzMSw0NTEsMjE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjYzMiLCBYU1BSKDMxLDQ1MSwyMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNyIiwgWFNQUigzMSw0NTEsMjI0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR1bW1jcjAiLAlYU1BSKDMxLDQ1MSw5MzYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1cG1jMSIsCVhTUFIoMzEsNDUxLDkzNyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVwbWMyIiwJWFNQUigzMSw0NTEsOTM4KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXNpYSIsCVhTUFIoMzEsNDUxLDkzOSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVtbWNyMSIsCVhTUFIoMzEsNDUxLDk0MCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVwbWMzIiwJWFNQUigzMSw0NTEsOTQxKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXBtYzQiLAlYU1BSKDMxLDQ1MSw5NDIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRtbWNyMCIsCVhTUFIoMzEsNDUxLDk1MiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHBtYzEiLAlYU1BSKDMxLDQ1MSw5NTMpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRwbWMyIiwJWFNQUigzMSw0NTEsOTU0KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10c2lhIiwJWFNQUigzMSw0NTEsOTU1KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10bW1jcjEiLAlYU1BSKDMxLDQ1MSw5NTYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRwbWMzIiwJWFNQUigzMSw0NTEsOTU3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10cG1jNCIsCVhTUFIoMzEsNDUxLDk1OCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdGwyY3IiLAlYU1BSKDMxLDQ1MSwxMDE3KSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRpY3RjIiwJWFNQUigzMSw0NTEsMTAxOSksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dGhybTEiLAlYU1BSKDMxLDQ1MSwxMDIwKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR0aHJtMiIsCVhTUFIoMzEsNDUxLDEwMjEpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHRocm0zIiwJWFNQUigzMSw0NTEsMTAyMiksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10ZGNyIiwgICBYKDMxLDQ1MSksCVhfTUFTSywJCVBQQywJCXsgU1BSLCBSUyB9IH0sCi0KLXsgImRpdmR1IiwgICBYTygzMSw0NTcsMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZHUuIiwgIFhPKDMxLDQ1NywwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkdW8iLCAgWE8oMzEsNDU3LDEsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmR1by4iLCBYTygzMSw0NTcsMSwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkaXZ3dSIsICAgWE8oMzEsNDU5LDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3dS4iLCAgWE8oMzEsNDU5LDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3dW8iLCAgWE8oMzEsNDU5LDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3dW8uIiwgWE8oMzEsNDU5LDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm10bXEiLCAgICBYU1BSKDMxLDQ2NywwKSwgICBYU1BSX01BU0ssICAgIE02MDEsCXsgUlMgfSB9LAoteyAibXR4ZXIiLCAgIFhTUFIoMzEsNDY3LDEpLCAgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10bHIiLCAgICBYU1BSKDMxLDQ2Nyw4KSwgICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGN0ciIsICAgWFNQUigzMSw0NjcsOSksICAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXR0aWQiLCAgIFhTUFIoMzEsNDY3LDE3KSwgIFhTUFJfTUFTSywgICAgUE9XRVIsCXsgUlMgfSB9LAoteyAibXRkc2lzciIsIFhTUFIoMzEsNDY3LDE4KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10ZGFyIiwgICBYU1BSKDMxLDQ2NywxOSksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHJ0Y3UiLCAgWFNQUigzMSw0NjcsMjApLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRydGNsIiwgIFhTUFIoMzEsNDY3LDIxKSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10ZGVjIiwgICBYU1BSKDMxLDQ2NywyMiksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHNkcjAiLCAgWFNQUigzMSw0NjcsMjQpLCAgWFNQUl9NQVNLLCAgICBQT1dFUiwJeyBSUyB9IH0sCi17ICJtdHNkcjEiLCAgWFNQUigzMSw0NjcsMjUpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRzcnIwIiwgIFhTUFIoMzEsNDY3LDI2KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10c3JyMSIsICBYU1BSKDMxLDQ2NywyNyksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGNtcGEiLCAgIFhTUFIoMzEsNDY3LDE0NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wYiIsICAgWFNQUigzMSw0NjcsMTQ1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBjIiwgICBYU1BSKDMxLDQ2NywxNDYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGQiLCAgIFhTUFIoMzEsNDY3LDE0NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10aWNyIiwgICAgWFNQUigzMSw0NjcsMTQ4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRkZXIiLCAgICBYU1BSKDMxLDQ2NywxNDkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNvdW50YSIsIFhTUFIoMzEsNDY3LDE1MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y291bnRiIiwgWFNQUigzMSw0NjcsMTUxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBlIiwgICBYU1BSKDMxLDQ2NywxNTIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGYiLCAgIFhTUFIoMzEsNDY3LDE1MyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wZyIsICAgWFNQUigzMSw0NjcsMTU0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBoIiwgICBYU1BSKDMxLDQ2NywxNTUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGxjdHJsMSIsIFhTUFIoMzEsNDY3LDE1NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10bGN0cmwyIiwgWFNQUigzMSw0NjcsMTU3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRpY3RybCIsICBYU1BSKDMxLDQ2NywxNTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGJhciIsICAgIFhTUFIoMzEsNDY3LDE1OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10c3ByZyIsICBYU1BSKDMxLDQ2NywyNzIpLCBYU1BSR19NQVNLLCAgIFBQQywJeyBTUFJHLCBSUyB9IH0sCi17ICJtdHNwcmcwIiwgWFNQUigzMSw0NjcsMjcyKSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoteyAibXRzcHJnMSIsIFhTUFIoMzEsNDY3LDI3MyksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJUIH0gfSwKLXsgIm10c3ByZzIiLCBYU1BSKDMxLDQ2NywyNzQpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSVCB9IH0sCi17ICJtdHNwcmczIiwgWFNQUigzMSw0NjcsMjc1KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoteyAibXRhc3IiLCAgIFhTUFIoMzEsNDY3LDI4MCksIFhTUFJfTUFTSywgICAgUFBDNjQsCXsgUlMgfSB9LAoteyAibXRlYXIiLCAgIFhTUFIoMzEsNDY3LDI4MiksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJTIH0gfSwKLXsgIm10dGJsIiwgICBYU1BSKDMxLDQ2NywyODQpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSUyB9IH0sCi17ICJtdHRidSIsICAgWFNQUigzMSw0NjcsMjg1KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlMgfSB9LAoteyAibXRpYmF0dSIsIFhTUFIoMzEsNDY3LDUyOCksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXRpYmF0bCIsIFhTUFIoMzEsNDY3LDUyOSksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXRkYmF0dSIsIFhTUFIoMzEsNDY3LDUzNiksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXRkYmF0bCIsIFhTUFIoMzEsNDY3LDUzNyksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXR6cHIiLCAgIFhTUFIoMzEsNDY3LDk0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGlkIiwgICBYU1BSKDMxLDQ2Nyw5NDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGljZGJkciIsWFNQUigzMSw0NjcsOTc5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRlc3IiLCAgIFhTUFIoMzEsNDY3LDk4MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZXZwciIsICBYU1BSKDMxLDQ2Nyw5ODIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGNkYmNyIiwgWFNQUigzMSw0NjcsOTgzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR0c3IiLCAgIFhTUFIoMzEsNDY3LDk4NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dGNyIiwgICBYU1BSKDMxLDQ2Nyw5ODYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBpdCIsICAgWFNQUigzMSw0NjcsOTg3KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR0YmhpIiwgIFhTUFIoMzEsNDY3LDk4OCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dGJsbyIsICBYU1BSKDMxLDQ2Nyw5ODkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHNycjIiLCAgWFNQUigzMSw0NjcsOTkwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRzcnIzIiwgIFhTUFIoMzEsNDY3LDk5MSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZGJzciIsICBYU1BSKDMxLDQ2NywxMDA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpYWMxIiwgIFhTUFIoMzEsNDY3LDEwMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGlhYzIiLCAgWFNQUigzMSw0NjcsMTAxMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZGFjMSIsICBYU1BSKDMxLDQ2NywxMDE0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkYWMyIiwgIFhTUFIoMzEsNDY3LDEwMTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRjY3IiLCAgWFNQUigzMSw0NjcsMTAxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10aWNjciIsICBYU1BSKDMxLDQ2NywxMDE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwYmwxIiwgIFhTUFIoMzEsNDY3LDEwMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBidTEiLCAgWFNQUigzMSw0NjcsMTAyMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGJsMiIsICBYU1BSKDMxLDQ2NywxMDIyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwYnUyIiwgIFhTUFIoMzEsNDY3LDEwMjMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHNwciIsICAgWCgzMSw0NjcpLAkgICAgICAgWF9NQVNLLAkgICAgIENPTSwJeyBTUFIsIFJTIH0gfSwKLQoteyAiZGNiaSIsICAgIFgoMzEsNDcwKSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibmFuZCIsICAgIFhSQygzMSw0NzYsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm5hbmQuIiwgICBYUkMoMzEsNDc2LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgImRjcmVhZCIsICBYKDMxLDQ4NiksCVhfTUFTSywJCVBQQzQwMywJCXsgUlQsIFJBLCBSQiB9fSwKLQoteyAibmFicyIsICAgIFhPKDMxLDQ4OCwwLDApLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJuYWJzLiIsICAgWE8oMzEsNDg4LDAsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5hYnNvIiwgICBYTygzMSw0ODgsMSwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAibmFic28uIiwgIFhPKDMxLDQ4OCwxLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi0KLXsgImRpdmQiLCAgICBYTygzMSw0ODksMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZC4iLCAgIFhPKDMxLDQ4OSwwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkbyIsICAgWE8oMzEsNDg5LDEsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmRvLiIsICBYTygzMSw0ODksMSwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkaXZ3IiwgICAgWE8oMzEsNDkxLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3LiIsICAgWE8oMzEsNDkxLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3byIsICAgWE8oMzEsNDkxLDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3by4iLCAgWE8oMzEsNDkxLDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNsYmlhIiwgICBYKDMxLDQ5OCksCTB4ZmZmZmZmZmYsCVBQQzY0LAkJeyAwIH0gfSwKLQoteyAiY2xpIiwgICAgIFgoMzEsNTAyKSwgWFJCX01BU0ssCVBPV0VSLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtY3J4ciIsICAgWCgzMSw1MTIpLAlYUkFSQl9NQVNLfCgzPDwyMSksIENPTSwJeyBCRiB9IH0sCi0KLXsgImNsY3MiLCAgICBYKDMxLDUzMSksIFhSQl9NQVNLLAlNNjAxLAkJeyBSVCwgUkEgfSB9LAotCi17ICJsc3d4IiwgICAgWCgzMSw1MzMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibHN4IiwgICAgIFgoMzEsNTMzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibHdicngiLCAgIFgoMzEsNTM0KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImxicngiLCAgICBYKDMxLDUzNCksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxmc3giLCAgICBYKDMxLDUzNSksCVhfTUFTSywJCUNPTSwJCXsgRlJULCBSQSwgUkIgfSB9LAotCi17ICJzcnciLCAgICAgWFJDKDMxLDUzNiwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3IiLCAgICAgIFhSQygzMSw1MzYsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNydy4iLCAgICBYUkMoMzEsNTM2LDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzci4iLCAgICAgWFJDKDMxLDUzNiwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJycmliIiwgICAgWFJDKDMxLDUzNywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJyaWIuIiwgICBYUkMoMzEsNTM3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmQiLCAgICAgWFJDKDMxLDUzOSwwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmQuIiwgICAgWFJDKDMxLDUzOSwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIm1hc2tpciIsICBYUkMoMzEsNTQxLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibWFza2lyLiIsIFhSQygzMSw1NDEsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInRsYnN5bmMiLCBYKDMxLDU2NiksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCi0KLXsgImxmc3V4IiwgICBYKDMxLDU2NyksCVhfTUFTSywJCUNPTSwJCXsgRlJULCBSQVMsIFJCIH0gfSwKLQoteyAibWZzciIsICAgIFgoMzEsNTk1KSwJWFJCX01BU0t8KDE8PDIwKSwgQ09NMzIsCXsgUlQsIFNSIH0gfSwKLQoteyAibHN3aSIsICAgIFgoMzEsNTk3KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIE5CIH0gfSwKLXsgImxzaSIsICAgICBYKDMxLDU5NyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBOQiB9IH0sCi0KLXsgInN5bmMiLCAgICBYKDMxLDU5OCksIDB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCi17ICJkY3MiLCAgICAgWCgzMSw1OTgpLCAweGZmZmZmZmZmLAlQV1JDT00sCQl7IDAgfSB9LAotCi17ICJsZmR4IiwgICAgWCgzMSw1OTkpLCBYX01BU0ssCQlDT00sCQl7IEZSVCwgUkEsIFJCIH0gfSwKLQoteyAibWZzcmkiLCAgIFgoMzEsNjI3KSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGNsc3QiLCAgIFgoMzEsNjMwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUlMsIFJBIH0gfSwKLQoteyAibGZkdXgiLCAgIFgoMzEsNjMxKSwgWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBUywgUkIgfSB9LAotCi17ICJtZnNyaW4iLCAgWCgzMSw2NTkpLCBYUkFfTUFTSywJUFBDMzIsCQl7IFJULCBSQiB9IH0sCi0KLXsgInN0c3d4IiwgICBYKDMxLDY2MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi17ICJzdHN4IiwgICAgWCgzMSw2NjEpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdHdicngiLCAgWCgzMSw2NjIpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoteyAic3RicngiLCAgIFgoMzEsNjYyKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3Rmc3giLCAgIFgoMzEsNjYzKSwgWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNycSIsICAgICBYUkMoMzEsNjY0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JxLiIsICAgIFhSQygzMSw2NjQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyZSIsICAgICBYUkMoMzEsNjY1LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JlLiIsICAgIFhSQygzMSw2NjUsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInN0ZnN1eCIsICBYKDMxLDY5NSksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQVMsIFJCIH0gfSwKLQoteyAic3JpcSIsICAgIFhSQygzMSw2OTYsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmlxLiIsICAgWFJDKDMxLDY5NiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLQoteyAic3Rzd2kiLCAgIFgoMzEsNzI1KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIE5CIH0gfSwKLXsgInN0c2kiLCAgICBYKDMxLDcyNSksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBOQiB9IH0sCi0KLXsgInN0ZmR4IiwgICBYKDMxLDcyNyksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJzcmxxIiwgICAgWFJDKDMxLDcyOCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNybHEuIiwgICBYUkMoMzEsNzI4LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmVxIiwgICAgWFJDKDMxLDcyOSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyZXEuIiwgICBYUkMoMzEsNzI5LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzdGZkdXgiLCAgWCgzMSw3NTkpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkFTLCBSQiB9IH0sCi0KLXsgInNybGlxIiwgICBYUkMoMzEsNzYwLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JsaXEuIiwgIFhSQygzMSw3NjAsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImxoYnJ4IiwgICBYKDMxLDc5MCksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNyYXciLCAgICBYUkMoMzEsNzkyLDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmEiLCAgICAgWFJDKDMxLDc5MiwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3Jhdy4iLCAgIFhSQygzMSw3OTIsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYS4iLCAgICBYUkMoMzEsNzkyLDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyYWQiLCAgICBYUkMoMzEsNzk0LDApLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYWQuIiwgICBYUkMoMzEsNzk0LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAicmFjIiwgICAgIFgoMzEsODE4KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic3Jhd2kiLCAgIFhSQygzMSw4MjQsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNyYWkiLCAgICBYUkMoMzEsODI0LDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmF3aS4iLCAgWFJDKDMxLDgyNCwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JhaS4iLCAgIFhSQygzMSw4MjQsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKLQoteyAiZWllaW8iLCAgIFgoMzEsODU0KSwJMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLQoteyAidGxic3giLCAgIFhSQygzMSw5MTQsMCksIFhfTUFTSywgUFBDNDAzLAl7IFJULCBSQSwgUkIgfSB9LAoteyAidGxic3guIiwgIFhSQygzMSw5MTQsMSksIFhfTUFTSywgUFBDNDAzLAl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzdGhicngiLCAgWCgzMSw5MTgpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzcmFxIiwgICAgWFJDKDMxLDkyMCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYXEuIiwgICBYUkMoMzEsOTIwLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmVhIiwgICAgWFJDKDMxLDkyMSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyZWEuIiwgICBYUkMoMzEsOTIxLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJleHRzaCIsICAgWFJDKDMxLDkyMiwwKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImV4dHMiLCAgICBYUkMoMzEsOTIyLDApLCBYUkJfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiZXh0c2guIiwgIFhSQygzMSw5MjIsMSksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJleHRzLiIsICAgWFJDKDMxLDkyMiwxKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLQoteyAidGxicmUiLCAgIFgoMzEsOTQ2KSwJWF9NQVNLLAkJUFBDNDAzLAkJeyBSVCwgUkEsIFNIIH0gfSwKLQoteyAic3JhaXEiLCAgIFhSQygzMSw5NTIsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmFpcS4iLCAgWFJDKDMxLDk1MiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLQoteyAiZXh0c2IiLCAgIFhSQygzMSw5NTQsMCksIFhSQl9NQVNLLAlQUEMsCQl7IFJBLCBSU30gfSwKLXsgImV4dHNiLiIsICBYUkMoMzEsOTU0LDEpLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlN9IH0sCi0KLXsgImljY2NpIiwgICBYKDMxLDk2NiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgInRsYmxkIiwgICBYKDMxLDk3OCksCVhSVFJBX01BU0ssCVBQQywJCXsgUkIgfSB9LAoteyAidGxid2UiLCAgIFgoMzEsOTc4KSwJWF9NQVNLLAkJUFBDNDAzLAkJeyBSUywgUkEsIFNIIH0gfSwKLQoteyAiaWNiaSIsICAgIFgoMzEsOTgyKSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAic3RmaXd4IiwgIFgoMzEsOTgzKSwJWF9NQVNLLAkJUFBDLAkJeyBGUlMsIFJBLCBSQiB9IH0sCi0KLXsgImV4dHN3IiwgICBYUkMoMzEsOTg2LDApLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlMgfSB9LAoteyAiZXh0c3cuIiwgIFhSQygzMSw5ODYsMSksIFhSQl9NQVNLLAlQUEMsCQl7IFJBLCBSUyB9IH0sCi0KLXsgImljcmVhZCIsICBYKDMxLDk5OCksCVhSVF9NQVNLLAlQUEM0MDMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgInRsYmxpIiwgICBYKDMxLDEwMTApLCBYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKLQoteyAiZGNieiIsICAgIFgoMzEsMTAxNCksIFhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi17ICJkY2x6IiwgICAgWCgzMSwxMDE0KSwgWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibHd6IiwgICAgIE9QKDMyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoteyAibCIsCSAgICAgT1AoMzIpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImx3enUiLCAgICBPUCgzMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCi17ICJsdSIsICAgICAgT1AoMzMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxieiIsICAgICBPUCgzNCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGJ6dSIsICAgIE9QKDM1KSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLQoteyAic3R3IiwgICAgIE9QKDM2KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSUywgRCwgUkEgfSB9LAoteyAic3QiLCAgICAgIE9QKDM2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdHd1IiwgICAgT1AoMzcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQVMgfSB9LAoteyAic3R1IiwgICAgIE9QKDM3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdGIiLCAgICAgT1AoMzgpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgInN0YnUiLCAgICBPUCgzOSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCi0KLXsgImxoeiIsICAgICBPUCg0MCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGh6dSIsICAgIE9QKDQxKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLQoteyAibGhhIiwgICAgIE9QKDQyKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsaGF1IiwgICAgT1AoNDMpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQUwgfSB9LAotCi17ICJzdGgiLCAgICAgT1AoNDQpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgInN0aHUiLCAgICBPUCg0NSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCi0KLXsgImxtdyIsICAgICBPUCg0NiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTSB9IH0sCi17ICJsbSIsICAgICAgT1AoNDYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgInN0bXciLCAgICBPUCg0NyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLXsgInN0bSIsICAgICBPUCg0NyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLQoteyAibGZzIiwgICAgIE9QKDQ4KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBIH0gfSwKLQoteyAibGZzdSIsICAgIE9QKDQ5KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBUyB9IH0sCi0KLXsgImxmZCIsICAgICBPUCg1MCksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxmZHUiLCAgICBPUCg1MSksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQVMgfSB9LAotCi17ICJzdGZzIiwgICAgT1AoNTIpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGZzdSIsICAgT1AoNTMpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkFTIH0gfSwKLQoteyAic3RmZCIsICAgIE9QKDU0KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBIH0gfSwKLQoteyAic3RmZHUiLCAgIE9QKDU1KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBUyB9IH0sCi0KLXsgImxmcSIsICAgICBPUCg1NiksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxmcXUiLCAgICBPUCg1NyksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxkIiwgICAgICBEU08oNTgsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBIH0gfSwKLQoteyAibGR1IiwgICAgIERTTyg1OCwxKSwgRFNfTUFTSywJUFBDNjQsCQl7IFJULCBEUywgUkFMIH0gfSwKLQoteyAibHdhIiwgICAgIERTTyg1OCwyKSwgRFNfTUFTSywJUFBDNjQsCQl7IFJULCBEUywgUkEgfSB9LAotCi17ICJmZGl2cyIsICAgQSg1OSwxOCwwKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmRpdnMuIiwgIEEoNTksMTgsMSksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnN1YnMiLCAgIEEoNTksMjAsMCksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZzdWJzLiIsICBBKDU5LDIwLDEpLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi0KLXsgImZhZGRzIiwgICBBKDU5LDIxLDApLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmYWRkcy4iLCAgQSg1OSwyMSwxKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3FydHMiLCAgQSg1OSwyMiwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZzcXJ0cy4iLCBBKDU5LDIyLDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmcmVzIiwgICAgQSg1OSwyNCwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZyZXMuIiwgICBBKDU5LDI0LDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmbXVscyIsICAgQSg1OSwyNSwwKSwgQUZSQl9NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoteyAiZm11bHMuIiwgIEEoNTksMjUsMSksIEFGUkJfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLQoteyAiZm1zdWJzIiwgIEEoNTksMjgsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1zdWJzLiIsIEEoNTksMjgsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbWFkZHMiLCAgQSg1OSwyOSwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbWFkZHMuIiwgQSg1OSwyOSwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZubXN1YnMiLCBBKDU5LDMwLDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubXN1YnMuIixBKDU5LDMwLDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm5tYWRkcyIsIEEoNTksMzEsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tYWRkcy4iLEEoNTksMzEsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJzdGZxIiwgICAgT1AoNjApLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGZxdSIsICAgT1AoNjEpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAotCi17ICJzdGQiLCAgICAgRFNPKDYyLDApLAlEU19NQVNLLAlQUEM2NCwJCXsgUlMsIERTLCBSQSB9IH0sCi0KLXsgInN0ZHUiLCAgICBEU08oNjIsMSksCURTX01BU0ssCVBQQzY0LAkJeyBSUywgRFMsIFJBUyB9IH0sCi0KLXsgImZjbXB1IiwgICBYKDYzLDApLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAotCi17ICJmcnNwIiwgICAgWFJDKDYzLDEyLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmcnNwLiIsICAgWFJDKDYzLDEyLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjdGl3IiwgICBYUkMoNjMsMTQsMCksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXIiLCAgICBYUkMoNjMsMTQsMCksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjdGl3LiIsICBYUkMoNjMsMTQsMSksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXIuIiwgICBYUkMoNjMsMTQsMSksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmN0aXd6IiwgIFhSQyg2MywxNSwwKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNpcnoiLCAgIFhSQyg2MywxNSwwKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmN0aXd6LiIsIFhSQyg2MywxNSwxKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNpcnouIiwgIFhSQyg2MywxNSwxKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmZGl2IiwgICAgQSg2MywxOCwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmQiLCAgICAgIEEoNjMsMTgsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZkaXYuIiwgICBBKDYzLDE4LDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmZC4iLCAgICAgQSg2MywxOCwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3ViIiwgICAgQSg2MywyMCwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZnMiLCAgICAgIEEoNjMsMjAsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZzdWIuIiwgICBBKDYzLDIwLDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmcy4iLCAgICAgQSg2MywyMCwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmYWRkIiwgICAgQSg2MywyMSwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmEiLCAgICAgIEEoNjMsMjEsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZhZGQuIiwgICBBKDYzLDIxLDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmYS4iLCAgICAgQSg2MywyMSwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmc3FydCIsICAgQSg2MywyMiwwKSwgQUZSQUZSQ19NQVNLLAlQUENQV1IyLAl7IEZSVCwgRlJCIH0gfSwKLXsgImZzcXJ0LiIsICBBKDYzLDIyLDEpLCBBRlJBRlJDX01BU0ssCVBQQ1BXUjIsCXsgRlJULCBGUkIgfSB9LAotCi17ICJmc2VsIiwgICAgQSg2MywyMywwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmc2VsLiIsICAgQSg2MywyMywxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZtdWwiLCAgICBBKDYzLDI1LDApLCBBRlJCX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi17ICJmbSIsICAgICAgQSg2MywyNSwwKSwgQUZSQl9NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoteyAiZm11bC4iLCAgIEEoNjMsMjUsMSksIEFGUkJfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLXsgImZtLiIsICAgICBBKDYzLDI1LDEpLCBBRlJCX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi0KLXsgImZyc3FydGUiLCBBKDYzLDI2LDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoteyAiZnJzcXJ0ZS4iLEEoNjMsMjYsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZtc3ViIiwgICBBKDYzLDI4LDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtcyIsICAgICBBKDYzLDI4LDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtc3ViLiIsICBBKDYzLDI4LDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtcy4iLCAgICBBKDYzLDI4LDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm1hZGQiLCAgIEEoNjMsMjksMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hIiwgICAgIEEoNjMsMjksMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hZGQuIiwgIEEoNjMsMjksMSksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hLiIsICAgIEEoNjMsMjksMSksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbm1zdWIiLCAgQSg2MywzMCwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zIiwgICAgQSg2MywzMCwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zdWIuIiwgQSg2MywzMCwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zLiIsICAgQSg2MywzMCwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZubWFkZCIsICBBKDYzLDMxLDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWEiLCAgICBBKDYzLDMxLDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWFkZC4iLCBBKDYzLDMxLDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWEuIiwgICBBKDYzLDMxLDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZmNtcG8iLCAgIFgoNjMsMzIpLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAotCi17ICJtdGZzYjEiLCAgWFJDKDYzLDM4LDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKLXsgIm10ZnNiMS4iLCBYUkMoNjMsMzgsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAotCi17ICJmbmVnIiwgICAgWFJDKDYzLDQwLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmbmVnLiIsICAgWFJDKDYzLDQwLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgIm1jcmZzIiwgICBYKDYzLDY0KSwJWFJCX01BU0t8KDM8PDIxKXwoMzw8MTYpLCBDT00sCXsgQkYsIEJGQSB9IH0sCi0KLXsgIm10ZnNiMCIsICBYUkMoNjMsNzAsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAoteyAibXRmc2IwLiIsIFhSQyg2Myw3MCwxKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCi0KLXsgImZtciIsICAgICBYUkMoNjMsNzIsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZtci4iLCAgICBYUkMoNjMsNzIsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAibXRmc2ZpIiwgIFhSQyg2MywxMzQsMCksIFhSQV9NQVNLfCgzPDwyMSl8KDE8PDExKSwgQ09NLCB7IEJGLCBVIH0gfSwKLXsgIm10ZnNmaS4iLCBYUkMoNjMsMTM0LDEpLCBYUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRiwgVSB9IH0sCi0KLXsgImZuYWJzIiwgICBYUkMoNjMsMTM2LDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmbmFicy4iLCAgWFJDKDYzLDEzNiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmYWJzIiwgICAgWFJDKDYzLDI2NCwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmFicy4iLCAgIFhSQyg2MywyNjQsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAibWZmcyIsICAgIFhSQyg2Myw1ODMsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgRlJUIH0gfSwKLXsgIm1mZnMuIiwgICBYUkMoNjMsNTgzLDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEZSVCB9IH0sCi0KLXsgIm10ZnNmIiwgICBYRkwoNjMsNzExLDApLCBYRkxfTUFTSywJQ09NLAkJeyBGTE0sIEZSQiB9IH0sCi17ICJtdGZzZi4iLCAgWEZMKDYzLDcxMSwxKSwgWEZMX01BU0ssCUNPTSwJCXsgRkxNLCBGUkIgfSB9LAotCi17ICJmY3RpZCIsICAgWFJDKDYzLDgxNCwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY3RpZC4iLCAgWFJDKDYzLDgxNCwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjdGlkeiIsICBYUkMoNjMsODE1LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjdGlkei4iLCBYUkMoNjMsODE1LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmNmaWQiLCAgIFhSQyg2Myw4NDYsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmNmaWQuIiwgIFhSQyg2Myw4NDYsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAotCi19OwotCi1jb25zdCBpbnQgcG93ZXJwY19udW1fb3Bjb2RlcyA9Ci0gIHNpemVvZiAocG93ZXJwY19vcGNvZGVzKSAvIHNpemVvZiAocG93ZXJwY19vcGNvZGVzWzBdKTsKLQwKLS8qIFRoZSBtYWNybyB0YWJsZS4gIFRoaXMgaXMgb25seSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICAqLwotCi0vKiBUaGUgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0gKC14ICEgMzEpICYgKHggfCAzMSkgaGF2ZSB0aGUgdmFsdWUgMAotICAgd2hlbiB4PTA7IDMyLXggd2hlbiB4IGlzIGJldHdlZW4gMSBhbmQgMzE7IGFyZSBuZWdhdGl2ZSBpZiB4IGlzCi0gICBuZWdhdGl2ZTsgYW5kIGFyZSAzMiBvciBtb3JlIG90aGVyd2lzZS4gIFRoaXMgaXMgd2hhdCB5b3Ugd2FudAotICAgd2hlbiwgZm9yIGluc3RhbmNlLCB5b3UgYXJlIGVtdWxhdGluZyBhIHJpZ2h0IHNoaWZ0IGJ5IGEKLSAgIHJvdGF0ZS1sZWZ0LWFuZC1tYXNrLCBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIGluc3RydWN0aW9ucyBzdXBwb3J0Ci0gICBzaGlmdHMgb2Ygc2l6ZSAwIGJ1dCBub3Qgc2hpZnRzIG9mIHNpemUgMzIuICBCeSBjb21wYXJpc29uLCB3aGVuCi0gICBleHRyYWN0aW5nIHggYml0cyBmcm9tIHNvbWUgd29yZCB5b3Ugd2FudCB0byB1c2UganVzdCAzMi14LCBiZWNhdXNlCi0gICB0aGUgdW5kZXJseWluZyBpbnN0cnVjdGlvbnMgZG9uJ3Qgc3VwcG9ydCBleHRyYWN0aW5nIDAgYml0cyBidXQgZG8KLSAgIHN1cHBvcnQgZXh0cmFjdGluZyB0aGUgd2hvbGUgd29yZCAoMzIgYml0cyBpbiB0aGlzIGNhc2UpLiAgKi8KLQotY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gcG93ZXJwY19tYWNyb3NbXSA9IHsKLXsgImV4dGxkaSIsICA0LCAgIFBQQzY0LAkicmxkaWNyICUwLCUxLCUzLCglMiktMSIgfSwKLXsgImV4dGxkaS4iLCA0LCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwlMywoJTIpLTEiIH0sCi17ICJleHRyZGkiLCAgNCwgICBQUEM2NCwJInJsZGljbCAlMCwlMSwoJTIpKyglMyksNjQtKCUyKSIgfSwKLXsgImV4dHJkaS4iLCA0LCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoJTIpKyglMyksNjQtKCUyKSIgfSwKLXsgImluc3JkaSIsICA0LCAgIFBQQzY0LAkicmxkaW1pICUwLCUxLDY0LSgoJTIpKyglMykpLCUzIiB9LAoteyAiaW5zcmRpLiIsIDQsICAgUFBDNjQsCSJybGRpbWkuICUwLCUxLDY0LSgoJTIpKyglMykpLCUzIiB9LAoteyAicm90cmRpIiwgIDMsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksMCIgfSwKLXsgInJvdHJkaS4iLCAzLCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwwIiB9LAoteyAic2xkaSIsICAgIDMsICAgUFBDNjQsCSJybGRpY3IgJTAsJTEsJTIsNjMtKCUyKSIgfSwKLXsgInNsZGkuIiwgICAzLCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwlMiw2My0oJTIpIiB9LAoteyAic3JkaSIsICAgIDMsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksJTIiIH0sCi17ICJzcmRpLiIsICAgMywgICBQUEM2NCwJInJsZGljbC4gJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksJTIiIH0sCi17ICJjbHJyZGkiLCAgMywgICBQUEM2NCwJInJsZGljciAlMCwlMSwwLDYzLSglMikiIH0sCi17ICJjbHJyZGkuIiwgMywgICBQUEM2NCwJInJsZGljci4gJTAsJTEsMCw2My0oJTIpIiB9LAoteyAiY2xybHNsZGkiLDQsICAgUFBDNjQsCSJybGRpYyAlMCwlMSwlMywoJTIpLSglMykiIH0sCi17ICJjbHJsc2xkaS4iLDQsICBQUEM2NCwJInJsZGljLiAlMCwlMSwlMywoJTIpLSglMykiIH0sCi0KLXsgImV4dGx3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMywwLCglMiktMSIgfSwKLXsgImV4dGx3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTMsMCwoJTIpLTEiIH0sCi17ICJleHRyd2kiLCAgNCwgICBQUENDT00sCSJybHdpbm0gJTAsJTEsKCUyKSsoJTMpLDMyLSglMiksMzEiIH0sCi17ICJleHRyd2kuIiwgNCwgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCglMikrKCUzKSwzMi0oJTIpLDMxIiB9LAoteyAiaW5zbHdpIiwgIDQsICAgUFBDQ09NLAkicmx3aW1pICUwLCUxLCgtKCUzKSEzMSkmKCglMyl8MzEpLCUzLCglMikrKCUzKS0xIiB9LAoteyAiaW5zbHdpLiIsIDQsICAgUFBDQ09NLAkicmx3aW1pLiAlMCwlMSwoLSglMykhMzEpJigoJTMpfDMxKSwlMywoJTIpKyglMyktMSJ9LAoteyAiaW5zcndpIiwgIDQsICAgUFBDQ09NLAkicmx3aW1pICUwLCUxLDMyLSgoJTIpKyglMykpLCUzLCglMikrKCUzKS0xIiB9LAoteyAiaW5zcndpLiIsIDQsICAgUFBDQ09NLAkicmx3aW1pLiAlMCwlMSwzMi0oKCUyKSsoJTMpKSwlMywoJTIpKyglMyktMSJ9LAoteyAicm90cndpIiwgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLDAsMzEiIH0sCi17ICJyb3Ryd2kuIiwgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLDAsMzEiIH0sCi17ICJzbHdpIiwgICAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic2xpIiwgICAgIDMsICAgUFdSQ09NLAkicmxpbm0gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic2x3aS4iLCAgIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwlMiwwLDMxLSglMikiIH0sCi17ICJzbGkuIiwgICAgMywgICBQV1JDT00sCSJybGlubS4gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic3J3aSIsICAgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAic3JpIiwgICAgIDMsICAgUFdSQ09NLAkicmxpbm0gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCi17ICJzcndpLiIsICAgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAic3JpLiIsICAgIDMsICAgUFdSQ09NLAkicmxpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAiY2xycndpIiwgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLDAsMCwzMS0oJTIpIiB9LAoteyAiY2xycndpLiIsIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwwLDAsMzEtKCUyKSIgfSwKLXsgImNscmxzbHdpIiw0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMywoJTIpLSglMyksMzEtKCUzKSIgfSwKLXsgImNscmxzbHdpLiIsNCwgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTMsKCUyKS0oJTMpLDMxLSglMykiIH0sCi0KLX07Ci0KLWNvbnN0IGludCBwb3dlcnBjX251bV9tYWNyb3MgPQotICBzaXplb2YgKHBvd2VycGNfbWFjcm9zKSAvIHNpemVvZiAocG93ZXJwY19tYWNyb3NbMF0pOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zaC1kaXMuYyBiL29wY29kZXMvc2gtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjY1MTguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zaC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBTSCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgU1RBVElDX1RBQkxFCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jaW5jbHVkZSAic2gtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0jZGVmaW5lIExJVFRMRV9CSVQgMgotCi1zdGF0aWMgdm9pZAotcHJpbnRfbW92eHkgKG9wLCBybiwgcm0sIGZwcmludGZfZm4sIHN0cmVhbSkKLSAgICAgc2hfb3Bjb2RlX2luZm8gKm9wOwotICAgICBpbnQgcm4sIHJtOwotICAgICBmcHJpbnRmX2Z0eXBlIGZwcmludGZfZm47Ci0gICAgIHZvaWQgKnN0cmVhbTsKLXsKLSAgaW50IG47Ci0KLSAgZnByaW50Zl9mbiAoc3RyZWFtLCIlc1x0Iiwgb3AtPm5hbWUpOwotICBmb3IgKG4gPSAwOyBuIDwgMjsgbisrKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3AtPmFyZ1tuXSkKLQl7Ci0JY2FzZSBBX0lORF9OOgotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCIsIHJuKTsJCi0JICBicmVhazsKLQljYXNlIEFfSU5DX046Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkKyIsIHJuKTsJCi0JICBicmVhazsKLQljYXNlIEFfUE1PRF9OOgotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCtyOCIsIHJuKTsJCi0JICBicmVhazsKLQljYXNlIEFfUE1PRFlfTjoKLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQrcjkiLCBybik7CQotCSAgYnJlYWs7Ci0JY2FzZSBEU1BfUkVHX006Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICJhJWMiLCAnMCcgKyBybSk7Ci0JICBicmVhazsKLQljYXNlIERTUF9SRUdfWDoKLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgInglYyIsICcwJyArIHJtKTsKLQkgIGJyZWFrOwotCWNhc2UgRFNQX1JFR19ZOgotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAieSVjIiwgJzAnICsgcm0pOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGlmIChuID09IDApCi0JZnByaW50Zl9mbiAoc3RyZWFtLCAiLCIpOwkKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgZG91YmxlIGRhdGEgdHJhbnNmZXIgaW5zbi4gIElOU04gaXMganVzdCB0aGUgbG93ZXIgdGhyZWUKLSAgIG5pYmJsZXMgb2YgdGhlIGluc24sIGkuZS4gZmllbGQgYSBhbmQgdGhlIGJpdCB0aGF0IGluZGljYXRlcyBpZgotICAgYSBwYXJhbGxlbCBwcm9jZXNzaW5nIGluc24gZm9sbG93cy4KLSAgIFJldHVybiBub256ZXJvIGlmIGEgZmllbGQgYiBvZiBhIHBhcmFsbGVsIHByb2Nlc3NpbmcgaW5zbnMgZm9sbG93cy4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbl9kZHQgKGluc24sIGluZm8pCi0gICAgIGludCBpbnNuOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2ZuID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0KLSAgLyogSWYgdGhpcyBpcyBqdXN0IGEgbm9wLCBtYWtlIHN1cmUgdG8gZW1pdCBzb21ldGhpbmcuICAqLwotICBpZiAoaW5zbiA9PSAweDAwMCkKLSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJub3B4XHRub3B5Iik7Ci0KLSAgLyogSWYgYSBwYXJhbGxlbCBwcm9jZXNzaW5nIGluc24gd2FzIHByaW50ZWQgYmVmb3JlLAotICAgICBhbmQgd2UgZ290IGEgbm9uLW5vcCwgZW1pdCBhIHRhYi4gICovCi0gIGlmICgoaW5zbiAmIDB4ODAwKSAmJiAoaW5zbiAmIDB4M2ZmKSkKLSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJcdCIpOwotCi0gIC8qIENoZWNrIGlmIGVpdGhlciB0aGUgeCBvciB5IHBhcnQgaXMgaW52YWxpZC4gICovCi0gIGlmICgoKGluc24gJiAweGMpID09IDAgJiYgKGluc24gJiAweDJhMCkpCi0gICAgICB8fCAoKGluc24gJiAzKSA9PSAwICYmIChpbnNuICYgMHgxNTApKSkKLSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIud29yZCAweCV4IiwgaW5zbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdGF0aWMgc2hfb3Bjb2RlX2luZm8gKmZpcnN0X21vdngsICpmaXJzdF9tb3Z5OwotICAgICAgc2hfb3Bjb2RlX2luZm8gKm9weCwgKm9weTsKLSAgICAgIGludCBpbnNuX3gsIGluc25feTsKLQotICAgICAgaWYgKCEgZmlyc3RfbW92eCkKLQl7Ci0JICBmb3IgKGZpcnN0X21vdnggPSBzaF90YWJsZTsgZmlyc3RfbW92eC0+bmliYmxlc1sxXSAhPSBNT1ZYOyApCi0JICAgIGZpcnN0X21vdngrKzsKLQkgIGZvciAoZmlyc3RfbW92eSA9IGZpcnN0X21vdng7IGZpcnN0X21vdnktPm5pYmJsZXNbMV0gIT0gTU9WWTsgKQotCSAgICBmaXJzdF9tb3Z5Kys7Ci0JfQotICAgICAgaW5zbl94ID0gKGluc24gPj4gMikgJiAweGI7Ci0gICAgICBpZiAoaW5zbl94KQotCXsKLQkgIGZvciAob3B4ID0gZmlyc3RfbW92eDsgb3B4LT5uaWJibGVzWzJdICE9IGluc25feDsgKSBvcHgrKzsKLQkgIHByaW50X21vdnh5IChvcHgsICgoaW5zbiA+PiA5KSAmIDEpICsgNCwgKGluc24gPj4gNykgJiAxLAotCQkgICAgICAgZnByaW50Zl9mbiwgc3RyZWFtKTsKLQl9Ci0gICAgICBpbnNuX3kgPSAoaW5zbiAmIDMpIHwgKChpbnNuID4+IDEpICYgOCk7Ci0gICAgICBpZiAoaW5zbl95KQotCXsKLQkgIGlmIChpbnNuX3gpCi0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIlx0Iik7Ci0JICBmb3IgKG9weSA9IGZpcnN0X21vdnk7IG9weS0+bmliYmxlc1syXSAhPSBpbnNuX3k7ICkgb3B5Kys7Ci0JICBwcmludF9tb3Z4eSAob3B5LCAoKGluc24gPj4gOCkgJiAxKSArIDYsIChpbnNuID4+IDYpICYgMSwKLQkJICAgICAgIGZwcmludGZfZm4sIHN0cmVhbSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2RzcF9yZWcgKHJtLCBmcHJpbnRmX2ZuLCBzdHJlYW0pCi0gICAgIGludCBybTsKLSAgICAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2ZuOwotICAgICB2b2lkICpzdHJlYW07Ci17Ci0gIHN3aXRjaCAocm0pCi0gICAgewotICAgIGNhc2UgQV9BMV9OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJhMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBX0EwX05VTToKLSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImEwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFfWDBfTlVNOgotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAieDAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQV9YMV9OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4MSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBX1kwX05VTToKLSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInkwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFfWTFfTlVNOgotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAieTEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQV9NMF9OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBX0ExR19OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJhMWciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQV9NMV9OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBX0EwR19OVU06Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJhMGciKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIweCV4Iiwgcm0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbl9wcGkgKGZpZWxkX2IsIGluZm8pCi0gICAgIGludCBmaWVsZF9iOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3RhdGljIGNoYXIgKnN4X3RhYltdID0geyJ4MCIsIngxIiwiYTAiLCJhMSJ9OwotICBzdGF0aWMgY2hhciAqc3lfdGFiW10gPSB7InkwIiwieTEiLCJtMCIsIm0xIn07Ci0gIGZwcmludGZfZnR5cGUgZnByaW50Zl9mbiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBpbnQgbmliMSwgbmliMiwgbmliMzsKLSAgY2hhciAqZGM7Ci0gIHNoX29wY29kZV9pbmZvICpvcDsKLQotICBpZiAoKGZpZWxkX2IgJiAweGU4MDApID09IDApCi0gICAgewotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAicHNoJWNcdCMlZCwiLAotCQkgIGZpZWxkX2IgJiAweDEwMDAgPyAnYScgOiAnbCcsCi0JCSAgKGZpZWxkX2IgPj4gNCkgJiAxMjcpOwotICAgICAgcHJpbnRfZHNwX3JlZyAoZmllbGRfYiAmIDB4ZiwgZnByaW50Zl9mbiwgc3RyZWFtKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmICgoZmllbGRfYiAmIDB4YzAwMCkgPT0gMHg0MDAwICYmIChmaWVsZF9iICYgMHgzMDAwKSAhPSAweDEwMDApCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgKmR1X3RhYltdID0geyJ4MCIsInkwIiwiYTAiLCJhMSJ9OwotICAgICAgc3RhdGljIGNoYXIgKnNlX3RhYltdID0geyJ4MCIsIngxIiwieTAiLCJhMSJ9OwotICAgICAgc3RhdGljIGNoYXIgKnNmX3RhYltdID0geyJ5MCIsInkxIiwieDAiLCJhMSJ9OwotICAgICAgc3RhdGljIGNoYXIgKnNnX3RhYltdID0geyJtMCIsIm0xIiwiYTAiLCJhMSJ9OwotCi0gICAgICBpZiAoZmllbGRfYiAmIDB4MjAwMCkKLQl7Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICJwJXMgJXMsJXMsJXNcdCIsCi0JCSAgICAgIChmaWVsZF9iICYgMHgxMDAwKSA/ICJhZGQiIDogInN1YiIsCi0JCSAgICAgIHN4X3RhYlsoZmllbGRfYiA+PiA2KSAmIDNdLAotCQkgICAgICBzeV90YWJbKGZpZWxkX2IgPj4gNCkgJiAzXSwKLQkJICAgICAgZHVfdGFiWyhmaWVsZF9iID4+IDApICYgM10pOwotCX0KLSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInBtdWxzJWMlcywlcywlcyIsCi0JCSAgZmllbGRfYiAmIDB4MjAwMCA/ICcgJyA6ICdcdCcsCi0JCSAgc2VfdGFiWyhmaWVsZF9iID4+IDEwKSAmIDNdLAotCQkgIHNmX3RhYlsoZmllbGRfYiA+PiAgOCkgJiAzXSwKLQkJICBzZ190YWJbKGZpZWxkX2IgPj4gIDIpICYgM10pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuaWIxID0gUFBJQzsKLSAgbmliMiA9IGZpZWxkX2IgPj4gMTIgJiAweGY7Ci0gIG5pYjMgPSBmaWVsZF9iID4+IDggJiAweGY7Ci0gIHN3aXRjaCAobmliMyAmIDB4MykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZGMgPSAiIjsKLSAgICAgIG5pYjEgPSBQUEkzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgZGMgPSAiIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGRjID0gImRjdCAiOwotICAgICAgbmliMyAtPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgZGMgPSAiZGNmICI7Ci0gICAgICBuaWIzIC09IDI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGZvciAob3AgPSBzaF90YWJsZTsgb3AtPm5hbWU7IG9wKyspCi0gICAgewotICAgICAgaWYgKG9wLT5uaWJibGVzWzFdID09IG5pYjEKLQkgICYmIG9wLT5uaWJibGVzWzJdID09IG5pYjIKLQkgICYmIG9wLT5uaWJibGVzWzNdID09IG5pYjMpCi0JewotCSAgaW50IG47Ci0KLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgIiVzJXNcdCIsIGRjLCBvcC0+bmFtZSk7Ci0JICBmb3IgKG4gPSAwOyBuIDwgMyAmJiBvcC0+YXJnW25dICE9IEFfRU5EOyBuKyspIAotCSAgICB7Ci0JICAgICAgaWYgKG4gJiYgb3AtPmFyZ1sxXSAhPSBBX0VORCkKLQkJZnByaW50Zl9mbiAoc3RyZWFtLCAiLCIpOwotCSAgICAgIHN3aXRjaCAob3AtPmFyZ1tuXSkgCi0JCXsKLQkJY2FzZSBEU1BfUkVHX046Ci0JCSAgcHJpbnRfZHNwX3JlZyAoZmllbGRfYiAmIDB4ZiwgZnByaW50Zl9mbiwgc3RyZWFtKTsKLQkJICBicmVhazsKLQkJY2FzZSBEU1BfUkVHX1g6Ci0JCSAgZnByaW50Zl9mbiAoc3RyZWFtLCBzeF90YWJbKGZpZWxkX2IgPj4gNikgJiAzXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRFNQX1JFR19ZOgotCQkgIGZwcmludGZfZm4gKHN0cmVhbSwgc3lfdGFiWyhmaWVsZF9iID4+IDQpICYgM10pOwotCQkgIGJyZWFrOwotCQljYXNlIEFfTUFDSDoKLQkJICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtYWNoIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQV9NQUNMOgotCQkgIGZwcmludGZfZm4gKHN0cmVhbSAsIm1hY2wiKTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgLyogTm90IGZvdW5kLiAgKi8KLSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiLndvcmQgMHgleCIsIGZpZWxkX2IpOwotfQotCi1zdGF0aWMgaW50IAotcHJpbnRfaW5zbl9zaHggKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGZwcmludGZfZnR5cGUgZnByaW50Zl9mbiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICB1bnNpZ25lZCBjaGFyIGluc25bMl07Ci0gIHVuc2lnbmVkIGNoYXIgbmlic1s0XTsKLSAgaW50IHN0YXR1czsKLSAgYmZkX3ZtYSByZWxtYXNrID0gfiAoYmZkX3ZtYSkgMDsKLSAgc2hfb3Bjb2RlX2luZm8gKm9wOwotICBpbnQgdGFyZ2V0X2FyY2g7Ci0KLSAgc3dpdGNoIChpbmZvLT5tYWNoKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX3NoOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc2gyOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc2hfZHNwOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoX2RzcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc2gzOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc2gzX2RzcDoKLSAgICAgIHRhcmdldF9hcmNoID0gYXJjaF9zaDNfZHNwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9zaDNlOgotICAgICAgdGFyZ2V0X2FyY2ggPSBhcmNoX3NoM2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3NoNDoKLSAgICAgIHRhcmdldF9hcmNoID0gYXJjaF9zaDQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGluc24sIDIsIGluZm8pOwotCi0gIGlmIChzdGF0dXMgIT0gMCkgCi0gICAgewotICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5mbGFncyAmIExJVFRMRV9CSVQpIAotICAgIHsKLSAgICAgIG5pYnNbMF0gPSAoaW5zblsxXSA+PiA0KSAmIDB4ZjsKLSAgICAgIG5pYnNbMV0gPSBpbnNuWzFdICYgMHhmOwotCi0gICAgICBuaWJzWzJdID0gKGluc25bMF0gPj4gNCkgJiAweGY7Ci0gICAgICBuaWJzWzNdID0gaW5zblswXSAmIDB4ZjsKLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgbmlic1swXSA9IChpbnNuWzBdID4+IDQpICYgMHhmOwotICAgICAgbmlic1sxXSA9IGluc25bMF0gJiAweGY7Ci0KLSAgICAgIG5pYnNbMl0gPSAoaW5zblsxXSA+PiA0KSAmIDB4ZjsKLSAgICAgIG5pYnNbM10gPSBpbnNuWzFdICYgMHhmOwotICAgIH0KLQotICBpZiAobmlic1swXSA9PSAweGYgJiYgKG5pYnNbMV0gJiA0KSA9PSAwICYmIHRhcmdldF9hcmNoICYgYXJjaF9zaF9kc3BfdXApCi0gICAgewotICAgICAgaWYgKG5pYnNbMV0gJiA4KQotCXsKLQkgIGludCBmaWVsZF9iOwotCi0JICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyICsgMiwgaW5zbiwgMiwgaW5mbyk7Ci0KLQkgIGlmIChzdGF0dXMgIT0gMCkgCi0JICAgIHsKLQkgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyICsgMiwgaW5mbyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5mbGFncyAmIExJVFRMRV9CSVQpIAotCSAgICBmaWVsZF9iID0gaW5zblsxXSA8PCA4IHwgaW5zblswXTsKLQkgIGVsc2UKLQkgICAgZmllbGRfYiA9IGluc25bMF0gPDwgOCB8IGluc25bMV07Ci0KLQkgIHByaW50X2luc25fcHBpIChmaWVsZF9iLCBpbmZvKTsKLQkgIHByaW50X2luc25fZGR0ICgobmlic1sxXSA8PCA4KSB8IChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSwgaW5mbyk7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgICBwcmludF9pbnNuX2RkdCAoKG5pYnNbMV0gPDwgOCkgfCAobmlic1syXSA8PCA0KSB8IG5pYnNbM10sIGluZm8pOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICBmb3IgKG9wID0gc2hfdGFibGU7IG9wLT5uYW1lOyBvcCsrKSAKLSAgICB7Ci0gICAgICBpbnQgbjsKLSAgICAgIGludCBpbW0gPSAwOwotICAgICAgaW50IHJuID0gMDsKLSAgICAgIGludCBybSA9IDA7Ci0gICAgICBpbnQgcmIgPSAwOwotICAgICAgaW50IGRpc3BfcGM7Ci0gICAgICBiZmRfdm1hIGRpc3BfcGNfYWRkciA9IDA7Ci0KLSAgICAgIGlmICgob3AtPmFyY2ggJiB0YXJnZXRfYXJjaCkgPT0gMCkKLQlnb3RvIGZhaWw7Ci0gICAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKQotCXsKLQkgIGludCBpID0gb3AtPm5pYmJsZXNbbl07Ci0KLQkgIGlmIChpIDwgMTYpIAotCSAgICB7Ci0JICAgICAgaWYgKG5pYnNbbl0gPT0gaSkKLQkJY29udGludWU7Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0JICBzd2l0Y2ggKGkpCi0JICAgIHsKLQkgICAgY2FzZSBCUkFOQ0hfODoKLQkgICAgICBpbW0gPSAobmlic1syXSA8PCA0KSB8IChuaWJzWzNdKTsJICAKLQkgICAgICBpZiAoaW1tICYgMHg4MCkKLQkJaW1tIHw9IH4weGZmOwotCSAgICAgIGltbSA9ICgoY2hhcilpbW0pICogMiArIDQgOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgQlJBTkNIXzEyOgotCSAgICAgIGltbSA9ICgobmlic1sxXSkgPDwgOCkgfCAobmlic1syXSA8PCA0KSB8IChuaWJzWzNdKTsKLQkgICAgICBpZiAoaW1tICYgMHg4MDApCi0JCWltbSB8PSB+MHhmZmY7Ci0JICAgICAgaW1tID0gaW1tICogMiArIDQ7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fNDoKLQkgICAgICBpbW0gPSBuaWJzWzNdOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NXzRCWTI6Ci0JICAgICAgaW1tID0gbmlic1szXSA8PDE7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fNEJZNDoKLQkgICAgICBpbW0gPSBuaWJzWzNdIDw8MjsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTV84OgotCSAgICAgIGltbSA9IChuaWJzWzJdIDw8IDQpIHwgbmlic1szXTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIFBDUkVMSU1NXzhCWTI6Ci0JICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwxOwotCSAgICAgIHJlbG1hc2sgPSB+IChiZmRfdm1hKSAxOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZNDoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDI7Ci0JICAgICAgcmVsbWFzayA9IH4gKGJmZF92bWEpIDM7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fOEJZMjoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDE7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fOEJZNDoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDI7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBESVNQXzg6Ci0JICAgICAgaW1tID0gKG5pYnNbMl0gPDwgNCkgfCAobmlic1szXSk7CSAgCi0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBESVNQXzQ6Ci0JICAgICAgaW1tID0gbmlic1szXTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIFJFR19OOgotCSAgICAgIHJuID0gbmlic1tuXTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRUdfTToKLQkgICAgICBybSA9IG5pYnNbbl07Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX05NOgotCSAgICAgIHJuID0gKG5pYnNbbl0gJiAweGMpID4+IDI7Ci0JICAgICAgcm0gPSAobmlic1tuXSAmIDB4Myk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX0I6Ci0JICAgICAgcmIgPSBuaWJzW25dICYgMHgwNzsKLQkgICAgICBicmVhazsJCi0JICAgIGNhc2UgU0RUX1JFR19OOgotCSAgICAgIC8qIHNoLWRzcDogc2luZ2xlIGRhdGEgdHJhbnNmZXIuICAqLwotCSAgICAgIHJuID0gbmlic1tuXTsKLQkgICAgICBpZiAoKHJuICYgMHhjKSAhPSA0KQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcm4gPSBybiAmIDB4MzsKLQkgICAgICBybiB8PSAocm4gJiAyKSA8PCAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBQSToKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLQotICAgIG9rOgotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIlc1x0Iiwgb3AtPm5hbWUpOwotICAgICAgZGlzcF9wYyA9IDA7Ci0gICAgICBmb3IgKG4gPSAwOyBuIDwgMyAmJiBvcC0+YXJnW25dICE9IEFfRU5EOyBuKyspIAotCXsKLQkgIGlmIChuICYmIG9wLT5hcmdbMV0gIT0gQV9FTkQpCi0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIiwiKTsKLQkgIHN3aXRjaCAob3AtPmFyZ1tuXSkgCi0JICAgIHsKLQkgICAgY2FzZSBBX0lNTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIjJWQiLCAoY2hhcikoaW1tKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SMDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5DX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCsiLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfREVDX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQC1yJWQiLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5EX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCIsIHJuKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAoJWQsciVkKSIsIGltbSwgcm4pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1BNT0RfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkK3I4Iiwgcm4pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInIlZCIsIHJtKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0lOQ19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQrIiwgcm0pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RFQ19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAtciVkIiwgcm0pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0lORF9NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQiLCBybSk7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfRElTUF9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKCVkLHIlZCkiLCBpbW0sIHJtKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SRUdfQjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyJWRfYmFuayIsIHJiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RJU1BfUEM6Ci0JICAgICAgZGlzcF9wYyA9IDE7Ci0JICAgICAgZGlzcF9wY19hZGRyID0gaW1tICsgNCArIChtZW1hZGRyICYgcmVsbWFzayk7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChkaXNwX3BjX2FkZHIsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5EX1IwX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAocjAsciVkKSIsIHJuKTsKLQkgICAgICBicmVhazsgCi0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQChyMCxyJWQpIiwgcm0pOwotCSAgICAgIGJyZWFrOyAKLQkgICAgY2FzZSBBX0RJU1BfR0JSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAoJWQsZ2JyKSIsaW1tKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1IwX0dCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKHIwLGdicikiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0JESVNQMTI6Ci0JICAgIGNhc2UgQV9CRElTUDg6Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbW0gKyBtZW1hZGRyLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1NSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9HQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZ2JyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9WQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAidmJyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9EU1I6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZHNyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9NT0Q6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAibW9kIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SRToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyZSIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUlM6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAicnMiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0EwOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImEwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9YMDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4MCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfWDE6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAieDEiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1kwOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInkwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ZMToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ5MSIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERTUF9SRUdfTToKLQkgICAgICBwcmludF9kc3BfcmVnIChybSwgZnByaW50Zl9mbiwgc3RyZWFtKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1NTUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJzc3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1NQQzoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJzcGMiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX01BQ0g6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAibWFjaCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfTUFDTDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0gLCJtYWNsIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9QUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJwciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfU0dSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNnciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfREJSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImRiciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZyJWQiLCBybSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFhfUkVHX046Ci0JICAgICAgaWYgKHJuICYgMSkKLQkJewotCQkgIGZwcmludGZfZm4gKHN0cmVhbSwgInhkJWQiLCBybiAmIH4xKTsKLQkJICBicmVhazsKLQkJfQotCSAgICBkX3JlZ19uOgotCSAgICBjYXNlIERfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZHIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEWF9SRUdfTToKLQkgICAgICBpZiAocm0gJiAxKQotCQl7Ci0JCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAieGQlZCIsIHJtICYgfjEpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIGNhc2UgRF9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJkciVkIiwgcm0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZQU0NSX006Ci0JICAgIGNhc2UgRlBTQ1JfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmcHNjciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZQVUxfTToKLQkgICAgY2FzZSBGUFVMX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnB1bCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZfRlIwOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZyMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnYlZCIsIHJuKjQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnYlZCIsIHJtKjQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFhNVFJYX000OgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInhtdHJ4Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLQotI2lmIDAKLSAgICAgIC8qIFRoaXMgY29kZSBwcmludHMgaW5zdHJ1Y3Rpb25zIGluIGRlbGF5IHNsb3RzIG9uIHRoZSBzYW1lIGxpbmUKLSAgICAgICAgIGFzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBuZWVkcyB0aGUgZGVsYXkgc2xvdHMuICBUaGlzIGNhbiBiZQotICAgICAgICAgY29uZnVzaW5nLCBzaW5jZSBvdGhlciBkaXNhc3NlbWJsZXIgZG9uJ3Qgd29yayB0aGlzIHdheSwgYW5kCi0gICAgICAgICBpdCBtZWFucyB0aGF0IHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBhbGwgaW4gYSBsaW5lLiAgU28gSQotICAgICAgICAgZGlzYWJsZWQgaXQuICBJYW4uICAqLwotICAgICAgaWYgKCEoaW5mby0+ZmxhZ3MgJiAxKQotCSAgJiYgKG9wLT5uYW1lWzBdID09ICdqJwotCSAgICAgIHx8IChvcC0+bmFtZVswXSA9PSAnYicKLQkJICAmJiAob3AtPm5hbWVbMV0gPT0gJ3InIAotCQkgICAgICB8fCBvcC0+bmFtZVsxXSA9PSAncycpKQotCSAgICAgIHx8IChvcC0+bmFtZVswXSA9PSAncicgJiYgb3AtPm5hbWVbMV0gPT0gJ3QnKQotCSAgICAgIHx8IChvcC0+bmFtZVswXSA9PSAnYicgJiYgb3AtPm5hbWVbMl0gPT0gJy4nKSkpCi0JewotCSAgaW5mby0+ZmxhZ3MgfD0gMTsKLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgIlx0KHNsb3QgIik7Ci0JICBwcmludF9pbnNuX3NoeCAobWVtYWRkciArIDIsIGluZm8pOwotCSAgaW5mby0+ZmxhZ3MgJj0gfjE7Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICIpIik7Ci0JICByZXR1cm4gNDsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGRpc3BfcGMgJiYgc3RyY21wIChvcC0+bmFtZSwgIm1vdmEiKSAhPSAwKQotCXsKLQkgIGludCBzaXplOwotCSAgYmZkX2J5dGUgYnl0ZXNbNF07Ci0KLQkgIGlmIChyZWxtYXNrID09IH4gKGJmZF92bWEpIDEpCi0JICAgIHNpemUgPSAyOwotCSAgZWxzZQotCSAgICBzaXplID0gNDsKLQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGRpc3BfcGNfYWRkciwgYnl0ZXMsIHNpemUsIGluZm8pOwotCSAgaWYgKHN0YXR1cyA9PSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbDsKLQotCSAgICAgIGlmIChzaXplID09IDIpCi0JCXsKLQkJICBpZiAoKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgIT0gMCkKLQkJICAgIHZhbCA9IGJmZF9nZXRsMTYgKGJ5dGVzKTsKLQkJICBlbHNlCi0JCSAgICB2YWwgPSBiZmRfZ2V0YjE2IChieXRlcyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgIT0gMCkKLQkJICAgIHZhbCA9IGJmZF9nZXRsMzIgKGJ5dGVzKTsKLQkJICBlbHNlCi0JCSAgICB2YWwgPSBiZmRfZ2V0YjMyIChieXRlcyk7Ci0JCX0KLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJcdCEgMHgleCIsIHZhbCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJldHVybiAyOwotICAgIGZhaWw6Ci0gICAgICA7Ci0KLSAgICB9Ci0gIGZwcmludGZfZm4gKHN0cmVhbSwgIi53b3JkIDB4JXgleCV4JXgiLCBuaWJzWzBdLCBuaWJzWzFdLCBuaWJzWzJdLCBuaWJzWzNdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLWludCAKLXByaW50X2luc25fc2hsIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgcjsKLQotICBpbmZvLT5mbGFncyA9IExJVFRMRV9CSVQ7Ci0gIHIgPSBwcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbyk7Ci0gIHJldHVybiByOwotfQotCi1pbnQgCi1wcmludF9pbnNuX3NoIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgcjsKLQotICBpbmZvLT5mbGFncyA9IDA7Ci0gIHIgPSBwcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbyk7Ci0gIHJldHVybiByOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zaC1vcGMuaCBiL29wY29kZXMvc2gtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmZiY2QuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zaC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzMCArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3IgU0ggb3Bjb2Rlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlIRVhfMCwKLQlIRVhfMSwKLQlIRVhfMiwKLQlIRVhfMywKLQlIRVhfNCwKLQlIRVhfNSwKLQlIRVhfNiwKLQlIRVhfNywKLQlIRVhfOCwKLQlIRVhfOSwKLQlIRVhfQSwKLQlIRVhfQiwKLQlIRVhfQywKLQlIRVhfRCwKLQlIRVhfRSwKLQlIRVhfRiwKLQlSRUdfTiwKLQlSRUdfTSwKLQlTRFRfUkVHX04sCi0JUkVHX05NLAotICAgICAgICBSRUdfQiwKLQlCUkFOQ0hfMTIsCi0JQlJBTkNIXzgsCi0JRElTUF84LAotCURJU1BfNCwKLQlJTU1fNCwKLQlJTU1fNEJZMiwKLQlJTU1fNEJZNCwKLQlQQ1JFTElNTV84QlkyLAotCVBDUkVMSU1NXzhCWTQsCi0JSU1NXzgsCi0JSU1NXzhCWTIsCi0JSU1NXzhCWTQsCi0JUFBJLAotCU5PUFgsCi0JTk9QWSwKLQlNT1ZYLAotCU1PVlksCi0JUFNILAotCVBNVUwsCi0JUFBJMywKLQlQREMsCi0JUFBJQwotfSBzaF9uaWJibGVfdHlwZTsKLQotdHlwZWRlZiBlbnVtIHsKLQlBX0VORCwKLQlBX0JESVNQMTIsCi0JQV9CRElTUDgsCi0JQV9ERUNfTSwKLQlBX0RFQ19OLAotCUFfRElTUF9HQlIsCi0JQV9ESVNQX1BDLAotCUFfRElTUF9SRUdfTSwKLQlBX0RJU1BfUkVHX04sCi0JQV9HQlIsCi0JQV9JTU0sCi0JQV9JTkNfTSwKLQlBX0lOQ19OLAotCUFfSU5EX00sCi0JQV9JTkRfTiwKLQlBX1BNT0RfTiwKLQlBX1BNT0RZX04sCi0JQV9JTkRfUjBfUkVHX00sCi0JQV9JTkRfUjBfUkVHX04sCi0JQV9NQUNILAotCUFfTUFDTCwKLQlBX1BSLAotCUFfUjAsCi0JQV9SMF9HQlIsCi0JQV9SRUdfTSwKLQlBX1JFR19OLAotCUFfUkVHX0IsCi0JQV9TUiwKLQlBX1ZCUiwKLQlBX01PRCwKLQlBX1JFLAotCUFfUlMsCi0JQV9EU1IsCi0JRFNQX1JFR19NLAotCURTUF9SRUdfTiwKLQlEU1BfUkVHX1gsCi0JRFNQX1JFR19ZLAotCURTUF9SRUdfRSwKLQlEU1BfUkVHX0YsCi0JRFNQX1JFR19HLAotCUFfQTAsCi0JQV9YMCwKLQlBX1gxLAotCUFfWTAsCi0JQV9ZMSwKLQlBX1NTUiwKLQlBX1NQQywKLQlBX1NHUiwKLQlBX0RCUiwKLQlGX1JFR19OLAotCUZfUkVHX00sCi0JRF9SRUdfTiwKLQlEX1JFR19NLAotCVhfUkVHX04sIC8qIE9ubHkgdXNlZCBmb3IgYXJndW1lbnQgcGFyc2luZyAqLwotCVhfUkVHX00sIC8qIE9ubHkgdXNlZCBmb3IgYXJndW1lbnQgcGFyc2luZyAqLwotCURYX1JFR19OLAotCURYX1JFR19NLAotCVZfUkVHX04sCi0JVl9SRUdfTSwKLQlYTVRSWF9NNCwKLQlGX0ZSMCwKLQlGUFVMX04sCi0JRlBVTF9NLAotCUZQU0NSX04sCi0JRlBTQ1JfTQotfSBzaF9hcmdfdHlwZTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQV9BMV9OVU0gPSAgIDUsCi0gIEFfQTBfTlVNID0gICA3LAotICBBX1gwX05VTSwgQV9YMV9OVU0sIEFfWTBfTlVNLCBBX1kxX05VTSwKLSAgQV9NMF9OVU0sIEFfQTFHX05VTSwgQV9NMV9OVU0sIEFfQTBHX05VTQotfSBzaF9kc3BfcmVnX251bXM7Ci0KLSNkZWZpbmUgYXJjaF9zaDEgICAgIDB4MDAwMQotI2RlZmluZSBhcmNoX3NoMiAgICAgMHgwMDAyCi0jZGVmaW5lIGFyY2hfc2gzICAgICAweDAwMDQKLSNkZWZpbmUgYXJjaF9zaDNlICAgIDB4MDAwOAotI2RlZmluZSBhcmNoX3NoNCAgICAgMHgwMDEwCi0jZGVmaW5lIGFyY2hfc2hfZHNwICAweDAxMDAKLSNkZWZpbmUgYXJjaF9zaDNfZHNwIDB4MDIwMAotCi0jZGVmaW5lIGFyY2hfc2gxX3VwIChhcmNoX3NoMSB8IGFyY2hfc2gyX3VwKQotI2RlZmluZSBhcmNoX3NoMl91cCAoYXJjaF9zaDIgfCBhcmNoX3NoM191cCB8IGFyY2hfc2hfZHNwKQotI2RlZmluZSBhcmNoX3NoM191cCAoYXJjaF9zaDMgfCBhcmNoX3NoM2VfdXAgfCBhcmNoX3NoM19kc3ApCi0jZGVmaW5lIGFyY2hfc2gzZV91cCAoYXJjaF9zaDNlIHwgYXJjaF9zaDRfdXApCi0jZGVmaW5lIGFyY2hfc2g0X3VwIGFyY2hfc2g0Ci0KLSNkZWZpbmUgYXJjaF9zaF9kc3BfdXAgKGFyY2hfc2hfZHNwIHwgYXJjaF9zaDNfZHNwX3VwKQotI2RlZmluZSBhcmNoX3NoM19kc3BfdXAgYXJjaF9zaDNfZHNwCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqbmFtZTsKLSAgc2hfYXJnX3R5cGUgYXJnWzRdOwotICBzaF9uaWJibGVfdHlwZSBuaWJibGVzWzRdOwotICBpbnQgYXJjaDsKLX0gc2hfb3Bjb2RlX2luZm87Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLQotc2hfb3Bjb2RlX2luZm8gc2hfdGFibGVbXSA9IHsKLQotLyogMDExMW5ubm5pOCoxLi4uLiBhZGQgIzxpbW0+LDxSRUdfTj4gICoveyJhZGQiLHtBX0lNTSxBX1JFR19OfSx7SEVYXzcsUkVHX04sSU1NXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTFubm5ubW1tbTExMDAgYWRkIDxSRUdfTT4sPFJFR19OPiAqL3siYWRkIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9DfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0xMTEwIGFkZGMgPFJFR19NPiw8UkVHX04+Ki97ImFkZGMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0V9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTFubm5ubW1tbTExMTEgYWRkdiA8UkVHX00+LDxSRUdfTj4qL3siYWRkdiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDEwMDFpOCoxLi4uLiBhbmQgIzxpbW0+LFIwICAgICAgICoveyJhbmQiLHtBX0lNTSxBX1IwfSx7SEVYX0MsSEVYXzksSU1NXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTEwMDEgYW5kIDxSRUdfTT4sPFJFR19OPiAqL3siYW5kIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF85fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMTEwMWk4KjEuLi4uIGFuZC5iICM8aW1tPixAKFIwLEdCUikqL3siYW5kLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9ELElNTV84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMDEwaTEyLi4uLi4uLi4uIGJyYSA8YmRpc3AxMj4gICAgICAgKi97ImJyYSIse0FfQkRJU1AxMn0se0hFWF9BLEJSQU5DSF8xMn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTAxMWkxMi4uLi4uLi4uLiBic3IgPGJkaXNwMTI+ICAgICAgICoveyJic3IiLHtBX0JESVNQMTJ9LHtIRVhfQixCUkFOQ0hfMTJ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDEwMDAxMDAxaThwMS4uLi4gYnQgPGJkaXNwOD4gICAgICAgICAqL3siYnQiLHtBX0JESVNQOH0se0hFWF84LEhFWF85LEJSQU5DSF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMDAwMTAxMWk4cDEuLi4uIGJmIDxiZGlzcDg+ICAgICAgICAgKi97ImJmIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfQixCUkFOQ0hfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTAwMDExMDFpOHAxLi4uLiBidC5zIDxiZGlzcDg+ICAgICAgICoveyJidC5zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRCxCUkFOQ0hfOH0sIGFyY2hfc2gyX3VwfSwKLQotLyogMTAwMDExMDFpOHAxLi4uLiBidC9zIDxiZGlzcDg+ICAgICAgICoveyJidC9zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRCxCUkFOQ0hfOH0sIGFyY2hfc2gyX3VwfSwKLQotLyogMTAwMDExMTFpOHAxLi4uLiBiZi5zIDxiZGlzcDg+ICAgICAgICoveyJiZi5zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRixCUkFOQ0hfOH0sIGFyY2hfc2gyX3VwfSwKLQotLyogMTAwMDExMTFpOHAxLi4uLiBiZi9zIDxiZGlzcDg+ICAgICAgICoveyJiZi9zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRixCUkFOQ0hfOH0sIGFyY2hfc2gyX3VwfSwKLQotLyogMDAwMDAwMDAwMDEwMTAwMCBjbHJtYWMgICAgICAgICAgICAgICoveyJjbHJtYWMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzIsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDAwMDAwMDEwMDEwMDAgY2xycyAgICAgICAgICAgICAgICAqL3siY2xycyIsezB9LHtIRVhfMCxIRVhfMCxIRVhfNCxIRVhfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMDAwMDAwMDAwMTAwMCBjbHJ0ICAgICAgICAgICAgICAgICoveyJjbHJ0Iix7MH0se0hFWF8wLEhFWF8wLEhFWF8wLEhFWF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMDAwMTAwMGk4KjEuLi4uIGNtcC9lcSAjPGltbT4sUjAgICAgKi97ImNtcC9lcSIse0FfSU1NLEFfUjB9LHtIRVhfOCxIRVhfOCxJTU1fOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMW5ubm5tbW1tMDAwMCBjbXAvZXEgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9lcSIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfMH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMW5ubm5tbW1tMDAxMSBjbXAvZ2UgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9nZSIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfM30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMW5ubm5tbW1tMDExMSBjbXAvZ3QgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9ndCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfN30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMW5ubm5tbW1tMDExMCBjbXAvaGkgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9oaSIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfNn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMW5ubm5tbW1tMDAxMCBjbXAvaHMgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9ocyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfMn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMDEwMSBjbXAvcGwgPFJFR19OPiAgICAgICoveyJjbXAvcGwiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzV9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMTAwMDEgY21wL3B6IDxSRUdfTj4gICAgICAqL3siY21wL3B6Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8xfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0xMTAwIGNtcC9zdHIgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9zdHIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0N9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTAxMTEgZGl2MHMgPFJFR19NPiw8UkVHX04+Ki97ImRpdjBzIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF83fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwMDAwMDAwMDExMDAxIGRpdjB1ICAgICAgICAgICAgICAgKi97ImRpdjB1Iix7MH0se0hFWF8wLEhFWF8wLEhFWF8xLEhFWF85fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0wMTAwIGRpdjEgPFJFR19NPiw8UkVHX04+Ki97ImRpdjEiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzR9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMTBubm5ubW1tbTExMTAgZXh0cy5iIDxSRUdfTT4sPFJFR19OPioveyJleHRzLmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0V9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMTBubm5ubW1tbTExMTEgZXh0cy53IDxSRUdfTT4sPFJFR19OPioveyJleHRzLnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0Z9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMTBubm5ubW1tbTExMDAgZXh0dS5iIDxSRUdfTT4sPFJFR19OPioveyJleHR1LmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0N9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMTBubm5ubW1tbTExMDEgZXh0dS53IDxSRUdfTT4sPFJFR19OPioveyJleHR1LnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0R9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAxMDEwMTEgam1wIEA8UkVHX04+ICAgICAgICAqL3siam1wIix7QV9JTkRfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF9CfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDAxMDExIGpzciBAPFJFR19OPiAgICAgICAgKi97ImpzciIse0FfSU5EX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfQn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAwMTExMCBsZGMgPFJFR19OPixTUiAgICAgICoveyJsZGMiLHtBX1JFR19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfRX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMTExMCBsZGMgPFJFR19OPixHQlIgICAgICoveyJsZGMiLHtBX1JFR19OLEFfR0JSfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYX0V9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAxMDExMTAgbGRjIDxSRUdfTj4sVkJSICAgICAqL3sibGRjIix7QV9SRUdfTixBX1ZCUn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF9FfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAxMDExMTEwIGxkYyA8UkVHX04+LE1PRCAgICAgKi97ImxkYyIse0FfUkVHX04sQV9NT0R9LHtIRVhfNCxSRUdfTixIRVhfNSxIRVhfRX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4wMTExMTExMCBsZGMgPFJFR19OPixSRSAgICAgKi97ImxkYyIse0FfUkVHX04sQV9SRX0se0hFWF80LFJFR19OLEhFWF83LEhFWF9FfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTAxMTEwIGxkYyA8UkVHX04+LFJTICAgICAqL3sibGRjIix7QV9SRUdfTixBX1JTfSx7SEVYXzQsUkVHX04sSEVYXzYsSEVYX0V9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDAxMTExMTAgbGRjIDxSRUdfTj4sU1NSICAgICAqL3sibGRjIix7QV9SRUdfTixBX1NTUn0se0hFWF80LFJFR19OLEhFWF8zLEhFWF9FfSwgYXJjaF9zaDNfdXB9LAotCi0vKiAwMTAwbm5ubjAxMDAxMTEwIGxkYyA8UkVHX04+LFNQQyAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TUEN9LHtIRVhfNCxSRUdfTixIRVhfNCxIRVhfRX0sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4xMTExMTAxMCBsZGMgPFJFR19OPixEQlIgICAgICoveyJsZGMiLHtBX1JFR19OLEFfREJSfSx7SEVYXzQsUkVHX04sSEVYX0YsSEVYX0F9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDAxMDBubm5uMXh4eDExMTAgbGRjIDxSRUdfTj4sUm5fQkFOSyAqL3sibGRjIix7QV9SRUdfTixBX1JFR19CfSx7SEVYXzQsUkVHX04sUkVHX0IsSEVYX0V9LCBhcmNoX3NoM191cH0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFNSICAqL3sibGRjLmwiLHtBX0lOQ19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfN30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMDExMSBsZGMubCBAPFJFR19OPissR0JSICoveyJsZGMubCIse0FfSU5DX04sQV9HQlJ9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfN30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMDExMSBsZGMubCBAPFJFR19OPissVkJSICoveyJsZGMubCIse0FfSU5DX04sQV9WQlJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfN30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMTAxMDExMSBsZGMubCBAPFJFR19OPissTU9EICoveyJsZGMubCIse0FfSU5DX04sQV9NT0R9LHtIRVhfNCxSRUdfTixIRVhfNSxIRVhfN30sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4wMTExMDExMSBsZGMubCBAPFJFR19OPissUkUgKi97ImxkYy5sIix7QV9JTkNfTixBX1JFfSx7SEVYXzQsUkVHX04sSEVYXzcsSEVYXzd9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDExMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFJTICoveyJsZGMubCIse0FfSU5DX04sQV9SU30se0hFWF80LFJFR19OLEhFWF82LEhFWF83fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTEwMTExIGxkYy5sIEA8UkVHX04+KyxTU1IgKi97ImxkYy5sIix7QV9JTkNfTixBX1NTUn0se0hFWF80LFJFR19OLEhFWF8zLEhFWF83fSwgYXJjaF9zaDNfdXB9LAotCi0vKiAwMTAwbm5ubjAxMDAwMTExIGxkYy5sIEA8UkVHX04+KyxTUEMgKi97ImxkYy5sIix7QV9JTkNfTixBX1NQQ30se0hFWF80LFJFR19OLEhFWF80LEhFWF83fSwgYXJjaF9zaDNfdXB9LAotCi0vKiAwMTAwbm5ubjExMTEwMTEwIGxkYy5sIEA8UkVHX04+KyxEQlIgKi97ImxkYy5sIix7QV9JTkNfTixBX0RCUn0se0hFWF80LFJFR19OLEhFWF9GLEhFWF82fSwgYXJjaF9zaDRfdXB9LAotCi0vKiAwMTAwbm5ubjF4eHgwMTExIGxkYy5sIDxSRUdfTj4sUm5fQkFOSyAqL3sibGRjLmwiLHtBX0lOQ19OLEFfUkVHX0J9LHtIRVhfNCxSRUdfTixSRUdfQixIRVhfN30sIGFyY2hfc2gzX3VwfSwKLQotLyogMTAwMDExMTBpOHAyLi4uLiBsZHJlIEAoPGRpc3A+LFBDKQkqL3sibGRyZSIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0UsQlJBTkNIXzh9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDEwMDAxMTAwaThwMi4uLi4gbGRycyBAKDxkaXNwPixQQykJKi97ImxkcnMiLHtBX0JESVNQOH0se0hFWF84LEhFWF9DLEJSQU5DSF84fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDAxMDEwIGxkcyA8UkVHX04+LE1BQ0ggICAgKi97ImxkcyIse0FfUkVHX04sQV9NQUNIfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYX0F9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMTAgbGRzIDxSRUdfTj4sTUFDTCAgICAqL3sibGRzIix7QV9SRUdfTixBX01BQ0x9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfQX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMTAxMCBsZHMgPFJFR19OPixQUiAgICAgICoveyJsZHMiLHtBX1JFR19OLEFfUFJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfQX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMTEwMTAxMCBsZHMgPFJFR19OPixEU1IJKi97ImxkcyIse0FfUkVHX04sQV9EU1J9LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfQX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4wMTExMTAxMCBsZHMgPFJFR19OPixBMAkqL3sibGRzIix7QV9SRUdfTixBX0EwfSx7SEVYXzQsUkVHX04sSEVYXzcsSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMTAwMDEwMTAgbGRzIDxSRUdfTj4sWDAJKi97ImxkcyIse0FfUkVHX04sQV9YMH0se0hFWF80LFJFR19OLEhFWF84LEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjEwMDExMDEwIGxkcyA8UkVHX04+LFgxCSoveyJsZHMiLHtBX1JFR19OLEFfWDF9LHtIRVhfNCxSRUdfTixIRVhfOSxIRVhfQX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4xMDEwMTAxMCBsZHMgPFJFR19OPixZMAkqL3sibGRzIix7QV9SRUdfTixBX1kwfSx7SEVYXzQsUkVHX04sSEVYX0EsSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMTAxMTEwMTAgbGRzIDxSRUdfTj4sWTEJKi97ImxkcyIse0FfUkVHX04sQV9ZMX0se0hFWF80LFJFR19OLEhFWF9CLEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMDExMDEwIGxkcyA8UkVHX04+LEZQVUwgICAgKi97ImxkcyIse0FfUkVHX00sRlBVTF9OfSx7SEVYXzQsUkVHX00sSEVYXzUsSEVYX0F9LCBhcmNoX3NoM2VfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTAxMDEwIGxkcyA8UkVHX00+LEZQU0NSICAgKi97ImxkcyIse0FfUkVHX00sRlBTQ1JfTn0se0hFWF80LFJFR19NLEhFWF82LEhFWF9BfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMDEwMG5ubm4wMDAwMDExMCBsZHMubCBAPFJFR19OPissTUFDSCoveyJsZHMubCIse0FfSU5DX04sQV9NQUNIfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzZ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMTAxMTAgbGRzLmwgQDxSRUdfTj4rLE1BQ0wqL3sibGRzLmwiLHtBX0lOQ19OLEFfTUFDTH0se0hFWF80LFJFR19OLEhFWF8xLEhFWF82fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTAwMTEwIGxkcy5sIEA8UkVHX04+KyxQUiAgKi97Imxkcy5sIix7QV9JTkNfTixBX1BSfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzZ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDExMDAxMTAgbGRzLmwgQDxSRUdfTj4rLERTUgkqL3sibGRzLmwiLHtBX0lOQ19OLEFfRFNSfSx7SEVYXzQsUkVHX04sSEVYXzYsSEVYXzZ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDExMTAxMTAgbGRzLmwgQDxSRUdfTj4rLEEwCSoveyJsZHMubCIse0FfSU5DX04sQV9BMH0se0hFWF80LFJFR19OLEhFWF83LEhFWF82fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjEwMDAwMTEwIGxkcy5sIEA8UkVHX04+KyxYMAkqL3sibGRzLmwiLHtBX0lOQ19OLEFfWDB9LHtIRVhfNCxSRUdfTixIRVhfOCxIRVhfNn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4xMDAxMDExMCBsZHMubCBAPFJFR19OPissWDEJKi97Imxkcy5sIix7QV9JTkNfTixBX1gxfSx7SEVYXzQsUkVHX04sSEVYXzksSEVYXzZ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMTAxMDAxMTAgbGRzLmwgQDxSRUdfTj4rLFkwCSoveyJsZHMubCIse0FfSU5DX04sQV9ZMH0se0hFWF80LFJFR19OLEhFWF9BLEhFWF82fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjEwMTEwMTEwIGxkcy5sIEA8UkVHX04+KyxZMQkqL3sibGRzLmwiLHtBX0lOQ19OLEFfWTF9LHtIRVhfNCxSRUdfTixIRVhfQixIRVhfNn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4wMTAxMDExMCBsZHMubCBAPFJFR19NPissRlBVTCoveyJsZHMubCIse0FfSU5DX00sRlBVTF9OfSx7SEVYXzQsUkVHX00sSEVYXzUsSEVYXzZ9LCBhcmNoX3NoM2VfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTAwMTEwIGxkcy5sIEA8UkVHX00+KyxGUFNDUioveyJsZHMubCIse0FfSU5DX00sRlBTQ1JfTn0se0hFWF80LFJFR19NLEhFWF82LEhFWF82fSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMDAwMDAwMDAwMDExMTAwMCBsZHRsYiAgICAgICAgICAgICAgICoveyJsZHRsYiIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMyxIRVhfOH0sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm5tbW1tMTExMSBtYWMudyBAPFJFR19NPissQDxSRUdfTj4rKi97Im1hYy53Iix7QV9JTkNfTSxBX0lOQ19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0Z9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDExMTBubm5uaTgqMS4uLi4gbW92ICM8aW1tPiw8UkVHX04+ICAqL3sibW92Iix7QV9JTU0sQV9SRUdfTn0se0hFWF9FLFJFR19OLElNTV84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTEwbm5ubm1tbW0wMDExIG1vdiA8UkVHX00+LDxSRUdfTj4gKi97Im1vdiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfM30sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm5tbW1tMDEwMCBtb3YuYiA8UkVHX00+LEAoUjAsPFJFR19OPikqL3sibW92LmIiLHsgQV9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF80fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0wMTAwIG1vdi5iIDxSRUdfTT4sQC08UkVHX04+Ki97Im1vdi5iIix7IEFfUkVHX00sQV9ERUNfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF80fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0wMDAwIG1vdi5iIDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LmIiLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzB9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDEwMDAwMTAwbW1tbWk0KjEgbW92LmIgQCg8ZGlzcD4sPFJFR19NPiksUjAqL3sibW92LmIiLHtBX0RJU1BfUkVHX00sQV9SMH0se0hFWF84LEhFWF80LFJFR19NLElNTV80fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMDEwMGk4KjEuLi4uIG1vdi5iIEAoPGRpc3A+LEdCUiksUjAqL3sibW92LmIiLHtBX0RJU1BfR0JSLEFfUjB9LHtIRVhfQyxIRVhfNCxJTU1fOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm5tbW1tMTEwMCBtb3YuYiBAKFIwLDxSRUdfTT4pLDxSRUdfTj4qL3sibW92LmIiLHtBX0lORF9SMF9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYX0N9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMTBubm5ubW1tbTAxMDAgbW92LmIgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LmIiLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMDAwMCBtb3YuYiBAPFJFR19NPiw8UkVHX04+Ki97Im1vdi5iIix7QV9JTkRfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzB9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDEwMDAwMDAwbW1tbWk0KjEgbW92LmIgUjAsQCg8ZGlzcD4sPFJFR19NPikqL3sibW92LmIiLHtBX1IwLEFfRElTUF9SRUdfTX0se0hFWF84LEhFWF8wLFJFR19NLElNTV80fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMDAwMGk4KjEuLi4uIG1vdi5iIFIwLEAoPGRpc3A+LEdCUikqL3sibW92LmIiLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMCxJTU1fOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMW5ubm5tbW1taTQqNCBtb3YubCA8UkVHX00+LEAoPGRpc3A+LDxSRUdfTj4pKi97Im1vdi5sIix7IEFfUkVHX00sQV9ESVNQX1JFR19OfSx7SEVYXzEsUkVHX04sUkVHX00sSU1NXzRCWTR9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5ubW1tbTAxMTAgbW92LmwgPFJFR19NPixAKFIwLDxSRUdfTj4pKi97Im1vdi5sIix7IEFfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfNn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMG5ubm5tbW1tMDExMCBtb3YubCA8UkVHX00+LEAtPFJFR19OPioveyJtb3YubCIseyBBX1JFR19NLEFfREVDX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfNn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAxMG5ubm5tbW1tMDAxMCBtb3YubCA8UkVHX00+LEA8UkVHX04+Ki97Im1vdi5sIix7IEFfUkVHX00sQV9JTkRfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF8yfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAxbm5ubm1tbW1pNCo0IG1vdi5sIEAoPGRpc3A+LDxSRUdfTT4pLDxSRUdfTj4qL3sibW92LmwiLHtBX0RJU1BfUkVHX00sQV9SRUdfTn0se0hFWF81LFJFR19OLFJFR19NLElNTV80Qlk0fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMDExMGk4KjQuLi4uIG1vdi5sIEAoPGRpc3A+LEdCUiksUjAqL3sibW92LmwiLHtBX0RJU1BfR0JSLEFfUjB9LHtIRVhfQyxIRVhfNixJTU1fOEJZNH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMW5ubm5pOHA0Li4uLiBtb3YubCBAKDxkaXNwPixQQyksPFJFR19OPioveyJtb3YubCIse0FfRElTUF9QQyxBX1JFR19OfSx7SEVYX0QsUkVHX04sUENSRUxJTU1fOEJZNH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm5tbW1tMTExMCBtb3YubCBAKFIwLDxSRUdfTT4pLDxSRUdfTj4qL3sibW92LmwiLHtBX0lORF9SMF9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYX0V9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMTBubm5ubW1tbTAxMTAgbW92LmwgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LmwiLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMDAxMCBtb3YubCBAPFJFR19NPiw8UkVHX04+Ki97Im1vdi5sIix7QV9JTkRfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzJ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDExMDAwMDEwaTgqNC4uLi4gbW92LmwgUjAsQCg8ZGlzcD4sR0JSKSoveyJtb3YubCIse0FfUjAsQV9ESVNQX0dCUn0se0hFWF9DLEhFWF8yLElNTV84Qlk0fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwbm5ubm1tbW0wMTAxIG1vdi53IDxSRUdfTT4sQChSMCw8UkVHX04+KSoveyJtb3YudyIseyBBX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzV9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTAxMDEgbW92LncgPFJFR19NPixALTxSRUdfTj4qL3sibW92LnciLHsgQV9SRUdfTSxBX0RFQ19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzV9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTAwMDEgbW92LncgPFJFR19NPixAPFJFR19OPioveyJtb3YudyIseyBBX1JFR19NLEFfSU5EX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfMX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTAwMDAxMDFtbW1taTQqMiBtb3YudyBAKDxkaXNwPiw8UkVHX00+KSxSMCoveyJtb3YudyIse0FfRElTUF9SRUdfTSxBX1IwfSx7SEVYXzgsSEVYXzUsUkVHX00sSU1NXzRCWTJ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDExMDAwMTAxaTgqMi4uLi4gbW92LncgQCg8ZGlzcD4sR0JSKSxSMCoveyJtb3YudyIse0FfRElTUF9HQlIsQV9SMH0se0hFWF9DLEhFWF81LElNTV84QlkyfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMDAxbm5ubmk4cDIuLi4uIG1vdi53IEAoPGRpc3A+LFBDKSw8UkVHX04+Ki97Im1vdi53Iix7QV9ESVNQX1BDLEFfUkVHX059LHtIRVhfOSxSRUdfTixQQ1JFTElNTV84QlkyfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwbm5ubm1tbW0xMTAxIG1vdi53IEAoUjAsPFJFR19NPiksPFJFR19OPioveyJtb3YudyIse0FfSU5EX1IwX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfRH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMDEwMSBtb3YudyBAPFJFR19NPissPFJFR19OPioveyJtb3YudyIse0FfSU5DX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF81fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTEwbm5ubm1tbW0wMDAxIG1vdi53IEA8UkVHX00+LDxSRUdfTj4qL3sibW92LnciLHtBX0lORF9NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfMX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTAwMDAwMDFtbW1taTQqMiBtb3YudyBSMCxAKDxkaXNwPiw8UkVHX00+KSoveyJtb3YudyIse0FfUjAsQV9ESVNQX1JFR19NfSx7SEVYXzgsSEVYXzEsUkVHX00sSU1NXzRCWTJ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDExMDAwMDAxaTgqMi4uLi4gbW92LncgUjAsQCg8ZGlzcD4sR0JSKSoveyJtb3YudyIse0FfUjAsQV9ESVNQX0dCUn0se0hFWF9DLEhFWF8xLElNTV84QlkyfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMDExMWk4cDQuLi4uIG1vdmEgQCg8ZGlzcD4sUEMpLFIwKi97Im1vdmEiLHtBX0RJU1BfUEMsQV9SMH0se0hFWF9DLEhFWF83LFBDUkVMSU1NXzhCWTR9LCBhcmNoX3NoMV91cH0sCi0vKiAwMDAwbm5ubjExMDAwMDExIG1vdmNhLmwgUjAsQDxSRUdfTj4gKi97Im1vdmNhLmwiLHtBX1IwLEFfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQyxIRVhfM30sIGFyY2hfc2g0X3VwfSwKLQotCi0vKiAwMDAwbm5ubjAwMTAxMDAxIG1vdnQgPFJFR19OPiAgICAgICAgKi97Im1vdnQiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYXzl9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTExMTEgbXVscy53IDxSRUdfTT4sPFJFR19OPioveyJtdWxzLnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0Z9LCBhcmNoX3NoMV91cH0sCi0vKiAwMDEwbm5ubm1tbW0xMTExIG11bHMgPFJFR19NPiw8UkVHX04+Ki97Im11bHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0Z9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5ubW1tbTAxMTEgbXVsLmwgPFJFR19NPiw8UkVHX04+Ki97Im11bC5sIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF83fSwgYXJjaF9zaDJfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0xMTEwIG11bHUudyA8UkVHX00+LDxSRUdfTj4qL3sibXVsdS53Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9FfSwgYXJjaF9zaDFfdXB9LAotLyogMDAxMG5ubm5tbW1tMTExMCBtdWx1IDxSRUdfTT4sPFJFR19OPioveyJtdWx1Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9FfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTEwbm5ubm1tbW0xMDExIG5lZyA8UkVHX00+LDxSRUdfTj4gKi97Im5lZyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfQn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTAxMCBuZWdjIDxSRUdfTT4sPFJFR19OPioveyJuZWdjIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9BfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwMDAwMDAwMDAxMDAxIG5vcCAgICAgICAgICAgICAgICAgKi97Im5vcCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMDExMSBub3QgPFJFR19NPiw8UkVHX04+ICoveyJub3QiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzd9LCBhcmNoX3NoMV91cH0sCi0vKiAwMDAwbm5ubjEwMDEwMDExIG9jYmkgQDxSRUdfTj4gICAgICAgKi97Im9jYmkiLHtBX0lORF9OfSx7SEVYXzAsUkVHX04sSEVYXzksSEVYXzN9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDAwMDBubm5uMTAxMDAwMTEgb2NicCBAPFJFR19OPiAgICAgICAqL3sib2NicCIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQSxIRVhfM30sIGFyY2hfc2g0X3VwfSwKLQotLyogMDAwMG5ubm4xMDExMDAxMSBvY2J3YiBAPFJFR19OPiAgICAgICoveyJvY2J3YiIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQixIRVhfM30sIGFyY2hfc2g0X3VwfSwKLQotCi0vKiAxMTAwMTAxMWk4KjEuLi4uIG9yICM8aW1tPixSMCAgICAgICAgKi97Im9yIix7QV9JTU0sQV9SMH0se0hFWF9DLEhFWF9CLElNTV84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0xMDExIG9yIDxSRUdfTT4sPFJFR19OPiAgKi97Im9yIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9CfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMTExMWk4KjEuLi4uIG9yLmIgIzxpbW0+LEAoUjAsR0JSKSoveyJvci5iIix7QV9JTU0sQV9SMF9HQlJ9LHtIRVhfQyxIRVhfRixJTU1fOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm4xMDAwMDAxMSBwcmVmIEA8UkVHX04+ICAgICAgICoveyJwcmVmIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF84LEhFWF8zfSwgYXJjaF9zaDRfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTAwMTAwIHJvdGNsIDxSRUdfTj4gICAgICAgKi97InJvdGNsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF80fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTAwMTAxIHJvdGNyIDxSRUdfTj4gICAgICAgKi97InJvdGNyIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF81fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDAwMTAwIHJvdGwgPFJFR19OPiAgICAgICAgKi97InJvdGwiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzR9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMDEgcm90ciA8UkVHX04+ICAgICAgICAqL3sicm90ciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfNX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMDAwMDAwMDEwMTAxMSBydGUgICAgICAgICAgICAgICAgICoveyJydGUiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzIsSEVYX0J9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDAwMDAwMDAwMDEwMTEgcnRzICAgICAgICAgICAgICAgICAqL3sicnRzIix7MH0se0hFWF8wLEhFWF8wLEhFWF8wLEhFWF9CfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwMDAwMDAxMDExMDAwIHNldHMgICAgICAgICAgICAgICAgKi97InNldHMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzUsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0vKiAwMDAwMDAwMDAwMDExMDAwIHNldHQgICAgICAgICAgICAgICAgKi97InNldHQiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMTAxMDAgc2V0cmMgPFJFR19OPiAgICAgICAqL3sic2V0cmMiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzR9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDEwMDAwMDEwaTgqMS4uLi4gc2V0cmMgIzxpbW0+ICAgICAgICAqL3sic2V0cmMiLHtBX0lNTX0se0hFWF84LEhFWF8yLElNTV84fSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubm1tbW0xMTAwIHNoYWQgPFJFR19NPiw8UkVHX04+Ki97InNoYWQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0N9LCBhcmNoX3NoM191cH0sCi0KLS8qIDAxMDBubm5ubW1tbTExMDEgc2hsZCA8UkVHX00+LDxSRUdfTj4qL3sic2hsZCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNCxSRUdfTixSRUdfTSxIRVhfRH0sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMDAwMCBzaGFsIDxSRUdfTj4gICAgICAgICoveyJzaGFsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8wfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTAwMDAxIHNoYXIgPFJFR19OPiAgICAgICAgKi97InNoYXIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzF9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMDAgc2hsbCA8UkVHX04+ICAgICAgICAqL3sic2hsbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfMH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMTAwMCBzaGxsMTYgPFJFR19OPiAgICAgICoveyJzaGxsMTYiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMDAgc2hsbDIgPFJFR19OPiAgICAgICAqL3sic2hsbDIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMDAgc2hsbDggPFJFR19OPiAgICAgICAqL3sic2hsbDgiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMDEgc2hsciA8UkVHX04+ICAgICAgICAqL3sic2hsciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfMX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMTAwMSBzaGxyMTYgPFJFR19OPiAgICAgICoveyJzaGxyMTYiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzl9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMDEgc2hscjIgPFJFR19OPiAgICAgICAqL3sic2hscjIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzl9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMDEgc2hscjggPFJFR19OPiAgICAgICAqL3sic2hscjgiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzl9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDAwMDAwMDAwMTEwMTEgc2xlZXAgICAgICAgICAgICAgICAqL3sic2xlZXAiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYX0J9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5uMDAwMDAwMTAgc3RjIFNSLDxSRUdfTj4gICAgICAqL3sic3RjIix7QV9TUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzAsSEVYXzJ9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5uMDAwMTAwMTAgc3RjIEdCUiw8UkVHX04+ICAgICAqL3sic3RjIix7QV9HQlIsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8xLEhFWF8yfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwbm5ubjAwMTAwMDEwIHN0YyBWQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfVkJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfMn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm4wMTAxMDAxMCBzdGMgTU9ELDxSRUdfTj4gICAgICoveyJzdGMiLHtBX01PRCxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzUsSEVYXzJ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAwMDBubm5uMDExMTAwMTAgc3RjIFJFLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX1JFLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNyxIRVhfMn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDAwMG5ubm4wMTEwMDAxMCBzdGMgUlMsPFJFR19OPiAgICAgKi97InN0YyIse0FfUlMsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF82LEhFWF8yfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMDAwbm5ubjAwMTEwMDEwIHN0YyBTU1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMyxIRVhfMn0sIGFyY2hfc2gzX3VwfSwKLQotLyogMDAwMG5ubm4wMTAwMDAxMCBzdGMgU1BDLDxSRUdfTj4gICAgICoveyJzdGMiLHtBX1NQQyxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzQsSEVYXzJ9LCBhcmNoX3NoM191cH0sCi0KLS8qIDAwMDBubm5uMDAxMTEwMTAgc3RjIFNHUiw8UkVHX04+ICAgICAqL3sic3RjIix7QV9TR1IsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8zLEhFWF9BfSwgYXJjaF9zaDRfdXB9LAotCi0vKiAwMDAwbm5ubjExMTExMDEwIHN0YyBEQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfREJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfRixIRVhfQX0sIGFyY2hfc2g0X3VwfSwKLQotLyogMDAwMG5ubm4xeHh4MDAxMCBzdGMgUm5fQkFOSyw8UkVHX04+ICoveyJzdGMiLHtBX1JFR19CLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfQixIRVhfMn0sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4wMDAwMDAxMSBzdGMubCBTUixALTxSRUdfTj4gICoveyJzdGMubCIse0FfU1IsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8zfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMTAwMDExIHN0Yy5sIFZCUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9WQlIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8zfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAxMDEwMDExIHN0Yy5sIE1PRCxALTxSRUdfTj4gKi97InN0Yy5sIix7QV9NT0QsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF81LEhFWF8zfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTEwMDExIHN0Yy5sIFJFLEAtPFJFR19OPiAgKi97InN0Yy5sIix7QV9SRSxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzcsSEVYXzN9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDExMDAwMTEgc3RjLmwgUlMsQC08UkVHX04+ICAqL3sic3RjLmwiLHtBX1JTLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfM30sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4wMDExMDAxMSBzdGMubCBTU1IsQC08UkVHX04+ICoveyJzdGMubCIse0FfU1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfM30sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4wMTAwMDAxMSBzdGMubCBTUEMsQC08UkVHX04+ICoveyJzdGMubCIse0FfU1BDLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNCxIRVhfM30sIGFyY2hfc2gzX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMDAxMSBzdGMubCBHQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfR0JSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfM30sIGFyY2hfc2g0X3VwfSwKLQotLyogMDEwMG5ubm4wMDExMDAxMCBzdGMubCBTR1IsQC08UkVHX04+ICoveyJzdGMubCIse0FfU0dSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfMn0sIGFyY2hfc2g0X3VwfSwKLQotLyogMDEwMG5ubm4xMTExMDAxMCBzdGMubCBEQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfREJSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfRixIRVhfMn0sIGFyY2hfc2g0X3VwfSwKLQotLyogMDEwMG5ubm4xeHh4MDAxMSBzdGMubCBSbl9CQU5LLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1JFR19CLEFfREVDX059LHtIRVhfNCxSRUdfTixSRUdfQixIRVhfM30sIGFyY2hfc2gzX3VwfSwKLQotLyogMDAwMG5ubm4wMDAwMTAxMCBzdHMgTUFDSCw8UkVHX04+ICAgICoveyJzdHMiLHtBX01BQ0gsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8wLEhFWF9BfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDAwbm5ubjAwMDExMDEwIHN0cyBNQUNMLDxSRUdfTj4gICAgKi97InN0cyIse0FfTUFDTCxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzEsSEVYX0F9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5uMDAxMDEwMTAgc3RzIFBSLDxSRUdfTj4gICAgICAqL3sic3RzIix7QV9QUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYX0F9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMDBubm5uMDExMDEwMTAgc3RzIERTUiw8UkVHX04+CSoveyJzdHMiLHtBX0RTUixBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzYsSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAwMDBubm5uMDExMTEwMTAgc3RzIEEwLDxSRUdfTj4JKi97InN0cyIse0FfQTAsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF83LEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMDAwbm5ubjEwMDAxMDEwIHN0cyBYMCw8UkVHX04+CSoveyJzdHMiLHtBX1gwLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfOCxIRVhfQX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDAwMG5ubm4xMDAxMTAxMCBzdHMgWDEsPFJFR19OPgkqL3sic3RzIix7QV9YMSxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzksSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAwMDBubm5uMTAxMDEwMTAgc3RzIFkwLDxSRUdfTj4JKi97InN0cyIse0FfWTAsQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF9BLEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMDAwbm5ubjEwMTExMDEwIHN0cyBZMSw8UkVHX04+CSoveyJzdHMiLHtBX1kxLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfQixIRVhfQX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDAwMG5ubm4wMTAxMTAxMCBzdHMgRlBVTCw8UkVHX04+ICAgICoveyJzdHMiLHtGUFVMX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF81LEhFWF9BfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMDAwMG5ubm4wMTEwMTAxMCBzdHMgRlBTQ1IsPFJFR19OPiAgICoveyJzdHMiLHtGUFNDUl9NLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNixIRVhfQX0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMTAgc3RzLmwgTUFDSCxALTxSRUdfTj4qL3sic3RzLmwiLHtBX01BQ0gsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8yfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAwMDEwMDEwIHN0cy5sIE1BQ0wsQC08UkVHX04+Ki97InN0cy5sIix7QV9NQUNMLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfMn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDEwMDAxMCBzdHMubCBQUixALTxSRUdfTj4gICoveyJzdHMubCIse0FfUFIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF8yfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTAwMTEwIHN0cy5sIERTUixALTxSRUdfTj4JKi97InN0cy5sIix7QV9EU1IsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF82LEhFWF8yfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjAxMTEwMTEwIHN0cy5sIEEwLEAtPFJFR19OPgkqL3sic3RzLmwiLHtBX0EwLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfMn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4xMDAwMDExMCBzdHMubCBYMCxALTxSRUdfTj4JKi97InN0cy5sIix7QV9YMCxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzgsSEVYXzJ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMTAwMTAxMTAgc3RzLmwgWDEsQC08UkVHX04+CSoveyJzdHMubCIse0FfWDEsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF85LEhFWF8yfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMTAwbm5ubjEwMTAwMTEwIHN0cy5sIFkwLEAtPFJFR19OPgkqL3sic3RzLmwiLHtBX1kwLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfQSxIRVhfMn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMDEwMG5ubm4xMDExMDExMCBzdHMubCBZMSxALTxSRUdfTj4JKi97InN0cy5sIix7QV9ZMSxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYX0IsSEVYXzJ9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxMDBubm5uMDEwMTAwMTAgc3RzLmwgRlBVTCxALTxSRUdfTj4qL3sic3RzLmwiLHtGUFVMX00sQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF81LEhFWF8yfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMDEwMG5ubm4wMTEwMDAxMCBzdHMubCBGUFNDUixALTxSRUdfTj4qL3sic3RzLmwiLHtGUFNDUl9NLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfMn0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDAwMTFubm5ubW1tbTEwMDAgc3ViIDxSRUdfTT4sPFJFR19OPiAqL3sic3ViIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDExbm5ubm1tbW0xMDEwIHN1YmMgPFJFR19NPiw8UkVHX04+Ki97InN1YmMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0F9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTFubm5ubW1tbTEwMTEgc3VidiA8UkVHX00+LDxSRUdfTj4qL3sic3VidiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfQn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTAwMCBzd2FwLmIgPFJFR19NPiw8UkVHX04+Ki97InN3YXAuYiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDExMG5ubm5tbW1tMTAwMSBzd2FwLncgPFJFR19NPiw8UkVHX04+Ki97InN3YXAudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfOX0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDEwMG5ubm4wMDAxMTAxMSB0YXMuYiBAPFJFR19OPiAgICAgICoveyJ0YXMuYiIse0FfSU5EX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfQn0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDAwMTFpOCoxLi4uLiB0cmFwYSAjPGltbT4gICAgICAgICoveyJ0cmFwYSIse0FfSU1NfSx7SEVYX0MsSEVYXzMsSU1NXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDExMDAxMDAwaTgqMS4uLi4gdHN0ICM8aW1tPixSMCAgICAgICAqL3sidHN0Iix7QV9JTU0sQV9SMH0se0hFWF9DLEhFWF84LElNTV84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0xMDAwIHRzdCA8UkVHX00+LDxSRUdfTj4gKi97InRzdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDExMDBpOCoxLi4uLiB0c3QuYiAjPGltbT4sQChSMCxHQlIpKi97InRzdC5iIix7QV9JTU0sQV9SMF9HQlJ9LHtIRVhfQyxIRVhfQyxJTU1fOH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMTEwMDEwMTBpOCoxLi4uLiB4b3IgIzxpbW0+LFIwICAgICAgICoveyJ4b3IiLHtBX0lNTSxBX1IwfSx7SEVYX0MsSEVYX0EsSU1NXzh9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAwMTBubm5ubW1tbTEwMTAgeG9yIDxSRUdfTT4sPFJFR19OPiAqL3sieG9yIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9BfSwgYXJjaF9zaDFfdXB9LAotCi0vKiAxMTAwMTExMGk4KjEuLi4uIHhvci5iICM8aW1tPixAKFIwLEdCUikqL3sieG9yLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9FLElNTV84fSwgYXJjaF9zaDFfdXB9LAotCi0vKiAwMDEwbm5ubm1tbW0xMTAxIHh0cmN0IDxSRUdfTT4sPFJFR19OPioveyJ4dHJjdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfRH0sIGFyY2hfc2gxX3VwfSwKLQotLyogMDAwMG5ubm5tbW1tMDExMSBtdWwubCA8UkVHX00+LDxSRUdfTj4qL3sibXVsLmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzd9LCBhcmNoX3NoMV91cH0sCi0KLS8qIDAxMDBubm5uMDAwMTAwMDAgZHQgPFJFR19OPiAgICAgICAgICAqL3siZHQiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzB9LCBhcmNoX3NoMl91cH0sCi0KLS8qIDAwMTFubm5ubW1tbTExMDEgZG11bHMubCA8UkVHX00+LDxSRUdfTj4qL3siZG11bHMubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRH0sIGFyY2hfc2gyX3VwfSwKLQotLyogMDAxMW5ubm5tbW1tMDEwMSBkbXVsdS5sIDxSRUdfTT4sPFJFR19OPioveyJkbXVsdS5sIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF81fSwgYXJjaF9zaDJfdXB9LAotCi0vKiAwMDAwbm5ubm1tbW0xMTExIG1hYy5sIEA8UkVHX00+KyxAPFJFR19OPisqL3sibWFjLmwiLHtBX0lOQ19NLEFfSU5DX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfRn0sIGFyY2hfc2gyX3VwfSwKLQotLyogMDAwMG5ubm4wMDEwMDAxMSBicmFmIDxSRUdfTj4gICAgICAgKi97ImJyYWYiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYXzN9LCBhcmNoX3NoMl91cH0sCi0KLS8qIDAwMDBubm5uMDAwMDAwMTEgYnNyZiA8UkVHX04+ICAgICAgICoveyJic3JmIix7QV9SRUdfTn0se0hFWF8wLFJFR19OLEhFWF8wLEhFWF8zfSwgYXJjaF9zaDJfdXB9LAotCi0vKiAxMTExMDFubm1tbW0wMDAwIG1vdnMudyBALTxSRUdfTj4sPERTUF9SRUdfTT4gKi8gICB7Im1vdnMudyIse0FfREVDX04sRFNQX1JFR19NfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF8wfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0wMDAxIG1vdnMudyBAPFJFR19OPiw8RFNQX1JFR19NPiAqLyAgICB7Im1vdnMudyIse0FfSU5EX04sRFNQX1JFR19NfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF8xfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0wMDEwIG1vdnMudyBAPFJFR19OPissPERTUF9SRUdfTT4gKi8gICB7Im1vdnMudyIse0FfSU5DX04sRFNQX1JFR19NfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF8yfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0wMDExIG1vdnMudyBAPFJFR19OPityOCw8RFNQX1JFR19NPiAqLyB7Im1vdnMudyIse0FfUE1PRF9OLERTUF9SRUdfTX0se0hFWF9GLFNEVF9SRUdfTixSRUdfTSxIRVhfM30sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTExMTAxbm5tbW1tMDEwMCBtb3ZzLncgPERTUF9SRUdfTT4sQC08UkVHX04+ICovICAgeyJtb3ZzLnciLHtEU1BfUkVHX00sQV9ERUNfTn0se0hFWF9GLFNEVF9SRUdfTixSRUdfTSxIRVhfNH0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTExMTAxbm5tbW1tMDEwMSBtb3ZzLncgPERTUF9SRUdfTT4sQDxSRUdfTj4gKi8gICAgeyJtb3ZzLnciLHtEU1BfUkVHX00sQV9JTkRfTn0se0hFWF9GLFNEVF9SRUdfTixSRUdfTSxIRVhfNX0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTExMTAxbm5tbW1tMDExMCBtb3ZzLncgPERTUF9SRUdfTT4sQDxSRUdfTj4rICovICAgeyJtb3ZzLnciLHtEU1BfUkVHX00sQV9JTkNfTn0se0hFWF9GLFNEVF9SRUdfTixSRUdfTSxIRVhfNn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTExMTAxbm5tbW1tMDExMSBtb3ZzLncgPERTUF9SRUdfTT4sQDxSRUdfTj4rcjggKi8geyJtb3ZzLnciLHtEU1BfUkVHX00sQV9QTU9EX059LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYXzd9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTEwMDAgbW92cy5sIEAtPFJFR19OPiw8RFNQX1JFR19NPiAqLyAgIHsibW92cy5sIix7QV9ERUNfTixEU1BfUkVHX019LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYXzh9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTEwMDEgbW92cy5sIEA8UkVHX04+LDxEU1BfUkVHX00+ICovICAgIHsibW92cy5sIix7QV9JTkRfTixEU1BfUkVHX019LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTEwMTAgbW92cy5sIEA8UkVHX04+Kyw8RFNQX1JFR19NPiAqLyAgIHsibW92cy5sIix7QV9JTkNfTixEU1BfUkVHX019LHtIRVhfRixTRFRfUkVHX04sUkVHX00sSEVYX0F9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDExMTEwMW5ubW1tbTEwMTEgbW92cy5sIEA8UkVHX04+K3I4LDxEU1BfUkVHX00+ICovIHsibW92cy5sIix7QV9QTU9EX04sRFNQX1JFR19NfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF9CfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0xMTAwIG1vdnMubCA8RFNQX1JFR19NPixALTxSRUdfTj4gKi8gICB7Im1vdnMubCIse0RTUF9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF9DfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0xMTAxIG1vdnMubCA8RFNQX1JFR19NPixAPFJFR19OPiAqLyAgICB7Im1vdnMubCIse0RTUF9SRUdfTSxBX0lORF9OfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF9EfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0xMTEwIG1vdnMubCA8RFNQX1JFR19NPixAPFJFR19OPisgKi8gICB7Im1vdnMubCIse0RTUF9SRUdfTSxBX0lOQ19OfSx7SEVYX0YsU0RUX1JFR19OLFJFR19NLEhFWF9FfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAxMTExMDFubm1tbW0xMTExIG1vdnMubCA8RFNQX1JFR19NPixAPFJFR19OPityOCAqLyB7Im1vdnMubCIse0RTUF9SRUdfTSxBX1BNT0RfTn0se0hFWF9GLFNEVF9SRUdfTixSRUdfTSxIRVhfRn0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMCowKjAqMDAqKiBub3B4ICovIHsibm9weCIsezB9LHtQUEksTk9QWH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qICowKjAqMCoqMDAgbm9weSAqLyB7Im5vcHkiLHswfSx7UFBJLE5PUFl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiBuKm0qMCowMSoqIG1vdngudyBAPFJFR19OPiw8RFNQX1JFR19YPiAqLyAgICB7Im1vdngudyIse0FfSU5EX04sRFNQX1JFR19YfSx7UFBJLE1PVlgsSEVYXzF9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiBuKm0qMCoxMCoqIG1vdngudyBAPFJFR19OPissPERTUF9SRUdfWD4gKi8gICB7Im1vdngudyIse0FfSU5DX04sRFNQX1JFR19YfSx7UFBJLE1PVlgsSEVYXzJ9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiBuKm0qMCoxMSoqIG1vdngudyBAPFJFR19OPityOCw8RFNQX1JFR19YPiAqLyB7Im1vdngudyIse0FfUE1PRF9OLERTUF9SRUdfWH0se1BQSSxNT1ZYLEhFWF8zfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogbiptKjEqMDEqKiBtb3Z4LncgPERTUF9SRUdfTT4sQDxSRUdfTj4gKi8gICAgeyJtb3Z4LnciLHtEU1BfUkVHX00sQV9JTkRfTn0se1BQSSxNT1ZYLEhFWF85fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogbiptKjEqMTAqKiBtb3Z4LncgPERTUF9SRUdfTT4sQDxSRUdfTj4rICovICAgeyJtb3Z4LnciLHtEU1BfUkVHX00sQV9JTkNfTn0se1BQSSxNT1ZYLEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogbiptKjEqMTEqKiBtb3Z4LncgPERTUF9SRUdfTT4sQDxSRUdfTj4rcjggKi8geyJtb3Z4LnciLHtEU1BfUkVHX00sQV9QTU9EX059LHtQUEksTU9WWCxIRVhfQn0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qICpuKm0qMCoqMDEgbW92eS53IEA8UkVHX04+LDxEU1BfUkVHX1k+ICovICAgIHsibW92eS53Iix7QV9JTkRfTixEU1BfUkVHX1l9LHtQUEksTU9WWSxIRVhfMX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qICpuKm0qMCoqMTAgbW92eS53IEA8UkVHX04+Kyw8RFNQX1JFR19ZPiAqLyAgIHsibW92eS53Iix7QV9JTkNfTixEU1BfUkVHX1l9LHtQUEksTU9WWSxIRVhfMn0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qICpuKm0qMCoqMTEgbW92eS53IEA8UkVHX04+K3I5LDxEU1BfUkVHX1k+ICovIHsibW92eS53Iix7QV9QTU9EWV9OLERTUF9SRUdfWX0se1BQSSxNT1ZZLEhFWF8zfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogKm4qbSoxKiowMSBtb3Z5LncgPERTUF9SRUdfTT4sQDxSRUdfTj4gKi8gICAgeyJtb3Z5LnciLHtEU1BfUkVHX00sQV9JTkRfTn0se1BQSSxNT1ZZLEhFWF85fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogKm4qbSoxKioxMCBtb3Z5LncgPERTUF9SRUdfTT4sQDxSRUdfTj4rICovICAgeyJtb3Z5LnciLHtEU1BfUkVHX00sQV9JTkNfTn0se1BQSSxNT1ZZLEhFWF9BfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogKm4qbSoxKioxMSBtb3Z5LncgPERTUF9SRUdfTT4sQDxSRUdfTj4rcjkgKi8geyJtb3Z5LnciLHtEU1BfUkVHX00sQV9QTU9EWV9OfSx7UFBJLE1PVlksSEVYX0J9LCBhcmNoX3NoX2RzcF91cH0sCi0KLS8qIDAxYWFlZWZmeHh5eWdnbm4gcG11bHMgU2UsU2YsRGcgKi8geyJwbXVscyIse0RTUF9SRUdfRSxEU1BfUkVHX0YsRFNQX1JFR19HfSx7UFBJLFBNVUx9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDEwMDAwMHh4eXlubm5uIHBzdWJjIDxEU1BfUkVHX1g+LDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InBzdWJjIix7RFNQX1JFR19YLERTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJMyxIRVhfQSxIRVhfMH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTEwMDAweHh5eW5ubm4gcGFkZGMgPERTUF9SRUdfWD4sPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicGFkZGMiLHtEU1BfUkVHX1gsRFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUEkzLEhFWF9CLEhFWF8wfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAwMDAxMDB4eHl5bm5ubiBwY21wIDxEU1BfUkVHX1g+LDxEU1BfUkVHX1k+ICovCi17InBjbXAiLCB7RFNQX1JFR19YLERTUF9SRUdfWX0se1BQSSxQUEkzLEhFWF84LEhFWF80fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAxMDAxMDB4eHl5bm5ubiBwd3NiIDxEU1BfUkVHX1g+LDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InB3c2IiLCB7RFNQX1JFR19YLERTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJMyxIRVhfQSxIRVhfNH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTEwMTAweHh5eW5ubm4gcHdhZCA8RFNQX1JFR19YPiw8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwd2FkIiwge0RTUF9SRUdfWCxEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSTMsSEVYX0IsSEVYXzR9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAwMTAwMHh4eXlubm5uIHBhYnMgPERTUF9SRUdfWD4sPERTUF9SRUdfTj4gKi8KLXsicGFicyIsIHtEU1BfUkVHX1gsRFNQX1JFR19OfSx7UFBJLFBQSTMsSEVYXzgsSEVYXzh9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAxMTAwMHh4eXlubm5uIHBybmQgPERTUF9SRUdfWD4sPERTUF9SRUdfTj4gKi8KLXsicHJuZCIsIHtEU1BfUkVHX1gsRFNQX1JFR19OfSx7UFBJLFBQSTMsSEVYXzksSEVYXzh9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDEwMTAwMHh4eXlubm5uIHBhYnMgPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicGFicyIsIHtEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSTMsSEVYX0EsSEVYXzh9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDExMTAwMHh4eXlubm5uIHBybmQgPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicHJuZCIsIHtEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSTMsSEVYX0IsSEVYXzh9LCBhcmNoX3NoX2RzcF91cH0sCi0KLXsiZGN0Iix7MH0se1BQSSxQREMsSEVYXzF9LCBhcmNoX3NoX2RzcF91cH0sCi17ImRjZiIsezB9LHtQUEksUERDLEhFWF8yfSwgYXJjaF9zaF9kc3BfdXB9LAotCi0vKiAwMDAwMGlpaWlpaWlubm5uIHBzaGwgIzxpbW0+LDxEU1BfUkVHX04+ICovIHsicHNobCIse0FfSU1NLERTUF9SRUdfTn0se1BQSSxQU0gsSEVYXzB9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAwMDAwMXh4eXlubm5uIHBzaGwgPERTUF9SRUdfWD4sPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicHNobCIsIHtEU1BfUkVHX1gsRFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF84LEhFWF8xfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMDAwMTBpaWlpaWlpbm5ubiBwc2hhICM8aW1tPiw8RFNQX1JFR19OPiAqLyB7InBzaGEiLHtBX0lNTSxEU1BfUkVHX059LHtQUEksUFNILEhFWF8xfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAwMTAwMDF4eHl5bm5ubiBwc2hhIDxEU1BfUkVHX1g+LDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InBzaGEiLCB7RFNQX1JFR19YLERTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfOSxIRVhfMX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTAwMDAxeHh5eW5ubm4gcHN1YiA8RFNQX1JFR19YPiw8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwc3ViIiwge0RTUF9SRUdfWCxEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0EsSEVYXzF9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDExMDAwMXh4eXlubm5uIHBhZGQgPERTUF9SRUdfWD4sPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicGFkZCIsIHtEU1BfUkVHX1gsRFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF9CLEhFWF8xfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAwMTAxMDF4eHl5bm5ubiBwYW5kIDxEU1BfUkVHX1g+LDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InBhbmQiLCB7RFNQX1JFR19YLERTUF9SRUdfWSxEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfOSxIRVhfNX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTAwMTAxeHh5eW5ubm4gcHhvciA8RFNQX1JFR19YPiw8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJweG9yIiwge0RTUF9SRUdfWCxEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0EsSEVYXzV9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDExMDEwMXh4eXlubm5uIHBvciAgPERTUF9SRUdfWD4sPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicG9yIiwgIHtEU1BfUkVHX1gsRFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF9CLEhFWF81fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAwMDEwMDF4eHl5bm5ubiBwZGVjIDxEU1BfUkVHX1g+LDxEU1BfUkVHX04+ICovCi17InBkZWMiLCB7RFNQX1JFR19YLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF84LEhFWF85fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAwMTEwMDF4eHl5bm5ubiBwaW5jIDxEU1BfUkVHX1g+LDxEU1BfUkVHX04+ICovCi17InBpbmMiLCB7RFNQX1JFR19YLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF85LEhFWF85fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAxMDEwMDF4eHl5bm5ubiBwZGVjIDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InBkZWMiLCB7RFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF9BLEhFWF85fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAxMTEwMDF4eHl5bm5ubiBwaW5jIDxEU1BfUkVHX1k+LDxEU1BfUkVHX04+ICovCi17InBpbmMiLCB7RFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF9CLEhFWF85fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTAwMDExMDF4eHl5bm5ubiBwY2xyIDxEU1BfUkVHX04+ICovCi17InBjbHIiLCB7RFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYXzgsSEVYX0R9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMDAxMTEwMXh4eXlubm5uIHBkbXNiIDxEU1BfUkVHX1g+LDxEU1BfUkVHX04+ICovCi17InBkbXNiIiwge0RTUF9SRUdfWCxEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfOSxIRVhfRH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDEwMTExMTAxeHh5eW5ubm4gcGRtc2IgPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicGRtc2IiLCB7RFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF9CLEhFWF9EfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTEwMDEwMDF4eHl5bm5ubiBwbmVnICA8RFNQX1JFR19YPiw8RFNQX1JFR19OPiAqLwoteyJwbmVnIiwgIHtEU1BfUkVHX1gsRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0MsSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMTAxMTAwMXh4eXlubm5uIHBjb3B5IDxEU1BfUkVHX1g+LDxEU1BfUkVHX04+ICovCi17InBjb3B5Iiwge0RTUF9SRUdfWCxEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfRCxIRVhfOX0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDExMTAxMDAxeHh5eW5ubm4gcG5lZyAgPERTUF9SRUdfWT4sPERTUF9SRUdfTj4gKi8KLXsicG5lZyIsICB7RFNQX1JFR19ZLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF9FLEhFWF85fSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTExMTEwMDF4eHl5bm5ubiBwY29weSA8RFNQX1JFR19ZPiw8RFNQX1JFR19OPiAqLwoteyJwY29weSIsIHtEU1BfUkVHX1ksRFNQX1JFR19OfSx7UFBJLFBQSUMsSEVYX0YsSEVYXzl9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMTAwMTEwMXh4eXlubm5uIHBzdHMgTUFDSCw8RFNQX1JFR19OPiAqLwoteyJwc3RzIiwge0FfTUFDSCxEU1BfUkVHX059LHtQUEksUFBJQyxIRVhfQyxIRVhfRH0sIGFyY2hfc2hfZHNwX3VwfSwKLS8qIDExMDExMTAxeHh5eW5ubm4gcHN0cyBNQUNMLDxEU1BfUkVHX04+ICovCi17InBzdHMiLCB7QV9NQUNMLERTUF9SRUdfTn0se1BQSSxQUElDLEhFWF9ELEhFWF9EfSwgYXJjaF9zaF9kc3BfdXB9LAotLyogMTExMDExMDF4eHl5bm5ubiBwbGRzIDxEU1BfUkVHX04+LE1BQ0ggKi8KLXsicGxkcyIsIHtEU1BfUkVHX04sQV9NQUNIfSx7UFBJLFBQSUMsSEVYX0UsSEVYX0R9LCBhcmNoX3NoX2RzcF91cH0sCi0vKiAxMTExMTEwMXh4eXlubm5uIHBsZHMgPERTUF9SRUdfTj4sTUFDTCAqLwoteyJwbGRzIiwge0RTUF9SRUdfTixBX01BQ0x9LHtQUEksUFBJQyxIRVhfRixIRVhfRH0sIGFyY2hfc2hfZHNwX3VwfSwKLQotLyogMTExMW5ubm4wMTAxMTEwMSBmYWJzIDxGX1JFR19OPiAgICAgKi97ImZhYnMiLHtGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzUsSEVYX0R9LCBhcmNoX3NoM2VfdXB9LAotLyogMTExMW5ubm4wMTAxMTEwMSBmYWJzIDxEX1JFR19OPiAgICAgKi97ImZhYnMiLHtEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzUsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTAwMDAgZmFkZCA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZhZGQiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMH0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5uMG1tbTAwMDAwIGZhZGQgPERfUkVHX00+LDxEX1JFR19OPioveyJmYWRkIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzB9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTAxMDAgZmNtcC9lcSA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZjbXAvZXEiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNH0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5uMG1tbTAwMTAwIGZjbXAvZXEgPERfUkVHX00+LDxEX1JFR19OPioveyJmY21wL2VxIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzR9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTAxMDEgZmNtcC9ndCA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZjbXAvZ3QiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNX0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5uMG1tbTAwMTAxIGZjbXAvZ3QgPERfUkVHX00+LDxEX1JFR19OPioveyJmY21wL2d0Iix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzV9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm4wMTAxMTExMDEgZmNudmRzIDxEX1JFR19OPixGUFVMKi97ImZjbnZkcyIse0RfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYX0IsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm4wMTAxMDExMDEgZmNudnNkIEZQVUwsPERfUkVHX04+Ki97ImZjbnZzZCIse0ZQVUxfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYX0EsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTAwMTEgZmRpdiA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZkaXYiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfM30sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5uMG1tbTAwMDExIGZkaXYgPERfUkVHX00+LDxEX1JFR19OPioveyJmZGl2Iix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzN9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm1tMTExMDExMDEgZmlwciA8Vl9SRUdfTT4sPFZfUkVHX04+Ki97ImZpcHIiLHtWX1JFR19NLFZfUkVHX059LHtIRVhfRixSRUdfTk0sSEVYX0UsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5uMTAwMDExMDEgZmxkaTAgPEZfUkVHX04+ICAgICoveyJmbGRpMCIse0ZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfOCxIRVhfRH0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDExMTFubm5uMTAwMTExMDEgZmxkaTEgPEZfUkVHX04+ICAgICoveyJmbGRpMSIse0ZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfOSxIRVhfRH0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDExMTFubm5uMDAwMTExMDEgZmxkcyA8Rl9SRUdfTj4sRlBVTCoveyJmbGRzIix7Rl9SRUdfTixGUFVMX019LHtIRVhfRixSRUdfTixIRVhfMSxIRVhfRH0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDExMTFubm5uMDAxMDExMDEgZmxvYXQgRlBVTCw8Rl9SRUdfTj4qL3siZmxvYXQiLHtGUFVMX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF8yLEhFWF9EfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5uMDAxMDExMDEgZmxvYXQgRlBVTCw8RF9SRUdfTj4qL3siZmxvYXQiLHtGUFVMX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF8yLEhFWF9EfSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0xMTEwIGZtYWMgRlIwLDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZm1hYyIse0ZfRlIwLEZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9FfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTEwMCBmbW92IDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZm1vdiIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9DfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5ubW1tbTExMDAgZm1vdiA8RFhfUkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdiIse0RYX1JFR19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0N9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdiBAPFJFR19NPiw8Rl9SRUdfTj4qL3siZm1vdiIse0FfSU5EX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdiBAPFJFR19NPiw8RFhfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdiA8Rl9SRUdfTT4sQDxSRUdfTj4qL3siZm1vdiIse0ZfUkVHX00sQV9JTkRfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9BfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdiA8RFhfUkVHX00+LEA8UkVHX04+Ki97ImZtb3YiLHtEWF9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDEgZm1vdiBAPFJFR19NPissPEZfUkVHX04+Ki97ImZtb3YiLHtBX0lOQ19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5ubm1tbW0xMDAxIGZtb3YgQDxSRUdfTT4rLDxEWF9SRUdfTj4qL3siZm1vdiIse0FfSU5DX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAxMSBmbW92IDxGX1JFR19NPixALTxSRUdfTj4qL3siZm1vdiIse0ZfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm5ubW1tbTEwMTEgZm1vdiA8RFhfUkVHX00+LEAtPFJFR19OPioveyJmbW92Iix7RFhfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YgQChSMCw8UkVHX00+KSw8Rl9SRUdfTj4qL3siZm1vdiIse0FfSU5EX1IwX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNn0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YgQChSMCw8UkVHX00+KSw8RFhfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9SMF9SRUdfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0wMTExIGZtb3YgPEZfUkVHX00+LEAoUjAsPFJFR19OPikqL3siZm1vdiIse0ZfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfN30sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5ubm1tbW0wMTExIGZtb3YgPERYX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YiLHtEWF9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0xMDAwIGZtb3YuZCBAPFJFR19NPiw8RFhfUkVHX04+Ki97ImZtb3YuZCIse0FfSU5EX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOH0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAxMCBmbW92LmQgPERYX1JFR19NPixAPFJFR19OPioveyJmbW92LmQiLHtEWF9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDEgZm1vdi5kIEA8UkVHX00+Kyw8RFhfUkVHX04+Ki97ImZtb3YuZCIse0FfSU5DX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMTAxMSBmbW92LmQgPERYX1JFR19NPixALTxSRUdfTj4qL3siZm1vdi5kIix7RFhfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfSwgYXJjaF9zaDRfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YuZCBAKFIwLDxSRUdfTT4pLDxEWF9SRUdfTj4qL3siZm1vdi5kIix7QV9JTkRfUjBfUkVHX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNn0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm5tbW1tMDExMSBmbW92LmQgPERYX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YuZCIse0RYX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzd9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdi5zIEA8UkVHX00+LDxGX1JFR19OPioveyJmbW92LnMiLHtBX0lORF9NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOH0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdi5zIDxGX1JFR19NPixAPFJFR19OPioveyJmbW92LnMiLHtGX1JFR19NLEFfSU5EX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQX0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDEgZm1vdi5zIEA8UkVHX00+Kyw8Rl9SRUdfTj4qL3siZm1vdi5zIix7QV9JTkNfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzl9LCBhcmNoX3NoM2VfdXB9LAotCi0vKiAxMTExbm5ubm1tbW0xMDExIGZtb3YucyA8Rl9SRUdfTT4sQC08UkVHX04+Ki97ImZtb3YucyIse0ZfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm5tbW1tMDExMCBmbW92LnMgQChSMCw8UkVHX00+KSw8Rl9SRUdfTj4qL3siZm1vdi5zIix7QV9JTkRfUjBfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm5tbW1tMDExMSBmbW92LnMgPEZfUkVHX00+LEAoUjAsPFJFR19OPikqL3siZm1vdi5zIix7Rl9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fSwgYXJjaF9zaDNlX3VwfSwKLQotLyogMTExMW5ubm5tbW1tMDAxMCBmbXVsIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZm11bCIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8yfSwgYXJjaF9zaDNlX3VwfSwKLS8qIDExMTFubm4wbW1tMDAwMTAgZm11bCA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZtdWwiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMn0sIGFyY2hfc2g0X3VwfSwKLQotLyogMTExMW5ubm4wMTAwMTEwMSBmbmVnIDxGX1JFR19OPiAgICAgKi97ImZuZWciLHtGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzQsSEVYX0R9LCBhcmNoX3NoM2VfdXB9LAotLyogMTExMW5ubm4wMTAwMTEwMSBmbmVnIDxEX1JFR19OPiAgICAgKi97ImZuZWciLHtEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzQsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTExMDExMTExMTExMDEgZnJjaGcgICAgICAgICAgICAgICAqL3siZnJjaGciLHswfSx7SEVYX0YsSEVYX0IsSEVYX0YsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTEwMDExMTExMTExMDEgZnNjaGcgICAgICAgICAgICAgICAqL3siZnNjaGciLHswfSx7SEVYX0YsSEVYXzMsSEVYX0YsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5uMDExMDExMDEgZnNxcnQgPEZfUkVHX04+ICAgICoveyJmc3FydCIse0ZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNixIRVhfRH0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5ubjAxMTAxMTAxIGZzcXJ0IDxEX1JFR19OPiAgICAqL3siZnNxcnQiLHtEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzYsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5uMDAwMDExMDEgZnN0cyBGUFVMLDxGX1JFR19OPioveyJmc3RzIix7RlBVTF9NLEZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfMCxIRVhfRH0sIGFyY2hfc2gzZV91cH0sCi0KLS8qIDExMTFubm5ubW1tbTAwMDEgZnN1YiA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZzdWIiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMX0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5uMG1tbTAwMDAxIGZzdWIgPERfUkVHX00+LDxEX1JFR19OPioveyJmc3ViIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzF9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubm5uMDAxMTExMDEgZnRyYyA8Rl9SRUdfTj4sRlBVTCoveyJmdHJjIix7Rl9SRUdfTixGUFVMX019LHtIRVhfRixSRUdfTixIRVhfMyxIRVhfRH0sIGFyY2hfc2gzZV91cH0sCi0vKiAxMTExbm5ubjAwMTExMTAxIGZ0cmMgPERfUkVHX04+LEZQVUwqL3siZnRyYyIse0RfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYXzMsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLS8qIDExMTFubjAxMTExMTExMDEgZnRydiBYTVRSWF9NNCw8Vl9SRUdfbj4qL3siZnRydiIse1hNVFJYX000LFZfUkVHX059LHtIRVhfRixSRUdfTk0sSEVYX0YsSEVYX0R9LCBhcmNoX3NoNF91cH0sCi0KLXsgMCB9IAotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL3NwYXJjLWRpcy5jIGIvb3Bjb2Rlcy9zcGFyYy1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiZGI2MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3NwYXJjLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTc0ICswLDAgQEAKLS8qIFByaW50IFNQQVJDIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEJpdG1hc2sgb2YgdjkgYXJjaGl0ZWN0dXJlcy4gICovCi0jZGVmaW5lIE1BU0tfVjkgKCgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5KSBcCi0JCSB8ICgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkpCi0vKiAxIGlmIElOU04gaXMgZm9yIHY5IG9ubHkuICAqLwotI2RlZmluZSBWOV9PTkxZX1AoaW5zbikgKCEgKChpbnNuKS0+YXJjaGl0ZWN0dXJlICYgfk1BU0tfVjkpKQotLyogMSBpZiBJTlNOIGlzIGZvciB2OS4gICovCi0jZGVmaW5lIFY5X1AoaW5zbikgKCgoaW5zbiktPmFyY2hpdGVjdHVyZSAmIE1BU0tfVjkpICE9IDApCi0KLS8qIFRoZSBzb3J0ZWQgb3Bjb2RlIHRhYmxlLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqc29ydGVkX29wY29kZXM7Ci0KLS8qIEZvciBmYXN0ZXIgbG9va3VwLCBhZnRlciBpbnNucyBhcmUgc29ydGVkIHRoZXkgYXJlIGhhc2hlZC4gICovCi0vKiA/Pz8gSSB0aGluayB0aGVyZSBpcyByb29tIGZvciBldmVuIG1vcmUgaW1wcm92ZW1lbnQuICAqLwotCi0jZGVmaW5lIEhBU0hfU0laRSAyNTYKLS8qIEl0IGlzIGltcG9ydGFudCB0aGF0IHdlIG9ubHkgbG9vayBhdCBpbnNuIGNvZGUgYml0cyBhcyB0aGF0IGlzIGhvdyB0aGUKLSAgIG9wY29kZSB0YWJsZSBpcyBoYXNoZWQuICBPUENPREVfQklUUyBpcyBhIHRhYmxlIG9mIHZhbGlkIGJpdHMgZm9yIGVhY2gKLSAgIG9mIHRoZSBtYWluIHR5cGVzICgwLDEsMiwzKS4gICovCi1zdGF0aWMgaW50IG9wY29kZV9iaXRzWzRdID0geyAweDAxYzAwMDAwLCAweDAsIDB4MDFmODAwMDAsIDB4MDFmODAwMDAgfTsKLSNkZWZpbmUgSEFTSF9JTlNOKElOU04pIFwKLSAgKCgoKElOU04pID4+IDI0KSAmIDB4YzApIHwgKCgoSU5TTikgJiBvcGNvZGVfYml0c1soKElOU04pID4+IDMwKSAmIDNdKSA+PiAxOSkpCi1zdHJ1Y3Qgb3Bjb2RlX2hhc2ggewotICBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm5leHQ7Ci0gIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wY29kZTsKLX07Ci1zdGF0aWMgc3RydWN0IG9wY29kZV9oYXNoICpvcGNvZGVfaGFzaF90YWJsZVtIQVNIX1NJWkVdOwotCi1zdGF0aWMgdm9pZCBidWlsZF9oYXNoX3RhYmxlCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiosIHN0cnVjdCBvcGNvZGVfaGFzaCAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IGlzX2RlbGF5ZWRfYnJhbmNoIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9vcGNvZGVzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgaW50IGNvbXB1dGVfYXJjaF9tYXNrIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLQotLyogU2lnbi1leHRlbmQgYSB2YWx1ZSB3aGljaCBpcyBOIGJpdHMgbG9uZy4gICovCi0jZGVmaW5lCVNFWCh2YWx1ZSwgYml0cykgXAotCSgoKChpbnQpKHZhbHVlKSkgPDwgKCg4ICogc2l6ZW9mIChpbnQpKSAtIGJpdHMpKQlcCi0JCQkgPj4gKCg4ICogc2l6ZW9mIChpbnQpKSAtIGJpdHMpICkKLQotc3RhdGljICBjaGFyICpyZWdfbmFtZXNbXSA9Ci17ICJnMCIsICJnMSIsICJnMiIsICJnMyIsICJnNCIsICJnNSIsICJnNiIsICJnNyIsCQotICAibzAiLCAibzEiLCAibzIiLCAibzMiLCAibzQiLCAibzUiLCAic3AiLCAibzciLAkKLSAgImwwIiwgImwxIiwgImwyIiwgImwzIiwgImw0IiwgImw1IiwgImw2IiwgImw3IiwJCi0gICJpMCIsICJpMSIsICJpMiIsICJpMyIsICJpNCIsICJpNSIsICJmcCIsICJpNyIsCQotICAiZjAiLCAiZjEiLCAiZjIiLCAiZjMiLCAiZjQiLCAiZjUiLCAiZjYiLCAiZjciLAkKLSAgImY4IiwgImY5IiwgImYxMCIsICJmMTEiLCAiZjEyIiwgImYxMyIsICJmMTQiLCAiZjE1IiwJCi0gICJmMTYiLCAiZjE3IiwgImYxOCIsICJmMTkiLCAiZjIwIiwgImYyMSIsICJmMjIiLCAiZjIzIiwKLSAgImYyNCIsICJmMjUiLCAiZjI2IiwgImYyNyIsICJmMjgiLCAiZjI5IiwgImYzMCIsICJmMzEiLAotICAiZjMyIiwgImYzMyIsICJmMzQiLCAiZjM1IiwgImYzNiIsICJmMzciLCAiZjM4IiwgImYzOSIsCQotICAiZjQwIiwgImY0MSIsICJmNDIiLCAiZjQzIiwgImY0NCIsICJmNDUiLCAiZjQ2IiwgImY0NyIsCQotICAiZjQ4IiwgImY0OSIsICJmNTAiLCAiZjUxIiwgImY1MiIsICJmNTMiLCAiZjU0IiwgImY1NSIsCi0gICJmNTYiLCAiZjU3IiwgImY1OCIsICJmNTkiLCAiZjYwIiwgImY2MSIsICJmNjIiLCAiZjYzIiwKLS8qIHBzciwgd2ltLCB0YnIsIGZwc3IsIGNwc3IgYXJlIHY4IG9ubHkuICAqLwotICAieSIsICJwc3IiLCAid2ltIiwgInRiciIsICJwYyIsICJucGMiLCAiZnBzciIsICJjcHNyIgotfTsKLQotI2RlZmluZQlmcmVnX25hbWVzCSgmcmVnX25hbWVzWzQgKiA4XSkKLQotLyogVGhlc2UgYXJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZXJlIHJlZ2lzdGVyIG51bWJlciBpbgotICAgcmRwciBhbmQgd3JwciBpbnNucy4gICovCi1zdGF0aWMgY2hhciAqdjlfcHJpdl9yZWdfbmFtZXNbXSA9Ci17Ci0gICJ0cGMiLCAidG5wYyIsICJ0c3RhdGUiLCAidHQiLCAidGljayIsICJ0YmEiLCAicHN0YXRlIiwgInRsIiwKLSAgInBpbCIsICJjd3AiLCAiY2Fuc2F2ZSIsICJjYW5yZXN0b3JlIiwgImNsZWFud2luIiwgIm90aGVyd2luIiwKLSAgIndzdGF0ZSIsICJmcSIKLSAgLyogInZlciIgLSBzcGVjaWFsIGNhc2VkICovCi19OwotCi0vKiBUaGVzZSBhcmUgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlcmUgcmVnaXN0ZXIgbnVtYmVyIGluCi0gICByZCBhbmQgd3IgaW5zbnMgKC0xNikuICAqLwotc3RhdGljIGNoYXIgKnY5YV9hc3JfcmVnX25hbWVzW10gPQotewotICAicGNyIiwgInBpYyIsICJkY3IiLCAiZ3NyIiwgInNldF9zb2Z0aW50IiwgImNsZWFyX3NvZnRpbnQiLAotICAic29mdGludCIsICJ0aWNrX2NtcHIiCi19OwotCi0vKiBNYWNyb3MgdXNlZCB0byBleHRyYWN0IGluc3RydWN0aW9uIGZpZWxkcy4gIE5vdCBhbGwgZmllbGRzIGhhdmUKLSAgIG1hY3JvcyBkZWZpbmVkIGhlcmUsIG9ubHkgdGhvc2Ugd2hpY2ggYXJlIGFjdHVhbGx5IHVzZWQuICAqLwotCi0jZGVmaW5lIFhfUkQoaSkgKCgoaSkgPj4gMjUpICYgMHgxZikKLSNkZWZpbmUgWF9SUzEoaSkgKCgoaSkgPj4gMTQpICYgMHgxZikKLSNkZWZpbmUgWF9MRFNUX0koaSkgKCgoaSkgPj4gMTMpICYgMSkKLSNkZWZpbmUgWF9BU0koaSkgKCgoaSkgPj4gNSkgJiAweGZmKQotI2RlZmluZSBYX1JTMihpKSAoKChpKSA+PiAwKSAmIDB4MWYpCi0jZGVmaW5lIFhfSU1NKGksbikgKCgoaSkgPj4gMCkgJiAoKDEgPDwgKG4pKSAtIDEpKQotI2RlZmluZSBYX1NJTU0oaSxuKSBTRVggKFhfSU1NICgoaSksIChuKSksIChuKSkKLSNkZWZpbmUgWF9ESVNQMjIoaSkgKCgoaSkgPj4gMCkgJiAweDNmZmZmZikKLSNkZWZpbmUgWF9JTU0yMihpKSBYX0RJU1AyMiAoaSkKLSNkZWZpbmUgWF9ESVNQMzAoaSkgKCgoaSkgPj4gMCkgJiAweDNmZmZmZmZmKQotCi0vKiBUaGVzZSBhcmUgZm9yIHY5LiAgKi8KLSNkZWZpbmUgWF9ESVNQMTYoaSkgKCgoKChpKSA+PiAyMCkgJiAzKSA8PCAxNCkgfCAoKChpKSA+PiAwKSAmIDB4M2ZmZikpCi0jZGVmaW5lIFhfRElTUDE5KGkpICgoKGkpID4+IDApICYgMHg3ZmZmZikKLSNkZWZpbmUgWF9NRU1CQVIoaSkgKChpKSAmIDB4N2YpCi0KLS8qIEhlcmUgaXMgdGhlIHVuaW9uIHdoaWNoIHdhcyB1c2VkIHRvIGV4dHJhY3QgaW5zdHJ1Y3Rpb24gZmllbGRzCi0gICBiZWZvcmUgdGhlIHNoaWZ0IGFuZCBtYXNrIG1hY3JvcyB3ZXJlIHdyaXR0ZW4uCi0KLSAgIHVuaW9uIHNwYXJjX2luc24KLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGNvZGU7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOwotCSAgICNkZWZpbmUJb3AJbGRzdC5hbm9wCi0JICAgdW5zaWduZWQgaW50IGFucmQ6NTsKLQkgICAjZGVmaW5lCXJkCWxkc3QuYW5yZAotCSAgIHVuc2lnbmVkIGludCBvcDM6NjsKLQkgICB1bnNpZ25lZCBpbnQgYW5yczE6NTsKLQkgICAjZGVmaW5lCXJzMQlsZHN0LmFucnMxCi0JICAgdW5zaWduZWQgaW50IGk6MTsKLQkgICB1bnNpZ25lZCBpbnQgYW5hc2k6ODsKLQkgICAjZGVmaW5lCWFzaQlsZHN0LmFuYXNpCi0JICAgdW5zaWduZWQgaW50IGFucnMyOjU7Ci0JICAgI2RlZmluZQlyczIJbGRzdC5hbnJzMgotCSAgICNkZWZpbmUJc2hjbnQJcnMyCi0JIH0gbGRzdDsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjIsIGFucmQ6NSwgb3AzOjYsIGFucnMxOjUsIGk6MTsKLQkgICB1bnNpZ25lZCBpbnQgSU1NMTM6MTM7Ci0JICAgI2RlZmluZQlpbW0xMwlJTU0xMy5JTU0xMwotCSB9IElNTTEzOwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICB1bnNpZ25lZCBpbnQgYToxOwotCSAgIHVuc2lnbmVkIGludCBjb25kOjQ7Ci0JICAgdW5zaWduZWQgaW50IG9wMjozOwotCSAgIHVuc2lnbmVkIGludCBESVNQMjI6MjI7Ci0JICAgI2RlZmluZQlkaXNwMjIJYnJhbmNoLkRJU1AyMgotCSAgICNkZWZpbmUJaW1tMjIJZGlzcDIyCi0JIH0gYnJhbmNoOwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICB1bnNpZ25lZCBpbnQgYToxOwotCSAgIHVuc2lnbmVkIGludCB6OjE7Ci0JICAgdW5zaWduZWQgaW50IHJjb25kOjM7Ci0JICAgdW5zaWduZWQgaW50IG9wMjozOwotCSAgIHVuc2lnbmVkIGludCBESVNQMTZISToyOwotCSAgIHVuc2lnbmVkIGludCBwOjE7Ci0JICAgdW5zaWduZWQgaW50IF9yczE6NTsKLQkgICB1bnNpZ25lZCBpbnQgRElTUDE2TE86MTQ7Ci0JIH0gYnJhbmNoMTY7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOwotCSAgIHVuc2lnbmVkIGludCBhZGlzcDMwOjMwOwotCSAgICNkZWZpbmUJZGlzcDMwCWNhbGwuYWRpc3AzMAotCSB9IGNhbGw7Ci0gICAgIH07Ci0KLSAgICovCi0KLS8qIE5vbnplcm8gaWYgSU5TTiBpcyB0aGUgb3Bjb2RlIGZvciBhIGRlbGF5ZWQgYnJhbmNoLiAgKi8KLXN0YXRpYyBpbnQKLWlzX2RlbGF5ZWRfYnJhbmNoIChpbnNuKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci17Ci0gIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3A7Ci0KLSAgZm9yIChvcCA9IG9wY29kZV9oYXNoX3RhYmxlW0hBU0hfSU5TTiAoaW5zbildOyBvcDsgb3AgPSBvcC0+bmV4dCkKLSAgICB7Ci0gICAgICBDT05TVCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcGNvZGUgPSBvcC0+b3Bjb2RlOwotICAgICAgaWYgKChvcGNvZGUtPm1hdGNoICYgaW5zbikgPT0gb3Bjb2RlLT5tYXRjaAotCSAgJiYgKG9wY29kZS0+bG9zZSAmIGluc24pID09IDApCi0JcmV0dXJuIChvcGNvZGUtPmZsYWdzICYgRl9ERUxBWUVEKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBleHRlcm4gdm9pZCBxc29ydCAoKTsgKi8KLQotLyogUmVjb3JkcyBjdXJyZW50IG1hc2sgb2YgU1BBUkNfT1BDT0RFX0FSQ0hfRk9PIHZhbHVlcywgdXNlZCB0byBwYXNzIHZhbHVlCi0gICB0byBjb21wYXJlX29wY29kZXMuICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjdXJyZW50X2FyY2hfbWFzazsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gTUVNQUREUiBvbiBJTkZPLT5TVFJFQU0uCi0KLSAgIFdlIHN1ZmZpeCB0aGUgaW5zdHJ1Y3Rpb24gd2l0aCBhIGNvbW1lbnQgdGhhdCBnaXZlcyB0aGUgYWJzb2x1dGUKLSAgIGFkZHJlc3MgaW52b2x2ZWQsIGFzIHdlbGwgYXMgaXRzIHN5bWJvbGljIGZvcm0sIGlmIHRoZSBpbnN0cnVjdGlvbgotICAgaXMgcHJlY2VkZWQgYnkgYSBmaW5kYWJsZSBgc2V0aGknIGFuZCBpdCBlaXRoZXIgYWRkcyBhbiBpbW1lZGlhdGUKLSAgIGRpc3BsYWNlbWVudCB0byB0aGF0IHJlZ2lzdGVyLCBvciBpdCBpcyBhbiBgYWRkJyBvciBgb3InIGluc3RydWN0aW9uCi0gICBvbiB0aGF0IHJlZ2lzdGVyLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX3NwYXJjIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIEZJTEUgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHJlZ2lzdGVyIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3A7Ci0gIC8qIE5vbnplcm8gb2Ygb3Bjb2RlIHRhYmxlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgKi8KLSAgc3RhdGljIGludCBvcGNvZGVzX2luaXRpYWxpemVkID0gMDsKLSAgLyogYmZkIG1hY2ggbnVtYmVyIG9mIGxhc3QgY2FsbC4gICovCi0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfbWFjaCA9IDA7Ci0gIGJmZF92bWEgKCpnZXR3b3JkKSBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLQotICBpZiAoIW9wY29kZXNfaW5pdGlhbGl6ZWQKLSAgICAgIHx8IGluZm8tPm1hY2ggIT0gY3VycmVudF9tYWNoKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBjdXJyZW50X2FyY2hfbWFzayA9IGNvbXB1dGVfYXJjaF9tYXNrIChpbmZvLT5tYWNoKTsKLQotICAgICAgaWYgKCFvcGNvZGVzX2luaXRpYWxpemVkKQotCXNvcnRlZF9vcGNvZGVzID0gKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiopCi0JICB4bWFsbG9jIChzcGFyY19udW1fb3Bjb2RlcyAqIHNpemVvZiAoc3RydWN0IHNwYXJjX29wY29kZSAqKSk7Ci0gICAgICAvKiBSZXNldCB0aGUgc29ydGVkIHRhYmxlIHNvIHdlIGNhbiByZXNvcnQgaXQuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IHNwYXJjX251bV9vcGNvZGVzOyArK2kpCi0Jc29ydGVkX29wY29kZXNbaV0gPSAmc3BhcmNfb3Bjb2Rlc1tpXTsKLSAgICAgIHFzb3J0ICgoY2hhciAqKSBzb3J0ZWRfb3Bjb2Rlcywgc3BhcmNfbnVtX29wY29kZXMsCi0JICAgICBzaXplb2YgKHNvcnRlZF9vcGNvZGVzWzBdKSwgY29tcGFyZV9vcGNvZGVzKTsKLQotICAgICAgYnVpbGRfaGFzaF90YWJsZSAoc29ydGVkX29wY29kZXMsIG9wY29kZV9oYXNoX3RhYmxlLCBzcGFyY19udW1fb3Bjb2Rlcyk7Ci0gICAgICBjdXJyZW50X21hY2ggPSBpbmZvLT5tYWNoOwotICAgICAgb3Bjb2Rlc19pbml0aWFsaXplZCA9IDE7Ci0gICAgfQotCi0gIHsKLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0JKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgLyogT24gU1BBUkNsaXRlIHZhcmlhbnRzIHN1Y2ggYXMgREFObGl0ZSAoc3BhcmM4NngpLCBpbnN0cnVjdGlvbnMKLSAgICAgYXJlIGFsd2F5cyBiaWctZW5kaWFuIGV2ZW4gd2hlbiB0aGUgbWFjaGluZSBpcyBpbiBsaXR0bGUtZW5kaWFuIG1vZGUuICovCi0gIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUpCi0gICAgZ2V0d29yZCA9IGJmZF9nZXRiMzI7Ci0gIGVsc2UKLSAgICBnZXR3b3JkID0gYmZkX2dldGwzMjsKLQotICBpbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQotICBpbmZvLT5pbnNuX2luZm9fdmFsaWQgPSAxOwkJCS8qIFdlIGRvIHJldHVybiB0aGlzIGluZm8gKi8KLSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmJyYW5jaDsJCS8qIEFzc3VtZSBub24gYnJhbmNoIGluc24gKi8KLSAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMDsJCQkvKiBBc3N1bWUgbm8gZGVsYXkgKi8KLSAgaW5mby0+dGFyZ2V0ID0gMDsJCQkJLyogQXNzdW1lIG5vIHRhcmdldCBrbm93biAqLwotCi0gIGZvciAob3AgPSBvcGNvZGVfaGFzaF90YWJsZVtIQVNIX0lOU04gKGluc24pXTsgb3A7IG9wID0gb3AtPm5leHQpCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IHNwYXJjX29wY29kZSAqb3Bjb2RlID0gb3AtPm9wY29kZTsKLQotICAgICAgLyogSWYgdGhlIGluc24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSwgc2tpcCBpdC4gICovCi0gICAgICBpZiAoISAob3Bjb2RlLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgob3Bjb2RlLT5tYXRjaCAmIGluc24pID09IG9wY29kZS0+bWF0Y2gKLQkgICYmIChvcGNvZGUtPmxvc2UgJiBpbnNuKSA9PSAwKQotCXsKLQkgIC8qIE5vbnplcm8gbWVhbnMgdGhhdCB3ZSBoYXZlIGZvdW5kIGFuIGluc3RydWN0aW9uIHdoaWNoIGhhcwotCSAgICAgdGhlIGVmZmVjdCBvZiBhZGRpbmcgb3Igb3InaW5nIHRoZSBpbW0xMyBmaWVsZCB0byByczEuICAqLwotCSAgaW50IGltbV9hZGRlZF90b19yczEgPSAwOwotCSAgaW50IGltbV9vcmVkX3RvX3JzMSA9IDA7Ci0KLQkgIC8qIE5vbnplcm8gbWVhbnMgdGhhdCB3ZSBoYXZlIGZvdW5kIGEgcGx1cyBzaWduIGluIHRoZSBhcmdzCi0JICAgICBmaWVsZCBvZiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQkgIGludCBmb3VuZF9wbHVzID0gMDsKLQkgIAotCSAgLyogTm9uemVybyBtZWFucyB3ZSBoYXZlIGFuIGFubnVsbGVkIGJyYW5jaC4gICovCi0JICBpbnQgaXNfYW5udWxsZWQgPSAwOwotCi0JICAvKiBEbyB3ZSBoYXZlIGFuIGBhZGQnIG9yIGBvcicgaW5zdHJ1Y3Rpb24gY29tYmluaW5nIGFuCi0gICAgICAgICAgICAgaW1tZWRpYXRlIHdpdGggcnMxPyAgKi8KLQkgIGlmIChvcGNvZGUtPm1hdGNoID09IDB4ODAxMDIwMDApIC8qIG9yICovCi0JICAgIGltbV9vcmVkX3RvX3JzMSA9IDE7Ci0JICBpZiAob3Bjb2RlLT5tYXRjaCA9PSAweDgwMDAyMDAwKSAvKiBhZGQgKi8KLQkgICAgaW1tX2FkZGVkX3RvX3JzMSA9IDE7Ci0KLQkgIGlmIChYX1JTMSAoaW5zbikgIT0gWF9SRCAoaW5zbikKLQkgICAgICAmJiBzdHJjaHIgKG9wY29kZS0+YXJncywgJ3InKSAhPSAwKQotCSAgICAgIC8qIENhbid0IGRvIHNpbXBsZSBmb3JtYXQgaWYgc291cmNlIGFuZCBkZXN0IGFyZSBkaWZmZXJlbnQuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgaWYgKFhfUlMyIChpbnNuKSAhPSBYX1JEIChpbnNuKQotCSAgICAgICYmIHN0cmNociAob3Bjb2RlLT5hcmdzLCAnTycpICE9IDApCi0JICAgICAgLyogQ2FuJ3QgZG8gc2ltcGxlIGZvcm1hdCBpZiBzb3VyY2UgYW5kIGRlc3QgYXJlIGRpZmZlcmVudC4gICovCi0JICAgICAgY29udGludWU7Ci0KLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCBvcGNvZGUtPm5hbWUpOwotCi0JICB7Ci0JICAgIHJlZ2lzdGVyIENPTlNUIGNoYXIgKnM7Ci0KLQkgICAgaWYgKG9wY29kZS0+YXJnc1swXSAhPSAnLCcpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIgIik7Ci0JICAgIGZvciAocyA9IG9wY29kZS0+YXJnczsgKnMgIT0gJ1wwJzsgKytzKQotCSAgICAgIHsKLQkJd2hpbGUgKCpzID09ICcsJykKLQkJICB7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiwiKTsKLQkJICAgICsrczsKLQkJICAgIHN3aXRjaCAoKnMpIHsKLQkJICAgIGNhc2UgJ2EnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgImEiKTsKLQkJICAgICAgaXNfYW5udWxsZWQgPSAxOwotCQkgICAgICArK3M7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgY2FzZSAnTic6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAicG4iKTsKLQkJICAgICAgKytzOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnVCc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAicHQiKTsKLQkJICAgICAgKytzOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9CQkvKiBzd2l0Y2ggb24gYXJnICovCi0JCSAgfQkJLyogd2hpbGUgdGhlcmUgYXJlIGNvbW1hIHN0YXJ0ZWQgYXJncyAqLwotCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiICIpOwotCQkJCi0JCXN3aXRjaCAoKnMpCi0JCSAgewotCQkgIGNhc2UgJysnOgotCQkgICAgZm91bmRfcGx1cyA9IDE7Ci0KLQkJICAgIC8qIG5vdGUgZmFsbC10aHJvdWdoICovCi0JCSAgZGVmYXVsdDoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWMiLCAqcyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJyMnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIwIik7Ci0JCSAgICBicmVhazsKLQotI2RlZmluZQlyZWcobikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwgcmVnX25hbWVzW25dKQotCQkgIGNhc2UgJzEnOgotCQkgIGNhc2UgJ3InOgotCQkgICAgcmVnIChYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICcyJzoKLQkJICBjYXNlICdPJzoKLQkJICAgIHJlZyAoWF9SUzIgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZCc6Ci0JCSAgICByZWcgKFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotI3VuZGVmCXJlZwotCi0jZGVmaW5lCWZyZWcobikJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIGZyZWdfbmFtZXNbbl0pCi0jZGVmaW5lCWZyZWd4KG4pCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIGZyZWdfbmFtZXNbKChuKSAmIH4xKSB8ICgoKG4pICYgMSkgPDwgNSldKQotCQkgIGNhc2UgJ2UnOgotCQkgICAgZnJlZyAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJ3YnOgkvKiBkb3VibGUvZXZlbiAqLwotCQkgIGNhc2UgJ1YnOgkvKiBxdWFkL211bHRpcGxlIG9mIDQgKi8KLQkJICAgIGZyZWd4IChYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdmJzoKLQkJICAgIGZyZWcgKFhfUlMyIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdCJzoJLyogZG91YmxlL2V2ZW4gKi8KLQkJICBjYXNlICdSJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCi0JCSAgICBmcmVneCAoWF9SUzIgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZyc6Ci0JCSAgICBmcmVnIChYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdIJzoJLyogZG91YmxlL2V2ZW4gKi8KLQkJICBjYXNlICdKJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCi0JCSAgICBmcmVneCAoWF9SRCAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0jdW5kZWYJZnJlZwotI3VuZGVmCWZyZWd4Ci0KLSNkZWZpbmUJY3JlZyhuKQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYyV1IiwgKHVuc2lnbmVkIGludCkgKG4pKQotCQkgIGNhc2UgJ2InOgotCQkgICAgY3JlZyAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnYyc6Ci0JCSAgICBjcmVnIChYX1JTMiAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdEJzoKLQkJICAgIGNyZWcgKFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotI3VuZGVmCWNyZWcKLQotCQkgIGNhc2UgJ2gnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWhpKCUjeCkiLAotCQkJCQkgICAoMHhGRkZGRkZGRgotCQkJCQkgICAgJiAoKGludCkgWF9JTU0yMiAoaW5zbikgPDwgMTApKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2knOgkvKiAxMyBiaXQgaW1tZWRpYXRlICovCi0JCSAgY2FzZSAnSSc6CS8qIDExIGJpdCBpbW1lZGlhdGUgKi8KLQkJICBjYXNlICdqJzoJLyogMTAgYml0IGltbWVkaWF0ZSAqLwotCQkgICAgewotCQkgICAgICBpbnQgaW1tOwotCi0JCSAgICAgIGlmICgqcyA9PSAnaScpCi0JCSAgICAgICAgaW1tID0gWF9TSU1NIChpbnNuLCAxMyk7Ci0JCSAgICAgIGVsc2UgaWYgKCpzID09ICdJJykKLQkJCWltbSA9IFhfU0lNTSAoaW5zbiwgMTEpOwotCQkgICAgICBlbHNlCi0JCQlpbW0gPSBYX1NJTU0gKGluc24sIDEwKTsKLQotCQkgICAgICAvKiBDaGVjayB0byBzZWUgd2hldGhlciB3ZSBoYXZlIGEgMStpLCBhbmQgdGFrZQotCQkJIG5vdGUgb2YgdGhhdCBmYWN0LgotCi0JCQkgTm90ZTogYmVjYXVzZSBvZiB0aGUgd2F5IHdlIHNvcnQgdGhlIHRhYmxlLAotCQkJIHdlIHdpbGwgYmUgbWF0Y2hpbmcgMStpIHJhdGhlciB0aGFuIGkrMSwKLQkJCSBzbyBpdCBpcyBPSyB0byBhc3N1bWUgdGhhdCBpIGlzIGFmdGVyICssCi0JCQkgbm90IGJlZm9yZSBpdC4gICovCi0JCSAgICAgIGlmIChmb3VuZF9wbHVzKQotCQkJaW1tX2FkZGVkX3RvX3JzMSA9IDE7Ci0JCSAgICAgIAotCQkgICAgICBpZiAoaW1tIDw9IDkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVkIiwgaW1tKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlI3giLCBpbW0pOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdYJzoJLyogNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0JCSAgY2FzZSAnWSc6CS8qIDYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotCQkgICAgewotCQkgICAgICBpbnQgaW1tID0gWF9JTU0gKGluc24sICpzID09ICdYJyA/IDUgOiA2KTsKLQotCQkgICAgICBpZiAoaW1tIDw9IDkpCi0JCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLCBpbW0pOwotCQkgICAgICBlbHNlCi0JCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSN4IiwgKHVuc2lnbmVkKSBpbW0pOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdLJzoKLQkJICAgIHsKLQkJICAgICAgaW50IG1hc2sgPSBYX01FTUJBUiAoaW5zbik7Ci0JCSAgICAgIGludCBiaXQgPSAweDQwLCBwcmludGVkX29uZSA9IDA7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICAgICAgaWYgKG1hc2sgPT0gMCkKLQkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIwIik7Ci0JCSAgICAgIGVsc2UKLQkJCXdoaWxlIChiaXQpCi0JCQkgIHsKLQkJCSAgICBpZiAobWFzayAmIGJpdCkKLQkJCSAgICAgIHsKLQkJCQlpZiAocHJpbnRlZF9vbmUpCi0JCQkJICAoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAifCIpOwotCQkJCW5hbWUgPSBzcGFyY19kZWNvZGVfbWVtYmFyIChiaXQpOwotCQkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOwotCQkJCXByaW50ZWRfb25lID0gMTsKLQkJCSAgICAgIH0KLQkJCSAgICBiaXQgPj49IDE7Ci0JCQkgIH0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBjYXNlICdrJzoKLQkJICAgIGluZm8tPnRhcmdldCA9IG1lbWFkZHIgKyBTRVggKFhfRElTUDE2IChpbnNuKSwgMTYpICogNDsKLQkJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW5mby0+dGFyZ2V0LCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnRyc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AxOSAoaW5zbiksIDE5KSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJzYnOgotCQkgIGNhc2UgJzcnOgotCQkgIGNhc2UgJzgnOgotCQkgIGNhc2UgJzknOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWZjYyVjIiwgKnMgLSAnNicgKyAnMCcpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd6JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVpY2MiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnWic6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUleGNjIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0UnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWNjciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdzJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmcHJzIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ28nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWFzaSIpOwotCQkgICAgYnJlYWs7Ci0JCSAgICAKLQkJICBjYXNlICdXJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV0aWNrIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ1AnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXBjIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJz8nOgotCQkgICAgaWYgKFhfUlMxIChpbnNuKSA9PSAzMSkKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXZlciIpOwotCQkgICAgZWxzZSBpZiAoKHVuc2lnbmVkKSBYX1JTMSAoaW5zbikgPCAxNikKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OV9wcml2X3JlZ19uYW1lc1tYX1JTMSAoaW5zbildKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXJlc2VydmVkIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJyEnOgotCQkgICAgaWYgKCh1bnNpZ25lZCkgWF9SRCAoaW5zbikgPCAxNSkKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OV9wcml2X3JlZ19uYW1lc1tYX1JEIChpbnNuKV0pOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcmVzZXJ2ZWQiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnLyc6Ci0JCSAgICBpZiAoWF9SUzEgKGluc24pIDwgMTYgfHwgWF9SUzEgKGluc24pID4gMjMpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAotCQkJCQkgICAgIHY5YV9hc3JfcmVnX25hbWVzW1hfUlMxIChpbnNuKS0xNl0pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdfJzoKLQkJICAgIGlmIChYX1JEIChpbnNuKSA8IDE2IHx8IFhfUkQgKGluc24pID4gMjMpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOwotCQkgICAgZWxzZQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAotCQkJCQkgICAgIHY5YV9hc3JfcmVnX25hbWVzW1hfUkQgKGluc24pLTE2XSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJyonOgotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX3ByZWZldGNoIChYX1JEIChpbnNuKSk7Ci0KLQkJICAgICAgaWYgKG5hbWUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLCBYX1JEIChpbnNuKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgICAgCi0JCSAgY2FzZSAnTSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYXNyJWQiLCBYX1JTMSAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0JCSAgICAKLQkJICBjYXNlICdtJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVhc3IlZCIsIFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgICAgCi0JCSAgY2FzZSAnTCc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AzMCAoaW5zbiksIDMwKSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ24nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCSAgICAgIChzdHJlYW0sICIlI3giLCBTRVggKFhfRElTUDIyIChpbnNuKSwgMjIpKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnbCc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AyMiAoaW5zbiksIDIyKSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0EnOgotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX2FzaSAoWF9BU0kgKGluc24pKTsKLQotCQkgICAgICBpZiAobmFtZSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkJICAgICAgZWxzZQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIoJWQpIiwgWF9BU0kgKGluc24pKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBjYXNlICdDJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjc3IiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnRic6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlZnNyIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3AnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXBzciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdxJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmcSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdRJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjcSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd0JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV0YnIiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAndyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUld2ltIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3gnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlZCIsCi0JCQkJCSAgICgoWF9MRFNUX0kgKGluc24pIDw8IDgpCi0JCQkJCSAgICArIFhfQVNJIChpbnNuKSkpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd5JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV5Iik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3UnOgotCQkgIGNhc2UgJ1UnOgotCQkgICAgewotCQkgICAgICBpbnQgdmFsID0gKnMgPT0gJ1UnID8gWF9SUzEgKGluc24pIDogWF9SRCAoaW5zbik7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzcGFyY19kZWNvZGVfc3BhcmNsZXRfY3ByZWcgKHZhbCk7Ci0KLQkJICAgICAgaWYgKG5hbWUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjcHJlZyglZCkiLCB2YWwpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotCi0JICAvKiBJZiB3ZSBhcmUgYWRkaW5nIG9yIG9yJ2luZyBzb21ldGhpbmcgdG8gcnMxLCB0aGVuCi0JICAgICBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzCi0JICAgICBhIHNldGhpIHRvIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIGluIHRoZSBzZXRoaS4KLQkgICAgIElmIHNvLCBhdHRlbXB0IHRvIHByaW50IHRoZSByZXN1bHQgb2YgdGhlIGFkZCBvcgotCSAgICAgb3IgKGluIHRoaXMgY29udGV4dCBhZGQgYW5kIG9yIGRvIHRoZSBzYW1lIHRoaW5nKQotCSAgICAgYW5kIGl0cyBzeW1ib2xpYyB2YWx1ZS4gICovCi0JICBpZiAoaW1tX29yZWRfdG9fcnMxIHx8IGltbV9hZGRlZF90b19yczEpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHByZXZfaW5zbjsKLQkgICAgICBpbnQgZXJyY29kZTsKLQotCSAgICAgIGVycmNvZGUgPQotCQkoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCSAgKG1lbWFkZHIgLSA0LCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7Ci0JICAgICAgcHJldl9pbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJZiBpdCBpcyBhIGRlbGF5ZWQgYnJhbmNoLCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlCi0JCSAgICAgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBkZWxheWVkIGJyYW5jaC4gIFRoaXMgaGFuZGxlcwotCQkgICAgIHNlcXVlbmNlcyBzdWNoIGFzCi0KLQkJICAgICBzZXRoaSAlbzEsICVoaShfZm9vKSwgJW8xCi0JCSAgICAgY2FsbCBfcHJpbnRmCi0JCSAgICAgb3IgJW8xLCAlbG8oX2ZvbyksICVvMQotCQkgICAgICovCi0KLQkJICBpZiAoaXNfZGVsYXllZF9icmFuY2ggKHByZXZfaW5zbikpCi0JCSAgICB7Ci0JCSAgICAgIGVycmNvZGUgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCQkobWVtYWRkciAtIDgsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLQkJICAgICAgcHJldl9pbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSByZWFkaW5nIG1lbW9yeSwgdGhlbiBhc3N1bWUKLQkJIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgbm90IHNldGhpLiAgKi8KLQkgICAgICBpZiAoZXJyY29kZSA9PSAwKQotCQl7Ci0JCSAgLyogSXMgaXQgc2V0aGkgdG8gdGhlIHNhbWUgcmVnaXN0ZXI/ICAqLwotCQkgIGlmICgocHJldl9pbnNuICYgMHhjMWMwMDAwMCkgPT0gMHgwMTAwMDAwMAotCQkgICAgICAmJiBYX1JEIChwcmV2X2luc24pID09IFhfUlMxIChpbnNuKSkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICJcdCEgIik7Ci0JCSAgICAgIGluZm8tPnRhcmdldCA9IAotCQkJKDB4RkZGRkZGRkYgJiAoaW50KSBYX0lNTTIyIChwcmV2X2luc24pIDw8IDEwKTsKLQkJICAgICAgaWYgKGltbV9hZGRlZF90b19yczEpCi0JCQlpbmZvLT50YXJnZXQgKz0gWF9TSU1NIChpbnNuLCAxMyk7Ci0JCSAgICAgIGVsc2UKLQkJCWluZm8tPnRhcmdldCB8PSBYX1NJTU0gKGluc24sIDEzKTsKLQkJICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkJICAgICAgaW5mby0+ZGF0YV9zaXplID0gNDsgIC8qIEZJWE1FISEhICovCi0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAob3Bjb2RlLT5mbGFncyAmIChGX1VOQlJ8Rl9DT05EQlJ8Rl9KU1IpKQotCSAgICB7Ci0JCS8qIEZJWE1FIC0tIGNoZWNrIGlzX2FubnVsbGVkIGZsYWcgKi8KLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfVU5CUikKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfQ09OREJSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfY29uZGJyYW5jaDsKLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfSlNSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfanNyOwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9ERUxBWUVEKQotCQlpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOwotCSAgICB9Ci0KLQkgIHJldHVybiBzaXplb2YgKGJ1ZmZlcik7Ci0JfQotICAgIH0KLQotICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsJLyogTWFyayBhcyBub24tdmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sIF8oInVua25vd24iKSk7Ci0gIHJldHVybiBzaXplb2YgKGJ1ZmZlcik7Ci19Ci0KLS8qIEdpdmVuIEJGRCBtYWNoIG51bWJlciwgcmV0dXJuIGEgbWFzayBvZiBTUEFSQ19PUENPREVfQVJDSF9GT08gdmFsdWVzLiAgKi8KLQotc3RhdGljIGludAotY29tcHV0ZV9hcmNoX21hc2sgKG1hY2gpCi0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgc3dpdGNoIChtYWNoKQotICAgIHsKLSAgICBjYXNlIDAgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmMgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0IDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlIDoKLSAgICAgIC8qIHNwYXJjbGl0ZXMgaW5zbnMgYXJlIHJlY29nbml6ZWQgYnkgZGVmYXVsdCAoYmVjYXVzZSB0aGF0J3MgaG93Ci0JIHRoZXkndmUgYWx3YXlzIGJlZW4gdHJlYXRlZCwgZm9yIGJldHRlciBvciB3b3JzZSkuICBLbHVkZ2UgdGhpcyBieQotCSBpbmRpY2F0aW5nIGdlbmVyaWMgdjggaXMgYWxzbyBzZWxlY3RlZC4gICovCi0gICAgICByZXR1cm4gKFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSkKLQkgICAgICB8IFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KSk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXMgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjkgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5KTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjlhIDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOUEpOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIENvbXBhcmUgb3Bjb2RlcyBBIGFuZCBCLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9vcGNvZGVzIChhLCBiKQotICAgICBjb25zdCBQVFIgYTsKLSAgICAgY29uc3QgUFRSIGI7Ci17Ci0gIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wMCA9ICogKHN0cnVjdCBzcGFyY19vcGNvZGUgKiopIGE7Ci0gIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wMSA9ICogKHN0cnVjdCBzcGFyY19vcGNvZGUgKiopIGI7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IG1hdGNoMCA9IG9wMC0+bWF0Y2gsIG1hdGNoMSA9IG9wMS0+bWF0Y2g7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGxvc2UwID0gb3AwLT5sb3NlLCBsb3NlMSA9IG9wMS0+bG9zZTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSWYgb25lIChhbmQgb25seSBvbmUpIGluc24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSwKLSAgICAgcHJlZmVyIHRoZSBvbmUgdGhhdCBpcy4gIElmIG5laXRoZXIgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZXkncmUgYm90aCBmb3IKLSAgICAgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlLCBjb250aW51ZSBwcm9jZXNzaW5nLiAgT3RoZXJ3aXNlIChib3RoIHVuc3VwcG9ydGVkCi0gICAgIGFuZCBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMpLCBwcmVmZXIgbG93ZXIgbnVtYmVyZWQgYXJjaCdzIChmdWRnZWQKLSAgICAgYnkgY29tcGFyaW5nIHRoZSBiaXRtYXNrcykuICAqLwotICBpZiAob3AwLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykKLSAgICB7Ci0gICAgICBpZiAoISAob3AxLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykpCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcDEtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKQotCXJldHVybiAxOwotICAgICAgZWxzZSBpZiAob3AwLT5hcmNoaXRlY3R1cmUgIT0gb3AxLT5hcmNoaXRlY3R1cmUpCi0JcmV0dXJuIG9wMC0+YXJjaGl0ZWN0dXJlIC0gb3AxLT5hcmNoaXRlY3R1cmU7Ci0gICAgfQotCi0gIC8qIElmIGEgYml0IGlzIHNldCBpbiBib3RoIG1hdGNoIGFuZCBsb3NlLCB0aGVyZSBpcyBzb21ldGhpbmcKLSAgICAgd3Jvbmcgd2l0aCB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKG1hdGNoMCAmIGxvc2UwKQotICAgIHsKLSAgICAgIGZwcmludGYKLQkoc3RkZXJyLAotCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSBfKCJJbnRlcm5hbCBlcnJvcjogIGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIiksCi0JIG9wMC0+bmFtZSwgbWF0Y2gwLCBsb3NlMCk7Ci0gICAgICBvcDAtPmxvc2UgJj0gfm9wMC0+bWF0Y2g7Ci0gICAgICBsb3NlMCA9IG9wMC0+bG9zZTsKLSAgICB9Ci0KLSAgaWYgKG1hdGNoMSAmIGxvc2UxKQotICAgIHsKLSAgICAgIGZwcmludGYKLQkoc3RkZXJyLAotCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSBfKCJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iKSwKLQkgb3AxLT5uYW1lLCBtYXRjaDEsIGxvc2UxKTsKLSAgICAgIG9wMS0+bG9zZSAmPSB+b3AxLT5tYXRjaDsKLSAgICAgIGxvc2UxID0gb3AxLT5sb3NlOwotICAgIH0KLQotICAvKiBCZWNhdXNlIHRoZSBiaXRzIHRoYXQgYXJlIHZhcmlhYmxlIGluIG9uZSBvcGNvZGUgYXJlIGNvbnN0YW50IGluCi0gICAgIGFub3RoZXIsIGl0IGlzIGltcG9ydGFudCB0byBvcmRlciB0aGUgb3Bjb2RlcyBpbiB0aGUgcmlnaHQgb3JkZXIuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCB4ID0gMSA8PCBpOwotICAgICAgaW50IHgwID0gKG1hdGNoMCAmIHgpICE9IDA7Ci0gICAgICBpbnQgeDEgPSAobWF0Y2gxICYgeCkgIT0gMDsKLQotICAgICAgaWYgKHgwICE9IHgxKQotCXJldHVybiB4MSAtIHgwOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCB4ID0gMSA8PCBpOwotICAgICAgaW50IHgwID0gKGxvc2UwICYgeCkgIT0gMDsKLSAgICAgIGludCB4MSA9IChsb3NlMSAmIHgpICE9IDA7Ci0KLSAgICAgIGlmICh4MCAhPSB4MSkKLQlyZXR1cm4geDEgLSB4MDsKLSAgICB9Ci0KLSAgLyogVGhleSBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLiAgU28gYXMgbG9uZyBhcyB0aGUgb3Bjb2RlIHRhYmxlIGlzCi0gICAgIHZhbGlkLCB3ZSBjYW4gcHV0IHdoaWNoZXZlciBvbmUgZmlyc3Qgd2Ugd2FudCwgb24gYWVzdGhldGljIGdyb3VuZHMuICAqLwotCi0gIC8qIE91ciBmaXJzdCBhZXN0aGV0aWMgZ3JvdW5kIGlzIHRoYXQgYWxpYXNlcyBkZWZlciB0byByZWFsIGluc25zLiAgKi8KLSAgewotICAgIGludCBhbGlhc19kaWZmID0gKG9wMC0+ZmxhZ3MgJiBGX0FMSUFTKSAtIChvcDEtPmZsYWdzICYgRl9BTElBUyk7Ci0gICAgaWYgKGFsaWFzX2RpZmYgIT0gMCkKLSAgICAgIC8qIFB1dCB0aGUgb25lIHRoYXQgaXNuJ3QgYW4gYWxpYXMgZmlyc3QuICAqLwotICAgICAgcmV0dXJuIGFsaWFzX2RpZmY7Ci0gIH0KLQotICAvKiBFeGNlcHQgZm9yIGFsaWFzZXMsIHR3byAiaWRlbnRpY2FsIiBpbnN0cnVjdGlvbnMgaGFkCi0gICAgIGJldHRlciBoYXZlIHRoZSBzYW1lIG9wY29kZS4gIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgb24gdGhlIHRhYmxlLiAgKi8KLSAgaSA9IHN0cmNtcCAob3AwLT5uYW1lLCBvcDEtPm5hbWUpOwotICBpZiAoaSkKLSAgICB7Ci0gICAgICBpZiAob3AwLT5mbGFncyAmIEZfQUxJQVMpIC8qIElmIHRoZXkncmUgYm90aCBhbGlhc2VzLCBiZSBhcmJpdHJhcnkuICovCi0JcmV0dXJuIGk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLAotCQkgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJIF8oIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiA9PSBcIiVzXCJcbiIpLAotCQkgb3AwLT5uYW1lLCBvcDEtPm5hbWUpOwotICAgIH0KLQotICAvKiBGZXdlciBhcmd1bWVudHMgYXJlIHByZWZlcnJlZC4gICovCi0gIHsKLSAgICBpbnQgbGVuZ3RoX2RpZmYgPSBzdHJsZW4gKG9wMC0+YXJncykgLSBzdHJsZW4gKG9wMS0+YXJncyk7Ci0gICAgaWYgKGxlbmd0aF9kaWZmICE9IDApCi0gICAgICAvKiBQdXQgdGhlIG9uZSB3aXRoIGZld2VyIGFyZ3VtZW50cyBmaXJzdC4gICovCi0gICAgICByZXR1cm4gbGVuZ3RoX2RpZmY7Ci0gIH0KLQotICAvKiBQdXQgMStpIGJlZm9yZSBpKzEuICAqLwotICB7Ci0gICAgY2hhciAqcDAgPSAoY2hhciAqKSBzdHJjaHIgKG9wMC0+YXJncywgJysnKTsKLSAgICBjaGFyICpwMSA9IChjaGFyICopIHN0cmNociAob3AxLT5hcmdzLCAnKycpOwotCi0gICAgaWYgKHAwICYmIHAxKQotICAgICAgewotCS8qIFRoZXJlIGlzIGEgcGx1cyBpbiBib3RoIG9wZXJhbmRzLiAgTm90ZSB0aGF0IGEgcGx1cwotCSAgIHNpZ24gY2Fubm90IGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gYXJncywKLQkgICBzbyB0aGUgZm9sbG93aW5nIFstMV0ncyBhcmUgdmFsaWQuICAqLwotCWlmIChwMFstMV0gPT0gJ2knICYmIHAxWzFdID09ICdpJykKLQkgIC8qIG9wMCBpcyBpKzEgYW5kIG9wMSBpcyAxK2ksIHNvIG9wMSBnb2VzIGZpcnN0LiAgKi8KLQkgIHJldHVybiAxOwotCWlmIChwMFsxXSA9PSAnaScgJiYgcDFbLTFdID09ICdpJykKLQkgIC8qIG9wMCBpcyAxK2kgYW5kIG9wMSBpcyBpKzEsIHNvIG9wMCBnb2VzIGZpcnN0LiAgKi8KLQkgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIFB1dCAxLGkgYmVmb3JlIGksMS4gICovCi0gIHsKLSAgICBpbnQgaTAgPSBzdHJuY21wIChvcDAtPmFyZ3MsICJpLDEiLCAzKSA9PSAwOwotICAgIGludCBpMSA9IHN0cm5jbXAgKG9wMS0+YXJncywgImksMSIsIDMpID09IDA7Ci0KLSAgICBpZiAoaTAgXiBpMSkKLSAgICAgIHJldHVybiBpMCAtIGkxOwotICB9Ci0KLSAgLyogVGhleSBhcmUsIGFzIGZhciBhcyB3ZSBjYW4gdGVsbCwgaWRlbnRpY2FsLgotICAgICBTaW5jZSBxc29ydCBtYXkgaGF2ZSByZWFycmFuZ2VkIHRoZSB0YWJsZSBwYXJ0aWFsbHksIHRoZXJlIGlzCi0gICAgIG5vIHdheSB0byB0ZWxsIHdoaWNoIG9uZSB3YXMgZmlyc3QgaW4gdGhlIG9wY29kZSB0YWJsZSBhcwotICAgICB3cml0dGVuLCBzbyBqdXN0IHNheSB0aGVyZSBhcmUgZXF1YWwuICAqLwotICAvKiA/Pz8gVGhpcyBpcyBubyBsb25nZXIgdHJ1ZSBub3cgdGhhdCB3ZSBzb3J0IGEgdmVjdG9yIG9mIHBvaW50ZXJzLAotICAgICBub3QgdGhlIHRhYmxlIGl0c2VsZi4gICovCi0gIHJldHVybiAwOwotfQotCi0vKiBCdWlsZCBhIGhhc2ggdGFibGUgZnJvbSB0aGUgb3Bjb2RlIHRhYmxlLgotICAgT1BDT0RFX1RBQkxFIGlzIGEgc29ydGVkIGxpc3Qgb2YgcG9pbnRlcnMgaW50byB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2hhc2hfdGFibGUgKG9wY29kZV90YWJsZSwgaGFzaF90YWJsZSwgbnVtX29wY29kZXMpCi0gICAgIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKipvcGNvZGVfdGFibGU7Ci0gICAgIHN0cnVjdCBvcGNvZGVfaGFzaCAqKmhhc2hfdGFibGU7Ci0gICAgIGludCBudW1fb3Bjb2RlczsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGludCBoYXNoX2NvdW50W0hBU0hfU0laRV07Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKmhhc2hfYnVmID0gTlVMTDsKLQotICAvKiBTdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBhbmQgd29yayBiYWNrd2FyZHMgc28gdGhhdCBlYWNoCi0gICAgIGNoYWluIGlzIHNvcnRlZC4gICovCi0KLSAgbWVtc2V0IChoYXNoX3RhYmxlLCAwLCBIQVNIX1NJWkUgKiBzaXplb2YgKGhhc2hfdGFibGVbMF0pKTsKLSAgbWVtc2V0IChoYXNoX2NvdW50LCAwLCBIQVNIX1NJWkUgKiBzaXplb2YgKGhhc2hfY291bnRbMF0pKTsKLSAgaWYgKGhhc2hfYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF9idWYpOwotICBoYXNoX2J1ZiA9IChzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3Bjb2RlX2hhc2gpICogbnVtX29wY29kZXMpOwotICBmb3IgKGkgPSBudW1fb3Bjb2RlcyAtIDE7IGkgPj0gMDsgLS1pKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBoYXNoID0gSEFTSF9JTlNOIChvcGNvZGVfdGFibGVbaV0tPm1hdGNoKTsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCBvcGNvZGVfaGFzaCAqaCA9ICZoYXNoX2J1ZltpXTsKLSAgICAgIGgtPm5leHQgPSBoYXNoX3RhYmxlW2hhc2hdOwotICAgICAgaC0+b3Bjb2RlID0gb3Bjb2RlX3RhYmxlW2ldOwotICAgICAgaGFzaF90YWJsZVtoYXNoXSA9IGg7Ci0gICAgICArK2hhc2hfY291bnRbaGFzaF07Ci0gICAgfQotCi0jaWYgMCAvKiBmb3IgZGVidWdnaW5nICovCi0gIHsKLSAgICBpbnQgbWluX2NvdW50ID0gbnVtX29wY29kZXMsIG1heF9jb3VudCA9IDA7Ci0gICAgaW50IHRvdGFsOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgKytpKQotICAgICAgewotICAgICAgICBpZiAoaGFzaF9jb3VudFtpXSA8IG1pbl9jb3VudCkKLQkgIG1pbl9jb3VudCA9IGhhc2hfY291bnRbaV07Ci0JaWYgKGhhc2hfY291bnRbaV0gPiBtYXhfY291bnQpCi0JICBtYXhfY291bnQgPSBoYXNoX2NvdW50W2ldOwotCXRvdGFsICs9IGhhc2hfY291bnRbaV07Ci0gICAgICB9Ci0KLSAgICBwcmludGYgKCJPcGNvZGUgaGFzaCB0YWJsZSBzdGF0czogbWluICVkLCBtYXggJWQsIGF2ZSAlZlxuIiwKLQkgICAgbWluX2NvdW50LCBtYXhfY291bnQsIChkb3VibGUpIHRvdGFsIC8gSEFTSF9TSVpFKTsKLSAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3NwYXJjLW9wYy5jIGIvb3Bjb2Rlcy9zcGFyYy1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkOWQxOC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3NwYXJjLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzMCArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgc3BhcmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBCRkQgbGlicmFyeS4KLQotQkZEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLXRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgotdmVyc2lvbi4KLQotQkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1mb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgkqLwotCi0vKiBGSVhNRS1zb21lZGF5OiBwZXJoYXBzIHRoZSAsYSdzIGFuZCBzdWNoIHNob3VsZCBiZSBlbWJlZGRlZCBpbiB0aGUKLSAgIGluc3RydWN0aW9uJ3MgbmFtZSByYXRoZXIgdGhhbiB0aGUgYXJncy4gIFRoaXMgd291bGQgbWFrZSBnYXMgZmFzdGVyLCBwaW5zbgotICAgc2xvd2VyLCBidXQgd291bGQgbWVzcyB1cCBzb21lIG1hY3JvcyBhIGJpdC4gIHhveG9yaWNoLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9zcGFyYy5oIgotCi0vKiBTb21lIGRlZmluZXMgdG8gbWFrZSBsaWZlIGVhc3kuICAqLwotI2RlZmluZSBNQVNLX1Y2CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WNikKLSNkZWZpbmUgTUFTS19WNwkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjcpCi0jZGVmaW5lIE1BU0tfVjgJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KQotI2RlZmluZSBNQVNLX1NQQVJDTEVUCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVUKQotI2RlZmluZSBNQVNLX1NQQVJDTElURQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xJVEUpCi0jZGVmaW5lIE1BU0tfVjkJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotI2RlZmluZSBNQVNLX1Y5QQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOUEpCi0KLS8qIEJpdCBtYXNrcyBvZiBhcmNoaXRlY3R1cmVzIHN1cHBvcnRpbmcgdGhlIGluc24uICAqLwotCi0jZGVmaW5lIHY2CQkoTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCBcCi0JCQkgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLS8qIHY2IGluc25zIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwYXJjbGV0ICovCi0jZGVmaW5lIHY2bm90bGV0CShNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggXAotCQkJIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCi0jZGVmaW5lIHY3CQkoTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIFwKLQkJCSB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQotLyogQWx0aG91Z2ggbm90IGFsbCBpbnNucyBhcmUgaW1wbGVtZW50ZWQgaW4gaGFyZHdhcmUsIHNwYXJjbGl0ZSBpcyBkZWZpbmVkCi0gICB0byBiZSBhIHN1cGVyc2V0IG9mIHY4LiAgVW5pbXBsZW1lbnRlZCBpbnNucyB0cmFwIGFuZCBhcmUgdGhlbiB0aGVvcmV0aWNhbGx5Ci0gICBpbXBsZW1lbnRlZCBpbiBzb2Z0d2FyZS4KLSAgIEl0J3Mgbm90IGNsZWFyIHRoYXQgdGhlIHNhbWUgaXMgdHJ1ZSBmb3Igc3BhcmNsZXQsIGFsdGhvdWdoIHRoZSBkb2NzCi0gICBzdWdnZXN0IGl0IGlzLiAgUmF0aGVyIHRoYW4gY29tcGxpY2F0aW5nIHRoaW5ncywgdGhlIHNwYXJjbGV0IGFzc2VtYmxlcgotICAgcmVjb2duaXplcyBhbGwgdjggaW5zbnMuICAqLwotI2RlZmluZSB2OAkJKE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCi0jZGVmaW5lIHNwYXJjbGV0CShNQVNLX1NQQVJDTEVUKQotI2RlZmluZSBzcGFyY2xpdGUJKE1BU0tfU1BBUkNMSVRFKQotI2RlZmluZSB2OQkJKE1BU0tfVjkgfCBNQVNLX1Y5QSkKLSNkZWZpbmUgdjlhCQkoTUFTS19WOUEpCi0vKiB2NiBpbnNucyBub3Qgc3VwcG9ydGVkIGJ5IHY5ICovCi0jZGVmaW5lIHY2bm90djkJCShNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggXAotCQkJIHwgTUFTS19TUEFSQ0xFVCB8IE1BU0tfU1BBUkNMSVRFKQotLyogdjlhIGluc3RydWN0aW9ucyB3aGljaCB3b3VsZCBhcHBlYXIgdG8gYmUgYWxpYXNlcyB0byB2OSdzIGltcGRlcCdzCi0gICBvdGhlcndpc2UgKi8KLSNkZWZpbmUgdjlub3R2OWEJKE1BU0tfVjkpCi0KLS8qIFRhYmxlIG9mIG9wY29kZSBhcmNoaXRlY3R1cmVzLgotICAgVGhlIG9yZGVyIGlzIGRlZmluZWQgaW4gb3Bjb2RlL3NwYXJjLmguICAqLwotCi1jb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggc3BhcmNfb3Bjb2RlX2FyY2hzW10gPSB7Ci0gIHsgInY2IiwgTUFTS19WNiB9LAotICB7ICJ2NyIsIE1BU0tfVjYgfCBNQVNLX1Y3IH0sCi0gIHsgInY4IiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IH0sCi0gIHsgInNwYXJjbGV0IiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCB9LAotICB7ICJzcGFyY2xpdGUiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTElURSB9LAotICAvKiA/Pz8gRG9uJ3Qgc29tZSB2OCBwcml2aWxlZGdlZCBpbnNucyBjb25mbGljdCB3aXRoIHY5PyAgKi8KLSAgeyAidjkiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1Y5IH0sCi0gIC8qIHY5IHdpdGggdWx0cmFzcGFyYyBhZGRpdGlvbnMgKi8KLSAgeyAidjlhIiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19WOSB8IE1BU0tfVjlBIH0sCi0gIHsgTlVMTCwgMCB9Ci19OwotCi0vKiBHaXZlbiBOQU1FLCByZXR1cm4gaXQncyBhcmNoaXRlY3R1cmUgZW50cnkuICAqLwotCi1lbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbAotc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggKnA7Ci0KLSAgZm9yIChwID0gJnNwYXJjX29wY29kZV9hcmNoc1swXTsgcC0+bmFtZTsgKytwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHAtPm5hbWUpID09IDApCi0JcmV0dXJuIChlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCkgKHAgLSAmc3BhcmNfb3Bjb2RlX2FyY2hzWzBdKTsKLSAgICB9Ci0KLSAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX0JBRDsKLX0KLQwKLS8qIEJyYW5jaCBjb25kaXRpb24gZmllbGQuICAqLwotI2RlZmluZSBDT05EKHgpCQkoKCh4KSYweGYpPDwyNSkKLQotLyogdjk6IE1vdmUgKE1PVmNjIGFuZCBGTU9WY2MpIGNvbmRpdGlvbiBmaWVsZC4gICovCi0jZGVmaW5lIE1DT05EKHgsaV9vcl9mKQkoKCgoaV9vcl9mKSYxKTw8MTgpfCgoKHgpPj4xMSkmKDB4Zjw8MTQpKSkgLyogdjkgKi8KLQotLyogdjk6IE1vdmUgcmVnaXN0ZXIgKE1PVlJjYyBhbmQgRk1PVlJjYykgY29uZGl0aW9uIGZpZWxkLiAgKi8KLSNkZWZpbmUgUkNPTkQoeCkJKCgoeCkmMHg3KTw8MTApCS8qIHY5ICovCi0KLSNkZWZpbmUgQ09OREEJKENPTkQoMHg4KSkKLSNkZWZpbmUgQ09ORENDCShDT05EKDB4ZCkpCi0jZGVmaW5lIENPTkRDUwkoQ09ORCgweDUpKQotI2RlZmluZSBDT05ERQkoQ09ORCgweDEpKQotI2RlZmluZSBDT05ERwkoQ09ORCgweGEpKQotI2RlZmluZSBDT05ER0UJKENPTkQoMHhiKSkKLSNkZWZpbmUgQ09OREdVCShDT05EKDB4YykpCi0jZGVmaW5lIENPTkRMCShDT05EKDB4MykpCi0jZGVmaW5lIENPTkRMRQkoQ09ORCgweDIpKQotI2RlZmluZSBDT05ETEVVCShDT05EKDB4NCkpCi0jZGVmaW5lIENPTkROCShDT05EKDB4MCkpCi0jZGVmaW5lIENPTkRORQkoQ09ORCgweDkpKQotI2RlZmluZSBDT05ETkVHCShDT05EKDB4NikpCi0jZGVmaW5lIENPTkRQT1MJKENPTkQoMHhlKSkKLSNkZWZpbmUgQ09ORFZDCShDT05EKDB4ZikpCi0jZGVmaW5lIENPTkRWUwkoQ09ORCgweDcpKQotCi0jZGVmaW5lIENPTkROWglDT05ETkUKLSNkZWZpbmUgQ09ORFoJQ09OREUKLSNkZWZpbmUgQ09OREdFVQlDT05EQ0MKLSNkZWZpbmUgQ09ORExVCUNPTkRDUwotCi0jZGVmaW5lIEZDT05EQQkJKENPTkQoMHg4KSkKLSNkZWZpbmUgRkNPTkRFCQkoQ09ORCgweDkpKQotI2RlZmluZSBGQ09OREcJCShDT05EKDB4NikpCi0jZGVmaW5lIEZDT05ER0UJCShDT05EKDB4YikpCi0jZGVmaW5lIEZDT05ETAkJKENPTkQoMHg0KSkKLSNkZWZpbmUgRkNPTkRMRQkJKENPTkQoMHhkKSkKLSNkZWZpbmUgRkNPTkRMRwkJKENPTkQoMHgyKSkKLSNkZWZpbmUgRkNPTkROCQkoQ09ORCgweDApKQotI2RlZmluZSBGQ09ORE5FCQkoQ09ORCgweDEpKQotI2RlZmluZSBGQ09ORE8JCShDT05EKDB4ZikpCi0jZGVmaW5lIEZDT05EVQkJKENPTkQoMHg3KSkKLSNkZWZpbmUgRkNPTkRVRQkJKENPTkQoMHhhKSkKLSNkZWZpbmUgRkNPTkRVRwkJKENPTkQoMHg1KSkKLSNkZWZpbmUgRkNPTkRVR0UJKENPTkQoMHhjKSkKLSNkZWZpbmUgRkNPTkRVTAkJKENPTkQoMHgzKSkKLSNkZWZpbmUgRkNPTkRVTEUJKENPTkQoMHhlKSkKLQotI2RlZmluZSBGQ09ORE5aCUZDT05ETkUKLSNkZWZpbmUgRkNPTkRaCUZDT05ERQotCi0jZGVmaW5lIElDQyAoMCkJLyogdjkgKi8KLSNkZWZpbmUgWENDICgxPDwxMikgLyogdjkgKi8KLSNkZWZpbmUgRkNDKHgpCSgoKHgpJjB4Myk8PDExKSAvKiB2OSAqLwotI2RlZmluZSBGQkZDQyh4KQkoKCh4KSYweDMpPDwyMCkJLyogdjkgKi8KLQwKLS8qIFRoZSBvcmRlciBvZiB0aGUgb3Bjb2RlcyBpbiB0aGUgdGFibGUgaXMgc2lnbmlmaWNhbnQ6Ci0JCi0JKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0Ci0JYmUgY29uc2VjdXRpdmUuCUlmIHRoZXkgYXJlbid0LCB0aGUgYXNzZW1ibGVyIHdpbGwgYm9tYiBhdCBydW50aW1lLgotCi0JKiBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBub3QgY2FyZSBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuCi0KLSovCi0KLS8qIEVudHJpZXMgZm9yIGNvbW11dGF0aXZlIGFyaXRobWV0aWMgb3BlcmF0aW9ucy4gICovCi0vKiA/Pz8gTW9yZSBlbnRyaWVzIGNhbiBtYWtlIHVzZSBvZiB0aGlzLiAgKi8KLSNkZWZpbmUgQ09NTVVURU9QKG9wY29kZSwgb3AzLCBhcmNoX21hc2spIFwKLXsgb3Bjb2RlLAlGMygyLCBvcDMsIDApLCBGMyh+Miwgfm9wMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIGFyY2hfbWFzayB9LCBcCi17IG9wY29kZSwJRjMoMiwgb3AzLCAxKSwgRjMofjIsIH5vcDMsIH4xKSwJCSIxLGksZCIsIDAsIGFyY2hfbWFzayB9LCBcCi17IG9wY29kZSwJRjMoMiwgb3AzLCAxKSwgRjMofjIsIH5vcDMsIH4xKSwJCSJpLDEsZCIsIDAsIGFyY2hfbWFzayB9Ci0KLWNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgc3BhcmNfb3Bjb2Rlc1tdID0gewotCi17ICJsZCIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKSwJCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgwMCwgMCksIEYzKH4zLCB+MHgwMCwgfjApfFJTMl9HMCwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgyMCwgMCksIEYzKH4zLCB+MHgyMCwgfjApLAkJIlsxKzJdLGciLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIwLCAwKSwgRjMofjMsIH4weDIwLCB+MCl8UlMyX0cwLAkiWzFdLGciLCAwLCB2NiB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDIwLCAxKSwgRjMofjMsIH4weDIwLCB+MSksCQkiWzEraV0sZyIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjAsIDEpLCBGMyh+MywgfjB4MjAsIH4xKSwJCSJbaSsxXSxnIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpfFJTMV9HMCwJIltpXSxnIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZyIsIDAsIHY2IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZCIsCUYzKDMsIDB4MjEsIDApLCBGMyh+MywgfjB4MjEsIH4wKXxSRCh+MCksCSJbMSsyXSxGIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMSwgMCksIEYzKH4zLCB+MHgyMSwgfjApfFJTMl9HMHxSRCh+MCksIlsxXSxGIiwgMCwgdjYgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgyMSwgMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJEKH4wKSwJIlsxK2ldLEYiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIxLCAxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjApLAkiW2krMV0sRiIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSUzFfRzB8UkQofjApLCJbaV0sRiIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxTSU1NMTMofjApfFJEKH4wKSwiWzFdLEYiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGQiLAlGMygzLCAweDMwLCAwKSwgRjMofjMsIH4weDMwLCB+MCksCQkiWzErMl0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApfFJTMl9HMCwJIlsxXSxEIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiWzEraV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpLAkJIltpKzFdLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKXxSUzFfRzAsCSJbaV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGQgW3JzMSswXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MzEsIDApLCBGMyh+MywgfjB4MzEsIH4wKSwJCSJbMSsyXSxDIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMxLCAwKSwgRjMofjMsIH4weDMxLCB+MCl8UlMyX0cwLAkiWzFdLEMiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MzEsIDEpLCBGMyh+MywgfjB4MzEsIH4xKSwJCSJbMStpXSxDIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSksCQkiW2krMV0sQyIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMSwgMSksIEYzKH4zLCB+MHgzMSwgfjEpfFJTMV9HMCwJIltpXSxDIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxDIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQotLyogVGhlIHY5IExEVVcgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCAnbGQnIG9wY29kZSwgaXQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZQotICAgJ2xkJyBwc2V1ZG8tb3AgaW4gdjkuICAqLwoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKSwJCSJbMSsyXSxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXciLAlGMygzLCAweDAwLCAwKSwgRjMofjMsIH4weDAwLCB+MCl8UlMyX0cwLAkiWzFdLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKSwJCSJbMStpXSxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiW2krMV0sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpfFJTMV9HMCwJIltpXSxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgRl9BTElBUywgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkZCIsCUYzKDMsIDB4MDMsIDApLCBGMyh+MywgfjB4MDMsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDAzLCAwKSwgRjMofjMsIH4weDAzLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MDMsIDEpLCBGMyh+MywgfjB4MDMsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSswXSxkICovCi17ICJsZGQiLAlGMygzLCAweDIzLCAwKSwgRjMofjMsIH4weDIzLCB+MCl8QVNJKH4wKSwJIlsxKzJdLEgiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgyMywgMCksIEYzKH4zLCB+MHgyMywgfjApfEFTSV9SUzIofjApLAkiWzFdLEgiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKSwJCSJbMStpXSxIIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKSwJCSJbaSsxXSxIIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKXxSUzFfRzAsCSJbaV0sSCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDIzLCAxKSwgRjMofjMsIH4weDIzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxIIiwgMCwgdjYgfSwgLyogbGRkIFtyczErMF0sZCAqLwotCi17ICJsZGQiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCl8QVNJKH4wKSwJIlsxKzJdLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZGQiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZGQiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSksCQkiWzEraV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkZCIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbaSsxXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFJTMV9HMCwJIltpXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFNJTU0xMyh+MCksCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGRkIFtyczErMF0sZCAqLwotCi17ICJsZHEiLAlGMygzLCAweDIyLCAwKSwgRjMofjMsIH4weDIyLCB+MCl8QVNJKH4wKSwJIlsxKzJdLEoiLCAwLCB2OSB9LAoteyAibGRxIiwJRjMoMywgMHgyMiwgMCksIEYzKH4zLCB+MHgyMiwgfjApfEFTSV9SUzIofjApLAkiWzFdLEoiLCAwLCB2OSB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKSwJCSJbMStpXSxKIiwgMCwgdjkgfSwKLXsgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKSwJCSJbaSsxXSxKIiwgMCwgdjkgfSwKLXsgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKXxSUzFfRzAsCSJbaV0sSiIsIDAsIHY5IH0sCi17ICJsZHEiLAlGMygzLCAweDIyLCAxKSwgRjMofjMsIH4weDIyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErMF0sZCAqLwotCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMCksIEYzKH4zLCB+MHgwOSwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkc2IiLAlGMygzLCAweDA5LCAwKSwgRjMofjMsIH4weDA5LCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2IgW3JzMSslZzBdLGQgKi8KLXsgImxkc2IiLAlGMygzLCAweDA5LCAxKSwgRjMofjMsIH4weDA5LCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGRzYiIsCUYzKDMsIDB4MDksIDEpLCBGMyh+MywgfjB4MDksIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2IgW3JzMSswXSxkICovCi0KLXsgImxkc2giLAlGMygzLCAweDBhLCAwKSwgRjMofjMsIH4weDBhLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2ggW3JzMSslZzBdLGQgKi8KLXsgImxkc2giLAlGMygzLCAweDBhLCAwKSwgRjMofjMsIH4weDBhLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDEpLCBGMyh+MywgfjB4MGEsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMSksIEYzKH4zLCB+MHgwYSwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzaCBbcnMxKzBdLGQgKi8KLQoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMCksIEYzKH4zLCB+MHgwZCwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDApLCBGMyh+MywgfjB4MGQsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzdHViIFtyczErJWcwXSxkICovCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMSksIEYzKH4zLCB+MHgwZCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc3R1YiBbcnMxKzBdLGQgKi8KLQoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDApLCBGMyh+MywgfjB4MDgsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY5IH0sCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMCksIEYzKH4zLCB+MHgwOCwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHN3IFtyczErJWcwXSxkICovCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMSksIEYzKH4zLCB+MHgwOCwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2OSB9LAoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjkgfSwKLXsgImxkc3ciLAlGMygzLCAweDA4LCAxKSwgRjMofjMsIH4weDA4LCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2OSB9LAoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHN3IFtyczErMF0sZCAqLwotCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMCksIEYzKH4zLCB+MHgwMSwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkdWIiLAlGMygzLCAweDAxLCAwKSwgRjMofjMsIH4weDAxLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWIgW3JzMSslZzBdLGQgKi8KLXsgImxkdWIiLAlGMygzLCAweDAxLCAxKSwgRjMofjMsIH4weDAxLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDEpLCBGMyh+MywgfjB4MDEsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWIgW3JzMSswXSxkICovCi0KLXsgImxkdWgiLAlGMygzLCAweDAyLCAwKSwgRjMofjMsIH4weDAyLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDApLCBGMyh+MywgfjB4MDIsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1aCBbcnMxKyVnMF0sZCAqLwoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDEpLCBGMyh+MywgfjB4MDIsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMSksIEYzKH4zLCB+MHgwMiwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1aCBbcnMxKzBdLGQgKi8KLQoteyAibGR4IiwJRjMoMywgMHgwYiwgMCksIEYzKH4zLCB+MHgwYiwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MGIsIDApLCBGMyh+MywgfjB4MGIsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjkgfSwgLyogbGR4IFtyczErJWcwXSxkICovCi17ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSksCQkiWzEraV0sZCIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSksCQkiW2krMV0sZCIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgwYiwgMSksIEYzKH4zLCB+MHgwYiwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY5IH0sIC8qIGxkeCBbcnMxKzBdLGQgKi8KLQoteyAibGR4IiwJRjMoMywgMHgyMSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjApfFJEKH4xKSwJIlsxKzJdLEYiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgyMSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjApfFJTMl9HMHxSRCh+MSksCSJbMV0sRiIsIDAsIHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjEpLAkiWzEraV0sRiIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjEpLAkiW2krMV0sRiIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8UlMxX0cwfFJEKH4xKSwJIltpXSxGIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MjEsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4xKXxTSU1NMTMofjApfFJEKH4xKSwiWzFdLEYiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkYSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkYSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwoteyAibGRhIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApLAkJIlsxKzJdQSxnIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MzAsIDApLCBGMyh+MywgfjB4MzAsIH4wKXxSUzJfRzAsCSJbMV1BLGciLCAwLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkYSIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKSwJCSJbMStpXW8sZyIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiW2krMV1vLGciLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFJTMV9HMCwJIltpXW8sZyIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZyIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMCksIEYzKH4zLCB+MHgxMywgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkZGEiLAlGMygzLCAweDEzLCAwKSwgRjMofjMsIH4weDEzLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDEpLCBGMyh+MywgfjB4MTMsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMSksIEYzKH4zLCB+MHgxMywgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMCksIEYzKH4zLCB+MHgzMywgfjApLAkJIlsxKzJdQSxIIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCl8UlMyX0cwLAkiWzFdQSxIIiwgMCwgdjkgfSwgLyogbGRkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbMStpXW8sSCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpLAkJIltpKzFdbyxIIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8UlMxX0cwLAkiW2ldbyxIIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sSCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMCksIEYzKH4zLCB+MHgzMiwgfjApLAkJIlsxKzJdQSxKIiwgMCwgdjkgfSwKLXsgImxkcWEiLAlGMygzLCAweDMyLCAwKSwgRjMofjMsIH4weDMyLCB+MCl8UlMyX0cwLAkiWzFdQSxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMSksIEYzKH4zLCB+MHgzMiwgfjEpLAkJIlsxK2ldbyxKIiwgMCwgdjkgfSwKLXsgImxkcWEiLAlGMygzLCAweDMyLCAxKSwgRjMofjMsIH4weDMyLCB+MSksCQkiW2krMV1vLEoiLCAwLCB2OSB9LAoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKXxSUzFfRzAsCSJbaV1vLEoiLCAwLCB2OSB9LAoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErMF0sZCAqLwotCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDApLCBGMyh+MywgfjB4MTksIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDApLCBGMyh+MywgfjB4MTksIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHNiYSBbcnMxKyVnMF0sZCAqLwoteyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMSksIEYzKH4zLCB+MHgxOSwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzaGEiLAlGMygzLCAweDFhLCAwKSwgRjMofjMsIH4weDFhLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRzaGEiLAlGMygzLCAweDFhLCAwKSwgRjMofjMsIH4weDFhLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRzaGEgW3JzMSslZzBdLGQgKi8KLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDEpLCBGMyh+MywgfjB4MWEsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAwKSwgRjMofjMsIH4weDFkLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDApLCBGMyh+MywgfjB4MWQsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHN0dWJhIFtyczErJWcwXSxkICovCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMSksIEYzKH4zLCB+MHgxZCwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAxKSwgRjMofjMsIH4weDFkLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMCksIEYzKH4zLCB+MHgxOCwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjkgfSwKLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMCksIEYzKH4zLCB+MHgxOCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMSksIEYzKH4zLCB+MHgxOCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGR1YmEiLAlGMygzLCAweDExLCAwKSwgRjMofjMsIH4weDExLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGR1YmEiLAlGMygzLCAweDExLCAwKSwgRjMofjMsIH4weDExLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGR1YmEgW3JzMSslZzBdLGQgKi8KLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDEpLCBGMyh+MywgfjB4MTEsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMCksIEYzKH4zLCB+MHgxMiwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMCksIEYzKH4zLCB+MHgxMiwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkdWhhIFtyczErJWcwXSxkICovCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGR1aGEiLAlGMygzLCAweDEyLCAxKSwgRjMofjMsIH4weDEyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKSwJCSJbMSsyXUEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkdXdhID09PSBsZGEgKi8KLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiWzEraV1vLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiW2krMV1vLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDApLCBGMyh+MywgfjB4MWIsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMCksIEYzKH4zLCB+MHgxYiwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJzdCIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCQkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkJImQsWzEraV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkJImQsW2krMV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkJImQsW2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCQkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0IiwJRjMoMywgMHgyNCwgMCksIEYzKH4zLCB+MHgyNCwgfjApfEFTSSh+MCksCQkiZyxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDApLCBGMyh+MywgfjB4MjQsIH4wKXxBU0lfUlMyKH4wKSwJCSJnLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGRbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgyNCwgMSksIEYzKH4zLCB+MHgyNCwgfjEpLAkJCSJnLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNCwgMSksIEYzKH4zLCB+MHgyNCwgfjEpLAkJCSJnLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNCwgMSksIEYzKH4zLCB+MHgyNCwgfjEpfFJTMV9HMCwJCSJnLFtpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKXxTSU1NMTMofjApLAkJImcsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0IiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApfEFTSSh+MCksCQkiRCxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApfEFTSV9SUzIofjApLAkJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkJIkQsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCQkiRCxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFJTMV9HMCwJCSJELFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFNJTU0xMyh+MCksCQkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3QiLAlGMygzLCAweDM1LCAwKSwgRjMofjMsIH4weDM1LCB+MCl8QVNJKH4wKSwJCSJDLFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM1LCAwKSwgRjMofjMsIH4weDM1LCB+MCl8QVNJX1JTMih+MCksCQkiQyxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKSwJCQkiQyxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpLAkJCSJDLFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSl8UlMxX0cwLAkJIkMsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSl8U0lNTTEzKH4wKSwJCSJDLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0IiwJRjMoMywgMHgyNSwgMCksIEYzKH4zLCB+MHgyNSwgfjApfFJEX0cwfEFTSSh+MCksCSJGLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNSwgMCksIEYzKH4zLCB+MHgyNSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiRixbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzAsCQkiRixbMStpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMCwJCSJGLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJGLFtpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiRixbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3R3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3ciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3ciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0dXciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0dXciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGwiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3RhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3RhIiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApLAkJImcsWzErMl1BIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKXxSUzIofjApLAkiZyxbMV1BIiwgMCwgdjkgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkiZyxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJImcsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxSUzFfRzAsCSJnLFtpXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFNJTU0xMyh+MCksCSJnLFsxXW8iLCAwLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjkgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdGIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3RiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGIgZCxbcnMxKyVnMF0gKi8KLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RiIGQsW3JzMSswXSAqLwotCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2IiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiBkLFtyczErJWcwXSAqLwoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2IiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2IiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiIGQsW3JzMSswXSAqLwoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgZCxbcnMxKyVnMF0gKi8KLXsgInN0dWIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLQoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGJhIGQsW3JzMSslZzBdICovCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3RiIGQsW3JzMSswXSAqLwotCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjYgfSwgLyogc3RiYSBkLFtyczErJWcwXSAqLwoteyAic3RzYmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzYmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzYmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjYgfSwgLyogc3RiYSBkLFtyczErJWcwXSAqLwoteyAic3R1YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi0KLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDApLCBGMyh+MywgfjB4MDcsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDA3LCAwKSwgRjMofjMsIH4weDA3LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpLAkJImQsWzEraV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpLAkJImQsW2krMV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpfFJTMV9HMCwJImQsW2ldIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDApLCBGMyh+MywgfjB4MjYsIH4wKXxBU0kofjApLAkicSxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDApLCBGMyh+MywgfjB4MjYsIH4wKXxBU0lfUlMyKH4wKSwJInEsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJxLFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpLAkJInEsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSl8UlMxX0cwLAkicSxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSl8U0lNTTEzKH4wKSwJInEsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi17ICJzdGQiLAlGMygzLCAweDI3LCAwKSwgRjMofjMsIH4weDI3LCB+MCl8QVNJKH4wKSwJIkgsWzErMl0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgyNywgMCksIEYzKH4zLCB+MHgyNywgfjApfEFTSV9SUzIofjApLAkiSCxbMV0iLCAwLCB2NiB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDEpLCBGMyh+MywgfjB4MjcsIH4xKSwJCSJILFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDEpLCBGMyh+MywgfjB4MjcsIH4xKSwJCSJILFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDEpLCBGMyh+MywgfjB4MjcsIH4xKXxSUzFfRzAsCSJILFtpXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSl8U0lNTTEzKH4wKSwJIkgsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzdGQiLAlGMygzLCAweDM2LCAwKSwgRjMofjMsIH4weDM2LCB+MCl8QVNJKH4wKSwJIlEsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM2LCAwKSwgRjMofjMsIH4weDM2LCB+MCl8QVNJX1JTMih+MCksCSJRLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiUSxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKSwJCSJRLFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpfFJTMV9HMCwJIlEsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpfFNJTU0xMyh+MCksCSJRLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwoteyAic3RkIiwJRjMoMywgMHgzNywgMCksIEYzKH4zLCB+MHgzNywgfjApfEFTSSh+MCksCSJELFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNywgMCksIEYzKH4zLCB+MHgzNywgfjApfEFTSV9SUzIofjApLAkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkQsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSksCQkiRCxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxSUzFfRzAsCSJELFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxTSU1NMTMofjApLAkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMCksIEYzKH4zLCB+MHgwNywgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDApLCBGMyh+MywgfjB4MDcsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDApLCBGMyh+MywgfjB4MTcsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMCksIEYzKH4zLCB+MHgxNywgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGRhIGQsW3JzMSslZzBdICovCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKSwJCSJILFsxKzJdQSIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMCksIEYzKH4zLCB+MHgzNywgfjApfFJTMih+MCksCSJILFsxXUEiLCAwLCB2OSB9LCAvKiBzdGRhIGQsW3JzMSslZzBdICovCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkgsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSksCQkiSCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxSUzFfRzAsCSJILFtpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxTSU1NMTMofjApLAkiSCxbMV1vIiwgMCwgdjkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzdGgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3RoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGggZCxbcnMxKyVnMF0gKi8KLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RoIGQsW3JzMSswXSAqLwotCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2giLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCBkLFtyczErJWcwXSAqLwoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2giLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2giLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoIGQsW3JzMSswXSAqLwoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggZCxbcnMxKyVnMF0gKi8KLXsgInN0dWgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLQoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGhhICxbcnMxKyVnMF0gKi8KLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdGggZCxbcnMxKzBdICovCi0KLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGhhICxbcnMxKyVnMF0gKi8KLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3RoIGQsW3JzMSswXSAqLwoteyAic3R1aGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aGEgLFtyczErJWcwXSAqLwoteyAic3R1aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGggZCxbcnMxKzBdICovCi0KLXsgInN0eCIsCUYzKDMsIDB4MGUsIDApLCBGMyh+MywgfjB4MGUsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErJWcwXSAqLwoteyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpLAkJImQsWzEraV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpLAkJImQsW2krMV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJTMV9HMCwJImQsW2ldIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKzBdICovCi0KLXsgInN0eCIsCUYzKDMsIDB4MjUsIDApfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4wKXxBU0kofjApfFJEKH4xKSwJIkYsWzErMl0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgyNSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjApfEFTSV9SUzIofjApfFJEKH4xKSwiRixbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKyVnMF0gKi8KLXsgInN0eCIsCUYzKDMsIDB4MjUsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRCh+MSksCQkiRixbMStpXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8UkQofjEpLAkJIkYsW2krMV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgyNSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJTMV9HMHxSRCh+MSksCSJGLFtpXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8U0lNTTEzKH4wKXxSRCh+MSksIkYsWzFdIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSswXSAqLwotCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMCksIEYzKH4zLCB+MHgxZSwgfjApLAkJImQsWzErMl1BIiwgMCwgdjkgfSwKLXsgInN0eGEiLAlGMygzLCAweDFlLCAwKSwgRjMofjMsIH4weDFlLCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY5IH0sIC8qIHN0eGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0eGEiLAlGMygzLCAweDFlLCAxKSwgRjMofjMsIH4weDFlLCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDEpLCBGMyh+MywgfjB4MWUsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKzBdICovCi0KLXsgInN0cSIsCUYzKDMsIDB4MjYsIDApLCBGMyh+MywgfjB4MjYsIH4wKXxBU0kofjApLAkiSixbMSsyXSIsIDAsIHY5IH0sCi17ICJzdHEiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJX1JTMih+MCksCSJKLFsxXSIsIDAsIHY5IH0sIC8qIHN0cSBbcnMxKyVnMF0gKi8KLXsgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJKLFsxK2ldIiwgMCwgdjkgfSwKLXsgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJKLFtpKzFdIiwgMCwgdjkgfSwKLXsgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKXxSUzFfRzAsCSJKLFtpXSIsIDAsIHY5IH0sCi17ICJzdHEiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSl8U0lNTTEzKH4wKSwJIkosWzFdIiwgMCwgdjkgfSwgLyogc3RxIFtyczErMF0gKi8KLQoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0kofjApLAkiSixbMSsyXUEiLCAwLCB2OSB9LAoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0lfUlMyKH4wKSwJIkosWzFdQSIsIDAsIHY5IH0sIC8qIHN0cWEgW3JzMSslZzBdICovCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIkosWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0cWEiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiSixbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxSUzFfRzAsCSJKLFtpXW8iLCAwLCB2OSB9LAoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxTSU1NMTMofjApLAkiSixbMV1vIiwgMCwgdjkgfSwgLyogc3RxYSBbcnMxKzBdICovCi0KLXsgInN3YXAiLAlGMygzLCAweDBmLCAwKSwgRjMofjMsIH4weDBmLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NyB9LAoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDApLCBGMyh+MywgfjB4MGYsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjcgfSwgLyogc3dhcCBbcnMxKyVnMF0sZCAqLwoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDEpLCBGMyh+MywgfjB4MGYsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjcgfSwKLXsgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSksCQkiW2krMV0sZCIsIDAsIHY3IH0sCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMSksIEYzKH4zLCB+MHgwZiwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjcgfSwKLXsgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjcgfSwgLyogc3dhcCBbcnMxKzBdLGQgKi8KLQoteyAic3dhcGEiLAlGMygzLCAweDFmLCAwKSwgRjMofjMsIH4weDFmLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NyB9LAoteyAic3dhcGEiLAlGMygzLCAweDFmLCAwKSwgRjMofjMsIH4weDFmLCB+MCl8UlMyKH4wKSwJIlsxXUEsZCIsIDAsIHY3IH0sIC8qIHN3YXBhIFtyczErJWcwXSxkICovCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAic3dhcGEiLAlGMygzLCAweDFmLCAxKSwgRjMofjMsIH4weDFmLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIHN3YXAgW3JzMSswXSxkICovCi0KLXsgInJlc3RvcmUiLAlGMygyLCAweDNkLCAwKSwgRjMofjIsIH4weDNkLCB+MCl8QVNJKH4wKSwJCQkiMSwyLGQiLCAwLCB2NiB9LAoteyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDApLCBGMyh+MiwgfjB4M2QsIH4wKXxSRF9HMHxSUzFfRzB8QVNJX1JTMih+MCksCSIiLCAwLCB2NiB9LCAvKiByZXN0b3JlICVnMCwlZzAsJWcwICovCi17ICJyZXN0b3JlIiwJRjMoMiwgMHgzZCwgMSksIEYzKH4yLCB+MHgzZCwgfjEpLAkJCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDEpLCBGMyh+MiwgfjB4M2QsIH4xKXxSRF9HMHxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY2IH0sIC8qIHJlc3RvcmUgJWcwLDAsJWcwICovCi0KLXsgInJldHQiLAlGMygyLCAweDM5LCAwKSwgRjMofjIsIH4weDM5LCB+MCl8UkRfRzB8QVNJKH4wKSwJIjErMiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIHJldHQgcnMxK3JzMiAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDApLCBGMyh+MiwgfjB4MzksIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LAkvKiByZXR0IHJzMSwlZzAgKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzAsCQkiMStpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCByczErWCAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMCwJCSJpKzEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiByZXR0IFgrcnMxICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCBYK3JzMSAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMHxSUzFfRzAsCQkiaSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sCS8qIHJldHQgWCAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sCS8qIHJldHQgcnMxKzAgKi8KLQoteyAic2F2ZSIsCUYzKDIsIDB4M2MsIDApLCBGMyh+MiwgfjB4M2MsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic2F2ZSIsCUYzKDIsIDB4M2MsIDEpLCBGMyh+MiwgfjB4M2MsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJzYXZlIiwJMHg4MWUwMDAwMCwJfjB4ODFlMDAwMDAsCQkJIiIsIEZfQUxJQVMsIHY2IH0sCi0KLXsgInJldCIsICBGMygyLCAweDM4LCAxKXxSUzEoMHgxZil8U0lNTTEzKDgpLCBGMyh+MiwgfjB4MzgsIH4xKXxTSU1NMTMofjgpLAkgICAgICAgIiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWk3KzgsJWcwICovCi17ICJyZXRsIiwgRjMoMiwgMHgzOCwgMSl8UlMxKDB4MGYpfFNJTU0xMyg4KSwgRjMofjIsIH4weDM4LCB+MSl8UlMxKH4weDBmKXxTSU1NMTMofjgpLCAiIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlbzcrOCwlZzAgKi8KLQoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDApLCBGMyh+MiwgfjB4MzgsIH4wKXxBU0kofjApLAkiMSsyLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfEFTSV9SUzIofjApLAkiMSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSslZzAsZCAqLwoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxTSU1NMTMofjApLAkiMSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSswLGQgKi8KLXsgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UlMxX0cwLAkiaSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVnMCtpLGQgKi8KLXsgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSksCQkiMStpLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpLAkJImkrMSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAotCi17ICJkb25lIiwJRjMoMiwgMHgzZSwgMCl8UkQoMCksIEYzKH4yLCB+MHgzZSwgfjApfFJEKH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCi17ICJyZXRyeSIsCUYzKDIsIDB4M2UsIDApfFJEKDEpLCBGMyh+MiwgfjB4M2UsIH4wKXxSRCh+MSl8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2OSB9LAoteyAic2F2ZWQiLAlGMygyLCAweDMxLCAwKXxSRCgwKSwgRjMofjIsIH4weDMxLCB+MCl8UkQofjApfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjkgfSwKLXsgInJlc3RvcmVkIiwJRjMoMiwgMHgzMSwgMCl8UkQoMSksIEYzKH4yLCB+MHgzMSwgfjApfFJEKH4xKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCi17ICJzaXIiLAlGMygyLCAweDMwLCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MHhmKXxSUzFfRzAsCQkiaSIsIDAsIHY5IH0sCi0KLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMCksIEYzKH4yLCB+MHgzYiwgfjApfEFTSSh+MCksCSIxKzIiLCAwLCB2OCB9LAoteyAiZmx1c2giLAlGMygyLCAweDNiLCAwKSwgRjMofjIsIH4weDNiLCB+MCl8QVNJX1JTMih+MCksCSIxIiwgMCwgdjggfSwgLyogZmx1c2ggcnMxKyVnMCAqLwoteyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8U0lNTTEzKH4wKSwJIjEiLCAwLCB2OCB9LCAvKiBmbHVzaCByczErMCAqLwoteyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8UlMxX0cwLAkiaSIsIDAsIHY4IH0sIC8qIGZsdXNoICVnMCtpICovCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKSwJCSIxK2kiLCAwLCB2OCB9LAoteyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiaSsxIiwgMCwgdjggfSwKLQotLyogSUZMVVNIIHdhcyByZW5hbWVkIHRvIEZMVVNIIGluIHY4LiAgKi8KLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0kofjApLAkiMSsyIiwgRl9BTElBUywgdjYgfSwKLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0lfUlMyKH4wKSwJIjEiLCBGX0FMSUFTLCB2NiB9LCAvKiBmbHVzaCByczErJWcwICovCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8U0lNTTEzKH4wKSwJIjEiLCBGX0FMSUFTLCB2NiB9LCAvKiBmbHVzaCByczErMCAqLwoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpfFJTMV9HMCwJImkiLCBGX0FMSUFTLCB2NiB9LAoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpLAkJIjEraSIsIEZfQUxJQVMsIHY2IH0sCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiaSsxIiwgRl9BTElBUywgdjYgfSwKLQoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfEFTSSh+MCksCSIxKzIiLCAwLCB2OSB9LAoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfEFTSV9SUzIofjApLAkiMSIsIDAsIHY5IH0sIC8qIHJldHVybiByczErJWcwICovCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8U0lNTTEzKH4wKSwJIjEiLCAwLCB2OSB9LCAvKiByZXR1cm4gcnMxKzAgKi8KLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSUzFfRzAsCSJpIiwgMCwgdjkgfSwgLyogcmV0dXJuICVnMCtpICovCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSksCQkiMStpIiwgMCwgdjkgfSwKLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKSwJCSJpKzEiLCAwLCB2OSB9LAotCi17ICJmbHVzaHciLAlGMygyLCAweDJiLCAwKSwgRjMofjIsIH4weDJiLCB+MCl8UkRfRzB8UlMxX0cwfEFTSV9SUzIofjApLAkiIiwgMCwgdjkgfSwKLQoteyAibWVtYmFyIiwJRjMoMiwgMHgyOCwgMSl8UlMxKDB4ZiksIEYzKH4yLCB+MHgyOCwgfjEpfFJEX0cwfFJTMSh+MHhmKXxTSU1NMTMofjEyNyksICJLIiwgMCwgdjkgfSwKLXsgInN0YmFyIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDB4ZiksIEYzKH4yLCB+MHgyOCwgfjApfFJEX0cwfFJTMSh+MHhmKXxTSU1NMTMofjApLCAiIiwgMCwgdjggfSwKLQoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAwKSwgRjMofjMsIH4weDJkLCB+MCksCQkiWzErMl0sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDApLCBGMyh+MywgfjB4MmQsIH4wKXxSUzJfRzAsCSJbMV0sKiIsIDAsIHY5IH0sIC8qIHByZWZldGNoIFtyczErJWcwXSxwcmVmZXRjaF9mY24gKi8KLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMSksIEYzKH4zLCB+MHgyZCwgfjEpLAkJIlsxK2ldLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAxKSwgRjMofjMsIH4weDJkLCB+MSksCQkiW2krMV0sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKXxSUzFfRzAsCSJbaV0sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKXxTSU1NMTMofjApLAkiWzFdLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaCBbcnMxKzBdLHByZWZldGNoX2ZjbiAqLwoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMCksIEYzKH4zLCB+MHgzZCwgfjApLAkJIlsxKzJdQSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDApLCBGMyh+MywgfjB4M2QsIH4wKXxSUzJfRzAsCSJbMV1BLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaGEgW3JzMSslZzBdLHByZWZldGNoX2ZjbiAqLwoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMSksIEYzKH4zLCB+MHgzZCwgfjEpLAkJIlsxK2ldbywqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKSwJCSJbaSsxXW8sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAxKSwgRjMofjMsIH4weDNkLCB+MSl8UlMxX0cwLAkiW2ldbywqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKXxTSU1NMTMofjApLAkiWzFdbywqIiwgMCwgdjkgfSwgLyogcHJlZmV0Y2hhIFtyczErMF0sZCAqLwotCi17ICJzbGwiLAlGMygyLCAweDI1LCAwKSwgRjMofjIsIH4weDI1LCB+MCl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzbGwiLAlGMygyLCAweDI1LCAxKSwgRjMofjIsIH4weDI1LCB+MSl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLFgsZCIsIDAsIHY2IH0sCi17ICJzcmEiLAlGMygyLCAweDI3LCAwKSwgRjMofjIsIH4weDI3LCB+MCl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzcmEiLAlGMygyLCAweDI3LCAxKSwgRjMofjIsIH4weDI3LCB+MSl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLFgsZCIsIDAsIHY2IH0sCi17ICJzcmwiLAlGMygyLCAweDI2LCAwKSwgRjMofjIsIH4weDI2LCB+MCl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzcmwiLAlGMygyLCAweDI2LCAxKSwgRjMofjIsIH4weDI2LCB+MSl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLFgsZCIsIDAsIHY2IH0sCi0KLXsgInNsbHgiLAlGMygyLCAweDI1LCAwKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjUsIH4wKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzbGx4IiwJRjMoMiwgMHgyNSwgMSl8KDE8PDEyKSwgRjMofjIsIH4weDI1LCB+MSl8KDB4M2Y8PDYpLAkiMSxZLGQiLCAwLCB2OSB9LAoteyAic3JheCIsCUYzKDIsIDB4MjcsIDApfCgxPDwxMiksIEYzKH4yLCB+MHgyNywgfjApfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInNyYXgiLAlGMygyLCAweDI3LCAxKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjcsIH4xKXwoMHgzZjw8NiksCSIxLFksZCIsIDAsIHY5IH0sCi17ICJzcmx4IiwJRjMoMiwgMHgyNiwgMCl8KDE8PDEyKSwgRjMofjIsIH4weDI2LCB+MCl8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic3JseCIsCUYzKDIsIDB4MjYsIDEpfCgxPDwxMiksIEYzKH4yLCB+MHgyNiwgfjEpfCgweDNmPDw2KSwJIjEsWSxkIiwgMCwgdjkgfSwKLQoteyAibXVsc2NjIiwJRjMoMiwgMHgyNCwgMCksIEYzKH4yLCB+MHgyNCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJtdWxzY2MiLAlGMygyLCAweDI0LCAxKSwgRjMofjIsIH4weDI0LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJkaXZzY2MiLAlGMygyLCAweDFkLCAwKSwgRjMofjIsIH4weDFkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgc3BhcmNsaXRlIH0sCi17ICJkaXZzY2MiLAlGMygyLCAweDFkLCAxKSwgRjMofjIsIH4weDFkLCB+MSksCQkiMSxpLGQiLCAwLCBzcGFyY2xpdGUgfSwKLQoteyAic2NhbiIsCUYzKDIsIDB4MmMsIDApLCBGMyh+MiwgfjB4MmMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCBzcGFyY2xldHxzcGFyY2xpdGUgfSwKLXsgInNjYW4iLAlGMygyLCAweDJjLCAxKSwgRjMofjIsIH4weDJjLCB+MSksCQkiMSxpLGQiLCAwLCBzcGFyY2xldHxzcGFyY2xpdGUgfSwKLQoteyAicG9wYyIsCUYzKDIsIDB4MmUsIDApLCBGMyh+MiwgfjB4MmUsIH4wKXxSUzJfRzB8QVNJKH4wKSwiMixkIiwgMCwgdjkgfSwKLXsgInBvcGMiLAlGMygyLCAweDJlLCAxKSwgRjMofjIsIH4weDJlLCB+MSl8UlMyX0cwLAkiaSxkIiwgMCwgdjkgfSwKLQoteyAiY2xyIiwJRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfFJEX0cwfFJTMV9HMHxBU0lfUlMyKH4wKSwJImQiLCBGX0FMSUFTLCB2NiB9LCAvKiBvciAlZzAsJWcwLGQgKi8KLXsgImNsciIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKXxSUzFfRzB8U0lNTTEzKH4wKSwJCSJkIiwgRl9BTElBUywgdjYgfSwgLyogb3IgJWcwLDAsZAkqLwoteyAiY2xyIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfFJEX0cwfEFTSSh+MCksCQkiWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0ICVnMCxbcnMxKyVnMF0gKi8KLXsgImNsciIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSRF9HMCwJCQkiWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwLAkJCSJbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHIiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UkRfRzB8UlMxX0cwLAkJCSJbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCQkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3QgJWcwLFtyczErMF0gKi8KLQoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxSRF9HMHxBU0kofjApLAkiWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiAlZzAsW3JzMSslZzBdICovCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJEX0cwLAkJIlsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzAsCQkiW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSRF9HMHxSUzFfRzAsCQkiW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiAlZzAsW3JzMSswXSAqLwotCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfFJEX0cwfEFTSSh+MCksCSJbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoICVnMCxbcnMxKyVnMF0gKi8KLXsgImNscmgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UkRfRzAsCQkiWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMCwJCSJbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJEX0cwfFJTMV9HMCwJCSJbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoICVnMCxbcnMxKzBdICovCi0KLXsgImNscngiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8UkRfRzB8QVNJKH4wKSwJIlsxKzJdIiwgRl9BTElBUywgdjkgfSwKLXsgImNscngiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdHggJWcwLFtyczErJWcwXSAqLwoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSRF9HMCwJCSJbMStpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwLAkJIltpKzFdIiwgRl9BTElBUywgdjkgfSwKLXsgImNscngiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UkRfRzB8UlMxX0cwLAkJIltpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdHggJWcwLFtyczErMF0gKi8KLQoteyAib3JjYyIsCUYzKDIsIDB4MTIsIDApLCBGMyh+MiwgfjB4MTIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAib3JjYyIsCUYzKDIsIDB4MTIsIDEpLCBGMyh+MiwgfjB4MTIsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJvcmNjIiwJRjMoMiwgMHgxMiwgMSksIEYzKH4yLCB+MHgxMiwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQotLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJvcm5jYyIsCUYzKDIsIDB4MTYsIDApLCBGMyh+MiwgfjB4MTYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAib3JuY2MiLAlGMygyLCAweDE2LCAxKSwgRjMofjIsIH4weDE2LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi0vKiBUaGlzIGlzIG5vdCBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgIm9ybiIsCUYzKDIsIDB4MDYsIDApLCBGMyh+MiwgfjB4MDYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAib3JuIiwJRjMoMiwgMHgwNiwgMSksIEYzKH4yLCB+MHgwNiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAidHN0IiwJRjMoMiwgMHgxMiwgMCksIEYzKH4yLCB+MHgxMiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSIsIDAsIHY2IH0sIC8qIG9yY2MgcnMxLCAlZzAsICVnMCAqLwoteyAidHN0IiwJRjMoMiwgMHgxMiwgMCksIEYzKH4yLCB+MHgxMiwgfjApfFJEX0cwfFJTMV9HMHxBU0kofjApLAkiMiIsIDAsIHY2IH0sIC8qIG9yY2MgJWcwLCByczIsICVnMCAqLwoteyAidHN0IiwJRjMoMiwgMHgxMiwgMSksIEYzKH4yLCB+MHgxMiwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxIiwgMCwgdjYgfSwgLyogb3JjYyByczEsIDAsICVnMCAqLwotCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDApLAkJRjMofjIsIH4weDMwLCB+MCl8QVNJKH4wKSwJCSIxLDIsbSIsIDAsIHY4IH0sIC8qIHdyIHIsciwlYXNyWCAqLwoteyAid3IiLAlGMygyLCAweDMwLCAxKSwJCUYzKH4yLCB+MHgzMCwgfjEpLAkJCSIxLGksbSIsIDAsIHY4IH0sIC8qIHdyIHIsaSwlYXNyWCAqLwoteyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfEFTSV9SUzIofjApLAkJIjEsbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHJzMSwlZzAsJWFzclggKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMCksCQlGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHkiLCAwLCB2NiB9LCAvKiB3ciByLHIsJXkgKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMSksCQlGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMCwJCSIxLGkseSIsIDAsIHY2IH0sIC8qIHdyIHIsaSwleSAqLwoteyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcnMxLCVnMCwleSAqLwoteyAid3IiLAlGMygyLCAweDMxLCAwKSwJCUYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIscCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixyLCVwc3IgKi8KLXsgIndyIiwJRjMoMiwgMHgzMSwgMSksCQlGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMCwJCSIxLGkscCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixpLCVwc3IgKi8KLXsgIndyIiwJRjMoMiwgMHgzMSwgMCksCQlGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwlcHNyICovCi17ICJ3ciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix3IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLHIsJXdpbSAqLwoteyAid3IiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwLAkJIjEsaSx3IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLGksJXdpbSAqLwoteyAid3IiLAlGMygyLCAweDMyLCAwKSwJCUYzKH4yLCB+MHgzMiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCV3aW0gKi8KLXsgIndyIiwJRjMoMiwgMHgzMywgMCksCQlGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHQiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwldGJyICovCi17ICJ3ciIsCUYzKDIsIDB4MzMsIDEpLAkJRjMofjIsIH4weDMzLCB+MSl8UkRfRzAsCQkiMSxpLHQiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwldGJyICovCi17ICJ3ciIsCUYzKDIsIDB4MzMsIDApLAkJRjMofjIsIH4weDMzLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXRiciAqLwotCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+Mil8QVNJKH4wKSwJIjEsMixFIiwgMCwgdjkgfSwgLyogd3IgcixyLCVjY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yKSwJCSIxLGksRSIsIDAsIHY5IH0sIC8qIHdyIHIsaSwlY2NyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDMpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+Myl8QVNJKH4wKSwJIjEsMixvIiwgMCwgdjkgfSwgLyogd3IgcixyLCVhc2kgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMyksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4zKSwJCSIxLGksbyIsIDAsIHY5IH0sIC8qIHdyIHIsaSwlYXNpICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDYpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+Nil8QVNJKH4wKSwJIjEsMixzIiwgMCwgdjkgfSwgLyogd3IgcixyLCVmcHJzICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDYpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+NiksCQkiMSxpLHMiLCAwLCB2OSB9LCAvKiB3ciByLGksJWZwcnMgKi8KLQoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxNiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xNil8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlcGNyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE2KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE2KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXBjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxNyksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xNyl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlcGljICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE3KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE3KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXBpYyAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxOCksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xOCl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlZGNyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE4KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE4KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJWRjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxOSksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xOSl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlZ3NyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE5KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE5KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJWdzciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMCksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMCl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlc2V0X3NvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjApLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjApLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlc2V0X3NvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMjEpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MjEpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJWNsZWFyX3NvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjEpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjEpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlY2xlYXJfc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMil8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyMiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yMiksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVzb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIzKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIzKXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCV0aWNrX2NtcHIgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjMpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjMpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwldGlja19jbXByICovCi0KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCksCQkJRjMofjIsIH4weDI4LCB+MCl8U0lNTTEzKH4wKSwJCSJNLGQiLCAwLCB2OCB9LCAvKiByZCAlYXNyWCxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApLAkJCUYzKH4yLCB+MHgyOCwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkieSxkIiwgMCwgdjYgfSwgLyogcmQgJXksciAqLwoteyAicmQiLAlGMygyLCAweDI5LCAwKSwJCQlGMyh+MiwgfjB4MjksIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInAsZCIsIDAsIHY2bm90djkgfSwgLyogcmQgJXBzcixyICovCi17ICJyZCIsCUYzKDIsIDB4MmEsIDApLAkJCUYzKH4yLCB+MHgyYSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkidyxkIiwgMCwgdjZub3R2OSB9LCAvKiByZCAld2ltLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyYiwgMCksCQkJRjMofjIsIH4weDJiLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ0LGQiLCAwLCB2Nm5vdHY5IH0sIC8qIHJkICV0YnIsciAqLwotCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgyKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+Mil8U0lNTTEzKH4wKSwJIkUsZCIsIDAsIHY5IH0sIC8qIHJkICVjY3IsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMyksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjMpfFNJTU0xMyh+MCksCSJvLGQiLCAwLCB2OSB9LCAvKiByZCAlYXNpLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDQpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH40KXxTSU1NMTMofjApLAkiVyxkIiwgMCwgdjkgfSwgLyogcmQgJXRpY2ssciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoNSksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjUpfFNJTU0xMyh+MCksCSJQLGQiLCAwLCB2OSB9LCAvKiByZCAlcGMsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoNiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjYpfFNJTU0xMyh+MCksCSJzLGQiLCAwLCB2OSB9LCAvKiByZCAlZnBycyxyICovCi0KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE2KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTYpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXBjcixyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgxNyksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjE3KXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVwaWMsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMTgpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4xOCl8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlZGNyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE5KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTkpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJWdzcixyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgyMiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjIyKXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVzb2Z0aW50LHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDIzKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MjMpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXRpY2tfY21wcixyICovCi0KLXsgInJkcHIiLAlGMygyLCAweDJhLCAwKSwJCUYzKH4yLCB+MHgyYSwgfjApfFNJTU0xMyh+MCksCSI/LGQiLCAwLCB2OSB9LCAgIC8qIHJkcHIgJXByaXYsciAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCksCQkiMSwyLCEiLCAwLCB2OSB9LCAvKiB3cnByIHIxLHIyLCVwcml2ICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMCksCQlGMyh+MiwgfjB4MzIsIH4wKXxTSU1NMTMofjApLAkiMSwhIiwgMCwgdjkgfSwgICAvKiB3cnByIHIxLCVwcml2ICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMSksCQlGMyh+MiwgfjB4MzIsIH4xKSwJCSIxLGksISIsIDAsIHY5IH0sIC8qIHdycHIgcjEsaSwlcHJpdiAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDEpLAkJRjMofjIsIH4weDMyLCB+MSksCQkiaSwxLCEiLCBGX0FMSUFTLCB2OSB9LCAvKiB3cnByIGkscjEsJXByaXYgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpfFJTMSh+MCksCSJpLCEiLCAwLCB2OSB9LCAgIC8qIHdycHIgaSwlcHJpdiAqLwotCi0vKiA/Pz8gVGhpcyBncm91cCBzZWVtcyB3cm9uZy4gIEEgdGhyZWUgb3BlcmFuZCBtb3ZlPyAgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxBU0kofjApLAkJIjEsMixtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcixyLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSksCQkJIjEsaSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcixpLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcixyLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSl8UkRfRzAsCQkiMSxpLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByLGksJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDApLCBGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAxKSwgRjMofjIsIH4weDMxLCB+MSl8UkRfRzAsCQkiMSxpLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAwKSwgRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLHIsJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMSksIEYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwLAkJIjEsaSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLGksJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMCksIEYzKH4yLCB+MHgzMywgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixyLCV0YnIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDEpLCBGMyh+MiwgfjB4MzMsIH4xKXxSRF9HMCwJCSIxLGksdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixpLCV0YnIgKi8KLQoteyAibW92IiwJRjMoMiwgMHgyOCwgMCksIEYzKH4yLCB+MHgyOCwgfjApfFNJTU0xMyh+MCksCQkiTSxkIiwgRl9BTElBUywgdjggfSwgLyogcmQgJWFzcjEsciAqLwoteyAibW92IiwJRjMoMiwgMHgyOCwgMCksIEYzKH4yLCB+MHgyOCwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkieSxkIiwgRl9BTElBUywgdjYgfSwgLyogcmQgJXksciAqLwoteyAibW92IiwJRjMoMiwgMHgyOSwgMCksIEYzKH4yLCB+MHgyOSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkicCxkIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiByZCAlcHNyLHIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MmEsIDApLCBGMyh+MiwgfjB4MmEsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIncsZCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogcmQgJXdpbSxyICovCi17ICJtb3YiLAlGMygyLCAweDJiLCAwKSwgRjMofjIsIH4weDJiLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ0LGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHJkICV0YnIsciAqLwotCi17ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8QVNJX1JTMih+MCksCQkiMSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcnMxLCVnMCwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpLAkJCSJpLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciAlZzAsaSwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFNJTU0xMyh+MCksCQkiMSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcnMxLDAsJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHJzMSwlZzAsJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMCwJCSJpLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciAlZzAsaSwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByczEsMCwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMCksIEYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDEpLCBGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMCwJCSJpLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyICVnMCxpLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDEpLCBGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsMCwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAwKSwgRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMSksIEYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwLAkJImksdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgJWcwLGksJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMSksIEYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwwLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDApLCBGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwldGJyICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAxKSwgRjMofjIsIH4weDMzLCB+MSl8UkRfRzAsCQkiaSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciAlZzAsaSwldGJyICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAxKSwgRjMofjIsIH4weDMzLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLDAsJXRiciAqLwotCi17ICJtb3YiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8UlMxX0cwfEFTSSh+MCksCSIyLGQiLCAwLCB2NiB9LCAvKiBvciAlZzAscnMyLGQgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKXxSUzFfRzAsCQkiaSxkIiwgMCwgdjYgfSwgLyogb3IgJWcwLGksZAkqLwoteyAibW92IiwgICAgICAgIEYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxBU0lfUlMyKH4wKSwJCSIxLGQiLCAwLCB2NiB9LCAvKiBvciByczEsJWcwLGQgICAqLwoteyAibW92IiwgICAgICAgIEYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKXxTSU1NMTMofjApLAkJIjEsZCIsIDAsIHY2IH0sIC8qIG9yIHJzMSwwLGQgKi8KLQoteyAib3IiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm9yIiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgIm9yIiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAiYnNldCIsCUYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxBU0kofjApLAkiMixyIiwgRl9BTElBUywgdjYgfSwJLyogb3IgcmQscnMyLHJkICovCi17ICJic2V0IiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpLAkJImksciIsIEZfQUxJQVMsIHY2IH0sCS8qIG9yIHJkLGkscmQgKi8KLQotLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJhbmRuIiwJRjMoMiwgMHgwNSwgMCksIEYzKH4yLCB+MHgwNSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhbmRuIiwJRjMoMiwgMHgwNSwgMSksIEYzKH4yLCB+MHgwNSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQotLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJhbmRuY2MiLAlGMygyLCAweDE1LCAwKSwgRjMofjIsIH4weDE1LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFuZG5jYyIsCUYzKDIsIDB4MTUsIDEpLCBGMyh+MiwgfjB4MTUsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgImJjbHIiLAlGMygyLCAweDA1LCAwKSwgRjMofjIsIH4weDA1LCB+MCl8QVNJKH4wKSwJIjIsciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZG4gcmQscnMyLHJkICovCi17ICJiY2xyIiwJRjMoMiwgMHgwNSwgMSksIEYzKH4yLCB+MHgwNSwgfjEpLAkJImksciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZG4gcmQsaSxyZCAqLwotCi17ICJjbXAiLAlGMygyLCAweDE0LCAwKSwgRjMofjIsIH4weDE0LCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMiIsIDAsIHY2IH0sCS8qIHN1YmNjIHJzMSxyczIsJWcwICovCi17ICJjbXAiLAlGMygyLCAweDE0LCAxKSwgRjMofjIsIH4weDE0LCB+MSl8UkRfRzAsCQkiMSxpIiwgMCwgdjYgfSwJLyogc3ViY2MgcnMxLGksJWcwICovCi0KLXsgInN1YiIsCUYzKDIsIDB4MDQsIDApLCBGMyh+MiwgfjB4MDQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic3ViIiwJRjMoMiwgMHgwNCwgMSksIEYzKH4yLCB+MHgwNCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAic3ViY2MiLAlGMygyLCAweDE0LCAwKSwgRjMofjIsIH4weDE0LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInN1YmNjIiwJRjMoMiwgMHgxNCwgMSksIEYzKH4yLCB+MHgxNCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAic3VieCIsCUYzKDIsIDB4MGMsIDApLCBGMyh+MiwgfjB4MGMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJzdWJ4IiwJRjMoMiwgMHgwYywgMSksIEYzKH4yLCB+MHgwYywgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoteyAic3ViYyIsCUYzKDIsIDB4MGMsIDApLCBGMyh+MiwgfjB4MGMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic3ViYyIsCUYzKDIsIDB4MGMsIDEpLCBGMyh+MiwgfjB4MGMsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi0KLXsgInN1YnhjYyIsCUYzKDIsIDB4MWMsIDApLCBGMyh+MiwgfjB4MWMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJzdWJ4Y2MiLAlGMygyLCAweDFjLCAxKSwgRjMofjIsIH4weDFjLCB+MSksCQkiMSxpLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJzdWJjY2MiLAlGMygyLCAweDFjLCAwKSwgRjMofjIsIH4weDFjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInN1YmNjYyIsCUYzKDIsIDB4MWMsIDEpLCBGMyh+MiwgfjB4MWMsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi0KLXsgImFuZCIsCUYzKDIsIDB4MDEsIDApLCBGMyh+MiwgfjB4MDEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYW5kIiwJRjMoMiwgMHgwMSwgMSksIEYzKH4yLCB+MHgwMSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgImFuZCIsCUYzKDIsIDB4MDEsIDEpLCBGMyh+MiwgfjB4MDEsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgImFuZGNjIiwJRjMoMiwgMHgxMSwgMCksIEYzKH4yLCB+MHgxMSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhbmRjYyIsCUYzKDIsIDB4MTEsIDEpLCBGMyh+MiwgfjB4MTEsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJhbmRjYyIsCUYzKDIsIDB4MTEsIDEpLCBGMyh+MiwgfjB4MTEsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgImRlYyIsCUYzKDIsIDB4MDQsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MDQsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogc3ViIHJkLDEscmQgKi8KLXsgImRlYyIsCUYzKDIsIDB4MDQsIDEpLAkJICAgIEYzKH4yLCB+MHgwNCwgfjEpLAkJICAgICAgICJpLHIiLCBGX0FMSUFTLCB2OCB9LAkvKiBzdWIgcmQsaW1tLHJkICovCi17ICJkZWNjYyIsCUYzKDIsIDB4MTQsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MTQsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogc3ViY2MgcmQsMSxyZCAqLwoteyAiZGVjY2MiLAlGMygyLCAweDE0LCAxKSwJCSAgICBGMyh+MiwgfjB4MTQsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogc3ViY2MgcmQsaW1tLHJkICovCi17ICJpbmMiLAlGMygyLCAweDAwLCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDAwLCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFkZCByZCwxLHJkICovCi17ICJpbmMiLAlGMygyLCAweDAwLCAxKSwJCSAgICBGMyh+MiwgfjB4MDAsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogYWRkIHJkLGltbSxyZCAqLwoteyAiaW5jY2MiLAlGMygyLCAweDEwLCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDEwLCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFkZGNjIHJkLDEscmQgKi8KLXsgImluY2NjIiwJRjMoMiwgMHgxMCwgMSksCQkgICAgRjMofjIsIH4weDEwLCB+MSksCQkgICAgICAgImksciIsIEZfQUxJQVMsIHY4IH0sCS8qIGFkZGNjIHJkLGltbSxyZCAqLwotCi17ICJidHN0IiwJRjMoMiwgMHgxMSwgMCksIEYzKH4yLCB+MHgxMSwgfjApfFJEX0cwfEFTSSh+MCksICIxLDIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhbmRjYyByczEscnMyLCVnMCAqLwoteyAiYnRzdCIsCUYzKDIsIDB4MTEsIDEpLCBGMyh+MiwgfjB4MTEsIH4xKXxSRF9HMCwgImksMSIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZGNjIHJzMSxpLCVnMCAqLwotCi17ICJuZWciLAlGMygyLCAweDA0LCAwKSwgRjMofjIsIH4weDA0LCB+MCl8UlMxX0cwfEFTSSh+MCksICIyLGQiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdWIgJWcwLHJzMixyZCAqLwoteyAibmVnIiwJRjMoMiwgMHgwNCwgMCksIEYzKH4yLCB+MHgwNCwgfjApfFJTMV9HMHxBU0kofjApLCAiTyIsIEZfQUxJQVMsIHY2IH0sIC8qIHN1YiAlZzAscmQscmQgKi8KLQoteyAiYWRkIiwJRjMoMiwgMHgwMCwgMCksIEYzKH4yLCB+MHgwMCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhZGQiLAlGMygyLCAweDAwLCAxKSwgRjMofjIsIH4weDAwLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAiYWRkIiwJRjMoMiwgMHgwMCwgMSksIEYzKH4yLCB+MHgwMCwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLXsgImFkZGNjIiwJRjMoMiwgMHgxMCwgMCksIEYzKH4yLCB+MHgxMCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhZGRjYyIsCUYzKDIsIDB4MTAsIDEpLCBGMyh+MiwgfjB4MTAsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJhZGRjYyIsCUYzKDIsIDB4MTAsIDEpLCBGMyh+MiwgfjB4MTAsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgImFkZHgiLAlGMygyLCAweDA4LCAwKSwgRjMofjIsIH4weDA4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkeCIsCUYzKDIsIDB4MDgsIDEpLCBGMyh+MiwgfjB4MDgsIH4xKSwJCSIxLGksZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZHgiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiaSwxLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGRjIiwJRjMoMiwgMHgwOCwgMCksIEYzKH4yLCB+MHgwOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJhZGRjIiwJRjMoMiwgMHgwOCwgMSksIEYzKH4yLCB+MHgwOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLXsgImFkZGMiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiaSwxLGQiLCAwLCB2OSB9LAotCi17ICJhZGR4Y2MiLAlGMygyLCAweDE4LCAwKSwgRjMofjIsIH4weDE4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkeGNjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkeGNjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJImksMSxkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkY2NjIiwJRjMoMiwgMHgxOCwgMCksIEYzKH4yLCB+MHgxOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJhZGRjY2MiLAlGMygyLCAweDE4LCAxKSwgRjMofjIsIH4weDE4LCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoteyAiYWRkY2NjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJImksMSxkIiwgMCwgdjkgfSwKLQoteyAic211bCIsCUYzKDIsIDB4MGIsIDApLCBGMyh+MiwgfjB4MGIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAic211bCIsCUYzKDIsIDB4MGIsIDEpLCBGMyh+MiwgfjB4MGIsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJzbXVsIiwJRjMoMiwgMHgwYiwgMSksIEYzKH4yLCB+MHgwYiwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInNtdWxjYyIsCUYzKDIsIDB4MWIsIDApLCBGMyh+MiwgfjB4MWIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAic211bGNjIiwJRjMoMiwgMHgxYiwgMSksIEYzKH4yLCB+MHgxYiwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInNtdWxjYyIsCUYzKDIsIDB4MWIsIDEpLCBGMyh+MiwgfjB4MWIsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJ1bXVsIiwJRjMoMiwgMHgwYSwgMCksIEYzKH4yLCB+MHgwYSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJ1bXVsIiwJRjMoMiwgMHgwYSwgMSksIEYzKH4yLCB+MHgwYSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInVtdWwiLAlGMygyLCAweDBhLCAxKSwgRjMofjIsIH4weDBhLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAidW11bGNjIiwJRjMoMiwgMHgxYSwgMCksIEYzKH4yLCB+MHgxYSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJ1bXVsY2MiLAlGMygyLCAweDFhLCAxKSwgRjMofjIsIH4weDFhLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAidW11bGNjIiwJRjMoMiwgMHgxYSwgMSksIEYzKH4yLCB+MHgxYSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInNkaXYiLAlGMygyLCAweDBmLCAwKSwgRjMofjIsIH4weDBmLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInNkaXYiLAlGMygyLCAweDBmLCAxKSwgRjMofjIsIH4weDBmLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAic2RpdiIsCUYzKDIsIDB4MGYsIDEpLCBGMyh+MiwgfjB4MGYsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJzZGl2Y2MiLAlGMygyLCAweDFmLCAwKSwgRjMofjIsIH4weDFmLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInNkaXZjYyIsCUYzKDIsIDB4MWYsIDEpLCBGMyh+MiwgfjB4MWYsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJzZGl2Y2MiLAlGMygyLCAweDFmLCAxKSwgRjMofjIsIH4weDFmLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAidWRpdiIsCUYzKDIsIDB4MGUsIDApLCBGMyh+MiwgfjB4MGUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAidWRpdiIsCUYzKDIsIDB4MGUsIDEpLCBGMyh+MiwgfjB4MGUsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJ1ZGl2IiwJRjMoMiwgMHgwZSwgMSksIEYzKH4yLCB+MHgwZSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInVkaXZjYyIsCUYzKDIsIDB4MWUsIDApLCBGMyh+MiwgfjB4MWUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAidWRpdmNjIiwJRjMoMiwgMHgxZSwgMSksIEYzKH4yLCB+MHgxZSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInVkaXZjYyIsCUYzKDIsIDB4MWUsIDEpLCBGMyh+MiwgfjB4MWUsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi0KLXsgIm11bHgiLAlGMygyLCAweDA5LCAwKSwgRjMofjIsIH4weDA5LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgIm11bHgiLAlGMygyLCAweDA5LCAxKSwgRjMofjIsIH4weDA5LCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoteyAic2RpdngiLAlGMygyLCAweDJkLCAwKSwgRjMofjIsIH4weDJkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInNkaXZ4IiwJRjMoMiwgMHgyZCwgMSksIEYzKH4yLCB+MHgyZCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLXsgInVkaXZ4IiwJRjMoMiwgMHgwZCwgMCksIEYzKH4yLCB+MHgwZCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJ1ZGl2eCIsCUYzKDIsIDB4MGQsIDEpLCBGMyh+MiwgfjB4MGQsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi0KLXsgImNhbGwiLAlGMSgweDEpLCBGMSh+MHgxKSwgIkwiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjEoMHgxKSwgRjEofjB4MSksICJMLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi0KLXsgImNhbGwiLAlGMygyLCAweDM4LCAwKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4wKXxSRCh+MHhmKXxBU0kofjApLAkiMSsyIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStyczIsJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMCl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MCl8UkQofjB4Zil8QVNJKH4wKSwJIjErMiwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSV9SUzIofjApLAkiMSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErJWcwLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSV9SUzIofjApLAkiMSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpLAkJIjEraSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczEraSwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSIxK2ksIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSJpKzEiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgaStyczEsJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4ZiksCQkiaSsxLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8UlMxX0cwLAkiaSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlZzAraSwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKXxSUzFfRzAsCSJpLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8U0lNTTEzKH4wKSwJIjEiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKzAsJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8U0lNTTEzKH4wKSwJIjEsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLQotCi0vKiBDb25kaXRpb25hbCBpbnN0cnVjdGlvbnMuCi0KLSAgIEJlY2F1c2UgdGhpcyBwYXJ0IG9mIHRoZSB0YWJsZSB3YXMgc3VjaCBhIG1lc3MgZWFybGllciwgSSBoYXZlCi0gICBtYWNyb2ZpZWQgaXQgc28gdGhhdCBhbGwgdGhlIGJyYW5jaGVzIGFuZCB0cmFwcyBhcmUgZ2VuZXJhdGVkIGZyb20KLSAgIGEgc2luZ2xlLWxpbmUgZGVzY3JpcHRpb24gb2YgZWFjaCBjb25kaXRpb24gdmFsdWUuICBKb2huIEdpbG1vcmUuICovCi0KLS8qIERlZmluZSBicmFuY2hlcyAtLSBvbmUgYW5udWxsZWQsIG9uZSB3aXRob3V0LCBldGMuICovCi0jZGVmaW5lIGJyKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICAgICAgICIsYSBsIiwgICAoZmxhZ3MpLCB2NiB9LCBcCi0geyBvcGNvZGUsIChtYXNrKSAgICAgICwgKGxvc2UpfEFOTlVMLCAibCIsICAgICAoZmxhZ3MpLCB2NiB9Ci0KLSNkZWZpbmUgYnJ4KG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIlosRyIsICAgICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiLFQgWixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSBaLEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUR8QU5OVUwsIChsb3NlKSwgIixhLFQgWixHIiwgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKSwgQU5OVUx8QlBSRUR8KGxvc2UpLCAiLE4gWixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEFOTlVMLCBCUFJFRHwobG9zZSksICIsYSxOIFosRyIsIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVELCBBTk5VTHwobG9zZSl8KDI8PDIwKSwgInosRyIsICAgICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKXwoMjw8MjApLCAiLFQgeixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpfCgyPDwyMCksICIsYSB6LEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSl8KDI8PDIwKSwgIixhLFQgeixHIiwgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfEJQUkVEfChsb3NlKXwoMjw8MjApLCAiLE4geixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgQlBSRUR8KGxvc2UpfCgyPDwyMCksICIsYSxOIHosRyIsIChmbGFncyksIHY5IH0KLQotLyogRGVmaW5lIGZvdXIgdHJhcHM6IHJlZytyZWcsIHJlZyArIGltbWVkaWF0ZSwgaW1tZWRpYXRlIGFsb25lLCByZWcgYWxvbmUuICovCi0jZGVmaW5lIHRyKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwxMSl8SU1NRUQsIChsb3NlKXxSUzFfRzAsCSJaLGkiLCAgIChmbGFncyksIHY5IH0sIC8qICVnMCArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpfElNTUVELCAobG9zZSksCSJaLDEraSIsIChmbGFncyksIHY5IH0sIC8qIHJzMSArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpLCBJTU1FRHwobG9zZSksCSJaLDErMiIsIChmbGFncyksIHY5IH0sIC8qIHJzMSArIHJzMiAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpLCBJTU1FRHwobG9zZSl8UlMyX0cwLAkiWiwxIiwgICAoZmxhZ3MpLCB2OSB9LCAvKiByczEgKyAlZzAgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8SU1NRUQsIChsb3NlKXxSUzFfRzAsCSJ6LGkiLCAgIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogJWcwICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spfElNTUVELCAobG9zZSksCSJ6LDEraSIsIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogcnMxICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSksCSJ6LDErMiIsIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogcnMxICsgcnMyICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSl8UlMyX0cwLAkieiwxIiwgICAoZmxhZ3MpfEZfQUxJQVMsIHY5IH0sIC8qIHJzMSArICVnMCAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpfFJTMV9HMCwJCSJpIiwgICAgIChmbGFncyksIHY2IH0sIC8qICVnMCArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpLAkJIjEraSIsICAgKGZsYWdzKSwgdjYgfSwgLyogcnMxICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSksCQkiMSsyIiwgICAoZmxhZ3MpLCB2NiB9LCAvKiByczEgKyByczIgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIElNTUVEfChsb3NlKXxSUzJfRzAsCQkiMSIsICAgICAoZmxhZ3MpLCB2NiB9IC8qIHJzMSArICVnMCAqLwotCi0vKiB2OTogV2UgbXVzdCBwdXQgYGJyeCcgYmVmb3JlIGBicicsIHRvIGVuc3VyZSB0aGF0IHdlIG5ldmVyIG1hdGNoIHNvbWV0aGluZwotICAgdjk6IGFnYWluc3QgYW4gZXhwcmVzc2lvbiB1bmxlc3MgaXQgaXMgYW4gZXhwcmVzc2lvbi4gIE90aGVyd2lzZSwgd2UgZW5kCi0gICB2OTogdXAgd2l0aCB1bmRlZmluZWQgc3ltYm9sIHRhYmxlcyBlbnRyaWVzLCBiZWNhdXNlIHRoZXkgZ2V0IGFkZGVkLCBidXQKLSAgIHY5OiBhcmUgbm90IGRlbGV0ZWQgaWYgdGhlIHBhdHRlcm4gZmFpbHMgdG8gbWF0Y2guICAqLwotCi0vKiBEZWZpbmUgYm90aCBicmFuY2hlcyBhbmQgdHJhcHMgYmFzZWQgb24gY29uZGl0aW9uIG1hc2sgKi8KLSNkZWZpbmUgY29uZChib3AsIHRvcCwgbWFzaywgZmxhZ3MpIFwKLSAgYnJ4KGJvcCwgRjIoMCwgMSl8KG1hc2spLCBGMih+MCwgfjEpfCgofm1hc2spJkNPTkQofjApKSwgRl9ERUxBWUVEfChmbGFncykpLCAvKiB2OSAqLyBcCi0gIGJyKGJvcCwgIEYyKDAsIDIpfChtYXNrKSwgRjIofjAsIH4yKXwoKH5tYXNrKSZDT05EKH4wKSksIEZfREVMQVlFRHwoZmxhZ3MpKSwgXAotICB0cih0b3AsICBGMygyLCAweDNhLCAwKXwobWFzayksIEYzKH4yLCB+MHgzYSwgMCl8KCh+bWFzaykmQ09ORCh+MCkpLCAoKGZsYWdzKSAmIH4oRl9VTkJSfEZfQ09OREJSKSkpCi0KLS8qIERlZmluZSBhbGwgdGhlIGNvbmRpdGlvbnMsIGFsbCB0aGUgYnJhbmNoZXMsIGFsbCB0aGUgdHJhcHMuICAqLwotCi0vKiBTdGFuZGFyZCBicmFuY2gsIHRyYXAgbW5lbW9uaWNzICovCi1jb25kICgiYiIsCSJ0YSIsICAgQ09OREEsIEZfVU5CUiksCi0vKiBBbHRlcm5hdGl2ZSBmb3JtIChqdXN0IGZvciBhc3NlbWJseSwgbm90IGZvciBkaXNhc3NlbWJseSkgKi8KLWNvbmQgKCJiYSIsCSJ0IiwgICAgQ09OREEsIEZfVU5CUnxGX0FMSUFTKSwKLQotY29uZCAoImJjYyIsCSJ0Y2MiLCAgQ09ORENDLCBGX0NPTkRCUiksCi1jb25kICgiYmNzIiwJInRjcyIsICBDT05EQ1MsIEZfQ09OREJSKSwKLWNvbmQgKCJiZSIsCSJ0ZSIsICAgQ09OREUsIEZfQ09OREJSKSwKLWNvbmQgKCJiZXEiLAkidGVxIiwgIENPTkRFLCBGX0NPTkRCUnxGX0FMSUFTKSwKLWNvbmQgKCJiZyIsCSJ0ZyIsICAgQ09OREcsIEZfQ09OREJSKSwKLWNvbmQgKCJiZ3QiLAkidGd0IiwgIENPTkRHLCBGX0NPTkRCUnxGX0FMSUFTKSwKLWNvbmQgKCJiZ2UiLAkidGdlIiwgIENPTkRHRSwgRl9DT05EQlIpLAotY29uZCAoImJnZXUiLAkidGdldSIsIENPTkRHRVUsIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgY2MgKi8KLWNvbmQgKCJiZ3UiLAkidGd1IiwgIENPTkRHVSwgRl9DT05EQlIpLAotY29uZCAoImJsIiwJInRsIiwgICBDT05ETCwgRl9DT05EQlIpLAotY29uZCAoImJsdCIsCSJ0bHQiLCAgQ09OREwsIEZfQ09OREJSfEZfQUxJQVMpLAotY29uZCAoImJsZSIsCSJ0bGUiLCAgQ09ORExFLCBGX0NPTkRCUiksCi1jb25kICgiYmxldSIsCSJ0bGV1IiwgQ09ORExFVSwgRl9DT05EQlIpLAotY29uZCAoImJsdSIsCSJ0bHUiLCAgQ09ORExVLCBGX0NPTkRCUnxGX0FMSUFTKSwgLyogZm9yIGNzICovCi1jb25kICgiYm4iLAkidG4iLCAgIENPTkROLCBGX0NPTkRCUiksCi1jb25kICgiYm5lIiwJInRuZSIsICBDT05ETkUsIEZfQ09OREJSKSwKLWNvbmQgKCJibmVnIiwJInRuZWciLCBDT05ETkVHLCBGX0NPTkRCUiksCi1jb25kICgiYm56IiwJInRueiIsICBDT05ETlosIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgbmUgKi8KLWNvbmQgKCJicG9zIiwJInRwb3MiLCBDT05EUE9TLCBGX0NPTkRCUiksCi1jb25kICgiYnZjIiwJInR2YyIsICBDT05EVkMsIEZfQ09OREJSKSwKLWNvbmQgKCJidnMiLAkidHZzIiwgIENPTkRWUywgRl9DT05EQlIpLAotY29uZCAoImJ6IiwJInR6IiwgICBDT05EWiwgRl9DT05EQlJ8Rl9BTElBUyksIC8qIGZvciBlICovCi0KLSN1bmRlZiBjb25kCi0jdW5kZWYgYnIKLSN1bmRlZiBicnIgLyogdjkgKi8KLSN1bmRlZiB0cgotCi0jZGVmaW5lIGJycihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiMSxrIiwgICAgICBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIixUIDEsayIsICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSAxLGsiLCAgIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpLCAiLGEsVCAxLGsiLCBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfEJQUkVEfChsb3NlKSwgIixOIDEsayIsICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCBCUFJFRHwobG9zZSksICIsYSxOIDEsayIsIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9Ci0KLSNkZWZpbmUgY29uZHIoYm9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotICBicnIoYm9wLCBGMigwLCAzKXxDT05EKG1hc2spLCBGMih+MCwgfjMpfENPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCi0KLS8qIHY5ICovIGNvbmRyKCJicm56IiwgMHg1LCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJ6IiwgMHgxLCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJnZXoiLCAweDcsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicmx6IiwgMHgzLCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJsZXoiLCAweDIsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicmd6IiwgMHg2LCBGX0NPTkRCUiksCi0KLSN1bmRlZiBjb25kciAvKiB2OSAqLwotI3VuZGVmIGJyciAvKiB2OSAqLwotCi0jZGVmaW5lIG1vdnIob3Bjb2RlLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCBGMygyLCAweDJmLCAwKXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDJmLCB+MCl8UkNPTkQofihtYXNrKSksICIxLDIsZCIsIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgRjMoMiwgMHgyZiwgMSl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgyZiwgfjEpfFJDT05EKH4obWFzaykpLCAiMSxqLGQiLCAoZmxhZ3MpLCB2OSB9Ci0KLSNkZWZpbmUgZm1ycnMob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIChsb3NlKSwgIjEsZixnIiwgKGZsYWdzKSB8IEZfRkxPQVQsIHY5IH0KLSNkZWZpbmUgZm1ycmQob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIChsb3NlKSwgIjEsQixIIiwgKGZsYWdzKSB8IEZfRkxPQVQsIHY5IH0KLSNkZWZpbmUgZm1ycnEob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIChsb3NlKSwgIjEsUixKIiwgKGZsYWdzKSB8IEZfRkxPQVQsIHY5IH0KLQotI2RlZmluZSBmbW92cnMobW9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotICBmbXJycyhtb3AsIEYzKDIsIDB4MzUsIDApfE9QRl9MT1c1KDUpfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MzUsIDApfE9QRl9MT1c1KH41KXxSQ09ORCh+KG1hc2spKSwgKGZsYWdzKSkgLyogdjkgKi8KLSNkZWZpbmUgZm1vdnJkKG1vcCwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSAgZm1ycmQobW9wLCBGMygyLCAweDM1LCAwKXxPUEZfTE9XNSg2KXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDM1LCAwKXxPUEZfTE9XNSh+Nil8UkNPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCi0jZGVmaW5lIGZtb3ZycShtb3AsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0gIGZtcnJxKG1vcCwgRjMoMiwgMHgzNSwgMCl8T1BGX0xPVzUoNyl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgzNSwgMCl8T1BGX0xPVzUofjcpfFJDT05EKH4obWFzaykpLCAoZmxhZ3MpKSAvKiB2OSAqLwotCi0vKiB2OSAqLyBtb3ZyKCJtb3ZybmUiLCAweDUsIDApLAotLyogdjkgKi8gbW92cigibW92cmUiLCAweDEsIDApLAotLyogdjkgKi8gbW92cigibW92cmdleiIsIDB4NywgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZybHoiLCAweDMsIDApLAotLyogdjkgKi8gbW92cigibW92cmxleiIsIDB4MiwgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZyZ3oiLCAweDYsIDApLAotLyogdjkgKi8gbW92cigibW92cm56IiwgMHg1LCBGX0FMSUFTKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJ6IiwgMHgxLCBGX0FMSUFTKSwKLQotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNuZSIsIDB4NSwgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2UiLCAweDEsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNnZXoiLCAweDcsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNseiIsIDB4MywgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2xleiIsIDB4MiwgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2d6IiwgMHg2LCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzbnoiLCAweDUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnN6IiwgMHgxLCBGX0FMSUFTKSwKLQotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRuZSIsIDB4NSwgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGUiLCAweDEsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRnZXoiLCAweDcsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRseiIsIDB4MywgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGxleiIsIDB4MiwgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGd6IiwgMHg2LCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkbnoiLCAweDUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmR6IiwgMHgxLCBGX0FMSUFTKSwKLQotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFuZSIsIDB4NSwgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWUiLCAweDEsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFnZXoiLCAweDcsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFseiIsIDB4MywgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWxleiIsIDB4MiwgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWd6IiwgMHg2LCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxbnoiLCAweDUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnF6IiwgMHgxLCBGX0FMSUFTKSwKLQotI3VuZGVmIG1vdnIgLyogdjkgKi8KLSN1bmRlZiBmbW92ciAvKiB2OSAqLwotI3VuZGVmIGZtcnIgLyogdjkgKi8KLQotI2RlZmluZSBtb3ZpY2Mob3Bjb2RlLCBjb25kLCBmbGFncykgLyogdjkgKi8gXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8TUNPTkQoY29uZCwxKXxJQ0MsIEYzKH4yLCB+MHgyYywgfjApfE1DT05EKH5jb25kLH4xKXxYQ0N8KDE8PDExKSwgInosMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfE1DT05EKGNvbmQsMSl8SUNDLCBGMyh+MiwgfjB4MmMsIH4xKXxNQ09ORCh+Y29uZCx+MSl8WENDfCgxPDwxMSksICJ6LEksZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxNQ09ORChjb25kLDEpfFhDQywgRjMofjIsIH4weDJjLCB+MCl8TUNPTkQofmNvbmQsfjEpfCgxPDwxMSksICAgICAiWiwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8TUNPTkQoY29uZCwxKXxYQ0MsIEYzKH4yLCB+MHgyYywgfjEpfE1DT05EKH5jb25kLH4xKXwoMTw8MTEpLCAgICAgIlosSSxkIiwgZmxhZ3MsIHY5IH0KLQotI2RlZmluZSBtb3ZmY2Mob3Bjb2RlLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygwKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjApfEYzKH4yLCB+MHgyYywgfjApLCAiNiwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDApfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+MCl8RjMofjIsIH4weDJjLCB+MSksICI2LEksZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxGQ0MoMSl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4xKXxGMyh+MiwgfjB4MmMsIH4wKSwgIjcsMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfEZDQygxKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjEpfEYzKH4yLCB+MHgyYywgfjEpLCAiNyxJLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8RkNDKDIpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Mil8RjMofjIsIH4weDJjLCB+MCksICI4LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxGQ0MoMil8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4yKXxGMyh+MiwgfjB4MmMsIH4xKSwgIjgsSSxkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygzKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjMpfEYzKH4yLCB+MHgyYywgfjApLCAiOSwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDMpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Myl8RjMofjIsIH4weDJjLCB+MSksICI5LEksZCIsIGZsYWdzLCB2OSB9Ci0KLSNkZWZpbmUgbW92Y2Mob3Bjb2RlLCBjb25kLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLSAgbW92ZmNjIChvcGNvZGUsIGZjb25kLCBmbGFncyksIC8qIHY5ICovIFwKLSAgbW92aWNjIChvcGNvZGUsIGNvbmQsIGZsYWdzKSAvKiB2OSAqLwotCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZhIiwJQ09OREEsIEZDT05EQSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZjYyIsCUNPTkRDQywgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZnZXUiLAlDT05ER0VVLCBGX0FMSUFTKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmNzIiwJQ09ORENTLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmx1IiwJQ09ORExVLCBGX0FMSUFTKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmUiLAlDT05ERSwgRkNPTkRFLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmciLAlDT05ERywgRkNPTkRHLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmdlIiwJQ09OREdFLCBGQ09OREdFLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmd1IiwJQ09OREdVLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmwiLAlDT05ETCwgRkNPTkRMLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmxlIiwJQ09ORExFLCBGQ09ORExFLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmxldSIsCUNPTkRMRVUsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92bGciLAlGQ09ORExHLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdm4iLAlDT05ETiwgRkNPTkROLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdm5lIiwJQ09ORE5FLCBGQ09ORE5FLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdm5lZyIsCUNPTkRORUcsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92bnoiLAlDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAotLyogdjkgKi8gbW92ZmNjICgibW92byIsCUZDT05ETywgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3Zwb3MiLAlDT05EUE9TLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnUiLAlGQ09ORFUsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWUiLAlGQ09ORFVFLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVnIiwJRkNPTkRVRywgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1Z2UiLAlGQ09ORFVHRSwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1bCIsCUZDT05EVUwsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWxlIiwJRkNPTkRVTEUsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92dmMiLAlDT05EVkMsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92dnMiLAlDT05EVlMsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92eiIsCUNPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAotCi0jdW5kZWYgbW92aWNjIC8qIHY5ICovCi0jdW5kZWYgbW92ZmNjIC8qIHY5ICovCi0jdW5kZWYgbW92Y2MgLyogdjkgKi8KLQotI2RlZmluZSBGTV9TRiAxCQkvKiB2OSAtIHZhbHVlcyBmb3IgZnBzaXplICovCi0jZGVmaW5lIEZNX0RGIDIJCS8qIHY5ICovCi0jZGVmaW5lIEZNX1FGIDMJCS8qIHY5ICovCi0KLSNkZWZpbmUgZm1vdmljYyhvcGNvZGUsIGZwc2l6ZSwgY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgxMDArZnBzaXplKXxNQ09ORChjb25kLDApLCAgRjNGKH4yLCB+MHgzNSwgfigweDEwMCtmcHNpemUpKXxNQ09ORCh+Y29uZCx+MCksICAieixmLGciLCBmbGFncywgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDE4MCtmcHNpemUpfE1DT05EKGNvbmQsMCksICBGM0YofjIsIH4weDM1LCB+KDB4MTgwK2Zwc2l6ZSkpfE1DT05EKH5jb25kLH4wKSwgICJaLGYsZyIsIGZsYWdzLCB2OSB9Ci0KLSNkZWZpbmUgZm1vdmZjYyhvcGNvZGUsIGZwc2l6ZSwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDAwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwMDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjYsZixnIiwgZmxhZ3MsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwNDArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDA0MCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiNyxmLGciLCBmbGFncywgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDA4MCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDgwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI4LGYsZyIsIGZsYWdzLCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MGMwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwYzArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjksZixnIiwgZmxhZ3MsIHY5IH0KLQotLyogRklYTUU6IHVzZSBmbW92aWNjL2Ztb3ZmY2M/ICovIC8qIHY5ICovCi0jZGVmaW5lIGZtb3ZjYyhvcGNvZGUsIGZwc2l6ZSwgY29uZCwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTAwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxMDArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgInosZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDAwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwMDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjYsZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTgwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxODArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgIlosZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDQwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwNDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjcsZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDgwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwODArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjgsZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MGMwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwYzArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjksZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9Ci0KLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGEiLAlGTV9ERiwgQ09OREEsIEZDT05EQSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFhIiwJRk1fUUYsIENPTkRBLCBGQ09OREEsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzYSIsCUZNX1NGLCBDT05EQSwgRkNPTkRBLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGNjIiwJRk1fREYsIENPTkRDQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFjYyIsCUZNX1FGLCBDT05EQ0MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzY2MiLAlGTV9TRiwgQ09ORENDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGNzIiwJRk1fREYsIENPTkRDUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFjcyIsCUZNX1FGLCBDT05EQ1MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzY3MiLAlGTV9TRiwgQ09ORENTLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGUiLAlGTV9ERiwgQ09OREUsIEZDT05ERSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFlIiwJRk1fUUYsIENPTkRFLCBGQ09OREUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzZSIsCUZNX1NGLCBDT05ERSwgRkNPTkRFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGciLAlGTV9ERiwgQ09OREcsIEZDT05ERywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFnIiwJRk1fUUYsIENPTkRHLCBGQ09OREcsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzZyIsCUZNX1NGLCBDT05ERywgRkNPTkRHLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGdlIiwJRk1fREYsIENPTkRHRSwgRkNPTkRHRSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFnZSIsCUZNX1FGLCBDT05ER0UsIEZDT05ER0UsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzZ2UiLAlGTV9TRiwgQ09OREdFLCBGQ09OREdFLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGdldSIsCUZNX0RGLCBDT05ER0VVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWdldSIsCUZNX1FGLCBDT05ER0VVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2dldSIsCUZNX1NGLCBDT05ER0VVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGd1IiwJRk1fREYsIENPTkRHVSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFndSIsCUZNX1FGLCBDT05ER1UsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzZ3UiLAlGTV9TRiwgQ09OREdVLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGwiLAlGTV9ERiwgQ09OREwsIEZDT05ETCwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFsIiwJRk1fUUYsIENPTkRMLCBGQ09OREwsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbCIsCUZNX1NGLCBDT05ETCwgRkNPTkRMLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGxlIiwJRk1fREYsIENPTkRMRSwgRkNPTkRMRSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFsZSIsCUZNX1FGLCBDT05ETEUsIEZDT05ETEUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbGUiLAlGTV9TRiwgQ09ORExFLCBGQ09ORExFLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGxldSIsCUZNX0RGLCBDT05ETEVVLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWxldSIsCUZNX1FGLCBDT05ETEVVLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2xldSIsCUZNX1NGLCBDT05ETEVVLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZGxnIiwJRk1fREYsIEZDT05ETEcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxbGciLAlGTV9RRiwgRkNPTkRMRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnNsZyIsCUZNX1NGLCBGQ09ORExHLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGx1IiwJRk1fREYsIENPTkRMVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFsdSIsCUZNX1FGLCBDT05ETFUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzbHUiLAlGTV9TRiwgQ09ORExVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZG4iLAlGTV9ERiwgQ09ORE4sIEZDT05ETiwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFuIiwJRk1fUUYsIENPTkROLCBGQ09ORE4sIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbiIsCUZNX1NGLCBDT05ETiwgRkNPTkROLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZG5lIiwJRk1fREYsIENPTkRORSwgRkNPTkRORSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFuZSIsCUZNX1FGLCBDT05ETkUsIEZDT05ETkUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbmUiLAlGTV9TRiwgQ09ORE5FLCBGQ09ORE5FLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZG5lZyIsCUZNX0RGLCBDT05ETkVHLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cW5lZyIsCUZNX1FGLCBDT05ETkVHLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c25lZyIsCUZNX1NGLCBDT05ETkVHLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZG56IiwJRk1fREYsIENPTkROWiwgRkNPTkROWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFueiIsCUZNX1FGLCBDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbnoiLAlGTV9TRiwgQ09ORE5aLCBGQ09ORE5aLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZG8iLAlGTV9ERiwgRkNPTkRPLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cW8iLAlGTV9RRiwgRkNPTkRPLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c28iLAlGTV9TRiwgRkNPTkRPLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZHBvcyIsCUZNX0RGLCBDT05EUE9TLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cXBvcyIsCUZNX1FGLCBDT05EUE9TLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c3BvcyIsCUZNX1NGLCBDT05EUE9TLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHUiLAlGTV9ERiwgRkNPTkRVLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXUiLAlGTV9RRiwgRkNPTkRVLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3UiLAlGTV9TRiwgRkNPTkRVLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVlIiwJRk1fREYsIEZDT05EVUUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWUiLAlGTV9RRiwgRkNPTkRVRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1ZSIsCUZNX1NGLCBGQ09ORFVFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVnIiwJRk1fREYsIEZDT05EVUcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWciLAlGTV9RRiwgRkNPTkRVRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1ZyIsCUZNX1NGLCBGQ09ORFVHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVnZSIsCUZNX0RGLCBGQ09ORFVHRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1Z2UiLAlGTV9RRiwgRkNPTkRVR0UsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWdlIiwJRk1fU0YsIEZDT05EVUdFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVsIiwJRk1fREYsIEZDT05EVUwsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWwiLAlGTV9RRiwgRkNPTkRVTCwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1bCIsCUZNX1NGLCBGQ09ORFVMLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVsZSIsCUZNX0RGLCBGQ09ORFVMRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1bGUiLAlGTV9RRiwgRkNPTkRVTEUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWxlIiwJRk1fU0YsIEZDT05EVUxFLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZHZjIiwJRk1fREYsIENPTkRWQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnF2YyIsCUZNX1FGLCBDT05EVkMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzdmMiLAlGTV9TRiwgQ09ORFZDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZHZzIiwJRk1fREYsIENPTkRWUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnF2cyIsCUZNX1FGLCBDT05EVlMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzdnMiLAlGTV9TRiwgQ09ORFZTLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZHoiLAlGTV9ERiwgQ09ORFosIEZDT05EWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnF6IiwJRk1fUUYsIENPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzeiIsCUZNX1NGLCBDT05EWiwgRkNPTkRaLCBGX0FMSUFTKSwKLQotI3VuZGVmIGZtb3ZpY2MgLyogdjkgKi8KLSN1bmRlZiBmbW92ZmNjIC8qIHY5ICovCi0jdW5kZWYgZm1vdmNjIC8qIHY5ICovCi0jdW5kZWYgRk1fREYgLyogdjkgKi8KLSN1bmRlZiBGTV9RRiAvKiB2OSAqLwotI3VuZGVmIEZNX1NGIC8qIHY5ICovCi0KLS8qIENvcHJvY2Vzc29yIGJyYW5jaGVzLiAgKi8KLSNkZWZpbmUgQ0JSKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MsIGFyY2gpIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHwobG9zZSksICJsIiwgICAgZmxhZ3N8Rl9ERUxBWUVELCBhcmNoIH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICIsYSBsIiwgZmxhZ3N8Rl9ERUxBWUVELCBhcmNoIH0KLQotLyogRmxvYXRpbmcgcG9pbnQgYnJhbmNoZXMuICAqLwotI2RlZmluZSBGQlIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfChsb3NlKSwgImwiLCAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY2IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICIsYSBsIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2NiB9Ci0KLS8qIFY5IGV4dGVuZGVkIGZsb2F0aW5nIHBvaW50IGJyYW5jaGVzLiAgKi8KLSNkZWZpbmUgRkJSWChvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjApfChsb3NlKSwgIjYsRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjApfChsb3NlKSwgIixUIDYsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjApfChsb3NlKSwgIixhIDYsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjApfChsb3NlKSwgIixhLFQgNixHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjApfChsb3NlKSwgIixOIDYsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjApfChsb3NlKSwgIixhLE4gNixHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjEpfChsb3NlKSwgIjcsRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjEpfChsb3NlKSwgIixUIDcsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjEpfChsb3NlKSwgIixhIDcsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjEpfChsb3NlKSwgIixhLFQgNyxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjEpfChsb3NlKSwgIixOIDcsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjEpfChsb3NlKSwgIixhLE4gNyxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjIpfChsb3NlKSwgIjgsRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjIpfChsb3NlKSwgIixUIDgsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjIpfChsb3NlKSwgIixhIDgsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjIpfChsb3NlKSwgIixhLFQgOCxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjIpfChsb3NlKSwgIixOIDgsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjIpfChsb3NlKSwgIixhLE4gOCxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjMpfChsb3NlKSwgIjksRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjMpfChsb3NlKSwgIixUIDksRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjMpfChsb3NlKSwgIixhIDksRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjMpfChsb3NlKSwgIixhLFQgOSxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjMpfChsb3NlKSwgIixOIDksRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjMpfChsb3NlKSwgIixhLE4gOSxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9Ci0KLS8qIHY5OiBXZSBtdXN0IHB1dCBgRkJSWCcgYmVmb3JlIGBGQlInLCB0byBlbnN1cmUgdGhhdCB3ZSBuZXZlciBtYXRjaAotICAgdjk6IHNvbWV0aGluZyBhZ2FpbnN0IGFuIGV4cHJlc3Npb24gdW5sZXNzIGl0IGlzIGFuIGV4cHJlc3Npb24uICBPdGhlcndpc2UsCi0gICB2OTogd2UgZW5kIHVwIHdpdGggdW5kZWZpbmVkIHN5bWJvbCB0YWJsZXMgZW50cmllcywgYmVjYXVzZSB0aGV5IGdldCBhZGRlZCwKLSAgIHY5OiBidXQgYXJlIG5vdCBkZWxldGVkIGlmIHRoZSBwYXR0ZXJuIGZhaWxzIHRvIG1hdGNoLiAgKi8KLQotI2RlZmluZSBDT05ERkMoZm9wLCBjb3AsIG1hc2ssIGZsYWdzKSBcCi0gIEZCUlgoZm9wLCBGMigwLCA1KXxDT05EKG1hc2spLCBGMih+MCwgfjUpfENPTkQofihtYXNrKSksIGZsYWdzKSwgLyogdjkgKi8gXAotICBGQlIoZm9wLCBGMigwLCA2KXxDT05EKG1hc2spLCBGMih+MCwgfjYpfENPTkQofihtYXNrKSksIGZsYWdzKSwgXAotICBDQlIoY29wLCBGMigwLCA3KXxDT05EKG1hc2spLCBGMih+MCwgfjcpfENPTkQofihtYXNrKSksIGZsYWdzLCB2Nm5vdGxldCkKLQotI2RlZmluZSBDT05ERkNMKGZvcCwgY29wLCBtYXNrLCBmbGFncykgXAotICBGQlJYKGZvcCwgRjIoMCwgNSl8Q09ORChtYXNrKSwgRjIofjAsIH41KXxDT05EKH4obWFzaykpLCBmbGFncyksIC8qIHY5ICovIFwKLSAgRkJSKGZvcCwgRjIoMCwgNil8Q09ORChtYXNrKSwgRjIofjAsIH42KXxDT05EKH4obWFzaykpLCBmbGFncyksIFwKLSAgQ0JSKGNvcCwgRjIoMCwgNyl8Q09ORChtYXNrKSwgRjIofjAsIH43KXxDT05EKH4obWFzaykpLCBmbGFncywgdjYpCi0KLSNkZWZpbmUgQ09OREYoZm9wLCBtYXNrLCBmbGFncykgXAotICBGQlJYKGZvcCwgRjIoMCwgNSl8Q09ORChtYXNrKSwgRjIofjAsIH41KXxDT05EKH4obWFzaykpLCBmbGFncyksIC8qIHY5ICovIFwKLSAgRkJSKGZvcCwgRjIoMCwgNil8Q09ORChtYXNrKSwgRjIofjAsIH42KXxDT05EKH4obWFzaykpLCBmbGFncykKLQotQ09OREZDICAoImZiIiwgICAgImNiIiwgICAgMHg4LCAwKSwKLUNPTkRGQ0wgKCJmYmEiLAkgICJjYmEiLCAgIDB4OCwgRl9BTElBUyksCi1DT05ERkMgICgiZmJlIiwJICAiY2IwIiwgICAweDksIDApLAotQ09OREYgICAoImZieiIsICAgICAgICAgICAgMHg5LCBGX0FMSUFTKSwKLUNPTkRGQyAgKCJmYmciLAkgICJjYjIiLCAgIDB4NiwgMCksCi1DT05ERkMgICgiZmJnZSIsICAiY2IwMiIsICAweGIsIDApLAotQ09OREZDICAoImZibCIsCSAgImNiMSIsICAgMHg0LCAwKSwKLUNPTkRGQyAgKCJmYmxlIiwgICJjYjAxIiwgIDB4ZCwgMCksCi1DT05ERkMgICgiZmJsZyIsICAiY2IxMiIsICAweDIsIDApLAotQ09OREZDTCAoImZibiIsCSAgImNibiIsICAgMHgwLCAwKSwKLUNPTkRGQyAgKCJmYm5lIiwgICJjYjEyMyIsIDB4MSwgMCksCi1DT05ERiAgICgiZmJueiIsICAgICAgICAgICAweDEsIEZfQUxJQVMpLAotQ09OREZDICAoImZibyIsCSAgImNiMDEyIiwgMHhmLCAwKSwKLUNPTkRGQyAgKCJmYnUiLAkgICJjYjMiLCAgIDB4NywgMCksCi1DT05ERkMgICgiZmJ1ZSIsICAiY2IwMyIsICAweGEsIDApLAotQ09OREZDICAoImZidWciLCAgImNiMjMiLCAgMHg1LCAwKSwKLUNPTkRGQyAgKCJmYnVnZSIsICJjYjAyMyIsIDB4YywgMCksCi1DT05ERkMgICgiZmJ1bCIsICAiY2IxMyIsICAweDMsIDApLAotQ09OREZDICAoImZidWxlIiwgImNiMDEzIiwgMHhlLCAwKSwKLQotI3VuZGVmIENPTkRGQwotI3VuZGVmIENPTkRGQ0wKLSN1bmRlZiBDT05ERgotI3VuZGVmIENCUgotI3VuZGVmIEZCUgotI3VuZGVmIEZCUlgJLyogdjkgKi8KLQoteyAiam1wIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfFJEX0cwfEFTSSh+MCksCSIxKzIiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStyczIsJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAwKSwgRjMofjIsIH4weDM4LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErJWcwLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJEX0cwLAkJIjEraSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxK2ksJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzAsCQkiaSsxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCBpK3JzMSwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRF9HMHxSUzFfRzAsCQkiaSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWcwK2ksJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSswLCVnMCAqLwotCi17ICJub3AiLAlGMigwLCA0KSwgMHhmZWZmZmZmZiwgIiIsIDAsIHY2IH0sIC8qIHNldGhpIDAsICVnMCAqLwotCi17ICJzZXQiLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiUzAsZCIsIEZfQUxJQVMsIHY2IH0sCi17ICJzZXR1dyIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTMCxkIiwgRl9BTElBUywgdjkgfSwKLXsgInNldHN3IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlMwLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAic2V0eCIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTMCwxLGQiLCBGX0FMSUFTLCB2OSB9LAotCi17ICJzZXRoaSIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJoLGQiLCAwLCB2NiB9LAotCi17ICJ0YWRkY2MiLAlGMygyLCAweDIwLCAwKSwgRjMofjIsIH4weDIwLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInRhZGRjYyIsCUYzKDIsIDB4MjAsIDEpLCBGMyh+MiwgfjB4MjAsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2MiLAlGMygyLCAweDIwLCAxKSwgRjMofjIsIH4weDIwLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjdHYiLAlGMygyLCAweDIyLCAwKSwgRjMofjIsIH4weDIyLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInRhZGRjY3R2IiwJRjMoMiwgMHgyMiwgMSksIEYzKH4yLCB+MHgyMiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInRhZGRjY3R2IiwJRjMoMiwgMHgyMiwgMSksIEYzKH4yLCB+MHgyMiwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAidHN1YmNjIiwJRjMoMiwgMHgyMSwgMCksIEYzKH4yLCB+MHgyMSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ0c3ViY2MiLAlGMygyLCAweDIxLCAxKSwgRjMofjIsIH4weDIxLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAidHN1YmNjdHYiLAlGMygyLCAweDIzLCAwKSwgRjMofjIsIH4weDIzLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInRzdWJjY3R2IiwJRjMoMiwgMHgyMywgMSksIEYzKH4yLCB+MHgyMywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAidW5pbXAiLAlGMigweDAsIDB4MCksIDB4ZmZjMDAwMDAsICJuIiwgMCwgdjZub3R2OSB9LAoteyAiaWxsdHJhcCIsCUYyKDAsIDApLCBGMih+MCwgfjApfFJEX0cwLCAibiIsIDAsIHY5IH0sCi0KLS8qIFRoaXMgKmlzKiBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgInhub3IiLAlGMygyLCAweDA3LCAwKSwgRjMofjIsIH4weDA3LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInhub3IiLAlGMygyLCAweDA3LCAxKSwgRjMofjIsIH4weDA3LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAieG5vciIsCUYzKDIsIDB4MDcsIDEpLCBGMyh+MiwgfjB4MDcsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0vKiBUaGlzICppcyogYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJ4bm9yY2MiLAlGMygyLCAweDE3LCAwKSwgRjMofjIsIH4weDE3LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInhub3JjYyIsCUYzKDIsIDB4MTcsIDEpLCBGMyh+MiwgfjB4MTcsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ4bm9yY2MiLAlGMygyLCAweDE3LCAxKSwgRjMofjIsIH4weDE3LCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoteyAieG9yIiwJRjMoMiwgMHgwMywgMCksIEYzKH4yLCB+MHgwMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ4b3IiLAlGMygyLCAweDAzLCAxKSwgRjMofjIsIH4weDAzLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAieG9yIiwJRjMoMiwgMHgwMywgMSksIEYzKH4yLCB+MHgwMywgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLXsgInhvcmNjIiwJRjMoMiwgMHgxMywgMCksIEYzKH4yLCB+MHgxMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ4b3JjYyIsCUYzKDIsIDB4MTMsIDEpLCBGMyh+MiwgfjB4MTMsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ4b3JjYyIsCUYzKDIsIDB4MTMsIDEpLCBGMyh+MiwgfjB4MTMsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgIm5vdCIsCUYzKDIsIDB4MDcsIDApLCBGMyh+MiwgfjB4MDcsIH4wKXxBU0kofjApLCAiMSxkIiwgRl9BTElBUywgdjYgfSwgLyogeG5vciByczEsJTAscmQgKi8KLXsgIm5vdCIsCUYzKDIsIDB4MDcsIDApLCBGMyh+MiwgfjB4MDcsIH4wKXxBU0kofjApLCAiciIsIEZfQUxJQVMsIHY2IH0sIC8qIHhub3IgcmQsJTAscmQgKi8KLQoteyAiYnRvZyIsCUYzKDIsIDB4MDMsIDApLCBGMyh+MiwgfjB4MDMsIH4wKXxBU0kofjApLAkiMixyIiwgRl9BTElBUywgdjYgfSwgLyogeG9yIHJkLHJzMixyZCAqLwoteyAiYnRvZyIsCUYzKDIsIDB4MDMsIDEpLCBGMyh+MiwgfjB4MDMsIH4xKSwJCSJpLHIiLCBGX0FMSUFTLCB2NiB9LCAvKiB4b3IgcmQsaSxyZCAqLwotCi0vKiBGUG9wMSBhbmQgRlBvcDIgYXJlIG5vdCBpbnN0cnVjdGlvbnMuICBEb24ndCBhY2NlcHQgdGhlbS4gICovCi0KLXsgImZkdG9pIiwJRjNGKDIsIDB4MzQsIDB4MGQyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGQyKXxSUzFfRzAsICJCLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZnN0b2kiLAlGM0YoMiwgMHgzNCwgMHgwZDEpLCBGM0YofjIsIH4weDM0LCB+MHgwZDEpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmcXRvaSIsCUYzRigyLCAweDM0LCAweDBkMyksIEYzRih+MiwgfjB4MzQsIH4weDBkMyl8UlMxX0cwLCAiUixnIiwgRl9GTE9BVCwgdjggfSwKLQoteyAiZmR0b3giLAlGM0YoMiwgMHgzNCwgMHgwODIpLCBGM0YofjIsIH4weDM0LCB+MHgwODIpfFJTMV9HMCwgIkIsZyIsIEZfRkxPQVQsIHY5IH0sCi17ICJmc3RveCIsCUYzRigyLCAweDM0LCAweDA4MSksIEYzRih+MiwgfjB4MzQsIH4weDA4MSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZxdG94IiwJRjNGKDIsIDB4MzQsIDB4MDgzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDgzKXxSUzFfRzAsICJSLGciLCBGX0ZMT0FULCB2OSB9LAotCi17ICJmaXRvZCIsCUYzRigyLCAweDM0LCAweDBjOCksIEYzRih+MiwgfjB4MzQsIH4weDBjOCl8UlMxX0cwLCAiZixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZpdG9zIiwJRjNGKDIsIDB4MzQsIDB4MGM0KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM0KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZml0b3EiLAlGM0YoMiwgMHgzNCwgMHgwY2MpLCBGM0YofjIsIH4weDM0LCB+MHgwY2MpfFJTMV9HMCwgImYsSiIsIEZfRkxPQVQsIHY4IH0sCi0KLXsgImZ4dG9kIiwJRjNGKDIsIDB4MzQsIDB4MDg4KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDg4KXxSUzFfRzAsICJmLEgiLCBGX0ZMT0FULCB2OSB9LAoteyAiZnh0b3MiLAlGM0YoMiwgMHgzNCwgMHgwODQpLCBGM0YofjIsIH4weDM0LCB+MHgwODQpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY5IH0sCi17ICJmeHRvcSIsCUYzRigyLCAweDM0LCAweDA4YyksIEYzRih+MiwgfjB4MzQsIH4weDA4Yyl8UlMxX0cwLCAiZixKIiwgRl9GTE9BVCwgdjkgfSwKLQoteyAiZmR0b3EiLAlGM0YoMiwgMHgzNCwgMHgwY2UpLCBGM0YofjIsIH4weDM0LCB+MHgwY2UpfFJTMV9HMCwgIkIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmZHRvcyIsCUYzRigyLCAweDM0LCAweDBjNiksIEYzRih+MiwgfjB4MzQsIH4weDBjNil8UlMxX0cwLCAiQixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZxdG9kIiwJRjNGKDIsIDB4MzQsIDB4MGNiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNiKXxSUzFfRzAsICJSLEgiLCBGX0ZMT0FULCB2OCB9LAoteyAiZnF0b3MiLAlGM0YoMiwgMHgzNCwgMHgwYzcpLCBGM0YofjIsIH4weDM0LCB+MHgwYzcpfFJTMV9HMCwgIlIsZyIsIEZfRkxPQVQsIHY4IH0sCi17ICJmc3RvZCIsCUYzRigyLCAweDM0LCAweDBjOSksIEYzRih+MiwgfjB4MzQsIH4weDBjOSl8UlMxX0cwLCAiZixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZzdG9xIiwJRjNGKDIsIDB4MzQsIDB4MGNkKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNkKXxSUzFfRzAsICJmLEoiLCBGX0ZMT0FULCB2OCB9LAotCi17ICJmZGl2ZCIsCUYzRigyLCAweDM0LCAweDA0ZSksIEYzRih+MiwgfjB4MzQsIH4weDA0ZSksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmZGl2cSIsCUYzRigyLCAweDM0LCAweDA0ZiksIEYzRih+MiwgfjB4MzQsIH4weDA0ZiksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmZGl2eCIsCUYzRigyLCAweDM0LCAweDA0ZiksIEYzRih+MiwgfjB4MzQsIH4weDA0ZiksICJWLFIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZkaXZzIiwJRjNGKDIsIDB4MzQsIDB4MDRkKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRkKSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZtdWxkIiwJRjNGKDIsIDB4MzQsIDB4MDRhKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRhKSwgInYsQixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZtdWxxIiwJRjNGKDIsIDB4MzQsIDB4MDRiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRiKSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZtdWx4IiwJRjNGKDIsIDB4MzQsIDB4MDRiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRiKSwgIlYsUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZm11bHMiLAlGM0YoMiwgMHgzNCwgMHgwNDkpLCBGM0YofjIsIH4weDM0LCB+MHgwNDkpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAotCi17ICJmZG11bHEiLAlGM0YoMiwgMHgzNCwgMHgwNmUpLCBGM0YofjIsIH4weDM0LCB+MHgwNmUpLCAidixCLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmRtdWx4IiwJRjNGKDIsIDB4MzQsIDB4MDZlKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDZlKSwgInYsQixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZnNtdWxkIiwJRjNGKDIsIDB4MzQsIDB4MDY5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDY5KSwgImUsZixIIiwgRl9GTE9BVCwgdjggfSwKLQoteyAiZnNxcnRkIiwJRjNGKDIsIDB4MzQsIDB4MDJhKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDJhKXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2NyB9LAoteyAiZnNxcnRxIiwJRjNGKDIsIDB4MzQsIDB4MDJiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDJiKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZnNxcnR4IiwJRjNGKDIsIDB4MzQsIDB4MDJiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDJiKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmc3FydHMiLAlGM0YoMiwgMHgzNCwgMHgwMjkpLCBGM0YofjIsIH4weDM0LCB+MHgwMjkpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY3IH0sCi0KLXsgImZhYnNkIiwJRjNGKDIsIDB4MzQsIDB4MDBhKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDBhKXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmFic3EiLAlGM0YoMiwgMHgzNCwgMHgwMGIpLCBGM0YofjIsIH4weDM0LCB+MHgwMGIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmYWJzeCIsCUYzRigyLCAweDM0LCAweDAwYiksIEYzRih+MiwgfjB4MzQsIH4weDAwYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmFic3MiLAlGM0YoMiwgMHgzNCwgMHgwMDkpLCBGM0YofjIsIH4weDM0LCB+MHgwMDkpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmbW92ZCIsCUYzRigyLCAweDM0LCAweDAwMiksIEYzRih+MiwgfjB4MzQsIH4weDAwMil8UlMxX0cwLCAiQixIIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZtb3ZxIiwJRjNGKDIsIDB4MzQsIDB4MDAzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAzKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FULCB2OSB9LAoteyAiZm1vdngiLAlGM0YoMiwgMHgzNCwgMHgwMDMpLCBGM0YofjIsIH4weDM0LCB+MHgwMDMpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZtb3ZzIiwJRjNGKDIsIDB4MzQsIDB4MDAxKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAxKXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZm5lZ2QiLAlGM0YoMiwgMHgzNCwgMHgwMDYpLCBGM0YofjIsIH4weDM0LCB+MHgwMDYpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbmVncSIsCUYzRigyLCAweDM0LCAweDAwNyksIEYzRih+MiwgfjB4MzQsIH4weDAwNyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZuZWd4IiwJRjNGKDIsIDB4MzQsIDB4MDA3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA3KXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmbmVncyIsCUYzRigyLCAweDM0LCAweDAwNSksIEYzRih+MiwgfjB4MzQsIH4weDAwNSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLQoteyAiZmFkZGQiLAlGM0YoMiwgMHgzNCwgMHgwNDIpLCBGM0YofjIsIH4weDM0LCB+MHgwNDIpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZmFkZHEiLAlGM0YoMiwgMHgzNCwgMHgwNDMpLCBGM0YofjIsIH4weDM0LCB+MHgwNDMpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmFkZHgiLAlGM0YoMiwgMHgzNCwgMHgwNDMpLCBGM0YofjIsIH4weDM0LCB+MHgwNDMpLCAiVixSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmYWRkcyIsCUYzRigyLCAweDM0LCAweDA0MSksIEYzRih+MiwgfjB4MzQsIH4weDA0MSksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3ViZCIsCUYzRigyLCAweDM0LCAweDA0NiksIEYzRih+MiwgfjB4MzQsIH4weDA0NiksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3VicSIsCUYzRigyLCAweDM0LCAweDA0NyksIEYzRih+MiwgfjB4MzQsIH4weDA0NyksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmc3VieCIsCUYzRigyLCAweDM0LCAweDA0NyksIEYzRih+MiwgfjB4MzQsIH4weDA0NyksICJWLFIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZzdWJzIiwJRjNGKDIsIDB4MzQsIDB4MDQ1KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ1KSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLQotI2RlZmluZSBDTVBGQ0MoeCkJKCgoeCkmMHgzKTw8MjUpCi0KLXsgImZjbXBkIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1MiksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDUyKXxSRF9HMCwgICJ2LEIiLCAgIEZfRkxPQVQsIHY2IH0sCi17ICJmY21wZCIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiNix2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjcsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBkIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI4LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZCIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiOSx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVkIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NiksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU2KXxSRF9HMCwgICJ2LEIiLCAgIEZfRkxPQVQsIHY2IH0sCi17ICJmY21wZWQiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjYsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiNyx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI4LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZWQiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjksdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBxIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1MyksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDUzKXxSRF9HMCwJICJWLFIiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmNtcHEiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjYsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBxIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI3LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiOCxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHEiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjksVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcSIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTcpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Nyl8UkRfRzAsCSAiVixSIiwgRl9GTE9BVCwgdjggfSwKLXsgImZjbXBlcSIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiNixWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVxIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI3LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjgsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcSIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiOSxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHgiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUzKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTMpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZjbXB4IiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI2LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXB4IiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI3LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXB4IiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI4LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXB4IiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI5LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBleCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTcpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Nyl8UkRfRzAsCSAiVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZmNtcGV4IiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI2LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBleCIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiNyxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wZXgiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjgsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcGV4IiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI5LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBzIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1MSksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDUxKXxSRF9HMCwgImUsZiIsICAgRl9GTE9BVCwgdjYgfSwKLXsgImZjbXBzIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MSksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUxKSwJICI2LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcyIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiNyxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHMiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUxKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTEpLAkgIjgsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBzIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MSksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUxKSwJICI5LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXMiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU1KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTUpfFJEX0cwLCAiZSxmIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcGVzIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NSksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU1KSwJICI2LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXMiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU1KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTUpLAkgIjcsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcyIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiOCxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVzIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NSksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU1KSwJICI5LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi0KLS8qIFRoZXNlIEV4dGVuZGVkIEZQb3AgKEZJRk8pIGluc3RydWN0aW9ucyBhcmUgbmV3IGluIHRoZSBGdWppdHN1Ci0gICBNQjg2OTM0LCByZXBsYWNpbmcgdGhlIENQb3AgaW5zdHJ1Y3Rpb25zIGZyb20gdjYgYW5kIGxhdGVyCi0gICBwcm9jZXNzb3JzLiAgKi8KLQotI2RlZmluZSBFRlBPUDFfMihuYW1lLCBvcCwgYXJncykgeyBuYW1lLCBGM0YoMiwgMHgzNiwgb3ApLCBGM0YofjIsIH4weDM2LCB+b3ApfFJTMV9HMCwgYXJncywgMCwgc3BhcmNsaXRlIH0KLSNkZWZpbmUgRUZQT1AxXzMobmFtZSwgb3AsIGFyZ3MpIHsgbmFtZSwgRjNGKDIsIDB4MzYsIG9wKSwgRjNGKH4yLCB+MHgzNiwgfm9wKSwgICAgICAgIGFyZ3MsIDAsIHNwYXJjbGl0ZSB9Ci0jZGVmaW5lIEVGUE9QMl8yKG5hbWUsIG9wLCBhcmdzKSB7IG5hbWUsIEYzRigyLCAweDM3LCBvcCksIEYzRih+MiwgfjB4MzcsIH5vcCl8UkRfRzAsICBhcmdzLCAwLCBzcGFyY2xpdGUgfQotCi1FRlBPUDFfMiAoImVmaXRvZCIsCTB4MGM4LCAiZixIIiksCi1FRlBPUDFfMiAoImVmaXRvcyIsCTB4MGM0LCAiZixnIiksCi1FRlBPUDFfMiAoImVmZHRvaSIsCTB4MGQyLCAiQixnIiksCi1FRlBPUDFfMiAoImVmc3RvaSIsCTB4MGQxLCAiZixnIiksCi1FRlBPUDFfMiAoImVmc3RvZCIsCTB4MGM5LCAiZixIIiksCi1FRlBPUDFfMiAoImVmZHRvcyIsCTB4MGM2LCAiQixnIiksCi1FRlBPUDFfMiAoImVmbW92cyIsCTB4MDAxLCAiZixnIiksCi1FRlBPUDFfMiAoImVmbmVncyIsCTB4MDA1LCAiZixnIiksCi1FRlBPUDFfMiAoImVmYWJzcyIsCTB4MDA5LCAiZixnIiksCi1FRlBPUDFfMiAoImVmc3FydGQiLAkweDAyYSwgIkIsSCIpLAotRUZQT1AxXzIgKCJlZnNxcnRzIiwJMHgwMjksICJmLGciKSwKLUVGUE9QMV8zICgiZWZhZGRkIiwJMHgwNDIsICJ2LEIsSCIpLAotRUZQT1AxXzMgKCJlZmFkZHMiLAkweDA0MSwgImUsZixnIiksCi1FRlBPUDFfMyAoImVmc3ViZCIsCTB4MDQ2LCAidixCLEgiKSwKLUVGUE9QMV8zICgiZWZzdWJzIiwJMHgwNDUsICJlLGYsZyIpLAotRUZQT1AxXzMgKCJlZmRpdmQiLAkweDA0ZSwgInYsQixIIiksCi1FRlBPUDFfMyAoImVmZGl2cyIsCTB4MDRkLCAiZSxmLGciKSwKLUVGUE9QMV8zICgiZWZtdWxkIiwJMHgwNGEsICJ2LEIsSCIpLAotRUZQT1AxXzMgKCJlZm11bHMiLAkweDA0OSwgImUsZixnIiksCi1FRlBPUDFfMyAoImVmc211bGQiLAkweDA2OSwgImUsZixIIiksCi1FRlBPUDJfMiAoImVmY21wZCIsCTB4MDUyLCAidixCIiksCi1FRlBPUDJfMiAoImVmY21wZWQiLAkweDA1NiwgInYsQiIpLAotRUZQT1AyXzIgKCJlZmNtcHMiLAkweDA1MSwgImUsZiIpLAotRUZQT1AyXzIgKCJlZmNtcGVzIiwJMHgwNTUsICJlLGYiKSwKLQotI3VuZGVmIEVGUE9QMV8yCi0jdW5kZWYgRUZQT1AxXzMKLSN1bmRlZiBFRlBPUDJfMgotCi0vKiBUaGVzZSBhcmUgbWFya2VkIEZfQUxJQVMsIHNvIHRoYXQgdGhleSB3b24ndCBjb25mbGljdCB3aXRoIHNwYXJjbGl0ZSBpbnNucwotICAgcHJlc2VudC4gIE90aGVyd2lzZSwgdGhlIEZfQUxJQVMgZmxhZyBpcyBpZ25vcmVkLiAgKi8KLXsgImNwb3AxIiwJRjMoMiwgMHgzNiwgMCksIEYzKH4yLCB+MHgzNiwgfjEpLCAiWzErMl0sZCIsIEZfQUxJQVMsIHY2bm90djkgfSwKLXsgImNwb3AyIiwJRjMoMiwgMHgzNywgMCksIEYzKH4yLCB+MHgzNywgfjEpLCAiWzErMl0sZCIsIEZfQUxJQVMsIHY2bm90djkgfSwKLQotLyogc3BhcmNsZXQgc3BlY2lmaWMgaW5zbnMgKi8KLQotQ09NTVVURU9QICgidW1hYyIsIDB4M2UsIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInNtYWMiLCAweDNmLCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJ1bWFjZCIsIDB4MmUsIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInNtYWNkIiwgMHgyZiwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgidW11bGQiLCAweDA5LCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJzbXVsZCIsIDB4MGQsIHNwYXJjbGV0KSwKLQoteyAic2h1ZmZsZSIsCUYzKDIsIDB4MmQsIDApLCBGMyh+MiwgfjB4MmQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCBzcGFyY2xldCB9LAoteyAic2h1ZmZsZSIsCUYzKDIsIDB4MmQsIDEpLCBGMyh+MiwgfjB4MmQsIH4xKSwJCSIxLGksZCIsIDAsIHNwYXJjbGV0IH0sCi0KLS8qIFRoZSBtYW51YWwgaXNuJ3QgY29tcGxldGVseSBhY2N1cmF0ZSBvbiB0aGVzZSBpbnNucy4gIFRoZSBgcnMyJyBmaWVsZCBpcwotICAgdHJlYXRlZCBhcyBiZWluZyA2IGJpdHMgdG8gYWNjb3VudCBmb3IgNiBiaXQgaW1tZWRpYXRlcyB0byBjcHVzaC4gIEl0IGlzCi0gICBhc3N1bWVkIHRoYXQgaXQgaXMgaW50ZW5kZWQgdGhhdCBiaXQgNSBpcyAwIHdoZW4gcnMyIGNvbnRhaW5zIGEgcmVnLiAgKi8KLSNkZWZpbmUgQklUNSAoMTw8NSkKLXsgImNyZGN4dCIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCg0KSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH40KXxCSVQ1fFJTMih+MCksCSJVLGQiLCAwLCBzcGFyY2xldCB9LAoteyAiY3dyY3h0IiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDMpLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjMpfEJJVDV8UlMyKH4wKSwJIjEsdSIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVzaCIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCgwKSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH4wKXxCSVQ1fFJEKH4wKSwJIjEsMiIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVzaCIsCUYzKDIsIDB4MzYsIDEpfFNMQ1BPUCgwKSwgRjMofjIsIH4weDM2LCB+MSl8U0xDUE9QKH4wKXxSRCh+MCksCQkiMSxZIiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdXNoYSIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCgxKSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH4xKXxCSVQ1fFJEKH4wKSwJIjEsMiIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVzaGEiLAlGMygyLCAweDM2LCAxKXxTTENQT1AoMSksIEYzKH4yLCB+MHgzNiwgfjEpfFNMQ1BPUCh+MSl8UkQofjApLAkJIjEsWSIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVsbCIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCgyKSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH4yKXxCSVQ1fFJTMSh+MCl8UlMyKH4wKSwgImQiLCAwLCBzcGFyY2xldCB9LAotI3VuZGVmIEJJVDUKLQotLyogc3BhcmNsZXQgY29wcm9jZXNzb3IgYnJhbmNoIGluc25zICovCi0jZGVmaW5lIFNMQ0JDQzIob3Bjb2RlLCBtYXNrLCBsb3NlKSBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8KGxvc2UpLCAibCIsICAgIEZfREVMQVlFRHxGX0NPTkRCUiwgc3BhcmNsZXQgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIChsb3NlKSwgIixhIGwiLCBGX0RFTEFZRUR8Rl9DT05EQlIsIHNwYXJjbGV0IH0KLSNkZWZpbmUgU0xDQkNDKG9wY29kZSwgbWFzaykgXAotICBTTENCQ0MyKG9wY29kZSwgRjIoMCwgNyl8Q09ORChtYXNrKSwgRjIofjAsIH43KXxDT05EKH4obWFzaykpKQotCi0vKiBjYm4sY2JhIGNhbid0IGJlIGRlZmluZWQgaGVyZSBiZWNhdXNlIHRoZXkncmUgZGVmaW5lZCBlbHNld2hlcmUgYW5kIEdBUwotICAgcmVxdWlyZXMgYWxsIG1uZW1vbmljcyBvZiB0aGUgc2FtZSBuYW1lIHRvIGJlIGNvbnNlY3V0aXZlLiAgKi8KLS8qU0xDQkNDKCJjYm4iLCAwKSwgLSBhbHJlYWR5IGRlZmluZWQgKi8KLVNMQ0JDQygiY2JlIiwgMSksCi1TTENCQ0MoImNiZiIsIDIpLAotU0xDQkNDKCJjYmVmIiwgMyksCi1TTENCQ0MoImNiciIsIDQpLAotU0xDQkNDKCJjYmVyIiwgNSksCi1TTENCQ0MoImNiZnIiLCA2KSwKLVNMQ0JDQygiY2JlZnIiLCA3KSwKLS8qU0xDQkNDKCJjYmEiLCA4KSwgLSBhbHJlYWR5IGRlZmluZWQgKi8KLVNMQ0JDQygiY2JuZSIsIDkpLAotU0xDQkNDKCJjYm5mIiwgMTApLAotU0xDQkNDKCJjYm5lZiIsIDExKSwKLVNMQ0JDQygiY2JuciIsIDEyKSwKLVNMQ0JDQygiY2JuZXIiLCAxMyksCi1TTENCQ0MoImNibmZyIiwgMTQpLAotU0xDQkNDKCJjYm5lZnIiLCAxNSksCi0KLSN1bmRlZiBTTENCQ0MyCi0jdW5kZWYgU0xDQkNDCi0KLXsgImNhc2EiLAlGMygzLCAweDNjLCAwKSwgRjMofjMsIH4weDNjLCB+MCksICJbMV1BLDIsZCIsIDAsIHY5IH0sCi17ICJjYXNhIiwJRjMoMywgMHgzYywgMSksIEYzKH4zLCB+MHgzYywgfjEpLCAiWzFdbywyLGQiLCAwLCB2OSB9LAoteyAiY2FzeGEiLAlGMygzLCAweDNlLCAwKSwgRjMofjMsIH4weDNlLCB+MCksICJbMV1BLDIsZCIsIDAsIHY5IH0sCi17ICJjYXN4YSIsCUYzKDMsIDB4M2UsIDEpLCBGMyh+MywgfjB4M2UsIH4xKSwgIlsxXW8sMixkIiwgMCwgdjkgfSwKLQotLyogdjkgc3ludGhldGljIGluc25zICovCi17ICJpcHJlZmV0Y2giLAlGMigwLCAxKXwoMjw8MjApfEJQUkVELCBGMih+MCwgfjEpfCgxPDwyMCl8QU5OVUx8Q09ORCh+MCksICJHIiwgMCwgdjkgfSwgLyogYm4sYSxwdCAleGNjLGxhYmVsICovCi17ICJzaWdueCIsCUYzKDIsIDB4MjcsIDApLCBGMyh+MiwgfjB4MjcsIH4wKXwoMTw8MTIpfEFTSSh+MCl8UlMyX0cwLCAiMSxkIiwgRl9BTElBUywgdjkgfSwgLyogc3JhIHJzMSwlZzAscmQgKi8KLXsgInNpZ254IiwJRjMoMiwgMHgyNywgMCksIEYzKH4yLCB+MHgyNywgfjApfCgxPDwxMil8QVNJKH4wKXxSUzJfRzAsICJyIiwgRl9BTElBUywgdjkgfSwgLyogc3JhIHJkLCVnMCxyZCAqLwoteyAiY2xydXciLAlGMygyLCAweDI2LCAwKSwgRjMofjIsIH4weDI2LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgIjEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIHNybCByczEsJWcwLHJkICovCi17ICJjbHJ1dyIsCUYzKDIsIDB4MjYsIDApLCBGMyh+MiwgfjB4MjYsIH4wKXwoMTw8MTIpfEFTSSh+MCl8UlMyX0cwLCAiciIsIEZfQUxJQVMsIHY5IH0sIC8qIHNybCByZCwlZzAscmQgKi8KLXsgImNhcyIsCUYzKDMsIDB4M2MsIDApfEFTSSgweDgwKSwgRjMofjMsIH4weDNjLCB+MCl8QVNJKH4weDgwKSwgIlsxXSwyLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBjYXNhIFtyczFdQVNJX1AscnMyLHJkICovCi17ICJjYXNsIiwJRjMoMywgMHgzYywgMCl8QVNJKDB4ODgpLCBGMyh+MywgfjB4M2MsIH4wKXxBU0kofjB4ODgpLCAiWzFdLDIsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGNhc2EgW3JzMV1BU0lfUF9MLHJzMixyZCAqLwoteyAiY2FzeCIsCUYzKDMsIDB4M2UsIDApfEFTSSgweDgwKSwgRjMofjMsIH4weDNlLCB+MCl8QVNJKH4weDgwKSwgIlsxXSwyLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBjYXN4YSBbcnMxXUFTSV9QLHJzMixyZCAqLwoteyAiY2FzeGwiLAlGMygzLCAweDNlLCAwKXxBU0koMHg4OCksIEYzKH4zLCB+MHgzZSwgfjApfEFTSSh+MHg4OCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzeGEgW3JzMV1BU0lfUF9MLHJzMixyZCAqLwotCi0vKiBVbHRyYXNwYXJjIGV4dGVuc2lvbnMgKi8KLXsgInNodXRkb3duIiwJRjNGKDIsIDB4MzYsIDB4MDgwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDgwKXxSRF9HMHxSUzFfRzB8UlMyX0cwLCAiIiwgMCwgdjlhIH0sCi0KLS8qIEZJWE1FOiBEbyB3ZSB3YW50IHRvIG1hcmsgdGhlc2UgYXMgRl9GTE9BVCwgb3Igc29tZXRoaW5nIHNpbWlsYXI/ICAqLwoteyAiZnBhZGQxNiIsCUYzRigyLCAweDM2LCAweDA1MCksIEYzRih+MiwgfjB4MzYsIH4weDA1MCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBhZGQxNnMiLAlGM0YoMiwgMHgzNiwgMHgwNTEpLCBGM0YofjIsIH4weDM2LCB+MHgwNTEpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZwYWRkMzIiLAlGM0YoMiwgMHgzNiwgMHgwNTIpLCBGM0YofjIsIH4weDM2LCB+MHgwNTIpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwYWRkMzJzIiwJRjNGKDIsIDB4MzYsIDB4MDUzKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUzKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmcHN1YjE2IiwJRjNGKDIsIDB4MzYsIDB4MDU0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDU0KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcHN1YjE2cyIsCUYzRigyLCAweDM2LCAweDA1NSksIEYzRih+MiwgfjB4MzYsIH4weDA1NSksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnBzdWIzMiIsCUYzRigyLCAweDM2LCAweDA1NiksIEYzRih+MiwgfjB4MzYsIH4weDA1NiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBzdWIzMnMiLAlGM0YoMiwgMHgzNiwgMHgwNTcpLCBGM0YofjIsIH4weDM2LCB+MHgwNTcpLCAiZSxmLGciLCAwLCB2OWEgfSwKLQoteyAiZnBhY2szMiIsCUYzRigyLCAweDM2LCAweDAzYSksIEYzRih+MiwgfjB4MzYsIH4weDAzYSksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBhY2sxNiIsCUYzRigyLCAweDM2LCAweDAzYiksIEYzRih+MiwgfjB4MzYsIH4weDAzYil8UlMxX0cwLCAiQixnIiwgMCwgdjlhIH0sCi17ICJmcGFja2ZpeCIsCUYzRigyLCAweDM2LCAweDAzZCksIEYzRih+MiwgfjB4MzYsIH4weDAzZCl8UlMxX0cwLCAiQixnIiwgMCwgdjlhIH0sCi17ICJmZXhwYW5kIiwJRjNGKDIsIDB4MzYsIDB4MDRkKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDRkKXxSUzFfRzAsICJmLEgiLCAwLCB2OWEgfSwKLXsgImZwbWVyZ2UiLAlGM0YoMiwgMHgzNiwgMHgwNGIpLCBGM0YofjIsIH4weDM2LCB+MHgwNGIpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLQotLyogTm90ZSB0aGF0IHRoZSBtaXhpbmcgb2YgMzIvNjQgYml0IHJlZ3MgaXMgaW50ZW50aW9uYWwuICAqLwoteyAiZm11bDh4MTYiLAkJRjNGKDIsIDB4MzYsIDB4MDMxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDMxKSwgImUsQixIIiwgMCwgdjlhIH0sCi17ICJmbXVsOHgxNmF1IiwJCUYzRigyLCAweDM2LCAweDAzMyksIEYzRih+MiwgfjB4MzYsIH4weDAzMyksICJlLGYsSCIsIDAsIHY5YSB9LAoteyAiZm11bDh4MTZhbCIsCQlGM0YoMiwgMHgzNiwgMHgwMzUpLCBGM0YofjIsIH4weDM2LCB+MHgwMzUpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLXsgImZtdWw4c3V4MTYiLAkJRjNGKDIsIDB4MzYsIDB4MDM2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM2KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmbXVsOHVseDE2IiwJCUYzRigyLCAweDM2LCAweDAzNyksIEYzRih+MiwgfjB4MzYsIH4weDAzNyksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm11bGQ4c3V4MTYiLAlGM0YoMiwgMHgzNiwgMHgwMzgpLCBGM0YofjIsIH4weDM2LCB+MHgwMzgpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLXsgImZtdWxkOHVseDE2IiwJRjNGKDIsIDB4MzYsIDB4MDM5KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM5KSwgImUsZixIIiwgMCwgdjlhIH0sCi0KLXsgImFsaWduYWRkciIsCUYzRigyLCAweDM2LCAweDAxOCksIEYzRih+MiwgfjB4MzYsIH4weDAxOCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiYWxpZ25hZGRybCIsCUYzRigyLCAweDM2LCAweDAxYSksIEYzRih+MiwgfjB4MzYsIH4weDAxYSksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZmFsaWduZGF0YSIsCUYzRigyLCAweDM2LCAweDA0OCksIEYzRih+MiwgfjB4MzYsIH4weDA0OCksICJ2LEIsSCIsIDAsIHY5YSB9LAotCi17ICJmemVybyIsCUYzRigyLCAweDM2LCAweDA2MCksIEYzRih+MiwgfjB4MzYsIH4weDA2MCksICJIIiwgMCwgdjlhIH0sCi17ICJmemVyb3MiLAlGM0YoMiwgMHgzNiwgMHgwNjEpLCBGM0YofjIsIH4weDM2LCB+MHgwNjEpLCAiZyIsIDAsIHY5YSB9LAoteyAiZm9uZSIsCUYzRigyLCAweDM2LCAweDA3ZSksIEYzRih+MiwgfjB4MzYsIH4weDA3ZSksICJIIiwgMCwgdjlhIH0sCi17ICJmb25lcyIsCUYzRigyLCAweDM2LCAweDA3ZiksIEYzRih+MiwgfjB4MzYsIH4weDA3ZiksICJnIiwgMCwgdjlhIH0sCi17ICJmc3JjMSIsCUYzRigyLCAweDM2LCAweDA3NCksIEYzRih+MiwgfjB4MzYsIH4weDA3NCksICJ2LEgiLCAwLCB2OWEgfSwKLXsgImZzcmMxcyIsCUYzRigyLCAweDM2LCAweDA3NSksIEYzRih+MiwgfjB4MzYsIH4weDA3NSksICJlLGciLCAwLCB2OWEgfSwKLXsgImZzcmMyIiwJRjNGKDIsIDB4MzYsIDB4MDc4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc4KSwgIkIsSCIsIDAsIHY5YSB9LAoteyAiZnNyYzJzIiwJRjNGKDIsIDB4MzYsIDB4MDc5KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc5KSwgImYsZyIsIDAsIHY5YSB9LAoteyAiZm5vdDEiLAlGM0YoMiwgMHgzNiwgMHgwNmEpLCBGM0YofjIsIH4weDM2LCB+MHgwNmEpLCAidixIIiwgMCwgdjlhIH0sCi17ICJmbm90MXMiLAlGM0YoMiwgMHgzNiwgMHgwNmIpLCBGM0YofjIsIH4weDM2LCB+MHgwNmIpLCAiZSxnIiwgMCwgdjlhIH0sCi17ICJmbm90MiIsCUYzRigyLCAweDM2LCAweDA2NiksIEYzRih+MiwgfjB4MzYsIH4weDA2NiksICJCLEgiLCAwLCB2OWEgfSwKLXsgImZub3QycyIsCUYzRigyLCAweDM2LCAweDA2NyksIEYzRih+MiwgfjB4MzYsIH4weDA2NyksICJmLGciLCAwLCB2OWEgfSwKLXsgImZvciIsCUYzRigyLCAweDM2LCAweDA3YyksIEYzRih+MiwgfjB4MzYsIH4weDA3YyksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm9ycyIsCUYzRigyLCAweDM2LCAweDA3ZCksIEYzRih+MiwgfjB4MzYsIH4weDA3ZCksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZm5vciIsCUYzRigyLCAweDM2LCAweDA2MiksIEYzRih+MiwgfjB4MzYsIH4weDA2MiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm5vcnMiLAlGM0YoMiwgMHgzNiwgMHgwNjMpLCBGM0YofjIsIH4weDM2LCB+MHgwNjMpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZhbmQiLAlGM0YoMiwgMHgzNiwgMHgwNzApLCBGM0YofjIsIH4weDM2LCB+MHgwNzApLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZhbmRzIiwJRjNGKDIsIDB4MzYsIDB4MDcxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDcxKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmbmFuZCIsCUYzRigyLCAweDM2LCAweDA2ZSksIEYzRih+MiwgfjB4MzYsIH4weDA2ZSksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm5hbmRzIiwJRjNGKDIsIDB4MzYsIDB4MDZmKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZmKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmeG9yIiwJRjNGKDIsIDB4MzYsIDB4MDZjKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZjKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmeG9ycyIsCUYzRigyLCAweDM2LCAweDA2ZCksIEYzRih+MiwgfjB4MzYsIH4weDA2ZCksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnhub3IiLAlGM0YoMiwgMHgzNiwgMHgwNzIpLCBGM0YofjIsIH4weDM2LCB+MHgwNzIpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZ4bm9ycyIsCUYzRigyLCAweDM2LCAweDA3MyksIEYzRih+MiwgfjB4MzYsIH4weDA3MyksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZm9ybm90MSIsCUYzRigyLCAweDM2LCAweDA3YSksIEYzRih+MiwgfjB4MzYsIH4weDA3YSksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm9ybm90MXMiLAlGM0YoMiwgMHgzNiwgMHgwN2IpLCBGM0YofjIsIH4weDM2LCB+MHgwN2IpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZvcm5vdDIiLAlGM0YoMiwgMHgzNiwgMHgwNzYpLCBGM0YofjIsIH4weDM2LCB+MHgwNzYpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZvcm5vdDJzIiwJRjNGKDIsIDB4MzYsIDB4MDc3KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc3KSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmYW5kbm90MSIsCUYzRigyLCAweDM2LCAweDA2OCksIEYzRih+MiwgfjB4MzYsIH4weDA2OCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZmFuZG5vdDFzIiwJRjNGKDIsIDB4MzYsIDB4MDY5KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY5KSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmYW5kbm90MiIsCUYzRigyLCAweDM2LCAweDA2NCksIEYzRih+MiwgfjB4MzYsIH4weDA2NCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZmFuZG5vdDJzIiwJRjNGKDIsIDB4MzYsIDB4MDY1KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY1KSwgImUsZixnIiwgMCwgdjlhIH0sCi0KLXsgImZjbXBndDE2IiwJRjNGKDIsIDB4MzYsIDB4MDI4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDI4KSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wZ3QzMiIsCUYzRigyLCAweDM2LCAweDAyYyksIEYzRih+MiwgfjB4MzYsIH4weDAyYyksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGxlMTYiLAlGM0YoMiwgMHgzNiwgMHgwMjApLCBGM0YofjIsIH4weDM2LCB+MHgwMjApLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBsZTMyIiwJRjNGKDIsIDB4MzYsIDB4MDI0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDI0KSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wbmUxNiIsCUYzRigyLCAweDM2LCAweDAyMiksIEYzRih+MiwgfjB4MzYsIH4weDAyMiksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcG5lMzIiLAlGM0YoMiwgMHgzNiwgMHgwMjYpLCBGM0YofjIsIH4weDM2LCB+MHgwMjYpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBlcTE2IiwJRjNGKDIsIDB4MzYsIDB4MDJhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDJhKSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wZXEzMiIsCUYzRigyLCAweDM2LCAweDAyZSksIEYzRih+MiwgfjB4MzYsIH4weDAyZSksICJ2LEIsZCIsIDAsIHY5YSB9LAotCi17ICJlZGdlOCIsCUYzRigyLCAweDM2LCAweDAwMCksIEYzRih+MiwgfjB4MzYsIH4weDAwMCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZThsIiwJRjNGKDIsIDB4MzYsIDB4MDAyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDAyKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlMTYiLAlGM0YoMiwgMHgzNiwgMHgwMDQpLCBGM0YofjIsIH4weDM2LCB+MHgwMDQpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2UxNmwiLAlGM0YoMiwgMHgzNiwgMHgwMDYpLCBGM0YofjIsIH4weDM2LCB+MHgwMDYpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2UzMiIsCUYzRigyLCAweDM2LCAweDAwOCksIEYzRih+MiwgfjB4MzYsIH4weDAwOCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZTMybCIsCUYzRigyLCAweDM2LCAweDAwYSksIEYzRih+MiwgfjB4MzYsIH4weDAwYSksICIxLDIsZCIsIDAsIHY5YSB9LAotCi17ICJwZGlzdCIsCUYzRigyLCAweDM2LCAweDAzZSksIEYzRih+MiwgfjB4MzYsIH4weDAzZSksICJ2LEIsSCIsIDAsIHY5YSB9LAotCi17ICJhcnJheTgiLAlGM0YoMiwgMHgzNiwgMHgwMTApLCBGM0YofjIsIH4weDM2LCB+MHgwMTApLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImFycmF5MTYiLAlGM0YoMiwgMHgzNiwgMHgwMTIpLCBGM0YofjIsIH4weDM2LCB+MHgwMTIpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImFycmF5MzIiLAlGM0YoMiwgMHgzNiwgMHgwMTQpLCBGM0YofjIsIH4weDM2LCB+MHgwMTQpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLQotLyogTW9yZSB2OSBzcGVjaWZpYyBpbnNucywgdGhlc2UgbmVlZCB0byBjb21lIGxhc3Qgc28gdGhleSBkbyBub3QgY2xhc2gKLSAgIHdpdGggdjlhIGluc3RydWN0aW9ucyBzdWNoIGFzICJlZGdlOCIgd2hpY2ggbG9va3MgbGlrZSBpbXBkZXAxLiAqLwotCi0jZGVmaW5lIElNUERFUChuYW1lLCBjb2RlKSBcCi17IG5hbWUsCUYzKDIsIGNvZGUsIDApLCBGMyh+MiwgfmNvZGUsIH4wKXxBU0kofjApLCAiMSwyLGQiLCAwLCB2OW5vdHY5YSB9LCBcCi17IG5hbWUsCUYzKDIsIGNvZGUsIDEpLCBGMyh+MiwgfmNvZGUsIH4xKSwJICAgIjEsaSxkIiwgMCwgdjlub3R2OWEgfSwgXAoteyBuYW1lLCBGMygyLCBjb2RlLCAwKSwgRjMofjIsIH5jb2RlLCB+MCksICAgICAgICAgIngsMSwyLGQiLCAwLCB2OW5vdHY5YSB9LCBcCi17IG5hbWUsIEYzKDIsIGNvZGUsIDApLCBGMyh+MiwgfmNvZGUsIH4wKSwgICAgICAgICAieCxlLGYsZyIsIDAsIHY5bm90djlhIH0KLQotSU1QREVQICgiaW1wZGVwMSIsIDB4MzYpLAotSU1QREVQICgiaW1wZGVwMiIsIDB4MzcpLAotCi0jdW5kZWYgSU1QREVQCi0KLX07Ci0KLWNvbnN0IGludCBzcGFyY19udW1fb3Bjb2RlcyA9ICgoc2l6ZW9mIHNwYXJjX29wY29kZXMpLyhzaXplb2Ygc3BhcmNfb3Bjb2Rlc1swXSkpOwotDAotLyogVXRpbGl0aWVzIGZvciBhcmd1bWVudCBwYXJzaW5nLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IHZhbHVlOwotICBjb25zdCBjaGFyICpuYW1lOwotfSBhcmc7Ci0KLS8qIExvb2sgdXAgTkFNRSBpbiBUQUJMRS4gICovCi0KLXN0YXRpYyBpbnQgbG9va3VwX25hbWUgUEFSQU1TICgoY29uc3QgYXJnICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGNvbnN0IGNoYXIgKmxvb2t1cF92YWx1ZSBQQVJBTVMgKChjb25zdCBhcmcgKiwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWxvb2t1cF9uYW1lICh0YWJsZSwgbmFtZSkKLSAgICAgY29uc3QgYXJnICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgYXJnICpwOwotCi0gIGZvciAocCA9IHRhYmxlOyBwLT5uYW1lOyArK3ApCi0gICAgaWYgKHN0cmNtcCAobmFtZSwgcC0+bmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiBwLT52YWx1ZTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qIExvb2sgdXAgVkFMVUUgaW4gVEFCTEUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1sb29rdXBfdmFsdWUgKHRhYmxlLCB2YWx1ZSkKLSAgICAgY29uc3QgYXJnICp0YWJsZTsKLSAgICAgaW50IHZhbHVlOwotewotICBjb25zdCBhcmcgKnA7Ci0KLSAgZm9yIChwID0gdGFibGU7IHAtPm5hbWU7ICsrcCkKLSAgICBpZiAodmFsdWUgPT0gcC0+dmFsdWUpCi0gICAgICByZXR1cm4gcC0+bmFtZTsKLQotICByZXR1cm4gKGNoYXIgKikgMDsKLX0KLQwKLS8qIEhhbmRsZSBBU0kncy4gICovCi0KLXN0YXRpYyBhcmcgYXNpX3RhYmxlW10gPQotewotICAvKiBUaGVzZSBhcmUgaW4gdGhlIHY5IGFyY2hpdGVjdHVyZSBtYW51YWwuICAqLwotICAvKiBUaGUgc2hvcnRlciB2ZXJzaW9ucyBhcHBlYXIgZmlyc3QsIHRoZXkncmUgaGVyZSBiZWNhdXNlIFN1bidzIGFzIGhhcyB0aGVtLgotICAgICBTdW4ncyBhcyB1c2VzICNBU0lfUF9MIGluc3RlYWQgb2YgI0FTSV9QTCAod2hpY2ggYXBwZWFycyBpbiB0aGUKLSAgICAgVWx0cmFTUEFSQyBhcmNoaXRlY3R1cmUgbWFudWFsKS4gICovCi0gIHsgMHgwNCwgIiNBU0lfTiIgfSwKLSAgeyAweDBjLCAiI0FTSV9OX0wiIH0sCi0gIHsgMHgxMCwgIiNBU0lfQUlVUCIgfSwKLSAgeyAweDExLCAiI0FTSV9BSVVTIiB9LAotICB7IDB4MTgsICIjQVNJX0FJVVBfTCIgfSwKLSAgeyAweDE5LCAiI0FTSV9BSVVTX0wiIH0sCi0gIHsgMHg4MCwgIiNBU0lfUCIgfSwKLSAgeyAweDgxLCAiI0FTSV9TIiB9LAotICB7IDB4ODIsICIjQVNJX1BORiIgfSwKLSAgeyAweDgzLCAiI0FTSV9TTkYiIH0sCi0gIHsgMHg4OCwgIiNBU0lfUF9MIiB9LAotICB7IDB4ODksICIjQVNJX1NfTCIgfSwKLSAgeyAweDhhLCAiI0FTSV9QTkZfTCIgfSwKLSAgeyAweDhiLCAiI0FTSV9TTkZfTCIgfSwKLSAgeyAweDA0LCAiI0FTSV9OVUNMRVVTIiB9LAotICB7IDB4MGMsICIjQVNJX05VQ0xFVVNfTElUVExFIiB9LAotICB7IDB4MTAsICIjQVNJX0FTX0lGX1VTRVJfUFJJTUFSWSIgfSwKLSAgeyAweDExLCAiI0FTSV9BU19JRl9VU0VSX1NFQ09OREFSWSIgfSwKLSAgeyAweDE4LCAiI0FTSV9BU19JRl9VU0VSX1BSSU1BUllfTElUVExFIiB9LAotICB7IDB4MTksICIjQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZX0xJVFRMRSIgfSwKLSAgeyAweDgwLCAiI0FTSV9QUklNQVJZIiB9LAotICB7IDB4ODEsICIjQVNJX1NFQ09OREFSWSIgfSwKLSAgeyAweDgyLCAiI0FTSV9QUklNQVJZX05PRkFVTFQiIH0sCi0gIHsgMHg4MywgIiNBU0lfU0VDT05EQVJZX05PRkFVTFQiIH0sCi0gIHsgMHg4OCwgIiNBU0lfUFJJTUFSWV9MSVRUTEUiIH0sCi0gIHsgMHg4OSwgIiNBU0lfU0VDT05EQVJZX0xJVFRMRSIgfSwKLSAgeyAweDhhLCAiI0FTSV9QUklNQVJZX05PRkFVTFRfTElUVExFIiB9LAotICB7IDB4OGIsICIjQVNJX1NFQ09OREFSWV9OT0ZBVUxUX0xJVFRMRSIgfSwKLSAgLyogVGhlc2UgYXJlIFVsdHJhU1BBUkMgZXh0ZW5zaW9ucy4gICovCi0gIC8qIEZJWE1FOiBUaGVyZSBhcmUgZG96ZW5zIG9mIHRoZW0uICBOb3Qgc3VyZSB3ZSB3YW50IHRoZW0gYWxsLgotICAgICBNb3N0IGFyZSBmb3Iga2VybmVsIGJ1aWxkaW5nIGJ1dCBzb21lIGFyZSBmb3IgdmlzIHR5cGUgc3R1ZmYuICAqLwotICB7IDAsIDAgfQotfTsKLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgQVNJIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotc3BhcmNfZW5jb2RlX2FzaSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF9uYW1lIChhc2lfdGFibGUsIG5hbWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgZm9yIEFTSSB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IGNoYXIgKgotc3BhcmNfZGVjb2RlX2FzaSAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF92YWx1ZSAoYXNpX3RhYmxlLCB2YWx1ZSk7Ci19Ci0MCi0vKiBIYW5kbGUgbWVtYmFyIG1hc2tzLiAgKi8KLQotc3RhdGljIGFyZyBtZW1iYXJfdGFibGVbXSA9Ci17Ci0gIHsgMHg0MCwgIiNTeW5jIiB9LAotICB7IDB4MjAsICIjTWVtSXNzdWUiIH0sCi0gIHsgMHgxMCwgIiNMb29rYXNpZGUiIH0sCi0gIHsgMHgwOCwgIiNTdG9yZVN0b3JlIiB9LAotICB7IDB4MDQsICIjTG9hZFN0b3JlIiB9LAotICB7IDB4MDIsICIjU3RvcmVMb2FkIiB9LAotICB7IDB4MDEsICIjTG9hZExvYWQiIH0sCi0gIHsgMCwgMCB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBtZW1iYXIgYXJnIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotc3BhcmNfZW5jb2RlX21lbWJhciAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF9uYW1lIChtZW1iYXJfdGFibGUsIG5hbWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgZm9yIG1lbWJhciB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IGNoYXIgKgotc3BhcmNfZGVjb2RlX21lbWJhciAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF92YWx1ZSAobWVtYmFyX3RhYmxlLCB2YWx1ZSk7Ci19Ci0MCi0vKiBIYW5kbGUgcHJlZmV0Y2ggYXJncy4gICovCi0KLXN0YXRpYyBhcmcgcHJlZmV0Y2hfdGFibGVbXSA9Ci17Ci0gIHsgMCwgIiNuX3JlYWRzIiB9LAotICB7IDEsICIjb25lX3JlYWQiIH0sCi0gIHsgMiwgIiNuX3dyaXRlcyIgfSwKLSAgeyAzLCAiI29uZV93cml0ZSIgfSwKLSAgeyA0LCAiI3BhZ2UiIH0sCi0gIHsgMCwgMCB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBwcmVmZXRjaCBhcmcgTkFNRSwgb3IgLTEgaWYgbm90IGZvdW5kLiAgKi8KLQotaW50Ci1zcGFyY19lbmNvZGVfcHJlZmV0Y2ggKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBsb29rdXBfbmFtZSAocHJlZmV0Y2hfdGFibGUsIG5hbWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHByZWZldGNoIHZhbHVlIFZBTFVFIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY19kZWNvZGVfcHJlZmV0Y2ggKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiBsb29rdXBfdmFsdWUgKHByZWZldGNoX3RhYmxlLCB2YWx1ZSk7Ci19Ci0MCi0vKiBIYW5kbGUgc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzLiAgKi8KLQotc3RhdGljIGFyZyBzcGFyY2xldF9jcHJlZ190YWJsZVtdID0KLXsKLSAgeyAwLCAiJWNjc3IiIH0sCi0gIHsgMSwgIiVjY2ZyIiB9LAotICB7IDIsICIlY2NjcmNyIiB9LAotICB7IDMsICIlY2NwciIgfSwKLSAgeyA0LCAiJWNjc3IyIiB9LAotICB7IDUsICIlY2NjcnIiIH0sCi0gIHsgNiwgIiVjY3JzdHIiIH0sCi0gIHsgMCwgMCB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBzcGFyY2xldCBjcHJlZyBhcmcgTkFNRSwgb3IgLTEgaWYgbm90IGZvdW5kLiAgKi8KLQotaW50Ci1zcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBsb29rdXBfbmFtZSAoc3BhcmNsZXRfY3ByZWdfdGFibGUsIG5hbWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHNwYXJjbGV0IGNwcmVnIHZhbHVlIFZBTFVFIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY19kZWNvZGVfc3BhcmNsZXRfY3ByZWcgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiBsb29rdXBfdmFsdWUgKHNwYXJjbGV0X2NwcmVnX3RhYmxlLCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3N0YW1wLWguaW4gYi9vcGNvZGVzL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9vcGNvZGVzL3N5c2RlcC5oIGIvb3Bjb2Rlcy9zeXNkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyM2U1Zi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3N5c2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogUmFuZG9tIGhvc3QtZGVwZW5kZW50IHN1cHBvcnQgY29kZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgS2VuIFJhZWJ1cm4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYm9wY29kZXMsIHRoZSBvcGNvZGVzIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIERvIHN5c3RlbS1kZXBlbmRlbnQgc3R1ZmYsIG1haW5seSBkcml2ZW4gYnkgYXV0b2NvbmYtZGV0ZWN0ZWQgaW5mby4KLQotICAgV2VsbCwgc29tZSBnZW5lcmljIGNvbW1vbiBzdHVmZiBpcyBkb25lIGhlcmUgdG9vLCBsaWtlIGluY2x1ZGluZwotICAgYW5zaWRlY2wuaC4gIFRoYXQncyBiZWNhdXNlIHRoZSAuaCBmaWxlcyBpbiBiZmQvaG9zdHMgZmlsZXMgSSdtCi0gICB0cnlpbmcgdG8gcmVwbGFjZSBvZnRlbiBkaWQgdGhhdC4gIElmIGl0IGNhbiBiZSBkcm9wcGVkIGZyb20gdGhpcwotICAgZmlsZSAoY2hlY2sgaW4gYSBub24tQU5TSSBlbnZpcm9ubWVudCEpLCBpdCBzaG91bGQgYmUuICAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvdGljMzAtZGlzLmMgYi9vcGNvZGVzL3RpYzMwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2NmODkzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdGljMzAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTAgKzAsMCBAQAotLyogRGlzYXNzZW1ibHkgcm91dGluZXMgZm9yIFRNUzMyMEMzMCBhcmNoaXRlY3R1cmUKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS90aWMzMC5oIgotCi0jZGVmaW5lIE5PUk1BTF9JTlNOICAgMQotI2RlZmluZSBQQVJBTExFTF9JTlNOIDIKLQotLyogR2V0cyB0aGUgdHlwZSBvZiBpbnN0cnVjdGlvbiBiYXNlZCBvbiB0aGUgdG9wIDIgb3IgMyBiaXRzIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gd29yZC4gKi8KLSNkZWZpbmUgR0VUX1RZUEUoaW5zbikgKGluc24gJiAweDgwMDAwMDAwID8gaW5zbiAmIDB4QzAwMDAwMDAgOiBpbnNuICYgMHhFMDAwMDAwMCkKLQotLyogSW5zdHJ1Y3Rpb24gdHlwZXMuICovCi0jZGVmaW5lIFRXT19PUEVSQU5EXzEgMHgwMDAwMDAwMAotI2RlZmluZSBUV09fT1BFUkFORF8yIDB4NDAwMDAwMDAKLSNkZWZpbmUgVEhSRUVfT1BFUkFORCAweDIwMDAwMDAwCi0jZGVmaW5lIFBBUl9TVE9SRSAgICAgMHhDMDAwMDAwMAotI2RlZmluZSBNVUxfQUREUyAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgQlJBTkNIRVMgICAgICAweDYwMDAwMDAwCi0KLS8qIFNwZWNpZmljIGluc3RydWN0aW9uIGlkIGJpdHMuICovCi0jZGVmaW5lIE5PUk1BTF9JREVOICAgIDB4MUY4MDAwMDAKLSNkZWZpbmUgUEFSX1NUT1JFX0lERU4gMHgzRTAwMDAwMAotI2RlZmluZSBNVUxfQUREX0lERU4gICAweDJDMDAwMDAwCi0jZGVmaW5lIEJSX0lNTV9JREVOICAgIDB4MUYwMDAwMDAKLSNkZWZpbmUgQlJfQ09ORF9JREVOICAgMHgxQzNGMDAwMAotCi0vKiBBZGRyZXNzaW5nIG1vZGVzLiAqLwotI2RlZmluZSBBTV9SRUdJU1RFUiAweDAwMDAwMDAwCi0jZGVmaW5lIEFNX0RJUkVDVCAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgQU1fSU5ESVJFQ1QgMHgwMDQwMDAwMAotI2RlZmluZSBBTV9JTU0gICAgICAweDAwNjAwMDAwCi0KLSNkZWZpbmUgUF9GSUVMRCAweDAzMDAwMDAwCi0KLSNkZWZpbmUgUkVHX0FSMCAweDA4Ci0jZGVmaW5lIExEUF9JTlNOIDB4MDg3MDAwMDAKLQotLyogVE1TMzIwQzMwIHByb2dyYW0gY291bnRlciBmb3IgY3VycmVudCBpbnN0cnVjdGlvbi4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX3BjOwotCi1zdHJ1Y3QgaW5zdHJ1Y3Rpb24KLSAgewotICAgIGludCB0eXBlOwotICAgIHRlbXBsYXRlICp0bTsKLSAgICBwYXJ0ZW1wbGF0ZSAqcHRtOwotICB9OwotCi1pbnQgZ2V0X3RpYzMwX2luc3RydWN0aW9uIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgcHJpbnRfdHdvX29wZXJhbmQKLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X3RocmVlX29wZXJhbmQKLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X3Bhcl9pbnNuCi0gIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBwcmludF9icmFuY2gKLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IGdldF9pbmRpcmVjdF9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIHNob3J0LCBpbnQsIGNoYXIgKikpOwotaW50IGdldF9yZWdpc3Rlcl9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIsIGNoYXIgKikpOwotaW50IGNudnRfdG1zZmxvYXRfaWVlZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQsIGZsb2F0ICopKTsKLQotaW50Ci1wcmludF9pbnNuX3RpYzMwIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gIHN0cnVjdCBpbnN0cnVjdGlvbiBpbnNuID0KLSAgezAsIE5VTEwsIE5VTEx9OwotICBiZmRfdm1hIGJ1ZmFkZHIgPSBwYyAtIGluZm8tPmJ1ZmZlcl92bWE7Ci0gIC8qIE9idGFpbiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB3b3JkIGZyb20gdGhlIGJ1ZmZlci4gKi8KLSAgaW5zbl93b3JkID0gKCooaW5mby0+YnVmZmVyICsgYnVmYWRkcikgPDwgMjQpIHwgKCooaW5mby0+YnVmZmVyICsgYnVmYWRkciArIDEpIDw8IDE2KSB8Ci0gICAgKCooaW5mby0+YnVmZmVyICsgYnVmYWRkciArIDIpIDw8IDgpIHwgKihpbmZvLT5idWZmZXIgKyBidWZhZGRyICsgMyk7Ci0gIF9wYyA9IHBjIC8gNDsKLSAgLyogR2V0IHRoZSBpbnN0cnVjdGlvbiByZWZlcmVkIHRvIGJ5IHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHdvcmQKLSAgICAgYW5kIHByaW50IGl0IG91dCBiYXNlZCBvbiBpdHMgdHlwZS4gKi8KLSAgaWYgKCFnZXRfdGljMzBfaW5zdHJ1Y3Rpb24gKGluc25fd29yZCwgJmluc24pKQotICAgIHJldHVybiAtMTsKLSAgc3dpdGNoIChHRVRfVFlQRSAoaW5zbl93b3JkKSkKLSAgICB7Ci0gICAgY2FzZSBUV09fT1BFUkFORF8xOgotICAgIGNhc2UgVFdPX09QRVJBTkRfMjoKLSAgICAgIGlmICghcHJpbnRfdHdvX29wZXJhbmQgKGluZm8sIGluc25fd29yZCwgJmluc24pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEhSRUVfT1BFUkFORDoKLSAgICAgIGlmICghcHJpbnRfdGhyZWVfb3BlcmFuZCAoaW5mbywgaW5zbl93b3JkLCAmaW5zbikpCi0JcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQQVJfU1RPUkU6Ci0gICAgY2FzZSBNVUxfQUREUzoKLSAgICAgIGlmICghcHJpbnRfcGFyX2luc24gKGluZm8sIGluc25fd29yZCwgJmluc24pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlJBTkNIRVM6Ci0gICAgICBpZiAoIXByaW50X2JyYW5jaCAoaW5mbywgaW5zbl93b3JkLCAmaW5zbikpCi0JcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gNDsKLX0KLQotaW50Ci1nZXRfdGljMzBfaW5zdHJ1Y3Rpb24gKGluc25fd29yZCwgaW5zbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgc3dpdGNoIChHRVRfVFlQRSAoaW5zbl93b3JkKSkKLSAgICB7Ci0gICAgY2FzZSBUV09fT1BFUkFORF8xOgotICAgIGNhc2UgVFdPX09QRVJBTkRfMjoKLSAgICBjYXNlIFRIUkVFX09QRVJBTkQ6Ci0gICAgICBpbnNuLT50eXBlID0gTk9STUFMX0lOU047Ci0gICAgICB7Ci0JdGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSAodGVtcGxhdGUgKikgdGljMzBfb3B0YWI7Ci0JZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9vcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLQkgIHsKLQkgICAgaWYgKEdFVF9UWVBFIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSkgPT0gR0VUX1RZUEUgKGluc25fd29yZCkpCi0JICAgICAgewotCQlpZiAoY3VycmVudF9vcHRhYi0+b3BlcmFuZHMgPT0gMCkKLQkJICB7Ci0JCSAgICBpZiAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgPT0gaW5zbl93b3JkKQotCQkgICAgICB7Ci0JCQlpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZSBpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgTk9STUFMX0lERU4pID09IChpbnNuX3dvcmQgJiBOT1JNQUxfSURFTikpCi0JCSAgewotCQkgICAgaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUEFSX1NUT1JFOgotICAgICAgaW5zbi0+dHlwZSA9IFBBUkFMTEVMX0lOU047Ci0gICAgICB7Ci0JcGFydGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSAocGFydGVtcGxhdGUgKikgdGljMzBfcGFyb3B0YWI7Ci0JZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9wYXJvcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLQkgIHsKLQkgICAgaWYgKEdFVF9UWVBFIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSkgPT0gR0VUX1RZUEUgKGluc25fd29yZCkpCi0JICAgICAgewotCQlpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgUEFSX1NUT1JFX0lERU4pID09IChpbnNuX3dvcmQgJiBQQVJfU1RPUkVfSURFTikpCi0JCSAgewotCQkgICAgaW5zbi0+cHRtID0gY3VycmVudF9vcHRhYjsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1VTF9BRERTOgotICAgICAgaW5zbi0+dHlwZSA9IFBBUkFMTEVMX0lOU047Ci0gICAgICB7Ci0JcGFydGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSAocGFydGVtcGxhdGUgKikgdGljMzBfcGFyb3B0YWI7Ci0JZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9wYXJvcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLQkgIHsKLQkgICAgaWYgKEdFVF9UWVBFIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSkgPT0gR0VUX1RZUEUgKGluc25fd29yZCkpCi0JICAgICAgewotCQlpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgTVVMX0FERF9JREVOKSA9PSAoaW5zbl93b3JkICYgTVVMX0FERF9JREVOKSkKLQkJICB7Ci0JCSAgICBpbnNuLT5wdG0gPSBjdXJyZW50X29wdGFiOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlJBTkNIRVM6Ci0gICAgICBpbnNuLT50eXBlID0gTk9STUFMX0lOU047Ci0gICAgICB7Ci0JdGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSAodGVtcGxhdGUgKikgdGljMzBfb3B0YWI7Ci0JZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9vcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLQkgIHsKLQkgICAgaWYgKEdFVF9UWVBFIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSkgPT0gR0VUX1RZUEUgKGluc25fd29yZCkpCi0JICAgICAgewotCQlpZiAoY3VycmVudF9vcHRhYi0+b3BlcmFuZF90eXBlc1swXSAmIEltbTI0KQotCQkgIHsKLQkJICAgIGlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBCUl9JTU1fSURFTikgPT0gKGluc25fd29yZCAmIEJSX0lNTV9JREVOKSkKLQkJICAgICAgewotCQkJaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UgaWYgKGN1cnJlbnRfb3B0YWItPm9wZXJhbmRzID4gMCkKLQkJICB7Ci0JCSAgICBpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgQlJfQ09ORF9JREVOKSA9PSAoaW5zbl93b3JkICYgQlJfQ09ORF9JREVOKSkKLQkJICAgICAgewotCQkJaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgKEJSX0NPTkRfSURFTiB8IDB4MDA4MDAwMDApKSA9PSAoaW5zbl93b3JkICYgKEJSX0NPTkRfSURFTiB8IDB4MDA4MDAwMDApKSkKLQkJICAgICAgewotCQkJaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotcHJpbnRfdHdvX29wZXJhbmQgKGluZm8sIGluc25fd29yZCwgaW5zbikKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgY2hhciBuYW1lWzEyXTsKLSAgY2hhciBvcGVyYW5kWzJdWzEzXSA9Ci0gIHsKLSAgICB7MH0sCi0gICAgezB9fTsKLSAgZmxvYXQgZl9udW1iZXI7Ci0KLSAgaWYgKGluc24tPnRtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIHN0cmNweSAobmFtZSwgaW5zbi0+dG0tPm5hbWUpOwotICBpZiAoaW5zbi0+dG0tPm9wY29kZV9tb2RpZmllciA9PSBBZGRyZXNzTW9kZSkKLSAgICB7Ci0gICAgICBpbnQgc3JjX29wLCBkZXN0X29wOwotICAgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgaW5zdHJ1Y3Rpb24gaXMgYSBzdG9yZSBvciBhIG5vcm1hbCBpbnN0cnVjdGlvbi4gKi8KLSAgICAgIGlmICgoaW5zbi0+dG0tPm9wZXJhbmRfdHlwZXNbMV0gJiAoRGlyZWN0IHwgSW5kaXJlY3QpKSA9PSAoRGlyZWN0IHwgSW5kaXJlY3QpKQotCXsKLQkgIHNyY19vcCA9IDE7Ci0JICBkZXN0X29wID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3JjX29wID0gMDsKLQkgIGRlc3Rfb3AgPSAxOwotCX0KLSAgICAgIC8qIEdldCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuICovCi0gICAgICBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDIpCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMUYwMDAwKSA+PiAxNiwgb3BlcmFuZFtkZXN0X29wXSk7Ci0gICAgICAvKiBHZXQgdGhlIHNvdXJjZSBvcGVyYW5kIGJhc2VkIG9uIGFkZHJlc3NpbmcgbW9kZS4gKi8KLSAgICAgIHN3aXRjaCAoaW5zbl93b3JkICYgQWRkcmVzc01vZGUpCi0JewotCWNhc2UgQU1fUkVHSVNURVI6Ci0JICAvKiBDaGVjayBmb3IgdGhlIE5PUCBpbnN0cnVjdGlvbiBiZWZvcmUgZ2V0dGluZyB0aGUgb3BlcmFuZC4gKi8KLQkgIGlmICgoaW5zbi0+dG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBOb3RSZXEpID09IDApCi0JICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDAxRiksIG9wZXJhbmRbc3JjX29wXSk7Ci0JICBicmVhazsKLQljYXNlIEFNX0RJUkVDVDoKLQkgIHNwcmludGYgKG9wZXJhbmRbc3JjX29wXSwgIkAweCVsWCIsIChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSk7Ci0JICBicmVhazsKLQljYXNlIEFNX0lORElSRUNUOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSwgMiwgb3BlcmFuZFtzcmNfb3BdKTsKLQkgIGJyZWFrOwotCWNhc2UgQU1fSU1NOgotCSAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQgYmFzZWQgb24gdmFyaWFibGUgdHlwZS4gKi8KLQkgIHN3aXRjaCAoaW5zbi0+dG0tPmltbV9hcmdfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIEltbV9GbG9hdDoKLQkgICAgICBjbnZ0X3Rtc2Zsb2F0X2llZWUgKChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSwgMiwgJmZfbnVtYmVyKTsKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kW3NyY19vcF0sICIlMi4yZiIsIGZfbnVtYmVyKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJbW1fU0ludDoKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kW3NyY19vcF0sICIlZCIsIChzaG9ydCkgKGluc25fd29yZCAmIDB4MDAwMEZGRkYpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJbW1fVUludDoKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kW3NyY19vcF0sICIlbHUiLCAoaW5zbl93b3JkICYgMHgwMDAwRkZGRikpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICAvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBMRFAgaW5zdHJ1Y3Rpb24uICovCi0JICBpZiAoKGluc25fd29yZCAmIDB4RkZGRkZGMDApID09IExEUF9JTlNOKQotCSAgICB7Ci0JICAgICAgc3RyY3B5IChuYW1lLCAibGRwIik7Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFswXSwgIjB4JTA2bFgiLCAoaW5zbl93b3JkICYgMHgwMDAwMDBGRikgPDwgMTYpOwotCSAgICAgIG9wZXJhbmRbMV1bMF0gPSAnXDAnOwotCSAgICB9Ci0JfQotICAgIH0KLSAgLyogSGFuZGxlIGNhc2UgZm9yIHN0YWNrIGFuZCByb3RhdGUgaW5zdHJ1Y3Rpb25zLiAqLwotICBlbHNlIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMSkKLSAgICB7Ci0gICAgICBpZiAoaW5zbi0+dG0tPm9wY29kZV9tb2RpZmllciA9PSBTdGFja09wKQotCXsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDFGMDAwMCkgPj4gMTYsIG9wZXJhbmRbMF0pOwotCX0KLSAgICB9Ci0gIC8qIE91dHB1dCBpbnN0cnVjdGlvbiB0byBzdHJlYW0uICovCi0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMlYyVzIiwgbmFtZSwKLQkJICAgICAgb3BlcmFuZFswXVswXSA/IG9wZXJhbmRbMF0gOiAiIiwKLQkJICAgICAgb3BlcmFuZFsxXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFsxXVswXSA/IG9wZXJhbmRbMV0gOiAiIik7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLXByaW50X3RocmVlX29wZXJhbmQgKGluZm8sIGluc25fd29yZCwgaW5zbikKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgY2hhciBvcGVyYW5kWzNdWzEzXSA9Ci0gIHsKLSAgICB7MH0sCi0gICAgezB9LAotICAgIHswfX07Ci0KLSAgaWYgKGluc24tPnRtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIHN3aXRjaCAoaW5zbl93b3JkICYgQWRkcmVzc01vZGUpCi0gICAgewotICAgIGNhc2UgQU1fUkVHSVNURVI6Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCBvcGVyYW5kWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgb3BlcmFuZFsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFNX0RJUkVDVDoKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIG9wZXJhbmRbMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQU1fSU5ESVJFQ1Q6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgb3BlcmFuZFsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFNX0lNTToKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMykKLSAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAxRjAwMDApID4+IDE2LCBvcGVyYW5kWzJdKTsKLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgICAlcyAlcywlcyVjJXMiLCBpbnNuLT50bS0+bmFtZSwKLQkJICAgICAgb3BlcmFuZFswXSwgb3BlcmFuZFsxXSwKLQkJICAgICAgb3BlcmFuZFsyXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFsyXVswXSA/IG9wZXJhbmRbMl0gOiAiIik7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLXByaW50X3Bhcl9pbnNuIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIHNpemVfdCBpLCBsZW47Ci0gIGNoYXIgKm5hbWUxLCAqbmFtZTI7Ci0gIGNoYXIgb3BlcmFuZFsyXVszXVsxM10gPQotICB7Ci0gICAgewotICAgICAgezB9LAotICAgICAgezB9LAotICAgICAgezB9fSwKLSAgICB7Ci0gICAgICB7MH0sCi0gICAgICB7MH0sCi0gICAgICB7MH19fTsKLQotICBpZiAoaW5zbi0+cHRtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIFBhcnNlIG91dCB0aGUgbmFtZXMgb2YgZWFjaCBvZiB0aGUgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlCi0gICAgIHFfaW5zbjFfaW5zbjIgZm9ybWF0LiAqLwotICBuYW1lMSA9IChjaGFyICopIHN0cmR1cCAoaW5zbi0+cHRtLT5uYW1lICsgMik7Ci0gIG5hbWUyID0gIiI7Ci0gIGxlbiA9IHN0cmxlbiAobmFtZTEpOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKG5hbWUxW2ldID09ICdfJykKLQl7Ci0JICBuYW1lMiA9ICZuYW1lMVtpICsgMV07Ci0JICBuYW1lMVtpXSA9ICdcMCc7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAvKiBHZXQgdGhlIG9wZXJhbmRzIG9mIHRoZSBpbnN0cnVjdGlvbiBiYXNlZCBvbiB0aGUgb3BlcmFuZCBvcmRlci4gKi8KLSAgc3dpdGNoIChpbnNuLT5wdG0tPm9wb3JkZXIpCi0gICAgewotICAgIGNhc2UgT09fNG9wMToKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PXzRvcDI6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT180b3AzOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fNW9wMToKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzJdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fNW9wMjoKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzJdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fUEZpZWxkOgotICAgICAgaWYgKGluc25fd29yZCAmIDB4MDA4MDAwMDApCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKDB4MDEsIG9wZXJhbmRbMF1bMl0pOwotICAgICAgZWxzZQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgweDAwLCBvcGVyYW5kWzBdWzJdKTsKLSAgICAgIGlmIChpbnNuX3dvcmQgJiAweDAwNDAwMDAwKQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgweDAzLCBvcGVyYW5kWzFdWzJdKTsKLSAgICAgIGVsc2UKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMiwgb3BlcmFuZFsxXVsyXSk7Ci0gICAgICBzd2l0Y2ggKGluc25fd29yZCAmIFBfRklFTEQpCi0JewotCWNhc2UgMHgwMDAwMDAwMDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMV0pOwotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzBdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMV0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0JICBicmVhazsKLQljYXNlIDB4MDEwMDAwMDA6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzFdWzBdKTsKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFswXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzFdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAyMDAwMDAwOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzBdKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMzAwMDAwMDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMV1bMV0pOwotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzBdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAgICVzICVzLCVzJWMlcyIsIG5hbWUxLAotCQkgICAgICBvcGVyYW5kWzBdWzBdLCBvcGVyYW5kWzBdWzFdLAotCQkgICAgICBvcGVyYW5kWzBdWzJdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzBdWzJdWzBdID8gb3BlcmFuZFswXVsyXSA6ICIiKTsKLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJcblx0XHRcdHx8ICVzICVzLCVzJWMlcyIsIG5hbWUyLAotCQkgICAgICBvcGVyYW5kWzFdWzBdLCBvcGVyYW5kWzFdWzFdLAotCQkgICAgICBvcGVyYW5kWzFdWzJdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzFdWzJdWzBdID8gb3BlcmFuZFsxXVsyXSA6ICIiKTsKLSAgZnJlZSAobmFtZTEpOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1wcmludF9icmFuY2ggKGluZm8sIGluc25fd29yZCwgaW5zbikKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgY2hhciBvcGVyYW5kWzJdWzEzXSA9Ci0gIHsKLSAgICB7MH0sCi0gICAgezB9fTsKLSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotICBpbnQgcHJpbnRfbGFiZWwgPSAwOwotCi0gIGlmIChpbnNuLT50bSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAvKiBHZXQgdGhlIG9wZXJhbmRzIGZvciAyNC1iaXQgaW1tZWRpYXRlIGp1bXBzLiAqLwotICBpZiAoaW5zbi0+dG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBJbW0yNCkKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gaW5zbl93b3JkICYgMHgwMEZGRkZGRjsKLSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIweCVsWCIsIGFkZHJlc3MpOwotICAgICAgcHJpbnRfbGFiZWwgPSAxOwotICAgIH0KLSAgLyogR2V0IHRoZSBvcGVyYW5kIGZvciB0aGUgdHJhcCBpbnN0cnVjdGlvbi4gKi8KLSAgZWxzZSBpZiAoaW5zbi0+dG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBJVmVjdG9yKQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSBpbnNuX3dvcmQgJiAweDAwMDAwMDFGOwotICAgICAgc3ByaW50ZiAob3BlcmFuZFswXSwgIjB4JWxYIiwgYWRkcmVzcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWRkcmVzcyA9IGluc25fd29yZCAmIDB4MDAwMEZGRkY7Ci0gICAgICAvKiBHZXQgdGhlIG9wZXJhbmRzIGZvciB0aGUgREIgaW5zdHJ1Y3Rpb25zLiAqLwotICAgICAgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAyKQotCXsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoKGluc25fd29yZCAmIDB4MDFDMDAwMDApID4+IDIyKSArIFJFR19BUjAsIG9wZXJhbmRbMF0pOwotCSAgaWYgKGluc25fd29yZCAmIFBDUmVsKQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFsxXSwgIiVkIiwgKHNob3J0KSBhZGRyZXNzKTsKLQkgICAgICBwcmludF9sYWJlbCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKGluc25fd29yZCAmIDB4MDAwMDAwMUYsIG9wZXJhbmRbMV0pOwotCX0KLSAgICAgIC8qIEdldCB0aGUgb3BlcmFuZHMgZm9yIHRoZSBzdGFuZGFyZCBicmFuY2hlcy4gKi8KLSAgICAgIGVsc2UgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAxKQotCXsKLQkgIGlmIChpbnNuX3dvcmQgJiBQQ1JlbCkKLQkgICAgewotCSAgICAgIGFkZHJlc3MgPSAoc2hvcnQpIGFkZHJlc3M7Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFswXSwgIiVsZCIsIGFkZHJlc3MpOwotCSAgICAgIHByaW50X2xhYmVsID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoaW5zbl93b3JkICYgMHgwMDAwMDAxRiwgb3BlcmFuZFswXSk7Ci0JfQotICAgIH0KLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgICAlcyAlcyVjJXMiLCBpbnNuLT50bS0+bmFtZSwKLQkJICAgICAgb3BlcmFuZFswXVswXSA/IG9wZXJhbmRbMF0gOiAiIiwKLQkJICAgICAgb3BlcmFuZFsxXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFsxXVswXSA/IG9wZXJhbmRbMV0gOiAiIik7Ci0gIC8qIFByaW50IGRlc3RpbmF0aW9uIG9mIGJyYW5jaCBpbiByZWxhdGlvbiB0byBjdXJyZW50IHN5bWJvbC4gKi8KLSAgaWYgKHByaW50X2xhYmVsICYmIGluZm8tPnN5bWJvbHMpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltID0gKmluZm8tPnN5bWJvbHM7Ci0KLSAgICAgIGlmICgoaW5zbi0+dG0tPm9wY29kZV9tb2RpZmllciA9PSBQQ1JlbCkgJiYgKGluc25fd29yZCAmIFBDUmVsKSkKLQl7Ci0JICBhZGRyZXNzID0gKF9wYyArIDEgKyAoc2hvcnQpIGFkZHJlc3MpIC0gKChzeW0tPnNlY3Rpb24tPnZtYSArIHN5bS0+dmFsdWUpIC8gNCk7Ci0JICAvKiBDaGVjayBmb3IgZGVsYXllZCBpbnN0cnVjdGlvbiwgaWYgc28gYWRqdXN0IGRlc3RpbmF0aW9uLiAqLwotCSAgaWYgKGluc25fd29yZCAmIDB4MDAyMDAwMDApCi0JICAgIGFkZHJlc3MgKz0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYWRkcmVzcyAtPSAoKHN5bS0+c2VjdGlvbi0+dm1hICsgc3ltLT52YWx1ZSkgLyA0KTsKLQl9Ci0gICAgICBpZiAoYWRkcmVzcyA9PSAwKQotCWluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiIDwlcz4iLCBzeW0tPm5hbWUpOwotICAgICAgZWxzZQotCWluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiIDwlcyAlYyAlZD4iLCBzeW0tPm5hbWUsCi0JCQkgICAgKChzaG9ydCkgYWRkcmVzcyA8IDApID8gJy0nIDogJysnLAotCQkJICAgIGFicyAoYWRkcmVzcykpOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotZ2V0X2luZGlyZWN0X29wZXJhbmQgKGZyYWdtZW50LCBzaXplLCBidWZmZXIpCi0gICAgIHVuc2lnbmVkIHNob3J0IGZyYWdtZW50OwotICAgICBpbnQgc2l6ZTsKLSAgICAgY2hhciAqYnVmZmVyOwotewotICB1bnNpZ25lZCBjaGFyIG1vZDsKLSAgdW5zaWduZWQgYXJudW07Ci0gIHVuc2lnbmVkIGNoYXIgZGlzcDsKLQotICBpZiAoYnVmZmVyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIERldGVybWluZSB3aGljaCBiaXRzIGlkZW50aWZ5IHRoZSBzZWN0aW9ucyBvZiB0aGUgaW5kaXJlY3Qgb3BlcmFuZCBiYXNlZCBvbiB0aGUKLSAgICAgc2l6ZSBpbiBieXRlcy4gKi8KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBtb2QgPSAoZnJhZ21lbnQgJiAweDAwRjgpID4+IDM7Ci0gICAgICBhcm51bSA9IChmcmFnbWVudCAmIDB4MDAwNyk7Ci0gICAgICBkaXNwID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG1vZCA9IChmcmFnbWVudCAmIDB4RjgwMCkgPj4gMTE7Ci0gICAgICBhcm51bSA9IChmcmFnbWVudCAmIDB4MDcwMCkgPj4gODsKLSAgICAgIGRpc3AgPSAoZnJhZ21lbnQgJiAweDAwRkYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgewotICAgIGNvbnN0IGluZF9hZGRyX3R5cGUgKmN1cnJlbnRfaW5kID0gdGljMzBfaW5kYWRkcl90YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfaW5kIDwgdGljMzBfaW5kYWRkcnRhYl9lbmQ7IGN1cnJlbnRfaW5kKyspCi0gICAgICB7Ci0JaWYgKGN1cnJlbnRfaW5kLT5tb2RmaWVsZCA9PSBtb2QpCi0JICB7Ci0JICAgIGlmIChjdXJyZW50X2luZC0+ZGlzcGxhY2VtZW50ID09IElNUExJRURfRElTUCAmJiBzaXplID09IDIpCi0JICAgICAgewotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXNpemVfdCBpLCBsZW47Ci0JCWludCBidWZjbnQ7Ci0JCQotCQlsZW4gPSBzdHJsZW4gKGN1cnJlbnRfaW5kLT5zeW50YXgpOwotCQlmb3IgKGkgPSAwLCBidWZjbnQgPSAwOyBpIDwgbGVuOyBpKyssIGJ1ZmNudCsrKQotCQkgIHsKLQkJICAgIGJ1ZmZlcltidWZjbnRdID0gY3VycmVudF9pbmQtPnN5bnRheFtpXTsKLQkJICAgIGlmIChidWZmZXJbYnVmY250IC0gMV0gPT0gJ2EnICYmIGJ1ZmZlcltidWZjbnRdID09ICdyJykKLQkJICAgICAgYnVmZmVyWysrYnVmY250XSA9IGFybnVtICsgJzAnOwotCQkgICAgaWYgKGJ1ZmZlcltidWZjbnRdID09ICcoJyAmJiBjdXJyZW50X2luZC0+ZGlzcGxhY2VtZW50ID09IERJU1BfUkVRVUlSRUQpCi0JCSAgICAgIHsKLQkJCXNwcmludGYgKCZidWZmZXJbYnVmY250ICsgMV0sICIldSIsIGRpc3ApOwotCQkJYnVmY250ICs9IHN0cmxlbiAoJmJ1ZmZlcltidWZjbnQgKyAxXSk7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWJ1ZmZlcltidWZjbnQgKyAxXSA9ICdcMCc7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1nZXRfcmVnaXN0ZXJfb3BlcmFuZCAoZnJhZ21lbnQsIGJ1ZmZlcikKLSAgICAgdW5zaWduZWQgY2hhciBmcmFnbWVudDsKLSAgICAgY2hhciAqYnVmZmVyOwotewotICBjb25zdCByZWcgKmN1cnJlbnRfcmVnID0gdGljMzBfcmVndGFiOwotCi0gIGlmIChidWZmZXIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgZm9yICg7IGN1cnJlbnRfcmVnIDwgdGljMzBfcmVndGFiX2VuZDsgY3VycmVudF9yZWcrKykKLSAgICB7Ci0gICAgICBpZiAoKGZyYWdtZW50ICYgMHgxRikgPT0gY3VycmVudF9yZWctPm9wY29kZSkKLQl7Ci0JICBzdHJjcHkgKGJ1ZmZlciwgY3VycmVudF9yZWctPm5hbWUpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotY252dF90bXNmbG9hdF9pZWVlICh0bXNmbG9hdCwgc2l6ZSwgaWVlZWZsb2F0KQotICAgICB1bnNpZ25lZCBsb25nIHRtc2Zsb2F0OwotICAgICBpbnQgc2l6ZTsKLSAgICAgZmxvYXQgKmllZWVmbG9hdDsKLXsKLSAgdW5zaWduZWQgbG9uZyBleHAsIHNpZ24sIG1hbnQ7Ci0KLSAgaWYgKHNpemUgPT0gMikKLSAgICB7Ci0gICAgICBpZiAoKHRtc2Zsb2F0ICYgMHgwMDAwRjAwMCkgPT0gMHgwMDAwODAwMCkKLQl0bXNmbG9hdCA9IDB4ODAwMDAwMDA7Ci0gICAgICBlbHNlCi0JewotCSAgdG1zZmxvYXQgPDw9IDE2OwotCSAgdG1zZmxvYXQgPSAobG9uZykgdG1zZmxvYXQgPj4gNDsKLQl9Ci0gICAgfQotICBleHAgPSB0bXNmbG9hdCAmIDB4RkYwMDAwMDA7Ci0gIGlmIChleHAgPT0gMHg4MDAwMDAwMCkKLSAgICB7Ci0gICAgICAqaWVlZWZsb2F0ID0gMC4wOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBleHAgKz0gMHg3RjAwMDAwMDsKLSAgc2lnbiA9ICh0bXNmbG9hdCAmIDB4MDA4MDAwMDApIDw8IDg7Ci0gIG1hbnQgPSB0bXNmbG9hdCAmIDB4MDA3RkZGRkY7Ci0gIGlmIChleHAgPT0gMHhGRjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAobWFudCA9PSAwKQotCSppZWVlZmxvYXQgPSBFUkFOR0U7Ci0gICAgICBpZiAoc2lnbiA9PSAwKQotCSppZWVlZmxvYXQgPSAxLjAgLyAwLjA7Ci0gICAgICBlbHNlCi0JKmllZWVmbG9hdCA9IC0xLjAgLyAwLjA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cCA+Pj0gMTsKLSAgaWYgKHNpZ24pCi0gICAgewotICAgICAgbWFudCA9ICh+bWFudCkgJiAweDAwN0ZGRkZGOwotICAgICAgbWFudCArPSAxOwotICAgICAgZXhwICs9IG1hbnQgJiAweDAwODAwMDAwOwotICAgICAgZXhwICY9IDB4N0Y4MDAwMDA7Ci0gICAgICBtYW50ICY9IDB4MDA3RkZGRkY7Ci0gICAgfQotICBpZiAodG1zZmxvYXQgPT0gMHg4MDAwMDAwMCkKLSAgICBzaWduID0gbWFudCA9IGV4cCA9IDA7Ci0gIHRtc2Zsb2F0ID0gc2lnbiB8IGV4cCB8IG1hbnQ7Ci0gICppZWVlZmxvYXQgPSAqKChmbG9hdCAqKSAmdG1zZmxvYXQpOwotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdGljODAtZGlzLmMgYi9vcGNvZGVzL3RpYzgwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjZiYzEyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdGljODAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyogUHJpbnQgVEkgVE1TMzIwQzgwIChNVlApIGluc3RydWN0aW9ucwotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljODAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyBpbnQgbGVuZ3RoOwotCi1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2JpdG51bSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2NvbmRpdGlvbl9jb2RlIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2Zsb2F0IFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfaW50ZWdlciBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JCQkJICAgY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGludCBwcmludF9vbmVfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICopKTsKLXN0YXRpYyBpbnQgcHJpbnRfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwgdW5zaWduZWQgbG9uZywKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICopKTsKLXN0YXRpYyBpbnQgZmlsbF9pbnN0cnVjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqKSk7Ci0KLQwKLS8qIFByaW50IGFuIGludGVnZXIgb3BlcmFuZC4gIFRyeSB0byBiZSBzb21ld2hhdCBzbWFydCBhYm91dCB0aGUKLSAgIGZvcm1hdCBieSBhc3N1bWluZyB0aGF0IHNtYWxsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXJzIGFyZQotICAgcHJvYmFibHkgbG9vcCBpbmNyZW1lbnQgdmFsdWVzLCBzdHJ1Y3R1cmUgb2Zmc2V0cywgb3Igc2ltaWxhcgotICAgdmFsdWVzIHRoYXQgYXJlIG1vcmUgbWVhbmluZ2Z1bCBwcmludGVkIGFzIHNpZ25lZCBkZWNpbWFsIHZhbHVlcy4KLSAgIExhcmdlciBudW1iZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgcHJpbnRlZCBhcyBoZXggdmFsdWVzLiAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIGlmICgodmFsdWUgPiA5OTk5IHx8IHZhbHVlIDwgLTk5OTkpKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICAgIH0KLX0KLQotDAotLyogRklYTUU6IGRlcGVuZHMgdXBvbiBzaXplb2YgKGxvbmcpID09IHNpemVvZiAoZmxvYXQpIGFuZAotICAgYWxzbyB1cG9uIGhvc3QgZmxvYXRpbmcgcG9pbnQgZm9ybWF0IG1hdGNoaW5nIHRhcmdldAotICAgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9mbG9hdCAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICB1bmlvbiB7IGZsb2F0IGY7IGxvbmcgbDsgfSBmdmFsOwotCi0gIGZ2YWwubCA9IHZhbHVlOwotICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlZyIsIGZ2YWwuZik7Ci19Ci0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIgKGluZm8sIHZhbHVlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgY29uc3QgY2hhciAqdG1wOwotCi0gIHRtcCA9IHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCAodmFsdWUsIFRJQzgwX09QRVJBTkRfQ1IpOwotICBpZiAodG1wICE9IE5VTEwpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJXMiLCB0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9jb25kaXRpb25fY29kZSAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICBjb25zdCBjaGFyICp0bXA7Ci0KLSAgdG1wID0gdGljODBfdmFsdWVfdG9fc3ltYm9sICh2YWx1ZSwgVElDODBfT1BFUkFORF9DQyk7Ci0gIGlmICh0bXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlcyIsIHRtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICAgIH0KLX0KLQotDAotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmRfYml0bnVtIChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIGludCBiaXRudW07Ci0gIGNvbnN0IGNoYXIgKnRtcDsKLQotICBiaXRudW0gPSB+dmFsdWUgJiAweDFGOwotICB0bXAgPSB0aWM4MF92YWx1ZV90b19zeW1ib2wgKGJpdG51bSwgVElDODBfT1BFUkFORF9CSVROVU0pOwotICBpZiAodG1wICE9IE5VTEwpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJXMiLCB0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVsZCIsIGJpdG51bSk7Ci0gICAgfQotfQotCi0MCi0vKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotCi0jZGVmaW5lIE1fU0koaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9TSSkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDE3KSkpCi0jZGVmaW5lIE1fTEkoaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9MSSkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDE1KSkpCi0jZGVmaW5lIFJfU0NBTEVEKGluc24sb3ApICgoKChvcCkgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDExKSkpCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kIChpbmZvLCB2YWx1ZSwgaW5zbiwgb3BlcmFuZCwgbWVtYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLXsKLSAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9HUFIpICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiciVsZCIsIHZhbHVlKTsKLSAgICAgIGlmIChNX1NJIChpbnNuLCBvcGVyYW5kKSB8fCBNX0xJIChpbnNuLCBvcGVyYW5kKSkKLQl7Ci0JICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICI6bSIpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9GUEEpICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiYSVsZCIsIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gcHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIDQgKiB2YWx1ZSwgaW5mbyk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQkFTRVJFTCkgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gcHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JJVE5VTSkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2JpdG51bSAoaW5mbywgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NDKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9DUikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9GTE9BVCkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2Zsb2F0IChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQklURklFTEQpKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBzY2FsZWQgb3BlcmFuZCwgdGhlbiBwcmludCB0aGUgbW9kaWZpZXIgKi8KLQotICBpZiAoUl9TQ0FMRUQgKGluc24sIG9wZXJhbmQpKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIjpzIik7Ci0gICAgfQotfQotCi0MCi0vKiBXZSBoYXZlIGNob3NlbiBhbiBvcGNvZGUgdGFibGUgZW50cnkgKi8KLQotc3RhdGljIGludAotcHJpbnRfb25lX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCBvcGNvZGUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotewotICBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgbG9uZyB2YWx1ZTsKLSAgaW50IHN0YXR1czsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKLSAgaW50IGNsb3NlX3BhcmVuOwotCi0gICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUtMTBzIiwgb3Bjb2RlIC0+IG5hbWUpOwotCi0gIGZvciAob3BpbmRleCA9IG9wY29kZSAtPiBvcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotICAgIHsKLSAgICAgIG9wZXJhbmQgPSB0aWM4MF9vcGVyYW5kcyArICpvcGluZGV4OwotCi0gICAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAob3BlcmFuZCAtPiBleHRyYWN0KQotCXsKLQkgIHZhbHVlID0gKCpvcGVyYW5kIC0+IGV4dHJhY3QpIChpbnNuLCAoaW50ICopIE5VTEwpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQgLT4gYml0cyA9PSAzMikKLQl7Ci0JICBzdGF0dXMgPSBmaWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCAodW5zaWduZWQgbG9uZyAqKSAmdmFsdWUpOwotCSAgaWYgKHN0YXR1cyA9PSAtMSkKLQkgICAgewotCSAgICAgIHJldHVybiAoc3RhdHVzKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQgLT4gc2hpZnQpICYgKCgxIDw8IG9wZXJhbmQgLT4gYml0cykgLSAxKTsKLQkgIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAgJiYgKHZhbHVlICYgKDEgPDwgKG9wZXJhbmQgLT4gYml0cyAtIDEpKSkgIT0gMCkKLQkgICAgewotCSAgICAgIHZhbHVlIC09IDEgPDwgb3BlcmFuZCAtPiBiaXRzOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXMsIHRoZW4gcHJpbnQKLQkgdGhlIG9wZW4gcGFyZW4sIG90aGVyd2lzZSBqdXN0IHByaW50IHRoZSByZWd1bGFyIGNvbW1hCi0JIHNlcGFyYXRvciwgZXhjZXB0IGZvciB0aGUgZmlyc3Qgb3BlcmFuZC4gKi8KLQotICAgICAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9QQVJFTlMpID09IDApCi0JewotCSAgY2xvc2VfcGFyZW4gPSAwOwotCSAgaWYgKG9waW5kZXggIT0gb3Bjb2RlIC0+IG9wZXJhbmRzKQotCSAgICB7Ci0JICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiLCIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNsb3NlX3BhcmVuID0gMTsKLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIigiKTsKLQl9Ci0KLSAgICAgIHByaW50X29wZXJhbmQgKGluZm8sIHZhbHVlLCBpbnNuLCBvcGVyYW5kLCBtZW1hZGRyKTsKLQotICAgICAgLyogSWYgd2UgcHJpbnRlZCBhbiBvcGVuIHBhcmVuIGJlZm9yZSBwcmludGluZyB0aGlzIG9wZXJhbmQsIGNsb3NlCi0JIGl0IG5vdy4gVGhlIGZsYWcgZ2V0cyByZXNldCBvbiBlYWNoIGxvb3AuICovCi0KLSAgICAgIGlmIChjbG9zZV9wYXJlbikKLQl7Ci0JICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIpIik7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChsZW5ndGgpOwotfQotCi0MCi0KLS8qIFRoZXJlIGFyZSBubyBzcGVjaWZpYyBiaXRzIHRoYXQgdGVsbCB1cyBmb3IgY2VydGFpbiB3aGV0aGVyIGEgdmVjdG9yCi0gICBpbnN0cnVjdGlvbiBvcGNvZGUgY29udGFpbnMgb25lIG9yIHR3byBpbnN0cnVjdGlvbnMuICBIb3dldmVyIHNpbmNlCi0gICBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIG9mIHIwIGlzIGlsbGVnYWwsIHdlIGNhbiBjaGVjayBmb3Igbm9uemVybwotICAgdmFsdWVzIGluIGJvdGggZGVzdGluYXRpb24gcmVnaXN0ZXIgZmllbGRzLiAgT25seSBvcGNvZGVzIHRoYXQgaGF2ZQotICAgdHdvIHZhbGlkIGluc3RydWN0aW9ucyB3aWxsIGhhdmUgbm9uLXplcm8gaW4gYm90aCAqLwotCi0jZGVmaW5lIFRXT19JTlNOKGluc24pICgoKChpbnNuKSAmICgweDFGIDw8IDI3KSkgIT0gMCkgJiYgKCgoaW5zbikgJiAoMHgxRiA8PCAyMikpICE9IDApKQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgdmVjX29wY29kZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICp2ZWNfb3Bjb2RlOwotewotICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZV9lbmQ7Ci0KLSAgLyogRmluZCB0aGUgZmlyc3Qgb3Bjb2RlIG1hdGNoIGluIHRoZSBvcGNvZGVzIHRhYmxlLiAgRm9yIHZlY3RvcgotICAgICBvcGNvZGVzICh2ZWNfb3Bjb2RlICE9IE5VTEwpIGZpbmQgdGhlIGZpcnN0IG1hdGNoIHRoYXQgaXMgbm90IHRoZQotICAgICBwcmV2aW91c2x5IGZvdW5kIG1hdGNoLiAgRklYTUU6IHRoZXJlIHNob3VsZCBiZSBmYXN0ZXIgd2F5cyB0bwotICAgICBzZWFyY2ggKGhhc2ggdGFibGUgb3IgYmluYXJ5IHNlYXJjaCksIGJ1dCBkb24ndCB3b3JyeSB0b28gbXVjaAotICAgICBhYm91dCBpdCB1bnRpbCBvdGhlciBUSWM4MCBzdXBwb3J0IGlzIGZpbmlzaGVkLiAqLwotCi0gIG9wY29kZV9lbmQgPSB0aWM4MF9vcGNvZGVzICsgdGljODBfbnVtX29wY29kZXM7Ci0gIGZvciAob3Bjb2RlID0gdGljODBfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlIC0+IG1hc2spID09IG9wY29kZSAtPiBvcGNvZGUgJiYKLQkgIG9wY29kZSAhPSB2ZWNfb3Bjb2RlKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wY29kZSA9PSBvcGNvZGVfZW5kKQotICAgIHsKLSAgICAgIC8qIE5vIG1hdGNoIGZvdW5kLCBqdXN0IHByaW50IHRoZSBiaXRzIGFzIGEgLndvcmQgZGlyZWN0aXZlICovCi0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIud29yZCAlIzA4bHgiLCBpbnNuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBNYXRjaCBmb3VuZCwgZGVjb2RlIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBsZW5ndGggPSBwcmludF9vbmVfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIG9wY29kZSk7Ci0gICAgICBpZiAob3Bjb2RlIC0+IGZsYWdzICYgVElDODBfVkVDVE9SICYmIHZlY19vcGNvZGUgPT0gTlVMTCAmJiBUV09fSU5TTiAoaW5zbikpCi0JewotCSAgLyogVGhlcmUgaXMgYW5vdGhlciBpbnN0cnVjdGlvbiB0byBwcmludCBmcm9tIHRoZSBzYW1lIG9wY29kZS4KLQkgICAgIFByaW50IHRoZSBzZXBhcmF0b3IgYW5kIHRoZW4gZmluZCBhbmQgcHJpbnQgdGhlIG90aGVyCi0JICAgICBpbnN0cnVjdGlvbi4gKi8KLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiAgIHx8ICAgIik7Ci0JICBsZW5ndGggPSBwcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgb3Bjb2RlKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKGxlbmd0aCk7Ci19Ci0KLS8qIEdldCB0aGUgbmV4dCAzMiBiaXQgd29yZCBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gYW5kIGNvbnZlcnQgaXQKLSAgIGludG8gaW50ZXJuYWwgZm9ybWF0IGluIHRoZSB1bnNpZ25lZCBsb25nIElOU04sIGZvciB3aGljaCB3ZSBhcmUKLSAgIHBhc3NlZCB0aGUgYWRkcmVzcy4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLiAqLwotCi1zdGF0aWMgaW50Ci1maWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNucCkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBHZXQgdGhlIGJpdHMgZm9yIHRoZSBuZXh0IDMyIGJpdCB3b3JkIGFuZCBwdXQgaW4gYnVmZmVyICovCi0KLSAgc3RhdHVzID0gKCppbmZvIC0+IHJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgbGVuZ3RoLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IG1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLQotICAvKiBSZWFkIHdhcyBzdWNjZXNzZnVsLCBzbyBpbmNyZW1lbnQgY291bnQgb2YgYnl0ZXMgcmVhZCBhbmQgY29udmVydAotICAgICB0aGUgYml0cyBpbnRvIGludGVybmFsIGZvcm1hdC4gKi8KLSAgICAgCi0gIGxlbmd0aCArPSA0OwotICBpZiAoaW5mbyAtPiBlbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgewotICAgICAgKmluc25wID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGluZm8gLT4gZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIHsKLSAgICAgICppbnNucCA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUU6IFNob3VsZCBwcm9iYWJseSBqdXN0IGRlZmF1bHQgdG8gb25lIG9yIHRoZSBvdGhlciAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0MCi1pbnQgCi1wcmludF9pbnNuX3RpYzgwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGludCBzdGF0dXM7Ci0KLSAgbGVuZ3RoID0gMDsKLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA4OwotICBzdGF0dXMgPSBmaWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCAmaW5zbik7Ci0gIGlmIChzdGF0dXMgIT0gLTEpCi0gICAgewotICAgICAgc3RhdHVzID0gcHJpbnRfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIE5VTEwpOwotICAgIH0KLSAgcmV0dXJuIChzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWM4MC1vcGMuYyBiL29wY29kZXMvdGljODAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWMzMDguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy90aWM4MC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMTYgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciBUSSBUTVMzMjBDODAgKE1WUCkuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzgwLmgiCi0KLS8qIFRoaXMgZmlsZSBob2xkcyB2YXJpb3VzIHRhYmxlcyBmb3IgdGhlIFRNUzMyMEM4MCAoTVZQKS4KLQotICAgVGhlIG9wY29kZSB0YWJsZSBpcyBzdHJpY3RseSBjb25zdGFudCBkYXRhLCBzbyB0aGUgY29tcGlsZXIgc2hvdWxkCi0gICBiZSBhYmxlIHRvIHB1dCBpdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQotICAgVGhpcyBmaWxlIGFsc28gaG9sZHMgdGhlIG9wZXJhbmQgdGFibGUuICBBbGwga25vd2xlZGdlIGFib3V0Ci0gICBpbnNlcnRpbmcgb3BlcmFuZHMgaW50byBpbnN0cnVjdGlvbnMgYW5kIHZpY2UtdmVyc2EgaXMga2VwdCBpbiB0aGlzCi0gICBmaWxlLgotCi0gICBUaGUgcHJlZGVmaW5lZCByZWdpc3RlciB0YWJsZSBtYXBzIGZyb20gcmVnaXN0ZXIgbmFtZXMgdG8gcmVnaXN0ZXIKLSAgIHZhbHVlcy4gICovCi0KLQwKLS8qIFRhYmxlIG9mIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzLCBzdWNoIGFzIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMsCi0gICBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMsIGNvbmRpdGlvbiBjb2RlcywgY29udHJvbCByZWdpc3RlcnMsIGFuZCBiaXQKLSAgIG51bWJlcnMuCi0KLSAgIFRoZSB0YWJsZSBpcyBzb3J0ZWQgY2FzZSBpbmRlcGVuZGVudGx5IGJ5IG5hbWUgc28gdGhhdCBpdCBpcyBzdWl0YWJsZSBmb3IKLSAgIHNlYXJjaGluZyB2aWEgYSBiaW5hcnkgc2VhcmNoIHVzaW5nIGEgY2FzZSBpbmRlcGVuZGVudCBjb21wYXJpc29uCi0gICBmdW5jdGlvbi4KLQotICAgTm90ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgaXMgc3RvcmVkIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZSB2YWx1ZQotICAgZmllbGQsIHdoaWNoIGFsbG93cyB0aGUgdmFsdWUgYW5kIHR5cGUgdG8gYmUgcGFzc2VkIGFyb3VuZCBhcyBhIHVuaXQgaW4gYQotICAgc2luZ2xlIGludC4gIFRoZSB0eXBlcyBoYXZlIHRvIGJlIG1hc2tlZCBvZmYgYmVmb3JlIHVzaW5nIHRoZSBudW1lcmljCi0gICB2YWx1ZSBhcyBhIG51bWJlci4KLSovCi0KLWNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHNbXSA9Ci17Ci0gIHsgImEwIiwJVElDODBfT1BFUkFORF9GUEEgfCAwIH0sCi0gIHsgImExIiwJVElDODBfT1BFUkFORF9GUEEgfCAxIH0sCi0gIHsgImFsdy5iIiwJVElDODBfT1BFUkFORF9DQyB8IDcgfSwKLSAgeyAiYWx3LmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTUgfSwKLSAgeyAiYWx3LnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMjMgfSwKLSAgeyAiQU5BU1RBVCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDM0IH0sCi0gIHsgIkJSSzEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzOSB9LAotICB7ICJCUksyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4M0EgfSwKLSAgeyAiQ09ORklHIiwJVElDODBfT1BFUkFORF9DUiB8IDIgfSwKLSAgeyAiRExSVSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDUwMCB9LAotICB7ICJEVEFHMCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMCB9LAotICB7ICJEVEFHMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMSB9LAotICB7ICJEVEFHMTAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEEgfSwKLSAgeyAiRFRBRzExIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBCIH0sCi0gIHsgIkRUQUcxMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwQyB9LAotICB7ICJEVEFHMTMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEQgfSwKLSAgeyAiRFRBRzE0IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBFIH0sCi0gIHsgIkRUQUcxNSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwRiB9LAotICB7ICJEVEFHMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMiB9LAotICB7ICJEVEFHMyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMyB9LAotICB7ICJEVEFHNCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwNCB9LAotICB7ICJEVEFHNSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwNSB9LAotICB7ICJEVEFHNiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwNiB9LAotICB7ICJEVEFHNyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwNyB9LAotICB7ICJEVEFHOCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwOCB9LAotICB7ICJEVEFHOSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwOSB9LAotICB7ICJFQ09NQ05UTCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDMzIH0sCi0gIHsgIkVJUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAxIH0sCi0gIHsgIkVQQyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAwIH0sCi0gIHsgImVxLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAwIH0sCi0gIHsgImVxLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMCB9LAotICB7ICJlcS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTAgfSwKLSAgeyAiZXEudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIwIH0sCi0gIHsgImVxMC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDIgfSwKLSAgeyAiZXEwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTAgfSwKLSAgeyAiZXEwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTggfSwKLSAgeyAiRkxUQURSIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTEgfSwKLSAgeyAiRkxURFRIIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTQgfSwKLSAgeyAiRkxURFRMIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTMgfSwKLSAgeyAiRkxUT1AiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMCB9LAotICB7ICJGTFRUQUciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMiB9LAotICB7ICJGUFNUIiwJVElDODBfT1BFUkFORF9DUiB8IDggfSwKLSAgeyAiZ2UuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDUgfSwKLSAgeyAiZ2UuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI1IH0sCi0gIHsgImdlLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNSB9LAotICB7ICJnZS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjUgfSwKLSAgeyAiZ2UwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMyB9LAotICB7ICJnZTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMSB9LAotICB7ICJnZTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxOSB9LAotICB7ICJndC5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMiB9LAotICB7ICJndC5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjIgfSwKLSAgeyAiZ3QuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDEyIH0sCi0gIHsgImd0LnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMiB9LAotICB7ICJndDAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxIH0sCi0gIHsgImd0MC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDkgfSwKLSAgeyAiZ3QwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTcgfSwKLSAgeyAiaGkuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDYgfSwKLSAgeyAiaGkuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE2IH0sCi0gIHsgImhpLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNiB9LAotICB7ICJocy5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgOSB9LAotICB7ICJocy5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTkgfSwKLSAgeyAiaHMudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI5IH0sCi0gIHsgImliLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyOCB9LAotICB7ICJJRSIsCVRJQzgwX09QRVJBTkRfQ1IgfCA2IH0sCi0gIHsgIklMUlUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMDAgfSwKLSAgeyAiaW4uZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI3IH0sCi0gIHsgIklOMFAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDAwIH0sCi0gIHsgIklOMVAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDAxIH0sCi0gIHsgIklOVFBFTiIsCVRJQzgwX09QRVJBTkRfQ1IgfCA0IH0sCi0gIHsgIklUQUcwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAwIH0sCi0gIHsgIklUQUcxIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAxIH0sCi0gIHsgIklUQUcxMCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwQSB9LAotICB7ICJJVEFHMTEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEIgfSwKLSAgeyAiSVRBRzEyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBDIH0sCi0gIHsgIklUQUcxMyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwRCB9LAotICB7ICJJVEFHMTQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEUgfSwKLSAgeyAiSVRBRzE1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBGIH0sCi0gIHsgIklUQUcyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAyIH0sCi0gIHsgIklUQUczIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAzIH0sCi0gIHsgIklUQUc0IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA0IH0sCi0gIHsgIklUQUc1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA1IH0sCi0gIHsgIklUQUc2IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA2IH0sCi0gIHsgIklUQUc3IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA3IH0sCi0gIHsgIklUQUc4IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA4IH0sCi0gIHsgIklUQUc5IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA5IH0sCi0gIHsgImxlLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAzIH0sCi0gIHsgImxlLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMyB9LAotICB7ICJsZS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTMgfSwKLSAgeyAibGUudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIzIH0sCi0gIHsgImxlMC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDYgfSwKLSAgeyAibGUwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTQgfSwKLSAgeyAibGUwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMjIgfSwKLSAgeyAibG8uYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDggfSwKLSAgeyAibG8uaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE4IH0sCi0gIHsgImxvLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyOCB9LAotICB7ICJscy5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNyB9LAotICB7ICJscy5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTcgfSwKLSAgeyAibHMudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI3IH0sCi0gIHsgImx0LmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA0IH0sCi0gIHsgImx0LmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNCB9LAotICB7ICJsdC5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTQgfSwKLSAgeyAibHQudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI0IH0sCi0gIHsgImx0MC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDQgfSwKLSAgeyAibHQwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTIgfSwKLSAgeyAibHQwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMjAgfSwKLSAgeyAiTUlQIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzEgfSwKLSAgeyAiTVBDIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzAgfSwKLSAgeyAibmUuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDEgfSwKLSAgeyAibmUuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIxIH0sCi0gIHsgIm5lLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMSB9LAotICB7ICJuZS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjEgfSwKLSAgeyAibmUwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNSB9LAotICB7ICJuZTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMyB9LAotICB7ICJuZTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMSB9LAotICB7ICJuZXYuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCAwIH0sCi0gIHsgIm5ldi5oIiwJVElDODBfT1BFUkFORF9DQyB8IDggfSwKLSAgeyAibmV2LnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTYgfSwKLSAgeyAib2IuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI5IH0sCi0gIHsgIm9yLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAzMSB9LAotICB7ICJvdS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjYgfSwKLSAgeyAiT1VUUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMDIgfSwKLSAgeyAiUEtUUkVRIiwJVElDODBfT1BFUkFORF9DUiB8IDB4RCB9LAotICB7ICJQUEVSUk9SIiwJVElDODBfT1BFUkFORF9DUiB8IDB4QSB9LAotICB7ICJyMCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMCB9LAotICB7ICJyMSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMSB9LAotICB7ICJyMTAiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDEwIH0sCi0gIHsgInIxMSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTEgfSwKLSAgeyAicjEyIiwJVElDODBfT1BFUkFORF9HUFIgfCAxMiB9LAotICB7ICJyMTMiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDEzIH0sCi0gIHsgInIxNCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTQgfSwKLSAgeyAicjE1IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNSB9LAotICB7ICJyMTYiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE2IH0sCi0gIHsgInIxNyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTcgfSwKLSAgeyAicjE4IiwJVElDODBfT1BFUkFORF9HUFIgfCAxOCB9LAotICB7ICJyMTkiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE5IH0sCi0gIHsgInIyIiwJVElDODBfT1BFUkFORF9HUFIgfCAyIH0sCi0gIHsgInIyMCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjAgfSwKLSAgeyAicjIxIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMSB9LAotICB7ICJyMjIiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIyIH0sCi0gIHsgInIyMyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjMgfSwKLSAgeyAicjI0IiwJVElDODBfT1BFUkFORF9HUFIgfCAyNCB9LAotICB7ICJyMjUiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI1IH0sCi0gIHsgInIyNiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjYgfSwKLSAgeyAicjI3IiwJVElDODBfT1BFUkFORF9HUFIgfCAyNyB9LAotICB7ICJyMjgiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI4IH0sCi0gIHsgInIyOSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjkgfSwKLSAgeyAicjMiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDMgfSwKLSAgeyAicjMwIiwJVElDODBfT1BFUkFORF9HUFIgfCAzMCB9LAotICB7ICJyMzEiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDMxIH0sCi0gIHsgInI0IiwJVElDODBfT1BFUkFORF9HUFIgfCA0IH0sCi0gIHsgInI1IiwJVElDODBfT1BFUkFORF9HUFIgfCA1IH0sCi0gIHsgInI2IiwJVElDODBfT1BFUkFORF9HUFIgfCA2IH0sCi0gIHsgInI3IiwJVElDODBfT1BFUkFORF9HUFIgfCA3IH0sCi0gIHsgInI4IiwJVElDODBfT1BFUkFORF9HUFIgfCA4IH0sCi0gIHsgInI5IiwJVElDODBfT1BFUkFORF9HUFIgfCA5IH0sCi0gIHsgIlNZU1NUSyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwIH0sCi0gIHsgIlNZU1RNUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIxIH0sCi0gIHsgIlRDT1VOVCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweEUgfSwKLSAgeyAiVFNDQUxFIiwJVElDODBfT1BFUkFORF9DUiB8IDB4RiB9LAotICB7ICJ1by5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMzAgfSwKLX07Ci0KLWNvbnN0IGludCB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzID0gc2l6ZW9mICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpIC8gc2l6ZW9mIChzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZSBpbiBOQU1FLCBzeW1ib2wgY2xhc3MKLSAgIGluIENMQVNTLCBhbmQgdHJhbnNsYXRlcyBpdCB0byBhIG51bWVyaWMgdmFsdWUsIHdoaWNoIGl0IHJldHVybnMuCi0KLSAgIElmIENMQVNTIGlzIHplcm8sIGFueSBzeW1ib2wgdGhhdCBtYXRjaGVzIE5BTUUgaXMgdHJhbnNsYXRlZC4gIElmCi0gICBDTEFTUyBpcyBub24temVybywgdGhlbiBvbmx5IGEgc3ltYm9sIHRoYXQgaGFzIGNsYXNzIENMQVNTIGlzCi0gICBtYXRjaGVkLgotCi0gICBJZiBubyB0cmFuc2xhdGlvbiBpcyBwb3NzaWJsZSwgaXQgcmV0dXJucyAtMSwgYSB2YWx1ZSBub3QgdXNlZCBieQotICAgYW55IHByZWRlZmluZWQgc3ltYm9sLiBOb3RlIHRoYXQgdGhlIHByZWRlZmluZWQgc3ltYm9sIGFycmF5IGlzCi0gICBwcmVzb3J0ZWQgY2FzZSBpbmRlcGVuZGVudGx5IGJ5IG5hbWUuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXJlIGFyZSBubwotICAgZHVwbGljYXRlIG5hbWVzIGluIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBhcnJheSwgd2hpY2ggaGFwcGVucyB0byBiZQotICAgdHJ1ZSBhdCB0aGUgbW9tZW50LgotCi0gKi8KLQotaW50Ci10aWM4MF9zeW1ib2xfdG9fdmFsdWUgKG5hbWUsIGNsYXNzKQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgY2xhc3M7Ci17Ci0gIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqcGRzcDsKLSAgaW50IGxvdyA9IDA7Ci0gIGludCBtaWRkbGU7Ci0gIGludCBoaWdoID0gdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9scyAtIDE7Ci0gIGludCBjbXA7Ci0gIGludCBydG52YWwgPSAtMTsKLQotICB3aGlsZSAobG93IDw9IGhpZ2gpCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JewotCSAgaGlnaCA9IG1pZGRsZSAtIDE7Ci0JfQotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQl7Ci0JICBsb3cgPSBtaWRkbGUgKyAxOwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgcGRzcCA9ICZ0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHNbbWlkZGxlXTsKLQkgIGlmICgoY2xhc3MgPT0gMCkgfHwgKGNsYXNzICYgUERTX1ZBTFVFIChwZHNwKSkpCi0JICAgIHsKLQkgICAgICBydG52YWwgPSBQRFNfVkFMVUUgKHBkc3ApOwotCSAgICB9Ci0JICAvKiBGb3Igbm93IHdlIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgbmFtZXMgKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAocnRudmFsKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHZhbHVlIFZBTCBhbmQgZmluZHMgYSBtYXRjaGluZyBwcmVkZWZpbmVkCi0gICBzeW1ib2wgdGhhdCBpcyBpbiB0aGUgb3BlcmFuZCBjbGFzcyBzcGVjaWZpZWQgYnkgQ0xBU1MuICBJZiBDTEFTUwotICAgaXMgemVybywgdGhlIGZpcnN0IG1hdGNoaW5nIHN5bWJvbCBpcyByZXR1cm5lZC4gKi8KLQotY29uc3QgY2hhciAqCi10aWM4MF92YWx1ZV90b19zeW1ib2wgKHZhbCwgY2xhc3MpCi0gICAgIGludCB2YWw7Ci0gICAgIGludCBjbGFzczsKLXsKLSAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOwotICBpbnQgaXZhbDsKLSAgY2hhciAqbmFtZTsKLQotICBuYW1lID0gTlVMTDsKLSAgZm9yIChwZHNwID0gdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzOwotICAgICAgIHBkc3AgPCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMgKyB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzOwotICAgICAgIHBkc3ArKykKLSAgICB7Ci0gICAgICBpdmFsID0gUERTX1ZBTFVFIChwZHNwKSAmIH5USUM4MF9PUEVSQU5EX01BU0s7Ci0gICAgICBpZiAoaXZhbCA9PSB2YWwpCi0JewotCSAgaWYgKChjbGFzcyA9PSAwKSB8fCAoY2xhc3MgJiBQRFNfVkFMVUUgKHBkc3ApKSkKLQkgICAgewotCSAgICAgIC8qIEZvdW5kIHRoZSBkZXNpcmVkIG1hdGNoICovCi0JICAgICAgbmFtZSA9IFBEU19OQU1FIChwZHNwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAobmFtZSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgc3ltYm9sIGluIHRoZSBwcmVkZWZpbmVkCi0gICBzeW1ib2wgdGFibGUgYWZ0ZXIgUERTUCwgb3IgTlVMTCBpZiBQRFNQIHBvaW50cyB0byB0aGUgbGFzdCBzeW1ib2wuICBJZgotICAgUERTUCBpcyBOVUxMLCBpdCByZXR1cm5zIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIHRhYmxlLiAgVGh1cyBpdCBjYW4gYmUKLSAgIHVzZWQgdG8gd2FsayB0aHJvdWdoIHRoZSB0YWJsZSBieSBmaXJzdCBjYWxsaW5nIGl0IHdpdGggTlVMTCBhbmQgdGhlbgotICAgY2FsbGluZyBpdCB3aXRoIGVhY2ggdmFsdWUgaXQgcmV0dXJuZWQgb24gdGhlIHByZXZpb3VzIGNhbGwsIHVudGlsIGl0Ci0gICByZXR1cm5zIE5VTEwuICovCi0KLWNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqCi10aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sIChwZHNwKQotICAgICBjb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKnBkc3A7Ci17Ci0gIGlmIChwZHNwID09IE5VTEwpCi0gICAgewotICAgICAgcGRzcCA9IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sczsKLSAgICB9Ci0gIGVsc2UgaWYgKHBkc3AgPj0gdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzICYmCi0JICAgcGRzcCA8IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyArIHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMgLSAxKQotICAgIHsKLSAgICAgIHBkc3ArKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwZHNwID0gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAocGRzcCk7Ci19Ci0KLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlLiAgVGhlIGZpZWxkcyBhcmU6Ci0KLQliaXRzLCBzaGlmdCwgaW5zZXJ0aW9uIGZ1bmN0aW9uLCBleHRyYWN0aW9uIGZ1bmN0aW9uLCBmbGFncwotICovCi0KLWNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kIHRpYzgwX29wZXJhbmRzW10gPQotewotCi0gIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBvcGVyYW5kcy4gICovCi0KLSNkZWZpbmUgVU5VU0VEICgwKQotICB7IDAsIDAsIDAsIDAsIDAgfSwKLQotICAvKiBTaG9ydCBzaWduZWQgaW1tZWRpYXRlIHZhbHVlIGluIGJpdHMgMTQtMC4gKi8KLQotI2RlZmluZSBTU0kgKFVOVVNFRCArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogU2hvcnQgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlIGluIGJpdHMgMTQtMCAqLwotCi0jZGVmaW5lIFNVSSAoU1NJICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgMCB9LAotCi0gIC8qIFNob3J0IHVuc2lnbmVkIGJpdGZpZWxkIGluIGJpdHMgMTQtMC4gIFdlIGRpc3Rpbmd1aXNoIHRoaXMKLSAgICAgZnJvbSBhIHJlZ3VsYXIgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlIG9ubHkgZm9yIHRoZSBjb252ZW5pZW5jZQotICAgICBvZiB0aGUgZGlzYXNzZW1ibGVyIGFuZCB0aGUgdXNlci4gKi8KLQotI2RlZmluZSBTVUJGIChTVUkgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JJVEZJRUxEIH0sCi0KLSAgLyogTG9uZyBzaWduZWQgaW1tZWRpYXRlIGluIGZvbGxvd2luZyAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIExTSSAoU1VCRiArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogTG9uZyB1bnNpZ25lZCBpbW1lZGlhdGUgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgTFVJIChMU0kgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCAwIH0sCi0KLSAgLyogTG9uZyB1bnNpZ25lZCBiaXRmaWVsZCBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQuICBXZSBkaXN0aW5ndWlzaAotICAgICB0aGlzIGZyb20gYSByZWd1bGFyIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZSBvbmx5IGZvciB0aGUKLSAgICAgY29udmVuaWVuY2Ugb2YgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdGhlIHVzZXIuICovCi0KLSNkZWZpbmUgTFVCRiAoTFVJICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CSVRGSUVMRCB9LAotCi0gIC8qIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIGluIGZvbGxvd2luZyAzMiBiaXQKLSAgICAgd29yZC4gKi8KLQotI2RlZmluZSBTUEZJIChMVUJGICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9GTE9BVCB9LAotCi0gIC8qIFJlZ2lzdGVyIGluIGJpdHMgNC0wICovCi0KLSNkZWZpbmUgUkVHXzAgKFNQRkkgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogRXZlbiByZWdpc3RlciBpbiBiaXRzIDQtMCAqLwotCi0jZGVmaW5lIFJFR18wX0UgKFJFR18wICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfRVZFTiB9LAotCi0gIC8qIFJlZ2lzdGVyIGluIGJpdHMgMjYtMjIgKi8KLQotI2RlZmluZSBSRUdfMjIgKFJFR18wX0UgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB9LAotCi0gIC8qIEV2ZW4gcmVnaXN0ZXIgaW4gYml0cyAyNi0yMiAqLwotCi0jZGVmaW5lIFJFR18yMl9FIChSRUdfMjIgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfRVZFTiB9LAotCi0gIC8qIFJlZ2lzdGVyIGluIGJpdHMgMzEtMjcgKi8KLQotI2RlZmluZSBSRUdfREVTVCAoUkVHXzIyX0UgKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB9LAotCi0gIC8qIEV2ZW4gcmVnaXN0ZXIgaW4gYml0cyAzMS0yNyAqLwotCi0jZGVmaW5lIFJFR19ERVNUX0UgKFJFR19ERVNUICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0VWRU4gfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciByZWdpc3RlciAoYTAtYTMpIHNwZWNpZmllZCBieSBiaXQgMTYgKE1TQikKLSAgICAgYW5kIGJpdCAxMSAoTFNCKSAqLwotICAvKiBGSVhNRSEgIE5lZWRzIHRvIHVzZSBmdW5jdGlvbnMgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IHRoZSByZWdpc3RlcgotICAgICBudW1iZXIgaW4gYml0cyAxNiBhbmQgMTEuICovCi0KLSNkZWZpbmUgUkVHX0ZQQSAoUkVHX0RFU1RfRSArIDEpCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9GUEEgfSwKLQotICAvKiBTaG9ydCBzaWduZWQgUEMgd29yZCBvZmZzZXQgaW4gYml0cyAxNC0wICovCi0KLSNkZWZpbmUgT0ZGX1NTX1BDIChSRUdfRlBBICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9QQ1JFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogTG9uZyBzaWduZWQgUEMgd29yZCBvZmZzZXQgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgT0ZGX1NMX1BDIChPRkZfU1NfUEMgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX1BDUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBTaG9ydCBzaWduZWQgYmFzZSByZWxhdGl2ZSBieXRlIG9mZnNldCBpbiBiaXRzIDE0LTAgKi8KLQotI2RlZmluZSBPRkZfU1NfQlIgKE9GRl9TTF9QQyArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQkFTRVJFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogTG9uZyBzaWduZWQgYmFzZSByZWxhdGl2ZSBieXRlIG9mZnNldCBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBPRkZfU0xfQlIgKE9GRl9TU19CUiArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQkFTRVJFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogTG9uZyBzaWduZWQgYmFzZSByZWxhdGl2ZSBieXRlIG9mZnNldCBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQKLSAgICAgd2l0aCBvcHRpb25hbCAiOnMiIG1vZGlmaWVyIGZsYWcgaW4gYml0IDExICovCi0KLSNkZWZpbmUgT0ZGX1NMX0JSX1NDQUxFRCAoT0ZGX1NMX0JSICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CQVNFUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfCBUSUM4MF9PUEVSQU5EX1NDQUxFRCB9LAotCi0gIC8qIEJJVE5VTSBpbiBiaXRzIDMxLTI3ICovCi0KLSNkZWZpbmUgQklUTlVNIChPRkZfU0xfQlJfU0NBTEVEICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CSVROVU0gfSwKLQotICAvKiBDb25kaXRpb24gY29kZSBpbiBiaXRzIDMxLTI3ICovCi0KLSNkZWZpbmUgQ0MgKEJJVE5VTSArIDEpCi0gIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQ0MgfSwKLQotICAvKiBDb250cm9sIHJlZ2lzdGVyIG51bWJlciBpbiBiaXRzIDE0LTAgKi8KLQotI2RlZmluZSBDUl9TSSAoQ0MgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0NSIH0sCi0KLSAgLyogQ29udHJvbCByZWdpc3RlciBudW1iZXIgaW4gbmV4dCAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIENSX0xJIChDUl9TSSArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQ1IgfSwKLQotICAvKiBBIGJhc2UgcmVnaXN0ZXIgaW4gYml0cyAyNi0yMiwgZW5jbG9zZWQgaW4gcGFyZW5zICovCi0KLSNkZWZpbmUgUkVHX0JBU0UgKENSX0xJICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX1BBUkVOUyB9LAotCi0gIC8qIEEgYmFzZSByZWdpc3RlciBpbiBiaXRzIDI2LTIyLCBlbmNsb3NlZCBpbiBwYXJlbnMsIHdpdGggb3B0aW9uYWwgIjptIgotICAgICBmbGFnIGluIGJpdCAxNyAoc2hvcnQgaW1tZWRpYXRlIGluc3RydWN0aW9ucyBvbmx5KSAqLwotCi0jZGVmaW5lIFJFR19CQVNFX01fU0kgKFJFR19CQVNFICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX1BBUkVOUyB8IFRJQzgwX09QRVJBTkRfTV9TSSB9LAotCi0gIC8qIEEgYmFzZSByZWdpc3RlciBpbiBiaXRzIDI2LTIyLCBlbmNsb3NlZCBpbiBwYXJlbnMsIHdpdGggb3B0aW9uYWwgIjptIgotICAgZmxhZyBpbiBiaXQgMTUgKGxvbmcgaW1tZWRpYXRlIGFuZCByZWdpc3RlciBpbnN0cnVjdGlvbnMgb25seSkgKi8KLQotI2RlZmluZSBSRUdfQkFTRV9NX0xJIChSRUdfQkFTRV9NX1NJICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX1BBUkVOUyB8IFRJQzgwX09QRVJBTkRfTV9MSSB9LAotCi0gIC8qIFNjYWxlZCByZWdpc3RlciBpbiBiaXRzIDQtMCwgd2l0aCBvcHRpb25hbCAiOnMiIG1vZGlmaWVyIGZsYWcgaW4gYml0IDExICovCi0KLSNkZWZpbmUgUkVHX1NDQUxFRCAoUkVHX0JBU0VfTV9MSSArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX1NDQUxFRCB9LAotCi0gIC8qIFVuc2lnbmVkIGltbWVkaWF0ZSBpbiBiaXRzIDQtMCwgdXNlZCBvbmx5IGZvciBzaGlmdCBpbnN0cnVjdGlvbnMgKi8KLQotI2RlZmluZSBST1RBVEUgKFJFR19TQ0FMRUQgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIDAgfSwKLQotICAvKiBVbnNpZ25lZCBpbW1lZGlhdGUgaW4gYml0cyA5LTUsIHVzZWQgb25seSBmb3Igc2hpZnQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEVORE1BU0sgKFJPVEFURSArIDEpCi0gIHsgNSwgNSwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9FTkRNQVNLIH0sCi0KLX07Ci0KLWNvbnN0IGludCB0aWM4MF9udW1fb3BlcmFuZHMgPSBzaXplb2YgKHRpYzgwX29wZXJhbmRzKS9zaXplb2YoKnRpYzgwX29wZXJhbmRzKTsKLQotDAotLyogTWFjcm9zIHVzZWQgdG8gZ2VuZXJhdGUgZW50cmllcyBmb3IgdGhlIG9wY29kZXMgdGFibGUuICovCi0KLSNkZWZpbmUgRklYTUUgMAotCi0vKiBTaG9ydC1JbW1lZGlhdGUgRm9ybWF0IEluc3RydWN0aW9ucyAtIGJhc2ljIG9wY29kZSAqLwotI2RlZmluZSBPUF9TSSh4KQkoKCh4KSAmIDB4N0YpIDw8IDE1KQotI2RlZmluZSBNQVNLX1NJCQlPUF9TSSgweDdGKQotCi0vKiBMb25nLUltbWVkaWF0ZSBGb3JtYXQgSW5zdHJ1Y3Rpb25zIC0gYmFzaWMgb3Bjb2RlICovCi0jZGVmaW5lIE9QX0xJKHgpCSgoKHgpICYgMHgzRkYpIDw8IDEyKQotI2RlZmluZSBNQVNLX0xJCQlPUF9MSSgweDNGRikKLQotLyogUmVnaXN0ZXIgRm9ybWF0IEluc3RydWN0aW9ucyAtIGJhc2ljIG9wY29kZSAqLwotI2RlZmluZSBPUF9SRUcoeCkJT1BfTEkoeCkJLyogRm9yIHJlYWRhYmlsaXR5ICovCi0jZGVmaW5lIE1BU0tfUkVHCU1BU0tfTEkJCS8qIEZvciByZWFkYWJpbGl0eSAqLwotCi0vKiBUaGUgJ24nIGJpdCBhdCBiaXQgMTAgKi8KLSNkZWZpbmUgbih4KQkJKCh4KSA8PCAxMCkKLQotLyogVGhlICdpJyBiaXQgYXQgYml0IDExICovCi0jZGVmaW5lIGkoeCkJCSgoeCkgPDwgMTEpCi0KLS8qIFRoZSAnRicgYml0IGF0IGJpdCAyNyAqLwotI2RlZmluZSBGKHgpCQkoKHgpIDw8IDI3KQotCi0vKiBUaGUgJ0UnIGJpdCBhdCBiaXQgMjcgKi8KLSNkZWZpbmUgRSh4KQkJKCh4KSA8PCAyNykKLQotLyogVGhlICdNJyBiaXQgYXQgYml0IDE1IGluIHJlZ2lzdGVyIGFuZCBsb25nIGltbWVkaWF0ZSBvcGNvZGVzICovCi0jZGVmaW5lIE1fUkVHKHgpCSgoeCkgPDwgMTUpCi0jZGVmaW5lIE1fTEkoeCkJCSgoeCkgPDwgMTUpCi0KLS8qIFRoZSAnTScgYml0IGF0IGJpdCAxNyBpbiBzaG9ydCBpbW1lZGlhdGUgb3Bjb2RlcyAqLwotI2RlZmluZSBNX1NJKHgpCQkoKHgpIDw8IDE3KQotCi0vKiBUaGUgJ1NaJyBmaWVsZCBhdCBiaXRzIDE0LTEzIGluIHJlZ2lzdGVyIGFuZCBsb25nIGltbWVkaWF0ZSBvcGNvZGVzICovCi0jZGVmaW5lIFNaX1JFRyh4KQkoKHgpIDw8IDEzKQotI2RlZmluZSBTWl9MSSh4KQkoKHgpIDw8IDEzKQotCi0vKiBUaGUgJ1NaJyBmaWVsZCBhdCBiaXRzIDE2LTE1IGluIHNob3J0IGltbWVkaWF0ZSBvcGNvZGVzICovCi0jZGVmaW5lIFNaX1NJKHgpCSgoeCkgPDwgMTUpCi0KLS8qIFRoZSAnRCcgKGRpcmVjdCBleHRlcm5hbCBtZW1vcnkgYWNjZXNzKSBiaXQgYXQgYml0IDEwIGluIGxvbmcgaW1tZWRpYXRlCi0gICBhbmQgcmVnaXN0ZXIgb3Bjb2Rlcy4gKi8KLSNkZWZpbmUgRCh4KQkJKCh4KSA8PCAxMCkKLQotLyogVGhlICdTJyAoc2NhbGUgb2Zmc2V0IGJ5IGRhdGEgc2l6ZSkgYml0IGF0IGJpdCAxMSBpbiBsb25nIGltbWVkaWF0ZQotICAgYW5kIHJlZ2lzdGVyIG9wY29kZXMuICovCi0jZGVmaW5lIFMoeCkJCSgoeCkgPDwgMTEpCi0KLS8qIFRoZSAnUEQnIGZpZWxkIGF0IGJpdHMgMTAtOSBpbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgUEQoeCkJCSgoeCkgPDwgOSkKLQotLyogVGhlICdQMicgZmllbGQgYXQgYml0cyA4LTcgaW4gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFAyKHgpCQkoKHgpIDw8IDcpCi0KLS8qIFRoZSAnUDEnIGZpZWxkIGF0IGJpdHMgNi01IGluIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBQMSh4KQkJKCh4KSA8PCA1KQotCi0vKiBUaGUgJ2EnIGZpZWxkIGF0IGJpdCAxNiBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfYTEoeCkJCSgoeCkgPDwgMTYpCi0KLS8qIFRoZSAnYScgZmllbGQgYXQgYml0IDExIGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9hMCh4KQkJKCh4KSA8PCAxMSkKLQotLyogVGhlICdtJyBmaWVsZCBhdCBiaXQgMTAgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX20oeCkJCSgoeCkgPDwgMTApCi0KLS8qIFRoZSAnUycgZmllbGQgYXQgYml0IDkgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX1MoeCkJCSgoeCkgPDwgOSkKLQotLyogVGhlICdaJyBmaWVsZCBhdCBiaXQgOCBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfWih4KQkJKCh4KSA8PCA4KQotCi0vKiBUaGUgJ3AnIGZpZWxkIGF0IGJpdCA2IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9wKHgpCQkoKHgpIDw8IDYpCi0KLS8qIFRoZSBvcGNvZGUgZmllbGQgYXQgYml0cyAyMS0xNyBmb3IgdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBPUF9WKHgpCQkoKHgpIDw8IDE3KQotI2RlZmluZSBNQVNLX1YJCU9QX1YoMHgxRikKLQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4gIEZvcm1hdHRlZCBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IG9uIGEgd2lkZSBzY3JlZW4uICBBbHNvLCBhbGwKLSBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbW5lbW9uaWMgYXJlIHNvcnRlZCBzbyB0aGF0IHRoZXkgYXJlIGFkamFjZW50IGluIHRoZSB0YWJsZSwKLSBhbGxvd2luZyB0aGUgdXNlIG9mIGEgaGFzaCB0YWJsZSB0byBsb2NhdGUgdGhlIGZpcnN0IG9mIGEgc2VxdWVuY2Ugb2Ygb3Bjb2RlcyB0aGF0IGhhdmUKLSBhIHBhcnRpY3VsYXIgbmFtZS4gIFRoZSBzaG9ydCBpbW1lZGlhdGUgZm9ybXMgYWxzbyBjb21lIGJlZm9yZSB0aGUgbG9uZyBpbW1lZGlhdGUgZm9ybXMKLSBzbyB0aGF0IHRoZSBhc3NlbWJsZXIgd2lsbCBwaWNrIHRoZSAiYmVzdCBmaXQiIGZvciB0aGUgc2l6ZSBvZiB0aGUgb3BlcmFuZCwgZXhjZXB0IGZvcgotIHRoZSBjYXNlIG9mIHRoZSBQQyByZWxhdGl2ZSBmb3Jtcywgd2hlcmUgdGhlIGxvbmcgZm9ybXMgY29tZSBmaXJzdCBhbmQgYXJlIHRoZSBkZWZhdWx0Ci0gZm9ybXMuICovCi0KLWNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgdGljODBfb3Bjb2Rlc1tdID0gewotCi0gIC8qIFRoZSAibm9wIiBpbnN0cnVjdGlvbiBpcyByZWFsbHkgInJkY3IgMCxyMCIuICBXZSBwdXQgaXQgZmlyc3Qgc28gdGhhdCB0aGlzCi0gICAgIHNwZWNpZmljIGJpdCBwYXR0ZXJuIHdpbGwgZ2V0IGRpc2Fzc2VtYmxlZCBhcyBhIG5vcCByYXRoZXIgdGhhbiBhbiByZGNyLiBUaGUKLSAgICAgbWFzayBvZiBhbGwgb25lcyBlbnN1cmVzIHRoYXQgdGhpcyB3aWxsIGhhcHBlbi4gKi8KLQotICB7Im5vcCIsCU9QX1NJKDB4NCksCX4wLAkJMCwJCXswfQkJCX0sCi0KLSAgLyogVGhlICJiciIgaW5zdHJ1Y3Rpb24gaXMgcmVhbGx5ICJiYnogdGFyZ2V0LHIwLDMxIi4gIFdlIHB1dCBpdCBmaXJzdCBzbyB0aGF0Ci0gICAgIHRoaXMgc3BlY2lmaWMgYml0IHBhdHRlcm4gd2lsbCBnZXQgZGlzYXNzZW1ibGVkIGFzIGEgYnIgcmF0aGVyIHRoYW4gYmJ6LiAqLwotCi0gIHsiYnIiLAlPUF9TSSgweDQ4KSwJMHhGRkZGODAwMCwJMCwJe09GRl9TU19QQ30JfSwKLSAgeyJiciIsCU9QX0xJKDB4MzkxKSwJMHhGRkZGRjAwMCwJMCwJe09GRl9TTF9QQ30JfSwKLSAgeyJiciIsCU9QX1JFRygweDM5MCksCTB4RkZGRkYwMDAsCTAsCXtSRUdfMH0JCX0sCi0gIHsiYnIuYSIsCU9QX1NJKDB4NDkpLAkweEZGRkY4MDAwLAkwLAl7T0ZGX1NTX1BDfQl9LAotICB7ImJyLmEiLAlPUF9MSSgweDM5MyksCTB4RkZGRkYwMDAsCTAsCXtPRkZfU0xfUEN9CX0sCi0gIHsiYnIuYSIsCU9QX1JFRygweDM5MiksCTB4RkZGRkYwMDAsCTAsCXtSRUdfMH0JCX0sCi0KLSAgLyogU2lnbmVkIGludGVnZXIgQUREICovCi0KLSAgeyJhZGQiLAlPUF9TSSgweDU4KSwJTUFTS19TSSwJMCwJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiYWRkIiwJT1BfTEkoMHgzQjEpLAlNQVNLX0xJLAkwLAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJhZGQiLAlPUF9SRUcoMHgzQjApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFVuc2lnbmVkIGludGVnZXIgQUREICovCi0KLSAgeyJhZGR1IiwJT1BfU0koMHg1OSksCU1BU0tfU0ksCTAsCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImFkZHUiLAlPUF9MSSgweDNCMyksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImFkZHUiLAlPUF9SRUcoMHgzQjIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgQU5EICovCi0KLSAgeyJhbmQiLAlPUF9TSSgweDExKSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kIiwJT1BfTEkoMHgzMjMpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQiLAlPUF9SRUcoMHgzMjIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50dCIsCU9QX1NJKDB4MTEpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudHQiLAlPUF9MSSgweDMyMyksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50dCIsCU9QX1JFRygweDMyMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBBTkQgd2l0aCBvbmVzIGNvbXBsZW1lbnQgb2YgYm90aCBzb3VyY2VzICovCi0KLSAgeyJhbmQuZmYiLAlPUF9TSSgweDE4KSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLmZmIiwJT1BfTEkoMHgzMzEpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQuZmYiLAlPUF9SRUcoMHgzMzApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgQU5EIHdpdGggb25lcyBjb21wbGVtZW50IG9mIHNvdXJjZSAxICovCi0KLSAgeyJhbmQuZnQiLAlPUF9TSSgweDE0KSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLmZ0IiwJT1BfTEkoMHgzMjkpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQuZnQiLAlPUF9SRUcoMHgzMjgpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgQU5EIHdpdGggb25lcyBjb21wbGVtZW50IG9mIHNvdXJjZSAyICovCi0KLSAgeyJhbmQudGYiLAlPUF9TSSgweDEyKSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnRmIiwJT1BfTEkoMHgzMjUpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudGYiLAlPUF9SRUcoMHgzMjQpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJyYW5jaCBCaXQgT25lIC0gbm9uYW5udWxsZWQgKi8KLQotICB7ImJibyIsCU9QX1NJKDB4NEEpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJvIiwJT1BfTEkoMHgzOTUpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJvIiwJT1BfUkVHKDB4Mzk0KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBCSVROVU19CQl9LAotCi0gIC8qIEJyYW5jaCBCaXQgT25lIC0gYW5udWxsZWQgKi8KLQotICB7ImJiby5hIiwJT1BfU0koMHg0QiksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYm8uYSIsCU9QX0xJKDB4Mzk3KSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJiby5hIiwJT1BfUkVHKDB4Mzk2KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBCSVROVU19CQl9LAotCi0gIC8qIEJyYW5jaCBCaXQgWmVybyAtIG5vbmFubnVsbGVkICovCi0KLSAgeyJiYnoiLAlPUF9TSSgweDQ4KSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJieiIsCU9QX0xJKDB4MzkxKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJieiIsCU9QX1JFRygweDM5MCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQklUTlVNfQkJfSwKLQotICAvKiBCcmFuY2ggQml0IFplcm8gLSBhbm51bGxlZCAqLwotCi0gIHsiYmJ6LmEiLAlPUF9TSSgweDQ5KSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJiei5hIiwJT1BfTEkoMHgzOTMpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJ6LmEiLAlPUF9SRUcoMHgzOTIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCi0KLSAgLyogQnJhbmNoIENvbmRpdGlvbmFsIC0gbm9uYW5udWxsZWQgKi8KLQotICB7ImJjbmQiLAlPUF9TSSgweDRDKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQ0N9CX0sCi0gIHsiYmNuZCIsCU9QX0xJKDB4Mzk5KSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQ0N9CX0sCi0gIHsiYmNuZCIsCU9QX1JFRygweDM5OCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQ0N9CX0sCi0KLSAgLyogQnJhbmNoIENvbmRpdGlvbmFsIC0gYW5udWxsZWQgKi8KLQotICB7ImJjbmQuYSIsCU9QX1NJKDB4NEQpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBDQ30JfSwKLSAgeyJiY25kLmEiLAlPUF9MSSgweDM5QiksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIENDfQl9LAotICB7ImJjbmQuYSIsCU9QX1JFRygweDM5QSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQ0N9CX0sCi0KLSAgLyogQnJhbmNoIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotICB7ImJyY3IiLAlPUF9TSSgweDYpLAlNQVNLX1NJLAkwLAl7Q1JfU0l9CX0sCi0gIHsiYnJjciIsCU9QX0xJKDB4MzBEKSwJTUFTS19MSSwJMCwJe0NSX0xJfQl9LAotICB7ImJyY3IiLAlPUF9SRUcoMHgzMEMpLAlNQVNLX1JFRywJMCwJe1JFR18wfQl9LAotCi0gIC8qIEJyYW5jaCBhbmQgc2F2ZSByZXR1cm4gLSBub25hbm51bGxlZCAqLwotCi0gIHsiYnNyIiwJT1BfU0koMHg0MCksCU1BU0tfU0ksCTAsCXtPRkZfU1NfUEMsIFJFR19ERVNUfQl9LAotICB7ImJzciIsCU9QX0xJKDB4MzgxKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR19ERVNUfQl9LAotICB7ImJzciIsCU9QX1JFRygweDM4MCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJyYW5jaCBhbmQgc2F2ZSByZXR1cm4gLSBhbm51bGxlZCAqLwotCi0gIHsiYnNyLmEiLAlPUF9TSSgweDQxKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR19ERVNUfQl9LAotICB7ImJzci5hIiwJT1BfTEkoMHgzODMpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHX0RFU1R9CX0sCi0gIHsiYnNyLmEiLAlPUF9SRUcoMHgzODIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBTZW5kIGNvbW1hbmQgKi8KLQotICB7ImNtbmQiLAlPUF9TSSgweDIpLAlNQVNLX1NJLAkwLCAJe1NVSX0JfSwKLSAgeyJjbW5kIiwJT1BfTEkoMHgzMDUpLAlNQVNLX0xJLAkwLCAJe0xVSX0JfSwKLSAgeyJjbW5kIiwJT1BfUkVHKDB4MzA0KSwJTUFTS19SRUcsCTAsCXtSRUdfMH0JfSwKLQotICAvKiBJbnRlZ2VyIGNvbXBhcmUgKi8KLQotICB7ImNtcCIsCU9QX1NJKDB4NTApLAlNQVNLX1NJLAkwLCAJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiY21wIiwJT1BfTEkoMHgzQTEpLAlNQVNLX0xJLAkwLCAJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiY21wIiwJT1BfUkVHKDB4M0EwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbHVzaCBkYXRhIGNhY2hlIHN1YmJsb2NrIC0gZG9uJ3QgY2xlYXIgc3ViYmxvY2sgcHJlc2V0IGZsYWcgKi8KLQotICB7ImRjYWNoZWMiLAlPUF9TSSgweDM4KSwJRigxKSB8IChNQVNLX1NJICAmIH5NX1NJKDEpKSwJCQkwLCB7U1NJLCBSRUdfQkFTRV9NX1NJfQkJfSwKLSAgeyJkY2FjaGVjIiwJT1BfTEkoMHgzNzEpLAlGKDEpIHwgKE1BU0tfTEkgICYgfk1fTEkoMSkpICB8IFMoMSkgfCBEKDEpLAkwLCB7TFNJLCBSRUdfQkFTRV9NX0xJfQkJfSwKLSAgeyJkY2FjaGVjIiwJT1BfUkVHKDB4MzcwKSwJRigxKSB8IChNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBTKDEpIHwgRCgxKSwJMCwge1JFR18wLCBSRUdfQkFTRV9NX0xJfQl9LAotCi0gIC8qIEZsdXNoIGRhdGEgY2FjaGUgc3ViYmxvY2sgLSBjbGVhciBzdWJibG9jayBwcmVzZXQgZmxhZyAqLwotCi0gIHsiZGNhY2hlZiIsCU9QX1NJKDB4MzgpICAgfCBGKDEpLAlGKDEpIHwgKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJCTAsIHtTU0ksIFJFR19CQVNFX01fU0l9CQl9LAotICB7ImRjYWNoZWYiLAlPUF9MSSgweDM3MSkgIHwgRigxKSwJRigxKSB8IChNQVNLX0xJICAmIH5NX0xJKDEpKSAgIHwgUygxKSB8IEQoMSksCTAsIHtMU0ksIFJFR19CQVNFX01fTEl9CQl9LAotICB7ImRjYWNoZWYiLAlPUF9SRUcoMHgzNzApIHwgRigxKSwJRigxKSB8IChNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBTKDEpIHwgRCgxKSwJMCwge1JFR18wLCBSRUdfQkFTRV9NX0xJfQl9LAotCi0gIC8qIERpcmVjdCBsb2FkIHNpZ25lZCBkYXRhIGludG8gcmVnaXN0ZXIgKi8KLQotICB7ImRsZCIsCU9QX0xJKDB4MzQ1KSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZCIsCU9QX1JFRygweDM0NCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkbGQuYiIsCU9QX0xJKDB4MzQxKSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZC5iIiwJT1BfUkVHKDB4MzQwKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRsZC5kIiwJT1BfTEkoMHgzNDcpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJkbGQuZCIsCU9QX1JFRygweDM0NikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAotICB7ImRsZC5oIiwJT1BfTEkoMHgzNDMpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkLmgiLAlPUF9SRUcoMHgzNDIpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogRGlyZWN0IGxvYWQgdW5zaWduZWQgZGF0YSBpbnRvIHJlZ2lzdGVyICovCi0KLSAgeyJkbGQudWIiLAlPUF9MSSgweDM1MSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkLnViIiwJT1BfUkVHKDB4MzUwKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkbGQudWgiLAlPUF9MSSgweDM1MykgIHwgRCgxKSwJKE1BU0tfTEkgICYgIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkLnVoIiwJT1BfUkVHKDB4MzUyKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBEaXJlY3Qgc3RvcmUgZGF0YSBpbnRvIG1lbW9yeSAqLwotCi0gIHsiZHN0IiwJT1BfTEkoMHgzNjUpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZHN0IiwJT1BfUkVHKDB4MzY0KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRzdC5iIiwJT1BfTEkoMHgzNjEpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZHN0LmIiLAlPUF9SRUcoMHgzNjApIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZHN0LmQiLAlPUF9MSSgweDM2NykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQl9LAotICB7ImRzdC5kIiwJT1BfUkVHKDB4MzY2KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsiZHN0LmgiLAlPUF9MSSgweDM2MykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkc3QuaCIsCU9QX1JFRygweDM2MikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBFbXVsYXRpb24gc3RvcCAqLwotCi0gIHsiZXN0b3AiLAlPUF9MSSgweDNGQyksCU1BU0tfTEksCTAsCQl7MH0JfSwKLQotICAvKiBFbXVsYXRpb24gdHJhcCAqLwotCi0gIHsiZXRyYXAiLAlPUF9TSSgweDEpICAgIHwgRSgxKSwJTUFTS19TSSAgfCBFKDEpLAkwLAl7U1VJfQl9LAotICB7ImV0cmFwIiwJT1BfTEkoMHgzMDMpICB8IEUoMSksCU1BU0tfTEkgIHwgRSgxKSwJMCwJe0xVSX0JfSwKLSAgeyJldHJhcCIsCU9QX1JFRygweDMwMikgfCBFKDEpLAlNQVNLX1JFRyB8IEUoMSksCTAsCXtSRUdfMH0JfSwKLQotICAvKiBGbG9hdGluZy1wb2ludCBhZGRpdGlvbiAqLwotCi0gIHsiZmFkZC5kZGQiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLmRzZCIsCU9QX1JFRygweDNFMCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNkZCIsCU9QX0xJKDB4M0UxKSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc2RkIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc3NkIiwJT1BfTEkoMHgzRTEpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc3NkIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNzcyIsCU9QX0xJKDB4M0UxKSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZmFkZC5zc3MiLAlPUF9SRUcoMHgzRTApIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBjb21wYXJlICovCi0KLSAgeyJmY21wLmRkIiwJT1BfUkVHKDB4M0VBKSB8IFBEKDApIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLmRzIiwJT1BfUkVHKDB4M0VBKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5zZCIsCU9QX0xJKDB4M0VCKSAgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5zZCIsCU9QX1JFRygweDNFQSkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuc3MiLAlPUF9MSSgweDNFQikgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLnNzIiwJT1BfUkVHKDB4M0VBKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IGRpdmlkZSAqLwotCi0gIHsiZmRpdi5kZGQiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LmRzZCIsCU9QX1JFRygweDNFNikgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNkZCIsCU9QX0xJKDB4M0U3KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc2RkIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc3NkIiwJT1BfTEkoMHgzRTcpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc3NkIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNzcyIsCU9QX0xJKDB4M0U3KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZmRpdi5zc3MiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBtdWx0aXBseSAqLwotCi0gIHsiZm1weS5kZGQiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LmRzZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LmlpaSIsCU9QX0xJKDB4M0U1KSAgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LmlpaSIsCU9QX1JFRygweDNFNCkgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkuc2RkIiwJT1BfTEkoMHgzRTUpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5zZGQiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5zc2QiLAlPUF9MSSgweDNFNSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5zc2QiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuc3NzIiwJT1BfTEkoMHgzRTUpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LnNzcyIsCU9QX1JFRygweDNFNCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkudXV1IiwJT1BfTEkoMHgzRTUpICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkudXV1IiwJT1BfUkVHKDB4M0U0KSB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQ29udmVydC9Sb3VuZCB0byBNaW51cyBJbmZpbml0eSAqLwotCi0gIHsiZnJuZG0uZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMykgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMykgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMykgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMykgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigzKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMykgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMykgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0udXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMykgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIENvbnZlcnQvUm91bmQgdG8gTmVhcmVzdCAqLwotCi0gIHsiZnJuZG4uZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4udXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIENvbnZlcnQvUm91bmQgdG8gUG9zaXRpdmUgSW5maW5pdHkgKi8KLQotICB7ImZybmRwLmRkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5kaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLmRzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuZHUiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5pZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5pZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLmlzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMikgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5pcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuc2QiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigyKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5zaSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnNpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnNzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc3MiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigyKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc3UiLAlPUF9MSSgweDNFOSkgIHwgUEQoMykgfCBQMigyKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC51ZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC51ZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLnVzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMikgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC51cyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBDb252ZXJ0L1JvdW5kIHRvIFplcm8gKi8KLQotICB7ImZybmR6LmRkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5kaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LmRzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouZHUiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5pZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5pZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LmlzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5pcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouc2QiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5zaSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgyKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnNpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnNzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc3MiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc3UiLAlPUF9MSSgweDNFOSkgIHwgUEQoMykgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei51ZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei51ZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LnVzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei51cyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBzcXVhcmUgcm9vdCAqLwotCi0gIHsiZnNxcnQuZGQiLAlPUF9SRUcoMHgzRUUpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZzcXJ0LnNkIiwJT1BfTEkoMHgzRUYpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmc3FydC5zZCIsCU9QX1JFRygweDNFRSkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZzcXJ0LnNzIiwJT1BfTEkoMHgzRUYpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnNxcnQuc3MiLAlPUF9SRUcoMHgzRUUpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgc3VidHJhY3Rpb24gKi8KLQotICB7ICJmc3ViLmRkZCIsCU9QX1JFRygweDNFMikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLmRzZCIsCU9QX1JFRygweDNFMikgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zZGQiLAlPUF9MSSgweDNFMykgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zZGQiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc3NkIiwJT1BfTEkoMHgzRTMpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNzZCIsCU9QX1JFRygweDNFMikgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc3NzIiwJT1BfTEkoMHgzRTMpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyAiZnN1Yi5zc3MiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBJbGxlZ2FsIGluc3RydWN0aW9ucyAqLwotCi0gIHsiaWxsb3AwIiwJT1BfU0koMHgwKSwJTUFTS19TSSwJMCwJezB9CX0sCi0gIHsiaWxsb3BGIiwJMHgxRkYgPDwgMTMsCTB4MUZGIDw8IDEzLAkwLAl7MH0JfSwKLQotICAvKiBKdW1wIGFuZCBzYXZlIHJldHVybiAqLwotCi0gIHsianNyIiwJT1BfU0koMHg0NCksCU1BU0tfU0ksCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IiLAlPUF9MSSgweDM4OSksCU1BU0tfTEksCTAsCXtPRkZfU0xfQlIsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IiLAlPUF9SRUcoMHgzODgpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyLmEiLAlPUF9TSSgweDQ1KSwJTUFTS19TSSwJMCwJe09GRl9TU19CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7Impzci5hIiwJT1BfTEkoMHgzOEIpLAlNQVNLX0xJLAkwLAl7T0ZGX1NMX0JSLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyLmEiLAlPUF9SRUcoMHgzOEEpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0KLSAgLyogTG9hZCBTaWduZWQgRGF0YSBJbnRvIFJlZ2lzdGVyICovCi0KLSAgeyJsZCIsCU9QX1NJKDB4MjIpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkIiwJT1BfTEkoMHgzNDUpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQiLAlPUF9SRUcoMHgzNDQpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQuYiIsCU9QX1NJKDB4MjApLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLmIiLAlPUF9MSSgweDM0MSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZC5iIiwJT1BfUkVHKDB4MzQwKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLmQiLAlPUF9TSSgweDIzKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUX0V9CQl9LAotICB7ImxkLmQiLAlPUF9MSSgweDM0NykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQl9LAotICB7ImxkLmQiLAlPUF9SRUcoMHgzNDYpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJsZC5oIiwJT1BfU0koMHgyMSksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQuaCIsCU9QX0xJKDB4MzQzKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkLmgiLAlPUF9SRUcoMHgzNDIpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogTG9hZCBVbnNpZ25lZCBEYXRhIEludG8gUmVnaXN0ZXIgKi8KLQotICB7ImxkLnViIiwJT1BfU0koMHgyOCksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQudWIiLAlPUF9MSSgweDM1MSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZC51YiIsCU9QX1JFRygweDM1MCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC51aCIsCU9QX1NJKDB4MjkpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLnVoIiwJT1BfTEkoMHgzNTMpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQudWgiLAlPUF9SRUcoMHgzNTIpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogTGVmdG1vc3Qgb25lICovCi0KLSAgeyJsbW8iLAlPUF9MSSgweDNGMCksCU1BU0tfTEksCTAsCXtSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgbG9naWNhbCBPUi4gIE5vdGUgdGhhdCAib3IudHQiIGFuZCAib3IiIGFyZSB0aGUgc2FtZSBpbnN0cnVjdGlvbnMuICovCi0KLSAgeyJvci5mZiIsCU9QX1NJKDB4MUUpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci5mZiIsCU9QX0xJKDB4MzNEKSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IuZmYiLAlPUF9SRUcoMHgzM0MpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7Im9yLmZ0IiwJT1BfU0koMHgxRCksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLmZ0IiwJT1BfTEkoMHgzM0IpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci5mdCIsCU9QX1JFRygweDMzQSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsib3IudGYiLAlPUF9TSSgweDFCKSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IudGYiLAlPUF9MSSgweDMzNyksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLnRmIiwJT1BfUkVHKDB4MzM2KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJvci50dCIsCU9QX1NJKDB4MTcpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci50dCIsCU9QX0xJKDB4MzJGKSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IudHQiLAlPUF9SRUcoMHgzMkUpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7Im9yIiwJT1BfU0koMHgxNyksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yIiwJT1BfTEkoMHgzMkYpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvciIsCU9QX1JFRygweDMyRSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogUmVhZCBDb250cm9sIFJlZ2lzdGVyICovCi0KLSAgeyJyZGNyIiwJT1BfU0koMHg0KSwJTUFTS19TSSAgfCAoMHgxRiA8PCAyMiksCTAsCXtDUl9TSSwgUkVHX0RFU1R9CX0sCi0gIHsicmRjciIsCU9QX0xJKDB4MzA5KSwJTUFTS19MSSAgfCAoMHgxRiA8PCAyMiksCTAsCXtDUl9MSSwgUkVHX0RFU1R9CX0sCi0gIHsicmRjciIsCU9QX1JFRygweDMwOCksCU1BU0tfUkVHIHwgKDB4MUYgPDwgMjIpLAkwLAl7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIFJpZ2h0bW9zdCBvbmUgKi8KLQotICB7InJtbyIsCU9QX0xJKDB4M0YyKSwJTUFTS19MSSwJMCwJCXtSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNoaWZ0IFJlZ2lzdGVyIExlZnQgLSBub3RlIHRoYXQgcm90bCwgc2hsLCBhbmQgaW5zIGFyZSBhbGwgYWx0ZXJuYXRlIG5hbWVzIGZvciBvbmUgb2YgdGhlIHNoaWZ0IGluc3RydWN0aW9ucy4KLSAgICAgVGhleSBhcHBlYXIgcHJpb3IgdG8gdGhlaXIgc2wgZXF1aXZhbGVudCBzbyB0aGF0IHRoZXkgd2lsbCBiZSBkaWFzc2VtYmxlZCBhcyB0aGUgYWx0ZXJuYXRlIG5hbWUuICovCi0KLQotICB7ImlucyIsCU9QX1JFRygweDMxRSkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImlucyIsCU9QX1NJKDB4RikgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJyb3RsIiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsicm90bCIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzaGwiLAlPUF9SRUcoMHgzMUMpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2hsIiwJT1BfU0koMHhFKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5kbSIsCU9QX1JFRygweDMxMikgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5kbSIsCU9QX1NJKDB4OSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmR6IiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmR6IiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5lbSIsCU9QX1JFRygweDMxOCkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5lbSIsCU9QX1NJKDB4QykgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZXMiLAlPUF9SRUcoMHgzMUEpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmV6IiwJT1BfUkVHKDB4MzE2KSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmV6IiwJT1BfU0koMHhCKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5pbSIsCU9QX1JFRygweDMxRSkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5pbSIsCU9QX1NJKDB4RikgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuaXoiLAlPUF9SRUcoMHgzMUMpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNoaWZ0IFJlZ2lzdGVyIExlZnQgV2l0aCBJbnZlcnRlZCBFbmRtYXNrICovCi0KLSAgeyJzbGkuZG0iLAlPUF9SRUcoMHgzMTIpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZG0iLAlPUF9TSSgweDkpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5kcyIsCU9QX1JFRygweDMxNCkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5kcyIsCU9QX1NJKDB4QSkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmR6IiwJT1BfUkVHKDB4MzEwKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmR6IiwJT1BfU0koMHg4KSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZW0iLAlPUF9SRUcoMHgzMTgpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZW0iLAlPUF9TSSgweEMpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5lcyIsCU9QX1JFRygweDMxQSkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5lcyIsCU9QX1NJKDB4RCkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmV6IiwJT1BfUkVHKDB4MzE2KSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmV6IiwJT1BfU0koMHhCKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuaW0iLAlPUF9SRUcoMHgzMUUpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuaW0iLAlPUF9TSSgweEYpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5peiIsCU9QX1JFRygweDMxQykgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5peiIsCU9QX1NJKDB4RSkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2hpZnQgUmVnaXN0ZXIgUmlnaHQgLSBub3RlIHRoYXQgZXh0cywgZXh0dSwgcm90ciwgc3JhLCBhbmQgc3JsIGFyZSBhbGwgYWx0ZXJuYXRlIG5hbWVzIGZvciBvbmUgb2YgdGhlIHNoaWZ0IGluc3RydWN0aW9ucy4KLSAgICAgVGhleSBhcHBlYXIgcHJpb3IgdG8gdGhlaXIgc3IgZXF1aXZhbGVudCBzbyB0aGF0IHRoZXkgd2lsbCBiZSBkaWFzc2VtYmxlZCBhcyB0aGUgYWx0ZXJuYXRlIG5hbWUuICovCi0KLSAgeyJleHRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZXh0cyIsCU9QX1NJKDB4QSkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZXh0dSIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImV4dHUiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InJvdHIiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJyb3RyIiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyYSIsCU9QX1JFRygweDMxQSkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyYSIsCU9QX1NJKDB4RCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JsIiwJT1BfUkVHKDB4MzE2KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JsIiwJT1BfU0koMHhCKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5kbSIsCU9QX1JFRygweDMxMikgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5kcyIsCU9QX1JFRygweDMxNCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmRzIiwJT1BfU0koMHhBKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5keiIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmR6IiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5lbSIsCU9QX1JFRygweDMxOCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5lcyIsCU9QX1JFRygweDMxQSkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmVzIiwJT1BfU0koMHhEKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5leiIsCU9QX1JFRygweDMxNikgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmV6IiwJT1BfU0koMHhCKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5pbSIsCU9QX1JFRygweDMxRSkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5peiIsCU9QX1JFRygweDMxQykgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLml6IiwJT1BfU0koMHhFKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTaGlmdCBSZWdpc3RlciBSaWdodCBXaXRoIEludmVydGVkIEVuZG1hc2sgKi8KLQotICB7InNyaS5kbSIsCU9QX1JFRygweDMxMikgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5kbSIsCU9QX1NJKDB4OSkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmRzIiwJT1BfU0koMHhBKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5lbSIsCU9QX1JFRygweDMxOCkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5lbSIsCU9QX1NJKDB4QykgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmVzIiwJT1BfU0koMHhEKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5pbSIsCU9QX1JFRygweDMxRSkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5pbSIsCU9QX1NJKDB4RikgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLml6IiwJT1BfU0koMHhFKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTdG9yZSBEYXRhIGludG8gTWVtb3J5ICovCi0KLSAgeyJzdCIsCU9QX1NJKDB4MzIpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwgCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJzdCIsCU9QX0xJKDB4MzY1KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7InN0IiwJT1BfUkVHKDB4MzY0KSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7InN0LmIiLAlPUF9TSSgweDMwKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsIAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QuYiIsCU9QX0xJKDB4MzYxKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7InN0LmIiLAlPUF9SRUcoMHgzNjApIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QuZCIsCU9QX1NJKDB4MzMpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwgCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUX0V9CQl9LAotICB7InN0LmQiLAlPUF9MSSgweDM2NykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQl9LAotICB7InN0LmQiLAlPUF9SRUcoMHgzNjYpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJzdC5oIiwJT1BfU0koMHgzMSksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7InN0LmgiLAlPUF9MSSgweDM2MykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJzdC5oIiwJT1BfUkVHKDB4MzYyKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIFNpZ25lZCBJbnRlZ2VyIFN1YnRyYWN0ICovCi0KLSAgeyJzdWIiLAlPUF9TSSgweDVBKSwJTUFTS19TSSwJMCwgCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7InN1YiIsCU9QX0xJKDB4M0I1KSwJTUFTS19MSSwJMCwJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsic3ViIiwJT1BfUkVHKDB4M0I0KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBVbnNpZ25lZCBJbnRlZ2VyIFN1YnRyYWN0ICovCi0KLSAgeyJzdWJ1IiwJT1BfU0koMHg1QiksCU1BU0tfU0ksCTAsIAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJzdWJ1IiwJT1BfTEkoMHgzQjcpLAlNQVNLX0xJLAkwLAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJzdWJ1IiwJT1BfUkVHKDB4M0I2KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBXcml0ZSBDb250cm9sIFJlZ2lzdGVyCi0gICAgIElzIGEgc3BlY2lhbCBmb3JtIG9mIHRoZSAic3djciIgaW5zdHJ1Y3Rpb24gc28gY29tZXMgYmVmb3JlIGl0IGluIHRoZSB0YWJsZS4gKi8KLQotICB7IndyY3IiLAlPUF9TSSgweDUpLAlNQVNLX1NJIHwgKDB4MUYgPDwgMjcpLAkJMCwJe0NSX1NJLCBSRUdfMjJ9CX0sCi0gIHsid3JjciIsCU9QX0xJKDB4MzBCKSwJTUFTS19MSSB8ICgweDFGIDw8IDI3KSwJCTAsCXtDUl9MSSwgUkVHXzIyfQl9LAotICB7IndyY3IiLAlPUF9SRUcoMHgzMEEpLAlNQVNLX1JFRyB8ICgweDFGIDw8IDI3KSwJMCwJe1JFR18wLCBSRUdfMjJ9CX0sCi0KLSAgLyogU3dhcCBDb250cm9sIFJlZ2lzdGVyICovCi0KLSAgeyJzd2NyIiwJT1BfU0koMHg1KSwJTUFTS19TSSwJMCwJe0NSX1NJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InN3Y3IiLAlPUF9MSSgweDMwQiksCU1BU0tfTEksCTAsCXtDUl9MSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzd2NyIiwJT1BfUkVHKDB4MzBBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBUcmFwICovCi0KLSAgeyJ0cmFwIiwJT1BfU0koMHgxKSAgICB8IEUoMCksCU1BU0tfU0kgIHwgRSgxKSwJMCwJe1NVSX0JfSwKLSAgeyJ0cmFwIiwJT1BfTEkoMHgzMDMpICB8IEUoMCksCU1BU0tfTEkgIHwgRSgxKSwJMCwJe0xVSX0JfSwKLSAgeyJ0cmFwIiwJT1BfUkVHKDB4MzAyKSB8IEUoMCksCU1BU0tfUkVHIHwgRSgxKSwJMCwJe1JFR18wfQl9LAotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBBZGQgKi8KLQotICB7InZhZGQuZGQiLAlPUF9SRUcoMHgzQzApIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZhZGQuc2QiLAlPUF9MSSgweDNDMSkgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZhZGQuc2QiLAlPUF9SRUcoMHgzQzApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2YWRkLnNzIiwJT1BfTEkoMHgzQzEpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1NQRkksIFJFR18yMiwgUkVHXzIyfQl9LAotICB7InZhZGQuc3MiLAlPUF9SRUcoMHgzQzApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMiwgUkVHXzIyfQl9LAotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBNdWx0aXBseSBhbmQgQWRkIHRvIEFjY3VtdWxhdG9yIEZJWE1FISBUaGlzIGlzIG5vdCB5ZXQgZnVsbHkgaW1wbGVtZW50ZWQuCi0gICBGcm9tIHRoZSBkb2N1bWVudGF0aW9uIHRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gd2F5IHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgb3Bjb2RlcyBmb3IKLSAgIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgcmVnaXN0ZXIgZGVzdGluYXRpb25zIGFuZCBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIGFjY3VtdWxhdG9yIGRlc3RpbmF0aW9ucy4KLSAgIEZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBpcyBuZWNlc3NhcnkuICBTaW5jZSB0aGlzIGlzbid0IGNyaXRpY2FsIHRvIGdldHRpbmcgYSBUSUM4MCB0b29sY2hhaW4gdXAKLSAgIGFuZCBydW5uaW5nLCBpdCBpcyBkZWZlcmVkIHVudGlsIGxhdGVyLiAqLwotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBNdWx0aXBseQotICAgTm90ZTogSWYgcjAgaXMgaW4gdGhlIGRlc3RpbmF0aW9uIHJlZywgdGhlbiB0aGlzIGlzIGEgInZlY3RvciBub3AiIGluc3RydWN0aW9uLiAqLwotCi0gIHsidm1weS5kZCIsCU9QX1JFRygweDNDNCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR18yMl9FfSB9LAotICB7InZtcHkuc2QiLAlPUF9MSSgweDNDNSkgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1NQRkksIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2bXB5LnNkIiwJT1BfUkVHKDB4M0M0KSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtSRUdfMCwgUkVHXzIyX0UsIFJFR18yMl9FfSB9LAotICB7InZtcHkuc3MiLAlPUF9MSSgweDNDNSkgIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1NQRkksIFJFR18yMiwgUkVHXzIyfQl9LAotICB7InZtcHkuc3MiLAlPUF9SRUcoMHgzQzQpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1JFR18wLCBSRUdfMjIsIFJFR18yMn0gfSwKLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgTXVsdGlwbHkgYW5kIFN1YnRyYWN0IGZyb20gQWNjdW11bGF0b3IKLSAgICAgRklYTUU6IFNlZSBub3RlIGFib3ZlIGZvciB2bWFjIGluc3RydWN0aW9uICovCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IFN1YnRyYWN0IEFjY3VtdWxhdG9yIEZyb20gU291cmNlCi0gICAgIEZJWE1FOiBTZWUgbm90ZSBhYm92ZSBmb3Igdm1hYyBpbnN0cnVjdGlvbiAqLwotCi0gIC8qIFZlY3RvciBSb3VuZCBXaXRoIEZsb2F0aW5nLVBvaW50IElucHV0Ci0gICAgIEZJWE1FOiBTZWUgbm90ZSBhYm92ZSBmb3Igdm1hYyBpbnN0cnVjdGlvbiAqLwotCi0gIC8qIFZlY3RvciBSb3VuZCB3aXRoIEludGVnZXIgSW5wdXQgKi8KLQotICB7InZybmQuaWQiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xTSSwgUkVHXzIyX0V9fSwKLSAgeyJ2cm5kLmlkIiwJT1BfUkVHICgweDNDQSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfMCwgUkVHXzIyX0V9fSwKLSAgeyJ2cm5kLmlzIiwJT1BfTEkgKDB4M0NCKSAgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtMU0ksIFJFR18yMn19LAotICB7InZybmQuaXMiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJ9fSwKLSAgeyJ2cm5kLnVkIiwJT1BfTEkgKDB4M0NCKSAgfCBQMigxKSB8IFAxKDEpLAlNQVNLX0xJICB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtMVUksIFJFR18yMl9FfX0sCi0gIHsidnJuZC51ZCIsCU9QX1JFRyAoMHgzQ0EpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7UkVHXzAsIFJFR18yMl9FfX0sCi0gIHsidnJuZC51cyIsCU9QX0xJICgweDNDQikgIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19MSSAgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7TFVJLCBSRUdfMjJ9fSwKLSAgeyJ2cm5kLnVzIiwJT1BfUkVHICgweDNDQSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfMCwgUkVHXzIyfX0sCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IFN1YnRyYWN0ICovCi0KLSAgeyJ2c3ViLmRkIiwJT1BfUkVHKDB4M0MyKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wX0UsIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2c3ViLnNkIiwJT1BfTEkoMHgzQzMpICB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1NQRkksIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2c3ViLnNkIiwJT1BfUkVHKDB4M0MyKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidnN1Yi5zcyIsCU9QX0xJKDB4M0MzKSAgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtTUEZJLCBSRUdfMjIsIFJFR18yMn0JfSwKLSAgeyJ2c3ViLnNzIiwJT1BfUkVHKDB4M0MyKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wLCBSRUdfMjIsIFJFR18yMn0JfSwKLQotICAvKiBWZWN0b3IgTG9hZCBEYXRhIEludG8gUmVnaXN0ZXIgLSBOb3RlIHRoYXQgdGhlIHZlY3RvciBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyBjb21lIGFmdGVyIHRoZSBvdGhlcgotICAgdmVjdG9yIGluc3RydWN0aW9ucyBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBhbHdheXMgcHJpbnQgdGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gc2Vjb25kIGZvcgotICAgdmVjdG9yIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgdHdvIGluc3RydWN0aW9ucyBpbiB0aGUgc2FtZSBvcGNvZGUuICovCi0KLSAgeyJ2bGQwLmQiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDApLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUX0V9IH0sCi0gIHsidmxkMC5zIiwJT1BfVigweDFFKSB8IFZfbSgxKSB8IFZfUygwKSB8IFZfcCgwKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVH0gfSwKLSAgeyJ2bGQxLmQiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUX0V9IH0sCi0gIHsidmxkMS5zIiwJT1BfVigweDFFKSB8IFZfbSgxKSB8IFZfUygwKSB8IFZfcCgxKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVH0gfSwKLQotICAvKiBWZWN0b3IgU3RvcmUgRGF0YSBJbnRvIE1lbW9yeSAtIE5vdGUgdGhhdCB0aGUgdmVjdG9yIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zIGNvbWUgYWZ0ZXIgdGhlIG90aGVyCi0gICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGFsd2F5cyBwcmludCB0aGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiBzZWNvbmQgZm9yCi0gICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSB0d28gaW5zdHJ1Y3Rpb25zIGluIHRoZSBzYW1lIG9wY29kZS4gKi8KLQotICB7InZzdC5kIiwJT1BfVigweDFFKSB8IFZfbSgwKSB8IFZfUygxKSB8IFZfcCgxKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVF9FfSB9LAotICB7InZzdC5zIiwJT1BfVigweDFFKSB8IFZfbSgwKSB8IFZfUygwKSB8IFZfcCgxKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVH0gfSwKLQotICB7Inhub3IiLAlPUF9TSSgweDE5KSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0gIHsieG5vciIsCU9QX0xJKDB4MzMzKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0gIHsieG5vciIsCU9QX1JFRygweDMzMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0KLSAgeyJ4b3IiLAlPUF9TSSgweDE2KSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0gIHsieG9yIiwJT1BfTEkoMHgzMkQpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLSAgeyJ4b3IiLAlPUF9SRUcoMHgzMkMpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotCi19OwotCi1jb25zdCBpbnQgdGljODBfbnVtX29wY29kZXMgPSBzaXplb2YgKHRpYzgwX29wY29kZXMpIC8gc2l6ZW9mICh0aWM4MF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL29wY29kZXMvdjg1MC1kaXMuYyBiL29wY29kZXMvdjg1MC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwNjI1Yi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3Y4NTAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgVjg1MCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS92ODUwLmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHY4NTBfcmVnX25hbWVzW10gPQoteyAicjAiLCAicjEiLCAicjIiLCAic3AiLCAiZ3AiLCAicjUiLCAicjYiLCAicjciLCAKLSAgInI4IiwgInI5IiwgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgCi0gICJyMTYiLCAicjE3IiwgInIxOCIsICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwgCi0gICJyMjQiLCAicjI1IiwgInIyNiIsICJyMjciLCAicjI4IiwgInIyOSIsICJlcCIsICJscCIgfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHY4NTBfc3JlZ19uYW1lc1tdID0KLXsgImVpcGMiLCAiZWlwc3ciLCAiZmVwYyIsICJmZXBzdyIsICJlY3IiLCAicHN3IiwgInNyNiIsICJzcjciLCAKLSAgInNyOCIsICJzcjkiLCAic3IxMCIsICJzcjExIiwgInNyMTIiLCAic3IxMyIsICJzcjE0IiwgInNyMTUiLAotICAiY3RwYyIsICJjdHBzdyIsICJkYnBjIiwgImRicHN3IiwgImN0YnAiLCAic3IyMSIsICJzcjIyIiwgInNyMjMiLCAKLSAgInNyMjQiLCAic3IyNSIsICJzcjI2IiwgInNyMjciLCAic3IyOCIsICJzcjI5IiwgInNyMzAiLCAic3IzMSIsCi0gICJzcjE2IiwgInNyMTciLCAic3IxOCIsICJzcjE5IiwgInNyMjAiLCAic3IyMSIsICJzcjIyIiwgInNyMjMiLCAKLSAgInNyMjQiLCAic3IyNSIsICJzcjI2IiwgInNyMjciLCAic3IyOCIsICJzcjI5IiwgInNyMzAiLCAic3IzMSIgfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHY4NTBfY2NfbmFtZXNbXSA9Ci17ICJ2IiwgImMvbCIsICJ6IiwgIm5oIiwgInMvbiIsICJ0IiwgImx0IiwgImxlIiwgCi0gICJudiIsICJuYy9ubCIsICJueiIsICJoIiwgIm5zL3AiLCAic2EiLCAiZ2UiLCAiZ3QiIH07Ci0KLXN0YXRpYyBpbnQKLWRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci17Ci0gIHN0cnVjdCB2ODUwX29wY29kZSAqICAgICAgICAgIG9wID0gKHN0cnVjdCB2ODUwX29wY29kZSAqKXY4NTBfb3Bjb2RlczsKLSAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqICAgb3BlcmFuZDsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAwOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgCXNob3J0X29wID0gKChpbnNuICYgMHgwNjAwKSAhPSAweDA2MDApOwotICBpbnQJCQkJYnl0ZXNfcmVhZDsKLSAgaW50CQkJCXRhcmdldF9wcm9jZXNzb3I7Ci0gIAotICAvKiBTcGVjaWFsIGNhc2U6IDMyIGJpdCBNT1YgKi8KLSAgaWYgKChpbnNuICYgMHhmZmUwKSA9PSAweDA2MjApCi0gICAgc2hvcnRfb3AgPSB0cnVlOwotICAKLSAgYnl0ZXNfcmVhZCA9IHNob3J0X29wID8gMiA6IDQ7Ci0gIAotICAvKiBJZiB0aGlzIGlzIGEgdHdvIGJ5dGUgaW5zbiwgdGhlbiBtYXNrIG9mZiB0aGUgaGlnaCBiaXRzLiAqLwotICBpZiAoc2hvcnRfb3ApCi0gICAgaW5zbiAmPSAweGZmZmY7Ci0KLSAgc3dpdGNoIChpbmZvLT5tYWNoKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRhcmdldF9wcm9jZXNzb3IgPSBQUk9DRVNTT1JfVjg1MDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF92ODUwZToKLSAgICAgIHRhcmdldF9wcm9jZXNzb3IgPSBQUk9DRVNTT1JfVjg1MEU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiAKLSAgICAgIHRhcmdldF9wcm9jZXNzb3IgPSBQUk9DRVNTT1JfVjg1MEVBOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgLyogRmluZCB0aGUgb3Bjb2RlLiAgKi8KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlCi0JICAmJiAob3AtPnByb2Nlc3NvcnMgJiB0YXJnZXRfcHJvY2Vzc29yKSkKLQl7Ci0JICBjb25zdCB1bnNpZ25lZCBjaGFyICogb3BpbmRleF9wdHI7Ci0JICB1bnNpZ25lZCBpbnQgICAgICAgICAgb3BudW07Ci0JICB1bnNpZ25lZCBpbnQgICAgICAgICAgbWVtb3A7Ci0KLQkgIG1hdGNoID0gMTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsKLS8qZnByaW50ZiAoc3RkZXJyLCAibWF0Y2g6IG1hc2s6ICV4IGluc246ICV4LCBvcGNvZGU6ICV4LCBuYW1lOiAlc1xuIiwgb3AtPm1hc2ssIGluc24sIG9wLT5vcGNvZGUsIG9wLT5uYW1lICk7Ki8KLQotCSAgbWVtb3AgPSBvcC0+bWVtb3A7Ci0JICAvKiBOb3cgcHJpbnQgdGhlIG9wZXJhbmRzLgotCi0JICAgICBNRU1PUCBpcyB0aGUgb3BlcmFuZCBudW1iZXIgYXQgd2hpY2ggYSBtZW1vcnkKLQkgICAgIGFkZHJlc3Mgc3BlY2lmaWNhdGlvbiBzdGFydHMsIG9yIHplcm8gaWYgdGhpcwotCSAgICAgaW5zdHJ1Y3Rpb24gaGFzIG5vIG1lbW9yeSBhZGRyZXNzZXMuCi0KLQkgICAgIEEgbWVtb3J5IGFkZHJlc3MgaXMgYWx3YXlzIHR3byBhcmd1bWVudHMuCi0KLQkgICAgIFRoaXMgaW5mb3JtYXRpb24gYWxsb3dzIHVzIHRvIGRldGVybWluZSB3aGVuIHRvCi0JICAgICBpbnNlcnQgY29tbWFzIGludG8gdGhlIG91dHB1dCBzdHJlYW0gYXMgd2VsbCBhcwotCSAgICAgd2hlbiB0byBpbnNlcnQgZGlzcFtyZWddIGV4cHJlc3Npb25zIG9udG8gdGhlCi0JICAgICBvdXRwdXQgc3RyZWFtLiAgKi8KLQkgIAotCSAgZm9yIChvcGluZGV4X3B0ciA9IG9wLT5vcGVyYW5kcywgb3BudW0gPSAxOwotCSAgICAgICAqb3BpbmRleF9wdHIgIT0gMDsKLQkgICAgICAgb3BpbmRleF9wdHIrKywgb3BudW0rKykKLQkgICAgewotCSAgICAgIGxvbmcgCXZhbHVlOwotCSAgICAgIGludCAgCWZsYWc7Ci0JICAgICAgaW50ICAgICAgIHN0YXR1czsKLQkgICAgICBiZmRfYnl0ZQlidWZmZXJbIDQgXTsKLQkgICAgICAKLQkgICAgICBvcGVyYW5kID0gJnY4NTBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQkgICAgICAKLQkgICAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkJdmFsdWUgPSAob3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIDApOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChvcGVyYW5kLT5iaXRzID09IC0xKQotCQkgICAgdmFsdWUgPSAoaW5zbiAmIG9wZXJhbmQtPnNoaWZ0KTsKLQkJICBlbHNlCi0JCSAgICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCi0JCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkKLQkJICAgIHZhbHVlID0gKChsb25nKSh2YWx1ZSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkKLQkJCSAgICAgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpOwotCQl9Ci0KLQkgICAgICAvKiBUaGUgZmlyc3Qgb3BlcmFuZCBpcyBhbHdheXMgb3V0cHV0IHdpdGhvdXQgYW55Ci0JCSBzcGVjaWFsIGhhbmRsaW5nLgotCi0JCSBGb3IgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6Ci0KLQkJICAgSWYgbWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAxLCB0aGVuIHdlIG5lZWQgJ1snIHNpbmNlCi0JCSAgIHdlJ3JlIGFib3V0IHRvIG91dHB1dCB0aGUgcmVnaXN0ZXIgdXNlZCBpbiBhIG1lbW9yeQotCQkgICByZWZlcmVuY2UuCi0KLQkJICAgSWYgbWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAyLCB0aGVuIHdlIG5lZWQgJ10nIHNpbmNlCi0JCSAgIHdlIGp1c3QgZmluaXNoZWQgdGhlIHJlZ2lzdGVyIGluIGEgbWVtb3J5IHJlZmVyZW5jZS4gIFdlCi0JCSAgIGFsc28gbmVlZCBhICcsJyBiZWZvcmUgdGhpcyBvcGVyYW5kLgotCi0JCSAgIEVsc2Ugd2UganVzdCBuZWVkIGEgY29tbWEuCi0KLQkJICAgV2UgbWF5IG5lZWQgdG8gb3V0cHV0IGEgdHJhaWxpbmcgJ10nIGlmIHRoZSBsYXN0IG9wZXJhbmQKLQkJICAgaW4gYW4gaW5zdHJ1Y3Rpb24gaXMgdGhlIHJlZ2lzdGVyIGZvciBhIG1lbW9yeSBhZGRyZXNzLiAKLQotCQkgICBUaGUgZXhjZXB0aW9uIChhbmQgdGhlcmUncyBhbHdheXMgYW4gZXhjZXB0aW9uKSBpcyB0aGUKLQkJICAgImptcCIgaW5zbiB3aGljaCBuZWVkcyBzcXVhcmUgYnJhY2tldHMgYXJvdW5kIGl0J3Mgb25seQotCQkgICByZWdpc3RlciBhcmd1bWVudC4gICovCi0KLQkgICAgICAgICAgIGlmIChtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDEpIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiWyIpOwotCSAgICAgIGVsc2UgaWYgKG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMikgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJdLCIpOwotCSAgICAgIGVsc2UgaWYgKG1lbW9wID09IDEgJiYgb3BudW0gPT0gMQotCQkgICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykpCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiWyIpOwotCSAgICAgIGVsc2UgaWYgKG9wbnVtID4gMSkJICAgICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIsICIpOwotCi0JICAgICAgLyogZXh0cmFjdCB0aGUgZmxhZ3MsIGlnbm9ybmcgb25lcyB3aGljaCBkbyBub3QgZWZmZWN0IGRpc2Fzc2VtYmx5IG91dHB1dC4gKi8KLQkgICAgICBmbGFnID0gb3BlcmFuZC0+ZmxhZ3M7Ci0JICAgICAgZmxhZyAmPSB+IFY4NTBfT1BFUkFORF9TSUdORUQ7Ci0JICAgICAgZmxhZyAmPSB+IFY4NTBfT1BFUkFORF9SRUxBWDsKLQkgICAgICBmbGFnICY9IC0gZmxhZzsKLQkgICAgICAKLQkgICAgICBzd2l0Y2ggKGZsYWcpCi0JCXsKLQkJY2FzZSBWODUwX09QRVJBTkRfUkVHOiAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyIsIHY4NTBfcmVnX25hbWVzW3ZhbHVlXSk7IGJyZWFrOwotCQljYXNlIFY4NTBfT1BFUkFORF9TUkc6ICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzIiwgdjg1MF9zcmVnX25hbWVzW3ZhbHVlXSk7IGJyZWFrOwotCQljYXNlIFY4NTBfT1BFUkFORF9DQzogICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzIiwgdjg1MF9jY19uYW1lc1t2YWx1ZV0pOyBicmVhazsKLQkJY2FzZSBWODUwX09QRVJBTkRfRVA6ICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJlcCIpOyBicmVhazsKLQkJZGVmYXVsdDogICAgICAgICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlZCIsIHZhbHVlKTsgYnJlYWs7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX0RJU1A6Ci0JCSAgewotCQkgICAgYmZkX3ZtYSBhZGRyID0gdmFsdWUgKyBtZW1hZGRyOwotCQkgICAgCi0JCSAgICAvKiBPbiB0aGUgdjg1MCB0aGUgdG9wIDggYml0cyBvZiBhbiBhZGRyZXNzIGFyZSB1c2VkIGJ5IGFuIG92ZXJsYXkgbWFuYWdlci4KLQkJICAgICAgIFRodXMgaXQgbWF5IGhhcHBlbiB0aGF0IHdoZW4gd2UgYXJlIGxvb2tpbmcgZm9yIGEgc3ltYm9sIHRvIG1hdGNoCi0JCSAgICAgICBhZ2FpbnN0IGFuIGFkZHJlc3Mgd2l0aCBzb21lIG9mIGl0cyB0b3AgYml0cyBzZXQsIHRoZSBzZWFyY2ggZmFpbHMgdG8KLQkJICAgICAgIHR1cm4gdXAgYW4gZXhhY3QgbWF0Y2guICBJbiB0aGlzIGNhc2Ugd2UgdHJ5IHRvIGZpbmQgYW4gZXhhY3QgbWF0Y2gKLQkJICAgICAgIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlIGxvd2VyIGFkZHJlc3Mgc3BhY2UsIGFuZCBpZiB3ZSBmaW5kIG9uZSwgd2UKLQkJICAgICAgIHVzZSB0aGF0IGFkZHJlc3MuICAgV2Ugb25seSBkbyB0aGlzIGZvciBKQVJMIGluc3RydWN0aW9ucyBob3dldmVyLCBhcwotCQkgICAgICAgd2UgZG8gbm90IHdhbnQgdG8gbWlzaW50ZXJwcmV0IGJyYW5jaCBpbnN0cnVjdGlvbnMuICAqLwotCQkgICAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMjIpCi0JCSAgICAgIHsKLQkJCWlmICggISBpbmZvLT5zeW1ib2xfYXRfYWRkcmVzc19mdW5jIChhZGRyLCBpbmZvKQotCQkJICAgICYmICgoYWRkciAmIDB4RkYwMDAwMDApICE9IDApCi0JCQkgICAgJiYgaW5mby0+c3ltYm9sX2F0X2FkZHJlc3NfZnVuYyAoYWRkciAmIDB4MDBGRkZGRkYsIGluZm8pKQotCQkJICB7Ci0JCQkgICAgYWRkciAmPSAweDAwRkZGRkZGOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAoYWRkciwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCSAgICAKLQkJY2FzZSBWODUwRV9QVVNIX1BPUDoKLQkJICB7Ci0JCSAgICBzdGF0aWMgaW50IGxpc3QxMl9yZWdzWzMyXSAgID0geyAzMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKLQkJICAgIHN0YXRpYyBpbnQgbGlzdDE4X2hfcmVnc1szMl0gPSB7IDE5LCAxOCwgMTcsIDE2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMSwgMzAsIDMxLCAyOSwgMjgsIDIzLCAyMiwgMjEsIDIwLCAyNywgMjYsIDI1LCAyNCB9OwotCQkgICAgc3RhdGljIGludCBsaXN0MThfbF9yZWdzWzMyXSA9IHsgIDMsICAyLCAgMSwgLTIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAxNCwgMTUsIDEzLCAxMiwgIDcsICA2LCAgNSwgIDQsIDExLCAxMCwgIDksICA4IH07Ci0JCSAgICBpbnQgKiAgICAgICAgICAgICByZWdzOwotCQkgICAgaW50ICAgICAgICAgICAgICAgaTsKLQkJICAgIHVuc2lnbmVkIGxvbmcgaW50IG1hc2sgPSAwOwotCQkgICAgaW50ICAgICAgICAgICAgICAgcGMgICA9IGZhbHNlOwotCQkgICAgaW50ICAgICAgICAgICAgICAgc3IgICA9IGZhbHNlOwotCQkgICAgCi0JCSAgICAKLQkJICAgIHN3aXRjaCAob3BlcmFuZC0+c2hpZnQpCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSAweGZmZTAwMDAxOiByZWdzID0gbGlzdDEyX3JlZ3M7IGJyZWFrOwotCQkgICAgICBjYXNlIDB4ZmZmODAwMGY6IHJlZ3MgPSBsaXN0MThfaF9yZWdzOyBicmVhazsKLQkJICAgICAgY2FzZSAweGZmZjgwMDFmOiByZWdzID0gbGlzdDE4X2xfcmVnczsgdmFsdWUgJj0gfjB4MTA7IGJyZWFrOyAgLyogRG8gbm90IGluY2x1ZGUgbWFnaWMgYml0ICovCi0JCSAgICAgIGRlZmF1bHQ6Ci0JCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJZnByaW50ZiAoc3RkZXJyLCBfKCJ1bmtub3duIG9wZXJhbmQgc2hpZnQ6ICV4XG4iKSwgb3BlcmFuZC0+c2hpZnQgKTsKLQkJCWFib3J0KCk7Ci0JCSAgICAgIH0KLQotCQkgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCSAgICAgIHsKLQkJCWlmICh2YWx1ZSAmICgxIDw8IGkpKQotCQkJICB7Ci0JCQkgICAgc3dpdGNoIChyZWdzWyBpIF0pCi0JCQkgICAgICB7Ci0JCQkgICAgICBkZWZhdWx0OiBtYXNrIHw9ICgxIDw8IHJlZ3NbIGkgXSk7IGJyZWFrOwotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkgICAgICBjYXNlIDA6ICBmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gcG9wIHJlZzogJWRcbiIpLCBpICk7IGFib3J0KCk7Ci0JCQkgICAgICBjYXNlIC0xOiBwYyA9IHRydWU7IGJyZWFrOwotCQkJICAgICAgY2FzZSAtMjogc3IgPSB0cnVlOyBicmVhazsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkgICAgICB9Ci0KLQkJICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAieyIpOwotCQkgICAgCi0JCSAgICBpZiAobWFzayB8fCBwYyB8fCBzcikKLQkJICAgICAgewotCQkJaWYgKG1hc2spCi0JCQkgIHsKLQkJCSAgICB1bnNpZ25lZCBpbnQgYml0OwotCQkJICAgIGludCAgICAgICAgICBzaG93bl9vbmUgPSBmYWxzZTsKLQkJCSAgICAKLQkJCSAgICBmb3IgKGJpdCA9IDA7IGJpdCA8IDMyOyBiaXQrKykKLQkJCSAgICAgIGlmIChtYXNrICYgKDEgPDwgYml0KSkKLQkJCQl7Ci0JCQkJICB1bnNpZ25lZCBsb25nIGludCBmaXJzdCA9IGJpdDsKLQkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IGxhc3Q7Ci0KLQkJCQkgIGlmIChzaG93bl9vbmUpCi0JCQkJICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiLCAiKTsKLQkJCQkgIGVsc2UKLQkJCQkgICAgc2hvd25fb25lID0gdHJ1ZTsKLQkJCQkgIAotCQkJCSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sIHY4NTBfcmVnX25hbWVzW2ZpcnN0XSk7Ci0JCQkJICAKLQkJCQkgIGZvciAoYml0Kys7IGJpdCA8IDMyOyBiaXQrKykKLQkJCQkgICAgaWYgKChtYXNrICYgKDEgPDwgYml0KSkgPT0gMCkKLQkJCQkgICAgICBicmVhazsKLQotCQkJCSAgbGFzdCA9IGJpdDsKLQotCQkJCSAgaWYgKGxhc3QgPiBmaXJzdCArIDEpCi0JCQkJICAgIHsKLQkJCQkgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAtICVzIiwgdjg1MF9yZWdfbmFtZXNbIGxhc3QgLSAxIF0pOwotCQkJCSAgICB9Ci0JCQkJfQotCQkJICB9Ci0JCQkKLQkJCWlmIChwYykKLQkJCSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlc1BDIiwgbWFzayA/ICIsICIgOiAiIik7Ci0JCQlpZiAoc3IpCi0JCQkgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXNTUiIsIChtYXNrIHx8IHBjKSA/ICIsICIgOiAiIik7Ci0JCSAgICAgIH0KLQkJICAgIAotCQkgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJ9Iik7Ci0JCSAgfQotCQlicmVhazsKLQkJICAKLQkJY2FzZSBWODUwRV9JTU1FRElBVEUxNjoKLQkJICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyICsgYnl0ZXNfcmVhZCwgYnVmZmVyLCAyLCBpbmZvKTsKLQkJICBpZiAoc3RhdHVzID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGJ5dGVzX3JlYWQgKz0gMjsKLQkJICAgICAgdmFsdWUgPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCi0JCSAgICAgIC8qIElmIHRoaXMgaXMgYSBESVNQT1NFIGluc3RydWN0aW9uIHdpdGggZmYgc2V0IHRvIDB4MTAsIHRoZW4gc2hpZnQgdmFsdWUgdXAgYnkgMTYuICAqLwotCQkgICAgICBpZiAoKGluc24gJiAweDAwMWZmZmMwKSA9PSAweDAwMTMwNzgwKQotCQkJdmFsdWUgPDw9IDE2OwotCi0JCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiMHgleCIsIHZhbHVlKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIgKyBieXRlc19yZWFkLCBpbmZvKTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSBWODUwRV9JTU1FRElBVEUzMjoKLQkJICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyICsgYnl0ZXNfcmVhZCwgYnVmZmVyLCA0LCBpbmZvKTsKLQkJICBpZiAoc3RhdHVzID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGJ5dGVzX3JlYWQgKz0gNDsKLQkJICAgICAgdmFsdWUgPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCQkgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgdmFsdWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciArIGJ5dGVzX3JlYWQsIGluZm8pOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQl9CQkgIAotCi0JICAgICAgLyogSGFuZGxlIGptcCBjb3JyZWN0bHkuICAqLwotCSAgICAgIGlmIChtZW1vcCA9PSAxICYmIG9wbnVtID09IDEKLQkJICAmJiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykgIT0gMCkpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXSIpOwotCSAgICB9Ci0KLQkgIC8qIENsb3NlIGFueSBzcXVhcmUgYnJhY2tldCB3ZSBsZWZ0IG9wZW4uICAqLwotCSAgaWYgKG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMikKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJdIik7Ci0KLQkgIC8qIEFsbCBkb25lLiAqLwotCSAgYnJlYWs7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkKLSAgICB7Ci0gICAgICBpZiAoc2hvcnRfb3ApCi0JaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIuc2hvcnRcdDB4JTA0eCIsIGluc24pOwotICAgICAgZWxzZQotCWluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JTA4eCIsIGluc24pOwotICAgIH0KLQotICByZXR1cm4gYnl0ZXNfcmVhZDsKLX0KLQotaW50IAotcHJpbnRfaW5zbl92ODUwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgaW50ICAgICAgICAgICBzdGF0dXM7Ci0gIGJmZF9ieXRlICAgICAgYnVmZmVyWyA0IF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbiA9IDA7Ci0KLSAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgYmlnIHRoZSBvcGNvZGUgaXMuICAqLwotICAKLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHsKLSAgICAgIGluc24gPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotICAgICAgCi0gICAgICBpZiAoICAgKGluc24gJiAweDA2MDApID09IDB4MDYwMAotCSAgJiYgKGluc24gJiAweGZmZTApICE9IDB4MDYyMCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgNCBieXRlIGluc24sIHJlYWQgNCBieXRlcyBvZiBzdHVmZi4gICovCi0JICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotCi0JICBpZiAoc3RhdHVzID09IDApCi0JICAgIGluc24gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCX0KLSAgICB9Ci0gIAotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB3ZSB0ZWxsIG91ciBjYWxsZXIgaG93IG1hbnkgYnl0ZXMgd2UgY29uc3VtZWQuICAqLwotICByZXR1cm4gZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24pOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy92ODUwLW9wYy5jIGIvb3Bjb2Rlcy92ODUwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ4NTdlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdjg1MC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDc4NiArMCwwIEBACi0vKiBBc3NlbWJsZSBWODUwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiByZWd1bGFyIG9wY29kZSAqLwotI2RlZmluZSBPUCh4KQkJKCh4ICYgMHgzZikgPDwgNSkKLSNkZWZpbmUgT1BfTUFTSwkJT1AgKDB4M2YpCi0KLS8qIGNvbmRpdGlvbmFsIGJyYW5jaCBvcGNvZGUgKi8KLSNkZWZpbmUgQk9QKHgpCQkoKDB4MGIgPDwgNykgfCAoeCAmIDB4MGYpKQotI2RlZmluZSBCT1BfTUFTSwkoKDB4MGYgPDwgNykgfCAweDBmKQotCi0vKiBvbmUtd29yZCBvcGNvZGVzICovCi0jZGVmaW5lIG9uZSh4KQkJKCh1bnNpZ25lZCBpbnQpICh4KSkKLQotLyogdHdvLXdvcmQgb3Bjb2RlcyAqLwotI2RlZmluZSB0d28oeCx5KQkoKHVuc2lnbmVkIGludCkgKHgpIHwgKCh1bnNpZ25lZCBpbnQpICh5KSA8PCAxNikpCi0KLQotDAotLyogVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGluc2VydCBhbmQgZXh0cmFjdCBjb21wbGljYXRlZCBvcGVyYW5kcy4gICovCi0KLS8qIE5vdGU6IFRoZXJlIGlzIGEgY29uc3BpcmFjeSBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucyBhbmQKLSAgIHY4NTBfaW5zZXJ0X29wZXJhbmQoKSBpbiBnYXMvY29uZmlnL3RjLXY4NTAuYy4gIEVycm9yIG1lc3NhZ2VzCi0gICBjb250YWluaW5nIHRoZSBzdHJpbmcgJ291dCBvZiByYW5nZScgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyBhCi0gICBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGdpdmVuIHRvIEdBUy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogbm90X3ZhbGlkICAgID0gTl8gKCJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGluIHJhbmdlIGFuZCBpcyBub3QgYWxpZ25lZCIpOwotc3RhdGljIGNvbnN0IGNoYXIgKiBvdXRfb2ZfcmFuZ2UgPSBOXyAoImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UiKTsKLXN0YXRpYyBjb25zdCBjaGFyICogbm90X2FsaWduZWQgID0gTl8gKCJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGFsaWduZWQiKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBpbW1lZGlhdGVfb3V0X29mX3JhbmdlID0gTl8gKCJpbW1lZGlhdGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDkgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAtMHgxMDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0JKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgbm90IGluIHJhbmdlIGFuZCB0byBvZGQgb2Zmc2V0Iik7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQotICAgICogZXJybXNnID0gXygiYnJhbmNoIHRvIG9kZCBvZmZzZXQiKTsKLQotICByZXR1cm4gKGluc24gfCAoKHZhbHVlICYgMHgxZjApIDw8IDcpIHwgKCh2YWx1ZSAmIDB4MGUpIDw8IDMpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9ICgoaW5zbiAmIDB4ZjgwMCkgPj4gNykgfCAoKGluc24gJiAweDAwNzApID4+IDMpOwotCi0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXQgLT0gMHgwMjAwOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDIyIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmZmZmZiB8fCB2YWx1ZSA8IC0weDIwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIGFuIG9kZCBvZmZzZXQiKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKCJicmFuY2ggdG8gb2RkIG9mZnNldCIpOwotCi0gIHJldHVybiAoaW5zbiB8ICgodmFsdWUgJiAweGZmZmUpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNmMDAwMCkgPj4gMTYpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDIyIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgc2lnbmVkIGxvbmcgcmV0ID0gKChpbnNuICYgMHhmZmZlMDAwMCkgPj4gMTYpIHwgKChpbnNuICYgMHgzZikgPDwgMTYpOwotCi0gIHJldHVybiAodW5zaWduZWQgbG9uZykgKChyZXQgPDwgMTApID4+IDEwKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kMTZfMTUgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4N2ZmZiB8fCB2YWx1ZSA8IC0weDgwMDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0JKiBlcnJtc2cgPSBfKG5vdF92YWxpZCk7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQotICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7Ci0KLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHhmZmZlKSA8PCAxNik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2QxNl8xNSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHhmZmZlMDAwMCk7Ci0KLSAgcmV0dXJuIHJldCA+PiAxNjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kOF83IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweGZmIHx8IHZhbHVlIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8obm90X3ZhbGlkKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICB2YWx1ZSA+Pj0gMTsKLQotICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDdmKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2Q4XzcgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHg3Zik7Ci0KLSAgcmV0dXJuIHJldCA8PCAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2Q4XzYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAwKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgJSA0KSAhPSAwKQotCSplcnJtc2cgPSBfKG5vdF92YWxpZCk7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSA0KSAhPSAwKQotICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7Ci0KLSAgdmFsdWUgPj49IDE7Ci0KLSAgcmV0dXJuIChpbnNuIHwgKHZhbHVlICYgMHg3ZSkpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kOF82IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXQgPSAoaW5zbiAmIDB4N2UpOwotCi0gIHJldHVybiByZXQgPDwgMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kNV80IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmIHx8IHZhbHVlIDwgMCkKLSAgICB7Ci0gICAgICBpZiAodmFsdWUgJiAxKQotCSogZXJybXNnID0gXyhub3RfdmFsaWQpOwotICAgICAgZWxzZQotCSplcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICh2YWx1ZSAmIDEpCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICB2YWx1ZSA+Pj0gMTsKLQotICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDBmKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2Q1XzQgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHgwZik7Ci0KLSAgcmV0dXJuIHJldCA8PCAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2QxNl8xNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBzaWduZWQgbG9uZyAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHg3ZmZmIHx8IHZhbHVlIDwgLTB4ODAwMCkKLSAgICAqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLQotICByZXR1cm4gKGluc24gfCAoKHZhbHVlICYgMHhmZmZlKSA8PCAxNikgfCAoKHZhbHVlICYgMSkgPDwgNSkpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kMTZfMTYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICBzaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHhmZmZlMDAwMDsKLQotICByZXQgPj49IDE2OwotCi0gIHJldCB8PSAoKGluc24gJiAweDIwKSA+PiA1KTsKLSAgCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfaTkgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgc2lnbmVkIGxvbmcgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAtMHgxMDApCi0gICAgKiBlcnJtc2cgPSBfKGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UpOwotCi0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWUwKSA8PCAxMykgfCAodmFsdWUgJiAweDFmKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfaTkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICBzaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHgwMDNjMDAwMDsKLQotICByZXQgPDw9IDEwOwotICByZXQgPj49IDIzOwotCi0gIHJldCB8PSAoaW5zbiAmIDB4MWYpOwotICAKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF91OSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHgxZmYpCi0gICAgKiBlcnJtc2cgPSBfKGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UpOwotCi0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWUwKSA8PCAxMykgfCAodmFsdWUgJiAweDFmKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfdTkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IGluc24gJiAweDAwM2MwMDAwOwotCi0gIHJldCA+Pj0gMTM7Ci0KLSAgcmV0IHw9IChpbnNuICYgMHgxZik7Ci0gIAotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3NwZSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlICE9IDMpCi0gICAgKiBlcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIGZvciBzdGFjayBhZGp1c3RtZW50Iik7Ci0KLSAgcmV0dXJuIGluc24gJiAofiAweDE4MDAwMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X3NwZSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHJldHVybiAzOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2k1ZGl2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmZikKLSAgICB7Ci0gICAgICBpZiAodmFsdWUgJiAxKQotCSogZXJybXNnID0gXygiaW1tZWRpYXRlIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgbm90IGV2ZW4iKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8oaW1tZWRpYXRlX291dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICh2YWx1ZSAmIDEpCi0gICAgKiBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgdmFsdWUgbXVzdCBiZSBldmVuIik7Ci0KLSAgdmFsdWUgPSAzMiAtIHZhbHVlOwotICAKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZSkgPDwgMTcpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9pNWRpdiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gaW5zbiAmIDB4M2MwMDAwOwotCi0gIHJldCA+Pj0gMTc7Ci0KLSAgcmV0ID0gMzIgLSByZXQ7Ci0gIAotICByZXR1cm4gcmV0OwotfQotCi0MCi0vKiBXYXJuaW5nOiBjb2RlIGluIGdhcy9jb25maWcvdGMtdjg1MC5jIGV4YW1pbmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5LgotICAgSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBoZXJlLCBiZSBzdXJlIHRvIGxvb2sgZm9yIHNpZGUgZWZmZWN0cyBpbgotICAgdGhhdCBjb2RlLiAqLwotY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCB2ODUwX29wZXJhbmRzW10gPQotewotI2RlZmluZSBVTlVTRUQJMAotICB7IDAsIDAsIE5VTEwsIE5VTEwsIDAgfSwgCi0KLS8qIFRoZSBSMSBmaWVsZCBpbiBhIGZvcm1hdCAxLCA2LCA3LCBvciA5IGluc24uICovCi0jZGVmaW5lIFIxCShVTlVTRUQgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfSwgCi0KLS8qIEFzIGFib3ZlLCBidXQgcmVnaXN0ZXIgMCBpcyBub3QgYWxsb3dlZC4gICovCi0jZGVmaW5lIFIxX05PVFIwIChSMSArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfTk9UX1IwIH0sIAotCi0vKiBUaGUgUjIgZmllbGQgaW4gYSBmb3JtYXQgMSwgMiwgNCwgNSwgNiwgNywgOSBpbnNuLiAqLwotI2RlZmluZSBSMgkoUjFfTk9UUjAgKyAxKQotICB7IDUsIDExLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIH0sCi0KLS8qIEFzIGFib3ZlLCBidXQgcmVnaXN0ZXIgMCBpcyBub3QgYWxsb3dlZC4gICovCi0jZGVmaW5lIFIyX05PVFIwIChSMiArIDEpCi0gIHsgNSwgMTEsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX05PVF9SMCB9LAotCi0vKiBUaGUgaW1tNSBmaWVsZCBpbiBhIGZvcm1hdCAyIGluc24uICovCi0jZGVmaW5lIEk1CShSMl9OT1RSMCArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotLyogVGhlIHVuc2lnbmVkIGltbTUgZmllbGQgaW4gYSBmb3JtYXQgMiBpbnNuLiAqLwotI2RlZmluZSBJNVUJKEk1ICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCAwIH0sCi0KLS8qIFRoZSBpbW0xNiBmaWVsZCBpbiBhIGZvcm1hdCA2IGluc24uICovCi0jZGVmaW5lIEkxNgkoSTVVICsgMSkKLSAgeyAxNiwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSBzaWduZWQgZGlzcDcgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBENwkoSTE2ICsgMSkKLSAgeyA3LCAwLCBOVUxMLCBOVUxMLCAwfSwKLQotLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhIGZvcm1hdCA2IGluc24uICovCi0jZGVmaW5lIEQxNl8xNQkoRDcgKyAxKQotICB7IDE1LCAxNywgaW5zZXJ0X2QxNl8xNSwgZXh0cmFjdF9kMTZfMTUsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSAzIGJpdCBpbW1lZGlhdGUgZmllbGQgaW4gZm9ybWF0IDggaW5zbi4gICovCi0jZGVmaW5lIEIzCShEMTZfMTUgKyAxKQotICB7IDMsIDExLCBOVUxMLCBOVUxMLCAwIH0sCi0KLS8qIFRoZSA0IGJpdCBjb25kaXRpb24gY29kZSBpbiBhIHNldGYgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgQ0NDQwkoQjMgKyAxKQotICB7IDQsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9DQyB9LAotCi0vKiBUaGUgdW5zaWduZWQgRElTUDggZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBEOF83CShDQ0NDICsgMSkKLSAgeyA3LCAwLCBpbnNlcnRfZDhfNywgZXh0cmFjdF9kOF83LCAwIH0sCi0KLS8qIFRoZSB1bnNpZ25lZCBESVNQOCBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ4XzYJKEQ4XzcgKyAxKQotICB7IDYsIDEsIGluc2VydF9kOF82LCBleHRyYWN0X2Q4XzYsIDAgfSwKLQotLyogU3lzdGVtIHJlZ2lzdGVyIG9wZXJhbmRzLiAgKi8KLSNkZWZpbmUgU1IxCShEOF82ICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU1JHIH0sCi0KLS8qIEVQIFJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgRVAJKFNSMSArIDEpCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX0VQIH0sCi0KLS8qIFRoZSBpbW0xNiBmaWVsZCAodW5zaWduZWQpIGluIGEgZm9ybWF0IDYgaW5zbi4gKi8KLSNkZWZpbmUgSTE2VQkoRVAgKyAxKQotICB7IDE2LCAxNiwgTlVMTCwgTlVMTCwgMH0sIAotCi0vKiBUaGUgUjIgZmllbGQgYXMgYSBzeXN0ZW0gcmVnaXN0ZXIuICAqLwotI2RlZmluZSBTUjIJKEkxNlUgKyAxKQotICB7IDUsIDExLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU1JHIH0sCi0KLS8qIFRoZSBkaXNwMTYgZmllbGQgaW4gYSBmb3JtYXQgOCBpbnNuLiAqLwotI2RlZmluZSBEMTYJKFNSMiArIDEpCi0gIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgRElTUDkgZmllbGQgaW4gYSBmb3JtYXQgMyBpbnNuLCByZWxheGFibGUuICovCi0jZGVmaW5lIEQ5X1JFTEFYCShEMTYgKyAxKQotICB7IDksIDAsIGluc2VydF9kOSwgZXh0cmFjdF9kOSwgVjg1MF9PUEVSQU5EX1JFTEFYIHwgVjg1MF9PUEVSQU5EX1NJR05FRCB8IFY4NTBfT1BFUkFORF9ESVNQIH0sCi0KLS8qIFRoZSBESVNQMjIgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLCByZWxheGFibGUuCi0gICBUaGlzIF9tdXN0XyBmb2xsb3cgRDlfUkVMQVg7IHRoZSBhc3NlbWJsZXIgYXNzdW1lcyB0aGF0IHRoZSBsb25nZXIKLSAgIHZlcnNpb24gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgc2hvcnRlciB2ZXJzaW9uIGZvciByZWxheGluZy4gICovCi0jZGVmaW5lIEQyMgkoRDlfUkVMQVggKyAxKQotICB7IDIyLCAwLCBpbnNlcnRfZDIyLCBleHRyYWN0X2QyMiwgVjg1MF9PUEVSQU5EX1NJR05FRCB8IFY4NTBfT1BFUkFORF9ESVNQIH0sCi0KLS8qIFRoZSBzaWduZWQgZGlzcDQgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBENAkoRDIyICsgMSkKLSAgeyA0LCAwLCBOVUxMLCBOVUxMLCAwfSwKLQotLyogVGhlIHVuc2lnbmVkIGRpc3A1IGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbi4gKi8KLSNkZWZpbmUgRDVfNAkoRDQgKyAxKQotICB7IDQsIDAsIGluc2VydF9kNV80LCBleHRyYWN0X2Q1XzQsIDAgfSwKLQotLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhbiBmb3JtYXQgNyB1bnNpZ25lZCBieXRlIGxvYWQgaW5zbi4gKi8KLSNkZWZpbmUgRDE2XzE2CShENV80ICsgMSkKLSAgeyAtMSwgMHhmZmZlMDAyMCwgaW5zZXJ0X2QxNl8xNiwgZXh0cmFjdF9kMTZfMTYsIDAgfSwgCi0KLS8qIFRoaXJkIHJlZ2lzdGVyIGluIGNvbmRpdGlvbmFsIG1vdmVzLiAqLwotI2RlZmluZSBSMwkoRDE2XzE2ICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB9LAotCi0vKiBDb25kaXRpb24gY29kZSBpbiBjb25kaXRpb25hbCBtb3Zlcy4gICovCi0jZGVmaW5lIE1PVkNDCShSMyArIDEpCi0gIHsgNCwgMTcsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9DQyB9LAotCi0vKiBUaGUgaW1tOSBmaWVsZCBpbiBhIG11bHRpcGx5IHdvcmQuICovCi0jZGVmaW5lIEk5CShNT1ZDQyArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X2k5LCBleHRyYWN0X2k5LCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgdW5zaWduZWQgaW1tOSBmaWVsZCBpbiBhIG11bHRpcGx5IHdvcmQuICovCi0jZGVmaW5lIFU5CShJOSArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X3U5LCBleHRyYWN0X3U5LCAwIH0sIAotCi0vKiBBIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIGEgcHJlcGFyZS9kaXNwb3NlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTElTVDEyCShVOSArIDEpCi0gIHsgLTEsIDB4ZmZlMDAwMDEsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIAotCi0vKiBUaGUgSU1NNiBmaWVsZCBpbiBhIGNhbGwgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIEk2CShMSVNUMTIgKyAxKQotICB7IDYsIDAsIE5VTEwsIE5VTEwsIDAgfSwgCi0KLS8qIFRoZSAxNiBiaXQgaW1tZWRpYXRlIGZvbGxvd2luZyBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElNTTE2CShJNiArIDEpCi0gIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIHwgVjg1MEVfSU1NRURJQVRFMTYgfSwgCi0KLS8qIFRoZSAzMiBiaXQgaW1tZWRpYXRlIGZvbGxvd2luZyBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElNTTMyCShJTU0xNiArIDEpCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgVjg1MEVfSU1NRURJQVRFMzIgfSwgCi0KLS8qIFRoZSBpbW01IGZpZWxkIGluIGEgcHVzaC9wb3AgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIElNTTUJKElNTTMyICsgMSkKLSAgeyA1LCAxLCBOVUxMLCBOVUxMLCAwIH0sIAotCi0vKiBSZWcyIGluIGRpc3Bvc2UgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFIyRElTUE9TRQkoSU1NNSArIDEpCi0gIHsgNSwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX05PVF9SMCB9LAotCi0vKiBTdGFjayBwb2ludGVyIGluIHByZXBhcmUgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFNQCShSMkRJU1BPU0UgKyAxKQotICB7IDIsIDE5LCBpbnNlcnRfc3BlLCBleHRyYWN0X3NwZSwgVjg1MF9PUEVSQU5EX1JFRyB9LAotCi0vKiBUaGUgSU1NNSBmaWVsZCBpbiBhIGRpdmlkZSBOIHN0ZXAgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIEk1RElWCShTUCArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X2k1ZGl2LCBleHRyYWN0X2k1ZGl2LCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0gIC8qIFRoZSBsaXN0IG9mIHJlZ2lzdGVycyBpbiBhIFBVU0hNSC9QT1BNSCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExJU1QxOF9IIChJNURJViArIDEpCi0gIHsgLTEsIDB4ZmZmODAwMGYsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIAotCi0gIC8qIFRoZSBsaXN0IG9mIHJlZ2lzdGVycyBpbiBhIFBVU0hNTC9QT1BNTCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExJU1QxOF9MIChMSVNUMThfSCArIDEpCi0gIHsgLTEsIDB4ZmZmODAwMWYsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIC8qIFRoZSBzZXR0aW5nIG9mIHRoZSA0dGggYml0IGlzIGEgZmxhZyB0byBkaXNhc3NtYmxlKCkgaW4gdjg1MC1kaXMuYyAqLwotfSA7IAotCi0MCi0vKiByZWctcmVnIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IEkpICovCi0jZGVmaW5lIElGMQl7UjEsIFIyfQotCi0vKiBpbW0tcmVnIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IElJKSAqLwotI2RlZmluZSBJRjIJe0k1LCBSMn0KLQotLyogY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IElJSSkgKi8KLSNkZWZpbmUgSUYzCXtEOV9SRUxBWH0KLQotLyogMyBvcGVyYW5kIGluc3RydWN0aW9uIChGb3JtYXQgVkkpICovCi0jZGVmaW5lIElGNgl7STE2LCBSMSwgUjJ9Ci0KLS8qIDMgb3BlcmFuZCBpbnN0cnVjdGlvbiAoRm9ybWF0IFZJKSAqLwotI2RlZmluZSBJRjZVCXtJMTZVLCBSMSwgUjJ9Ci0KLQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCQlPUENPREUJCQlNQVNLCQkgICAgICAgeyBPUEVSQU5EUyB9CSAgIE1FTU9QICAgIFBST0NFU1NPUgotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotICAgTUVNT1Agc3BlY2lmaWVzIHdoaWNoIG9wZXJhbmQgKGlmIGFueSkgaXMgYSBtZW1vcnkgb3BlcmFuZC4KLSAgIFBST0NFU1NPUlMgc3BlY2lmaWVzIHdoaWNoIENQVShzKSBzdXBwb3J0IHRoZSBvcGNvZGUuCi0gICAKLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4KLQotICAgVGhlIHRhYmxlIGlzIGFsc28gc29ydGVkIGJ5IG5hbWUuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4KLSAgIFdoZW4gcGFyc2luZyBhbiBpbnN0cnVjdGlvbiB0aGUgYXNzZW1ibGVyIGZpbmRzIHRoZSBmaXJzdCBvY2N1cmFuY2UKLSAgIG9mIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjaXRvbiBpbiB0aGlzIHRhYmxlIGFuZCB0aGVuIGF0dGVtcHRzIHRvCi0gICBtYXRjaCB0aGUgaW5zdHJ1Y3Rpb24ncyBhcmd1bWVudHMgd2l0aCBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmFuZHMKLSAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkgaXQgaGFzIGp1c3QgZm91bmQgaW4gdGhpcyB0YWJsZS4gIElmIHRoZQotICAgbWF0Y2ggZmFpbHMgdGhlIGFzc2VtYmxlciBsb29rcyBhdCB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIHRhYmxlLgotICAgSWYgdGhhdCBlbnRyeSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJldmlvdXMgZW50cnksIHRoZW4gaXQKLSAgIHRyaWVzIHRvIG1hdGNoIHRoZSBpbnN0cnVjdGlvbiBhZ2FpbnN0IHRoYXQgZW50cnkgYW5kIHNvIG9uLiAgVGhpcwotICAgaXMgaG93IHRoZSBhc3NlbWJsZXIgY29wZXMgd2l0aCBtdWx0aXBsZSwgZGlmZmVyZW50IGZvcm1hdHMgb2YgdGhlCi0gICBzYW1lIGluc3RydWN0aW9uLiAgKi8KLQotY29uc3Qgc3RydWN0IHY4NTBfb3Bjb2RlIHY4NTBfb3Bjb2Rlc1tdID0KLXsKLXsgImJyZWFrcG9pbnQiLAkweGZmZmYsCQkJMHhmZmZmLAkJICAgICAgCXtVTlVTRUR9LCAgIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCi17ICJqbXAiLAlvbmUgKDB4MDA2MCksCQlvbmUgKDB4ZmZlMCksCSAgICAgIAl7UjF9LCAJCQkxLCBQUk9DRVNTT1JfQUxMIH0sCi0gIAotLyogbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgKi8KLXsgInNsZC5idSIsCW9uZSAoMHgwMzAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtENywgICBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5idSIsICAgICBvbmUgKDB4MDA2MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENCwgICBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRSB9LAotCi17ICJzbGQuaHUiLAlvbmUgKDB4MDQwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDhfNywgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzbGQuaHUiLCAgICAgb25lICgweDAwNzApLAkJb25lICgweDA3ZjApLCAgICAgICAgIAl7RDVfNCwgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKLQoteyAic2xkLmIiLCAgICAgIG9uZSAoMHgwMDYwKSwJCW9uZSAoMHgwN2YwKSwgICAgICAgICAJe0Q0LCAgIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5iIiwJb25lICgweDAzMDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q3LCAgIEVQLCAgIFIyfSwJMSwgUFJPQ0VTU09SX1Y4NTBFIH0sCi17ICJzbGQuYiIsCW9uZSAoMHgwMzAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtENywgICBFUCwgICBSMn0sCTEsIFBST0NFU1NPUl9WODUwIH0sCi0KLXsgInNsZC5oIiwgICAgICBvbmUgKDB4MDA3MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENV80LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzbGQuaCIsCW9uZSAoMHgwNDAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtEOF83LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKLXsgInNsZC5oIiwJb25lICgweDA0MDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q4XzcsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwIH0sCi17ICJzbGQudyIsCW9uZSAoMHgwNTAwKSwJCW9uZSAoMHgwNzgxKSwJICAgICAgCXtEOF82LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzc3QuYiIsCW9uZSAoMHgwMzgwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtSMiwgICBENywgICBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzc3QuaCIsCW9uZSAoMHgwNDgwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtSMiwgICBEOF83LCBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzc3QudyIsCW9uZSAoMHgwNTAxKSwJCW9uZSAoMHgwNzgxKSwJICAgICAgCXtSMiwgICBEOF82LCBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi0KLXsgInB1c2htbCIsCXR3byAoMHgwN2UwLCAweDAwMDEpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfTH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAicHVzaG1oIiwJdHdvICgweDA3ZTAsIDB4MDAwMyksCXR3byAoMHhmZmYwLCAweDAwMDcpLCAJe0xJU1QxOF9IfSwgCQkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJwb3BtbCIsCXR3byAoMHgwN2YwLCAweDAwMDEpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfTH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAicG9wbWgiLAl0d28gKDB4MDdmMCwgMHgwMDAzKSwJdHdvICgweGZmZjAsIDB4MDAwNyksIAl7TElTVDE4X0h9LCAJCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDAzKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBTUH0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDBiKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0xNn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDEzKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0xNn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDFiKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0zMn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDAxKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01fSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGlzcG9zZSIsCW9uZSAoMHgwNjQwKSwgICAgICAgICAgIG9uZSAoMHhmZmMwKSwgICAgICAgICAJe0lNTTUsIExJU1QxMiwgUjJESVNQT1NFfSwwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpc3Bvc2UiLAl0d28gKDB4MDY0MCwgMHgwMDAwKSwgICB0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtJTU01LCBMSVNUMTJ9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLXsgImxkLmIiLAl0d28gKDB4MDcwMCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMCksIAl7RDE2LCBSMSwgUjJ9LCAJCTEsIFBST0NFU1NPUl9BTEwgfSwKLXsgImxkLmgiLAl0d28gKDB4MDcyMCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7RDE2XzE1LCBSMSwgUjJ9LCAJMSwgUFJPQ0VTU09SX0FMTCB9LAoteyAibGQudyIsCXR3byAoMHgwNzIwLCAweDAwMDEpLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtEMTZfMTUsIFIxLCBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJsZC5idSIsCXR3byAoMHgwNzgwLCAweDAwMDEpLCAgIHR3byAoMHgwN2MwLCAweDAwMDEpLCAJe0QxNl8xNiwgUjEsIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJsZC5odSIsCXR3byAoMHgwN2UwLCAweDAwMDEpLCAgIHR3byAoMHgwN2UwLCAweDAwMDEpLCAJe0QxNl8xNSwgUjEsIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sICAKLXsgInN0LmIiLAl0d28gKDB4MDc0MCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMCksIAl7UjIsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN0LmgiLAl0d28gKDB4MDc2MCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7UjIsIEQxNl8xNSwgUjF9LCAJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3QudyIsCXR3byAoMHgwNzYwLCAweDAwMDEpLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtSMiwgRDE2XzE1LCBSMX0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi0KLS8qIGJ5dGUgc3dhcC9leHRlbmQgaW5zdHJ1Y3Rpb25zICovCi17ICJ6eGIiLAlvbmUgKDB4MDA4MCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAienhoIiwJb25lICgweDAwYzApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMV9OT1RSMH0sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJzeGIiLAlvbmUgKDB4MDBhMCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAic3hoIiwJb25lICgweDAwZTApLAkJb25lICgweGZmZTApLAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiYnNoIiwJdHdvICgweDA3ZTAsIDB4MDM0MiksCXR3byAoMHgwN2ZmLCAweDA3ZmYpLCAJe1IyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJic3ciLAl0d28gKDB4MDdlMCwgMHgwMzQwKSwJdHdvICgweDA3ZmYsIDB4MDdmZiksIAl7UjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImhzdyIsCXR3byAoMHgwN2UwLCAweDAzNDQpLAl0d28gKDB4MDdmZiwgMHgwN2ZmKSwgCXtSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBqdW1wIHRhYmxlIGluc3RydWN0aW9ucyAqLwoteyAic3dpdGNoIiwJb25lICgweDAwNDApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMX0sIAkJCTEsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiY2FsbHQiLAlvbmUgKDB4MDIwMCksCQlvbmUgKDB4ZmZjMCksIAkgICAgICAJe0k2fSwgCQkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjdHJldCIsIAl0d28gKDB4MDdlMCwgMHgwMTQ0KSwJdHdvICgweGZmZmYsIDB4ZmZmZiksIAl7MH0sIAkJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBhcml0aG1ldGljIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KLXsgInNldGYiLAl0d28gKDB4MDdlMCwgMHgwMDAwKSwJdHdvICgweDA3ZjAsIDB4ZmZmZiksIAl7Q0NDQywgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNtb3YiLAl0d28gKDB4MDdlMCwgMHgwMzIwKSwJdHdvICgweDA3ZTAsIDB4MDdlMSksIAl7TU9WQ0MsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjbW92IiwJdHdvICgweDA3ZTAsIDB4MDMwMCksCXR3byAoMHgwN2UwLCAweDA3ZTEpLCAJe01PVkNDLCBJNSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi17ICJtdWwiLAl0d28gKDB4MDdlMCwgMHgwMjIwKSwJdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtdWwiLAl0d28gKDB4MDdlMCwgMHgwMjQwKSwJdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STksIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtdWx1IiwJdHdvICgweDA3ZTAsIDB4MDIyMiksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibXVsdSIsCXR3byAoMHgwN2UwLCAweDAyNDIpLAl0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtVOSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQoteyAiZGl2IiwJdHdvICgweDA3ZTAsIDB4MDJjMCksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGl2dSIsCXR3byAoMHgwN2UwLCAweDAyYzIpLAl0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpdmh1IiwJdHdvICgweDA3ZTAsIDB4MDI4MiksICAgdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXZoIiwJdHdvICgweDA3ZTAsIDB4MDI4MCksICAgdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXZoIiwJT1AgICgweDAyKSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLSAgCi17ICJkaXZobiIsCXR3byAoMHgwN2UwLCAweDAyODApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgImRpdmh1biIsCXR3byAoMHgwN2UwLCAweDAyODIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgImRpdm4iLAl0d28gKDB4MDdlMCwgMHgwMmMwKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJkaXZ1biIsCXR3byAoMHgwN2UwLCAweDAyYzIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZobiIsCXR3byAoMHgwN2UwLCAweDAxODApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZodW4iLAl0d28gKDB4MDdlMCwgMHgwMTgyKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzZGl2biIsCXR3byAoMHgwN2UwLCAweDAxYzApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZ1biIsCXR3byAoMHgwN2UwLCAweDAxYzIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLSAgCi17ICJub3AiLAlvbmUgKDB4MDApLAkJb25lICgweGZmZmYpLAkJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3YiLAlPUCAgKDB4MTApLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibW92IiwJb25lICgweDA2MjApLAkJb25lICgweGZmZTApLAkJe0lNTTMyLCBSMV9OT1RSMH0sCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibW92IiwgICAgICAgIE9QICAoMHgwMCksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3ZlYSIsCU9QICAoMHgzMSksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibW92aGkiLAlPUCAgKDB4MzIpLAkJT1BfTUFTSywJCXtJMTZVLCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhZGQiLAlPUCAgKDB4MGUpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYWRkIiwJT1AgICgweDEyKSwJCU9QX01BU0ssCQlJRjIsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImFkZGkiLAlPUCAgKDB4MzApLAkJT1BfTUFTSywJCUlGNiwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3ViIiwJT1AgICgweDBkKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN1YnIiLCAJT1AgICgweDBjKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm11bGgiLAlPUCAgKDB4MTcpLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibXVsaCIsCU9QICAoMHgwNyksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtdWxoaSIsCU9QICAoMHgzNyksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiY21wIiwJT1AgICgweDBmKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNtcCIsCU9QICAoMHgxMyksCQlPUF9NQVNLLAkJSUYyLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0gIAotLyogc2F0dXJhdGVkIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KLXsgInNhdGFkZCIsCU9QICgweDExKSwJCU9QX01BU0ssCQl7STUsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdGFkZCIsCU9QICgweDA2KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdHN1YiIsCU9QICgweDA1KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdHN1YmkiLAlPUCAoMHgzMyksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2F0c3ViciIsCU9QICgweDA0KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQotLyogbG9naWNhbCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zICovCi17ICJ0c3QiLAlPUCAoMHgwYiksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJvciIsCQlPUCAoMHgwOCksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJvcmkiLAlPUCAoMHgzNCksCQlPUF9NQVNLLAkJSUY2VSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYW5kIiwJT1AgKDB4MGEpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYW5kaSIsCU9QICgweDM2KSwJCU9QX01BU0ssCQlJRjZVLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJ4b3IiLAlPUCAoMHgwOSksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJ4b3JpIiwJT1AgKDB4MzUpLAkJT1BfTUFTSywJCUlGNlUsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm5vdCIsCU9QICgweDAxKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhciIsCU9QICgweDE1KSwJCU9QX01BU0ssCQl7STVVLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2FyIiwJdHdvICgweDA3ZTAsIDB4MDBhMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLCAJe1IxLCAgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNobCIsCU9QICAoMHgxNiksCQlPUF9NQVNLLAkgICAgICAJe0k1VSwgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNobCIsCXR3byAoMHgwN2UwLCAweDAwYzApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwgCXtSMSwgIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzaHIiLAlPUCAgKDB4MTQpLAkJT1BfTUFTSywJICAgICAgCXtJNVUsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzaHIiLAl0d28gKDB4MDdlMCwgMHgwMDgwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksIAl7UjEsICBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2FzZiIsICAgICAgIHR3byAoMHgwN2UwLCAweDAyMDApLAl0d28gKDB4MDdmMCwgMHhmZmZmKSwgCXtDQ0NDLCBSMn0sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLS8qIGJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KLQkvKiBzaWduZWQgaW50ZWdlciAqLwoteyAiYmd0IiwJQk9QICgweGYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJnZSIsCUJPUCAoMHhlKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibHQiLAlCT1AgKDB4NiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmxlIiwJQk9QICgweDcpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCi17ICJiaCIsCQlCT1AgKDB4YiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm5oIiwJQk9QICgweDMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJsIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibmwiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIGNvbW1vbiAqLwoteyAiYmUiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuZSIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogb3RoZXJzICovCi17ICJidiIsCQlCT1AgKDB4MCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm52IiwJQk9QICgweDgpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuIiwJCUJPUCAoMHg0KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJicCIsCQlCT1AgKDB4YyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmMiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuYyIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJieiIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm56IiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJyIiwJCUJPUCAoMHg1KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJic2EiLAlCT1AgKDB4ZCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCi0vKiBCcmFuY2ggbWFjcm9zLgotCi0gICBXZSB1c2UgdGhlIHNob3J0IGZvcm0gaW4gdGhlIG9wY29kZS9tYXNrIGZpZWxkcy4gIFRoZSBhc3NlbWJsZXIKLSAgIHdpbGwgdHdpZGRsZSBiaXRzIGFzIG5lY2Vzc2FyeSBpZiB0aGUgbG9uZyBmb3JtIGlzIG5lZWRlZC4gICovCi0KLQkvKiBzaWduZWQgaW50ZWdlciAqLwoteyAiamd0IiwJQk9QICgweGYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpnZSIsCUJPUCAoMHhlKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbHQiLAlCT1AgKDB4NiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamxlIiwJQk9QICgweDcpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCi17ICJqaCIsCQlCT1AgKDB4YiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam5oIiwJQk9QICgweDMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpsIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbmwiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIGNvbW1vbiAqLwoteyAiamUiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuZSIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogb3RoZXJzICovCi17ICJqdiIsCQlCT1AgKDB4MCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam52IiwJQk9QICgweDgpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuIiwJCUJPUCAoMHg0KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqcCIsCQlCT1AgKDB4YyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamMiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuYyIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqeiIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam56IiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpzYSIsCUJPUCAoMHhkKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqYnIiLAlCT1AgKDB4NSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotICAKLXsgImpyIiwJCW9uZSAoMHgwNzgwKSwJCXR3byAoMHhmZmMwLCAweDAwMDEpLAl7RDIyfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamFybCIsCW9uZSAoMHgwNzgwKSwJCXR3byAoMHgwN2MwLCAweDAwMDEpLAl7RDIyLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTH0sIAotCi0vKiBiaXQgbWFuaXB1bGF0aW9uIGluc3RydWN0aW9ucyAqLwoteyAic2V0MSIsCXR3byAoMHgwN2MwLCAweDAwMDApLAl0d28gKDB4YzdlMCwgMHgwMDAwKSwJe0IzLCBEMTYsIFIxfSwgCQkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzZXQxIiwJdHdvICgweDA3ZTAsIDB4MDBlMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7UjIsIFIxfSwgICAgCQkyLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgIm5vdDEiLAl0d28gKDB4NDdjMCwgMHgwMDAwKSwJdHdvICgweGM3ZTAsIDB4MDAwMCksCXtCMywgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAibm90MSIsCXR3byAoMHgwN2UwLCAweDAwZTIpLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjbHIxIiwJdHdvICgweDg3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNscjEiLAl0d28gKDB4MDdlMCwgMHgwMGU0KSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksICAge1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJ0c3QxIiwJdHdvICgweGM3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInRzdDEiLAl0d28gKDB4MDdlMCwgMHgwMGU2KSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMiwgUjF9LCAgICAJCTIsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBzcGVjaWFsIGluc3RydWN0aW9ucyAqLwoteyAiZGkiLAkJdHdvICgweDA3ZTAsIDB4MDE2MCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImVpIiwJCXR3byAoMHg4N2UwLCAweDAxNjApLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJoYWx0IiwJdHdvICgweDA3ZTAsIDB4MDEyMCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInJldGkiLAl0d28gKDB4MDdlMCwgMHgwMTQwKSwJdHdvICgweGZmZmYsIDB4ZmZmZiksCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAidHJhcCIsCXR3byAoMHgwN2UwLCAweDAxMDApLAl0d28gKDB4ZmZlMCwgMHhmZmZmKSwJe0k1VX0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImxkc3IiLAl0d28gKDB4MDdlMCwgMHgwMDIwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMSwgU1IyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzdHNyIiwJdHdvICgweDA3ZTAsIDB4MDA0MCksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7U1IxLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAwLCAwLCAwLCB7MH0sIDAsIDAgfSwKLQotfSA7Ci0KLWNvbnN0IGludCB2ODUwX251bV9vcGNvZGVzID0KLSAgc2l6ZW9mICh2ODUwX29wY29kZXMpIC8gc2l6ZW9mICh2ODUwX29wY29kZXNbMF0pOwotCmRpZmYgLS1naXQgYS9vcGNvZGVzL3ZheC1kaXMuYyBiL29wY29kZXMvdmF4LWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI1OWYzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdmF4LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qIFByaW50IFZBWCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBQYXVsaW5lIE1pZGRlbGluayA8bWlkZGVsaW5AcG9seXdhcmUuaWFmLm5sPgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAib3Bjb2RlL3ZheC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotLyogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGJmZF92bWEsCi0JCQlkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9tb2RlIFBBUkFNUyAoKGludCwgdW5zaWduZWQgY2hhciAqLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGNoYXIgKnJlZ19uYW1lc1tdID0KLXsKLSAgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKLSAgInI4IiwgInI5IiwgInIxMCIsICJyMTEiLCAiYXAiLCAiZnAiLCAic3AiLCAicGMiCi19OwotCi0vKiBTaWduLWV4dGVuZCBhbiAodW5zaWduZWQgY2hhcikuICovCi0jaWYgX19TVERDX18gPT0gMQotI2RlZmluZSBDT0VSQ0VfU0lHTkVEX0NIQVIoY2gpICgoc2lnbmVkIGNoYXIpKGNoKSkKLSNlbHNlCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChpbnQpKCgoY2gpIF4gMHg4MCkgJiAweEZGKSAtIDEyOCkKLSNlbmRpZgotCi0vKiBHZXQgYSAxIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBORVhUQllURShwKSAgXAotICAocCArPSAxLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICBDT0VSQ0VfU0lHTkVEX0NIQVIocFstMV0pKQotCi0vKiBHZXQgYSAyIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBDT0VSQ0UxNih4KSAoKGludCkgKCgoeCkgXiAweDgwMDApIC0gMHg4MDAwKSkKLSNkZWZpbmUgTkVYVFdPUkQocCkgIFwKLSAgKHAgKz0gMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIENPRVJDRTE2ICgocFstMV0gPDwgOCkgKyBwWy0yXSkpCi0KLS8qIEdldCBhIDQgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIENPRVJDRTMyKHgpICgoaW50KSAoKCh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkpCi0jZGVmaW5lIE5FWFRMT05HKHApICBcCi0gIChwICs9IDQsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICAoQ09FUkNFMzIgKCgoKCgocFstMV0gPDwgOCkgKyBwWy0yXSkgPDwgOCkgKyBwWy0zXSkgPDwgOCkgKyBwWy00XSkpKQotCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1BWExFTiAyNQotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLXN0cnVjdCBwcml2YXRlCi17Ci0gIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KLSAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOwotICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotfTsKLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAotICAoKGFkZHIpIDw9ICgoc3RydWN0IHByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgcHJpdmF0ZSAqKSBpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQcmludCB0aGUgdmF4IGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX3ZheCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjb25zdCBzdHJ1Y3Qgdm90ICp2b3RwOwotICBjb25zdCBjaGFyICphcmdwID0gTlVMTDsKLSAgdW5zaWduZWQgY2hhciAqYXJnOwotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBtZW1hZGRyOwotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgewotICAgICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMik7Ci0gIGZvciAodm90cCA9ICZ2b3RzdHJzWzBdOyB2b3RwLT5uYW1lWzBdOyB2b3RwKyspCi0gICAgewotICAgICAgcmVnaXN0ZXIgdmF4X29wY29kZVQgb3Bjb2RlID0gdm90cC0+ZGV0YWlsLmNvZGU7Ci0KLSAgICAgIC8qIDIgYnl0ZSBjb2RlcyBtYXRjaCAyIGJ1ZmZlciBwb3MuICovCi0gICAgICBpZiAoKGJmZF9ieXRlKSBvcGNvZGUgPT0gYnVmZmVyWzBdCi0JICAmJiAob3Bjb2RlID4+IDggPT0gMCB8fCBvcGNvZGUgPj4gOCA9PSBidWZmZXJbMV0pKQotCXsKLQkgIGFyZ3AgPSB2b3RwLT5kZXRhaWwuYXJnczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmIChhcmdwID09IE5VTEwpCi0gICAgewotICAgICAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi53b3JkIDB4JXgiLAotCQkJICAgICAoYnVmZmVyWzBdIDw8IDgpICsgYnVmZmVyWzFdKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAvKiBQb2ludCBhdCBmaXJzdCBieXRlIG9mIGFyZ3VtZW50IGRhdGEsIGFuZCBhdCBkZXNjcmlwdG9yIGZvciBmaXJzdAotICAgICBhcmd1bWVudC4gICovCi0gIGFyZyA9IGJ1ZmZlciArICgodm90cC0+ZGV0YWlsLmNvZGUgPj4gOCkgPyAyIDogMSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgaXQgaW4gbWVtICovCi0gIEZFVENIX0RBVEEgKGluZm8sIGFyZyk7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHZvdHAtPm5hbWUpOwotICBpZiAoKmFyZ3ApCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0KLSAgd2hpbGUgKCphcmdwKQotICAgIHsKLSAgICAgIGFyZyArPSBwcmludF9pbnNuX2FyZyAoYXJncCwgYXJnLCBtZW1hZGRyICsgYXJnIC0gYnVmZmVyLCBpbmZvKTsKLSAgICAgIGFyZ3AgKz0gMjsKLSAgICAgIGlmICgqYXJncCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGFyZyAtIGJ1ZmZlcjsKLX0KLQotLyogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgImVhdGVuIiBieSB0aGUgb3BlcmFuZCwgb3IgcmV0dXJuIC0xIGlmIGFuCi0gICBpbnZhbGlkIG9wZXJhbmQgd2FzIGZvdW5kLCBvciAtMiBpZiBhbiBvcGNvZGUgdGFiZWwgZXJyb3Igd2FzCi0gICBmb3VuZC4gKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgKGQsIHAwLCBhZGRyLCBpbmZvKQotICAgICBjb25zdCBjaGFyICpkOwotICAgICB1bnNpZ25lZCBjaGFyICpwMDsKLSAgICAgYmZkX3ZtYSBhZGRyOwkJLyogUEMgZm9yIHRoaXMgYXJnIHRvIGJlIHJlbGF0aXZlIHRvICovCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBhcmdfbGVuOwotCi0gIC8qIGNoZWNrIHZhbGlkaXR5IG9mIGFkZHJlc3NpbmcgbGVuZ3RoICovCi0gIHN3aXRjaCAoZFsxXSkKLSAgICB7Ci0gICAgY2FzZSAnYicgOiBhcmdfbGVuID0gMTsJYnJlYWs7Ci0gICAgY2FzZSAnZCcgOiBhcmdfbGVuID0gODsJYnJlYWs7Ci0gICAgY2FzZSAnZicgOiBhcmdfbGVuID0gNDsJYnJlYWs7Ci0gICAgY2FzZSAnZycgOiBhcmdfbGVuID0gODsJYnJlYWs7Ci0gICAgY2FzZSAnaCcgOiBhcmdfbGVuID0gMTY7CWJyZWFrOwotICAgIGNhc2UgJ2wnIDogYXJnX2xlbiA9IDQ7CWJyZWFrOwotICAgIGNhc2UgJ28nIDogYXJnX2xlbiA9IDE2OwlicmVhazsKLSAgICBjYXNlICd3JyA6IGFyZ19sZW4gPSAyOwlicmVhazsKLSAgICBjYXNlICdxJyA6IGFyZ19sZW4gPSA4OwlicmVhazsKLSAgICBkZWZhdWx0ICA6IGFib3J0KCk7Ci0gICAgfQotCi0gIC8qIGJyYW5jaGVzIGhhdmUgbm8gbW9kZSBieXRlICovCi0gIGlmIChkWzBdID09ICdiJykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpwID0gcDA7Ci0KLSAgICAgIGlmIChhcmdfbGVuID09IDEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMSArIE5FWFRCWVRFIChwKSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMiArIE5FWFRXT1JEIChwKSwgaW5mbyk7Ci0KLSAgICAgIHJldHVybiBwIC0gcDA7Ci0gICAgfQotCi0gIHJldHVybiBwcmludF9pbnNuX21vZGUgKGFyZ19sZW4sIHAwLCBhZGRyLCBpbmZvKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9tb2RlIChzaXplLCBwMCwgYWRkciwgaW5mbykKLSAgICAgaW50IHNpemU7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnAwOwotICAgICBiZmRfdm1hIGFkZHI7CQkvKiBQQyBmb3IgdGhpcyBhcmcgdG8gYmUgcmVsYXRpdmUgdG8gKi8KLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciAqcCA9IHAwOwotICB1bnNpZ25lZCBjaGFyIG1vZGUsIHJlZzsKLQotICAvKiBmZXRjaCBhbmQgaW50ZXJwcmV0IG1vZGUgYnl0ZSAqLwotICBtb2RlID0gKHVuc2lnbmVkIGNoYXIpIE5FWFRCWVRFIChwKTsKLSAgcmVnID0gbW9kZSAmIDB4RjsKLSAgc3dpdGNoIChtb2RlICYgMHhGMCkKLSAgICB7Ci0gICAgY2FzZSAweDAwOgotICAgIGNhc2UgMHgxMDoKLSAgICBjYXNlIDB4MjA6Ci0gICAgY2FzZSAweDMwOiAvKiBsaXRlcmFsIG1vZGUJCQkkbnVtYmVyICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQweCV4IiwgbW9kZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NDA6IC8qIGluZGV4OgkJCWJhc2UtYWRkcltSbl0gKi8KLSAgICAgIHAgKz0gcHJpbnRfaW5zbl9tb2RlIChzaXplLCBwMCArIDEsIGFkZHIgKyAxLCBpbmZvKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiWyVzXSIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg1MDogLyogcmVnaXN0ZXI6CQkJUm4gKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NjA6IC8qIHJlZ2lzdGVyIGRlZmVycmVkOgkJKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoJXMpIiwgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDcwOiAvKiBhdXRvZGVjcmVtZW50OgkJLShSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSglcykiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODA6IC8qIGF1dG9pbmNyZW1lbnQ6CQkoUm4pKyAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JewkvKiBpbW1lZGlhdGU/ICovCi0JICBpbnQgaTsKLQotCSAgRkVUQ0hfREFUQSAoaW5mbywgcCArIHNpemUpOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkMHgiKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJTAyeCIsIHBbc2l6ZSAtIGkgLSAxXSk7Ci0JICBwICs9IHNpemU7Ci0JfQotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCVzKSsiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4OTA6IC8qIGF1dG9pbmNyZW1lbnQgZGVmZXJyZWQ6CUAoUm4pKyAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqMHgleCIsIE5FWFRMT05HIChwKSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCVzKSsiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4QjA6IC8qIGRpc3BsYWNlbWVudCBieXRlIGRlZmVycmVkOgkqZGlzcGwoUm4pICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioiKTsKLSAgICBjYXNlIDB4QTA6IC8qIGRpc3BsYWNlbWVudCBieXRlOgkJZGlzcGwoUm4pICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAyICsgTkVYVEJZVEUgKHApLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgoJXMpIiwgTkVYVEJZVEUgKHApLAotCQkJICAgICAgIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhEMDogLyogZGlzcGxhY2VtZW50IHdvcmQgZGVmZXJyZWQ6CSpkaXNwbChSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKiIpOwotICAgIGNhc2UgMHhDMDogLyogZGlzcGxhY2VtZW50IHdvcmQ6CQlkaXNwbChSbikgKi8KLSAgICAgIGlmIChyZWcgPT0gMHhGKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIDMgKyBORVhUV09SRCAocCksIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCglcykiLCBORVhUV09SRCAocCksCi0JCQkgICAgICAgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweEYwOiAvKiBkaXNwbGFjZW1lbnQgbG9uZyBkZWZlcnJlZDoJKmRpc3BsKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqIik7Ci0gICAgY2FzZSAweEUwOiAvKiBkaXNwbGFjZW1lbnQgbG9uZzoJCWRpc3BsKFJuKSAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgNSArIE5FWFRMT05HIChwKSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4KCVzKSIsIE5FWFRMT05HIChwKSwKLQkJCSAgICAgICByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHAgLSBwMDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdzY1LWRpcy5jIGIvb3Bjb2Rlcy93NjUtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMmU4OTYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy93NjUtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgV0RDIDY1ODE2IGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIFNUQVRJQ19UQUJMRQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2luY2x1ZGUgInc2NS1vcGMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyAgIGZwcmludGZfZnR5cGUgZnByOwotc3RhdGljICAgdm9pZCAqc3RyZWFtOwotc3RhdGljICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmxvY2FsX2luZm87Ci0jaWYgMAotc3RhdGljIGNoYXIgKmxuYW1lW10gPSAgeyJyMCIsInIxIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIsInI3IiwiczAifTsKLQotc3RhdGljIGNoYXIgKmZpbmRuYW1lICh2YWwpCi0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci17Ci0gIGlmICh2YWwgPj0gMHgxMCAmJiB2YWwgPD0gMHgyMCkKLSAgICByZXR1cm4gbG5hbWVbKHZhbCAtIDB4MTApIC8gMl07Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZCAobG9va3VwLCBmb3JtYXQsIGFyZ3MpCi0gICAgIGludCBsb29rdXA7Ci0gICAgIGNoYXIgKmZvcm1hdDsKLSAgICAgdW5zaWduZWQgICAgIGludCAqYXJnczsKLXsKLSAgaW50IHZhbDsKLSAgaW50IGM7Ci0KLSAgd2hpbGUgKCpmb3JtYXQpCi0gICAgewotICAgICAgc3dpdGNoICggYyA9ICpmb3JtYXQrKykgCi0JewotCWNhc2UgJyQnOgotCSAgdmFsID0gYXJnc1soKmZvcm1hdCsrKSAtICcwJ107Ci0JICBpZiAobG9va3VwKSAKLQkgICAgewotI2lmIDAKLQkgICAgICBuYW1lID0gZmluZG5hbWUodmFsKTsKLQkgICAgICBpZiAobmFtZSkKLQkJZnByKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JICAgICAgZWxzZQotI2VuZGlmCi0JCWxvY2FsX2luZm8tPnByaW50X2FkZHJlc3NfZnVuYyAodmFsLCBsb2NhbF9pbmZvKTsgIAotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZwciAoc3RyZWFtLCAiMHgleCIsIHZhbCk7Ci0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBmcHIoc3RyZWFtLCIlYyIsIGMpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLWludCAKLXByaW50X2luc25fdzY1KG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0KLQotICBpbnQgc3RhdHVzID0gMDsKLSAgdW5zaWduZWQgY2hhciBpbnNuWzRdOwotICByZWdpc3RlciBzdHJ1Y3Qgb3BpbmZvICpvcDsKLSAgaW50IGk7Ci0gIGludCBYID0wOwotICBpbnQgTSA9IDA7Ci0gIGludCBhcmdzWzJdOwotc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHIgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci1sb2NhbF9pbmZvID0gICAgaW5mbzsKLSAgZm9yIChpID0gMDsgaSA8NCAmJiBzdGF0dXMgPT0gMDsgaSsrKSAKLSAgICB7Ci0gICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyhtZW1hZGRyK2ksIGluc24gKyBpLCAxLCBpbmZvKTsKLSAgfQotCi0KLSAgZm9yIChvcCA9IG9wdGFibGU7IG9wLT52YWwgIT0gaW5zblswXTsgb3ArKykgCi0gICAgOwotCi0gIGZwcihzdHJlYW0sIiVzIiwgb3AtPm5hbWUpOwotICAKLSAgLyogUHJlcGFyZSBhbGwgdGhlIHBvc2libGUgb3BlcmFuZCB2YWx1ZXMgKi8KLSAgewotICAgIGludCBzaXplID0gMTsKLSAgICBpbnQgYXNSX1c2NV9BQlM4ID0gaW5zblsxXTsKLSAgICBpbnQgYXNSX1c2NV9BQlMxNiA9IChpbnNuWzJdIDw8IDgpICsgYXNSX1c2NV9BQlM4OwotICAgIGludCBhc1JfVzY1X0FCUzI0ID0gKGluc25bM10gPDwgMTYpICsgYXNSX1c2NV9BQlMxNjsKLSAgICBpbnQgYXNSX1c2NV9QQ1I4ID0gKChjaGFyKShhc1JfVzY1X0FCUzgpKSArIG1lbWFkZHIgKyAyOwotICAgIGludCBhc1JfVzY1X1BDUjE2ID0gKChzaG9ydCkoYXNSX1c2NV9BQlMxNikpICsgbWVtYWRkciArIDM7Ci0KLSAgICBzd2l0Y2ggKG9wLT5hbW9kZSkgewotICAgICAgRElTQVNNKCk7Ci0gICAgfQotCi0gIHJldHVybiBzaXplOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdzY1LW9wYy5oIGIvb3Bjb2Rlcy93NjUtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzM1MzUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy93NjUtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NDggKzAsMCBAQAotCQkJLyogV0RDIDY1ODE2IEFzc2VtYmxlciBvcGNvZGUgdGFibGUgKi8KLQkJCS8qICAgKGdlbmVyYXRlZCBieSB0aGUgcHJvZ3JhbSBzaW0vdzY1L2dlbmNvZGUgLWEpICovCi0jZGVmaW5lIEFERFJfSU1NVE9BICAgICAgICAgICAgICAxCSAvKiAjYSAgICAgICovCi0jZGVmaW5lIEFERFJfSU1NQ09QICAgICAgICAgICAgICAyCSAvKiAjYyAgICAgICovCi0jZGVmaW5lIEFERFJfSU1NVE9JICAgICAgICAgICAgICAzCSAvKiAjaSAgICAgICovCi0jZGVmaW5lIEFERFJfQUNDICAgICAgICAgICAgICAgICA0CSAvKiBBICAgICAgICovCi0jZGVmaW5lIEFERFJfUENfUkVMICAgICAgICAgICAgICA1CSAvKiByICAgICAgICovCi0jZGVmaW5lIEFERFJfUENfUkVMX0xPTkcgICAgICAgICA2CSAvKiBybCAgICAgICovCi0jZGVmaW5lIEFERFJfSU1QTElFRCAgICAgICAgICAgICA3CSAvKiBpICAgICAgICovCi0jZGVmaW5lIEFERFJfU1RBQ0sgICAgICAgICAgICAgICA4CSAvKiBzICAgICAgICovCi0jZGVmaW5lIEFERFJfRElSICAgICAgICAgICAgICAgICA5CSAvKiBkICAgICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lEWF9YICAgICAgICAgICAxMAkgLyogZCx4ICAgICAqLwotI2RlZmluZSBBRERSX0RJUl9JRFhfWSAgICAgICAgICAgMTEJIC8qIGQseSAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSU5EICAgICAgICAgICAgIDEyCSAvKiAoZCkgICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lEWF9JTkRfWCAgICAgICAxMwkgLyogKGQseCkgICAqLwotI2RlZmluZSBBRERSX0RJUl9JTkRfSURYX1kgICAgICAgMTQJIC8qIChkKSx5ICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSU5EX0xPTkcgICAgICAgIDE1CSAvKiBbZF0gICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lORF9JRFhfWV9MT05HICAxNgkgLyogW2RdLHkgICAqLwotI2RlZmluZSBBRERSX0FCUyAgICAgICAgICAgICAgICAgMTcJIC8qIGEgICAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfSURYX1ggICAgICAgICAgIDE4CSAvKiBhLHggICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0lEWF9ZICAgICAgICAgICAxOQkgLyogYSx5ICAgICAqLwotI2RlZmluZSBBRERSX0FCU19MT05HICAgICAgICAgICAgMjAJIC8qIGFsICAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfSU5EX0xPTkcgICAgICAgIDIxCSAvKiBbYV0gICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0xPTkdfSURYX1ggICAgICAyMgkgLyogYWwseCAgICAqLwotI2RlZmluZSBBRERSX1NUQUNLX1JFTCAgICAgICAgICAgMjMJIC8qIGQscyAgICAgKi8KLSNkZWZpbmUgQUREUl9TVEFDS19SRUxfSU5EWF9JRFggIDI0CSAvKiAoZCxzKSx5ICovCi0jZGVmaW5lIEFERFJfQUJTX0lORCAgICAgICAgICAgICAyNQkgLyogKGEpICAgICAqLwotI2RlZmluZSBBRERSX0FCU19JTkRfSURYICAgICAgICAgMjYJIC8qIChhLHgpICAgKi8KLSNkZWZpbmUgQUREUl9CTE9DS19NT1ZFICAgICAgICAgIDI3CSAvKiB4eXogICAgICovCi1zdHJ1Y3Qgb3BpbmZvIHsKLQlpbnQgdmFsOwotCWludCBjb2RlOwotCWNoYXIgKm5hbWU7Ci0JaW50IGFtb2RlOwotfTsKLXN0cnVjdCBvcGluZm8gb3B0YWJsZVsyNTddPXsKLSNkZWZpbmUgT19hZGMgMQotI2RlZmluZSBPX2FuZCAyCi0jZGVmaW5lIE9fYXNsIDMKLSNkZWZpbmUgT19iY2MgNAotI2RlZmluZSBPX2JjcyA1Ci0jZGVmaW5lIE9fYmVxIDYKLSNkZWZpbmUgT19iaXQgNwotI2RlZmluZSBPX2JtaSA4Ci0jZGVmaW5lIE9fYm5lIDkKLSNkZWZpbmUgT19icGwgMTAKLSNkZWZpbmUgT19icmEgMTEKLSNkZWZpbmUgT19icmsgMTIKLSNkZWZpbmUgT19icmwgMTMKLSNkZWZpbmUgT19idmMgMTQKLSNkZWZpbmUgT19idnMgMTUKLSNkZWZpbmUgT19jbGMgMTYKLSNkZWZpbmUgT19jbGQgMTcKLSNkZWZpbmUgT19jbGkgMTgKLSNkZWZpbmUgT19jbHYgMTkKLSNkZWZpbmUgT19jbXAgMjAKLSNkZWZpbmUgT19jb3AgMjEKLSNkZWZpbmUgT19jcHggMjIKLSNkZWZpbmUgT19jcHkgMjMKLSNkZWZpbmUgT19kZWMgMjQKLSNkZWZpbmUgT19kZXggMjUKLSNkZWZpbmUgT19kZXkgMjYKLSNkZWZpbmUgT19lb3IgMjcKLSNkZWZpbmUgT19pbmMgMjgKLSNkZWZpbmUgT19pbnggMjkKLSNkZWZpbmUgT19pbnkgMzAKLSNkZWZpbmUgT19qbXAgMzEKLSNkZWZpbmUgT19qc3IgMzIKLSNkZWZpbmUgT19sZGEgMzMKLSNkZWZpbmUgT19sZHggMzQKLSNkZWZpbmUgT19sZHkgMzUKLSNkZWZpbmUgT19sc3IgMzYKLSNkZWZpbmUgT19tdm4gMzcKLSNkZWZpbmUgT19tdnAgMzgKLSNkZWZpbmUgT19ub3AgMzkKLSNkZWZpbmUgT19vcmEgNDAKLSNkZWZpbmUgT19wZWEgNDEKLSNkZWZpbmUgT19wZWkgNDIKLSNkZWZpbmUgT19wZXIgNDMKLSNkZWZpbmUgT19waGEgNDQKLSNkZWZpbmUgT19waGIgNDUKLSNkZWZpbmUgT19waGQgNDYKLSNkZWZpbmUgT19waGsgNDcKLSNkZWZpbmUgT19waHAgNDgKLSNkZWZpbmUgT19waHggNDkKLSNkZWZpbmUgT19waHkgNTAKLSNkZWZpbmUgT19wbGEgNTEKLSNkZWZpbmUgT19wbGIgNTIKLSNkZWZpbmUgT19wbGQgNTMKLSNkZWZpbmUgT19wbHAgNTQKLSNkZWZpbmUgT19wbHggNTUKLSNkZWZpbmUgT19wbHkgNTYKLSNkZWZpbmUgT19yZXAgNTcKLSNkZWZpbmUgT19yb2wgNTgKLSNkZWZpbmUgT19yb3IgNTkKLSNkZWZpbmUgT19ydGkgNjAKLSNkZWZpbmUgT19ydGwgNjEKLSNkZWZpbmUgT19ydHMgNjIKLSNkZWZpbmUgT19zYmMgNjMKLSNkZWZpbmUgT19zZWMgNjQKLSNkZWZpbmUgT19zZWQgNjUKLSNkZWZpbmUgT19zZWkgNjYKLSNkZWZpbmUgT19zZXAgNjcKLSNkZWZpbmUgT19zdGEgNjgKLSNkZWZpbmUgT19zdHAgNjkKLSNkZWZpbmUgT19zdHggNzAKLSNkZWZpbmUgT19zdHkgNzEKLSNkZWZpbmUgT19zdHogNzIKLSNkZWZpbmUgT190YXggNzMKLSNkZWZpbmUgT190YXkgNzQKLSNkZWZpbmUgT190Y2QgNzUKLSNkZWZpbmUgT190Y3MgNzYKLSNkZWZpbmUgT190ZGMgNzcKLSNkZWZpbmUgT190cmIgNzgKLSNkZWZpbmUgT190c2IgNzkKLSNkZWZpbmUgT190c2MgODAKLSNkZWZpbmUgT190c3ggODEKLSNkZWZpbmUgT190eGEgODIKLSNkZWZpbmUgT190eHMgODMKLSNkZWZpbmUgT190eHkgODQKLSNkZWZpbmUgT190eWEgODUKLSNkZWZpbmUgT190eXggODYKLSNkZWZpbmUgT193YWkgODcKLSNkZWZpbmUgT193ZG0gODgKLSNkZWZpbmUgT194YmEgODkKLSNkZWZpbmUgT194Y2UgOTAKLSNpZmRlZiBERUZJTkVfVEFCTEUKLQl7MHg2OSwJT19hZGMsCSJhZGMiLAlBRERSX0lNTVRPQX0sCi0JezB4NzIsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSU5EfSwKLQl7MHg3MSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDczLAlPX2FkYywJImFkYyIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHg2MSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDY3LAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHg3NywJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4NkQsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlN9LAotCXsweDdELAlPX2FkYywJImFkYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg3OSwJT19hZGMsCSJhZGMiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4NkYsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfTE9OR30sCi0JezB4N0YsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4NjUsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJ9LAotCXsweDYzLAlPX2FkYywJImFkYyIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHg3NSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MjksCU9fYW5kLAkiYW5kIiwJQUREUl9JTU1UT0F9LAotCXsweDMyLAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lORH0sCi0JezB4MzEsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHgzMywJT19hbmQsCSJhbmQiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4MjEsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHgyNywJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4MzcsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDJELAlPX2FuZCwJImFuZCIsCUFERFJfQUJTfSwKLQl7MHgzRCwJT19hbmQsCSJhbmQiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MzksCU9fYW5kLAkiYW5kIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDJGLAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0xPTkd9LAotCXsweDNGLAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDI1LAlPX2FuZCwJImFuZCIsCUFERFJfRElSfSwKLQl7MHgyMywJT19hbmQsCSJhbmQiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4MzUsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDBBLAlPX2FzbCwJImFzbCIsCUFERFJfQUNDfSwKLQl7MHgwRSwJT19hc2wsCSJhc2wiLAlBRERSX0FCU30sCi0JezB4MUUsCU9fYXNsLAkiYXNsIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDA2LAlPX2FzbCwJImFzbCIsCUFERFJfRElSfSwKLQl7MHgxNiwJT19hc2wsCSJhc2wiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4OTAsCU9fYmNjLAkiYmNjIiwJQUREUl9QQ19SRUx9LAotCXsweEIwLAlPX2JjcywJImJjcyIsCUFERFJfUENfUkVMfSwKLQl7MHhGMCwJT19iZXEsCSJiZXEiLAlBRERSX1BDX1JFTH0sCi0JezB4ODksCU9fYml0LAkiYml0IiwJQUREUl9JTU1UT0F9LAotCXsweDI0LAlPX2JpdCwJImJpdCIsCUFERFJfRElSX0lORH0sCi0JezB4MzQsCU9fYml0LAkiYml0IiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHgyQywJT19iaXQsCSJiaXQiLAlBRERSX0FCU30sCi0JezB4M0MsCU9fYml0LAkiYml0IiwJQUREUl9BQlNfSURYX1h9LAotCXsweDMwLAlPX2JtaSwJImJtaSIsCUFERFJfUENfUkVMfSwKLQl7MHhEMCwJT19ibmUsCSJibmUiLAlBRERSX1BDX1JFTH0sCi0JezB4MTAsCU9fYnBsLAkiYnBsIiwJQUREUl9QQ19SRUx9LAotCXsweDgwLAlPX2JyYSwJImJyYSIsCUFERFJfUENfUkVMfSwKLQl7MHgwMCwJT19icmssCSJicmsiLAlBRERSX1NUQUNLfSwKLQl7MHg4MiwJT19icmwsCSJicmwiLAlBRERSX1BDX1JFTF9MT05HfSwKLQl7MHg1MCwJT19idmMsCSJidmMiLAlBRERSX1BDX1JFTH0sCi0JezB4NzAsCU9fYnZzLAkiYnZzIiwJQUREUl9QQ19SRUx9LAotCXsweDE4LAlPX2NsYywJImNsYyIsCUFERFJfSU1QTElFRH0sCi0JezB4RDgsCU9fY2xkLAkiY2xkIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg1OCwJT19jbGksCSJjbGkiLAlBRERSX0lNUExJRUR9LAotCXsweEI4LAlPX2NsdiwJImNsdiIsCUFERFJfSU1QTElFRH0sCi0JezB4QzksCU9fY21wLAkiY21wIiwJQUREUl9JTU1UT0F9LAotCXsweEQyLAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lORH0sCi0JezB4RDEsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHhEMywJT19jbXAsCSJjbXAiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4QzEsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHhDNywJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4RDcsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweENELAlPX2NtcCwJImNtcCIsCUFERFJfQUJTfSwKLQl7MHhERCwJT19jbXAsCSJjbXAiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4RDksCU9fY21wLAkiY21wIiwJQUREUl9BQlNfSURYX1l9LAotCXsweENGLAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0xPTkd9LAotCXsweERGLAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweEM1LAlPX2NtcCwJImNtcCIsCUFERFJfRElSfSwKLQl7MHhDMywJT19jbXAsCSJjbXAiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4RDUsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDAyLAlPX2NvcCwJImNvcCIsCUFERFJfSU1NQ09QfSwKLQl7MHhFMCwJT19jcHgsCSJjcHgiLAlBRERSX0lNTVRPSX0sCi0JezB4RUMsCU9fY3B4LAkiY3B4IiwJQUREUl9BQlN9LAotCXsweEU0LAlPX2NweCwJImNweCIsCUFERFJfRElSfSwKLQl7MHhDMCwJT19jcHksCSJjcHkiLAlBRERSX0lNTVRPSX0sCi0JezB4Q0MsCU9fY3B5LAkiY3B5IiwJQUREUl9BQlN9LAotCXsweEM0LAlPX2NweSwJImNweSIsCUFERFJfRElSfSwKLQl7MHgzQSwJT19kZWMsCSJkZWMiLAlBRERSX0FDQ30sCi0JezB4Q0UsCU9fZGVjLAkiZGVjIiwJQUREUl9BQlN9LAotCXsweERFLAlPX2RlYywJImRlYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhDNiwJT19kZWMsCSJkZWMiLAlBRERSX0RJUn0sCi0JezB4RDYsCU9fZGVjLAkiZGVjIiwJQUREUl9ESVJfSURYX1h9LAotCXsweENBLAlPX2RleCwJImRleCIsCUFERFJfSU1QTElFRH0sCi0JezB4ODgsCU9fZGV5LAkiZGV5IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg0OSwJT19lb3IsCSJlb3IiLAlBRERSX0lNTVRPQX0sCi0JezB4NTIsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSU5EfSwKLQl7MHg1MSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDUzLAlPX2VvciwJImVvciIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHg0MSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDQ3LAlPX2VvciwJImVvciIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHg1NywJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4NEQsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlN9LAotCXsweDVELAlPX2VvciwJImVvciIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg1OSwJT19lb3IsCSJlb3IiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4NEYsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfTE9OR30sCi0JezB4NUYsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4NDUsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJ9LAotCXsweDQzLAlPX2VvciwJImVvciIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHg1NSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MUEsCU9faW5jLAkiaW5jIiwJQUREUl9BQ0N9LAotCXsweEVFLAlPX2luYywJImluYyIsCUFERFJfQUJTfSwKLQl7MHhGRSwJT19pbmMsCSJpbmMiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4RTYsCU9faW5jLAkiaW5jIiwJQUREUl9ESVJ9LAotCXsweEY2LAlPX2luYywJImluYyIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHhFOCwJT19pbngsCSJpbngiLAlBRERSX0lNUExJRUR9LAotCXsweEM4LAlPX2lueSwJImlueSIsCUFERFJfSU1QTElFRH0sCi0JezB4NkMsCU9fam1wLAkiam1wIiwJQUREUl9BQlNfSU5EfSwKLQl7MHg3QywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkRfSURYfSwKLQl7MHhEQywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkRfTE9OR30sCi0JezB4NEMsCU9fam1wLAkiam1wIiwJQUREUl9BQlN9LAotCXsweDVDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTX0xPTkd9LAotCXsweEZDLAlPX2pzciwJImpzciIsCUFERFJfQUJTX0lORF9JRFh9LAotCXsweDIwLAlPX2pzciwJImpzciIsCUFERFJfQUJTfSwKLQl7MHgyMiwJT19qc3IsCSJqc3IiLAlBRERSX0FCU19MT05HfSwKLQl7MHhBOSwJT19sZGEsCSJsZGEiLAlBRERSX0lNTVRPQX0sCi0JezB4QjIsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSU5EfSwKLQl7MHhCMSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweEIzLAlPX2xkYSwJImxkYSIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHhBMSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweEE3LAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHhCNywJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4QUQsCU9fbGRhLAkibGRhIiwJQUREUl9BQlN9LAotCXsweEJELAlPX2xkYSwJImxkYSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhCOSwJT19sZGEsCSJsZGEiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4QUYsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfTE9OR30sCi0JezB4QkYsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4QTUsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJ9LAotCXsweEEzLAlPX2xkYSwJImxkYSIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHhCNSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4QTIsCU9fbGR4LAkibGR4IiwJQUREUl9JTU1UT0l9LAotCXsweEFFLAlPX2xkeCwJImxkeCIsCUFERFJfQUJTfSwKLQl7MHhCRSwJT19sZHgsCSJsZHgiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4QTYsCU9fbGR4LAkibGR4IiwJQUREUl9ESVJ9LAotCXsweEI2LAlPX2xkeCwJImxkeCIsCUFERFJfRElSX0lEWF9ZfSwKLQl7MHhBMCwJT19sZHksCSJsZHkiLAlBRERSX0lNTVRPSX0sCi0JezB4QUMsCU9fbGR5LAkibGR5IiwJQUREUl9BQlN9LAotCXsweEJDLAlPX2xkeSwJImxkeSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhBNCwJT19sZHksCSJsZHkiLAlBRERSX0RJUn0sCi0JezB4QjQsCU9fbGR5LAkibGR5IiwJQUREUl9ESVJfSURYX1h9LAotCXsweDRBLAlPX2xzciwJImxzciIsCUFERFJfQUNDfSwKLQl7MHg0RSwJT19sc3IsCSJsc3IiLAlBRERSX0FCU30sCi0JezB4NUUsCU9fbHNyLAkibHNyIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDQ2LAlPX2xzciwJImxzciIsCUFERFJfRElSfSwKLQl7MHg1NiwJT19sc3IsCSJsc3IiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4NTQsCU9fbXZuLAkibXZuIiwJQUREUl9CTE9DS19NT1ZFfSwKLQl7MHg0NCwJT19tdnAsCSJtdnAiLAlBRERSX0JMT0NLX01PVkV9LAotCXsweEVBLAlPX25vcCwJIm5vcCIsCUFERFJfSU1QTElFRH0sCi0JezB4MDksCU9fb3JhLAkib3JhIiwJQUREUl9JTU1UT0F9LAotCXsweDEyLAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lORH0sCi0JezB4MTEsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHgxMywJT19vcmEsCSJvcmEiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4MDEsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHgwNywJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4MTcsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDBELAlPX29yYSwJIm9yYSIsCUFERFJfQUJTfSwKLQl7MHgxRCwJT19vcmEsCSJvcmEiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MTksCU9fb3JhLAkib3JhIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDBGLAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0xPTkd9LAotCXsweDFGLAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDA1LAlPX29yYSwJIm9yYSIsCUFERFJfRElSfSwKLQl7MHgwMywJT19vcmEsCSJvcmEiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4MTUsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSURYX1h9LAotCXsweEY0LAlPX3BlYSwJInBlYSIsCUFERFJfQUJTfSwKLQl7MHhENCwJT19wZWksCSJwZWkiLAlBRERSX0RJUn0sCi0JezB4NjIsCU9fcGVyLAkicGVyIiwJQUREUl9QQ19SRUxfTE9OR30sCi0JezB4NDgsCU9fcGhhLAkicGhhIiwJQUREUl9TVEFDS30sCi0JezB4OEIsCU9fcGhiLAkicGhiIiwJQUREUl9TVEFDS30sCi0JezB4MEIsCU9fcGhkLAkicGhkIiwJQUREUl9TVEFDS30sCi0JezB4NEIsCU9fcGhrLAkicGhrIiwJQUREUl9TVEFDS30sCi0JezB4MDgsCU9fcGhwLAkicGhwIiwJQUREUl9TVEFDS30sCi0JezB4REEsCU9fcGh4LAkicGh4IiwJQUREUl9TVEFDS30sCi0JezB4NUEsCU9fcGh5LAkicGh5IiwJQUREUl9TVEFDS30sCi0JezB4NjgsCU9fcGxhLAkicGxhIiwJQUREUl9TVEFDS30sCi0JezB4QUIsCU9fcGxiLAkicGxiIiwJQUREUl9TVEFDS30sCi0JezB4MkIsCU9fcGxkLAkicGxkIiwJQUREUl9TVEFDS30sCi0JezB4MjgsCU9fcGxwLAkicGxwIiwJQUREUl9TVEFDS30sCi0JezB4RkEsCU9fcGx4LAkicGx4IiwJQUREUl9TVEFDS30sCi0JezB4N0EsCU9fcGx5LAkicGx5IiwJQUREUl9TVEFDS30sCi0JezB4QzIsCU9fcmVwLAkicmVwIiwJQUREUl9JTU1DT1B9LAotCXsweDJBLAlPX3JvbCwJInJvbCIsCUFERFJfQUNDfSwKLQl7MHgyRSwJT19yb2wsCSJyb2wiLAlBRERSX0FCU30sCi0JezB4M0UsCU9fcm9sLAkicm9sIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDI2LAlPX3JvbCwJInJvbCIsCUFERFJfRElSfSwKLQl7MHgzNiwJT19yb2wsCSJyb2wiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4NkEsCU9fcm9yLAkicm9yIiwJQUREUl9BQ0N9LAotCXsweDZFLAlPX3JvciwJInJvciIsCUFERFJfQUJTfSwKLQl7MHg3RSwJT19yb3IsCSJyb3IiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4NjYsCU9fcm9yLAkicm9yIiwJQUREUl9ESVJ9LAotCXsweDc2LAlPX3JvciwJInJvciIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg0MCwJT19ydGksCSJydGkiLAlBRERSX1NUQUNLfSwKLQl7MHg2QiwJT19ydGwsCSJydGwiLAlBRERSX1NUQUNLfSwKLQl7MHg2MCwJT19ydHMsCSJydHMiLAlBRERSX1NUQUNLfSwKLQl7MHhFOSwJT19zYmMsCSJzYmMiLAlBRERSX0lNTVRPQX0sCi0JezB4RjIsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSU5EfSwKLQl7MHhGMSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweEYzLAlPX3NiYywJInNiYyIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHhFMSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweEU3LAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHhGNywJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4RUQsCU9fc2JjLAkic2JjIiwJQUREUl9BQlN9LAotCXsweEZELAlPX3NiYywJInNiYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhGOSwJT19zYmMsCSJzYmMiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4RUYsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfTE9OR30sCi0JezB4RkYsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4RTUsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJ9LAotCXsweEUzLAlPX3NiYywJInNiYyIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHhGNSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MzgsCU9fc2VjLAkic2VjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhGOCwJT19zZWQsCSJzZWQiLAlBRERSX0lNUExJRUR9LAotCXsweDc4LAlPX3NlaSwJInNlaSIsCUFERFJfSU1QTElFRH0sCi0JezB4RTIsCU9fc2VwLAkic2VwIiwJQUREUl9JTU1DT1B9LAotCXsweDkyLAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lORH0sCi0JezB4OTEsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHg5MywJT19zdGEsCSJzdGEiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4ODEsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHg4NywJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4OTcsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDhELAlPX3N0YSwJInN0YSIsCUFERFJfQUJTfSwKLQl7MHg5RCwJT19zdGEsCSJzdGEiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4OTksCU9fc3RhLAkic3RhIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDhGLAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0xPTkd9LAotCXsweDlGLAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDg1LAlPX3N0YSwJInN0YSIsCUFERFJfRElSfSwKLQl7MHg4MywJT19zdGEsCSJzdGEiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4OTUsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSURYX1h9LAotCXsweERCLAlPX3N0cCwJInN0cCIsCUFERFJfSU1QTElFRH0sCi0JezB4OEUsCU9fc3R4LAkic3R4IiwJQUREUl9BQlN9LAotCXsweDg2LAlPX3N0eCwJInN0eCIsCUFERFJfRElSfSwKLQl7MHg5NiwJT19zdHgsCSJzdHgiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4OEMsCU9fc3R5LAkic3R5IiwJQUREUl9BQlN9LAotCXsweDg0LAlPX3N0eSwJInN0eSIsCUFERFJfRElSfSwKLQl7MHg5NCwJT19zdHksCSJzdHkiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4OUMsCU9fc3R6LAkic3R6IiwJQUREUl9BQlN9LAotCXsweDlFLAlPX3N0eiwJInN0eiIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg2NCwJT19zdHosCSJzdHoiLAlBRERSX0RJUn0sCi0JezB4NzQsCU9fc3R6LAkic3R6IiwJQUREUl9ESVJfSURYX1h9LAotCXsweEFBLAlPX3RheCwJInRheCIsCUFERFJfSU1QTElFRH0sCi0JezB4QTgsCU9fdGF5LAkidGF5IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg1QiwJT190Y2QsCSJ0Y2QiLAlBRERSX0lNUExJRUR9LAotCXsweDFCLAlPX3RjcywJInRjcyIsCUFERFJfSU1QTElFRH0sCi0JezB4N0IsCU9fdGRjLAkidGRjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHgxQywJT190cmIsCSJ0cmIiLAlBRERSX0FCU30sCi0JezB4MTQsCU9fdHJiLAkidHJiIiwJQUREUl9ESVJ9LAotCXsweDBDLAlPX3RzYiwJInRzYiIsCUFERFJfQUJTfSwKLQl7MHgwNCwJT190c2IsCSJ0c2IiLAlBRERSX0RJUn0sCi0JezB4M0IsCU9fdHNjLAkidHNjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhCQSwJT190c3gsCSJ0c3giLAlBRERSX0lNUExJRUR9LAotCXsweDhBLAlPX3R4YSwJInR4YSIsCUFERFJfSU1QTElFRH0sCi0JezB4OUEsCU9fdHhzLAkidHhzIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg5QiwJT190eHksCSJ0eHkiLAlBRERSX0lNUExJRUR9LAotCXsweDk4LAlPX3R5YSwJInR5YSIsCUFERFJfSU1QTElFRH0sCi0JezB4QkIsCU9fdHl4LAkidHl4IiwJQUREUl9JTVBMSUVEfSwKLQl7MHhDQiwJT193YWksCSJ3YWkiLAlBRERSX0lNUExJRUR9LAotCXsweDQyLAlPX3dkbSwJIndkbSIsCUFERFJfSU1QTElFRH0sCi0JezB4RUIsCU9feGJhLAkieGJhIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhGQiwJT194Y2UsCSJ4Y2UiLAlBRERSX0lNUExJRUR9LAotCXsgMCB9Ci19OwotI2VuZGlmCi0jZGVmaW5lIERJU0FTTSgpXAotICBjYXNlIEFERFJfSU1NVE9BOlwKLQlhcmdzWzBdID0gTT09MCA/IGFzUl9XNjVfQUJTMTYgOiBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJIyQwIiwgYXJncyk7XAotCXNpemUgKz0gTT09MCA/IDI6MTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfSU1NQ09QOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSMkMCIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0lNTVRPSTpcCi0JYXJnc1swXSA9IFg9PTAgPyBhc1JfVzY1X0FCUzE2IDogYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSMkMCIsIGFyZ3MpO1wKLQlzaXplICs9IFg9PTAgPyAyOjE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FDQzpcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIglhIiwgMCk7XAotCXNpemUgKz0gMDtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfUENfUkVMOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9QQ1I4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSQwIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfUENfUkVMX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X1BDUjE2O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSQwIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfSU1QTElFRDpcCi0JCXNpemUgKz0gMDtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfU1RBQ0s6XAotCQlzaXplICs9IDA7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUjpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk8JDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSURYX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJPCQwLHgiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSURYX1k6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJPCQwLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSg8JDApIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lEWF9JTkRfWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoPCQwLHgpIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lORF9JRFhfWTpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoPCQwKSx5IiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lORF9MT05HOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCVskMF0iLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJWyQwXSx5IiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkhJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSURYX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSEkMCx4IiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0lEWF9ZOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkhJDAseSIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19MT05HOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMyNDtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk+JDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAzO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSU5EX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCVs+JDBdIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0xPTkdfSURYX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzI0O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCT4kMCx4IiwgYXJncyk7XAotCXNpemUgKz0gMztcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfU1RBQ0tfUkVMOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSQwLHMiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9TVEFDS19SRUxfSU5EWF9JRFg6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJKCQwLHMpLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSU5EOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoJDApIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0lORF9JRFg6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSgkMCx4KSIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0JMT0NLX01PVkU6XAotCWFyZ3NbMF0gPSAoYXNSX1c2NV9BQlMxNiA+PjgpICYweGZmO1wKLQlhcmdzWzFdID0gKCBhc1JfVzY1X0FCUzE2ICYgMHhmZik7XAotCXByaW50X29wZXJhbmQgKDAsIgkkMCwkMSIsYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotCi0jZGVmaW5lIEdFVElORk8oc2l6ZSx0eXBlLHBjcmVsKVwKLQljYXNlIEFERFJfSU1NVE9BOiBzaXplID0gTT09MCA/IDI6MTt0eXBlPU09PTAgPyBSX1c2NV9BQlMxNiA6IFJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0lNTUNPUDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9JTU1UT0k6IHNpemUgPSBYPT0wID8gMjoxO3R5cGU9WD09MCA/IFJfVzY1X0FCUzE2IDogUl9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUNDOiBzaXplID0gMDt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9QQ19SRUw6IHNpemUgPSAxO3R5cGU9Ul9XNjVfUENSODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfUENfUkVMX0xPTkc6IHNpemUgPSAyO3R5cGU9Ul9XNjVfUENSMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0lNUExJRUQ6IHNpemUgPSAwO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX1NUQUNLOiBzaXplID0gMDt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVI6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lEWF9YOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JRFhfWTogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JRFhfSU5EX1g6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lORF9JRFhfWTogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EX0xPTkc6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lORF9JRFhfWV9MT05HOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCUzogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0lEWF9YOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSURYX1k6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19MT05HOiBzaXplID0gMzt0eXBlPVJfVzY1X0FCUzI0O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSU5EX0xPTkc6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19MT05HX0lEWF9YOiBzaXplID0gMzt0eXBlPVJfVzY1X0FCUzI0O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9TVEFDS19SRUw6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfU1RBQ0tfUkVMX0lORFhfSURYOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JTkQ6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JTkRfSURYOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9CTE9DS19NT1ZFOiBzaXplID0gMjt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCmRpZmYgLS1naXQgYS9vcGNvZGVzL3o4ay1kaXMuYyBiL29wY29kZXMvejhrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTIzNjIyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvejhrLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIHo4MDAwIGNvZGUuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAiejhrLW9wYy5oIgotCi0MCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLQwKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRoZXNlIGFyZSBhbGwgaW5kZXhlZCBieSBuaWJibGUgbnVtYmVyIChpLmUgb25seSBldmVyeSBvdGhlciBlbnRyeQotICAgICBvZiBieXRlcyBpcyB1c2VkLCBhbmQgZXZlcnkgNHRoIGVudHJ5IG9mIHdvcmRzKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbmliYmxlc1syNF07Ci0gIHVuc2lnbmVkIGNoYXIgYnl0ZXNbMjRdOwotICB1bnNpZ25lZCBzaG9ydCB3b3Jkc1syNF07Ci0KLSAgLyogTmliYmxlIG51bWJlciBvZiBmaXJzdCB3b3JkIG5vdCB5ZXQgZmV0Y2hlZC4gICovCi0gIGludCBtYXhfZmV0Y2hlZDsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci0KLSAgbG9uZyB0YWJsX2luZGV4OwotICBjaGFyIGluc3RyX2FzbXNyY1s4MF07Ci0gIHVuc2lnbmVkIGxvbmcgYXJnX3JlZ1sweDBmXTsKLSAgdW5zaWduZWQgbG9uZyBpbW1lZGlhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgZGlzcGxhY2VtZW50OwotICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0gIHVuc2lnbmVkIGxvbmcgY29uZF9jb2RlOwotICB1bnNpZ25lZCBsb25nIGN0cmxfY29kZTsKLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgdW5zaWduZWQgbG9uZyBpbnRlcnJ1cHRzOwotfQotaW5zdHJfZGF0YV9zOwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBuaWJibGUpIFwKLSAgKChuaWJibGUpIDwgKChpbnN0cl9kYXRhX3MgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKG5pYmJsZSkpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBuaWJibGUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgbmliYmxlOwotewotICB1bnNpZ25lZCBjaGFyIG15YnVmWzIwXTsKLSAgaW50IHN0YXR1czsKLSAgaW5zdHJfZGF0YV9zICpwcml2ID0gKGluc3RyX2RhdGFfcyAqKWluZm8tPnByaXZhdGVfZGF0YTsKLQotICBpZiAoKG5pYmJsZSAlIDQpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocHJpdi0+aW5zbl9zdGFydCwKLQkJCQkgICAgICAoYmZkX2J5dGUgKikgbXlidWYsCi0JCQkJICAgICAgbmliYmxlIC8gMiwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHByaXYtPmluc25fc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotCi0gIHsKLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyICpwID0gbXlidWYgOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBuaWJibGU7KQotICAgICAgewotCXByaXYtPndvcmRzW2ldID0gKHBbMF0gPDwgOCkgfCBwWzFdOwotCQotCXByaXYtPmJ5dGVzW2ldID0gKnA7Ci0JcHJpdi0+bmliYmxlc1tpKytdID0gKnAgPj4gNDsKLQlwcml2LT5uaWJibGVzW2krK10gPSAqcCAmMHhmOwotCi0JKytwOwotCXByaXYtPmJ5dGVzW2ldID0gKnA7Ci0JcHJpdi0+bmliYmxlc1tpKytdID0gKnAgPj4gNDsKLQlwcml2LT5uaWJibGVzW2krK10gPSAqcCAmIDB4ZjsKLQotCSsrcDsKLSAgICAgIH0KLSAgfQotICBwcml2LT5tYXhfZmV0Y2hlZCA9IG5pYmJsZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICpjb2Rlc1sxNl0gPQotewotICAiZiIsCi0gICJsdCIsCi0gICJsZSIsCi0gICJ1bGUiLAotICAib3YvcGUiLAotICAibWkiLAotICAiZXEiLAotICAiYy91bHQiLAotICAidCIsCi0gICJnZSIsCi0gICJndCIsCi0gICJ1Z3QiLAotICAibm92L3BvIiwKLSAgInBsIiwKLSAgIm5lIiwKLSAgIm5jL3VnZSIKLX07Ci0KLWludCB6OGtfbG9va3VwX2luc3RyIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIqLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLXN0YXRpYyB2b2lkIG91dHB1dF9pbnN0cgotICBQQVJBTVMgKChpbnN0cl9kYXRhX3MgKiwgdW5zaWduZWQgbG9uZywgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCB1bnBhY2tfaW5zdHIgUEFSQU1TICgoaW5zdHJfZGF0YV9zICosIGludCwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCB1bnBhcnNlX2luc3RyIFBBUkFNUyAoKGluc3RyX2RhdGFfcyAqKSk7Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fejhrIChhZGRyLCBpbmZvLCBpc19zZWdtZW50ZWQpCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IGlzX3NlZ21lbnRlZDsKLXsKLSAgaW5zdHJfZGF0YV9zIGluc3RyX2RhdGE7Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJmluc3RyX2RhdGE7Ci0gIGluc3RyX2RhdGEubWF4X2ZldGNoZWQgPSAwOwotICBpbnN0cl9kYXRhLmluc25fc3RhcnQgPSBhZGRyOwotICBpZiAoc2V0am1wIChpbnN0cl9kYXRhLmJhaWxvdXQpICE9IDApCi0gICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLSAgaW5zdHJfZGF0YS50YWJsX2luZGV4ID0gejhrX2xvb2t1cF9pbnN0ciAoaW5zdHJfZGF0YS5uaWJibGVzLCBpbmZvKTsKLSAgaWYgKGluc3RyX2RhdGEudGFibF9pbmRleCA+IDApCi0gICAgewotICAgICAgdW5wYWNrX2luc3RyICgmaW5zdHJfZGF0YSwgaXNfc2VnbWVudGVkLCBpbmZvKTsKLSAgICAgIHVucGFyc2VfaW5zdHIgKCZpbnN0cl9kYXRhKTsKLSAgICAgIG91dHB1dF9pbnN0ciAoJmluc3RyX2RhdGEsIGFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIHo4a190YWJsZVtpbnN0cl9kYXRhLnRhYmxfaW5kZXhdLmxlbmd0aDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCA0KTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLndvcmQgJTAyeCUwMngiLAotCQkJICAgICBpbnN0cl9kYXRhLmJ5dGVzWzBdLCBpbnN0cl9kYXRhLmJ5dGVzWzJdKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLX0KLQotaW50Ci1wcmludF9pbnNuX3o4MDAxIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3o4ayAoYWRkciwgaW5mbywgMSk7Ci19Ci0KLWludAotcHJpbnRfaW5zbl96ODAwMiAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbl96OGsgKGFkZHIsIGluZm8sIDApOwotfQotCi1pbnQKLXo4a19sb29rdXBfaW5zdHIgKG5pYmJsZXMsIGluZm8pCi0gICAgIHVuc2lnbmVkIGNoYXIgKm5pYmJsZXM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0KLSAgaW50IG5pYmxfaW5kZXgsIHRhYmxfaW5kZXg7Ci0gIGludCBuaWJsX21hdGNoZWQ7Ci0gIHVuc2lnbmVkIHNob3J0IGluc3RyX25pYmw7Ci0gIHVuc2lnbmVkIHNob3J0IHRhYmxfZGF0dW0sIGRhdHVtX2NsYXNzLCBkYXR1bV92YWx1ZTsKLQotICBuaWJsX21hdGNoZWQgPSAwOwotICB0YWJsX2luZGV4ID0gMDsKLSAgd2hpbGUgKCFuaWJsX21hdGNoZWQgJiYgejhrX3RhYmxlW3RhYmxfaW5kZXhdLm5hbWUpCi0gICAgewotICAgICAgbmlibF9tYXRjaGVkID0gMTsKLSAgICAgIGZvciAobmlibF9pbmRleCA9IDA7IG5pYmxfaW5kZXggPCB6OGtfdGFibGVbdGFibF9pbmRleF0ubGVuZ3RoICogMiAmJiBuaWJsX21hdGNoZWQ7IG5pYmxfaW5kZXgrKykKLQl7Ci0JICBpZiAoKG5pYmxfaW5kZXggJSA0KSA9PSAwKQotCSAgICAvKiBGZXRjaCBvbmUgd29yZCBhdCBhIHRpbWUuICAqLwotCSAgICBGRVRDSF9EQVRBIChpbmZvLCBuaWJsX2luZGV4ICsgNCk7Ci0JICBpbnN0cl9uaWJsID0gbmliYmxlc1tuaWJsX2luZGV4XTsKLQotCSAgdGFibF9kYXR1bSA9IHo4a190YWJsZVt0YWJsX2luZGV4XS5ieXRlX2luZm9bbmlibF9pbmRleF07Ci0JICBkYXR1bV9jbGFzcyA9IHRhYmxfZGF0dW0gJiBDTEFTU19NQVNLOwotCSAgZGF0dW1fdmFsdWUgPSB+Q0xBU1NfTUFTSyAmIHRhYmxfZGF0dW07Ci0KLQkgIHN3aXRjaCAoZGF0dW1fY2xhc3MpCi0JICAgIHsKLQkgICAgY2FzZSBDTEFTU19CSVQ6Ci0JICAgICAgaWYgKGRhdHVtX3ZhbHVlICE9IGluc3RyX25pYmwpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMDBJSToKLQkgICAgICBpZiAoISgofmluc3RyX25pYmwpICYgMHg0KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18wMUlJOgotCSAgICAgIGlmICghKGluc3RyX25pYmwgJiAweDQpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzBDQ0M6Ci0JICAgICAgaWYgKCEoKH5pbnN0cl9uaWJsKSAmIDB4OCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMUNDQzoKLQkgICAgICBpZiAoIShpbnN0cl9uaWJsICYgMHg4KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18wRElTUDc6Ci0JICAgICAgaWYgKCEoKH5pbnN0cl9uaWJsKSAmIDB4OCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgbmlibF9pbmRleCArPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzFESVNQNzoKLQkgICAgICBpZiAoIShpbnN0cl9uaWJsICYgMHg4KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBuaWJsX2luZGV4ICs9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfUkVHTjA6Ci0JICAgICAgaWYgKGluc3RyX25pYmwgPT0gMCkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU19CSVRfMU9SMjoKLQkgICAgICBpZiAoKGluc3RyX25pYmwgfCAweDIpICE9IChkYXR1bV92YWx1ZSB8IDB4MikpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAobmlibF9tYXRjaGVkKQotCXsKLQkgIHJldHVybiB0YWJsX2luZGV4OwotCX0KLQotICAgICAgdGFibF9pbmRleCsrOwotICAgIH0KLSAgcmV0dXJuIC0xOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1vdXRwdXRfaW5zdHIgKGluc3RyX2RhdGEsIGFkZHIsIGluZm8pCi0gICAgIGluc3RyX2RhdGFfcyAqaW5zdHJfZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgbG9vcCwgbG9vcF9saW1pdDsKLSAgY2hhciB0bXBfc3RyWzIwXTsKLSAgY2hhciBvdXRfc3RyWzEwMF07Ci0KLSAgc3RyY3B5IChvdXRfc3RyLCAiXHQiKTsKLQotICBsb29wX2xpbWl0ID0gejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLmxlbmd0aCAqIDI7Ci0gIEZFVENIX0RBVEEgKGluZm8sIGxvb3BfbGltaXQpOwotICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgbG9vcF9saW1pdDsgbG9vcCsrKQotICAgIHsKLSAgICAgIHNwcmludGYgKHRtcF9zdHIsICIleCIsIGluc3RyX2RhdGEtPm5pYmJsZXNbbG9vcF0pOwotICAgICAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLSAgICB9Ci0KLSAgd2hpbGUgKGxvb3ArKyA8IDgpCi0gICAgewotICAgICAgc3RyY2F0IChvdXRfc3RyLCAiICIpOwotICAgIH0KLQotICBzdHJjYXQgKG91dF9zdHIsIGluc3RyX2RhdGEtPmluc3RyX2FzbXNyYyk7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG91dF9zdHIpOwotfQotCi1zdGF0aWMgdm9pZAotdW5wYWNrX2luc3RyIChpbnN0cl9kYXRhLCBpc19zZWdtZW50ZWQsIGluZm8pCi0gICAgIGluc3RyX2RhdGFfcyAqaW5zdHJfZGF0YTsKLSAgICAgaW50IGlzX3NlZ21lbnRlZDsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IG5pYmxfY291bnQsIGxvb3A7Ci0gIHVuc2lnbmVkIHNob3J0IGluc3RyX25pYmwsIGluc3RyX2J5dGUsIGluc3RyX3dvcmQ7Ci0gIGxvbmcgaW5zdHJfbG9uZzsKLSAgdW5zaWduZWQgc2hvcnQgdGFibF9kYXR1bSwgZGF0dW1fY2xhc3MsIGRhdHVtX3ZhbHVlOwotCi0gIG5pYmxfY291bnQgPSAwOwotICBsb29wID0gMDsKLSAgd2hpbGUgKHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5ieXRlX2luZm9bbG9vcF0gIT0gMCkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBuaWJsX2NvdW50ICsgNCAtIChuaWJsX2NvdW50ICUgNCkpOwotICAgICAgaW5zdHJfbmlibCA9IGluc3RyX2RhdGEtPm5pYmJsZXNbbmlibF9jb3VudF07Ci0gICAgICBpbnN0cl9ieXRlID0gaW5zdHJfZGF0YS0+Ynl0ZXNbbmlibF9jb3VudF07Ci0gICAgICBpbnN0cl93b3JkID0gaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudF07Ci0KLSAgICAgIHRhYmxfZGF0dW0gPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0uYnl0ZV9pbmZvW2xvb3BdOwotICAgICAgZGF0dW1fY2xhc3MgPSB0YWJsX2RhdHVtICYgQ0xBU1NfTUFTSzsKLSAgICAgIGRhdHVtX3ZhbHVlID0gdGFibF9kYXR1bSAmIH5DTEFTU19NQVNLOwotCi0gICAgICBzd2l0Y2ggKGRhdHVtX2NsYXNzKQotCXsKLQljYXNlIENMQVNTX1g6Ci0JICBpbnN0cl9kYXRhLT5hZGRyZXNzID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQkE6Ci0JICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CWDoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRElTUDoKLQkgIHN3aXRjaCAoZGF0dW1fdmFsdWUpCi0JICAgIHsKLQkgICAgY2FzZSBBUkdfRElTUDE2OgotCSAgICAgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX3dvcmQ7Ci0JICAgICAgbmlibF9jb3VudCArPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19ESVNQMTI6Ci0JICAgICAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfd29yZCAmIDB4MGZmZjsKLQkgICAgICBuaWJsX2NvdW50ICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfSU1NOgotCSAgc3dpdGNoIChkYXR1bV92YWx1ZSkKLQkgICAgewotCSAgICBjYXNlIEFSR19JTU00OgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX25pYmw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX05JTTg6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gKC1pbnN0cl9ieXRlKTsKLQkgICAgICBuaWJsX2NvdW50ICs9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTg6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfYnl0ZTsKLQkgICAgICBuaWJsX2NvdW50ICs9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTE2OgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX3dvcmQ7Ci0JICAgICAgbmlibF9jb3VudCArPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU0zMjoKLQkgICAgICBGRVRDSF9EQVRBIChpbmZvLCBuaWJsX2NvdW50ICsgOCk7Ci0JICAgICAgaW5zdHJfbG9uZyA9IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50XSA8PCAxNikKLQkJfCAoaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudCArIDRdKTsKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9sb25nOwotCSAgICAgIG5pYmxfY291bnQgKz0gNzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NTjoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9uaWJsIC0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NNE0xOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX25pYmwgKyAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU1fMToKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU1fMjoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU0yOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX25pYmwgJiAweDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ0M6Ci0JICBpbnN0cl9kYXRhLT5jb25kX2NvZGUgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DVFJMOgotCSAgaW5zdHJfZGF0YS0+Y3RybF9jb2RlID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfREE6Ci0JY2FzZSBDTEFTU19BRERSRVNTOgotCSAgaWYgKGlzX3NlZ21lbnRlZCkKLQkgICAgewotCSAgICAgIGlmIChpbnN0cl9uaWJsICYgMHg4KQotCQl7Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgbmlibF9jb3VudCArIDgpOwotCQkgIGluc3RyX2xvbmcgPSAoaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudF0gPDwgMTYpCi0JCSAgICB8IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50ICsgNF0pOwotCQkgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSAoKGluc3RyX3dvcmQgJiAweDdmMDApIDw8IDgpICsKLQkJICAgIChpbnN0cl9sb25nICYgMHhmZmZmKTsKLQkJICBuaWJsX2NvdW50ICs9IDc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnN0cl9kYXRhLT5hZGRyZXNzID0gKChpbnN0cl93b3JkICYgMHg3ZjAwKSA8PCA4KSArCi0JCSAgICAoaW5zdHJfd29yZCAmIDB4MDBmZik7Ci0JCSAgbmlibF9jb3VudCArPSAzOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSBpbnN0cl93b3JkOwotCSAgICAgIG5pYmxfY291bnQgKz0gMzsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18wQ0NDOgotCSAgaW5zdHJfZGF0YS0+Y29uZF9jb2RlID0gaW5zdHJfbmlibCAmIDB4NzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMUNDQzoKLQkgIGluc3RyX2RhdGEtPmNvbmRfY29kZSA9IGluc3RyX25pYmwgJiAweDc7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzBESVNQNzoKLQkgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX2J5dGUgJiAweDdmOwotCSAgbmlibF9jb3VudCArPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18xRElTUDc6Ci0JICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl9ieXRlICYgMHg3ZjsKLQkgIG5pYmxfY291bnQgKz0gMTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMDFJSToKLQkgIGluc3RyX2RhdGEtPmludGVycnVwdHMgPSBpbnN0cl9uaWJsICYgMHgzOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18wMElJOgotCSAgaW5zdHJfZGF0YS0+aW50ZXJydXB0cyA9IGluc3RyX25pYmwgJiAweDM7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JJVDoKLQkgIC8qIGRvIG5vdGhpbmcgKi8KLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfSVI6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0ZMQUdTOgotCSAgaW5zdHJfZGF0YS0+ZmxhZ3MgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUc6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19CWVRFOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfV09SRDoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX1FVQUQ6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19MT05HOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdOMDoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGxvb3AgKz0gMTsKLSAgICAgIG5pYmxfY291bnQgKz0gMTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi11bnBhcnNlX2luc3RyIChpbnN0cl9kYXRhKQotICAgICBpbnN0cl9kYXRhX3MgKmluc3RyX2RhdGE7Ci17Ci0gIHVuc2lnbmVkIHNob3J0IHRhYmxfZGF0dW0sIGRhdHVtX2NsYXNzLCBkYXR1bV92YWx1ZTsKLSAgaW50IGxvb3AsIGxvb3BfbGltaXQ7Ci0gIGNoYXIgb3V0X3N0cls4MF0sIHRtcF9zdHJbMjVdOwotCi0gIHNwcmludGYgKG91dF9zdHIsICJcdCVzXHQiLCB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0ubmFtZSk7Ci0KLSAgbG9vcF9saW1pdCA9IHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5ub3BlcmFuZHM7Ci0gIGZvciAobG9vcCA9IDA7IGxvb3AgPCBsb29wX2xpbWl0OyBsb29wKyspCi0gICAgewotICAgICAgaWYgKGxvb3ApCi0Jc3RyY2F0IChvdXRfc3RyLCAiLCIpOwotCi0gICAgICB0YWJsX2RhdHVtID0gejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLmFyZ19pbmZvW2xvb3BdOwotICAgICAgZGF0dW1fY2xhc3MgPSB0YWJsX2RhdHVtICYgQ0xBU1NfTUFTSzsKLSAgICAgIGRhdHVtX3ZhbHVlID0gdGFibF9kYXR1bSAmIH5DTEFTU19NQVNLOwotCi0gICAgICBzd2l0Y2ggKGRhdHVtX2NsYXNzKQotCXsKLQljYXNlIENMQVNTX1g6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiMHglMGx4KFIlbGQpIiwgaW5zdHJfZGF0YS0+YWRkcmVzcywKLQkJICAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQkE6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiciVsZCgjJWx4KSIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdLAotCQkgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQlg6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiciVsZChSJWxkKSIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdLAotCQkgICBpbnN0cl9kYXRhLT5hcmdfcmVnW0FSR19SWF0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRElTUDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIjMHglMGx4IiwgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50KTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0lNTToKLQkgIHNwcmludGYgKHRtcF9zdHIsICIjMHglMGx4IiwgaW5zdHJfZGF0YS0+aW1tZWRpYXRlKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0NDOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIiVzIiwgY29kZXNbaW5zdHJfZGF0YS0+Y29uZF9jb2RlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DVFJMOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIjB4JTBseCIsIGluc3RyX2RhdGEtPmN0cmxfY29kZSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19EQToKLQljYXNlIENMQVNTX0FERFJFU1M6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiIzB4JTBseCIsIGluc3RyX2RhdGEtPmFkZHJlc3MpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfSVI6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiQFIlbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19GTEFHUzoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIweCUwbHgiLCBpbnN0cl9kYXRhLT5mbGFncyk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfQllURToKLQkgIGlmIChpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA+PSAweDgpCi0JICAgIHsKLQkgICAgICBzcHJpbnRmICh0bXBfc3RyLCAicmwlbGQiLAotCQkgICAgICAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gLSAweDgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzcHJpbnRmICh0bXBfc3RyLCAicmglbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICAgIH0KLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19XT1JEOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInIlbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfUVVBRDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJycSVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19MT05HOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInJyJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHN0cmNweSAoaW5zdHJfZGF0YS0+aW5zdHJfYXNtc3JjLCBvdXRfc3RyKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvejhrLW9wYy5oIGIvb3Bjb2Rlcy96OGstb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWEzYTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy96OGstb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NDM4ICswLDAgQEAKLQkJCS8qIFRISVMgRklMRSBJUyBBVVRPTUFHSUNBTExZIEdFTkVSQVRFRCwgRE9OJ1QgRURJVCBJVCAqLwotI2RlZmluZSBBUkdfTUFTSyAweDBmCi0jZGVmaW5lIEFSR19TUkMgMHgwMQotI2RlZmluZSBBUkdfRFNUIDB4MDIKLSNkZWZpbmUgQVJHX1JTIDB4MDEKLSNkZWZpbmUgQVJHX1JEIDB4MDIKLSNkZWZpbmUgQVJHX1JBIDB4MDMKLSNkZWZpbmUgQVJHX1JCIDB4MDQKLSNkZWZpbmUgQVJHX1JSIDB4MDUKLSNkZWZpbmUgQVJHX1JYIDB4MDYKLSNkZWZpbmUgQVJHX0lNTTQgMHgwMQotI2RlZmluZSBBUkdfSU1NOCAweDAyCi0jZGVmaW5lIEFSR19JTU0xNiAweDAzCi0jZGVmaW5lIEFSR19JTU0zMiAweDA0Ci0jZGVmaW5lIEFSR19JTU1OIDB4MDUKLSNkZWZpbmUgQVJHX0lNTU5NSU5VUzEgMHgwNQotI2RlZmluZSBBUkdfSU1NXzEgMHgwNgotI2RlZmluZSBBUkdfSU1NXzIgMHgwNwotI2RlZmluZSBBUkdfRElTUDE2IDB4MDgKLSNkZWZpbmUgQVJHX05JTTggMHgwOQotI2RlZmluZSBBUkdfSU1NMiAweDBhCi0jZGVmaW5lIEFSR19JTU0xT1IyIDB4MGIKLSNkZWZpbmUgQVJHX0RJU1AxMiAweDBiCi0jZGVmaW5lIEFSR19ESVNQOCAweDBjCi0jZGVmaW5lIEFSR19JTU00TTEgMHgwZAotI2RlZmluZSBDTEFTU19NQVNLIDB4MWZmZjAKLSNkZWZpbmUgQ0xBU1NfWCAweDEwCi0jZGVmaW5lIENMQVNTX0JBIDB4MjAKLSNkZWZpbmUgQ0xBU1NfREEgMHgzMAotI2RlZmluZSBDTEFTU19CWCAweDQwCi0jZGVmaW5lIENMQVNTX0RJU1AgMHg1MAotI2RlZmluZSBDTEFTU19JTU0gMHg2MAotI2RlZmluZSBDTEFTU19DQyAweDcwCi0jZGVmaW5lIENMQVNTX0NUUkwgMHg4MAotI2RlZmluZSBDTEFTU19BRERSRVNTIDB4ZDAKLSNkZWZpbmUgQ0xBU1NfMENDQyAweGUwCi0jZGVmaW5lIENMQVNTXzFDQ0MgMHhmMAotI2RlZmluZSBDTEFTU18wRElTUDcgMHgxMDAKLSNkZWZpbmUgQ0xBU1NfMURJU1A3IDB4MjAwCi0jZGVmaW5lIENMQVNTXzAxSUkgMHgzMDAKLSNkZWZpbmUgQ0xBU1NfMDBJSSAweDQwMAotI2RlZmluZSBDTEFTU19CSVQgMHg1MDAKLSNkZWZpbmUgQ0xBU1NfRkxBR1MgMHg2MDAKLSNkZWZpbmUgQ0xBU1NfSVIgMHg3MDAKLSNkZWZpbmUgQ0xBU1NfRElTUDggMHg4MDAKLSNkZWZpbmUgQ0xBU1NfQklUXzFPUjIgMHg5MDAKLSNkZWZpbmUgQ0xBU1NfUkVHIDB4NzAwMAotI2RlZmluZSBDTEFTU19SRUdfQllURSAweDIwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHX1dPUkQgMHgzMDAwCi0jZGVmaW5lIENMQVNTX1JFR19RVUFEIDB4NDAwMAotI2RlZmluZSBDTEFTU19SRUdfTE9ORyAweDUwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHTjAgMHg4MDAwCi0jZGVmaW5lIENMQVNTX1BSIDB4MTAwMDAKLSNkZWZpbmUgT1BDX2FkYyAwCi0jZGVmaW5lIE9QQ19hZGNiIDEKLSNkZWZpbmUgT1BDX2FkZCAyCi0jZGVmaW5lIE9QQ19hZGRiIDMKLSNkZWZpbmUgT1BDX2FkZGwgNAotI2RlZmluZSBPUENfYW5kIDUKLSNkZWZpbmUgT1BDX2FuZGIgNgotI2RlZmluZSBPUENfYml0IDcKLSNkZWZpbmUgT1BDX2JpdGIgOAotI2RlZmluZSBPUENfY2FsbCA5Ci0jZGVmaW5lIE9QQ19jYWxyIDEwCi0jZGVmaW5lIE9QQ19jbHIgMTEKLSNkZWZpbmUgT1BDX2NscmIgMTIKLSNkZWZpbmUgT1BDX2NvbSAxMwotI2RlZmluZSBPUENfY29tYiAxNAotI2RlZmluZSBPUENfY29tZmxnIDE1Ci0jZGVmaW5lIE9QQ19jcCAxNgotI2RlZmluZSBPUENfY3BiIDE3Ci0jZGVmaW5lIE9QQ19jcGQgMTgKLSNkZWZpbmUgT1BDX2NwZGIgMTkKLSNkZWZpbmUgT1BDX2NwZHIgMjAKLSNkZWZpbmUgT1BDX2NwZHJiIDIxCi0jZGVmaW5lIE9QQ19jcGkgMjIKLSNkZWZpbmUgT1BDX2NwaWIgMjMKLSNkZWZpbmUgT1BDX2NwaXIgMjQKLSNkZWZpbmUgT1BDX2NwaXJiIDI1Ci0jZGVmaW5lIE9QQ19jcGwgMjYKLSNkZWZpbmUgT1BDX2Nwc2QgMjcKLSNkZWZpbmUgT1BDX2Nwc2RiIDI4Ci0jZGVmaW5lIE9QQ19jcHNkciAyOQotI2RlZmluZSBPUENfY3BzZHJiIDMwCi0jZGVmaW5lIE9QQ19jcHNpIDMxCi0jZGVmaW5lIE9QQ19jcHNpYiAzMgotI2RlZmluZSBPUENfY3BzaXIgMzMKLSNkZWZpbmUgT1BDX2Nwc2lyYiAzNAotI2RlZmluZSBPUENfZGFiIDM1Ci0jZGVmaW5lIE9QQ19kYmpueiAzNgotI2RlZmluZSBPUENfZGVjIDM3Ci0jZGVmaW5lIE9QQ19kZWNiIDM4Ci0jZGVmaW5lIE9QQ19kaSAzOQotI2RlZmluZSBPUENfZGl2IDQwCi0jZGVmaW5lIE9QQ19kaXZsIDQxCi0jZGVmaW5lIE9QQ19kam56IDQyCi0jZGVmaW5lIE9QQ19laSA0MwotI2RlZmluZSBPUENfZXggNDQKLSNkZWZpbmUgT1BDX2V4YiA0NQotI2RlZmluZSBPUENfZXh0cyA0NgotI2RlZmluZSBPUENfZXh0c2IgNDcKLSNkZWZpbmUgT1BDX2V4dHNsIDQ4Ci0jZGVmaW5lIE9QQ19oYWx0IDQ5Ci0jZGVmaW5lIE9QQ19pbiA1MAotI2RlZmluZSBPUENfaW5iIDUxCi0jZGVmaW5lIE9QQ19pbmMgNTIKLSNkZWZpbmUgT1BDX2luY2IgNTMKLSNkZWZpbmUgT1BDX2luZCA1NAotI2RlZmluZSBPUENfaW5kYiA1NQotI2RlZmluZSBPUENfaW5pYiA1NgotI2RlZmluZSBPUENfaW5pYnIgNTcKLSNkZWZpbmUgT1BDX2lyZXQgNTgKLSNkZWZpbmUgT1BDX2pwIDU5Ci0jZGVmaW5lIE9QQ19qciA2MAotI2RlZmluZSBPUENfbGQgNjEKLSNkZWZpbmUgT1BDX2xkYSA2MgotI2RlZmluZSBPUENfbGRhciA2MwotI2RlZmluZSBPUENfbGRiIDY0Ci0jZGVmaW5lIE9QQ19sZGN0bCA2NQotI2RlZmluZSBPUENfbGRpciA2NgotI2RlZmluZSBPUENfbGRpcmIgNjcKLSNkZWZpbmUgT1BDX2xkayA2OAotI2RlZmluZSBPUENfbGRsIDY5Ci0jZGVmaW5lIE9QQ19sZG0gNzAKLSNkZWZpbmUgT1BDX2xkcHMgNzEKLSNkZWZpbmUgT1BDX2xkciA3MgotI2RlZmluZSBPUENfbGRyYiA3MwotI2RlZmluZSBPUENfbGRybCA3NAotI2RlZmluZSBPUENfbWJpdCA3NQotI2RlZmluZSBPUENfbXJlcSA3NgotI2RlZmluZSBPUENfbXJlcyA3NwotI2RlZmluZSBPUENfbXNldCA3OAotI2RlZmluZSBPUENfbXVsdCA3OQotI2RlZmluZSBPUENfbXVsdGwgODAKLSNkZWZpbmUgT1BDX25lZyA4MQotI2RlZmluZSBPUENfbmVnYiA4MgotI2RlZmluZSBPUENfbm9wIDgzCi0jZGVmaW5lIE9QQ19vciA4NAotI2RlZmluZSBPUENfb3JiIDg1Ci0jZGVmaW5lIE9QQ19vdXQgODYKLSNkZWZpbmUgT1BDX291dGIgODcKLSNkZWZpbmUgT1BDX291dGQgODgKLSNkZWZpbmUgT1BDX291dGRiIDg5Ci0jZGVmaW5lIE9QQ19vdXRpYiA5MAotI2RlZmluZSBPUENfb3V0aWJyIDkxCi0jZGVmaW5lIE9QQ19wb3AgOTIKLSNkZWZpbmUgT1BDX3BvcGwgOTMKLSNkZWZpbmUgT1BDX3B1c2ggOTQKLSNkZWZpbmUgT1BDX3B1c2hsIDk1Ci0jZGVmaW5lIE9QQ19yZXMgOTYKLSNkZWZpbmUgT1BDX3Jlc2IgOTcKLSNkZWZpbmUgT1BDX3Jlc2ZsZyA5OAotI2RlZmluZSBPUENfcmV0IDk5Ci0jZGVmaW5lIE9QQ19ybCAxMDAKLSNkZWZpbmUgT1BDX3JsYiAxMDEKLSNkZWZpbmUgT1BDX3JsYyAxMDIKLSNkZWZpbmUgT1BDX3JsY2IgMTAzCi0jZGVmaW5lIE9QQ19ybGRiIDEwNAotI2RlZmluZSBPUENfcnIgMTA1Ci0jZGVmaW5lIE9QQ19ycmIgMTA2Ci0jZGVmaW5lIE9QQ19ycmMgMTA3Ci0jZGVmaW5lIE9QQ19ycmNiIDEwOAotI2RlZmluZSBPUENfcnJkYiAxMDkKLSNkZWZpbmUgT1BDX3NiYyAxMTAKLSNkZWZpbmUgT1BDX3NiY2IgMTExCi0jZGVmaW5lIE9QQ19zZGEgMTEyCi0jZGVmaW5lIE9QQ19zZGFiIDExMwotI2RlZmluZSBPUENfc2RhbCAxMTQKLSNkZWZpbmUgT1BDX3NkbCAxMTUKLSNkZWZpbmUgT1BDX3NkbGIgMTE2Ci0jZGVmaW5lIE9QQ19zZGxsIDExNwotI2RlZmluZSBPUENfc2V0IDExOAotI2RlZmluZSBPUENfc2V0YiAxMTkKLSNkZWZpbmUgT1BDX3NldGZsZyAxMjAKLSNkZWZpbmUgT1BDX3NpbmIgMTIxCi0jZGVmaW5lIE9QQ19zaW5kIDEyMgotI2RlZmluZSBPUENfc2luZGIgMTIzCi0jZGVmaW5lIE9QQ19zaW5pYiAxMjQKLSNkZWZpbmUgT1BDX3NpbmliciAxMjUKLSNkZWZpbmUgT1BDX3NsYSAxMjYKLSNkZWZpbmUgT1BDX3NsYWIgMTI3Ci0jZGVmaW5lIE9QQ19zbGFsIDEyOAotI2RlZmluZSBPUENfc2xsIDEyOQotI2RlZmluZSBPUENfc2xsYiAxMzAKLSNkZWZpbmUgT1BDX3NsbGwgMTMxCi0jZGVmaW5lIE9QQ19zb3V0IDEzMgotI2RlZmluZSBPUENfc291dGIgMTMzCi0jZGVmaW5lIE9QQ19zb3V0ZCAxMzQKLSNkZWZpbmUgT1BDX3NvdXRkYiAxMzUKLSNkZWZpbmUgT1BDX3NvdXRpYiAxMzYKLSNkZWZpbmUgT1BDX3NvdXRpYnIgMTM3Ci0jZGVmaW5lIE9QQ19zcmEgMTM4Ci0jZGVmaW5lIE9QQ19zcmFiIDEzOQotI2RlZmluZSBPUENfc3JhbCAxNDAKLSNkZWZpbmUgT1BDX3NybCAxNDEKLSNkZWZpbmUgT1BDX3NybGIgMTQyCi0jZGVmaW5lIE9QQ19zcmxsIDE0MwotI2RlZmluZSBPUENfc3ViIDE0NAotI2RlZmluZSBPUENfc3ViYiAxNDUKLSNkZWZpbmUgT1BDX3N1YmwgMTQ2Ci0jZGVmaW5lIE9QQ190Y2MgMTQ3Ci0jZGVmaW5lIE9QQ190Y2NiIDE0OAotI2RlZmluZSBPUENfdGVzdCAxNDkKLSNkZWZpbmUgT1BDX3Rlc3RiIDE1MAotI2RlZmluZSBPUENfdGVzdGwgMTUxCi0jZGVmaW5lIE9QQ190cmRiIDE1MgotI2RlZmluZSBPUENfdHJkcmIgMTUzCi0jZGVmaW5lIE9QQ190cmliIDE1NAotI2RlZmluZSBPUENfdHJpcmIgMTU1Ci0jZGVmaW5lIE9QQ190cnRkcmIgMTU2Ci0jZGVmaW5lIE9QQ190cnRpYiAxNTcKLSNkZWZpbmUgT1BDX3RydGlyYiAxNTgKLSNkZWZpbmUgT1BDX3RydGRiIDE1OQotI2RlZmluZSBPUENfdHNldCAxNjAKLSNkZWZpbmUgT1BDX3RzZXRiIDE2MQotI2RlZmluZSBPUENfeG9yIDE2MgotI2RlZmluZSBPUENfeG9yYiAxNjMKLSNkZWZpbmUgT1BDX2xkZCAgMTY0IAotI2RlZmluZSBPUENfbGRkYiAgMTY1IAotI2RlZmluZSBPUENfbGRkciAgMTY2IAotI2RlZmluZSBPUENfbGRkcmIgMTY3ICAKLSNkZWZpbmUgT1BDX2xkaSAgMTY4IAotI2RlZmluZSBPUENfbGRpYiAxNjkgIAotI2RlZmluZSBPUENfc2MgICAxNzAKLSNkZWZpbmUgT1BDX2JwdCAgIDE3MQotI2RlZmluZSBPUENfZXh0MGUgMTcyCi0jZGVmaW5lIE9QQ19leHQwZiAxNzIKLSNkZWZpbmUgT1BDX2V4dDhlIDE3MgotI2RlZmluZSBPUENfZXh0OGYgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkMzYgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkMzggMTcyCi0jZGVmaW5lIE9QQ19yc3ZkNzggMTcyCi0jZGVmaW5lIE9QQ19yc3ZkN2UgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkOWQgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkOWYgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkYjkgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkYmYgMTcyCi0jZGVmaW5lIE9QQ19vdXRpIDE3MwotdHlwZWRlZiBzdHJ1Y3QgewotI2lmZGVmIE5JQ0VOQU1FUwotY2hhciAqbmljZW5hbWU7Ci1pbnQgdHlwZTsKLWludCBjeWNsZXM7Ci1pbnQgZmxhZ3M7Ci0jZW5kaWYKLWNoYXIgKm5hbWU7Ci11bnNpZ25lZCBjaGFyIG9wY29kZTsKLXZvaWQgKCpmdW5jKSgpOwotdW5zaWduZWQgaW50IGFyZ19pbmZvWzRdOwotdW5zaWduZWQgaW50IGJ5dGVfaW5mb1sxMF07Ci1pbnQgbm9wZXJhbmRzOwotaW50IGxlbmd0aDsKLWludCBpZHg7Ci19IG9wY29kZV9lbnRyeV90eXBlOwotI2lmZGVmIERFRklORV9UQUJMRQotb3Bjb2RlX2VudHJ5X3R5cGUgejhrX3RhYmxlW10gPSB7Ci0KLQotLyogMTAxMSAwMTAxIHNzc3MgZGRkZCAqKiogYWRjIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRjIHJkLHJzIiwxNiw1LAotMHgzYywKLSNlbmRpZgotImFkYyIsT1BDX2FkYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs1LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDB9LAotCi0KLS8qIDEwMTEgMDEwMCBzc3NzIGRkZGQgKioqIGFkY2IgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkY2IgcmJkLHJicyIsOCw1LAotMHgzZiwKLSNlbmRpZgotImFkY2IiLE9QQ19hZGNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMX0sCi0KLQotLyogMDAwMCAwMDAxIHNzTjAgZGRkZCAqKiogYWRkIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxAcnMiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMn0sCi0KLQotLyogMDEwMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsM30sCi0KLQotLyogMDEwMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDR9LAotCi0KLS8qIDAwMDAgMDAwMSAwMDAwIGRkZGQgaW1tMTYgKioqIGFkZCByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxpbW0xNiIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCw1fSwKLQotCi0vKiAxMDAwIDAwMDEgc3NzcyBkZGRkICoqKiBhZGQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQscnMiLDE2LDQsCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDZ9LAotCi0KLS8qIDAwMDAgMDAwMCBzc04wIGRkZGQgKioqIGFkZGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLEBycyIsOCw3LAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsN30sCi0KLQotLyogMDEwMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw4fSwKLQotCi0vKiAwMTAwIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGRiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw5fSwKLQotCi0vKiAwMDAwIDAwMDAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogYWRkYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLGltbTgiLDgsNywKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMTB9LAotCi0KLS8qIDEwMDAgMDAwMCBzc3NzIGRkZGQgKioqIGFkZGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLHJicyIsOCw0LAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExfSwKLQotCi0vKiAwMDAxIDAxMTAgc3NOMCBkZGRkICoqKiBhZGRsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxAcnMiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTJ9LAotCi0KLS8qIDAxMDEgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGwgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQsYWRkcmVzc19zcmMiLDMyLDE1LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxM30sCi0KLQotLyogMDEwMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkbCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQsYWRkcmVzc19zcmMocnMpIiwzMiwxNiwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE0fSwKLQotCi0vKiAwMDAxIDAxMTAgMDAwMCBkZGRkIGltbTMyICoqKiBhZGRsIHJyZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLGltbTMyIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDE1fSwKLQotCi0vKiAxMDAxIDAxMTAgc3NzcyBkZGRkICoqKiBhZGRsIHJyZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxycnMiLDMyLDgsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzYsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTZ9LAotCi0KLS8qIDAwMDAgMDExMSBzc04wIGRkZGQgKioqIGFuZCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQsQHJzIiwxNiw3LAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE3fSwKLQotCi0vKiAwMTAwIDAxMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmQgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxOH0sCi0KLQotLyogMDEwMCAwMTExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYW5kIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE5fSwKLQotCi0vKiAwMDAwIDAxMTEgMDAwMCBkZGRkIGltbTE2ICoqKiBhbmQgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQsaW1tMTYiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjB9LAotCi0KLS8qIDEwMDAgMDExMSBzc3NzIGRkZGQgKioqIGFuZCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxycyIsMTYsNCwKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjF9LAotCi0KLS8qIDAwMDAgMDExMCBzc04wIGRkZGQgKioqIGFuZGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLEBycyIsOCw3LAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjJ9LAotCi0KLS8qIDAxMDAgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFuZGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjN9LAotCi0KLS8qIDAxMDAgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFuZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI0fSwKLQotCi0vKiAwMDAwIDAxMTAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogYW5kYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLGltbTgiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMjV9LAotCi0KLS8qIDEwMDAgMDExMCBzc3NzIGRkZGQgKioqIGFuZGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLHJicyIsOCw0LAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI2fSwKLQotCi0vKiAwMDEwIDAxMTEgZGROMCBpbW00ICoqKiBiaXQgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgQHJkLGltbTQiLDE2LDgsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjd9LAotCi0KLS8qIDAxMTAgMDExMSBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIGJpdCBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCBhZGRyZXNzX2RzdChyZCksaW1tNCIsMTYsMTEsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjh9LAotCi0KLS8qIDAxMTAgMDExMSAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIGJpdCBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IGFkZHJlc3NfZHN0LGltbTQiLDE2LDEwLAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjl9LAotCi0KLS8qIDEwMTAgMDExMSBkZGRkIGltbTQgKioqIGJpdCByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IHJkLGltbTQiLDE2LDQsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs3LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzB9LAotCi0KLS8qIDAwMTAgMDExMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogYml0IHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IHJkLHJzIiwxNiwxMCwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMxfSwKLQotCi0vKiAwMDEwIDAxMTAgZGROMCBpbW00ICoqKiBiaXRiIEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiBAcmQsaW1tNCIsOCw4LAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzJ9LAotCi0KLS8qIDAxMTAgMDExMCBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIGJpdGIgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00Iiw4LDExLAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzN9LAotCi0KLS8qIDAxMTAgMDExMCAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIGJpdGIgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgYWRkcmVzc19kc3QsaW1tNCIsOCwxMCwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzR9LAotCi0KLS8qIDEwMTAgMDExMCBkZGRkIGltbTQgKioqIGJpdGIgcmJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIHJiZCxpbW00Iiw4LDQsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzNX0sCi0KLQotLyogMDAxMCAwMTEwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiBiaXRiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgcmJkLHJzIiw4LDEwLAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzNn0sCi0KLQotLyogMDAxMSAwMTEwIDAwMDAgMDAwMCAqKiogYnB0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYnB0Iiw4LDIsCi0weDAwLAotI2VuZGlmCi0iYnB0IixPUENfYnB0LDAsezB9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwwLDIsMzd9LAotCi0KLS8qIDAwMDEgMTExMSBkZE4wIDAwMDAgKioqIGNhbGwgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2FsbCBAcmQiLDMyLDEwLAotMHgwMCwKLSNlbmRpZgotImNhbGwiLE9QQ19jYWxsLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDM4fSwKLQotCi0vKiAwMTAxIDExMTEgMDAwMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjYWxsIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2FsbCBhZGRyZXNzX2RzdCIsMzIsMTIsCi0weDAwLAotI2VuZGlmCi0iY2FsbCIsT1BDX2NhbGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzOX0sCi0KLQotLyogMDEwMSAxMTExIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY2FsbCBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjYWxsIGFkZHJlc3NfZHN0KHJkKSIsMzIsMTMsCi0weDAwLAotI2VuZGlmCi0iY2FsbCIsT1BDX2NhbGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDB9LAotCi0KLS8qIDExMDEgZGlzcDEyICoqKiBjYWxyIGRpc3AxMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNhbHIgZGlzcDEyIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJjYWxyIixPUENfY2FsciwwLHtDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCsweGQsQ0xBU1NfRElTUCsoQVJHX0RJU1AxMiksMCwwLDAsMCwwLDAsMCx9LDEsMiw0MX0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMTAwMCAqKiogY2xyIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNsciBAcmQiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0iY2xyIixPUENfY2xyLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDQyfSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiBjbHIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHIgYWRkcmVzc19kc3QiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImNsciIsT1BDX2NsciwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQzfSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiBjbHIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyIGFkZHJlc3NfZHN0KHJkKSIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0iY2xyIixPUENfY2xyLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQ0fSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAxMDAwICoqKiBjbHIgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHIgcmQiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0iY2xyIixPUENfY2xyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0NX0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMTAwMCAqKiogY2xyYiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHJiIEByZCIsOCw4LAotMHgwMCwKLSNlbmRpZgotImNscmIiLE9QQ19jbHJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDQ2fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiBjbHJiIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyYiBhZGRyZXNzX2RzdCIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQ3fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiBjbHJiIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNscmIgYWRkcmVzc19kc3QocmQpIiw4LDEyLAotMHgwMCwKLSNlbmRpZgotImNscmIiLE9QQ19jbHJiLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQ4fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAxMDAwICoqKiBjbHJiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNscmIgcmJkIiw4LDcsCi0weDAwLAotI2VuZGlmCi0iY2xyYiIsT1BDX2NscmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDQ5fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMDAwICoqKiBjb20gQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tIEByZCIsMTYsMTIsCi0weDE4LAotI2VuZGlmCi0iY29tIixPUENfY29tLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDUwfSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjb20gYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb20gYWRkcmVzc19kc3QiLDE2LDE1LAotMHgxOCwKLSNlbmRpZgotImNvbSIsT1BDX2NvbSwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDUxfSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjb20gYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tIGFkZHJlc3NfZHN0KHJkKSIsMTYsMTYsCi0weDE4LAotI2VuZGlmCi0iY29tIixPUENfY29tLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDUyfSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAwMDAwICoqKiBjb20gcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb20gcmQiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0iY29tIixPUENfY29tLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw1M30sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDAwMCAqKiogY29tYiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21iIEByZCIsOCwxMiwKLTB4MWMsCi0jZW5kaWYKLSJjb21iIixPUENfY29tYiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw1NH0sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tYiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWIgYWRkcmVzc19kc3QiLDgsMTUsCi0weDFjLAotI2VuZGlmCi0iY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1NX0sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tYiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21iIGFkZHJlc3NfZHN0KHJkKSIsOCwxNiwKLTB4MWMsCi0jZW5kaWYKLSJjb21iIixPUENfY29tYiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1Nn0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMDAwMCAqKiogY29tYiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21iIHJiZCIsOCw3LAotMHgxYywKLSNlbmRpZgotImNvbWIiLE9QQ19jb21iLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw1N30sCi0KLQotLyogMTAwMCAxMTAxIGZsYWdzIDAxMDEgKioqIGNvbWZsZyBmbGFncyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWZsZyBmbGFncyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJjb21mbGciLE9QQ19jb21mbGcsMCx7Q0xBU1NfRkxBR1MsfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19GTEFHUyxDTEFTU19CSVQrNSwwLDAsMCwwLDAsfSwxLDIsNTh9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAwMDEgaW1tMTYgKioqIGNwIEByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIEByZCxpbW0xNiIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCw1OX0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDAwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogY3AgYWRkcmVzc19kc3QocmQpLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgYWRkcmVzc19kc3QocmQpLGltbTE2IiwxNiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDYwfSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2ICoqKiBjcCBhZGRyZXNzX2RzdCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIGFkZHJlc3NfZHN0LGltbTE2IiwxNiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsfSwyLDYsNjF9LAotCi0KLS8qIDAwMDAgMTAxMSBzc04wIGRkZGQgKioqIGNwIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLEBycyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw2Mn0sCi0KLQotLyogMDEwMCAxMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3AgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDYzfSwKLQotCi0vKiAwMTAwIDEwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDY0fSwKLQotCi0vKiAwMDAwIDEwMTEgMDAwMCBkZGRkIGltbTE2ICoqKiBjcCByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLGltbTE2IiwxNiw3LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDY1fSwKLQotCi0vKiAxMDAwIDEwMTEgc3NzcyBkZGRkICoqKiBjcCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLHJzIiwxNiw0LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw2Nn0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDAwMSBpbW04IGltbTggKioqIGNwYiBAcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiBAcmQsaW1tOCIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCw2N30sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTggKioqIGNwYiBhZGRyZXNzX2RzdChyZCksaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiBhZGRyZXNzX2RzdChyZCksaW1tOCIsOCwxNSwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNiw2OH0sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTggKioqIGNwYiBhZGRyZXNzX2RzdCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIGFkZHJlc3NfZHN0LGltbTgiLDgsMTQsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNiw2OX0sCi0KLQotLyogMDAwMCAxMDEwIHNzTjAgZGRkZCAqKiogY3BiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLEBycyIsOCw3LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNzB9LAotCi0KLS8qIDAxMDAgMTAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDcxfSwKLQotCi0vKiAwMTAwIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNzJ9LAotCi0KLS8qIDAwMDAgMTAxMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBjcGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLGltbTgiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsNzN9LAotCi0KLS8qIDEwMDAgMTAxMCBzc3NzIGRkZGQgKioqIGNwYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxyYnMiLDgsNCwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw3NH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGQgcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BkIHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BkIixPUENfY3BkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzV9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BkYiByYmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BkYiByYmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwZGIiLE9QQ19jcGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzZ9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BkciByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGRyIHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BkciIsT1BDX2NwZHIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc3fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZHJiIHJiZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGRyYiByYmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwZHJiIixPUENfY3BkcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc4fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwaSByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGkgcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGkiLE9QQ19jcGksMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3OX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGliIHJiZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGliIHJiZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BpYiIsT1BDX2NwaWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4MH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGlyIHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwaXIgcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGlyIixPUENfY3BpciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDgxfSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwaXJiIHJiZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGlyYiByYmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwaXJiIixPUENfY3BpcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4Mn0sCi0KLQotLyogMDAwMSAwMDAwIHNzTjAgZGRkZCAqKiogY3BsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLEBycyIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsODN9LAotCi0KLS8qIDAxMDEgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwbCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDg0fSwKLQotCi0vKiAwMTAxIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQsYWRkcmVzc19zcmMocnMpIiwzMiwxNiwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw4NX0sCi0KLQotLyogMDAwMSAwMDAwIDAwMDAgZGRkZCBpbW0zMiAqKiogY3BsIHJyZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQsaW1tMzIiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDg2fSwKLQotCi0vKiAxMDAxIDAwMDAgc3NzcyBkZGRkICoqKiBjcGwgcnJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQscnJzIiwzMiw4LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw4N30sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTAxMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNkIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNkIEByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwc2QiLE9QQ19jcHNkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDg4fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2RiIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNkYiBAcmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwc2RiIixPUENfY3BzZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODl9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDExMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzZHIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2RyIEByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwc2RyIixPUENfY3BzZHIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTB9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDExMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzZHJiIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNkcmIgQHJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNkcmIiLE9QQ19jcHNkcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTF9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzaSBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzaSBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNpIixPUENfY3BzaSwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTJ9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzaWIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2liIEByZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzaWIiLE9QQ19jcHNpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTN9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAxMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzaXIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2lyIEByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwc2lyIixPUENfY3BzaXIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDk0fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2lyYiBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzaXJiIEByZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzaXJiIixPUENfY3BzaXJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5NX0sCi0KLQotLyogMTAxMSAwMDAwIGRkZGQgMDAwMCAqKiogZGFiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRhYiByYmQiLDgsNSwKLTB4MzgsCi0jZW5kaWYKLSJkYWIiLE9QQ19kYWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDk2fSwKLQotCi0vKiAxMTExIGRkZGQgMGRpc3A3ICoqKiBkYmpueiByYmQsZGlzcDcgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkYmpueiByYmQsZGlzcDciLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImRiam56IixPUENfZGJqbnosMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMHhmLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU18wRElTUDcsMCwwLDAsMCwwLDAsfSwyLDIsOTd9LAotCi0KLS8qIDAwMTAgMTAxMSBkZE4wIGltbTRtMSAqKiogZGVjIEByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWMgQHJkLGltbTRtMSIsMTYsMTEsCi0weDFjLAotI2VuZGlmCi0iZGVjIixPUENfZGVjLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsOTh9LAotCi0KLS8qIDAxMTAgMTAxMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogZGVjIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsMTYsMTQsCi0weDFjLAotI2VuZGlmCi0iZGVjIixPUENfZGVjLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsOTl9LAotCi0KLS8qIDAxMTAgMTAxMSAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogZGVjIGFkZHJlc3NfZHN0LGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlYyBhZGRyZXNzX2RzdCxpbW00bTEiLDE2LDEzLAotMHgxYywKLSNlbmRpZgotImRlYyIsT1BDX2RlYywwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTAwfSwKLQotCi0vKiAxMDEwIDEwMTEgZGRkZCBpbW00bTEgKioqIGRlYyByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWMgcmQsaW1tNG0xIiwxNiw0LAotMHgxYywKLSNlbmRpZgotImRlYyIsT1BDX2RlYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDEwMX0sCi0KLQotLyogMDAxMCAxMDEwIGRkTjAgaW1tNG0xICoqKiBkZWNiIEByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWNiIEByZCxpbW00bTEiLDgsMTEsCi0weDFjLAotI2VuZGlmCi0iZGVjYiIsT1BDX2RlY2IsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMDJ9LAotCi0KLS8qIDAxMTAgMTAxMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogZGVjYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiw4LDE0LAotMHgxYywKLSNlbmRpZgotImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTAzfSwKLQotCi0vKiAwMTEwIDEwMTAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlY2IgYWRkcmVzc19kc3QsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjYiBhZGRyZXNzX2RzdCxpbW00bTEiLDgsMTMsCi0weDFjLAotI2VuZGlmCi0iZGVjYiIsT1BDX2RlY2IsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDEwNH0sCi0KLQotLyogMTAxMCAxMDEwIGRkZGQgaW1tNG0xICoqKiBkZWNiIHJiZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWNiIHJiZCxpbW00bTEiLDgsNCwKLTB4MWMsCi0jZW5kaWYKLSJkZWNiIixPUENfZGVjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDEwNX0sCi0KLQotLyogMDExMSAxMTAwIDAwMDAgMDBpaSAqKiogZGkgaTIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaSBpMiIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJkaSIsT1BDX2RpLDAse0NMQVNTX0lNTSsoQVJHX0lNTTIpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfMDBJSSwwLDAsMCwwLDAsfSwxLDIsMTA2fSwKLQotCi0vKiAwMDAxIDEwMTEgc3NOMCBkZGRkICoqKiBkaXYgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQsQHJzIiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMDd9LAotCi0KLS8qIDAxMDEgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdiBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLGFkZHJlc3Nfc3JjIiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEwOH0sCi0KLQotLyogMDEwMSAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZGl2IHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTA5fSwKLQotCi0vKiAwMDAxIDEwMTEgMDAwMCBkZGRkIGltbTE2ICoqKiBkaXYgcnJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxpbW0xNiIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTEwfSwKLQotCi0vKiAxMDAxIDEwMTEgc3NzcyBkZGRkICoqKiBkaXYgcnJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxycyIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExMX0sCi0KLQotLyogMDAwMSAxMDEwIHNzTjAgZGRkZCAqKiogZGl2bCBycWQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQsQHJzIiwzMiw3NDQsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExMn0sCi0KLQotLyogMDEwMSAxMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZGl2bCBycWQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxhZGRyZXNzX3NyYyIsMzIsNzQ1LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDExM30sCi0KLQotLyogMDEwMSAxMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZGl2bCBycWQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQsYWRkcmVzc19zcmMocnMpIiwzMiw3NDYsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDExNH0sCi0KLQotLyogMDAwMSAxMDEwIDAwMDAgZGRkZCBpbW0zMiAqKiogZGl2bCBycWQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxpbW0zMiIsMzIsNzQ0LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwxMTV9LAotCi0KLS8qIDEwMDEgMTAxMCBzc3NzIGRkZGQgKioqIGRpdmwgcnFkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLHJycyIsMzIsNzQ0LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTE2fSwKLQotCi0vKiAxMTExIGRkZGQgMWRpc3A3ICoqKiBkam56IHJkLGRpc3A3ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGpueiByZCxkaXNwNyIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0iZGpueiIsT1BDX2RqbnosMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMHhmLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU18xRElTUDcsMCwwLDAsMCwwLDAsfSwyLDIsMTE3fSwKLQotCi0vKiAwMTExIDExMDAgMDAwMCAwMWlpICoqKiBlaSBpMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImVpIGkyIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImVpIixPUENfZWksMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMiksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU18wMUlJLDAsMCwwLDAsMCx9LDEsMiwxMTh9LAotCi0KLS8qIDAwMTAgMTEwMSBzc04wIGRkZGQgKioqIGV4IHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4IHJkLEBycyIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0iZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTE5fSwKLQotCi0vKiAwMTEwIDExMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBleCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4IHJkLGFkZHJlc3Nfc3JjIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJleCIsT1BDX2V4LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyMH0sCi0KLQotLyogMDExMCAxMTAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXggcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXggcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxNiwKLTB4MDAsCi0jZW5kaWYKLSJleCIsT1BDX2V4LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMjF9LAotCi0KLS8qIDEwMTAgMTEwMSBzc3NzIGRkZGQgKioqIGV4IHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXggcmQscnMiLDE2LDYsCi0weDAwLAotI2VuZGlmCi0iZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTIyfSwKLQotCi0vKiAwMDEwIDExMDAgc3NOMCBkZGRkICoqKiBleGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4YiByYmQsQHJzIiw4LDEyLAotMHgwMCwKLSNlbmRpZgotImV4YiIsT1BDX2V4YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTIzfSwKLQotCi0vKiAwMTEwIDExMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBleGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXhiIHJiZCxhZGRyZXNzX3NyYyIsOCwxNSwKLTB4MDAsCi0jZW5kaWYKLSJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTI0fSwKLQotCi0vKiAwMTEwIDExMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBleGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4YiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDE2LAotMHgwMCwKLSNlbmRpZgotImV4YiIsT1BDX2V4YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTI1fSwKLQotCi0vKiAxMDEwIDExMDAgc3NzcyBkZGRkICoqKiBleGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4YiByYmQscmJzIiw4LDYsCi0weDAwLAotI2VuZGlmCi0iZXhiIixPUENfZXhiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMjZ9LAotCi0KLS8qIDAwMDAgMTExMCBpbW04ICoqKiBleHQwZSBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0MGUgaW1tOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJleHQwZSIsT1BDX2V4dDBlLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMTI3fSwKLQotCi0vKiAwMDAwIDExMTEgaW1tOCAqKiogZXh0MGYgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dDBmIGltbTgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iZXh0MGYiLE9QQ19leHQwZiwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEyOH0sCi0KLQotLyogMTAwMCAxMTEwIGltbTggKioqIGV4dDhlIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHQ4ZSBpbW04Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImV4dDhlIixPUENfZXh0OGUsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwxMjl9LAotCi0KLS8qIDEwMDAgMTExMSBpbW04ICoqKiBleHQ4ZiBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0OGYgaW1tOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJleHQ4ZiIsT1BDX2V4dDhmLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMTMwfSwKLQotCi0vKiAxMDExIDAwMDEgZGRkZCAxMDEwICoqKiBleHRzIHJyZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dHMgcnJkIiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJleHRzIixPUENfZXh0cywwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhhLDAsMCwwLDAsMCx9LDEsMiwxMzF9LAotCi0KLS8qIDEwMTEgMDAwMSBkZGRkIDAwMDAgKioqIGV4dHNiIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0c2IgcmQiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0iZXh0c2IiLE9QQ19leHRzYiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsMTMyfSwKLQotCi0vKiAxMDExIDAwMDEgZGRkZCAwMTExICoqKiBleHRzbCBycWQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHRzbCBycWQiLDMyLDExLAotMHgwMCwKLSNlbmRpZgotImV4dHNsIixPUENfZXh0c2wsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzcsMCwwLDAsMCwwLH0sMSwyLDEzM30sCi0KLQotLyogMDExMSAxMDEwIDAwMDAgMDAwMCAqKiogaGFsdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImhhbHQiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0iaGFsdCIsT1BDX2hhbHQsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMCwyLDEzNH0sCi0KLQotLyogMDAxMSAxMTAxIHNzTjAgZGRkZCAqKiogaW4gcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW4gcmQsQHJzIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJpbiIsT1BDX2luLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMzV9LAotCi0KLS8qIDAwMTEgMTEwMSBkZGRkIDAxMDAgaW1tMTYgKioqIGluIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW4gcmQsaW1tMTYiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImluIixPUENfaW4sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDEzNn0sCi0KLQotLyogMDAxMSAxMTAwIHNzTjAgZGRkZCAqKiogaW5iIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmIgcmJkLEBycyIsOCwxMiwKLTB4MDAsCi0jZW5kaWYKLSJpbmIiLE9QQ19pbmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEzN30sCi0KLQotLyogMDAxMSAxMDEwIGRkZGQgMDEwMCBpbW0xNiAqKiogaW5iIHJiZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYiByYmQsaW1tMTYiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iaW5iIixPUENfaW5iLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxMzh9LAotCi0KLS8qIDAwMTAgMTAwMSBkZE4wIGltbTRtMSAqKiogaW5jIEByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmMgQHJkLGltbTRtMSIsMTYsMTEsCi0weDFjLAotI2VuZGlmCi0iaW5jIixPUENfaW5jLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDEzOX0sCi0KLQotLyogMDExMCAxMDAxIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmMgYWRkcmVzc19kc3QocmQpLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwxNiwxNCwKLTB4MWMsCi0jZW5kaWYKLSJpbmMiLE9QQ19pbmMsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQwfSwKLQotCi0vKiAwMTEwIDEwMDEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGluYyBhZGRyZXNzX2RzdCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmMgYWRkcmVzc19kc3QsaW1tNG0xIiwxNiwxMywKLTB4MWMsCi0jZW5kaWYKLSJpbmMiLE9QQ19pbmMsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNDF9LAotCi0KLS8qIDEwMTAgMTAwMSBkZGRkIGltbTRtMSAqKiogaW5jIHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYyByZCxpbW00bTEiLDE2LDQsCi0weDFjLAotI2VuZGlmCi0iaW5jIixPUENfaW5jLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDE0Mn0sCi0KLQotLyogMDAxMCAxMDAwIGRkTjAgaW1tNG0xICoqKiBpbmNiIEByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmNiIEByZCxpbW00bTEiLDgsMTEsCi0weDFjLAotI2VuZGlmCi0iaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTQzfSwKLQotCi0vKiAwMTEwIDEwMDAgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGluY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsOCwxNCwKLTB4MWMsCi0jZW5kaWYKLSJpbmNiIixPUENfaW5jYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNDR9LAotCi0KLS8qIDAxMTAgMTAwMCAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogaW5jYiBhZGRyZXNzX2RzdCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmNiIGFkZHJlc3NfZHN0LGltbTRtMSIsOCwxMywKLTB4MWMsCi0jZW5kaWYKLSJpbmNiIixPUENfaW5jYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE0NX0sCi0KLQotLyogMTAxMCAxMDAwIGRkZGQgaW1tNG0xICoqKiBpbmNiIHJiZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmNiIHJiZCxpbW00bTEiLDgsNCwKLTB4MWMsCi0jZW5kaWYKLSJpbmNiIixPUENfaW5jYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs4LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxNDZ9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDEwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogaW5kIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmQgQHJkLEBycyxyYSIsMTYsMjEsCi0weDA0LAotI2VuZGlmCi0iaW5kIixPUENfaW5kLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTQ3fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIGluZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmRiIEByZCxAcnMscmJhIiw4LDIxLAotMHgwNCwKLSNlbmRpZgotImluZGIiLE9QQ19pbmRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTQ4fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIGluaWIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluaWIgQHJkLEBycyxyYSIsOCwyMSwKLTB4MDQsCi0jZW5kaWYKLSJpbmliIixPUENfaW5pYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE0OX0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBpbmliciBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5pYnIgQHJkLEBycyxyYSIsMTYsMjEsCi0weDA0LAotI2VuZGlmCi0iaW5pYnIiLE9QQ19pbmliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDE1MH0sCi0KLQotLyogMDExMSAxMDExIDAwMDAgMDAwMCAqKiogaXJldCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImlyZXQiLDE2LDEzLAotMHgzZiwKLSNlbmRpZgotImlyZXQiLE9QQ19pcmV0LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDAsMiwxNTF9LAotCi0KLS8qIDAwMDEgMTExMCBkZE4wIGNjY2MgKioqIGpwIGNjLEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImpwIGNjLEByZCIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0ianAiLE9QQ19qcCwwLHtDTEFTU19DQyxDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsMCwwLDAsMCx9LDIsMiwxNTJ9LAotCi0KLS8qIDAxMDEgMTExMCAwMDAwIGNjY2MgYWRkcmVzc19kc3QgKioqIGpwIGNjLGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ianAgY2MsYWRkcmVzc19kc3QiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ianAiLE9QQ19qcCwwLHtDTEFTU19DQyxDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19DQyxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE1M30sCi0KLQotLyogMDEwMSAxMTEwIGRkTjAgY2NjYyBhZGRyZXNzX2RzdCAqKioganAgY2MsYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ianAgY2MsYWRkcmVzc19kc3QocmQpIiwxNiw4LAotMHgwMCwKLSNlbmRpZgotImpwIixPUENfanAsMCx7Q0xBU1NfQ0MsQ0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTU0fSwKLQotCi0vKiAxMTEwIGNjY2MgZGlzcDggKioqIGpyIGNjLGRpc3A4ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ianIgY2MsZGlzcDgiLDE2LDYsCi0weDAwLAotI2VuZGlmCi0ianIiLE9QQ19qciwwLHtDTEFTU19DQyxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCsweGUsQ0xBU1NfQ0MsQ0xBU1NfRElTUDgsMCwwLDAsMCwwLDAsfSwyLDIsMTU1fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMTAxIGltbTE2ICoqKiBsZCBAcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBAcmQsaW1tMTYiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNTZ9LAotCi0KLS8qIDAwMTAgMTExMSBkZE4wIHNzc3MgKioqIGxkIEByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIEByZCxycyIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwxNTd9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYgKioqIGxkIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCx9LDIsNiwxNTh9LAotCi0KLS8qIDAxMTAgMTExMSBkZE4wIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkIGFkZHJlc3NfZHN0KHJkKSxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIGFkZHJlc3NfZHN0KHJkKSxycyIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTU5fSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2ICoqKiBsZCBhZGRyZXNzX2RzdCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIGFkZHJlc3NfZHN0LGltbTE2IiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsfSwyLDYsMTYwfSwKLQotCi0vKiAwMTEwIDExMTEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZCBhZGRyZXNzX2RzdCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIGFkZHJlc3NfZHN0LHJzIiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhmLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE2MX0sCi0KLQotLyogMDAxMSAwMDExIGRkTjAgc3NzcyBpbW0xNiAqKiogbGQgcmQoaW1tMTYpLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQoaW1tMTYpLHJzIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0JBKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNjJ9LAotCi0KLS8qIDAxMTEgMDAxMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGQgcmQocngpLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQocngpLHJzIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0JYKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxNjN9LAotCi0KLS8qIDAwMTAgMDAwMSBzc04wIGRkZGQgKioqIGxkIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLEBycyIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTY0fSwKLQotCi0vKiAwMTEwIDAwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE2NX0sCi0KLQotLyogMDExMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGQgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTY2fSwKLQotCi0vKiAwMDEwIDAwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBsZCByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLGltbTE2IiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNjd9LAotCi0KLS8qIDEwMTAgMDAwMSBzc3NzIGRkZGQgKioqIGxkIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQscnMiLDE2LDMsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE2OH0sCi0KLQotLyogMDAxMSAwMDAxIHNzTjAgZGRkZCBpbW0xNiAqKiogbGQgcmQscnMoaW1tMTYpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQscnMoaW1tMTYpIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0JBKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNjl9LAotCi0KLS8qIDAxMTEgMDAwMSBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGQgcmQscnMocngpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQscnMocngpIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxNzB9LAotCi0KLS8qIDAxMTEgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkYSBwcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGEgcHJkLGFkZHJlc3Nfc3JjIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJsZGEiLE9QQ19sZGEsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE3MX0sCi0KLQotLyogMDExMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRhIHByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGEgcHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTMsCi0weDAwLAotI2VuZGlmCi0ibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTcyfSwKLQotCi0vKiAwMDExIDAxMDAgc3NOMCBkZGRkIGltbTE2ICoqKiBsZGEgcHJkLHJzKGltbTE2KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYSBwcmQscnMoaW1tMTYpIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGEiLE9QQ19sZGEsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfQkErKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE3M30sCi0KLQotLyogMDExMSAwMTAwIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGEgcHJkLHJzKHJ4KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYSBwcmQscnMocngpIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGEiLE9QQ19sZGEsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfQlgrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE3NH0sCi0KLQotLyogMDAxMSAwMTAwIDAwMDAgZGRkZCBkaXNwMTYgKioqIGxkYXIgcHJkLGRpc3AxNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYXIgcHJkLGRpc3AxNiIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRhciIsT1BDX2xkYXIsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwxNzV9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAxMDEgaW1tOCBpbW04ICoqKiBsZGIgQHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgQHJkLGltbTgiLDgsNywKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwxNzZ9LAotCi0KLS8qIDAwMTAgMTExMCBkZE4wIHNzc3MgKioqIGxkYiBAcmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIEByZCxyYnMiLDgsOCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDE3N30sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDEwMSBhZGRyZXNzX2RzdCBpbW04IGltbTggKioqIGxkYiBhZGRyZXNzX2RzdChyZCksaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBhZGRyZXNzX2RzdChyZCksaW1tOCIsOCwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNiwxNzh9LAotCi0KLS8qIDAxMTAgMTExMCBkZE4wIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkYiBhZGRyZXNzX2RzdChyZCkscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIGFkZHJlc3NfZHN0KHJkKSxyYnMiLDgsMTIsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNzl9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBsZGIgYWRkcmVzc19kc3QsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBhZGRyZXNzX2RzdCxpbW04Iiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsMTgwfSwKLQotCi0vKiAwMTEwIDExMTAgMDAwMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGIgYWRkcmVzc19kc3QscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIGFkZHJlc3NfZHN0LHJicyIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTgxfSwKLQotCi0vKiAwMDEwIDAwMDAgc3NOMCBkZGRkICoqKiBsZGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQsQHJzIiw4LDcsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTgyfSwKLQotCi0vKiAwMTEwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTgzfSwKLQotCi0vKiAwMTEwIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE4NH0sCi0KLQotLyogMTEwMCBkZGRkIGltbTggKioqIGxkYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQsaW1tOCIsOCw1LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDIsMiwxODV9LAotCi0KLS8qIDEwMTAgMDAwMCBzc3NzIGRkZGQgKioqIGxkYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxyYnMiLDgsMywKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxODZ9LAotCi0KLS8qIDAwMTEgMDAwMCBzc04wIGRkZGQgaW1tMTYgKioqIGxkYiByYmQscnMoaW1tMTYpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxycyhpbW0xNikiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0JBKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxODd9LAotCi0KLS8qIDAxMTEgMDAwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRiIHJiZCxycyhyeCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLHJzKHJ4KSIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfQlgrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE4OH0sCi0KLQotLyogMDAxMSAwMDEwIGRkTjAgc3NzcyBpbW0xNiAqKiogbGRiIHJkKGltbTE2KSxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmQoaW1tMTYpLHJicyIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfQkErKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE4OX0sCi0KLQotLyogMDExMSAwMDEwIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGIgcmQocngpLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByZChyeCkscmJzIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19CWCsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTkwfSwKLQotCi0vKiAwMTExIDExMDEgc3NzcyAxY2NjICoqKiBsZGN0bCBjdHJsLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRjdGwgY3RybCxycyIsMzIsNywKLTB4MDAsCi0jZW5kaWYKLSJsZGN0bCIsT1BDX2xkY3RsLDAse0NMQVNTX0NUUkwsQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfMUNDQywwLDAsMCwwLDAsfSwyLDIsMTkxfSwKLQotCi0vKiAwMTExIDExMDEgZGRkZCAwY2NjICoqKiBsZGN0bCByZCxjdHJsICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRjdGwgcmQsY3RybCIsMzIsNywKLTB4MDAsCi0jZW5kaWYKLSJsZGN0bCIsT1BDX2xkY3RsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0NUUkwsfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfMENDQywwLDAsMCwwLDAsfSwyLDIsMTkyfSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkZCBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRkIEByZCxAcnMscnIiLDE2LDExLAotMHgwNCwKLSNlbmRpZgotImxkZCIsT1BDX2xkZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTkzfSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkZGIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkZGIgQHJkLEBycyxyciIsOCwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGRiIixPUENfbGRkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTk0fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAgKioqIGxkZHIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkZHIgQHJkLEBycyxyciIsMTYsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRkciIsT1BDX2xkZHIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDE5NX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGRyYiBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRkcmIgQHJkLEBycyxyciIsOCwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGRyYiIsT1BDX2xkZHJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxOTZ9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCAqKiogbGRpIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGkgQHJkLEBycyxyciIsMTYsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRpIixPUENfbGRpLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxOTd9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCAqKiogbGRpYiBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRpYiBAcmQsQHJzLHJyIiw4LDExLAotMHgwNCwKLSNlbmRpZgotImxkaWIiLE9QQ19sZGliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxOTh9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCAqKiogbGRpciBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRpciBAcmQsQHJzLHJyIiwxNiwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGlyIixPUENfbGRpciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMTk5fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAgKioqIGxkaXJiIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGlyYiBAcmQsQHJzLHJyIiw4LDExLAotMHgwNCwKLSNlbmRpZgotImxkaXJiIixPUENfbGRpcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDIwMH0sCi0KLQotLyogMTAxMSAxMTAxIGRkZGQgaW1tNCAqKiogbGRrIHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGsgcmQsaW1tNCIsMTYsNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGsiLE9QQ19sZGssMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDIwMX0sCi0KLQotLyogMDAwMSAxMTAxIGRkTjAgc3NzcyAqKiogbGRsIEByZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgQHJkLHJycyIsMzIsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyMDJ9LAotCi0KLS8qIDAxMDEgMTEwMSBkZE4wIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkbCBhZGRyZXNzX2RzdChyZCkscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIGFkZHJlc3NfZHN0KHJkKSxycnMiLDMyLDE0LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjAzfSwKLQotCi0vKiAwMTAxIDExMDEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGwgYWRkcmVzc19kc3QscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIGFkZHJlc3NfZHN0LHJycyIsMzIsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDIwNH0sCi0KLQotLyogMDAxMSAwMTExIGRkTjAgc3NzcyBpbW0xNiAqKiogbGRsIHJkKGltbTE2KSxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcmQoaW1tMTYpLHJycyIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX0JBKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyMDV9LAotCi0KLS8qIDAxMTEgMDExMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRsIHJkKHJ4KSxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcmQocngpLHJycyIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX0JYKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwyMDZ9LAotCi0KLS8qIDAwMDEgMDEwMCBzc04wIGRkZGQgKioqIGxkbCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxAcnMiLDMyLDExLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIwN30sCi0KLQotLyogMDEwMSAwMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRsIHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQsYWRkcmVzc19zcmMiLDMyLDEyLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjA4fSwKLQotCi0vKiAwMTAxIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQsYWRkcmVzc19zcmMocnMpIiwzMiwxMywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMDl9LAotCi0KLS8qIDAwMDEgMDEwMCAwMDAwIGRkZGQgaW1tMzIgKioqIGxkbCBycmQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLGltbTMyIiwzMiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwyMTB9LAotCi0KLS8qIDEwMDEgMDEwMCBzc3NzIGRkZGQgKioqIGxkbCBycmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxycnMiLDMyLDUsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs0LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIxMX0sCi0KLQotLyogMDAxMSAwMTAxIHNzTjAgZGRkZCBpbW0xNiAqKiogbGRsIHJyZCxycyhpbW0xNikgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLHJzKGltbTE2KSIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0JBKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyMTJ9LAotCi0KLS8qIDAxMTEgMDEwMSBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRsIHJyZCxycyhyeCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLHJzKHJ4KSIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwyMTN9LAotCi0KLS8qIDAwMDEgMTEwMCBkZE4wIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSAqKiogbGRtIEByZCxycyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIEByZCxycyxuIiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSwwLH0sMyw0LDIxNH0sCi0KLQotLyogMDEwMSAxMTAwIGRkTjAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIGFkZHJlc3NfZHN0ICoqKiBsZG0gYWRkcmVzc19kc3QocmQpLHJzLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gYWRkcmVzc19kc3QocmQpLHJzLG4iLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksfSwzLDYsMjE1fSwKLQotCi0vKiAwMTAxIDExMDAgMDAwMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEgYWRkcmVzc19kc3QgKioqIGxkbSBhZGRyZXNzX2RzdCxycyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIGFkZHJlc3NfZHN0LHJzLG4iLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSx9LDMsNiwyMTZ9LAotCi0KLS8qIDAwMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSAqKiogbGRtIHJkLEBycyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIHJkLEBycyxuIiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSwwLH0sMyw0LDIxN30sCi0KLQotLyogMDEwMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjICoqKiBsZG0gcmQsYWRkcmVzc19zcmMocnMpLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gcmQsYWRkcmVzc19zcmMocnMpLG4iLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksfSwzLDYsMjE4fSwKLQotCi0vKiAwMTAxIDExMDAgMDAwMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgYWRkcmVzc19zcmMgKioqIGxkbSByZCxhZGRyZXNzX3NyYyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIHJkLGFkZHJlc3Nfc3JjLG4iLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSx9LDMsNiwyMTl9LAotCi0KLS8qIDAwMTEgMTAwMSBzc04wIDAwMDAgKioqIGxkcHMgQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRwcyBAcnMiLDE2LDEyLAotMHgzZiwKLSNlbmRpZgotImxkcHMiLE9QQ19sZHBzLDAse0NMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiwyMjB9LAotCi0KLS8qIDAxMTEgMTAwMSAwMDAwIDAwMDAgYWRkcmVzc19zcmMgKioqIGxkcHMgYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHBzIGFkZHJlc3Nfc3JjIiwxNiwxNiwKLTB4M2YsCi0jZW5kaWYKLSJsZHBzIixPUENfbGRwcywwLHtDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDEsNCwyMjF9LAotCi0KLS8qIDAxMTEgMTAwMSBzc04wIDAwMDAgYWRkcmVzc19zcmMgKioqIGxkcHMgYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRwcyBhZGRyZXNzX3NyYyhycykiLDE2LDE3LAotMHgzZiwKLSNlbmRpZgotImxkcHMiLE9QQ19sZHBzLDAse0NMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDEsNCwyMjJ9LAotCi0KLS8qIDAwMTEgMDAxMSAwMDAwIHNzc3MgZGlzcDE2ICoqKiBsZHIgZGlzcDE2LHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRyIGRpc3AxNixycyIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRyIixPUENfbGRyLDAse0NMQVNTX0RJU1AsQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjIzfSwKLQotCi0vKiAwMDExIDAwMDEgMDAwMCBkZGRkIGRpc3AxNiAqKiogbGRyIHJkLGRpc3AxNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkciByZCxkaXNwMTYiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkciIsT1BDX2xkciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyNH0sCi0KLQotLyogMDAxMSAwMDEwIDAwMDAgc3NzcyBkaXNwMTYgKioqIGxkcmIgZGlzcDE2LHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcmIgZGlzcDE2LHJicyIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZHJiIixPUENfbGRyYiwwLHtDTEFTU19ESVNQLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyNX0sCi0KLQotLyogMDAxMSAwMDAwIDAwMDAgZGRkZCBkaXNwMTYgKioqIGxkcmIgcmJkLGRpc3AxNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcmIgcmJkLGRpc3AxNiIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZHJiIixPUENfbGRyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyNn0sCi0KLQotLyogMDAxMSAwMTExIDAwMDAgc3NzcyBkaXNwMTYgKioqIGxkcmwgZGlzcDE2LHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcmwgZGlzcDE2LHJycyIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRybCIsT1BDX2xkcmwsMCx7Q0xBU1NfRElTUCxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjd9LAotCi0KLS8qIDAwMTEgMDEwMSAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZHJsIHJyZCxkaXNwMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHJsIHJyZCxkaXNwMTYiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkcmwiLE9QQ19sZHJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI4fSwKLQotCi0vKiAwMTExIDEwMTEgMDAwMCAxMDEwICoqKiBtYml0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibWJpdCIsMTYsNywKLTB4MzgsCi0jZW5kaWYKLSJtYml0IixPUENfbWJpdCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhhLDAsMCwwLDAsMCx9LDAsMiwyMjl9LAotCi0KLS8qIDAxMTEgMTAxMSBkZGRkIDExMDEgKioqIG1yZXEgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtcmVxIHJkIiwxNiwxMiwKLTB4MTgsCi0jZW5kaWYKLSJtcmVxIixPUENfbXJlcSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhkLDAsMCwwLDAsMCx9LDEsMiwyMzB9LAotCi0KLS8qIDAxMTEgMTAxMSAwMDAwIDEwMDEgKioqIG1yZXMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtcmVzIiwxNiw1LAotMHgwMCwKLSNlbmRpZgotIm1yZXMiLE9QQ19tcmVzLDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0JJVCs5LDAsMCwwLDAsMCx9LDAsMiwyMzF9LAotCi0KLS8qIDAxMTEgMTAxMSAwMDAwIDEwMDAgKioqIG1zZXQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtc2V0IiwxNiw1LAotMHgwMCwKLSNlbmRpZgotIm1zZXQiLE9QQ19tc2V0LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDAsMiwyMzJ9LAotCi0KLS8qIDAwMDEgMTAwMSBzc04wIGRkZGQgKioqIG11bHQgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLEBycyIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMzN9LAotCi0KLS8qIDAxMDEgMTAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG11bHQgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQsYWRkcmVzc19zcmMiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMzR9LAotCi0KLS8qIDAxMDEgMTAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIG11bHQgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMzV9LAotCi0KLS8qIDAwMDEgMTAwMSAwMDAwIGRkZGQgaW1tMTYgKioqIG11bHQgcnJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQsaW1tMTYiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjM2fSwKLQotCi0vKiAxMDAxIDEwMDEgc3NzcyBkZGRkICoqKiBtdWx0IHJyZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLHJzIiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrOSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMzd9LAotCi0KLS8qIDAwMDEgMTAwMCBzc04wIGRkZGQgKioqIG11bHRsIHJxZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQsQHJzIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIzOH0sCi0KLQotLyogMDEwMSAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbXVsdGwgcnFkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLGFkZHJlc3Nfc3JjIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjM5fSwKLQotCi0vKiAwMTAxIDEwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0bCBycWQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNDB9LAotCi0KLS8qIDAwMDEgMTAwMCAwMDAwIGRkZGQgaW1tMzIgKioqIG11bHRsIHJxZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxpbW0zMiIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwyNDF9LAotCi0KLS8qIDEwMDEgMTAwMCBzc3NzIGRkZGQgKioqIG11bHRsIHJxZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQscnJzIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrOCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNDJ9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAwMTAgKioqIG5lZyBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWcgQHJkIiwxNiwxMiwKLTB4M2MsCi0jZW5kaWYKLSJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjQzfSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMDEwIGFkZHJlc3NfZHN0ICoqKiBuZWcgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWcgYWRkcmVzc19kc3QiLDE2LDE1LAotMHgzYywKLSNlbmRpZgotIm5lZyIsT1BDX25lZywwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDI0NH0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZyBhZGRyZXNzX2RzdChyZCkiLDE2LDE2LAotMHgzYywKLSNlbmRpZgotIm5lZyIsT1BDX25lZywwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDV9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDAwMTAgKioqIG5lZyByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZyByZCIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzIsMCwwLDAsMCwwLH0sMSwyLDI0Nn0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDAxMCAqKiogbmVnYiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWdiIEByZCIsOCwxMiwKLTB4M2MsCi0jZW5kaWYKLSJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsyLDAsMCwwLDAsMCx9LDEsMiwyNDd9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAwMTAgYWRkcmVzc19kc3QgKioqIG5lZ2IgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWdiIGFkZHJlc3NfZHN0Iiw4LDE1LAotMHgzYywKLSNlbmRpZgotIm5lZ2IiLE9QQ19uZWdiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCsyLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMjQ4fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMDEwIGFkZHJlc3NfZHN0ICoqKiBuZWdiIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZ2IgYWRkcmVzc19kc3QocmQpIiw4LDE2LAotMHgzYywKLSNlbmRpZgotIm5lZ2IiLE9QQ19uZWdiLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDI0OX0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMDAxMCAqKiogbmVnYiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWdiIHJiZCIsOCw3LAotMHgzYywKLSNlbmRpZgotIm5lZ2IiLE9QQ19uZWdiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsyLDAsMCwwLDAsMCx9LDEsMiwyNTB9LAotCi0KLS8qIDEwMDAgMTEwMSAwMDAwIDAxMTEgKioqIG5vcCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5vcCIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJub3AiLE9QQ19ub3AsMCx7MH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzcsMCwwLDAsMCwwLH0sMCwyLDI1MX0sCi0KLQotLyogMDAwMCAwMTAxIHNzTjAgZGRkZCAqKiogb3IgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQsQHJzIiwxNiw3LAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNTJ9LAotCi0KLS8qIDAxMDAgMDEwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjUzfSwKLQotCi0vKiAwMTAwIDAxMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBvciByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNTR9LAotCi0KLS8qIDAwMDAgMDEwMSAwMDAwIGRkZGQgaW1tMTYgKioqIG9yIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQsaW1tMTYiLDE2LDcsCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDI1NX0sCi0KLQotLyogMTAwMCAwMTAxIHNzc3MgZGRkZCAqKiogb3IgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxycyIsMTYsNCwKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs1LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI1Nn0sCi0KLQotLyogMDAwMCAwMTAwIHNzTjAgZGRkZCAqKiogb3JiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLEBycyIsOCw3LAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI1N30sCi0KLQotLyogMDEwMCAwMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogb3JiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI1OH0sCi0KLQotLyogMDEwMCAwMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogb3JiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNTl9LAotCi0KLS8qIDAwMDAgMDEwMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBvcmIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLGltbTgiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDI2MH0sCi0KLQotLyogMTAwMCAwMTAwIHNzc3MgZGRkZCAqKiogb3JiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLHJicyIsOCw0LAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNjF9LAotCi0KLS8qIDAwMTEgMTExMSBkZE4wIHNzc3MgKioqIG91dCBAcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXQgQHJkLHJzIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dCIsT1BDX291dCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjYyfSwKLQotCi0vKiAwMDExIDEwMTEgc3NzcyAwMTEwIGltbTE2ICoqKiBvdXQgaW1tMTYscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXQgaW1tMTYscnMiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0IixPUENfb3V0LDAse0NMQVNTX0lNTSsoQVJHX0lNTTE2KSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrNixDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyNjN9LAotCi0KLS8qIDAwMTEgMTExMCBkZE4wIHNzc3MgKioqIG91dGIgQHJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGIgQHJkLHJicyIsOCwwLAotMHgwNCwKLSNlbmRpZgotIm91dGIiLE9QQ19vdXRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyNjR9LAotCi0KLS8qIDAwMTEgMTAxMCBzc3NzIDAxMTAgaW1tMTYgKioqIG91dGIgaW1tMTYscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0YiBpbW0xNixyYnMiLDgsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRiIixPUENfb3V0YiwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjY1fSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAxMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIG91dGQgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGQgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRkIixPUENfb3V0ZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMjY2fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAxMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIG91dGRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0ZGIgQHJkLEBycyxyYmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0ZGIiLE9QQ19vdXRkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMjY3fSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIG91dGkgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGkgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRpIixPUENfb3V0aSwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2OH0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRpYiBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0aWIgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRpYiIsT1BDX291dGliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMjY5fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDAwMDAgKioqIG91dGliciBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0aWJyIEByZCxAcnMscmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0aWJyIixPUENfb3V0aWJyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMjcwfSwKLQotCi0vKiAwMDAxIDAxMTEgc3NOMCBkZE4wICoqKiBwb3AgQHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcCBAcmQsQHJzIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJwb3AiLE9QQ19wb3AsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHTjArKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI3MX0sCi0KLQotLyogMDEwMSAwMTExIHNzTjAgZGROMCBhZGRyZXNzX2RzdCAqKiogcG9wIGFkZHJlc3NfZHN0KHJkKSxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3AgYWRkcmVzc19kc3QocmQpLEBycyIsMTYsMTYsCi0weDAwLAotI2VuZGlmCi0icG9wIixPUENfcG9wLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyNzJ9LAotCi0KLS8qIDAxMDEgMDExMSBzc04wIDAwMDAgYWRkcmVzc19kc3QgKioqIHBvcCBhZGRyZXNzX2RzdCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3AgYWRkcmVzc19kc3QsQHJzIiwxNiwxNiwKLTB4MDAsCi0jZW5kaWYKLSJwb3AiLE9QQ19wb3AsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjczfSwKLQotCi0vKiAxMDAxIDAxMTEgc3NOMCBkZGRkICoqKiBwb3AgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wIHJkLEBycyIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJwb3AiLE9QQ19wb3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzR9LAotCi0KLS8qIDAwMDEgMDEwMSBzc04wIGRkTjAgKioqIHBvcGwgQHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcGwgQHJkLEBycyIsMzIsMTksCi0weDAwLAotI2VuZGlmCi0icG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHTjArKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI3NX0sCi0KLQotLyogMDEwMSAwMTAxIHNzTjAgZGROMCBhZGRyZXNzX2RzdCAqKiogcG9wbCBhZGRyZXNzX2RzdChyZCksQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wbCBhZGRyZXNzX2RzdChyZCksQHJzIiwzMiwyMywKLTB4MDAsCi0jZW5kaWYKLSJwb3BsIixPUENfcG9wbCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjc2fSwKLQotCi0vKiAwMTAxIDAxMDEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBwb3BsIGFkZHJlc3NfZHN0LEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcGwgYWRkcmVzc19kc3QsQHJzIiwzMiwyMywKLTB4MDAsCi0jZW5kaWYKLSJwb3BsIixPUENfcG9wbCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyNzd9LAotCi0KLS8qIDEwMDEgMDEwMSBzc04wIGRkZGQgKioqIHBvcGwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcGwgcnJkLEBycyIsMzIsMTIsCi0weDAwLAotI2VuZGlmCi0icG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzh9LAotCi0KLS8qIDAwMDEgMDAxMSBkZE4wIHNzTjAgKioqIHB1c2ggQHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLEBycyIsMTYsMTMsCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHTjArKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI3OX0sCi0KLQotLyogMDEwMSAwMDExIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyAqKiogcHVzaCBAcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxhZGRyZXNzX3NyYyIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjgwfSwKLQotCi0vKiAwMTAxIDAwMTEgZGROMCBzc04wIGFkZHJlc3Nfc3JjICoqKiBwdXNoIEByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxhZGRyZXNzX3NyYyhycykiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODF9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDEwMDEgaW1tMTYgKioqIHB1c2ggQHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQsaW1tMTYiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDI4Mn0sCi0KLQotLyogMTAwMSAwMDExIGRkTjAgc3NzcyAqKiogcHVzaCBAcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxycyIsMTYsOSwKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI4M30sCi0KLQotLyogMDAwMSAwMDAxIGRkTjAgc3NOMCAqKiogcHVzaGwgQHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2hsIEByZCxAcnMiLDMyLDIwLAotMHgwMCwKLSNlbmRpZgotInB1c2hsIixPUENfcHVzaGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHTjArKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI4NH0sCi0KLQotLyogMDEwMSAwMDAxIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyAqKiogcHVzaGwgQHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaGwgQHJkLGFkZHJlc3Nfc3JjIiwzMiwyMSwKLTB4MDAsCi0jZW5kaWYKLSJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI4NX0sCi0KLQotLyogMDEwMSAwMDAxIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyAqKiogcHVzaGwgQHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2hsIEByZCxhZGRyZXNzX3NyYyhycykiLDMyLDIxLAotMHgwMCwKLSNlbmRpZgotInB1c2hsIixPUENfcHVzaGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI4Nn0sCi0KLQotLyogMTAwMSAwMDAxIGRkTjAgc3NzcyAqKiogcHVzaGwgQHJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2hsIEByZCxycnMiLDMyLDEyLAotMHgwMCwKLSNlbmRpZgotInB1c2hsIixPUENfcHVzaGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyODd9LAotCi0KLS8qIDAwMTAgMDAxMSBkZE4wIGltbTQgKioqIHJlcyBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyBAcmQsaW1tNCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjg4fSwKLQotCi0vKiAwMTEwIDAwMTEgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiByZXMgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgYWRkcmVzc19kc3QocmQpLGltbTQiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI4OX0sCi0KLQotLyogMDExMCAwMDExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzIGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgYWRkcmVzc19kc3QsaW1tNCIsMTYsMTMsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOTB9LAotCi0KLS8qIDEwMTAgMDAxMSBkZGRkIGltbTQgKioqIHJlcyByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIHJkLGltbTQiLDE2LDQsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjkxfSwKLQotCi0vKiAwMDEwIDAwMTEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHJlcyByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyByZCxycyIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwyOTJ9LAotCi0KLS8qIDAwMTAgMDAxMCBkZE4wIGltbTQgKioqIHJlc2IgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIEByZCxpbW00Iiw4LDExLAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjkzfSwKLQotCi0vKiAwMTEwIDAwMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiByZXNiIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiBhZGRyZXNzX2RzdChyZCksaW1tNCIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI5NH0sCi0KLQotLyogMDExMCAwMDEwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzYiBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiBhZGRyZXNzX2RzdCxpbW00Iiw4LDEzLAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOTV9LAotCi0KLS8qIDEwMTAgMDAxMCBkZGRkIGltbTQgKioqIHJlc2IgcmJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIHJiZCxpbW00Iiw4LDQsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyOTZ9LAotCi0KLS8qIDAwMTAgMDAxMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogcmVzYiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIHJiZCxycyIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjk3fSwKLQotCi0vKiAxMDAwIDExMDEgZmxhZ3MgMDAxMSAqKiogcmVzZmxnIGZsYWdzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzZmxnIGZsYWdzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotInJlc2ZsZyIsT1BDX3Jlc2ZsZywwLHtDTEFTU19GTEFHUyx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0ZMQUdTLENMQVNTX0JJVCszLDAsMCwwLDAsMCx9LDEsMiwyOTh9LAotCi0KLS8qIDEwMDEgMTExMCAwMDAwIGNjY2MgKioqIHJldCBjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJldCBjYyIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0icmV0IixPUENfcmV0LDAse0NMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfQ0MsMCwwLDAsMCwwLH0sMSwyLDI5OX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDBJMCAqKiogcmwgcmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsIHJkLGltbTFvcjIiLDE2LDYsCi0weDNjLAotI2VuZGlmCi0icmwiLE9QQ19ybCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMiswLDAsMCwwLDAsMCx9LDIsMiwzMDB9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAwSTAgKioqIHJsYiByYmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsYiByYmQsaW1tMW9yMiIsOCw2LAotMHgzYywKLSNlbmRpZgotInJsYiIsT1BDX3JsYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMiswLDAsMCwwLDAsMCx9LDIsMiwzMDF9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDEwSTAgKioqIHJsYyByZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmxjIHJkLGltbTFvcjIiLDE2LDYsCi0weDNjLAotI2VuZGlmCi0icmxjIixPUENfcmxjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzgsMCwwLDAsMCwwLH0sMiwyLDMwMn0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTBJMCAqKiogcmxjYiByYmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsY2IgcmJkLGltbTFvcjIiLDgsOSwKLTB4MTAsCi0jZW5kaWYKLSJybGNiIixPUENfcmxjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMis4LDAsMCwwLDAsMCx9LDIsMiwzMDN9LAotCi0KLS8qIDEwMTEgMTExMCBhYWFhIGJiYmIgKioqIHJsZGIgcmJiLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsZGIgcmJiLHJiYSIsOCw5LAotMHgxMCwKLSNlbmRpZgotInJsZGIiLE9QQ19ybGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHKyhBUkdfUkIpLDAsMCwwLDAsMCx9LDIsMiwzMDR9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAxSTAgKioqIHJyIHJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyciByZCxpbW0xb3IyIiwxNiw2LAotMHgzYywKLSNlbmRpZgotInJyIixPUENfcnIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrNCwwLDAsMCwwLDAsfSwyLDIsMzA1fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMUkwICoqKiBycmIgcmJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJycmIgcmJkLGltbTFvcjIiLDgsNiwKLTB4M2MsCi0jZW5kaWYKLSJycmIiLE9QQ19ycmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrNCwwLDAsMCwwLDAsfSwyLDIsMzA2fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMUkwICoqKiBycmMgcmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyYyByZCxpbW0xb3IyIiwxNiw2LAotMHgzYywKLSNlbmRpZgotInJyYyIsT1BDX3JyYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMisweGMsMCwwLDAsMCwwLH0sMiwyLDMwN30sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTFJMCAqKiogcnJjYiByYmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyY2IgcmJkLGltbTFvcjIiLDgsOSwKLTB4MTAsCi0jZW5kaWYKLSJycmNiIixPUENfcnJjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMisweGMsMCwwLDAsMCwwLH0sMiwyLDMwOH0sCi0KLQotLyogMTAxMSAxMTAwIGFhYWEgYmJiYiAqKiogcnJkYiByYmIscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnJkYiByYmIscmJhIiw4LDksCi0weDEwLAotI2VuZGlmCi0icnJkYiIsT1BDX3JyZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUcrKEFSR19SQiksMCwwLDAsMCwwLH0sMiwyLDMwOX0sCi0KLQotLyogMDAxMSAwMTEwIGltbTggKioqIHJzdmQzNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQzNiIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkMzYiLE9QQ19yc3ZkMzYsMCx7MH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs2LENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxMH0sCi0KLQotLyogMDAxMSAxMDAwIGltbTggKioqIHJzdmQzOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQzOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkMzgiLE9QQ19yc3ZkMzgsMCx7MH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs4LENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxMX0sCi0KLQotLyogMDExMSAxMDAwIGltbTggKioqIHJzdmQ3OCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQ3OCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkNzgiLE9QQ19yc3ZkNzgsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs4LENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxMn0sCi0KLQotLyogMDExMSAxMTEwIGltbTggKioqIHJzdmQ3ZSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQ3ZSIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkN2UiLE9QQ19yc3ZkN2UsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzEzfSwKLQotCi0vKiAxMDAxIDExMDEgaW1tOCAqKiogcnN2ZDlkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDlkIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQ5ZCIsT1BDX3JzdmQ5ZCwwLHswfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTR9LAotCi0KLS8qIDEwMDEgMTExMSBpbW04ICoqKiByc3ZkOWYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkOWYiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDlmIixPUENfcnN2ZDlmLDAsezB9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxNX0sCi0KLQotLyogMTAxMSAxMDAxIGltbTggKioqIHJzdmRiOSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmRiOSIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkYjkiLE9QQ19yc3ZkYjksMCx7MH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzE2fSwKLQotCi0vKiAxMDExIDExMTEgaW1tOCAqKiogcnN2ZGJmICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZGJmIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmRiZiIsT1BDX3JzdmRiZiwwLHswfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxN30sCi0KLQotLyogMTAxMSAwMTExIHNzc3MgZGRkZCAqKiogc2JjIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2JjIHJkLHJzIiwxNiw1LAotMHgzYywKLSNlbmRpZgotInNiYyIsT1BDX3NiYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs3LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDMxOH0sCi0KLQotLyogMTAxMSAwMTEwIHNzc3MgZGRkZCAqKiogc2JjYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2JjYiByYmQscmJzIiw4LDUsCi0weDNmLAotI2VuZGlmCi0ic2JjYiIsT1BDX3NiY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzMTl9LAotCi0KLS8qIDAxMTEgMTExMSBpbW04ICoqKiBzYyBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2MgaW1tOCIsOCwzMywKLTB4M2YsCi0jZW5kaWYKLSJzYyIsT1BDX3NjLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMzIwfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkYSByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkYSByZCxycyIsMTYsMTUsCi0weDNjLAotI2VuZGlmCi0ic2RhIixPUENfc2RhLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzIxfSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkYWIgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RhYiByYmQscnMiLDgsMTUsCi0weDNjLAotI2VuZGlmCi0ic2RhYiIsT1BDX3NkYWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjJ9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDExMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RhbCBycmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGFsIHJyZCxycyIsMzIsMTUsCi0weDNjLAotI2VuZGlmCi0ic2RhbCIsT1BDX3NkYWwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjN9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RsIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RsIHJkLHJzIiwxNiwxNSwKLTB4MzgsCi0jZW5kaWYKLSJzZGwiLE9QQ19zZGwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzI0fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkbGIgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RsYiByYmQscnMiLDgsMTUsCi0weDM4LAotI2VuZGlmCi0ic2RsYiIsT1BDX3NkbGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzI1fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkbGwgcnJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RsbCBycmQscnMiLDMyLDE1LAotMHgzOCwKLSNlbmRpZgotInNkbGwiLE9QQ19zZGxsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyNn0sCi0KLQotLyogMDAxMCAwMTAxIGRkTjAgaW1tNCAqKiogc2V0IEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IEByZCxpbW00IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMjd9LAotCi0KLS8qIDAxMTAgMDEwMSBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIHNldCBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCBhZGRyZXNzX2RzdChyZCksaW1tNCIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzI4fSwKLQotCi0vKiAwMTEwIDAxMDEgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXQgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCBhZGRyZXNzX2RzdCxpbW00IiwxNiwxMywKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMyOX0sCi0KLQotLyogMTAxMCAwMTAxIGRkZGQgaW1tNCAqKiogc2V0IHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgcmQsaW1tNCIsMTYsNCwKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMzB9LAotCi0KLS8qIDAwMTAgMDEwMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogc2V0IHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IHJkLHJzIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMzMX0sCi0KLQotLyogMDAxMCAwMTAwIGRkTjAgaW1tNCAqKiogc2V0YiBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgQHJkLGltbTQiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMzJ9LAotCi0KLS8qIDAxMTAgMDEwMCBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIHNldGIgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00Iiw4LDE0LAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzMzfSwKLQotCi0vKiAwMTEwIDAxMDAgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXRiIGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIGFkZHJlc3NfZHN0LGltbTQiLDgsMTMsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMzNH0sCi0KLQotLyogMTAxMCAwMTAwIGRkZGQgaW1tNCAqKiogc2V0YiByYmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgcmJkLGltbTQiLDgsNCwKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrNCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMzNX0sCi0KLQotLyogMDAxMCAwMTAwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiBzZXRiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgcmJkLHJzIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMzZ9LAotCi0KLS8qIDEwMDAgMTEwMSBmbGFncyAwMDAxICoqKiBzZXRmbGcgZmxhZ3MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRmbGcgZmxhZ3MiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0ic2V0ZmxnIixPUENfc2V0ZmxnLDAse0NMQVNTX0ZMQUdTLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfRkxBR1MsQ0xBU1NfQklUKzEsMCwwLDAsMCwwLH0sMSwyLDMzN30sCi0KLQotLyogMDAxMSAxMDEwIGRkZGQgMDEwMSBpbW0xNiAqKiogc2luYiByYmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5iIHJiZCxpbW0xNiIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNpbmIiLE9QQ19zaW5iLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzMzh9LAotCi0KLS8qIDAwMTEgMTAxMSBkZGRkIDAxMDEgaW1tMTYgKioqIHNpbmIgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5iIHJkLGltbTE2Iiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic2luYiIsT1BDX3NpbmIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDMzOX0sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMTAwMCAwMDAxIGFhYWEgZGROMCAxMDAwICoqKiBzaW5kIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5kIEByZCxAcnMscmEiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic2luZCIsT1BDX3NpbmQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNDB9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCAqKiogc2luZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5kYiBAcmQsQHJzLHJiYSIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNpbmRiIixPUENfc2luZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNDF9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogc2luaWIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmliIEByZCxAcnMscmEiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5pYiIsT1BDX3NpbmliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzQyfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgYWFhYSBkZE4wIDAwMDAgKioqIHNpbmliciBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luaWJyIEByZCxAcnMscmEiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic2luaWJyIixPUENfc2luaWJyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMzQzfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMDAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGEgcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsYSByZCxpbW04IiwxNiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzbGEiLE9QQ19zbGEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0NH0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTAwMSAgMDAwMCAwMDAwIGltbTggKioqIHNsYWIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGFiIHJiZCxpbW04Iiw4LDEzLAotMHgzYywKLSNlbmRpZgotInNsYWIiLE9QQ19zbGFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDV9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDExMDEgMDAwMCAwMDAwIGltbTggKioqIHNsYWwgcnJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGFsIHJyZCxpbW04IiwzMiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzbGFsIixPUENfc2xhbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDZ9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAwMDEgMDAwMCAwMDAwIGltbTggKioqIHNsbCByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xsIHJkLGltbTgiLDE2LDEzLAotMHgzOCwKLSNlbmRpZgotInNsbCIsT1BDX3NsbCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ3fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMDAxICAwMDAwIDAwMDAgaW1tOCAqKiogc2xsYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsbGIgcmJkLGltbTgiLDgsMTMsCi0weDM4LAotI2VuZGlmCi0ic2xsYiIsT1BDX3NsbGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0OH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDEwMSAwMDAwIDAwMDAgaW1tOCAqKiogc2xsbCBycmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsbGwgcnJkLGltbTgiLDMyLDEzLAotMHgzOCwKLSNlbmRpZgotInNsbGwiLE9QQ19zbGxsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDl9LAotCi0KLS8qIDAwMTEgMTAxMSBzc3NzIDAxMTEgaW1tMTYgKioqIHNvdXQgaW1tMTYscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0IGltbTE2LHJzIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNvdXQiLE9QQ19zb3V0LDAse0NMQVNTX0lNTSsoQVJHX0lNTTE2KSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrNyxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzNTB9LAotCi0KLS8qIDAwMTEgMTAxMCBzc3NzIDAxMTEgaW1tMTYgKioqIHNvdXRiIGltbTE2LHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRiIGltbTE2LHJicyIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRiIixPUENfc291dGIsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMTYpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCs3LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDM1MX0sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBzb3V0ZCBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGQgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0ZCIsT1BDX3NvdXRkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNTJ9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDEwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogc291dGRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGRiIEByZCxAcnMscmJhIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGRiIixPUENfc291dGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNTN9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogc291dGliIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0aWIgQHJkLEBycyxyYSIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRpYiIsT1BDX3NvdXRpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM1NH0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBzb3V0aWJyIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0aWJyIEByZCxAcnMscmEiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGliciIsT1BDX3NvdXRpYnIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwzNTV9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDEwMDEgMTExMSAxMTExIG5pbTggKioqIHNyYSByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JhIHJkLGltbTgiLDE2LDEzLAotMHgzYywKLSNlbmRpZgotInNyYSIsT1BDX3NyYSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM1Nn0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTAwMSAwMDAwIDAwMDAgbmltOCAqKiogc3JhYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNyYWIgcmJkLGltbTgiLDgsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JhYiIsT1BDX3NyYWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM1N30sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTEwMSAxMTExIDExMTEgbmltOCAqKiogc3JhbCBycmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNyYWwgcnJkLGltbTgiLDMyLDEzLAotMHgzYywKLSNlbmRpZgotInNyYWwiLE9QQ19zcmFsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTh9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAwMDEgMTExMSAxMTExIG5pbTggKioqIHNybCByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JsIHJkLGltbTgiLDE2LDEzLAotMHgzYywKLSNlbmRpZgotInNybCIsT1BDX3NybCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM1OX0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDAwMSAwMDAwIDAwMDAgbmltOCAqKiogc3JsYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNybGIgcmJkLGltbTgiLDgsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JsYiIsT1BDX3NybGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM2MH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDEwMSAxMTExIDExMTEgbmltOCAqKiogc3JsbCBycmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNybGwgcnJkLGltbTgiLDMyLDEzLAotMHgzYywKLSNlbmRpZgotInNybGwiLE9QQ19zcmxsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzYxfSwKLQotCi0vKiAwMDAwIDAwMTEgc3NOMCBkZGRkICoqKiBzdWIgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLEBycyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNjJ9LAotCi0KLS8qIDAxMDAgMDAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YiByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM2M30sCi0KLQotLyogMDEwMCAwMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3ViIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM2NH0sCi0KLQotLyogMDAwMCAwMDExIDAwMDAgZGRkZCBpbW0xNiAqKiogc3ViIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLGltbTE2IiwxNiw3LAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDM2NX0sCi0KLQotLyogMTAwMCAwMDExIHNzc3MgZGRkZCAqKiogc3ViIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLHJzIiwxNiw0LAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNjZ9LAotCi0KLS8qIDAwMDAgMDAxMCBzc04wIGRkZGQgKioqIHN1YmIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLEBycyIsOCw3LAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzY3fSwKLQotCi0vKiAwMTAwIDAwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM2OH0sCi0KLQotLyogMDEwMCAwMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3ViYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzY5fSwKLQotCi0vKiAwMDAwIDAwMTAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogc3ViYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLGltbTgiLDgsNywKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMzcwfSwKLQotCi0vKiAxMDAwIDAwMTAgc3NzcyBkZGRkICoqKiBzdWJiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxyYnMiLDgsNCwKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNzF9LAotCi0KLS8qIDAwMDEgMDAxMCBzc04wIGRkZGQgKioqIHN1YmwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLEBycyIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNzJ9LAotCi0KLS8qIDAxMDEgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YmwgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQsYWRkcmVzc19zcmMiLDMyLDE1LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNzN9LAotCi0KLS8qIDAxMDEgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YmwgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTYsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNzR9LAotCi0KLS8qIDAwMDEgMDAxMCAwMDAwIGRkZGQgaW1tMzIgKioqIHN1YmwgcnJkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQsaW1tMzIiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMzc1fSwKLQotCi0vKiAxMDAxIDAwMTAgc3NzcyBkZGRkICoqKiBzdWJsIHJyZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxycnMiLDMyLDgsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzc2fSwKLQotCi0vKiAxMDEwIDExMTEgZGRkZCBjY2NjICoqKiB0Y2MgY2MscmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0Y2MgY2MscmQiLDE2LDUsCi0weDAwLAotI2VuZGlmCi0idGNjIixPUENfdGNjLDAse0NMQVNTX0NDLENMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCwwLDAsMCwwLH0sMiwyLDM3N30sCi0KLQotLyogMTAxMCAxMTEwIGRkZGQgY2NjYyAqKiogdGNjYiBjYyxyYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0Y2NiIGNjLHJiZCIsOCw1LAotMHgwMCwKLSNlbmRpZgotInRjY2IiLE9QQ190Y2NiLDAse0NMQVNTX0NDLENMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCwwLDAsMCwwLH0sMiwyLDM3OH0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDEwMCAqKiogdGVzdCBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0IEByZCIsMTYsOCwKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0IixPUENfdGVzdCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzNzl9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3QgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0IGFkZHJlc3NfZHN0IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJ0ZXN0IixPUENfdGVzdCwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4MH0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCAqKiogdGVzdCBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0IGFkZHJlc3NfZHN0KHJkKSIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0idGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzgxfSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAwMTAwICoqKiB0ZXN0IHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdCByZCIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJ0ZXN0IixPUENfdGVzdCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNCwwLDAsMCwwLDAsfSwxLDIsMzgyfSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMTAwICoqKiB0ZXN0YiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0YiBAcmQiLDgsOCwKLTB4MWMsCi0jZW5kaWYKLSJ0ZXN0YiIsT1BDX3Rlc3RiLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsMCwwLDAsMCwwLH0sMSwyLDM4M30sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDEwMCBhZGRyZXNzX2RzdCAqKiogdGVzdGIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0YiBhZGRyZXNzX2RzdCIsOCwxMSwKLTB4MWMsCi0jZW5kaWYKLSJ0ZXN0YiIsT1BDX3Rlc3RiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs0LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzg0fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMTAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0YiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0YiBhZGRyZXNzX2RzdChyZCkiLDgsMTIsCi0weDFjLAotI2VuZGlmCi0idGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODV9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDAxMDAgKioqIHRlc3RiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RiIHJiZCIsOCw3LAotMHgxYywKLSNlbmRpZgotInRlc3RiIixPUENfdGVzdGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsMCwwLDAsMCwwLH0sMSwyLDM4Nn0sCi0KLQotLyogMDAwMSAxMTAwIGRkTjAgMTAwMCAqKiogdGVzdGwgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGwgQHJkIiwzMiwxMywKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0bCIsT1BDX3Rlc3RsLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDM4N30sCi0KLQotLyogMDEwMSAxMTAwIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCAqKiogdGVzdGwgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0bCBhZGRyZXNzX2RzdCIsMzIsMTYsCi0weDE4LAotI2VuZGlmCi0idGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4OH0sCi0KLQotLyogMDEwMSAxMTAwIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCAqKiogdGVzdGwgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGwgYWRkcmVzc19kc3QocmQpIiwzMiwxNywKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0bCIsT1BDX3Rlc3RsLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4OX0sCi0KLQotLyogMTAwMSAxMTAwIGRkZGQgMTAwMCAqKiogdGVzdGwgcnJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGwgcnJkIiwzMiwxMywKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0bCIsT1BDX3Rlc3RsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiwzOTB9LAotCi0KLS8qIDEwMTEgMTAwMCBkZE4wIDEwMDAgMDAwMCBhYWFhIHNzTjAgMDAwMCAqKiogdHJkYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRyZGIgQHJkLEBycyxyYmEiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJkYiIsT1BDX3RyZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTF9LAotCi0KLS8qIDEwMTEgMTAwMCBkZE4wIDExMDAgMDAwMCBhYWFhIHNzTjAgMDAwMCAqKiogdHJkcmIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cmRyYiBAcmQsQHJzLHJiYSIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cmRyYiIsT1BDX3RyZHJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTJ9LAotCi0KLS8qIDEwMTEgMTAwMCBkZE4wIDAwMDAgMDAwMCBycnJyIHNzTjAgMDAwMCAqKiogdHJpYiBAcmQsQHJzLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRyaWIgQHJkLEBycyxyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJpYiIsT1BDX3RyaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTN9LAotCi0KLS8qIDEwMTEgMTAwMCBkZE4wIDAxMDAgMDAwMCBycnJyIHNzTjAgMDAwMCAqKiogdHJpcmIgQHJkLEBycyxyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cmlyYiBAcmQsQHJzLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cmlyYiIsT1BDX3RyaXJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzk0fSwKLQotCi0vKiAxMDExIDEwMDAgYWFOMCAxMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAgKioqIHRydGRiIEByYSxAcmIscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJ0ZGIgQHJhLEByYixyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJ0ZGIiLE9QQ190cnRkYiwwLHtDTEFTU19JUisoQVJHX1JBKSxDTEFTU19JUisoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkEpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkIpLENMQVNTX0JJVCswLDAsfSwzLDQsMzk1fSwKLQotCi0vKiAxMDExIDEwMDAgYWFOMCAxMTEwIDAwMDAgcnJyciBiYk4wIDExMTAgKioqIHRydGRyYiBAcmEsQHJiLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRydGRyYiBAcmEsQHJiLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cnRkcmIiLE9QQ190cnRkcmIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMHhlLDAsfSwzLDQsMzk2fSwKLQotCi0vKiAxMDExIDEwMDAgYWFOMCAwMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAgKioqIHRydGliIEByYSxAcmIscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJ0aWIgQHJhLEByYixyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJ0aWIiLE9QQ190cnRpYiwwLHtDTEFTU19JUisoQVJHX1JBKSxDTEFTU19JUisoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkEpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5N30sCi0KLQotLyogMTAxMSAxMDAwIGFhTjAgMDExMCAwMDAwIHJycnIgYmJOMCAxMTEwICoqKiB0cnRpcmIgQHJhLEByYixyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cnRpcmIgQHJhLEByYixyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJ0aXJiIixPUENfdHJ0aXJiLDAse0NMQVNTX0lSKyhBUkdfUkEpLENMQVNTX0lSKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SQSksQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkIpLENMQVNTX0JJVCsweGUsMCx9LDMsNCwzOTh9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAxMTAgKioqIHRzZXQgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldCBAcmQiLDE2LDExLAotMHgwOCwKLSNlbmRpZgotInRzZXQiLE9QQ190c2V0LDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzYsMCwwLDAsMCwwLH0sMSwyLDM5OX0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldCBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXQgYWRkcmVzc19kc3QiLDE2LDE0LAotMHgwOCwKLSNlbmRpZgotInRzZXQiLE9QQ190c2V0LDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDAwfSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMTEwIGFkZHJlc3NfZHN0ICoqKiB0c2V0IGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXQgYWRkcmVzc19kc3QocmQpIiwxNiwxNSwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzYsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MDF9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDAxMTAgKioqIHRzZXQgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0IHJkIiwxNiw3LAotMHgwOCwKLSNlbmRpZgotInRzZXQiLE9QQ190c2V0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiw0MDJ9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAxMTAgKioqIHRzZXRiIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXRiIEByZCIsOCwxMSwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0YiIsT1BDX3RzZXRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzYsMCwwLDAsMCwwLH0sMSwyLDQwM30sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldGIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0YiBhZGRyZXNzX2RzdCIsOCwxNCwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0YiIsT1BDX3RzZXRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDA0fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMTEwIGFkZHJlc3NfZHN0ICoqKiB0c2V0YiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0YiBhZGRyZXNzX2RzdChyZCkiLDgsMTUsCi0weDA4LAotI2VuZGlmCi0idHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzYsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MDV9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDAxMTAgKioqIHRzZXRiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXRiIHJiZCIsOCw3LAotMHgwOCwKLSNlbmRpZgotInRzZXRiIixPUENfdHNldGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzYsMCwwLDAsMCwwLH0sMSwyLDQwNn0sCi0KLQotLyogMDAwMCAxMDAxIHNzTjAgZGRkZCAqKiogeG9yIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxAcnMiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDA3fSwKLQotCi0vKiAwMTAwIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3IgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0MDh9LAotCi0KLS8qIDAxMDAgMTAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHhvciByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0MDl9LAotCi0KLS8qIDAwMDAgMTAwMSAwMDAwIGRkZGQgaW1tMTYgKioqIHhvciByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxpbW0xNiIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCw0MTB9LAotCi0KLS8qIDEwMDAgMTAwMSBzc3NzIGRkZGQgKioqIHhvciByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxycyIsMTYsNCwKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDExfSwKLQotCi0vKiAwMDAwIDEwMDAgc3NOMCBkZGRkICoqKiB4b3JiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxAcnMiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxMn0sCi0KLQotLyogMDEwMCAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogeG9yYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0MTN9LAotCi0KLS8qIDAxMDAgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHhvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDQxNH0sCi0KLQotLyogMDAwMCAxMDAwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIHhvcmIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxpbW04Iiw4LDcsCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDQxNX0sCi0KLQotLyogMTAwMCAxMDAwIHNzc3MgZGRkZCAqKiogeG9yYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQscmJzIiw4LDQsCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDE2fSwKLQotCi0vKiAxMDAwIDEwMDAgc3NzcyBkZGRkICoqKiB4b3JiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxyYnMiLDgsNCwKLTB4MDEsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrOCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MTd9LAotMCwwfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy96OGtnZW4uYyBiL29wY29kZXMvejhrZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODZiYmIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy96OGtnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEzMTMgKzAsMCBAQAotLyoKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIHByb2dyYW0gZ2VuZXJhdGVzIHo4ay1vcGMuaCAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBCWVRFX0lORk9fTEVOIDEwCi0KLXN0cnVjdCBvcAotewotICBjaGFyICpmbGFnczsKLSAgaW50IGN5Y2xlczsKLSAgY2hhciB0eXBlOwotICBjaGFyICpiaXRzOwotICBjaGFyICpuYW1lOwotICBjaGFyICpmbGF2b3I7Ci19OwotCi0jZGVmaW5lIGlzd2hpdGUoeCkgKCh4KSA9PSAnICcgfHwgKHgpID09ICdcdCcpCi1zdHJ1Y3Qgb3Agb3B0W10gPQotewotICAiLS0tLS0tIiwgMTAsIDgsICIwMDAwIDExMTAgaW1tOCIsICJleHQwZSBpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDAwMCAxMTExIGltbTgiLCAiZXh0MGYgaW1tOCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMDAgMTExMCBpbW04IiwgImV4dDhlIGltbTgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIxMDAwIDExMTEgaW1tOCIsICJleHQ4ZiBpbW04IiwgMCwKLQotICAiLS0tLS0tIiwgMTAsIDgsICIwMDExIDAxMTAgaW1tOCIsICJyc3ZkMzYiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMDExIDEwMDAgaW1tOCIsICJyc3ZkMzgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMTExIDEwMDAgaW1tOCIsICJyc3ZkNzgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMTExIDExMTAgaW1tOCIsICJyc3ZkN2UiLCAwLAotCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMDEgMTEwMSBpbW04IiwgInJzdmQ5ZCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMDEgMTExMSBpbW04IiwgInJzdmQ5ZiIsIDAsCi0KLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAxMSAxMDAxIGltbTgiLCAicnN2ZGI5IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAxMSAxMTExIGltbTgiLCAicnN2ZGJmIiwgMCwKLQotICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkZCBAcnMsQHJkLHJyIiwgMCwKLSAgIi0tLVYtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGRyIEBycyxAcmQscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRkcmIgQHJzLEByZCxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRpciBAcmQsQHJzLHJyIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGkgcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGlyIHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BkciByZCxAcnMscnIsY2MiLCAwLAotICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkaSBAcmQsQHJzLHJyIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGQgcmQsQHJzLHJyLGNjIiwgMCwKLSAgIi0tLVYtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAwMDAwIiwgImxkaXJiIEByZCxAcnMscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRkYiBAcnMsQHJkLHJyIiwgMCwKLSAgIi0tLVYtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkaWIgQHJkLEBycyxyciIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGRiIHJiZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BkcmIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGliIHJiZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BpcmIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZCBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2RiIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2RyIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZHJiIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2kgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNpYiBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAxMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNpciBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2lyYiBAcmQsQHJzLHJyLGNjIiwgMCwKLQotICAiLS0tLS0tIiwgMiwgOCwgIjAwMTEgMDExMCAwMDAwIDAwMDAiLCAiYnB0IiwgMCwKLSAgIkNaU1YtLSIsIDUsIDE2LCAiMTAxMSAwMTAxIHNzc3MgZGRkZCIsICJhZGMgcmQscnMiLCAwLAotICAiQ1pTVkRIIiwgNSwgOCwgIjEwMTEgMDEwMCBzc3NzIGRkZGQiLCAiYWRjYiByYmQscmJzIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDAxIHNzTjAgZGRkZCIsICJhZGQgcmQsQHJzIiwgMCwKLSJDWlNWLS0iLCA5LCAxNiwgIjAxMDAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDEwLCAxNiwgIjAxMDAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMDAwMSAwMDAwIGRkZGQgaW1tMTYiLCAiYWRkIHJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDQsIDE2LCAiMTAwMCAwMDAxIHNzc3MgZGRkZCIsICJhZGQgcmQscnMiLCAwLAotICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAwMCBzc04wIGRkZGQiLCAiYWRkYiByYmQsQHJzIiwgMCwKLSJDWlNWREgiLCA5LCA4LCAiMDEwMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWREgiLCAxMCwgOCwgIjAxMDAgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMDAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJhZGRiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1ZESCIsIDQsIDgsICIxMDAwIDAwMDAgc3NzcyBkZGRkIiwgImFkZGIgcmJkLHJicyIsIDAsCi0gICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAxMTAgc3NOMCBkZGRkIiwgImFkZGwgcnJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMzIsICIwMTAxIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZGwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDE2LCAzMiwgIjAxMDEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkbCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDExMCAwMDAwIGRkZGQgaW1tMzIiLCAiYWRkbCBycmQsaW1tMzIiLCAwLAotICAiQ1pTVi0tIiwgOCwgMzIsICIxMDAxIDAxMTAgc3NzcyBkZGRkIiwgImFkZGwgcnJkLHJycyIsIDAsCi0KLSAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTExIHNzTjAgZGRkZCIsICJhbmQgcmQsQHJzIiwgMCwKLSItWlMtLS0iLCA5LCAxNiwgIjAxMDAgMDExMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi1aUy0tLSIsIDEwLCAxNiwgIjAxMDAgMDExMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDExMSAwMDAwIGRkZGQgaW1tMTYiLCAiYW5kIHJkLGltbTE2IiwgMCwKLSAgIi1aUy0tLSIsIDQsIDE2LCAiMTAwMCAwMTExIHNzc3MgZGRkZCIsICJhbmQgcmQscnMiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMDExMCBzc04wIGRkZGQiLCAiYW5kYiByYmQsQHJzIiwgMCwKLSItWlNQLS0iLCA5LCA4LCAiMDEwMCAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmRiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItWlNQLS0iLCAxMCwgOCwgIjAxMDAgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDAxMTAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJhbmRiIHJiZCxpbW04IiwgMCwKLSAgIi1aU1AtLSIsIDQsIDgsICIxMDAwIDAxMTAgc3NzcyBkZGRkIiwgImFuZGIgcmJkLHJicyIsIDAsCi0KLSAgIi1aLS0tLSIsIDgsIDE2LCAiMDAxMCAwMTExIGRkTjAgaW1tNCIsICJiaXQgQHJkLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTEsIDE2LCAiMDExMCAwMTExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXQgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTAsIDE2LCAiMDExMCAwMTExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXQgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItWi0tLS0iLCA0LCAxNiwgIjEwMTAgMDExMSBkZGRkIGltbTQiLCAiYml0IHJkLGltbTQiLCAwLAotIi1aLS0tLSIsIDEwLCAxNiwgIjAwMTAgMDExMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJiaXQgcmQscnMiLCAwLAotCi0gICItWi0tLS0iLCA4LCA4LCAiMDAxMCAwMTEwIGRkTjAgaW1tNCIsICJiaXRiIEByZCxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDExLCA4LCAiMDExMCAwMTEwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDEwLCA4LCAiMDExMCAwMTEwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXRiIGFkZHJlc3NfZHN0LGltbTQiLCAwLAotICAiLVotLS0tIiwgNCwgOCwgIjEwMTAgMDExMCBkZGRkIGltbTQiLCAiYml0YiByYmQsaW1tNCIsIDAsCi0iLVotLS0tIiwgMTAsIDgsICIwMDEwIDAxMTAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAiYml0YiByYmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAxMCwgMzIsICIwMDAxIDExMTEgZGROMCAwMDAwIiwgImNhbGwgQHJkIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjAxMDEgMTExMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QiLCAiY2FsbCBhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCAxMywgMzIsICIwMTAxIDExMTEgZGROMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNhbGwgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjExMDEgZGlzcDEyIiwgImNhbHIgZGlzcDEyIiwgMCwKLQotICAiLS0tLS0tIiwgOCwgMTYsICIwMDAwIDExMDEgZGROMCAxMDAwIiwgImNsciBAcmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCIsICJjbHIgYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCIsICJjbHIgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMTAwMCIsICJjbHIgcmQiLCAwLAotICAiLS0tLS0tIiwgOCwgOCwgIjAwMDAgMTEwMCBkZE4wIDEwMDAiLCAiY2xyYiBAcmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDgsICIwMTAwIDExMDAgMDAwMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNscmIgYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgMTIsIDgsICIwMTAwIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNscmIgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAxMDAwIiwgImNscmIgcmJkIiwgMCwKLSAgIi1aUy0tLSIsIDEyLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAwMDAiLCAiY29tIEByZCIsIDAsCi0gICItWlMtLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgMDAwMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbSBhZGRyZXNzX2RzdCIsIDAsCi0gICItWlMtLS0iLCAxNiwgMTYsICIwMTAwIDExMDEgZGROMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbSBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLVpTLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMDAwIiwgImNvbSByZCIsIDAsCi0gICItWlNQLS0iLCAxMiwgOCwgIjAwMDAgMTEwMCBkZE4wIDAwMDAiLCAiY29tYiBAcmQiLCAwLAotICAiLVpTUC0tIiwgMTUsIDgsICIwMTAwIDExMDAgMDAwMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbWIgYWRkcmVzc19kc3QiLCAwLAotICAiLVpTUC0tIiwgMTYsIDgsICIwMTAwIDExMDAgZGROMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbWIgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi1aU1AtLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAwMDAwIiwgImNvbWIgcmJkIiwgMCwKLSAgIkNaU1AtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGltbTQgMDEwMSIsICJjb21mbGcgZmxhZ3MiLCAwLAotCi0gICJDWlNWLS0iLCAxMSwgMTYsICIwMDAwIDExMDEgZGROMCAwMDAxIGltbTE2IiwgImNwIEByZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImNwIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCAxNCwgMTYsICIwMTAwIDExMDEgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImNwIGFkZHJlc3NfZHN0LGltbTE2IiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDEwMTEgc3NOMCBkZGRkIiwgImNwIHJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCA5LCAxNiwgIjAxMDAgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiY3AgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTAsIDE2LCAiMDEwMCAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDEwMTEgMDAwMCBkZGRkIGltbTE2IiwgImNwIHJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDQsIDE2LCAiMTAwMCAxMDExIHNzc3MgZGRkZCIsICJjcCByZCxycyIsIDAsCi0KLSAgIkNaU1YtLSIsIDExLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDAwMSBpbW04IGltbTgiLCAiY3BiIEByZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDE1LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAiY3BiIGFkZHJlc3NfZHN0KHJkKSxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDE0LCA4LCAiMDEwMCAxMTAwIDAwMDAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAiY3BiIGFkZHJlc3NfZHN0LGltbTgiLCAwLAotICAiQ1pTVi0tIiwgNywgOCwgIjAwMDAgMTAxMCBzc04wIGRkZGQiLCAiY3BiIHJiZCxAcnMiLCAwLAotIkNaU1YtLSIsIDksIDgsICIwMTAwIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTAsIDgsICIwMTAwIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDgsICIwMDAwIDEwMTAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJjcGIgcmJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgNCwgOCwgIjEwMDAgMTAxMCBzc3NzIGRkZGQiLCAiY3BiIHJiZCxyYnMiLCAwLAotCi0gICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAwMDAgc3NOMCBkZGRkIiwgImNwbCBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjAxMDEgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BsIHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxNiwgMzIsICIwMTAxIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwbCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAwMCAwMDAwIGRkZGQgaW1tMzIiLCAiY3BsIHJyZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA4LCAzMiwgIjEwMDEgMDAwMCBzc3NzIGRkZGQiLCAiY3BsIHJyZCxycnMiLCAwLAotCi0gICJDWlMtLS0iLCA1LCA4LCAiMTAxMSAwMDAwIGRkZGQgMDAwMCIsICJkYWIgcmJkIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAxNiwgIjExMTEgZGRkZCAxZGlzcDciLCAiZGJqbnogcmJkLGRpc3A3IiwgMCwKLSAgIi1aU1YtLSIsIDExLCAxNiwgIjAwMTAgMTAxMSBkZE4wIGltbTRtMSIsICJkZWMgQHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxNCwgMTYsICIwMTEwIDEwMTEgZGROMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTMsIDE2LCAiMDExMCAxMDExIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImRlYyBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgNCwgMTYsICIxMDEwIDEwMTEgZGRkZCBpbW00bTEiLCAiZGVjIHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMSwgOCwgIjAwMTAgMTAxMCBkZE4wIGltbTRtMSIsICJkZWNiIEByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTQsIDgsICIwMTEwIDEwMTAgZGROMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDEzLCA4LCAiMDExMCAxMDEwIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImRlY2IgYWRkcmVzc19kc3QsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDQsIDgsICIxMDEwIDEwMTAgZGRkZCBpbW00bTEiLCAiZGVjYiByYmQsaW1tNG0xIiwgMCwKLQotICAiLS0tLS0tIiwgNywgMTYsICIwMTExIDExMDAgMDAwMCAwMGlpIiwgImRpIGkyIiwgMCwKLSAgIkNaU1YtLSIsIDEwNywgMTYsICIwMDAxIDEwMTEgc3NOMCBkZGRkIiwgImRpdiBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDEwNywgMTYsICIwMTAxIDEwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdiBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAxMDEgMTAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiZGl2IHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAwMDEgMTAxMSAwMDAwIGRkZGQgaW1tMTYiLCAiZGl2IHJyZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMTAwMSAxMDExIHNzc3MgZGRkZCIsICJkaXYgcnJkLHJzIiwgMCwKLSAgIkNaU1YtLSIsIDc0NCwgMzIsICIwMDAxIDEwMTAgc3NOMCBkZGRkIiwgImRpdmwgcnFkLEBycyIsIDAsCi0gICJDWlNWLS0iLCA3NDUsIDMyLCAiMDEwMSAxMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXZsIHJxZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCA3NDYsIDMyLCAiMDEwMSAxMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXZsIHJxZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNzQ0LCAzMiwgIjAwMDEgMTAxMCAwMDAwIGRkZGQgaW1tMzIiLCAiZGl2bCBycWQsaW1tMzIiLCAwLAotICAiQ1pTVi0tIiwgNzQ0LCAzMiwgIjEwMDEgMTAxMCBzc3NzIGRkZGQiLCAiZGl2bCBycWQscnJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMTExMSBkZGRkIDBkaXNwNyIsICJkam56IHJkLGRpc3A3IiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDExMSAxMTAwIDAwMDAgMDFpaSIsICJlaSBpMiIsIDAsCi0gICItLS0tLS0iLCA2LCAxNiwgIjEwMTAgMTEwMSBzc3NzIGRkZGQiLCAiZXggcmQscnMiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAxMCAxMTAxIHNzTjAgZGRkZCIsICJleCByZCxAcnMiLCAwLAotIi0tLS0tLSIsIDE1LCAxNiwgIjAxMTAgMTEwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiZXggcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDE2LCAiMDExMCAxMTAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJleCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotCi0gICItLS0tLS0iLCAxMiwgOCwgIjAwMTAgMTEwMCBzc04wIGRkZGQiLCAiZXhiIHJiZCxAcnMiLCAwLAotIi0tLS0tLSIsIDE1LCA4LCAiMDExMCAxMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJleGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDE2LCA4LCAiMDExMCAxMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJleGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCA2LCA4LCAiMTAxMCAxMTAwIHNzc3MgZGRkZCIsICJleGIgcmJkLHJicyIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCAxNiwgIjEwMTEgMDAwMSBkZGRkIDEwMTAiLCAiZXh0cyBycmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDgsICIxMDExIDAwMDEgZGRkZCAwMDAwIiwgImV4dHNiIHJkIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAzMiwgIjEwMTEgMDAwMSBkZGRkIDAxMTEiLCAiZXh0c2wgcnFkIiwgMCwKLQotICAiLS0tLS0tIiwgOCwgMTYsICIwMTExIDEwMTAgMDAwMCAwMDAwIiwgImhhbHQiLCAwLAotICAiLS0tLS0tIiwgMTAsIDE2LCAiMDAxMSAxMTAxIHNzTjAgZGRkZCIsICJpbiByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAxMSAxMTAxIGRkZGQgMDEwMCBpbW0xNiIsICJpbiByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCAxMiwgOCwgIjAwMTEgMTEwMCBzc04wIGRkZGQiLCAiaW5iIHJiZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMDExIDExMDAgZGRkZCAwMTAwIGltbTE2IiwgImluYiByYmQsaW1tMTYiLCAwLAotICAiLVpTVi0tIiwgMTEsIDE2LCAiMDAxMCAxMDAxIGRkTjAgaW1tNG0xIiwgImluYyBAcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDE0LCAxNiwgIjAxMTAgMTAwMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMywgMTYsICIwMTEwIDEwMDEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiaW5jIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCA0LCAxNiwgIjEwMTAgMTAwMSBkZGRkIGltbTRtMSIsICJpbmMgcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDExLCA4LCAiMDAxMCAxMDAwIGRkTjAgaW1tNG0xIiwgImluY2IgQHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxNCwgOCwgIjAxMTAgMTAwMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTMsIDgsICIwMTEwIDEwMDAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiaW5jYiBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgNCwgOCwgIjEwMTAgMTAwMCBkZGRkIGltbTRtMSIsICJpbmNiIHJiZCxpbW00bTEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgImluZCBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLVYtLSIsIDIxLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgImluZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDgsICIwMDExIDExMDAgc3NOMCAwMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAiaW5pYiBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLVYtLSIsIDIxLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJpbmliciBAcmQsQHJzLHJhIiwgMCwKLSAgIkNaU1ZESCIsIDEzLCAxNiwgIjAxMTEgMTAxMSAwMDAwIDAwMDAiLCAiaXJldCIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIwMDAxIDExMTAgZGROMCBjY2NjIiwgImpwIGNjLEByZCIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjAxMDEgMTExMCAwMDAwIGNjY2MgYWRkcmVzc19kc3QiLCAianAgY2MsYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgOCwgMTYsICIwMTAxIDExMTAgZGROMCBjY2NjIGFkZHJlc3NfZHN0IiwgImpwIGNjLGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLS0tLS0iLCA2LCAxNiwgIjExMTAgY2NjYyBkaXNwOCIsICJqciBjYyxkaXNwOCIsIDAsCi0KLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDEwMSBpbW0xNiIsICJsZCBAcmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgOCwgMTYsICIwMDEwIDExMTEgZGROMCBzc3NzIiwgImxkIEByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgZGROMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImxkIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMTEwIDExMTEgZGROMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkIGFkZHJlc3NfZHN0KHJkKSxycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAwIDExMDEgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImxkIGFkZHJlc3NfZHN0LGltbTE2IiwgMCwKLSItLS0tLS0iLCAxMSwgMTYsICIwMTEwIDExMTEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkIGFkZHJlc3NfZHN0LHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAxMSBkZE4wIHNzc3MgaW1tMTYiLCAibGQgcmQoaW1tMTYpLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTEgMDAxMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZCByZChyeCkscnMiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIwMDEwIDAwMDEgc3NOMCBkZGRkIiwgImxkIHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCA5LCAxNiwgIjAxMTAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibGQgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTAsIDE2LCAiMDExMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIwMDEwIDAwMDEgMDAwMCBkZGRkIGltbTE2IiwgImxkIHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDMsIDE2LCAiMTAxMCAwMDAxIHNzc3MgZGRkZCIsICJsZCByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMDExIDAwMDEgc3NOMCBkZGRkIGltbTE2IiwgImxkIHJkLHJzKGltbTE2KSIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTExIDAwMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGQgcmQscnMocngpIiwgMCwKLQotICAiLS0tLS0tIiwgNywgOCwgIjAwMDAgMTEwMCBkZE4wIDAxMDEgaW1tOCBpbW04IiwgImxkYiBAcmQsaW1tOCIsIDAsCi0gICItLS0tLS0iLCA4LCA4LCAiMDAxMCAxMTEwIGRkTjAgc3NzcyIsICJsZGIgQHJkLHJicyIsIDAsCi0gICItLS0tLS0iLCAxNSwgOCwgIjAxMDAgMTEwMCBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04IiwgImxkYiBhZGRyZXNzX2RzdChyZCksaW1tOCIsIDAsCi0gICItLS0tLS0iLCAxMiwgOCwgIjAxMDAgMTExMCBkZE4wIHNzTjAgYWRkcmVzc19kc3QiLCAibGRiIGFkZHJlc3NfZHN0KHJkKSxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTAwIDExMDAgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJsZGIgYWRkcmVzc19kc3QsaW1tOCIsIDAsCi0iLS0tLS0tIiwgMTEsIDgsICIwMTEwIDExMTAgMDAwMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkYiBhZGRyZXNzX2RzdCxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMDExIDAwMTAgZGROMCBzc3NzIGltbTE2IiwgImxkYiByZChpbW0xNikscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDExMSAwMDEwIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkYiByZChyeCkscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDgsICIwMDEwIDAwMDAgc3NOMCBkZGRkIiwgImxkYiByYmQsQHJzIiwgMCwKLSItLS0tLS0iLCA5LCA4LCAiMDExMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDExMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCA1LCA4LCAiMTEwMCBkZGRkIGltbTgiLCAibGRiIHJiZCxpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDMsIDgsICIxMDEwIDAwMDAgc3NzcyBkZGRkIiwgImxkYiByYmQscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDAwIHNzTjAgZGRkZCBpbW0xNiIsICJsZGIgcmJkLHJzKGltbTE2KSIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMTEgMDAwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGIgcmJkLHJzKHJ4KSIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCAzMiwgIjAwMDEgMTEwMSBkZE4wIHNzc3MiLCAibGRsIEByZCxycnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDMyLCAiMDEwMSAxMTAxIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCIsICJsZGwgYWRkcmVzc19kc3QocmQpLHJycyIsIDAsCi0gICItLS0tLS0iLCAxNSwgMzIsICIwMTAxIDExMDEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkbCBhZGRyZXNzX2RzdCxycnMiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTExIGRkTjAgc3NzcyBpbW0xNiIsICJsZGwgcmQoaW1tMTYpLHJycyIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMTExIDAxMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRsIHJkKHJ4KSxycnMiLCAwLAotICAiLS0tLS0tIiwgMTEsIDMyLCAiMDAwMSAwMTAwIHNzTjAgZGRkZCIsICJsZGwgcnJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMzIsICIwMTAxIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkbCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTMsIDMyLCAiMDEwMSAwMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCAxMSwgMzIsICIwMDAxIDAxMDAgMDAwMCBkZGRkIGltbTMyIiwgImxkbCBycmQsaW1tMzIiLCAwLAotICAiLS0tLS0tIiwgNSwgMzIsICIxMDAxIDAxMDAgc3NzcyBkZGRkIiwgImxkbCBycmQscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAwMTEgMDEwMSBzc04wIGRkZGQgaW1tMTYiLCAibGRsIHJyZCxycyhpbW0xNikiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDExMSAwMTAxIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkbCBycmQscnMocngpIiwgMCwKLQotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDExMSAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGEgcHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDEzLCAxNiwgIjAxMTEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibGRhIHByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDAxMSAwMTAwIHNzTjAgZGRkZCBpbW0xNiIsICJsZGEgcHJkLHJzKGltbTE2KSIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMTExIDAxMDAgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRhIHByZCxycyhyeCkiLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDAxMSAwMTAwIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRhciBwcmQsZGlzcDE2IiwgMCwKLSAgIi0tLS0tLSIsIDcsIDMyLCAiMDExMSAxMTAxIHNzc3MgMWNjYyIsICJsZGN0bCBjdHJsLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDMyLCAiMDExMSAxMTAxIGRkZGQgMGNjYyIsICJsZGN0bCByZCxjdHJsIiwgMCwKLQotICAiLS0tLS0tIiwgNSwgMTYsICIxMDExIDExMDEgZGRkZCBpbW00IiwgImxkayByZCxpbW00IiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAwMSAxMTAwIGRkTjAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIiwgImxkbSBAcmQscnMsbiIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMTAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NOMCAwMDAwIG5taW51czEgYWRkcmVzc19kc3QiLCAibGRtIGFkZHJlc3NfZHN0KHJkKSxycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDEgMTEwMCAwMDAwIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCIsICJsZG0gYWRkcmVzc19kc3QscnMsbiIsIDAsCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMDAxIDExMDAgc3NOMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEiLCAibGRtIHJkLEBycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSBhZGRyZXNzX3NyYyIsICJsZG0gcmQsYWRkcmVzc19zcmMocnMpLG4iLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAxMTAwIDAwMDAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjIiwgImxkbSByZCxhZGRyZXNzX3NyYyxuIiwgMCwKLQotICAiQ1pTVkRIIiwgMTIsIDE2LCAiMDAxMSAxMDAxIHNzTjAgMDAwMCIsICJsZHBzIEBycyIsIDAsCi0gICJDWlNWREgiLCAxNiwgMTYsICIwMTExIDEwMDEgMDAwMCAwMDAwIGFkZHJlc3Nfc3JjIiwgImxkcHMgYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVkRIIiwgMTcsIDE2LCAiMDExMSAxMDAxIHNzTjAgMDAwMCBhZGRyZXNzX3NyYyIsICJsZHBzIGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0KLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAxMSAwMDAwIHNzc3MgZGlzcDE2IiwgImxkciBkaXNwMTYscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDAxIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRyIHJkLGRpc3AxNiIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAxMCAwMDAwIHNzc3MgZGlzcDE2IiwgImxkcmIgZGlzcDE2LHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAwMCAwMDAwIGRkZGQgZGlzcDE2IiwgImxkcmIgcmJkLGRpc3AxNiIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMTEgMDAwMCBzc3NzIGRpc3AxNiIsICJsZHJsIGRpc3AxNixycnMiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTAxIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRybCBycmQsZGlzcDE2IiwgMCwKLQotICAiQ1pTLS0tIiwgNywgMTYsICIwMTExIDEwMTEgMDAwMCAxMDEwIiwgIm1iaXQiLCAwLAotICAiLVpTLS0tIiwgMTIsIDE2LCAiMDExMSAxMDExIGRkZGQgMTEwMSIsICJtcmVxIHJkIiwgMCwKLSAgIi0tLS0tLSIsIDUsIDE2LCAiMDExMSAxMDExIDAwMDAgMTAwMSIsICJtcmVzIiwgMCwKLSAgIi0tLS0tLSIsIDUsIDE2LCAiMDExMSAxMDExIDAwMDAgMTAwMCIsICJtc2V0IiwgMCwKLQotICAiQ1pTVi0tIiwgNzAsIDE2LCAiMDAwMSAxMDAxIHNzTjAgZGRkZCIsICJtdWx0IHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgNzAsIDE2LCAiMDEwMSAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0IHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMTAxIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHQgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMDAxIDEwMDEgMDAwMCBkZGRkIGltbTE2IiwgIm11bHQgcnJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjEwMDEgMTAwMSBzc3NzIGRkZGQiLCAibXVsdCBycmQscnMiLCAwLAotICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjAwMDEgMTAwMCBzc04wIGRkZGQiLCAibXVsdGwgcnFkLEBycyIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDEwMSAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0bCBycWQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjAxMDEgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibXVsdGwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDAwMSAxMDAwIDAwMDAgZGRkZCBpbW0zMiIsICJtdWx0bCBycWQsaW1tMzIiLCAwLAotICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjEwMDEgMTAwMCBzc3NzIGRkZGQiLCAibXVsdGwgcnFkLHJycyIsIDAsCi0gICJDWlNWLS0iLCAxMiwgMTYsICIwMDAwIDExMDEgZGROMCAwMDEwIiwgIm5lZyBAcmQiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWcgYWRkcmVzc19kc3QiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWcgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMDAxMCIsICJuZWcgcmQiLCAwLAotICAiQ1pTVi0tIiwgMTIsIDgsICIwMDAwIDExMDAgZGROMCAwMDEwIiwgIm5lZ2IgQHJkIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCA4LCAiMDEwMCAxMTAwIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWdiIGFkZHJlc3NfZHN0IiwgMCwKLSAgIkNaU1YtLSIsIDE2LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWdiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICJDWlNWLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDAxMCIsICJuZWdiIHJiZCIsIDAsCi0KLSAgIi0tLS0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIDAwMDAgMDExMSIsICJub3AiLCAwLAotCi0gICJDWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDEwMSBzc04wIGRkZGQiLCAib3IgcmQsQHJzIiwgMCwKLSAgIkNaUy0tLSIsIDksIDE2LCAiMDEwMCAwMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJvciByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlMtLS0iLCAxMCwgMTYsICIwMTAwIDAxMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDEwMSAwMDAwIGRkZGQgaW1tMTYiLCAib3IgcmQsaW1tMTYiLCAwLAotICAiQ1pTLS0tIiwgNCwgMTYsICIxMDAwIDAxMDEgc3NzcyBkZGRkIiwgIm9yIHJkLHJzIiwgMCwKLQotICAiQ1pTUC0tIiwgNywgOCwgIjAwMDAgMDEwMCBzc04wIGRkZGQiLCAib3JiIHJiZCxAcnMiLCAwLAotIkNaU1AtLSIsIDksIDgsICIwMTAwIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTUC0tIiwgMTAsIDgsICIwMTAwIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1AtLSIsIDcsIDgsICIwMDAwIDAxMDAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJvcmIgcmJkLGltbTgiLCAwLAotICAiQ1pTUC0tIiwgNCwgOCwgIjEwMDAgMDEwMCBzc3NzIGRkZGQiLCAib3JiIHJiZCxyYnMiLCAwLAotCi0gICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTExMSBkZE4wIHNzc3MiLCAib3V0IEByZCxycyIsIDAsCi0gICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc3NzIDAxMTAgaW1tMTYiLCAib3V0IGltbTE2LHJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDExMTAgZGROMCBzc3NzIiwgIm91dGIgQHJkLHJicyIsIDAsCi0gICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzc3MgMDExMCBpbW0xNiIsICJvdXRiIGltbTE2LHJicyIsIDAsCi0gICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJvdXRkIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJvdXRkYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgIm91dGliIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMCwgMTYsICIwMDExIDExMDAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDAwMDAiLCAib3V0aWJyIEByZCxAcnMscmEiLCAwLAotCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDAxIDAxMTEgc3NOMCBkZE4wIiwgInBvcCBAcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE2LCAxNiwgIjAxMDEgMDExMSBzc04wIGRkTjAgYWRkcmVzc19kc3QiLCAicG9wIGFkZHJlc3NfZHN0KHJkKSxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDE2LCAiMDEwMSAwMTExIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCIsICJwb3AgYWRkcmVzc19kc3QsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDgsIDE2LCAiMTAwMSAwMTExIHNzTjAgZGRkZCIsICJwb3AgcmQsQHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTksIDMyLCAiMDAwMSAwMTAxIHNzTjAgZGROMCIsICJwb3BsIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMjMsIDMyLCAiMDEwMSAwMTAxIHNzTjAgZGROMCBhZGRyZXNzX2RzdCIsICJwb3BsIGFkZHJlc3NfZHN0KHJkKSxAcnMiLCAwLAotICAiLS0tLS0tIiwgMjMsIDMyLCAiMDEwMSAwMTAxIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCIsICJwb3BsIGFkZHJlc3NfZHN0LEBycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMzIsICIxMDAxIDAxMDEgc3NOMCBkZGRkIiwgInBvcGwgcnJkLEBycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDEzLCAxNiwgIjAwMDEgMDAxMSBkZE4wIHNzTjAiLCAicHVzaCBAcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDEgMDAxMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMiLCAicHVzaCBAcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAwMDExIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyIsICJwdXNoIEByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMTAwMSBpbW0xNiIsICJwdXNoIEByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCA5LCAxNiwgIjEwMDEgMDAxMSBkZE4wIHNzc3MiLCAicHVzaCBAcmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAyMCwgMzIsICIwMDAxIDAwMDEgZGROMCBzc04wIiwgInB1c2hsIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMjEsIDMyLCAiMDEwMSAwMDAxIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyIsICJwdXNobCBAcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDIxLCAzMiwgIjAxMDEgMDAwMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMiLCAicHVzaGwgQHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjEwMDEgMDAwMSBkZE4wIHNzc3MiLCAicHVzaGwgQHJkLHJycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCAxNiwgIjAwMTAgMDAxMSBkZE4wIGltbTQiLCAicmVzIEByZCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTAgMDAxMSBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAicmVzIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDEzLCAxNiwgIjAxMTAgMDAxMSAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAicmVzIGFkZHJlc3NfZHN0LGltbTQiLCAwLAotICAiLS0tLS0tIiwgNCwgMTYsICIxMDEwIDAwMTEgZGRkZCBpbW00IiwgInJlcyByZCxpbW00IiwgMCwKLSItLS0tLS0iLCAxMCwgMTYsICIwMDEwIDAwMTEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAicmVzIHJkLHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDgsICIwMDEwIDAwMTAgZGROMCBpbW00IiwgInJlc2IgQHJkLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTEwIDAwMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInJlc2IgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTMsIDgsICIwMTEwIDAwMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInJlc2IgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItLS0tLS0iLCA0LCA4LCAiMTAxMCAwMDEwIGRkZGQgaW1tNCIsICJyZXNiIHJiZCxpbW00IiwgMCwKLSItLS0tLS0iLCAxMCwgOCwgIjAwMTAgMDAxMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJyZXNiIHJiZCxycyIsIDAsCi0KLSAgIkNaU1YtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGltbTQgMDAxMSIsICJyZXNmbGcgaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIxMDAxIDExMTAgMDAwMCBjY2NjIiwgInJldCBjYyIsIDAsCi0KLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDBJMCIsICJybCByZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDgsICIxMDExIDAwMTAgZGRkZCAwMEkwIiwgInJsYiByYmQsaW1tMW9yMiIsIDAsCi0gICJDWlNWLS0iLCA2LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwSTAiLCAicmxjIHJkLGltbTFvcjIiLCAwLAotCi0gICItWi0tLS0iLCA5LCA4LCAiMTAxMSAwMDEwIGRkZGQgMTBJMCIsICJybGNiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDExMTAgYWFhYSBiYmJiIiwgInJsZGIgcmJiLHJiYSIsIDAsCi0KLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDFJMCIsICJyciByZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDgsICIxMDExIDAwMTAgZGRkZCAwMUkwIiwgInJyYiByYmQsaW1tMW9yMiIsIDAsCi0gICJDWlNWLS0iLCA2LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDExSTAiLCAicnJjIHJkLGltbTFvcjIiLCAwLAotCi0gICItWi0tLS0iLCA5LCA4LCAiMTAxMSAwMDEwIGRkZGQgMTFJMCIsICJycmNiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDExMDAgYWFhYSBiYmJiIiwgInJyZGIgcmJiLHJiYSIsIDAsCi0gICJDWlNWLS0iLCA1LCAxNiwgIjEwMTEgMDExMSBzc3NzIGRkZGQiLCAic2JjIHJkLHJzIiwgMCwKLSAgIkNaU1ZESCIsIDUsIDgsICIxMDExIDAxMTAgc3NzcyBkZGRkIiwgInNiY2IgcmJkLHJicyIsIDAsCi0KLSAgIkNaU1ZESCIsIDMzLCA4LCAiMDExMSAxMTExIGltbTgiLCAic2MgaW1tOCIsIDAsCi0KLSJDWlNWLS0iLCAxNSwgMTYsICIxMDExIDAwMTEgZGRkZCAxMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RhIHJkLHJzIiwgMCwKLSJDWlNWLS0iLCAxNSwgOCwgIjEwMTEgMDAxMCBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGFiIHJiZCxycyIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMzIsICIxMDExIDAwMTEgZGRkZCAxMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RhbCBycmQscnMiLCAwLAotCi0iQ1pTLS0tIiwgMTUsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkbCByZCxycyIsIDAsCi0iQ1pTLS0tIiwgMTUsIDgsICIxMDExIDAwMTAgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RsYiByYmQscnMiLCAwLAotICAiQ1pTLS0tIiwgMTUsIDMyLCAiMTAxMSAwMDExIGRkZGQgMDExMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkbGwgcnJkLHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAxMCAwMTAxIGRkTjAgaW1tNCIsICJzZXQgQHJkLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMCAwMTAxIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJzZXQgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDExMCAwMTAxIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJzZXQgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItLS0tLS0iLCA0LCAxNiwgIjEwMTAgMDEwMSBkZGRkIGltbTQiLCAic2V0IHJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCAxNiwgIjAwMTAgMDEwMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJzZXQgcmQscnMiLCAwLAotICAiLS0tLS0tIiwgMTEsIDgsICIwMDEwIDAxMDAgZGROMCBpbW00IiwgInNldGIgQHJkLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTEwIDAxMDAgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldGIgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTMsIDgsICIwMTEwIDAxMDAgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldGIgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItLS0tLS0iLCA0LCA4LCAiMTAxMCAwMTAwIGRkZGQgaW1tNCIsICJzZXRiIHJiZCxpbW00IiwgMCwKLSItLS0tLS0iLCAxMCwgOCwgIjAwMTAgMDEwMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJzZXRiIHJiZCxycyIsIDAsCi0KLSAgIkNaU1YtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGltbTQgMDAwMSIsICJzZXRmbGcgaW1tNCIsIDAsCi0KLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDExMDAgZGRkZCAwMTAxIGltbTE2IiwgInNpbmIgcmJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDExMDEgZGRkZCAwMTAxIGltbTE2IiwgInNpbmIgcmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAiLCAic2luZCBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAiLCAic2luZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMDEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzaW5pYiBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAwMDAwIiwgInNpbmliciBAcmQsQHJzLHJhIiwgMCwKLQotICAiQ1pTVi0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTAwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGEgcmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDEwMDEgIDAwMDAgMDAwMCBpbW04IiwgInNsYWIgcmJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMTEwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGFsIHJyZCxpbW04IiwgMCwKLQotICAiQ1pTLS0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDAwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGwgcmQsaW1tOCIsIDAsCi0gICJDWlMtLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDAwMDEgIDAwMDAgMDAwMCBpbW04IiwgInNsbGIgcmJkLGltbTgiLCAwLAotICAiQ1pTLS0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMDEwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGxsIHJyZCxpbW04IiwgMCwKLQotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NzcyAwMTExIGltbTE2IiwgInNvdXQgaW1tMTYscnMiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc3NzIDAxMTEgaW1tMTYiLCAic291dGIgaW1tMTYscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNvdXRkIEByZCxAcnMscmEiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzb3V0ZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzb3V0aWIgQHJkLEBycyxyYSIsIDAsCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJzb3V0aWJyIEByZCxAcnMscmEiLCAwLAotCi0gICJDWlNWLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAxMDAxIDExMTEgMTExMSBuaW04IiwgInNyYSByZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMTAwMSAxMTExIDExMTEgbmltOCIsICJzcmFiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCAzMiwgIjEwMTEgMDAxMSBkZGRkIDExMDEgMTExMSAxMTExIG5pbTgiLCAic3JhbCBycmQsaW1tOCIsIDAsCi0KLSAgIkNaU1YtLSIsIDEzLCAxNiwgIjEwMTEgMDAxMSBkZGRkIDAwMDEgMTExMSAxMTExIG5pbTgiLCAic3JsIHJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDgsICIxMDExIDAwMTAgZGRkZCAwMDAxIDExMTEgMTExMSBuaW04IiwgInNybGIgcmJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMDEwMSAxMTExIDExMTEgbmltOCIsICJzcmxsIHJyZCxpbW04IiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMTEgc3NOMCBkZGRkIiwgInN1YiByZCxAcnMiLCAwLAotIkNaU1YtLSIsIDksIDE2LCAiMDEwMCAwMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWIgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTAsIDE2LCAiMDEwMCAwMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWIgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDEwIDAwMDAgZGRkZCBpbW0xNiIsICJzdWIgcmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNCwgMTYsICIxMDAwIDAwMTEgc3NzcyBkZGRkIiwgInN1YiByZCxycyIsIDAsCi0KLSAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMTAgc3NOMCBkZGRkIiwgInN1YmIgcmJkLEBycyIsIDAsCi0iQ1pTVkRIIiwgOSwgOCwgIjAxMDAgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAic3ViYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVkRIIiwgMTAsIDgsICIwMTAwIDAwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWREgiLCA3LCA4LCAiMDAwMCAwMDEwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAic3ViYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWREgiLCA0LCA4LCAiMTAwMCAwMDEwIHNzc3MgZGRkZCIsICJzdWJiIHJiZCxyYnMiLCAwLAotCi0gICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAwMTAgc3NOMCBkZGRkIiwgInN1YmwgcnJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMzIsICIwMTAxIDAwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YmwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDE2LCAzMiwgIjAxMDEgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAic3VibCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAxMCAwMDAwIGRkZGQgaW1tMzIiLCAic3VibCBycmQsaW1tMzIiLCAwLAotICAiQ1pTVi0tIiwgOCwgMzIsICIxMDAxIDAwMTAgc3NzcyBkZGRkIiwgInN1YmwgcnJkLHJycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDUsIDE2LCAiMTAxMCAxMTExIGRkZGQgY2NjYyIsICJ0Y2MgY2MscmQiLCAwLAotICAiLS0tLS0tIiwgNSwgOCwgIjEwMTAgMTExMCBkZGRkIGNjY2MiLCAidGNjYiBjYyxyYmQiLCAwLAotCi0gICItWlMtLS0iLCA4LCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAxMDAiLCAidGVzdCBAcmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0IGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAxMDAgYWRkcmVzc19kc3QiLCAidGVzdCBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMTAwIiwgInRlc3QgcmQiLCAwLAotCi0gICItWlNQLS0iLCA4LCA4LCAiMDAwMCAxMTAwIGRkTjAgMDEwMCIsICJ0ZXN0YiBAcmQiLCAwLAotICAiLVpTUC0tIiwgMTEsIDgsICIwMTAwIDExMDAgMDAwMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3RiIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi1aU1AtLSIsIDEyLCA4LCAiMDEwMCAxMTAwIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0YiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAxMDAiLCAidGVzdGIgcmJkIiwgMCwKLQotICAiLVpTLS0tIiwgMTMsIDMyLCAiMDAwMSAxMTAwIGRkTjAgMTAwMCIsICJ0ZXN0bCBAcmQiLCAwLAotIi1aUy0tLSIsIDE2LCAzMiwgIjAxMDEgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QiLCAidGVzdGwgYWRkcmVzc19kc3QiLCAwLAotICAiLVpTLS0tIiwgMTcsIDMyLCAiMDEwMSAxMTAwIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0bCBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLVpTLS0tIiwgMTMsIDMyLCAiMTAwMSAxMTAwIGRkZGQgMTAwMCIsICJ0ZXN0bCBycmQiLCAwLAotCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBkZE4wIDEwMDAgMDAwMCBhYWFhIHNzTjAgMDAwMCIsICJ0cmRiIEByZCxAcnMscmJhIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMTEwMCAwMDAwIGFhYWEgc3NOMCAwMDAwIiwgInRyZHJiIEByZCxAcnMscmJhIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMDAwMCAwMDAwIHJycnIgc3NOMCAwMDAwIiwgInRyaWIgQHJkLEBycyxyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAwMTAwIDAwMDAgcnJyciBzc04wIDAwMDAiLCAidHJpcmIgQHJkLEBycyxyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAxMTEwIDAwMDAgcnJyciBiYk4wIDExMTAiLCAidHJ0ZHJiIEByYSxAcmIscmJyIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGFhTjAgMDAxMCAwMDAwIHJycnIgYmJOMCAwMDAwIiwgInRydGliIEByYSxAcmIscnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAwMTEwIDAwMDAgcnJyciBiYk4wIDExMTAiLCAidHJ0aXJiIEByYSxAcmIscmJyIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGFhTjAgMTAxMCAwMDAwIHJycnIgYmJOMCAwMDAwIiwgInRydHJiIEByYSxAcmIscmJyIiwgMCwKLQotICAiLS1TLS0tIiwgMTEsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDExMCIsICJ0c2V0IEByZCIsIDAsCi0gICItLVMtLS0iLCAxNCwgMTYsICIwMTAwIDExMDEgMDAwMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXQgYWRkcmVzc19kc3QiLCAwLAotICAiLS1TLS0tIiwgMTUsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDExMCBhZGRyZXNzX2RzdCIsICJ0c2V0IGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLVMtLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAxMTAiLCAidHNldCByZCIsIDAsCi0KLSAgIi0tUy0tLSIsIDExLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDExMCIsICJ0c2V0YiBAcmQiLCAwLAotICAiLS1TLS0tIiwgMTQsIDgsICIwMTAwIDExMDAgMDAwMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXRiIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tUy0tLSIsIDE1LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDExMCBhZGRyZXNzX2RzdCIsICJ0c2V0YiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS1TLS0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAxMTAiLCAidHNldGIgcmJkIiwgMCwKLQotICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDEwMDEgc3NOMCBkZGRkIiwgInhvciByZCxAcnMiLCAwLAotIi1aUy0tLSIsIDksIDE2LCAiMDEwMCAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3IgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLVpTLS0tIiwgMTAsIDE2LCAiMDEwMCAxMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3IgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAxMDAxIDAwMDAgZGRkZCBpbW0xNiIsICJ4b3IgcmQsaW1tMTYiLCAwLAotICAiLVpTLS0tIiwgNCwgMTYsICIxMDAwIDEwMDEgc3NzcyBkZGRkIiwgInhvciByZCxycyIsIDAsCi0KLSAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDEwMDAgc3NOMCBkZGRkIiwgInhvcmIgcmJkLEBycyIsIDAsCi0iLVpTUC0tIiwgOSwgOCwgIjAxMDAgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAieG9yYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiLVpTUC0tIiwgMTAsIDgsICIwMTAwIDEwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMDAwMCAxMDAwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAieG9yYiByYmQsaW1tOCIsIDAsCi0gICItWlNQLS0iLCA0LCA4LCAiMTAwMCAxMDAwIHNzc3MgZGRkZCIsICJ4b3JiIHJiZCxyYnMiLCAwLAotICAiKiIsIDQsIDgsICIxMDAwIDEwMDAgc3NzcyBkZGRkIiwgInhvcmIgcmJkLHJicyIsIDAsCi0gICIqIiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKLQotaW50Ci1jb3VudCAoKQotewotICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7Ci0gIGludCByID0gMDsKLQotICB3aGlsZSAocC0+bmFtZSkKLSAgICB7Ci0gICAgICByKys7Ci0gICAgICBwKys7Ci0gICAgfQotICByZXR1cm4gcjsKLQotfQotCi1zdGF0aWMKLWludAotZnVuYyAoYSwgYikKLSAgICAgc3RydWN0IG9wICphOwotICAgICBzdHJ1Y3Qgb3AgKmI7Ci17Ci0gIHJldHVybiBzdHJjbXAgKChhKS0+bmFtZSwgKGIpLT5uYW1lKTsKLX0KLQotCi0vKiBvcGNvZGUKLQotIGxpdGVyYWwgIDAwMDAgbm5ubiBpbnNlcnQgbm5uIGludG8gc3RyZWFtCi0gb3BlcmFuZCAgMDAwMSBubm5uICBpbnNlcnQgb3BlcmFuZCByZWcgbm5uIGludG8gc3RyZWFtCi0qLwotCi1zdHJ1Y3QgdG9rX3N0cnVjdAotewotCi0gIGNoYXIgKm1hdGNoOwotICBjaGFyICp0b2tlbjsKLSAgaW50IGxlbmd0aDsKLX07Ci0KLXN0cnVjdCB0b2tfc3RydWN0IGFyZ3NbXSA9Ci17Ci0KLSAgeyJhZGRyZXNzX3NyYyhycykiLCAiQ0xBU1NfWCsoQVJHX1JTKSIsfSwKLSAgeyJhZGRyZXNzX2RzdChyZCkiLCAiQ0xBU1NfWCsoQVJHX1JEKSIsfSwKLQotICB7InJzKGltbTE2KSIsICJDTEFTU19CQSsoQVJHX1JTKSIsfSwKLSAgeyJyZChpbW0xNikiLCAiQ0xBU1NfQkErKEFSR19SRCkiLH0sCi0gIHsicHJkIiwgICAgICAgIkNMQVNTX1BSKyhBUkdfUkQpIix9LAotICB7ImFkZHJlc3Nfc3JjIiwgIkNMQVNTX0RBKyhBUkdfU1JDKSIsfSwKLSAgeyJhZGRyZXNzX2RzdCIsICJDTEFTU19EQSsoQVJHX0RTVCkiLH0sCi0gIHsicmQocngpIiwgIkNMQVNTX0JYKyhBUkdfUkQpIix9LAotICB7InJzKHJ4KSIsICJDTEFTU19CWCsoQVJHX1JTKSIsfSwKLQotICB7ImRpc3AxNiIsICJDTEFTU19ESVNQIix9LAotICB7ImRpc3AxMiIsICJDTEFTU19ESVNQIix9LAotICB7ImRpc3A3IiwgIkNMQVNTX0RJU1AiLH0sCi0gIHsiZGlzcDgiLCAiQ0xBU1NfRElTUCIsfSwKLSAgeyJmbGFncyIsICJDTEFTU19GTEFHUyIsfSwKLQotICB7ImltbTE2IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTE2KSIsfSwKLSAgeyJpbW0xb3IyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTFPUjIpIix9LAotICB7ImltbTMyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTMyKSIsfSwKLSAgeyJpbW00bTEiLCAiQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSkiLH0sCi0gIHsiaW1tNCIsICJDTEFTU19JTU0gKyhBUkdfSU1NNCkiLH0sCi0gIHsibiIsICJDTEFTU19JTU0gKyAoQVJHX0lNTU4pIix9LAotICB7ImN0cmwiLCAiQ0xBU1NfQ1RSTCIsfSwKLSAgeyJyYmEiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSkiLH0sCi0gIHsicmJiIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUkIpIix9LAotICB7InJiZCIsICJDTEFTU19SRUdfQllURSsoQVJHX1JEKSIsfSwKLSAgeyJyYnMiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SUykiLH0sCi0gIHsicmJyIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUlIpIix9LAotCi0gIHsicnJkIiwgIkNMQVNTX1JFR19MT05HKyhBUkdfUkQpIix9LAotICB7InJycyIsICJDTEFTU19SRUdfTE9ORysoQVJHX1JTKSIsfSwKLQotICB7InJxZCIsICJDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSIsfSwKLQotICB7InJkIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUkQpIix9LAotICB7InJzIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUlMpIix9LAotCi0gIHsiQHJkIiwgIkNMQVNTX0lSKyhBUkdfUkQpIix9LAotICB7IkByYSIsICJDTEFTU19JUisoQVJHX1JBKSIsfSwKLSAgeyJAcmIiLCAiQ0xBU1NfSVIrKEFSR19SQikiLH0sCi0gIHsiQHJzIiwgIkNMQVNTX0lSKyhBUkdfUlMpIix9LAotCi0gIHsiaW1tOCIsICJDTEFTU19JTU0rKEFSR19JTU04KSIsfSwKLSAgeyJpMiIsICJDTEFTU19JTU0rKEFSR19JTU0yKSIsfSwKLSAgeyJjYyIsICJDTEFTU19DQyIsfSwKLQotICB7InJyIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUlIpIix9LAotICB7InJhIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUkEpIix9LAotICB7InJzIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUlMpIix9LAotCi0gIHsiMSIsICJDTEFTU19JTU0rKEFSR19JTU1fMSkiLH0sCi0gIHsiMiIsICJDTEFTU19JTU0rKEFSR19JTU1fMikiLH0sCi0KLSAgMCwgMAotfTsKLQotc3RydWN0IHRva19zdHJ1Y3QgdG9rc1tdID0KLXsKLSAgIjAwMDAiLCAiQ0xBU1NfQklUKzAiLCAxLAotICAiMDAwMSIsICJDTEFTU19CSVQrMSIsIDEsCi0gICIwMDEwIiwgIkNMQVNTX0JJVCsyIiwgMSwKLSAgIjAwMTEiLCAiQ0xBU1NfQklUKzMiLCAxLAotICAiMDEwMCIsICJDTEFTU19CSVQrNCIsIDEsCi0gICIwMTAxIiwgIkNMQVNTX0JJVCs1IiwgMSwKLSAgIjAxMTAiLCAiQ0xBU1NfQklUKzYiLCAxLAotICAiMDExMSIsICJDTEFTU19CSVQrNyIsIDEsCi0gICIxMDAwIiwgIkNMQVNTX0JJVCs4IiwgMSwKLSAgIjEwMDEiLCAiQ0xBU1NfQklUKzkiLCAxLAotICAiMTAxMCIsICJDTEFTU19CSVQrMHhhIiwgMSwKLSAgIjEwMTEiLCAiQ0xBU1NfQklUKzB4YiIsIDEsCi0gICIxMTAwIiwgIkNMQVNTX0JJVCsweGMiLCAxLAotICAiMTEwMSIsICJDTEFTU19CSVQrMHhkIiwgMSwKLSAgIjExMTAiLCAiQ0xBU1NfQklUKzB4ZSIsIDEsCi0gICIxMTExIiwgIkNMQVNTX0JJVCsweGYiLCAxLAotCi0gICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzAiLCAxLAotICAiMDBJMCIsICJDTEFTU19CSVRfMU9SMisxIiwgMSwKLSAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMiIsIDEsCi0gICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzMiLCAxLAotICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis0IiwgMSwKLSAgIjAxSTAiLCAiQ0xBU1NfQklUXzFPUjIrNSIsIDEsCi0gICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzYiLCAxLAotICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis3IiwgMSwKLSAgIjEwSTAiLCAiQ0xBU1NfQklUXzFPUjIrOCIsIDEsCi0gICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzkiLCAxLAotICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMisweGEiLCAxLAotICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMisweGIiLCAxLAotICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGMiLCAxLAotICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGQiLCAxLAotICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGUiLCAxLAotICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGYiLCAxLAotCi0gICJzc3NzIiwgIkNMQVNTX1JFRysoQVJHX1JTKSIsIDEsCi0gICJkZGRkIiwgIkNMQVNTX1JFRysoQVJHX1JEKSIsIDEsCi0gICJhYWFhIiwgIkNMQVNTX1JFRysoQVJHX1JBKSIsIDEsCi0gICJiYmJiIiwgIkNMQVNTX1JFRysoQVJHX1JCKSIsIDEsCi0gICJycnJyIiwgIkNMQVNTX1JFRysoQVJHX1JSKSIsIDEsCi0KLSAgInNzTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SUykiLCAxLAotICAiZGROMCIsICJDTEFTU19SRUdOMCsoQVJHX1JEKSIsIDEsCi0gICJhYU4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUkEpIiwgMSwKLSAgImJiTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SQikiLCAxLAotICAicnJOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JSKSIsIDEsCi0KLSAgImNjY2MiLCAiQ0xBU1NfQ0MiLCAxLAotICAibm5ubiIsICJDTEFTU19JTU0rKEFSR19JTU1OKSIsIDEsCi0gICJ4eHh4IiwgIkNMQVNTX1JFRysoQVJHX1JYKSIsIDEsCi0gICJ4eE4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUlgpIiwgMSwKLSAgIm5taW51czEiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSkiLCAxLAotCi0gICJkaXNwMTYiLCAiQ0xBU1NfRElTUCsoQVJHX0RJU1AxNikiLCA0LAotICAiZGlzcDEyIiwgIkNMQVNTX0RJU1ArKEFSR19ESVNQMTIpIiwgMywKLSAgImZsYWdzIiwgIkNMQVNTX0ZMQUdTIiwgMSwKLSAgImFkZHJlc3NfZHN0IiwgIkNMQVNTX0FERFJFU1MrKEFSR19EU1QpIiwgNCwKLSAgImFkZHJlc3Nfc3JjIiwgIkNMQVNTX0FERFJFU1MrKEFSR19TUkMpIiwgNCwKLSAgImltbTRtMSIsICJDTEFTU19JTU0rKEFSR19JTU00TTEpIiwgMSwKLSAgImltbTQiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NNCkiLCAxLAotCi0gICJpbW04IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTgpIiwgMiwKLSAgImltbTE2IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTE2KSIsIDQsCi0gICJpbW0zMiIsICJDTEFTU19JTU0rKEFSR19JTU0zMikiLCA4LAotICAibmltOCIsICJDTEFTU19JTU0rKEFSR19OSU04KSIsIDIsCi0gICIwY2NjIiwgIkNMQVNTXzBDQ0MiLCAxLAotICAiMWNjYyIsICJDTEFTU18xQ0NDIiwgMSwKLSAgImRpc3A4IiwgIkNMQVNTX0RJU1A4IiwgMiwKLSAgIjBkaXNwNyIsICJDTEFTU18wRElTUDciLCAyLAotICAiMWRpc3A3IiwgIkNMQVNTXzFESVNQNyIsIDIsCi0gICIwMWlpIiwgIkNMQVNTXzAxSUkiLCAxLAotICAiMDBpaSIsICJDTEFTU18wMElJIiwgMSwKLSAgMCwgMAotCi19OwotCi1jaGFyICoKLXRyYW5zbGF0ZSAodGFibGUsIHgsIGxlbmd0aCkKLSAgICAgc3RydWN0IHRva19zdHJ1Y3QgKnRhYmxlOwotICAgICBjaGFyICp4OwotICAgICBpbnQgKmxlbmd0aDsKLXsKLQotICBpbnQgZm91bmQ7Ci0KLSAgZm91bmQgPSAwOwotICB3aGlsZSAodGFibGUtPm1hdGNoKQotICAgIHsKLSAgICAgIGludCBsID0gc3RybGVuICh0YWJsZS0+bWF0Y2gpOwotCi0gICAgICBpZiAoc3RybmNtcCAodGFibGUtPm1hdGNoLCB4LCBsKSA9PSAwKQotCXsKLQkgIC8qIEdvdCBhIGhpdCAqLwotCSAgcHJpbnRmICgiJXMiLCB0YWJsZS0+dG9rZW4pOwotCSAgKmxlbmd0aCArPSB0YWJsZS0+bGVuZ3RoOwotCSAgcmV0dXJuIHggKyBsOwotCX0KLQotICAgICAgdGFibGUrKzsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIkNhbid0IGZpbmQgJXNcbiIsIHgpOwotICBwcmludGYgKCIqKioqIENhbid0IGZpbmQgJXNcbiIsIHgpOwotICB3aGlsZSAoKngpCi0gICAgeCsrOwotICByZXR1cm4geDsKLX0KLQotdm9pZAotY2hld2JpdHMgKGJpdHMsIGxlbmd0aCkKLSAgICAgY2hhciAqYml0czsKLSAgICAgaW50ICpsZW5ndGg7Ci17Ci0gIGludCBuID0gMDsKLQotICAqbGVuZ3RoID0gMDsKLSAgcHJpbnRmICgieyIpOwotICB3aGlsZSAoKmJpdHMpCi0gICAgewotICAgICAgd2hpbGUgKCpiaXRzID09ICcgJykKLQl7Ci0JICBiaXRzKys7Ci0JfQotICAgICAgYml0cyA9IHRyYW5zbGF0ZSAodG9rcywgYml0cywgbGVuZ3RoKTsKLSAgICAgIG4rKzsKLSAgICAgIHByaW50ZiAoIiwiKTsKLQotICAgIH0KLSAgd2hpbGUgKG4gPCBCWVRFX0lORk9fTEVOIC0gMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCIwLCIpOwotICAgICAgbisrOwotICAgIH0KLSAgcHJpbnRmICgifSIpOwotfQotCi0KLXN0YXRpYwotaW50Ci1jaGV3bmFtZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqbjsKLSAgaW50IG5hcmdzID0gMDsKLQotICBuID0gbmFtZTsKLSAgcHJpbnRmICgiXCIiKTsKLSAgd2hpbGUgKCpuICYmICFpc3doaXRlICgqbikpCi0gICAgewotICAgICAgcHJpbnRmICgiJWMiLCAqbik7Ci0gICAgICBuKys7Ci0gICAgfQotICBwcmludGYgKCJcIiwiKTsJCS8qIFNjYW4gdGhlIG9wZXJhbmRzIGFuZCBtYWtlIGVudGlyZXMgZm9yCi0JCQkJICAgdGhlbSAtcmVtZW1iZXIgaW5kaXJlY3QgdGhpbmdzICovCi0KLSAgbiA9IG5hbWU7Ci0gIHByaW50ZiAoIk9QQ18iKTsKLSAgd2hpbGUgKCpuICYmICFpc3doaXRlICgqbikpCi0gICAgewotICAgICAgcHJpbnRmICgiJWMiLCAqbik7Ci0gICAgICBuKys7Ci0gICAgfQotICBwcmludGYgKCIsMCx7Iik7Ci0KLSAgd2hpbGUgKCpuKQotICAgIHsKLSAgICAgIGludCBkOwotCi0gICAgICB3aGlsZSAoKm4gPT0gJywnIHx8IGlzd2hpdGUgKCpuKSkKLQluKys7Ci0gICAgICBuYXJncysrOwotICAgICAgbiA9IHRyYW5zbGF0ZSAoYXJncywgbiwgJmQpOwotICAgICAgcHJpbnRmICgiLCIpOwotICAgIH0KLSAgaWYgKG5hcmdzID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiMCIpOwotICAgIH0KLSAgcHJpbnRmICgifSwiKTsKLSAgcmV0dXJuIG5hcmdzOwotfQotCi1zdGF0aWMgCi12b2lkCi1zdWIgKHgsIGMpCi0gICAgIGNoYXIgKng7Ci0gICAgIGNoYXIgYzsKLXsKLSAgd2hpbGUgKCp4KQotICAgIHsKLSAgICAgIGlmICh4WzBdID09IGMgJiYgeFsxXSA9PSBjICYmCi0JICB4WzJdID09IGMgJiYgeFszXSA9PSBjKQotCXsKLQkgIHhbMl0gPSAnTic7Ci0JICB4WzNdID0gJzAnOwotCX0KLSAgICAgIHgrKzsKLSAgICB9Ci19Ci0KLQotI2lmIDAKLSNkZWZpbmUgRCh4KSAoKHgpID09ICcxJyB8fCAoeCkgPT0nMCcpCi0jZGVmaW5lIE0oeSkgKHN0cm5jbXAoeSx4LDQpPT0wKQotcHJpbnRtYW5nbGVkICh4KQotICAgICBjaGFyICp4OwotewotICByZXR1cm47Ci0gIHdoaWxlICgqeCkKLSAgICB7Ci0gICAgICBpZiAoRCAoeFswXSkgJiYgRCAoeFsxXSkgJiYgRCAoeFsyXSkgJiYgRCAoeFszXSkpCi0JewotCSAgcHJpbnRmICgiWFhYWCIpOwotCX0KLSAgICAgIGVsc2UgaWYgKE0gKCJzc3NzIikpCi0JewotCSAgcHJpbnRmICgic3NzcyIpOwotCX0KLSAgICAgIGVsc2UgaWYgKE0gKCJkZGRkIikpCi0JewotCSAgcHJpbnRmICgiZGRkZCIpOwotCX0KLSAgICAgIGVsc2UKLQlwcmludGYgKCJfX19fIik7Ci0KLSAgICAgIHggKz0gNDsKLQotICAgICAgaWYgKHhbMF0gPT0gJyAnKQotCXsKLQkgIHByaW50ZiAoIl8iKTsKLQkgIHgrKzsKLQl9Ci0gICAgfQotCi19Ci0KLSNlbmRpZgotLyojZGVmaW5lIFdPUktfVFlQRSovCi12b2lkCi1wcmludF90eXBlIChuKQotICAgICBzdHJ1Y3Qgb3AgKm47Ci17Ci0jaWZkZWYgV09SS19UWVBFCi0gIHdoaWxlICgqcyAmJiAhaXN3aGl0ZSAoKnMpKQotICAgIHsKLSAgICAgIGwgPSAqczsKLSAgICAgIHMrKzsKLSAgICB9Ci0gIHN3aXRjaCAobCkKLSAgICB7Ci0gICAgY2FzZSAnbCc6Ci0gICAgICBwcmludGYgKCIzMiwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgICAgcHJpbnRmICgiOCwiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKCIxNiwiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSNlbHNlCi0gIHByaW50ZiAoIiUyZCwiLCBuLT50eXBlKTsKLSNlbmRpZgotfQotCi0KLXZvaWQKLWludGVybmFsICgpCi17Ci0gIGludCBjID0gY291bnQgKCk7Ci0gIHN0cnVjdCBvcCAqbmV3ID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3ApICogYyk7Ci0gIHN0cnVjdCBvcCAqcCA9IG9wdDsKLSAgbWVtY3B5IChuZXcsIHAsIGMgKiBzaXplb2YgKHN0cnVjdCBvcCkpOwotCi0gIC8qIHNvcnQgYWxsIG5hbWVzIGluIHRhYmxlIGFscGhhYmV0aWNhbGx5ICovCi0gIHFzb3J0IChuZXcsIGMsIHNpemVvZiAoc3RydWN0IG9wKSwgZnVuYyk7Ci0KLSAgcCA9IG5ldzsKLSAgd2hpbGUgKHAtPmZsYWdzWzBdICE9ICcqJykKLSAgewotICAgIC8qIElmIHRoZXJlIGFyZSBhbnkgQHJzLCBzdWIgdGhlIHNzc3MgaW50byBhIHNzbjAsCi0gICAgICAgKHJzKSwgKHNzbjApCi0gICAgICAgKi8KLSAgICBpbnQgbG9vcCA9IDE7Ci0KLSAgICBwcmludGYgKCJcIiVzXCIsJTJkLCAiLCBwLT5mbGFncywgcC0+Y3ljbGVzKTsKLSAgICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBjaGFyICpzID0gcC0+bmFtZTsKLQotICAgICAgbG9vcCA9IDA7Ci0gICAgICB3aGlsZSAoKnMpCi0gICAgICB7Ci0JaWYgKHNbMF0gPT0gJ0AnKQotCXsKLQkgIGNoYXIgYzsKLQotCSAgLyogc2tpcCB0aGUgciBhbmQgc3ViIHRoZSBzdHJpbmcgKi8KLQkgIHMrKzsKLQkgIGMgPSBzWzFdOwotCSAgc3ViIChwLT5iaXRzLCBjKTsKLQl9Ci0JaWYgKHNbMF0gPT0gJygnICYmIHNbM10gPT0gJyknKQotCXsKLQkgIHN1YiAocC0+Yml0cywgc1syXSk7Ci0JfQotCWlmIChzWzBdID09ICcoJykKLQl7Ci0JICBzdWIgKHAtPmJpdHMsIHNbLTFdKTsKLQl9Ci0KLQlzKys7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcHJpbnRfdHlwZSAocCk7Ci0gICAgcHJpbnRmICgiXCIlc1wiLFwiJXNcIiwwLFxuIiwgcC0+Yml0cywgcC0+bmFtZSk7Ci0gICAgcCsrOwotICB9Ci19Ci0KLXN0YXRpYyAKLXZvaWQKLWdhcyAoKQotewotICBpbnQgYyA9IGNvdW50ICgpOwotICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7Ci0gIGludCBpZHggPSAwOwotICBjaGFyICpvbGRuYW1lID0gIiI7Ci0gIHN0cnVjdCBvcCAqbmV3ID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3ApICogYyk7Ci0KLSAgbWVtY3B5IChuZXcsIHAsIGMgKiBzaXplb2YgKHN0cnVjdCBvcCkpOwotCi0gIC8qIHNvcnQgYWxsIG5hbWVzIGluIHRhYmxlIGFscGhhYmV0aWNhbGx5ICovCi0gIHFzb3J0IChuZXcsIGMsIHNpemVvZiAoc3RydWN0IG9wKSwgZnVuYyk7Ci0KLSAgcHJpbnRmICgiCQkJLyogVEhJUyBGSUxFIElTIEFVVE9NQUdJQ0FMTFkgR0VORVJBVEVELCBET04nVCBFRElUIElUICovXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIEFSR19NQVNLIDB4MGZcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1NSQyAweDAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfRFNUIDB4MDJcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JTIDB4MDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SRCAweDAyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUkEgMHgwM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JCIDB4MDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SUiAweDA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUlggMHgwNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTQgMHgwMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTggMHgwMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTE2IDB4MDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU0zMiAweDA0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NTiAweDA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NTk1JTlVTMSAweDA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NXzEgMHgwNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTV8yIDB4MDdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19ESVNQMTYgMHgwOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX05JTTggMHgwOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTIgMHgwYVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTFPUjIgMHgwYlxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfRElTUDEyIDB4MGJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19ESVNQOCAweDBjXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NNE0xIDB4MGRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX01BU0sgMHgxZmZmMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfWCAweDEwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CQSAweDIwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19EQSAweDMwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CWCAweDQwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19ESVNQIDB4NTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0lNTSAweDYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19DQyAweDcwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19DVFJMIDB4ODBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0FERFJFU1MgMHhkMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMENDQyAweGUwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18xQ0NDIDB4ZjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzBESVNQNyAweDEwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMURJU1A3IDB4MjAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wMUlJIDB4MzAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wMElJIDB4NDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CSVQgMHg1MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0ZMQUdTIDB4NjAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19JUiAweDcwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfRElTUDggMHg4MDBcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQklUXzFPUjIgMHg5MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFRyAweDcwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19CWVRFIDB4MjAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX1dPUkQgMHgzMDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdfUVVBRCAweDQwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19MT05HIDB4NTAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHTjAgMHg4MDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19QUiAweDEwMDAwXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGMgMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkY2IgMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkZCAyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRkYiAzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRkbCA0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYW5kIDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hbmRiIDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19iaXQgN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2JpdGIgOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NhbGwgOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NhbHIgMTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jbHIgMTFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jbHJiIDEyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY29tIDEzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY29tYiAxNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NvbWZsZyAxNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwIDE2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BiIDE3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkIDE4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkYiAxOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwZHIgMjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGRyYiAyMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaSAyMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaWIgMjNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGlyIDI0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpcmIgMjVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGwgMjZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkIDI3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzZGIgMjhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkciAyOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2RyYiAzMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2kgMzFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNpYiAzMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2lyIDMzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaXJiIDM0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGFiIDM1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGJqbnogMzZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kZWMgMzdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kZWNiIDM4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGkgMzlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kaXYgNDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kaXZsIDQxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGpueiA0MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2VpIDQzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXggNDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leGIgNDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHRzIDQ2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0c2IgNDdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHRzbCA0OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2hhbHQgNDlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbiA1MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luYiA1MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luYyA1MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luY2IgNTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmQgNTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmRiIDU1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5pYiA1NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luaWJyIDU3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaXJldCA1OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2pwIDU5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfanIgNjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZCA2MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkYSA2MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkYXIgNjNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGIgNjRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGN0bCA2NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaXIgNjZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGlyYiA2N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkayA2OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkbCA2OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkbSA3MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkcHMgNzFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHIgNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHJiIDczXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRybCA3NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX21iaXQgNzVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tcmVxIDc2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbXJlcyA3N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX21zZXQgNzhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tdWx0IDc5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbXVsdGwgODBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19uZWcgODFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19uZWdiIDgyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbm9wIDgzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3IgODRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vcmIgODVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXQgODZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRiIDg3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0ZCA4OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGRiIDg5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0aWIgOTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRpYnIgOTFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19wb3AgOTJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19wb3BsIDkzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcHVzaCA5NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3B1c2hsIDk1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmVzIDk2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmVzYiA5N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Jlc2ZsZyA5OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JldCA5OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsIDEwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsYiAxMDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGMgMTAyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmxjYiAxMDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGRiIDEwNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyIDEwNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyYiAxMDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmMgMTA3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnJjYiAxMDhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmRiIDEwOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NiYyAxMTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zYmNiIDExMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkYSAxMTJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGFiIDExM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkYWwgMTE0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RsIDExNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkbGIgMTE2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RsbCAxMTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZXQgMTE4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2V0YiAxMTlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZXRmbGcgMTIwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luYiAxMjFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zaW5kIDEyMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmRiIDEyM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmliIDEyNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmliciAxMjVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGEgMTI2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xhYiAxMjdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGFsIDEyOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsbCAxMjlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGxiIDEzMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsbGwgMTMxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dCAxMzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0YiAxMzNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0ZCAxMzRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0ZGIgMTM1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dGliIDEzNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRpYnIgMTM3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JhIDEzOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NyYWIgMTM5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JhbCAxNDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmwgMTQxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JsYiAxNDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmxsIDE0M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3N1YiAxNDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zdWJiIDE0NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3N1YmwgMTQ2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdGNjIDE0N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RjY2IgMTQ4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdGVzdCAxNDlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190ZXN0YiAxNTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190ZXN0bCAxNTFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cmRiIDE1MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyZHJiIDE1M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyaWIgMTU0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJpcmIgMTU1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0ZHJiIDE1NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydGliIDE1N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydGlyYiAxNThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cnRyYiAxNTlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190c2V0IDE2MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RzZXRiIDE2MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3hvciAxNjJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ194b3JiIDE2M1xuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkICAxNjQgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkYiAgMTY1IFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkZHIgIDE2NiBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGRyYiAxNjcgIFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaSAgMTY4IFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaWIgMTY5ICBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zYyAgIDE3MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2JwdCAgIDE3MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDBlIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDBmIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDhlIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDhmIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQzNiAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkMzggMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDc4IDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQ3ZSAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkOWQgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDlmIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmRiOSAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkYmYgMTcyXG4iKTsKLSNpZiAwCi0gIGZvciAoaSA9IDA7IHRva3NbaV0udG9rZW47IGkrKykKLSAgICBwcmludGYgKCIjZGVmaW5lICVzXHQweCV4XG4iLCB0b2tzW2ldLnRva2VuLCBpICogMTYpOwotI2VuZGlmCi0gIHByaW50ZiAoInR5cGVkZWYgc3RydWN0IHtcbiIpOwotCi0gIHByaW50ZiAoIiNpZmRlZiBOSUNFTkFNRVNcbiIpOwotICBwcmludGYgKCJjaGFyICpuaWNlbmFtZTtcbiIpOwotICBwcmludGYgKCJpbnQgdHlwZTtcbiIpOwotICBwcmludGYgKCJpbnQgY3ljbGVzO1xuIik7Ci0gIHByaW50ZiAoImludCBmbGFncztcbiIpOwotICBwcmludGYgKCIjZW5kaWZcbiIpOwotICBwcmludGYgKCJjaGFyICpuYW1lO1xuIik7Ci0gIHByaW50ZiAoInVuc2lnbmVkIGNoYXIgb3Bjb2RlO1xuIik7Ci0gIHByaW50ZiAoInZvaWQgKCpmdW5jKSgpO1xuIik7Ci0gIHByaW50ZiAoInVuc2lnbmVkIGludCBhcmdfaW5mb1s0XTtcbiIpOwotICBwcmludGYgKCJ1bnNpZ25lZCBpbnQgYnl0ZV9pbmZvWyVkXTtcbiIsIEJZVEVfSU5GT19MRU4pOwotICBwcmludGYgKCJpbnQgbm9wZXJhbmRzO1xuIik7Ci0gIHByaW50ZiAoImludCBsZW5ndGg7XG4iKTsKLSAgcHJpbnRmICgiaW50IGlkeDtcbiIpOwotICBwcmludGYgKCJ9IG9wY29kZV9lbnRyeV90eXBlO1xuIik7Ci0gIHByaW50ZiAoIiNpZmRlZiBERUZJTkVfVEFCTEVcbiIpOwotICBwcmludGYgKCJvcGNvZGVfZW50cnlfdHlwZSB6OGtfdGFibGVbXSA9IHtcbiIpOwotCi0gIHdoaWxlIChuZXctPmZsYWdzICYmIG5ldy0+ZmxhZ3NbMF0pCi0gICAgewotICAgICAgaW50IG5hcmdzOwotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgcHJpbnRmICgiXG5cbi8qICVzICoqKiAlcyAqL1xuIiwgbmV3LT5iaXRzLCBuZXctPm5hbWUpOwotICAgICAgcHJpbnRmICgie1xuIik7Ci0KLSAgICAgIHByaW50ZiAoIiNpZmRlZiBOSUNFTkFNRVNcbiIpOwotICAgICAgcHJpbnRmICgiXCIlc1wiLCVkLCVkLFxuIiwgbmV3LT5uYW1lLCBuZXctPnR5cGUsIG5ldy0+Y3ljbGVzKTsKLSAgICAgIHsKLQlpbnQgYW5zd2VyID0gMDsKLQljaGFyICpwID0gbmV3LT5mbGFnczsKLQotCXdoaWxlICgqcCkKLQkgIHsKLQkgICAgYW5zd2VyIDw8PSAxOwotCi0JICAgIGlmICgqcCAhPSAnLScpCi0JICAgICAgYW5zd2VyIHw9IDE7Ci0JICAgIHArKzsKLQkgIH0KLQlwcmludGYgKCIweCUwMngsXG4iLCBhbnN3ZXIpOwotICAgICAgfQotCi0gICAgICBwcmludGYgKCIjZW5kaWZcbiIpOwotCi0gICAgICBuYXJncyA9IGNoZXduYW1lIChuZXctPm5hbWUpOwotCi0gICAgICBwcmludGYgKCJcblx0Iik7Ci0gICAgICBjaGV3Yml0cyAobmV3LT5iaXRzLCAmbGVuZ3RoKTsKLSAgICAgIGxlbmd0aCAvPSAyOwotICAgICAgaWYgKGxlbmd0aCAmIDEpCi0JYWJvcnQoKTsKLQotICAgICAgcHJpbnRmICgiLCVkLCVkLCVkIiwgbmFyZ3MsIGxlbmd0aCwgaWR4KTsKLSAgICAgIGlkeCsrOwotICAgICAgb2xkbmFtZSA9IG5ldy0+bmFtZTsKLSAgICAgIHByaW50ZiAoIn0sXG4iKTsKLSAgICAgIG5ldysrOwotICAgIH0KLSAgcHJpbnRmICgiMCwwfTtcbiIpOwotICBwcmludGYgKCIjZW5kaWZcbiIpOwotfQotCi0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgc3RydWN0IG9wICpwID0gb3B0OwotCi0gIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItdCIpID09IDApCi0gICAgewotICAgICAgaW50ZXJuYWwgKCk7Ci0gICAgfQotICBlbHNlIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItaCIpID09IDApCi0gICAgewotICAgICAgd2hpbGUgKHAtPm5hbWUpCi0JewotCSAgcHJpbnRmICgiJS0yNXNcdCVzXG4iLCBwLT5uYW1lLCBwLT5iaXRzKTsKLQkgIHArKzsKLQl9Ci0gICAgfQotCi0gIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1hIikgPT0gMCkKLSAgICB7Ci0gICAgICBnYXMgKCk7Ci0gICAgfQotICBlbHNlIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItZCIpID09IDApCi0gICAgewotICAgICAgLypkaXMoKTsqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIlVzYWdlOiAlcyAtdFxuIiwgYXZbMF0pOwotICAgICAgcHJpbnRmICgiLXQgOiBnZW5lcmF0ZSBuZXcgejguYyBpbnRlcm5hbCB0YWJsZVxuIik7Ci0gICAgICBwcmludGYgKCItYSA6IGdlbmVyYXRlIG5ldyB0YWJsZSBmb3IgZ2FzXG4iKTsKLSAgICAgIHByaW50ZiAoIi1kIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBkaXNhc3NlbWJsZVxuIik7Ci0gICAgICBwcmludGYgKCItaCA6IGdlbmVyYXRlIG5ldyB0YWJsZSBmb3IgaHVtYW5zXG4iKTsKLSAgICB9Ci1yZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NldHVwLmNvbSBiL3NldHVwLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzYWZkNS4uMDAwMDAwMAotLS0gYS9zZXR1cC5jb20KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSQhIHNldHVwIGZpbGVzIGZvciBvcGVuVk1TL0FscGhhCi0kIQotJCBkZWZpbmUgYW91dCBbLS5JTkNMVURFLkFPVVRdCi0kIGRlZmluZSBjb2ZmIFstLklOQ0xVREUuQ09GRl0KLSQgZGVmaW5lIGVsZiBbLS5JTkNMVURFLkVMRl0KLSQgZGVmaW5lIG1wdyBbLS5JTkNMVURFLk1QV10KLSQgZGVmaW5lIG5sbSBbLS5JTkNMVURFLk5MTV0KLSQgZGVmaW5lIG9wY29kZSBbLS5JTkNMVURFLk9QQ09ERV0KZGlmZiAtLWdpdCBhL3N5bWxpbmstdHJlZSBiL3N5bWxpbmstdHJlZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDk2NTgyZC4uMDAwMDAwMAotLS0gYS9zeW1saW5rLXRyZWUKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIS9iaW4vc2gKLSMgQ3JlYXRlIGEgc3ltbGluayB0cmVlLgotIwotIyBTeW50YXg6IHN5bWxpbmstdHJlZSBzcmNkaXIgImlnbm9yZTEgaWdub3JlMiAuLi4iCi0jCi0jIHdoZXJlIHNyY2RpciBpcyB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZSBhIHN5bWxpbmsgdHJlZSB0bywKLSMgYW5kICJpZ25vcmVOIiBpcyBhIGxpc3Qgb2YgZmlsZXMvZGlyZWN0b3JpZXMgdG8gaWdub3JlLgotCi1wcm9nPSQwCi1zcmNkaXI9JDEKLWlnbm9yZT0iJDIiCi0KLWlnbm9yZV9hZGRpdGlvbmFsPSIuIC4uIENWUyIKLQotIyBJZiB3ZSB3ZXJlIGludm9rZWQgd2l0aCBhIHJlbGF0aXZlIHBhdGggbmFtZSwgYWRqdXN0ICR7cHJvZ30gdG8gd29yawotIyBpbiBzdWJkaXJzLgotY2FzZSAke3Byb2d9IGluCi0vKikgOzsKLSopIHByb2c9Li4vJHtwcm9nfSA7OwotZXNhYwotCi0jIFNldCBuZXdzcmNkaXIgdG8gc29tZXRoaW5nIHN1YmRpcmVjdG9yaWVzIGNhbiB1c2UuCi1jYXNlICR7c3JjZGlyfSBpbgotLyopIG5ld3NyY2Rpcj0ke3NyY2Rpcn0gOzsKLSopIG5ld3NyY2Rpcj0uLi8ke3NyY2Rpcn0gOzsKLWVzYWMKLQotZm9yIGYgaW4gYGxzIC1hICR7c3JjZGlyfWA7IGRvCi0gIGlmIFsgLWQgJHtzcmNkaXJ9LyRmIF07IHRoZW4KLSAgICBmb3VuZD0KLSAgICBmb3IgaSBpbiAke2lnbm9yZX0gJHtpZ25vcmVfYWRkaXRpb25hbH07IGRvCi0gICAgICBpZiBbICIkZiIgPSAiJGkiIF07IHRoZW4KLQlmb3VuZD15ZXMKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIGlmIFsgLXogIiR7Zm91bmR9IiBdOyB0aGVuCi0gICAgICBlY2hvICIkZgkJLi53b3JraW5nIGluIgotICAgICAgaWYgWyAtZCAkZiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgJGY7IGZpCi0gICAgICAoY2QgJGY7ICR7cHJvZ30gJHtuZXdzcmNkaXJ9LyRmICIke2lnbm9yZX0iKQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkZgkJLi5saW5rZWQiCi0gICAgcm0gLWYgJGYKLSAgICBsbiAtcyAke3NyY2Rpcn0vJGYgLgotICBmaQotZG9uZQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RleGluZm8vdGV4aW5mby50ZXggYi90ZXhpbmZvL3RleGluZm8udGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDNhMzNjLi4wMDAwMDAwCi0tLSBhL3RleGluZm8vdGV4aW5mby50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1NDMxICswLDAgQEAKLSUgdGV4aW5mby50ZXggLS0gVGVYIG1hY3JvcyB0byBoYW5kbGUgVGV4aW5mbyBmaWxlcy4KLSUgJElkJAotJQotJSBDb3B5cmlnaHQgKEMpIDE5ODUsIDg2LCA4OCwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OAotJSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSUKLSUgVGhpcyB0ZXhpbmZvLnRleCBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotJSBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotJSBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0lIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSUKLSUgVGhpcyB0ZXhpbmZvLnRleCBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotJSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci0lIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0lIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSUKLSUgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSUgYWxvbmcgd2l0aCB0aGlzIHRleGluZm8udGV4IGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotJSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0lIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotJQotJSBJbiBvdGhlciB3b3JkcywgeW91IGFyZSB3ZWxjb21lIHRvIHVzZSwgc2hhcmUgYW5kIGltcHJvdmUgdGhpcyBwcm9ncmFtLgotJSBZb3UgYXJlIGZvcmJpZGRlbiB0byBmb3JiaWQgYW55b25lIGVsc2UgdG8gdXNlLCBzaGFyZSBhbmQgaW1wcm92ZQotJSB3aGF0IHlvdSBnaXZlIHRoZW0uICAgSGVscCBzdGFtcCBvdXQgc29mdHdhcmUtaG9hcmRpbmchCi0lCi0lIFBsZWFzZSB0cnkgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRleGluZm8udGV4IGJlZm9yZSBzdWJtaXR0aW5nIGJ1ZwotJSByZXBvcnRzOyB5b3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbToKLSUgICBmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L3RleGluZm8udGV4Ci0lICAgL2hvbWUvZ2QvZ251L2RvYy90ZXhpbmZvLnRleCBvbiB0aGUgR05VIG1hY2hpbmVzLgotJSAgIChhbmQgYWxsIEdOVSBtaXJyb3JzLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL29yZGVyL2Z0cC5odG1sKQotJSAgIGZ0cDovL3R1Zy5vcmcvdGV4L3RleGluZm8udGV4Ci0lICAgZnRwOi8vY3Rhbi5vcmcvbWFjcm9zL3RleGluZm8vdGV4aW5mby50ZXgKLSUgICAoYW5kIGFsbCBDVEFOIG1pcnJvcnMsIGZpbmdlciBjdGFuQGN0YW4ub3JnIGZvciBhIGxpc3QpLgotJSBUaGUgdGV4aW5mby50ZXggaW4gdGhlIHRleGluZm8gZGlzdHJpYnV0aW9uIGl0c2VsZiBjb3VsZCB3ZWxsIGJlIG91dAotJSBvZiBkYXRlLCBzbyBpZiB0aGF0J3Mgd2hhdCB5b3UncmUgdXNpbmcsIHBsZWFzZSBjaGVjay4KLSUgCi0lIFNlbmQgYnVnIHJlcG9ydHMgdG8gYnVnLXRleGluZm9AZ251Lm9yZy4KLSUgUGxlYXNlIGluY2x1ZGUgYSBwcmVjaXNlIHRlc3QgY2FzZSBpbiBlYWNoIGJ1ZyByZXBvcnQsCi0lIGluY2x1ZGluZyBhIGNvbXBsZXRlIGRvY3VtZW50IHdpdGggd2hpY2ggd2UgY2FuIHJlcHJvZHVjZSB0aGUgcHJvYmxlbS4KLSUgCi0lIFRvIHByb2Nlc3MgYSBUZXhpbmZvIG1hbnVhbCB3aXRoIFRlWCwgaXQncyBtb3N0IHJlbGlhYmxlIHRvIHVzZSB0aGUKLSUgdGV4aTJkdmkgc2hlbGwgc2NyaXB0IHRoYXQgY29tZXMgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgRm9yIHNpbXBsZQotJSBtYW51YWxzLCBob3dldmVyLCB5b3UgY2FuIGdldCBhd2F5IHdpdGg6Ci0lICAgdGV4IGZvby50ZXhpCi0lICAgdGV4aW5kZXggZm9vLj8/Ci0lICAgdGV4IGZvby50ZXhpCi0lICAgdGV4IGZvby50ZXhpCi0lICAgZHZpcHMgZm9vLmR2aSAtbyAjIG9yIHdoYXRldmVyLCB0byBwcm9jZXNzIHRoZSBkdmkgZmlsZS4KLSUgVGhlIGV4dHJhIHJ1bnMgb2YgVGVYIGdldCB0aGUgY3Jvc3MtcmVmZXJlbmNlIGluZm9ybWF0aW9uIGNvcnJlY3QuCi0lIFNvbWV0aW1lcyBvbmUgcnVuIGFmdGVyIHRleGluZGV4IHN1ZmZpY2VzLCBhbmQgc29tZXRpbWVzIHlvdSBuZWVkIG1vcmUKLSUgdGhhbiB0d287IHRleGkyZHZpIGRvZXMgaXQgYXMgbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkuCi0KLQotJSBNYWtlIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSBhIC5mbXQgZmlsZSBqdXN0IGJ5IGxvYWRpbmcgdGhpcyBmaWxlOgotJSBpZiB0aGUgdW5kZXJseWluZyBmb3JtYXQgaXMgbm90IGxvYWRlZCwgc3RhcnQgYnkgbG9hZGluZyBpdCBub3cuCi0lIEFkZGVkIGJ5IGdpbGRlYSBOb3ZlbWJlciAxOTkzLgotXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgZm10bmFtZVxlbmRjc25hbWVccmVsYXhcaW5wdXQgcGxhaW5cZmkKLQotJSBUaGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGUgdmVyc2lvbiBudW1iZXIgYmFzZWQgb24gUkNTLgotXGRlZlxkZWZ0ZXhpbmZvdmVyc2lvbiQjMTogIzIgJHtcZGVmXHRleGluZm92ZXJzaW9ueyMyfX0KLVxkZWZ0ZXhpbmZvdmVyc2lvbiRSZXZpc2lvbiQKLVxtZXNzYWdle0xvYWRpbmcgdGV4aW5mbyBwYWNrYWdlIFtWZXJzaW9uIFx0ZXhpbmZvdmVyc2lvbl06fQotCi0lIElmIGluIGEgLmZtdCBmaWxlLCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIKLSUgYW5kIHR1cm4gb24gYWN0aXZlIGNoYXJhY3RlcnMgdGhhdCB3ZSBjb3VsZG4ndCBkbyBlYXJsaWVyIGJlY2F1c2UKLSUgdGhleSBtaWdodCBoYXZlIGFwcGVhcmVkIGluIHRoZSBpbnB1dCBmaWxlIG5hbWUuCi1cZXZlcnlqb2J7XG1lc3NhZ2V7W1RleGluZm8gdmVyc2lvbiBcdGV4aW5mb3ZlcnNpb25dfVxtZXNzYWdle30KLSAgXGNhdGNvZGVgKz1cYWN0aXZlIFxjYXRjb2RlYFxfPVxhY3RpdmV9Ci0KLSUgU2F2ZSBzb21lIHBhcnRzIG9mIHBsYWluIHRleCB3aG9zZSBuYW1lcyB3ZSB3aWxsIHJlZGVmaW5lLgotCi1cbGV0XHB0ZXhiPVxiCi1cbGV0XHB0ZXhidWxsZXQ9XGJ1bGxldAotXGxldFxwdGV4Yz1cYwotXGxldFxwdGV4Y29tbWE9XCwKLVxsZXRccHRleGRvdD1cLgotXGxldFxwdGV4ZG90cz1cZG90cwotXGxldFxwdGV4ZW5kPVxlbmQKLVxsZXRccHRleGVxdWl2PVxlcXVpdgotXGxldFxwdGV4ZXhjbGFtPVwhCi1cbGV0XHB0ZXhpPVxpCi1cbGV0XHB0ZXhsYnJhY2U9XHsKLVxsZXRccHRleHJicmFjZT1cfQotXGxldFxwdGV4c3Rhcj1cKgotXGxldFxwdGV4dD1cdAotCi0lIFdlIG5ldmVyIHdhbnQgcGxhaW4ncyBvdXRlciBcKyBkZWZpbml0aW9uIGluIFRleGluZm8uCi0lIEZvciBAdGV4LCB3ZSBjYW4gdXNlIFx0YWJhbGlnbi4KLVxsZXRcKyA9IFxyZWxheAotCi0KLVxtZXNzYWdle0Jhc2ljcyx9Ci1cY2hhcmRlZlxvdGhlcj0xMgotCi0lIElmIHRoaXMgY2hhcmFjdGVyIGFwcGVhcnMgaW4gYW4gZXJyb3IgbWVzc2FnZSBvciBoZWxwIHN0cmluZywgaXQKLSUgc3RhcnRzIGEgbmV3IGxpbmUgaW4gdGhlIG91dHB1dC4KLVxuZXdsaW5lY2hhciA9IGBeXkoKLQotJSBTZXQgdXAgZml4ZWQgd29yZHMgZm9yIEVuZ2xpc2ggaWYgbm90IGFscmVhZHkgc2V0LgotXGlmeFxwdXR3b3JkQXBwZW5kaXhcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRBcHBlbmRpeHtBcHBlbmRpeH1cZmkKLVxpZnhccHV0d29yZENoYXB0ZXJcdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkQ2hhcHRlcntDaGFwdGVyfVxmaQotXGlmeFxwdXR3b3JkZmlsZVx1bmRlZmluZWQgICAgIFxnZGVmXHB1dHdvcmRmaWxle2ZpbGV9XGZpCi1caWZ4XHB1dHdvcmRJbmZvXHVuZGVmaW5lZCAgICAgXGdkZWZccHV0d29yZEluZm97SW5mb31cZmkKLVxpZnhccHV0d29yZE1ldGhvZG9uXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTWV0aG9kb257TWV0aG9kIG9ufVxmaQotXGlmeFxwdXR3b3Jkb25cdW5kZWZpbmVkICAgICAgIFxnZGVmXHB1dHdvcmRvbntvbn1cZmkKLVxpZnhccHV0d29yZHBhZ2VcdW5kZWZpbmVkICAgICBcZ2RlZlxwdXR3b3JkcGFnZXtwYWdlfVxmaQotXGlmeFxwdXR3b3Jkc2VjdGlvblx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRzZWN0aW9ue3NlY3Rpb259XGZpCi1caWZ4XHB1dHdvcmRTZWN0aW9uXHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZFNlY3Rpb257U2VjdGlvbn1cZmkKLVxpZnhccHV0d29yZHNlZVx1bmRlZmluZWQgICAgICBcZ2RlZlxwdXR3b3Jkc2Vle3NlZX1cZmkKLVxpZnhccHV0d29yZFNlZVx1bmRlZmluZWQgICAgICBcZ2RlZlxwdXR3b3JkU2Vle1NlZX1cZmkKLVxpZnhccHV0d29yZFNob3J0Q29udGVudHNcdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkU2hvcnRDb250ZW50c3tTaG9ydCBDb250ZW50c31cZmkKLVxpZnhccHV0d29yZFRhYmxlb2ZDb250ZW50c1x1bmRlZmluZWRcZ2RlZlxwdXR3b3JkVGFibGVvZkNvbnRlbnRze1RhYmxlIG9mIENvbnRlbnRzfVxmaQotCi0lIElnbm9yZSBhIHRva2VuLgotJQotXGRlZlxnb2JibGUjMXt9Ci0KLVxoeXBoZW5hdGlvbnthcC1wZW4tZGl4fQotXGh5cGhlbmF0aW9ue21pbmktYnVmLWZlciBtaW5pLWJ1Zi1mZXJzfQotXGh5cGhlbmF0aW9ue2VzaGVsbH0KLVxoeXBoZW5hdGlvbnt3aGl0ZS1zcGFjZX0KLQotJSBNYXJnaW4gdG8gYWRkIHRvIHJpZ2h0IG9mIGV2ZW4gcGFnZXMsIHRvIGxlZnQgb2Ygb2RkIHBhZ2VzLgotXG5ld2RpbWVuIFxiaW5kaW5nb2Zmc2V0Ci1cbmV3ZGltZW4gXG5vcm1hbG9mZnNldAotXG5ld2RpbWVuXHBhZ2V3aWR0aCBcbmV3ZGltZW5ccGFnZWhlaWdodAotCi0lIFNvbWV0aW1lcyBpdCBpcyBjb252ZW5pZW50IHRvIGhhdmUgZXZlcnl0aGluZyBpbiB0aGUgdHJhbnNjcmlwdCBmaWxlCi0lIGFuZCBub3RoaW5nIG9uIHRoZSB0ZXJtaW5hbC4gIFdlIGRvbid0IGp1c3QgY2FsbCBcdHJhY2luZ2FsbCBoZXJlLAotJSBzaW5jZSB0aGF0IHByb2R1Y2VzIHNvbWUgdXNlbGVzcyBvdXRwdXQgb24gdGhlIHRlcm1pbmFsLgotJQotXGRlZlxnbG9nZ2luZ2FsbHtcYmVnaW5ncm91cCBcZ2xvYmFsZGVmcyA9IDEgXGxvZ2dpbmdhbGwgXGVuZGdyb3VwfSUKLVxpZnhcZVRlWHZlcnNpb25cdW5kZWZpbmVkCi1cZGVmXGxvZ2dpbmdhbGx7XHRyYWNpbmdjb21tYW5kczIgXHRyYWNpbmdzdGF0czIKLSAgIFx0cmFjaW5ncGFnZXMxIFx0cmFjaW5nb3V0cHV0MSBcdHJhY2luZ2xvc3RjaGFyczEKLSAgIFx0cmFjaW5nbWFjcm9zMiBcdHJhY2luZ3BhcmFncmFwaHMxIFx0cmFjaW5ncmVzdG9yZXMxCi0gICBcc2hvd2JveGJyZWFkdGhcbWF4ZGltZW5cc2hvd2JveGRlcHRoXG1heGRpbWVuCi19JQotXGVsc2UKLVxkZWZcbG9nZ2luZ2FsbHtcdHJhY2luZ2NvbW1hbmRzMyBcdHJhY2luZ3N0YXRzMgotICAgXHRyYWNpbmdwYWdlczEgXHRyYWNpbmdvdXRwdXQxIFx0cmFjaW5nbG9zdGNoYXJzMQotICAgXHRyYWNpbmdtYWNyb3MyIFx0cmFjaW5ncGFyYWdyYXBoczEgXHRyYWNpbmdyZXN0b3JlczEKLSAgIFx0cmFjaW5nc2NhbnRva2VuczEgXHRyYWNpbmdhc3NpZ25zMSBcdHJhY2luZ2lmczEKLSAgIFx0cmFjaW5nZ3JvdXBzMSBcdHJhY2luZ25lc3RpbmcyCi0gICBcc2hvd2JveGJyZWFkdGhcbWF4ZGltZW5cc2hvd2JveGRlcHRoXG1heGRpbWVuCi19JQotXGZpCi0KLSUgRm9yIEBjcm9wbWFya3MgY29tbWFuZC4KLSUgRG8gQGNyb3BtYXJrcyB0byBnZXQgY3JvcCBtYXJrcy4KLSUgCi1cbmV3aWZcaWZjcm9wbWFya3MKLVxsZXRcY3JvcG1hcmtzID0gXGNyb3BtYXJrc3RydWUKLSUKLSUgRGltZW5zaW9ucyB0byBhZGQgY3JvcG1hcmtzIGF0IGNvcm5lcnMuCi0lIEFkZGVkIGJ5IFAuIEEuIE1hY0theSwgMTIgTm92LiAxOTg2Ci0lCi1cbmV3ZGltZW5cb3V0ZXJoc2l6ZSBcbmV3ZGltZW5cb3V0ZXJ2c2l6ZSAlIHNldCBieSB0aGUgcGFwZXIgc2l6ZSByb3V0aW5lcwotXG5ld2RpbWVuXGNvcm5lcmxvbmcgIFxjb3JuZXJsb25nPTFwYwotXG5ld2RpbWVuXGNvcm5lcnRoaWNrIFxjb3JuZXJ0aGljaz0uM3B0Ci1cbmV3ZGltZW5cdG9wYW5kYm90dG9tbWFyZ2luIFx0b3BhbmRib3R0b21tYXJnaW49Ljc1aW4KLQotJSBNYWluIG91dHB1dCByb3V0aW5lLgotXGNoYXJkZWZcUEFHRSA9IDI1NQotXG91dHB1dCA9IHtcb25lcGFnZW91dHtccGFnZWNvbnRlbnRzXFBBR0V9fQotCi1cbmV3Ym94XGhlYWRsaW5lYm94Ci1cbmV3Ym94XGZvb3RsaW5lYm94Ci0KLSUgXG9uZXBhZ2VvdXQgdGFrZXMgYSB2Ym94IGFzIGFuIGFyZ3VtZW50LiAgTm90ZSB0aGF0IFxwYWdlY29udGVudHMKLSUgZG9lcyBpbnNlcnRpb25zLCBidXQgeW91IGhhdmUgdG8gY2FsbCBpdCB5b3Vyc2VsZi4KLVxkZWZcb25lcGFnZW91dCMxeyUKLSAgXGlmY3JvcG1hcmtzIFxob2Zmc2V0PTBwdCBcZWxzZSBcaG9mZnNldD1cbm9ybWFsb2Zmc2V0IFxmaQotICAlCi0gIFxpZm9kZFxwYWdlbm8gIFxhZHZhbmNlXGhvZmZzZXQgYnkgXGJpbmRpbmdvZmZzZXQKLSAgXGVsc2UgXGFkdmFuY2VcaG9mZnNldCBieSAtXGJpbmRpbmdvZmZzZXRcZmkKLSAgJQotICAlIERvIHRoaXMgb3V0c2lkZSBvZiB0aGUgXHNoaXBvdXQgc28gQGNvZGUgZXRjLiB3aWxsIGJlIGV4cGFuZGVkIGluCi0gICUgdGhlIGhlYWRsaW5lIGFzIHRoZXkgc2hvdWxkIGJlLCBub3QgdGFrZW4gbGl0ZXJhbGx5IChvdXRwdXR0aW5nICcnY29kZSkuCi0gIFxzZXRib3hcaGVhZGxpbmVib3ggPSBcdmJveHtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2VoZWFkbGluZX0lCi0gIFxzZXRib3hcZm9vdGxpbmVib3ggPSBcdmJveHtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2Vmb290bGluZX0lCi0gICUKLSAgeyUKLSAgICAlIEhhdmUgdG8gZG8gdGhpcyBzdHVmZiBvdXRzaWRlIHRoZSBcc2hpcG91dCBiZWNhdXNlIHdlIHdhbnQgaXQgdG8KLSAgICAlIHRha2UgZWZmZWN0IGluIFx3cml0ZSdzLCB5ZXQgdGhlIGdyb3VwIGRlZmluZWQgYnkgdGhlIFx2Ym94IGVuZHMKLSAgICAlIGJlZm9yZSB0aGUgXHNoaXBvdXQgcnVucy4KLSAgICAlCi0gICAgXGVzY2FwZWNoYXIgPSBgXFwgICAgICUgdXNlIGJhY2tzbGFzaCBpbiBvdXRwdXQgZmlsZXMuCi0gICAgXGluZGV4ZHVtbWllcyAgICAgICAgICUgZG9uJ3QgZXhwYW5kIGNvbW1hbmRzIGluIHRoZSBvdXRwdXQuCi0gICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUgICUgXCBpbiBpbmRleCBlbnRyaWVzIG11c3Qgbm90IHN0YXkgXCwgZS5nLiwgaWYKLSAgICAgICAgICAgICAgICAgICAlIHRoZSBwYWdlIGJyZWFrIGhhcHBlbnMgdG8gYmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBleGFtcGxlLgotICAgIFxzaGlwb3V0XHZib3h7JQotICAgICAgXGlmY3JvcG1hcmtzIFx2Ym94IHRvIFxvdXRlcnZzaXplXGJncm91cAotICAgICAgICBcaHNpemUgPSBcb3V0ZXJoc2l6ZQotICAgICAgICBcbGluZXtcZXd0b3BcaGZpbFxld3RvcH0lCi0gICAgICAgIFxub2ludGVybGluZXNraXAKLSAgICAgICAgXGxpbmV7JQotICAgICAgICAgIFx2Ym94e1xtb3ZlbGVmdFxjb3JuZXJ0aGlja1xuc3RvcH0lCi0gICAgICAgICAgXGhmaWxsCi0gICAgICAgICAgXHZib3h7XG1vdmVyaWdodFxjb3JuZXJ0aGlja1xuc3RvcH0lCi0gICAgICAgIH0lCi0gICAgICAgIFx2c2tpcFx0b3BhbmRib3R0b21tYXJnaW4KLSAgICAgICAgXGxpbmVcYmdyb3VwCi0gICAgICAgICAgXGhmaWwgJSBjZW50ZXIgdGhlIHBhZ2Ugd2l0aGluIHRoZSBvdXRlciAocGFnZSkgaHNpemUuCi0gICAgICAgICAgXGlmb2RkXHBhZ2Vub1xoc2tpcFxiaW5kaW5nb2Zmc2V0XGZpCi0gICAgICAgICAgXHZib3hcYmdyb3VwCi0gICAgICBcZmkKLSAgICAgICUKLSAgICAgIFx1bnZib3hcaGVhZGxpbmVib3gKLSAgICAgIFxwYWdlYm9keXsjMX0lCi0gICAgICBcaWZkaW1caHRcZm9vdGxpbmVib3ggPiAwcHQKLSAgICAgICAgJSBPbmx5IGxlYXZlIHRoaXMgc3BhY2UgaWYgdGhlIGZvb3RsaW5lIGlzIG5vbmVtcHR5LgotICAgICAgICAlIChXZSBsZXNzZW5lZCBcdnNpemUgZm9yIGl0IGluIFxvZGRmb290aW5neHh4LikKLSAgICAgICAgJSBUaGUgXGJhc2VsaW5lc2tpcD0yNHB0IGluIHBsYWluJ3MgXG1ha2Vmb290bGluZSBoYXMgbm8gZWZmZWN0LgotICAgICAgICBcdnNraXAgMlxiYXNlbGluZXNraXAKLSAgICAgICAgXHVudmJveFxmb290bGluZWJveAotICAgICAgXGZpCi0gICAgICAlCi0gICAgICBcaWZjcm9wbWFya3MKLSAgICAgICAgICBcZWdyb3VwICUgZW5kIG9mIFx2Ym94XGJncm91cAotICAgICAgICBcaGZpbFxlZ3JvdXAgJSBlbmQgb2YgKGNlbnRlcmluZykgXGxpbmVcYmdyb3VwCi0gICAgICAgIFx2c2tpcFx0b3BhbmRib3R0b21tYXJnaW4gcGx1czFmaWxsIG1pbnVzMWZpbGwKLSAgICAgICAgXGJveG1heGRlcHRoID0gXGNvcm5lcnRoaWNrCi0gICAgICAgIFxsaW5leyUKLSAgICAgICAgICBcdmJveHtcbW92ZWxlZnRcY29ybmVydGhpY2tcbnNib3R9JQotICAgICAgICAgIFxoZmlsbAotICAgICAgICAgIFx2Ym94e1xtb3ZlcmlnaHRcY29ybmVydGhpY2tcbnNib3R9JQotICAgICAgICB9JQotICAgICAgICBcbm9pbnRlcmxpbmVza2lwCi0gICAgICAgIFxsaW5le1xld2JvdFxoZmlsXGV3Ym90fSUKLSAgICAgIFxlZ3JvdXAgJSBcdmJveCBmcm9tIGZpcnN0IGNyb3BtYXJrcyBjbGF1c2UKLSAgICAgIFxmaQotICAgIH0lIGVuZCBvZiBcc2hpcG91dFx2Ym94Ci0gIH0lIGVuZCBvZiBncm91cCB3aXRoIFx0dXJub2ZmYWN0aXZlCi0gIFxhZHZhbmNlcGFnZW5vCi0gIFxpZm51bVxvdXRwdXRwZW5hbHR5Pi0yMDAwMCBcZWxzZVxkb3N1cGVyZWplY3RcZmkKLX0KLQotXG5ld2luc2VydFxtYXJnaW4gXGRpbWVuXG1hcmdpbj1cbWF4ZGltZW4KLQotXGRlZlxwYWdlYm9keSMxe1x2Ym94IHRvXHBhZ2VoZWlnaHR7XGJveG1heGRlcHRoPVxtYXhkZXB0aCAjMX19Ci17XGNhdGNvZGVgXEAgPTExCi1cZ2RlZlxwYWdlY29udGVudHMjMXtcaWZ2b2lkXHRvcGluc1xlbHNlXHVudmJveFx0b3BpbnNcZmkKLSUgbWFyZ2luYWwgaGFja3MsIGp1aGFAdmlpc2EudXVjcCAoSnVoYSBUYWthbGEpCi1caWZ2b2lkXG1hcmdpblxlbHNlICUgbWFyZ2luYWwgaW5mbyBpcyBwcmVzZW50Ci0gIFxybGFwe1xrZXJuXGhzaXplXHZib3ggdG9cekB7XGtlcm4xcHRcYm94XG1hcmdpbiBcdnNzfX1cZmkKLVxkaW1lbkA9XGRwIzEgXHVudmJveCMxCi1caWZ2b2lkXGZvb3RpbnNcZWxzZVx2c2tpcFxza2lwXGZvb3RpbnNcZm9vdG5vdGVydWxlIFx1bnZib3hcZm9vdGluc1xmaQotXGlmckBnZ2VkYm90dG9tIFxrZXJuLVxkaW1lbkAgXHZmaWwgXGZpfQotfQotCi0lIEhlcmUgYXJlIHRoZSBydWxlcyBmb3IgdGhlIGNyb3BtYXJrcy4gIE5vdGUgdGhhdCB0aGV5IGFyZQotJSBvZmZzZXQgc28gdGhhdCB0aGUgc3BhY2UgYmV0d2VlbiB0aGVtIGlzIHRydWx5IFxvdXRlcmhzaXplIG9yIFxvdXRlcnZzaXplCi0lIChQLiBBLiBNYWNLYXksIDEyIE5vdmVtYmVyLCAxOTg2KQotJQotXGRlZlxld3RvcHtcdnJ1bGUgaGVpZ2h0XGNvcm5lcnRoaWNrIGRlcHRoMHB0IHdpZHRoXGNvcm5lcmxvbmd9Ci1cZGVmXG5zdG9we1x2Ym94Ci0gIHtcaHJ1bGUgaGVpZ2h0XGNvcm5lcnRoaWNrIGRlcHRoXGNvcm5lcmxvbmcgd2lkdGhcY29ybmVydGhpY2t9fQotXGRlZlxld2JvdHtcdnJ1bGUgaGVpZ2h0MHB0IGRlcHRoXGNvcm5lcnRoaWNrIHdpZHRoXGNvcm5lcmxvbmd9Ci1cZGVmXG5zYm90e1x2Ym94Ci0gIHtcaHJ1bGUgaGVpZ2h0XGNvcm5lcmxvbmcgZGVwdGhcY29ybmVydGhpY2sgd2lkdGhcY29ybmVydGhpY2t9fQotCi0lIFBhcnNlIGFuIGFyZ3VtZW50LCB0aGVuIHBhc3MgaXQgdG8gIzEuICBUaGUgYXJndW1lbnQgaXMgdGhlIHJlc3Qgb2YKLSUgdGhlIGlucHV0IGxpbmUgKGV4Y2VwdCB3ZSByZW1vdmUgYSB0cmFpbGluZyBjb21tZW50KS4gICMxIHNob3VsZCBiZSBhCi0lIG1hY3JvIHdoaWNoIGV4cGVjdHMgYW4gb3JkaW5hcnkgdW5kZWxpbWl0ZWQgVGVYIGFyZ3VtZW50LgotJQotXGRlZlxwYXJzZWFyZyMxeyUKLSAgXGxldFxuZXh0ID0gIzElCi0gIFxiZWdpbmdyb3VwCi0gICAgXG9iZXlsaW5lcwotICAgIFxmdXR1cmVsZXRcdGVtcFxwYXJzZWFyZ3gKLX0KLQotJSBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhbiBvYmV5ZWQgc3BhY2UgKGZyb20gYW4gQGV4YW1wbGUgZW52aXJvbm1lbnQgb3IKLSUgdGhlIGxpa2UpLCByZW1vdmUgaXQgYW5kIHJlY3Vyc2UuICBPdGhlcndpc2UsIHdlJ3JlIGRvbmUuCi1cZGVmXHBhcnNlYXJneHslCi0gICUgXG9iZXllZHNwYWNlIGlzIGRlZmluZWQgZmFyIGJlbG93LCBhZnRlciB0aGUgZGVmaW5pdGlvbiBvZiBcc2Vwc3BhY2VzLgotICBcaWZ4XG9iZXllZHNwYWNlXHRlbXAKLSAgICBcZXhwYW5kYWZ0ZXJccGFyc2VhcmdkaXNjYXJkc3BhY2UKLSAgXGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJccGFyc2VhcmdsaW5lCi0gIFxmaQotfQotCi0lIFJlbW92ZSBhIHNpbmdsZSBzcGFjZSAoYXMgdGhlIGRlbGltaXRlciB0b2tlbiB0byB0aGUgbWFjcm8gY2FsbCkuCi17XG9iZXlzcGFjZXMgJQotIFxnZGVmXHBhcnNlYXJnZGlzY2FyZHNwYWNlIHtcZnV0dXJlbGV0XHRlbXBccGFyc2Vhcmd4fX0KLQote1xvYmV5bGluZXMgJQotICBcZ2RlZlxwYXJzZWFyZ2xpbmUjMV5eTXslCi0gICAgXGVuZGdyb3VwICUgRW5kIG9mIHRoZSBncm91cCBzdGFydGVkIGluIFxwYXJzZWFyZy4KLSAgICAlCi0gICAgJSBGaXJzdCByZW1vdmUgYW55IEBjIGNvbW1lbnQsIHRoZW4gYW55IEBjb21tZW50LgotICAgICUgUmVzdWx0IG9mIGVhY2ggbWFjcm8gaXMgcHV0IGluIFx0b2tzMC4KLSAgICBcYXJncmVtb3ZlYyAjMVxjXHJlbGF4ICUKLSAgICBcZXhwYW5kYWZ0ZXJcYXJncmVtb3ZlY29tbWVudCBcdGhlXHRva3MwIFxjb21tZW50XHJlbGF4ICUKLSAgICAlCi0gICAgJSBDYWxsIHRoZSBjYWxsZXIncyBtYWNybywgc2F2ZWQgYXMgXG5leHQgaW4gXHBhcnNlYXJnLgotICAgIFxleHBhbmRhZnRlclxuZXh0XGV4cGFuZGFmdGVye1x0aGVcdG9rczB9JQotICB9JQotfQotCi0lIFNpbmNlIGFsbCBcY3ssb21tZW50fSBkb2VzIGlzIHRocm93IGF3YXkgdGhlIGFyZ3VtZW50LCB3ZSBjYW4gbGV0IFRlWAotJSBkbyB0aGF0IGZvciB1cy4gIFRoZSBccmVsYXggaGVyZSBpcyBtYXRjaGVkIGJ5IHRoZSBccmVsYXggaW4gdGhlIGNhbGwKLSUgaW4gXHBhcnNlYXJnbGluZTsgaXQgY291bGQgYmUgbW9yZSBvciBsZXNzIGFueXRoaW5nLCBpdHMgcHVycG9zZSBpcwotJSBqdXN0IHRvIGRlbGltaXQgdGhlIGFyZ3VtZW50IHRvIHRoZSBcYy4KLVxkZWZcYXJncmVtb3ZlYyMxXGMjMlxyZWxheHtcdG9rczAgPSB7IzF9fQotXGRlZlxhcmdyZW1vdmVjb21tZW50IzFcY29tbWVudCMyXHJlbGF4e1x0b2tzMCA9IHsjMX19Ci0KLSUgXGFyZ3JlbW92ZWN7LG9tbWVudH0gbWlnaHQgbGVhdmUgdXMgd2l0aCB0cmFpbGluZyBzcGFjZXMsIHRob3VnaDsgZS5nLiwKLSUgICAgQGVuZCBpdGVtaXplICBAYyBmb28KLSUgd2lsbCBoYXZlIHR3byBhY3RpdmUgc3BhY2VzIGFzIHBhcnQgb2YgdGhlIGFyZ3VtZW50IHdpdGggdGhlCi0lIGBpdGVtaXplJy4gIEhlcmUgd2UgcmVtb3ZlIGFsbCBhY3RpdmUgc3BhY2VzIGZyb20gIzEsIGFuZCBhc3NpZ24gdGhlCi0lIHJlc3VsdCB0byBcdG9rczAuCi0lCi0lIFRoaXMgbG9zZXMgaWYgdGhlcmUgYXJlIGFueSAqb3RoZXIqIGFjdGl2ZSBjaGFyYWN0ZXJzIGJlc2lkZXMgc3BhY2VzCi0lIGluIHRoZSBhcmd1bWVudCAtLSBfIF4gKywgZm9yIGV4YW1wbGUgLS0gc2luY2UgdGhleSBnZXQgZXhwYW5kZWQuCi0lIEZvcnR1bmF0ZWx5LCBUZXhpbmZvIGRvZXMgbm90IGRlZmluZSBhbnkgc3VjaCBjb21tYW5kcy4gIChJZiBpdCBldmVyCi0lIGRvZXMsIHRoZSBjYXRjb2RlIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHF1ZXN0aW9ud2lsbCBoYXZlIHRvIGJlIGNoYW5nZWQKLSUgaGVyZS4pICBCdXQgdGhpcyBtZWFucyB3ZSBjYW5ub3QgY2FsbCBccmVtb3ZlYWN0aXZlc3BhY2VzIGFzIHBhcnQgb2YKLSUgXGFyZ3JlbW92ZWN7LG9tbWVudH0sIHNpbmNlIEBjIHVzZXMgXHBhcnNlYXJnLCBhbmQgdGh1cyB0aGUgYXJndW1lbnQKLSUgdGhhdCBccGFyc2VhcmcgZ2V0cyBtaWdodCB3ZWxsIGhhdmUgYW55IGNoYXJhY3RlciBhdCBhbGwgaW4gaXQuCi0lCi1cZGVmXHJlbW92ZWFjdGl2ZXNwYWNlcyMxeyUKLSAgXGJlZ2luZ3JvdXAKLSAgICBcaWdub3JlYWN0aXZlc3BhY2VzCi0gICAgXGVkZWZcdGVtcHsjMX0lCi0gICAgXGdsb2JhbFx0b2tzMCA9IFxleHBhbmRhZnRlcntcdGVtcH0lCi0gIFxlbmRncm91cAotfQotCi0lIENoYW5nZSB0aGUgYWN0aXZlIHNwYWNlIHRvIGV4cGFuZCB0byBub3RoaW5nLgotJQotXGJlZ2luZ3JvdXAKLSAgXG9iZXlzcGFjZXMKLSAgXGdkZWZcaWdub3JlYWN0aXZlc3BhY2Vze1xvYmV5c3BhY2VzXGxldCA9XGVtcHR5fQotXGVuZGdyb3VwCi0KLQotXGRlZlxmbHVzaGNye1xpZnhccGFyXGxpc3BwYXIgXGRlZlxuZXh0IyMxe31cZWxzZSBcbGV0XG5leHQ9XHJlbGF4IFxmaSBcbmV4dH0KLQotJSUgVGhlc2UgYXJlIHVzZWQgdG8ga2VlcCBAYmVnaW4vQGVuZCBsZXZlbHMgZnJvbSBydW5uaW5nIGF3YXkKLSUlIENhbGwgXGluRU5WIHdpdGhpbiBlbnZpcm9ubWVudHMgKGFmdGVyIGEgXGJlZ2luZ3JvdXApCi1cbmV3aWZcaWZFTlYgXEVOVmZhbHNlIFxkZWZcaW5FTlZ7XGlmRU5WXHJlbGF4XGVsc2VcRU5WdHJ1ZVxmaX0KLVxkZWZcRU5WY2hlY2t7JQotXGlmRU5WXGVycm1lc3NhZ2V7U3RpbGwgd2l0aGluIGFuIGVudmlyb25tZW50OyBwcmVzcyBSRVRVUk4gdG8gY29udGludWV9Ci1cZW5kZ3JvdXBcZml9ICUgVGhpcyBpcyBub3QgcGVyZmVjdCwgYnV0IGl0IHNob3VsZCByZWR1Y2UgbG9zc2FnZQotCi0lIEBiZWdpbiBmb28gIGlzIHRoZSBzYW1lIGFzIEBmb28sIGZvciBub3cuCi1cbmV3aGVscFxFTXNpbXBsZXtQcmVzcyBSRVRVUk4gdG8gY29udGludWUufQotCi1cb3V0ZXJcZGVmXGJlZ2lue1xwYXJzZWFyZ1xiZWdpbnh4eH0KLQotXGRlZlxiZWdpbnh4eCAjMXslCi1cZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSAjMVxlbmRjc25hbWVccmVsYXgKLXtcZXJyaGVscD1cRU1zaW1wbGUgXGVycm1lc3NhZ2V7VW5kZWZpbmVkIGNvbW1hbmQgQGJlZ2luICMxfX1cZWxzZQotXGNzbmFtZSAjMVxlbmRjc25hbWVcZml9Ci0KLSUgQGVuZCBmb28gZXhlY3V0ZXMgdGhlIGRlZmluaXRpb24gb2YgXEVmb28uCi0lCi1cZGVmXGVuZHtccGFyc2VhcmdcZW5keHh4fQotXGRlZlxlbmR4eHggIzF7JQotICBccmVtb3ZlYWN0aXZlc3BhY2VzeyMxfSUKLSAgXGVkZWZcZW5kdGhpbmd7XHRoZVx0b2tzMH0lCi0gICUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgRVxlbmR0aGluZ1xlbmRjc25hbWVccmVsYXgKLSAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBcZW5kdGhpbmdcZW5kY3NuYW1lXHJlbGF4Ci0gICAgICAlIFRoZXJlJ3Mgbm8gXGZvbywgaS5lLiwgbm8gYGBlbnZpcm9ubWVudCcnIGZvby4KLSAgICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCi0gICAgICBcZXJybWVzc2FnZXtVbmRlZmluZWQgY29tbWFuZCBgQGVuZCBcZW5kdGhpbmcnfSUKLSAgICBcZWxzZQotICAgICAgXHVubWF0Y2hlZGVuZGVycm9yXGVuZHRoaW5nCi0gICAgXGZpCi0gIFxlbHNlCi0gICAgJSBFdmVyeXRoaW5nJ3Mgb2s7IHRoZSByaWdodCBlbnZpcm9ubWVudCBoYXMgYmVlbiBzdGFydGVkLgotICAgIFxjc25hbWUgRVxlbmR0aGluZ1xlbmRjc25hbWUKLSAgXGZpCi19Ci0KLSUgVGhlcmUgaXMgYW4gZW52aXJvbm1lbnQgIzEsIGJ1dCBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkLiAgR2l2ZSBhbiBlcnJvci4KLSUKLVxkZWZcdW5tYXRjaGVkZW5kZXJyb3IjMXslCi0gIFxlcnJoZWxwID0gXEVNc2ltcGxlCi0gIFxlcnJtZXNzYWdle1RoaXMgYEBlbmQgIzEnIGRvZXNuJ3QgaGF2ZSBhIG1hdGNoaW5nIGBAIzEnfSUKLX0KLQotJSBEZWZpbmUgdGhlIGNvbnRyb2wgc2VxdWVuY2UgXEUjMSB0byBnaXZlIGFuIHVubWF0Y2hlZCBAZW5kIGVycm9yLgotJQotXGRlZlxkZWZpbmV1bm1hdGNoZWRlbmQjMXslCi0gIFxleHBhbmRhZnRlclxkZWZcY3NuYW1lIEUjMVxlbmRjc25hbWV7XHVubWF0Y2hlZGVuZGVycm9yeyMxfX0lCi19Ci0KLQotJSBTaW5nbGUtc3BhY2luZyBpcyBkb25lIGJ5IHZhcmlvdXMgZW52aXJvbm1lbnRzIChzcGVjaWZpY2FsbHksIGluCi0lIFxub25maWxsc3RhcnQgYW5kIFxxdW90YXRpb25zKS4KLVxuZXdza2lwXHNpbmdsZXNwYWNlc2tpcCBcc2luZ2xlc3BhY2Vza2lwID0gMTIuNXB0Ci1cZGVmXHNpbmdsZXNwYWNleyUKLSAgJSBXaHkgd2FzIHRoaXMga2VybiBoZXJlPyAgSXQgbWVzc2VzIHVwIGVxdWFsaXppbmcgc3BhY2UgYWJvdmUgYW5kIGJlbG93Ci0gICUgZW52aXJvbm1lbnRzLiAgLS1rYXJsLCA2bWF5OTMKLSAgJXtcYWR2YW5jZSBcYmFzZWxpbmVza2lwIGJ5IC1cc2luZ2xlc3BhY2Vza2lwCi0gICVca2VybiBcYmFzZWxpbmVza2lwfSUKLSAgXHNldGxlYWRpbmcgXHNpbmdsZXNwYWNlc2tpcAotfQotCi0lJSBTaW1wbGUgc2luZ2xlLWNoYXJhY3RlciBAIGNvbW1hbmRzCi0KLSUgQEAgcHJpbnRzIGFuIEAKLSUgS2x1ZGdlIHRoaXMgdW50aWwgdGhlIGZvbnRzIGFyZSByaWdodCAoZ3JyKS4KLVxkZWZcQHt7XHR0XGNoYXI2NH19Ci0KLSUgVGhpcyBpcyB0dXJuZWQgb2ZmIGJlY2F1c2UgaXQgd2FzIG5ldmVyIGRvY3VtZW50ZWQKLSUgYW5kIHlvdSBjYW4gdXNlIEB3ey4uLn0gYXJvdW5kIGEgcXVvdGUgdG8gc3VwcHJlc3MgbGlnYXR1cmVzLgotJSUgRGVmaW5lIEBgIGFuZCBAJyB0byBiZSB0aGUgc2FtZSBhcyBgIGFuZCAnCi0lJSBidXQgc3VwcHJlc3NpbmcgbGlnYXR1cmVzLgotJVxkZWZcYHt7YH19Ci0lXGRlZlwne3snfX0KLQotJSBVc2VkIHRvIGdlbmVyYXRlIHF1b3RlZCBicmFjZXMuCi1cZGVmXG15bGJyYWNlIHt7XHR0XGNoYXIxMjN9fQotXGRlZlxteXJicmFjZSB7e1x0dFxjaGFyMTI1fX0KLVxsZXRcez1cbXlsYnJhY2UKLVxsZXRcfT1cbXlyYnJhY2UKLVxiZWdpbmdyb3VwCi0gICUgRGVmaW5pdGlvbnMgdG8gcHJvZHVjZSBhY3R1YWwgXHsgJiBcfSBjb21tYW5kIGluIGFuIGluZGV4LgotICBcY2F0Y29kZWBceyA9IDEyIFxjYXRjb2RlYFx9ID0gMTIKLSAgXGNhdGNvZGVgXFsgPSAxIFxjYXRjb2RlYFxdID0gMgotICBcY2F0Y29kZWBcQCA9IDAgXGNhdGNvZGVgXFwgPSAxMgotICBAZ2RlZkBsYnJhY2VjbWRbXHtdJQotICBAZ2RlZkByYnJhY2VjbWRbXH1dJQotQGVuZGdyb3VwCi0KLSUgQWNjZW50czogQCwgQGRvdGFjY2VudCBAcmluZ2FjY2VudCBAdWJhcmFjY2VudCBAdWRvdGFjY2VudAotJSBPdGhlcnMgYXJlIGRlZmluZWQgYnkgcGxhaW4gVGVYOiBAYCBAJyBAIiBAXiBAfiBAPSBAdiBASC4KLVxsZXRcLCA9IFxjCi1cbGV0XGRvdGFjY2VudCA9IFwuCi1cZGVmXHJpbmdhY2NlbnQjMXt7XGFjY2VudDIzICMxfX0KLVxsZXRcdGllYWNjZW50ID0gXHQKLVxsZXRcdWJhcmFjY2VudCA9IFxiCi1cbGV0XHVkb3RhY2NlbnQgPSBcZAotCi0lIE90aGVyIHNwZWNpYWwgY2hhcmFjdGVyczogQHF1ZXN0aW9uZG93biBAZXhjbGFtZG93bgotJSBQbGFpbiBUZVggZGVmaW5lczogQEFBIEBBRSBATyBAT0UgQEwgKGFuZCBsb3dlcmNhc2UgdmVyc2lvbnMpIEBzcy4KLVxkZWZccXVlc3Rpb25kb3duez9gfQotXGRlZlxleGNsYW1kb3dueyFgfQotCi0lIERvdGxlc3MgaSBhbmQgZG90bGVzcyBqLCB1c2VkIGZvciBhY2NlbnRzLgotXGRlZlxpbWFjcm97aX0KLVxkZWZcam1hY3Jve2p9Ci1cZGVmXGRvdGxlc3MjMXslCi0gIFxkZWZcdGVtcHsjMX0lCi0gIFxpZnhcdGVtcFxpbWFjcm8gXHB0ZXhpCi0gIFxlbHNlXGlmeFx0ZW1wXGptYWNybyBcagotICBcZWxzZSBcZXJybWVzc2FnZXtAZG90bGVzcyBjYW4gYmUgdXNlZCBvbmx5IHdpdGggaSBvciBqfSUKLSAgXGZpXGZpCi19Ci0KLSUgQmUgc3VyZSB3ZSdyZSBpbiBob3Jpem9udGFsIG1vZGUgd2hlbiBkb2luZyBhIHRpZSwgc2luY2Ugd2UgbWFrZSBzcGFjZQotJSBlcXVpdmFsZW50IHRvIHRoaXMgaW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudHMuIE90aGVyd2lzZSwgYSBzcGFjZQotJSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aWxsIHN0YXJ0IHdpdGggXHBlbmFsdHkgLS0gYW5kCi0lIHNpbmNlIFxwZW5hbHR5IGlzIHZhbGlkIGluIHZlcnRpY2FsIG1vZGUsIHdlJ2QgZW5kIHVwIHB1dHRpbmcgdGhlCi0lIHBlbmFsdHkgb24gdGhlIHZlcnRpY2FsIGxpc3QgaW5zdGVhZCBvZiBpbiB0aGUgbmV3IHBhcmFncmFwaC4KLXtcY2F0Y29kZWBAID0gMTEKLSAlIEF2b2lkIHVzaW5nIFxATSBkaXJlY3RseSwgYmVjYXVzZSB0aGF0IGNhdXNlcyB0cm91YmxlCi0gJSBpZiB0aGUgZGVmaW5pdGlvbiBpcyB3cml0dGVuIGludG8gYW4gaW5kZXggZmlsZS4KLSBcZ2xvYmFsXGxldFx0aWVwZW5hbHR5ID0gXEBNCi0gXGdkZWZcdGlle1xsZWF2ZXZtb2RlXHBlbmFsdHlcdGllcGVuYWx0eVwgfQotfQotCi0lIEA6IGZvcmNlcyBub3JtYWwgc2l6ZSB3aGl0ZXNwYWNlIGZvbGxvd2luZy4KLVxkZWZcOntcc3BhY2VmYWN0b3I9MTAwMCB9Ci0KLSUgQCogZm9yY2VzIGEgbGluZSBicmVhay4KLVxkZWZcKntcaGZpbFxicmVha1xoYm94e31caWdub3Jlc3BhY2VzfQotCi0lIEAuIGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBwZXJpb2QuCi1cZGVmXC57LlxzcGFjZWZhY3Rvcj0zMDAwIH0KLQotJSBAISBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgYmFuZy4KLVxkZWZcIXshXHNwYWNlZmFjdG9yPTMwMDAgfQotCi0lIEA/IGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBxdWVyeS4KLVxkZWZcP3s/XHNwYWNlZmFjdG9yPTMwMDAgfQotCi0lIEB3IHByZXZlbnRzIGEgd29yZCBicmVhay4gIFdpdGhvdXQgdGhlIFxsZWF2ZXZtb2RlLCBAdyBhdCB0aGUKLSUgYmVnaW5uaW5nIG9mIGEgcGFyYWdyYXBoLCB3aGVuIFRlWCBpcyBzdGlsbCBpbiB2ZXJ0aWNhbCBtb2RlLCB3b3VsZAotJSBwcm9kdWNlIGEgd2hvbGUgbGluZSBvZiBvdXRwdXQgaW5zdGVhZCBvZiBzdGFydGluZyB0aGUgcGFyYWdyYXBoLgotXGRlZlx3IzF7XGxlYXZldm1vZGVcaGJveHsjMX19Ci0KLSUgQGdyb3VwIC4uLiBAZW5kIGdyb3VwIGZvcmNlcyAuLi4gdG8gYmUgYWxsIG9uIG9uZSBwYWdlLCBieSBlbmNsb3NpbmcKLSUgaXQgaW4gYSBUZVggdmJveC4gIFdlIHVzZSBcdnRvcCBpbnN0ZWFkIG9mIFx2Ym94IHRvIGNvbnN0cnVjdCB0aGUgYm94Ci0lIHRvIGtlZXAgaXRzIGhlaWdodCB0aGF0IG9mIGEgbm9ybWFsIGxpbmUuICBBY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGZvcgotJSBcdG9wc2tpcCAocC4xMTQgb2YgdGhlIFRlWGJvb2spLCB0aGUgZ2x1ZSBpbnNlcnRlZCBpcwotJSBtYXggKFx0b3Bza2lwIC0gXGh0IChmaXJzdCBpdGVtKSwgMCkuICBJZiB0aGF0IGhlaWdodCBpcyBsYXJnZSwKLSUgdGhlcmVmb3JlLCBubyBnbHVlIGlzIGluc2VydGVkLCBhbmQgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGhlYWRsaW5lIGFuZAotJSB0aGUgdGV4dCBpcyBzbWFsbCwgd2hpY2ggbG9va3MgYmFkLgotJQotXGRlZlxncm91cHtcYmVnaW5ncm91cAotICBcaWZudW1cY2F0Y29kZTEzPVxhY3RpdmUgXGVsc2UKLSAgICBcZXJyaGVscCA9IFxncm91cGludmFsaWRoZWxwCi0gICAgXGVycm1lc3NhZ2V7QGdyb3VwIGludmFsaWQgaW4gY29udGV4dCB3aGVyZSBmaWxsaW5nIGlzIGVuYWJsZWR9JQotICBcZmkKLSAgJQotICAlIFRoZSBcdnRvcCB3ZSBzdGFydCBiZWxvdyBwcm9kdWNlcyBhIGJveCB3aXRoIG5vcm1hbCBoZWlnaHQgYW5kIGxhcmdlCi0gICUgZGVwdGg7IHRodXMsIFRlWCBwdXRzIFxiYXNlbGluZXNraXAgZ2x1ZSBiZWZvcmUgaXQsIGFuZCAod2hlbiB0aGUKLSAgJSBuZXh0IGxpbmUgb2YgdGV4dCBpcyBkb25lKSBcbGluZXNraXAgZ2x1ZSBhZnRlciBpdC4gIChTZWUgcC44MiBvZgotICAlIHRoZSBUZVhib29rLikgIFRodXMsIHNwYWNlIGJlbG93IGlzIG5vdCBxdWl0ZSBlcXVhbCB0byBzcGFjZQotICAlIGFib3ZlLiAgQnV0IGl0J3MgcHJldHR5IGNsb3NlLgotICBcZGVmXEVncm91cHslCi0gICAgXGVncm91cCAgICAgICAgICAgJSBFbmQgdGhlIFx2dG9wLgotICAgIFxlbmRncm91cCAgICAgICAgICUgRW5kIHRoZSBcZ3JvdXAuCi0gIH0lCi0gICUKLSAgXHZ0b3BcYmdyb3VwCi0gICAgJSBXZSBoYXZlIHRvIHB1dCBhIHN0cnV0IG9uIHRoZSBsYXN0IGxpbmUgaW4gY2FzZSB0aGUgQGdyb3VwIGlzIGluCi0gICAgJSB0aGUgbWlkc3Qgb2YgYW4gZXhhbXBsZSwgcmF0aGVyIHRoYW4gY29tcGxldGVseSBlbmNsb3NpbmcgaXQuCi0gICAgJSBPdGhlcndpc2UsIHRoZSBpbnRlcmxpbmUgc3BhY2UgYmV0d2VlbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBncm91cAotICAgICUgYW5kIHRoZSBmaXJzdCBsaW5lIGFmdGVyd2FyZHMgaXMgdG9vIHNtYWxsLiAgQnV0IHdlIGNhbid0IHB1dCB0aGUKLSAgICAlIHN0cnV0IGluIFxFZ3JvdXAsIHNpbmNlIHRoZXJlIGl0IHdvdWxkIGJlIG9uIGEgbGluZSBieSBpdHNlbGYuCi0gICAgJSBIZW5jZSB0aGlzIGp1c3QgaW5zZXJ0cyBhIHN0cnV0IGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lLgotICAgIFxldmVyeXBhciA9IHtcc3RydXR9JQotICAgICUKLSAgICAlIFNpbmNlIHdlIGhhdmUgYSBzdHJ1dCBvbiBldmVyeSBsaW5lLCB3ZSBkb24ndCBuZWVkIGFueSBvZiBUZVgncwotICAgICUgbm9ybWFsIGludGVybGluZSBzcGFjaW5nLgotICAgIFxvZmZpbnRlcmxpbmVza2lwCi0gICAgJQotICAgICUgT0ssIGJ1dCBub3cgd2UgaGF2ZSB0byBkbyBzb21ldGhpbmcgYWJvdXQgYmxhbmsKLSAgICAlIGxpbmVzIGluIHRoZSBpbnB1dCBpbiBAZXhhbXBsZS1saWtlIGVudmlyb25tZW50cywgd2hpY2ggbm9ybWFsbHkKLSAgICAlIGp1c3QgdHVybiBpbnRvIFxsaXNwcGFyLCB3aGljaCB3aWxsIGluc2VydCBubyBzcGFjZSBub3cgdGhhdCB3ZSd2ZQotICAgICUgdHVybmVkIG9mZiB0aGUgaW50ZXJsaW5lIHNwYWNlLiAgU2ltcGxlc3QgaXMgdG8gbWFrZSB0aGVtIGJlIGFuCi0gICAgJSBlbXB0eSBwYXJhZ3JhcGguCi0gICAgXGlmeFxwYXJcbGlzcHBhcgotICAgICAgXGVkZWZccGFye1xsZWF2ZXZtb2RlIFxwYXJ9JQotICAgICAgJQotICAgICAgJSBSZXNldCBeXk0ncyBkZWZpbml0aW9uIHRvIG5ldyBkZWZpbml0aW9uIG9mIFxwYXIuCi0gICAgICBcb2JleWxpbmVzCi0gICAgXGZpCi0gICAgJQotICAgICUgRG8gQGNvbW1lbnQgc2luY2Ugd2UgYXJlIGNhbGxlZCBpbnNpZGUgYW4gZW52aXJvbm1lbnQgc3VjaCBhcwotICAgICUgQGV4YW1wbGUsIHdoZXJlIGVhY2ggZW5kLW9mLWxpbmUgaW4gdGhlIGlucHV0IGNhdXNlcyBhbgotICAgICUgZW5kLW9mLWxpbmUgaW4gdGhlIG91dHB1dC4gIFdlIGRvbid0IHdhbnQgdGhlIGVuZC1vZi1saW5lIGFmdGVyCi0gICAgJSB0aGUgYEBncm91cCcgdG8gcHV0IGV4dHJhIHNwYWNlIGluIHRoZSBvdXRwdXQuICBTaW5jZSBAZ3JvdXAKLSAgICAlIHNob3VsZCBhcHBlYXIgb24gYSBsaW5lIGJ5IGl0c2VsZiAoYWNjb3JkaW5nIHRvIHRoZSBUZXhpbmZvCi0gICAgJSBtYW51YWwpLCB3ZSBkb24ndCB3b3JyeSBhYm91dCBlYXRpbmcgYW55IHVzZXIgdGV4dC4KLSAgICBcY29tbWVudAotfQotJQotJSBUZVggcHV0cyBpbiBhbiBcZXNjYXBlY2hhciAoaS5lLiwgYEAnKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWxwCi0lIG1lc3NhZ2UsIHNvIHRoaXMgZW5kcyB1cCBwcmludGluZyBgQGdyb3VwIGNhbiBvbmx5IC4uLicuCi0lCi1cbmV3aGVscFxncm91cGludmFsaWRoZWxweyUKLWdyb3VwIGNhbiBvbmx5IGJlIHVzZWQgaW4gZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGV4YW1wbGUsXl5KJQotd2hlcmUgZWFjaCBsaW5lIG9mIGlucHV0IHByb2R1Y2VzIGEgbGluZSBvZiBvdXRwdXQufQotCi0lIEBuZWVkIHNwYWNlLWluLW1pbHMKLSUgZm9yY2VzIGEgcGFnZSBicmVhayBpZiB0aGVyZSBpcyBub3Qgc3BhY2UtaW4tbWlscyByZW1haW5pbmcuCi0KLVxuZXdkaW1lblxtaWwgIFxtaWw9MC4wMDFpbgotCi1cZGVmXG5lZWR7XHBhcnNlYXJnXG5lZWR4fQotCi0lIE9sZCBkZWZpbml0aW9uLS1kaWRuJ3Qgd29yay4KLSVcZGVmXG5lZWR4ICMxe1xwYXIgJQotJSUgVGhpcyBtZXRob2QgdHJpZXMgdG8gbWFrZSBUZVggYnJlYWsgdGhlIHBhZ2UgbmF0dXJhbGx5Ci0lJSBpZiB0aGUgZGVwdGggb2YgdGhlIGJveCBkb2VzIG5vdCBmaXQuCi0le1xiYXNlbGluZXNraXA9MHB0JQotJVx2dG9wIHRvICMxXG1pbHtcdmZpbH1ca2VybiAtIzFcbWlsXG5vYnJlYWsKLSVccHJldmRlcHRoPS0xMDAwcHQKLSV9fQotCi1cZGVmXG5lZWR4IzF7JQotICAlIEdvIGludG8gdmVydGljYWwgbW9kZSwgc28gd2UgZG9uJ3QgbWFrZSBhIGJpZyBib3ggaW4gdGhlIG1pZGRsZSBvZiBhCi0gICUgcGFyYWdyYXBoLgotICBccGFyCi0gICUKLSAgJSBEb24ndCBhZGQgYW55IGxlYWRpbmcgYmVmb3JlIG91ciBiaWcgZW1wdHkgYm94LCBidXQgYWxsb3cgYSBwYWdlCi0gICUgYnJlYWssIHNpbmNlIHRoZSBiZXN0IGJyZWFrIG1pZ2h0IGJlIHJpZ2h0IGhlcmUuCi0gIFxhbGxvd2JyZWFrCi0gIFxub2ludGVybGluZXNraXAKLSAgXHZ0b3AgdG8gIzFcbWlse1x2ZmlsfSUKLSAgJQotICAlIFRlWCBkb2VzIG5vdCBldmVuIGNvbnNpZGVyIHBhZ2UgYnJlYWtzIGlmIGEgcGVuYWx0eSBhZGRlZCB0byB0aGUKLSAgJSBtYWluIHZlcnRpY2FsIGxpc3QgaXMgMTAwMDAgb3IgbW9yZS4gIEJ1dCBpbiBvcmRlciB0byBzZWUgaWYgdGhlCi0gICUgZW1wdHkgYm94IHdlIGp1c3QgYWRkZWQgZml0cyBvbiB0aGUgcGFnZSwgd2UgbXVzdCBtYWtlIGl0IGNvbnNpZGVyCi0gICUgcGFnZSBicmVha3MuICBPbiB0aGUgb3RoZXIgaGFuZCwgd2UgZG9uJ3Qgd2FudCB0byBhY3R1YWxseSBicmVhayB0aGUKLSAgJSBwYWdlIGFmdGVyIHRoZSBlbXB0eSBib3guICBTbyB3ZSB1c2UgYSBwZW5hbHR5IG9mIDk5OTkuCi0gICUKLSAgJSBUaGVyZSBpcyBhbiBleHRyZW1lbHkgc21hbGwgY2hhbmNlIHRoYXQgVGVYIHdpbGwgYWN0dWFsbHkgYnJlYWsgdGhlCi0gICUgcGFnZSBhdCB0aGlzIFxwZW5hbHR5LCBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgZmVhc2libGUgYnJlYWtwb2ludHMgaW4KLSAgJSBzaWdodC4gIChJZiB0aGUgdXNlciBpcyB1c2luZyBsb3RzIG9mIGJpZyBAZ3JvdXAgY29tbWFuZHMsIHdoaWNoCi0gICUgYWxtb3N0LWJ1dC1ub3QtcXVpdGUgZmlsbCB1cCBhIHBhZ2UsIFRlWCB3aWxsIGhhdmUgYSBoYXJkIHRpbWUgZG9pbmcKLSAgJSBnb29kIHBhZ2UgYnJlYWtpbmcsIGZvciBleGFtcGxlLikgIEhvd2V2ZXIsIEkgY291bGQgbm90IGNvbnN0cnVjdCBhbgotICAlIGV4YW1wbGUgd2hlcmUgYSBwYWdlIGJyb2tlIGF0IHRoaXMgXHBlbmFsdHk7IGlmIGl0IGhhcHBlbnMgaW4gYSByZWFsCi0gICUgZG9jdW1lbnQsIHRoZW4gd2UgY2FuIHJlY29uc2lkZXIgb3VyIHN0cmF0ZWd5LgotICBccGVuYWx0eTk5OTkKLSAgJQotICAlIEJhY2sgdXAgYnkgdGhlIHNpemUgb2YgdGhlIGJveCwgd2hldGhlciB3ZSBkaWQgYSBwYWdlIGJyZWFrIG9yIG5vdC4KLSAgXGtlcm4gLSMxXG1pbAotICAlCi0gICUgRG8gbm90IGFsbG93IGEgcGFnZSBicmVhayByaWdodCBhZnRlciB0aGlzIGtlcm4uCi0gIFxub2JyZWFrCi19Ci0KLSUgQGJyICAgZm9yY2VzIHBhcmFncmFwaCBicmVhawotCi1cbGV0XGJyID0gXHBhcgotCi0lIEBkb3Rze30gb3V0cHV0IGFuIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCi0lIFdlIGRvIC41ZW0gcGVyIHBlcmlvZCBzbyB0aGF0IGl0IGhhcyB0aGUgc2FtZSBzcGFjaW5nIGluIGEgdHlwZXdyaXRlcgotJSBmb250IGFzIHRocmVlIGFjdHVhbCBwZXJpb2QgY2hhcmFjdGVycy4KLSUKLVxkZWZcZG90c3slCi0gIFxsZWF2ZXZtb2RlCi0gIFxoYm94IHRvIDEuNWVteyUKLSAgICBcaHNraXAgMHB0IHBsdXMgMC4yNWZpbCBtaW51cyAwLjI1ZmlsCi0gICAgLlxoc3MuXGhzcy4lCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuNWZpbCBtaW51cyAwLjVmaWwKLSAgfSUKLX0KLQotJSBAZW5kZG90c3t9IGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBlbGxpcHNpcy4KLSUgCi1cZGVmXGVuZGRvdHN7JQotICBcbGVhdmV2bW9kZQotICBcaGJveCB0byAyZW17JQotICAgIFxoc2tpcCAwcHQgcGx1cyAwLjI1ZmlsIG1pbnVzIDAuMjVmaWwKLSAgICAuXGhzcy5caHNzLlxoc3MuJQotICAgIFxoc2tpcCAwcHQgcGx1cyAwLjVmaWwgbWludXMgMC41ZmlsCi0gIH0lCi0gIFxzcGFjZWZhY3Rvcj0zMDAwCi19Ci0KLQotJSBAcGFnZSAgICBmb3JjZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHBhZ2UKLSUKLVxkZWZccGFnZXtccGFyXHZmaWxsXHN1cGVyZWplY3R9Ci0KLSUgQGV4ZGVudCB0ZXh0Li4uLgotJSBvdXRwdXRzIHRleHQgb24gc2VwYXJhdGUgbGluZSBpbiByb21hbiBmb250LCBzdGFydGluZyBhdCBzdGFuZGFyZCBwYWdlIG1hcmdpbgotCi0lIFRoaXMgcmVjb3JkcyB0aGUgYW1vdW50IG9mIGluZGVudCBpbiB0aGUgaW5uZXJtb3N0IGVudmlyb25tZW50LgotJSBUaGF0J3MgaG93IG11Y2ggXGV4ZGVudCBzaG91bGQgdGFrZSBvdXQuCi1cbmV3c2tpcFxleGRlbnRhbW91bnQKLQotJSBUaGlzIGRlZm4gaXMgdXNlZCBpbnNpZGUgZmlsbCBlbnZpcm9ubWVudHMgc3VjaCBhcyBAZGVmdW4uCi1cZGVmXGV4ZGVudHtccGFyc2VhcmdcZXhkZW50eXl5fQotXGRlZlxleGRlbnR5eXkgIzF7e1xoZmlsXGJyZWFrXGhib3h7XGtlcm4gLVxleGRlbnRhbW91bnR7XHJtIzF9fVxoZmlsXGJyZWFrfX0KLQotJSBUaGlzIGRlZm4gaXMgdXNlZCBpbnNpZGUgbm9maWxsIGVudmlyb25tZW50cyBzdWNoIGFzIEBleGFtcGxlLgotXGRlZlxub2ZpbGxleGRlbnR7XHBhcnNlYXJnXG5vZmlsbGV4ZGVudHl5eX0KLVxkZWZcbm9maWxsZXhkZW50eXl5ICMxe3tcYWR2YW5jZSBcbGVmdHNraXAgYnkgLVxleGRlbnRhbW91bnQKLVxsZWZ0bGluZXtcaHNraXBcbGVmdHNraXB7XHJtIzF9fX19Ci0KLSUgQGlubWFyZ2lue1RFWFR9IHB1dHMgVEVYVCBpbiB0aGUgbWFyZ2luIG5leHQgdG8gdGhlIGN1cnJlbnQgcGFyYWdyYXBoLgotCi1cZGVmXGlubWFyZ2luIzF7JQotXHN0cnV0XHZhZGp1c3R7XG5vYnJlYWtca2Vybi1cc3RydXRkZXB0aAotICBcdnRvcCB0byBcc3RydXRkZXB0aHtcYmFzZWxpbmVza2lwXHN0cnV0ZGVwdGhcdnNzCi0gIFxsbGFwe1xyaWdodHNraXA9XGlubWFyZ2luc3BhY2luZyBcdmJveHtcbm9pbmRlbnQgIzF9fVxudWxsfX19Ci1cbmV3c2tpcFxpbm1hcmdpbnNwYWNpbmcgXGlubWFyZ2luc3BhY2luZz0xY20KLVxkZWZcc3RydXRkZXB0aHtcZHBcc3RydXRib3h9Ci0KLSVcaGJveHt7XHJtIzF9fVxoZmlsXGJyZWFrfX0KLQotJSBAaW5jbHVkZSBmaWxlICAgIGluc2VydCB0ZXh0IG9mIHRoYXQgZmlsZSBhcyBpbnB1dC4KLSUgQWxsb3cgbm9ybWFsIGNoYXJhY3RlcnMgdGhhdCAgd2UgbWFrZSBhY3RpdmUgaW4gdGhlIGFyZ3VtZW50IChhIGZpbGUgbmFtZSkuCi1cZGVmXGluY2x1ZGV7XGJlZ2luZ3JvdXAKLSAgXGNhdGNvZGVgXFw9MTIKLSAgXGNhdGNvZGVgfj0xMgotICBcY2F0Y29kZWBePTEyCi0gIFxjYXRjb2RlYF89MTIKLSAgXGNhdGNvZGVgfD0xMgotICBcY2F0Y29kZWA8PTEyCi0gIFxjYXRjb2RlYD49MTIKLSAgXGNhdGNvZGVgKz0xMgotICBccGFyc2VhcmdcaW5jbHVkZXp6en0KLSUgUmVzdG9yZSBhY3RpdmUgY2hhcnMgZm9yIGluY2x1ZGVkIGZpbGUuCi1cZGVmXGluY2x1ZGV6enojMXtcZW5kZ3JvdXBcYmVnaW5ncm91cAotICAlIFJlYWQgdGhlIGluY2x1ZGVkIGZpbGUgaW4gYSBncm91cCBzbyBuZXN0ZWQgQGluY2x1ZGUncyB3b3JrLgotICBcZGVmXHRoaXNmaWxleyMxfSUKLSAgXGlucHV0XHRoaXNmaWxlCi1cZW5kZ3JvdXB9Ci0KLVxkZWZcdGhpc2ZpbGV7fQotCi0lIEBjZW50ZXIgbGluZSAgIG91dHB1dHMgdGhhdCBsaW5lLCBjZW50ZXJlZAotCi1cZGVmXGNlbnRlcntccGFyc2VhcmdcY2VudGVyenp6fQotXGRlZlxjZW50ZXJ6enogIzF7e1xhZHZhbmNlXGhzaXplIGJ5IC1cbGVmdHNraXAKLVxhZHZhbmNlXGhzaXplIGJ5IC1ccmlnaHRza2lwCi1cY2VudGVybGluZXsjMX19fQotCi0lIEBzcCBuICAgb3V0cHV0cyBuIGxpbmVzIG9mIHZlcnRpY2FsIHNwYWNlCi0KLVxkZWZcc3B7XHBhcnNlYXJnXHNweHh4fQotXGRlZlxzcHh4eCAjMXtcdnNraXAgIzFcYmFzZWxpbmVza2lwfQotCi0lIEBjb21tZW50IC4uLmxpbmUgd2hpY2ggaXMgaWdub3JlZC4uLgotJSBAYyBpcyB0aGUgc2FtZSBhcyBAY29tbWVudAotJSBAaWdub3JlIC4uLiBAZW5kIGlnbm9yZSAgaXMgYW5vdGhlciB3YXkgdG8gd3JpdGUgYSBjb21tZW50Ci0KLVxkZWZcY29tbWVudHtcYmVnaW5ncm91cCBcY2F0Y29kZWBcXl5NPVxvdGhlciUKLVxjYXRjb2RlYFxAPVxvdGhlciBcY2F0Y29kZWBcez1cb3RoZXIgXGNhdGNvZGVgXH09XG90aGVyJQotXGNvbW1lbnR4eHh9Ci17XGNhdGNvZGVgXF5eTT1cb3RoZXIgXGdkZWZcY29tbWVudHh4eCMxXl5Ne1xlbmRncm91cH19Ci0KLVxsZXRcYz1cY29tbWVudAotCi0lIEBwYXJhZ3JhcGhpbmRlbnQgIGlzIGRlZmluZWQgZm9yIHRoZSBJbmZvIGZvcm1hdHRpbmcgY29tbWFuZHMgb25seS4KLVxsZXRccGFyYWdyYXBoaW5kZW50PVxjb21tZW50Ci0KLSUgUHJldmVudCBlcnJvcnMgZm9yIHNlY3Rpb24gY29tbWFuZHMuCi0lIFVzZWQgaW4gQGlnbm9yZSBhbmQgaW4gZmFpbGluZyBjb25kaXRpb25hbHMuCi1cZGVmXGlnbm9yZXNlY3Rpb25zeyUKLVxsZXRcY2hhcHRlcj1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZD1ccmVsYXgKLVxsZXRcdG9wPVxyZWxheAotXGxldFx1bm51bWJlcmVkc2VjPVxyZWxheAotXGxldFx1bm51bWJlcmVkc2VjdGlvbj1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHN1YnNlYz1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzdWJzdWJzZWM9XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzdWJzdWJzZWN0aW9uPVxyZWxheAotXGxldFxzZWN0aW9uPVxyZWxheAotXGxldFxzdWJzZWM9XHJlbGF4Ci1cbGV0XHN1YnN1YnNlYz1ccmVsYXgKLVxsZXRcc3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcc3Vic3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcYXBwZW5kaXg9XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c2VjPVxyZWxheAotXGxldFxhcHBlbmRpeHNlY3Rpb249XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c3Vic2VjPVxyZWxheAotXGxldFxhcHBlbmRpeHN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c3Vic3Vic2VjPVxyZWxheAotXGxldFxhcHBlbmRpeHN1YnN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XGNvbnRlbnRzPVxyZWxheAotXGxldFxzbWFsbGJvb2s9XHJlbGF4Ci1cbGV0XHRpdGxlcGFnZT1ccmVsYXgKLX0KLQotJSBVc2VkIGluIG5lc3RlZCBjb25kaXRpb25hbHMsIHdoZXJlIHdlIGhhdmUgdG8gcGFyc2UgdGhlIFRleGluZm8gc291cmNlCi0lIGFuZCBzbyB3YW50IHRvIHR1cm4gb2ZmIG1vc3QgY29tbWFuZHMsIGluIGNhc2UgdGhleSBhcmUgdXNlZAotJSBpbmNvcnJlY3RseS4KLSUKLVxkZWZcaWdub3JlbW9yZWNvbW1hbmRzeyUKLSAgXGxldFxkZWZjb2RlaW5kZXggPSBccmVsYXgKLSAgXGxldFxkZWZjdiA9IFxyZWxheAotICBcbGV0XGRlZmZuID0gXHJlbGF4Ci0gIFxsZXRcZGVmZm54ID0gXHJlbGF4Ci0gIFxsZXRcZGVmaW5kZXggPSBccmVsYXgKLSAgXGxldFxkZWZpdmFyID0gXHJlbGF4Ci0gIFxsZXRcZGVmbWFjID0gXHJlbGF4Ci0gIFxsZXRcZGVmbWV0aG9kID0gXHJlbGF4Ci0gIFxsZXRcZGVmb3AgPSBccmVsYXgKLSAgXGxldFxkZWZvcHQgPSBccmVsYXgKLSAgXGxldFxkZWZzcGVjID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHAgPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBlZm4gPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBlZnVuID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHlwZXZhciA9IFxyZWxheAotICBcbGV0XGRlZnR5cGV2ciA9IFxyZWxheAotICBcbGV0XGRlZnVuID0gXHJlbGF4Ci0gIFxsZXRcZGVmdmFyID0gXHJlbGF4Ci0gIFxsZXRcZGVmdnIgPSBccmVsYXgKLSAgXGxldFxyZWYgPSBccmVsYXgKLSAgXGxldFx4cmVmID0gXHJlbGF4Ci0gIFxsZXRccHJpbnRpbmRleCA9IFxyZWxheAotICBcbGV0XHB4cmVmID0gXHJlbGF4Ci0gIFxsZXRcc2V0dGl0bGUgPSBccmVsYXgKLSAgXGxldFxzZXRjaGFwdGVybmV3cGFnZSA9IFxyZWxheAotICBcbGV0XHNldGNoYXB0ZXJzdHlsZSA9IFxyZWxheAotICBcbGV0XGV2ZXJ5aGVhZGluZyA9IFxyZWxheAotICBcbGV0XGV2ZW5oZWFkaW5nID0gXHJlbGF4Ci0gIFxsZXRcb2RkaGVhZGluZyA9IFxyZWxheAotICBcbGV0XGV2ZXJ5Zm9vdGluZyA9IFxyZWxheAotICBcbGV0XGV2ZW5mb290aW5nID0gXHJlbGF4Ci0gIFxsZXRcb2RkZm9vdGluZyA9IFxyZWxheAotICBcbGV0XGhlYWRpbmdzID0gXHJlbGF4Ci0gIFxsZXRcaW5jbHVkZSA9IFxyZWxheAotICBcbGV0XGxvd2Vyc2VjdGlvbnMgPSBccmVsYXgKLSAgXGxldFxkb3duID0gXHJlbGF4Ci0gIFxsZXRccmFpc2VzZWN0aW9ucyA9IFxyZWxheAotICBcbGV0XHVwID0gXHJlbGF4Ci0gIFxsZXRcc2V0ID0gXHJlbGF4Ci0gIFxsZXRcY2xlYXIgPSBccmVsYXgKLSAgXGxldFxpdGVtID0gXHJlbGF4Ci19Ci0KLSUgSWdub3JlIEBpZ25vcmUgLi4uIEBlbmQgaWdub3JlLgotJQotXGRlZlxpZ25vcmV7XGRvaWdub3Jle2lnbm9yZX19Ci0KLSUgSWdub3JlIEBpZmluZm8sIEBpZmh0bWwsIEBpZm5vdHRleCwgQGh0bWwsIEBtZW51LCBhbmQgQGRpcmVudHJ5IHRleHQuCi0lCi1cZGVmXGlmaW5mb3tcZG9pZ25vcmV7aWZpbmZvfX0KLVxkZWZcaWZodG1se1xkb2lnbm9yZXtpZmh0bWx9fQotXGRlZlxpZm5vdHRleHtcZG9pZ25vcmV7aWZub3R0ZXh9fQotXGRlZlxodG1se1xkb2lnbm9yZXtodG1sfX0KLVxkZWZcbWVudXtcZG9pZ25vcmV7bWVudX19Ci1cZGVmXGRpcmVudHJ5e1xkb2lnbm9yZXtkaXJlbnRyeX19Ci0KLSUgQGRpcmNhdGVnb3J5IENBVEVHT1JZICAtLSBzcGVjaWZ5IGEgY2F0ZWdvcnkgb2YgdGhlIGRpciBmaWxlCi0lIHdoaWNoIHRoaXMgZmlsZSBzaG91bGQgYmVsb25nIHRvLiAgSWdub3JlIHRoaXMgaW4gVGVYLgotXGxldFxkaXJjYXRlZ29yeSA9IFxjb21tZW50Ci0KLSUgSWdub3JlIHRleHQgdW50aWwgYSBsaW5lIGBAZW5kICMxJy4KLSUKLVxkZWZcZG9pZ25vcmUjMXtcYmVnaW5ncm91cAotICAlIERvbid0IGNvbXBsYWluIGFib3V0IGNvbnRyb2wgc2VxdWVuY2VzIHdlIGhhdmUgZGVjbGFyZWQgXG91dGVyLgotICBcaWdub3Jlc2VjdGlvbnMKLSAgJQotICAlIERlZmluZSBhIGNvbW1hbmQgdG8gc3dhbGxvdyB0ZXh0IHVudGlsIHdlIHJlYWNoIGBAZW5kICMxJy4KLSAgJSBUaGlzIEAgaXMgYSBjYXRjb2RlIDEyIHRva2VuICh0aGF0IGlzIHRoZSBub3JtYWwgY2F0Y29kZSBvZiBAIGluCi0gICUgdGhpcyB0ZXhpbmZvLnRleCBmaWxlKS4gIFdlIGNoYW5nZSB0aGUgY2F0Y29kZSBvZiBAIGJlbG93IHRvIG1hdGNoLgotICBcbG9uZ1xkZWZcZG9pZ25vcmV0ZXh0IyMxQGVuZCAjMXtcZW5kZG9pZ25vcmV9JQotICAlCi0gICUgTWFrZSBzdXJlIHRoYXQgc3BhY2VzIHR1cm4gaW50byB0b2tlbnMgdGhhdCBtYXRjaCB3aGF0IFxkb2lnbm9yZXRleHQgd2FudHMuCi0gIFxjYXRjb2RlMzIgPSAxMAotICAlCi0gICUgSWdub3JlIGJyYWNlcywgdG9vLCBzbyBtaXNtYXRjaGVkIGJyYWNlcyBkb24ndCBjYXVzZSB0cm91YmxlLgotICBcY2F0Y29kZWBceyA9IDkKLSAgXGNhdGNvZGVgXH0gPSA5Ci0gICUKLSAgJSBXZSBtdXN0IG5vdCBoYXZlIEBjIGludGVycHJldGVkIGFzIGEgY29udHJvbCBzZXF1ZW5jZS4KLSAgXGNhdGNvZGVgXEAgPSAxMgotICAlCi0gICUgTWFrZSB0aGUgbGV0dGVyIGMgYSBjb21tZW50IGNoYXJhY3RlciBzbyB0aGF0IHRoZSByZXN0IG9mIHRoZSBsaW5lCi0gICUgd2lsbCBiZSBpZ25vcmVkLiBUaGlzIHdheSwgdGhlIGRvY3VtZW50IGNhbiBoYXZlIChmb3IgZXhhbXBsZSkKLSAgJSAgIEBjIEBlbmQgaWZpbmZvCi0gICUgYW5kIHRoZSBAZW5kIGlmaW5mbyB3aWxsIGJlIHByb3Blcmx5IGlnbm9yZWQuCi0gICUgKFdlJ3ZlIGp1c3QgY2hhbmdlZCBAIHRvIGNhdGNvZGUgMTIuKQotICBcY2F0Y29kZWBcYyA9IDE0Ci0gICUKLSAgJSBBbmQgbm93IGV4cGFuZCB0aGF0IGNvbW1hbmQuCi0gIFxkb2lnbm9yZXRleHQKLX0KLQotJSBXaGF0IHdlIGRvIHRvIGZpbmlzaCBvZmYgaWdub3JlZCB0ZXh0LgotJQotXGRlZlxlbmRkb2lnbm9yZXtcZW5kZ3JvdXBcaWdub3Jlc3BhY2VzfSUKLQotXG5ld2lmXGlmd2FybmVkb2JzXHdhcm5lZG9ic2ZhbHNlCi1cZGVmXG9ic3RleHdhcm57JQotICBcaWZ3YXJuZWRvYnNccmVsYXhcZWxzZQotICAlIFdlIG5lZWQgdG8gd2FybiBmb2xrcyB0aGF0IHRoZXkgbWF5IGhhdmUgdHJvdWJsZSB3aXRoIFRlWCAzLjAuCi0gICUgVGhpcyB1c2VzIFxpbW1lZGlhdGVcd3JpdGUxNiByYXRoZXIgdGhhbiBcbWVzc2FnZSB0byBnZXQgbmV3bGluZXMuCi0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e30KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7KioqV0FSTklORyoqKiBmb3IgdXNlcnMgb2YgVW5peCBUZVggMy4wIX0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7VGhpcyBtYW51YWwgdHJpcHMgYSBidWcgaW4gVGVYIHZlcnNpb24gMy4wICh0ZXggaGFuZ3MpLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7SWYgeW91IGFyZSBydW5uaW5nIGFub3RoZXIgdmVyc2lvbiBvZiBUZVgsIHJlbGF4Ln0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7SWYgeW91IGFyZSBydW5uaW5nIFVuaXggVGVYIDMuMCwga2lsbCB0aGlzIFRlWCBwcm9jZXNzLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICBUaGVuIHVwZ3JhZGUgeW91ciBUZVggaW5zdGFsbGF0aW9uIGlmIHlvdSBjYW4ufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnsgIChTZWUgZnRwOi8vZnRwLmdudS5haS5taXQuZWR1L3B1Yi9nbnUvVGVYLlJFQURNRS4pfQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNntJZiB5b3UgYXJlIHN0dWNrIHdpdGggdmVyc2lvbiAzLjAsIHJ1biB0aGV9Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2eyAgc2NyaXB0IGBgdGV4M3BhdGNoJycgZnJvbSB0aGUgVGV4aW5mbyBkaXN0cmlidXRpb259Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2eyAgdG8gdXNlIGEgd29ya2Fyb3VuZC59Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e30KLSAgICBcZ2xvYmFsXHdhcm5lZG9ic3RydWUKLSAgICBcZmkKLX0KLQotJSAqKkluIFRlWCAzLjAsIHNldHRpbmcgdGV4dCBpbiBcbnVsbGZvbnQgaGFuZ3MgdGV4LiAgRm9yIGEKLSUgd29ya2Fyb3VuZCAod2hpY2ggcmVxdWlyZXMgdGhlIGZpbGUgYGBkdW1teS50Zm0nJyB0byBiZSBpbnN0YWxsZWQpLAotJSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lOgotJSUlJSVcZm9udFxudWxsZm9udD1kdW1teVxsZXRcb2JzdGV4d2Fybj1ccmVsYXgKLQotJSBJZ25vcmUgdGV4dCwgZXhjZXB0IHRoYXQgd2Uga2VlcCB0cmFjayBvZiBjb25kaXRpb25hbCBjb21tYW5kcyBmb3IKLSUgcHVycG9zZXMgb2YgbmVzdGluZywgdXAgdG8gYW4gYEBlbmQgIzEnIGNvbW1hbmQuCi0lCi1cZGVmXG5lc3RlZGlnbm9yZSMxeyUKLSAgXG9ic3RleHdhcm4KLSAgJSBXZSBtdXN0IGFjdHVhbGx5IGV4cGFuZCB0aGUgaWdub3JlZCB0ZXh0IHRvIGxvb2sgZm9yIHRoZSBAZW5kCi0gICUgY29tbWFuZCwgc28gdGhhdCBuZXN0ZWQgaWdub3JlIGNvbnN0cnVjdHMgd29yay4gIFRodXMsIHdlIHB1dCB0aGUKLSAgJSB0ZXh0IGludG8gYSBcdmJveCBhbmQgdGhlbiBkbyBub3RoaW5nIHdpdGggdGhlIHJlc3VsdC4gIFRvIG1pbmltaXplCi0gICUgdGhlIGNoYW5nZSBvZiBtZW1vcnkgb3ZlcmZsb3csIHdlIGZvbGxvdyB0aGUgYXBwcm9hY2ggb3V0bGluZWQgb24KLSAgJSBwYWdlIDQwMSBvZiB0aGUgVGVYYm9vazogbWFrZSB0aGUgY3VycmVudCBmb250IGJlIGEgZHVtbXkgZm9udC4KLSAgJQotICBcc2V0Ym94MCA9IFx2Ym94XGJncm91cAotICAgICUgRG9uJ3QgY29tcGxhaW4gYWJvdXQgY29udHJvbCBzZXF1ZW5jZXMgd2UgaGF2ZSBkZWNsYXJlZCBcb3V0ZXIuCi0gICAgXGlnbm9yZXNlY3Rpb25zCi0gICAgJQotICAgICUgRGVmaW5lIGBAZW5kICMxJyB0byBlbmQgdGhlIGJveCwgd2hpY2ggd2lsbCBpbiB0dXJuIHVuZGVmaW5lIHRoZQotICAgICUgQGVuZCBjb21tYW5kIGFnYWluLgotICAgIFxleHBhbmRhZnRlclxkZWZcY3NuYW1lIEUjMVxlbmRjc25hbWV7XGVncm91cFxpZ25vcmVzcGFjZXN9JQotICAgICUKLSAgICAlIFdlIGFyZSBnb2luZyB0byBiZSBwYXJzaW5nIFRleGluZm8gY29tbWFuZHMuICBNb3N0IGNhdXNlIG5vCi0gICAgJSB0cm91YmxlIHdoZW4gdGhleSBhcmUgdXNlZCBpbmNvcnJlY3RseSwgYnV0IHNvbWUgY29tbWFuZHMgZG8KLSAgICAlIGNvbXBsaWNhdGVkIGFyZ3VtZW50IHBhcnNpbmcgb3Igb3RoZXJ3aXNlIGdldCBjb25mdXNlZCwgc28gd2UKLSAgICAlIHVuZGVmaW5lIHRoZW0uCi0gICAgJQotICAgICUgV2UgY2FuJ3QgZG8gYW55dGhpbmcgYWJvdXQgc3RyYXkgQC1zaWducywgdW5mb3J0dW5hdGVseTsKLSAgICAlIHRoZXknbGwgcHJvZHVjZSBgdW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVuY2UnIGVycm9ycy4KLSAgICBcaWdub3JlbW9yZWNvbW1hbmRzCi0gICAgJQotICAgICUgU2V0IHRoZSBjdXJyZW50IGZvbnQgdG8gYmUgXG51bGxmb250LCBhIFRlWCBwcmltaXRpdmUsIGFuZCBkZWZpbmUKLSAgICAlIGFsbCB0aGUgZm9udCBjb21tYW5kcyB0byBhbHNvIHVzZSBcbnVsbGZvbnQuICBXZSBkb24ndCB1c2UKLSAgICAlIGR1bW15LnRmbSwgYXMgc3VnZ2VzdGVkIGluIHRoZSBUZVhib29rLCBiZWNhdXNlIG5vdCBhbGwgc2l0ZXMKLSAgICAlIG1pZ2h0IGhhdmUgdGhhdCBpbnN0YWxsZWQuICBUaGVyZWZvcmUsIG1hdGggbW9kZSB3aWxsIHN0aWxsCi0gICAgJSBwcm9kdWNlIG91dHB1dCwgYnV0IHRoYXQgc2hvdWxkIGJlIGFuIGV4dHJlbWVseSBzbWFsbCBhbW91bnQgb2YKLSAgICAlIHN0dWZmIGNvbXBhcmVkIHRvIHRoZSBtYWluIGlucHV0LgotICAgICUKLSAgICBcbnVsbGZvbnQKLSAgICBcbGV0XHRlbnJtID0gXG51bGxmb250ICBcbGV0XHRlbml0ID0gXG51bGxmb250ICBcbGV0XHRlbnNsID0gXG51bGxmb250Ci0gICAgXGxldFx0ZW5iZiA9IFxudWxsZm9udCAgXGxldFx0ZW50dCA9IFxudWxsZm9udCAgXGxldFxzbWFsbGNhcHMgPSBcbnVsbGZvbnQKLSAgICBcbGV0XHRlbnNmID0gXG51bGxmb250Ci0gICAgJSBTaW1pbGFybHkgZm9yIGluZGV4IGZvbnRzIChtb3N0bHkgZm9yIHRoZWlyIHVzZSBpbgotICAgICUgc21hbGxleGFtcGxlKQotICAgIFxsZXRcaW5kcm0gPSBcbnVsbGZvbnQgIFxsZXRcaW5kaXQgPSBcbnVsbGZvbnQgIFxsZXRcaW5kc2wgPSBcbnVsbGZvbnQKLSAgICBcbGV0XGluZGJmID0gXG51bGxmb250ICBcbGV0XGluZHR0ID0gXG51bGxmb250ICBcbGV0XGluZHNjID0gXG51bGxmb250Ci0gICAgXGxldFxpbmRzZiA9IFxudWxsZm9udAotICAgICUKLSAgICAlIERvbid0IGNvbXBsYWluIHdoZW4gY2hhcmFjdGVycyBhcmUgbWlzc2luZyBmcm9tIHRoZSBmb250cy4KLSAgICBcdHJhY2luZ2xvc3RjaGFycyA9IDAKLSAgICAlCi0gICAgJSBEb24ndCBib3RoZXIgdG8gZG8gc3BhY2UgZmFjdG9yIGNhbGN1bGF0aW9ucy4KLSAgICBcZnJlbmNoc3BhY2luZwotICAgICUKLSAgICAlIERvbid0IHJlcG9ydCB1bmRlcmZ1bGwgaGJveGVzLgotICAgIFxoYmFkbmVzcyA9IDEwMDAwCi0gICAgJQotICAgICUgRG8gbWluaW1hbCBsaW5lLWJyZWFraW5nLgotICAgIFxwcmV0b2xlcmFuY2UgPSAxMDAwMAotICAgICUKLSAgICAlIERvIG5vdCBleGVjdXRlIGluc3RydWN0aW9ucyBpbiBAdGV4Ci0gICAgXGRlZlx0ZXh7XGRvaWdub3Jle3RleH19JQotICAgICUgRG8gbm90IGV4ZWN1dGUgbWFjcm8gZGVmaW5pdGlvbnMuCi0gICAgJSBgYycgaXMgYSBjb21tZW50IGNoYXJhY3Rlciwgc28gdGhlIHdvcmQgYG1hY3JvJyB3aWxsIGdldCBjdXQgb2ZmLgotICAgIFxkZWZcbWFjcm97XGRvaWdub3Jle21hfX0lCi19Ci0KLSUgQHNldCBWQVIgc2V0cyB0aGUgdmFyaWFibGUgVkFSIHRvIGFuIGVtcHR5IHZhbHVlLgotJSBAc2V0IFZBUiBSRVNULU9GLUxJTkUgc2V0cyBWQVIgdG8gdGhlIHZhbHVlIFJFU1QtT0YtTElORS4KLSUKLSUgU2luY2Ugd2Ugd2FudCB0byBzZXBhcmF0ZSBWQVIgZnJvbSBSRVNULU9GLUxJTkUgKHdoaWNoIG1pZ2h0IGJlCi0lIGVtcHR5KSwgd2UgY2FuJ3QganVzdCB1c2UgXHBhcnNlYXJnOyB3ZSBoYXZlIHRvIGluc2VydCBhIHNwYWNlIG9mIG91cgotJSBvd24gdG8gZGVsaW1pdCB0aGUgcmVzdCBvZiB0aGUgbGluZSwgYW5kIHRoZW4gdGFrZSBpdCBvdXQgYWdhaW4gaWYgd2UKLSUgZGlkbid0IG5lZWQgaXQuICBNYWtlIHN1cmUgdGhlIGNhdGNvZGUgb2Ygc3BhY2UgaXMgY29ycmVjdCB0byBhdm9pZAotJSBsb3NpbmcgaW5zaWRlIEBleGFtcGxlLCBmb3IgaW5zdGFuY2UuCi0lCi1cZGVmXHNldHtcYmVnaW5ncm91cFxjYXRjb2RlYCA9MTAKLSAgXGNhdGNvZGVgXC09MTIgXGNhdGNvZGVgXF89MTIgJSBBbGxvdyAtIGFuZCBfIGluIFZBUi4KLSAgXHBhcnNlYXJnXHNldHh4eH0KLVxkZWZcc2V0eHh4IzF7XHNldHl5eSMxIFxlbmRzZXR5eXl9Ci1cZGVmXHNldHl5eSMxICMyXGVuZHNldHl5eXslCi0gIFxkZWZcdGVtcHsjMn0lCi0gIFxpZnhcdGVtcFxlbXB0eSBcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lID0gXGVtcHR5Ci0gIFxlbHNlIFxzZXR6enp7IzF9IzJcZW5kc2V0enp6ICUgUmVtb3ZlIHRoZSB0cmFpbGluZyBzcGFjZSBcc2V0eHh4IGluc2VydGVkLgotICBcZmkKLSAgXGVuZGdyb3VwCi19Ci0lIENhbid0IHVzZSBceGRlZiB0byBwcmUtZXhwYW5kICMyIGFuZCBzYXZlIHNvbWUgdGltZSwgc2luY2UgXHRlbXAgb3IKLSUgXG5leHQgb3Igb3RoZXIgY29udHJvbCBzZXF1ZW5jZXMgdGhhdCB3ZSd2ZSBkZWZpbmVkIG1pZ2h0IGdldCB1cyBpbnRvCi0lIGFuIGluZmluaXRlIGxvb3AuIENvbnNpZGVyIGBAc2V0IGZvbyBAY2l0ZXtiYXJ9Jy4KLVxkZWZcc2V0enp6IzEjMiBcZW5kc2V0enp6e1xleHBhbmRhZnRlclxnZGVmXGNzbmFtZSBTRVQjMVxlbmRjc25hbWV7IzJ9fQotCi0lIEBjbGVhciBWQVIgY2xlYXJzIChpLmUuLCB1bnNldHMpIHRoZSB2YXJpYWJsZSBWQVIuCi0lCi1cZGVmXGNsZWFye1xwYXJzZWFyZ1xjbGVhcnh4eH0KLVxkZWZcY2xlYXJ4eHgjMXtcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lPVxyZWxheH0KLQotJSBAdmFsdWV7Zm9vfSBnZXRzIHRoZSB0ZXh0IHNhdmVkIGluIHZhcmlhYmxlIGZvby4KLSUKLXsKLSAgXGNhdGNvZGVgXF8gPSBcYWN0aXZlCi0gICUKLSAgJSBXZSBtaWdodCBlbmQgdXAgd2l0aCBhY3RpdmUgXyBvciAtIGNoYXJhY3RlcnMgaW4gdGhlIGFyZ3VtZW50IGlmCi0gICUgd2UncmUgY2FsbGVkIGZyb20gQGNvZGUsIGFzIEBjb2Rle0B2YWx1ZXtmb28tYmFyX319LiAgU28gXGxldCBhbnkKLSAgJSBzdWNoIGFjdGl2ZSBjaGFyYWN0ZXJzIHRvIHRoZWlyIG5vcm1hbCBlcXVpdmFsZW50cy4KLSAgXGdkZWZcdmFsdWV7XGJlZ2luZ3JvdXAKLSAgICBcY2F0Y29kZWBcLT0xMiBcY2F0Y29kZWBcXz0xMgotICAgIFxpbmRleGJyZWFrcyBcbGV0X1xub3JtYWx1bmRlcnNjb3JlCi0gICAgXHZhbHVleHh4fQotfQotXGRlZlx2YWx1ZXh4eCMxe1xleHBhbmRhYmxldmFsdWV7IzF9XGVuZGdyb3VwfQotCi0lIFdlIGhhdmUgdGhpcyBzdWJyb3V0aW5lIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBhdCBsZWFzdCBzb21lIEB2YWx1ZSdzCi0lIHByb3Blcmx5IGluIGluZGV4ZXMgKHdlIFxsZXRcdmFsdWUgdG8gdGhpcyBpbiBcaW5kZXhkdW1taWVzKS4gIE9uZXMKLSUgd2hvc2UgbmFtZXMgY29udGFpbiAtIG9yIF8gc3RpbGwgd29uJ3Qgd29yaywgYnV0IHdlIGNhbid0IGRvIGFueXRoaW5nCi0lIGFib3V0IHRoYXQuICBUaGUgY29tbWFuZCBoYXMgdG8gYmUgZnVsbHkgZXhwYW5kYWJsZSwgc2luY2UgdGhlIHJlc3VsdAotJSB3aW5kcyB1cCBpbiB0aGUgaW5kZXggZmlsZS4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgdmFyaWFibGUncyB2YWx1ZQotJSBjb250YWlucyBvdGhlciBUZXhpbmZvIGNvbW1hbmRzLCBpdCdzIGFsbW9zdCBjZXJ0YWluIGl0IHdpbGwgZmFpbAotJSAoYWx0aG91Z2ggcGVyaGFwcyB3ZSBjb3VsZCBmaXggdGhhdCB3aXRoIHN1ZmZpY2llbnQgd29yayB0byBkbyBhCi0lIG9uZS1sZXZlbCBleHBhbnNpb24gb24gdGhlIHJlc3VsdCwgaW5zdGVhZCBvZiBjb21wbGV0ZSkuCi0lIAotXGRlZlxleHBhbmRhYmxldmFsdWUjMXslCi0gIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZVxyZWxheAotICAgIHtbTm8gdmFsdWUgZm9yIGBgIzEnJ112fSUKLSAgXGVsc2UKLSAgICBcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZQotICBcZmkKLX0KLQotJSBAaWZzZXQgVkFSIC4uLiBAZW5kIGlmc2V0IHJlYWRzIHRoZSBgLi4uJyBpZmYgVkFSIGhhcyBiZWVuIGRlZmluZWQKLSUgd2l0aCBAc2V0LgotJQotXGRlZlxpZnNldHtccGFyc2VhcmdcaWZzZXR4eHh9Ci1cZGVmXGlmc2V0eHh4ICMxeyUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lXHJlbGF4Ci0gICAgXGV4cGFuZGFmdGVyXGlmc2V0ZmFpbAotICBcZWxzZQotICAgIFxleHBhbmRhZnRlclxpZnNldHN1Y2NlZWQKLSAgXGZpCi19Ci1cZGVmXGlmc2V0c3VjY2VlZHtcY29uZGl0aW9uYWxzdWNjZWVke2lmc2V0fX0KLVxkZWZcaWZzZXRmYWlse1xuZXN0ZWRpZ25vcmV7aWZzZXR9fQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZnNldH0KLQotJSBAaWZjbGVhciBWQVIgLi4uIEBlbmQgaWZjbGVhciByZWFkcyB0aGUgYC4uLicgaWZmIFZBUiBoYXMgbmV2ZXIgYmVlbgotJSBkZWZpbmVkIHdpdGggQHNldCwgb3IgaGFzIGJlZW4gdW5kZWZpbmVkIHdpdGggQGNsZWFyLgotJQotXGRlZlxpZmNsZWFye1xwYXJzZWFyZ1xpZmNsZWFyeHh4fQotXGRlZlxpZmNsZWFyeHh4ICMxeyUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lXHJlbGF4Ci0gICAgXGV4cGFuZGFmdGVyXGlmY2xlYXJzdWNjZWVkCi0gIFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGlmY2xlYXJmYWlsCi0gIFxmaQotfQotXGRlZlxpZmNsZWFyc3VjY2VlZHtcY29uZGl0aW9uYWxzdWNjZWVke2lmY2xlYXJ9fQotXGRlZlxpZmNsZWFyZmFpbHtcbmVzdGVkaWdub3Jle2lmY2xlYXJ9fQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZmNsZWFyfQotCi0lIEBpZnRleCwgQGlmbm90aHRtbCwgQGlmbm90aW5mbyBhbHdheXMgc3VjY2VlZDsgd2UgcmVhZCB0aGUgdGV4dAotJSBmb2xsb3dpbmcsIHRocm91Z2ggdGhlIGZpcnN0IEBlbmQgaWZ0ZXggKGV0Yy4pLiAgTWFrZSBgQGVuZCBpZnRleCcKLSUgKGV0Yy4pIHZhbGlkIG9ubHkgYWZ0ZXIgYW4gQGlmdGV4LgotJQotXGRlZlxpZnRleHtcY29uZGl0aW9uYWxzdWNjZWVke2lmdGV4fX0KLVxkZWZcaWZub3RodG1se1xjb25kaXRpb25hbHN1Y2NlZWR7aWZub3RodG1sfX0KLVxkZWZcaWZub3RpbmZve1xjb25kaXRpb25hbHN1Y2NlZWR7aWZub3RpbmZvfX0KLVxkZWZpbmV1bm1hdGNoZWRlbmR7aWZ0ZXh9Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmbm90aHRtbH0KLVxkZWZpbmV1bm1hdGNoZWRlbmR7aWZub3RpbmZvfQotCi0lIFdlIGNhbid0IGp1c3Qgd2FudCB0byBzdGFydCBhIGdyb3VwIGF0IEBpZnRleCAoZm9yIGV4YW1wbGUpIGFuZCBlbmQgaXQKLSUgYXQgQGVuZCBpZnRleCwgc2luY2UgdGhlbiBAc2V0IGNvbW1hbmRzIGluc2lkZSB0aGUgY29uZGl0aW9uYWwgaGF2ZSBubwotJSBlZmZlY3QgKHRoZXknZCBnZXQgcmV2ZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZ3JvdXApLiAgU28gd2UgbXVzdAotJSBkZWZpbmUgXEVpZnRleCB0byByZWRlZmluZSBpdHNlbGYgdG8gYmUgaXRzIHByZXZpb3VzIHZhbHVlLiAgKFdlIGNhbid0Ci0lIGp1c3QgZGVmaW5lIGl0IHRvIGZhaWwgYWdhaW4gd2l0aCBhbiBgYHVubWF0Y2hlZCBlbmQnJyBlcnJvciwgc2luY2UKLSUgdGhlIEBpZnNldCBtaWdodCBiZSBuZXN0ZWQuKQotJQotXGRlZlxjb25kaXRpb25hbHN1Y2NlZWQjMXslCi0gIFxlZGVmXHRlbXB7JQotICAgICUgUmVtZW1iZXIgdGhlIGN1cnJlbnQgdmFsdWUgb2YgXEUjMS4KLSAgICBcbGV0XG5lY2V7cHJldkUjMX0gPSBcbmVjZXtFIzF9JQotICAgICUKLSAgICAlIEF0IHRoZSBgQGVuZCAjMScsIHJlZGVmaW5lIFxFIzEgdG8gYmUgaXRzIHByZXZpb3VzIHZhbHVlLgotICAgIFxkZWZcbmVjZXtFIzF9e1xsZXRcbmVjZXtFIzF9ID0gXG5lY2V7cHJldkUjMX19JQotICB9JQotICBcdGVtcAotfQotCi0lIFdlIG5lZWQgdG8gZXhwYW5kIGxvdHMgb2YgXGNzbmFtZSdzLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBleHBhbmQgdGhlCi0lIGNvbnRyb2wgc2VxdWVuY2VzIGFmdGVyIHdlJ3ZlIGNvbnN0cnVjdGVkIHRoZW0uCi0lCi1cZGVmXG5lY2UjMXtcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lIzFcZW5kY3NuYW1lfQotCi0lIEBhc2lzIGp1c3QgeWllbGRzIGl0cyBhcmd1bWVudC4gIFVzZWQgd2l0aCBAdGFibGUsIGZvciBleGFtcGxlLgotJQotXGRlZlxhc2lzIzF7IzF9Ci0KLSUgQG1hdGggbWVhbnMgb3V0cHV0IGluIG1hdGggbW9kZS4KLSUgV2UgZG9uJ3QgdXNlICQncyBkaXJlY3RseSBpbiB0aGUgZGVmaW5pdGlvbiBvZiBcbWF0aCBiZWNhdXNlIGNvbnRyb2wKLSUgc2VxdWVuY2VzIGxpa2UgXG1hdGggYXJlIGV4cGFuZGVkIHdoZW4gdGhlIHRvYyBmaWxlIGlzIHdyaXR0ZW4uICBUaGVuLAotJSB3ZSByZWFkIHRoZSB0b2MgZmlsZSBiYWNrLCB0aGUgJCdzIHdpbGwgYmUgbm9ybWFsIGNoYXJhY3RlcnMgKGFzIHRoZXkKLSUgc2hvdWxkIGJlLCBhY2NvcmRpbmcgdG8gdGhlIGRlZmluaXRpb24gb2YgVGV4aW5mbykuICBTbyB3ZSBtdXN0IHVzZSBhCi0lIGNvbnRyb2wgc2VxdWVuY2UgdG8gc3dpdGNoIGludG8gYW5kIG91dCBvZiBtYXRoIG1vZGUuCi0lCi0lIFRoaXMgaXNuJ3QgcXVpdGUgZW5vdWdoIGZvciBAbWF0aCB0byB3b3JrIHByb3Blcmx5IGluIGluZGljZXMsIGJ1dCBpdAotJSBzZWVtcyB1bmxpa2VseSBpdCB3aWxsIGV2ZXIgYmUgbmVlZGVkIHRoZXJlLgotJQotXGxldFxpbXBsaWNpdG1hdGggPSAkCi1cZGVmXG1hdGgjMXtcaW1wbGljaXRtYXRoICMxXGltcGxpY2l0bWF0aH0KLQotJSBAYnVsbGV0IGFuZCBAbWludXMgbmVlZCB0aGUgc2FtZSB0cmVhdG1lbnQgYXMgQG1hdGgsIGp1c3QgYWJvdmUuCi1cZGVmXGJ1bGxldHtcaW1wbGljaXRtYXRoXHB0ZXhidWxsZXRcaW1wbGljaXRtYXRofQotXGRlZlxtaW51c3tcaW1wbGljaXRtYXRoLVxpbXBsaWNpdG1hdGh9Ci0KLSUgQHJlZmlsbCBpcyBhIG5vLW9wLgotXGxldFxyZWZpbGw9XHJlbGF4Ci0KLSUgSWYgd29ya2luZyBvbiBhIGxhcmdlIGRvY3VtZW50IGluIGNoYXB0ZXJzLCBpdCBpcyBjb252ZW5pZW50IHRvCi0lIGJlIGFibGUgdG8gZGlzYWJsZSBpbmRleGluZywgY3Jvc3MtcmVmZXJlbmNpbmcsIGFuZCBjb250ZW50cywgZm9yIHRlc3QgcnVucy4KLSUgVGhpcyBpcyBkb25lIHdpdGggQG5vdmFsaWRhdGUgKGJlZm9yZSBAc2V0ZmlsZW5hbWUpLgotJQotXG5ld2lmXGlmbGlua3MgXGxpbmtzdHJ1ZSAlIGJ5IGRlZmF1bHQgd2Ugd2FudCB0aGUgYXV4IGZpbGVzLgotXGxldFxub3ZhbGlkYXRlID0gXGxpbmtzZmFsc2UKLQotJSBAc2V0ZmlsZW5hbWUgaXMgZG9uZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IHRleGluZm8gZmlsZS4KLSUgU28gb3BlbiBoZXJlIHRoZSBmaWxlcyB3ZSBuZWVkIHRvIGhhdmUgb3BlbiB3aGlsZSByZWFkaW5nIHRoZSBpbnB1dC4KLSUgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBtYWtlIGEgLmZtdCBmaWxlIGZvciB0ZXhpbmZvLgotXGRlZlxzZXRmaWxlbmFtZXslCi0gICBcaWZsaW5rcyAKLSAgICAgXHJlYWRhdXhmaWxlCi0gICBcZmkgJSBcb3BlbmluZGljZXMgbmVlZHMgdG8gZG8gc29tZSB3b3JrIGluIGFueSBjYXNlLgotICAgXG9wZW5pbmRpY2VzCi0gICBcZml4YmFja3NsYXNoICAlIFR1cm4gb2ZmIGhhY2sgdG8gc3dhbGxvdyBgXGlucHV0IHRleGluZm8nLgotICAgXGdsb2JhbFxsZXRcc2V0ZmlsZW5hbWU9XGNvbW1lbnQgJSBJZ25vcmUgZXh0cmEgQHNldGZpbGVuYW1lIGNtZHMuCi0gICAlCi0gICAlIElmIHRleGluZm8uY25mIGlzIHByZXNlbnQgb24gdGhlIHN5c3RlbSwgcmVhZCBpdC4KLSAgICUgVXNlZnVsIGZvciBzaXRlLXdpZGUgQGFmb3VycGFwZXIsIGV0Yy4KLSAgICUgSnVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLCBjbG9zZSB0aGUgaW5wdXQgc3RyZWFtIGJlZm9yZSB0aGUgXGlucHV0LgotICAgXG9wZW5pbiAxIHRleGluZm8uY25mCi0gICBcaWZlb2YxIFxsZXRcdGVtcD1ccmVsYXggXGVsc2UgXGRlZlx0ZW1we1xpbnB1dCB0ZXhpbmZvLmNuZiB9XGZpCi0gICBcY2xvc2VpbjEKLSAgIFx0ZW1wCi0gICAlCi0gICBcY29tbWVudCAlIElnbm9yZSB0aGUgYWN0dWFsIGZpbGVuYW1lLgotfQotCi0lIENhbGxlZCBmcm9tIFxzZXRmaWxlbmFtZS4KLSUgCi1cZGVmXG9wZW5pbmRpY2VzeyUKLSAgXG5ld2luZGV4e2NwfSUKLSAgXG5ld2NvZGVpbmRleHtmbn0lCi0gIFxuZXdjb2RlaW5kZXh7dnJ9JQotICBcbmV3Y29kZWluZGV4e3RwfSUKLSAgXG5ld2NvZGVpbmRleHtreX0lCi0gIFxuZXdjb2RlaW5kZXh7cGd9JQotfQotCi0lIEBieWUuCi1cb3V0ZXJcZGVmXGJ5ZXtccGFnZWFsaWdubWFjcm9cdHJhY2luZ3N0YXRzPTFccHRleGVuZH0KLQotCi1cbWVzc2FnZXtmb250cyx9Ci0lIEZvbnQtY2hhbmdlIGNvbW1hbmRzLgotCi0lIFRleGluZm8gc29ydCBvZiBzdXBwb3J0cyB0aGUgc2FucyBzZXJpZiBmb250IHN0eWxlLCB3aGljaCBwbGFpbiBUZVggZG9lcyBub3QuCi0lIFNvIHdlIHNldCB1cCBhIFxzZiBhbmFsb2dvdXMgdG8gcGxhaW4ncyBccm0sIGV0Yy4KLVxuZXdmYW1cc2ZmYW0KLVxkZWZcc2Z7XGZhbT1cc2ZmYW0gXHRlbnNmfQotXGxldFxsaSA9IFxzZiAlIFNvbWV0aW1lcyB3ZSBjYWxsIGl0IFxsaSwgbm90IFxzZi4KLQotJSBXZSBkb24ndCBuZWVkIG1hdGggZm9yIHRoaXMgb25lLgotXGRlZlx0dHNse1x0ZW50dHNsfQotCi0lIFVzZSBDb21wdXRlciBNb2Rlcm4gZm9udHMgYXQgXG1hZ3N0ZXBoYWxmICgxMXB0KS4KLVxuZXdjb3VudFxtYWlubWFnc3RlcAotXG1haW5tYWdzdGVwPVxtYWdzdGVwaGFsZgotCi0lIFNldCB0aGUgZm9udCBtYWNybyAjMSB0byB0aGUgZm9udCBuYW1lZCAjMiwgYWRkaW5nIG9uIHRoZQotJSBzcGVjaWZpZWQgZm9udCBwcmVmaXggKG5vcm1hbGx5IGBjbScpLgotJSAjMyBpcyB0aGUgZm9udCdzIGRlc2lnbiBzaXplLCAjNCBpcyBhIHNjYWxlIGZhY3RvcgotXGRlZlxzZXRmb250IzEjMiMzIzR7XGZvbnQjMT1cZm9udHByZWZpeCMyIzMgc2NhbGVkICM0fQotCi0lIFVzZSBjbSBhcyB0aGUgZGVmYXVsdCBmb250IHByZWZpeC4KLSUgVG8gc3BlY2lmeSB0aGUgZm9udCBwcmVmaXgsIHlvdSBtdXN0IGRlZmluZSBcZm9udHByZWZpeAotJSBiZWZvcmUgeW91IHJlYWQgaW4gdGV4aW5mby50ZXguCi1caWZ4XGZvbnRwcmVmaXhcdW5kZWZpbmVkCi1cZGVmXGZvbnRwcmVmaXh7Y219Ci1cZmkKLSUgU3VwcG9ydCBmb250IGZhbWlsaWVzIHRoYXQgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWluZyBzY2hlbWUgYXMgQ00uCi1cZGVmXHJtc2hhcGV7cn0KLVxkZWZccm1ic2hhcGV7Ynh9ICAgICAgICAgICAgICAgJXdoZXJlIHRoZSBub3JtYWwgZmFjZSBpcyBib2xkCi1cZGVmXGJmc2hhcGV7Yn0KLVxkZWZcYnhzaGFwZXtieH0KLVxkZWZcdHRzaGFwZXt0dH0KLVxkZWZcdHRic2hhcGV7dHR9Ci1cZGVmXHR0c2xzaGFwZXtzbHR0fQotXGRlZlxpdHNoYXBle3RpfQotXGRlZlxpdGJzaGFwZXtieHRpfQotXGRlZlxzbHNoYXBle3NsfQotXGRlZlxzbGJzaGFwZXtieHNsfQotXGRlZlxzZnNoYXBle3NzfQotXGRlZlxzZmJzaGFwZXtzc30KLVxkZWZcc2NzaGFwZXtjc2N9Ci1cZGVmXHNjYnNoYXBle2NzY30KLQotXGlmeFxiaWdnZXJccmVsYXgKLVxsZXRcbWFpbm1hZ3N0ZXA9XG1hZ3N0ZXAxCi1cc2V0Zm9udFx0ZXh0cm1ccm1zaGFwZXsxMn17MTAwMH0KLVxzZXRmb250XHRleHR0dFx0dHNoYXBlezEyfXsxMDAwfQotXGVsc2UKLVxzZXRmb250XHRleHRybVxybXNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0dHRcdHRzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXGZpCi0lIEluc3RlYWQgb2YgY21iMTAsIHlvdSBtYW55IHdhbnQgdG8gdXNlIGNtYngxMC4KLSUgY21ieDEwIGlzIGEgcHJldHRpZXIgZm9udCBvbiBpdHMgb3duLCBidXQgY21iMTAKLSUgbG9va3MgYmV0dGVyIHdoZW4gZW1iZWRkZWQgaW4gYSBsaW5lIHdpdGggY21yMTAuCi1cc2V0Zm9udFx0ZXh0YmZcYmZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dGl0XGl0c2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHRzbFxzbHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0c2Zcc2ZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHNjXHNjc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHR0dHNsXHR0c2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXGZvbnRcdGV4dGk9Y21taTEwIHNjYWxlZCBcbWFpbm1hZ3N0ZXAKLVxmb250XHRleHRzeT1jbXN5MTAgc2NhbGVkIFxtYWlubWFnc3RlcAotCi0lIEEgZmV3IGZvbnRzIGZvciBAZGVmdW4sIGV0Yy4KLVxzZXRmb250XGRlZmJmXGJ4c2hhcGV7MTB9e1xtYWdzdGVwMX0gJXdhcyAxMzE0Ci1cc2V0Zm9udFxkZWZ0dFx0dHNoYXBlezEwfXtcbWFnc3RlcDF9Ci1cZGVmXGRme1xsZXRcdGVudHQ9XGRlZnR0IFxsZXRcdGVuYmYgPSBcZGVmYmYgXGJmfQotCi0lIEZvbnRzIGZvciBpbmRpY2VzIGFuZCBzbWFsbCBleGFtcGxlcyAoOXB0KS4KLSUgV2UgYWN0dWFsbHkgdXNlIHRoZSBzbGFudGVkIGZvbnQgcmF0aGVyIHRoYW4gdGhlIGl0YWxpYywKLSUgYmVjYXVzZSB0ZXhpbmZvIG5vcm1hbGx5IHVzZXMgdGhlIHNsYW50ZWQgZm9udHMgZm9yIHRoYXQuCi0lIERvIG5vdCBtYWtlIG1hbnkgZm9udCBkaXN0aW5jdGlvbnMgaW4gZ2VuZXJhbCBpbiB0aGUgaW5kZXgsIHNpbmNlIHRoZXkKLSUgYXJlbid0IHZlcnkgdXNlZnVsLgotXHNldGZvbnRcbmluZXR0XHR0c2hhcGV7OX17MTAwMH0KLVxzZXRmb250XG5pbmV0dHNsXHR0c2xzaGFwZXsxMH17OTAwfQotXHNldGZvbnRcaW5kcm1ccm1zaGFwZXs5fXsxMDAwfQotXHNldGZvbnRcaW5kaXRcaXRzaGFwZXs5fXsxMDAwfQotXHNldGZvbnRcaW5kc2xcc2xzaGFwZXs5fXsxMDAwfQotXGxldFxpbmR0dD1cbmluZXR0Ci1cbGV0XGluZHR0c2w9XG5pbmV0dHNsCi1cbGV0XGluZHNmPVxpbmRybQotXGxldFxpbmRiZj1caW5kcm0KLVxzZXRmb250XGluZHNjXHNjc2hhcGV7MTB9ezkwMH0KLVxmb250XGluZGk9Y21taTkKLVxmb250XGluZHN5PWNtc3k5Ci0KLSUgRm9udHMgZm9yIHRpdGxlIHBhZ2U6Ci1cc2V0Zm9udFx0aXRsZXJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFx0aXRsZWl0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDR9Ci1cc2V0Zm9udFx0aXRsZXNsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDR9Ci1cc2V0Zm9udFx0aXRsZXR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFx0aXRsZXR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDR9Ci1cc2V0Zm9udFx0aXRsZXNmXHNmYnNoYXBlezE3fXtcbWFnc3RlcDF9Ci1cbGV0XHRpdGxlYmY9XHRpdGxlcm0KLVxzZXRmb250XHRpdGxlc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxmb250XHRpdGxlaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMwotXGZvbnRcdGl0bGVzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwNAotXGRlZlxhdXRob3JybXtcc2Vjcm19Ci0KLSUgQ2hhcHRlciAoYW5kIHVubnVtYmVyZWQpIGZvbnRzICgxNy4yOHB0KS4KLVxzZXRmb250XGNoYXBybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAyfQotXHNldGZvbnRcY2hhcGl0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFxjaGFwc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwM30KLVxzZXRmb250XGNoYXB0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAyfQotXHNldGZvbnRcY2hhcHR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFxjaGFwc2Zcc2Zic2hhcGV7MTd9ezEwMDB9Ci1cbGV0XGNoYXBiZj1cY2hhcHJtCi1cc2V0Zm9udFxjaGFwc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwM30KLVxmb250XGNoYXBpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAyCi1cZm9udFxjaGFwc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDMKLQotJSBTZWN0aW9uIGZvbnRzICgxNC40cHQpLgotXHNldGZvbnRcc2Vjcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwMX0KLVxzZXRmb250XHNlY2l0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxzZWNzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAyfQotXHNldGZvbnRcc2VjdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwMX0KLVxzZXRmb250XHNlY3R0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxzZWNzZlxzZmJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXGxldFxzZWNiZlxzZWNybQotXHNldGZvbnRcc2Vjc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxmb250XHNlY2k9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDEKLVxmb250XHNlY3N5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXAyCi0KLSUgXHNldGZvbnRcc3NlY3JtXGJ4c2hhcGV7MTB9e1xtYWdzdGVwMX0gICAgJSBUaGlzIHNpemUgYW4gZm9udCBsb29rZWQgYmFkLgotJSBcc2V0Zm9udFxzc2VjaXRcaXRzaGFwZXsxMH17XG1hZ3N0ZXAxfSAgICAlIFRoZSBsZXR0ZXJzIHdlcmUgdG9vIGNyb3dkZWQuCi0lIFxzZXRmb250XHNzZWNzbFxzbHNoYXBlezEwfXtcbWFnc3RlcDF9Ci0lIFxzZXRmb250XHNzZWN0dFx0dHNoYXBlezEwfXtcbWFnc3RlcDF9Ci0lIFxzZXRmb250XHNzZWNzZlxzZnNoYXBlezEwfXtcbWFnc3RlcDF9Ci0KLSVcc2V0Zm9udFxzc2Vjcm1cYmZzaGFwZXsxMH17MTMxNX0gICAgICAlIE5vdGUgdGhlIHVzZSBvZiBjbWIgcmF0aGVyIHRoYW4gY21ieC4KLSVcc2V0Zm9udFxzc2VjaXRcaXRzaGFwZXsxMH17MTMxNX0gICAgICAlIEFsc28sIHRoZSBzaXplIGlzIGEgbGl0dGxlIGxhcmdlciB0aGFuCi0lXHNldGZvbnRcc3NlY3NsXHNsc2hhcGV7MTB9ezEzMTV9ICAgICAgJSBiZWluZyBzY2FsZWQgbWFnc3RlcDEuCi0lXHNldGZvbnRcc3NlY3R0XHR0c2hhcGV7MTB9ezEzMTV9Ci0lXHNldGZvbnRcc3NlY3NmXHNmc2hhcGV7MTB9ezEzMTV9Ci0KLSVcbGV0XHNzZWNiZj1cc3NlY3JtCi0KLSUgU3Vic2VjdGlvbiBmb250cyAoMTMuMTVwdCkuCi1cc2V0Zm9udFxzc2Vjcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KLVxzZXRmb250XHNzZWNpdFxpdGJzaGFwZXsxMH17MTMxNX0KLVxzZXRmb250XHNzZWNzbFxzbGJzaGFwZXsxMH17MTMxNX0KLVxzZXRmb250XHNzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQotXHNldGZvbnRcc3NlY3R0c2xcdHRzbHNoYXBlezEwfXsxMzE1fQotXHNldGZvbnRcc3NlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9Ci1cbGV0XHNzZWNiZlxzc2Vjcm0KLVxzZXRmb250XHNzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAxfQotXGZvbnRcc3NlY2k9Y21taTEyIHNjYWxlZCBcbWFnc3RlcGhhbGYKLVxmb250XHNzZWNzeT1jbXN5MTAgc2NhbGVkIDEzMTUKLSUgVGhlIHNtYWxsY2FwcyBhbmQgc3ltYm9sIGZvbnRzIHNob3VsZCBhY3R1YWxseSBiZSBzY2FsZWQgXG1hZ3N0ZXAxLjUsCi0lIGJ1dCB0aGF0IGlzIG5vdCBhIHN0YW5kYXJkIG1hZ25pZmljYXRpb24uCi0KLSUgSW4gb3JkZXIgZm9yIHRoZSBmb250IGNoYW5nZXMgdG8gYWZmZWN0IG1vc3QgbWF0aCBzeW1ib2xzIGFuZCBsZXR0ZXJzLAotJSB3ZSBoYXZlIHRvIGRlZmluZSB0aGUgXHRleHRmb250IG9mIHRoZSBzdGFuZGFyZCBmYW1pbGllcy4gIFNpbmNlCi0lIHRleGluZm8gZG9lc24ndCBhbGxvdyBmb3IgcHJvZHVjaW5nIHN1YnNjcmlwdHMgYW5kIHN1cGVyc2NyaXB0cywgd2UKLSUgZG9uJ3QgYm90aGVyIHRvIHJlc2V0IFxzY3JpcHRmb250IGFuZCBcc2NyaXB0c2NyaXB0Zm9udCAod2hpY2ggd291bGQKLSUgYWxzbyByZXF1aXJlIGxvYWRpbmcgYSBsb3QgbW9yZSBmb250cykuCi0lCi1cZGVmXHJlc2V0bWF0aGZvbnRzeyUKLSAgXHRleHRmb250MCA9IFx0ZW5ybSBcdGV4dGZvbnQxID0gXHRlbmkgXHRleHRmb250MiA9IFx0ZW5zeQotICBcdGV4dGZvbnRcaXRmYW0gPSBcdGVuaXQgXHRleHRmb250XHNsZmFtID0gXHRlbnNsIFx0ZXh0Zm9udFxiZmZhbSA9IFx0ZW5iZgotICBcdGV4dGZvbnRcdHRmYW0gPSBcdGVudHQgXHRleHRmb250XHNmZmFtID0gXHRlbnNmCi19Ci0KLQotJSBUaGUgZm9udC1jaGFuZ2luZyBjb21tYW5kcyByZWRlZmluZSB0aGUgbWVhbmluZ3Mgb2YgXHRlblNUWUxFLCBpbnN0ZWFkCi0lIG9mIGp1c3QgXFNUWUxFLiAgV2UgZG8gdGhpcyBzbyB0aGF0IGZvbnQgY2hhbmdlcyB3aWxsIGNvbnRpbnVlIHRvIHdvcmsKLSUgaW4gbWF0aCBtb2RlLCB3aGVyZSBpdCBpcyB0aGUgY3VycmVudCBcZmFtIHRoYXQgaXMgcmVsZXZhbnQgaW4gbW9zdAotJSBjYXNlcywgbm90IHRoZSBjdXJyZW50IGZvbnQuICBQbGFpbiBUZVggZG9lcyBcZGVmXGJme1xmYW09XGJmZmFtCi0lIFx0ZW5iZn0sIGZvciBleGFtcGxlLiAgQnkgcmVkZWZpbmluZyBcdGVuYmYsIHdlIG9idmlhdGUgdGhlIG5lZWQgdG8KLSUgcmVkZWZpbmUgXGJmIGl0c2VsZi4KLVxkZWZcdGV4dGZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cdGV4dHJtIFxsZXRcdGVuaXQ9XHRleHRpdCBcbGV0XHRlbnNsPVx0ZXh0c2wKLSAgXGxldFx0ZW5iZj1cdGV4dGJmIFxsZXRcdGVudHQ9XHRleHR0dCBcbGV0XHNtYWxsY2Fwcz1cdGV4dHNjCi0gIFxsZXRcdGVuc2Y9XHRleHRzZiBcbGV0XHRlbmk9XHRleHRpIFxsZXRcdGVuc3k9XHRleHRzeSBcbGV0XHRlbnR0c2w9XHRleHR0dHNsCi0gIFxyZXNldG1hdGhmb250c30KLVxkZWZcdGl0bGVmb250c3slCi0gIFxsZXRcdGVucm09XHRpdGxlcm0gXGxldFx0ZW5pdD1cdGl0bGVpdCBcbGV0XHRlbnNsPVx0aXRsZXNsCi0gIFxsZXRcdGVuYmY9XHRpdGxlYmYgXGxldFx0ZW50dD1cdGl0bGV0dCBcbGV0XHNtYWxsY2Fwcz1cdGl0bGVzYwotICBcbGV0XHRlbnNmPVx0aXRsZXNmIFxsZXRcdGVuaT1cdGl0bGVpIFxsZXRcdGVuc3k9XHRpdGxlc3kKLSAgXGxldFx0ZW50dHNsPVx0aXRsZXR0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezI1cHR9fQotXGRlZlx0aXRsZWZvbnQjMXt7XHRpdGxlZm9udHNccm0gIzF9fQotXGRlZlxjaGFwZm9udHN7JQotICBcbGV0XHRlbnJtPVxjaGFwcm0gXGxldFx0ZW5pdD1cY2hhcGl0IFxsZXRcdGVuc2w9XGNoYXBzbAotICBcbGV0XHRlbmJmPVxjaGFwYmYgXGxldFx0ZW50dD1cY2hhcHR0IFxsZXRcc21hbGxjYXBzPVxjaGFwc2MKLSAgXGxldFx0ZW5zZj1cY2hhcHNmIFxsZXRcdGVuaT1cY2hhcGkgXGxldFx0ZW5zeT1cY2hhcHN5IFxsZXRcdGVudHRzbD1cY2hhcHR0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE5cHR9fQotXGRlZlxzZWNmb250c3slCi0gIFxsZXRcdGVucm09XHNlY3JtIFxsZXRcdGVuaXQ9XHNlY2l0IFxsZXRcdGVuc2w9XHNlY3NsCi0gIFxsZXRcdGVuYmY9XHNlY2JmIFxsZXRcdGVudHQ9XHNlY3R0IFxsZXRcc21hbGxjYXBzPVxzZWNzYwotICBcbGV0XHRlbnNmPVxzZWNzZiBcbGV0XHRlbmk9XHNlY2kgXGxldFx0ZW5zeT1cc2Vjc3kgXGxldFx0ZW50dHNsPVxzZWN0dHNsCi0gIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxNnB0fX0KLVxkZWZcc3Vic2VjZm9udHN7JQotICBcbGV0XHRlbnJtPVxzc2Vjcm0gXGxldFx0ZW5pdD1cc3NlY2l0IFxsZXRcdGVuc2w9XHNzZWNzbAotICBcbGV0XHRlbmJmPVxzc2VjYmYgXGxldFx0ZW50dD1cc3NlY3R0IFxsZXRcc21hbGxjYXBzPVxzc2Vjc2MKLSAgXGxldFx0ZW5zZj1cc3NlY3NmIFxsZXRcdGVuaT1cc3NlY2kgXGxldFx0ZW5zeT1cc3NlY3N5IFxsZXRcdGVudHRzbD1cc3NlY3R0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE1cHR9fQotXGxldFxzdWJzdWJzZWNmb250cyA9IFxzdWJzZWNmb250cyAlIE1heWJlIG1ha2Ugc3NzZWMgZm9udHMgc2NhbGVkIG1hZ3N0ZXBoYWxmPwotXGRlZlxpbmRleGZvbnRzeyUKLSAgXGxldFx0ZW5ybT1caW5kcm0gXGxldFx0ZW5pdD1caW5kaXQgXGxldFx0ZW5zbD1caW5kc2wKLSAgXGxldFx0ZW5iZj1caW5kYmYgXGxldFx0ZW50dD1caW5kdHQgXGxldFxzbWFsbGNhcHM9XGluZHNjCi0gIFxsZXRcdGVuc2Y9XGluZHNmIFxsZXRcdGVuaT1caW5kaSBcbGV0XHRlbnN5PVxpbmRzeSBcbGV0XHRlbnR0c2w9XGluZHR0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezEycHR9fQotCi0lIFNldCB1cCB0aGUgZGVmYXVsdCBmb250cywgc28gd2UgY2FuIHVzZSB0aGVtIGZvciBjcmVhdGluZyBib3hlcy4KLSUKLVx0ZXh0Zm9udHMKLQotJSBEZWZpbmUgdGhlc2Ugc28gdGhleSBjYW4gYmUgZWFzaWx5IGNoYW5nZWQgZm9yIG90aGVyIGZvbnRzLgotXGRlZlxhbmdsZWxlZnR7JFxsYW5nbGUkfQotXGRlZlxhbmdsZXJpZ2h0eyRccmFuZ2xlJH0KLQotJSBDb3VudCBkZXB0aCBpbiBmb250LWNoYW5nZXMsIGZvciBlcnJvciBjaGVja3MKLVxuZXdjb3VudFxmb250ZGVwdGggXGZvbnRkZXB0aD0wCi0KLSUgRm9udHMgZm9yIHNob3J0IHRhYmxlIG9mIGNvbnRlbnRzLgotXHNldGZvbnRcc2hvcnRjb250cm1ccm1zaGFwZXsxMn17MTAwMH0KLVxzZXRmb250XHNob3J0Y29udGJmXGJ4c2hhcGV7MTJ9ezEwMDB9Ci1cc2V0Zm9udFxzaG9ydGNvbnRzbFxzbHNoYXBlezEyfXsxMDAwfQotCi0lJSBBZGQgc2NyaWJlLWxpa2UgZm9udCBlbnZpcm9ubWVudHMsIHBsdXMgQGwgZm9yIGlubGluZSBsaXNwICh1c3VhbGx5IHNhbnMKLSUlIHNlcmlmKSBhbmQgQGlpIGZvciBUZVggaXRhbGljCi0KLSUgXHNtYXJ0aXRhbGlje0FSR30gb3V0cHV0cyBhcmcgaW4gaXRhbGljcywgZm9sbG93ZWQgYnkgYW4gaXRhbGljIGNvcnJlY3Rpb24KLSUgdW5sZXNzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGlzIHN1Y2ggYXMgbm90IHRvIG5lZWQgb25lLgotXGRlZlxzbWFydGl0YWxpY3h7XGlmeFxuZXh0LFxlbHNlXGlmeFxuZXh0LVxlbHNlXGlmeFxuZXh0LlxlbHNlXC9cZmlcZmlcZml9Ci1cZGVmXHNtYXJ0c2xhbnRlZCMxe3tcc2wgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KLVxkZWZcc21hcnRpdGFsaWMjMXt7XGl0ICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9Ci0KLVxsZXRcaT1cc21hcnRpdGFsaWMKLVxsZXRcdmFyPVxzbWFydHNsYW50ZWQKLVxsZXRcZGZuPVxzbWFydHNsYW50ZWQKLVxsZXRcZW1waD1cc21hcnRpdGFsaWMKLVxsZXRcY2l0ZT1cc21hcnRzbGFudGVkCi0KLVxkZWZcYiMxe3tcYmYgIzF9fQotXGxldFxzdHJvbmc9XGIKLQotJSBXZSBjYW4ndCBqdXN0IHVzZSBcZXhoeXBoZW5wZW5hbHR5LCBiZWNhdXNlIHRoYXQgb25seSBoYXMgZWZmZWN0IGF0Ci0lIHRoZSBlbmQgb2YgYSBwYXJhZ3JhcGguICBSZXN0b3JlIG5vcm1hbCBoeXBoZW5hdGlvbiBhdCB0aGUgZW5kIG9mIHRoZQotJSBncm91cCB3aXRoaW4gd2hpY2ggXG5vaHlwaGVuYXRpb24gaXMgcHJlc3VtYWJseSBjYWxsZWQuCi0lCi1cZGVmXG5vaHlwaGVuYXRpb257XGh5cGhlbmNoYXJcZm9udCA9IC0xICBcYWZ0ZXJncm91cFxyZXN0b3JlaHlwaGVuYXRpb259Ci1cZGVmXHJlc3RvcmVoeXBoZW5hdGlvbntcaHlwaGVuY2hhclxmb250ID0gYC0gfQotCi1cZGVmXHQjMXslCi0gIHtcdHQgXHJhd2JhY2tzbGFzaCBcZnJlbmNoc3BhY2luZyAjMX0lCi0gIFxudWxsCi19Ci1cbGV0XHR0Zm9udD1cdAotXGRlZlxzYW1wIzF7YFx0Y2xvc2V7IzF9J1xudWxsfQotXHNldGZvbnRcc21hbGxybVxybXNoYXBlezh9ezEwMDB9Ci1cZm9udFxzbWFsbHN5PWNtc3k5Ci1cZGVmXGtleSMxe3tcc21hbGxybVx0ZXh0Zm9udDI9XHNtYWxsc3kgXGxlYXZldm1vZGVcaGJveHslCi0gIFxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlbGVmdH1ca2Vybi0uMDhlbVx2dG9weyUKLSAgICBcdmJveHtcaHJ1bGVca2Vybi0wLjRwdAotICAgICBcaGJveHtccmFpc2UwLjRwdFxoYm94e1x2cGhhbnRvbXtcYW5nbGVsZWZ0fX0jMX19JQotICAgIFxrZXJuLTAuNHB0XGhydWxlfSUKLSAgXGtlcm4tLjA2ZW1ccmFpc2UwLjRwdFxoYm94e1xhbmdsZXJpZ2h0fX19fQotJSBUaGUgb2xkIGRlZmluaXRpb24sIHdpdGggbm8gbG96ZW5nZToKLSVcZGVmXGtleSAjMXt7XHR0c2wgXG5vaHlwaGVuYXRpb24gXHVwcGVyY2FzZXsjMX19XG51bGx9Ci1cZGVmXGN0cmwgIzF7e1x0dCBccmF3YmFja3NsYXNoIFxoYXR9IzF9Ci0KLSUgQGZpbGUsIEBvcHRpb24gYXJlIHRoZSBzYW1lIGFzIEBzYW1wLgotXGxldFxmaWxlPVxzYW1wCi1cbGV0XG9wdGlvbj1cc2FtcAotCi0lIEBjb2RlIGlzIGEgbW9kaWZpY2F0aW9uIG9mIEB0LAotJSB3aGljaCBtYWtlcyBzcGFjZXMgdGhlIHNhbWUgc2l6ZSBhcyBub3JtYWwgaW4gdGhlIHN1cnJvdW5kaW5nIHRleHQuCi1cZGVmXHRjbG9zZSMxeyUKLSAgeyUKLSAgICAlIENoYW5nZSBub3JtYWwgaW50ZXJ3b3JkIHNwYWNlIHRvIGJlIHNhbWUgYXMgZm9yIHRoZSBjdXJyZW50IGZvbnQuCi0gICAgXHNwYWNlc2tpcCA9IFxmb250ZGltZW4yXGZvbnQKLSAgICAlCi0gICAgJSBTd2l0Y2ggdG8gdHlwZXdyaXRlci4KLSAgICBcdHQKLSAgICAlCi0gICAgJSBCdXQgYFwgJyBwcm9kdWNlcyB0aGUgbGFyZ2UgdHlwZXdyaXRlciBpbnRlcndvcmQgc3BhY2UuCi0gICAgXGRlZlwge3tcc3BhY2Vza2lwID0gMHB0e30gfX0lCi0gICAgJQotICAgICUgVHVybiBvZmYgaHlwaGVuYXRpb24uCi0gICAgXG5vaHlwaGVuYXRpb24KLSAgICAlCi0gICAgXHJhd2JhY2tzbGFzaAotICAgIFxmcmVuY2hzcGFjaW5nCi0gICAgIzElCi0gIH0lCi0gIFxudWxsCi19Ci0KLSUgV2UgKm11c3QqIHR1cm4gb24gaHlwaGVuYXRpb24gYXQgYC0nIGFuZCBgXycgaW4gXGNvZGUuCi0lIE90aGVyd2lzZSwgaXQgaXMgdG9vIGhhcmQgdG8gYXZvaWQgb3ZlcmZ1bGwgaGJveGVzCi0lIGluIHRoZSBFbWFjcyBtYW51YWwsIHRoZSBMaWJyYXJ5IG1hbnVhbCwgZXRjLgotCi0lIFVuZm9ydHVuYXRlbHksIFRlWCB1c2VzIG9uZSBwYXJhbWV0ZXIgKFxoeXBoZW5jaGFyKSB0byBjb250cm9sCi0lIGJvdGggaHlwaGVuYXRpb24gYXQgLSBhbmQgaHlwaGVuYXRpb24gd2l0aGluIHdvcmRzLgotJSBXZSBtdXN0IHRoZXJlZm9yZSB0dXJuIHRoZW0gYm90aCBvZmYgKFx0Y2xvc2UgZG9lcyB0aGF0KQotJSBhbmQgYXJyYW5nZSBleHBsaWNpdGx5IHRvIGh5cGhlbmF0ZSBhdCBhIGRhc2guCi0lICAtLSBybXMuCi17Ci0gIFxjYXRjb2RlYFwtPVxhY3RpdmUKLSAgXGNhdGNvZGVgXF89XGFjdGl2ZQotICAlCi0gIFxnbG9iYWxcZGVmXGNvZGV7XGJlZ2luZ3JvdXAKLSAgICBcY2F0Y29kZWBcLT1cYWN0aXZlIFxsZXQtXGNvZGVkYXNoCi0gICAgXGNhdGNvZGVgXF89XGFjdGl2ZSBcbGV0X1xjb2RldW5kZXIKLSAgICBcY29kZXgKLSAgfQotICAlCi0gICUgSWYgd2UgZW5kIHVwIHdpdGggYW55IGFjdGl2ZSAtIGNoYXJhY3RlcnMgd2hlbiBoYW5kbGluZyB0aGUgaW5kZXgsCi0gICUganVzdCB0cmVhdCB0aGVtIGFzIGEgbm9ybWFsIC0uCi0gIFxnbG9iYWxcZGVmXGluZGV4YnJlYWtze1xjYXRjb2RlYFwtPVxhY3RpdmUgXGxldC1ccmVhbGRhc2h9Ci19Ci0KLVxkZWZccmVhbGRhc2h7LX0KLVxkZWZcY29kZWRhc2h7LVxkaXNjcmV0aW9uYXJ5e317fXt9fQotXGRlZlxjb2RldW5kZXJ7XGlmdXNpbmd0dHtcbm9ybWFsdW5kZXJzY29yZVxkaXNjcmV0aW9uYXJ5e317fXt9fXtcX319Ci1cZGVmXGNvZGV4ICMxe1x0Y2xvc2V7IzF9XGVuZGdyb3VwfQotCi0lXGxldFxleHA9XHRjbG9zZSAgJVdhcyB0ZW1wb3JhcnkKLQotJSBAa2JkIGlzIGxpa2UgQGNvZGUsIGV4Y2VwdCB0aGF0IGlmIHRoZSBhcmd1bWVudCBpcyBqdXN0IG9uZSBAa2V5IGNvbW1hbmQsCi0lIHRoZW4gQGtiZCBoYXMgbm8gZWZmZWN0LgotCi0lIEBrYmRpbnB1dHN0eWxlIC0tIGFyZyBpcyBgZGlzdGluY3QnIChAa2JkIHVzZXMgc2xhbnRlZCB0dHkgZm9udCBhbHdheXMpLAotJSAgIGBleGFtcGxlJyAoQGtiZCB1c2VzIHR0c2wgb25seSBpbnNpZGUgb2YgQGV4YW1wbGUgYW5kIGZyaWVuZHMpLAotJSAgIG9yIGBjb2RlJyAoQGtiZCB1c2VzIG5vcm1hbCB0dHkgZm9udCBhbHdheXMpLgotXGRlZlxrYmRpbnB1dHN0eWxle1xwYXJzZWFyZ1xrYmRpbnB1dHN0eWxleHh4fQotXGRlZlxrYmRpbnB1dHN0eWxleHh4IzF7JQotICBcZGVmXGFyZ3sjMX0lCi0gIFxpZnhcYXJnXHdvcmRkaXN0aW5jdAotICAgIFxnZGVmXGtiZGV4YW1wbGVmb250e1x0dHNsfVxnZGVmXGtiZGZvbnR7XHR0c2x9JQotICBcZWxzZVxpZnhcYXJnXHdvcmRleGFtcGxlCi0gICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHR9JQotICBcZWxzZVxpZnhcYXJnXHdvcmRjb2RlCi0gICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0fVxnZGVmXGtiZGZvbnR7XHR0fSUKLSAgXGZpXGZpXGZpCi19Ci1cZGVmXHdvcmRkaXN0aW5jdHtkaXN0aW5jdH0KLVxkZWZcd29yZGV4YW1wbGV7ZXhhbXBsZX0KLVxkZWZcd29yZGNvZGV7Y29kZX0KLQotJSBEZWZhdWx0IGlzIGtiZGlucHV0ZGlzdGluY3QuICAoVG9vIG11Y2ggb2YgYSBoYXNzbGUgdG8gY2FsbCB0aGUgbWFjcm8sCi0lIHRoZSBjYXRjb2RlcyBhcmUgd3JvbmcgZm9yIHBhcnNlYXJnIHRvIHdvcmsuKQotXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHRzbH0KLQotXGRlZlx4a2V5e1xrZXl9Ci1cZGVmXGtiZGZvbyMxIzIjM1xwYXJ7XGRlZlxvbmV7IzF9XGRlZlx0aHJlZXsjM31cZGVmXHRocmVleHs/P30lCi1caWZ4XG9uZVx4a2V5XGlmeFx0aHJlZXhcdGhyZWUgXGtleXsjMn0lCi1cZWxzZXtcdGNsb3Nle1xrYmRmb250XGxvb2t9fVxmaQotXGVsc2V7XHRjbG9zZXtca2JkZm9udFxsb29rfX1cZml9Ci0KLSUgRm9yIEB1cmwsIEBlbnYsIEBjb21tYW5kIHF1b3RlcyBzZWVtIHVubmVjZXNzYXJ5LCBzbyB1c2UgXGNvZGUuCi1cbGV0XHVybD1cY29kZQotXGxldFxlbnY9XGNvZGUKLVxsZXRcY29tbWFuZD1cY29kZQotCi0lIEB1cmVmIChhYmJyZXZpYXRpb24gZm9yIGB1cmxyZWYnKSB0YWtlcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQKLSUgc3BlY2lmeWluZyB0aGUgdGV4dCB0byBkaXNwbGF5LiAgRmlyc3QgKG1hbmRhdG9yeSkgYXJnIGlzIHRoZSB1cmwuCi0lIFBlcmhhcHMgZXZlbnR1YWxseSBwdXQgaW4gYSBoeXBlcnRleCBcc3BlY2lhbCBoZXJlLgotJSAKLVxkZWZcdXJlZiMxe1x1cmVmeHh4ICMxLCxcZmluaXNofQotXGRlZlx1cmVmeHh4IzEsIzIsIzNcZmluaXNoeyUKLSAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfSUKLSAgXGlmZGltXHdkMCA+IDBwdAotICAgIFx1bmhib3gwXCAoXGNvZGV7IzF9KSUKLSAgXGVsc2UKLSAgICBcY29kZXsjMX0lCi0gIFxmaQotfQotCi0lIHJtcyBkb2VzIG5vdCBsaWtlIHRoZSBhbmdsZSBicmFja2V0cyAtLWthcmwsIDE3bWF5OTcuCi0lIFNvIG5vdyBAZW1haWwgaXMganVzdCBsaWtlIEB1cmVmLgotJVxkZWZcZW1haWwjMXtcYW5nbGVsZWZ0e1x0dCAjMX1cYW5nbGVyaWdodH0KLVxsZXRcZW1haWw9XHVyZWYKLQotJSBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIGEgdHlwZXdyaXRlciBmb250LiAgU2luY2UgYWxsIHRoZQotJSBDb21wdXRlciBNb2Rlcm4gdHlwZXdyaXRlciBmb250cyBoYXZlIHplcm8gaW50ZXJ3b3JkIHN0cmV0Y2ggKGFuZAotJSBzaHJpbmspLCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byBleHBlY3QgYWxsIHR5cGV3cml0ZXIgZm9udHMgdG8gaGF2ZQotJSB0aGlzIHByb3BlcnR5LCB3ZSBjYW4gY2hlY2sgdGhhdCBmb250IHBhcmFtZXRlci4KLSUKLVxkZWZcaWZtb25vc3BhY2V7XGlmZGltXGZvbnRkaW1lbjNcZm9udD0wcHQgfQotCi0lIFR5cGVzZXQgYSBkaW1lbnNpb24sIGUuZy4sIGBpbicgb3IgYHB0Jy4gIFRoZSBvbmx5IHJlYXNvbiBmb3IgdGhlCi0lIGFyZ3VtZW50IGlzIHRvIG1ha2UgdGhlIGlucHV0IGxvb2sgcmlnaHQ6IEBkbW57cHR9IGluc3RlYWQgb2YgQGRtbnt9cHQuCi0lCi1cZGVmXGRtbiMxe1x0aGluc3BhY2UgIzF9Ci0KLVxkZWZca2JkIzF7XGRlZlxsb29reyMxfVxleHBhbmRhZnRlclxrYmRmb29cbG9vaz8/XHBhcn0KLQotJSBAbCB3YXMgbmV2ZXIgZG9jdW1lbnRlZCB0byBtZWFuIGBgc3dpdGNoIHRvIHRoZSBMaXNwIGZvbnQnJywKLSUgYW5kIGl0IGlzIG5vdCB1c2VkIGFzIHN1Y2ggaW4gYW55IG1hbnVhbCBJIGNhbiBmaW5kLiAgV2UgbmVlZCBpdCBmb3IKLSUgUG9saXNoIHN1cHByZXNzZWQtbC4gIC0ta2FybCwgMjJzZXA5Ni4KLSVcZGVmXGwjMXt7XGxpICMxfVxudWxsfQotCi0lIEV4cGxpY2l0IGZvbnQgY2hhbmdlczogQHIsIEBzYywgdW5kb2N1bWVudGVkIEBpaS4KLVxkZWZcciMxe3tccm0gIzF9fSAgICAgICAgICAgICAgJSByb21hbiBmb250Ci1cZGVmXHNjIzF7e1xzbWFsbGNhcHMjMX19ICAgICAgICUgc21hbGxjYXBzIGZvbnQKLVxkZWZcaWkjMXt7XGl0ICMxfX0gICAgICAgICAgICAgJSBpdGFsaWMgZm9udAotCi0lIEBhY3JvbnltIGRvd25jYXNlcyB0aGUgYXJndW1lbnQgYW5kIHByaW50cyBpbiBzbWFsbGNhcHMuCi1cZGVmXGFjcm9ueW0jMXt7XHNtYWxsY2FwcyBcbG93ZXJjYXNleyMxfX19Ci0KLSUgQHBvdW5kc3t9IGlzIGEgc3Rlcmxpbmcgc2lnbi4KLVxkZWZccG91bmRze3tcaXRcJH19Ci0KLQotXG1lc3NhZ2V7cGFnZSBoZWFkaW5ncyx9Ci0KLVxuZXdza2lwXHRpdGxlcGFnZXRvcGdsdWUgXHRpdGxlcGFnZXRvcGdsdWUgPSAxLjVpbgotXG5ld3NraXBcdGl0bGVwYWdlYm90dG9tZ2x1ZSBcdGl0bGVwYWdlYm90dG9tZ2x1ZSA9IDJwYwotCi0lIEZpcnN0IHRoZSB0aXRsZSBwYWdlLiAgTXVzdCBkbyBAc2V0dGl0bGUgYmVmb3JlIEB0aXRsZXBhZ2UuCi1cbmV3aWZcaWZzZWVuYXV0aG9yCi1cbmV3aWZcaWZmaW5pc2hlZHRpdGxlcGFnZQotCi0lIERvIGFuIGltcGxpY2l0IEBjb250ZW50cyBvciBAc2hvcnRjb250ZW50cyBhZnRlciBAZW5kIHRpdGxlcGFnZSBpZiB0aGUKLSUgdXNlciBzYXlzIEBjb250ZW50c2FmdGVydGl0bGVwYWdlIG9yIEBzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UuCi0lIAotXG5ld2lmXGlmc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZQotIFxsZXRcc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZSA9IFxzZXRjb250ZW50c2FmdGVydGl0bGVwYWdldHJ1ZQotXG5ld2lmXGlmc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gXGxldFxzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UgPSBcc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdldHJ1ZQotCi1cZGVmXHNob3J0dGl0bGVwYWdle1xwYXJzZWFyZ1xzaG9ydHRpdGxlcGFnZXp6en0KLVxkZWZcc2hvcnR0aXRsZXBhZ2V6enogIzF7XGJlZ2luZ3JvdXBcaGJveHt9XHZza2lwIDEuNWluIFxjaGFwcm0gXGNlbnRlcmxpbmV7IzF9JQotICAgICAgICBcZW5kZ3JvdXBccGFnZVxoYm94e31ccGFnZX0KLQotXGRlZlx0aXRsZXBhZ2V7XGJlZ2luZ3JvdXAgXHBhcmluZGVudD0wcHQgXHRleHRmb250cwotICAgXGxldFxzdWJ0aXRsZXJtPVx0ZW5ybQotICAgXGRlZlxzdWJ0aXRsZWZvbnR7XHN1YnRpdGxlcm0gXG5vcm1hbGJhc2VsaW5lc2tpcCA9IDEzcHQgXG5vcm1hbGJhc2VsaW5lc30lCi0gICAlCi0gICBcZGVmXGF1dGhvcmZvbnR7XGF1dGhvcnJtIFxub3JtYWxiYXNlbGluZXNraXAgPSAxNnB0IFxub3JtYWxiYXNlbGluZXN9JQotICAgJQotICAgJSBMZWF2ZSBzb21lIHNwYWNlIGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgcGFnZS4KLSAgIFx2Z2x1ZVx0aXRsZXBhZ2V0b3BnbHVlCi0gICAlCi0gICAlIE5vdyB5b3UgY2FuIHByaW50IHRoZSB0aXRsZSB1c2luZyBAdGl0bGUuCi0gICBcZGVmXHRpdGxle1xwYXJzZWFyZ1x0aXRsZXp6en0lCi0gICBcZGVmXHRpdGxlenp6IyMxe1xsZWZ0bGluZXtcdGl0bGVmb250c1xybSAjIzF9Ci0gICAgICAgICAgICAgICAgICAgICUgcHJpbnQgYSBydWxlIGF0IHRoZSBwYWdlIGJvdHRvbSBhbHNvLgotICAgICAgICAgICAgICAgICAgICBcZmluaXNoZWR0aXRsZXBhZ2VmYWxzZQotICAgICAgICAgICAgICAgICAgICBcdnNraXA0cHQgXGhydWxlIGhlaWdodCA0cHQgd2lkdGggXGhzaXplIFx2c2tpcDRwdH0lCi0gICAlIE5vIHJ1bGUgYXQgcGFnZSBib3R0b20gdW5sZXNzIHdlIHByaW50IG9uZSBhdCB0aGUgdG9wIHdpdGggQHRpdGxlLgotICAgXGZpbmlzaGVkdGl0bGVwYWdldHJ1ZQotICAgJQotICAgJSBOb3cgeW91IGNhbiBwdXQgdGV4dCB1c2luZyBAc3VidGl0bGUuCi0gICBcZGVmXHN1YnRpdGxle1xwYXJzZWFyZ1xzdWJ0aXRsZXp6en0lCi0gICBcZGVmXHN1YnRpdGxlenp6IyMxe3tcc3VidGl0bGVmb250IFxyaWdodGxpbmV7IyMxfX19JQotICAgJQotICAgJSBAYXV0aG9yIHNob3VsZCBjb21lIGxhc3QsIGJ1dCBtYXkgY29tZSBtYW55IHRpbWVzLgotICAgXGRlZlxhdXRob3J7XHBhcnNlYXJnXGF1dGhvcnp6en0lCi0gICBcZGVmXGF1dGhvcnp6eiMjMXtcaWZzZWVuYXV0aG9yXGVsc2VcdnNraXAgMHB0IHBsdXMgMWZpbGxsXHNlZW5hdXRob3J0cnVlXGZpCi0gICAgICB7XGF1dGhvcmZvbnQgXGxlZnRsaW5leyMjMX19fSUKLSAgICUKLSAgICUgTW9zdCB0aXRsZSBgYHBhZ2VzJycgYXJlIGFjdHVhbGx5IHR3byBwYWdlcyBsb25nLCB3aXRoIHNwYWNlCi0gICAlIGF0IHRoZSB0b3Agb2YgdGhlIHNlY29uZC4gIFdlIGRvbid0IHdhbnQgdGhlIHJhZ2dlZCBsZWZ0IG9uIHRoZSBzZWNvbmQuCi0gICBcbGV0XG9sZHBhZ2UgPSBccGFnZQotICAgXGRlZlxwYWdleyUKLSAgICAgIFxpZmZpbmlzaGVkdGl0bGVwYWdlXGVsc2UKLSAgICAgICAgIFxmaW5pc2h0aXRsZXBhZ2UKLSAgICAgIFxmaQotICAgICAgXG9sZHBhZ2UKLSAgICAgIFxsZXRccGFnZSA9IFxvbGRwYWdlCi0gICAgICBcaGJveHt9fSUKLSUgICBcZGVmXHBhZ2V7XG9sZHBhZ2UgXGhib3h7fX0KLX0KLQotXGRlZlxFdGl0bGVwYWdleyUKLSAgIFxpZmZpbmlzaGVkdGl0bGVwYWdlXGVsc2UKLSAgICAgIFxmaW5pc2h0aXRsZXBhZ2UKLSAgIFxmaQotICAgJSBJdCBpcyBpbXBvcnRhbnQgdG8gZG8gdGhlIHBhZ2UgYnJlYWsgYmVmb3JlIGVuZGluZyB0aGUgZ3JvdXAsCi0gICAlIGJlY2F1c2UgdGhlIGhlYWRsaW5lIGFuZCBmb290bGluZSBhcmUgb25seSBlbXB0eSBpbnNpZGUgdGhlIGdyb3VwLgotICAgJSBJZiB3ZSB1c2UgdGhlIG5ldyBkZWZpbml0aW9uIG9mIFxwYWdlLCB3ZSBhbHdheXMgZ2V0IGEgYmxhbmsgcGFnZQotICAgJSBhZnRlciB0aGUgdGl0bGUgcGFnZSwgd2hpY2ggd2UgY2VydGFpbmx5IGRvbid0IHdhbnQuCi0gICBcb2xkcGFnZQotICAgXGVuZGdyb3VwCi0gICAlCi0gICAlIElmIHRoZXkgd2FudCBzaG9ydCwgdGhleSBjZXJ0YWlubHkgd2FudCBsb25nIHRvby4KLSAgIFxpZnNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZQotICAgICBcc2hvcnRjb250ZW50cwotICAgICBcY29udGVudHMKLSAgICAgXGdsb2JhbFxsZXRcc2hvcnRjb250ZW50cyA9IFxyZWxheAotICAgICBcZ2xvYmFsXGxldFxjb250ZW50cyA9IFxyZWxheAotICAgXGZpCi0gICAlCi0gICBcaWZzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gICAgIFxjb250ZW50cwotICAgICBcZ2xvYmFsXGxldFxjb250ZW50cyA9IFxyZWxheAotICAgICBcZ2xvYmFsXGxldFxzaG9ydGNvbnRlbnRzID0gXHJlbGF4Ci0gICBcZmkKLSAgICUKLSAgIFxIRUFESU5HU29uCi19Ci0KLVxkZWZcZmluaXNodGl0bGVwYWdleyUKLSAgIFx2c2tpcDRwdCBcaHJ1bGUgaGVpZ2h0IDJwdCB3aWR0aCBcaHNpemUKLSAgIFx2c2tpcFx0aXRsZXBhZ2Vib3R0b21nbHVlCi0gICBcZmluaXNoZWR0aXRsZXBhZ2V0cnVlCi19Ci0KLSUlJSBTZXQgdXAgcGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MuCi0KLVxsZXRcdGhpc3BhZ2U9XGZvbGlvCi0KLVxuZXd0b2tzXGV2ZW5oZWFkbGluZSAgICAlIGhlYWRsaW5lIG9uIGV2ZW4gcGFnZXMKLVxuZXd0b2tzXG9kZGhlYWRsaW5lICAgICAlIGhlYWRsaW5lIG9uIG9kZCBwYWdlcwotXG5ld3Rva3NcZXZlbmZvb3RsaW5lICAgICUgZm9vdGxpbmUgb24gZXZlbiBwYWdlcwotXG5ld3Rva3Ncb2RkZm9vdGxpbmUgICAgICUgZm9vdGxpbmUgb24gb2RkIHBhZ2VzCi0KLSUgTm93IG1ha2UgVGV4IHVzZSB0aG9zZSB2YXJpYWJsZXMKLVxoZWFkbGluZT17e1x0ZXh0Zm9udHNccm0gXGlmb2RkXHBhZ2VubyBcdGhlXG9kZGhlYWRsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVsc2UgXHRoZVxldmVuaGVhZGxpbmUgXGZpfX0KLVxmb290bGluZT17e1x0ZXh0Zm9udHNccm0gXGlmb2RkXHBhZ2VubyBcdGhlXG9kZGZvb3RsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVsc2UgXHRoZVxldmVuZm9vdGxpbmUgXGZpfVxIRUFESU5HU2hvb2t9Ci1cbGV0XEhFQURJTkdTaG9vaz1ccmVsYXgKLQotJSBDb21tYW5kcyB0byBzZXQgdGhvc2UgdmFyaWFibGVzLgotJSBGb3IgZXhhbXBsZSwgdGhpcyBpcyB3aGF0ICBAaGVhZGluZ3Mgb24gIGRvZXMKLSUgQGV2ZW5oZWFkaW5nIEB0aGlzdGl0bGV8QHRoaXNwYWdlfEB0aGlzY2hhcHRlcgotJSBAb2RkaGVhZGluZyBAdGhpc2NoYXB0ZXJ8QHRoaXNwYWdlfEB0aGlzdGl0bGUKLSUgQGV2ZW5mb290aW5nIEB0aGlzZmlsZXx8Ci0lIEBvZGRmb290aW5nIHx8QHRoaXNmaWxlCi0KLVxkZWZcZXZlbmhlYWRpbmd7XHBhcnNlYXJnXGV2ZW5oZWFkaW5neHh4fQotXGRlZlxvZGRoZWFkaW5ne1xwYXJzZWFyZ1xvZGRoZWFkaW5neHh4fQotXGRlZlxldmVyeWhlYWRpbmd7XHBhcnNlYXJnXGV2ZXJ5aGVhZGluZ3h4eH0KLQotXGRlZlxldmVuZm9vdGluZ3tccGFyc2VhcmdcZXZlbmZvb3Rpbmd4eHh9Ci1cZGVmXG9kZGZvb3Rpbmd7XHBhcnNlYXJnXG9kZGZvb3Rpbmd4eHh9Ci1cZGVmXGV2ZXJ5Zm9vdGluZ3tccGFyc2VhcmdcZXZlcnlmb290aW5neHh4fQotCi17XGNhdGNvZGVgXEA9MCAlCi0KLVxnZGVmXGV2ZW5oZWFkaW5neHh4ICMxe1xldmVuaGVhZGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KLVxnZGVmXGV2ZW5oZWFkaW5neXl5ICMxQHwjMkB8IzNAfCM0XGZpbmlzaHslCi1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQotCi1cZ2RlZlxvZGRoZWFkaW5neHh4ICMxe1xvZGRoZWFkaW5neXl5ICMxQHxAfEB8QHxcZmluaXNofQotXGdkZWZcb2RkaGVhZGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQotXGdsb2JhbFxvZGRoZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQotCi1cZ2RlZlxldmVyeWhlYWRpbmd4eHgjMXtcb2RkaGVhZGluZ3h4eHsjMX1cZXZlbmhlYWRpbmd4eHh7IzF9fSUKLQotXGdkZWZcZXZlbmZvb3Rpbmd4eHggIzF7XGV2ZW5mb290aW5neXl5ICMxQHxAfEB8QHxcZmluaXNofQotXGdkZWZcZXZlbmZvb3Rpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19Ci0KLVxnZGVmXG9kZGZvb3Rpbmd4eHggIzF7XG9kZGZvb3Rpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9Ci1cZ2RlZlxvZGRmb290aW5neXl5ICMxQHwjMkB8IzNAfCM0XGZpbmlzaHslCi0gIFxnbG9iYWxcb2RkZm9vdGxpbmUgPSB7XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319JQotICAlCi0gICUgTGVhdmUgc29tZSBzcGFjZSBmb3IgdGhlIGZvb3RsaW5lLiAgSG9wZWZ1bGx5IG9rIHRvIGFzc3VtZQotICAlIEBldmVuZm9vdGluZyB3aWxsIG5vdCBiZSB1c2VkIGJ5IGl0c2VsZi4KLSAgXGdsb2JhbFxhZHZhbmNlXHBhZ2VoZWlnaHQgYnkgLVxiYXNlbGluZXNraXAKLSAgXGdsb2JhbFxhZHZhbmNlXHZzaXplIGJ5IC1cYmFzZWxpbmVza2lwCi19Ci0KLVxnZGVmXGV2ZXJ5Zm9vdGluZ3h4eCMxe1xvZGRmb290aW5neHh4eyMxfVxldmVuZm9vdGluZ3h4eHsjMX19Ci0lCi19JSB1bmJpbmQgdGhlIGNhdGNvZGUgb2YgQC4KLQotJSBAaGVhZGluZ3MgZG91YmxlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIGRvdWJsZS1zaWRlZCBwcmludGluZy4KLSUgQGhlYWRpbmdzIHNpbmdsZSAgICAgIHR1cm5zIGhlYWRpbmdzIG9uIGZvciBzaW5nbGUtc2lkZWQgcHJpbnRpbmcuCi0lIEBoZWFkaW5ncyBvZmYgICAgICAgICB0dXJucyB0aGVtIG9mZi4KLSUgQGhlYWRpbmdzIG9uICAgICAgICAgIHNhbWUgYXMgQGhlYWRpbmdzIGRvdWJsZSwgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkuCi0lIEBoZWFkaW5ncyBhZnRlciAgICAgICB0dXJucyBvbiBkb3VibGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgotJSBAaGVhZGluZ3MgZG91YmxlYWZ0ZXIgdHVybnMgb24gZG91YmxlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KLSUgQGhlYWRpbmdzIHNpbmdsZWFmdGVyIHR1cm5zIG9uIHNpbmdsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCi0lIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIG9mZiBhdCB0aGUgc3RhcnQgb2YgYSBkb2N1bWVudCwKLSUgYW5kIHR1cm5lZCBgb24nIGFmdGVyIEBlbmQgdGl0bGVwYWdlLgotCi1cZGVmXGhlYWRpbmdzICMxIHtcY3NuYW1lIEhFQURJTkdTIzFcZW5kY3NuYW1lfQotCi1cZGVmXEhFQURJTkdTb2ZmewotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xoZmlsfSBcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcaGZpbH0gXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9fQotXEhFQURJTkdTb2ZmCi0lIFdoZW4gd2UgdHVybiBoZWFkaW5ncyBvbiwgc2V0IHRoZSBwYWdlIG51bWJlciB0byAxLgotJSBGb3IgZG91YmxlLXNpZGVkIHByaW50aW5nLCBwdXQgY3VycmVudCBmaWxlIG5hbWUgaW4gbG93ZXIgbGVmdCBjb3JuZXIsCi0lIGNoYXB0ZXIgbmFtZSBvbiBpbnNpZGUgdG9wIG9mIHJpZ2h0IGhhbmQgcGFnZXMsIGRvY3VtZW50Ci0lIHRpdGxlIG9uIGluc2lkZSB0b3Agb2YgbGVmdCBoYW5kIHBhZ2VzLCBhbmQgcGFnZSBudW1iZXJzIG9uIG91dHNpZGUgdG9wCi0lIGVkZ2Ugb2YgYWxsIHBhZ2VzLgotXGRlZlxIRUFESU5HU2RvdWJsZXsKLVxnbG9iYWxccGFnZW5vPTEKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1xmb2xpb1xoZmlsXHRoaXN0aXRsZX19Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKLX0KLVxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotCi0lIEZvciBzaW5nbGUtc2lkZWQgcHJpbnRpbmcsIGNoYXB0ZXIgdGl0bGUgZ29lcyBhY3Jvc3MgdG9wIGxlZnQgb2YgcGFnZSwKLSUgcGFnZSBudW1iZXIgb24gdG9wIHJpZ2h0LgotXGRlZlxIRUFESU5HU3NpbmdsZXsKLVxnbG9iYWxccGFnZW5vPTEKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKLX0KLVxkZWZcSEVBRElOR1NvbntcSEVBRElOR1Nkb3VibGV9Ci0KLVxkZWZcSEVBRElOR1NhZnRlcntcbGV0XEhFQURJTkdTaG9vaz1cSEVBRElOR1Nkb3VibGV4fQotXGxldFxIRUFESU5HU2RvdWJsZWFmdGVyPVxIRUFESU5HU2FmdGVyCi1cZGVmXEhFQURJTkdTZG91YmxleHslCi1cZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcZm9saW9caGZpbFx0aGlzdGl0bGV9fQotXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBvZGRwYWdlCi19Ci0KLVxkZWZcSEVBRElOR1NzaW5nbGVhZnRlcntcbGV0XEhFQURJTkdTaG9vaz1cSEVBRElOR1NzaW5nbGV4fQotXGRlZlxIRUFESU5HU3NpbmdsZXh7JQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotfQotCi0lIFN1YnJvdXRpbmVzIHVzZWQgaW4gZ2VuZXJhdGluZyBoZWFkaW5ncwotJSBQcm9kdWNlcyBEYXkgTW9udGggWWVhciBzdHlsZSBvZiBvdXRwdXQuCi1cZGVmXHRvZGF5e1xudW1iZXJcZGF5XHNwYWNlCi1caWZjYXNlXG1vbnRoXG9yCi1KYW51YXJ5XG9yIEZlYnJ1YXJ5XG9yIE1hcmNoXG9yIEFwcmlsXG9yIE1heVxvciBKdW5lXG9yCi1KdWx5XG9yIEF1Z3VzdFxvciBTZXB0ZW1iZXJcb3IgT2N0b2JlclxvciBOb3ZlbWJlclxvciBEZWNlbWJlclxmaQotXHNwYWNlXG51bWJlclx5ZWFyfQotCi0lIFVzZSB0aGlzIGlmIHlvdSB3YW50IHRoZSBNb250aCBEYXksIFllYXIgc3R5bGUgb2Ygb3V0cHV0LgotJVxkZWZcdG9kYXl7XGlmY2FzZVxtb250aFxvcgotJUphbnVhcnlcb3IgRmVicnVhcnlcb3IgTWFyY2hcb3IgQXByaWxcb3IgTWF5XG9yIEp1bmVcb3IKLSVKdWx5XG9yIEF1Z3VzdFxvciBTZXB0ZW1iZXJcb3IgT2N0b2JlclxvciBOb3ZlbWJlclxvciBEZWNlbWJlclxmaQotJVxzcGFjZVxudW1iZXJcZGF5LCBcbnVtYmVyXHllYXJ9Ci0KLSUgQHNldHRpdGxlIGxpbmUuLi4gIHNwZWNpZmllcyB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50LCBmb3IgaGVhZGluZ3MKLSUgSXQgZ2VuZXJhdGVzIG5vIG91dHB1dCBvZiBpdHMgb3duCi0KLVxkZWZcdGhpc3RpdGxle05vIFRpdGxlfQotXGRlZlxzZXR0aXRsZXtccGFyc2Vhcmdcc2V0dGl0bGV6enp9Ci1cZGVmXHNldHRpdGxlenp6ICMxe1xnZGVmXHRoaXN0aXRsZXsjMX19Ci0KLQotXG1lc3NhZ2V7dGFibGVzLH0KLSUgVGFibGVzIC0tIEB0YWJsZSwgQGZ0YWJsZSwgQHZ0YWJsZSwgQGl0ZW0oeCksIEBraXRlbSh4KSwgQHhpdGVtKHgpLgotCi0lIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgdGFibGUgdGV4dAotXG5ld2RpbWVuXHRhYmxlaW5kZW50IFx0YWJsZWluZGVudD0uOGluCi0lIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgQGl0ZW1pemUgYW5kIEBlbnVtZXJhdGUgdGV4dAotXG5ld2RpbWVuXGl0ZW1pbmRlbnQgIFxpdGVtaW5kZW50PS4zaW4KLSUgbWFyZ2luIGJldHdlZW4gZW5kIG9mIHRhYmxlIGl0ZW0gYW5kIHN0YXJ0IG9mIHRhYmxlIHRleHQuCi1cbmV3ZGltZW5caXRlbW1hcmdpbiAgXGl0ZW1tYXJnaW49LjFpbgotCi0lIHVzZWQgaW50ZXJuYWxseSBmb3IgXGl0ZW1pbmRlbnQgbWludXMgXGl0ZW1tYXJnaW4KLVxuZXdkaW1lblxpdGVtbWF4Ci0KLSUgTm90ZSBAdGFibGUsIEB2dGFibGUsIGFuZCBAdnRhYmxlIGRlZmluZSBAaXRlbSwgQGl0ZW14LCBldGMuLCB3aXRoCi0lIHRoZXNlIGRlZnMuCi0lIFRoZXkgYWxzbyBkZWZpbmUgXGl0ZW1pbmRleAotJSB0byBpbmRleCB0aGUgaXRlbSBuYW1lIGluIHdoYXRldmVyIG1hbm5lciBpcyBkZXNpcmVkIChwZXJoYXBzIG5vbmUpLgotCi1cbmV3aWZcaWZpdGVteG5lZWRzbmVnYXRpdmV2c2tpcAotCi1cZGVmXGl0ZW14cGFye1xwYXJcaWZpdGVteG5lZWRzbmVnYXRpdmV2c2tpcFxub2JyZWFrXHZza2lwLVxwYXJza2lwXG5vYnJlYWtcZml9Ci0KLVxkZWZcaW50ZXJuYWxCaXRlbXtcc21hbGxicmVhayBccGFyc2VhcmdcaXRlbXp6en0KLVxkZWZcaW50ZXJuYWxCaXRlbXh7XGl0ZW14cGFyIFxwYXJzZWFyZ1xpdGVtenp6fQotCi1cZGVmXGludGVybmFsQnhpdGVtICIjMSJ7XGRlZlx4aXRlbXN1YnRvcGl4eyMxfSBcc21hbGxicmVhayBccGFyc2VhcmdceGl0ZW16enp9Ci1cZGVmXGludGVybmFsQnhpdGVteCAiIzEie1xkZWZceGl0ZW1zdWJ0b3BpeHsjMX0gXGl0ZW14cGFyIFxwYXJzZWFyZ1x4aXRlbXp6en0KLQotXGRlZlxpbnRlcm5hbEJraXRlbXtcc21hbGxicmVhayBccGFyc2Vhcmdca2l0ZW16enp9Ci1cZGVmXGludGVybmFsQmtpdGVteHtcaXRlbXhwYXIgXHBhcnNlYXJnXGtpdGVtenp6fQotCi1cZGVmXGtpdGVtenp6ICMxe1xkb3N1YmluZCB7a3d9e1xjb2RleyMxfX17Zm9yIHtcYmYgXGxhc3RmdW5jdGlvbn19JQotICAgICAgICAgICAgICAgICBcaXRlbXp6eiB7IzF9fQotCi1cZGVmXHhpdGVtenp6ICMxe1xkb3N1YmluZCB7a3d9e1xjb2RleyMxfX17Zm9yIHtcYmYgXHhpdGVtc3VidG9waWN9fSUKLSAgICAgICAgICAgICAgICAgXGl0ZW16enogeyMxfX0KLQotXGRlZlxpdGVtenp6ICMxe1xiZWdpbmdyb3VwICUKLSAgXGFkdmFuY2VcaHNpemUgYnkgLVxyaWdodHNraXAKLSAgXGFkdmFuY2VcaHNpemUgYnkgLVx0YWJsZWluZGVudAotICBcc2V0Ym94MD1caGJveHtcaXRlbWZvbnR7IzF9fSUKLSAgXGl0ZW1pbmRleHsjMX0lCi0gIFxub2JyZWFrICUgVGhpcyBwcmV2ZW50cyBhIGJyZWFrIGJlZm9yZSBAaXRlbXguCi0gICUKLSAgJSBJZiB0aGUgaXRlbSB0ZXh0IGRvZXMgbm90IGZpdCBpbiB0aGUgc3BhY2Ugd2UgaGF2ZSwgcHV0IGl0IG9uIGEgbGluZQotICAlIGJ5IGl0c2VsZiwgYW5kIGRvIG5vdCBhbGxvdyBhIHBhZ2UgYnJlYWsgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGF0Ci0gICUgbGluZS4gIFdlIGRvIG5vdCBzdGFydCBhIHBhcmFncmFwaCBoZXJlIGJlY2F1c2UgdGhlbiBpZiB0aGUgbmV4dAotICAlIGNvbW1hbmQgaXMsIGUuZy4sIEBraW5kZXgsIHRoZSB3aGF0c2l0IHdvdWxkIGdldCBwdXQgaW50byB0aGUKLSAgJSBob3Jpem9udGFsIGxpc3Qgb24gYSBsaW5lIGJ5IGl0c2VsZiwgcmVzdWx0aW5nIGluIGV4dHJhIGJsYW5rIHNwYWNlLgotICBcaWZkaW0gXHdkMD5caXRlbW1heAotICAgICUKLSAgICAlIE1ha2UgdGhpcyBhIHBhcmFncmFwaCBzbyB3ZSBnZXQgdGhlIFxwYXJza2lwIGdsdWUgYW5kIHdyYXBwaW5nLAotICAgICUgYnV0IGxlYXZlIGl0IHJhZ2dlZC1yaWdodC4KLSAgICBcYmVnaW5ncm91cAotICAgICAgXGFkdmFuY2VcbGVmdHNraXAgYnktXHRhYmxlaW5kZW50Ci0gICAgICBcYWR2YW5jZVxoc2l6ZSBieVx0YWJsZWluZGVudAotICAgICAgXGFkdmFuY2VccmlnaHRza2lwIGJ5MHB0IHBsdXMxZmlsCi0gICAgICBcbGVhdmV2bW9kZVx1bmhib3gwXHBhcgotICAgIFxlbmRncm91cAotICAgICUKLSAgICAlIFdlJ3JlIGdvaW5nIHRvIGJlIHN0YXJ0aW5nIGEgcGFyYWdyYXBoLCBidXQgd2UgZG9uJ3Qgd2FudCB0aGUKLSAgICAlIFxwYXJza2lwIGdsdWUgLS0gbG9naWNhbGx5IGl0J3MgcGFydCBvZiB0aGUgQGl0ZW0gd2UganVzdCBzdGFydGVkLgotICAgIFxub2JyZWFrIFx2c2tpcC1ccGFyc2tpcAotICAgICUKLSAgICAlIFN0b3AgYSBwYWdlIGJyZWFrIGF0IHRoZSBccGFyc2tpcCBnbHVlIGNvbWluZyB1cC4gIFVuZm9ydHVuYXRlbHkKLSAgICAlIHdlIGNhbid0IHByZXZlbnQgYSBwb3NzaWJsZSBwYWdlIGJyZWFrIGF0IHRoZSBmb2xsb3dpbmcKLSAgICAlIFxiYXNlbGluZXNraXAgZ2x1ZS4KLSAgICBcbm9icmVhawotICAgIFxlbmRncm91cAotICAgIFxpdGVteG5lZWRzbmVnYXRpdmV2c2tpcGZhbHNlCi0gIFxlbHNlCi0gICAgJSBUaGUgaXRlbSB0ZXh0IGZpdHMgaW50byB0aGUgc3BhY2UuICBTdGFydCBhIHBhcmFncmFwaCwgc28gdGhhdCB0aGUKLSAgICAlIGZvbGxvd2luZyB0ZXh0IChpZiBhbnkpIHdpbGwgZW5kIHVwIG9uIHRoZSBzYW1lIGxpbmUuICAKLSAgICBcbm9pbmRlbnQKLSAgICAlIERvIHRoaXMgd2l0aCBrZXJucyBhbmQgXHVuaGJveCBzbyB0aGF0IGlmIHRoZXJlIGlzIGEgZm9vdG5vdGUgaW4KLSAgICAlIHRoZSBpdGVtIHRleHQsIGl0IGNhbiBtaWdyYXRlIHRvIHRoZSBtYWluIHZlcnRpY2FsIGxpc3QgYW5kCi0gICAgJSBldmVudHVhbGx5IGJlIHByaW50ZWQuCi0gICAgXG5vYnJlYWtca2Vybi1cdGFibGVpbmRlbnQKLSAgICBcZGltZW4wID0gXGl0ZW1tYXggIFxhZHZhbmNlXGRpbWVuMCBieSBcaXRlbW1hcmdpbiBcYWR2YW5jZVxkaW1lbjAgYnkgLVx3ZDAKLSAgICBcdW5oYm94MAotICAgIFxub2JyZWFrXGtlcm5cZGltZW4wCi0gICAgXGVuZGdyb3VwCi0gICAgXGl0ZW14bmVlZHNuZWdhdGl2ZXZza2lwdHJ1ZQotICBcZmkKLX0KLQotXGRlZlxpdGVte1xlcnJtZXNzYWdle0BpdGVtIHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLVxkZWZcaXRlbXh7XGVycm1lc3NhZ2V7QGl0ZW14IHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLVxkZWZca2l0ZW17XGVycm1lc3NhZ2V7QGtpdGVtIHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLVxkZWZca2l0ZW14e1xlcnJtZXNzYWdle0BraXRlbXggd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlx4aXRlbXtcZXJybWVzc2FnZXtAeGl0ZW0gd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlx4aXRlbXh7XGVycm1lc3NhZ2V7QHhpdGVteCB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci0KLSUgQ29udGFpbnMgYSBrbHVkZ2UgdG8gZ2V0IEBlbmRbZGVzY3JpcHRpb25dIHRvIHdvcmsuCi1cZGVmXGRlc2NyaXB0aW9ue1x0YWJsZXp7XGRvbnRpbmRleH17MX17fXt9e317fX0KLQotJSBAdGFibGUsIEBmdGFibGUsIEB2dGFibGUuCi1cZGVmXHRhYmxle1xiZWdpbmdyb3VwXGluRU5WXG9iZXlsaW5lc1xvYmV5c3BhY2VzXHRhYmxleH0KLXtcb2JleWxpbmVzXG9iZXlzcGFjZXMlCi1cZ2RlZlx0YWJsZXggIzFeXk17JQotXHRhYmxleVxkb250aW5kZXgjMSAgICAgICAgXGVuZHRhYmxleX19Ci0KLVxkZWZcZnRhYmxle1xiZWdpbmdyb3VwXGluRU5WXG9iZXlsaW5lc1xvYmV5c3BhY2VzXGZ0YWJsZXh9Ci17XG9iZXlsaW5lc1xvYmV5c3BhY2VzJQotXGdkZWZcZnRhYmxleCAjMV5eTXslCi1cdGFibGV5XGZuaXRlbWluZGV4IzEgICAgICAgIFxlbmR0YWJsZXkKLVxkZWZcRWZ0YWJsZXtcZW5kZ3JhZlxhZnRlcmVudmJyZWFrXGVuZGdyb3VwfSUKLVxsZXRcRXRhYmxlPVxyZWxheH19Ci0KLVxkZWZcdnRhYmxle1xiZWdpbmdyb3VwXGluRU5WXG9iZXlsaW5lc1xvYmV5c3BhY2VzXHZ0YWJsZXh9Ci17XG9iZXlsaW5lc1xvYmV5c3BhY2VzJQotXGdkZWZcdnRhYmxleCAjMV5eTXslCi1cdGFibGV5XHZyaXRlbWluZGV4IzEgICAgICAgIFxlbmR0YWJsZXkKLVxkZWZcRXZ0YWJsZXtcZW5kZ3JhZlxhZnRlcmVudmJyZWFrXGVuZGdyb3VwfSUKLVxsZXRcRXRhYmxlPVxyZWxheH19Ci0KLVxkZWZcZG9udGluZGV4ICMxe30KLVxkZWZcZm5pdGVtaW5kZXggIzF7XGRvaW5kIHtmbn17XGNvZGV7IzF9fX0lCi1cZGVmXHZyaXRlbWluZGV4ICMxe1xkb2luZCB7dnJ9e1xjb2RleyMxfX19JQotCi17XG9iZXlzcGFjZXMgJQotXGdkZWZcdGFibGV5IzEjMiAjMyAjNCAjNSAjNiAjN1xlbmR0YWJsZXl7XGVuZGdyb3VwJQotXHRhYmxlensjMX17IzJ9eyMzfXsjNH17IzV9eyM2fX19Ci0KLVxkZWZcdGFibGV6ICMxIzIjMyM0IzUjNnslCi1cYWJvdmVlbnZicmVhayAlCi1cYmVnaW5ncm91cCAlCi1cZGVmXEVkZXNjcmlwdGlvbntcRXRhYmxlfSUgTmVjZXNzYXJ5IGtsdWRnZS4KLVxsZXRcaXRlbWluZGV4PSMxJQotXGlmbnVtIDAjMz4wIFxhZHZhbmNlIFxsZWZ0c2tpcCBieSAjM1xtaWwgXGZpICUKLVxpZm51bSAwIzQ+MCBcdGFibGVpbmRlbnQ9IzRcbWlsIFxmaSAlCi1caWZudW0gMCM1PjAgXGFkdmFuY2UgXHJpZ2h0c2tpcCBieSAjNVxtaWwgXGZpICUKLVxkZWZcaXRlbWZvbnR7IzJ9JQotXGl0ZW1tYXg9XHRhYmxlaW5kZW50ICUKLVxhZHZhbmNlIFxpdGVtbWF4IGJ5IC1caXRlbW1hcmdpbiAlCi1cYWR2YW5jZSBcbGVmdHNraXAgYnkgXHRhYmxlaW5kZW50ICUKLVxleGRlbnRhbW91bnQ9XHRhYmxlaW5kZW50Ci1ccGFyaW5kZW50ID0gMHB0Ci1ccGFyc2tpcCA9IFxzbWFsbHNraXBhbW91bnQKLVxpZmRpbSBccGFyc2tpcD0wcHQgXHBhcnNraXA9MnB0IFxmaSUKLVxkZWZcRXRhYmxle1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGxldFxpdGVtID0gXGludGVybmFsQml0ZW0gJQotXGxldFxpdGVteCA9IFxpbnRlcm5hbEJpdGVteCAlCi1cbGV0XGtpdGVtID0gXGludGVybmFsQmtpdGVtICUKLVxsZXRca2l0ZW14ID0gXGludGVybmFsQmtpdGVteCAlCi1cbGV0XHhpdGVtID0gXGludGVybmFsQnhpdGVtICUKLVxsZXRceGl0ZW14ID0gXGludGVybmFsQnhpdGVteCAlCi19Ci0KLSUgVGhpcyBpcyB0aGUgY291bnRlciB1c2VkIGJ5IEBlbnVtZXJhdGUsIHdoaWNoIGlzIHJlYWxseSBAaXRlbWl6ZQotCi1cbmV3Y291bnQgXGl0ZW1ubwotCi1cZGVmXGl0ZW1pemV7XHBhcnNlYXJnXGl0ZW1pemV6enp9Ci0KLVxkZWZcaXRlbWl6ZXp6eiAjMXslCi0gIFxiZWdpbmdyb3VwICUgZW5kZWQgYnkgdGhlIEBlbmQgaXRlbWl6ZQotICBcaXRlbWl6ZXkgeyMxfXtcRWl0ZW1pemV9Ci19Ci0KLVxkZWZcaXRlbWl6ZXkgIzEjMnslCi1cYWJvdmVlbnZicmVhayAlCi1caXRlbW1heD1caXRlbWluZGVudCAlCi1cYWR2YW5jZSBcaXRlbW1heCBieSAtXGl0ZW1tYXJnaW4gJQotXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFxpdGVtaW5kZW50ICUKLVxleGRlbnRhbW91bnQ9XGl0ZW1pbmRlbnQKLVxwYXJpbmRlbnQgPSAwcHQgJQotXHBhcnNraXAgPSBcc21hbGxza2lwYW1vdW50ICUKLVxpZmRpbSBccGFyc2tpcD0wcHQgXHBhcnNraXA9MnB0IFxmaSUKLVxkZWYjMntcZW5kZ3JhZlxhZnRlcmVudmJyZWFrXGVuZGdyb3VwfSUKLVxkZWZcaXRlbWNvbnRlbnRzeyMxfSUKLVxsZXRcaXRlbT1caXRlbWl6ZWl0ZW19Ci0KLSUgU2V0IHNmY29kZSB0byBub3JtYWwgZm9yIHRoZSBjaGFycyB0aGF0IHVzdWFsbHkgaGF2ZSBhbm90aGVyIHZhbHVlLgotJSBUaGVzZSBhcmUgYC4/ITo7LCcKLVxkZWZcZnJlbmNoc3BhY2luZ3tcc2Zjb2RlNDY9MTAwMCBcc2Zjb2RlNjM9MTAwMCBcc2Zjb2RlMzM9MTAwMAotICBcc2Zjb2RlNTg9MTAwMCBcc2Zjb2RlNTk9MTAwMCBcc2Zjb2RlNDQ9MTAwMCB9Ci0KLSUgXHNwbGl0b2ZmIFRPS0VOU1xlbmRtYXJrIGRlZmluZXMgXGZpcnN0IHRvIGJlIHRoZSBmaXJzdCB0b2tlbiBpbgotJSBUT0tFTlMsIGFuZCBccmVzdCB0byBiZSB0aGUgcmVtYWluZGVyLgotJQotXGRlZlxzcGxpdG9mZiMxIzJcZW5kbWFya3tcZGVmXGZpcnN0eyMxfVxkZWZccmVzdHsjMn19JQotCi0lIEFsbG93IGFuIG9wdGlvbmFsIGFyZ3VtZW50IG9mIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGxvd2VyY2FzZSBsZXR0ZXIsCi0lIG9yIG51bWJlciwgdG8gc3BlY2lmeSB0aGUgZmlyc3QgbGFiZWwgaW4gdGhlIGVudW1lcmF0ZWQgbGlzdC4gIE5vCi0lIGFyZ3VtZW50IGlzIHRoZSBzYW1lIGFzIGAxJy4KLSUKLVxkZWZcZW51bWVyYXRle1xwYXJzZWFyZ1xlbnVtZXJhdGV6enp9Ci1cZGVmXGVudW1lcmF0ZXp6eiAjMXtcZW51bWVyYXRleSAjMSAgXGVuZGVudW1lcmF0ZXl9Ci1cZGVmXGVudW1lcmF0ZXkgIzEgIzJcZW5kZW51bWVyYXRleXslCi0gIFxiZWdpbmdyb3VwICUgZW5kZWQgYnkgdGhlIEBlbmQgZW51bWVyYXRlCi0gICUKLSAgJSBJZiB3ZSB3ZXJlIGdpdmVuIG5vIGFyZ3VtZW50LCBwcmV0ZW5kIHdlIHdlcmUgZ2l2ZW4gYDEnLgotICBcZGVmXHRoZWFyZ3sjMX0lCi0gIFxpZnhcdGhlYXJnXGVtcHR5IFxkZWZcdGhlYXJnezF9XGZpCi0gICUKLSAgJSBEZXRlY3QgaWYgdGhlIGFyZ3VtZW50IGlzIGEgc2luZ2xlIHRva2VuLiAgSWYgc28sIGl0IG1pZ2h0IGJlIGEKLSAgJSBsZXR0ZXIuICBPdGhlcndpc2UsIHRoZSBvbmx5IHZhbGlkIHRoaW5nIGl0IGNhbiBiZSBpcyBhIG51bWJlci4KLSAgJSAoV2Ugd2lsbCBhbHdheXMgaGF2ZSBvbmUgdG9rZW4sIGJlY2F1c2Ugb2YgdGhlIHRlc3Qgd2UganVzdCBtYWRlLgotICAlIFRoaXMgaXMgYSBnb29kIHRoaW5nLCBzaW5jZSBcc3BsaXRvZmYgZG9lc24ndCB3b3JrIGdpdmVuIG5vdGhpbmcgYXQKLSAgJSBhbGwgLS0gdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB1bmRlbGltaXRlZC4pCi0gIFxleHBhbmRhZnRlclxzcGxpdG9mZlx0aGVhcmdcZW5kbWFyawotICBcaWZ4XHJlc3RcZW1wdHkKLSAgICAlIE9ubHkgb25lIHRva2VuIGluIHRoZSBhcmd1bWVudC4gIEl0IGNvdWxkIHN0aWxsIGJlIGFueXRoaW5nLgotICAgICUgQSBgYGxvd2VyY2FzZSBsZXR0ZXInJyBpcyBvbmUgd2hvc2UgXGxjY29kZSBpcyBub256ZXJvLgotICAgICUgQW4gYGB1cHBlcmNhc2UgbGV0dGVyJycgaXMgb25lIHdob3NlIFxsY2NvZGUgaXMgYm90aCBub256ZXJvLCBhbmQKLSAgICAlICAgbm90IGVxdWFsIHRvIGl0c2VsZi4KLSAgICAlIE90aGVyd2lzZSwgd2UgYXNzdW1lIGl0J3MgYSBudW1iZXIuCi0gICAgJQotICAgICUgV2UgbmVlZCB0aGUgXHJlbGF4IGF0IHRoZSBlbmQgb2YgdGhlIFxpZm51bSBsaW5lcyB0byBzdG9wIFRlWCBmcm9tCi0gICAgJSBjb250aW51aW5nIHRvIGxvb2sgZm9yIGEgPG51bWJlcj4uCi0gICAgJQotICAgIFxpZm51bVxsY2NvZGVcZXhwYW5kYWZ0ZXJgXHRoZWFyZz0wXHJlbGF4Ci0gICAgICBcbnVtZXJpY2VudW1lcmF0ZSAlIGEgbnVtYmVyICh3ZSBob3BlKQotICAgIFxlbHNlCi0gICAgICAlIEl0J3MgYSBsZXR0ZXIuCi0gICAgICBcaWZudW1cbGNjb2RlXGV4cGFuZGFmdGVyYFx0aGVhcmc9XGV4cGFuZGFmdGVyYFx0aGVhcmdccmVsYXgKLSAgICAgICAgXGxvd2VyY2FzZWVudW1lcmF0ZSAlIGxvd2VyY2FzZSBsZXR0ZXIKLSAgICAgIFxlbHNlCi0gICAgICAgIFx1cHBlcmNhc2VlbnVtZXJhdGUgJSB1cHBlcmNhc2UgbGV0dGVyCi0gICAgICBcZmkKLSAgICBcZmkKLSAgXGVsc2UKLSAgICAlIE11bHRpcGxlIHRva2VucyBpbiB0aGUgYXJndW1lbnQuICBXZSBob3BlIGl0J3MgYSBudW1iZXIuCi0gICAgXG51bWVyaWNlbnVtZXJhdGUKLSAgXGZpCi19Ci0KLSUgQW4gQGVudW1lcmF0ZSB3aG9zZSBsYWJlbHMgYXJlIGludGVnZXJzLiAgVGhlIHN0YXJ0aW5nIGludGVnZXIgaXMKLSUgZ2l2ZW4gaW4gXHRoZWFyZy4KLSUKLVxkZWZcbnVtZXJpY2VudW1lcmF0ZXslCi0gIFxpdGVtbm8gPSBcdGhlYXJnCi0gIFxzdGFydGVudW1lcmF0aW9ue1x0aGVcaXRlbW5vfSUKLX0KLQotJSBUaGUgc3RhcnRpbmcgKGxvd2VyY2FzZSkgbGV0dGVyIGlzIGluIFx0aGVhcmcuCi1cZGVmXGxvd2VyY2FzZWVudW1lcmF0ZXslCi0gIFxpdGVtbm8gPSBcZXhwYW5kYWZ0ZXJgXHRoZWFyZwotICBcc3RhcnRlbnVtZXJhdGlvbnslCi0gICAgJSBCZSBzdXJlIHdlJ3JlIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYWxwaGFiZXQuCi0gICAgXGlmbnVtXGl0ZW1ubz0wCi0gICAgICBcZXJybWVzc2FnZXtObyBtb3JlIGxvd2VyY2FzZSBsZXR0ZXJzIGluIEBlbnVtZXJhdGU7IGdldCBhIGJpZ2dlcgotICAgICAgICAgICAgICAgICAgYWxwaGFiZXR9JQotICAgIFxmaQotICAgIFxjaGFyXGxjY29kZVxpdGVtbm8KLSAgfSUKLX0KLQotJSBUaGUgc3RhcnRpbmcgKHVwcGVyY2FzZSkgbGV0dGVyIGlzIGluIFx0aGVhcmcuCi1cZGVmXHVwcGVyY2FzZWVudW1lcmF0ZXslCi0gIFxpdGVtbm8gPSBcZXhwYW5kYWZ0ZXJgXHRoZWFyZwotICBcc3RhcnRlbnVtZXJhdGlvbnslCi0gICAgJSBCZSBzdXJlIHdlJ3JlIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYWxwaGFiZXQuCi0gICAgXGlmbnVtXGl0ZW1ubz0wCi0gICAgICBcZXJybWVzc2FnZXtObyBtb3JlIHVwcGVyY2FzZSBsZXR0ZXJzIGluIEBlbnVtZXJhdGU7IGdldCBhIGJpZ2dlcgotICAgICAgICAgICAgICAgICAgYWxwaGFiZXR9Ci0gICAgXGZpCi0gICAgXGNoYXJcdWNjb2RlXGl0ZW1ubwotICB9JQotfQotCi0lIENhbGwgaXRlbWl6ZXksIGFkZGluZyBhIHBlcmlvZCB0byB0aGUgZmlyc3QgYXJndW1lbnQgYW5kIHN1cHBseWluZyB0aGUKLSUgY29tbW9uIGxhc3QgdHdvIGFyZ3VtZW50cy4gIEFsc28gc3VidHJhY3Qgb25lIGZyb20gdGhlIGluaXRpYWwgdmFsdWUgaW4KLSUgXGl0ZW1ubywgc2luY2UgQGl0ZW0gaW5jcmVtZW50cyBcaXRlbW5vLgotJQotXGRlZlxzdGFydGVudW1lcmF0aW9uIzF7JQotICBcYWR2YW5jZVxpdGVtbm8gYnkgLTEKLSAgXGl0ZW1pemV5eyMxLn1cRWVudW1lcmF0ZVxmbHVzaGNyCi19Ci0KLSUgQGFscGhhZW51bWVyYXRlIGFuZCBAY2Fwc2VudW1lcmF0ZSBhcmUgYWJicmV2aWF0aW9ucyBmb3IgZ2l2aW5nIGFuIGFyZwotJSB0byBAZW51bWVyYXRlLgotJQotXGRlZlxhbHBoYWVudW1lcmF0ZXtcZW51bWVyYXRle2F9fQotXGRlZlxjYXBzZW51bWVyYXRle1xlbnVtZXJhdGV7QX19Ci1cZGVmXEVhbHBoYWVudW1lcmF0ZXtcRWVudW1lcmF0ZX0KLVxkZWZcRWNhcHNlbnVtZXJhdGV7XEVlbnVtZXJhdGV9Ci0KLSUgRGVmaW5pdGlvbiBvZiBAaXRlbSB3aGlsZSBpbnNpZGUgQGl0ZW1pemUuCi0KLVxkZWZcaXRlbWl6ZWl0ZW17JQotXGFkdmFuY2VcaXRlbW5vIGJ5IDEKLXtcbGV0XHBhcj1cZW5kZ3JhZiBcc21hbGxicmVha30lCi1caWZobW9kZSBcZXJybWVzc2FnZXtJbiBobW9kZSBhdCBpdGVtaXplaXRlbX1cZmkKLXtccGFyc2tpcD0waW4gXGhza2lwIDBwdAotXGhib3ggdG8gMHB0e1xoc3MgXGl0ZW1jb250ZW50c1xoc2tpcCBcaXRlbW1hcmdpbn0lCi1cdmFkanVzdHtccGVuYWx0eSAxMjAwfX0lCi1cZmx1c2hjcn0KLQotJSBAbXVsdGl0YWJsZSBtYWNyb3MKLSUgQW15IEhlbmRyaWNrc29uLCA4LzE4Lzk0LCAzLzYvOTYKLSUKLSUgQG11bHRpdGFibGUgLi4uIEBlbmQgbXVsdGl0YWJsZSB3aWxsIG1ha2UgYXMgbWFueSBjb2x1bW5zIGFzIGRlc2lyZWQuCi0lIENvbnRlbnRzIG9mIGVhY2ggY29sdW1uIHdpbGwgd3JhcCBhdCB3aWR0aCBnaXZlbiBpbiBwcmVhbWJsZS4gIFdpZHRoCi0lIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIHdpdGggc2FtcGxlIHRleHQgZ2l2ZW4gaW4gYSB0ZW1wbGF0ZSBsaW5lLAotJSBvciBpbiBwZXJjZW50IG9mIFxoc2l6ZSwgdGhlIGN1cnJlbnQgd2lkdGggb2YgdGV4dCBvbiBwYWdlLgotCi0lIFRhYmxlIGNhbiBjb250aW51ZSBvdmVyIHBhZ2VzIGJ1dCB3aWxsIG9ubHkgYnJlYWsgYmV0d2VlbiBsaW5lcy4KLQotJSBUbyBtYWtlIHByZWFtYmxlOgotJQotJSBFaXRoZXIgZGVmaW5lIHdpZHRocyBvZiBjb2x1bW5zIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplOgotJSAgIEBtdWx0aXRhYmxlIEBjb2x1bW5mcmFjdGlvbnMgLjI1IC4zIC40NQotJSAgIEBpdGVtIC4uLgotJQotJSAgIE51bWJlcnMgZm9sbG93aW5nIEBjb2x1bW5mcmFjdGlvbnMgYXJlIHRoZSBwZXJjZW50IG9mIHRoZSB0b3RhbAotJSAgIGN1cnJlbnQgaHNpemUgdG8gYmUgdXNlZCBmb3IgZWFjaCBjb2x1bW4uIFlvdSBtYXkgdXNlIGFzIG1hbnkKLSUgICBjb2x1bW5zIGFzIGRlc2lyZWQuCi0KLQotJSBPciB1c2UgYSB0ZW1wbGF0ZToKLSUgICBAbXVsdGl0YWJsZSB7Q29sdW1uIDEgdGVtcGxhdGV9IHtDb2x1bW4gMiB0ZW1wbGF0ZX0ge0NvbHVtbiAzIHRlbXBsYXRlfQotJSAgIEBpdGVtIC4uLgotJSAgIHVzaW5nIHRoZSB3aWRlc3QgdGVybSBkZXNpcmVkIGluIGVhY2ggY29sdW1uLgotJQotJSBGb3IgdGhvc2Ugd2hvIHdhbnQgdG8gdXNlIG1vcmUgdGhhbiBvbmUgbGluZSdzIHdvcnRoIG9mIHdvcmRzIGluCi0lIHRoZSBwcmVhbWJsZSwgYnJlYWsgdGhlIGxpbmUgd2l0aGluIG9uZSBhcmd1bWVudCBhbmQgaXQKLSUgd2lsbCBwYXJzZSBjb3JyZWN0bHksIGkuZS4sCi0lCi0lICAgICBAbXVsdGl0YWJsZSB7Q29sdW1uIDEgdGVtcGxhdGV9IHtDb2x1bW4gMiB0ZW1wbGF0ZX0ge0NvbHVtbiAzCi0lICAgICAgdGVtcGxhdGV9Ci0lIE5vdDoKLSUgICAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfQotJSAgICAgIHtDb2x1bW4gMyB0ZW1wbGF0ZX0KLQotJSBFYWNoIG5ldyB0YWJsZSBsaW5lIHN0YXJ0cyB3aXRoIEBpdGVtLCBlYWNoIHN1YnNlcXVlbnQgbmV3IGNvbHVtbgotJSBzdGFydHMgd2l0aCBAdGFiLiBFbXB0eSBjb2x1bW5zIG1heSBiZSBwcm9kdWNlZCBieSBzdXBwbHlpbmcgQHRhYidzCi0lIHdpdGggbm90aGluZyBiZXR3ZWVuIHRoZW0gZm9yIGFzIG1hbnkgdGltZXMgYXMgZW1wdHkgY29sdW1ucyBhcmUgbmVlZGVkLAotJSBpZSwgQHRhYkB0YWJAdGFiIHdpbGwgcHJvZHVjZSB0d28gZW1wdHkgY29sdW1ucy4KLQotJSBAaXRlbSwgQHRhYiwgQG11bHRpdGFibGUgb3IgQGVuZCBtdWx0aXRhYmxlIGRvIG5vdCBuZWVkIHRvIGJlIG9uIHRoZWlyCi0lIG93biBsaW5lcywgYnV0IGl0IHdpbGwgbm90IGh1cnQgaWYgdGhleSBhcmUuCi0KLSUgU2FtcGxlIG11bHRpdGFibGU6Ci0KLSUgICBAbXVsdGl0YWJsZSB7Q29sdW1uIDEgdGVtcGxhdGV9IHtDb2x1bW4gMiB0ZW1wbGF0ZX0ge0NvbHVtbiAzIHRlbXBsYXRlfQotJSAgIEBpdGVtIGZpcnN0IGNvbCBzdHVmZiBAdGFiIHNlY29uZCBjb2wgc3R1ZmYgQHRhYiB0aGlyZCBjb2wKLSUgICBAaXRlbQotJSAgIGZpcnN0IGNvbCBzdHVmZgotJSAgIEB0YWIKLSUgICBzZWNvbmQgY29sIHN0dWZmCi0lICAgQHRhYgotJSAgIHRoaXJkIGNvbAotJSAgIEBpdGVtIGZpcnN0IGNvbCBzdHVmZiBAdGFiIHNlY29uZCBjb2wgc3R1ZmYKLSUgICBAdGFiIE1hbnkgcGFyYWdyYXBocyBvZiB0ZXh0IG1heSBiZSB1c2VkIGluIGFueSBjb2x1bW4uCi0lCi0lICAgICAgICAgVGhleSB3aWxsIHdyYXAgYXQgdGhlIHdpZHRoIGRldGVybWluZWQgYnkgdGhlIHRlbXBsYXRlLgotJSAgIEBpdGVtQHRhYkB0YWIgVGhpcyB3aWxsIGJlIGluIHRoaXJkIGNvbHVtbi4KLSUgICBAZW5kIG11bHRpdGFibGUKLQotJSBEZWZhdWx0IGRpbWVuc2lvbnMgbWF5IGJlIHJlc2V0IGJ5IHVzZXIuCi0lIEBtdWx0aXRhYmxlcGFyc2tpcCBpcyB2ZXJ0aWNhbCBzcGFjZSBiZXR3ZWVuIHBhcmFncmFwaHMgaW4gdGFibGUuCi0lIEBtdWx0aXRhYmxlcGFyaW5kZW50IGlzIHBhcmFncmFwaCBpbmRlbnQgaW4gdGFibGUuCi0lIEBtdWx0aXRhYmxlY29sbWFyZ2luIGlzIGhvcml6b250YWwgc3BhY2UgdG8gYmUgbGVmdCBiZXR3ZWVuIGNvbHVtbnMuCi0lIEBtdWx0aXRhYmxlbGluZXNwYWNlIGlzIHNwYWNlIHRvIGxlYXZlIGJldHdlZW4gdGFibGUgaXRlbXMsIGJhc2VsaW5lCi0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmFzZWxpbmUuCi0lICAgMHB0IG1lYW5zIGl0IGRlcGVuZHMgb24gY3VycmVudCBub3JtYWwgbGluZSBzcGFjaW5nLgotJQotXG5ld3NraXBcbXVsdGl0YWJsZXBhcnNraXAKLVxuZXdza2lwXG11bHRpdGFibGVwYXJpbmRlbnQKLVxuZXdkaW1lblxtdWx0aXRhYmxlY29sc3BhY2UKLVxuZXdza2lwXG11bHRpdGFibGVsaW5lc3BhY2UKLVxtdWx0aXRhYmxlcGFyc2tpcD0wcHQKLVxtdWx0aXRhYmxlcGFyaW5kZW50PTZwdAotXG11bHRpdGFibGVjb2xzcGFjZT0xMnB0Ci1cbXVsdGl0YWJsZWxpbmVzcGFjZT0wcHQKLQotJSBNYWNyb3MgdXNlZCB0byBzZXQgdXAgaGFsaWduIHByZWFtYmxlOgotJSAKLVxsZXRcZW5kc2V0dXB0YWJsZVxyZWxheAotXGRlZlx4ZW5kc2V0dXB0YWJsZXtcZW5kc2V0dXB0YWJsZX0KLVxsZXRcY29sdW1uZnJhY3Rpb25zXHJlbGF4Ci1cZGVmXHhjb2x1bW5mcmFjdGlvbnN7XGNvbHVtbmZyYWN0aW9uc30KLVxuZXdpZlxpZnNldHBlcmNlbnQKLQotJSAyLzEvOTYsIHRvIGFsbG93IGZyYWN0aW9ucyB0byBiZSBnaXZlbiB3aXRoIG1vcmUgdGhhbiBvbmUgZGlnaXQuCi1cZGVmXHBpY2t1cHdob2xlZnJhY3Rpb24jMSB7XGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5MSAlCi1cZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWV7LiMxXGhzaXplfSUKLVxzZXR1cHRhYmxlfQotCi1cbmV3Y291bnRcY29sY291bnQKLVxkZWZcc2V0dXB0YWJsZSMxe1xkZWZcZmlyc3Rhcmd7IzF9JQotXGlmeFxmaXJzdGFyZ1x4ZW5kc2V0dXB0YWJsZVxsZXRcZ29ccmVsYXglCi1cZWxzZQotICBcaWZ4XGZpcnN0YXJnXHhjb2x1bW5mcmFjdGlvbnNcZ2xvYmFsXHNldHBlcmNlbnR0cnVlJQotICBcZWxzZQotICAgIFxpZnNldHBlcmNlbnQKLSAgICAgICBcbGV0XGdvXHBpY2t1cHdob2xlZnJhY3Rpb24gICAlIEluIHRoaXMgY2FzZSBhcmcgb2Ygc2V0dXB0YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgaXMgdGhlIGRlY2ltYWwgcG9pbnQgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgbnVtYmVyIGdpdmVuIGluIHBlcmNlbnQgb2YgaHNpemUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBXZSBkb24ndCBuZWVkIHRoaXMgc28gd2UgZG9uJ3QgdXNlIGl0LgotICAgIFxlbHNlCi0gICAgICAgXGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5MQotICAgICAgIFxzZXRib3gwPVxoYm94eyMxIH0lIEFkZCBhIG5vcm1hbCB3b3JkIHNwYWNlIGFzIGEgc2VwYXJhdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAlIHR5cGljYWxseSB0aGF0IGlzIGFsd2F5cyBpbiB0aGUgaW5wdXQsIGFueXdheS4KLSAgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWV7XHRoZVx3ZDB9JQotICAgIFxmaSUKLSAgXGZpJQotXGlmeFxnb1xwaWNrdXB3aG9sZWZyYWN0aW9uXGVsc2VcbGV0XGdvXHNldHVwdGFibGVcZmklCi1cZmlcZ299Ci0KLSUgbXVsdGl0YWJsZSBzeW50YXgKLVxkZWZcdGFieyZcaHNraXAxc3BccmVsYXh9ICUgMi8yLzk2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAlIHRpbnkgc2tpcCBoZXJlIG1ha2VzIHN1cmUgdGhpcyBjb2x1bW4gc3BhY2UgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICUgbWFpbnRhaW5lZCwgZXZlbiBpZiBpdCBpcyBuZXZlciB1c2VkLgotCi0lIEBtdWx0aXRhYmxlIC4uLiBAZW5kIG11bHRpdGFibGUgZGVmaW5pdGlvbnM6Ci0KLVxkZWZcbXVsdGl0YWJsZXtccGFyc2VhcmdcZG90YWJsZX0KLVxkZWZcZG90YWJsZSMxe1xiZ3JvdXAKLSAgXHZza2lwXHBhcnNraXAKLSAgXGxldFxpdGVtXGNyY3IKLSAgXHRvbGVyYW5jZT05NTAwCi0gIFxoYmFkbmVzcz05NTAwCi0gIFxzZXRtdWx0aXRhYmxlc3BhY2luZwotICBccGFyc2tpcD1cbXVsdGl0YWJsZXBhcnNraXAKLSAgXHBhcmluZGVudD1cbXVsdGl0YWJsZXBhcmluZGVudAotICBcb3ZlcmZ1bGxydWxlPTBwdAotICBcZ2xvYmFsXGNvbGNvdW50PTAKLSAgXGRlZlxFbXVsdGl0YWJsZXtcZ2xvYmFsXHNldHBlcmNlbnRmYWxzZVxjclxlZ3JvdXBcZWdyb3VwfSUKLSAgJQotICAlIFRvIHBhcnNlIGV2ZXJ5dGhpbmcgYmV0d2VlbiBAbXVsdGl0YWJsZSBhbmQgQGl0ZW06Ci0gIFxzZXR1cHRhYmxlIzEgXGVuZHNldHVwdGFibGUKLSAgJQotICAlIFxldmVyeWNyIHdpbGwgcmVzZXQgY29sdW1uIGNvdW50ZXIsIFxjb2xjb3VudCwgYXQgdGhlIGVuZCBvZgotICAlIGVhY2ggbGluZS4gRXZlcnkgY29sdW1uIGVudHJ5IHdpbGwgY2F1c2UgXGNvbGNvdW50IHRvIGFkdmFuY2UgYnkgb25lLgotICAlIFRoZSB0YWJsZSBwcmVhbWJsZQotICAlIGxvb2tzIGF0IHRoZSBjdXJyZW50IFxjb2xjb3VudCB0byBmaW5kIHRoZSBjb3JyZWN0IGNvbHVtbiB3aWR0aC4KLSAgXGV2ZXJ5Y3J7XG5vYWxpZ257JQotICAlCi0gICUgXGZpbGJyZWFrJSUga2VlcHMgdW5kZXJmdWxsIGJveCBtZXNzYWdlcyBvZmYgd2hlbiB0YWJsZSBicmVha3Mgb3ZlciBwYWdlcy4KLSAgJSBNYXliZSBzbywgYnV0IGl0IGFsc28gY3JlYXRlcyByZWFsbHkgd2VpcmQgcGFnZSBicmVha3Mgd2hlbiB0aGUgdGFibGUKLSAgJSBicmVha3Mgb3ZlciBwYWdlcy4gV291bGRuJ3QgXHZmaWwgYmUgYmV0dGVyPyAgV2FpdCB1bnRpbCB0aGUgcHJvYmxlbQotICAlIG1hbmlmZXN0cyBpdHNlbGYsIHNvIGl0IGNhbiBiZSBmaXhlZCBmb3IgcmVhbCAtLWthcmwuCi0gICAgXGdsb2JhbFxjb2xjb3VudD0wXHJlbGF4fX0lCi0gICUKLSAgJSBUaGlzIHByZWFtYmxlIHNldHMgdXAgYSBnZW5lcmljIGNvbHVtbiBkZWZpbml0aW9uLCB3aGljaCB3aWxsCi0gICUgYmUgdXNlZCBhcyBtYW55IHRpbWVzIGFzIHVzZXIgY2FsbHMgZm9yIGNvbHVtbnMuCi0gICUgXHZ0b3Agd2lsbCBzZXQgYSBzaW5nbGUgbGluZSBhbmQgd2lsbCBhbHNvIGxldCB0ZXh0IHdyYXAgYW5kCi0gICUgY29udGludWUgZm9yIG1hbnkgcGFyYWdyYXBocyBpZiBkZXNpcmVkLgotICBcaGFsaWduXGJncm91cCZcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkgMVxyZWxheAotICAgIFxtdWx0aXN0cnV0XHZ0b3B7XGhzaXplPVxleHBhbmRhZnRlclxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWUKLSAgJQotICAlIEluIG9yZGVyIHRvIGtlZXAgZW50cmllcyBmcm9tIGJ1bXBpbmcgaW50byBlYWNoIG90aGVyCi0gICUgd2Ugd2lsbCBhZGQgYSBcbGVmdHNraXAgb2YgXG11bHRpdGFibGVjb2xzcGFjZSB0byBhbGwgY29sdW1ucyBhZnRlcgotICAlIHRoZSBmaXJzdCBvbmUuCi0gICUgCi0gICUgSWYgYSB0ZW1wbGF0ZSBoYXMgYmVlbiB1c2VkLCB3ZSB3aWxsIGFkZCBcbXVsdGl0YWJsZWNvbHNwYWNlCi0gICUgdG8gdGhlIHdpZHRoIG9mIGVhY2ggdGVtcGxhdGUgZW50cnkuCi0gICUgCi0gICUgSWYgdGhlIHVzZXIgaGFzIHNldCBwcmVhbWJsZSBpbiB0ZXJtcyBvZiBwZXJjZW50IG9mIFxoc2l6ZSB3ZSB3aWxsCi0gICUgdXNlIHRoYXQgZGltZW5zaW9uIGFzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uLCBhbmQgdGhlIFxsZWZ0c2tpcAotICAlIHdpbGwga2VlcCBlbnRyaWVzIGZyb20gYnVtcGluZyBpbnRvIGVhY2ggb3RoZXIuICBUYWJsZSB3aWxsIHN0YXJ0IGF0Ci0gICUgbGVmdCBtYXJnaW4gYW5kIGZpbmFsIGNvbHVtbiB3aWxsIGp1c3RpZnkgYXQgcmlnaHQgbWFyZ2luLgotICAlIAotICAlIE1ha2Ugc3VyZSB3ZSBkb24ndCBpbmhlcml0IFxyaWdodHNraXAgZnJvbSB0aGUgb3V0ZXIgZW52aXJvbm1lbnQuCi0gIFxyaWdodHNraXA9MHB0Ci0gIFxpZm51bVxjb2xjb3VudD0xCi0gICAgJSBUaGUgZmlyc3QgY29sdW1uIHdpbGwgYmUgaW5kZW50ZWQgd2l0aCB0aGUgc3Vycm91bmRpbmcgdGV4dC4KLSAgICBcYWR2YW5jZVxoc2l6ZSBieVxsZWZ0c2tpcAotICBcZWxzZQotICAgIFxpZnNldHBlcmNlbnQgXGVsc2UKLSAgICAgICUgSWYgdXNlciBoYXMgbm90IHNldCBwcmVhbWJsZSBpbiB0ZXJtcyBvZiBwZXJjZW50IG9mIFxoc2l6ZQotICAgICAgJSB3ZSB3aWxsIGFkdmFuY2UgXGhzaXplIGJ5IFxtdWx0aXRhYmxlY29sc3BhY2UuCi0gICAgICBcYWR2YW5jZVxoc2l6ZSBieSBcbXVsdGl0YWJsZWNvbHNwYWNlCi0gICAgXGZpCi0gICAlIEluIGVpdGhlciBjYXNlIHdlIHdpbGwgbWFrZSBcbGVmdHNraXA9XG11bHRpdGFibGVjb2xzcGFjZToKLSAgXGxlZnRza2lwPVxtdWx0aXRhYmxlY29sc3BhY2UKLSAgXGZpCi0gICUgSWdub3Jpbmcgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIGF2b2lkcyBhbiBvY2Nhc2lvbmFsIHNwdXJpb3VzCi0gICUgYmxhbmsgbGluZSwgd2hlbiBUZVggZGVjaWRlcyB0byBicmVhayB0aGUgbGluZSBhdCB0aGUgc3BhY2UgYmVmb3JlIHRoZQotICAlIGJveCBmcm9tIHRoZSBtdWx0aXN0cnV0LCBzbyB0aGUgc3RydXQgZW5kcyB1cCBvbiBhIGxpbmUgYnkgaXRzZWxmLgotICAlIEZvciBleGFtcGxlOgotICAlIEBtdWx0aXRhYmxlIEBjb2x1bW5mcmFjdGlvbnMgLjExIC44OQotICAlIEBpdGVtIEBjb2RleyN9Ci0gICUgQHRhYiBMZWdhbCBob2xpZGF5IHdoaWNoIGlzIHZhbGlkIGluIG1ham9yIHBhcnRzIG9mIHRoZSB3aG9sZSBjb3VudHJ5LgotICAlIElzIGF1dG9tYXRpY2FsbHkgcHJvdmlkZWQgd2l0aCBoaWdobGlnaHRpbmcgc2VxdWVuY2VzIHJlc3BlY3RpdmVseSBtYXJraW5nCi0gICUgY2hhcmFjdGVycy4KLSAgXG5vaW5kZW50XGlnbm9yZXNwYWNlcyMjXHVuc2tpcFxtdWx0aXN0cnV0fVxjcgotfQotCi1cZGVmXHNldG11bHRpdGFibGVzcGFjaW5neyUgdGVzdCB0byBzZWUgaWYgdXNlciBoYXMgc2V0IFxtdWx0aXRhYmxlbGluZXNwYWNlLgotJSBJZiBzbywgZG8gbm90aGluZy4gSWYgbm90LCBnaXZlIGl0IGFuIGFwcHJvcHJpYXRlIGRpbWVuc2lvbiBiYXNlZCBvbgotJSBjdXJyZW50IGJhc2VsaW5lc2tpcC4KLVxpZmRpbVxtdWx0aXRhYmxlbGluZXNwYWNlPTBwdAotJSUgc3RydXQgdG8gcHV0IGluIHRhYmxlIGluIGNhc2Ugc29tZSBlbnRyeSBkb2Vzbid0IGhhdmUgZGVzY2VuZGVycywKLSUlIHRvIGtlZXAgbGluZXMgZXF1YWxseSBzcGFjZWQKLVxsZXRcbXVsdGlzdHJ1dCA9IFxzdHJ1dAotJSUgVGVzdCB0byBzZWUgaWYgcGFyc2tpcCBpcyBsYXJnZXIgdGhhbiBzcGFjZSBiZXR3ZWVuIGxpbmVzIG9mCi0lJSB0YWJsZS4gSWYgbm90LCBkbyBub3RoaW5nLgotJSUgICAgICAgIElmIHNvLCBzZXQgdG8gc2FtZSBkaW1lbnNpb24gYXMgbXVsdGl0YWJsZWxpbmVzcGFjZS4KLVxlbHNlCi1cZ2RlZlxtdWx0aXN0cnV0e1x2cnVsZSBoZWlnaHRcbXVsdGl0YWJsZWxpbmVzcGFjZSBkZXB0aFxkcDAKLXdpZHRoMHB0XHJlbGF4fSBcZmkKLVxpZmRpbVxtdWx0aXRhYmxlcGFyc2tpcD5cbXVsdGl0YWJsZWxpbmVzcGFjZQotXGdsb2JhbFxtdWx0aXRhYmxlcGFyc2tpcD1cbXVsdGl0YWJsZWxpbmVzcGFjZQotXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVwYXJza2lwLTdwdCAlJSB0byBrZWVwIHBhcnNraXAgc29tZXdoYXQgc21hbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlJSB0aGFuIHNraXAgYmV0d2VlbiBsaW5lcyBpbiB0aGUgdGFibGUuCi1cZmklCi1caWZkaW1cbXVsdGl0YWJsZXBhcnNraXA9MHB0Ci1cZ2xvYmFsXG11bHRpdGFibGVwYXJza2lwPVxtdWx0aXRhYmxlbGluZXNwYWNlCi1cZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZXBhcnNraXAtN3B0ICUlIHRvIGtlZXAgcGFyc2tpcCBzb21ld2hhdCBzbWFsbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlIHRoYW4gc2tpcCBiZXR3ZWVuIGxpbmVzIGluIHRoZSB0YWJsZS4KLVxmaX0KLQotCi1cbWVzc2FnZXtpbmRleGluZyx9Ci0lIEluZGV4IGdlbmVyYXRpb24gZmFjaWxpdGllcwotCi0lIERlZmluZSBcbmV3d3JpdGUgdG8gYmUgaWRlbnRpY2FsIHRvIHBsYWluIHRleCdzIFxuZXd3cml0ZQotJSBleGNlcHQgbm90IFxvdXRlciwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aGluIFxuZXdpbmRleC4KLXtcY2F0Y29kZWBcQD0xMQotXGdkZWZcbmV3d3JpdGV7XGFsbG9jQDdcd3JpdGVcY2hhcmRlZlxzaXh0QEBufX0KLQotJSBcbmV3aW5kZXgge2Zvb30gZGVmaW5lcyBhbiBpbmRleCBuYW1lZCBmb28uCi0lIEl0IGF1dG9tYXRpY2FsbHkgZGVmaW5lcyBcZm9vaW5kZXggc3VjaCB0aGF0Ci0lIFxmb29pbmRleCAuLi5yZXN0IG9mIGxpbmUuLi4gcHV0cyBhbiBlbnRyeSBpbiB0aGUgaW5kZXggZm9vLgotJSBJdCBhbHNvIGRlZmluZXMgXGZvb2luZGZpbGUgdG8gYmUgdGhlIG51bWJlciBvZiB0aGUgb3V0cHV0IGNoYW5uZWwgZm9yCi0lIHRoZSBmaWxlIHRoYXQgYWNjdW11bGF0ZXMgdGhpcyBpbmRleC4gIFRoZSBmaWxlJ3MgZXh0ZW5zaW9uIGlzIGZvby4KLSUgVGhlIG5hbWUgb2YgYW4gaW5kZXggc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiAyIGNoYXJhY3RlcnMgbG9uZwotJSBmb3IgdGhlIHNha2Ugb2Ygdm1zLgotJQotXGRlZlxuZXdpbmRleCMxeyUKLSAgXGlmbGlua3MKLSAgICBcZXhwYW5kYWZ0ZXJcbmV3d3JpdGUgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKLSAgICBcb3Blbm91dCBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZSBcam9ibmFtZS4jMSAlIE9wZW4gdGhlIGZpbGUKLSAgXGZpCi0gIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUgICAgICUgRGVmaW5lIEAjMWluZGV4Ci0gICAgXG5vZXhwYW5kXGRvaW5kZXh7IzF9fQotfQotCi0lIEBkZWZpbmRleCBmb28gID09ICBcbmV3aW5kZXh7Zm9vfQotCi1cZGVmXGRlZmluZGV4e1xwYXJzZWFyZ1xuZXdpbmRleH0KLQotJSBEZWZpbmUgQGRlZmNvZGVpbmRleCwgbGlrZSBAZGVmaW5kZXggZXhjZXB0IHB1dCBhbGwgZW50cmllcyBpbiBAY29kZS4KLQotXGRlZlxuZXdjb2RlaW5kZXgjMXslCi0gIFxpZmxpbmtzCi0gICAgXGV4cGFuZGFmdGVyXG5ld3dyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCi0gICAgXG9wZW5vdXQgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUgXGpvYm5hbWUuIzEKLSAgXGZpCi0gIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUKLSAgICBcbm9leHBhbmRcZG9jb2RlaW5kZXh7IzF9fQotfQotCi1cZGVmXGRlZmNvZGVpbmRleHtccGFyc2VhcmdcbmV3Y29kZWluZGV4fQotCi0lIEBzeW5pbmRleCBmb28gYmFyICAgIG1ha2VzIGluZGV4IGZvbyBmZWVkIGludG8gaW5kZXggYmFyLgotJSBEbyB0aGlzIGluc3RlYWQgb2YgQGRlZmluZGV4IGZvbyBpZiB5b3UgZG9uJ3Qgd2FudCBpdCBhcyBhIHNlcGFyYXRlIGluZGV4LgotJSBUaGUgXGNsb3Nlb3V0IGhlbHBzIHJlZHVjZSB1bm5lY2Vzc2FyeSBvcGVuIGZpbGVzOyB0aGUgbGltaXQgb24gdGhlCi0lIEFjb3JuIFJJU0MgT1MgaXMgYSBtZXJlIDE2IGZpbGVzLgotXGRlZlxzeW5pbmRleCMxICMyIHslCi0gIFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcc3luaW5kZXhmb29cZXhwYW5kYWZ0ZXI9XGNzbmFtZSMyaW5kZmlsZVxlbmRjc25hbWUKLSAgXGV4cGFuZGFmdGVyXGNsb3Nlb3V0XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKLSAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lPVxzeW5pbmRleGZvbwotICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslIGRlZmluZSBceHh4aW5kZXgKLSAgICBcbm9leHBhbmRcZG9pbmRleHsjMn19JQotfQotCi0lIEBzeW5jb2RlaW5kZXggZm9vIGJhciAgIHNpbWlsYXIsIGJ1dCBwdXQgYWxsIGVudHJpZXMgbWFkZSBmb3IgaW5kZXggZm9vCi0lIGluc2lkZSBAY29kZS4KLVxkZWZcc3luY29kZWluZGV4IzEgIzIgeyUKLSAgXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclxzeW5pbmRleGZvb1xleHBhbmRhZnRlcj1cY3NuYW1lIzJpbmRmaWxlXGVuZGNzbmFtZQotICBcZXhwYW5kYWZ0ZXJcY2xvc2VvdXRcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQotICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWU9XHN5bmluZGV4Zm9vCi0gIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUgZGVmaW5lIFx4eHhpbmRleAotICAgIFxub2V4cGFuZFxkb2NvZGVpbmRleHsjMn19JQotfQotCi0lIERlZmluZSBcZG9pbmRleCwgdGhlIGRyaXZlciBmb3IgYWxsIFxmb29pbmRleCBtYWNyb3MuCi0lIEFyZ3VtZW50ICMxIGlzIGdlbmVyYXRlZCBieSB0aGUgY2FsbGluZyBcZm9vaW5kZXggbWFjcm8sCi0lICBhbmQgaXQgaXMgImZvbyIsIHRoZSBuYW1lIG9mIHRoZSBpbmRleC4KLQotJSBcZG9pbmRleCBqdXN0IHVzZXMgXHBhcnNlYXJnOyBpdCBjYWxscyBcZG9pbmQgZm9yIHRoZSBhY3R1YWwgd29yay4KLSUgVGhpcyBpcyBiZWNhdXNlIFxkb2luZCBpcyBtb3JlIHVzZWZ1bCB0byBjYWxsIGZyb20gb3RoZXIgbWFjcm9zLgotCi0lIFRoZXJlIGlzIGFsc28gXGRvc3ViaW5kIHtpbmRleH17dG9waWN9e3N1YnRvcGljfQotJSB3aGljaCBtYWtlcyBhbiBlbnRyeSBpbiBhIHR3by1sZXZlbCBpbmRleCBzdWNoIGFzIHRoZSBvcGVyYXRpb24gaW5kZXguCi0KLVxkZWZcZG9pbmRleCMxe1xlZGVmXGluZGV4bmFtZXsjMX1ccGFyc2Vhcmdcc2luZ2xlaW5kZXhlcn0KLVxkZWZcc2luZ2xlaW5kZXhlciAjMXtcZG9pbmR7XGluZGV4bmFtZX17IzF9fQotCi0lIGxpa2UgdGhlIHByZXZpb3VzIHR3bywgYnV0IHRoZXkgcHV0IEBjb2RlIGFyb3VuZCB0aGUgYXJndW1lbnQuCi1cZGVmXGRvY29kZWluZGV4IzF7XGVkZWZcaW5kZXhuYW1leyMxfVxwYXJzZWFyZ1xzaW5nbGVjb2RlaW5kZXhlcn0KLVxkZWZcc2luZ2xlY29kZWluZGV4ZXIgIzF7XGRvaW5ke1xpbmRleG5hbWV9e1xjb2RleyMxfX19Ci0KLVxkZWZcaW5kZXhkdW1taWVzeyUKLVxkZWZcIHsgfSUKLSUgVGFrZSBjYXJlIG9mIHRoZSBwbGFpbiB0ZXggYWNjZW50IGNvbW1hbmRzLgotXGRlZlwie1xyZWFsYmFja3NsYXNoICJ9JQotXGRlZlxge1xyZWFsYmFja3NsYXNoIGB9JQotXGRlZlwne1xyZWFsYmFja3NsYXNoICd9JQotXGRlZlxee1xyZWFsYmFja3NsYXNoIF59JQotXGRlZlx+e1xyZWFsYmFja3NsYXNoIH59JQotXGRlZlw9e1xyZWFsYmFja3NsYXNoID19JQotXGRlZlxie1xyZWFsYmFja3NsYXNoIGJ9JQotXGRlZlxje1xyZWFsYmFja3NsYXNoIGN9JQotXGRlZlxke1xyZWFsYmFja3NsYXNoIGR9JQotXGRlZlx1e1xyZWFsYmFja3NsYXNoIHV9JQotXGRlZlx2e1xyZWFsYmFja3NsYXNoIHZ9JQotXGRlZlxIe1xyZWFsYmFja3NsYXNoIEh9JQotJSBUYWtlIGNhcmUgb2YgdGhlIHBsYWluIHRleCBzcGVjaWFsIEV1cm9wZWFuIG1vZGlmaWVkIGxldHRlcnMuCi1cZGVmXG9le1xyZWFsYmFja3NsYXNoIG9lfSUKLVxkZWZcYWV7XHJlYWxiYWNrc2xhc2ggYWV9JQotXGRlZlxhYXtccmVhbGJhY2tzbGFzaCBhYX0lCi1cZGVmXE9Fe1xyZWFsYmFja3NsYXNoIE9FfSUKLVxkZWZcQUV7XHJlYWxiYWNrc2xhc2ggQUV9JQotXGRlZlxBQXtccmVhbGJhY2tzbGFzaCBBQX0lCi1cZGVmXG97XHJlYWxiYWNrc2xhc2ggb30lCi1cZGVmXE97XHJlYWxiYWNrc2xhc2ggT30lCi1cZGVmXGx7XHJlYWxiYWNrc2xhc2ggbH0lCi1cZGVmXEx7XHJlYWxiYWNrc2xhc2ggTH0lCi1cZGVmXHNze1xyZWFsYmFja3NsYXNoIHNzfSUKLSUgVGFrZSBjYXJlIG9mIHRleGluZm8gY29tbWFuZHMgbGlrZWx5IHRvIGFwcGVhciBpbiBhbiBpbmRleCBlbnRyeS4KLSUgKE11c3QgYmUgYSB3YXkgdG8gYXZvaWQgZG9pbmcgZXhwYW5zaW9uIGF0IGFsbCwgYW5kIHRodXMgbm90IGhhdmUgdG8KLSUgbGFib3Jpb3VzbHkgbGlzdCBldmVyeSBzaW5nbGUgY29tbWFuZCBoZXJlLikKLVxkZWZcQHtAfSUgd2lsbCBiZSBAQCB3aGVuIHdlIHN3aXRjaCB0byBAIGFzIGVzY2FwZSBjaGFyLgotJVxsZXRceyA9IFxsYnJhY2VjbWQKLSVcbGV0XH0gPSBccmJyYWNlY21kCi1cZGVmXF97e1xyZWFsYmFja3NsYXNoIF99fSUKLVxkZWZcd3tccmVhbGJhY2tzbGFzaCB3IH0lCi1cZGVmXGJme1xyZWFsYmFja3NsYXNoIGJmIH0lCi0lXGRlZlxybXtccmVhbGJhY2tzbGFzaCBybSB9JQotXGRlZlxzbHtccmVhbGJhY2tzbGFzaCBzbCB9JQotXGRlZlxzZntccmVhbGJhY2tzbGFzaCBzZn0lCi1cZGVmXHR0e1xyZWFsYmFja3NsYXNoIHR0fSUKLVxkZWZcZ3Rye1xyZWFsYmFja3NsYXNoIGd0cn0lCi1cZGVmXGxlc3N7XHJlYWxiYWNrc2xhc2ggbGVzc30lCi1cZGVmXGhhdHtccmVhbGJhY2tzbGFzaCBoYXR9JQotXGRlZlxUZVh7XHJlYWxiYWNrc2xhc2ggVGVYfSUKLVxkZWZcZG90c3tccmVhbGJhY2tzbGFzaCBkb3RzIH0lCi1cZGVmXHJlc3VsdHtccmVhbGJhY2tzbGFzaCByZXN1bHR9JQotXGRlZlxlcXVpdntccmVhbGJhY2tzbGFzaCBlcXVpdn0lCi1cZGVmXGV4cGFuc2lvbntccmVhbGJhY2tzbGFzaCBleHBhbnNpb259JQotXGRlZlxwcmludHtccmVhbGJhY2tzbGFzaCBwcmludH0lCi1cZGVmXGVycm9ye1xyZWFsYmFja3NsYXNoIGVycm9yfSUKLVxkZWZccG9pbnR7XHJlYWxiYWNrc2xhc2ggcG9pbnR9JQotXGRlZlxjb3B5cmlnaHR7XHJlYWxiYWNrc2xhc2ggY29weXJpZ2h0fSUKLVxkZWZcdGNsb3NlIyMxe1xyZWFsYmFja3NsYXNoIHRjbG9zZSB7IyMxfX0lCi1cZGVmXGNvZGUjIzF7XHJlYWxiYWNrc2xhc2ggY29kZSB7IyMxfX0lCi1cZGVmXGRvdGxlc3MjIzF7XHJlYWxiYWNrc2xhc2ggZG90bGVzcyB7IyMxfX0lCi1cZGVmXHNhbXAjIzF7XHJlYWxiYWNrc2xhc2ggc2FtcCB7IyMxfX0lCi1cZGVmXCwjIzF7XHJlYWxiYWNrc2xhc2ggLHsjIzF9fSUKLVxkZWZcdCMjMXtccmVhbGJhY2tzbGFzaCB0IHsjIzF9fSUKLVxkZWZcciMjMXtccmVhbGJhY2tzbGFzaCByIHsjIzF9fSUKLVxkZWZcaSMjMXtccmVhbGJhY2tzbGFzaCBpIHsjIzF9fSUKLVxkZWZcYiMjMXtccmVhbGJhY2tzbGFzaCBiIHsjIzF9fSUKLVxkZWZcc2MjIzF7XHJlYWxiYWNrc2xhc2ggc2MgeyMjMX19JQotXGRlZlxjaXRlIyMxe1xyZWFsYmFja3NsYXNoIGNpdGUgeyMjMX19JQotXGRlZlxrZXkjIzF7XHJlYWxiYWNrc2xhc2gga2V5IHsjIzF9fSUKLVxkZWZcZmlsZSMjMXtccmVhbGJhY2tzbGFzaCBmaWxlIHsjIzF9fSUKLVxkZWZcdmFyIyMxe1xyZWFsYmFja3NsYXNoIHZhciB7IyMxfX0lCi1cZGVmXGtiZCMjMXtccmVhbGJhY2tzbGFzaCBrYmQgeyMjMX19JQotXGRlZlxkZm4jIzF7XHJlYWxiYWNrc2xhc2ggZGZuIHsjIzF9fSUKLVxkZWZcZW1waCMjMXtccmVhbGJhY2tzbGFzaCBlbXBoIHsjIzF9fSUKLSUKLSUgSGFuZGxlIHNvbWUgY2FzZXMgb2YgQHZhbHVlIC0tIHdoZXJlIHRoZSB2YXJpYWJsZSBuYW1lIGRvZXMgbm90Ci0lIGNvbnRhaW4gLSBvciBfLCBhbmQgdGhlIHZhbHVlIGRvZXMgbm90IGNvbnRhaW4gYW55Ci0lIChub24tZnVsbHktZXhwYW5kYWJsZSkgY29tbWFuZHMuCi1cbGV0XHZhbHVlID0gXGV4cGFuZGFibGV2YWx1ZQotJQotXHVuc2Vwc3BhY2VzCi19Ci0KLSUgSWYgYW4gaW5kZXggY29tbWFuZCBpcyB1c2VkIGluIGFuIEBleGFtcGxlIGVudmlyb25tZW50LCBhbnkgc3BhY2VzCi0lIHRoZXJlaW4gc2hvdWxkIGJlY29tZSByZWd1bGFyIHNwYWNlcyBpbiB0aGUgcmF3IGluZGV4IGZpbGUsIG5vdCB0aGUKLSUgZXhwYW5zaW9uIG9mIFx0aWUgKFxcbGVhdmV2bW9kZSBccGVuYWx0eSBcQE0gXCApLgote1xvYmV5c3BhY2VzCi0gXGdkZWZcdW5zZXBzcGFjZXN7XG9iZXlzcGFjZXNcbGV0ID1cc3BhY2V9fQotCi0lIFxpbmRleG5vZm9udHMgbm8tb3BzIGFsbCBmb250LWNoYW5nZSBjb21tYW5kcy4KLSUgVGhpcyBpcyB1c2VkIHdoZW4gb3V0cHV0dGluZyB0aGUgc3RyaW5ncyB0byBzb3J0IHRoZSBpbmRleCBieS4KLVxkZWZcaW5kZXhkdW1teWZvbnQjMXsjMX0KLVxkZWZcaW5kZXhkdW1teXRleHtUZVh9Ci1cZGVmXGluZGV4ZHVtbXlkb3Rzey4uLn0KLQotXGRlZlxpbmRleG5vZm9udHN7JQotJSBKdXN0IGlnbm9yZSBhY2NlbnRzLgotXGxldFwsPVxpbmRleGR1bW15Zm9udAotXGxldFwiPVxpbmRleGR1bW15Zm9udAotXGxldFxgPVxpbmRleGR1bW15Zm9udAotXGxldFwnPVxpbmRleGR1bW15Zm9udAotXGxldFxePVxpbmRleGR1bW15Zm9udAotXGxldFx+PVxpbmRleGR1bW15Zm9udAotXGxldFw9PVxpbmRleGR1bW15Zm9udAotXGxldFxiPVxpbmRleGR1bW15Zm9udAotXGxldFxjPVxpbmRleGR1bW15Zm9udAotXGxldFxkPVxpbmRleGR1bW15Zm9udAotXGxldFx1PVxpbmRleGR1bW15Zm9udAotXGxldFx2PVxpbmRleGR1bW15Zm9udAotXGxldFxIPVxpbmRleGR1bW15Zm9udAotXGxldFxkb3RsZXNzPVxpbmRleGR1bW15Zm9udAotJSBUYWtlIGNhcmUgb2YgdGhlIHBsYWluIHRleCBzcGVjaWFsIEV1cm9wZWFuIG1vZGlmaWVkIGxldHRlcnMuCi1cZGVmXG9le29lfSUKLVxkZWZcYWV7YWV9JQotXGRlZlxhYXthYX0lCi1cZGVmXE9Fe09FfSUKLVxkZWZcQUV7QUV9JQotXGRlZlxBQXtBQX0lCi1cZGVmXG97b30lCi1cZGVmXE97T30lCi1cZGVmXGx7bH0lCi1cZGVmXEx7TH0lCi1cZGVmXHNze3NzfSUKLVxsZXRcdz1caW5kZXhkdW1teWZvbnQKLVxsZXRcdD1caW5kZXhkdW1teWZvbnQKLVxsZXRccj1caW5kZXhkdW1teWZvbnQKLVxsZXRcaT1caW5kZXhkdW1teWZvbnQKLVxsZXRcYj1caW5kZXhkdW1teWZvbnQKLVxsZXRcZW1waD1caW5kZXhkdW1teWZvbnQKLVxsZXRcc3Ryb25nPVxpbmRleGR1bW15Zm9udAotXGxldFxjaXRlPVxpbmRleGR1bW15Zm9udAotXGxldFxzYz1caW5kZXhkdW1teWZvbnQKLSVEb24ndCBuby1vcCBcdHQsIHNpbmNlIGl0IGlzbid0IGEgdXNlci1sZXZlbCBjb21tYW5kCi0lIGFuZCBpcyB1c2VkIGluIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYWN0aXZlIGNoYXJzIGxpa2UgPCwgPiwgfC4uLgotJVxsZXRcdHQ9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHRjbG9zZT1caW5kZXhkdW1teWZvbnQKLVxsZXRcY29kZT1caW5kZXhkdW1teWZvbnQKLVxsZXRcZmlsZT1caW5kZXhkdW1teWZvbnQKLVxsZXRcc2FtcD1caW5kZXhkdW1teWZvbnQKLVxsZXRca2JkPVxpbmRleGR1bW15Zm9udAotXGxldFxrZXk9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHZhcj1caW5kZXhkdW1teWZvbnQKLVxsZXRcVGVYPVxpbmRleGR1bW15dGV4Ci1cbGV0XGRvdHM9XGluZGV4ZHVtbXlkb3RzCi1cZGVmXEB7QH0lCi19Ci0KLSUgVG8gZGVmaW5lIFxyZWFsYmFja3NsYXNoLCB3ZSBtdXN0IG1ha2UgXCBub3QgYmUgYW4gZXNjYXBlLgotJSBXZSBtdXN0IGZpcnN0IG1ha2UgYW5vdGhlciBjaGFyYWN0ZXIgKEApIGFuIGVzY2FwZQotJSBzbyB3ZSBkbyBub3QgYmVjb21lIHVuYWJsZSB0byBkbyBhIGRlZmluaXRpb24uCi0KLXtcY2F0Y29kZWBcQD0wIFxjYXRjb2RlYFxcPVxvdGhlcgotIEBnZGVmQHJlYWxiYWNrc2xhc2h7XH19Ci0KLVxsZXRcaW5kZXhiYWNrc2xhc2g9MCAgJW92ZXJyaWRkZW4gZHVyaW5nIFxwcmludGluZGV4LgotXGxldFxTRVRtYXJnaW5pbmRleD1ccmVsYXggJSBwdXQgaW5kZXggZW50cmllcyBpbiBtYXJnaW4gKHVuZG9jdW1lbnRlZCk/Ci0KLSUgRm9yIFxpZnggY29tcGFyaXNvbnMuCi1cZGVmXGVtcHR5bWFjcm97XGVtcHR5fQotCi0lIE1vc3QgaW5kZXggZW50cmllcyBnbyB0aHJvdWdoIGhlcmUsIGJ1dCBcZG9zdWJpbmQgaXMgdGhlIGdlbmVyYWwgY2FzZS4KLSUgCi1cZGVmXGRvaW5kIzEjMntcZG9zdWJpbmR7IzF9eyMyfVxlbXB0eX0KLQotJSBXb3JraG9yc2UgZm9yIGFsbCBcZm9vaW5kZXhlcy4KLSUgIzEgaXMgbmFtZSBvZiBpbmRleCwgIzIgaXMgc3R1ZmYgdG8gcHV0IHRoZXJlLCAjMyBpcyBzdWJlbnRyeSAtLQotJSBcZW1wdHkgaWYgY2FsbGVkIGZyb20gXGRvaW5kLCBhcyB3ZSB1c3VhbGx5IGFyZS4gIFRoZSBtYWluIGV4Y2VwdGlvbgotJSBpcyB3aXRoIGRlZnVucywgd2hpY2ggY2FsbCB1cyBkaXJlY3RseS4KLSUgCi1cZGVmXGRvc3ViaW5kIzEjMiMzeyUKLSAgJSBQdXQgdGhlIGluZGV4IGVudHJ5IGluIHRoZSBtYXJnaW4gaWYgZGVzaXJlZC4KLSAgXGlmeFxTRVRtYXJnaW5pbmRleFxyZWxheFxlbHNlCi0gICAgXGluc2VydFxtYXJnaW57XGhib3h7XHZydWxlIGhlaWdodDhwdCBkZXB0aDNwdCB3aWR0aDBwdCAjMn19JQotICBcZmkKLSAgeyUKLSAgICBcY291bnQyNTU9XGxhc3RwZW5hbHR5Ci0gICAgeyUKLSAgICAgIFxpbmRleGR1bW1pZXMgJSBNdXN0IGRvIHRoaXMgaGVyZSwgc2luY2UgXGJmLCBldGMgZXhwYW5kIGF0IHRoaXMgc3RhZ2UKLSAgICAgIFxlc2NhcGVjaGFyPWBcXAotICAgICAgeyUKLSAgICAgICAgXGxldFxmb2xpbyA9IDAlIFdlIHdpbGwgZXhwYW5kIGFsbCBtYWNyb3Mgbm93IEVYQ0VQVCBcZm9saW8uCi0gICAgICAgIFxkZWZccmF3YmFja3NsYXNoeHh7XGluZGV4YmFja3NsYXNofSUgXGluZGV4YmFja3NsYXNoIGlzbid0IGRlZmluZWQgbm93Ci0gICAgICAgICUgc28gaXQgd2lsbCBiZSBvdXRwdXQgYXMgaXM7IGFuZCBpdCB3aWxsIHByaW50IGFzIGJhY2tzbGFzaC4KLSAgICAgICAgJQotICAgICAgICBcZGVmXHRoaXJkYXJneyMzfSUKLSAgICAgICAgJQotICAgICAgICAlIElmIHRoaXJkIGFyZyBpcyBwcmVzZW50LCBwcmVjZWRlIGl0IHdpdGggc3BhY2UgaW4gc29ydCBrZXkuCi0gICAgICAgIFxpZnhcdGhpcmRhcmdcZW1wdHltYWNybwotICAgICAgICAgIFxsZXRcc3ViZW50cnkgPSBcZW1wdHkKLSAgICAgICAgXGVsc2UKLSAgICAgICAgICBcZGVmXHN1YmVudHJ5eyAjM30lCi0gICAgICAgIFxmaQotICAgICAgICAlCi0gICAgICAgICUgRmlyc3QgcHJvY2VzcyB0aGUgaW5kZXgtc3RyaW5nIHdpdGggYWxsIGZvbnQgY29tbWFuZHMgdHVybmVkIG9mZgotICAgICAgICAlIHRvIGdldCB0aGUgc3RyaW5nIHRvIHNvcnQgYnkuCi0gICAgICAgIHtcaW5kZXhub2ZvbnRzIFx4ZGVmXGluZGV4c29ydHRtcHsjMlxzdWJlbnRyeX19JQotICAgICAgICAlCi0gICAgICAgICUgTm93IHByb2R1Y2UgdGhlIGNvbXBsZXRlIGluZGV4IGVudHJ5LCB3aXRoIGJvdGggdGhlIHNvcnQga2V5IGFuZCB0aGUKLSAgICAgICAgJSBvcmlnaW5hbCB0ZXh0LCBpbmNsdWRpbmcgYW55IGZvbnQgY29tbWFuZHMuCi0gICAgICAgIFx0b2tzMCA9IHsjMn0lCi0gICAgICAgIFxlZGVmXHRlbXB7JQotICAgICAgICAgIFx3cml0ZVxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1leyUKLSAgICAgICAgICAgIFxyZWFsYmFja3NsYXNoIGVudHJ5e1xpbmRleHNvcnR0bXB9e1xmb2xpb317XHRoZVx0b2tzMH19JQotICAgICAgICB9JQotICAgICAgICAlCi0gICAgICAgICUgSWYgdGhpcmQgKHN1YmVudHJ5KSBhcmcgaXMgcHJlc2VudCwgYWRkIGl0IHRvIHRoZSBpbmRleCBzdHJpbmcuCi0gICAgICAgIFxpZnhcdGhpcmRhcmdcZW1wdHltYWNybyBcZWxzZQotICAgICAgICAgIFx0b2tzMCA9IHsjM30lCi0gICAgICAgICAgXGVkZWZcdGVtcHtcdGVtcHtcdGhlXHRva3MwfX0lCi0gICAgICAgIFxmaQotICAgICAgICAlCi0gICAgICAgICUgSWYgYSBza2lwIGlzIHRoZSBsYXN0IHRoaW5nIG9uIHRoZSBsaXN0IG5vdywgcHJlc2VydmUgaXQKLSAgICAgICAgJSBieSBiYWNraW5nIHVwIGJ5IFxsYXN0c2tpcCwgZG9pbmcgdGhlIFx3cml0ZSwgdGhlbiBpbnNlcnRpbmcKLSAgICAgICAgJSB0aGUgc2tpcCBhZ2Fpbi4gIE90aGVyd2lzZSwgdGhlIHdoYXRzaXQgZ2VuZXJhdGVkIGJ5IHRoZQotICAgICAgICAlIFx3cml0ZSB3aWxsIG1ha2UgXGxhc3Rza2lwIHplcm8uICBUaGUgcmVzdWx0IGlzIHRoYXQgc2VxdWVuY2VzCi0gICAgICAgICUgbGlrZSB0aGlzOgotICAgICAgICAlIEBlbmQgZGVmdW4KLSAgICAgICAgJSBAdGluZGV4IHdoYXRldmVyCi0gICAgICAgICUgQGRlZnVuIC4uLgotICAgICAgICAlIHdpbGwgaGF2ZSBleHRyYSBzcGFjZSBpbnNlcnRlZCwgYmVjYXVzZSB0aGUgXG1lZGJyZWFrIGluIHRoZQotICAgICAgICAlIHN0YXJ0IG9mIHRoZSBAZGVmdW4gd29uJ3Qgc2VlIHRoZSBza2lwIGluc2VydGVkIGJ5IHRoZSBAZW5kIG9mCi0gICAgICAgICUgdGhlIHByZXZpb3VzIGRlZnVuLgotICAgICAgICAlIAotICAgICAgICAlIEJ1dCBkb24ndCBkbyBhbnkgb2YgdGhpcyBpZiB3ZSdyZSBub3QgaW4gdmVydGljYWwgbW9kZS4gIFdlCi0gICAgICAgICUgZG9uJ3Qgd2FudCB0byBkbyBhIFx2c2tpcCBhbmQgcHJlbWF0dXJlbHkgZW5kIGEgcGFyYWdyYXBoLgotICAgICAgICAlIAotICAgICAgICAlIEF2b2lkIHBhZ2UgYnJlYWtzIGR1ZSB0byB0aGVzZSBleHRyYSBza2lwcywgdG9vLgotICAgICAgICAlIAotICAgICAgICBcaWZsaW5rcwotICAgICAgICAgIFxpZnZtb2RlCi0gICAgICAgICAgICBcc2tpcDAgPSBcbGFzdHNraXAKLSAgICAgICAgICAgIFxpZmRpbVxsYXN0c2tpcCA9IDBwdCBcZWxzZSBcbm9icmVha1x2c2tpcC1cbGFzdHNraXAgXGZpCi0gICAgICAgICAgXGZpCi0gICAgICAgICAgJQotICAgICAgICAgIFx0ZW1wICUgZG8gdGhlIHdyaXRlCi0gICAgICAgICAgJQotICAgICAgICAgICUgCi0gICAgICAgICAgXGlmdm1vZGUgXGlmZGltXHNraXAwID0gMHB0IFxlbHNlIFxub2JyZWFrXHZza2lwXHNraXAwIFxmaSBcZmkKLSAgICAgICAgXGZpCi0gICAgICB9JQotICAgIH0lCi0gICAgXHBlbmFsdHlcY291bnQyNTUKLSAgfSUKLX0KLQotJSBUaGUgaW5kZXggZW50cnkgd3JpdHRlbiBpbiB0aGUgZmlsZSBhY3R1YWxseSBsb29rcyBsaWtlCi0lICBcZW50cnkge3NvcnRzdHJpbmd9e3BhZ2V9e3RvcGljfQotJSBvcgotJSAgXGVudHJ5IHtzb3J0c3RyaW5nfXtwYWdlfXt0b3BpY317c3VidG9waWN9Ci0lIFRoZSB0ZXhpbmRleCBwcm9ncmFtIHJlYWRzIGluIHRoZXNlIGZpbGVzIGFuZCB3cml0ZXMgZmlsZXMKLSUgY29udGFpbmluZyB0aGVzZSBraW5kcyBvZiBsaW5lczoKLSUgIFxpbml0aWFsIHtjfQotJSAgICAgYmVmb3JlIHRoZSBmaXJzdCB0b3BpYyB3aG9zZSBpbml0aWFsIGlzIGMKLSUgIFxlbnRyeSB7dG9waWN9e3BhZ2VsaXN0fQotJSAgICAgZm9yIGEgdG9waWMgdGhhdCBpcyB1c2VkIHdpdGhvdXQgc3VidG9waWNzCi0lICBccHJpbWFyeSB7dG9waWN9Ci0lICAgICBmb3IgdGhlIGJlZ2lubmluZyBvZiBhIHRvcGljIHRoYXQgaXMgdXNlZCB3aXRoIHN1YnRvcGljcwotJSAgXHNlY29uZGFyeSB7c3VidG9waWN9e3BhZ2VsaXN0fQotJSAgICAgZm9yIGVhY2ggc3VidG9waWMuCi0KLSUgRGVmaW5lIHRoZSB1c2VyLWFjY2Vzc2libGUgaW5kZXhpbmcgY29tbWFuZHMKLSUgQGZpbmRleCwgQHZpbmRleCwgQGtpbmRleCwgQGNpbmRleC4KLQotXGRlZlxmaW5kZXgge1xmbmluZGV4fQotXGRlZlxraW5kZXgge1xreWluZGV4fQotXGRlZlxjaW5kZXgge1xjcGluZGV4fQotXGRlZlx2aW5kZXgge1x2cmluZGV4fQotXGRlZlx0aW5kZXgge1x0cGluZGV4fQotXGRlZlxwaW5kZXgge1xwZ2luZGV4fQotCi1cZGVmXGNpbmRleHN1YiB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGNpbmRleHN1Yn0KLXtcb2JleWxpbmVzICUKLVxnZGVmXGNpbmRleHN1YiAiIzEiICMyXl5Ne1xlbmRncm91cCAlCi1cZG9zdWJpbmR7Y3B9eyMyfXsjMX19fQotCi0lIERlZmluZSB0aGUgbWFjcm9zIHVzZWQgaW4gZm9ybWF0dGluZyBvdXRwdXQgb2YgdGhlIHNvcnRlZCBpbmRleCBtYXRlcmlhbC4KLQotJSBAcHJpbnRpbmRleCBjYXVzZXMgYSBwYXJ0aWN1bGFyIGluZGV4ICh0aGUgPz9zIGZpbGUpIHRvIGdldCBwcmludGVkLgotJSBJdCBkb2VzIG5vdCBwcmludCBhbnkgY2hhcHRlciBoZWFkaW5nICh1c3VhbGx5IGFuIEB1bm51bWJlcmVkKS4KLSUKLVxkZWZccHJpbnRpbmRleHtccGFyc2VhcmdcZG9wcmludGluZGV4fQotXGRlZlxkb3ByaW50aW5kZXgjMXtcYmVnaW5ncm91cAotICBcZG9icmVhayBcY2hhcGhlYWRpbmdza2lwezEwMDAwfSUKLSAgJQotICBcaW5kZXhmb250cyBccm0KLSAgXHRvbGVyYW5jZSA9IDk1MDAKLSAgXGluZGV4YnJlYWtzCi0gICUKLSAgJSBTZWUgaWYgdGhlIGluZGV4IGZpbGUgZXhpc3RzIGFuZCBpcyBub25lbXB0eS4KLSAgJSBDaGFuZ2UgY2F0Y29kZSBvZiBAIGhlcmUgc28gdGhhdCBpZiB0aGUgaW5kZXggZmlsZSBjb250YWlucwotICAlIFxpbml0aWFsIHtAfQotICAlIGFzIGl0cyBmaXJzdCBsaW5lLCBUZVggZG9lc24ndCBjb21wbGFpbiBhYm91dCBtaXNtYXRjaGVkIGJyYWNlcwotICAlIChiZWNhdXNlIGl0IHRoaW5rcyBAfSBpcyBhIGNvbnRyb2wgc2VxdWVuY2UpLgotICBcY2F0Y29kZWBcQCA9IDExCi0gIFxvcGVuaW4gMSBcam9ibmFtZS4jMXMKLSAgXGlmZW9mIDEKLSAgICAlIFxlbmRkb3VibGVjb2x1bW5zIGdldHMgY29uZnVzZWQgaWYgdGhlcmUgaXMgbm8gdGV4dCBpbiB0aGUgaW5kZXgsCi0gICAgJSBhbmQgaXQgbG9zZXMgdGhlIGNoYXB0ZXIgdGl0bGUgYW5kIHRoZSBhdXggZmlsZSBlbnRyaWVzIGZvciB0aGUKLSAgICAlIGluZGV4LiAgVGhlIGVhc2llc3Qgd2F5IHRvIHByZXZlbnQgdGhpcyBwcm9ibGVtIGlzIHRvIG1ha2Ugc3VyZQotICAgICUgdGhlcmUgaXMgc29tZSB0ZXh0LgotICAgIChJbmRleCBpcyBub25leGlzdGVudCkKLSAgXGVsc2UKLSAgICAlCi0gICAgJSBJZiB0aGUgaW5kZXggZmlsZSBleGlzdHMgYnV0IGlzIGVtcHR5LCB0aGVuIFxvcGVuaW4gbGVhdmVzIFxpZmVvZgotICAgICUgZmFsc2UuICBXZSBoYXZlIHRvIG1ha2UgVGVYIHRyeSB0byByZWFkIHNvbWV0aGluZyBmcm9tIHRoZSBmaWxlLCBzbwotICAgICUgaXQgY2FuIGRpc2NvdmVyIGlmIHRoZXJlIGlzIGFueXRoaW5nIGluIGl0LgotICAgIFxyZWFkIDEgdG8gXHRlbXAKLSAgICBcaWZlb2YgMQotICAgICAgKEluZGV4IGlzIGVtcHR5KQotICAgIFxlbHNlCi0gICAgICAlIEluZGV4IGZpbGVzIGFyZSBhbG1vc3QgVGV4aW5mbyBzb3VyY2UsIGJ1dCB3ZSB1c2UgXCBhcyB0aGUgZXNjYXBlCi0gICAgICAlIGNoYXJhY3Rlci4gIEl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgQCwgYnV0IHRoYXQncyB0b28gYmlnIGEgY2hhbmdlCi0gICAgICAlIHRvIG1ha2UgcmlnaHQgbm93LgotICAgICAgXGRlZlxpbmRleGJhY2tzbGFzaHtccmF3YmFja3NsYXNoeHh9JQotICAgICAgXGNhdGNvZGVgXFwgPSAwCi0gICAgICBcZXNjYXBlY2hhciA9IGBcXAotICAgICAgXGJlZ2luZG91YmxlY29sdW1ucwotICAgICAgXGlucHV0IFxqb2JuYW1lLiMxcwotICAgICAgXGVuZGRvdWJsZWNvbHVtbnMKLSAgICBcZmkKLSAgXGZpCi0gIFxjbG9zZWluIDEKLVxlbmRncm91cH0KLQotJSBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgYnkgdGhlIHNvcnRlZCBpbmRleCBmaWxlIGl0c2VsZi4KLSUgQ2hhbmdlIHRoZW0gdG8gY29udHJvbCB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5kZXguCi0KLVxkZWZcaW5pdGlhbCMxe3slCi0gICUgU29tZSBtaW5vciBmb250IGNoYW5nZXMgZm9yIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMuCi0gIFxsZXRcdGVudHQ9XHNlY3R0IFxsZXRcdHQ9XHNlY3R0IFxsZXRcc2Y9XHNlY3R0Ci0gICUKLSAgJSBSZW1vdmUgYW55IGdsdWUgd2UgbWF5IGhhdmUsIHdlJ2xsIGJlIGluc2VydGluZyBvdXIgb3duLgotICBccmVtb3ZlbGFzdHNraXAKLSAgJSAKLSAgJSBXZSBsaWtlIGJyZWFrcyBiZWZvcmUgdGhlIGluZGV4IGluaXRpYWxzLCBzbyBpbnNlcnQgYSBib251cy4KLSAgXHBlbmFsdHkgLTMwMAotICAlCi0gICUgVHlwZXNldCB0aGUgaW5pdGlhbC4gIE1ha2luZyB0aGlzIGFkZCB1cCB0byBhIHdob2xlIG51bWJlciBvZgotICAlIGJhc2VsaW5lc2tpcHMgaW5jcmVhc2VzIHRoZSBjaGFuY2Ugb2YgdGhlIGRvdHMgbGluaW5nIHVwIGZyb20gY29sdW1uCi0gICUgdG8gY29sdW1uLiAgSXQgc3RpbGwgd29uJ3Qgb2Z0ZW4gYmUgcGVyZmVjdCwgYmVjYXVzZSBvZiB0aGUgc3RyZXRjaAotICAlIHdlIG5lZWQgYmVmb3JlIGVhY2ggZW50cnksIGJ1dCBpdCdzIGJldHRlci4KLSAgJSAKLSAgJSBObyBzaHJpbmsgYmVjYXVzZSBpdCBjb25mdXNlcyBcYmFsYW5jZWNvbHVtbnMuCi0gIFx2c2tpcCAxLjY3XGJhc2VsaW5lc2tpcCBwbHVzIC41XGJhc2VsaW5lc2tpcAotICBcbGVmdGxpbmV7XHNlY2JmICMxfSUKLSAgXHZza2lwIC4zM1xiYXNlbGluZXNraXAgcGx1cyAuMVxiYXNlbGluZXNraXAKLSAgJQotICAlIERvIG91ciBiZXN0IG5vdCB0byBicmVhayBhZnRlciB0aGUgaW5pdGlhbC4KLSAgXG5vYnJlYWsKLX19Ci0KLSUgVGhpcyB0eXBlc2V0cyBhIHBhcmFncmFwaCBjb25zaXN0aW5nIG9mICMxLCBkb3QgbGVhZGVycywgYW5kIHRoZW4gIzIKLSUgZmx1c2ggdG8gdGhlIHJpZ2h0IG1hcmdpbi4gIEl0IGlzIHVzZWQgZm9yIGluZGV4IGFuZCB0YWJsZSBvZiBjb250ZW50cwotJSBlbnRyaWVzLiAgVGhlIHBhcmFncmFwaCBpcyBpbmRlbnRlZCBieSBcbGVmdHNraXAuCi0lCi1cZGVmXGVudHJ5IzEjMntcYmVnaW5ncm91cAotICAlCi0gICUgU3RhcnQgYSBuZXcgcGFyYWdyYXBoIGlmIG5lY2Vzc2FyeSwgc28gb3VyIGFzc2lnbm1lbnRzIGJlbG93IGNhbid0Ci0gICUgYWZmZWN0IHByZXZpb3VzIHRleHQuCi0gIFxwYXIKLSAgJQotICAlIERvIG5vdCBmaWxsIG91dCB0aGUgbGFzdCBsaW5lIHdpdGggd2hpdGUgc3BhY2UuCi0gIFxwYXJmaWxsc2tpcCA9IDBpbgotICAlCi0gICUgTm8gZXh0cmEgc3BhY2UgYWJvdmUgdGhpcyBwYXJhZ3JhcGguCi0gIFxwYXJza2lwID0gMGluCi0gICUKLSAgJSBEbyBub3QgcHJlZmVyIGEgc2VwYXJhdGUgbGluZSBlbmRpbmcgd2l0aCBhIGh5cGhlbiB0byBmZXdlciBsaW5lcy4KLSAgXGZpbmFsaHlwaGVuZGVtZXJpdHMgPSAwCi0gICUKLSAgJSBcaGFuZ2luZGVudCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdGhlIGVudHJ5IHRleHQgYW5kIHBhZ2UgbnVtYmVyCi0gICUgZG9uJ3QgYm90aCBmaXQgb24gb25lIGxpbmUuICBJbiB0aGF0IGNhc2UsIGJvYiBzdWdnZXN0cyBzdGFydGluZyB0aGUKLSAgJSBkb3RzIHByZXR0eSBmYXIgb3ZlciBvbiB0aGUgbGluZS4gIFVuZm9ydHVuYXRlbHksIGEgbGFyZ2UKLSAgJSBpbmRlbnRhdGlvbiBsb29rcyB3cm9uZyB3aGVuIHRoZSBlbnRyeSB0ZXh0IGl0c2VsZiBpcyBicm9rZW4gYWNyb3NzCi0gICUgbGluZXMuICBTbyB3ZSB1c2UgYSBzbWFsbCBpbmRlbnRhdGlvbiBhbmQgcHV0IHVwIHdpdGggbG9uZyBsZWFkZXJzLgotICAlCi0gICUgXGhhbmdhZnRlciBpcyByZXNldCB0byAxICh3aGljaCBpcyB0aGUgdmFsdWUgd2Ugd2FudCkgYXQgdGhlIHN0YXJ0Ci0gICUgb2YgZWFjaCBwYXJhZ3JhcGgsIHNvIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIHdpdGggdGhhdC4KLSAgXGhhbmdpbmRlbnQgPSAyZW0KLSAgJQotICAlIFdoZW4gdGhlIGVudHJ5IHRleHQgbmVlZHMgdG8gYmUgYnJva2VuLCBqdXN0IGZpbGwgb3V0IHRoZSBmaXJzdCBsaW5lCi0gICUgd2l0aCBibGFuayBzcGFjZS4KLSAgXHJpZ2h0c2tpcCA9IDBwdCBwbHVzMWZpbAotICAlCi0gICUgQSBiaXQgb2Ygc3RyZXRjaCBiZWZvcmUgZWFjaCBlbnRyeSBmb3IgdGhlIGJlbmVmaXQgb2YgYmFsYW5jaW5nIGNvbHVtbnMuCi0gIFx2c2tpcCAwcHQgcGx1czFwdAotICAlCi0gICUgU3RhcnQgYSBgYHBhcmFncmFwaCcnIGZvciB0aGUgaW5kZXggZW50cnkgc28gdGhlIGxpbmUgYnJlYWtpbmcKLSAgJSBwYXJhbWV0ZXJzIHdlJ3ZlIHNldCBhYm92ZSB3aWxsIGhhdmUgYW4gZWZmZWN0LgotICBcbm9pbmRlbnQKLSAgJQotICAlIEluc2VydCB0aGUgdGV4dCBvZiB0aGUgaW5kZXggZW50cnkuICBUZVggd2lsbCBkbyBsaW5lLWJyZWFraW5nIG9uIGl0LgotICAjMSUKLSAgJSBUaGUgZm9sbG93aW5nIGlzIGtsdWRnZWQgdG8gbm90IG91dHB1dCBhIGxpbmUgb2YgZG90cyBpbiB0aGUgaW5kZXggaWYKLSAgJSB0aGVyZSBhcmUgbm8gcGFnZSBudW1iZXJzLiAgVGhlIG5leHQgcGVyc29uIHdobyBicmVha3MgdGhpcyB3aWxsIGJlCi0gICUgY3Vyc2VkIGJ5IGEgVW5peCBkYWVtb24uCi0gIFxkZWZcdGVtcGF7e1xybSB9fSUKLSAgXGRlZlx0ZW1wYnsjMn0lCi0gIFxlZGVmXHRlbXBje1x0ZW1wYX0lCi0gIFxlZGVmXHRlbXBke1x0ZW1wYn0lCi0gIFxpZnhcdGVtcGNcdGVtcGRcIFxlbHNlJQotICAgICUKLSAgICAlIElmIHdlIG11c3QsIHB1dCB0aGUgcGFnZSBudW1iZXIgb24gYSBsaW5lIG9mIGl0cyBvd24sIGFuZCBmaWxsIG91dAotICAgICUgdGhpcyBsaW5lIHdpdGggYmxhbmsgc3BhY2UuICAoVGhlIFxoZmlsIGlzIG92ZXJ3aGVsbWVkIHdpdGggdGhlCi0gICAgJSBmaWxsIGxlYWRlcnMgZ2x1ZSBpbiBcaW5kZXhkb3RmaWxsIGlmIHRoZSBwYWdlIG51bWJlciBkb2VzIGZpdC4pCi0gICAgXGhmaWxccGVuYWx0eTUwCi0gICAgXG51bGxcbm9icmVha1xpbmRleGRvdGZpbGwgJSBIYXZlIGxlYWRlcnMgYmVmb3JlIHRoZSBwYWdlIG51bWJlci4KLSAgICAlCi0gICAgJSBUaGUgYFwgJyBoZXJlIGlzIHJlbW92ZWQgYnkgdGhlIGltcGxpY2l0IFx1bnNraXAgdGhhdCBUZVggZG9lcyBhcwotICAgICUgcGFydCBvZiAodGhlIHByaW1pdGl2ZSkgXHBhci4gIFdpdGhvdXQgaXQsIGEgc3B1cmlvdXMgdW5kZXJmdWxsCi0gICAgJSBcaGJveCBlbnN1ZXMuCi0gICAgXCAjMiUgVGhlIHBhZ2UgbnVtYmVyIGVuZHMgdGhlIHBhcmFncmFwaC4KLSAgXGZpJQotICBccGFyCi1cZW5kZ3JvdXB9Ci0KLSUgTGlrZSBcZG90ZmlsbCBleGNlcHQgdGFrZXMgYXQgbGVhc3QgMSBlbS4KLVxkZWZcaW5kZXhkb3RmaWxse1xjbGVhZGVycwotICBcaGJveHskXG1hdGhzdXJyb3VuZD0wcHQgXG1rZXJuMS41bXUgJHtcaXQgLn0kIFxta2VybjEuNW11JH1caHNraXAgMWVtIHBsdXMgMWZpbGx9Ci0KLVxkZWZccHJpbWFyeSAjMXtcbGluZXsjMVxoZmlsfX0KLQotXG5ld3NraXBcc2Vjb25kYXJ5aW5kZW50IFxzZWNvbmRhcnlpbmRlbnQ9MC41Y20KLQotXGRlZlxzZWNvbmRhcnkgIzEjMnsKLXtccGFyZmlsbHNraXA9MGluIFxwYXJza2lwPTBpbgotXGhhbmdpbmRlbnQgPTFpbiBcaGFuZ2FmdGVyPTEKLVxub2luZGVudFxoc2tpcFxzZWNvbmRhcnlpbmRlbnRcaGJveHsjMX1caW5kZXhkb3RmaWxsICMyXHBhcgotfX0KLQotJSBEZWZpbmUgdHdvLWNvbHVtbiBtb2RlLCB3aGljaCB3ZSB1c2UgdG8gdHlwZXNldCBpbmRleGVzLgotJSBBZGFwdGVkIGZyb20gdGhlIFRlWGJvb2ssIHBhZ2UgNDE2LCB3aGljaCBpcyB0byBzYXksCi0lIHRoZSBtYW5tYWMudGV4IGZvcm1hdCB1c2VkIHRvIHByaW50IHRoZSBUZVhib29rIGl0c2VsZi4KLVxjYXRjb2RlYFxAPTExCi0KLVxuZXdib3hccGFydGlhbHBhZ2UKLVxuZXdkaW1lblxkb3VibGVjb2x1bW5oc2l6ZQotCi1cZGVmXGJlZ2luZG91YmxlY29sdW1uc3tcYmVnaW5ncm91cCAlIGVuZGVkIGJ5IFxlbmRkb3VibGVjb2x1bW5zCi0gICUgR3JhYiBhbnkgc2luZ2xlLWNvbHVtbiBtYXRlcmlhbCBhYm92ZSB1cy4KLSAgXG91dHB1dCA9IHtcZ2xvYmFsXHNldGJveFxwYXJ0aWFscGFnZSA9IFx2Ym94eyUKLSAgICAlIAotICAgICUgSGVyZSBpcyBhIHBvc3NpYmlsaXR5IG5vdCBmb3Jlc2VlbiBpbiBtYW5tYWM6IGlmIHdlIGFjY3VtdWxhdGUgYQotICAgICUgd2hvbGUgbG90IG9mIG1hdGVyaWFsLCB3ZSBtaWdodCBlbmQgdXAgY2FsbGluZyB0aGlzIFxvdXRwdXQKLSAgICAlIHJvdXRpbmUgdHdpY2UgaW4gYSByb3cgKHNlZSB0aGUgZG91YmxlY29sLWxvc2UgdGVzdCwgd2hpY2ggaXMKLSAgICAlIGVzc2VudGlhbGx5IGEgY291cGxlIG9mIGluZGV4ZXMgd2l0aCBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmKS4gIEluCi0gICAgJSB0aGF0IGNhc2UsIHdlIG11c3QgcHJldmVudCB0aGUgc2Vjb25kIFxwYXJ0aWFscGFnZSBmcm9tCi0gICAgJSBzaW1wbHkgb3ZlcndyaXRpbmcgdGhlIGZpcnN0LCBjYXVzaW5nIHVzIHRvIGxvc2UgdGhlIHBhZ2UuCi0gICAgJSBUaGlzIHdpbGwgcHJlc2VydmUgaXQgdW50aWwgYSByZWFsIG91dHB1dCByb3V0aW5lIGNhbiBzaGlwIGl0Ci0gICAgJSBvdXQuICBHZW5lcmFsbHksIFxwYXJ0aWFscGFnZSB3aWxsIGJlIGVtcHR5IHdoZW4gdGhpcyBydW5zIGFuZAotICAgICUgdGhpcyB3aWxsIGJlIGEgbm8tb3AuCi0gICAgXHVudmJveFxwYXJ0aWFscGFnZQotICAgICUKLSAgICAlIFVudmJveCB0aGUgbWFpbiBvdXRwdXQgcGFnZS4KLSAgICBcdW52Ym94MjU1Ci0gICAgXGtlcm4tXHRvcHNraXAgXGtlcm5cYmFzZWxpbmVza2lwCi0gIH19JQotICBcZWplY3QKLSAgJQotICAlIFVzZSB0aGUgZG91YmxlLWNvbHVtbiBvdXRwdXQgcm91dGluZSBmb3Igc3Vic2VxdWVudCBwYWdlcy4KLSAgXG91dHB1dCA9IHtcZG91YmxlY29sdW1ub3V0fSUKLSAgJQotICAlIENoYW5nZSB0aGUgcGFnZSBzaXplIHBhcmFtZXRlcnMuICBXZSBjb3VsZCBkbyB0aGlzIG9uY2Ugb3V0c2lkZSB0aGlzCi0gICUgcm91dGluZSwgaW4gZWFjaCBvZiBAc21hbGxib29rLCBAYWZvdXJwYXBlciwgYW5kIHRoZSBkZWZhdWx0IDguNXgxMQotICAlIGZvcm1hdCwgYnV0IHRoZW4gd2UgcmVwZWF0IHRoZSBzYW1lIGNvbXB1dGF0aW9uLiAgUmVwZWF0aW5nIGEgY291cGxlCi0gICUgb2YgYXNzaWdubWVudHMgb25jZSBwZXIgaW5kZXggaXMgY2xlYXJseSBtZWFuaW5nbGVzcyBmb3IgdGhlCi0gICUgZXhlY3V0aW9uIHRpbWUsIHNvIHdlIG1heSBhcyB3ZWxsIGRvIGl0IGluIG9uZSBwbGFjZS4KLSAgJQotICAlIEZpcnN0IHdlIGhhbHZlIHRoZSBsaW5lIGxlbmd0aCwgbGVzcyBhIGxpdHRsZSBmb3IgdGhlIGd1dHRlciBiZXR3ZWVuCi0gICUgdGhlIGNvbHVtbnMuICBXZSBjb21wdXRlIHRoZSBndXR0ZXIgYmFzZWQgb24gdGhlIGxpbmUgbGVuZ3RoLCBzbyBpdAotICAlIGNoYW5nZXMgYXV0b21hdGljYWxseSB3aXRoIHRoZSBwYXBlciBmb3JtYXQuICBUaGUgbWFnaWMgY29uc3RhbnQKLSAgJSBiZWxvdyBpcyBjaG9zZW4gc28gdGhhdCB0aGUgZ3V0dGVyIGhhcyB0aGUgc2FtZSB2YWx1ZSAod2VsbCwgKy08MXB0KQotICAlIGFzIGl0IGRpZCB3aGVuIHdlIGhhcmQtY29kZWQgaXQuCi0gICUKLSAgJSBXZSBwdXQgdGhlIHJlc3VsdCBpbiBhIHNlcGFyYXRlIHJlZ2lzdGVyLCBcZG91YmxlY29sdW1oc2l6ZSwgc28gd2UKLSAgJSBjYW4gcmVzdG9yZSBpdCBpbiBccGFnZXNvZmFyLCBhZnRlciBcaHNpemUgaXRzZWxmIGhhcyAocG90ZW50aWFsbHkpCi0gICUgYmVlbiBjbG9iYmVyZWQuCi0gICUKLSAgXGRvdWJsZWNvbHVtbmhzaXplID0gXGhzaXplCi0gICAgXGFkdmFuY2VcZG91YmxlY29sdW1uaHNpemUgYnkgLS4wNDE1NFxoc2l6ZQotICAgIFxkaXZpZGVcZG91YmxlY29sdW1uaHNpemUgYnkgMgotICBcaHNpemUgPSBcZG91YmxlY29sdW1uaHNpemUKLSAgJQotICAlIERvdWJsZSB0aGUgXHZzaXplIGFzIHdlbGwuICAoV2UgZG9uJ3QgbmVlZCBhIHNlcGFyYXRlIHJlZ2lzdGVyIGhlcmUsCi0gICUgc2luY2Ugbm9ib2R5IGNsb2JiZXJzIFx2c2l6ZS4pCi0gIFxhZHZhbmNlXHZzaXplIGJ5IC1caHRccGFydGlhbHBhZ2UKLSAgXHZzaXplID0gMlx2c2l6ZQotfQotCi0lIFRoZSBkb3VibGUtY29sdW1uIG91dHB1dCByb3V0aW5lIGZvciBhbGwgZG91YmxlLWNvbHVtbiBwYWdlcyBleGNlcHQKLSUgdGhlIGxhc3QuCi0lIAotXGRlZlxkb3VibGVjb2x1bW5vdXR7JQotICBcc3BsaXR0b3Bza2lwPVx0b3Bza2lwIFxzcGxpdG1heGRlcHRoPVxtYXhkZXB0aAotICAlIEdldCB0aGUgYXZhaWxhYmxlIHNwYWNlIGZvciB0aGUgZG91YmxlIGNvbHVtbnMgLS0gdGhlIG5vcm1hbAotICAlICh1bmRvdWJsZWQpIHBhZ2UgaGVpZ2h0IG1pbnVzIGFueSBtYXRlcmlhbCBsZWZ0IG92ZXIgZnJvbSB0aGUKLSAgJSBwcmV2aW91cyBwYWdlLgotICBcZGltZW5AID0gXHZzaXplCi0gIFxkaXZpZGVcZGltZW5AIGJ5IDIKLSAgJQotICAlIGJveDAgd2lsbCBiZSB0aGUgbGVmdC1oYW5kIGNvbHVtbiwgYm94MiB0aGUgcmlnaHQuCi0gIFxzZXRib3gwPVx2c3BsaXQyNTUgdG9cZGltZW5AIFxzZXRib3gyPVx2c3BsaXQyNTUgdG9cZGltZW5ACi0gIFxvbmVwYWdlb3V0XHBhZ2Vzb2ZhcgotICBcdW52Ym94MjU1Ci0gIFxwZW5hbHR5XG91dHB1dHBlbmFsdHkKLX0KLVxkZWZccGFnZXNvZmFyeyUKLSAgJSBSZS1vdXRwdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgcGFnZSAtLSBhbnkgcHJldmlvdXMgbWF0ZXJpYWwsCi0gICUgZm9sbG93ZWQgYnkgdGhlIHR3byBib3hlcyB3ZSBqdXN0IHNwbGl0LCBpbiBib3gwIGFuZCBib3gyLgotICBcYWR2YW5jZVx2c2l6ZSBieSBcaHRccGFydGlhbHBhZ2UKLSAgXHVudmJveFxwYXJ0aWFscGFnZQotICAlCi0gIFxoc2l6ZSA9IFxkb3VibGVjb2x1bW5oc2l6ZQotICBcd2QwPVxoc2l6ZSBcd2QyPVxoc2l6ZQotICBcaGJveCB0b1xwYWdld2lkdGh7XGJveDBcaGZpbFxib3gyfSUKLX0KLVxkZWZcZW5kZG91YmxlY29sdW1uc3slCi0gIFxvdXRwdXQgPSB7JQotICAgICUgU3BsaXQgdGhlIGxhc3Qgb2YgdGhlIGRvdWJsZS1jb2x1bW4gbWF0ZXJpYWwuICBMZWF2ZSBvbiB0aGUKLSAgICAlIGN1cnJlbnQgcGFnZSwgbm8gYXV0b21hdGljIHBhZ2UgYnJlYWsuCi0gICAgXGJhbGFuY2Vjb2x1bW5zCi0gICAgJQotICAgICUgSWYgd2UgZW5kIHVwIHNwbGl0dGluZyB0b28gbXVjaCBtYXRlcmlhbCBmb3IgdGhlIGN1cnJlbnQgcGFnZSwKLSAgICAlIHRob3VnaCwgdGhlcmUgd2lsbCBiZSBhbm90aGVyIHBhZ2UgYnJlYWsgcmlnaHQgYWZ0ZXIgdGhpcyBcb3V0cHV0Ci0gICAgJSBpbnZvY2F0aW9uIGVuZHMuICBIYXZpbmcgY2FsbGVkIFxiYWxhbmNlY29sdW1ucyBvbmNlLCB3ZSBkbyBub3QKLSAgICAlIHdhbnQgdG8gY2FsbCBpdCBhZ2Fpbi4gIFRoZXJlZm9yZSwgcmVzZXQgXG91dHB1dCB0byBpdHMgbm9ybWFsCi0gICAgJSBkZWZpbml0aW9uIHJpZ2h0IGF3YXkuICAoV2UgaG9wZSBcYmFsYW5jZWNvbHVtbnMgd2lsbCBuZXZlciBiZQotICAgICUgY2FsbGVkIG9uIHRvIGJhbGFuY2UgdG9vIG11Y2ggbWF0ZXJpYWwsIGJ1dCBpZiBpdCBpcywgdGhpcyBtYWtlcwotICAgICUgdGhlIG91dHB1dCBzb21ld2hhdCBtb3JlIHBhbGF0YWJsZS4pCi0gICAgXGdsb2JhbFxvdXRwdXQgPSB7XG9uZXBhZ2VvdXR7XHBhZ2Vjb250ZW50c1xQQUdFfX0lCi0gICAgJQotICAgICUgXHBhZ2Vnb2FsIHdhcyBzZXQgdG8gdGhlIGRvdWJsZWQgXHZzaXplIGFib3ZlLCBzaW5jZSB3ZSByZXN0YXJ0ZWQKLSAgICAlIHRoZSBjdXJyZW50IHBhZ2UuICBXZSdyZSBub3cgYmFjayB0byBub3JtYWwgc2luZ2xlLWNvbHVtbgotICAgICUgdHlwZXNldHRpbmcsIHNvIHJlc2V0IFxwYWdlZ29hbCB0byB0aGUgbm9ybWFsIFx2c2l6ZS4KLSAgICBccGFnZWdvYWwgPSBcdnNpemUKLSAgfSUKLSAgXGVqZWN0Ci0gIFxlbmRncm91cCAlIHN0YXJ0ZWQgaW4gXGJlZ2luZG91YmxlY29sdW1ucwotfQotXGRlZlxiYWxhbmNlY29sdW1uc3slCi0gICUgQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRvdWJsZSBjb2x1bW4gbWF0ZXJpYWwuCi0gIFxzZXRib3gwID0gXHZib3h7XHVudmJveDI1NX0lIGxpa2UgXGJveDI1NSBidXQgbW9yZSBlZmZpY2llbnQsIHNlZSBwLjEyMC4KLSAgXGRpbWVuQCA9IFxodDAKLSAgXGFkdmFuY2VcZGltZW5AIGJ5IFx0b3Bza2lwCi0gIFxhZHZhbmNlXGRpbWVuQCBieS1cYmFzZWxpbmVza2lwCi0gIFxkaXZpZGVcZGltZW5AIGJ5IDIgJSB0YXJnZXQgdG8gc3BsaXQgdG8KLSAgJWRlYnVnXG1lc3NhZ2V7ZmluYWwgMi1jb2x1bW4gbWF0ZXJpYWwgaGVpZ2h0PVx0aGVcaHQwLCB0YXJnZXQ9XHRoZVxkaW1lbkAufSUKLSAgXHNwbGl0dG9wc2tpcCA9IFx0b3Bza2lwCi0gICUgTG9vcCB1bnRpbCB3ZSBnZXQgYSBkZWNlbnQgYnJlYWtwb2ludC4KLSAgeyUKLSAgICBcdmJhZG5lc3MgPSAxMDAwMAotICAgIFxsb29wCi0gICAgICBcZ2xvYmFsXHNldGJveDMgPSBcY29weTAKLSAgICAgIFxnbG9iYWxcc2V0Ym94MSA9IFx2c3BsaXQzIHRvIFxkaW1lbkAKLSAgICBcaWZkaW1caHQzPlxkaW1lbkAKLSAgICAgIFxnbG9iYWxcYWR2YW5jZVxkaW1lbkAgYnkgMXB0Ci0gICAgXHJlcGVhdAotICB9JQotICAlZGVidWdcbWVzc2FnZXtzcGxpdCB0byBcdGhlXGRpbWVuQCwgY29sdW1uIGhlaWdodHM6IFx0aGVcaHQxLCBcdGhlXGh0My59JQotICBcc2V0Ym94MD1cdmJveCB0b1xkaW1lbkB7XHVudmJveDF9JQotICBcc2V0Ym94Mj1cdmJveCB0b1xkaW1lbkB7XHVudmJveDN9JQotICAlCi0gIFxwYWdlc29mYXIKLX0KLVxjYXRjb2RlYFxAID0gXG90aGVyCi0KLQotXG1lc3NhZ2V7c2VjdGlvbmluZyx9Ci0lIERlZmluZSBjaGFwdGVycywgc2VjdGlvbnMsIGV0Yy4KLQotXG5ld2NvdW50XGNoYXBubwotXG5ld2NvdW50XHNlY25vICAgICAgICBcc2Vjbm89MAotXG5ld2NvdW50XHN1YnNlY25vICAgICBcc3Vic2Vjbm89MAotXG5ld2NvdW50XHN1YnN1YnNlY25vICBcc3Vic3Vic2Vjbm89MAotCi0lIFRoaXMgY291bnRlciBpcyBmdW5ueSBzaW5jZSBpdCBjb3VudHMgdGhyb3VnaCBjaGFyY29kZXMgb2YgbGV0dGVycyBBLCBCLCAuLi4KLVxuZXdjb3VudFxhcHBlbmRpeG5vICBcYXBwZW5kaXhubyA9IGBcQAotXGRlZlxhcHBlbmRpeGxldHRlcntcY2hhclx0aGVcYXBwZW5kaXhub30KLQotJSBFYWNoIEBjaGFwdGVyIGRlZmluZXMgdGhpcyBhcyB0aGUgbmFtZSBvZiB0aGUgY2hhcHRlci4KLSUgcGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MgY2FuIHVzZSBpdC4gIEBzZWN0aW9uIGRvZXMgbGlrZXdpc2UuCi1cZGVmXHRoaXNjaGFwdGVye30KLVxkZWZcdGhpc3NlY3Rpb257fQotCi1cbmV3Y291bnRcYWJzc2VjbGV2ZWwgJSB1c2VkIHRvIGNhbGN1bGF0ZSBwcm9wZXIgaGVhZGluZyBsZXZlbAotXG5ld2NvdW50XHNlY2Jhc2Vcc2VjYmFzZT0wICUgQHJhaXNlL2xvd2Vyc2VjdGlvbnMgbW9kaWZ5IHRoaXMgY291bnQKLQotJSBAcmFpc2VzZWN0aW9uczogdHJlYXQgQHNlY3Rpb24gYXMgY2hhcHRlciwgQHN1YnNlY3Rpb24gYXMgc2VjdGlvbiwgZXRjLgotXGRlZlxyYWlzZXNlY3Rpb25ze1xnbG9iYWxcYWR2YW5jZVxzZWNiYXNlIGJ5IC0xfQotXGxldFx1cD1ccmFpc2VzZWN0aW9ucyAlIG9yaWdpbmFsIEJGb3ggbmFtZQotCi0lIEBsb3dlcnNlY3Rpb25zOiB0cmVhdCBAY2hhcHRlciBhcyBzZWN0aW9uLCBAc2VjdGlvbiBhcyBzdWJzZWN0aW9uLCBldGMuCi1cZGVmXGxvd2Vyc2VjdGlvbnN7XGdsb2JhbFxhZHZhbmNlXHNlY2Jhc2UgYnkgMX0KLVxsZXRcZG93bj1cbG93ZXJzZWN0aW9ucyAlIG9yaWdpbmFsIEJGb3ggbmFtZQotCi0lIENob29zZSBhIG51bWJlcmVkLWhlYWRpbmcgbWFjcm8KLSUgIzEgaXMgaGVhZGluZyBsZXZlbCBpZiB1bm1vZGlmaWVkIGJ5IEByYWlzZXNlY3Rpb25zIG9yIEBsb3dlcnNlY3Rpb25zCi0lICMyIGlzIHRleHQgZm9yIGhlYWRpbmcKLVxkZWZcbnVtaGVhZCMxIzJ7XGFic3NlY2xldmVsPVxzZWNiYXNlXGFkdmFuY2VcYWJzc2VjbGV2ZWwgYnkgIzEKLVxpZmNhc2VcYWJzc2VjbGV2ZWwKLSAgXGNoYXB0ZXJ6enp7IzJ9Ci1cb3IKLSAgXHNlY3p6ensjMn0KLVxvcgotICBcbnVtYmVyZWRzdWJzZWN6enp7IzJ9Ci1cb3IKLSAgXG51bWJlcmVkc3Vic3Vic2Vjenp6eyMyfQotXGVsc2UKLSAgXGlmbnVtIFxhYnNzZWNsZXZlbDwwCi0gICAgXGNoYXB0ZXJ6enp7IzJ9Ci0gIFxlbHNlCi0gICAgXG51bWJlcmVkc3Vic3Vic2Vjenp6eyMyfQotICBcZmkKLVxmaQotfQotCi0lIGxpa2UgXG51bWhlYWQsIGJ1dCBjaG9vc2VzIGFwcGVuZGl4IGhlYWRpbmcgbGV2ZWxzCi1cZGVmXGFwcGhlYWQjMSMye1xhYnNzZWNsZXZlbD1cc2VjYmFzZVxhZHZhbmNlXGFic3NlY2xldmVsIGJ5ICMxCi1caWZjYXNlXGFic3NlY2xldmVsCi0gIFxhcHBlbmRpeHp6ensjMn0KLVxvcgotICBcYXBwZW5kaXhzZWN0aW9uenp6eyMyfQotXG9yCi0gIFxhcHBlbmRpeHN1YnNlY3p6ensjMn0KLVxvcgotICBcYXBwZW5kaXhzdWJzdWJzZWN6enp7IzJ9Ci1cZWxzZQotICBcaWZudW0gXGFic3NlY2xldmVsPDAKLSAgICBcYXBwZW5kaXh6enp7IzJ9Ci0gIFxlbHNlCi0gICAgXGFwcGVuZGl4c3Vic3Vic2Vjenp6eyMyfQotICBcZmkKLVxmaQotfQotCi0lIGxpa2UgXG51bWhlYWQsIGJ1dCBjaG9vc2VzIG51bWJlcmxlc3MgaGVhZGluZyBsZXZlbHMKLVxkZWZcdW5ubWhlYWQjMSMye1xhYnNzZWNsZXZlbD1cc2VjYmFzZVxhZHZhbmNlXGFic3NlY2xldmVsIGJ5ICMxCi1caWZjYXNlXGFic3NlY2xldmVsCi0gIFx1bm51bWJlcmVkenp6eyMyfQotXG9yCi0gIFx1bm51bWJlcmVkc2Vjenp6eyMyfQotXG9yCi0gIFx1bm51bWJlcmVkc3Vic2Vjenp6eyMyfQotXG9yCi0gIFx1bm51bWJlcmVkc3Vic3Vic2Vjenp6eyMyfQotXGVsc2UKLSAgXGlmbnVtIFxhYnNzZWNsZXZlbDwwCi0gICAgXHVubnVtYmVyZWR6enp7IzJ9Ci0gIFxlbHNlCi0gICAgXHVubnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci0gIFxmaQotXGZpCi19Ci0KLSUgQGNoYXB0ZXIsIEBhcHBlbmRpeCwgQHVubnVtYmVyZWQuCi1cZGVmXHRoaXNjaGFwdGVybmFtZXtObyBDaGFwdGVyIFRpdGxlfQotXG91dGVyXGRlZlxjaGFwdGVye1xwYXJzZWFyZ1xjaGFwdGVyeXl5fQotXGRlZlxjaGFwdGVyeXl5ICMxe1xudW1oZWFkMHsjMX19ICUgbm9ybWFsbHkgbnVtaGVhZDAgY2FsbHMgY2hhcHRlcnp6egotXGRlZlxjaGFwdGVyenp6ICMxeyUKLVxzZWNubz0wIFxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wCi1cZ2xvYmFsXGFkdmFuY2UgXGNoYXBubyBieSAxIFxtZXNzYWdle1xwdXR3b3JkQ2hhcHRlclxzcGFjZSBcdGhlXGNoYXBub30lCi1cY2hhcG1hY3JvIHsjMX17XHRoZVxjaGFwbm99JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXGdkZWZcdGhpc2NoYXB0ZXJuYW1leyMxfSUKLSUgV2UgZG9uJ3Qgc3Vic3RpdHV0ZSB0aGUgYWN0dWFsIGNoYXB0ZXIgbmFtZSBpbnRvIFx0aGlzY2hhcHRlcgotJSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgaXRzIG1hY3JvcyBldmFsdWF0ZWQgbm93LgotXHhkZWZcdGhpc2NoYXB0ZXJ7XHB1dHdvcmRDaGFwdGVye30gXHRoZVxjaGFwbm86IFxub2V4cGFuZFx0aGlzY2hhcHRlcm5hbWV9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggY2hhcGVudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXGNoYXBub319fSUKLVx0ZW1wCi1cZG9ub2RlcmVmCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXG51bWJlcmVkc2VjCi1cZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic2VjCi1cZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCi19Ci0KLVxvdXRlclxkZWZcYXBwZW5kaXh7XHBhcnNlYXJnXGFwcGVuZGl4eXl5fQotXGRlZlxhcHBlbmRpeHl5eSAjMXtcYXBwaGVhZDB7IzF9fSAlIG5vcm1hbGx5IGFwcGhlYWQwIGNhbGxzIGFwcGVuZGl4enp6Ci1cZGVmXGFwcGVuZGl4enp6ICMxeyUKLVxzZWNubz0wIFxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wCi1cZ2xvYmFsXGFkdmFuY2UgXGFwcGVuZGl4bm8gYnkgMQotXG1lc3NhZ2V7XHB1dHdvcmRBcHBlbmRpeFxzcGFjZSBcYXBwZW5kaXhsZXR0ZXJ9JQotXGNoYXBtYWNybyB7IzF9e1xwdXR3b3JkQXBwZW5kaXh7fSBcYXBwZW5kaXhsZXR0ZXJ9JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXGdkZWZcdGhpc2NoYXB0ZXJuYW1leyMxfSUKLVx4ZGVmXHRoaXNjaGFwdGVye1xwdXR3b3JkQXBwZW5kaXh7fSBcYXBwZW5kaXhsZXR0ZXI6IFxub2V4cGFuZFx0aGlzY2hhcHRlcm5hbWV9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggY2hhcGVudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICB7XHB1dHdvcmRBcHBlbmRpeHt9IFxhcHBlbmRpeGxldHRlcn19fSUKLVx0ZW1wCi1cYXBwZW5kaXhub2RlcmVmCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXGFwcGVuZGl4c2VjCi1cZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXGFwcGVuZGl4c3Vic2VjCi1cZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXGFwcGVuZGl4c3Vic3Vic2VjCi19Ci0KLSUgQGNlbnRlcmNoYXAgaXMgbGlrZSBAdW5udW1iZXJlZCwgYnV0IHRoZSBoZWFkaW5nIGlzIGNlbnRlcmVkLgotXG91dGVyXGRlZlxjZW50ZXJjaGFwe1xwYXJzZWFyZ1xjZW50ZXJjaGFweXl5fQotXGRlZlxjZW50ZXJjaGFweXl5ICMxe3tcbGV0XHVubnVtYmNoYXBtYWNybz1cY2VudGVyY2hhcG1hY3JvIFx1bm51bWJlcmVkeXl5eyMxfX19Ci0KLSUgQHRvcCBpcyBsaWtlIEB1bm51bWJlcmVkLgotXG91dGVyXGRlZlx0b3B7XHBhcnNlYXJnXHVubnVtYmVyZWR5eXl9Ci0KLVxvdXRlclxkZWZcdW5udW1iZXJlZHtccGFyc2VhcmdcdW5udW1iZXJlZHl5eX0KLVxkZWZcdW5udW1iZXJlZHl5eSAjMXtcdW5ubWhlYWQweyMxfX0gJSBub3JtYWxseSB1bm5taGVhZDAgY2FsbHMgdW5udW1iZXJlZHp6egotXGRlZlx1bm51bWJlcmVkenp6ICMxeyUKLVxzZWNubz0wIFxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wCi0lCi0lIFRoaXMgdXNlZCB0byBiZSBzaW1wbHkgXG1lc3NhZ2V7IzF9LCBidXQgVGVYIGZ1bGx5IGV4cGFuZHMgdGhlCi0lIGFyZ3VtZW50IHRvIFxtZXNzYWdlLiAgVGhlcmVmb3JlLCBpZiAjMSBjb250YWluZWQgQC1jb21tYW5kcywgVGVYCi0lIGV4cGFuZGVkIHRoZW0uICBGb3IgZXhhbXBsZSwgaW4gYEB1bm51bWJlcmVkIFRoZSBAY2l0ZXtCb29rfScsIFRlWAotJSBleHBhbmRlZCBAY2l0ZSAod2hpY2ggdHVybnMgb3V0IHRvIGNhdXNlIGVycm9ycyBiZWNhdXNlIFxjaXRlIGlzIG1lYW50Ci0lIHRvIGJlIGV4ZWN1dGVkLCBub3QgZXhwYW5kZWQpLgotJQotJSBBbnl3YXksIHdlIGRvbid0IHdhbnQgdGhlIGZ1bGx5LWV4cGFuZGVkIGRlZmluaXRpb24gb2YgQGNpdGUgdG8gYXBwZWFyCi0lIGFzIGEgcmVzdWx0IG9mIHRoZSBcbWVzc2FnZSwgd2UganVzdCB3YW50IGBAY2l0ZScgaXRzZWxmLiAgV2UgdXNlCi0lIFx0aGU8dG9rcyByZWdpc3Rlcj4gdG8gYWNoaWV2ZSB0aGlzOiBUZVggZXhwYW5kcyBcdGhlPHRva3M+IG9ubHkgb25jZSwKLSUgc2ltcGx5IHlpZWxkaW5nIHRoZSBjb250ZW50cyBvZiA8dG9rcyByZWdpc3Rlcj4uICAoV2UgYWxzbyBkbyB0aGlzIGZvcgotJSB0aGUgdG9jIGVudHJpZXMuKQotXHRva3MwID0geyMxfVxtZXNzYWdleyhcdGhlXHRva3MwKX0lCi0lCi1cdW5udW1iY2hhcG1hY3JvIHsjMX0lCi1cZ2RlZlx0aGlzY2hhcHRlcnsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCB1bm51bWJjaGFwZW50cnl7XHRoZVx0b2tzMH19fSUKLVx0ZW1wCi1cdW5udW1ibm9kZXJlZgotXGdsb2JhbFxsZXRcc2VjdGlvbiA9IFx1bm51bWJlcmVkc2VjCi1cZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXHVubnVtYmVyZWRzdWJzZWMKLVxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcdW5udW1iZXJlZHN1YnN1YnNlYwotfQotCi0lIFNlY3Rpb25zLgotXG91dGVyXGRlZlxudW1iZXJlZHNlY3tccGFyc2Vhcmdcc2VjeXl5fQotXGRlZlxzZWN5eXkgIzF7XG51bWhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyBzZWN6enoKLVxkZWZcc2Vjenp6ICMxeyUKLVxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wIFxnbG9iYWxcYWR2YW5jZSBcc2Vjbm8gYnkgMSAlCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX1cc2VjaGVhZGluZyB7IzF9e1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXGNoYXBub317XHRoZVxzZWNub319fSUKLVx0ZW1wCi1cZG9ub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXGFwcGVuZGl4c2VjdGlvbntccGFyc2VhcmdcYXBwZW5kaXhzZWN5eXl9Ci1cb3V0ZXJcZGVmXGFwcGVuZGl4c2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHNlY3l5eX0KLVxkZWZcYXBwZW5kaXhzZWN5eXkgIzF7XGFwcGhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyBhcHBlbmRpeHNlY3Rpb256enoKLVxkZWZcYXBwZW5kaXhzZWN0aW9uenp6ICMxeyUKLVxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wIFxnbG9iYWxcYWR2YW5jZSBcc2Vjbm8gYnkgMSAlCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX1cc2VjaGVhZGluZyB7IzF9e1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfX19JQotXHRlbXAKLVxhcHBlbmRpeG5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcdW5udW1iZXJlZHNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHNlY3l5eX0KLVxkZWZcdW5udW1iZXJlZHNlY3l5eSAjMXtcdW5ubWhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyB1bm51bWJlcmVkc2Vjenp6Ci1cZGVmXHVubnVtYmVyZWRzZWN6enogIzF7JQotXHBsYWluc2VjaGVhZGluZyB7IzF9XGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggdW5udW1ic2VjZW50cnl7XHRoZVx0b2tzMH19fSUKLVx0ZW1wCi1cdW5udW1ibm9kZXJlZgotXG5vYnJlYWsKLX0KLQotJSBTdWJzZWN0aW9ucy4KLVxvdXRlclxkZWZcbnVtYmVyZWRzdWJzZWN7XHBhcnNlYXJnXG51bWJlcmVkc3Vic2VjeXl5fQotXGRlZlxudW1iZXJlZHN1YnNlY3l5eSAjMXtcbnVtaGVhZDJ7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIG51bWJlcmVkc3Vic2Vjenp6Ci1cZGVmXG51bWJlcmVkc3Vic2Vjenp6ICMxeyUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzdWJzdWJzZWNubz0wIFxnbG9iYWxcYWR2YW5jZSBcc3Vic2Vjbm8gYnkgMSAlCi1cc3Vic2VjaGVhZGluZyB7IzF9e1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHN1YnNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcYXBwZW5kaXhzdWJzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c3Vic2VjeXl5fQotXGRlZlxhcHBlbmRpeHN1YnNlY3l5eSAjMXtcYXBwaGVhZDJ7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c3Vic2Vjenp6Ci1cZGVmXGFwcGVuZGl4c3Vic2Vjenp6ICMxeyUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzdWJzdWJzZWNubz0wIFxnbG9iYWxcYWR2YW5jZSBcc3Vic2Vjbm8gYnkgMSAlCi1cc3Vic2VjaGVhZGluZyB7IzF9e1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzdWJzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub319fSUKLVx0ZW1wCi1cYXBwZW5kaXhub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXHVubnVtYmVyZWRzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzZWN5eXl9Ci1cZGVmXHVubnVtYmVyZWRzdWJzZWN5eXkgIzF7XHVubm1oZWFkMnsjMX19ICVub3JtYWxseSBjYWxscyB1bm51bWJlcmVkc3Vic2Vjenp6Ci1cZGVmXHVubnVtYmVyZWRzdWJzZWN6enogIzF7JQotXHBsYWluc3Vic2VjaGVhZGluZyB7IzF9XGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggdW5udW1ic3Vic2VjZW50cnklCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVx0b2tzMH19fSUKLVx0ZW1wCi1cdW5udW1ibm9kZXJlZgotXG5vYnJlYWsKLX0KLQotJSBTdWJzdWJzZWN0aW9ucy4KLVxvdXRlclxkZWZcbnVtYmVyZWRzdWJzdWJzZWN7XHBhcnNlYXJnXG51bWJlcmVkc3Vic3Vic2VjeXl5fQotXGRlZlxudW1iZXJlZHN1YnN1YnNlY3l5eSAjMXtcbnVtaGVhZDN7IzF9fSAlIG5vcm1hbGx5IG51bWJlcmVkc3Vic3Vic2Vjenp6Ci1cZGVmXG51bWJlcmVkc3Vic3Vic2Vjenp6ICMxeyUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxnbG9iYWxcYWR2YW5jZSBcc3Vic3Vic2Vjbm8gYnkgMSAlCi1cc3Vic3Vic2VjaGVhZGluZyB7IzF9Ci0gIHtcdGhlXGNoYXBub317XHRoZVxzZWNub317XHRoZVxzdWJzZWNub317XHRoZVxzdWJzdWJzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzdWJzdWJzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcYXBwZW5kaXhzdWJzdWJzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c3Vic3Vic2VjeXl5fQotXGRlZlxhcHBlbmRpeHN1YnN1YnNlY3l5eSAjMXtcYXBwaGVhZDN7IzF9fSAlIG5vcm1hbGx5IGFwcGVuZGl4c3Vic3Vic2Vjenp6Ci1cZGVmXGFwcGVuZGl4c3Vic3Vic2Vjenp6ICMxeyUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxnbG9iYWxcYWR2YW5jZSBcc3Vic3Vic2Vjbm8gYnkgMSAlCi1cc3Vic3Vic2VjaGVhZGluZyB7IzF9Ci0gIHtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99e1x0aGVcc3Vic3Vic2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc3Vic3Vic2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gIHtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99e1x0aGVcc3Vic3Vic2Vjbm99fX0lCi1cdGVtcAotXGFwcGVuZGl4bm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlx1bm51bWJlcmVkc3Vic3Vic2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc3Vic3Vic2VjeXl5fQotXGRlZlx1bm51bWJlcmVkc3Vic3Vic2VjeXl5ICMxe1x1bm5taGVhZDN7IzF9fSAlbm9ybWFsbHkgdW5udW1iZXJlZHN1YnN1YnNlY3p6egotXGRlZlx1bm51bWJlcmVkc3Vic3Vic2Vjenp6ICMxeyUKLVxwbGFpbnN1YnN1YnNlY2hlYWRpbmcgeyMxfVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHVubnVtYnN1YnN1YnNlY2VudHJ5JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcdG9rczB9fX0lCi1cdGVtcAotXHVubnVtYm5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLSUgVGhlc2UgYXJlIHZhcmlhbnRzIHdoaWNoIGFyZSBub3QgIm91dGVyIiwgc28gdGhleSBjYW4gYXBwZWFyIGluIEBpZmluZm8uCi0lIEFjdHVhbGx5LCB0aGV5IHNob3VsZCBub3cgYmUgb2Jzb2xldGU7IG9yZGluYXJ5IHNlY3Rpb24gY29tbWFuZHMgc2hvdWxkIHdvcmsuCi1cZGVmXGluZm90b3B7XHBhcnNlYXJnXHVubnVtYmVyZWR6enp9Ci1cZGVmXGluZm91bm51bWJlcmVke1xwYXJzZWFyZ1x1bm51bWJlcmVkenp6fQotXGRlZlxpbmZvdW5udW1iZXJlZHNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHNlY3p6en0KLVxkZWZcaW5mb3VubnVtYmVyZWRzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzZWN6enp9Ci1cZGVmXGluZm91bm51bWJlcmVkc3Vic3Vic2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc3Vic3Vic2Vjenp6fQotCi1cZGVmXGluZm9hcHBlbmRpeHtccGFyc2VhcmdcYXBwZW5kaXh6enp9Ci1cZGVmXGluZm9hcHBlbmRpeHNlY3tccGFyc2VhcmdcYXBwZW5kaXhzZWN6enp9Ci1cZGVmXGluZm9hcHBlbmRpeHN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzZWN6enp9Ci1cZGVmXGluZm9hcHBlbmRpeHN1YnN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzdWJzZWN6enp9Ci0KLVxkZWZcaW5mb2NoYXB0ZXJ7XHBhcnNlYXJnXGNoYXB0ZXJ6enp9Ci1cZGVmXGluZm9zZWN0aW9ue1xwYXJzZWFyZ1xzZWN0aW9uenp6fQotXGRlZlxpbmZvc3Vic2VjdGlvbntccGFyc2Vhcmdcc3Vic2VjdGlvbnp6en0KLVxkZWZcaW5mb3N1YnN1YnNlY3Rpb257XHBhcnNlYXJnXHN1YnN1YnNlY3Rpb256enp9Ci0KLSUgVGhlc2UgbWFjcm9zIGNvbnRyb2wgd2hhdCB0aGUgc2VjdGlvbiBjb21tYW5kcyBkbywgYWNjb3JkaW5nCi0lIHRvIHdoYXQga2luZCBvZiBjaGFwdGVyIHdlIGFyZSBpbiAob3JkaW5hcnksIGFwcGVuZGl4LCBvciB1bm51bWJlcmVkKS4KLSUgRGVmaW5lIHRoZW0gYnkgZGVmYXVsdCBmb3IgYSBudW1iZXJlZCBjaGFwdGVyLgotXGdsb2JhbFxsZXRcc2VjdGlvbiA9IFxudW1iZXJlZHNlYwotXGdsb2JhbFxsZXRcc3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnNlYwotXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnN1YnNlYwotCi0lIERlZmluZSBAbWFqb3JoZWFkaW5nLCBAaGVhZGluZyBhbmQgQHN1YmhlYWRpbmcKLQotJSBOT1RFIG9uIHVzZSBvZiBcdmJveCBmb3IgY2hhcHRlciBoZWFkaW5ncywgc2VjdGlvbiBoZWFkaW5ncywgYW5kIHN1Y2g6Ci0lICAgICAgIDEpIFdlIHVzZSBcdmJveCByYXRoZXIgdGhhbiB0aGUgZWFybGllciBcbGluZSB0byBwZXJtaXQKLSUgICAgICAgICAgb3ZlcmxvbmcgaGVhZGluZ3MgdG8gZm9sZC4KLSUgICAgICAgMikgXGh5cGhlbnBlbmFsdHkgaXMgc2V0IHRvIDEwMDAwIGJlY2F1c2UgaHlwaGVuYXRpb24gaW4gYQotJSAgICAgICAgICBoZWFkaW5nIGlzIG9ibm94aW91czsgdGhpcyBmb3JiaWRzIGl0LgotJSAgICAgICAzKSBMaWtld2lzZSwgaGVhZGluZ3MgbG9vayBiZXN0IGlmIG5vIFxwYXJpbmRlbnQgaXMgdXNlZCwgYW5kCi0lICAgICAgICAgIGlmIGp1c3RpZmljYXRpb24gaXMgbm90IGF0dGVtcHRlZC4gIEhlbmNlIFxyYWdnZWRyaWdodC4KLQotCi1cZGVmXG1ham9yaGVhZGluZ3tccGFyc2VhcmdcbWFqb3JoZWFkaW5nenp6fQotXGRlZlxtYWpvcmhlYWRpbmd6enogIzF7JQote1xhZHZhbmNlXGNoYXBoZWFkaW5nc2tpcCBieSAxMHB0IFxjaGFwYnJlYWsgfSUKLXtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAotICAgICAgICAgICAgICAgICAgXHJtICMxXGhmaWxsfX1cYmlnc2tpcCBccGFyXHBlbmFsdHkgMjAwfQotCi1cZGVmXGNoYXBoZWFkaW5ne1xwYXJzZWFyZ1xjaGFwaGVhZGluZ3p6en0KLVxkZWZcY2hhcGhlYWRpbmd6enogIzF7XGNoYXBicmVhayAlCi17XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAotICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHRccmFnZ2VkcmlnaHQKLSAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19XGJpZ3NraXAgXHBhclxwZW5hbHR5IDIwMH0KLQotJSBAaGVhZGluZywgQHN1YmhlYWRpbmcsIEBzdWJzdWJoZWFkaW5nLgotXGRlZlxoZWFkaW5ne1xwYXJzZWFyZ1xwbGFpbnNlY2hlYWRpbmd9Ci1cZGVmXHN1YmhlYWRpbmd7XHBhcnNlYXJnXHBsYWluc3Vic2VjaGVhZGluZ30KLVxkZWZcc3Vic3ViaGVhZGluZ3tccGFyc2VhcmdccGxhaW5zdWJzdWJzZWNoZWFkaW5nfQotCi0lIFRoZXNlIG1hY3JvcyBnZW5lcmF0ZSBhIGNoYXB0ZXIsIHNlY3Rpb24sIGV0Yy4gaGVhZGluZyBvbmx5Ci0lIChpbmNsdWRpbmcgd2hpdGVzcGFjZSwgbGluZWJyZWFraW5nLCBldGMuIGFyb3VuZCBpdCksCi0lIGdpdmVuIGFsbCB0aGUgaW5mb3JtYXRpb24gaW4gY29udmVuaWVudCwgcGFyc2VkIGZvcm0uCi0KLSUlJSBBcmdzIGFyZSB0aGUgc2tpcCBhbmQgcGVuYWx0eSAodXN1YWxseSBuZWdhdGl2ZSkKLVxkZWZcZG9icmVhayMxIzJ7XHBhclxpZmRpbVxsYXN0c2tpcDwjMVxyZW1vdmVsYXN0c2tpcFxwZW5hbHR5IzJcdnNraXAjMVxmaX0KLQotXGRlZlxzZXRjaGFwdGVyc3R5bGUgIzEge1xjc25hbWUgQ0hBUEYjMVxlbmRjc25hbWV9Ci0KLSUlJSBEZWZpbmUgcGxhaW4gY2hhcHRlciBzdGFydHMsIGFuZCBwYWdlIG9uL29mZiBzd2l0Y2hpbmcgZm9yIGl0Ci0lIFBhcmFtZXRlciBjb250cm9sbGluZyBza2lwIGJlZm9yZSBjaGFwdGVyIGhlYWRpbmdzIChpZiBuZWVkZWQpCi0KLVxuZXdza2lwXGNoYXBoZWFkaW5nc2tpcAotCi1cZGVmXGNoYXBicmVha3tcZG9icmVhayBcY2hhcGhlYWRpbmdza2lwIHstNDAwMH19Ci1cZGVmXGNoYXBwYWdlcntccGFyXHZmaWxsXHN1cGVyZWplY3R9Ci1cZGVmXGNoYXBvZGRwYWdle1xjaGFwcGFnZXIgXGlmb2RkXHBhZ2VubyBcZWxzZSBcaGJveCB0byAwcHR7fSBcY2hhcHBhZ2VyXGZpfQotCi1cZGVmXHNldGNoYXB0ZXJuZXdwYWdlICMxIHtcY3NuYW1lIENIQVBQQUcjMVxlbmRjc25hbWV9Ci0KLVxkZWZcQ0hBUFBBR29mZnslCi1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi1cZ2xvYmFsXGxldFxwY2hhcHNlcG1hY3JvPVxjaGFwYnJlYWsKLVxnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwcGFnZXJ9Ci0KLVxkZWZcQ0hBUFBBR29ueyUKLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKLVxnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBwYWdlcgotXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBwYWdlcgotXGdsb2JhbFxkZWZcSEVBRElOR1NvbntcSEVBRElOR1NzaW5nbGV9fQotCi1cZGVmXENIQVBQQUdvZGR7Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKLVxnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBvZGRwYWdlCi1cZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcG9kZHBhZ2UKLVxnbG9iYWxcZGVmXEhFQURJTkdTb257XEhFQURJTkdTZG91YmxlfX0KLQotXENIQVBQQUdvbgotCi1cZGVmXENIQVBGcGxhaW57Ci1cZ2xvYmFsXGxldFxjaGFwbWFjcm89XGNoZnBsYWluCi1cZ2xvYmFsXGxldFx1bm51bWJjaGFwbWFjcm89XHVubmNoZnBsYWluCi1cZ2xvYmFsXGxldFxjZW50ZXJjaGFwbWFjcm89XGNlbnRlcmNoZnBsYWlufQotCi0lIFBsYWluIGNoYXB0ZXIgb3BlbmluZy4KLSUgIzEgaXMgdGhlIHRleHQsICMyIHRoZSBjaGFwdGVyIG51bWJlciBvciBlbXB0eSBpZiB1bm51bWJlcmVkLgotXGRlZlxjaGZwbGFpbiMxIzJ7JQotICBccGNoYXBzZXBtYWNybwotICB7JQotICAgIFxjaGFwZm9udHMgXHJtCi0gICAgXGRlZlxjaGFwbnVteyMyfSUKLSAgICBcc2V0Ym94MCA9IFxoYm94eyMyXGlmeFxjaGFwbnVtXGVtcHR5XGVsc2VcZW5zcGFjZVxmaX0lCi0gICAgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDAgXHRvbGVyYW5jZT01MDAwIFxwYXJpbmRlbnQ9MHB0IFxyYWdnZWRyaWdodAotICAgICAgICAgIFxoYW5naW5kZW50ID0gXHdkMCBcY2VudGVycGFyYW1ldGVyc21heWJlCi0gICAgICAgICAgXHVuaGJveDAgIzFccGFyfSUKLSAgfSUKLSAgXG5vYnJlYWtcYmlnc2tpcCAlIG5vIHBhZ2UgYnJlYWsgYWZ0ZXIgYSBjaGFwdGVyIHRpdGxlCi0gIFxub2JyZWFrCi19Ci0KLSUgUGxhaW4gb3BlbmluZyBmb3IgdW5udW1iZXJlZC4KLVxkZWZcdW5uY2hmcGxhaW4jMXtcY2hmcGxhaW57IzF9e319Ci0KLSUgQGNlbnRlcmNoYXAgLS0gY2VudGVyZWQgYW5kIHVubnVtYmVyZWQuCi1cbGV0XGNlbnRlcnBhcmFtZXRlcnNtYXliZSA9IFxyZWxheAotXGRlZlxjZW50ZXJjaGZwbGFpbiMxe3slCi0gIFxkZWZcY2VudGVycGFyYW1ldGVyc21heWJleyUKLSAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkgM1xyaWdodHNraXAKLSAgICBcbGVmdHNraXAgPSBccmlnaHRza2lwCi0gICAgXHBhcmZpbGxza2lwID0gMHB0Ci0gIH0lCi0gIFxjaGZwbGFpbnsjMX17fSUKLX19Ci0KLVxDSEFQRnBsYWluICUgVGhlIGRlZmF1bHQKLQotXGRlZlx1bm5jaGZvcGVuICMxeyUKLVxjaGFwb2RkcGFnZSB7XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAotICAgICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAotICAgICAgICAgICAgICAgICAgICAgICBccm0gIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJcbm9icmVhawotfQotCi1cZGVmXGNoZm9wZW4gIzEjMntcY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMKLVx2Ym94IHRvIDNpbntcdmZpbCBcaGJveCB0b1xoc2l6ZXtcaGZpbCAjMn0gXGhib3ggdG9caHNpemV7XGhmaWwgIzF9IFx2ZmlsfX0lCi1ccGFyXHBlbmFsdHkgNTAwMCAlCi19Ci0KLVxkZWZcY2VudGVyY2hmb3BlbiAjMXslCi1cY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHQKLSAgICAgICAgICAgICAgICAgICAgICAgXGhmaWxsIHtccm0gIzF9XGhmaWxsfX1cYmlnc2tpcCBccGFyXG5vYnJlYWsKLX0KLQotXGRlZlxDSEFQRm9wZW57Ci1cZ2xvYmFsXGxldFxjaGFwbWFjcm89XGNoZm9wZW4KLVxnbG9iYWxcbGV0XHVubnVtYmNoYXBtYWNybz1cdW5uY2hmb3BlbgotXGdsb2JhbFxsZXRcY2VudGVyY2hhcG1hY3JvPVxjZW50ZXJjaGZvcGVufQotCi0KLSUgU2VjdGlvbiB0aXRsZXMuCi1cbmV3c2tpcFxzZWNoZWFkaW5nc2tpcAotXGRlZlxzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHNlY2hlYWRpbmdza2lwIHstMTAwMH19Ci1cZGVmXHNlY2hlYWRpbmcjMSMyIzN7XHNlY3Rpb25oZWFkaW5ne3NlY317IzIuIzN9eyMxfX0KLVxkZWZccGxhaW5zZWNoZWFkaW5nIzF7XHNlY3Rpb25oZWFkaW5ne3NlY317fXsjMX19Ci0KLSUgU3Vic2VjdGlvbiB0aXRsZXMuCi1cbmV3c2tpcCBcc3Vic2VjaGVhZGluZ3NraXAKLVxkZWZcc3Vic2VjaGVhZGluZ2JyZWFre1xkb2JyZWFrIFxzdWJzZWNoZWFkaW5nc2tpcCB7LTUwMH19Ci1cZGVmXHN1YnNlY2hlYWRpbmcjMSMyIzMjNHtcc2VjdGlvbmhlYWRpbmd7c3Vic2VjfXsjMi4jMy4jNH17IzF9fQotXGRlZlxwbGFpbnN1YnNlY2hlYWRpbmcjMXtcc2VjdGlvbmhlYWRpbmd7c3Vic2VjfXt9eyMxfX0KLQotJSBTdWJzdWJzZWN0aW9uIHRpdGxlcy4KLVxsZXRcc3Vic3Vic2VjaGVhZGluZ3NraXAgPSBcc3Vic2VjaGVhZGluZ3NraXAKLVxsZXRcc3Vic3Vic2VjaGVhZGluZ2JyZWFrID0gXHN1YnNlY2hlYWRpbmdicmVhawotXGRlZlxzdWJzdWJzZWNoZWFkaW5nIzEjMiMzIzQjNXtcc2VjdGlvbmhlYWRpbmd7c3Vic3Vic2VjfXsjMi4jMy4jNC4jNX17IzF9fQotXGRlZlxwbGFpbnN1YnN1YnNlY2hlYWRpbmcjMXtcc2VjdGlvbmhlYWRpbmd7c3Vic3Vic2VjfXt9eyMxfX0KLQotCi0lIFByaW50IGFueSBzaXplIHNlY3Rpb24gdGl0bGUuCi0lCi0lICMxIGlzIHRoZSBzZWN0aW9uIHR5cGUgKHNlYy9zdWJzZWMvc3Vic3Vic2VjKSwgIzIgaXMgdGhlIHNlY3Rpb24KLSUgbnVtYmVyIChtYXliZSBlbXB0eSksICMzIHRoZSB0ZXh0LgotXGRlZlxzZWN0aW9uaGVhZGluZyMxIzIjM3slCi0gIHslCi0gICAgXGV4cGFuZGFmdGVyXGFkdmFuY2VcY3NuYW1lICMxaGVhZGluZ3NraXBcZW5kY3NuYW1lIGJ5IFxwYXJza2lwCi0gICAgXGNzbmFtZSAjMWhlYWRpbmdicmVha1xlbmRjc25hbWUKLSAgfSUKLSAgeyUKLSAgICAlIFN3aXRjaCB0byB0aGUgcmlnaHQgc2V0IG9mIGZvbnRzLgotICAgIFxjc25hbWUgIzFmb250c1xlbmRjc25hbWUgXHJtCi0gICAgJQotICAgICUgT25seSBpbnNlcnQgdGhlIHNlcGFyYXRpbmcgc3BhY2UgaWYgd2UgaGF2ZSBhIHNlY3Rpb24gbnVtYmVyLgotICAgIFxkZWZcc2VjbnVteyMyfSUKLSAgICBcc2V0Ym94MCA9IFxoYm94eyMyXGlmeFxzZWNudW1cZW1wdHlcZWxzZVxlbnNwYWNlXGZpfSUKLSAgICAlCi0gICAgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDAgXHRvbGVyYW5jZT01MDAwIFxwYXJpbmRlbnQ9MHB0IFxyYWdnZWRyaWdodAotICAgICAgICAgIFxoYW5naW5kZW50ID0gXHdkMCAlIHplcm8gaWYgbm8gc2VjdGlvbiBudW1iZXIKLSAgICAgICAgICBcdW5oYm94MCAjM30lCi0gIH0lCi0gIFxpZmRpbVxwYXJza2lwPDEwcHQgXG5vYnJlYWtca2VybjEwcHRcbm9icmVha1xrZXJuLVxwYXJza2lwXGZpIFxub2JyZWFrCi19Ci0KLQotXG1lc3NhZ2V7dG9jLH0KLVxuZXd3cml0ZVx0b2NmaWxlCi0KLSUgV3JpdGUgYW4gZW50cnkgdG8gdGhlIHRvYyBmaWxlLCBvcGVuaW5nIGl0IGlmIG5lY2Vzc2FyeS4KLSUgQ2FsbGVkIGZyb20gQGNoYXB0ZXIsIGV0Yy4gIFdlIHN1cHBseSB7XGZvbGlvfSBhdCB0aGUgZW5kIG9mIHRoZQotJSBhcmd1bWVudCwgd2hpY2ggd2lsbCBlbmQgdXAgYXMgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlIFwuLi5lbnRyeSBtYWNyby4KLSUgCi0lIFdlIG9wZW4gdGhlIC50b2MgZmlsZSBoZXJlIGluc3RlYWQgb2YgYXQgQHNldGZpbGVuYW1lIG9yIGFueSBvdGhlcgotJSBnaXZlbiB0aW1lIHNvIHRoYXQgQGNvbnRlbnRzIGNhbiBiZSBwdXQgaW4gdGhlIGRvY3VtZW50IGFueXdoZXJlLgotJSAKLVxuZXdpZlxpZnRvY2ZpbGVvcGVuZWQKLVxkZWZcd3JpdGV0b2NlbnRyeSMxeyUKLSAgXGlmdG9jZmlsZW9wZW5lZFxlbHNlCi0gICAgXGltbWVkaWF0ZVxvcGVub3V0XHRvY2ZpbGUgPSBcam9ibmFtZS50b2MKLSAgICBcZ2xvYmFsXHRvY2ZpbGVvcGVuZWR0cnVlCi0gIFxmaQotICBcaWZsaW5rcyBcd3JpdGVcdG9jZmlsZXsjMXtcZm9saW99fVxmaQotfQotCi1cbmV3c2tpcFxjb250ZW50c3JpZ2h0bWFyZ2luIFxjb250ZW50c3JpZ2h0bWFyZ2luPTFpbgotXG5ld2NvdW50XHNhdmVwYWdlbm8KLVxuZXdjb3VudFxsYXN0bmVnYXRpdmVwYWdlbm8gXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IC0xCi0KLSUgRmluaXNoIHVwIHRoZSBtYWluIHRleHQgYW5kIHByZXBhcmUgdG8gcmVhZCB3aGF0IHdlJ3ZlIHdyaXR0ZW4KLSUgdG8gXHRvY2ZpbGUuCi0lIAotXGRlZlxzdGFydGNvbnRlbnRzIzF7JQotICAgJSBJZiBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb24sIGFuZCBAaGVhZGluZ3MgZG91YmxlLCB0aGUgY29udGVudHMgc2hvdWxkCi0gICAlIHN0YXJ0IG9uIGFuIG9kZCBwYWdlLCB1bmxpa2UgY2hhcHRlcnMuICBUaHVzLCB3ZSBtYWludGFpbgotICAgJSBcY29udGVudHNhbGlnbm1hY3JvIGluIHBhcmFsbGVsIHdpdGggXHBhZ2VhbGlnbm1hY3JvLgotICAgJSBGcm9tOiBUb3Jiam9ybiBHcmFubHVuZCA8dGVnZUBtYXRlbWF0aWsuc3Uuc2U+Ci0gICBcY29udGVudHNhbGlnbm1hY3JvCi0gICBcaW1tZWRpYXRlXGNsb3Nlb3V0XHRvY2ZpbGUKLSAgICUKLSAgICUgRG9uJ3QgbmVlZCB0byBwdXQgYENvbnRlbnRzJyBvciBgU2hvcnQgQ29udGVudHMnIGluIHRoZSBoZWFkbGluZS4KLSAgICUgSXQgaXMgYWJ1bmRhbnRseSBjbGVhciB3aGF0IHRoZXkgYXJlLgotICAgXHVubnVtYmNoYXBtYWNyb3sjMX1cZGVmXHRoaXNjaGFwdGVye30lCi0gICBcc2F2ZXBhZ2VubyA9IFxwYWdlbm8KLSAgIFxiZWdpbmdyb3VwICAgICAgICAgICAgICAgICAgJSBTZXQgdXAgdG8gaGFuZGxlIGNvbnRlbnRzIGZpbGVzIHByb3Blcmx5LgotICAgICAgXGNhdGNvZGVgXFw9MCAgXGNhdGNvZGVgXHs9MSAgXGNhdGNvZGVgXH09MiAgXGNhdGNvZGVgXEA9MTEKLSAgICAgICUgV2UgY2FuJ3QgZG8gdGhpcywgYmVjYXVzZSB0aGVuIGFuIGFjdHVhbCBeIGluIGEgc2VjdGlvbgotICAgICAgJSB0aXRsZSBmYWlscywgZS5nLiwgQGNoYXB0ZXIgXiAtLSBleHBvbmVudGlhdGlvbi4gIC0ta2FybCwgOWp1bDk3LgotICAgICAgJVxjYXRjb2RlYFxePTcgJSB0byBzZWUgXl5lNCBhcyBcImEgZXRjLiBqdWhhQHBpdWhhLnlkaS52dHQuZmkKLSAgICAgIFxyYWdnZWRib3R0b20gICAgICAgICAgICAgJSBXb3JyeSBtb3JlIGFib3V0IGJyZWFrcG9pbnRzIHRoYW4gdGhlIGJvdHRvbS4KLSAgICAgIFxhZHZhbmNlXGhzaXplIGJ5IC1cY29udGVudHNyaWdodG1hcmdpbiAlIERvbid0IHVzZSB0aGUgZnVsbCBsaW5lIGxlbmd0aC4KLSAgICAgICUKLSAgICAgICUgUm9tYW4gbnVtZXJhbHMgZm9yIHBhZ2UgbnVtYmVycy4KLSAgICAgIFxpZm51bSBccGFnZW5vPjAgXHBhZ2VubyA9IFxsYXN0bmVnYXRpdmVwYWdlbm8gXGZpCi19Ci0KLQotJSBOb3JtYWwgKGxvbmcpIHRvYy4KLVxkZWZcY29udGVudHN7JQotICAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRUYWJsZW9mQ29udGVudHN9JQotICAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCi0gICAgIFxpZmVvZiAxIFxlbHNlCi0gICAgICAgXGNsb3NlaW4gMQotICAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKLSAgICAgXGZpCi0gICAgIFx2ZmlsbCBcZWplY3QKLSAgIFxlbmRncm91cAotICAgXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IFxwYWdlbm8KLSAgIFxwYWdlbm8gPSBcc2F2ZXBhZ2VubwotfQotCi0lIEFuZCBqdXN0IHRoZSBjaGFwdGVycy4KLVxkZWZcc3VtbWFyeWNvbnRlbnRzeyUKLSAgIFxzdGFydGNvbnRlbnRze1xwdXR3b3JkU2hvcnRDb250ZW50c30lCi0gICAgICAlCi0gICAgICBcbGV0XGNoYXBlbnRyeSA9IFxzaG9ydGNoYXBlbnRyeQotICAgICAgXGxldFx1bm51bWJjaGFwZW50cnkgPSBcc2hvcnR1bm51bWJlcmVkZW50cnkKLSAgICAgICUgV2Ugd2FudCBhIHRydWUgcm9tYW4gaGVyZSBmb3IgdGhlIHBhZ2UgbnVtYmVycy4KLSAgICAgIFxzZWNmb250cwotICAgICAgXGxldFxybT1cc2hvcnRjb250cm0gXGxldFxiZj1cc2hvcnRjb250YmYgXGxldFxzbD1cc2hvcnRjb250c2wKLSAgICAgIFxybQotICAgICAgXGh5cGhlbnBlbmFsdHkgPSAxMDAwMAotICAgICAgXGFkdmFuY2VcYmFzZWxpbmVza2lwIGJ5IDFwdCAlIE9wZW4gaXQgdXAgYSBsaXR0bGUuCi0gICAgICBcZGVmXHNlY2VudHJ5ICMjMSMjMiMjMyMjNHt9Ci0gICAgICBcZGVmXHVubnVtYnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcZGVmXHN1YnNlY2VudHJ5ICMjMSMjMiMjMyMjNCMjNXt9Ci0gICAgICBcZGVmXHVubnVtYnN1YnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcZGVmXHN1YnN1YnNlY2VudHJ5ICMjMSMjMiMjMyMjNCMjNSMjNnt9Ci0gICAgICBcZGVmXHVubnVtYnN1YnN1YnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCi0gICAgICBcaWZlb2YgMSBcZWxzZQotICAgICAgICBcY2xvc2VpbiAxCi0gICAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKLSAgICAgIFxmaQotICAgICBcdmZpbGwgXGVqZWN0Ci0gICBcZW5kZ3JvdXAKLSAgIFxsYXN0bmVnYXRpdmVwYWdlbm8gPSBccGFnZW5vCi0gICBccGFnZW5vID0gXHNhdmVwYWdlbm8KLX0KLVxsZXRcc2hvcnRjb250ZW50cyA9IFxzdW1tYXJ5Y29udGVudHMKLQotJSBUaGVzZSBtYWNyb3MgZ2VuZXJhdGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBjb250ZW50cy4KLSUgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjaGFwdGVyIG9yIHNlY3Rpb24gbmFtZS4KLSUgVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHBhZ2UgbnVtYmVyLgotJSBUaGUgYXJndW1lbnRzIGluIGJldHdlZW4gYXJlIHRoZSBjaGFwdGVyIG51bWJlciwgc2VjdGlvbiBudW1iZXIsIC4uLgotCi0lIENoYXB0ZXItbGV2ZWwgdGhpbmdzLCBmb3IgYm90aCB0aGUgbG9uZyBhbmQgc2hvcnQgY29udGVudHMuCi1cZGVmXGNoYXBlbnRyeSMxIzIjM3tcZG9jaGFwZW50cnl7IzJcbGFiZWxzcGFjZSMxfXsjM319Ci0KLSUgU2VlIGNvbW1lbnRzIGluIFxkb2NoYXBlbnRyeSByZSB2Ym94IGFuZCByZWxhdGVkIHNldHRpbmdzCi1cZGVmXHNob3J0Y2hhcGVudHJ5IzEjMiMzeyUKLSAgXHRvY2VudHJ5e1xzaG9ydGNoYXBsYWJlbHsjMn1cbGFiZWxzcGFjZSAjMX17XGRvc2hvcnRwYWdlbm97IzN9fSUKLX0KLQotJSBUeXBlc2V0IHRoZSBsYWJlbCBmb3IgYSBjaGFwdGVyIG9yIGFwcGVuZGl4IGZvciB0aGUgc2hvcnQgY29udGVudHMuCi0lIFRoZSBhcmcgaXMsIGUuZy4gYEFwcGVuZGl4IEEnIGZvciBhbiBhcHBlbmRpeCwgb3IgYDMnIGZvciBhIGNoYXB0ZXIuCi0lIFdlIGNvdWxkIHNpbXBsaWZ5IHRoZSBjb2RlIGhlcmUgYnkgd3JpdGluZyBvdXQgYW4gXGFwcGVuZGl4ZW50cnkKLSUgY29tbWFuZCBpbiB0aGUgdG9jIGZpbGUgZm9yIGFwcGVuZGljZXMsIGluc3RlYWQgb2YgdXNpbmcgXGNoYXBlbnRyeQotJSBmb3IgYm90aCwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aCBpdC4KLVxzZXRib3gwID0gXGhib3h7XHNob3J0Y29udHJtIFxwdXR3b3JkQXBwZW5kaXggfQotXG5ld2RpbWVuXHNob3J0YXBwZW5kaXh3aWR0aCBcc2hvcnRhcHBlbmRpeHdpZHRoID0gXHdkMAotCi1cZGVmXHNob3J0Y2hhcGxhYmVsIzF7JQotICAlIFdlIHR5cGVzZXQgIzEgaW4gYSBib3ggb2YgY29uc3RhbnQgd2lkdGgsIHJlZ2FyZGxlc3Mgb2YgdGhlIHRleHQgb2YKLSAgJSAjMSwgc28gdGhlIGNoYXB0ZXIgdGl0bGVzIHdpbGwgY29tZSBvdXQgYWxpZ25lZC4KLSAgXHNldGJveDAgPSBcaGJveHsjMX0lCi0gIFxkaW1lbjAgPSBcaWZkaW1cd2QwID4gXHNob3J0YXBwZW5kaXh3aWR0aCBcc2hvcnRhcHBlbmRpeHdpZHRoIFxlbHNlIDBwdCBcZmkKLSAgJQotICAlIFRoaXMgc3BhY2Ugc2hvdWxkIGJlIHBsZW50eSwgc2luY2UgYSBzaW5nbGUgbnVtYmVyIGlzIC41ZW0sIGFuZCB0aGUKLSAgJSB3aWRlc3QgbGV0dGVyIChNKSBpcyAxZW0sIGF0IGxlYXN0IGluIHRoZSBDb21wdXRlciBNb2Rlcm4gZm9udHMuCi0gICUgKFRoaXMgc3BhY2UgZG9lc24ndCBpbmNsdWRlIHRoZSBleHRyYSBzcGFjZSB0aGF0IGdldHMgYWRkZWQgYWZ0ZXIKLSAgJSB0aGUgbGFiZWw7IHRoYXQgZ2V0cyBwdXQgaW4gYnkgXHNob3J0Y2hhcGVudHJ5IGFib3ZlLikKLSAgXGFkdmFuY2VcZGltZW4wIGJ5IDEuMWVtCi0gIFxoYm94IHRvIFxkaW1lbjB7IzFcaGZpbH0lCi19Ci0KLVxkZWZcdW5udW1iY2hhcGVudHJ5IzEjMntcZG9jaGFwZW50cnl7IzF9eyMyfX0KLVxkZWZcc2hvcnR1bm51bWJlcmVkZW50cnkjMSMye1x0b2NlbnRyeXsjMX17XGRvc2hvcnRwYWdlbm97IzJ9fX0KLQotJSBTZWN0aW9ucy4KLVxkZWZcc2VjZW50cnkjMSMyIzMjNHtcZG9zZWNlbnRyeXsjMi4jM1xsYWJlbHNwYWNlIzF9eyM0fX0KLVxkZWZcdW5udW1ic2VjZW50cnkjMSMye1xkb3NlY2VudHJ5eyMxfXsjMn19Ci0KLSUgU3Vic2VjdGlvbnMuCi1cZGVmXHN1YnNlY2VudHJ5IzEjMiMzIzQjNXtcZG9zdWJzZWNlbnRyeXsjMi4jMy4jNFxsYWJlbHNwYWNlIzF9eyM1fX0KLVxkZWZcdW5udW1ic3Vic2VjZW50cnkjMSMye1xkb3N1YnNlY2VudHJ5eyMxfXsjMn19Ci0KLSUgQW5kIHN1YnN1YnNlY3Rpb25zLgotXGRlZlxzdWJzdWJzZWNlbnRyeSMxIzIjMyM0IzUjNnslCi0gIFxkb3N1YnN1YnNlY2VudHJ5eyMyLiMzLiM0LiM1XGxhYmVsc3BhY2UjMX17IzZ9fQotXGRlZlx1bm51bWJzdWJzdWJzZWNlbnRyeSMxIzJ7XGRvc3Vic3Vic2VjZW50cnl7IzF9eyMyfX0KLQotJSBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHZhcmlvdXMgbGV2ZWxzLgotXG5ld2RpbWVuXHRvY2luZGVudCBcdG9jaW5kZW50ID0gM3BjCi0KLSUgTm93IGZvciB0aGUgYWN0dWFsIHR5cGVzZXR0aW5nLiBJbiBhbGwgdGhlc2UsICMxIGlzIHRoZSB0ZXh0IGFuZCAjMiBpcyB0aGUKLSUgcGFnZSBudW1iZXIuCi0lCi0lIElmIHRoZSB0b2MgaGFzIHRvIGJlIGJyb2tlbiBvdmVyIHBhZ2VzLCB3ZSB3YW50IGl0IHRvIGJlIGF0IGNoYXB0ZXJzCi0lIGlmIGF0IGFsbCBwb3NzaWJsZTsgaGVuY2UgdGhlIFxwZW5hbHR5LgotXGRlZlxkb2NoYXBlbnRyeSMxIzJ7JQotICAgXHBlbmFsdHktMzAwIFx2c2tpcDFcYmFzZWxpbmVza2lwIHBsdXMuMzNcYmFzZWxpbmVza2lwIG1pbnVzLjI1XGJhc2VsaW5lc2tpcAotICAgXGJlZ2luZ3JvdXAKLSAgICAgXGNoYXBlbnRyeWZvbnRzCi0gICAgIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5veyMyfX0lCi0gICBcZW5kZ3JvdXAKLSAgIFxub2JyZWFrXHZza2lwIC4yNVxiYXNlbGluZXNraXAgcGx1cy4xXGJhc2VsaW5lc2tpcAotfQotCi1cZGVmXGRvc2VjZW50cnkjMSMye1xiZWdpbmdyb3VwCi0gIFxzZWNlbnRyeWZvbnRzIFxsZWZ0c2tpcD1cdG9jaW5kZW50Ci0gIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5veyMyfX0lCi1cZW5kZ3JvdXB9Ci0KLVxkZWZcZG9zdWJzZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHN1YnNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPTJcdG9jaW5kZW50Ci0gIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5veyMyfX0lCi1cZW5kZ3JvdXB9Ci0KLVxkZWZcZG9zdWJzdWJzZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHN1YnN1YnNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPTNcdG9jaW5kZW50Ci0gIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5veyMyfX0lCi1cZW5kZ3JvdXB9Ci0KLSUgRmluYWwgdHlwZXNldHRpbmcgb2YgYSB0b2MgZW50cnk7IHdlIHVzZSB0aGUgc2FtZSBcZW50cnkgbWFjcm8gYXMgZm9yCi0lIHRoZSBpbmRleCBlbnRyaWVzLCBidXQgd2Ugd2FudCB0byBzdXBwcmVzcyBoeXBoZW5hdGlvbiBoZXJlLiAgKFdlCi0lIGNhbid0IGRvIHRoYXQgaW4gdGhlIFxlbnRyeSBtYWNybywgc2luY2UgaW5kZXggZW50cmllcyBtaWdodCBjb25zaXN0Ci0lIG9mIGh5cGhlbmF0ZWQtaWRlbnRpZmllcnMtdGhhdC1kby1ub3QtZml0LW9uLWEtbGluZS1hbmQtbm90aGluZy1lbHNlLikKLVxkZWZcdG9jZW50cnkjMSMye1xiZWdpbmdyb3VwCi0gIFx2c2tpcCAwcHQgcGx1czFwdCAlIGFsbG93IGEgbGl0dGxlIHN0cmV0Y2ggZm9yIHRoZSBzYWtlIG9mIG5pY2UgcGFnZSBicmVha3MKLSAgJSBEbyBub3QgdXNlIFx0dXJub2ZmYWN0aXZlIGluIHRoZXNlIGFyZ3VtZW50cy4gIFNpbmNlIHRoZSB0b2MgaXMKLSAgJSB0eXBlc2V0IGluIGNtciwgc28gY2hhcmFjdGVycyBzdWNoIGFzIF8gd291bGQgY29tZSBvdXQgd3Jvbmc7IHdlCi0gICUgaGF2ZSB0byBkbyB0aGUgdXN1YWwgdHJhbnNsYXRpb24gdHJpY2tzLgotICBcZW50cnl7IzF9eyMyfSUKLVxlbmRncm91cH0KLQotJSBTcGFjZSBiZXR3ZWVuIGNoYXB0ZXIgKG9yIHdoYXRldmVyKSBudW1iZXIgYW5kIHRoZSB0aXRsZS4KLVxkZWZcbGFiZWxzcGFjZXtcaHNraXAxZW0gXHJlbGF4fQotCi1cZGVmXGRvcGFnZW5vIzF7e1xybSAjMX19Ci1cZGVmXGRvc2hvcnRwYWdlbm8jMXt7XHJtICMxfX0KLQotXGRlZlxjaGFwZW50cnlmb250c3tcc2VjZm9udHMgXHJtfQotXGRlZlxzZWNlbnRyeWZvbnRze1x0ZXh0Zm9udHN9Ci1cbGV0XHN1YnNlY2VudHJ5Zm9udHMgPSBcdGV4dGZvbnRzCi1cbGV0XHN1YnN1YnNlY2VudHJ5Zm9udHMgPSBcdGV4dGZvbnRzCi0KLQotXG1lc3NhZ2V7ZW52aXJvbm1lbnRzLH0KLQotJSBTaW5jZSB0aGVzZSBjaGFyYWN0ZXJzIGFyZSB1c2VkIGluIGV4YW1wbGVzLCBpdCBzaG91bGQgYmUgYW4gZXZlbiBudW1iZXIgb2YKLSUgXHR0IHdpZHRocy4gRWFjaCBcdHQgY2hhcmFjdGVyIGlzIDFlbiwgc28gdHdvIG1ha2VzIGl0IDFlbS4KLSUgRnVydGhlcm1vcmUsIHRoZXNlIGRlZmluaXRpb25zIG11c3QgY29tZSBhZnRlciB3ZSBkZWZpbmUgb3VyIGZvbnRzLgotXG5ld2JveFxkYmxhcnJvd2JveCAgICBcbmV3Ym94XGxvbmdkYmxhcnJvd2JveAotXG5ld2JveFxwdXNoY2hhcmJveCAgICBcbmV3Ym94XGJ1bGxib3gKLVxuZXdib3hcZXF1aXZib3ggICAgICAgXG5ld2JveFxlcnJvcmJveAotCi0le1x0ZW50dAotJVxnbG9iYWxcc2V0Ym94XGRibGFycm93Ym94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxSaWdodGFycm93JFxoZmlsfQotJVxnbG9iYWxcc2V0Ym94XGxvbmdkYmxhcnJvd2JveCA9IFxoYm94IHRvIDFlbXtcaGZpbCRcbWFwc3RvJFxoZmlsfQotJVxnbG9iYWxcc2V0Ym94XHB1c2hjaGFyYm94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxkYXNodiRcaGZpbH0KLSVcZ2xvYmFsXHNldGJveFxlcXVpdmJveCA9IFxoYm94IHRvIDFlbXtcaGZpbCRccHRleGVxdWl2JFxoZmlsfQotJSBBZGFwdGVkIGZyb20gdGhlIG1hbm1hYyBmb3JtYXQgKHAuNDIwIG9mIFRlWGJvb2spCi0lXGdsb2JhbFxzZXRib3hcYnVsbGJveCA9IFxoYm94IHRvIDFlbXtca2Vybi4xNWVtXHZydWxlIGhlaWdodCAuNzVleCB3aWR0aCAuODVleAotJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggLjFleFxoZmlsfQotJX0KLQotJSBAcG9pbnR7fSwgQHJlc3VsdHt9LCBAZXhwYW5zaW9ue30sIEBwcmludHt9LCBAZXF1aXZ7fS4KLVxkZWZccG9pbnR7JFxzdGFyJH0KLVxkZWZccmVzdWx0e1xsZWF2ZXZtb2RlXHJhaXNlLjE1ZXhcaGJveCB0byAxZW17XGhmaWwkXFJpZ2h0YXJyb3ckXGhmaWx9fQotXGRlZlxleHBhbnNpb257XGxlYXZldm1vZGVccmFpc2UuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxtYXBzdG8kXGhmaWx9fQotXGRlZlxwcmludHtcbGVhdmV2bW9kZVxsb3dlci4xZXhcaGJveCB0byAxZW17XGhmaWwkXGRhc2h2JFxoZmlsfX0KLVxkZWZcZXF1aXZ7XGxlYXZldm1vZGVcbG93ZXIuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxwdGV4ZXF1aXYkXGhmaWx9fQotCi0lIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaydzIFxib3hpdC4KLXtcdGVudHQgXGdsb2JhbFxkaW1lbjAgPSAzZW19JSBXaWR0aCBvZiB0aGUgYm94LgotXGRpbWVuMiA9IC41NXB0ICUgVGhpY2tuZXNzIG9mIHJ1bGVzCi0lIFRoZSB0ZXh0LiAoYHInIGlzIG9wZW4gb24gdGhlIHJpZ2h0LCBgZScgc29tZXdoYXQgbGVzcyBzbyBvbiB0aGUgbGVmdC4pCi1cc2V0Ym94MCA9IFxoYm94e1xrZXJuLS43NXB0IFx0ZW5zZiBlcnJvclxrZXJuLTEuNXB0fQotCi1cZ2xvYmFsXHNldGJveFxlcnJvcmJveD1caGJveCB0byBcZGltZW4we1xoZmlsCi0gICBcaHNpemUgPSBcZGltZW4wIFxhZHZhbmNlXGhzaXplIGJ5IC01LjhwdCAlIFNwYWNlIHRvIGxlZnQrcmlnaHQuCi0gICBcYWR2YW5jZVxoc2l6ZSBieSAtMlxkaW1lbjIgJSBSdWxlcy4KLSAgIFx2Ym94ewotICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjIKLSAgICAgIFxoYm94e1x2cnVsZSB3aWR0aFxkaW1lbjIgXGtlcm4zcHQgICAgICAgICAgJSBTcGFjZSB0byBsZWZ0IG9mIHRleHQuCi0gICAgICAgICBcdnRvcHtca2VybjIuNHB0IFxib3gwIFxrZXJuMi40cHR9JSBTcGFjZSBhYm92ZS9iZWxvdy4KLSAgICAgICAgIFxrZXJuM3B0XHZydWxlIHdpZHRoXGRpbWVuMn0lIFNwYWNlIHRvIHJpZ2h0LgotICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjJ9Ci0gICAgXGhmaWx9Ci0KLSUgVGhlIEBlcnJvcnt9IGNvbW1hbmQuCi1cZGVmXGVycm9ye1xsZWF2ZXZtb2RlXGxvd2VyLjdleFxjb3B5XGVycm9yYm94fQotCi0lIEB0ZXggLi4uIEBlbmQgdGV4ICAgIGVzY2FwZXMgaW50byByYXcgVGV4IHRlbXBvcmFyaWx5LgotJSBPbmUgZXhjZXB0aW9uOiBAIGlzIHN0aWxsIGFuIGVzY2FwZSBjaGFyYWN0ZXIsIHNvIHRoYXQgQGVuZCB0ZXggd29ya3MuCi0lIEJ1dCBcQCBvciBAQCB3aWxsIGdldCBhIHBsYWluIHRleCBAIGNoYXJhY3Rlci4KLQotXGRlZlx0ZXh7XGJlZ2luZ3JvdXAKLSAgXGNhdGNvZGUgYFxcPTAgXGNhdGNvZGUgYFx7PTEgXGNhdGNvZGUgYFx9PTIKLSAgXGNhdGNvZGUgYFwkPTMgXGNhdGNvZGUgYFwmPTQgXGNhdGNvZGUgYFwjPTYKLSAgXGNhdGNvZGUgYFxePTcgXGNhdGNvZGUgYFxfPTggXGNhdGNvZGUgYFx+PTEzIFxsZXR+PVx0aWUKLSAgXGNhdGNvZGUgYFwlPTE0Ci0gIFxjYXRjb2RlIDQzPTEyICUgcGx1cwotICBcY2F0Y29kZWBcIj0xMgotICBcY2F0Y29kZWBcPT0xMgotICBcY2F0Y29kZWBcfD0xMgotICBcY2F0Y29kZWBcPD0xMgotICBcY2F0Y29kZWBcPj0xMgotICBcZXNjYXBlY2hhcj1gXFwKLSAgJQotICBcbGV0XGI9XHB0ZXhiCi0gIFxsZXRcYnVsbGV0PVxwdGV4YnVsbGV0Ci0gIFxsZXRcYz1ccHRleGMKLSAgXGxldFwsPVxwdGV4Y29tbWEKLSAgXGxldFwuPVxwdGV4ZG90Ci0gIFxsZXRcZG90cz1ccHRleGRvdHMKLSAgXGxldFxlcXVpdj1ccHRleGVxdWl2Ci0gIFxsZXRcIT1ccHRleGV4Y2xhbQotICBcbGV0XGk9XHB0ZXhpCi0gIFxsZXRcez1ccHRleGxicmFjZQotICBcbGV0XCs9XHRhYmFsaWduCi0gIFxsZXRcfT1ccHRleHJicmFjZQotICBcbGV0XCo9XHB0ZXhzdGFyCi0gIFxsZXRcdD1ccHRleHQKLSAgJQotICBcZGVmXGVuZGxkb3Rze1xtYXRoaW5uZXJ7XGxkb3RzXGxkb3RzXGxkb3RzXGxkb3RzfX0lCi0gIFxkZWZcZW5kZG90c3tccmVsYXhcaWZtbW9kZVxlbmRsZG90c1xlbHNlJFxtYXRoc3Vycm91bmQ9MHB0IFxlbmRsZG90c1wsJFxmaX0lCi0gIFxkZWZcQHtAfSUKLVxsZXRcRXRleD1cZW5kZ3JvdXB9Ci0KLSUgRGVmaW5lIEBsaXNwIC4uLiBAZW5kbGlzcC4KLSUgQGxpc3AgZG9lcyBhIFxiZWdpbmdyb3VwIHNvIGl0IGNhbiByZWJpbmQgdGhpbmdzLAotJSBpbmNsdWRpbmcgdGhlIGRlZmluaXRpb24gb2YgQGVuZGxpc3AgKHdoaWNoIG5vcm1hbGx5IGlzIGVycm9uZW91cykuCi0KLSUgQW1vdW50IHRvIG5hcnJvdyB0aGUgbWFyZ2lucyBieSBmb3IgQGxpc3AuCi1cbmV3c2tpcFxsaXNwbmFycm93aW5nIFxsaXNwbmFycm93aW5nPTAuNGluCi0KLSUgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiB0aGF0IF5eTSBnZXRzIGluc2lkZSBAbGlzcCwgQGV4YW1wbGUsIGFuZCBvdGhlcgotJSBzdWNoIGVudmlyb25tZW50cy4gIFxudWxsIGlzIGJldHRlciB0aGFuIGEgc3BhY2UsIHNpbmNlIGl0IGRvZXNuJ3QKLSUgaGF2ZSBhbnkgd2lkdGguCi1cZGVmXGxpc3BwYXJ7XG51bGxcZW5kZ3JhZn0KLQotJSBNYWtlIGVhY2ggc3BhY2UgY2hhcmFjdGVyIGluIHRoZSBpbnB1dCBwcm9kdWNlIGEgbm9ybWFsIGludGVyd29yZAotJSBzcGFjZSBpbiB0aGUgb3V0cHV0LiAgRG9uJ3QgYWxsb3cgYSBsaW5lIGJyZWFrIGF0IHRoaXMgc3BhY2UsIGFzIHRoaXMKLSUgaXMgdXNlZCBvbmx5IGluIGVudmlyb25tZW50cyBsaWtlIEBleGFtcGxlLCB3aGVyZSBlYWNoIGxpbmUgb2YgaW5wdXQKLSUgc2hvdWxkIHByb2R1Y2UgYSBsaW5lIG9mIG91dHB1dCBhbnl3YXkuCi0lCi17XG9iZXlzcGFjZXMgJQotXGdkZWZcc2Vwc3BhY2Vze1xvYmV5c3BhY2VzXGxldCA9XHRpZX19Ci0KLSUgRGVmaW5lIFxvYmV5ZWRzcGFjZSB0byBiZSBvdXIgYWN0aXZlIHNwYWNlLCB3aGF0ZXZlciBpdCBpcy4gIFRoaXMgaXMKLSUgZm9yIHVzZSBpbiBccGFyc2VhcmcuCi17XHNlcHNwYWNlcyUKLVxnbG9iYWxcbGV0XG9iZXllZHNwYWNlPSB9Ci0KLSUgVGhpcyBzcGFjZSBpcyBhbHdheXMgcHJlc2VudCBhYm92ZSBhbmQgYmVsb3cgZW52aXJvbm1lbnRzLgotXG5ld3NraXBcZW52c2tpcGFtb3VudCBcZW52c2tpcGFtb3VudCA9IDBwdAotCi0lIE1ha2Ugc3BhY2luZyBhbmQgYmVsb3cgZW52aXJvbm1lbnQgc3ltbWV0cmljYWwuICBXZSB1c2UgXHBhcnNraXAgaGVyZQotJSB0byBoZWxwIGluIGRvaW5nIHRoYXQsIHNpbmNlIGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzIFxwYXJza2lwCi0lIGlzIHJlc2V0IHRvIHplcm87IHRodXMgdGhlIFxhZnRlcmVudmJyZWFrIGluc2VydHMgbm8gc3BhY2UgLS0gYnV0IHRoZQotJSBzdGFydCBvZiB0aGUgbmV4dCBwYXJhZ3JhcGggd2lsbCBpbnNlcnQgXHBhcnNraXAKLSUKLVxkZWZcYWJvdmVlbnZicmVha3t7XGFkdmFuY2VcZW52c2tpcGFtb3VudCBieSBccGFyc2tpcAotXGVuZGdyYWYgXGlmZGltXGxhc3Rza2lwPFxlbnZza2lwYW1vdW50Ci1ccmVtb3ZlbGFzdHNraXAgXHBlbmFsdHktNTAgXHZza2lwXGVudnNraXBhbW91bnQgXGZpfX0KLQotXGxldFxhZnRlcmVudmJyZWFrID0gXGFib3ZlZW52YnJlYWsKLQotJSBcbm9uYXJyb3dpbmcgaXMgYSBmbGFnLiAgSWYgInNldCIsIEBsaXNwIGV0YyBkb24ndCBuYXJyb3cgbWFyZ2lucy4KLVxsZXRcbm9uYXJyb3dpbmc9XHJlbGF4Ci0KLSUgQGNhcnRvdWNoZSAuLi4gQGVuZCBjYXJ0b3VjaGU6IGRyYXcgcmVjdGFuZ2xlIHcvcm91bmRlZCBjb3JuZXJzIGFyb3VuZAotJSBlbnZpcm9ubWVudCBjb250ZW50cy4KLVxmb250XGNpcmNsZT1sY2lyY2xlMTAKLVxuZXdkaW1lblxjaXJjdGhpY2sKLVxuZXdkaW1lblxjYXJ0b3V0ZXJcbmV3ZGltZW5cY2FydGlubmVyCi1cbmV3c2tpcFxub3JtYnNraXBcbmV3c2tpcFxub3JtcHNraXBcbmV3c2tpcFxub3JtbHNraXAKLVxjaXJjdGhpY2s9XGZvbnRkaW1lbjhcY2lyY2xlCi0lCi1cZGVmXGN0bHt7XGNpcmNsZVxjaGFyJzAxM1xoc2tpcCAtNnB0fX0lIDZwdCBmcm9tIHBsIGZpbGU6IDEvMmNoYXJ3aWR0aAotXGRlZlxjdHJ7e1xoc2tpcCA2cHRcY2lyY2xlXGNoYXInMDEwfX0KLVxkZWZcY2Jse3tcY2lyY2xlXGNoYXInMDEyXGhza2lwIC02cHR9fQotXGRlZlxjYnJ7e1xoc2tpcCA2cHRcY2lyY2xlXGNoYXInMDExfX0KLVxkZWZcY2FydHRvcHtcaGJveCB0byBcY2FydG91dGVye1xoc2tpcFxsc2tpcAotICAgICAgICBcY3RsXGxlYWRlcnNcaHJ1bGUgaGVpZ2h0XGNpcmN0aGlja1xoZmlsXGN0cgotICAgICAgICBcaHNraXBccnNraXB9fQotXGRlZlxjYXJ0Ym90e1xoYm94IHRvIFxjYXJ0b3V0ZXJ7XGhza2lwXGxza2lwCi0gICAgICAgIFxjYmxcbGVhZGVyc1xocnVsZSBoZWlnaHRcY2lyY3RoaWNrXGhmaWxcY2JyCi0gICAgICAgIFxoc2tpcFxyc2tpcH19Ci0lCi1cbmV3c2tpcFxsc2tpcFxuZXdza2lwXHJza2lwCi0KLVxsb25nXGRlZlxjYXJ0b3VjaGV7JQotXGJlZ2luZ3JvdXAKLSAgICAgICAgXGxza2lwPVxsZWZ0c2tpcCBccnNraXA9XHJpZ2h0c2tpcAotICAgICAgICBcbGVmdHNraXA9MHB0XHJpZ2h0c2tpcD0wcHQgJXdlIHdhbnQgdGhlc2UgKm91dHNpZGUqLgotICAgICAgICBcY2FydGlubmVyPVxoc2l6ZSBcYWR2YW5jZVxjYXJ0aW5uZXIgYnktXGxza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFxhZHZhbmNlXGNhcnRpbm5lciBieS1ccnNraXAKLSAgICAgICAgXGNhcnRvdXRlcj1caHNpemUKLSAgICAgICAgXGFkdmFuY2VcY2FydG91dGVyIGJ5IDE4LjRwdCAlIGFsbG93IGZvciAzcHQga2VybnMgb24gZWl0aGVyCi0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZSwgYW5kIGZvciA2cHQgd2FzdGUgZnJvbQotJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggY29ybmVyIGNoYXIsIGFuZCBydWxlIHRoaWNrbmVzcwotICAgICAgICBcbm9ybWJza2lwPVxiYXNlbGluZXNraXAgXG5vcm1wc2tpcD1ccGFyc2tpcCBcbm9ybWxza2lwPVxsaW5lc2tpcAotICAgICAgICAlIEZsYWcgdG8gdGVsbCBAbGlzcCwgZXRjLiwgbm90IHRvIG5hcnJvdyBtYXJnaW4uCi0gICAgICAgIFxsZXRcbm9uYXJyb3dpbmc9XGNvbW1lbnQKLSAgICAgICAgXHZib3hcYmdyb3VwCi0gICAgICAgICAgICAgICAgXGJhc2VsaW5lc2tpcD0wcHRccGFyc2tpcD0wcHRcbGluZXNraXA9MHB0Ci0gICAgICAgICAgICAgICAgXGNhcnR0b3AKLSAgICAgICAgICAgICAgICBcaGJveFxiZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgIFxoc2tpcFxsc2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgXHZydWxlXGtlcm4zcHQKLSAgICAgICAgICAgICAgICAgICAgICAgIFx2Ym94XGJncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcaHNpemU9XGNhcnRpbm5lcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBca2VybjNwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcYmVnaW5ncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxiYXNlbGluZXNraXA9XG5vcm1ic2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxsaW5lc2tpcD1cbm9ybWxza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHBhcnNraXA9XG5vcm1wc2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx2c2tpcCAtXHBhcnNraXAKLVxkZWZcRWNhcnRvdWNoZXslCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxlbmRncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBca2VybjNwdAotICAgICAgICAgICAgICAgICAgICAgICAgXGVncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgXGtlcm4zcHRcdnJ1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFxoc2tpcFxyc2tpcAotICAgICAgICAgICAgICAgIFxlZ3JvdXAKLSAgICAgICAgICAgICAgICBcY2FydGJvdAotICAgICAgICBcZWdyb3VwCi1cZW5kZ3JvdXAKLX19Ci0KLQotJSBUaGlzIG1hY3JvIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFsbCB0aGUgQGV4YW1wbGUgdmFyaWFudHMsCi0lIGluc2lkZSBhIGdyb3VwLgotXGRlZlxub25maWxsc3RhcnR7JQotICBcYWJvdmVlbnZicmVhawotICBcaW5FTlYgJSBUaGlzIGdyb3VwIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgYm9keQotICBcaGZ1enogPSAxMnB0ICUgRG9uJ3QgYmUgZnVzc3kKLSAgXHNlcHNwYWNlcyAlIE1ha2Ugc3BhY2VzIGJlIHdvcmQtc2VwYXJhdG9ycyByYXRoZXIgdGhhbiBzcGFjZSB0b2tlbnMuCi0gIFxzaW5nbGVzcGFjZQotICBcbGV0XHBhciA9IFxsaXNwcGFyICUgZG9uJ3QgaWdub3JlIGJsYW5rIGxpbmVzCi0gIFxvYmV5bGluZXMgJSBlYWNoIGxpbmUgb2YgaW5wdXQgaXMgYSBsaW5lIG9mIG91dHB1dAotICBccGFyc2tpcCA9IDBwdAotICBccGFyaW5kZW50ID0gMHB0Ci0gIFxlbWVyZ2VuY3lzdHJldGNoID0gMHB0ICUgZG9uJ3QgdHJ5IHRvIGF2b2lkIG92ZXJmdWxsIGJveGVzCi0gICUgQGNhcnRvdWNoZSBkZWZpbmVzIFxub25hcnJvd2luZyB0byBpbmhpYml0IG5hcnJvd2luZwotICAlIGF0IG5leHQgbGV2ZWwgZG93bi4KLSAgXGlmeFxub25hcnJvd2luZ1xyZWxheAotICAgIFxhZHZhbmNlIFxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZwotICAgIFxleGRlbnRhbW91bnQ9XGxpc3BuYXJyb3dpbmcKLSAgICBcbGV0XGV4ZGVudD1cbm9maWxsZXhkZW50Ci0gICAgXGxldFxub25hcnJvd2luZz1ccmVsYXgKLSAgXGZpCi19Ci0KLSUgRGVmaW5lIHRoZSBcRS4uLiBjb250cm9sIHNlcXVlbmNlIG9ubHkgaWYgd2UgYXJlIGluc2lkZSB0aGUgcGFydGljdWxhcgotJSBlbnZpcm9ubWVudCwgc28gdGhlIGVycm9yIGNoZWNraW5nIGluIFxlbmQgd2lsbCB3b3JrLgotJSAKLSUgVG8gZW5kIGFuIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnQsIHdlIGZpcnN0IGVuZCB0aGUgcGFyYWdyYXBoICh2aWEKLSUgXGFmdGVyZW52YnJlYWsncyB2ZXJ0aWNhbCBnbHVlKSwgYW5kIHRoZW4gdGhlIGdyb3VwLiAgVGhhdCB3YXkgd2Uga2VlcAotJSB0aGUgemVybyBccGFyc2tpcCB0aGF0IHRoZSBlbnZpcm9ubWVudHMgc2V0IC0tIFxwYXJza2lwIGdsdWUgd2lsbCBiZQotJSBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHBhcmFncmFwaCBpbiB0aGUgZG9jdW1lbnQsIGFmdGVyCi0lIHRoZSBlbnZpcm9ubWVudC4KLSUKLVxkZWZcbm9uZmlsbGZpbmlzaHtcYWZ0ZXJlbnZicmVha1xlbmRncm91cH0KLQotJSBAbGlzcDogaW5kZW50ZWQsIG5hcnJvd2VkLCB0eXBld3JpdGVyIGZvbnQuCi1cZGVmXGxpc3B7XGJlZ2luZ3JvdXAKLSAgXG5vbmZpbGxzdGFydAotICBcbGV0XEVsaXNwID0gXG5vbmZpbGxmaW5pc2gKLSAgXHR0Ci0gIFxsZXRca2JkZm9udCA9IFxrYmRleGFtcGxlZm9udCAlIEFsbG93IEBrYmQgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwuCi0gIFxnb2JibGUgICAgICAgJSBlYXQgcmV0dXJuCi19Ci0KLSUgQGV4YW1wbGU6IFNhbWUgYXMgQGxpc3AuCi1cZGVmXGV4YW1wbGV7XGJlZ2luZ3JvdXAgXGRlZlxFZXhhbXBsZXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cbGlzcH0KLQotJSBAc21hbGwuLi4gaXMgdXN1YWxseSBlcXVpdmFsZW50IHRvIHRoZSBub24tc21hbGwgKEBzbWFsbGJvb2sKLSUgcmVkZWZpbmVzKS4gIFdlIG11c3QgY2FsbCBcZXhhbXBsZSAob3Igd2hhdGV2ZXIpIGxhc3QgaW4gdGhlCi0lIGRlZmluaXRpb24sIHNpbmNlIGl0IHJlYWRzIHRoZSByZXR1cm4gZm9sbG93aW5nIHRoZSBAZXhhbXBsZSAob3IKLSUgd2hhdGV2ZXIpIGNvbW1hbmQuCi0lIAotJSBUaGlzIGFjdHVhbGx5IGFsbG93cyAoZm9yIGV4YW1wbGUpIEBlbmQgZGlzcGxheSBpbnNpZGUgYW4KLSUgQHNtYWxsZGlzcGxheS4gIFRvbyBiYWQsIGJ1dCBtYWtlaW5mbyB3aWxsIGNhdGNoIHRoZSBlcnJvciBhbnl3YXkuCi0lCi1cZGVmXHNtYWxsZGlzcGxheXtcYmVnaW5ncm91cFxkZWZcRXNtYWxsZGlzcGxheXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cZGlzcGxheX0KLVxkZWZcc21hbGxleGFtcGxle1xiZWdpbmdyb3VwXGRlZlxFc21hbGxleGFtcGxle1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxsaXNwfQotXGRlZlxzbWFsbGZvcm1hdHtcYmVnaW5ncm91cFxkZWZcRXNtYWxsZm9ybWF0e1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxmb3JtYXR9Ci1cZGVmXHNtYWxsbGlzcHtcYmVnaW5ncm91cFxkZWZcRXNtYWxsbGlzcHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cbGlzcH0KLQotJSBSZWFsIEBzbWFsbGV4YW1wbGUgYW5kIEBzbWFsbGxpc3AgKHdoZW4gQHNtYWxsYm9vayk6IHVzZSBzbWFsbGVyIGZvbnRzLgotJSBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IFBhdmVsQHhlcm94LgotXGRlZlxzbWFsbGxpc3B4e1xiZWdpbmdyb3VwCi0gIFxkZWZcRXNtYWxsbGlzcHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH0lCi0gIFxkZWZcRXNtYWxsZXhhbXBsZXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH0lCi0gIFxpbmRleGZvbnRzCi0gIFxsaXNwCi19Ci0KLSUgQGRpc3BsYXk6IHNhbWUgYXMgQGxpc3AgZXhjZXB0IGtlZXAgY3VycmVudCBmb250LgotJQotXGRlZlxkaXNwbGF5e1xiZWdpbmdyb3VwCi0gIFxub25maWxsc3RhcnQKLSAgXGxldFxFZGlzcGxheSA9IFxub25maWxsZmluaXNoCi0gIFxnb2JibGUKLX0KLQotJSBAc21hbGxkaXNwbGF5ICh3aGVuIEBzbWFsbGJvb2spOiBAZGlzcGxheSBwbHVzIHNtYWxsZXIgZm9udHMuCi0lCi1cZGVmXHNtYWxsZGlzcGxheXh7XGJlZ2luZ3JvdXAKLSAgXGRlZlxFc21hbGxkaXNwbGF5e1xub25maWxsZmluaXNoXGVuZGdyb3VwfSUKLSAgXGluZGV4Zm9udHMgXHJtCi0gIFxkaXNwbGF5Ci19Ci0KLSUgQGZvcm1hdDogc2FtZSBhcyBAZGlzcGxheSBleGNlcHQgZG9uJ3QgbmFycm93IG1hcmdpbnMuCi0lCi1cZGVmXGZvcm1hdHtcYmVnaW5ncm91cAotICBcbGV0XG5vbmFycm93aW5nID0gdAotICBcbm9uZmlsbHN0YXJ0Ci0gIFxsZXRcRWZvcm1hdCA9IFxub25maWxsZmluaXNoCi0gIFxnb2JibGUKLX0KLQotJSBAc21hbGxmb3JtYXQgKHdoZW4gQHNtYWxsYm9vayk6IEBmb3JtYXQgcGx1cyBzbWFsbGVyIGZvbnRzLgotJQotXGRlZlxzbWFsbGZvcm1hdHh7XGJlZ2luZ3JvdXAKLSAgXGRlZlxFc21hbGxmb3JtYXR7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9JQotICBcaW5kZXhmb250cyBccm0KLSAgXGZvcm1hdAotfQotCi0lIEBmbHVzaGxlZnQgKHNhbWUgYXMgQGZvcm1hdCkuCi0lCi1cZGVmXGZsdXNobGVmdHtcYmVnaW5ncm91cCBcZGVmXEVmbHVzaGxlZnR7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGZvcm1hdH0KLQotJSBAZmx1c2hyaWdodC4KLSUgCi1cZGVmXGZsdXNocmlnaHR7XGJlZ2luZ3JvdXAKLSAgXGxldFxub25hcnJvd2luZyA9IHQKLSAgXG5vbmZpbGxzdGFydAotICBcbGV0XEVmbHVzaHJpZ2h0ID0gXG5vbmZpbGxmaW5pc2gKLSAgXGFkdmFuY2VcbGVmdHNraXAgYnkgMHB0IHBsdXMgMWZpbGwKLSAgXGdvYmJsZQotfQotCi0lIEBxdW90YXRpb24gZG9lcyBub3JtYWwgbGluZWJyZWFraW5nIChoZW5jZSB3ZSBjYW4ndCB1c2UgXG5vbmZpbGxzdGFydCkKLSUgYW5kIG5hcnJvd3MgdGhlIG1hcmdpbnMuCi0lCi1cZGVmXHF1b3RhdGlvbnslCi0gIFxiZWdpbmdyb3VwXGluRU5WICVUaGlzIGdyb3VwIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgQHF1b3RhdGlvbiBib2R5Ci0gIHtccGFyc2tpcD0wcHQgXGFib3ZlZW52YnJlYWt9JSBiZWNhdXNlIFxhYm92ZWVudmJyZWFrIGluc2VydHMgXHBhcnNraXAKLSAgXHNpbmdsZXNwYWNlCi0gIFxwYXJpbmRlbnQ9MHB0Ci0gICUgV2UgaGF2ZSByZXRhaW5lZCBhIG5vbnplcm8gcGFyc2tpcCBmb3IgdGhlIGVudmlyb25tZW50LCBzaW5jZSB3ZSdyZQotICAlIGRvaW5nIG5vcm1hbCBmaWxsaW5nLiBTbyB0byBhdm9pZCBleHRyYSBzcGFjZSBiZWxvdyB0aGUgZW52aXJvbm1lbnQuLi4KLSAgXGRlZlxFcXVvdGF0aW9ue1xwYXJza2lwID0gMHB0IFxub25maWxsZmluaXNofSUKLSAgJQotICAlIEBjYXJ0b3VjaGUgZGVmaW5lcyBcbm9uYXJyb3dpbmcgdG8gaW5oaWJpdCBuYXJyb3dpbmcgYXQgbmV4dCBsZXZlbCBkb3duLgotICBcaWZ4XG5vbmFycm93aW5nXHJlbGF4Ci0gICAgXGFkdmFuY2VcbGVmdHNraXAgYnkgXGxpc3BuYXJyb3dpbmcKLSAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkgXGxpc3BuYXJyb3dpbmcKLSAgICBcZXhkZW50YW1vdW50ID0gXGxpc3BuYXJyb3dpbmcKLSAgICBcbGV0XG5vbmFycm93aW5nID0gXHJlbGF4Ci0gIFxmaQotfQotCi0KLVxtZXNzYWdle2RlZnVucyx9Ci0lIERlZmluZSBmb3JtYXR0ZXIgZm9yIGRlZnVucwotJSBGaXJzdCwgYWxsb3cgdXNlciB0byBjaGFuZ2UgZGVmaW5pdGlvbiBvYmplY3QgZm9udCAoXGRmKSBpbnRlcm5hbGx5Ci1cZGVmXHNldGRlZmZvbnQgIzEge1xjc25hbWUgREVGIzFcZW5kY3NuYW1lfQotCi1cbmV3c2tpcFxkZWZib2R5aW5kZW50IFxkZWZib2R5aW5kZW50PS40aW4KLVxuZXdza2lwXGRlZmFyZ3NpbmRlbnQgXGRlZmFyZ3NpbmRlbnQ9NTBwdAotXG5ld3NraXBcZGVmdHlwZW1hcmdpbiBcZGVmdHlwZW1hcmdpbj0xMnB0Ci1cbmV3c2tpcFxkZWZsYXN0YXJnbWFyZ2luIFxkZWZsYXN0YXJnbWFyZ2luPTE4cHQKLQotXG5ld2NvdW50XHBhcmVuY291bnQKLSUgZGVmaW5lIFxmdW5jdGlvbnBhcmVucywgd2hpY2ggbWFrZXMgKCBhbmQgKSBhbmQgJiBkbyBzcGVjaWFsIHRoaW5ncy4KLSUgXGZ1bmN0aW9ucGFyZW5zIGFmZmVjdHMgdGhlIGdyb3VwIGl0IGlzIGNvbnRhaW5lZCBpbi4KLVxkZWZcYWN0aXZlcGFyZW5zeyUKLVxjYXRjb2RlYFwoPVxhY3RpdmUgXGNhdGNvZGVgXCk9XGFjdGl2ZSBcY2F0Y29kZWBcJj1cYWN0aXZlCi1cY2F0Y29kZWBcWz1cYWN0aXZlIFxjYXRjb2RlYFxdPVxhY3RpdmV9Ci0KLSUgTWFrZSBjb250cm9sIHNlcXVlbmNlcyB3aGljaCBhY3QgbGlrZSBub3JtYWwgcGFyZW50aGVzaXMgY2hhcnMuCi1cbGV0XGxwYXJlbiA9ICggXGxldFxycGFyZW4gPSApCi0KLXtcYWN0aXZlcGFyZW5zICUgTm93LCBzbWFydCBwYXJlbnMgZG9uJ3QgdHVybiBvbiB1bnRpbCAmZm9vIChzZWUgXGFtcHJtKQotCi0lIEJlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBhIGRlZmluaXRpb24gZm9yIGAoJywgZXRjLiAgRm9yIGV4YW1wbGUsCi0lIGlmIHRoZSBmbiBuYW1lIGhhcyBwYXJlbnMgaW4gaXQsIFxib2xkYnJheCB3aWxsIG5vdCBiZSBpbiBlZmZlY3QgeWV0LAotJSBzbyBUZVggd291bGQgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0IHVuZGVmaW5lZCBjb250cm9sIHNlcXVlbmNlLgotXGdsb2JhbFxsZXQoPVxscGFyZW4gXGdsb2JhbFxsZXQpPVxycGFyZW4KLVxnbG9iYWxcbGV0Wz1cbGJyYWNrIFxnbG9iYWxcbGV0XT1ccmJyYWNrCi0KLVxnZGVmXGZ1bmN0aW9ucGFyZW5ze1xib2xkYnJheFxsZXQmPVxhbXBybVxwYXJlbmNvdW50PTAgfQotXGdkZWZcYm9sZGJyYXh7XGxldCg9XG9wbnJcbGV0KT1cY2xuclxsZXRbPVxsYnJiXGxldF09XHJicmJ9Ci0lIFRoaXMgaXMgdXNlZCB0byB0dXJuIG9uIHNwZWNpYWwgcGFyZW5zCi0lIGJ1dCBtYWtlICYgYWN0IG9yZGluYXJ5IChnaXZlbiB0aGF0IGl0J3MgYWN0aXZlKS4KLVxnZGVmXGJvbGRicmF4bm9hbXB7XGxldCg9XG9wbnJcbGV0KT1cY2xuclxsZXRbPVxsYnJiXGxldF09XHJicmJcbGV0Jj1cYW1wbnJ9Ci0KLSUgRGVmaW5pdGlvbnMgb2YgKCwgKSBhbmQgJiB1c2VkIGluIGFyZ3MgZm9yIGZ1bmN0aW9ucy4KLSUgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBvZiAoIG91dHNpZGUgb2YgYWxsIHBhcmVudGhlc2VzLgotXGdkZWZcb3BybSMxIHt7XHJtXGNoYXJgXCh9IzEgXGJmIFxsZXQoPVxvcG5lc3RlZAotICBcZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxCi19Ci0lCi0lIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgKCB3aGVuIGFscmVhZHkgaW5zaWRlIGEgbGV2ZWwgb2YgcGFyZW5zLgotXGdkZWZcb3BuZXN0ZWR7XGNoYXJgXChcZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxIH0KLSUKLVxnZGVmXGNscm17JSBQcmludCBhIHBhcmVuIGluIHJvbWFuIGlmIGl0IGlzIHRha2luZyB1cyBiYWNrIHRvIGRlcHRoIG9mIDAuCi0gICUgYWxzbyBpbiB0aGF0IGNhc2UgcmVzdG9yZSB0aGUgb3V0ZXItbGV2ZWwgZGVmaW5pdGlvbiBvZiAoLgotICBcaWZudW0gXHBhcmVuY291bnQ9MSB7XHJtIFxjaGFyIGBcKX1cc2wgXGxldCg9XG9wcm0gXGVsc2UgXGNoYXIgYFwpIFxmaQotICBcZ2xvYmFsXGFkdmFuY2UgXHBhcmVuY291bnQgYnkgLTEgfQotJSBJZiB3ZSBlbmNvdW50ZXIgJmZvbywgdGhlbiB0dXJuIG9uICgpLWhhY2tpbmcgYWZ0ZXJ3YXJkcwotXGdkZWZcYW1wcm0jMSB7e1xybVwmIzF9XGxldCg9XG9wcm0gXGxldCk9XGNscm1cIH0KLSUKLVxnZGVmXG5vcm1hbHBhcmVuc3tcYm9sZGJyYXhcbGV0Jj1cYW1wbnJ9Ci19ICUgRW5kIG9mIGRlZmluaXRpb24gaW5zaWRlIFxhY3RpdmVwYXJlbnMKLSUlIFRoZXNlIHBhcmVucyAoaW4gXGJvbGRicmF4KSBhY3R1YWxseSBhcmUgYSBsaXR0bGUgYm9sZGVyIHRoYW4gdGhlCi0lJSBjb250YWluZWQgdGV4dC4gIFRoaXMgaXMgZXNwZWNpYWxseSBuZWVkZWQgZm9yIFsgYW5kIF0KLVxkZWZcb3Bucnt7XHNmXGNoYXJgXCh9XGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgMSB9Ci1cZGVmXGNsbnJ7e1xzZlxjaGFyYFwpfVxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IC0xIH0KLVxkZWZcYW1wbnJ7XCZ9Ci1cZGVmXGxicmJ7e1xiZlxjaGFyYFxbfX0KLVxkZWZccmJyYnt7XGJmXGNoYXJgXF19fQotCi0lIEZpcnN0LCBkZWZuYW1lLCB3aGljaCBmb3JtYXRzIHRoZSBoZWFkZXIgbGluZSBpdHNlbGYuCi0lICMxIHNob3VsZCBiZSB0aGUgZnVuY3Rpb24gbmFtZS4KLSUgIzIgc2hvdWxkIGJlIHRoZSB0eXBlIG9mIGRlZmluaXRpb24sIHN1Y2ggYXMgIkZ1bmN0aW9uIi4KLQotXGRlZlxkZWZuYW1lICMxIzJ7JQotJSBHZXQgdGhlIHZhbHVlcyBvZiBcbGVmdHNraXAgYW5kIFxyaWdodHNraXAgYXMgdGhleSB3ZXJlCi0lIG91dHNpZGUgdGhlIEBkZWYuLi4KLVxkaW1lbjI9XGxlZnRza2lwCi1cYWR2YW5jZVxkaW1lbjIgYnkgLVxkZWZib2R5aW5kZW50Ci1cbm9pbmRlbnQKLVxzZXRib3gwPVxoYm94e1xoc2tpcCBcZGVmbGFzdGFyZ21hcmdpbntccm0gIzJ9XGhza2lwIFxkZWZ0eXBlbWFyZ2lufSUKLVxkaW1lbjA9XGhzaXplIFxhZHZhbmNlIFxkaW1lbjAgYnkgLVx3ZDAgJSBjb21wdXRlIHNpemUgZm9yIGZpcnN0IGxpbmUKLVxkaW1lbjE9XGhzaXplIFxhZHZhbmNlIFxkaW1lbjEgYnkgLVxkZWZhcmdzaW5kZW50ICVzaXplIGZvciBjb250aW51YXRpb25zCi1ccGFyc2hhcGUgMiAwaW4gXGRpbWVuMCBcZGVmYXJnc2luZGVudCBcZGltZW4xCi0lIE5vdyBvdXRwdXQgYXJnIDIgKCJGdW5jdGlvbiIgb3Igc29tZSBzdWNoKQotJSBlbmRpbmcgYXQgXGRlZnR5cGVtYXJnaW4gZnJvbSB0aGUgcmlnaHQgbWFyZ2luLAotJSBidXQgc3R1Y2sgaW5zaWRlIGEgYm94IG9mIHdpZHRoIDAgc28gaXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggbGluZWJyZWFraW5nCi17JSBBZGp1c3QgXGhzaXplIHRvIGV4Y2x1ZGUgdGhlIGFtYmllbnQgbWFyZ2lucywKLSUgc28gdGhhdCBccmlnaHRsaW5lIHdpbGwgb2JleSB0aGVtLgotXGFkdmFuY2UgXGhzaXplIGJ5IC1cZGltZW4yCi1ccmxhcHtccmlnaHRsaW5le3tccm0gIzJ9XGhza2lwIC0xLjI1cGMgfX19JQotJSBNYWtlIGFsbCBsaW5lcyB1bmRlcmZ1bGwgYW5kIG5vIGNvbXBsYWludHM6Ci1cdG9sZXJhbmNlPTEwMDAwIFxoYmFkbmVzcz0xMDAwMAotXGFkdmFuY2VcbGVmdHNraXAgYnkgLVxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci17XGRmICMxfVxlbnNraXAgICAgICAgICUgR2VuZXJhdGUgZnVuY3Rpb24gbmFtZQotfQotCi0lIEFjdHVhbGx5IHByb2Nlc3MgdGhlIGJvZHkgb2YgYSBkZWZpbml0aW9uCi0lICMxIHNob3VsZCBiZSB0aGUgdGVybWluYXRpbmcgY29udHJvbCBzZXF1ZW5jZSwgc3VjaCBhcyBcRWRlZnVuLgotJSAjMiBzaG91bGQgYmUgdGhlICJhbm90aGVyIG5hbWUiIGNvbnRyb2wgc2VxdWVuY2UsIHN1Y2ggYXMgXGRlZnVueC4KLSUgIzMgc2hvdWxkIGJlIHRoZSBjb250cm9sIHNlcXVlbmNlIHRoYXQgYWN0dWFsbHkgcHJvY2Vzc2VzIHRoZSBoZWFkZXIsCi0lICAgIHN1Y2ggYXMgXGRlZnVuaGVhZGVyLgotCi1cZGVmXGRlZnBhcnNlYm9keSAjMSMyIzN7XGJlZ2luZ3JvdXBcaW5FTlYlIEVudmlyb25tZW50IGZvciBkZWZpbml0aW9uYm9keQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzJ7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0IzN9JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cCAlCi1cY2F0Y29kZSA2MT1cYWN0aXZlICUgNjEgaXMgYD0nCi1cb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0IzN9Ci0KLSUgIzEgaXMgdGhlIFxFLi4uIGNvbnRyb2wgc2VxdWVuY2UgdG8gZW5kIHRoZSBkZWZpbml0aW9uICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMiBpcyB0aGUgXC4uLnggY29udHJvbCBzZXF1ZW5jZSBmb3IgY29uc2VjdXRpdmUgZm5zICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMyBpcyB0aGUgY29udHJvbCBzZXF1ZW5jZSB0byBjYWxsIHRvIHJlc3VtZSBwcm9jZXNzaW5nLgotJSAjNCwgZGVsaW1pdGVkIGJ5IHRoZSBzcGFjZSwgaXMgdGhlIGNsYXNzIG5hbWUuCi0lIAotXGRlZlxkZWZtZXRocGFyc2Vib2R5IzEjMiMzIzQge1xiZWdpbmdyb3VwXGluRU5WICUKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMyIyMxIHtcYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IyMxfX19JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IzR9fX0KLQotJSBAZGVmdHlwZW1ldGhvZCBoYXMgYW4gZXh0cmEgYXJndW1lbnQgdGhhdCBub3RoaW5nIGVsc2UgZG9lcy4gIFNpZ2guCi0lICMxIGlzIHRoZSBcRS4uLiBjb250cm9sIHNlcXVlbmNlIHRvIGVuZCB0aGUgZGVmaW5pdGlvbiAod2hpY2ggd2UgZGVmaW5lKS4KLSUgIzIgaXMgdGhlIFwuLi54IGNvbnRyb2wgc2VxdWVuY2UgZm9yIGNvbnNlY3V0aXZlIGZucyAod2hpY2ggd2UgZGVmaW5lKS4KLSUgIzMgaXMgdGhlIGNvbnRyb2wgc2VxdWVuY2UgdG8gY2FsbCB0byByZXN1bWUgcHJvY2Vzc2luZy4KLSUgIzQsIGRlbGltaXRlZCBieSB0aGUgc3BhY2UsIGlzIHRoZSBjbGFzcyBuYW1lLgotJSAjNSBpcyB0aGUgbWV0aG9kJ3MgcmV0dXJuIHR5cGUuCi0lIAotXGRlZlxkZWZ0eXBlbWV0aHBhcnNlYm9keSMxIzIjMyM0ICM1IHtcYmVnaW5ncm91cFxpbkVOViAlCi1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMiMjMSAjIzIge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjIzF9eyMjMn19fSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyM0fXsjNX19fQotCi1cZGVmXGRlZm9wcGFyc2Vib2R5ICMxIzIjMyM0IzUge1xiZWdpbmdyb3VwXGluRU5WICUKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMyIyMxICMjMiB7XGRlZiM0eyMjMX0lCi1cYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IyMyfX19JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IzV9fX0KLQotJSBUaGVzZSBwYXJzaW5nIGZ1bmN0aW9ucyBhcmUgc2ltaWxhciB0byB0aGUgcHJlY2VkaW5nIG9uZXMKLSUgZXhjZXB0IHRoYXQgdGhleSBkbyBub3QgbWFrZSBwYXJlbnMgaW50byBhY3RpdmUgY2hhcmFjdGVycy4KLSUgVGhlc2UgYXJlIHVzZWQgZm9yICJ2YXJpYWJsZXMiIHNpbmNlIHRoZXkgaGF2ZSBubyBhcmd1bWVudHMuCi0KLVxkZWZcZGVmdmFycGFyc2Vib2R5ICMxIzIjM3tcYmVnaW5ncm91cFxpbkVOViUgRW52aXJvbm1lbnQgZm9yIGRlZmluaXRpb25ib2R5Ci1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMntcYmVnaW5ncm91cFxvYmV5bGluZXNcc3BhY2VzcGxpdCMzfSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXAgJQotXGNhdGNvZGUgNjE9XGFjdGl2ZSAlCi1cb2JleWxpbmVzXHNwYWNlc3BsaXQjM30KLQotJSBUaGlzIGlzIHVzZWQgZm9yIFxkZWZ7dHAsdnJ9cGFyc2Vib2R5LiAgSXQgY291bGQgcHJvYmFibHkgYmUgdXNlZCBmb3IKLSUgc29tZSBvZiB0aGUgb3RoZXJzLCB0b28sIHdpdGggc29tZSBqdWRpY2lvdXMgY29uZGl0aW9uYWxzLgotJQotXGRlZlxwYXJzZWJvZHljb21tb24jMSMyIzN7JQotICBcYmVnaW5ncm91cFxpbkVOViAlCi0gIFxtZWRicmVhayAlCi0gICUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSAgJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotICBcZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotICBcZGVmIzIjIzEge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xzcGFjZXNwbGl0eyMzeyMjMX19fSUKLSAgXHBhcmluZGVudD0waW4KLSAgXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLSAgXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotICBcYmVnaW5ncm91cFxvYmV5bGluZXMKLX0KLQotXGRlZlxkZWZ2cnBhcnNlYm9keSMxIzIjMyM0IHslCi0gIFxwYXJzZWJvZHljb21tb257IzF9eyMyfXsjM30lCi0gIFxzcGFjZXNwbGl0eyMzeyM0fX0lCi19Ci0KLSUgVGhpcyBsb3NlcyBvbiBgQGRlZnRwIHtEYXRhIFR5cGV9IHtzdHJ1Y3QgdGVybWlvc30nIC0tIGl0IHRoaW5rcyB0aGUKLSUgdHlwZSBpcyBqdXN0IGBzdHJ1Y3QnLCBiZWNhdXNlIHdlIGxvc2UgdGhlIGJyYWNlcyBpbiBge3N0cnVjdAotJSB0ZXJtaW9zfScgd2hlbiBcc3BhY2VzcGxpdCByZWFkcyBpdHMgdW5kZWxpbWl0ZWQgYXJndW1lbnQuICBTaWdoLgotJSBcbGV0XGRlZnRwcGFyc2Vib2R5PVxkZWZ2cnBhcnNlYm9keQotJQotJSBTbywgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBwdXQgXGVtcHR5IGluIHdpdGggdGhlIHR5cGUgbmFtZS4gIFRoYXQKLSUgd2F5LCBUZVggd29uJ3QgZmluZCBleGFjdGx5IGB7Li4ufScgYXMgYW4gdW5kZWxpbWl0ZWQgYXJndW1lbnQsIGFuZAotJSB3b24ndCBzdHJpcCBvZmYgdGhlIGJyYWNlcy4KLSUKLVxkZWZcZGVmdHBwYXJzZWJvZHkgIzEjMiMzIzQgeyUKLSAgXHBhcnNlYm9keWNvbW1vbnsjMX17IzJ9eyMzfSUKLSAgXHNwYWNlc3BsaXR7XHBhcnNldHBoZWFkZXJsaW5leyMzeyM0fX19XGVtcHR5Ci19Ci0KLSUgRmluZSwgYnV0IHRoZW4gd2UgaGF2ZSB0byBldmVudHVhbGx5IHJlbW92ZSB0aGUgXGVtcHR5ICphbmQqIHRoZQotJSBicmFjZXMgKGlmIGFueSkuICBUaGF0J3Mgd2hhdCB0aGlzIGRvZXMuCi0lCi1cZGVmXHJlbW92ZWVtcHR5YnJhY2VzXGVtcHR5IzFccmVsYXh7IzF9Ci0KLSUgQWZ0ZXIgXHNwYWNlc3BsaXQgaGFzIGRvbmUgaXRzIHdvcmssIHRoaXMgaXMgY2FsbGVkIC0tICMxIGlzIHRoZSBmaW5hbAotJSB0aGluZyB0byBjYWxsLCAjMiB0aGUgdHlwZSBuYW1lICh3aGljaCBzdGFydHMgd2l0aCBcZW1wdHkpLCBhbmQgIzMKLSUgKHdoaWNoIG1pZ2h0IGJlIGVtcHR5KSB0aGUgYXJndW1lbnRzLgotJQotXGRlZlxwYXJzZXRwaGVhZGVybGluZSMxIzIjM3slCi0gICMxe1xyZW1vdmVlbXB0eWJyYWNlcyMyXHJlbGF4fXsjM30lCi19JQotCi1cZGVmXGRlZm9wdmFycGFyc2Vib2R5ICMxIzIjMyM0IzUge1xiZWdpbmdyb3VwXGluRU5WICUKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMyIyMxICMjMiB7XGRlZiM0eyMjMX0lCi1cYmVnaW5ncm91cFxvYmV5bGluZXNcc3BhY2VzcGxpdHsjM3sjIzJ9fX0lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xzcGFjZXNwbGl0eyMzeyM1fX19Ci0KLSUgU3BsaXQgdXAgIzIgYXQgdGhlIGZpcnN0IHNwYWNlIHRva2VuLgotJSBjYWxsICMxIHdpdGggdHdvIGFyZ3VtZW50czoKLSUgIHRoZSBmaXJzdCBpcyBhbGwgb2YgIzIgYmVmb3JlIHRoZSBzcGFjZSB0b2tlbiwKLSUgIHRoZSBzZWNvbmQgaXMgYWxsIG9mICMyIGFmdGVyIHRoYXQgc3BhY2UgdG9rZW4uCi0lIElmICMyIGNvbnRhaW5zIG5vIHNwYWNlIHRva2VuLCBhbGwgb2YgaXQgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmcKLSUgYW5kIHRoZSBzZWNvbmQgaXMgcGFzc2VkIGFzIGVtcHR5LgotCi17XG9iZXlsaW5lcwotXGdkZWZcc3BhY2VzcGxpdCMxIzJeXk17XGVuZGdyb3VwXHNwYWNlc3BsaXRmb297IzF9IzIgXHJlbGF4XHNwYWNlc3BsaXRmb299JQotXGxvbmdcZ2RlZlxzcGFjZXNwbGl0Zm9vIzEjMiAjMyM0XHNwYWNlc3BsaXRmb297JQotXGlmeFxyZWxheCAjMyUKLSMxeyMyfXt9XGVsc2UgIzF7IzJ9eyMzIzR9XGZpfX0KLQotJSBTbyBtdWNoIGZvciB0aGUgdGhpbmdzIGNvbW1vbiB0byBhbGwga2luZHMgb2YgZGVmaW5pdGlvbnMuCi0KLSUgRGVmaW5lIEBkZWZ1bi4KLQotJSBGaXJzdCwgZGVmaW5lIHRoZSBwcm9jZXNzaW5nIHRoYXQgaXMgd2FudGVkIGZvciBhcmd1bWVudHMgb2YgXGRlZnVuCi0lIFVzZSB0aGlzIHRvIGV4cGFuZCB0aGUgYXJncyBhbmQgdGVybWluYXRlIHRoZSBwYXJhZ3JhcGggdGhleSBtYWtlIHVwCi0KLVxkZWZcZGVmdW5hcmdzICMxe1xmdW5jdGlvbnBhcmVucyBcc2wKLSUgRXhwYW5kLCBwcmV2ZW50aW5nIGh5cGhlbmF0aW9uIGF0IGAtJyBjaGFycy4KLSUgTm90ZSB0aGF0IGdyb3VwcyBkb24ndCBhZmZlY3QgY2hhbmdlcyBpbiBcaHlwaGVuY2hhci4KLVxoeXBoZW5jaGFyXHRlbnNsPTAKLSMxJQotXGh5cGhlbmNoYXJcdGVuc2w9NDUKLVxpZm51bVxwYXJlbmNvdW50PTAgXGVsc2UgXGVycm1lc3NhZ2V7VW5iYWxhbmNlZCBwYXJlbnRoZXNlcyBpbiBAZGVmfVxmaSUKLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cYWR2YW5jZVxyaWdodHNraXAgYnkgMHB0IHBsdXMgMWZpbAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVhawotfQotCi1cZGVmXGRlZnR5cGVmdW5hcmdzICMxeyUKLSUgRXhwYW5kLCBwcmV2ZW50aW5nIGh5cGhlbmF0aW9uIGF0IGAtJyBjaGFycy4KLSUgTm90ZSB0aGF0IGdyb3VwcyBkb24ndCBhZmZlY3QgY2hhbmdlcyBpbiBcaHlwaGVuY2hhci4KLSUgVXNlIFxib2xkYnJheG5vYW1wLCBub3QgXGZ1bmN0aW9ucGFyZW5zLCBzbyB0aGF0ICYgaXMgbm90IHNwZWNpYWwuCi1cYm9sZGJyYXhub2FtcAotXHRjbG9zZXsjMX0lIGF2b2lkIFxjb2RlIGJlY2F1c2Ugb2Ygc2lkZSBlZmZlY3RzIG9uIGFjdGl2ZSBjaGFycwotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxhZHZhbmNlXHJpZ2h0c2tpcCBieSAwcHQgcGx1cyAxZmlsCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrCi19Ci0KLSUgRG8gY29tcGxldGUgcHJvY2Vzc2luZyBvZiBvbmUgQGRlZnVuIG9yIEBkZWZ1bnggbGluZSBhbHJlYWR5IHBhcnNlZC4KLQotJSBAZGVmZm4gQ29tbWFuZCBmb3J3YXJkLWNoYXIgbmNoYXJzCi0KLVxkZWZcZGVmZm57XGRlZm1ldGhwYXJzZWJvZHlcRWRlZmZuXGRlZmZueFxkZWZmbmhlYWRlcn0KLQotXGRlZlxkZWZmbmhlYWRlciAjMSMyIzN7XGRvaW5kIHtmbn17XGNvZGV7IzJ9fSUKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXsjMX1cZGVmdW5hcmdzeyMzfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZnVuID09IEBkZWZmbiBGdW5jdGlvbgotCi1cZGVmXGRlZnVue1xkZWZwYXJzZWJvZHlcRWRlZnVuXGRlZnVueFxkZWZ1bmhlYWRlcn0KLQotXGRlZlxkZWZ1bmhlYWRlciAjMSMye1xkb2luZCB7Zm59e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtGdW5jdGlvbn0lCi1cZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZ0eXBlZnVuIGludCBmb29iYXIgKGludCBAdmFye2Zvb30sIGZsb2F0IEB2YXJ7YmFyfSkKLQotXGRlZlxkZWZ0eXBlZnVue1xkZWZwYXJzZWJvZHlcRWRlZnR5cGVmdW5cZGVmdHlwZWZ1bnhcZGVmdHlwZWZ1bmhlYWRlcn0KLQotJSAjMSBpcyB0aGUgZGF0YSB0eXBlLiAgIzIgaXMgdGhlIG5hbWUgYW5kIGFyZ3MuCi1cZGVmXGRlZnR5cGVmdW5oZWFkZXIgIzEjMntcZGVmdHlwZWZ1bmhlYWRlcnh7IzF9IzIgXHJlbGF4fQotJSAjMSBpcyB0aGUgZGF0YSB0eXBlLCAjMiB0aGUgbmFtZSwgIzMgdGhlIGFyZ3MuCi1cZGVmXGRlZnR5cGVmdW5oZWFkZXJ4ICMxIzIgIzNccmVsYXh7JQotXGRvaW5kIHtmbn17XGNvZGV7IzJ9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7XGRlZmhlYWRlcnhjb25kIzFccmVsYXgkJCQjMn17RnVuY3Rpb259JQotXGRlZnR5cGVmdW5hcmdzIHsjM31cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZ0eXBlZm4ge0xpYnJhcnkgRnVuY3Rpb259IGludCBmb29iYXIgKGludCBAdmFye2Zvb30sIGZsb2F0IEB2YXJ7YmFyfSkKLQotXGRlZlxkZWZ0eXBlZm57XGRlZm1ldGhwYXJzZWJvZHlcRWRlZnR5cGVmblxkZWZ0eXBlZm54XGRlZnR5cGVmbmhlYWRlcn0KLQotJSBcZGVmaGVhZGVyeGNvbmQjMVxyZWxheCQkJAotJSBwdXRzICMxIGluIEBjb2RlLCBmb2xsb3dlZCBieSBhIHNwYWNlLCBidXQgZG9lcyBub3RoaW5nIGlmICMxIGlzIG51bGwuCi1cZGVmXGRlZmhlYWRlcnhjb25kIzEjMiQkJHtcaWZ4IzFccmVsYXhcZWxzZVxjb2RleyMxIzJ9IFxmaX0KLQotJSAjMSBpcyB0aGUgY2xhc3NpZmljYXRpb24uICAjMiBpcyB0aGUgZGF0YSB0eXBlLiAgIzMgaXMgdGhlIG5hbWUgYW5kIGFyZ3MuCi1cZGVmXGRlZnR5cGVmbmhlYWRlciAjMSMyIzN7XGRlZnR5cGVmbmhlYWRlcnh7IzF9eyMyfSMzIFxyZWxheH0KLSUgIzEgaXMgdGhlIGNsYXNzaWZpY2F0aW9uLCAjMiB0aGUgZGF0YSB0eXBlLCAjMyB0aGUgbmFtZSwgIzQgdGhlIGFyZ3MuCi1cZGVmXGRlZnR5cGVmbmhlYWRlcnggIzEjMiMzICM0XHJlbGF4eyUKLVxkb2luZCB7Zm59e1xjb2RleyMzfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwCi1cbm9ybWFscGFyZW5zICUgbm90YWJseSwgdHVybiBvZmYgYCYnIG1hZ2ljLCB3aGljaCBwcmV2ZW50cwotJSAgICAgICAgICAgICAgIGF0IGxlYXN0IHNvbWUgQysrIHRleHQgZnJvbSB3b3JraW5nCi1cZGVmbmFtZSB7XGRlZmhlYWRlcnhjb25kIzJccmVsYXgkJCQjM317IzF9JQotXGRlZnR5cGVmdW5hcmdzIHsjNH1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZtYWMgPT0gQGRlZmZuIE1hY3JvCi0KLVxkZWZcZGVmbWFje1xkZWZwYXJzZWJvZHlcRWRlZm1hY1xkZWZtYWN4XGRlZm1hY2hlYWRlcn0KLQotXGRlZlxkZWZtYWNoZWFkZXIgIzEjMntcZG9pbmQge2ZufXtcY29kZXsjMX19JSBNYWtlIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMX17TWFjcm99JQotXGRlZnVuYXJncyB7IzJ9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBAZGVmc3BlYyA9PSBAZGVmZm4gU3BlY2lhbCBGb3JtCi0KLVxkZWZcZGVmc3BlY3tcZGVmcGFyc2Vib2R5XEVkZWZzcGVjXGRlZnNwZWN4XGRlZnNwZWNoZWFkZXJ9Ci0KLVxkZWZcZGVmc3BlY2hlYWRlciAjMSMye1xkb2luZCB7Zm59e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtTcGVjaWFsIEZvcm19JQotXGRlZnVuYXJncyB7IzJ9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBUaGlzIGRlZmluaXRpb24gaXMgcnVuIGlmIHlvdSB1c2UgQGRlZnVueAotJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZnVuIG9yIEBkZWZ1bnguCi0KLVxkZWZcZGVmZm54ICMxIHtcZXJybWVzc2FnZXtAZGVmZm54IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnVueCAjMSB7XGVycm1lc3NhZ2V7QGRlZnVueCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZtYWN4ICMxIHtcZXJybWVzc2FnZXtAZGVmbWFjeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZzcGVjeCAjMSB7XGVycm1lc3NhZ2V7QGRlZnNwZWN4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnR5cGVmbnggIzEge1xlcnJtZXNzYWdle0BkZWZ0eXBlZm54IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnR5cGVtZXRob2R4ICMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZW1ldGhvZHggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZWZ1bnggIzEge1xlcnJtZXNzYWdle0BkZWZ0eXBlZnVueCBpbiBpbnZhbGlkIGNvbnRleHR9fQotCi0lIEBkZWZtZXRob2QsIGFuZCBzbyBvbgotCi0lIEBkZWZvcCBDQVRFR09SWSBDTEFTUyBPUEVSQVRJT04gQVJHLi4uCi0KLVxkZWZcZGVmb3AgIzEge1xkZWZcZGVmb3B0eXBleyMxfSUKLVxkZWZvcHBhcnNlYm9keVxFZGVmb3BcZGVmb3B4XGRlZm9waGVhZGVyXGRlZm9wdHlwZX0KLQotXGRlZlxkZWZvcGhlYWRlciAjMSMyIzN7JQotXGRvc3ViaW5kIHtmbn17XGNvZGV7IzJ9fXtccHV0d29yZG9uXCAjMX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXtcZGVmb3B0eXBle30gb24gIzF9JQotXGRlZnVuYXJncyB7IzN9XGVuZGdyb3VwICUKLX0KLQotJSBAZGVmdHlwZW1ldGhvZCBDTEFTUyBSRVRVUk4tVFlQRSBNRVRIT0QgQVJHLi4uCi0lCi1cZGVmXGRlZnR5cGVtZXRob2R7JQotICBcZGVmdHlwZW1ldGhwYXJzZWJvZHlcRWRlZnR5cGVtZXRob2RcZGVmdHlwZW1ldGhvZHhcZGVmdHlwZW1ldGhvZGhlYWRlcn0KLSUKLSUgIzEgaXMgdGhlIGNsYXNzIG5hbWUsICMyIHRoZSBkYXRhIHR5cGUsICMzIHRoZSBtZXRob2QgbmFtZSwgIzQgdGhlIGFyZ3MuCi1cZGVmXGRlZnR5cGVtZXRob2RoZWFkZXIjMSMyIzMjNHslCi0gIFxkb3N1YmluZHtmbn17XGNvZGV7IzN9fXtccHV0d29yZG9uXCBcY29kZXsjMX19JSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotICBcYmVnaW5ncm91cAotICAgIFxkZWZuYW1le1xkZWZoZWFkZXJ4Y29uZCMyXHJlbGF4JCQkIzN9e1xwdXR3b3JkTWV0aG9kb25cIFxjb2RleyMxfX0lCi0gICAgXGRlZnR5cGVmdW5hcmdzeyM0fSUKLSAgXGVuZGdyb3VwCi19Ci0KLSUgQGRlZm1ldGhvZCA9PSBAZGVmb3AgTWV0aG9kCi0lCi1cZGVmXGRlZm1ldGhvZHtcZGVmbWV0aHBhcnNlYm9keVxFZGVmbWV0aG9kXGRlZm1ldGhvZHhcZGVmbWV0aG9kaGVhZGVyfQotJQotJSAjMSBpcyB0aGUgY2xhc3MgbmFtZSwgIzIgdGhlIG1ldGhvZCBuYW1lLCAjMyB0aGUgYXJncy4KLVxkZWZcZGVmbWV0aG9kaGVhZGVyIzEjMiMzeyUKLSAgXGRvc3ViaW5ke2ZufXtcY29kZXsjMn19e1xwdXR3b3Jkb25cIFxjb2RleyMxfX0lIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci0gIFxiZWdpbmdyb3VwCi0gICAgXGRlZm5hbWV7IzJ9e1xwdXR3b3JkTWV0aG9kb25cIFxjb2RleyMxfX0lCi0gICAgXGRlZnVuYXJnc3sjM30lCi0gIFxlbmRncm91cAotfQotCi0lIEBkZWZjdiB7Q2xhc3MgT3B0aW9ufSBmb28tY2xhc3MgZm9vLWZsYWcKLQotXGRlZlxkZWZjdiAjMSB7XGRlZlxkZWZjdnR5cGV7IzF9JQotXGRlZm9wdmFycGFyc2Vib2R5XEVkZWZjdlxkZWZjdnhcZGVmY3ZhcmhlYWRlclxkZWZjdnR5cGV9Ci0KLVxkZWZcZGVmY3ZhcmhlYWRlciAjMSMyIzN7JQotXGRvc3ViaW5kIHt2cn17XGNvZGV7IzJ9fXtvZiAjMX0lIE1ha2UgZW50cnkgaW4gdmFyIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17XGRlZmN2dHlwZXt9IG9mICMxfSUKLVxkZWZ2YXJhcmdzIHsjM31cZW5kZ3JvdXAgJQotfQotCi0lIEBkZWZpdmFyID09IEBkZWZjdiB7SW5zdGFuY2UgVmFyaWFibGV9Ci0KLVxkZWZcZGVmaXZhcntcZGVmdnJwYXJzZWJvZHlcRWRlZml2YXJcZGVmaXZhcnhcZGVmaXZhcmhlYWRlcn0KLQotXGRlZlxkZWZpdmFyaGVhZGVyICMxIzIjM3slCi1cZG9zdWJpbmQge3ZyfXtcY29kZXsjMn19e29mICMxfSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXtJbnN0YW5jZSBWYXJpYWJsZSBvZiAjMX0lCi1cZGVmdmFyYXJncyB7IzN9XGVuZGdyb3VwICUKLX0KLQotJSBUaGVzZSBkZWZpbml0aW9ucyBhcmUgcnVuIGlmIHlvdSB1c2UgQGRlZm1ldGhvZHgsIGV0Yy4sCi0lIGFueXdoZXJlIG90aGVyIHRoYW4gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBAZGVmbWV0aG9kLCBldGMuCi0KLVxkZWZcZGVmb3B4ICMxIHtcZXJybWVzc2FnZXtAZGVmb3B4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZm1ldGhvZHggIzEge1xlcnJtZXNzYWdle0BkZWZtZXRob2R4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZmN2eCAjMSB7XGVycm1lc3NhZ2V7QGRlZmN2eCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZpdmFyeCAjMSB7XGVycm1lc3NhZ2V7QGRlZml2YXJ4IGluIGludmFsaWQgY29udGV4dH19Ci0KLSUgTm93IEBkZWZ2YXIKLQotJSBGaXJzdCwgZGVmaW5lIHRoZSBwcm9jZXNzaW5nIHRoYXQgaXMgd2FudGVkIGZvciBhcmd1bWVudHMgb2YgQGRlZnZhci4KLSUgVGhpcyBpcyBhY3R1YWxseSBzaW1wbGU6IGp1c3QgcHJpbnQgdGhlbSBpbiByb21hbi4KLSUgVGhpcyBtdXN0IGV4cGFuZCB0aGUgYXJncyBhbmQgdGVybWluYXRlIHRoZSBwYXJhZ3JhcGggdGhleSBtYWtlIHVwCi1cZGVmXGRlZnZhcmFyZ3MgIzF7XG5vcm1hbHBhcmVucyAjMSUKLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrfQotCi0lIEBkZWZ2ciBDb3VudGVyIGZvby1jb3VudAotCi1cZGVmXGRlZnZye1xkZWZ2cnBhcnNlYm9keVxFZGVmdnJcZGVmdnJ4XGRlZnZyaGVhZGVyfQotCi1cZGVmXGRlZnZyaGVhZGVyICMxIzIjM3tcZG9pbmQge3ZyfXtcY29kZXsjMn19JQotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9eyMxfVxkZWZ2YXJhcmdzeyMzfVxlbmRncm91cH0KLQotJSBAZGVmdmFyID09IEBkZWZ2ciBWYXJpYWJsZQotCi1cZGVmXGRlZnZhcntcZGVmdmFycGFyc2Vib2R5XEVkZWZ2YXJcZGVmdmFyeFxkZWZ2YXJoZWFkZXJ9Ci0KLVxkZWZcZGVmdmFyaGVhZGVyICMxIzJ7XGRvaW5kIHt2cn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtWYXJpYWJsZX0lCi1cZGVmdmFyYXJncyB7IzJ9XGVuZGdyb3VwICUKLX0KLQotJSBAZGVmb3B0ID09IEBkZWZ2ciB7VXNlciBPcHRpb259Ci0KLVxkZWZcZGVmb3B0e1xkZWZ2YXJwYXJzZWJvZHlcRWRlZm9wdFxkZWZvcHR4XGRlZm9wdGhlYWRlcn0KLQotXGRlZlxkZWZvcHRoZWFkZXIgIzEjMntcZG9pbmQge3ZyfXtcY29kZXsjMX19JSBNYWtlIGVudHJ5IGluIHZhciBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e1VzZXIgT3B0aW9ufSUKLVxkZWZ2YXJhcmdzIHsjMn1cZW5kZ3JvdXAgJQotfQotCi0lIEBkZWZ0eXBldmFyIGludCBmb29iYXIKLQotXGRlZlxkZWZ0eXBldmFye1xkZWZ2YXJwYXJzZWJvZHlcRWRlZnR5cGV2YXJcZGVmdHlwZXZhcnhcZGVmdHlwZXZhcmhlYWRlcn0KLQotJSAjMSBpcyB0aGUgZGF0YSB0eXBlLiAgIzIgaXMgdGhlIG5hbWUsIHBlcmhhcHMgZm9sbG93ZWQgYnkgdGV4dCB0aGF0Ci0lIGlzIGFjdHVhbGx5IHBhcnQgb2YgdGhlIGRhdGEgdHlwZSwgd2hpY2ggc2hvdWxkIG5vdCBiZSBwdXQgaW50byB0aGUgaW5kZXguCi1cZGVmXGRlZnR5cGV2YXJoZWFkZXIgIzEjMnslCi1cZG92YXJpbmQjMiBccmVsYXglIE1ha2UgZW50cnkgaW4gdmFyaWFibGVzIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHtcZGVmaGVhZGVyeGNvbmQjMVxyZWxheCQkJCMyfXtWYXJpYWJsZX0lCi1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVhawotXGVuZGdyb3VwfQotXGRlZlxkb3ZhcmluZCMxICMyXHJlbGF4e1xkb2luZHt2cn17XGNvZGV7IzF9fX0KLQotJSBAZGVmdHlwZXZyIHtHbG9iYWwgRmxhZ30gaW50IGVuYWJsZQotCi1cZGVmXGRlZnR5cGV2cntcZGVmdnJwYXJzZWJvZHlcRWRlZnR5cGV2clxkZWZ0eXBldnJ4XGRlZnR5cGV2cmhlYWRlcn0KLQotXGRlZlxkZWZ0eXBldnJoZWFkZXIgIzEjMiMze1xkb3ZhcmluZCMzIFxyZWxheCUKLVxiZWdpbmdyb3VwXGRlZm5hbWUge1xkZWZoZWFkZXJ4Y29uZCMyXHJlbGF4JCQkIzN9eyMxfQotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxlbmRncmFmXG5vYnJlYWtcdnNraXAgLVxwYXJza2lwXG5vYnJlYWsKLVxlbmRncm91cH0KLQotJSBUaGlzIGRlZmluaXRpb24gaXMgcnVuIGlmIHlvdSB1c2UgQGRlZnZhcngKLSUgYW55d2hlcmUgb3RoZXIgdGhhbiBpbW1lZGlhdGVseSBhZnRlciBhIEBkZWZ2YXIgb3IgQGRlZnZhcnguCi0KLVxkZWZcZGVmdnJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmdnJ4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnZhcnggIzEge1xlcnJtZXNzYWdle0BkZWZ2YXJ4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZm9wdHggIzEge1xlcnJtZXNzYWdle0BkZWZvcHR4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnR5cGV2YXJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZXZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZXZyeCAjMSB7XGVycm1lc3NhZ2V7QGRlZnR5cGV2cnggaW4gaW52YWxpZCBjb250ZXh0fX0KLQotJSBOb3cgZGVmaW5lIEBkZWZ0cAotJSBBcmdzIGFyZSBwcmludGVkIGluIGJvbGQsIGEgc2xpZ2h0IGRpZmZlcmVuY2UgZnJvbSBAZGVmdmFyLgotCi1cZGVmXGRlZnRwYXJncyAjMXtcYmYgXGRlZnZhcmFyZ3N7IzF9fQotCi0lIEBkZWZ0cCBDbGFzcyB3aW5kb3cgaGVpZ2h0IHdpZHRoIC4uLgotCi1cZGVmXGRlZnRwe1xkZWZ0cHBhcnNlYm9keVxFZGVmdHBcZGVmdHB4XGRlZnRwaGVhZGVyfQotCi1cZGVmXGRlZnRwaGVhZGVyICMxIzIjM3tcZG9pbmQge3RwfXtcY29kZXsjMn19JQotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9eyMxfVxkZWZ0cGFyZ3N7IzN9XGVuZGdyb3VwfQotCi0lIFRoaXMgZGVmaW5pdGlvbiBpcyBydW4gaWYgeW91IHVzZSBAZGVmdHB4LCBldGMKLSUgYW55d2hlcmUgb3RoZXIgdGhhbiBpbW1lZGlhdGVseSBhZnRlciBhIEBkZWZ0cCwgZXRjLgotCi1cZGVmXGRlZnRweCAjMSB7XGVycm1lc3NhZ2V7QGRlZnRweCBpbiBpbnZhbGlkIGNvbnRleHR9fQotCi0KLVxtZXNzYWdle21hY3Jvcyx9Ci0lIEBtYWNyby4KLQotJSBUbyBkbyB0aGlzIHJpZ2h0IHdlIG5lZWQgYSBmZWF0dXJlIG9mIGUtVGVYLCBcc2NhbnRva2VucywgCi0lIHdoaWNoIHdlIGFycmFuZ2UgdG8gZW11bGF0ZSB3aXRoIGEgdGVtcG9yYXJ5IGZpbGUgaW4gb3JkaW5hcnkgVGVYLgotXGlmeFxlVGVYdmVyc2lvblx1bmRlZmluZWQKLSBcbmV3d3JpdGVcbWFjc2NyaWJibGUKLSBcZGVmXHNjYW5tYWNybyMxeyUKLSAgIFxiZWdpbmdyb3VwIFxuZXdsaW5lY2hhcmBcXl5NCi0gICBcaW1tZWRpYXRlXG9wZW5vdXRcbWFjc2NyaWJibGU9XGpvYm5hbWUudG1wCi0gICBcaW1tZWRpYXRlXHdyaXRlXG1hY3NjcmliYmxleyMxfSUKLSAgIFxpbW1lZGlhdGVcY2xvc2VvdXRcbWFjc2NyaWJibGUKLSAgIFxsZXRceGVhdHNwYWNlc1xlYXRzcGFjZXMKLSAgIFxpbnB1dCBcam9ibmFtZS50bXAKLSAgIFxlbmRncm91cAotfQotXGVsc2UKLVxkZWZcc2Nhbm1hY3JvIzF7JQotXGJlZ2luZ3JvdXAgXG5ld2xpbmVjaGFyYFxeXk0KLVxsZXRceGVhdHNwYWNlc1xlYXRzcGFjZXNcc2NhbnRva2Vuc3sjMX1cZW5kZ3JvdXB9Ci1cZmkKLQotXG5ld2NvdW50XHBhcmFtbm8gICAlIENvdW50IG9mIHBhcmFtZXRlcnMKLVxuZXd0b2tzXG1hY25hbWUgICAgJSBNYWNybyBuYW1lCi1cbmV3aWZcaWZyZWN1cnNpdmUgICUgSXMgaXQgcmVjdXJzaXZlPwotCi0lIFV0aWxpdHkgcm91dGluZXMuCi0lIFRoaXNkb2VzIFxsZXQgIzEgPSAjMiwgZXhjZXB0IHdpdGggXGNzbmFtZXMuCi1cZGVmXGNzbGV0IzEjMnslCi1cZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLVxleHBhbmRhZnRlclxsZXQKLVxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotXGNzbmFtZSMxXGVuZGNzbmFtZQotXGNzbmFtZSMyXGVuZGNzbmFtZX0KLQotJSBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBvZmYgYSBzdHJpbmcuCi0lIENvbmNlcHRzIGZyb20gYXJvLWJlbmQgcHJvYmxlbSAxNSAoc2VlIENUQU4pLgote1xjYXRjb2RlYFxAPTExCi1cZ2RlZlxlYXRzcGFjZXMgIzF7XGV4cGFuZGFmdGVyXHRyaW1AXGV4cGFuZGFmdGVyeyMxIH19Ci1cZ2RlZlx0cmltQCAjMXtcdHJpbUBAIEAjMSBAICMxIEAgQEB9Ci1cZ2RlZlx0cmltQEAgIzFAICMyQCAjM0BAe1x0cmltQEBAXGVtcHR5ICMyIEB9Ci1cZGVmXHVuYnJhY2UjMXsjMX0KLVx1bmJyYWNle1xnZGVmXHRyaW1AQEAgIzEgfSAjMkB7IzF9Ci19Ci0KLSUgVHJpbSBhIHNpbmdsZSB0cmFpbGluZyBeXk0gb2ZmIGEgc3RyaW5nLgote1xjYXRjb2RlYFxeXk09MTJcY2F0Y29kZWBcUT0zJQotXGdkZWZcZWF0Y3IgIzF7XGVhdGNyYSAjMVFeXk1RfSUKLVxnZGVmXGVhdGNyYSMxXl5NUXtcZWF0Y3JiIzFRfSUKLVxnZGVmXGVhdGNyYiMxUSMyUXsjMX0lCi19Ci0KLSUgTWFjcm8gYm9kaWVzIGFyZSBhYnNvcmJlZCBhcyBhbiBhcmd1bWVudCBpbiBhIGNvbnRleHQgd2hlcmUKLSUgYWxsIGNoYXJhY3RlcnMgYXJlIGNhdGNvZGUgMTAsIDExIG9yIDEyLCBleGNlcHQgXCB3aGljaCBpcyBhY3RpdmUKLSUgKGFzIGluIG5vcm1hbCB0ZXhpbmZvKS4gSXQgaXMgbmVjZXNzYXJ5IHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBcLgotCi0lIEl0J3MgbmVjZXNzYXJ5IHRvIGhhdmUgaGFyZCBDUnMgd2hlbiB0aGUgbWFjcm8gaXMgZXhlY3V0ZWQuIFRoaXMgaXMgCi0lIGRvbmUgYnkgIG1ha2luZyBeXk0gKFxlbmRsaW5lY2hhcikgY2F0Y29kZSAxMiB3aGVuIHJlYWRpbmcgdGhlIG1hY3JvIAotJSBib2R5LCBhbmQgdGhlbiBtYWtpbmcgaXQgdGhlIFxuZXdsaW5lY2hhciBpbiBcc2Nhbm1hY3JvLgotCi1cZGVmXG1hY3JvYm9keWN0eHR7JQotICBcY2F0Y29kZWBcfj0xMgotICBcY2F0Y29kZWBcXj0xMgotICBcY2F0Y29kZWBcXz0xMgotICBcY2F0Y29kZWBcfD0xMgotICBcY2F0Y29kZWBcPD0xMgotICBcY2F0Y29kZWBcPj0xMgotICBcY2F0Y29kZWBcKz0xMgotICBcY2F0Y29kZWBcez0xMgotICBcY2F0Y29kZWBcfT0xMgotICBcY2F0Y29kZWBcQD0xMgotICBcY2F0Y29kZWBcXl5NPTEyCi0gIFx1c2VtYm9keWJhY2tzbGFzaH0KLQotJSBcbWJvZHliYWNrc2xhc2ggaXMgdGhlIGRlZmluaXRpb24gb2YgXCBpbiBAbWFjcm8gYm9kaWVzLgotJSBJdCBtYXBzIFxmb29cID0+IFxjc25hbWUgbWFjYXJnLmZvb1xlbmRjc25hbWUgPT4gI04gCi0lIHdoZXJlIE4gaXMgdGhlIG1hY3JvIHBhcmFtZXRlciBudW1iZXIuCi0lIFdlIGRlZmluZSBcY3NuYW1lIG1hY2FyZy5cZW5kY3NuYW1lIHRvIGJlIFxyZWFsYmFja3NsYXNoLCBzbwotJSBcXCBpbiBtYWNybyByZXBsYWNlbWVudCB0ZXh0IGdldHMgeW91IGEgYmFja3NsYXNoLgotCi17XGNhdGNvZGVgQD0wIEBjYXRjb2RlYEBcPUBhY3RpdmUKLSBAZ2RlZkB1c2VtYm9keWJhY2tzbGFzaHtAbGV0XD1AbWJvZHliYWNrc2xhc2h9Ci0gQGdkZWZAbWJvZHliYWNrc2xhc2gjMVx7QGNzbmFtZSBtYWNhcmcuIzFAZW5kY3NuYW1lfQotfQotXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgbWFjYXJnLlxlbmRjc25hbWV7XHJlYWxiYWNrc2xhc2h9Ci0KLVxkZWZcbWFjcm97XHJlY3Vyc2l2ZWZhbHNlXHBhcnNlYXJnXG1hY3JveHh4fQotXGRlZlxybWFjcm97XHJlY3Vyc2l2ZXRydWVccGFyc2VhcmdcbWFjcm94eHh9Ci0KLVxkZWZcbWFjcm94eHgjMXslCi0gIFxnZXRhcmdzeyMxfSUgICAgICAgICAgIG5vdyBcbWFjbmFtZSBpcyB0aGUgbWFjbmFtZSBhbmQgXGFyZ2wgdGhlIGFyZ2xpc3QKLSAgXGlmeFxhcmdsXGVtcHR5ICAgICAgICUgbm8gYXJndW1lbnRzCi0gICAgIFxwYXJhbW5vPTAlCi0gIFxlbHNlCi0gICAgIFxleHBhbmRhZnRlclxwYXJzZW1hcmdkZWYgXGFyZ2w7JSAKLSAgXGZpCi0gIFxleHBhbmRhZnRlclxpZnggXGNzbmFtZSBtYWNzYXZlLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUgXHJlbGF4Ci0gICAgIFxjc2xldHttYWNzYXZlLlx0aGVcbWFjbmFtZX17XHRoZVxtYWNuYW1lfSUKLSAgXGVsc2UKLSAgICAgXG1lc3NhZ2V7V2FybmluZzogcmVkZWZpbmluZyBcdGhlXG1hY25hbWV9JQotICBcZmkKLSAgXGJlZ2luZ3JvdXAgXG1hY3JvYm9keWN0eHQKLSAgXGlmcmVjdXJzaXZlIFxleHBhbmRhZnRlclxwYXJzZXJtYWNib2R5Ci0gIFxlbHNlIFxleHBhbmRhZnRlclxwYXJzZW1hY2JvZHkgCi0gIFxmaX0KLQotXGRlZlx1bm1hY3Jve1xwYXJzZWFyZ1x1bm1hY3JveHh4fQotXGRlZlx1bm1hY3JveHh4IzF7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4IFxjc25hbWUgbWFjc2F2ZS5cdGhlXG1hY25hbWVcZW5kY3NuYW1lIFxyZWxheAotICAgIFxlcnJtZXNzYWdle01hY3JvIFx0aGVcbWFjbmFtZVwgbm90IGRlZmluZWQufSUKLSAgXGVsc2UKLSAgICBcY3NsZXR7IzF9e21hY3NhdmUuIzF9JQotICAgIFxleHBhbmRhZnRlclxsZXQgXGNzbmFtZSBtYWNzYXZlLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUgXHVuZGVmaW5lZAotICBcZmkKLX0KLQotJSBUaGlzIG1ha2VzIHVzZSBvZiB0aGUgb2JzY3VyZSBmZWF0dXJlIHRoYXQgaWYgdGhlIGxhc3QgdG9rZW4gb2YgYQotJSA8cGFyYW1ldGVyIGxpc3Q+IGlzICMsIHRoZW4gdGhlIHByZWNlZGluZyBhcmd1bWVudCBpcyBkZWxpbWl0ZWQgYnkKLSUgYW4gb3BlbmluZyBicmFjZSwgYW5kIHRoYXQgb3BlbmluZyBicmFjZSBpcyBub3QgY29uc3VtZWQuCi1cZGVmXGdldGFyZ3MjMXtcZ2V0YXJnc3h4eCMxe319Ci1cZGVmXGdldGFyZ3N4eHgjMSN7XGdldG1hY25hbWUgIzEgXHJlbGF4XGdldG1hY2FyZ3N9Ci1cZGVmXGdldG1hY25hbWUgIzEgIzJccmVsYXh7XG1hY25hbWU9eyMxfX0KLVxkZWZcZ2V0bWFjYXJncyMxe1xkZWZcYXJnbHsjMX19Ci0KLSUgUGFyc2UgdGhlIG9wdGlvbmFsIHtwYXJhbXN9IGxpc3QuICBTZXQgdXAgXHBhcmFtbm8gYW5kIFxwYXJhbWxpc3QKLSUgc28gXGRlZm1hY3JvIGtub3dzIHdoYXQgdG8gZG8uICBEZWZpbmUgXG1hY2FyZy5ibGFoIGZvciBlYWNoIGJsYWgKLSUgaW4gdGhlIHBhcmFtcyBsaXN0LCB0byBiZSAjI04gd2hlcmUgTiBpcyB0aGUgcG9zaXRpb24gaW4gdGhhdCBsaXN0LgotJSBUaGF0IGdldHMgdXNlZCBieSBcbWJvZHliYWNrc2xhc2ggKGFib3ZlKS4KLQotJSBXZSBuZWVkIHRvIGdldCBgbWFjcm8gcGFyYW1ldGVyIGNoYXIgIycgaW50byBzZXZlcmFsIGRlZmluaXRpb25zLgotJSBUaGUgdGVjaG5pcXVlIHVzZWQgaXMgc3RvbGVuIGZyb20gTGFUZVg6ICBsZXQgXGhhc2ggYmUgc29tZXRoaW5nCi0lIHVuZXhwYW5kYWJsZSwgaW5zZXJ0IHRoYXQgd2hlcmV2ZXIgeW91IG5lZWQgYSAjLCBhbmQgdGhlbiByZWRlZmluZQotJSBpdCB0byAjIGp1c3QgYmVmb3JlIHVzaW5nIHRoZSB0b2tlbiBsaXN0IHByb2R1Y2VkLgotJQotJSBUaGUgc2FtZSB0ZWNobmlxdWUgaXMgdXNlZCB0byBwcm90ZWN0IFxlYXRzcGFjZXMgdGlsbCBqdXN0IGJlZm9yZQotJSB0aGUgbWFjcm8gaXMgdXNlZC4KLQotXGRlZlxwYXJzZW1hcmdkZWYjMTt7XHBhcmFtbm89MFxkZWZccGFyYW1saXN0e30lCi0gICAgICAgIFxsZXRcaGFzaFxyZWxheFxsZXRceGVhdHNwYWNlc1xyZWxheFxwYXJzZW1hcmdkZWZ4eHgjMSw7LH0KLVxkZWZccGFyc2VtYXJnZGVmeHh4IzEseyUKLSAgXGlmIzE7XGxldFxuZXh0PVxyZWxheAotICBcZWxzZSBcbGV0XG5leHQ9XHBhcnNlbWFyZ2RlZnh4eAotICAgIFxhZHZhbmNlXHBhcmFtbm8gYnkgMSUKLSAgICBcZXhwYW5kYWZ0ZXJcZWRlZlxjc25hbWUgbWFjYXJnLlxlYXRzcGFjZXN7IzF9XGVuZGNzbmFtZQotICAgICAgICB7XHhlYXRzcGFjZXN7XGhhc2hcdGhlXHBhcmFtbm99fSUKLSAgICBcZWRlZlxwYXJhbWxpc3R7XHBhcmFtbGlzdFxoYXNoXHRoZVxwYXJhbW5vLH0lCi0gIFxmaVxuZXh0fQotCi0lIFRoZXNlIHR3byBjb21tYW5kcyByZWFkIHJlY3Vyc2l2ZSBhbmQgbm9ucmVjdXJzaXZlIG1hY3JvIGJvZGllcy4KLSUgKFRoZXkncmUgZGlmZmVyZW50IHNpbmNlIHJlYyBhbmQgbm9ucmVjIG1hY3JvcyBlbmQgZGlmZmVyZW50bHkuKQotCi1cbG9uZ1xkZWZccGFyc2VtYWNib2R5IzFAZW5kIG1hY3JvJQote1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQotXGxvbmdcZGVmXHBhcnNlcm1hY2JvZHkjMUBlbmQgcm1hY3JvJQote1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQotCi0lIFRoaXMgZGVmaW5lcyB0aGUgbWFjcm8gaXRzZWxmLiBUaGVyZSBhcmUgc2l4IGNhc2VzOiByZWN1cnNpdmUgYW5kCi0lIG5vbnJlY3Vyc2l2ZSBtYWNyb3Mgb2YgemVybywgb25lLCBhbmQgbWFueSBhcmd1bWVudHMuCi0lIE11Y2ggbWFnaWMgd2l0aCBcZXhwYW5kYWZ0ZXIgaGVyZS4KLSUgXHhkZWYgaXMgdXNlZCBzbyB0aGF0IG1hY3JvIGRlZmluaXRpb25zIHdpbGwgc3Vydml2ZSB0aGUgZmlsZQotJSB0aGV5J3JlIGRlZmluZWQgaW47IEBpbmNsdWRlIHJlYWRzIHRoZSBmaWxlIGluc2lkZSBhIGdyb3VwLgotXGRlZlxkZWZtYWNyb3slCi0gIFxsZXRcaGFzaD0jIyUgY29udmVydCBwbGFjZWhvbGRlcnMgdG8gbWFjcm8gcGFyYW1ldGVyIGNoYXJzCi0gIFxpZnJlY3Vyc2l2ZQotICAgIFxpZmNhc2VccGFyYW1ubwotICAgICUgMAotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKLSAgICBcb3IgJSAxCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgIFxub2V4cGFuZFxicmFjZW9ybGluZVxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZX0lCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSMjMXslCi0gICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfX0lCi0gICAgXGVsc2UgJSBtYW55Ci0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1lIyMxeyUKLSAgICAgICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUgIyMxLH0lCi0gICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmCi0gICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLSAgICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lIAotICAgICAgICAgIFxwYXJhbWxpc3R7XG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH19JQotICAgIFxmaQotICBcZWxzZQotICAgIFxpZmNhc2VccGFyYW1ubwotICAgICUgMAotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKLSAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH1cZWdyb3VwfSUKLSAgICBcb3IgJSAxCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgIFxub2V4cGFuZFxicmFjZW9ybGluZVxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZX0lCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSMjMXslCi0gICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKLSAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH1cZWdyb3VwfSUKLSAgICBcZWxzZSAlIG1hbnkKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWUjIzF7JQotICAgICAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgXGV4cGFuZGFmdGVyXHhkZWYKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lCi0gICAgICBccGFyYW1saXN0eyUKLSAgICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCi0gICAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH1cZWdyb3VwfSUKLSAgICBcZmkKLSAgXGZpfQotCi1cZGVmXG5vcmVjdXJzZSMxe1xiZ3JvdXBcY3NsZXR7IzF9e21hY3NhdmUuIzF9fQotCi0lIFxicmFjZW9ybGluZSBkZWNpZGVzIHdoZXRoZXIgdGhlIG5leHQgbm9ud2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgYQotJSB7LiAgSWYgc28gaXQgcmVhZHMgdXAgdG8gdGhlIGNsb3NpbmcgfSwgaWYgbm90LCBpdCByZWFkcyB0aGUgd2hvbGUKLSUgbGluZS4gIFdoYXRldmVyIHdhcyByZWFkIGlzIHRoZW4gZmVkIHRvIHRoZSBuZXh0IGNvbnRyb2wgc2VxdWVuY2UKLSUgYXMgYW4gYXJndW1lbnQgKGJ5IFxwYXJzZWJyYWNlIG9yIFxwYXJzZWFyZykKLVxkZWZcYnJhY2VvcmxpbmUjMXtcbGV0XG5leHQ9IzFcZnV0dXJlbGV0XG5jaGFyXGJyYWNlb3JsaW5leHh4fQotXGRlZlxicmFjZW9ybGluZXh4eHslCi0gIFxpZnhcbmNoYXJcYmdyb3VwXGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJccGFyc2VhcmcgCi0gIFxmaSBcbmV4dH0KLQotCi1cbWVzc2FnZXtjcm9zcyByZWZlcmVuY2VzLH0KLVxuZXd3cml0ZVxhdXhmaWxlCi0KLVxuZXdpZlxpZmhhdmV4cmVmcyAgICAlIFRydWUgaWYgeHJlZiB2YWx1ZXMgYXJlIGtub3duLgotXG5ld2lmXGlmd2FybmVkeHJlZnMgICUgVHJ1ZSBpZiB3ZSB3YXJuZWQgb25jZSB0aGF0IHRoZXkgYXJlbid0IGtub3duLgotCi0lIEBpbmZvcmVmIGlzIHJlbGF0aXZlbHkgc2ltcGxlLgotXGRlZlxpbmZvcmVmICMxe1xpbmZvcmVmenp6ICMxLCwsLCoqfQotXGRlZlxpbmZvcmVmenp6ICMxLCMyLCMzLCM0Kip7XHB1dHdvcmRTZWV7fSBccHV0d29yZEluZm97fSBccHV0d29yZGZpbGV7fSBcZmlsZXtcaWdub3Jlc3BhY2VzICMze319LAotICBub2RlIFxzYW1we1xpZ25vcmVzcGFjZXMjMXt9fX0KLQotJSBAbm9kZSdzIGpvYiBpcyB0byBkZWZpbmUgXGxhc3Rub2RlLgotXGRlZlxub2Rle1xFTlZjaGVja1xwYXJzZWFyZ1xub2Rlenp6fQotXGRlZlxub2Rlenp6IzF7XG5vZGV4eHggWyMxLF19Ci1cZGVmXG5vZGV4eHhbIzEsIzJde1xnZGVmXGxhc3Rub2RleyMxfX0KLVxsZXRcbndub2RlPVxub2RlCi1cbGV0XGxhc3Rub2RlPVxyZWxheAotCi0lIFRoZSBzZWN0aW9uaW5nIGNvbW1hbmRzIChAY2hhcHRlciwgZXRjLikgY2FsbCB0aGVzZS4KLVxkZWZcZG9ub2RlcmVmeyUKLSAgXGlmeFxsYXN0bm9kZVxyZWxheFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXHNldHJlZntcbGFzdG5vZGV9JQotICAgICAge1lzZWN0aW9ubnVtYmVyYW5kdHlwZX0lCi0gICAgXGdsb2JhbFxsZXRcbGFzdG5vZGU9XHJlbGF4Ci0gIFxmaQotfQotXGRlZlx1bm51bWJub2RlcmVmeyUKLSAgXGlmeFxsYXN0bm9kZVxyZWxheFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXHNldHJlZntcbGFzdG5vZGV9e1lub3RoaW5nfSUKLSAgICBcZ2xvYmFsXGxldFxsYXN0bm9kZT1ccmVsYXgKLSAgXGZpCi19Ci1cZGVmXGFwcGVuZGl4bm9kZXJlZnslCi0gIFxpZnhcbGFzdG5vZGVccmVsYXhcZWxzZQotICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlclxleHBhbmRhZnRlclxzZXRyZWZ7XGxhc3Rub2RlfSUKLSAgICAgIHtZYXBwZW5kaXhsZXR0ZXJhbmR0eXBlfSUKLSAgICBcZ2xvYmFsXGxldFxsYXN0bm9kZT1ccmVsYXgKLSAgXGZpCi19Ci0KLQotJSBAYW5jaG9ye05BTUV9IC0tIGRlZmluZSB4cmVmIHRhcmdldCBhdCBhcmJpdHJhcnkgcG9pbnQuCi0lIAotXGRlZlxhbmNob3IjMXtcc2V0cmVmeyMxfXtZbm90aGluZ319Ci0KLQotJSBcc2V0cmVme05BTUV9e1NOVH0gZGVmaW5lcyBhIGNyb3NzLXJlZmVyZW5jZSBwb2ludCBOQU1FLCBuYW1lbHkKLSUgTkFNRS10aXRsZSwgTkFNRS1wZywgYW5kIE5BTUUtU05ULiAgQ2FsbGVkIGZyb20gXGZvb25vZGVyZWYuICBXZSBoYXZlCi0lIHRvIHNldCBcaW5kZXhkdW1taWVzIHNvIGNvbW1hbmRzIHN1Y2ggYXMgQGNvZGUgaW4gYSBzZWN0aW9uIHRpdGxlCi0lIGFyZW4ndCBleHBhbmRlZC4gIEl0IHdvdWxkIGJlIG5pY2VyIG5vdCB0byBleHBhbmQgdGhlIHRpdGxlcyBpbiB0aGUKLSUgZmlyc3QgcGxhY2UsIGJ1dCB0aGVyZSdzIHNvIG1hbnkgbGF5ZXJzIHRoYXQgdGhhdCBpcyBoYXJkIHRvIGRvLgotJSAKLVxkZWZcc2V0cmVmIzEjMnt7JQotICBcaW5kZXhkdW1taWVzCi0gIFxkb3NldHF7IzEtdGl0bGV9e1l0aXRsZX0lCi0gIFxkb3NldHF7IzEtcGd9e1lwYWdlbnVtYmVyfSUKLSAgXGRvc2V0cXsjMS1zbnR9eyMyfQotfX0KLQotJSBAeHJlZiwgQHB4cmVmLCBhbmQgQHJlZiBnZW5lcmF0ZSBjcm9zcy1yZWZlcmVuY2VzLiAgRm9yIFx4cmVmWCwgIzEgaXMKLSUgdGhlIG5vZGUgbmFtZSwgIzIgdGhlIG5hbWUgb2YgdGhlIEluZm8gY3Jvc3MtcmVmZXJlbmNlLCAjMyB0aGUgcHJpbnRlZAotJSBub2RlIG5hbWUsICM0IHRoZSBuYW1lIG9mIHRoZSBJbmZvIGZpbGUsICM1IHRoZSBuYW1lIG9mIHRoZSBwcmludGVkCi0lIG1hbnVhbC4gIEFsbCBidXQgdGhlIG5vZGUgbmFtZSBjYW4gYmUgb21pdHRlZC4KLSUKLVxkZWZccHhyZWYjMXtccHV0d29yZHNlZXt9IFx4cmVmWFsjMSwsLCwsLCxdfQotXGRlZlx4cmVmIzF7XHB1dHdvcmRTZWV7fSBceHJlZlhbIzEsLCwsLCwsXX0KLVxkZWZccmVmIzF7XHhyZWZYWyMxLCwsLCwsLF19Ci1cZGVmXHhyZWZYWyMxLCMyLCMzLCM0LCM1LCM2XXtcYmVnaW5ncm91cAotICBcZGVmXHByaW50ZWRtYW51YWx7XGlnbm9yZXNwYWNlcyAjNX0lCi0gIFxkZWZccHJpbnRlZG5vZGVuYW1le1xpZ25vcmVzcGFjZXMgIzN9JQotICBcc2V0Ym94MT1caGJveHtccHJpbnRlZG1hbnVhbH0lCi0gIFxzZXRib3gwPVxoYm94e1xwcmludGVkbm9kZW5hbWV9JQotICBcaWZkaW0gXHdkMCA9IDBwdAotICAgICUgTm8gcHJpbnRlZCBub2RlIG5hbWUgd2FzIGV4cGxpY2l0bHkgZ2l2ZW4uCi0gICAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUeHJlZi1hdXRvbWF0aWMtc2VjdGlvbi10aXRsZVxlbmRjc25hbWVccmVsYXgKLSAgICAgICUgVXNlIHRoZSBub2RlIG5hbWUgaW5zaWRlIHRoZSBzcXVhcmUgYnJhY2tldHMuCi0gICAgICBcZGVmXHByaW50ZWRub2RlbmFtZXtcaWdub3Jlc3BhY2VzICMxfSUKLSAgICBcZWxzZQotICAgICAgJSBVc2UgdGhlIGFjdHVhbCBjaGFwdGVyL3NlY3Rpb24gdGl0bGUgYXBwZWFyIGluc2lkZQotICAgICAgJSB0aGUgc3F1YXJlIGJyYWNrZXRzLiAgVXNlIHRoZSByZWFsIHNlY3Rpb24gdGl0bGUgaWYgd2UgaGF2ZSBpdC4KLSAgICAgIFxpZmRpbSBcd2QxID4gMHB0Ci0gICAgICAgICUgSXQgaXMgaW4gYW5vdGhlciBtYW51YWwsIHNvIHdlIGRvbid0IGhhdmUgaXQuCi0gICAgICAgIFxkZWZccHJpbnRlZG5vZGVuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQotICAgICAgXGVsc2UKLSAgICAgICAgXGlmaGF2ZXhyZWZzCi0gICAgICAgICAgJSBXZSBrbm93IHRoZSByZWFsIHRpdGxlIGlmIHdlIGhhdmUgdGhlIHhyZWYgdmFsdWVzLgotICAgICAgICAgIFxkZWZccHJpbnRlZG5vZGVuYW1le1xyZWZ4eyMxLXRpdGxlfXt9fSUKLSAgICAgICAgXGVsc2UKLSAgICAgICAgICAlIE90aGVyd2lzZSBqdXN0IGNvcHkgdGhlIEluZm8gbm9kZSBuYW1lLgotICAgICAgICAgIFxkZWZccHJpbnRlZG5vZGVuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQotICAgICAgICBcZmklCi0gICAgICBcZmkKLSAgICBcZmkKLSAgXGZpCi0gICUKLSAgJSBJZiB3ZSB1c2UgXHVuaGJveDAgYW5kIFx1bmhib3gxIHRvIHByaW50IHRoZSBub2RlIG5hbWVzLCBUZVggZG9lcyBub3QKLSAgJSBpbnNlcnQgZW1wdHkgZGlzY3JldGlvbmFyaWVzIGFmdGVyIGh5cGhlbnMsIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbAotICAlIG5vdCBmaW5kIGEgbGluZSBicmVhayBhdCBhIGh5cGhlbiBpbiBhIG5vZGUgbmFtZXMuICBTaW5jZSBzb21lIG1hbnVhbHMKLSAgJSBhcmUgYmVzdCB3cml0dGVuIHdpdGggZmFpcmx5IGxvbmcgbm9kZSBuYW1lcywgY29udGFpbmluZyBoeXBoZW5zLCB0aGlzCi0gICUgaXMgYSBsb3NzLiAgVGhlcmVmb3JlLCB3ZSBnaXZlIHRoZSB0ZXh0IG9mIHRoZSBub2RlIG5hbWUgYWdhaW4sIHNvIGl0Ci0gICUgaXMgYXMgaWYgVGVYIGlzIHNlZWluZyBpdCBmb3IgdGhlIGZpcnN0IHRpbWUuCi0gIFxpZmRpbSBcd2QxID4gMHB0Ci0gICAgXHB1dHdvcmRzZWN0aW9ue30gYGBccHJpbnRlZG5vZGVuYW1lJycgaW4gXGNpdGV7XHByaW50ZWRtYW51YWx9JQotICBcZWxzZQotICAgICUgXyAoZm9yIGV4YW1wbGUpIGhhcyB0byBiZSB0aGUgY2hhcmFjdGVyIF8gZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUKLSAgICAlIGNvbnRyb2wgc2VxdWVuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZSwgYnV0IGl0IGhhcyB0byBleHBhbmQKLSAgICAlIGludG8gdGhlIHVzdWFsIFxsZWF2ZXZtb2RlLi4uXHZydWxlIHN0dWZmIGZvciBwdXJwb3NlcyBvZgotICAgICUgcHJpbnRpbmcuIFNvIHdlIFx0dXJub2ZmYWN0aXZlIGZvciB0aGUgXHJlZngtc250LCBiYWNrIG9uIGZvciB0aGUKLSAgICAlIHByaW50aW5nLCBiYWNrIG9mZiBmb3IgdGhlIFxyZWZ4LXBnLgotICAgIHtcbm9ybWFsdHVybm9mZmFjdGl2ZQotICAgICAlIE9ubHkgb3V0cHV0IGEgZm9sbG93aW5nIHNwYWNlIGlmIHRoZSAtc250IHJlZiBpcyBub25lbXB0eTsgZm9yCi0gICAgICUgQHVubnVtYmVyZWQgYW5kIEBhbmNob3IsIGl0IHdvbid0IGJlLgotICAgICBcc2V0Ym94MiA9IFxoYm94e1xpZ25vcmVzcGFjZXMgXHJlZnh7IzEtc250fXt9fSUKLSAgICAgXGlmZGltIFx3ZDIgPiAwcHQgXHJlZnh7IzEtc250fVxzcGFjZVxmaQotICAgIH0lCi0gICAgJSBbbXlub2RlXSwgCi0gICAgW1xwcmludGVkbm9kZW5hbWVdLFxzcGFjZQotICAgICUgcGFnZSAzCi0gICAgXHR1cm5vZmZhY3RpdmUgXHB1dHdvcmRwYWdlXHRpZVxyZWZ4eyMxLXBnfXt9JQotICBcZmkKLVxlbmRncm91cH0KLQotJSBcZG9zZXRxIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGNhbGxzIGZyb20gb3RoZXIgbWFjcm9zCi0KLSUgVXNlIFxub3JtYWx0dXJub2ZmYWN0aXZlIHNvIHRoYXQgcHVuY3R1YXRpb24gY2hhcnMgc3VjaCBhcyB1bmRlcnNjb3JlCi0lIGFuZCBiYWNrc2xhc2ggd29yayBpbiBub2RlIG5hbWVzLiAgKFx0dXJub2ZmYWN0aXZlIGRvZXNuJ3QgZG8gXC4pCi1cZGVmXGRvc2V0cSMxIzJ7JQotICB7XGxldFxmb2xpbz0wCi0gICBcbm9ybWFsdHVybm9mZmFjdGl2ZQotICAgXGVkZWZcbmV4dHtcd3JpdGVcYXV4ZmlsZXtcaW50ZXJuYWxzZXRxeyMxfXsjMn19fSUKLSAgIFxpZmxpbmtzCi0gICAgIFxuZXh0Ci0gICBcZmkKLSAgfSUKLX0KLQotJSBcaW50ZXJuYWxzZXRxIHtmb299e3BhZ2V9IGV4cGFuZHMgaW50bwotJSBDSEFSQUNURVJTICd4cmRlZiB7Zm9vfXsuLi5leHBhbnNpb24gb2YgXFlwYWdlLi4ufQotJSBXaGVuIHRoZSBhdXggZmlsZSBpcyByZWFkLCAnIGlzIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0KLVxkZWZcaW50ZXJuYWxzZXRxICMxIzJ7J3hyZGVmIHsjMX17XGNzbmFtZSAjMlxlbmRjc25hbWV9fQotCi0lIFRoaW5ncyB0byBiZSBleHBhbmRlZCBieSBcaW50ZXJuYWxzZXRxCi0KLVxkZWZcWXBhZ2VudW1iZXJ7XGZvbGlvfQotCi1cZGVmXFl0aXRsZXtcdGhpc3NlY3Rpb259Ci0KLVxkZWZcWW5vdGhpbmd7fQotCi1cZGVmXFlzZWN0aW9ubnVtYmVyYW5kdHlwZXslCi1caWZudW1cc2Vjbm89MCBccHV0d29yZENoYXB0ZXJceHJlZnRpZVx0aGVcY2hhcG5vICUKLVxlbHNlIFxpZm51bSBcc3Vic2Vjbm89MCBccHV0d29yZFNlY3Rpb25ceHJlZnRpZVx0aGVcY2hhcG5vLlx0aGVcc2Vjbm8gJQotXGVsc2UgXGlmbnVtIFxzdWJzdWJzZWNubz0wICUKLVxwdXR3b3JkU2VjdGlvblx4cmVmdGllXHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vICUKLVxlbHNlICUKLVxwdXR3b3JkU2VjdGlvblx4cmVmdGllXHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm8gJQotXGZpIFxmaSBcZmkgfQotCi1cZGVmXFlhcHBlbmRpeGxldHRlcmFuZHR5cGV7JQotXGlmbnVtXHNlY25vPTAgXHB1dHdvcmRBcHBlbmRpeFx4cmVmdGllJ2NoYXJcdGhlXGFwcGVuZGl4bm97fSUKLVxlbHNlIFxpZm51bSBcc3Vic2Vjbm89MCBccHV0d29yZFNlY3Rpb25ceHJlZnRpZSdjaGFyXHRoZVxhcHBlbmRpeG5vLlx0aGVcc2Vjbm8gJQotXGVsc2UgXGlmbnVtIFxzdWJzdWJzZWNubz0wICUKLVxwdXR3b3JkU2VjdGlvblx4cmVmdGllJ2NoYXJcdGhlXGFwcGVuZGl4bm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vICUKLVxlbHNlICUKLVxwdXR3b3JkU2VjdGlvblx4cmVmdGllJ2NoYXJcdGhlXGFwcGVuZGl4bm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm8gJQotXGZpIFxmaSBcZmkgfQotCi1cZ2RlZlx4cmVmdGlleyd0aWV9Ci0KLSUgVXNlIFRlWCAzLjAncyBcaW5wdXRsaW5lbm8gdG8gZ2V0IHRoZSBsaW5lIG51bWJlciwgZm9yIGJldHRlciBlcnJvcgotJSBtZXNzYWdlcywgYnV0IGlmIHdlJ3JlIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mIFRlWCwgZG9uJ3QgZG8gYW55dGhpbmcuCi0lCi1caWZ4XGlucHV0bGluZW5vXHRoaXNpc3VuZGVmaW5lZAotICBcbGV0XGxpbmVudW1iZXIgPSBcZW1wdHkgJSBOb24tMy4wLgotXGVsc2UKLSAgXGRlZlxsaW5lbnVtYmVye1x0aGVcaW5wdXRsaW5lbm86XHNwYWNlfQotXGZpCi0KLSUgRGVmaW5lIFxyZWZ4e05BTUV9e1NVRkZJWH0gdG8gcmVmZXJlbmNlIGEgY3Jvc3MtcmVmZXJlbmNlIHN0cmluZyBuYW1lZCBOQU1FLgotJSBJZiBpdHMgdmFsdWUgaXMgbm9uZW1wdHksIFNVRkZJWCBpcyBvdXRwdXQgYWZ0ZXJ3YXJkLgotCi1cZGVmXHJlZngjMSMyeyUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgWCMxXGVuZGNzbmFtZVxyZWxheAotICAgICUgSWYgbm90IGRlZmluZWQsIHNheSBzb21ldGhpbmcgYXQgbGVhc3QuCi0gICAgXGFuZ2xlbGVmdCB1blwtZGVcLWZpbmVkXGFuZ2xlcmlnaHQKLSAgICBcaWZsaW5rcwotICAgICAgXGlmaGF2ZXhyZWZzCi0gICAgICAgIFxtZXNzYWdle1xsaW5lbnVtYmVyIFVuZGVmaW5lZCBjcm9zcyByZWZlcmVuY2UgYCMxJy59JQotICAgICAgXGVsc2UKLSAgICAgICAgXGlmd2FybmVkeHJlZnNcZWxzZQotICAgICAgICAgIFxnbG9iYWxcd2FybmVkeHJlZnN0cnVlCi0gICAgICAgICAgXG1lc3NhZ2V7Q3Jvc3MgcmVmZXJlbmNlIHZhbHVlcyB1bmtub3duOyB5b3UgbXVzdCBydW4gVGVYIGFnYWluLn0lCi0gICAgICAgIFxmaQotICAgICAgXGZpCi0gICAgXGZpCi0gIFxlbHNlCi0gICAgJSBJdCdzIGRlZmluZWQsIHNvIGp1c3QgdXNlIGl0LgotICAgIFxjc25hbWUgWCMxXGVuZGNzbmFtZQotICBcZmkKLSAgIzIlIE91dHB1dCB0aGUgc3VmZml4IGluIGFueSBjYXNlLgotfQotCi0lIFRoaXMgaXMgdGhlIG1hY3JvIGludm9rZWQgYnkgZW50cmllcyBpbiB0aGUgYXV4IGZpbGUuCi0lIAotXGRlZlx4cmRlZiMxe1xiZWdpbmdyb3VwCi0gICUgUmVlbmFibGUgXCBhcyBhbiBlc2NhcGUgd2hpbGUgcmVhZGluZyB0aGUgc2Vjb25kIGFyZ3VtZW50LgotICBcY2F0Y29kZWBcXCA9IDAKLSAgXGFmdGVyYXNzaWdubWVudFxlbmRncm91cAotICBcZXhwYW5kYWZ0ZXJcZ2RlZlxjc25hbWUgWCMxXGVuZGNzbmFtZQotfQotCi0lIFJlYWQgdGhlIGxhc3QgZXhpc3RpbmcgYXV4IGZpbGUsIGlmIGFueS4gIE5vIGVycm9yIGlmIG5vbmUgZXhpc3RzLgotXGRlZlxyZWFkYXV4ZmlsZXtcYmVnaW5ncm91cAotICBcY2F0Y29kZWBcXl5APVxvdGhlcgotICBcY2F0Y29kZWBcXl5BPVxvdGhlcgotICBcY2F0Y29kZWBcXl5CPVxvdGhlcgotICBcY2F0Y29kZWBcXl5DPVxvdGhlcgotICBcY2F0Y29kZWBcXl5EPVxvdGhlcgotICBcY2F0Y29kZWBcXl5FPVxvdGhlcgotICBcY2F0Y29kZWBcXl5GPVxvdGhlcgotICBcY2F0Y29kZWBcXl5HPVxvdGhlcgotICBcY2F0Y29kZWBcXl5IPVxvdGhlcgotICBcY2F0Y29kZWBcXl5LPVxvdGhlcgotICBcY2F0Y29kZWBcXl5MPVxvdGhlcgotICBcY2F0Y29kZWBcXl5OPVxvdGhlcgotICBcY2F0Y29kZWBcXl5QPVxvdGhlcgotICBcY2F0Y29kZWBcXl5RPVxvdGhlcgotICBcY2F0Y29kZWBcXl5SPVxvdGhlcgotICBcY2F0Y29kZWBcXl5TPVxvdGhlcgotICBcY2F0Y29kZWBcXl5UPVxvdGhlcgotICBcY2F0Y29kZWBcXl5VPVxvdGhlcgotICBcY2F0Y29kZWBcXl5WPVxvdGhlcgotICBcY2F0Y29kZWBcXl5XPVxvdGhlcgotICBcY2F0Y29kZWBcXl5YPVxvdGhlcgotICBcY2F0Y29kZWBcXl5aPVxvdGhlcgotICBcY2F0Y29kZWBcXl5bPVxvdGhlcgotICBcY2F0Y29kZWBcXl5cPVxvdGhlcgotICBcY2F0Y29kZWBcXl5dPVxvdGhlcgotICBcY2F0Y29kZWBcXl5ePVxvdGhlcgotICBcY2F0Y29kZWBcXl5fPVxvdGhlcgotICBcY2F0Y29kZWBcQD1cb3RoZXIKLSAgXGNhdGNvZGVgXF49XG90aGVyCi0gICUgSXQgd2FzIHN1Z2dlc3RlZCB0byBkZWZpbmUgdGhpcyBhcyA3LCB3aGljaCB3b3VsZCBhbGxvdyBeXmU0IGV0Yy4KLSAgJSBpbiB4cmVmIHRhZ3MsIGkuZS4sIG5vZGUgbmFtZXMuICBCdXQgc2luY2UgXl5lNCBub3RhdGlvbiBpc24ndAotICAlIHN1cHBvcnRlZCBpbiB0aGUgbWFpbiB0ZXh0LCBpdCBkb2Vzbid0IHNlZW0gZGVzaXJhYmxlLiAgRnVydGhlcm1vcmUsCi0gICUgdGhhdCBpcyBub3QgZW5vdWdoOiBmb3Igbm9kZSBuYW1lcyB0aGF0IGFjdHVhbGx5IGNvbnRhaW4gYSBeCi0gICUgY2hhcmFjdGVyLCB3ZSB3b3VsZCBlbmQgdXAgd3JpdGluZyBhIGxpbmUgbGlrZSB0aGlzOiAneHJkZWYgeydoYXQKLSAgJSBiLXRpdGxlfXsnaGF0IGJ9IGFuZCBceHJkZWYgZG9lcyBhIFxjc25hbWUuLi5cZW5kY3NuYW1lIG9uIHRoZSBmaXJzdAotICAlIGFyZ3VtZW50LCBhbmQgXGhhdCBpcyBub3QgYW4gZXhwYW5kYWJsZSBjb250cm9sIHNlcXVlbmNlLiAgSXQgY291bGQKLSAgJSBhbGwgYmUgd29ya2VkIG91dCwgYnV0IHdoeT8gIEVpdGhlciB3ZSBzdXBwb3J0IF5eIG9yIHdlIGRvbid0LgotICAlCi0gICUgVGhlIG90aGVyIGNoYW5nZSBuZWNlc3NhcnkgZm9yIHRoaXMgd2FzIHRvIGRlZmluZSBcYXV4aGF0OgotICAlIFxkZWZcYXV4aGF0e1xkZWZeeydoYXQgfX0lIGV4dHJhIHNwYWNlIHNvIG9rIGlmIGZvbGxvd2VkIGJ5IGxldHRlcgotICAlIGFuZCB0aGVuIHRvIGNhbGwgXGF1eGhhdCBpbiBcc2V0cS4KLSAgJQotICBcY2F0Y29kZWBcfj1cb3RoZXIKLSAgXGNhdGNvZGVgXFs9XG90aGVyCi0gIFxjYXRjb2RlYFxdPVxvdGhlcgotICBcY2F0Y29kZWBcIj1cb3RoZXIKLSAgXGNhdGNvZGVgXF89XG90aGVyCi0gIFxjYXRjb2RlYFx8PVxvdGhlcgotICBcY2F0Y29kZWBcPD1cb3RoZXIKLSAgXGNhdGNvZGVgXD49XG90aGVyCi0gIFxjYXRjb2RlYFwkPVxvdGhlcgotICBcY2F0Y29kZWBcIz1cb3RoZXIKLSAgXGNhdGNvZGVgXCY9XG90aGVyCi0gIFxjYXRjb2RlYCs9XG90aGVyICUgYXZvaWQgXCsgZm9yIHBhcmFub2lhIGV2ZW4gdGhvdWdoIHdlJ3ZlIHR1cm5lZCBpdCBvZmYKLSAgJSBNYWtlIHRoZSBjaGFyYWN0ZXJzIDEyOC0yNTUgYmUgcHJpbnRpbmcgY2hhcmFjdGVycwotICB7JQotICAgIFxjb3VudCAxPTEyOAotICAgIFxkZWZcbG9vcHslCi0gICAgICBcY2F0Y29kZVxjb3VudCAxPVxvdGhlcgotICAgICAgXGFkdmFuY2VcY291bnQgMSBieSAxCi0gICAgICBcaWZudW0gXGNvdW50IDE8MjU2IFxsb29wIFxmaQotICAgIH0lCi0gIH0lCi0gICUgVGhlIGF1eCBmaWxlIHVzZXMgJyBhcyB0aGUgZXNjYXBlIChmb3Igbm93KS4KLSAgJSBUdXJuIG9mZiBcIGFzIGFuIGVzY2FwZSBzbyB3ZSBkbyBub3QgbG9zZSBvbgotICAlIGVudHJpZXMgd2hpY2ggd2VyZSBkdW1wZWQgd2l0aCBjb250cm9sIHNlcXVlbmNlcyBpbiB0aGVpciBuYW1lcy4KLSAgJSBGb3IgZXhhbXBsZSwgJ3hyZGVmIHskXGxlcSAkLWZ1bn17cGFnZSAuLi59IG1hZGUgYnkgQGRlZnVuIF5eCi0gICUgUmVmZXJlbmNlIHRvIHN1Y2ggZW50cmllcyBzdGlsbCBkb2VzIG5vdCB3b3JrIHRoZSB3YXkgb25lIHdvdWxkIHdpc2gsCi0gICUgYnV0IGF0IGxlYXN0IHRoZXkgZG8gbm90IGJvbWIgb3V0IHdoZW4gdGhlIGF1eCBmaWxlIGlzIHJlYWQgaW4uCi0gIFxjYXRjb2RlYFx7PTEKLSAgXGNhdGNvZGVgXH09MgotICBcY2F0Y29kZWBcJT1cb3RoZXIKLSAgXGNhdGNvZGVgXCc9MAotICBcY2F0Y29kZWBcXD1cb3RoZXIKLSAgJQotICBcb3BlbmluIDEgXGpvYm5hbWUuYXV4Ci0gIFxpZmVvZiAxIFxlbHNlCi0gICAgXGNsb3NlaW4gMQotICAgIFxpbnB1dCBcam9ibmFtZS5hdXgKLSAgICBcZ2xvYmFsXGhhdmV4cmVmc3RydWUKLSAgICBcZ2xvYmFsXHdhcm5lZG9ic3RydWUKLSAgXGZpCi0gICUgT3BlbiB0aGUgbmV3IGF1eCBmaWxlLiAgVGVYIHdpbGwgY2xvc2UgaXQgYXV0b21hdGljYWxseSBhdCBleGl0LgotICBcb3Blbm91dFxhdXhmaWxlPVxqb2JuYW1lLmF1eAotXGVuZGdyb3VwfQotCi0KLSUgRm9vdG5vdGVzLgotCi1cbmV3Y291bnQgXGZvb3Rub3Rlbm8KLQotJSBUaGUgdHJhaWxpbmcgc3BhY2UgaW4gdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGZvciBzdXBlcmVqZWN0IGlzCi0lIHZpdGFsIGZvciBwcm9wZXIgZmlsbGluZzsgcGFnZXMgY29tZSBvdXQgdW5hbGlnbmVkIHdoZW4geW91IGRvIGEKLSUgcGFnZWFsaWdubWFjcm8gY2FsbCBpZiB0aGF0IHNwYWNlIGJlZm9yZSB0aGUgY2xvc2luZyBicmFjZSBpcwotJSByZW1vdmVkLiAoR2VuZXJhbGx5LCBudW1lcmljIGNvbnN0YW50cyBzaG91bGQgYWx3YXlzIGJlIGZvbGxvd2VkIGJ5IGEKLSUgc3BhY2UgdG8gcHJldmVudCBzdHJhbmdlIGV4cGFuc2lvbiBlcnJvcnMuKQotXGRlZlxzdXBlcmVqZWN0e1xwYXJccGVuYWx0eSAtMjAwMDBcZm9vdG5vdGVubyA9MCB9Ci0KLSUgQGZvb3Rub3Rlc3R5bGUgaXMgbWVhbmluZ2Z1bCBmb3IgaW5mbyBvdXRwdXQgb25seS4KLVxsZXRcZm9vdG5vdGVzdHlsZT1cY29tbWVudAotCi1cbGV0XHB0ZXhmb290bm90ZT1cZm9vdG5vdGUKLQote1xjYXRjb2RlIGBcQD0xMQotJQotJSBBdXRvLW51bWJlciBmb290bm90ZXMuICBPdGhlcndpc2UgbGlrZSBwbGFpbi4KLVxnZGVmXGZvb3Rub3RleyUKLSAgXGdsb2JhbFxhZHZhbmNlXGZvb3Rub3Rlbm8gYnkgXEBuZQotICBcZWRlZlx0aGlzZm9vdG5veyRee1x0aGVcZm9vdG5vdGVub30kfSUKLSAgJQotICAlIEluIGNhc2UgdGhlIGZvb3Rub3RlIGNvbWVzIGF0IHRoZSBlbmQgb2YgYSBzZW50ZW5jZSwgcHJlc2VydmUgdGhlCi0gICUgZXh0cmEgc3BhY2luZyBhZnRlciB3ZSBkbyB0aGUgZm9vdG5vdGUgbnVtYmVyLgotICBcbGV0XEBzZlxlbXB0eQotICBcaWZobW9kZVxlZGVmXEBzZntcc3BhY2VmYWN0b3JcdGhlXHNwYWNlZmFjdG9yfVwvXGZpCi0gICUKLSAgJSBSZW1vdmUgaW5hZHZlcnRlbnQgYmxhbmsgc3BhY2UgYmVmb3JlIHR5cGVzZXR0aW5nIHRoZSBmb290bm90ZSBudW1iZXIuCi0gIFx1bnNraXAKLSAgXHRoaXNmb290bm9cQHNmCi0gIFxmb290bm90ZXp6egotfSUKLQotJSBEb24ndCBib3RoZXIgd2l0aCB0aGUgdHJpY2tlcnkgaW4gcGxhaW4udGV4IHRvIG5vdCByZXF1aXJlIHRoZQotJSBmb290bm90ZSB0ZXh0IGFzIGEgcGFyYW1ldGVyLiAgT3VyIGZvb3Rub3RlcyBkb24ndCBuZWVkIHRvIGJlIHNvIGdlbmVyYWwuCi0lCi0lIE9oIHllcywgdGhleSBkbzsgb3RoZXJ3aXNlLCBAaWZzZXQgYW5kIGFueXRoaW5nIGVsc2UgdGhhdCB1c2VzCi0lIFxwYXJzZWFyZ2xpbmUgZmFpbCBpbnNpZGUgZm9vdG5vdGVzIGJlY2F1c2UgdGhlIHRva2VucyBhcmUgZml4ZWQgd2hlbgotJSB0aGUgZm9vdG5vdGUgaXMgcmVhZC4gIC0ta2FybCwgMTZub3Y5Ni4KLSUKLVxsb25nXGdkZWZcZm9vdG5vdGV6enp7XGluc2VydFxmb290aW5zXGJncm91cAotICAlIFdlIHdhbnQgdG8gdHlwZXNldCB0aGlzIHRleHQgYXMgYSBub3JtYWwgcGFyYWdyYXBoLCBldmVuIGlmIHRoZQotICAlIGZvb3Rub3RlIHJlZmVyZW5jZSBvY2N1cnMgaW4gKGZvciBleGFtcGxlKSBhIGRpc3BsYXkgZW52aXJvbm1lbnQuCi0gICUgU28gcmVzZXQgc29tZSBwYXJhbWV0ZXJzLgotICBcaW50ZXJsaW5lcGVuYWx0eVxpbnRlcmZvb3Rub3RlbGluZXBlbmFsdHkKLSAgXHNwbGl0dG9wc2tpcFxodFxzdHJ1dGJveCAlIHRvcCBiYXNlbGluZSBmb3IgYnJva2VuIGZvb3Rub3RlcwotICBcc3BsaXRtYXhkZXB0aFxkcFxzdHJ1dGJveAotICBcZmxvYXRpbmdwZW5hbHR5XEBNTQotICBcbGVmdHNraXBcekBza2lwCi0gIFxyaWdodHNraXBcekBza2lwCi0gIFxzcGFjZXNraXBcekBza2lwCi0gIFx4c3BhY2Vza2lwXHpAc2tpcAotICBccGFyaW5kZW50XGRlZmF1bHRwYXJpbmRlbnQKLSAgJQotICAlIEhhbmcgdGhlIGZvb3Rub3RlIHRleHQgb2ZmIHRoZSBudW1iZXIuCi0gIFxoYW5nCi0gIFx0ZXh0aW5kZW50e1x0aGlzZm9vdG5vfSUKLSAgJQotICAlIERvbid0IGNyYXNoIGludG8gdGhlIGxpbmUgYWJvdmUgdGhlIGZvb3Rub3RlIHRleHQuICBTaW5jZSB0aGlzCi0gICUgZXhwYW5kcyBpbnRvIGEgYm94LCBpdCBtdXN0IGNvbWUgd2l0aGluIHRoZSBwYXJhZ3JhcGgsIGxlc3QgaXQKLSAgJSBwcm92aWRlIGEgcGxhY2Ugd2hlcmUgVGVYIGNhbiBzcGxpdCB0aGUgZm9vdG5vdGUuCi0gIFxmb290c3RydXQKLSAgXGZ1dHVyZWxldFxuZXh0XGZvQHQKLX0KLVxkZWZcZm9AdHtcaWZjYXRcYmdyb3VwXG5vZXhwYW5kXG5leHQgXGxldFxuZXh0XGZAQHQKLSAgXGVsc2VcbGV0XG5leHRcZkB0XGZpIFxuZXh0fQotXGRlZlxmQEB0e1xiZ3JvdXBcYWZ0ZXJncm91cFxAZm9vdFxsZXRcbmV4dH0KLVxkZWZcZkB0IzF7IzFcQGZvb3R9Ci1cZGVmXEBmb290e1xzdHJ1dFxlZ3JvdXB9Ci0KLX0lZW5kIFxjYXRjb2RlIGBcQD0xMQotCi0lIFNldCB0aGUgYmFzZWxpbmVza2lwIHRvICMxLCBhbmQgdGhlIGxpbmVza2lwIGFuZCBzdHJ1dCBzaXplCi0lIGNvcnJlc3BvbmRpbmdseS4gIFRoZXJlIGlzIG5vIGRlZXAgbWVhbmluZyBiZWhpbmQgdGhlc2UgbWFnaWMgbnVtYmVycwotJSB1c2VkIGFzIGZhY3RvcnM7IHRoZXkganVzdCBtYXRjaCAoY2xvc2VseSBlbm91Z2gpIHdoYXQgS251dGggZGVmaW5lZC4KLSUKLVxkZWZcbGluZXNraXBmYWN0b3J7LjA4MzMzfQotXGRlZlxzdHJ1dGhlaWdodHBlcmNlbnR7LjcwODMzfQotXGRlZlxzdHJ1dGRlcHRocGVyY2VudCB7LjI5MTY3fQotJQotXGRlZlxzZXRsZWFkaW5nIzF7JQotICBcbm9ybWFsYmFzZWxpbmVza2lwID0gIzFccmVsYXgKLSAgXG5vcm1hbGxpbmVza2lwID0gXGxpbmVza2lwZmFjdG9yXG5vcm1hbGJhc2VsaW5lc2tpcAotICBcbm9ybWFsYmFzZWxpbmVzCi0gIFxzZXRib3hcc3RydXRib3ggPVxoYm94eyUKLSAgICBcdnJ1bGUgd2lkdGgwcHQgaGVpZ2h0XHN0cnV0aGVpZ2h0cGVyY2VudFxiYXNlbGluZXNraXAKLSAgICAgICAgICAgICAgICAgICAgZGVwdGggXHN0cnV0ZGVwdGhwZXJjZW50IFxiYXNlbGluZXNraXAKLSAgfSUKLX0KLQotJSBAfCBpbnNlcnRzIGEgY2hhbmdlYmFyIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IGxpbmUuICBJdCBzaG91bGQKLSUgc3Vycm91bmQgYW55IGNoYW5nZWQgdGV4dC4gIFRoaXMgYXBwcm9hY2ggZG9lcyAqbm90KiB3b3JrIGlmIHRoZQotJSBjaGFuZ2Ugc3BhbnMgbW9yZSB0aGFuIHR3byBsaW5lcyBvZiBvdXRwdXQuICBUbyBoYW5kbGUgdGhhdCwgd2Ugd291bGQKLSUgaGF2ZSBhZG9wdCBhIG11Y2ggbW9yZSBkaWZmaWN1bHQgYXBwcm9hY2ggKHB1dHRpbmcgbWFya3MgaW50byB0aGUgbWFpbgotJSB2ZXJ0aWNhbCBsaXN0IGZvciB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgZWFjaCBjaGFuZ2UpLgotJQotXGRlZlx8eyUKLSAgJSBcdmFkanVzdCBjYW4gb25seSBiZSB1c2VkIGluIGhvcml6b250YWwgbW9kZS4KLSAgXGxlYXZldm1vZGUKLSAgJQotICAlIEFwcGVuZCB0aGlzIHZlcnRpY2FsIG1vZGUgbWF0ZXJpYWwgYWZ0ZXIgdGhlIGN1cnJlbnQgbGluZSBpbiB0aGUgb3V0cHV0LgotICBcdmFkanVzdHslCi0gICAgJSBXZSB3YW50IHRvIGluc2VydCBhIHJ1bGUgd2l0aCB0aGUgaGVpZ2h0IGFuZCBkZXB0aCBvZiB0aGUgY3VycmVudAotICAgICUgbGVhZGluZzsgdGhhdCBpcyBleGFjdGx5IHdoYXQgXHN0cnV0Ym94IGlzIHN1cHBvc2VkIHRvIHJlY29yZC4KLSAgICBcdnNraXAtXGJhc2VsaW5lc2tpcAotICAgICUKLSAgICAlIFx2YWRqdXN0LWl0ZW1zIGFyZSBpbnNlcnRlZCBhdCB0aGUgbGVmdCBlZGdlIG9mIHRoZSB0eXBlLiAgU28KLSAgICAlIHRoZSBcbGxhcCBoZXJlIG1vdmVzIG91dCBpbnRvIHRoZSBsZWZ0LWhhbmQgbWFyZ2luLgotICAgIFxsbGFweyUKLSAgICAgICUKLSAgICAgICUgRm9yIGEgdGhpY2tlciBvciB0aGlubmVyIGJhciwgY2hhbmdlIHRoZSBgMXB0Jy4KLSAgICAgIFx2cnVsZSBoZWlnaHRcYmFzZWxpbmVza2lwIHdpZHRoMXB0Ci0gICAgICAlCi0gICAgICAlIFRoaXMgaXMgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGJhciBhbmQgdGhlIHRleHQuCi0gICAgICBcaHNraXAgMTJwdAotICAgIH0lCi0gIH0lCi19Ci0KLSUgRm9yIGEgZmluYWwgY29weSwgdGFrZSBvdXQgdGhlIHJlY3RhbmdsZXMKLSUgdGhhdCBtYXJrIG92ZXJmdWxsIGJveGVzIChpbiBjYXNlIHlvdSBoYXZlIGRlY2lkZWQKLSUgdGhhdCB0aGUgdGV4dCBsb29rcyBvayBldmVuIHRob3VnaCBpdCBwYXNzZXMgdGhlIG1hcmdpbikuCi0lCi1cZGVmXGZpbmFsb3V0e1xvdmVyZnVsbHJ1bGU9MHB0fQotCi0lIEBpbWFnZS4gIFdlIHVzZSB0aGUgbWFjcm9zIGZyb20gZXBzZi50ZXggdG8gc3VwcG9ydCB0aGlzLgotJSBJZiBlcHNmLnRleCBpcyBub3QgaW5zdGFsbGVkIGFuZCBAaW1hZ2UgaXMgdXNlZCwgd2UgY29tcGxhaW4uCi0lIAotJSBDaGVjayBmb3IgYW5kIHJlYWQgZXBzZi50ZXggdXAgZnJvbnQuICBJZiB3ZSByZWFkIGl0IG9ubHkgYXQgQGltYWdlCi0lIHRpbWUsIHdlIG1pZ2h0IGJlIGluc2lkZSBhIGdyb3VwLCBhbmQgdGhlbiBpdHMgZGVmaW5pdGlvbnMgd291bGQgZ2V0Ci0lIHVuZG9uZSBhbmQgdGhlIG5leHQgaW1hZ2Ugd291bGQgZmFpbC4KLVxvcGVuaW4gMSA9IGVwc2YudGV4Ci1caWZlb2YgMSBcZWxzZQotICBcY2xvc2VpbiAxCi0gICUgRG8gbm90IGJvdGhlciBzaG93aW5nIGJhbm5lciB3aXRoIHBvc3QtdjIuNyBlcHNmLnRleCAoYXZhaWxhYmxlIGluCi0gICUgZG9jL2Vwc2YudGV4IHVudGlsIGl0IHNob3dzIHVwIG9uIGN0YW4pLgotICBcZGVmXGVwc2Zhbm5vdW5jZXtcdG9rczAgPSB9JQotICBcaW5wdXQgZXBzZi50ZXgKLVxmaQotJQotXG5ld2lmXGlmd2FybmVkbm9lcHNmCi1cbmV3aGVscFxub2Vwc2ZoZWxwe2Vwc2YudGV4IG11c3QgYmUgaW5zdGFsbGVkIGZvciBpbWFnZXMgdG8KLSAgd29yay4gIEl0IGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIFRleGluZm8gZGlzdHJpYnV0aW9uLCBvciB5b3UgY2FuIGdldAotICBpdCBmcm9tIGZ0cDovL2Z0cC50dWcub3JnL3RleC9lcHNmLnRleC59Ci0lCi0lIE9ubHkgY29tcGxhaW4gb25jZSBhYm91dCBsYWNrIG9mIGVwc2YudGV4LgotXGRlZlxpbWFnZSMxeyUKLSAgXGlmeFxlcHNmYm94XHVuZGVmaW5lZAotICAgIFxpZndhcm5lZG5vZXBzZiBcZWxzZQotICAgICAgXGVycmhlbHAgPSBcbm9lcHNmaGVscAotICAgICAgXGVycm1lc3NhZ2V7ZXBzZi50ZXggbm90IGZvdW5kLCBpbWFnZXMgd2lsbCBiZSBpZ25vcmVkfSUKLSAgICAgIFxnbG9iYWxcd2FybmVkbm9lcHNmdHJ1ZQotICAgIFxmaQotICBcZWxzZQotICAgIFxpbWFnZXh4eCAjMSwsLFxmaW5pc2gKLSAgXGZpCi19Ci0lCi0lIEFyZ3VtZW50cyB0byBAaW1hZ2U6Ci0lICMxIGlzIChtYW5kYXRvcnkpIGltYWdlIGZpbGVuYW1lOyB3ZSB0YWNrIG9uIC5lcHMgZXh0ZW5zaW9uLgotJSAjMiBpcyAob3B0aW9uYWwpIHdpZHRoLCAjMyBpcyAob3B0aW9uYWwpIGhlaWdodC4KLSUgIzQgaXMganVzdCB0aGUgdXN1YWwgZXh0cmEgaWdub3JlZCBhcmcgZm9yIHBhcnNpbmcgdGhpcyBzdHVmZi4KLVxkZWZcaW1hZ2V4eHgjMSwjMiwjMywjNFxmaW5pc2h7JQotICAlIFxlcHNmYm94IGl0c2VsZiByZXNldHMgXGVwc2Y/c2l6ZSBhdCBlYWNoIGZpZ3VyZS4KLSAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfVxpZmRpbVx3ZDAgPiAwcHQgXGVwc2Z4c2l6ZT0jMlxyZWxheCBcZmkKLSAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMzfVxpZmRpbVx3ZDAgPiAwcHQgXGVwc2Z5c2l6ZT0jM1xyZWxheCBcZmkKLSAgJSBJZiB0aGUgaW1hZ2UgaXMgYnkgaXRzZWxmLCBjZW50ZXIgaXQuCi0gIFxpZnZtb2RlCi0gICAgXG5vYnJlYWtcbWVkc2tpcAotICAgIFxub2JyZWFrCi0gICAgXGNlbnRlcmxpbmV7XGVwc2Zib3h7IzEuZXBzfX0lCi0gICAgXGJpZ2JyZWFrCi0gIFxlbHNlCi0gICAgXGVwc2Zib3h7IzEuZXBzfSUKLSAgXGZpCi19Ci0KLQotXG1lc3NhZ2V7cGFwZXIgc2l6ZXMsfQotJSBBbmQgb3RoZXIgcmVsYXRlZCBwYXJhbWV0ZXJzLgotCi1cbmV3ZGltZW5cZGVmYXVsdHBhcmluZGVudCBcZGVmYXVsdHBhcmluZGVudCA9IDE1cHQKLQotXGNoYXBoZWFkaW5nc2tpcCA9IDE1cHQgcGx1cyA0cHQgbWludXMgMnB0Ci1cc2VjaGVhZGluZ3NraXAgPSAxMnB0IHBsdXMgM3B0IG1pbnVzIDJwdAotXHN1YnNlY2hlYWRpbmdza2lwID0gOXB0IHBsdXMgMnB0IG1pbnVzIDJwdAotCi0lIFByZXZlbnQgdW5kZXJmdWxsIHZib3ggZXJyb3IgbWVzc2FnZXMuCi1cdmJhZG5lc3MgPSAxMDAwMAotCi0lIERvbid0IGJlIHNvIGZpbmlja3kgYWJvdXQgdW5kZXJmdWxsIGhib3hlcywgZWl0aGVyLgotXGhiYWRuZXNzID0gMjAwMAotCi0lIEZvbGxvd2luZyBHZW9yZ2UgQnVzaCwganVzdCBnZXQgcmlkIG9mIHdpZG93cyBhbmQgb3JwaGFucy4KLVx3aWRvd3BlbmFsdHk9MTAwMDAKLVxjbHVicGVuYWx0eT0xMDAwMAotCi0lIFVzZSBUZVggMy4wJ3MgXGVtZXJnZW5jeXN0cmV0Y2ggdG8gaGVscCBsaW5lIGJyZWFraW5nLCBidXQgaWYgd2UncmUKLSUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YgVGVYLCBkb24ndCBkbyBhbnl0aGluZy4gIFdlIHdhbnQgdGhlIGFtb3VudCBvZgotJSBzdHJldGNoIGFkZGVkIHRvIGRlcGVuZCBvbiB0aGUgbGluZSBsZW5ndGgsIGhlbmNlIHRoZSBkZXBlbmRlbmNlIG9uCi0lIFxoc2l6ZS4gIFRoaXMgbWFrZXMgaXQgY29tZSB0byBhYm91dCA5cHQgZm9yIHRoZSA4LjV4MTEgZm9ybWF0LiAgV2UKLSUgY2FsbCB0aGlzIHdoZW5ldmVyIHRoZSBwYXBlciBzaXplIGlzIHNldC4KLSUKLVxkZWZcc2V0ZW1lcmdlbmN5c3RyZXRjaHslCi0gIFxpZnhcZW1lcmdlbmN5c3RyZXRjaFx0aGlzaXN1bmRlZmluZWQKLSAgICAlIEFsbG93IHVzIHRvIGFzc2lnbiB0byBcZW1lcmdlbmN5c3RyZXRjaCBhbnl3YXkuCi0gICAgXGRlZlxlbWVyZ2VuY3lzdHJldGNoe1xkaW1lbjB9JQotICBcZWxzZQotICAgIFxlbWVyZ2VuY3lzdHJldGNoID0gXGhzaXplCi0gICAgXGRpdmlkZVxlbWVyZ2VuY3lzdHJldGNoIGJ5IDQ1Ci0gIFxmaQotfQotCi0lIFBhcmFtZXRlcnMgaW4gb3JkZXI6IDEpIHRleHRoZWlnaHQ7IDIpIHRleHR3aWR0aDsgMykgdm9mZnNldDsKLSUgNCkgaG9mZnNldDsgNSkgYmluZGluZyBvZmZzZXQ7IDYpIHRvcHNraXAuICBUaGVuIHdob2V2ZXIgY2FsbHMgdXMgY2FuCi0lIHNldCBccGFyc2tpcCBhbmQgY2FsbCBcc2V0bGVhZGluZyBmb3IgXGJhc2VsaW5lc2tpcC4KLSUKLVxkZWZcaW50ZXJuYWxwYWdlc2l6ZXMjMSMyIzMjNCM1IzZ7JQotICBcdm9mZnNldCA9ICMzXHJlbGF4Ci0gIFx0b3Bza2lwID0gIzZccmVsYXgKLSAgXHNwbGl0dG9wc2tpcCA9IFx0b3Bza2lwCi0gICUKLSAgXHZzaXplID0gIzFccmVsYXgKLSAgXGFkdmFuY2VcdnNpemUgYnkgXHRvcHNraXAKLSAgXG91dGVydnNpemUgPSBcdnNpemUKLSAgXGFkdmFuY2Vcb3V0ZXJ2c2l6ZSBieSAwLjZpbgotICBccGFnZWhlaWdodCA9IFx2c2l6ZQotICAlCi0gIFxoc2l6ZSA9ICMyXHJlbGF4Ci0gIFxvdXRlcmhzaXplID0gXGhzaXplCi0gIFxhZHZhbmNlXG91dGVyaHNpemUgYnkgMC41aW4KLSAgXHBhZ2V3aWR0aCA9IFxoc2l6ZQotICAlCi0gIFxub3JtYWxvZmZzZXQgPSAjNFxyZWxheAotICBcYmluZGluZ29mZnNldCA9ICM1XHJlbGF4Ci0gICUKLSAgXHBhcmluZGVudCA9IFxkZWZhdWx0cGFyaW5kZW50Ci0gIFxzZXRlbWVyZ2VuY3lzdHJldGNoCi19Ci0KLSUgQGxldHRlcnBhcGVyICh0aGUgZGVmYXVsdCkuCi1cZGVmXGxldHRlcnBhcGVye3tcZ2xvYmFsZGVmcyA9IDEKLSAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0Ci0gIFxzZXRsZWFkaW5nezEzLjJwdH0lCi0gICUKLSAgJSBJZiBwYWdlIGlzIG5vdGhpbmcgYnV0IHRleHQsIG1ha2UgaXQgY29tZSBvdXQgZXZlbi4KLSAgXGludGVybmFscGFnZXNpemVzezQ2XGJhc2VsaW5lc2tpcH17NmlufXtcdm9mZnNldH17LjI1aW59e1xiaW5kaW5nb2Zmc2V0fXszNnB0fSUKLX19Ci0KLSUgVXNlIEBzbWFsbGJvb2sgdG8gcmVzZXQgcGFyYW1ldGVycyBmb3IgN3g5LjUgKG9yIHNvKSBmb3JtYXQuCi1cZGVmXHNtYWxsYm9va3t7XGdsb2JhbGRlZnMgPSAxCi0gIFxwYXJza2lwID0gMnB0IHBsdXMgMXB0Ci0gIFxzZXRsZWFkaW5nezEycHR9JQotICAlCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3s3LjVpbn17NS5pbn17XHZvZmZzZXR9ey4yNWlufXtcYmluZGluZ29mZnNldH17MTZwdH0lCi0gICUKLSAgXGxpc3BuYXJyb3dpbmcgPSAwLjNpbgotICBcdG9sZXJhbmNlID0gNzAwCi0gIFxoZnV6eiA9IDFwdAotICBcY29udGVudHNyaWdodG1hcmdpbiA9IDBwdAotICBcZGVmdHlwZW1hcmdpbiA9IDBwdAotICBcZGVmYm9keWluZGVudCA9IC41Y20KLSAgJQotICBcbGV0XHNtYWxsZGlzcGxheSA9IFxzbWFsbGRpc3BsYXl4Ci0gIFxsZXRcc21hbGxleGFtcGxlID0gXHNtYWxsbGlzcHgKLSAgXGxldFxzbWFsbGZvcm1hdCA9IFxzbWFsbGZvcm1hdHgKLSAgXGxldFxzbWFsbGxpc3AgPSBcc21hbGxsaXNweAotfX0KLQotJSBVc2UgQGFmb3VycGFwZXIgdG8gcHJpbnQgb24gRXVyb3BlYW4gQTQgcGFwZXIuCi1cZGVmXGFmb3VycGFwZXJ7e1xnbG9iYWxkZWZzID0gMQotICBcc2V0bGVhZGluZ3sxMnB0fSUKLSAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0Ci0gICUKLSAgXGludGVybmFscGFnZXNpemVzezUzXGJhc2VsaW5lc2tpcH17MTYwbW19e1x2b2Zmc2V0fXs0bW19e1xiaW5kaW5nb2Zmc2V0fXs0NHB0fSUKLSAgJQotICBcdG9sZXJhbmNlID0gNzAwCi0gIFxoZnV6eiA9IDFwdAotfX0KLQotJSBBIHNwZWNpZmljIHRleHQgbGF5b3V0LCAyNHgxNWNtIG92ZXJhbGwsIGludGVuZGVkIGZvciBBNCBwYXBlci4gIFRvcCBtYXJnaW4KLSUgMjltbSwgaGVuY2UgYm90dG9tIG1hcmdpbiAyOG1tLCBub21pbmFsIHNpZGUgbWFyZ2luIDNjbS4KLVxkZWZcYWZvdXJsYXRleHt7XGdsb2JhbGRlZnMgPSAxCi0gIFxzZXRsZWFkaW5nezEzLjZwdH0lCi0gICUKLSAgXGFmb3VycGFwZXIKLSAgXGludGVybmFscGFnZXNpemVzezIzN21tfXsxNTBtbX17My42bW19ezMuNm1tfXszbW19ezdtbX0lCi0gICUKLSAgXGdsb2JhbGRlZnMgPSAwCi19fQotCi0lIFVzZSBAYWZvdXJ3aWRlIHRvIHByaW50IG9uIEV1cm9wZWFuIEE0IHBhcGVyIGluIHdpZGUgZm9ybWF0LgotXGRlZlxhZm91cndpZGV7JQotICBcYWZvdXJwYXBlcgotICBcaW50ZXJuYWxwYWdlc2l6ZXN7OS41aW59ezYuNWlufXtcaG9mZnNldH17XG5vcm1hbG9mZnNldH17XGJpbmRpbmdvZmZzZXR9ezdtbX0lCi0gICUKLSAgXGdsb2JhbGRlZnMgPSAwCi19Ci0KLSUgQHBhZ2VzaXplcyBURVhUSEVJR0hUWyxURVhUV0lEVEhdCi0lIFBlcmhhcHMgd2Ugc2hvdWxkIGFsbG93IHNldHRpbmcgdGhlIG1hcmdpbnMsIFx0b3Bza2lwLCBccGFyc2tpcCwKLSUgYW5kL29yIGxlYWRpbmcsIGFsc28uIE9yIHBlcmhhcHMgd2Ugc2hvdWxkIGNvbXB1dGUgdGhlbSBzb21laG93LgotJSAKLVxkZWZccGFnZXNpemVze1xwYXJzZWFyZ1xwYWdlc2l6ZXN4eHh9Ci1cZGVmXHBhZ2VzaXplc3h4eCMxe1xwYWdlc2l6ZXN5eXkgIzEsLFxmaW5pc2h9Ci1cZGVmXHBhZ2VzaXplc3l5eSMxLCMyLCMzXGZpbmlzaHt7JQotICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9XGlmZGltXHdkMCA+IDBwdCBcaHNpemU9IzJccmVsYXggXGZpCi0gIFxnbG9iYWxkZWZzID0gMQotICAlCi0gIFxwYXJza2lwID0gM3B0IHBsdXMgMnB0IG1pbnVzIDFwdAotICBcc2V0bGVhZGluZ3sxMy4ycHR9JQotICAlCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3sjMX17XGhzaXplfXtcdm9mZnNldH17XG5vcm1hbG9mZnNldH17XGJpbmRpbmdvZmZzZXR9ezQ0cHR9JQotfX0KLQotJSBTZXQgZGVmYXVsdCB0byBsZXR0ZXIuCi0lIAotXGxldHRlcnBhcGVyCi0KLVxtZXNzYWdle2FuZCB0dXJuaW5nIG9uIHRleGluZm8gaW5wdXQgZm9ybWF0Ln0KLQotJSBEZWZpbmUgbWFjcm9zIHRvIG91dHB1dCB2YXJpb3VzIGNoYXJhY3RlcnMgd2l0aCBjYXRjb2RlIGZvciBub3JtYWwgdGV4dC4KLVxjYXRjb2RlYFwiPVxvdGhlcgotXGNhdGNvZGVgXH49XG90aGVyCi1cY2F0Y29kZWBcXj1cb3RoZXIKLVxjYXRjb2RlYFxfPVxvdGhlcgotXGNhdGNvZGVgXHw9XG90aGVyCi1cY2F0Y29kZWBcPD1cb3RoZXIKLVxjYXRjb2RlYFw+PVxvdGhlcgotXGNhdGNvZGVgXCs9XG90aGVyCi1cZGVmXG5vcm1hbGRvdWJsZXF1b3RleyJ9Ci1cZGVmXG5vcm1hbHRpbGRle359Ci1cZGVmXG5vcm1hbGNhcmV0e159Ci1cZGVmXG5vcm1hbHVuZGVyc2NvcmV7X30KLVxkZWZcbm9ybWFsdmVydGljYWxiYXJ7fH0KLVxkZWZcbm9ybWFsbGVzc3s8fQotXGRlZlxub3JtYWxncmVhdGVyez59Ci1cZGVmXG5vcm1hbHBsdXN7K30KLQotJSBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbWFrZSBhIGNoYXJhY3RlciBwcmludCBvbmUgd2F5IGluIHR0Zm9udAotJSB3aGVyZSBpdCBjYW4gcHJvYmFibHkganVzdCBiZSBvdXRwdXQsIGFuZCBhbm90aGVyIHdheSBpbiBvdGhlciBmb250cywKLSUgd2hlcmUgc29tZXRoaW5nIGhhaXJpZXIgcHJvYmFibHkgbmVlZHMgdG8gYmUgZG9uZS4KLSUKLSUgIzEgaXMgd2hhdCB0byBwcmludCBpZiB3ZSBhcmUgaW5kZWVkIHVzaW5nIFx0dDsgIzIgaXMgd2hhdCB0byBwcmludAotJSBvdGhlcndpc2UuICBTaW5jZSBhbGwgdGhlIENvbXB1dGVyIE1vZGVybiB0eXBld3JpdGVyIGZvbnRzIGhhdmUgemVybwotJSBpbnRlcndvcmQgc3RyZXRjaCAoYW5kIHNocmluayksIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGV4cGVjdCBhbGwKLSUgdHlwZXdyaXRlciBmb250cyB0byBoYXZlIHRoaXMsIHdlIGNhbiBjaGVjayB0aGF0IGZvbnQgcGFyYW1ldGVyLgotJQotXGRlZlxpZnVzaW5ndHQjMSMye1xpZmRpbSBcZm9udGRpbWVuM1x0aGVcZm9udD0wcHQgIzFcZWxzZSAjMlxmaX0KLQotJSBUdXJuIG9mZiBhbGwgc3BlY2lhbCBjaGFyYWN0ZXJzIGV4Y2VwdCBACi0lIChhbmQgdGhvc2Ugd2hpY2ggdGhlIHVzZXIgY2FuIHVzZSBhcyBpZiB0aGV5IHdlcmUgb3JkaW5hcnkpLgotJSBNb3N0IG9mIHRoZXNlIHdlIHNpbXBseSBwcmludCBmcm9tIHRoZSBcdHQgZm9udCwgYnV0IGZvciBzb21lLCB3ZSBjYW4KLSUgdXNlIG1hdGggb3Igb3RoZXIgdmFyaWFudHMgdGhhdCBsb29rIGJldHRlciBpbiBub3JtYWwgdGV4dC4KLQotXGNhdGNvZGVgXCI9XGFjdGl2ZQotXGRlZlxhY3RpdmVkb3VibGVxdW90ZXt7XHR0XGNoYXIzNH19Ci1cbGV0Ij1cYWN0aXZlZG91YmxlcXVvdGUKLVxjYXRjb2RlYFx+PVxhY3RpdmUKLVxkZWZ+e3tcdHRcY2hhcjEyNn19Ci1cY2hhcmRlZlxoYXQ9YFxeCi1cY2F0Y29kZWBcXj1cYWN0aXZlCi1cZGVmXnt7XHR0IFxoYXR9fQotCi1cY2F0Y29kZWBcXz1cYWN0aXZlCi1cZGVmX3tcaWZ1c2luZ3R0XG5vcm1hbHVuZGVyc2NvcmVcX30KLSUgU3Vicm91dGluZSBmb3IgdGhlIHByZXZpb3VzIG1hY3JvLgotXGRlZlxfe1xsZWF2ZXZtb2RlIFxrZXJuLjA2ZW0gXHZib3h7XGhydWxlIHdpZHRoLjNlbSBoZWlnaHQuMWV4fX0KLQotXGNhdGNvZGVgXHw9XGFjdGl2ZQotXGRlZnx7e1x0dFxjaGFyMTI0fX0KLVxjaGFyZGVmIFxsZXNzPWBcPAotXGNhdGNvZGVgXDw9XGFjdGl2ZQotXGRlZjx7e1x0dCBcbGVzc319Ci1cY2hhcmRlZiBcZ3RyPWBcPgotXGNhdGNvZGVgXD49XGFjdGl2ZQotXGRlZj57e1x0dCBcZ3RyfX0KLVxjYXRjb2RlYFwrPVxhY3RpdmUKLVxkZWYre3tcdHQgXGNoYXIgNDN9fQotJVxjYXRjb2RlIDI3PVxhY3RpdmUKLSVcZGVmXl5beyRcZGlhbW9uZHN1aXQkfQotCi0lIFNldCB1cCBhbiBhY3RpdmUgZGVmaW5pdGlvbiBmb3IgPSwgYnV0IGRvbid0IGVuYWJsZSBpdCBtb3N0IG9mIHRoZSB0aW1lLgote1xjYXRjb2RlYFw9PVxhY3RpdmUKLVxnbG9iYWxcZGVmPXt7XHR0IFxjaGFyIDYxfX19Ci0KLVxjYXRjb2RlYCs9XGFjdGl2ZQotXGNhdGNvZGVgXF89XGFjdGl2ZQotCi0lIElmIGEgLmZtdCBmaWxlIGlzIGJlaW5nIHVzZWQsIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgaW4gYSBmaWxlCi0lIG5hbWUgY2Fubm90IGJlIGFjdGl2ZSB1bnRpbCB3ZSBoYXZlIHBhcnNlZCB0aGUgY29tbWFuZCBsaW5lLgotJSBTbyB0dXJuIHRoZW0gb2ZmIGFnYWluLCBhbmQgaGF2ZSBcZXZlcnlqb2IgKG9yIEBzZXRmaWxlbmFtZSkgdHVybiB0aGVtIG9uLgotJSBcb3RoZXJpZnlhY3RpdmUgaXMgY2FsbGVkIG5lYXIgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCi1cZGVmXG90aGVyaWZ5YWN0aXZle1xjYXRjb2RlYCs9XG90aGVyIFxjYXRjb2RlYFxfPVxvdGhlcn0KLQotXGNhdGNvZGVgXEA9MAotCi0lIFxyYXdiYWNrc2xhc2h4eCBvdXRwdXQgb25lIGJhY2tzbGFzaCBjaGFyYWN0ZXIgaW4gY3VycmVudCBmb250Ci1cZ2xvYmFsXGNoYXJkZWZccmF3YmFja3NsYXNoeHg9YFxcCi0le1xjYXRjb2RlYFxcPVxvdGhlcgotJUBnZGVmQHJhd2JhY2tzbGFzaHh4e1x9fQotCi0lIFxyYXdiYWNrc2xhc2ggcmVkZWZpbmVzIFwgYXMgaW5wdXQgdG8gZG8gXHJhd2JhY2tzbGFzaHh4Lgote1xjYXRjb2RlYFxcPVxhY3RpdmUKLUBnZGVmQHJhd2JhY2tzbGFzaHtAbGV0XD1AcmF3YmFja3NsYXNoeHggfX0KLQotJSBcbm9ybWFsYmFja3NsYXNoIG91dHB1dHMgb25lIGJhY2tzbGFzaCBpbiBmaXhlZCB3aWR0aCBmb250LgotXGRlZlxub3JtYWxiYWNrc2xhc2h7e1x0dFxyYXdiYWNrc2xhc2h4eH19Ci0KLSUgU2F5IEBmb28sIG5vdCBcZm9vLCBpbiBlcnJvciBtZXNzYWdlcy4KLVxlc2NhcGVjaGFyPWBcQAotCi0lIFxjYXRjb2RlIDE3PTAgICAlIERlZmluZSBjb250cm9sLXEKLVxjYXRjb2RlYFxcPVxhY3RpdmUKLQotJSBVc2VkIHNvbWV0aW1lcyB0byB0dXJuIG9mZiAoZWZmZWN0aXZlbHkpIHRoZSBhY3RpdmUgY2hhcmFjdGVycwotJSBldmVuIGFmdGVyIHBhcnNpbmcgdGhlbS4KLUBkZWZAdHVybm9mZmFjdGl2ZXtAbGV0Ij1Abm9ybWFsZG91YmxlcXVvdGUKLUBsZXRcPUByZWFsYmFja3NsYXNoCi1AbGV0fj1Abm9ybWFsdGlsZGUKLUBsZXRePUBub3JtYWxjYXJldAotQGxldF89QG5vcm1hbHVuZGVyc2NvcmUKLUBsZXR8PUBub3JtYWx2ZXJ0aWNhbGJhcgotQGxldDw9QG5vcm1hbGxlc3MKLUBsZXQ+PUBub3JtYWxncmVhdGVyCi1AbGV0Kz1Abm9ybWFscGx1c30KLQotQGRlZkBub3JtYWx0dXJub2ZmYWN0aXZle0BsZXQiPUBub3JtYWxkb3VibGVxdW90ZQotQGxldFw9QG5vcm1hbGJhY2tzbGFzaAotQGxldH49QG5vcm1hbHRpbGRlCi1AbGV0Xj1Abm9ybWFsY2FyZXQKLUBsZXRfPUBub3JtYWx1bmRlcnNjb3JlCi1AbGV0fD1Abm9ybWFsdmVydGljYWxiYXIKLUBsZXQ8PUBub3JtYWxsZXNzCi1AbGV0Pj1Abm9ybWFsZ3JlYXRlcgotQGxldCs9QG5vcm1hbHBsdXN9Ci0KLSUgTWFrZSBfIGFuZCArIFxvdGhlciBjaGFyYWN0ZXJzLCB0ZW1wb3JhcmlseS4KLSUgVGhpcyBpcyBjYW5jZWxlZCBieSBAZml4YmFja3NsYXNoLgotQG90aGVyaWZ5YWN0aXZlCi0KLSUgSWYgYSAuZm10IGZpbGUgaXMgYmVpbmcgdXNlZCwgd2UgZG9uJ3Qgd2FudCB0aGUgYFxpbnB1dCB0ZXhpbmZvJyB0byBzaG93IHVwLgotJSBUaGF0IGlzIHdoYXQgXGVhdGlucHV0IGlzIGZvcjsgYWZ0ZXIgdGhhdCwgdGhlIGBcJyBzaG91bGQgcmV2ZXJ0IHRvIHByaW50aW5nCi0lIGEgYmFja3NsYXNoLgotJQotQGdkZWZAZWF0aW5wdXQgaW5wdXQgdGV4aW5mb3tAZml4YmFja3NsYXNofQotQGdsb2JhbEBsZXRcID0gQGVhdGlucHV0Ci0KLSUgT24gdGhlIG90aGVyIGhhbmQsIHBlcmhhcHMgdGhlIGZpbGUgZGlkIG5vdCBoYXZlIGEgYFxpbnB1dCB0ZXhpbmZvJy4gVGhlbgotJSB0aGUgZmlyc3QgYFx7IGluIHRoZSBmaWxlIHdvdWxkIGNhdXNlIGFuIGVycm9yLiBUaGlzIG1hY3JvIHRyaWVzIHRvIGZpeAotJSB0aGF0LCBhc3N1bWluZyBpdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBgXCcgY291bGQgcGxhdXNpYmx5IG9jY3VyLgotJSBBbHNvIGJhY2sgdHVybiBvbiBhY3RpdmUgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGFwcGVhciBpbiB0aGUgaW5wdXQKLSUgZmlsZSBuYW1lLCBpbiBjYXNlIG5vdCB1c2luZyBhIHByZS1kdW1wZWQgZm9ybWF0LgotJQotQGdkZWZAZml4YmFja3NsYXNoe0BpZnhcQGVhdGlucHV0IEBsZXRcID0gQG5vcm1hbGJhY2tzbGFzaCBAZmkKLSAgQGNhdGNvZGVgKz1AYWN0aXZlIEBjYXRjb2RlYEBfPUBhY3RpdmV9Ci0KLSUgVGhlc2UgbG9vayBvayBpbiBhbGwgZm9udHMsIHNvIGp1c3QgbWFrZSB0aGVtIG5vdCBzcGVjaWFsLiAgVGhlIEBybSBiZWxvdwotJSBtYWtlcyBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgZm9udCBzdGFydHMgb3V0IGFzIHRoZSBuZXdseSBsb2FkZWQgY21yMTAKLUBjYXRjb2RlYEAkPUBvdGhlciBAY2F0Y29kZWBAJT1Ab3RoZXIgQGNhdGNvZGVgQCY9QG90aGVyIEBjYXRjb2RlYEAjPUBvdGhlcgotCi1AdGV4dGZvbnRzCi1Acm0KLQotQGMgTG9jYWwgdmFyaWFibGVzOgotQGMgcGFnZS1kZWxpbWl0ZXI6ICJeXFxcXG1lc3NhZ2UiCi1AYyBFbmQ6CmRpZmYgLS1naXQgYS95bHdyYXAgYi95bHdyYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyODhjY2QuLjAwMDAwMDAKLS0tIGEveWx3cmFwCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgeWx3cmFwIC0gd3JhcHBlciBmb3IgbGV4L3lhY2MgaW52b2NhdGlvbnMuCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgVXNhZ2U6Ci0jICAgICB5bHdyYXAgUFJPR1JBTSBJTlBVVCBbT1VUUFVUIERFU0lSRURdLi4uIC0tIFtBUkdTXS4uLgotIyAqIFBST0dSQU0gaXMgcHJvZ3JhbSB0byBydW4uCi0jICogSU5QVVQgaXMgdGhlIGlucHV0IGZpbGUKLSMgKiBPVVRQVVQgaXMgZmlsZSBQUk9HIGdlbmVyYXRlcwotIyAqIERFU0lSRUQgaXMgZmlsZSB3ZSBhY3R1YWxseSB3YW50Ci0jICogQVJHUyBhcmUgcGFzc2VkIHRvIFBST0cKLSMgQW55IG51bWJlciBvZiBPVVRQVVQsREVTSVJFRCBwYWlycyBtYXkgYmUgdXNlZC4KLQotIyBUaGUgcHJvZ3JhbSB0byBydW4uCi1wcm9nPSIkMSIKLXNoaWZ0Ci0jIE1ha2UgYW55IHJlbGF0aXZlIHBhdGggaW4gJHByb2cgYWJzb2x1dGUuCi1jYXNlICIkcHJvZyIgaW4KLSAvKiB8IFtBLVphLXpdOlxcKikgOzsKLSAqLyopIHByb2c9ImBwd2RgLyRwcm9nIiA7OwotZXNhYwotCi0jIFRoZSBpbnB1dC4KLWlucHV0PSIkMSIKLXNoaWZ0Ci1jYXNlICIkaW5wdXQiIGluCi0gLyogfCBbQS1aYS16XTpcXCopCi0gICAgIyBBYnNvbHV0ZSBwYXRoOyBkbyBub3RoaW5nLgotICAgIDs7Ci0gKikKLSAgICAjIFJlbGF0aXZlIHBhdGguICBNYWtlIGl0IGFic29sdXRlLiAgV2h5PyAgQmVjYXVzZSBvdGhlcndpc2UgYW55Ci0gICAgIyBkZWJ1Z2dpbmcgaW5mbyBpbiB0aGUgZ2VuZXJhdGVkIGZpbGUgd2lsbCBwb2ludCB0byB0aGUgd3JvbmcKLSAgICAjIHBsYWNlLiAgVGhpcyBpcyByZWFsbHkgZ3Jvc3MuCi0gICAgaW5wdXQ9ImBwd2RgLyRpbnB1dCIKLSAgICA7OwotZXNhYwotCi0jIFdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBhYnNvbHV0ZSBwYXRoIGlmIHRoZSBpbnB1dCBpbiB0aGUgY3VycmVudAotIyBkaXJlY3RvcnkgbGlrZSB3aGVuIG1ha2luZyBhIHRhciBiYWxsLgotaW5wdXRfYmFzZT1gZWNobyAkaW5wdXQgfCBzZWQgLWUgJ3N8LiovfHwnYAotaWYgdGVzdCAtZiAkaW5wdXRfYmFzZSAmJiBjbXAgJGlucHV0X2Jhc2UgJGlucHV0ID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBpbnB1dD0kaW5wdXRfYmFzZQotZmkKLQotcGFpcmxpc3Q9Ci13aGlsZSB0ZXN0ICIkIyIgLW5lIDA7IGRvCi0gICBpZiB0ZXN0ICIkMSIgPSAiLS0iOyB0aGVuCi0gICAgICBzaGlmdAotICAgICAgYnJlYWsKLSAgIGZpCi0gICBwYWlybGlzdD0iJHBhaXJsaXN0ICQxIgotICAgc2hpZnQKLWRvbmUKLQotIyBGSVhNRTogYWRkIGhvc3RuYW1lIGhlcmUgZm9yIHBhcmFsbGVsIG1ha2VzIHRoYXQgcnVuIGNvbW1hbmRzIG9uCi0jIG90aGVyIG1hY2hpbmVzLiAgQnV0IHRoYXQgbWlnaHQgdGFrZSB1cyBvdmVyIHRoZSAxNC1jaGFyIGxpbWl0LgotZGlybmFtZT15bHdyYXAkJAotdHJhcCAiY2QgYHB3ZGA7IHJtIC1yZiAkZGlybmFtZSA+IC9kZXYvbnVsbCAyPiYxIiAxIDIgMyAxNQotbWtkaXIgJGRpcm5hbWUgfHwgZXhpdCAxCi0KLWNkICRkaXJuYW1lCi1jYXNlICIkaW5wdXQiIGluCi0gLyogfCBbQS1aYS16XTpcXCopCi0gICAgIyBBYnNvbHV0ZSBwYXRoOyBkbyBub3RoaW5nLgotICAgIDs7Ci0gKikKLSAgICAjIE1ha2UgYSBzeW1ib2xpYyBsaW5rLCBoYXJkIGxpbmsgb3IgaGFyZGNvcHkuCi0gICAgbG4gLXMgLi4vIiRpbnB1dCIgLiA+IC9kZXYvbnVsbCAyPiYxIHx8IGxuIC4uLyIkaW5wdXQiIC4gPiAvZGV2L251bGwgMj4mMSB8fCBjcCAuLi8iJGlucHV0IiAuCi0gICAgOzsKLWVzYWMKLSRwcm9nICR7MSsiJEAifSAiJGlucHV0Igotc3RhdHVzPSQ/Ci0KLWlmIHRlc3QgJHN0YXR1cyAtZXEgMDsgdGhlbgotICAgc2V0IFggJHBhaXJsaXN0Ci0gICBzaGlmdAotICAgZmlyc3Q9eWVzCi0gICB3aGlsZSB0ZXN0ICIkIyIgLW5lIDA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkMSI7IHRoZW4KLSAgICAgICAgICMgSWYgJDIgaXMgYW4gYWJzb2x1dGUgcGF0aCBuYW1lLCB0aGVuIGp1c3QgdXNlIHRoYXQsCi0gICAgICAgICAjIG90aGVyd2lzZSBwcmVwZW5kIGAuLi8nLgotICAgICAgICAgY2FzZSAiJDIiIGluCi0JICAgLyogfCBbQS1aYS16XTpcXCopIHRhcmdldD0iJDIiOzsKLQkgICAqKSB0YXJnZXQ9Ii4uLyQyIjs7Ci0JIGVzYWMKLQkgbXYgIiQxIiAiJHRhcmdldCIgfHwgc3RhdHVzPSQ/Ci0gICAgICBlbHNlCi0JICMgQSBtaXNzaW5nIGZpbGUgaXMgb25seSBhbiBlcnJvciBmb3IgdGhlIGZpcnN0IGZpbGUuICBUaGlzCi0JICMgaXMgYSBibGF0YW50IGhhY2sgdG8gbGV0IHVzIHN1cHBvcnQgdXNpbmcgInlhY2MgLWQiLiAgSWYgLWQKLQkgIyBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBkb24ndCB3YW50IGFuIGVycm9yIHdoZW4gdGhlIGhlYWRlcgotCSAjIGZpbGUgaXMgIm1pc3NpbmciLgotCSBpZiB0ZXN0ICRmaXJzdCA9IHllczsgdGhlbgotCSAgICBzdGF0dXM9MQotCSBmaQotICAgICAgZmkKLSAgICAgIHNoaWZ0Ci0gICAgICBzaGlmdAotICAgICAgZmlyc3Q9bm8KLSAgIGRvbmUKLWVsc2UKLSAgIHN0YXR1cz0kPwotZmkKLQotIyBSZW1vdmUgdGhlIGRpcmVjdG9yeS4KLWNkIC4uCi1ybSAtcmYgJGRpcm5hbWUKLQotZXhpdCAkc3RhdHVzCg==